diff -Nru temporalio-1.3.0/debian/changelog temporalio-1.3.0/debian/changelog --- temporalio-1.3.0/debian/changelog 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/debian/changelog 2023-10-30 19:40:00.000000000 +0000 @@ -1,6 +1,6 @@ -temporalio (1.3.0-15~ppa1) jammy; urgency=medium +temporalio (1.3.0-17~ppa1) jammy; urgency=medium - * v1.3.0 with updated core-sdk dependencies (s390x and ppc64el support) + * v1.3.0 with updated rust dependencies (s390x and ppc64el support) -- Anton Troyanov Mon, 30 Oct 2023 19:40:00 +0000 diff -Nru temporalio-1.3.0/PKG-INFO temporalio-1.3.0/PKG-INFO --- temporalio-1.3.0/PKG-INFO 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/PKG-INFO 1970-01-01 00:00:00.000000000 +0000 @@ -17,7 +17,7 @@ Classifier: Programming Language :: Python :: 3.11 Provides-Extra: grpc Provides-Extra: opentelemetry -Requires-Dist: grpcio (>=1.48.0,<2.0.0) ; extra == "grpc" +Requires-Dist: grpcio (>=1.53.0,<2.0.0) ; extra == "grpc" Requires-Dist: opentelemetry-api (>=1.11.1,<2.0.0) ; extra == "opentelemetry" Requires-Dist: opentelemetry-sdk (>=1.11.1,<2.0.0) ; extra == "opentelemetry" Requires-Dist: protobuf (>=3.20) diff -Nru temporalio-1.3.0/pyproject.toml temporalio-1.3.0/pyproject.toml --- temporalio-1.3.0/pyproject.toml 2023-10-30 13:49:41.000000000 +0000 +++ temporalio-1.3.0/pyproject.toml 2023-10-30 19:40:00.000000000 +0000 @@ -31,7 +31,7 @@ "Bug Tracker" = "https://github.com/temporalio/sdk-python/issues" [tool.poetry.dependencies] -grpcio = { version = "^1.48.0", optional = true } +grpcio = {version = "^1.53.0", optional = true} opentelemetry-api = { version = "^1.11.1", optional = true } opentelemetry-sdk = { version = "^1.11.1", optional = true } protobuf = ">=3.20" diff -Nru temporalio-1.3.0/setup.py temporalio-1.3.0/setup.py --- temporalio-1.3.0/setup.py 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/setup.py 1970-01-01 00:00:00.000000000 +0000 @@ -84,6 +84,7 @@ 'sdk-core/client/src/workflow_handle/*', 'sdk-core/core-api/*', 'sdk-core/core-api/src/*', + 'sdk-core/core-api/src/telemetry/*', 'sdk-core/core/*', 'sdk-core/core/benches/*', 'sdk-core/core/src/*', @@ -170,7 +171,7 @@ extras_require = \ {':python_version < "3.11"': ['python-dateutil>=2.8.2,<3.0.0'], - 'grpc': ['grpcio>=1.48.0,<2.0.0'], + 'grpc': ['grpcio>=1.53.0,<2.0.0'], 'opentelemetry': ['opentelemetry-api>=1.11.1,<2.0.0', 'opentelemetry-sdk>=1.11.1,<2.0.0']} diff -Nru temporalio-1.3.0/temporalio/bridge/Cargo.lock temporalio-1.3.0/temporalio/bridge/Cargo.lock --- temporalio-1.3.0/temporalio/bridge/Cargo.lock 2023-10-30 19:26:32.000000000 +0000 +++ temporalio-1.3.0/temporalio/bridge/Cargo.lock 2023-10-30 19:40:00.000000000 +0000 @@ -30,26 +30,37 @@ [[package]] name = "ahash" -version = "0.8.6" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91429305e9f0a25f6205c5b8e0d2db09e0708a7a6df0f42212bb56c32c8ac97a" +checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f" dependencies = [ "cfg-if", "once_cell", "version_check", - "zerocopy", ] [[package]] name = "aho-corasick" -version = "1.1.2" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" +checksum = "6748e8def348ed4d14996fa801f4122cd763fff530258cdc03f64b25f89d3a5a" dependencies = [ "memchr", ] [[package]] +name = "allocator-api2" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] name = "anyhow" version = "1.0.75" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -80,18 +91,18 @@ dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.29", ] [[package]] name = "async-trait" -version = "0.1.74" +version = "0.1.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" +checksum = "bc00ceb34980c03614e35a3a4e218276a0a824e911d07651cd0d858a51e8c0f0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.29", ] [[package]] @@ -173,15 +184,9 @@ [[package]] name = "base64" -version = "0.13.1" +version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" - -[[package]] -name = "base64" -version = "0.21.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" +checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" [[package]] name = "base64ct" @@ -197,9 +202,9 @@ [[package]] name = "bitflags" -version = "2.4.1" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" +checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635" [[package]] name = "block-buffer" @@ -212,21 +217,21 @@ [[package]] name = "bumpalo" -version = "3.14.0" +version = "3.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" +checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" [[package]] name = "byteorder" -version = "1.5.0" +version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" [[package]] name = "bytes" -version = "1.5.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" +checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" [[package]] name = "bzip2" @@ -267,10 +272,11 @@ [[package]] name = "chrono" -version = "0.4.31" +version = "0.4.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" +checksum = "ec837a71355b28f6556dbd569b37b3f363091c0bd4b2e735674521b4c5fd9bc5" dependencies = [ + "android-tzdata", "num-traits", "serde", ] @@ -315,9 +321,9 @@ [[package]] name = "cpufeatures" -version = "0.2.11" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce420fe07aecd3e67c5f910618fe65e94158f6dcc0adf44e00d69ce2bdfe0fd0" +checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" dependencies = [ "libc", ] @@ -445,12 +451,12 @@ [[package]] name = "dashmap" -version = "5.5.3" +version = "5.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" +checksum = "edd72493923899c6f10c641bdbdeddc7183d6396641d99c1a0d1597f37f92e28" dependencies = [ "cfg-if", - "hashbrown 0.14.2", + "hashbrown 0.14.0", "lock_api", "once_cell", "parking_lot_core", @@ -555,7 +561,7 @@ dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.29", ] [[package]] @@ -567,7 +573,7 @@ "once_cell", "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.29", ] [[package]] @@ -578,28 +584,39 @@ [[package]] name = "erased-serde" -version = "0.3.31" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c138974f9d5e7fe373eb04df7cae98833802ae4b11c24ac7039a21d5af4b26c" +checksum = "837c0466252947ada828b975e12daf82e18bb5444e4df87be6038d4469e2a3d2" dependencies = [ "serde", ] [[package]] name = "errno" -version = "0.3.5" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3e13f66a2f95e32a39eaa81f6b95d42878ca0e1db0c7543723dfe12557e860" +checksum = "6b30f669a7961ef1631673d2766cc92f52d64f7ef354d4fe0ddfd30ed52f0f4f" dependencies = [ + "errno-dragonfly", "libc", "windows-sys", ] [[package]] +name = "errno-dragonfly" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +dependencies = [ + "cc", + "libc", +] + +[[package]] name = "fastrand" -version = "2.0.1" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" +checksum = "6999dc1837253364c2ebb0704ba97994bd874e8f195d665c50b7548f6ea92764" [[package]] name = "filetime" @@ -609,7 +626,7 @@ dependencies = [ "cfg-if", "libc", - "redox_syscall 0.3.5", + "redox_syscall", "windows-sys", ] @@ -621,9 +638,9 @@ [[package]] name = "flate2" -version = "1.0.28" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" +checksum = "c6c98ee8095e9d1dcbf2fcc6d95acccb90d1c81db1e44725c6a984b1dbdfb010" dependencies = [ "crc32fast", "miniz_oxide", @@ -661,9 +678,9 @@ [[package]] name = "futures" -version = "0.3.29" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0290714b38af9b4a7b094b8a37086d1b4e61f2df9122c3cad2577669145335" +checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" dependencies = [ "futures-channel", "futures-core", @@ -676,9 +693,9 @@ [[package]] name = "futures-channel" -version = "0.3.29" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb" +checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" dependencies = [ "futures-core", "futures-sink", @@ -686,15 +703,15 @@ [[package]] name = "futures-core" -version = "0.3.29" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" +checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" [[package]] name = "futures-executor" -version = "0.3.29" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f4fb8693db0cf099eadcca0efe2a5a22e4550f98ed16aba6c48700da29597bc" +checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" dependencies = [ "futures-core", "futures-task", @@ -703,19 +720,19 @@ [[package]] name = "futures-io" -version = "0.3.29" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa" +checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" [[package]] name = "futures-macro" -version = "0.3.29" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb" +checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.29", ] [[package]] @@ -731,15 +748,15 @@ [[package]] name = "futures-sink" -version = "0.3.29" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817" +checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" [[package]] name = "futures-task" -version = "0.3.29" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2" +checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" [[package]] name = "futures-timer" @@ -749,9 +766,9 @@ [[package]] name = "futures-util" -version = "0.3.29" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104" +checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" dependencies = [ "futures-channel", "futures-core", @@ -783,7 +800,7 @@ dependencies = [ "cfg-if", "libc", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi", ] [[package]] @@ -794,9 +811,9 @@ [[package]] name = "governor" -version = "0.5.1" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c390a940a5d157878dd057c78680a33ce3415bcd05b4799509ea44210914b4d5" +checksum = "821239e5672ff23e2a7060901fa622950bbd80b649cdaadd78d1c1767ed14eb4" dependencies = [ "cfg-if", "dashmap", @@ -837,20 +854,15 @@ [[package]] name = "hashbrown" -version = "0.13.2" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" dependencies = [ "ahash", + "allocator-api2", ] [[package]] -name = "hashbrown" -version = "0.14.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93e7192158dbcda357bdec5fb5788eebf8bbac027f3f33e719d29135ae84156" - -[[package]] name = "heck" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -858,9 +870,9 @@ [[package]] name = "hermit-abi" -version = "0.3.3" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" +checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" [[package]] name = "hmac" @@ -872,15 +884,6 @@ ] [[package]] -name = "home" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb" -dependencies = [ - "windows-sys", -] - -[[package]] name = "http" version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -931,7 +934,7 @@ "httpdate", "itoa", "pin-project-lite", - "socket2 0.4.10", + "socket2 0.4.9", "tokio", "tower-service", "tracing", @@ -940,16 +943,16 @@ [[package]] name = "hyper-rustls" -version = "0.24.2" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" +checksum = "8d78e1e73ec14cf7375674f74d7dde185c8206fd9dea6fb6295e8a98098aaa97" dependencies = [ "futures-util", "http", "hyper", - "rustls 0.21.8", + "rustls", "tokio", - "tokio-rustls 0.24.1", + "tokio-rustls", ] [[package]] @@ -992,12 +995,12 @@ [[package]] name = "indexmap" -version = "2.0.2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8adf3ddd720272c6ea8bf59463c04e0f93d0bbf7c5439b691bca2987e0270897" +checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d" dependencies = [ "equivalent", - "hashbrown 0.14.2", + "hashbrown 0.14.0", ] [[package]] @@ -1026,15 +1029,15 @@ [[package]] name = "inventory" -version = "0.3.12" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1be380c410bf0595e94992a648ea89db4dd3f3354ba54af206fd2a68cf5ac8e" +checksum = "a53088c87cf71c9d4f3372a2cb9eea1e7b8a0b1bf8b7f7d23fe5b76dbb07e63b" [[package]] name = "ipnet" -version = "2.9.0" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" +checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6" [[package]] name = "itertools" @@ -1046,6 +1049,15 @@ ] [[package]] +name = "itertools" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +dependencies = [ + "either", +] + +[[package]] name = "itoa" version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1053,9 +1065,9 @@ [[package]] name = "jobserver" -version = "0.1.27" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c37f63953c4c63420ed5fd3d6d398c719489b9f872b9fa683262f8edd363c7d" +checksum = "936cfd212a0155903bcbc060e316fb6cc7cbf2e1907329391ebadc1fe0ce77c2" dependencies = [ "libc", ] @@ -1077,21 +1089,21 @@ [[package]] name = "libc" -version = "0.2.149" +version = "0.2.147" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a08173bc88b7955d1b3145aa561539096c421ac8debde8cbc3612ec635fee29b" +checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" [[package]] name = "linux-raw-sys" -version = "0.4.10" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da2479e8c062e40bf0066ffa0bc823de0a9368974af99c9f6df941d2c231e03f" +checksum = "57bcfdad1b858c2db7c38303a6d2ad4dfaf5eb53dfeb0910128b2c26d6158503" [[package]] name = "lock_api" -version = "0.4.11" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" dependencies = [ "autocfg", "scopeguard", @@ -1105,18 +1117,18 @@ [[package]] name = "lru" -version = "0.10.1" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "718e8fae447df0c7e1ba7f5189829e63fd536945c8988d61444c19039f16b670" +checksum = "eedb2bdbad7e0634f83989bf596f497b070130daaa398ab22d84c39e266deec5" dependencies = [ - "hashbrown 0.13.2", + "hashbrown 0.14.0", ] [[package]] -name = "mach" -version = "0.3.2" +name = "mach2" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b823e83b2affd8f40a9ee8c29dbc56404c1e34cd2710921f2801e2cf29527afa" +checksum = "6d0d1830bcd151a6fc4aea1369af235b36c1528fe976b8ff678683c9995eade8" dependencies = [ "libc", ] @@ -1132,15 +1144,15 @@ [[package]] name = "matchit" -version = "0.7.3" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" +checksum = "ed1202b2a6f884ae56f04cff409ab315c5ce26b5e58d7412e484f01fd52f52ef" [[package]] name = "memchr" -version = "2.6.4" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" [[package]] name = "memoffset" @@ -1186,12 +1198,12 @@ [[package]] name = "mio" -version = "0.8.9" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0" +checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" dependencies = [ "libc", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi", "windows-sys", ] @@ -1230,15 +1242,16 @@ [[package]] name = "nix" -version = "0.26.4" +version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" +checksum = "bfdda3d196821d6af13126e40375cdf7da646a96114af134d5f417a9a1dc8e1a" dependencies = [ "bitflags 1.3.2", "cfg-if", "libc", "memoffset 0.7.1", "pin-utils", + "static_assertions", ] [[package]] @@ -1271,9 +1284,9 @@ [[package]] name = "num-traits" -version = "0.2.17" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" +checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" dependencies = [ "autocfg", ] @@ -1290,9 +1303,9 @@ [[package]] name = "object" -version = "0.32.1" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" +checksum = "77ac5bbd07aea88c60a577a1ce218075ffd59208b2d7ca97adf9bfc5aeb21ebe" dependencies = [ "memchr", ] @@ -1311,9 +1324,9 @@ [[package]] name = "opentelemetry" -version = "0.18.0" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69d6c3d7288a106c0a363e4b0e8d308058d56902adefb16f4936f417ffef086e" +checksum = "9591d937bc0e6d2feb6f71a559540ab300ea49955229c347a517a28d27784c54" dependencies = [ "opentelemetry_api", "opentelemetry_sdk", @@ -1321,16 +1334,17 @@ [[package]] name = "opentelemetry-otlp" -version = "0.11.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1c928609d087790fc936a1067bdc310ae702bdf3b090c3f281b713622c8bbde" +checksum = "7e5e5a5c4135864099f3faafbe939eb4d7f9b80ebf68a8448da961b32a7c1275" dependencies = [ "async-trait", - "futures", - "futures-util", + "futures-core", "http", - "opentelemetry", "opentelemetry-proto", + "opentelemetry-semantic-conventions", + "opentelemetry_api", + "opentelemetry_sdk", "prost", "thiserror", "tokio", @@ -1339,36 +1353,44 @@ [[package]] name = "opentelemetry-prometheus" -version = "0.11.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06c3d833835a53cf91331d2cfb27e9121f5a95261f31f08a1f79ab31688b8da8" +checksum = "c7d81bc254e2d572120363a2b16cdb0d715d301b5789be0cfc26ad87e4e10e53" dependencies = [ - "opentelemetry", + "once_cell", + "opentelemetry_api", + "opentelemetry_sdk", "prometheus", "protobuf", ] [[package]] name = "opentelemetry-proto" -version = "0.1.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d61a2f56df5574508dd86aaca016c917489e589ece4141df1b5e349af8d66c28" +checksum = "b1e3f814aa9f8c905d0ee4bde026afd3b2577a97c10e1699912e3e44f0c4cbeb" dependencies = [ - "futures", - "futures-util", - "opentelemetry", + "opentelemetry_api", + "opentelemetry_sdk", "prost", "tonic", - "tonic-build", +] + +[[package]] +name = "opentelemetry-semantic-conventions" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73c9f9340ad135068800e7f1b24e9e09ed9e7143f5bf8518ded3d3ec69789269" +dependencies = [ + "opentelemetry", ] [[package]] name = "opentelemetry_api" -version = "0.18.0" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c24f96e21e7acc813c7a8394ee94978929db2bcc46cf6b5014fc612bf7760c22" +checksum = "8a81f725323db1b1206ca3da8bb19874bbd3f57c3bcd59471bfb04525b265b9b" dependencies = [ - "fnv", "futures-channel", "futures-util", "indexmap 1.9.3", @@ -1376,31 +1398,42 @@ "once_cell", "pin-project-lite", "thiserror", + "urlencoding", ] [[package]] name = "opentelemetry_sdk" -version = "0.18.0" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ca41c4933371b61c2a2f214bf16931499af4ec90543604ec828f7a625c09113" +checksum = "fa8e705a0612d48139799fcbaba0d4a90f06277153e43dd2bdc16c6f0edd8026" dependencies = [ "async-trait", "crossbeam-channel", - "dashmap", - "fnv", "futures-channel", "futures-executor", "futures-util", "once_cell", "opentelemetry_api", + "ordered-float", "percent-encoding", "rand", + "regex", + "serde_json", "thiserror", "tokio", "tokio-stream", ] [[package]] +name = "ordered-float" +version = "3.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a54938017eacd63036332b4ae5c8a49fc8c0c1d6d629893057e4f13609edd06" +dependencies = [ + "num-traits", +] + +[[package]] name = "overload" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1418,13 +1451,13 @@ [[package]] name = "parking_lot_core" -version = "0.9.9" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.4.1", + "redox_syscall", "smallvec", "windows-targets", ] @@ -1465,7 +1498,7 @@ checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" dependencies = [ "fixedbitset", - "indexmap 2.0.2", + "indexmap 2.0.0", ] [[package]] @@ -1485,14 +1518,14 @@ dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.29", ] [[package]] name = "pin-project-lite" -version = "0.2.13" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" +checksum = "12cc1b0bf1727a77a54b6654e7b5f1af8604923edc8b81885f8ec92f9e3f0a05" [[package]] name = "pin-utils" @@ -1520,7 +1553,7 @@ dependencies = [ "difflib", "float-cmp", - "itertools", + "itertools 0.10.5", "normalize-line-endings", "predicates-core", "regex", @@ -1554,9 +1587,9 @@ [[package]] name = "proc-macro2" -version = "1.0.69" +version = "1.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da" +checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" dependencies = [ "unicode-ident", ] @@ -1594,7 +1627,7 @@ dependencies = [ "bytes", "heck", - "itertools", + "itertools 0.10.5", "lazy_static", "log", "multimap", @@ -1615,7 +1648,7 @@ checksum = "e5d2d8d10f3c6ded6da8b05b5fb3b8a5082514344d56c9f871412d29b4e075b4" dependencies = [ "anyhow", - "itertools", + "itertools 0.10.5", "proc-macro2", "quote", "syn 1.0.109", @@ -1757,16 +1790,16 @@ [[package]] name = "quanta" -version = "0.9.3" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20afe714292d5e879d8b12740aa223c6a88f118af41870e8b6196e39a02238a8" +checksum = "a17e662a7a8291a865152364c20c7abc5e60486ab2001e8ec10b24862de0b9ab" dependencies = [ "crossbeam-utils", "libc", - "mach", + "mach2", "once_cell", "raw-cpuid", - "wasi 0.10.2+wasi-snapshot-preview1", + "wasi", "web-sys", "winapi", ] @@ -1829,24 +1862,15 @@ ] [[package]] -name = "redox_syscall" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] name = "regex" -version = "1.10.2" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" +checksum = "81bc1d4caf89fac26a70747fe603c130093b53c773888797a6329091246d651a" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.3", - "regex-syntax 0.8.2", + "regex-automata 0.3.6", + "regex-syntax 0.7.4", ] [[package]] @@ -1860,13 +1884,13 @@ [[package]] name = "regex-automata" -version = "0.4.3" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" +checksum = "fed1ceff11a1dddaee50c9dc8e4938bd106e9d89ae372f192311e7da498e3b69" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.2", + "regex-syntax 0.7.4", ] [[package]] @@ -1877,17 +1901,17 @@ [[package]] name = "regex-syntax" -version = "0.8.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" +checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" [[package]] name = "reqwest" -version = "0.11.22" +version = "0.11.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "046cd98826c46c2ac8ddecae268eb5c2e58628688a5fc7a2643704a73faba95b" +checksum = "3e9ad3fe7488d7e34558a2033d45a0c90b72d97b4f80705666fea71472e2e6a1" dependencies = [ - "base64 0.21.5", + "base64", "bytes", "encoding_rs", "futures-core", @@ -1904,14 +1928,13 @@ "once_cell", "percent-encoding", "pin-project-lite", - "rustls 0.21.8", + "rustls", "rustls-pemfile", "serde", "serde_json", "serde_urlencoded", - "system-configuration", "tokio", - "tokio-rustls 0.24.1", + "tokio-rustls", "tokio-util", "tower-service", "url", @@ -1925,30 +1948,15 @@ [[package]] name = "ring" -version = "0.16.20" +version = "0.17.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" -dependencies = [ - "cc", - "libc", - "once_cell", - "spin 0.5.2", - "untrusted 0.7.1", - "web-sys", - "winapi", -] - -[[package]] -name = "ring" -version = "0.17.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb0205304757e5d899b9c2e448b867ffd03ae7f988002e47cd24954391394d0b" +checksum = "9babe80d5c16becf6594aa32ad2be8fe08498e7ae60b77de8df700e67f191d7e" dependencies = [ "cc", "getrandom", "libc", - "spin 0.9.8", - "untrusted 0.9.0", + "spin", + "untrusted", "windows-sys", ] @@ -1992,7 +2000,7 @@ "proc-macro2", "quote", "rustfsm_trait", - "syn 1.0.109", + "syn 2.0.29", ] [[package]] @@ -2001,11 +2009,11 @@ [[package]] name = "rustix" -version = "0.38.21" +version = "0.38.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b426b0506e5d50a7d8dafcf2e81471400deb602392c7dd110815afb4eaf02a3" +checksum = "19ed4fa021d81c8392ce04db050a3da9a60299050b7ae1cf482d862b54a7218f" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.0", "errno", "libc", "linux-raw-sys", @@ -2014,24 +2022,12 @@ [[package]] name = "rustls" -version = "0.20.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b80e3dec595989ea8510028f30c408a4630db12c9cbb8de34203b89d6577e99" -dependencies = [ - "log", - "ring 0.16.20", - "sct", - "webpki", -] - -[[package]] -name = "rustls" version = "0.21.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "446e14c5cda4f3f30fe71863c34ec70f5ac79d6087097ad0bb433e1be5edf04c" dependencies = [ "log", - "ring 0.17.5", + "ring", "rustls-webpki", "sct", ] @@ -2054,7 +2050,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2" dependencies = [ - "base64 0.21.5", + "base64", ] [[package]] @@ -2063,8 +2059,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" dependencies = [ - "ring 0.17.5", - "untrusted 0.9.0", + "ring", + "untrusted", ] [[package]] @@ -2100,8 +2096,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" dependencies = [ - "ring 0.17.5", - "untrusted 0.9.0", + "ring", + "untrusted", ] [[package]] @@ -2129,35 +2125,35 @@ [[package]] name = "semver" -version = "1.0.20" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" +checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" [[package]] name = "serde" -version = "1.0.190" +version = "1.0.186" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91d3c334ca1ee894a2c6f6ad698fe8c435b76d504b13d436f0685d648d6d96f7" +checksum = "9f5db24220c009de9bd45e69fb2938f4b6d2df856aa9304ce377b3180f83b7c1" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.190" +version = "1.0.186" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67c5609f394e5c2bd7fc51efda478004ea80ef42fee983d5c67a65e34f32c0e3" +checksum = "5ad697f7e0b65af4983a4ce8f56ed5b357e8d3c36651bf6a7e13639c17b8e670" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.29", ] [[package]] name = "serde_json" -version = "1.0.108" +version = "1.0.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" +checksum = "693151e1ac27563d6dbcec9dee9fbd5da8539b20fa14ad3752b2e6d363ace360" dependencies = [ "itoa", "ryu", @@ -2178,9 +2174,9 @@ [[package]] name = "sha1" -version = "0.10.6" +version = "0.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3" dependencies = [ "cfg-if", "cpufeatures", @@ -2189,9 +2185,9 @@ [[package]] name = "sha2" -version = "0.10.8" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" dependencies = [ "cfg-if", "cpufeatures", @@ -2200,9 +2196,9 @@ [[package]] name = "sharded-slab" -version = "0.1.7" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" dependencies = [ "lazy_static", ] @@ -2242,15 +2238,15 @@ [[package]] name = "smallvec" -version = "1.11.1" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "942b4a808e05215192e39f4ab80813e599068285906cc91aa64f923db842bd5a" +checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" [[package]] name = "socket2" -version = "0.4.10" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" +checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" dependencies = [ "libc", "winapi", @@ -2258,9 +2254,9 @@ [[package]] name = "socket2" -version = "0.5.5" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" +checksum = "2538b18701741680e0322a2302176d3253a35388e2e62f172f64f4f16605f877" dependencies = [ "libc", "windows-sys", @@ -2268,15 +2264,15 @@ [[package]] name = "spin" -version = "0.5.2" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" [[package]] -name = "spin" -version = "0.9.8" +name = "static_assertions" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "strsim" @@ -2303,9 +2299,9 @@ [[package]] name = "syn" -version = "2.0.38" +version = "2.0.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e96b79aaa137db8f61e26363a0c9b47d8b4ec75da28b7d1d614c2303e232408b" +checksum = "c324c494eba9d92503e6f1ef2e6df781e78f6a7705a0202d9801b198807d518a" dependencies = [ "proc-macro2", "quote", @@ -2319,27 +2315,6 @@ checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" [[package]] -name = "system-configuration" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "system-configuration-sys", -] - -[[package]] -name = "system-configuration-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] name = "tar" version = "0.4.40" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2352,19 +2327,19 @@ [[package]] name = "target-lexicon" -version = "0.12.12" +version = "0.12.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c39fd04924ca3a864207c66fc2cd7d22d7c016007f9ce846cbb9326331930a" +checksum = "9d0e916b1148c8e263850e1ebcbd046f333e0683c724876bb0da63ea4373dc8a" [[package]] name = "tempfile" -version = "3.8.1" +version = "3.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ef1adac450ad7f4b3c28589471ade84f25f731a7a0fe30d71dfa9f60fd808e5" +checksum = "cb94d2f3cc536af71caac6b6fcebf65860b347e7ce0cc9ebe8f70d3e521054ef" dependencies = [ "cfg-if", "fastrand", - "redox_syscall 0.4.1", + "redox_syscall", "rustix", "windows-sys", ] @@ -2385,6 +2360,7 @@ "opentelemetry", "parking_lot", "prost-types", + "temporal-sdk-core-api", "temporal-sdk-core-protos", "thiserror", "tokio", @@ -2424,7 +2400,7 @@ "anyhow", "arc-swap", "async-trait", - "base64 0.21.5", + "base64", "crossbeam", "dashmap", "derive_builder", @@ -2437,7 +2413,7 @@ "governor", "http", "hyper", - "itertools", + "itertools 0.11.0", "lazy_static", "lru", "mockall", @@ -2446,6 +2422,7 @@ "opentelemetry", "opentelemetry-otlp", "opentelemetry-prometheus", + "opentelemetry_sdk", "parking_lot", "pin-project", "prometheus", @@ -2471,7 +2448,6 @@ "tonic-build", "tracing", "tracing-futures", - "tracing-opentelemetry", "tracing-subscriber", "url", "uuid", @@ -2484,10 +2460,11 @@ dependencies = [ "async-trait", "derive_builder", + "derive_more", + "opentelemetry", "prost-types", "serde", "serde_json", - "temporal-client", "temporal-sdk-core-protos", "thiserror", "tokio", @@ -2501,7 +2478,7 @@ version = "0.1.0" dependencies = [ "anyhow", - "base64 0.21.5", + "base64", "derive_more", "prost", "prost-wkt", @@ -2524,22 +2501,22 @@ [[package]] name = "thiserror" -version = "1.0.50" +version = "1.0.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2" +checksum = "97a802ec30afc17eee47b2855fc72e0c4cd62be9b4efe6591edde0ec5bd68d8f" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.50" +version = "1.0.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" +checksum = "6bb623b56e39ab7dcd4b1b98bb6c8f8d907ed255b18de254088016b27a8ee19b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.29", ] [[package]] @@ -2585,9 +2562,9 @@ [[package]] name = "tokio" -version = "1.33.0" +version = "1.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f38200e3ef7995e5ef13baec2f432a6da0aa9ac495b2c0e8f3b7eec2c92d653" +checksum = "17ed6077ed6cd6c74735e21f37eb16dc3935f96878b1fe961074089cc80893f9" dependencies = [ "backtrace", "bytes", @@ -2597,7 +2574,7 @@ "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2 0.5.5", + "socket2 0.5.3", "tokio-macros", "windows-sys", ] @@ -2620,18 +2597,7 @@ dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", -] - -[[package]] -name = "tokio-rustls" -version = "0.23.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59" -dependencies = [ - "rustls 0.20.9", - "tokio", - "webpki", + "syn 2.0.29", ] [[package]] @@ -2640,7 +2606,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" dependencies = [ - "rustls 0.21.8", + "rustls", "tokio", ] @@ -2657,9 +2623,9 @@ [[package]] name = "tokio-util" -version = "0.7.10" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" +checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" dependencies = [ "bytes", "futures-core", @@ -2671,14 +2637,14 @@ [[package]] name = "tonic" -version = "0.8.3" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f219fad3b929bef19b1f86fbc0358d35daed8f2cac972037ac0dc10bbb8d5fb" +checksum = "3082666a3a6433f7f511c7192923fa1fe07c69332d3c6a2e6bb040b569199d5a" dependencies = [ "async-stream", "async-trait", "axum", - "base64 0.13.1", + "base64", "bytes", "futures-core", "futures-util", @@ -2690,25 +2656,22 @@ "percent-encoding", "pin-project", "prost", - "prost-derive", "rustls-native-certs", "rustls-pemfile", "tokio", - "tokio-rustls 0.23.4", + "tokio-rustls", "tokio-stream", - "tokio-util", "tower", "tower-layer", "tower-service", "tracing", - "tracing-futures", ] [[package]] name = "tonic-build" -version = "0.8.4" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bf5e9b9c0f7e0a7c027dcfaba7b2c60816c7049171f679d99ee2ff65d0de8c4" +checksum = "a6fdaae4c2c638bb70fe42803a26fbd6fc6ac8c72f5c59f67ecc2a2dcabf4b07" dependencies = [ "prettyplease", "proc-macro2", @@ -2751,10 +2714,11 @@ [[package]] name = "tracing" -version = "0.1.40" +version = "0.1.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" dependencies = [ + "cfg-if", "log", "pin-project-lite", "tracing-attributes", @@ -2763,20 +2727,20 @@ [[package]] name = "tracing-attributes" -version = "0.1.27" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.29", ] [[package]] name = "tracing-core" -version = "0.1.32" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" dependencies = [ "once_cell", "valuable", @@ -2794,27 +2758,13 @@ [[package]] name = "tracing-log" -version = "0.1.4" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f751112709b4e791d8ce53e32c4ed2d353565a795ce84da2285393f41557bdf2" +checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" dependencies = [ + "lazy_static", "log", - "once_cell", - "tracing-core", -] - -[[package]] -name = "tracing-opentelemetry" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21ebb87a95ea13271332df069020513ab70bdb5637ca42d6e492dc3bbbad48de" -dependencies = [ - "once_cell", - "opentelemetry", - "tracing", "tracing-core", - "tracing-log", - "tracing-subscriber", ] [[package]] @@ -2844,9 +2794,9 @@ [[package]] name = "typenum" -version = "1.17.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" [[package]] name = "typetag" @@ -2869,7 +2819,7 @@ dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.29", ] [[package]] @@ -2880,9 +2830,9 @@ [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" [[package]] name = "unicode-normalization" @@ -2901,21 +2851,15 @@ [[package]] name = "untrusted" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" - -[[package]] -name = "untrusted" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.4.1" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5" +checksum = "50bff7831e19200a85b17131d085c25d7811bc4e186efdaf54bbd132994a88cb" dependencies = [ "form_urlencoded", "idna", @@ -2923,10 +2867,16 @@ ] [[package]] +name = "urlencoding" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" + +[[package]] name = "uuid" -version = "1.5.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88ad59a7560b41a70d191093a945f0b87bc1deeda46fb237479708a1d6b6cdfc" +checksum = "79daa5ed5740825c40b389c5e50312b9c86df53fccd33f281df655642b43869d" dependencies = [ "getrandom", ] @@ -2954,12 +2904,6 @@ [[package]] name = "wasi" -version = "0.10.2+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" - -[[package]] -name = "wasi" version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" @@ -2985,7 +2929,7 @@ "once_cell", "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.29", "wasm-bindgen-shared", ] @@ -3019,7 +2963,7 @@ dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.29", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -3054,16 +2998,6 @@ ] [[package]] -name = "webpki" -version = "0.22.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed63aea5ce73d0ff405984102c42de94fc55a6b75765d621c65262469b3c9b53" -dependencies = [ - "ring 0.17.5", - "untrusted 0.9.0", -] - -[[package]] name = "webpki-roots" version = "0.25.2" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -3071,14 +3005,13 @@ [[package]] name = "which" -version = "4.4.2" +version = "4.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" +checksum = "2441c784c52b289a054b7201fc93253e288f094e2f4be9058343127c4226a269" dependencies = [ "either", - "home", + "libc", "once_cell", - "rustix", ] [[package]] @@ -3189,26 +3122,6 @@ ] [[package]] -name = "zerocopy" -version = "0.7.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd66a62464e3ffd4e37bd09950c2b9dd6c4f8767380fabba0d523f9a775bc85a" -dependencies = [ - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.7.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "255c4596d41e6916ced49cfafea18727b24d67878fa180ddfd69b9df34fd1726" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.38", -] - -[[package]] name = "zip" version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -3249,10 +3162,11 @@ [[package]] name = "zstd-sys" -version = "2.0.9+zstd.1.5.5" +version = "2.0.8+zstd.1.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e16efa8a874a0481a574084d34cc26fdb3b99627480f785888deb6386506656" +checksum = "5556e6ee25d32df2586c098bbfa278803692a20d0ab9565e049480d52707ec8c" dependencies = [ "cc", + "libc", "pkg-config", ] diff -Nru temporalio-1.3.0/temporalio/bridge/Cargo.toml temporalio-1.3.0/temporalio/bridge/Cargo.toml --- temporalio-1.3.0/temporalio/bridge/Cargo.toml 2023-10-30 13:49:41.000000000 +0000 +++ temporalio-1.3.0/temporalio/bridge/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -21,7 +21,7 @@ temporal-sdk-core-protos = { version = "0.1.0", path = "./sdk-core/sdk-core-protos" } tokio = "1.26" tokio-stream = "0.1" -tonic = "0.8" +tonic = "0.9" tracing = "0.1" url = "2.2" diff -Nru temporalio-1.3.0/temporalio/bridge/runtime.py temporalio-1.3.0/temporalio/bridge/runtime.py --- temporalio-1.3.0/temporalio/bridge/runtime.py 2023-10-30 13:49:41.000000000 +0000 +++ temporalio-1.3.0/temporalio/bridge/runtime.py 2023-10-30 19:40:00.000000000 +0000 @@ -27,14 +27,6 @@ @dataclass(frozen=True) -class TracingConfig: - """Python representation of the Rust struct for tracing config.""" - - filter: str - opentelemetry: OpenTelemetryConfig - - -@dataclass(frozen=True) class LoggingConfig: """Python representation of the Rust struct for logging config.""" @@ -48,6 +40,9 @@ opentelemetry: Optional[OpenTelemetryConfig] prometheus: Optional[PrometheusConfig] + attach_service_name: bool + global_tags: Optional[Mapping[str, str]] + metric_prefix: Optional[str] @dataclass(frozen=True) @@ -57,6 +52,7 @@ url: str headers: Mapping[str, str] metric_periodicity_millis: Optional[int] + metric_temporality_delta: bool @dataclass(frozen=True) @@ -64,13 +60,13 @@ """Python representation of the Rust struct for Prometheus config.""" bind_address: str + counters_total_suffix: bool + unit_suffix: bool @dataclass(frozen=True) class TelemetryConfig: """Python representation of the Rust struct for telemetry config.""" - tracing: Optional[TracingConfig] logging: Optional[LoggingConfig] metrics: Optional[MetricsConfig] - global_tags: Mapping[str, str] diff -Nru temporalio-1.3.0/temporalio/bridge/sdk-core/arch_docs/diagrams/workflow_internals.svg temporalio-1.3.0/temporalio/bridge/sdk-core/arch_docs/diagrams/workflow_internals.svg --- temporalio-1.3.0/temporalio/bridge/sdk-core/arch_docs/diagrams/workflow_internals.svg 2023-10-30 13:49:50.000000000 +0000 +++ temporalio-1.3.0/temporalio/bridge/sdk-core/arch_docs/diagrams/workflow_internals.svg 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff -Nru temporalio-1.3.0/temporalio/bridge/sdk-core/.buildkite/docker/Dockerfile temporalio-1.3.0/temporalio/bridge/sdk-core/.buildkite/docker/Dockerfile --- temporalio-1.3.0/temporalio/bridge/sdk-core/.buildkite/docker/Dockerfile 2023-10-30 13:49:50.000000000 +0000 +++ temporalio-1.3.0/temporalio/bridge/sdk-core/.buildkite/docker/Dockerfile 2023-10-30 19:40:00.000000000 +0000 @@ -1,4 +1,4 @@ -FROM rust:1.68 +FROM rust:1.71 RUN rustup component add rustfmt && \ rustup component add clippy diff -Nru temporalio-1.3.0/temporalio/bridge/sdk-core/Cargo.toml temporalio-1.3.0/temporalio/bridge/sdk-core/Cargo.toml --- temporalio-1.3.0/temporalio/bridge/sdk-core/Cargo.toml 2023-10-30 13:49:50.000000000 +0000 +++ temporalio-1.3.0/temporalio/bridge/sdk-core/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -1,2 +1,7 @@ [workspace] members = ["core", "client", "core-api", "fsm", "test-utils", "sdk-core-protos", "sdk"] + +[workspace.dependencies] +tonic = "0.9" +tonic-build = "0.9" +opentelemetry = "0.20" diff -Nru temporalio-1.3.0/temporalio/bridge/sdk-core/client/Cargo.toml temporalio-1.3.0/temporalio/bridge/sdk-core/client/Cargo.toml --- temporalio-1.3.0/temporalio/bridge/sdk-core/client/Cargo.toml 2023-10-30 13:49:50.000000000 +0000 +++ temporalio-1.3.0/temporalio/bridge/sdk-core/client/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -20,12 +20,12 @@ futures-retry = "0.6.0" http = "0.2" once_cell = "1.13" -opentelemetry = { version = "0.18", features = ["metrics"] } +opentelemetry = { workspace = true, features = ["metrics"] } parking_lot = "0.12" prost-types = "0.11" thiserror = "1.0" tokio = "1.1" -tonic = { version = "0.8", features = ["tls", "tls-roots"] } +tonic = { workspace = true, features = ["tls", "tls-roots"] } tower = "0.4" tracing = "0.1" url = "2.2" @@ -33,7 +33,9 @@ [dependencies.temporal-sdk-core-protos] path = "../sdk-core-protos" -version = "0.1" + +[dependencies.temporal-sdk-core-api] +path = "../core-api" [dev-dependencies] assert_matches = "1" diff -Nru temporalio-1.3.0/temporalio/bridge/sdk-core/client/src/lib.rs temporalio-1.3.0/temporalio/bridge/sdk-core/client/src/lib.rs --- temporalio-1.3.0/temporalio/bridge/sdk-core/client/src/lib.rs 2023-10-30 13:49:50.000000000 +0000 +++ temporalio-1.3.0/temporalio/bridge/sdk-core/client/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -13,7 +13,6 @@ mod workflow_handle; pub use crate::retry::{CallType, RetryClient, RETRYABLE_ERROR_CODES}; -pub use metrics::ClientMetricProvider; pub use raw::{HealthService, OperatorService, TestService, WorkflowService}; pub use temporal_sdk_core_protos::temporal::api::{ enums::v1::ArchivalState, @@ -44,6 +43,7 @@ sync::Arc, time::{Duration, Instant}, }; +use temporal_sdk_core_api::telemetry::metrics::TemporalMeter; use temporal_sdk_core_protos::{ coresdk::{workflow_commands::QueryResult, IntoPayloadsExt}, grpc::health::v1::health_client::HealthClient, @@ -294,7 +294,7 @@ pub async fn connect( &self, namespace: impl Into, - metrics_meter: Option<&dyn ClientMetricProvider>, + metrics_meter: Option, headers: Option>>>, ) -> Result, ClientInitError> { let client = self @@ -312,7 +312,7 @@ /// See [RetryClient] for more pub async fn connect_no_namespace( &self, - metrics_meter: Option<&dyn ClientMetricProvider>, + metrics_meter: Option, headers: Option>>>, ) -> Result>, ClientInitError> { @@ -325,9 +325,9 @@ }; let channel = channel.connect().await?; let service = ServiceBuilder::new() - .layer_fn(|channel| GrpcMetricSvc { + .layer_fn(move |channel| GrpcMetricSvc { inner: channel, - metrics: metrics_meter.map(|mm| MetricsContext::new(vec![], mm)), + metrics: metrics_meter.clone().map(MetricsContext::new), }) .service(channel); let headers = headers.unwrap_or_default(); diff -Nru temporalio-1.3.0/temporalio/bridge/sdk-core/client/src/metrics.rs temporalio-1.3.0/temporalio/bridge/sdk-core/client/src/metrics.rs --- temporalio-1.3.0/temporalio/bridge/sdk-core/client/src/metrics.rs 2023-10-30 13:49:50.000000000 +0000 +++ temporalio-1.3.0/temporalio/bridge/sdk-core/client/src/metrics.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,69 +1,84 @@ use crate::{AttachMetricLabels, LONG_POLL_METHOD_NAMES}; use futures::{future::BoxFuture, FutureExt}; -use opentelemetry::{ - metrics::{Counter, Histogram}, - KeyValue, -}; use std::{ sync::Arc, task::{Context, Poll}, time::{Duration, Instant}, }; +use temporal_sdk_core_api::telemetry::metrics::{ + CoreMeter, Counter, Histogram, MetricAttributes, MetricKeyValue, MetricParameters, + TemporalMeter, +}; use tonic::{body::BoxBody, transport::Channel}; use tower::Service; /// Used to track context associated with metrics, and record/update them // Possible improvement: make generic over some type tag so that methods are only exposed if the // appropriate k/vs have already been set. -#[derive(Clone, Debug)] +#[derive(Clone, derive_more::DebugCustom)] +#[debug(fmt = "MetricsContext {{ attribs: {kvs:?}, poll_is_long: {poll_is_long} }}")] pub struct MetricsContext { - ctx: opentelemetry::Context, - kvs: Arc>, + kvs: MetricAttributes, poll_is_long: bool, - svc_request: Counter, - svc_request_failed: Counter, - long_svc_request: Counter, - long_svc_request_failed: Counter, - - svc_request_latency: Histogram, - long_svc_request_latency: Histogram, -} + svc_request: Arc, + svc_request_failed: Arc, + long_svc_request: Arc, + long_svc_request_failed: Arc, -/// Things that can provide metrics for the client implement this. Trait exists to avoid having -/// to make a whole new lower-level crate just for a tiny shared wrapper around OTel meters. -pub trait ClientMetricProvider: Send + Sync { - /// Construct a counter metric - fn counter(&self, name: &'static str) -> Counter; - /// Construct a histogram metric - fn histogram(&self, name: &'static str) -> Histogram; + svc_request_latency: Arc, + long_svc_request_latency: Arc, } impl MetricsContext { - pub(crate) fn new(kvs: Vec, metric_provider: &dyn ClientMetricProvider) -> Self { + pub(crate) fn new(tm: TemporalMeter) -> Self { + let meter = tm.inner; Self { - ctx: opentelemetry::Context::current(), - kvs: Arc::new(kvs), + kvs: meter.new_attributes(tm.default_attribs), poll_is_long: false, - svc_request: metric_provider.counter("request"), - svc_request_failed: metric_provider.counter("request_failure"), - long_svc_request: metric_provider.counter("long_request"), - long_svc_request_failed: metric_provider.counter("long_request_failure"), - svc_request_latency: metric_provider.histogram("request_latency"), - long_svc_request_latency: metric_provider.histogram("long_request_latency"), + svc_request: meter.counter(MetricParameters { + name: "request".into(), + description: "Count of client request successes by rpc name".into(), + unit: "".into(), + }), + svc_request_failed: meter.counter(MetricParameters { + name: "request_failure".into(), + description: "Count of client request failures by rpc name".into(), + unit: "".into(), + }), + long_svc_request: meter.counter(MetricParameters { + name: "long_request".into(), + description: "Count of long-poll request successes by rpc name".into(), + unit: "".into(), + }), + long_svc_request_failed: meter.counter(MetricParameters { + name: "long_request_failure".into(), + description: "Count of long-poll request failures by rpc name".into(), + unit: "".into(), + }), + svc_request_latency: meter.histogram(MetricParameters { + name: "request_latency".into(), + unit: "ms".into(), + description: "Histogram of client request latencies".into(), + }), + long_svc_request_latency: meter.histogram(MetricParameters { + name: "long_request_latency".into(), + unit: "ms".into(), + description: "Histogram of client long-poll request latencies".into(), + }), } } /// Extend an existing metrics context with new attributes, returning a new one - pub(crate) fn with_new_attrs(&self, new_kvs: impl IntoIterator) -> Self { + pub(crate) fn with_new_attrs(&self, new_kvs: impl IntoIterator) -> Self { let mut r = self.clone(); r.add_new_attrs(new_kvs); r } /// Add new attributes to the context, mutating it - pub(crate) fn add_new_attrs(&mut self, new_kvs: impl IntoIterator) { - Arc::make_mut(&mut self.kvs).extend(new_kvs); + pub(crate) fn add_new_attrs(&mut self, new_kvs: impl IntoIterator) { + self.kvs.add_new_attrs(new_kvs); } pub(crate) fn set_is_long_poll(&mut self) { @@ -73,18 +88,18 @@ /// A request to the temporal service was made pub(crate) fn svc_request(&self) { if self.poll_is_long { - self.long_svc_request.add(&self.ctx, 1, &self.kvs); + self.long_svc_request.add(1, &self.kvs); } else { - self.svc_request.add(&self.ctx, 1, &self.kvs); + self.svc_request.add(1, &self.kvs); } } /// A request to the temporal service failed pub(crate) fn svc_request_failed(&self) { if self.poll_is_long { - self.long_svc_request_failed.add(&self.ctx, 1, &self.kvs); + self.long_svc_request_failed.add(1, &self.kvs); } else { - self.svc_request_failed.add(&self.ctx, 1, &self.kvs); + self.svc_request_failed.add(1, &self.kvs); } } @@ -92,10 +107,10 @@ pub(crate) fn record_svc_req_latency(&self, dur: Duration) { if self.poll_is_long { self.long_svc_request_latency - .record(&self.ctx, dur.as_millis() as u64, &self.kvs); + .record(dur.as_millis() as u64, &self.kvs); } else { self.svc_request_latency - .record(&self.ctx, dur.as_millis() as u64, &self.kvs); + .record(dur.as_millis() as u64, &self.kvs); } } } @@ -104,16 +119,16 @@ const KEY_SVC_METHOD: &str = "operation"; const KEY_TASK_QUEUE: &str = "task_queue"; -pub(crate) fn namespace_kv(ns: String) -> KeyValue { - KeyValue::new(KEY_NAMESPACE, ns) +pub(crate) fn namespace_kv(ns: String) -> MetricKeyValue { + MetricKeyValue::new(KEY_NAMESPACE, ns) } -pub(crate) fn task_queue_kv(tq: String) -> KeyValue { - KeyValue::new(KEY_TASK_QUEUE, tq) +pub(crate) fn task_queue_kv(tq: String) -> MetricKeyValue { + MetricKeyValue::new(KEY_TASK_QUEUE, tq) } -pub(crate) fn svc_operation(op: String) -> KeyValue { - KeyValue::new(KEY_SVC_METHOD, op) +pub(crate) fn svc_operation(op: String) -> MetricKeyValue { + MetricKeyValue::new(KEY_SVC_METHOD, op) } /// Implements metrics functionality for gRPC (really, any http) calls diff -Nru temporalio-1.3.0/temporalio/bridge/sdk-core/client/src/raw.rs temporalio-1.3.0/temporalio/bridge/sdk-core/client/src/raw.rs --- temporalio-1.3.0/temporalio/bridge/sdk-core/client/src/raw.rs 2023-10-30 13:49:50.000000000 +0000 +++ temporalio-1.3.0/temporalio/bridge/sdk-core/client/src/raw.rs 2023-10-30 19:40:00.000000000 +0000 @@ -9,6 +9,7 @@ LONG_POLL_TIMEOUT, }; use futures::{future::BoxFuture, FutureExt, TryFutureExt}; +use temporal_sdk_core_api::telemetry::metrics::MetricKeyValue; use temporal_sdk_core_protos::{ grpc::health::v1::{health_client::HealthClient, *}, temporal::api::{ @@ -199,10 +200,10 @@ #[derive(Debug)] pub(super) struct AttachMetricLabels { - pub(super) labels: Vec, + pub(super) labels: Vec, } impl AttachMetricLabels { - pub fn new(kvs: impl Into>) -> Self { + pub fn new(kvs: impl Into>) -> Self { Self { labels: kvs.into() } } pub fn namespace(ns: impl Into) -> Self { diff -Nru temporalio-1.3.0/temporalio/bridge/sdk-core/core/Cargo.toml temporalio-1.3.0/temporalio/bridge/sdk-core/core/Cargo.toml --- temporalio-1.3.0/temporalio/bridge/sdk-core/core/Cargo.toml 2023-10-30 13:49:50.000000000 +0000 +++ temporalio-1.3.0/temporalio/bridge/sdk-core/core/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -36,18 +36,19 @@ flate2 = { version = "1.0", optional = true } futures = "0.3" futures-util = "0.3" -governor = "0.5" +governor = "0.6" http = "0.2" hyper = "0.14" -itertools = "0.10" +itertools = "0.11" lazy_static = "1.4" -lru = "0.10" +lru = "0.11" mockall = "0.11" nix = { version = "0.26", optional = true } once_cell = "1.5" -opentelemetry = { version = "0.18", features = ["rt-tokio"] } -opentelemetry-otlp = { version = "0.11", features = ["tokio", "metrics"] } -opentelemetry-prometheus = "0.11" +opentelemetry = { workspace = true, features = ["rt-tokio", "metrics"] } +opentelemetry_sdk = { version = "0.20", features = ["metrics"] } +opentelemetry-otlp = { version = "0.13", features = ["tokio", "metrics"] } +opentelemetry-prometheus = "0.13" parking_lot = { version = "0.12", features = ["send_guard"] } pin-project = "1.0" prometheus = "0.13" @@ -66,10 +67,9 @@ tokio = { version = "1.26", features = ["rt", "rt-multi-thread", "parking_lot", "time", "fs", "process"] } tokio-util = { version = "0.7", features = ["io", "io-util"] } tokio-stream = "0.1" -tonic = { version = "0.8", features = ["tls", "tls-roots"] } +tonic = { workspace = true, features = ["tls", "tls-roots"] } tracing = "0.1" tracing-futures = "0.2" -tracing-opentelemetry = "0.18" tracing-subscriber = { version = "0.3", features = ["parking_lot", "env-filter", "registry"] } url = "2.2" uuid = { version = "1.1", features = ["v4"] } @@ -78,32 +78,29 @@ # 1st party local deps [dependencies.temporal-sdk-core-api] path = "../core-api" -version = "0.1" +features = ["otel_impls"] [dependencies.temporal-sdk-core-protos] path = "../sdk-core-protos" -version = "0.1" features = ["history_builders"] [dependencies.temporal-client] path = "../client" -version = "0.1" [dependencies.rustfsm] path = "../fsm" -version = "0.1" [dev-dependencies] assert_matches = "1.4" bimap = "0.6.1" clap = { version = "4.0", features = ["derive"] } -criterion = "0.4" -rstest = "0.17" +criterion = "0.5" +rstest = "0.18" temporal-sdk-core-test-utils = { path = "../test-utils" } temporal-sdk = { path = "../sdk" } [build-dependencies] -tonic-build = "0.8" +tonic-build = { workspace = true } [[test]] name = "integ_tests" diff -Nru temporalio-1.3.0/temporalio/bridge/sdk-core/core/src/core_tests/replay_flag.rs temporalio-1.3.0/temporalio/bridge/sdk-core/core/src/core_tests/replay_flag.rs --- temporalio-1.3.0/temporalio/bridge/sdk-core/core/src/core_tests/replay_flag.rs 2023-10-30 13:49:50.000000000 +0000 +++ temporalio-1.3.0/temporalio/bridge/sdk-core/core/src/core_tests/replay_flag.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,8 +1,21 @@ -use crate::{test_help::canned_histories, worker::ManagedWFFunc}; +use crate::{ + test_help::{ + build_mock_pollers, canned_histories, hist_to_poll_resp, mock_worker, MockPollCfg, + }, + worker::{client::mocks::mock_workflow_client, ManagedWFFunc, LEGACY_QUERY_ID}, +}; use rstest::{fixture, rstest}; -use std::time::Duration; +use std::{collections::VecDeque, time::Duration}; use temporal_sdk::{WfContext, WorkflowFunction}; -use temporal_sdk_core_protos::temporal::api::enums::v1::CommandType; +use temporal_sdk_core_api::Worker; +use temporal_sdk_core_protos::{ + coresdk::{ + workflow_commands::{workflow_command::Variant::RespondToQuery, QueryResult, QuerySuccess}, + workflow_completion::WorkflowActivationCompletion, + }, + temporal::api::{enums::v1::CommandType, query::v1::WorkflowQuery}, +}; +use temporal_sdk_core_test_utils::start_timer_cmd; fn timers_wf(num_timers: u32) -> WorkflowFunction { WorkflowFunction::new(move |command_sink: WfContext| async move { @@ -63,3 +76,60 @@ assert_eq!(commands[0].command_type, CommandType::StartTimer as i32); wfm.shutdown().await.unwrap(); } + +#[tokio::test] +async fn replay_flag_correct_with_query() { + let wfid = "fake_wf_id"; + let t = canned_histories::single_timer("1"); + let tasks = VecDeque::from(vec![ + { + let mut pr = hist_to_poll_resp(&t, wfid.to_owned(), 2.into()); + // Server can issue queries that contain the WFT completion and the subsequent + // commands, but not the consequences yet. + pr.query = Some(WorkflowQuery { + query_type: "query-type".to_string(), + query_args: Some(b"hi".into()), + header: None, + }); + let h = pr.history.as_mut().unwrap(); + h.events.truncate(5); + pr.started_event_id = 3; + dbg!(&pr.resp); + pr + }, + hist_to_poll_resp(&t, wfid.to_owned(), 2.into()), + ]); + let mut mock = MockPollCfg::from_resp_batches(wfid, t, tasks, mock_workflow_client()); + mock.num_expected_legacy_query_resps = 1; + let mut mock = build_mock_pollers(mock); + mock.worker_cfg(|wc| wc.max_cached_workflows = 10); + let core = mock_worker(mock); + + let task = core.poll_workflow_activation().await.unwrap(); + core.complete_workflow_activation(WorkflowActivationCompletion::from_cmd( + task.run_id, + start_timer_cmd(1, Duration::from_secs(1)), + )) + .await + .unwrap(); + + let task = core.poll_workflow_activation().await.unwrap(); + assert!(task.is_replaying); + core.complete_workflow_activation(WorkflowActivationCompletion::from_cmd( + task.run_id, + RespondToQuery(QueryResult { + query_id: LEGACY_QUERY_ID.to_string(), + variant: Some( + QuerySuccess { + response: Some("hi".into()), + } + .into(), + ), + }), + )) + .await + .unwrap(); + + let task = core.poll_workflow_activation().await.unwrap(); + assert!(!task.is_replaying); +} diff -Nru temporalio-1.3.0/temporalio/bridge/sdk-core/core/src/lib.rs temporalio-1.3.0/temporalio/bridge/sdk-core/core/src/lib.rs --- temporalio-1.3.0/temporalio/bridge/sdk-core/core/src/lib.rs 2023-10-30 13:49:50.000000000 +0000 +++ temporalio-1.3.0/temporalio/bridge/sdk-core/core/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -45,9 +45,8 @@ use crate::{ replay::{mock_client_from_histories, Historator, HistoryForReplay}, telemetry::{ - metrics::{MetricsContext, TemporalMeter}, - remove_trace_subscriber_for_current_thread, set_trace_subscriber_for_current_thread, - telemetry_init, TelemetryInstance, + metrics::MetricsContext, remove_trace_subscriber_for_current_thread, + set_trace_subscriber_for_current_thread, telemetry_init, TelemetryInstance, }, worker::client::WorkerClientBag, }; @@ -263,22 +262,15 @@ self.runtime_handle.clone() } - /// Returns the metric meter used for recording metrics, if they were enabled. - pub fn metric_meter(&self) -> Option { - self.telemetry.get_metric_meter() - } - - /// Return the trace subscriber associated with the telemetry options/instance. Can be used - /// to manually set the default for a thread or globally using the `tracing` crate, or with - /// [set_trace_subscriber_for_current_thread] - pub fn trace_subscriber(&self) -> Arc { - self.telemetry.trace_subscriber() - } - /// Return a reference to the owned [TelemetryInstance] pub fn telemetry(&self) -> &TelemetryInstance { &self.telemetry } + + /// Return a mutable reference to the owned [TelemetryInstance] + pub fn telemetry_mut(&mut self) -> &mut TelemetryInstance { + &mut self.telemetry + } } impl Drop for CoreRuntime { diff -Nru temporalio-1.3.0/temporalio/bridge/sdk-core/core/src/telemetry/metrics.rs temporalio-1.3.0/temporalio/bridge/sdk-core/core/src/telemetry/metrics.rs --- temporalio-1.3.0/temporalio/bridge/sdk-core/core/src/telemetry/metrics.rs 2023-10-30 13:49:50.000000000 +0000 +++ temporalio-1.3.0/temporalio/bridge/sdk-core/core/src/telemetry/metrics.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,17 +1,45 @@ -use crate::telemetry::TelemetryInstance; +use crate::{ + abstractions::dbg_panic, + telemetry::{ + default_resource, metric_temporality_to_selector, prometheus_server::PromServer, + TelemetryInstance, TELEM_SERVICE_NAME, + }, +}; use opentelemetry::{ - metrics::{noop::NoopMeterProvider, Counter, Histogram, Meter, MeterProvider}, - sdk::{ - export::metrics::AggregatorSelector, - metrics::{ - aggregators::{histogram, last_value, sum, Aggregator}, - sdk_api::{Descriptor, InstrumentKind}, - }, + self, + metrics::{Meter, MeterProvider as MeterProviderT, Unit}, + KeyValue, +}; +use opentelemetry_otlp::WithExportConfig; +use opentelemetry_sdk::{ + metrics::{ + new_view, + reader::{AggregationSelector, DefaultAggregationSelector}, + Aggregation, Instrument, InstrumentKind, MeterProvider, MeterProviderBuilder, + PeriodicReader, View, + }, + runtime, AttributeSet, +}; +use parking_lot::RwLock; +use std::{ + collections::{HashMap, HashSet}, + net::SocketAddr, + sync::{ + atomic::{AtomicU64, Ordering}, + Arc, }, - Context, KeyValue, + time::Duration, }; -use std::{ops::Deref, sync::Arc, time::Duration}; -use temporal_client::ClientMetricProvider; +use temporal_sdk_core_api::telemetry::{ + metrics::{ + CoreMeter, Counter, Gauge, Histogram, LangMetricAttributes, MetricAttributes, + MetricCallBufferer, MetricEvent, MetricKeyValue, MetricKind, MetricParameters, + MetricUpdateVal, MetricsAttributesOptions, NoOpCoreMeter, + }, + OtelCollectorOptions, PrometheusExporterOptions, +}; +use tokio::task::AbortHandle; +use tonic::metadata::MetadataMap; /// Used to track context associated with metrics, and record/update them /// @@ -19,111 +47,78 @@ /// appropriate k/vs have already been set. #[derive(Clone)] pub(crate) struct MetricsContext { - ctx: Context, - kvs: Arc>, + meter: Arc, + kvs: MetricAttributes, instruments: Arc, } -/// Wraps OTel's [Meter] to ensure we name our metrics properly, or any other temporal-specific -/// metrics customizations -#[derive(derive_more::Constructor)] -pub struct TemporalMeter<'a> { - inner: &'a Meter, - metrics_prefix: &'static str, -} - -impl<'a> TemporalMeter<'a> { - pub(crate) fn counter(&self, name: &'static str) -> Counter { - self.inner - .u64_counter(self.metrics_prefix.to_string() + name) - .init() - } - - pub(crate) fn histogram(&self, name: &'static str) -> Histogram { - self.inner - .u64_histogram(self.metrics_prefix.to_string() + name) - .init() - } -} - -impl<'a> ClientMetricProvider for TemporalMeter<'a> { - fn counter(&self, name: &'static str) -> Counter { - self.counter(name) - } - - fn histogram(&self, name: &'static str) -> Histogram { - self.histogram(name) - } -} - -impl<'a> Deref for TemporalMeter<'a> { - type Target = dyn ClientMetricProvider + 'a; - - fn deref(&self) -> &Self::Target { - self as &Self::Target - } -} - struct Instruments { - wf_completed_counter: Counter, - wf_canceled_counter: Counter, - wf_failed_counter: Counter, - wf_cont_counter: Counter, - wf_e2e_latency: Histogram, - wf_task_queue_poll_empty_counter: Counter, - wf_task_queue_poll_succeed_counter: Counter, - wf_task_execution_failure_counter: Counter, - wf_task_sched_to_start_latency: Histogram, - wf_task_replay_latency: Histogram, - wf_task_execution_latency: Histogram, - act_poll_no_task: Counter, - act_task_received_counter: Counter, - act_execution_failed: Counter, - act_sched_to_start_latency: Histogram, - act_exec_latency: Histogram, - worker_registered: Counter, - num_pollers: Histogram, - task_slots_available: Histogram, - sticky_cache_hit: Counter, - sticky_cache_miss: Counter, - sticky_cache_size: Histogram, - sticky_cache_evictions: Counter, + wf_completed_counter: Arc, + wf_canceled_counter: Arc, + wf_failed_counter: Arc, + wf_cont_counter: Arc, + wf_e2e_latency: Arc, + wf_task_queue_poll_empty_counter: Arc, + wf_task_queue_poll_succeed_counter: Arc, + wf_task_execution_failure_counter: Arc, + wf_task_sched_to_start_latency: Arc, + wf_task_replay_latency: Arc, + wf_task_execution_latency: Arc, + act_poll_no_task: Arc, + act_task_received_counter: Arc, + act_execution_failed: Arc, + act_sched_to_start_latency: Arc, + act_exec_latency: Arc, + worker_registered: Arc, + num_pollers: Arc, + task_slots_available: Arc, + sticky_cache_hit: Arc, + sticky_cache_miss: Arc, + sticky_cache_size: Arc, + sticky_cache_evictions: Arc, } impl MetricsContext { pub(crate) fn no_op() -> Self { + let meter = Arc::new(NoOpCoreMeter); Self { - ctx: Default::default(), - kvs: Default::default(), - instruments: Arc::new(Instruments::new_explicit(TemporalMeter::new( - &NoopMeterProvider::new().meter("fakemeter"), - "fakemetrics", - ))), + kvs: meter.new_attributes(Default::default()), + instruments: Arc::new(Instruments::new(meter.as_ref())), + meter, } } - pub(crate) fn top_level(namespace: String, telemetry: &TelemetryInstance) -> Self { - let kvs = vec![KeyValue::new(KEY_NAMESPACE, namespace)]; - Self { - ctx: Context::current(), - kvs: Arc::new(kvs), - instruments: Arc::new(Instruments::new(telemetry)), + pub(crate) fn top_level(namespace: String, tq: String, telemetry: &TelemetryInstance) -> Self { + if let Some(mut meter) = telemetry.get_temporal_metric_meter() { + meter + .default_attribs + .attributes + .push(MetricKeyValue::new(KEY_NAMESPACE, namespace)); + meter.default_attribs.attributes.push(task_queue(tq)); + let kvs = meter.inner.new_attributes(meter.default_attribs); + Self { + kvs, + instruments: Arc::new(Instruments::new(meter.inner.as_ref())), + meter: meter.inner, + } + } else { + Self::no_op() } } - pub(crate) fn with_task_q(mut self, tq: String) -> Self { - Arc::make_mut(&mut self.kvs).push(task_queue(tq)); - self - } - /// Extend an existing metrics context with new attributes - pub(crate) fn with_new_attrs(&self, new_kvs: impl IntoIterator) -> Self { - let mut kvs = self.kvs.clone(); - Arc::make_mut(&mut kvs).extend(new_kvs); + pub(crate) fn with_new_attrs( + &self, + new_attrs: impl IntoIterator, + ) -> Self { + let as_attrs = self.meter.new_attributes(MetricsAttributesOptions::new( + new_attrs.into_iter().collect(), + )); + let kvs = self.kvs.merge(as_attrs); Self { - ctx: Context::current(), kvs, instruments: self.instruments.clone(), + meter: self.meter.clone(), } } @@ -131,113 +126,91 @@ pub(crate) fn wf_tq_poll_ok(&self) { self.instruments .wf_task_queue_poll_succeed_counter - .add(&self.ctx, 1, &self.kvs); + .add(1, &self.kvs); } /// A workflow task queue poll timed out / had empty response pub(crate) fn wf_tq_poll_empty(&self) { self.instruments .wf_task_queue_poll_empty_counter - .add(&self.ctx, 1, &self.kvs); + .add(1, &self.kvs); } /// A workflow task execution failed pub(crate) fn wf_task_failed(&self) { self.instruments .wf_task_execution_failure_counter - .add(&self.ctx, 1, &self.kvs); + .add(1, &self.kvs); } /// A workflow completed successfully pub(crate) fn wf_completed(&self) { - self.instruments - .wf_completed_counter - .add(&self.ctx, 1, &self.kvs); + self.instruments.wf_completed_counter.add(1, &self.kvs); } /// A workflow ended cancelled pub(crate) fn wf_canceled(&self) { - self.instruments - .wf_canceled_counter - .add(&self.ctx, 1, &self.kvs); + self.instruments.wf_canceled_counter.add(1, &self.kvs); } /// A workflow ended failed pub(crate) fn wf_failed(&self) { - self.instruments - .wf_failed_counter - .add(&self.ctx, 1, &self.kvs); + self.instruments.wf_failed_counter.add(1, &self.kvs); } /// A workflow continued as new pub(crate) fn wf_continued_as_new(&self) { - self.instruments - .wf_cont_counter - .add(&self.ctx, 1, &self.kvs); + self.instruments.wf_cont_counter.add(1, &self.kvs); } /// Record workflow total execution time in milliseconds pub(crate) fn wf_e2e_latency(&self, dur: Duration) { self.instruments .wf_e2e_latency - .record(&self.ctx, dur.as_millis() as u64, &self.kvs); + .record(dur.as_millis() as u64, &self.kvs); } /// Record workflow task schedule to start time in millis pub(crate) fn wf_task_sched_to_start_latency(&self, dur: Duration) { - self.instruments.wf_task_sched_to_start_latency.record( - &self.ctx, - dur.as_millis() as u64, - &self.kvs, - ); + self.instruments + .wf_task_sched_to_start_latency + .record(dur.as_millis() as u64, &self.kvs); } /// Record workflow task execution time in milliseconds pub(crate) fn wf_task_latency(&self, dur: Duration) { - self.instruments.wf_task_execution_latency.record( - &self.ctx, - dur.as_millis() as u64, - &self.kvs, - ); + self.instruments + .wf_task_execution_latency + .record(dur.as_millis() as u64, &self.kvs); } /// Record time it takes to catch up on replaying a WFT pub(crate) fn wf_task_replay_latency(&self, dur: Duration) { - self.instruments.wf_task_replay_latency.record( - &self.ctx, - dur.as_millis() as u64, - &self.kvs, - ); + self.instruments + .wf_task_replay_latency + .record(dur.as_millis() as u64, &self.kvs); } /// An activity long poll timed out pub(crate) fn act_poll_timeout(&self) { - self.instruments - .act_poll_no_task - .add(&self.ctx, 1, &self.kvs); + self.instruments.act_poll_no_task.add(1, &self.kvs); } /// A count of activity tasks received pub(crate) fn act_task_received(&self) { - self.instruments - .act_task_received_counter - .add(&self.ctx, 1, &self.kvs); + self.instruments.act_task_received_counter.add(1, &self.kvs); } /// An activity execution failed pub(crate) fn act_execution_failed(&self) { - self.instruments - .act_execution_failed - .add(&self.ctx, 1, &self.kvs); + self.instruments.act_execution_failed.add(1, &self.kvs); } /// Record activity task schedule to start time in millis pub(crate) fn act_sched_to_start_latency(&self, dur: Duration) { - self.instruments.act_sched_to_start_latency.record( - &self.ctx, - dur.as_millis() as u64, - &self.kvs, - ); + self.instruments + .act_sched_to_start_latency + .record(dur.as_millis() as u64, &self.kvs); } /// Record time it took to complete activity execution, from the time core generated the @@ -245,97 +218,169 @@ pub(crate) fn act_execution_latency(&self, dur: Duration) { self.instruments .act_exec_latency - .record(&self.ctx, dur.as_millis() as u64, &self.kvs); + .record(dur.as_millis() as u64, &self.kvs); } /// A worker was registered pub(crate) fn worker_registered(&self) { - self.instruments - .worker_registered - .add(&self.ctx, 1, &self.kvs); + self.instruments.worker_registered.add(1, &self.kvs); } /// Record current number of available task slots. Context should have worker type set. pub(crate) fn available_task_slots(&self, num: usize) { self.instruments .task_slots_available - .record(&self.ctx, num as u64, &self.kvs) + .record(num as u64, &self.kvs) } /// Record current number of pollers. Context should include poller type / task queue tag. pub(crate) fn record_num_pollers(&self, num: usize) { - self.instruments - .num_pollers - .record(&self.ctx, num as u64, &self.kvs); + self.instruments.num_pollers.record(num as u64, &self.kvs); } /// A workflow task found a cached workflow to run against pub(crate) fn sticky_cache_hit(&self) { - self.instruments - .sticky_cache_hit - .add(&self.ctx, 1, &self.kvs); + self.instruments.sticky_cache_hit.add(1, &self.kvs); } /// A workflow task did not find a cached workflow pub(crate) fn sticky_cache_miss(&self) { - self.instruments - .sticky_cache_miss - .add(&self.ctx, 1, &self.kvs); + self.instruments.sticky_cache_miss.add(1, &self.kvs); } /// Record current cache size (in number of wfs, not bytes) pub(crate) fn cache_size(&self, size: u64) { - self.instruments - .sticky_cache_size - .record(&self.ctx, size, &self.kvs); + self.instruments.sticky_cache_size.record(size, &self.kvs); } /// Count a workflow being evicted from the cache pub(crate) fn cache_eviction(&self) { - self.instruments - .sticky_cache_evictions - .add(&self.ctx, 1, &self.kvs); + self.instruments.sticky_cache_evictions.add(1, &self.kvs); } } impl Instruments { - fn new(telem: &TelemetryInstance) -> Self { - let no_op_meter: Meter; - let meter = if let Some(meter) = telem.get_metric_meter() { - meter - } else { - no_op_meter = NoopMeterProvider::default().meter("no_op"); - TemporalMeter::new(&no_op_meter, "fakemetrics") - }; - Self::new_explicit(meter) - } - - fn new_explicit(meter: TemporalMeter) -> Self { + fn new(meter: &dyn CoreMeter) -> Self { Self { - wf_completed_counter: meter.counter("workflow_completed"), - wf_canceled_counter: meter.counter("workflow_canceled"), - wf_failed_counter: meter.counter("workflow_failed"), - wf_cont_counter: meter.counter("workflow_continue_as_new"), - wf_e2e_latency: meter.histogram(WF_E2E_LATENCY_NAME), - wf_task_queue_poll_empty_counter: meter.counter("workflow_task_queue_poll_empty"), - wf_task_queue_poll_succeed_counter: meter.counter("workflow_task_queue_poll_succeed"), - wf_task_execution_failure_counter: meter.counter("workflow_task_execution_failed"), - wf_task_sched_to_start_latency: meter.histogram(WF_TASK_SCHED_TO_START_LATENCY_NAME), - wf_task_replay_latency: meter.histogram(WF_TASK_REPLAY_LATENCY_NAME), - wf_task_execution_latency: meter.histogram(WF_TASK_EXECUTION_LATENCY_NAME), - act_poll_no_task: meter.counter("activity_poll_no_task"), - act_task_received_counter: meter.counter("activity_task_received"), - act_execution_failed: meter.counter("activity_execution_failed"), - act_sched_to_start_latency: meter.histogram(ACT_SCHED_TO_START_LATENCY_NAME), - act_exec_latency: meter.histogram(ACT_EXEC_LATENCY_NAME), + wf_completed_counter: meter.counter(MetricParameters { + name: "workflow_completed".into(), + description: "Count of successfully completed workflows".into(), + unit: "".into(), + }), + wf_canceled_counter: meter.counter(MetricParameters { + name: "workflow_canceled".into(), + description: "Count of canceled workflows".into(), + unit: "".into(), + }), + wf_failed_counter: meter.counter(MetricParameters { + name: "workflow_failed".into(), + description: "Count of failed workflows".into(), + unit: "".into(), + }), + wf_cont_counter: meter.counter(MetricParameters { + name: "workflow_continue_as_new".into(), + description: "Count of continued-as-new workflows".into(), + unit: "".into(), + }), + wf_e2e_latency: meter.histogram(MetricParameters { + name: WF_E2E_LATENCY_NAME.into(), + unit: "ms".into(), + description: "Histogram of total workflow execution latencies".into(), + }), + wf_task_queue_poll_empty_counter: meter.counter(MetricParameters { + name: "workflow_task_queue_poll_empty".into(), + description: "Count of workflow task queue poll timeouts (no new task)".into(), + unit: "".into(), + }), + wf_task_queue_poll_succeed_counter: meter.counter(MetricParameters { + name: "workflow_task_queue_poll_succeed".into(), + description: "Count of workflow task queue poll successes".into(), + unit: "".into(), + }), + wf_task_execution_failure_counter: meter.counter(MetricParameters { + name: "workflow_task_execution_failed".into(), + description: "Count of workflow task execution failures".into(), + unit: "".into(), + }), + wf_task_sched_to_start_latency: meter.histogram(MetricParameters { + name: WF_TASK_SCHED_TO_START_LATENCY_NAME.into(), + unit: "ms".into(), + description: "Histogram of workflow task schedule-to-start latencies".into(), + }), + wf_task_replay_latency: meter.histogram(MetricParameters { + name: WF_TASK_REPLAY_LATENCY_NAME.into(), + unit: "ms".into(), + description: "Histogram of workflow task replay latencies".into(), + }), + wf_task_execution_latency: meter.histogram(MetricParameters { + name: WF_TASK_EXECUTION_LATENCY_NAME.into(), + unit: "ms".into(), + description: "Histogram of workflow task execution (not replay) latencies".into(), + }), + act_poll_no_task: meter.counter(MetricParameters { + name: "activity_poll_no_task".into(), + description: "Count of activity task queue poll timeouts (no new task)".into(), + unit: "".into(), + }), + act_task_received_counter: meter.counter(MetricParameters { + name: "activity_task_received".into(), + description: "Count of activity task queue poll successes".into(), + unit: "".into(), + }), + act_execution_failed: meter.counter(MetricParameters { + name: "activity_execution_failed".into(), + description: "Count of activity task execution failures".into(), + unit: "".into(), + }), + act_sched_to_start_latency: meter.histogram(MetricParameters { + name: ACT_SCHED_TO_START_LATENCY_NAME.into(), + unit: "ms".into(), + description: "Histogram of activity schedule-to-start latencies".into(), + }), + act_exec_latency: meter.histogram(MetricParameters { + name: ACT_EXEC_LATENCY_NAME.into(), + unit: "ms".into(), + description: "Histogram of activity execution latencies".into(), + }), // name kept as worker start for compat with old sdk / what users expect - worker_registered: meter.counter("worker_start"), - num_pollers: meter.histogram(NUM_POLLERS_NAME), - task_slots_available: meter.histogram(TASK_SLOTS_AVAILABLE_NAME), - sticky_cache_hit: meter.counter("sticky_cache_hit"), - sticky_cache_miss: meter.counter("sticky_cache_miss"), - sticky_cache_size: meter.histogram(STICKY_CACHE_SIZE_NAME), - sticky_cache_evictions: meter.counter("sticky_cache_total_forced_eviction"), + worker_registered: meter.counter(MetricParameters { + name: "worker_start".into(), + description: "Count of the number of initialized workers".into(), + unit: "".into(), + }), + num_pollers: meter.gauge(MetricParameters { + name: NUM_POLLERS_NAME.into(), + description: "Current number of active pollers per queue type".into(), + unit: "".into(), + }), + task_slots_available: meter.gauge(MetricParameters { + name: TASK_SLOTS_AVAILABLE_NAME.into(), + description: "Current number of available slots per task type".into(), + unit: "".into(), + }), + sticky_cache_hit: meter.counter(MetricParameters { + name: "sticky_cache_hit".into(), + description: "Count of times the workflow cache was used for a new workflow task" + .into(), + unit: "".into(), + }), + sticky_cache_miss: meter.counter(MetricParameters { + name: "sticky_cache_miss".into(), + description: + "Count of times the workflow cache was missing a workflow for a sticky task" + .into(), + unit: "".into(), + }), + sticky_cache_size: meter.gauge(MetricParameters { + name: STICKY_CACHE_SIZE_NAME.into(), + description: "Current number of cached workflows".into(), + unit: "".into(), + }), + sticky_cache_evictions: meter.counter(MetricParameters { + name: "sticky_cache_total_forced_eviction".into(), + description: "Count of evictions of cached workflows".into(), + unit: "".into(), + }), } } } @@ -348,35 +393,35 @@ const KEY_WORKER_TYPE: &str = "worker_type"; const KEY_EAGER: &str = "eager"; -pub(crate) fn workflow_poller() -> KeyValue { - KeyValue::new(KEY_POLLER_TYPE, "workflow_task") +pub(crate) fn workflow_poller() -> MetricKeyValue { + MetricKeyValue::new(KEY_POLLER_TYPE, "workflow_task") } -pub(crate) fn workflow_sticky_poller() -> KeyValue { - KeyValue::new(KEY_POLLER_TYPE, "sticky_workflow_task") +pub(crate) fn workflow_sticky_poller() -> MetricKeyValue { + MetricKeyValue::new(KEY_POLLER_TYPE, "sticky_workflow_task") } -pub(crate) fn activity_poller() -> KeyValue { - KeyValue::new(KEY_POLLER_TYPE, "activity_task") +pub(crate) fn activity_poller() -> MetricKeyValue { + MetricKeyValue::new(KEY_POLLER_TYPE, "activity_task") } -pub(crate) fn task_queue(tq: String) -> KeyValue { - KeyValue::new(KEY_TASK_QUEUE, tq) +pub(crate) fn task_queue(tq: String) -> MetricKeyValue { + MetricKeyValue::new(KEY_TASK_QUEUE, tq) } -pub(crate) fn activity_type(ty: String) -> KeyValue { - KeyValue::new(KEY_ACT_TYPE, ty) +pub(crate) fn activity_type(ty: String) -> MetricKeyValue { + MetricKeyValue::new(KEY_ACT_TYPE, ty) } -pub(crate) fn workflow_type(ty: String) -> KeyValue { - KeyValue::new(KEY_WF_TYPE, ty) +pub(crate) fn workflow_type(ty: String) -> MetricKeyValue { + MetricKeyValue::new(KEY_WF_TYPE, ty) } -pub(crate) fn workflow_worker_type() -> KeyValue { - KeyValue::new(KEY_WORKER_TYPE, "WorkflowWorker") +pub(crate) fn workflow_worker_type() -> MetricKeyValue { + MetricKeyValue::new(KEY_WORKER_TYPE, "WorkflowWorker") } -pub(crate) fn activity_worker_type() -> KeyValue { - KeyValue::new(KEY_WORKER_TYPE, "ActivityWorker") +pub(crate) fn activity_worker_type() -> MetricKeyValue { + MetricKeyValue::new(KEY_WORKER_TYPE, "ActivityWorker") } -pub(crate) fn local_activity_worker_type() -> KeyValue { - KeyValue::new(KEY_WORKER_TYPE, "LocalActivityWorker") +pub(crate) fn local_activity_worker_type() -> MetricKeyValue { + MetricKeyValue::new(KEY_WORKER_TYPE, "LocalActivityWorker") } -pub(crate) fn eager(is_eager: bool) -> KeyValue { - KeyValue::new(KEY_EAGER, is_eager) +pub(crate) fn eager(is_eager: bool) -> MetricKeyValue { + MetricKeyValue::new(KEY_EAGER, is_eager) } const WF_E2E_LATENCY_NAME: &str = "workflow_endtoend_latency"; @@ -427,45 +472,507 @@ /// broadly it's trying to represent latencies in millis. pub(super) static DEFAULT_MS_BUCKETS: &[f64] = &[50., 100., 500., 1000., 2500., 10_000.]; +/// Returns the default histogram buckets that lang should use for a given metric name if they +/// have not been overridden by the user. +/// +/// The name must *not* be prefixed with `temporal_` +pub fn default_buckets_for(histo_name: &str) -> &'static [f64] { + match histo_name { + WF_E2E_LATENCY_NAME => WF_LATENCY_MS_BUCKETS, + WF_TASK_EXECUTION_LATENCY_NAME | WF_TASK_REPLAY_LATENCY_NAME => WF_TASK_MS_BUCKETS, + WF_TASK_SCHED_TO_START_LATENCY_NAME | ACT_SCHED_TO_START_LATENCY_NAME => { + TASK_SCHED_TO_START_MS_BUCKETS + } + ACT_EXEC_LATENCY_NAME => ACT_EXE_MS_BUCKETS, + _ => DEFAULT_MS_BUCKETS, + } +} + /// Chooses appropriate aggregators for our metrics -#[derive(Debug, Clone)] +#[derive(Debug, Clone, Default)] pub struct SDKAggSelector { - pub metric_prefix: &'static str, + default: DefaultAggregationSelector, +} +impl AggregationSelector for SDKAggSelector { + fn aggregation(&self, kind: InstrumentKind) -> Aggregation { + match kind { + InstrumentKind::Histogram => Aggregation::ExplicitBucketHistogram { + boundaries: DEFAULT_MS_BUCKETS.to_vec(), + record_min_max: true, + }, + _ => self.default.aggregation(kind), + } + } } -impl AggregatorSelector for SDKAggSelector { - fn aggregator_for(&self, descriptor: &Descriptor) -> Option> { - // Gauges are always last value - if *descriptor.instrument_kind() == InstrumentKind::GaugeObserver { - return Some(Arc::new(last_value())); - } - - if *descriptor.instrument_kind() == InstrumentKind::Histogram { - let dname = descriptor - .name() - .strip_prefix(self.metric_prefix) - .unwrap_or_else(|| descriptor.name()); - // Some recorders are just gauges - match dname { - STICKY_CACHE_SIZE_NAME | NUM_POLLERS_NAME | TASK_SLOTS_AVAILABLE_NAME => { - return Some(Arc::new(last_value())) +fn histo_view( + metric_name: &'static str, + buckets: &[f64], +) -> opentelemetry::metrics::Result> { + new_view( + Instrument::new().name(format!("*{metric_name}")), + opentelemetry_sdk::metrics::Stream::new().aggregation( + Aggregation::ExplicitBucketHistogram { + boundaries: buckets.to_vec(), + record_min_max: true, + }, + ), + ) +} + +pub(super) fn augment_meter_provider_with_defaults( + mpb: MeterProviderBuilder, + global_tags: &HashMap, +) -> opentelemetry::metrics::Result { + // Some histograms are actually gauges, but we have to use histograms otherwise they forget + // their value between collections since we don't use callbacks. + Ok(mpb + .with_view(histo_view(WF_E2E_LATENCY_NAME, WF_LATENCY_MS_BUCKETS)?) + .with_view(histo_view( + WF_TASK_EXECUTION_LATENCY_NAME, + WF_TASK_MS_BUCKETS, + )?) + .with_view(histo_view(WF_TASK_REPLAY_LATENCY_NAME, WF_TASK_MS_BUCKETS)?) + .with_view(histo_view( + WF_TASK_SCHED_TO_START_LATENCY_NAME, + TASK_SCHED_TO_START_MS_BUCKETS, + )?) + .with_view(histo_view( + ACT_SCHED_TO_START_LATENCY_NAME, + TASK_SCHED_TO_START_MS_BUCKETS, + )?) + .with_view(histo_view(ACT_EXEC_LATENCY_NAME, ACT_EXE_MS_BUCKETS)?) + .with_resource(default_resource(global_tags))) +} + +/// OTel has no built-in synchronous Gauge. Histograms used to be able to serve that purpose, but +/// they broke that. Lovely. So, we need to implement one by hand. +pub(crate) struct MemoryGaugeU64 { + labels_to_values: Arc>>, +} + +impl MemoryGaugeU64 { + fn new(params: MetricParameters, meter: &Meter) -> Self { + let gauge = meter + .u64_observable_gauge(params.name) + .with_unit(Unit::new(params.unit)) + .with_description(params.description) + .init(); + let map = Arc::new(RwLock::new(HashMap::::new())); + let map_c = map.clone(); + meter + .register_callback(&[gauge.as_any()], move |o| { + // This whole thing is... extra stupid. + // See https://github.com/open-telemetry/opentelemetry-rust/issues/1181 + // The performance is likely bad here, but, given this is only called when metrics + // are exported it should be livable for now. + let map_rlock = map_c.read(); + for (kvs, val) in map_rlock.iter() { + let kvs: Vec<_> = kvs + .iter() + .map(|(k, v)| KeyValue::new(k.clone(), v.clone())) + .collect(); + o.observe_u64(&gauge, *val, kvs.as_slice()) } - _ => (), - } + }) + .expect("instrument must exist we just created it"); + MemoryGaugeU64 { + labels_to_values: map, + } + } + fn record(&self, val: u64, kvs: &[KeyValue]) { + self.labels_to_values + .write() + .insert(AttributeSet::from(kvs), val); + } +} + +/// Create an OTel meter that can be used as a [CoreMeter] to export metrics over OTLP. +pub fn build_otlp_metric_exporter( + opts: OtelCollectorOptions, +) -> Result { + let exporter = opentelemetry_otlp::MetricsExporter::new( + opentelemetry_otlp::TonicExporterBuilder::default() + .with_endpoint(opts.url.to_string()) + .with_metadata(MetadataMap::from_headers((&opts.headers).try_into()?)), + Box::new(metric_temporality_to_selector(opts.metric_temporality)), + Box::::default(), + )?; + let reader = PeriodicReader::builder(exporter, runtime::Tokio) + .with_interval(opts.metric_periodicity) + .build(); + let mp = augment_meter_provider_with_defaults( + MeterProvider::builder().with_reader(reader), + &opts.global_tags, + )? + .build(); + Ok::<_, anyhow::Error>(CoreOtelMeter(mp.meter(TELEM_SERVICE_NAME))) +} + +pub struct StartedPromServer { + pub meter: Arc, + pub bound_addr: SocketAddr, + pub abort_handle: AbortHandle, +} + +/// Builds and runs a prometheus endpoint which can be scraped by prom instances for metrics export. +/// Returns the meter that can be used as a [CoreMeter]. +pub fn start_prometheus_metric_exporter( + opts: PrometheusExporterOptions, +) -> Result { + let (srv, exporter) = PromServer::new(&opts, SDKAggSelector::default())?; + let meter_provider = augment_meter_provider_with_defaults( + MeterProvider::builder().with_reader(exporter), + &opts.global_tags, + )? + .build(); + let bound_addr = srv.bound_addr(); + let handle = tokio::spawn(async move { srv.run().await }); + Ok(StartedPromServer { + meter: Arc::new(CoreOtelMeter(meter_provider.meter(TELEM_SERVICE_NAME))), + bound_addr, + abort_handle: handle.abort_handle(), + }) +} + +/// Buffers [MetricEvent]s for periodic consumption by lang +#[derive(Debug)] +pub struct MetricsCallBuffer { + instrument_ids: AtomicU64, + attribute_ids: AtomicU64, + calls_rx: crossbeam::channel::Receiver, + calls_tx: crossbeam::channel::Sender, +} +impl MetricsCallBuffer { + /// Create a new buffer with the given capacity + pub fn new(buffer_size: usize) -> Self { + let (calls_tx, calls_rx) = crossbeam::channel::bounded(buffer_size); + MetricsCallBuffer { + instrument_ids: AtomicU64::new(0), + attribute_ids: AtomicU64::new(0), + calls_rx, + calls_tx, + } + } + fn new_instrument(&self, params: MetricParameters, kind: MetricKind) -> BufferInstrument { + let id = self.instrument_ids.fetch_add(1, Ordering::AcqRel); + let _ = self.calls_tx.send(MetricEvent::Create { params, id, kind }); + BufferInstrument { + kind, + id, + tx: self.calls_tx.clone(), + } + } +} +impl CoreMeter for MetricsCallBuffer { + fn new_attributes(&self, opts: MetricsAttributesOptions) -> MetricAttributes { + let id = self.attribute_ids.fetch_add(1, Ordering::AcqRel); + let _ = self.calls_tx.send(MetricEvent::CreateAttributes { + id, + attributes: opts.attributes, + }); + MetricAttributes::Lang(LangMetricAttributes { + ids: HashSet::from([id]), + new_attributes: vec![], + }) + } - // Other recorders will select their appropriate buckets - let buckets = match dname { - WF_E2E_LATENCY_NAME => WF_LATENCY_MS_BUCKETS, - WF_TASK_EXECUTION_LATENCY_NAME | WF_TASK_REPLAY_LATENCY_NAME => WF_TASK_MS_BUCKETS, - WF_TASK_SCHED_TO_START_LATENCY_NAME | ACT_SCHED_TO_START_LATENCY_NAME => { - TASK_SCHED_TO_START_MS_BUCKETS - } - ACT_EXEC_LATENCY_NAME => ACT_EXE_MS_BUCKETS, - _ => DEFAULT_MS_BUCKETS, - }; - return Some(Arc::new(histogram(buckets))); + fn counter(&self, params: MetricParameters) -> Arc { + Arc::new(self.new_instrument(params, MetricKind::Counter)) + } + + fn histogram(&self, params: MetricParameters) -> Arc { + Arc::new(self.new_instrument(params, MetricKind::Histogram)) + } + + fn gauge(&self, params: MetricParameters) -> Arc { + Arc::new(self.new_instrument(params, MetricKind::Gauge)) + } +} +impl MetricCallBufferer for MetricsCallBuffer { + fn retrieve(&self) -> Vec { + self.calls_rx.try_iter().collect() + } +} + +struct BufferInstrument { + kind: MetricKind, + id: u64, + tx: crossbeam::channel::Sender, +} +impl BufferInstrument { + fn send(&self, value: u64, attributes: &MetricAttributes) { + let attributes = match attributes { + MetricAttributes::Lang(l) => l.clone(), + _ => panic!("MetricsCallBuffer only works with MetricAttributes::Lang"), + }; + let _ = self.tx.send(MetricEvent::Update { + id: self.id, + update: match self.kind { + MetricKind::Counter => MetricUpdateVal::Delta(value), + MetricKind::Gauge | MetricKind::Histogram => MetricUpdateVal::Value(value), + }, + attributes: attributes.clone(), + }); + } +} +impl Counter for BufferInstrument { + fn add(&self, value: u64, attributes: &MetricAttributes) { + self.send(value, attributes) + } +} +impl Gauge for BufferInstrument { + fn record(&self, value: u64, attributes: &MetricAttributes) { + self.send(value, attributes) + } +} +impl Histogram for BufferInstrument { + fn record(&self, value: u64, attributes: &MetricAttributes) { + self.send(value, attributes) + } +} + +#[derive(Debug)] +pub struct CoreOtelMeter(Meter); +impl CoreMeter for CoreOtelMeter { + fn new_attributes(&self, attribs: MetricsAttributesOptions) -> MetricAttributes { + MetricAttributes::OTel { + kvs: Arc::new(attribs.attributes.into_iter().map(KeyValue::from).collect()), + } + } + + fn counter(&self, params: MetricParameters) -> Arc { + Arc::new( + self.0 + .u64_counter(params.name) + .with_unit(Unit::new(params.unit)) + .with_description(params.description) + .init(), + ) + } + + fn histogram(&self, params: MetricParameters) -> Arc { + Arc::new( + self.0 + .u64_histogram(params.name) + .with_unit(Unit::new(params.unit)) + .with_description(params.description) + .init(), + ) + } + + fn gauge(&self, params: MetricParameters) -> Arc { + Arc::new(MemoryGaugeU64::new(params, &self.0)) + } +} + +impl Gauge for MemoryGaugeU64 { + fn record(&self, value: u64, attributes: &MetricAttributes) { + if let MetricAttributes::OTel { kvs } = attributes { + self.record(value, kvs); + } else { + dbg_panic!("Must use OTel attributes with an OTel metric implementation"); } + } +} + +#[derive(Debug, derive_more::Constructor)] +pub(crate) struct PrefixedMetricsMeter { + prefix: String, + meter: CM, +} +impl CoreMeter for PrefixedMetricsMeter { + fn new_attributes(&self, attribs: MetricsAttributesOptions) -> MetricAttributes { + self.meter.new_attributes(attribs) + } + + fn counter(&self, mut params: MetricParameters) -> Arc { + params.name = (self.prefix.clone() + &*params.name).into(); + self.meter.counter(params) + } + + fn histogram(&self, mut params: MetricParameters) -> Arc { + params.name = (self.prefix.clone() + &*params.name).into(); + self.meter.histogram(params) + } - Some(Arc::new(sum())) + fn gauge(&self, mut params: MetricParameters) -> Arc { + params.name = (self.prefix.clone() + &*params.name).into(); + self.meter.gauge(params) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use temporal_sdk_core_api::telemetry::METRIC_PREFIX; + use tracing::subscriber::NoSubscriber; + + #[test] + fn test_buffered_core_context() { + let no_op_subscriber = Arc::new(NoSubscriber::new()); + let call_buffer = Arc::new(MetricsCallBuffer::new(100)); + let telem_instance = TelemetryInstance::new( + no_op_subscriber, + None, + METRIC_PREFIX.to_string(), + Some(call_buffer.clone()), + true, + ); + let mc = MetricsContext::top_level("foo".to_string(), "q".to_string(), &telem_instance); + mc.cache_eviction(); + let events = call_buffer.retrieve(); + assert_matches!( + &events[0], + MetricEvent::CreateAttributes { + id: 0, + attributes + } + if attributes[0].key == "service_name" && + attributes[1].key == "namespace" && + attributes[2].key == "task_queue" + ); + // Verify all metrics are created. This number will need to get updated any time a metric + // is added. + let num_metrics = 22; + #[allow(clippy::needless_range_loop)] // Sorry clippy, this reads easier. + for metric_num in 1..=num_metrics { + assert_matches!(&events[metric_num], + MetricEvent::Create { id, .. } + if *id == (metric_num - 1) as u64 + ); + } + assert_matches!( + &events[num_metrics + 2], // +2 for attrib creation (at start), then this update + MetricEvent::Update { + id: 22, + attributes, + update: MetricUpdateVal::Delta(1) + } + if attributes.ids == HashSet::from([0]) + ); + // Verify creating a new context with new attributes merges them properly + let mc2 = mc.with_new_attrs([MetricKeyValue::new("gotta", "go fast")]); + mc2.wf_task_latency(Duration::from_secs(1)); + let events = call_buffer.retrieve(); + assert_matches!( + &events[0], + MetricEvent::CreateAttributes { + id: 1, + attributes + } + if attributes[0].key == "gotta" + ); + assert_matches!( + &events[1], + MetricEvent::Update { + id: 10, + attributes, + update: MetricUpdateVal::Value(1000) // milliseconds + } + if attributes.ids == HashSet::from([0, 1]) + ); + } + + #[test] + fn metric_buffer() { + let call_buffer = MetricsCallBuffer::new(10); + let ctr = call_buffer.counter(MetricParameters { + name: "ctr".into(), + description: "a counter".into(), + unit: "grognaks".into(), + }); + let histo = call_buffer.histogram(MetricParameters { + name: "histo".into(), + description: "a histogram".into(), + unit: "flubarbs".into(), + }); + let gauge = call_buffer.gauge(MetricParameters { + name: "gauge".into(), + description: "a counter".into(), + unit: "bleezles".into(), + }); + let attrs_1 = call_buffer.new_attributes(MetricsAttributesOptions { + attributes: vec![MetricKeyValue::new("hi", "yo")], + }); + let attrs_2 = call_buffer.new_attributes(MetricsAttributesOptions { + attributes: vec![MetricKeyValue::new("run", "fast")], + }); + ctr.add(1, &attrs_1); + histo.record(2, &attrs_1); + gauge.record(3, &attrs_2); + + let mut calls = call_buffer.retrieve(); + calls.reverse(); + assert_matches!( + calls.pop(), + Some(MetricEvent::Create { + params, + id: 0, + kind: MetricKind::Counter + }) + if params.name == "ctr" + ); + assert_matches!( + calls.pop(), + Some(MetricEvent::Create { + params, + id: 1, + kind: MetricKind::Histogram + }) + if params.name == "histo" + ); + assert_matches!( + calls.pop(), + Some(MetricEvent::Create { + params, + id: 2, + kind: MetricKind::Gauge + }) + if params.name == "gauge" + ); + assert_matches!( + calls.pop(), + Some(MetricEvent::CreateAttributes { + id: 0, + attributes + }) + if attributes[0].key == "hi" + ); + assert_matches!( + calls.pop(), + Some(MetricEvent::CreateAttributes { + id: 1, + attributes + }) + if attributes[0].key == "run" + ); + assert_matches!( + calls.pop(), + Some(MetricEvent::Update{ + id: 0, + attributes, + update: MetricUpdateVal::Delta(1) + }) + if attributes.ids == HashSet::from([0]) + ); + assert_matches!( + calls.pop(), + Some(MetricEvent::Update{ + id: 1, + attributes, + update: MetricUpdateVal::Value(2) + }) + if attributes.ids == HashSet::from([0]) + ); + assert_matches!( + calls.pop(), + Some(MetricEvent::Update{ + id: 2, + attributes, + update: MetricUpdateVal::Value(3) + }) + if attributes.ids == HashSet::from([1]) + ); } } diff -Nru temporalio-1.3.0/temporalio/bridge/sdk-core/core/src/telemetry/mod.rs temporalio-1.3.0/temporalio/bridge/sdk-core/core/src/telemetry/mod.rs --- temporalio-1.3.0/temporalio/bridge/sdk-core/core/src/telemetry/mod.rs 2023-10-30 13:49:50.000000000 +0000 +++ temporalio-1.3.0/temporalio/bridge/sdk-core/core/src/telemetry/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -5,43 +5,33 @@ pub(crate) mod metrics; mod prometheus_server; +pub use metrics::{ + build_otlp_metric_exporter, default_buckets_for, start_prometheus_metric_exporter, + MetricsCallBuffer, +}; + use crate::telemetry::{ log_export::{CoreLogExportLayer, CoreLogsOut}, - metrics::SDKAggSelector, - prometheus_server::PromServer, + metrics::PrefixedMetricsMeter, }; -use crossbeam::channel::Receiver; use itertools::Itertools; use once_cell::sync::OnceCell; -use opentelemetry::{ - metrics::{Meter, MeterProvider}, - runtime, - sdk::{ - export::metrics::aggregation::{self, Temporality, TemporalitySelector}, - trace::Config, - Resource, - }, - KeyValue, -}; -use opentelemetry_otlp::WithExportConfig; +use opentelemetry::{sdk::Resource, KeyValue}; +use opentelemetry_sdk::metrics::{data::Temporality, reader::TemporalitySelector, InstrumentKind}; use parking_lot::Mutex; use std::{ cell::RefCell, collections::{HashMap, VecDeque}, - convert::TryInto, env, - net::SocketAddr, sync::{ atomic::{AtomicBool, Ordering}, Arc, }, - time::Duration, }; use temporal_sdk_core_api::telemetry::{ - CoreLog, CoreTelemetry, Logger, MetricTemporality, MetricsExporter, OtelCollectorOptions, - TelemetryOptions, TraceExporter, + metrics::{CoreMeter, MetricKeyValue, MetricsAttributesOptions, TemporalMeter}, + CoreLog, CoreTelemetry, Logger, MetricTemporality, TelemetryOptions, }; -use tonic::metadata::MetadataMap; use tracing::{Level, Subscriber}; use tracing_subscriber::{layer::SubscriberExt, EnvFilter, Layer}; @@ -57,53 +47,73 @@ /// Holds initialized tracing/metrics exporters, etc pub struct TelemetryInstance { - metric_prefix: &'static str, + metric_prefix: String, logs_out: Option>, - metrics: Option<(Box, Meter)>, + metrics: Option>, trace_subscriber: Arc, - prom_binding: Option, - _keepalive_rx: Receiver<()>, + attach_service_name: bool, } impl TelemetryInstance { fn new( trace_subscriber: Arc, logs_out: Option>, - metric_prefix: &'static str, - mut meter_provider: Option>, - prom_binding: Option, - keepalive_rx: Receiver<()>, + metric_prefix: String, + metrics: Option>, + attach_service_name: bool, ) -> Self { - let metrics = meter_provider.take().map(|mp| { - let meter = mp.meter(TELEM_SERVICE_NAME); - (mp, meter) - }); Self { metric_prefix, logs_out, metrics, trace_subscriber, - prom_binding, - _keepalive_rx: keepalive_rx, + attach_service_name, } } - /// Returns a trace subscriber which can be used with the tracing crate, or with our own - /// [set_trace_subscriber_for_current_thread] function. + /// Return the trace subscriber associated with the telemetry options/instance. Can be used + /// to manually set the default for a thread or globally using the `tracing` crate, or with + /// [set_trace_subscriber_for_current_thread] pub fn trace_subscriber(&self) -> Arc { self.trace_subscriber.clone() } - /// Returns the address the Prometheus server is bound to if it is running - pub fn prom_port(&self) -> Option { - self.prom_binding + /// Some metric meters cannot be initialized until after a tokio runtime has started and after + /// other telemetry has initted (ex: prometheus). They can be attached here. + pub fn attach_late_init_metrics(&mut self, meter: Arc) { + self.metrics = Some(meter); + } + + /// Returns our wrapper for metric meters, including the `metric_prefix` from + /// [TelemetryOptions]. This should be used to initialize clients or for any other + /// temporal-owned metrics. User defined metrics should use [Self::get_metric_meter]. + pub fn get_temporal_metric_meter(&self) -> Option { + self.metrics.clone().map(|m| { + let kvs = self.default_kvs(); + let attribs = MetricsAttributesOptions::new(kvs); + TemporalMeter::new( + Arc::new(PrefixedMetricsMeter::new(self.metric_prefix.clone(), m)) + as Arc, + attribs, + ) + }) } - /// Returns our wrapper for OTel metric meters, can be used to, ex: initialize clients + /// Returns our wrapper for metric meters, including attaching the service name if enabled. pub fn get_metric_meter(&self) -> Option { - self.metrics - .as_ref() - .map(|(_, m)| TemporalMeter::new(m, self.metric_prefix)) + self.metrics.clone().map(|m| { + let kvs = self.default_kvs(); + let attribs = MetricsAttributesOptions::new(kvs); + TemporalMeter::new(m, attribs) + }) + } + + fn default_kvs(&self) -> Vec { + if self.attach_service_name { + vec![MetricKeyValue::new("service_name", TELEM_SERVICE_NAME)] + } else { + vec![] + } } } @@ -129,14 +139,6 @@ SUB_GUARD.with(|sg| sg.take()); } -fn metric_prefix(opts: &TelemetryOptions) -> &'static str { - if opts.no_temporal_prefix_for_metrics { - "" - } else { - "temporal_" - } -} - impl CoreTelemetry for TelemetryInstance { fn fetch_buffered_logs(&self) -> Vec { if let Some(logs_out) = self.logs_out.as_ref() { @@ -160,169 +162,67 @@ // in one case or the other. There does not seem to be a way to tell from the current runtime // handle if it is single or multithreaded. Additionally, we can isolate metrics work this // way which is nice. - let (tx, rx) = crossbeam::channel::bounded(0); - let (keepalive_tx, keepalive_rx) = crossbeam::channel::bounded(0); - let jh = std::thread::spawn(move || -> Result<(), anyhow::Error> { - let runtime = tokio::runtime::Builder::new_multi_thread() - .thread_name("telemetry") - .worker_threads(2) - .enable_all() - .build()?; - // Parts of telem dat ==== - let mut logs_out = None; - let metric_prefix = metric_prefix(&opts); - let mut prom_binding = None; - // ======================= - - // Tracing subscriber layers ========= - let mut console_pretty_layer = None; - let mut console_compact_layer = None; - let mut forward_layer = None; - let mut export_layer = None; - // =================================== - - if let Some(ref logger) = opts.logging { - match logger { - Logger::Console { filter } => { - // This is silly dupe but can't be avoided without boxing. - if env::var("TEMPORAL_CORE_PRETTY_LOGS").is_ok() { - console_pretty_layer = Some( - tracing_subscriber::fmt::layer() - .with_target(false) - .event_format( - tracing_subscriber::fmt::format() - .pretty() - .with_source_location(false), - ) - .with_filter(EnvFilter::new(filter)), - ) - } else { - console_compact_layer = Some( - tracing_subscriber::fmt::layer() - .with_target(false) - .event_format( - tracing_subscriber::fmt::format() - .compact() - .with_source_location(false), - ) - .with_filter(EnvFilter::new(filter)), - ) - } - } - Logger::Forward { filter } => { - let (export_layer, lo) = CoreLogExportLayer::new(); - logs_out = Some(Mutex::new(lo)); - forward_layer = Some(export_layer.with_filter(EnvFilter::new(filter))); - } - }; - }; - - let meter_provider = if let Some(ref metrics) = opts.metrics { - let aggregator = SDKAggSelector { metric_prefix }; - match metrics { - MetricsExporter::Prometheus(addr) => { - let srv = runtime.block_on(async { - PromServer::new( - *addr, - aggregator, - metric_temporality_to_selector(opts.metric_temporality), - &opts.global_tags, - ) - })?; - prom_binding = Some(srv.bound_addr()); - let mp = srv.exporter.meter_provider()?; - runtime.spawn(async move { srv.run().await }); - Some(Box::new(mp) as Box) - } - MetricsExporter::Otel(OtelCollectorOptions { - url, - headers, - metric_periodicity, - }) => runtime.block_on(async { - let metrics = opentelemetry_otlp::new_pipeline() - .metrics( - aggregator, - metric_temporality_to_selector(opts.metric_temporality), - runtime::Tokio, - ) - .with_period(metric_periodicity.unwrap_or_else(|| Duration::from_secs(1))) - .with_resource(default_resource(&opts.global_tags)) - .with_exporter( - opentelemetry_otlp::new_exporter() - .tonic() - .with_endpoint(url.to_string()) - .with_metadata(MetadataMap::from_headers(headers.try_into()?)), - ) - .build()?; - Ok::<_, anyhow::Error>(Some( - Box::new(metrics) as Box - )) - })?, - } - } else { - None - }; - - if let Some(ref tracing) = opts.tracing { - match &tracing.exporter { - TraceExporter::Otel(OtelCollectorOptions { url, headers, .. }) => { - runtime.block_on(async { - let tracer_cfg = - Config::default().with_resource(default_resource(&opts.global_tags)); - let tracer = opentelemetry_otlp::new_pipeline() - .tracing() - .with_exporter( - opentelemetry_otlp::new_exporter() - .tonic() - .with_endpoint(url.to_string()) - .with_metadata(MetadataMap::from_headers(headers.try_into()?)), + // Parts of telem dat ==== + let mut logs_out = None; + // ======================= + + // Tracing subscriber layers ========= + let mut console_pretty_layer = None; + let mut console_compact_layer = None; + let mut forward_layer = None; + // =================================== + + if let Some(ref logger) = opts.logging { + match logger { + Logger::Console { filter } => { + // This is silly dupe but can't be avoided without boxing. + if env::var("TEMPORAL_CORE_PRETTY_LOGS").is_ok() { + console_pretty_layer = Some( + tracing_subscriber::fmt::layer() + .with_target(false) + .event_format( + tracing_subscriber::fmt::format() + .pretty() + .with_source_location(false), ) - .with_trace_config(tracer_cfg) - .install_batch(runtime::Tokio)?; - - let opentelemetry = tracing_opentelemetry::layer() - .with_tracer(tracer) - .with_filter(EnvFilter::new(&tracing.filter)); - - export_layer = Some(opentelemetry); - Result::<(), anyhow::Error>::Ok(()) - })?; + .with_filter(EnvFilter::new(filter)), + ) + } else { + console_compact_layer = Some( + tracing_subscriber::fmt::layer() + .with_target(false) + .event_format( + tracing_subscriber::fmt::format() + .compact() + .with_source_location(false), + ) + .with_filter(EnvFilter::new(filter)), + ) } - }; + } + Logger::Forward { filter } => { + let (export_layer, lo) = CoreLogExportLayer::new(); + logs_out = Some(Mutex::new(lo)); + forward_layer = Some(export_layer.with_filter(EnvFilter::new(filter))); + } }; + }; - let reg = tracing_subscriber::registry() - .with(console_pretty_layer) - .with(console_compact_layer) - .with(forward_layer) - .with(export_layer); - - #[cfg(feature = "tokio-console")] - let reg = reg.with(console_subscriber::spawn()); - - tx.send(TelemetryInstance::new( - Arc::new(reg), - logs_out, - metric_prefix, - meter_provider, - prom_binding, - keepalive_rx, - )) - .expect("Must be able to send telem instance out of thread"); - // Now keep the thread alive until the telemetry instance is dropped by trying to send - // something forever - let _ = keepalive_tx.send(()); - Ok(()) - }); - match rx.recv() { - Ok(ti) => Ok(ti), - Err(_) => { - // Immediately join the thread since something went wrong in it - jh.join().expect("Telemetry must init cleanly")?; - // This can't happen. The rx channel can't be dropped unless the thread errored. - unreachable!("Impossible error in telemetry init thread"); - } - } + let reg = tracing_subscriber::registry() + .with(console_pretty_layer) + .with(console_compact_layer) + .with(forward_layer); + + #[cfg(feature = "tokio-console")] + let reg = reg.with(console_subscriber::spawn()); + + Ok(TelemetryInstance::new( + Arc::new(reg), + logs_out, + opts.metric_prefix, + opts.metrics, + opts.attach_service_name, + )) } /// Initialize telemetry/tracing globally. Useful for testing. Only takes affect when called @@ -351,21 +251,26 @@ Resource::new(default_resource_kvs().iter().cloned()).merge(&Resource::new(override_kvs)) } +#[derive(Clone)] +struct ConstantTemporality(Temporality); +impl TemporalitySelector for ConstantTemporality { + fn temporality(&self, _: InstrumentKind) -> Temporality { + self.0 + } +} fn metric_temporality_to_selector( t: MetricTemporality, ) -> impl TemporalitySelector + Send + Sync + Clone { match t { - MetricTemporality::Cumulative => { - aggregation::constant_temporality_selector(Temporality::Cumulative) - } - MetricTemporality::Delta => aggregation::constant_temporality_selector(Temporality::Delta), + MetricTemporality::Cumulative => ConstantTemporality(Temporality::Cumulative), + MetricTemporality::Delta => ConstantTemporality(Temporality::Delta), } } #[cfg(test)] pub mod test_initters { use super::*; - use temporal_sdk_core_api::telemetry::{TelemetryOptionsBuilder, TraceExportConfig}; + use temporal_sdk_core_api::telemetry::TelemetryOptionsBuilder; #[allow(dead_code)] // Not always used, called to enable for debugging when needed pub fn test_telem_console() { @@ -379,29 +284,7 @@ ) .unwrap(); } - - #[allow(dead_code)] // Not always used, called to enable for debugging when needed - pub fn test_telem_collector() { - telemetry_init_global( - TelemetryOptionsBuilder::default() - .logging(Logger::Console { - filter: construct_filter_string(Level::DEBUG, Level::WARN), - }) - .tracing(TraceExportConfig { - filter: construct_filter_string(Level::DEBUG, Level::WARN), - exporter: TraceExporter::Otel(OtelCollectorOptions { - url: "grpc://localhost:4317".parse().unwrap(), - headers: Default::default(), - metric_periodicity: None, - }), - }) - .build() - .unwrap(), - ) - .unwrap(); - } } -use crate::telemetry::metrics::TemporalMeter; #[cfg(test)] pub use test_initters::*; diff -Nru temporalio-1.3.0/temporalio/bridge/sdk-core/core/src/telemetry/prometheus_server.rs temporalio-1.3.0/temporalio/bridge/sdk-core/core/src/telemetry/prometheus_server.rs --- temporalio-1.3.0/temporalio/bridge/sdk-core/core/src/telemetry/prometheus_server.rs 2023-10-30 13:49:50.000000000 +0000 +++ temporalio-1.3.0/temporalio/bridge/sdk-core/core/src/telemetry/prometheus_server.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,52 +1,57 @@ -use crate::telemetry::default_resource; use hyper::{ header::CONTENT_TYPE, server::conn::AddrIncoming, service::{make_service_fn, service_fn}, Body, Method, Request, Response, Server, }; -use opentelemetry::sdk::{ - export::metrics::{aggregation::TemporalitySelector, AggregatorSelector}, - metrics::{controllers, processors}, -}; -use opentelemetry_prometheus::{ExporterBuilder, PrometheusExporter}; -use prometheus::{Encoder, TextEncoder}; -use std::{collections::HashMap, convert::Infallible, net::SocketAddr, sync::Arc, time::Duration}; +use opentelemetry_prometheus::PrometheusExporter; +use opentelemetry_sdk::metrics::reader::AggregationSelector; +use prometheus::{Encoder, Registry, TextEncoder}; +use std::{convert::Infallible, net::SocketAddr}; +use temporal_sdk_core_api::telemetry::PrometheusExporterOptions; /// Exposes prometheus metrics for scraping pub(super) struct PromServer { bound_addr: AddrIncoming, - pub exporter: Arc, + registry: Registry, } impl PromServer { pub fn new( - addr: SocketAddr, - aggregation: impl AggregatorSelector + Send + Sync + 'static, - temporality: impl TemporalitySelector + Send + Sync + 'static, - tags: &HashMap, - ) -> Result { - let controller = - controllers::basic(processors::factory(aggregation, temporality).with_memory(true)) - // Because Prom is pull-based, make this always refresh - .with_collect_period(Duration::from_secs(0)) - .with_resource(default_resource(tags)) - .build(); - let exporter = ExporterBuilder::new(controller).try_init()?; - let bound_addr = AddrIncoming::bind(&addr)?; - Ok(Self { - exporter: Arc::new(exporter), - bound_addr, - }) + opts: &PrometheusExporterOptions, + aggregation: impl AggregationSelector + Send + Sync + 'static, + ) -> Result<(Self, PrometheusExporter), anyhow::Error> { + let registry = Registry::new(); + let exporter = opentelemetry_prometheus::exporter() + .with_aggregation_selector(aggregation) + .without_scope_info() + .with_registry(registry.clone()); + let exporter = if !opts.counters_total_suffix { + exporter.without_counter_suffixes() + } else { + exporter + }; + let exporter = if !opts.unit_suffix { + exporter.without_units() + } else { + exporter + }; + let bound_addr = AddrIncoming::bind(&opts.socket_addr)?; + Ok(( + Self { + bound_addr, + registry, + }, + exporter.build()?, + )) } pub async fn run(self) -> hyper::Result<()> { // Spin up hyper server to serve metrics for scraping. We use hyper since we already depend // on it via Tonic. - let expclone = self.exporter.clone(); let svc = make_service_fn(move |_conn| { - let expclone = expclone.clone(); - async move { Ok::<_, Infallible>(service_fn(move |req| metrics_req(req, expclone.clone()))) } + let regclone = self.registry.clone(); + async move { Ok::<_, Infallible>(service_fn(move |req| metrics_req(req, regclone.clone()))) } }); let server = Server::builder(self.bound_addr).serve(svc); server.await @@ -60,13 +65,13 @@ /// Serves prometheus metrics in the expected format for scraping async fn metrics_req( req: Request, - exporter: Arc, + registry: Registry, ) -> Result, hyper::Error> { let response = match (req.method(), req.uri().path()) { (&Method::GET, "/metrics") => { let mut buffer = vec![]; let encoder = TextEncoder::new(); - let metric_families = exporter.registry().gather(); + let metric_families = registry.gather(); encoder.encode(&metric_families, &mut buffer).unwrap(); Response::builder() diff -Nru temporalio-1.3.0/temporalio/bridge/sdk-core/core/src/worker/mod.rs temporalio-1.3.0/temporalio/bridge/sdk-core/core/src/worker/mod.rs --- temporalio-1.3.0/temporalio/bridge/sdk-core/core/src/worker/mod.rs 2023-10-30 13:49:50.000000000 +0000 +++ temporalio-1.3.0/temporalio/bridge/sdk-core/core/src/worker/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -195,8 +195,7 @@ ) -> Self { info!(task_queue=%config.task_queue, namespace=%config.namespace, "Initializing worker"); let metrics = if let Some(ti) = telem_instance { - MetricsContext::top_level(config.namespace.clone(), ti) - .with_task_q(config.task_queue.clone()) + MetricsContext::top_level(config.namespace.clone(), config.task_queue.clone(), ti) } else { MetricsContext::no_op() }; diff -Nru temporalio-1.3.0/temporalio/bridge/sdk-core/core/src/worker/workflow/machines/child_workflow_state_machine.rs temporalio-1.3.0/temporalio/bridge/sdk-core/core/src/worker/workflow/machines/child_workflow_state_machine.rs --- temporalio-1.3.0/temporalio/bridge/sdk-core/core/src/worker/workflow/machines/child_workflow_state_machine.rs 2023-10-30 13:49:50.000000000 +0000 +++ temporalio-1.3.0/temporalio/bridge/sdk-core/core/src/worker/workflow/machines/child_workflow_state_machine.rs 2023-10-30 19:40:00.000000000 +0000 @@ -7,7 +7,10 @@ worker::workflow::{machines::HistEventData, InternalFlagsRef}, }; use rustfsm::{fsm, MachineError, StateMachine, TransitionResult}; -use std::convert::{TryFrom, TryInto}; +use std::{ + convert::{TryFrom, TryInto}, + string::ToString, +}; use temporal_sdk_core_protos::{ coresdk::{ child_workflow::{ @@ -79,6 +82,15 @@ Cancelled --(Cancel) --> Cancelled; Cancelled --(ChildWorkflowExecutionCancelled, on_child_workflow_execution_cancelled) --> Cancelled; + // Completions of any kind after cancellation are acceptable for abandoned children + Cancelled --(ChildWorkflowExecutionCompleted(Option), + shared on_child_workflow_execution_completed) --> Cancelled; + Cancelled --(ChildWorkflowExecutionFailed(ChildWorkflowExecutionFailedEventAttributes), + shared on_child_workflow_execution_failed) --> Cancelled; + Cancelled --(ChildWorkflowExecutionTimedOut(RetryState), + shared on_child_workflow_execution_timed_out) --> Cancelled; + Cancelled --(ChildWorkflowExecutionTerminated, + shared on_child_workflow_execution_terminated) --> Cancelled; Failed --(Cancel) --> Failed; StartFailed --(Cancel) --> StartFailed; TimedOut --(Cancel) --> TimedOut; @@ -120,6 +132,14 @@ seen_cancelled_event: bool, } +fn completion_of_not_abandoned_err() -> WFMachinesError { + WFMachinesError::Nondeterminism( + "Child workflows which don't have the ABANDON cancellation type cannot complete after \ + being cancelled." + .to_string(), + ) +} + impl Cancelled { pub(super) fn on_child_workflow_execution_cancelled( self, @@ -139,6 +159,49 @@ ) } } + + pub(super) fn on_child_workflow_execution_completed( + self, + state: &mut SharedState, + _: Option, + ) -> ChildWorkflowMachineTransition { + if !state.abandons() { + return ChildWorkflowMachineTransition::Err(completion_of_not_abandoned_err()); + } + ChildWorkflowMachineTransition::ok([], self) + } + + pub(super) fn on_child_workflow_execution_failed( + self, + state: &mut SharedState, + _: ChildWorkflowExecutionFailedEventAttributes, + ) -> ChildWorkflowMachineTransition { + if !state.abandons() { + return ChildWorkflowMachineTransition::Err(completion_of_not_abandoned_err()); + } + ChildWorkflowMachineTransition::ok([], self) + } + + pub(super) fn on_child_workflow_execution_timed_out( + self, + state: &mut SharedState, + _: RetryState, + ) -> ChildWorkflowMachineTransition { + if !state.abandons() { + return ChildWorkflowMachineTransition::Err(completion_of_not_abandoned_err()); + } + ChildWorkflowMachineTransition::ok([], self) + } + + pub(super) fn on_child_workflow_execution_terminated( + self, + state: &mut SharedState, + ) -> ChildWorkflowMachineTransition { + if !state.abandons() { + return ChildWorkflowMachineTransition::Err(completion_of_not_abandoned_err()); + } + ChildWorkflowMachineTransition::ok([], self) + } } #[derive(Default, Clone)] @@ -172,14 +235,14 @@ if event_dat.wf_id != state.workflow_id { return TransitionResult::Err(WFMachinesError::Nondeterminism(format!( "Child workflow id of scheduled event '{}' does not \ - match child workflow id of activity command '{}'", + match child workflow id of command '{}'", event_dat.wf_id, state.workflow_id ))); } if event_dat.wf_type != state.workflow_type { return TransitionResult::Err(WFMachinesError::Nondeterminism(format!( "Child workflow type of scheduled event '{}' does not \ - match child workflow type of activity command '{}'", + match child workflow type of command '{}'", event_dat.wf_type, state.workflow_type ))); } @@ -357,6 +420,12 @@ internal_flags: InternalFlagsRef, } +impl SharedState { + fn abandons(&self) -> bool { + matches!(self.cancel_type, ChildWorkflowCancellationType::Abandon) + } +} + impl ChildWorkflowMachine { /// Create a new child workflow and immediately schedule it. pub(super) fn new_scheduled( @@ -935,4 +1004,69 @@ assert_eq!(discriminant(&state), discriminant(s.state())); } } + + #[test] + fn abandoned_ok_with_completions() { + let mut shared = SharedState { + initiated_event_id: 0, + started_event_id: 0, + lang_sequence_number: 0, + namespace: "".to_string(), + workflow_id: "".to_string(), + run_id: "".to_string(), + workflow_type: "".to_string(), + cancelled_before_sent: false, + cancel_type: ChildWorkflowCancellationType::Abandon, + internal_flags: Rc::new(RefCell::new(InternalFlags::new(&Default::default()))), + }; + let state = Cancelled { + seen_cancelled_event: true, + }; + let res = state.on_child_workflow_execution_completed(&mut shared, None); + // Can't use assert_matches b/c not Debug. + assert!(matches!( + res, + TransitionResult::Ok { + commands, + new_state: Cancelled { .. } + } + if commands.is_empty() + )); + let state = Cancelled { + seen_cancelled_event: true, + }; + let res = state.on_child_workflow_execution_failed(&mut shared, Default::default()); + assert!(matches!( + res, + TransitionResult::Ok { + commands, + new_state: Cancelled { .. } + } + if commands.is_empty() + )); + let state = Cancelled { + seen_cancelled_event: true, + }; + let res = state.on_child_workflow_execution_timed_out(&mut shared, Default::default()); + assert!(matches!( + res, + TransitionResult::Ok { + commands, + new_state: Cancelled { .. } + } + if commands.is_empty() + )); + let state = Cancelled { + seen_cancelled_event: true, + }; + let res = state.on_child_workflow_execution_terminated(&mut shared); + assert!(matches!( + res, + TransitionResult::Ok { + commands, + new_state: Cancelled { .. } + } + if commands.is_empty() + )); + } } diff -Nru temporalio-1.3.0/temporalio/bridge/sdk-core/core/src/worker/workflow/machines/patch_state_machine.rs temporalio-1.3.0/temporalio/bridge/sdk-core/core/src/worker/workflow/machines/patch_state_machine.rs --- temporalio-1.3.0/temporalio/bridge/sdk-core/core/src/worker/workflow/machines/patch_state_machine.rs 2023-10-30 13:49:50.000000000 +0000 +++ temporalio-1.3.0/temporalio/bridge/sdk-core/core/src/worker/workflow/machines/patch_state_machine.rs 2023-10-30 19:40:00.000000000 +0000 @@ -270,6 +270,13 @@ } } +impl PatchMachine { + /// Returns true if this patch machine has the same id as the one provided + pub(crate) fn matches_patch(&self, id: &str) -> bool { + self.shared_state.patch_id == id + } +} + #[cfg(test)] mod tests { use crate::{ diff -Nru temporalio-1.3.0/temporalio/bridge/sdk-core/core/src/worker/workflow/machines/workflow_machines.rs temporalio-1.3.0/temporalio/bridge/sdk-core/core/src/worker/workflow/machines/workflow_machines.rs --- temporalio-1.3.0/temporalio/bridge/sdk-core/core/src/worker/workflow/machines/workflow_machines.rs 2023-10-30 13:49:50.000000000 +0000 +++ temporalio-1.3.0/temporalio/bridge/sdk-core/core/src/worker/workflow/machines/workflow_machines.rs 2023-10-30 19:40:00.000000000 +0000 @@ -138,7 +138,7 @@ current_wf_task_commands: VecDeque, /// Information about patch markers we have already seen while replaying history - encountered_change_markers: HashMap, + encountered_patch_markers: HashMap, /// Contains extra local-activity related data local_activity_data: LocalActivityData, @@ -255,7 +255,7 @@ id_to_machine: Default::default(), commands: Default::default(), current_wf_task_commands: Default::default(), - encountered_change_markers: Default::default(), + encountered_patch_markers: Default::default(), local_activity_data: LocalActivityData::default(), have_seen_terminal_event: false, } @@ -367,9 +367,17 @@ /// "no work" situation. Possibly, it may know about some work the machines don't, like queries. pub(crate) fn get_wf_activation(&mut self) -> WorkflowActivation { let jobs = self.drive_me.drain_jobs(); + // Even though technically we may have satisfied all the criteria to be done with replay, + // query only activations are always "replaying" to keep things sane. + let all_query = jobs.iter().all(|j| { + matches!( + j.variant, + Some(workflow_activation_job::Variant::QueryWorkflow(_)) + ) + }); WorkflowActivation { timestamp: self.current_wf_time.map(Into::into), - is_replaying: self.replaying, + is_replaying: self.replaying || all_query, run_id: self.run_id.clone(), history_length: self.last_processed_event as u32, jobs, @@ -488,7 +496,6 @@ } } - let mut saw_completed = false; let mut do_handle_event = true; let mut history = events.into_iter().peekable(); while let Some(event) = history.next() { @@ -504,17 +511,21 @@ // This definition of replaying here is that we are no longer replaying as soon as we // see new events that have never been seen or produced by the SDK. // - // Specifically, replay ends once we have seen the last command-event which was produced - // as a result of the last completed WFT. Thus, replay would be false for things like - // signals which were received and after the last completion, and thus generated the - // current WFT being handled. - if self.replaying && has_final_event && saw_completed && !event.is_command_event() { + // Specifically, replay ends once we have seen any non-command event (IE: events that + // aren't a result of something we produced in the SDK) on a WFT which has the final + // event in history (meaning we are processing the most recent WFT and there are no + // more subsequent WFTs). WFT Completed in this case does not count as a non-command + // event, because that will typically show up as the first event in an incremental + // history, and we want to ignore it and its associated commands since we "produced" + // them. + if self.replaying + && has_final_event + && event.event_type() != EventType::WorkflowTaskCompleted + && !event.is_command_event() + { // Replay is finished self.replaying = false; } - if event.event_type() == EventType::WorkflowTaskCompleted { - saw_completed = true; - } if do_handle_event { let eho = self.handle_event( @@ -547,7 +558,7 @@ .peek_next_wft_sequence(last_handled_wft_started_id) { if let Some((patch_id, _)) = e.get_patch_marker_details() { - self.encountered_change_markers.insert( + self.encountered_patch_markers.insert( patch_id.clone(), ChangeInfo { created_command: false, @@ -718,7 +729,7 @@ let consumed_cmd = loop { if let Some(peek_machine) = self.commands.front() { let mach = self.machine(peek_machine.machine); - match change_marker_handling(event, mach, next_event)? { + match patch_marker_handling(event, mach, next_event)? { EventHandlingOutcome::SkipCommand => { self.commands.pop_front(); continue; @@ -1138,7 +1149,7 @@ WFCommand::SetPatchMarker(attrs) => { // Do not create commands for change IDs that we have already created commands // for. - let encountered_entry = self.encountered_change_markers.get(&attrs.patch_id); + let encountered_entry = self.encountered_patch_markers.get(&attrs.patch_id); if !matches!(encountered_entry, Some(ChangeInfo {created_command}) if *created_command) { @@ -1147,17 +1158,17 @@ self.replaying, attrs.deprecated, encountered_entry.is_some(), - self.encountered_change_markers.keys().map(|s| s.as_str()), + self.encountered_patch_markers.keys().map(|s| s.as_str()), self.observed_internal_flags.clone(), )?; let mkey = self.add_cmd_to_wf_task(patch_machine, CommandIdKind::NeverResolves); self.process_machine_responses(mkey, other_cmds)?; - if let Some(ci) = self.encountered_change_markers.get_mut(&attrs.patch_id) { + if let Some(ci) = self.encountered_patch_markers.get_mut(&attrs.patch_id) { ci.created_command = true; } else { - self.encountered_change_markers.insert( + self.encountered_patch_markers.insert( attrs.patch_id, ChangeInfo { created_command: true, @@ -1360,45 +1371,62 @@ /// Special handling for patch markers, when handling command events as in /// [WorkflowMachines::handle_command_event] -fn change_marker_handling( +fn patch_marker_handling( event: &HistoryEvent, mach: &Machines, next_event: Option<&HistoryEvent>, ) -> Result { - if !mach.matches_event(event) { - // Version markers can be skipped in the event they are deprecated - if let Some((patch_name, deprecated)) = event.get_patch_marker_details() { + let patch_machine = match mach { + Machines::PatchMachine(pm) => Some(pm), + _ => None, + }; + let patch_details = event.get_patch_marker_details(); + fn skip_one_or_two_events(next_event: Option<&HistoryEvent>) -> Result { + // Also ignore the subsequent upsert event if present + let mut skip_next_event = false; + if let Some(Attributes::UpsertWorkflowSearchAttributesEventAttributes(atts)) = + next_event.and_then(|ne| ne.attributes.as_ref()) + { + if let Some(ref sa) = atts.search_attributes { + skip_next_event = sa.indexed_fields.contains_key(VERSION_SEARCH_ATTR_KEY); + } + } + + Ok(EventHandlingOutcome::SkipEvent { skip_next_event }) + } + + if let Some((patch_name, deprecated)) = patch_details { + if let Some(pm) = patch_machine { + // If the next machine *is* a patch machine, but this marker is deprecated, it may + // either apply to this machine (the `deprecate_patch` call is still in workflow code) - + // or it could be another `patched` or `deprecate_patch` call for a *different* patch, + // which we should also permit. In the latter case, we should skip this event. + if !pm.matches_patch(&patch_name) && deprecated { + skip_one_or_two_events(next_event) + } else { + Ok(EventHandlingOutcome::Normal) + } + } else { + // Version markers can be skipped in the event they are deprecated // Is deprecated. We can simply ignore this event, as deprecated change // markers are allowed without matching changed calls. if deprecated { - debug!("Deprecated patch marker tried against wrong machine, skipping."); - - // Also ignore the subsequent upsert event if present - let mut skip_next_event = false; - if let Some(Attributes::UpsertWorkflowSearchAttributesEventAttributes(atts)) = - next_event.and_then(|ne| ne.attributes.as_ref()) - { - if let Some(ref sa) = atts.search_attributes { - skip_next_event = sa.indexed_fields.contains_key(VERSION_SEARCH_ATTR_KEY); - } - } - - return Ok(EventHandlingOutcome::SkipEvent { skip_next_event }); + debug!("Deprecated patch marker tried against non-patch machine, skipping."); + skip_one_or_two_events(next_event) + } else { + Err(WFMachinesError::Nondeterminism(format!( + "Non-deprecated patch marker encountered for change {patch_name}, but there is \ + no corresponding change command!" + ))) } - return Err(WFMachinesError::Nondeterminism(format!( - "Non-deprecated patch marker encountered for change {patch_name}, \ - but there is no corresponding change command!" - ))); - } - // Patch machines themselves may also not *have* matching markers, where non-deprecated - // calls take the old path, and deprecated calls assume history is produced by a new-code - // worker. - if matches!(mach, Machines::PatchMachine(_)) { - debug!("Skipping non-matching event against patch machine"); - return Ok(EventHandlingOutcome::SkipCommand); } + } else if patch_machine.is_some() { + debug!("Skipping non-matching event against patch machine"); + Ok(EventHandlingOutcome::SkipCommand) + } else { + // Not a patch machine or a patch event + Ok(EventHandlingOutcome::Normal) } - Ok(EventHandlingOutcome::Normal) } #[derive(derive_more::From)] diff -Nru temporalio-1.3.0/temporalio/bridge/sdk-core/core/src/worker/workflow/mod.rs temporalio-1.3.0/temporalio/bridge/sdk-core/core/src/worker/workflow/mod.rs --- temporalio-1.3.0/temporalio/bridge/sdk-core/core/src/worker/workflow/mod.rs 2023-10-30 13:49:50.000000000 +0000 +++ temporalio-1.3.0/temporalio/bridge/sdk-core/core/src/worker/workflow/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -561,7 +561,7 @@ should_evict = Some(EvictionReason::TaskNotFound); } _ => { - warn!(error= %err, "Network error while completing workflow activation"); + warn!(error= %err, "Error while completing workflow activation"); should_evict = Some(EvictionReason::Fatal); } } diff -Nru temporalio-1.3.0/temporalio/bridge/sdk-core/core-api/Cargo.toml temporalio-1.3.0/temporalio/bridge/sdk-core/core-api/Cargo.toml --- temporalio-1.3.0/temporalio/bridge/sdk-core/core-api/Cargo.toml 2023-10-30 13:49:50.000000000 +0000 +++ temporalio-1.3.0/temporalio/bridge/sdk-core/core-api/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -12,22 +12,23 @@ # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +[features] +otel_impls = ["opentelemetry"] + [dependencies] async-trait = "0.1" derive_builder = "0.12" +derive_more = "0.99" +opentelemetry = { workspace = true, optional = true } prost-types = "0.11" serde = { version = "1.0", default_features = false, features = ["derive"] } serde_json = "1.0" thiserror = "1.0" tokio = "1.24" -tonic = "0.8" +tonic = { workspace = true } tracing-core = "0.1" url = "2.3" [dependencies.temporal-sdk-core-protos] path = "../sdk-core-protos" -version = "0.1" - -[dependencies.temporal-client] -path = "../client" -version = "0.1" +version = "0.1" \ No newline at end of file diff -Nru temporalio-1.3.0/temporalio/bridge/sdk-core/core-api/src/telemetry/metrics.rs temporalio-1.3.0/temporalio/bridge/sdk-core/core-api/src/telemetry/metrics.rs --- temporalio-1.3.0/temporalio/bridge/sdk-core/core-api/src/telemetry/metrics.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/temporalio/bridge/sdk-core/core-api/src/telemetry/metrics.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,281 @@ +use std::{borrow::Cow, collections::HashSet, fmt::Debug, sync::Arc}; + +/// Implementors of this trait are expected to be defined in each language's bridge. +/// The implementor is responsible for the allocation/instantiation of new metric meters which +/// Core has requested. +pub trait CoreMeter: Send + Sync + Debug { + fn new_attributes(&self, attribs: MetricsAttributesOptions) -> MetricAttributes; + fn counter(&self, params: MetricParameters) -> Arc; + fn histogram(&self, params: MetricParameters) -> Arc; + fn gauge(&self, params: MetricParameters) -> Arc; +} + +#[derive(Debug, Clone, derive_builder::Builder)] +pub struct MetricParameters { + /// The name for the new metric/instrument + #[builder(setter(into))] + pub name: Cow<'static, str>, + /// A description that will appear in metadata if the backend supports it + #[builder(setter(into), default = "\"\".into()")] + pub description: Cow<'static, str>, + /// Unit information that will appear in metadata if the backend supports it + #[builder(setter(into), default = "\"\".into()")] + pub unit: Cow<'static, str>, +} +impl From<&'static str> for MetricParameters { + fn from(value: &'static str) -> Self { + Self { + name: value.into(), + description: Default::default(), + unit: Default::default(), + } + } +} + +/// Wraps a [CoreMeter] to enable the attaching of default labels to metrics. Cloning is cheap. +#[derive(derive_more::Constructor, Clone, Debug)] +pub struct TemporalMeter { + pub inner: Arc, + pub default_attribs: MetricsAttributesOptions, +} + +#[derive(Debug, Clone)] +pub enum MetricEvent { + Create { + params: MetricParameters, + id: u64, + kind: MetricKind, + }, + CreateAttributes { + id: u64, + attributes: Vec, + }, + Update { + id: u64, + attributes: LangMetricAttributes, + update: MetricUpdateVal, + }, +} +#[derive(Debug, Clone, Copy)] +pub enum MetricKind { + Counter, + Gauge, + Histogram, +} +#[derive(Debug, Clone, Copy)] +pub enum MetricUpdateVal { + // Currently all deltas are natural numbers + Delta(u64), + // Currently all values are natural numbers + Value(u64), +} + +pub trait MetricCallBufferer: Send + Sync { + fn retrieve(&self) -> Vec; +} + +impl CoreMeter for Arc { + fn new_attributes(&self, attribs: MetricsAttributesOptions) -> MetricAttributes { + self.as_ref().new_attributes(attribs) + } + fn counter(&self, params: MetricParameters) -> Arc { + self.as_ref().counter(params) + } + fn histogram(&self, params: MetricParameters) -> Arc { + self.as_ref().histogram(params) + } + fn gauge(&self, params: MetricParameters) -> Arc { + self.as_ref().gauge(params) + } +} + +/// Attributes which are provided every time a call to record a specific metric is made. +/// Implementors must be very cheap to clone, as these attributes will be re-used frequently. +#[derive(Clone, Debug)] +#[non_exhaustive] +pub enum MetricAttributes { + #[cfg(feature = "otel_impls")] + OTel { + kvs: Arc>, + }, + Lang(LangMetricAttributes), +} +#[derive(Clone, Debug)] +pub struct LangMetricAttributes { + /// A set of references to attributes stored in lang memory. All referenced attributes should + /// be attached to the metric when recording. + pub ids: HashSet, + /// If populated, these key values should also be used in addition to the referred-to + /// existing attributes when recording + pub new_attributes: Vec, +} + +impl MetricAttributes { + /// Extend existing metrics attributes with others, returning a new instance + pub fn merge(&self, other: MetricAttributes) -> Self { + let mut me = self.clone(); + match (&mut me, other) { + #[cfg(feature = "otel_impls")] + (MetricAttributes::OTel { ref mut kvs }, MetricAttributes::OTel { kvs: other_kvs }) => { + Arc::make_mut(kvs).extend((*other_kvs).clone()); + } + (MetricAttributes::Lang(ref mut l), MetricAttributes::Lang(ol)) => { + l.ids.extend(ol.ids); + l.new_attributes.extend(ol.new_attributes); + } + _ => panic!("Cannot merge metric attributes of different kinds"), + } + me + } + + /// Mutate self to add new kvs + pub fn add_new_attrs(&mut self, new_kvs: impl IntoIterator) { + match self { + #[cfg(feature = "otel_impls")] + MetricAttributes::OTel { ref mut kvs, .. } => { + Arc::make_mut(kvs).extend(new_kvs.into_iter().map(Into::into)); + } + MetricAttributes::Lang(ref mut attrs, ..) => { + attrs.new_attributes.extend(new_kvs.into_iter()); + } + } + } +} + +/// Options that are attached to metrics on a per-call basis +#[derive(Clone, Debug, Default, derive_more::Constructor)] +pub struct MetricsAttributesOptions { + pub attributes: Vec, +} +impl MetricsAttributesOptions { + pub fn extend(&mut self, new_kvs: impl IntoIterator) { + self.attributes.extend(new_kvs.into_iter()) + } +} + +/// A K/V pair that can be used to label a specific recording of a metric +#[derive(Clone, Debug)] +pub struct MetricKeyValue { + pub key: String, + pub value: MetricValue, +} +impl MetricKeyValue { + pub fn new(key: impl Into, value: impl Into) -> Self { + Self { + key: key.into(), + value: value.into(), + } + } +} + +/// Values metric labels may assume +#[derive(Clone, Debug, derive_more::From)] +pub enum MetricValue { + String(String), + Int(i64), + Float(f64), + Bool(bool), + // can add array if needed +} +impl From<&'static str> for MetricValue { + fn from(value: &'static str) -> Self { + MetricValue::String(value.to_string()) + } +} + +pub trait Counter: Send + Sync { + fn add(&self, value: u64, attributes: &MetricAttributes); +} + +pub trait Histogram: Send + Sync { + // When referring to durations, this value is in millis + fn record(&self, value: u64, attributes: &MetricAttributes); +} + +pub trait Gauge: Send + Sync { + // When referring to durations, this value is in millis + fn record(&self, value: u64, attributes: &MetricAttributes); +} + +#[derive(Debug)] +pub struct NoOpCoreMeter; +impl CoreMeter for NoOpCoreMeter { + fn new_attributes(&self, _: MetricsAttributesOptions) -> MetricAttributes { + MetricAttributes::Lang(LangMetricAttributes { + ids: HashSet::new(), + new_attributes: vec![], + }) + } + + fn counter(&self, _: MetricParameters) -> Arc { + Arc::new(NoOpInstrument) + } + + fn histogram(&self, _: MetricParameters) -> Arc { + Arc::new(NoOpInstrument) + } + + fn gauge(&self, _: MetricParameters) -> Arc { + Arc::new(NoOpInstrument) + } +} + +pub struct NoOpInstrument; +impl Counter for NoOpInstrument { + fn add(&self, _: u64, _: &MetricAttributes) {} +} +impl Histogram for NoOpInstrument { + fn record(&self, _: u64, _: &MetricAttributes) {} +} +impl Gauge for NoOpInstrument { + fn record(&self, _: u64, _: &MetricAttributes) {} +} + +#[cfg(feature = "otel_impls")] +mod otel_impls { + use super::*; + use opentelemetry::{metrics, KeyValue}; + + impl From for KeyValue { + fn from(kv: MetricKeyValue) -> Self { + KeyValue::new(kv.key, kv.value) + } + } + + impl From for opentelemetry::Value { + fn from(mv: MetricValue) -> Self { + match mv { + MetricValue::String(s) => opentelemetry::Value::String(s.into()), + MetricValue::Int(i) => opentelemetry::Value::I64(i), + MetricValue::Float(f) => opentelemetry::Value::F64(f), + MetricValue::Bool(b) => opentelemetry::Value::Bool(b), + } + } + } + + impl Counter for metrics::Counter { + fn add(&self, value: u64, attributes: &MetricAttributes) { + if let MetricAttributes::OTel { kvs } = attributes { + self.add(value, kvs); + } else { + debug_assert!( + false, + "Must use OTel attributes with an OTel metric implementation" + ); + } + } + } + + impl Histogram for metrics::Histogram { + fn record(&self, value: u64, attributes: &MetricAttributes) { + if let MetricAttributes::OTel { kvs } = attributes { + self.record(value, kvs); + } else { + debug_assert!( + false, + "Must use OTel attributes with an OTel metric implementation" + ); + } + } + } +} diff -Nru temporalio-1.3.0/temporalio/bridge/sdk-core/core-api/src/telemetry.rs temporalio-1.3.0/temporalio/bridge/sdk-core/core-api/src/telemetry.rs --- temporalio-1.3.0/temporalio/bridge/sdk-core/core-api/src/telemetry.rs 2023-10-30 13:49:50.000000000 +0000 +++ temporalio-1.3.0/temporalio/bridge/sdk-core/core-api/src/telemetry.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,11 +1,17 @@ +pub mod metrics; + +use crate::telemetry::metrics::CoreMeter; use std::{ collections::HashMap, net::SocketAddr, + sync::Arc, time::{Duration, SystemTime, UNIX_EPOCH}, }; use tracing_core::Level; use url::Url; +pub static METRIC_PREFIX: &str = "temporal_"; + /// Each core runtime instance has a telemetry subsystem associated with it, this trait defines the /// operations that lang might want to perform on that telemetry after it's initialized. pub trait CoreTelemetry { @@ -23,32 +29,25 @@ #[derive(Debug, Clone, derive_builder::Builder)] #[non_exhaustive] pub struct TelemetryOptions { - /// Optional trace exporter - set as None to disable. - #[builder(setter(into, strip_option), default)] - pub tracing: Option, /// Optional logger - set as None to disable. #[builder(setter(into, strip_option), default)] pub logging: Option, /// Optional metrics exporter - set as None to disable. #[builder(setter(into, strip_option), default)] - pub metrics: Option, - - /// If set true, do not prefix metrics with `temporal_`. Will be removed eventually as - /// the prefix is consistent with other SDKs. - #[builder(default)] - pub no_temporal_prefix_for_metrics: bool, - - /// Specifies the aggregation temporality for metric export. Defaults to cumulative. - #[builder(default = "MetricTemporality::Cumulative")] - pub metric_temporality: MetricTemporality, - - // A map of tags to be applied to all metrics - #[builder(default)] - pub global_tags: HashMap, + pub metrics: Option>, + /// If set true (the default) explicitly attach a `service_name` label to all metrics. Turn this + /// off if your collection system supports the `target_info` metric from the OpenMetrics spec. + /// For more, see + /// [here](https://github.com/OpenObservability/OpenMetrics/blob/main/specification/OpenMetrics.md#supporting-target-metadata-in-both-push-based-and-pull-based-systems) + #[builder(default = "true")] + pub attach_service_name: bool, + /// A prefix to be applied to all core-created metrics. Defaults to "temporal_". + #[builder(default = "METRIC_PREFIX.to_string()")] + pub metric_prefix: String, } /// Options for exporting to an OpenTelemetry Collector -#[derive(Debug, Clone)] +#[derive(Debug, Clone, derive_builder::Builder)] pub struct OtelCollectorOptions { /// The url of the OTel collector to export telemetry and metrics to. Lang SDK should also /// export to this same collector. @@ -56,32 +55,30 @@ /// Optional set of HTTP headers to send to the Collector, e.g for authentication. pub headers: HashMap, /// Optionally specify how frequently metrics should be exported. Defaults to 1 second. - pub metric_periodicity: Option, -} - -/// Configuration for the external export of traces -#[derive(Debug, Clone)] -pub struct TraceExportConfig { - /// An [EnvFilter](https://docs.rs/tracing-subscriber/latest/tracing_subscriber/struct.EnvFilter.html) filter string. - pub filter: String, - /// Where they should go - pub exporter: TraceExporter, -} - -/// Control where traces are exported. -#[derive(Debug, Clone)] -pub enum TraceExporter { - /// Export traces to an OpenTelemetry Collector . - Otel(OtelCollectorOptions), + #[builder(default = "Duration::from_secs(1)")] + pub metric_periodicity: Duration, + /// Specifies the aggregation temporality for metric export. Defaults to cumulative. + #[builder(default = "MetricTemporality::Cumulative")] + pub metric_temporality: MetricTemporality, + // A map of tags to be applied to all metrics + #[builder(default)] + pub global_tags: HashMap, } -/// Control where metrics are exported -#[derive(Debug, Clone)] -pub enum MetricsExporter { - /// Export metrics to an OpenTelemetry Collector . - Otel(OtelCollectorOptions), - /// Expose metrics directly via an embedded http server bound to the provided address. - Prometheus(SocketAddr), +/// Options for exporting metrics to Prometheus +#[derive(Debug, Clone, derive_builder::Builder)] +pub struct PrometheusExporterOptions { + pub socket_addr: SocketAddr, + // A map of tags to be applied to all metrics + #[builder(default)] + pub global_tags: HashMap, + /// If set true, all counters will include a "_total" suffix + #[builder(default = "false")] + pub counters_total_suffix: bool, + /// If set true, all histograms will include the unit in their name as a suffix. + /// Ex: "_milliseconds". + #[builder(default = "false")] + pub unit_suffix: bool, } /// Control where logs go diff -Nru temporalio-1.3.0/temporalio/bridge/sdk-core/core-api/src/worker.rs temporalio-1.3.0/temporalio/bridge/sdk-core/core-api/src/worker.rs --- temporalio-1.3.0/temporalio/bridge/sdk-core/core-api/src/worker.rs 2023-10-30 13:49:50.000000000 +0000 +++ temporalio-1.3.0/temporalio/bridge/sdk-core/core-api/src/worker.rs 2023-10-30 19:40:00.000000000 +0000 @@ -115,6 +115,7 @@ #[builder(default = "5")] pub fetching_concurrency: usize, + // TODO: Move this out - dependency on tokio should not exist just for this /// If set, and the `save_wf_inputs` feature is enabled in core, will be sent a serialized /// instance of every input to workflow state in order. This is for testing purposes, SDK /// implementations never need to care about it. diff -Nru temporalio-1.3.0/temporalio/bridge/sdk-core/fsm/rustfsm_procmacro/Cargo.toml temporalio-1.3.0/temporalio/bridge/sdk-core/fsm/rustfsm_procmacro/Cargo.toml --- temporalio-1.3.0/temporalio/bridge/sdk-core/fsm/rustfsm_procmacro/Cargo.toml 2023-10-30 13:49:50.000000000 +0000 +++ temporalio-1.3.0/temporalio/bridge/sdk-core/fsm/rustfsm_procmacro/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -16,7 +16,7 @@ [dependencies] derive_more = "0.99" proc-macro2 = "1.0" -syn = { version = "1.0", features = ["default", "extra-traits"] } +syn = { version = "2.0", features = ["default", "extra-traits"] } quote = "1.0" rustfsm_trait = { version = "0.1", path = "../rustfsm_trait" } diff -Nru temporalio-1.3.0/temporalio/bridge/sdk-core/fsm/rustfsm_procmacro/src/lib.rs temporalio-1.3.0/temporalio/bridge/sdk-core/fsm/rustfsm_procmacro/src/lib.rs --- temporalio-1.3.0/temporalio/bridge/sdk-core/fsm/rustfsm_procmacro/src/lib.rs 2023-10-30 13:49:50.000000000 +0000 +++ temporalio-1.3.0/temporalio/bridge/sdk-core/fsm/rustfsm_procmacro/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -5,7 +5,6 @@ parenthesized, parse::{Parse, ParseStream, Result}, parse_macro_input, - punctuated::Punctuated, spanned::Spanned, Error, Fields, Ident, Token, Type, Variant, Visibility, }; @@ -212,8 +211,7 @@ })?; // Then the state machine definition is simply a sequence of transitions separated by // semicolons - let transitions: Punctuated = - input.parse_terminated(Transition::parse)?; + let transitions = input.parse_terminated(Transition::parse, Token![;])?; let transitions: Vec<_> = transitions.into_iter().collect(); // Check for and whine about any identical transitions. We do this here because preserving // the order transitions were defined in is important, so simply collecting to a set is diff -Nru temporalio-1.3.0/temporalio/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/no_handle_conversions_require_into_fail.stderr temporalio-1.3.0/temporalio/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/no_handle_conversions_require_into_fail.stderr --- temporalio-1.3.0/temporalio/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/no_handle_conversions_require_into_fail.stderr 2023-10-30 13:49:50.000000000 +0000 +++ temporalio-1.3.0/temporalio/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/no_handle_conversions_require_into_fail.stderr 2023-10-30 19:40:00.000000000 +0000 @@ -1,12 +1,15 @@ error[E0277]: the trait bound `One: From` is not satisfied - --> tests/trybuild/no_handle_conversions_require_into_fail.rs:11:18 - | -11 | Two --(B)--> One; - | ^^^ the trait `From` is not implemented for `One` - | - = note: required for `Two` to implement `Into` + --> tests/trybuild/no_handle_conversions_require_into_fail.rs:11:18 + | +11 | Two --(B)--> One; + | ^^^ the trait `From` is not implemented for `One` + | + = note: required for `Two` to implement `Into` note: required by a bound in `TransitionResult::::from` - --> $WORKSPACE/fsm/rustfsm_trait/src/lib.rs - | - | CurrentState: Into, - | ^^^^^^^^ required by this bound in `TransitionResult::::from` + --> $WORKSPACE/fsm/rustfsm_trait/src/lib.rs + | + | pub fn from(current_state: CurrentState) -> Self + | ---- required by a bound in this associated function + | where + | CurrentState: Into, + | ^^^^^^^^ required by this bound in `TransitionResult::::from` diff -Nru temporalio-1.3.0/temporalio/bridge/sdk-core/sdk/Cargo.toml temporalio-1.3.0/temporalio/bridge/sdk-core/sdk/Cargo.toml --- temporalio-1.3.0/temporalio/bridge/sdk-core/sdk/Cargo.toml 2023-10-30 13:49:50.000000000 +0000 +++ temporalio-1.3.0/temporalio/bridge/sdk-core/sdk/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -28,7 +28,7 @@ tokio = { version = "1.26", features = ["rt", "rt-multi-thread", "parking_lot", "time", "fs"] } tokio-util = { version = "0.7" } tokio-stream = "0.1" -tonic = "0.8" +tonic = { workspace = true } tracing = "0.1" [dependencies.temporal-sdk-core] diff -Nru temporalio-1.3.0/temporalio/bridge/sdk-core/sdk/src/lib.rs temporalio-1.3.0/temporalio/bridge/sdk-core/sdk/src/lib.rs --- temporalio-1.3.0/temporalio/bridge/sdk-core/sdk/src/lib.rs 2023-10-30 13:49:50.000000000 +0000 +++ temporalio-1.3.0/temporalio/bridge/sdk-core/sdk/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -116,7 +116,7 @@ let mut builder = ClientOptionsBuilder::default(); builder .target_url(url) - .client_name("rust-sdk".to_string()) + .client_name("temporal-rust".to_string()) .client_version(VERSION.to_string()); builder diff -Nru temporalio-1.3.0/temporalio/bridge/sdk-core/sdk/src/workflow_context.rs temporalio-1.3.0/temporalio/bridge/sdk-core/sdk/src/workflow_context.rs --- temporalio-1.3.0/temporalio/bridge/sdk-core/sdk/src/workflow_context.rs 2023-10-30 13:49:50.000000000 +0000 +++ temporalio-1.3.0/temporalio/bridge/sdk-core/sdk/src/workflow_context.rs 2023-10-30 19:40:00.000000000 +0000 @@ -249,8 +249,8 @@ /// Record that this workflow history was created with the provided patch, and it is being /// phased out. - pub fn deprecate_patch(&self, patch_id: &str) { - self.patch_impl(patch_id, true); + pub fn deprecate_patch(&self, patch_id: &str) -> bool { + self.patch_impl(patch_id, true) } fn patch_impl(&self, patch_id: &str, deprecated: bool) -> bool { diff -Nru temporalio-1.3.0/temporalio/bridge/sdk-core/sdk-core-protos/Cargo.toml temporalio-1.3.0/temporalio/bridge/sdk-core/sdk-core-protos/Cargo.toml --- temporalio-1.3.0/temporalio/bridge/sdk-core/sdk-core-protos/Cargo.toml 2023-10-30 13:49:50.000000000 +0000 +++ temporalio-1.3.0/temporalio/bridge/sdk-core/sdk-core-protos/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -25,9 +25,9 @@ serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" thiserror = "1.0" -tonic = "0.8" +tonic = { workspace = true } uuid = { version = "1.1", features = ["v4"], optional = true } [build-dependencies] -tonic-build = "0.8" +tonic-build = { workspace = true } prost-wkt-build = "0.4" diff -Nru temporalio-1.3.0/temporalio/bridge/sdk-core/tests/integ_tests/metrics_tests.rs temporalio-1.3.0/temporalio/bridge/sdk-core/tests/integ_tests/metrics_tests.rs --- temporalio-1.3.0/temporalio/bridge/sdk-core/tests/integ_tests/metrics_tests.rs 2023-10-30 13:49:50.000000000 +0000 +++ temporalio-1.3.0/temporalio/bridge/sdk-core/tests/integ_tests/metrics_tests.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,8 +1,15 @@ use assert_matches::assert_matches; -use std::{sync::Arc, time::Duration}; +use std::{net::SocketAddr, sync::Arc, time::Duration}; use temporal_client::{WorkflowClientTrait, WorkflowOptions, WorkflowService}; -use temporal_sdk_core::{init_worker, CoreRuntime}; -use temporal_sdk_core_api::{telemetry::MetricsExporter, worker::WorkerConfigBuilder, Worker}; +use temporal_sdk_core::{init_worker, telemetry::start_prometheus_metric_exporter, CoreRuntime}; +use temporal_sdk_core_api::{ + telemetry::{ + metrics::{CoreMeter, MetricAttributes, MetricParameters}, + PrometheusExporterOptionsBuilder, TelemetryOptions, + }, + worker::WorkerConfigBuilder, + Worker, +}; use temporal_sdk_core_protos::{ coresdk::{ activity_result::ActivityExecutionResult, @@ -23,7 +30,7 @@ use temporal_sdk_core_test_utils::{ get_integ_server_options, get_integ_telem_options, CoreWfStarter, NAMESPACE, }; -use tokio::{join, sync::Barrier}; +use tokio::{join, sync::Barrier, task::AbortHandle}; static ANY_PORT: &str = "127.0.0.1:0"; @@ -31,15 +38,41 @@ reqwest::get(endpoint).await.unwrap().text().await.unwrap() } +struct AbortOnDrop { + ah: AbortHandle, +} +impl Drop for AbortOnDrop { + fn drop(&mut self) { + self.ah.abort(); + } +} + +fn prom_metrics() -> (TelemetryOptions, SocketAddr, AbortOnDrop) { + let mut telemopts = get_integ_telem_options(); + let prom_info = start_prometheus_metric_exporter( + PrometheusExporterOptionsBuilder::default() + .socket_addr(ANY_PORT.parse().unwrap()) + .build() + .unwrap(), + ) + .unwrap(); + telemopts.metrics = Some(prom_info.meter as Arc); + ( + telemopts, + prom_info.bound_addr, + AbortOnDrop { + ah: prom_info.abort_handle, + }, + ) +} + #[tokio::test] async fn prometheus_metrics_exported() { - let mut telemopts = get_integ_telem_options(); - telemopts.metrics = Some(MetricsExporter::Prometheus(ANY_PORT.parse().unwrap())); + let (telemopts, addr, _aborter) = prom_metrics(); let rt = CoreRuntime::new_assume_tokio(telemopts).unwrap(); - let addr = rt.telemetry().prom_port().unwrap(); let opts = get_integ_server_options(); let mut raw_client = opts - .connect_no_namespace(rt.metric_meter().as_deref(), None) + .connect_no_namespace(rt.telemetry().get_temporal_metric_meter(), None) .await .unwrap(); assert!(raw_client.get_client().capabilities().is_some()); @@ -56,15 +89,26 @@ assert!(body.contains( "temporal_request_latency_count{operation=\"GetSystemInfo\",service_name=\"temporal-core-sdk\"} 1" )); + // Verify counter names are appropriate (don't end w/ '_total') + assert!(body.contains("temporal_request{")); + // Verify non-temporal metrics meter does not prefix + let mm = rt.telemetry().get_metric_meter().unwrap(); + let g = mm.inner.gauge(MetricParameters::from("mygauge")); + g.record( + 42, + &MetricAttributes::OTel { + kvs: Arc::new(vec![]), + }, + ); + let body = get_text(format!("http://{addr}/metrics")).await; + assert!(body.contains("\nmygauge 42")); } #[tokio::test] async fn one_slot_worker_reports_available_slot() { - let mut telemopts = get_integ_telem_options(); + let (telemopts, addr, _aborter) = prom_metrics(); let tq = "one_slot_worker_tq"; - telemopts.metrics = Some(MetricsExporter::Prometheus(ANY_PORT.parse().unwrap())); let rt = CoreRuntime::new_assume_tokio(telemopts).unwrap(); - let addr = rt.telemetry().prom_port().unwrap(); let worker_cfg = WorkerConfigBuilder::default() .namespace(NAMESPACE) @@ -161,6 +205,16 @@ service_name=\"temporal-core-sdk\",task_queue=\"one_slot_worker_tq\",\ worker_type=\"WorkflowWorker\"}} 2" ))); + assert!(body.contains(&format!( + "temporal_worker_task_slots_available{{namespace=\"{NAMESPACE}\",\ + service_name=\"temporal-core-sdk\",task_queue=\"one_slot_worker_tq\",\ + worker_type=\"ActivityWorker\"}} 1" + ))); + assert!(body.contains(&format!( + "temporal_worker_task_slots_available{{namespace=\"{NAMESPACE}\",\ + service_name=\"temporal-core-sdk\",task_queue=\"one_slot_worker_tq\",\ + worker_type=\"LocalActivityWorker\"}} 1" + ))); // Start a workflow so that a task will get delivered client @@ -182,7 +236,7 @@ wf_task_barr.wait().await; // At this point the workflow task is outstanding, so there should be 0 slots, and - // the activities haven't started, so there should be 1 each. + // the activities haven't started, so there should still be 1 each. let body = get_text(format!("http://{addr}/metrics")).await; assert!(body.contains(&format!( "temporal_worker_task_slots_available{{namespace=\"{NAMESPACE}\",\ @@ -264,10 +318,8 @@ )] completion: workflow_command::Variant, ) { - let mut telemopts = get_integ_telem_options(); - telemopts.metrics = Some(MetricsExporter::Prometheus(ANY_PORT.parse().unwrap())); + let (telemopts, addr, _aborter) = prom_metrics(); let rt = CoreRuntime::new_assume_tokio(telemopts).unwrap(); - let addr = rt.telemetry().prom_port().unwrap(); let mut starter = CoreWfStarter::new_with_runtime("query_of_closed_workflow_doesnt_tick_terminal_metric", rt); // Disable cache to ensure replay happens completely @@ -275,7 +327,22 @@ let worker = starter.get_worker().await; let run_id = starter.start_wf().await; let task = worker.poll_workflow_activation().await.unwrap(); + // Fail wf task + worker + .complete_workflow_activation(WorkflowActivationCompletion::fail( + task.run_id, + "whatever".into(), + )) + .await + .unwrap(); + // Handle cache eviction + let task = worker.poll_workflow_activation().await.unwrap(); + worker + .complete_workflow_activation(WorkflowActivationCompletion::empty(task.run_id)) + .await + .unwrap(); // Immediately complete the workflow + let task = worker.poll_workflow_activation().await.unwrap(); worker .complete_workflow_activation(WorkflowActivationCompletion::from_cmd( task.run_id, @@ -370,3 +437,31 @@ .expect("Must find matching metric"); assert!(matching_line.ends_with('1')); } + +#[test] +fn runtime_new() { + let mut rt = CoreRuntime::new( + get_integ_telem_options(), + tokio::runtime::Builder::new_multi_thread(), + ) + .unwrap(); + let handle = rt.tokio_handle(); + let _rt = handle.enter(); + let (telemopts, addr, _aborter) = prom_metrics(); + rt.telemetry_mut() + .attach_late_init_metrics(telemopts.metrics.unwrap()); + let opts = get_integ_server_options(); + handle.block_on(async { + let mut raw_client = opts + .connect_no_namespace(rt.telemetry().get_temporal_metric_meter(), None) + .await + .unwrap(); + assert!(raw_client.get_client().capabilities().is_some()); + let _ = raw_client + .list_namespaces(ListNamespacesRequest::default()) + .await + .unwrap(); + let body = get_text(format!("http://{addr}/metrics")).await; + assert!(body.contains("temporal_request")); + }); +} diff -Nru temporalio-1.3.0/temporalio/bridge/sdk-core/tests/integ_tests/workflow_tests/child_workflows.rs temporalio-1.3.0/temporalio/bridge/sdk-core/tests/integ_tests/workflow_tests/child_workflows.rs --- temporalio-1.3.0/temporalio/bridge/sdk-core/tests/integ_tests/workflow_tests/child_workflows.rs 2023-10-30 13:49:50.000000000 +0000 +++ temporalio-1.3.0/temporalio/bridge/sdk-core/tests/integ_tests/workflow_tests/child_workflows.rs 2023-10-30 19:40:00.000000000 +0000 @@ -125,3 +125,69 @@ }; tokio::join!(canceller, runner); } + +#[tokio::test] +async fn abandoned_child_resolves_post_cancel() { + let mut starter = CoreWfStarter::new("child-workflow-resolves-post-cancel"); + starter.no_remote_activities(); + let mut worker = starter.worker().await; + let barr: &'static Barrier = Box::leak(Box::new(Barrier::new(2))); + + worker.register_wf( + PARENT_WF_TYPE.to_string(), + move |mut ctx: WfContext| async move { + let child = ctx.child_workflow(ChildWorkflowOptions { + workflow_id: "abandoned-child-resolve-post-cancel".to_owned(), + workflow_type: CHILD_WF_TYPE.to_owned(), + parent_close_policy: ParentClosePolicy::Abandon, + cancel_type: ChildWorkflowCancellationType::Abandon, + ..Default::default() + }); + + let started = child + .start(&ctx) + .await + .into_started() + .expect("Child chould start OK"); + barr.wait().await; + // Wait for cancel signal + ctx.cancelled().await; + // Cancel the child immediately + started.cancel(&ctx); + // Need to do something else, so we will see the child completing + ctx.timer(Duration::from_secs(1)).await; + started.result().await; + Ok(().into()) + }, + ); + worker.register_wf(CHILD_WF_TYPE.to_string(), |_: WfContext| async move { + Ok("I'm done".into()) + }); + + worker + .submit_wf( + "parent-abandoner-resolving".to_string(), + PARENT_WF_TYPE.to_owned(), + vec![], + WorkflowOptions::default(), + ) + .await + .unwrap(); + let client = starter.get_client().await; + let canceller = async { + barr.wait().await; + client + .cancel_workflow_execution( + "parent-abandoner-resolving".to_string(), + None, + "die".to_string(), + None, + ) + .await + .unwrap(); + }; + let runner = async move { + worker.run_until_done().await.unwrap(); + }; + tokio::join!(canceller, runner); +} diff -Nru temporalio-1.3.0/temporalio/bridge/sdk-core/tests/integ_tests/workflow_tests/patches.rs temporalio-1.3.0/temporalio/bridge/sdk-core/tests/integ_tests/workflow_tests/patches.rs --- temporalio-1.3.0/temporalio/bridge/sdk-core/tests/integ_tests/workflow_tests/patches.rs 2023-10-30 13:49:50.000000000 +0000 +++ temporalio-1.3.0/temporalio/bridge/sdk-core/tests/integ_tests/workflow_tests/patches.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,5 +1,8 @@ use std::{ - sync::atomic::{AtomicBool, Ordering}, + sync::{ + atomic::{AtomicBool, Ordering}, + Arc, + }, time::Duration, }; @@ -115,5 +118,36 @@ }); starter.start_with_worker(wf_name, &mut worker).await; + worker.run_until_done().await.unwrap(); +} + +#[tokio::test] +async fn can_remove_deprecated_patch_near_other_patch() { + let wf_name = "can_add_change_markers"; + let mut starter = CoreWfStarter::new(wf_name); + starter.no_remote_activities(); + let mut worker = starter.worker().await; + let did_die = Arc::new(AtomicBool::new(false)); + worker.register_wf(wf_name.to_owned(), move |ctx: WfContext| { + let did_die = did_die.clone(); + async move { + ctx.timer(Duration::from_millis(200)).await; + if !did_die.load(Ordering::Acquire) { + assert!(ctx.deprecate_patch("getting-deprecated")); + assert!(ctx.patched("staying")); + } else { + assert!(ctx.patched("staying")); + } + ctx.timer(Duration::from_millis(200)).await; + + if !did_die.load(Ordering::Acquire) { + did_die.store(true, Ordering::Release); + ctx.force_task_fail(anyhow::anyhow!("i'm ded")); + } + Ok(().into()) + } + }); + + starter.start_with_worker(wf_name, &mut worker).await; worker.run_until_done().await.unwrap(); } diff -Nru temporalio-1.3.0/temporalio/bridge/sdk-core/tests/main.rs temporalio-1.3.0/temporalio/bridge/sdk-core/tests/main.rs --- temporalio-1.3.0/temporalio/bridge/sdk-core/tests/main.rs 2023-10-30 13:49:50.000000000 +0000 +++ temporalio-1.3.0/temporalio/bridge/sdk-core/tests/main.rs 2023-10-30 19:40:00.000000000 +0000 @@ -37,7 +37,7 @@ let opts = get_integ_server_options(); let runtime = CoreRuntime::new_assume_tokio(get_integ_telem_options()).unwrap(); let mut retrying_client = opts - .connect_no_namespace(runtime.metric_meter().as_deref(), None) + .connect_no_namespace(runtime.telemetry().get_temporal_metric_meter(), None) .await .unwrap(); diff -Nru temporalio-1.3.0/temporalio/bridge/sdk-core/test-utils/src/lib.rs temporalio-1.3.0/temporalio/bridge/sdk-core/test-utils/src/lib.rs --- temporalio-1.3.0/temporalio/bridge/sdk-core/test-utils/src/lib.rs 2023-10-30 13:49:50.000000000 +0000 +++ temporalio-1.3.0/temporalio/bridge/sdk-core/test-utils/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -33,13 +33,14 @@ ephemeral_server::{EphemeralExe, EphemeralExeVersion}, init_replay_worker, init_worker, replay::HistoryForReplay, + telemetry::{build_otlp_metric_exporter, start_prometheus_metric_exporter}, ClientOptions, ClientOptionsBuilder, CoreRuntime, WorkerConfigBuilder, }; use temporal_sdk_core_api::{ errors::{PollActivityError, PollWfError}, telemetry::{ - Logger, MetricsExporter, OtelCollectorOptions, TelemetryOptions, TelemetryOptionsBuilder, - TraceExportConfig, TraceExporter, + metrics::CoreMeter, Logger, OtelCollectorOptionsBuilder, PrometheusExporterOptionsBuilder, + TelemetryOptions, TelemetryOptionsBuilder, }, Worker as CoreWorker, }; @@ -145,7 +146,7 @@ let telemetry_options = get_integ_telem_options(); let rt = CoreRuntime::new_assume_tokio(telemetry_options).expect("Core runtime inits cleanly"); - let _ = tracing::subscriber::set_global_default(rt.trace_subscriber()); + let _ = tracing::subscriber::set_global_default(rt.telemetry().trace_subscriber()); rt }); } @@ -585,22 +586,24 @@ .ok() .map(|x| x.parse::().unwrap()) { - let opts = OtelCollectorOptions { - url, - headers: Default::default(), - metric_periodicity: None, - }; - ob.tracing(TraceExportConfig { - filter: filter_string.clone(), - exporter: TraceExporter::Otel(opts.clone()), - }); - ob.metrics(MetricsExporter::Otel(opts)); + let opts = OtelCollectorOptionsBuilder::default() + .url(url) + .build() + .unwrap(); + ob.metrics(Arc::new(build_otlp_metric_exporter(opts).unwrap()) as Arc); } if let Some(addr) = env::var(PROM_ENABLE_ENV_VAR) .ok() .map(|x| SocketAddr::new([127, 0, 0, 1].into(), x.parse().unwrap())) { - ob.metrics(MetricsExporter::Prometheus(addr)); + let prom_info = start_prometheus_metric_exporter( + PrometheusExporterOptionsBuilder::default() + .socket_addr(addr) + .build() + .unwrap(), + ) + .unwrap(); + ob.metrics(prom_info.meter as Arc); } ob.logging(Logger::Console { filter: filter_string, diff -Nru temporalio-1.3.0/temporalio/bridge/src/client.rs temporalio-1.3.0/temporalio/bridge/src/client.rs --- temporalio-1.3.0/temporalio/bridge/src/client.rs 2023-10-30 13:49:41.000000000 +0000 +++ temporalio-1.3.0/temporalio/bridge/src/client.rs 2023-10-30 19:40:00.000000000 +0000 @@ -78,7 +78,10 @@ runtime_ref.runtime.future_into_py(py, async move { Ok(ClientRef { retry_client: opts - .connect_no_namespace(runtime.core.metric_meter().as_deref(), headers) + .connect_no_namespace( + runtime.core.telemetry().get_temporal_metric_meter(), + headers, + ) .await .map_err(|err| { PyRuntimeError::new_err(format!("Failed client connect: {}", err)) diff -Nru temporalio-1.3.0/temporalio/bridge/src/runtime.rs temporalio-1.3.0/temporalio/bridge/src/runtime.rs --- temporalio-1.3.0/temporalio/bridge/src/runtime.rs 2023-10-30 13:49:41.000000000 +0000 +++ temporalio-1.3.0/temporalio/bridge/src/runtime.rs 2023-10-30 19:40:00.000000000 +0000 @@ -8,10 +8,12 @@ use std::str::FromStr; use std::sync::Arc; use std::time::Duration; +use temporal_sdk_core::telemetry::{build_otlp_metric_exporter, start_prometheus_metric_exporter}; use temporal_sdk_core::CoreRuntime; +use temporal_sdk_core_api::telemetry::metrics::CoreMeter; use temporal_sdk_core_api::telemetry::{ - Logger, MetricsExporter, OtelCollectorOptions, TelemetryOptions, TelemetryOptionsBuilder, - TraceExportConfig, TraceExporter, + Logger, MetricTemporality, OtelCollectorOptionsBuilder, PrometheusExporterOptionsBuilder, + TelemetryOptions, TelemetryOptionsBuilder, }; use url::Url; @@ -27,16 +29,8 @@ #[derive(FromPyObject)] pub struct TelemetryConfig { - tracing: Option, logging: Option, metrics: Option, - global_tags: Option> -} - -#[derive(FromPyObject)] -pub struct TracingConfig { - filter: String, - opentelemetry: OpenTelemetryConfig, } #[derive(FromPyObject)] @@ -49,6 +43,9 @@ pub struct MetricsConfig { opentelemetry: Option, prometheus: Option, + attach_service_name: bool, + global_tags: Option>, + metric_prefix: Option, } #[derive(FromPyObject)] @@ -56,25 +53,34 @@ url: String, headers: HashMap, metric_periodicity_millis: Option, + metric_temporality_delta: bool, } #[derive(FromPyObject)] pub struct PrometheusConfig { bind_address: String, + counters_total_suffix: bool, + unit_suffix: bool, } pub fn init_runtime(telemetry_config: TelemetryConfig) -> PyResult { + let mut core = CoreRuntime::new( + // We don't move telemetry config here because we need it for + // late-binding metrics + (&telemetry_config).try_into()?, + tokio::runtime::Builder::new_multi_thread(), + ) + .map_err(|err| PyRuntimeError::new_err(format!("Failed initializing telemetry: {}", err)))?; + // We late-bind the metrics after core runtime is created since it needs + // the Tokio handle + if let Some(metrics_conf) = telemetry_config.metrics { + let _guard = core.tokio_handle().enter(); + core.telemetry_mut() + .attach_late_init_metrics(metrics_conf.try_into()?); + } Ok(RuntimeRef { runtime: Runtime { - core: Arc::new( - CoreRuntime::new( - telemetry_config.try_into()?, - tokio::runtime::Builder::new_multi_thread(), - ) - .map_err(|err| { - PyRuntimeError::new_err(format!("Failed initializing telemetry: {}", err)) - })?, - ), + core: Arc::new(core), }, }) } @@ -94,44 +100,28 @@ } } -impl TryFrom for TelemetryOptions { +impl TryFrom<&TelemetryConfig> for TelemetryOptions { type Error = PyErr; - fn try_from(conf: TelemetryConfig) -> PyResult { + fn try_from(conf: &TelemetryConfig) -> PyResult { let mut build = TelemetryOptionsBuilder::default(); - if let Some(v) = conf.tracing { - build.tracing(TraceExportConfig { - filter: v.filter, - exporter: TraceExporter::Otel(v.opentelemetry.try_into()?), - }); - } - if let Some(v) = conf.logging { - build.logging(if v.forward { - Logger::Forward { filter: v.filter } - } else { - Logger::Console { filter: v.filter } - }); - } - if let Some(v) = conf.metrics { - build.metrics(if let Some(t) = v.opentelemetry { - if v.prometheus.is_some() { - return Err(PyValueError::new_err( - "Cannot have OpenTelemetry and Prometheus metrics", - )); + if let Some(logging_conf) = &conf.logging { + build.logging(if logging_conf.forward { + Logger::Forward { + filter: logging_conf.filter.to_string(), } - MetricsExporter::Otel(t.try_into()?) - } else if let Some(t) = v.prometheus { - MetricsExporter::Prometheus(SocketAddr::from_str(&t.bind_address).map_err( - |err| PyValueError::new_err(format!("Invalid Prometheus address: {}", err)), - )?) } else { - return Err(PyValueError::new_err( - "Either OpenTelemetry or Prometheus config must be provided", - )); + Logger::Console { + filter: logging_conf.filter.to_string(), + } }); } - if let Some(v) = conf.global_tags { - build.global_tags(v); + if let Some(metrics_conf) = &conf.metrics { + // Note, actual metrics instance is late-bound in init_runtime + build.attach_service_name(metrics_conf.attach_service_name); + if let Some(prefix) = &metrics_conf.metric_prefix { + build.metric_prefix(prefix.to_string()); + } } build .build() @@ -139,16 +129,68 @@ } } -impl TryFrom for OtelCollectorOptions { +impl TryFrom for Arc { type Error = PyErr; - fn try_from(conf: OpenTelemetryConfig) -> PyResult { - Ok(OtelCollectorOptions { - url: Url::parse(&conf.url) - .map_err(|err| PyValueError::new_err(format!("Invalid OTel URL: {}", err)))?, - headers: conf.headers, - metric_periodicity: conf.metric_periodicity_millis.map(Duration::from_millis), - }) + fn try_from(conf: MetricsConfig) -> PyResult { + if let Some(otel_conf) = conf.opentelemetry { + if !conf.prometheus.is_none() { + return Err(PyValueError::new_err( + "Cannot have OpenTelemetry and Prometheus metrics", + )); + } + + // Build OTel exporter + let mut build = OtelCollectorOptionsBuilder::default(); + build + .url( + Url::parse(&otel_conf.url).map_err(|err| { + PyValueError::new_err(format!("Invalid OTel URL: {}", err)) + })?, + ) + .headers(otel_conf.headers); + if let Some(period) = otel_conf.metric_periodicity_millis { + build.metric_periodicity(Duration::from_millis(period)); + } + if otel_conf.metric_temporality_delta { + build.metric_temporality(MetricTemporality::Delta); + } + if let Some(global_tags) = conf.global_tags { + build.global_tags(global_tags); + } + let otel_options = build + .build() + .map_err(|err| PyValueError::new_err(format!("Invalid OTel config: {}", err)))?; + Ok(Arc::new(build_otlp_metric_exporter(otel_options).map_err( + |err| PyValueError::new_err(format!("Failed building OTel exporter: {}", err)), + )?)) + } else if let Some(prom_conf) = conf.prometheus { + // Start prom exporter + let mut build = PrometheusExporterOptionsBuilder::default(); + build + .socket_addr( + SocketAddr::from_str(&prom_conf.bind_address).map_err(|err| { + PyValueError::new_err(format!("Invalid Prometheus address: {}", err)) + })?, + ) + .counters_total_suffix(prom_conf.counters_total_suffix) + .unit_suffix(prom_conf.unit_suffix); + if let Some(global_tags) = conf.global_tags { + build.global_tags(global_tags); + } + let prom_options = build.build().map_err(|err| { + PyValueError::new_err(format!("Invalid Prometheus config: {}", err)) + })?; + Ok(start_prometheus_metric_exporter(prom_options) + .map_err(|err| { + PyValueError::new_err(format!("Failed starting Prometheus exporter: {}", err)) + })? + .meter) + } else { + Err(PyValueError::new_err( + "Either OpenTelemetry or Prometheus config must be provided", + )) + } } } diff -Nru temporalio-1.3.0/temporalio/bridge/src/worker.rs temporalio-1.3.0/temporalio/bridge/src/worker.rs --- temporalio-1.3.0/temporalio/bridge/src/worker.rs 2023-10-30 13:49:41.000000000 +0000 +++ temporalio-1.3.0/temporalio/bridge/src/worker.rs 2023-10-30 19:40:00.000000000 +0000 @@ -50,7 +50,7 @@ macro_rules! enter_sync { ($runtime:expr) => { temporal_sdk_core::telemetry::set_trace_subscriber_for_current_thread( - $runtime.core.trace_subscriber(), + $runtime.core.telemetry().trace_subscriber(), ); let _guard = $runtime.core.tokio_handle().enter(); }; diff -Nru temporalio-1.3.0/temporalio/contrib/opentelemetry.py temporalio-1.3.0/temporalio/contrib/opentelemetry.py --- temporalio-1.3.0/temporalio/contrib/opentelemetry.py 2023-10-30 13:49:41.000000000 +0000 +++ temporalio-1.3.0/temporalio/contrib/opentelemetry.py 2023-10-30 19:40:00.000000000 +0000 @@ -158,8 +158,9 @@ *, attributes: opentelemetry.util.types.Attributes, input: Optional[_InputWithHeaders] = None, + kind: opentelemetry.trace.SpanKind, ) -> Iterator[None]: - with self.tracer.start_as_current_span(name, attributes=attributes): + with self.tracer.start_as_current_span(name, attributes=attributes, kind=kind): if input: input.headers = self._context_to_headers(input.headers) yield None @@ -190,6 +191,7 @@ attributes=params.attributes, links=links, start_time=params.time_ns, + kind=params.kind, ) context = opentelemetry.trace.set_span_in_context(span, context) if params.exception: @@ -218,6 +220,7 @@ f"{prefix}:{input.workflow}", attributes={"temporalWorkflowID": input.id}, input=input, + kind=opentelemetry.trace.SpanKind.CLIENT, ): return await super().start_workflow(input) @@ -226,6 +229,7 @@ f"QueryWorkflow:{input.query}", attributes={"temporalWorkflowID": input.id}, input=input, + kind=opentelemetry.trace.SpanKind.CLIENT, ): return await super().query_workflow(input) @@ -236,6 +240,7 @@ f"SignalWorkflow:{input.signal}", attributes={"temporalWorkflowID": input.id}, input=input, + kind=opentelemetry.trace.SpanKind.CLIENT, ): return await super().signal_workflow(input) @@ -261,6 +266,7 @@ "temporalRunID": info.workflow_run_id, "temporalActivityID": info.activity_id, }, + kind=opentelemetry.trace.SpanKind.SERVER, ): return await super().execute_activity(input) @@ -283,6 +289,7 @@ time_ns: int link_context: Optional[_CarrierDict] exception: Optional[Exception] + kind: opentelemetry.trace.SpanKind _interceptor_context_key = opentelemetry.context.create_key( @@ -334,8 +341,10 @@ :py:meth:`temporalio.worker.WorkflowInboundInterceptor.execute_workflow`. """ with self._top_level_workflow_context(success_is_complete=True): + # Entrypoint of workflow should be `server` in OTel self._completed_span( - f"RunWorkflow:{temporalio.workflow.info().workflow_type}" + f"RunWorkflow:{temporalio.workflow.info().workflow_type}", + kind=opentelemetry.trace.SpanKind.SERVER, ) return await super().execute_workflow(input) @@ -355,6 +364,7 @@ self._completed_span( f"HandleSignal:{input.signal}", link_context_carrier=link_context_carrier, + kind=opentelemetry.trace.SpanKind.SERVER, ) await super().handle_signal(input) @@ -388,6 +398,7 @@ link_context_carrier=link_context_carrier, # Create even on replay for queries new_span_even_on_replay=True, + kind=opentelemetry.trace.SpanKind.SERVER, ) return await super().handle_query(input) finally: @@ -437,6 +448,7 @@ self._completed_span( f"CompleteWorkflow:{temporalio.workflow.info().workflow_type}", exception=exception, + kind=opentelemetry.trace.SpanKind.INTERNAL, ) opentelemetry.context.detach(token) @@ -468,6 +480,7 @@ new_span_even_on_replay: bool = False, additional_attributes: opentelemetry.util.types.Attributes = None, exception: Optional[Exception] = None, + kind: opentelemetry.trace.SpanKind = opentelemetry.trace.SpanKind.INTERNAL, ) -> None: # If there is no span on the context, we do not create a span if opentelemetry.trace.get_current_span() is opentelemetry.trace.INVALID_SPAN: @@ -499,6 +512,7 @@ time_ns=temporalio.workflow.time_ns(), link_context=link_context_carrier, exception=exception, + kind=kind, ) ) @@ -535,7 +549,9 @@ ) -> None: # Create new span and put on outbound input self.root._completed_span( - f"SignalChildWorkflow:{input.signal}", add_to_outbound=input + f"SignalChildWorkflow:{input.signal}", + add_to_outbound=input, + kind=opentelemetry.trace.SpanKind.SERVER, ) await super().signal_child_workflow(input) @@ -544,7 +560,9 @@ ) -> None: # Create new span and put on outbound input self.root._completed_span( - f"SignalExternalWorkflow:{input.signal}", add_to_outbound=input + f"SignalExternalWorkflow:{input.signal}", + add_to_outbound=input, + kind=opentelemetry.trace.SpanKind.CLIENT, ) await super().signal_external_workflow(input) @@ -553,7 +571,9 @@ ) -> temporalio.workflow.ActivityHandle: # Create new span and put on outbound input self.root._completed_span( - f"StartActivity:{input.activity}", add_to_outbound=input + f"StartActivity:{input.activity}", + add_to_outbound=input, + kind=opentelemetry.trace.SpanKind.CLIENT, ) return super().start_activity(input) @@ -562,7 +582,9 @@ ) -> temporalio.workflow.ChildWorkflowHandle: # Create new span and put on outbound input self.root._completed_span( - f"StartChildWorkflow:{input.workflow}", add_to_outbound=input + f"StartChildWorkflow:{input.workflow}", + add_to_outbound=input, + kind=opentelemetry.trace.SpanKind.CLIENT, ) return await super().start_child_workflow(input) @@ -571,7 +593,9 @@ ) -> temporalio.workflow.ActivityHandle: # Create new span and put on outbound input self.root._completed_span( - f"StartActivity:{input.activity}", add_to_outbound=input + f"StartActivity:{input.activity}", + add_to_outbound=input, + kind=opentelemetry.trace.SpanKind.CLIENT, ) return super().start_local_activity(input) diff -Nru temporalio-1.3.0/temporalio/converter.py temporalio-1.3.0/temporalio/converter.py --- temporalio-1.3.0/temporalio/converter.py 2023-10-30 13:49:41.000000000 +0000 +++ temporalio-1.3.0/temporalio/converter.py 2023-10-30 19:40:00.000000000 +0000 @@ -388,6 +388,16 @@ class JSONProtoPayloadConverter(EncodingPayloadConverter): """Converter for 'json/protobuf' payloads supporting protobuf Message values.""" + def __init__(self, ignore_unknown_fields: bool = False): + """Initialize a JSON proto converter. + + Args: + ignore_unknown_fields: Determines whether converter should error if + unknown fields are detected + """ + super().__init__() + self._ignore_unknown_fields = ignore_unknown_fields + @property def encoding(self) -> str: """See base class.""" @@ -424,7 +434,11 @@ message_type = payload.metadata.get("messageType", b"").decode() try: value = _sym_db.GetSymbol(message_type)() - return google.protobuf.json_format.Parse(payload.data, value) + return google.protobuf.json_format.Parse( + payload.data, + value, + ignore_unknown_fields=self._ignore_unknown_fields, + ) except KeyError as err: raise RuntimeError(f"Unknown Protobuf type {message_type}") from err except google.protobuf.json_format.ParseError as err: diff -Nru temporalio-1.3.0/temporalio/runtime.py temporalio-1.3.0/temporalio/runtime.py --- temporalio-1.3.0/temporalio/runtime.py 2023-10-30 13:49:41.000000000 +0000 +++ temporalio-1.3.0/temporalio/runtime.py 2023-10-30 19:40:00.000000000 +0000 @@ -7,6 +7,7 @@ from dataclasses import dataclass, field from datetime import timedelta +from enum import Enum from typing import ClassVar, Mapping, Optional, Union import temporalio.bridge.runtime @@ -87,25 +88,6 @@ @dataclass(frozen=True) -class TracingConfig: - """Configuration for runtime tracing.""" - - filter: Union[TelemetryFilter, str] - """Filter for tracing. Can use :py:class:`TelemetryFilter` or raw string.""" - - opentelemetry: OpenTelemetryConfig - """Configuration for OpenTelemetry tracing collector.""" - - def _to_bridge_config(self) -> temporalio.bridge.runtime.TracingConfig: - return temporalio.bridge.runtime.TracingConfig( - filter=self.filter - if isinstance(self.filter, str) - else self.filter.formatted(), - opentelemetry=self.opentelemetry._to_bridge_config(), - ) - - -@dataclass(frozen=True) class LoggingConfig: """Configuration for runtime logging.""" @@ -132,6 +114,13 @@ ) +class OpenTelemetryMetricTemporality(Enum): + """Temporality for OpenTelemetry metrics.""" + + CUMULATIVE = 1 + DELTA = 2 + + @dataclass(frozen=True) class OpenTelemetryConfig: """Configuration for OpenTelemetry collector.""" @@ -139,6 +128,9 @@ url: str headers: Optional[Mapping[str, str]] = None metric_periodicity: Optional[timedelta] = None + metric_temporality: OpenTelemetryMetricTemporality = ( + OpenTelemetryMetricTemporality.CUMULATIVE + ) def _to_bridge_config(self) -> temporalio.bridge.runtime.OpenTelemetryConfig: return temporalio.bridge.runtime.OpenTelemetryConfig( @@ -147,6 +139,8 @@ metric_periodicity_millis=None if not self.metric_periodicity else round(self.metric_periodicity.total_seconds() * 1000), + metric_temporality_delta=self.metric_temporality + == OpenTelemetryMetricTemporality.DELTA, ) @@ -155,10 +149,14 @@ """Configuration for Prometheus metrics endpoint.""" bind_address: str + counters_total_suffix: bool = False + unit_suffix: bool = False def _to_bridge_config(self) -> temporalio.bridge.runtime.PrometheusConfig: return temporalio.bridge.runtime.PrometheusConfig( - bind_address=self.bind_address + bind_address=self.bind_address, + counters_total_suffix=self.counters_total_suffix, + unit_suffix=self.unit_suffix, ) @@ -166,9 +164,6 @@ class TelemetryConfig: """Configuration for Core telemetry.""" - tracing: Optional[TracingConfig] = None - """Tracing configuration.""" - logging: Optional[LoggingConfig] = LoggingConfig.default """Logging configuration.""" @@ -176,11 +171,17 @@ """Metrics configuration.""" global_tags: Mapping[str, str] = field(default_factory=dict) - """OTel resource tags to be applied to all metrics and traces""" + """OTel resource tags to be applied to all metrics.""" + + attach_service_name: bool = True + """Whether to put the service_name on every metric.""" + + metric_prefix: Optional[str] = None + """Prefix to put on every Temporal metric. If unset, defaults to + ``temporal_``.""" def _to_bridge_config(self) -> temporalio.bridge.runtime.TelemetryConfig: return temporalio.bridge.runtime.TelemetryConfig( - tracing=None if not self.tracing else self.tracing._to_bridge_config(), logging=None if not self.logging else self.logging._to_bridge_config(), metrics=None if not self.metrics @@ -191,6 +192,8 @@ prometheus=None if not isinstance(self.metrics, PrometheusConfig) else self.metrics._to_bridge_config(), + attach_service_name=self.attach_service_name, + global_tags=self.global_tags or None, + metric_prefix=self.metric_prefix, ), - global_tags=self.global_tags, ) diff -Nru temporalio-1.3.0/temporalio/testing/_workflow.py temporalio-1.3.0/temporalio/testing/_workflow.py --- temporalio-1.3.0/temporalio/testing/_workflow.py 2023-10-30 13:49:41.000000000 +0000 +++ temporalio-1.3.0/temporalio/testing/_workflow.py 2023-10-30 19:40:00.000000000 +0000 @@ -562,5 +562,5 @@ config = client.config() config_interceptors = list(config["interceptors"]) config_interceptors.extend(interceptors) - config["interceptors"] = interceptors + config["interceptors"] = config_interceptors return temporalio.client.Client(**config) diff -Nru temporalio-1.3.0/temporalio/worker/_activity.py temporalio-1.3.0/temporalio/worker/_activity.py --- temporalio-1.3.0/temporalio/worker/_activity.py 2023-10-30 13:49:41.000000000 +0000 +++ temporalio-1.3.0/temporalio/worker/_activity.py 2023-10-30 19:40:00.000000000 +0000 @@ -195,6 +195,13 @@ except temporalio.bridge.worker.PollShutdownError: return + # Only call this after run()/drain_poll_queue() have returned. This will not + # raise an exception. + async def wait_all_completed(self) -> None: + running_tasks = [v.task for v in self._running_activities.values() if v.task] + if running_tasks: + await asyncio.gather(*running_tasks, return_exceptions=False) + def _cancel( self, task_token: bytes, cancel: temporalio.bridge.proto.activity_task.Cancel ) -> None: diff -Nru temporalio-1.3.0/temporalio/worker/_worker.py temporalio-1.3.0/temporalio/worker/_worker.py --- temporalio-1.3.0/temporalio/worker/_worker.py 2023-10-30 13:49:41.000000000 +0000 +++ temporalio-1.3.0/temporalio/worker/_worker.py 2023-10-30 19:40:00.000000000 +0000 @@ -467,6 +467,13 @@ for task in tasks: task.cancel() + # If there's an activity worker, we have to let all activity completions + # finish. We cannot guarantee that because poll shutdown completed + # (which means activities completed) that they got flushed to the + # server. + if self._activity_worker: + await self._activity_worker.wait_all_completed() + # Do final shutdown try: await self._bridge_worker.finalize_shutdown() diff -Nru temporalio-1.3.0/temporalio/worker/_workflow_instance.py temporalio-1.3.0/temporalio/worker/_workflow_instance.py --- temporalio-1.3.0/temporalio/worker/_workflow_instance.py 2023-10-30 13:49:41.000000000 +0000 +++ temporalio-1.3.0/temporalio/worker/_workflow_instance.py 2023-10-30 19:40:00.000000000 +0000 @@ -175,6 +175,8 @@ self._time_ns = 0 self._cancel_requested = False self._current_history_length = 0 + self._current_history_size = 0 + self._continue_as_new_suggested = False # Lazily loaded self._memo: Optional[Mapping[str, Any]] = None # Handles which are ready to run on the next event loop iteration @@ -272,6 +274,8 @@ self._current_completion.successful.SetInParent() self._current_activation_error: Optional[Exception] = None self._current_history_length = act.history_length + self._current_history_size = act.history_size_bytes + self._continue_as_new_suggested = act.continue_as_new_suggested self._time_ns = act.timestamp.ToNanoseconds() self._is_replaying = act.is_replaying @@ -738,6 +742,9 @@ def workflow_get_current_history_length(self) -> int: return self._current_history_length + def workflow_get_current_history_size(self) -> int: + return self._current_history_size + def workflow_get_external_workflow_handle( self, id: str, *, run_id: Optional[str] ) -> temporalio.workflow.ExternalWorkflowHandle[Any]: @@ -760,6 +767,9 @@ def workflow_info(self) -> temporalio.workflow.Info: return self._outbound.info() + def workflow_is_continue_as_new_suggested(self) -> bool: + return self._continue_as_new_suggested + def workflow_is_replaying(self) -> bool: return self._is_replaying @@ -784,6 +794,7 @@ )[0] def workflow_patch(self, id: str, *, deprecated: bool) -> bool: + self._assert_not_read_only("patch") # We use a previous memoized result of this if present. If this is being # deprecated, we can still use memoized result and skip the command. use_patch = self._patches_memoized.get(id) diff -Nru temporalio-1.3.0/temporalio/workflow.py temporalio-1.3.0/temporalio/workflow.py --- temporalio-1.3.0/temporalio/workflow.py 2023-10-30 13:49:41.000000000 +0000 +++ temporalio-1.3.0/temporalio/workflow.py 2023-10-30 19:40:00.000000000 +0000 @@ -336,11 +336,34 @@ def get_current_history_length(self) -> int: """Get the current number of events in history. + Note, this value may not be up to date if accessed inside a query. + Returns: Current number of events in history (up until the current task). """ return _Runtime.current().workflow_get_current_history_length() + def get_current_history_size(self) -> int: + """Get the current byte size of history. + + Note, this value may not be up to date if accessed inside a query. + + Returns: + Current byte-size of history (up until the current task). + """ + return _Runtime.current().workflow_get_current_history_size() + + def is_continue_as_new_suggested(self) -> bool: + """Get whether or not continue as new is suggested. + + Note, this value may not be up to date if accessed inside a query. + + Returns: + True if the server is configured to suggest continue as new and it + is suggested. + """ + return _Runtime.current().workflow_is_continue_as_new_suggested() + @dataclass(frozen=True) class ParentInfo: @@ -406,6 +429,10 @@ ... @abstractmethod + def workflow_get_current_history_size(self) -> int: + ... + + @abstractmethod def workflow_get_external_workflow_handle( self, id: str, *, run_id: Optional[str] ) -> ExternalWorkflowHandle[Any]: @@ -424,6 +451,10 @@ ... @abstractmethod + def workflow_is_continue_as_new_suggested(self) -> bool: + ... + + @abstractmethod def workflow_is_replaying(self) -> bool: ... diff -Nru temporalio-1.3.0/vendor/ahash/.cargo-checksum.json temporalio-1.3.0/vendor/ahash/.cargo-checksum.json --- temporalio-1.3.0/vendor/ahash/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ahash/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"Cargo.toml":"a05cb9b3c018f30fed8e55601dd0fb838b56b36116f56d743ae38d064c62fb95","FAQ.md":"9eb41898523ee209a0a937f9bcb78afe45ad55ca0556f8a4d4063558098f6d1e","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"0444c6991eead6822f7b9102e654448d51624431119546492e8b231db42c48bb","README.md":"40d63866ffeabb0ae8fd65715f1da447ace146379ecc5c11fc61a84995edeaff","build.rs":"21e62c29f64f294a6871b5f0831b789cadc5f8e4e02423ab9acccb30c4d401bd","rustfmt.toml":"e090969e99df9360705680cc0097cfaddae10c22dc2e01470592cf3b9787fd36","src/aes_hash.rs":"96eb957af18f7b0d42561bf5f391bb79154785bf3a43e7ac21bd1f7f0017b209","src/convert.rs":"54e49f93d51665366923d4d815cfd67790d3c769e84ab4386ba97f928d17d1bd","src/fallback_hash.rs":"37cb76793cd11f0b582e89c91ffaeb7270ed31c90b3a3c082a87ccbe9b188fcc","src/hash_map.rs":"5ee97baa64fa528ba9c01bd018332c4974846c4813c6f8c30cee9f3546598f1c","src/hash_quality_test.rs":"b96a36f2ccd7332489bccfe3130b08caea86fa1f852e221fe97858940d329f05","src/hash_set.rs":"360e55d066b44624f06e49efa140c03fda635fb17a59622cc29a83830bd1f263","src/lib.rs":"940ab09005f8e98b01ad40da35b69e0fb2de998d58960ed501d24568f3d9f363","src/operations.rs":"1318731c6dfd245cc04a982ad9f438decf8b87b2194f4725ef01f211fe9ab377","src/random_state.rs":"fefae5d124933163abf69471589758870ab4e387a2142c7d94f545de9b1f6b20","src/specialize.rs":"56354db8a0f7e6ee1340a08f2ab6f79a0ff439fd61badac5e7e59fe4f4a653ba","tests/bench.rs":"6455dedf9db9fb03b2ea4a5a4b9efbeeee3ac3019c66d68dcb0560e3e58ff8e3","tests/map_tests.rs":"6161e7255fc22977ad871d8bcf948717a8b57b503033d9ddb565f3b145ccab34","tests/nopanic.rs":"0d28a46248d77283941db1d9fd154c68b965c81a0e3db1fe4a43e06fc448da8f"},"package":"91429305e9f0a25f6205c5b8e0d2db09e0708a7a6df0f42212bb56c32c8ac97a"} \ No newline at end of file +{"files":{"Cargo.toml":"136a7b1e64c2da6e4b948e9bb7d2429453b7a89cffc3828b9a81584716d22e2f","FAQ.md":"9eb41898523ee209a0a937f9bcb78afe45ad55ca0556f8a4d4063558098f6d1e","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"0444c6991eead6822f7b9102e654448d51624431119546492e8b231db42c48bb","README.md":"40d63866ffeabb0ae8fd65715f1da447ace146379ecc5c11fc61a84995edeaff","build.rs":"21e62c29f64f294a6871b5f0831b789cadc5f8e4e02423ab9acccb30c4d401bd","rustfmt.toml":"e090969e99df9360705680cc0097cfaddae10c22dc2e01470592cf3b9787fd36","src/aes_hash.rs":"1392355b354446bd71d9bfcf654b8209210974268db658f8f30c10594b7e421f","src/convert.rs":"b47fc60fc47b3492235da337d4ba247bd80a3e0b5e468d34784db24f1f294244","src/fallback_hash.rs":"37cb76793cd11f0b582e89c91ffaeb7270ed31c90b3a3c082a87ccbe9b188fcc","src/hash_map.rs":"5ee97baa64fa528ba9c01bd018332c4974846c4813c6f8c30cee9f3546598f1c","src/hash_quality_test.rs":"4396264603d0739f1464b191019f4c7c5b2ffe511ca375bc63de3e6a3a113958","src/hash_set.rs":"360e55d066b44624f06e49efa140c03fda635fb17a59622cc29a83830bd1f263","src/lib.rs":"940ab09005f8e98b01ad40da35b69e0fb2de998d58960ed501d24568f3d9f363","src/operations.rs":"605b0bfadf8d4abb4416c33a056cfefc694f6de60591a8fd39bb5a12e91a3286","src/random_state.rs":"fefae5d124933163abf69471589758870ab4e387a2142c7d94f545de9b1f6b20","src/specialize.rs":"56354db8a0f7e6ee1340a08f2ab6f79a0ff439fd61badac5e7e59fe4f4a653ba","tests/bench.rs":"6455dedf9db9fb03b2ea4a5a4b9efbeeee3ac3019c66d68dcb0560e3e58ff8e3","tests/map_tests.rs":"6161e7255fc22977ad871d8bcf948717a8b57b503033d9ddb565f3b145ccab34","tests/nopanic.rs":"0d28a46248d77283941db1d9fd154c68b965c81a0e3db1fe4a43e06fc448da8f"},"package":"2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/ahash/Cargo.toml temporalio-1.3.0/vendor/ahash/Cargo.toml --- temporalio-1.3.0/vendor/ahash/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ahash/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -12,7 +12,7 @@ [package] edition = "2018" name = "ahash" -version = "0.8.6" +version = "0.8.3" authors = ["Tom Kaitchuck "] build = "./build.rs" exclude = [ @@ -38,7 +38,6 @@ repository = "https://github.com/tkaitchuck/ahash" [package.metadata.docs.rs] -features = ["std"] rustc-args = [ "-C", "target-feature=+aes", @@ -47,19 +46,20 @@ "-C", "target-feature=+aes", ] +features = ["std"] [profile.bench] opt-level = 3 lto = "fat" codegen-units = 1 -debug = 0 +debug = false debug-assertions = false [profile.release] opt-level = 3 lto = "fat" codegen-units = 1 -debug = 0 +debug = false debug-assertions = false [profile.test] @@ -103,11 +103,6 @@ version = "1.0.117" optional = true -[dependencies.zerocopy] -version = "0.7.14" -features = ["simd"] -default-features = false - [dev-dependencies.criterion] version = "0.3.2" features = ["html_reports"] diff -Nru temporalio-1.3.0/vendor/ahash/src/aes_hash.rs temporalio-1.3.0/vendor/ahash/src/aes_hash.rs --- temporalio-1.3.0/vendor/ahash/src/aes_hash.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ahash/src/aes_hash.rs 2023-10-30 19:40:00.000000000 +0000 @@ -81,23 +81,23 @@ #[inline(always)] fn hash_in(&mut self, new_value: u128) { - self.enc = aesdec(self.enc, new_value); + self.enc = aesenc(self.enc, new_value); self.sum = shuffle_and_add(self.sum, new_value); } #[inline(always)] fn hash_in_2(&mut self, v1: u128, v2: u128) { - self.enc = aesdec(self.enc, v1); + self.enc = aesenc(self.enc, v1); self.sum = shuffle_and_add(self.sum, v1); - self.enc = aesdec(self.enc, v2); + self.enc = aesenc(self.enc, v2); self.sum = shuffle_and_add(self.sum, v2); } #[inline] #[cfg(feature = "specialize")] fn short_finish(&self) -> u64 { - let combined = aesenc(self.sum, self.enc); - let result: [u64; 2] = aesdec(combined, combined).convert(); + let combined = aesdec(self.sum, self.enc); + let result: [u64; 2] = aesenc(combined, combined).convert(); result[0] } } @@ -164,29 +164,28 @@ let tail = data.read_last_u128x4(); let mut current: [u128; 4] = [self.key; 4]; current[0] = aesenc(current[0], tail[0]); - current[1] = aesdec(current[1], tail[1]); + current[1] = aesenc(current[1], tail[1]); current[2] = aesenc(current[2], tail[2]); - current[3] = aesdec(current[3], tail[3]); - let mut sum: [u128; 2] = [self.key, !self.key]; + current[3] = aesenc(current[3], tail[3]); + let mut sum: [u128; 2] = [self.key, self.key]; sum[0] = add_by_64s(sum[0].convert(), tail[0].convert()).convert(); sum[1] = add_by_64s(sum[1].convert(), tail[1].convert()).convert(); sum[0] = shuffle_and_add(sum[0], tail[2]); sum[1] = shuffle_and_add(sum[1], tail[3]); while data.len() > 64 { let (blocks, rest) = data.read_u128x4(); - current[0] = aesdec(current[0], blocks[0]); - current[1] = aesdec(current[1], blocks[1]); - current[2] = aesdec(current[2], blocks[2]); - current[3] = aesdec(current[3], blocks[3]); + current[0] = aesenc(current[0], blocks[0]); + current[1] = aesenc(current[1], blocks[1]); + current[2] = aesenc(current[2], blocks[2]); + current[3] = aesenc(current[3], blocks[3]); sum[0] = shuffle_and_add(sum[0], blocks[0]); sum[1] = shuffle_and_add(sum[1], blocks[1]); sum[0] = shuffle_and_add(sum[0], blocks[2]); sum[1] = shuffle_and_add(sum[1], blocks[3]); data = rest; } - self.hash_in_2(current[0], current[1]); - self.hash_in_2(current[2], current[3]); - self.hash_in_2(sum[0], sum[1]); + self.hash_in_2(aesenc(current[0], current[1]), aesenc(current[2], current[3])); + self.hash_in(add_by_64s(sum[0].convert(), sum[1].convert()).convert()); } else { //len 33-64 let (head, _) = data.read_u128x2(); @@ -208,8 +207,8 @@ } #[inline] fn finish(&self) -> u64 { - let combined = aesenc(self.sum, self.enc); - let result: [u64; 2] = aesdec(aesdec(combined, self.key), combined).convert(); + let combined = aesdec(self.sum, self.enc); + let result: [u64; 2] = aesenc(aesenc(combined, self.key), combined).convert(); result[0] } } @@ -329,15 +328,15 @@ fn write(&mut self, bytes: &[u8]) { if bytes.len() > 8 { self.0.write(bytes); - self.0.enc = aesenc(self.0.sum, self.0.enc); - self.0.enc = aesdec(aesdec(self.0.enc, self.0.key), self.0.enc); + self.0.enc = aesdec(self.0.sum, self.0.enc); + self.0.enc = aesenc(aesenc(self.0.enc, self.0.key), self.0.enc); } else { add_in_length(&mut self.0.enc, bytes.len() as u64); let value = read_small(bytes).convert(); self.0.sum = shuffle_and_add(self.0.sum, value); - self.0.enc = aesenc(self.0.sum, self.0.enc); - self.0.enc = aesdec(aesdec(self.0.enc, self.0.key), self.0.enc); + self.0.enc = aesdec(self.0.sum, self.0.enc); + self.0.enc = aesenc(aesenc(self.0.enc, self.0.key), self.0.enc); } } diff -Nru temporalio-1.3.0/vendor/ahash/src/convert.rs temporalio-1.3.0/vendor/ahash/src/convert.rs --- temporalio-1.3.0/vendor/ahash/src/convert.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ahash/src/convert.rs 2023-10-30 19:40:00.000000000 +0000 @@ -7,13 +7,13 @@ impl Convert<$b> for $a { #[inline(always)] fn convert(self) -> $b { - zerocopy::transmute!(self) + unsafe { core::mem::transmute::<$a, $b>(self) } } } impl Convert<$a> for $b { #[inline(always)] fn convert(self) -> $a { - zerocopy::transmute!(self) + unsafe { core::mem::transmute::<$b, $a>(self) } } } }; @@ -65,7 +65,8 @@ { #[inline(always)] fn as_array(slice: &[T]) -> &[T; $len] { - core::convert::TryFrom::try_from(slice).unwrap() + assert_eq!(slice.len(), $len); + unsafe { &*(slice.as_ptr() as *const [_; $len]) } } as_array($input) } diff -Nru temporalio-1.3.0/vendor/ahash/src/hash_quality_test.rs temporalio-1.3.0/vendor/ahash/src/hash_quality_test.rs --- temporalio-1.3.0/vendor/ahash/src/hash_quality_test.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ahash/src/hash_quality_test.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,5 +1,5 @@ use core::hash::{Hash, Hasher}; -use std::collections::{HashMap}; +use std::collections::HashMap; fn assert_sufficiently_different(a: u64, b: u64, tolerance: i32) { let (same_byte_count, same_nibble_count) = count_same_bytes_and_nibbles(a, b); @@ -71,8 +71,12 @@ gen_combinations(&options, 7, Vec::new(), &mut combinations); let mut map: HashMap> = HashMap::new(); for combination in combinations { - use zerocopy::AsBytes; - let array = combination.as_slice().as_bytes().to_vec(); + let array = unsafe { + let (begin, middle, end) = combination.align_to::(); + assert_eq!(0, begin.len()); + assert_eq!(0, end.len()); + middle.to_vec() + }; let mut hasher = gen_hash(); hasher.write(&array); let hash = hasher.finish(); @@ -338,28 +342,6 @@ } } -fn test_sparse(hasher: impl Fn() -> T) { - let mut buf = [0u8; 256]; - let mut hashes = HashMap::new(); - for idx_1 in 0..256 { - for idx_2 in idx_1+1..256 { - for value_1 in [1, 2, 4, 8, 16, 32, 64, 128] { - for value_2 in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 15, 16, 17, 18, 20, 24, 31, 32, 33, 48, 64, 96, 127, 128, 129, 192, 254, 255] { - buf[idx_1] = value_1; - buf[idx_2] = value_2; - let hash_value = hash_with(&buf, &mut hasher()); - let keys = hashes.entry(hash_value).or_insert(Vec::new()); - keys.push((idx_1, value_1, idx_2, value_2)); - buf[idx_1] = 0; - buf[idx_2] = 0; - } - } - } - } - hashes.retain(|_key, value| value.len() != 1); - assert_eq!(0, hashes.len(), "Collision with: {:?}", hashes); -} - #[cfg(test)] mod fallback_tests { use crate::fallback_hash::*; @@ -426,12 +408,6 @@ fn fallback_length_extension() { test_length_extension(|a, b| AHasher::new_with_keys(a, b)); } - - #[test] - fn test_no_sparse_collisions() { - test_sparse(|| AHasher::new_with_keys(0, 0)); - test_sparse(|| AHasher::new_with_keys(1, 2)); - } } ///Basic sanity tests of the cypto properties of aHash. @@ -525,10 +501,4 @@ fn aes_length_extension() { test_length_extension(|a, b| AHasher::test_with_keys(a, b)); } - - #[test] - fn aes_no_sparse_collisions() { - test_sparse(|| AHasher::test_with_keys(0, 0)); - test_sparse(|| AHasher::test_with_keys(1, 2)); - } } diff -Nru temporalio-1.3.0/vendor/ahash/src/operations.rs temporalio-1.3.0/vendor/ahash/src/operations.rs --- temporalio-1.3.0/vendor/ahash/src/operations.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ahash/src/operations.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,5 +1,4 @@ use crate::convert::*; -use zerocopy::transmute; ///This constant comes from Kunth's prng (Empirically it works better than those from splitmix32). pub(crate) const MULTIPLE: u64 = 6364136223846793005; @@ -56,7 +55,8 @@ use core::arch::x86::*; #[cfg(target_arch = "x86_64")] use core::arch::x86_64::*; - unsafe { transmute!(_mm_shuffle_epi8(transmute!(a), transmute!(SHUFFLE_MASK))) } + use core::mem::transmute; + unsafe { transmute(_mm_shuffle_epi8(transmute(a), transmute(SHUFFLE_MASK))) } } #[cfg(not(all(target_feature = "ssse3", not(miri))))] { @@ -81,12 +81,13 @@ #[cfg(all(any(target_arch = "x86", target_arch = "x86_64"), target_feature = "sse2", not(miri)))] #[inline(always)] pub(crate) fn add_by_64s(a: [u64; 2], b: [u64; 2]) -> [u64; 2] { + use core::mem::transmute; unsafe { #[cfg(target_arch = "x86")] use core::arch::x86::*; #[cfg(target_arch = "x86_64")] use core::arch::x86_64::*; - transmute!(_mm_add_epi64(transmute!(a), transmute!(b))) + transmute(_mm_add_epi64(transmute(a), transmute(b))) } } @@ -104,9 +105,10 @@ use core::arch::x86::*; #[cfg(target_arch = "x86_64")] use core::arch::x86_64::*; + use core::mem::transmute; unsafe { - let value = transmute!(value); - transmute!(_mm_aesenc_si128(value, transmute!(xor))) + let value = transmute(value); + transmute(_mm_aesenc_si128(value, transmute(xor))) } } @@ -123,9 +125,11 @@ use core::arch::aarch64::*; #[cfg(target_arch = "arm")] use core::arch::arm::*; - let res = unsafe { vaesmcq_u8(vaeseq_u8(transmute!(value), transmute!(0u128))) }; - let value: u128 = transmute!(res); - xor ^ value + use core::mem::transmute; + unsafe { + let value = transmute(value); + transmute(vaesmcq_u8(vaeseq_u8(value, transmute(xor)))) + } } #[cfg(all(any(target_arch = "x86", target_arch = "x86_64"), target_feature = "aes", not(miri)))] @@ -136,9 +140,10 @@ use core::arch::x86::*; #[cfg(target_arch = "x86_64")] use core::arch::x86_64::*; + use core::mem::transmute; unsafe { - let value = transmute!(value); - transmute!(_mm_aesdec_si128(value, transmute!(xor))) + let value = transmute(value); + transmute(_mm_aesdec_si128(value, transmute(xor))) } } @@ -155,9 +160,11 @@ use core::arch::aarch64::*; #[cfg(target_arch = "arm")] use core::arch::arm::*; - let res = unsafe { vaesimcq_u8(vaesdq_u8(transmute!(value), transmute!(0u128))) }; - let value: u128 = transmute!(res); - xor ^ value + use core::mem::transmute; + unsafe { + let value = transmute(value); + transmute(vaesimcq_u8(vaesdq_u8(value, transmute(xor)))) + } } #[allow(unused)] @@ -200,7 +207,7 @@ // #[cfg(target_arch = "x86_64")] // use core::arch::x86_64::*; // MASK.with(|mask| { - // unsafe { transmute!(_mm_shuffle_epi8(transmute!(a), transmute!(mask.get()))) } + // unsafe { transmute(_mm_shuffle_epi8(transmute(a), transmute(mask.get()))) } // }) // } // diff -Nru temporalio-1.3.0/vendor/aho-corasick/.cargo-checksum.json temporalio-1.3.0/vendor/aho-corasick/.cargo-checksum.json --- temporalio-1.3.0/vendor/aho-corasick/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/aho-corasick/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"COPYING":"01c266bced4a434da0051174d6bee16a4c82cf634e2679b6155d40d75012390f","Cargo.toml":"747d0fcb1257c9b8b013104da3c5a67f5d6cf8a95a2163b13703c01cab2c010a","DESIGN.md":"59c960e1b73b1d7fb41e4df6c0c1b1fcf44dd2ebc8a349597a7d0595f8cb5130","LICENSE-MIT":"0f96a83840e146e43c0ec96a22ec1f392e0680e6c1226e6f3ba87e0740af850f","README.md":"afc4d559a98cf190029af0bf320fc0022725e349cd2a303aac860254e28f3c53","UNLICENSE":"7e12e5df4bae12cb21581ba157ced20e1986a0508dd10d0e8a4ab9a4cf94e85c","rustfmt.toml":"1ca600239a27401c4a43f363cf3f38183a212affc1f31bff3ae93234bbaec228","src/ahocorasick.rs":"c699c07df70be45c666e128509ad571a7649d2073e4ae16ac1efd6793c9c6890","src/automaton.rs":"22258a3e118672413119f8f543a9b912cce954e63524575c0ebfdf9011f9c2dd","src/dfa.rs":"bfef1a94c5e7410584b1beb4e857b40d1ae2031b881cbc06fb1300409bbd555f","src/lib.rs":"2a92d5c5e930f2d306508802e8a929135e1f41c9f5f8deda8f7eb98947179dd2","src/macros.rs":"c6c52ae05b24433cffaca7b78b3645d797862c5d5feffddf9f54909095ed6e05","src/nfa/contiguous.rs":"aeb6ee5fd80eea04decbc4b46aa27d1ab270b78d416a644da25b7934f009ee66","src/nfa/mod.rs":"ee7b3109774d14bbad5239c16bb980dd6b8185ec136d94fbaf2f0dc27d5ffa15","src/nfa/noncontiguous.rs":"de94f02b04efd8744fb096759a8897c22012b0e0ca3ace161fd87c71befefe04","src/packed/api.rs":"160d3b10823316f7b0924e13c3afd222c8a7db5c0a00432401f311ef27d6a1b7","src/packed/ext.rs":"66be06fde8558429da23a290584d4b9fae665bf64c2578db4fe5f5f3ee864869","src/packed/mod.rs":"0020cd6f07ba5c8955923a9516d7f758864260eda53a6b6f629131c45ddeec62","src/packed/pattern.rs":"1e3a289a730c141fc30b295811e372d046c6619c7fd670308299b889a06c7673","src/packed/rabinkarp.rs":"403146eb1d838a84601d171393542340513cd1ee7ff750f2372161dd47746586","src/packed/teddy/README.md":"3a43194b64e221543d885176aba3beb1224a927385a20eca842daf6b0ea2f342","src/packed/teddy/builder.rs":"720735ea6c7ff92b081426513e6e82feed24a922849297bb538d28f7b8129f81","src/packed/teddy/generic.rs":"ea252ab05b32cea7dd9d71e332071d243db7dd0362e049252a27e5881ba2bf39","src/packed/teddy/mod.rs":"17d741f7e2fb9dbac5ba7d1bd4542cf1e35e9f146ace728e23fe6bbed20028b2","src/packed/tests.rs":"8e2f56eb3890ed3876ecb47d3121996e416563127b6430110d7b516df3f83b4b","src/packed/vector.rs":"840065521cbd4701fa5b8b506d1537843d858c903f7cadf3c68749ea1780874b","src/tests.rs":"c68192ab97b6161d0d6ee96fefd80cc7d14e4486ddcd8d1f82b5c92432c24ed5","src/transducer.rs":"02daa33a5d6dac41dcfd67f51df7c0d4a91c5131c781fb54c4de3520c585a6e1","src/util/alphabet.rs":"6dc22658a38deddc0279892035b18870d4585069e35ba7c7e649a24509acfbcc","src/util/buffer.rs":"f9e37f662c46c6ecd734458dedbe76c3bb0e84a93b6b0117c0d4ad3042413891","src/util/byte_frequencies.rs":"2fb85b381c038c1e44ce94294531cdcd339dca48b1e61f41455666e802cbbc9e","src/util/debug.rs":"ab301ad59aa912529cb97233a54a05914dd3cb2ec43e6fec7334170b97ac5998","src/util/error.rs":"ecccd60e7406305023efcc6adcc826eeeb083ab8f7fbfe3d97469438cd4c4e5c","src/util/int.rs":"4ab6dbdba10027ddec2af63a9b28ce4eee30ded0daa5d8eb068b2b55542b6039","src/util/mod.rs":"7ab28d11323ecdbd982087f32eb8bceeee84f1a2583f3aae27039c36d58cf12c","src/util/prefilter.rs":"9fa4498f18bf70478b1996c1a013698b626d15f119aa81dbc536673c9f045718","src/util/primitives.rs":"f89f3fa1d8db4e37de9ca767c6d05e346404837cade6d063bba68972fafa610b","src/util/remapper.rs":"9f12d911583a325c11806eeceb46d0dfec863cfcfa241aed84d31af73da746e5","src/util/search.rs":"6af803e08b8b8c8a33db100623f1621b0d741616524ce40893d8316897f27ffe","src/util/special.rs":"7d2f9cb9dd9771f59816e829b2d96b1239996f32939ba98764e121696c52b146"},"package":"b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0"} \ No newline at end of file +{"files":{"COPYING":"01c266bced4a434da0051174d6bee16a4c82cf634e2679b6155d40d75012390f","Cargo.toml":"5423d481ecba20ac361e5e42a555f7f75a90d7343cf56111b493b9563b53c841","DESIGN.md":"d336d97838a16dbc2052658c8a361434829944e3d80373572d9e75bb04c24e78","LICENSE-MIT":"0f96a83840e146e43c0ec96a22ec1f392e0680e6c1226e6f3ba87e0740af850f","README.md":"6c36ae81ea9af36e6f964d7045d9719b427fe36f15db99b879feb5453734941e","UNLICENSE":"7e12e5df4bae12cb21581ba157ced20e1986a0508dd10d0e8a4ab9a4cf94e85c","rustfmt.toml":"1ca600239a27401c4a43f363cf3f38183a212affc1f31bff3ae93234bbaec228","src/ahocorasick.rs":"c699c07df70be45c666e128509ad571a7649d2073e4ae16ac1efd6793c9c6890","src/automaton.rs":"22258a3e118672413119f8f543a9b912cce954e63524575c0ebfdf9011f9c2dd","src/dfa.rs":"b1e5e3a262dac5f563f390181f3de6601eaedd58c21fbf10477dbe69f684ecdc","src/lib.rs":"e8eea7336382c12638e3ba5d34d37f97813503c14cf646c6a88d1f4c2742c762","src/macros.rs":"c6c52ae05b24433cffaca7b78b3645d797862c5d5feffddf9f54909095ed6e05","src/nfa/contiguous.rs":"aeb6ee5fd80eea04decbc4b46aa27d1ab270b78d416a644da25b7934f009ee66","src/nfa/mod.rs":"ee7b3109774d14bbad5239c16bb980dd6b8185ec136d94fbaf2f0dc27d5ffa15","src/nfa/noncontiguous.rs":"5881a72393743505405a31d0cfc5727a607e08889b7f5948393757e8d02a9592","src/packed/api.rs":"37a6580d3578d2244580ce2edc12105933c597f0c0b95d70e53a343e4d9f3582","src/packed/mod.rs":"b2c79103c1ed99b7d4261335909fff41a597a324325d62c3325afd656077bcb9","src/packed/pattern.rs":"dd74572178c20cf651ae272bf2c985fb0b3fadc5140cdcb1bff95a3fbcfe2ade","src/packed/rabinkarp.rs":"7bdabb91ec8a22a37a12edabf893270a04c57dea9d6714d507ba17f094285e15","src/packed/teddy/README.md":"b4b83fb5afafbbea6cb76fe70f49cc8ced888f682d98abe5ea5773e95d9ec2b0","src/packed/teddy/compile.rs":"6725dc38114953c0429652e2a4d31dcc33e54c0f5a6cee79f282c6a3d7b41683","src/packed/teddy/mod.rs":"0ce9fcba05a68301474fe30a71824650d05dcb8f04405fe9fc6b9326229f7db0","src/packed/teddy/runtime.rs":"2dc68cc08e24169eafcebbab35187d6aab38ef994267d2735b019b43bad0e6f2","src/packed/tests.rs":"f28307860843c36c9998657e3518c250ec2f4eac800cf912cad6d7aaa81bab7c","src/packed/vector.rs":"48909869f0ecf8832d338ed54c48a77d972bbcda57476d3b863078a18e59f709","src/tests.rs":"c68192ab97b6161d0d6ee96fefd80cc7d14e4486ddcd8d1f82b5c92432c24ed5","src/transducer.rs":"02daa33a5d6dac41dcfd67f51df7c0d4a91c5131c781fb54c4de3520c585a6e1","src/util/alphabet.rs":"6dc22658a38deddc0279892035b18870d4585069e35ba7c7e649a24509acfbcc","src/util/buffer.rs":"f9e37f662c46c6ecd734458dedbe76c3bb0e84a93b6b0117c0d4ad3042413891","src/util/byte_frequencies.rs":"2fb85b381c038c1e44ce94294531cdcd339dca48b1e61f41455666e802cbbc9e","src/util/debug.rs":"ab301ad59aa912529cb97233a54a05914dd3cb2ec43e6fec7334170b97ac5998","src/util/error.rs":"ecccd60e7406305023efcc6adcc826eeeb083ab8f7fbfe3d97469438cd4c4e5c","src/util/int.rs":"b735f3ae8d398849fe0ab1575d634df15803b21167945b894205fdde4a1a9e58","src/util/mod.rs":"7ab28d11323ecdbd982087f32eb8bceeee84f1a2583f3aae27039c36d58cf12c","src/util/prefilter.rs":"ef36a945b8f564771a031d98e0dbf85eea93d1fc66a1c60b7baa98fecf66bb69","src/util/primitives.rs":"f89f3fa1d8db4e37de9ca767c6d05e346404837cade6d063bba68972fafa610b","src/util/remapper.rs":"9f12d911583a325c11806eeceb46d0dfec863cfcfa241aed84d31af73da746e5","src/util/search.rs":"6af803e08b8b8c8a33db100623f1621b0d741616524ce40893d8316897f27ffe","src/util/special.rs":"7d2f9cb9dd9771f59816e829b2d96b1239996f32939ba98764e121696c52b146"},"package":"6748e8def348ed4d14996fa801f4122cd763fff530258cdc03f64b25f89d3a5a"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/aho-corasick/Cargo.toml temporalio-1.3.0/vendor/aho-corasick/Cargo.toml --- temporalio-1.3.0/vendor/aho-corasick/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/aho-corasick/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -13,13 +13,9 @@ edition = "2021" rust-version = "1.60.0" name = "aho-corasick" -version = "1.1.2" +version = "1.0.4" authors = ["Andrew Gallant "] -exclude = [ - "/aho-corasick-debug", - "/benchmarks", - "/tmp", -] +exclude = ["/aho-corasick-debug"] autotests = false description = "Fast multiple substring searching." homepage = "https://github.com/BurntSushi/aho-corasick" diff -Nru temporalio-1.3.0/vendor/aho-corasick/DESIGN.md temporalio-1.3.0/vendor/aho-corasick/DESIGN.md --- temporalio-1.3.0/vendor/aho-corasick/DESIGN.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/aho-corasick/DESIGN.md 2023-10-30 19:40:00.000000000 +0000 @@ -470,12 +470,12 @@ attempted. Currently, the only algorithm available for this is Teddy, but more may be added in the future. Teddy is unlike the above prefilters in that it confirms its own matches, so when Teddy is active, it might not be necessary -for Aho-Corasick to run at all. However, the current Teddy implementation -only works in `x86_64` when SSSE3 or AVX2 are available or in `aarch64` -(using NEON), and moreover, only works _well_ when there are a small number -of patterns (say, less than 100). Teddy also requires the haystack to be of a -certain length (more than 16-34 bytes). When the haystack is shorter than that, -Rabin-Karp is used instead. (See `src/packed/rabinkarp.rs`.) +for Aho-Corasick to run at all. However, the current Teddy implementation only +works in `x86_64` and when SSSE3 or AVX2 are available, and moreover, only +works _well_ when there are a small number of patterns (say, less than 100). +Teddy also requires the haystack to be of a certain length (more than 16-34 +bytes). When the haystack is shorter than that, Rabin-Karp is used instead. +(See `src/packed/rabinkarp.rs`.) There is a more thorough description of Teddy at [`src/packed/teddy/README.md`](src/packed/teddy/README.md). diff -Nru temporalio-1.3.0/vendor/aho-corasick/README.md temporalio-1.3.0/vendor/aho-corasick/README.md --- temporalio-1.3.0/vendor/aho-corasick/README.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/aho-corasick/README.md 2023-10-30 19:40:00.000000000 +0000 @@ -170,5 +170,3 @@ * [G-Research/ahocorasick_rs](https://github.com/G-Research/ahocorasick_rs/) is a Python wrapper for this library. -* [tmikus/ahocorasick_rs](https://github.com/tmikus/ahocorasick_rs) is a Go - wrapper for this library. diff -Nru temporalio-1.3.0/vendor/aho-corasick/src/dfa.rs temporalio-1.3.0/vendor/aho-corasick/src/dfa.rs --- temporalio-1.3.0/vendor/aho-corasick/src/dfa.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/aho-corasick/src/dfa.rs 2023-10-30 19:40:00.000000000 +0000 @@ -173,6 +173,8 @@ sid: StateID, pids: impl Iterator, ) { + use core::mem::size_of; + let index = (sid.as_usize() >> self.stride2).checked_sub(2).unwrap(); let mut at_least_one = false; for pid in pids { @@ -566,18 +568,6 @@ if oldnextsid == noncontiguous::NFA::FAIL { if anchored.is_anchored() { oldnextsid = noncontiguous::NFA::DEAD; - } else if state.fail() == noncontiguous::NFA::DEAD { - // This is a special case that avoids following - // DEAD transitions in a non-contiguous NFA. - // Following these transitions is pretty slow - // because the non-contiguous NFA will always use - // a sparse representation for it (because the - // DEAD state is usually treated as a sentinel). - // The *vast* majority of failure states are DEAD - // states, so this winds up being pretty slow if - // we go through the non-contiguous NFA state - // transition logic. Instead, just do it ourselves. - oldnextsid = noncontiguous::NFA::DEAD; } else { oldnextsid = nnfa.next_state( Anchored::No, @@ -682,17 +672,8 @@ |byte, class, oldnextsid| { let class = usize::from(class); if oldnextsid == noncontiguous::NFA::FAIL { - let oldnextsid = - if state.fail() == noncontiguous::NFA::DEAD { - noncontiguous::NFA::DEAD - } else { - nnfa.next_state( - Anchored::No, - state.fail(), - byte, - ) - }; - dfa.trans[unewsid.as_usize() + class] = oldnextsid; + dfa.trans[unewsid.as_usize() + class] = nnfa + .next_state(Anchored::No, state.fail(), byte); } else { dfa.trans[unewsid.as_usize() + class] = oldnextsid; dfa.trans[anewsid.as_usize() + class] = oldnextsid; diff -Nru temporalio-1.3.0/vendor/aho-corasick/src/lib.rs temporalio-1.3.0/vendor/aho-corasick/src/lib.rs --- temporalio-1.3.0/vendor/aho-corasick/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/aho-corasick/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -224,6 +224,7 @@ diagnostics. This feature is disabled by default. */ +#![allow(warnings)] #![no_std] #![deny(missing_docs)] #![deny(rustdoc::broken_intra_doc_links)] diff -Nru temporalio-1.3.0/vendor/aho-corasick/src/nfa/noncontiguous.rs temporalio-1.3.0/vendor/aho-corasick/src/nfa/noncontiguous.rs --- temporalio-1.3.0/vendor/aho-corasick/src/nfa/noncontiguous.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/aho-corasick/src/nfa/noncontiguous.rs 2023-10-30 19:40:00.000000000 +0000 @@ -309,27 +309,25 @@ }) } - /// Return the link following the one given. If the one given is the last - /// link for the given state, then return `None`. + /// Return the transition following the one given. If the one given is the + /// last transition for the given state, then return `None`. /// - /// If no previous link is given, then this returns the first link in the - /// state, if one exists. + /// If no previous transition is given, then this returns the first + /// transition in the state, if one exists. /// /// This is useful for manually iterating over the transitions in a single /// state without borrowing the NFA. This permits mutating other parts of - /// the NFA during iteration. Namely, one can access the transition pointed - /// to by the link via `self.sparse[link]`. - fn next_link( + /// the NFA during iteration. + fn next_transition( &self, sid: StateID, - prev: Option, - ) -> Option { - let link = - prev.map_or(self.states[sid].sparse, |p| self.sparse[p].link); + prev: Option, + ) -> Option { + let link = prev.map_or(self.states[sid].sparse, |t| t.link); if link == StateID::ZERO { None } else { - Some(link) + Some(self.sparse[link]) } } @@ -422,46 +420,6 @@ Ok(()) } - /// This sets every possible transition (all 255 of them) for the given - /// state to the name `next` value. - /// - /// This is useful for efficiently initializing start/dead states. - /// - /// # Panics - /// - /// This requires that the state has no transitions added to it already. - /// If it has any transitions, then this panics. It will also panic if - /// the state has been densified prior to calling this. - fn init_full_state( - &mut self, - prev: StateID, - next: StateID, - ) -> Result<(), BuildError> { - assert_eq!( - StateID::ZERO, - self.states[prev].dense, - "state must not be dense yet" - ); - assert_eq!( - StateID::ZERO, - self.states[prev].sparse, - "state must have zero transitions" - ); - let mut prev_link = StateID::ZERO; - for byte in 0..=255 { - let new_link = self.alloc_transition()?; - self.sparse[new_link] = - Transition { byte, next, link: StateID::ZERO }; - if prev_link == StateID::ZERO { - self.states[prev].sparse = new_link; - } else { - self.sparse[prev_link].link = new_link; - } - prev_link = new_link; - } - Ok(()) - } - /// Add a match for the given pattern ID to the state for the given ID. fn add_match( &mut self, @@ -473,8 +431,14 @@ while self.matches[link].link != StateID::ZERO { link = self.matches[link].link; } - let new_match_link = self.alloc_match()?; - self.matches[new_match_link].pid = pid; + let new_match_link = + StateID::new(self.matches.len()).map_err(|e| { + BuildError::state_id_overflow( + StateID::MAX.as_u64(), + e.attempted(), + ) + })?; + self.matches.push(Match { pid, link: StateID::ZERO }); if link == StateID::ZERO { self.states[sid].matches = new_match_link; } else { @@ -687,6 +651,8 @@ #[inline(always)] fn memory_usage(&self) -> usize { + use core::mem::size_of; + self.states.len() * core::mem::size_of::() + self.sparse.len() * core::mem::size_of::() + self.matches.len() * core::mem::size_of::() @@ -701,6 +667,9 @@ } } +// BREADCRUMBS: Add `dense` field below that is non-zero when the state's +// transitions are defined in a dense table. + /// A representation of a sparse NFA state for an Aho-Corasick automaton. /// /// It contains the transitions to the next state, a failure transition for @@ -985,11 +954,7 @@ self.nfa.special.start_anchored_id = self.nfa.alloc_state(0)?; // Initialize the unanchored starting state in order to make it dense, // and thus make transition lookups on this state faster. - self.init_unanchored_start_state()?; - // Set all transitions on the DEAD state to point to itself. This way, - // the DEAD state can never be escaped. It MUST be used as a sentinel - // in any correct search. - self.add_dead_state_loop()?; + self.init_unanchored_start_state(); // Build the base trie from the given patterns. self.build_trie(patterns)?; self.nfa.states.shrink_to_fit(); @@ -1007,6 +972,10 @@ // Rewrite transitions to the FAIL state on the unanchored start state // as self-transitions. This keeps the start state active at all times. self.add_unanchored_start_state_loop(); + // Set all transitions on the DEAD state to point to itself. This way, + // the DEAD state can never be escaped. It MUST be used as a sentinel + // in any correct search. + self.add_dead_state_loop(); // Make some (possibly zero) states use a dense representation for // transitions. It's important to do this right after the states // and non-failure transitions are solidified. That way, subsequent @@ -1134,17 +1103,17 @@ prev = next; } else { let next = self.nfa.alloc_state(depth)?; - self.nfa.add_transition(prev, b, next)?; + self.nfa.add_transition(prev, b, next); if self.builder.ascii_case_insensitive { let b = opposite_ascii_case(b); - self.nfa.add_transition(prev, b, next)?; + self.nfa.add_transition(prev, b, next); } prev = next; } } // Once the pattern has been added, log the match in the final // state that it reached. - self.nfa.add_match(prev, pid)?; + self.nfa.add_match(prev, pid); } Ok(()) } @@ -1281,10 +1250,9 @@ // transitions, then this would never terminate. let mut queue = VecDeque::new(); let mut seen = self.queued_set(); - let mut prev_link = None; - while let Some(link) = self.nfa.next_link(start_uid, prev_link) { - prev_link = Some(link); - let t = self.nfa.sparse[link]; + let mut prevt = None; + while let Some(t) = self.nfa.next_transition(start_uid, prevt) { + prevt = Some(t); // Skip anything we've seen before and any self-transitions on the // start state. @@ -1306,10 +1274,9 @@ } } while let Some(id) = queue.pop_front() { - let mut prev_link = None; - while let Some(link) = self.nfa.next_link(id, prev_link) { - prev_link = Some(link); - let t = self.nfa.sparse[link]; + let mut prevt = None; + while let Some(t) = self.nfa.next_transition(id, prevt) { + prevt = Some(t); if seen.contains(t.next) { // The only way to visit a duplicate state in a transition @@ -1511,14 +1478,12 @@ continue; } let dense = self.nfa.alloc_dense_state()?; - let mut prev_link = None; - while let Some(link) = self.nfa.next_link(sid, prev_link) { - prev_link = Some(link); - let t = self.nfa.sparse[link]; - + let mut prevt = None; + while let Some(t) = self.nfa.next_transition(sid, prevt) { let class = usize::from(self.nfa.byte_classes.get(t.byte)); let index = dense.as_usize() + class; self.nfa.dense[index] = t.next; + prevt = Some(t); } self.nfa.states[sid].dense = dense; } @@ -1546,12 +1511,11 @@ /// make the unanchored starting state dense, and thus in turn make /// transition lookups on it faster. (Which is worth doing because it's /// the most active state.) - fn init_unanchored_start_state(&mut self) -> Result<(), BuildError> { + fn init_unanchored_start_state(&mut self) { let start_uid = self.nfa.special.start_unanchored_id; - let start_aid = self.nfa.special.start_anchored_id; - self.nfa.init_full_state(start_uid, NFA::FAIL)?; - self.nfa.init_full_state(start_aid, NFA::FAIL)?; - Ok(()) + for byte in 0..=255 { + self.nfa.add_transition(start_uid, byte, NFA::FAIL); + } } /// Setup the anchored start state by copying all of the transitions and @@ -1561,18 +1525,10 @@ fn set_anchored_start_state(&mut self) -> Result<(), BuildError> { let start_uid = self.nfa.special.start_unanchored_id; let start_aid = self.nfa.special.start_anchored_id; - let (mut uprev_link, mut aprev_link) = (None, None); - loop { - let unext = self.nfa.next_link(start_uid, uprev_link); - let anext = self.nfa.next_link(start_aid, aprev_link); - let (ulink, alink) = match (unext, anext) { - (Some(ulink), Some(alink)) => (ulink, alink), - (None, None) => break, - _ => unreachable!(), - }; - uprev_link = Some(ulink); - aprev_link = Some(alink); - self.nfa.sparse[alink].next = self.nfa.sparse[ulink].next; + let mut prevt = None; + while let Some(t) = self.nfa.next_transition(start_uid, prevt) { + prevt = Some(t); + self.nfa.add_transition(start_aid, t.byte, t.next)?; } self.nfa.copy_matches(start_uid, start_aid)?; // This is the main difference between the unanchored and anchored @@ -1596,11 +1552,9 @@ /// state already exists or not. fn add_unanchored_start_state_loop(&mut self) { let start_uid = self.nfa.special.start_unanchored_id; - let mut prev_link = None; - while let Some(link) = self.nfa.next_link(start_uid, prev_link) { - prev_link = Some(link); - if self.nfa.sparse[link].next() == NFA::FAIL { - self.nfa.sparse[link].next = start_uid; + for b in 0..=255 { + if self.nfa.follow_transition(start_uid, b) == NFA::FAIL { + self.nfa.add_transition(start_uid, b, start_uid); } } } @@ -1620,18 +1574,11 @@ fn close_start_state_loop_for_leftmost(&mut self) { let start_uid = self.nfa.special.start_unanchored_id; let start = &mut self.nfa.states[start_uid]; - let dense = start.dense; if self.builder.match_kind.is_leftmost() && start.is_match() { - let mut prev_link = None; - while let Some(link) = self.nfa.next_link(start_uid, prev_link) { - prev_link = Some(link); - if self.nfa.sparse[link].next() == start_uid { - self.nfa.sparse[link].next = NFA::DEAD; - if dense != StateID::ZERO { - let b = self.nfa.sparse[link].byte; - let class = usize::from(self.nfa.byte_classes.get(b)); - self.nfa.dense[dense.as_usize() + class] = NFA::DEAD; - } + for b in 0..=255 { + if self.nfa.follow_transition_sparse(start_uid, b) == start_uid + { + self.nfa.add_transition(start_uid, b, NFA::DEAD); } } } @@ -1640,9 +1587,10 @@ /// Sets all transitions on the dead state to point back to the dead state. /// Normally, missing transitions map back to the failure state, but the /// point of the dead state is to act as a sink that can never be escaped. - fn add_dead_state_loop(&mut self) -> Result<(), BuildError> { - self.nfa.init_full_state(NFA::DEAD, NFA::DEAD)?; - Ok(()) + fn add_dead_state_loop(&mut self) { + for b in 0..=255 { + self.nfa.add_transition(NFA::DEAD, b, NFA::DEAD); + } } } diff -Nru temporalio-1.3.0/vendor/aho-corasick/src/packed/api.rs temporalio-1.3.0/vendor/aho-corasick/src/packed/api.rs --- temporalio-1.3.0/vendor/aho-corasick/src/packed/api.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/aho-corasick/src/packed/api.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,7 +1,9 @@ -use alloc::sync::Arc; - use crate::{ - packed::{pattern::Patterns, rabinkarp::RabinKarp, teddy}, + packed::{ + pattern::Patterns, + rabinkarp::RabinKarp, + teddy::{self, Teddy}, + }, util::search::{Match, Span}, }; @@ -75,9 +77,7 @@ /// .collect(); /// assert_eq!(vec![PatternID::must(1)], matches); /// # Some(()) } -/// # if cfg!(all(feature = "std", any( -/// # target_arch = "x86_64", target_arch = "aarch64", -/// # ))) { +/// # if cfg!(all(feature = "std", target_arch = "x86_64")) { /// # example().unwrap() /// # } else { /// # assert!(example().is_none()); @@ -87,9 +87,8 @@ pub struct Config { kind: MatchKind, force: Option, - only_teddy_fat: Option, - only_teddy_256bit: Option, - heuristic_pattern_limits: bool, + force_teddy_fat: Option, + force_avx: Option, } /// An internal option for forcing the use of a particular packed algorithm. @@ -116,9 +115,8 @@ Config { kind: MatchKind::LeftmostFirst, force: None, - only_teddy_fat: None, - only_teddy_256bit: None, - heuristic_pattern_limits: true, + force_teddy_fat: None, + force_avx: None, } } @@ -140,7 +138,7 @@ /// should not use it as it is not part of the API stability guarantees of /// this crate. #[doc(hidden)] - pub fn only_teddy(&mut self, yes: bool) -> &mut Config { + pub fn force_teddy(&mut self, yes: bool) -> &mut Config { if yes { self.force = Some(ForceAlgorithm::Teddy); } else { @@ -155,8 +153,8 @@ /// should not use it as it is not part of the API stability guarantees of /// this crate. #[doc(hidden)] - pub fn only_teddy_fat(&mut self, yes: Option) -> &mut Config { - self.only_teddy_fat = yes; + pub fn force_teddy_fat(&mut self, yes: Option) -> &mut Config { + self.force_teddy_fat = yes; self } @@ -167,8 +165,8 @@ /// should not use it as it is not part of the API stability guarantees of /// this crate. #[doc(hidden)] - pub fn only_teddy_256bit(&mut self, yes: Option) -> &mut Config { - self.only_teddy_256bit = yes; + pub fn force_avx(&mut self, yes: Option) -> &mut Config { + self.force_avx = yes; self } @@ -178,7 +176,7 @@ /// should not use it as it is not part of the API stability guarantees of /// this crate. #[doc(hidden)] - pub fn only_rabin_karp(&mut self, yes: bool) -> &mut Config { + pub fn force_rabin_karp(&mut self, yes: bool) -> &mut Config { if yes { self.force = Some(ForceAlgorithm::RabinKarp); } else { @@ -186,17 +184,6 @@ } self } - - /// Request that heuristic limitations on the number of patterns be - /// employed. This useful to disable for benchmarking where one wants to - /// explore how Teddy performs on large number of patterns even if the - /// heuristics would otherwise refuse construction. - /// - /// This is enabled by default. - pub fn heuristic_pattern_limits(&mut self, yes: bool) -> &mut Config { - self.heuristic_pattern_limits = yes; - self - } } /// A builder for constructing a packed searcher from a collection of patterns. @@ -220,9 +207,7 @@ /// .collect(); /// assert_eq!(vec![PatternID::ZERO], matches); /// # Some(()) } -/// # if cfg!(all(feature = "std", any( -/// # target_arch = "x86_64", target_arch = "aarch64", -/// # ))) { +/// # if cfg!(all(feature = "std", target_arch = "x86_64")) { /// # example().unwrap() /// # } else { /// # assert!(example().is_none()); @@ -256,7 +241,6 @@ } let mut patterns = self.patterns.clone(); patterns.set_match_kind(self.config.kind); - let patterns = Arc::new(patterns); let rabinkarp = RabinKarp::new(&patterns); // Effectively, we only want to return a searcher if we can use Teddy, // since Teddy is our only fast packed searcher at the moment. @@ -266,7 +250,7 @@ let (search_kind, minimum_len) = match self.config.force { None | Some(ForceAlgorithm::Teddy) => { debug!("trying to build Teddy packed matcher"); - let teddy = match self.build_teddy(Arc::clone(&patterns)) { + let teddy = match self.build_teddy(&patterns) { None => return None, Some(teddy) => teddy, }; @@ -281,12 +265,11 @@ Some(Searcher { patterns, rabinkarp, search_kind, minimum_len }) } - fn build_teddy(&self, patterns: Arc) -> Option { + fn build_teddy(&self, patterns: &Patterns) -> Option { teddy::Builder::new() - .only_256bit(self.config.only_teddy_256bit) - .only_fat(self.config.only_teddy_fat) - .heuristic_pattern_limits(self.config.heuristic_pattern_limits) - .build(patterns) + .avx(self.config.force_avx) + .fat(self.config.force_teddy_fat) + .build(&patterns) } /// Add the given pattern to this set to match. @@ -344,16 +327,6 @@ } self } - - /// Returns the number of patterns added to this builder. - pub fn len(&self) -> usize { - self.patterns.len() - } - - /// Returns the length, in bytes, of the shortest pattern added. - pub fn minimum_len(&self) -> usize { - self.patterns.minimum_len() - } } impl Default for Builder { @@ -384,9 +357,7 @@ /// .collect(); /// assert_eq!(vec![PatternID::ZERO], matches); /// # Some(()) } -/// # if cfg!(all(feature = "std", any( -/// # target_arch = "x86_64", target_arch = "aarch64", -/// # ))) { +/// # if cfg!(all(feature = "std", target_arch = "x86_64")) { /// # example().unwrap() /// # } else { /// # assert!(example().is_none()); @@ -394,7 +365,7 @@ /// ``` #[derive(Clone, Debug)] pub struct Searcher { - patterns: Arc, + patterns: Patterns, rabinkarp: RabinKarp, search_kind: SearchKind, minimum_len: usize, @@ -402,7 +373,7 @@ #[derive(Clone, Debug)] enum SearchKind { - Teddy(teddy::Searcher), + Teddy(Teddy), RabinKarp, } @@ -429,9 +400,7 @@ /// .collect(); /// assert_eq!(vec![PatternID::ZERO], matches); /// # Some(()) } - /// # if cfg!(all(feature = "std", any( - /// # target_arch = "x86_64", target_arch = "aarch64", - /// # ))) { + /// # if cfg!(all(feature = "std", target_arch = "x86_64")) { /// # example().unwrap() /// # } else { /// # assert!(example().is_none()); @@ -479,9 +448,7 @@ /// assert_eq!(0, mat.start()); /// assert_eq!(6, mat.end()); /// # Some(()) } - /// # if cfg!(all(feature = "std", any( - /// # target_arch = "x86_64", target_arch = "aarch64", - /// # ))) { + /// # if cfg!(all(feature = "std", target_arch = "x86_64")) { /// # example().unwrap() /// # } else { /// # assert!(example().is_none()); @@ -517,9 +484,7 @@ /// assert_eq!(3, mat.start()); /// assert_eq!(9, mat.end()); /// # Some(()) } - /// # if cfg!(all(feature = "std", any( - /// # target_arch = "x86_64", target_arch = "aarch64", - /// # ))) { + /// # if cfg!(all(feature = "std", target_arch = "x86_64")) { /// # example().unwrap() /// # } else { /// # assert!(example().is_none()); @@ -537,11 +502,17 @@ if haystack[span].len() < teddy.minimum_len() { return self.find_in_slow(haystack, span); } - teddy.find(&haystack[..span.end], span.start) - } - SearchKind::RabinKarp => { - self.rabinkarp.find_at(&haystack[..span.end], span.start) + teddy.find_at( + &self.patterns, + &haystack[..span.end], + span.start, + ) } + SearchKind::RabinKarp => self.rabinkarp.find_at( + &self.patterns, + &haystack[..span.end], + span.start, + ), } } @@ -568,15 +539,12 @@ /// PatternID::must(1), /// ], matches); /// # Some(()) } - /// # if cfg!(all(feature = "std", any( - /// # target_arch = "x86_64", target_arch = "aarch64", - /// # ))) { + /// # if cfg!(all(feature = "std", target_arch = "x86_64")) { /// # example().unwrap() /// # } else { /// # assert!(example().is_none()); /// # } /// ``` - #[inline] pub fn find_iter<'a, 'b, B: ?Sized + AsRef<[u8]>>( &'a self, haystack: &'b B, @@ -600,15 +568,12 @@ /// // leftmost-first is the default. /// assert_eq!(&MatchKind::LeftmostFirst, searcher.match_kind()); /// # Some(()) } - /// # if cfg!(all(feature = "std", any( - /// # target_arch = "x86_64", target_arch = "aarch64", - /// # ))) { + /// # if cfg!(all(feature = "std", target_arch = "x86_64")) { /// # example().unwrap() /// # } else { /// # assert!(example().is_none()); /// # } /// ``` - #[inline] pub fn match_kind(&self) -> &MatchKind { self.patterns.match_kind() } @@ -623,14 +588,12 @@ /// want to avoid ever using the slower variant, which one can do by /// never passing a haystack shorter than the minimum length returned by /// this method. - #[inline] pub fn minimum_len(&self) -> usize { self.minimum_len } /// Returns the approximate total amount of heap used by this searcher, in /// units of bytes. - #[inline] pub fn memory_usage(&self) -> usize { self.patterns.memory_usage() + self.rabinkarp.memory_usage() @@ -644,7 +607,11 @@ /// built but the haystack is smaller than ~34 bytes, then Teddy might not /// be able to run. fn find_in_slow(&self, haystack: &[u8], span: Span) -> Option { - self.rabinkarp.find_at(&haystack[..span.end], span.start) + self.rabinkarp.find_at( + &self.patterns, + &haystack[..span.end], + span.start, + ) } } diff -Nru temporalio-1.3.0/vendor/aho-corasick/src/packed/ext.rs temporalio-1.3.0/vendor/aho-corasick/src/packed/ext.rs --- temporalio-1.3.0/vendor/aho-corasick/src/packed/ext.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/aho-corasick/src/packed/ext.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,39 +0,0 @@ -/// A trait for adding some helper routines to pointers. -pub(crate) trait Pointer { - /// Returns the distance, in units of `T`, between `self` and `origin`. - /// - /// # Safety - /// - /// Same as `ptr::offset_from` in addition to `self >= origin`. - unsafe fn distance(self, origin: Self) -> usize; - - /// Casts this pointer to `usize`. - /// - /// Callers should not convert the `usize` back to a pointer if at all - /// possible. (And if you believe it's necessary, open an issue to discuss - /// why. Otherwise, it has the potential to violate pointer provenance.) - /// The purpose of this function is just to be able to do arithmetic, i.e., - /// computing offsets or alignments. - fn as_usize(self) -> usize; -} - -impl Pointer for *const T { - unsafe fn distance(self, origin: *const T) -> usize { - // TODO: Replace with `ptr::sub_ptr` once stabilized. - usize::try_from(self.offset_from(origin)).unwrap_unchecked() - } - - fn as_usize(self) -> usize { - self as usize - } -} - -impl Pointer for *mut T { - unsafe fn distance(self, origin: *mut T) -> usize { - (self as *const T).distance(origin as *const T) - } - - fn as_usize(self) -> usize { - (self as *const T).as_usize() - } -} diff -Nru temporalio-1.3.0/vendor/aho-corasick/src/packed/mod.rs temporalio-1.3.0/vendor/aho-corasick/src/packed/mod.rs --- temporalio-1.3.0/vendor/aho-corasick/src/packed/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/aho-corasick/src/packed/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -40,9 +40,7 @@ .collect(); assert_eq!(vec![PatternID::ZERO], matches); # Some(()) } -# if cfg!(all(feature = "std", any( -# target_arch = "x86_64", target_arch = "aarch64", -# ))) { +# if cfg!(all(feature = "std", target_arch = "x86_64")) { # example().unwrap() # } else { # assert!(example().is_none()); @@ -68,9 +66,7 @@ .collect(); assert_eq!(vec![PatternID::must(1)], matches); # Some(()) } -# if cfg!(all(feature = "std", any( -# target_arch = "x86_64", target_arch = "aarch64", -# ))) { +# if cfg!(all(feature = "std", target_arch = "x86_64")) { # example().unwrap() # } else { # assert!(example().is_none()); @@ -99,8 +95,8 @@ so, but this limit may fluctuate based on available CPU features. * The available packed algorithms require CPU features that aren't available. For example, currently, this crate only provides packed algorithms for - `x86_64` and `aarch64`. Therefore, constructing a packed searcher on any - other target will always fail. + `x86_64`. Therefore, constructing a packed searcher on any other target + (e.g., ARM) will always fail. * Zero patterns were given, or one of the patterns given was empty. Packed searchers require at least one pattern and that all patterns are non-empty. * Something else about the nature of the patterns (typically based on @@ -111,10 +107,10 @@ pub use crate::packed::api::{Builder, Config, FindIter, MatchKind, Searcher}; mod api; -mod ext; mod pattern; mod rabinkarp; mod teddy; #[cfg(all(feature = "std", test))] mod tests; +#[cfg(all(feature = "std", target_arch = "x86_64"))] mod vector; diff -Nru temporalio-1.3.0/vendor/aho-corasick/src/packed/pattern.rs temporalio-1.3.0/vendor/aho-corasick/src/packed/pattern.rs --- temporalio-1.3.0/vendor/aho-corasick/src/packed/pattern.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/aho-corasick/src/packed/pattern.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,11 +1,14 @@ use core::{cmp, fmt, mem, u16, usize}; -use alloc::{boxed::Box, string::String, vec, vec::Vec}; +use alloc::{string::String, vec, vec::Vec}; -use crate::{ - packed::{api::MatchKind, ext::Pointer}, - PatternID, -}; +use crate::packed::api::MatchKind; + +/// The type used for representing a pattern identifier. +/// +/// We don't use `usize` here because our packed searchers don't scale to +/// huge numbers of patterns, so we keep things a bit smaller. +pub type PatternID = u16; /// A non-empty collection of non-empty patterns to search for. /// @@ -17,7 +20,7 @@ /// Note that this collection is not a set. The same pattern can appear more /// than once. #[derive(Clone, Debug)] -pub(crate) struct Patterns { +pub struct Patterns { /// The match semantics supported by this collection of patterns. /// /// The match semantics determines the order of the iterator over patterns. @@ -35,17 +38,14 @@ order: Vec, /// The length of the smallest pattern, in bytes. minimum_len: usize, + /// The largest pattern identifier. This should always be equivalent to + /// the number of patterns minus one in this collection. + max_pattern_id: PatternID, /// The total number of pattern bytes across the entire collection. This /// is used for reporting total heap usage in constant time. total_pattern_bytes: usize, } -// BREADCRUMBS: I think we want to experiment with a different bucket -// representation. Basically, each bucket is just a Range to a single -// contiguous allocation? Maybe length-prefixed patterns or something? The -// idea is to try to get rid of the pointer chasing in verification. I don't -// know that that is the issue, but I suspect it is. - impl Patterns { /// Create a new collection of patterns for the given match semantics. The /// ID of each pattern is the index of the pattern at which it occurs in @@ -54,12 +54,13 @@ /// If any of the patterns in the slice given are empty, then this panics. /// Similarly, if the number of patterns given is zero, then this also /// panics. - pub(crate) fn new() -> Patterns { + pub fn new() -> Patterns { Patterns { kind: MatchKind::default(), by_id: vec![], order: vec![], minimum_len: usize::MAX, + max_pattern_id: 0, total_pattern_bytes: 0, } } @@ -67,11 +68,12 @@ /// Add a pattern to this collection. /// /// This panics if the pattern given is empty. - pub(crate) fn add(&mut self, bytes: &[u8]) { + pub fn add(&mut self, bytes: &[u8]) { assert!(!bytes.is_empty()); assert!(self.by_id.len() <= u16::MAX as usize); - let id = PatternID::new(self.by_id.len()).unwrap(); + let id = self.by_id.len() as u16; + self.max_pattern_id = id; self.order.push(id); self.by_id.push(bytes.to_vec()); self.minimum_len = cmp::min(self.minimum_len, bytes.len()); @@ -81,7 +83,7 @@ /// Set the match kind semantics for this collection of patterns. /// /// If the kind is not set, then the default is leftmost-first. - pub(crate) fn set_match_kind(&mut self, kind: MatchKind) { + pub fn set_match_kind(&mut self, kind: MatchKind) { self.kind = kind; match self.kind { MatchKind::LeftmostFirst => { @@ -90,7 +92,10 @@ MatchKind::LeftmostLongest => { let (order, by_id) = (&mut self.order, &mut self.by_id); order.sort_by(|&id1, &id2| { - by_id[id1].len().cmp(&by_id[id2].len()).reverse() + by_id[id1 as usize] + .len() + .cmp(&by_id[id2 as usize].len()) + .reverse() }); } } @@ -99,18 +104,18 @@ /// Return the number of patterns in this collection. /// /// This is guaranteed to be greater than zero. - pub(crate) fn len(&self) -> usize { + pub fn len(&self) -> usize { self.by_id.len() } /// Returns true if and only if this collection of patterns is empty. - pub(crate) fn is_empty(&self) -> bool { + pub fn is_empty(&self) -> bool { self.len() == 0 } /// Returns the approximate total amount of heap used by these patterns, in /// units of bytes. - pub(crate) fn memory_usage(&self) -> usize { + pub fn memory_usage(&self) -> usize { self.order.len() * mem::size_of::() + self.by_id.len() * mem::size_of::>() + self.total_pattern_bytes @@ -118,29 +123,38 @@ /// Clears all heap memory associated with this collection of patterns and /// resets all state such that it is a valid empty collection. - pub(crate) fn reset(&mut self) { + pub fn reset(&mut self) { self.kind = MatchKind::default(); self.by_id.clear(); self.order.clear(); self.minimum_len = usize::MAX; + self.max_pattern_id = 0; + } + + /// Return the maximum pattern identifier in this collection. This can be + /// useful in searchers for ensuring that the collection of patterns they + /// are provided at search time and at build time have the same size. + pub fn max_pattern_id(&self) -> PatternID { + assert_eq!((self.max_pattern_id + 1) as usize, self.len()); + self.max_pattern_id } /// Returns the length, in bytes, of the smallest pattern. /// /// This is guaranteed to be at least one. - pub(crate) fn minimum_len(&self) -> usize { + pub fn minimum_len(&self) -> usize { self.minimum_len } /// Returns the match semantics used by these patterns. - pub(crate) fn match_kind(&self) -> &MatchKind { + pub fn match_kind(&self) -> &MatchKind { &self.kind } /// Return the pattern with the given identifier. If such a pattern does /// not exist, then this panics. - pub(crate) fn get(&self, id: PatternID) -> Pattern<'_> { - Pattern(&self.by_id[id]) + pub fn get(&self, id: PatternID) -> Pattern<'_> { + Pattern(&self.by_id[id as usize]) } /// Return the pattern with the given identifier without performing bounds @@ -150,8 +164,9 @@ /// /// Callers must ensure that a pattern with the given identifier exists /// before using this method. - pub(crate) unsafe fn get_unchecked(&self, id: PatternID) -> Pattern<'_> { - Pattern(self.by_id.get_unchecked(id.as_usize())) + #[cfg(all(feature = "std", target_arch = "x86_64"))] + pub unsafe fn get_unchecked(&self, id: PatternID) -> Pattern<'_> { + Pattern(self.by_id.get_unchecked(id as usize)) } /// Return an iterator over all the patterns in this collection, in the @@ -172,7 +187,7 @@ /// the order provided by this iterator, then the result is guaranteed /// to satisfy the correct match semantics. (Either leftmost-first or /// leftmost-longest.) - pub(crate) fn iter(&self) -> PatternIter<'_> { + pub fn iter(&self) -> PatternIter<'_> { PatternIter { patterns: self, i: 0 } } } @@ -185,7 +200,7 @@ /// The lifetime `'p` corresponds to the lifetime of the collection of patterns /// this is iterating over. #[derive(Debug)] -pub(crate) struct PatternIter<'p> { +pub struct PatternIter<'p> { patterns: &'p Patterns, i: usize, } @@ -206,7 +221,7 @@ /// A pattern that is used in packed searching. #[derive(Clone)] -pub(crate) struct Pattern<'a>(&'a [u8]); +pub struct Pattern<'a>(&'a [u8]); impl<'a> fmt::Debug for Pattern<'a> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { @@ -218,263 +233,97 @@ impl<'p> Pattern<'p> { /// Returns the length of this pattern, in bytes. - pub(crate) fn len(&self) -> usize { + pub fn len(&self) -> usize { self.0.len() } /// Returns the bytes of this pattern. - pub(crate) fn bytes(&self) -> &[u8] { + pub fn bytes(&self) -> &[u8] { &self.0 } /// Returns the first `len` low nybbles from this pattern. If this pattern /// is shorter than `len`, then this panics. - pub(crate) fn low_nybbles(&self, len: usize) -> Box<[u8]> { - let mut nybs = vec![0; len].into_boxed_slice(); - for (i, byte) in self.bytes().iter().take(len).enumerate() { - nybs[i] = byte & 0xF; + #[cfg(all(feature = "std", target_arch = "x86_64"))] + pub fn low_nybbles(&self, len: usize) -> Vec { + let mut nybs = vec![]; + for &b in self.bytes().iter().take(len) { + nybs.push(b & 0xF); } nybs } /// Returns true if this pattern is a prefix of the given bytes. #[inline(always)] - pub(crate) fn is_prefix(&self, bytes: &[u8]) -> bool { - is_prefix(bytes, self.bytes()) + pub fn is_prefix(&self, bytes: &[u8]) -> bool { + self.len() <= bytes.len() && self.equals(&bytes[..self.len()]) } - /// Returns true if this pattern is a prefix of the haystack given by the - /// raw `start` and `end` pointers. - /// - /// # Safety - /// - /// * It must be the case that `start < end` and that the distance between - /// them is at least equal to `V::BYTES`. That is, it must always be valid - /// to do at least an unaligned load of `V` at `start`. - /// * Both `start` and `end` must be valid for reads. - /// * Both `start` and `end` must point to an initialized value. - /// * Both `start` and `end` must point to the same allocated object and - /// must either be in bounds or at most one byte past the end of the - /// allocated object. - /// * Both `start` and `end` must be _derived from_ a pointer to the same - /// object. - /// * The distance between `start` and `end` must not overflow `isize`. - /// * The distance being in bounds must not rely on "wrapping around" the - /// address space. + /// Returns true if and only if this pattern equals the given bytes. #[inline(always)] - pub(crate) unsafe fn is_prefix_raw( - &self, - start: *const u8, - end: *const u8, - ) -> bool { - let patlen = self.bytes().len(); - let haylen = end.distance(start); - if patlen > haylen { + pub fn equals(&self, bytes: &[u8]) -> bool { + // Why not just use memcmp for this? Well, memcmp requires calling out + // to libc, and this routine is called in fairly hot code paths. Other + // than just calling out to libc, it also seems to result in worse + // codegen. By rolling our own memcpy in pure Rust, it seems to appear + // more friendly to the optimizer. + // + // This results in an improvement in just about every benchmark. Some + // smaller than others, but in some cases, up to 30% faster. + + let (x, y) = (self.bytes(), bytes); + if x.len() != y.len() { return false; } - // SAFETY: We've checked that the haystack has length at least equal - // to this pattern. All other safety concerns are the responsibility - // of the caller. - is_equal_raw(start, self.bytes().as_ptr(), patlen) - } -} - -/// Returns true if and only if `needle` is a prefix of `haystack`. -/// -/// This uses a latency optimized variant of `memcmp` internally which *might* -/// make this faster for very short strings. -/// -/// # Inlining -/// -/// This routine is marked `inline(always)`. If you want to call this function -/// in a way that is not always inlined, you'll need to wrap a call to it in -/// another function that is marked as `inline(never)` or just `inline`. -#[inline(always)] -fn is_prefix(haystack: &[u8], needle: &[u8]) -> bool { - if needle.len() > haystack.len() { - return false; - } - // SAFETY: Our pointers are derived directly from borrowed slices which - // uphold all of our safety guarantees except for length. We account for - // length with the check above. - unsafe { is_equal_raw(haystack.as_ptr(), needle.as_ptr(), needle.len()) } -} - -/// Compare corresponding bytes in `x` and `y` for equality. -/// -/// That is, this returns true if and only if `x.len() == y.len()` and -/// `x[i] == y[i]` for all `0 <= i < x.len()`. -/// -/// Note that this isn't used. We only use it in tests as a convenient way -/// of testing `is_equal_raw`. -/// -/// # Inlining -/// -/// This routine is marked `inline(always)`. If you want to call this function -/// in a way that is not always inlined, you'll need to wrap a call to it in -/// another function that is marked as `inline(never)` or just `inline`. -/// -/// # Motivation -/// -/// Why not use slice equality instead? Well, slice equality usually results in -/// a call out to the current platform's `libc` which might not be inlineable -/// or have other overhead. This routine isn't guaranteed to be a win, but it -/// might be in some cases. -#[cfg(test)] -#[inline(always)] -fn is_equal(x: &[u8], y: &[u8]) -> bool { - if x.len() != y.len() { - return false; - } - // SAFETY: Our pointers are derived directly from borrowed slices which - // uphold all of our safety guarantees except for length. We account for - // length with the check above. - unsafe { is_equal_raw(x.as_ptr(), y.as_ptr(), x.len()) } -} - -/// Compare `n` bytes at the given pointers for equality. -/// -/// This returns true if and only if `*x.add(i) == *y.add(i)` for all -/// `0 <= i < n`. -/// -/// # Inlining -/// -/// This routine is marked `inline(always)`. If you want to call this function -/// in a way that is not always inlined, you'll need to wrap a call to it in -/// another function that is marked as `inline(never)` or just `inline`. -/// -/// # Motivation -/// -/// Why not use slice equality instead? Well, slice equality usually results in -/// a call out to the current platform's `libc` which might not be inlineable -/// or have other overhead. This routine isn't guaranteed to be a win, but it -/// might be in some cases. -/// -/// # Safety -/// -/// * Both `x` and `y` must be valid for reads of up to `n` bytes. -/// * Both `x` and `y` must point to an initialized value. -/// * Both `x` and `y` must each point to an allocated object and -/// must either be in bounds or at most one byte past the end of the -/// allocated object. `x` and `y` do not need to point to the same allocated -/// object, but they may. -/// * Both `x` and `y` must be _derived from_ a pointer to their respective -/// allocated objects. -/// * The distance between `x` and `x+n` must not overflow `isize`. Similarly -/// for `y` and `y+n`. -/// * The distance being in bounds must not rely on "wrapping around" the -/// address space. -#[inline(always)] -unsafe fn is_equal_raw(mut x: *const u8, mut y: *const u8, n: usize) -> bool { - // If we don't have enough bytes to do 4-byte at a time loads, then - // handle each possible length specially. Note that I used to have a - // byte-at-a-time loop here and that turned out to be quite a bit slower - // for the memmem/pathological/defeat-simple-vector-alphabet benchmark. - if n < 4 { - return match n { - 0 => true, - 1 => x.read() == y.read(), - 2 => { - x.cast::().read_unaligned() - == y.cast::().read_unaligned() + // If we don't have enough bytes to do 4-byte at a time loads, then + // fall back to the naive slow version. + if x.len() < 4 { + for (&b1, &b2) in x.iter().zip(y) { + if b1 != b2 { + return false; + } } - // I also tried copy_nonoverlapping here and it looks like the - // codegen is the same. - 3 => x.cast::<[u8; 3]>().read() == y.cast::<[u8; 3]>().read(), - _ => unreachable!(), - }; - } - // When we have 4 or more bytes to compare, then proceed in chunks of 4 at - // a time using unaligned loads. - // - // Also, why do 4 byte loads instead of, say, 8 byte loads? The reason is - // that this particular version of memcmp is likely to be called with tiny - // needles. That means that if we do 8 byte loads, then a higher proportion - // of memcmp calls will use the slower variant above. With that said, this - // is a hypothesis and is only loosely supported by benchmarks. There's - // likely some improvement that could be made here. The main thing here - // though is to optimize for latency, not throughput. - - // SAFETY: The caller is responsible for ensuring the pointers we get are - // valid and readable for at least `n` bytes. We also do unaligned loads, - // so there's no need to ensure we're aligned. (This is justified by this - // routine being specifically for short strings.) - let xend = x.add(n.wrapping_sub(4)); - let yend = y.add(n.wrapping_sub(4)); - while x < xend { - let vx = x.cast::().read_unaligned(); - let vy = y.cast::().read_unaligned(); - if vx != vy { - return false; + return true; } - x = x.add(4); - y = y.add(4); - } - let vx = xend.cast::().read_unaligned(); - let vy = yend.cast::().read_unaligned(); - vx == vy -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn equals_different_lengths() { - assert!(!is_equal(b"", b"a")); - assert!(!is_equal(b"a", b"")); - assert!(!is_equal(b"ab", b"a")); - assert!(!is_equal(b"a", b"ab")); - } - - #[test] - fn equals_mismatch() { - let one_mismatch = [ - (&b"a"[..], &b"x"[..]), - (&b"ab"[..], &b"ax"[..]), - (&b"abc"[..], &b"abx"[..]), - (&b"abcd"[..], &b"abcx"[..]), - (&b"abcde"[..], &b"abcdx"[..]), - (&b"abcdef"[..], &b"abcdex"[..]), - (&b"abcdefg"[..], &b"abcdefx"[..]), - (&b"abcdefgh"[..], &b"abcdefgx"[..]), - (&b"abcdefghi"[..], &b"abcdefghx"[..]), - (&b"abcdefghij"[..], &b"abcdefghix"[..]), - (&b"abcdefghijk"[..], &b"abcdefghijx"[..]), - (&b"abcdefghijkl"[..], &b"abcdefghijkx"[..]), - (&b"abcdefghijklm"[..], &b"abcdefghijklx"[..]), - (&b"abcdefghijklmn"[..], &b"abcdefghijklmx"[..]), - ]; - for (x, y) in one_mismatch { - assert_eq!(x.len(), y.len(), "lengths should match"); - assert!(!is_equal(x, y)); - assert!(!is_equal(y, x)); + // When we have 4 or more bytes to compare, then proceed in chunks of 4 + // at a time using unaligned loads. + // + // Also, why do 4 byte loads instead of, say, 8 byte loads? The reason + // is that this particular version of memcmp is likely to be called + // with tiny needles. That means that if we do 8 byte loads, then a + // higher proportion of memcmp calls will use the slower variant above. + // With that said, this is a hypothesis and is only loosely supported + // by benchmarks. There's likely some improvement that could be made + // here. The main thing here though is to optimize for latency, not + // throughput. + + // SAFETY: Via the conditional above, we know that both `px` and `py` + // have the same length, so `px < pxend` implies that `py < pyend`. + // Thus, derefencing both `px` and `py` in the loop below is safe. + // + // Moreover, we set `pxend` and `pyend` to be 4 bytes before the actual + // end of of `px` and `py`. Thus, the final dereference outside of the + // loop is guaranteed to be valid. (The final comparison will overlap + // with the last comparison done in the loop for lengths that aren't + // multiples of four.) + // + // Finally, we needn't worry about alignment here, since we do + // unaligned loads. + unsafe { + let (mut px, mut py) = (x.as_ptr(), y.as_ptr()); + let (pxend, pyend) = (px.add(x.len() - 4), py.add(y.len() - 4)); + while px < pxend { + let vx = (px as *const u32).read_unaligned(); + let vy = (py as *const u32).read_unaligned(); + if vx != vy { + return false; + } + px = px.add(4); + py = py.add(4); + } + let vx = (pxend as *const u32).read_unaligned(); + let vy = (pyend as *const u32).read_unaligned(); + vx == vy } } - - #[test] - fn equals_yes() { - assert!(is_equal(b"", b"")); - assert!(is_equal(b"a", b"a")); - assert!(is_equal(b"ab", b"ab")); - assert!(is_equal(b"abc", b"abc")); - assert!(is_equal(b"abcd", b"abcd")); - assert!(is_equal(b"abcde", b"abcde")); - assert!(is_equal(b"abcdef", b"abcdef")); - assert!(is_equal(b"abcdefg", b"abcdefg")); - assert!(is_equal(b"abcdefgh", b"abcdefgh")); - assert!(is_equal(b"abcdefghi", b"abcdefghi")); - } - - #[test] - fn prefix() { - assert!(is_prefix(b"", b"")); - assert!(is_prefix(b"a", b"")); - assert!(is_prefix(b"ab", b"")); - assert!(is_prefix(b"foo", b"foo")); - assert!(is_prefix(b"foobar", b"foo")); - - assert!(!is_prefix(b"foo", b"fob")); - assert!(!is_prefix(b"foobar", b"fob")); - } } diff -Nru temporalio-1.3.0/vendor/aho-corasick/src/packed/rabinkarp.rs temporalio-1.3.0/vendor/aho-corasick/src/packed/rabinkarp.rs --- temporalio-1.3.0/vendor/aho-corasick/src/packed/rabinkarp.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/aho-corasick/src/packed/rabinkarp.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,6 +1,9 @@ -use alloc::{sync::Arc, vec, vec::Vec}; +use alloc::{vec, vec::Vec}; -use crate::{packed::pattern::Patterns, util::search::Match, PatternID}; +use crate::{ + packed::pattern::{PatternID, Patterns}, + util::search::Match, +}; /// The type of the rolling hash used in the Rabin-Karp algorithm. type Hash = usize; @@ -33,9 +36,7 @@ /// But ESMAJ provides something a bit more concrete: /// https://www-igm.univ-mlv.fr/~lecroq/string/node5.html #[derive(Clone, Debug)] -pub(crate) struct RabinKarp { - /// The patterns we're searching for. - patterns: Arc, +pub struct RabinKarp { /// The order of patterns in each bucket is significant. Namely, they are /// arranged such that the first one to match is the correct match. This /// may not necessarily correspond to the order provided by the caller. @@ -50,6 +51,16 @@ /// The factor to subtract out of a hash before updating it with a new /// byte. hash_2pow: usize, + /// The maximum identifier of a pattern. This is used as a sanity check + /// to ensure that the patterns provided by the caller are the same as + /// the patterns that were used to compile the matcher. This sanity check + /// possibly permits safely eliminating bounds checks regardless of what + /// patterns are provided by the caller. + /// + /// (Currently, we don't use this to elide bounds checks since it doesn't + /// result in a measurable performance improvement, but we do use it for + /// better failure modes.) + max_pattern_id: PatternID, } impl RabinKarp { @@ -57,7 +68,7 @@ /// /// This panics if any of the patterns in the collection are empty, or if /// the collection is itself empty. - pub(crate) fn new(patterns: &Arc) -> RabinKarp { + pub fn new(patterns: &Patterns) -> RabinKarp { assert!(patterns.len() >= 1); let hash_len = patterns.minimum_len(); assert!(hash_len >= 1); @@ -68,10 +79,10 @@ } let mut rk = RabinKarp { - patterns: Arc::clone(patterns), buckets: vec![vec![]; NUM_BUCKETS], hash_len, hash_2pow, + max_pattern_id: patterns.max_pattern_id(), }; for (id, pat) in patterns.iter() { let hash = rk.hash(&pat.bytes()[..rk.hash_len]); @@ -83,12 +94,18 @@ /// Return the first matching pattern in the given haystack, begining the /// search at `at`. - pub(crate) fn find_at( + pub fn find_at( &self, + patterns: &Patterns, haystack: &[u8], mut at: usize, ) -> Option { assert_eq!(NUM_BUCKETS, self.buckets.len()); + assert_eq!( + self.max_pattern_id, + patterns.max_pattern_id(), + "Rabin-Karp must be called with same patterns it was built with", + ); if at + self.hash_len > haystack.len() { return None; @@ -98,7 +115,7 @@ let bucket = &self.buckets[hash % NUM_BUCKETS]; for &(phash, pid) in bucket { if phash == hash { - if let Some(c) = self.verify(pid, haystack, at) { + if let Some(c) = self.verify(patterns, pid, haystack, at) { return Some(c); } } @@ -117,9 +134,10 @@ /// Returns the approximate total amount of heap used by this searcher, in /// units of bytes. - pub(crate) fn memory_usage(&self) -> usize { + pub fn memory_usage(&self) -> usize { + let num_patterns = self.max_pattern_id as usize + 1; self.buckets.len() * core::mem::size_of::>() - + self.patterns.len() * core::mem::size_of::<(Hash, PatternID)>() + + num_patterns * core::mem::size_of::<(Hash, PatternID)>() } /// Verify whether the pattern with the given id matches at @@ -134,13 +152,14 @@ #[cold] fn verify( &self, + patterns: &Patterns, id: PatternID, haystack: &[u8], at: usize, ) -> Option { - let pat = self.patterns.get(id); + let pat = patterns.get(id); if pat.is_prefix(&haystack[at..]) { - Some(Match::new(id, at..at + pat.len())) + Some(Match::must(id as usize, at..at + pat.len())) } else { None } diff -Nru temporalio-1.3.0/vendor/aho-corasick/src/packed/teddy/builder.rs temporalio-1.3.0/vendor/aho-corasick/src/packed/teddy/builder.rs --- temporalio-1.3.0/vendor/aho-corasick/src/packed/teddy/builder.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/aho-corasick/src/packed/teddy/builder.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,780 +0,0 @@ -use core::{ - fmt::Debug, - panic::{RefUnwindSafe, UnwindSafe}, -}; - -use alloc::sync::Arc; - -use crate::packed::{ext::Pointer, pattern::Patterns, teddy::generic::Match}; - -/// A builder for constructing a Teddy matcher. -/// -/// The builder primarily permits fine grained configuration of the Teddy -/// matcher. Most options are made only available for testing/benchmarking -/// purposes. In reality, options are automatically determined by the nature -/// and number of patterns given to the builder. -#[derive(Clone, Debug)] -pub(crate) struct Builder { - /// When none, this is automatically determined. Otherwise, `false` means - /// slim Teddy is used (8 buckets) and `true` means fat Teddy is used - /// (16 buckets). Fat Teddy requires AVX2, so if that CPU feature isn't - /// available and Fat Teddy was requested, no matcher will be built. - only_fat: Option, - /// When none, this is automatically determined. Otherwise, `false` means - /// that 128-bit vectors will be used (up to SSSE3 instructions) where as - /// `true` means that 256-bit vectors will be used. As with `fat`, if - /// 256-bit vectors are requested and they aren't available, then a - /// searcher will not be built. - only_256bit: Option, - /// When true (the default), the number of patterns will be used as a - /// heuristic for refusing construction of a Teddy searcher. The point here - /// is that too many patterns can overwhelm Teddy. But this can be disabled - /// in cases where the caller knows better. - heuristic_pattern_limits: bool, -} - -impl Default for Builder { - fn default() -> Builder { - Builder::new() - } -} - -impl Builder { - /// Create a new builder for configuring a Teddy matcher. - pub(crate) fn new() -> Builder { - Builder { - only_fat: None, - only_256bit: None, - heuristic_pattern_limits: true, - } - } - - /// Build a matcher for the set of patterns given. If a matcher could not - /// be built, then `None` is returned. - /// - /// Generally, a matcher isn't built if the necessary CPU features aren't - /// available, an unsupported target or if the searcher is believed to be - /// slower than standard techniques (i.e., if there are too many literals). - pub(crate) fn build(&self, patterns: Arc) -> Option { - self.build_imp(patterns) - } - - /// Require the use of Fat (true) or Slim (false) Teddy. Fat Teddy uses - /// 16 buckets where as Slim Teddy uses 8 buckets. More buckets are useful - /// for a larger set of literals. - /// - /// `None` is the default, which results in an automatic selection based - /// on the number of literals and available CPU features. - pub(crate) fn only_fat(&mut self, yes: Option) -> &mut Builder { - self.only_fat = yes; - self - } - - /// Request the use of 256-bit vectors (true) or 128-bit vectors (false). - /// Generally, a larger vector size is better since it either permits - /// matching more patterns or matching more bytes in the haystack at once. - /// - /// `None` is the default, which results in an automatic selection based on - /// the number of literals and available CPU features. - pub(crate) fn only_256bit(&mut self, yes: Option) -> &mut Builder { - self.only_256bit = yes; - self - } - - /// Request that heuristic limitations on the number of patterns be - /// employed. This useful to disable for benchmarking where one wants to - /// explore how Teddy performs on large number of patterns even if the - /// heuristics would otherwise refuse construction. - /// - /// This is enabled by default. - pub(crate) fn heuristic_pattern_limits( - &mut self, - yes: bool, - ) -> &mut Builder { - self.heuristic_pattern_limits = yes; - self - } - - fn build_imp(&self, patterns: Arc) -> Option { - let patlimit = self.heuristic_pattern_limits; - // There's no particular reason why we limit ourselves to little endian - // here, but it seems likely that some parts of Teddy as they are - // currently written (e.g., the uses of `trailing_zeros`) are likely - // wrong on non-little-endian targets. Such things are likely easy to - // fix, but at the time of writing (2023/09/18), I actually do not know - // how to test this code on a big-endian target. So for now, we're - // conservative and just bail out. - if !cfg!(target_endian = "little") { - debug!("skipping Teddy because target isn't little endian"); - return None; - } - // Too many patterns will overwhelm Teddy and likely lead to slow - // downs, typically in the verification step. - if patlimit && patterns.len() > 64 { - debug!("skipping Teddy because of too many patterns"); - return None; - } - - #[cfg(all(target_arch = "x86_64", target_feature = "sse2"))] - { - use self::x86_64::{FatAVX2, SlimAVX2, SlimSSSE3}; - - let mask_len = core::cmp::min(4, patterns.minimum_len()); - let beefy = patterns.len() > 32; - let has_avx2 = self::x86_64::is_available_avx2(); - let has_ssse3 = has_avx2 || self::x86_64::is_available_ssse3(); - let use_avx2 = if self.only_256bit == Some(true) { - if !has_avx2 { - debug!( - "skipping Teddy because avx2 was demanded but unavailable" - ); - return None; - } - true - } else if self.only_256bit == Some(false) { - if !has_ssse3 { - debug!( - "skipping Teddy because ssse3 was demanded but unavailable" - ); - return None; - } - false - } else if !has_ssse3 && !has_avx2 { - debug!( - "skipping Teddy because ssse3 and avx2 are unavailable" - ); - return None; - } else { - has_avx2 - }; - let fat = match self.only_fat { - None => use_avx2 && beefy, - Some(false) => false, - Some(true) if !use_avx2 => { - debug!( - "skipping Teddy because fat was demanded, but fat \ - Teddy requires avx2 which is unavailable" - ); - return None; - } - Some(true) => true, - }; - // Just like for aarch64, it's possible that too many patterns will - // overhwelm Teddy. Unlike aarch64 though, we have Fat teddy which - // helps things scale a bit more by spreading patterns over more - // buckets. - // - // These thresholds were determined by looking at the measurements - // for the rust/aho-corasick/packed/leftmost-first and - // rust/aho-corasick/dfa/leftmost-first engines on the `teddy/` - // benchmarks. - if patlimit && mask_len == 1 && patterns.len() > 16 { - debug!( - "skipping Teddy (mask len: 1) because there are \ - too many patterns", - ); - return None; - } - match (mask_len, use_avx2, fat) { - (1, false, _) => { - debug!("Teddy choice: 128-bit slim, 1 byte"); - SlimSSSE3::<1>::new(&patterns) - } - (1, true, false) => { - debug!("Teddy choice: 256-bit slim, 1 byte"); - SlimAVX2::<1>::new(&patterns) - } - (1, true, true) => { - debug!("Teddy choice: 256-bit fat, 1 byte"); - FatAVX2::<1>::new(&patterns) - } - (2, false, _) => { - debug!("Teddy choice: 128-bit slim, 2 bytes"); - SlimSSSE3::<2>::new(&patterns) - } - (2, true, false) => { - debug!("Teddy choice: 256-bit slim, 2 bytes"); - SlimAVX2::<2>::new(&patterns) - } - (2, true, true) => { - debug!("Teddy choice: 256-bit fat, 2 bytes"); - FatAVX2::<2>::new(&patterns) - } - (3, false, _) => { - debug!("Teddy choice: 128-bit slim, 3 bytes"); - SlimSSSE3::<3>::new(&patterns) - } - (3, true, false) => { - debug!("Teddy choice: 256-bit slim, 3 bytes"); - SlimAVX2::<3>::new(&patterns) - } - (3, true, true) => { - debug!("Teddy choice: 256-bit fat, 3 bytes"); - FatAVX2::<3>::new(&patterns) - } - (4, false, _) => { - debug!("Teddy choice: 128-bit slim, 4 bytes"); - SlimSSSE3::<4>::new(&patterns) - } - (4, true, false) => { - debug!("Teddy choice: 256-bit slim, 4 bytes"); - SlimAVX2::<4>::new(&patterns) - } - (4, true, true) => { - debug!("Teddy choice: 256-bit fat, 4 bytes"); - FatAVX2::<4>::new(&patterns) - } - _ => { - debug!("no supported Teddy configuration found"); - None - } - } - } - #[cfg(target_arch = "aarch64")] - { - use self::aarch64::SlimNeon; - - let mask_len = core::cmp::min(4, patterns.minimum_len()); - if self.only_256bit == Some(true) { - debug!( - "skipping Teddy because 256-bits were demanded \ - but unavailable" - ); - return None; - } - if self.only_fat == Some(true) { - debug!( - "skipping Teddy because fat was demanded but unavailable" - ); - } - // Since we don't have Fat teddy in aarch64 (I think we'd want at - // least 256-bit vectors for that), we need to be careful not to - // allow too many patterns as it might overwhelm Teddy. Generally - // speaking, as the mask length goes up, the more patterns we can - // handle because the mask length results in fewer candidates - // generated. - // - // These thresholds were determined by looking at the measurements - // for the rust/aho-corasick/packed/leftmost-first and - // rust/aho-corasick/dfa/leftmost-first engines on the `teddy/` - // benchmarks. - match mask_len { - 1 => { - if patlimit && patterns.len() > 16 { - debug!( - "skipping Teddy (mask len: 1) because there are \ - too many patterns", - ); - } - debug!("Teddy choice: 128-bit slim, 1 byte"); - SlimNeon::<1>::new(&patterns) - } - 2 => { - if patlimit && patterns.len() > 32 { - debug!( - "skipping Teddy (mask len: 2) because there are \ - too many patterns", - ); - } - debug!("Teddy choice: 128-bit slim, 2 bytes"); - SlimNeon::<2>::new(&patterns) - } - 3 => { - if patlimit && patterns.len() > 48 { - debug!( - "skipping Teddy (mask len: 3) because there are \ - too many patterns", - ); - } - debug!("Teddy choice: 128-bit slim, 3 bytes"); - SlimNeon::<3>::new(&patterns) - } - 4 => { - debug!("Teddy choice: 128-bit slim, 4 bytes"); - SlimNeon::<4>::new(&patterns) - } - _ => { - debug!("no supported Teddy configuration found"); - None - } - } - } - #[cfg(not(any( - all(target_arch = "x86_64", target_feature = "sse2"), - target_arch = "aarch64" - )))] - { - None - } - } -} - -/// A searcher that dispatches to one of several possible Teddy variants. -#[derive(Clone, Debug)] -pub(crate) struct Searcher { - /// The Teddy variant we use. We use dynamic dispatch under the theory that - /// it results in better codegen then a enum, although this is a specious - /// claim. - /// - /// This `Searcher` is essentially a wrapper for a `SearcherT` trait - /// object. We just make `memory_usage` and `minimum_len` available without - /// going through dynamic dispatch. - imp: Arc, - /// Total heap memory used by the Teddy variant. - memory_usage: usize, - /// The minimum haystack length this searcher can handle. It is intended - /// for callers to use some other search routine (such as Rabin-Karp) in - /// cases where the haystack (or remainer of the haystack) is too short. - minimum_len: usize, -} - -impl Searcher { - /// Look for the leftmost occurrence of any pattern in this search in the - /// given haystack starting at the given position. - /// - /// # Panics - /// - /// This panics when `haystack[at..].len()` is less than the minimum length - /// for this haystack. - #[inline(always)] - pub(crate) fn find( - &self, - haystack: &[u8], - at: usize, - ) -> Option { - // SAFETY: The Teddy implementations all require a minimum haystack - // length, and this is required for safety. Therefore, we assert it - // here in order to make this method sound. - assert!(haystack[at..].len() >= self.minimum_len); - let hayptr = haystack.as_ptr(); - // SAFETY: Construction of the searcher guarantees that we are able - // to run it in the current environment (i.e., we won't get an AVX2 - // searcher on a x86-64 CPU without AVX2 support). Also, the pointers - // are valid as they are derived directly from a borrowed slice. - let teddym = unsafe { - self.imp.find(hayptr.add(at), hayptr.add(haystack.len()))? - }; - let start = teddym.start().as_usize().wrapping_sub(hayptr.as_usize()); - let end = teddym.end().as_usize().wrapping_sub(hayptr.as_usize()); - let span = crate::Span { start, end }; - // OK because we won't permit the construction of a searcher that - // could report a pattern ID bigger than what can fit in the crate-wide - // PatternID type. - let pid = crate::PatternID::new_unchecked(teddym.pattern().as_usize()); - let m = crate::Match::new(pid, span); - Some(m) - } - - /// Returns the approximate total amount of heap used by this type, in - /// units of bytes. - #[inline(always)] - pub(crate) fn memory_usage(&self) -> usize { - self.memory_usage - } - - /// Returns the minimum length, in bytes, that a haystack must be in order - /// to use it with this searcher. - #[inline(always)] - pub(crate) fn minimum_len(&self) -> usize { - self.minimum_len - } -} - -/// A trait that provides dynamic dispatch over the different possible Teddy -/// variants on the same algorithm. -/// -/// On `x86_64` for example, it isn't known until runtime which of 12 possible -/// variants will be used. One might use one of the four slim 128-bit vector -/// variants, or one of the four 256-bit vector variants or even one of the -/// four fat 256-bit vector variants. -/// -/// Since this choice is generally made when the Teddy searcher is constructed -/// and this choice is based on the patterns given and what the current CPU -/// supports, it follows that there must be some kind of indirection at search -/// time that "selects" the variant chosen at build time. -/// -/// There are a few different ways to go about this. One approach is to use an -/// enum. It works fine, but in my experiments, this generally results in worse -/// codegen. Another approach, which is what we use here, is dynamic dispatch -/// via a trait object. We basically implement this trait for each possible -/// variant, select the variant we want at build time and convert it to a -/// trait object for use at search time. -/// -/// Another approach is to use function pointers and stick each of the possible -/// variants into a union. This is essentially isomorphic to the dynamic -/// dispatch approach, but doesn't require any allocations. Since this crate -/// requires `alloc`, there's no real reason (AFAIK) to go down this path. (The -/// `memchr` crate does this.) -trait SearcherT: - Debug + Send + Sync + UnwindSafe + RefUnwindSafe + 'static -{ - /// Execute a search on the given haystack (identified by `start` and `end` - /// raw pointers). - /// - /// # Safety - /// - /// Essentially, the `start` and `end` pointers must be valid and point - /// to a haystack one can read. As long as you derive them from, for - /// example, a `&[u8]`, they should automatically satisfy all of the safety - /// obligations: - /// - /// * Both `start` and `end` must be valid for reads. - /// * Both `start` and `end` must point to an initialized value. - /// * Both `start` and `end` must point to the same allocated object and - /// must either be in bounds or at most one byte past the end of the - /// allocated object. - /// * Both `start` and `end` must be _derived from_ a pointer to the same - /// object. - /// * The distance between `start` and `end` must not overflow `isize`. - /// * The distance being in bounds must not rely on "wrapping around" the - /// address space. - /// * It must be the case that `start <= end`. - /// * `end - start` must be greater than the minimum length for this - /// searcher. - /// - /// Also, it is expected that implementations of this trait will tag this - /// method with a `target_feature` attribute. Callers must ensure that - /// they are executing this method in an environment where that attribute - /// is valid. - unsafe fn find(&self, start: *const u8, end: *const u8) -> Option; -} - -#[cfg(all(target_arch = "x86_64", target_feature = "sse2"))] -mod x86_64 { - use core::arch::x86_64::{__m128i, __m256i}; - - use alloc::sync::Arc; - - use crate::packed::{ - ext::Pointer, - pattern::Patterns, - teddy::generic::{self, Match}, - }; - - use super::{Searcher, SearcherT}; - - #[derive(Clone, Debug)] - pub(super) struct SlimSSSE3 { - slim128: generic::Slim<__m128i, BYTES>, - } - - // Defines SlimSSSE3 wrapper functions for 1, 2, 3 and 4 bytes. - macro_rules! slim_ssse3 { - ($len:expr) => { - impl SlimSSSE3<$len> { - /// Creates a new searcher using "slim" Teddy with 128-bit - /// vectors. If SSSE3 is not available in the current - /// environment, then this returns `None`. - pub(super) fn new( - patterns: &Arc, - ) -> Option { - if !is_available_ssse3() { - return None; - } - Some(unsafe { SlimSSSE3::<$len>::new_unchecked(patterns) }) - } - - /// Creates a new searcher using "slim" Teddy with 256-bit - /// vectors without checking whether SSSE3 is available or not. - /// - /// # Safety - /// - /// Callers must ensure that SSSE3 is available in the current - /// environment. - #[target_feature(enable = "ssse3")] - unsafe fn new_unchecked(patterns: &Arc) -> Searcher { - let slim128 = generic::Slim::<__m128i, $len>::new( - Arc::clone(patterns), - ); - let memory_usage = slim128.memory_usage(); - let minimum_len = slim128.minimum_len(); - let imp = Arc::new(SlimSSSE3 { slim128 }); - Searcher { imp, memory_usage, minimum_len } - } - } - - impl SearcherT for SlimSSSE3<$len> { - #[target_feature(enable = "ssse3")] - #[inline] - unsafe fn find( - &self, - start: *const u8, - end: *const u8, - ) -> Option { - // SAFETY: All obligations except for `target_feature` are - // passed to the caller. Our use of `target_feature` is - // safe because construction of this type requires that the - // requisite target features are available. - self.slim128.find(start, end) - } - } - }; - } - - slim_ssse3!(1); - slim_ssse3!(2); - slim_ssse3!(3); - slim_ssse3!(4); - - #[derive(Clone, Debug)] - pub(super) struct SlimAVX2 { - slim128: generic::Slim<__m128i, BYTES>, - slim256: generic::Slim<__m256i, BYTES>, - } - - // Defines SlimAVX2 wrapper functions for 1, 2, 3 and 4 bytes. - macro_rules! slim_avx2 { - ($len:expr) => { - impl SlimAVX2<$len> { - /// Creates a new searcher using "slim" Teddy with 256-bit - /// vectors. If AVX2 is not available in the current - /// environment, then this returns `None`. - pub(super) fn new( - patterns: &Arc, - ) -> Option { - if !is_available_avx2() { - return None; - } - Some(unsafe { SlimAVX2::<$len>::new_unchecked(patterns) }) - } - - /// Creates a new searcher using "slim" Teddy with 256-bit - /// vectors without checking whether AVX2 is available or not. - /// - /// # Safety - /// - /// Callers must ensure that AVX2 is available in the current - /// environment. - #[target_feature(enable = "avx2")] - unsafe fn new_unchecked(patterns: &Arc) -> Searcher { - let slim128 = generic::Slim::<__m128i, $len>::new( - Arc::clone(&patterns), - ); - let slim256 = generic::Slim::<__m256i, $len>::new( - Arc::clone(&patterns), - ); - let memory_usage = - slim128.memory_usage() + slim256.memory_usage(); - let minimum_len = slim128.minimum_len(); - let imp = Arc::new(SlimAVX2 { slim128, slim256 }); - Searcher { imp, memory_usage, minimum_len } - } - } - - impl SearcherT for SlimAVX2<$len> { - #[target_feature(enable = "avx2")] - #[inline] - unsafe fn find( - &self, - start: *const u8, - end: *const u8, - ) -> Option { - // SAFETY: All obligations except for `target_feature` are - // passed to the caller. Our use of `target_feature` is - // safe because construction of this type requires that the - // requisite target features are available. - let len = end.distance(start); - if len < self.slim256.minimum_len() { - self.slim128.find(start, end) - } else { - self.slim256.find(start, end) - } - } - } - }; - } - - slim_avx2!(1); - slim_avx2!(2); - slim_avx2!(3); - slim_avx2!(4); - - #[derive(Clone, Debug)] - pub(super) struct FatAVX2 { - fat256: generic::Fat<__m256i, BYTES>, - } - - // Defines SlimAVX2 wrapper functions for 1, 2, 3 and 4 bytes. - macro_rules! fat_avx2 { - ($len:expr) => { - impl FatAVX2<$len> { - /// Creates a new searcher using "slim" Teddy with 256-bit - /// vectors. If AVX2 is not available in the current - /// environment, then this returns `None`. - pub(super) fn new( - patterns: &Arc, - ) -> Option { - if !is_available_avx2() { - return None; - } - Some(unsafe { FatAVX2::<$len>::new_unchecked(patterns) }) - } - - /// Creates a new searcher using "slim" Teddy with 256-bit - /// vectors without checking whether AVX2 is available or not. - /// - /// # Safety - /// - /// Callers must ensure that AVX2 is available in the current - /// environment. - #[target_feature(enable = "avx2")] - unsafe fn new_unchecked(patterns: &Arc) -> Searcher { - let fat256 = generic::Fat::<__m256i, $len>::new( - Arc::clone(&patterns), - ); - let memory_usage = fat256.memory_usage(); - let minimum_len = fat256.minimum_len(); - let imp = Arc::new(FatAVX2 { fat256 }); - Searcher { imp, memory_usage, minimum_len } - } - } - - impl SearcherT for FatAVX2<$len> { - #[target_feature(enable = "avx2")] - #[inline] - unsafe fn find( - &self, - start: *const u8, - end: *const u8, - ) -> Option { - // SAFETY: All obligations except for `target_feature` are - // passed to the caller. Our use of `target_feature` is - // safe because construction of this type requires that the - // requisite target features are available. - self.fat256.find(start, end) - } - } - }; - } - - fat_avx2!(1); - fat_avx2!(2); - fat_avx2!(3); - fat_avx2!(4); - - #[inline] - pub(super) fn is_available_ssse3() -> bool { - #[cfg(not(target_feature = "sse2"))] - { - false - } - #[cfg(target_feature = "sse2")] - { - #[cfg(target_feature = "ssse3")] - { - true - } - #[cfg(not(target_feature = "ssse3"))] - { - #[cfg(feature = "std")] - { - std::is_x86_feature_detected!("ssse3") - } - #[cfg(not(feature = "std"))] - { - false - } - } - } - } - - #[inline] - pub(super) fn is_available_avx2() -> bool { - #[cfg(not(target_feature = "sse2"))] - { - false - } - #[cfg(target_feature = "sse2")] - { - #[cfg(target_feature = "avx2")] - { - true - } - #[cfg(not(target_feature = "avx2"))] - { - #[cfg(feature = "std")] - { - std::is_x86_feature_detected!("avx2") - } - #[cfg(not(feature = "std"))] - { - false - } - } - } - } -} - -#[cfg(target_arch = "aarch64")] -mod aarch64 { - use core::arch::aarch64::uint8x16_t; - - use alloc::sync::Arc; - - use crate::packed::{ - pattern::Patterns, - teddy::generic::{self, Match}, - }; - - use super::{Searcher, SearcherT}; - - #[derive(Clone, Debug)] - pub(super) struct SlimNeon { - slim128: generic::Slim, - } - - // Defines SlimSSSE3 wrapper functions for 1, 2, 3 and 4 bytes. - macro_rules! slim_neon { - ($len:expr) => { - impl SlimNeon<$len> { - /// Creates a new searcher using "slim" Teddy with 128-bit - /// vectors. If SSSE3 is not available in the current - /// environment, then this returns `None`. - pub(super) fn new( - patterns: &Arc, - ) -> Option { - Some(unsafe { SlimNeon::<$len>::new_unchecked(patterns) }) - } - - /// Creates a new searcher using "slim" Teddy with 256-bit - /// vectors without checking whether SSSE3 is available or not. - /// - /// # Safety - /// - /// Callers must ensure that SSSE3 is available in the current - /// environment. - #[target_feature(enable = "neon")] - unsafe fn new_unchecked(patterns: &Arc) -> Searcher { - let slim128 = generic::Slim::::new( - Arc::clone(patterns), - ); - let memory_usage = slim128.memory_usage(); - let minimum_len = slim128.minimum_len(); - let imp = Arc::new(SlimNeon { slim128 }); - Searcher { imp, memory_usage, minimum_len } - } - } - - impl SearcherT for SlimNeon<$len> { - #[target_feature(enable = "neon")] - #[inline] - unsafe fn find( - &self, - start: *const u8, - end: *const u8, - ) -> Option { - // SAFETY: All obligations except for `target_feature` are - // passed to the caller. Our use of `target_feature` is - // safe because construction of this type requires that the - // requisite target features are available. - self.slim128.find(start, end) - } - } - }; - } - - slim_neon!(1); - slim_neon!(2); - slim_neon!(3); - slim_neon!(4); -} diff -Nru temporalio-1.3.0/vendor/aho-corasick/src/packed/teddy/compile.rs temporalio-1.3.0/vendor/aho-corasick/src/packed/teddy/compile.rs --- temporalio-1.3.0/vendor/aho-corasick/src/packed/teddy/compile.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/aho-corasick/src/packed/teddy/compile.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,502 @@ +// See the README in this directory for an explanation of the Teddy algorithm. + +use core::{cmp, fmt}; + +use alloc::{collections::BTreeMap, format, vec, vec::Vec}; + +use crate::packed::{ + pattern::{PatternID, Patterns}, + teddy::Teddy, +}; + +/// A builder for constructing a Teddy matcher. +/// +/// The builder primarily permits fine grained configuration of the Teddy +/// matcher. Most options are made only available for testing/benchmarking +/// purposes. In reality, options are automatically determined by the nature +/// and number of patterns given to the builder. +#[derive(Clone, Debug)] +pub struct Builder { + /// When none, this is automatically determined. Otherwise, `false` means + /// slim Teddy is used (8 buckets) and `true` means fat Teddy is used + /// (16 buckets). Fat Teddy requires AVX2, so if that CPU feature isn't + /// available and Fat Teddy was requested, no matcher will be built. + fat: Option, + /// When none, this is automatically determined. Otherwise, `false` means + /// that 128-bit vectors will be used (up to SSSE3 instructions) where as + /// `true` means that 256-bit vectors will be used. As with `fat`, if + /// 256-bit vectors are requested and they aren't available, then a + /// searcher will not be built. + avx: Option, +} + +impl Default for Builder { + fn default() -> Builder { + Builder::new() + } +} + +impl Builder { + /// Create a new builder for configuring a Teddy matcher. + pub fn new() -> Builder { + Builder { fat: None, avx: None } + } + + /// Build a matcher for the set of patterns given. If a matcher could not + /// be built, then `None` is returned. + /// + /// Generally, a matcher isn't built if the necessary CPU features aren't + /// available, an unsupported target or if the searcher is believed to be + /// slower than standard techniques (i.e., if there are too many literals). + pub fn build(&self, patterns: &Patterns) -> Option { + self.build_imp(patterns) + } + + /// Require the use of Fat (true) or Slim (false) Teddy. Fat Teddy uses + /// 16 buckets where as Slim Teddy uses 8 buckets. More buckets are useful + /// for a larger set of literals. + /// + /// `None` is the default, which results in an automatic selection based + /// on the number of literals and available CPU features. + pub fn fat(&mut self, yes: Option) -> &mut Builder { + self.fat = yes; + self + } + + /// Request the use of 256-bit vectors (true) or 128-bit vectors (false). + /// Generally, a larger vector size is better since it either permits + /// matching more patterns or matching more bytes in the haystack at once. + /// + /// `None` is the default, which results in an automatic selection based on + /// the number of literals and available CPU features. + pub fn avx(&mut self, yes: Option) -> &mut Builder { + self.avx = yes; + self + } + + fn build_imp(&self, patterns: &Patterns) -> Option { + use crate::packed::teddy::runtime; + + // Most of the logic here is just about selecting the optimal settings, + // or perhaps even rejecting construction altogether. The choices + // we have are: fat (avx only) or not, ssse3 or avx2, and how many + // patterns we allow ourselves to search. Additionally, for testing + // and benchmarking, we permit callers to try to "force" a setting, + // and if the setting isn't allowed (e.g., forcing AVX when AVX isn't + // available), then we bail and return nothing. + + if patterns.len() > 64 { + debug!("skipping Teddy because of too many patterns"); + return None; + } + let has_ssse3 = std::is_x86_feature_detected!("ssse3"); + let has_avx = std::is_x86_feature_detected!("avx2"); + let avx = if self.avx == Some(true) { + if !has_avx { + debug!( + "skipping Teddy because avx was demanded but unavailable" + ); + return None; + } + true + } else if self.avx == Some(false) { + if !has_ssse3 { + debug!( + "skipping Teddy because ssse3 was demanded but unavailable" + ); + return None; + } + false + } else if !has_ssse3 && !has_avx { + debug!("skipping Teddy because ssse3 and avx are unavailable"); + return None; + } else { + has_avx + }; + let fat = match self.fat { + None => avx && patterns.len() > 32, + Some(false) => false, + Some(true) if !avx => { + debug!( + "skipping Teddy because it needs to be fat, but fat \ + Teddy requires avx which is unavailable" + ); + return None; + } + Some(true) => true, + }; + + let mut compiler = Compiler::new(patterns, fat); + compiler.compile(); + let Compiler { buckets, masks, .. } = compiler; + // SAFETY: It is required that the builder only produce Teddy matchers + // that are allowed to run on the current CPU, since we later assume + // that the presence of (for example) TeddySlim1Mask256 means it is + // safe to call functions marked with the `avx2` target feature. + match (masks.len(), avx, fat) { + (1, false, _) => { + debug!("Teddy choice: 128-bit slim, 1 byte"); + Some(Teddy { + buckets, + max_pattern_id: patterns.max_pattern_id(), + exec: runtime::Exec::TeddySlim1Mask128( + runtime::TeddySlim1Mask128 { + mask1: runtime::Mask128::new(masks[0]), + }, + ), + }) + } + (1, true, false) => { + debug!("Teddy choice: 256-bit slim, 1 byte"); + Some(Teddy { + buckets, + max_pattern_id: patterns.max_pattern_id(), + exec: runtime::Exec::TeddySlim1Mask256( + runtime::TeddySlim1Mask256 { + mask1: runtime::Mask256::new(masks[0]), + }, + ), + }) + } + (1, true, true) => { + debug!("Teddy choice: 256-bit fat, 1 byte"); + Some(Teddy { + buckets, + max_pattern_id: patterns.max_pattern_id(), + exec: runtime::Exec::TeddyFat1Mask256( + runtime::TeddyFat1Mask256 { + mask1: runtime::Mask256::new(masks[0]), + }, + ), + }) + } + (2, false, _) => { + debug!("Teddy choice: 128-bit slim, 2 bytes"); + Some(Teddy { + buckets, + max_pattern_id: patterns.max_pattern_id(), + exec: runtime::Exec::TeddySlim2Mask128( + runtime::TeddySlim2Mask128 { + mask1: runtime::Mask128::new(masks[0]), + mask2: runtime::Mask128::new(masks[1]), + }, + ), + }) + } + (2, true, false) => { + debug!("Teddy choice: 256-bit slim, 2 bytes"); + Some(Teddy { + buckets, + max_pattern_id: patterns.max_pattern_id(), + exec: runtime::Exec::TeddySlim2Mask256( + runtime::TeddySlim2Mask256 { + mask1: runtime::Mask256::new(masks[0]), + mask2: runtime::Mask256::new(masks[1]), + }, + ), + }) + } + (2, true, true) => { + debug!("Teddy choice: 256-bit fat, 2 bytes"); + Some(Teddy { + buckets, + max_pattern_id: patterns.max_pattern_id(), + exec: runtime::Exec::TeddyFat2Mask256( + runtime::TeddyFat2Mask256 { + mask1: runtime::Mask256::new(masks[0]), + mask2: runtime::Mask256::new(masks[1]), + }, + ), + }) + } + (3, false, _) => { + debug!("Teddy choice: 128-bit slim, 3 bytes"); + Some(Teddy { + buckets, + max_pattern_id: patterns.max_pattern_id(), + exec: runtime::Exec::TeddySlim3Mask128( + runtime::TeddySlim3Mask128 { + mask1: runtime::Mask128::new(masks[0]), + mask2: runtime::Mask128::new(masks[1]), + mask3: runtime::Mask128::new(masks[2]), + }, + ), + }) + } + (3, true, false) => { + debug!("Teddy choice: 256-bit slim, 3 bytes"); + Some(Teddy { + buckets, + max_pattern_id: patterns.max_pattern_id(), + exec: runtime::Exec::TeddySlim3Mask256( + runtime::TeddySlim3Mask256 { + mask1: runtime::Mask256::new(masks[0]), + mask2: runtime::Mask256::new(masks[1]), + mask3: runtime::Mask256::new(masks[2]), + }, + ), + }) + } + (3, true, true) => { + debug!("Teddy choice: 256-bit fat, 3 bytes"); + Some(Teddy { + buckets, + max_pattern_id: patterns.max_pattern_id(), + exec: runtime::Exec::TeddyFat3Mask256( + runtime::TeddyFat3Mask256 { + mask1: runtime::Mask256::new(masks[0]), + mask2: runtime::Mask256::new(masks[1]), + mask3: runtime::Mask256::new(masks[2]), + }, + ), + }) + } + (4, false, _) => { + debug!("Teddy choice: 128-bit slim, 4 bytes"); + Some(Teddy { + buckets, + max_pattern_id: patterns.max_pattern_id(), + exec: runtime::Exec::TeddySlim4Mask128( + runtime::TeddySlim4Mask128 { + mask1: runtime::Mask128::new(masks[0]), + mask2: runtime::Mask128::new(masks[1]), + mask3: runtime::Mask128::new(masks[2]), + mask4: runtime::Mask128::new(masks[3]), + }, + ), + }) + } + (4, true, false) => { + debug!("Teddy choice: 256-bit slim, 4 bytes"); + Some(Teddy { + buckets, + max_pattern_id: patterns.max_pattern_id(), + exec: runtime::Exec::TeddySlim4Mask256( + runtime::TeddySlim4Mask256 { + mask1: runtime::Mask256::new(masks[0]), + mask2: runtime::Mask256::new(masks[1]), + mask3: runtime::Mask256::new(masks[2]), + mask4: runtime::Mask256::new(masks[3]), + }, + ), + }) + } + (4, true, true) => { + debug!("Teddy choice: 256-bit fat, 4 bytes"); + Some(Teddy { + buckets, + max_pattern_id: patterns.max_pattern_id(), + exec: runtime::Exec::TeddyFat4Mask256( + runtime::TeddyFat4Mask256 { + mask1: runtime::Mask256::new(masks[0]), + mask2: runtime::Mask256::new(masks[1]), + mask3: runtime::Mask256::new(masks[2]), + mask4: runtime::Mask256::new(masks[3]), + }, + ), + }) + } + _ => unreachable!(), + } + } +} + +/// A compiler is in charge of allocating patterns into buckets and generating +/// the masks necessary for searching. +#[derive(Clone)] +struct Compiler<'p> { + patterns: &'p Patterns, + buckets: Vec>, + masks: Vec, +} + +impl<'p> Compiler<'p> { + /// Create a new Teddy compiler for the given patterns. If `fat` is true, + /// then 16 buckets will be used instead of 8. + /// + /// This panics if any of the patterns given are empty. + fn new(patterns: &'p Patterns, fat: bool) -> Compiler<'p> { + let mask_len = cmp::min(4, patterns.minimum_len()); + assert!(1 <= mask_len && mask_len <= 4); + + Compiler { + patterns, + buckets: vec![vec![]; if fat { 16 } else { 8 }], + masks: vec![Mask::default(); mask_len], + } + } + + /// Compile the patterns in this compiler into buckets and masks. + fn compile(&mut self) { + let mut lonibble_to_bucket: BTreeMap, usize> = BTreeMap::new(); + for (id, pattern) in self.patterns.iter() { + // We try to be slightly clever in how we assign patterns into + // buckets. Generally speaking, we want patterns with the same + // prefix to be in the same bucket, since it minimizes the amount + // of time we spend churning through buckets in the verification + // step. + // + // So we could assign patterns with the same N-prefix (where N + // is the size of the mask, which is one of {1, 2, 3}) to the + // same bucket. However, case insensitive searches are fairly + // common, so we'd for example, ideally want to treat `abc` and + // `ABC` as if they shared the same prefix. ASCII has the nice + // property that the lower 4 bits of A and a are the same, so we + // therefore group patterns with the same low-nybbe-N-prefix into + // the same bucket. + // + // MOREOVER, this is actually necessary for correctness! In + // particular, by grouping patterns with the same prefix into the + // same bucket, we ensure that we preserve correct leftmost-first + // and leftmost-longest match semantics. In addition to the fact + // that `patterns.iter()` iterates in the correct order, this + // guarantees that all possible ambiguous matches will occur in + // the same bucket. The verification routine could be adjusted to + // support correct leftmost match semantics regardless of bucket + // allocation, but that results in a performance hit. It's much + // nicer to be able to just stop as soon as a match is found. + let lonybs = pattern.low_nybbles(self.masks.len()); + if let Some(&bucket) = lonibble_to_bucket.get(&lonybs) { + self.buckets[bucket].push(id); + } else { + // N.B. We assign buckets in reverse because it shouldn't have + // any influence on performance, but it does make it harder to + // get leftmost match semantics accidentally correct. + let bucket = (self.buckets.len() - 1) + - (id as usize % self.buckets.len()); + self.buckets[bucket].push(id); + lonibble_to_bucket.insert(lonybs, bucket); + } + } + for (bucket_index, bucket) in self.buckets.iter().enumerate() { + for &pat_id in bucket { + let pat = self.patterns.get(pat_id); + for (i, mask) in self.masks.iter_mut().enumerate() { + if self.buckets.len() == 8 { + mask.add_slim(bucket_index as u8, pat.bytes()[i]); + } else { + mask.add_fat(bucket_index as u8, pat.bytes()[i]); + } + } + } + } + } +} + +impl<'p> fmt::Debug for Compiler<'p> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let mut buckets = vec![vec![]; self.buckets.len()]; + for (i, bucket) in self.buckets.iter().enumerate() { + for &patid in bucket { + buckets[i].push(self.patterns.get(patid)); + } + } + f.debug_struct("Compiler") + .field("buckets", &buckets) + .field("masks", &self.masks) + .finish() + } +} + +/// Mask represents the low and high nybble masks that will be used during +/// search. Each mask is 32 bytes wide, although only the first 16 bytes are +/// used for the SSSE3 runtime. +/// +/// Each byte in the mask corresponds to a 8-bit bitset, where bit `i` is set +/// if and only if the corresponding nybble is in the ith bucket. The index of +/// the byte (0-15, inclusive) corresponds to the nybble. +/// +/// Each mask is used as the target of a shuffle, where the indices for the +/// shuffle are taken from the haystack. AND'ing the shuffles for both the +/// low and high masks together also results in 8-bit bitsets, but where bit +/// `i` is set if and only if the correspond *byte* is in the ith bucket. +/// +/// During compilation, masks are just arrays. But during search, these masks +/// are represented as 128-bit or 256-bit vectors. +/// +/// (See the README is this directory for more details.) +#[derive(Clone, Copy, Default)] +pub struct Mask { + lo: [u8; 32], + hi: [u8; 32], +} + +impl Mask { + /// Update this mask by adding the given byte to the given bucket. The + /// given bucket must be in the range 0-7. + /// + /// This is for "slim" Teddy, where there are only 8 buckets. + fn add_slim(&mut self, bucket: u8, byte: u8) { + assert!(bucket < 8); + + let byte_lo = (byte & 0xF) as usize; + let byte_hi = ((byte >> 4) & 0xF) as usize; + // When using 256-bit vectors, we need to set this bucket assignment in + // the low and high 128-bit portions of the mask. This allows us to + // process 32 bytes at a time. Namely, AVX2 shuffles operate on each + // of the 128-bit lanes, rather than the full 256-bit vector at once. + self.lo[byte_lo] |= 1 << bucket; + self.lo[byte_lo + 16] |= 1 << bucket; + self.hi[byte_hi] |= 1 << bucket; + self.hi[byte_hi + 16] |= 1 << bucket; + } + + /// Update this mask by adding the given byte to the given bucket. The + /// given bucket must be in the range 0-15. + /// + /// This is for "fat" Teddy, where there are 16 buckets. + fn add_fat(&mut self, bucket: u8, byte: u8) { + assert!(bucket < 16); + + let byte_lo = (byte & 0xF) as usize; + let byte_hi = ((byte >> 4) & 0xF) as usize; + // Unlike slim teddy, fat teddy only works with AVX2. For fat teddy, + // the high 128 bits of our mask correspond to buckets 8-15, while the + // low 128 bits correspond to buckets 0-7. + if bucket < 8 { + self.lo[byte_lo] |= 1 << bucket; + self.hi[byte_hi] |= 1 << bucket; + } else { + self.lo[byte_lo + 16] |= 1 << (bucket % 8); + self.hi[byte_hi + 16] |= 1 << (bucket % 8); + } + } + + /// Return the low 128 bits of the low-nybble mask. + pub fn lo128(&self) -> [u8; 16] { + let mut tmp = [0; 16]; + tmp.copy_from_slice(&self.lo[..16]); + tmp + } + + /// Return the full low-nybble mask. + pub fn lo256(&self) -> [u8; 32] { + self.lo + } + + /// Return the low 128 bits of the high-nybble mask. + pub fn hi128(&self) -> [u8; 16] { + let mut tmp = [0; 16]; + tmp.copy_from_slice(&self.hi[..16]); + tmp + } + + /// Return the full high-nybble mask. + pub fn hi256(&self) -> [u8; 32] { + self.hi + } +} + +impl fmt::Debug for Mask { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let (mut parts_lo, mut parts_hi) = (vec![], vec![]); + for i in 0..32 { + parts_lo.push(format!("{:02}: {:08b}", i, self.lo[i])); + parts_hi.push(format!("{:02}: {:08b}", i, self.hi[i])); + } + f.debug_struct("Mask") + .field("lo", &parts_lo) + .field("hi", &parts_hi) + .finish() + } +} diff -Nru temporalio-1.3.0/vendor/aho-corasick/src/packed/teddy/generic.rs temporalio-1.3.0/vendor/aho-corasick/src/packed/teddy/generic.rs --- temporalio-1.3.0/vendor/aho-corasick/src/packed/teddy/generic.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/aho-corasick/src/packed/teddy/generic.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,1382 +0,0 @@ -use core::fmt::Debug; - -use alloc::{ - boxed::Box, collections::BTreeMap, format, sync::Arc, vec, vec::Vec, -}; - -use crate::{ - packed::{ - ext::Pointer, - pattern::Patterns, - vector::{FatVector, Vector}, - }, - util::int::U32, - PatternID, -}; - -/// A match type specialized to the Teddy implementations below. -/// -/// Essentially, instead of representing a match at byte offsets, we use -/// raw pointers. This is because the implementations below operate on raw -/// pointers, and so this is a more natural return type based on how the -/// implementation works. -/// -/// Also, the `PatternID` used here is a `u16`. -#[derive(Clone, Copy, Debug)] -pub(crate) struct Match { - pid: PatternID, - start: *const u8, - end: *const u8, -} - -impl Match { - /// Returns the ID of the pattern that matched. - pub(crate) fn pattern(&self) -> PatternID { - self.pid - } - - /// Returns a pointer into the haystack at which the match starts. - pub(crate) fn start(&self) -> *const u8 { - self.start - } - - /// Returns a pointer into the haystack at which the match ends. - pub(crate) fn end(&self) -> *const u8 { - self.end - } -} - -/// A "slim" Teddy implementation that is generic over both the vector type -/// and the minimum length of the patterns being searched for. -/// -/// Only 1, 2, 3 and 4 bytes are supported as minimum lengths. -#[derive(Clone, Debug)] -pub(crate) struct Slim { - /// A generic data structure for doing "slim" Teddy verification. - teddy: Teddy<8>, - /// The masks used as inputs to the shuffle operation to generate - /// candidates (which are fed into the verification routines). - masks: [Mask; BYTES], -} - -impl Slim { - /// Create a new "slim" Teddy searcher for the given patterns. - /// - /// # Panics - /// - /// This panics when `BYTES` is any value other than 1, 2, 3 or 4. - /// - /// # Safety - /// - /// Callers must ensure that this is okay to call in the current target for - /// the current CPU. - #[inline(always)] - pub(crate) unsafe fn new(patterns: Arc) -> Slim { - assert!( - 1 <= BYTES && BYTES <= 4, - "only 1, 2, 3 or 4 bytes are supported" - ); - let teddy = Teddy::new(patterns); - let masks = SlimMaskBuilder::from_teddy(&teddy); - Slim { teddy, masks } - } - - /// Returns the approximate total amount of heap used by this type, in - /// units of bytes. - #[inline(always)] - pub(crate) fn memory_usage(&self) -> usize { - self.teddy.memory_usage() - } - - /// Returns the minimum length, in bytes, that a haystack must be in order - /// to use it with this searcher. - #[inline(always)] - pub(crate) fn minimum_len(&self) -> usize { - V::BYTES + (BYTES - 1) - } -} - -impl Slim { - /// Look for an occurrences of the patterns in this finder in the haystack - /// given by the `start` and `end` pointers. - /// - /// If no match could be found, then `None` is returned. - /// - /// # Safety - /// - /// The given pointers representing the haystack must be valid to read - /// from. They must also point to a region of memory that is at least the - /// minimum length required by this searcher. - /// - /// Callers must ensure that this is okay to call in the current target for - /// the current CPU. - #[inline(always)] - pub(crate) unsafe fn find( - &self, - start: *const u8, - end: *const u8, - ) -> Option { - let len = end.distance(start); - debug_assert!(len >= self.minimum_len()); - let mut cur = start; - while cur <= end.sub(V::BYTES) { - if let Some(m) = self.find_one(cur, end) { - return Some(m); - } - cur = cur.add(V::BYTES); - } - if cur < end { - cur = end.sub(V::BYTES); - if let Some(m) = self.find_one(cur, end) { - return Some(m); - } - } - None - } - - /// Look for a match starting at the `V::BYTES` at and after `cur`. If - /// there isn't one, then `None` is returned. - /// - /// # Safety - /// - /// The given pointers representing the haystack must be valid to read - /// from. They must also point to a region of memory that is at least the - /// minimum length required by this searcher. - /// - /// Callers must ensure that this is okay to call in the current target for - /// the current CPU. - #[inline(always)] - unsafe fn find_one( - &self, - cur: *const u8, - end: *const u8, - ) -> Option { - let c = self.candidate(cur); - if !c.is_zero() { - if let Some(m) = self.teddy.verify(cur, end, c) { - return Some(m); - } - } - None - } - - /// Look for a candidate match (represented as a vector) starting at the - /// `V::BYTES` at and after `cur`. If there isn't one, then a vector with - /// all bits set to zero is returned. - /// - /// # Safety - /// - /// The given pointer representing the haystack must be valid to read - /// from. - /// - /// Callers must ensure that this is okay to call in the current target for - /// the current CPU. - #[inline(always)] - unsafe fn candidate(&self, cur: *const u8) -> V { - let chunk = V::load_unaligned(cur); - Mask::members1(chunk, self.masks) - } -} - -impl Slim { - /// See Slim::find. - #[inline(always)] - pub(crate) unsafe fn find( - &self, - start: *const u8, - end: *const u8, - ) -> Option { - let len = end.distance(start); - debug_assert!(len >= self.minimum_len()); - let mut cur = start.add(1); - let mut prev0 = V::splat(0xFF); - while cur <= end.sub(V::BYTES) { - if let Some(m) = self.find_one(cur, end, &mut prev0) { - return Some(m); - } - cur = cur.add(V::BYTES); - } - if cur < end { - cur = end.sub(V::BYTES); - prev0 = V::splat(0xFF); - if let Some(m) = self.find_one(cur, end, &mut prev0) { - return Some(m); - } - } - None - } - - /// See Slim::find_one. - #[inline(always)] - unsafe fn find_one( - &self, - cur: *const u8, - end: *const u8, - prev0: &mut V, - ) -> Option { - let c = self.candidate(cur, prev0); - if !c.is_zero() { - if let Some(m) = self.teddy.verify(cur.sub(1), end, c) { - return Some(m); - } - } - None - } - - /// See Slim::candidate. - #[inline(always)] - unsafe fn candidate(&self, cur: *const u8, prev0: &mut V) -> V { - let chunk = V::load_unaligned(cur); - let (res0, res1) = Mask::members2(chunk, self.masks); - let res0prev0 = res0.shift_in_one_byte(*prev0); - let res = res0prev0.and(res1); - *prev0 = res0; - res - } -} - -impl Slim { - /// See Slim::find. - #[inline(always)] - pub(crate) unsafe fn find( - &self, - start: *const u8, - end: *const u8, - ) -> Option { - let len = end.distance(start); - debug_assert!(len >= self.minimum_len()); - let mut cur = start.add(2); - let mut prev0 = V::splat(0xFF); - let mut prev1 = V::splat(0xFF); - while cur <= end.sub(V::BYTES) { - if let Some(m) = self.find_one(cur, end, &mut prev0, &mut prev1) { - return Some(m); - } - cur = cur.add(V::BYTES); - } - if cur < end { - cur = end.sub(V::BYTES); - prev0 = V::splat(0xFF); - prev1 = V::splat(0xFF); - if let Some(m) = self.find_one(cur, end, &mut prev0, &mut prev1) { - return Some(m); - } - } - None - } - - /// See Slim::find_one. - #[inline(always)] - unsafe fn find_one( - &self, - cur: *const u8, - end: *const u8, - prev0: &mut V, - prev1: &mut V, - ) -> Option { - let c = self.candidate(cur, prev0, prev1); - if !c.is_zero() { - if let Some(m) = self.teddy.verify(cur.sub(2), end, c) { - return Some(m); - } - } - None - } - - /// See Slim::candidate. - #[inline(always)] - unsafe fn candidate( - &self, - cur: *const u8, - prev0: &mut V, - prev1: &mut V, - ) -> V { - let chunk = V::load_unaligned(cur); - let (res0, res1, res2) = Mask::members3(chunk, self.masks); - let res0prev0 = res0.shift_in_two_bytes(*prev0); - let res1prev1 = res1.shift_in_one_byte(*prev1); - let res = res0prev0.and(res1prev1).and(res2); - *prev0 = res0; - *prev1 = res1; - res - } -} - -impl Slim { - /// See Slim::find. - #[inline(always)] - pub(crate) unsafe fn find( - &self, - start: *const u8, - end: *const u8, - ) -> Option { - let len = end.distance(start); - debug_assert!(len >= self.minimum_len()); - let mut cur = start.add(3); - let mut prev0 = V::splat(0xFF); - let mut prev1 = V::splat(0xFF); - let mut prev2 = V::splat(0xFF); - while cur <= end.sub(V::BYTES) { - if let Some(m) = - self.find_one(cur, end, &mut prev0, &mut prev1, &mut prev2) - { - return Some(m); - } - cur = cur.add(V::BYTES); - } - if cur < end { - cur = end.sub(V::BYTES); - prev0 = V::splat(0xFF); - prev1 = V::splat(0xFF); - prev2 = V::splat(0xFF); - if let Some(m) = - self.find_one(cur, end, &mut prev0, &mut prev1, &mut prev2) - { - return Some(m); - } - } - None - } - - /// See Slim::find_one. - #[inline(always)] - unsafe fn find_one( - &self, - cur: *const u8, - end: *const u8, - prev0: &mut V, - prev1: &mut V, - prev2: &mut V, - ) -> Option { - let c = self.candidate(cur, prev0, prev1, prev2); - if !c.is_zero() { - if let Some(m) = self.teddy.verify(cur.sub(3), end, c) { - return Some(m); - } - } - None - } - - /// See Slim::candidate. - #[inline(always)] - unsafe fn candidate( - &self, - cur: *const u8, - prev0: &mut V, - prev1: &mut V, - prev2: &mut V, - ) -> V { - let chunk = V::load_unaligned(cur); - let (res0, res1, res2, res3) = Mask::members4(chunk, self.masks); - let res0prev0 = res0.shift_in_three_bytes(*prev0); - let res1prev1 = res1.shift_in_two_bytes(*prev1); - let res2prev2 = res2.shift_in_one_byte(*prev2); - let res = res0prev0.and(res1prev1).and(res2prev2).and(res3); - *prev0 = res0; - *prev1 = res1; - *prev2 = res2; - res - } -} - -/// A "fat" Teddy implementation that is generic over both the vector type -/// and the minimum length of the patterns being searched for. -/// -/// Only 1, 2, 3 and 4 bytes are supported as minimum lengths. -#[derive(Clone, Debug)] -pub(crate) struct Fat { - /// A generic data structure for doing "fat" Teddy verification. - teddy: Teddy<16>, - /// The masks used as inputs to the shuffle operation to generate - /// candidates (which are fed into the verification routines). - masks: [Mask; BYTES], -} - -impl Fat { - /// Create a new "fat" Teddy searcher for the given patterns. - /// - /// # Panics - /// - /// This panics when `BYTES` is any value other than 1, 2, 3 or 4. - /// - /// # Safety - /// - /// Callers must ensure that this is okay to call in the current target for - /// the current CPU. - #[inline(always)] - pub(crate) unsafe fn new(patterns: Arc) -> Fat { - assert!( - 1 <= BYTES && BYTES <= 4, - "only 1, 2, 3 or 4 bytes are supported" - ); - let teddy = Teddy::new(patterns); - let masks = FatMaskBuilder::from_teddy(&teddy); - Fat { teddy, masks } - } - - /// Returns the approximate total amount of heap used by this type, in - /// units of bytes. - #[inline(always)] - pub(crate) fn memory_usage(&self) -> usize { - self.teddy.memory_usage() - } - - /// Returns the minimum length, in bytes, that a haystack must be in order - /// to use it with this searcher. - #[inline(always)] - pub(crate) fn minimum_len(&self) -> usize { - V::Half::BYTES + (BYTES - 1) - } -} - -impl Fat { - /// Look for an occurrences of the patterns in this finder in the haystack - /// given by the `start` and `end` pointers. - /// - /// If no match could be found, then `None` is returned. - /// - /// # Safety - /// - /// The given pointers representing the haystack must be valid to read - /// from. They must also point to a region of memory that is at least the - /// minimum length required by this searcher. - /// - /// Callers must ensure that this is okay to call in the current target for - /// the current CPU. - #[inline(always)] - pub(crate) unsafe fn find( - &self, - start: *const u8, - end: *const u8, - ) -> Option { - let len = end.distance(start); - debug_assert!(len >= self.minimum_len()); - let mut cur = start; - while cur <= end.sub(V::Half::BYTES) { - if let Some(m) = self.find_one(cur, end) { - return Some(m); - } - cur = cur.add(V::Half::BYTES); - } - if cur < end { - cur = end.sub(V::Half::BYTES); - if let Some(m) = self.find_one(cur, end) { - return Some(m); - } - } - None - } - - /// Look for a match starting at the `V::BYTES` at and after `cur`. If - /// there isn't one, then `None` is returned. - /// - /// # Safety - /// - /// The given pointers representing the haystack must be valid to read - /// from. They must also point to a region of memory that is at least the - /// minimum length required by this searcher. - /// - /// Callers must ensure that this is okay to call in the current target for - /// the current CPU. - #[inline(always)] - unsafe fn find_one( - &self, - cur: *const u8, - end: *const u8, - ) -> Option { - let c = self.candidate(cur); - if !c.is_zero() { - if let Some(m) = self.teddy.verify(cur, end, c) { - return Some(m); - } - } - None - } - - /// Look for a candidate match (represented as a vector) starting at the - /// `V::BYTES` at and after `cur`. If there isn't one, then a vector with - /// all bits set to zero is returned. - /// - /// # Safety - /// - /// The given pointer representing the haystack must be valid to read - /// from. - /// - /// Callers must ensure that this is okay to call in the current target for - /// the current CPU. - #[inline(always)] - unsafe fn candidate(&self, cur: *const u8) -> V { - let chunk = V::load_half_unaligned(cur); - Mask::members1(chunk, self.masks) - } -} - -impl Fat { - /// See `Fat::find`. - #[inline(always)] - pub(crate) unsafe fn find( - &self, - start: *const u8, - end: *const u8, - ) -> Option { - let len = end.distance(start); - debug_assert!(len >= self.minimum_len()); - let mut cur = start.add(1); - let mut prev0 = V::splat(0xFF); - while cur <= end.sub(V::Half::BYTES) { - if let Some(m) = self.find_one(cur, end, &mut prev0) { - return Some(m); - } - cur = cur.add(V::Half::BYTES); - } - if cur < end { - cur = end.sub(V::Half::BYTES); - prev0 = V::splat(0xFF); - if let Some(m) = self.find_one(cur, end, &mut prev0) { - return Some(m); - } - } - None - } - - /// See `Fat::find_one`. - #[inline(always)] - unsafe fn find_one( - &self, - cur: *const u8, - end: *const u8, - prev0: &mut V, - ) -> Option { - let c = self.candidate(cur, prev0); - if !c.is_zero() { - if let Some(m) = self.teddy.verify(cur.sub(1), end, c) { - return Some(m); - } - } - None - } - - /// See `Fat::candidate`. - #[inline(always)] - unsafe fn candidate(&self, cur: *const u8, prev0: &mut V) -> V { - let chunk = V::load_half_unaligned(cur); - let (res0, res1) = Mask::members2(chunk, self.masks); - let res0prev0 = res0.half_shift_in_one_byte(*prev0); - let res = res0prev0.and(res1); - *prev0 = res0; - res - } -} - -impl Fat { - /// See `Fat::find`. - #[inline(always)] - pub(crate) unsafe fn find( - &self, - start: *const u8, - end: *const u8, - ) -> Option { - let len = end.distance(start); - debug_assert!(len >= self.minimum_len()); - let mut cur = start.add(2); - let mut prev0 = V::splat(0xFF); - let mut prev1 = V::splat(0xFF); - while cur <= end.sub(V::Half::BYTES) { - if let Some(m) = self.find_one(cur, end, &mut prev0, &mut prev1) { - return Some(m); - } - cur = cur.add(V::Half::BYTES); - } - if cur < end { - cur = end.sub(V::Half::BYTES); - prev0 = V::splat(0xFF); - prev1 = V::splat(0xFF); - if let Some(m) = self.find_one(cur, end, &mut prev0, &mut prev1) { - return Some(m); - } - } - None - } - - /// See `Fat::find_one`. - #[inline(always)] - unsafe fn find_one( - &self, - cur: *const u8, - end: *const u8, - prev0: &mut V, - prev1: &mut V, - ) -> Option { - let c = self.candidate(cur, prev0, prev1); - if !c.is_zero() { - if let Some(m) = self.teddy.verify(cur.sub(2), end, c) { - return Some(m); - } - } - None - } - - /// See `Fat::candidate`. - #[inline(always)] - unsafe fn candidate( - &self, - cur: *const u8, - prev0: &mut V, - prev1: &mut V, - ) -> V { - let chunk = V::load_half_unaligned(cur); - let (res0, res1, res2) = Mask::members3(chunk, self.masks); - let res0prev0 = res0.half_shift_in_two_bytes(*prev0); - let res1prev1 = res1.half_shift_in_one_byte(*prev1); - let res = res0prev0.and(res1prev1).and(res2); - *prev0 = res0; - *prev1 = res1; - res - } -} - -impl Fat { - /// See `Fat::find`. - #[inline(always)] - pub(crate) unsafe fn find( - &self, - start: *const u8, - end: *const u8, - ) -> Option { - let len = end.distance(start); - debug_assert!(len >= self.minimum_len()); - let mut cur = start.add(3); - let mut prev0 = V::splat(0xFF); - let mut prev1 = V::splat(0xFF); - let mut prev2 = V::splat(0xFF); - while cur <= end.sub(V::Half::BYTES) { - if let Some(m) = - self.find_one(cur, end, &mut prev0, &mut prev1, &mut prev2) - { - return Some(m); - } - cur = cur.add(V::Half::BYTES); - } - if cur < end { - cur = end.sub(V::Half::BYTES); - prev0 = V::splat(0xFF); - prev1 = V::splat(0xFF); - prev2 = V::splat(0xFF); - if let Some(m) = - self.find_one(cur, end, &mut prev0, &mut prev1, &mut prev2) - { - return Some(m); - } - } - None - } - - /// See `Fat::find_one`. - #[inline(always)] - unsafe fn find_one( - &self, - cur: *const u8, - end: *const u8, - prev0: &mut V, - prev1: &mut V, - prev2: &mut V, - ) -> Option { - let c = self.candidate(cur, prev0, prev1, prev2); - if !c.is_zero() { - if let Some(m) = self.teddy.verify(cur.sub(3), end, c) { - return Some(m); - } - } - None - } - - /// See `Fat::candidate`. - #[inline(always)] - unsafe fn candidate( - &self, - cur: *const u8, - prev0: &mut V, - prev1: &mut V, - prev2: &mut V, - ) -> V { - let chunk = V::load_half_unaligned(cur); - let (res0, res1, res2, res3) = Mask::members4(chunk, self.masks); - let res0prev0 = res0.half_shift_in_three_bytes(*prev0); - let res1prev1 = res1.half_shift_in_two_bytes(*prev1); - let res2prev2 = res2.half_shift_in_one_byte(*prev2); - let res = res0prev0.and(res1prev1).and(res2prev2).and(res3); - *prev0 = res0; - *prev1 = res1; - *prev2 = res2; - res - } -} - -/// The common elements of all "slim" and "fat" Teddy search implementations. -/// -/// Essentially, this contains the patterns and the buckets. Namely, it -/// contains enough to implement the verification step after candidates are -/// identified via the shuffle masks. -/// -/// It is generic over the number of buckets used. In general, the number of -/// buckets is either 8 (for "slim" Teddy) or 16 (for "fat" Teddy). The generic -/// parameter isn't really meant to be instantiated for any value other than -/// 8 or 16, although it is technically possible. The main hiccup is that there -/// is some bit-shifting done in the critical part of verification that could -/// be quite expensive if `N` is not a multiple of 2. -#[derive(Clone, Debug)] -struct Teddy { - /// The patterns we are searching for. - /// - /// A pattern string can be found by its `PatternID`. - patterns: Arc, - /// The allocation of patterns in buckets. This only contains the IDs of - /// patterns. In order to do full verification, callers must provide the - /// actual patterns when using Teddy. - buckets: [Vec; BUCKETS], - // N.B. The above representation is very simple, but it definitely results - // in ping-ponging between different allocations during verification. I've - // tried experimenting with other representations that flatten the pattern - // strings into a single allocation, but it doesn't seem to help much. - // Probably everything is small enough to fit into cache anyway, and so the - // pointer chasing isn't a big deal? - // - // One other avenue I haven't explored is some kind of hashing trick - // that let's us do another high-confidence check before launching into - // `memcmp`. -} - -impl Teddy { - /// Create a new generic data structure for Teddy verification. - fn new(patterns: Arc) -> Teddy { - assert_ne!(0, patterns.len(), "Teddy requires at least one pattern"); - assert_ne!( - 0, - patterns.minimum_len(), - "Teddy does not support zero-length patterns" - ); - assert!( - BUCKETS == 8 || BUCKETS == 16, - "Teddy only supports 8 or 16 buckets" - ); - // MSRV(1.63): Use core::array::from_fn below instead of allocating a - // superfluous outer Vec. Not a big deal (especially given the BTreeMap - // allocation below), but nice to not do it. - let buckets = - <[Vec; BUCKETS]>::try_from(vec![vec![]; BUCKETS]) - .unwrap(); - let mut t = Teddy { patterns, buckets }; - - let mut map: BTreeMap, usize> = BTreeMap::new(); - for (id, pattern) in t.patterns.iter() { - // We try to be slightly clever in how we assign patterns into - // buckets. Generally speaking, we want patterns with the same - // prefix to be in the same bucket, since it minimizes the amount - // of time we spend churning through buckets in the verification - // step. - // - // So we could assign patterns with the same N-prefix (where N is - // the size of the mask, which is one of {1, 2, 3}) to the same - // bucket. However, case insensitive searches are fairly common, so - // we'd for example, ideally want to treat `abc` and `ABC` as if - // they shared the same prefix. ASCII has the nice property that - // the lower 4 bits of A and a are the same, so we therefore group - // patterns with the same low-nybble-N-prefix into the same bucket. - // - // MOREOVER, this is actually necessary for correctness! In - // particular, by grouping patterns with the same prefix into the - // same bucket, we ensure that we preserve correct leftmost-first - // and leftmost-longest match semantics. In addition to the fact - // that `patterns.iter()` iterates in the correct order, this - // guarantees that all possible ambiguous matches will occur in - // the same bucket. The verification routine could be adjusted to - // support correct leftmost match semantics regardless of bucket - // allocation, but that results in a performance hit. It's much - // nicer to be able to just stop as soon as a match is found. - let lonybs = pattern.low_nybbles(t.mask_len()); - if let Some(&bucket) = map.get(&lonybs) { - t.buckets[bucket].push(id); - } else { - // N.B. We assign buckets in reverse because it shouldn't have - // any influence on performance, but it does make it harder to - // get leftmost match semantics accidentally correct. - let bucket = (BUCKETS - 1) - (id.as_usize() % BUCKETS); - t.buckets[bucket].push(id); - map.insert(lonybs, bucket); - } - } - t - } - - /// Verify whether there are any matches starting at or after `cur` in the - /// haystack. The candidate chunk given should correspond to 8-bit bitsets - /// for N buckets. - /// - /// # Safety - /// - /// The given pointers representing the haystack must be valid to read - /// from. - #[inline(always)] - unsafe fn verify64( - &self, - cur: *const u8, - end: *const u8, - mut candidate_chunk: u64, - ) -> Option { - while candidate_chunk != 0 { - let bit = candidate_chunk.trailing_zeros().as_usize(); - candidate_chunk &= !(1 << bit); - - let cur = cur.add(bit / BUCKETS); - let bucket = bit % BUCKETS; - if let Some(m) = self.verify_bucket(cur, end, bucket) { - return Some(m); - } - } - None - } - - /// Verify whether there are any matches starting at `at` in the given - /// `haystack` corresponding only to patterns in the given bucket. - /// - /// # Safety - /// - /// The given pointers representing the haystack must be valid to read - /// from. - /// - /// The bucket index must be less than or equal to `self.buckets.len()`. - #[inline(always)] - unsafe fn verify_bucket( - &self, - cur: *const u8, - end: *const u8, - bucket: usize, - ) -> Option { - debug_assert!(bucket < self.buckets.len()); - // SAFETY: The caller must ensure that the bucket index is correct. - for pid in self.buckets.get_unchecked(bucket).iter().copied() { - // SAFETY: This is safe because we are guaranteed that every - // index in a Teddy bucket is a valid index into `pats`, by - // construction. - debug_assert!(pid.as_usize() < self.patterns.len()); - let pat = self.patterns.get_unchecked(pid); - if pat.is_prefix_raw(cur, end) { - let start = cur; - let end = start.add(pat.len()); - return Some(Match { pid, start, end }); - } - } - None - } - - /// Returns the total number of masks required by the patterns in this - /// Teddy searcher. - /// - /// Basically, the mask length corresponds to the type of Teddy searcher - /// to use: a 1-byte, 2-byte, 3-byte or 4-byte searcher. The bigger the - /// better, typically, since searching for longer substrings usually - /// decreases the rate of false positives. Therefore, the number of masks - /// needed is the length of the shortest pattern in this searcher. If the - /// length of the shortest pattern (in bytes) is bigger than 4, then the - /// mask length is 4 since there are no Teddy searchers for more than 4 - /// bytes. - fn mask_len(&self) -> usize { - core::cmp::min(4, self.patterns.minimum_len()) - } - - /// Returns the approximate total amount of heap used by this type, in - /// units of bytes. - fn memory_usage(&self) -> usize { - // This is an upper bound rather than a precise accounting. No - // particular reason, other than it's probably very close to actual - // memory usage in practice. - self.patterns.len() * core::mem::size_of::() - } -} - -impl Teddy<8> { - /// Runs the verification routine for "slim" Teddy. - /// - /// The candidate given should be a collection of 8-bit bitsets (one bitset - /// per lane), where the ith bit is set in the jth lane if and only if the - /// byte occurring at `at + j` in `cur` is in the bucket `i`. - /// - /// # Safety - /// - /// Callers must ensure that this is okay to call in the current target for - /// the current CPU. - /// - /// The given pointers must be valid to read from. - #[inline(always)] - unsafe fn verify( - &self, - mut cur: *const u8, - end: *const u8, - candidate: V, - ) -> Option { - debug_assert!(!candidate.is_zero()); - // Convert the candidate into 64-bit chunks, and then verify each of - // those chunks. - candidate.for_each_64bit_lane( - #[inline(always)] - |_, chunk| { - let result = self.verify64(cur, end, chunk); - cur = cur.add(8); - result - }, - ) - } -} - -impl Teddy<16> { - /// Runs the verification routine for "fat" Teddy. - /// - /// The candidate given should be a collection of 8-bit bitsets (one bitset - /// per lane), where the ith bit is set in the jth lane if and only if the - /// byte occurring at `at + (j < 16 ? j : j - 16)` in `cur` is in the - /// bucket `j < 16 ? i : i + 8`. - /// - /// # Safety - /// - /// Callers must ensure that this is okay to call in the current target for - /// the current CPU. - /// - /// The given pointers must be valid to read from. - #[inline(always)] - unsafe fn verify( - &self, - mut cur: *const u8, - end: *const u8, - candidate: V, - ) -> Option { - // This is a bit tricky, but we basically want to convert our - // candidate, which looks like this (assuming a 256-bit vector): - // - // a31 a30 ... a17 a16 a15 a14 ... a01 a00 - // - // where each a(i) is an 8-bit bitset corresponding to the activated - // buckets, to this - // - // a31 a15 a30 a14 a29 a13 ... a18 a02 a17 a01 a16 a00 - // - // Namely, for Fat Teddy, the high 128-bits of the candidate correspond - // to the same bytes in the haystack in the low 128-bits (so we only - // scan 16 bytes at a time), but are for buckets 8-15 instead of 0-7. - // - // The verification routine wants to look at all potentially matching - // buckets before moving on to the next lane. So for example, both - // a16 and a00 both correspond to the first byte in our window; a00 - // contains buckets 0-7 and a16 contains buckets 8-15. Specifically, - // a16 should be checked before a01. So the transformation shown above - // allows us to use our normal verification procedure with one small - // change: we treat each bitset as 16 bits instead of 8 bits. - debug_assert!(!candidate.is_zero()); - - // Swap the 128-bit lanes in the candidate vector. - let swapped = candidate.swap_halves(); - // Interleave the bytes from the low 128-bit lanes, starting with - // cand first. - let r1 = candidate.interleave_low_8bit_lanes(swapped); - // Interleave the bytes from the high 128-bit lanes, starting with - // cand first. - let r2 = candidate.interleave_high_8bit_lanes(swapped); - // Now just take the 2 low 64-bit integers from both r1 and r2. We - // can drop the high 64-bit integers because they are a mirror image - // of the low 64-bit integers. All we care about are the low 128-bit - // lanes of r1 and r2. Combined, they contain all our 16-bit bitsets - // laid out in the desired order, as described above. - r1.for_each_low_64bit_lane( - r2, - #[inline(always)] - |_, chunk| { - let result = self.verify64(cur, end, chunk); - cur = cur.add(4); - result - }, - ) - } -} - -/// A vector generic mask for the low and high nybbles in a set of patterns. -/// Each 8-bit lane `j` in a vector corresponds to a bitset where the `i`th bit -/// is set if and only if the nybble `j` is in the bucket `i` at a particular -/// position. -/// -/// This is slightly tweaked dependending on whether Slim or Fat Teddy is being -/// used. For Slim Teddy, the bitsets in the lower half are the same as the -/// bitsets in the higher half, so that we can search `V::BYTES` bytes at a -/// time. (Remember, the nybbles in the haystack are used as indices into these -/// masks, and 256-bit shuffles only operate on 128-bit lanes.) -/// -/// For Fat Teddy, the bitsets are not repeated, but instead, the high half -/// bits correspond to an addition 8 buckets. So that a bitset `00100010` has -/// buckets 1 and 5 set if it's in the lower half, but has buckets 9 and 13 set -/// if it's in the higher half. -#[derive(Clone, Copy, Debug)] -struct Mask { - lo: V, - hi: V, -} - -impl Mask { - /// Return a candidate for Teddy (fat or slim) that is searching for 1-byte - /// candidates. - /// - /// If a candidate is returned, it will be a collection of 8-bit bitsets - /// (one bitset per lane), where the ith bit is set in the jth lane if and - /// only if the byte occurring at the jth lane in `chunk` is in the bucket - /// `i`. If no candidate is found, then the vector returned will have all - /// lanes set to zero. - /// - /// `chunk` should correspond to a `V::BYTES` window of the haystack (where - /// the least significant byte corresponds to the start of the window). For - /// fat Teddy, the haystack window length should be `V::BYTES / 2`, with - /// the window repeated in each half of the vector. - /// - /// `mask1` should correspond to a low/high mask for the first byte of all - /// patterns that are being searched. - #[inline(always)] - unsafe fn members1(chunk: V, masks: [Mask; 1]) -> V { - let lomask = V::splat(0xF); - let hlo = chunk.and(lomask); - let hhi = chunk.shift_8bit_lane_right::<4>().and(lomask); - let locand = masks[0].lo.shuffle_bytes(hlo); - let hicand = masks[0].hi.shuffle_bytes(hhi); - locand.and(hicand) - } - - /// Return a candidate for Teddy (fat or slim) that is searching for 2-byte - /// candidates. - /// - /// If candidates are returned, each will be a collection of 8-bit bitsets - /// (one bitset per lane), where the ith bit is set in the jth lane if and - /// only if the byte occurring at the jth lane in `chunk` is in the bucket - /// `i`. Each candidate returned corresponds to the first and second bytes - /// of the patterns being searched. If no candidate is found, then all of - /// the lanes will be set to zero in at least one of the vectors returned. - /// - /// `chunk` should correspond to a `V::BYTES` window of the haystack (where - /// the least significant byte corresponds to the start of the window). For - /// fat Teddy, the haystack window length should be `V::BYTES / 2`, with - /// the window repeated in each half of the vector. - /// - /// The masks should correspond to the masks computed for the first and - /// second bytes of all patterns that are being searched. - #[inline(always)] - unsafe fn members2(chunk: V, masks: [Mask; 2]) -> (V, V) { - let lomask = V::splat(0xF); - let hlo = chunk.and(lomask); - let hhi = chunk.shift_8bit_lane_right::<4>().and(lomask); - - let locand1 = masks[0].lo.shuffle_bytes(hlo); - let hicand1 = masks[0].hi.shuffle_bytes(hhi); - let cand1 = locand1.and(hicand1); - - let locand2 = masks[1].lo.shuffle_bytes(hlo); - let hicand2 = masks[1].hi.shuffle_bytes(hhi); - let cand2 = locand2.and(hicand2); - - (cand1, cand2) - } - - /// Return a candidate for Teddy (fat or slim) that is searching for 3-byte - /// candidates. - /// - /// If candidates are returned, each will be a collection of 8-bit bitsets - /// (one bitset per lane), where the ith bit is set in the jth lane if and - /// only if the byte occurring at the jth lane in `chunk` is in the bucket - /// `i`. Each candidate returned corresponds to the first, second and third - /// bytes of the patterns being searched. If no candidate is found, then - /// all of the lanes will be set to zero in at least one of the vectors - /// returned. - /// - /// `chunk` should correspond to a `V::BYTES` window of the haystack (where - /// the least significant byte corresponds to the start of the window). For - /// fat Teddy, the haystack window length should be `V::BYTES / 2`, with - /// the window repeated in each half of the vector. - /// - /// The masks should correspond to the masks computed for the first, second - /// and third bytes of all patterns that are being searched. - #[inline(always)] - unsafe fn members3(chunk: V, masks: [Mask; 3]) -> (V, V, V) { - let lomask = V::splat(0xF); - let hlo = chunk.and(lomask); - let hhi = chunk.shift_8bit_lane_right::<4>().and(lomask); - - let locand1 = masks[0].lo.shuffle_bytes(hlo); - let hicand1 = masks[0].hi.shuffle_bytes(hhi); - let cand1 = locand1.and(hicand1); - - let locand2 = masks[1].lo.shuffle_bytes(hlo); - let hicand2 = masks[1].hi.shuffle_bytes(hhi); - let cand2 = locand2.and(hicand2); - - let locand3 = masks[2].lo.shuffle_bytes(hlo); - let hicand3 = masks[2].hi.shuffle_bytes(hhi); - let cand3 = locand3.and(hicand3); - - (cand1, cand2, cand3) - } - - /// Return a candidate for Teddy (fat or slim) that is searching for 4-byte - /// candidates. - /// - /// If candidates are returned, each will be a collection of 8-bit bitsets - /// (one bitset per lane), where the ith bit is set in the jth lane if and - /// only if the byte occurring at the jth lane in `chunk` is in the bucket - /// `i`. Each candidate returned corresponds to the first, second, third - /// and fourth bytes of the patterns being searched. If no candidate is - /// found, then all of the lanes will be set to zero in at least one of the - /// vectors returned. - /// - /// `chunk` should correspond to a `V::BYTES` window of the haystack (where - /// the least significant byte corresponds to the start of the window). For - /// fat Teddy, the haystack window length should be `V::BYTES / 2`, with - /// the window repeated in each half of the vector. - /// - /// The masks should correspond to the masks computed for the first, - /// second, third and fourth bytes of all patterns that are being searched. - #[inline(always)] - unsafe fn members4(chunk: V, masks: [Mask; 4]) -> (V, V, V, V) { - let lomask = V::splat(0xF); - let hlo = chunk.and(lomask); - let hhi = chunk.shift_8bit_lane_right::<4>().and(lomask); - - let locand1 = masks[0].lo.shuffle_bytes(hlo); - let hicand1 = masks[0].hi.shuffle_bytes(hhi); - let cand1 = locand1.and(hicand1); - - let locand2 = masks[1].lo.shuffle_bytes(hlo); - let hicand2 = masks[1].hi.shuffle_bytes(hhi); - let cand2 = locand2.and(hicand2); - - let locand3 = masks[2].lo.shuffle_bytes(hlo); - let hicand3 = masks[2].hi.shuffle_bytes(hhi); - let cand3 = locand3.and(hicand3); - - let locand4 = masks[3].lo.shuffle_bytes(hlo); - let hicand4 = masks[3].hi.shuffle_bytes(hhi); - let cand4 = locand4.and(hicand4); - - (cand1, cand2, cand3, cand4) - } -} - -/// Represents the low and high nybble masks that will be used during -/// search. Each mask is 32 bytes wide, although only the first 16 bytes are -/// used for 128-bit vectors. -/// -/// Each byte in the mask corresponds to a 8-bit bitset, where bit `i` is set -/// if and only if the corresponding nybble is in the ith bucket. The index of -/// the byte (0-15, inclusive) corresponds to the nybble. -/// -/// Each mask is used as the target of a shuffle, where the indices for the -/// shuffle are taken from the haystack. AND'ing the shuffles for both the -/// low and high masks together also results in 8-bit bitsets, but where bit -/// `i` is set if and only if the correspond *byte* is in the ith bucket. -#[derive(Clone, Default)] -struct SlimMaskBuilder { - lo: [u8; 32], - hi: [u8; 32], -} - -impl SlimMaskBuilder { - /// Update this mask by adding the given byte to the given bucket. The - /// given bucket must be in the range 0-7. - /// - /// # Panics - /// - /// When `bucket >= 8`. - fn add(&mut self, bucket: usize, byte: u8) { - assert!(bucket < 8); - - let bucket = u8::try_from(bucket).unwrap(); - let byte_lo = usize::from(byte & 0xF); - let byte_hi = usize::from((byte >> 4) & 0xF); - // When using 256-bit vectors, we need to set this bucket assignment in - // the low and high 128-bit portions of the mask. This allows us to - // process 32 bytes at a time. Namely, AVX2 shuffles operate on each - // of the 128-bit lanes, rather than the full 256-bit vector at once. - self.lo[byte_lo] |= 1 << bucket; - self.lo[byte_lo + 16] |= 1 << bucket; - self.hi[byte_hi] |= 1 << bucket; - self.hi[byte_hi + 16] |= 1 << bucket; - } - - /// Turn this builder into a vector mask. - /// - /// # Panics - /// - /// When `V` represents a vector bigger than what `MaskBytes` can contain. - /// - /// # Safety - /// - /// Callers must ensure that this is okay to call in the current target for - /// the current CPU. - #[inline(always)] - unsafe fn build(&self) -> Mask { - assert!(V::BYTES <= self.lo.len()); - assert!(V::BYTES <= self.hi.len()); - Mask { - lo: V::load_unaligned(self.lo[..].as_ptr()), - hi: V::load_unaligned(self.hi[..].as_ptr()), - } - } - - /// A convenience function for building `N` vector masks from a slim - /// `Teddy` value. - /// - /// # Panics - /// - /// When `V` represents a vector bigger than what `MaskBytes` can contain. - /// - /// # Safety - /// - /// Callers must ensure that this is okay to call in the current target for - /// the current CPU. - #[inline(always)] - unsafe fn from_teddy( - teddy: &Teddy<8>, - ) -> [Mask; BYTES] { - // MSRV(1.63): Use core::array::from_fn to just build the array here - // instead of creating a vector and turning it into an array. - let mut mask_builders = vec![SlimMaskBuilder::default(); BYTES]; - for (bucket_index, bucket) in teddy.buckets.iter().enumerate() { - for pid in bucket.iter().copied() { - let pat = teddy.patterns.get(pid); - for (i, builder) in mask_builders.iter_mut().enumerate() { - builder.add(bucket_index, pat.bytes()[i]); - } - } - } - let array = - <[SlimMaskBuilder; BYTES]>::try_from(mask_builders).unwrap(); - array.map(|builder| builder.build()) - } -} - -impl Debug for SlimMaskBuilder { - fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { - let (mut parts_lo, mut parts_hi) = (vec![], vec![]); - for i in 0..32 { - parts_lo.push(format!("{:02}: {:08b}", i, self.lo[i])); - parts_hi.push(format!("{:02}: {:08b}", i, self.hi[i])); - } - f.debug_struct("SlimMaskBuilder") - .field("lo", &parts_lo) - .field("hi", &parts_hi) - .finish() - } -} - -/// Represents the low and high nybble masks that will be used during "fat" -/// Teddy search. -/// -/// Each mask is 32 bytes wide, and at the time of writing, only 256-bit vectors -/// support fat Teddy. -/// -/// A fat Teddy mask is like a slim Teddy mask, except that instead of -/// repeating the bitsets in the high and low 128-bits in 256-bit vectors, the -/// high and low 128-bit halves each represent distinct buckets. (Bringing the -/// total to 16 instead of 8.) This permits spreading the patterns out a bit -/// more and thus putting less pressure on verification to be fast. -/// -/// Each byte in the mask corresponds to a 8-bit bitset, where bit `i` is set -/// if and only if the corresponding nybble is in the ith bucket. The index of -/// the byte (0-15, inclusive) corresponds to the nybble. -#[derive(Clone, Copy, Default)] -struct FatMaskBuilder { - lo: [u8; 32], - hi: [u8; 32], -} - -impl FatMaskBuilder { - /// Update this mask by adding the given byte to the given bucket. The - /// given bucket must be in the range 0-15. - /// - /// # Panics - /// - /// When `bucket >= 16`. - fn add(&mut self, bucket: usize, byte: u8) { - assert!(bucket < 16); - - let bucket = u8::try_from(bucket).unwrap(); - let byte_lo = usize::from(byte & 0xF); - let byte_hi = usize::from((byte >> 4) & 0xF); - // Unlike slim teddy, fat teddy only works with AVX2. For fat teddy, - // the high 128 bits of our mask correspond to buckets 8-15, while the - // low 128 bits correspond to buckets 0-7. - if bucket < 8 { - self.lo[byte_lo] |= 1 << bucket; - self.hi[byte_hi] |= 1 << bucket; - } else { - self.lo[byte_lo + 16] |= 1 << (bucket % 8); - self.hi[byte_hi + 16] |= 1 << (bucket % 8); - } - } - - /// Turn this builder into a vector mask. - /// - /// # Panics - /// - /// When `V` represents a vector bigger than what `MaskBytes` can contain. - /// - /// # Safety - /// - /// Callers must ensure that this is okay to call in the current target for - /// the current CPU. - #[inline(always)] - unsafe fn build(&self) -> Mask { - assert!(V::BYTES <= self.lo.len()); - assert!(V::BYTES <= self.hi.len()); - Mask { - lo: V::load_unaligned(self.lo[..].as_ptr()), - hi: V::load_unaligned(self.hi[..].as_ptr()), - } - } - - /// A convenience function for building `N` vector masks from a fat - /// `Teddy` value. - /// - /// # Panics - /// - /// When `V` represents a vector bigger than what `MaskBytes` can contain. - /// - /// # Safety - /// - /// Callers must ensure that this is okay to call in the current target for - /// the current CPU. - #[inline(always)] - unsafe fn from_teddy( - teddy: &Teddy<16>, - ) -> [Mask; BYTES] { - // MSRV(1.63): Use core::array::from_fn to just build the array here - // instead of creating a vector and turning it into an array. - let mut mask_builders = vec![FatMaskBuilder::default(); BYTES]; - for (bucket_index, bucket) in teddy.buckets.iter().enumerate() { - for pid in bucket.iter().copied() { - let pat = teddy.patterns.get(pid); - for (i, builder) in mask_builders.iter_mut().enumerate() { - builder.add(bucket_index, pat.bytes()[i]); - } - } - } - let array = - <[FatMaskBuilder; BYTES]>::try_from(mask_builders).unwrap(); - array.map(|builder| builder.build()) - } -} - -impl Debug for FatMaskBuilder { - fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { - let (mut parts_lo, mut parts_hi) = (vec![], vec![]); - for i in 0..32 { - parts_lo.push(format!("{:02}: {:08b}", i, self.lo[i])); - parts_hi.push(format!("{:02}: {:08b}", i, self.hi[i])); - } - f.debug_struct("FatMaskBuilder") - .field("lo", &parts_lo) - .field("hi", &parts_hi) - .finish() - } -} diff -Nru temporalio-1.3.0/vendor/aho-corasick/src/packed/teddy/mod.rs temporalio-1.3.0/vendor/aho-corasick/src/packed/teddy/mod.rs --- temporalio-1.3.0/vendor/aho-corasick/src/packed/teddy/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/aho-corasick/src/packed/teddy/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,9 +1,57 @@ -// Regrettable, but Teddy stuff just isn't used on all targets. And for some -// targets, like aarch64, only "slim" Teddy is used and so "fat" Teddy gets a -// bunch of dead-code warnings. Just not worth trying to squash them. Blech. -#![allow(dead_code)] +#[cfg(not(all(feature = "std", target_arch = "x86_64")))] +pub use crate::packed::teddy::fallback::{Builder, Teddy}; +#[cfg(all(feature = "std", target_arch = "x86_64"))] +pub use crate::packed::teddy::{compile::Builder, runtime::Teddy}; -pub(crate) use self::builder::{Builder, Searcher}; +#[cfg(all(feature = "std", target_arch = "x86_64"))] +mod compile; +#[cfg(all(feature = "std", target_arch = "x86_64"))] +mod runtime; -mod builder; -mod generic; +#[cfg(not(all(feature = "std", target_arch = "x86_64")))] +mod fallback { + use crate::{packed::pattern::Patterns, Match}; + + #[derive(Clone, Debug, Default)] + pub struct Builder(()); + + impl Builder { + pub fn new() -> Builder { + Builder(()) + } + + pub fn build(&self, _: &Patterns) -> Option { + None + } + + pub fn fat(&mut self, _: Option) -> &mut Builder { + self + } + + pub fn avx(&mut self, _: Option) -> &mut Builder { + self + } + } + + #[derive(Clone, Debug)] + pub struct Teddy(()); + + impl Teddy { + pub fn find_at( + &self, + _: &Patterns, + _: &[u8], + _: usize, + ) -> Option { + None + } + + pub fn minimum_len(&self) -> usize { + 0 + } + + pub fn memory_usage(&self) -> usize { + 0 + } + } +} diff -Nru temporalio-1.3.0/vendor/aho-corasick/src/packed/teddy/README.md temporalio-1.3.0/vendor/aho-corasick/src/packed/teddy/README.md --- temporalio-1.3.0/vendor/aho-corasick/src/packed/teddy/README.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/aho-corasick/src/packed/teddy/README.md 2023-10-30 19:40:00.000000000 +0000 @@ -225,14 +225,14 @@ block. Once we have that, we can look for the position of the least significant bit -in `C`. (Least significant because we only target little endian here. Thus, -the least significant bytes correspond to bytes in our haystack at a lower -address.) That position, modulo `8`, gives us the pattern that the fingerprint -matches. That position, integer divided by `8`, also gives us the byte offset -that the fingerprint occurs in inside the 16 byte haystack block. Using those -two pieces of information, we can run a verification procedure that tries -to match all substrings containing that fingerprint at that position in the -haystack. +in `C`. (Least significant because we only target `x86_64` here, which is +always little endian. Thus, the least significant bytes correspond to bytes +in our haystack at a lower address.) That position, modulo `8`, gives us +the pattern that the fingerprint matches. That position, integer divided by +`8`, also gives us the byte offset that the fingerprint occurs in inside the +16 byte haystack block. Using those two pieces of information, we can run a +verification procedure that tries to match all substrings containing that +fingerprint at that position in the haystack. # Implementation notes diff -Nru temporalio-1.3.0/vendor/aho-corasick/src/packed/teddy/runtime.rs temporalio-1.3.0/vendor/aho-corasick/src/packed/teddy/runtime.rs --- temporalio-1.3.0/vendor/aho-corasick/src/packed/teddy/runtime.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/aho-corasick/src/packed/teddy/runtime.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,1573 @@ +// See the README in this directory for an explanation of the Teddy algorithm. +// It is strongly recommended to peruse the README before trying to grok this +// code, as its use of SIMD is pretty opaque, although I tried to add comments +// where appropriate. +// +// Moreover, while there is a lot of code in this file, most of it is +// repeated variants of the same thing. Specifically, there are three Teddy +// variants: Slim 128-bit Teddy (8 buckets), Slim 256-bit Teddy (8 buckets) +// and Fat 256-bit Teddy (16 buckets). For each variant, there are three +// implementations, corresponding to mask lengths of 1, 2 and 3. Bringing it to +// a total of nine variants. Each one is structured roughly the same: +// +// while at <= len(haystack) - CHUNK_SIZE: +// let candidate = find_candidate_in_chunk(haystack, at) +// if not all zeroes(candidate): +// if match = verify(haystack, at, candidate): +// return match +// +// For the most part, this remains unchanged. The parts that vary are the +// verification routine (for slim vs fat Teddy) and the candidate extraction +// (based on the number of masks). +// +// In the code below, a "candidate" corresponds to a single vector with 8-bit +// lanes. Each lane is itself an 8-bit bitset, where the ith bit is set in the +// jth lane if and only if the byte occurring at position `j` is in the +// bucket `i` (where the `j`th position is the position in the current window +// of the haystack, which is always 16 or 32 bytes). Note to be careful here: +// the ith bit and the jth lane correspond to the least significant bits of the +// vector. So when visualizing how the current window of bytes is stored in a +// vector, you often need to flip it around. For example, the text `abcd` in a +// 4-byte vector would look like this: +// +// 01100100 01100011 01100010 01100001 +// d c b a +// +// When the mask length is 1, then finding the candidate is pretty straight +// forward: you just apply the shuffle indices (from the haystack window) to +// the masks, and then AND them together, as described in the README. But for +// masks of length 2 and 3, you need to keep a little state. Specifically, +// you need to store the final 1 (for mask length 2) or 2 (for mask length 3) +// bytes of the candidate for use when searching the next window. This is for +// handling matches that span two windows. +// +// With respect to the repeated code, it would likely be possible to reduce +// the number of copies of code below using polymorphism, but I find this +// formulation clearer instead of needing to reason through generics. However, +// I admit, there may be a simpler generic construction that I'm missing. +// +// All variants are fairly heavily tested in src/packed/tests.rs. + +use core::{arch::x86_64::*, mem}; + +use alloc::vec::Vec; + +use crate::{ + packed::{ + pattern::{PatternID, Patterns}, + teddy::compile, + vector, + }, + util::search::Match, +}; + +/// The Teddy runtime. +/// +/// A Teddy runtime can be used to quickly search for occurrences of one or +/// more patterns. While it does not scale to an arbitrary number of patterns +/// like Aho-Corasick, it does find occurrences for a small set of patterns +/// much more quickly than Aho-Corasick. +/// +/// Teddy cannot run on small haystacks below a certain size, which is +/// dependent on the type of matcher used. This size can be queried via the +/// `minimum_len` method. Violating this will result in a panic. +/// +/// Finally, when callers use a Teddy runtime, they must provide precisely the +/// patterns used to construct the Teddy matcher. Violating this will result +/// in either a panic or incorrect results, but will never sacrifice memory +/// safety. +#[derive(Clone, Debug)] +pub struct Teddy { + /// The allocation of patterns in buckets. This only contains the IDs of + /// patterns. In order to do full verification, callers must provide the + /// actual patterns when using Teddy. + pub buckets: Vec>, + /// The maximum identifier of a pattern. This is used as a sanity check to + /// ensure that the patterns provided by the caller are the same as the + /// patterns that were used to compile the matcher. This sanity check + /// permits safely eliminating bounds checks regardless of what patterns + /// are provided by the caller. + /// + /// Note that users of the aho-corasick crate cannot get this wrong. Only + /// code internal to this crate can get it wrong, since neither `Patterns` + /// type nor the Teddy runtime are public API items. + pub max_pattern_id: PatternID, + /// The actual runtime to use. + pub exec: Exec, +} + +impl Teddy { + /// Return the first occurrence of a match in the given haystack after or + /// starting at `at`. + /// + /// The patterns provided must be precisely the same patterns given to the + /// Teddy builder, otherwise this may panic or produce incorrect results. + /// + /// All matches are consistent with the match semantics (leftmost-first or + /// leftmost-longest) set on `pats`. + pub fn find_at( + &self, + pats: &Patterns, + haystack: &[u8], + at: usize, + ) -> Option { + // This assert is a bit subtle, but it's an important guarantee. + // Namely, if the maximum pattern ID seen by Teddy is the same as the + // one in the patterns given, then we are guaranteed that every pattern + // ID in all Teddy buckets are valid indices into `pats`. While this + // is nominally true, there is no guarantee that callers provide the + // same `pats` to both the Teddy builder and the searcher, which would + // otherwise make `find_at` unsafe to call. But this assert lets us + // keep this routine safe and eliminate an important bounds check in + // verification. + assert_eq!( + self.max_pattern_id, + pats.max_pattern_id(), + "teddy must be called with same patterns it was built with", + ); + // SAFETY: The haystack must have at least a minimum number of bytes + // for Teddy to be able to work. The minimum number varies depending on + // which matcher is used below. If this is violated, then it's possible + // for searching to do out-of-bounds writes. + assert!(haystack[at..].len() >= self.minimum_len()); + // SAFETY: The various Teddy matchers are always safe to call because + // the Teddy builder guarantees that a particular Exec variant is + // built only when it can be run the current CPU. That is, the Teddy + // builder will not produce a Exec::TeddySlim1Mask256 unless AVX2 is + // enabled. That is, our dynamic CPU feature detection is performed + // once in the builder, and we rely on the type system to avoid needing + // to do it again. + unsafe { + match self.exec { + Exec::TeddySlim1Mask128(ref e) => { + e.find_at(pats, self, haystack, at) + } + Exec::TeddySlim1Mask256(ref e) => { + e.find_at(pats, self, haystack, at) + } + Exec::TeddyFat1Mask256(ref e) => { + e.find_at(pats, self, haystack, at) + } + Exec::TeddySlim2Mask128(ref e) => { + e.find_at(pats, self, haystack, at) + } + Exec::TeddySlim2Mask256(ref e) => { + e.find_at(pats, self, haystack, at) + } + Exec::TeddyFat2Mask256(ref e) => { + e.find_at(pats, self, haystack, at) + } + Exec::TeddySlim3Mask128(ref e) => { + e.find_at(pats, self, haystack, at) + } + Exec::TeddySlim3Mask256(ref e) => { + e.find_at(pats, self, haystack, at) + } + Exec::TeddyFat3Mask256(ref e) => { + e.find_at(pats, self, haystack, at) + } + Exec::TeddySlim4Mask128(ref e) => { + e.find_at(pats, self, haystack, at) + } + Exec::TeddySlim4Mask256(ref e) => { + e.find_at(pats, self, haystack, at) + } + Exec::TeddyFat4Mask256(ref e) => { + e.find_at(pats, self, haystack, at) + } + } + } + } + + /// Returns the minimum length of a haystack that must be provided by + /// callers to this Teddy searcher. Providing a haystack shorter than this + /// will result in a panic, but will never violate memory safety. + pub fn minimum_len(&self) -> usize { + // SAFETY: These values must be correct in order to ensure safety. + // The Teddy runtime assumes their haystacks have at least these + // lengths. Violating this will sacrifice memory safety. + match self.exec { + Exec::TeddySlim1Mask128(_) => 16, + Exec::TeddySlim1Mask256(_) => 32, + Exec::TeddyFat1Mask256(_) => 16, + Exec::TeddySlim2Mask128(_) => 17, + Exec::TeddySlim2Mask256(_) => 33, + Exec::TeddyFat2Mask256(_) => 17, + Exec::TeddySlim3Mask128(_) => 18, + Exec::TeddySlim3Mask256(_) => 34, + Exec::TeddyFat3Mask256(_) => 18, + Exec::TeddySlim4Mask128(_) => 19, + Exec::TeddySlim4Mask256(_) => 35, + Exec::TeddyFat4Mask256(_) => 19, + } + } + + /// Returns the approximate total amount of heap used by this searcher, in + /// units of bytes. + pub fn memory_usage(&self) -> usize { + let num_patterns = self.max_pattern_id as usize + 1; + self.buckets.len() * mem::size_of::>() + + num_patterns * mem::size_of::() + } + + /// Runs the verification routine for Slim 128-bit Teddy. + /// + /// The candidate given should be a collection of 8-bit bitsets (one bitset + /// per lane), where the ith bit is set in the jth lane if and only if the + /// byte occurring at `at + j` in `haystack` is in the bucket `i`. + /// + /// This is not safe to call unless the SSSE3 target feature is enabled. + /// The `target_feature` attribute is not applied since this function is + /// always forcefully inlined. + #[inline(always)] + unsafe fn verify128( + &self, + pats: &Patterns, + haystack: &[u8], + at: usize, + cand: __m128i, + ) -> Option { + debug_assert!(!vector::is_all_zeroes128(cand)); + debug_assert_eq!(8, self.buckets.len()); + + // Convert the candidate into 64-bit chunks, and then verify each of + // those chunks. + let parts = vector::unpack64x128(cand); + for (i, &part) in parts.iter().enumerate() { + let pos = at + i * 8; + if let Some(m) = self.verify64(pats, 8, haystack, pos, part) { + return Some(m); + } + } + None + } + + /// Runs the verification routine for Slim 256-bit Teddy. + /// + /// The candidate given should be a collection of 8-bit bitsets (one bitset + /// per lane), where the ith bit is set in the jth lane if and only if the + /// byte occurring at `at + j` in `haystack` is in the bucket `i`. + /// + /// This is not safe to call unless the AVX2 target feature is enabled. + /// The `target_feature` attribute is not applied since this function is + /// always forcefully inlined. + #[inline(always)] + unsafe fn verify256( + &self, + pats: &Patterns, + haystack: &[u8], + at: usize, + cand: __m256i, + ) -> Option { + debug_assert!(!vector::is_all_zeroes256(cand)); + debug_assert_eq!(8, self.buckets.len()); + + // Convert the candidate into 64-bit chunks, and then verify each of + // those chunks. + let parts = vector::unpack64x256(cand); + let mut pos = at; + if let Some(m) = self.verify64(pats, 8, haystack, pos, parts[0]) { + return Some(m); + } + pos += 8; + if let Some(m) = self.verify64(pats, 8, haystack, pos, parts[1]) { + return Some(m); + } + pos += 8; + if let Some(m) = self.verify64(pats, 8, haystack, pos, parts[2]) { + return Some(m); + } + pos += 8; + if let Some(m) = self.verify64(pats, 8, haystack, pos, parts[3]) { + return Some(m); + } + None + } + + /// Runs the verification routine for Fat 256-bit Teddy. + /// + /// The candidate given should be a collection of 8-bit bitsets (one bitset + /// per lane), where the ith bit is set in the jth lane if and only if the + /// byte occurring at `at + (j < 16 ? j : j - 16)` in `haystack` is in the + /// bucket `j < 16 ? i : i + 8`. + /// + /// This is not safe to call unless the AVX2 target feature is enabled. + /// The `target_feature` attribute is not applied since this function is + /// always forcefully inlined. + #[inline(always)] + unsafe fn verify_fat256( + &self, + pats: &Patterns, + haystack: &[u8], + at: usize, + cand: __m256i, + ) -> Option { + debug_assert!(!vector::is_all_zeroes256(cand)); + debug_assert_eq!(16, self.buckets.len()); + + // This is a bit tricky, but we basically want to convert our + // candidate, which looks like this + // + // a31 a30 ... a17 a16 a15 a14 ... a01 a00 + // + // where each a(i) is an 8-bit bitset corresponding to the activated + // buckets, to this + // + // a31 a15 a30 a14 a29 a13 ... a18 a02 a17 a01 a16 a00 + // + // Namely, for Fat Teddy, the high 128-bits of the candidate correspond + // to the same bytes in the haystack in the low 128-bits (so we only + // scan 16 bytes at a time), but are for buckets 8-15 instead of 0-7. + // + // The verification routine wants to look at all potentially matching + // buckets before moving on to the next lane. So for example, both + // a16 and a00 both correspond to the first byte in our window; a00 + // contains buckets 0-7 and a16 contains buckets 8-15. Specifically, + // a16 should be checked before a01. So the transformation shown above + // allows us to use our normal verification procedure with one small + // change: we treat each bitset as 16 bits instead of 8 bits. + + // Swap the 128-bit lanes in the candidate vector. + let swap = _mm256_permute4x64_epi64(cand, 0x4E); + // Interleave the bytes from the low 128-bit lanes, starting with + // cand first. + let r1 = _mm256_unpacklo_epi8(cand, swap); + // Interleave the bytes from the high 128-bit lanes, starting with + // cand first. + let r2 = _mm256_unpackhi_epi8(cand, swap); + // Now just take the 2 low 64-bit integers from both r1 and r2. We + // can drop the high 64-bit integers because they are a mirror image + // of the low 64-bit integers. All we care about are the low 128-bit + // lanes of r1 and r2. Combined, they contain all our 16-bit bitsets + // laid out in the desired order, as described above. + let parts = vector::unpacklo64x256(r1, r2); + for (i, &part) in parts.iter().enumerate() { + let pos = at + i * 4; + if let Some(m) = self.verify64(pats, 16, haystack, pos, part) { + return Some(m); + } + } + None + } + + /// Verify whether there are any matches starting at or after `at` in the + /// given `haystack`. The candidate given should correspond to either 8-bit + /// (for 8 buckets) or 16-bit (16 buckets) bitsets. + #[inline(always)] + fn verify64( + &self, + pats: &Patterns, + bucket_count: usize, + haystack: &[u8], + at: usize, + mut cand: u64, + ) -> Option { + // N.B. While the bucket count is known from self.buckets.len(), + // requiring it as a parameter makes it easier for the optimizer to + // know its value, and thus produce more efficient codegen. + debug_assert!(bucket_count == 8 || bucket_count == 16); + while cand != 0 { + let bit = cand.trailing_zeros() as usize; + cand &= !(1 << bit); + + let at = at + (bit / bucket_count); + let bucket = bit % bucket_count; + if let Some(m) = self.verify_bucket(pats, haystack, bucket, at) { + return Some(m); + } + } + None + } + + /// Verify whether there are any matches starting at `at` in the given + /// `haystack` corresponding only to patterns in the given bucket. + #[inline(always)] + fn verify_bucket( + &self, + pats: &Patterns, + haystack: &[u8], + bucket: usize, + at: usize, + ) -> Option { + // Forcing this function to not inline and be "cold" seems to help + // the codegen for Teddy overall. Interestingly, this is good for a + // 16% boost in the sherlock/packed/teddy/name/alt1 benchmark (among + // others). Overall, this seems like a problem with codegen, since + // creating the Match itself is a very small amount of code. + #[cold] + #[inline(never)] + fn match_from_span( + pati: PatternID, + start: usize, + end: usize, + ) -> Match { + Match::must(pati as usize, start..end) + } + + // N.B. The bounds check for this bucket lookup *should* be elided + // since we assert the number of buckets in each `find_at` routine, + // and the compiler can prove that the `% 8` (or `% 16`) in callers + // of this routine will always be in bounds. + for &pati in &self.buckets[bucket] { + // SAFETY: This is safe because we are guaranteed that every + // index in a Teddy bucket is a valid index into `pats`. This + // guarantee is upheld by the assert checking `max_pattern_id` in + // the beginning of `find_at` above. + // + // This explicit bounds check elision is (amazingly) good for a + // 25-50% boost in some benchmarks, particularly ones with a lot + // of short literals. + let pat = unsafe { pats.get_unchecked(pati) }; + if pat.is_prefix(&haystack[at..]) { + return Some(match_from_span(pati, at, at + pat.len())); + } + } + None + } +} + +/// Exec represents the different search strategies supported by the Teddy +/// runtime. +/// +/// This enum is an important safety abstraction. Namely, callers should only +/// construct a variant in this enum if it is safe to execute its corresponding +/// target features on the current CPU. The 128-bit searchers require SSSE3, +/// while the 256-bit searchers require AVX2. +#[derive(Clone, Debug)] +pub enum Exec { + TeddySlim1Mask128(TeddySlim1Mask128), + TeddySlim1Mask256(TeddySlim1Mask256), + TeddyFat1Mask256(TeddyFat1Mask256), + TeddySlim2Mask128(TeddySlim2Mask128), + TeddySlim2Mask256(TeddySlim2Mask256), + TeddyFat2Mask256(TeddyFat2Mask256), + TeddySlim3Mask128(TeddySlim3Mask128), + TeddySlim3Mask256(TeddySlim3Mask256), + TeddyFat3Mask256(TeddyFat3Mask256), + TeddySlim4Mask128(TeddySlim4Mask128), + TeddySlim4Mask256(TeddySlim4Mask256), + TeddyFat4Mask256(TeddyFat4Mask256), +} + +// Most of the code below remains undocumented because they are effectively +// repeated versions of themselves. The general structure is described in the +// README and in the comments above. + +#[derive(Clone, Debug)] +pub struct TeddySlim1Mask128 { + pub mask1: Mask128, +} + +impl TeddySlim1Mask128 { + #[target_feature(enable = "ssse3")] + unsafe fn find_at( + &self, + pats: &Patterns, + teddy: &Teddy, + haystack: &[u8], + mut at: usize, + ) -> Option { + debug_assert!(haystack[at..].len() >= teddy.minimum_len()); + // This assert helps eliminate bounds checks for bucket lookups in + // Teddy::verify_bucket, which has a small (3-4%) performance boost. + assert_eq!(8, teddy.buckets.len()); + + let len = haystack.len(); + while at <= len - 16 { + let c = self.candidate(haystack, at); + if !vector::is_all_zeroes128(c) { + if let Some(m) = teddy.verify128(pats, haystack, at, c) { + return Some(m); + } + } + at += 16; + } + if at < len { + at = len - 16; + let c = self.candidate(haystack, at); + if !vector::is_all_zeroes128(c) { + if let Some(m) = teddy.verify128(pats, haystack, at, c) { + return Some(m); + } + } + } + None + } + + #[inline(always)] + unsafe fn candidate(&self, haystack: &[u8], at: usize) -> __m128i { + debug_assert!(haystack[at..].len() >= 16); + + let chunk = vector::loadu128(haystack, at); + members1m128(chunk, self.mask1) + } +} + +#[derive(Clone, Debug)] +pub struct TeddySlim1Mask256 { + pub mask1: Mask256, +} + +impl TeddySlim1Mask256 { + #[target_feature(enable = "avx2")] + unsafe fn find_at( + &self, + pats: &Patterns, + teddy: &Teddy, + haystack: &[u8], + mut at: usize, + ) -> Option { + debug_assert!(haystack[at..].len() >= teddy.minimum_len()); + // This assert helps eliminate bounds checks for bucket lookups in + // Teddy::verify_bucket, which has a small (3-4%) performance boost. + assert_eq!(8, teddy.buckets.len()); + + let len = haystack.len(); + while at <= len - 32 { + let c = self.candidate(haystack, at); + if !vector::is_all_zeroes256(c) { + if let Some(m) = teddy.verify256(pats, haystack, at, c) { + return Some(m); + } + } + at += 32; + } + if at < len { + at = len - 32; + let c = self.candidate(haystack, at); + if !vector::is_all_zeroes256(c) { + if let Some(m) = teddy.verify256(pats, haystack, at, c) { + return Some(m); + } + } + } + None + } + + #[inline(always)] + unsafe fn candidate(&self, haystack: &[u8], at: usize) -> __m256i { + debug_assert!(haystack[at..].len() >= 32); + + let chunk = vector::loadu256(haystack, at); + members1m256(chunk, self.mask1) + } +} + +#[derive(Clone, Debug)] +pub struct TeddyFat1Mask256 { + pub mask1: Mask256, +} + +impl TeddyFat1Mask256 { + #[target_feature(enable = "avx2")] + unsafe fn find_at( + &self, + pats: &Patterns, + teddy: &Teddy, + haystack: &[u8], + mut at: usize, + ) -> Option { + debug_assert!(haystack[at..].len() >= teddy.minimum_len()); + // This assert helps eliminate bounds checks for bucket lookups in + // Teddy::verify_bucket, which has a small (3-4%) performance boost. + assert_eq!(16, teddy.buckets.len()); + + let len = haystack.len(); + while at <= len - 16 { + let c = self.candidate(haystack, at); + if !vector::is_all_zeroes256(c) { + if let Some(m) = teddy.verify_fat256(pats, haystack, at, c) { + return Some(m); + } + } + at += 16; + } + if at < len { + at = len - 16; + let c = self.candidate(haystack, at); + if !vector::is_all_zeroes256(c) { + if let Some(m) = teddy.verify_fat256(pats, haystack, at, c) { + return Some(m); + } + } + } + None + } + + #[inline(always)] + unsafe fn candidate(&self, haystack: &[u8], at: usize) -> __m256i { + debug_assert!(haystack[at..].len() >= 16); + + let chunk = + _mm256_broadcastsi128_si256(vector::loadu128(haystack, at)); + members1m256(chunk, self.mask1) + } +} + +#[derive(Clone, Debug)] +pub struct TeddySlim2Mask128 { + pub mask1: Mask128, + pub mask2: Mask128, +} + +impl TeddySlim2Mask128 { + #[target_feature(enable = "ssse3")] + unsafe fn find_at( + &self, + pats: &Patterns, + teddy: &Teddy, + haystack: &[u8], + mut at: usize, + ) -> Option { + debug_assert!(haystack[at..].len() >= teddy.minimum_len()); + // This assert helps eliminate bounds checks for bucket lookups in + // Teddy::verify_bucket, which has a small (3-4%) performance boost. + assert_eq!(8, teddy.buckets.len()); + + at += 1; + let len = haystack.len(); + let mut prev0 = vector::ones128(); + while at <= len - 16 { + let c = self.candidate(haystack, at, &mut prev0); + if !vector::is_all_zeroes128(c) { + if let Some(m) = teddy.verify128(pats, haystack, at - 1, c) { + return Some(m); + } + } + at += 16; + } + if at < len { + at = len - 16; + prev0 = vector::ones128(); + + let c = self.candidate(haystack, at, &mut prev0); + if !vector::is_all_zeroes128(c) { + if let Some(m) = teddy.verify128(pats, haystack, at - 1, c) { + return Some(m); + } + } + } + None + } + + #[inline(always)] + unsafe fn candidate( + &self, + haystack: &[u8], + at: usize, + prev0: &mut __m128i, + ) -> __m128i { + debug_assert!(haystack[at..].len() >= 16); + + let chunk = vector::loadu128(haystack, at); + let (res0, res1) = members2m128(chunk, self.mask1, self.mask2); + let res0prev0 = _mm_alignr_epi8(res0, *prev0, 15); + _mm_and_si128(res0prev0, res1) + } +} + +#[derive(Clone, Debug)] +pub struct TeddySlim2Mask256 { + pub mask1: Mask256, + pub mask2: Mask256, +} + +impl TeddySlim2Mask256 { + #[target_feature(enable = "avx2")] + unsafe fn find_at( + &self, + pats: &Patterns, + teddy: &Teddy, + haystack: &[u8], + mut at: usize, + ) -> Option { + debug_assert!(haystack[at..].len() >= teddy.minimum_len()); + // This assert helps eliminate bounds checks for bucket lookups in + // Teddy::verify_bucket, which has a small (3-4%) performance boost. + assert_eq!(8, teddy.buckets.len()); + + at += 1; + let len = haystack.len(); + let mut prev0 = vector::ones256(); + while at <= len - 32 { + let c = self.candidate(haystack, at, &mut prev0); + if !vector::is_all_zeroes256(c) { + if let Some(m) = teddy.verify256(pats, haystack, at - 1, c) { + return Some(m); + } + } + at += 32; + } + if at < len { + at = len - 32; + prev0 = vector::ones256(); + + let c = self.candidate(haystack, at, &mut prev0); + if !vector::is_all_zeroes256(c) { + if let Some(m) = teddy.verify256(pats, haystack, at - 1, c) { + return Some(m); + } + } + } + None + } + + #[inline(always)] + unsafe fn candidate( + &self, + haystack: &[u8], + at: usize, + prev0: &mut __m256i, + ) -> __m256i { + debug_assert!(haystack[at..].len() >= 32); + + let chunk = vector::loadu256(haystack, at); + let (res0, res1) = members2m256(chunk, self.mask1, self.mask2); + let res0prev0 = vector::alignr256_15(res0, *prev0); + let res = _mm256_and_si256(res0prev0, res1); + *prev0 = res0; + res + } +} + +#[derive(Clone, Debug)] +pub struct TeddyFat2Mask256 { + pub mask1: Mask256, + pub mask2: Mask256, +} + +impl TeddyFat2Mask256 { + #[target_feature(enable = "avx2")] + unsafe fn find_at( + &self, + pats: &Patterns, + teddy: &Teddy, + haystack: &[u8], + mut at: usize, + ) -> Option { + debug_assert!(haystack[at..].len() >= teddy.minimum_len()); + // This assert helps eliminate bounds checks for bucket lookups in + // Teddy::verify_bucket, which has a small (3-4%) performance boost. + assert_eq!(16, teddy.buckets.len()); + + at += 1; + let len = haystack.len(); + let mut prev0 = vector::ones256(); + while at <= len - 16 { + let c = self.candidate(haystack, at, &mut prev0); + if !vector::is_all_zeroes256(c) { + if let Some(m) = teddy.verify_fat256(pats, haystack, at - 1, c) + { + return Some(m); + } + } + at += 16; + } + if at < len { + at = len - 16; + prev0 = vector::ones256(); + + let c = self.candidate(haystack, at, &mut prev0); + if !vector::is_all_zeroes256(c) { + if let Some(m) = teddy.verify_fat256(pats, haystack, at - 1, c) + { + return Some(m); + } + } + } + None + } + + #[inline(always)] + unsafe fn candidate( + &self, + haystack: &[u8], + at: usize, + prev0: &mut __m256i, + ) -> __m256i { + debug_assert!(haystack[at..].len() >= 16); + + let chunk = + _mm256_broadcastsi128_si256(vector::loadu128(haystack, at)); + let (res0, res1) = members2m256(chunk, self.mask1, self.mask2); + let res0prev0 = _mm256_alignr_epi8(res0, *prev0, 15); + let res = _mm256_and_si256(res0prev0, res1); + *prev0 = res0; + res + } +} + +#[derive(Clone, Debug)] +pub struct TeddySlim3Mask128 { + pub mask1: Mask128, + pub mask2: Mask128, + pub mask3: Mask128, +} + +impl TeddySlim3Mask128 { + #[target_feature(enable = "ssse3")] + unsafe fn find_at( + &self, + pats: &Patterns, + teddy: &Teddy, + haystack: &[u8], + mut at: usize, + ) -> Option { + debug_assert!(haystack[at..].len() >= teddy.minimum_len()); + // This assert helps eliminate bounds checks for bucket lookups in + // Teddy::verify_bucket, which has a small (3-4%) performance boost. + assert_eq!(8, teddy.buckets.len()); + + at += 2; + let len = haystack.len(); + let (mut prev0, mut prev1) = (vector::ones128(), vector::ones128()); + while at <= len - 16 { + let c = self.candidate(haystack, at, &mut prev0, &mut prev1); + if !vector::is_all_zeroes128(c) { + if let Some(m) = teddy.verify128(pats, haystack, at - 2, c) { + return Some(m); + } + } + at += 16; + } + if at < len { + at = len - 16; + prev0 = vector::ones128(); + prev1 = vector::ones128(); + + let c = self.candidate(haystack, at, &mut prev0, &mut prev1); + if !vector::is_all_zeroes128(c) { + if let Some(m) = teddy.verify128(pats, haystack, at - 2, c) { + return Some(m); + } + } + } + None + } + + #[inline(always)] + unsafe fn candidate( + &self, + haystack: &[u8], + at: usize, + prev0: &mut __m128i, + prev1: &mut __m128i, + ) -> __m128i { + debug_assert!(haystack[at..].len() >= 16); + + let chunk = vector::loadu128(haystack, at); + let (res0, res1, res2) = + members3m128(chunk, self.mask1, self.mask2, self.mask3); + let res0prev0 = _mm_alignr_epi8(res0, *prev0, 14); + let res1prev1 = _mm_alignr_epi8(res1, *prev1, 15); + let res = _mm_and_si128(_mm_and_si128(res0prev0, res1prev1), res2); + *prev0 = res0; + *prev1 = res1; + res + } +} + +#[derive(Clone, Debug)] +pub struct TeddySlim3Mask256 { + pub mask1: Mask256, + pub mask2: Mask256, + pub mask3: Mask256, +} + +impl TeddySlim3Mask256 { + #[target_feature(enable = "avx2")] + unsafe fn find_at( + &self, + pats: &Patterns, + teddy: &Teddy, + haystack: &[u8], + mut at: usize, + ) -> Option { + debug_assert!(haystack[at..].len() >= teddy.minimum_len()); + // This assert helps eliminate bounds checks for bucket lookups in + // Teddy::verify_bucket, which has a small (3-4%) performance boost. + assert_eq!(8, teddy.buckets.len()); + + at += 2; + let len = haystack.len(); + let (mut prev0, mut prev1) = (vector::ones256(), vector::ones256()); + while at <= len - 32 { + let c = self.candidate(haystack, at, &mut prev0, &mut prev1); + if !vector::is_all_zeroes256(c) { + if let Some(m) = teddy.verify256(pats, haystack, at - 2, c) { + return Some(m); + } + } + at += 32; + } + if at < len { + at = len - 32; + prev0 = vector::ones256(); + prev1 = vector::ones256(); + + let c = self.candidate(haystack, at, &mut prev0, &mut prev1); + if !vector::is_all_zeroes256(c) { + if let Some(m) = teddy.verify256(pats, haystack, at - 2, c) { + return Some(m); + } + } + } + None + } + + #[inline(always)] + unsafe fn candidate( + &self, + haystack: &[u8], + at: usize, + prev0: &mut __m256i, + prev1: &mut __m256i, + ) -> __m256i { + debug_assert!(haystack[at..].len() >= 32); + + let chunk = vector::loadu256(haystack, at); + let (res0, res1, res2) = + members3m256(chunk, self.mask1, self.mask2, self.mask3); + let res0prev0 = vector::alignr256_14(res0, *prev0); + let res1prev1 = vector::alignr256_15(res1, *prev1); + let res = + _mm256_and_si256(_mm256_and_si256(res0prev0, res1prev1), res2); + *prev0 = res0; + *prev1 = res1; + res + } +} + +#[derive(Clone, Debug)] +pub struct TeddyFat3Mask256 { + pub mask1: Mask256, + pub mask2: Mask256, + pub mask3: Mask256, +} + +impl TeddyFat3Mask256 { + #[target_feature(enable = "avx2")] + unsafe fn find_at( + &self, + pats: &Patterns, + teddy: &Teddy, + haystack: &[u8], + mut at: usize, + ) -> Option { + debug_assert!(haystack[at..].len() >= teddy.minimum_len()); + // This assert helps eliminate bounds checks for bucket lookups in + // Teddy::verify_bucket, which has a small (3-4%) performance boost. + assert_eq!(16, teddy.buckets.len()); + + at += 2; + let len = haystack.len(); + let (mut prev0, mut prev1) = (vector::ones256(), vector::ones256()); + while at <= len - 16 { + let c = self.candidate(haystack, at, &mut prev0, &mut prev1); + if !vector::is_all_zeroes256(c) { + if let Some(m) = teddy.verify_fat256(pats, haystack, at - 2, c) + { + return Some(m); + } + } + at += 16; + } + if at < len { + at = len - 16; + prev0 = vector::ones256(); + prev1 = vector::ones256(); + + let c = self.candidate(haystack, at, &mut prev0, &mut prev1); + if !vector::is_all_zeroes256(c) { + if let Some(m) = teddy.verify_fat256(pats, haystack, at - 2, c) + { + return Some(m); + } + } + } + None + } + + #[inline(always)] + unsafe fn candidate( + &self, + haystack: &[u8], + at: usize, + prev0: &mut __m256i, + prev1: &mut __m256i, + ) -> __m256i { + debug_assert!(haystack[at..].len() >= 16); + + let chunk = + _mm256_broadcastsi128_si256(vector::loadu128(haystack, at)); + let (res0, res1, res2) = + members3m256(chunk, self.mask1, self.mask2, self.mask3); + let res0prev0 = _mm256_alignr_epi8(res0, *prev0, 14); + let res1prev1 = _mm256_alignr_epi8(res1, *prev1, 15); + let res = + _mm256_and_si256(_mm256_and_si256(res0prev0, res1prev1), res2); + *prev0 = res0; + *prev1 = res1; + res + } +} + +#[derive(Clone, Debug)] +pub struct TeddySlim4Mask128 { + pub mask1: Mask128, + pub mask2: Mask128, + pub mask3: Mask128, + pub mask4: Mask128, +} + +impl TeddySlim4Mask128 { + #[target_feature(enable = "ssse3")] + unsafe fn find_at( + &self, + pats: &Patterns, + teddy: &Teddy, + haystack: &[u8], + mut at: usize, + ) -> Option { + debug_assert!(haystack[at..].len() >= teddy.minimum_len()); + // This assert helps eliminate bounds checks for bucket lookups in + // Teddy::verify_bucket, which has a small (3-4%) performance boost. + assert_eq!(8, teddy.buckets.len()); + + at += 3; + let len = haystack.len(); + let mut prev0 = vector::ones128(); + let mut prev1 = vector::ones128(); + let mut prev2 = vector::ones128(); + while at <= len - 16 { + let c = self + .candidate(haystack, at, &mut prev0, &mut prev1, &mut prev2); + if !vector::is_all_zeroes128(c) { + if let Some(m) = teddy.verify128(pats, haystack, at - 3, c) { + return Some(m); + } + } + at += 16; + } + if at < len { + at = len - 16; + prev0 = vector::ones128(); + prev1 = vector::ones128(); + prev2 = vector::ones128(); + + let c = self + .candidate(haystack, at, &mut prev0, &mut prev1, &mut prev2); + if !vector::is_all_zeroes128(c) { + if let Some(m) = teddy.verify128(pats, haystack, at - 3, c) { + return Some(m); + } + } + } + None + } + + #[inline(always)] + unsafe fn candidate( + &self, + haystack: &[u8], + at: usize, + prev0: &mut __m128i, + prev1: &mut __m128i, + prev2: &mut __m128i, + ) -> __m128i { + debug_assert!(haystack[at..].len() >= 16); + + let chunk = vector::loadu128(haystack, at); + let (res0, res1, res2, res3) = members4m128( + chunk, self.mask1, self.mask2, self.mask3, self.mask4, + ); + let res0prev0 = _mm_alignr_epi8(res0, *prev0, 13); + let res1prev1 = _mm_alignr_epi8(res1, *prev1, 14); + let res2prev2 = _mm_alignr_epi8(res2, *prev2, 15); + let res = _mm_and_si128( + _mm_and_si128(_mm_and_si128(res0prev0, res1prev1), res2prev2), + res3, + ); + *prev0 = res0; + *prev1 = res1; + *prev2 = res2; + res + } +} + +#[derive(Clone, Debug)] +pub struct TeddySlim4Mask256 { + pub mask1: Mask256, + pub mask2: Mask256, + pub mask3: Mask256, + pub mask4: Mask256, +} + +impl TeddySlim4Mask256 { + #[target_feature(enable = "avx2")] + unsafe fn find_at( + &self, + pats: &Patterns, + teddy: &Teddy, + haystack: &[u8], + mut at: usize, + ) -> Option { + debug_assert!(haystack[at..].len() >= teddy.minimum_len()); + // This assert helps eliminate bounds checks for bucket lookups in + // Teddy::verify_bucket, which has a small (3-4%) performance boost. + assert_eq!(8, teddy.buckets.len()); + + at += 3; + let len = haystack.len(); + let mut prev0 = vector::ones256(); + let mut prev1 = vector::ones256(); + let mut prev2 = vector::ones256(); + while at <= len - 32 { + let c = self + .candidate(haystack, at, &mut prev0, &mut prev1, &mut prev2); + if !vector::is_all_zeroes256(c) { + if let Some(m) = teddy.verify256(pats, haystack, at - 3, c) { + return Some(m); + } + } + at += 32; + } + if at < len { + at = len - 32; + prev0 = vector::ones256(); + prev1 = vector::ones256(); + prev2 = vector::ones256(); + + let c = self + .candidate(haystack, at, &mut prev0, &mut prev1, &mut prev2); + if !vector::is_all_zeroes256(c) { + if let Some(m) = teddy.verify256(pats, haystack, at - 3, c) { + return Some(m); + } + } + } + None + } + + #[inline(always)] + unsafe fn candidate( + &self, + haystack: &[u8], + at: usize, + prev0: &mut __m256i, + prev1: &mut __m256i, + prev2: &mut __m256i, + ) -> __m256i { + debug_assert!(haystack[at..].len() >= 32); + + let chunk = vector::loadu256(haystack, at); + let (res0, res1, res2, res3) = members4m256( + chunk, self.mask1, self.mask2, self.mask3, self.mask4, + ); + let res0prev0 = vector::alignr256_13(res0, *prev0); + let res1prev1 = vector::alignr256_14(res1, *prev1); + let res2prev2 = vector::alignr256_15(res2, *prev2); + let res = _mm256_and_si256( + _mm256_and_si256( + _mm256_and_si256(res0prev0, res1prev1), + res2prev2, + ), + res3, + ); + *prev0 = res0; + *prev1 = res1; + *prev2 = res2; + res + } +} + +#[derive(Clone, Debug)] +pub struct TeddyFat4Mask256 { + pub mask1: Mask256, + pub mask2: Mask256, + pub mask3: Mask256, + pub mask4: Mask256, +} + +impl TeddyFat4Mask256 { + #[target_feature(enable = "avx2")] + unsafe fn find_at( + &self, + pats: &Patterns, + teddy: &Teddy, + haystack: &[u8], + mut at: usize, + ) -> Option { + debug_assert!(haystack[at..].len() >= teddy.minimum_len()); + // This assert helps eliminate bounds checks for bucket lookups in + // Teddy::verify_bucket, which has a small (3-4%) performance boost. + assert_eq!(16, teddy.buckets.len()); + + at += 3; + let len = haystack.len(); + let mut prev0 = vector::ones256(); + let mut prev1 = vector::ones256(); + let mut prev2 = vector::ones256(); + while at <= len - 16 { + let c = self + .candidate(haystack, at, &mut prev0, &mut prev1, &mut prev2); + if !vector::is_all_zeroes256(c) { + if let Some(m) = teddy.verify_fat256(pats, haystack, at - 3, c) + { + return Some(m); + } + } + at += 16; + } + if at < len { + at = len - 16; + prev0 = vector::ones256(); + prev1 = vector::ones256(); + prev2 = vector::ones256(); + + let c = self + .candidate(haystack, at, &mut prev0, &mut prev1, &mut prev2); + if !vector::is_all_zeroes256(c) { + if let Some(m) = teddy.verify_fat256(pats, haystack, at - 3, c) + { + return Some(m); + } + } + } + None + } + + #[inline(always)] + unsafe fn candidate( + &self, + haystack: &[u8], + at: usize, + prev0: &mut __m256i, + prev1: &mut __m256i, + prev2: &mut __m256i, + ) -> __m256i { + debug_assert!(haystack[at..].len() >= 16); + + let chunk = + _mm256_broadcastsi128_si256(vector::loadu128(haystack, at)); + let (res0, res1, res2, res3) = members4m256( + chunk, self.mask1, self.mask2, self.mask3, self.mask4, + ); + let res0prev0 = _mm256_alignr_epi8(res0, *prev0, 13); + let res1prev1 = _mm256_alignr_epi8(res1, *prev1, 14); + let res2prev2 = _mm256_alignr_epi8(res2, *prev2, 15); + let res = _mm256_and_si256( + _mm256_and_si256( + _mm256_and_si256(res0prev0, res1prev1), + res2prev2, + ), + res3, + ); + *prev0 = res0; + *prev1 = res1; + *prev2 = res2; + res + } +} + +/// A 128-bit mask for the low and high nybbles in a set of patterns. Each +/// lane `j` corresponds to a bitset where the `i`th bit is set if and only if +/// the nybble `j` is in the bucket `i` at a particular position. +#[derive(Clone, Copy, Debug)] +pub struct Mask128 { + lo: __m128i, + hi: __m128i, +} + +impl Mask128 { + /// Create a new SIMD mask from the mask produced by the Teddy builder. + pub fn new(mask: compile::Mask) -> Mask128 { + // SAFETY: This is safe since [u8; 16] has the same representation + // as __m128i. + unsafe { + Mask128 { + lo: mem::transmute(mask.lo128()), + hi: mem::transmute(mask.hi128()), + } + } + } +} + +/// A 256-bit mask for the low and high nybbles in a set of patterns. Each +/// lane `j` corresponds to a bitset where the `i`th bit is set if and only if +/// the nybble `j` is in the bucket `i` at a particular position. +/// +/// This is slightly tweaked dependending on whether Slim or Fat Teddy is being +/// used. For Slim Teddy, the bitsets in the lower 128-bits are the same as +/// the bitsets in the higher 128-bits, so that we can search 32 bytes at a +/// time. (Remember, the nybbles in the haystack are used as indices into these +/// masks, and 256-bit shuffles only operate on 128-bit lanes.) +/// +/// For Fat Teddy, the bitsets are not repeated, but instead, the high 128 +/// bits correspond to buckets 8-15. So that a bitset `00100010` has buckets +/// 1 and 5 set if it's in the lower 128 bits, but has buckets 9 and 13 set +/// if it's in the higher 128 bits. +#[derive(Clone, Copy, Debug)] +pub struct Mask256 { + lo: __m256i, + hi: __m256i, +} + +impl Mask256 { + /// Create a new SIMD mask from the mask produced by the Teddy builder. + pub fn new(mask: compile::Mask) -> Mask256 { + // SAFETY: This is safe since [u8; 32] has the same representation + // as __m256i. + unsafe { + Mask256 { + lo: mem::transmute(mask.lo256()), + hi: mem::transmute(mask.hi256()), + } + } + } +} + +// The "members" routines below are responsible for taking a chunk of bytes, +// a number of nybble masks and returning the result of using the masks to +// lookup bytes in the chunk. The results of the high and low nybble masks are +// AND'ed together, such that each candidate returned is a vector, with byte +// sized lanes, and where each lane is an 8-bit bitset corresponding to the +// buckets that contain the corresponding byte. +// +// In the case of masks of length greater than 1, callers will need to keep +// the results from the previous haystack's window, and then shift the vectors +// so that they all line up. Then they can be AND'ed together. + +/// Return a candidate for Slim 128-bit Teddy, where `chunk` corresponds to a +/// 16-byte window of the haystack (where the least significant byte +/// corresponds to the start of the window), and `mask1` corresponds to a +/// low/high mask for the first byte of all patterns that are being searched. +#[target_feature(enable = "ssse3")] +unsafe fn members1m128(chunk: __m128i, mask1: Mask128) -> __m128i { + let lomask = _mm_set1_epi8(0xF); + let hlo = _mm_and_si128(chunk, lomask); + let hhi = _mm_and_si128(_mm_srli_epi16(chunk, 4), lomask); + _mm_and_si128( + _mm_shuffle_epi8(mask1.lo, hlo), + _mm_shuffle_epi8(mask1.hi, hhi), + ) +} + +/// Return a candidate for Slim 256-bit Teddy, where `chunk` corresponds to a +/// 32-byte window of the haystack (where the least significant byte +/// corresponds to the start of the window), and `mask1` corresponds to a +/// low/high mask for the first byte of all patterns that are being searched. +/// +/// Note that this can also be used for Fat Teddy, where the high 128 bits in +/// `chunk` is the same as the low 128 bits, which corresponds to a 16 byte +/// window in the haystack. +#[target_feature(enable = "avx2")] +unsafe fn members1m256(chunk: __m256i, mask1: Mask256) -> __m256i { + let lomask = _mm256_set1_epi8(0xF); + let hlo = _mm256_and_si256(chunk, lomask); + let hhi = _mm256_and_si256(_mm256_srli_epi16(chunk, 4), lomask); + _mm256_and_si256( + _mm256_shuffle_epi8(mask1.lo, hlo), + _mm256_shuffle_epi8(mask1.hi, hhi), + ) +} + +/// Return candidates for Slim 128-bit Teddy, where `chunk` corresponds +/// to a 16-byte window of the haystack (where the least significant byte +/// corresponds to the start of the window), and the masks correspond to a +/// low/high mask for the first and second bytes of all patterns that are being +/// searched. The vectors returned correspond to candidates for the first and +/// second bytes in the patterns represented by the masks. +#[target_feature(enable = "ssse3")] +unsafe fn members2m128( + chunk: __m128i, + mask1: Mask128, + mask2: Mask128, +) -> (__m128i, __m128i) { + let lomask = _mm_set1_epi8(0xF); + let hlo = _mm_and_si128(chunk, lomask); + let hhi = _mm_and_si128(_mm_srli_epi16(chunk, 4), lomask); + let res0 = _mm_and_si128( + _mm_shuffle_epi8(mask1.lo, hlo), + _mm_shuffle_epi8(mask1.hi, hhi), + ); + let res1 = _mm_and_si128( + _mm_shuffle_epi8(mask2.lo, hlo), + _mm_shuffle_epi8(mask2.hi, hhi), + ); + (res0, res1) +} + +/// Return candidates for Slim 256-bit Teddy, where `chunk` corresponds +/// to a 32-byte window of the haystack (where the least significant byte +/// corresponds to the start of the window), and the masks correspond to a +/// low/high mask for the first and second bytes of all patterns that are being +/// searched. The vectors returned correspond to candidates for the first and +/// second bytes in the patterns represented by the masks. +/// +/// Note that this can also be used for Fat Teddy, where the high 128 bits in +/// `chunk` is the same as the low 128 bits, which corresponds to a 16 byte +/// window in the haystack. +#[target_feature(enable = "avx2")] +unsafe fn members2m256( + chunk: __m256i, + mask1: Mask256, + mask2: Mask256, +) -> (__m256i, __m256i) { + let lomask = _mm256_set1_epi8(0xF); + let hlo = _mm256_and_si256(chunk, lomask); + let hhi = _mm256_and_si256(_mm256_srli_epi16(chunk, 4), lomask); + let res0 = _mm256_and_si256( + _mm256_shuffle_epi8(mask1.lo, hlo), + _mm256_shuffle_epi8(mask1.hi, hhi), + ); + let res1 = _mm256_and_si256( + _mm256_shuffle_epi8(mask2.lo, hlo), + _mm256_shuffle_epi8(mask2.hi, hhi), + ); + (res0, res1) +} + +/// Return candidates for Slim 128-bit Teddy, where `chunk` corresponds +/// to a 16-byte window of the haystack (where the least significant byte +/// corresponds to the start of the window), and the masks correspond to a +/// low/high mask for the first, second and third bytes of all patterns that +/// are being searched. The vectors returned correspond to candidates for the +/// first, second and third bytes in the patterns represented by the masks. +#[target_feature(enable = "ssse3")] +unsafe fn members3m128( + chunk: __m128i, + mask1: Mask128, + mask2: Mask128, + mask3: Mask128, +) -> (__m128i, __m128i, __m128i) { + let lomask = _mm_set1_epi8(0xF); + let hlo = _mm_and_si128(chunk, lomask); + let hhi = _mm_and_si128(_mm_srli_epi16(chunk, 4), lomask); + let res0 = _mm_and_si128( + _mm_shuffle_epi8(mask1.lo, hlo), + _mm_shuffle_epi8(mask1.hi, hhi), + ); + let res1 = _mm_and_si128( + _mm_shuffle_epi8(mask2.lo, hlo), + _mm_shuffle_epi8(mask2.hi, hhi), + ); + let res2 = _mm_and_si128( + _mm_shuffle_epi8(mask3.lo, hlo), + _mm_shuffle_epi8(mask3.hi, hhi), + ); + (res0, res1, res2) +} + +/// Return candidates for Slim 256-bit Teddy, where `chunk` corresponds +/// to a 32-byte window of the haystack (where the least significant byte +/// corresponds to the start of the window), and the masks correspond to a +/// low/high mask for the first, second and third bytes of all patterns that +/// are being searched. The vectors returned correspond to candidates for the +/// first, second and third bytes in the patterns represented by the masks. +/// +/// Note that this can also be used for Fat Teddy, where the high 128 bits in +/// `chunk` is the same as the low 128 bits, which corresponds to a 16 byte +/// window in the haystack. +#[target_feature(enable = "avx2")] +unsafe fn members3m256( + chunk: __m256i, + mask1: Mask256, + mask2: Mask256, + mask3: Mask256, +) -> (__m256i, __m256i, __m256i) { + let lomask = _mm256_set1_epi8(0xF); + let hlo = _mm256_and_si256(chunk, lomask); + let hhi = _mm256_and_si256(_mm256_srli_epi16(chunk, 4), lomask); + let res0 = _mm256_and_si256( + _mm256_shuffle_epi8(mask1.lo, hlo), + _mm256_shuffle_epi8(mask1.hi, hhi), + ); + let res1 = _mm256_and_si256( + _mm256_shuffle_epi8(mask2.lo, hlo), + _mm256_shuffle_epi8(mask2.hi, hhi), + ); + let res2 = _mm256_and_si256( + _mm256_shuffle_epi8(mask3.lo, hlo), + _mm256_shuffle_epi8(mask3.hi, hhi), + ); + (res0, res1, res2) +} + +/// Return candidates for Slim 128-bit Teddy, where `chunk` corresponds +/// to a 16-byte window of the haystack (where the least significant byte +/// corresponds to the start of the window), and the masks correspond to a +/// low/high mask for the first, second, third and fourth bytes of all patterns +/// that are being searched. The vectors returned correspond to candidates for +/// the first, second, third and fourth bytes in the patterns represented by +/// the masks. +#[target_feature(enable = "ssse3")] +unsafe fn members4m128( + chunk: __m128i, + mask1: Mask128, + mask2: Mask128, + mask3: Mask128, + mask4: Mask128, +) -> (__m128i, __m128i, __m128i, __m128i) { + let lomask = _mm_set1_epi8(0xF); + let hlo = _mm_and_si128(chunk, lomask); + let hhi = _mm_and_si128(_mm_srli_epi16(chunk, 4), lomask); + let res0 = _mm_and_si128( + _mm_shuffle_epi8(mask1.lo, hlo), + _mm_shuffle_epi8(mask1.hi, hhi), + ); + let res1 = _mm_and_si128( + _mm_shuffle_epi8(mask2.lo, hlo), + _mm_shuffle_epi8(mask2.hi, hhi), + ); + let res2 = _mm_and_si128( + _mm_shuffle_epi8(mask3.lo, hlo), + _mm_shuffle_epi8(mask3.hi, hhi), + ); + let res3 = _mm_and_si128( + _mm_shuffle_epi8(mask4.lo, hlo), + _mm_shuffle_epi8(mask4.hi, hhi), + ); + (res0, res1, res2, res3) +} + +/// Return candidates for Slim 256-bit Teddy, where `chunk` corresponds +/// to a 32-byte window of the haystack (where the least significant byte +/// corresponds to the start of the window), and the masks correspond to a +/// low/high mask for the first, second, third and fourth bytes of all patterns +/// that are being searched. The vectors returned correspond to candidates for +/// the first, second, third and fourth bytes in the patterns represented by +/// the masks. +/// +/// Note that this can also be used for Fat Teddy, where the high 128 bits in +/// `chunk` is the same as the low 128 bits, which corresponds to a 16 byte +/// window in the haystack. +#[target_feature(enable = "avx2")] +unsafe fn members4m256( + chunk: __m256i, + mask1: Mask256, + mask2: Mask256, + mask3: Mask256, + mask4: Mask256, +) -> (__m256i, __m256i, __m256i, __m256i) { + let lomask = _mm256_set1_epi8(0xF); + let hlo = _mm256_and_si256(chunk, lomask); + let hhi = _mm256_and_si256(_mm256_srli_epi16(chunk, 4), lomask); + let res0 = _mm256_and_si256( + _mm256_shuffle_epi8(mask1.lo, hlo), + _mm256_shuffle_epi8(mask1.hi, hhi), + ); + let res1 = _mm256_and_si256( + _mm256_shuffle_epi8(mask2.lo, hlo), + _mm256_shuffle_epi8(mask2.hi, hhi), + ); + let res2 = _mm256_and_si256( + _mm256_shuffle_epi8(mask3.lo, hlo), + _mm256_shuffle_epi8(mask3.hi, hhi), + ); + let res3 = _mm256_and_si256( + _mm256_shuffle_epi8(mask4.lo, hlo), + _mm256_shuffle_epi8(mask4.hi, hhi), + ); + (res0, res1, res2, res3) +} diff -Nru temporalio-1.3.0/vendor/aho-corasick/src/packed/tests.rs temporalio-1.3.0/vendor/aho-corasick/src/packed/tests.rs --- temporalio-1.3.0/vendor/aho-corasick/src/packed/tests.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/aho-corasick/src/packed/tests.rs 2023-10-30 19:40:00.000000000 +0000 @@ -40,9 +40,8 @@ impl SearchTest { fn variations(&self) -> Vec { - let count = if cfg!(miri) { 1 } else { 261 }; let mut tests = vec![]; - for i in 0..count { + for i in 0..=260 { tests.push(self.offset_prefix(i)); tests.push(self.offset_suffix(i)); tests.push(self.offset_both(i)); @@ -92,6 +91,15 @@ matches: self.matches.to_vec(), } } + + // fn to_owned(&self) -> SearchTestOwned { + // SearchTestOwned { + // name: self.name.to_string(), + // patterns: self.patterns.iter().map(|s| s.to_string()).collect(), + // haystack: self.haystack.to_string(), + // matches: self.matches.iter().cloned().collect(), + // } + // } } /// Short-hand constructor for SearchTest. We use it a lot below. @@ -384,34 +392,26 @@ run_search_tests($collection, |test| { let mut config = Config::new(); $with(&mut config); - let mut builder = config.builder(); - builder.extend(test.patterns.iter().map(|p| p.as_bytes())); - let searcher = match builder.build() { - Some(searcher) => searcher, - None => { - // For x86-64 and aarch64, not building a searcher is - // probably a bug, so be loud. - if cfg!(any( - target_arch = "x86_64", - target_arch = "aarch64" - )) { - panic!("failed to build packed searcher") - } - return None; - } - }; - Some(searcher.find_iter(&test.haystack).collect()) + config + .builder() + .extend(test.patterns.iter().map(|p| p.as_bytes())) + .build() + .unwrap() + .find_iter(&test.haystack) + .collect() }); } }; } +#[cfg(target_arch = "x86_64")] testconfig!( search_default_leftmost_first, PACKED_LEFTMOST_FIRST, |_: &mut Config| {} ); +#[cfg(target_arch = "x86_64")] testconfig!( search_default_leftmost_longest, PACKED_LEFTMOST_LONGEST, @@ -420,90 +420,92 @@ } ); +#[cfg(target_arch = "x86_64")] testconfig!( search_teddy_leftmost_first, PACKED_LEFTMOST_FIRST, |c: &mut Config| { - c.only_teddy(true); + c.force_teddy(true); } ); +#[cfg(target_arch = "x86_64")] testconfig!( search_teddy_leftmost_longest, PACKED_LEFTMOST_LONGEST, |c: &mut Config| { - c.only_teddy(true).match_kind(MatchKind::LeftmostLongest); + c.force_teddy(true).match_kind(MatchKind::LeftmostLongest); } ); +#[cfg(target_arch = "x86_64")] testconfig!( search_teddy_ssse3_leftmost_first, PACKED_LEFTMOST_FIRST, |c: &mut Config| { - c.only_teddy(true); - #[cfg(target_arch = "x86_64")] + c.force_teddy(true); if std::is_x86_feature_detected!("ssse3") { - c.only_teddy_256bit(Some(false)); + c.force_avx(Some(false)); } } ); +#[cfg(target_arch = "x86_64")] testconfig!( search_teddy_ssse3_leftmost_longest, PACKED_LEFTMOST_LONGEST, |c: &mut Config| { - c.only_teddy(true).match_kind(MatchKind::LeftmostLongest); - #[cfg(target_arch = "x86_64")] + c.force_teddy(true).match_kind(MatchKind::LeftmostLongest); if std::is_x86_feature_detected!("ssse3") { - c.only_teddy_256bit(Some(false)); + c.force_avx(Some(false)); } } ); +#[cfg(target_arch = "x86_64")] testconfig!( search_teddy_avx2_leftmost_first, PACKED_LEFTMOST_FIRST, |c: &mut Config| { - c.only_teddy(true); - #[cfg(target_arch = "x86_64")] + c.force_teddy(true); if std::is_x86_feature_detected!("avx2") { - c.only_teddy_256bit(Some(true)); + c.force_avx(Some(true)); } } ); +#[cfg(target_arch = "x86_64")] testconfig!( search_teddy_avx2_leftmost_longest, PACKED_LEFTMOST_LONGEST, |c: &mut Config| { - c.only_teddy(true).match_kind(MatchKind::LeftmostLongest); - #[cfg(target_arch = "x86_64")] + c.force_teddy(true).match_kind(MatchKind::LeftmostLongest); if std::is_x86_feature_detected!("avx2") { - c.only_teddy_256bit(Some(true)); + c.force_avx(Some(true)); } } ); +#[cfg(target_arch = "x86_64")] testconfig!( search_teddy_fat_leftmost_first, PACKED_LEFTMOST_FIRST, |c: &mut Config| { - c.only_teddy(true); - #[cfg(target_arch = "x86_64")] + c.force_teddy(true); if std::is_x86_feature_detected!("avx2") { - c.only_teddy_fat(Some(true)); + c.force_teddy_fat(Some(true)); } } ); +#[cfg(target_arch = "x86_64")] testconfig!( search_teddy_fat_leftmost_longest, PACKED_LEFTMOST_LONGEST, |c: &mut Config| { - c.only_teddy(true).match_kind(MatchKind::LeftmostLongest); - #[cfg(target_arch = "x86_64")] + c.force_teddy(true).match_kind(MatchKind::LeftmostLongest); if std::is_x86_feature_detected!("avx2") { - c.only_teddy_fat(Some(true)); + c.force_teddy_fat(Some(true)); } } ); @@ -512,7 +514,7 @@ search_rabinkarp_leftmost_first, PACKED_LEFTMOST_FIRST, |c: &mut Config| { - c.only_rabin_karp(true); + c.force_rabin_karp(true); } ); @@ -520,7 +522,7 @@ search_rabinkarp_leftmost_longest, PACKED_LEFTMOST_LONGEST, |c: &mut Config| { - c.only_rabin_karp(true).match_kind(MatchKind::LeftmostLongest); + c.force_rabin_karp(true).match_kind(MatchKind::LeftmostLongest); } ); @@ -548,7 +550,7 @@ assert("TEDDY", TEDDY); } -fn run_search_tests Option>>( +fn run_search_tests Vec>( which: TestCollection, mut f: F, ) { @@ -562,18 +564,12 @@ for &tests in which { for spec in tests { for test in spec.variations() { - let results = match f(&test) { - None => continue, - Some(results) => results, - }; assert_eq!( test.matches, - get_match_triples(results).as_slice(), - "test: {}, patterns: {:?}, haystack(len={:?}): {:?}, \ - offset: {:?}", + get_match_triples(f(&test)).as_slice(), + "test: {}, patterns: {:?}, haystack: {:?}, offset: {:?}", test.name, test.patterns, - test.haystack.len(), test.haystack, test.offset, ); diff -Nru temporalio-1.3.0/vendor/aho-corasick/src/packed/vector.rs temporalio-1.3.0/vendor/aho-corasick/src/packed/vector.rs --- temporalio-1.3.0/vendor/aho-corasick/src/packed/vector.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/aho-corasick/src/packed/vector.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,1752 +1,190 @@ -// NOTE: The descriptions for each of the vector methods on the traits below -// are pretty inscrutable. For this reason, there are tests for every method -// on for every trait impl below. If you're confused about what an op does, -// consult its test. (They probably should be doc tests, but I couldn't figure -// out how to write them in a non-annoying way.) - -use core::{ - fmt::Debug, - panic::{RefUnwindSafe, UnwindSafe}, -}; - -/// A trait for describing vector operations used by vectorized searchers. -/// -/// The trait is highly constrained to low level vector operations needed for -/// the specific algorithms used in this crate. In general, it was invented -/// mostly to be generic over x86's __m128i and __m256i types. At time of -/// writing, it also supports wasm and aarch64 128-bit vector types as well. -/// -/// # Safety -/// -/// All methods are not safe since they are intended to be implemented using -/// vendor intrinsics, which are also not safe. Callers must ensure that -/// the appropriate target features are enabled in the calling function, -/// and that the current CPU supports them. All implementations should -/// avoid marking the routines with `#[target_feature]` and instead mark -/// them as `#[inline(always)]` to ensure they get appropriately inlined. -/// (`inline(always)` cannot be used with target_feature.) -pub(crate) trait Vector: - Copy + Debug + Send + Sync + UnwindSafe + RefUnwindSafe -{ - /// The number of bits in the vector. - const BITS: usize; - /// The number of bytes in the vector. That is, this is the size of the - /// vector in memory. - const BYTES: usize; - - /// Create a vector with 8-bit lanes with the given byte repeated into each - /// lane. - /// - /// # Safety - /// - /// Callers must ensure that this is okay to call in the current target for - /// the current CPU. - unsafe fn splat(byte: u8) -> Self; - - /// Read a vector-size number of bytes from the given pointer. The pointer - /// does not need to be aligned. - /// - /// # Safety - /// - /// Callers must ensure that this is okay to call in the current target for - /// the current CPU. - /// - /// Callers must guarantee that at least `BYTES` bytes are readable from - /// `data`. - unsafe fn load_unaligned(data: *const u8) -> Self; - - /// Returns true if and only if this vector has zero in all of its lanes. - /// - /// # Safety - /// - /// Callers must ensure that this is okay to call in the current target for - /// the current CPU. - unsafe fn is_zero(self) -> bool; - - /// Do an 8-bit pairwise equality check. If lane `i` is equal in this - /// vector and the one given, then lane `i` in the resulting vector is set - /// to `0xFF`. Otherwise, it is set to `0x00`. - /// - /// # Safety - /// - /// Callers must ensure that this is okay to call in the current target for - /// the current CPU. - unsafe fn cmpeq(self, vector2: Self) -> Self; - - /// Perform a bitwise 'and' of this vector and the one given and return - /// the result. - /// - /// # Safety - /// - /// Callers must ensure that this is okay to call in the current target for - /// the current CPU. - unsafe fn and(self, vector2: Self) -> Self; - - /// Perform a bitwise 'or' of this vector and the one given and return - /// the result. - /// - /// # Safety - /// - /// Callers must ensure that this is okay to call in the current target for - /// the current CPU. - unsafe fn or(self, vector2: Self) -> Self; - - /// Shift each 8-bit lane in this vector to the right by the number of - /// bits indictated by the `BITS` type parameter. - /// - /// # Safety - /// - /// Callers must ensure that this is okay to call in the current target for - /// the current CPU. - unsafe fn shift_8bit_lane_right(self) -> Self; - - /// Shift this vector to the left by one byte and shift the most - /// significant byte of `vector2` into the least significant position of - /// this vector. - /// - /// Stated differently, this behaves as if `self` and `vector2` were - /// concatenated into a `2 * Self::BITS` temporary buffer and then shifted - /// right by `Self::BYTES - 1` bytes. - /// - /// With respect to the Teddy algorithm, `vector2` is usually a previous - /// `Self::BYTES` chunk from the haystack and `self` is the chunk - /// immediately following it. This permits combining the last two bytes - /// from the previous chunk (`vector2`) with the first `Self::BYTES - 1` - /// bytes from the current chunk. This permits aligning the result of - /// various shuffles so that they can be and-ed together and a possible - /// candidate discovered. - /// - /// # Safety - /// - /// Callers must ensure that this is okay to call in the current target for - /// the current CPU. - unsafe fn shift_in_one_byte(self, vector2: Self) -> Self; - - /// Shift this vector to the left by two bytes and shift the two most - /// significant bytes of `vector2` into the least significant position of - /// this vector. - /// - /// Stated differently, this behaves as if `self` and `vector2` were - /// concatenated into a `2 * Self::BITS` temporary buffer and then shifted - /// right by `Self::BYTES - 2` bytes. - /// - /// With respect to the Teddy algorithm, `vector2` is usually a previous - /// `Self::BYTES` chunk from the haystack and `self` is the chunk - /// immediately following it. This permits combining the last two bytes - /// from the previous chunk (`vector2`) with the first `Self::BYTES - 2` - /// bytes from the current chunk. This permits aligning the result of - /// various shuffles so that they can be and-ed together and a possible - /// candidate discovered. - /// - /// # Safety - /// - /// Callers must ensure that this is okay to call in the current target for - /// the current CPU. - unsafe fn shift_in_two_bytes(self, vector2: Self) -> Self; - - /// Shift this vector to the left by three bytes and shift the three most - /// significant bytes of `vector2` into the least significant position of - /// this vector. - /// - /// Stated differently, this behaves as if `self` and `vector2` were - /// concatenated into a `2 * Self::BITS` temporary buffer and then shifted - /// right by `Self::BYTES - 3` bytes. - /// - /// With respect to the Teddy algorithm, `vector2` is usually a previous - /// `Self::BYTES` chunk from the haystack and `self` is the chunk - /// immediately following it. This permits combining the last three bytes - /// from the previous chunk (`vector2`) with the first `Self::BYTES - 3` - /// bytes from the current chunk. This permits aligning the result of - /// various shuffles so that they can be and-ed together and a possible - /// candidate discovered. - /// - /// # Safety - /// - /// Callers must ensure that this is okay to call in the current target for - /// the current CPU. - unsafe fn shift_in_three_bytes(self, vector2: Self) -> Self; - - /// Shuffles the bytes in this vector according to the indices in each of - /// the corresponding lanes in `indices`. - /// - /// If `i` is the index of corresponding lanes, `A` is this vector, `B` is - /// indices and `C` is the resulting vector, then `C = A[B[i]]`. - /// - /// # Safety - /// - /// Callers must ensure that this is okay to call in the current target for - /// the current CPU. - unsafe fn shuffle_bytes(self, indices: Self) -> Self; - - /// Call the provided function for each 64-bit lane in this vector. The - /// given function is provided the lane index and lane value as a `u64`. - /// - /// If `f` returns `Some`, then iteration over the lanes is stopped and the - /// value is returned. Otherwise, this returns `None`. - /// - /// # Notes - /// - /// Conceptually it would be nice if we could have a - /// `unpack64(self) -> [u64; BITS / 64]` method, but defining that is - /// tricky given Rust's [current support for const generics][support]. - /// And even if we could, it would be tricky to write generic code over - /// it. (Not impossible. We could introduce another layer that requires - /// `AsRef<[u64]>` or something.) - /// - /// [support]: https://github.com/rust-lang/rust/issues/60551 - /// - /// # Safety - /// - /// Callers must ensure that this is okay to call in the current target for - /// the current CPU. - unsafe fn for_each_64bit_lane( - self, - f: impl FnMut(usize, u64) -> Option, - ) -> Option; -} - -/// This trait extends the `Vector` trait with additional operations to support -/// Fat Teddy. -/// -/// Fat Teddy uses 16 buckets instead of 8, but reads half as many bytes (as -/// the vector size) instead of the full size of a vector per iteration. For -/// example, when using a 256-bit vector, Slim Teddy reads 32 bytes at a timr -/// but Fat Teddy reads 16 bytes at a time. -/// -/// Fat Teddy is useful when searching for a large number of literals. -/// The extra number of buckets spreads the literals out more and reduces -/// verification time. -/// -/// Currently we only implement this for AVX on x86_64. It would be nice to -/// implement this for SSE on x86_64 and NEON on aarch64, with the latter two -/// only reading 8 bytes at a time. It's not clear how well it would work, but -/// there are some tricky things to figure out in terms of implementation. The -/// `half_shift_in_{one,two,three}_bytes` methods in particular are probably -/// the trickiest of the bunch. For AVX2, these are implemented by taking -/// advantage of the fact that `_mm256_alignr_epi8` operates on each 128-bit -/// half instead of the full 256-bit vector. (Where as `_mm_alignr_epi8` -/// operates on the full 128-bit vector and not on each 64-bit half.) I didn't -/// do a careful survey of NEON to see if it could easily support these -/// operations. -pub(crate) trait FatVector: Vector { - type Half: Vector; - - /// Read a half-vector-size number of bytes from the given pointer, and - /// broadcast it across both halfs of a full vector. The pointer does not - /// need to be aligned. - /// - /// # Safety - /// - /// Callers must ensure that this is okay to call in the current target for - /// the current CPU. - /// - /// Callers must guarantee that at least `Self::HALF::BYTES` bytes are - /// readable from `data`. - unsafe fn load_half_unaligned(data: *const u8) -> Self; - - /// Like `Vector::shift_in_one_byte`, except this is done for each half - /// of the vector instead. - /// - /// # Safety - /// - /// Callers must ensure that this is okay to call in the current target for - /// the current CPU. - unsafe fn half_shift_in_one_byte(self, vector2: Self) -> Self; - - /// Like `Vector::shift_in_two_bytes`, except this is done for each half - /// of the vector instead. - /// - /// # Safety - /// - /// Callers must ensure that this is okay to call in the current target for - /// the current CPU. - unsafe fn half_shift_in_two_bytes(self, vector2: Self) -> Self; - - /// Like `Vector::shift_in_two_bytes`, except this is done for each half - /// of the vector instead. - /// - /// # Safety - /// - /// Callers must ensure that this is okay to call in the current target for - /// the current CPU. - unsafe fn half_shift_in_three_bytes(self, vector2: Self) -> Self; - - /// Swap the 128-bit lanes in this vector. - /// - /// # Safety - /// - /// Callers must ensure that this is okay to call in the current target for - /// the current CPU. - unsafe fn swap_halves(self) -> Self; - - /// Unpack and interleave the 8-bit lanes from the low 128 bits of each - /// vector and return the result. - /// - /// # Safety - /// - /// Callers must ensure that this is okay to call in the current target for - /// the current CPU. - unsafe fn interleave_low_8bit_lanes(self, vector2: Self) -> Self; - - /// Unpack and interleave the 8-bit lanes from the high 128 bits of each - /// vector and return the result. - /// - /// # Safety - /// - /// Callers must ensure that this is okay to call in the current target for - /// the current CPU. - unsafe fn interleave_high_8bit_lanes(self, vector2: Self) -> Self; - - /// Call the provided function for each 64-bit lane in the lower half - /// of this vector and then in the other vector. The given function is - /// provided the lane index and lane value as a `u64`. (The high 128-bits - /// of each vector are ignored.) - /// - /// If `f` returns `Some`, then iteration over the lanes is stopped and the - /// value is returned. Otherwise, this returns `None`. - /// - /// # Safety - /// - /// Callers must ensure that this is okay to call in the current target for - /// the current CPU. - unsafe fn for_each_low_64bit_lane( - self, - vector2: Self, - f: impl FnMut(usize, u64) -> Option, - ) -> Option; -} - -#[cfg(all(target_arch = "x86_64", target_feature = "sse2"))] -mod x86_64_ssse3 { - use core::arch::x86_64::*; - - use crate::util::int::{I32, I8}; - - use super::Vector; - - impl Vector for __m128i { - const BITS: usize = 128; - const BYTES: usize = 16; - - #[inline(always)] - unsafe fn splat(byte: u8) -> __m128i { - _mm_set1_epi8(i8::from_bits(byte)) - } - - #[inline(always)] - unsafe fn load_unaligned(data: *const u8) -> __m128i { - _mm_loadu_si128(data.cast::<__m128i>()) - } - - #[inline(always)] - unsafe fn is_zero(self) -> bool { - let cmp = self.cmpeq(Self::splat(0)); - _mm_movemask_epi8(cmp).to_bits() == 0xFFFF - } - - #[inline(always)] - unsafe fn cmpeq(self, vector2: Self) -> __m128i { - _mm_cmpeq_epi8(self, vector2) - } - - #[inline(always)] - unsafe fn and(self, vector2: Self) -> __m128i { - _mm_and_si128(self, vector2) - } - - #[inline(always)] - unsafe fn or(self, vector2: Self) -> __m128i { - _mm_or_si128(self, vector2) - } - - #[inline(always)] - unsafe fn shift_8bit_lane_right(self) -> Self { - // Apparently there is no _mm_srli_epi8, so we emulate it by - // shifting 16-bit integers and masking out the high nybble of each - // 8-bit lane (since that nybble will contain bits from the low - // nybble of the previous lane). - let lomask = Self::splat(0xF); - _mm_srli_epi16(self, BITS).and(lomask) - } - - #[inline(always)] - unsafe fn shift_in_one_byte(self, vector2: Self) -> Self { - _mm_alignr_epi8(self, vector2, 15) - } - - #[inline(always)] - unsafe fn shift_in_two_bytes(self, vector2: Self) -> Self { - _mm_alignr_epi8(self, vector2, 14) - } - - #[inline(always)] - unsafe fn shift_in_three_bytes(self, vector2: Self) -> Self { - _mm_alignr_epi8(self, vector2, 13) - } - - #[inline(always)] - unsafe fn shuffle_bytes(self, indices: Self) -> Self { - _mm_shuffle_epi8(self, indices) - } - - #[inline(always)] - unsafe fn for_each_64bit_lane( - self, - mut f: impl FnMut(usize, u64) -> Option, - ) -> Option { - // We could just use _mm_extract_epi64 here, but that requires - // SSE 4.1. It isn't necessarily a problem to just require SSE 4.1, - // but everything else works with SSSE3 so we stick to that subset. - let lanes: [u64; 2] = core::mem::transmute(self); - if let Some(t) = f(0, lanes[0]) { - return Some(t); - } - if let Some(t) = f(1, lanes[1]) { - return Some(t); - } - None - } - } -} - -#[cfg(all(target_arch = "x86_64", target_feature = "sse2"))] -mod x86_64_avx2 { - use core::arch::x86_64::*; - - use crate::util::int::{I32, I64, I8}; - - use super::{FatVector, Vector}; - - impl Vector for __m256i { - const BITS: usize = 256; - const BYTES: usize = 32; - - #[inline(always)] - unsafe fn splat(byte: u8) -> __m256i { - _mm256_set1_epi8(i8::from_bits(byte)) - } - - #[inline(always)] - unsafe fn load_unaligned(data: *const u8) -> __m256i { - _mm256_loadu_si256(data.cast::<__m256i>()) - } - - #[inline(always)] - unsafe fn is_zero(self) -> bool { - let cmp = self.cmpeq(Self::splat(0)); - _mm256_movemask_epi8(cmp).to_bits() == 0xFFFFFFFF - } - - #[inline(always)] - unsafe fn cmpeq(self, vector2: Self) -> __m256i { - _mm256_cmpeq_epi8(self, vector2) - } - - #[inline(always)] - unsafe fn and(self, vector2: Self) -> __m256i { - _mm256_and_si256(self, vector2) - } - - #[inline(always)] - unsafe fn or(self, vector2: Self) -> __m256i { - _mm256_or_si256(self, vector2) - } - - #[inline(always)] - unsafe fn shift_8bit_lane_right(self) -> Self { - let lomask = Self::splat(0xF); - _mm256_srli_epi16(self, BITS).and(lomask) - } - - #[inline(always)] - unsafe fn shift_in_one_byte(self, vector2: Self) -> Self { - // Credit goes to jneem for figuring this out: - // https://github.com/jneem/teddy/blob/9ab5e899ad6ef6911aecd3cf1033f1abe6e1f66c/src/x86/teddy_simd.rs#L145-L184 - // - // TL;DR avx2's PALIGNR instruction is actually just two 128-bit - // PALIGNR instructions, which is not what we want, so we need to - // do some extra shuffling. - let v = _mm256_permute2x128_si256(vector2, self, 0x21); - _mm256_alignr_epi8(self, v, 15) - } - - #[inline(always)] - unsafe fn shift_in_two_bytes(self, vector2: Self) -> Self { - // Credit goes to jneem for figuring this out: - // https://github.com/jneem/teddy/blob/9ab5e899ad6ef6911aecd3cf1033f1abe6e1f66c/src/x86/teddy_simd.rs#L145-L184 - // - // TL;DR avx2's PALIGNR instruction is actually just two 128-bit - // PALIGNR instructions, which is not what we want, so we need to - // do some extra shuffling. - let v = _mm256_permute2x128_si256(vector2, self, 0x21); - _mm256_alignr_epi8(self, v, 14) - } - - #[inline(always)] - unsafe fn shift_in_three_bytes(self, vector2: Self) -> Self { - // Credit goes to jneem for figuring this out: - // https://github.com/jneem/teddy/blob/9ab5e899ad6ef6911aecd3cf1033f1abe6e1f66c/src/x86/teddy_simd.rs#L145-L184 - // - // TL;DR avx2's PALIGNR instruction is actually just two 128-bit - // PALIGNR instructions, which is not what we want, so we need to - // do some extra shuffling. - let v = _mm256_permute2x128_si256(vector2, self, 0x21); - _mm256_alignr_epi8(self, v, 13) - } - - #[inline(always)] - unsafe fn shuffle_bytes(self, indices: Self) -> Self { - _mm256_shuffle_epi8(self, indices) - } - - #[inline(always)] - unsafe fn for_each_64bit_lane( - self, - mut f: impl FnMut(usize, u64) -> Option, - ) -> Option { - // NOTE: At one point in the past, I used transmute to this to - // get a [u64; 4], but it turned out to lead to worse codegen IIRC. - // I've tried it more recently, and it looks like that's no longer - // the case. But since there's no difference, we stick with the - // slightly more complicated but transmute-free version. - let lane = _mm256_extract_epi64(self, 0).to_bits(); - if let Some(t) = f(0, lane) { - return Some(t); - } - let lane = _mm256_extract_epi64(self, 1).to_bits(); - if let Some(t) = f(1, lane) { - return Some(t); - } - let lane = _mm256_extract_epi64(self, 2).to_bits(); - if let Some(t) = f(2, lane) { - return Some(t); - } - let lane = _mm256_extract_epi64(self, 3).to_bits(); - if let Some(t) = f(3, lane) { - return Some(t); - } - None - } - } - - impl FatVector for __m256i { - type Half = __m128i; - - #[inline(always)] - unsafe fn load_half_unaligned(data: *const u8) -> Self { - let half = Self::Half::load_unaligned(data); - _mm256_broadcastsi128_si256(half) - } - - #[inline(always)] - unsafe fn half_shift_in_one_byte(self, vector2: Self) -> Self { - _mm256_alignr_epi8(self, vector2, 15) - } - - #[inline(always)] - unsafe fn half_shift_in_two_bytes(self, vector2: Self) -> Self { - _mm256_alignr_epi8(self, vector2, 14) - } - - #[inline(always)] - unsafe fn half_shift_in_three_bytes(self, vector2: Self) -> Self { - _mm256_alignr_epi8(self, vector2, 13) - } - - #[inline(always)] - unsafe fn swap_halves(self) -> Self { - _mm256_permute4x64_epi64(self, 0x4E) - } - - #[inline(always)] - unsafe fn interleave_low_8bit_lanes(self, vector2: Self) -> Self { - _mm256_unpacklo_epi8(self, vector2) - } - - #[inline(always)] - unsafe fn interleave_high_8bit_lanes(self, vector2: Self) -> Self { - _mm256_unpackhi_epi8(self, vector2) - } - - #[inline(always)] - unsafe fn for_each_low_64bit_lane( - self, - vector2: Self, - mut f: impl FnMut(usize, u64) -> Option, - ) -> Option { - let lane = _mm256_extract_epi64(self, 0).to_bits(); - if let Some(t) = f(0, lane) { - return Some(t); - } - let lane = _mm256_extract_epi64(self, 1).to_bits(); - if let Some(t) = f(1, lane) { - return Some(t); - } - let lane = _mm256_extract_epi64(vector2, 0).to_bits(); - if let Some(t) = f(2, lane) { - return Some(t); - } - let lane = _mm256_extract_epi64(vector2, 1).to_bits(); - if let Some(t) = f(3, lane) { - return Some(t); - } - None - } - } -} - -#[cfg(target_arch = "aarch64")] -mod aarch64_neon { - use core::arch::aarch64::*; - - use super::Vector; - - impl Vector for uint8x16_t { - const BITS: usize = 128; - const BYTES: usize = 16; - - #[inline(always)] - unsafe fn splat(byte: u8) -> uint8x16_t { - vdupq_n_u8(byte) - } - - #[inline(always)] - unsafe fn load_unaligned(data: *const u8) -> uint8x16_t { - vld1q_u8(data) - } - - #[inline(always)] - unsafe fn is_zero(self) -> bool { - // Could also use vmaxvq_u8. - // ... I tried that and couldn't observe any meaningful difference - // in benchmarks. - let maxes = vreinterpretq_u64_u8(vpmaxq_u8(self, self)); - vgetq_lane_u64(maxes, 0) == 0 - } - - #[inline(always)] - unsafe fn cmpeq(self, vector2: Self) -> uint8x16_t { - vceqq_u8(self, vector2) - } - - #[inline(always)] - unsafe fn and(self, vector2: Self) -> uint8x16_t { - vandq_u8(self, vector2) - } - - #[inline(always)] - unsafe fn or(self, vector2: Self) -> uint8x16_t { - vorrq_u8(self, vector2) - } - - #[inline(always)] - unsafe fn shift_8bit_lane_right(self) -> Self { - debug_assert!(BITS <= 7); - vshrq_n_u8(self, BITS) - } - - #[inline(always)] - unsafe fn shift_in_one_byte(self, vector2: Self) -> Self { - vextq_u8(vector2, self, 15) - } - - #[inline(always)] - unsafe fn shift_in_two_bytes(self, vector2: Self) -> Self { - vextq_u8(vector2, self, 14) - } - - #[inline(always)] - unsafe fn shift_in_three_bytes(self, vector2: Self) -> Self { - vextq_u8(vector2, self, 13) - } - - #[inline(always)] - unsafe fn shuffle_bytes(self, indices: Self) -> Self { - vqtbl1q_u8(self, indices) - } - - #[inline(always)] - unsafe fn for_each_64bit_lane( - self, - mut f: impl FnMut(usize, u64) -> Option, - ) -> Option { - let this = vreinterpretq_u64_u8(self); - let lane = vgetq_lane_u64(this, 0); - if let Some(t) = f(0, lane) { - return Some(t); - } - let lane = vgetq_lane_u64(this, 1); - if let Some(t) = f(1, lane) { - return Some(t); - } - None - } - } -} - -#[cfg(all(test, target_arch = "x86_64", target_feature = "sse2"))] -mod tests_x86_64_ssse3 { - use core::arch::x86_64::*; - - use crate::util::int::{I32, U32}; - - use super::*; - - fn is_runnable() -> bool { - std::is_x86_feature_detected!("ssse3") - } - - #[target_feature(enable = "ssse3")] - unsafe fn load(lanes: [u8; 16]) -> __m128i { - __m128i::load_unaligned(&lanes as *const u8) - } - - #[target_feature(enable = "ssse3")] - unsafe fn unload(v: __m128i) -> [u8; 16] { - [ - _mm_extract_epi8(v, 0).to_bits().low_u8(), - _mm_extract_epi8(v, 1).to_bits().low_u8(), - _mm_extract_epi8(v, 2).to_bits().low_u8(), - _mm_extract_epi8(v, 3).to_bits().low_u8(), - _mm_extract_epi8(v, 4).to_bits().low_u8(), - _mm_extract_epi8(v, 5).to_bits().low_u8(), - _mm_extract_epi8(v, 6).to_bits().low_u8(), - _mm_extract_epi8(v, 7).to_bits().low_u8(), - _mm_extract_epi8(v, 8).to_bits().low_u8(), - _mm_extract_epi8(v, 9).to_bits().low_u8(), - _mm_extract_epi8(v, 10).to_bits().low_u8(), - _mm_extract_epi8(v, 11).to_bits().low_u8(), - _mm_extract_epi8(v, 12).to_bits().low_u8(), - _mm_extract_epi8(v, 13).to_bits().low_u8(), - _mm_extract_epi8(v, 14).to_bits().low_u8(), - _mm_extract_epi8(v, 15).to_bits().low_u8(), - ] - } - - #[test] - fn vector_splat() { - #[target_feature(enable = "ssse3")] - unsafe fn test() { - let v = __m128i::splat(0xAF); - assert_eq!( - unload(v), - [ - 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, - 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF - ] - ); - } - if !is_runnable() { - return; - } - unsafe { test() } - } - - #[test] - fn vector_is_zero() { - #[target_feature(enable = "ssse3")] - unsafe fn test() { - let v = load([0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]); - assert!(!v.is_zero()); - let v = load([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]); - assert!(v.is_zero()); - } - if !is_runnable() { - return; - } - unsafe { test() } - } - - #[test] - fn vector_cmpeq() { - #[target_feature(enable = "ssse3")] - unsafe fn test() { - let v1 = - load([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 1]); - let v2 = - load([16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]); - assert_eq!( - unload(v1.cmpeq(v2)), - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF] - ); - } - if !is_runnable() { - return; - } - unsafe { test() } - } - - #[test] - fn vector_and() { - #[target_feature(enable = "ssse3")] - unsafe fn test() { - let v1 = - load([0, 0, 0, 0, 0, 0b1001, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]); - let v2 = - load([0, 0, 0, 0, 0, 0b1010, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]); - assert_eq!( - unload(v1.and(v2)), - [0, 0, 0, 0, 0, 0b1000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] - ); - } - if !is_runnable() { - return; - } - unsafe { test() } - } - - #[test] - fn vector_or() { - #[target_feature(enable = "ssse3")] - unsafe fn test() { - let v1 = - load([0, 0, 0, 0, 0, 0b1001, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]); - let v2 = - load([0, 0, 0, 0, 0, 0b1010, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]); - assert_eq!( - unload(v1.or(v2)), - [0, 0, 0, 0, 0, 0b1011, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] - ); - } - if !is_runnable() { - return; - } - unsafe { test() } - } - - #[test] - fn vector_shift_8bit_lane_right() { - #[target_feature(enable = "ssse3")] - unsafe fn test() { - let v = load([ - 0, 0, 0, 0, 0b1011, 0b0101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - ]); - assert_eq!( - unload(v.shift_8bit_lane_right::<2>()), - [0, 0, 0, 0, 0b0010, 0b0001, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] - ); - } - if !is_runnable() { - return; - } - unsafe { test() } - } - - #[test] - fn vector_shift_in_one_byte() { - #[target_feature(enable = "ssse3")] - unsafe fn test() { - let v1 = - load([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]); - let v2 = load([ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - ]); - assert_eq!( - unload(v1.shift_in_one_byte(v2)), - [32, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], - ); - } - if !is_runnable() { - return; - } - unsafe { test() } - } - - #[test] - fn vector_shift_in_two_bytes() { - #[target_feature(enable = "ssse3")] - unsafe fn test() { - let v1 = - load([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]); - let v2 = load([ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - ]); - assert_eq!( - unload(v1.shift_in_two_bytes(v2)), - [31, 32, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14], - ); - } - if !is_runnable() { - return; - } - unsafe { test() } - } - - #[test] - fn vector_shift_in_three_bytes() { - #[target_feature(enable = "ssse3")] - unsafe fn test() { - let v1 = - load([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]); - let v2 = load([ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - ]); - assert_eq!( - unload(v1.shift_in_three_bytes(v2)), - [30, 31, 32, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13], - ); - } - if !is_runnable() { - return; - } - unsafe { test() } - } - - #[test] - fn vector_shuffle_bytes() { - #[target_feature(enable = "ssse3")] - unsafe fn test() { - let v1 = - load([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]); - let v2 = - load([0, 0, 0, 0, 4, 4, 4, 4, 8, 8, 8, 8, 12, 12, 12, 12]); - assert_eq!( - unload(v1.shuffle_bytes(v2)), - [1, 1, 1, 1, 5, 5, 5, 5, 9, 9, 9, 9, 13, 13, 13, 13], - ); - } - if !is_runnable() { - return; - } - unsafe { test() } - } - - #[test] - fn vector_for_each_64bit_lane() { - #[target_feature(enable = "ssse3")] - unsafe fn test() { - let v = load([ - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, - 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, - ]); - let mut lanes = [0u64; 2]; - v.for_each_64bit_lane(|i, lane| { - lanes[i] = lane; - None::<()> - }); - assert_eq!(lanes, [0x0807060504030201, 0x100F0E0D0C0B0A09],); - } - if !is_runnable() { - return; - } - unsafe { test() } - } -} - -#[cfg(all(test, target_arch = "x86_64", target_feature = "sse2"))] -mod tests_x86_64_avx2 { - use core::arch::x86_64::*; - - use crate::util::int::{I32, U32}; - - use super::*; - - fn is_runnable() -> bool { - std::is_x86_feature_detected!("avx2") - } - - #[target_feature(enable = "avx2")] - unsafe fn load(lanes: [u8; 32]) -> __m256i { - __m256i::load_unaligned(&lanes as *const u8) - } - - #[target_feature(enable = "avx2")] - unsafe fn load_half(lanes: [u8; 16]) -> __m256i { - __m256i::load_half_unaligned(&lanes as *const u8) - } - - #[target_feature(enable = "avx2")] - unsafe fn unload(v: __m256i) -> [u8; 32] { - [ - _mm256_extract_epi8(v, 0).to_bits().low_u8(), - _mm256_extract_epi8(v, 1).to_bits().low_u8(), - _mm256_extract_epi8(v, 2).to_bits().low_u8(), - _mm256_extract_epi8(v, 3).to_bits().low_u8(), - _mm256_extract_epi8(v, 4).to_bits().low_u8(), - _mm256_extract_epi8(v, 5).to_bits().low_u8(), - _mm256_extract_epi8(v, 6).to_bits().low_u8(), - _mm256_extract_epi8(v, 7).to_bits().low_u8(), - _mm256_extract_epi8(v, 8).to_bits().low_u8(), - _mm256_extract_epi8(v, 9).to_bits().low_u8(), - _mm256_extract_epi8(v, 10).to_bits().low_u8(), - _mm256_extract_epi8(v, 11).to_bits().low_u8(), - _mm256_extract_epi8(v, 12).to_bits().low_u8(), - _mm256_extract_epi8(v, 13).to_bits().low_u8(), - _mm256_extract_epi8(v, 14).to_bits().low_u8(), - _mm256_extract_epi8(v, 15).to_bits().low_u8(), - _mm256_extract_epi8(v, 16).to_bits().low_u8(), - _mm256_extract_epi8(v, 17).to_bits().low_u8(), - _mm256_extract_epi8(v, 18).to_bits().low_u8(), - _mm256_extract_epi8(v, 19).to_bits().low_u8(), - _mm256_extract_epi8(v, 20).to_bits().low_u8(), - _mm256_extract_epi8(v, 21).to_bits().low_u8(), - _mm256_extract_epi8(v, 22).to_bits().low_u8(), - _mm256_extract_epi8(v, 23).to_bits().low_u8(), - _mm256_extract_epi8(v, 24).to_bits().low_u8(), - _mm256_extract_epi8(v, 25).to_bits().low_u8(), - _mm256_extract_epi8(v, 26).to_bits().low_u8(), - _mm256_extract_epi8(v, 27).to_bits().low_u8(), - _mm256_extract_epi8(v, 28).to_bits().low_u8(), - _mm256_extract_epi8(v, 29).to_bits().low_u8(), - _mm256_extract_epi8(v, 30).to_bits().low_u8(), - _mm256_extract_epi8(v, 31).to_bits().low_u8(), - ] - } - - #[test] - fn vector_splat() { - #[target_feature(enable = "avx2")] - unsafe fn test() { - let v = __m256i::splat(0xAF); - assert_eq!( - unload(v), - [ - 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, - 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, - 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, - 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, - ] - ); - } - if !is_runnable() { - return; - } - unsafe { test() } - } - - #[test] - fn vector_is_zero() { - #[target_feature(enable = "avx2")] - unsafe fn test() { - let v = load([ - 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - ]); - assert!(!v.is_zero()); - let v = load([ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - ]); - assert!(v.is_zero()); - } - if !is_runnable() { - return; - } - unsafe { test() } - } - - #[test] - fn vector_cmpeq() { - #[target_feature(enable = "avx2")] - unsafe fn test() { - let v1 = load([ - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 1, - ]); - let v2 = load([ - 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, - 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, - ]); - assert_eq!( - unload(v1.cmpeq(v2)), - [ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF - ] - ); - } - if !is_runnable() { - return; - } - unsafe { test() } - } - - #[test] - fn vector_and() { - #[target_feature(enable = "avx2")] - unsafe fn test() { - let v1 = load([ - 0, 0, 0, 0, 0, 0b1001, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - ]); - let v2 = load([ - 0, 0, 0, 0, 0, 0b1010, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - ]); - assert_eq!( - unload(v1.and(v2)), - [ - 0, 0, 0, 0, 0, 0b1000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - ] - ); - } - if !is_runnable() { - return; - } - unsafe { test() } - } - - #[test] - fn vector_or() { - #[target_feature(enable = "avx2")] - unsafe fn test() { - let v1 = load([ - 0, 0, 0, 0, 0, 0b1001, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - ]); - let v2 = load([ - 0, 0, 0, 0, 0, 0b1010, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - ]); - assert_eq!( - unload(v1.or(v2)), - [ - 0, 0, 0, 0, 0, 0b1011, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - ] - ); - } - if !is_runnable() { - return; - } - unsafe { test() } - } - - #[test] - fn vector_shift_8bit_lane_right() { - #[target_feature(enable = "avx2")] - unsafe fn test() { - let v = load([ - 0, 0, 0, 0, 0b1011, 0b0101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - ]); - assert_eq!( - unload(v.shift_8bit_lane_right::<2>()), - [ - 0, 0, 0, 0, 0b0010, 0b0001, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - ] - ); - } - if !is_runnable() { - return; - } - unsafe { test() } - } - - #[test] - fn vector_shift_in_one_byte() { - #[target_feature(enable = "avx2")] - unsafe fn test() { - let v1 = load([ - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - ]); - let v2 = load([ - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, - ]); - assert_eq!( - unload(v1.shift_in_one_byte(v2)), - [ - 64, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, - 31, - ], - ); - } - if !is_runnable() { - return; - } - unsafe { test() } - } - - #[test] - fn vector_shift_in_two_bytes() { - #[target_feature(enable = "avx2")] - unsafe fn test() { - let v1 = load([ - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - ]); - let v2 = load([ - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, - ]); - assert_eq!( - unload(v1.shift_in_two_bytes(v2)), - [ - 63, 64, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, - 30, - ], - ); - } - if !is_runnable() { - return; - } - unsafe { test() } - } - - #[test] - fn vector_shift_in_three_bytes() { - #[target_feature(enable = "avx2")] - unsafe fn test() { - let v1 = load([ - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - ]); - let v2 = load([ - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, - ]); - assert_eq!( - unload(v1.shift_in_three_bytes(v2)), - [ - 62, 63, 64, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, - 29, - ], - ); - } - if !is_runnable() { - return; - } - unsafe { test() } - } - - #[test] - fn vector_shuffle_bytes() { - #[target_feature(enable = "avx2")] - unsafe fn test() { - let v1 = load([ - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - ]); - let v2 = load([ - 0, 0, 0, 0, 4, 4, 4, 4, 8, 8, 8, 8, 12, 12, 12, 12, 16, 16, - 16, 16, 20, 20, 20, 20, 24, 24, 24, 24, 28, 28, 28, 28, - ]); - assert_eq!( - unload(v1.shuffle_bytes(v2)), - [ - 1, 1, 1, 1, 5, 5, 5, 5, 9, 9, 9, 9, 13, 13, 13, 13, 17, - 17, 17, 17, 21, 21, 21, 21, 25, 25, 25, 25, 29, 29, 29, - 29 - ], - ); - } - if !is_runnable() { - return; - } - unsafe { test() } - } - - #[test] - fn vector_for_each_64bit_lane() { - #[target_feature(enable = "avx2")] - unsafe fn test() { - let v = load([ - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, - 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, - 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, - 0x1F, 0x20, - ]); - let mut lanes = [0u64; 4]; - v.for_each_64bit_lane(|i, lane| { - lanes[i] = lane; - None::<()> - }); - assert_eq!( - lanes, - [ - 0x0807060504030201, - 0x100F0E0D0C0B0A09, - 0x1817161514131211, - 0x201F1E1D1C1B1A19 - ] - ); - } - if !is_runnable() { - return; - } - unsafe { test() } - } - - #[test] - fn fat_vector_half_shift_in_one_byte() { - #[target_feature(enable = "avx2")] - unsafe fn test() { - let v1 = load_half([ - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, - ]); - let v2 = load_half([ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - ]); - assert_eq!( - unload(v1.half_shift_in_one_byte(v2)), - [ - 32, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 32, - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 - ], - ); - } - if !is_runnable() { - return; - } - unsafe { test() } - } - - #[test] - fn fat_vector_half_shift_in_two_bytes() { - #[target_feature(enable = "avx2")] - unsafe fn test() { - let v1 = load_half([ - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, - ]); - let v2 = load_half([ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - ]); - assert_eq!( - unload(v1.half_shift_in_two_bytes(v2)), - [ - 31, 32, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 31, - 32, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - ], - ); - } - if !is_runnable() { - return; - } - unsafe { test() } - } - - #[test] - fn fat_vector_half_shift_in_three_bytes() { - #[target_feature(enable = "avx2")] - unsafe fn test() { - let v1 = load_half([ - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, - ]); - let v2 = load_half([ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - ]); - assert_eq!( - unload(v1.half_shift_in_three_bytes(v2)), - [ - 30, 31, 32, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 30, - 31, 32, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, - ], - ); - } - if !is_runnable() { - return; - } - unsafe { test() } - } - - #[test] - fn fat_vector_swap_halves() { - #[target_feature(enable = "avx2")] - unsafe fn test() { - let v = load([ - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - ]); - assert_eq!( - unload(v.swap_halves()), - [ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, - 31, 32, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, - ], - ); - } - if !is_runnable() { - return; - } - unsafe { test() } - } - - #[test] - fn fat_vector_interleave_low_8bit_lanes() { - #[target_feature(enable = "avx2")] - unsafe fn test() { - let v1 = load([ - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - ]); - let v2 = load([ - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, - ]); - assert_eq!( - unload(v1.interleave_low_8bit_lanes(v2)), - [ - 1, 33, 2, 34, 3, 35, 4, 36, 5, 37, 6, 38, 7, 39, 8, 40, - 17, 49, 18, 50, 19, 51, 20, 52, 21, 53, 22, 54, 23, 55, - 24, 56, - ], - ); - } - if !is_runnable() { - return; - } - unsafe { test() } - } - - #[test] - fn fat_vector_interleave_high_8bit_lanes() { - #[target_feature(enable = "avx2")] - unsafe fn test() { - let v1 = load([ - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - ]); - let v2 = load([ - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, - ]); - assert_eq!( - unload(v1.interleave_high_8bit_lanes(v2)), - [ - 9, 41, 10, 42, 11, 43, 12, 44, 13, 45, 14, 46, 15, 47, 16, - 48, 25, 57, 26, 58, 27, 59, 28, 60, 29, 61, 30, 62, 31, - 63, 32, 64, - ], - ); - } - if !is_runnable() { - return; - } - unsafe { test() } - } - - #[test] - fn fat_vector_for_each_low_64bit_lane() { - #[target_feature(enable = "avx2")] - unsafe fn test() { - let v1 = load([ - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, - 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, - 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, - 0x1F, 0x20, - ]); - let v2 = load([ - 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, - 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, - 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, - 0x3F, 0x40, - ]); - let mut lanes = [0u64; 4]; - v1.for_each_low_64bit_lane(v2, |i, lane| { - lanes[i] = lane; - None::<()> - }); - assert_eq!( - lanes, - [ - 0x0807060504030201, - 0x100F0E0D0C0B0A09, - 0x2827262524232221, - 0x302F2E2D2C2B2A29 - ] - ); - } - if !is_runnable() { - return; - } - unsafe { test() } - } -} - -#[cfg(all(test, target_arch = "aarch64", target_feature = "neon"))] -mod tests_aarch64_neon { - use core::arch::aarch64::*; - - use super::*; - - #[target_feature(enable = "neon")] - unsafe fn load(lanes: [u8; 16]) -> uint8x16_t { - uint8x16_t::load_unaligned(&lanes as *const u8) - } - - #[target_feature(enable = "neon")] - unsafe fn unload(v: uint8x16_t) -> [u8; 16] { - [ - vgetq_lane_u8(v, 0), - vgetq_lane_u8(v, 1), - vgetq_lane_u8(v, 2), - vgetq_lane_u8(v, 3), - vgetq_lane_u8(v, 4), - vgetq_lane_u8(v, 5), - vgetq_lane_u8(v, 6), - vgetq_lane_u8(v, 7), - vgetq_lane_u8(v, 8), - vgetq_lane_u8(v, 9), - vgetq_lane_u8(v, 10), - vgetq_lane_u8(v, 11), - vgetq_lane_u8(v, 12), - vgetq_lane_u8(v, 13), - vgetq_lane_u8(v, 14), - vgetq_lane_u8(v, 15), - ] - } - - // Example functions. These don't test the Vector traits, but rather, - // specific NEON instructions. They are basically little experiments I - // wrote to figure out what an instruction does since their descriptions - // are so dense. I decided to keep the experiments around as example tests - // in case there' useful. - - #[test] - fn example_vmaxvq_u8_non_zero() { - #[target_feature(enable = "neon")] - unsafe fn example() { - let v = load([0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]); - assert_eq!(vmaxvq_u8(v), 1); - } - unsafe { example() } - } - - #[test] - fn example_vmaxvq_u8_zero() { - #[target_feature(enable = "neon")] - unsafe fn example() { - let v = load([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]); - assert_eq!(vmaxvq_u8(v), 0); - } - unsafe { example() } - } - - #[test] - fn example_vpmaxq_u8_non_zero() { - #[target_feature(enable = "neon")] - unsafe fn example() { - let v = load([0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]); - let r = vpmaxq_u8(v, v); - assert_eq!( - unload(r), - [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0] - ); - } - unsafe { example() } - } - - #[test] - fn example_vpmaxq_u8_self() { - #[target_feature(enable = "neon")] - unsafe fn example() { - let v = - load([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]); - let r = vpmaxq_u8(v, v); - assert_eq!( - unload(r), - [2, 4, 6, 8, 10, 12, 14, 16, 2, 4, 6, 8, 10, 12, 14, 16] - ); - } - unsafe { example() } - } - - #[test] - fn example_vpmaxq_u8_other() { - #[target_feature(enable = "neon")] - unsafe fn example() { - let v1 = - load([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]); - let v2 = load([ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - ]); - let r = vpmaxq_u8(v1, v2); - assert_eq!( - unload(r), - [2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32] - ); - } - unsafe { example() } - } - - // Now we test the actual methods on the Vector trait. - - #[test] - fn vector_splat() { - #[target_feature(enable = "neon")] - unsafe fn test() { - let v = uint8x16_t::splat(0xAF); - assert_eq!( - unload(v), - [ - 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, - 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF - ] - ); - } - unsafe { test() } - } - - #[test] - fn vector_is_zero() { - #[target_feature(enable = "neon")] - unsafe fn test() { - let v = load([0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]); - assert!(!v.is_zero()); - let v = load([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]); - assert!(v.is_zero()); - } - unsafe { test() } - } - - #[test] - fn vector_cmpeq() { - #[target_feature(enable = "neon")] - unsafe fn test() { - let v1 = - load([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 1]); - let v2 = - load([16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]); - assert_eq!( - unload(v1.cmpeq(v2)), - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF] - ); - } - unsafe { test() } - } - - #[test] - fn vector_and() { - #[target_feature(enable = "neon")] - unsafe fn test() { - let v1 = - load([0, 0, 0, 0, 0, 0b1001, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]); - let v2 = - load([0, 0, 0, 0, 0, 0b1010, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]); - assert_eq!( - unload(v1.and(v2)), - [0, 0, 0, 0, 0, 0b1000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] - ); - } - unsafe { test() } - } - - #[test] - fn vector_or() { - #[target_feature(enable = "neon")] - unsafe fn test() { - let v1 = - load([0, 0, 0, 0, 0, 0b1001, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]); - let v2 = - load([0, 0, 0, 0, 0, 0b1010, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]); - assert_eq!( - unload(v1.or(v2)), - [0, 0, 0, 0, 0, 0b1011, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] - ); - } - unsafe { test() } - } - - #[test] - fn vector_shift_8bit_lane_right() { - #[target_feature(enable = "neon")] - unsafe fn test() { - let v = load([ - 0, 0, 0, 0, 0b1011, 0b0101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - ]); - assert_eq!( - unload(v.shift_8bit_lane_right::<2>()), - [0, 0, 0, 0, 0b0010, 0b0001, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] - ); - } - unsafe { test() } - } - - #[test] - fn vector_shift_in_one_byte() { - #[target_feature(enable = "neon")] - unsafe fn test() { - let v1 = - load([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]); - let v2 = load([ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - ]); - assert_eq!( - unload(v1.shift_in_one_byte(v2)), - [32, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], - ); - } - unsafe { test() } - } - - #[test] - fn vector_shift_in_two_bytes() { - #[target_feature(enable = "neon")] - unsafe fn test() { - let v1 = - load([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]); - let v2 = load([ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - ]); - assert_eq!( - unload(v1.shift_in_two_bytes(v2)), - [31, 32, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14], - ); - } - unsafe { test() } - } - - #[test] - fn vector_shift_in_three_bytes() { - #[target_feature(enable = "neon")] - unsafe fn test() { - let v1 = - load([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]); - let v2 = load([ - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - ]); - assert_eq!( - unload(v1.shift_in_three_bytes(v2)), - [30, 31, 32, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13], - ); - } - unsafe { test() } - } - - #[test] - fn vector_shuffle_bytes() { - #[target_feature(enable = "neon")] - unsafe fn test() { - let v1 = - load([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]); - let v2 = - load([0, 0, 0, 0, 4, 4, 4, 4, 8, 8, 8, 8, 12, 12, 12, 12]); - assert_eq!( - unload(v1.shuffle_bytes(v2)), - [1, 1, 1, 1, 5, 5, 5, 5, 9, 9, 9, 9, 13, 13, 13, 13], - ); - } - unsafe { test() } - } - - #[test] - fn vector_for_each_64bit_lane() { - #[target_feature(enable = "neon")] - unsafe fn test() { - let v = load([ - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, - 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, - ]); - let mut lanes = [0u64; 2]; - v.for_each_64bit_lane(|i, lane| { - lanes[i] = lane; - None::<()> - }); - assert_eq!(lanes, [0x0807060504030201, 0x100F0E0D0C0B0A09],); - } - unsafe { test() } - } +// This file contains a set of fairly generic utility functions when working +// with SIMD vectors. +// +// SAFETY: All of the routines below are unsafe to call because they assume +// the necessary CPU target features in order to use particular vendor +// intrinsics. Calling these routines when the underlying CPU does not support +// the appropriate target features is NOT safe. Callers must ensure this +// themselves. +// +// Note that it may not look like this safety invariant is being upheld when +// these routines are called. Namely, the CPU feature check is typically pretty +// far away from when these routines are used. Instead, we rely on the fact +// that certain types serve as a guaranteed receipt that pertinent target +// features are enabled. For example, the only way TeddySlim3Mask256 can be +// constructed is if the AVX2 CPU feature is available. Thus, any code running +// inside of TeddySlim3Mask256 can use any of the functions below without any +// additional checks: its very existence *is* the check. + +use core::arch::x86_64::*; + +/// Shift `a` to the left by two bytes (removing its two most significant +/// bytes), and concatenate it with the the two most significant bytes of `b`. +#[target_feature(enable = "avx2")] +pub unsafe fn alignr256_14(a: __m256i, b: __m256i) -> __m256i { + // Credit goes to jneem for figuring this out: + // https://github.com/jneem/teddy/blob/9ab5e899ad6ef6911aecd3cf1033f1abe6e1f66c/src/x86/teddy_simd.rs#L145-L184 + // + // TL;DR avx2's PALIGNR instruction is actually just two 128-bit PALIGNR + // instructions, which is not what we want, so we need to do some extra + // shuffling. + + // This permute gives us the low 16 bytes of a concatenated with the high + // 16 bytes of b, in order of most significant to least significant. So + // `v = a[15:0] b[31:16]`. + let v = _mm256_permute2x128_si256(b, a, 0x21); + // This effectively does this (where we deal in terms of byte-indexing + // and byte-shifting, and use inclusive ranges): + // + // ret[15:0] := ((a[15:0] << 16) | v[15:0]) >> 14 + // = ((a[15:0] << 16) | b[31:16]) >> 14 + // ret[31:16] := ((a[31:16] << 16) | v[31:16]) >> 14 + // = ((a[31:16] << 16) | a[15:0]) >> 14 + // + // Which therefore results in: + // + // ret[31:0] := a[29:16] a[15:14] a[13:0] b[31:30] + // + // The end result is that we've effectively done this: + // + // (a << 2) | (b >> 30) + // + // When `A` and `B` are strings---where the beginning of the string is in + // the least significant bits---we effectively result in the following + // semantic operation: + // + // (A >> 2) | (B << 30) + // + // The reversal being attributed to the fact that we are in little-endian. + _mm256_alignr_epi8(a, v, 14) +} + +/// Shift `a` to the left by three byte (removing its most significant byte), +/// and concatenate it with the the most significant byte of `b`. +#[target_feature(enable = "avx2")] +pub unsafe fn alignr256_13(a: __m256i, b: __m256i) -> __m256i { + // For explanation, see alignr256_14. + let v = _mm256_permute2x128_si256(b, a, 0x21); + _mm256_alignr_epi8(a, v, 13) +} + +/// Shift `a` to the left by one byte (removing its most significant byte), and +/// concatenate it with the the most significant byte of `b`. +#[target_feature(enable = "avx2")] +pub unsafe fn alignr256_15(a: __m256i, b: __m256i) -> __m256i { + // For explanation, see alignr256_14. + let v = _mm256_permute2x128_si256(b, a, 0x21); + _mm256_alignr_epi8(a, v, 15) +} + +/// Unpack the given 128-bit vector into its 64-bit components. The first +/// element of the array returned corresponds to the least significant 64-bit +/// lane in `a`. +#[target_feature(enable = "ssse3")] +pub unsafe fn unpack64x128(a: __m128i) -> [u64; 2] { + [ + _mm_cvtsi128_si64(a) as u64, + _mm_cvtsi128_si64(_mm_srli_si128(a, 8)) as u64, + ] +} + +/// Unpack the given 256-bit vector into its 64-bit components. The first +/// element of the array returned corresponds to the least significant 64-bit +/// lane in `a`. +#[target_feature(enable = "avx2")] +pub unsafe fn unpack64x256(a: __m256i) -> [u64; 4] { + // Using transmute here is precisely equivalent, but actually slower. It's + // not quite clear why. + let lo = _mm256_extracti128_si256(a, 0); + let hi = _mm256_extracti128_si256(a, 1); + [ + _mm_cvtsi128_si64(lo) as u64, + _mm_cvtsi128_si64(_mm_srli_si128(lo, 8)) as u64, + _mm_cvtsi128_si64(hi) as u64, + _mm_cvtsi128_si64(_mm_srli_si128(hi, 8)) as u64, + ] +} + +/// Unpack the low 128-bits of `a` and `b`, and return them as 4 64-bit +/// integers. +/// +/// More precisely, if a = a4 a3 a2 a1 and b = b4 b3 b2 b1, where each element +/// is a 64-bit integer and a1/b1 correspond to the least significant 64 bits, +/// then the return value is `b2 b1 a2 a1`. +#[target_feature(enable = "avx2")] +pub unsafe fn unpacklo64x256(a: __m256i, b: __m256i) -> [u64; 4] { + let lo = _mm256_castsi256_si128(a); + let hi = _mm256_castsi256_si128(b); + [ + _mm_cvtsi128_si64(lo) as u64, + _mm_cvtsi128_si64(_mm_srli_si128(lo, 8)) as u64, + _mm_cvtsi128_si64(hi) as u64, + _mm_cvtsi128_si64(_mm_srli_si128(hi, 8)) as u64, + ] +} + +/// Returns true if and only if all bits in the given 128-bit vector are 0. +#[target_feature(enable = "ssse3")] +pub unsafe fn is_all_zeroes128(a: __m128i) -> bool { + let cmp = _mm_cmpeq_epi8(a, zeroes128()); + _mm_movemask_epi8(cmp) as u32 == 0xFFFF +} + +/// Returns true if and only if all bits in the given 256-bit vector are 0. +#[target_feature(enable = "avx2")] +pub unsafe fn is_all_zeroes256(a: __m256i) -> bool { + let cmp = _mm256_cmpeq_epi8(a, zeroes256()); + _mm256_movemask_epi8(cmp) as u32 == 0xFFFFFFFF +} + +/// Load a 128-bit vector from slice at the given position. The slice does +/// not need to be unaligned. +/// +/// Since this code assumes little-endian (there is no big-endian x86), the +/// bytes starting in `slice[at..]` will be at the least significant bits of +/// the returned vector. This is important for the surrounding code, since for +/// example, shifting the resulting vector right is equivalent to logically +/// shifting the bytes in `slice` left. +#[target_feature(enable = "sse2")] +pub unsafe fn loadu128(slice: &[u8], at: usize) -> __m128i { + let ptr = slice.get_unchecked(at..).as_ptr(); + _mm_loadu_si128(ptr as *const u8 as *const __m128i) +} + +/// Load a 256-bit vector from slice at the given position. The slice does +/// not need to be unaligned. +/// +/// Since this code assumes little-endian (there is no big-endian x86), the +/// bytes starting in `slice[at..]` will be at the least significant bits of +/// the returned vector. This is important for the surrounding code, since for +/// example, shifting the resulting vector right is equivalent to logically +/// shifting the bytes in `slice` left. +#[target_feature(enable = "avx2")] +pub unsafe fn loadu256(slice: &[u8], at: usize) -> __m256i { + let ptr = slice.get_unchecked(at..).as_ptr(); + _mm256_loadu_si256(ptr as *const u8 as *const __m256i) +} + +/// Returns a 128-bit vector with all bits set to 0. +#[target_feature(enable = "sse2")] +pub unsafe fn zeroes128() -> __m128i { + _mm_set1_epi8(0) +} + +/// Returns a 256-bit vector with all bits set to 0. +#[target_feature(enable = "avx2")] +pub unsafe fn zeroes256() -> __m256i { + _mm256_set1_epi8(0) +} + +/// Returns a 128-bit vector with all bits set to 1. +#[target_feature(enable = "sse2")] +pub unsafe fn ones128() -> __m128i { + _mm_set1_epi8(0xFF as u8 as i8) +} + +/// Returns a 256-bit vector with all bits set to 1. +#[target_feature(enable = "avx2")] +pub unsafe fn ones256() -> __m256i { + _mm256_set1_epi8(0xFF as u8 as i8) } diff -Nru temporalio-1.3.0/vendor/aho-corasick/src/util/int.rs temporalio-1.3.0/vendor/aho-corasick/src/util/int.rs --- temporalio-1.3.0/vendor/aho-corasick/src/util/int.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/aho-corasick/src/util/int.rs 2023-10-30 19:40:00.000000000 +0000 @@ -118,33 +118,6 @@ } } -pub(crate) trait I8 { - fn as_usize(self) -> usize; - fn to_bits(self) -> u8; - fn from_bits(n: u8) -> i8; -} - -impl I8 for i8 { - fn as_usize(self) -> usize { - #[cfg(debug_assertions)] - { - usize::try_from(self).expect("i8 overflowed usize") - } - #[cfg(not(debug_assertions))] - { - self as usize - } - } - - fn to_bits(self) -> u8 { - self as u8 - } - - fn from_bits(n: u8) -> i8 { - n as i8 - } -} - pub(crate) trait I32 { fn as_usize(self) -> usize; fn to_bits(self) -> u32; @@ -172,33 +145,6 @@ } } -pub(crate) trait I64 { - fn as_usize(self) -> usize; - fn to_bits(self) -> u64; - fn from_bits(n: u64) -> i64; -} - -impl I64 for i64 { - fn as_usize(self) -> usize { - #[cfg(debug_assertions)] - { - usize::try_from(self).expect("i64 overflowed usize") - } - #[cfg(not(debug_assertions))] - { - self as usize - } - } - - fn to_bits(self) -> u64 { - self as u64 - } - - fn from_bits(n: u64) -> i64 { - n as i64 - } -} - pub(crate) trait Usize { fn as_u8(self) -> u8; fn as_u16(self) -> u16; diff -Nru temporalio-1.3.0/vendor/aho-corasick/src/util/prefilter.rs temporalio-1.3.0/vendor/aho-corasick/src/util/prefilter.rs --- temporalio-1.3.0/vendor/aho-corasick/src/util/prefilter.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/aho-corasick/src/util/prefilter.rs 2023-10-30 19:40:00.000000000 +0000 @@ -162,7 +162,6 @@ /// builder before attempting to construct the prefilter. pub(crate) fn build(&self) -> Option { if !self.enabled { - debug!("prefilter not enabled, skipping"); return None; } // If we only have one pattern, then deferring to memmem is always @@ -174,55 +173,15 @@ // them. if !self.ascii_case_insensitive { if let Some(pre) = self.memmem.build() { - debug!("using memmem prefilter"); return Some(pre); } } - let (packed, patlen, minlen) = if self.ascii_case_insensitive { - (None, usize::MAX, 0) - } else { - let patlen = self.packed.as_ref().map_or(usize::MAX, |p| p.len()); - let minlen = self.packed.as_ref().map_or(0, |p| p.minimum_len()); - let packed = - self.packed.as_ref().and_then(|b| b.build()).map(|s| { - let memory_usage = s.memory_usage(); - debug!( - "built packed prefilter (len: {}, \ - minimum pattern len: {}, memory usage: {}) \ - for consideration", - patlen, minlen, memory_usage, - ); - Prefilter { finder: Arc::new(Packed(s)), memory_usage } - }); - (packed, patlen, minlen) - }; match (self.start_bytes.build(), self.rare_bytes.build()) { // If we could build both start and rare prefilters, then there are // a few cases in which we'd want to use the start-byte prefilter // over the rare-byte prefilter, since the former has lower // overhead. (prestart @ Some(_), prerare @ Some(_)) => { - debug!( - "both start (len={}, rank={}) and \ - rare (len={}, rank={}) byte prefilters \ - are available", - self.start_bytes.count, - self.start_bytes.rank_sum, - self.rare_bytes.count, - self.rare_bytes.rank_sum, - ); - if patlen <= 16 - && minlen >= 2 - && self.start_bytes.count >= 3 - && self.rare_bytes.count >= 3 - { - debug!( - "start and rare byte prefilters available, but \ - they're probably slower than packed so using \ - packed" - ); - return packed; - } // If the start-byte prefilter can scan for a smaller number // of bytes than the rare-byte prefilter, then it's probably // faster. @@ -237,69 +196,20 @@ // prefer the start-byte prefilter when we can. let has_rarer_bytes = self.start_bytes.rank_sum <= self.rare_bytes.rank_sum + 50; - if has_fewer_bytes { - debug!( - "using start byte prefilter because it has fewer - bytes to search for than the rare byte prefilter", - ); - prestart - } else if has_rarer_bytes { - debug!( - "using start byte prefilter because its byte \ - frequency rank was determined to be \ - \"good enough\" relative to the rare byte prefilter \ - byte frequency rank", - ); + if has_fewer_bytes || has_rarer_bytes { prestart } else { - debug!("using rare byte prefilter"); prerare } } - (prestart @ Some(_), None) => { - if patlen <= 16 && minlen >= 2 && self.start_bytes.count >= 3 { - debug!( - "start byte prefilter available, but \ - it's probably slower than packed so using \ - packed" - ); - return packed; - } - debug!( - "have start byte prefilter but not rare byte prefilter, \ - so using start byte prefilter", - ); - prestart - } - (None, prerare @ Some(_)) => { - if patlen <= 16 && minlen >= 2 && self.rare_bytes.count >= 3 { - debug!( - "rare byte prefilter available, but \ - it's probably slower than packed so using \ - packed" - ); - return packed; - } - debug!( - "have rare byte prefilter but not start byte prefilter, \ - so using rare byte prefilter", - ); - prerare - } - (None, None) if self.ascii_case_insensitive => { - debug!( - "no start or rare byte prefilter and ASCII case \ - insensitivity was enabled, so skipping prefilter", - ); - None - } + (prestart @ Some(_), None) => prestart, + (None, prerare @ Some(_)) => prerare, + (None, None) if self.ascii_case_insensitive => None, (None, None) => { - if packed.is_some() { - debug!("falling back to packed prefilter"); - } else { - debug!("no prefilter available"); - } - packed + self.packed.as_ref().and_then(|b| b.build()).map(|s| { + let memory_usage = s.memory_usage(); + Prefilter { finder: Arc::new(Packed(s)), memory_usage } + }) } } } diff -Nru temporalio-1.3.0/vendor/allocator-api2/.cargo-checksum.json temporalio-1.3.0/vendor/allocator-api2/.cargo-checksum.json --- temporalio-1.3.0/vendor/allocator-api2/.cargo-checksum.json 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/allocator-api2/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1 @@ +{"files":{"CHANGELOG.md":"b4d01c4b8a790e435dc0ab67a1ef8b6d8e39f87bec233540e247ef313737d855","COPYING":"aacc8f585552509941b8531442e43a8e3e1aabc7d92f1ff0736250b80f65361c","Cargo.toml":"2970819aad5ebe0a89647be22da6613623199255ff0d7dbb9238927ffea696f1","README.md":"85cecaf786f948c26510911416d7e0ab4c4f10367d963cad011589648084a986","license/APACHE":"65071d88cda37097d5579c272cf0db48b23acc4e2fe3ad16a5985cd714753cbc","license/MIT":"74d0d1e38a980edecb7c71d33f2056456e2cb6c37c16bd05a882d714b5e56661","src/lib.rs":"fc1294b60cbf4d9ca3f61a43b86aac9533cd6b5b87729a9bd32f7992186d1a49","src/nightly.rs":"fc84f98e2014bef66bd54671d8ec98db973fb46b80fb271d6783eb00d1f95228","src/stable/alloc/global.rs":"411208558701915ff0f7cf7ef6c64b8a3bc932944416c26fd832d03d10a76502","src/stable/alloc/mod.rs":"63db909472169a70ad5332f33f67b88e9ea361c13725c65540d7003c83d8d226","src/stable/alloc/system.rs":"7c9145f594869c3cb934e97d3eda1b0b8ed6bd8ba89b1aea7435fc6680465b6b","src/stable/boxed.rs":"2ac1c0ba02149192030460c2be123cf0614c4fb60ce6bc483cc2b62cce83c22a","src/stable/macros.rs":"ce3915ce7ee003d8790c695d70a4e77b1e63a908a5ae0825169270d0f4ab5941","src/stable/mod.rs":"fc44985d0d999e2bd52693a49bb1796451c0a9a2e6d4f7565629392a38ca54e1","src/stable/raw_vec.rs":"bc1cb45b661ae5786912d625351e6e0d33aac8e4edaf36873874184a136cd89c","src/stable/slice.rs":"14d6eb35e3557b5f78feb48fd4bea343f037e8f1f2d2707089db4dbed438b558","src/stable/vec/drain.rs":"f8209cbd76a57823f6583a84fee285727b6c00189ec299acc9f97a0829f0742f","src/stable/vec/into_iter.rs":"9b0e58c8cd6c34b3c706696cb9508c977cbfaa0eeb32d13f799a82520b5cd490","src/stable/vec/mod.rs":"19a6772a4e3053c55c83dd774d3b0154852080bb58734dd49052a4175f0b4df1","src/stable/vec/partial_eq.rs":"cb88615747b4413f26dcab206e026bbd50150bf7d97d8df174384e86151d875e","src/stable/vec/set_len_on_drop.rs":"36f2e8fdc9b0a838eb443d74bec0291d389e52bfe4f617e391d977f15e6893b5","src/stable/vec/splice.rs":"7ce9fa74764c36ab9043f7339548e96b0b68f7d1a16769c9cb066b9a538dcb14"},"package":"0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/allocator-api2/Cargo.toml temporalio-1.3.0/vendor/allocator-api2/Cargo.toml --- temporalio-1.3.0/vendor/allocator-api2/Cargo.toml 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/allocator-api2/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,32 @@ +# 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 = "allocator-api2" +version = "0.2.16" +authors = ["Zakarum "] +description = "Mirror of Rust's allocator API" +homepage = "https://github.com/zakarumych/allocator-api2" +documentation = "https://docs.rs/allocator-api2" +readme = "README.md" +license = "MIT OR Apache-2.0" +repository = "https://github.com/zakarumych/allocator-api2" + +[dependencies.serde] +version = "1.0" +optional = true + +[features] +alloc = [] +default = ["std"] +nightly = [] +std = ["alloc"] diff -Nru temporalio-1.3.0/vendor/allocator-api2/CHANGELOG.md temporalio-1.3.0/vendor/allocator-api2/CHANGELOG.md --- temporalio-1.3.0/vendor/allocator-api2/CHANGELOG.md 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/allocator-api2/CHANGELOG.md 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,7 @@ +# Changelog +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [Unreleased] diff -Nru temporalio-1.3.0/vendor/allocator-api2/COPYING temporalio-1.3.0/vendor/allocator-api2/COPYING --- temporalio-1.3.0/vendor/allocator-api2/COPYING 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/allocator-api2/COPYING 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,6 @@ +Copyright 2023 The allocator-api2 Project Developers + +Licensed under the Apache License, Version 2.0, or the MIT license , at your option. This file may not be +copied, modified, or distributed except according to those terms. diff -Nru temporalio-1.3.0/vendor/allocator-api2/license/APACHE temporalio-1.3.0/vendor/allocator-api2/license/APACHE --- temporalio-1.3.0/vendor/allocator-api2/license/APACHE 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/allocator-api2/license/APACHE 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,13 @@ +Copyright 2023 The allocator-api2 project developers + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/allocator-api2/license/MIT temporalio-1.3.0/vendor/allocator-api2/license/MIT --- temporalio-1.3.0/vendor/allocator-api2/license/MIT 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/allocator-api2/license/MIT 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,25 @@ +Copyright (c) 2023 The allocator-api2 project developers + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/allocator-api2/README.md temporalio-1.3.0/vendor/allocator-api2/README.md --- temporalio-1.3.0/vendor/allocator-api2/README.md 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/allocator-api2/README.md 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,53 @@ +# allocator-api2 + +[![crates](https://img.shields.io/crates/v/allocator-api2.svg?style=for-the-badge&label=allocator-api2)](https://crates.io/crates/allocator-api2) +[![docs](https://img.shields.io/badge/docs.rs-allocator--api2-66c2a5?style=for-the-badge&labelColor=555555&logoColor=white)](https://docs.rs/allocator-api2) +[![actions](https://img.shields.io/github/actions/workflow/status/zakarumych/allocator-api2/badge.yml?branch=main&style=for-the-badge)](https://github.com/zakarumych/allocator-api2/actions/workflows/badge.yml) +[![MIT/Apache](https://img.shields.io/badge/license-MIT%2FApache-blue.svg?style=for-the-badge)](COPYING) +![loc](https://img.shields.io/tokei/lines/github/zakarumych/allocator-api2?style=for-the-badge) + +This crate mirrors types and traits from Rust's unstable [`allocator_api`] +The intention of this crate is to serve as substitution for actual thing +for libs when build on stable and beta channels. +The target users are library authors who implement allocators or collection types +that use allocators, or anyone else who wants using [`allocator_api`] + +The crate should be frequently updated with minor version bump. +When [`allocator_api`] is stable this crate will get version `1.0` and simply +re-export from `core`, `alloc` and `std`. + +The code is mostly verbatim copy from rust repository. +Mostly attributes are removed. + +## Usage + +This paragraph describes how to use this crate correctly to ensure +compatibility and interoperability on both stable and nightly channels. + +If you are writing a library that interacts with allocators API, you can +add this crate as a dependency and use the types and traits from this +crate instead of the ones in `core` or `alloc`. +This will allow your library to compile on stable and beta channels. + +Your library *MAY* provide a feature that will enable "allocator-api2/nightly". +When this feature is enabled, your library *MUST* enable +unstable `#![feature(allocator_api)]` or it may not compile. +If feature is not provided, your library may not be compatible with the +rest of the users and cause compilation errors on nightly channel +when some other crate enables "allocator-api2/nightly" feature. + +## License + +Licensed under either of + +* Apache License, Version 2.0, ([license/APACHE](license/APACHE) or http://www.apache.org/licenses/LICENSE-2.0) +* MIT license ([license/MIT](license/MIT) or http://opensource.org/licenses/MIT) + +at your option. + +## Contributions + +Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions. + + +[`allocator_api`]: https://doc.rust-lang.org/unstable-book/library-features/allocator-api.html \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/allocator-api2/src/lib.rs temporalio-1.3.0/vendor/allocator-api2/src/lib.rs --- temporalio-1.3.0/vendor/allocator-api2/src/lib.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/allocator-api2/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,19 @@ +//! +//! allocator-api2 crate. +//! +#![cfg_attr(not(feature = "std"), no_std)] + +#[cfg(feature = "alloc")] +extern crate alloc as alloc_crate; + +#[cfg(not(feature = "nightly"))] +mod stable; + +#[cfg(feature = "nightly")] +mod nightly; + +#[cfg(not(feature = "nightly"))] +pub use self::stable::*; + +#[cfg(feature = "nightly")] +pub use self::nightly::*; diff -Nru temporalio-1.3.0/vendor/allocator-api2/src/nightly.rs temporalio-1.3.0/vendor/allocator-api2/src/nightly.rs --- temporalio-1.3.0/vendor/allocator-api2/src/nightly.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/allocator-api2/src/nightly.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,5 @@ +#[cfg(not(feature = "alloc"))] +pub use core::alloc; + +#[cfg(feature = "alloc")] +pub use alloc_crate::{alloc, boxed, vec}; diff -Nru temporalio-1.3.0/vendor/allocator-api2/src/stable/alloc/global.rs temporalio-1.3.0/vendor/allocator-api2/src/stable/alloc/global.rs --- temporalio-1.3.0/vendor/allocator-api2/src/stable/alloc/global.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/allocator-api2/src/stable/alloc/global.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,188 @@ +use core::ptr::NonNull; + +#[doc(inline)] +pub use alloc_crate::alloc::{alloc, alloc_zeroed, dealloc, handle_alloc_error, realloc}; + +use crate::stable::{assume, invalid_mut}; + +use super::{AllocError, Allocator, Layout}; + +/// The global memory allocator. +/// +/// This type implements the [`Allocator`] trait by forwarding calls +/// to the allocator registered with the `#[global_allocator]` attribute +/// if there is one, or the `std` crate’s default. +/// +/// Note: while this type is unstable, the functionality it provides can be +/// accessed through the [free functions in `alloc`](crate#functions). +#[derive(Copy, Clone, Default, Debug)] +pub struct Global; + +impl Global { + #[inline(always)] + fn alloc_impl(&self, layout: Layout, zeroed: bool) -> Result, AllocError> { + match layout.size() { + 0 => Ok(unsafe { + NonNull::new_unchecked(core::ptr::slice_from_raw_parts_mut( + invalid_mut(layout.align()), + 0, + )) + }), + // SAFETY: `layout` is non-zero in size, + size => unsafe { + let raw_ptr = if zeroed { + alloc_zeroed(layout) + } else { + alloc(layout) + }; + let ptr = NonNull::new(raw_ptr).ok_or(AllocError)?; + Ok(NonNull::new_unchecked(core::ptr::slice_from_raw_parts_mut( + ptr.as_ptr(), + size, + ))) + }, + } + } + + // SAFETY: Same as `Allocator::grow` + #[inline(always)] + unsafe fn grow_impl( + &self, + ptr: NonNull, + old_layout: Layout, + new_layout: Layout, + zeroed: bool, + ) -> Result, AllocError> { + debug_assert!( + new_layout.size() >= old_layout.size(), + "`new_layout.size()` must be greater than or equal to `old_layout.size()`" + ); + + match old_layout.size() { + 0 => self.alloc_impl(new_layout, zeroed), + + // SAFETY: `new_size` is non-zero as `old_size` is greater than or equal to `new_size` + // as required by safety conditions. Other conditions must be upheld by the caller + old_size if old_layout.align() == new_layout.align() => unsafe { + let new_size = new_layout.size(); + + // `realloc` probably checks for `new_size >= old_layout.size()` or something similar. + assume(new_size >= old_layout.size()); + + let raw_ptr = realloc(ptr.as_ptr(), old_layout, new_size); + let ptr = NonNull::new(raw_ptr).ok_or(AllocError)?; + if zeroed { + raw_ptr.add(old_size).write_bytes(0, new_size - old_size); + } + Ok(NonNull::new_unchecked(core::ptr::slice_from_raw_parts_mut( + ptr.as_ptr(), + new_size, + ))) + }, + + // SAFETY: because `new_layout.size()` must be greater than or equal to `old_size`, + // both the old and new memory allocation are valid for reads and writes for `old_size` + // bytes. Also, because the old allocation wasn't yet deallocated, it cannot overlap + // `new_ptr`. Thus, the call to `copy_nonoverlapping` is safe. The safety contract + // for `dealloc` must be upheld by the caller. + old_size => unsafe { + let new_ptr = self.alloc_impl(new_layout, zeroed)?; + core::ptr::copy_nonoverlapping(ptr.as_ptr(), new_ptr.as_ptr().cast(), old_size); + self.deallocate(ptr, old_layout); + Ok(new_ptr) + }, + } + } +} + +unsafe impl Allocator for Global { + #[inline(always)] + fn allocate(&self, layout: Layout) -> Result, AllocError> { + self.alloc_impl(layout, false) + } + + #[inline(always)] + fn allocate_zeroed(&self, layout: Layout) -> Result, AllocError> { + self.alloc_impl(layout, true) + } + + #[inline(always)] + unsafe fn deallocate(&self, ptr: NonNull, layout: Layout) { + if layout.size() != 0 { + // SAFETY: `layout` is non-zero in size, + // other conditions must be upheld by the caller + unsafe { dealloc(ptr.as_ptr(), layout) } + } + } + + #[inline(always)] + unsafe fn grow( + &self, + ptr: NonNull, + old_layout: Layout, + new_layout: Layout, + ) -> Result, AllocError> { + // SAFETY: all conditions must be upheld by the caller + unsafe { self.grow_impl(ptr, old_layout, new_layout, false) } + } + + #[inline(always)] + unsafe fn grow_zeroed( + &self, + ptr: NonNull, + old_layout: Layout, + new_layout: Layout, + ) -> Result, AllocError> { + // SAFETY: all conditions must be upheld by the caller + unsafe { self.grow_impl(ptr, old_layout, new_layout, true) } + } + + #[inline(always)] + unsafe fn shrink( + &self, + ptr: NonNull, + old_layout: Layout, + new_layout: Layout, + ) -> Result, AllocError> { + debug_assert!( + new_layout.size() <= old_layout.size(), + "`new_layout.size()` must be smaller than or equal to `old_layout.size()`" + ); + + match new_layout.size() { + // SAFETY: conditions must be upheld by the caller + 0 => unsafe { + self.deallocate(ptr, old_layout); + Ok(NonNull::new_unchecked(core::ptr::slice_from_raw_parts_mut( + invalid_mut(new_layout.align()), + 0, + ))) + }, + + // SAFETY: `new_size` is non-zero. Other conditions must be upheld by the caller + new_size if old_layout.align() == new_layout.align() => unsafe { + // `realloc` probably checks for `new_size <= old_layout.size()` or something similar. + assume(new_size <= old_layout.size()); + + let raw_ptr = realloc(ptr.as_ptr(), old_layout, new_size); + let ptr = NonNull::new(raw_ptr).ok_or(AllocError)?; + Ok(NonNull::new_unchecked(core::ptr::slice_from_raw_parts_mut( + ptr.as_ptr(), + new_size, + ))) + }, + + // SAFETY: because `new_size` must be smaller than or equal to `old_layout.size()`, + // both the old and new memory allocation are valid for reads and writes for `new_size` + // bytes. Also, because the old allocation wasn't yet deallocated, it cannot overlap + // `new_ptr`. Thus, the call to `copy_nonoverlapping` is safe. The safety contract + // for `dealloc` must be upheld by the caller. + new_size => unsafe { + let new_ptr = self.allocate(new_layout)?; + core::ptr::copy_nonoverlapping(ptr.as_ptr(), new_ptr.as_ptr().cast(), new_size); + self.deallocate(ptr, old_layout); + Ok(new_ptr) + }, + } + } +} diff -Nru temporalio-1.3.0/vendor/allocator-api2/src/stable/alloc/mod.rs temporalio-1.3.0/vendor/allocator-api2/src/stable/alloc/mod.rs --- temporalio-1.3.0/vendor/allocator-api2/src/stable/alloc/mod.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/allocator-api2/src/stable/alloc/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,416 @@ +//! Memory allocation APIs + +use core::{ + fmt, + ptr::{self, NonNull}, +}; + +#[cfg(feature = "alloc")] +mod global; + +#[cfg(feature = "std")] +mod system; + +pub use core::alloc::{GlobalAlloc, Layout, LayoutError}; + +#[cfg(feature = "alloc")] +pub use self::global::Global; + +#[cfg(feature = "std")] +pub use self::system::System; + +#[cfg(feature = "alloc")] +pub use alloc_crate::alloc::{alloc, alloc_zeroed, dealloc, realloc}; + +#[cfg(all(feature = "alloc", not(no_global_oom_handling)))] +pub use alloc_crate::alloc::handle_alloc_error; + +/// The `AllocError` error indicates an allocation failure +/// that may be due to resource exhaustion or to +/// something wrong when combining the given input arguments with this +/// allocator. +#[derive(Copy, Clone, PartialEq, Eq, Debug)] +pub struct AllocError; + +#[cfg(feature = "std")] +impl std::error::Error for AllocError {} + +// (we need this for downstream impl of trait Error) +impl fmt::Display for AllocError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.write_str("memory allocation failed") + } +} + +/// An implementation of `Allocator` can allocate, grow, shrink, and deallocate arbitrary blocks of +/// data described via [`Layout`][]. +/// +/// `Allocator` is designed to be implemented on ZSTs, references, or smart pointers because having +/// an allocator like `MyAlloc([u8; N])` cannot be moved, without updating the pointers to the +/// allocated memory. +/// +/// Unlike [`GlobalAlloc`][], zero-sized allocations are allowed in `Allocator`. If an underlying +/// allocator does not support this (like jemalloc) or return a null pointer (such as +/// `libc::malloc`), this must be caught by the implementation. +/// +/// ### Currently allocated memory +/// +/// Some of the methods require that a memory block be *currently allocated* via an allocator. This +/// means that: +/// +/// * the starting address for that memory block was previously returned by [`allocate`], [`grow`], or +/// [`shrink`], and +/// +/// * the memory block has not been subsequently deallocated, where blocks are either deallocated +/// directly by being passed to [`deallocate`] or were changed by being passed to [`grow`] or +/// [`shrink`] that returns `Ok`. If `grow` or `shrink` have returned `Err`, the passed pointer +/// remains valid. +/// +/// [`allocate`]: Allocator::allocate +/// [`grow`]: Allocator::grow +/// [`shrink`]: Allocator::shrink +/// [`deallocate`]: Allocator::deallocate +/// +/// ### Memory fitting +/// +/// Some of the methods require that a layout *fit* a memory block. What it means for a layout to +/// "fit" a memory block means (or equivalently, for a memory block to "fit" a layout) is that the +/// following conditions must hold: +/// +/// * The block must be allocated with the same alignment as [`layout.align()`], and +/// +/// * The provided [`layout.size()`] must fall in the range `min ..= max`, where: +/// - `min` is the size of the layout most recently used to allocate the block, and +/// - `max` is the latest actual size returned from [`allocate`], [`grow`], or [`shrink`]. +/// +/// [`layout.align()`]: Layout::align +/// [`layout.size()`]: Layout::size +/// +/// # Safety +/// +/// * Memory blocks returned from an allocator must point to valid memory and retain their validity +/// until the instance and all of its clones are dropped, +/// +/// * cloning or moving the allocator must not invalidate memory blocks returned from this +/// allocator. A cloned allocator must behave like the same allocator, and +/// +/// * any pointer to a memory block which is [*currently allocated*] may be passed to any other +/// method of the allocator. +/// +/// [*currently allocated*]: #currently-allocated-memory +pub unsafe trait Allocator { + /// Attempts to allocate a block of memory. + /// + /// On success, returns a [`NonNull<[u8]>`][NonNull] meeting the size and alignment guarantees of `layout`. + /// + /// The returned block may have a larger size than specified by `layout.size()`, and may or may + /// not have its contents initialized. + /// + /// # Errors + /// + /// Returning `Err` indicates that either memory is exhausted or `layout` does not meet + /// allocator's size or alignment constraints. + /// + /// Implementations are encouraged to return `Err` on memory exhaustion rather than panicking or + /// aborting, but this is not a strict requirement. (Specifically: it is *legal* to implement + /// this trait atop an underlying native allocation library that aborts on memory exhaustion.) + /// + /// Clients wishing to abort computation in response to an allocation error are encouraged to + /// call the [`handle_alloc_error`] function, rather than directly invoking `panic!` or similar. + /// + /// [`handle_alloc_error`]: ../../alloc/alloc/fn.handle_alloc_error.html + fn allocate(&self, layout: Layout) -> Result, AllocError>; + + /// Behaves like `allocate`, but also ensures that the returned memory is zero-initialized. + /// + /// # Errors + /// + /// Returning `Err` indicates that either memory is exhausted or `layout` does not meet + /// allocator's size or alignment constraints. + /// + /// Implementations are encouraged to return `Err` on memory exhaustion rather than panicking or + /// aborting, but this is not a strict requirement. (Specifically: it is *legal* to implement + /// this trait atop an underlying native allocation library that aborts on memory exhaustion.) + /// + /// Clients wishing to abort computation in response to an allocation error are encouraged to + /// call the [`handle_alloc_error`] function, rather than directly invoking `panic!` or similar. + /// + /// [`handle_alloc_error`]: ../../alloc/alloc/fn.handle_alloc_error.html + #[inline(always)] + fn allocate_zeroed(&self, layout: Layout) -> Result, AllocError> { + let ptr = self.allocate(layout)?; + // SAFETY: `alloc` returns a valid memory block + unsafe { ptr.cast::().as_ptr().write_bytes(0, ptr.len()) } + Ok(ptr) + } + + /// Deallocates the memory referenced by `ptr`. + /// + /// # Safety + /// + /// * `ptr` must denote a block of memory [*currently allocated*] via this allocator, and + /// * `layout` must [*fit*] that block of memory. + /// + /// [*currently allocated*]: #currently-allocated-memory + /// [*fit*]: #memory-fitting + unsafe fn deallocate(&self, ptr: NonNull, layout: Layout); + + /// Attempts to extend the memory block. + /// + /// Returns a new [`NonNull<[u8]>`][NonNull] containing a pointer and the actual size of the allocated + /// memory. The pointer is suitable for holding data described by `new_layout`. To accomplish + /// this, the allocator may extend the allocation referenced by `ptr` to fit the new layout. + /// + /// If this returns `Ok`, then ownership of the memory block referenced by `ptr` has been + /// transferred to this allocator. Any access to the old `ptr` is Undefined Behavior, even if the + /// allocation was grown in-place. The newly returned pointer is the only valid pointer + /// for accessing this memory now. + /// + /// If this method returns `Err`, then ownership of the memory block has not been transferred to + /// this allocator, and the contents of the memory block are unaltered. + /// + /// # Safety + /// + /// * `ptr` must denote a block of memory [*currently allocated*] via this allocator. + /// * `old_layout` must [*fit*] that block of memory (The `new_layout` argument need not fit it.). + /// * `new_layout.size()` must be greater than or equal to `old_layout.size()`. + /// + /// Note that `new_layout.align()` need not be the same as `old_layout.align()`. + /// + /// [*currently allocated*]: #currently-allocated-memory + /// [*fit*]: #memory-fitting + /// + /// # Errors + /// + /// Returns `Err` if the new layout does not meet the allocator's size and alignment + /// constraints of the allocator, or if growing otherwise fails. + /// + /// Implementations are encouraged to return `Err` on memory exhaustion rather than panicking or + /// aborting, but this is not a strict requirement. (Specifically: it is *legal* to implement + /// this trait atop an underlying native allocation library that aborts on memory exhaustion.) + /// + /// Clients wishing to abort computation in response to an allocation error are encouraged to + /// call the [`handle_alloc_error`] function, rather than directly invoking `panic!` or similar. + /// + /// [`handle_alloc_error`]: ../../alloc/alloc/fn.handle_alloc_error.html + #[inline(always)] + unsafe fn grow( + &self, + ptr: NonNull, + old_layout: Layout, + new_layout: Layout, + ) -> Result, AllocError> { + debug_assert!( + new_layout.size() >= old_layout.size(), + "`new_layout.size()` must be greater than or equal to `old_layout.size()`" + ); + + let new_ptr = self.allocate(new_layout)?; + + // SAFETY: because `new_layout.size()` must be greater than or equal to + // `old_layout.size()`, both the old and new memory allocation are valid for reads and + // writes for `old_layout.size()` bytes. Also, because the old allocation wasn't yet + // deallocated, it cannot overlap `new_ptr`. Thus, the call to `copy_nonoverlapping` is + // safe. The safety contract for `dealloc` must be upheld by the caller. + unsafe { + ptr::copy_nonoverlapping(ptr.as_ptr(), new_ptr.as_ptr().cast(), old_layout.size()); + self.deallocate(ptr, old_layout); + } + + Ok(new_ptr) + } + + /// Behaves like `grow`, but also ensures that the new contents are set to zero before being + /// returned. + /// + /// The memory block will contain the following contents after a successful call to + /// `grow_zeroed`: + /// * Bytes `0..old_layout.size()` are preserved from the original allocation. + /// * Bytes `old_layout.size()..old_size` will either be preserved or zeroed, depending on + /// the allocator implementation. `old_size` refers to the size of the memory block prior + /// to the `grow_zeroed` call, which may be larger than the size that was originally + /// requested when it was allocated. + /// * Bytes `old_size..new_size` are zeroed. `new_size` refers to the size of the memory + /// block returned by the `grow_zeroed` call. + /// + /// # Safety + /// + /// * `ptr` must denote a block of memory [*currently allocated*] via this allocator. + /// * `old_layout` must [*fit*] that block of memory (The `new_layout` argument need not fit it.). + /// * `new_layout.size()` must be greater than or equal to `old_layout.size()`. + /// + /// Note that `new_layout.align()` need not be the same as `old_layout.align()`. + /// + /// [*currently allocated*]: #currently-allocated-memory + /// [*fit*]: #memory-fitting + /// + /// # Errors + /// + /// Returns `Err` if the new layout does not meet the allocator's size and alignment + /// constraints of the allocator, or if growing otherwise fails. + /// + /// Implementations are encouraged to return `Err` on memory exhaustion rather than panicking or + /// aborting, but this is not a strict requirement. (Specifically: it is *legal* to implement + /// this trait atop an underlying native allocation library that aborts on memory exhaustion.) + /// + /// Clients wishing to abort computation in response to an allocation error are encouraged to + /// call the [`handle_alloc_error`] function, rather than directly invoking `panic!` or similar. + /// + /// [`handle_alloc_error`]: ../../alloc/alloc/fn.handle_alloc_error.html + #[inline(always)] + unsafe fn grow_zeroed( + &self, + ptr: NonNull, + old_layout: Layout, + new_layout: Layout, + ) -> Result, AllocError> { + debug_assert!( + new_layout.size() >= old_layout.size(), + "`new_layout.size()` must be greater than or equal to `old_layout.size()`" + ); + + let new_ptr = self.allocate_zeroed(new_layout)?; + + // SAFETY: because `new_layout.size()` must be greater than or equal to + // `old_layout.size()`, both the old and new memory allocation are valid for reads and + // writes for `old_layout.size()` bytes. Also, because the old allocation wasn't yet + // deallocated, it cannot overlap `new_ptr`. Thus, the call to `copy_nonoverlapping` is + // safe. The safety contract for `dealloc` must be upheld by the caller. + unsafe { + ptr::copy_nonoverlapping(ptr.as_ptr(), new_ptr.as_ptr().cast(), old_layout.size()); + self.deallocate(ptr, old_layout); + } + + Ok(new_ptr) + } + + /// Attempts to shrink the memory block. + /// + /// Returns a new [`NonNull<[u8]>`][NonNull] containing a pointer and the actual size of the allocated + /// memory. The pointer is suitable for holding data described by `new_layout`. To accomplish + /// this, the allocator may shrink the allocation referenced by `ptr` to fit the new layout. + /// + /// If this returns `Ok`, then ownership of the memory block referenced by `ptr` has been + /// transferred to this allocator. Any access to the old `ptr` is Undefined Behavior, even if the + /// allocation was shrunk in-place. The newly returned pointer is the only valid pointer + /// for accessing this memory now. + /// + /// If this method returns `Err`, then ownership of the memory block has not been transferred to + /// this allocator, and the contents of the memory block are unaltered. + /// + /// # Safety + /// + /// * `ptr` must denote a block of memory [*currently allocated*] via this allocator. + /// * `old_layout` must [*fit*] that block of memory (The `new_layout` argument need not fit it.). + /// * `new_layout.size()` must be smaller than or equal to `old_layout.size()`. + /// + /// Note that `new_layout.align()` need not be the same as `old_layout.align()`. + /// + /// [*currently allocated*]: #currently-allocated-memory + /// [*fit*]: #memory-fitting + /// + /// # Errors + /// + /// Returns `Err` if the new layout does not meet the allocator's size and alignment + /// constraints of the allocator, or if shrinking otherwise fails. + /// + /// Implementations are encouraged to return `Err` on memory exhaustion rather than panicking or + /// aborting, but this is not a strict requirement. (Specifically: it is *legal* to implement + /// this trait atop an underlying native allocation library that aborts on memory exhaustion.) + /// + /// Clients wishing to abort computation in response to an allocation error are encouraged to + /// call the [`handle_alloc_error`] function, rather than directly invoking `panic!` or similar. + /// + /// [`handle_alloc_error`]: ../../alloc/alloc/fn.handle_alloc_error.html + #[inline(always)] + unsafe fn shrink( + &self, + ptr: NonNull, + old_layout: Layout, + new_layout: Layout, + ) -> Result, AllocError> { + debug_assert!( + new_layout.size() <= old_layout.size(), + "`new_layout.size()` must be smaller than or equal to `old_layout.size()`" + ); + + let new_ptr = self.allocate(new_layout)?; + + // SAFETY: because `new_layout.size()` must be lower than or equal to + // `old_layout.size()`, both the old and new memory allocation are valid for reads and + // writes for `new_layout.size()` bytes. Also, because the old allocation wasn't yet + // deallocated, it cannot overlap `new_ptr`. Thus, the call to `copy_nonoverlapping` is + // safe. The safety contract for `dealloc` must be upheld by the caller. + unsafe { + ptr::copy_nonoverlapping(ptr.as_ptr(), new_ptr.as_ptr().cast(), new_layout.size()); + self.deallocate(ptr, old_layout); + } + + Ok(new_ptr) + } + + /// Creates a "by reference" adapter for this instance of `Allocator`. + /// + /// The returned adapter also implements `Allocator` and will simply borrow this. + #[inline(always)] + fn by_ref(&self) -> &Self + where + Self: Sized, + { + self + } +} + +unsafe impl Allocator for &A +where + A: Allocator + ?Sized, +{ + #[inline(always)] + fn allocate(&self, layout: Layout) -> Result, AllocError> { + (**self).allocate(layout) + } + + #[inline(always)] + fn allocate_zeroed(&self, layout: Layout) -> Result, AllocError> { + (**self).allocate_zeroed(layout) + } + + #[inline(always)] + unsafe fn deallocate(&self, ptr: NonNull, layout: Layout) { + // SAFETY: the safety contract must be upheld by the caller + unsafe { (**self).deallocate(ptr, layout) } + } + + #[inline(always)] + unsafe fn grow( + &self, + ptr: NonNull, + old_layout: Layout, + new_layout: Layout, + ) -> Result, AllocError> { + // SAFETY: the safety contract must be upheld by the caller + unsafe { (**self).grow(ptr, old_layout, new_layout) } + } + + #[inline(always)] + unsafe fn grow_zeroed( + &self, + ptr: NonNull, + old_layout: Layout, + new_layout: Layout, + ) -> Result, AllocError> { + // SAFETY: the safety contract must be upheld by the caller + unsafe { (**self).grow_zeroed(ptr, old_layout, new_layout) } + } + + #[inline(always)] + unsafe fn shrink( + &self, + ptr: NonNull, + old_layout: Layout, + new_layout: Layout, + ) -> Result, AllocError> { + // SAFETY: the safety contract must be upheld by the caller + unsafe { (**self).shrink(ptr, old_layout, new_layout) } + } +} diff -Nru temporalio-1.3.0/vendor/allocator-api2/src/stable/alloc/system.rs temporalio-1.3.0/vendor/allocator-api2/src/stable/alloc/system.rs --- temporalio-1.3.0/vendor/allocator-api2/src/stable/alloc/system.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/allocator-api2/src/stable/alloc/system.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,172 @@ +use core::ptr::NonNull; +pub use std::alloc::System; + +use crate::stable::{assume, invalid_mut}; + +use super::{AllocError, Allocator, GlobalAlloc as _, Layout}; + +unsafe impl Allocator for System { + #[inline(always)] + fn allocate(&self, layout: Layout) -> Result, AllocError> { + alloc_impl(layout, false) + } + + #[inline(always)] + fn allocate_zeroed(&self, layout: Layout) -> Result, AllocError> { + alloc_impl(layout, true) + } + + #[inline(always)] + unsafe fn deallocate(&self, ptr: NonNull, layout: Layout) { + if layout.size() != 0 { + // SAFETY: `layout` is non-zero in size, + // other conditions must be upheld by the caller + unsafe { System.dealloc(ptr.as_ptr(), layout) } + } + } + + #[inline(always)] + unsafe fn grow( + &self, + ptr: NonNull, + old_layout: Layout, + new_layout: Layout, + ) -> Result, AllocError> { + // SAFETY: all conditions must be upheld by the caller + unsafe { grow_impl(ptr, old_layout, new_layout, false) } + } + + #[inline(always)] + unsafe fn grow_zeroed( + &self, + ptr: NonNull, + old_layout: Layout, + new_layout: Layout, + ) -> Result, AllocError> { + // SAFETY: all conditions must be upheld by the caller + unsafe { grow_impl(ptr, old_layout, new_layout, true) } + } + + #[inline(always)] + unsafe fn shrink( + &self, + ptr: NonNull, + old_layout: Layout, + new_layout: Layout, + ) -> Result, AllocError> { + debug_assert!( + new_layout.size() <= old_layout.size(), + "`new_layout.size()` must be smaller than or equal to `old_layout.size()`" + ); + + match new_layout.size() { + // SAFETY: conditions must be upheld by the caller + 0 => unsafe { + self.deallocate(ptr, old_layout); + Ok(NonNull::new_unchecked(core::ptr::slice_from_raw_parts_mut( + invalid_mut(new_layout.align()), + 0, + ))) + }, + + // SAFETY: `new_size` is non-zero. Other conditions must be upheld by the caller + new_size if old_layout.align() == new_layout.align() => unsafe { + // `realloc` probably checks for `new_size <= old_layout.size()` or something similar. + assume(new_size <= old_layout.size()); + + let raw_ptr = System.realloc(ptr.as_ptr(), old_layout, new_size); + let ptr = NonNull::new(raw_ptr).ok_or(AllocError)?; + Ok(NonNull::new_unchecked(core::ptr::slice_from_raw_parts_mut( + ptr.as_ptr(), + new_size, + ))) + }, + + // SAFETY: because `new_size` must be smaller than or equal to `old_layout.size()`, + // both the old and new memory allocation are valid for reads and writes for `new_size` + // bytes. Also, because the old allocation wasn't yet deallocated, it cannot overlap + // `new_ptr`. Thus, the call to `copy_nonoverlapping` is safe. The safety contract + // for `dealloc` must be upheld by the caller. + new_size => unsafe { + let new_ptr = self.allocate(new_layout)?; + core::ptr::copy_nonoverlapping(ptr.as_ptr(), new_ptr.as_ptr().cast(), new_size); + self.deallocate(ptr, old_layout); + Ok(new_ptr) + }, + } + } +} + +#[inline(always)] +fn alloc_impl(layout: Layout, zeroed: bool) -> Result, AllocError> { + match layout.size() { + 0 => Ok(unsafe { + NonNull::new_unchecked(core::ptr::slice_from_raw_parts_mut( + invalid_mut(layout.align()), + 0, + )) + }), + // SAFETY: `layout` is non-zero in size, + size => unsafe { + let raw_ptr = if zeroed { + System.alloc_zeroed(layout) + } else { + System.alloc(layout) + }; + let ptr = NonNull::new(raw_ptr).ok_or(AllocError)?; + Ok(NonNull::new_unchecked(core::ptr::slice_from_raw_parts_mut( + ptr.as_ptr(), + size, + ))) + }, + } +} + +// SAFETY: Same as `Allocator::grow` +#[inline(always)] +unsafe fn grow_impl( + ptr: NonNull, + old_layout: Layout, + new_layout: Layout, + zeroed: bool, +) -> Result, AllocError> { + debug_assert!( + new_layout.size() >= old_layout.size(), + "`new_layout.size()` must be greater than or equal to `old_layout.size()`" + ); + + match old_layout.size() { + 0 => alloc_impl(new_layout, zeroed), + + // SAFETY: `new_size` is non-zero as `old_size` is greater than or equal to `new_size` + // as required by safety conditions. Other conditions must be upheld by the caller + old_size if old_layout.align() == new_layout.align() => unsafe { + let new_size = new_layout.size(); + + // `realloc` probably checks for `new_size >= old_layout.size()` or something similar. + assume(new_size >= old_layout.size()); + + let raw_ptr = System.realloc(ptr.as_ptr(), old_layout, new_size); + let ptr = NonNull::new(raw_ptr).ok_or(AllocError)?; + if zeroed { + raw_ptr.add(old_size).write_bytes(0, new_size - old_size); + } + Ok(NonNull::new_unchecked(core::ptr::slice_from_raw_parts_mut( + ptr.as_ptr(), + new_size, + ))) + }, + + // SAFETY: because `new_layout.size()` must be greater than or equal to `old_size`, + // both the old and new memory allocation are valid for reads and writes for `old_size` + // bytes. Also, because the old allocation wasn't yet deallocated, it cannot overlap + // `new_ptr`. Thus, the call to `copy_nonoverlapping` is safe. The safety contract + // for `dealloc` must be upheld by the caller. + old_size => unsafe { + let new_ptr = alloc_impl(new_layout, zeroed)?; + core::ptr::copy_nonoverlapping(ptr.as_ptr(), new_ptr.as_ptr().cast(), old_size); + System.deallocate(ptr, old_layout); + Ok(new_ptr) + }, + } +} diff -Nru temporalio-1.3.0/vendor/allocator-api2/src/stable/boxed.rs temporalio-1.3.0/vendor/allocator-api2/src/stable/boxed.rs --- temporalio-1.3.0/vendor/allocator-api2/src/stable/boxed.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/allocator-api2/src/stable/boxed.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,2155 @@ +//! The `Box` type for heap allocation. +//! +//! [`Box`], casually referred to as a 'box', provides the simplest form of +//! heap allocation in Rust. Boxes provide ownership for this allocation, and +//! drop their contents when they go out of scope. Boxes also ensure that they +//! never allocate more than `isize::MAX` bytes. +//! +//! # Examples +//! +//! Move a value from the stack to the heap by creating a [`Box`]: +//! +//! ``` +//! let val: u8 = 5; +//! let boxed: Box = Box::new(val); +//! ``` +//! +//! Move a value from a [`Box`] back to the stack by [dereferencing]: +//! +//! ``` +//! let boxed: Box = Box::new(5); +//! let val: u8 = *boxed; +//! ``` +//! +//! Creating a recursive data structure: +//! +//! ``` +//! #[derive(Debug)] +//! enum List { +//! Cons(T, Box>), +//! Nil, +//! } +//! +//! let list: List = List::Cons(1, Box::new(List::Cons(2, Box::new(List::Nil)))); +//! println!("{list:?}"); +//! ``` +//! +//! This will print `Cons(1, Cons(2, Nil))`. +//! +//! Recursive structures must be boxed, because if the definition of `Cons` +//! looked like this: +//! +//! ```compile_fail,E0072 +//! # enum List { +//! Cons(T, List), +//! # } +//! ``` +//! +//! It wouldn't work. This is because the size of a `List` depends on how many +//! elements are in the list, and so we don't know how much memory to allocate +//! for a `Cons`. By introducing a [`Box`], which has a defined size, we know how +//! big `Cons` needs to be. +//! +//! # Memory layout +//! +//! For non-zero-sized values, a [`Box`] will use the [`Global`] allocator for +//! its allocation. It is valid to convert both ways between a [`Box`] and a +//! raw pointer allocated with the [`Global`] allocator, given that the +//! [`Layout`] used with the allocator is correct for the type. More precisely, +//! a `value: *mut T` that has been allocated with the [`Global`] allocator +//! with `Layout::for_value(&*value)` may be converted into a box using +//! [`Box::::from_raw(value)`]. Conversely, the memory backing a `value: *mut +//! T` obtained from [`Box::::into_raw`] may be deallocated using the +//! [`Global`] allocator with [`Layout::for_value(&*value)`]. +//! +//! For zero-sized values, the `Box` pointer still has to be [valid] for reads +//! and writes and sufficiently aligned. In particular, casting any aligned +//! non-zero integer literal to a raw pointer produces a valid pointer, but a +//! pointer pointing into previously allocated memory that since got freed is +//! not valid. The recommended way to build a Box to a ZST if `Box::new` cannot +//! be used is to use [`ptr::NonNull::dangling`]. +//! +//! So long as `T: Sized`, a `Box` is guaranteed to be represented +//! as a single pointer and is also ABI-compatible with C pointers +//! (i.e. the C type `T*`). This means that if you have extern "C" +//! Rust functions that will be called from C, you can define those +//! Rust functions using `Box` types, and use `T*` as corresponding +//! type on the C side. As an example, consider this C header which +//! declares functions that create and destroy some kind of `Foo` +//! value: +//! +//! ```c +//! /* C header */ +//! +//! /* Returns ownership to the caller */ +//! struct Foo* foo_new(void); +//! +//! /* Takes ownership from the caller; no-op when invoked with null */ +//! void foo_delete(struct Foo*); +//! ``` +//! +//! These two functions might be implemented in Rust as follows. Here, the +//! `struct Foo*` type from C is translated to `Box`, which captures +//! the ownership constraints. Note also that the nullable argument to +//! `foo_delete` is represented in Rust as `Option>`, since `Box` +//! cannot be null. +//! +//! ``` +//! #[repr(C)] +//! pub struct Foo; +//! +//! #[no_mangle] +//! pub extern "C" fn foo_new() -> Box { +//! Box::new(Foo) +//! } +//! +//! #[no_mangle] +//! pub extern "C" fn foo_delete(_: Option>) {} +//! ``` +//! +//! Even though `Box` has the same representation and C ABI as a C pointer, +//! this does not mean that you can convert an arbitrary `T*` into a `Box` +//! and expect things to work. `Box` values will always be fully aligned, +//! non-null pointers. Moreover, the destructor for `Box` will attempt to +//! free the value with the global allocator. In general, the best practice +//! is to only use `Box` for pointers that originated from the global +//! allocator. +//! +//! **Important.** At least at present, you should avoid using +//! `Box` types for functions that are defined in C but invoked +//! from Rust. In those cases, you should directly mirror the C types +//! as closely as possible. Using types like `Box` where the C +//! definition is just using `T*` can lead to undefined behavior, as +//! described in [rust-lang/unsafe-code-guidelines#198][ucg#198]. +//! +//! # Considerations for unsafe code +//! +//! **Warning: This section is not normative and is subject to change, possibly +//! being relaxed in the future! It is a simplified summary of the rules +//! currently implemented in the compiler.** +//! +//! The aliasing rules for `Box` are the same as for `&mut T`. `Box` +//! asserts uniqueness over its content. Using raw pointers derived from a box +//! after that box has been mutated through, moved or borrowed as `&mut T` +//! is not allowed. For more guidance on working with box from unsafe code, see +//! [rust-lang/unsafe-code-guidelines#326][ucg#326]. +//! +//! +//! [ucg#198]: https://github.com/rust-lang/unsafe-code-guidelines/issues/198 +//! [ucg#326]: https://github.com/rust-lang/unsafe-code-guidelines/issues/326 +//! [dereferencing]: core::ops::Deref +//! [`Box::::from_raw(value)`]: Box::from_raw +//! [`Global`]: crate::alloc::Global +//! [`Layout`]: crate::alloc::Layout +//! [`Layout::for_value(&*value)`]: crate::alloc::Layout::for_value +//! [valid]: ptr#safety + +use core::any::Any; +use core::borrow; +use core::cmp::Ordering; +use core::convert::{From, TryFrom}; + +// use core::error::Error; +use core::fmt; +use core::future::Future; +use core::hash::{Hash, Hasher}; +#[cfg(not(no_global_oom_handling))] +use core::iter::FromIterator; +use core::iter::{FusedIterator, Iterator}; +use core::marker::Unpin; +use core::mem; +use core::ops::{Deref, DerefMut}; +use core::pin::Pin; +use core::ptr::{self, NonNull}; +use core::task::{Context, Poll}; + +use super::alloc::{AllocError, Allocator, Global, Layout}; +use super::raw_vec::RawVec; +#[cfg(not(no_global_oom_handling))] +use super::vec::Vec; +#[cfg(not(no_global_oom_handling))] +use alloc_crate::alloc::handle_alloc_error; + +/// A pointer type for heap allocation. +/// +/// See the [module-level documentation](../../std/boxed/index.html) for more. +pub struct Box(NonNull, A); + +// Safety: Box owns both T and A, so sending is safe if +// sending is safe for T and A. +unsafe impl Send for Box +where + T: Send, + A: Send, +{ +} + +// Safety: Box owns both T and A, so sharing is safe if +// sharing is safe for T and A. +unsafe impl Sync for Box +where + T: Sync, + A: Sync, +{ +} + +impl Box { + /// Allocates memory on the heap and then places `x` into it. + /// + /// This doesn't actually allocate if `T` is zero-sized. + /// + /// # Examples + /// + /// ``` + /// let five = Box::new(5); + /// ``` + #[cfg(all(not(no_global_oom_handling)))] + #[inline(always)] + #[must_use] + pub fn new(x: T) -> Self { + Self::new_in(x, Global) + } + + /// Constructs a new box with uninitialized contents. + /// + /// # Examples + /// + /// ``` + /// #![feature(new_uninit)] + /// + /// let mut five = Box::::new_uninit(); + /// + /// let five = unsafe { + /// // Deferred initialization: + /// five.as_mut_ptr().write(5); + /// + /// five.assume_init() + /// }; + /// + /// assert_eq!(*five, 5) + /// ``` + #[cfg(not(no_global_oom_handling))] + #[must_use] + #[inline(always)] + pub fn new_uninit() -> Box> { + Self::new_uninit_in(Global) + } + + /// Constructs a new `Box` with uninitialized contents, with the memory + /// being filled with `0` bytes. + /// + /// See [`MaybeUninit::zeroed`][zeroed] for examples of correct and incorrect usage + /// of this method. + /// + /// # Examples + /// + /// ``` + /// #![feature(new_uninit)] + /// + /// let zero = Box::::new_zeroed(); + /// let zero = unsafe { zero.assume_init() }; + /// + /// assert_eq!(*zero, 0) + /// ``` + /// + /// [zeroed]: mem::MaybeUninit::zeroed + #[cfg(not(no_global_oom_handling))] + #[must_use] + #[inline(always)] + pub fn new_zeroed() -> Box> { + Self::new_zeroed_in(Global) + } + + /// Constructs a new `Pin>`. If `T` does not implement [`Unpin`], then + /// `x` will be pinned in memory and unable to be moved. + /// + /// Constructing and pinning of the `Box` can also be done in two steps: `Box::pin(x)` + /// does the same as [Box::into_pin]\([Box::new]\(x)). Consider using + /// [`into_pin`](Box::into_pin) if you already have a `Box`, or if you want to + /// construct a (pinned) `Box` in a different way than with [`Box::new`]. + #[cfg(not(no_global_oom_handling))] + #[must_use] + #[inline(always)] + pub fn pin(x: T) -> Pin> { + Box::new(x).into() + } + + /// Allocates memory on the heap then places `x` into it, + /// returning an error if the allocation fails + /// + /// This doesn't actually allocate if `T` is zero-sized. + /// + /// # Examples + /// + /// ``` + /// #![feature(allocator_api)] + /// + /// let five = Box::try_new(5)?; + /// # Ok::<(), std::alloc::AllocError>(()) + /// ``` + #[inline(always)] + pub fn try_new(x: T) -> Result { + Self::try_new_in(x, Global) + } + + /// Constructs a new box with uninitialized contents on the heap, + /// returning an error if the allocation fails + /// + /// # Examples + /// + /// ``` + /// #![feature(allocator_api, new_uninit)] + /// + /// let mut five = Box::::try_new_uninit()?; + /// + /// let five = unsafe { + /// // Deferred initialization: + /// five.as_mut_ptr().write(5); + /// + /// five.assume_init() + /// }; + /// + /// assert_eq!(*five, 5); + /// # Ok::<(), std::alloc::AllocError>(()) + /// ``` + #[inline(always)] + pub fn try_new_uninit() -> Result>, AllocError> { + Box::try_new_uninit_in(Global) + } + + /// Constructs a new `Box` with uninitialized contents, with the memory + /// being filled with `0` bytes on the heap + /// + /// See [`MaybeUninit::zeroed`][zeroed] for examples of correct and incorrect usage + /// of this method. + /// + /// # Examples + /// + /// ``` + /// #![feature(allocator_api, new_uninit)] + /// + /// let zero = Box::::try_new_zeroed()?; + /// let zero = unsafe { zero.assume_init() }; + /// + /// assert_eq!(*zero, 0); + /// # Ok::<(), std::alloc::AllocError>(()) + /// ``` + /// + /// [zeroed]: mem::MaybeUninit::zeroed + #[inline(always)] + pub fn try_new_zeroed() -> Result>, AllocError> { + Box::try_new_zeroed_in(Global) + } +} + +impl Box { + /// Allocates memory in the given allocator then places `x` into it. + /// + /// This doesn't actually allocate if `T` is zero-sized. + /// + /// # Examples + /// + /// ``` + /// #![feature(allocator_api)] + /// + /// use std::alloc::System; + /// + /// let five = Box::new_in(5, System); + /// ``` + #[cfg(not(no_global_oom_handling))] + #[must_use] + #[inline(always)] + pub fn new_in(x: T, alloc: A) -> Self + where + A: Allocator, + { + let mut boxed = Self::new_uninit_in(alloc); + unsafe { + boxed.as_mut_ptr().write(x); + boxed.assume_init() + } + } + + /// Allocates memory in the given allocator then places `x` into it, + /// returning an error if the allocation fails + /// + /// This doesn't actually allocate if `T` is zero-sized. + /// + /// # Examples + /// + /// ``` + /// #![feature(allocator_api)] + /// + /// use std::alloc::System; + /// + /// let five = Box::try_new_in(5, System)?; + /// # Ok::<(), std::alloc::AllocError>(()) + /// ``` + #[inline(always)] + pub fn try_new_in(x: T, alloc: A) -> Result + where + A: Allocator, + { + let mut boxed = Self::try_new_uninit_in(alloc)?; + unsafe { + boxed.as_mut_ptr().write(x); + Ok(boxed.assume_init()) + } + } + + /// Constructs a new box with uninitialized contents in the provided allocator. + /// + /// # Examples + /// + /// ``` + /// #![feature(allocator_api, new_uninit)] + /// + /// use std::alloc::System; + /// + /// let mut five = Box::::new_uninit_in(System); + /// + /// let five = unsafe { + /// // Deferred initialization: + /// five.as_mut_ptr().write(5); + /// + /// five.assume_init() + /// }; + /// + /// assert_eq!(*five, 5) + /// ``` + #[cfg(not(no_global_oom_handling))] + #[must_use] + // #[unstable(feature = "new_uninit", issue = "63291")] + #[inline(always)] + pub fn new_uninit_in(alloc: A) -> Box, A> + where + A: Allocator, + { + let layout = Layout::new::>(); + // NOTE: Prefer match over unwrap_or_else since closure sometimes not inlineable. + // That would make code size bigger. + match Box::try_new_uninit_in(alloc) { + Ok(m) => m, + Err(_) => handle_alloc_error(layout), + } + } + + /// Constructs a new box with uninitialized contents in the provided allocator, + /// returning an error if the allocation fails + /// + /// # Examples + /// + /// ``` + /// #![feature(allocator_api, new_uninit)] + /// + /// use std::alloc::System; + /// + /// let mut five = Box::::try_new_uninit_in(System)?; + /// + /// let five = unsafe { + /// // Deferred initialization: + /// five.as_mut_ptr().write(5); + /// + /// five.assume_init() + /// }; + /// + /// assert_eq!(*five, 5); + /// # Ok::<(), std::alloc::AllocError>(()) + /// ``` + #[inline(always)] + pub fn try_new_uninit_in(alloc: A) -> Result, A>, AllocError> + where + A: Allocator, + { + let layout = Layout::new::>(); + let ptr = alloc.allocate(layout)?.cast(); + unsafe { Ok(Box::from_raw_in(ptr.as_ptr(), alloc)) } + } + + /// Constructs a new `Box` with uninitialized contents, with the memory + /// being filled with `0` bytes in the provided allocator. + /// + /// See [`MaybeUninit::zeroed`][zeroed] for examples of correct and incorrect usage + /// of this method. + /// + /// # Examples + /// + /// ``` + /// #![feature(allocator_api, new_uninit)] + /// + /// use std::alloc::System; + /// + /// let zero = Box::::new_zeroed_in(System); + /// let zero = unsafe { zero.assume_init() }; + /// + /// assert_eq!(*zero, 0) + /// ``` + /// + /// [zeroed]: mem::MaybeUninit::zeroed + #[cfg(not(no_global_oom_handling))] + // #[unstable(feature = "new_uninit", issue = "63291")] + #[must_use] + #[inline(always)] + pub fn new_zeroed_in(alloc: A) -> Box, A> + where + A: Allocator, + { + let layout = Layout::new::>(); + // NOTE: Prefer match over unwrap_or_else since closure sometimes not inlineable. + // That would make code size bigger. + match Box::try_new_zeroed_in(alloc) { + Ok(m) => m, + Err(_) => handle_alloc_error(layout), + } + } + + /// Constructs a new `Box` with uninitialized contents, with the memory + /// being filled with `0` bytes in the provided allocator, + /// returning an error if the allocation fails, + /// + /// See [`MaybeUninit::zeroed`][zeroed] for examples of correct and incorrect usage + /// of this method. + /// + /// # Examples + /// + /// ``` + /// #![feature(allocator_api, new_uninit)] + /// + /// use std::alloc::System; + /// + /// let zero = Box::::try_new_zeroed_in(System)?; + /// let zero = unsafe { zero.assume_init() }; + /// + /// assert_eq!(*zero, 0); + /// # Ok::<(), std::alloc::AllocError>(()) + /// ``` + /// + /// [zeroed]: mem::MaybeUninit::zeroed + #[inline(always)] + pub fn try_new_zeroed_in(alloc: A) -> Result, A>, AllocError> + where + A: Allocator, + { + let layout = Layout::new::>(); + let ptr = alloc.allocate_zeroed(layout)?.cast(); + unsafe { Ok(Box::from_raw_in(ptr.as_ptr(), alloc)) } + } + + /// Constructs a new `Pin>`. If `T` does not implement [`Unpin`], then + /// `x` will be pinned in memory and unable to be moved. + /// + /// Constructing and pinning of the `Box` can also be done in two steps: `Box::pin_in(x, alloc)` + /// does the same as [Box::into_pin]\([Box::new_in]\(x, alloc)). Consider using + /// [`into_pin`](Box::into_pin) if you already have a `Box`, or if you want to + /// construct a (pinned) `Box` in a different way than with [`Box::new_in`]. + #[cfg(not(no_global_oom_handling))] + #[must_use] + #[inline(always)] + pub fn pin_in(x: T, alloc: A) -> Pin + where + A: 'static + Allocator, + { + Self::into_pin(Self::new_in(x, alloc)) + } + + /// Converts a `Box` into a `Box<[T]>` + /// + /// This conversion does not allocate on the heap and happens in place. + #[inline(always)] + pub fn into_boxed_slice(boxed: Self) -> Box<[T], A> { + let (raw, alloc) = Box::into_raw_with_allocator(boxed); + unsafe { Box::from_raw_in(raw as *mut [T; 1], alloc) } + } + + /// Consumes the `Box`, returning the wrapped value. + /// + /// # Examples + /// + /// ``` + /// #![feature(box_into_inner)] + /// + /// let c = Box::new(5); + /// + /// assert_eq!(Box::into_inner(c), 5); + /// ``` + #[inline(always)] + pub fn into_inner(boxed: Self) -> T { + let ptr = boxed.0; + let unboxed = unsafe { ptr.as_ptr().read() }; + unsafe { boxed.1.deallocate(ptr.cast(), Layout::new::()) }; + unboxed + } +} + +impl Box<[T]> { + /// Constructs a new boxed slice with uninitialized contents. + /// + /// # Examples + /// + /// ``` + /// #![feature(new_uninit)] + /// + /// let mut values = Box::<[u32]>::new_uninit_slice(3); + /// + /// let values = unsafe { + /// // Deferred initialization: + /// values[0].as_mut_ptr().write(1); + /// values[1].as_mut_ptr().write(2); + /// values[2].as_mut_ptr().write(3); + /// + /// values.assume_init() + /// }; + /// + /// assert_eq!(*values, [1, 2, 3]) + /// ``` + #[cfg(not(no_global_oom_handling))] + #[must_use] + #[inline(always)] + pub fn new_uninit_slice(len: usize) -> Box<[mem::MaybeUninit]> { + unsafe { RawVec::with_capacity(len).into_box(len) } + } + + /// Constructs a new boxed slice with uninitialized contents, with the memory + /// being filled with `0` bytes. + /// + /// See [`MaybeUninit::zeroed`][zeroed] for examples of correct and incorrect usage + /// of this method. + /// + /// # Examples + /// + /// ``` + /// #![feature(new_uninit)] + /// + /// let values = Box::<[u32]>::new_zeroed_slice(3); + /// let values = unsafe { values.assume_init() }; + /// + /// assert_eq!(*values, [0, 0, 0]) + /// ``` + /// + /// [zeroed]: mem::MaybeUninit::zeroed + #[cfg(not(no_global_oom_handling))] + #[must_use] + #[inline(always)] + pub fn new_zeroed_slice(len: usize) -> Box<[mem::MaybeUninit]> { + unsafe { RawVec::with_capacity_zeroed(len).into_box(len) } + } + + /// Constructs a new boxed slice with uninitialized contents. Returns an error if + /// the allocation fails + /// + /// # Examples + /// + /// ``` + /// #![feature(allocator_api, new_uninit)] + /// + /// let mut values = Box::<[u32]>::try_new_uninit_slice(3)?; + /// let values = unsafe { + /// // Deferred initialization: + /// values[0].as_mut_ptr().write(1); + /// values[1].as_mut_ptr().write(2); + /// values[2].as_mut_ptr().write(3); + /// values.assume_init() + /// }; + /// + /// assert_eq!(*values, [1, 2, 3]); + /// # Ok::<(), std::alloc::AllocError>(()) + /// ``` + #[inline(always)] + pub fn try_new_uninit_slice(len: usize) -> Result]>, AllocError> { + unsafe { + let layout = match Layout::array::>(len) { + Ok(l) => l, + Err(_) => return Err(AllocError), + }; + let ptr = Global.allocate(layout)?; + Ok(RawVec::from_raw_parts_in(ptr.as_ptr() as *mut _, len, Global).into_box(len)) + } + } + + /// Constructs a new boxed slice with uninitialized contents, with the memory + /// being filled with `0` bytes. Returns an error if the allocation fails + /// + /// See [`MaybeUninit::zeroed`][zeroed] for examples of correct and incorrect usage + /// of this method. + /// + /// # Examples + /// + /// ``` + /// #![feature(allocator_api, new_uninit)] + /// + /// let values = Box::<[u32]>::try_new_zeroed_slice(3)?; + /// let values = unsafe { values.assume_init() }; + /// + /// assert_eq!(*values, [0, 0, 0]); + /// # Ok::<(), std::alloc::AllocError>(()) + /// ``` + /// + /// [zeroed]: mem::MaybeUninit::zeroed + #[inline(always)] + pub fn try_new_zeroed_slice(len: usize) -> Result]>, AllocError> { + unsafe { + let layout = match Layout::array::>(len) { + Ok(l) => l, + Err(_) => return Err(AllocError), + }; + let ptr = Global.allocate_zeroed(layout)?; + Ok(RawVec::from_raw_parts_in(ptr.as_ptr() as *mut _, len, Global).into_box(len)) + } + } +} + +impl Box<[T], A> { + /// Constructs a new boxed slice with uninitialized contents in the provided allocator. + /// + /// # Examples + /// + /// ``` + /// #![feature(allocator_api, new_uninit)] + /// + /// use std::alloc::System; + /// + /// let mut values = Box::<[u32], _>::new_uninit_slice_in(3, System); + /// + /// let values = unsafe { + /// // Deferred initialization: + /// values[0].as_mut_ptr().write(1); + /// values[1].as_mut_ptr().write(2); + /// values[2].as_mut_ptr().write(3); + /// + /// values.assume_init() + /// }; + /// + /// assert_eq!(*values, [1, 2, 3]) + /// ``` + #[cfg(not(no_global_oom_handling))] + #[must_use] + #[inline(always)] + pub fn new_uninit_slice_in(len: usize, alloc: A) -> Box<[mem::MaybeUninit], A> { + unsafe { RawVec::with_capacity_in(len, alloc).into_box(len) } + } + + /// Constructs a new boxed slice with uninitialized contents in the provided allocator, + /// with the memory being filled with `0` bytes. + /// + /// See [`MaybeUninit::zeroed`][zeroed] for examples of correct and incorrect usage + /// of this method. + /// + /// # Examples + /// + /// ``` + /// #![feature(allocator_api, new_uninit)] + /// + /// use std::alloc::System; + /// + /// let values = Box::<[u32], _>::new_zeroed_slice_in(3, System); + /// let values = unsafe { values.assume_init() }; + /// + /// assert_eq!(*values, [0, 0, 0]) + /// ``` + /// + /// [zeroed]: mem::MaybeUninit::zeroed + #[cfg(not(no_global_oom_handling))] + #[must_use] + #[inline(always)] + pub fn new_zeroed_slice_in(len: usize, alloc: A) -> Box<[mem::MaybeUninit], A> { + unsafe { RawVec::with_capacity_zeroed_in(len, alloc).into_box(len) } + } + + pub fn into_vec(self) -> Vec + where + A: Allocator, + { + unsafe { + let len = self.len(); + let (b, alloc) = Box::into_raw_with_allocator(self); + Vec::from_raw_parts_in(b as *mut T, len, len, alloc) + } + } +} + +impl Box, A> { + /// Converts to `Box`. + /// + /// # Safety + /// + /// As with [`MaybeUninit::assume_init`], + /// it is up to the caller to guarantee that the value + /// really is in an initialized state. + /// Calling this when the content is not yet fully initialized + /// causes immediate undefined behavior. + /// + /// [`MaybeUninit::assume_init`]: mem::MaybeUninit::assume_init + /// + /// # Examples + /// + /// ``` + /// #![feature(new_uninit)] + /// + /// let mut five = Box::::new_uninit(); + /// + /// let five: Box = unsafe { + /// // Deferred initialization: + /// five.as_mut_ptr().write(5); + /// + /// five.assume_init() + /// }; + /// + /// assert_eq!(*five, 5) + /// ``` + #[inline(always)] + pub unsafe fn assume_init(self) -> Box { + let (raw, alloc) = Box::into_raw_with_allocator(self); + unsafe { Box::from_raw_in(raw as *mut T, alloc) } + } + + /// Writes the value and converts to `Box`. + /// + /// This method converts the box similarly to [`Box::assume_init`] but + /// writes `value` into it before conversion thus guaranteeing safety. + /// In some scenarios use of this method may improve performance because + /// the compiler may be able to optimize copying from stack. + /// + /// # Examples + /// + /// ``` + /// #![feature(new_uninit)] + /// + /// let big_box = Box::<[usize; 1024]>::new_uninit(); + /// + /// let mut array = [0; 1024]; + /// for (i, place) in array.iter_mut().enumerate() { + /// *place = i; + /// } + /// + /// // The optimizer may be able to elide this copy, so previous code writes + /// // to heap directly. + /// let big_box = Box::write(big_box, array); + /// + /// for (i, x) in big_box.iter().enumerate() { + /// assert_eq!(*x, i); + /// } + /// ``` + #[inline(always)] + pub fn write(mut boxed: Self, value: T) -> Box { + unsafe { + (*boxed).write(value); + boxed.assume_init() + } + } +} + +impl Box<[mem::MaybeUninit], A> { + /// Converts to `Box<[T], A>`. + /// + /// # Safety + /// + /// As with [`MaybeUninit::assume_init`], + /// it is up to the caller to guarantee that the values + /// really are in an initialized state. + /// Calling this when the content is not yet fully initialized + /// causes immediate undefined behavior. + /// + /// [`MaybeUninit::assume_init`]: mem::MaybeUninit::assume_init + /// + /// # Examples + /// + /// ``` + /// #![feature(new_uninit)] + /// + /// let mut values = Box::<[u32]>::new_uninit_slice(3); + /// + /// let values = unsafe { + /// // Deferred initialization: + /// values[0].as_mut_ptr().write(1); + /// values[1].as_mut_ptr().write(2); + /// values[2].as_mut_ptr().write(3); + /// + /// values.assume_init() + /// }; + /// + /// assert_eq!(*values, [1, 2, 3]) + /// ``` + #[inline(always)] + pub unsafe fn assume_init(self) -> Box<[T], A> { + let (raw, alloc) = Box::into_raw_with_allocator(self); + unsafe { Box::from_raw_in(raw as *mut [T], alloc) } + } +} + +impl Box { + /// Constructs a box from a raw pointer. + /// + /// After calling this function, the raw pointer is owned by the + /// resulting `Box`. Specifically, the `Box` destructor will call + /// the destructor of `T` and free the allocated memory. For this + /// to be safe, the memory must have been allocated in accordance + /// with the [memory layout] used by `Box` . + /// + /// # Safety + /// + /// This function is unsafe because improper use may lead to + /// memory problems. For example, a double-free may occur if the + /// function is called twice on the same raw pointer. + /// + /// The safety conditions are described in the [memory layout] section. + /// + /// # Examples + /// + /// Recreate a `Box` which was previously converted to a raw pointer + /// using [`Box::into_raw`]: + /// ``` + /// let x = Box::new(5); + /// let ptr = Box::into_raw(x); + /// let x = unsafe { Box::from_raw(ptr) }; + /// ``` + /// Manually create a `Box` from scratch by using the global allocator: + /// ``` + /// use std::alloc::{alloc, Layout}; + /// + /// unsafe { + /// let ptr = alloc(Layout::new::()) as *mut i32; + /// // In general .write is required to avoid attempting to destruct + /// // the (uninitialized) previous contents of `ptr`, though for this + /// // simple example `*ptr = 5` would have worked as well. + /// ptr.write(5); + /// let x = Box::from_raw(ptr); + /// } + /// ``` + /// + /// [memory layout]: self#memory-layout + /// [`Layout`]: crate::Layout + #[must_use = "call `drop(from_raw(ptr))` if you intend to drop the `Box`"] + #[inline(always)] + pub unsafe fn from_raw(raw: *mut T) -> Self { + unsafe { Self::from_raw_in(raw, Global) } + } +} + +impl Box { + /// Constructs a box from a raw pointer in the given allocator. + /// + /// After calling this function, the raw pointer is owned by the + /// resulting `Box`. Specifically, the `Box` destructor will call + /// the destructor of `T` and free the allocated memory. For this + /// to be safe, the memory must have been allocated in accordance + /// with the [memory layout] used by `Box` . + /// + /// # Safety + /// + /// This function is unsafe because improper use may lead to + /// memory problems. For example, a double-free may occur if the + /// function is called twice on the same raw pointer. + /// + /// + /// # Examples + /// + /// Recreate a `Box` which was previously converted to a raw pointer + /// using [`Box::into_raw_with_allocator`]: + /// ``` + /// use std::alloc::System; + /// # use allocator_api2::boxed::Box; + /// + /// let x = Box::new_in(5, System); + /// let (ptr, alloc) = Box::into_raw_with_allocator(x); + /// let x = unsafe { Box::from_raw_in(ptr, alloc) }; + /// ``` + /// Manually create a `Box` from scratch by using the system allocator: + /// ``` + /// use allocator_api2::alloc::{Allocator, Layout, System}; + /// # use allocator_api2::boxed::Box; + /// + /// unsafe { + /// let ptr = System.allocate(Layout::new::())?.as_ptr().cast::(); + /// // In general .write is required to avoid attempting to destruct + /// // the (uninitialized) previous contents of `ptr`, though for this + /// // simple example `*ptr = 5` would have worked as well. + /// ptr.write(5); + /// let x = Box::from_raw_in(ptr, System); + /// } + /// # Ok::<(), allocator_api2::alloc::AllocError>(()) + /// ``` + /// + /// [memory layout]: self#memory-layout + /// [`Layout`]: crate::Layout + #[inline(always)] + pub const unsafe fn from_raw_in(raw: *mut T, alloc: A) -> Self { + Box(unsafe { NonNull::new_unchecked(raw) }, alloc) + } + + /// Consumes the `Box`, returning a wrapped raw pointer. + /// + /// The pointer will be properly aligned and non-null. + /// + /// After calling this function, the caller is responsible for the + /// memory previously managed by the `Box`. In particular, the + /// caller should properly destroy `T` and release the memory, taking + /// into account the [memory layout] used by `Box`. The easiest way to + /// do this is to convert the raw pointer back into a `Box` with the + /// [`Box::from_raw`] function, allowing the `Box` destructor to perform + /// the cleanup. + /// + /// Note: this is an associated function, which means that you have + /// to call it as `Box::into_raw(b)` instead of `b.into_raw()`. This + /// is so that there is no conflict with a method on the inner type. + /// + /// # Examples + /// Converting the raw pointer back into a `Box` with [`Box::from_raw`] + /// for automatic cleanup: + /// ``` + /// let x = Box::new(String::from("Hello")); + /// let ptr = Box::into_raw(x); + /// let x = unsafe { Box::from_raw(ptr) }; + /// ``` + /// Manual cleanup by explicitly running the destructor and deallocating + /// the memory: + /// ``` + /// use std::alloc::{dealloc, Layout}; + /// use std::ptr; + /// + /// let x = Box::new(String::from("Hello")); + /// let p = Box::into_raw(x); + /// unsafe { + /// ptr::drop_in_place(p); + /// dealloc(p as *mut u8, Layout::new::()); + /// } + /// ``` + /// + /// [memory layout]: self#memory-layout + #[inline(always)] + pub fn into_raw(b: Self) -> *mut T { + Self::into_raw_with_allocator(b).0 + } + + /// Consumes the `Box`, returning a wrapped raw pointer and the allocator. + /// + /// The pointer will be properly aligned and non-null. + /// + /// After calling this function, the caller is responsible for the + /// memory previously managed by the `Box`. In particular, the + /// caller should properly destroy `T` and release the memory, taking + /// into account the [memory layout] used by `Box`. The easiest way to + /// do this is to convert the raw pointer back into a `Box` with the + /// [`Box::from_raw_in`] function, allowing the `Box` destructor to perform + /// the cleanup. + /// + /// Note: this is an associated function, which means that you have + /// to call it as `Box::into_raw_with_allocator(b)` instead of `b.into_raw_with_allocator()`. This + /// is so that there is no conflict with a method on the inner type. + /// + /// # Examples + /// Converting the raw pointer back into a `Box` with [`Box::from_raw_in`] + /// for automatic cleanup: + /// ``` + /// #![feature(allocator_api)] + /// + /// use std::alloc::System; + /// + /// let x = Box::new_in(String::from("Hello"), System); + /// let (ptr, alloc) = Box::into_raw_with_allocator(x); + /// let x = unsafe { Box::from_raw_in(ptr, alloc) }; + /// ``` + /// Manual cleanup by explicitly running the destructor and deallocating + /// the memory: + /// ``` + /// #![feature(allocator_api)] + /// + /// use std::alloc::{Allocator, Layout, System}; + /// use std::ptr::{self, NonNull}; + /// + /// let x = Box::new_in(String::from("Hello"), System); + /// let (ptr, alloc) = Box::into_raw_with_allocator(x); + /// unsafe { + /// ptr::drop_in_place(ptr); + /// let non_null = NonNull::new_unchecked(ptr); + /// alloc.deallocate(non_null.cast(), Layout::new::()); + /// } + /// ``` + /// + /// [memory layout]: self#memory-layout + #[inline(always)] + pub fn into_raw_with_allocator(b: Self) -> (*mut T, A) { + let (leaked, alloc) = Box::into_non_null(b); + (leaked.as_ptr(), alloc) + } + + #[inline(always)] + pub fn into_non_null(b: Self) -> (NonNull, A) { + // Box is recognized as a "unique pointer" by Stacked Borrows, but internally it is a + // raw pointer for the type system. Turning it directly into a raw pointer would not be + // recognized as "releasing" the unique pointer to permit aliased raw accesses, + // so all raw pointer methods have to go through `Box::leak`. Turning *that* to a raw pointer + // behaves correctly. + let alloc = unsafe { ptr::read(&b.1) }; + (NonNull::from(Box::leak(b)), alloc) + } + + /// Returns a reference to the underlying allocator. + /// + /// Note: this is an associated function, which means that you have + /// to call it as `Box::allocator(&b)` instead of `b.allocator()`. This + /// is so that there is no conflict with a method on the inner type. + #[inline(always)] + pub const fn allocator(b: &Self) -> &A { + &b.1 + } + + /// Consumes and leaks the `Box`, returning a mutable reference, + /// `&'a mut T`. Note that the type `T` must outlive the chosen lifetime + /// `'a`. If the type has only static references, or none at all, then this + /// may be chosen to be `'static`. + /// + /// This function is mainly useful for data that lives for the remainder of + /// the program's life. Dropping the returned reference will cause a memory + /// leak. If this is not acceptable, the reference should first be wrapped + /// with the [`Box::from_raw`] function producing a `Box`. This `Box` can + /// then be dropped which will properly destroy `T` and release the + /// allocated memory. + /// + /// Note: this is an associated function, which means that you have + /// to call it as `Box::leak(b)` instead of `b.leak()`. This + /// is so that there is no conflict with a method on the inner type. + /// + /// # Examples + /// + /// Simple usage: + /// + /// ``` + /// let x = Box::new(41); + /// let static_ref: &'static mut usize = Box::leak(x); + /// *static_ref += 1; + /// assert_eq!(*static_ref, 42); + /// ``` + /// + /// Unsized data: + /// + /// ``` + /// let x = vec![1, 2, 3].into_boxed_slice(); + /// let static_ref = Box::leak(x); + /// static_ref[0] = 4; + /// assert_eq!(*static_ref, [4, 2, 3]); + /// ``` + #[inline(always)] + fn leak<'a>(b: Self) -> &'a mut T + where + A: 'a, + { + unsafe { &mut *mem::ManuallyDrop::new(b).0.as_ptr() } + } + + /// Converts a `Box` into a `Pin>`. If `T` does not implement [`Unpin`], then + /// `*boxed` will be pinned in memory and unable to be moved. + /// + /// This conversion does not allocate on the heap and happens in place. + /// + /// This is also available via [`From`]. + /// + /// Constructing and pinning a `Box` with Box::into_pin([Box::new]\(x)) + /// can also be written more concisely using [Box::pin]\(x). + /// This `into_pin` method is useful if you already have a `Box`, or you are + /// constructing a (pinned) `Box` in a different way than with [`Box::new`]. + /// + /// # Notes + /// + /// It's not recommended that crates add an impl like `From> for Pin`, + /// as it'll introduce an ambiguity when calling `Pin::from`. + /// A demonstration of such a poor impl is shown below. + /// + /// ```compile_fail + /// # use std::pin::Pin; + /// struct Foo; // A type defined in this crate. + /// impl From> for Pin { + /// fn from(_: Box<()>) -> Pin { + /// Pin::new(Foo) + /// } + /// } + /// + /// let foo = Box::new(()); + /// let bar = Pin::from(foo); + /// ``` + #[inline(always)] + pub fn into_pin(boxed: Self) -> Pin + where + A: 'static, + { + // It's not possible to move or replace the insides of a `Pin>` + // when `T: !Unpin`, so it's safe to pin it directly without any + // additional requirements. + unsafe { Pin::new_unchecked(boxed) } + } +} + +impl Drop for Box { + #[inline(always)] + fn drop(&mut self) { + let layout = Layout::for_value::(&**self); + unsafe { + ptr::drop_in_place(self.0.as_mut()); + self.1.deallocate(self.0.cast(), layout); + } + } +} + +#[cfg(not(no_global_oom_handling))] +impl Default for Box { + /// Creates a `Box`, with the `Default` value for T. + #[inline(always)] + fn default() -> Self { + Box::new(T::default()) + } +} + +impl Default for Box<[T], A> { + #[inline(always)] + fn default() -> Self { + let ptr: NonNull<[T]> = NonNull::<[T; 0]>::dangling(); + Box(ptr, A::default()) + } +} + +impl Default for Box { + #[inline(always)] + fn default() -> Self { + // SAFETY: This is the same as `Unique::cast` but with an unsized `U = str`. + let ptr: NonNull = unsafe { + let bytes: NonNull<[u8]> = NonNull::<[u8; 0]>::dangling(); + NonNull::new_unchecked(bytes.as_ptr() as *mut str) + }; + Box(ptr, A::default()) + } +} + +#[cfg(not(no_global_oom_handling))] +impl Clone for Box { + /// Returns a new box with a `clone()` of this box's contents. + /// + /// # Examples + /// + /// ``` + /// let x = Box::new(5); + /// let y = x.clone(); + /// + /// // The value is the same + /// assert_eq!(x, y); + /// + /// // But they are unique objects + /// assert_ne!(&*x as *const i32, &*y as *const i32); + /// ``` + #[inline(always)] + fn clone(&self) -> Self { + // Pre-allocate memory to allow writing the cloned value directly. + let mut boxed = Self::new_uninit_in(self.1.clone()); + unsafe { + boxed.write((**self).clone()); + boxed.assume_init() + } + } + + /// Copies `source`'s contents into `self` without creating a new allocation. + /// + /// # Examples + /// + /// ``` + /// let x = Box::new(5); + /// let mut y = Box::new(10); + /// let yp: *const i32 = &*y; + /// + /// y.clone_from(&x); + /// + /// // The value is the same + /// assert_eq!(x, y); + /// + /// // And no allocation occurred + /// assert_eq!(yp, &*y); + /// ``` + #[inline(always)] + fn clone_from(&mut self, source: &Self) { + (**self).clone_from(&(**source)); + } +} + +#[cfg(not(no_global_oom_handling))] +impl Clone for Box { + #[inline(always)] + fn clone(&self) -> Self { + // this makes a copy of the data + let buf: Box<[u8]> = self.as_bytes().into(); + unsafe { Box::from_raw(Box::into_raw(buf) as *mut str) } + } +} + +impl PartialEq for Box { + #[inline(always)] + fn eq(&self, other: &Self) -> bool { + PartialEq::eq(&**self, &**other) + } + #[inline(always)] + fn ne(&self, other: &Self) -> bool { + PartialEq::ne(&**self, &**other) + } +} + +impl PartialOrd for Box { + #[inline(always)] + fn partial_cmp(&self, other: &Self) -> Option { + PartialOrd::partial_cmp(&**self, &**other) + } + #[inline(always)] + fn lt(&self, other: &Self) -> bool { + PartialOrd::lt(&**self, &**other) + } + #[inline(always)] + fn le(&self, other: &Self) -> bool { + PartialOrd::le(&**self, &**other) + } + #[inline(always)] + fn ge(&self, other: &Self) -> bool { + PartialOrd::ge(&**self, &**other) + } + #[inline(always)] + fn gt(&self, other: &Self) -> bool { + PartialOrd::gt(&**self, &**other) + } +} + +impl Ord for Box { + #[inline(always)] + fn cmp(&self, other: &Self) -> Ordering { + Ord::cmp(&**self, &**other) + } +} + +impl Eq for Box {} + +impl Hash for Box { + #[inline(always)] + fn hash(&self, state: &mut H) { + (**self).hash(state); + } +} + +impl Hasher for Box { + #[inline(always)] + fn finish(&self) -> u64 { + (**self).finish() + } + #[inline(always)] + fn write(&mut self, bytes: &[u8]) { + (**self).write(bytes) + } + #[inline(always)] + fn write_u8(&mut self, i: u8) { + (**self).write_u8(i) + } + #[inline(always)] + fn write_u16(&mut self, i: u16) { + (**self).write_u16(i) + } + #[inline(always)] + fn write_u32(&mut self, i: u32) { + (**self).write_u32(i) + } + #[inline(always)] + fn write_u64(&mut self, i: u64) { + (**self).write_u64(i) + } + #[inline(always)] + fn write_u128(&mut self, i: u128) { + (**self).write_u128(i) + } + #[inline(always)] + fn write_usize(&mut self, i: usize) { + (**self).write_usize(i) + } + #[inline(always)] + fn write_i8(&mut self, i: i8) { + (**self).write_i8(i) + } + #[inline(always)] + fn write_i16(&mut self, i: i16) { + (**self).write_i16(i) + } + #[inline(always)] + fn write_i32(&mut self, i: i32) { + (**self).write_i32(i) + } + #[inline(always)] + fn write_i64(&mut self, i: i64) { + (**self).write_i64(i) + } + #[inline(always)] + fn write_i128(&mut self, i: i128) { + (**self).write_i128(i) + } + #[inline(always)] + fn write_isize(&mut self, i: isize) { + (**self).write_isize(i) + } +} + +#[cfg(not(no_global_oom_handling))] +impl From for Box { + /// Converts a `T` into a `Box` + /// + /// The conversion allocates on the heap and moves `t` + /// from the stack into it. + /// + /// # Examples + /// + /// ```rust + /// let x = 5; + /// let boxed = Box::new(5); + /// + /// assert_eq!(Box::from(x), boxed); + /// ``` + #[inline(always)] + fn from(t: T) -> Self { + Box::new(t) + } +} + +impl From> for Pin> +where + A: 'static, +{ + /// Converts a `Box` into a `Pin>`. If `T` does not implement [`Unpin`], then + /// `*boxed` will be pinned in memory and unable to be moved. + /// + /// This conversion does not allocate on the heap and happens in place. + /// + /// This is also available via [`Box::into_pin`]. + /// + /// Constructing and pinning a `Box` with >>::from([Box::new]\(x)) + /// can also be written more concisely using [Box::pin]\(x). + /// This `From` implementation is useful if you already have a `Box`, or you are + /// constructing a (pinned) `Box` in a different way than with [`Box::new`]. + #[inline(always)] + fn from(boxed: Box) -> Self { + Box::into_pin(boxed) + } +} + +#[cfg(not(no_global_oom_handling))] +impl From<&[T]> for Box<[T], A> { + /// Converts a `&[T]` into a `Box<[T]>` + /// + /// This conversion allocates on the heap + /// and performs a copy of `slice` and its contents. + /// + /// # Examples + /// ```rust + /// // create a &[u8] which will be used to create a Box<[u8]> + /// let slice: &[u8] = &[104, 101, 108, 108, 111]; + /// let boxed_slice: Box<[u8]> = Box::from(slice); + /// + /// println!("{boxed_slice:?}"); + /// ``` + #[inline(always)] + fn from(slice: &[T]) -> Box<[T], A> { + let len = slice.len(); + let buf = RawVec::with_capacity_in(len, A::default()); + unsafe { + ptr::copy_nonoverlapping(slice.as_ptr(), buf.ptr(), len); + buf.into_box(slice.len()).assume_init() + } + } +} + +#[cfg(not(no_global_oom_handling))] +impl From<&str> for Box { + /// Converts a `&str` into a `Box` + /// + /// This conversion allocates on the heap + /// and performs a copy of `s`. + /// + /// # Examples + /// + /// ```rust + /// let boxed: Box = Box::from("hello"); + /// println!("{boxed}"); + /// ``` + #[inline(always)] + fn from(s: &str) -> Box { + let (raw, alloc) = Box::into_raw_with_allocator(Box::<[u8], A>::from(s.as_bytes())); + unsafe { Box::from_raw_in(raw as *mut str, alloc) } + } +} + +impl From> for Box<[u8], A> { + /// Converts a `Box` into a `Box<[u8]>` + /// + /// This conversion does not allocate on the heap and happens in place. + /// + /// # Examples + /// ```rust + /// // create a Box which will be used to create a Box<[u8]> + /// let boxed: Box = Box::from("hello"); + /// let boxed_str: Box<[u8]> = Box::from(boxed); + /// + /// // create a &[u8] which will be used to create a Box<[u8]> + /// let slice: &[u8] = &[104, 101, 108, 108, 111]; + /// let boxed_slice = Box::from(slice); + /// + /// assert_eq!(boxed_slice, boxed_str); + /// ``` + #[inline(always)] + fn from(s: Box) -> Self { + let (raw, alloc) = Box::into_raw_with_allocator(s); + unsafe { Box::from_raw_in(raw as *mut [u8], alloc) } + } +} + +impl Box<[T; N], A> { + #[inline(always)] + pub fn slice(b: Self) -> Box<[T], A> { + let (ptr, alloc) = Box::into_raw_with_allocator(b); + unsafe { Box::from_raw_in(ptr, alloc) } + } + + pub fn into_vec(self) -> Vec + where + A: Allocator, + { + unsafe { + let (b, alloc) = Box::into_raw_with_allocator(self); + Vec::from_raw_parts_in(b as *mut T, N, N, alloc) + } + } +} + +#[cfg(not(no_global_oom_handling))] +impl From<[T; N]> for Box<[T]> { + /// Converts a `[T; N]` into a `Box<[T]>` + /// + /// This conversion moves the array to newly heap-allocated memory. + /// + /// # Examples + /// + /// ```rust + /// let boxed: Box<[u8]> = Box::from([4, 2]); + /// println!("{boxed:?}"); + /// ``` + #[inline(always)] + fn from(array: [T; N]) -> Box<[T]> { + Box::slice(Box::new(array)) + } +} + +impl TryFrom> for Box<[T; N], A> { + type Error = Box<[T], A>; + + /// Attempts to convert a `Box<[T]>` into a `Box<[T; N]>`. + /// + /// The conversion occurs in-place and does not require a + /// new memory allocation. + /// + /// # Errors + /// + /// Returns the old `Box<[T]>` in the `Err` variant if + /// `boxed_slice.len()` does not equal `N`. + #[inline(always)] + fn try_from(boxed_slice: Box<[T], A>) -> Result { + if boxed_slice.len() == N { + let (ptr, alloc) = Box::into_raw_with_allocator(boxed_slice); + Ok(unsafe { Box::from_raw_in(ptr as *mut [T; N], alloc) }) + } else { + Err(boxed_slice) + } + } +} + +impl Box { + /// Attempt to downcast the box to a concrete type. + /// + /// # Examples + /// + /// ``` + /// use std::any::Any; + /// + /// fn print_if_string(value: Box) { + /// if let Ok(string) = value.downcast::() { + /// println!("String ({}): {}", string.len(), string); + /// } + /// } + /// + /// let my_string = "Hello World".to_string(); + /// print_if_string(Box::new(my_string)); + /// print_if_string(Box::new(0i8)); + /// ``` + #[inline(always)] + pub fn downcast(self) -> Result, Self> { + if self.is::() { + unsafe { Ok(self.downcast_unchecked::()) } + } else { + Err(self) + } + } + + /// Downcasts the box to a concrete type. + /// + /// For a safe alternative see [`downcast`]. + /// + /// # Examples + /// + /// ``` + /// #![feature(downcast_unchecked)] + /// + /// use std::any::Any; + /// + /// let x: Box = Box::new(1_usize); + /// + /// unsafe { + /// assert_eq!(*x.downcast_unchecked::(), 1); + /// } + /// ``` + /// + /// # Safety + /// + /// The contained value must be of type `T`. Calling this method + /// with the incorrect type is *undefined behavior*. + /// + /// [`downcast`]: Self::downcast + #[inline(always)] + pub unsafe fn downcast_unchecked(self) -> Box { + debug_assert!(self.is::()); + unsafe { + let (raw, alloc): (*mut dyn Any, _) = Box::into_raw_with_allocator(self); + Box::from_raw_in(raw as *mut T, alloc) + } + } +} + +impl Box { + /// Attempt to downcast the box to a concrete type. + /// + /// # Examples + /// + /// ``` + /// use std::any::Any; + /// + /// fn print_if_string(value: Box) { + /// if let Ok(string) = value.downcast::() { + /// println!("String ({}): {}", string.len(), string); + /// } + /// } + /// + /// let my_string = "Hello World".to_string(); + /// print_if_string(Box::new(my_string)); + /// print_if_string(Box::new(0i8)); + /// ``` + #[inline(always)] + pub fn downcast(self) -> Result, Self> { + if self.is::() { + unsafe { Ok(self.downcast_unchecked::()) } + } else { + Err(self) + } + } + + /// Downcasts the box to a concrete type. + /// + /// For a safe alternative see [`downcast`]. + /// + /// # Examples + /// + /// ``` + /// #![feature(downcast_unchecked)] + /// + /// use std::any::Any; + /// + /// let x: Box = Box::new(1_usize); + /// + /// unsafe { + /// assert_eq!(*x.downcast_unchecked::(), 1); + /// } + /// ``` + /// + /// # Safety + /// + /// The contained value must be of type `T`. Calling this method + /// with the incorrect type is *undefined behavior*. + /// + /// [`downcast`]: Self::downcast + #[inline(always)] + pub unsafe fn downcast_unchecked(self) -> Box { + debug_assert!(self.is::()); + unsafe { + let (raw, alloc): (*mut (dyn Any + Send), _) = Box::into_raw_with_allocator(self); + Box::from_raw_in(raw as *mut T, alloc) + } + } +} + +impl Box { + /// Attempt to downcast the box to a concrete type. + /// + /// # Examples + /// + /// ``` + /// use std::any::Any; + /// + /// fn print_if_string(value: Box) { + /// if let Ok(string) = value.downcast::() { + /// println!("String ({}): {}", string.len(), string); + /// } + /// } + /// + /// let my_string = "Hello World".to_string(); + /// print_if_string(Box::new(my_string)); + /// print_if_string(Box::new(0i8)); + /// ``` + #[inline(always)] + pub fn downcast(self) -> Result, Self> { + if self.is::() { + unsafe { Ok(self.downcast_unchecked::()) } + } else { + Err(self) + } + } + + /// Downcasts the box to a concrete type. + /// + /// For a safe alternative see [`downcast`]. + /// + /// # Examples + /// + /// ``` + /// #![feature(downcast_unchecked)] + /// + /// use std::any::Any; + /// + /// let x: Box = Box::new(1_usize); + /// + /// unsafe { + /// assert_eq!(*x.downcast_unchecked::(), 1); + /// } + /// ``` + /// + /// # Safety + /// + /// The contained value must be of type `T`. Calling this method + /// with the incorrect type is *undefined behavior*. + /// + /// [`downcast`]: Self::downcast + #[inline(always)] + pub unsafe fn downcast_unchecked(self) -> Box { + debug_assert!(self.is::()); + unsafe { + let (raw, alloc): (*mut (dyn Any + Send + Sync), _) = + Box::into_raw_with_allocator(self); + Box::from_raw_in(raw as *mut T, alloc) + } + } +} + +impl fmt::Display for Box { + #[inline(always)] + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + fmt::Display::fmt(&**self, f) + } +} + +impl fmt::Debug for Box { + #[inline(always)] + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + fmt::Debug::fmt(&**self, f) + } +} + +impl fmt::Pointer for Box { + #[inline(always)] + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + // It's not possible to extract the inner Uniq directly from the Box, + // instead we cast it to a *const which aliases the Unique + let ptr: *const T = &**self; + fmt::Pointer::fmt(&ptr, f) + } +} + +impl Deref for Box { + type Target = T; + + #[inline(always)] + fn deref(&self) -> &T { + unsafe { self.0.as_ref() } + } +} + +impl DerefMut for Box { + #[inline(always)] + fn deref_mut(&mut self) -> &mut T { + unsafe { self.0.as_mut() } + } +} + +impl Iterator for Box { + type Item = I::Item; + + #[inline(always)] + fn next(&mut self) -> Option { + (**self).next() + } + + #[inline(always)] + fn size_hint(&self) -> (usize, Option) { + (**self).size_hint() + } + + #[inline(always)] + fn nth(&mut self, n: usize) -> Option { + (**self).nth(n) + } + + #[inline(always)] + fn last(self) -> Option { + BoxIter::last(self) + } +} + +trait BoxIter { + type Item; + fn last(self) -> Option; +} + +impl BoxIter for Box { + type Item = I::Item; + + #[inline(always)] + fn last(self) -> Option { + #[inline(always)] + fn some(_: Option, x: T) -> Option { + Some(x) + } + + self.fold(None, some) + } +} + +impl DoubleEndedIterator for Box { + #[inline(always)] + fn next_back(&mut self) -> Option { + (**self).next_back() + } + #[inline(always)] + fn nth_back(&mut self, n: usize) -> Option { + (**self).nth_back(n) + } +} + +impl ExactSizeIterator for Box { + #[inline(always)] + fn len(&self) -> usize { + (**self).len() + } +} + +impl FusedIterator for Box {} + +#[cfg(not(no_global_oom_handling))] +impl FromIterator for Box<[I]> { + #[inline(always)] + fn from_iter>(iter: T) -> Self { + iter.into_iter().collect::>().into_boxed_slice() + } +} + +#[cfg(not(no_global_oom_handling))] +impl Clone for Box<[T], A> { + #[inline(always)] + fn clone(&self) -> Self { + let alloc = Box::allocator(self).clone(); + let mut vec = Vec::with_capacity_in(self.len(), alloc); + vec.extend_from_slice(self); + vec.into_boxed_slice() + } + + #[inline(always)] + fn clone_from(&mut self, other: &Self) { + if self.len() == other.len() { + self.clone_from_slice(other); + } else { + *self = other.clone(); + } + } +} + +impl borrow::Borrow for Box { + #[inline(always)] + fn borrow(&self) -> &T { + self + } +} + +impl borrow::BorrowMut for Box { + #[inline(always)] + fn borrow_mut(&mut self) -> &mut T { + self + } +} + +impl AsRef for Box { + #[inline(always)] + fn as_ref(&self) -> &T { + self + } +} + +impl AsMut for Box { + #[inline(always)] + fn as_mut(&mut self) -> &mut T { + self + } +} + +/* Nota bene + * + * We could have chosen not to add this impl, and instead have written a + * function of Pin> to Pin. Such a function would not be sound, + * because Box implements Unpin even when T does not, as a result of + * this impl. + * + * We chose this API instead of the alternative for a few reasons: + * - Logically, it is helpful to understand pinning in regard to the + * memory region being pointed to. For this reason none of the + * standard library pointer types support projecting through a pin + * (Box is the only pointer type in std for which this would be + * safe.) + * - It is in practice very useful to have Box be unconditionally + * Unpin because of trait objects, for which the structural auto + * trait functionality does not apply (e.g., Box would + * otherwise not be Unpin). + * + * Another type with the same semantics as Box but only a conditional + * implementation of `Unpin` (where `T: Unpin`) would be valid/safe, and + * could have a method to project a Pin from it. + */ +impl Unpin for Box where A: 'static {} + +impl Future for Box +where + A: 'static, +{ + type Output = F::Output; + + #[inline(always)] + fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { + F::poll(Pin::new(&mut *self), cx) + } +} + +#[cfg(feature = "std")] +mod error { + use std::error::Error; + + use super::Box; + + #[cfg(not(no_global_oom_handling))] + impl<'a, E: Error + 'a> From for Box { + /// Converts a type of [`Error`] into a box of dyn [`Error`]. + /// + /// # Examples + /// + /// ``` + /// use std::error::Error; + /// use std::fmt; + /// use std::mem; + /// + /// #[derive(Debug)] + /// struct AnError; + /// + /// impl fmt::Display for AnError { + /// fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + /// write!(f, "An error") + /// } + /// } + /// + /// impl Error for AnError {} + /// + /// let an_error = AnError; + /// assert!(0 == mem::size_of_val(&an_error)); + /// let a_boxed_error = Box::::from(an_error); + /// assert!(mem::size_of::>() == mem::size_of_val(&a_boxed_error)) + /// ``` + #[inline(always)] + fn from(err: E) -> Box { + unsafe { Box::from_raw(Box::leak(Box::new(err))) } + } + } + + #[cfg(not(no_global_oom_handling))] + impl<'a, E: Error + Send + Sync + 'a> From for Box { + /// Converts a type of [`Error`] + [`Send`] + [`Sync`] into a box of + /// dyn [`Error`] + [`Send`] + [`Sync`]. + /// + /// # Examples + /// + /// ``` + /// use std::error::Error; + /// use std::fmt; + /// use std::mem; + /// + /// #[derive(Debug)] + /// struct AnError; + /// + /// impl fmt::Display for AnError { + /// fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + /// write!(f, "An error") + /// } + /// } + /// + /// impl Error for AnError {} + /// + /// unsafe impl Send for AnError {} + /// + /// unsafe impl Sync for AnError {} + /// + /// let an_error = AnError; + /// assert!(0 == mem::size_of_val(&an_error)); + /// let a_boxed_error = Box::::from(an_error); + /// assert!( + /// mem::size_of::>() == mem::size_of_val(&a_boxed_error)) + /// ``` + #[inline(always)] + fn from(err: E) -> Box { + unsafe { Box::from_raw(Box::leak(Box::new(err))) } + } + } + + impl Error for Box { + #[inline(always)] + fn source(&self) -> Option<&(dyn Error + 'static)> { + Error::source(&**self) + } + } +} + +#[cfg(feature = "std")] +impl std::io::Read for Box { + #[inline] + fn read(&mut self, buf: &mut [u8]) -> std::io::Result { + (**self).read(buf) + } + + #[inline] + fn read_to_end(&mut self, buf: &mut std::vec::Vec) -> std::io::Result { + (**self).read_to_end(buf) + } + + #[inline] + fn read_to_string(&mut self, buf: &mut String) -> std::io::Result { + (**self).read_to_string(buf) + } + + #[inline] + fn read_exact(&mut self, buf: &mut [u8]) -> std::io::Result<()> { + (**self).read_exact(buf) + } +} + +#[cfg(feature = "std")] +impl std::io::Write for Box { + #[inline] + fn write(&mut self, buf: &[u8]) -> std::io::Result { + (**self).write(buf) + } + + #[inline] + fn flush(&mut self) -> std::io::Result<()> { + (**self).flush() + } + + #[inline] + fn write_all(&mut self, buf: &[u8]) -> std::io::Result<()> { + (**self).write_all(buf) + } + + #[inline] + fn write_fmt(&mut self, fmt: fmt::Arguments<'_>) -> std::io::Result<()> { + (**self).write_fmt(fmt) + } +} + +#[cfg(feature = "std")] +impl std::io::Seek for Box { + #[inline] + fn seek(&mut self, pos: std::io::SeekFrom) -> std::io::Result { + (**self).seek(pos) + } + + #[inline] + fn stream_position(&mut self) -> std::io::Result { + (**self).stream_position() + } +} + +#[cfg(feature = "std")] +impl std::io::BufRead for Box { + #[inline] + fn fill_buf(&mut self) -> std::io::Result<&[u8]> { + (**self).fill_buf() + } + + #[inline] + fn consume(&mut self, amt: usize) { + (**self).consume(amt) + } + + #[inline] + fn read_until(&mut self, byte: u8, buf: &mut std::vec::Vec) -> std::io::Result { + (**self).read_until(byte, buf) + } + + #[inline] + fn read_line(&mut self, buf: &mut std::string::String) -> std::io::Result { + (**self).read_line(buf) + } +} + +#[cfg(feature = "alloc")] +impl Extend> for alloc_crate::string::String { + fn extend>>(&mut self, iter: I) { + iter.into_iter().for_each(move |s| self.push_str(&s)); + } +} + +#[cfg(not(no_global_oom_handling))] +impl Clone for Box { + #[inline] + fn clone(&self) -> Self { + (**self).into() + } +} + +#[cfg(not(no_global_oom_handling))] +impl From<&core::ffi::CStr> for Box { + /// Converts a `&CStr` into a `Box`, + /// by copying the contents into a newly allocated [`Box`]. + fn from(s: &core::ffi::CStr) -> Box { + let boxed: Box<[u8]> = Box::from(s.to_bytes_with_nul()); + unsafe { Box::from_raw(Box::into_raw(boxed) as *mut core::ffi::CStr) } + } +} + +#[cfg(feature = "serde")] +impl serde::Serialize for Box +where + T: serde::Serialize, + A: Allocator, +{ + #[inline(always)] + fn serialize(&self, serializer: S) -> Result { + (**self).serialize(serializer) + } +} + +#[cfg(feature = "serde")] +impl<'de, T, A> serde::Deserialize<'de> for Box +where + T: serde::Deserialize<'de>, + A: Allocator + Default, +{ + #[inline(always)] + fn deserialize>(deserializer: D) -> Result { + let value = T::deserialize(deserializer)?; + Ok(Box::new_in(value, A::default())) + } +} diff -Nru temporalio-1.3.0/vendor/allocator-api2/src/stable/macros.rs temporalio-1.3.0/vendor/allocator-api2/src/stable/macros.rs --- temporalio-1.3.0/vendor/allocator-api2/src/stable/macros.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/allocator-api2/src/stable/macros.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,83 @@ +/// Creates a [`Vec`] containing the arguments. +/// +/// `vec!` allows `Vec`s to be defined with the same syntax as array expressions. +/// There are two forms of this macro: +/// +/// - Create a [`Vec`] containing a given list of elements: +/// +/// ``` +/// use allocator_api2::vec; +/// let v = vec![1, 2, 3]; +/// assert_eq!(v[0], 1); +/// assert_eq!(v[1], 2); +/// assert_eq!(v[2], 3); +/// ``` +/// +/// +/// ``` +/// use allocator_api2::{vec, alloc::Global}; +/// let v = vec![in Global; 1, 2, 3]; +/// assert_eq!(v[0], 1); +/// assert_eq!(v[1], 2); +/// assert_eq!(v[2], 3); +/// ``` +/// +/// - Create a [`Vec`] from a given element and size: +/// +/// ``` +/// use allocator_api2::vec; +/// let v = vec![1; 3]; +/// assert_eq!(v, [1, 1, 1]); +/// ``` +/// +/// ``` +/// use allocator_api2::{vec, alloc::Global}; +/// let v = vec![in Global; 1; 3]; +/// assert_eq!(v, [1, 1, 1]); +/// ``` +/// +/// Note that unlike array expressions this syntax supports all elements +/// which implement [`Clone`] and the number of elements doesn't have to be +/// a constant. +/// +/// This will use `clone` to duplicate an expression, so one should be careful +/// using this with types having a nonstandard `Clone` implementation. For +/// example, `vec![Rc::new(1); 5]` will create a vector of five references +/// to the same boxed integer value, not five references pointing to independently +/// boxed integers. +/// +/// Also, note that `vec![expr; 0]` is allowed, and produces an empty vector. +/// This will still evaluate `expr`, however, and immediately drop the resulting value, so +/// be mindful of side effects. +/// +/// [`Vec`]: crate::vec::Vec +#[cfg(not(no_global_oom_handling))] +#[macro_export] +macro_rules! vec { + (in $alloc:expr $(;)?) => ( + $crate::vec::Vec::new() + ); + (in $alloc:expr; $elem:expr; $n:expr) => ( + $crate::vec::from_elem_in($elem, $n, $alloc) + ); + (in $alloc:expr; $($x:expr),+ $(,)?) => ( + $crate::boxed::Box::<[_]>::into_vec( + $crate::boxed::Box::slice( + $crate::boxed::Box::new_in([$($x),+], $alloc) + ) + ) + ); + () => ( + $crate::vec::Vec::new() + ); + ($elem:expr; $n:expr) => ( + $crate::vec::from_elem($elem, $n) + ); + ($($x:expr),+ $(,)?) => ( + $crate::boxed::Box::<[_]>::into_vec( + $crate::boxed::Box::slice( + $crate::boxed::Box::new([$($x),+]) + ) + ) + ); +} diff -Nru temporalio-1.3.0/vendor/allocator-api2/src/stable/mod.rs temporalio-1.3.0/vendor/allocator-api2/src/stable/mod.rs --- temporalio-1.3.0/vendor/allocator-api2/src/stable/mod.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/allocator-api2/src/stable/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,62 @@ +#![deny(unsafe_op_in_unsafe_fn)] +#![allow(clippy::needless_doctest_main, clippy::partialeq_ne_impl)] + +#[cfg(feature = "alloc")] +pub use self::slice::SliceExt; + +pub mod alloc; + +#[cfg(feature = "alloc")] +pub mod boxed; + +#[cfg(feature = "alloc")] +mod raw_vec; + +#[cfg(feature = "alloc")] +pub mod vec; + +#[cfg(feature = "alloc")] +mod macros; + +#[cfg(feature = "alloc")] +mod slice; + +#[cfg(feature = "alloc")] +#[track_caller] +#[inline(always)] +#[cfg(debug_assertions)] +unsafe fn assume(v: bool) { + if !v { + core::unreachable!() + } +} + +#[cfg(feature = "alloc")] +#[track_caller] +#[inline(always)] +#[cfg(not(debug_assertions))] +unsafe fn assume(v: bool) { + if !v { + unsafe { + core::hint::unreachable_unchecked(); + } + } +} + +#[cfg(feature = "alloc")] +#[inline(always)] +fn addr(x: *const T) -> usize { + #[allow(clippy::useless_transmute, clippy::transmutes_expressible_as_ptr_casts)] + unsafe { + core::mem::transmute(x) + } +} + +#[cfg(feature = "alloc")] +#[inline(always)] +fn invalid_mut(addr: usize) -> *mut T { + #[allow(clippy::useless_transmute, clippy::transmutes_expressible_as_ptr_casts)] + unsafe { + core::mem::transmute(addr) + } +} diff -Nru temporalio-1.3.0/vendor/allocator-api2/src/stable/raw_vec.rs temporalio-1.3.0/vendor/allocator-api2/src/stable/raw_vec.rs --- temporalio-1.3.0/vendor/allocator-api2/src/stable/raw_vec.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/allocator-api2/src/stable/raw_vec.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,642 @@ +use core::alloc::LayoutError; +use core::mem::{self, ManuallyDrop, MaybeUninit}; +use core::ops::Drop; +use core::ptr::{self, NonNull}; +use core::slice; +use core::{cmp, fmt}; + +use super::{ + alloc::{Allocator, Global, Layout}, + assume, + boxed::Box, +}; + +#[cfg(not(no_global_oom_handling))] +use super::alloc::handle_alloc_error; + +/// The error type for `try_reserve` methods. +#[derive(Clone, PartialEq, Eq, Debug)] +pub struct TryReserveError { + kind: TryReserveErrorKind, +} + +impl TryReserveError { + /// Details about the allocation that caused the error + pub fn kind(&self) -> TryReserveErrorKind { + self.kind.clone() + } +} + +/// Details of the allocation that caused a `TryReserveError` +#[derive(Clone, PartialEq, Eq, Debug)] +pub enum TryReserveErrorKind { + /// Error due to the computed capacity exceeding the collection's maximum + /// (usually `isize::MAX` bytes). + CapacityOverflow, + + /// The memory allocator returned an error + AllocError { + /// The layout of allocation request that failed + layout: Layout, + + #[doc(hidden)] + non_exhaustive: (), + }, +} + +use TryReserveErrorKind::*; + +impl From for TryReserveError { + #[inline(always)] + fn from(kind: TryReserveErrorKind) -> Self { + Self { kind } + } +} + +impl From for TryReserveErrorKind { + /// Always evaluates to [`TryReserveErrorKind::CapacityOverflow`]. + #[inline(always)] + fn from(_: LayoutError) -> Self { + TryReserveErrorKind::CapacityOverflow + } +} + +impl fmt::Display for TryReserveError { + fn fmt( + &self, + fmt: &mut core::fmt::Formatter<'_>, + ) -> core::result::Result<(), core::fmt::Error> { + fmt.write_str("memory allocation failed")?; + let reason = match self.kind { + TryReserveErrorKind::CapacityOverflow => { + " because the computed capacity exceeded the collection's maximum" + } + TryReserveErrorKind::AllocError { .. } => { + " because the memory allocator returned an error" + } + }; + fmt.write_str(reason) + } +} + +#[cfg(feature = "std")] +impl std::error::Error for TryReserveError {} + +#[cfg(not(no_global_oom_handling))] +enum AllocInit { + /// The contents of the new memory are uninitialized. + Uninitialized, + /// The new memory is guaranteed to be zeroed. + Zeroed, +} + +/// A low-level utility for more ergonomically allocating, reallocating, and deallocating +/// a buffer of memory on the heap without having to worry about all the corner cases +/// involved. This type is excellent for building your own data structures like Vec and VecDeque. +/// In particular: +/// +/// * Produces `NonNull::dangling()` on zero-sized types. +/// * Produces `NonNull::dangling()` on zero-length allocations. +/// * Avoids freeing `NonNull::dangling()`. +/// * Catches all overflows in capacity computations (promotes them to "capacity overflow" panics). +/// * Guards against 32-bit systems allocating more than isize::MAX bytes. +/// * Guards against overflowing your length. +/// * Calls `handle_alloc_error` for fallible allocations. +/// * Contains a `ptr::NonNull` and thus endows the user with all related benefits. +/// * Uses the excess returned from the allocator to use the largest available capacity. +/// +/// This type does not in anyway inspect the memory that it manages. When dropped it *will* +/// free its memory, but it *won't* try to drop its contents. It is up to the user of `RawVec` +/// to handle the actual things *stored* inside of a `RawVec`. +/// +/// Note that the excess of a zero-sized types is always infinite, so `capacity()` always returns +/// `usize::MAX`. This means that you need to be careful when round-tripping this type with a +/// `Box<[T]>`, since `capacity()` won't yield the length. +#[allow(missing_debug_implementations)] +pub(crate) struct RawVec { + ptr: NonNull, + cap: usize, + alloc: A, +} + +// Safety: RawVec owns both T and A, so sending is safe if +// sending is safe for T and A. +unsafe impl Send for RawVec +where + T: Send, + A: Send, +{ +} + +// Safety: RawVec owns both T and A, so sharing is safe if +// sharing is safe for T and A. +unsafe impl Sync for RawVec +where + T: Sync, + A: Sync, +{ +} + +impl RawVec { + /// Creates the biggest possible `RawVec` (on the system heap) + /// without allocating. If `T` has positive size, then this makes a + /// `RawVec` with capacity `0`. If `T` is zero-sized, then it makes a + /// `RawVec` with capacity `usize::MAX`. Useful for implementing + /// delayed allocation. + #[must_use] + pub const fn new() -> Self { + Self::new_in(Global) + } + + /// Creates a `RawVec` (on the system heap) with exactly the + /// capacity and alignment requirements for a `[T; capacity]`. This is + /// equivalent to calling `RawVec::new` when `capacity` is `0` or `T` is + /// zero-sized. Note that if `T` is zero-sized this means you will + /// *not* get a `RawVec` with the requested capacity. + /// + /// # Panics + /// + /// Panics if the requested capacity exceeds `isize::MAX` bytes. + /// + /// # Aborts + /// + /// Aborts on OOM. + #[cfg(not(no_global_oom_handling))] + #[must_use] + #[inline(always)] + pub fn with_capacity(capacity: usize) -> Self { + Self::with_capacity_in(capacity, Global) + } + + /// Like `with_capacity`, but guarantees the buffer is zeroed. + #[cfg(not(no_global_oom_handling))] + #[must_use] + #[inline(always)] + pub fn with_capacity_zeroed(capacity: usize) -> Self { + Self::with_capacity_zeroed_in(capacity, Global) + } +} + +impl RawVec { + // Tiny Vecs are dumb. Skip to: + // - 8 if the element size is 1, because any heap allocators is likely + // to round up a request of less than 8 bytes to at least 8 bytes. + // - 4 if elements are moderate-sized (<= 1 KiB). + // - 1 otherwise, to avoid wasting too much space for very short Vecs. + pub(crate) const MIN_NON_ZERO_CAP: usize = if mem::size_of::() == 1 { + 8 + } else if mem::size_of::() <= 1024 { + 4 + } else { + 1 + }; + + /// Like `new`, but parameterized over the choice of allocator for + /// the returned `RawVec`. + #[inline(always)] + pub const fn new_in(alloc: A) -> Self { + // `cap: 0` means "unallocated". zero-sized types are ignored. + Self { + ptr: NonNull::dangling(), + cap: 0, + alloc, + } + } + + /// Like `with_capacity`, but parameterized over the choice of + /// allocator for the returned `RawVec`. + #[cfg(not(no_global_oom_handling))] + #[inline(always)] + pub fn with_capacity_in(capacity: usize, alloc: A) -> Self { + Self::allocate_in(capacity, AllocInit::Uninitialized, alloc) + } + + /// Like `with_capacity_zeroed`, but parameterized over the choice + /// of allocator for the returned `RawVec`. + #[cfg(not(no_global_oom_handling))] + #[inline(always)] + pub fn with_capacity_zeroed_in(capacity: usize, alloc: A) -> Self { + Self::allocate_in(capacity, AllocInit::Zeroed, alloc) + } + + /// Converts the entire buffer into `Box<[MaybeUninit]>` with the specified `len`. + /// + /// Note that this will correctly reconstitute any `cap` changes + /// that may have been performed. (See description of type for details.) + /// + /// # Safety + /// + /// * `len` must be greater than or equal to the most recently requested capacity, and + /// * `len` must be less than or equal to `self.capacity()`. + /// + /// Note, that the requested capacity and `self.capacity()` could differ, as + /// an allocator could overallocate and return a greater memory block than requested. + #[inline(always)] + pub unsafe fn into_box(self, len: usize) -> Box<[MaybeUninit], A> { + // Sanity-check one half of the safety requirement (we cannot check the other half). + debug_assert!( + len <= self.capacity(), + "`len` must be smaller than or equal to `self.capacity()`" + ); + + let me = ManuallyDrop::new(self); + unsafe { + let slice = slice::from_raw_parts_mut(me.ptr() as *mut MaybeUninit, len); + Box::from_raw_in(slice, ptr::read(&me.alloc)) + } + } + + #[cfg(not(no_global_oom_handling))] + #[inline(always)] + fn allocate_in(capacity: usize, init: AllocInit, alloc: A) -> Self { + // Don't allocate here because `Drop` will not deallocate when `capacity` is 0. + if mem::size_of::() == 0 || capacity == 0 { + Self::new_in(alloc) + } else { + // We avoid `unwrap_or_else` here because it bloats the amount of + // LLVM IR generated. + let layout = match Layout::array::(capacity) { + Ok(layout) => layout, + Err(_) => capacity_overflow(), + }; + match alloc_guard(layout.size()) { + Ok(_) => {} + Err(_) => capacity_overflow(), + } + let result = match init { + AllocInit::Uninitialized => alloc.allocate(layout), + AllocInit::Zeroed => alloc.allocate_zeroed(layout), + }; + let ptr = match result { + Ok(ptr) => ptr, + Err(_) => handle_alloc_error(layout), + }; + + // Allocators currently return a `NonNull<[u8]>` whose length + // matches the size requested. If that ever changes, the capacity + // here should change to `ptr.len() / mem::size_of::()`. + Self { + ptr: unsafe { NonNull::new_unchecked(ptr.cast().as_ptr()) }, + cap: capacity, + alloc, + } + } + } + + /// Reconstitutes a `RawVec` from a pointer, capacity, and allocator. + /// + /// # Safety + /// + /// The `ptr` must be allocated (via the given allocator `alloc`), and with the given + /// `capacity`. + /// The `capacity` cannot exceed `isize::MAX` for sized types. (only a concern on 32-bit + /// systems). ZST vectors may have a capacity up to `usize::MAX`. + /// If the `ptr` and `capacity` come from a `RawVec` created via `alloc`, then this is + /// guaranteed. + #[inline(always)] + pub unsafe fn from_raw_parts_in(ptr: *mut T, capacity: usize, alloc: A) -> Self { + Self { + ptr: unsafe { NonNull::new_unchecked(ptr) }, + cap: capacity, + alloc, + } + } + + /// Gets a raw pointer to the start of the allocation. Note that this is + /// `NonNull::dangling()` if `capacity == 0` or `T` is zero-sized. In the former case, you must + /// be careful. + #[inline(always)] + pub fn ptr(&self) -> *mut T { + self.ptr.as_ptr() + } + + /// Gets the capacity of the allocation. + /// + /// This will always be `usize::MAX` if `T` is zero-sized. + #[inline(always)] + pub fn capacity(&self) -> usize { + if mem::size_of::() == 0 { + usize::MAX + } else { + self.cap + } + } + + /// Returns a shared reference to the allocator backing this `RawVec`. + #[inline(always)] + pub fn allocator(&self) -> &A { + &self.alloc + } + + #[inline(always)] + fn current_memory(&self) -> Option<(NonNull, Layout)> { + if mem::size_of::() == 0 || self.cap == 0 { + None + } else { + // We have an allocated chunk of memory, so we can bypass runtime + // checks to get our current layout. + unsafe { + let layout = Layout::array::(self.cap).unwrap_unchecked(); + Some((self.ptr.cast(), layout)) + } + } + } + + /// Ensures that the buffer contains at least enough space to hold `len + + /// additional` elements. If it doesn't already have enough capacity, will + /// reallocate enough space plus comfortable slack space to get amortized + /// *O*(1) behavior. Will limit this behavior if it would needlessly cause + /// itself to panic. + /// + /// If `len` exceeds `self.capacity()`, this may fail to actually allocate + /// the requested space. This is not really unsafe, but the unsafe + /// code *you* write that relies on the behavior of this function may break. + /// + /// This is ideal for implementing a bulk-push operation like `extend`. + /// + /// # Panics + /// + /// Panics if the new capacity exceeds `isize::MAX` bytes. + /// + /// # Aborts + /// + /// Aborts on OOM. + #[cfg(not(no_global_oom_handling))] + #[inline(always)] + pub fn reserve(&mut self, len: usize, additional: usize) { + // Callers expect this function to be very cheap when there is already sufficient capacity. + // Therefore, we move all the resizing and error-handling logic from grow_amortized and + // handle_reserve behind a call, while making sure that this function is likely to be + // inlined as just a comparison and a call if the comparison fails. + #[cold] + #[inline(always)] + fn do_reserve_and_handle( + slf: &mut RawVec, + len: usize, + additional: usize, + ) { + handle_reserve(slf.grow_amortized(len, additional)); + } + + if self.needs_to_grow(len, additional) { + do_reserve_and_handle(self, len, additional); + } + } + + /// A specialized version of `reserve()` used only by the hot and + /// oft-instantiated `Vec::push()`, which does its own capacity check. + #[cfg(not(no_global_oom_handling))] + #[inline(always)] + pub fn reserve_for_push(&mut self, len: usize) { + handle_reserve(self.grow_amortized(len, 1)); + } + + /// The same as `reserve`, but returns on errors instead of panicking or aborting. + #[inline(always)] + pub fn try_reserve(&mut self, len: usize, additional: usize) -> Result<(), TryReserveError> { + if self.needs_to_grow(len, additional) { + self.grow_amortized(len, additional) + } else { + Ok(()) + } + } + + /// Ensures that the buffer contains at least enough space to hold `len + + /// additional` elements. If it doesn't already, will reallocate the + /// minimum possible amount of memory necessary. Generally this will be + /// exactly the amount of memory necessary, but in principle the allocator + /// is free to give back more than we asked for. + /// + /// If `len` exceeds `self.capacity()`, this may fail to actually allocate + /// the requested space. This is not really unsafe, but the unsafe code + /// *you* write that relies on the behavior of this function may break. + /// + /// # Panics + /// + /// Panics if the new capacity exceeds `isize::MAX` bytes. + /// + /// # Aborts + /// + /// Aborts on OOM. + #[cfg(not(no_global_oom_handling))] + #[inline(always)] + pub fn reserve_exact(&mut self, len: usize, additional: usize) { + handle_reserve(self.try_reserve_exact(len, additional)); + } + + /// The same as `reserve_exact`, but returns on errors instead of panicking or aborting. + #[inline(always)] + pub fn try_reserve_exact( + &mut self, + len: usize, + additional: usize, + ) -> Result<(), TryReserveError> { + if self.needs_to_grow(len, additional) { + self.grow_exact(len, additional) + } else { + Ok(()) + } + } + + /// Shrinks the buffer down to the specified capacity. If the given amount + /// is 0, actually completely deallocates. + /// + /// # Panics + /// + /// Panics if the given amount is *larger* than the current capacity. + /// + /// # Aborts + /// + /// Aborts on OOM. + #[cfg(not(no_global_oom_handling))] + #[inline(always)] + pub fn shrink_to_fit(&mut self, cap: usize) { + handle_reserve(self.shrink(cap)); + } +} + +impl RawVec { + /// Returns if the buffer needs to grow to fulfill the needed extra capacity. + /// Mainly used to make inlining reserve-calls possible without inlining `grow`. + #[inline(always)] + fn needs_to_grow(&self, len: usize, additional: usize) -> bool { + additional > self.capacity().wrapping_sub(len) + } + + #[inline(always)] + fn set_ptr_and_cap(&mut self, ptr: NonNull<[u8]>, cap: usize) { + // Allocators currently return a `NonNull<[u8]>` whose length matches + // the size requested. If that ever changes, the capacity here should + // change to `ptr.len() / mem::size_of::()`. + self.ptr = unsafe { NonNull::new_unchecked(ptr.cast().as_ptr()) }; + self.cap = cap; + } + + // This method is usually instantiated many times. So we want it to be as + // small as possible, to improve compile times. But we also want as much of + // its contents to be statically computable as possible, to make the + // generated code run faster. Therefore, this method is carefully written + // so that all of the code that depends on `T` is within it, while as much + // of the code that doesn't depend on `T` as possible is in functions that + // are non-generic over `T`. + #[inline(always)] + fn grow_amortized(&mut self, len: usize, additional: usize) -> Result<(), TryReserveError> { + // This is ensured by the calling contexts. + debug_assert!(additional > 0); + + if mem::size_of::() == 0 { + // Since we return a capacity of `usize::MAX` when `elem_size` is + // 0, getting to here necessarily means the `RawVec` is overfull. + return Err(CapacityOverflow.into()); + } + + // Nothing we can really do about these checks, sadly. + let required_cap = len.checked_add(additional).ok_or(CapacityOverflow)?; + + // This guarantees exponential growth. The doubling cannot overflow + // because `cap <= isize::MAX` and the type of `cap` is `usize`. + let cap = cmp::max(self.cap * 2, required_cap); + let cap = cmp::max(Self::MIN_NON_ZERO_CAP, cap); + + let new_layout = Layout::array::(cap); + + // `finish_grow` is non-generic over `T`. + let ptr = finish_grow(new_layout, self.current_memory(), &mut self.alloc)?; + self.set_ptr_and_cap(ptr, cap); + Ok(()) + } + + // The constraints on this method are much the same as those on + // `grow_amortized`, but this method is usually instantiated less often so + // it's less critical. + #[inline(always)] + fn grow_exact(&mut self, len: usize, additional: usize) -> Result<(), TryReserveError> { + if mem::size_of::() == 0 { + // Since we return a capacity of `usize::MAX` when the type size is + // 0, getting to here necessarily means the `RawVec` is overfull. + return Err(CapacityOverflow.into()); + } + + let cap = len.checked_add(additional).ok_or(CapacityOverflow)?; + let new_layout = Layout::array::(cap); + + // `finish_grow` is non-generic over `T`. + let ptr = finish_grow(new_layout, self.current_memory(), &mut self.alloc)?; + self.set_ptr_and_cap(ptr, cap); + Ok(()) + } + + #[cfg(not(no_global_oom_handling))] + #[inline(always)] + fn shrink(&mut self, cap: usize) -> Result<(), TryReserveError> { + assert!( + cap <= self.capacity(), + "Tried to shrink to a larger capacity" + ); + + let (ptr, layout) = if let Some(mem) = self.current_memory() { + mem + } else { + return Ok(()); + }; + + let ptr = unsafe { + // `Layout::array` cannot overflow here because it would have + // overflowed earlier when capacity was larger. + let new_layout = Layout::array::(cap).unwrap_unchecked(); + self.alloc + .shrink(ptr, layout, new_layout) + .map_err(|_| AllocError { + layout: new_layout, + non_exhaustive: (), + })? + }; + self.set_ptr_and_cap(ptr, cap); + Ok(()) + } +} + +// This function is outside `RawVec` to minimize compile times. See the comment +// above `RawVec::grow_amortized` for details. (The `A` parameter isn't +// significant, because the number of different `A` types seen in practice is +// much smaller than the number of `T` types.) +#[inline(always)] +fn finish_grow( + new_layout: Result, + current_memory: Option<(NonNull, Layout)>, + alloc: &mut A, +) -> Result, TryReserveError> +where + A: Allocator, +{ + // Check for the error here to minimize the size of `RawVec::grow_*`. + let new_layout = new_layout.map_err(|_| CapacityOverflow)?; + + alloc_guard(new_layout.size())?; + + let memory = if let Some((ptr, old_layout)) = current_memory { + debug_assert_eq!(old_layout.align(), new_layout.align()); + unsafe { + // The allocator checks for alignment equality + assume(old_layout.align() == new_layout.align()); + alloc.grow(ptr, old_layout, new_layout) + } + } else { + alloc.allocate(new_layout) + }; + + memory.map_err(|_| { + AllocError { + layout: new_layout, + non_exhaustive: (), + } + .into() + }) +} + +impl Drop for RawVec { + /// Frees the memory owned by the `RawVec` *without* trying to drop its contents. + #[inline(always)] + fn drop(&mut self) { + if let Some((ptr, layout)) = self.current_memory() { + unsafe { self.alloc.deallocate(ptr, layout) } + } + } +} + +// Central function for reserve error handling. +#[cfg(not(no_global_oom_handling))] +#[inline(always)] +fn handle_reserve(result: Result<(), TryReserveError>) { + match result.map_err(|e| e.kind()) { + Err(CapacityOverflow) => capacity_overflow(), + Err(AllocError { layout, .. }) => handle_alloc_error(layout), + Ok(()) => { /* yay */ } + } +} + +// We need to guarantee the following: +// * We don't ever allocate `> isize::MAX` byte-size objects. +// * We don't overflow `usize::MAX` and actually allocate too little. +// +// On 64-bit we just need to check for overflow since trying to allocate +// `> isize::MAX` bytes will surely fail. On 32-bit and 16-bit we need to add +// an extra guard for this in case we're running on a platform which can use +// all 4GB in user-space, e.g., PAE or x32. + +#[inline(always)] +fn alloc_guard(alloc_size: usize) -> Result<(), TryReserveError> { + if usize::BITS < 64 && alloc_size > isize::MAX as usize { + Err(CapacityOverflow.into()) + } else { + Ok(()) + } +} + +// One central function responsible for reporting capacity overflows. This'll +// ensure that the code generation related to these panics is minimal as there's +// only one location which panics rather than a bunch throughout the module. +#[cfg(not(no_global_oom_handling))] +fn capacity_overflow() -> ! { + panic!("capacity overflow"); +} diff -Nru temporalio-1.3.0/vendor/allocator-api2/src/stable/slice.rs temporalio-1.3.0/vendor/allocator-api2/src/stable/slice.rs --- temporalio-1.3.0/vendor/allocator-api2/src/stable/slice.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/allocator-api2/src/stable/slice.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,171 @@ +use crate::{ + alloc::{Allocator, Global}, + vec::Vec, +}; + +/// Slice methods that use `Box` and `Vec` from this crate. +pub trait SliceExt { + /// Copies `self` into a new `Vec`. + /// + /// # Examples + /// + /// ``` + /// let s = [10, 40, 30]; + /// let x = s.to_vec(); + /// // Here, `s` and `x` can be modified independently. + /// ``` + #[cfg(not(no_global_oom_handling))] + #[inline(always)] + fn to_vec(&self) -> Vec + where + T: Clone, + { + self.to_vec_in(Global) + } + + /// Copies `self` into a new `Vec` with an allocator. + /// + /// # Examples + /// + /// ``` + /// #![feature(allocator_api)] + /// + /// use std::alloc::System; + /// + /// let s = [10, 40, 30]; + /// let x = s.to_vec_in(System); + /// // Here, `s` and `x` can be modified independently. + /// ``` + #[cfg(not(no_global_oom_handling))] + fn to_vec_in(&self, alloc: A) -> Vec + where + T: Clone; + + /// Creates a vector by copying a slice `n` times. + /// + /// # Panics + /// + /// This function will panic if the capacity would overflow. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// assert_eq!([1, 2].repeat(3), vec![1, 2, 1, 2, 1, 2]); + /// ``` + /// + /// A panic upon overflow: + /// + /// ```should_panic + /// // this will panic at runtime + /// b"0123456789abcdef".repeat(usize::MAX); + /// ``` + fn repeat(&self, n: usize) -> Vec + where + T: Copy; +} + +impl SliceExt for [T] { + #[cfg(not(no_global_oom_handling))] + #[inline] + fn to_vec_in(&self, alloc: A) -> Vec + where + T: Clone, + { + struct DropGuard<'a, T, A: Allocator> { + vec: &'a mut Vec, + num_init: usize, + } + impl<'a, T, A: Allocator> Drop for DropGuard<'a, T, A> { + #[inline] + fn drop(&mut self) { + // SAFETY: + // items were marked initialized in the loop below + unsafe { + self.vec.set_len(self.num_init); + } + } + } + + let mut vec = Vec::with_capacity_in(self.len(), alloc); + let mut guard = DropGuard { + vec: &mut vec, + num_init: 0, + }; + let slots = guard.vec.spare_capacity_mut(); + // .take(slots.len()) is necessary for LLVM to remove bounds checks + // and has better codegen than zip. + for (i, b) in self.iter().enumerate().take(slots.len()) { + guard.num_init = i; + slots[i].write(b.clone()); + } + core::mem::forget(guard); + // SAFETY: + // the vec was allocated and initialized above to at least this length. + unsafe { + vec.set_len(self.len()); + } + vec + } + + #[cfg(not(no_global_oom_handling))] + #[inline] + fn repeat(&self, n: usize) -> Vec + where + T: Copy, + { + if n == 0 { + return Vec::new(); + } + + // If `n` is larger than zero, it can be split as + // `n = 2^expn + rem (2^expn > rem, expn >= 0, rem >= 0)`. + // `2^expn` is the number represented by the leftmost '1' bit of `n`, + // and `rem` is the remaining part of `n`. + + // Using `Vec` to access `set_len()`. + let capacity = self.len().checked_mul(n).expect("capacity overflow"); + let mut buf = Vec::with_capacity(capacity); + + // `2^expn` repetition is done by doubling `buf` `expn`-times. + buf.extend(self); + { + let mut m = n >> 1; + // If `m > 0`, there are remaining bits up to the leftmost '1'. + while m > 0 { + // `buf.extend(buf)`: + unsafe { + core::ptr::copy_nonoverlapping( + buf.as_ptr(), + (buf.as_mut_ptr() as *mut T).add(buf.len()), + buf.len(), + ); + // `buf` has capacity of `self.len() * n`. + let buf_len = buf.len(); + buf.set_len(buf_len * 2); + } + + m >>= 1; + } + } + + // `rem` (`= n - 2^expn`) repetition is done by copying + // first `rem` repetitions from `buf` itself. + let rem_len = capacity - buf.len(); // `self.len() * rem` + if rem_len > 0 { + // `buf.extend(buf[0 .. rem_len])`: + unsafe { + // This is non-overlapping since `2^expn > rem`. + core::ptr::copy_nonoverlapping( + buf.as_ptr(), + (buf.as_mut_ptr() as *mut T).add(buf.len()), + rem_len, + ); + // `buf.len() + rem_len` equals to `buf.capacity()` (`= self.len() * n`). + buf.set_len(capacity); + } + } + buf + } +} diff -Nru temporalio-1.3.0/vendor/allocator-api2/src/stable/vec/drain.rs temporalio-1.3.0/vendor/allocator-api2/src/stable/vec/drain.rs --- temporalio-1.3.0/vendor/allocator-api2/src/stable/vec/drain.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/allocator-api2/src/stable/vec/drain.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,242 @@ +use core::fmt; +use core::iter::FusedIterator; +use core::mem::{self, size_of, ManuallyDrop}; +use core::ptr::{self, NonNull}; +use core::slice::{self}; + +use crate::stable::alloc::{Allocator, Global}; + +use super::Vec; + +/// A draining iterator for `Vec`. +/// +/// This `struct` is created by [`Vec::drain`]. +/// See its documentation for more. +/// +/// # Example +/// +/// ``` +/// let mut v = vec![0, 1, 2]; +/// let iter: std::vec::Drain<_> = v.drain(..); +/// ``` +pub struct Drain<'a, T: 'a, A: Allocator + 'a = Global> { + /// Index of tail to preserve + pub(super) tail_start: usize, + /// Length of tail + pub(super) tail_len: usize, + /// Current remaining range to remove + pub(super) iter: slice::Iter<'a, T>, + pub(super) vec: NonNull>, +} + +impl fmt::Debug for Drain<'_, T, A> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_tuple("Drain").field(&self.iter.as_slice()).finish() + } +} + +impl<'a, T, A: Allocator> Drain<'a, T, A> { + /// Returns the remaining items of this iterator as a slice. + /// + /// # Examples + /// + /// ``` + /// let mut vec = vec!['a', 'b', 'c']; + /// let mut drain = vec.drain(..); + /// assert_eq!(drain.as_slice(), &['a', 'b', 'c']); + /// let _ = drain.next().unwrap(); + /// assert_eq!(drain.as_slice(), &['b', 'c']); + /// ``` + #[must_use] + #[inline(always)] + pub fn as_slice(&self) -> &[T] { + self.iter.as_slice() + } + + /// Returns a reference to the underlying allocator. + #[must_use] + #[inline(always)] + pub fn allocator(&self) -> &A { + unsafe { self.vec.as_ref().allocator() } + } + + /// Keep unyielded elements in the source `Vec`. + /// + /// # Examples + /// + /// ``` + /// #![feature(drain_keep_rest)] + /// + /// let mut vec = vec!['a', 'b', 'c']; + /// let mut drain = vec.drain(..); + /// + /// assert_eq!(drain.next().unwrap(), 'a'); + /// + /// // This call keeps 'b' and 'c' in the vec. + /// drain.keep_rest(); + /// + /// // If we wouldn't call `keep_rest()`, + /// // `vec` would be empty. + /// assert_eq!(vec, ['b', 'c']); + /// ``` + #[inline(always)] + pub fn keep_rest(self) { + // At this moment layout looks like this: + // + // [head] [yielded by next] [unyielded] [yielded by next_back] [tail] + // ^-- start \_________/-- unyielded_len \____/-- self.tail_len + // ^-- unyielded_ptr ^-- tail + // + // Normally `Drop` impl would drop [unyielded] and then move [tail] to the `start`. + // Here we want to + // 1. Move [unyielded] to `start` + // 2. Move [tail] to a new start at `start + len(unyielded)` + // 3. Update length of the original vec to `len(head) + len(unyielded) + len(tail)` + // a. In case of ZST, this is the only thing we want to do + // 4. Do *not* drop self, as everything is put in a consistent state already, there is nothing to do + let mut this = ManuallyDrop::new(self); + + unsafe { + let source_vec = this.vec.as_mut(); + + let start = source_vec.len(); + let tail = this.tail_start; + + let unyielded_len = this.iter.len(); + let unyielded_ptr = this.iter.as_slice().as_ptr(); + + // ZSTs have no identity, so we don't need to move them around. + let needs_move = mem::size_of::() != 0; + + if needs_move { + let start_ptr = source_vec.as_mut_ptr().add(start); + + // memmove back unyielded elements + if unyielded_ptr != start_ptr { + let src = unyielded_ptr; + let dst = start_ptr; + + ptr::copy(src, dst, unyielded_len); + } + + // memmove back untouched tail + if tail != (start + unyielded_len) { + let src = source_vec.as_ptr().add(tail); + let dst = start_ptr.add(unyielded_len); + ptr::copy(src, dst, this.tail_len); + } + } + + source_vec.set_len(start + unyielded_len + this.tail_len); + } + } +} + +impl<'a, T, A: Allocator> AsRef<[T]> for Drain<'a, T, A> { + #[inline(always)] + fn as_ref(&self) -> &[T] { + self.as_slice() + } +} + +unsafe impl Sync for Drain<'_, T, A> {} + +unsafe impl Send for Drain<'_, T, A> {} + +impl Iterator for Drain<'_, T, A> { + type Item = T; + + #[inline(always)] + fn next(&mut self) -> Option { + self.iter + .next() + .map(|elt| unsafe { ptr::read(elt as *const _) }) + } + + #[inline(always)] + fn size_hint(&self) -> (usize, Option) { + self.iter.size_hint() + } +} + +impl DoubleEndedIterator for Drain<'_, T, A> { + #[inline(always)] + fn next_back(&mut self) -> Option { + self.iter + .next_back() + .map(|elt| unsafe { ptr::read(elt as *const _) }) + } +} + +impl Drop for Drain<'_, T, A> { + #[inline] + fn drop(&mut self) { + /// Moves back the un-`Drain`ed elements to restore the original `Vec`. + struct DropGuard<'r, 'a, T, A: Allocator>(&'r mut Drain<'a, T, A>); + + impl<'r, 'a, T, A: Allocator> Drop for DropGuard<'r, 'a, T, A> { + fn drop(&mut self) { + if self.0.tail_len > 0 { + unsafe { + let source_vec = self.0.vec.as_mut(); + // memmove back untouched tail, update to new length + let start = source_vec.len(); + let tail = self.0.tail_start; + if tail != start { + let src = source_vec.as_ptr().add(tail); + let dst = source_vec.as_mut_ptr().add(start); + ptr::copy(src, dst, self.0.tail_len); + } + source_vec.set_len(start + self.0.tail_len); + } + } + } + } + + let iter = mem::replace(&mut self.iter, [].iter()); + let drop_len = iter.len(); + + let mut vec = self.vec; + + if size_of::() == 0 { + // ZSTs have no identity, so we don't need to move them around, we only need to drop the correct amount. + // this can be achieved by manipulating the Vec length instead of moving values out from `iter`. + unsafe { + let vec = vec.as_mut(); + let old_len = vec.len(); + vec.set_len(old_len + drop_len + self.tail_len); + vec.truncate(old_len + self.tail_len); + } + + return; + } + + // ensure elements are moved back into their appropriate places, even when drop_in_place panics + let _guard = DropGuard(self); + + if drop_len == 0 { + return; + } + + // as_slice() must only be called when iter.len() is > 0 because + // vec::Splice modifies vec::Drain fields and may grow the vec which would invalidate + // the iterator's internal pointers. Creating a reference to deallocated memory + // is invalid even when it is zero-length + let drop_ptr = iter.as_slice().as_ptr(); + + unsafe { + // drop_ptr comes from a slice::Iter which only gives us a &[T] but for drop_in_place + // a pointer with mutable provenance is necessary. Therefore we must reconstruct + // it from the original vec but also avoid creating a &mut to the front since that could + // invalidate raw pointers to it which some unsafe code might rely on. + let vec_ptr = vec.as_mut().as_mut_ptr(); + let drop_offset = drop_ptr.offset_from(vec_ptr) as usize; + let to_drop = ptr::slice_from_raw_parts_mut(vec_ptr.add(drop_offset), drop_len); + ptr::drop_in_place(to_drop); + } + } +} + +impl ExactSizeIterator for Drain<'_, T, A> {} + +impl FusedIterator for Drain<'_, T, A> {} diff -Nru temporalio-1.3.0/vendor/allocator-api2/src/stable/vec/into_iter.rs temporalio-1.3.0/vendor/allocator-api2/src/stable/vec/into_iter.rs --- temporalio-1.3.0/vendor/allocator-api2/src/stable/vec/into_iter.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/allocator-api2/src/stable/vec/into_iter.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,198 @@ +use core::fmt; +use core::iter::FusedIterator; +use core::marker::PhantomData; +use core::mem::{self, size_of, ManuallyDrop}; + +use core::ptr::{self, NonNull}; +use core::slice::{self}; + +use crate::stable::addr; + +use super::{Allocator, Global, RawVec}; + +#[cfg(not(no_global_oom_handling))] +use super::Vec; + +/// An iterator that moves out of a vector. +/// +/// This `struct` is created by the `into_iter` method on [`Vec`](super::Vec) +/// (provided by the [`IntoIterator`] trait). +/// +/// # Example +/// +/// ``` +/// let v = vec![0, 1, 2]; +/// let iter: std::vec::IntoIter<_> = v.into_iter(); +/// ``` +pub struct IntoIter { + pub(super) buf: NonNull, + pub(super) phantom: PhantomData, + pub(super) cap: usize, + // the drop impl reconstructs a RawVec from buf, cap and alloc + // to avoid dropping the allocator twice we need to wrap it into ManuallyDrop + pub(super) alloc: ManuallyDrop, + pub(super) ptr: *const T, + pub(super) end: *const T, +} + +impl fmt::Debug for IntoIter { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_tuple("IntoIter").field(&self.as_slice()).finish() + } +} + +impl IntoIter { + /// Returns the remaining items of this iterator as a slice. + /// + /// # Examples + /// + /// ``` + /// let vec = vec!['a', 'b', 'c']; + /// let mut into_iter = vec.into_iter(); + /// assert_eq!(into_iter.as_slice(), &['a', 'b', 'c']); + /// let _ = into_iter.next().unwrap(); + /// assert_eq!(into_iter.as_slice(), &['b', 'c']); + /// ``` + pub fn as_slice(&self) -> &[T] { + unsafe { slice::from_raw_parts(self.ptr, self.len()) } + } + + /// Returns the remaining items of this iterator as a mutable slice. + /// + /// # Examples + /// + /// ``` + /// let vec = vec!['a', 'b', 'c']; + /// let mut into_iter = vec.into_iter(); + /// assert_eq!(into_iter.as_slice(), &['a', 'b', 'c']); + /// into_iter.as_mut_slice()[2] = 'z'; + /// assert_eq!(into_iter.next().unwrap(), 'a'); + /// assert_eq!(into_iter.next().unwrap(), 'b'); + /// assert_eq!(into_iter.next().unwrap(), 'z'); + /// ``` + pub fn as_mut_slice(&mut self) -> &mut [T] { + unsafe { &mut *self.as_raw_mut_slice() } + } + + /// Returns a reference to the underlying allocator. + #[inline(always)] + pub fn allocator(&self) -> &A { + &self.alloc + } + + fn as_raw_mut_slice(&mut self) -> *mut [T] { + ptr::slice_from_raw_parts_mut(self.ptr as *mut T, self.len()) + } +} + +impl AsRef<[T]> for IntoIter { + fn as_ref(&self) -> &[T] { + self.as_slice() + } +} + +unsafe impl Send for IntoIter {} + +unsafe impl Sync for IntoIter {} + +impl Iterator for IntoIter { + type Item = T; + + #[inline(always)] + fn next(&mut self) -> Option { + if self.ptr == self.end { + None + } else if size_of::() == 0 { + // purposefully don't use 'ptr.offset' because for + // vectors with 0-size elements this would return the + // same pointer. + self.ptr = self.ptr.cast::().wrapping_add(1).cast(); + + // Make up a value of this ZST. + Some(unsafe { mem::zeroed() }) + } else { + let old = self.ptr; + self.ptr = unsafe { self.ptr.add(1) }; + + Some(unsafe { ptr::read(old) }) + } + } + + #[inline(always)] + fn size_hint(&self) -> (usize, Option) { + let exact = if size_of::() == 0 { + addr(self.end).wrapping_sub(addr(self.ptr)) + } else { + unsafe { self.end.offset_from(self.ptr) as usize } + }; + (exact, Some(exact)) + } + + #[inline(always)] + fn count(self) -> usize { + self.len() + } +} + +impl DoubleEndedIterator for IntoIter { + #[inline(always)] + fn next_back(&mut self) -> Option { + if self.end == self.ptr { + None + } else if size_of::() == 0 { + // See above for why 'ptr.offset' isn't used + self.end = self.end.cast::().wrapping_add(1).cast(); + + // Make up a value of this ZST. + Some(unsafe { mem::zeroed() }) + } else { + self.end = unsafe { self.end.sub(1) }; + + Some(unsafe { ptr::read(self.end) }) + } + } +} + +impl ExactSizeIterator for IntoIter {} + +impl FusedIterator for IntoIter {} + +#[doc(hidden)] +pub trait NonDrop {} + +// T: Copy as approximation for !Drop since get_unchecked does not advance self.ptr +// and thus we can't implement drop-handling +impl NonDrop for T {} + +#[cfg(not(no_global_oom_handling))] +impl Clone for IntoIter { + fn clone(&self) -> Self { + let mut vec = Vec::::with_capacity_in(self.len(), (*self.alloc).clone()); + vec.extend(self.as_slice().iter().cloned()); + vec.into_iter() + } +} + +impl Drop for IntoIter { + fn drop(&mut self) { + struct DropGuard<'a, T, A: Allocator>(&'a mut IntoIter); + + impl Drop for DropGuard<'_, T, A> { + fn drop(&mut self) { + unsafe { + // `IntoIter::alloc` is not used anymore after this and will be dropped by RawVec + let alloc = ManuallyDrop::take(&mut self.0.alloc); + // RawVec handles deallocation + let _ = RawVec::from_raw_parts_in(self.0.buf.as_ptr(), self.0.cap, alloc); + } + } + } + + let guard = DropGuard(self); + // destroy the remaining elements + unsafe { + ptr::drop_in_place(guard.0.as_raw_mut_slice()); + } + // now `guard` will be dropped and do the rest + } +} diff -Nru temporalio-1.3.0/vendor/allocator-api2/src/stable/vec/mod.rs temporalio-1.3.0/vendor/allocator-api2/src/stable/vec/mod.rs --- temporalio-1.3.0/vendor/allocator-api2/src/stable/vec/mod.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/allocator-api2/src/stable/vec/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,3253 @@ +//! A contiguous growable array type with heap-allocated contents, written +//! `Vec`. +//! +//! Vectors have *O*(1) indexing, amortized *O*(1) push (to the end) and +//! *O*(1) pop (from the end). +//! +//! Vectors ensure they never allocate more than `isize::MAX` bytes. +//! +//! # Examples +//! +//! You can explicitly create a [`Vec`] with [`Vec::new`]: +//! +//! ``` +//! let v: Vec = Vec::new(); +//! ``` +//! +//! ...or by using the [`vec!`] macro: +//! +//! ``` +//! let v: Vec = vec![]; +//! +//! let v = vec![1, 2, 3, 4, 5]; +//! +//! let v = vec![0; 10]; // ten zeroes +//! ``` +//! +//! You can [`push`] values onto the end of a vector (which will grow the vector +//! as needed): +//! +//! ``` +//! let mut v = vec![1, 2]; +//! +//! v.push(3); +//! ``` +//! +//! Popping values works in much the same way: +//! +//! ``` +//! let mut v = vec![1, 2]; +//! +//! let two = v.pop(); +//! ``` +//! +//! Vectors also support indexing (through the [`Index`] and [`IndexMut`] traits): +//! +//! ``` +//! let mut v = vec![1, 2, 3]; +//! let three = v[2]; +//! v[1] = v[1] + 5; +//! ``` +//! +//! [`push`]: Vec::push + +#[cfg(not(no_global_oom_handling))] +use core::cmp; +use core::cmp::Ordering; +use core::convert::TryFrom; +use core::fmt; +use core::hash::{Hash, Hasher}; +#[cfg(not(no_global_oom_handling))] +use core::iter; +#[cfg(not(no_global_oom_handling))] +use core::iter::FromIterator; +use core::marker::PhantomData; +use core::mem::{self, size_of, ManuallyDrop, MaybeUninit}; +use core::ops::{self, Bound, Index, IndexMut, Range, RangeBounds}; +use core::ptr::{self, NonNull}; +use core::slice::{self, SliceIndex}; + +use super::{ + alloc::{Allocator, Global}, + assume, + boxed::Box, + raw_vec::{RawVec, TryReserveError}, +}; + +#[cfg(not(no_global_oom_handling))] +pub use self::splice::Splice; + +#[cfg(not(no_global_oom_handling))] +mod splice; + +pub use self::drain::Drain; + +mod drain; + +pub use self::into_iter::IntoIter; + +mod into_iter; + +mod partial_eq; + +#[cfg(not(no_global_oom_handling))] +mod set_len_on_drop; + +#[cfg(not(no_global_oom_handling))] +use self::set_len_on_drop::SetLenOnDrop; + +/// A contiguous growable array type, written as `Vec`, short for 'vector'. +/// +/// # Examples +/// +/// ``` +/// let mut vec = Vec::new(); +/// vec.push(1); +/// vec.push(2); +/// +/// assert_eq!(vec.len(), 2); +/// assert_eq!(vec[0], 1); +/// +/// assert_eq!(vec.pop(), Some(2)); +/// assert_eq!(vec.len(), 1); +/// +/// vec[0] = 7; +/// assert_eq!(vec[0], 7); +/// +/// vec.extend([1, 2, 3].iter().copied()); +/// +/// for x in &vec { +/// println!("{x}"); +/// } +/// assert_eq!(vec, [7, 1, 2, 3]); +/// ``` +/// +/// The [`vec!`] macro is provided for convenient initialization: +/// +/// ``` +/// let mut vec1 = vec![1, 2, 3]; +/// vec1.push(4); +/// let vec2 = Vec::from([1, 2, 3, 4]); +/// assert_eq!(vec1, vec2); +/// ``` +/// +/// It can also initialize each element of a `Vec` with a given value. +/// This may be more efficient than performing allocation and initialization +/// in separate steps, especially when initializing a vector of zeros: +/// +/// ``` +/// let vec = vec![0; 5]; +/// assert_eq!(vec, [0, 0, 0, 0, 0]); +/// +/// // The following is equivalent, but potentially slower: +/// let mut vec = Vec::with_capacity(5); +/// vec.resize(5, 0); +/// assert_eq!(vec, [0, 0, 0, 0, 0]); +/// ``` +/// +/// For more information, see +/// [Capacity and Reallocation](#capacity-and-reallocation). +/// +/// Use a `Vec` as an efficient stack: +/// +/// ``` +/// let mut stack = Vec::new(); +/// +/// stack.push(1); +/// stack.push(2); +/// stack.push(3); +/// +/// while let Some(top) = stack.pop() { +/// // Prints 3, 2, 1 +/// println!("{top}"); +/// } +/// ``` +/// +/// # Indexing +/// +/// The `Vec` type allows to access values by index, because it implements the +/// [`Index`] trait. An example will be more explicit: +/// +/// ``` +/// let v = vec![0, 2, 4, 6]; +/// println!("{}", v[1]); // it will display '2' +/// ``` +/// +/// However be careful: if you try to access an index which isn't in the `Vec`, +/// your software will panic! You cannot do this: +/// +/// ```should_panic +/// let v = vec![0, 2, 4, 6]; +/// println!("{}", v[6]); // it will panic! +/// ``` +/// +/// Use [`get`] and [`get_mut`] if you want to check whether the index is in +/// the `Vec`. +/// +/// # Slicing +/// +/// A `Vec` can be mutable. On the other hand, slices are read-only objects. +/// To get a [slice][prim@slice], use [`&`]. Example: +/// +/// ``` +/// fn read_slice(slice: &[usize]) { +/// // ... +/// } +/// +/// let v = vec![0, 1]; +/// read_slice(&v); +/// +/// // ... and that's all! +/// // you can also do it like this: +/// let u: &[usize] = &v; +/// // or like this: +/// let u: &[_] = &v; +/// ``` +/// +/// In Rust, it's more common to pass slices as arguments rather than vectors +/// when you just want to provide read access. The same goes for [`String`] and +/// [`&str`]. +/// +/// # Capacity and reallocation +/// +/// The capacity of a vector is the amount of space allocated for any future +/// elements that will be added onto the vector. This is not to be confused with +/// the *length* of a vector, which specifies the number of actual elements +/// within the vector. If a vector's length exceeds its capacity, its capacity +/// will automatically be increased, but its elements will have to be +/// reallocated. +/// +/// For example, a vector with capacity 10 and length 0 would be an empty vector +/// with space for 10 more elements. Pushing 10 or fewer elements onto the +/// vector will not change its capacity or cause reallocation to occur. However, +/// if the vector's length is increased to 11, it will have to reallocate, which +/// can be slow. For this reason, it is recommended to use [`Vec::with_capacity`] +/// whenever possible to specify how big the vector is expected to get. +/// +/// # Guarantees +/// +/// Due to its incredibly fundamental nature, `Vec` makes a lot of guarantees +/// about its design. This ensures that it's as low-overhead as possible in +/// the general case, and can be correctly manipulated in primitive ways +/// by unsafe code. Note that these guarantees refer to an unqualified `Vec`. +/// If additional type parameters are added (e.g., to support custom allocators), +/// overriding their defaults may change the behavior. +/// +/// Most fundamentally, `Vec` is and always will be a (pointer, capacity, length) +/// triplet. No more, no less. The order of these fields is completely +/// unspecified, and you should use the appropriate methods to modify these. +/// The pointer will never be null, so this type is null-pointer-optimized. +/// +/// However, the pointer might not actually point to allocated memory. In particular, +/// if you construct a `Vec` with capacity 0 via [`Vec::new`], [`vec![]`][`vec!`], +/// [`Vec::with_capacity(0)`][`Vec::with_capacity`], or by calling [`shrink_to_fit`] +/// on an empty Vec, it will not allocate memory. Similarly, if you store zero-sized +/// types inside a `Vec`, it will not allocate space for them. *Note that in this case +/// the `Vec` might not report a [`capacity`] of 0*. `Vec` will allocate if and only +/// if [mem::size_of::\]\() * [capacity]\() > 0. In general, `Vec`'s allocation +/// details are very subtle --- if you intend to allocate memory using a `Vec` +/// and use it for something else (either to pass to unsafe code, or to build your +/// own memory-backed collection), be sure to deallocate this memory by using +/// `from_raw_parts` to recover the `Vec` and then dropping it. +/// +/// If a `Vec` *has* allocated memory, then the memory it points to is on the heap +/// (as defined by the allocator Rust is configured to use by default), and its +/// pointer points to [`len`] initialized, contiguous elements in order (what +/// you would see if you coerced it to a slice), followed by [capacity] - [len] +/// logically uninitialized, contiguous elements. +/// +/// A vector containing the elements `'a'` and `'b'` with capacity 4 can be +/// visualized as below. The top part is the `Vec` struct, it contains a +/// pointer to the head of the allocation in the heap, length and capacity. +/// The bottom part is the allocation on the heap, a contiguous memory block. +/// +/// ```text +/// ptr len capacity +/// +--------+--------+--------+ +/// | 0x0123 | 2 | 4 | +/// +--------+--------+--------+ +/// | +/// v +/// Heap +--------+--------+--------+--------+ +/// | 'a' | 'b' | uninit | uninit | +/// +--------+--------+--------+--------+ +/// ``` +/// +/// - **uninit** represents memory that is not initialized, see [`MaybeUninit`]. +/// - Note: the ABI is not stable and `Vec` makes no guarantees about its memory +/// layout (including the order of fields). +/// +/// `Vec` will never perform a "small optimization" where elements are actually +/// stored on the stack for two reasons: +/// +/// * It would make it more difficult for unsafe code to correctly manipulate +/// a `Vec`. The contents of a `Vec` wouldn't have a stable address if it were +/// only moved, and it would be more difficult to determine if a `Vec` had +/// actually allocated memory. +/// +/// * It would penalize the general case, incurring an additional branch +/// on every access. +/// +/// `Vec` will never automatically shrink itself, even if completely empty. This +/// ensures no unnecessary allocations or deallocations occur. Emptying a `Vec` +/// and then filling it back up to the same [`len`] should incur no calls to +/// the allocator. If you wish to free up unused memory, use +/// [`shrink_to_fit`] or [`shrink_to`]. +/// +/// [`push`] and [`insert`] will never (re)allocate if the reported capacity is +/// sufficient. [`push`] and [`insert`] *will* (re)allocate if +/// [len] == [capacity]. That is, the reported capacity is completely +/// accurate, and can be relied on. It can even be used to manually free the memory +/// allocated by a `Vec` if desired. Bulk insertion methods *may* reallocate, even +/// when not necessary. +/// +/// `Vec` does not guarantee any particular growth strategy when reallocating +/// when full, nor when [`reserve`] is called. The current strategy is basic +/// and it may prove desirable to use a non-constant growth factor. Whatever +/// strategy is used will of course guarantee *O*(1) amortized [`push`]. +/// +/// `vec![x; n]`, `vec![a, b, c, d]`, and +/// [`Vec::with_capacity(n)`][`Vec::with_capacity`], will all produce a `Vec` +/// with exactly the requested capacity. If [len] == [capacity], +/// (as is the case for the [`vec!`] macro), then a `Vec` can be converted to +/// and from a [`Box<[T]>`][owned slice] without reallocating or moving the elements. +/// +/// `Vec` will not specifically overwrite any data that is removed from it, +/// but also won't specifically preserve it. Its uninitialized memory is +/// scratch space that it may use however it wants. It will generally just do +/// whatever is most efficient or otherwise easy to implement. Do not rely on +/// removed data to be erased for security purposes. Even if you drop a `Vec`, its +/// buffer may simply be reused by another allocation. Even if you zero a `Vec`'s memory +/// first, that might not actually happen because the optimizer does not consider +/// this a side-effect that must be preserved. There is one case which we will +/// not break, however: using `unsafe` code to write to the excess capacity, +/// and then increasing the length to match, is always valid. +/// +/// Currently, `Vec` does not guarantee the order in which elements are dropped. +/// The order has changed in the past and may change again. +/// +/// [`get`]: ../../std/vec/struct.Vec.html#method.get +/// [`get_mut`]: ../../std/vec/struct.Vec.html#method.get_mut +/// [`String`]: alloc_crate::string::String +/// [`&str`]: type@str +/// [`shrink_to_fit`]: Vec::shrink_to_fit +/// [`shrink_to`]: Vec::shrink_to +/// [capacity]: Vec::capacity +/// [`capacity`]: Vec::capacity +/// [mem::size_of::\]: core::mem::size_of +/// [len]: Vec::len +/// [`len`]: Vec::len +/// [`push`]: Vec::push +/// [`insert`]: Vec::insert +/// [`reserve`]: Vec::reserve +/// [`MaybeUninit`]: core::mem::MaybeUninit +/// [owned slice]: Box +pub struct Vec { + buf: RawVec, + len: usize, +} + +//////////////////////////////////////////////////////////////////////////////// +// Inherent methods +//////////////////////////////////////////////////////////////////////////////// + +impl Vec { + /// Constructs a new, empty `Vec`. + /// + /// The vector will not allocate until elements are pushed onto it. + /// + /// # Examples + /// + /// ``` + /// # #![allow(unused_mut)] + /// let mut vec: Vec = Vec::new(); + /// ``` + #[inline(always)] + #[must_use] + pub const fn new() -> Self { + Vec { + buf: RawVec::new(), + len: 0, + } + } + + /// Constructs a new, empty `Vec` with at least the specified capacity. + /// + /// The vector will be able to hold at least `capacity` elements without + /// reallocating. This method is allowed to allocate for more elements than + /// `capacity`. If `capacity` is 0, the vector will not allocate. + /// + /// It is important to note that although the returned vector has the + /// minimum *capacity* specified, the vector will have a zero *length*. For + /// an explanation of the difference between length and capacity, see + /// *[Capacity and reallocation]*. + /// + /// If it is important to know the exact allocated capacity of a `Vec`, + /// always use the [`capacity`] method after construction. + /// + /// For `Vec` where `T` is a zero-sized type, there will be no allocation + /// and the capacity will always be `usize::MAX`. + /// + /// [Capacity and reallocation]: #capacity-and-reallocation + /// [`capacity`]: Vec::capacity + /// + /// # Panics + /// + /// Panics if the new capacity exceeds `isize::MAX` bytes. + /// + /// # Examples + /// + /// ``` + /// let mut vec = Vec::with_capacity(10); + /// + /// // The vector contains no items, even though it has capacity for more + /// assert_eq!(vec.len(), 0); + /// assert!(vec.capacity() >= 10); + /// + /// // These are all done without reallocating... + /// for i in 0..10 { + /// vec.push(i); + /// } + /// assert_eq!(vec.len(), 10); + /// assert!(vec.capacity() >= 10); + /// + /// // ...but this may make the vector reallocate + /// vec.push(11); + /// assert_eq!(vec.len(), 11); + /// assert!(vec.capacity() >= 11); + /// + /// // A vector of a zero-sized type will always over-allocate, since no + /// // allocation is necessary + /// let vec_units = Vec::<()>::with_capacity(10); + /// assert_eq!(vec_units.capacity(), usize::MAX); + /// ``` + #[cfg(not(no_global_oom_handling))] + #[inline(always)] + #[must_use] + pub fn with_capacity(capacity: usize) -> Self { + Self::with_capacity_in(capacity, Global) + } + + /// Creates a `Vec` directly from a pointer, a capacity, and a length. + /// + /// # Safety + /// + /// This is highly unsafe, due to the number of invariants that aren't + /// checked: + /// + /// * `T` needs to have the same alignment as what `ptr` was allocated with. + /// (`T` having a less strict alignment is not sufficient, the alignment really + /// needs to be equal to satisfy the [`dealloc`] requirement that memory must be + /// allocated and deallocated with the same layout.) + /// * The size of `T` times the `capacity` (ie. the allocated size in bytes) needs + /// to be the same size as the pointer was allocated with. (Because similar to + /// alignment, [`dealloc`] must be called with the same layout `size`.) + /// * `length` needs to be less than or equal to `capacity`. + /// * The first `length` values must be properly initialized values of type `T`. + /// * `capacity` needs to be the capacity that the pointer was allocated with. + /// * The allocated size in bytes must be no larger than `isize::MAX`. + /// See the safety documentation of [`pointer::offset`](https://doc.rust-lang.org/nightly/std/primitive.pointer.html#method.offset). + /// + /// These requirements are always upheld by any `ptr` that has been allocated + /// via `Vec`. Other allocation sources are allowed if the invariants are + /// upheld. + /// + /// Violating these may cause problems like corrupting the allocator's + /// internal data structures. For example it is normally **not** safe + /// to build a `Vec` from a pointer to a C `char` array with length + /// `size_t`, doing so is only safe if the array was initially allocated by + /// a `Vec` or `String`. + /// It's also not safe to build one from a `Vec` and its length, because + /// the allocator cares about the alignment, and these two types have different + /// alignments. The buffer was allocated with alignment 2 (for `u16`), but after + /// turning it into a `Vec` it'll be deallocated with alignment 1. To avoid + /// these issues, it is often preferable to do casting/transmuting using + /// [`slice::from_raw_parts`] instead. + /// + /// The ownership of `ptr` is effectively transferred to the + /// `Vec` which may then deallocate, reallocate or change the + /// contents of memory pointed to by the pointer at will. Ensure + /// that nothing else uses the pointer after calling this + /// function. + /// + /// [`String`]: alloc_crate::string::String + /// [`dealloc`]: crate::alloc::GlobalAlloc::dealloc + /// + /// # Examples + /// + /// ``` + /// use std::ptr; + /// use std::mem; + /// + /// let v = vec![1, 2, 3]; + /// + // FIXME Update this when vec_into_raw_parts is stabilized + /// // Prevent running `v`'s destructor so we are in complete control + /// // of the allocation. + /// let mut v = mem::ManuallyDrop::new(v); + /// + /// // Pull out the various important pieces of information about `v` + /// let p = v.as_mut_ptr(); + /// let len = v.len(); + /// let cap = v.capacity(); + /// + /// unsafe { + /// // Overwrite memory with 4, 5, 6 + /// for i in 0..len { + /// ptr::write(p.add(i), 4 + i); + /// } + /// + /// // Put everything back together into a Vec + /// let rebuilt = Vec::from_raw_parts(p, len, cap); + /// assert_eq!(rebuilt, [4, 5, 6]); + /// } + /// ``` + /// + /// Using memory that was allocated elsewhere: + /// + /// ```rust + /// #![feature(allocator_api)] + /// + /// use std::alloc::{AllocError, Allocator, Global, Layout}; + /// + /// fn main() { + /// let layout = Layout::array::(16).expect("overflow cannot happen"); + /// + /// let vec = unsafe { + /// let mem = match Global.allocate(layout) { + /// Ok(mem) => mem.cast::().as_ptr(), + /// Err(AllocError) => return, + /// }; + /// + /// mem.write(1_000_000); + /// + /// Vec::from_raw_parts_in(mem, 1, 16, Global) + /// }; + /// + /// assert_eq!(vec, &[1_000_000]); + /// assert_eq!(vec.capacity(), 16); + /// } + /// ``` + #[inline(always)] + pub unsafe fn from_raw_parts(ptr: *mut T, length: usize, capacity: usize) -> Self { + unsafe { Self::from_raw_parts_in(ptr, length, capacity, Global) } + } +} + +impl Vec { + /// Constructs a new, empty `Vec`. + /// + /// The vector will not allocate until elements are pushed onto it. + /// + /// # Examples + /// + /// ``` + /// use std::alloc::System; + /// + /// # #[allow(unused_mut)] + /// let mut vec: Vec = Vec::new_in(System); + /// ``` + #[inline(always)] + pub const fn new_in(alloc: A) -> Self { + Vec { + buf: RawVec::new_in(alloc), + len: 0, + } + } + + /// Constructs a new, empty `Vec` with at least the specified capacity + /// with the provided allocator. + /// + /// The vector will be able to hold at least `capacity` elements without + /// reallocating. This method is allowed to allocate for more elements than + /// `capacity`. If `capacity` is 0, the vector will not allocate. + /// + /// It is important to note that although the returned vector has the + /// minimum *capacity* specified, the vector will have a zero *length*. For + /// an explanation of the difference between length and capacity, see + /// *[Capacity and reallocation]*. + /// + /// If it is important to know the exact allocated capacity of a `Vec`, + /// always use the [`capacity`] method after construction. + /// + /// For `Vec` where `T` is a zero-sized type, there will be no allocation + /// and the capacity will always be `usize::MAX`. + /// + /// [Capacity and reallocation]: #capacity-and-reallocation + /// [`capacity`]: Vec::capacity + /// + /// # Panics + /// + /// Panics if the new capacity exceeds `isize::MAX` bytes. + /// + /// # Examples + /// + /// ``` + /// use std::alloc::System; + /// + /// let mut vec = Vec::with_capacity_in(10, System); + /// + /// // The vector contains no items, even though it has capacity for more + /// assert_eq!(vec.len(), 0); + /// assert_eq!(vec.capacity(), 10); + /// + /// // These are all done without reallocating... + /// for i in 0..10 { + /// vec.push(i); + /// } + /// assert_eq!(vec.len(), 10); + /// assert_eq!(vec.capacity(), 10); + /// + /// // ...but this may make the vector reallocate + /// vec.push(11); + /// assert_eq!(vec.len(), 11); + /// assert!(vec.capacity() >= 11); + /// + /// // A vector of a zero-sized type will always over-allocate, since no + /// // allocation is necessary + /// let vec_units = Vec::<(), System>::with_capacity_in(10, System); + /// assert_eq!(vec_units.capacity(), usize::MAX); + /// ``` + #[cfg(not(no_global_oom_handling))] + #[inline(always)] + pub fn with_capacity_in(capacity: usize, alloc: A) -> Self { + Vec { + buf: RawVec::with_capacity_in(capacity, alloc), + len: 0, + } + } + + /// Creates a `Vec` directly from a pointer, a capacity, a length, + /// and an allocator. + /// + /// # Safety + /// + /// This is highly unsafe, due to the number of invariants that aren't + /// checked: + /// + /// * `T` needs to have the same alignment as what `ptr` was allocated with. + /// (`T` having a less strict alignment is not sufficient, the alignment really + /// needs to be equal to satisfy the [`dealloc`] requirement that memory must be + /// allocated and deallocated with the same layout.) + /// * The size of `T` times the `capacity` (ie. the allocated size in bytes) needs + /// to be the same size as the pointer was allocated with. (Because similar to + /// alignment, [`dealloc`] must be called with the same layout `size`.) + /// * `length` needs to be less than or equal to `capacity`. + /// * The first `length` values must be properly initialized values of type `T`. + /// * `capacity` needs to [*fit*] the layout size that the pointer was allocated with. + /// * The allocated size in bytes must be no larger than `isize::MAX`. + /// See the safety documentation of [`pointer::offset`](https://doc.rust-lang.org/nightly/std/primitive.pointer.html#method.offset). + /// + /// These requirements are always upheld by any `ptr` that has been allocated + /// via `Vec`. Other allocation sources are allowed if the invariants are + /// upheld. + /// + /// Violating these may cause problems like corrupting the allocator's + /// internal data structures. For example it is **not** safe + /// to build a `Vec` from a pointer to a C `char` array with length `size_t`. + /// It's also not safe to build one from a `Vec` and its length, because + /// the allocator cares about the alignment, and these two types have different + /// alignments. The buffer was allocated with alignment 2 (for `u16`), but after + /// turning it into a `Vec` it'll be deallocated with alignment 1. + /// + /// The ownership of `ptr` is effectively transferred to the + /// `Vec` which may then deallocate, reallocate or change the + /// contents of memory pointed to by the pointer at will. Ensure + /// that nothing else uses the pointer after calling this + /// function. + /// + /// [`String`]: alloc_crate::string::String + /// [`dealloc`]: crate::alloc::GlobalAlloc::dealloc + /// [*fit*]: crate::alloc::Allocator#memory-fitting + /// + /// # Examples + /// + /// ``` + /// use std::alloc::System; + /// + /// use std::ptr; + /// use std::mem; + /// + /// + /// # use allocator_api2::vec::Vec; + /// let mut v = Vec::with_capacity_in(3, System); + /// v.push(1); + /// v.push(2); + /// v.push(3); + /// + // FIXME Update this when vec_into_raw_parts is stabilized + /// // Prevent running `v`'s destructor so we are in complete control + /// // of the allocation. + /// let mut v = mem::ManuallyDrop::new(v); + /// + /// // Pull out the various important pieces of information about `v` + /// let p = v.as_mut_ptr(); + /// let len = v.len(); + /// let cap = v.capacity(); + /// let alloc = v.allocator(); + /// + /// unsafe { + /// // Overwrite memory with 4, 5, 6 + /// for i in 0..len { + /// ptr::write(p.add(i), 4 + i); + /// } + /// + /// // Put everything back together into a Vec + /// let rebuilt = Vec::from_raw_parts_in(p, len, cap, alloc.clone()); + /// assert_eq!(rebuilt, [4, 5, 6]); + /// } + /// ``` + /// + /// Using memory that was allocated elsewhere: + /// + /// ```rust + /// use std::alloc::{alloc, Layout}; + /// + /// fn main() { + /// let layout = Layout::array::(16).expect("overflow cannot happen"); + /// let vec = unsafe { + /// let mem = alloc(layout).cast::(); + /// if mem.is_null() { + /// return; + /// } + /// + /// mem.write(1_000_000); + /// + /// Vec::from_raw_parts(mem, 1, 16) + /// }; + /// + /// assert_eq!(vec, &[1_000_000]); + /// assert_eq!(vec.capacity(), 16); + /// } + /// ``` + #[inline(always)] + pub unsafe fn from_raw_parts_in(ptr: *mut T, length: usize, capacity: usize, alloc: A) -> Self { + unsafe { + Vec { + buf: RawVec::from_raw_parts_in(ptr, capacity, alloc), + len: length, + } + } + } + + /// Decomposes a `Vec` into its raw components. + /// + /// Returns the raw pointer to the underlying data, the length of + /// the vector (in elements), and the allocated capacity of the + /// data (in elements). These are the same arguments in the same + /// order as the arguments to [`from_raw_parts`]. + /// + /// After calling this function, the caller is responsible for the + /// memory previously managed by the `Vec`. The only way to do + /// this is to convert the raw pointer, length, and capacity back + /// into a `Vec` with the [`from_raw_parts`] function, allowing + /// the destructor to perform the cleanup. + /// + /// [`from_raw_parts`]: Vec::from_raw_parts + /// + /// # Examples + /// + /// ``` + /// #![feature(vec_into_raw_parts)] + /// let v: Vec = vec![-1, 0, 1]; + /// + /// let (ptr, len, cap) = v.into_raw_parts(); + /// + /// let rebuilt = unsafe { + /// // We can now make changes to the components, such as + /// // transmuting the raw pointer to a compatible type. + /// let ptr = ptr as *mut u32; + /// + /// Vec::from_raw_parts(ptr, len, cap) + /// }; + /// assert_eq!(rebuilt, [4294967295, 0, 1]); + /// ``` + pub fn into_raw_parts(self) -> (*mut T, usize, usize) { + let mut me = ManuallyDrop::new(self); + (me.as_mut_ptr(), me.len(), me.capacity()) + } + + /// Decomposes a `Vec` into its raw components. + /// + /// Returns the raw pointer to the underlying data, the length of the vector (in elements), + /// the allocated capacity of the data (in elements), and the allocator. These are the same + /// arguments in the same order as the arguments to [`from_raw_parts_in`]. + /// + /// After calling this function, the caller is responsible for the + /// memory previously managed by the `Vec`. The only way to do + /// this is to convert the raw pointer, length, and capacity back + /// into a `Vec` with the [`from_raw_parts_in`] function, allowing + /// the destructor to perform the cleanup. + /// + /// [`from_raw_parts_in`]: Vec::from_raw_parts_in + /// + /// # Examples + /// + /// ``` + /// #![feature(allocator_api, vec_into_raw_parts)] + /// + /// use std::alloc::System; + /// + /// let mut v: Vec = Vec::new_in(System); + /// v.push(-1); + /// v.push(0); + /// v.push(1); + /// + /// let (ptr, len, cap, alloc) = v.into_raw_parts_with_alloc(); + /// + /// let rebuilt = unsafe { + /// // We can now make changes to the components, such as + /// // transmuting the raw pointer to a compatible type. + /// let ptr = ptr as *mut u32; + /// + /// Vec::from_raw_parts_in(ptr, len, cap, alloc) + /// }; + /// assert_eq!(rebuilt, [4294967295, 0, 1]); + /// ``` + // #[unstable(feature = "vec_into_raw_parts", reason = "new API", issue = "65816")] + pub fn into_raw_parts_with_alloc(self) -> (*mut T, usize, usize, A) { + let mut me = ManuallyDrop::new(self); + let len = me.len(); + let capacity = me.capacity(); + let ptr = me.as_mut_ptr(); + let alloc = unsafe { ptr::read(me.allocator()) }; + (ptr, len, capacity, alloc) + } + + /// Returns the total number of elements the vector can hold without + /// reallocating. + /// + /// # Examples + /// + /// ``` + /// let mut vec: Vec = Vec::with_capacity(10); + /// vec.push(42); + /// assert_eq!(vec.capacity(), 10); + /// ``` + #[inline(always)] + pub fn capacity(&self) -> usize { + self.buf.capacity() + } + + /// Reserves capacity for at least `additional` more elements to be inserted + /// in the given `Vec`. The collection may reserve more space to + /// speculatively avoid frequent reallocations. After calling `reserve`, + /// capacity will be greater than or equal to `self.len() + additional`. + /// Does nothing if capacity is already sufficient. + /// + /// # Panics + /// + /// Panics if the new capacity exceeds `isize::MAX` bytes. + /// + /// # Examples + /// + /// ``` + /// let mut vec = vec![1]; + /// vec.reserve(10); + /// assert!(vec.capacity() >= 11); + /// ``` + #[cfg(not(no_global_oom_handling))] + #[inline(always)] + pub fn reserve(&mut self, additional: usize) { + self.buf.reserve(self.len, additional); + } + + /// Reserves the minimum capacity for at least `additional` more elements to + /// be inserted in the given `Vec`. Unlike [`reserve`], this will not + /// deliberately over-allocate to speculatively avoid frequent allocations. + /// After calling `reserve_exact`, capacity will be greater than or equal to + /// `self.len() + additional`. Does nothing if the capacity is already + /// sufficient. + /// + /// Note that the allocator may give the collection more space than it + /// requests. Therefore, capacity can not be relied upon to be precisely + /// minimal. Prefer [`reserve`] if future insertions are expected. + /// + /// [`reserve`]: Vec::reserve + /// + /// # Panics + /// + /// Panics if the new capacity exceeds `isize::MAX` bytes. + /// + /// # Examples + /// + /// ``` + /// let mut vec = vec![1]; + /// vec.reserve_exact(10); + /// assert!(vec.capacity() >= 11); + /// ``` + #[cfg(not(no_global_oom_handling))] + #[inline(always)] + pub fn reserve_exact(&mut self, additional: usize) { + self.buf.reserve_exact(self.len, additional); + } + + /// Tries to reserve capacity for at least `additional` more elements to be inserted + /// in the given `Vec`. The collection may reserve more space to speculatively avoid + /// frequent reallocations. After calling `try_reserve`, capacity will be + /// greater than or equal to `self.len() + additional` if it returns + /// `Ok(())`. Does nothing if capacity is already sufficient. This method + /// preserves the contents even if an error occurs. + /// + /// # Errors + /// + /// If the capacity overflows, or the allocator reports a failure, then an error + /// is returned. + /// + /// # Examples + /// + /// ``` + /// use std::collections::TryReserveError; + /// + /// fn process_data(data: &[u32]) -> Result, TryReserveError> { + /// let mut output = Vec::new(); + /// + /// // Pre-reserve the memory, exiting if we can't + /// output.try_reserve(data.len())?; + /// + /// // Now we know this can't OOM in the middle of our complex work + /// output.extend(data.iter().map(|&val| { + /// val * 2 + 5 // very complicated + /// })); + /// + /// Ok(output) + /// } + /// # process_data(&[1, 2, 3]).expect("why is the test harness OOMing on 12 bytes?"); + /// ``` + #[inline(always)] + pub fn try_reserve(&mut self, additional: usize) -> Result<(), TryReserveError> { + self.buf.try_reserve(self.len, additional) + } + + /// Tries to reserve the minimum capacity for at least `additional` + /// elements to be inserted in the given `Vec`. Unlike [`try_reserve`], + /// this will not deliberately over-allocate to speculatively avoid frequent + /// allocations. After calling `try_reserve_exact`, capacity will be greater + /// than or equal to `self.len() + additional` if it returns `Ok(())`. + /// Does nothing if the capacity is already sufficient. + /// + /// Note that the allocator may give the collection more space than it + /// requests. Therefore, capacity can not be relied upon to be precisely + /// minimal. Prefer [`try_reserve`] if future insertions are expected. + /// + /// [`try_reserve`]: Vec::try_reserve + /// + /// # Errors + /// + /// If the capacity overflows, or the allocator reports a failure, then an error + /// is returned. + /// + /// # Examples + /// + /// ``` + /// use std::collections::TryReserveError; + /// + /// fn process_data(data: &[u32]) -> Result, TryReserveError> { + /// let mut output = Vec::new(); + /// + /// // Pre-reserve the memory, exiting if we can't + /// output.try_reserve_exact(data.len())?; + /// + /// // Now we know this can't OOM in the middle of our complex work + /// output.extend(data.iter().map(|&val| { + /// val * 2 + 5 // very complicated + /// })); + /// + /// Ok(output) + /// } + /// # process_data(&[1, 2, 3]).expect("why is the test harness OOMing on 12 bytes?"); + /// ``` + #[inline(always)] + pub fn try_reserve_exact(&mut self, additional: usize) -> Result<(), TryReserveError> { + self.buf.try_reserve_exact(self.len, additional) + } + + /// Shrinks the capacity of the vector as much as possible. + /// + /// It will drop down as close as possible to the length but the allocator + /// may still inform the vector that there is space for a few more elements. + /// + /// # Examples + /// + /// ``` + /// let mut vec = Vec::with_capacity(10); + /// vec.extend([1, 2, 3]); + /// assert_eq!(vec.capacity(), 10); + /// vec.shrink_to_fit(); + /// assert!(vec.capacity() >= 3); + /// ``` + #[cfg(not(no_global_oom_handling))] + #[inline(always)] + pub fn shrink_to_fit(&mut self) { + // The capacity is never less than the length, and there's nothing to do when + // they are equal, so we can avoid the panic case in `RawVec::shrink_to_fit` + // by only calling it with a greater capacity. + if self.capacity() > self.len { + self.buf.shrink_to_fit(self.len); + } + } + + /// Shrinks the capacity of the vector with a lower bound. + /// + /// The capacity will remain at least as large as both the length + /// and the supplied value. + /// + /// If the current capacity is less than the lower limit, this is a no-op. + /// + /// # Examples + /// + /// ``` + /// let mut vec = Vec::with_capacity(10); + /// vec.extend([1, 2, 3]); + /// assert_eq!(vec.capacity(), 10); + /// vec.shrink_to(4); + /// assert!(vec.capacity() >= 4); + /// vec.shrink_to(0); + /// assert!(vec.capacity() >= 3); + /// ``` + #[cfg(not(no_global_oom_handling))] + #[inline(always)] + pub fn shrink_to(&mut self, min_capacity: usize) { + if self.capacity() > min_capacity { + self.buf.shrink_to_fit(cmp::max(self.len, min_capacity)); + } + } + + /// Converts the vector into [`Box<[T]>`][owned slice]. + /// + /// If the vector has excess capacity, its items will be moved into a + /// newly-allocated buffer with exactly the right capacity. + /// + /// [owned slice]: Box + /// + /// # Examples + /// + /// ``` + /// let v = vec![1, 2, 3]; + /// + /// let slice = v.into_boxed_slice(); + /// ``` + /// + /// Any excess capacity is removed: + /// + /// ``` + /// let mut vec = Vec::with_capacity(10); + /// vec.extend([1, 2, 3]); + /// + /// assert_eq!(vec.capacity(), 10); + /// let slice = vec.into_boxed_slice(); + /// assert_eq!(slice.into_vec().capacity(), 3); + /// ``` + #[cfg(not(no_global_oom_handling))] + #[inline(always)] + pub fn into_boxed_slice(mut self) -> Box<[T], A> { + unsafe { + self.shrink_to_fit(); + let me = ManuallyDrop::new(self); + let buf = ptr::read(&me.buf); + let len = me.len(); + buf.into_box(len).assume_init() + } + } + + /// Shortens the vector, keeping the first `len` elements and dropping + /// the rest. + /// + /// If `len` is greater than the vector's current length, this has no + /// effect. + /// + /// The [`drain`] method can emulate `truncate`, but causes the excess + /// elements to be returned instead of dropped. + /// + /// Note that this method has no effect on the allocated capacity + /// of the vector. + /// + /// # Examples + /// + /// Truncating a five element vector to two elements: + /// + /// ``` + /// let mut vec = vec![1, 2, 3, 4, 5]; + /// vec.truncate(2); + /// assert_eq!(vec, [1, 2]); + /// ``` + /// + /// No truncation occurs when `len` is greater than the vector's current + /// length: + /// + /// ``` + /// let mut vec = vec![1, 2, 3]; + /// vec.truncate(8); + /// assert_eq!(vec, [1, 2, 3]); + /// ``` + /// + /// Truncating when `len == 0` is equivalent to calling the [`clear`] + /// method. + /// + /// ``` + /// let mut vec = vec![1, 2, 3]; + /// vec.truncate(0); + /// assert_eq!(vec, []); + /// ``` + /// + /// [`clear`]: Vec::clear + /// [`drain`]: Vec::drain + #[inline(always)] + pub fn truncate(&mut self, len: usize) { + // This is safe because: + // + // * the slice passed to `drop_in_place` is valid; the `len > self.len` + // case avoids creating an invalid slice, and + // * the `len` of the vector is shrunk before calling `drop_in_place`, + // such that no value will be dropped twice in case `drop_in_place` + // were to panic once (if it panics twice, the program aborts). + unsafe { + // Note: It's intentional that this is `>` and not `>=`. + // Changing it to `>=` has negative performance + // implications in some cases. See #78884 for more. + if len > self.len { + return; + } + let remaining_len = self.len - len; + let s = ptr::slice_from_raw_parts_mut(self.as_mut_ptr().add(len), remaining_len); + self.len = len; + ptr::drop_in_place(s); + } + } + + /// Extracts a slice containing the entire vector. + /// + /// Equivalent to `&s[..]`. + /// + /// # Examples + /// + /// ``` + /// use std::io::{self, Write}; + /// let buffer = vec![1, 2, 3, 5, 8]; + /// io::sink().write(buffer.as_slice()).unwrap(); + /// ``` + #[inline(always)] + pub fn as_slice(&self) -> &[T] { + self + } + + /// Extracts a mutable slice of the entire vector. + /// + /// Equivalent to `&mut s[..]`. + /// + /// # Examples + /// + /// ``` + /// use std::io::{self, Read}; + /// let mut buffer = vec![0; 3]; + /// io::repeat(0b101).read_exact(buffer.as_mut_slice()).unwrap(); + /// ``` + #[inline(always)] + pub fn as_mut_slice(&mut self) -> &mut [T] { + self + } + + /// Returns a raw pointer to the vector's buffer, or a dangling raw pointer + /// valid for zero sized reads if the vector didn't allocate. + /// + /// The caller must ensure that the vector outlives the pointer this + /// function returns, or else it will end up pointing to garbage. + /// Modifying the vector may cause its buffer to be reallocated, + /// which would also make any pointers to it invalid. + /// + /// The caller must also ensure that the memory the pointer (non-transitively) points to + /// is never written to (except inside an `UnsafeCell`) using this pointer or any pointer + /// derived from it. If you need to mutate the contents of the slice, use [`as_mut_ptr`]. + /// + /// # Examples + /// + /// ``` + /// let x = vec![1, 2, 4]; + /// let x_ptr = x.as_ptr(); + /// + /// unsafe { + /// for i in 0..x.len() { + /// assert_eq!(*x_ptr.add(i), 1 << i); + /// } + /// } + /// ``` + /// + /// [`as_mut_ptr`]: Vec::as_mut_ptr + #[inline(always)] + pub fn as_ptr(&self) -> *const T { + // We shadow the slice method of the same name to avoid going through + // `deref`, which creates an intermediate reference. + let ptr = self.buf.ptr(); + unsafe { + assume(!ptr.is_null()); + } + ptr + } + + /// Returns an unsafe mutable pointer to the vector's buffer, or a dangling + /// raw pointer valid for zero sized reads if the vector didn't allocate. + /// + /// The caller must ensure that the vector outlives the pointer this + /// function returns, or else it will end up pointing to garbage. + /// Modifying the vector may cause its buffer to be reallocated, + /// which would also make any pointers to it invalid. + /// + /// # Examples + /// + /// ``` + /// // Allocate vector big enough for 4 elements. + /// let size = 4; + /// let mut x: Vec = Vec::with_capacity(size); + /// let x_ptr = x.as_mut_ptr(); + /// + /// // Initialize elements via raw pointer writes, then set length. + /// unsafe { + /// for i in 0..size { + /// *x_ptr.add(i) = i as i32; + /// } + /// x.set_len(size); + /// } + /// assert_eq!(&*x, &[0, 1, 2, 3]); + /// ``` + #[inline(always)] + pub fn as_mut_ptr(&mut self) -> *mut T { + // We shadow the slice method of the same name to avoid going through + // `deref_mut`, which creates an intermediate reference. + let ptr = self.buf.ptr(); + unsafe { + assume(!ptr.is_null()); + } + ptr + } + + /// Returns a reference to the underlying allocator. + #[inline(always)] + pub fn allocator(&self) -> &A { + self.buf.allocator() + } + + /// Forces the length of the vector to `new_len`. + /// + /// This is a low-level operation that maintains none of the normal + /// invariants of the type. Normally changing the length of a vector + /// is done using one of the safe operations instead, such as + /// [`truncate`], [`resize`], [`extend`], or [`clear`]. + /// + /// [`truncate`]: Vec::truncate + /// [`resize`]: Vec::resize + /// [`extend`]: Extend::extend + /// [`clear`]: Vec::clear + /// + /// # Safety + /// + /// - `new_len` must be less than or equal to [`capacity()`]. + /// - The elements at `old_len..new_len` must be initialized. + /// + /// [`capacity()`]: Vec::capacity + /// + /// # Examples + /// + /// This method can be useful for situations in which the vector + /// is serving as a buffer for other code, particularly over FFI: + /// + /// ```no_run + /// # #![allow(dead_code)] + /// # // This is just a minimal skeleton for the doc example; + /// # // don't use this as a starting point for a real library. + /// # pub struct StreamWrapper { strm: *mut std::ffi::c_void } + /// # const Z_OK: i32 = 0; + /// # extern "C" { + /// # fn deflateGetDictionary( + /// # strm: *mut std::ffi::c_void, + /// # dictionary: *mut u8, + /// # dictLength: *mut usize, + /// # ) -> i32; + /// # } + /// # impl StreamWrapper { + /// pub fn get_dictionary(&self) -> Option> { + /// // Per the FFI method's docs, "32768 bytes is always enough". + /// let mut dict = Vec::with_capacity(32_768); + /// let mut dict_length = 0; + /// // SAFETY: When `deflateGetDictionary` returns `Z_OK`, it holds that: + /// // 1. `dict_length` elements were initialized. + /// // 2. `dict_length` <= the capacity (32_768) + /// // which makes `set_len` safe to call. + /// unsafe { + /// // Make the FFI call... + /// let r = deflateGetDictionary(self.strm, dict.as_mut_ptr(), &mut dict_length); + /// if r == Z_OK { + /// // ...and update the length to what was initialized. + /// dict.set_len(dict_length); + /// Some(dict) + /// } else { + /// None + /// } + /// } + /// } + /// # } + /// ``` + /// + /// While the following example is sound, there is a memory leak since + /// the inner vectors were not freed prior to the `set_len` call: + /// + /// ``` + /// let mut vec = vec![vec![1, 0, 0], + /// vec![0, 1, 0], + /// vec![0, 0, 1]]; + /// // SAFETY: + /// // 1. `old_len..0` is empty so no elements need to be initialized. + /// // 2. `0 <= capacity` always holds whatever `capacity` is. + /// unsafe { + /// vec.set_len(0); + /// } + /// ``` + /// + /// Normally, here, one would use [`clear`] instead to correctly drop + /// the contents and thus not leak memory. + #[inline(always)] + pub unsafe fn set_len(&mut self, new_len: usize) { + debug_assert!(new_len <= self.capacity()); + + self.len = new_len; + } + + /// Removes an element from the vector and returns it. + /// + /// The removed element is replaced by the last element of the vector. + /// + /// This does not preserve ordering, but is *O*(1). + /// If you need to preserve the element order, use [`remove`] instead. + /// + /// [`remove`]: Vec::remove + /// + /// # Panics + /// + /// Panics if `index` is out of bounds. + /// + /// # Examples + /// + /// ``` + /// let mut v = vec!["foo", "bar", "baz", "qux"]; + /// + /// assert_eq!(v.swap_remove(1), "bar"); + /// assert_eq!(v, ["foo", "qux", "baz"]); + /// + /// assert_eq!(v.swap_remove(0), "foo"); + /// assert_eq!(v, ["baz", "qux"]); + /// ``` + #[inline(always)] + pub fn swap_remove(&mut self, index: usize) -> T { + #[cold] + #[inline(never)] + fn assert_failed(index: usize, len: usize) -> ! { + panic!( + "swap_remove index (is {}) should be < len (is {})", + index, len + ); + } + + let len = self.len(); + if index >= len { + assert_failed(index, len); + } + unsafe { + // We replace self[index] with the last element. Note that if the + // bounds check above succeeds there must be a last element (which + // can be self[index] itself). + let value = ptr::read(self.as_ptr().add(index)); + let base_ptr = self.as_mut_ptr(); + ptr::copy(base_ptr.add(len - 1), base_ptr.add(index), 1); + self.set_len(len - 1); + value + } + } + + /// Inserts an element at position `index` within the vector, shifting all + /// elements after it to the right. + /// + /// # Panics + /// + /// Panics if `index > len`. + /// + /// # Examples + /// + /// ``` + /// let mut vec = vec![1, 2, 3]; + /// vec.insert(1, 4); + /// assert_eq!(vec, [1, 4, 2, 3]); + /// vec.insert(4, 5); + /// assert_eq!(vec, [1, 4, 2, 3, 5]); + /// ``` + #[cfg(not(no_global_oom_handling))] + pub fn insert(&mut self, index: usize, element: T) { + #[cold] + #[inline(never)] + fn assert_failed(index: usize, len: usize) -> ! { + panic!( + "insertion index (is {}) should be <= len (is {})", + index, len + ); + } + + let len = self.len(); + + // space for the new element + if len == self.buf.capacity() { + self.reserve(1); + } + + unsafe { + // infallible + // The spot to put the new value + { + let p = self.as_mut_ptr().add(index); + match cmp::Ord::cmp(&index, &len) { + Ordering::Less => { + // Shift everything over to make space. (Duplicating the + // `index`th element into two consecutive places.) + ptr::copy(p, p.add(1), len - index); + } + Ordering::Equal => { + // No elements need shifting. + } + Ordering::Greater => { + assert_failed(index, len); + } + } + // Write it in, overwriting the first copy of the `index`th + // element. + ptr::write(p, element); + } + self.set_len(len + 1); + } + } + + /// Removes and returns the element at position `index` within the vector, + /// shifting all elements after it to the left. + /// + /// Note: Because this shifts over the remaining elements, it has a + /// worst-case performance of *O*(*n*). If you don't need the order of elements + /// to be preserved, use [`swap_remove`] instead. If you'd like to remove + /// elements from the beginning of the `Vec`, consider using + /// [`VecDeque::pop_front`] instead. + /// + /// [`swap_remove`]: Vec::swap_remove + /// [`VecDeque::pop_front`]: alloc_crate::collections::VecDeque::pop_front + /// + /// # Panics + /// + /// Panics if `index` is out of bounds. + /// + /// # Examples + /// + /// ``` + /// let mut v = vec![1, 2, 3]; + /// assert_eq!(v.remove(1), 2); + /// assert_eq!(v, [1, 3]); + /// ``` + #[track_caller] + #[inline(always)] + pub fn remove(&mut self, index: usize) -> T { + #[cold] + #[inline(never)] + #[track_caller] + fn assert_failed(index: usize, len: usize) -> ! { + panic!("removal index (is {}) should be < len (is {})", index, len); + } + + let len = self.len(); + if index >= len { + assert_failed(index, len); + } + unsafe { + // infallible + let ret; + { + // the place we are taking from. + let ptr = self.as_mut_ptr().add(index); + // copy it out, unsafely having a copy of the value on + // the stack and in the vector at the same time. + ret = ptr::read(ptr); + + // Shift everything down to fill in that spot. + ptr::copy(ptr.add(1), ptr, len - index - 1); + } + self.set_len(len - 1); + ret + } + } + + /// Retains only the elements specified by the predicate. + /// + /// In other words, remove all elements `e` for which `f(&e)` returns `false`. + /// This method operates in place, visiting each element exactly once in the + /// original order, and preserves the order of the retained elements. + /// + /// # Examples + /// + /// ``` + /// let mut vec = vec![1, 2, 3, 4]; + /// vec.retain(|&x| x % 2 == 0); + /// assert_eq!(vec, [2, 4]); + /// ``` + /// + /// Because the elements are visited exactly once in the original order, + /// external state may be used to decide which elements to keep. + /// + /// ``` + /// let mut vec = vec![1, 2, 3, 4, 5]; + /// let keep = [false, true, true, false, true]; + /// let mut iter = keep.iter(); + /// vec.retain(|_| *iter.next().unwrap()); + /// assert_eq!(vec, [2, 3, 5]); + /// ``` + #[inline(always)] + pub fn retain(&mut self, mut f: F) + where + F: FnMut(&T) -> bool, + { + self.retain_mut(|elem| f(elem)); + } + + /// Retains only the elements specified by the predicate, passing a mutable reference to it. + /// + /// In other words, remove all elements `e` such that `f(&mut e)` returns `false`. + /// This method operates in place, visiting each element exactly once in the + /// original order, and preserves the order of the retained elements. + /// + /// # Examples + /// + /// ``` + /// let mut vec = vec![1, 2, 3, 4]; + /// vec.retain_mut(|x| if *x <= 3 { + /// *x += 1; + /// true + /// } else { + /// false + /// }); + /// assert_eq!(vec, [2, 3, 4]); + /// ``` + #[inline] + pub fn retain_mut(&mut self, mut f: F) + where + F: FnMut(&mut T) -> bool, + { + let original_len = self.len(); + // Avoid double drop if the drop guard is not executed, + // since we may make some holes during the process. + unsafe { self.set_len(0) }; + + // Vec: [Kept, Kept, Hole, Hole, Hole, Hole, Unchecked, Unchecked] + // |<- processed len ->| ^- next to check + // |<- deleted cnt ->| + // |<- original_len ->| + // Kept: Elements which predicate returns true on. + // Hole: Moved or dropped element slot. + // Unchecked: Unchecked valid elements. + // + // This drop guard will be invoked when predicate or `drop` of element panicked. + // It shifts unchecked elements to cover holes and `set_len` to the correct length. + // In cases when predicate and `drop` never panick, it will be optimized out. + struct BackshiftOnDrop<'a, T, A: Allocator> { + v: &'a mut Vec, + processed_len: usize, + deleted_cnt: usize, + original_len: usize, + } + + impl Drop for BackshiftOnDrop<'_, T, A> { + fn drop(&mut self) { + if self.deleted_cnt > 0 { + // SAFETY: Trailing unchecked items must be valid since we never touch them. + unsafe { + ptr::copy( + self.v.as_ptr().add(self.processed_len), + self.v + .as_mut_ptr() + .add(self.processed_len - self.deleted_cnt), + self.original_len - self.processed_len, + ); + } + } + // SAFETY: After filling holes, all items are in contiguous memory. + unsafe { + self.v.set_len(self.original_len - self.deleted_cnt); + } + } + } + + let mut g = BackshiftOnDrop { + v: self, + processed_len: 0, + deleted_cnt: 0, + original_len, + }; + + fn process_loop( + original_len: usize, + f: &mut F, + g: &mut BackshiftOnDrop<'_, T, A>, + ) where + F: FnMut(&mut T) -> bool, + { + while g.processed_len != original_len { + // SAFETY: Unchecked element must be valid. + let cur = unsafe { &mut *g.v.as_mut_ptr().add(g.processed_len) }; + if !f(cur) { + // Advance early to avoid double drop if `drop_in_place` panicked. + g.processed_len += 1; + g.deleted_cnt += 1; + // SAFETY: We never touch this element again after dropped. + unsafe { ptr::drop_in_place(cur) }; + // We already advanced the counter. + if DELETED { + continue; + } else { + break; + } + } + if DELETED { + // SAFETY: `deleted_cnt` > 0, so the hole slot must not overlap with current element. + // We use copy for move, and never touch this element again. + unsafe { + let hole_slot = g.v.as_mut_ptr().add(g.processed_len - g.deleted_cnt); + ptr::copy_nonoverlapping(cur, hole_slot, 1); + } + } + g.processed_len += 1; + } + } + + // Stage 1: Nothing was deleted. + process_loop::(original_len, &mut f, &mut g); + + // Stage 2: Some elements were deleted. + process_loop::(original_len, &mut f, &mut g); + + // All item are processed. This can be optimized to `set_len` by LLVM. + drop(g); + } + + /// Removes all but the first of consecutive elements in the vector that resolve to the same + /// key. + /// + /// If the vector is sorted, this removes all duplicates. + /// + /// # Examples + /// + /// ``` + /// let mut vec = vec![10, 20, 21, 30, 20]; + /// + /// vec.dedup_by_key(|i| *i / 10); + /// + /// assert_eq!(vec, [10, 20, 30, 20]); + /// ``` + #[inline(always)] + pub fn dedup_by_key(&mut self, mut key: F) + where + F: FnMut(&mut T) -> K, + K: PartialEq, + { + self.dedup_by(|a, b| key(a) == key(b)) + } + + /// Removes all but the first of consecutive elements in the vector satisfying a given equality + /// relation. + /// + /// The `same_bucket` function is passed references to two elements from the vector and + /// must determine if the elements compare equal. The elements are passed in opposite order + /// from their order in the slice, so if `same_bucket(a, b)` returns `true`, `a` is removed. + /// + /// If the vector is sorted, this removes all duplicates. + /// + /// # Examples + /// + /// ``` + /// let mut vec = vec!["foo", "bar", "Bar", "baz", "bar"]; + /// + /// vec.dedup_by(|a, b| a.eq_ignore_ascii_case(b)); + /// + /// assert_eq!(vec, ["foo", "bar", "baz", "bar"]); + /// ``` + #[inline] + pub fn dedup_by(&mut self, mut same_bucket: F) + where + F: FnMut(&mut T, &mut T) -> bool, + { + let len = self.len(); + if len <= 1 { + return; + } + + /* INVARIANT: vec.len() > read >= write > write-1 >= 0 */ + struct FillGapOnDrop<'a, T, A: Allocator> { + /* Offset of the element we want to check if it is duplicate */ + read: usize, + + /* Offset of the place where we want to place the non-duplicate + * when we find it. */ + write: usize, + + /* The Vec that would need correction if `same_bucket` panicked */ + vec: &'a mut Vec, + } + + impl<'a, T, A: Allocator> Drop for FillGapOnDrop<'a, T, A> { + fn drop(&mut self) { + /* This code gets executed when `same_bucket` panics */ + + /* SAFETY: invariant guarantees that `read - write` + * and `len - read` never overflow and that the copy is always + * in-bounds. */ + unsafe { + let ptr = self.vec.as_mut_ptr(); + let len = self.vec.len(); + + /* How many items were left when `same_bucket` panicked. + * Basically vec[read..].len() */ + let items_left = len.wrapping_sub(self.read); + + /* Pointer to first item in vec[write..write+items_left] slice */ + let dropped_ptr = ptr.add(self.write); + /* Pointer to first item in vec[read..] slice */ + let valid_ptr = ptr.add(self.read); + + /* Copy `vec[read..]` to `vec[write..write+items_left]`. + * The slices can overlap, so `copy_nonoverlapping` cannot be used */ + ptr::copy(valid_ptr, dropped_ptr, items_left); + + /* How many items have been already dropped + * Basically vec[read..write].len() */ + let dropped = self.read.wrapping_sub(self.write); + + self.vec.set_len(len - dropped); + } + } + } + + let mut gap = FillGapOnDrop { + read: 1, + write: 1, + vec: self, + }; + let ptr = gap.vec.as_mut_ptr(); + + /* Drop items while going through Vec, it should be more efficient than + * doing slice partition_dedup + truncate */ + + /* SAFETY: Because of the invariant, read_ptr, prev_ptr and write_ptr + * are always in-bounds and read_ptr never aliases prev_ptr */ + unsafe { + while gap.read < len { + let read_ptr = ptr.add(gap.read); + let prev_ptr = ptr.add(gap.write.wrapping_sub(1)); + + if same_bucket(&mut *read_ptr, &mut *prev_ptr) { + // Increase `gap.read` now since the drop may panic. + gap.read += 1; + /* We have found duplicate, drop it in-place */ + ptr::drop_in_place(read_ptr); + } else { + let write_ptr = ptr.add(gap.write); + + /* Because `read_ptr` can be equal to `write_ptr`, we either + * have to use `copy` or conditional `copy_nonoverlapping`. + * Looks like the first option is faster. */ + ptr::copy(read_ptr, write_ptr, 1); + + /* We have filled that place, so go further */ + gap.write += 1; + gap.read += 1; + } + } + + /* Technically we could let `gap` clean up with its Drop, but + * when `same_bucket` is guaranteed to not panic, this bloats a little + * the codegen, so we just do it manually */ + gap.vec.set_len(gap.write); + mem::forget(gap); + } + } + + /// Appends an element to the back of a collection. + /// + /// # Panics + /// + /// Panics if the new capacity exceeds `isize::MAX` bytes. + /// + /// # Examples + /// + /// ``` + /// let mut vec = vec![1, 2]; + /// vec.push(3); + /// assert_eq!(vec, [1, 2, 3]); + /// ``` + #[cfg(not(no_global_oom_handling))] + #[inline(always)] + pub fn push(&mut self, value: T) { + // This will panic or abort if we would allocate > isize::MAX bytes + // or if the length increment would overflow for zero-sized types. + if self.len == self.buf.capacity() { + self.buf.reserve_for_push(self.len); + } + unsafe { + let end = self.as_mut_ptr().add(self.len); + ptr::write(end, value); + self.len += 1; + } + } + + /// Appends an element if there is sufficient spare capacity, otherwise an error is returned + /// with the element. + /// + /// Unlike [`push`] this method will not reallocate when there's insufficient capacity. + /// The caller should use [`reserve`] or [`try_reserve`] to ensure that there is enough capacity. + /// + /// [`push`]: Vec::push + /// [`reserve`]: Vec::reserve + /// [`try_reserve`]: Vec::try_reserve + /// + /// # Examples + /// + /// A manual, panic-free alternative to [`FromIterator`]: + /// + /// ``` + /// #![feature(vec_push_within_capacity)] + /// + /// use std::collections::TryReserveError; + /// fn from_iter_fallible(iter: impl Iterator) -> Result, TryReserveError> { + /// let mut vec = Vec::new(); + /// for value in iter { + /// if let Err(value) = vec.push_within_capacity(value) { + /// vec.try_reserve(1)?; + /// // this cannot fail, the previous line either returned or added at least 1 free slot + /// let _ = vec.push_within_capacity(value); + /// } + /// } + /// Ok(vec) + /// } + /// assert_eq!(from_iter_fallible(0..100), Ok(Vec::from_iter(0..100))); + /// ``` + #[inline(always)] + pub fn push_within_capacity(&mut self, value: T) -> Result<(), T> { + if self.len == self.buf.capacity() { + return Err(value); + } + unsafe { + let end = self.as_mut_ptr().add(self.len); + ptr::write(end, value); + self.len += 1; + } + Ok(()) + } + + /// Removes the last element from a vector and returns it, or [`None`] if it + /// is empty. + /// + /// If you'd like to pop the first element, consider using + /// [`VecDeque::pop_front`] instead. + /// + /// [`VecDeque::pop_front`]: alloc_crate::collections::VecDeque::pop_front + /// + /// # Examples + /// + /// ``` + /// let mut vec = vec![1, 2, 3]; + /// assert_eq!(vec.pop(), Some(3)); + /// assert_eq!(vec, [1, 2]); + /// ``` + #[inline(always)] + pub fn pop(&mut self) -> Option { + if self.len == 0 { + None + } else { + unsafe { + self.len -= 1; + Some(ptr::read(self.as_ptr().add(self.len()))) + } + } + } + + /// Moves all the elements of `other` into `self`, leaving `other` empty. + /// + /// # Panics + /// + /// Panics if the new capacity exceeds `isize::MAX` bytes. + /// + /// # Examples + /// + /// ``` + /// let mut vec = vec![1, 2, 3]; + /// let mut vec2 = vec![4, 5, 6]; + /// vec.append(&mut vec2); + /// assert_eq!(vec, [1, 2, 3, 4, 5, 6]); + /// assert_eq!(vec2, []); + /// ``` + #[cfg(not(no_global_oom_handling))] + #[inline(always)] + pub fn append(&mut self, other: &mut Self) { + unsafe { + self.append_elements(other.as_slice() as _); + other.set_len(0); + } + } + + /// Appends elements to `self` from other buffer. + #[cfg(not(no_global_oom_handling))] + #[inline(always)] + unsafe fn append_elements(&mut self, other: *const [T]) { + let count = unsafe { (*other).len() }; + self.reserve(count); + let len = self.len(); + unsafe { ptr::copy_nonoverlapping(other as *const T, self.as_mut_ptr().add(len), count) }; + self.len += count; + } + + /// Removes the specified range from the vector in bulk, returning all + /// removed elements as an iterator. If the iterator is dropped before + /// being fully consumed, it drops the remaining removed elements. + /// + /// The returned iterator keeps a mutable borrow on the vector to optimize + /// its implementation. + /// + /// # Panics + /// + /// Panics if the starting point is greater than the end point or if + /// the end point is greater than the length of the vector. + /// + /// # Leaking + /// + /// If the returned iterator goes out of scope without being dropped (due to + /// [`mem::forget`], for example), the vector may have lost and leaked + /// elements arbitrarily, including elements outside the range. + /// + /// # Examples + /// + /// ``` + /// let mut v = vec![1, 2, 3]; + /// let u: Vec<_> = v.drain(1..).collect(); + /// assert_eq!(v, &[1]); + /// assert_eq!(u, &[2, 3]); + /// + /// // A full range clears the vector, like `clear()` does + /// v.drain(..); + /// assert_eq!(v, &[]); + /// ``` + #[inline(always)] + pub fn drain(&mut self, range: R) -> Drain<'_, T, A> + where + R: RangeBounds, + { + // Memory safety + // + // When the Drain is first created, it shortens the length of + // the source vector to make sure no uninitialized or moved-from elements + // are accessible at all if the Drain's destructor never gets to run. + // + // Drain will ptr::read out the values to remove. + // When finished, remaining tail of the vec is copied back to cover + // the hole, and the vector length is restored to the new length. + // + let len = self.len(); + + // Replaced by code below + // let Range { start, end } = slice::range(range, ..len); + + // Panics if range is out of bounds + let _ = &self.as_slice()[(range.start_bound().cloned(), range.end_bound().cloned())]; + + let start = match range.start_bound() { + Bound::Included(&n) => n, + Bound::Excluded(&n) => n + 1, + Bound::Unbounded => 0, + }; + let end = match range.end_bound() { + Bound::Included(&n) => n + 1, + Bound::Excluded(&n) => n, + Bound::Unbounded => len, + }; + + unsafe { + // set self.vec length's to start, to be safe in case Drain is leaked + self.set_len(start); + let range_slice = slice::from_raw_parts(self.as_ptr().add(start), end - start); + Drain { + tail_start: end, + tail_len: len - end, + iter: range_slice.iter(), + vec: NonNull::from(self), + } + } + } + + /// Clears the vector, removing all values. + /// + /// Note that this method has no effect on the allocated capacity + /// of the vector. + /// + /// # Examples + /// + /// ``` + /// let mut v = vec![1, 2, 3]; + /// + /// v.clear(); + /// + /// assert!(v.is_empty()); + /// ``` + #[inline(always)] + pub fn clear(&mut self) { + let elems: *mut [T] = self.as_mut_slice(); + + // SAFETY: + // - `elems` comes directly from `as_mut_slice` and is therefore valid. + // - Setting `self.len` before calling `drop_in_place` means that, + // if an element's `Drop` impl panics, the vector's `Drop` impl will + // do nothing (leaking the rest of the elements) instead of dropping + // some twice. + unsafe { + self.len = 0; + ptr::drop_in_place(elems); + } + } + + /// Returns the number of elements in the vector, also referred to + /// as its 'length'. + /// + /// # Examples + /// + /// ``` + /// let a = vec![1, 2, 3]; + /// assert_eq!(a.len(), 3); + /// ``` + #[inline(always)] + pub fn len(&self) -> usize { + self.len + } + + /// Returns `true` if the vector contains no elements. + /// + /// # Examples + /// + /// ``` + /// let mut v = Vec::new(); + /// assert!(v.is_empty()); + /// + /// v.push(1); + /// assert!(!v.is_empty()); + /// ``` + #[inline(always)] + pub fn is_empty(&self) -> bool { + self.len() == 0 + } + + /// Splits the collection into two at the given index. + /// + /// Returns a newly allocated vector containing the elements in the range + /// `[at, len)`. After the call, the original vector will be left containing + /// the elements `[0, at)` with its previous capacity unchanged. + /// + /// # Panics + /// + /// Panics if `at > len`. + /// + /// # Examples + /// + /// ``` + /// let mut vec = vec![1, 2, 3]; + /// let vec2 = vec.split_off(1); + /// assert_eq!(vec, [1]); + /// assert_eq!(vec2, [2, 3]); + /// ``` + #[cfg(not(no_global_oom_handling))] + #[inline(always)] + #[must_use = "use `.truncate()` if you don't need the other half"] + pub fn split_off(&mut self, at: usize) -> Self + where + A: Clone, + { + #[cold] + #[inline(never)] + fn assert_failed(at: usize, len: usize) -> ! { + panic!("`at` split index (is {}) should be <= len (is {})", at, len); + } + + if at > self.len() { + assert_failed(at, self.len()); + } + + if at == 0 { + // the new vector can take over the original buffer and avoid the copy + return mem::replace( + self, + Vec::with_capacity_in(self.capacity(), self.allocator().clone()), + ); + } + + let other_len = self.len - at; + let mut other = Vec::with_capacity_in(other_len, self.allocator().clone()); + + // Unsafely `set_len` and copy items to `other`. + unsafe { + self.set_len(at); + other.set_len(other_len); + + ptr::copy_nonoverlapping(self.as_ptr().add(at), other.as_mut_ptr(), other.len()); + } + other + } + + /// Resizes the `Vec` in-place so that `len` is equal to `new_len`. + /// + /// If `new_len` is greater than `len`, the `Vec` is extended by the + /// difference, with each additional slot filled with the result of + /// calling the closure `f`. The return values from `f` will end up + /// in the `Vec` in the order they have been generated. + /// + /// If `new_len` is less than `len`, the `Vec` is simply truncated. + /// + /// This method uses a closure to create new values on every push. If + /// you'd rather [`Clone`] a given value, use [`Vec::resize`]. If you + /// want to use the [`Default`] trait to generate values, you can + /// pass [`Default::default`] as the second argument. + /// + /// # Examples + /// + /// ``` + /// let mut vec = vec![1, 2, 3]; + /// vec.resize_with(5, Default::default); + /// assert_eq!(vec, [1, 2, 3, 0, 0]); + /// + /// let mut vec = vec![]; + /// let mut p = 1; + /// vec.resize_with(4, || { p *= 2; p }); + /// assert_eq!(vec, [2, 4, 8, 16]); + /// ``` + #[cfg(not(no_global_oom_handling))] + #[inline(always)] + pub fn resize_with(&mut self, new_len: usize, f: F) + where + F: FnMut() -> T, + { + let len = self.len(); + if new_len > len { + self.extend(iter::repeat_with(f).take(new_len - len)); + } else { + self.truncate(new_len); + } + } + + /// Consumes and leaks the `Vec`, returning a mutable reference to the contents, + /// `&'a mut [T]`. Note that the type `T` must outlive the chosen lifetime + /// `'a`. If the type has only static references, or none at all, then this + /// may be chosen to be `'static`. + /// + /// As of Rust 1.57, this method does not reallocate or shrink the `Vec`, + /// so the leaked allocation may include unused capacity that is not part + /// of the returned slice. + /// + /// This function is mainly useful for data that lives for the remainder of + /// the program's life. Dropping the returned reference will cause a memory + /// leak. + /// + /// # Examples + /// + /// Simple usage: + /// + /// ``` + /// let x = vec![1, 2, 3]; + /// let static_ref: &'static mut [usize] = x.leak(); + /// static_ref[0] += 1; + /// assert_eq!(static_ref, &[2, 2, 3]); + /// ``` + #[inline(always)] + pub fn leak<'a>(self) -> &'a mut [T] + where + A: 'a, + { + let mut me = ManuallyDrop::new(self); + unsafe { slice::from_raw_parts_mut(me.as_mut_ptr(), me.len) } + } + + /// Returns the remaining spare capacity of the vector as a slice of + /// `MaybeUninit`. + /// + /// The returned slice can be used to fill the vector with data (e.g. by + /// reading from a file) before marking the data as initialized using the + /// [`set_len`] method. + /// + /// [`set_len`]: Vec::set_len + /// + /// # Examples + /// + /// ``` + /// // Allocate vector big enough for 10 elements. + /// let mut v = Vec::with_capacity(10); + /// + /// // Fill in the first 3 elements. + /// let uninit = v.spare_capacity_mut(); + /// uninit[0].write(0); + /// uninit[1].write(1); + /// uninit[2].write(2); + /// + /// // Mark the first 3 elements of the vector as being initialized. + /// unsafe { + /// v.set_len(3); + /// } + /// + /// assert_eq!(&v, &[0, 1, 2]); + /// ``` + #[inline(always)] + pub fn spare_capacity_mut(&mut self) -> &mut [MaybeUninit] { + // Note: + // This method is not implemented in terms of `split_at_spare_mut`, + // to prevent invalidation of pointers to the buffer. + unsafe { + slice::from_raw_parts_mut( + self.as_mut_ptr().add(self.len) as *mut MaybeUninit, + self.buf.capacity() - self.len, + ) + } + } + + /// Returns vector content as a slice of `T`, along with the remaining spare + /// capacity of the vector as a slice of `MaybeUninit`. + /// + /// The returned spare capacity slice can be used to fill the vector with data + /// (e.g. by reading from a file) before marking the data as initialized using + /// the [`set_len`] method. + /// + /// [`set_len`]: Vec::set_len + /// + /// Note that this is a low-level API, which should be used with care for + /// optimization purposes. If you need to append data to a `Vec` + /// you can use [`push`], [`extend`], [`extend_from_slice`], + /// [`extend_from_within`], [`insert`], [`append`], [`resize`] or + /// [`resize_with`], depending on your exact needs. + /// + /// [`push`]: Vec::push + /// [`extend`]: Vec::extend + /// [`extend_from_slice`]: Vec::extend_from_slice + /// [`extend_from_within`]: Vec::extend_from_within + /// [`insert`]: Vec::insert + /// [`append`]: Vec::append + /// [`resize`]: Vec::resize + /// [`resize_with`]: Vec::resize_with + /// + /// # Examples + /// + /// ``` + /// #![feature(vec_split_at_spare)] + /// + /// let mut v = vec![1, 1, 2]; + /// + /// // Reserve additional space big enough for 10 elements. + /// v.reserve(10); + /// + /// let (init, uninit) = v.split_at_spare_mut(); + /// let sum = init.iter().copied().sum::(); + /// + /// // Fill in the next 4 elements. + /// uninit[0].write(sum); + /// uninit[1].write(sum * 2); + /// uninit[2].write(sum * 3); + /// uninit[3].write(sum * 4); + /// + /// // Mark the 4 elements of the vector as being initialized. + /// unsafe { + /// let len = v.len(); + /// v.set_len(len + 4); + /// } + /// + /// assert_eq!(&v, &[1, 1, 2, 4, 8, 12, 16]); + /// ``` + #[inline(always)] + pub fn split_at_spare_mut(&mut self) -> (&mut [T], &mut [MaybeUninit]) { + // SAFETY: + // - len is ignored and so never changed + let (init, spare, _) = unsafe { self.split_at_spare_mut_with_len() }; + (init, spare) + } + + /// Safety: changing returned .2 (&mut usize) is considered the same as calling `.set_len(_)`. + /// + /// This method provides unique access to all vec parts at once in `extend_from_within`. + unsafe fn split_at_spare_mut_with_len( + &mut self, + ) -> (&mut [T], &mut [MaybeUninit], &mut usize) { + let ptr = self.as_mut_ptr(); + // SAFETY: + // - `ptr` is guaranteed to be valid for `self.len` elements + // - but the allocation extends out to `self.buf.capacity()` elements, possibly + // uninitialized + let spare_ptr = unsafe { ptr.add(self.len) }; + let spare_ptr = spare_ptr.cast::>(); + let spare_len = self.buf.capacity() - self.len; + + // SAFETY: + // - `ptr` is guaranteed to be valid for `self.len` elements + // - `spare_ptr` is pointing one element past the buffer, so it doesn't overlap with `initialized` + unsafe { + let initialized = slice::from_raw_parts_mut(ptr, self.len); + let spare = slice::from_raw_parts_mut(spare_ptr, spare_len); + + (initialized, spare, &mut self.len) + } + } +} + +impl Vec { + /// Resizes the `Vec` in-place so that `len` is equal to `new_len`. + /// + /// If `new_len` is greater than `len`, the `Vec` is extended by the + /// difference, with each additional slot filled with `value`. + /// If `new_len` is less than `len`, the `Vec` is simply truncated. + /// + /// This method requires `T` to implement [`Clone`], + /// in order to be able to clone the passed value. + /// If you need more flexibility (or want to rely on [`Default`] instead of + /// [`Clone`]), use [`Vec::resize_with`]. + /// If you only need to resize to a smaller size, use [`Vec::truncate`]. + /// + /// # Examples + /// + /// ``` + /// let mut vec = vec!["hello"]; + /// vec.resize(3, "world"); + /// assert_eq!(vec, ["hello", "world", "world"]); + /// + /// let mut vec = vec![1, 2, 3, 4]; + /// vec.resize(2, 0); + /// assert_eq!(vec, [1, 2]); + /// ``` + #[cfg(not(no_global_oom_handling))] + #[inline(always)] + pub fn resize(&mut self, new_len: usize, value: T) { + let len = self.len(); + + if new_len > len { + self.extend_with(new_len - len, ExtendElement(value)) + } else { + self.truncate(new_len); + } + } + + /// Clones and appends all elements in a slice to the `Vec`. + /// + /// Iterates over the slice `other`, clones each element, and then appends + /// it to this `Vec`. The `other` slice is traversed in-order. + /// + /// Note that this function is same as [`extend`] except that it is + /// specialized to work with slices instead. If and when Rust gets + /// specialization this function will likely be deprecated (but still + /// available). + /// + /// # Examples + /// + /// ``` + /// let mut vec = vec![1]; + /// vec.extend_from_slice(&[2, 3, 4]); + /// assert_eq!(vec, [1, 2, 3, 4]); + /// ``` + /// + /// [`extend`]: Vec::extend + #[cfg(not(no_global_oom_handling))] + #[inline(always)] + pub fn extend_from_slice(&mut self, other: &[T]) { + self.extend(other.iter().cloned()) + } + + /// Copies elements from `src` range to the end of the vector. + /// + /// # Panics + /// + /// Panics if the starting point is greater than the end point or if + /// the end point is greater than the length of the vector. + /// + /// # Examples + /// + /// ``` + /// let mut vec = vec![0, 1, 2, 3, 4]; + /// + /// vec.extend_from_within(2..); + /// assert_eq!(vec, [0, 1, 2, 3, 4, 2, 3, 4]); + /// + /// vec.extend_from_within(..2); + /// assert_eq!(vec, [0, 1, 2, 3, 4, 2, 3, 4, 0, 1]); + /// + /// vec.extend_from_within(4..8); + /// assert_eq!(vec, [0, 1, 2, 3, 4, 2, 3, 4, 0, 1, 4, 2, 3, 4]); + /// ``` + #[cfg(not(no_global_oom_handling))] + #[inline(always)] + pub fn extend_from_within(&mut self, src: R) + where + R: RangeBounds, + { + // let range = slice::range(src, ..self.len()); + + let _ = &self.as_slice()[(src.start_bound().cloned(), src.end_bound().cloned())]; + + let len = self.len(); + + let start: ops::Bound<&usize> = src.start_bound(); + let start = match start { + ops::Bound::Included(&start) => start, + ops::Bound::Excluded(start) => start + 1, + ops::Bound::Unbounded => 0, + }; + + let end: ops::Bound<&usize> = src.end_bound(); + let end = match end { + ops::Bound::Included(end) => end + 1, + ops::Bound::Excluded(&end) => end, + ops::Bound::Unbounded => len, + }; + + let range = start..end; + + self.reserve(range.len()); + + // SAFETY: + // - len is increased only after initializing elements + let (this, spare, len) = unsafe { self.split_at_spare_mut_with_len() }; + + // SAFETY: + // - caller guarantees that src is a valid index + let to_clone = unsafe { this.get_unchecked(range) }; + + iter::zip(to_clone, spare) + .map(|(src, dst)| dst.write(src.clone())) + // Note: + // - Element was just initialized with `MaybeUninit::write`, so it's ok to increase len + // - len is increased after each element to prevent leaks (see issue #82533) + .for_each(|_| *len += 1); + } +} + +impl Vec<[T; N], A> { + /// Takes a `Vec<[T; N]>` and flattens it into a `Vec`. + /// + /// # Panics + /// + /// Panics if the length of the resulting vector would overflow a `usize`. + /// + /// This is only possible when flattening a vector of arrays of zero-sized + /// types, and thus tends to be irrelevant in practice. If + /// `size_of::() > 0`, this will never panic. + /// + /// # Examples + /// + /// ``` + /// #![feature(slice_flatten)] + /// + /// let mut vec = vec![[1, 2, 3], [4, 5, 6], [7, 8, 9]]; + /// assert_eq!(vec.pop(), Some([7, 8, 9])); + /// + /// let mut flattened = vec.into_flattened(); + /// assert_eq!(flattened.pop(), Some(6)); + /// ``` + #[inline(always)] + pub fn into_flattened(self) -> Vec { + let (ptr, len, cap, alloc) = self.into_raw_parts_with_alloc(); + let (new_len, new_cap) = if size_of::() == 0 { + (len.checked_mul(N).expect("vec len overflow"), usize::MAX) + } else { + // SAFETY: + // - `cap * N` cannot overflow because the allocation is already in + // the address space. + // - Each `[T; N]` has `N` valid elements, so there are `len * N` + // valid elements in the allocation. + (len * N, cap * N) + }; + // SAFETY: + // - `ptr` was allocated by `self` + // - `ptr` is well-aligned because `[T; N]` has the same alignment as `T`. + // - `new_cap` refers to the same sized allocation as `cap` because + // `new_cap * size_of::()` == `cap * size_of::<[T; N]>()` + // - `len` <= `cap`, so `len * N` <= `cap * N`. + unsafe { Vec::::from_raw_parts_in(ptr.cast(), new_len, new_cap, alloc) } + } +} + +// This code generalizes `extend_with_{element,default}`. +trait ExtendWith { + fn next(&mut self) -> T; + fn last(self) -> T; +} + +struct ExtendElement(T); +impl ExtendWith for ExtendElement { + #[inline(always)] + fn next(&mut self) -> T { + self.0.clone() + } + + #[inline(always)] + fn last(self) -> T { + self.0 + } +} + +impl Vec { + #[cfg(not(no_global_oom_handling))] + #[inline(always)] + /// Extend the vector by `n` values, using the given generator. + fn extend_with>(&mut self, n: usize, mut value: E) { + self.reserve(n); + + unsafe { + let mut ptr = self.as_mut_ptr().add(self.len()); + // Use SetLenOnDrop to work around bug where compiler + // might not realize the store through `ptr` through self.set_len() + // don't alias. + let mut local_len = SetLenOnDrop::new(&mut self.len); + + // Write all elements except the last one + for _ in 1..n { + ptr::write(ptr, value.next()); + ptr = ptr.add(1); + // Increment the length in every step in case next() panics + local_len.increment_len(1); + } + + if n > 0 { + // We can write the last element directly without cloning needlessly + ptr::write(ptr, value.last()); + local_len.increment_len(1); + } + + // len set by scope guard + } + } +} + +impl Vec { + /// Removes consecutive repeated elements in the vector according to the + /// [`PartialEq`] trait implementation. + /// + /// If the vector is sorted, this removes all duplicates. + /// + /// # Examples + /// + /// ``` + /// let mut vec = vec![1, 2, 2, 3, 2]; + /// + /// vec.dedup(); + /// + /// assert_eq!(vec, [1, 2, 3, 2]); + /// ``` + #[inline(always)] + pub fn dedup(&mut self) { + self.dedup_by(|a, b| a == b) + } +} + +trait ExtendFromWithinSpec { + /// # Safety + /// + /// - `src` needs to be valid index + /// - `self.capacity() - self.len()` must be `>= src.len()` + unsafe fn spec_extend_from_within(&mut self, src: Range); +} + +// impl ExtendFromWithinSpec for Vec { +// default unsafe fn spec_extend_from_within(&mut self, src: Range) { +// // SAFETY: +// // - len is increased only after initializing elements +// let (this, spare, len) = unsafe { self.split_at_spare_mut_with_len() }; + +// // SAFETY: +// // - caller guarantees that src is a valid index +// let to_clone = unsafe { this.get_unchecked(src) }; + +// iter::zip(to_clone, spare) +// .map(|(src, dst)| dst.write(src.clone())) +// // Note: +// // - Element was just initialized with `MaybeUninit::write`, so it's ok to increase len +// // - len is increased after each element to prevent leaks (see issue #82533) +// .for_each(|_| *len += 1); +// } +// } + +impl ExtendFromWithinSpec for Vec { + #[inline(always)] + unsafe fn spec_extend_from_within(&mut self, src: Range) { + let count = src.len(); + { + let (init, spare) = self.split_at_spare_mut(); + + // SAFETY: + // - caller guarantees that `src` is a valid index + let source = unsafe { init.get_unchecked(src) }; + + // SAFETY: + // - Both pointers are created from unique slice references (`&mut [_]`) + // so they are valid and do not overlap. + // - Elements are :Copy so it's OK to copy them, without doing + // anything with the original values + // - `count` is equal to the len of `source`, so source is valid for + // `count` reads + // - `.reserve(count)` guarantees that `spare.len() >= count` so spare + // is valid for `count` writes + unsafe { ptr::copy_nonoverlapping(source.as_ptr(), spare.as_mut_ptr() as _, count) }; + } + + // SAFETY: + // - The elements were just initialized by `copy_nonoverlapping` + self.len += count; + } +} + +//////////////////////////////////////////////////////////////////////////////// +// Common trait implementations for Vec +//////////////////////////////////////////////////////////////////////////////// + +impl ops::Deref for Vec { + type Target = [T]; + + #[inline(always)] + fn deref(&self) -> &[T] { + unsafe { slice::from_raw_parts(self.as_ptr(), self.len) } + } +} + +impl ops::DerefMut for Vec { + #[inline(always)] + fn deref_mut(&mut self) -> &mut [T] { + unsafe { slice::from_raw_parts_mut(self.as_mut_ptr(), self.len) } + } +} + +#[cfg(not(no_global_oom_handling))] +impl Clone for Vec { + #[inline(always)] + fn clone(&self) -> Self { + let alloc = self.allocator().clone(); + let mut vec = Vec::with_capacity_in(self.len(), alloc); + vec.extend_from_slice(self); + vec + } + + #[inline(always)] + fn clone_from(&mut self, other: &Self) { + // drop anything that will not be overwritten + self.truncate(other.len()); + + // self.len <= other.len due to the truncate above, so the + // slices here are always in-bounds. + let (init, tail) = other.split_at(self.len()); + + // reuse the contained values' allocations/resources. + self.clone_from_slice(init); + self.extend_from_slice(tail); + } +} + +/// The hash of a vector is the same as that of the corresponding slice, +/// as required by the `core::borrow::Borrow` implementation. +/// +/// ``` +/// #![feature(build_hasher_simple_hash_one)] +/// use std::hash::BuildHasher; +/// +/// let b = std::collections::hash_map::RandomState::new(); +/// let v: Vec = vec![0xa8, 0x3c, 0x09]; +/// let s: &[u8] = &[0xa8, 0x3c, 0x09]; +/// assert_eq!(b.hash_one(v), b.hash_one(s)); +/// ``` +impl Hash for Vec { + #[inline(always)] + fn hash(&self, state: &mut H) { + Hash::hash(&**self, state) + } +} + +impl, A: Allocator> Index for Vec { + type Output = I::Output; + + #[inline(always)] + fn index(&self, index: I) -> &Self::Output { + Index::index(&**self, index) + } +} + +impl, A: Allocator> IndexMut for Vec { + #[inline(always)] + fn index_mut(&mut self, index: I) -> &mut Self::Output { + IndexMut::index_mut(&mut **self, index) + } +} + +#[cfg(not(no_global_oom_handling))] +impl FromIterator for Vec { + #[inline(always)] + fn from_iter>(iter: I) -> Vec { + let mut vec = Vec::new(); + vec.extend(iter); + vec + } +} + +impl IntoIterator for Vec { + type Item = T; + type IntoIter = IntoIter; + + /// Creates a consuming iterator, that is, one that moves each value out of + /// the vector (from start to end). The vector cannot be used after calling + /// this. + /// + /// # Examples + /// + /// ``` + /// let v = vec!["a".to_string(), "b".to_string()]; + /// let mut v_iter = v.into_iter(); + /// + /// let first_element: Option = v_iter.next(); + /// + /// assert_eq!(first_element, Some("a".to_string())); + /// assert_eq!(v_iter.next(), Some("b".to_string())); + /// assert_eq!(v_iter.next(), None); + /// ``` + #[inline(always)] + fn into_iter(self) -> Self::IntoIter { + unsafe { + let mut me = ManuallyDrop::new(self); + let alloc = ManuallyDrop::new(ptr::read(me.allocator())); + let begin = me.as_mut_ptr(); + let end = if size_of::() == 0 { + begin.cast::().wrapping_add(me.len()).cast() + } else { + begin.add(me.len()) as *const T + }; + let cap = me.buf.capacity(); + IntoIter { + buf: NonNull::new_unchecked(begin), + phantom: PhantomData, + cap, + alloc, + ptr: begin, + end, + } + } + } +} + +impl<'a, T, A: Allocator> IntoIterator for &'a Vec { + type Item = &'a T; + type IntoIter = slice::Iter<'a, T>; + + #[inline(always)] + fn into_iter(self) -> Self::IntoIter { + self.iter() + } +} + +impl<'a, T, A: Allocator> IntoIterator for &'a mut Vec { + type Item = &'a mut T; + type IntoIter = slice::IterMut<'a, T>; + + fn into_iter(self) -> Self::IntoIter { + self.iter_mut() + } +} + +#[cfg(not(no_global_oom_handling))] +impl Extend for Vec { + #[inline(always)] + fn extend>(&mut self, iter: I) { + // This is the case for a general iter. + // + // This function should be the moral equivalent of: + // + // for item in iter { + // self.push(item); + // } + + let mut iter = iter.into_iter(); + while let Some(element) = iter.next() { + let len = self.len(); + if len == self.capacity() { + let (lower, _) = iter.size_hint(); + self.reserve(lower.saturating_add(1)); + } + unsafe { + ptr::write(self.as_mut_ptr().add(len), element); + // Since next() executes user code which can panic we have to bump the length + // after each step. + // NB can't overflow since we would have had to alloc the address space + self.set_len(len + 1); + } + } + } +} + +impl Vec { + /// Creates a splicing iterator that replaces the specified range in the vector + /// with the given `replace_with` iterator and yields the removed items. + /// `replace_with` does not need to be the same length as `range`. + /// + /// `range` is removed even if the iterator is not consumed until the end. + /// + /// It is unspecified how many elements are removed from the vector + /// if the `Splice` value is leaked. + /// + /// The input iterator `replace_with` is only consumed when the `Splice` value is dropped. + /// + /// This is optimal if: + /// + /// * The tail (elements in the vector after `range`) is empty, + /// * or `replace_with` yields fewer or equal elements than `range`’s length + /// * or the lower bound of its `size_hint()` is exact. + /// + /// Otherwise, a temporary vector is allocated and the tail is moved twice. + /// + /// # Panics + /// + /// Panics if the starting point is greater than the end point or if + /// the end point is greater than the length of the vector. + /// + /// # Examples + /// + /// ``` + /// let mut v = vec![1, 2, 3, 4]; + /// let new = [7, 8, 9]; + /// let u: Vec<_> = v.splice(1..3, new).collect(); + /// assert_eq!(v, &[1, 7, 8, 9, 4]); + /// assert_eq!(u, &[2, 3]); + /// ``` + #[cfg(not(no_global_oom_handling))] + #[inline(always)] + pub fn splice(&mut self, range: R, replace_with: I) -> Splice<'_, I::IntoIter, A> + where + R: RangeBounds, + I: IntoIterator, + { + Splice { + drain: self.drain(range), + replace_with: replace_with.into_iter(), + } + } +} + +/// Extend implementation that copies elements out of references before pushing them onto the Vec. +/// +/// This implementation is specialized for slice iterators, where it uses [`copy_from_slice`] to +/// append the entire slice at once. +/// +/// [`copy_from_slice`]: slice::copy_from_slice +#[cfg(not(no_global_oom_handling))] +impl<'a, T: Copy + 'a, A: Allocator + 'a> Extend<&'a T> for Vec { + #[inline(always)] + fn extend>(&mut self, iter: I) { + let mut iter = iter.into_iter(); + while let Some(element) = iter.next() { + let len = self.len(); + if len == self.capacity() { + let (lower, _) = iter.size_hint(); + self.reserve(lower.saturating_add(1)); + } + unsafe { + ptr::write(self.as_mut_ptr().add(len), *element); + // Since next() executes user code which can panic we have to bump the length + // after each step. + // NB can't overflow since we would have had to alloc the address space + self.set_len(len + 1); + } + } + } +} + +/// Implements comparison of vectors, [lexicographically](core::cmp::Ord#lexicographical-comparison). +impl PartialOrd for Vec { + #[inline(always)] + fn partial_cmp(&self, other: &Self) -> Option { + PartialOrd::partial_cmp(&**self, &**other) + } +} + +impl Eq for Vec {} + +/// Implements ordering of vectors, [lexicographically](core::cmp::Ord#lexicographical-comparison). +impl Ord for Vec { + #[inline(always)] + fn cmp(&self, other: &Self) -> Ordering { + Ord::cmp(&**self, &**other) + } +} + +impl Drop for Vec { + #[inline(always)] + fn drop(&mut self) { + unsafe { + // use drop for [T] + // use a raw slice to refer to the elements of the vector as weakest necessary type; + // could avoid questions of validity in certain cases + ptr::drop_in_place(ptr::slice_from_raw_parts_mut(self.as_mut_ptr(), self.len)) + } + // RawVec handles deallocation + } +} + +impl Default for Vec { + /// Creates an empty `Vec`. + /// + /// The vector will not allocate until elements are pushed onto it. + #[inline(always)] + fn default() -> Vec { + Vec::new() + } +} + +impl fmt::Debug for Vec { + #[inline(always)] + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + fmt::Debug::fmt(&**self, f) + } +} + +impl AsRef> for Vec { + #[inline(always)] + fn as_ref(&self) -> &Vec { + self + } +} + +impl AsMut> for Vec { + #[inline(always)] + fn as_mut(&mut self) -> &mut Vec { + self + } +} + +impl AsRef<[T]> for Vec { + #[inline(always)] + fn as_ref(&self) -> &[T] { + self + } +} + +impl AsMut<[T]> for Vec { + #[inline(always)] + fn as_mut(&mut self) -> &mut [T] { + self + } +} + +#[cfg(not(no_global_oom_handling))] +impl From<&[T]> for Vec { + /// Allocate a `Vec` and fill it by cloning `s`'s items. + /// + /// # Examples + /// + /// ``` + /// assert_eq!(Vec::from(&[1, 2, 3][..]), vec![1, 2, 3]); + /// ``` + #[inline(always)] + fn from(s: &[T]) -> Vec { + let mut vec = Vec::with_capacity(s.len()); + vec.extend_from_slice(s); + vec + } +} + +#[cfg(not(no_global_oom_handling))] +impl From<&mut [T]> for Vec { + /// Allocate a `Vec` and fill it by cloning `s`'s items. + /// + /// # Examples + /// + /// ``` + /// assert_eq!(Vec::from(&mut [1, 2, 3][..]), vec![1, 2, 3]); + /// ``` + #[inline(always)] + fn from(s: &mut [T]) -> Vec { + let mut vec = Vec::with_capacity(s.len()); + vec.extend_from_slice(s); + vec + } +} + +#[cfg(not(no_global_oom_handling))] +impl From<[T; N]> for Vec { + #[inline(always)] + fn from(s: [T; N]) -> Vec { + Box::slice(Box::new(s)).into_vec() + } +} + +impl From> for Vec { + /// Convert a boxed slice into a vector by transferring ownership of + /// the existing heap allocation. + /// + /// # Examples + /// + /// ``` + /// let b: Box<[i32]> = vec![1, 2, 3].into_boxed_slice(); + /// assert_eq!(Vec::from(b), vec![1, 2, 3]); + /// ``` + #[inline(always)] + fn from(s: Box<[T], A>) -> Self { + s.into_vec() + } +} + +impl From> for Vec { + /// Convert a boxed array into a vector by transferring ownership of + /// the existing heap allocation. + /// + /// # Examples + /// + /// ``` + /// let b: Box<[i32; 3]> = Box::new([1, 2, 3]); + /// assert_eq!(Vec::from(b), vec![1, 2, 3]); + /// ``` + #[inline(always)] + fn from(s: Box<[T; N], A>) -> Self { + s.into_vec() + } +} + +// note: test pulls in libstd, which causes errors here +#[cfg(not(no_global_oom_handling))] +impl From> for Box<[T], A> { + /// Convert a vector into a boxed slice. + /// + /// If `v` has excess capacity, its items will be moved into a + /// newly-allocated buffer with exactly the right capacity. + /// + /// # Examples + /// + /// ``` + /// assert_eq!(Box::from(vec![1, 2, 3]), vec![1, 2, 3].into_boxed_slice()); + /// ``` + /// + /// Any excess capacity is removed: + /// ``` + /// let mut vec = Vec::with_capacity(10); + /// vec.extend([1, 2, 3]); + /// + /// assert_eq!(Box::from(vec), vec![1, 2, 3].into_boxed_slice()); + /// ``` + #[inline(always)] + fn from(v: Vec) -> Self { + v.into_boxed_slice() + } +} + +#[cfg(not(no_global_oom_handling))] +impl From<&str> for Vec { + /// Allocate a `Vec` and fill it with a UTF-8 string. + /// + /// # Examples + /// + /// ``` + /// assert_eq!(Vec::from("123"), vec![b'1', b'2', b'3']); + /// ``` + #[inline(always)] + fn from(s: &str) -> Vec { + From::from(s.as_bytes()) + } +} + +impl TryFrom> for [T; N] { + type Error = Vec; + + /// Gets the entire contents of the `Vec` as an array, + /// if its size exactly matches that of the requested array. + /// + /// # Examples + /// + /// ``` + /// assert_eq!(vec![1, 2, 3].try_into(), Ok([1, 2, 3])); + /// assert_eq!(>::new().try_into(), Ok([])); + /// ``` + /// + /// If the length doesn't match, the input comes back in `Err`: + /// ``` + /// let r: Result<[i32; 4], _> = (0..10).collect::>().try_into(); + /// assert_eq!(r, Err(vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9])); + /// ``` + /// + /// If you're fine with just getting a prefix of the `Vec`, + /// you can call [`.truncate(N)`](Vec::truncate) first. + /// ``` + /// let mut v = String::from("hello world").into_bytes(); + /// v.sort(); + /// v.truncate(2); + /// let [a, b]: [_; 2] = v.try_into().unwrap(); + /// assert_eq!(a, b' '); + /// assert_eq!(b, b'd'); + /// ``` + #[inline(always)] + fn try_from(mut vec: Vec) -> Result<[T; N], Vec> { + if vec.len() != N { + return Err(vec); + } + + // SAFETY: `.set_len(0)` is always sound. + unsafe { vec.set_len(0) }; + + // SAFETY: A `Vec`'s pointer is always aligned properly, and + // the alignment the array needs is the same as the items. + // We checked earlier that we have sufficient items. + // The items will not double-drop as the `set_len` + // tells the `Vec` not to also drop them. + let array = unsafe { ptr::read(vec.as_ptr() as *const [T; N]) }; + Ok(array) + } +} + +#[inline(always)] +#[cfg(not(no_global_oom_handling))] +#[doc(hidden)] +pub fn from_elem_in(elem: T, n: usize, alloc: A) -> Vec { + let mut v = Vec::with_capacity_in(n, alloc); + v.extend_with(n, ExtendElement(elem)); + v +} + +#[inline(always)] +#[cfg(not(no_global_oom_handling))] +#[doc(hidden)] +pub fn from_elem(elem: T, n: usize) -> Vec { + let mut v = Vec::with_capacity(n); + v.extend_with(n, ExtendElement(elem)); + v +} + +#[cfg(feature = "serde")] +impl serde::Serialize for Vec +where + T: serde::Serialize, + A: Allocator, +{ + #[inline(always)] + fn serialize(&self, serializer: S) -> Result + where + S: serde::ser::Serializer, + { + serializer.collect_seq(self) + } +} + +#[cfg(feature = "serde")] +impl<'de, T, A> serde::de::Deserialize<'de> for Vec +where + T: serde::de::Deserialize<'de>, + A: Allocator + Default, +{ + #[inline(always)] + fn deserialize(deserializer: D) -> Result + where + D: serde::de::Deserializer<'de>, + { + struct VecVisitor { + marker: PhantomData<(T, A)>, + } + + impl<'de, T, A> serde::de::Visitor<'de> for VecVisitor + where + T: serde::de::Deserialize<'de>, + A: Allocator + Default, + { + type Value = Vec; + + fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + formatter.write_str("a sequence") + } + + fn visit_seq(self, mut seq: S) -> Result + where + S: serde::de::SeqAccess<'de>, + { + let mut values = Vec::with_capacity_in(cautious(seq.size_hint()), A::default()); + + while let Some(value) = seq.next_element()? { + values.push(value); + } + + Ok(values) + } + } + + let visitor = VecVisitor { + marker: PhantomData, + }; + deserializer.deserialize_seq(visitor) + } + + #[inline(always)] + fn deserialize_in_place(deserializer: D, place: &mut Self) -> Result<(), D::Error> + where + D: serde::de::Deserializer<'de>, + { + struct VecInPlaceVisitor<'a, T: 'a, A: Allocator + 'a>(&'a mut Vec); + + impl<'a, 'de, T, A> serde::de::Visitor<'de> for VecInPlaceVisitor<'a, T, A> + where + T: serde::de::Deserialize<'de>, + A: Allocator + Default, + { + type Value = (); + + fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + formatter.write_str("a sequence") + } + + fn visit_seq(self, mut seq: S) -> Result + where + S: serde::de::SeqAccess<'de>, + { + let hint = cautious(seq.size_hint()); + if let Some(additional) = hint.checked_sub(self.0.len()) { + self.0.reserve(additional); + } + + for i in 0..self.0.len() { + let next = { + let next_place = InPlaceSeed(&mut self.0[i]); + seq.next_element_seed(next_place)? + }; + if next.is_none() { + self.0.truncate(i); + return Ok(()); + } + } + + while let Some(value) = seq.next_element()? { + self.0.push(value); + } + + Ok(()) + } + } + + deserializer.deserialize_seq(VecInPlaceVisitor(place)) + } +} + +#[cfg(feature = "serde")] +pub fn cautious(hint: Option) -> usize { + cmp::min(hint.unwrap_or(0), 4096) +} + +/// A DeserializeSeed helper for implementing deserialize_in_place Visitors. +/// +/// Wraps a mutable reference and calls deserialize_in_place on it. + +#[cfg(feature = "serde")] +pub struct InPlaceSeed<'a, T: 'a>(pub &'a mut T); + +#[cfg(feature = "serde")] +impl<'a, 'de, T> serde::de::DeserializeSeed<'de> for InPlaceSeed<'a, T> +where + T: serde::de::Deserialize<'de>, +{ + type Value = (); + fn deserialize(self, deserializer: D) -> Result + where + D: serde::de::Deserializer<'de>, + { + T::deserialize_in_place(deserializer, self.0) + } +} diff -Nru temporalio-1.3.0/vendor/allocator-api2/src/stable/vec/partial_eq.rs temporalio-1.3.0/vendor/allocator-api2/src/stable/vec/partial_eq.rs --- temporalio-1.3.0/vendor/allocator-api2/src/stable/vec/partial_eq.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/allocator-api2/src/stable/vec/partial_eq.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,43 @@ +#[cfg(not(no_global_oom_handling))] +use alloc_crate::borrow::Cow; + +use crate::stable::alloc::Allocator; + +use super::Vec; + +macro_rules! __impl_slice_eq1 { + ([$($vars:tt)*] $lhs:ty, $rhs:ty $(where $ty:ty: $bound:ident)?) => { + impl PartialEq<$rhs> for $lhs + where + T: PartialEq, + $($ty: $bound)? + { + #[inline(always)] + fn eq(&self, other: &$rhs) -> bool { self[..] == other[..] } + #[inline(always)] + fn ne(&self, other: &$rhs) -> bool { self[..] != other[..] } + } + } +} + +__impl_slice_eq1! { [A1: Allocator, A2: Allocator] Vec, Vec } +__impl_slice_eq1! { [A: Allocator] Vec, &[U] } +__impl_slice_eq1! { [A: Allocator] Vec, &mut [U] } +__impl_slice_eq1! { [A: Allocator] &[T], Vec } +__impl_slice_eq1! { [A: Allocator] &mut [T], Vec } +__impl_slice_eq1! { [A: Allocator] Vec, [U] } +__impl_slice_eq1! { [A: Allocator] [T], Vec } +#[cfg(not(no_global_oom_handling))] +__impl_slice_eq1! { [A: Allocator] Cow<'_, [T]>, Vec where T: Clone } +__impl_slice_eq1! { [A: Allocator, const N: usize] Vec, [U; N] } +__impl_slice_eq1! { [A: Allocator, const N: usize] Vec, &[U; N] } + +// NOTE: some less important impls are omitted to reduce code bloat +// FIXME(Centril): Reconsider this? +//__impl_slice_eq1! { [const N: usize] Vec, &mut [B; N], } +//__impl_slice_eq1! { [const N: usize] [A; N], Vec, } +//__impl_slice_eq1! { [const N: usize] &[A; N], Vec, } +//__impl_slice_eq1! { [const N: usize] &mut [A; N], Vec, } +//__impl_slice_eq1! { [const N: usize] Cow<'a, [A]>, [B; N], } +//__impl_slice_eq1! { [const N: usize] Cow<'a, [A]>, &[B; N], } +//__impl_slice_eq1! { [const N: usize] Cow<'a, [A]>, &mut [B; N], } diff -Nru temporalio-1.3.0/vendor/allocator-api2/src/stable/vec/set_len_on_drop.rs temporalio-1.3.0/vendor/allocator-api2/src/stable/vec/set_len_on_drop.rs --- temporalio-1.3.0/vendor/allocator-api2/src/stable/vec/set_len_on_drop.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/allocator-api2/src/stable/vec/set_len_on_drop.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,31 @@ +// Set the length of the vec when the `SetLenOnDrop` value goes out of scope. +// +// The idea is: The length field in SetLenOnDrop is a local variable +// that the optimizer will see does not alias with any stores through the Vec's data +// pointer. This is a workaround for alias analysis issue #32155 +pub(super) struct SetLenOnDrop<'a> { + len: &'a mut usize, + local_len: usize, +} + +impl<'a> SetLenOnDrop<'a> { + #[inline(always)] + pub(super) fn new(len: &'a mut usize) -> Self { + SetLenOnDrop { + local_len: *len, + len, + } + } + + #[inline(always)] + pub(super) fn increment_len(&mut self, increment: usize) { + self.local_len += increment; + } +} + +impl Drop for SetLenOnDrop<'_> { + #[inline(always)] + fn drop(&mut self) { + *self.len = self.local_len; + } +} diff -Nru temporalio-1.3.0/vendor/allocator-api2/src/stable/vec/splice.rs temporalio-1.3.0/vendor/allocator-api2/src/stable/vec/splice.rs --- temporalio-1.3.0/vendor/allocator-api2/src/stable/vec/splice.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/allocator-api2/src/stable/vec/splice.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,135 @@ +use core::ptr::{self}; +use core::slice::{self}; + +use crate::stable::alloc::{Allocator, Global}; + +use super::{Drain, Vec}; + +/// A splicing iterator for `Vec`. +/// +/// This struct is created by [`Vec::splice()`]. +/// See its documentation for more. +/// +/// # Example +/// +/// ``` +/// let mut v = vec![0, 1, 2]; +/// let new = [7, 8]; +/// let iter: std::vec::Splice<_> = v.splice(1.., new); +/// ``` +#[derive(Debug)] +pub struct Splice<'a, I: Iterator + 'a, A: Allocator + 'a = Global> { + pub(super) drain: Drain<'a, I::Item, A>, + pub(super) replace_with: I, +} + +impl Iterator for Splice<'_, I, A> { + type Item = I::Item; + + #[inline(always)] + fn next(&mut self) -> Option { + self.drain.next() + } + + #[inline(always)] + fn size_hint(&self) -> (usize, Option) { + self.drain.size_hint() + } +} + +impl DoubleEndedIterator for Splice<'_, I, A> { + #[inline(always)] + fn next_back(&mut self) -> Option { + self.drain.next_back() + } +} + +impl ExactSizeIterator for Splice<'_, I, A> {} + +impl Drop for Splice<'_, I, A> { + #[inline] + fn drop(&mut self) { + self.drain.by_ref().for_each(drop); + + unsafe { + if self.drain.tail_len == 0 { + self.drain.vec.as_mut().extend(self.replace_with.by_ref()); + return; + } + + // First fill the range left by drain(). + if !self.drain.fill(&mut self.replace_with) { + return; + } + + // There may be more elements. Use the lower bound as an estimate. + // FIXME: Is the upper bound a better guess? Or something else? + let (lower_bound, _upper_bound) = self.replace_with.size_hint(); + if lower_bound > 0 { + self.drain.move_tail(lower_bound); + if !self.drain.fill(&mut self.replace_with) { + return; + } + } + + // Collect any remaining elements. + // This is a zero-length vector which does not allocate if `lower_bound` was exact. + let mut collected = self + .replace_with + .by_ref() + .collect::>() + .into_iter(); + // Now we have an exact count. + if collected.len() > 0 { + self.drain.move_tail(collected.len()); + let filled = self.drain.fill(&mut collected); + debug_assert!(filled); + debug_assert_eq!(collected.len(), 0); + } + } + // Let `Drain::drop` move the tail back if necessary and restore `vec.len`. + } +} + +/// Private helper methods for `Splice::drop` +impl Drain<'_, T, A> { + /// The range from `self.vec.len` to `self.tail_start` contains elements + /// that have been moved out. + /// Fill that range as much as possible with new elements from the `replace_with` iterator. + /// Returns `true` if we filled the entire range. (`replace_with.next()` didn’t return `None`.) + #[inline(always)] + unsafe fn fill>(&mut self, replace_with: &mut I) -> bool { + let vec = unsafe { self.vec.as_mut() }; + let range_start = vec.len; + let range_end = self.tail_start; + let range_slice = unsafe { + slice::from_raw_parts_mut(vec.as_mut_ptr().add(range_start), range_end - range_start) + }; + + for place in range_slice { + if let Some(new_item) = replace_with.next() { + unsafe { ptr::write(place, new_item) }; + vec.len += 1; + } else { + return false; + } + } + true + } + + /// Makes room for inserting more elements before the tail. + #[inline(always)] + unsafe fn move_tail(&mut self, additional: usize) { + let vec = unsafe { self.vec.as_mut() }; + let len = self.tail_start + self.tail_len; + vec.buf.reserve(len, additional); + + let new_tail_start = self.tail_start + additional; + unsafe { + let src = vec.as_ptr().add(self.tail_start); + let dst = vec.as_mut_ptr().add(new_tail_start); + ptr::copy(src, dst, self.tail_len); + } + self.tail_start = new_tail_start; + } +} diff -Nru temporalio-1.3.0/vendor/android-tzdata/.cargo-checksum.json temporalio-1.3.0/vendor/android-tzdata/.cargo-checksum.json --- temporalio-1.3.0/vendor/android-tzdata/.cargo-checksum.json 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/android-tzdata/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1 @@ +{"files":{"Cargo.toml":"a87d9acc9827a50c7a96a88720c5dd055cbc08b1144dff95bd572ff977d4a79a","LICENSE-APACHE":"4458503dd48e88c4e0b945fb252a08b93c40ec757309b8ffa7c594dfa1e35104","LICENSE-MIT":"002c2696d92b5c8cf956c11072baa58eaf9f6ade995c031ea635c6a1ee342ad1","README.md":"6dfe0c602dc61eebe118900ed66a2c1f7887b9fe95b36e1c2974c4e8fa7ebd4b","src/lib.rs":"8f421233df83f82e737930ca8a2ad254966334183148bcc170f9c405df230de2","src/tzdata.rs":"78920925b04219910511e9a1f036f468cd2925c0054f280d6a00b106529046e7"},"package":"e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/android-tzdata/Cargo.toml temporalio-1.3.0/vendor/android-tzdata/Cargo.toml --- temporalio-1.3.0/vendor/android-tzdata/Cargo.toml 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/android-tzdata/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,34 @@ +# 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 = "android-tzdata" +version = "0.1.1" +authors = ["RumovZ"] +include = [ + "src/**/*", + "LICENSE-*", + "README.md", +] +description = "Parser for the Android-specific tzdata file" +readme = "README.md" +keywords = [ + "parser", + "android", + "timezone", +] +categories = ["date-and-time"] +license = "MIT OR Apache-2.0" +repository = "https://github.com/RumovZ/android-tzdata" + +[dev-dependencies.zip] +version = "0.6.4" diff -Nru temporalio-1.3.0/vendor/android-tzdata/LICENSE-APACHE temporalio-1.3.0/vendor/android-tzdata/LICENSE-APACHE --- temporalio-1.3.0/vendor/android-tzdata/LICENSE-APACHE 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/android-tzdata/LICENSE-APACHE 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff -Nru temporalio-1.3.0/vendor/android-tzdata/LICENSE-MIT temporalio-1.3.0/vendor/android-tzdata/LICENSE-MIT --- temporalio-1.3.0/vendor/android-tzdata/LICENSE-MIT 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/android-tzdata/LICENSE-MIT 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) [year] [fullname] + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff -Nru temporalio-1.3.0/vendor/android-tzdata/README.md temporalio-1.3.0/vendor/android-tzdata/README.md --- temporalio-1.3.0/vendor/android-tzdata/README.md 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/android-tzdata/README.md 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,20 @@ +# android-tzdata + +Parser for the Android-specific tzdata file. + +## License + +Licensed under either of + +- Apache License, Version 2.0 + ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0) +- MIT license + ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT) + +at your option. + +## Contribution + +Unless you explicitly state otherwise, any contribution intentionally submitted +for inclusion in the work by you, as defined in the Apache-2.0 license, shall be +dual licensed as above, without any additional terms or conditions. diff -Nru temporalio-1.3.0/vendor/android-tzdata/src/lib.rs temporalio-1.3.0/vendor/android-tzdata/src/lib.rs --- temporalio-1.3.0/vendor/android-tzdata/src/lib.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/android-tzdata/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,29 @@ +//! Parser for the Android-specific tzdata file. + +mod tzdata; + +/// Tries to locate the `tzdata` file, parse it, and return the entry for the +/// requested time zone. +/// +/// # Errors +/// +/// Returns an [std::io::Error] if the `tzdata` file cannot be found and parsed, or +/// if it does not contain the requested timezone entry. +/// +/// # Example +/// +/// ```rust +/// # use std::error::Error; +/// # use android_tzdata::find_tz_data; +/// # +/// # fn main() -> Result<(), Box> { +/// let tz_data = find_tz_data("Europe/Kiev")?; +/// // Check it's version 2 of the [Time Zone Information Format](https://www.ietf.org/archive/id/draft-murchison-rfc8536bis-02.html). +/// assert!(tz_data.starts_with(b"TZif2")); +/// # Ok(()) +/// # } +/// ``` +pub fn find_tz_data(tz_name: impl AsRef) -> Result, std::io::Error> { + let mut file = tzdata::find_file()?; + tzdata::find_tz_data_in_file(&mut file, tz_name.as_ref()) +} diff -Nru temporalio-1.3.0/vendor/android-tzdata/src/tzdata.rs temporalio-1.3.0/vendor/android-tzdata/src/tzdata.rs --- temporalio-1.3.0/vendor/android-tzdata/src/tzdata.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/android-tzdata/src/tzdata.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,166 @@ +//! Logic was mainly ported from https://android.googlesource.com/platform/libcore/+/jb-mr2-release/luni/src/main/java/libcore/util/ZoneInfoDB.java + +use core::{cmp::Ordering, convert::TryInto}; +use std::{ + fs::File, + io::{self, ErrorKind, Read, Seek, SeekFrom}, +}; + +// The database uses 32-bit (4 byte) integers. +const TZ_INT_SIZE: usize = 4; +// The first 12 bytes contain a special version string. +const MAGIC_SIZE: usize = 12; +const HEADER_SIZE: usize = MAGIC_SIZE + 3 * TZ_INT_SIZE; +// The database reserves 40 bytes for each id. +const TZ_NAME_SIZE: usize = 40; +const INDEX_ENTRY_SIZE: usize = TZ_NAME_SIZE + 3 * TZ_INT_SIZE; +const TZDATA_LOCATIONS: [TzdataLocation; 2] = [ + TzdataLocation { + env_var: "ANDROID_DATA", + path: "/misc/zoneinfo/", + }, + TzdataLocation { + env_var: "ANDROID_ROOT", + path: "/usr/share/zoneinfo/", + }, +]; + +#[derive(Debug)] +struct TzdataLocation { + env_var: &'static str, + path: &'static str, +} + +#[derive(Debug, Clone, Copy)] +struct Header { + index_offset: usize, + data_offset: usize, + _zonetab_offset: usize, +} + +#[derive(Debug)] +struct Index(Vec); + +#[derive(Debug, Clone, Copy)] +struct IndexEntry<'a> { + _name: &'a [u8], + offset: usize, + length: usize, + _raw_utc_offset: usize, +} + +pub(super) fn find_file() -> Result { + for location in &TZDATA_LOCATIONS { + if let Ok(env_value) = std::env::var(location.env_var) { + if let Ok(file) = File::open(format!("{}{}tzdata", env_value, location.path)) { + return Ok(file); + } + } + } + Err(io::Error::from(io::ErrorKind::NotFound)) +} + +pub(super) fn find_tz_data_in_file( + mut file: impl Read + Seek, + tz_name: &str, +) -> Result, io::Error> { + let header = Header::new(&mut file)?; + let index = Index::new(&mut file, header)?; + if let Some(entry) = index.find_entry(tz_name) { + file.seek(SeekFrom::Start((entry.offset + header.data_offset) as u64))?; + let mut tz_data = vec![0u8; entry.length]; + file.read_exact(&mut tz_data)?; + Ok(tz_data) + } else { + Err(io::Error::from(ErrorKind::NotFound)) + } +} + +impl Header { + fn new(mut file: impl Read + Seek) -> Result { + let mut buf = [0; HEADER_SIZE]; + file.read_exact(&mut buf)?; + if !buf.starts_with(b"tzdata") || buf[MAGIC_SIZE - 1] != 0u8 { + return Err(io::Error::new( + io::ErrorKind::InvalidData, + "invalid magic number", + )); + } + Ok(Self { + index_offset: parse_tz_int(&buf, MAGIC_SIZE) as usize, + data_offset: parse_tz_int(&buf, MAGIC_SIZE + TZ_INT_SIZE) as usize, + _zonetab_offset: parse_tz_int(&buf, MAGIC_SIZE + 2 * TZ_INT_SIZE) as usize, + }) + } +} + +impl Index { + fn new(mut file: impl Read + Seek, header: Header) -> Result { + file.seek(SeekFrom::Start(header.index_offset as u64))?; + let size = header.data_offset - header.index_offset; + let mut bytes = vec![0; size]; + file.read_exact(&mut bytes)?; + Ok(Self(bytes)) + } + + fn find_entry(&self, name: &str) -> Option { + let name_bytes = name.as_bytes(); + let name_len = name_bytes.len(); + if name_len > TZ_NAME_SIZE { + return None; + } + + let zeros = [0u8; TZ_NAME_SIZE]; + let cmp = |chunk: &&[u8]| -> Ordering { + // tz names always have TZ_NAME_SIZE bytes and are right-padded with 0s + // so we check that a chunk starts with `name` and the remaining bytes are 0 + chunk[..name_len] + .cmp(name_bytes) + .then_with(|| chunk[name_len..TZ_NAME_SIZE].cmp(&zeros[name_len..])) + }; + + let chunks: Vec<_> = self.0.chunks_exact(INDEX_ENTRY_SIZE).collect(); + chunks + .binary_search_by(cmp) + .map(|idx| IndexEntry::new(chunks[idx])) + .ok() + } +} + +impl<'a> IndexEntry<'a> { + fn new(bytes: &'a [u8]) -> Self { + Self { + _name: bytes[..TZ_NAME_SIZE] + .splitn(2, |&b| b == 0u8) + .next() + .unwrap(), + offset: parse_tz_int(bytes, TZ_NAME_SIZE) as usize, + length: parse_tz_int(bytes, TZ_NAME_SIZE + TZ_INT_SIZE) as usize, + _raw_utc_offset: parse_tz_int(bytes, TZ_NAME_SIZE + 2 * TZ_INT_SIZE) as usize, + } + } +} + +/// Panics if slice does not contain [TZ_INT_SIZE] bytes beginning at start. +fn parse_tz_int(slice: &[u8], start: usize) -> u32 { + u32::from_be_bytes(slice[start..start + TZ_INT_SIZE].try_into().unwrap()) +} + +#[cfg(test)] +mod test { + use super::*; + use std::fs::File; + use std::io::Cursor; + + #[test] + fn parse() { + let mut archive = File::open("tests/resources/tzdata.zip").unwrap(); + let mut zip = zip::ZipArchive::new(&mut archive).unwrap(); + let mut file = zip.by_index(0).unwrap(); + let mut data = Vec::new(); + file.read_to_end(&mut data).unwrap(); + let cursor = Cursor::new(data); + let tz = find_tz_data_in_file(cursor, "Europe/Kiev").unwrap(); + assert!(tz.starts_with(b"TZif2")); + } +} diff -Nru temporalio-1.3.0/vendor/async-trait/build.rs temporalio-1.3.0/vendor/async-trait/build.rs --- temporalio-1.3.0/vendor/async-trait/build.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/async-trait/build.rs 2023-10-30 19:40:00.000000000 +0000 @@ -3,7 +3,7 @@ use std::str; fn main() { - println!("cargo:rerun-if-env-changed=DOCS_RS"); + println!("cargo:rerun-if-changed=build.rs"); let compiler = match rustc_minor_version() { Some(compiler) => compiler, @@ -17,10 +17,6 @@ if compiler < 47 { println!("cargo:rustc-cfg=self_span_hack"); } - - if compiler >= 75 && env::var_os("DOCS_RS").is_none() { - println!("cargo:rustc-cfg=native_async_fn_in_trait"); - } } fn rustc_minor_version() -> Option { diff -Nru temporalio-1.3.0/vendor/async-trait/.cargo-checksum.json temporalio-1.3.0/vendor/async-trait/.cargo-checksum.json --- temporalio-1.3.0/vendor/async-trait/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/async-trait/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"Cargo.toml":"d2e4c5dc8ec7e68d2efdedf30334f48cd31a6e4c7b7acd4c6fbb8da28588ae4c","LICENSE-APACHE":"62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","README.md":"5b94948e52c1410eae55fb8e4084e8837d0f8eb0c000698dc13fac591c70dc1b","build.rs":"ad9da6073db9c5c1e1128aed696590ab10f1ad6a46dee4499d20c7ed60127093","src/args.rs":"6eed5497db91752b3aae597943c39e769f60406b37055304e69e4699f1f87b15","src/bound.rs":"ea6a8d0c1a33521163e5546463f68f6dbda0d35a59e75597be6bf04e0b7b23ad","src/expand.rs":"2d0b0f122c3ec393ce67db6fa177626d8fca0c4f5558b42f4fee219f31b97f9e","src/lib.rs":"3b381b9c34d6d7134e499bbb491c4fb64f0a6b871367fe72c3046a7d40bfc848","src/lifetime.rs":"e5ccfba2fa7ecb226cba247286c661f20a84e9a0ad2d789bdfee166cd5250160","src/parse.rs":"cd9032fe2c6dcf41050b3a59b9fb98eb9700a29bbe2fa011ee2854014c1666b7","src/receiver.rs":"356b4ac3e45607d041927799b12c1390c28e6333079343a38799d31ff5dfbe33","src/verbatim.rs":"45d0b691fab21f20d3414733f00d82845442d23b6f2547f8d6880a709d0d3b2a","tests/compiletest.rs":"022a8e400ef813d7ea1875b944549cee5125f6a995dc33e93b48cba3e1b57bd1","tests/executor/mod.rs":"3cf48614288715f625514a73ae642f649c2635a402a3ad90278bbee116a7234c","tests/test.rs":"203646366ce6959bf7e727372eaaf16c8f6e7b7c6c7cc5e12c259244d7254550","tests/ui/arg-implementation-detail.rs":"7199aba887dd0a8a14c86ec16542a73a70244930f8202940f43e40a62f72d200","tests/ui/arg-implementation-detail.stderr":"c3ff1a2a9a9ca4368cb8719e2a035a6d2d45b367212bec2b1fe2712fcfbbbe5d","tests/ui/bare-trait-object.rs":"4546e8bd6682de11920fa4c768295fed61954484ef0550dfadbc5677b77f29a5","tests/ui/bare-trait-object.stderr":"0e1d5902f1ed99a60c6126416806b7c40f4ac9bdd78f26d8e6d866738cc332df","tests/ui/consider-restricting.rs":"bff794222d9324241155568d541e7beac0238b66ce14039b242d4392f4e531b6","tests/ui/consider-restricting.stderr":"a8f7f45aa196febb5d7550597f47b72ba0176d05599260e56a438148b42de840","tests/ui/delimiter-span.rs":"f4fd804223ce3be0d4eecdfd222afdd835c5393e2473ff4932116163943c0bc9","tests/ui/delimiter-span.stderr":"7b5bbe4be3be533d31d1302649b317465bc28cc7f042b98ec78e8b9a82828155","tests/ui/lifetime-defined-here.rs":"3139a3d92cf787c43afd93da2d967ee80d114ee3a0b9c924da9601b5c6614ef5","tests/ui/lifetime-defined-here.stderr":"0d4236821e0f43e5ae38a99319a64020576e78a49a71d8c94eb8a486d384308c","tests/ui/lifetime-span.rs":"bbcaa92c2bc08e18cf0c7e9ca1f0bd8080772ebde8b067d819eb2fd662e47b3b","tests/ui/lifetime-span.stderr":"db67c5078ab66725227b8f4c612ff97b39cb45d5d6b7a4191766a34a6c711547","tests/ui/missing-async-in-impl.rs":"5a5538d08d11c145211a92af0d8973eee8b21f33b90adda85430805bd3dbbc83","tests/ui/missing-async-in-impl.stderr":"2916bc8a51e25f4dd18eaf433b916d533943eac2c1afbee64e9a89e7b928040d","tests/ui/missing-async-in-trait.rs":"dc67241593f270233ba885df92e59164126416e68d49d8d62edc251666b5db6e","tests/ui/missing-async-in-trait.stderr":"67e66e7b19358830deff3ba01f5d701a9ae05c4e6fa9c081c49c1c75efbb7ade","tests/ui/missing-body.rs":"d06c0da8c6044e7c790b924136f167e2edc0d0d3fa01f23521f3f08ca605929b","tests/ui/missing-body.stderr":"e5ee994398bf8294324d61df02467a4229f68f4113bf5acc004851c03d66ec6a","tests/ui/must-use.rs":"75090c7df984df0996464337f60371d198bd0caf3f9f44b10d1e131f15fd4fca","tests/ui/must-use.stderr":"e9989ec6ae4e87f117cd9ffd73e774b5477eb28c9df5b508dbd3654b783e5bf4","tests/ui/no-attribute-macro.rs":"99aaad298a8ef366029e53b6d320b14f18e04057a117ff58a0aebad65f01e22f","tests/ui/no-attribute-macro.stderr":"48dc13503b181f36271f5632ca835ea9e8d977d9dfcbe786f64a6633f3bb9b6b","tests/ui/self-span.rs":"67ddde05907d7014bfb3f2c63d427b1d72d6c4369a9108a4335dac6bee5832b2","tests/ui/self-span.stderr":"016ef4f29156250f073f4f6cd3096d2889325709bd693938e0d368077b752551","tests/ui/send-not-implemented.rs":"affbbe8bc9c3501d3db3a024e06daa9d076f1d142dba290c7aa1ea119daebd19","tests/ui/send-not-implemented.stderr":"b2cd38ce3cadda8f9e641b98e37db51afba47eab21d29cbfc47a90c8a444aa27","tests/ui/unreachable.rs":"be0aa7cc129fe42a1fbd85e36b3f08c6a2bd16c90ed2e33fc4c50e40ce085bcd","tests/ui/unreachable.stderr":"73beb71cb74076f2cb45485271de31658cf59f4143e62daa34b9f2a8980ddfcd","tests/ui/unsupported-self.rs":"f7855bc39dab1fd2f533fb2e873a27c3757dcb9fb57001e4b19f58d3dda36d01","tests/ui/unsupported-self.stderr":"64fc5d45cb51330f0a1e85e69a28b69ddda12a109aa6a8ba3eaee1ac58d93b5f"},"package":"a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9"} \ No newline at end of file +{"files":{"Cargo.toml":"8228349e4996caac1be8cf30980db8cc83473b3245e80405a9281eb90f545521","LICENSE-APACHE":"62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","README.md":"5b94948e52c1410eae55fb8e4084e8837d0f8eb0c000698dc13fac591c70dc1b","build.rs":"626c9fc3a055a6b64b6cf85f5aad1b22c9f6a49f9ff163316fa8dac3b34aef75","src/args.rs":"6eed5497db91752b3aae597943c39e769f60406b37055304e69e4699f1f87b15","src/bound.rs":"ea6a8d0c1a33521163e5546463f68f6dbda0d35a59e75597be6bf04e0b7b23ad","src/expand.rs":"2d0b0f122c3ec393ce67db6fa177626d8fca0c4f5558b42f4fee219f31b97f9e","src/lib.rs":"7426f0d3a6b4efc3e9ecc90b3d8b2794922a38bc19497e483cda98da97115fed","src/lifetime.rs":"e5ccfba2fa7ecb226cba247286c661f20a84e9a0ad2d789bdfee166cd5250160","src/parse.rs":"cd9032fe2c6dcf41050b3a59b9fb98eb9700a29bbe2fa011ee2854014c1666b7","src/receiver.rs":"356b4ac3e45607d041927799b12c1390c28e6333079343a38799d31ff5dfbe33","src/verbatim.rs":"45d0b691fab21f20d3414733f00d82845442d23b6f2547f8d6880a709d0d3b2a","tests/compiletest.rs":"022a8e400ef813d7ea1875b944549cee5125f6a995dc33e93b48cba3e1b57bd1","tests/executor/mod.rs":"3cf48614288715f625514a73ae642f649c2635a402a3ad90278bbee116a7234c","tests/test.rs":"203646366ce6959bf7e727372eaaf16c8f6e7b7c6c7cc5e12c259244d7254550","tests/ui/arg-implementation-detail.rs":"7199aba887dd0a8a14c86ec16542a73a70244930f8202940f43e40a62f72d200","tests/ui/arg-implementation-detail.stderr":"c3ff1a2a9a9ca4368cb8719e2a035a6d2d45b367212bec2b1fe2712fcfbbbe5d","tests/ui/bare-trait-object.rs":"4546e8bd6682de11920fa4c768295fed61954484ef0550dfadbc5677b77f29a5","tests/ui/bare-trait-object.stderr":"0e1d5902f1ed99a60c6126416806b7c40f4ac9bdd78f26d8e6d866738cc332df","tests/ui/consider-restricting.rs":"bff794222d9324241155568d541e7beac0238b66ce14039b242d4392f4e531b6","tests/ui/consider-restricting.stderr":"193ce320db84851f0b7d5dc18d8949e46cc3ec41e1dfac5668255af6e0d40c03","tests/ui/delimiter-span.rs":"f4fd804223ce3be0d4eecdfd222afdd835c5393e2473ff4932116163943c0bc9","tests/ui/delimiter-span.stderr":"7b5bbe4be3be533d31d1302649b317465bc28cc7f042b98ec78e8b9a82828155","tests/ui/lifetime-defined-here.rs":"3139a3d92cf787c43afd93da2d967ee80d114ee3a0b9c924da9601b5c6614ef5","tests/ui/lifetime-defined-here.stderr":"0d4236821e0f43e5ae38a99319a64020576e78a49a71d8c94eb8a486d384308c","tests/ui/lifetime-span.rs":"bbcaa92c2bc08e18cf0c7e9ca1f0bd8080772ebde8b067d819eb2fd662e47b3b","tests/ui/lifetime-span.stderr":"db67c5078ab66725227b8f4c612ff97b39cb45d5d6b7a4191766a34a6c711547","tests/ui/missing-async-in-impl.rs":"5a5538d08d11c145211a92af0d8973eee8b21f33b90adda85430805bd3dbbc83","tests/ui/missing-async-in-impl.stderr":"2916bc8a51e25f4dd18eaf433b916d533943eac2c1afbee64e9a89e7b928040d","tests/ui/missing-async-in-trait.rs":"dc67241593f270233ba885df92e59164126416e68d49d8d62edc251666b5db6e","tests/ui/missing-async-in-trait.stderr":"67e66e7b19358830deff3ba01f5d701a9ae05c4e6fa9c081c49c1c75efbb7ade","tests/ui/missing-body.rs":"d06c0da8c6044e7c790b924136f167e2edc0d0d3fa01f23521f3f08ca605929b","tests/ui/missing-body.stderr":"e5ee994398bf8294324d61df02467a4229f68f4113bf5acc004851c03d66ec6a","tests/ui/must-use.rs":"75090c7df984df0996464337f60371d198bd0caf3f9f44b10d1e131f15fd4fca","tests/ui/must-use.stderr":"e9989ec6ae4e87f117cd9ffd73e774b5477eb28c9df5b508dbd3654b783e5bf4","tests/ui/self-span.rs":"67ddde05907d7014bfb3f2c63d427b1d72d6c4369a9108a4335dac6bee5832b2","tests/ui/self-span.stderr":"016ef4f29156250f073f4f6cd3096d2889325709bd693938e0d368077b752551","tests/ui/send-not-implemented.rs":"affbbe8bc9c3501d3db3a024e06daa9d076f1d142dba290c7aa1ea119daebd19","tests/ui/send-not-implemented.stderr":"de65542b3904669cdab88fcfa594f31f21191cc86ae82d9768652bc770118be2","tests/ui/unreachable.rs":"be0aa7cc129fe42a1fbd85e36b3f08c6a2bd16c90ed2e33fc4c50e40ce085bcd","tests/ui/unreachable.stderr":"73beb71cb74076f2cb45485271de31658cf59f4143e62daa34b9f2a8980ddfcd","tests/ui/unsupported-self.rs":"f7855bc39dab1fd2f533fb2e873a27c3757dcb9fb57001e4b19f58d3dda36d01","tests/ui/unsupported-self.stderr":"64fc5d45cb51330f0a1e85e69a28b69ddda12a109aa6a8ba3eaee1ac58d93b5f"},"package":"bc00ceb34980c03614e35a3a4e218276a0a824e911d07651cd0d858a51e8c0f0"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/async-trait/Cargo.toml temporalio-1.3.0/vendor/async-trait/Cargo.toml --- temporalio-1.3.0/vendor/async-trait/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/async-trait/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -13,7 +13,7 @@ edition = "2021" rust-version = "1.56" name = "async-trait" -version = "0.1.74" +version = "0.1.73" authors = ["David Tolnay "] description = "Type erasure for async trait methods" documentation = "https://docs.rs/async-trait" diff -Nru temporalio-1.3.0/vendor/async-trait/src/lib.rs temporalio-1.3.0/vendor/async-trait/src/lib.rs --- temporalio-1.3.0/vendor/async-trait/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/async-trait/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -12,12 +12,11 @@ //! Rust 1.39 did not include support for async fn in traits. Trying to include //! an async fn in a trait produces the following error: //! -#![cfg_attr(not(native_async_fn_in_trait), doc = "```compile_fail")] -#![cfg_attr(native_async_fn_in_trait, doc = "```")] +//! ```compile_fail //! trait MyTrait { //! async fn f() {} //! } -#![doc = "```"] +//! ``` //! //! ```text //! error[E0706]: trait fns cannot be declared `async` @@ -304,7 +303,7 @@ //! let object = &value as &dyn ObjectSafe; //! ``` -#![doc(html_root_url = "https://docs.rs/async-trait/0.1.74")] +#![doc(html_root_url = "https://docs.rs/async-trait/0.1.73")] #![allow( clippy::default_trait_access, clippy::doc_markdown, diff -Nru temporalio-1.3.0/vendor/async-trait/tests/ui/consider-restricting.stderr temporalio-1.3.0/vendor/async-trait/tests/ui/consider-restricting.stderr --- temporalio-1.3.0/vendor/async-trait/tests/ui/consider-restricting.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/async-trait/tests/ui/consider-restricting.stderr 2023-10-30 19:40:00.000000000 +0000 @@ -4,12 +4,13 @@ 16 | async fn publish(&self, url: T) {} | ^^ future created by async block is not `Send` | + = note: consider using `std::sync::Arc`; for more information visit note: captured value is not `Send` --> tests/ui/consider-restricting.rs:16:41 | 16 | async fn publish(&self, url: T) {} | ^^^ has type `T` which is not `Send` - = note: required for the cast from `Pin>` to `Pin + Send + 'async_trait)>>` + = note: required for the cast from `Pin>` to `Pin + Send + 'async_trait)>>` help: consider further restricting this bound | 16 | async fn publish(&self, url: T) {} @@ -21,12 +22,13 @@ 23 | async fn publish(&self, url: T) {} | ^^ future created by async block is not `Send` | + = note: consider using `std::sync::Arc`; for more information visit note: captured value is not `Send` --> tests/ui/consider-restricting.rs:23:32 | 23 | async fn publish(&self, url: T) {} | ^^^ has type `T` which is not `Send` - = note: required for the cast from `Pin>` to `Pin + Send + 'async_trait)>>` + = note: required for the cast from `Pin>` to `Pin + Send + 'async_trait)>>` help: consider further restricting this bound | 23 | async fn publish(&self, url: T) {} diff -Nru temporalio-1.3.0/vendor/async-trait/tests/ui/no-attribute-macro.rs temporalio-1.3.0/vendor/async-trait/tests/ui/no-attribute-macro.rs --- temporalio-1.3.0/vendor/async-trait/tests/ui/no-attribute-macro.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/async-trait/tests/ui/no-attribute-macro.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,13 +0,0 @@ -pub trait Trait { - async fn method(&self); -} - -pub struct Struct; - -impl Trait for Struct { - async fn method(&self) {} -} - -fn main() { - let _: &dyn Trait; -} diff -Nru temporalio-1.3.0/vendor/async-trait/tests/ui/no-attribute-macro.stderr temporalio-1.3.0/vendor/async-trait/tests/ui/no-attribute-macro.stderr --- temporalio-1.3.0/vendor/async-trait/tests/ui/no-attribute-macro.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/async-trait/tests/ui/no-attribute-macro.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,14 +0,0 @@ -error[E0038]: the trait `Trait` cannot be made into an object - --> tests/ui/no-attribute-macro.rs:12:12 - | -12 | let _: &dyn Trait; - | ^^^^^^^^^^ `Trait` cannot be made into an object - | -note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit - --> tests/ui/no-attribute-macro.rs:2:14 - | -1 | pub trait Trait { - | ----- this trait cannot be made into an object... -2 | async fn method(&self); - | ^^^^^^ ...because method `method` is `async` - = help: consider moving `method` to another trait diff -Nru temporalio-1.3.0/vendor/async-trait/tests/ui/send-not-implemented.stderr temporalio-1.3.0/vendor/async-trait/tests/ui/send-not-implemented.stderr --- temporalio-1.3.0/vendor/async-trait/tests/ui/send-not-implemented.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/async-trait/tests/ui/send-not-implemented.stderr 2023-10-30 19:40:00.000000000 +0000 @@ -9,7 +9,8 @@ 12 | | } | |_____^ future created by async block is not `Send` | - = help: within `{async block@$DIR/tests/ui/send-not-implemented.rs:8:26: 12:6}`, the trait `Send` is not implemented for `MutexGuard<'_, ()>` + = help: within `[async block@$DIR/tests/ui/send-not-implemented.rs:8:26: 12:6]`, the trait `Send` is not implemented for `MutexGuard<'_, ()>` + = note: consider using `std::sync::Arc>`; for more information visit note: future is not `Send` as this value is used across an await --> tests/ui/send-not-implemented.rs:11:13 | @@ -17,7 +18,9 @@ | ------ has type `MutexGuard<'_, ()>` which is not `Send` 11 | f().await; | ^^^^^ await occurs here, with `_guard` maybe used later - = note: required for the cast from `Pin>` to `Pin + Send>>` +12 | } + | - `_guard` is later dropped here + = note: required for the cast from `Pin>` to `Pin + Send + 'async_trait)>>` error: future cannot be sent between threads safely --> tests/ui/send-not-implemented.rs:14:38 @@ -31,7 +34,8 @@ 19 | | } | |_____^ future created by async block is not `Send` | - = help: within `{async block@$DIR/tests/ui/send-not-implemented.rs:14:38: 19:6}`, the trait `Send` is not implemented for `MutexGuard<'_, ()>` + = help: within `[async block@$DIR/tests/ui/send-not-implemented.rs:14:38: 19:6]`, the trait `Send` is not implemented for `MutexGuard<'_, ()>` + = note: consider using `std::sync::Arc>`; for more information visit note: future is not `Send` as this value is used across an await --> tests/ui/send-not-implemented.rs:17:13 | @@ -39,4 +43,7 @@ | ------ has type `MutexGuard<'_, ()>` which is not `Send` 17 | f().await; | ^^^^^ await occurs here, with `_guard` maybe used later - = note: required for the cast from `Pin>` to `Pin + Send>>` +18 | true +19 | } + | - `_guard` is later dropped here + = note: required for the cast from `Pin>` to `Pin + Send + 'async_trait)>>` diff -Nru temporalio-1.3.0/vendor/base64/benches/benchmarks.rs temporalio-1.3.0/vendor/base64/benches/benchmarks.rs --- temporalio-1.3.0/vendor/base64/benches/benchmarks.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/base64/benches/benchmarks.rs 2023-10-30 19:40:00.000000000 +0000 @@ -39,7 +39,8 @@ fill(&mut v); let encoded = STANDARD.encode(&v); - let mut buf = vec![0; size]; + let mut buf = Vec::new(); + buf.resize(size, 0); b.iter(|| { STANDARD.decode_slice(&encoded, &mut buf).unwrap(); black_box(&buf); @@ -51,7 +52,8 @@ fill(&mut v); let encoded = STANDARD.encode(&v); - let mut buf = vec![0; size]; + let mut buf = Vec::new(); + buf.resize(size, 0); buf.truncate(0); b.iter(|| { @@ -94,8 +96,9 @@ fn do_encode_bench_slice(b: &mut Bencher, &size: &usize) { let mut v: Vec = Vec::with_capacity(size); fill(&mut v); + let mut buf = Vec::new(); // conservative estimate of encoded size - let mut buf = vec![0; v.len() * 2]; + buf.resize(v.len() * 2, 0); b.iter(|| STANDARD.encode_slice(&v, &mut buf).unwrap()); } diff -Nru temporalio-1.3.0/vendor/base64/.cargo-checksum.json temporalio-1.3.0/vendor/base64/.cargo-checksum.json --- temporalio-1.3.0/vendor/base64/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/base64/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"Cargo.lock":"3fcb2ea14aeaf0ebde20e464f0a735b2f58b0fecc99a20c11421ce47788911b8","Cargo.toml":"8a94eedc97a8458e7becfa780a67dfa2ea959bb5660c77dc8236fb7c6a9a64e6","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"0dd882e53de11566d50f8e8e2d5a651bcf3fabee4987d70f306233cf39094ba7","README.md":"df01f5b4317d601e7de86743f9818aec9196abf9e298f5e47679b7a966ecd945","RELEASE-NOTES.md":"fa36233aeddb2e63dc0580ffc69a5a1cdbf24f962146ab2d6b817381e2f38cdd","benches/benchmarks.rs":"da4a49294a7fcaf718f2b062a52ed669ca096abce6c57b4025efdd24825048c2","clippy.toml":"b26be4d15ed059985ce6994f11817fd7562046f46e460a0dc64dbb71cfc246d1","examples/base64.rs":"8c48673029aeeb1e06a2ecfd237acf8ef24349990e97f6d2c4d0fa2af36c94b3","icon_CLion.svg":"cffa044ba75cb998ee3306991dc4a3755ec2f39ab95ddd4b74bc21988389020f","src/alphabet.rs":"f0cba9462692db0bc9572e3d03c01ac77ff705fa9e664db4162da1a279a871e1","src/chunked_encoder.rs":"edfdbb9a4329b80fb2c769ada81e234e00839e0fa85faaa70bacf40ce12e951c","src/decode.rs":"666ca75ccd975f0548d37312d2843ca4703b83697a044839bbefeba8f4f7874a","src/display.rs":"31bf3e19274a0b80dd8948a81ea535944f756ef5b88736124c940f5fe1e8c71c","src/encode.rs":"0c827067fced8a20723be2586ebbad94e4749e2cdad463091c4fd6899bd1d0e7","src/engine/general_purpose/decode.rs":"ba8a76d333ab96dd07b3f84bd6d405d690d2d17e84bd0878f05245a82dc16853","src/engine/general_purpose/decode_suffix.rs":"71ceb066b73e8cc833916e2cedbf0a01b07c2f16e30b2b2f63aff1c823874b51","src/engine/general_purpose/mod.rs":"9f49375fc03166a491acf464daa7a9e6540fdc2cca407da9a248e15640952c20","src/engine/mod.rs":"15210115e5f99e0d252a1240922deb1516778e318564f92a9d880a82fd82a55e","src/engine/naive.rs":"dc166010633e8de0fbff31e2f05d128506f3e0f34a6358c1a825b59a8ea1af0d","src/engine/tests.rs":"37bee2de07343bf5d37720f29cda291e8562f2363704e0ad91862d5991568d22","src/lib.rs":"c1eb62ba9f461dfa00b5297c9bc3d9f6c6702295806d43bb82e46ffb54ea61ed","src/prelude.rs":"c1587138e5301ac797c5c362cb3638649b33f79c20c16db6f38ad44330540752","src/read/decoder.rs":"cc87daa4c52a23d1275352bccf07468baf2b60e90b2ac14f89a94254697cb83c","src/read/decoder_tests.rs":"edeee377e70095532be1625d0148de2273b739e9069a05e616d3e67877d92f1d","src/read/mod.rs":"e0b714eda02d16b1ffa6f78fd09b2f963e01c881b1f7c17b39db4e904be5e746","src/tests.rs":"90cb9f8a1ccb7c4ddc4f8618208e0031fc97e0df0e5aa466d6a5cf45d25967d8","src/write/encoder.rs":"c889c853249220fe2ddaeb77ee6e2ee2945f7db88cd6658ef89ff71b81255ea8","src/write/encoder_string_writer.rs":"0326c9d120369b9bbc35697b5b9b141bed24283374c93d5af1052eb042e47799","src/write/encoder_tests.rs":"28695a485b17cf5db73656aae5d90127f726e02c6d70efd83e5ab53a4cc17b38","src/write/mod.rs":"73cd98dadc9d712b3fefd9449d97e825e097397441b90588e0051e4d3b0911b9","tests/encode.rs":"5309f4538b1df611436f7bfba7409c725161b6f841b1bbf8d9890ae185de7d88","tests/tests.rs":"78efcf0dc4bb6ae52f7a91fcad89e44e4dce578224c36b4e6c1c306459be8500"},"package":"35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9"} \ No newline at end of file +{"files":{"Cargo.lock":"7f8bb59ed995d138edd1bfac1b0f44600a4a156cd461c4ab9d5c684fc3cff229","Cargo.toml":"88e0ac3138372e5807fec362de49dae14e42201d8d2aac4551fc289125d329af","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"0dd882e53de11566d50f8e8e2d5a651bcf3fabee4987d70f306233cf39094ba7","README.md":"b9bd41282140ae2ef57eca89b04fd2d445460373b1b6ac24550ec8ff2e934d70","RELEASE-NOTES.md":"0f48f3777d6e8306e12e92933f83bc8bca41b75f10d9516d0fb592613ac031e8","benches/benchmarks.rs":"faf63c3d83fe1568927288cfcc7f9bd4bd15c6b531450c53d2c064386fc5c652","clippy.toml":"ee3dedc35eb156cbfbe836692846cd492f59acc7443dd43cc6d71f087d80051c","examples/base64.rs":"8c48673029aeeb1e06a2ecfd237acf8ef24349990e97f6d2c4d0fa2af36c94b3","icon_CLion.svg":"cffa044ba75cb998ee3306991dc4a3755ec2f39ab95ddd4b74bc21988389020f","src/alphabet.rs":"420b5e23da0702c401489c53721696c5d5f69631f4ca9462f4c5ef3bdc77114e","src/chunked_encoder.rs":"635e4a514fa849f25ebfdc0ecb0b7a9fa99c5576d34f58058b094f3ea158cee3","src/decode.rs":"4bdfb6dfce4bdd176a0fca5e4b8fe2836c66f1753e252cd91df43c512c24a942","src/display.rs":"31bf3e19274a0b80dd8948a81ea535944f756ef5b88736124c940f5fe1e8c71c","src/encode.rs":"b03c529b6de9cff58aafb7865bef28c3d5b857153353397a4ebeccd6434924d6","src/engine/general_purpose/decode.rs":"ba8a76d333ab96dd07b3f84bd6d405d690d2d17e84bd0878f05245a82dc16853","src/engine/general_purpose/decode_suffix.rs":"71ceb066b73e8cc833916e2cedbf0a01b07c2f16e30b2b2f63aff1c823874b51","src/engine/general_purpose/mod.rs":"4acf7293e5bb83faf01edf2618bcb2b2aff2c2a3bcb85ddc815baa96e5751bb2","src/engine/mod.rs":"50e85548fb6cdebcd14b09a5477aaa1d0bd04d6f97acc5a6d88b219287e69e0c","src/engine/naive.rs":"4ebd14e28502700d5de3e2aa193b6b384ad1189c6aa9368be3ab35775777aa4a","src/engine/tests.rs":"b039a120bbc61262a5e7f567dfe210ac146b254594b42a56352d0052adadc46a","src/lib.rs":"b4699408a9356f88fd8a3aeffae97e54e7a249afe5d919ecf9d4092d1c8efde1","src/prelude.rs":"f82fcf5e31921060929f9e10efb2868ba7339b085ee76fc5e7077f6030fbb2cc","src/read/decoder.rs":"cc87daa4c52a23d1275352bccf07468baf2b60e90b2ac14f89a94254697cb83c","src/read/decoder_tests.rs":"cc3c2273867972a835f459073e3982f20a690c3b7d5f7546042e417d11c97a94","src/read/mod.rs":"e0b714eda02d16b1ffa6f78fd09b2f963e01c881b1f7c17b39db4e904be5e746","src/tests.rs":"90cb9f8a1ccb7c4ddc4f8618208e0031fc97e0df0e5aa466d6a5cf45d25967d8","src/write/encoder.rs":"c889c853249220fe2ddaeb77ee6e2ee2945f7db88cd6658ef89ff71b81255ea8","src/write/encoder_string_writer.rs":"ac3702b1a846fd0664e78d2dd82c939073ca00577d3201a8f1fbe17a9bf85e70","src/write/encoder_tests.rs":"39572f11fdf63af47f13bb58be280221322c669504a1b4a30a9181fe465e0f90","src/write/mod.rs":"73cd98dadc9d712b3fefd9449d97e825e097397441b90588e0051e4d3b0911b9","tests/encode.rs":"ca8fb0c03f71563788cced06deb335f2c4bace0c875696662340c86ccedfdc7f","tests/tests.rs":"78efcf0dc4bb6ae52f7a91fcad89e44e4dce578224c36b4e6c1c306459be8500"},"package":"604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/base64/Cargo.lock temporalio-1.3.0/vendor/base64/Cargo.lock --- temporalio-1.3.0/vendor/base64/Cargo.lock 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/base64/Cargo.lock 2023-10-30 19:40:00.000000000 +0000 @@ -3,15 +3,6 @@ version = 3 [[package]] -name = "aho-corasick" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" -dependencies = [ - "memchr", -] - -[[package]] name = "anes" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -32,7 +23,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" dependencies = [ - "hermit-abi", + "hermit-abi 0.1.19", "libc", "winapi", ] @@ -45,10 +36,9 @@ [[package]] name = "base64" -version = "0.21.5" +version = "0.21.2" dependencies = [ "criterion", - "lazy_static", "rand", "rstest", "rstest_reuse", @@ -63,9 +53,9 @@ [[package]] name = "bumpalo" -version = "3.14.0" +version = "3.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" +checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" [[package]] name = "cast" @@ -179,6 +169,16 @@ ] [[package]] +name = "crossbeam-channel" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + +[[package]] name = "crossbeam-deque" version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -191,9 +191,9 @@ [[package]] name = "crossbeam-epoch" -version = "0.9.15" +version = "0.9.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7" +checksum = "46bd5f3f85273295a9d14aedfb86f6aadbff6d8f5295c4a9edb08e819dcf5695" dependencies = [ "autocfg", "cfg-if", @@ -204,24 +204,24 @@ [[package]] name = "crossbeam-utils" -version = "0.8.16" +version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" +checksum = "3c063cd8cc95f5c377ed0d4b49a4b21f632396ff690e8470c29b3359b346984b" dependencies = [ "cfg-if", ] [[package]] name = "either" -version = "1.9.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" +checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" [[package]] name = "getrandom" -version = "0.2.10" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" +checksum = "c85e1d9ab2eadba7e5040d4e09cbd6d072b76a557ad64e797c2cb9d4da21d7e4" dependencies = [ "cfg-if", "libc", @@ -259,6 +259,15 @@ ] [[package]] +name = "hermit-abi" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" +dependencies = [ + "libc", +] + +[[package]] name = "indexmap" version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -279,15 +288,15 @@ [[package]] name = "itoa" -version = "1.0.9" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" +checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" [[package]] name = "js-sys" -version = "0.3.64" +version = "0.3.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" +checksum = "2f37a4a5928311ac501dee68b3c7613a1037d0edb30c8e5427bd832d55d1b790" dependencies = [ "wasm-bindgen", ] @@ -300,45 +309,52 @@ [[package]] name = "libc" -version = "0.2.149" +version = "0.2.144" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a08173bc88b7955d1b3145aa561539096c421ac8debde8cbc3612ec635fee29b" +checksum = "2b00cc1c228a6782d0f076e7b232802e0c5689d41bb5df366f2a6b6621cfdfe1" [[package]] name = "log" -version = "0.4.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" - -[[package]] -name = "memchr" -version = "2.6.4" +version = "0.4.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" +checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" +dependencies = [ + "cfg-if", +] [[package]] name = "memoffset" -version = "0.9.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" +checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" dependencies = [ "autocfg", ] [[package]] name = "num-traits" -version = "0.2.17" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" dependencies = [ "autocfg", ] [[package]] +name = "num_cpus" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" +dependencies = [ + "hermit-abi 0.2.6", + "libc", +] + +[[package]] name = "once_cell" -version = "1.18.0" +version = "1.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" [[package]] name = "oorandom" @@ -348,15 +364,15 @@ [[package]] name = "os_str_bytes" -version = "6.6.1" +version = "6.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2355d85b9a3786f481747ced0e0ff2ba35213a1f9bd406ed906554d7af805a1" +checksum = "ceedf44fb00f2d1984b0bc98102627ce622e083e49a5bacdb3e514fa4238e267" [[package]] name = "plotters" -version = "0.3.5" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2c224ba00d7cadd4d5c660deaf2098e5e80e07846537c51f9cfa4be50c1fd45" +checksum = "2538b639e642295546c50fcd545198c9d64ee2a38620a628724a3b266d5fbf97" dependencies = [ "num-traits", "plotters-backend", @@ -367,15 +383,15 @@ [[package]] name = "plotters-backend" -version = "0.3.5" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e76628b4d3a7581389a35d5b6e2139607ad7c75b17aed325f210aa91f4a9609" +checksum = "193228616381fecdc1224c62e96946dfbc73ff4384fba576e052ff8c1bea8142" [[package]] name = "plotters-svg" -version = "0.3.5" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38f6d39893cca0701371e3c27294f09797214b86f1fb951b89ade8ec04e2abab" +checksum = "f9a81d2759aae1dae668f783c308bc5c8ebd191ff4184aaa1b37f65a6ae5a56f" dependencies = [ "plotters-backend", ] @@ -412,18 +428,18 @@ [[package]] name = "proc-macro2" -version = "1.0.69" +version = "1.0.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da" +checksum = "fa1fb82fc0c281dd9671101b66b771ebbe1eaf967b96ac8740dcba4b70005ca8" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.33" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +checksum = "8f4f29d145265ec1c483c7c654450edde0bfe043d3938d6972630663356d9500" dependencies = [ "proc-macro2", ] @@ -460,9 +476,9 @@ [[package]] name = "rayon" -version = "1.8.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c27db03db7734835b3f53954b534c91069375ce6ccaa2e065441e07d9b6cdb1" +checksum = "1d2df5196e37bcc87abebc0053e20787d73847bb33134a69841207dd0a47f03b" dependencies = [ "either", "rayon-core", @@ -470,42 +486,30 @@ [[package]] name = "rayon-core" -version = "1.12.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ce3fb6ad83f861aac485e76e1985cd109d9a3713802152be56c3b1f0e0658ed" +checksum = "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d" dependencies = [ + "crossbeam-channel", "crossbeam-deque", "crossbeam-utils", + "num_cpus", ] [[package]] name = "regex" -version = "1.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.4.3" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" +checksum = "d1a59b5d8e97dee33696bf13c5ba8ab85341c002922fba050069326b9c498974" dependencies = [ - "aho-corasick", - "memchr", "regex-syntax", ] [[package]] name = "regex-syntax" -version = "0.8.2" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" +checksum = "436b050e76ed2903236f032a59761c1eb99e1b0aead2c257922771dab1fc8c78" [[package]] name = "rstest" @@ -542,9 +546,9 @@ [[package]] name = "ryu" -version = "1.0.15" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" +checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" [[package]] name = "same-file" @@ -557,41 +561,41 @@ [[package]] name = "scopeguard" -version = "1.2.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" [[package]] name = "semver" -version = "1.0.20" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" +checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" [[package]] name = "serde" -version = "1.0.189" +version = "1.0.163" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e422a44e74ad4001bdc8eede9a4570ab52f71190e9c076d14369f38b9200537" +checksum = "2113ab51b87a539ae008b5c6c02dc020ffa39afd2d83cffcb3f4eb2722cebec2" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.189" +version = "1.0.163" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e48d1f918009ce3145511378cf68d613e3b3d9137d67272562080d68a2b32d5" +checksum = "8c805777e3930c8883389c602315a24224bcc738b63905ef87cd1420353ea93e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.16", ] [[package]] name = "serde_json" -version = "1.0.107" +version = "1.0.96" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b420ce6e3d8bd882e9b243c6eed35dbc9a6110c9769e74b584e0d68d1f20c65" +checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1" dependencies = [ "itoa", "ryu", @@ -641,9 +645,9 @@ [[package]] name = "syn" -version = "2.0.38" +version = "2.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e96b79aaa137db8f61e26363a0c9b47d8b4ec75da28b7d1d614c2303e232408b" +checksum = "a6f671d4b5ffdb8eadec19c0ae67fe2639df8684bd7bc4b83d986b8db549cf01" dependencies = [ "proc-macro2", "quote", @@ -677,9 +681,9 @@ [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +checksum = "b15811caf2415fb889178633e7724bad2509101cde276048e013b9def5e51fa0" [[package]] name = "unicode-segmentation" @@ -689,9 +693,9 @@ [[package]] name = "unicode-width" -version = "0.1.11" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" +checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" [[package]] name = "vec_map" @@ -707,9 +711,9 @@ [[package]] name = "walkdir" -version = "2.4.0" +version = "2.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" +checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698" dependencies = [ "same-file", "winapi-util", @@ -723,9 +727,9 @@ [[package]] name = "wasm-bindgen" -version = "0.2.87" +version = "0.2.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" +checksum = "5bba0e8cb82ba49ff4e229459ff22a191bbe9a1cb3a341610c9c33efc27ddf73" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -733,24 +737,24 @@ [[package]] name = "wasm-bindgen-backend" -version = "0.2.87" +version = "0.2.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" +checksum = "19b04bc93f9d6bdee709f6bd2118f57dd6679cf1176a1af464fca3ab0d66d8fb" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.16", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.87" +version = "0.2.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" +checksum = "14d6b024f1a526bb0234f52840389927257beb670610081360e5a03c5df9c258" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -758,28 +762,28 @@ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.87" +version = "0.2.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" +checksum = "e128beba882dd1eb6200e1dc92ae6c5dbaa4311aa7bb211ca035779e5efc39f8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.16", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.87" +version = "0.2.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" +checksum = "ed9d5b4305409d1fc9482fee2d7f9bcbf24b3972bf59817ef757e23982242a93" [[package]] name = "web-sys" -version = "0.3.64" +version = "0.3.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" +checksum = "3bdd9ef4e984da1187bf8110c5cf5b845fbc87a23602cdf912386a76fcd3a7c2" dependencies = [ "js-sys", "wasm-bindgen", @@ -803,9 +807,9 @@ [[package]] name = "winapi-util" -version = "0.1.6" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" dependencies = [ "winapi", ] diff -Nru temporalio-1.3.0/vendor/base64/Cargo.toml temporalio-1.3.0/vendor/base64/Cargo.toml --- temporalio-1.3.0/vendor/base64/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/base64/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -10,10 +10,10 @@ # See Cargo.toml.orig for the original contents. [package] -edition = "2018" -rust-version = "1.48.0" +edition = "2021" +rust-version = "1.57.0" name = "base64" -version = "0.21.5" +version = "0.21.2" authors = [ "Alice Maz ", "Marshall Pierce ", @@ -32,38 +32,19 @@ license = "MIT OR Apache-2.0" repository = "https://github.com/marshallpierce/rust-base64" -[package.metadata.docs.rs] -rustdoc-args = ["--generate-link-to-definition"] - [profile.bench] -debug = 2 +debug = true [profile.test] opt-level = 3 -[[example]] -name = "base64" -required-features = ["std"] - -[[test]] -name = "tests" -required-features = ["alloc"] - -[[test]] -name = "encode" -required-features = ["alloc"] - [[bench]] name = "benchmarks" harness = false -required-features = ["std"] [dev-dependencies.criterion] version = "0.4.0" -[dev-dependencies.lazy_static] -version = "1.4.0" - [dev-dependencies.rand] version = "0.8.5" features = ["small_rng"] @@ -80,4 +61,4 @@ [features] alloc = [] default = ["std"] -std = ["alloc"] +std = [] diff -Nru temporalio-1.3.0/vendor/base64/clippy.toml temporalio-1.3.0/vendor/base64/clippy.toml --- temporalio-1.3.0/vendor/base64/clippy.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/base64/clippy.toml 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -msrv = "1.48.0" +msrv = "1.57.0" diff -Nru temporalio-1.3.0/vendor/base64/README.md temporalio-1.3.0/vendor/base64/README.md --- temporalio-1.3.0/vendor/base64/README.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/base64/README.md 2023-10-30 19:40:00.000000000 +0000 @@ -63,7 +63,7 @@ ## Rust version compatibility -The minimum supported Rust version is 1.48.0. +The minimum supported Rust version is 1.57.0. # Contributing diff -Nru temporalio-1.3.0/vendor/base64/RELEASE-NOTES.md temporalio-1.3.0/vendor/base64/RELEASE-NOTES.md --- temporalio-1.3.0/vendor/base64/RELEASE-NOTES.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/base64/RELEASE-NOTES.md 2023-10-30 19:40:00.000000000 +0000 @@ -1,18 +1,3 @@ -# 0.21.5 - -- Add `Debug` and `Clone` impls for the general purpose Engine - -# 0.21.4 - -- Make `encoded_len` `const`, allowing the creation of arrays sized to encode compile-time-known data lengths - -# 0.21.3 - -- Implement `source` instead of `cause` on Error types -- Roll back MSRV to 1.48.0 so Debian can continue to live in a time warp -- Slightly faster chunked encoding for short inputs -- Decrease binary size - # 0.21.2 - Rollback MSRV to 1.57.0 -- only dev dependencies need 1.60, not the main code @@ -20,14 +5,14 @@ # 0.21.1 - Remove the possibility of panicking during decoded length calculations -- `DecoderReader` no longer sometimes erroneously ignores - padding [#226](https://github.com/marshallpierce/rust-base64/issues/226) +- `DecoderReader` no longer sometimes erroneously ignores padding [#226](https://github.com/marshallpierce/rust-base64/issues/226) ## Breaking changes - `Engine.internal_decode` return type changed - Update MSRV to 1.60.0 + # 0.21.0 ## Migration @@ -73,8 +58,7 @@ ## Breaking changes -- Re-exports of preconfigured engines in `engine` are removed in favor of `base64::prelude::...` that are better suited - to those who wish to `use` the entire path to a name. +- Re-exports of preconfigured engines in `engine` are removed in favor of `base64::prelude::...` that are better suited to those who wish to `use` the entire path to a name. # 0.21.0-beta.1 diff -Nru temporalio-1.3.0/vendor/base64/src/alphabet.rs temporalio-1.3.0/vendor/base64/src/alphabet.rs --- temporalio-1.3.0/vendor/base64/src/alphabet.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/base64/src/alphabet.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,7 +1,7 @@ //! Provides [Alphabet] and constants for alphabets commonly used in the wild. use crate::PAD_BYTE; -use core::{convert, fmt}; +use core::fmt; #[cfg(any(feature = "std", test))] use std::error; @@ -12,10 +12,6 @@ /// Common alphabets are provided as constants, and custom alphabets /// can be made via `from_str` or the `TryFrom` implementation. /// -/// # Examples -/// -/// Building and using a custom Alphabet: -/// /// ``` /// let custom = base64::alphabet::Alphabet::new("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/").unwrap(); /// @@ -23,33 +19,6 @@ /// &custom, /// base64::engine::general_purpose::PAD); /// ``` -/// -/// Building a const: -/// -/// ``` -/// use base64::alphabet::Alphabet; -/// -/// static CUSTOM: Alphabet = { -/// // Result::unwrap() isn't const yet, but panic!() is OK -/// match Alphabet::new("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/") { -/// Ok(x) => x, -/// Err(_) => panic!("creation of alphabet failed"), -/// } -/// }; -/// ``` -/// -/// Building a lazy_static: -/// -/// ``` -/// use base64::{ -/// alphabet::Alphabet, -/// engine::{general_purpose::GeneralPurpose, GeneralPurposeConfig}, -/// }; -/// -/// lazy_static::lazy_static! { -/// static ref CUSTOM: Alphabet = Alphabet::new("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/").unwrap(); -/// } -/// ``` #[derive(Clone, Debug, Eq, PartialEq)] pub struct Alphabet { pub(crate) symbols: [u8; ALPHABET_SIZE], @@ -124,7 +93,7 @@ } } -impl convert::TryFrom<&str> for Alphabet { +impl TryFrom<&str> for Alphabet { type Error = ParseAlphabetError; fn try_from(value: &str) -> Result { @@ -202,7 +171,7 @@ #[cfg(test)] mod tests { use crate::alphabet::*; - use core::convert::TryFrom as _; + use std::convert::TryFrom as _; #[test] fn detects_duplicate_start() { diff -Nru temporalio-1.3.0/vendor/base64/src/chunked_encoder.rs temporalio-1.3.0/vendor/base64/src/chunked_encoder.rs --- temporalio-1.3.0/vendor/base64/src/chunked_encoder.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/base64/src/chunked_encoder.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,12 +1,12 @@ -use crate::{ - encode::add_padding, - engine::{Config, Engine}, -}; -#[cfg(any(feature = "alloc", test))] +#[cfg(any(feature = "alloc", feature = "std", test))] use alloc::string::String; -#[cfg(any(feature = "alloc", test))] +use core::cmp; +#[cfg(any(feature = "alloc", feature = "std", test))] use core::str; +use crate::encode::add_padding; +use crate::engine::{Config, Engine}; + /// The output mechanism for ChunkedEncoder's encoded bytes. pub trait Sink { type Error; @@ -15,51 +15,86 @@ fn write_encoded_bytes(&mut self, encoded: &[u8]) -> Result<(), Self::Error>; } +const BUF_SIZE: usize = 1024; + /// A base64 encoder that emits encoded bytes in chunks without heap allocation. pub struct ChunkedEncoder<'e, E: Engine + ?Sized> { engine: &'e E, + max_input_chunk_len: usize, } impl<'e, E: Engine + ?Sized> ChunkedEncoder<'e, E> { pub fn new(engine: &'e E) -> ChunkedEncoder<'e, E> { - ChunkedEncoder { engine } + ChunkedEncoder { + engine, + max_input_chunk_len: max_input_length(BUF_SIZE, engine.config().encode_padding()), + } } pub fn encode(&self, bytes: &[u8], sink: &mut S) -> Result<(), S::Error> { - const BUF_SIZE: usize = 1024; - const CHUNK_SIZE: usize = BUF_SIZE / 4 * 3; + let mut encode_buf: [u8; BUF_SIZE] = [0; BUF_SIZE]; + let mut input_index = 0; + + while input_index < bytes.len() { + // either the full input chunk size, or it's the last iteration + let input_chunk_len = cmp::min(self.max_input_chunk_len, bytes.len() - input_index); + + let chunk = &bytes[input_index..(input_index + input_chunk_len)]; + + let mut b64_bytes_written = self.engine.internal_encode(chunk, &mut encode_buf); + + input_index += input_chunk_len; + let more_input_left = input_index < bytes.len(); - let mut buf = [0; BUF_SIZE]; - for chunk in bytes.chunks(CHUNK_SIZE) { - let mut len = self.engine.internal_encode(chunk, &mut buf); - if chunk.len() != CHUNK_SIZE && self.engine.config().encode_padding() { - // Final, potentially partial, chunk. - // Only need to consider if padding is needed on a partial chunk since full chunk - // is a multiple of 3, which therefore won't be padded. - // Pad output to multiple of four bytes if required by config. - len += add_padding(len, &mut buf[len..]); + if self.engine.config().encode_padding() && !more_input_left { + // no more input, add padding if needed. Buffer will have room because + // max_input_length leaves room for it. + b64_bytes_written += + add_padding(b64_bytes_written, &mut encode_buf[b64_bytes_written..]); } - sink.write_encoded_bytes(&buf[..len])?; + + sink.write_encoded_bytes(&encode_buf[0..b64_bytes_written])?; } Ok(()) } } +/// Calculate the longest input that can be encoded for the given output buffer size. +/// +/// If the config requires padding, two bytes of buffer space will be set aside so that the last +/// chunk of input can be encoded safely. +/// +/// The input length will always be a multiple of 3 so that no encoding state has to be carried over +/// between chunks. +fn max_input_length(encoded_buf_len: usize, padded: bool) -> usize { + let effective_buf_len = if padded { + // make room for padding + encoded_buf_len + .checked_sub(2) + .expect("Don't use a tiny buffer") + } else { + encoded_buf_len + }; + + // No padding, so just normal base64 expansion. + (effective_buf_len / 4) * 3 +} + // A really simple sink that just appends to a string -#[cfg(any(feature = "alloc", test))] +#[cfg(any(feature = "alloc", feature = "std", test))] pub(crate) struct StringSink<'a> { string: &'a mut String, } -#[cfg(any(feature = "alloc", test))] +#[cfg(any(feature = "alloc", feature = "std", test))] impl<'a> StringSink<'a> { pub(crate) fn new(s: &mut String) -> StringSink { StringSink { string: s } } } -#[cfg(any(feature = "alloc", test))] +#[cfg(any(feature = "alloc", feature = "std", test))] impl<'a> Sink for StringSink<'a> { type Error = (); @@ -117,13 +152,38 @@ chunked_encode_matches_normal_encode_random(&helper); } + #[test] + fn max_input_length_no_pad() { + assert_eq!(768, max_input_length(1024, false)); + } + + #[test] + fn max_input_length_with_pad_decrements_one_triple() { + assert_eq!(765, max_input_length(1024, true)); + } + + #[test] + fn max_input_length_with_pad_one_byte_short() { + assert_eq!(765, max_input_length(1025, true)); + } + + #[test] + fn max_input_length_with_pad_fits_exactly() { + assert_eq!(768, max_input_length(1026, true)); + } + + #[test] + fn max_input_length_cant_use_extra_single_encoded_byte() { + assert_eq!(300, max_input_length(401, false)); + } + pub fn chunked_encode_matches_normal_encode_random(sink_test_helper: &S) { let mut input_buf: Vec = Vec::new(); let mut output_buf = String::new(); let mut rng = rand::rngs::SmallRng::from_entropy(); let input_len_range = Uniform::new(1, 10_000); - for _ in 0..20_000 { + for _ in 0..5_000 { input_buf.clear(); output_buf.clear(); diff -Nru temporalio-1.3.0/vendor/base64/src/decode.rs temporalio-1.3.0/vendor/base64/src/decode.rs --- temporalio-1.3.0/vendor/base64/src/decode.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/base64/src/decode.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,5 +1,5 @@ use crate::engine::{general_purpose::STANDARD, DecodeEstimate, Engine}; -#[cfg(any(feature = "alloc", test))] +#[cfg(any(feature = "alloc", feature = "std", test))] use alloc::vec::Vec; use core::fmt; #[cfg(any(feature = "std", test))] @@ -41,7 +41,11 @@ } #[cfg(any(feature = "std", test))] -impl error::Error for DecodeError {} +impl error::Error for DecodeError { + fn cause(&self) -> Option<&dyn error::Error> { + None + } +} /// Errors that can occur while decoding into a slice. #[derive(Clone, Debug, PartialEq, Eq)] @@ -65,7 +69,7 @@ #[cfg(any(feature = "std", test))] impl error::Error for DecodeSliceError { - fn source(&self) -> Option<&(dyn error::Error + 'static)> { + fn cause(&self) -> Option<&dyn error::Error> { match self { DecodeSliceError::DecodeError(e) => Some(e), DecodeSliceError::OutputSliceTooSmall => None, @@ -83,7 +87,7 @@ /// /// See [Engine::decode]. #[deprecated(since = "0.21.0", note = "Use Engine::decode")] -#[cfg(any(feature = "alloc", test))] +#[cfg(any(feature = "alloc", feature = "std", test))] pub fn decode>(input: T) -> Result, DecodeError> { STANDARD.decode(input) } @@ -93,7 +97,7 @@ /// See [Engine::decode]. ///Returns a `Result` containing a `Vec`. #[deprecated(since = "0.21.0", note = "Use Engine::decode")] -#[cfg(any(feature = "alloc", test))] +#[cfg(any(feature = "alloc", feature = "std", test))] pub fn decode_engine>( input: T, engine: &E, @@ -104,7 +108,7 @@ /// Decode from string reference as octets. /// /// See [Engine::decode_vec]. -#[cfg(any(feature = "alloc", test))] +#[cfg(any(feature = "alloc", feature = "std", test))] #[deprecated(since = "0.21.0", note = "Use Engine::decode_vec")] pub fn decode_engine_vec>( input: T, diff -Nru temporalio-1.3.0/vendor/base64/src/encode.rs temporalio-1.3.0/vendor/base64/src/encode.rs --- temporalio-1.3.0/vendor/base64/src/encode.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/base64/src/encode.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,10 +1,10 @@ -#[cfg(any(feature = "alloc", test))] +#[cfg(any(feature = "alloc", feature = "std", test))] use alloc::string::String; use core::fmt; #[cfg(any(feature = "std", test))] use std::error; -#[cfg(any(feature = "alloc", test))] +#[cfg(any(feature = "alloc", feature = "std", test))] use crate::engine::general_purpose::STANDARD; use crate::engine::{Config, Engine}; use crate::PAD_BYTE; @@ -14,7 +14,7 @@ /// See [Engine::encode]. #[allow(unused)] #[deprecated(since = "0.21.0", note = "Use Engine::encode")] -#[cfg(any(feature = "alloc", test))] +#[cfg(any(feature = "alloc", feature = "std", test))] pub fn encode>(input: T) -> String { STANDARD.encode(input) } @@ -24,7 +24,7 @@ /// See [Engine::encode]. #[allow(unused)] #[deprecated(since = "0.21.0", note = "Use Engine::encode")] -#[cfg(any(feature = "alloc", test))] +#[cfg(any(feature = "alloc", feature = "std", test))] pub fn encode_engine>(input: T, engine: &E) -> String { engine.encode(input) } @@ -34,7 +34,7 @@ /// See [Engine::encode_string]. #[allow(unused)] #[deprecated(since = "0.21.0", note = "Use Engine::encode_string")] -#[cfg(any(feature = "alloc", test))] +#[cfg(any(feature = "alloc", feature = "std", test))] pub fn encode_engine_string>( input: T, output_buf: &mut String, @@ -94,32 +94,25 @@ /// /// Returns `None` if the encoded length can't be represented in `usize`. This will happen for /// input lengths in approximately the top quarter of the range of `usize`. -pub const fn encoded_len(bytes_len: usize, padding: bool) -> Option { +pub fn encoded_len(bytes_len: usize, padding: bool) -> Option { let rem = bytes_len % 3; let complete_input_chunks = bytes_len / 3; - // `let Some(_) = _ else` requires 1.65.0, whereas this messier one works on 1.48 - let complete_chunk_output = - if let Some(complete_chunk_output) = complete_input_chunks.checked_mul(4) { - complete_chunk_output - } else { - return None; - }; + let complete_chunk_output = complete_input_chunks.checked_mul(4); if rem > 0 { if padding { - complete_chunk_output.checked_add(4) + complete_chunk_output.and_then(|c| c.checked_add(4)) } else { let encoded_rem = match rem { 1 => 2, - // only other possible remainder is 2 - // can't use a separate _ => unreachable!() in const fns in ancient rust versions - _ => 3, + 2 => 3, + _ => unreachable!("Impossible remainder"), }; - complete_chunk_output.checked_add(encoded_rem) + complete_chunk_output.and_then(|c| c.checked_add(encoded_rem)) } } else { - Some(complete_chunk_output) + complete_chunk_output } } @@ -156,7 +149,11 @@ } #[cfg(any(feature = "std", test))] -impl error::Error for EncodeSliceError {} +impl error::Error for EncodeSliceError { + fn cause(&self) -> Option<&dyn error::Error> { + None + } +} #[cfg(test)] mod tests { diff -Nru temporalio-1.3.0/vendor/base64/src/engine/general_purpose/mod.rs temporalio-1.3.0/vendor/base64/src/engine/general_purpose/mod.rs --- temporalio-1.3.0/vendor/base64/src/engine/general_purpose/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/base64/src/engine/general_purpose/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -19,8 +19,6 @@ /// - It uses no vector CPU instructions, so it will work on any system. /// - It is reasonably fast (~2-3GiB/s). /// - It is not constant-time, though, so it is vulnerable to timing side-channel attacks. For loading cryptographic keys, etc, it is suggested to use the forthcoming constant-time implementation. - -#[derive(Debug, Clone)] pub struct GeneralPurpose { encode_table: [u8; 64], decode_table: [u8; 256], diff -Nru temporalio-1.3.0/vendor/base64/src/engine/mod.rs temporalio-1.3.0/vendor/base64/src/engine/mod.rs --- temporalio-1.3.0/vendor/base64/src/engine/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/base64/src/engine/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,14 +1,14 @@ //! Provides the [Engine] abstraction and out of the box implementations. -#[cfg(any(feature = "alloc", test))] +#[cfg(any(feature = "alloc", feature = "std", test))] use crate::chunked_encoder; use crate::{ encode::{encode_with_padding, EncodeSliceError}, encoded_len, DecodeError, DecodeSliceError, }; -#[cfg(any(feature = "alloc", test))] +#[cfg(any(feature = "alloc", feature = "std", test))] use alloc::vec::Vec; -#[cfg(any(feature = "alloc", test))] +#[cfg(any(feature = "alloc", feature = "std", test))] use alloc::{string::String, vec}; pub mod general_purpose; @@ -113,24 +113,15 @@ /// engine::GeneralPurpose::new(&alphabet::URL_SAFE, general_purpose::NO_PAD); /// /// let b64_url = CUSTOM_ENGINE.encode(b"hello internet~"); - #[cfg(any(feature = "alloc", test))] - #[inline] + #[cfg(any(feature = "alloc", feature = "std", test))] fn encode>(&self, input: T) -> String { - fn inner(engine: &E, input_bytes: &[u8]) -> String - where - E: Engine + ?Sized, - { - let encoded_size = encoded_len(input_bytes.len(), engine.config().encode_padding()) - .expect("integer overflow when calculating buffer size"); - - let mut buf = vec![0; encoded_size]; + let encoded_size = encoded_len(input.as_ref().len(), self.config().encode_padding()) + .expect("integer overflow when calculating buffer size"); + let mut buf = vec![0; encoded_size]; - encode_with_padding(input_bytes, &mut buf[..], engine, encoded_size); + encode_with_padding(input.as_ref(), &mut buf[..], self, encoded_size); - String::from_utf8(buf).expect("Invalid UTF8") - } - - inner(self, input.as_ref()) + String::from_utf8(buf).expect("Invalid UTF8") } /// Encode arbitrary octets as base64 into a supplied `String`. @@ -153,21 +144,17 @@ /// println!("{}", buf); /// } /// ``` - #[cfg(any(feature = "alloc", test))] - #[inline] + #[cfg(any(feature = "alloc", feature = "std", test))] fn encode_string>(&self, input: T, output_buf: &mut String) { - fn inner(engine: &E, input_bytes: &[u8], output_buf: &mut String) - where - E: Engine + ?Sized, + let input_bytes = input.as_ref(); + { let mut sink = chunked_encoder::StringSink::new(output_buf); - chunked_encoder::ChunkedEncoder::new(engine) + chunked_encoder::ChunkedEncoder::new(self) .encode(input_bytes, &mut sink) .expect("Writing to a String shouldn't fail"); } - - inner(self, input.as_ref(), output_buf) } /// Encode arbitrary octets as base64 into a supplied slice. @@ -178,8 +165,7 @@ /// /// # Example /// - #[cfg_attr(feature = "alloc", doc = "```")] - #[cfg_attr(not(feature = "alloc"), doc = "```ignore")] + /// ```rust /// use base64::{Engine as _, engine::general_purpose}; /// let s = b"hello internet!"; /// let mut buf = Vec::new(); @@ -193,35 +179,25 @@ /// /// assert_eq!(s, general_purpose::STANDARD.decode(&buf).unwrap().as_slice()); /// ``` - #[inline] fn encode_slice>( &self, input: T, output_buf: &mut [u8], ) -> Result { - fn inner( - engine: &E, - input_bytes: &[u8], - output_buf: &mut [u8], - ) -> Result - where - E: Engine + ?Sized, - { - let encoded_size = encoded_len(input_bytes.len(), engine.config().encode_padding()) - .expect("usize overflow when calculating buffer size"); + let input_bytes = input.as_ref(); - if output_buf.len() < encoded_size { - return Err(EncodeSliceError::OutputSliceTooSmall); - } + let encoded_size = encoded_len(input_bytes.len(), self.config().encode_padding()) + .expect("usize overflow when calculating buffer size"); - let b64_output = &mut output_buf[0..encoded_size]; + if output_buf.len() < encoded_size { + return Err(EncodeSliceError::OutputSliceTooSmall); + } - encode_with_padding(input_bytes, b64_output, engine, encoded_size); + let b64_output = &mut output_buf[0..encoded_size]; - Ok(encoded_size) - } + encode_with_padding(input_bytes, b64_output, self, encoded_size); - inner(self, input.as_ref(), output_buf) + Ok(encoded_size) } /// Decode the input into a new `Vec`. @@ -242,26 +218,19 @@ /// .decode("aGVsbG8gaW50ZXJuZXR-Cg").unwrap(); /// println!("{:?}", bytes_url); /// ``` - #[cfg(any(feature = "alloc", test))] - #[inline] + #[cfg(any(feature = "alloc", feature = "std", test))] fn decode>(&self, input: T) -> Result, DecodeError> { - fn inner(engine: &E, input_bytes: &[u8]) -> Result, DecodeError> - where - E: Engine + ?Sized, - { - let estimate = engine.internal_decoded_len_estimate(input_bytes.len()); - let mut buffer = vec![0; estimate.decoded_len_estimate()]; - - let bytes_written = engine - .internal_decode(input_bytes, &mut buffer, estimate)? - .decoded_len; + let input_bytes = input.as_ref(); - buffer.truncate(bytes_written); + let estimate = self.internal_decoded_len_estimate(input_bytes.len()); + let mut buffer = vec![0; estimate.decoded_len_estimate()]; - Ok(buffer) - } + let bytes_written = self + .internal_decode(input_bytes, &mut buffer, estimate)? + .decoded_len; + buffer.truncate(bytes_written); - inner(self, input.as_ref()) + Ok(buffer) } /// Decode the `input` into the supplied `buffer`. @@ -294,39 +263,31 @@ /// println!("{:?}", buffer); /// } /// ``` - #[cfg(any(feature = "alloc", test))] - #[inline] + #[cfg(any(feature = "alloc", feature = "std", test))] fn decode_vec>( &self, input: T, buffer: &mut Vec, ) -> Result<(), DecodeError> { - fn inner(engine: &E, input_bytes: &[u8], buffer: &mut Vec) -> Result<(), DecodeError> - where - E: Engine + ?Sized, - { - let starting_output_len = buffer.len(); - let estimate = engine.internal_decoded_len_estimate(input_bytes.len()); - - let total_len_estimate = estimate - .decoded_len_estimate() - .checked_add(starting_output_len) - .expect("Overflow when calculating output buffer length"); + let input_bytes = input.as_ref(); - buffer.resize(total_len_estimate, 0); + let starting_output_len = buffer.len(); - let buffer_slice = &mut buffer.as_mut_slice()[starting_output_len..]; + let estimate = self.internal_decoded_len_estimate(input_bytes.len()); + let total_len_estimate = estimate + .decoded_len_estimate() + .checked_add(starting_output_len) + .expect("Overflow when calculating output buffer length"); + buffer.resize(total_len_estimate, 0); - let bytes_written = engine - .internal_decode(input_bytes, buffer_slice, estimate)? - .decoded_len; + let buffer_slice = &mut buffer.as_mut_slice()[starting_output_len..]; + let bytes_written = self + .internal_decode(input_bytes, buffer_slice, estimate)? + .decoded_len; - buffer.truncate(starting_output_len + bytes_written); + buffer.truncate(starting_output_len + bytes_written); - Ok(()) - } - - inner(self, input.as_ref(), buffer) + Ok(()) } /// Decode the input into the provided output slice. @@ -340,33 +301,21 @@ /// /// See [Engine::decode_slice_unchecked] for a version that panics instead of returning an error /// if the output buffer is too small. - #[inline] fn decode_slice>( &self, input: T, output: &mut [u8], ) -> Result { - fn inner( - engine: &E, - input_bytes: &[u8], - output: &mut [u8], - ) -> Result - where - E: Engine + ?Sized, - { - let estimate = engine.internal_decoded_len_estimate(input_bytes.len()); + let input_bytes = input.as_ref(); - if output.len() < estimate.decoded_len_estimate() { - return Err(DecodeSliceError::OutputSliceTooSmall); - } - - engine - .internal_decode(input_bytes, output, estimate) - .map_err(|e| e.into()) - .map(|dm| dm.decoded_len) + let estimate = self.internal_decoded_len_estimate(input_bytes.len()); + if output.len() < estimate.decoded_len_estimate() { + return Err(DecodeSliceError::OutputSliceTooSmall); } - inner(self, input.as_ref(), output) + self.internal_decode(input_bytes, output, estimate) + .map_err(|e| e.into()) + .map(|dm| dm.decoded_len) } /// Decode the input into the provided output slice. @@ -383,26 +332,19 @@ /// # Panics /// /// Panics if the provided output buffer is too small for the decoded data. - #[inline] fn decode_slice_unchecked>( &self, input: T, output: &mut [u8], ) -> Result { - fn inner(engine: &E, input_bytes: &[u8], output: &mut [u8]) -> Result - where - E: Engine + ?Sized, - { - engine - .internal_decode( - input_bytes, - output, - engine.internal_decoded_len_estimate(input_bytes.len()), - ) - .map(|dm| dm.decoded_len) - } + let input_bytes = input.as_ref(); - inner(self, input.as_ref(), output) + self.internal_decode( + input_bytes, + output, + self.internal_decoded_len_estimate(input_bytes.len()), + ) + .map(|dm| dm.decoded_len) } } diff -Nru temporalio-1.3.0/vendor/base64/src/engine/naive.rs temporalio-1.3.0/vendor/base64/src/engine/naive.rs --- temporalio-1.3.0/vendor/base64/src/engine/naive.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/base64/src/engine/naive.rs 2023-10-30 19:40:00.000000000 +0000 @@ -6,7 +6,8 @@ }, DecodeError, PAD_BYTE, }; -use std::ops::{BitAnd, BitOr, Shl, Shr}; +use alloc::ops::BitOr; +use std::ops::{BitAnd, Shl, Shr}; /// Comparatively simple implementation that can be used as something to compare against in tests pub struct Naive { diff -Nru temporalio-1.3.0/vendor/base64/src/engine/tests.rs temporalio-1.3.0/vendor/base64/src/engine/tests.rs --- temporalio-1.3.0/vendor/base64/src/engine/tests.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/base64/src/engine/tests.rs 2023-10-30 19:40:00.000000000 +0000 @@ -623,7 +623,7 @@ let mut rng = seeded_rng(); // the different amounts of proper padding, w/ offset from end for the last non-padding char - let suffixes = [("/w==", 2), ("iYu=", 1), ("zzzz", 0)]; + let suffixes = vec![("/w==", 2), ("iYu=", 1), ("zzzz", 0)]; let prefix_quads_range = distributions::Uniform::from(0..=256); @@ -869,7 +869,7 @@ fn decode_pad_mode_requires_canonical_rejects_non_canonical(engine_wrapper: E) { let engine = E::standard_with_pad_mode(true, DecodePaddingMode::RequireCanonical); - let suffixes = ["/w", "/w=", "iYU"]; + let suffixes = vec!["/w", "/w=", "iYU"]; for num_prefix_quads in 0..256 { for &suffix in suffixes.iter() { let mut encoded = "AAAA".repeat(num_prefix_quads); @@ -896,7 +896,7 @@ fn decode_pad_mode_requires_no_padding_rejects_any_padding(engine_wrapper: E) { let engine = E::standard_with_pad_mode(true, DecodePaddingMode::RequireNone); - let suffixes = ["/w=", "/w==", "iYU="]; + let suffixes = vec!["/w=", "/w==", "iYU="]; for num_prefix_quads in 0..256 { for &suffix in suffixes.iter() { let mut encoded = "AAAA".repeat(num_prefix_quads); diff -Nru temporalio-1.3.0/vendor/base64/src/lib.rs temporalio-1.3.0/vendor/base64/src/lib.rs --- temporalio-1.3.0/vendor/base64/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/base64/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -81,8 +81,7 @@ //! //! ## Using predefined engines //! -#![cfg_attr(feature = "alloc", doc = "```")] -#![cfg_attr(not(feature = "alloc"), doc = "```ignore")] +//! ``` //! use base64::{Engine as _, engine::general_purpose}; //! //! let orig = b"data"; @@ -96,8 +95,7 @@ //! //! ## Custom alphabet, config, and engine //! -#![cfg_attr(feature = "alloc", doc = "```")] -#![cfg_attr(not(feature = "alloc"), doc = "```ignore")] +//! ``` //! use base64::{engine, alphabet, Engine as _}; //! //! // bizarro-world base64: +/ as the first symbols instead of the last @@ -138,8 +136,10 @@ #![allow(clippy::single_component_path_imports)] #![cfg_attr(not(any(feature = "std", test)), no_std)] -#[cfg(any(feature = "alloc", test))] +#[cfg(all(feature = "alloc", not(any(feature = "std", test))))] extern crate alloc; +#[cfg(any(feature = "std", test))] +extern crate std as alloc; // has to be included at top level because of the way rstest_reuse defines its macros #[cfg(test)] @@ -159,14 +159,14 @@ mod encode; #[allow(deprecated)] -#[cfg(any(feature = "alloc", test))] +#[cfg(any(feature = "alloc", feature = "std", test))] pub use crate::encode::{encode, encode_engine, encode_engine_string}; #[allow(deprecated)] pub use crate::encode::{encode_engine_slice, encoded_len, EncodeSliceError}; mod decode; #[allow(deprecated)] -#[cfg(any(feature = "alloc", test))] +#[cfg(any(feature = "alloc", feature = "std", test))] pub use crate::decode::{decode, decode_engine, decode_engine_vec}; #[allow(deprecated)] pub use crate::decode::{decode_engine_slice, decoded_len_estimate, DecodeError, DecodeSliceError}; diff -Nru temporalio-1.3.0/vendor/base64/src/prelude.rs temporalio-1.3.0/vendor/base64/src/prelude.rs --- temporalio-1.3.0/vendor/base64/src/prelude.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/base64/src/prelude.rs 2023-10-30 19:40:00.000000000 +0000 @@ -5,8 +5,7 @@ //! //! # Examples //! -#![cfg_attr(feature = "alloc", doc = "```")] -#![cfg_attr(not(feature = "alloc"), doc = "```ignore")] +//! ``` //! use base64::prelude::{Engine as _, BASE64_STANDARD_NO_PAD}; //! //! assert_eq!("c29tZSBieXRlcw", &BASE64_STANDARD_NO_PAD.encode(b"some bytes")); diff -Nru temporalio-1.3.0/vendor/base64/src/read/decoder_tests.rs temporalio-1.3.0/vendor/base64/src/read/decoder_tests.rs --- temporalio-1.3.0/vendor/base64/src/read/decoder_tests.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/base64/src/read/decoder_tests.rs 2023-10-30 19:40:00.000000000 +0000 @@ -76,7 +76,7 @@ saw_error = true; break; } - Ok(0) => break, + Ok(read) if read == 0 => break, Ok(_) => (), } } diff -Nru temporalio-1.3.0/vendor/base64/src/write/encoder_string_writer.rs temporalio-1.3.0/vendor/base64/src/write/encoder_string_writer.rs --- temporalio-1.3.0/vendor/base64/src/write/encoder_string_writer.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/base64/src/write/encoder_string_writer.rs 2023-10-30 19:40:00.000000000 +0000 @@ -44,6 +44,11 @@ /// assert_eq!("base64: YXNkZg==", &buf); /// ``` /// +/// # Panics +/// +/// Calling `write()` (or related methods) or `finish()` after `finish()` has completed without +/// error is invalid and will panic. +/// /// # Performance /// /// Because it has to validate that the base64 is UTF-8, it is about 80% as fast as writing plain @@ -139,7 +144,6 @@ engine::Engine, tests::random_engine, write::encoder_string_writer::EncoderStringWriter, }; use rand::Rng; - use std::cmp; use std::io::Write; #[test] @@ -154,8 +158,9 @@ orig_data.clear(); normal_encoded.clear(); - orig_data.resize(size, 0); - rng.fill(&mut orig_data[..]); + for _ in 0..size { + orig_data.push(rng.gen()); + } let engine = random_engine(&mut rng); engine.encode_string(&orig_data, &mut normal_encoded); @@ -167,40 +172,6 @@ let stream_encoded = stream_encoder.into_inner(); - assert_eq!(normal_encoded, stream_encoded); - } - } - #[test] - fn incremental_writes() { - let mut rng = rand::thread_rng(); - let mut orig_data = Vec::::new(); - let mut normal_encoded = String::new(); - - let size = 5_000; - - for _ in 0..size { - orig_data.clear(); - normal_encoded.clear(); - - orig_data.resize(size, 0); - rng.fill(&mut orig_data[..]); - - let engine = random_engine(&mut rng); - engine.encode_string(&orig_data, &mut normal_encoded); - - let mut stream_encoder = EncoderStringWriter::new(&engine); - // write small nibbles of data - let mut offset = 0; - while offset < size { - let nibble_size = cmp::min(rng.gen_range(0..=64), size - offset); - let len = stream_encoder - .write(&orig_data[offset..offset + nibble_size]) - .unwrap(); - offset += len; - } - - let stream_encoded = stream_encoder.into_inner(); - assert_eq!(normal_encoded, stream_encoded); } } diff -Nru temporalio-1.3.0/vendor/base64/src/write/encoder_tests.rs temporalio-1.3.0/vendor/base64/src/write/encoder_tests.rs --- temporalio-1.3.0/vendor/base64/src/write/encoder_tests.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/base64/src/write/encoder_tests.rs 2023-10-30 19:40:00.000000000 +0000 @@ -358,7 +358,7 @@ Ok(_) => break, Err(e) => match e.kind() { io::ErrorKind::Interrupted => continue, - _ => panic!("{:?}", e), // bail + _ => Err(e).unwrap(), // bail }, } } diff -Nru temporalio-1.3.0/vendor/base64/tests/encode.rs temporalio-1.3.0/vendor/base64/tests/encode.rs --- temporalio-1.3.0/vendor/base64/tests/encode.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/base64/tests/encode.rs 2023-10-30 19:40:00.000000000 +0000 @@ -44,34 +44,3 @@ &engine::GeneralPurpose::new(&URL_SAFE, PAD).encode(bytes) ); } - -#[test] -fn encoded_len_unpadded() { - assert_eq!(0, encoded_len(0, false).unwrap()); - assert_eq!(2, encoded_len(1, false).unwrap()); - assert_eq!(3, encoded_len(2, false).unwrap()); - assert_eq!(4, encoded_len(3, false).unwrap()); - assert_eq!(6, encoded_len(4, false).unwrap()); - assert_eq!(7, encoded_len(5, false).unwrap()); - assert_eq!(8, encoded_len(6, false).unwrap()); - assert_eq!(10, encoded_len(7, false).unwrap()); -} - -#[test] -fn encoded_len_padded() { - assert_eq!(0, encoded_len(0, true).unwrap()); - assert_eq!(4, encoded_len(1, true).unwrap()); - assert_eq!(4, encoded_len(2, true).unwrap()); - assert_eq!(4, encoded_len(3, true).unwrap()); - assert_eq!(8, encoded_len(4, true).unwrap()); - assert_eq!(8, encoded_len(5, true).unwrap()); - assert_eq!(8, encoded_len(6, true).unwrap()); - assert_eq!(12, encoded_len(7, true).unwrap()); -} -#[test] -fn encoded_len_overflow() { - let max_size = usize::MAX / 4 * 3 + 2; - assert_eq!(2, max_size % 3); - assert_eq!(Some(usize::MAX), encoded_len(max_size, false)); - assert_eq!(None, encoded_len(max_size + 1, false)); -} diff -Nru temporalio-1.3.0/vendor/base64-0.13.1/benches/benchmarks.rs temporalio-1.3.0/vendor/base64-0.13.1/benches/benchmarks.rs --- temporalio-1.3.0/vendor/base64-0.13.1/benches/benchmarks.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/base64-0.13.1/benches/benchmarks.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,210 +0,0 @@ -extern crate base64; -#[macro_use] -extern crate criterion; -extern crate rand; - -use base64::display; -use base64::{ - decode, decode_config_buf, decode_config_slice, encode, encode_config_buf, encode_config_slice, - write, Config, -}; - -use criterion::{black_box, Bencher, Criterion, ParameterizedBenchmark, Throughput}; -use rand::{FromEntropy, Rng}; -use std::io::{self, Read, Write}; - -const TEST_CONFIG: Config = base64::STANDARD; - -fn do_decode_bench(b: &mut Bencher, &size: &usize) { - let mut v: Vec = Vec::with_capacity(size * 3 / 4); - fill(&mut v); - let encoded = encode(&v); - - b.iter(|| { - let orig = decode(&encoded); - black_box(&orig); - }); -} - -fn do_decode_bench_reuse_buf(b: &mut Bencher, &size: &usize) { - let mut v: Vec = Vec::with_capacity(size * 3 / 4); - fill(&mut v); - let encoded = encode(&v); - - let mut buf = Vec::new(); - b.iter(|| { - decode_config_buf(&encoded, TEST_CONFIG, &mut buf).unwrap(); - black_box(&buf); - buf.clear(); - }); -} - -fn do_decode_bench_slice(b: &mut Bencher, &size: &usize) { - let mut v: Vec = Vec::with_capacity(size * 3 / 4); - fill(&mut v); - let encoded = encode(&v); - - let mut buf = Vec::new(); - buf.resize(size, 0); - b.iter(|| { - decode_config_slice(&encoded, TEST_CONFIG, &mut buf).unwrap(); - black_box(&buf); - }); -} - -fn do_decode_bench_stream(b: &mut Bencher, &size: &usize) { - let mut v: Vec = Vec::with_capacity(size * 3 / 4); - fill(&mut v); - let encoded = encode(&v); - - let mut buf = Vec::new(); - buf.resize(size, 0); - buf.truncate(0); - - b.iter(|| { - let mut cursor = io::Cursor::new(&encoded[..]); - let mut decoder = base64::read::DecoderReader::new(&mut cursor, TEST_CONFIG); - decoder.read_to_end(&mut buf).unwrap(); - buf.clear(); - black_box(&buf); - }); -} - -fn do_encode_bench(b: &mut Bencher, &size: &usize) { - let mut v: Vec = Vec::with_capacity(size); - fill(&mut v); - b.iter(|| { - let e = encode(&v); - black_box(&e); - }); -} - -fn do_encode_bench_display(b: &mut Bencher, &size: &usize) { - let mut v: Vec = Vec::with_capacity(size); - fill(&mut v); - b.iter(|| { - let e = format!("{}", display::Base64Display::with_config(&v, TEST_CONFIG)); - black_box(&e); - }); -} - -fn do_encode_bench_reuse_buf(b: &mut Bencher, &size: &usize) { - let mut v: Vec = Vec::with_capacity(size); - fill(&mut v); - let mut buf = String::new(); - b.iter(|| { - encode_config_buf(&v, TEST_CONFIG, &mut buf); - buf.clear(); - }); -} - -fn do_encode_bench_slice(b: &mut Bencher, &size: &usize) { - let mut v: Vec = Vec::with_capacity(size); - fill(&mut v); - let mut buf = Vec::new(); - // conservative estimate of encoded size - buf.resize(v.len() * 2, 0); - b.iter(|| { - encode_config_slice(&v, TEST_CONFIG, &mut buf); - }); -} - -fn do_encode_bench_stream(b: &mut Bencher, &size: &usize) { - let mut v: Vec = Vec::with_capacity(size); - fill(&mut v); - let mut buf = Vec::new(); - - buf.reserve(size * 2); - b.iter(|| { - buf.clear(); - let mut stream_enc = write::EncoderWriter::new(&mut buf, TEST_CONFIG); - stream_enc.write_all(&v).unwrap(); - stream_enc.flush().unwrap(); - }); -} - -fn do_encode_bench_string_stream(b: &mut Bencher, &size: &usize) { - let mut v: Vec = Vec::with_capacity(size); - fill(&mut v); - - b.iter(|| { - let mut stream_enc = write::EncoderStringWriter::new(TEST_CONFIG); - stream_enc.write_all(&v).unwrap(); - stream_enc.flush().unwrap(); - let _ = stream_enc.into_inner(); - }); -} - -fn do_encode_bench_string_reuse_buf_stream(b: &mut Bencher, &size: &usize) { - let mut v: Vec = Vec::with_capacity(size); - fill(&mut v); - - let mut buf = String::new(); - b.iter(|| { - buf.clear(); - let mut stream_enc = write::EncoderStringWriter::from(&mut buf, TEST_CONFIG); - stream_enc.write_all(&v).unwrap(); - stream_enc.flush().unwrap(); - let _ = stream_enc.into_inner(); - }); -} - -fn fill(v: &mut Vec) { - let cap = v.capacity(); - // weak randomness is plenty; we just want to not be completely friendly to the branch predictor - let mut r = rand::rngs::SmallRng::from_entropy(); - while v.len() < cap { - v.push(r.gen::()); - } -} - -const BYTE_SIZES: [usize; 5] = [3, 50, 100, 500, 3 * 1024]; - -// Benchmarks over these byte sizes take longer so we will run fewer samples to -// keep the benchmark runtime reasonable. -const LARGE_BYTE_SIZES: [usize; 3] = [3 * 1024 * 1024, 10 * 1024 * 1024, 30 * 1024 * 1024]; - -fn encode_benchmarks(byte_sizes: &[usize]) -> ParameterizedBenchmark { - ParameterizedBenchmark::new("encode", do_encode_bench, byte_sizes.iter().cloned()) - .warm_up_time(std::time::Duration::from_millis(500)) - .measurement_time(std::time::Duration::from_secs(3)) - .throughput(|s| Throughput::Bytes(*s as u64)) - .with_function("encode_display", do_encode_bench_display) - .with_function("encode_reuse_buf", do_encode_bench_reuse_buf) - .with_function("encode_slice", do_encode_bench_slice) - .with_function("encode_reuse_buf_stream", do_encode_bench_stream) - .with_function("encode_string_stream", do_encode_bench_string_stream) - .with_function( - "encode_string_reuse_buf_stream", - do_encode_bench_string_reuse_buf_stream, - ) -} - -fn decode_benchmarks(byte_sizes: &[usize]) -> ParameterizedBenchmark { - ParameterizedBenchmark::new("decode", do_decode_bench, byte_sizes.iter().cloned()) - .warm_up_time(std::time::Duration::from_millis(500)) - .measurement_time(std::time::Duration::from_secs(3)) - .throughput(|s| Throughput::Bytes(*s as u64)) - .with_function("decode_reuse_buf", do_decode_bench_reuse_buf) - .with_function("decode_slice", do_decode_bench_slice) - .with_function("decode_stream", do_decode_bench_stream) -} - -fn bench(c: &mut Criterion) { - c.bench("bench_small_input", encode_benchmarks(&BYTE_SIZES[..])); - - c.bench( - "bench_large_input", - encode_benchmarks(&LARGE_BYTE_SIZES[..]).sample_size(10), - ); - - c.bench("bench_small_input", decode_benchmarks(&BYTE_SIZES[..])); - - c.bench( - "bench_large_input", - decode_benchmarks(&LARGE_BYTE_SIZES[..]).sample_size(10), - ); -} - -criterion_group!(benches, bench); -criterion_main!(benches); diff -Nru temporalio-1.3.0/vendor/base64-0.13.1/.cargo-checksum.json temporalio-1.3.0/vendor/base64-0.13.1/.cargo-checksum.json --- temporalio-1.3.0/vendor/base64-0.13.1/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/base64-0.13.1/.cargo-checksum.json 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -{"files":{"Cargo.lock":"0ed67b0f1f68ba5e19475d679df711f1f2c421768462b58e327b5b3ae9111825","Cargo.toml":"ac3f54d7667cfc0baac784fcc6f0a6cc0da9b496af69917fe7abb95f7e3b4a36","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"0dd882e53de11566d50f8e8e2d5a651bcf3fabee4987d70f306233cf39094ba7","README.md":"2810098d290f3df719e6f41ffca38bb954d0fe62d4e56905a9a2436c4784bebf","RELEASE-NOTES.md":"ef116f3596474c9920957f65e346d7d1954f194aa3458eac5b626781116c500b","benches/benchmarks.rs":"bc1f603c5aa87627a93eee71eaed64fbd767d013051bac00ea265c16fecb30b9","examples/base64.rs":"f397b8726df41fce0793a8c6ebe95d4651aa37ed746da305032f1e99d9c37235","examples/make_tables.rs":"392f51b3edb1b5a2c62b823337c7785a6b8535f39f09283b1913a5c68fb186bf","icon_CLion.svg":"cffa044ba75cb998ee3306991dc4a3755ec2f39ab95ddd4b74bc21988389020f","src/chunked_encoder.rs":"fba5ea5f1204b9bf11291ec3483bcb23d330101eb2f6635e33cd63e4de13b653","src/decode.rs":"ba67f53612c494281e2e4aae4350165d54ee827ea7e1170b8e02e2db81b55c6e","src/display.rs":"55f9cd05ba037b77689e2558fa174055fad5273959d1edce3a2289f94244fd5d","src/encode.rs":"8a0a6b71581b4c52c2844111a3611cf73522533452a27f5ef8d09eaa73594e2e","src/lib.rs":"c7b904fac8706bc4758c2763e7a43dc1edd99ed5641ac2355957f6aeff91eece","src/read/decoder.rs":"9a7b65e165f7aed6b007bf7436ac9ba9b03d3b03e9d5a1e16691874e21509ced","src/read/decoder_tests.rs":"aacb7624c33ed6b90e068ff9af6095c839b4088060b4c406c08dce25ce837f6d","src/read/mod.rs":"e0b714eda02d16b1ffa6f78fd09b2f963e01c881b1f7c17b39db4e904be5e746","src/tables.rs":"73ce100fd3f4917ec1e8d9277ff0b956cc2636b33145f101a7cf1a5a8b7bacc1","src/tests.rs":"202ddced9cf52205182c6202e583c4c4f929b9d225fd9d1ebdbfd389cb2df0ba","src/write/encoder.rs":"573f058a66f0a6af4215f5ae75a3e96b07a5e345975693abe30bd1e8ce2d235c","src/write/encoder_string_writer.rs":"3f9109585babe048230659f64973cb1633bbb2ed9de255177336260226127b81","src/write/encoder_tests.rs":"381d7c2871407157c36e909c928307ac0389b3d4504fb80607134e94ac59e68f","src/write/mod.rs":"1503b9457e4f5d2895b24136c3af893f0b7ce18dfe4de1096fc5d17f8d78e99b","tests/decode.rs":"da2cbd49b84e0d8b1d8a52136ba3d97cfb248920a45f9955db1e5bc5367218ce","tests/encode.rs":"5efb6904c36c6f899a05078e5c9be756fc58af1ee9940edfa8dea1ee53675364","tests/helpers.rs":"a76015e4a4e8f98213bdbaa592cd9574ccdc95a28e1b1f835a2753e09fa6037f","tests/tests.rs":"05753e5f1d4a6c75015a5342f9b5dc3073c00bdfe0a829a962f8723321c75549"},"package":"9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/base64-0.13.1/Cargo.lock temporalio-1.3.0/vendor/base64-0.13.1/Cargo.lock --- temporalio-1.3.0/vendor/base64-0.13.1/Cargo.lock 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/base64-0.13.1/Cargo.lock 1970-01-01 00:00:00.000000000 +0000 @@ -1,826 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "ansi_term" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" -dependencies = [ - "winapi", -] - -[[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.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dde43e75fd43e8a1bf86103336bc699aa8d17ad1be60c76c0bdfd4828e19b78" -dependencies = [ - "autocfg 1.1.0", -] - -[[package]] -name = "autocfg" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" - -[[package]] -name = "base64" -version = "0.13.1" -dependencies = [ - "criterion", - "rand", - "structopt", -] - -[[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.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "572f695136211188308f16ad2ca5c851a712c464060ae6974944458eb83880ba" - -[[package]] -name = "cast" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c24dab4283a142afa2fdca129b80ad2c6284e073930f964c3a1293c225ee39a" -dependencies = [ - "rustc_version", -] - -[[package]] -name = "cast" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" - -[[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 = [ - "ansi_term", - "atty", - "bitflags", - "strsim", - "textwrap", - "unicode-width", - "vec_map", -] - -[[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.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63f696897c88b57f4ffe3c69d8e1a0613c7d0e6c4833363c8560fbde9c47b966" -dependencies = [ - "atty", - "cast 0.2.7", - "clap", - "criterion-plot", - "csv", - "itertools 0.9.0", - "lazy_static", - "num-traits", - "oorandom", - "plotters", - "rayon", - "regex", - "serde", - "serde_derive", - "serde_json", - "tinytemplate", - "walkdir", -] - -[[package]] -name = "criterion-plot" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2673cc8207403546f45f5fd319a974b1e6983ad1a3ee7e6041650013be041876" -dependencies = [ - "cast 0.3.0", - "itertools 0.10.5", -] - -[[package]] -name = "crossbeam-channel" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2dd04ddaf88237dc3b8d8f9a3c1004b506b54b3313403944054d23c0870c521" -dependencies = [ - "cfg-if", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-deque" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "715e8152b692bba2d374b53d4875445368fdf21a94751410af607a5ac677d1fc" -dependencies = [ - "cfg-if", - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f916dfc5d356b0ed9dae65f1db9fc9770aa2851d2662b988ccf4fe3516e86348" -dependencies = [ - "autocfg 1.1.0", - "cfg-if", - "crossbeam-utils", - "memoffset", - "scopeguard", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edbafec5fa1f196ca66527c1b12c2ec4745ca14b50f1ad8f9f6f720b55d11fac" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "csv" -version = "1.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22813a6dc45b335f9bade10bf7271dc477e81113e89eb251a0bc2a8a81c536e1" -dependencies = [ - "bstr", - "csv-core", - "itoa 0.4.8", - "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.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" - -[[package]] -name = "fuchsia-cprng" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" - -[[package]] -name = "heck" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" -dependencies = [ - "unicode-segmentation", -] - -[[package]] -name = "hermit-abi" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" -dependencies = [ - "libc", -] - -[[package]] -name = "itertools" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "284f18f85651fe11e8a991b2adb42cb078325c996ed026d994719efcfca1d54b" -dependencies = [ - "either", -] - -[[package]] -name = "itertools" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" - -[[package]] -name = "itoa" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4217ad341ebadf8d8e724e264f13e593e0648f5b3e94b3896a5df283be015ecc" - -[[package]] -name = "js-sys" -version = "0.3.60" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49409df3e3bf0856b916e2ceaca09ee28e6871cf7d9ce97a692cacfdb2a25a47" -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.135" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68783febc7782c6c5cb401fbda4de5a9898be1762314da0bb2c10ced61f18b0c" - -[[package]] -name = "log" -version = "0.4.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "memchr" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" - -[[package]] -name = "memoffset" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" -dependencies = [ - "autocfg 1.1.0", -] - -[[package]] -name = "num-traits" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" -dependencies = [ - "autocfg 1.1.0", -] - -[[package]] -name = "num_cpus" -version = "1.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" -dependencies = [ - "hermit-abi", - "libc", -] - -[[package]] -name = "once_cell" -version = "1.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e82dad04139b71a90c080c8463fe0dc7902db5192d939bd0950f074d014339e1" - -[[package]] -name = "oorandom" -version = "11.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575" - -[[package]] -name = "plotters" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d1685fbe7beba33de0330629da9d955ac75bd54f33d7b79f9a895590124f6bb" -dependencies = [ - "js-sys", - "num-traits", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "proc-macro-error" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" -dependencies = [ - "proc-macro-error-attr", - "proc-macro2", - "quote", - "syn", - "version_check", -] - -[[package]] -name = "proc-macro-error-attr" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" -dependencies = [ - "proc-macro2", - "quote", - "version_check", -] - -[[package]] -name = "proc-macro2" -version = "1.0.47" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ea3d908b0e36316caf9e9e2c4625cdde190a7e6f440d794667ed17a1855e725" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "quote" -version = "1.0.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "rand" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca" -dependencies = [ - "autocfg 0.1.8", - "libc", - "rand_chacha", - "rand_core 0.4.2", - "rand_hc", - "rand_isaac", - "rand_jitter", - "rand_os", - "rand_pcg", - "rand_xorshift", - "winapi", -] - -[[package]] -name = "rand_chacha" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef" -dependencies = [ - "autocfg 0.1.8", - "rand_core 0.3.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_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_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.8", - "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.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd99e5772ead8baa5215278c9b15bf92087709e9c1b2d1f97cdb5a183c933a7d" -dependencies = [ - "autocfg 1.1.0", - "crossbeam-deque", - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "258bcdb5ac6dad48491bb2992db6b7cf74878b0384908af124823d118c99683f" -dependencies = [ - "crossbeam-channel", - "crossbeam-deque", - "crossbeam-utils", - "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 = "regex" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c4eb3267174b8c6c2f654116623910a0fef09c4753f8dd83db29c48a0df988b" -dependencies = [ - "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.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3f87b73ce11b1619a3c6332f45341e0047173771e8b8b73f87bfeefb7b56244" - -[[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.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09" - -[[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 = "semver" -version = "1.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e25dfac463d778e353db5be2449d1cce89bd6fd23c9f1ea21310ce6e5a1b29c4" - -[[package]] -name = "serde" -version = "1.0.146" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6df50b7a60a0ad48e1b42eb38373eac8ff785d619fb14db917b4e63d5439361f" - -[[package]] -name = "serde_derive" -version = "1.0.146" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a714fd32ba1d66047ce7d53dabd809e9922d538f9047de13cc4cffca47b36205" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "serde_json" -version = "1.0.87" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce777b7b150d76b9cf60d28b55f5847135a003f7d7350c6be7a773508ce7d45" -dependencies = [ - "itoa 1.0.4", - "ryu", - "serde", -] - -[[package]] -name = "strsim" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" - -[[package]] -name = "structopt" -version = "0.3.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c6b5c64445ba8094a6ab0c3cd2ad323e07171012d9c98b0b15651daf1787a10" -dependencies = [ - "clap", - "lazy_static", - "structopt-derive", -] - -[[package]] -name = "structopt-derive" -version = "0.4.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcb5ae327f9cc13b68763b5749770cb9e048a99bd9dfdfa58d0cf05d5f64afe0" -dependencies = [ - "heck", - "proc-macro-error", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "syn" -version = "1.0.103" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a864042229133ada95abf3b54fdc62ef5ccabe9515b64717bcb9a1919e59445d" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[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 = "unicode-ident" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ceab39d59e4c9499d4e5a8ee0e2735b891bb7308ac83dfb4e80cad195c9f6f3" - -[[package]] -name = "unicode-segmentation" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fdbf052a0783de01e944a6ce7a8cb939e295b1e7be835a1112c3b9a7f047a5a" - -[[package]] -name = "unicode-width" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" - -[[package]] -name = "vec_map" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" - -[[package]] -name = "version_check" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" - -[[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 = "wasm-bindgen" -version = "0.2.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaf9f5aceeec8be17c128b2e93e031fb8a4d469bb9c4ae2d7dc1888b26887268" -dependencies = [ - "cfg-if", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c8ffb332579b0557b52d268b91feab8df3615f265d5270fec2a8c95b17c1142" -dependencies = [ - "bumpalo", - "log", - "once_cell", - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "052be0f94026e6cbc75cdefc9bae13fd6052cdcaf532fa6c45e7ae33a1e6c810" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c38c045535d93ec4f0b4defec448e4291638ee608530863b1e2ba115d4fff7f" - -[[package]] -name = "web-sys" -version = "0.3.60" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcda906d8be16e728fd5adc5b729afad4e444e106ab28cd1c7256e54fa61510f" -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" diff -Nru temporalio-1.3.0/vendor/base64-0.13.1/Cargo.toml temporalio-1.3.0/vendor/base64-0.13.1/Cargo.toml --- temporalio-1.3.0/vendor/base64-0.13.1/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/base64-0.13.1/Cargo.toml 1970-01-01 00:00:00.000000000 +0000 @@ -1,53 +0,0 @@ -# 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 = "base64" -version = "0.13.1" -authors = [ - "Alice Maz ", - "Marshall Pierce ", -] -description = "encodes and decodes base64 as bytes or utf8" -documentation = "https://docs.rs/base64" -readme = "README.md" -keywords = [ - "base64", - "utf8", - "encode", - "decode", - "no_std", -] -categories = ["encoding"] -license = "MIT/Apache-2.0" -repository = "https://github.com/marshallpierce/rust-base64" - -[profile.bench] -debug = true - -[[bench]] -name = "benchmarks" -harness = false - -[dev-dependencies.criterion] -version = "=0.3.2" - -[dev-dependencies.rand] -version = "0.6.1" - -[dev-dependencies.structopt] -version = "0.3" - -[features] -alloc = [] -default = ["std"] -std = [] diff -Nru temporalio-1.3.0/vendor/base64-0.13.1/examples/base64.rs temporalio-1.3.0/vendor/base64-0.13.1/examples/base64.rs --- temporalio-1.3.0/vendor/base64-0.13.1/examples/base64.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/base64-0.13.1/examples/base64.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,89 +0,0 @@ -use std::fs::File; -use std::io::{self, Read}; -use std::path::PathBuf; -use std::process; -use std::str::FromStr; - -use base64::{read, write}; -use structopt::StructOpt; - -#[derive(Debug, StructOpt)] -enum CharacterSet { - Standard, - UrlSafe, -} - -impl Default for CharacterSet { - fn default() -> Self { - CharacterSet::Standard - } -} - -impl Into for CharacterSet { - fn into(self) -> base64::Config { - match self { - CharacterSet::Standard => base64::STANDARD, - CharacterSet::UrlSafe => base64::URL_SAFE, - } - } -} - -impl FromStr for CharacterSet { - type Err = String; - fn from_str(s: &str) -> Result { - match s { - "standard" => Ok(CharacterSet::Standard), - "urlsafe" => Ok(CharacterSet::UrlSafe), - _ => Err(format!("charset '{}' unrecognized", s)), - } - } -} - -/// Base64 encode or decode FILE (or standard input), to standard output. -#[derive(Debug, StructOpt)] -struct Opt { - /// decode data - #[structopt(short = "d", long = "decode")] - decode: bool, - /// The character set to choose. Defaults to the standard base64 character set. - /// Supported character sets include "standard" and "urlsafe". - #[structopt(long = "charset")] - charset: Option, - /// The file to encode/decode. - #[structopt(parse(from_os_str))] - file: Option, -} - -fn main() { - let opt = Opt::from_args(); - let stdin; - let mut input: Box = match opt.file { - None => { - stdin = io::stdin(); - Box::new(stdin.lock()) - } - Some(ref f) if f.as_os_str() == "-" => { - stdin = io::stdin(); - Box::new(stdin.lock()) - } - Some(f) => Box::new(File::open(f).unwrap()), - }; - let config = opt.charset.unwrap_or_default().into(); - let stdout = io::stdout(); - let mut stdout = stdout.lock(); - let r = if opt.decode { - let mut decoder = read::DecoderReader::new(&mut input, config); - io::copy(&mut decoder, &mut stdout) - } else { - let mut encoder = write::EncoderWriter::new(&mut stdout, config); - io::copy(&mut input, &mut encoder) - }; - if let Err(e) = r { - eprintln!( - "Base64 {} failed with {}", - if opt.decode { "decode" } else { "encode" }, - e - ); - process::exit(1); - } -} diff -Nru temporalio-1.3.0/vendor/base64-0.13.1/examples/make_tables.rs temporalio-1.3.0/vendor/base64-0.13.1/examples/make_tables.rs --- temporalio-1.3.0/vendor/base64-0.13.1/examples/make_tables.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/base64-0.13.1/examples/make_tables.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,179 +0,0 @@ -use std::collections::{HashMap, HashSet}; -use std::iter::Iterator; - -fn main() { - println!("pub const INVALID_VALUE: u8 = 255;"); - - // A-Z - let standard_alphabet: Vec = (0x41..0x5B) - // a-z - .chain(0x61..0x7B) - // 0-9 - .chain(0x30..0x3A) - // + - .chain(0x2B..0x2C) - // / - .chain(0x2F..0x30) - .collect(); - print_encode_table(&standard_alphabet, "STANDARD_ENCODE", 0); - print_decode_table(&standard_alphabet, "STANDARD_DECODE", 0); - - // A-Z - let url_alphabet: Vec = (0x41..0x5B) - // a-z - .chain(0x61..0x7B) - // 0-9 - .chain(0x30..0x3A) - // - - .chain(0x2D..0x2E) - // _ - .chain(0x5F..0x60) - .collect(); - print_encode_table(&url_alphabet, "URL_SAFE_ENCODE", 0); - print_decode_table(&url_alphabet, "URL_SAFE_DECODE", 0); - - // ./0123456789 - let crypt_alphabet: Vec = (b'.'..(b'9' + 1)) - // A-Z - .chain(b'A'..(b'Z' + 1)) - // a-z - .chain(b'a'..(b'z' + 1)) - .collect(); - print_encode_table(&crypt_alphabet, "CRYPT_ENCODE", 0); - print_decode_table(&crypt_alphabet, "CRYPT_DECODE", 0); - - // ./ - let bcrypt_alphabet: Vec = (b'.'..(b'/' + 1)) - // A-Z - .chain(b'A'..(b'Z' + 1)) - // a-z - .chain(b'a'..(b'z' + 1)) - // 0-9 - .chain(b'0'..(b'9' + 1)) - .collect(); - print_encode_table(&bcrypt_alphabet, "BCRYPT_ENCODE", 0); - print_decode_table(&bcrypt_alphabet, "BCRYPT_DECODE", 0); - - // A-Z - let imap_alphabet: Vec = (0x41..0x5B) - // a-z - .chain(0x61..0x7B) - // 0-9 - .chain(0x30..0x3A) - // + - .chain(0x2B..0x2C) - // , - .chain(0x2C..0x2D) - .collect(); - print_encode_table(&imap_alphabet, "IMAP_MUTF7_ENCODE", 0); - print_decode_table(&imap_alphabet, "IMAP_MUTF7_DECODE", 0); - - // '!' - '-' - let binhex_alphabet: Vec = (0x21..0x2E) - // 0-9 - .chain(0x30..0x3A) - // @-N - .chain(0x40..0x4F) - // P-V - .chain(0x50..0x57) - // X-[ - .chain(0x58..0x5C) - // `-f - .chain(0x60..0x66) - // h-m - .chain(0x68..0x6E) - // p-r - .chain(0x70..0x73) - .collect(); - print_encode_table(&binhex_alphabet, "BINHEX_ENCODE", 0); - print_decode_table(&binhex_alphabet, "BINHEX_DECODE", 0); -} - -fn print_encode_table(alphabet: &[u8], const_name: &str, indent_depth: usize) { - check_alphabet(alphabet); - println!("#[rustfmt::skip]"); - println!( - "{:width$}pub const {}: &[u8; 64] = &[", - "", - const_name, - width = indent_depth - ); - - for (i, b) in alphabet.iter().enumerate() { - println!( - "{:width$}{}, // input {} (0x{:X}) => '{}' (0x{:X})", - "", - b, - i, - i, - String::from_utf8(vec![*b as u8]).unwrap(), - b, - width = indent_depth + 4 - ); - } - - println!("{:width$}];", "", width = indent_depth); -} - -fn print_decode_table(alphabet: &[u8], const_name: &str, indent_depth: usize) { - check_alphabet(alphabet); - // map of alphabet bytes to 6-bit morsels - let mut input_to_morsel = HashMap::::new(); - - // standard base64 alphabet bytes, in order - for (morsel, ascii_byte) in alphabet.iter().enumerate() { - // truncation cast is fine here - let _ = input_to_morsel.insert(*ascii_byte, morsel as u8); - } - - println!("#[rustfmt::skip]"); - println!( - "{:width$}pub const {}: &[u8; 256] = &[", - "", - const_name, - width = indent_depth - ); - for ascii_byte in 0..256 { - let (value, comment) = match input_to_morsel.get(&(ascii_byte as u8)) { - None => ( - "INVALID_VALUE".to_string(), - format!("input {} (0x{:X})", ascii_byte, ascii_byte), - ), - Some(v) => ( - format!("{}", *v), - format!( - "input {} (0x{:X} char '{}') => {} (0x{:X})", - ascii_byte, - ascii_byte, - String::from_utf8(vec![ascii_byte as u8]).unwrap(), - *v, - *v - ), - ), - }; - - println!( - "{:width$}{}, // {}", - "", - value, - comment, - width = indent_depth + 4 - ); - } - println!("{:width$}];", "", width = indent_depth); -} - -fn check_alphabet(alphabet: &[u8]) { - // ensure all characters are distinct - assert_eq!(64, alphabet.len()); - let mut set: HashSet = HashSet::new(); - set.extend(alphabet); - assert_eq!(64, set.len()); - - // must be ASCII to be valid as single UTF-8 bytes - for &b in alphabet { - assert!(b <= 0x7F_u8); - // = is assumed to be padding, so cannot be used as a symbol - assert_ne!(b'=', b); - } -} diff -Nru temporalio-1.3.0/vendor/base64-0.13.1/icon_CLion.svg temporalio-1.3.0/vendor/base64-0.13.1/icon_CLion.svg --- temporalio-1.3.0/vendor/base64-0.13.1/icon_CLion.svg 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/base64-0.13.1/icon_CLion.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,34 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - icon_CLion - - - - - - - - - - - - - diff -Nru temporalio-1.3.0/vendor/base64-0.13.1/LICENSE-APACHE temporalio-1.3.0/vendor/base64-0.13.1/LICENSE-APACHE --- temporalio-1.3.0/vendor/base64-0.13.1/LICENSE-APACHE 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/base64-0.13.1/LICENSE-APACHE 1970-01-01 00:00:00.000000000 +0000 @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - -Copyright [yyyy] [name of copyright owner] - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff -Nru temporalio-1.3.0/vendor/base64-0.13.1/LICENSE-MIT temporalio-1.3.0/vendor/base64-0.13.1/LICENSE-MIT --- temporalio-1.3.0/vendor/base64-0.13.1/LICENSE-MIT 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/base64-0.13.1/LICENSE-MIT 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2015 Alice Maz - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff -Nru temporalio-1.3.0/vendor/base64-0.13.1/README.md temporalio-1.3.0/vendor/base64-0.13.1/README.md --- temporalio-1.3.0/vendor/base64-0.13.1/README.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/base64-0.13.1/README.md 1970-01-01 00:00:00.000000000 +0000 @@ -1,114 +0,0 @@ -[base64](https://crates.io/crates/base64) -=== - -[![](https://img.shields.io/crates/v/base64.svg)](https://crates.io/crates/base64) [![Docs](https://docs.rs/base64/badge.svg)](https://docs.rs/base64) [![Build](https://travis-ci.org/marshallpierce/rust-base64.svg?branch=master)](https://travis-ci.org/marshallpierce/rust-base64) [![codecov](https://codecov.io/gh/marshallpierce/rust-base64/branch/master/graph/badge.svg)](https://codecov.io/gh/marshallpierce/rust-base64) [![unsafe forbidden](https://img.shields.io/badge/unsafe-forbidden-success.svg)](https://github.com/rust-secure-code/safety-dance/) - - - -Made with CLion. Thanks to JetBrains for supporting open source! - -It's base64. What more could anyone want? - -This library's goals are to be *correct* and *fast*. It's thoroughly tested and widely used. It exposes functionality at multiple levels of abstraction so you can choose the level of convenience vs performance that you want, e.g. `decode_config_slice` decodes into an existing `&mut [u8]` and is pretty fast (2.6GiB/s for a 3 KiB input), whereas `decode_config` allocates a new `Vec` and returns it, which might be more convenient in some cases, but is slower (although still fast enough for almost any purpose) at 2.1 GiB/s. - -Example ---- - -```rust -extern crate base64; - -use base64::{encode, decode}; - -fn main() { - let a = b"hello world"; - let b = "aGVsbG8gd29ybGQ="; - - assert_eq!(encode(a), b); - assert_eq!(a, &decode(b).unwrap()[..]); -} -``` - -See the [docs](https://docs.rs/base64) for all the details. - -Rust version compatibility ---- - -The minimum required Rust version is 1.34.0. - -Developing ---- - -Benchmarks are in `benches/`. Running them requires nightly rust, but `rustup` makes it easy: - -```bash -rustup run nightly cargo bench -``` - -Decoding is aided by some pre-calculated tables, which are generated by: - -```bash -cargo run --example make_tables > src/tables.rs.tmp && mv src/tables.rs.tmp src/tables.rs -``` - -no_std ---- - -This crate supports no_std. By default the crate targets std via the `std` feature. You can deactivate the `default-features` to target core instead. In that case you lose out on all the functionality revolving around `std::io`, `std::error::Error` and heap allocations. There is an additional `alloc` feature that you can activate to bring back the support for heap allocations. - -Profiling ---- - -On Linux, you can use [perf](https://perf.wiki.kernel.org/index.php/Main_Page) for profiling. Then compile the benchmarks with `rustup nightly run cargo bench --no-run`. - -Run the benchmark binary with `perf` (shown here filtering to one particular benchmark, which will make the results easier to read). `perf` is only available to the root user on most systems as it fiddles with event counters in your CPU, so use `sudo`. We need to run the actual benchmark binary, hence the path into `target`. You can see the actual full path with `rustup run nightly cargo bench -v`; it will print out the commands it runs. If you use the exact path that `bench` outputs, make sure you get the one that's for the benchmarks, not the tests. You may also want to `cargo clean` so you have only one `benchmarks-` binary (they tend to accumulate). - -```bash -sudo perf record target/release/deps/benchmarks-* --bench decode_10mib_reuse -``` - -Then analyze the results, again with perf: - -```bash -sudo perf annotate -l -``` - -You'll see a bunch of interleaved rust source and assembly like this. The section with `lib.rs:327` is telling us that 4.02% of samples saw the `movzbl` aka bit shift as the active instruction. However, this percentage is not as exact as it seems due to a phenomenon called *skid*. Basically, a consequence of how fancy modern CPUs are is that this sort of instruction profiling is inherently inaccurate, especially in branch-heavy code. - -```text - lib.rs:322 0.70 : 10698: mov %rdi,%rax - 2.82 : 1069b: shr $0x38,%rax - : if morsel == decode_tables::INVALID_VALUE { - : bad_byte_index = input_index; - : break; - : }; - : accum = (morsel as u64) << 58; - lib.rs:327 4.02 : 1069f: movzbl (%r9,%rax,1),%r15d - : // fast loop of 8 bytes at a time - : while input_index < length_of_full_chunks { - : let mut accum: u64; - : - : let input_chunk = BigEndian::read_u64(&input_bytes[input_index..(input_index + 8)]); - : morsel = decode_table[(input_chunk >> 56) as usize]; - lib.rs:322 3.68 : 106a4: cmp $0xff,%r15 - : if morsel == decode_tables::INVALID_VALUE { - 0.00 : 106ab: je 1090e -``` - - -Fuzzing ---- - -This uses [cargo-fuzz](https://github.com/rust-fuzz/cargo-fuzz). See `fuzz/fuzzers` for the available fuzzing scripts. To run, use an invocation like these: - -```bash -cargo +nightly fuzz run roundtrip -cargo +nightly fuzz run roundtrip_no_pad -cargo +nightly fuzz run roundtrip_random_config -- -max_len=10240 -cargo +nightly fuzz run decode_random -``` - - -License ---- - -This project is dual-licensed under MIT and Apache 2.0. diff -Nru temporalio-1.3.0/vendor/base64-0.13.1/RELEASE-NOTES.md temporalio-1.3.0/vendor/base64-0.13.1/RELEASE-NOTES.md --- temporalio-1.3.0/vendor/base64-0.13.1/RELEASE-NOTES.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/base64-0.13.1/RELEASE-NOTES.md 1970-01-01 00:00:00.000000000 +0000 @@ -1,109 +0,0 @@ -# 0.13.1 - -- More precise decode buffer sizing, avoiding unnecessary allocation in `decode_config`. - -# 0.13.0 - -- Config methods are const -- Added `EncoderStringWriter` to allow encoding directly to a String -- `EncoderWriter` now owns its delegate writer rather than keeping a reference to it (though refs still work) - - As a consequence, it is now possible to extract the delegate writer from an `EncoderWriter` via `finish()`, which returns `Result` instead of `Result<()>`. If you were calling `finish()` explicitly, you will now need to use `let _ = foo.finish()` instead of just `foo.finish()` to avoid a warning about the unused value. -- When decoding input that has both an invalid length and an invalid symbol as the last byte, `InvalidByte` will be emitted instead of `InvalidLength` to make the problem more obvious. - -# 0.12.2 - -- Add `BinHex` alphabet - -# 0.12.1 - -- Add `Bcrypt` alphabet - -# 0.12.0 - -- A `Read` implementation (`DecoderReader`) to let users transparently decoded data from a b64 input source -- IMAP's modified b64 alphabet -- Relaxed type restrictions to just `AsRef<[ut8]>` for main `encode*`/`decode*` functions -- A minor performance improvement in encoding - -# 0.11.0 -- Minimum rust version 1.34.0 -- `no_std` is now supported via the two new features `alloc` and `std`. - -# 0.10.1 - -- Minimum rust version 1.27.2 -- Fix bug in streaming encoding ([#90](https://github.com/marshallpierce/rust-base64/pull/90)): if the underlying writer didn't write all the bytes given to it, the remaining bytes would not be retried later. See the docs on `EncoderWriter::write`. -- Make it configurable whether or not to return an error when decoding detects excess trailing bits. - -# 0.10.0 - -- Remove line wrapping. Line wrapping was never a great conceptual fit in this library, and other features (streaming encoding, etc) either couldn't support it or could support only special cases of it with a great increase in complexity. Line wrapping has been pulled out into a [line-wrap](https://crates.io/crates/line-wrap) crate, so it's still available if you need it. - - `Base64Display` creation no longer uses a `Result` because it can't fail, which means its helper methods for common - configs that `unwrap()` for you are no longer needed -- Add a streaming encoder `Write` impl to transparently base64 as you write. -- Remove the remaining `unsafe` code. -- Remove whitespace stripping to simplify `no_std` support. No out of the box configs use it, and it's trivial to do yourself if needed: `filter(|b| !b" \n\t\r\x0b\x0c".contains(b)`. -- Detect invalid trailing symbols when decoding and return an error rather than silently ignoring them. - -# 0.9.3 - -- Update safemem - -# 0.9.2 - -- Derive `Clone` for `DecodeError`. - -# 0.9.1 - -- Add support for `crypt(3)`'s base64 variant. - -# 0.9.0 - -- `decode_config_slice` function for no-allocation decoding, analogous to `encode_config_slice` -- Decode performance optimization - -# 0.8.0 - -- `encode_config_slice` function for no-allocation encoding - -# 0.7.0 - -- `STANDARD_NO_PAD` config -- `Base64Display` heap-free wrapper for use in format strings, etc - -# 0.6.0 - -- Decode performance improvements -- Use `unsafe` in fewer places -- Added fuzzers - -# 0.5.2 - -- Avoid usize overflow when calculating length -- Better line wrapping performance - -# 0.5.1 - -- Temporarily disable line wrapping -- Add Apache 2.0 license - -# 0.5.0 - -- MIME support, including configurable line endings and line wrapping -- Removed `decode_ws` -- Renamed `Base64Error` to `DecodeError` - -# 0.4.1 - -- Allow decoding a `AsRef<[u8]>` instead of just a `&str` - -# 0.4.0 - -- Configurable padding -- Encode performance improvements - -# 0.3.0 - -- Added encode/decode functions that do not allocate their own storage -- Decode performance improvements -- Extraneous padding bytes are no longer ignored. Now, an error will be returned. diff -Nru temporalio-1.3.0/vendor/base64-0.13.1/src/chunked_encoder.rs temporalio-1.3.0/vendor/base64-0.13.1/src/chunked_encoder.rs --- temporalio-1.3.0/vendor/base64-0.13.1/src/chunked_encoder.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/base64-0.13.1/src/chunked_encoder.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,247 +0,0 @@ -use crate::{ - encode::{add_padding, encode_to_slice}, - Config, -}; -#[cfg(any(feature = "alloc", feature = "std", test))] -use alloc::string::String; -use core::cmp; -#[cfg(any(feature = "alloc", feature = "std", test))] -use core::str; - -/// The output mechanism for ChunkedEncoder's encoded bytes. -pub trait Sink { - type Error; - - /// Handle a chunk of encoded base64 data (as UTF-8 bytes) - fn write_encoded_bytes(&mut self, encoded: &[u8]) -> Result<(), Self::Error>; -} - -const BUF_SIZE: usize = 1024; - -/// A base64 encoder that emits encoded bytes in chunks without heap allocation. -pub struct ChunkedEncoder { - config: Config, - max_input_chunk_len: usize, -} - -impl ChunkedEncoder { - pub fn new(config: Config) -> ChunkedEncoder { - ChunkedEncoder { - config, - max_input_chunk_len: max_input_length(BUF_SIZE, config), - } - } - - pub fn encode(&self, bytes: &[u8], sink: &mut S) -> Result<(), S::Error> { - let mut encode_buf: [u8; BUF_SIZE] = [0; BUF_SIZE]; - let encode_table = self.config.char_set.encode_table(); - - let mut input_index = 0; - - while input_index < bytes.len() { - // either the full input chunk size, or it's the last iteration - let input_chunk_len = cmp::min(self.max_input_chunk_len, bytes.len() - input_index); - - let chunk = &bytes[input_index..(input_index + input_chunk_len)]; - - let mut b64_bytes_written = encode_to_slice(chunk, &mut encode_buf, encode_table); - - input_index += input_chunk_len; - let more_input_left = input_index < bytes.len(); - - if self.config.pad && !more_input_left { - // no more input, add padding if needed. Buffer will have room because - // max_input_length leaves room for it. - b64_bytes_written += add_padding(bytes.len(), &mut encode_buf[b64_bytes_written..]); - } - - sink.write_encoded_bytes(&encode_buf[0..b64_bytes_written])?; - } - - Ok(()) - } -} - -/// Calculate the longest input that can be encoded for the given output buffer size. -/// -/// If the config requires padding, two bytes of buffer space will be set aside so that the last -/// chunk of input can be encoded safely. -/// -/// The input length will always be a multiple of 3 so that no encoding state has to be carried over -/// between chunks. -fn max_input_length(encoded_buf_len: usize, config: Config) -> usize { - let effective_buf_len = if config.pad { - // make room for padding - encoded_buf_len - .checked_sub(2) - .expect("Don't use a tiny buffer") - } else { - encoded_buf_len - }; - - // No padding, so just normal base64 expansion. - (effective_buf_len / 4) * 3 -} - -// A really simple sink that just appends to a string -#[cfg(any(feature = "alloc", feature = "std", test))] -pub(crate) struct StringSink<'a> { - string: &'a mut String, -} - -#[cfg(any(feature = "alloc", feature = "std", test))] -impl<'a> StringSink<'a> { - pub(crate) fn new(s: &mut String) -> StringSink { - StringSink { string: s } - } -} - -#[cfg(any(feature = "alloc", feature = "std", test))] -impl<'a> Sink for StringSink<'a> { - type Error = (); - - fn write_encoded_bytes(&mut self, s: &[u8]) -> Result<(), Self::Error> { - self.string.push_str(str::from_utf8(s).unwrap()); - - Ok(()) - } -} - -#[cfg(test)] -pub mod tests { - use super::*; - use crate::{encode_config_buf, tests::random_config, CharacterSet, STANDARD}; - - use rand::{ - distributions::{Distribution, Uniform}, - FromEntropy, Rng, - }; - - #[test] - fn chunked_encode_empty() { - assert_eq!("", chunked_encode_str(&[], STANDARD)); - } - - #[test] - fn chunked_encode_intermediate_fast_loop() { - // > 8 bytes input, will enter the pretty fast loop - assert_eq!( - "Zm9vYmFyYmF6cXV4", - chunked_encode_str(b"foobarbazqux", STANDARD) - ); - } - - #[test] - fn chunked_encode_fast_loop() { - // > 32 bytes input, will enter the uber fast loop - assert_eq!( - "Zm9vYmFyYmF6cXV4cXV1eGNvcmdlZ3JhdWx0Z2FycGx5eg==", - chunked_encode_str(b"foobarbazquxquuxcorgegraultgarplyz", STANDARD) - ); - } - - #[test] - fn chunked_encode_slow_loop_only() { - // < 8 bytes input, slow loop only - assert_eq!("Zm9vYmFy", chunked_encode_str(b"foobar", STANDARD)); - } - - #[test] - fn chunked_encode_matches_normal_encode_random_string_sink() { - let helper = StringSinkTestHelper; - chunked_encode_matches_normal_encode_random(&helper); - } - - #[test] - fn max_input_length_no_pad() { - let config = config_with_pad(false); - assert_eq!(768, max_input_length(1024, config)); - } - - #[test] - fn max_input_length_with_pad_decrements_one_triple() { - let config = config_with_pad(true); - assert_eq!(765, max_input_length(1024, config)); - } - - #[test] - fn max_input_length_with_pad_one_byte_short() { - let config = config_with_pad(true); - assert_eq!(765, max_input_length(1025, config)); - } - - #[test] - fn max_input_length_with_pad_fits_exactly() { - let config = config_with_pad(true); - assert_eq!(768, max_input_length(1026, config)); - } - - #[test] - fn max_input_length_cant_use_extra_single_encoded_byte() { - let config = Config::new(crate::CharacterSet::Standard, false); - assert_eq!(300, max_input_length(401, config)); - } - - pub fn chunked_encode_matches_normal_encode_random(sink_test_helper: &S) { - let mut input_buf: Vec = Vec::new(); - let mut output_buf = String::new(); - let mut rng = rand::rngs::SmallRng::from_entropy(); - let input_len_range = Uniform::new(1, 10_000); - - for _ in 0..5_000 { - input_buf.clear(); - output_buf.clear(); - - let buf_len = input_len_range.sample(&mut rng); - for _ in 0..buf_len { - input_buf.push(rng.gen()); - } - - let config = random_config(&mut rng); - - let chunk_encoded_string = sink_test_helper.encode_to_string(config, &input_buf); - encode_config_buf(&input_buf, config, &mut output_buf); - - assert_eq!( - output_buf, chunk_encoded_string, - "input len={}, config: pad={}", - buf_len, config.pad - ); - } - } - - fn chunked_encode_str(bytes: &[u8], config: Config) -> String { - let mut s = String::new(); - { - let mut sink = StringSink::new(&mut s); - let encoder = ChunkedEncoder::new(config); - encoder.encode(bytes, &mut sink).unwrap(); - } - - return s; - } - - fn config_with_pad(pad: bool) -> Config { - Config::new(CharacterSet::Standard, pad) - } - - // An abstraction around sinks so that we can have tests that easily to any sink implementation - pub trait SinkTestHelper { - fn encode_to_string(&self, config: Config, bytes: &[u8]) -> String; - } - - struct StringSinkTestHelper; - - impl SinkTestHelper for StringSinkTestHelper { - fn encode_to_string(&self, config: Config, bytes: &[u8]) -> String { - let encoder = ChunkedEncoder::new(config); - let mut s = String::new(); - { - let mut sink = StringSink::new(&mut s); - encoder.encode(bytes, &mut sink).unwrap(); - } - - s - } - } -} diff -Nru temporalio-1.3.0/vendor/base64-0.13.1/src/decode.rs temporalio-1.3.0/vendor/base64-0.13.1/src/decode.rs --- temporalio-1.3.0/vendor/base64-0.13.1/src/decode.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/base64-0.13.1/src/decode.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,893 +0,0 @@ -use crate::{tables, Config, PAD_BYTE}; - -#[cfg(any(feature = "alloc", feature = "std", test))] -use crate::STANDARD; -#[cfg(any(feature = "alloc", feature = "std", test))] -use alloc::vec::Vec; -use core::fmt; -#[cfg(any(feature = "std", test))] -use std::error; - -// decode logic operates on chunks of 8 input bytes without padding -const INPUT_CHUNK_LEN: usize = 8; -const DECODED_CHUNK_LEN: usize = 6; -// we read a u64 and write a u64, but a u64 of input only yields 6 bytes of output, so the last -// 2 bytes of any output u64 should not be counted as written to (but must be available in a -// slice). -const DECODED_CHUNK_SUFFIX: usize = 2; - -// how many u64's of input to handle at a time -const CHUNKS_PER_FAST_LOOP_BLOCK: usize = 4; -const INPUT_BLOCK_LEN: usize = CHUNKS_PER_FAST_LOOP_BLOCK * INPUT_CHUNK_LEN; -// includes the trailing 2 bytes for the final u64 write -const DECODED_BLOCK_LEN: usize = - CHUNKS_PER_FAST_LOOP_BLOCK * DECODED_CHUNK_LEN + DECODED_CHUNK_SUFFIX; - -/// Errors that can occur while decoding. -#[derive(Clone, Debug, PartialEq, Eq)] -pub enum DecodeError { - /// An invalid byte was found in the input. The offset and offending byte are provided. - InvalidByte(usize, u8), - /// The length of the input is invalid. - /// A typical cause of this is stray trailing whitespace or other separator bytes. - /// In the case where excess trailing bytes have produced an invalid length *and* the last byte - /// is also an invalid base64 symbol (as would be the case for whitespace, etc), `InvalidByte` - /// will be emitted instead of `InvalidLength` to make the issue easier to debug. - InvalidLength, - /// The last non-padding input symbol's encoded 6 bits have nonzero bits that will be discarded. - /// This is indicative of corrupted or truncated Base64. - /// Unlike InvalidByte, which reports symbols that aren't in the alphabet, this error is for - /// symbols that are in the alphabet but represent nonsensical encodings. - InvalidLastSymbol(usize, u8), -} - -impl fmt::Display for DecodeError { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - match *self { - DecodeError::InvalidByte(index, byte) => { - write!(f, "Invalid byte {}, offset {}.", byte, index) - } - DecodeError::InvalidLength => write!(f, "Encoded text cannot have a 6-bit remainder."), - DecodeError::InvalidLastSymbol(index, byte) => { - write!(f, "Invalid last symbol {}, offset {}.", byte, index) - } - } - } -} - -#[cfg(any(feature = "std", test))] -impl error::Error for DecodeError { - fn description(&self) -> &str { - match *self { - DecodeError::InvalidByte(_, _) => "invalid byte", - DecodeError::InvalidLength => "invalid length", - DecodeError::InvalidLastSymbol(_, _) => "invalid last symbol", - } - } - - fn cause(&self) -> Option<&dyn error::Error> { - None - } -} - -///Decode from string reference as octets. -///Returns a Result containing a Vec. -///Convenience `decode_config(input, base64::STANDARD);`. -/// -///# Example -/// -///```rust -///extern crate base64; -/// -///fn main() { -/// let bytes = base64::decode("aGVsbG8gd29ybGQ=").unwrap(); -/// println!("{:?}", bytes); -///} -///``` -#[cfg(any(feature = "alloc", feature = "std", test))] -pub fn decode>(input: T) -> Result, DecodeError> { - decode_config(input, STANDARD) -} - -///Decode from string reference as octets. -///Returns a Result containing a Vec. -/// -///# Example -/// -///```rust -///extern crate base64; -/// -///fn main() { -/// let bytes = base64::decode_config("aGVsbG8gd29ybGR+Cg==", base64::STANDARD).unwrap(); -/// println!("{:?}", bytes); -/// -/// let bytes_url = base64::decode_config("aGVsbG8gaW50ZXJuZXR-Cg==", base64::URL_SAFE).unwrap(); -/// println!("{:?}", bytes_url); -///} -///``` -#[cfg(any(feature = "alloc", feature = "std", test))] -pub fn decode_config>(input: T, config: Config) -> Result, DecodeError> { - let decoded_length_estimate = (input - .as_ref() - .len() - .checked_add(3) - .expect("decoded length calculation overflow")) - / 4 - * 3; - let mut buffer = Vec::::with_capacity(decoded_length_estimate); - - decode_config_buf(input, config, &mut buffer).map(|_| buffer) -} - -///Decode from string reference as octets. -///Writes into the supplied buffer to avoid allocation. -///Returns a Result containing an empty tuple, aka (). -/// -///# Example -/// -///```rust -///extern crate base64; -/// -///fn main() { -/// let mut buffer = Vec::::new(); -/// base64::decode_config_buf("aGVsbG8gd29ybGR+Cg==", base64::STANDARD, &mut buffer).unwrap(); -/// println!("{:?}", buffer); -/// -/// buffer.clear(); -/// -/// base64::decode_config_buf("aGVsbG8gaW50ZXJuZXR-Cg==", base64::URL_SAFE, &mut buffer) -/// .unwrap(); -/// println!("{:?}", buffer); -///} -///``` -#[cfg(any(feature = "alloc", feature = "std", test))] -pub fn decode_config_buf>( - input: T, - config: Config, - buffer: &mut Vec, -) -> Result<(), DecodeError> { - let input_bytes = input.as_ref(); - - let starting_output_len = buffer.len(); - - let num_chunks = num_chunks(input_bytes); - let decoded_len_estimate = num_chunks - .checked_mul(DECODED_CHUNK_LEN) - .and_then(|p| p.checked_add(starting_output_len)) - .expect("Overflow when calculating output buffer length"); - buffer.resize(decoded_len_estimate, 0); - - let bytes_written; - { - let buffer_slice = &mut buffer.as_mut_slice()[starting_output_len..]; - bytes_written = decode_helper(input_bytes, num_chunks, config, buffer_slice)?; - } - - buffer.truncate(starting_output_len + bytes_written); - - Ok(()) -} - -/// Decode the input into the provided output slice. -/// -/// This will not write any bytes past exactly what is decoded (no stray garbage bytes at the end). -/// -/// If you don't know ahead of time what the decoded length should be, size your buffer with a -/// conservative estimate for the decoded length of an input: 3 bytes of output for every 4 bytes of -/// input, rounded up, or in other words `(input_len + 3) / 4 * 3`. -/// -/// If the slice is not large enough, this will panic. -pub fn decode_config_slice>( - input: T, - config: Config, - output: &mut [u8], -) -> Result { - let input_bytes = input.as_ref(); - - decode_helper(input_bytes, num_chunks(input_bytes), config, output) -} - -/// Return the number of input chunks (including a possibly partial final chunk) in the input -fn num_chunks(input: &[u8]) -> usize { - input - .len() - .checked_add(INPUT_CHUNK_LEN - 1) - .expect("Overflow when calculating number of chunks in input") - / INPUT_CHUNK_LEN -} - -/// Helper to avoid duplicating num_chunks calculation, which is costly on short inputs. -/// Returns the number of bytes written, or an error. -// We're on the fragile edge of compiler heuristics here. If this is not inlined, slow. If this is -// inlined(always), a different slow. plain ol' inline makes the benchmarks happiest at the moment, -// but this is fragile and the best setting changes with only minor code modifications. -#[inline] -fn decode_helper( - input: &[u8], - num_chunks: usize, - config: Config, - output: &mut [u8], -) -> Result { - let char_set = config.char_set; - let decode_table = char_set.decode_table(); - - let remainder_len = input.len() % INPUT_CHUNK_LEN; - - // Because the fast decode loop writes in groups of 8 bytes (unrolled to - // CHUNKS_PER_FAST_LOOP_BLOCK times 8 bytes, where possible) and outputs 8 bytes at a time (of - // which only 6 are valid data), we need to be sure that we stop using the fast decode loop - // soon enough that there will always be 2 more bytes of valid data written after that loop. - let trailing_bytes_to_skip = match remainder_len { - // if input is a multiple of the chunk size, ignore the last chunk as it may have padding, - // and the fast decode logic cannot handle padding - 0 => INPUT_CHUNK_LEN, - // 1 and 5 trailing bytes are illegal: can't decode 6 bits of input into a byte - 1 | 5 => { - // trailing whitespace is so common that it's worth it to check the last byte to - // possibly return a better error message - if let Some(b) = input.last() { - if *b != PAD_BYTE && decode_table[*b as usize] == tables::INVALID_VALUE { - return Err(DecodeError::InvalidByte(input.len() - 1, *b)); - } - } - - return Err(DecodeError::InvalidLength); - } - // This will decode to one output byte, which isn't enough to overwrite the 2 extra bytes - // written by the fast decode loop. So, we have to ignore both these 2 bytes and the - // previous chunk. - 2 => INPUT_CHUNK_LEN + 2, - // If this is 3 unpadded chars, then it would actually decode to 2 bytes. However, if this - // is an erroneous 2 chars + 1 pad char that would decode to 1 byte, then it should fail - // with an error, not panic from going past the bounds of the output slice, so we let it - // use stage 3 + 4. - 3 => INPUT_CHUNK_LEN + 3, - // This can also decode to one output byte because it may be 2 input chars + 2 padding - // chars, which would decode to 1 byte. - 4 => INPUT_CHUNK_LEN + 4, - // Everything else is a legal decode len (given that we don't require padding), and will - // decode to at least 2 bytes of output. - _ => remainder_len, - }; - - // rounded up to include partial chunks - let mut remaining_chunks = num_chunks; - - let mut input_index = 0; - let mut output_index = 0; - - { - let length_of_fast_decode_chunks = input.len().saturating_sub(trailing_bytes_to_skip); - - // Fast loop, stage 1 - // manual unroll to CHUNKS_PER_FAST_LOOP_BLOCK of u64s to amortize slice bounds checks - if let Some(max_start_index) = length_of_fast_decode_chunks.checked_sub(INPUT_BLOCK_LEN) { - while input_index <= max_start_index { - let input_slice = &input[input_index..(input_index + INPUT_BLOCK_LEN)]; - let output_slice = &mut output[output_index..(output_index + DECODED_BLOCK_LEN)]; - - decode_chunk( - &input_slice[0..], - input_index, - decode_table, - &mut output_slice[0..], - )?; - decode_chunk( - &input_slice[8..], - input_index + 8, - decode_table, - &mut output_slice[6..], - )?; - decode_chunk( - &input_slice[16..], - input_index + 16, - decode_table, - &mut output_slice[12..], - )?; - decode_chunk( - &input_slice[24..], - input_index + 24, - decode_table, - &mut output_slice[18..], - )?; - - input_index += INPUT_BLOCK_LEN; - output_index += DECODED_BLOCK_LEN - DECODED_CHUNK_SUFFIX; - remaining_chunks -= CHUNKS_PER_FAST_LOOP_BLOCK; - } - } - - // Fast loop, stage 2 (aka still pretty fast loop) - // 8 bytes at a time for whatever we didn't do in stage 1. - if let Some(max_start_index) = length_of_fast_decode_chunks.checked_sub(INPUT_CHUNK_LEN) { - while input_index < max_start_index { - decode_chunk( - &input[input_index..(input_index + INPUT_CHUNK_LEN)], - input_index, - decode_table, - &mut output - [output_index..(output_index + DECODED_CHUNK_LEN + DECODED_CHUNK_SUFFIX)], - )?; - - output_index += DECODED_CHUNK_LEN; - input_index += INPUT_CHUNK_LEN; - remaining_chunks -= 1; - } - } - } - - // Stage 3 - // If input length was such that a chunk had to be deferred until after the fast loop - // because decoding it would have produced 2 trailing bytes that wouldn't then be - // overwritten, we decode that chunk here. This way is slower but doesn't write the 2 - // trailing bytes. - // However, we still need to avoid the last chunk (partial or complete) because it could - // have padding, so we always do 1 fewer to avoid the last chunk. - for _ in 1..remaining_chunks { - decode_chunk_precise( - &input[input_index..], - input_index, - decode_table, - &mut output[output_index..(output_index + DECODED_CHUNK_LEN)], - )?; - - input_index += INPUT_CHUNK_LEN; - output_index += DECODED_CHUNK_LEN; - } - - // always have one more (possibly partial) block of 8 input - debug_assert!(input.len() - input_index > 1 || input.is_empty()); - debug_assert!(input.len() - input_index <= 8); - - // Stage 4 - // Finally, decode any leftovers that aren't a complete input block of 8 bytes. - // Use a u64 as a stack-resident 8 byte buffer. - let mut leftover_bits: u64 = 0; - let mut morsels_in_leftover = 0; - let mut padding_bytes = 0; - let mut first_padding_index: usize = 0; - let mut last_symbol = 0_u8; - let start_of_leftovers = input_index; - for (i, b) in input[start_of_leftovers..].iter().enumerate() { - // '=' padding - if *b == PAD_BYTE { - // There can be bad padding in a few ways: - // 1 - Padding with non-padding characters after it - // 2 - Padding after zero or one non-padding characters before it - // in the current quad. - // 3 - More than two characters of padding. If 3 or 4 padding chars - // are in the same quad, that implies it will be caught by #2. - // If it spreads from one quad to another, it will be caught by - // #2 in the second quad. - - if i % 4 < 2 { - // Check for case #2. - let bad_padding_index = start_of_leftovers - + if padding_bytes > 0 { - // If we've already seen padding, report the first padding index. - // This is to be consistent with the faster logic above: it will report an - // error on the first padding character (since it doesn't expect to see - // anything but actual encoded data). - first_padding_index - } else { - // haven't seen padding before, just use where we are now - i - }; - return Err(DecodeError::InvalidByte(bad_padding_index, *b)); - } - - if padding_bytes == 0 { - first_padding_index = i; - } - - padding_bytes += 1; - continue; - } - - // Check for case #1. - // To make '=' handling consistent with the main loop, don't allow - // non-suffix '=' in trailing chunk either. Report error as first - // erroneous padding. - if padding_bytes > 0 { - return Err(DecodeError::InvalidByte( - start_of_leftovers + first_padding_index, - PAD_BYTE, - )); - } - last_symbol = *b; - - // can use up to 8 * 6 = 48 bits of the u64, if last chunk has no padding. - // To minimize shifts, pack the leftovers from left to right. - let shift = 64 - (morsels_in_leftover + 1) * 6; - // tables are all 256 elements, lookup with a u8 index always succeeds - let morsel = decode_table[*b as usize]; - if morsel == tables::INVALID_VALUE { - return Err(DecodeError::InvalidByte(start_of_leftovers + i, *b)); - } - - leftover_bits |= (morsel as u64) << shift; - morsels_in_leftover += 1; - } - - let leftover_bits_ready_to_append = match morsels_in_leftover { - 0 => 0, - 2 => 8, - 3 => 16, - 4 => 24, - 6 => 32, - 7 => 40, - 8 => 48, - _ => unreachable!( - "Impossible: must only have 0 to 8 input bytes in last chunk, with no invalid lengths" - ), - }; - - // if there are bits set outside the bits we care about, last symbol encodes trailing bits that - // will not be included in the output - let mask = !0 >> leftover_bits_ready_to_append; - if !config.decode_allow_trailing_bits && (leftover_bits & mask) != 0 { - // last morsel is at `morsels_in_leftover` - 1 - return Err(DecodeError::InvalidLastSymbol( - start_of_leftovers + morsels_in_leftover - 1, - last_symbol, - )); - } - - let mut leftover_bits_appended_to_buf = 0; - while leftover_bits_appended_to_buf < leftover_bits_ready_to_append { - // `as` simply truncates the higher bits, which is what we want here - let selected_bits = (leftover_bits >> (56 - leftover_bits_appended_to_buf)) as u8; - output[output_index] = selected_bits; - output_index += 1; - - leftover_bits_appended_to_buf += 8; - } - - Ok(output_index) -} - -#[inline] -fn write_u64(output: &mut [u8], value: u64) { - output[..8].copy_from_slice(&value.to_be_bytes()); -} - -/// Decode 8 bytes of input into 6 bytes of output. 8 bytes of output will be written, but only the -/// first 6 of those contain meaningful data. -/// -/// `input` is the bytes to decode, of which the first 8 bytes will be processed. -/// `index_at_start_of_input` is the offset in the overall input (used for reporting errors -/// accurately) -/// `decode_table` is the lookup table for the particular base64 alphabet. -/// `output` will have its first 8 bytes overwritten, of which only the first 6 are valid decoded -/// data. -// yes, really inline (worth 30-50% speedup) -#[inline(always)] -fn decode_chunk( - input: &[u8], - index_at_start_of_input: usize, - decode_table: &[u8; 256], - output: &mut [u8], -) -> Result<(), DecodeError> { - let mut accum: u64; - - let morsel = decode_table[input[0] as usize]; - if morsel == tables::INVALID_VALUE { - return Err(DecodeError::InvalidByte(index_at_start_of_input, input[0])); - } - accum = (morsel as u64) << 58; - - let morsel = decode_table[input[1] as usize]; - if morsel == tables::INVALID_VALUE { - return Err(DecodeError::InvalidByte( - index_at_start_of_input + 1, - input[1], - )); - } - accum |= (morsel as u64) << 52; - - let morsel = decode_table[input[2] as usize]; - if morsel == tables::INVALID_VALUE { - return Err(DecodeError::InvalidByte( - index_at_start_of_input + 2, - input[2], - )); - } - accum |= (morsel as u64) << 46; - - let morsel = decode_table[input[3] as usize]; - if morsel == tables::INVALID_VALUE { - return Err(DecodeError::InvalidByte( - index_at_start_of_input + 3, - input[3], - )); - } - accum |= (morsel as u64) << 40; - - let morsel = decode_table[input[4] as usize]; - if morsel == tables::INVALID_VALUE { - return Err(DecodeError::InvalidByte( - index_at_start_of_input + 4, - input[4], - )); - } - accum |= (morsel as u64) << 34; - - let morsel = decode_table[input[5] as usize]; - if morsel == tables::INVALID_VALUE { - return Err(DecodeError::InvalidByte( - index_at_start_of_input + 5, - input[5], - )); - } - accum |= (morsel as u64) << 28; - - let morsel = decode_table[input[6] as usize]; - if morsel == tables::INVALID_VALUE { - return Err(DecodeError::InvalidByte( - index_at_start_of_input + 6, - input[6], - )); - } - accum |= (morsel as u64) << 22; - - let morsel = decode_table[input[7] as usize]; - if morsel == tables::INVALID_VALUE { - return Err(DecodeError::InvalidByte( - index_at_start_of_input + 7, - input[7], - )); - } - accum |= (morsel as u64) << 16; - - write_u64(output, accum); - - Ok(()) -} - -/// Decode an 8-byte chunk, but only write the 6 bytes actually decoded instead of including 2 -/// trailing garbage bytes. -#[inline] -fn decode_chunk_precise( - input: &[u8], - index_at_start_of_input: usize, - decode_table: &[u8; 256], - output: &mut [u8], -) -> Result<(), DecodeError> { - let mut tmp_buf = [0_u8; 8]; - - decode_chunk( - input, - index_at_start_of_input, - decode_table, - &mut tmp_buf[..], - )?; - - output[0..6].copy_from_slice(&tmp_buf[0..6]); - - Ok(()) -} - -#[cfg(test)] -mod tests { - use super::*; - use crate::{ - encode::encode_config_buf, - encode::encode_config_slice, - tests::{assert_encode_sanity, random_config}, - }; - - use rand::{ - distributions::{Distribution, Uniform}, - FromEntropy, Rng, - }; - - #[test] - fn decode_chunk_precise_writes_only_6_bytes() { - let input = b"Zm9vYmFy"; // "foobar" - let mut output = [0_u8, 1, 2, 3, 4, 5, 6, 7]; - decode_chunk_precise(&input[..], 0, tables::STANDARD_DECODE, &mut output).unwrap(); - assert_eq!(&vec![b'f', b'o', b'o', b'b', b'a', b'r', 6, 7], &output); - } - - #[test] - fn decode_chunk_writes_8_bytes() { - let input = b"Zm9vYmFy"; // "foobar" - let mut output = [0_u8, 1, 2, 3, 4, 5, 6, 7]; - decode_chunk(&input[..], 0, tables::STANDARD_DECODE, &mut output).unwrap(); - assert_eq!(&vec![b'f', b'o', b'o', b'b', b'a', b'r', 0, 0], &output); - } - - #[test] - fn decode_into_nonempty_vec_doesnt_clobber_existing_prefix() { - let mut orig_data = Vec::new(); - let mut encoded_data = String::new(); - let mut decoded_with_prefix = Vec::new(); - let mut decoded_without_prefix = Vec::new(); - let mut prefix = Vec::new(); - - let prefix_len_range = Uniform::new(0, 1000); - let input_len_range = Uniform::new(0, 1000); - - let mut rng = rand::rngs::SmallRng::from_entropy(); - - for _ in 0..10_000 { - orig_data.clear(); - encoded_data.clear(); - decoded_with_prefix.clear(); - decoded_without_prefix.clear(); - prefix.clear(); - - let input_len = input_len_range.sample(&mut rng); - - for _ in 0..input_len { - orig_data.push(rng.gen()); - } - - let config = random_config(&mut rng); - encode_config_buf(&orig_data, config, &mut encoded_data); - assert_encode_sanity(&encoded_data, config, input_len); - - let prefix_len = prefix_len_range.sample(&mut rng); - - // fill the buf with a prefix - for _ in 0..prefix_len { - prefix.push(rng.gen()); - } - - decoded_with_prefix.resize(prefix_len, 0); - decoded_with_prefix.copy_from_slice(&prefix); - - // decode into the non-empty buf - decode_config_buf(&encoded_data, config, &mut decoded_with_prefix).unwrap(); - // also decode into the empty buf - decode_config_buf(&encoded_data, config, &mut decoded_without_prefix).unwrap(); - - assert_eq!( - prefix_len + decoded_without_prefix.len(), - decoded_with_prefix.len() - ); - assert_eq!(orig_data, decoded_without_prefix); - - // append plain decode onto prefix - prefix.append(&mut decoded_without_prefix); - - assert_eq!(prefix, decoded_with_prefix); - } - } - - #[test] - fn decode_into_slice_doesnt_clobber_existing_prefix_or_suffix() { - let mut orig_data = Vec::new(); - let mut encoded_data = String::new(); - let mut decode_buf = Vec::new(); - let mut decode_buf_copy: Vec = Vec::new(); - - let input_len_range = Uniform::new(0, 1000); - - let mut rng = rand::rngs::SmallRng::from_entropy(); - - for _ in 0..10_000 { - orig_data.clear(); - encoded_data.clear(); - decode_buf.clear(); - decode_buf_copy.clear(); - - let input_len = input_len_range.sample(&mut rng); - - for _ in 0..input_len { - orig_data.push(rng.gen()); - } - - let config = random_config(&mut rng); - encode_config_buf(&orig_data, config, &mut encoded_data); - assert_encode_sanity(&encoded_data, config, input_len); - - // fill the buffer with random garbage, long enough to have some room before and after - for _ in 0..5000 { - decode_buf.push(rng.gen()); - } - - // keep a copy for later comparison - decode_buf_copy.extend(decode_buf.iter()); - - let offset = 1000; - - // decode into the non-empty buf - let decode_bytes_written = - decode_config_slice(&encoded_data, config, &mut decode_buf[offset..]).unwrap(); - - assert_eq!(orig_data.len(), decode_bytes_written); - assert_eq!( - orig_data, - &decode_buf[offset..(offset + decode_bytes_written)] - ); - assert_eq!(&decode_buf_copy[0..offset], &decode_buf[0..offset]); - assert_eq!( - &decode_buf_copy[offset + decode_bytes_written..], - &decode_buf[offset + decode_bytes_written..] - ); - } - } - - #[test] - fn decode_into_slice_fits_in_precisely_sized_slice() { - let mut orig_data = Vec::new(); - let mut encoded_data = String::new(); - let mut decode_buf = Vec::new(); - - let input_len_range = Uniform::new(0, 1000); - - let mut rng = rand::rngs::SmallRng::from_entropy(); - - for _ in 0..10_000 { - orig_data.clear(); - encoded_data.clear(); - decode_buf.clear(); - - let input_len = input_len_range.sample(&mut rng); - - for _ in 0..input_len { - orig_data.push(rng.gen()); - } - - let config = random_config(&mut rng); - encode_config_buf(&orig_data, config, &mut encoded_data); - assert_encode_sanity(&encoded_data, config, input_len); - - decode_buf.resize(input_len, 0); - - // decode into the non-empty buf - let decode_bytes_written = - decode_config_slice(&encoded_data, config, &mut decode_buf[..]).unwrap(); - - assert_eq!(orig_data.len(), decode_bytes_written); - assert_eq!(orig_data, decode_buf); - } - } - - #[test] - fn detect_invalid_last_symbol_two_bytes() { - let decode = - |input, forgiving| decode_config(input, STANDARD.decode_allow_trailing_bits(forgiving)); - - // example from https://github.com/marshallpierce/rust-base64/issues/75 - assert!(decode("iYU=", false).is_ok()); - // trailing 01 - assert_eq!( - Err(DecodeError::InvalidLastSymbol(2, b'V')), - decode("iYV=", false) - ); - assert_eq!(Ok(vec![137, 133]), decode("iYV=", true)); - // trailing 10 - assert_eq!( - Err(DecodeError::InvalidLastSymbol(2, b'W')), - decode("iYW=", false) - ); - assert_eq!(Ok(vec![137, 133]), decode("iYV=", true)); - // trailing 11 - assert_eq!( - Err(DecodeError::InvalidLastSymbol(2, b'X')), - decode("iYX=", false) - ); - assert_eq!(Ok(vec![137, 133]), decode("iYV=", true)); - - // also works when there are 2 quads in the last block - assert_eq!( - Err(DecodeError::InvalidLastSymbol(6, b'X')), - decode("AAAAiYX=", false) - ); - assert_eq!(Ok(vec![0, 0, 0, 137, 133]), decode("AAAAiYX=", true)); - } - - #[test] - fn detect_invalid_last_symbol_one_byte() { - // 0xFF -> "/w==", so all letters > w, 0-9, and '+', '/' should get InvalidLastSymbol - - assert!(decode("/w==").is_ok()); - // trailing 01 - assert_eq!(Err(DecodeError::InvalidLastSymbol(1, b'x')), decode("/x==")); - assert_eq!(Err(DecodeError::InvalidLastSymbol(1, b'z')), decode("/z==")); - assert_eq!(Err(DecodeError::InvalidLastSymbol(1, b'0')), decode("/0==")); - assert_eq!(Err(DecodeError::InvalidLastSymbol(1, b'9')), decode("/9==")); - assert_eq!(Err(DecodeError::InvalidLastSymbol(1, b'+')), decode("/+==")); - assert_eq!(Err(DecodeError::InvalidLastSymbol(1, b'/')), decode("//==")); - - // also works when there are 2 quads in the last block - assert_eq!( - Err(DecodeError::InvalidLastSymbol(5, b'x')), - decode("AAAA/x==") - ); - } - - #[test] - fn detect_invalid_last_symbol_every_possible_three_symbols() { - let mut base64_to_bytes = ::std::collections::HashMap::new(); - - let mut bytes = [0_u8; 2]; - for b1 in 0_u16..256 { - bytes[0] = b1 as u8; - for b2 in 0_u16..256 { - bytes[1] = b2 as u8; - let mut b64 = vec![0_u8; 4]; - assert_eq!(4, encode_config_slice(&bytes, STANDARD, &mut b64[..])); - let mut v = ::std::vec::Vec::with_capacity(2); - v.extend_from_slice(&bytes[..]); - - assert!(base64_to_bytes.insert(b64, v).is_none()); - } - } - - // every possible combination of symbols must either decode to 2 bytes or get InvalidLastSymbol - - let mut symbols = [0_u8; 4]; - for &s1 in STANDARD.char_set.encode_table().iter() { - symbols[0] = s1; - for &s2 in STANDARD.char_set.encode_table().iter() { - symbols[1] = s2; - for &s3 in STANDARD.char_set.encode_table().iter() { - symbols[2] = s3; - symbols[3] = PAD_BYTE; - - match base64_to_bytes.get(&symbols[..]) { - Some(bytes) => { - assert_eq!(Ok(bytes.to_vec()), decode_config(&symbols, STANDARD)) - } - None => assert_eq!( - Err(DecodeError::InvalidLastSymbol(2, s3)), - decode_config(&symbols[..], STANDARD) - ), - } - } - } - } - } - - #[test] - fn detect_invalid_last_symbol_every_possible_two_symbols() { - let mut base64_to_bytes = ::std::collections::HashMap::new(); - - for b in 0_u16..256 { - let mut b64 = vec![0_u8; 4]; - assert_eq!(4, encode_config_slice(&[b as u8], STANDARD, &mut b64[..])); - let mut v = ::std::vec::Vec::with_capacity(1); - v.push(b as u8); - - assert!(base64_to_bytes.insert(b64, v).is_none()); - } - - // every possible combination of symbols must either decode to 1 byte or get InvalidLastSymbol - - let mut symbols = [0_u8; 4]; - for &s1 in STANDARD.char_set.encode_table().iter() { - symbols[0] = s1; - for &s2 in STANDARD.char_set.encode_table().iter() { - symbols[1] = s2; - symbols[2] = PAD_BYTE; - symbols[3] = PAD_BYTE; - - match base64_to_bytes.get(&symbols[..]) { - Some(bytes) => { - assert_eq!(Ok(bytes.to_vec()), decode_config(&symbols, STANDARD)) - } - None => assert_eq!( - Err(DecodeError::InvalidLastSymbol(1, s2)), - decode_config(&symbols[..], STANDARD) - ), - } - } - } - } - - #[test] - fn decode_config_estimation_works_for_various_lengths() { - for num_prefix_quads in 0..100 { - for suffix in &["AA", "AAA", "AAAA"] { - let mut prefix = "AAAA".repeat(num_prefix_quads); - prefix.push_str(suffix); - // make sure no overflow (and thus a panic) occurs - let res = decode_config(prefix, STANDARD); - assert!(res.is_ok()); - } - } - } -} diff -Nru temporalio-1.3.0/vendor/base64-0.13.1/src/display.rs temporalio-1.3.0/vendor/base64-0.13.1/src/display.rs --- temporalio-1.3.0/vendor/base64-0.13.1/src/display.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/base64-0.13.1/src/display.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,88 +0,0 @@ -//! Enables base64'd output anywhere you might use a `Display` implementation, like a format string. -//! -//! ``` -//! use base64::display::Base64Display; -//! -//! let data = vec![0x0, 0x1, 0x2, 0x3]; -//! let wrapper = Base64Display::with_config(&data, base64::STANDARD); -//! -//! assert_eq!("base64: AAECAw==", format!("base64: {}", wrapper)); -//! ``` - -use super::chunked_encoder::ChunkedEncoder; -use super::Config; -use core::fmt::{Display, Formatter}; -use core::{fmt, str}; - -/// A convenience wrapper for base64'ing bytes into a format string without heap allocation. -pub struct Base64Display<'a> { - bytes: &'a [u8], - chunked_encoder: ChunkedEncoder, -} - -impl<'a> Base64Display<'a> { - /// Create a `Base64Display` with the provided config. - pub fn with_config(bytes: &[u8], config: Config) -> Base64Display { - Base64Display { - bytes, - chunked_encoder: ChunkedEncoder::new(config), - } - } -} - -impl<'a> Display for Base64Display<'a> { - fn fmt(&self, formatter: &mut Formatter) -> Result<(), fmt::Error> { - let mut sink = FormatterSink { f: formatter }; - self.chunked_encoder.encode(self.bytes, &mut sink) - } -} - -struct FormatterSink<'a, 'b: 'a> { - f: &'a mut Formatter<'b>, -} - -impl<'a, 'b: 'a> super::chunked_encoder::Sink for FormatterSink<'a, 'b> { - type Error = fmt::Error; - - fn write_encoded_bytes(&mut self, encoded: &[u8]) -> Result<(), Self::Error> { - // Avoid unsafe. If max performance is needed, write your own display wrapper that uses - // unsafe here to gain about 10-15%. - self.f - .write_str(str::from_utf8(encoded).expect("base64 data was not utf8")) - } -} - -#[cfg(test)] -mod tests { - use super::super::chunked_encoder::tests::{ - chunked_encode_matches_normal_encode_random, SinkTestHelper, - }; - use super::super::*; - use super::*; - - #[test] - fn basic_display() { - assert_eq!( - "~$Zm9vYmFy#*", - format!("~${}#*", Base64Display::with_config(b"foobar", STANDARD)) - ); - assert_eq!( - "~$Zm9vYmFyZg==#*", - format!("~${}#*", Base64Display::with_config(b"foobarf", STANDARD)) - ); - } - - #[test] - fn display_encode_matches_normal_encode() { - let helper = DisplaySinkTestHelper; - chunked_encode_matches_normal_encode_random(&helper); - } - - struct DisplaySinkTestHelper; - - impl SinkTestHelper for DisplaySinkTestHelper { - fn encode_to_string(&self, config: Config, bytes: &[u8]) -> String { - format!("{}", Base64Display::with_config(bytes, config)) - } - } -} diff -Nru temporalio-1.3.0/vendor/base64-0.13.1/src/encode.rs temporalio-1.3.0/vendor/base64-0.13.1/src/encode.rs --- temporalio-1.3.0/vendor/base64-0.13.1/src/encode.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/base64-0.13.1/src/encode.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,675 +0,0 @@ -use crate::{Config, PAD_BYTE}; -#[cfg(any(feature = "alloc", feature = "std", test))] -use crate::{chunked_encoder, STANDARD}; -#[cfg(any(feature = "alloc", feature = "std", test))] -use alloc::{string::String, vec}; -use core::convert::TryInto; - -///Encode arbitrary octets as base64. -///Returns a String. -///Convenience for `encode_config(input, base64::STANDARD);`. -/// -///# Example -/// -///```rust -///extern crate base64; -/// -///fn main() { -/// let b64 = base64::encode(b"hello world"); -/// println!("{}", b64); -///} -///``` -#[cfg(any(feature = "alloc", feature = "std", test))] -pub fn encode>(input: T) -> String { - encode_config(input, STANDARD) -} - -///Encode arbitrary octets as base64. -///Returns a String. -/// -///# Example -/// -///```rust -///extern crate base64; -/// -///fn main() { -/// let b64 = base64::encode_config(b"hello world~", base64::STANDARD); -/// println!("{}", b64); -/// -/// let b64_url = base64::encode_config(b"hello internet~", base64::URL_SAFE); -/// println!("{}", b64_url); -///} -///``` -#[cfg(any(feature = "alloc", feature = "std", test))] -pub fn encode_config>(input: T, config: Config) -> String { - let mut buf = match encoded_size(input.as_ref().len(), config) { - Some(n) => vec![0; n], - None => panic!("integer overflow when calculating buffer size"), - }; - - encode_with_padding(input.as_ref(), config, buf.len(), &mut buf[..]); - - String::from_utf8(buf).expect("Invalid UTF8") -} - -///Encode arbitrary octets as base64. -///Writes into the supplied output buffer, which will grow the buffer if needed. -/// -///# Example -/// -///```rust -///extern crate base64; -/// -///fn main() { -/// let mut buf = String::new(); -/// base64::encode_config_buf(b"hello world~", base64::STANDARD, &mut buf); -/// println!("{}", buf); -/// -/// buf.clear(); -/// base64::encode_config_buf(b"hello internet~", base64::URL_SAFE, &mut buf); -/// println!("{}", buf); -///} -///``` -#[cfg(any(feature = "alloc", feature = "std", test))] -pub fn encode_config_buf>(input: T, config: Config, buf: &mut String) { - let input_bytes = input.as_ref(); - - { - let mut sink = chunked_encoder::StringSink::new(buf); - let encoder = chunked_encoder::ChunkedEncoder::new(config); - - encoder - .encode(input_bytes, &mut sink) - .expect("Writing to a String shouldn't fail") - } -} - -/// Encode arbitrary octets as base64. -/// Writes into the supplied output buffer. -/// -/// This is useful if you wish to avoid allocation entirely (e.g. encoding into a stack-resident -/// or statically-allocated buffer). -/// -/// # Panics -/// -/// If `output` is too small to hold the encoded version of `input`, a panic will result. -/// -/// # Example -/// -/// ```rust -/// extern crate base64; -/// -/// fn main() { -/// let s = b"hello internet!"; -/// let mut buf = Vec::new(); -/// // make sure we'll have a slice big enough for base64 + padding -/// buf.resize(s.len() * 4 / 3 + 4, 0); -/// -/// let bytes_written = base64::encode_config_slice(s, -/// base64::STANDARD, &mut buf); -/// -/// // shorten our vec down to just what was written -/// buf.resize(bytes_written, 0); -/// -/// assert_eq!(s, base64::decode(&buf).unwrap().as_slice()); -/// } -/// ``` -pub fn encode_config_slice>(input: T, config: Config, output: &mut [u8]) -> usize { - let input_bytes = input.as_ref(); - - let encoded_size = encoded_size(input_bytes.len(), config) - .expect("usize overflow when calculating buffer size"); - - let mut b64_output = &mut output[0..encoded_size]; - - encode_with_padding(&input_bytes, config, encoded_size, &mut b64_output); - - encoded_size -} - -/// B64-encode and pad (if configured). -/// -/// This helper exists to avoid recalculating encoded_size, which is relatively expensive on short -/// inputs. -/// -/// `encoded_size` is the encoded size calculated for `input`. -/// -/// `output` must be of size `encoded_size`. -/// -/// All bytes in `output` will be written to since it is exactly the size of the output. -fn encode_with_padding(input: &[u8], config: Config, encoded_size: usize, output: &mut [u8]) { - debug_assert_eq!(encoded_size, output.len()); - - let b64_bytes_written = encode_to_slice(input, output, config.char_set.encode_table()); - - let padding_bytes = if config.pad { - add_padding(input.len(), &mut output[b64_bytes_written..]) - } else { - 0 - }; - - let encoded_bytes = b64_bytes_written - .checked_add(padding_bytes) - .expect("usize overflow when calculating b64 length"); - - debug_assert_eq!(encoded_size, encoded_bytes); -} - -#[inline] -fn read_u64(s: &[u8]) -> u64 { - u64::from_be_bytes(s[..8].try_into().unwrap()) -} - -/// Encode input bytes to utf8 base64 bytes. Does not pad. -/// `output` must be long enough to hold the encoded `input` without padding. -/// Returns the number of bytes written. -#[inline] -pub fn encode_to_slice(input: &[u8], output: &mut [u8], encode_table: &[u8; 64]) -> usize { - let mut input_index: usize = 0; - - const BLOCKS_PER_FAST_LOOP: usize = 4; - const LOW_SIX_BITS: u64 = 0x3F; - - // we read 8 bytes at a time (u64) but only actually consume 6 of those bytes. Thus, we need - // 2 trailing bytes to be available to read.. - let last_fast_index = input.len().saturating_sub(BLOCKS_PER_FAST_LOOP * 6 + 2); - let mut output_index = 0; - - if last_fast_index > 0 { - while input_index <= last_fast_index { - // Major performance wins from letting the optimizer do the bounds check once, mostly - // on the output side - let input_chunk = &input[input_index..(input_index + (BLOCKS_PER_FAST_LOOP * 6 + 2))]; - let output_chunk = &mut output[output_index..(output_index + BLOCKS_PER_FAST_LOOP * 8)]; - - // Hand-unrolling for 32 vs 16 or 8 bytes produces yields performance about equivalent - // to unsafe pointer code on a Xeon E5-1650v3. 64 byte unrolling was slightly better for - // large inputs but significantly worse for 50-byte input, unsurprisingly. I suspect - // that it's a not uncommon use case to encode smallish chunks of data (e.g. a 64-byte - // SHA-512 digest), so it would be nice if that fit in the unrolled loop at least once. - // Plus, single-digit percentage performance differences might well be quite different - // on different hardware. - - let input_u64 = read_u64(&input_chunk[0..]); - - output_chunk[0] = encode_table[((input_u64 >> 58) & LOW_SIX_BITS) as usize]; - output_chunk[1] = encode_table[((input_u64 >> 52) & LOW_SIX_BITS) as usize]; - output_chunk[2] = encode_table[((input_u64 >> 46) & LOW_SIX_BITS) as usize]; - output_chunk[3] = encode_table[((input_u64 >> 40) & LOW_SIX_BITS) as usize]; - output_chunk[4] = encode_table[((input_u64 >> 34) & LOW_SIX_BITS) as usize]; - output_chunk[5] = encode_table[((input_u64 >> 28) & LOW_SIX_BITS) as usize]; - output_chunk[6] = encode_table[((input_u64 >> 22) & LOW_SIX_BITS) as usize]; - output_chunk[7] = encode_table[((input_u64 >> 16) & LOW_SIX_BITS) as usize]; - - let input_u64 = read_u64(&input_chunk[6..]); - - output_chunk[8] = encode_table[((input_u64 >> 58) & LOW_SIX_BITS) as usize]; - output_chunk[9] = encode_table[((input_u64 >> 52) & LOW_SIX_BITS) as usize]; - output_chunk[10] = encode_table[((input_u64 >> 46) & LOW_SIX_BITS) as usize]; - output_chunk[11] = encode_table[((input_u64 >> 40) & LOW_SIX_BITS) as usize]; - output_chunk[12] = encode_table[((input_u64 >> 34) & LOW_SIX_BITS) as usize]; - output_chunk[13] = encode_table[((input_u64 >> 28) & LOW_SIX_BITS) as usize]; - output_chunk[14] = encode_table[((input_u64 >> 22) & LOW_SIX_BITS) as usize]; - output_chunk[15] = encode_table[((input_u64 >> 16) & LOW_SIX_BITS) as usize]; - - let input_u64 = read_u64(&input_chunk[12..]); - - output_chunk[16] = encode_table[((input_u64 >> 58) & LOW_SIX_BITS) as usize]; - output_chunk[17] = encode_table[((input_u64 >> 52) & LOW_SIX_BITS) as usize]; - output_chunk[18] = encode_table[((input_u64 >> 46) & LOW_SIX_BITS) as usize]; - output_chunk[19] = encode_table[((input_u64 >> 40) & LOW_SIX_BITS) as usize]; - output_chunk[20] = encode_table[((input_u64 >> 34) & LOW_SIX_BITS) as usize]; - output_chunk[21] = encode_table[((input_u64 >> 28) & LOW_SIX_BITS) as usize]; - output_chunk[22] = encode_table[((input_u64 >> 22) & LOW_SIX_BITS) as usize]; - output_chunk[23] = encode_table[((input_u64 >> 16) & LOW_SIX_BITS) as usize]; - - let input_u64 = read_u64(&input_chunk[18..]); - - output_chunk[24] = encode_table[((input_u64 >> 58) & LOW_SIX_BITS) as usize]; - output_chunk[25] = encode_table[((input_u64 >> 52) & LOW_SIX_BITS) as usize]; - output_chunk[26] = encode_table[((input_u64 >> 46) & LOW_SIX_BITS) as usize]; - output_chunk[27] = encode_table[((input_u64 >> 40) & LOW_SIX_BITS) as usize]; - output_chunk[28] = encode_table[((input_u64 >> 34) & LOW_SIX_BITS) as usize]; - output_chunk[29] = encode_table[((input_u64 >> 28) & LOW_SIX_BITS) as usize]; - output_chunk[30] = encode_table[((input_u64 >> 22) & LOW_SIX_BITS) as usize]; - output_chunk[31] = encode_table[((input_u64 >> 16) & LOW_SIX_BITS) as usize]; - - output_index += BLOCKS_PER_FAST_LOOP * 8; - input_index += BLOCKS_PER_FAST_LOOP * 6; - } - } - - // Encode what's left after the fast loop. - - const LOW_SIX_BITS_U8: u8 = 0x3F; - - let rem = input.len() % 3; - let start_of_rem = input.len() - rem; - - // start at the first index not handled by fast loop, which may be 0. - - while input_index < start_of_rem { - let input_chunk = &input[input_index..(input_index + 3)]; - let output_chunk = &mut output[output_index..(output_index + 4)]; - - output_chunk[0] = encode_table[(input_chunk[0] >> 2) as usize]; - output_chunk[1] = - encode_table[((input_chunk[0] << 4 | input_chunk[1] >> 4) & LOW_SIX_BITS_U8) as usize]; - output_chunk[2] = - encode_table[((input_chunk[1] << 2 | input_chunk[2] >> 6) & LOW_SIX_BITS_U8) as usize]; - output_chunk[3] = encode_table[(input_chunk[2] & LOW_SIX_BITS_U8) as usize]; - - input_index += 3; - output_index += 4; - } - - if rem == 2 { - output[output_index] = encode_table[(input[start_of_rem] >> 2) as usize]; - output[output_index + 1] = encode_table[((input[start_of_rem] << 4 - | input[start_of_rem + 1] >> 4) - & LOW_SIX_BITS_U8) as usize]; - output[output_index + 2] = - encode_table[((input[start_of_rem + 1] << 2) & LOW_SIX_BITS_U8) as usize]; - output_index += 3; - } else if rem == 1 { - output[output_index] = encode_table[(input[start_of_rem] >> 2) as usize]; - output[output_index + 1] = - encode_table[((input[start_of_rem] << 4) & LOW_SIX_BITS_U8) as usize]; - output_index += 2; - } - - output_index -} - -/// calculate the base64 encoded string size, including padding if appropriate -pub fn encoded_size(bytes_len: usize, config: Config) -> Option { - let rem = bytes_len % 3; - - let complete_input_chunks = bytes_len / 3; - let complete_chunk_output = complete_input_chunks.checked_mul(4); - - if rem > 0 { - if config.pad { - complete_chunk_output.and_then(|c| c.checked_add(4)) - } else { - let encoded_rem = match rem { - 1 => 2, - 2 => 3, - _ => unreachable!("Impossible remainder"), - }; - complete_chunk_output.and_then(|c| c.checked_add(encoded_rem)) - } - } else { - complete_chunk_output - } -} - -/// Write padding characters. -/// `output` is the slice where padding should be written, of length at least 2. -/// -/// Returns the number of padding bytes written. -pub fn add_padding(input_len: usize, output: &mut [u8]) -> usize { - let rem = input_len % 3; - let mut bytes_written = 0; - for _ in 0..((3 - rem) % 3) { - output[bytes_written] = PAD_BYTE; - bytes_written += 1; - } - - bytes_written -} - -#[cfg(test)] -mod tests { - use super::*; - use crate::{ - decode::decode_config_buf, - tests::{assert_encode_sanity, random_config}, - Config, STANDARD, URL_SAFE_NO_PAD, - }; - - use rand::{ - distributions::{Distribution, Uniform}, - FromEntropy, Rng, - }; - use std; - use std::str; - - #[test] - fn encoded_size_correct_standard() { - assert_encoded_length(0, 0, STANDARD); - - assert_encoded_length(1, 4, STANDARD); - assert_encoded_length(2, 4, STANDARD); - assert_encoded_length(3, 4, STANDARD); - - assert_encoded_length(4, 8, STANDARD); - assert_encoded_length(5, 8, STANDARD); - assert_encoded_length(6, 8, STANDARD); - - assert_encoded_length(7, 12, STANDARD); - assert_encoded_length(8, 12, STANDARD); - assert_encoded_length(9, 12, STANDARD); - - assert_encoded_length(54, 72, STANDARD); - - assert_encoded_length(55, 76, STANDARD); - assert_encoded_length(56, 76, STANDARD); - assert_encoded_length(57, 76, STANDARD); - - assert_encoded_length(58, 80, STANDARD); - } - - #[test] - fn encoded_size_correct_no_pad() { - assert_encoded_length(0, 0, URL_SAFE_NO_PAD); - - assert_encoded_length(1, 2, URL_SAFE_NO_PAD); - assert_encoded_length(2, 3, URL_SAFE_NO_PAD); - assert_encoded_length(3, 4, URL_SAFE_NO_PAD); - - assert_encoded_length(4, 6, URL_SAFE_NO_PAD); - assert_encoded_length(5, 7, URL_SAFE_NO_PAD); - assert_encoded_length(6, 8, URL_SAFE_NO_PAD); - - assert_encoded_length(7, 10, URL_SAFE_NO_PAD); - assert_encoded_length(8, 11, URL_SAFE_NO_PAD); - assert_encoded_length(9, 12, URL_SAFE_NO_PAD); - - assert_encoded_length(54, 72, URL_SAFE_NO_PAD); - - assert_encoded_length(55, 74, URL_SAFE_NO_PAD); - assert_encoded_length(56, 75, URL_SAFE_NO_PAD); - assert_encoded_length(57, 76, URL_SAFE_NO_PAD); - - assert_encoded_length(58, 78, URL_SAFE_NO_PAD); - } - - #[test] - fn encoded_size_overflow() { - assert_eq!(None, encoded_size(std::usize::MAX, STANDARD)); - } - - #[test] - fn encode_config_buf_into_nonempty_buffer_doesnt_clobber_prefix() { - let mut orig_data = Vec::new(); - let mut prefix = String::new(); - let mut encoded_data_no_prefix = String::new(); - let mut encoded_data_with_prefix = String::new(); - let mut decoded = Vec::new(); - - let prefix_len_range = Uniform::new(0, 1000); - let input_len_range = Uniform::new(0, 1000); - - let mut rng = rand::rngs::SmallRng::from_entropy(); - - for _ in 0..10_000 { - orig_data.clear(); - prefix.clear(); - encoded_data_no_prefix.clear(); - encoded_data_with_prefix.clear(); - decoded.clear(); - - let input_len = input_len_range.sample(&mut rng); - - for _ in 0..input_len { - orig_data.push(rng.gen()); - } - - let prefix_len = prefix_len_range.sample(&mut rng); - for _ in 0..prefix_len { - // getting convenient random single-byte printable chars that aren't base64 is - // annoying - prefix.push('#'); - } - encoded_data_with_prefix.push_str(&prefix); - - let config = random_config(&mut rng); - encode_config_buf(&orig_data, config, &mut encoded_data_no_prefix); - encode_config_buf(&orig_data, config, &mut encoded_data_with_prefix); - - assert_eq!( - encoded_data_no_prefix.len() + prefix_len, - encoded_data_with_prefix.len() - ); - assert_encode_sanity(&encoded_data_no_prefix, config, input_len); - assert_encode_sanity(&encoded_data_with_prefix[prefix_len..], config, input_len); - - // append plain encode onto prefix - prefix.push_str(&mut encoded_data_no_prefix); - - assert_eq!(prefix, encoded_data_with_prefix); - - decode_config_buf(&encoded_data_no_prefix, config, &mut decoded).unwrap(); - assert_eq!(orig_data, decoded); - } - } - - #[test] - fn encode_config_slice_into_nonempty_buffer_doesnt_clobber_suffix() { - let mut orig_data = Vec::new(); - let mut encoded_data = Vec::new(); - let mut encoded_data_original_state = Vec::new(); - let mut decoded = Vec::new(); - - let input_len_range = Uniform::new(0, 1000); - - let mut rng = rand::rngs::SmallRng::from_entropy(); - - for _ in 0..10_000 { - orig_data.clear(); - encoded_data.clear(); - encoded_data_original_state.clear(); - decoded.clear(); - - let input_len = input_len_range.sample(&mut rng); - - for _ in 0..input_len { - orig_data.push(rng.gen()); - } - - // plenty of existing garbage in the encoded buffer - for _ in 0..10 * input_len { - encoded_data.push(rng.gen()); - } - - encoded_data_original_state.extend_from_slice(&encoded_data); - - let config = random_config(&mut rng); - - let encoded_size = encoded_size(input_len, config).unwrap(); - - assert_eq!( - encoded_size, - encode_config_slice(&orig_data, config, &mut encoded_data) - ); - - assert_encode_sanity( - std::str::from_utf8(&encoded_data[0..encoded_size]).unwrap(), - config, - input_len, - ); - - assert_eq!( - &encoded_data[encoded_size..], - &encoded_data_original_state[encoded_size..] - ); - - decode_config_buf(&encoded_data[0..encoded_size], config, &mut decoded).unwrap(); - assert_eq!(orig_data, decoded); - } - } - - #[test] - fn encode_config_slice_fits_into_precisely_sized_slice() { - let mut orig_data = Vec::new(); - let mut encoded_data = Vec::new(); - let mut decoded = Vec::new(); - - let input_len_range = Uniform::new(0, 1000); - - let mut rng = rand::rngs::SmallRng::from_entropy(); - - for _ in 0..10_000 { - orig_data.clear(); - encoded_data.clear(); - decoded.clear(); - - let input_len = input_len_range.sample(&mut rng); - - for _ in 0..input_len { - orig_data.push(rng.gen()); - } - - let config = random_config(&mut rng); - - let encoded_size = encoded_size(input_len, config).unwrap(); - - encoded_data.resize(encoded_size, 0); - - assert_eq!( - encoded_size, - encode_config_slice(&orig_data, config, &mut encoded_data) - ); - - assert_encode_sanity( - std::str::from_utf8(&encoded_data[0..encoded_size]).unwrap(), - config, - input_len, - ); - - decode_config_buf(&encoded_data[0..encoded_size], config, &mut decoded).unwrap(); - assert_eq!(orig_data, decoded); - } - } - - #[test] - fn encode_to_slice_random_valid_utf8() { - let mut input = Vec::new(); - let mut output = Vec::new(); - - let input_len_range = Uniform::new(0, 1000); - - let mut rng = rand::rngs::SmallRng::from_entropy(); - - for _ in 0..10_000 { - input.clear(); - output.clear(); - - let input_len = input_len_range.sample(&mut rng); - - for _ in 0..input_len { - input.push(rng.gen()); - } - - let config = random_config(&mut rng); - - // fill up the output buffer with garbage - let encoded_size = encoded_size(input_len, config).unwrap(); - for _ in 0..encoded_size { - output.push(rng.gen()); - } - - let orig_output_buf = output.to_vec(); - - let bytes_written = - encode_to_slice(&input, &mut output, config.char_set.encode_table()); - - // make sure the part beyond bytes_written is the same garbage it was before - assert_eq!(orig_output_buf[bytes_written..], output[bytes_written..]); - - // make sure the encoded bytes are UTF-8 - let _ = str::from_utf8(&output[0..bytes_written]).unwrap(); - } - } - - #[test] - fn encode_with_padding_random_valid_utf8() { - let mut input = Vec::new(); - let mut output = Vec::new(); - - let input_len_range = Uniform::new(0, 1000); - - let mut rng = rand::rngs::SmallRng::from_entropy(); - - for _ in 0..10_000 { - input.clear(); - output.clear(); - - let input_len = input_len_range.sample(&mut rng); - - for _ in 0..input_len { - input.push(rng.gen()); - } - - let config = random_config(&mut rng); - - // fill up the output buffer with garbage - let encoded_size = encoded_size(input_len, config).unwrap(); - for _ in 0..encoded_size + 1000 { - output.push(rng.gen()); - } - - let orig_output_buf = output.to_vec(); - - encode_with_padding(&input, config, encoded_size, &mut output[0..encoded_size]); - - // make sure the part beyond b64 is the same garbage it was before - assert_eq!(orig_output_buf[encoded_size..], output[encoded_size..]); - - // make sure the encoded bytes are UTF-8 - let _ = str::from_utf8(&output[0..encoded_size]).unwrap(); - } - } - - #[test] - fn add_padding_random_valid_utf8() { - let mut output = Vec::new(); - - let mut rng = rand::rngs::SmallRng::from_entropy(); - - // cover our bases for length % 3 - for input_len in 0..10 { - output.clear(); - - // fill output with random - for _ in 0..10 { - output.push(rng.gen()); - } - - let orig_output_buf = output.to_vec(); - - let bytes_written = add_padding(input_len, &mut output); - - // make sure the part beyond bytes_written is the same garbage it was before - assert_eq!(orig_output_buf[bytes_written..], output[bytes_written..]); - - // make sure the encoded bytes are UTF-8 - let _ = str::from_utf8(&output[0..bytes_written]).unwrap(); - } - } - - fn assert_encoded_length(input_len: usize, encoded_len: usize, config: Config) { - assert_eq!(encoded_len, encoded_size(input_len, config).unwrap()); - - let mut bytes: Vec = Vec::new(); - let mut rng = rand::rngs::SmallRng::from_entropy(); - - for _ in 0..input_len { - bytes.push(rng.gen()); - } - - let encoded = encode_config(&bytes, config); - assert_encode_sanity(&encoded, config, input_len); - - assert_eq!(encoded_len, encoded.len()); - } - - #[test] - fn encode_imap() { - assert_eq!( - encode_config(b"\xFB\xFF", crate::IMAP_MUTF7), - encode_config(b"\xFB\xFF", crate::STANDARD_NO_PAD).replace("/", ",") - ); - } -} diff -Nru temporalio-1.3.0/vendor/base64-0.13.1/src/lib.rs temporalio-1.3.0/vendor/base64-0.13.1/src/lib.rs --- temporalio-1.3.0/vendor/base64-0.13.1/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/base64-0.13.1/src/lib.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,245 +0,0 @@ -//! # Configs -//! -//! There isn't just one type of Base64; that would be too simple. You need to choose a character -//! set (standard, URL-safe, etc) and padding suffix (yes/no). -//! The `Config` struct encapsulates this info. There are some common configs included: `STANDARD`, -//! `URL_SAFE`, etc. You can also make your own `Config` if needed. -//! -//! The functions that don't have `config` in the name (e.g. `encode()` and `decode()`) use the -//! `STANDARD` config . -//! -//! The functions that write to a slice (the ones that end in `_slice`) are generally the fastest -//! because they don't need to resize anything. If it fits in your workflow and you care about -//! performance, keep using the same buffer (growing as need be) and use the `_slice` methods for -//! the best performance. -//! -//! # Encoding -//! -//! Several different encoding functions are available to you depending on your desire for -//! convenience vs performance. -//! -//! | Function | Output | Allocates | -//! | ----------------------- | ---------------------------- | ------------------------------ | -//! | `encode` | Returns a new `String` | Always | -//! | `encode_config` | Returns a new `String` | Always | -//! | `encode_config_buf` | Appends to provided `String` | Only if `String` needs to grow | -//! | `encode_config_slice` | Writes to provided `&[u8]` | Never | -//! -//! All of the encoding functions that take a `Config` will pad as per the config. -//! -//! # Decoding -//! -//! Just as for encoding, there are different decoding functions available. -//! -//! | Function | Output | Allocates | -//! | ----------------------- | ----------------------------- | ------------------------------ | -//! | `decode` | Returns a new `Vec` | Always | -//! | `decode_config` | Returns a new `Vec` | Always | -//! | `decode_config_buf` | Appends to provided `Vec` | Only if `Vec` needs to grow | -//! | `decode_config_slice` | Writes to provided `&[u8]` | Never | -//! -//! Unlike encoding, where all possible input is valid, decoding can fail (see `DecodeError`). -//! -//! Input can be invalid because it has invalid characters or invalid padding. (No padding at all is -//! valid, but excess padding is not.) Whitespace in the input is invalid. -//! -//! # `Read` and `Write` -//! -//! To map a `Read` of b64 bytes to the decoded bytes, wrap a reader (file, network socket, etc) -//! with `base64::read::DecoderReader`. To write raw bytes and have them b64 encoded on the fly, -//! wrap a writer with `base64::write::EncoderWriter`. There is some performance overhead (15% or -//! so) because of the necessary buffer shuffling -- still fast enough that almost nobody cares. -//! Also, these implementations do not heap allocate. -//! -//! # Panics -//! -//! If length calculations result in overflowing `usize`, a panic will result. -//! -//! The `_slice` flavors of encode or decode will panic if the provided output slice is too small, - -#![cfg_attr(feature = "cargo-clippy", allow(clippy::cast_lossless))] -#![deny( - missing_docs, - trivial_casts, - trivial_numeric_casts, - unused_extern_crates, - unused_import_braces, - unused_results, - variant_size_differences, - warnings -)] -#![forbid(unsafe_code)] -#![cfg_attr(not(any(feature = "std", test)), no_std)] - -#[cfg(all(feature = "alloc", not(any(feature = "std", test))))] -extern crate alloc; -#[cfg(any(feature = "std", test))] -extern crate std as alloc; - -mod chunked_encoder; -pub mod display; -#[cfg(any(feature = "std", test))] -pub mod read; -mod tables; -#[cfg(any(feature = "std", test))] -pub mod write; - -mod encode; -pub use crate::encode::encode_config_slice; -#[cfg(any(feature = "alloc", feature = "std", test))] -pub use crate::encode::{encode, encode_config, encode_config_buf}; - -mod decode; -#[cfg(any(feature = "alloc", feature = "std", test))] -pub use crate::decode::{decode, decode_config, decode_config_buf}; -pub use crate::decode::{decode_config_slice, DecodeError}; - -#[cfg(test)] -mod tests; - -/// Available encoding character sets -#[derive(Clone, Copy, Debug)] -pub enum CharacterSet { - /// The standard character set (uses `+` and `/`). - /// - /// See [RFC 3548](https://tools.ietf.org/html/rfc3548#section-3). - Standard, - /// The URL safe character set (uses `-` and `_`). - /// - /// See [RFC 3548](https://tools.ietf.org/html/rfc3548#section-4). - UrlSafe, - /// The `crypt(3)` character set (uses `./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz`). - /// - /// Not standardized, but folk wisdom on the net asserts that this alphabet is what crypt uses. - Crypt, - /// The bcrypt character set (uses `./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789`). - Bcrypt, - /// The character set used in IMAP-modified UTF-7 (uses `+` and `,`). - /// - /// See [RFC 3501](https://tools.ietf.org/html/rfc3501#section-5.1.3) - ImapMutf7, - /// The character set used in BinHex 4.0 files. - /// - /// See [BinHex 4.0 Definition](http://files.stairways.com/other/binhex-40-specs-info.txt) - BinHex, -} - -impl CharacterSet { - fn encode_table(self) -> &'static [u8; 64] { - match self { - CharacterSet::Standard => tables::STANDARD_ENCODE, - CharacterSet::UrlSafe => tables::URL_SAFE_ENCODE, - CharacterSet::Crypt => tables::CRYPT_ENCODE, - CharacterSet::Bcrypt => tables::BCRYPT_ENCODE, - CharacterSet::ImapMutf7 => tables::IMAP_MUTF7_ENCODE, - CharacterSet::BinHex => tables::BINHEX_ENCODE, - } - } - - fn decode_table(self) -> &'static [u8; 256] { - match self { - CharacterSet::Standard => tables::STANDARD_DECODE, - CharacterSet::UrlSafe => tables::URL_SAFE_DECODE, - CharacterSet::Crypt => tables::CRYPT_DECODE, - CharacterSet::Bcrypt => tables::BCRYPT_DECODE, - CharacterSet::ImapMutf7 => tables::IMAP_MUTF7_DECODE, - CharacterSet::BinHex => tables::BINHEX_DECODE, - } - } -} - -/// Contains configuration parameters for base64 encoding -#[derive(Clone, Copy, Debug)] -pub struct Config { - /// Character set to use - char_set: CharacterSet, - /// True to pad output with `=` characters - pad: bool, - /// True to ignore excess nonzero bits in the last few symbols, otherwise an error is returned. - decode_allow_trailing_bits: bool, -} - -impl Config { - /// Create a new `Config`. - pub const fn new(char_set: CharacterSet, pad: bool) -> Config { - Config { - char_set, - pad, - decode_allow_trailing_bits: false, - } - } - - /// Sets whether to pad output with `=` characters. - pub const fn pad(self, pad: bool) -> Config { - Config { pad, ..self } - } - - /// Sets whether to emit errors for nonzero trailing bits. - /// - /// This is useful when implementing - /// [forgiving-base64 decode](https://infra.spec.whatwg.org/#forgiving-base64-decode). - pub const fn decode_allow_trailing_bits(self, allow: bool) -> Config { - Config { - decode_allow_trailing_bits: allow, - ..self - } - } -} - -/// Standard character set with padding. -pub const STANDARD: Config = Config { - char_set: CharacterSet::Standard, - pad: true, - decode_allow_trailing_bits: false, -}; - -/// Standard character set without padding. -pub const STANDARD_NO_PAD: Config = Config { - char_set: CharacterSet::Standard, - pad: false, - decode_allow_trailing_bits: false, -}; - -/// URL-safe character set with padding -pub const URL_SAFE: Config = Config { - char_set: CharacterSet::UrlSafe, - pad: true, - decode_allow_trailing_bits: false, -}; - -/// URL-safe character set without padding -pub const URL_SAFE_NO_PAD: Config = Config { - char_set: CharacterSet::UrlSafe, - pad: false, - decode_allow_trailing_bits: false, -}; - -/// As per `crypt(3)` requirements -pub const CRYPT: Config = Config { - char_set: CharacterSet::Crypt, - pad: false, - decode_allow_trailing_bits: false, -}; - -/// Bcrypt character set -pub const BCRYPT: Config = Config { - char_set: CharacterSet::Bcrypt, - pad: false, - decode_allow_trailing_bits: false, -}; - -/// IMAP modified UTF-7 requirements -pub const IMAP_MUTF7: Config = Config { - char_set: CharacterSet::ImapMutf7, - pad: false, - decode_allow_trailing_bits: false, -}; - -/// BinHex character set -pub const BINHEX: Config = Config { - char_set: CharacterSet::BinHex, - pad: false, - decode_allow_trailing_bits: false, -}; - -const PAD_BYTE: u8 = b'='; diff -Nru temporalio-1.3.0/vendor/base64-0.13.1/src/read/decoder.rs temporalio-1.3.0/vendor/base64-0.13.1/src/read/decoder.rs --- temporalio-1.3.0/vendor/base64-0.13.1/src/read/decoder.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/base64-0.13.1/src/read/decoder.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,282 +0,0 @@ -use crate::{decode_config_slice, Config, DecodeError}; -use std::io::Read; -use std::{cmp, fmt, io}; - -// This should be large, but it has to fit on the stack. -pub(crate) const BUF_SIZE: usize = 1024; - -// 4 bytes of base64 data encode 3 bytes of raw data (modulo padding). -const BASE64_CHUNK_SIZE: usize = 4; -const DECODED_CHUNK_SIZE: usize = 3; - -/// A `Read` implementation that decodes base64 data read from an underlying reader. -/// -/// # Examples -/// -/// ``` -/// use std::io::Read; -/// use std::io::Cursor; -/// -/// // use a cursor as the simplest possible `Read` -- in real code this is probably a file, etc. -/// let mut wrapped_reader = Cursor::new(b"YXNkZg=="); -/// let mut decoder = base64::read::DecoderReader::new( -/// &mut wrapped_reader, base64::STANDARD); -/// -/// // handle errors as you normally would -/// let mut result = Vec::new(); -/// decoder.read_to_end(&mut result).unwrap(); -/// -/// assert_eq!(b"asdf", &result[..]); -/// -/// ``` -pub struct DecoderReader<'a, R: 'a + io::Read> { - config: Config, - /// Where b64 data is read from - r: &'a mut R, - - // Holds b64 data read from the delegate reader. - b64_buffer: [u8; BUF_SIZE], - // The start of the pending buffered data in b64_buffer. - b64_offset: usize, - // The amount of buffered b64 data. - b64_len: usize, - // Since the caller may provide us with a buffer of size 1 or 2 that's too small to copy a - // decoded chunk in to, we have to be able to hang on to a few decoded bytes. - // Technically we only need to hold 2 bytes but then we'd need a separate temporary buffer to - // decode 3 bytes into and then juggle copying one byte into the provided read buf and the rest - // into here, which seems like a lot of complexity for 1 extra byte of storage. - decoded_buffer: [u8; 3], - // index of start of decoded data - decoded_offset: usize, - // length of decoded data - decoded_len: usize, - // used to provide accurate offsets in errors - total_b64_decoded: usize, -} - -impl<'a, R: io::Read> fmt::Debug for DecoderReader<'a, R> { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("DecoderReader") - .field("config", &self.config) - .field("b64_offset", &self.b64_offset) - .field("b64_len", &self.b64_len) - .field("decoded_buffer", &self.decoded_buffer) - .field("decoded_offset", &self.decoded_offset) - .field("decoded_len", &self.decoded_len) - .field("total_b64_decoded", &self.total_b64_decoded) - .finish() - } -} - -impl<'a, R: io::Read> DecoderReader<'a, R> { - /// Create a new decoder that will read from the provided reader `r`. - pub fn new(r: &'a mut R, config: Config) -> Self { - DecoderReader { - config, - r, - b64_buffer: [0; BUF_SIZE], - b64_offset: 0, - b64_len: 0, - decoded_buffer: [0; DECODED_CHUNK_SIZE], - decoded_offset: 0, - decoded_len: 0, - total_b64_decoded: 0, - } - } - - /// Write as much as possible of the decoded buffer into the target buffer. - /// Must only be called when there is something to write and space to write into. - /// Returns a Result with the number of (decoded) bytes copied. - fn flush_decoded_buf(&mut self, buf: &mut [u8]) -> io::Result { - debug_assert!(self.decoded_len > 0); - debug_assert!(buf.len() > 0); - - let copy_len = cmp::min(self.decoded_len, buf.len()); - debug_assert!(copy_len > 0); - debug_assert!(copy_len <= self.decoded_len); - - buf[..copy_len].copy_from_slice( - &self.decoded_buffer[self.decoded_offset..self.decoded_offset + copy_len], - ); - - self.decoded_offset += copy_len; - self.decoded_len -= copy_len; - - debug_assert!(self.decoded_len < DECODED_CHUNK_SIZE); - - Ok(copy_len) - } - - /// Read into the remaining space in the buffer after the current contents. - /// Must only be called when there is space to read into in the buffer. - /// Returns the number of bytes read. - fn read_from_delegate(&mut self) -> io::Result { - debug_assert!(self.b64_offset + self.b64_len < BUF_SIZE); - - let read = self - .r - .read(&mut self.b64_buffer[self.b64_offset + self.b64_len..])?; - self.b64_len += read; - - debug_assert!(self.b64_offset + self.b64_len <= BUF_SIZE); - - return Ok(read); - } - - /// Decode the requested number of bytes from the b64 buffer into the provided buffer. It's the - /// caller's responsibility to choose the number of b64 bytes to decode correctly. - /// - /// Returns a Result with the number of decoded bytes written to `buf`. - fn decode_to_buf(&mut self, num_bytes: usize, buf: &mut [u8]) -> io::Result { - debug_assert!(self.b64_len >= num_bytes); - debug_assert!(self.b64_offset + self.b64_len <= BUF_SIZE); - debug_assert!(buf.len() > 0); - - let decoded = decode_config_slice( - &self.b64_buffer[self.b64_offset..self.b64_offset + num_bytes], - self.config, - &mut buf[..], - ) - .map_err(|e| match e { - DecodeError::InvalidByte(offset, byte) => { - DecodeError::InvalidByte(self.total_b64_decoded + offset, byte) - } - DecodeError::InvalidLength => DecodeError::InvalidLength, - DecodeError::InvalidLastSymbol(offset, byte) => { - DecodeError::InvalidLastSymbol(self.total_b64_decoded + offset, byte) - } - }) - .map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))?; - - self.total_b64_decoded += num_bytes; - self.b64_offset += num_bytes; - self.b64_len -= num_bytes; - - debug_assert!(self.b64_offset + self.b64_len <= BUF_SIZE); - - Ok(decoded) - } -} - -impl<'a, R: Read> Read for DecoderReader<'a, R> { - /// Decode input from the wrapped reader. - /// - /// Under non-error circumstances, this returns `Ok` with the value being the number of bytes - /// written in `buf`. - /// - /// Where possible, this function buffers base64 to minimize the number of read() calls to the - /// delegate reader. - /// - /// # Errors - /// - /// Any errors emitted by the delegate reader are returned. Decoding errors due to invalid - /// base64 are also possible, and will have `io::ErrorKind::InvalidData`. - fn read(&mut self, buf: &mut [u8]) -> io::Result { - if buf.len() == 0 { - return Ok(0); - } - - // offset == BUF_SIZE when we copied it all last time - debug_assert!(self.b64_offset <= BUF_SIZE); - debug_assert!(self.b64_offset + self.b64_len <= BUF_SIZE); - debug_assert!(if self.b64_offset == BUF_SIZE { - self.b64_len == 0 - } else { - self.b64_len <= BUF_SIZE - }); - - debug_assert!(if self.decoded_len == 0 { - // can be = when we were able to copy the complete chunk - self.decoded_offset <= DECODED_CHUNK_SIZE - } else { - self.decoded_offset < DECODED_CHUNK_SIZE - }); - - // We shouldn't ever decode into here when we can't immediately write at least one byte into - // the provided buf, so the effective length should only be 3 momentarily between when we - // decode and when we copy into the target buffer. - debug_assert!(self.decoded_len < DECODED_CHUNK_SIZE); - debug_assert!(self.decoded_len + self.decoded_offset <= DECODED_CHUNK_SIZE); - - if self.decoded_len > 0 { - // we have a few leftover decoded bytes; flush that rather than pull in more b64 - self.flush_decoded_buf(buf) - } else { - let mut at_eof = false; - while self.b64_len < BASE64_CHUNK_SIZE { - // Work around lack of copy_within, which is only present in 1.37 - // Copy any bytes we have to the start of the buffer. - // We know we have < 1 chunk, so we can use a tiny tmp buffer. - let mut memmove_buf = [0_u8; BASE64_CHUNK_SIZE]; - memmove_buf[..self.b64_len].copy_from_slice( - &self.b64_buffer[self.b64_offset..self.b64_offset + self.b64_len], - ); - self.b64_buffer[0..self.b64_len].copy_from_slice(&memmove_buf[..self.b64_len]); - self.b64_offset = 0; - - // then fill in more data - let read = self.read_from_delegate()?; - if read == 0 { - // we never pass in an empty buf, so 0 => we've hit EOF - at_eof = true; - break; - } - } - - if self.b64_len == 0 { - debug_assert!(at_eof); - // we must be at EOF, and we have no data left to decode - return Ok(0); - }; - - debug_assert!(if at_eof { - // if we are at eof, we may not have a complete chunk - self.b64_len > 0 - } else { - // otherwise, we must have at least one chunk - self.b64_len >= BASE64_CHUNK_SIZE - }); - - debug_assert_eq!(0, self.decoded_len); - - if buf.len() < DECODED_CHUNK_SIZE { - // caller requested an annoyingly short read - // have to write to a tmp buf first to avoid double mutable borrow - let mut decoded_chunk = [0_u8; DECODED_CHUNK_SIZE]; - // if we are at eof, could have less than BASE64_CHUNK_SIZE, in which case we have - // to assume that these last few tokens are, in fact, valid (i.e. must be 2-4 b64 - // tokens, not 1, since 1 token can't decode to 1 byte). - let to_decode = cmp::min(self.b64_len, BASE64_CHUNK_SIZE); - - let decoded = self.decode_to_buf(to_decode, &mut decoded_chunk[..])?; - self.decoded_buffer[..decoded].copy_from_slice(&decoded_chunk[..decoded]); - - self.decoded_offset = 0; - self.decoded_len = decoded; - - // can be less than 3 on last block due to padding - debug_assert!(decoded <= 3); - - self.flush_decoded_buf(buf) - } else { - let b64_bytes_that_can_decode_into_buf = (buf.len() / DECODED_CHUNK_SIZE) - .checked_mul(BASE64_CHUNK_SIZE) - .expect("too many chunks"); - debug_assert!(b64_bytes_that_can_decode_into_buf >= BASE64_CHUNK_SIZE); - - let b64_bytes_available_to_decode = if at_eof { - self.b64_len - } else { - // only use complete chunks - self.b64_len - self.b64_len % 4 - }; - - let actual_decode_len = cmp::min( - b64_bytes_that_can_decode_into_buf, - b64_bytes_available_to_decode, - ); - self.decode_to_buf(actual_decode_len, buf) - } - } - } -} diff -Nru temporalio-1.3.0/vendor/base64-0.13.1/src/read/decoder_tests.rs temporalio-1.3.0/vendor/base64-0.13.1/src/read/decoder_tests.rs --- temporalio-1.3.0/vendor/base64-0.13.1/src/read/decoder_tests.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/base64-0.13.1/src/read/decoder_tests.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,335 +0,0 @@ -use std::io::{self, Read}; - -use rand::{Rng, RngCore}; -use std::{cmp, iter}; - -use super::decoder::{DecoderReader, BUF_SIZE}; -use crate::encode::encode_config_buf; -use crate::tests::random_config; -use crate::{decode_config_buf, DecodeError, STANDARD}; - -#[test] -fn simple() { - let tests: &[(&[u8], &[u8])] = &[ - (&b"0"[..], &b"MA=="[..]), - (b"01", b"MDE="), - (b"012", b"MDEy"), - (b"0123", b"MDEyMw=="), - (b"01234", b"MDEyMzQ="), - (b"012345", b"MDEyMzQ1"), - (b"0123456", b"MDEyMzQ1Ng=="), - (b"01234567", b"MDEyMzQ1Njc="), - (b"012345678", b"MDEyMzQ1Njc4"), - (b"0123456789", b"MDEyMzQ1Njc4OQ=="), - ][..]; - - for (text_expected, base64data) in tests.iter() { - // Read n bytes at a time. - for n in 1..base64data.len() + 1 { - let mut wrapped_reader = io::Cursor::new(base64data); - let mut decoder = DecoderReader::new(&mut wrapped_reader, STANDARD); - - // handle errors as you normally would - let mut text_got = Vec::new(); - let mut buffer = vec![0u8; n]; - while let Ok(read) = decoder.read(&mut buffer[..]) { - if read == 0 { - break; - } - text_got.extend_from_slice(&buffer[..read]); - } - - assert_eq!( - text_got, - *text_expected, - "\nGot: {}\nExpected: {}", - String::from_utf8_lossy(&text_got[..]), - String::from_utf8_lossy(text_expected) - ); - } - } -} - -// Make sure we error out on trailing junk. -#[test] -fn trailing_junk() { - let tests: &[&[u8]] = &[&b"MDEyMzQ1Njc4*!@#$%^&"[..], b"MDEyMzQ1Njc4OQ== "][..]; - - for base64data in tests.iter() { - // Read n bytes at a time. - for n in 1..base64data.len() + 1 { - let mut wrapped_reader = io::Cursor::new(base64data); - let mut decoder = DecoderReader::new(&mut wrapped_reader, STANDARD); - - // handle errors as you normally would - let mut buffer = vec![0u8; n]; - let mut saw_error = false; - loop { - match decoder.read(&mut buffer[..]) { - Err(_) => { - saw_error = true; - break; - } - Ok(read) if read == 0 => break, - Ok(_) => (), - } - } - - assert!(saw_error); - } - } -} - -#[test] -fn handles_short_read_from_delegate() { - let mut rng = rand::thread_rng(); - let mut bytes = Vec::new(); - let mut b64 = String::new(); - let mut decoded = Vec::new(); - - for _ in 0..10_000 { - bytes.clear(); - b64.clear(); - decoded.clear(); - - let size = rng.gen_range(0, 10 * BUF_SIZE); - bytes.extend(iter::repeat(0).take(size)); - bytes.truncate(size); - rng.fill_bytes(&mut bytes[..size]); - assert_eq!(size, bytes.len()); - - let config = random_config(&mut rng); - encode_config_buf(&bytes[..], config, &mut b64); - - let mut wrapped_reader = io::Cursor::new(b64.as_bytes()); - let mut short_reader = RandomShortRead { - delegate: &mut wrapped_reader, - rng: &mut rng, - }; - - let mut decoder = DecoderReader::new(&mut short_reader, config); - - let decoded_len = decoder.read_to_end(&mut decoded).unwrap(); - assert_eq!(size, decoded_len); - assert_eq!(&bytes[..], &decoded[..]); - } -} - -#[test] -fn read_in_short_increments() { - let mut rng = rand::thread_rng(); - let mut bytes = Vec::new(); - let mut b64 = String::new(); - let mut decoded = Vec::new(); - - for _ in 0..10_000 { - bytes.clear(); - b64.clear(); - decoded.clear(); - - let size = rng.gen_range(0, 10 * BUF_SIZE); - bytes.extend(iter::repeat(0).take(size)); - // leave room to play around with larger buffers - decoded.extend(iter::repeat(0).take(size * 3)); - - rng.fill_bytes(&mut bytes[..]); - assert_eq!(size, bytes.len()); - - let config = random_config(&mut rng); - - encode_config_buf(&bytes[..], config, &mut b64); - - let mut wrapped_reader = io::Cursor::new(&b64[..]); - let mut decoder = DecoderReader::new(&mut wrapped_reader, config); - - consume_with_short_reads_and_validate(&mut rng, &bytes[..], &mut decoded, &mut decoder); - } -} - -#[test] -fn read_in_short_increments_with_short_delegate_reads() { - let mut rng = rand::thread_rng(); - let mut bytes = Vec::new(); - let mut b64 = String::new(); - let mut decoded = Vec::new(); - - for _ in 0..10_000 { - bytes.clear(); - b64.clear(); - decoded.clear(); - - let size = rng.gen_range(0, 10 * BUF_SIZE); - bytes.extend(iter::repeat(0).take(size)); - // leave room to play around with larger buffers - decoded.extend(iter::repeat(0).take(size * 3)); - - rng.fill_bytes(&mut bytes[..]); - assert_eq!(size, bytes.len()); - - let config = random_config(&mut rng); - - encode_config_buf(&bytes[..], config, &mut b64); - - let mut base_reader = io::Cursor::new(&b64[..]); - let mut decoder = DecoderReader::new(&mut base_reader, config); - let mut short_reader = RandomShortRead { - delegate: &mut decoder, - rng: &mut rand::thread_rng(), - }; - - consume_with_short_reads_and_validate(&mut rng, &bytes[..], &mut decoded, &mut short_reader) - } -} - -#[test] -fn reports_invalid_last_symbol_correctly() { - let mut rng = rand::thread_rng(); - let mut bytes = Vec::new(); - let mut b64 = String::new(); - let mut b64_bytes = Vec::new(); - let mut decoded = Vec::new(); - let mut bulk_decoded = Vec::new(); - - for _ in 0..1_000 { - bytes.clear(); - b64.clear(); - b64_bytes.clear(); - - let size = rng.gen_range(1, 10 * BUF_SIZE); - bytes.extend(iter::repeat(0).take(size)); - decoded.extend(iter::repeat(0).take(size)); - rng.fill_bytes(&mut bytes[..]); - assert_eq!(size, bytes.len()); - - let mut config = random_config(&mut rng); - // changing padding will cause invalid padding errors when we twiddle the last byte - config.pad = false; - - encode_config_buf(&bytes[..], config, &mut b64); - b64_bytes.extend(b64.bytes()); - assert_eq!(b64_bytes.len(), b64.len()); - - // change the last character to every possible symbol. Should behave the same as bulk - // decoding whether invalid or valid. - for &s1 in config.char_set.encode_table().iter() { - decoded.clear(); - bulk_decoded.clear(); - - // replace the last - *b64_bytes.last_mut().unwrap() = s1; - let bulk_res = decode_config_buf(&b64_bytes[..], config, &mut bulk_decoded); - - let mut wrapped_reader = io::Cursor::new(&b64_bytes[..]); - let mut decoder = DecoderReader::new(&mut wrapped_reader, config); - - let stream_res = decoder.read_to_end(&mut decoded).map(|_| ()).map_err(|e| { - e.into_inner() - .and_then(|e| e.downcast::().ok()) - }); - - assert_eq!(bulk_res.map_err(|e| Some(Box::new(e))), stream_res); - } - } -} - -#[test] -fn reports_invalid_byte_correctly() { - let mut rng = rand::thread_rng(); - let mut bytes = Vec::new(); - let mut b64 = String::new(); - let mut decoded = Vec::new(); - - for _ in 0..10_000 { - bytes.clear(); - b64.clear(); - decoded.clear(); - - let size = rng.gen_range(1, 10 * BUF_SIZE); - bytes.extend(iter::repeat(0).take(size)); - rng.fill_bytes(&mut bytes[..size]); - assert_eq!(size, bytes.len()); - - let config = random_config(&mut rng); - encode_config_buf(&bytes[..], config, &mut b64); - // replace one byte, somewhere, with '*', which is invalid - let bad_byte_pos = rng.gen_range(0, &b64.len()); - let mut b64_bytes = b64.bytes().collect::>(); - b64_bytes[bad_byte_pos] = b'*'; - - let mut wrapped_reader = io::Cursor::new(b64_bytes.clone()); - let mut decoder = DecoderReader::new(&mut wrapped_reader, config); - - // some gymnastics to avoid double-moving the io::Error, which is not Copy - let read_decode_err = decoder - .read_to_end(&mut decoded) - .map_err(|e| { - let kind = e.kind(); - let inner = e - .into_inner() - .and_then(|e| e.downcast::().ok()); - inner.map(|i| (*i, kind)) - }) - .err() - .and_then(|o| o); - - let mut bulk_buf = Vec::new(); - let bulk_decode_err = decode_config_buf(&b64_bytes[..], config, &mut bulk_buf).err(); - - // it's tricky to predict where the invalid data's offset will be since if it's in the last - // chunk it will be reported at the first padding location because it's treated as invalid - // padding. So, we just check that it's the same as it is for decoding all at once. - assert_eq!( - bulk_decode_err.map(|e| (e, io::ErrorKind::InvalidData)), - read_decode_err - ); - } -} - -fn consume_with_short_reads_and_validate( - rng: &mut rand::rngs::ThreadRng, - expected_bytes: &[u8], - decoded: &mut Vec, - short_reader: &mut R, -) -> () { - let mut total_read = 0_usize; - loop { - assert!( - total_read <= expected_bytes.len(), - "tr {} size {}", - total_read, - expected_bytes.len() - ); - if total_read == expected_bytes.len() { - assert_eq!(expected_bytes, &decoded[..total_read]); - // should be done - assert_eq!(0, short_reader.read(&mut decoded[..]).unwrap()); - // didn't write anything - assert_eq!(expected_bytes, &decoded[..total_read]); - - break; - } - let decode_len = rng.gen_range(1, cmp::max(2, expected_bytes.len() * 2)); - - let read = short_reader - .read(&mut decoded[total_read..total_read + decode_len]) - .unwrap(); - total_read += read; - } -} - -/// Limits how many bytes a reader will provide in each read call. -/// Useful for shaking out code that may work fine only with typical input sources that always fill -/// the buffer. -struct RandomShortRead<'a, 'b, R: io::Read, N: rand::Rng> { - delegate: &'b mut R, - rng: &'a mut N, -} - -impl<'a, 'b, R: io::Read, N: rand::Rng> io::Read for RandomShortRead<'a, 'b, R, N> { - fn read(&mut self, buf: &mut [u8]) -> Result { - // avoid 0 since it means EOF for non-empty buffers - let effective_len = cmp::min(self.rng.gen_range(1, 20), buf.len()); - - self.delegate.read(&mut buf[..effective_len]) - } -} diff -Nru temporalio-1.3.0/vendor/base64-0.13.1/src/read/mod.rs temporalio-1.3.0/vendor/base64-0.13.1/src/read/mod.rs --- temporalio-1.3.0/vendor/base64-0.13.1/src/read/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/base64-0.13.1/src/read/mod.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,6 +0,0 @@ -//! Implementations of `io::Read` to transparently decode base64. -mod decoder; -pub use self::decoder::DecoderReader; - -#[cfg(test)] -mod decoder_tests; diff -Nru temporalio-1.3.0/vendor/base64-0.13.1/src/tables.rs temporalio-1.3.0/vendor/base64-0.13.1/src/tables.rs --- temporalio-1.3.0/vendor/base64-0.13.1/src/tables.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/base64-0.13.1/src/tables.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,1957 +0,0 @@ -pub const INVALID_VALUE: u8 = 255; -#[rustfmt::skip] -pub const STANDARD_ENCODE: &[u8; 64] = &[ - 65, // input 0 (0x0) => 'A' (0x41) - 66, // input 1 (0x1) => 'B' (0x42) - 67, // input 2 (0x2) => 'C' (0x43) - 68, // input 3 (0x3) => 'D' (0x44) - 69, // input 4 (0x4) => 'E' (0x45) - 70, // input 5 (0x5) => 'F' (0x46) - 71, // input 6 (0x6) => 'G' (0x47) - 72, // input 7 (0x7) => 'H' (0x48) - 73, // input 8 (0x8) => 'I' (0x49) - 74, // input 9 (0x9) => 'J' (0x4A) - 75, // input 10 (0xA) => 'K' (0x4B) - 76, // input 11 (0xB) => 'L' (0x4C) - 77, // input 12 (0xC) => 'M' (0x4D) - 78, // input 13 (0xD) => 'N' (0x4E) - 79, // input 14 (0xE) => 'O' (0x4F) - 80, // input 15 (0xF) => 'P' (0x50) - 81, // input 16 (0x10) => 'Q' (0x51) - 82, // input 17 (0x11) => 'R' (0x52) - 83, // input 18 (0x12) => 'S' (0x53) - 84, // input 19 (0x13) => 'T' (0x54) - 85, // input 20 (0x14) => 'U' (0x55) - 86, // input 21 (0x15) => 'V' (0x56) - 87, // input 22 (0x16) => 'W' (0x57) - 88, // input 23 (0x17) => 'X' (0x58) - 89, // input 24 (0x18) => 'Y' (0x59) - 90, // input 25 (0x19) => 'Z' (0x5A) - 97, // input 26 (0x1A) => 'a' (0x61) - 98, // input 27 (0x1B) => 'b' (0x62) - 99, // input 28 (0x1C) => 'c' (0x63) - 100, // input 29 (0x1D) => 'd' (0x64) - 101, // input 30 (0x1E) => 'e' (0x65) - 102, // input 31 (0x1F) => 'f' (0x66) - 103, // input 32 (0x20) => 'g' (0x67) - 104, // input 33 (0x21) => 'h' (0x68) - 105, // input 34 (0x22) => 'i' (0x69) - 106, // input 35 (0x23) => 'j' (0x6A) - 107, // input 36 (0x24) => 'k' (0x6B) - 108, // input 37 (0x25) => 'l' (0x6C) - 109, // input 38 (0x26) => 'm' (0x6D) - 110, // input 39 (0x27) => 'n' (0x6E) - 111, // input 40 (0x28) => 'o' (0x6F) - 112, // input 41 (0x29) => 'p' (0x70) - 113, // input 42 (0x2A) => 'q' (0x71) - 114, // input 43 (0x2B) => 'r' (0x72) - 115, // input 44 (0x2C) => 's' (0x73) - 116, // input 45 (0x2D) => 't' (0x74) - 117, // input 46 (0x2E) => 'u' (0x75) - 118, // input 47 (0x2F) => 'v' (0x76) - 119, // input 48 (0x30) => 'w' (0x77) - 120, // input 49 (0x31) => 'x' (0x78) - 121, // input 50 (0x32) => 'y' (0x79) - 122, // input 51 (0x33) => 'z' (0x7A) - 48, // input 52 (0x34) => '0' (0x30) - 49, // input 53 (0x35) => '1' (0x31) - 50, // input 54 (0x36) => '2' (0x32) - 51, // input 55 (0x37) => '3' (0x33) - 52, // input 56 (0x38) => '4' (0x34) - 53, // input 57 (0x39) => '5' (0x35) - 54, // input 58 (0x3A) => '6' (0x36) - 55, // input 59 (0x3B) => '7' (0x37) - 56, // input 60 (0x3C) => '8' (0x38) - 57, // input 61 (0x3D) => '9' (0x39) - 43, // input 62 (0x3E) => '+' (0x2B) - 47, // input 63 (0x3F) => '/' (0x2F) -]; -#[rustfmt::skip] -pub const STANDARD_DECODE: &[u8; 256] = &[ - INVALID_VALUE, // input 0 (0x0) - INVALID_VALUE, // input 1 (0x1) - INVALID_VALUE, // input 2 (0x2) - INVALID_VALUE, // input 3 (0x3) - INVALID_VALUE, // input 4 (0x4) - INVALID_VALUE, // input 5 (0x5) - INVALID_VALUE, // input 6 (0x6) - INVALID_VALUE, // input 7 (0x7) - INVALID_VALUE, // input 8 (0x8) - INVALID_VALUE, // input 9 (0x9) - INVALID_VALUE, // input 10 (0xA) - INVALID_VALUE, // input 11 (0xB) - INVALID_VALUE, // input 12 (0xC) - INVALID_VALUE, // input 13 (0xD) - INVALID_VALUE, // input 14 (0xE) - INVALID_VALUE, // input 15 (0xF) - INVALID_VALUE, // input 16 (0x10) - INVALID_VALUE, // input 17 (0x11) - INVALID_VALUE, // input 18 (0x12) - INVALID_VALUE, // input 19 (0x13) - INVALID_VALUE, // input 20 (0x14) - INVALID_VALUE, // input 21 (0x15) - INVALID_VALUE, // input 22 (0x16) - INVALID_VALUE, // input 23 (0x17) - INVALID_VALUE, // input 24 (0x18) - INVALID_VALUE, // input 25 (0x19) - INVALID_VALUE, // input 26 (0x1A) - INVALID_VALUE, // input 27 (0x1B) - INVALID_VALUE, // input 28 (0x1C) - INVALID_VALUE, // input 29 (0x1D) - INVALID_VALUE, // input 30 (0x1E) - INVALID_VALUE, // input 31 (0x1F) - INVALID_VALUE, // input 32 (0x20) - INVALID_VALUE, // input 33 (0x21) - INVALID_VALUE, // input 34 (0x22) - INVALID_VALUE, // input 35 (0x23) - INVALID_VALUE, // input 36 (0x24) - INVALID_VALUE, // input 37 (0x25) - INVALID_VALUE, // input 38 (0x26) - INVALID_VALUE, // input 39 (0x27) - INVALID_VALUE, // input 40 (0x28) - INVALID_VALUE, // input 41 (0x29) - INVALID_VALUE, // input 42 (0x2A) - 62, // input 43 (0x2B char '+') => 62 (0x3E) - INVALID_VALUE, // input 44 (0x2C) - INVALID_VALUE, // input 45 (0x2D) - INVALID_VALUE, // input 46 (0x2E) - 63, // input 47 (0x2F char '/') => 63 (0x3F) - 52, // input 48 (0x30 char '0') => 52 (0x34) - 53, // input 49 (0x31 char '1') => 53 (0x35) - 54, // input 50 (0x32 char '2') => 54 (0x36) - 55, // input 51 (0x33 char '3') => 55 (0x37) - 56, // input 52 (0x34 char '4') => 56 (0x38) - 57, // input 53 (0x35 char '5') => 57 (0x39) - 58, // input 54 (0x36 char '6') => 58 (0x3A) - 59, // input 55 (0x37 char '7') => 59 (0x3B) - 60, // input 56 (0x38 char '8') => 60 (0x3C) - 61, // input 57 (0x39 char '9') => 61 (0x3D) - INVALID_VALUE, // input 58 (0x3A) - INVALID_VALUE, // input 59 (0x3B) - INVALID_VALUE, // input 60 (0x3C) - INVALID_VALUE, // input 61 (0x3D) - INVALID_VALUE, // input 62 (0x3E) - INVALID_VALUE, // input 63 (0x3F) - INVALID_VALUE, // input 64 (0x40) - 0, // input 65 (0x41 char 'A') => 0 (0x0) - 1, // input 66 (0x42 char 'B') => 1 (0x1) - 2, // input 67 (0x43 char 'C') => 2 (0x2) - 3, // input 68 (0x44 char 'D') => 3 (0x3) - 4, // input 69 (0x45 char 'E') => 4 (0x4) - 5, // input 70 (0x46 char 'F') => 5 (0x5) - 6, // input 71 (0x47 char 'G') => 6 (0x6) - 7, // input 72 (0x48 char 'H') => 7 (0x7) - 8, // input 73 (0x49 char 'I') => 8 (0x8) - 9, // input 74 (0x4A char 'J') => 9 (0x9) - 10, // input 75 (0x4B char 'K') => 10 (0xA) - 11, // input 76 (0x4C char 'L') => 11 (0xB) - 12, // input 77 (0x4D char 'M') => 12 (0xC) - 13, // input 78 (0x4E char 'N') => 13 (0xD) - 14, // input 79 (0x4F char 'O') => 14 (0xE) - 15, // input 80 (0x50 char 'P') => 15 (0xF) - 16, // input 81 (0x51 char 'Q') => 16 (0x10) - 17, // input 82 (0x52 char 'R') => 17 (0x11) - 18, // input 83 (0x53 char 'S') => 18 (0x12) - 19, // input 84 (0x54 char 'T') => 19 (0x13) - 20, // input 85 (0x55 char 'U') => 20 (0x14) - 21, // input 86 (0x56 char 'V') => 21 (0x15) - 22, // input 87 (0x57 char 'W') => 22 (0x16) - 23, // input 88 (0x58 char 'X') => 23 (0x17) - 24, // input 89 (0x59 char 'Y') => 24 (0x18) - 25, // input 90 (0x5A char 'Z') => 25 (0x19) - INVALID_VALUE, // input 91 (0x5B) - INVALID_VALUE, // input 92 (0x5C) - INVALID_VALUE, // input 93 (0x5D) - INVALID_VALUE, // input 94 (0x5E) - INVALID_VALUE, // input 95 (0x5F) - INVALID_VALUE, // input 96 (0x60) - 26, // input 97 (0x61 char 'a') => 26 (0x1A) - 27, // input 98 (0x62 char 'b') => 27 (0x1B) - 28, // input 99 (0x63 char 'c') => 28 (0x1C) - 29, // input 100 (0x64 char 'd') => 29 (0x1D) - 30, // input 101 (0x65 char 'e') => 30 (0x1E) - 31, // input 102 (0x66 char 'f') => 31 (0x1F) - 32, // input 103 (0x67 char 'g') => 32 (0x20) - 33, // input 104 (0x68 char 'h') => 33 (0x21) - 34, // input 105 (0x69 char 'i') => 34 (0x22) - 35, // input 106 (0x6A char 'j') => 35 (0x23) - 36, // input 107 (0x6B char 'k') => 36 (0x24) - 37, // input 108 (0x6C char 'l') => 37 (0x25) - 38, // input 109 (0x6D char 'm') => 38 (0x26) - 39, // input 110 (0x6E char 'n') => 39 (0x27) - 40, // input 111 (0x6F char 'o') => 40 (0x28) - 41, // input 112 (0x70 char 'p') => 41 (0x29) - 42, // input 113 (0x71 char 'q') => 42 (0x2A) - 43, // input 114 (0x72 char 'r') => 43 (0x2B) - 44, // input 115 (0x73 char 's') => 44 (0x2C) - 45, // input 116 (0x74 char 't') => 45 (0x2D) - 46, // input 117 (0x75 char 'u') => 46 (0x2E) - 47, // input 118 (0x76 char 'v') => 47 (0x2F) - 48, // input 119 (0x77 char 'w') => 48 (0x30) - 49, // input 120 (0x78 char 'x') => 49 (0x31) - 50, // input 121 (0x79 char 'y') => 50 (0x32) - 51, // input 122 (0x7A char 'z') => 51 (0x33) - INVALID_VALUE, // input 123 (0x7B) - INVALID_VALUE, // input 124 (0x7C) - INVALID_VALUE, // input 125 (0x7D) - INVALID_VALUE, // input 126 (0x7E) - INVALID_VALUE, // input 127 (0x7F) - INVALID_VALUE, // input 128 (0x80) - INVALID_VALUE, // input 129 (0x81) - INVALID_VALUE, // input 130 (0x82) - INVALID_VALUE, // input 131 (0x83) - INVALID_VALUE, // input 132 (0x84) - INVALID_VALUE, // input 133 (0x85) - INVALID_VALUE, // input 134 (0x86) - INVALID_VALUE, // input 135 (0x87) - INVALID_VALUE, // input 136 (0x88) - INVALID_VALUE, // input 137 (0x89) - INVALID_VALUE, // input 138 (0x8A) - INVALID_VALUE, // input 139 (0x8B) - INVALID_VALUE, // input 140 (0x8C) - INVALID_VALUE, // input 141 (0x8D) - INVALID_VALUE, // input 142 (0x8E) - INVALID_VALUE, // input 143 (0x8F) - INVALID_VALUE, // input 144 (0x90) - INVALID_VALUE, // input 145 (0x91) - INVALID_VALUE, // input 146 (0x92) - INVALID_VALUE, // input 147 (0x93) - INVALID_VALUE, // input 148 (0x94) - INVALID_VALUE, // input 149 (0x95) - INVALID_VALUE, // input 150 (0x96) - INVALID_VALUE, // input 151 (0x97) - INVALID_VALUE, // input 152 (0x98) - INVALID_VALUE, // input 153 (0x99) - INVALID_VALUE, // input 154 (0x9A) - INVALID_VALUE, // input 155 (0x9B) - INVALID_VALUE, // input 156 (0x9C) - INVALID_VALUE, // input 157 (0x9D) - INVALID_VALUE, // input 158 (0x9E) - INVALID_VALUE, // input 159 (0x9F) - INVALID_VALUE, // input 160 (0xA0) - INVALID_VALUE, // input 161 (0xA1) - INVALID_VALUE, // input 162 (0xA2) - INVALID_VALUE, // input 163 (0xA3) - INVALID_VALUE, // input 164 (0xA4) - INVALID_VALUE, // input 165 (0xA5) - INVALID_VALUE, // input 166 (0xA6) - INVALID_VALUE, // input 167 (0xA7) - INVALID_VALUE, // input 168 (0xA8) - INVALID_VALUE, // input 169 (0xA9) - INVALID_VALUE, // input 170 (0xAA) - INVALID_VALUE, // input 171 (0xAB) - INVALID_VALUE, // input 172 (0xAC) - INVALID_VALUE, // input 173 (0xAD) - INVALID_VALUE, // input 174 (0xAE) - INVALID_VALUE, // input 175 (0xAF) - INVALID_VALUE, // input 176 (0xB0) - INVALID_VALUE, // input 177 (0xB1) - INVALID_VALUE, // input 178 (0xB2) - INVALID_VALUE, // input 179 (0xB3) - INVALID_VALUE, // input 180 (0xB4) - INVALID_VALUE, // input 181 (0xB5) - INVALID_VALUE, // input 182 (0xB6) - INVALID_VALUE, // input 183 (0xB7) - INVALID_VALUE, // input 184 (0xB8) - INVALID_VALUE, // input 185 (0xB9) - INVALID_VALUE, // input 186 (0xBA) - INVALID_VALUE, // input 187 (0xBB) - INVALID_VALUE, // input 188 (0xBC) - INVALID_VALUE, // input 189 (0xBD) - INVALID_VALUE, // input 190 (0xBE) - INVALID_VALUE, // input 191 (0xBF) - INVALID_VALUE, // input 192 (0xC0) - INVALID_VALUE, // input 193 (0xC1) - INVALID_VALUE, // input 194 (0xC2) - INVALID_VALUE, // input 195 (0xC3) - INVALID_VALUE, // input 196 (0xC4) - INVALID_VALUE, // input 197 (0xC5) - INVALID_VALUE, // input 198 (0xC6) - INVALID_VALUE, // input 199 (0xC7) - INVALID_VALUE, // input 200 (0xC8) - INVALID_VALUE, // input 201 (0xC9) - INVALID_VALUE, // input 202 (0xCA) - INVALID_VALUE, // input 203 (0xCB) - INVALID_VALUE, // input 204 (0xCC) - INVALID_VALUE, // input 205 (0xCD) - INVALID_VALUE, // input 206 (0xCE) - INVALID_VALUE, // input 207 (0xCF) - INVALID_VALUE, // input 208 (0xD0) - INVALID_VALUE, // input 209 (0xD1) - INVALID_VALUE, // input 210 (0xD2) - INVALID_VALUE, // input 211 (0xD3) - INVALID_VALUE, // input 212 (0xD4) - INVALID_VALUE, // input 213 (0xD5) - INVALID_VALUE, // input 214 (0xD6) - INVALID_VALUE, // input 215 (0xD7) - INVALID_VALUE, // input 216 (0xD8) - INVALID_VALUE, // input 217 (0xD9) - INVALID_VALUE, // input 218 (0xDA) - INVALID_VALUE, // input 219 (0xDB) - INVALID_VALUE, // input 220 (0xDC) - INVALID_VALUE, // input 221 (0xDD) - INVALID_VALUE, // input 222 (0xDE) - INVALID_VALUE, // input 223 (0xDF) - INVALID_VALUE, // input 224 (0xE0) - INVALID_VALUE, // input 225 (0xE1) - INVALID_VALUE, // input 226 (0xE2) - INVALID_VALUE, // input 227 (0xE3) - INVALID_VALUE, // input 228 (0xE4) - INVALID_VALUE, // input 229 (0xE5) - INVALID_VALUE, // input 230 (0xE6) - INVALID_VALUE, // input 231 (0xE7) - INVALID_VALUE, // input 232 (0xE8) - INVALID_VALUE, // input 233 (0xE9) - INVALID_VALUE, // input 234 (0xEA) - INVALID_VALUE, // input 235 (0xEB) - INVALID_VALUE, // input 236 (0xEC) - INVALID_VALUE, // input 237 (0xED) - INVALID_VALUE, // input 238 (0xEE) - INVALID_VALUE, // input 239 (0xEF) - INVALID_VALUE, // input 240 (0xF0) - INVALID_VALUE, // input 241 (0xF1) - INVALID_VALUE, // input 242 (0xF2) - INVALID_VALUE, // input 243 (0xF3) - INVALID_VALUE, // input 244 (0xF4) - INVALID_VALUE, // input 245 (0xF5) - INVALID_VALUE, // input 246 (0xF6) - INVALID_VALUE, // input 247 (0xF7) - INVALID_VALUE, // input 248 (0xF8) - INVALID_VALUE, // input 249 (0xF9) - INVALID_VALUE, // input 250 (0xFA) - INVALID_VALUE, // input 251 (0xFB) - INVALID_VALUE, // input 252 (0xFC) - INVALID_VALUE, // input 253 (0xFD) - INVALID_VALUE, // input 254 (0xFE) - INVALID_VALUE, // input 255 (0xFF) -]; -#[rustfmt::skip] -pub const URL_SAFE_ENCODE: &[u8; 64] = &[ - 65, // input 0 (0x0) => 'A' (0x41) - 66, // input 1 (0x1) => 'B' (0x42) - 67, // input 2 (0x2) => 'C' (0x43) - 68, // input 3 (0x3) => 'D' (0x44) - 69, // input 4 (0x4) => 'E' (0x45) - 70, // input 5 (0x5) => 'F' (0x46) - 71, // input 6 (0x6) => 'G' (0x47) - 72, // input 7 (0x7) => 'H' (0x48) - 73, // input 8 (0x8) => 'I' (0x49) - 74, // input 9 (0x9) => 'J' (0x4A) - 75, // input 10 (0xA) => 'K' (0x4B) - 76, // input 11 (0xB) => 'L' (0x4C) - 77, // input 12 (0xC) => 'M' (0x4D) - 78, // input 13 (0xD) => 'N' (0x4E) - 79, // input 14 (0xE) => 'O' (0x4F) - 80, // input 15 (0xF) => 'P' (0x50) - 81, // input 16 (0x10) => 'Q' (0x51) - 82, // input 17 (0x11) => 'R' (0x52) - 83, // input 18 (0x12) => 'S' (0x53) - 84, // input 19 (0x13) => 'T' (0x54) - 85, // input 20 (0x14) => 'U' (0x55) - 86, // input 21 (0x15) => 'V' (0x56) - 87, // input 22 (0x16) => 'W' (0x57) - 88, // input 23 (0x17) => 'X' (0x58) - 89, // input 24 (0x18) => 'Y' (0x59) - 90, // input 25 (0x19) => 'Z' (0x5A) - 97, // input 26 (0x1A) => 'a' (0x61) - 98, // input 27 (0x1B) => 'b' (0x62) - 99, // input 28 (0x1C) => 'c' (0x63) - 100, // input 29 (0x1D) => 'd' (0x64) - 101, // input 30 (0x1E) => 'e' (0x65) - 102, // input 31 (0x1F) => 'f' (0x66) - 103, // input 32 (0x20) => 'g' (0x67) - 104, // input 33 (0x21) => 'h' (0x68) - 105, // input 34 (0x22) => 'i' (0x69) - 106, // input 35 (0x23) => 'j' (0x6A) - 107, // input 36 (0x24) => 'k' (0x6B) - 108, // input 37 (0x25) => 'l' (0x6C) - 109, // input 38 (0x26) => 'm' (0x6D) - 110, // input 39 (0x27) => 'n' (0x6E) - 111, // input 40 (0x28) => 'o' (0x6F) - 112, // input 41 (0x29) => 'p' (0x70) - 113, // input 42 (0x2A) => 'q' (0x71) - 114, // input 43 (0x2B) => 'r' (0x72) - 115, // input 44 (0x2C) => 's' (0x73) - 116, // input 45 (0x2D) => 't' (0x74) - 117, // input 46 (0x2E) => 'u' (0x75) - 118, // input 47 (0x2F) => 'v' (0x76) - 119, // input 48 (0x30) => 'w' (0x77) - 120, // input 49 (0x31) => 'x' (0x78) - 121, // input 50 (0x32) => 'y' (0x79) - 122, // input 51 (0x33) => 'z' (0x7A) - 48, // input 52 (0x34) => '0' (0x30) - 49, // input 53 (0x35) => '1' (0x31) - 50, // input 54 (0x36) => '2' (0x32) - 51, // input 55 (0x37) => '3' (0x33) - 52, // input 56 (0x38) => '4' (0x34) - 53, // input 57 (0x39) => '5' (0x35) - 54, // input 58 (0x3A) => '6' (0x36) - 55, // input 59 (0x3B) => '7' (0x37) - 56, // input 60 (0x3C) => '8' (0x38) - 57, // input 61 (0x3D) => '9' (0x39) - 45, // input 62 (0x3E) => '-' (0x2D) - 95, // input 63 (0x3F) => '_' (0x5F) -]; -#[rustfmt::skip] -pub const URL_SAFE_DECODE: &[u8; 256] = &[ - INVALID_VALUE, // input 0 (0x0) - INVALID_VALUE, // input 1 (0x1) - INVALID_VALUE, // input 2 (0x2) - INVALID_VALUE, // input 3 (0x3) - INVALID_VALUE, // input 4 (0x4) - INVALID_VALUE, // input 5 (0x5) - INVALID_VALUE, // input 6 (0x6) - INVALID_VALUE, // input 7 (0x7) - INVALID_VALUE, // input 8 (0x8) - INVALID_VALUE, // input 9 (0x9) - INVALID_VALUE, // input 10 (0xA) - INVALID_VALUE, // input 11 (0xB) - INVALID_VALUE, // input 12 (0xC) - INVALID_VALUE, // input 13 (0xD) - INVALID_VALUE, // input 14 (0xE) - INVALID_VALUE, // input 15 (0xF) - INVALID_VALUE, // input 16 (0x10) - INVALID_VALUE, // input 17 (0x11) - INVALID_VALUE, // input 18 (0x12) - INVALID_VALUE, // input 19 (0x13) - INVALID_VALUE, // input 20 (0x14) - INVALID_VALUE, // input 21 (0x15) - INVALID_VALUE, // input 22 (0x16) - INVALID_VALUE, // input 23 (0x17) - INVALID_VALUE, // input 24 (0x18) - INVALID_VALUE, // input 25 (0x19) - INVALID_VALUE, // input 26 (0x1A) - INVALID_VALUE, // input 27 (0x1B) - INVALID_VALUE, // input 28 (0x1C) - INVALID_VALUE, // input 29 (0x1D) - INVALID_VALUE, // input 30 (0x1E) - INVALID_VALUE, // input 31 (0x1F) - INVALID_VALUE, // input 32 (0x20) - INVALID_VALUE, // input 33 (0x21) - INVALID_VALUE, // input 34 (0x22) - INVALID_VALUE, // input 35 (0x23) - INVALID_VALUE, // input 36 (0x24) - INVALID_VALUE, // input 37 (0x25) - INVALID_VALUE, // input 38 (0x26) - INVALID_VALUE, // input 39 (0x27) - INVALID_VALUE, // input 40 (0x28) - INVALID_VALUE, // input 41 (0x29) - INVALID_VALUE, // input 42 (0x2A) - INVALID_VALUE, // input 43 (0x2B) - INVALID_VALUE, // input 44 (0x2C) - 62, // input 45 (0x2D char '-') => 62 (0x3E) - INVALID_VALUE, // input 46 (0x2E) - INVALID_VALUE, // input 47 (0x2F) - 52, // input 48 (0x30 char '0') => 52 (0x34) - 53, // input 49 (0x31 char '1') => 53 (0x35) - 54, // input 50 (0x32 char '2') => 54 (0x36) - 55, // input 51 (0x33 char '3') => 55 (0x37) - 56, // input 52 (0x34 char '4') => 56 (0x38) - 57, // input 53 (0x35 char '5') => 57 (0x39) - 58, // input 54 (0x36 char '6') => 58 (0x3A) - 59, // input 55 (0x37 char '7') => 59 (0x3B) - 60, // input 56 (0x38 char '8') => 60 (0x3C) - 61, // input 57 (0x39 char '9') => 61 (0x3D) - INVALID_VALUE, // input 58 (0x3A) - INVALID_VALUE, // input 59 (0x3B) - INVALID_VALUE, // input 60 (0x3C) - INVALID_VALUE, // input 61 (0x3D) - INVALID_VALUE, // input 62 (0x3E) - INVALID_VALUE, // input 63 (0x3F) - INVALID_VALUE, // input 64 (0x40) - 0, // input 65 (0x41 char 'A') => 0 (0x0) - 1, // input 66 (0x42 char 'B') => 1 (0x1) - 2, // input 67 (0x43 char 'C') => 2 (0x2) - 3, // input 68 (0x44 char 'D') => 3 (0x3) - 4, // input 69 (0x45 char 'E') => 4 (0x4) - 5, // input 70 (0x46 char 'F') => 5 (0x5) - 6, // input 71 (0x47 char 'G') => 6 (0x6) - 7, // input 72 (0x48 char 'H') => 7 (0x7) - 8, // input 73 (0x49 char 'I') => 8 (0x8) - 9, // input 74 (0x4A char 'J') => 9 (0x9) - 10, // input 75 (0x4B char 'K') => 10 (0xA) - 11, // input 76 (0x4C char 'L') => 11 (0xB) - 12, // input 77 (0x4D char 'M') => 12 (0xC) - 13, // input 78 (0x4E char 'N') => 13 (0xD) - 14, // input 79 (0x4F char 'O') => 14 (0xE) - 15, // input 80 (0x50 char 'P') => 15 (0xF) - 16, // input 81 (0x51 char 'Q') => 16 (0x10) - 17, // input 82 (0x52 char 'R') => 17 (0x11) - 18, // input 83 (0x53 char 'S') => 18 (0x12) - 19, // input 84 (0x54 char 'T') => 19 (0x13) - 20, // input 85 (0x55 char 'U') => 20 (0x14) - 21, // input 86 (0x56 char 'V') => 21 (0x15) - 22, // input 87 (0x57 char 'W') => 22 (0x16) - 23, // input 88 (0x58 char 'X') => 23 (0x17) - 24, // input 89 (0x59 char 'Y') => 24 (0x18) - 25, // input 90 (0x5A char 'Z') => 25 (0x19) - INVALID_VALUE, // input 91 (0x5B) - INVALID_VALUE, // input 92 (0x5C) - INVALID_VALUE, // input 93 (0x5D) - INVALID_VALUE, // input 94 (0x5E) - 63, // input 95 (0x5F char '_') => 63 (0x3F) - INVALID_VALUE, // input 96 (0x60) - 26, // input 97 (0x61 char 'a') => 26 (0x1A) - 27, // input 98 (0x62 char 'b') => 27 (0x1B) - 28, // input 99 (0x63 char 'c') => 28 (0x1C) - 29, // input 100 (0x64 char 'd') => 29 (0x1D) - 30, // input 101 (0x65 char 'e') => 30 (0x1E) - 31, // input 102 (0x66 char 'f') => 31 (0x1F) - 32, // input 103 (0x67 char 'g') => 32 (0x20) - 33, // input 104 (0x68 char 'h') => 33 (0x21) - 34, // input 105 (0x69 char 'i') => 34 (0x22) - 35, // input 106 (0x6A char 'j') => 35 (0x23) - 36, // input 107 (0x6B char 'k') => 36 (0x24) - 37, // input 108 (0x6C char 'l') => 37 (0x25) - 38, // input 109 (0x6D char 'm') => 38 (0x26) - 39, // input 110 (0x6E char 'n') => 39 (0x27) - 40, // input 111 (0x6F char 'o') => 40 (0x28) - 41, // input 112 (0x70 char 'p') => 41 (0x29) - 42, // input 113 (0x71 char 'q') => 42 (0x2A) - 43, // input 114 (0x72 char 'r') => 43 (0x2B) - 44, // input 115 (0x73 char 's') => 44 (0x2C) - 45, // input 116 (0x74 char 't') => 45 (0x2D) - 46, // input 117 (0x75 char 'u') => 46 (0x2E) - 47, // input 118 (0x76 char 'v') => 47 (0x2F) - 48, // input 119 (0x77 char 'w') => 48 (0x30) - 49, // input 120 (0x78 char 'x') => 49 (0x31) - 50, // input 121 (0x79 char 'y') => 50 (0x32) - 51, // input 122 (0x7A char 'z') => 51 (0x33) - INVALID_VALUE, // input 123 (0x7B) - INVALID_VALUE, // input 124 (0x7C) - INVALID_VALUE, // input 125 (0x7D) - INVALID_VALUE, // input 126 (0x7E) - INVALID_VALUE, // input 127 (0x7F) - INVALID_VALUE, // input 128 (0x80) - INVALID_VALUE, // input 129 (0x81) - INVALID_VALUE, // input 130 (0x82) - INVALID_VALUE, // input 131 (0x83) - INVALID_VALUE, // input 132 (0x84) - INVALID_VALUE, // input 133 (0x85) - INVALID_VALUE, // input 134 (0x86) - INVALID_VALUE, // input 135 (0x87) - INVALID_VALUE, // input 136 (0x88) - INVALID_VALUE, // input 137 (0x89) - INVALID_VALUE, // input 138 (0x8A) - INVALID_VALUE, // input 139 (0x8B) - INVALID_VALUE, // input 140 (0x8C) - INVALID_VALUE, // input 141 (0x8D) - INVALID_VALUE, // input 142 (0x8E) - INVALID_VALUE, // input 143 (0x8F) - INVALID_VALUE, // input 144 (0x90) - INVALID_VALUE, // input 145 (0x91) - INVALID_VALUE, // input 146 (0x92) - INVALID_VALUE, // input 147 (0x93) - INVALID_VALUE, // input 148 (0x94) - INVALID_VALUE, // input 149 (0x95) - INVALID_VALUE, // input 150 (0x96) - INVALID_VALUE, // input 151 (0x97) - INVALID_VALUE, // input 152 (0x98) - INVALID_VALUE, // input 153 (0x99) - INVALID_VALUE, // input 154 (0x9A) - INVALID_VALUE, // input 155 (0x9B) - INVALID_VALUE, // input 156 (0x9C) - INVALID_VALUE, // input 157 (0x9D) - INVALID_VALUE, // input 158 (0x9E) - INVALID_VALUE, // input 159 (0x9F) - INVALID_VALUE, // input 160 (0xA0) - INVALID_VALUE, // input 161 (0xA1) - INVALID_VALUE, // input 162 (0xA2) - INVALID_VALUE, // input 163 (0xA3) - INVALID_VALUE, // input 164 (0xA4) - INVALID_VALUE, // input 165 (0xA5) - INVALID_VALUE, // input 166 (0xA6) - INVALID_VALUE, // input 167 (0xA7) - INVALID_VALUE, // input 168 (0xA8) - INVALID_VALUE, // input 169 (0xA9) - INVALID_VALUE, // input 170 (0xAA) - INVALID_VALUE, // input 171 (0xAB) - INVALID_VALUE, // input 172 (0xAC) - INVALID_VALUE, // input 173 (0xAD) - INVALID_VALUE, // input 174 (0xAE) - INVALID_VALUE, // input 175 (0xAF) - INVALID_VALUE, // input 176 (0xB0) - INVALID_VALUE, // input 177 (0xB1) - INVALID_VALUE, // input 178 (0xB2) - INVALID_VALUE, // input 179 (0xB3) - INVALID_VALUE, // input 180 (0xB4) - INVALID_VALUE, // input 181 (0xB5) - INVALID_VALUE, // input 182 (0xB6) - INVALID_VALUE, // input 183 (0xB7) - INVALID_VALUE, // input 184 (0xB8) - INVALID_VALUE, // input 185 (0xB9) - INVALID_VALUE, // input 186 (0xBA) - INVALID_VALUE, // input 187 (0xBB) - INVALID_VALUE, // input 188 (0xBC) - INVALID_VALUE, // input 189 (0xBD) - INVALID_VALUE, // input 190 (0xBE) - INVALID_VALUE, // input 191 (0xBF) - INVALID_VALUE, // input 192 (0xC0) - INVALID_VALUE, // input 193 (0xC1) - INVALID_VALUE, // input 194 (0xC2) - INVALID_VALUE, // input 195 (0xC3) - INVALID_VALUE, // input 196 (0xC4) - INVALID_VALUE, // input 197 (0xC5) - INVALID_VALUE, // input 198 (0xC6) - INVALID_VALUE, // input 199 (0xC7) - INVALID_VALUE, // input 200 (0xC8) - INVALID_VALUE, // input 201 (0xC9) - INVALID_VALUE, // input 202 (0xCA) - INVALID_VALUE, // input 203 (0xCB) - INVALID_VALUE, // input 204 (0xCC) - INVALID_VALUE, // input 205 (0xCD) - INVALID_VALUE, // input 206 (0xCE) - INVALID_VALUE, // input 207 (0xCF) - INVALID_VALUE, // input 208 (0xD0) - INVALID_VALUE, // input 209 (0xD1) - INVALID_VALUE, // input 210 (0xD2) - INVALID_VALUE, // input 211 (0xD3) - INVALID_VALUE, // input 212 (0xD4) - INVALID_VALUE, // input 213 (0xD5) - INVALID_VALUE, // input 214 (0xD6) - INVALID_VALUE, // input 215 (0xD7) - INVALID_VALUE, // input 216 (0xD8) - INVALID_VALUE, // input 217 (0xD9) - INVALID_VALUE, // input 218 (0xDA) - INVALID_VALUE, // input 219 (0xDB) - INVALID_VALUE, // input 220 (0xDC) - INVALID_VALUE, // input 221 (0xDD) - INVALID_VALUE, // input 222 (0xDE) - INVALID_VALUE, // input 223 (0xDF) - INVALID_VALUE, // input 224 (0xE0) - INVALID_VALUE, // input 225 (0xE1) - INVALID_VALUE, // input 226 (0xE2) - INVALID_VALUE, // input 227 (0xE3) - INVALID_VALUE, // input 228 (0xE4) - INVALID_VALUE, // input 229 (0xE5) - INVALID_VALUE, // input 230 (0xE6) - INVALID_VALUE, // input 231 (0xE7) - INVALID_VALUE, // input 232 (0xE8) - INVALID_VALUE, // input 233 (0xE9) - INVALID_VALUE, // input 234 (0xEA) - INVALID_VALUE, // input 235 (0xEB) - INVALID_VALUE, // input 236 (0xEC) - INVALID_VALUE, // input 237 (0xED) - INVALID_VALUE, // input 238 (0xEE) - INVALID_VALUE, // input 239 (0xEF) - INVALID_VALUE, // input 240 (0xF0) - INVALID_VALUE, // input 241 (0xF1) - INVALID_VALUE, // input 242 (0xF2) - INVALID_VALUE, // input 243 (0xF3) - INVALID_VALUE, // input 244 (0xF4) - INVALID_VALUE, // input 245 (0xF5) - INVALID_VALUE, // input 246 (0xF6) - INVALID_VALUE, // input 247 (0xF7) - INVALID_VALUE, // input 248 (0xF8) - INVALID_VALUE, // input 249 (0xF9) - INVALID_VALUE, // input 250 (0xFA) - INVALID_VALUE, // input 251 (0xFB) - INVALID_VALUE, // input 252 (0xFC) - INVALID_VALUE, // input 253 (0xFD) - INVALID_VALUE, // input 254 (0xFE) - INVALID_VALUE, // input 255 (0xFF) -]; -#[rustfmt::skip] -pub const CRYPT_ENCODE: &[u8; 64] = &[ - 46, // input 0 (0x0) => '.' (0x2E) - 47, // input 1 (0x1) => '/' (0x2F) - 48, // input 2 (0x2) => '0' (0x30) - 49, // input 3 (0x3) => '1' (0x31) - 50, // input 4 (0x4) => '2' (0x32) - 51, // input 5 (0x5) => '3' (0x33) - 52, // input 6 (0x6) => '4' (0x34) - 53, // input 7 (0x7) => '5' (0x35) - 54, // input 8 (0x8) => '6' (0x36) - 55, // input 9 (0x9) => '7' (0x37) - 56, // input 10 (0xA) => '8' (0x38) - 57, // input 11 (0xB) => '9' (0x39) - 65, // input 12 (0xC) => 'A' (0x41) - 66, // input 13 (0xD) => 'B' (0x42) - 67, // input 14 (0xE) => 'C' (0x43) - 68, // input 15 (0xF) => 'D' (0x44) - 69, // input 16 (0x10) => 'E' (0x45) - 70, // input 17 (0x11) => 'F' (0x46) - 71, // input 18 (0x12) => 'G' (0x47) - 72, // input 19 (0x13) => 'H' (0x48) - 73, // input 20 (0x14) => 'I' (0x49) - 74, // input 21 (0x15) => 'J' (0x4A) - 75, // input 22 (0x16) => 'K' (0x4B) - 76, // input 23 (0x17) => 'L' (0x4C) - 77, // input 24 (0x18) => 'M' (0x4D) - 78, // input 25 (0x19) => 'N' (0x4E) - 79, // input 26 (0x1A) => 'O' (0x4F) - 80, // input 27 (0x1B) => 'P' (0x50) - 81, // input 28 (0x1C) => 'Q' (0x51) - 82, // input 29 (0x1D) => 'R' (0x52) - 83, // input 30 (0x1E) => 'S' (0x53) - 84, // input 31 (0x1F) => 'T' (0x54) - 85, // input 32 (0x20) => 'U' (0x55) - 86, // input 33 (0x21) => 'V' (0x56) - 87, // input 34 (0x22) => 'W' (0x57) - 88, // input 35 (0x23) => 'X' (0x58) - 89, // input 36 (0x24) => 'Y' (0x59) - 90, // input 37 (0x25) => 'Z' (0x5A) - 97, // input 38 (0x26) => 'a' (0x61) - 98, // input 39 (0x27) => 'b' (0x62) - 99, // input 40 (0x28) => 'c' (0x63) - 100, // input 41 (0x29) => 'd' (0x64) - 101, // input 42 (0x2A) => 'e' (0x65) - 102, // input 43 (0x2B) => 'f' (0x66) - 103, // input 44 (0x2C) => 'g' (0x67) - 104, // input 45 (0x2D) => 'h' (0x68) - 105, // input 46 (0x2E) => 'i' (0x69) - 106, // input 47 (0x2F) => 'j' (0x6A) - 107, // input 48 (0x30) => 'k' (0x6B) - 108, // input 49 (0x31) => 'l' (0x6C) - 109, // input 50 (0x32) => 'm' (0x6D) - 110, // input 51 (0x33) => 'n' (0x6E) - 111, // input 52 (0x34) => 'o' (0x6F) - 112, // input 53 (0x35) => 'p' (0x70) - 113, // input 54 (0x36) => 'q' (0x71) - 114, // input 55 (0x37) => 'r' (0x72) - 115, // input 56 (0x38) => 's' (0x73) - 116, // input 57 (0x39) => 't' (0x74) - 117, // input 58 (0x3A) => 'u' (0x75) - 118, // input 59 (0x3B) => 'v' (0x76) - 119, // input 60 (0x3C) => 'w' (0x77) - 120, // input 61 (0x3D) => 'x' (0x78) - 121, // input 62 (0x3E) => 'y' (0x79) - 122, // input 63 (0x3F) => 'z' (0x7A) -]; -#[rustfmt::skip] -pub const CRYPT_DECODE: &[u8; 256] = &[ - INVALID_VALUE, // input 0 (0x0) - INVALID_VALUE, // input 1 (0x1) - INVALID_VALUE, // input 2 (0x2) - INVALID_VALUE, // input 3 (0x3) - INVALID_VALUE, // input 4 (0x4) - INVALID_VALUE, // input 5 (0x5) - INVALID_VALUE, // input 6 (0x6) - INVALID_VALUE, // input 7 (0x7) - INVALID_VALUE, // input 8 (0x8) - INVALID_VALUE, // input 9 (0x9) - INVALID_VALUE, // input 10 (0xA) - INVALID_VALUE, // input 11 (0xB) - INVALID_VALUE, // input 12 (0xC) - INVALID_VALUE, // input 13 (0xD) - INVALID_VALUE, // input 14 (0xE) - INVALID_VALUE, // input 15 (0xF) - INVALID_VALUE, // input 16 (0x10) - INVALID_VALUE, // input 17 (0x11) - INVALID_VALUE, // input 18 (0x12) - INVALID_VALUE, // input 19 (0x13) - INVALID_VALUE, // input 20 (0x14) - INVALID_VALUE, // input 21 (0x15) - INVALID_VALUE, // input 22 (0x16) - INVALID_VALUE, // input 23 (0x17) - INVALID_VALUE, // input 24 (0x18) - INVALID_VALUE, // input 25 (0x19) - INVALID_VALUE, // input 26 (0x1A) - INVALID_VALUE, // input 27 (0x1B) - INVALID_VALUE, // input 28 (0x1C) - INVALID_VALUE, // input 29 (0x1D) - INVALID_VALUE, // input 30 (0x1E) - INVALID_VALUE, // input 31 (0x1F) - INVALID_VALUE, // input 32 (0x20) - INVALID_VALUE, // input 33 (0x21) - INVALID_VALUE, // input 34 (0x22) - INVALID_VALUE, // input 35 (0x23) - INVALID_VALUE, // input 36 (0x24) - INVALID_VALUE, // input 37 (0x25) - INVALID_VALUE, // input 38 (0x26) - INVALID_VALUE, // input 39 (0x27) - INVALID_VALUE, // input 40 (0x28) - INVALID_VALUE, // input 41 (0x29) - INVALID_VALUE, // input 42 (0x2A) - INVALID_VALUE, // input 43 (0x2B) - INVALID_VALUE, // input 44 (0x2C) - INVALID_VALUE, // input 45 (0x2D) - 0, // input 46 (0x2E char '.') => 0 (0x0) - 1, // input 47 (0x2F char '/') => 1 (0x1) - 2, // input 48 (0x30 char '0') => 2 (0x2) - 3, // input 49 (0x31 char '1') => 3 (0x3) - 4, // input 50 (0x32 char '2') => 4 (0x4) - 5, // input 51 (0x33 char '3') => 5 (0x5) - 6, // input 52 (0x34 char '4') => 6 (0x6) - 7, // input 53 (0x35 char '5') => 7 (0x7) - 8, // input 54 (0x36 char '6') => 8 (0x8) - 9, // input 55 (0x37 char '7') => 9 (0x9) - 10, // input 56 (0x38 char '8') => 10 (0xA) - 11, // input 57 (0x39 char '9') => 11 (0xB) - INVALID_VALUE, // input 58 (0x3A) - INVALID_VALUE, // input 59 (0x3B) - INVALID_VALUE, // input 60 (0x3C) - INVALID_VALUE, // input 61 (0x3D) - INVALID_VALUE, // input 62 (0x3E) - INVALID_VALUE, // input 63 (0x3F) - INVALID_VALUE, // input 64 (0x40) - 12, // input 65 (0x41 char 'A') => 12 (0xC) - 13, // input 66 (0x42 char 'B') => 13 (0xD) - 14, // input 67 (0x43 char 'C') => 14 (0xE) - 15, // input 68 (0x44 char 'D') => 15 (0xF) - 16, // input 69 (0x45 char 'E') => 16 (0x10) - 17, // input 70 (0x46 char 'F') => 17 (0x11) - 18, // input 71 (0x47 char 'G') => 18 (0x12) - 19, // input 72 (0x48 char 'H') => 19 (0x13) - 20, // input 73 (0x49 char 'I') => 20 (0x14) - 21, // input 74 (0x4A char 'J') => 21 (0x15) - 22, // input 75 (0x4B char 'K') => 22 (0x16) - 23, // input 76 (0x4C char 'L') => 23 (0x17) - 24, // input 77 (0x4D char 'M') => 24 (0x18) - 25, // input 78 (0x4E char 'N') => 25 (0x19) - 26, // input 79 (0x4F char 'O') => 26 (0x1A) - 27, // input 80 (0x50 char 'P') => 27 (0x1B) - 28, // input 81 (0x51 char 'Q') => 28 (0x1C) - 29, // input 82 (0x52 char 'R') => 29 (0x1D) - 30, // input 83 (0x53 char 'S') => 30 (0x1E) - 31, // input 84 (0x54 char 'T') => 31 (0x1F) - 32, // input 85 (0x55 char 'U') => 32 (0x20) - 33, // input 86 (0x56 char 'V') => 33 (0x21) - 34, // input 87 (0x57 char 'W') => 34 (0x22) - 35, // input 88 (0x58 char 'X') => 35 (0x23) - 36, // input 89 (0x59 char 'Y') => 36 (0x24) - 37, // input 90 (0x5A char 'Z') => 37 (0x25) - INVALID_VALUE, // input 91 (0x5B) - INVALID_VALUE, // input 92 (0x5C) - INVALID_VALUE, // input 93 (0x5D) - INVALID_VALUE, // input 94 (0x5E) - INVALID_VALUE, // input 95 (0x5F) - INVALID_VALUE, // input 96 (0x60) - 38, // input 97 (0x61 char 'a') => 38 (0x26) - 39, // input 98 (0x62 char 'b') => 39 (0x27) - 40, // input 99 (0x63 char 'c') => 40 (0x28) - 41, // input 100 (0x64 char 'd') => 41 (0x29) - 42, // input 101 (0x65 char 'e') => 42 (0x2A) - 43, // input 102 (0x66 char 'f') => 43 (0x2B) - 44, // input 103 (0x67 char 'g') => 44 (0x2C) - 45, // input 104 (0x68 char 'h') => 45 (0x2D) - 46, // input 105 (0x69 char 'i') => 46 (0x2E) - 47, // input 106 (0x6A char 'j') => 47 (0x2F) - 48, // input 107 (0x6B char 'k') => 48 (0x30) - 49, // input 108 (0x6C char 'l') => 49 (0x31) - 50, // input 109 (0x6D char 'm') => 50 (0x32) - 51, // input 110 (0x6E char 'n') => 51 (0x33) - 52, // input 111 (0x6F char 'o') => 52 (0x34) - 53, // input 112 (0x70 char 'p') => 53 (0x35) - 54, // input 113 (0x71 char 'q') => 54 (0x36) - 55, // input 114 (0x72 char 'r') => 55 (0x37) - 56, // input 115 (0x73 char 's') => 56 (0x38) - 57, // input 116 (0x74 char 't') => 57 (0x39) - 58, // input 117 (0x75 char 'u') => 58 (0x3A) - 59, // input 118 (0x76 char 'v') => 59 (0x3B) - 60, // input 119 (0x77 char 'w') => 60 (0x3C) - 61, // input 120 (0x78 char 'x') => 61 (0x3D) - 62, // input 121 (0x79 char 'y') => 62 (0x3E) - 63, // input 122 (0x7A char 'z') => 63 (0x3F) - INVALID_VALUE, // input 123 (0x7B) - INVALID_VALUE, // input 124 (0x7C) - INVALID_VALUE, // input 125 (0x7D) - INVALID_VALUE, // input 126 (0x7E) - INVALID_VALUE, // input 127 (0x7F) - INVALID_VALUE, // input 128 (0x80) - INVALID_VALUE, // input 129 (0x81) - INVALID_VALUE, // input 130 (0x82) - INVALID_VALUE, // input 131 (0x83) - INVALID_VALUE, // input 132 (0x84) - INVALID_VALUE, // input 133 (0x85) - INVALID_VALUE, // input 134 (0x86) - INVALID_VALUE, // input 135 (0x87) - INVALID_VALUE, // input 136 (0x88) - INVALID_VALUE, // input 137 (0x89) - INVALID_VALUE, // input 138 (0x8A) - INVALID_VALUE, // input 139 (0x8B) - INVALID_VALUE, // input 140 (0x8C) - INVALID_VALUE, // input 141 (0x8D) - INVALID_VALUE, // input 142 (0x8E) - INVALID_VALUE, // input 143 (0x8F) - INVALID_VALUE, // input 144 (0x90) - INVALID_VALUE, // input 145 (0x91) - INVALID_VALUE, // input 146 (0x92) - INVALID_VALUE, // input 147 (0x93) - INVALID_VALUE, // input 148 (0x94) - INVALID_VALUE, // input 149 (0x95) - INVALID_VALUE, // input 150 (0x96) - INVALID_VALUE, // input 151 (0x97) - INVALID_VALUE, // input 152 (0x98) - INVALID_VALUE, // input 153 (0x99) - INVALID_VALUE, // input 154 (0x9A) - INVALID_VALUE, // input 155 (0x9B) - INVALID_VALUE, // input 156 (0x9C) - INVALID_VALUE, // input 157 (0x9D) - INVALID_VALUE, // input 158 (0x9E) - INVALID_VALUE, // input 159 (0x9F) - INVALID_VALUE, // input 160 (0xA0) - INVALID_VALUE, // input 161 (0xA1) - INVALID_VALUE, // input 162 (0xA2) - INVALID_VALUE, // input 163 (0xA3) - INVALID_VALUE, // input 164 (0xA4) - INVALID_VALUE, // input 165 (0xA5) - INVALID_VALUE, // input 166 (0xA6) - INVALID_VALUE, // input 167 (0xA7) - INVALID_VALUE, // input 168 (0xA8) - INVALID_VALUE, // input 169 (0xA9) - INVALID_VALUE, // input 170 (0xAA) - INVALID_VALUE, // input 171 (0xAB) - INVALID_VALUE, // input 172 (0xAC) - INVALID_VALUE, // input 173 (0xAD) - INVALID_VALUE, // input 174 (0xAE) - INVALID_VALUE, // input 175 (0xAF) - INVALID_VALUE, // input 176 (0xB0) - INVALID_VALUE, // input 177 (0xB1) - INVALID_VALUE, // input 178 (0xB2) - INVALID_VALUE, // input 179 (0xB3) - INVALID_VALUE, // input 180 (0xB4) - INVALID_VALUE, // input 181 (0xB5) - INVALID_VALUE, // input 182 (0xB6) - INVALID_VALUE, // input 183 (0xB7) - INVALID_VALUE, // input 184 (0xB8) - INVALID_VALUE, // input 185 (0xB9) - INVALID_VALUE, // input 186 (0xBA) - INVALID_VALUE, // input 187 (0xBB) - INVALID_VALUE, // input 188 (0xBC) - INVALID_VALUE, // input 189 (0xBD) - INVALID_VALUE, // input 190 (0xBE) - INVALID_VALUE, // input 191 (0xBF) - INVALID_VALUE, // input 192 (0xC0) - INVALID_VALUE, // input 193 (0xC1) - INVALID_VALUE, // input 194 (0xC2) - INVALID_VALUE, // input 195 (0xC3) - INVALID_VALUE, // input 196 (0xC4) - INVALID_VALUE, // input 197 (0xC5) - INVALID_VALUE, // input 198 (0xC6) - INVALID_VALUE, // input 199 (0xC7) - INVALID_VALUE, // input 200 (0xC8) - INVALID_VALUE, // input 201 (0xC9) - INVALID_VALUE, // input 202 (0xCA) - INVALID_VALUE, // input 203 (0xCB) - INVALID_VALUE, // input 204 (0xCC) - INVALID_VALUE, // input 205 (0xCD) - INVALID_VALUE, // input 206 (0xCE) - INVALID_VALUE, // input 207 (0xCF) - INVALID_VALUE, // input 208 (0xD0) - INVALID_VALUE, // input 209 (0xD1) - INVALID_VALUE, // input 210 (0xD2) - INVALID_VALUE, // input 211 (0xD3) - INVALID_VALUE, // input 212 (0xD4) - INVALID_VALUE, // input 213 (0xD5) - INVALID_VALUE, // input 214 (0xD6) - INVALID_VALUE, // input 215 (0xD7) - INVALID_VALUE, // input 216 (0xD8) - INVALID_VALUE, // input 217 (0xD9) - INVALID_VALUE, // input 218 (0xDA) - INVALID_VALUE, // input 219 (0xDB) - INVALID_VALUE, // input 220 (0xDC) - INVALID_VALUE, // input 221 (0xDD) - INVALID_VALUE, // input 222 (0xDE) - INVALID_VALUE, // input 223 (0xDF) - INVALID_VALUE, // input 224 (0xE0) - INVALID_VALUE, // input 225 (0xE1) - INVALID_VALUE, // input 226 (0xE2) - INVALID_VALUE, // input 227 (0xE3) - INVALID_VALUE, // input 228 (0xE4) - INVALID_VALUE, // input 229 (0xE5) - INVALID_VALUE, // input 230 (0xE6) - INVALID_VALUE, // input 231 (0xE7) - INVALID_VALUE, // input 232 (0xE8) - INVALID_VALUE, // input 233 (0xE9) - INVALID_VALUE, // input 234 (0xEA) - INVALID_VALUE, // input 235 (0xEB) - INVALID_VALUE, // input 236 (0xEC) - INVALID_VALUE, // input 237 (0xED) - INVALID_VALUE, // input 238 (0xEE) - INVALID_VALUE, // input 239 (0xEF) - INVALID_VALUE, // input 240 (0xF0) - INVALID_VALUE, // input 241 (0xF1) - INVALID_VALUE, // input 242 (0xF2) - INVALID_VALUE, // input 243 (0xF3) - INVALID_VALUE, // input 244 (0xF4) - INVALID_VALUE, // input 245 (0xF5) - INVALID_VALUE, // input 246 (0xF6) - INVALID_VALUE, // input 247 (0xF7) - INVALID_VALUE, // input 248 (0xF8) - INVALID_VALUE, // input 249 (0xF9) - INVALID_VALUE, // input 250 (0xFA) - INVALID_VALUE, // input 251 (0xFB) - INVALID_VALUE, // input 252 (0xFC) - INVALID_VALUE, // input 253 (0xFD) - INVALID_VALUE, // input 254 (0xFE) - INVALID_VALUE, // input 255 (0xFF) -]; -#[rustfmt::skip] -pub const BCRYPT_ENCODE: &[u8; 64] = &[ - 46, // input 0 (0x0) => '.' (0x2E) - 47, // input 1 (0x1) => '/' (0x2F) - 65, // input 2 (0x2) => 'A' (0x41) - 66, // input 3 (0x3) => 'B' (0x42) - 67, // input 4 (0x4) => 'C' (0x43) - 68, // input 5 (0x5) => 'D' (0x44) - 69, // input 6 (0x6) => 'E' (0x45) - 70, // input 7 (0x7) => 'F' (0x46) - 71, // input 8 (0x8) => 'G' (0x47) - 72, // input 9 (0x9) => 'H' (0x48) - 73, // input 10 (0xA) => 'I' (0x49) - 74, // input 11 (0xB) => 'J' (0x4A) - 75, // input 12 (0xC) => 'K' (0x4B) - 76, // input 13 (0xD) => 'L' (0x4C) - 77, // input 14 (0xE) => 'M' (0x4D) - 78, // input 15 (0xF) => 'N' (0x4E) - 79, // input 16 (0x10) => 'O' (0x4F) - 80, // input 17 (0x11) => 'P' (0x50) - 81, // input 18 (0x12) => 'Q' (0x51) - 82, // input 19 (0x13) => 'R' (0x52) - 83, // input 20 (0x14) => 'S' (0x53) - 84, // input 21 (0x15) => 'T' (0x54) - 85, // input 22 (0x16) => 'U' (0x55) - 86, // input 23 (0x17) => 'V' (0x56) - 87, // input 24 (0x18) => 'W' (0x57) - 88, // input 25 (0x19) => 'X' (0x58) - 89, // input 26 (0x1A) => 'Y' (0x59) - 90, // input 27 (0x1B) => 'Z' (0x5A) - 97, // input 28 (0x1C) => 'a' (0x61) - 98, // input 29 (0x1D) => 'b' (0x62) - 99, // input 30 (0x1E) => 'c' (0x63) - 100, // input 31 (0x1F) => 'd' (0x64) - 101, // input 32 (0x20) => 'e' (0x65) - 102, // input 33 (0x21) => 'f' (0x66) - 103, // input 34 (0x22) => 'g' (0x67) - 104, // input 35 (0x23) => 'h' (0x68) - 105, // input 36 (0x24) => 'i' (0x69) - 106, // input 37 (0x25) => 'j' (0x6A) - 107, // input 38 (0x26) => 'k' (0x6B) - 108, // input 39 (0x27) => 'l' (0x6C) - 109, // input 40 (0x28) => 'm' (0x6D) - 110, // input 41 (0x29) => 'n' (0x6E) - 111, // input 42 (0x2A) => 'o' (0x6F) - 112, // input 43 (0x2B) => 'p' (0x70) - 113, // input 44 (0x2C) => 'q' (0x71) - 114, // input 45 (0x2D) => 'r' (0x72) - 115, // input 46 (0x2E) => 's' (0x73) - 116, // input 47 (0x2F) => 't' (0x74) - 117, // input 48 (0x30) => 'u' (0x75) - 118, // input 49 (0x31) => 'v' (0x76) - 119, // input 50 (0x32) => 'w' (0x77) - 120, // input 51 (0x33) => 'x' (0x78) - 121, // input 52 (0x34) => 'y' (0x79) - 122, // input 53 (0x35) => 'z' (0x7A) - 48, // input 54 (0x36) => '0' (0x30) - 49, // input 55 (0x37) => '1' (0x31) - 50, // input 56 (0x38) => '2' (0x32) - 51, // input 57 (0x39) => '3' (0x33) - 52, // input 58 (0x3A) => '4' (0x34) - 53, // input 59 (0x3B) => '5' (0x35) - 54, // input 60 (0x3C) => '6' (0x36) - 55, // input 61 (0x3D) => '7' (0x37) - 56, // input 62 (0x3E) => '8' (0x38) - 57, // input 63 (0x3F) => '9' (0x39) -]; -#[rustfmt::skip] -pub const BCRYPT_DECODE: &[u8; 256] = &[ - INVALID_VALUE, // input 0 (0x0) - INVALID_VALUE, // input 1 (0x1) - INVALID_VALUE, // input 2 (0x2) - INVALID_VALUE, // input 3 (0x3) - INVALID_VALUE, // input 4 (0x4) - INVALID_VALUE, // input 5 (0x5) - INVALID_VALUE, // input 6 (0x6) - INVALID_VALUE, // input 7 (0x7) - INVALID_VALUE, // input 8 (0x8) - INVALID_VALUE, // input 9 (0x9) - INVALID_VALUE, // input 10 (0xA) - INVALID_VALUE, // input 11 (0xB) - INVALID_VALUE, // input 12 (0xC) - INVALID_VALUE, // input 13 (0xD) - INVALID_VALUE, // input 14 (0xE) - INVALID_VALUE, // input 15 (0xF) - INVALID_VALUE, // input 16 (0x10) - INVALID_VALUE, // input 17 (0x11) - INVALID_VALUE, // input 18 (0x12) - INVALID_VALUE, // input 19 (0x13) - INVALID_VALUE, // input 20 (0x14) - INVALID_VALUE, // input 21 (0x15) - INVALID_VALUE, // input 22 (0x16) - INVALID_VALUE, // input 23 (0x17) - INVALID_VALUE, // input 24 (0x18) - INVALID_VALUE, // input 25 (0x19) - INVALID_VALUE, // input 26 (0x1A) - INVALID_VALUE, // input 27 (0x1B) - INVALID_VALUE, // input 28 (0x1C) - INVALID_VALUE, // input 29 (0x1D) - INVALID_VALUE, // input 30 (0x1E) - INVALID_VALUE, // input 31 (0x1F) - INVALID_VALUE, // input 32 (0x20) - INVALID_VALUE, // input 33 (0x21) - INVALID_VALUE, // input 34 (0x22) - INVALID_VALUE, // input 35 (0x23) - INVALID_VALUE, // input 36 (0x24) - INVALID_VALUE, // input 37 (0x25) - INVALID_VALUE, // input 38 (0x26) - INVALID_VALUE, // input 39 (0x27) - INVALID_VALUE, // input 40 (0x28) - INVALID_VALUE, // input 41 (0x29) - INVALID_VALUE, // input 42 (0x2A) - INVALID_VALUE, // input 43 (0x2B) - INVALID_VALUE, // input 44 (0x2C) - INVALID_VALUE, // input 45 (0x2D) - 0, // input 46 (0x2E char '.') => 0 (0x0) - 1, // input 47 (0x2F char '/') => 1 (0x1) - 54, // input 48 (0x30 char '0') => 54 (0x36) - 55, // input 49 (0x31 char '1') => 55 (0x37) - 56, // input 50 (0x32 char '2') => 56 (0x38) - 57, // input 51 (0x33 char '3') => 57 (0x39) - 58, // input 52 (0x34 char '4') => 58 (0x3A) - 59, // input 53 (0x35 char '5') => 59 (0x3B) - 60, // input 54 (0x36 char '6') => 60 (0x3C) - 61, // input 55 (0x37 char '7') => 61 (0x3D) - 62, // input 56 (0x38 char '8') => 62 (0x3E) - 63, // input 57 (0x39 char '9') => 63 (0x3F) - INVALID_VALUE, // input 58 (0x3A) - INVALID_VALUE, // input 59 (0x3B) - INVALID_VALUE, // input 60 (0x3C) - INVALID_VALUE, // input 61 (0x3D) - INVALID_VALUE, // input 62 (0x3E) - INVALID_VALUE, // input 63 (0x3F) - INVALID_VALUE, // input 64 (0x40) - 2, // input 65 (0x41 char 'A') => 2 (0x2) - 3, // input 66 (0x42 char 'B') => 3 (0x3) - 4, // input 67 (0x43 char 'C') => 4 (0x4) - 5, // input 68 (0x44 char 'D') => 5 (0x5) - 6, // input 69 (0x45 char 'E') => 6 (0x6) - 7, // input 70 (0x46 char 'F') => 7 (0x7) - 8, // input 71 (0x47 char 'G') => 8 (0x8) - 9, // input 72 (0x48 char 'H') => 9 (0x9) - 10, // input 73 (0x49 char 'I') => 10 (0xA) - 11, // input 74 (0x4A char 'J') => 11 (0xB) - 12, // input 75 (0x4B char 'K') => 12 (0xC) - 13, // input 76 (0x4C char 'L') => 13 (0xD) - 14, // input 77 (0x4D char 'M') => 14 (0xE) - 15, // input 78 (0x4E char 'N') => 15 (0xF) - 16, // input 79 (0x4F char 'O') => 16 (0x10) - 17, // input 80 (0x50 char 'P') => 17 (0x11) - 18, // input 81 (0x51 char 'Q') => 18 (0x12) - 19, // input 82 (0x52 char 'R') => 19 (0x13) - 20, // input 83 (0x53 char 'S') => 20 (0x14) - 21, // input 84 (0x54 char 'T') => 21 (0x15) - 22, // input 85 (0x55 char 'U') => 22 (0x16) - 23, // input 86 (0x56 char 'V') => 23 (0x17) - 24, // input 87 (0x57 char 'W') => 24 (0x18) - 25, // input 88 (0x58 char 'X') => 25 (0x19) - 26, // input 89 (0x59 char 'Y') => 26 (0x1A) - 27, // input 90 (0x5A char 'Z') => 27 (0x1B) - INVALID_VALUE, // input 91 (0x5B) - INVALID_VALUE, // input 92 (0x5C) - INVALID_VALUE, // input 93 (0x5D) - INVALID_VALUE, // input 94 (0x5E) - INVALID_VALUE, // input 95 (0x5F) - INVALID_VALUE, // input 96 (0x60) - 28, // input 97 (0x61 char 'a') => 28 (0x1C) - 29, // input 98 (0x62 char 'b') => 29 (0x1D) - 30, // input 99 (0x63 char 'c') => 30 (0x1E) - 31, // input 100 (0x64 char 'd') => 31 (0x1F) - 32, // input 101 (0x65 char 'e') => 32 (0x20) - 33, // input 102 (0x66 char 'f') => 33 (0x21) - 34, // input 103 (0x67 char 'g') => 34 (0x22) - 35, // input 104 (0x68 char 'h') => 35 (0x23) - 36, // input 105 (0x69 char 'i') => 36 (0x24) - 37, // input 106 (0x6A char 'j') => 37 (0x25) - 38, // input 107 (0x6B char 'k') => 38 (0x26) - 39, // input 108 (0x6C char 'l') => 39 (0x27) - 40, // input 109 (0x6D char 'm') => 40 (0x28) - 41, // input 110 (0x6E char 'n') => 41 (0x29) - 42, // input 111 (0x6F char 'o') => 42 (0x2A) - 43, // input 112 (0x70 char 'p') => 43 (0x2B) - 44, // input 113 (0x71 char 'q') => 44 (0x2C) - 45, // input 114 (0x72 char 'r') => 45 (0x2D) - 46, // input 115 (0x73 char 's') => 46 (0x2E) - 47, // input 116 (0x74 char 't') => 47 (0x2F) - 48, // input 117 (0x75 char 'u') => 48 (0x30) - 49, // input 118 (0x76 char 'v') => 49 (0x31) - 50, // input 119 (0x77 char 'w') => 50 (0x32) - 51, // input 120 (0x78 char 'x') => 51 (0x33) - 52, // input 121 (0x79 char 'y') => 52 (0x34) - 53, // input 122 (0x7A char 'z') => 53 (0x35) - INVALID_VALUE, // input 123 (0x7B) - INVALID_VALUE, // input 124 (0x7C) - INVALID_VALUE, // input 125 (0x7D) - INVALID_VALUE, // input 126 (0x7E) - INVALID_VALUE, // input 127 (0x7F) - INVALID_VALUE, // input 128 (0x80) - INVALID_VALUE, // input 129 (0x81) - INVALID_VALUE, // input 130 (0x82) - INVALID_VALUE, // input 131 (0x83) - INVALID_VALUE, // input 132 (0x84) - INVALID_VALUE, // input 133 (0x85) - INVALID_VALUE, // input 134 (0x86) - INVALID_VALUE, // input 135 (0x87) - INVALID_VALUE, // input 136 (0x88) - INVALID_VALUE, // input 137 (0x89) - INVALID_VALUE, // input 138 (0x8A) - INVALID_VALUE, // input 139 (0x8B) - INVALID_VALUE, // input 140 (0x8C) - INVALID_VALUE, // input 141 (0x8D) - INVALID_VALUE, // input 142 (0x8E) - INVALID_VALUE, // input 143 (0x8F) - INVALID_VALUE, // input 144 (0x90) - INVALID_VALUE, // input 145 (0x91) - INVALID_VALUE, // input 146 (0x92) - INVALID_VALUE, // input 147 (0x93) - INVALID_VALUE, // input 148 (0x94) - INVALID_VALUE, // input 149 (0x95) - INVALID_VALUE, // input 150 (0x96) - INVALID_VALUE, // input 151 (0x97) - INVALID_VALUE, // input 152 (0x98) - INVALID_VALUE, // input 153 (0x99) - INVALID_VALUE, // input 154 (0x9A) - INVALID_VALUE, // input 155 (0x9B) - INVALID_VALUE, // input 156 (0x9C) - INVALID_VALUE, // input 157 (0x9D) - INVALID_VALUE, // input 158 (0x9E) - INVALID_VALUE, // input 159 (0x9F) - INVALID_VALUE, // input 160 (0xA0) - INVALID_VALUE, // input 161 (0xA1) - INVALID_VALUE, // input 162 (0xA2) - INVALID_VALUE, // input 163 (0xA3) - INVALID_VALUE, // input 164 (0xA4) - INVALID_VALUE, // input 165 (0xA5) - INVALID_VALUE, // input 166 (0xA6) - INVALID_VALUE, // input 167 (0xA7) - INVALID_VALUE, // input 168 (0xA8) - INVALID_VALUE, // input 169 (0xA9) - INVALID_VALUE, // input 170 (0xAA) - INVALID_VALUE, // input 171 (0xAB) - INVALID_VALUE, // input 172 (0xAC) - INVALID_VALUE, // input 173 (0xAD) - INVALID_VALUE, // input 174 (0xAE) - INVALID_VALUE, // input 175 (0xAF) - INVALID_VALUE, // input 176 (0xB0) - INVALID_VALUE, // input 177 (0xB1) - INVALID_VALUE, // input 178 (0xB2) - INVALID_VALUE, // input 179 (0xB3) - INVALID_VALUE, // input 180 (0xB4) - INVALID_VALUE, // input 181 (0xB5) - INVALID_VALUE, // input 182 (0xB6) - INVALID_VALUE, // input 183 (0xB7) - INVALID_VALUE, // input 184 (0xB8) - INVALID_VALUE, // input 185 (0xB9) - INVALID_VALUE, // input 186 (0xBA) - INVALID_VALUE, // input 187 (0xBB) - INVALID_VALUE, // input 188 (0xBC) - INVALID_VALUE, // input 189 (0xBD) - INVALID_VALUE, // input 190 (0xBE) - INVALID_VALUE, // input 191 (0xBF) - INVALID_VALUE, // input 192 (0xC0) - INVALID_VALUE, // input 193 (0xC1) - INVALID_VALUE, // input 194 (0xC2) - INVALID_VALUE, // input 195 (0xC3) - INVALID_VALUE, // input 196 (0xC4) - INVALID_VALUE, // input 197 (0xC5) - INVALID_VALUE, // input 198 (0xC6) - INVALID_VALUE, // input 199 (0xC7) - INVALID_VALUE, // input 200 (0xC8) - INVALID_VALUE, // input 201 (0xC9) - INVALID_VALUE, // input 202 (0xCA) - INVALID_VALUE, // input 203 (0xCB) - INVALID_VALUE, // input 204 (0xCC) - INVALID_VALUE, // input 205 (0xCD) - INVALID_VALUE, // input 206 (0xCE) - INVALID_VALUE, // input 207 (0xCF) - INVALID_VALUE, // input 208 (0xD0) - INVALID_VALUE, // input 209 (0xD1) - INVALID_VALUE, // input 210 (0xD2) - INVALID_VALUE, // input 211 (0xD3) - INVALID_VALUE, // input 212 (0xD4) - INVALID_VALUE, // input 213 (0xD5) - INVALID_VALUE, // input 214 (0xD6) - INVALID_VALUE, // input 215 (0xD7) - INVALID_VALUE, // input 216 (0xD8) - INVALID_VALUE, // input 217 (0xD9) - INVALID_VALUE, // input 218 (0xDA) - INVALID_VALUE, // input 219 (0xDB) - INVALID_VALUE, // input 220 (0xDC) - INVALID_VALUE, // input 221 (0xDD) - INVALID_VALUE, // input 222 (0xDE) - INVALID_VALUE, // input 223 (0xDF) - INVALID_VALUE, // input 224 (0xE0) - INVALID_VALUE, // input 225 (0xE1) - INVALID_VALUE, // input 226 (0xE2) - INVALID_VALUE, // input 227 (0xE3) - INVALID_VALUE, // input 228 (0xE4) - INVALID_VALUE, // input 229 (0xE5) - INVALID_VALUE, // input 230 (0xE6) - INVALID_VALUE, // input 231 (0xE7) - INVALID_VALUE, // input 232 (0xE8) - INVALID_VALUE, // input 233 (0xE9) - INVALID_VALUE, // input 234 (0xEA) - INVALID_VALUE, // input 235 (0xEB) - INVALID_VALUE, // input 236 (0xEC) - INVALID_VALUE, // input 237 (0xED) - INVALID_VALUE, // input 238 (0xEE) - INVALID_VALUE, // input 239 (0xEF) - INVALID_VALUE, // input 240 (0xF0) - INVALID_VALUE, // input 241 (0xF1) - INVALID_VALUE, // input 242 (0xF2) - INVALID_VALUE, // input 243 (0xF3) - INVALID_VALUE, // input 244 (0xF4) - INVALID_VALUE, // input 245 (0xF5) - INVALID_VALUE, // input 246 (0xF6) - INVALID_VALUE, // input 247 (0xF7) - INVALID_VALUE, // input 248 (0xF8) - INVALID_VALUE, // input 249 (0xF9) - INVALID_VALUE, // input 250 (0xFA) - INVALID_VALUE, // input 251 (0xFB) - INVALID_VALUE, // input 252 (0xFC) - INVALID_VALUE, // input 253 (0xFD) - INVALID_VALUE, // input 254 (0xFE) - INVALID_VALUE, // input 255 (0xFF) -]; -#[rustfmt::skip] -pub const IMAP_MUTF7_ENCODE: &[u8; 64] = &[ - 65, // input 0 (0x0) => 'A' (0x41) - 66, // input 1 (0x1) => 'B' (0x42) - 67, // input 2 (0x2) => 'C' (0x43) - 68, // input 3 (0x3) => 'D' (0x44) - 69, // input 4 (0x4) => 'E' (0x45) - 70, // input 5 (0x5) => 'F' (0x46) - 71, // input 6 (0x6) => 'G' (0x47) - 72, // input 7 (0x7) => 'H' (0x48) - 73, // input 8 (0x8) => 'I' (0x49) - 74, // input 9 (0x9) => 'J' (0x4A) - 75, // input 10 (0xA) => 'K' (0x4B) - 76, // input 11 (0xB) => 'L' (0x4C) - 77, // input 12 (0xC) => 'M' (0x4D) - 78, // input 13 (0xD) => 'N' (0x4E) - 79, // input 14 (0xE) => 'O' (0x4F) - 80, // input 15 (0xF) => 'P' (0x50) - 81, // input 16 (0x10) => 'Q' (0x51) - 82, // input 17 (0x11) => 'R' (0x52) - 83, // input 18 (0x12) => 'S' (0x53) - 84, // input 19 (0x13) => 'T' (0x54) - 85, // input 20 (0x14) => 'U' (0x55) - 86, // input 21 (0x15) => 'V' (0x56) - 87, // input 22 (0x16) => 'W' (0x57) - 88, // input 23 (0x17) => 'X' (0x58) - 89, // input 24 (0x18) => 'Y' (0x59) - 90, // input 25 (0x19) => 'Z' (0x5A) - 97, // input 26 (0x1A) => 'a' (0x61) - 98, // input 27 (0x1B) => 'b' (0x62) - 99, // input 28 (0x1C) => 'c' (0x63) - 100, // input 29 (0x1D) => 'd' (0x64) - 101, // input 30 (0x1E) => 'e' (0x65) - 102, // input 31 (0x1F) => 'f' (0x66) - 103, // input 32 (0x20) => 'g' (0x67) - 104, // input 33 (0x21) => 'h' (0x68) - 105, // input 34 (0x22) => 'i' (0x69) - 106, // input 35 (0x23) => 'j' (0x6A) - 107, // input 36 (0x24) => 'k' (0x6B) - 108, // input 37 (0x25) => 'l' (0x6C) - 109, // input 38 (0x26) => 'm' (0x6D) - 110, // input 39 (0x27) => 'n' (0x6E) - 111, // input 40 (0x28) => 'o' (0x6F) - 112, // input 41 (0x29) => 'p' (0x70) - 113, // input 42 (0x2A) => 'q' (0x71) - 114, // input 43 (0x2B) => 'r' (0x72) - 115, // input 44 (0x2C) => 's' (0x73) - 116, // input 45 (0x2D) => 't' (0x74) - 117, // input 46 (0x2E) => 'u' (0x75) - 118, // input 47 (0x2F) => 'v' (0x76) - 119, // input 48 (0x30) => 'w' (0x77) - 120, // input 49 (0x31) => 'x' (0x78) - 121, // input 50 (0x32) => 'y' (0x79) - 122, // input 51 (0x33) => 'z' (0x7A) - 48, // input 52 (0x34) => '0' (0x30) - 49, // input 53 (0x35) => '1' (0x31) - 50, // input 54 (0x36) => '2' (0x32) - 51, // input 55 (0x37) => '3' (0x33) - 52, // input 56 (0x38) => '4' (0x34) - 53, // input 57 (0x39) => '5' (0x35) - 54, // input 58 (0x3A) => '6' (0x36) - 55, // input 59 (0x3B) => '7' (0x37) - 56, // input 60 (0x3C) => '8' (0x38) - 57, // input 61 (0x3D) => '9' (0x39) - 43, // input 62 (0x3E) => '+' (0x2B) - 44, // input 63 (0x3F) => ',' (0x2C) -]; -#[rustfmt::skip] -pub const IMAP_MUTF7_DECODE: &[u8; 256] = &[ - INVALID_VALUE, // input 0 (0x0) - INVALID_VALUE, // input 1 (0x1) - INVALID_VALUE, // input 2 (0x2) - INVALID_VALUE, // input 3 (0x3) - INVALID_VALUE, // input 4 (0x4) - INVALID_VALUE, // input 5 (0x5) - INVALID_VALUE, // input 6 (0x6) - INVALID_VALUE, // input 7 (0x7) - INVALID_VALUE, // input 8 (0x8) - INVALID_VALUE, // input 9 (0x9) - INVALID_VALUE, // input 10 (0xA) - INVALID_VALUE, // input 11 (0xB) - INVALID_VALUE, // input 12 (0xC) - INVALID_VALUE, // input 13 (0xD) - INVALID_VALUE, // input 14 (0xE) - INVALID_VALUE, // input 15 (0xF) - INVALID_VALUE, // input 16 (0x10) - INVALID_VALUE, // input 17 (0x11) - INVALID_VALUE, // input 18 (0x12) - INVALID_VALUE, // input 19 (0x13) - INVALID_VALUE, // input 20 (0x14) - INVALID_VALUE, // input 21 (0x15) - INVALID_VALUE, // input 22 (0x16) - INVALID_VALUE, // input 23 (0x17) - INVALID_VALUE, // input 24 (0x18) - INVALID_VALUE, // input 25 (0x19) - INVALID_VALUE, // input 26 (0x1A) - INVALID_VALUE, // input 27 (0x1B) - INVALID_VALUE, // input 28 (0x1C) - INVALID_VALUE, // input 29 (0x1D) - INVALID_VALUE, // input 30 (0x1E) - INVALID_VALUE, // input 31 (0x1F) - INVALID_VALUE, // input 32 (0x20) - INVALID_VALUE, // input 33 (0x21) - INVALID_VALUE, // input 34 (0x22) - INVALID_VALUE, // input 35 (0x23) - INVALID_VALUE, // input 36 (0x24) - INVALID_VALUE, // input 37 (0x25) - INVALID_VALUE, // input 38 (0x26) - INVALID_VALUE, // input 39 (0x27) - INVALID_VALUE, // input 40 (0x28) - INVALID_VALUE, // input 41 (0x29) - INVALID_VALUE, // input 42 (0x2A) - 62, // input 43 (0x2B char '+') => 62 (0x3E) - 63, // input 44 (0x2C char ',') => 63 (0x3F) - INVALID_VALUE, // input 45 (0x2D) - INVALID_VALUE, // input 46 (0x2E) - INVALID_VALUE, // input 47 (0x2F) - 52, // input 48 (0x30 char '0') => 52 (0x34) - 53, // input 49 (0x31 char '1') => 53 (0x35) - 54, // input 50 (0x32 char '2') => 54 (0x36) - 55, // input 51 (0x33 char '3') => 55 (0x37) - 56, // input 52 (0x34 char '4') => 56 (0x38) - 57, // input 53 (0x35 char '5') => 57 (0x39) - 58, // input 54 (0x36 char '6') => 58 (0x3A) - 59, // input 55 (0x37 char '7') => 59 (0x3B) - 60, // input 56 (0x38 char '8') => 60 (0x3C) - 61, // input 57 (0x39 char '9') => 61 (0x3D) - INVALID_VALUE, // input 58 (0x3A) - INVALID_VALUE, // input 59 (0x3B) - INVALID_VALUE, // input 60 (0x3C) - INVALID_VALUE, // input 61 (0x3D) - INVALID_VALUE, // input 62 (0x3E) - INVALID_VALUE, // input 63 (0x3F) - INVALID_VALUE, // input 64 (0x40) - 0, // input 65 (0x41 char 'A') => 0 (0x0) - 1, // input 66 (0x42 char 'B') => 1 (0x1) - 2, // input 67 (0x43 char 'C') => 2 (0x2) - 3, // input 68 (0x44 char 'D') => 3 (0x3) - 4, // input 69 (0x45 char 'E') => 4 (0x4) - 5, // input 70 (0x46 char 'F') => 5 (0x5) - 6, // input 71 (0x47 char 'G') => 6 (0x6) - 7, // input 72 (0x48 char 'H') => 7 (0x7) - 8, // input 73 (0x49 char 'I') => 8 (0x8) - 9, // input 74 (0x4A char 'J') => 9 (0x9) - 10, // input 75 (0x4B char 'K') => 10 (0xA) - 11, // input 76 (0x4C char 'L') => 11 (0xB) - 12, // input 77 (0x4D char 'M') => 12 (0xC) - 13, // input 78 (0x4E char 'N') => 13 (0xD) - 14, // input 79 (0x4F char 'O') => 14 (0xE) - 15, // input 80 (0x50 char 'P') => 15 (0xF) - 16, // input 81 (0x51 char 'Q') => 16 (0x10) - 17, // input 82 (0x52 char 'R') => 17 (0x11) - 18, // input 83 (0x53 char 'S') => 18 (0x12) - 19, // input 84 (0x54 char 'T') => 19 (0x13) - 20, // input 85 (0x55 char 'U') => 20 (0x14) - 21, // input 86 (0x56 char 'V') => 21 (0x15) - 22, // input 87 (0x57 char 'W') => 22 (0x16) - 23, // input 88 (0x58 char 'X') => 23 (0x17) - 24, // input 89 (0x59 char 'Y') => 24 (0x18) - 25, // input 90 (0x5A char 'Z') => 25 (0x19) - INVALID_VALUE, // input 91 (0x5B) - INVALID_VALUE, // input 92 (0x5C) - INVALID_VALUE, // input 93 (0x5D) - INVALID_VALUE, // input 94 (0x5E) - INVALID_VALUE, // input 95 (0x5F) - INVALID_VALUE, // input 96 (0x60) - 26, // input 97 (0x61 char 'a') => 26 (0x1A) - 27, // input 98 (0x62 char 'b') => 27 (0x1B) - 28, // input 99 (0x63 char 'c') => 28 (0x1C) - 29, // input 100 (0x64 char 'd') => 29 (0x1D) - 30, // input 101 (0x65 char 'e') => 30 (0x1E) - 31, // input 102 (0x66 char 'f') => 31 (0x1F) - 32, // input 103 (0x67 char 'g') => 32 (0x20) - 33, // input 104 (0x68 char 'h') => 33 (0x21) - 34, // input 105 (0x69 char 'i') => 34 (0x22) - 35, // input 106 (0x6A char 'j') => 35 (0x23) - 36, // input 107 (0x6B char 'k') => 36 (0x24) - 37, // input 108 (0x6C char 'l') => 37 (0x25) - 38, // input 109 (0x6D char 'm') => 38 (0x26) - 39, // input 110 (0x6E char 'n') => 39 (0x27) - 40, // input 111 (0x6F char 'o') => 40 (0x28) - 41, // input 112 (0x70 char 'p') => 41 (0x29) - 42, // input 113 (0x71 char 'q') => 42 (0x2A) - 43, // input 114 (0x72 char 'r') => 43 (0x2B) - 44, // input 115 (0x73 char 's') => 44 (0x2C) - 45, // input 116 (0x74 char 't') => 45 (0x2D) - 46, // input 117 (0x75 char 'u') => 46 (0x2E) - 47, // input 118 (0x76 char 'v') => 47 (0x2F) - 48, // input 119 (0x77 char 'w') => 48 (0x30) - 49, // input 120 (0x78 char 'x') => 49 (0x31) - 50, // input 121 (0x79 char 'y') => 50 (0x32) - 51, // input 122 (0x7A char 'z') => 51 (0x33) - INVALID_VALUE, // input 123 (0x7B) - INVALID_VALUE, // input 124 (0x7C) - INVALID_VALUE, // input 125 (0x7D) - INVALID_VALUE, // input 126 (0x7E) - INVALID_VALUE, // input 127 (0x7F) - INVALID_VALUE, // input 128 (0x80) - INVALID_VALUE, // input 129 (0x81) - INVALID_VALUE, // input 130 (0x82) - INVALID_VALUE, // input 131 (0x83) - INVALID_VALUE, // input 132 (0x84) - INVALID_VALUE, // input 133 (0x85) - INVALID_VALUE, // input 134 (0x86) - INVALID_VALUE, // input 135 (0x87) - INVALID_VALUE, // input 136 (0x88) - INVALID_VALUE, // input 137 (0x89) - INVALID_VALUE, // input 138 (0x8A) - INVALID_VALUE, // input 139 (0x8B) - INVALID_VALUE, // input 140 (0x8C) - INVALID_VALUE, // input 141 (0x8D) - INVALID_VALUE, // input 142 (0x8E) - INVALID_VALUE, // input 143 (0x8F) - INVALID_VALUE, // input 144 (0x90) - INVALID_VALUE, // input 145 (0x91) - INVALID_VALUE, // input 146 (0x92) - INVALID_VALUE, // input 147 (0x93) - INVALID_VALUE, // input 148 (0x94) - INVALID_VALUE, // input 149 (0x95) - INVALID_VALUE, // input 150 (0x96) - INVALID_VALUE, // input 151 (0x97) - INVALID_VALUE, // input 152 (0x98) - INVALID_VALUE, // input 153 (0x99) - INVALID_VALUE, // input 154 (0x9A) - INVALID_VALUE, // input 155 (0x9B) - INVALID_VALUE, // input 156 (0x9C) - INVALID_VALUE, // input 157 (0x9D) - INVALID_VALUE, // input 158 (0x9E) - INVALID_VALUE, // input 159 (0x9F) - INVALID_VALUE, // input 160 (0xA0) - INVALID_VALUE, // input 161 (0xA1) - INVALID_VALUE, // input 162 (0xA2) - INVALID_VALUE, // input 163 (0xA3) - INVALID_VALUE, // input 164 (0xA4) - INVALID_VALUE, // input 165 (0xA5) - INVALID_VALUE, // input 166 (0xA6) - INVALID_VALUE, // input 167 (0xA7) - INVALID_VALUE, // input 168 (0xA8) - INVALID_VALUE, // input 169 (0xA9) - INVALID_VALUE, // input 170 (0xAA) - INVALID_VALUE, // input 171 (0xAB) - INVALID_VALUE, // input 172 (0xAC) - INVALID_VALUE, // input 173 (0xAD) - INVALID_VALUE, // input 174 (0xAE) - INVALID_VALUE, // input 175 (0xAF) - INVALID_VALUE, // input 176 (0xB0) - INVALID_VALUE, // input 177 (0xB1) - INVALID_VALUE, // input 178 (0xB2) - INVALID_VALUE, // input 179 (0xB3) - INVALID_VALUE, // input 180 (0xB4) - INVALID_VALUE, // input 181 (0xB5) - INVALID_VALUE, // input 182 (0xB6) - INVALID_VALUE, // input 183 (0xB7) - INVALID_VALUE, // input 184 (0xB8) - INVALID_VALUE, // input 185 (0xB9) - INVALID_VALUE, // input 186 (0xBA) - INVALID_VALUE, // input 187 (0xBB) - INVALID_VALUE, // input 188 (0xBC) - INVALID_VALUE, // input 189 (0xBD) - INVALID_VALUE, // input 190 (0xBE) - INVALID_VALUE, // input 191 (0xBF) - INVALID_VALUE, // input 192 (0xC0) - INVALID_VALUE, // input 193 (0xC1) - INVALID_VALUE, // input 194 (0xC2) - INVALID_VALUE, // input 195 (0xC3) - INVALID_VALUE, // input 196 (0xC4) - INVALID_VALUE, // input 197 (0xC5) - INVALID_VALUE, // input 198 (0xC6) - INVALID_VALUE, // input 199 (0xC7) - INVALID_VALUE, // input 200 (0xC8) - INVALID_VALUE, // input 201 (0xC9) - INVALID_VALUE, // input 202 (0xCA) - INVALID_VALUE, // input 203 (0xCB) - INVALID_VALUE, // input 204 (0xCC) - INVALID_VALUE, // input 205 (0xCD) - INVALID_VALUE, // input 206 (0xCE) - INVALID_VALUE, // input 207 (0xCF) - INVALID_VALUE, // input 208 (0xD0) - INVALID_VALUE, // input 209 (0xD1) - INVALID_VALUE, // input 210 (0xD2) - INVALID_VALUE, // input 211 (0xD3) - INVALID_VALUE, // input 212 (0xD4) - INVALID_VALUE, // input 213 (0xD5) - INVALID_VALUE, // input 214 (0xD6) - INVALID_VALUE, // input 215 (0xD7) - INVALID_VALUE, // input 216 (0xD8) - INVALID_VALUE, // input 217 (0xD9) - INVALID_VALUE, // input 218 (0xDA) - INVALID_VALUE, // input 219 (0xDB) - INVALID_VALUE, // input 220 (0xDC) - INVALID_VALUE, // input 221 (0xDD) - INVALID_VALUE, // input 222 (0xDE) - INVALID_VALUE, // input 223 (0xDF) - INVALID_VALUE, // input 224 (0xE0) - INVALID_VALUE, // input 225 (0xE1) - INVALID_VALUE, // input 226 (0xE2) - INVALID_VALUE, // input 227 (0xE3) - INVALID_VALUE, // input 228 (0xE4) - INVALID_VALUE, // input 229 (0xE5) - INVALID_VALUE, // input 230 (0xE6) - INVALID_VALUE, // input 231 (0xE7) - INVALID_VALUE, // input 232 (0xE8) - INVALID_VALUE, // input 233 (0xE9) - INVALID_VALUE, // input 234 (0xEA) - INVALID_VALUE, // input 235 (0xEB) - INVALID_VALUE, // input 236 (0xEC) - INVALID_VALUE, // input 237 (0xED) - INVALID_VALUE, // input 238 (0xEE) - INVALID_VALUE, // input 239 (0xEF) - INVALID_VALUE, // input 240 (0xF0) - INVALID_VALUE, // input 241 (0xF1) - INVALID_VALUE, // input 242 (0xF2) - INVALID_VALUE, // input 243 (0xF3) - INVALID_VALUE, // input 244 (0xF4) - INVALID_VALUE, // input 245 (0xF5) - INVALID_VALUE, // input 246 (0xF6) - INVALID_VALUE, // input 247 (0xF7) - INVALID_VALUE, // input 248 (0xF8) - INVALID_VALUE, // input 249 (0xF9) - INVALID_VALUE, // input 250 (0xFA) - INVALID_VALUE, // input 251 (0xFB) - INVALID_VALUE, // input 252 (0xFC) - INVALID_VALUE, // input 253 (0xFD) - INVALID_VALUE, // input 254 (0xFE) - INVALID_VALUE, // input 255 (0xFF) -]; -#[rustfmt::skip] -pub const BINHEX_ENCODE: &[u8; 64] = &[ - 33, // input 0 (0x0) => '!' (0x21) - 34, // input 1 (0x1) => '"' (0x22) - 35, // input 2 (0x2) => '#' (0x23) - 36, // input 3 (0x3) => '$' (0x24) - 37, // input 4 (0x4) => '%' (0x25) - 38, // input 5 (0x5) => '&' (0x26) - 39, // input 6 (0x6) => ''' (0x27) - 40, // input 7 (0x7) => '(' (0x28) - 41, // input 8 (0x8) => ')' (0x29) - 42, // input 9 (0x9) => '*' (0x2A) - 43, // input 10 (0xA) => '+' (0x2B) - 44, // input 11 (0xB) => ',' (0x2C) - 45, // input 12 (0xC) => '-' (0x2D) - 48, // input 13 (0xD) => '0' (0x30) - 49, // input 14 (0xE) => '1' (0x31) - 50, // input 15 (0xF) => '2' (0x32) - 51, // input 16 (0x10) => '3' (0x33) - 52, // input 17 (0x11) => '4' (0x34) - 53, // input 18 (0x12) => '5' (0x35) - 54, // input 19 (0x13) => '6' (0x36) - 55, // input 20 (0x14) => '7' (0x37) - 56, // input 21 (0x15) => '8' (0x38) - 57, // input 22 (0x16) => '9' (0x39) - 64, // input 23 (0x17) => '@' (0x40) - 65, // input 24 (0x18) => 'A' (0x41) - 66, // input 25 (0x19) => 'B' (0x42) - 67, // input 26 (0x1A) => 'C' (0x43) - 68, // input 27 (0x1B) => 'D' (0x44) - 69, // input 28 (0x1C) => 'E' (0x45) - 70, // input 29 (0x1D) => 'F' (0x46) - 71, // input 30 (0x1E) => 'G' (0x47) - 72, // input 31 (0x1F) => 'H' (0x48) - 73, // input 32 (0x20) => 'I' (0x49) - 74, // input 33 (0x21) => 'J' (0x4A) - 75, // input 34 (0x22) => 'K' (0x4B) - 76, // input 35 (0x23) => 'L' (0x4C) - 77, // input 36 (0x24) => 'M' (0x4D) - 78, // input 37 (0x25) => 'N' (0x4E) - 80, // input 38 (0x26) => 'P' (0x50) - 81, // input 39 (0x27) => 'Q' (0x51) - 82, // input 40 (0x28) => 'R' (0x52) - 83, // input 41 (0x29) => 'S' (0x53) - 84, // input 42 (0x2A) => 'T' (0x54) - 85, // input 43 (0x2B) => 'U' (0x55) - 86, // input 44 (0x2C) => 'V' (0x56) - 88, // input 45 (0x2D) => 'X' (0x58) - 89, // input 46 (0x2E) => 'Y' (0x59) - 90, // input 47 (0x2F) => 'Z' (0x5A) - 91, // input 48 (0x30) => '[' (0x5B) - 96, // input 49 (0x31) => '`' (0x60) - 97, // input 50 (0x32) => 'a' (0x61) - 98, // input 51 (0x33) => 'b' (0x62) - 99, // input 52 (0x34) => 'c' (0x63) - 100, // input 53 (0x35) => 'd' (0x64) - 101, // input 54 (0x36) => 'e' (0x65) - 104, // input 55 (0x37) => 'h' (0x68) - 105, // input 56 (0x38) => 'i' (0x69) - 106, // input 57 (0x39) => 'j' (0x6A) - 107, // input 58 (0x3A) => 'k' (0x6B) - 108, // input 59 (0x3B) => 'l' (0x6C) - 109, // input 60 (0x3C) => 'm' (0x6D) - 112, // input 61 (0x3D) => 'p' (0x70) - 113, // input 62 (0x3E) => 'q' (0x71) - 114, // input 63 (0x3F) => 'r' (0x72) -]; -#[rustfmt::skip] -pub const BINHEX_DECODE: &[u8; 256] = &[ - INVALID_VALUE, // input 0 (0x0) - INVALID_VALUE, // input 1 (0x1) - INVALID_VALUE, // input 2 (0x2) - INVALID_VALUE, // input 3 (0x3) - INVALID_VALUE, // input 4 (0x4) - INVALID_VALUE, // input 5 (0x5) - INVALID_VALUE, // input 6 (0x6) - INVALID_VALUE, // input 7 (0x7) - INVALID_VALUE, // input 8 (0x8) - INVALID_VALUE, // input 9 (0x9) - INVALID_VALUE, // input 10 (0xA) - INVALID_VALUE, // input 11 (0xB) - INVALID_VALUE, // input 12 (0xC) - INVALID_VALUE, // input 13 (0xD) - INVALID_VALUE, // input 14 (0xE) - INVALID_VALUE, // input 15 (0xF) - INVALID_VALUE, // input 16 (0x10) - INVALID_VALUE, // input 17 (0x11) - INVALID_VALUE, // input 18 (0x12) - INVALID_VALUE, // input 19 (0x13) - INVALID_VALUE, // input 20 (0x14) - INVALID_VALUE, // input 21 (0x15) - INVALID_VALUE, // input 22 (0x16) - INVALID_VALUE, // input 23 (0x17) - INVALID_VALUE, // input 24 (0x18) - INVALID_VALUE, // input 25 (0x19) - INVALID_VALUE, // input 26 (0x1A) - INVALID_VALUE, // input 27 (0x1B) - INVALID_VALUE, // input 28 (0x1C) - INVALID_VALUE, // input 29 (0x1D) - INVALID_VALUE, // input 30 (0x1E) - INVALID_VALUE, // input 31 (0x1F) - INVALID_VALUE, // input 32 (0x20) - 0, // input 33 (0x21 char '!') => 0 (0x0) - 1, // input 34 (0x22 char '"') => 1 (0x1) - 2, // input 35 (0x23 char '#') => 2 (0x2) - 3, // input 36 (0x24 char '$') => 3 (0x3) - 4, // input 37 (0x25 char '%') => 4 (0x4) - 5, // input 38 (0x26 char '&') => 5 (0x5) - 6, // input 39 (0x27 char ''') => 6 (0x6) - 7, // input 40 (0x28 char '(') => 7 (0x7) - 8, // input 41 (0x29 char ')') => 8 (0x8) - 9, // input 42 (0x2A char '*') => 9 (0x9) - 10, // input 43 (0x2B char '+') => 10 (0xA) - 11, // input 44 (0x2C char ',') => 11 (0xB) - 12, // input 45 (0x2D char '-') => 12 (0xC) - INVALID_VALUE, // input 46 (0x2E) - INVALID_VALUE, // input 47 (0x2F) - 13, // input 48 (0x30 char '0') => 13 (0xD) - 14, // input 49 (0x31 char '1') => 14 (0xE) - 15, // input 50 (0x32 char '2') => 15 (0xF) - 16, // input 51 (0x33 char '3') => 16 (0x10) - 17, // input 52 (0x34 char '4') => 17 (0x11) - 18, // input 53 (0x35 char '5') => 18 (0x12) - 19, // input 54 (0x36 char '6') => 19 (0x13) - 20, // input 55 (0x37 char '7') => 20 (0x14) - 21, // input 56 (0x38 char '8') => 21 (0x15) - 22, // input 57 (0x39 char '9') => 22 (0x16) - INVALID_VALUE, // input 58 (0x3A) - INVALID_VALUE, // input 59 (0x3B) - INVALID_VALUE, // input 60 (0x3C) - INVALID_VALUE, // input 61 (0x3D) - INVALID_VALUE, // input 62 (0x3E) - INVALID_VALUE, // input 63 (0x3F) - 23, // input 64 (0x40 char '@') => 23 (0x17) - 24, // input 65 (0x41 char 'A') => 24 (0x18) - 25, // input 66 (0x42 char 'B') => 25 (0x19) - 26, // input 67 (0x43 char 'C') => 26 (0x1A) - 27, // input 68 (0x44 char 'D') => 27 (0x1B) - 28, // input 69 (0x45 char 'E') => 28 (0x1C) - 29, // input 70 (0x46 char 'F') => 29 (0x1D) - 30, // input 71 (0x47 char 'G') => 30 (0x1E) - 31, // input 72 (0x48 char 'H') => 31 (0x1F) - 32, // input 73 (0x49 char 'I') => 32 (0x20) - 33, // input 74 (0x4A char 'J') => 33 (0x21) - 34, // input 75 (0x4B char 'K') => 34 (0x22) - 35, // input 76 (0x4C char 'L') => 35 (0x23) - 36, // input 77 (0x4D char 'M') => 36 (0x24) - 37, // input 78 (0x4E char 'N') => 37 (0x25) - INVALID_VALUE, // input 79 (0x4F) - 38, // input 80 (0x50 char 'P') => 38 (0x26) - 39, // input 81 (0x51 char 'Q') => 39 (0x27) - 40, // input 82 (0x52 char 'R') => 40 (0x28) - 41, // input 83 (0x53 char 'S') => 41 (0x29) - 42, // input 84 (0x54 char 'T') => 42 (0x2A) - 43, // input 85 (0x55 char 'U') => 43 (0x2B) - 44, // input 86 (0x56 char 'V') => 44 (0x2C) - INVALID_VALUE, // input 87 (0x57) - 45, // input 88 (0x58 char 'X') => 45 (0x2D) - 46, // input 89 (0x59 char 'Y') => 46 (0x2E) - 47, // input 90 (0x5A char 'Z') => 47 (0x2F) - 48, // input 91 (0x5B char '[') => 48 (0x30) - INVALID_VALUE, // input 92 (0x5C) - INVALID_VALUE, // input 93 (0x5D) - INVALID_VALUE, // input 94 (0x5E) - INVALID_VALUE, // input 95 (0x5F) - 49, // input 96 (0x60 char '`') => 49 (0x31) - 50, // input 97 (0x61 char 'a') => 50 (0x32) - 51, // input 98 (0x62 char 'b') => 51 (0x33) - 52, // input 99 (0x63 char 'c') => 52 (0x34) - 53, // input 100 (0x64 char 'd') => 53 (0x35) - 54, // input 101 (0x65 char 'e') => 54 (0x36) - INVALID_VALUE, // input 102 (0x66) - INVALID_VALUE, // input 103 (0x67) - 55, // input 104 (0x68 char 'h') => 55 (0x37) - 56, // input 105 (0x69 char 'i') => 56 (0x38) - 57, // input 106 (0x6A char 'j') => 57 (0x39) - 58, // input 107 (0x6B char 'k') => 58 (0x3A) - 59, // input 108 (0x6C char 'l') => 59 (0x3B) - 60, // input 109 (0x6D char 'm') => 60 (0x3C) - INVALID_VALUE, // input 110 (0x6E) - INVALID_VALUE, // input 111 (0x6F) - 61, // input 112 (0x70 char 'p') => 61 (0x3D) - 62, // input 113 (0x71 char 'q') => 62 (0x3E) - 63, // input 114 (0x72 char 'r') => 63 (0x3F) - INVALID_VALUE, // input 115 (0x73) - INVALID_VALUE, // input 116 (0x74) - INVALID_VALUE, // input 117 (0x75) - INVALID_VALUE, // input 118 (0x76) - INVALID_VALUE, // input 119 (0x77) - INVALID_VALUE, // input 120 (0x78) - INVALID_VALUE, // input 121 (0x79) - INVALID_VALUE, // input 122 (0x7A) - INVALID_VALUE, // input 123 (0x7B) - INVALID_VALUE, // input 124 (0x7C) - INVALID_VALUE, // input 125 (0x7D) - INVALID_VALUE, // input 126 (0x7E) - INVALID_VALUE, // input 127 (0x7F) - INVALID_VALUE, // input 128 (0x80) - INVALID_VALUE, // input 129 (0x81) - INVALID_VALUE, // input 130 (0x82) - INVALID_VALUE, // input 131 (0x83) - INVALID_VALUE, // input 132 (0x84) - INVALID_VALUE, // input 133 (0x85) - INVALID_VALUE, // input 134 (0x86) - INVALID_VALUE, // input 135 (0x87) - INVALID_VALUE, // input 136 (0x88) - INVALID_VALUE, // input 137 (0x89) - INVALID_VALUE, // input 138 (0x8A) - INVALID_VALUE, // input 139 (0x8B) - INVALID_VALUE, // input 140 (0x8C) - INVALID_VALUE, // input 141 (0x8D) - INVALID_VALUE, // input 142 (0x8E) - INVALID_VALUE, // input 143 (0x8F) - INVALID_VALUE, // input 144 (0x90) - INVALID_VALUE, // input 145 (0x91) - INVALID_VALUE, // input 146 (0x92) - INVALID_VALUE, // input 147 (0x93) - INVALID_VALUE, // input 148 (0x94) - INVALID_VALUE, // input 149 (0x95) - INVALID_VALUE, // input 150 (0x96) - INVALID_VALUE, // input 151 (0x97) - INVALID_VALUE, // input 152 (0x98) - INVALID_VALUE, // input 153 (0x99) - INVALID_VALUE, // input 154 (0x9A) - INVALID_VALUE, // input 155 (0x9B) - INVALID_VALUE, // input 156 (0x9C) - INVALID_VALUE, // input 157 (0x9D) - INVALID_VALUE, // input 158 (0x9E) - INVALID_VALUE, // input 159 (0x9F) - INVALID_VALUE, // input 160 (0xA0) - INVALID_VALUE, // input 161 (0xA1) - INVALID_VALUE, // input 162 (0xA2) - INVALID_VALUE, // input 163 (0xA3) - INVALID_VALUE, // input 164 (0xA4) - INVALID_VALUE, // input 165 (0xA5) - INVALID_VALUE, // input 166 (0xA6) - INVALID_VALUE, // input 167 (0xA7) - INVALID_VALUE, // input 168 (0xA8) - INVALID_VALUE, // input 169 (0xA9) - INVALID_VALUE, // input 170 (0xAA) - INVALID_VALUE, // input 171 (0xAB) - INVALID_VALUE, // input 172 (0xAC) - INVALID_VALUE, // input 173 (0xAD) - INVALID_VALUE, // input 174 (0xAE) - INVALID_VALUE, // input 175 (0xAF) - INVALID_VALUE, // input 176 (0xB0) - INVALID_VALUE, // input 177 (0xB1) - INVALID_VALUE, // input 178 (0xB2) - INVALID_VALUE, // input 179 (0xB3) - INVALID_VALUE, // input 180 (0xB4) - INVALID_VALUE, // input 181 (0xB5) - INVALID_VALUE, // input 182 (0xB6) - INVALID_VALUE, // input 183 (0xB7) - INVALID_VALUE, // input 184 (0xB8) - INVALID_VALUE, // input 185 (0xB9) - INVALID_VALUE, // input 186 (0xBA) - INVALID_VALUE, // input 187 (0xBB) - INVALID_VALUE, // input 188 (0xBC) - INVALID_VALUE, // input 189 (0xBD) - INVALID_VALUE, // input 190 (0xBE) - INVALID_VALUE, // input 191 (0xBF) - INVALID_VALUE, // input 192 (0xC0) - INVALID_VALUE, // input 193 (0xC1) - INVALID_VALUE, // input 194 (0xC2) - INVALID_VALUE, // input 195 (0xC3) - INVALID_VALUE, // input 196 (0xC4) - INVALID_VALUE, // input 197 (0xC5) - INVALID_VALUE, // input 198 (0xC6) - INVALID_VALUE, // input 199 (0xC7) - INVALID_VALUE, // input 200 (0xC8) - INVALID_VALUE, // input 201 (0xC9) - INVALID_VALUE, // input 202 (0xCA) - INVALID_VALUE, // input 203 (0xCB) - INVALID_VALUE, // input 204 (0xCC) - INVALID_VALUE, // input 205 (0xCD) - INVALID_VALUE, // input 206 (0xCE) - INVALID_VALUE, // input 207 (0xCF) - INVALID_VALUE, // input 208 (0xD0) - INVALID_VALUE, // input 209 (0xD1) - INVALID_VALUE, // input 210 (0xD2) - INVALID_VALUE, // input 211 (0xD3) - INVALID_VALUE, // input 212 (0xD4) - INVALID_VALUE, // input 213 (0xD5) - INVALID_VALUE, // input 214 (0xD6) - INVALID_VALUE, // input 215 (0xD7) - INVALID_VALUE, // input 216 (0xD8) - INVALID_VALUE, // input 217 (0xD9) - INVALID_VALUE, // input 218 (0xDA) - INVALID_VALUE, // input 219 (0xDB) - INVALID_VALUE, // input 220 (0xDC) - INVALID_VALUE, // input 221 (0xDD) - INVALID_VALUE, // input 222 (0xDE) - INVALID_VALUE, // input 223 (0xDF) - INVALID_VALUE, // input 224 (0xE0) - INVALID_VALUE, // input 225 (0xE1) - INVALID_VALUE, // input 226 (0xE2) - INVALID_VALUE, // input 227 (0xE3) - INVALID_VALUE, // input 228 (0xE4) - INVALID_VALUE, // input 229 (0xE5) - INVALID_VALUE, // input 230 (0xE6) - INVALID_VALUE, // input 231 (0xE7) - INVALID_VALUE, // input 232 (0xE8) - INVALID_VALUE, // input 233 (0xE9) - INVALID_VALUE, // input 234 (0xEA) - INVALID_VALUE, // input 235 (0xEB) - INVALID_VALUE, // input 236 (0xEC) - INVALID_VALUE, // input 237 (0xED) - INVALID_VALUE, // input 238 (0xEE) - INVALID_VALUE, // input 239 (0xEF) - INVALID_VALUE, // input 240 (0xF0) - INVALID_VALUE, // input 241 (0xF1) - INVALID_VALUE, // input 242 (0xF2) - INVALID_VALUE, // input 243 (0xF3) - INVALID_VALUE, // input 244 (0xF4) - INVALID_VALUE, // input 245 (0xF5) - INVALID_VALUE, // input 246 (0xF6) - INVALID_VALUE, // input 247 (0xF7) - INVALID_VALUE, // input 248 (0xF8) - INVALID_VALUE, // input 249 (0xF9) - INVALID_VALUE, // input 250 (0xFA) - INVALID_VALUE, // input 251 (0xFB) - INVALID_VALUE, // input 252 (0xFC) - INVALID_VALUE, // input 253 (0xFD) - INVALID_VALUE, // input 254 (0xFE) - INVALID_VALUE, // input 255 (0xFF) -]; diff -Nru temporalio-1.3.0/vendor/base64-0.13.1/src/tests.rs temporalio-1.3.0/vendor/base64-0.13.1/src/tests.rs --- temporalio-1.3.0/vendor/base64-0.13.1/src/tests.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/base64-0.13.1/src/tests.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,81 +0,0 @@ -use crate::{decode_config, encode::encoded_size, encode_config_buf, CharacterSet, Config}; - -use std::str; - -use rand::{ - distributions::{Distribution, Uniform}, - seq::SliceRandom, - FromEntropy, Rng, -}; - -#[test] -fn roundtrip_random_config_short() { - // exercise the slower encode/decode routines that operate on shorter buffers more vigorously - roundtrip_random_config(Uniform::new(0, 50), 10_000); -} - -#[test] -fn roundtrip_random_config_long() { - roundtrip_random_config(Uniform::new(0, 1000), 10_000); -} - -pub fn assert_encode_sanity(encoded: &str, config: Config, input_len: usize) { - let input_rem = input_len % 3; - let expected_padding_len = if input_rem > 0 { - if config.pad { - 3 - input_rem - } else { - 0 - } - } else { - 0 - }; - - let expected_encoded_len = encoded_size(input_len, config).unwrap(); - - assert_eq!(expected_encoded_len, encoded.len()); - - let padding_len = encoded.chars().filter(|&c| c == '=').count(); - - assert_eq!(expected_padding_len, padding_len); - - let _ = str::from_utf8(encoded.as_bytes()).expect("Base64 should be valid utf8"); -} - -fn roundtrip_random_config(input_len_range: Uniform, iterations: u32) { - let mut input_buf: Vec = Vec::new(); - let mut encoded_buf = String::new(); - let mut rng = rand::rngs::SmallRng::from_entropy(); - - for _ in 0..iterations { - input_buf.clear(); - encoded_buf.clear(); - - let input_len = input_len_range.sample(&mut rng); - - let config = random_config(&mut rng); - - for _ in 0..input_len { - input_buf.push(rng.gen()); - } - - encode_config_buf(&input_buf, config, &mut encoded_buf); - - assert_encode_sanity(&encoded_buf, config, input_len); - - assert_eq!(input_buf, decode_config(&encoded_buf, config).unwrap()); - } -} - -pub fn random_config(rng: &mut R) -> Config { - const CHARSETS: &[CharacterSet] = &[ - CharacterSet::UrlSafe, - CharacterSet::Standard, - CharacterSet::Crypt, - CharacterSet::ImapMutf7, - CharacterSet::BinHex, - ]; - let charset = *CHARSETS.choose(rng).unwrap(); - - Config::new(charset, rng.gen()) -} diff -Nru temporalio-1.3.0/vendor/base64-0.13.1/src/write/encoder.rs temporalio-1.3.0/vendor/base64-0.13.1/src/write/encoder.rs --- temporalio-1.3.0/vendor/base64-0.13.1/src/write/encoder.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/base64-0.13.1/src/write/encoder.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,381 +0,0 @@ -use crate::encode::encode_to_slice; -use crate::{encode_config_slice, Config}; -use std::{ - cmp, fmt, - io::{ErrorKind, Result, Write}, -}; - -pub(crate) const BUF_SIZE: usize = 1024; -/// The most bytes whose encoding will fit in `BUF_SIZE` -const MAX_INPUT_LEN: usize = BUF_SIZE / 4 * 3; -// 3 bytes of input = 4 bytes of base64, always (because we don't allow line wrapping) -const MIN_ENCODE_CHUNK_SIZE: usize = 3; - -/// A `Write` implementation that base64 encodes data before delegating to the wrapped writer. -/// -/// Because base64 has special handling for the end of the input data (padding, etc), there's a -/// `finish()` method on this type that encodes any leftover input bytes and adds padding if -/// appropriate. It's called automatically when deallocated (see the `Drop` implementation), but -/// any error that occurs when invoking the underlying writer will be suppressed. If you want to -/// handle such errors, call `finish()` yourself. -/// -/// # Examples -/// -/// ``` -/// use std::io::Write; -/// -/// // use a vec as the simplest possible `Write` -- in real code this is probably a file, etc. -/// let mut enc = base64::write::EncoderWriter::new(Vec::new(), base64::STANDARD); -/// -/// // handle errors as you normally would -/// enc.write_all(b"asdf").unwrap(); -/// -/// // could leave this out to be called by Drop, if you don't care -/// // about handling errors or getting the delegate writer back -/// let delegate = enc.finish().unwrap(); -/// -/// // base64 was written to the writer -/// assert_eq!(b"YXNkZg==", &delegate[..]); -/// -/// ``` -/// -/// # Panics -/// -/// Calling `write()` (or related methods) or `finish()` after `finish()` has completed without -/// error is invalid and will panic. -/// -/// # Errors -/// -/// Base64 encoding itself does not generate errors, but errors from the wrapped writer will be -/// returned as per the contract of `Write`. -/// -/// # Performance -/// -/// It has some minor performance loss compared to encoding slices (a couple percent). -/// It does not do any heap allocation. -pub struct EncoderWriter { - config: Config, - /// Where encoded data is written to. It's an Option as it's None immediately before Drop is - /// called so that finish() can return the underlying writer. None implies that finish() has - /// been called successfully. - delegate: Option, - /// Holds a partial chunk, if any, after the last `write()`, so that we may then fill the chunk - /// with the next `write()`, encode it, then proceed with the rest of the input normally. - extra_input: [u8; MIN_ENCODE_CHUNK_SIZE], - /// How much of `extra` is occupied, in `[0, MIN_ENCODE_CHUNK_SIZE]`. - extra_input_occupied_len: usize, - /// Buffer to encode into. May hold leftover encoded bytes from a previous write call that the underlying writer - /// did not write last time. - output: [u8; BUF_SIZE], - /// How much of `output` is occupied with encoded data that couldn't be written last time - output_occupied_len: usize, - /// panic safety: don't write again in destructor if writer panicked while we were writing to it - panicked: bool, -} - -impl fmt::Debug for EncoderWriter { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!( - f, - "extra_input: {:?} extra_input_occupied_len:{:?} output[..5]: {:?} output_occupied_len: {:?}", - self.extra_input, - self.extra_input_occupied_len, - &self.output[0..5], - self.output_occupied_len - ) - } -} - -impl EncoderWriter { - /// Create a new encoder that will write to the provided delegate writer `w`. - pub fn new(w: W, config: Config) -> EncoderWriter { - EncoderWriter { - config, - delegate: Some(w), - extra_input: [0u8; MIN_ENCODE_CHUNK_SIZE], - extra_input_occupied_len: 0, - output: [0u8; BUF_SIZE], - output_occupied_len: 0, - panicked: false, - } - } - - /// Encode all remaining buffered data and write it, including any trailing incomplete input - /// triples and associated padding. - /// - /// Once this succeeds, no further writes or calls to this method are allowed. - /// - /// This may write to the delegate writer multiple times if the delegate writer does not accept - /// all input provided to its `write` each invocation. - /// - /// If you don't care about error handling, it is not necessary to call this function, as the - /// equivalent finalization is done by the Drop impl. - /// - /// Returns the writer that this was constructed around. - /// - /// # Errors - /// - /// The first error that is not of `ErrorKind::Interrupted` will be returned. - pub fn finish(&mut self) -> Result { - // If we could consume self in finish(), we wouldn't have to worry about this case, but - // finish() is retryable in the face of I/O errors, so we can't consume here. - if self.delegate.is_none() { - panic!("Encoder has already had finish() called") - }; - - self.write_final_leftovers()?; - - let writer = self.delegate.take().expect("Writer must be present"); - - Ok(writer) - } - - /// Write any remaining buffered data to the delegate writer. - fn write_final_leftovers(&mut self) -> Result<()> { - if self.delegate.is_none() { - // finish() has already successfully called this, and we are now in drop() with a None - // writer, so just no-op - return Ok(()); - } - - self.write_all_encoded_output()?; - - if self.extra_input_occupied_len > 0 { - let encoded_len = encode_config_slice( - &self.extra_input[..self.extra_input_occupied_len], - self.config, - &mut self.output[..], - ); - - self.output_occupied_len = encoded_len; - - self.write_all_encoded_output()?; - - // write succeeded, do not write the encoding of extra again if finish() is retried - self.extra_input_occupied_len = 0; - } - - Ok(()) - } - - /// Write as much of the encoded output to the delegate writer as it will accept, and store the - /// leftovers to be attempted at the next write() call. Updates `self.output_occupied_len`. - /// - /// # Errors - /// - /// Errors from the delegate writer are returned. In the case of an error, - /// `self.output_occupied_len` will not be updated, as errors from `write` are specified to mean - /// that no write took place. - fn write_to_delegate(&mut self, current_output_len: usize) -> Result<()> { - self.panicked = true; - let res = self - .delegate - .as_mut() - .expect("Writer must be present") - .write(&self.output[..current_output_len]); - self.panicked = false; - - res.map(|consumed| { - debug_assert!(consumed <= current_output_len); - - if consumed < current_output_len { - self.output_occupied_len = current_output_len.checked_sub(consumed).unwrap(); - // If we're blocking on I/O, the minor inefficiency of copying bytes to the - // start of the buffer is the least of our concerns... - // Rotate moves more than we need to, but copy_within isn't stabilized yet. - self.output.rotate_left(consumed); - } else { - self.output_occupied_len = 0; - } - }) - } - - /// Write all buffered encoded output. If this returns `Ok`, `self.output_occupied_len` is `0`. - /// - /// This is basically write_all for the remaining buffered data but without the undesirable - /// abort-on-`Ok(0)` behavior. - /// - /// # Errors - /// - /// Any error emitted by the delegate writer abort the write loop and is returned, unless it's - /// `Interrupted`, in which case the error is ignored and writes will continue. - fn write_all_encoded_output(&mut self) -> Result<()> { - while self.output_occupied_len > 0 { - let remaining_len = self.output_occupied_len; - match self.write_to_delegate(remaining_len) { - // try again on interrupts ala write_all - Err(ref e) if e.kind() == ErrorKind::Interrupted => {} - // other errors return - Err(e) => return Err(e), - // success no-ops because remaining length is already updated - Ok(_) => {} - }; - } - - debug_assert_eq!(0, self.output_occupied_len); - Ok(()) - } -} - -impl Write for EncoderWriter { - /// Encode input and then write to the delegate writer. - /// - /// Under non-error circumstances, this returns `Ok` with the value being the number of bytes - /// of `input` consumed. The value may be `0`, which interacts poorly with `write_all`, which - /// interprets `Ok(0)` as an error, despite it being allowed by the contract of `write`. See - /// for more on that. - /// - /// If the previous call to `write` provided more (encoded) data than the delegate writer could - /// accept in a single call to its `write`, the remaining data is buffered. As long as buffered - /// data is present, subsequent calls to `write` will try to write the remaining buffered data - /// to the delegate and return either `Ok(0)` -- and therefore not consume any of `input` -- or - /// an error. - /// - /// # Errors - /// - /// Any errors emitted by the delegate writer are returned. - fn write(&mut self, input: &[u8]) -> Result { - if self.delegate.is_none() { - panic!("Cannot write more after calling finish()"); - } - - if input.is_empty() { - return Ok(0); - } - - // The contract of `Write::write` places some constraints on this implementation: - // - a call to `write()` represents at most one call to a wrapped `Write`, so we can't - // iterate over the input and encode multiple chunks. - // - Errors mean that "no bytes were written to this writer", so we need to reset the - // internal state to what it was before the error occurred - - // before reading any input, write any leftover encoded output from last time - if self.output_occupied_len > 0 { - let current_len = self.output_occupied_len; - return self - .write_to_delegate(current_len) - // did not read any input - .map(|_| 0); - } - - debug_assert_eq!(0, self.output_occupied_len); - - // how many bytes, if any, were read into `extra` to create a triple to encode - let mut extra_input_read_len = 0; - let mut input = input; - - let orig_extra_len = self.extra_input_occupied_len; - - let mut encoded_size = 0; - // always a multiple of MIN_ENCODE_CHUNK_SIZE - let mut max_input_len = MAX_INPUT_LEN; - - // process leftover un-encoded input from last write - if self.extra_input_occupied_len > 0 { - debug_assert!(self.extra_input_occupied_len < 3); - if input.len() + self.extra_input_occupied_len >= MIN_ENCODE_CHUNK_SIZE { - // Fill up `extra`, encode that into `output`, and consume as much of the rest of - // `input` as possible. - // We could write just the encoding of `extra` by itself but then we'd have to - // return after writing only 4 bytes, which is inefficient if the underlying writer - // would make a syscall. - extra_input_read_len = MIN_ENCODE_CHUNK_SIZE - self.extra_input_occupied_len; - debug_assert!(extra_input_read_len > 0); - // overwrite only bytes that weren't already used. If we need to rollback extra_len - // (when the subsequent write errors), the old leading bytes will still be there. - self.extra_input[self.extra_input_occupied_len..MIN_ENCODE_CHUNK_SIZE] - .copy_from_slice(&input[0..extra_input_read_len]); - - let len = encode_to_slice( - &self.extra_input[0..MIN_ENCODE_CHUNK_SIZE], - &mut self.output[..], - self.config.char_set.encode_table(), - ); - debug_assert_eq!(4, len); - - input = &input[extra_input_read_len..]; - - // consider extra to be used up, since we encoded it - self.extra_input_occupied_len = 0; - // don't clobber where we just encoded to - encoded_size = 4; - // and don't read more than can be encoded - max_input_len = MAX_INPUT_LEN - MIN_ENCODE_CHUNK_SIZE; - - // fall through to normal encoding - } else { - // `extra` and `input` are non empty, but `|extra| + |input| < 3`, so there must be - // 1 byte in each. - debug_assert_eq!(1, input.len()); - debug_assert_eq!(1, self.extra_input_occupied_len); - - self.extra_input[self.extra_input_occupied_len] = input[0]; - self.extra_input_occupied_len += 1; - return Ok(1); - }; - } else if input.len() < MIN_ENCODE_CHUNK_SIZE { - // `extra` is empty, and `input` fits inside it - self.extra_input[0..input.len()].copy_from_slice(input); - self.extra_input_occupied_len = input.len(); - return Ok(input.len()); - }; - - // either 0 or 1 complete chunks encoded from extra - debug_assert!(encoded_size == 0 || encoded_size == 4); - debug_assert!( - // didn't encode extra input - MAX_INPUT_LEN == max_input_len - // encoded one triple - || MAX_INPUT_LEN == max_input_len + MIN_ENCODE_CHUNK_SIZE - ); - - // encode complete triples only - let input_complete_chunks_len = input.len() - (input.len() % MIN_ENCODE_CHUNK_SIZE); - let input_chunks_to_encode_len = cmp::min(input_complete_chunks_len, max_input_len); - debug_assert_eq!(0, max_input_len % MIN_ENCODE_CHUNK_SIZE); - debug_assert_eq!(0, input_chunks_to_encode_len % MIN_ENCODE_CHUNK_SIZE); - - encoded_size += encode_to_slice( - &input[..(input_chunks_to_encode_len)], - &mut self.output[encoded_size..], - self.config.char_set.encode_table(), - ); - - // not updating `self.output_occupied_len` here because if the below write fails, it should - // "never take place" -- the buffer contents we encoded are ignored and perhaps retried - // later, if the consumer chooses. - - self.write_to_delegate(encoded_size) - // no matter whether we wrote the full encoded buffer or not, we consumed the same - // input - .map(|_| extra_input_read_len + input_chunks_to_encode_len) - .map_err(|e| { - // in case we filled and encoded `extra`, reset extra_len - self.extra_input_occupied_len = orig_extra_len; - - e - }) - } - - /// Because this is usually treated as OK to call multiple times, it will *not* flush any - /// incomplete chunks of input or write padding. - /// # Errors - /// - /// The first error that is not of [`ErrorKind::Interrupted`] will be returned. - fn flush(&mut self) -> Result<()> { - self.write_all_encoded_output()?; - self.delegate - .as_mut() - .expect("Writer must be present") - .flush() - } -} - -impl Drop for EncoderWriter { - fn drop(&mut self) { - if !self.panicked { - // like `BufWriter`, ignore errors during drop - let _ = self.write_final_leftovers(); - } - } -} diff -Nru temporalio-1.3.0/vendor/base64-0.13.1/src/write/encoder_string_writer.rs temporalio-1.3.0/vendor/base64-0.13.1/src/write/encoder_string_writer.rs --- temporalio-1.3.0/vendor/base64-0.13.1/src/write/encoder_string_writer.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/base64-0.13.1/src/write/encoder_string_writer.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,176 +0,0 @@ -use super::encoder::EncoderWriter; -use crate::Config; -use std::io; -use std::io::Write; - -/// A `Write` implementation that base64-encodes data using the provided config and accumulates the -/// resulting base64 in memory, which is then exposed as a String via `into_inner()`. -/// -/// # Examples -/// -/// Buffer base64 in a new String: -/// -/// ``` -/// use std::io::Write; -/// -/// let mut enc = base64::write::EncoderStringWriter::new(base64::STANDARD); -/// -/// enc.write_all(b"asdf").unwrap(); -/// -/// // get the resulting String -/// let b64_string = enc.into_inner(); -/// -/// assert_eq!("YXNkZg==", &b64_string); -/// ``` -/// -/// Or, append to an existing String: -/// -/// ``` -/// use std::io::Write; -/// -/// let mut buf = String::from("base64: "); -/// -/// let mut enc = base64::write::EncoderStringWriter::from(&mut buf, base64::STANDARD); -/// -/// enc.write_all(b"asdf").unwrap(); -/// -/// // release the &mut reference on buf -/// let _ = enc.into_inner(); -/// -/// assert_eq!("base64: YXNkZg==", &buf); -/// ``` -/// -/// # Panics -/// -/// Calling `write()` (or related methods) or `finish()` after `finish()` has completed without -/// error is invalid and will panic. -/// -/// # Performance -/// -/// Because it has to validate that the base64 is UTF-8, it is about 80% as fast as writing plain -/// bytes to a `io::Write`. -pub struct EncoderStringWriter { - encoder: EncoderWriter>, -} - -impl EncoderStringWriter { - /// Create a EncoderStringWriter that will append to the provided `StrConsumer`. - pub fn from(str_consumer: S, config: Config) -> Self { - EncoderStringWriter { - encoder: EncoderWriter::new(Utf8SingleCodeUnitWriter { str_consumer }, config), - } - } - - /// Encode all remaining buffered data, including any trailing incomplete input triples and - /// associated padding. - /// - /// Once this succeeds, no further writes or calls to this method are allowed. - /// - /// Returns the base64-encoded form of the accumulated written data. - pub fn into_inner(mut self) -> S { - self.encoder - .finish() - .expect("Writing to a Vec should never fail") - .str_consumer - } -} - -impl EncoderStringWriter { - /// Create a EncoderStringWriter that will encode into a new String with the provided config. - pub fn new(config: Config) -> Self { - EncoderStringWriter::from(String::new(), config) - } -} - -impl Write for EncoderStringWriter { - fn write(&mut self, buf: &[u8]) -> io::Result { - self.encoder.write(buf) - } - - fn flush(&mut self) -> io::Result<()> { - self.encoder.flush() - } -} - -/// An abstraction around consuming `str`s produced by base64 encoding. -pub trait StrConsumer { - /// Consume the base64 encoded data in `buf` - fn consume(&mut self, buf: &str); -} - -/// As for io::Write, `StrConsumer` is implemented automatically for `&mut S`. -impl StrConsumer for &mut S { - fn consume(&mut self, buf: &str) { - (**self).consume(buf) - } -} - -/// Pushes the str onto the end of the String -impl StrConsumer for String { - fn consume(&mut self, buf: &str) { - self.push_str(buf) - } -} - -/// A `Write` that only can handle bytes that are valid single-byte UTF-8 code units. -/// -/// This is safe because we only use it when writing base64, which is always valid UTF-8. -struct Utf8SingleCodeUnitWriter { - str_consumer: S, -} - -impl io::Write for Utf8SingleCodeUnitWriter { - fn write(&mut self, buf: &[u8]) -> io::Result { - // Because we expect all input to be valid utf-8 individual bytes, we can encode any buffer - // length - let s = std::str::from_utf8(buf).expect("Input must be valid UTF-8"); - - self.str_consumer.consume(s); - - Ok(buf.len()) - } - - fn flush(&mut self) -> io::Result<()> { - // no op - Ok(()) - } -} - -#[cfg(test)] -mod tests { - use crate::encode_config_buf; - use crate::tests::random_config; - use crate::write::encoder_string_writer::EncoderStringWriter; - use rand::Rng; - use std::io::Write; - - #[test] - fn every_possible_split_of_input() { - let mut rng = rand::thread_rng(); - let mut orig_data = Vec::::new(); - let mut normal_encoded = String::new(); - - let size = 5_000; - - for i in 0..size { - orig_data.clear(); - normal_encoded.clear(); - - for _ in 0..size { - orig_data.push(rng.gen()); - } - - let config = random_config(&mut rng); - encode_config_buf(&orig_data, config, &mut normal_encoded); - - let mut stream_encoder = EncoderStringWriter::new(config); - // Write the first i bytes, then the rest - stream_encoder.write_all(&orig_data[0..i]).unwrap(); - stream_encoder.write_all(&orig_data[i..]).unwrap(); - - let stream_encoded = stream_encoder.into_inner(); - - assert_eq!(normal_encoded, stream_encoded); - } - } -} diff -Nru temporalio-1.3.0/vendor/base64-0.13.1/src/write/encoder_tests.rs temporalio-1.3.0/vendor/base64-0.13.1/src/write/encoder_tests.rs --- temporalio-1.3.0/vendor/base64-0.13.1/src/write/encoder_tests.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/base64-0.13.1/src/write/encoder_tests.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,568 +0,0 @@ -use super::EncoderWriter; -use crate::tests::random_config; -use crate::{encode_config, encode_config_buf, STANDARD_NO_PAD, URL_SAFE}; - -use std::io::{Cursor, Write}; -use std::{cmp, io, str}; - -use rand::Rng; - -#[test] -fn encode_three_bytes() { - let mut c = Cursor::new(Vec::new()); - { - let mut enc = EncoderWriter::new(&mut c, URL_SAFE); - - let sz = enc.write(b"abc").unwrap(); - assert_eq!(sz, 3); - } - assert_eq!(&c.get_ref()[..], encode_config("abc", URL_SAFE).as_bytes()); -} - -#[test] -fn encode_nine_bytes_two_writes() { - let mut c = Cursor::new(Vec::new()); - { - let mut enc = EncoderWriter::new(&mut c, URL_SAFE); - - let sz = enc.write(b"abcdef").unwrap(); - assert_eq!(sz, 6); - let sz = enc.write(b"ghi").unwrap(); - assert_eq!(sz, 3); - } - assert_eq!( - &c.get_ref()[..], - encode_config("abcdefghi", URL_SAFE).as_bytes() - ); -} - -#[test] -fn encode_one_then_two_bytes() { - let mut c = Cursor::new(Vec::new()); - { - let mut enc = EncoderWriter::new(&mut c, URL_SAFE); - - let sz = enc.write(b"a").unwrap(); - assert_eq!(sz, 1); - let sz = enc.write(b"bc").unwrap(); - assert_eq!(sz, 2); - } - assert_eq!(&c.get_ref()[..], encode_config("abc", URL_SAFE).as_bytes()); -} - -#[test] -fn encode_one_then_five_bytes() { - let mut c = Cursor::new(Vec::new()); - { - let mut enc = EncoderWriter::new(&mut c, URL_SAFE); - - let sz = enc.write(b"a").unwrap(); - assert_eq!(sz, 1); - let sz = enc.write(b"bcdef").unwrap(); - assert_eq!(sz, 5); - } - assert_eq!( - &c.get_ref()[..], - encode_config("abcdef", URL_SAFE).as_bytes() - ); -} - -#[test] -fn encode_1_2_3_bytes() { - let mut c = Cursor::new(Vec::new()); - { - let mut enc = EncoderWriter::new(&mut c, URL_SAFE); - - let sz = enc.write(b"a").unwrap(); - assert_eq!(sz, 1); - let sz = enc.write(b"bc").unwrap(); - assert_eq!(sz, 2); - let sz = enc.write(b"def").unwrap(); - assert_eq!(sz, 3); - } - assert_eq!( - &c.get_ref()[..], - encode_config("abcdef", URL_SAFE).as_bytes() - ); -} - -#[test] -fn encode_with_padding() { - let mut c = Cursor::new(Vec::new()); - { - let mut enc = EncoderWriter::new(&mut c, URL_SAFE); - - enc.write_all(b"abcd").unwrap(); - - enc.flush().unwrap(); - } - assert_eq!(&c.get_ref()[..], encode_config("abcd", URL_SAFE).as_bytes()); -} - -#[test] -fn encode_with_padding_multiple_writes() { - let mut c = Cursor::new(Vec::new()); - { - let mut enc = EncoderWriter::new(&mut c, URL_SAFE); - - assert_eq!(1, enc.write(b"a").unwrap()); - assert_eq!(2, enc.write(b"bc").unwrap()); - assert_eq!(3, enc.write(b"def").unwrap()); - assert_eq!(1, enc.write(b"g").unwrap()); - - enc.flush().unwrap(); - } - assert_eq!( - &c.get_ref()[..], - encode_config("abcdefg", URL_SAFE).as_bytes() - ); -} - -#[test] -fn finish_writes_extra_byte() { - let mut c = Cursor::new(Vec::new()); - { - let mut enc = EncoderWriter::new(&mut c, URL_SAFE); - - assert_eq!(6, enc.write(b"abcdef").unwrap()); - - // will be in extra - assert_eq!(1, enc.write(b"g").unwrap()); - - // 1 trailing byte = 2 encoded chars - let _ = enc.finish().unwrap(); - } - assert_eq!( - &c.get_ref()[..], - encode_config("abcdefg", URL_SAFE).as_bytes() - ); -} - -#[test] -fn write_partial_chunk_encodes_partial_chunk() { - let mut c = Cursor::new(Vec::new()); - { - let mut enc = EncoderWriter::new(&mut c, STANDARD_NO_PAD); - - // nothing encoded yet - assert_eq!(2, enc.write(b"ab").unwrap()); - // encoded here - let _ = enc.finish().unwrap(); - } - assert_eq!( - &c.get_ref()[..], - encode_config("ab", STANDARD_NO_PAD).as_bytes() - ); - assert_eq!(3, c.get_ref().len()); -} - -#[test] -fn write_1_chunk_encodes_complete_chunk() { - let mut c = Cursor::new(Vec::new()); - { - let mut enc = EncoderWriter::new(&mut c, STANDARD_NO_PAD); - - assert_eq!(3, enc.write(b"abc").unwrap()); - let _ = enc.finish().unwrap(); - } - assert_eq!( - &c.get_ref()[..], - encode_config("abc", STANDARD_NO_PAD).as_bytes() - ); - assert_eq!(4, c.get_ref().len()); -} - -#[test] -fn write_1_chunk_and_partial_encodes_only_complete_chunk() { - let mut c = Cursor::new(Vec::new()); - { - let mut enc = EncoderWriter::new(&mut c, STANDARD_NO_PAD); - - // "d" not written - assert_eq!(3, enc.write(b"abcd").unwrap()); - let _ = enc.finish().unwrap(); - } - assert_eq!( - &c.get_ref()[..], - encode_config("abc", STANDARD_NO_PAD).as_bytes() - ); - assert_eq!(4, c.get_ref().len()); -} - -#[test] -fn write_2_partials_to_exactly_complete_chunk_encodes_complete_chunk() { - let mut c = Cursor::new(Vec::new()); - { - let mut enc = EncoderWriter::new(&mut c, STANDARD_NO_PAD); - - assert_eq!(1, enc.write(b"a").unwrap()); - assert_eq!(2, enc.write(b"bc").unwrap()); - let _ = enc.finish().unwrap(); - } - assert_eq!( - &c.get_ref()[..], - encode_config("abc", STANDARD_NO_PAD).as_bytes() - ); - assert_eq!(4, c.get_ref().len()); -} - -#[test] -fn write_partial_then_enough_to_complete_chunk_but_not_complete_another_chunk_encodes_complete_chunk_without_consuming_remaining( -) { - let mut c = Cursor::new(Vec::new()); - { - let mut enc = EncoderWriter::new(&mut c, STANDARD_NO_PAD); - - assert_eq!(1, enc.write(b"a").unwrap()); - // doesn't consume "d" - assert_eq!(2, enc.write(b"bcd").unwrap()); - let _ = enc.finish().unwrap(); - } - assert_eq!( - &c.get_ref()[..], - encode_config("abc", STANDARD_NO_PAD).as_bytes() - ); - assert_eq!(4, c.get_ref().len()); -} - -#[test] -fn write_partial_then_enough_to_complete_chunk_and_another_chunk_encodes_complete_chunks() { - let mut c = Cursor::new(Vec::new()); - { - let mut enc = EncoderWriter::new(&mut c, STANDARD_NO_PAD); - - assert_eq!(1, enc.write(b"a").unwrap()); - // completes partial chunk, and another chunk - assert_eq!(5, enc.write(b"bcdef").unwrap()); - let _ = enc.finish().unwrap(); - } - assert_eq!( - &c.get_ref()[..], - encode_config("abcdef", STANDARD_NO_PAD).as_bytes() - ); - assert_eq!(8, c.get_ref().len()); -} - -#[test] -fn write_partial_then_enough_to_complete_chunk_and_another_chunk_and_another_partial_chunk_encodes_only_complete_chunks( -) { - let mut c = Cursor::new(Vec::new()); - { - let mut enc = EncoderWriter::new(&mut c, STANDARD_NO_PAD); - - assert_eq!(1, enc.write(b"a").unwrap()); - // completes partial chunk, and another chunk, with one more partial chunk that's not - // consumed - assert_eq!(5, enc.write(b"bcdefe").unwrap()); - let _ = enc.finish().unwrap(); - } - assert_eq!( - &c.get_ref()[..], - encode_config("abcdef", STANDARD_NO_PAD).as_bytes() - ); - assert_eq!(8, c.get_ref().len()); -} - -#[test] -fn drop_calls_finish_for_you() { - let mut c = Cursor::new(Vec::new()); - { - let mut enc = EncoderWriter::new(&mut c, STANDARD_NO_PAD); - assert_eq!(1, enc.write(b"a").unwrap()); - } - assert_eq!( - &c.get_ref()[..], - encode_config("a", STANDARD_NO_PAD).as_bytes() - ); - assert_eq!(2, c.get_ref().len()); -} - -#[test] -fn every_possible_split_of_input() { - let mut rng = rand::thread_rng(); - let mut orig_data = Vec::::new(); - let mut stream_encoded = Vec::::new(); - let mut normal_encoded = String::new(); - - let size = 5_000; - - for i in 0..size { - orig_data.clear(); - stream_encoded.clear(); - normal_encoded.clear(); - - for _ in 0..size { - orig_data.push(rng.gen()); - } - - let config = random_config(&mut rng); - encode_config_buf(&orig_data, config, &mut normal_encoded); - - { - let mut stream_encoder = EncoderWriter::new(&mut stream_encoded, config); - // Write the first i bytes, then the rest - stream_encoder.write_all(&orig_data[0..i]).unwrap(); - stream_encoder.write_all(&orig_data[i..]).unwrap(); - } - - assert_eq!(normal_encoded, str::from_utf8(&stream_encoded).unwrap()); - } -} - -#[test] -fn encode_random_config_matches_normal_encode_reasonable_input_len() { - // choose up to 2 * buf size, so ~half the time it'll use a full buffer - do_encode_random_config_matches_normal_encode(super::encoder::BUF_SIZE * 2) -} - -#[test] -fn encode_random_config_matches_normal_encode_tiny_input_len() { - do_encode_random_config_matches_normal_encode(10) -} - -#[test] -fn retrying_writes_that_error_with_interrupted_works() { - let mut rng = rand::thread_rng(); - let mut orig_data = Vec::::new(); - let mut stream_encoded = Vec::::new(); - let mut normal_encoded = String::new(); - - for _ in 0..1_000 { - orig_data.clear(); - stream_encoded.clear(); - normal_encoded.clear(); - - let orig_len: usize = rng.gen_range(100, 20_000); - for _ in 0..orig_len { - orig_data.push(rng.gen()); - } - - // encode the normal way - let config = random_config(&mut rng); - encode_config_buf(&orig_data, config, &mut normal_encoded); - - // encode via the stream encoder - { - let mut interrupt_rng = rand::thread_rng(); - let mut interrupting_writer = InterruptingWriter { - w: &mut stream_encoded, - rng: &mut interrupt_rng, - fraction: 0.8, - }; - - let mut stream_encoder = EncoderWriter::new(&mut interrupting_writer, config); - let mut bytes_consumed = 0; - while bytes_consumed < orig_len { - // use short inputs since we want to use `extra` a lot as that's what needs rollback - // when errors occur - let input_len: usize = cmp::min(rng.gen_range(0, 10), orig_len - bytes_consumed); - - retry_interrupted_write_all( - &mut stream_encoder, - &orig_data[bytes_consumed..bytes_consumed + input_len], - ) - .unwrap(); - - bytes_consumed += input_len; - } - - loop { - let res = stream_encoder.finish(); - match res { - Ok(_) => break, - Err(e) => match e.kind() { - io::ErrorKind::Interrupted => continue, - _ => Err(e).unwrap(), // bail - }, - } - } - - assert_eq!(orig_len, bytes_consumed); - } - - assert_eq!(normal_encoded, str::from_utf8(&stream_encoded).unwrap()); - } -} - -#[test] -fn writes_that_only_write_part_of_input_and_sometimes_interrupt_produce_correct_encoded_data() { - let mut rng = rand::thread_rng(); - let mut orig_data = Vec::::new(); - let mut stream_encoded = Vec::::new(); - let mut normal_encoded = String::new(); - - for _ in 0..1_000 { - orig_data.clear(); - stream_encoded.clear(); - normal_encoded.clear(); - - let orig_len: usize = rng.gen_range(100, 20_000); - for _ in 0..orig_len { - orig_data.push(rng.gen()); - } - - // encode the normal way - let config = random_config(&mut rng); - encode_config_buf(&orig_data, config, &mut normal_encoded); - - // encode via the stream encoder - { - let mut partial_rng = rand::thread_rng(); - let mut partial_writer = PartialInterruptingWriter { - w: &mut stream_encoded, - rng: &mut partial_rng, - full_input_fraction: 0.1, - no_interrupt_fraction: 0.1, - }; - - let mut stream_encoder = EncoderWriter::new(&mut partial_writer, config); - let mut bytes_consumed = 0; - while bytes_consumed < orig_len { - // use at most medium-length inputs to exercise retry logic more aggressively - let input_len: usize = cmp::min(rng.gen_range(0, 100), orig_len - bytes_consumed); - - let res = - stream_encoder.write(&orig_data[bytes_consumed..bytes_consumed + input_len]); - - // retry on interrupt - match res { - Ok(len) => bytes_consumed += len, - Err(e) => match e.kind() { - io::ErrorKind::Interrupted => continue, - _ => { - panic!("should not see other errors"); - } - }, - } - } - - let _ = stream_encoder.finish().unwrap(); - - assert_eq!(orig_len, bytes_consumed); - } - - assert_eq!(normal_encoded, str::from_utf8(&stream_encoded).unwrap()); - } -} - -/// Retry writes until all the data is written or an error that isn't Interrupted is returned. -fn retry_interrupted_write_all(w: &mut W, buf: &[u8]) -> io::Result<()> { - let mut bytes_consumed = 0; - - while bytes_consumed < buf.len() { - let res = w.write(&buf[bytes_consumed..]); - - match res { - Ok(len) => bytes_consumed += len, - Err(e) => match e.kind() { - io::ErrorKind::Interrupted => continue, - _ => return Err(e), - }, - } - } - - Ok(()) -} - -fn do_encode_random_config_matches_normal_encode(max_input_len: usize) { - let mut rng = rand::thread_rng(); - let mut orig_data = Vec::::new(); - let mut stream_encoded = Vec::::new(); - let mut normal_encoded = String::new(); - - for _ in 0..1_000 { - orig_data.clear(); - stream_encoded.clear(); - normal_encoded.clear(); - - let orig_len: usize = rng.gen_range(100, 20_000); - for _ in 0..orig_len { - orig_data.push(rng.gen()); - } - - // encode the normal way - let config = random_config(&mut rng); - encode_config_buf(&orig_data, config, &mut normal_encoded); - - // encode via the stream encoder - { - let mut stream_encoder = EncoderWriter::new(&mut stream_encoded, config); - let mut bytes_consumed = 0; - while bytes_consumed < orig_len { - let input_len: usize = - cmp::min(rng.gen_range(0, max_input_len), orig_len - bytes_consumed); - - // write a little bit of the data - stream_encoder - .write_all(&orig_data[bytes_consumed..bytes_consumed + input_len]) - .unwrap(); - - bytes_consumed += input_len; - } - - let _ = stream_encoder.finish().unwrap(); - - assert_eq!(orig_len, bytes_consumed); - } - - assert_eq!(normal_encoded, str::from_utf8(&stream_encoded).unwrap()); - } -} - -/// A `Write` implementation that returns Interrupted some fraction of the time, randomly. -struct InterruptingWriter<'a, W: 'a + Write, R: 'a + Rng> { - w: &'a mut W, - rng: &'a mut R, - /// In [0, 1]. If a random number in [0, 1] is `<= threshold`, `Write` methods will return - /// an `Interrupted` error - fraction: f64, -} - -impl<'a, W: Write, R: Rng> Write for InterruptingWriter<'a, W, R> { - fn write(&mut self, buf: &[u8]) -> io::Result { - if self.rng.gen_range(0.0, 1.0) <= self.fraction { - return Err(io::Error::new(io::ErrorKind::Interrupted, "interrupted")); - } - - self.w.write(buf) - } - - fn flush(&mut self) -> io::Result<()> { - if self.rng.gen_range(0.0, 1.0) <= self.fraction { - return Err(io::Error::new(io::ErrorKind::Interrupted, "interrupted")); - } - - self.w.flush() - } -} - -/// A `Write` implementation that sometimes will only write part of its input. -struct PartialInterruptingWriter<'a, W: 'a + Write, R: 'a + Rng> { - w: &'a mut W, - rng: &'a mut R, - /// In [0, 1]. If a random number in [0, 1] is `<= threshold`, `write()` will write all its - /// input. Otherwise, it will write a random substring - full_input_fraction: f64, - no_interrupt_fraction: f64, -} - -impl<'a, W: Write, R: Rng> Write for PartialInterruptingWriter<'a, W, R> { - fn write(&mut self, buf: &[u8]) -> io::Result { - if self.rng.gen_range(0.0, 1.0) > self.no_interrupt_fraction { - return Err(io::Error::new(io::ErrorKind::Interrupted, "interrupted")); - } - - if self.rng.gen_range(0.0, 1.0) <= self.full_input_fraction || buf.len() == 0 { - // pass through the buf untouched - self.w.write(buf) - } else { - // only use a prefix of it - self.w - .write(&buf[0..(self.rng.gen_range(0, buf.len() - 1))]) - } - } - - fn flush(&mut self) -> io::Result<()> { - self.w.flush() - } -} diff -Nru temporalio-1.3.0/vendor/base64-0.13.1/src/write/mod.rs temporalio-1.3.0/vendor/base64-0.13.1/src/write/mod.rs --- temporalio-1.3.0/vendor/base64-0.13.1/src/write/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/base64-0.13.1/src/write/mod.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,8 +0,0 @@ -//! Implementations of `io::Write` to transparently handle base64. -mod encoder; -mod encoder_string_writer; -pub use self::encoder::EncoderWriter; -pub use self::encoder_string_writer::EncoderStringWriter; - -#[cfg(test)] -mod encoder_tests; diff -Nru temporalio-1.3.0/vendor/base64-0.13.1/tests/decode.rs temporalio-1.3.0/vendor/base64-0.13.1/tests/decode.rs --- temporalio-1.3.0/vendor/base64-0.13.1/tests/decode.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/base64-0.13.1/tests/decode.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,330 +0,0 @@ -extern crate base64; - -use base64::*; - -mod helpers; - -use self::helpers::*; - -#[test] -fn decode_rfc4648_0() { - compare_decode("", ""); -} - -#[test] -fn decode_rfc4648_1() { - compare_decode("f", "Zg=="); -} - -#[test] -fn decode_rfc4648_1_just_a_bit_of_padding() { - // allows less padding than required - compare_decode("f", "Zg="); -} - -#[test] -fn decode_rfc4648_1_no_padding() { - compare_decode("f", "Zg"); -} - -#[test] -fn decode_rfc4648_2() { - compare_decode("fo", "Zm8="); -} - -#[test] -fn decode_rfc4648_2_no_padding() { - compare_decode("fo", "Zm8"); -} - -#[test] -fn decode_rfc4648_3() { - compare_decode("foo", "Zm9v"); -} - -#[test] -fn decode_rfc4648_4() { - compare_decode("foob", "Zm9vYg=="); -} - -#[test] -fn decode_rfc4648_4_no_padding() { - compare_decode("foob", "Zm9vYg"); -} - -#[test] -fn decode_rfc4648_5() { - compare_decode("fooba", "Zm9vYmE="); -} - -#[test] -fn decode_rfc4648_5_no_padding() { - compare_decode("fooba", "Zm9vYmE"); -} - -#[test] -fn decode_rfc4648_6() { - compare_decode("foobar", "Zm9vYmFy"); -} - -#[test] -fn decode_reject_null() { - assert_eq!( - DecodeError::InvalidByte(3, 0x0), - decode_config("YWx\0pY2U==", config_std_pad()).unwrap_err() - ); -} - -#[test] -fn decode_single_pad_byte_after_2_chars_in_trailing_quad_ok() { - for num_quads in 0..25 { - let mut s: String = std::iter::repeat("ABCD").take(num_quads).collect(); - s.push_str("Zg="); - - let input_len = num_quads * 3 + 1; - - // Since there are 3 bytes in the trailing quad, want to be sure this allows for the fact - // that it could be bad padding rather than assuming that it will decode to 2 bytes and - // therefore allow 1 extra round of fast decode logic (stage 1 / 2). - - let mut decoded = Vec::new(); - decoded.resize(input_len, 0); - - assert_eq!( - input_len, - decode_config_slice(&s, STANDARD, &mut decoded).unwrap() - ); - } -} - -//this is a MAY in the rfc: https://tools.ietf.org/html/rfc4648#section-3.3 -#[test] -fn decode_1_pad_byte_in_fast_loop_then_extra_padding_chunk_error() { - for num_quads in 0..25 { - let mut s: String = std::iter::repeat("ABCD").take(num_quads).collect(); - s.push_str("YWxpY2U====="); - - // since the first 8 bytes are handled in stage 1 or 2, the padding is detected as a - // generic invalid byte, not specifcally a padding issue. - // Could argue that the *next* padding byte (in the next quad) is technically the first - // erroneous one, but reporting that accurately is more complex and probably nobody cares - assert_eq!( - DecodeError::InvalidByte(num_quads * 4 + 7, b'='), - decode(&s).unwrap_err() - ); - } -} - -#[test] -fn decode_2_pad_bytes_in_leftovers_then_extra_padding_chunk_error() { - for num_quads in 0..25 { - let mut s: String = std::iter::repeat("ABCD").take(num_quads).collect(); - s.push_str("YWxpY2UABB===="); - - // 6 bytes (4 padding) after last 8-byte chunk, so it's decoded by stage 4. - // First padding byte is invalid. - assert_eq!( - DecodeError::InvalidByte(num_quads * 4 + 10, b'='), - decode(&s).unwrap_err() - ); - } -} - -#[test] -fn decode_valid_bytes_after_padding_in_leftovers_error() { - for num_quads in 0..25 { - let mut s: String = std::iter::repeat("ABCD").take(num_quads).collect(); - s.push_str("YWxpY2UABB=B"); - - // 4 bytes after last 8-byte chunk, so it's decoded by stage 4. - // First (and only) padding byte is invalid. - assert_eq!( - DecodeError::InvalidByte(num_quads * 4 + 10, b'='), - decode(&s).unwrap_err() - ); - } -} - -#[test] -fn decode_absurd_pad_error() { - for num_quads in 0..25 { - let mut s: String = std::iter::repeat("ABCD").take(num_quads).collect(); - s.push_str("==Y=Wx===pY=2U====="); - - // Plenty of remaining bytes, so handled by stage 1 or 2. - // first padding byte - assert_eq!( - DecodeError::InvalidByte(num_quads * 4, b'='), - decode(&s).unwrap_err() - ); - } -} - -#[test] -fn decode_extra_padding_after_1_pad_bytes_in_trailing_quad_returns_error() { - for num_quads in 0..25 { - let mut s: String = std::iter::repeat("ABCD").take(num_quads).collect(); - s.push_str("EEE==="); - - // handled by stage 1, 2, or 4 depending on length - // first padding byte -- which would be legal if it was the only padding - assert_eq!( - DecodeError::InvalidByte(num_quads * 4 + 3, b'='), - decode(&s).unwrap_err() - ); - } -} - -#[test] -fn decode_extra_padding_after_2_pad_bytes_in_trailing_quad_2_returns_error() { - for num_quads in 0..25 { - let mut s: String = std::iter::repeat("ABCD").take(num_quads).collect(); - s.push_str("EE===="); - - // handled by stage 1, 2, or 4 depending on length - // first padding byte -- which would be legal if it was by itself - assert_eq!( - DecodeError::InvalidByte(num_quads * 4 + 2, b'='), - decode(&s).unwrap_err() - ); - } -} - -#[test] -fn decode_start_quad_with_padding_returns_error() { - for num_quads in 0..25 { - // add enough padding to ensure that we'll hit all 4 stages at the different lengths - for pad_bytes in 1..32 { - let mut s: String = std::iter::repeat("ABCD").take(num_quads).collect(); - let padding: String = std::iter::repeat("=").take(pad_bytes).collect(); - s.push_str(&padding); - - if pad_bytes % 4 == 1 { - // detected in early length check - assert_eq!(DecodeError::InvalidLength, decode(&s).unwrap_err()); - } else { - // padding lengths 2 - 8 are handled by stage 4 - // padding length >= 8 will hit at least one chunk at stages 1, 2, 3 at different - // prefix lengths - assert_eq!( - DecodeError::InvalidByte(num_quads * 4, b'='), - decode(&s).unwrap_err() - ); - } - } - } -} - -#[test] -fn decode_padding_followed_by_non_padding_returns_error() { - for num_quads in 0..25 { - for pad_bytes in 0..31 { - let mut s: String = std::iter::repeat("ABCD").take(num_quads).collect(); - let padding: String = std::iter::repeat("=").take(pad_bytes).collect(); - s.push_str(&padding); - s.push_str("E"); - - if pad_bytes % 4 == 0 { - assert_eq!(DecodeError::InvalidLength, decode(&s).unwrap_err()); - } else { - // pad len 1 - 8 will be handled by stage 4 - // pad len 9 (suffix len 10) will have 8 bytes of padding handled by stage 3 - // first padding byte - assert_eq!( - DecodeError::InvalidByte(num_quads * 4, b'='), - decode(&s).unwrap_err() - ); - } - } - } -} - -#[test] -fn decode_one_char_in_quad_with_padding_error() { - for num_quads in 0..25 { - let mut s: String = std::iter::repeat("ABCD").take(num_quads).collect(); - s.push_str("E="); - - assert_eq!( - DecodeError::InvalidByte(num_quads * 4 + 1, b'='), - decode(&s).unwrap_err() - ); - - // more padding doesn't change the error - s.push_str("="); - assert_eq!( - DecodeError::InvalidByte(num_quads * 4 + 1, b'='), - decode(&s).unwrap_err() - ); - - s.push_str("="); - assert_eq!( - DecodeError::InvalidByte(num_quads * 4 + 1, b'='), - decode(&s).unwrap_err() - ); - } -} - -#[test] -fn decode_one_char_in_quad_without_padding_error() { - for num_quads in 0..25 { - let mut s: String = std::iter::repeat("ABCD").take(num_quads).collect(); - s.push('E'); - - assert_eq!(DecodeError::InvalidLength, decode(&s).unwrap_err()); - } -} - -#[test] -fn decode_reject_invalid_bytes_with_correct_error() { - for length in 1..100 { - for index in 0_usize..length { - for invalid_byte in " \t\n\r\x0C\x0B\x00%*.".bytes() { - let prefix: String = std::iter::repeat("A").take(index).collect(); - let suffix: String = std::iter::repeat("B").take(length - index - 1).collect(); - - let input = prefix + &String::from_utf8(vec![invalid_byte]).unwrap() + &suffix; - assert_eq!( - length, - input.len(), - "length {} error position {}", - length, - index - ); - - if length % 4 == 1 && !suffix.is_empty() { - assert_eq!(DecodeError::InvalidLength, decode(&input).unwrap_err()); - } else { - assert_eq!( - DecodeError::InvalidByte(index, invalid_byte), - decode(&input).unwrap_err() - ); - } - } - } - } -} - -#[test] -fn decode_imap() { - assert_eq!( - decode_config(b"+,,+", crate::IMAP_MUTF7), - decode_config(b"+//+", crate::STANDARD_NO_PAD) - ); -} - -#[test] -fn decode_invalid_trailing_bytes() { - // The case of trailing newlines is common enough to warrant a test for a good error - // message. - assert_eq!( - Err(DecodeError::InvalidByte(8, b'\n')), - decode(b"Zm9vCg==\n") - ); - // extra padding, however, is still InvalidLength - assert_eq!(Err(DecodeError::InvalidLength), decode(b"Zm9vCg===")); -} - -fn config_std_pad() -> Config { - Config::new(CharacterSet::Standard, true) -} diff -Nru temporalio-1.3.0/vendor/base64-0.13.1/tests/encode.rs temporalio-1.3.0/vendor/base64-0.13.1/tests/encode.rs --- temporalio-1.3.0/vendor/base64-0.13.1/tests/encode.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/base64-0.13.1/tests/encode.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,105 +0,0 @@ -extern crate base64; - -use base64::*; - -fn compare_encode(expected: &str, target: &[u8]) { - assert_eq!(expected, encode(target)); -} - -#[test] -fn encode_rfc4648_0() { - compare_encode("", b""); -} - -#[test] -fn encode_rfc4648_1() { - compare_encode("Zg==", b"f"); -} - -#[test] -fn encode_rfc4648_2() { - compare_encode("Zm8=", b"fo"); -} - -#[test] -fn encode_rfc4648_3() { - compare_encode("Zm9v", b"foo"); -} - -#[test] -fn encode_rfc4648_4() { - compare_encode("Zm9vYg==", b"foob"); -} - -#[test] -fn encode_rfc4648_5() { - compare_encode("Zm9vYmE=", b"fooba"); -} - -#[test] -fn encode_rfc4648_6() { - compare_encode("Zm9vYmFy", b"foobar"); -} - -#[test] -fn encode_all_ascii() { - let mut ascii = Vec::::with_capacity(128); - - for i in 0..128 { - ascii.push(i); - } - - compare_encode( - "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7P\ - D0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn8\ - =", - &ascii, - ); -} - -#[test] -fn encode_all_bytes() { - let mut bytes = Vec::::with_capacity(256); - - for i in 0..255 { - bytes.push(i); - } - bytes.push(255); //bug with "overflowing" ranges? - - compare_encode( - "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7P\ - D0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn\ - +AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6\ - /wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+/w==", - &bytes, - ); -} - -#[test] -fn encode_all_bytes_url() { - let mut bytes = Vec::::with_capacity(256); - - for i in 0..255 { - bytes.push(i); - } - bytes.push(255); //bug with "overflowing" ranges? - - assert_eq!( - "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0\ - -P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn\ - -AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq\ - -wsbKztLW2t7i5uru8vb6_wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t_g4eLj5OXm5-jp6uvs7e7v8PHy\ - 8_T19vf4-fr7_P3-_w==", - encode_config(&bytes, URL_SAFE) - ); -} - -#[test] -fn encode_url_safe_without_padding() { - let encoded = encode_config(b"alice", URL_SAFE_NO_PAD); - assert_eq!(&encoded, "YWxpY2U"); - assert_eq!( - String::from_utf8(decode(&encoded).unwrap()).unwrap(), - "alice" - ); -} diff -Nru temporalio-1.3.0/vendor/base64-0.13.1/tests/helpers.rs temporalio-1.3.0/vendor/base64-0.13.1/tests/helpers.rs --- temporalio-1.3.0/vendor/base64-0.13.1/tests/helpers.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/base64-0.13.1/tests/helpers.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,14 +0,0 @@ -extern crate base64; - -use base64::*; - -pub fn compare_decode(expected: &str, target: &str) { - assert_eq!( - expected, - String::from_utf8(decode(target).unwrap()).unwrap() - ); - assert_eq!( - expected, - String::from_utf8(decode(target.as_bytes()).unwrap()).unwrap() - ); -} diff -Nru temporalio-1.3.0/vendor/base64-0.13.1/tests/tests.rs temporalio-1.3.0/vendor/base64-0.13.1/tests/tests.rs --- temporalio-1.3.0/vendor/base64-0.13.1/tests/tests.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/base64-0.13.1/tests/tests.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,194 +0,0 @@ -extern crate base64; -extern crate rand; - -use rand::{FromEntropy, Rng}; - -use base64::*; - -mod helpers; -use self::helpers::*; - -// generate random contents of the specified length and test encode/decode roundtrip -fn roundtrip_random( - byte_buf: &mut Vec, - str_buf: &mut String, - config: Config, - byte_len: usize, - approx_values_per_byte: u8, - max_rounds: u64, -) { - // let the short ones be short but don't let it get too crazy large - let num_rounds = calculate_number_of_rounds(byte_len, approx_values_per_byte, max_rounds); - let mut r = rand::rngs::SmallRng::from_entropy(); - let mut decode_buf = Vec::new(); - - for _ in 0..num_rounds { - byte_buf.clear(); - str_buf.clear(); - decode_buf.clear(); - while byte_buf.len() < byte_len { - byte_buf.push(r.gen::()); - } - - encode_config_buf(&byte_buf, config, str_buf); - decode_config_buf(&str_buf, config, &mut decode_buf).unwrap(); - - assert_eq!(byte_buf, &decode_buf); - } -} - -fn calculate_number_of_rounds(byte_len: usize, approx_values_per_byte: u8, max: u64) -> u64 { - // don't overflow - let mut prod = approx_values_per_byte as u64; - - for _ in 0..byte_len { - if prod > max { - return max; - } - - prod = prod.saturating_mul(prod); - } - - prod -} - -fn no_pad_config() -> Config { - Config::new(CharacterSet::Standard, false) -} - -#[test] -fn roundtrip_random_short_standard() { - let mut byte_buf: Vec = Vec::new(); - let mut str_buf = String::new(); - - for input_len in 0..40 { - roundtrip_random(&mut byte_buf, &mut str_buf, STANDARD, input_len, 4, 10000); - } -} - -#[test] -fn roundtrip_random_with_fast_loop_standard() { - let mut byte_buf: Vec = Vec::new(); - let mut str_buf = String::new(); - - for input_len in 40..100 { - roundtrip_random(&mut byte_buf, &mut str_buf, STANDARD, input_len, 4, 1000); - } -} - -#[test] -fn roundtrip_random_short_no_padding() { - let mut byte_buf: Vec = Vec::new(); - let mut str_buf = String::new(); - - for input_len in 0..40 { - roundtrip_random( - &mut byte_buf, - &mut str_buf, - no_pad_config(), - input_len, - 4, - 10000, - ); - } -} - -#[test] -fn roundtrip_random_no_padding() { - let mut byte_buf: Vec = Vec::new(); - let mut str_buf = String::new(); - - for input_len in 40..100 { - roundtrip_random( - &mut byte_buf, - &mut str_buf, - no_pad_config(), - input_len, - 4, - 1000, - ); - } -} - -#[test] -fn roundtrip_decode_trailing_10_bytes() { - // This is a special case because we decode 8 byte blocks of input at a time as much as we can, - // ideally unrolled to 32 bytes at a time, in stages 1 and 2. Since we also write a u64's worth - // of bytes (8) to the output, we always write 2 garbage bytes that then will be overwritten by - // the NEXT block. However, if the next block only contains 2 bytes, it will decode to 1 byte, - // and therefore be too short to cover up the trailing 2 garbage bytes. Thus, we have stage 3 - // to handle that case. - - for num_quads in 0..25 { - let mut s: String = std::iter::repeat("ABCD").take(num_quads).collect(); - s.push_str("EFGHIJKLZg"); - - let decoded = decode(&s).unwrap(); - assert_eq!(num_quads * 3 + 7, decoded.len()); - - assert_eq!(s, encode_config(&decoded, STANDARD_NO_PAD)); - } -} - -#[test] -fn display_wrapper_matches_normal_encode() { - let mut bytes = Vec::::with_capacity(256); - - for i in 0..255 { - bytes.push(i); - } - bytes.push(255); - - assert_eq!( - encode(&bytes), - format!( - "{}", - base64::display::Base64Display::with_config(&bytes, STANDARD) - ) - ); -} - -#[test] -fn because_we_can() { - compare_decode("alice", "YWxpY2U="); - compare_decode("alice", &encode(b"alice")); - compare_decode("alice", &encode(&decode(&encode(b"alice")).unwrap())); -} - -#[test] -fn encode_config_slice_can_use_inline_buffer() { - let mut buf: [u8; 22] = [0; 22]; - let mut larger_buf: [u8; 24] = [0; 24]; - let mut input: [u8; 16] = [0; 16]; - - let mut rng = rand::rngs::SmallRng::from_entropy(); - for elt in &mut input { - *elt = rng.gen(); - } - - assert_eq!(22, encode_config_slice(&input, STANDARD_NO_PAD, &mut buf)); - let decoded = decode_config(&buf, STANDARD_NO_PAD).unwrap(); - - assert_eq!(decoded, input); - - // let's try it again with padding - - assert_eq!(24, encode_config_slice(&input, STANDARD, &mut larger_buf)); - let decoded = decode_config(&buf, STANDARD).unwrap(); - - assert_eq!(decoded, input); -} - -#[test] -#[should_panic(expected = "index 24 out of range for slice of length 22")] -fn encode_config_slice_panics_when_buffer_too_small() { - let mut buf: [u8; 22] = [0; 22]; - let mut input: [u8; 16] = [0; 16]; - - let mut rng = rand::rngs::SmallRng::from_entropy(); - for elt in &mut input { - *elt = rng.gen(); - } - - encode_config_slice(&input, STANDARD, &mut buf); -} diff -Nru temporalio-1.3.0/vendor/bitflags/.cargo-checksum.json temporalio-1.3.0/vendor/bitflags/.cargo-checksum.json --- temporalio-1.3.0/vendor/bitflags/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/bitflags/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"CHANGELOG.md":"0905d91abfd8162750daeb51b69e1a4add85cd0e8e2b136a4fd20ea28df4da42","CODE_OF_CONDUCT.md":"42634d0f6d922f49857175af991802822f7f920487aefa2ee250a50d12251a66","CONTRIBUTING.md":"6c9f96eacb20af877ae2d16f024904f3038b93448a8488e9dbcac0df7f6439a5","Cargo.lock":"fb581ed64bd34dbdbcc2386c394394d5f46db3186edc7b129f1669cef66a0b57","Cargo.toml":"418f0ef5e370bf88b0d7bd8c3b2f25b533ae2b671036d30f7c524dc39133045c","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","README.md":"a403792a6099aeda15dc7bf3da529409652039b5dd2227dfc5549bd2f3fad7db","SECURITY.md":"68704c8128fa2e776ed7cbda741fbf61ad52f998a96350ee7ee4dbf64c6573bc","benches/parse.rs":"f1390d62322c6880d65bd931e183d49b313f287879a6bfaa36b1cb1921090b51","examples/custom_bits_type.rs":"e53b32051adc5d97860e0b48c8f3a301a041d73b4939c0d7caa5f0cfcc0b9739","examples/custom_derive.rs":"29dd7b845345a103ca31e91b579aeb01fb74935b8223c29184eb42223edadb65","examples/fmt.rs":"87ba37a1fb8528570c74ea26d8e8948e1179c3d867b928bea1080880258e0a99","examples/macro_free.rs":"69e7f284b53b5214d51228a686e87f127b52a3b74711e45537ebfa5583a180e5","examples/serde.rs":"08b21b35d5c10fdca132fe0f36c8067bb44f559e96617a9257ab6316a20cbc75","spec.md":"fcdd939df30c59b0643be09027df664b71cbea9b9989185441482c5576160fed","src/example_generated.rs":"d018caf059f6ffc4c2403b771a6d76679fa5af03c329a91bd9252957df695e7f","src/external.rs":"11599248db17d395c6b45bf2400266f221d3eb1523908e5f17715964bf8d99ed","src/external/arbitrary.rs":"fa8c9187028b9bc54856977b0914676f62101010e7a9450abd577fd78c89552f","src/external/bytemuck.rs":"3afcef382122867040fddd5e4153d633d1ed5596fe5d7dfac66a8e61c2513df5","src/external/serde.rs":"4a09db12534a20fe554a08dc5f1c8124b379292d41fa75628abcd2ca21587573","src/internal.rs":"fd939154cbebf43bfc329a4a3cd08618ca30a6a5f6e6abea07d23f75bf5b3b2d","src/iter.rs":"dbaa6437c1c044f689185ce3fafe43df8796bed19bbdd2c20334a52de5eeee73","src/lib.rs":"e45c07f43b0e142c41e99de8d20ceb909148762c876d765c11ac8b8ceaca0af5","src/parser.rs":"52f6352620ce3d5973bc38b42d56a760307294162c9d5668eb774eb92a6ef941","src/public.rs":"72b41639711bab95e8e75f37401a487088e7be1a427715cea40563fb3f64ed60","src/tests.rs":"b120c27ff0c67a819527de9d8171f1f4c5d37ba4009c54abeb869c70e6035f14","src/traits.rs":"0a8764c3e2378043e2724cf1bfc514d4ff1985026db33509f6451a7897e2675d"},"package":"327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07"} \ No newline at end of file +{"files":{"CHANGELOG.md":"233d0b9c9c8e2c89cd0e0dc225a3cf76c0a6fae357d2a02743fb4dff09286194","CODE_OF_CONDUCT.md":"42634d0f6d922f49857175af991802822f7f920487aefa2ee250a50d12251a66","CONTRIBUTING.md":"6c9f96eacb20af877ae2d16f024904f3038b93448a8488e9dbcac0df7f6439a5","Cargo.lock":"4db44aa18134aa14828cc0f99ff4329fbc9026dc89bb0503b9dc054d9ab62bc6","Cargo.toml":"6e552ff8a664536eb76313b23c84e895c0ce364506acace410c80d67b335a6cb","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","README.md":"892ef45ec866633a928ad55f3083fe71fb5d311ea9f5ca2f4ba7d680f50ad724","SECURITY.md":"68704c8128fa2e776ed7cbda741fbf61ad52f998a96350ee7ee4dbf64c6573bc","benches/parse.rs":"f1390d62322c6880d65bd931e183d49b313f287879a6bfaa36b1cb1921090b51","examples/custom_bits_type.rs":"e53b32051adc5d97860e0b48c8f3a301a041d73b4939c0d7caa5f0cfcc0b9739","examples/custom_derive.rs":"29dd7b845345a103ca31e91b579aeb01fb74935b8223c29184eb42223edadb65","examples/fmt.rs":"87ba37a1fb8528570c74ea26d8e8948e1179c3d867b928bea1080880258e0a99","examples/macro_free.rs":"69e7f284b53b5214d51228a686e87f127b52a3b74711e45537ebfa5583a180e5","examples/serde.rs":"08b21b35d5c10fdca132fe0f36c8067bb44f559e96617a9257ab6316a20cbc75","spec.md":"fcdd939df30c59b0643be09027df664b71cbea9b9989185441482c5576160fed","src/example_generated.rs":"d018caf059f6ffc4c2403b771a6d76679fa5af03c329a91bd9252957df695e7f","src/external.rs":"11599248db17d395c6b45bf2400266f221d3eb1523908e5f17715964bf8d99ed","src/external/arbitrary.rs":"fa8c9187028b9bc54856977b0914676f62101010e7a9450abd577fd78c89552f","src/external/bytemuck.rs":"3afcef382122867040fddd5e4153d633d1ed5596fe5d7dfac66a8e61c2513df5","src/external/serde.rs":"4a09db12534a20fe554a08dc5f1c8124b379292d41fa75628abcd2ca21587573","src/internal.rs":"fd939154cbebf43bfc329a4a3cd08618ca30a6a5f6e6abea07d23f75bf5b3b2d","src/iter.rs":"dbaa6437c1c044f689185ce3fafe43df8796bed19bbdd2c20334a52de5eeee73","src/lib.rs":"28d42a2e573955ab816b937f8024f2bfc97663647558ace10914c224f4ddd296","src/parser.rs":"52f6352620ce3d5973bc38b42d56a760307294162c9d5668eb774eb92a6ef941","src/public.rs":"72b41639711bab95e8e75f37401a487088e7be1a427715cea40563fb3f64ed60","src/tests.rs":"b120c27ff0c67a819527de9d8171f1f4c5d37ba4009c54abeb869c70e6035f14","src/traits.rs":"0a8764c3e2378043e2724cf1bfc514d4ff1985026db33509f6451a7897e2675d"},"package":"b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/bitflags/Cargo.lock temporalio-1.3.0/vendor/bitflags/Cargo.lock --- temporalio-1.3.0/vendor/bitflags/Cargo.lock 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/bitflags/Cargo.lock 2023-10-30 19:40:00.000000000 +0000 @@ -4,9 +4,9 @@ [[package]] name = "arbitrary" -version = "1.3.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2e1373abdaa212b704512ec2bd8b26bd0b7d5c3f70117411a5d9a451383c859" +checksum = "e2d098ff73c1ca148721f37baad5ea6a465a13f9573aba8641fbbbae8164a54e" dependencies = [ "derive_arbitrary", ] @@ -22,7 +22,7 @@ [[package]] name = "bitflags" -version = "2.4.1" +version = "2.4.0" dependencies = [ "arbitrary", "bytemuck", @@ -39,18 +39,18 @@ [[package]] name = "bytemuck" -version = "1.14.0" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "374d28ec25809ee0e23827c2ab573d729e293f281dfe393500e7ad618baa61c6" +checksum = "17febce684fd15d89027105661fec94afb475cb995fbc59d2865198446ba2eea" dependencies = [ "bytemuck_derive", ] [[package]] name = "bytemuck_derive" -version = "1.5.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "965ab7eb5f8f97d2a083c799f3a1b994fc397b2fe2da5d1da1626ce15a39f2b1" +checksum = "fdde5c9cd29ebd706ce1b35600920a33550e402fc998a2e53ad3b42c3c47a192" dependencies = [ "proc-macro2", "quote", @@ -59,15 +59,15 @@ [[package]] name = "byteorder" -version = "1.5.0" +version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" [[package]] name = "compiler_builtins" -version = "0.1.101" +version = "0.1.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01a6d58e9c3408138099a396a98fd0d0e6cfb25d723594d2ae48b5004513fd5b" +checksum = "d6c0f24437059853f0fa64afc51f338f93647a3de4cf3358ba1bb4171a199775" [[package]] name = "derive_arbitrary" @@ -100,18 +100,18 @@ [[package]] name = "proc-macro2" -version = "1.0.69" +version = "1.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da" +checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.33" +version = "1.0.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +checksum = "50f3b39ccfb720540debaa0164757101c08ecb8d326b15358ce76a62c7e85965" dependencies = [ "proc-macro2", ] @@ -136,18 +136,15 @@ [[package]] name = "serde" -version = "1.0.189" +version = "1.0.183" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e422a44e74ad4001bdc8eede9a4570ab52f71190e9c076d14369f38b9200537" -dependencies = [ - "serde_derive", -] +checksum = "32ac8da02677876d532745a130fc9d8e6edfa81a269b107c5b00829b91d8eb3c" [[package]] name = "serde_derive" -version = "1.0.189" +version = "1.0.183" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e48d1f918009ce3145511378cf68d613e3b3d9137d67272562080d68a2b32d5" +checksum = "aafe972d60b0b9bee71a91b92fee2d4fb3c9d7e8f6b179aa99f27203d99a4816" dependencies = [ "proc-macro2", "quote", @@ -156,9 +153,9 @@ [[package]] name = "serde_json" -version = "1.0.107" +version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b420ce6e3d8bd882e9b243c6eed35dbc9a6110c9769e74b584e0d68d1f20c65" +checksum = "076066c5f1078eac5b722a31827a8832fe108bed65dfa75e233c89f8206e976c" dependencies = [ "itoa", "ryu", @@ -176,9 +173,9 @@ [[package]] name = "syn" -version = "2.0.38" +version = "2.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e96b79aaa137db8f61e26363a0c9b47d8b4ec75da28b7d1d614c2303e232408b" +checksum = "04361975b3f5e348b2189d8dc55bc942f278b2d482a6a0365de5bdd62d351567" dependencies = [ "proc-macro2", "quote", @@ -187,18 +184,18 @@ [[package]] name = "termcolor" -version = "1.3.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6093bad37da69aab9d123a8091e4be0aa4a03e4d601ec641c327398315f62b64" +checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" dependencies = [ "winapi-util", ] [[package]] name = "trybuild" -version = "1.0.85" +version = "1.0.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "196a58260a906cedb9bf6d8034b6379d0c11f552416960452f267402ceeddff1" +checksum = "a84e0202ea606ba5ebee8507ab2bfbe89b98551ed9b8f0be198109275cff284b" dependencies = [ "basic-toml", "glob", @@ -211,9 +208,9 @@ [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" [[package]] name = "winapi" @@ -233,9 +230,9 @@ [[package]] name = "winapi-util" -version = "0.1.6" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" dependencies = [ "winapi", ] @@ -248,9 +245,9 @@ [[package]] name = "zerocopy" -version = "0.6.4" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20707b61725734c595e840fb3704378a0cd2b9c74cc9e6e20724838fc6a1e2f9" +checksum = "f3b9c234616391070b0b173963ebc65a9195068e7ed3731c6edac2ec45ebe106" dependencies = [ "byteorder", "zerocopy-derive", @@ -258,9 +255,9 @@ [[package]] name = "zerocopy-derive" -version = "0.6.4" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56097d5b91d711293a42be9289403896b68654625021732067eac7a4ca388a1f" +checksum = "8f7f3a471f98d0a61c34322fbbfd10c384b07687f680d4119813713f72308d91" dependencies = [ "proc-macro2", "quote", diff -Nru temporalio-1.3.0/vendor/bitflags/Cargo.toml temporalio-1.3.0/vendor/bitflags/Cargo.toml --- temporalio-1.3.0/vendor/bitflags/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/bitflags/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -13,7 +13,7 @@ edition = "2021" rust-version = "1.56.0" name = "bitflags" -version = "2.4.1" +version = "2.4.0" authors = ["The Rust Project Developers"] exclude = [ "tests", diff -Nru temporalio-1.3.0/vendor/bitflags/CHANGELOG.md temporalio-1.3.0/vendor/bitflags/CHANGELOG.md --- temporalio-1.3.0/vendor/bitflags/CHANGELOG.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/bitflags/CHANGELOG.md 2023-10-30 19:40:00.000000000 +0000 @@ -1,10 +1,3 @@ -# 2.4.1 - -## What's Changed -* Allow some new pedantic clippy lints by @KodrAus in https://github.com/bitflags/bitflags/pull/380 - -**Full Changelog**: https://github.com/bitflags/bitflags/compare/2.4.0...2.4.1 - # 2.4.0 ## What's Changed diff -Nru temporalio-1.3.0/vendor/bitflags/README.md temporalio-1.3.0/vendor/bitflags/README.md --- temporalio-1.3.0/vendor/bitflags/README.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/bitflags/README.md 2023-10-30 19:40:00.000000000 +0000 @@ -28,7 +28,7 @@ ```toml [dependencies] -bitflags = "2.4.1" +bitflags = "2.4.0" ``` and this to your source code: @@ -46,17 +46,11 @@ // The `bitflags!` macro generates `struct`s that manage a set of flags. bitflags! { - /// Represents a set of flags. #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] struct Flags: u32 { - /// The value `A`, at bit position `0`. const A = 0b00000001; - /// The value `B`, at bit position `1`. const B = 0b00000010; - /// The value `C`, at bit position `2`. const C = 0b00000100; - - /// The combination of `A`, `B`, and `C`. const ABC = Self::A.bits() | Self::B.bits() | Self::C.bits(); } } diff -Nru temporalio-1.3.0/vendor/bitflags/src/lib.rs temporalio-1.3.0/vendor/bitflags/src/lib.rs --- temporalio-1.3.0/vendor/bitflags/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/bitflags/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -17,7 +17,7 @@ ```toml [dependencies.bitflags] -version = "2.4.1" +version = "2.4.0" ``` ## Generating flags types @@ -481,8 +481,7 @@ non_upper_case_globals, clippy::assign_op_pattern, clippy::indexing_slicing, - clippy::same_name_method, - clippy::iter_without_into_iter, + clippy::same_name_method )] const _: () = { // Declared in a "hidden" scope that can't be reached directly @@ -554,8 +553,7 @@ unused_mut, unused_imports, non_upper_case_globals, - clippy::assign_op_pattern, - clippy::iter_without_into_iter, + clippy::assign_op_pattern )] const _: () = { __impl_public_bitflags! { diff -Nru temporalio-1.3.0/vendor/bumpalo/.cargo-checksum.json temporalio-1.3.0/vendor/bumpalo/.cargo-checksum.json --- temporalio-1.3.0/vendor/bumpalo/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/bumpalo/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"CHANGELOG.md":"2f3f6b5ae0beb2a5c97b3271ebd9d758b1f0d1cb303c035864668f7ebce8f66e","Cargo.toml":"0d9e665909b9251cefa7a045467396046b311cd39d67ad665272bc3faaee0b68","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"65f94e99ddaf4f5d1782a6dae23f35d4293a9a01444a13135a6887017d353cee","README.md":"2d137262a09477a0f46cd5383c6fb858649532e7c53a7de82cfc9145690f4f27","src/alloc.rs":"3a9645d9e8db1f2a8549ee928cafa5263a828f25c88ce4d2b07996ecc14bfa81","src/boxed.rs":"5fc935f8e1a7bc1b8f6a39b2bcc4355a2be4743f2308fe3ffd557455a3a27cb2","src/collections/collect_in.rs":"0588a4ff3967a4323abb4218bbd615af4b123639ab4fae9130c6590c258b3d15","src/collections/mod.rs":"d58dc46eb4f9fcdde574f09bc5b8646f53e42d49c169561d98e0c23e5b36848a","src/collections/raw_vec.rs":"8829cc9a693fde38aa93e47a7bbbc2dac247620d07f60519f2e6cb44f5494bc5","src/collections/str/lossy.rs":"c5d62b16e01071e2a574ae41ef6693ad12f1e6c786c5d38f7a13ebd6cb23c088","src/collections/str/mod.rs":"d82a8bd417fbf52a589d89a16ea2a0ac4f6ac920c3976ab1f5b6ac0c8493c4f2","src/collections/string.rs":"388d39b999788baf5c14ccc3f5cb57da728060ea3295ddfc28f0f2e1ca5858ec","src/collections/vec.rs":"c500cdfcf5b41bb5816c9984bf8b97ac2cec98a537dcb3178bfbf6e2219d4392","src/lib.rs":"d4b867af1cbe15b040aa56a4256458cfceebff9f11dd5aaf4c3dc15ccc251515"},"package":"7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec"} \ No newline at end of file +{"files":{"CHANGELOG.md":"0d910c4e21c0e6cb07753a942af001f0b8b3e34f1c1ad9ae9d0f150351f4ca28","Cargo.toml":"c1473a43df40e39c90e58d0d604279b1958768330b600a1899aebdc1d6162a38","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"65f94e99ddaf4f5d1782a6dae23f35d4293a9a01444a13135a6887017d353cee","README.md":"e5fb332ab51aed303b6c94ebad5c817fd7108285e671e0c4e7d67aa2909cd182","src/alloc.rs":"3a9645d9e8db1f2a8549ee928cafa5263a828f25c88ce4d2b07996ecc14bfa81","src/boxed.rs":"5fc935f8e1a7bc1b8f6a39b2bcc4355a2be4743f2308fe3ffd557455a3a27cb2","src/collections/collect_in.rs":"0588a4ff3967a4323abb4218bbd615af4b123639ab4fae9130c6590c258b3d15","src/collections/mod.rs":"d58dc46eb4f9fcdde574f09bc5b8646f53e42d49c169561d98e0c23e5b36848a","src/collections/raw_vec.rs":"8829cc9a693fde38aa93e47a7bbbc2dac247620d07f60519f2e6cb44f5494bc5","src/collections/str/lossy.rs":"c5d62b16e01071e2a574ae41ef6693ad12f1e6c786c5d38f7a13ebd6cb23c088","src/collections/str/mod.rs":"d82a8bd417fbf52a589d89a16ea2a0ac4f6ac920c3976ab1f5b6ac0c8493c4f2","src/collections/string.rs":"388d39b999788baf5c14ccc3f5cb57da728060ea3295ddfc28f0f2e1ca5858ec","src/collections/vec.rs":"2eaf52e085e6d04767e97b224e82688dd0debd231c6536d6034f431376aa8bf0","src/lib.rs":"0e88d5a3272a4e4f9a94f60824cf9f07ce7fcdfcd4b11794d804c8277cf1d917"},"package":"a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/bumpalo/Cargo.toml temporalio-1.3.0/vendor/bumpalo/Cargo.toml --- temporalio-1.3.0/vendor/bumpalo/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/bumpalo/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -13,7 +13,7 @@ edition = "2021" rust-version = "1.60.0" name = "bumpalo" -version = "3.14.0" +version = "3.13.0" authors = ["Nick Fitzgerald "] exclude = [ "/.github/*", @@ -30,7 +30,7 @@ "rust-patterns", "no-std", ] -license = "MIT OR Apache-2.0" +license = "MIT/Apache-2.0" repository = "https://github.com/fitzgen/bumpalo" [package.metadata.docs.rs] @@ -70,4 +70,3 @@ boxed = [] collections = [] default = [] -std = [] diff -Nru temporalio-1.3.0/vendor/bumpalo/CHANGELOG.md temporalio-1.3.0/vendor/bumpalo/CHANGELOG.md --- temporalio-1.3.0/vendor/bumpalo/CHANGELOG.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/bumpalo/CHANGELOG.md 2023-10-30 19:40:00.000000000 +0000 @@ -28,18 +28,6 @@ -------------------------------------------------------------------------------- -## 3.14.0 - -Released 2023-09-14. - -### Added - -* Added the `std` cargo feature, which enables implementations of `std` traits - for various things. Right now that is just `std::io::Write` for - `bumpalo::collections::Vec`, but could be more in the future. - --------------------------------------------------------------------------------- - ## 3.13.0 Released 2023-05-22. @@ -542,7 +530,7 @@ from the allocated chunks are slightly different from the old `each_allocated_chunk`: only up to 16-byte alignment is supported now. If you allocate anything with greater alignment than that into the bump arena, there - might be uninitialized padding inserted in the chunks, and therefore it is no + might be uninitilized padding inserted in the chunks, and therefore it is no longer safe to read them via `MaybeUninit::assume_init`. See also the note about bump direction in the "changed" section; if you're iterating chunks, you're likely affected by that change! @@ -581,7 +569,7 @@ * Fixed a bug where chunks were always deallocated with the default chunk layout, not the layout that the chunk was actually allocated with (i.e. if we - started growing larger chunks with larger layouts, we would deallocate those + started growing largers chunks with larger layouts, we would deallocate those chunks with an incorrect layout). -------------------------------------------------------------------------------- diff -Nru temporalio-1.3.0/vendor/bumpalo/README.md temporalio-1.3.0/vendor/bumpalo/README.md --- temporalio-1.3.0/vendor/bumpalo/README.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/bumpalo/README.md 2023-10-30 19:40:00.000000000 +0000 @@ -155,14 +155,7 @@ ### `#![no_std]` Support -Bumpalo is a `no_std` crate by default. It depends only on the `alloc` and `core` crates. - -### `std` Support - -You can optionally decide to enable the `std` feature in order to enable some -std only trait implementations for some collections: - -* `std::io::Write` for `Vec<'bump, u8>` +Bumpalo is a `no_std` crate. It depends only on the `alloc` and `core` crates. ### Thread support @@ -186,7 +179,7 @@ ```toml [dependencies] -bumpalo = { version = "3", features = ["allocator_api"] } +bumpalo = { version = "3.9", features = ["allocator_api"] } ``` Next, enable the `allocator_api` nightly Rust feature in your `src/lib.rs` or diff -Nru temporalio-1.3.0/vendor/bumpalo/src/collections/vec.rs temporalio-1.3.0/vendor/bumpalo/src/collections/vec.rs --- temporalio-1.3.0/vendor/bumpalo/src/collections/vec.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/bumpalo/src/collections/vec.rs 2023-10-30 19:40:00.000000000 +0000 @@ -104,8 +104,6 @@ use core::ptr; use core::ptr::NonNull; use core::slice; -#[cfg(feature = "std")] -use std::io; unsafe fn arith_offset(p: *const T, offset: isize) -> *const T { p.offset(offset) @@ -2614,23 +2612,3 @@ } } } - -#[cfg(feature = "std")] -impl<'bump> io::Write for Vec<'bump, u8> { - #[inline] - fn write(&mut self, buf: &[u8]) -> io::Result { - self.extend_from_slice(buf); - Ok(buf.len()) - } - - #[inline] - fn write_all(&mut self, buf: &[u8]) -> io::Result<()> { - self.extend_from_slice(buf); - Ok(()) - } - - #[inline] - fn flush(&mut self) -> io::Result<()> { - Ok(()) - } -} diff -Nru temporalio-1.3.0/vendor/bumpalo/src/lib.rs temporalio-1.3.0/vendor/bumpalo/src/lib.rs --- temporalio-1.3.0/vendor/bumpalo/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/bumpalo/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,7 +1,7 @@ #![doc = include_str!("../README.md")] #![deny(missing_debug_implementations)] #![deny(missing_docs)] -#![cfg_attr(not(feature = "std"), no_std)] +#![no_std] #![cfg_attr(feature = "allocator_api", feature(allocator_api))] #[doc(hidden)] @@ -1430,7 +1430,7 @@ let aligned_ptr = ptr.wrapping_sub(rem); if aligned_ptr >= start { - let aligned_ptr = NonNull::new_unchecked(aligned_ptr); + let aligned_ptr = NonNull::new_unchecked(aligned_ptr as *mut u8); footer.ptr.set(aligned_ptr); Some(aligned_ptr) } else { @@ -1455,7 +1455,7 @@ let current_footer = self.current_chunk_footer.get(); let current_footer = unsafe { current_footer.as_ref() }; - current_footer.ptr.get().as_ptr() as usize - current_footer.data.as_ptr() as usize + current_footer as *const _ as usize - current_footer.data.as_ptr() as usize } /// Slow path allocation for when we need to allocate a new chunk from the @@ -1529,7 +1529,7 @@ ptr, new_footer ); - let ptr = NonNull::new_unchecked(ptr); + let ptr = NonNull::new_unchecked(ptr as *mut u8); new_footer.ptr.set(ptr); // Return a pointer to the freshly allocated region in this chunk. diff -Nru temporalio-1.3.0/vendor/byteorder/benches/bench.rs temporalio-1.3.0/vendor/byteorder/benches/bench.rs --- temporalio-1.3.0/vendor/byteorder/benches/bench.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/byteorder/benches/bench.rs 2023-10-30 19:40:00.000000000 +0000 @@ -321,6 +321,4 @@ }; } -bench_slice!(slice_u16, u16, read_u16_into, write_u16_into); bench_slice!(slice_u64, u64, read_u64_into, write_u64_into); -bench_slice!(slice_i64, i64, read_i64_into, write_i64_into); diff -Nru temporalio-1.3.0/vendor/byteorder/.cargo-checksum.json temporalio-1.3.0/vendor/byteorder/.cargo-checksum.json --- temporalio-1.3.0/vendor/byteorder/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/byteorder/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"CHANGELOG.md":"c1cb69be6db5933c4bb4ebb6591e0fe3e7b97d491face3abcf947383c218bb31","COPYING":"01c266bced4a434da0051174d6bee16a4c82cf634e2679b6155d40d75012390f","Cargo.toml":"94ba374cb26f3c68fb83da2e5e7dce85920fc4fb827620b06b39d71a9d0e1e18","LICENSE-MIT":"0f96a83840e146e43c0ec96a22ec1f392e0680e6c1226e6f3ba87e0740af850f","README.md":"2f2d64924c35b7203e3e3f3d136fcb714281762d145ca3513246da5547b1d014","UNLICENSE":"7e12e5df4bae12cb21581ba157ced20e1986a0508dd10d0e8a4ab9a4cf94e85c","benches/bench.rs":"8b114080042d3292ec8de425904e4114b7f532fe3add0d807521e6cc166a17ea","rustfmt.toml":"1ca600239a27401c4a43f363cf3f38183a212affc1f31bff3ae93234bbaec228","src/io.rs":"9612530634d0e7ce9887a23836b58c0d972c1f45b05d9ada8355961567075627","src/lib.rs":"ab3394c385b32457795931440cfb8dbca70ba5d9e1a428fcf651f7ccb2d6c34f"},"package":"1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"} \ No newline at end of file +{"files":{"CHANGELOG.md":"3a745d94ee9dce0d9dc638c02078cd5001d3d9d12d58b4f220c0101e32cfc16a","COPYING":"01c266bced4a434da0051174d6bee16a4c82cf634e2679b6155d40d75012390f","Cargo.toml":"8585455e5a0e638cf5d489a21e286e93680f835cb8a13595918b5eb7c8c7f212","LICENSE-MIT":"0f96a83840e146e43c0ec96a22ec1f392e0680e6c1226e6f3ba87e0740af850f","README.md":"9d57556868344534de2489317e3c6bb611348ecd44438dcb982bd8d2a55a5a1b","UNLICENSE":"7e12e5df4bae12cb21581ba157ced20e1986a0508dd10d0e8a4ab9a4cf94e85c","benches/bench.rs":"a80bf3cd446c9b6c0cca3865c4de047bdf4644b74cdf696822f8ff87adfa1fca","rustfmt.toml":"1ca600239a27401c4a43f363cf3f38183a212affc1f31bff3ae93234bbaec228","src/io.rs":"9612530634d0e7ce9887a23836b58c0d972c1f45b05d9ada8355961567075627","src/lib.rs":"813ce6a8beafee3fd4e63325d783108aa02e8c57e412bc97580191d84082fbc9"},"package":"14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/byteorder/Cargo.toml temporalio-1.3.0/vendor/byteorder/Cargo.toml --- temporalio-1.3.0/vendor/byteorder/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/byteorder/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -3,44 +3,33 @@ # 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. +# 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. +# If you believe there's an error in this file please file an +# issue against the rust-lang/cargo repository. If you're +# editing this file be aware that the upstream Cargo.toml +# will likely look very different (and much more reasonable) [package] -edition = "2021" -rust-version = "1.60" +edition = "2018" name = "byteorder" -version = "1.5.0" +version = "1.4.3" authors = ["Andrew Gallant "] +exclude = ["/ci/*"] description = "Library for reading/writing numbers in big-endian and little-endian." homepage = "https://github.com/BurntSushi/byteorder" documentation = "https://docs.rs/byteorder" readme = "README.md" -keywords = [ - "byte", - "endian", - "big-endian", - "little-endian", - "binary", -] -categories = [ - "encoding", - "parsing", - "no-std", -] +keywords = ["byte", "endian", "big-endian", "little-endian", "binary"] +categories = ["encoding", "parsing", "no-std"] license = "Unlicense OR MIT" repository = "https://github.com/BurntSushi/byteorder" - [profile.bench] opt-level = 3 [lib] name = "byteorder" bench = false - [dev-dependencies.quickcheck] version = "0.9.2" default-features = false diff -Nru temporalio-1.3.0/vendor/byteorder/CHANGELOG.md temporalio-1.3.0/vendor/byteorder/CHANGELOG.md --- temporalio-1.3.0/vendor/byteorder/CHANGELOG.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/byteorder/CHANGELOG.md 2023-10-30 19:40:00.000000000 +0000 @@ -1,7 +1,3 @@ -**WARNING:** This CHANGELOG is no longer updated. The activity for this project -is sparse enough that you should refer to the commit log instead. - - 1.3.4 ===== This patch release squashes deprecation warnings for the `try!` macro, in diff -Nru temporalio-1.3.0/vendor/byteorder/README.md temporalio-1.3.0/vendor/byteorder/README.md --- temporalio-1.3.0/vendor/byteorder/README.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/byteorder/README.md 2023-10-30 19:40:00.000000000 +0000 @@ -4,7 +4,7 @@ numbers in either big-endian or little-endian order. [![Build status](https://github.com/BurntSushi/byteorder/workflows/ci/badge.svg)](https://github.com/BurntSushi/byteorder/actions) -[![crates.io](https://img.shields.io/crates/v/byteorder.svg)](https://crates.io/crates/byteorder) +[![](https://meritbadge.herokuapp.com/byteorder)](https://crates.io/crates/byteorder) Dual-licensed under MIT or the [UNLICENSE](https://unlicense.org/). @@ -56,20 +56,6 @@ ``` -### Minimum Rust version policy - -This crate's minimum supported `rustc` version is `1.60.0`. - -The current policy is that the minimum Rust version required to use this crate -can be increased in minor version updates. For example, if `crate 1.0` requires -Rust 1.20.0, then `crate 1.0.z` for all values of `z` will also require Rust -1.20.0 or newer. However, `crate 1.y` for `y > 0` may require a newer minimum -version of Rust. - -In general, this crate will be conservative with respect to the minimum -supported version of Rust. - - ### Alternatives Note that as of Rust 1.32, the standard numeric types provide built-in methods diff -Nru temporalio-1.3.0/vendor/byteorder/src/lib.rs temporalio-1.3.0/vendor/byteorder/src/lib.rs --- temporalio-1.3.0/vendor/byteorder/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/byteorder/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -69,13 +69,9 @@ #![deny(missing_docs)] #![cfg_attr(not(feature = "std"), no_std)] -// When testing under miri, we disable tests that take too long. But this -// provokes lots of dead code warnings. So we just squash them. -#![cfg_attr(miri, allow(dead_code, unused_macros))] use core::{ - convert::TryInto, fmt::Debug, hash::Hash, mem::align_of, - ptr::copy_nonoverlapping, slice, + convert::TryInto, fmt::Debug, hash::Hash, ptr::copy_nonoverlapping, slice, }; #[cfg(feature = "std")] @@ -1206,7 +1202,6 @@ #[inline] fn read_f32_into(src: &[u8], dst: &mut [f32]) { let dst = unsafe { - const _: () = assert!(align_of::() <= align_of::()); slice::from_raw_parts_mut(dst.as_mut_ptr() as *mut u32, dst.len()) }; Self::read_u32_into(src, dst); @@ -1268,7 +1263,6 @@ #[inline] fn read_f64_into(src: &[u8], dst: &mut [f64]) { let dst = unsafe { - const _: () = assert!(align_of::() <= align_of::()); slice::from_raw_parts_mut(dst.as_mut_ptr() as *mut u64, dst.len()) }; Self::read_u64_into(src, dst); @@ -1901,36 +1895,74 @@ #[cfg(target_endian = "big")] pub type NativeEndian = BigEndian; -/// Copies a &[u8] $src into a &mut [$ty] $dst for the endianness given by -/// $from_bytes (must be either from_be_bytes or from_le_bytes). +/// Copies $size bytes from a number $n to a &mut [u8] $dst. $ty represents the +/// numeric type of $n and $which must be either to_be or to_le, depending on +/// which endianness one wants to use when writing to $dst. +/// +/// This macro is only safe to call when $ty is a numeric type and $size == +/// size_of::<$ty>() and where $dst is a &mut [u8]. +macro_rules! unsafe_write_num_bytes { + ($ty:ty, $size:expr, $n:expr, $dst:expr, $which:ident) => {{ + assert!($size <= $dst.len()); + unsafe { + // N.B. https://github.com/rust-lang/rust/issues/22776 + let bytes = *(&$n.$which() as *const _ as *const [u8; $size]); + copy_nonoverlapping((&bytes).as_ptr(), $dst.as_mut_ptr(), $size); + } + }}; +} + +/// Copies a &[u8] $src into a &mut [] $dst for the endianness given +/// by $which (must be either to_be or to_le). /// -/// Panics if $src.len() != $dst.len() * size_of::<$ty>(). -macro_rules! read_slice { - ($src:expr, $dst:expr, $ty:ty, $from_bytes:ident) => {{ - const SIZE: usize = core::mem::size_of::<$ty>(); - // Check types: - let src: &[u8] = $src; - let dst: &mut [$ty] = $dst; - assert_eq!(src.len(), dst.len() * SIZE); - for (src, dst) in src.chunks_exact(SIZE).zip(dst.iter_mut()) { - *dst = <$ty>::$from_bytes(src.try_into().unwrap()); +/// This macro is only safe to call when $src and $dst are &[u8] and &mut [u8], +/// respectively. The macro will panic if $src.len() != $size * $dst.len(), +/// where $size represents the size of the integers encoded in $src. +macro_rules! unsafe_read_slice { + ($src:expr, $dst:expr, $size:expr, $which:ident) => {{ + assert_eq!($src.len(), $size * $dst.len()); + + unsafe { + copy_nonoverlapping( + $src.as_ptr(), + $dst.as_mut_ptr() as *mut u8, + $src.len(), + ); + } + for v in $dst.iter_mut() { + *v = v.$which(); } }}; } -/// Copies a &[$ty] $src into a &mut [u8] $dst for the endianness given by -/// $from_bytes (must be either from_be_bytes or from_le_bytes). +/// Copies a &[$ty] $src into a &mut [u8] $dst, where $ty must be a numeric +/// type. This panics if size_of::<$ty>() * $src.len() != $dst.len(). /// -/// Panics if $src.len() * size_of::<$ty>() != $dst.len(). +/// This macro is only safe to call when $src is a slice of numeric types and +/// $dst is a &mut [u8] and where $ty represents the type of the integers in +/// $src. +macro_rules! unsafe_write_slice_native { + ($src:expr, $dst:expr, $ty:ty) => {{ + let size = core::mem::size_of::<$ty>(); + assert_eq!(size * $src.len(), $dst.len()); + + unsafe { + copy_nonoverlapping( + $src.as_ptr() as *const u8, + $dst.as_mut_ptr(), + $dst.len(), + ); + } + }}; +} + macro_rules! write_slice { - ($src:expr, $dst:expr, $ty:ty, $to_bytes:ident) => {{ - const SIZE: usize = core::mem::size_of::<$ty>(); - // Check types: - let src: &[$ty] = $src; - let dst: &mut [u8] = $dst; - assert_eq!(src.len() * SIZE, dst.len()); - for (src, dst) in src.iter().zip(dst.chunks_exact_mut(SIZE)) { - dst.copy_from_slice(&src.$to_bytes()); + ($src:expr, $dst:expr, $ty:ty, $size:expr, $write:expr) => {{ + assert!($size == ::core::mem::size_of::<$ty>()); + assert_eq!($size * $src.len(), $dst.len()); + + for (&n, chunk) in $src.iter().zip($dst.chunks_mut($size)) { + $write(chunk, n); } }}; } @@ -1958,40 +1990,52 @@ #[inline] fn read_uint(buf: &[u8], nbytes: usize) -> u64 { - let mut out = [0; 8]; - assert!(1 <= nbytes && nbytes <= out.len() && nbytes <= buf.len()); - let start = out.len() - nbytes; - out[start..].copy_from_slice(&buf[..nbytes]); - u64::from_be_bytes(out) + assert!(1 <= nbytes && nbytes <= 8 && nbytes <= buf.len()); + let mut out = 0u64; + let ptr_out = &mut out as *mut u64 as *mut u8; + unsafe { + copy_nonoverlapping( + buf.as_ptr(), + ptr_out.offset((8 - nbytes) as isize), + nbytes, + ); + } + out.to_be() } #[inline] fn read_uint128(buf: &[u8], nbytes: usize) -> u128 { - let mut out = [0; 16]; - assert!(1 <= nbytes && nbytes <= out.len() && nbytes <= buf.len()); - let start = out.len() - nbytes; - out[start..].copy_from_slice(&buf[..nbytes]); - u128::from_be_bytes(out) + assert!(1 <= nbytes && nbytes <= 16 && nbytes <= buf.len()); + let mut out: u128 = 0; + let ptr_out = &mut out as *mut u128 as *mut u8; + unsafe { + copy_nonoverlapping( + buf.as_ptr(), + ptr_out.offset((16 - nbytes) as isize), + nbytes, + ); + } + out.to_be() } #[inline] fn write_u16(buf: &mut [u8], n: u16) { - buf[..2].copy_from_slice(&n.to_be_bytes()); + unsafe_write_num_bytes!(u16, 2, n, buf, to_be); } #[inline] fn write_u32(buf: &mut [u8], n: u32) { - buf[..4].copy_from_slice(&n.to_be_bytes()); + unsafe_write_num_bytes!(u32, 4, n, buf, to_be); } #[inline] fn write_u64(buf: &mut [u8], n: u64) { - buf[..8].copy_from_slice(&n.to_be_bytes()); + unsafe_write_num_bytes!(u64, 8, n, buf, to_be); } #[inline] fn write_u128(buf: &mut [u8], n: u128) { - buf[..16].copy_from_slice(&n.to_be_bytes()); + unsafe_write_num_bytes!(u128, 16, n, buf, to_be); } #[inline] @@ -2024,42 +2068,58 @@ #[inline] fn read_u16_into(src: &[u8], dst: &mut [u16]) { - read_slice!(src, dst, u16, from_be_bytes); + unsafe_read_slice!(src, dst, 2, to_be); } #[inline] fn read_u32_into(src: &[u8], dst: &mut [u32]) { - read_slice!(src, dst, u32, from_be_bytes); + unsafe_read_slice!(src, dst, 4, to_be); } #[inline] fn read_u64_into(src: &[u8], dst: &mut [u64]) { - read_slice!(src, dst, u64, from_be_bytes); + unsafe_read_slice!(src, dst, 8, to_be); } #[inline] fn read_u128_into(src: &[u8], dst: &mut [u128]) { - read_slice!(src, dst, u128, from_be_bytes); + unsafe_read_slice!(src, dst, 16, to_be); } #[inline] fn write_u16_into(src: &[u16], dst: &mut [u8]) { - write_slice!(src, dst, u16, to_be_bytes); + if cfg!(target_endian = "big") { + unsafe_write_slice_native!(src, dst, u16); + } else { + write_slice!(src, dst, u16, 2, Self::write_u16); + } } #[inline] fn write_u32_into(src: &[u32], dst: &mut [u8]) { - write_slice!(src, dst, u32, to_be_bytes); + if cfg!(target_endian = "big") { + unsafe_write_slice_native!(src, dst, u32); + } else { + write_slice!(src, dst, u32, 4, Self::write_u32); + } } #[inline] fn write_u64_into(src: &[u64], dst: &mut [u8]) { - write_slice!(src, dst, u64, to_be_bytes); + if cfg!(target_endian = "big") { + unsafe_write_slice_native!(src, dst, u64); + } else { + write_slice!(src, dst, u64, 8, Self::write_u64); + } } #[inline] fn write_u128_into(src: &[u128], dst: &mut [u8]) { - write_slice!(src, dst, u128, to_be_bytes); + if cfg!(target_endian = "big") { + unsafe_write_slice_native!(src, dst, u128); + } else { + write_slice!(src, dst, u128, 16, Self::write_u128); + } } #[inline] @@ -2146,38 +2206,44 @@ #[inline] fn read_uint(buf: &[u8], nbytes: usize) -> u64 { - let mut out = [0; 8]; - assert!(1 <= nbytes && nbytes <= out.len() && nbytes <= buf.len()); - out[..nbytes].copy_from_slice(&buf[..nbytes]); - u64::from_le_bytes(out) + assert!(1 <= nbytes && nbytes <= 8 && nbytes <= buf.len()); + let mut out = 0u64; + let ptr_out = &mut out as *mut u64 as *mut u8; + unsafe { + copy_nonoverlapping(buf.as_ptr(), ptr_out, nbytes); + } + out.to_le() } #[inline] fn read_uint128(buf: &[u8], nbytes: usize) -> u128 { - let mut out = [0; 16]; - assert!(1 <= nbytes && nbytes <= out.len() && nbytes <= buf.len()); - out[..nbytes].copy_from_slice(&buf[..nbytes]); - u128::from_le_bytes(out) + assert!(1 <= nbytes && nbytes <= 16 && nbytes <= buf.len()); + let mut out: u128 = 0; + let ptr_out = &mut out as *mut u128 as *mut u8; + unsafe { + copy_nonoverlapping(buf.as_ptr(), ptr_out, nbytes); + } + out.to_le() } #[inline] fn write_u16(buf: &mut [u8], n: u16) { - buf[..2].copy_from_slice(&n.to_le_bytes()); + unsafe_write_num_bytes!(u16, 2, n, buf, to_le); } #[inline] fn write_u32(buf: &mut [u8], n: u32) { - buf[..4].copy_from_slice(&n.to_le_bytes()); + unsafe_write_num_bytes!(u32, 4, n, buf, to_le); } #[inline] fn write_u64(buf: &mut [u8], n: u64) { - buf[..8].copy_from_slice(&n.to_le_bytes()); + unsafe_write_num_bytes!(u64, 8, n, buf, to_le); } #[inline] fn write_u128(buf: &mut [u8], n: u128) { - buf[..16].copy_from_slice(&n.to_le_bytes()); + unsafe_write_num_bytes!(u128, 16, n, buf, to_le); } #[inline] @@ -2202,42 +2268,58 @@ #[inline] fn read_u16_into(src: &[u8], dst: &mut [u16]) { - read_slice!(src, dst, u16, from_le_bytes); + unsafe_read_slice!(src, dst, 2, to_le); } #[inline] fn read_u32_into(src: &[u8], dst: &mut [u32]) { - read_slice!(src, dst, u32, from_le_bytes); + unsafe_read_slice!(src, dst, 4, to_le); } #[inline] fn read_u64_into(src: &[u8], dst: &mut [u64]) { - read_slice!(src, dst, u64, from_le_bytes); + unsafe_read_slice!(src, dst, 8, to_le); } #[inline] fn read_u128_into(src: &[u8], dst: &mut [u128]) { - read_slice!(src, dst, u128, from_le_bytes); + unsafe_read_slice!(src, dst, 16, to_le); } #[inline] fn write_u16_into(src: &[u16], dst: &mut [u8]) { - write_slice!(src, dst, u16, to_le_bytes); + if cfg!(target_endian = "little") { + unsafe_write_slice_native!(src, dst, u16); + } else { + write_slice!(src, dst, u16, 2, Self::write_u16); + } } #[inline] fn write_u32_into(src: &[u32], dst: &mut [u8]) { - write_slice!(src, dst, u32, to_le_bytes); + if cfg!(target_endian = "little") { + unsafe_write_slice_native!(src, dst, u32); + } else { + write_slice!(src, dst, u32, 4, Self::write_u32); + } } #[inline] fn write_u64_into(src: &[u64], dst: &mut [u8]) { - write_slice!(src, dst, u64, to_le_bytes); + if cfg!(target_endian = "little") { + unsafe_write_slice_native!(src, dst, u64); + } else { + write_slice!(src, dst, u64, 8, Self::write_u64); + } } #[inline] fn write_u128_into(src: &[u128], dst: &mut [u8]) { - write_slice!(src, dst, u128, to_le_bytes); + if cfg!(target_endian = "little") { + unsafe_write_slice_native!(src, dst, u128); + } else { + write_slice!(src, dst, u128, 16, Self::write_u128); + } } #[inline] @@ -2367,7 +2449,6 @@ macro_rules! qc_byte_order { ($name:ident, $ty_int:ty, $max:expr, $bytes:expr, $read:ident, $write:ident) => { - #[cfg(not(miri))] mod $name { #[allow(unused_imports)] use super::{qc_sized, Wi128}; @@ -2408,7 +2489,6 @@ }; ($name:ident, $ty_int:ty, $max:expr, $read:ident, $write:ident) => { - #[cfg(not(miri))] mod $name { #[allow(unused_imports)] use super::{qc_sized, Wi128}; @@ -3325,7 +3405,6 @@ macro_rules! qc_bytes_ext { ($name:ident, $ty_int:ty, $max:expr, $bytes:expr, $read:ident, $write:ident) => { - #[cfg(not(miri))] mod $name { #[allow(unused_imports)] use crate::test::{qc_sized, Wi128}; @@ -3376,7 +3455,6 @@ } }; ($name:ident, $ty_int:ty, $max:expr, $read:ident, $write:ident) => { - #[cfg(not(miri))] mod $name { #[allow(unused_imports)] use crate::test::{qc_sized, Wi128}; @@ -3873,7 +3951,6 @@ // Test slice serialization/deserialization. macro_rules! qc_slice { ($name:ident, $ty_int:ty, $read:ident, $write:ident, $zero:expr) => { - #[cfg(not(miri))] mod $name { use super::qc_unsized; #[allow(unused_imports)] diff -Nru temporalio-1.3.0/vendor/bytes/.cargo-checksum.json temporalio-1.3.0/vendor/bytes/.cargo-checksum.json --- temporalio-1.3.0/vendor/bytes/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/bytes/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"CHANGELOG.md":"acf98bf37a6f854e120b17b0117de8d11e31ceeffd06e69f5a8a50559a5c7822","Cargo.toml":"5e3195d94510bb4d78c001af60576812491a0d2d2f72a9411e9d8ab54ccd3927","LICENSE":"45f522cacecb1023856e46df79ca625dfc550c94910078bd8aec6e02880b3d42","README.md":"c1b2b54999d4829f9f64fb41cbdf05a72d565be0dd078a8633d34631147498a1","benches/buf.rs":"72e6b6120b52d568da068f17c66a793d65602e400c595778581b63092e41d8dc","benches/bytes.rs":"f8cc255be7e8afedf6ade95cd529d105c537c5ec51110d46d470a26b497afa05","benches/bytes_mut.rs":"1326fe6224b26826228e02b4133151e756f38152c2d9cfe66adf83af76c3ec98","ci/miri.sh":"1ee54575b55a0e495e52ca1a934beed674bc8f375f03c4cfc3e81d221ec4fe98","ci/test-stable.sh":"57dd709bc25a20103ee85e24965566900817b2e603f067fb1251a5c03e4b1d93","ci/tsan.sh":"466b86b19225dd26c756cf2252cb1973f87a145642c99364b462ed7ceb55c7dd","clippy.toml":"8522f448dfa3b33ac334ce47d233ebb6b58e8ae115e45107a64fc1b4510fe560","src/buf/buf_impl.rs":"68e493fbf585af6e30990be73ac7fda133f626665ac0a49470426ca824f41254","src/buf/buf_mut.rs":"f167024c569fa47d6b413d68ddb6a6d07b72a0297e0f40f7dc4bbfe2b33048b9","src/buf/chain.rs":"46ec16a7cc370374218c2621ad738df77d95b25216099900ad9195a08a234375","src/buf/iter.rs":"6b44b0b397112f6bcb892103c02a24113963fd8da110c0e0adb91201bf5b3caa","src/buf/limit.rs":"e005ba140b70f68654877c96b981a220477e415ff5c92438c1b0cb9bc866d872","src/buf/mod.rs":"19ff6fb7e19cba3884bc3f1a50ef20117dbc807f6d146ed355f42344a74fdf44","src/buf/reader.rs":"856c1e7129a1eceaa3c8f9ed4da8c3b5e1cc267eeffa99fa8f7c56c5ca7834d1","src/buf/take.rs":"a897e79bf579391227816973b2aa1f1d63614bd48bc029d9371f61607dcfa23f","src/buf/uninit_slice.rs":"54756e79617685f3e805ae1dd51e5b8197791161169a18ee1d96e3158dc748fa","src/buf/vec_deque.rs":"8d552c26ac6ce28a471f74c388e4749432e86b1d8f5a9759b9fc32a2549d395f","src/buf/writer.rs":"c92b5f8b9b42e2e784de474c987fe4ac50af4b5c51ac9548d19a54e8ac9ff521","src/bytes.rs":"0207c4d88e3a91022548d11b2ac5a80f6f9662e6acb2142ca1a00d9b3b9dd9c9","src/bytes_mut.rs":"a4d4c5f8b8502cd3650f938433365b7a7989d8bc4f60b436d21a37f1ed13ffa1","src/fmt/debug.rs":"97b23cfa1d2701fa187005421302eeb260e635cd4f9a9e02b044ff89fcc8b8ad","src/fmt/hex.rs":"13755ec6f1b79923e1f1a05c51b179a38c03c40bb8ed2db0210e8901812e61e7","src/fmt/mod.rs":"176da4e359da99b8e5cf16e480cb7b978f574876827f1b9bb9c08da4d74ac0f5","src/lib.rs":"7d64ad302f99d982b39ea59ea84f9ab1c872935e5f5a8390b29ed08890d5dd61","src/loom.rs":"eb3f577d8cce39a84155c241c4dc308f024631f02085833f7fe9f0ea817bcea9","src/serde.rs":"3ecd7e828cd4c2b7db93c807cb1548fad209e674df493edf7cda69a7b04d405d","tests/test_buf.rs":"a7be350258f0433cfb9ba9e4583d6bb356c964ac34a781f586fd78fbd2c4bb02","tests/test_buf_mut.rs":"5589ce30cb35f8bb4163870d6de14aa67c2209bbd6ba547222d6008297e04a99","tests/test_bytes.rs":"b2fc06ab0f03372972e2b87c6e5d5a6ca91eb8886edbe2a0169ae689ec1be863","tests/test_bytes_odd_alloc.rs":"aeb7a86bf8b31f67b6f453399f3649e0d3878247debc1325d98e66201b1da15f","tests/test_bytes_vec_alloc.rs":"dd7e3c3a71abcfdcad7e3b2f52a6bd106ad6ea0d4bc634372e81dae097233cf0","tests/test_chain.rs":"e9f094539bb42b3135f50033c44122a6b44cf0f953e51e8b488f43243f1e7f10","tests/test_debug.rs":"13299107172809e8cbbd823964ac9450cd0d6b6de79f2e6a2e0f44b9225a0593","tests/test_iter.rs":"c1f46823df26a90139645fd8728a03138edd95b2849dfec830452a80ddd9726d","tests/test_reader.rs":"bf83669d4e0960dad6aa47b46a9a454814fab626eb83572aba914c3d71618f43","tests/test_serde.rs":"2691f891796ba259de0ecf926de05c514f4912cc5fcd3e6a1591efbcd23ed4d0","tests/test_take.rs":"db01bf6855097f318336e90d12c0725a92cee426d330e477a6bd1d32dac34a27"},"package":"a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223"} \ No newline at end of file +{"files":{"CHANGELOG.md":"e9cc33285fb1c25bb0c9339dbf8fa906dec575f132e528b10dc6373077ccfac3","Cargo.toml":"537db58a789fcc1217faca9c6fc5a5337ad741be310c0ca1f66eb6710fbe6d75","LICENSE":"45f522cacecb1023856e46df79ca625dfc550c94910078bd8aec6e02880b3d42","README.md":"c1b2b54999d4829f9f64fb41cbdf05a72d565be0dd078a8633d34631147498a1","benches/buf.rs":"72e6b6120b52d568da068f17c66a793d65602e400c595778581b63092e41d8dc","benches/bytes.rs":"f8cc255be7e8afedf6ade95cd529d105c537c5ec51110d46d470a26b497afa05","benches/bytes_mut.rs":"1326fe6224b26826228e02b4133151e756f38152c2d9cfe66adf83af76c3ec98","ci/miri.sh":"1ee54575b55a0e495e52ca1a934beed674bc8f375f03c4cfc3e81d221ec4fe98","ci/test-stable.sh":"57dd709bc25a20103ee85e24965566900817b2e603f067fb1251a5c03e4b1d93","ci/tsan.sh":"466b86b19225dd26c756cf2252cb1973f87a145642c99364b462ed7ceb55c7dd","clippy.toml":"8522f448dfa3b33ac334ce47d233ebb6b58e8ae115e45107a64fc1b4510fe560","src/buf/buf_impl.rs":"68e493fbf585af6e30990be73ac7fda133f626665ac0a49470426ca824f41254","src/buf/buf_mut.rs":"cdbc002f469bb65310a158e732a22eb63201e2afdfe527b3696545a4a7d263a9","src/buf/chain.rs":"46ec16a7cc370374218c2621ad738df77d95b25216099900ad9195a08a234375","src/buf/iter.rs":"6b44b0b397112f6bcb892103c02a24113963fd8da110c0e0adb91201bf5b3caa","src/buf/limit.rs":"e005ba140b70f68654877c96b981a220477e415ff5c92438c1b0cb9bc866d872","src/buf/mod.rs":"19ff6fb7e19cba3884bc3f1a50ef20117dbc807f6d146ed355f42344a74fdf44","src/buf/reader.rs":"856c1e7129a1eceaa3c8f9ed4da8c3b5e1cc267eeffa99fa8f7c56c5ca7834d1","src/buf/take.rs":"a897e79bf579391227816973b2aa1f1d63614bd48bc029d9371f61607dcfa23f","src/buf/uninit_slice.rs":"fccd4e90f5b4f7eb7774e10d7da0838952e4ddc5b324301d37bb7680eac26e36","src/buf/vec_deque.rs":"8d552c26ac6ce28a471f74c388e4749432e86b1d8f5a9759b9fc32a2549d395f","src/buf/writer.rs":"c92b5f8b9b42e2e784de474c987fe4ac50af4b5c51ac9548d19a54e8ac9ff521","src/bytes.rs":"0207c4d88e3a91022548d11b2ac5a80f6f9662e6acb2142ca1a00d9b3b9dd9c9","src/bytes_mut.rs":"64fe05016fef2cbaa5b0b3d0d01279b99ad0ecc6d9ed99ce27e43fe9c6b2844b","src/fmt/debug.rs":"97b23cfa1d2701fa187005421302eeb260e635cd4f9a9e02b044ff89fcc8b8ad","src/fmt/hex.rs":"13755ec6f1b79923e1f1a05c51b179a38c03c40bb8ed2db0210e8901812e61e7","src/fmt/mod.rs":"176da4e359da99b8e5cf16e480cb7b978f574876827f1b9bb9c08da4d74ac0f5","src/lib.rs":"7d64ad302f99d982b39ea59ea84f9ab1c872935e5f5a8390b29ed08890d5dd61","src/loom.rs":"eb3f577d8cce39a84155c241c4dc308f024631f02085833f7fe9f0ea817bcea9","src/serde.rs":"3ecd7e828cd4c2b7db93c807cb1548fad209e674df493edf7cda69a7b04d405d","tests/test_buf.rs":"a04fb90644fcf0444092c49a4ca848bb0fd8b2ffeeebcb705eeea2de58560859","tests/test_buf_mut.rs":"5643866cd7b0967fb36053a1da73a23b26ffaa2746c05dca91e82df91aee7f81","tests/test_bytes.rs":"b2fc06ab0f03372972e2b87c6e5d5a6ca91eb8886edbe2a0169ae689ec1be863","tests/test_bytes_odd_alloc.rs":"aeb7a86bf8b31f67b6f453399f3649e0d3878247debc1325d98e66201b1da15f","tests/test_bytes_vec_alloc.rs":"dd7e3c3a71abcfdcad7e3b2f52a6bd106ad6ea0d4bc634372e81dae097233cf0","tests/test_chain.rs":"e9f094539bb42b3135f50033c44122a6b44cf0f953e51e8b488f43243f1e7f10","tests/test_debug.rs":"13299107172809e8cbbd823964ac9450cd0d6b6de79f2e6a2e0f44b9225a0593","tests/test_iter.rs":"c1f46823df26a90139645fd8728a03138edd95b2849dfec830452a80ddd9726d","tests/test_reader.rs":"bf83669d4e0960dad6aa47b46a9a454814fab626eb83572aba914c3d71618f43","tests/test_serde.rs":"2691f891796ba259de0ecf926de05c514f4912cc5fcd3e6a1591efbcd23ed4d0","tests/test_take.rs":"db01bf6855097f318336e90d12c0725a92cee426d330e477a6bd1d32dac34a27"},"package":"89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/bytes/Cargo.toml temporalio-1.3.0/vendor/bytes/Cargo.toml --- temporalio-1.3.0/vendor/bytes/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/bytes/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -12,7 +12,7 @@ [package] edition = "2018" name = "bytes" -version = "1.5.0" +version = "1.4.0" authors = [ "Carl Lerche ", "Sean McArthur ", diff -Nru temporalio-1.3.0/vendor/bytes/CHANGELOG.md temporalio-1.3.0/vendor/bytes/CHANGELOG.md --- temporalio-1.3.0/vendor/bytes/CHANGELOG.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/bytes/CHANGELOG.md 2023-10-30 19:40:00.000000000 +0000 @@ -1,14 +1,3 @@ -# 1.5.0 (September 7, 2023) - -### Added - -- Add `UninitSlice::{new,init}` (#598, #599) -- Implement `BufMut` for `&mut [MaybeUninit]` (#597) - -### Changed - -- Mark `BytesMut::extend_from_slice` as inline (#595) - # 1.4.0 (January 31, 2023) ### Added diff -Nru temporalio-1.3.0/vendor/bytes/src/buf/buf_mut.rs temporalio-1.3.0/vendor/bytes/src/buf/buf_mut.rs --- temporalio-1.3.0/vendor/bytes/src/buf/buf_mut.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/bytes/src/buf/buf_mut.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1419,41 +1419,6 @@ } } -unsafe impl BufMut for &mut [core::mem::MaybeUninit] { - #[inline] - fn remaining_mut(&self) -> usize { - self.len() - } - - #[inline] - fn chunk_mut(&mut self) -> &mut UninitSlice { - UninitSlice::uninit(self) - } - - #[inline] - unsafe fn advance_mut(&mut self, cnt: usize) { - // Lifetime dance taken from `impl Write for &mut [u8]`. - let (_, b) = core::mem::replace(self, &mut []).split_at_mut(cnt); - *self = b; - } - - #[inline] - fn put_slice(&mut self, src: &[u8]) { - self.chunk_mut()[..src.len()].copy_from_slice(src); - unsafe { - self.advance_mut(src.len()); - } - } - - fn put_bytes(&mut self, val: u8, cnt: usize) { - assert!(self.remaining_mut() >= cnt); - unsafe { - ptr::write_bytes(self.as_mut_ptr() as *mut u8, val, cnt); - self.advance_mut(cnt); - } - } -} - unsafe impl BufMut for Vec { #[inline] fn remaining_mut(&self) -> usize { diff -Nru temporalio-1.3.0/vendor/bytes/src/buf/uninit_slice.rs temporalio-1.3.0/vendor/bytes/src/buf/uninit_slice.rs --- temporalio-1.3.0/vendor/bytes/src/buf/uninit_slice.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/bytes/src/buf/uninit_slice.rs 2023-10-30 19:40:00.000000000 +0000 @@ -22,44 +22,10 @@ pub struct UninitSlice([MaybeUninit]); impl UninitSlice { - /// Creates a `&mut UninitSlice` wrapping a slice of initialised memory. - /// - /// # Examples - /// - /// ``` - /// use bytes::buf::UninitSlice; - /// - /// let mut buffer = [0u8; 64]; - /// let slice = UninitSlice::new(&mut buffer[..]); - /// ``` - #[inline] - pub fn new(slice: &mut [u8]) -> &mut UninitSlice { - unsafe { &mut *(slice as *mut [u8] as *mut [MaybeUninit] as *mut UninitSlice) } - } - - /// Creates a `&mut UninitSlice` wrapping a slice of uninitialised memory. - /// - /// # Examples - /// - /// ``` - /// use bytes::buf::UninitSlice; - /// use core::mem::MaybeUninit; - /// - /// let mut buffer = [MaybeUninit::uninit(); 64]; - /// let slice = UninitSlice::uninit(&mut buffer[..]); - /// - /// let mut vec = Vec::with_capacity(1024); - /// let spare: &mut UninitSlice = vec.spare_capacity_mut().into(); - /// ``` - #[inline] - pub fn uninit(slice: &mut [MaybeUninit]) -> &mut UninitSlice { + pub(crate) fn from_slice(slice: &mut [MaybeUninit]) -> &mut UninitSlice { unsafe { &mut *(slice as *mut [MaybeUninit] as *mut UninitSlice) } } - fn uninit_ref(slice: &[MaybeUninit]) -> &UninitSlice { - unsafe { &*(slice as *const [MaybeUninit] as *const UninitSlice) } - } - /// Create a `&mut UninitSlice` from a pointer and a length. /// /// # Safety @@ -82,7 +48,7 @@ pub unsafe fn from_raw_parts_mut<'a>(ptr: *mut u8, len: usize) -> &'a mut UninitSlice { let maybe_init: &mut [MaybeUninit] = core::slice::from_raw_parts_mut(ptr as *mut _, len); - Self::uninit(maybe_init) + Self::from_slice(maybe_init) } /// Write a single byte at the specified offset. @@ -213,18 +179,6 @@ } } -impl<'a> From<&'a mut [u8]> for &'a mut UninitSlice { - fn from(slice: &'a mut [u8]) -> Self { - UninitSlice::new(slice) - } -} - -impl<'a> From<&'a mut [MaybeUninit]> for &'a mut UninitSlice { - fn from(slice: &'a mut [MaybeUninit]) -> Self { - UninitSlice::uninit(slice) - } -} - macro_rules! impl_index { ($($t:ty),*) => { $( @@ -233,14 +187,16 @@ #[inline] fn index(&self, index: $t) -> &UninitSlice { - UninitSlice::uninit_ref(&self.0[index]) + let maybe_uninit: &[MaybeUninit] = &self.0[index]; + unsafe { &*(maybe_uninit as *const [MaybeUninit] as *const UninitSlice) } } } impl IndexMut<$t> for UninitSlice { #[inline] fn index_mut(&mut self, index: $t) -> &mut UninitSlice { - UninitSlice::uninit(&mut self.0[index]) + let maybe_uninit: &mut [MaybeUninit] = &mut self.0[index]; + unsafe { &mut *(maybe_uninit as *mut [MaybeUninit] as *mut UninitSlice) } } } )* diff -Nru temporalio-1.3.0/vendor/bytes/src/bytes_mut.rs temporalio-1.3.0/vendor/bytes/src/bytes_mut.rs --- temporalio-1.3.0/vendor/bytes/src/bytes_mut.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/bytes/src/bytes_mut.rs 2023-10-30 19:40:00.000000000 +0000 @@ -761,7 +761,6 @@ /// /// assert_eq!(b"aaabbbcccddd", &buf[..]); /// ``` - #[inline] pub fn extend_from_slice(&mut self, extend: &[u8]) { let cnt = extend.len(); self.reserve(cnt); @@ -1102,7 +1101,7 @@ if self.capacity() == self.len() { self.reserve(64); } - self.spare_capacity_mut().into() + UninitSlice::from_slice(self.spare_capacity_mut()) } // Specialize these methods so they can skip checking `remaining_mut` diff -Nru temporalio-1.3.0/vendor/bytes/tests/test_buf_mut.rs temporalio-1.3.0/vendor/bytes/tests/test_buf_mut.rs --- temporalio-1.3.0/vendor/bytes/tests/test_buf_mut.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/bytes/tests/test_buf_mut.rs 2023-10-30 19:40:00.000000000 +0000 @@ -3,7 +3,6 @@ use bytes::buf::UninitSlice; use bytes::{BufMut, BytesMut}; use core::fmt::Write; -use core::mem::MaybeUninit; use core::usize; #[test] @@ -102,123 +101,26 @@ assert!(buf != buf2); } -fn do_test_slice_small(make: impl Fn(&mut [u8]) -> &mut T) -where - for<'r> &'r mut T: BufMut, -{ - let mut buf = [b'X'; 8]; - - let mut slice = make(&mut buf[..]); - slice.put_bytes(b'A', 2); - slice.put_u8(b'B'); - slice.put_slice(b"BCC"); - assert_eq!(2, slice.remaining_mut()); - assert_eq!(b"AABBCCXX", &buf[..]); - - let mut slice = make(&mut buf[..]); - slice.put_u32(0x61626364); - assert_eq!(4, slice.remaining_mut()); - assert_eq!(b"abcdCCXX", &buf[..]); - - let mut slice = make(&mut buf[..]); - slice.put_u32_le(0x30313233); - assert_eq!(4, slice.remaining_mut()); - assert_eq!(b"3210CCXX", &buf[..]); -} - -fn do_test_slice_large(make: impl Fn(&mut [u8]) -> &mut T) -where - for<'r> &'r mut T: BufMut, -{ - const LEN: usize = 100; - const FILL: [u8; LEN] = [b'Y'; LEN]; - - let test = |fill: &dyn Fn(&mut &mut T, usize)| { - for buf_len in 0..LEN { - let mut buf = [b'X'; LEN]; - for fill_len in 0..=buf_len { - let mut slice = make(&mut buf[..buf_len]); - fill(&mut slice, fill_len); - assert_eq!(buf_len - fill_len, slice.remaining_mut()); - let (head, tail) = buf.split_at(fill_len); - assert_eq!(&FILL[..fill_len], head); - assert!(tail.iter().all(|b| *b == b'X')); - } - } - }; - - test(&|slice, fill_len| slice.put_slice(&FILL[..fill_len])); - test(&|slice, fill_len| slice.put_bytes(FILL[0], fill_len)); -} - -fn do_test_slice_put_slice_panics(make: impl Fn(&mut [u8]) -> &mut T) -where - for<'r> &'r mut T: BufMut, -{ - let mut buf = [b'X'; 4]; - let mut slice = make(&mut buf[..]); - slice.put_slice(b"12345"); -} - -fn do_test_slice_put_bytes_panics(make: impl Fn(&mut [u8]) -> &mut T) -where - for<'r> &'r mut T: BufMut, -{ - let mut buf = [b'X'; 4]; - let mut slice = make(&mut buf[..]); - slice.put_bytes(b'1', 5); -} - -#[test] -fn test_slice_buf_mut_small() { - do_test_slice_small(|x| x); -} - -#[test] -fn test_slice_buf_mut_large() { - do_test_slice_large(|x| x); -} - -#[test] -#[should_panic] -fn test_slice_buf_mut_put_slice_overflow() { - do_test_slice_put_slice_panics(|x| x); -} - -#[test] -#[should_panic] -fn test_slice_buf_mut_put_bytes_overflow() { - do_test_slice_put_bytes_panics(|x| x); -} - -fn make_maybe_uninit_slice(slice: &mut [u8]) -> &mut [MaybeUninit] { - // SAFETY: [u8] has the same layout as [MaybeUninit]. - unsafe { core::mem::transmute(slice) } -} - #[test] -fn test_maybe_uninit_buf_mut_small() { - do_test_slice_small(make_maybe_uninit_slice); +fn test_mut_slice() { + let mut v = vec![0, 0, 0, 0]; + let mut s = &mut v[..]; + s.put_u32(42); + + assert_eq!(s.len(), 0); + assert_eq!(&v, &[0, 0, 0, 42]); } #[test] -fn test_maybe_uninit_buf_mut_large() { - do_test_slice_large(make_maybe_uninit_slice); -} - -#[test] -#[should_panic] -fn test_maybe_uninit_buf_mut_put_slice_overflow() { - do_test_slice_put_slice_panics(make_maybe_uninit_slice); -} - -#[test] -#[should_panic] -fn test_maybe_uninit_buf_mut_put_bytes_overflow() { - do_test_slice_put_bytes_panics(make_maybe_uninit_slice); +fn test_slice_put_bytes() { + let mut v = [0, 0, 0, 0]; + let mut s = &mut v[..]; + s.put_u8(17); + s.put_bytes(19, 2); + assert_eq!(1, s.remaining_mut()); + assert_eq!(&[17, 19, 19, 0], &v[..]); } -#[allow(unused_allocation)] // This is intentional. #[test] fn test_deref_bufmut_forwards() { struct Special; diff -Nru temporalio-1.3.0/vendor/bytes/tests/test_buf.rs temporalio-1.3.0/vendor/bytes/tests/test_buf.rs --- temporalio-1.3.0/vendor/bytes/tests/test_buf.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/bytes/tests/test_buf.rs 2023-10-30 19:40:00.000000000 +0000 @@ -72,7 +72,6 @@ assert_eq!(b"world piece", &out[..]); } -#[allow(unused_allocation)] // This is intentional. #[test] fn test_deref_buf_forwards() { struct Special; diff -Nru temporalio-1.3.0/vendor/chrono/benches/chrono.rs temporalio-1.3.0/vendor/chrono/benches/chrono.rs --- temporalio-1.3.0/vendor/chrono/benches/chrono.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/chrono/benches/chrono.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,137 @@ +//! Benchmarks for chrono that just depend on std +#![cfg(feature = "__internal_bench")] + +use criterion::{black_box, criterion_group, criterion_main, BenchmarkId, Criterion}; + +use chrono::prelude::*; +use chrono::{DateTime, FixedOffset, Local, Utc, __BenchYearFlags}; + +fn bench_datetime_parse_from_rfc2822(c: &mut Criterion) { + c.bench_function("bench_datetime_parse_from_rfc2822", |b| { + b.iter(|| { + let str = black_box("Wed, 18 Feb 2015 23:16:09 +0000"); + DateTime::parse_from_rfc2822(str).unwrap() + }) + }); +} + +fn bench_datetime_parse_from_rfc3339(c: &mut Criterion) { + c.bench_function("bench_datetime_parse_from_rfc3339", |b| { + b.iter(|| { + let str = black_box("2015-02-18T23:59:60.234567+05:00"); + DateTime::parse_from_rfc3339(str).unwrap() + }) + }); +} + +fn bench_datetime_from_str(c: &mut Criterion) { + c.bench_function("bench_datetime_from_str", |b| { + b.iter(|| { + use std::str::FromStr; + let str = black_box("2019-03-30T18:46:57.193Z"); + DateTime::::from_str(str).unwrap() + }) + }); +} + +fn bench_datetime_to_rfc2822(c: &mut Criterion) { + let pst = FixedOffset::east_opt(8 * 60 * 60).unwrap(); + let dt = pst + .from_local_datetime( + &NaiveDate::from_ymd_opt(2018, 1, 11) + .unwrap() + .and_hms_nano_opt(10, 5, 13, 84_660_000) + .unwrap(), + ) + .unwrap(); + c.bench_function("bench_datetime_to_rfc2822", |b| b.iter(|| black_box(dt).to_rfc2822())); +} + +fn bench_datetime_to_rfc3339(c: &mut Criterion) { + let pst = FixedOffset::east_opt(8 * 60 * 60).unwrap(); + let dt = pst + .from_local_datetime( + &NaiveDate::from_ymd_opt(2018, 1, 11) + .unwrap() + .and_hms_nano_opt(10, 5, 13, 84_660_000) + .unwrap(), + ) + .unwrap(); + c.bench_function("bench_datetime_to_rfc3339", |b| b.iter(|| black_box(dt).to_rfc3339())); +} + +fn bench_year_flags_from_year(c: &mut Criterion) { + c.bench_function("bench_year_flags_from_year", |b| { + b.iter(|| { + for year in -999i32..1000 { + let _ = __BenchYearFlags::from_year(black_box(year)); + } + }) + }); +} + +fn bench_get_local_time(c: &mut Criterion) { + c.bench_function("bench_get_local_time", |b| { + b.iter(|| { + let _ = Local::now(); + }) + }); +} + +/// Returns the number of multiples of `div` in the range `start..end`. +/// +/// If the range `start..end` is back-to-front, i.e. `start` is greater than `end`, the +/// behaviour is defined by the following equation: +/// `in_between(start, end, div) == - in_between(end, start, div)`. +/// +/// When `div` is 1, this is equivalent to `end - start`, i.e. the length of `start..end`. +/// +/// # Panics +/// +/// Panics if `div` is not positive. +fn in_between(start: i32, end: i32, div: i32) -> i32 { + assert!(div > 0, "in_between: nonpositive div = {}", div); + let start = (start.div_euclid(div), start.rem_euclid(div)); + let end = (end.div_euclid(div), end.rem_euclid(div)); + // The lowest multiple of `div` greater than or equal to `start`, divided. + let start = start.0 + (start.1 != 0) as i32; + // The lowest multiple of `div` greater than or equal to `end`, divided. + let end = end.0 + (end.1 != 0) as i32; + end - start +} + +/// Alternative implementation to `Datelike::num_days_from_ce` +fn num_days_from_ce_alt(date: &Date) -> i32 { + let year = date.year(); + let diff = move |div| in_between(1, year, div); + // 365 days a year, one more in leap years. In the gregorian calendar, leap years are all + // the multiples of 4 except multiples of 100 but including multiples of 400. + date.ordinal() as i32 + 365 * diff(1) + diff(4) - diff(100) + diff(400) +} + +fn bench_num_days_from_ce(c: &mut Criterion) { + let mut group = c.benchmark_group("num_days_from_ce"); + for year in &[1, 500, 2000, 2019] { + let d = NaiveDate::from_ymd_opt(*year, 1, 1).unwrap(); + group.bench_with_input(BenchmarkId::new("new", year), &d, |b, y| { + b.iter(|| num_days_from_ce_alt(y)) + }); + group.bench_with_input(BenchmarkId::new("classic", year), &d, |b, y| { + b.iter(|| y.num_days_from_ce()) + }); + } +} + +criterion_group!( + benches, + bench_datetime_parse_from_rfc2822, + bench_datetime_parse_from_rfc3339, + bench_datetime_from_str, + bench_datetime_to_rfc2822, + bench_datetime_to_rfc3339, + bench_year_flags_from_year, + bench_num_days_from_ce, + bench_get_local_time, +); + +criterion_main!(benches); diff -Nru temporalio-1.3.0/vendor/chrono/benches/serde.rs temporalio-1.3.0/vendor/chrono/benches/serde.rs --- temporalio-1.3.0/vendor/chrono/benches/serde.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/chrono/benches/serde.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,29 @@ +#![cfg(feature = "__internal_bench")] + +use criterion::{black_box, criterion_group, criterion_main, Criterion}; + +use chrono::NaiveDateTime; + +fn bench_ser_naivedatetime_string(c: &mut Criterion) { + c.bench_function("bench_ser_naivedatetime_string", |b| { + let dt: NaiveDateTime = "2000-01-01T00:00:00".parse().unwrap(); + b.iter(|| { + black_box(serde_json::to_string(&dt)).unwrap(); + }); + }); +} + +fn bench_ser_naivedatetime_writer(c: &mut Criterion) { + c.bench_function("bench_ser_naivedatetime_writer", |b| { + let mut s: Vec = Vec::with_capacity(20); + let dt: NaiveDateTime = "2000-01-01T00:00:00".parse().unwrap(); + b.iter(|| { + let s = &mut s; + s.clear(); + black_box(serde_json::to_writer(s, &dt)).unwrap(); + }); + }); +} + +criterion_group!(benches, bench_ser_naivedatetime_writer, bench_ser_naivedatetime_string); +criterion_main!(benches); diff -Nru temporalio-1.3.0/vendor/chrono/.cargo-checksum.json temporalio-1.3.0/vendor/chrono/.cargo-checksum.json --- temporalio-1.3.0/vendor/chrono/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/chrono/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"CHANGELOG.md":"1cc518c80946bc676a8c691428abe1cdf5a2e4e210b3cacc264b2efc5489d566","CITATION.cff":"fcefd4153bd1d2bcbddb15a1d71f0ad861585bba93dab277fdbe054760ed99c6","Cargo.toml":"32aa9671d6b7b8c1f648f026aeb5a75bff5dd7d44b03179c2f9376f77d702081","LICENSE.txt":"46610329ff0b38effb9cb05979ff1ef761e465fed96b2eaca39e439d00129fd7","README.md":"1d2c96f8a518720657df2e8ca3e2efb34c8a8a39a119e2e89c194c7a0a3cf186","appveyor.yml":"bcfcff73097a37be373e91934294cfea31fbdfe7a4b01a83bcbc64a8a56c3971","deny.toml":"21f7b311b1140b79840e4fe305aaff8fe88db694207e194cf741f5c4665ee99f","rustfmt.toml":"f74204a6f92aa7422a16ecb2ffe2d5bae0f123b778d08b5db1a398a3c9ca4306","src/date.rs":"f7950660aa67aa120f42a81908e87edbd4de7a8e51e58bb2d4e0f57385c34366","src/datetime/mod.rs":"b968b0eabb66294e5a71abe9af65211e4a3749889ce0c89a69cb8530da45373c","src/datetime/rustc_serialize.rs":"99fd592e7ad610c2d1e53f3b8b92cef58bee9f6e70940aad43482c21d2095d69","src/datetime/serde.rs":"558d5779c048aedbe4c29826e900027b22b7897587ad8face698a5fa8fb24e19","src/datetime/tests.rs":"719a2c5d5392353877ab6bce53b4a267466831df60bc30d7cb9c780699b3a7e7","src/duration.rs":"ebcf1bfbacc25a0538c399d82266c11535a1f7a60b027ed3212f4273702ee5b5","src/format/formatting.rs":"731446315ee35311f2ed406784b520134cdd4328e7ad9cbdaae1198f470a43d6","src/format/locales.rs":"c35aef701aa077e1b056c9eb7a561241a178207d2f6f748e1b00ee2afcfd8740","src/format/mod.rs":"b16009fa89447352c035eeb549a0369785977d2605e8f8df254b5566101f0c83","src/format/parse.rs":"27c1a5ba032c507be122d216d3b81e0c59ffbaee3dc4b1e4ad9b2f6edec19bab","src/format/parsed.rs":"fc24b6c7a2e8daaadcb380064c1991199bebf8aec2b7bd0c1b8a00606d42c6b4","src/format/scan.rs":"8128de9055035970c29ef5259bd5a39b6630c1e9111a6ca1649ff1db612e70d8","src/format/strftime.rs":"167d43e0cc6b0bc09c412d905a6e3e493c09680f72f6ddd5a33e32e7308064a0","src/lib.rs":"0361e041a692d06627500158fbe30304d721968f2f4d6318a1d5b06d0947bf84","src/month.rs":"5c1ccdba79aa00048fa2f1b02432fcba12699d92b68d72c55cfb0fedfec30907","src/naive/date.rs":"72b829b457105d96375b6ff598f7c9f19734533fd7b7abe43660f4d6af391df9","src/naive/datetime/mod.rs":"f4fbca2f8c731b0131eb087bdbbb544aa499d41239c6b754f771c98999154733","src/naive/datetime/rustc_serialize.rs":"9d1d7713a3f16a8b58b528a6dc049a1c55d5b64d3f6bcfc398dd49914f95fe3b","src/naive/datetime/serde.rs":"77ded6c3b62151efaff4e07bba139084f6e5f02e3a9414b7031b57f227b1341c","src/naive/datetime/tests.rs":"2c1d1b824d0919f729a634fd04ca1b0acabc84527c19bcefd01bd78e6d1db6ae","src/naive/internals.rs":"01b6546b6e227f78a2019cb900433fe5d6cbb44946061fbf78f1d7841e11e732","src/naive/isoweek.rs":"6be60339127c5d7ad36b1137a71d23ca7002ce026261d9c88b7ad4c43954b04d","src/naive/mod.rs":"d49f7f51e82258b1cfd61179ce551d5789af6586984b2f8aa84820c4bb73174c","src/naive/time/mod.rs":"99112cd5c0cec374156a2f36876acc69ad76ee928bc925bf0cfd1bde1f4c15c7","src/naive/time/rustc_serialize.rs":"20f7213eb25c15c5936472475a49065e31ac821c6a2a095aeeaeac2177817513","src/naive/time/serde.rs":"024dea739ff0bcd39d4a242a650f14a8d24892e9b67e5638cc56337283fa99f4","src/naive/time/tests.rs":"dac776ad3955d4f23958ff6b2925c12e064206565d082bb28ec3cba5add2175c","src/offset/fixed.rs":"6a9bcdeebb0859f2b8367049de1d34f1bf146655e934dc2f227d278f7dd20631","src/offset/local/mod.rs":"c4c1bc039881163ac12ea827fb24190802709753f98ea2cfa9ee3b698562bc1a","src/offset/local/tz_info/mod.rs":"c8096637c04687ea396e444c25fdf0008e2b9975ab3c173a41dd63ac213c7877","src/offset/local/tz_info/parser.rs":"4e2f34a6e760833392bc7da038721fb5e266eebb8e4b327a8140e2d8504de4ec","src/offset/local/tz_info/rule.rs":"54df6b45c4517e5442c04654a87c3082dc789b48761237449389802b829acab9","src/offset/local/tz_info/timezone.rs":"12d134c8dff6d37fb1388ab6c49086113d25eae20336693ff752d70ccd181668","src/offset/local/unix.rs":"5a03f58cf5e8efb8046308a88f2fcf36dbd295077071398300e7d7c5da1bfdbf","src/offset/local/win_bindings.rs":"d06a26a9cb37f3cacc1bc8d41d085d38291dac190d59add2b5d1428da8e46fda","src/offset/local/win_bindings.txt":"6ff598625e3ea85396b19757c0412b5eda884bd3ac95e77376a601564d89201f","src/offset/local/windows.rs":"fe06eca5670f4d87f690dc01b8444d7b7c43762df83959af394195a91837f46a","src/offset/mod.rs":"5b22fb30bc0c37226137ddd6e37425108749266d110ec750fca543010f893eff","src/offset/utc.rs":"18c9853f960a9702a34d14e19f04c6f3b3d097f28bec9a81a5b575a33a4d29b6","src/round.rs":"86c8c630b662fd3957820e129a9aaade1df47f2ff3d4879ccb8bdf446a089303","src/traits.rs":"c769137f9daf8639c5f7195650fa256837381d224a454564deada2a65434d871","src/weekday.rs":"ac5d0847b75977a1e7e98f5eff4e37109ace9b9dc75cc4bfe4b08ff85ca1d6af","taplo.toml":"31cedc3123ed92e506be1f265c2c08cbf8c0b8394aa678fd413ea9dd740f6408","tests/dateutils.rs":"356222da0f523c22bf4c7763b6df103d8b954f13692411aa00cfda5715cf1dc0","tests/wasm.rs":"a3e5cf1cf10d106a90072dd9b1583ecc48ea05163a6ec65d0e3bb38871ab941b","tests/win_bindings.rs":"b23c8d95c724ecf55879229cb20db6bf85d8f76a87221d1e67cb07bb71d29836"},"package":"7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38"} \ No newline at end of file +{"files":{"CHANGELOG.md":"1cc518c80946bc676a8c691428abe1cdf5a2e4e210b3cacc264b2efc5489d566","Cargo.toml":"2fd03d64b57769ecc8cd9d6ae29681eec3ef1b2a52478c0f2c4c3c020240bb3f","LICENSE.txt":"46610329ff0b38effb9cb05979ff1ef761e465fed96b2eaca39e439d00129fd7","Makefile":"1a85008275ee7bf7cc0f0c054b1b393f34a4e614a28ebf3418c9d6b6e53b1b2c","README.md":"25308c06a4e16008c9b1fafd31fea67ba8e61ff6f7b5ec5b919a127d40c4f530","appveyor.yml":"bcfcff73097a37be373e91934294cfea31fbdfe7a4b01a83bcbc64a8a56c3971","benches/chrono.rs":"878752a20e1ef655e45697540bcc610ab08e9a99651fef84cb7154e39a10db9d","benches/serde.rs":"0cebd95c96f0ddf0f7b6ca2d4a4fa307c7ccc691ee5eb090556f89807120eb9f","deny.toml":"4189fcb1125499ac851c0bd29f3f27a614b28573fa3299f712ee4bdace897dd3","rustfmt.toml":"f74204a6f92aa7422a16ecb2ffe2d5bae0f123b778d08b5db1a398a3c9ca4306","src/date.rs":"62bd777c64a6108f8362990dd17219a5721c1044170397214234d2d72145cea2","src/datetime/mod.rs":"0cb9d965e3b7014dbd415f5c1574372e7d71355bdf2daca332b7ae95bdf73bda","src/datetime/rustc_serialize.rs":"8cef7bba6aec9e75679c78b5544f22be41989c15e253fb739b76fcc4c9ee9fbe","src/datetime/serde.rs":"11bc2a04d74566d9bbbd893faa2e27fddc81994e5d5cf8760235e1c32ee50ea3","src/datetime/tests.rs":"b5b75a8738bb5074866fad2372cead4a1e935ff68a7210b9c15b3a806a39a815","src/format/locales.rs":"d24c08f87b98f1f88ea86020f1f55c8c2cefc74a0eb9b3513d820f6e200192d3","src/format/mod.rs":"b93b41021e994a7444382a23749093a535ef1126a88023c021e2fbcfa37a91c8","src/format/parse.rs":"3e8daa91c4bff4f00b52e91ab9166b816b4780c18e6811aec45c19fd6f309bc6","src/format/parsed.rs":"e55129bf34d3f2974c843868b435b87d0b4a418cbb803a6f0bb74844a6a71328","src/format/scan.rs":"057e182001d66d2f0c84dbd41898561b3289bdbc9b39068d4f86fc6ec5a43bdd","src/format/strftime.rs":"3ee6f4d8d9f66b971f111f36e3ecd22e001996e43a63363590d761333dd66998","src/lib.rs":"33a434b25adb6a8bb96db57976dab8cb5a41f4b528a8e283c55013d7efb6cc7d","src/month.rs":"7e7639941aca103bc3b086e2e1d4ba4e1cc9337fac2e6031007a38ecb39faf6d","src/naive/date.rs":"8b9299609b0b3e80b44362f92fe643096859251c265f2b53ae566973e0cbb53a","src/naive/datetime/mod.rs":"3744899f3aba44b2a687ceecd3a59abda7fa5772bf1a86fad7a44bdb476ba1db","src/naive/datetime/rustc_serialize.rs":"50491c855583694f01aed7d577c43dee9adf9bd548377b6707b4d596d887e0b2","src/naive/datetime/serde.rs":"0d0a71231f519fe0e07e4b0ff745e63b6eb3a706e143f143ca3d879353c6645d","src/naive/datetime/tests.rs":"047a67038ab4d9e06d35a9832206460bc8c7fb396ffe3485b74e5884bf62a587","src/naive/internals.rs":"ce83d5847a845eb9e6e6b02c0b92218b76fec71fa40f9865ce906864cced18d1","src/naive/isoweek.rs":"6f18d4b3d1120b8a426a9f82d855e2a4021fac80a6ebcce106f6af1ad12b9fd9","src/naive/mod.rs":"743e0ba276a235baa536005108e11597c1ca4ee100ed86e09cbad2216a91939d","src/naive/time/mod.rs":"3555f9ab4c924c2b88536560d32a4b28b58fdd4d91af1a853497f9f8ba8cd26c","src/naive/time/rustc_serialize.rs":"ce93c81341f35e29ec32a43644fd892a27823643b8ac2f010194824f434180ca","src/naive/time/serde.rs":"a89c1f0d127e89793d8bc1b786996babf02d5aa0a2d859d53a6d3ad02399d9a1","src/naive/time/tests.rs":"b8586903b65c1b050253c04bc9770f7889bfd4db87d02143a2b7fddbecf56dea","src/offset/fixed.rs":"a59c40d7dc741715f4628863a5830efa983d6c7ad49eebcf10f50d5a32b7de22","src/offset/local/mod.rs":"0944133a2e277bdf3e6ca729064a48109f7ba37f0d720c0d12343d6393ca8800","src/offset/local/tz_info/mod.rs":"c8096637c04687ea396e444c25fdf0008e2b9975ab3c173a41dd63ac213c7877","src/offset/local/tz_info/parser.rs":"4e2f34a6e760833392bc7da038721fb5e266eebb8e4b327a8140e2d8504de4ec","src/offset/local/tz_info/rule.rs":"54df6b45c4517e5442c04654a87c3082dc789b48761237449389802b829acab9","src/offset/local/tz_info/timezone.rs":"64a0dda51a2dc2c76ca6944ae69d67c3ab75fa891e53d8a79c54539b0ddb3f10","src/offset/local/unix.rs":"5a03f58cf5e8efb8046308a88f2fcf36dbd295077071398300e7d7c5da1bfdbf","src/offset/local/windows.rs":"9f7f9e6abd2b1efe4c5e9c8c962dccf160fdeea0f7b223efa7d466d4f3630964","src/offset/mod.rs":"9082d9544516ff671d11515f82a7c2e53acae46642ecc36298afe011e70c3906","src/offset/utc.rs":"3855758f6d931bef03afc06fb7f47879601225984a43950ea7a541f34ae9708b","src/oldtime.rs":"b64a301069cf6cc94ef65f5d35aee7e7a785b052fd6a9b22cfd991d88893f8d8","src/round.rs":"ac1ffe7c9ebd06fd9ee2c71815336270dd82f84c74e5d3be3be1fa19e4e2b026","src/traits.rs":"6e9a33e7af1c2f2a098101818f21dd39f61e04b4a6d2f77c7de2a74010f509a5","src/weekday.rs":"1c2c11af3cfa8938b5416dbd004646ac0f16f60247f7a40da02c8845b1828521","tests/dateutils.rs":"d27af7c3b98fda2fbd1cd90dc421c38d19a2241e3fda76c1dbe2130ceee6ed34","tests/wasm.rs":"026c36013894a2a55794b4510f893eabeae89c2600b578ea428473ad339db333"},"package":"ec837a71355b28f6556dbd569b37b3f363091c0bd4b2e735674521b4c5fd9bc5"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/chrono/Cargo.toml temporalio-1.3.0/vendor/chrono/Cargo.toml --- temporalio-1.3.0/vendor/chrono/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/chrono/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -11,9 +11,9 @@ [package] edition = "2021" -rust-version = "1.57.0" +rust-version = "1.56.0" name = "chrono" -version = "0.4.31" +version = "0.4.26" exclude = ["/ci/*"] description = "Date and time library for Rust" homepage = "https://github.com/chronotope/chrono" @@ -25,7 +25,7 @@ "calendar", ] categories = ["date-and-time"] -license = "MIT OR Apache-2.0" +license = "MIT/Apache-2.0" repository = "https://github.com/chronotope/chrono" [package.metadata.docs.rs] @@ -41,17 +41,34 @@ [lib] name = "chrono" +[[bench]] +name = "chrono" +harness = false +required-features = ["__internal_bench"] + +[[bench]] +name = "serde" +harness = false +required-features = [ + "__internal_bench", + "serde", +] + [dependencies.arbitrary] version = "1.0.0" features = ["derive"] optional = true +[dependencies.criterion] +version = "0.4.0" +optional = true + [dependencies.num-traits] version = "0.2" default-features = false [dependencies.pure-rust-locales] -version = "0.7" +version = "0.5.2" optional = true [dependencies.rkyv] @@ -67,9 +84,16 @@ optional = true default-features = false +[dependencies.time] +version = "0.1.43" +optional = true + [dev-dependencies.bincode] version = "1.3.0" +[dev-dependencies.doc-comment] +version = "0.3" + [dev-dependencies.serde_derive] version = "1" default-features = false @@ -78,13 +102,13 @@ version = "1" [features] -__internal_bench = [] +__doctest = [] +__internal_bench = ["criterion"] alloc = [] clock = [ "std", "winapi", "iana-time-zone", - "android-tzdata", ] default = [ "clock", @@ -93,7 +117,7 @@ "wasmbind", ] libc = [] -oldtime = [] +oldtime = ["time"] std = [] unstable-locales = [ "pure-rust-locales", @@ -103,7 +127,6 @@ "wasm-bindgen", "js-sys", ] -winapi = ["windows-targets"] [target."cfg(all(target_arch = \"wasm32\", not(any(target_os = \"emscripten\", target_os = \"wasi\"))))".dependencies.js-sys] version = "0.3" @@ -118,16 +141,19 @@ [target."cfg(target_os = \"android\")".dependencies.android-tzdata] version = "0.1.1" -optional = true [target."cfg(unix)".dependencies.iana-time-zone] version = "0.1.45" features = ["fallback"] optional = true -[target."cfg(windows)".dependencies.windows-targets] -version = "0.48" +[target."cfg(windows)".dependencies.winapi] +version = "0.3.0" +features = [ + "std", + "minwinbase", + "minwindef", + "timezoneapi", + "sysinfoapi", +] optional = true - -[target."cfg(windows)".dev-dependencies.windows-bindgen] -version = "0.51" diff -Nru temporalio-1.3.0/vendor/chrono/CITATION.cff temporalio-1.3.0/vendor/chrono/CITATION.cff --- temporalio-1.3.0/vendor/chrono/CITATION.cff 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/chrono/CITATION.cff 1970-01-01 00:00:00.000000000 +0000 @@ -1,33 +0,0 @@ -# Parser settings. -cff-version: 1.2.0 -message: Please cite this crate using these information. - -# Version information. -date-released: 2023-09-15 -version: 0.4.31 - -# Project information. -abstract: Date and time library for Rust -authors: - - alias: quodlibetor - family-names: Maister - given-names: Brandon W. - - alias: djc - family-names: Ochtman - given-names: Dirkjan - - alias: lifthrasiir - family-names: Seonghoon - given-names: Kang - - alias: esheppa - family-names: Sheppard - given-names: Eric - - alias: pitdicker - family-names: Dicker - given-names: Paul -license: - - Apache-2.0 - - MIT -repository-artifact: https://crates.io/crates/chrono -repository-code: https://github.com/chronotope/chrono -title: chrono -url: https://docs.rs/chrono diff -Nru temporalio-1.3.0/vendor/chrono/deny.toml temporalio-1.3.0/vendor/chrono/deny.toml --- temporalio-1.3.0/vendor/chrono/deny.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/chrono/deny.toml 2023-10-30 19:40:00.000000000 +0000 @@ -4,9 +4,9 @@ [advisories] ignore = [ - "RUSTSEC-2020-0071", # time 0.1, doesn't affect the API we use - "RUSTSEC-2021-0145", # atty (dev-deps only, dependency of criterion) - "RUSTSEC-2022-0004", # rustc_serialize, cannot remove due to compatibility + "RUSTSEC-2020-0071", # time 0.1, doesn't affect the API we use + "RUSTSEC-2021-0145", # atty (dev-deps only, dependency of criterion) + "RUSTSEC-2022-0004", # rustc_serialize, cannot remove due to compatibility ] unmaintained = "deny" unsound = "deny" diff -Nru temporalio-1.3.0/vendor/chrono/Makefile temporalio-1.3.0/vendor/chrono/Makefile --- temporalio-1.3.0/vendor/chrono/Makefile 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/chrono/Makefile 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,26 @@ +# this Makefile is mostly for the packaging convenience. +# casual users should use `cargo` to retrieve the appropriate version of Chrono. + +CHANNEL=stable + +.PHONY: all +all: + @echo 'Try `cargo build` instead.' + +.PHONY: authors +authors: + echo 'Chrono is mainly written by Kang Seonghoon ,' > AUTHORS.txt + echo 'and also the following people (in ascending order):' >> AUTHORS.txt + echo >> AUTHORS.txt + git log --format='%aN <%aE>' | grep -v 'Kang Seonghoon' | sort -u >> AUTHORS.txt + +.PHONY: readme README.md +readme: README.md + +.PHONY: test +test: + CHANNEL=$(CHANNEL) ./ci/travis.sh + +.PHONY: doc +doc: authors readme + cargo doc --features 'serde rustc-serialize bincode' diff -Nru temporalio-1.3.0/vendor/chrono/README.md temporalio-1.3.0/vendor/chrono/README.md --- temporalio-1.3.0/vendor/chrono/README.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/chrono/README.md 2023-10-30 19:40:00.000000000 +0000 @@ -4,8 +4,7 @@ [![Chrono GitHub Actions][gh-image]][gh-checks] [![Chrono on crates.io][cratesio-image]][cratesio] [![Chrono on docs.rs][docsrs-image]][docsrs] -[![Chat][discord-image]][discord] -[![codecov.io][codecov-img]][codecov-link] +[![Join the chat at https://gitter.im/chrono-rs/chrono][gitter-image]][gitter] [gh-image]: https://github.com/chronotope/chrono/actions/workflows/test.yml/badge.svg [gh-checks]: https://github.com/chronotope/chrono/actions?query=workflow%3Atest @@ -13,10 +12,8 @@ [cratesio]: https://crates.io/crates/chrono [docsrs-image]: https://docs.rs/chrono/badge.svg [docsrs]: https://docs.rs/chrono -[discord-image]: https://img.shields.io/discord/976380008299917365?logo=discord -[discord]: https://discord.gg/sXpav4PS7M -[codecov-img]: https://img.shields.io/codecov/c/github/chronotope/chrono?logo=codecov -[codecov-link]: https://codecov.io/gh/chronotope/chrono +[gitter-image]: https://badges.gitter.im/chrono-rs/chrono.svg +[gitter]: https://gitter.im/chrono-rs/chrono Chrono aims to provide all functionality needed to do correct operations on dates and times in the [proleptic Gregorian calendar](https://en.wikipedia.org/wiki/Proleptic_Gregorian_calendar): @@ -61,13 +58,14 @@ * `serde`: Enable serialization/deserialization via serde. * `rkyv`: Enable serialization/deserialization via rkyv. * `rustc-serialize`: Enable serialization/deserialization via rustc-serialize (deprecated). +* `old_time`: compatability with the `Duration` type of the `time` 0.1 crate (deprecated). * `arbitrary`: construct arbitrary instances of a type with the Arbitrary crate. * `unstable-locales`: Enable localization. This adds various methods with a `_localized` suffix. The implementation and API may change or even be removed in a patch release. Feedback welcome. ## Rust version requirements -The Minimum Supported Rust Version (MSRV) is currently **Rust 1.57.0**. +The Minimum Supported Rust Version (MSRV) is currently **Rust 1.56.0**. The MSRV is explicitly tested in CI. It may be bumped in minor releases, but this is not done lightly. diff -Nru temporalio-1.3.0/vendor/chrono/src/date.rs temporalio-1.3.0/vendor/chrono/src/date.rs --- temporalio-1.3.0/vendor/chrono/src/date.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/chrono/src/date.rs 2023-10-30 19:40:00.000000000 +0000 @@ -4,7 +4,7 @@ //! ISO 8601 calendar date with time zone. #![allow(deprecated)] -#[cfg(any(feature = "alloc", feature = "std"))] +#[cfg(any(feature = "alloc", feature = "std", test))] use core::borrow::Borrow; use core::cmp::Ordering; use core::ops::{Add, AddAssign, Sub, SubAssign}; @@ -13,13 +13,13 @@ #[cfg(feature = "rkyv")] use rkyv::{Archive, Deserialize, Serialize}; -use crate::duration::Duration as OldDuration; #[cfg(feature = "unstable-locales")] use crate::format::Locale; -#[cfg(any(feature = "alloc", feature = "std"))] +#[cfg(any(feature = "alloc", feature = "std", test))] use crate::format::{DelayedFormat, Item, StrftimeItems}; use crate::naive::{IsoWeek, NaiveDate, NaiveTime}; use crate::offset::{TimeZone, Utc}; +use crate::oldtime::Duration as OldDuration; use crate::DateTime; use crate::{Datelike, Weekday}; @@ -74,6 +74,8 @@ impl Date { /// Makes a new `Date` with given *UTC* date and offset. /// The local date should be constructed via the `TimeZone` trait. + // + // note: this constructor is purposely not named to `new` to discourage the direct usage. #[inline] #[must_use] pub fn from_utc(date: NaiveDate, offset: Tz::Offset) -> Date { @@ -83,7 +85,7 @@ /// Makes a new `DateTime` from the current date and given `NaiveTime`. /// The offset in the current date is preserved. /// - /// Returns `None` on invalid datetime. + /// Panics on invalid datetime. #[inline] #[must_use] pub fn and_time(&self, time: NaiveTime) -> Option> { @@ -333,7 +335,7 @@ Tz::Offset: fmt::Display, { /// Formats the date with the specified formatting items. - #[cfg(any(feature = "alloc", feature = "std"))] + #[cfg(any(feature = "alloc", feature = "std", test))] #[cfg_attr(docsrs, doc(cfg(any(feature = "alloc", feature = "std"))))] #[inline] #[must_use] @@ -348,7 +350,7 @@ /// Formats the date with the specified format string. /// See the [`crate::format::strftime`] module /// on the supported escape sequences. - #[cfg(any(feature = "alloc", feature = "std"))] + #[cfg(any(feature = "alloc", feature = "std", test))] #[cfg_attr(docsrs, doc(cfg(any(feature = "alloc", feature = "std"))))] #[inline] #[must_use] @@ -576,7 +578,7 @@ mod tests { use super::Date; - use crate::duration::Duration; + use crate::oldtime::Duration; use crate::{FixedOffset, NaiveDate, Utc}; #[cfg(feature = "clock")] diff -Nru temporalio-1.3.0/vendor/chrono/src/datetime/mod.rs temporalio-1.3.0/vendor/chrono/src/datetime/mod.rs --- temporalio-1.3.0/vendor/chrono/src/datetime/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/chrono/src/datetime/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -3,33 +3,37 @@ //! ISO 8601 date and time with time zone. +#[cfg(feature = "alloc")] +extern crate alloc; + #[cfg(all(not(feature = "std"), feature = "alloc"))] -use alloc::string::String; +use alloc::string::{String, ToString}; +#[cfg(any(feature = "alloc", feature = "std", test))] use core::borrow::Borrow; use core::cmp::Ordering; use core::fmt::Write; use core::ops::{Add, AddAssign, Sub, SubAssign}; -use core::time::Duration; use core::{fmt, hash, str}; #[cfg(feature = "std")] +use std::string::ToString; +#[cfg(any(feature = "std", test))] use std::time::{SystemTime, UNIX_EPOCH}; -use crate::duration::Duration as OldDuration; +#[cfg(any(feature = "alloc", feature = "std", test))] +use crate::format::DelayedFormat; #[cfg(feature = "unstable-locales")] use crate::format::Locale; -use crate::format::{ - parse, parse_and_remainder, parse_rfc3339, Fixed, Item, ParseError, ParseResult, Parsed, - StrftimeItems, TOO_LONG, -}; -#[cfg(any(feature = "alloc", feature = "std"))] -use crate::format::{write_rfc3339, DelayedFormat}; +use crate::format::{parse, parse_and_remainder, ParseError, ParseResult, Parsed, StrftimeItems}; +use crate::format::{Fixed, Item}; use crate::naive::{Days, IsoWeek, NaiveDate, NaiveDateTime, NaiveTime}; #[cfg(feature = "clock")] use crate::offset::Local; use crate::offset::{FixedOffset, Offset, TimeZone, Utc}; +use crate::oldtime::Duration as OldDuration; #[allow(deprecated)] use crate::Date; -use crate::{Datelike, Months, Timelike, Weekday}; +use crate::Months; +use crate::{Datelike, Timelike, Weekday}; #[cfg(feature = "rkyv")] use rkyv::{Archive, Deserialize, Serialize}; @@ -49,7 +53,6 @@ /// /// See the `TimeZone::to_rfc3339_opts` function for usage. #[derive(Clone, Copy, Debug, Eq, PartialEq, Hash)] -#[allow(clippy::manual_non_exhaustive)] pub enum SecondsFormat { /// Format whole seconds only, with no decimal point nor subseconds. Secs, @@ -96,78 +99,62 @@ pub const MAX_DATETIME: DateTime = DateTime::::MAX_UTC; impl DateTime { - /// Makes a new `DateTime` from its components: a `NaiveDateTime` in UTC and an `Offset`. - /// - /// This is a low-level method, intended for use cases such as deserializing a `DateTime` or - /// passing it through FFI. - /// - /// For regular use you will probably want to use a method such as - /// [`TimeZone::from_local_datetime`] or [`NaiveDateTime::and_local_timezone`] instead. + /// Makes a new `DateTime` with given *UTC* datetime and offset. + /// The local datetime should be constructed via the `TimeZone` trait. /// /// # Example /// - #[cfg_attr(not(feature = "clock"), doc = "```ignore")] - #[cfg_attr(feature = "clock", doc = "```rust")] - /// use chrono::{Local, DateTime}; - /// - /// let dt = Local::now(); - /// // Get components - /// let naive_utc = dt.naive_utc(); - /// let offset = dt.offset().clone(); - /// // Serialize, pass through FFI... and recreate the `DateTime`: - /// let dt_new = DateTime::::from_naive_utc_and_offset(naive_utc, offset); - /// assert_eq!(dt, dt_new); /// ``` + /// use chrono::{DateTime, TimeZone, NaiveDateTime, Utc}; + /// + /// let dt = DateTime::::from_utc(NaiveDateTime::from_timestamp_opt(61, 0).unwrap(), Utc); + /// assert_eq!(Utc.timestamp_opt(61, 0).unwrap(), dt); + /// ``` + // + // note: this constructor is purposely not named to `new` to discourage the direct usage. #[inline] #[must_use] - pub fn from_naive_utc_and_offset(datetime: NaiveDateTime, offset: Tz::Offset) -> DateTime { - DateTime { datetime, offset } - } - - /// Makes a new `DateTime` from its components: a `NaiveDateTime` in UTC and an `Offset`. - #[inline] - #[must_use] - #[deprecated( - since = "0.4.27", - note = "Use TimeZone::from_utc_datetime() or DateTime::from_naive_utc_and_offset instead" - )] pub fn from_utc(datetime: NaiveDateTime, offset: Tz::Offset) -> DateTime { DateTime { datetime, offset } } - /// Makes a new `DateTime` from a `NaiveDateTime` in *local* time and an `Offset`. - /// - /// # Panics + /// Makes a new `DateTime` with given **local** datetime and offset that + /// presents local timezone. /// - /// Panics if the local datetime can't be converted to UTC because it would be out of range. + /// # Example /// - /// This can happen if `datetime` is near the end of the representable range of `NaiveDateTime`, - /// and the offset from UTC pushes it beyond that. + /// ``` + /// use chrono::DateTime; + /// use chrono::naive::NaiveDate; + /// use chrono::offset::{Utc, FixedOffset}; + /// + /// let naivedatetime_utc = NaiveDate::from_ymd_opt(2000, 1, 12).unwrap().and_hms_opt(2, 0, 0).unwrap(); + /// let datetime_utc = DateTime::::from_utc(naivedatetime_utc, Utc); + /// + /// let timezone_east = FixedOffset::east_opt(8 * 60 * 60).unwrap(); + /// let naivedatetime_east = NaiveDate::from_ymd_opt(2000, 1, 12).unwrap().and_hms_opt(10, 0, 0).unwrap(); + /// let datetime_east = DateTime::::from_local(naivedatetime_east, timezone_east); + /// + /// let timezone_west = FixedOffset::west_opt(7 * 60 * 60).unwrap(); + /// let naivedatetime_west = NaiveDate::from_ymd_opt(2000, 1, 11).unwrap().and_hms_opt(19, 0, 0).unwrap(); + /// let datetime_west = DateTime::::from_local(naivedatetime_west, timezone_west); + + /// assert_eq!(datetime_east, datetime_utc.with_timezone(&timezone_east)); + /// assert_eq!(datetime_west, datetime_utc.with_timezone(&timezone_west)); + /// ``` #[inline] #[must_use] - #[deprecated( - since = "0.4.27", - note = "Use TimeZone::from_local_datetime() or NaiveDateTime::and_local_timezone instead" - )] pub fn from_local(datetime: NaiveDateTime, offset: Tz::Offset) -> DateTime { let datetime_utc = datetime - offset.fix(); DateTime { datetime: datetime_utc, offset } } - /// Retrieves the date component with an associated timezone. + /// Retrieves a date component /// /// Unless you are immediately planning on turning this into a `DateTime` - /// with the same timezone you should use the [`date_naive`](DateTime::date_naive) method. - /// - /// [`NaiveDate`] is a more well-defined type, and has more traits implemented on it, - /// so should be preferred to [`Date`] any time you truly want to operate on dates. - /// - /// # Panics - /// - /// [`DateTime`] internally stores the date and time in UTC with a [`NaiveDateTime`]. This - /// method will panic if the offset from UTC would push the local date outside of the - /// representable range of a [`Date`]. + /// with the same Timezone you should use the + /// [`date_naive`](DateTime::date_naive) method. #[inline] #[deprecated(since = "0.4.23", note = "Use `date_naive()` instead")] #[allow(deprecated)] @@ -176,15 +163,10 @@ Date::from_utc(self.naive_local().date(), self.offset.clone()) } - /// Retrieves the date component. - /// - /// # Panics - /// - /// [`DateTime`] internally stores the date and time in UTC with a [`NaiveDateTime`]. This - /// method will panic if the offset from UTC would push the local date outside of the - /// representable range of a [`NaiveDate`]. + /// Retrieves the Date without an associated timezone /// - /// # Example + /// [`NaiveDate`] is a more well-defined type, and has more traits implemented on it, + /// so should be preferred to [`Date`] any time you truly want to operate on Dates. /// /// ``` /// use chrono::prelude::*; @@ -200,7 +182,8 @@ NaiveDate::from_ymd_opt(local.year(), local.month(), local.day()).unwrap() } - /// Retrieves the time component. + /// Retrieves a time component. + /// Unlike `date`, this is not associated to the time zone. #[inline] #[must_use] pub fn time(&self) -> NaiveTime { @@ -209,25 +192,18 @@ /// Returns the number of non-leap seconds since January 1, 1970 0:00:00 UTC /// (aka "UNIX timestamp"). - /// - /// The reverse operation of creating a [`DateTime`] from a timestamp can be performed - /// using [`from_timestamp`](DateTime::from_timestamp) or [`TimeZone::timestamp_opt`]. - /// - /// ``` - /// use chrono::{DateTime, TimeZone, Utc}; - /// - /// let dt: DateTime = Utc.with_ymd_and_hms(2015, 5, 15, 0, 0, 0).unwrap(); - /// assert_eq!(dt.timestamp(), 1431648000); - /// - /// assert_eq!(DateTime::from_timestamp(dt.timestamp(), dt.timestamp_subsec_nanos()).unwrap(), dt); - /// ``` #[inline] #[must_use] pub fn timestamp(&self) -> i64 { self.datetime.timestamp() } - /// Returns the number of non-leap-milliseconds since January 1, 1970 UTC. + /// Returns the number of non-leap-milliseconds since January 1, 1970 UTC + /// + /// Note that this does reduce the number of years that can be represented + /// from ~584 Billion to ~584 Million. (If this is a problem, please file + /// an issue to let me know what domain needs millisecond precision over + /// billions of years, I'm curious.) /// /// # Example /// @@ -246,7 +222,12 @@ self.datetime.timestamp_millis() } - /// Returns the number of non-leap-microseconds since January 1, 1970 UTC. + /// Returns the number of non-leap-microseconds since January 1, 1970 UTC + /// + /// Note that this does reduce the number of years that can be represented + /// from ~584 Billion to ~584 Thousand. (If this is a problem, please file + /// an issue to let me know what domain needs microsecond precision over + /// millennia, I'm curious.) /// /// # Example /// @@ -265,32 +246,12 @@ self.datetime.timestamp_micros() } - /// Returns the number of non-leap-nanoseconds since January 1, 1970 UTC. - /// - /// # Panics - /// - /// An `i64` with nanosecond precision can span a range of ~584 years. This function panics on - /// an out of range `DateTime`. - /// - /// The dates that can be represented as nanoseconds are between 1677-09-21T00:12:44.0 and - /// 2262-04-11T23:47:16.854775804. - #[deprecated(since = "0.4.31", note = "use `timestamp_nanos_opt()` instead")] - #[inline] - #[must_use] - pub fn timestamp_nanos(&self) -> i64 { - self.timestamp_nanos_opt() - .expect("value can not be represented in a timestamp with nanosecond precision.") - } - - /// Returns the number of non-leap-nanoseconds since January 1, 1970 UTC. - /// - /// # Panics + /// Returns the number of non-leap-nanoseconds since January 1, 1970 UTC /// - /// An `i64` with nanosecond precision can span a range of ~584 years. This function panics on - /// an out of range `DateTime`. - /// - /// The dates that can be represented as nanoseconds are between 1677-09-21T00:12:44.0 and - /// 2262-04-11T23:47:16.854775804. + /// Note that this does reduce the number of years that can be represented + /// from ~584 Billion to ~584. (If this is a problem, please file + /// an issue to let me know what domain needs nanosecond precision over + /// millennia, I'm curious.) /// /// # Example /// @@ -298,29 +259,33 @@ /// use chrono::{Utc, NaiveDate}; /// /// let dt = NaiveDate::from_ymd_opt(1970, 1, 1).unwrap().and_hms_nano_opt(0, 0, 1, 444).unwrap().and_local_timezone(Utc).unwrap(); - /// assert_eq!(dt.timestamp_nanos_opt(), Some(1_000_000_444)); + /// assert_eq!(dt.timestamp_nanos(), 1_000_000_444); /// /// let dt = NaiveDate::from_ymd_opt(2001, 9, 9).unwrap().and_hms_nano_opt(1, 46, 40, 555).unwrap().and_local_timezone(Utc).unwrap(); - /// assert_eq!(dt.timestamp_nanos_opt(), Some(1_000_000_000_000_000_555)); + /// assert_eq!(dt.timestamp_nanos(), 1_000_000_000_000_000_555); /// ``` #[inline] #[must_use] - pub fn timestamp_nanos_opt(&self) -> Option { - self.datetime.timestamp_nanos_opt() + pub fn timestamp_nanos(&self) -> i64 { + self.datetime.timestamp_nanos() } - /// Returns the number of milliseconds since the last second boundary. + /// Returns the number of milliseconds since the last second boundary /// - /// In event of a leap second this may exceed 999. + /// warning: in event of a leap second, this may exceed 999 + /// + /// note: this is not the number of milliseconds since January 1, 1970 0:00:00 UTC #[inline] #[must_use] pub fn timestamp_subsec_millis(&self) -> u32 { self.datetime.timestamp_subsec_millis() } - /// Returns the number of microseconds since the last second boundary. + /// Returns the number of microseconds since the last second boundary + /// + /// warning: in event of a leap second, this may exceed 999_999 /// - /// In event of a leap second this may exceed 999,999. + /// note: this is not the number of microseconds since January 1, 1970 0:00:00 UTC #[inline] #[must_use] pub fn timestamp_subsec_micros(&self) -> u32 { @@ -329,7 +294,9 @@ /// Returns the number of nanoseconds since the last second boundary /// - /// In event of a leap second this may exceed 999,999,999. + /// warning: in event of a leap second, this may exceed 999_999_999 + /// + /// note: this is not the number of nanoseconds since January 1, 1970 0:00:00 UTC #[inline] #[must_use] pub fn timestamp_subsec_nanos(&self) -> u32 { @@ -351,8 +318,7 @@ } /// Changes the associated time zone. - /// The returned `DateTime` references the same instant of time from the perspective of the - /// provided time zone. + /// The returned `DateTime` references the same instant of time from the perspective of the provided time zone. #[inline] #[must_use] pub fn with_timezone(&self, tz: &Tz2) -> DateTime { @@ -369,9 +335,7 @@ /// Adds given `Duration` to the current date and time. /// - /// # Errors - /// - /// Returns `None` if the resulting date would be out of range. + /// Returns `None` when it will result in overflow. #[inline] #[must_use] pub fn checked_add_signed(self, rhs: OldDuration) -> Option> { @@ -382,16 +346,10 @@ /// Adds given `Months` to the current date and time. /// - /// Uses the last day of the month if the day does not exist in the resulting month. - /// - /// See [`NaiveDate::checked_add_months`] for more details on behavior. + /// Returns `None` when it will result in overflow, or if the + /// local time is not valid on the newly calculated date. /// - /// # Errors - /// - /// Returns `None` if: - /// - The resulting date would be out of range. - /// - The local time at the resulting date does not exist or is ambiguous, for example during a - /// daylight saving time transition. + /// See [`NaiveDate::checked_add_months`] for more details on behavior #[must_use] pub fn checked_add_months(self, rhs: Months) -> Option> { self.naive_local() @@ -402,9 +360,7 @@ /// Subtracts given `Duration` from the current date and time. /// - /// # Errors - /// - /// Returns `None` if the resulting date would be out of range. + /// Returns `None` when it will result in overflow. #[inline] #[must_use] pub fn checked_sub_signed(self, rhs: OldDuration) -> Option> { @@ -415,16 +371,10 @@ /// Subtracts given `Months` from the current date and time. /// - /// Uses the last day of the month if the day does not exist in the resulting month. - /// - /// See [`NaiveDate::checked_sub_months`] for more details on behavior. + /// Returns `None` when it will result in overflow, or if the + /// local time is not valid on the newly calculated date. /// - /// # Errors - /// - /// Returns `None` if: - /// - The resulting date would be out of range. - /// - The local time at the resulting date does not exist or is ambiguous, for example during a - /// daylight saving time transition. + /// See [`NaiveDate::checked_sub_months`] for more details on behavior #[must_use] pub fn checked_sub_months(self, rhs: Months) -> Option> { self.naive_local() @@ -433,14 +383,9 @@ .single() } - /// Add a duration in [`Days`] to the date part of the `DateTime`. - /// - /// # Errors + /// Add a duration in [`Days`] to the date part of the `DateTime` /// - /// Returns `None` if: - /// - The resulting date would be out of range. - /// - The local time at the resulting date does not exist or is ambiguous, for example during a - /// daylight saving time transition. + /// Returns `None` if the resulting date would be out of range. #[must_use] pub fn checked_add_days(self, days: Days) -> Option { self.naive_local() @@ -449,14 +394,9 @@ .single() } - /// Subtract a duration in [`Days`] from the date part of the `DateTime`. - /// - /// # Errors + /// Subtract a duration in [`Days`] from the date part of the `DateTime` /// - /// Returns `None` if: - /// - The resulting date would be out of range. - /// - The local time at the resulting date does not exist or is ambiguous, for example during a - /// daylight saving time transition. + /// Returns `None` if the resulting date would be out of range. #[must_use] pub fn checked_sub_days(self, days: Days) -> Option { self.naive_local() @@ -469,11 +409,8 @@ /// This does not overflow or underflow at all. #[inline] #[must_use] - pub fn signed_duration_since( - self, - rhs: impl Borrow>, - ) -> OldDuration { - self.datetime.signed_duration_since(rhs.borrow().datetime) + pub fn signed_duration_since(self, rhs: DateTime) -> OldDuration { + self.datetime.signed_duration_since(rhs.datetime) } /// Returns a view to the naive UTC datetime. @@ -484,12 +421,6 @@ } /// Returns a view to the naive local datetime. - /// - /// # Panics - /// - /// [`DateTime`] internally stores the date and time in UTC with a [`NaiveDateTime`]. This - /// method will panic if the offset from UTC would push the local datetime outside of the - /// representable range of a [`NaiveDateTime`]. #[inline] #[must_use] pub fn naive_local(&self) -> NaiveDateTime { @@ -497,10 +428,6 @@ } /// Retrieve the elapsed years from now to the given [`DateTime`]. - /// - /// # Errors - /// - /// Returns `None` if `base < self`. #[must_use] pub fn years_since(&self, base: Self) -> Option { let mut years = self.year() - base.year(); @@ -518,116 +445,12 @@ } } - /// Returns an RFC 2822 date and time string such as `Tue, 1 Jul 2003 10:52:37 +0200`. - /// - /// # Panics - /// - /// Panics if the date can not be represented in this format: the year may not be negative and - /// can not have more than 4 digits. - #[cfg(any(feature = "alloc", feature = "std"))] - #[cfg_attr(docsrs, doc(cfg(any(feature = "alloc", feature = "std"))))] - #[must_use] - pub fn to_rfc2822(&self) -> String { - let mut result = String::with_capacity(32); - crate::format::write_rfc2822(&mut result, self.naive_local(), self.offset.fix()) - .expect("writing rfc2822 datetime to string should never fail"); - result - } - - /// Returns an RFC 3339 and ISO 8601 date and time string such as `1996-12-19T16:39:57-08:00`. - #[cfg(any(feature = "alloc", feature = "std"))] - #[cfg_attr(docsrs, doc(cfg(any(feature = "alloc", feature = "std"))))] - #[must_use] - pub fn to_rfc3339(&self) -> String { - // For some reason a string with a capacity less than 32 is ca 20% slower when benchmarking. - let mut result = String::with_capacity(32); - let naive = self.naive_local(); - let offset = self.offset.fix(); - write_rfc3339(&mut result, naive, offset, SecondsFormat::AutoSi, false) - .expect("writing rfc3339 datetime to string should never fail"); - result - } - - /// Return an RFC 3339 and ISO 8601 date and time string with subseconds - /// formatted as per `SecondsFormat`. - /// - /// If `use_z` is true and the timezone is UTC (offset 0), uses `Z` as - /// per [`Fixed::TimezoneOffsetColonZ`]. If `use_z` is false, uses - /// [`Fixed::TimezoneOffsetColon`] - /// - /// # Examples - /// - /// ```rust - /// # use chrono::{FixedOffset, SecondsFormat, TimeZone, Utc, NaiveDate}; - /// let dt = NaiveDate::from_ymd_opt(2018, 1, 26).unwrap().and_hms_micro_opt(18, 30, 9, 453_829).unwrap().and_local_timezone(Utc).unwrap(); - /// assert_eq!(dt.to_rfc3339_opts(SecondsFormat::Millis, false), - /// "2018-01-26T18:30:09.453+00:00"); - /// assert_eq!(dt.to_rfc3339_opts(SecondsFormat::Millis, true), - /// "2018-01-26T18:30:09.453Z"); - /// assert_eq!(dt.to_rfc3339_opts(SecondsFormat::Secs, true), - /// "2018-01-26T18:30:09Z"); - /// - /// let pst = FixedOffset::east_opt(8 * 60 * 60).unwrap(); - /// let dt = pst.from_local_datetime(&NaiveDate::from_ymd_opt(2018, 1, 26).unwrap().and_hms_micro_opt(10, 30, 9, 453_829).unwrap()).unwrap(); - /// assert_eq!(dt.to_rfc3339_opts(SecondsFormat::Secs, true), - /// "2018-01-26T10:30:09+08:00"); - /// ``` - #[cfg(any(feature = "alloc", feature = "std"))] - #[cfg_attr(docsrs, doc(cfg(any(feature = "alloc", feature = "std"))))] - #[must_use] - pub fn to_rfc3339_opts(&self, secform: SecondsFormat, use_z: bool) -> String { - let mut result = String::with_capacity(38); - write_rfc3339(&mut result, self.naive_local(), self.offset.fix(), secform, use_z) - .expect("writing rfc3339 datetime to string should never fail"); - result - } - /// The minimum possible `DateTime`. pub const MIN_UTC: DateTime = DateTime { datetime: NaiveDateTime::MIN, offset: Utc }; /// The maximum possible `DateTime`. pub const MAX_UTC: DateTime = DateTime { datetime: NaiveDateTime::MAX, offset: Utc }; } -impl DateTime { - /// Makes a new [`DateTime`] from the number of non-leap seconds - /// since January 1, 1970 0:00:00 UTC (aka "UNIX timestamp") - /// and the number of nanoseconds since the last whole non-leap second. - /// - /// This is guaranteed to round-trip with regard to [`timestamp`](DateTime::timestamp) and - /// [`timestamp_subsec_nanos`](DateTime::timestamp_subsec_nanos). - /// - /// If you need to create a `DateTime` with a [`TimeZone`] different from [`Utc`], use - /// [`TimeZone::timestamp_opt`] or [`DateTime::with_timezone`]. - /// - /// The nanosecond part can exceed 1,000,000,000 in order to represent a - /// [leap second](NaiveTime#leap-second-handling), but only when `secs % 60 == 59`. - /// (The true "UNIX timestamp" cannot represent a leap second unambiguously.) - /// - /// # Errors - /// - /// Returns `None` on out-of-range number of seconds and/or - /// invalid nanosecond, otherwise returns `Some(DateTime {...})`. - /// - /// # Example - /// - /// ``` - /// use chrono::{DateTime, Utc}; - /// - /// let dt: DateTime = DateTime::::from_timestamp(1431648000, 0).expect("invalid timestamp"); - /// - /// assert_eq!(dt.to_string(), "2015-05-15 00:00:00 UTC"); - /// assert_eq!(DateTime::from_timestamp(dt.timestamp(), dt.timestamp_subsec_nanos()).unwrap(), dt); - /// ``` - #[inline] - #[must_use] - pub fn from_timestamp(secs: i64, nsecs: u32) -> Option { - NaiveDateTime::from_timestamp_opt(secs, nsecs).as_ref().map(NaiveDateTime::and_utc) - } - - /// The Unix Epoch, 1970-01-01 00:00:00 UTC. - pub const UNIX_EPOCH: Self = Self { datetime: NaiveDateTime::UNIX_EPOCH, offset: Utc }; -} - impl Default for DateTime { fn default() -> Self { Utc.from_utc_datetime(&NaiveDateTime::default()) @@ -735,24 +558,7 @@ /// and returns a new [`DateTime`] instance with the parsed timezone as the [`FixedOffset`]. /// /// RFC 2822 is the internet message standard that specifies the representation of times in HTTP - /// and email headers. It is the 2001 revision of RFC 822, and is itself revised as RFC 5322 in - /// 2008. - /// - /// # Support for the obsolete date format - /// - /// - A 2-digit year is interpreted to be a year in 1950-2049. - /// - The standard allows comments and whitespace between many of the tokens. See [4.3] and - /// [Appendix A.5] - /// - Single letter 'military' time zone names are parsed as a `-0000` offset. - /// They were defined with the wrong sign in RFC 822 and corrected in RFC 2822. But because - /// the meaning is now ambiguous, the standard says they should be be considered as `-0000` - /// unless there is out-of-band information confirming their meaning. - /// The exception is `Z`, which remains identical to `+0000`. - /// - /// [4.3]: https://www.rfc-editor.org/rfc/rfc2822#section-4.3 - /// [Appendix A.5]: https://www.rfc-editor.org/rfc/rfc2822#appendix-A.5 - /// - /// # Example + /// and email headers. /// /// ``` /// # use chrono::{DateTime, FixedOffset, TimeZone}; @@ -782,11 +588,9 @@ /// also simultaneously valid RFC 3339 values, but not all RFC 3339 values are valid ISO 8601 /// values (or the other way around). pub fn parse_from_rfc3339(s: &str) -> ParseResult> { + const ITEMS: &[Item<'static>] = &[Item::Fixed(Fixed::RFC3339)]; let mut parsed = Parsed::new(); - let (s, _) = parse_rfc3339(&mut parsed, s)?; - if !s.is_empty() { - return Err(TOO_LONG); - } + parse(&mut parsed, s, ITEMS.iter())?; parsed.to_datetime() } @@ -854,8 +658,99 @@ where Tz::Offset: fmt::Display, { + /// Returns an RFC 2822 date and time string such as `Tue, 1 Jul 2003 10:52:37 +0200`. + #[cfg(any(feature = "alloc", feature = "std", test))] + #[cfg_attr(docsrs, doc(cfg(any(feature = "alloc", feature = "std"))))] + #[must_use] + pub fn to_rfc2822(&self) -> String { + let mut result = String::with_capacity(32); + crate::format::write_rfc2822(&mut result, self.naive_local(), self.offset.fix()) + .expect("writing rfc2822 datetime to string should never fail"); + result + } + + /// Returns an RFC 3339 and ISO 8601 date and time string such as `1996-12-19T16:39:57-08:00`. + #[cfg(any(feature = "alloc", feature = "std", test))] + #[cfg_attr(docsrs, doc(cfg(any(feature = "alloc", feature = "std"))))] + #[must_use] + pub fn to_rfc3339(&self) -> String { + let mut result = String::with_capacity(32); + crate::format::write_rfc3339(&mut result, self.naive_local(), self.offset.fix()) + .expect("writing rfc3339 datetime to string should never fail"); + result + } + + /// Return an RFC 3339 and ISO 8601 date and time string with subseconds + /// formatted as per `SecondsFormat`. + /// + /// If `use_z` is true and the timezone is UTC (offset 0), uses `Z` as + /// per [`Fixed::TimezoneOffsetColonZ`]. If `use_z` is false, uses + /// [`Fixed::TimezoneOffsetColon`] + /// + /// # Examples + /// + /// ```rust + /// # use chrono::{FixedOffset, SecondsFormat, TimeZone, Utc, NaiveDate}; + /// let dt = NaiveDate::from_ymd_opt(2018, 1, 26).unwrap().and_hms_micro_opt(18, 30, 9, 453_829).unwrap().and_local_timezone(Utc).unwrap(); + /// assert_eq!(dt.to_rfc3339_opts(SecondsFormat::Millis, false), + /// "2018-01-26T18:30:09.453+00:00"); + /// assert_eq!(dt.to_rfc3339_opts(SecondsFormat::Millis, true), + /// "2018-01-26T18:30:09.453Z"); + /// assert_eq!(dt.to_rfc3339_opts(SecondsFormat::Secs, true), + /// "2018-01-26T18:30:09Z"); + /// + /// let pst = FixedOffset::east_opt(8 * 60 * 60).unwrap(); + /// let dt = pst.from_local_datetime(&NaiveDate::from_ymd_opt(2018, 1, 26).unwrap().and_hms_micro_opt(10, 30, 9, 453_829).unwrap()).unwrap(); + /// assert_eq!(dt.to_rfc3339_opts(SecondsFormat::Secs, true), + /// "2018-01-26T10:30:09+08:00"); + /// ``` + #[cfg(any(feature = "alloc", feature = "std", test))] + #[cfg_attr(docsrs, doc(cfg(any(feature = "alloc", feature = "std"))))] + #[must_use] + pub fn to_rfc3339_opts(&self, secform: SecondsFormat, use_z: bool) -> String { + use crate::format::Numeric::*; + use crate::format::Pad::Zero; + use crate::SecondsFormat::*; + + debug_assert!(secform != __NonExhaustive, "Do not use __NonExhaustive!"); + + const PREFIX: &[Item<'static>] = &[ + Item::Numeric(Year, Zero), + Item::Literal("-"), + Item::Numeric(Month, Zero), + Item::Literal("-"), + Item::Numeric(Day, Zero), + Item::Literal("T"), + Item::Numeric(Hour, Zero), + Item::Literal(":"), + Item::Numeric(Minute, Zero), + Item::Literal(":"), + Item::Numeric(Second, Zero), + ]; + + let ssitem = match secform { + Secs => None, + Millis => Some(Item::Fixed(Fixed::Nanosecond3)), + Micros => Some(Item::Fixed(Fixed::Nanosecond6)), + Nanos => Some(Item::Fixed(Fixed::Nanosecond9)), + AutoSi => Some(Item::Fixed(Fixed::Nanosecond)), + __NonExhaustive => unreachable!(), + }; + + let tzitem = Item::Fixed(if use_z { + Fixed::TimezoneOffsetColonZ + } else { + Fixed::TimezoneOffsetColon + }); + + match ssitem { + None => self.format_with_items(PREFIX.iter().chain([tzitem].iter())).to_string(), + Some(s) => self.format_with_items(PREFIX.iter().chain([s, tzitem].iter())).to_string(), + } + } + /// Formats the combined date and time with the specified formatting items. - #[cfg(any(feature = "alloc", feature = "std"))] + #[cfg(any(feature = "alloc", feature = "std", test))] #[cfg_attr(docsrs, doc(cfg(any(feature = "alloc", feature = "std"))))] #[inline] #[must_use] @@ -880,7 +775,7 @@ /// let formatted = format!("{}", date_time.format("%d/%m/%Y %H:%M")); /// assert_eq!(formatted, "02/04/2017 12:50"); /// ``` - #[cfg(any(feature = "alloc", feature = "std"))] + #[cfg(any(feature = "alloc", feature = "std", test))] #[cfg_attr(docsrs, doc(cfg(any(feature = "alloc", feature = "std"))))] #[inline] #[must_use] @@ -969,112 +864,35 @@ } #[inline] - /// Makes a new `DateTime` with the year number changed, while keeping the same month and day. - /// - /// See also the [`NaiveDate::with_year`] method. - /// - /// # Errors - /// - /// Returns `None` if: - /// - The resulting date does not exist. - /// - When the `NaiveDateTime` would be out of range. - /// - The local time at the resulting date does not exist or is ambiguous, for example during a - /// daylight saving time transition. fn with_year(&self, year: i32) -> Option> { map_local(self, |datetime| datetime.with_year(year)) } - /// Makes a new `DateTime` with the month number (starting from 1) changed. - /// - /// See also the [`NaiveDate::with_month`] method. - /// - /// # Errors - /// - /// Returns `None` if: - /// - The resulting date does not exist. - /// - The value for `month` is invalid. - /// - The local time at the resulting date does not exist or is ambiguous, for example during a - /// daylight saving time transition. #[inline] fn with_month(&self, month: u32) -> Option> { map_local(self, |datetime| datetime.with_month(month)) } - /// Makes a new `DateTime` with the month number (starting from 0) changed. - /// - /// See also the [`NaiveDate::with_month0`] method. - /// - /// # Errors - /// - /// Returns `None` if: - /// - The resulting date does not exist. - /// - The value for `month0` is invalid. - /// - The local time at the resulting date does not exist or is ambiguous, for example during a - /// daylight saving time transition. #[inline] fn with_month0(&self, month0: u32) -> Option> { map_local(self, |datetime| datetime.with_month0(month0)) } - /// Makes a new `DateTime` with the month number (starting from 0) changed. - /// - /// See also the [`NaiveDate::with_day`] method. - /// - /// # Errors - /// - /// Returns `None` if: - /// - The resulting date does not exist. - /// - The value for `day` is invalid. - /// - The local time at the resulting date does not exist or is ambiguous, for example during a - /// daylight saving time transition. #[inline] fn with_day(&self, day: u32) -> Option> { map_local(self, |datetime| datetime.with_day(day)) } - /// Makes a new `DateTime` with the month number (starting from 0) changed. - /// - /// See also the [`NaiveDate::with_day0`] method. - /// - /// # Errors - /// - /// Returns `None` if: - /// - The resulting date does not exist. - /// - The value for `day0` is invalid. - /// - The local time at the resulting date does not exist or is ambiguous, for example during a - /// daylight saving time transition. #[inline] fn with_day0(&self, day0: u32) -> Option> { map_local(self, |datetime| datetime.with_day0(day0)) } - /// Makes a new `DateTime` with the month number (starting from 0) changed. - /// - /// See also the [`NaiveDate::with_ordinal`] method. - /// - /// # Errors - /// - /// Returns `None` if: - /// - The resulting date does not exist. - /// - The value for `ordinal` is invalid. - /// - The local time at the resulting date does not exist or is ambiguous, for example during a - /// daylight saving time transition. #[inline] fn with_ordinal(&self, ordinal: u32) -> Option> { map_local(self, |datetime| datetime.with_ordinal(ordinal)) } - /// Makes a new `DateTime` with the month number (starting from 0) changed. - /// - /// See also the [`NaiveDate::with_ordinal0`] method. - /// - /// # Errors - /// - /// Returns `None` if: - /// - The resulting date does not exist. - /// - The value for `ordinal0` is invalid. - /// - The local time at the resulting date does not exist or is ambiguous, for example during a - /// daylight saving time transition. #[inline] fn with_ordinal0(&self, ordinal0: u32) -> Option> { map_local(self, |datetime| datetime.with_ordinal0(ordinal0)) @@ -1099,64 +917,21 @@ self.naive_local().nanosecond() } - /// Makes a new `DateTime` with the hour number changed. - /// - /// See also the [`NaiveTime::with_hour`] method. - /// - /// # Errors - /// - /// Returns `None` if: - /// - The value for `hour` is invalid. - /// - The local time at the resulting date does not exist or is ambiguous, for example during a - /// daylight saving time transition. #[inline] fn with_hour(&self, hour: u32) -> Option> { map_local(self, |datetime| datetime.with_hour(hour)) } - /// Makes a new `DateTime` with the minute number changed. - /// - /// See also the [`NaiveTime::with_minute`] method. - /// - /// # Errors - /// - /// - The value for `minute` is invalid. - /// - The local time at the resulting date does not exist or is ambiguous, for example during a - /// daylight saving time transition. #[inline] fn with_minute(&self, min: u32) -> Option> { map_local(self, |datetime| datetime.with_minute(min)) } - /// Makes a new `DateTime` with the second number changed. - /// - /// As with the [`second`](#method.second) method, - /// the input range is restricted to 0 through 59. - /// - /// See also the [`NaiveTime::with_second`] method. - /// - /// # Errors - /// - /// Returns `None` if: - /// - The value for `second` is invalid. - /// - The local time at the resulting date does not exist or is ambiguous, for example during a - /// daylight saving time transition. #[inline] fn with_second(&self, sec: u32) -> Option> { map_local(self, |datetime| datetime.with_second(sec)) } - /// Makes a new `DateTime` with nanoseconds since the whole non-leap second changed. - /// - /// Returns `None` when the resulting `NaiveDateTime` would be invalid. - /// As with the [`NaiveDateTime::nanosecond`] method, - /// the input range can exceed 1,000,000,000 for leap seconds. - /// - /// See also the [`NaiveTime::with_nanosecond`] method. - /// - /// # Errors - /// - /// Returns `None` if `nanosecond >= 2,000,000,000`. #[inline] fn with_nanosecond(&self, nano: u32) -> Option> { map_local(self, |datetime| datetime.with_nanosecond(nano)) @@ -1217,17 +992,6 @@ } } -impl Add for DateTime { - type Output = DateTime; - - #[inline] - fn add(self, rhs: Duration) -> DateTime { - let rhs = OldDuration::from_std(rhs) - .expect("overflow converting from core::time::Duration to chrono::Duration"); - self.checked_add_signed(rhs).expect("`DateTime + Duration` overflowed") - } -} - impl AddAssign for DateTime { #[inline] fn add_assign(&mut self, rhs: OldDuration) { @@ -1238,15 +1002,6 @@ } } -impl AddAssign for DateTime { - #[inline] - fn add_assign(&mut self, rhs: Duration) { - let rhs = OldDuration::from_std(rhs) - .expect("overflow converting from core::time::Duration to chrono::Duration"); - *self += rhs; - } -} - impl Add for DateTime { type Output = DateTime; @@ -1264,17 +1019,6 @@ } } -impl Sub for DateTime { - type Output = DateTime; - - #[inline] - fn sub(self, rhs: Duration) -> DateTime { - let rhs = OldDuration::from_std(rhs) - .expect("overflow converting from core::time::Duration to chrono::Duration"); - self.checked_sub_signed(rhs).expect("`DateTime - Duration` overflowed") - } -} - impl SubAssign for DateTime { #[inline] fn sub_assign(&mut self, rhs: OldDuration) { @@ -1285,15 +1029,6 @@ } } -impl SubAssign for DateTime { - #[inline] - fn sub_assign(&mut self, rhs: Duration) { - let rhs = OldDuration::from_std(rhs) - .expect("overflow converting from core::time::Duration to chrono::Duration"); - *self -= rhs; - } -} - impl Sub for DateTime { type Output = DateTime; @@ -1311,15 +1046,6 @@ } } -impl Sub<&DateTime> for DateTime { - type Output = OldDuration; - - #[inline] - fn sub(self, rhs: &DateTime) -> OldDuration { - self.signed_duration_since(rhs) - } -} - impl Add for DateTime { type Output = DateTime; @@ -1355,7 +1081,7 @@ } /// Accepts a relaxed form of RFC3339. -/// A space or a 'T' are accepted as the separator between the date and time +/// A space or a 'T' are acepted as the separator between the date and time /// parts. /// /// All of these examples are equivalent: @@ -1376,7 +1102,7 @@ } /// Accepts a relaxed form of RFC3339. -/// A space or a 'T' are accepted as the separator between the date and time +/// A space or a 'T' are acepted as the separator between the date and time /// parts. /// /// All of these examples are equivalent: @@ -1398,7 +1124,7 @@ } } -#[cfg(feature = "std")] +#[cfg(any(feature = "std", test))] #[cfg_attr(docsrs, doc(cfg(feature = "std")))] impl From for DateTime { fn from(t: SystemTime) -> DateTime { @@ -1427,10 +1153,12 @@ } } -#[cfg(feature = "std")] +#[cfg(any(feature = "std", test))] #[cfg_attr(docsrs, doc(cfg(feature = "std")))] impl From> for SystemTime { fn from(dt: DateTime) -> SystemTime { + use std::time::Duration; + let sec = dt.timestamp(); let nsec = dt.timestamp_subsec_nanos(); if sec < 0 { @@ -1518,6 +1246,34 @@ } } +#[test] +fn test_add_sub_months() { + let utc_dt = Utc.with_ymd_and_hms(2018, 9, 5, 23, 58, 0).unwrap(); + assert_eq!(utc_dt + Months::new(15), Utc.with_ymd_and_hms(2019, 12, 5, 23, 58, 0).unwrap()); + + let utc_dt = Utc.with_ymd_and_hms(2020, 1, 31, 23, 58, 0).unwrap(); + assert_eq!(utc_dt + Months::new(1), Utc.with_ymd_and_hms(2020, 2, 29, 23, 58, 0).unwrap()); + assert_eq!(utc_dt + Months::new(2), Utc.with_ymd_and_hms(2020, 3, 31, 23, 58, 0).unwrap()); + + let utc_dt = Utc.with_ymd_and_hms(2018, 9, 5, 23, 58, 0).unwrap(); + assert_eq!(utc_dt - Months::new(15), Utc.with_ymd_and_hms(2017, 6, 5, 23, 58, 0).unwrap()); + + let utc_dt = Utc.with_ymd_and_hms(2020, 3, 31, 23, 58, 0).unwrap(); + assert_eq!(utc_dt - Months::new(1), Utc.with_ymd_and_hms(2020, 2, 29, 23, 58, 0).unwrap()); + assert_eq!(utc_dt - Months::new(2), Utc.with_ymd_and_hms(2020, 1, 31, 23, 58, 0).unwrap()); +} + +#[test] +fn test_auto_conversion() { + let utc_dt = Utc.with_ymd_and_hms(2018, 9, 5, 23, 58, 0).unwrap(); + let cdt_dt = FixedOffset::west_opt(5 * 60 * 60) + .unwrap() + .with_ymd_and_hms(2018, 9, 5, 18, 58, 0) + .unwrap(); + let utc_dt2: DateTime = cdt_dt.into(); + assert_eq!(utc_dt, utc_dt2); +} + #[cfg(all(test, any(feature = "rustc-serialize", feature = "serde")))] fn test_encodable_json(to_string_utc: FUtc, to_string_fixed: FFixed) where @@ -1542,9 +1298,7 @@ &FixedOffset::east_opt(3650).unwrap().with_ymd_and_hms(2014, 7, 24, 12, 34, 6).unwrap() ) .ok(), - // An offset with seconds is not allowed by RFC 3339, so we round it to the nearest minute. - // In this case `+01:00:50` becomes `+01:01` - Some(r#""2014-07-24T12:34:06+01:01""#.into()) + Some(r#""2014-07-24T12:34:06+01:00:50""#.into()) ); } @@ -1592,7 +1346,7 @@ // we don't know the exact local offset but we can check that // the conversion didn't change the instant itself assert_eq!( - local_from_str(r#""2014-07-24T12:34:06Z""#).expect("local should parse"), + local_from_str(r#""2014-07-24T12:34:06Z""#).expect("local shouuld parse"), Utc.with_ymd_and_hms(2014, 7, 24, 12, 34, 6).unwrap() ); assert_eq!( diff -Nru temporalio-1.3.0/vendor/chrono/src/datetime/rustc_serialize.rs temporalio-1.3.0/vendor/chrono/src/datetime/rustc_serialize.rs --- temporalio-1.3.0/vendor/chrono/src/datetime/rustc_serialize.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/chrono/src/datetime/rustc_serialize.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,6 +1,6 @@ #![cfg_attr(docsrs, doc(cfg(feature = "rustc-serialize")))] -use super::{DateTime, SecondsFormat}; +use super::DateTime; #[cfg(feature = "clock")] use crate::offset::Local; use crate::offset::{FixedOffset, LocalResult, TimeZone, Utc}; @@ -10,7 +10,7 @@ impl Encodable for DateTime { fn encode(&self, s: &mut S) -> Result<(), S::Error> { - self.to_rfc3339_opts(SecondsFormat::AutoSi, true).encode(s) + format!("{:?}", self).encode(s) } } @@ -103,25 +103,21 @@ } #[cfg(test)] -mod tests { - use crate::datetime::test_encodable_json; - use crate::datetime::{test_decodable_json, test_decodable_json_timestamps}; - use rustc_serialize::json; - - #[test] - fn test_encodable() { - test_encodable_json(json::encode, json::encode); - } - - #[cfg(feature = "clock")] - #[test] - fn test_decodable() { - test_decodable_json(json::decode, json::decode, json::decode); - } - - #[cfg(feature = "clock")] - #[test] - fn test_decodable_timestamps() { - test_decodable_json_timestamps(json::decode, json::decode, json::decode); - } +use rustc_serialize::json; + +#[test] +fn test_encodable() { + super::test_encodable_json(json::encode, json::encode); +} + +#[cfg(feature = "clock")] +#[test] +fn test_decodable() { + super::test_decodable_json(json::decode, json::decode, json::decode); +} + +#[cfg(feature = "clock")] +#[test] +fn test_decodable_timestamps() { + super::test_decodable_json_timestamps(json::decode, json::decode, json::decode); } diff -Nru temporalio-1.3.0/vendor/chrono/src/datetime/serde.rs temporalio-1.3.0/vendor/chrono/src/datetime/serde.rs --- temporalio-1.3.0/vendor/chrono/src/datetime/serde.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/chrono/src/datetime/serde.rs 2023-10-30 19:40:00.000000000 +0000 @@ -3,12 +3,11 @@ use core::fmt; use serde::{de, ser}; -use super::{DateTime, SecondsFormat}; -use crate::format::write_rfc3339; +use super::DateTime; use crate::naive::datetime::serde::serde_from; #[cfg(feature = "clock")] use crate::offset::Local; -use crate::offset::{FixedOffset, Offset, TimeZone, Utc}; +use crate::offset::{FixedOffset, TimeZone, Utc}; #[doc(hidden)] #[derive(Debug)] @@ -26,7 +25,7 @@ #[derive(Debug)] pub struct MilliSecondsTimestampVisitor; -/// Serialize into an ISO 8601 formatted string. +/// Serialize into a rfc3339 time string /// /// See [the `serde` module](./serde/index.html) for alternate /// serializations. @@ -35,19 +34,18 @@ where S: ser::Serializer, { - struct FormatIso8601<'a, Tz: TimeZone> { - inner: &'a DateTime, + struct FormatWrapped<'a, D: 'a> { + inner: &'a D, } - impl<'a, Tz: TimeZone> fmt::Display for FormatIso8601<'a, Tz> { + impl<'a, D: fmt::Debug> fmt::Display for FormatWrapped<'a, D> { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let naive = self.inner.naive_local(); - let offset = self.inner.offset.fix(); - write_rfc3339(f, naive, offset, SecondsFormat::AutoSi, true) + self.inner.fmt(f) } } - serializer.collect_str(&FormatIso8601 { inner: self }) + // Debug formatting is correct RFC3339, and it allows Zulu. + serializer.collect_str(&FormatWrapped { inner: &self }) } } @@ -157,14 +155,6 @@ /// /// Intended for use with `serde`s `serialize_with` attribute. /// - /// # Errors - /// - /// An `i64` with nanosecond precision can span a range of ~584 years. This function returns an - /// error on an out of range `DateTime`. - /// - /// The dates that can be represented as nanoseconds are between 1677-09-21T00:12:44.0 and - /// 2262-04-11T23:47:16.854775804. - /// /// # Example: /// /// ```rust @@ -184,13 +174,12 @@ /// assert_eq!(as_string, r#"{"time":1526522699918355733}"#); /// # Ok::<(), serde_json::Error>(()) /// ``` + #[must_use] pub fn serialize(dt: &DateTime, serializer: S) -> Result where S: ser::Serializer, { - serializer.serialize_i64(dt.timestamp_nanos_opt().ok_or(ser::Error::custom( - "value out of range for a timestamp with nanosecond precision", - ))?) + serializer.serialize_i64(dt.timestamp_nanos()) } /// Deserialize a [`DateTime`] from a nanosecond timestamp @@ -211,11 +200,9 @@ /// /// let my_s: S = serde_json::from_str(r#"{ "time": 1526522699918355733 }"#)?; /// assert_eq!(my_s, S { time: Utc.timestamp_opt(1526522699, 918355733).unwrap() }); - /// - /// let my_s: S = serde_json::from_str(r#"{ "time": -1 }"#)?; - /// assert_eq!(my_s, S { time: Utc.timestamp_opt(-1, 999_999_999).unwrap() }); /// # Ok::<(), serde_json::Error>(()) /// ``` + #[must_use] pub fn deserialize<'de, D>(d: D) -> Result, D::Error> where D: de::Deserializer<'de>, @@ -236,10 +223,7 @@ E: de::Error, { serde_from( - Utc.timestamp_opt( - value.div_euclid(1_000_000_000), - (value.rem_euclid(1_000_000_000)) as u32, - ), + Utc.timestamp_opt(value / 1_000_000_000, (value % 1_000_000_000) as u32), &value, ) } @@ -296,14 +280,6 @@ /// /// Intended for use with `serde`s `serialize_with` attribute. /// - /// # Errors - /// - /// An `i64` with nanosecond precision can span a range of ~584 years. This function returns an - /// error on an out of range `DateTime`. - /// - /// The dates that can be represented as nanoseconds are between 1677-09-21T00:12:44.0 and - /// 2262-04-11T23:47:16.854775804. - /// /// # Example: /// /// ```rust @@ -323,14 +299,13 @@ /// assert_eq!(as_string, r#"{"time":1526522699918355733}"#); /// # Ok::<(), serde_json::Error>(()) /// ``` + #[must_use] pub fn serialize(opt: &Option>, serializer: S) -> Result where S: ser::Serializer, { match *opt { - Some(ref dt) => serializer.serialize_some(&dt.timestamp_nanos_opt().ok_or( - ser::Error::custom("value out of range for a timestamp with nanosecond precision"), - )?), + Some(ref dt) => serializer.serialize_some(&dt.timestamp_nanos()), None => serializer.serialize_none(), } } @@ -355,6 +330,7 @@ /// assert_eq!(my_s, S { time: Utc.timestamp_opt(1526522699, 918355733).single() }); /// # Ok::<(), serde_json::Error>(()) /// ``` + #[must_use] pub fn deserialize<'de, D>(d: D) -> Result>, D::Error> where D: de::Deserializer<'de>, @@ -455,6 +431,7 @@ /// assert_eq!(as_string, r#"{"time":1526522699918355}"#); /// # Ok::<(), serde_json::Error>(()) /// ``` + #[must_use] pub fn serialize(dt: &DateTime, serializer: S) -> Result where S: ser::Serializer, @@ -480,11 +457,9 @@ /// /// let my_s: S = serde_json::from_str(r#"{ "time": 1526522699918355 }"#)?; /// assert_eq!(my_s, S { time: Utc.timestamp_opt(1526522699, 918355000).unwrap() }); - /// - /// let my_s: S = serde_json::from_str(r#"{ "time": -1 }"#)?; - /// assert_eq!(my_s, S { time: Utc.timestamp_opt(-1, 999_999_000).unwrap() }); /// # Ok::<(), serde_json::Error>(()) /// ``` + #[must_use] pub fn deserialize<'de, D>(d: D) -> Result, D::Error> where D: de::Deserializer<'de>, @@ -505,10 +480,7 @@ E: de::Error, { serde_from( - Utc.timestamp_opt( - value.div_euclid(1_000_000), - (value.rem_euclid(1_000_000) * 1_000) as u32, - ), + Utc.timestamp_opt(value / 1_000_000, ((value % 1_000_000) * 1_000) as u32), &value, ) } @@ -583,6 +555,7 @@ /// assert_eq!(as_string, r#"{"time":1526522699918355}"#); /// # Ok::<(), serde_json::Error>(()) /// ``` + #[must_use] pub fn serialize(opt: &Option>, serializer: S) -> Result where S: ser::Serializer, @@ -613,6 +586,7 @@ /// assert_eq!(my_s, S { time: Utc.timestamp_opt(1526522699, 918355000).single() }); /// # Ok::<(), serde_json::Error>(()) /// ``` + #[must_use] pub fn deserialize<'de, D>(d: D) -> Result>, D::Error> where D: de::Deserializer<'de>, @@ -713,6 +687,7 @@ /// assert_eq!(as_string, r#"{"time":1526522699918}"#); /// # Ok::<(), serde_json::Error>(()) /// ``` + #[must_use] pub fn serialize(dt: &DateTime, serializer: S) -> Result where S: ser::Serializer, @@ -738,11 +713,9 @@ /// /// let my_s: S = serde_json::from_str(r#"{ "time": 1526522699918 }"#)?; /// assert_eq!(my_s, S { time: Utc.timestamp_opt(1526522699, 918000000).unwrap() }); - /// - /// let my_s: S = serde_json::from_str(r#"{ "time": -1 }"#)?; - /// assert_eq!(my_s, S { time: Utc.timestamp_opt(-1, 999_000_000).unwrap() }); /// # Ok::<(), serde_json::Error>(()) /// ``` + #[must_use] pub fn deserialize<'de, D>(d: D) -> Result, D::Error> where D: de::Deserializer<'de>, @@ -762,7 +735,7 @@ where E: de::Error, { - serde_from(Utc.timestamp_millis_opt(value), &value) + serde_from(Utc.timestamp_opt(value / 1000, ((value % 1000) * 1_000_000) as u32), &value) } /// Deserialize a timestamp in milliseconds since the epoch @@ -835,6 +808,7 @@ /// assert_eq!(as_string, r#"{"time":1526522699918}"#); /// # Ok::<(), serde_json::Error>(()) /// ``` + #[must_use] pub fn serialize(opt: &Option>, serializer: S) -> Result where S: ser::Serializer, @@ -876,6 +850,7 @@ /// assert_eq!(t, E::V(S { time: None })); /// # Ok::<(), serde_json::Error>(()) /// ``` + #[must_use] pub fn deserialize<'de, D>(d: D) -> Result>, D::Error> where D: de::Deserializer<'de>, @@ -951,7 +926,8 @@ use serde::{de, ser}; use super::{serde_from, SecondsTimestampVisitor}; - use crate::{DateTime, LocalResult, TimeZone, Utc}; + use crate::offset::TimeZone; + use crate::{DateTime, Utc}; /// Serialize a UTC datetime into an integer number of seconds since the epoch /// @@ -976,6 +952,7 @@ /// assert_eq!(as_string, r#"{"time":1431684000}"#); /// # Ok::<(), serde_json::Error>(()) /// ``` + #[must_use] pub fn serialize(dt: &DateTime, serializer: S) -> Result where S: ser::Serializer, @@ -1003,6 +980,7 @@ /// assert_eq!(my_s, S { time: Utc.timestamp_opt(1431684000, 0).unwrap() }); /// # Ok::<(), serde_json::Error>(()) /// ``` + #[must_use] pub fn deserialize<'de, D>(d: D) -> Result, D::Error> where D: de::Deserializer<'de>, @@ -1030,14 +1008,7 @@ where E: de::Error, { - serde_from( - if value > i64::MAX as u64 { - LocalResult::None - } else { - Utc.timestamp_opt(value as i64, 0) - }, - &value, - ) + serde_from(Utc.timestamp_opt(value as i64, 0), &value) } } } @@ -1099,6 +1070,7 @@ /// assert_eq!(as_string, r#"{"time":1431684000}"#); /// # Ok::<(), serde_json::Error>(()) /// ``` + #[must_use] pub fn serialize(opt: &Option>, serializer: S) -> Result where S: ser::Serializer, @@ -1129,6 +1101,7 @@ /// assert_eq!(my_s, S { time: Utc.timestamp_opt(1431684000, 0).single() }); /// # Ok::<(), serde_json::Error>(()) /// ``` + #[must_use] pub fn deserialize<'de, D>(d: D) -> Result>, D::Error> where D: de::Deserializer<'de>, @@ -1171,89 +1144,30 @@ } } -#[cfg(test)] -mod tests { - #[cfg(feature = "clock")] - use crate::datetime::test_decodable_json; - use crate::datetime::test_encodable_json; - use crate::{DateTime, FixedOffset, TimeZone, Utc}; - use core::fmt; - - #[test] - fn test_serde_serialize() { - test_encodable_json(serde_json::to_string, serde_json::to_string); - } - - #[cfg(feature = "clock")] - #[test] - fn test_serde_deserialize() { - test_decodable_json( - |input| serde_json::from_str(input), - |input| serde_json::from_str(input), - |input| serde_json::from_str(input), - ); - } - - #[test] - fn test_serde_bincode() { - // Bincode is relevant to test separately from JSON because - // it is not self-describing. - use bincode::{deserialize, serialize}; - - let dt = Utc.with_ymd_and_hms(2014, 7, 24, 12, 34, 6).unwrap(); - let encoded = serialize(&dt).unwrap(); - let decoded: DateTime = deserialize(&encoded).unwrap(); - assert_eq!(dt, decoded); - assert_eq!(dt.offset(), decoded.offset()); - } - - #[test] - fn test_serde_no_offset_debug() { - use crate::{LocalResult, NaiveDate, NaiveDateTime, Offset}; - use core::fmt::Debug; - - #[derive(Clone)] - struct TestTimeZone; - impl Debug for TestTimeZone { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "TEST") - } - } - impl TimeZone for TestTimeZone { - type Offset = TestTimeZone; - fn from_offset(_state: &TestTimeZone) -> TestTimeZone { - TestTimeZone - } - fn offset_from_local_date(&self, _local: &NaiveDate) -> LocalResult { - LocalResult::Single(TestTimeZone) - } - fn offset_from_local_datetime( - &self, - _local: &NaiveDateTime, - ) -> LocalResult { - LocalResult::Single(TestTimeZone) - } - fn offset_from_utc_date(&self, _utc: &NaiveDate) -> TestTimeZone { - TestTimeZone - } - fn offset_from_utc_datetime(&self, _utc: &NaiveDateTime) -> TestTimeZone { - TestTimeZone - } - } - impl Offset for TestTimeZone { - fn fix(&self) -> FixedOffset { - FixedOffset::east_opt(15 * 60 * 60).unwrap() - } - } +#[test] +fn test_serde_serialize() { + super::test_encodable_json(serde_json::to_string, serde_json::to_string); +} - let tz = TestTimeZone; - assert_eq!(format!("{:?}", &tz), "TEST"); +#[cfg(feature = "clock")] +#[test] +fn test_serde_deserialize() { + super::test_decodable_json( + |input| serde_json::from_str(input), + |input| serde_json::from_str(input), + |input| serde_json::from_str(input), + ); +} - let dt = tz.with_ymd_and_hms(2023, 4, 24, 21, 10, 33).unwrap(); - let encoded = serde_json::to_string(&dt).unwrap(); - dbg!(&encoded); - let decoded: DateTime = serde_json::from_str(&encoded).unwrap(); - assert_eq!(dt, decoded); - assert_eq!(dt.offset().fix(), *decoded.offset()); - } +#[test] +fn test_serde_bincode() { + // Bincode is relevant to test separately from JSON because + // it is not self-describing. + use bincode::{deserialize, serialize}; + + let dt = Utc.with_ymd_and_hms(2014, 7, 24, 12, 34, 6).unwrap(); + let encoded = serialize(&dt).unwrap(); + let decoded: DateTime = deserialize(&encoded).unwrap(); + assert_eq!(dt, decoded); + assert_eq!(dt.offset(), decoded.offset()); } diff -Nru temporalio-1.3.0/vendor/chrono/src/datetime/tests.rs temporalio-1.3.0/vendor/chrono/src/datetime/tests.rs --- temporalio-1.3.0/vendor/chrono/src/datetime/tests.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/chrono/src/datetime/tests.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,10 +1,12 @@ +use std::time::{SystemTime, UNIX_EPOCH}; + use super::DateTime; -use crate::duration::Duration as OldDuration; use crate::naive::{NaiveDate, NaiveTime}; use crate::offset::{FixedOffset, TimeZone, Utc}; #[cfg(feature = "clock")] use crate::offset::{Local, Offset}; -use crate::{Datelike, Days, LocalResult, Months, NaiveDateTime, Timelike}; +use crate::oldtime::Duration; +use crate::{Datelike, Days, LocalResult, Months, NaiveDateTime}; #[derive(Clone)] struct DstTester; @@ -54,7 +56,7 @@ DstTester::TO_WINTER_MONTH_DAY.1, ) .unwrap() - .and_time(DstTester::transition_start_local() - OldDuration::hours(1)); + .and_time(DstTester::transition_start_local() - Duration::hours(1)); let local_to_summer_transition_start = NaiveDate::from_ymd_opt( local.year(), @@ -70,7 +72,7 @@ DstTester::TO_SUMMER_MONTH_DAY.1, ) .unwrap() - .and_time(DstTester::transition_start_local() + OldDuration::hours(1)); + .and_time(DstTester::transition_start_local() + Duration::hours(1)); if *local < local_to_winter_transition_end || *local >= local_to_summer_transition_end { LocalResult::Single(DstTester::summer_offset()) @@ -238,101 +240,6 @@ ); } -// local helper function to easily create a DateTime -#[allow(clippy::too_many_arguments)] -fn ymdhms( - fixedoffset: &FixedOffset, - year: i32, - month: u32, - day: u32, - hour: u32, - min: u32, - sec: u32, -) -> DateTime { - fixedoffset.with_ymd_and_hms(year, month, day, hour, min, sec).unwrap() -} - -// local helper function to easily create a DateTime -#[allow(clippy::too_many_arguments)] -fn ymdhms_milli( - fixedoffset: &FixedOffset, - year: i32, - month: u32, - day: u32, - hour: u32, - min: u32, - sec: u32, - milli: u32, -) -> DateTime { - fixedoffset - .with_ymd_and_hms(year, month, day, hour, min, sec) - .unwrap() - .with_nanosecond(milli * 1_000_000) - .unwrap() -} - -// local helper function to easily create a DateTime -#[allow(clippy::too_many_arguments)] -#[cfg(any(feature = "alloc", feature = "std"))] -fn ymdhms_micro( - fixedoffset: &FixedOffset, - year: i32, - month: u32, - day: u32, - hour: u32, - min: u32, - sec: u32, - micro: u32, -) -> DateTime { - fixedoffset - .with_ymd_and_hms(year, month, day, hour, min, sec) - .unwrap() - .with_nanosecond(micro * 1000) - .unwrap() -} - -// local helper function to easily create a DateTime -#[allow(clippy::too_many_arguments)] -#[cfg(any(feature = "alloc", feature = "std"))] -fn ymdhms_nano( - fixedoffset: &FixedOffset, - year: i32, - month: u32, - day: u32, - hour: u32, - min: u32, - sec: u32, - nano: u32, -) -> DateTime { - fixedoffset - .with_ymd_and_hms(year, month, day, hour, min, sec) - .unwrap() - .with_nanosecond(nano) - .unwrap() -} - -// local helper function to easily create a DateTime -#[cfg(any(feature = "alloc", feature = "std"))] -fn ymdhms_utc(year: i32, month: u32, day: u32, hour: u32, min: u32, sec: u32) -> DateTime { - Utc.with_ymd_and_hms(year, month, day, hour, min, sec).unwrap() -} - -// local helper function to easily create a DateTime -fn ymdhms_milli_utc( - year: i32, - month: u32, - day: u32, - hour: u32, - min: u32, - sec: u32, - milli: u32, -) -> DateTime { - Utc.with_ymd_and_hms(year, month, day, hour, min, sec) - .unwrap() - .with_nanosecond(milli * 1_000_000) - .unwrap() -} - #[test] fn test_datetime_offset() { let est = FixedOffset::west_opt(5 * 60 * 60).unwrap(); @@ -393,12 +300,12 @@ let dt = Utc.with_ymd_and_hms(2014, 5, 6, 7, 8, 9).unwrap(); assert_eq!(dt, edt.with_ymd_and_hms(2014, 5, 6, 3, 8, 9).unwrap()); assert_eq!( - dt + OldDuration::seconds(3600 + 60 + 1), + dt + Duration::seconds(3600 + 60 + 1), Utc.with_ymd_and_hms(2014, 5, 6, 8, 9, 10).unwrap() ); assert_eq!( dt.signed_duration_since(edt.with_ymd_and_hms(2014, 5, 6, 10, 11, 12).unwrap()), - OldDuration::seconds(-7 * 3600 - 3 * 60 - 3) + Duration::seconds(-7 * 3600 - 3 * 60 - 3) ); assert_eq!(*Utc.with_ymd_and_hms(2014, 5, 6, 7, 8, 9).unwrap().offset(), Utc); @@ -407,20 +314,6 @@ } #[test] -#[allow(clippy::needless_borrow, clippy::op_ref)] -fn signed_duration_since_autoref() { - let dt1 = Utc.with_ymd_and_hms(2014, 5, 6, 7, 8, 9).unwrap(); - let dt2 = Utc.with_ymd_and_hms(2014, 3, 4, 5, 6, 7).unwrap(); - let diff1 = dt1.signed_duration_since(dt2); // Copy/consume - let diff2 = dt2.signed_duration_since(&dt1); // Take by reference - assert_eq!(diff1, -diff2); - - let diff1 = dt1 - &dt2; // We can choose to substract rhs by reference - let diff2 = dt2 - dt1; // Or consume rhs - assert_eq!(diff1, -diff2); -} - -#[test] fn test_datetime_date_and_time() { let tz = FixedOffset::east_opt(5 * 60 * 60).unwrap(); let d = tz.with_ymd_and_hms(2014, 5, 6, 7, 8, 9).unwrap(); @@ -451,20 +344,16 @@ } #[test] -#[cfg(any(feature = "alloc", feature = "std"))] -fn test_datetime_rfc2822() { +fn test_datetime_rfc2822_and_rfc3339() { let edt = FixedOffset::east_opt(5 * 60 * 60).unwrap(); - - // timezone 0 assert_eq!( Utc.with_ymd_and_hms(2015, 2, 18, 23, 16, 9).unwrap().to_rfc2822(), "Wed, 18 Feb 2015 23:16:09 +0000" ); assert_eq!( - Utc.with_ymd_and_hms(2015, 2, 1, 23, 16, 9).unwrap().to_rfc2822(), - "Sun, 1 Feb 2015 23:16:09 +0000" + Utc.with_ymd_and_hms(2015, 2, 18, 23, 16, 9).unwrap().to_rfc3339(), + "2015-02-18T23:16:09+00:00" ); - // timezone +05 assert_eq!( edt.from_local_datetime( &NaiveDate::from_ymd_opt(2015, 2, 18) @@ -477,29 +366,16 @@ "Wed, 18 Feb 2015 23:16:09 +0500" ); assert_eq!( - DateTime::parse_from_rfc2822("Wed, 18 Feb 2015 23:59:60 +0500"), - Ok(edt - .from_local_datetime( - &NaiveDate::from_ymd_opt(2015, 2, 18) - .unwrap() - .and_hms_milli_opt(23, 59, 59, 1_000) - .unwrap() - ) - .unwrap()) - ); - assert!(DateTime::parse_from_rfc2822("31 DEC 262143 23:59 -2359").is_err()); - assert_eq!( - DateTime::parse_from_rfc3339("2015-02-18T23:59:60.234567+05:00"), - Ok(edt - .from_local_datetime( - &NaiveDate::from_ymd_opt(2015, 2, 18) - .unwrap() - .and_hms_micro_opt(23, 59, 59, 1_234_567) - .unwrap() - ) - .unwrap()) + edt.from_local_datetime( + &NaiveDate::from_ymd_opt(2015, 2, 18) + .unwrap() + .and_hms_milli_opt(23, 16, 9, 150) + .unwrap() + ) + .unwrap() + .to_rfc3339(), + "2015-02-18T23:16:09.150+05:00" ); - // seconds 60 assert_eq!( edt.from_local_datetime( &NaiveDate::from_ymd_opt(2015, 2, 18) @@ -511,159 +387,56 @@ .to_rfc2822(), "Wed, 18 Feb 2015 23:59:60 +0500" ); - - assert_eq!( - DateTime::parse_from_rfc2822("Wed, 18 Feb 2015 23:16:09 +0000"), - Ok(FixedOffset::east_opt(0).unwrap().with_ymd_and_hms(2015, 2, 18, 23, 16, 9).unwrap()) - ); - assert_eq!( - DateTime::parse_from_rfc2822("Wed, 18 Feb 2015 23:16:09 -0000"), - Ok(FixedOffset::east_opt(0).unwrap().with_ymd_and_hms(2015, 2, 18, 23, 16, 9).unwrap()) - ); - assert_eq!( - ymdhms_micro(&edt, 2015, 2, 18, 23, 59, 59, 1_234_567).to_rfc2822(), - "Wed, 18 Feb 2015 23:59:60 +0500" - ); - assert_eq!( - DateTime::parse_from_rfc2822("Wed, 18 Feb 2015 23:59:58 +0500"), - Ok(ymdhms(&edt, 2015, 2, 18, 23, 59, 58)) - ); - assert_ne!( - DateTime::parse_from_rfc2822("Wed, 18 Feb 2015 23:59:58 +0500"), - Ok(ymdhms_milli(&edt, 2015, 2, 18, 23, 59, 58, 500)) - ); - - // many varying whitespace intermixed - assert_eq!( - DateTime::parse_from_rfc2822( - "\t\t\tWed,\n\t\t18 \r\n\t\tFeb \u{3000} 2015\r\n\t\t\t23:59:58 \t+0500" - ), - Ok(ymdhms(&edt, 2015, 2, 18, 23, 59, 58)) - ); - // example from RFC 2822 Appendix A.5. - assert_eq!( - DateTime::parse_from_rfc2822( - "Thu,\n\t13\n Feb\n 1969\n 23:32\n -0330 (Newfoundland Time)" - ), - Ok( - ymdhms( - &FixedOffset::east_opt(-3 * 60 * 60 - 30 * 60).unwrap(), - 1969, 2, 13, 23, 32, 0, - ) - ) - ); - // example from RFC 2822 Appendix A.5. without trailing " (Newfoundland Time)" assert_eq!( - DateTime::parse_from_rfc2822( - "Thu,\n\t13\n Feb\n 1969\n 23:32\n -0330" - ), - Ok( - ymdhms(&FixedOffset::east_opt(-3 * 60 * 60 - 30 * 60).unwrap(), 1969, 2, 13, 23, 32, 0,) - ) - ); - - // bad year - assert!(DateTime::parse_from_rfc2822("31 DEC 262143 23:59 -2359").is_err()); - // wrong format - assert!(DateTime::parse_from_rfc2822("Wed, 18 Feb 2015 23:16:09 +00:00").is_err()); - // full name day of week - assert!(DateTime::parse_from_rfc2822("Wednesday, 18 Feb 2015 23:16:09 +0000").is_err()); - // full name day of week - assert!(DateTime::parse_from_rfc2822("Wednesday 18 Feb 2015 23:16:09 +0000").is_err()); - // wrong day of week separator '.' - assert!(DateTime::parse_from_rfc2822("Wed. 18 Feb 2015 23:16:09 +0000").is_err()); - // *trailing* space causes failure - assert!(DateTime::parse_from_rfc2822("Wed, 18 Feb 2015 23:16:09 +0000 ").is_err()); -} - -#[test] -#[cfg(any(feature = "alloc", feature = "std"))] -fn test_datetime_rfc3339() { - let edt5 = FixedOffset::east_opt(5 * 60 * 60).unwrap(); - let edt0 = FixedOffset::east_opt(0).unwrap(); - - // timezone 0 - assert_eq!( - Utc.with_ymd_and_hms(2015, 2, 18, 23, 16, 9).unwrap().to_rfc3339(), - "2015-02-18T23:16:09+00:00" - ); - // timezone +05 - assert_eq!( - edt5.from_local_datetime( + edt.from_local_datetime( &NaiveDate::from_ymd_opt(2015, 2, 18) .unwrap() - .and_hms_milli_opt(23, 16, 9, 150) + .and_hms_micro_opt(23, 59, 59, 1_234_567) .unwrap() ) .unwrap() .to_rfc3339(), - "2015-02-18T23:16:09.150+05:00" - ); - - assert_eq!(ymdhms_utc(2015, 2, 18, 23, 16, 9).to_rfc3339(), "2015-02-18T23:16:09+00:00"); - assert_eq!( - ymdhms_milli(&edt5, 2015, 2, 18, 23, 16, 9, 150).to_rfc3339(), - "2015-02-18T23:16:09.150+05:00" - ); - assert_eq!( - ymdhms_micro(&edt5, 2015, 2, 18, 23, 59, 59, 1_234_567).to_rfc3339(), "2015-02-18T23:59:60.234567+05:00" ); - assert_eq!( - DateTime::parse_from_rfc3339("2015-02-18T23:59:59.123+05:00"), - Ok(ymdhms_micro(&edt5, 2015, 2, 18, 23, 59, 59, 123_000)) - ); - assert_eq!( - DateTime::parse_from_rfc3339("2015-02-18T23:59:59.123456+05:00"), - Ok(ymdhms_micro(&edt5, 2015, 2, 18, 23, 59, 59, 123_456)) - ); - assert_eq!( - DateTime::parse_from_rfc3339("2015-02-18T23:59:59.123456789+05:00"), - Ok(ymdhms_nano(&edt5, 2015, 2, 18, 23, 59, 59, 123_456_789)) - ); - assert_eq!( - DateTime::parse_from_rfc3339("2015-02-18T23:16:09Z"), - Ok(ymdhms(&edt0, 2015, 2, 18, 23, 16, 9)) - ); assert_eq!( - ymdhms_micro(&edt5, 2015, 2, 18, 23, 59, 59, 1_234_567).to_rfc3339(), - "2015-02-18T23:59:60.234567+05:00" + DateTime::parse_from_rfc2822("Wed, 18 Feb 2015 23:16:09 +0000"), + Ok(FixedOffset::east_opt(0).unwrap().with_ymd_and_hms(2015, 2, 18, 23, 16, 9).unwrap()) ); assert_eq!( - ymdhms_milli(&edt5, 2015, 2, 18, 23, 16, 9, 150).to_rfc3339(), - "2015-02-18T23:16:09.150+05:00" + DateTime::parse_from_rfc2822("Wed, 18 Feb 2015 23:16:09 -0000"), + Ok(FixedOffset::east_opt(0).unwrap().with_ymd_and_hms(2015, 2, 18, 23, 16, 9).unwrap()) ); assert_eq!( - DateTime::parse_from_rfc3339("2015-02-18T00:00:00.234567+05:00"), - Ok(ymdhms_micro(&edt5, 2015, 2, 18, 0, 0, 0, 234_567)) + DateTime::parse_from_rfc3339("2015-02-18T23:16:09Z"), + Ok(FixedOffset::east_opt(0).unwrap().with_ymd_and_hms(2015, 2, 18, 23, 16, 9).unwrap()) ); assert_eq!( - DateTime::parse_from_rfc3339("2015-02-18T23:16:09Z"), - Ok(ymdhms(&edt0, 2015, 2, 18, 23, 16, 9)) + DateTime::parse_from_rfc2822("Wed, 18 Feb 2015 23:59:60 +0500"), + Ok(edt + .from_local_datetime( + &NaiveDate::from_ymd_opt(2015, 2, 18) + .unwrap() + .and_hms_milli_opt(23, 59, 59, 1_000) + .unwrap() + ) + .unwrap()) ); + assert!(DateTime::parse_from_rfc2822("31 DEC 262143 23:59 -2359").is_err()); assert_eq!( - DateTime::parse_from_rfc3339("2015-02-18 23:59:60.234567+05:00"), - Ok(ymdhms_micro(&edt5, 2015, 2, 18, 23, 59, 59, 1_234_567)) + DateTime::parse_from_rfc3339("2015-02-18T23:59:60.234567+05:00"), + Ok(edt + .from_local_datetime( + &NaiveDate::from_ymd_opt(2015, 2, 18) + .unwrap() + .and_hms_micro_opt(23, 59, 59, 1_234_567) + .unwrap() + ) + .unwrap()) ); - assert_eq!(ymdhms_utc(2015, 2, 18, 23, 16, 9).to_rfc3339(), "2015-02-18T23:16:09+00:00"); - - assert!(DateTime::parse_from_rfc3339("2015-02-18T23:59:60.234567 +05:00").is_err()); - assert!(DateTime::parse_from_rfc3339("2015-02-18T23:059:60.234567+05:00").is_err()); - assert!(DateTime::parse_from_rfc3339("2015-02-18T23:59:60.234567+05:00PST").is_err()); - assert!(DateTime::parse_from_rfc3339("2015-02-18T23:59:60.234567+PST").is_err()); - assert!(DateTime::parse_from_rfc3339("2015-02-18T23:59:60.234567PST").is_err()); - assert!(DateTime::parse_from_rfc3339("2015-02-18T23:59:60.234567+0500").is_err()); - assert!(DateTime::parse_from_rfc3339("2015-02-18T23:59:60.234567+05:00:00").is_err()); - assert!(DateTime::parse_from_rfc3339("2015-02-18T23:59:60.234567:+05:00").is_err()); - assert!(DateTime::parse_from_rfc3339("2015-02-18T23:59:60.234567+05:00 ").is_err()); - assert!(DateTime::parse_from_rfc3339(" 2015-02-18T23:59:60.234567+05:00").is_err()); - assert!(DateTime::parse_from_rfc3339("2015- 02-18T23:59:60.234567+05:00").is_err()); - assert!(DateTime::parse_from_rfc3339("2015-02-18T23:59:60.234567A+05:00").is_err()); } #[test] -#[cfg(any(feature = "alloc", feature = "std"))] fn test_rfc3339_opts() { use crate::SecondsFormat::*; let pst = FixedOffset::east_opt(8 * 60 * 60).unwrap(); @@ -682,7 +455,7 @@ assert_eq!(dt.to_rfc3339_opts(Nanos, false), "2018-01-11T10:05:13.084660000+08:00"); assert_eq!(dt.to_rfc3339_opts(AutoSi, false), "2018-01-11T10:05:13.084660+08:00"); - let ut = dt.naive_utc().and_utc(); + let ut = DateTime::::from_utc(dt.naive_utc(), Utc); assert_eq!(ut.to_rfc3339_opts(Secs, false), "2018-01-11T02:05:13+00:00"); assert_eq!(ut.to_rfc3339_opts(Secs, true), "2018-01-11T02:05:13Z"); assert_eq!(ut.to_rfc3339_opts(Millis, false), "2018-01-11T02:05:13.084+00:00"); @@ -694,7 +467,6 @@ #[test] #[should_panic] -#[cfg(any(feature = "alloc", feature = "std"))] fn test_rfc3339_opts_nonexhaustive() { use crate::SecondsFormat; let dt = Utc.with_ymd_and_hms(1999, 10, 9, 1, 2, 3).unwrap(); @@ -748,17 +520,6 @@ ) .unwrap()) ); - assert_eq!( - "2015-02-18T23:16:9.15Utc".parse::>(), - Ok(Utc - .from_local_datetime( - &NaiveDate::from_ymd_opt(2015, 2, 18) - .unwrap() - .and_hms_milli_opt(23, 16, 9, 150) - .unwrap() - ) - .unwrap()) - ); assert_eq!( "2015-2-18T23:16:9.15Z".parse::>(), @@ -809,296 +570,26 @@ .unwrap()) ); assert!("2015-2-18T23:16:9.15".parse::>().is_err()); - assert!("2015-02-18T23:16:9.15øøø".parse::>().is_err()); // no test for `DateTime`, we cannot verify that much. } #[test] -fn test_parse_datetime_utc() { - // valid cases - let valid = [ - "2001-02-03T04:05:06Z", - "2001-02-03T04:05:06+0000", - "2001-02-03T04:05:06-00:00", - "2001-02-03T04:05:06-01:00", - "2012-12-12 12:12:12Z", - "2012-12-12t12:12:12Z", - "2012-12-12T12:12:12Z", - "2012 -12-12T12:12:12Z", - "2012 -12-12T12:12:12Z", - "2012- 12-12T12:12:12Z", - "2012- 12-12T12:12:12Z", - "2012-12-12T 12:12:12Z", - "2012-12-12T12 :12:12Z", - "2012-12-12T12 :12:12Z", - "2012-12-12T12: 12:12Z", - "2012-12-12T12: 12:12Z", - "2012-12-12T12 : 12:12Z", - "2012-12-12T12:12:12Z ", - " 2012-12-12T12:12:12Z", - "2015-02-18T23:16:09.153Z", - "2015-2-18T23:16:09.153Z", - "+2015-2-18T23:16:09.153Z", - "-77-02-18T23:16:09Z", - "+82701-05-6T15:9:60.898989898989Z", - ]; - for &s in &valid { - eprintln!("test_parse_datetime_utc valid {:?}", s); - let d = match s.parse::>() { - Ok(d) => d, - Err(e) => panic!("parsing `{}` has failed: {}", s, e), - }; - let s_ = format!("{:?}", d); - // `s` and `s_` may differ, but `s.parse()` and `s_.parse()` must be same - let d_ = match s_.parse::>() { - Ok(d) => d, - Err(e) => { - panic!("`{}` is parsed into `{:?}`, but reparsing that has failed: {}", s, d, e) - } - }; - assert!( - d == d_, - "`{}` is parsed into `{:?}`, but reparsed result `{:?}` does not match", - s, - d, - d_ - ); - } - - // some invalid cases - // since `ParseErrorKind` is private, all we can do is to check if there was an error - let invalid = [ - "", // empty - "Z", // missing data - "15Z", // missing data - "15:8:9Z", // missing date - "15-8-9Z", // missing time or date - "Fri, 09 Aug 2013 23:54:35 GMT", // valid datetime, wrong format - "Sat Jun 30 23:59:60 2012", // valid datetime, wrong format - "1441497364.649", // valid datetime, wrong format - "+1441497364.649", // valid datetime, wrong format - "+1441497364", // valid datetime, wrong format - "+1441497364Z", // valid datetime, wrong format - "2014/02/03 04:05:06Z", // valid datetime, wrong format - "2001-02-03T04:05:0600:00", // valid datetime, timezone too close - "2015-15-15T15:15:15Z", // invalid datetime - "2012-12-12T12:12:12x", // invalid timezone - "2012-123-12T12:12:12Z", // invalid month - "2012-12-77T12:12:12Z", // invalid day - "2012-12-12T26:12:12Z", // invalid hour - "2012-12-12T12:61:12Z", // invalid minute - "2012-12-12T12:12:62Z", // invalid second - "2012-12-12 T12:12:12Z", // space after date - "2012-12-12T12:12:12ZZ", // trailing literal 'Z' - "+802701-12-12T12:12:12Z", // invalid year (out of bounds) - "+ 2012-12-12T12:12:12Z", // invalid space before year - " +82701 - 05 - 6 T 15 : 9 : 60.898989898989 Z", // valid datetime, wrong format - ]; - for &s in &invalid { - eprintln!("test_parse_datetime_utc invalid {:?}", s); - assert!(s.parse::>().is_err()); - } -} - -#[test] -fn test_parse_from_str() { - let edt = FixedOffset::east_opt(570 * 60).unwrap(); - let edt0 = FixedOffset::east_opt(0).unwrap(); - let wdt = FixedOffset::west_opt(10 * 3600).unwrap(); +fn test_datetime_parse_from_str() { + let ymdhms = |y, m, d, h, n, s, off| { + FixedOffset::east_opt(off).unwrap().with_ymd_and_hms(y, m, d, h, n, s).unwrap() + }; assert_eq!( DateTime::parse_from_str("2014-5-7T12:34:56+09:30", "%Y-%m-%dT%H:%M:%S%z"), - Ok(ymdhms(&edt, 2014, 5, 7, 12, 34, 56)) + Ok(ymdhms(2014, 5, 7, 12, 34, 56, 570 * 60)) ); // ignore offset assert!(DateTime::parse_from_str("20140507000000", "%Y%m%d%H%M%S").is_err()); // no offset assert!(DateTime::parse_from_str("Fri, 09 Aug 2013 23:54:35 GMT", "%a, %d %b %Y %H:%M:%S GMT") .is_err()); assert_eq!( - DateTime::parse_from_str("0", "%s").unwrap(), - NaiveDateTime::from_timestamp_opt(0, 0).unwrap().and_utc().fixed_offset() + Utc.datetime_from_str("Fri, 09 Aug 2013 23:54:35 GMT", "%a, %d %b %Y %H:%M:%S GMT"), + Ok(Utc.with_ymd_and_hms(2013, 8, 9, 23, 54, 35).unwrap()) ); - - assert_eq!( - "2015-02-18T23:16:9.15Z".parse::>(), - Ok(ymdhms_milli(&edt0, 2015, 2, 18, 23, 16, 9, 150)) - ); - assert_eq!( - "2015-02-18T23:16:9.15Z".parse::>(), - Ok(ymdhms_milli_utc(2015, 2, 18, 23, 16, 9, 150)), - ); - assert_eq!( - "2015-02-18T23:16:9.15 UTC".parse::>(), - Ok(ymdhms_milli_utc(2015, 2, 18, 23, 16, 9, 150)) - ); - assert_eq!( - "2015-02-18T23:16:9.15UTC".parse::>(), - Ok(ymdhms_milli_utc(2015, 2, 18, 23, 16, 9, 150)) - ); - - assert_eq!( - "2015-2-18T23:16:9.15Z".parse::>(), - Ok(ymdhms_milli(&edt0, 2015, 2, 18, 23, 16, 9, 150)) - ); - assert_eq!( - "2015-2-18T13:16:9.15-10:00".parse::>(), - Ok(ymdhms_milli(&wdt, 2015, 2, 18, 13, 16, 9, 150)) - ); - assert!("2015-2-18T23:16:9.15".parse::>().is_err()); - - assert_eq!( - "2015-2-18T23:16:9.15Z".parse::>(), - Ok(ymdhms_milli_utc(2015, 2, 18, 23, 16, 9, 150)) - ); - assert_eq!( - "2015-2-18T13:16:9.15-10:00".parse::>(), - Ok(ymdhms_milli_utc(2015, 2, 18, 23, 16, 9, 150)) - ); - assert!("2015-2-18T23:16:9.15".parse::>().is_err()); - - // no test for `DateTime`, we cannot verify that much. -} - -#[test] -fn test_datetime_parse_from_str() { - let dt = ymdhms(&FixedOffset::east_opt(-9 * 60 * 60).unwrap(), 2013, 8, 9, 23, 54, 35); - let parse = DateTime::parse_from_str; - - // timezone variations - - // - // %Z - // - // wrong timezone format - assert!(parse("Aug 09 2013 23:54:35 -0900", "%b %d %Y %H:%M:%S %Z").is_err()); - // bad timezone data? - assert!(parse("Aug 09 2013 23:54:35 PST", "%b %d %Y %H:%M:%S %Z").is_err()); - // bad timezone data - assert!(parse("Aug 09 2013 23:54:35 XXXXX", "%b %d %Y %H:%M:%S %Z").is_err()); - - // - // %z - // - assert_eq!(parse("Aug 09 2013 23:54:35 -0900", "%b %d %Y %H:%M:%S %z"), Ok(dt)); - assert_eq!(parse("Aug 09 2013 23:54:35 -09 00", "%b %d %Y %H:%M:%S %z"), Ok(dt)); - assert_eq!(parse("Aug 09 2013 23:54:35 -09:00", "%b %d %Y %H:%M:%S %z"), Ok(dt)); - assert_eq!(parse("Aug 09 2013 23:54:35 -09 : 00", "%b %d %Y %H:%M:%S %z"), Ok(dt)); - assert_eq!(parse("Aug 09 2013 23:54:35 --0900", "%b %d %Y %H:%M:%S -%z"), Ok(dt)); - assert_eq!(parse("Aug 09 2013 23:54:35 +-0900", "%b %d %Y %H:%M:%S +%z"), Ok(dt)); - assert_eq!(parse("Aug 09 2013 23:54:35 -09:00 ", "%b %d %Y %H:%M:%S %z "), Ok(dt)); - // trailing newline after timezone - assert!(parse("Aug 09 2013 23:54:35 -09:00\n", "%b %d %Y %H:%M:%S %z").is_err()); - assert_eq!(parse("Aug 09 2013 23:54:35 -09:00\n", "%b %d %Y %H:%M:%S %z "), Ok(dt)); - // trailing colon - assert!(parse("Aug 09 2013 23:54:35 -09:00:", "%b %d %Y %H:%M:%S %z").is_err()); - // trailing colon with space - assert!(parse("Aug 09 2013 23:54:35 -09:00: ", "%b %d %Y %H:%M:%S %z ").is_err()); - // trailing colon, mismatch space - assert!(parse("Aug 09 2013 23:54:35 -09:00:", "%b %d %Y %H:%M:%S %z ").is_err()); - // wrong timezone data - assert!(parse("Aug 09 2013 23:54:35 -09", "%b %d %Y %H:%M:%S %z").is_err()); - assert_eq!(parse("Aug 09 2013 23:54:35 -09::00", "%b %d %Y %H:%M:%S %z"), Ok(dt)); - assert_eq!(parse("Aug 09 2013 23:54:35 -0900::", "%b %d %Y %H:%M:%S %z::"), Ok(dt)); - assert_eq!(parse("Aug 09 2013 23:54:35 -09:00:00", "%b %d %Y %H:%M:%S %z:00"), Ok(dt)); - assert_eq!(parse("Aug 09 2013 23:54:35 -09:00:00 ", "%b %d %Y %H:%M:%S %z:00 "), Ok(dt)); - - // - // %:z - // - assert_eq!(parse("Aug 09 2013 23:54:35 -09:00", "%b %d %Y %H:%M:%S %:z"), Ok(dt)); - assert_eq!(parse("Aug 09 2013 23:54:35 -0900", "%b %d %Y %H:%M:%S %:z"), Ok(dt)); - assert_eq!(parse("Aug 09 2013 23:54:35 -09 00", "%b %d %Y %H:%M:%S %:z"), Ok(dt)); - assert_eq!(parse("Aug 09 2013 23:54:35 -09 : 00", "%b %d %Y %H:%M:%S %:z"), Ok(dt)); - assert_eq!(parse("Aug 09 2013 23:54:35 -09 : 00:", "%b %d %Y %H:%M:%S %:z:"), Ok(dt)); - // wrong timezone data - assert!(parse("Aug 09 2013 23:54:35 -09", "%b %d %Y %H:%M:%S %:z").is_err()); - assert_eq!(parse("Aug 09 2013 23:54:35 -09::00", "%b %d %Y %H:%M:%S %:z"), Ok(dt)); - // timezone data hs too many colons - assert!(parse("Aug 09 2013 23:54:35 -09:00:", "%b %d %Y %H:%M:%S %:z").is_err()); - // timezone data hs too many colons - assert!(parse("Aug 09 2013 23:54:35 -09:00::", "%b %d %Y %H:%M:%S %:z").is_err()); - assert_eq!(parse("Aug 09 2013 23:54:35 -09:00::", "%b %d %Y %H:%M:%S %:z::"), Ok(dt)); - - // - // %::z - // - assert_eq!(parse("Aug 09 2013 23:54:35 -0900", "%b %d %Y %H:%M:%S %::z"), Ok(dt)); - assert_eq!(parse("Aug 09 2013 23:54:35 -09:00", "%b %d %Y %H:%M:%S %::z"), Ok(dt)); - assert_eq!(parse("Aug 09 2013 23:54:35 -09 : 00", "%b %d %Y %H:%M:%S %::z"), Ok(dt)); - // mismatching colon expectations - assert!(parse("Aug 09 2013 23:54:35 -09:00:00", "%b %d %Y %H:%M:%S %::z").is_err()); - assert_eq!(parse("Aug 09 2013 23:54:35 -09::00", "%b %d %Y %H:%M:%S %::z"), Ok(dt)); - assert_eq!(parse("Aug 09 2013 23:54:35 -09::00", "%b %d %Y %H:%M:%S %:z"), Ok(dt)); - // wrong timezone data - assert!(parse("Aug 09 2013 23:54:35 -09", "%b %d %Y %H:%M:%S %::z").is_err()); - assert_eq!(parse("Aug 09 2013 23:54:35 -09001234", "%b %d %Y %H:%M:%S %::z1234"), Ok(dt)); - assert_eq!(parse("Aug 09 2013 23:54:35 -09:001234", "%b %d %Y %H:%M:%S %::z1234"), Ok(dt)); - assert_eq!(parse("Aug 09 2013 23:54:35 -0900 ", "%b %d %Y %H:%M:%S %::z "), Ok(dt)); - assert_eq!(parse("Aug 09 2013 23:54:35 -0900\t\n", "%b %d %Y %H:%M:%S %::z\t\n"), Ok(dt)); - assert_eq!(parse("Aug 09 2013 23:54:35 -0900:", "%b %d %Y %H:%M:%S %::z:"), Ok(dt)); - assert_eq!(parse("Aug 09 2013 23:54:35 :-0900:0", "%b %d %Y %H:%M:%S :%::z:0"), Ok(dt)); - // mismatching colons and spaces - assert!(parse("Aug 09 2013 23:54:35 :-0900: ", "%b %d %Y %H:%M:%S :%::z::").is_err()); - // mismatching colons expectations - assert!(parse("Aug 09 2013 23:54:35 -09:00:00", "%b %d %Y %H:%M:%S %::z").is_err()); - assert_eq!(parse("Aug 09 2013 -0900: 23:54:35", "%b %d %Y %::z: %H:%M:%S"), Ok(dt)); - assert_eq!(parse("Aug 09 2013 :-0900:0 23:54:35", "%b %d %Y :%::z:0 %H:%M:%S"), Ok(dt)); - // mismatching colons expectations mid-string - assert!(parse("Aug 09 2013 :-0900: 23:54:35", "%b %d %Y :%::z %H:%M:%S").is_err()); - // mismatching colons expectations, before end - assert!(parse("Aug 09 2013 23:54:35 -09:00:00 ", "%b %d %Y %H:%M:%S %::z ").is_err()); - - // - // %:::z - // - assert_eq!(parse("Aug 09 2013 23:54:35 -09:00", "%b %d %Y %H:%M:%S %:::z"), Ok(dt)); - assert_eq!(parse("Aug 09 2013 23:54:35 -0900", "%b %d %Y %H:%M:%S %:::z"), Ok(dt)); - assert_eq!(parse("Aug 09 2013 23:54:35 -0900 ", "%b %d %Y %H:%M:%S %:::z "), Ok(dt)); - // wrong timezone data - assert!(parse("Aug 09 2013 23:54:35 -09", "%b %d %Y %H:%M:%S %:::z").is_err()); - - // - // %::::z - // - // too many colons - assert!(parse("Aug 09 2013 23:54:35 -0900", "%b %d %Y %H:%M:%S %::::z").is_err()); - // too many colons - assert!(parse("Aug 09 2013 23:54:35 -09:00", "%b %d %Y %H:%M:%S %::::z").is_err()); - // too many colons - assert!(parse("Aug 09 2013 23:54:35 -09:00:", "%b %d %Y %H:%M:%S %::::z").is_err()); - // too many colons - assert!(parse("Aug 09 2013 23:54:35 -09:00:00", "%b %d %Y %H:%M:%S %::::z").is_err()); - - // - // %#z - // - assert_eq!(parse("Aug 09 2013 23:54:35 -09:00", "%b %d %Y %H:%M:%S %#z"), Ok(dt)); - assert_eq!(parse("Aug 09 2013 23:54:35 -0900", "%b %d %Y %H:%M:%S %#z"), Ok(dt)); - assert_eq!(parse("Aug 09 2013 23:54:35 -09:00 ", "%b %d %Y %H:%M:%S %#z "), Ok(dt)); - assert_eq!(parse("Aug 09 2013 23:54:35 -0900 ", "%b %d %Y %H:%M:%S %#z "), Ok(dt)); - assert_eq!(parse("Aug 09 2013 23:54:35 -09", "%b %d %Y %H:%M:%S %#z"), Ok(dt)); - assert_eq!(parse("Aug 09 2013 23:54:35 -0900", "%b %d %Y %H:%M:%S %#z"), Ok(dt)); - assert_eq!(parse("Aug 09 2013 23:54:35 -09:", "%b %d %Y %H:%M:%S %#z"), Ok(dt)); - assert_eq!(parse("Aug 09 2013 23:54:35 -09: ", "%b %d %Y %H:%M:%S %#z "), Ok(dt)); - assert_eq!(parse("Aug 09 2013 23:54:35+-09", "%b %d %Y %H:%M:%S+%#z"), Ok(dt)); - assert_eq!(parse("Aug 09 2013 23:54:35--09", "%b %d %Y %H:%M:%S-%#z"), Ok(dt)); - assert_eq!(parse("Aug 09 2013 -09:00 23:54:35", "%b %d %Y %#z%H:%M:%S"), Ok(dt)); - assert_eq!(parse("Aug 09 2013 -0900 23:54:35", "%b %d %Y %#z%H:%M:%S"), Ok(dt)); - assert_eq!(parse("Aug 09 2013 -090023:54:35", "%b %d %Y %#z%H:%M:%S"), Ok(dt)); - assert_eq!(parse("Aug 09 2013 -09:0023:54:35", "%b %d %Y %#z%H:%M:%S"), Ok(dt)); - // timezone with partial minutes adjacent hours - assert_ne!(parse("Aug 09 2013 -09023:54:35", "%b %d %Y %#z%H:%M:%S"), Ok(dt)); - // bad timezone data - assert!(parse("Aug 09 2013 23:54:35 -09:00:00", "%b %d %Y %H:%M:%S %#z").is_err()); - // bad timezone data (partial minutes) - assert!(parse("Aug 09 2013 23:54:35 -090", "%b %d %Y %H:%M:%S %#z").is_err()); - // bad timezone data (partial minutes) with trailing space - assert!(parse("Aug 09 2013 23:54:35 -090 ", "%b %d %Y %H:%M:%S %#z ").is_err()); - // bad timezone data (partial minutes) mid-string - assert!(parse("Aug 09 2013 -090 23:54:35", "%b %d %Y %#z %H:%M:%S").is_err()); - // bad timezone data - assert!(parse("Aug 09 2013 -09:00:00 23:54:35", "%b %d %Y %#z %H:%M:%S").is_err()); - // timezone data ambiguous with hours - assert!(parse("Aug 09 2013 -09:00:23:54:35", "%b %d %Y %#z%H:%M:%S").is_err()); } #[test] @@ -1129,10 +620,26 @@ } #[test] -fn test_datetime_is_send_and_copy() { - fn _assert_send_copy() {} - // UTC is known to be `Send + Copy`. - _assert_send_copy::>(); +#[cfg(feature = "clock")] +fn test_datetime_is_copy() { + // UTC is known to be `Copy`. + let a = Utc::now(); + let b = a; + assert_eq!(a, b); +} + +#[test] +#[cfg(feature = "clock")] +fn test_datetime_is_send() { + use std::thread; + + // UTC is known to be `Send`. + let a = Utc::now(); + thread::spawn(move || { + let _ = a; + }) + .join() + .unwrap(); } #[test] @@ -1151,13 +658,80 @@ assert_eq!(1234567, datetime.timestamp_subsec_nanos()); } -// Some targets, such as `wasm32-wasi`, have a problematic definition of `SystemTime`, such as an -// `i32` (year 2035 problem), or an `u64` (no values before `UNIX-EPOCH`). -// See https://github.com/rust-lang/rust/issues/44394. #[test] -#[cfg(all(feature = "std", not(all(target_arch = "wasm32", target_os = "wasi"))))] +#[cfg(not(target_os = "windows"))] +fn test_from_system_time() { + use std::time::Duration; + + let epoch = Utc.with_ymd_and_hms(1970, 1, 1, 0, 0, 0).unwrap(); + let nanos = 999_999_999; + + // SystemTime -> DateTime + assert_eq!(DateTime::::from(UNIX_EPOCH), epoch); + assert_eq!( + DateTime::::from(UNIX_EPOCH + Duration::new(999_999_999, nanos)), + Utc.from_local_datetime( + &NaiveDate::from_ymd_opt(2001, 9, 9) + .unwrap() + .and_hms_nano_opt(1, 46, 39, nanos) + .unwrap() + ) + .unwrap() + ); + assert_eq!( + DateTime::::from(UNIX_EPOCH - Duration::new(999_999_999, nanos)), + Utc.from_local_datetime( + &NaiveDate::from_ymd_opt(1938, 4, 24).unwrap().and_hms_nano_opt(22, 13, 20, 1).unwrap() + ) + .unwrap() + ); + + // DateTime -> SystemTime + assert_eq!(SystemTime::from(epoch), UNIX_EPOCH); + assert_eq!( + SystemTime::from( + Utc.from_local_datetime( + &NaiveDate::from_ymd_opt(2001, 9, 9) + .unwrap() + .and_hms_nano_opt(1, 46, 39, nanos) + .unwrap() + ) + .unwrap() + ), + UNIX_EPOCH + Duration::new(999_999_999, nanos) + ); + assert_eq!( + SystemTime::from( + Utc.from_local_datetime( + &NaiveDate::from_ymd_opt(1938, 4, 24) + .unwrap() + .and_hms_nano_opt(22, 13, 20, 1) + .unwrap() + ) + .unwrap() + ), + UNIX_EPOCH - Duration::new(999_999_999, 999_999_999) + ); + + // DateTime -> SystemTime (via `with_timezone`) + #[cfg(feature = "clock")] + { + assert_eq!(SystemTime::from(epoch.with_timezone(&Local)), UNIX_EPOCH); + } + assert_eq!( + SystemTime::from(epoch.with_timezone(&FixedOffset::east_opt(32400).unwrap())), + UNIX_EPOCH + ); + assert_eq!( + SystemTime::from(epoch.with_timezone(&FixedOffset::west_opt(28800).unwrap())), + UNIX_EPOCH + ); +} + +#[test] +#[cfg(target_os = "windows")] fn test_from_system_time() { - use std::time::{Duration, SystemTime, UNIX_EPOCH}; + use std::time::Duration; let nanos = 999_999_000; @@ -1229,7 +803,36 @@ } #[test] -#[allow(deprecated)] +fn test_datetime_format_alignment() { + let datetime = Utc.with_ymd_and_hms(2007, 1, 2, 0, 0, 0).unwrap(); + + // Item::Literal + let percent = datetime.format("%%"); + assert_eq!(" %", format!("{:>3}", percent)); + assert_eq!("% ", format!("{:<3}", percent)); + assert_eq!(" % ", format!("{:^3}", percent)); + + // Item::Numeric + let year = datetime.format("%Y"); + assert_eq!(" 2007", format!("{:>6}", year)); + assert_eq!("2007 ", format!("{:<6}", year)); + assert_eq!(" 2007 ", format!("{:^6}", year)); + + // Item::Fixed + let tz = datetime.format("%Z"); + assert_eq!(" UTC", format!("{:>5}", tz)); + assert_eq!("UTC ", format!("{:<5}", tz)); + assert_eq!(" UTC ", format!("{:^5}", tz)); + + // [Item::Numeric, Item::Space, Item::Literal, Item::Space, Item::Numeric] + let ymd = datetime.format("%Y %B %d"); + let ymd_formatted = "2007 January 02"; + assert_eq!(format!(" {}", ymd_formatted), format!("{:>17}", ymd)); + assert_eq!(format!("{} ", ymd_formatted), format!("{:<17}", ymd)); + assert_eq!(format!(" {} ", ymd_formatted), format!("{:^17}", ymd)); +} + +#[test] fn test_datetime_from_local() { // 2000-01-12T02:00:00Z let naivedatetime_utc = @@ -1259,39 +862,39 @@ // This is always at least one year because 1 year = 52.1775 weeks. let one_year_ago = - Utc::now().date_naive() - OldDuration::weeks((WEEKS_PER_YEAR * 1.5).ceil() as i64); + Utc::now().date_naive() - Duration::weeks((WEEKS_PER_YEAR * 1.5).ceil() as i64); // A bit more than 2 years. let two_year_ago = - Utc::now().date_naive() - OldDuration::weeks((WEEKS_PER_YEAR * 2.5).ceil() as i64); + Utc::now().date_naive() - Duration::weeks((WEEKS_PER_YEAR * 2.5).ceil() as i64); assert_eq!(Utc::now().date_naive().years_since(one_year_ago), Some(1)); assert_eq!(Utc::now().date_naive().years_since(two_year_ago), Some(2)); // If the given DateTime is later than now, the function will always return 0. - let future = Utc::now().date_naive() + OldDuration::weeks(12); + let future = Utc::now().date_naive() + Duration::weeks(12); assert_eq!(Utc::now().date_naive().years_since(future), None); } #[test] fn test_datetime_add_assign() { let naivedatetime = NaiveDate::from_ymd_opt(2000, 1, 1).unwrap().and_hms_opt(0, 0, 0).unwrap(); - let datetime = naivedatetime.and_utc(); + let datetime = DateTime::::from_utc(naivedatetime, Utc); let mut datetime_add = datetime; - datetime_add += OldDuration::seconds(60); - assert_eq!(datetime_add, datetime + OldDuration::seconds(60)); + datetime_add += Duration::seconds(60); + assert_eq!(datetime_add, datetime + Duration::seconds(60)); let timezone = FixedOffset::east_opt(60 * 60).unwrap(); let datetime = datetime.with_timezone(&timezone); let datetime_add = datetime_add.with_timezone(&timezone); - assert_eq!(datetime_add, datetime + OldDuration::seconds(60)); + assert_eq!(datetime_add, datetime + Duration::seconds(60)); let timezone = FixedOffset::west_opt(2 * 60 * 60).unwrap(); let datetime = datetime.with_timezone(&timezone); let datetime_add = datetime_add.with_timezone(&timezone); - assert_eq!(datetime_add, datetime + OldDuration::seconds(60)); + assert_eq!(datetime_add, datetime + Duration::seconds(60)); } #[test] @@ -1304,31 +907,31 @@ // ensure we cross a DST transition for i in 1..=365 { - datetime_add += OldDuration::days(1); - assert_eq!(datetime_add, datetime + OldDuration::days(i)) + datetime_add += Duration::days(1); + assert_eq!(datetime_add, datetime + Duration::days(i)) } } #[test] fn test_datetime_sub_assign() { let naivedatetime = NaiveDate::from_ymd_opt(2000, 1, 1).unwrap().and_hms_opt(12, 0, 0).unwrap(); - let datetime = naivedatetime.and_utc(); + let datetime = DateTime::::from_utc(naivedatetime, Utc); let mut datetime_sub = datetime; - datetime_sub -= OldDuration::minutes(90); - assert_eq!(datetime_sub, datetime - OldDuration::minutes(90)); + datetime_sub -= Duration::minutes(90); + assert_eq!(datetime_sub, datetime - Duration::minutes(90)); let timezone = FixedOffset::east_opt(60 * 60).unwrap(); let datetime = datetime.with_timezone(&timezone); let datetime_sub = datetime_sub.with_timezone(&timezone); - assert_eq!(datetime_sub, datetime - OldDuration::minutes(90)); + assert_eq!(datetime_sub, datetime - Duration::minutes(90)); let timezone = FixedOffset::west_opt(2 * 60 * 60).unwrap(); let datetime = datetime.with_timezone(&timezone); let datetime_sub = datetime_sub.with_timezone(&timezone); - assert_eq!(datetime_sub, datetime - OldDuration::minutes(90)); + assert_eq!(datetime_sub, datetime - Duration::minutes(90)); } #[test] @@ -1341,33 +944,12 @@ // ensure we cross a DST transition for i in 1..=365 { - datetime_sub -= OldDuration::days(1); - assert_eq!(datetime_sub, datetime - OldDuration::days(i)) + datetime_sub -= Duration::days(1); + assert_eq!(datetime_sub, datetime - Duration::days(i)) } } #[test] -fn test_core_duration_ops() { - use core::time::Duration; - - let mut utc_dt = Utc.with_ymd_and_hms(2023, 8, 29, 11, 34, 12).unwrap(); - let same = utc_dt + Duration::ZERO; - assert_eq!(utc_dt, same); - - utc_dt += Duration::new(3600, 0); - assert_eq!(utc_dt, Utc.with_ymd_and_hms(2023, 8, 29, 12, 34, 12).unwrap()); -} - -#[test] -#[should_panic] -fn test_core_duration_max() { - use core::time::Duration; - - let mut utc_dt = Utc.with_ymd_and_hms(2023, 8, 29, 11, 34, 12).unwrap(); - utc_dt += Duration::MAX; -} - -#[test] #[cfg(all(target_os = "windows", feature = "clock"))] fn test_from_naive_date_time_windows() { let min_year = NaiveDate::from_ymd_opt(1601, 1, 3).unwrap().and_hms_opt(0, 0, 0).unwrap(); @@ -1427,95 +1009,3 @@ let datetime_fixed = fixed_offset.from_local_datetime(&naivedatetime).unwrap(); assert_eq!(datetime_fixed.fixed_offset(), datetime_fixed); } - -#[test] -fn test_add_sub_months() { - let utc_dt = Utc.with_ymd_and_hms(2018, 9, 5, 23, 58, 0).unwrap(); - assert_eq!(utc_dt + Months::new(15), Utc.with_ymd_and_hms(2019, 12, 5, 23, 58, 0).unwrap()); - - let utc_dt = Utc.with_ymd_and_hms(2020, 1, 31, 23, 58, 0).unwrap(); - assert_eq!(utc_dt + Months::new(1), Utc.with_ymd_and_hms(2020, 2, 29, 23, 58, 0).unwrap()); - assert_eq!(utc_dt + Months::new(2), Utc.with_ymd_and_hms(2020, 3, 31, 23, 58, 0).unwrap()); - - let utc_dt = Utc.with_ymd_and_hms(2018, 9, 5, 23, 58, 0).unwrap(); - assert_eq!(utc_dt - Months::new(15), Utc.with_ymd_and_hms(2017, 6, 5, 23, 58, 0).unwrap()); - - let utc_dt = Utc.with_ymd_and_hms(2020, 3, 31, 23, 58, 0).unwrap(); - assert_eq!(utc_dt - Months::new(1), Utc.with_ymd_and_hms(2020, 2, 29, 23, 58, 0).unwrap()); - assert_eq!(utc_dt - Months::new(2), Utc.with_ymd_and_hms(2020, 1, 31, 23, 58, 0).unwrap()); -} - -#[test] -fn test_auto_conversion() { - let utc_dt = Utc.with_ymd_and_hms(2018, 9, 5, 23, 58, 0).unwrap(); - let cdt_dt = FixedOffset::west_opt(5 * 60 * 60) - .unwrap() - .with_ymd_and_hms(2018, 9, 5, 18, 58, 0) - .unwrap(); - let utc_dt2: DateTime = cdt_dt.into(); - assert_eq!(utc_dt, utc_dt2); -} - -#[test] -#[cfg(feature = "clock")] -#[allow(deprecated)] -fn test_test_deprecated_from_offset() { - let now = Local::now(); - let naive = now.naive_local(); - let utc = now.naive_utc(); - let offset: FixedOffset = *now.offset(); - - assert_eq!(DateTime::::from_local(naive, offset), now); - assert_eq!(DateTime::::from_utc(utc, offset), now); -} - -#[test] -#[cfg(all(feature = "unstable-locales", any(feature = "alloc", feature = "std")))] -fn locale_decimal_point() { - use crate::Locale::{ar_SY, nl_NL}; - let dt = - Utc.with_ymd_and_hms(2018, 9, 5, 18, 58, 0).unwrap().with_nanosecond(123456780).unwrap(); - - assert_eq!(dt.format_localized("%T%.f", nl_NL).to_string(), "18:58:00,123456780"); - assert_eq!(dt.format_localized("%T%.3f", nl_NL).to_string(), "18:58:00,123"); - assert_eq!(dt.format_localized("%T%.6f", nl_NL).to_string(), "18:58:00,123456"); - assert_eq!(dt.format_localized("%T%.9f", nl_NL).to_string(), "18:58:00,123456780"); - - assert_eq!(dt.format_localized("%T%.f", ar_SY).to_string(), "18:58:00.123456780"); - assert_eq!(dt.format_localized("%T%.3f", ar_SY).to_string(), "18:58:00.123"); - assert_eq!(dt.format_localized("%T%.6f", ar_SY).to_string(), "18:58:00.123456"); - assert_eq!(dt.format_localized("%T%.9f", ar_SY).to_string(), "18:58:00.123456780"); -} - -/// This is an extended test for . -#[test] -fn nano_roundrip() { - const BILLION: i64 = 1_000_000_000; - - for nanos in [ - i64::MIN, - i64::MIN + 1, - i64::MIN + 2, - i64::MIN + BILLION - 1, - i64::MIN + BILLION, - i64::MIN + BILLION + 1, - -BILLION - 1, - -BILLION, - -BILLION + 1, - 0, - BILLION - 1, - BILLION, - BILLION + 1, - i64::MAX - BILLION - 1, - i64::MAX - BILLION, - i64::MAX - BILLION + 1, - i64::MAX - 2, - i64::MAX - 1, - i64::MAX, - ] { - println!("nanos: {}", nanos); - let dt = Utc.timestamp_nanos(nanos); - let nanos2 = dt.timestamp_nanos_opt().expect("value roundtrips"); - assert_eq!(nanos, nanos2); - } -} diff -Nru temporalio-1.3.0/vendor/chrono/src/duration.rs temporalio-1.3.0/vendor/chrono/src/duration.rs --- temporalio-1.3.0/vendor/chrono/src/duration.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/chrono/src/duration.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,748 +0,0 @@ -// Copyright 2012-2014 The Rust Project Developers. See the COPYRIGHT -// file at the top-level directory of this distribution and at -// http://rust-lang.org/COPYRIGHT. -// -// Licensed under the Apache License, Version 2.0 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -//! Temporal quantification - -use core::ops::{Add, Div, Mul, Neg, Sub}; -use core::time::Duration as StdDuration; -use core::{fmt, i64}; -#[cfg(feature = "std")] -use std::error::Error; - -#[cfg(feature = "rkyv")] -use rkyv::{Archive, Deserialize, Serialize}; - -/// The number of nanoseconds in a microsecond. -const NANOS_PER_MICRO: i32 = 1000; -/// The number of nanoseconds in a millisecond. -const NANOS_PER_MILLI: i32 = 1_000_000; -/// The number of nanoseconds in seconds. -const NANOS_PER_SEC: i32 = 1_000_000_000; -/// The number of microseconds per second. -const MICROS_PER_SEC: i64 = 1_000_000; -/// The number of milliseconds per second. -const MILLIS_PER_SEC: i64 = 1000; -/// The number of seconds in a minute. -const SECS_PER_MINUTE: i64 = 60; -/// The number of seconds in an hour. -const SECS_PER_HOUR: i64 = 3600; -/// The number of (non-leap) seconds in days. -const SECS_PER_DAY: i64 = 86_400; -/// The number of (non-leap) seconds in a week. -const SECS_PER_WEEK: i64 = 604_800; - -macro_rules! try_opt { - ($e:expr) => { - match $e { - Some(v) => v, - None => return None, - } - }; -} - -/// ISO 8601 time duration with nanosecond precision. -/// -/// This also allows for the negative duration; see individual methods for details. -#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Debug, Hash)] -#[cfg_attr(feature = "rkyv", derive(Archive, Deserialize, Serialize))] -pub struct Duration { - secs: i64, - nanos: i32, // Always 0 <= nanos < NANOS_PER_SEC -} - -/// The minimum possible `Duration`: `i64::MIN` milliseconds. -pub(crate) const MIN: Duration = Duration { - secs: i64::MIN / MILLIS_PER_SEC - 1, - nanos: NANOS_PER_SEC + (i64::MIN % MILLIS_PER_SEC) as i32 * NANOS_PER_MILLI, -}; - -/// The maximum possible `Duration`: `i64::MAX` milliseconds. -pub(crate) const MAX: Duration = Duration { - secs: i64::MAX / MILLIS_PER_SEC, - nanos: (i64::MAX % MILLIS_PER_SEC) as i32 * NANOS_PER_MILLI, -}; - -impl Duration { - /// Makes a new `Duration` with given number of weeks. - /// Equivalent to `Duration::seconds(weeks * 7 * 24 * 60 * 60)` with overflow checks. - /// Panics when the duration is out of bounds. - #[inline] - #[must_use] - pub fn weeks(weeks: i64) -> Duration { - let secs = weeks.checked_mul(SECS_PER_WEEK).expect("Duration::weeks out of bounds"); - Duration::seconds(secs) - } - - /// Makes a new `Duration` with given number of days. - /// Equivalent to `Duration::seconds(days * 24 * 60 * 60)` with overflow checks. - /// Panics when the duration is out of bounds. - #[inline] - #[must_use] - pub fn days(days: i64) -> Duration { - let secs = days.checked_mul(SECS_PER_DAY).expect("Duration::days out of bounds"); - Duration::seconds(secs) - } - - /// Makes a new `Duration` with given number of hours. - /// Equivalent to `Duration::seconds(hours * 60 * 60)` with overflow checks. - /// Panics when the duration is out of bounds. - #[inline] - #[must_use] - pub fn hours(hours: i64) -> Duration { - let secs = hours.checked_mul(SECS_PER_HOUR).expect("Duration::hours ouf of bounds"); - Duration::seconds(secs) - } - - /// Makes a new `Duration` with given number of minutes. - /// Equivalent to `Duration::seconds(minutes * 60)` with overflow checks. - /// Panics when the duration is out of bounds. - #[inline] - #[must_use] - pub fn minutes(minutes: i64) -> Duration { - let secs = minutes.checked_mul(SECS_PER_MINUTE).expect("Duration::minutes out of bounds"); - Duration::seconds(secs) - } - - /// Makes a new `Duration` with given number of seconds. - /// Panics when the duration is more than `i64::MAX` milliseconds - /// or less than `i64::MIN` milliseconds. - #[inline] - #[must_use] - pub fn seconds(seconds: i64) -> Duration { - let d = Duration { secs: seconds, nanos: 0 }; - if d < MIN || d > MAX { - panic!("Duration::seconds out of bounds"); - } - d - } - - /// Makes a new `Duration` with given number of milliseconds. - #[inline] - pub const fn milliseconds(milliseconds: i64) -> Duration { - let (secs, millis) = div_mod_floor_64(milliseconds, MILLIS_PER_SEC); - let nanos = millis as i32 * NANOS_PER_MILLI; - Duration { secs, nanos } - } - - /// Makes a new `Duration` with given number of microseconds. - #[inline] - pub const fn microseconds(microseconds: i64) -> Duration { - let (secs, micros) = div_mod_floor_64(microseconds, MICROS_PER_SEC); - let nanos = micros as i32 * NANOS_PER_MICRO; - Duration { secs, nanos } - } - - /// Makes a new `Duration` with given number of nanoseconds. - #[inline] - pub const fn nanoseconds(nanos: i64) -> Duration { - let (secs, nanos) = div_mod_floor_64(nanos, NANOS_PER_SEC as i64); - Duration { secs, nanos: nanos as i32 } - } - - /// Returns the total number of whole weeks in the duration. - #[inline] - pub const fn num_weeks(&self) -> i64 { - self.num_days() / 7 - } - - /// Returns the total number of whole days in the duration. - pub const fn num_days(&self) -> i64 { - self.num_seconds() / SECS_PER_DAY - } - - /// Returns the total number of whole hours in the duration. - #[inline] - pub const fn num_hours(&self) -> i64 { - self.num_seconds() / SECS_PER_HOUR - } - - /// Returns the total number of whole minutes in the duration. - #[inline] - pub const fn num_minutes(&self) -> i64 { - self.num_seconds() / SECS_PER_MINUTE - } - - /// Returns the total number of whole seconds in the duration. - pub const fn num_seconds(&self) -> i64 { - // If secs is negative, nanos should be subtracted from the duration. - if self.secs < 0 && self.nanos > 0 { - self.secs + 1 - } else { - self.secs - } - } - - /// Returns the number of nanoseconds such that - /// `nanos_mod_sec() + num_seconds() * NANOS_PER_SEC` is the total number of - /// nanoseconds in the duration. - const fn nanos_mod_sec(&self) -> i32 { - if self.secs < 0 && self.nanos > 0 { - self.nanos - NANOS_PER_SEC - } else { - self.nanos - } - } - - /// Returns the total number of whole milliseconds in the duration, - pub const fn num_milliseconds(&self) -> i64 { - // A proper Duration will not overflow, because MIN and MAX are defined - // such that the range is exactly i64 milliseconds. - let secs_part = self.num_seconds() * MILLIS_PER_SEC; - let nanos_part = self.nanos_mod_sec() / NANOS_PER_MILLI; - secs_part + nanos_part as i64 - } - - /// Returns the total number of whole microseconds in the duration, - /// or `None` on overflow (exceeding 2^63 microseconds in either direction). - pub const fn num_microseconds(&self) -> Option { - let secs_part = try_opt!(self.num_seconds().checked_mul(MICROS_PER_SEC)); - let nanos_part = self.nanos_mod_sec() / NANOS_PER_MICRO; - secs_part.checked_add(nanos_part as i64) - } - - /// Returns the total number of whole nanoseconds in the duration, - /// or `None` on overflow (exceeding 2^63 nanoseconds in either direction). - pub const fn num_nanoseconds(&self) -> Option { - let secs_part = try_opt!(self.num_seconds().checked_mul(NANOS_PER_SEC as i64)); - let nanos_part = self.nanos_mod_sec(); - secs_part.checked_add(nanos_part as i64) - } - - /// Add two durations, returning `None` if overflow occurred. - #[must_use] - pub fn checked_add(&self, rhs: &Duration) -> Option { - let mut secs = try_opt!(self.secs.checked_add(rhs.secs)); - let mut nanos = self.nanos + rhs.nanos; - if nanos >= NANOS_PER_SEC { - nanos -= NANOS_PER_SEC; - secs = try_opt!(secs.checked_add(1)); - } - let d = Duration { secs, nanos }; - // Even if d is within the bounds of i64 seconds, - // it might still overflow i64 milliseconds. - if d < MIN || d > MAX { - None - } else { - Some(d) - } - } - - /// Subtract two durations, returning `None` if overflow occurred. - #[must_use] - pub fn checked_sub(&self, rhs: &Duration) -> Option { - let mut secs = try_opt!(self.secs.checked_sub(rhs.secs)); - let mut nanos = self.nanos - rhs.nanos; - if nanos < 0 { - nanos += NANOS_PER_SEC; - secs = try_opt!(secs.checked_sub(1)); - } - let d = Duration { secs, nanos }; - // Even if d is within the bounds of i64 seconds, - // it might still overflow i64 milliseconds. - if d < MIN || d > MAX { - None - } else { - Some(d) - } - } - - /// Returns the duration as an absolute (non-negative) value. - #[inline] - pub const fn abs(&self) -> Duration { - if self.secs < 0 && self.nanos != 0 { - Duration { secs: (self.secs + 1).abs(), nanos: NANOS_PER_SEC - self.nanos } - } else { - Duration { secs: self.secs.abs(), nanos: self.nanos } - } - } - - /// The minimum possible `Duration`: `i64::MIN` milliseconds. - #[inline] - pub const fn min_value() -> Duration { - MIN - } - - /// The maximum possible `Duration`: `i64::MAX` milliseconds. - #[inline] - pub const fn max_value() -> Duration { - MAX - } - - /// A duration where the stored seconds and nanoseconds are equal to zero. - #[inline] - pub const fn zero() -> Duration { - Duration { secs: 0, nanos: 0 } - } - - /// Returns `true` if the duration equals `Duration::zero()`. - #[inline] - pub const fn is_zero(&self) -> bool { - self.secs == 0 && self.nanos == 0 - } - - /// Creates a `time::Duration` object from `std::time::Duration` - /// - /// This function errors when original duration is larger than the maximum - /// value supported for this type. - pub fn from_std(duration: StdDuration) -> Result { - // We need to check secs as u64 before coercing to i64 - if duration.as_secs() > MAX.secs as u64 { - return Err(OutOfRangeError(())); - } - let d = Duration { secs: duration.as_secs() as i64, nanos: duration.subsec_nanos() as i32 }; - if d > MAX { - return Err(OutOfRangeError(())); - } - Ok(d) - } - - /// Creates a `std::time::Duration` object from `time::Duration` - /// - /// This function errors when duration is less than zero. As standard - /// library implementation is limited to non-negative values. - pub fn to_std(&self) -> Result { - if self.secs < 0 { - return Err(OutOfRangeError(())); - } - Ok(StdDuration::new(self.secs as u64, self.nanos as u32)) - } -} - -impl Neg for Duration { - type Output = Duration; - - #[inline] - fn neg(self) -> Duration { - if self.nanos == 0 { - Duration { secs: -self.secs, nanos: 0 } - } else { - Duration { secs: -self.secs - 1, nanos: NANOS_PER_SEC - self.nanos } - } - } -} - -impl Add for Duration { - type Output = Duration; - - fn add(self, rhs: Duration) -> Duration { - let mut secs = self.secs + rhs.secs; - let mut nanos = self.nanos + rhs.nanos; - if nanos >= NANOS_PER_SEC { - nanos -= NANOS_PER_SEC; - secs += 1; - } - Duration { secs, nanos } - } -} - -impl Sub for Duration { - type Output = Duration; - - fn sub(self, rhs: Duration) -> Duration { - let mut secs = self.secs - rhs.secs; - let mut nanos = self.nanos - rhs.nanos; - if nanos < 0 { - nanos += NANOS_PER_SEC; - secs -= 1; - } - Duration { secs, nanos } - } -} - -impl Mul for Duration { - type Output = Duration; - - fn mul(self, rhs: i32) -> Duration { - // Multiply nanoseconds as i64, because it cannot overflow that way. - let total_nanos = self.nanos as i64 * rhs as i64; - let (extra_secs, nanos) = div_mod_floor_64(total_nanos, NANOS_PER_SEC as i64); - let secs = self.secs * rhs as i64 + extra_secs; - Duration { secs, nanos: nanos as i32 } - } -} - -impl Div for Duration { - type Output = Duration; - - fn div(self, rhs: i32) -> Duration { - let mut secs = self.secs / rhs as i64; - let carry = self.secs - secs * rhs as i64; - let extra_nanos = carry * NANOS_PER_SEC as i64 / rhs as i64; - let mut nanos = self.nanos / rhs + extra_nanos as i32; - if nanos >= NANOS_PER_SEC { - nanos -= NANOS_PER_SEC; - secs += 1; - } - if nanos < 0 { - nanos += NANOS_PER_SEC; - secs -= 1; - } - Duration { secs, nanos } - } -} - -impl<'a> core::iter::Sum<&'a Duration> for Duration { - fn sum>(iter: I) -> Duration { - iter.fold(Duration::zero(), |acc, x| acc + *x) - } -} - -impl core::iter::Sum for Duration { - fn sum>(iter: I) -> Duration { - iter.fold(Duration::zero(), |acc, x| acc + x) - } -} - -impl fmt::Display for Duration { - /// Format a duration using the [ISO 8601] format - /// - /// [ISO 8601]: https://en.wikipedia.org/wiki/ISO_8601#Durations - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - // technically speaking, negative duration is not valid ISO 8601, - // but we need to print it anyway. - let (abs, sign) = if self.secs < 0 { (-*self, "-") } else { (*self, "") }; - - let days = abs.secs / SECS_PER_DAY; - let secs = abs.secs - days * SECS_PER_DAY; - let hasdate = days != 0; - let hastime = (secs != 0 || abs.nanos != 0) || !hasdate; - - write!(f, "{}P", sign)?; - - if hasdate { - write!(f, "{}D", days)?; - } - if hastime { - if abs.nanos == 0 { - write!(f, "T{}S", secs)?; - } else if abs.nanos % NANOS_PER_MILLI == 0 { - write!(f, "T{}.{:03}S", secs, abs.nanos / NANOS_PER_MILLI)?; - } else if abs.nanos % NANOS_PER_MICRO == 0 { - write!(f, "T{}.{:06}S", secs, abs.nanos / NANOS_PER_MICRO)?; - } else { - write!(f, "T{}.{:09}S", secs, abs.nanos)?; - } - } - Ok(()) - } -} - -/// Represents error when converting `Duration` to/from a standard library -/// implementation -/// -/// The `std::time::Duration` supports a range from zero to `u64::MAX` -/// *seconds*, while this module supports signed range of up to -/// `i64::MAX` of *milliseconds*. -#[derive(Debug, Clone, Copy, PartialEq, Eq)] -pub struct OutOfRangeError(()); - -impl fmt::Display for OutOfRangeError { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "Source duration value is out of range for the target type") - } -} - -#[cfg(feature = "std")] -impl Error for OutOfRangeError { - #[allow(deprecated)] - fn description(&self) -> &str { - "out of range error" - } -} - -#[inline] -const fn div_mod_floor_64(this: i64, other: i64) -> (i64, i64) { - (this.div_euclid(other), this.rem_euclid(other)) -} - -#[cfg(feature = "arbitrary")] -impl arbitrary::Arbitrary<'_> for Duration { - fn arbitrary(u: &mut arbitrary::Unstructured) -> arbitrary::Result { - const MIN_SECS: i64 = i64::MIN / MILLIS_PER_SEC - 1; - const MAX_SECS: i64 = i64::MAX / MILLIS_PER_SEC; - - let secs: i64 = u.int_in_range(MIN_SECS..=MAX_SECS)?; - let nanos: i32 = u.int_in_range(0..=(NANOS_PER_SEC - 1))?; - let duration = Duration { secs, nanos }; - - if duration < MIN || duration > MAX { - Err(arbitrary::Error::IncorrectFormat) - } else { - Ok(duration) - } - } -} - -#[cfg(test)] -mod tests { - use super::OutOfRangeError; - use super::{Duration, MAX, MIN}; - use core::time::Duration as StdDuration; - - #[test] - fn test_duration() { - assert!(Duration::seconds(1) != Duration::zero()); - assert_eq!(Duration::seconds(1) + Duration::seconds(2), Duration::seconds(3)); - assert_eq!( - Duration::seconds(86_399) + Duration::seconds(4), - Duration::days(1) + Duration::seconds(3) - ); - assert_eq!(Duration::days(10) - Duration::seconds(1000), Duration::seconds(863_000)); - assert_eq!(Duration::days(10) - Duration::seconds(1_000_000), Duration::seconds(-136_000)); - assert_eq!( - Duration::days(2) + Duration::seconds(86_399) + Duration::nanoseconds(1_234_567_890), - Duration::days(3) + Duration::nanoseconds(234_567_890) - ); - assert_eq!(-Duration::days(3), Duration::days(-3)); - assert_eq!( - -(Duration::days(3) + Duration::seconds(70)), - Duration::days(-4) + Duration::seconds(86_400 - 70) - ); - } - - #[test] - fn test_duration_num_days() { - assert_eq!(Duration::zero().num_days(), 0); - assert_eq!(Duration::days(1).num_days(), 1); - assert_eq!(Duration::days(-1).num_days(), -1); - assert_eq!(Duration::seconds(86_399).num_days(), 0); - assert_eq!(Duration::seconds(86_401).num_days(), 1); - assert_eq!(Duration::seconds(-86_399).num_days(), 0); - assert_eq!(Duration::seconds(-86_401).num_days(), -1); - assert_eq!(Duration::days(i32::MAX as i64).num_days(), i32::MAX as i64); - assert_eq!(Duration::days(i32::MIN as i64).num_days(), i32::MIN as i64); - } - - #[test] - fn test_duration_num_seconds() { - assert_eq!(Duration::zero().num_seconds(), 0); - assert_eq!(Duration::seconds(1).num_seconds(), 1); - assert_eq!(Duration::seconds(-1).num_seconds(), -1); - assert_eq!(Duration::milliseconds(999).num_seconds(), 0); - assert_eq!(Duration::milliseconds(1001).num_seconds(), 1); - assert_eq!(Duration::milliseconds(-999).num_seconds(), 0); - assert_eq!(Duration::milliseconds(-1001).num_seconds(), -1); - } - - #[test] - fn test_duration_num_milliseconds() { - assert_eq!(Duration::zero().num_milliseconds(), 0); - assert_eq!(Duration::milliseconds(1).num_milliseconds(), 1); - assert_eq!(Duration::milliseconds(-1).num_milliseconds(), -1); - assert_eq!(Duration::microseconds(999).num_milliseconds(), 0); - assert_eq!(Duration::microseconds(1001).num_milliseconds(), 1); - assert_eq!(Duration::microseconds(-999).num_milliseconds(), 0); - assert_eq!(Duration::microseconds(-1001).num_milliseconds(), -1); - assert_eq!(Duration::milliseconds(i64::MAX).num_milliseconds(), i64::MAX); - assert_eq!(Duration::milliseconds(i64::MIN).num_milliseconds(), i64::MIN); - assert_eq!(MAX.num_milliseconds(), i64::MAX); - assert_eq!(MIN.num_milliseconds(), i64::MIN); - } - - #[test] - fn test_duration_num_microseconds() { - assert_eq!(Duration::zero().num_microseconds(), Some(0)); - assert_eq!(Duration::microseconds(1).num_microseconds(), Some(1)); - assert_eq!(Duration::microseconds(-1).num_microseconds(), Some(-1)); - assert_eq!(Duration::nanoseconds(999).num_microseconds(), Some(0)); - assert_eq!(Duration::nanoseconds(1001).num_microseconds(), Some(1)); - assert_eq!(Duration::nanoseconds(-999).num_microseconds(), Some(0)); - assert_eq!(Duration::nanoseconds(-1001).num_microseconds(), Some(-1)); - assert_eq!(Duration::microseconds(i64::MAX).num_microseconds(), Some(i64::MAX)); - assert_eq!(Duration::microseconds(i64::MIN).num_microseconds(), Some(i64::MIN)); - assert_eq!(MAX.num_microseconds(), None); - assert_eq!(MIN.num_microseconds(), None); - - // overflow checks - const MICROS_PER_DAY: i64 = 86_400_000_000; - assert_eq!( - Duration::days(i64::MAX / MICROS_PER_DAY).num_microseconds(), - Some(i64::MAX / MICROS_PER_DAY * MICROS_PER_DAY) - ); - assert_eq!( - Duration::days(i64::MIN / MICROS_PER_DAY).num_microseconds(), - Some(i64::MIN / MICROS_PER_DAY * MICROS_PER_DAY) - ); - assert_eq!(Duration::days(i64::MAX / MICROS_PER_DAY + 1).num_microseconds(), None); - assert_eq!(Duration::days(i64::MIN / MICROS_PER_DAY - 1).num_microseconds(), None); - } - - #[test] - fn test_duration_num_nanoseconds() { - assert_eq!(Duration::zero().num_nanoseconds(), Some(0)); - assert_eq!(Duration::nanoseconds(1).num_nanoseconds(), Some(1)); - assert_eq!(Duration::nanoseconds(-1).num_nanoseconds(), Some(-1)); - assert_eq!(Duration::nanoseconds(i64::MAX).num_nanoseconds(), Some(i64::MAX)); - assert_eq!(Duration::nanoseconds(i64::MIN).num_nanoseconds(), Some(i64::MIN)); - assert_eq!(MAX.num_nanoseconds(), None); - assert_eq!(MIN.num_nanoseconds(), None); - - // overflow checks - const NANOS_PER_DAY: i64 = 86_400_000_000_000; - assert_eq!( - Duration::days(i64::MAX / NANOS_PER_DAY).num_nanoseconds(), - Some(i64::MAX / NANOS_PER_DAY * NANOS_PER_DAY) - ); - assert_eq!( - Duration::days(i64::MIN / NANOS_PER_DAY).num_nanoseconds(), - Some(i64::MIN / NANOS_PER_DAY * NANOS_PER_DAY) - ); - assert_eq!(Duration::days(i64::MAX / NANOS_PER_DAY + 1).num_nanoseconds(), None); - assert_eq!(Duration::days(i64::MIN / NANOS_PER_DAY - 1).num_nanoseconds(), None); - } - - #[test] - fn test_duration_checked_ops() { - assert_eq!( - Duration::milliseconds(i64::MAX - 1).checked_add(&Duration::microseconds(999)), - Some(Duration::milliseconds(i64::MAX - 2) + Duration::microseconds(1999)) - ); - assert!(Duration::milliseconds(i64::MAX) - .checked_add(&Duration::microseconds(1000)) - .is_none()); - - assert_eq!( - Duration::milliseconds(i64::MIN).checked_sub(&Duration::milliseconds(0)), - Some(Duration::milliseconds(i64::MIN)) - ); - assert!(Duration::milliseconds(i64::MIN).checked_sub(&Duration::milliseconds(1)).is_none()); - } - - #[test] - fn test_duration_abs() { - assert_eq!(Duration::milliseconds(1300).abs(), Duration::milliseconds(1300)); - assert_eq!(Duration::milliseconds(1000).abs(), Duration::milliseconds(1000)); - assert_eq!(Duration::milliseconds(300).abs(), Duration::milliseconds(300)); - assert_eq!(Duration::milliseconds(0).abs(), Duration::milliseconds(0)); - assert_eq!(Duration::milliseconds(-300).abs(), Duration::milliseconds(300)); - assert_eq!(Duration::milliseconds(-700).abs(), Duration::milliseconds(700)); - assert_eq!(Duration::milliseconds(-1000).abs(), Duration::milliseconds(1000)); - assert_eq!(Duration::milliseconds(-1300).abs(), Duration::milliseconds(1300)); - assert_eq!(Duration::milliseconds(-1700).abs(), Duration::milliseconds(1700)); - } - - #[test] - #[allow(clippy::erasing_op)] - fn test_duration_mul() { - assert_eq!(Duration::zero() * i32::MAX, Duration::zero()); - assert_eq!(Duration::zero() * i32::MIN, Duration::zero()); - assert_eq!(Duration::nanoseconds(1) * 0, Duration::zero()); - assert_eq!(Duration::nanoseconds(1) * 1, Duration::nanoseconds(1)); - assert_eq!(Duration::nanoseconds(1) * 1_000_000_000, Duration::seconds(1)); - assert_eq!(Duration::nanoseconds(1) * -1_000_000_000, -Duration::seconds(1)); - assert_eq!(-Duration::nanoseconds(1) * 1_000_000_000, -Duration::seconds(1)); - assert_eq!( - Duration::nanoseconds(30) * 333_333_333, - Duration::seconds(10) - Duration::nanoseconds(10) - ); - assert_eq!( - (Duration::nanoseconds(1) + Duration::seconds(1) + Duration::days(1)) * 3, - Duration::nanoseconds(3) + Duration::seconds(3) + Duration::days(3) - ); - assert_eq!(Duration::milliseconds(1500) * -2, Duration::seconds(-3)); - assert_eq!(Duration::milliseconds(-1500) * 2, Duration::seconds(-3)); - } - - #[test] - fn test_duration_div() { - assert_eq!(Duration::zero() / i32::MAX, Duration::zero()); - assert_eq!(Duration::zero() / i32::MIN, Duration::zero()); - assert_eq!(Duration::nanoseconds(123_456_789) / 1, Duration::nanoseconds(123_456_789)); - assert_eq!(Duration::nanoseconds(123_456_789) / -1, -Duration::nanoseconds(123_456_789)); - assert_eq!(-Duration::nanoseconds(123_456_789) / -1, Duration::nanoseconds(123_456_789)); - assert_eq!(-Duration::nanoseconds(123_456_789) / 1, -Duration::nanoseconds(123_456_789)); - assert_eq!(Duration::seconds(1) / 3, Duration::nanoseconds(333_333_333)); - assert_eq!(Duration::seconds(4) / 3, Duration::nanoseconds(1_333_333_333)); - assert_eq!(Duration::seconds(-1) / 2, Duration::milliseconds(-500)); - assert_eq!(Duration::seconds(1) / -2, Duration::milliseconds(-500)); - assert_eq!(Duration::seconds(-1) / -2, Duration::milliseconds(500)); - assert_eq!(Duration::seconds(-4) / 3, Duration::nanoseconds(-1_333_333_333)); - assert_eq!(Duration::seconds(-4) / -3, Duration::nanoseconds(1_333_333_333)); - } - - #[test] - fn test_duration_sum() { - let duration_list_1 = [Duration::zero(), Duration::seconds(1)]; - let sum_1: Duration = duration_list_1.iter().sum(); - assert_eq!(sum_1, Duration::seconds(1)); - - let duration_list_2 = - [Duration::zero(), Duration::seconds(1), Duration::seconds(6), Duration::seconds(10)]; - let sum_2: Duration = duration_list_2.iter().sum(); - assert_eq!(sum_2, Duration::seconds(17)); - - let duration_arr = - [Duration::zero(), Duration::seconds(1), Duration::seconds(6), Duration::seconds(10)]; - let sum_3: Duration = duration_arr.into_iter().sum(); - assert_eq!(sum_3, Duration::seconds(17)); - } - - #[test] - fn test_duration_fmt() { - assert_eq!(Duration::zero().to_string(), "PT0S"); - assert_eq!(Duration::days(42).to_string(), "P42D"); - assert_eq!(Duration::days(-42).to_string(), "-P42D"); - assert_eq!(Duration::seconds(42).to_string(), "PT42S"); - assert_eq!(Duration::milliseconds(42).to_string(), "PT0.042S"); - assert_eq!(Duration::microseconds(42).to_string(), "PT0.000042S"); - assert_eq!(Duration::nanoseconds(42).to_string(), "PT0.000000042S"); - assert_eq!((Duration::days(7) + Duration::milliseconds(6543)).to_string(), "P7DT6.543S"); - assert_eq!(Duration::seconds(-86_401).to_string(), "-P1DT1S"); - assert_eq!(Duration::nanoseconds(-1).to_string(), "-PT0.000000001S"); - - // the format specifier should have no effect on `Duration` - assert_eq!( - format!("{:30}", Duration::days(1) + Duration::milliseconds(2345)), - "P1DT2.345S" - ); - } - - #[test] - fn test_to_std() { - assert_eq!(Duration::seconds(1).to_std(), Ok(StdDuration::new(1, 0))); - assert_eq!(Duration::seconds(86_401).to_std(), Ok(StdDuration::new(86_401, 0))); - assert_eq!(Duration::milliseconds(123).to_std(), Ok(StdDuration::new(0, 123_000_000))); - assert_eq!( - Duration::milliseconds(123_765).to_std(), - Ok(StdDuration::new(123, 765_000_000)) - ); - assert_eq!(Duration::nanoseconds(777).to_std(), Ok(StdDuration::new(0, 777))); - assert_eq!(MAX.to_std(), Ok(StdDuration::new(9_223_372_036_854_775, 807_000_000))); - assert_eq!(Duration::seconds(-1).to_std(), Err(OutOfRangeError(()))); - assert_eq!(Duration::milliseconds(-1).to_std(), Err(OutOfRangeError(()))); - } - - #[test] - fn test_from_std() { - assert_eq!(Ok(Duration::seconds(1)), Duration::from_std(StdDuration::new(1, 0))); - assert_eq!(Ok(Duration::seconds(86_401)), Duration::from_std(StdDuration::new(86_401, 0))); - assert_eq!( - Ok(Duration::milliseconds(123)), - Duration::from_std(StdDuration::new(0, 123_000_000)) - ); - assert_eq!( - Ok(Duration::milliseconds(123_765)), - Duration::from_std(StdDuration::new(123, 765_000_000)) - ); - assert_eq!(Ok(Duration::nanoseconds(777)), Duration::from_std(StdDuration::new(0, 777))); - assert_eq!( - Ok(MAX), - Duration::from_std(StdDuration::new(9_223_372_036_854_775, 807_000_000)) - ); - assert_eq!( - Duration::from_std(StdDuration::new(9_223_372_036_854_776, 0)), - Err(OutOfRangeError(())) - ); - assert_eq!( - Duration::from_std(StdDuration::new(9_223_372_036_854_775, 807_000_001)), - Err(OutOfRangeError(())) - ); - } -} diff -Nru temporalio-1.3.0/vendor/chrono/src/format/formatting.rs temporalio-1.3.0/vendor/chrono/src/format/formatting.rs --- temporalio-1.3.0/vendor/chrono/src/format/formatting.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/chrono/src/format/formatting.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,979 +0,0 @@ -// This is a part of Chrono. -// See README.md and LICENSE.txt for details. - -//! Date and time formatting routines. - -#[cfg(feature = "alloc")] -use alloc::string::{String, ToString}; -#[cfg(any(feature = "alloc", feature = "std"))] -use core::borrow::Borrow; -use core::fmt; -use core::fmt::Write; - -#[cfg(any( - feature = "alloc", - feature = "std", - feature = "serde", - feature = "rustc-serialize" -))] -use crate::datetime::SecondsFormat; -#[cfg(any(feature = "alloc", feature = "std"))] -use crate::offset::Offset; -#[cfg(any( - feature = "alloc", - feature = "std", - feature = "serde", - feature = "rustc-serialize" -))] -use crate::{Datelike, FixedOffset, NaiveDateTime, Timelike}; -#[cfg(any(feature = "alloc", feature = "std"))] -use crate::{NaiveDate, NaiveTime, Weekday}; - -#[cfg(any(feature = "alloc", feature = "std"))] -use super::locales; -#[cfg(any( - feature = "alloc", - feature = "std", - feature = "serde", - feature = "rustc-serialize" -))] -use super::{Colons, OffsetFormat, OffsetPrecision, Pad}; -#[cfg(any(feature = "alloc", feature = "std"))] -use super::{Fixed, InternalFixed, InternalInternal, Item, Locale, Numeric}; -#[cfg(any(feature = "alloc", feature = "std"))] -use locales::*; - -/// A *temporary* object which can be used as an argument to `format!` or others. -/// This is normally constructed via `format` methods of each date and time type. -#[cfg(any(feature = "alloc", feature = "std"))] -#[cfg_attr(docsrs, doc(cfg(any(feature = "alloc", feature = "std"))))] -#[derive(Debug)] -pub struct DelayedFormat { - /// The date view, if any. - date: Option, - /// The time view, if any. - time: Option, - /// The name and local-to-UTC difference for the offset (timezone), if any. - off: Option<(String, FixedOffset)>, - /// An iterator returning formatting items. - items: I, - /// Locale used for text. - // TODO: Only used with the locale feature. We should make this property - // only present when the feature is enabled. - #[cfg(feature = "unstable-locales")] - locale: Option, -} - -#[cfg(any(feature = "alloc", feature = "std"))] -impl<'a, I: Iterator + Clone, B: Borrow>> DelayedFormat { - /// Makes a new `DelayedFormat` value out of local date and time. - #[must_use] - pub fn new(date: Option, time: Option, items: I) -> DelayedFormat { - DelayedFormat { - date, - time, - off: None, - items, - #[cfg(feature = "unstable-locales")] - locale: None, - } - } - - /// Makes a new `DelayedFormat` value out of local date and time and UTC offset. - #[must_use] - pub fn new_with_offset( - date: Option, - time: Option, - offset: &Off, - items: I, - ) -> DelayedFormat - where - Off: Offset + fmt::Display, - { - let name_and_diff = (offset.to_string(), offset.fix()); - DelayedFormat { - date, - time, - off: Some(name_and_diff), - items, - #[cfg(feature = "unstable-locales")] - locale: None, - } - } - - /// Makes a new `DelayedFormat` value out of local date and time and locale. - #[cfg(feature = "unstable-locales")] - #[cfg_attr(docsrs, doc(cfg(feature = "unstable-locales")))] - #[must_use] - pub fn new_with_locale( - date: Option, - time: Option, - items: I, - locale: Locale, - ) -> DelayedFormat { - DelayedFormat { date, time, off: None, items, locale: Some(locale) } - } - - /// Makes a new `DelayedFormat` value out of local date and time, UTC offset and locale. - #[cfg(feature = "unstable-locales")] - #[cfg_attr(docsrs, doc(cfg(feature = "unstable-locales")))] - #[must_use] - pub fn new_with_offset_and_locale( - date: Option, - time: Option, - offset: &Off, - items: I, - locale: Locale, - ) -> DelayedFormat - where - Off: Offset + fmt::Display, - { - let name_and_diff = (offset.to_string(), offset.fix()); - DelayedFormat { date, time, off: Some(name_and_diff), items, locale: Some(locale) } - } -} - -#[cfg(any(feature = "alloc", feature = "std"))] -impl<'a, I: Iterator + Clone, B: Borrow>> fmt::Display for DelayedFormat { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - #[cfg(feature = "unstable-locales")] - { - if let Some(locale) = self.locale { - return format_localized( - f, - self.date.as_ref(), - self.time.as_ref(), - self.off.as_ref(), - self.items.clone(), - locale, - ); - } - } - - format(f, self.date.as_ref(), self.time.as_ref(), self.off.as_ref(), self.items.clone()) - } -} - -/// Tries to format given arguments with given formatting items. -/// Internally used by `DelayedFormat`. -#[cfg(any(feature = "alloc", feature = "std"))] -#[cfg_attr(docsrs, doc(cfg(any(feature = "alloc", feature = "std"))))] -pub fn format<'a, I, B>( - w: &mut fmt::Formatter, - date: Option<&NaiveDate>, - time: Option<&NaiveTime>, - off: Option<&(String, FixedOffset)>, - items: I, -) -> fmt::Result -where - I: Iterator + Clone, - B: Borrow>, -{ - let mut result = String::new(); - for item in items { - format_inner(&mut result, date, time, off, item.borrow(), None)?; - } - w.pad(&result) -} -/// Formats single formatting item -#[cfg(any(feature = "alloc", feature = "std"))] -#[cfg_attr(docsrs, doc(cfg(any(feature = "alloc", feature = "std"))))] -pub fn format_item( - w: &mut fmt::Formatter, - date: Option<&NaiveDate>, - time: Option<&NaiveTime>, - off: Option<&(String, FixedOffset)>, - item: &Item<'_>, -) -> fmt::Result { - let mut result = String::new(); - format_inner(&mut result, date, time, off, item, None)?; - w.pad(&result) -} - -/// Tries to format given arguments with given formatting items. -/// Internally used by `DelayedFormat`. -#[cfg(feature = "unstable-locales")] -#[cfg_attr(docsrs, doc(cfg(feature = "unstable-locales")))] -pub fn format_localized<'a, I, B>( - w: &mut fmt::Formatter, - date: Option<&NaiveDate>, - time: Option<&NaiveTime>, - off: Option<&(String, FixedOffset)>, - items: I, - locale: Locale, -) -> fmt::Result -where - I: Iterator + Clone, - B: Borrow>, -{ - let mut result = String::new(); - for item in items { - format_inner(&mut result, date, time, off, item.borrow(), Some(locale))?; - } - w.pad(&result) -} - -/// Formats single formatting item -#[cfg(feature = "unstable-locales")] -#[cfg_attr(docsrs, doc(cfg(feature = "unstable-locales")))] -pub fn format_item_localized( - w: &mut fmt::Formatter, - date: Option<&NaiveDate>, - time: Option<&NaiveTime>, - off: Option<&(String, FixedOffset)>, - item: &Item<'_>, - locale: Locale, -) -> fmt::Result { - let mut result = String::new(); - format_inner(&mut result, date, time, off, item, Some(locale))?; - w.pad(&result) -} - -#[cfg(any(feature = "alloc", feature = "std"))] -fn format_inner( - w: &mut impl Write, - date: Option<&NaiveDate>, - time: Option<&NaiveTime>, - off: Option<&(String, FixedOffset)>, - item: &Item<'_>, - locale: Option, -) -> fmt::Result { - let locale = locale.unwrap_or(default_locale()); - - match *item { - Item::Literal(s) | Item::Space(s) => w.write_str(s), - #[cfg(any(feature = "alloc", feature = "std"))] - Item::OwnedLiteral(ref s) | Item::OwnedSpace(ref s) => w.write_str(s), - - Item::Numeric(ref spec, ref pad) => { - use self::Numeric::*; - - let week_from_sun = |d: &NaiveDate| d.weeks_from(Weekday::Sun); - let week_from_mon = |d: &NaiveDate| d.weeks_from(Weekday::Mon); - - let (width, v) = match *spec { - Year => (4, date.map(|d| i64::from(d.year()))), - YearDiv100 => (2, date.map(|d| i64::from(d.year()).div_euclid(100))), - YearMod100 => (2, date.map(|d| i64::from(d.year()).rem_euclid(100))), - IsoYear => (4, date.map(|d| i64::from(d.iso_week().year()))), - IsoYearDiv100 => (2, date.map(|d| i64::from(d.iso_week().year()).div_euclid(100))), - IsoYearMod100 => (2, date.map(|d| i64::from(d.iso_week().year()).rem_euclid(100))), - Month => (2, date.map(|d| i64::from(d.month()))), - Day => (2, date.map(|d| i64::from(d.day()))), - WeekFromSun => (2, date.map(|d| i64::from(week_from_sun(d)))), - WeekFromMon => (2, date.map(|d| i64::from(week_from_mon(d)))), - IsoWeek => (2, date.map(|d| i64::from(d.iso_week().week()))), - NumDaysFromSun => (1, date.map(|d| i64::from(d.weekday().num_days_from_sunday()))), - WeekdayFromMon => (1, date.map(|d| i64::from(d.weekday().number_from_monday()))), - Ordinal => (3, date.map(|d| i64::from(d.ordinal()))), - Hour => (2, time.map(|t| i64::from(t.hour()))), - Hour12 => (2, time.map(|t| i64::from(t.hour12().1))), - Minute => (2, time.map(|t| i64::from(t.minute()))), - Second => (2, time.map(|t| i64::from(t.second() + t.nanosecond() / 1_000_000_000))), - Nanosecond => (9, time.map(|t| i64::from(t.nanosecond() % 1_000_000_000))), - Timestamp => ( - 1, - match (date, time, off) { - (Some(d), Some(t), None) => Some(d.and_time(*t).timestamp()), - (Some(d), Some(t), Some(&(_, off))) => { - Some(d.and_time(*t).timestamp() - i64::from(off.local_minus_utc())) - } - (_, _, _) => None, - }, - ), - - // for the future expansion - Internal(ref int) => match int._dummy {}, - }; - - if let Some(v) = v { - if (spec == &Year || spec == &IsoYear) && !(0..10_000).contains(&v) { - // non-four-digit years require an explicit sign as per ISO 8601 - match *pad { - Pad::None => write!(w, "{:+}", v), - Pad::Zero => write!(w, "{:+01$}", v, width + 1), - Pad::Space => write!(w, "{:+1$}", v, width + 1), - } - } else { - match *pad { - Pad::None => write!(w, "{}", v), - Pad::Zero => write!(w, "{:01$}", v, width), - Pad::Space => write!(w, "{:1$}", v, width), - } - } - } else { - Err(fmt::Error) // insufficient arguments for given format - } - } - - Item::Fixed(ref spec) => { - use self::Fixed::*; - - let ret = match *spec { - ShortMonthName => date.map(|d| { - w.write_str(short_months(locale)[d.month0() as usize])?; - Ok(()) - }), - LongMonthName => date.map(|d| { - w.write_str(long_months(locale)[d.month0() as usize])?; - Ok(()) - }), - ShortWeekdayName => date.map(|d| { - w.write_str( - short_weekdays(locale)[d.weekday().num_days_from_sunday() as usize], - )?; - Ok(()) - }), - LongWeekdayName => date.map(|d| { - w.write_str( - long_weekdays(locale)[d.weekday().num_days_from_sunday() as usize], - )?; - Ok(()) - }), - LowerAmPm => time.map(|t| { - let ampm = if t.hour12().0 { am_pm(locale)[1] } else { am_pm(locale)[0] }; - for c in ampm.chars().flat_map(|c| c.to_lowercase()) { - w.write_char(c)? - } - Ok(()) - }), - UpperAmPm => time.map(|t| { - w.write_str(if t.hour12().0 { am_pm(locale)[1] } else { am_pm(locale)[0] })?; - Ok(()) - }), - Nanosecond => time.map(|t| { - let nano = t.nanosecond() % 1_000_000_000; - if nano == 0 { - Ok(()) - } else { - w.write_str(decimal_point(locale))?; - if nano % 1_000_000 == 0 { - write!(w, "{:03}", nano / 1_000_000) - } else if nano % 1_000 == 0 { - write!(w, "{:06}", nano / 1_000) - } else { - write!(w, "{:09}", nano) - } - } - }), - Nanosecond3 => time.map(|t| { - let nano = t.nanosecond() % 1_000_000_000; - w.write_str(decimal_point(locale))?; - write!(w, "{:03}", nano / 1_000_000) - }), - Nanosecond6 => time.map(|t| { - let nano = t.nanosecond() % 1_000_000_000; - w.write_str(decimal_point(locale))?; - write!(w, "{:06}", nano / 1_000) - }), - Nanosecond9 => time.map(|t| { - let nano = t.nanosecond() % 1_000_000_000; - w.write_str(decimal_point(locale))?; - write!(w, "{:09}", nano) - }), - Internal(InternalFixed { val: InternalInternal::Nanosecond3NoDot }) => { - time.map(|t| { - let nano = t.nanosecond() % 1_000_000_000; - write!(w, "{:03}", nano / 1_000_000) - }) - } - Internal(InternalFixed { val: InternalInternal::Nanosecond6NoDot }) => { - time.map(|t| { - let nano = t.nanosecond() % 1_000_000_000; - write!(w, "{:06}", nano / 1_000) - }) - } - Internal(InternalFixed { val: InternalInternal::Nanosecond9NoDot }) => { - time.map(|t| { - let nano = t.nanosecond() % 1_000_000_000; - write!(w, "{:09}", nano) - }) - } - TimezoneName => off.map(|(name, _)| { - w.write_str(name)?; - Ok(()) - }), - TimezoneOffset | TimezoneOffsetZ => off.map(|&(_, off)| { - OffsetFormat { - precision: OffsetPrecision::Minutes, - colons: Colons::Maybe, - allow_zulu: *spec == TimezoneOffsetZ, - padding: Pad::Zero, - } - .format(w, off) - }), - TimezoneOffsetColon | TimezoneOffsetColonZ => off.map(|&(_, off)| { - OffsetFormat { - precision: OffsetPrecision::Minutes, - colons: Colons::Colon, - allow_zulu: *spec == TimezoneOffsetColonZ, - padding: Pad::Zero, - } - .format(w, off) - }), - TimezoneOffsetDoubleColon => off.map(|&(_, off)| { - OffsetFormat { - precision: OffsetPrecision::Seconds, - colons: Colons::Colon, - allow_zulu: false, - padding: Pad::Zero, - } - .format(w, off) - }), - TimezoneOffsetTripleColon => off.map(|&(_, off)| { - OffsetFormat { - precision: OffsetPrecision::Hours, - colons: Colons::None, - allow_zulu: false, - padding: Pad::Zero, - } - .format(w, off) - }), - Internal(InternalFixed { val: InternalInternal::TimezoneOffsetPermissive }) => { - return Err(fmt::Error); - } - RFC2822 => - // same as `%a, %d %b %Y %H:%M:%S %z` - { - if let (Some(d), Some(t), Some(&(_, off))) = (date, time, off) { - Some(write_rfc2822_inner(w, *d, *t, off, locale)) - } else { - None - } - } - RFC3339 => - // same as `%Y-%m-%dT%H:%M:%S%.f%:z` - { - if let (Some(d), Some(t), Some(&(_, off))) = (date, time, off) { - Some(write_rfc3339( - w, - crate::NaiveDateTime::new(*d, *t), - off.fix(), - SecondsFormat::AutoSi, - false, - )) - } else { - None - } - } - }; - - ret.unwrap_or(Err(fmt::Error)) // insufficient arguments for given format - } - - Item::Error => Err(fmt::Error), - } -} - -#[cfg(any(feature = "alloc", feature = "std", feature = "serde", feature = "rustc-serialize"))] -impl OffsetFormat { - /// Writes an offset from UTC with the format defined by `self`. - fn format(&self, w: &mut impl Write, off: FixedOffset) -> fmt::Result { - let off = off.local_minus_utc(); - if self.allow_zulu && off == 0 { - w.write_char('Z')?; - return Ok(()); - } - let (sign, off) = if off < 0 { ('-', -off) } else { ('+', off) }; - - let hours; - let mut mins = 0; - let mut secs = 0; - let precision = match self.precision { - OffsetPrecision::Hours => { - // Minutes and seconds are simply truncated - hours = (off / 3600) as u8; - OffsetPrecision::Hours - } - OffsetPrecision::Minutes | OffsetPrecision::OptionalMinutes => { - // Round seconds to the nearest minute. - let minutes = (off + 30) / 60; - mins = (minutes % 60) as u8; - hours = (minutes / 60) as u8; - if self.precision == OffsetPrecision::OptionalMinutes && mins == 0 { - OffsetPrecision::Hours - } else { - OffsetPrecision::Minutes - } - } - OffsetPrecision::Seconds - | OffsetPrecision::OptionalSeconds - | OffsetPrecision::OptionalMinutesAndSeconds => { - let minutes = off / 60; - secs = (off % 60) as u8; - mins = (minutes % 60) as u8; - hours = (minutes / 60) as u8; - if self.precision != OffsetPrecision::Seconds && secs == 0 { - if self.precision == OffsetPrecision::OptionalMinutesAndSeconds && mins == 0 { - OffsetPrecision::Hours - } else { - OffsetPrecision::Minutes - } - } else { - OffsetPrecision::Seconds - } - } - }; - let colons = self.colons == Colons::Colon; - - if hours < 10 { - if self.padding == Pad::Space { - w.write_char(' ')?; - } - w.write_char(sign)?; - if self.padding == Pad::Zero { - w.write_char('0')?; - } - w.write_char((b'0' + hours) as char)?; - } else { - w.write_char(sign)?; - write_hundreds(w, hours)?; - } - if let OffsetPrecision::Minutes | OffsetPrecision::Seconds = precision { - if colons { - w.write_char(':')?; - } - write_hundreds(w, mins)?; - } - if let OffsetPrecision::Seconds = precision { - if colons { - w.write_char(':')?; - } - write_hundreds(w, secs)?; - } - Ok(()) - } -} - -/// Writes the date, time and offset to the string. same as `%Y-%m-%dT%H:%M:%S%.f%:z` -#[inline] -#[cfg(any(feature = "alloc", feature = "std", feature = "serde", feature = "rustc-serialize"))] -pub(crate) fn write_rfc3339( - w: &mut impl Write, - dt: NaiveDateTime, - off: FixedOffset, - secform: SecondsFormat, - use_z: bool, -) -> fmt::Result { - let year = dt.date().year(); - if (0..=9999).contains(&year) { - write_hundreds(w, (year / 100) as u8)?; - write_hundreds(w, (year % 100) as u8)?; - } else { - // ISO 8601 requires the explicit sign for out-of-range years - write!(w, "{:+05}", year)?; - } - w.write_char('-')?; - write_hundreds(w, dt.date().month() as u8)?; - w.write_char('-')?; - write_hundreds(w, dt.date().day() as u8)?; - - w.write_char('T')?; - - let (hour, min, mut sec) = dt.time().hms(); - let mut nano = dt.nanosecond(); - if nano >= 1_000_000_000 { - sec += 1; - nano -= 1_000_000_000; - } - write_hundreds(w, hour as u8)?; - w.write_char(':')?; - write_hundreds(w, min as u8)?; - w.write_char(':')?; - let sec = sec; - write_hundreds(w, sec as u8)?; - - match secform { - SecondsFormat::Secs => {} - SecondsFormat::Millis => write!(w, ".{:03}", nano / 1_000_000)?, - SecondsFormat::Micros => write!(w, ".{:06}", nano / 1000)?, - SecondsFormat::Nanos => write!(w, ".{:09}", nano)?, - SecondsFormat::AutoSi => { - if nano == 0 { - } else if nano % 1_000_000 == 0 { - write!(w, ".{:03}", nano / 1_000_000)? - } else if nano % 1_000 == 0 { - write!(w, ".{:06}", nano / 1_000)? - } else { - write!(w, ".{:09}", nano)? - } - } - SecondsFormat::__NonExhaustive => unreachable!(), - }; - - OffsetFormat { - precision: OffsetPrecision::Minutes, - colons: Colons::Colon, - allow_zulu: use_z, - padding: Pad::Zero, - } - .format(w, off) -} - -#[cfg(any(feature = "alloc", feature = "std"))] -/// write datetimes like `Tue, 1 Jul 2003 10:52:37 +0200`, same as `%a, %d %b %Y %H:%M:%S %z` -pub(crate) fn write_rfc2822( - w: &mut impl Write, - dt: NaiveDateTime, - off: FixedOffset, -) -> fmt::Result { - write_rfc2822_inner(w, dt.date(), dt.time(), off, default_locale()) -} - -#[cfg(any(feature = "alloc", feature = "std"))] -/// write datetimes like `Tue, 1 Jul 2003 10:52:37 +0200`, same as `%a, %d %b %Y %H:%M:%S %z` -fn write_rfc2822_inner( - w: &mut impl Write, - d: NaiveDate, - t: NaiveTime, - off: FixedOffset, - locale: Locale, -) -> fmt::Result { - let year = d.year(); - // RFC2822 is only defined on years 0 through 9999 - if !(0..=9999).contains(&year) { - return Err(fmt::Error); - } - - w.write_str(short_weekdays(locale)[d.weekday().num_days_from_sunday() as usize])?; - w.write_str(", ")?; - let day = d.day(); - if day < 10 { - w.write_char((b'0' + day as u8) as char)?; - } else { - write_hundreds(w, day as u8)?; - } - w.write_char(' ')?; - w.write_str(short_months(locale)[d.month0() as usize])?; - w.write_char(' ')?; - write_hundreds(w, (year / 100) as u8)?; - write_hundreds(w, (year % 100) as u8)?; - w.write_char(' ')?; - - let (hour, min, sec) = t.hms(); - write_hundreds(w, hour as u8)?; - w.write_char(':')?; - write_hundreds(w, min as u8)?; - w.write_char(':')?; - let sec = sec + t.nanosecond() / 1_000_000_000; - write_hundreds(w, sec as u8)?; - w.write_char(' ')?; - OffsetFormat { - precision: OffsetPrecision::Minutes, - colons: Colons::None, - allow_zulu: false, - padding: Pad::Zero, - } - .format(w, off) -} - -/// Equivalent to `{:02}` formatting for n < 100. -pub(crate) fn write_hundreds(w: &mut impl Write, n: u8) -> fmt::Result { - if n >= 100 { - return Err(fmt::Error); - } - - let tens = b'0' + n / 10; - let ones = b'0' + n % 10; - w.write_char(tens as char)?; - w.write_char(ones as char) -} - -#[cfg(test)] -#[cfg(any(feature = "alloc", feature = "std"))] -mod tests { - use super::{Colons, OffsetFormat, OffsetPrecision, Pad}; - use crate::FixedOffset; - #[cfg(any(feature = "alloc", feature = "std"))] - use crate::{NaiveDate, NaiveTime, TimeZone, Timelike, Utc}; - - #[test] - #[cfg(any(feature = "alloc", feature = "std"))] - fn test_date_format() { - let d = NaiveDate::from_ymd_opt(2012, 3, 4).unwrap(); - assert_eq!(d.format("%Y,%C,%y,%G,%g").to_string(), "2012,20,12,2012,12"); - assert_eq!(d.format("%m,%b,%h,%B").to_string(), "03,Mar,Mar,March"); - assert_eq!(d.format("%d,%e").to_string(), "04, 4"); - assert_eq!(d.format("%U,%W,%V").to_string(), "10,09,09"); - assert_eq!(d.format("%a,%A,%w,%u").to_string(), "Sun,Sunday,0,7"); - assert_eq!(d.format("%j").to_string(), "064"); // since 2012 is a leap year - assert_eq!(d.format("%D,%x").to_string(), "03/04/12,03/04/12"); - assert_eq!(d.format("%F").to_string(), "2012-03-04"); - assert_eq!(d.format("%v").to_string(), " 4-Mar-2012"); - assert_eq!(d.format("%t%n%%%n%t").to_string(), "\t\n%\n\t"); - - // non-four-digit years - assert_eq!( - NaiveDate::from_ymd_opt(12345, 1, 1).unwrap().format("%Y").to_string(), - "+12345" - ); - assert_eq!(NaiveDate::from_ymd_opt(1234, 1, 1).unwrap().format("%Y").to_string(), "1234"); - assert_eq!(NaiveDate::from_ymd_opt(123, 1, 1).unwrap().format("%Y").to_string(), "0123"); - assert_eq!(NaiveDate::from_ymd_opt(12, 1, 1).unwrap().format("%Y").to_string(), "0012"); - assert_eq!(NaiveDate::from_ymd_opt(1, 1, 1).unwrap().format("%Y").to_string(), "0001"); - assert_eq!(NaiveDate::from_ymd_opt(0, 1, 1).unwrap().format("%Y").to_string(), "0000"); - assert_eq!(NaiveDate::from_ymd_opt(-1, 1, 1).unwrap().format("%Y").to_string(), "-0001"); - assert_eq!(NaiveDate::from_ymd_opt(-12, 1, 1).unwrap().format("%Y").to_string(), "-0012"); - assert_eq!(NaiveDate::from_ymd_opt(-123, 1, 1).unwrap().format("%Y").to_string(), "-0123"); - assert_eq!(NaiveDate::from_ymd_opt(-1234, 1, 1).unwrap().format("%Y").to_string(), "-1234"); - assert_eq!( - NaiveDate::from_ymd_opt(-12345, 1, 1).unwrap().format("%Y").to_string(), - "-12345" - ); - - // corner cases - assert_eq!( - NaiveDate::from_ymd_opt(2007, 12, 31).unwrap().format("%G,%g,%U,%W,%V").to_string(), - "2008,08,52,53,01" - ); - assert_eq!( - NaiveDate::from_ymd_opt(2010, 1, 3).unwrap().format("%G,%g,%U,%W,%V").to_string(), - "2009,09,01,00,53" - ); - } - - #[test] - #[cfg(any(feature = "alloc", feature = "std"))] - fn test_time_format() { - let t = NaiveTime::from_hms_nano_opt(3, 5, 7, 98765432).unwrap(); - assert_eq!(t.format("%H,%k,%I,%l,%P,%p").to_string(), "03, 3,03, 3,am,AM"); - assert_eq!(t.format("%M").to_string(), "05"); - assert_eq!(t.format("%S,%f,%.f").to_string(), "07,098765432,.098765432"); - assert_eq!(t.format("%.3f,%.6f,%.9f").to_string(), ".098,.098765,.098765432"); - assert_eq!(t.format("%R").to_string(), "03:05"); - assert_eq!(t.format("%T,%X").to_string(), "03:05:07,03:05:07"); - assert_eq!(t.format("%r").to_string(), "03:05:07 AM"); - assert_eq!(t.format("%t%n%%%n%t").to_string(), "\t\n%\n\t"); - - let t = NaiveTime::from_hms_micro_opt(3, 5, 7, 432100).unwrap(); - assert_eq!(t.format("%S,%f,%.f").to_string(), "07,432100000,.432100"); - assert_eq!(t.format("%.3f,%.6f,%.9f").to_string(), ".432,.432100,.432100000"); - - let t = NaiveTime::from_hms_milli_opt(3, 5, 7, 210).unwrap(); - assert_eq!(t.format("%S,%f,%.f").to_string(), "07,210000000,.210"); - assert_eq!(t.format("%.3f,%.6f,%.9f").to_string(), ".210,.210000,.210000000"); - - let t = NaiveTime::from_hms_opt(3, 5, 7).unwrap(); - assert_eq!(t.format("%S,%f,%.f").to_string(), "07,000000000,"); - assert_eq!(t.format("%.3f,%.6f,%.9f").to_string(), ".000,.000000,.000000000"); - - // corner cases - assert_eq!( - NaiveTime::from_hms_opt(13, 57, 9).unwrap().format("%r").to_string(), - "01:57:09 PM" - ); - assert_eq!( - NaiveTime::from_hms_milli_opt(23, 59, 59, 1_000).unwrap().format("%X").to_string(), - "23:59:60" - ); - } - - #[test] - #[cfg(any(feature = "alloc", feature = "std"))] - fn test_datetime_format() { - let dt = - NaiveDate::from_ymd_opt(2010, 9, 8).unwrap().and_hms_milli_opt(7, 6, 54, 321).unwrap(); - assert_eq!(dt.format("%c").to_string(), "Wed Sep 8 07:06:54 2010"); - assert_eq!(dt.format("%s").to_string(), "1283929614"); - assert_eq!(dt.format("%t%n%%%n%t").to_string(), "\t\n%\n\t"); - - // a horror of leap second: coming near to you. - let dt = NaiveDate::from_ymd_opt(2012, 6, 30) - .unwrap() - .and_hms_milli_opt(23, 59, 59, 1_000) - .unwrap(); - assert_eq!(dt.format("%c").to_string(), "Sat Jun 30 23:59:60 2012"); - assert_eq!(dt.format("%s").to_string(), "1341100799"); // not 1341100800, it's intentional. - } - - #[test] - #[cfg(any(feature = "alloc", feature = "std"))] - fn test_datetime_format_alignment() { - let datetime = Utc - .with_ymd_and_hms(2007, 1, 2, 12, 34, 56) - .unwrap() - .with_nanosecond(123456789) - .unwrap(); - - // Item::Literal, odd number of padding bytes. - let percent = datetime.format("%%"); - assert_eq!(" %", format!("{:>4}", percent)); - assert_eq!("% ", format!("{:<4}", percent)); - assert_eq!(" % ", format!("{:^4}", percent)); - - // Item::Numeric, custom non-ASCII padding character - let year = datetime.format("%Y"); - assert_eq!("——2007", format!("{:—>6}", year)); - assert_eq!("2007——", format!("{:—<6}", year)); - assert_eq!("—2007—", format!("{:—^6}", year)); - - // Item::Fixed - let tz = datetime.format("%Z"); - assert_eq!(" UTC", format!("{:>5}", tz)); - assert_eq!("UTC ", format!("{:<5}", tz)); - assert_eq!(" UTC ", format!("{:^5}", tz)); - - // [Item::Numeric, Item::Space, Item::Literal, Item::Space, Item::Numeric] - let ymd = datetime.format("%Y %B %d"); - assert_eq!(" 2007 January 02", format!("{:>17}", ymd)); - assert_eq!("2007 January 02 ", format!("{:<17}", ymd)); - assert_eq!(" 2007 January 02 ", format!("{:^17}", ymd)); - - // Truncated - let time = datetime.format("%T%.6f"); - assert_eq!("12:34:56.1234", format!("{:.13}", time)); - } - - #[test] - fn test_offset_formatting() { - fn check_all(precision: OffsetPrecision, expected: [[&str; 7]; 12]) { - fn check( - precision: OffsetPrecision, - colons: Colons, - padding: Pad, - allow_zulu: bool, - offsets: [FixedOffset; 7], - expected: [&str; 7], - ) { - let offset_format = OffsetFormat { precision, colons, allow_zulu, padding }; - for (offset, expected) in offsets.iter().zip(expected.iter()) { - let mut output = String::new(); - offset_format.format(&mut output, *offset).unwrap(); - assert_eq!(&output, expected); - } - } - // +03:45, -03:30, +11:00, -11:00:22, +02:34:26, -12:34:30, +00:00 - let offsets = [ - FixedOffset::east_opt(13_500).unwrap(), - FixedOffset::east_opt(-12_600).unwrap(), - FixedOffset::east_opt(39_600).unwrap(), - FixedOffset::east_opt(-39_622).unwrap(), - FixedOffset::east_opt(9266).unwrap(), - FixedOffset::east_opt(-45270).unwrap(), - FixedOffset::east_opt(0).unwrap(), - ]; - check(precision, Colons::Colon, Pad::Zero, false, offsets, expected[0]); - check(precision, Colons::Colon, Pad::Zero, true, offsets, expected[1]); - check(precision, Colons::Colon, Pad::Space, false, offsets, expected[2]); - check(precision, Colons::Colon, Pad::Space, true, offsets, expected[3]); - check(precision, Colons::Colon, Pad::None, false, offsets, expected[4]); - check(precision, Colons::Colon, Pad::None, true, offsets, expected[5]); - check(precision, Colons::None, Pad::Zero, false, offsets, expected[6]); - check(precision, Colons::None, Pad::Zero, true, offsets, expected[7]); - check(precision, Colons::None, Pad::Space, false, offsets, expected[8]); - check(precision, Colons::None, Pad::Space, true, offsets, expected[9]); - check(precision, Colons::None, Pad::None, false, offsets, expected[10]); - check(precision, Colons::None, Pad::None, true, offsets, expected[11]); - // `Colons::Maybe` should format the same as `Colons::None` - check(precision, Colons::Maybe, Pad::Zero, false, offsets, expected[6]); - check(precision, Colons::Maybe, Pad::Zero, true, offsets, expected[7]); - check(precision, Colons::Maybe, Pad::Space, false, offsets, expected[8]); - check(precision, Colons::Maybe, Pad::Space, true, offsets, expected[9]); - check(precision, Colons::Maybe, Pad::None, false, offsets, expected[10]); - check(precision, Colons::Maybe, Pad::None, true, offsets, expected[11]); - } - check_all( - OffsetPrecision::Hours, - [ - ["+03", "-03", "+11", "-11", "+02", "-12", "+00"], - ["+03", "-03", "+11", "-11", "+02", "-12", "Z"], - [" +3", " -3", "+11", "-11", " +2", "-12", " +0"], - [" +3", " -3", "+11", "-11", " +2", "-12", "Z"], - ["+3", "-3", "+11", "-11", "+2", "-12", "+0"], - ["+3", "-3", "+11", "-11", "+2", "-12", "Z"], - ["+03", "-03", "+11", "-11", "+02", "-12", "+00"], - ["+03", "-03", "+11", "-11", "+02", "-12", "Z"], - [" +3", " -3", "+11", "-11", " +2", "-12", " +0"], - [" +3", " -3", "+11", "-11", " +2", "-12", "Z"], - ["+3", "-3", "+11", "-11", "+2", "-12", "+0"], - ["+3", "-3", "+11", "-11", "+2", "-12", "Z"], - ], - ); - check_all( - OffsetPrecision::Minutes, - [ - ["+03:45", "-03:30", "+11:00", "-11:00", "+02:34", "-12:35", "+00:00"], - ["+03:45", "-03:30", "+11:00", "-11:00", "+02:34", "-12:35", "Z"], - [" +3:45", " -3:30", "+11:00", "-11:00", " +2:34", "-12:35", " +0:00"], - [" +3:45", " -3:30", "+11:00", "-11:00", " +2:34", "-12:35", "Z"], - ["+3:45", "-3:30", "+11:00", "-11:00", "+2:34", "-12:35", "+0:00"], - ["+3:45", "-3:30", "+11:00", "-11:00", "+2:34", "-12:35", "Z"], - ["+0345", "-0330", "+1100", "-1100", "+0234", "-1235", "+0000"], - ["+0345", "-0330", "+1100", "-1100", "+0234", "-1235", "Z"], - [" +345", " -330", "+1100", "-1100", " +234", "-1235", " +000"], - [" +345", " -330", "+1100", "-1100", " +234", "-1235", "Z"], - ["+345", "-330", "+1100", "-1100", "+234", "-1235", "+000"], - ["+345", "-330", "+1100", "-1100", "+234", "-1235", "Z"], - ], - ); - #[rustfmt::skip] - check_all( - OffsetPrecision::Seconds, - [ - ["+03:45:00", "-03:30:00", "+11:00:00", "-11:00:22", "+02:34:26", "-12:34:30", "+00:00:00"], - ["+03:45:00", "-03:30:00", "+11:00:00", "-11:00:22", "+02:34:26", "-12:34:30", "Z"], - [" +3:45:00", " -3:30:00", "+11:00:00", "-11:00:22", " +2:34:26", "-12:34:30", " +0:00:00"], - [" +3:45:00", " -3:30:00", "+11:00:00", "-11:00:22", " +2:34:26", "-12:34:30", "Z"], - ["+3:45:00", "-3:30:00", "+11:00:00", "-11:00:22", "+2:34:26", "-12:34:30", "+0:00:00"], - ["+3:45:00", "-3:30:00", "+11:00:00", "-11:00:22", "+2:34:26", "-12:34:30", "Z"], - ["+034500", "-033000", "+110000", "-110022", "+023426", "-123430", "+000000"], - ["+034500", "-033000", "+110000", "-110022", "+023426", "-123430", "Z"], - [" +34500", " -33000", "+110000", "-110022", " +23426", "-123430", " +00000"], - [" +34500", " -33000", "+110000", "-110022", " +23426", "-123430", "Z"], - ["+34500", "-33000", "+110000", "-110022", "+23426", "-123430", "+00000"], - ["+34500", "-33000", "+110000", "-110022", "+23426", "-123430", "Z"], - ], - ); - check_all( - OffsetPrecision::OptionalMinutes, - [ - ["+03:45", "-03:30", "+11", "-11", "+02:34", "-12:35", "+00"], - ["+03:45", "-03:30", "+11", "-11", "+02:34", "-12:35", "Z"], - [" +3:45", " -3:30", "+11", "-11", " +2:34", "-12:35", " +0"], - [" +3:45", " -3:30", "+11", "-11", " +2:34", "-12:35", "Z"], - ["+3:45", "-3:30", "+11", "-11", "+2:34", "-12:35", "+0"], - ["+3:45", "-3:30", "+11", "-11", "+2:34", "-12:35", "Z"], - ["+0345", "-0330", "+11", "-11", "+0234", "-1235", "+00"], - ["+0345", "-0330", "+11", "-11", "+0234", "-1235", "Z"], - [" +345", " -330", "+11", "-11", " +234", "-1235", " +0"], - [" +345", " -330", "+11", "-11", " +234", "-1235", "Z"], - ["+345", "-330", "+11", "-11", "+234", "-1235", "+0"], - ["+345", "-330", "+11", "-11", "+234", "-1235", "Z"], - ], - ); - check_all( - OffsetPrecision::OptionalSeconds, - [ - ["+03:45", "-03:30", "+11:00", "-11:00:22", "+02:34:26", "-12:34:30", "+00:00"], - ["+03:45", "-03:30", "+11:00", "-11:00:22", "+02:34:26", "-12:34:30", "Z"], - [" +3:45", " -3:30", "+11:00", "-11:00:22", " +2:34:26", "-12:34:30", " +0:00"], - [" +3:45", " -3:30", "+11:00", "-11:00:22", " +2:34:26", "-12:34:30", "Z"], - ["+3:45", "-3:30", "+11:00", "-11:00:22", "+2:34:26", "-12:34:30", "+0:00"], - ["+3:45", "-3:30", "+11:00", "-11:00:22", "+2:34:26", "-12:34:30", "Z"], - ["+0345", "-0330", "+1100", "-110022", "+023426", "-123430", "+0000"], - ["+0345", "-0330", "+1100", "-110022", "+023426", "-123430", "Z"], - [" +345", " -330", "+1100", "-110022", " +23426", "-123430", " +000"], - [" +345", " -330", "+1100", "-110022", " +23426", "-123430", "Z"], - ["+345", "-330", "+1100", "-110022", "+23426", "-123430", "+000"], - ["+345", "-330", "+1100", "-110022", "+23426", "-123430", "Z"], - ], - ); - check_all( - OffsetPrecision::OptionalMinutesAndSeconds, - [ - ["+03:45", "-03:30", "+11", "-11:00:22", "+02:34:26", "-12:34:30", "+00"], - ["+03:45", "-03:30", "+11", "-11:00:22", "+02:34:26", "-12:34:30", "Z"], - [" +3:45", " -3:30", "+11", "-11:00:22", " +2:34:26", "-12:34:30", " +0"], - [" +3:45", " -3:30", "+11", "-11:00:22", " +2:34:26", "-12:34:30", "Z"], - ["+3:45", "-3:30", "+11", "-11:00:22", "+2:34:26", "-12:34:30", "+0"], - ["+3:45", "-3:30", "+11", "-11:00:22", "+2:34:26", "-12:34:30", "Z"], - ["+0345", "-0330", "+11", "-110022", "+023426", "-123430", "+00"], - ["+0345", "-0330", "+11", "-110022", "+023426", "-123430", "Z"], - [" +345", " -330", "+11", "-110022", " +23426", "-123430", " +0"], - [" +345", " -330", "+11", "-110022", " +23426", "-123430", "Z"], - ["+345", "-330", "+11", "-110022", "+23426", "-123430", "+0"], - ["+345", "-330", "+11", "-110022", "+23426", "-123430", "Z"], - ], - ); - } -} diff -Nru temporalio-1.3.0/vendor/chrono/src/format/locales.rs temporalio-1.3.0/vendor/chrono/src/format/locales.rs --- temporalio-1.3.0/vendor/chrono/src/format/locales.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/chrono/src/format/locales.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,103 +1,33 @@ -#[cfg(feature = "unstable-locales")] -mod localized { - use pure_rust_locales::{locale_match, Locale}; - - pub(crate) const fn default_locale() -> Locale { - Locale::POSIX - } - - pub(crate) const fn short_months(locale: Locale) -> &'static [&'static str] { - locale_match!(locale => LC_TIME::ABMON) - } - - pub(crate) const fn long_months(locale: Locale) -> &'static [&'static str] { - locale_match!(locale => LC_TIME::MON) - } - - pub(crate) const fn short_weekdays(locale: Locale) -> &'static [&'static str] { - locale_match!(locale => LC_TIME::ABDAY) - } - - pub(crate) const fn long_weekdays(locale: Locale) -> &'static [&'static str] { - locale_match!(locale => LC_TIME::DAY) - } - - pub(crate) const fn am_pm(locale: Locale) -> &'static [&'static str] { - locale_match!(locale => LC_TIME::AM_PM) - } - - pub(crate) const fn decimal_point(locale: Locale) -> &'static str { - locale_match!(locale => LC_NUMERIC::DECIMAL_POINT) - } - - pub(crate) const fn d_fmt(locale: Locale) -> &'static str { - locale_match!(locale => LC_TIME::D_FMT) - } - - pub(crate) const fn d_t_fmt(locale: Locale) -> &'static str { - locale_match!(locale => LC_TIME::D_T_FMT) - } - - pub(crate) const fn t_fmt(locale: Locale) -> &'static str { - locale_match!(locale => LC_TIME::T_FMT) - } - - pub(crate) const fn t_fmt_ampm(locale: Locale) -> &'static str { - locale_match!(locale => LC_TIME::T_FMT_AMPM) - } -} - -#[cfg(feature = "unstable-locales")] -pub(crate) use localized::*; -#[cfg(feature = "unstable-locales")] -pub use pure_rust_locales::Locale; - -#[cfg(not(feature = "unstable-locales"))] -mod unlocalized { - #[derive(Copy, Clone, Debug)] - pub(crate) struct Locale; - - pub(crate) const fn default_locale() -> Locale { - Locale - } - - pub(crate) const fn short_months(_locale: Locale) -> &'static [&'static str] { - &["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] - } - - pub(crate) const fn long_months(_locale: Locale) -> &'static [&'static str] { - &[ - "January", - "February", - "March", - "April", - "May", - "June", - "July", - "August", - "September", - "October", - "November", - "December", - ] - } - - pub(crate) const fn short_weekdays(_locale: Locale) -> &'static [&'static str] { - &["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"] - } - - pub(crate) const fn long_weekdays(_locale: Locale) -> &'static [&'static str] { - &["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"] - } - - pub(crate) const fn am_pm(_locale: Locale) -> &'static [&'static str] { - &["AM", "PM"] - } - - pub(crate) const fn decimal_point(_locale: Locale) -> &'static str { - "." - } +use pure_rust_locales::{locale_match, Locale}; + +pub(crate) const fn short_months(locale: Locale) -> &'static [&'static str] { + locale_match!(locale => LC_TIME::ABMON) +} + +pub(crate) const fn long_months(locale: Locale) -> &'static [&'static str] { + locale_match!(locale => LC_TIME::MON) +} + +pub(crate) const fn short_weekdays(locale: Locale) -> &'static [&'static str] { + locale_match!(locale => LC_TIME::ABDAY) +} + +pub(crate) const fn long_weekdays(locale: Locale) -> &'static [&'static str] { + locale_match!(locale => LC_TIME::DAY) } -#[cfg(not(feature = "unstable-locales"))] -pub(crate) use unlocalized::*; +pub(crate) const fn am_pm(locale: Locale) -> &'static [&'static str] { + locale_match!(locale => LC_TIME::AM_PM) +} + +pub(crate) const fn d_fmt(locale: Locale) -> &'static str { + locale_match!(locale => LC_TIME::D_FMT) +} + +pub(crate) const fn d_t_fmt(locale: Locale) -> &'static str { + locale_match!(locale => LC_TIME::D_T_FMT) +} + +pub(crate) const fn t_fmt(locale: Locale) -> &'static str { + locale_match!(locale => LC_TIME::T_FMT) +} diff -Nru temporalio-1.3.0/vendor/chrono/src/format/mod.rs temporalio-1.3.0/vendor/chrono/src/format/mod.rs --- temporalio-1.3.0/vendor/chrono/src/format/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/chrono/src/format/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -18,62 +18,56 @@ //! # Example #![cfg_attr(not(feature = "std"), doc = "```ignore")] #![cfg_attr(feature = "std", doc = "```rust")] -//! use chrono::{NaiveDateTime, TimeZone, Utc}; +//! use chrono::{TimeZone, Utc}; //! //! let date_time = Utc.with_ymd_and_hms(2020, 11, 10, 0, 1, 32).unwrap(); //! //! let formatted = format!("{}", date_time.format("%Y-%m-%d %H:%M:%S")); //! assert_eq!(formatted, "2020-11-10 00:01:32"); //! -//! let parsed = NaiveDateTime::parse_from_str(&formatted, "%Y-%m-%d %H:%M:%S")?.and_utc(); +//! let parsed = Utc.datetime_from_str(&formatted, "%Y-%m-%d %H:%M:%S")?; //! assert_eq!(parsed, date_time); //! # Ok::<(), chrono::ParseError>(()) //! ``` #[cfg(feature = "alloc")] +extern crate alloc; + +#[cfg(feature = "alloc")] use alloc::boxed::Box; +#[cfg(feature = "alloc")] +use alloc::string::{String, ToString}; +#[cfg(any(feature = "alloc", feature = "std", test))] +use core::borrow::Borrow; use core::fmt; +use core::fmt::Write; use core::str::FromStr; -#[cfg(feature = "std")] +#[cfg(any(feature = "std", test))] use std::error::Error; +#[cfg(any(feature = "alloc", feature = "std", test))] +use crate::naive::{NaiveDate, NaiveTime}; +#[cfg(any(feature = "alloc", feature = "std", test))] +use crate::offset::{FixedOffset, Offset}; +#[cfg(any(feature = "alloc", feature = "std", test))] +use crate::{Datelike, Timelike}; use crate::{Month, ParseMonthError, ParseWeekdayError, Weekday}; -mod formatting; -mod parsed; - -// due to the size of parsing routines, they are in separate modules. -mod parse; -pub(crate) mod scan; - -pub mod strftime; - -#[cfg(any(feature = "alloc", feature = "std"))] +#[cfg(feature = "unstable-locales")] pub(crate) mod locales; -pub(crate) use formatting::write_hundreds; -#[cfg(any(feature = "alloc", feature = "std"))] -pub(crate) use formatting::write_rfc2822; -#[cfg(any( - feature = "alloc", - feature = "std", - feature = "serde", - feature = "rustc-serialize" -))] -pub(crate) use formatting::write_rfc3339; -#[cfg(any(feature = "alloc", feature = "std"))] -pub use formatting::{format, format_item, DelayedFormat}; -#[cfg(feature = "unstable-locales")] -pub use formatting::{format_item_localized, format_localized}; -#[cfg(all(feature = "unstable-locales", any(feature = "alloc", feature = "std")))] -pub use locales::Locale; -#[cfg(all(not(feature = "unstable-locales"), any(feature = "alloc", feature = "std")))] -pub(crate) use locales::Locale; -pub(crate) use parse::parse_rfc3339; pub use parse::{parse, parse_and_remainder}; pub use parsed::Parsed; +/// L10n locales. +#[cfg(feature = "unstable-locales")] +pub use pure_rust_locales::Locale; pub use strftime::StrftimeItems; +#[cfg(not(feature = "unstable-locales"))] +#[allow(dead_code)] +#[derive(Debug)] +struct Locale; + /// An uninhabited type used for `InternalNumeric` and `InternalFixed` below. #[derive(Clone, PartialEq, Eq, Hash)] enum Void {} @@ -281,49 +275,13 @@ Nanosecond9NoDot, } -/// Type for specifying the format of UTC offsets. -#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] -pub struct OffsetFormat { - /// See `OffsetPrecision`. - pub precision: OffsetPrecision, - /// Separator between hours, minutes and seconds. - pub colons: Colons, - /// Represent `+00:00` as `Z`. - pub allow_zulu: bool, - /// Pad the hour value to two digits. - pub padding: Pad, -} - -/// The precision of an offset from UTC formatting item. -#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] -pub enum OffsetPrecision { - /// Format offset from UTC as only hours. Not recommended, it is not uncommon for timezones to - /// have an offset of 30 minutes, 15 minutes, etc. - /// Any minutes and seconds get truncated. - Hours, - /// Format offset from UTC as hours and minutes. - /// Any seconds will be rounded to the nearest minute. - Minutes, - /// Format offset from UTC as hours, minutes and seconds. - Seconds, - /// Format offset from UTC as hours, and optionally with minutes. - /// Any seconds will be rounded to the nearest minute. - OptionalMinutes, - /// Format offset from UTC as hours and minutes, and optionally seconds. - OptionalSeconds, - /// Format offset from UTC as hours and optionally minutes and seconds. - OptionalMinutesAndSeconds, -} - -/// The separator between hours and minutes in an offset. -#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] -pub enum Colons { - /// No separator +#[cfg(any(feature = "alloc", feature = "std", test))] +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +enum Colons { None, - /// Colon (`:`) as separator - Colon, - /// No separator when formatting, colon allowed when parsing. - Maybe, + Single, + Double, + Triple, } /// A single formatting item. This is used for both formatting and parsing. @@ -332,13 +290,13 @@ /// A literally printed and parsed text. Literal(&'a str), /// Same as `Literal` but with the string owned by the item. - #[cfg(any(feature = "alloc", feature = "std"))] + #[cfg(any(feature = "alloc", feature = "std", test))] #[cfg_attr(docsrs, doc(cfg(any(feature = "alloc", feature = "std"))))] OwnedLiteral(Box), /// Whitespace. Prints literally but reads zero or more whitespace. Space(&'a str), /// Same as `Space` but with the string owned by the item. - #[cfg(any(feature = "alloc", feature = "std"))] + #[cfg(any(feature = "alloc", feature = "std", test))] #[cfg_attr(docsrs, doc(cfg(any(feature = "alloc", feature = "std"))))] OwnedSpace(Box), /// Numeric item. Can be optionally padded to the maximal length (if any) when formatting; @@ -350,24 +308,40 @@ Error, } -const fn num(numeric: Numeric) -> Item<'static> { - Item::Numeric(numeric, Pad::None) -} - -const fn num0(numeric: Numeric) -> Item<'static> { - Item::Numeric(numeric, Pad::Zero) -} - -const fn nums(numeric: Numeric) -> Item<'static> { - Item::Numeric(numeric, Pad::Space) -} - -const fn fixed(fixed: Fixed) -> Item<'static> { - Item::Fixed(fixed) -} - -const fn internal_fixed(val: InternalInternal) -> Item<'static> { - Item::Fixed(Fixed::Internal(InternalFixed { val })) +macro_rules! lit { + ($x:expr) => { + Item::Literal($x) + }; +} +macro_rules! sp { + ($x:expr) => { + Item::Space($x) + }; +} +macro_rules! num { + ($x:ident) => { + Item::Numeric(Numeric::$x, Pad::None) + }; +} +macro_rules! num0 { + ($x:ident) => { + Item::Numeric(Numeric::$x, Pad::Zero) + }; +} +macro_rules! nums { + ($x:ident) => { + Item::Numeric(Numeric::$x, Pad::Space) + }; +} +macro_rules! fix { + ($x:ident) => { + Item::Fixed(Fixed::$x) + }; +} +macro_rules! internal_fix { + ($x:ident) => { + Item::Fixed(Fixed::Internal(InternalFixed { val: InternalInternal::$x })) + }; } /// An error from the `parse` function. @@ -436,7 +410,7 @@ } } -#[cfg(feature = "std")] +#[cfg(any(feature = "std", test))] #[cfg_attr(docsrs, doc(cfg(feature = "std")))] impl Error for ParseError { #[allow(deprecated)] @@ -446,17 +420,542 @@ } // to be used in this module and submodules -pub(crate) const OUT_OF_RANGE: ParseError = ParseError(ParseErrorKind::OutOfRange); +const OUT_OF_RANGE: ParseError = ParseError(ParseErrorKind::OutOfRange); const IMPOSSIBLE: ParseError = ParseError(ParseErrorKind::Impossible); const NOT_ENOUGH: ParseError = ParseError(ParseErrorKind::NotEnough); const INVALID: ParseError = ParseError(ParseErrorKind::Invalid); const TOO_SHORT: ParseError = ParseError(ParseErrorKind::TooShort); -pub(crate) const TOO_LONG: ParseError = ParseError(ParseErrorKind::TooLong); +const TOO_LONG: ParseError = ParseError(ParseErrorKind::TooLong); const BAD_FORMAT: ParseError = ParseError(ParseErrorKind::BadFormat); +#[cfg(any(feature = "alloc", feature = "std", test))] +struct Locales { + short_months: &'static [&'static str], + long_months: &'static [&'static str], + short_weekdays: &'static [&'static str], + long_weekdays: &'static [&'static str], + am_pm: &'static [&'static str], +} + +#[cfg(any(feature = "alloc", feature = "std", test))] +impl Locales { + fn new(_locale: Option) -> Self { + #[cfg(feature = "unstable-locales")] + { + let locale = _locale.unwrap_or(Locale::POSIX); + Self { + short_months: locales::short_months(locale), + long_months: locales::long_months(locale), + short_weekdays: locales::short_weekdays(locale), + long_weekdays: locales::long_weekdays(locale), + am_pm: locales::am_pm(locale), + } + } + #[cfg(not(feature = "unstable-locales"))] + Self { + short_months: &[ + "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", + ], + long_months: &[ + "January", + "February", + "March", + "April", + "May", + "June", + "July", + "August", + "September", + "October", + "November", + "December", + ], + short_weekdays: &["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], + long_weekdays: &[ + "Sunday", + "Monday", + "Tuesday", + "Wednesday", + "Thursday", + "Friday", + "Saturday", + ], + am_pm: &["AM", "PM"], + } + } +} + +/// Formats single formatting item +#[cfg(any(feature = "alloc", feature = "std", test))] +#[cfg_attr(docsrs, doc(cfg(any(feature = "alloc", feature = "std"))))] +pub fn format_item( + w: &mut fmt::Formatter, + date: Option<&NaiveDate>, + time: Option<&NaiveTime>, + off: Option<&(String, FixedOffset)>, + item: &Item<'_>, +) -> fmt::Result { + let mut result = String::new(); + format_inner(&mut result, date, time, off, item, None)?; + w.pad(&result) +} + +#[cfg(any(feature = "alloc", feature = "std", test))] +fn format_inner( + result: &mut String, + date: Option<&NaiveDate>, + time: Option<&NaiveTime>, + off: Option<&(String, FixedOffset)>, + item: &Item<'_>, + locale: Option, +) -> fmt::Result { + let locale = Locales::new(locale); + + match *item { + Item::Literal(s) | Item::Space(s) => result.push_str(s), + #[cfg(any(feature = "alloc", feature = "std", test))] + Item::OwnedLiteral(ref s) | Item::OwnedSpace(ref s) => result.push_str(s), + + Item::Numeric(ref spec, ref pad) => { + use self::Numeric::*; + + let week_from_sun = |d: &NaiveDate| d.weeks_from(Weekday::Sun); + let week_from_mon = |d: &NaiveDate| d.weeks_from(Weekday::Mon); + + let (width, v) = match *spec { + Year => (4, date.map(|d| i64::from(d.year()))), + YearDiv100 => (2, date.map(|d| i64::from(d.year()).div_euclid(100))), + YearMod100 => (2, date.map(|d| i64::from(d.year()).rem_euclid(100))), + IsoYear => (4, date.map(|d| i64::from(d.iso_week().year()))), + IsoYearDiv100 => (2, date.map(|d| i64::from(d.iso_week().year()).div_euclid(100))), + IsoYearMod100 => (2, date.map(|d| i64::from(d.iso_week().year()).rem_euclid(100))), + Month => (2, date.map(|d| i64::from(d.month()))), + Day => (2, date.map(|d| i64::from(d.day()))), + WeekFromSun => (2, date.map(|d| i64::from(week_from_sun(d)))), + WeekFromMon => (2, date.map(|d| i64::from(week_from_mon(d)))), + IsoWeek => (2, date.map(|d| i64::from(d.iso_week().week()))), + NumDaysFromSun => (1, date.map(|d| i64::from(d.weekday().num_days_from_sunday()))), + WeekdayFromMon => (1, date.map(|d| i64::from(d.weekday().number_from_monday()))), + Ordinal => (3, date.map(|d| i64::from(d.ordinal()))), + Hour => (2, time.map(|t| i64::from(t.hour()))), + Hour12 => (2, time.map(|t| i64::from(t.hour12().1))), + Minute => (2, time.map(|t| i64::from(t.minute()))), + Second => (2, time.map(|t| i64::from(t.second() + t.nanosecond() / 1_000_000_000))), + Nanosecond => (9, time.map(|t| i64::from(t.nanosecond() % 1_000_000_000))), + Timestamp => ( + 1, + match (date, time, off) { + (Some(d), Some(t), None) => Some(d.and_time(*t).timestamp()), + (Some(d), Some(t), Some(&(_, off))) => { + Some((d.and_time(*t) - off).timestamp()) + } + (_, _, _) => None, + }, + ), + + // for the future expansion + Internal(ref int) => match int._dummy {}, + }; + + if let Some(v) = v { + if (spec == &Year || spec == &IsoYear) && !(0..10_000).contains(&v) { + // non-four-digit years require an explicit sign as per ISO 8601 + match *pad { + Pad::None => write!(result, "{:+}", v), + Pad::Zero => write!(result, "{:+01$}", v, width + 1), + Pad::Space => write!(result, "{:+1$}", v, width + 1), + } + } else { + match *pad { + Pad::None => write!(result, "{}", v), + Pad::Zero => write!(result, "{:01$}", v, width), + Pad::Space => write!(result, "{:1$}", v, width), + } + }? + } else { + return Err(fmt::Error); // insufficient arguments for given format + } + } + + Item::Fixed(ref spec) => { + use self::Fixed::*; + + let ret = + match *spec { + ShortMonthName => date.map(|d| { + result.push_str(locale.short_months[d.month0() as usize]); + Ok(()) + }), + LongMonthName => date.map(|d| { + result.push_str(locale.long_months[d.month0() as usize]); + Ok(()) + }), + ShortWeekdayName => date.map(|d| { + result.push_str( + locale.short_weekdays[d.weekday().num_days_from_sunday() as usize], + ); + Ok(()) + }), + LongWeekdayName => date.map(|d| { + result.push_str( + locale.long_weekdays[d.weekday().num_days_from_sunday() as usize], + ); + Ok(()) + }), + LowerAmPm => time.map(|t| { + let ampm = if t.hour12().0 { locale.am_pm[1] } else { locale.am_pm[0] }; + for char in ampm.chars() { + result.extend(char.to_lowercase()) + } + Ok(()) + }), + UpperAmPm => time.map(|t| { + result.push_str(if t.hour12().0 { + locale.am_pm[1] + } else { + locale.am_pm[0] + }); + Ok(()) + }), + Nanosecond => time.map(|t| { + let nano = t.nanosecond() % 1_000_000_000; + if nano == 0 { + Ok(()) + } else if nano % 1_000_000 == 0 { + write!(result, ".{:03}", nano / 1_000_000) + } else if nano % 1_000 == 0 { + write!(result, ".{:06}", nano / 1_000) + } else { + write!(result, ".{:09}", nano) + } + }), + Nanosecond3 => time.map(|t| { + let nano = t.nanosecond() % 1_000_000_000; + write!(result, ".{:03}", nano / 1_000_000) + }), + Nanosecond6 => time.map(|t| { + let nano = t.nanosecond() % 1_000_000_000; + write!(result, ".{:06}", nano / 1_000) + }), + Nanosecond9 => time.map(|t| { + let nano = t.nanosecond() % 1_000_000_000; + write!(result, ".{:09}", nano) + }), + Internal(InternalFixed { val: InternalInternal::Nanosecond3NoDot }) => time + .map(|t| { + let nano = t.nanosecond() % 1_000_000_000; + write!(result, "{:03}", nano / 1_000_000) + }), + Internal(InternalFixed { val: InternalInternal::Nanosecond6NoDot }) => time + .map(|t| { + let nano = t.nanosecond() % 1_000_000_000; + write!(result, "{:06}", nano / 1_000) + }), + Internal(InternalFixed { val: InternalInternal::Nanosecond9NoDot }) => time + .map(|t| { + let nano = t.nanosecond() % 1_000_000_000; + write!(result, "{:09}", nano) + }), + TimezoneName => off.map(|(name, _)| { + result.push_str(name); + Ok(()) + }), + TimezoneOffsetColon => off + .map(|&(_, off)| write_local_minus_utc(result, off, false, Colons::Single)), + TimezoneOffsetDoubleColon => off + .map(|&(_, off)| write_local_minus_utc(result, off, false, Colons::Double)), + TimezoneOffsetTripleColon => off + .map(|&(_, off)| write_local_minus_utc(result, off, false, Colons::Triple)), + TimezoneOffsetColonZ => off + .map(|&(_, off)| write_local_minus_utc(result, off, true, Colons::Single)), + TimezoneOffset => { + off.map(|&(_, off)| write_local_minus_utc(result, off, false, Colons::None)) + } + TimezoneOffsetZ => { + off.map(|&(_, off)| write_local_minus_utc(result, off, true, Colons::None)) + } + Internal(InternalFixed { val: InternalInternal::TimezoneOffsetPermissive }) => { + panic!("Do not try to write %#z it is undefined") + } + RFC2822 => + // same as `%a, %d %b %Y %H:%M:%S %z` + { + if let (Some(d), Some(t), Some(&(_, off))) = (date, time, off) { + Some(write_rfc2822_inner(result, d, t, off, locale)) + } else { + None + } + } + RFC3339 => + // same as `%Y-%m-%dT%H:%M:%S%.f%:z` + { + if let (Some(d), Some(t), Some(&(_, off))) = (date, time, off) { + Some(write_rfc3339(result, crate::NaiveDateTime::new(*d, *t), off)) + } else { + None + } + } + }; + + match ret { + Some(ret) => ret?, + None => return Err(fmt::Error), // insufficient arguments for given format + } + } + + Item::Error => return Err(fmt::Error), + } + Ok(()) +} + +/// Prints an offset from UTC in the format of `+HHMM` or `+HH:MM`. +/// `Z` instead of `+00[:]00` is allowed when `allow_zulu` is true. +#[cfg(any(feature = "alloc", feature = "std", test))] +fn write_local_minus_utc( + result: &mut String, + off: FixedOffset, + allow_zulu: bool, + colon_type: Colons, +) -> fmt::Result { + let off = off.local_minus_utc(); + if allow_zulu && off == 0 { + result.push('Z'); + return Ok(()); + } + let (sign, off) = if off < 0 { ('-', -off) } else { ('+', off) }; + result.push(sign); + + write_hundreds(result, (off / 3600) as u8)?; + + match colon_type { + Colons::None => write_hundreds(result, (off / 60 % 60) as u8), + Colons::Single => { + result.push(':'); + write_hundreds(result, (off / 60 % 60) as u8) + } + Colons::Double => { + result.push(':'); + write_hundreds(result, (off / 60 % 60) as u8)?; + result.push(':'); + write_hundreds(result, (off % 60) as u8) + } + Colons::Triple => Ok(()), + } +} + +/// Writes the date, time and offset to the string. same as `%Y-%m-%dT%H:%M:%S%.f%:z` +#[cfg(any(feature = "alloc", feature = "std", test))] +pub(crate) fn write_rfc3339( + result: &mut String, + dt: crate::NaiveDateTime, + off: FixedOffset, +) -> fmt::Result { + // reuse `Debug` impls which already print ISO 8601 format. + // this is faster in this way. + write!(result, "{:?}", dt)?; + write_local_minus_utc(result, off, false, Colons::Single) +} + +#[cfg(any(feature = "alloc", feature = "std", test))] +/// write datetimes like `Tue, 1 Jul 2003 10:52:37 +0200`, same as `%a, %d %b %Y %H:%M:%S %z` +pub(crate) fn write_rfc2822( + result: &mut String, + dt: crate::NaiveDateTime, + off: FixedOffset, +) -> fmt::Result { + write_rfc2822_inner(result, &dt.date(), &dt.time(), off, Locales::new(None)) +} + +#[cfg(any(feature = "alloc", feature = "std", test))] +/// write datetimes like `Tue, 1 Jul 2003 10:52:37 +0200`, same as `%a, %d %b %Y %H:%M:%S %z` +fn write_rfc2822_inner( + result: &mut String, + d: &NaiveDate, + t: &NaiveTime, + off: FixedOffset, + locale: Locales, +) -> fmt::Result { + let year = d.year(); + // RFC2822 is only defined on years 0 through 9999 + if !(0..=9999).contains(&year) { + return Err(fmt::Error); + } + + result.push_str(locale.short_weekdays[d.weekday().num_days_from_sunday() as usize]); + result.push_str(", "); + write_hundreds(result, d.day() as u8)?; + result.push(' '); + result.push_str(locale.short_months[d.month0() as usize]); + result.push(' '); + write_hundreds(result, (year / 100) as u8)?; + write_hundreds(result, (year % 100) as u8)?; + result.push(' '); + write_hundreds(result, t.hour() as u8)?; + result.push(':'); + write_hundreds(result, t.minute() as u8)?; + result.push(':'); + let sec = t.second() + t.nanosecond() / 1_000_000_000; + write_hundreds(result, sec as u8)?; + result.push(' '); + write_local_minus_utc(result, off, false, Colons::None) +} + +/// Equivalent to `{:02}` formatting for n < 100. +pub(crate) fn write_hundreds(w: &mut impl Write, n: u8) -> fmt::Result { + if n >= 100 { + return Err(fmt::Error); + } + + let tens = b'0' + n / 10; + let ones = b'0' + n % 10; + w.write_char(tens as char)?; + w.write_char(ones as char) +} + +/// Tries to format given arguments with given formatting items. +/// Internally used by `DelayedFormat`. +#[cfg(any(feature = "alloc", feature = "std", test))] +#[cfg_attr(docsrs, doc(cfg(any(feature = "alloc", feature = "std"))))] +pub fn format<'a, I, B>( + w: &mut fmt::Formatter, + date: Option<&NaiveDate>, + time: Option<&NaiveTime>, + off: Option<&(String, FixedOffset)>, + items: I, +) -> fmt::Result +where + I: Iterator + Clone, + B: Borrow>, +{ + let mut result = String::new(); + for item in items { + format_inner(&mut result, date, time, off, item.borrow(), None)?; + } + w.pad(&result) +} + +mod parsed; + +// due to the size of parsing routines, they are in separate modules. +mod parse; +mod scan; + +pub mod strftime; + +/// A *temporary* object which can be used as an argument to `format!` or others. +/// This is normally constructed via `format` methods of each date and time type. +#[cfg(any(feature = "alloc", feature = "std", test))] +#[cfg_attr(docsrs, doc(cfg(any(feature = "alloc", feature = "std"))))] +#[derive(Debug)] +pub struct DelayedFormat { + /// The date view, if any. + date: Option, + /// The time view, if any. + time: Option, + /// The name and local-to-UTC difference for the offset (timezone), if any. + off: Option<(String, FixedOffset)>, + /// An iterator returning formatting items. + items: I, + /// Locale used for text. + // TODO: Only used with the locale feature. We should make this property + // only present when the feature is enabled. + #[cfg(feature = "unstable-locales")] + locale: Option, +} + +#[cfg(any(feature = "alloc", feature = "std", test))] +impl<'a, I: Iterator + Clone, B: Borrow>> DelayedFormat { + /// Makes a new `DelayedFormat` value out of local date and time. + #[must_use] + pub fn new(date: Option, time: Option, items: I) -> DelayedFormat { + DelayedFormat { + date, + time, + off: None, + items, + #[cfg(feature = "unstable-locales")] + locale: None, + } + } + + /// Makes a new `DelayedFormat` value out of local date and time and UTC offset. + #[must_use] + pub fn new_with_offset( + date: Option, + time: Option, + offset: &Off, + items: I, + ) -> DelayedFormat + where + Off: Offset + fmt::Display, + { + let name_and_diff = (offset.to_string(), offset.fix()); + DelayedFormat { + date, + time, + off: Some(name_and_diff), + items, + #[cfg(feature = "unstable-locales")] + locale: None, + } + } + + /// Makes a new `DelayedFormat` value out of local date and time and locale. + #[cfg(feature = "unstable-locales")] + #[cfg_attr(docsrs, doc(cfg(feature = "unstable-locales")))] + #[must_use] + pub fn new_with_locale( + date: Option, + time: Option, + items: I, + locale: Locale, + ) -> DelayedFormat { + DelayedFormat { date, time, off: None, items, locale: Some(locale) } + } + + /// Makes a new `DelayedFormat` value out of local date and time, UTC offset and locale. + #[cfg(feature = "unstable-locales")] + #[cfg_attr(docsrs, doc(cfg(feature = "unstable-locales")))] + #[must_use] + pub fn new_with_offset_and_locale( + date: Option, + time: Option, + offset: &Off, + items: I, + locale: Locale, + ) -> DelayedFormat + where + Off: Offset + fmt::Display, + { + let name_and_diff = (offset.to_string(), offset.fix()); + DelayedFormat { date, time, off: Some(name_and_diff), items, locale: Some(locale) } + } +} + +#[cfg(any(feature = "alloc", feature = "std", test))] +impl<'a, I: Iterator + Clone, B: Borrow>> fmt::Display for DelayedFormat { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + #[cfg(feature = "unstable-locales")] + { + if let Some(locale) = self.locale { + return format_localized( + f, + self.date.as_ref(), + self.time.as_ref(), + self.off.as_ref(), + self.items.clone(), + locale, + ); + } + } + + format(f, self.date.as_ref(), self.time.as_ref(), self.off.as_ref(), self.items.clone()) + } +} + // this implementation is here only because we need some private code from `scan` -/// Parsing a `str` into a `Weekday` uses the format [`%A`](./format/strftime/index.html). +/// Parsing a `str` into a `Weekday` uses the format [`%W`](./format/strftime/index.html). /// /// # Example /// @@ -492,7 +991,46 @@ } } -/// Parsing a `str` into a `Month` uses the format [`%B`](./format/strftime/index.html). +/// Formats single formatting item +#[cfg(feature = "unstable-locales")] +#[cfg_attr(docsrs, doc(cfg(feature = "unstable-locales")))] +pub fn format_item_localized<'a>( + w: &mut fmt::Formatter, + date: Option<&NaiveDate>, + time: Option<&NaiveTime>, + off: Option<&(String, FixedOffset)>, + item: &Item<'a>, + locale: Locale, +) -> fmt::Result { + let mut result = String::new(); + format_inner(&mut result, date, time, off, item, Some(locale))?; + w.pad(&result) +} + +/// Tries to format given arguments with given formatting items. +/// Internally used by `DelayedFormat`. +#[cfg(feature = "unstable-locales")] +#[cfg_attr(docsrs, doc(cfg(feature = "unstable-locales")))] +pub fn format_localized<'a, I, B>( + w: &mut fmt::Formatter, + date: Option<&NaiveDate>, + time: Option<&NaiveTime>, + off: Option<&(String, FixedOffset)>, + items: I, + locale: Locale, +) -> fmt::Result +where + I: Iterator + Clone, + B: Borrow>, +{ + let mut result = String::new(); + for item in items { + format_inner(&mut result, date, time, off, item.borrow(), Some(locale))?; + } + w.pad(&result) +} + +/// Parsing a `str` into a `Month` uses the format [`%W`](./format/strftime/index.html). /// /// # Example /// diff -Nru temporalio-1.3.0/vendor/chrono/src/format/parsed.rs temporalio-1.3.0/vendor/chrono/src/format/parsed.rs --- temporalio-1.3.0/vendor/chrono/src/format/parsed.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/chrono/src/format/parsed.rs 2023-10-30 19:40:00.000000000 +0000 @@ -5,10 +5,12 @@ //! They can be constructed incrementally while being checked for consistency. use super::{ParseResult, IMPOSSIBLE, NOT_ENOUGH, OUT_OF_RANGE}; -use crate::duration::Duration as OldDuration; use crate::naive::{NaiveDate, NaiveDateTime, NaiveTime}; use crate::offset::{FixedOffset, LocalResult, Offset, TimeZone}; -use crate::{DateTime, Datelike, Timelike, Weekday}; +use crate::oldtime::Duration as OldDuration; +use crate::DateTime; +use crate::Weekday; +use crate::{Datelike, Timelike}; /// Parsed parts of date and time. There are two classes of methods: /// @@ -625,12 +627,7 @@ /// plus a time zone offset. /// Either way those fields have to be consistent to each other. pub fn to_datetime(&self) -> ParseResult> { - // If there is no explicit offset, consider a timestamp value as indication of a UTC value. - let offset = match (self.offset, self.timestamp) { - (Some(off), _) => off, - (None, Some(_)) => 0, // UNIX timestamp may assume 0 offset - (None, None) => return Err(NOT_ENOUGH), - }; + let offset = self.offset.ok_or(NOT_ENOUGH)?; let datetime = self.to_naive_datetime_with_offset(offset)?; let offset = FixedOffset::east_opt(offset).ok_or(OUT_OF_RANGE)?; diff -Nru temporalio-1.3.0/vendor/chrono/src/format/parse.rs temporalio-1.3.0/vendor/chrono/src/format/parse.rs --- temporalio-1.3.0/vendor/chrono/src/format/parse.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/chrono/src/format/parse.rs 2023-10-30 19:40:00.000000000 +0000 @@ -4,6 +4,8 @@ //! Date and time parsing routines. +#![allow(deprecated)] + use core::borrow::Borrow; use core::str; use core::usize; @@ -98,7 +100,7 @@ // since we do not directly go to a `DateTime` so one can recover // the offset information from `Parsed` anyway. - s = s.trim_start(); + s = s.trim_left(); if let Ok((s_, weekday)) = scan::short_weekday(s) { if !s_.starts_with(',') { @@ -108,7 +110,7 @@ parsed.set_weekday(weekday)?; } - s = s.trim_start(); + s = s.trim_left(); parsed.set_day(try_consume!(scan::number(s, 1, 2)))?; s = scan::space(s)?; // mandatory parsed.set_month(1 + i64::from(try_consume!(scan::short_month0(s))))?; @@ -134,9 +136,9 @@ s = scan::space(s)?; // mandatory parsed.set_hour(try_consume!(scan::number(s, 2, 2)))?; - s = scan::char(s.trim_start(), b':')?.trim_start(); // *S ":" *S + s = scan::char(s.trim_left(), b':')?.trim_left(); // *S ":" *S parsed.set_minute(try_consume!(scan::number(s, 2, 2)))?; - if let Ok(s_) = scan::char(s.trim_start(), b':') { + if let Ok(s_) = scan::char(s.trim_left(), b':') { // [ ":" *S 2DIGIT ] parsed.set_second(try_consume!(scan::number(s_, 2, 2)))?; } @@ -155,7 +157,7 @@ Ok((s, ())) } -pub(crate) fn parse_rfc3339<'a>(parsed: &mut Parsed, mut s: &'a str) -> ParseResult<(&'a str, ())> { +fn parse_rfc3339<'a>(parsed: &mut Parsed, mut s: &'a str) -> ParseResult<(&'a str, ())> { macro_rules! try_consume { ($e:expr) => {{ let (s_, v) = $e?; @@ -190,8 +192,6 @@ // - unlike RFC 2822, the valid offset ranges from -23:59 to +23:59. // note that this restriction is unique to RFC 3339 and not ISO 8601. // since this is not a typical Chrono behavior, we check it earlier. - // - // - For readability a full-date and a full-time may be separated by a space character. parsed.set_year(try_consume!(scan::number(s, 4, 4)))?; s = scan::char(s, b'-')?; @@ -200,7 +200,7 @@ parsed.set_day(try_consume!(scan::number(s, 2, 2)))?; s = match s.as_bytes().first() { - Some(&b't' | &b'T' | &b' ') => &s[1..], + Some(&b't') | Some(&b'T') => &s[1..], Some(_) => return Err(INVALID), None => return Err(TOO_SHORT), }; @@ -215,7 +215,7 @@ parsed.set_nanosecond(nanosecond)?; } - let offset = try_consume!(scan::timezone_offset(s, |s| scan::char(s, b':'), true, false, true)); + let offset = try_consume!(scan::timezone_offset_zulu(s, |s| scan::char(s, b':'))); if offset <= -86_400 || offset >= 86_400 { return Err(OUT_OF_RANGE); } @@ -311,7 +311,7 @@ s = &s[prefix.len()..]; } - #[cfg(any(feature = "alloc", feature = "std"))] + #[cfg(any(feature = "alloc", feature = "std", test))] Item::OwnedLiteral(ref prefix) => { if s.len() < prefix.len() { return Err((s, TOO_SHORT)); @@ -323,12 +323,12 @@ } Item::Space(_) => { - s = s.trim_start(); + s = s.trim_left(); } - #[cfg(any(feature = "alloc", feature = "std"))] + #[cfg(any(feature = "alloc", feature = "std", test))] Item::OwnedSpace(_) => { - s = s.trim_start(); + s = s.trim_left(); } Item::Numeric(ref spec, ref _pad) => { @@ -361,7 +361,7 @@ Internal(ref int) => match int._dummy {}, }; - s = s.trim_start(); + s = s.trim_left(); let v = if signed { if s.starts_with('-') { let v = try_consume!(scan::number(&s[1..], 1, usize::MAX)); @@ -447,7 +447,7 @@ } &TimezoneName => { - try_consume!(Ok((s.trim_start_matches(|c: char| !c.is_whitespace()), ()))); + try_consume!(scan::timezone_name_skip(s)); } &TimezoneOffsetColon @@ -455,46 +455,31 @@ | &TimezoneOffsetTripleColon | &TimezoneOffset => { let offset = try_consume!(scan::timezone_offset( - s.trim_start(), - scan::colon_or_space, - false, - false, - true, + s.trim_left(), + scan::colon_or_space )); parsed.set_offset(i64::from(offset)).map_err(|e| (s, e))?; } &TimezoneOffsetColonZ | &TimezoneOffsetZ => { - let offset = try_consume!(scan::timezone_offset( - s.trim_start(), - scan::colon_or_space, - true, - false, - true, + let offset = try_consume!(scan::timezone_offset_zulu( + s.trim_left(), + scan::colon_or_space )); parsed.set_offset(i64::from(offset)).map_err(|e| (s, e))?; } &Internal(InternalFixed { val: InternalInternal::TimezoneOffsetPermissive, }) => { - let offset = try_consume!(scan::timezone_offset( - s.trim_start(), - scan::colon_or_space, - true, - true, - true, + let offset = try_consume!(scan::timezone_offset_permissive( + s.trim_left(), + scan::colon_or_space )); parsed.set_offset(i64::from(offset)).map_err(|e| (s, e))?; } &RFC2822 => try_consume!(parse_rfc2822(parsed, s)), - &RFC3339 => { - // Used for the `%+` specifier, which has the description: - // "Same as `%Y-%m-%dT%H:%M:%S%.f%:z` (...) - // This format also supports having a `Z` or `UTC` in place of `%:z`." - // Use the relaxed parser to match this description. - try_consume!(parse_rfc3339_relaxed(parsed, s)) - } + &RFC3339 => try_consume!(parse_rfc3339(parsed, s)), } } @@ -528,1329 +513,530 @@ type Err = ParseError; fn from_str(s: &str) -> ParseResult> { + const DATE_ITEMS: &[Item<'static>] = &[ + Item::Numeric(Numeric::Year, Pad::Zero), + Item::Space(""), + Item::Literal("-"), + Item::Numeric(Numeric::Month, Pad::Zero), + Item::Space(""), + Item::Literal("-"), + Item::Numeric(Numeric::Day, Pad::Zero), + ]; + const TIME_ITEMS: &[Item<'static>] = &[ + Item::Numeric(Numeric::Hour, Pad::Zero), + Item::Space(""), + Item::Literal(":"), + Item::Numeric(Numeric::Minute, Pad::Zero), + Item::Space(""), + Item::Literal(":"), + Item::Numeric(Numeric::Second, Pad::Zero), + Item::Fixed(Fixed::Nanosecond), + Item::Space(""), + Item::Fixed(Fixed::TimezoneOffsetZ), + Item::Space(""), + ]; + let mut parsed = Parsed::new(); - let (s, _) = parse_rfc3339_relaxed(&mut parsed, s)?; - if !s.trim_start().is_empty() { - return Err(TOO_LONG); - } + match parse_internal(&mut parsed, s, DATE_ITEMS.iter()) { + Err((remainder, e)) if e.0 == ParseErrorKind::TooLong => { + if remainder.starts_with('T') || remainder.starts_with(' ') { + parse(&mut parsed, &remainder[1..], TIME_ITEMS.iter())?; + } else { + return Err(INVALID); + } + } + Err((_s, e)) => return Err(e), + Ok(_) => return Err(NOT_ENOUGH), + }; parsed.to_datetime() } } -/// Accepts a relaxed form of RFC3339. -/// -/// Differences with RFC3339: -/// - Values don't require padding to two digits. -/// - Years outside the range 0...=9999 are accepted, but they must include a sign. -/// - `UTC` is accepted as a valid timezone name/offset (for compatibility with the debug format of -/// `DateTime`. -/// - There can be spaces between any of the components. -/// - The colon in the offset may be missing. -fn parse_rfc3339_relaxed<'a>(parsed: &mut Parsed, mut s: &'a str) -> ParseResult<(&'a str, ())> { - const DATE_ITEMS: &[Item<'static>] = &[ - Item::Numeric(Numeric::Year, Pad::Zero), - Item::Space(""), - Item::Literal("-"), - Item::Numeric(Numeric::Month, Pad::Zero), - Item::Space(""), - Item::Literal("-"), - Item::Numeric(Numeric::Day, Pad::Zero), - ]; - const TIME_ITEMS: &[Item<'static>] = &[ - Item::Numeric(Numeric::Hour, Pad::Zero), - Item::Space(""), - Item::Literal(":"), - Item::Numeric(Numeric::Minute, Pad::Zero), - Item::Space(""), - Item::Literal(":"), - Item::Numeric(Numeric::Second, Pad::Zero), - Item::Fixed(Fixed::Nanosecond), - Item::Space(""), - ]; - - s = match parse_internal(parsed, s, DATE_ITEMS.iter()) { - Err((remainder, e)) if e.0 == ParseErrorKind::TooLong => remainder, - Err((_s, e)) => return Err(e), - Ok(_) => return Err(NOT_ENOUGH), - }; - - s = match s.as_bytes().first() { - Some(&b't' | &b'T' | &b' ') => &s[1..], - Some(_) => return Err(INVALID), - None => return Err(TOO_SHORT), - }; - - s = match parse_internal(parsed, s, TIME_ITEMS.iter()) { - Err((s, e)) if e.0 == ParseErrorKind::TooLong => s, - Err((_s, e)) => return Err(e), - Ok(_) => return Err(NOT_ENOUGH), - }; - s = s.trim_start(); - let (s, offset) = if s.len() >= 3 && "UTC".as_bytes().eq_ignore_ascii_case(&s.as_bytes()[..3]) { - (&s[3..], 0) - } else { - scan::timezone_offset(s, scan::colon_or_space, true, false, true)? - }; - parsed.set_offset(i64::from(offset))?; - Ok((s, ())) -} - #[cfg(test)] -mod tests { - use crate::format::*; - use crate::{DateTime, FixedOffset, NaiveDateTime, TimeZone, Timelike, Utc}; +#[test] +fn test_parse() { + use super::IMPOSSIBLE; + use super::*; - macro_rules! parsed { - ($($k:ident: $v:expr),*) => (#[allow(unused_mut)] { - let mut expected = Parsed::new(); - $(expected.$k = Some($v);)* - Ok(expected) - }); + // workaround for Rust issue #22255 + fn parse_all(s: &str, items: &[Item]) -> ParseResult { + let mut parsed = Parsed::new(); + parse(&mut parsed, s, items.iter())?; + Ok(parsed) } - #[test] - fn test_parse_whitespace_and_literal() { - use crate::format::Item::{Literal, Space}; - - // empty string - parses("", &[]); - check(" ", &[], Err(TOO_LONG)); - check("a", &[], Err(TOO_LONG)); - check("abc", &[], Err(TOO_LONG)); - check("🤠", &[], Err(TOO_LONG)); - - // whitespaces - parses("", &[Space("")]); - parses(" ", &[Space(" ")]); - parses(" ", &[Space(" ")]); - parses(" ", &[Space(" ")]); - parses(" ", &[Space("")]); - parses(" ", &[Space(" ")]); - parses(" ", &[Space(" ")]); - parses(" ", &[Space(" ")]); - parses("", &[Space(" ")]); - parses(" ", &[Space(" ")]); - parses(" ", &[Space(" ")]); - parses(" ", &[Space(" "), Space(" ")]); - parses(" ", &[Space(" "), Space(" ")]); - parses(" ", &[Space(" "), Space(" ")]); - parses(" ", &[Space(" "), Space(" ")]); - parses(" ", &[Space(" "), Space(" ")]); - parses(" ", &[Space(" "), Space(" "), Space(" ")]); - parses("\t", &[Space("")]); - parses(" \n\r \n", &[Space("")]); - parses("\t", &[Space("\t")]); - parses("\t", &[Space(" ")]); - parses(" ", &[Space("\t")]); - parses("\t\r", &[Space("\t\r")]); - parses("\t\r ", &[Space("\t\r ")]); - parses("\t \r", &[Space("\t \r")]); - parses(" \t\r", &[Space(" \t\r")]); - parses(" \n\r \n", &[Space(" \n\r \n")]); - parses(" \t\n", &[Space(" \t")]); - parses(" \n\t", &[Space(" \t\n")]); - parses("\u{2002}", &[Space("\u{2002}")]); - // most unicode whitespace characters - parses( - "\u{00A0}\u{1680}\u{2000}\u{2001}\u{2002}\u{2003}\u{2004}\u{2005}\u{2006}\u{2007}\u{2008}\u{2009}\u{3000}", - &[Space("\u{00A0}\u{1680}\u{2000}\u{2001}\u{2002}\u{2003}\u{2004}\u{2005}\u{2006}\u{2007}\u{2008}\u{2009}\u{3000}")] - ); - // most unicode whitespace characters - parses( - "\u{00A0}\u{1680}\u{2000}\u{2001}\u{2002}\u{2003}\u{2004}\u{2005}\u{2006}\u{2007}\u{2008}\u{2009}\u{3000}", - &[ - Space("\u{00A0}\u{1680}\u{2000}\u{2001}\u{2002}\u{2003}\u{2004}"), - Space("\u{2005}\u{2006}\u{2007}\u{2008}\u{2009}\u{3000}") - ] - ); - check("a", &[Space("")], Err(TOO_LONG)); - check("a", &[Space(" ")], Err(TOO_LONG)); - // a Space containing a literal does not match a literal - check("a", &[Space("a")], Err(TOO_LONG)); - check("abc", &[Space("")], Err(TOO_LONG)); - check("abc", &[Space(" ")], Err(TOO_LONG)); - check(" abc", &[Space("")], Err(TOO_LONG)); - check(" abc", &[Space(" ")], Err(TOO_LONG)); - - // `\u{0363}` is combining diacritic mark "COMBINING LATIN SMALL LETTER A" - - // literal - parses("", &[Literal("")]); - check("", &[Literal("a")], Err(TOO_SHORT)); - check(" ", &[Literal("a")], Err(INVALID)); - parses("a", &[Literal("a")]); - parses("+", &[Literal("+")]); - parses("-", &[Literal("-")]); - parses("−", &[Literal("−")]); // MINUS SIGN (U+2212) - parses(" ", &[Literal(" ")]); // a Literal may contain whitespace and match whitespace - check("aa", &[Literal("a")], Err(TOO_LONG)); - check("🤠", &[Literal("a")], Err(INVALID)); - check("A", &[Literal("a")], Err(INVALID)); - check("a", &[Literal("z")], Err(INVALID)); - check("a", &[Literal("🤠")], Err(TOO_SHORT)); - check("a", &[Literal("\u{0363}a")], Err(TOO_SHORT)); - check("\u{0363}a", &[Literal("a")], Err(INVALID)); - parses("\u{0363}a", &[Literal("\u{0363}a")]); - check("a", &[Literal("ab")], Err(TOO_SHORT)); - parses("xy", &[Literal("xy")]); - parses("xy", &[Literal("x"), Literal("y")]); - parses("1", &[Literal("1")]); - parses("1234", &[Literal("1234")]); - parses("+1234", &[Literal("+1234")]); - parses("-1234", &[Literal("-1234")]); - parses("−1234", &[Literal("−1234")]); // MINUS SIGN (U+2212) - parses("PST", &[Literal("PST")]); - parses("🤠", &[Literal("🤠")]); - parses("🤠a", &[Literal("🤠"), Literal("a")]); - parses("🤠a🤠", &[Literal("🤠"), Literal("a🤠")]); - parses("a🤠b", &[Literal("a"), Literal("🤠"), Literal("b")]); - // literals can be together - parses("xy", &[Literal("xy")]); - parses("xyz", &[Literal("xyz")]); - // or literals can be apart - parses("xy", &[Literal("x"), Literal("y")]); - parses("xyz", &[Literal("x"), Literal("yz")]); - parses("xyz", &[Literal("xy"), Literal("z")]); - parses("xyz", &[Literal("x"), Literal("y"), Literal("z")]); - // - check("x y", &[Literal("x"), Literal("y")], Err(INVALID)); - parses("xy", &[Literal("x"), Space(""), Literal("y")]); - parses("x y", &[Literal("x"), Space(""), Literal("y")]); - parses("x y", &[Literal("x"), Space(" "), Literal("y")]); - - // whitespaces + literals - parses("a\n", &[Literal("a"), Space("\n")]); - parses("\tab\n", &[Space("\t"), Literal("ab"), Space("\n")]); - parses( - "ab\tcd\ne", - &[Literal("ab"), Space("\t"), Literal("cd"), Space("\n"), Literal("e")], - ); - parses( - "+1ab\tcd\r\n+,.", - &[Literal("+1ab"), Space("\t"), Literal("cd"), Space("\r\n"), Literal("+,.")], - ); - // whitespace and literals can be intermixed - parses("a\tb", &[Literal("a\tb")]); - parses("a\tb", &[Literal("a"), Space("\t"), Literal("b")]); - } - - #[test] - fn test_parse_numeric() { - use crate::format::Item::{Literal, Space}; - use crate::format::Numeric::*; - - // numeric - check("1987", &[num(Year)], parsed!(year: 1987)); - check("1987 ", &[num(Year)], Err(TOO_LONG)); - check("0x12", &[num(Year)], Err(TOO_LONG)); // `0` is parsed - check("x123", &[num(Year)], Err(INVALID)); - check("o123", &[num(Year)], Err(INVALID)); - check("2015", &[num(Year)], parsed!(year: 2015)); - check("0000", &[num(Year)], parsed!(year: 0)); - check("9999", &[num(Year)], parsed!(year: 9999)); - check(" \t987", &[num(Year)], parsed!(year: 987)); - check(" \t987", &[Space(" \t"), num(Year)], parsed!(year: 987)); - check(" \t987🤠", &[Space(" \t"), num(Year), Literal("🤠")], parsed!(year: 987)); - check("987🤠", &[num(Year), Literal("🤠")], parsed!(year: 987)); - check("5", &[num(Year)], parsed!(year: 5)); - check("5\0", &[num(Year)], Err(TOO_LONG)); - check("\x005", &[num(Year)], Err(INVALID)); - check("", &[num(Year)], Err(TOO_SHORT)); - check("12345", &[num(Year), Literal("5")], parsed!(year: 1234)); - check("12345", &[nums(Year), Literal("5")], parsed!(year: 1234)); - check("12345", &[num0(Year), Literal("5")], parsed!(year: 1234)); - check("12341234", &[num(Year), num(Year)], parsed!(year: 1234)); - check("1234 1234", &[num(Year), num(Year)], parsed!(year: 1234)); - check("1234 1234", &[num(Year), Space(" "), num(Year)], parsed!(year: 1234)); - check("1234 1235", &[num(Year), num(Year)], Err(IMPOSSIBLE)); - check("1234 1234", &[num(Year), Literal("x"), num(Year)], Err(INVALID)); - check("1234x1234", &[num(Year), Literal("x"), num(Year)], parsed!(year: 1234)); - check("1234 x 1234", &[num(Year), Literal("x"), num(Year)], Err(INVALID)); - check("1234xx1234", &[num(Year), Literal("x"), num(Year)], Err(INVALID)); - check("1234xx1234", &[num(Year), Literal("xx"), num(Year)], parsed!(year: 1234)); - check( - "1234 x 1234", - &[num(Year), Space(" "), Literal("x"), Space(" "), num(Year)], - parsed!(year: 1234), - ); - check( - "1234 x 1235", - &[num(Year), Space(" "), Literal("x"), Space(" "), Literal("1235")], - parsed!(year: 1234), - ); - - // signed numeric - check("-42", &[num(Year)], parsed!(year: -42)); - check("+42", &[num(Year)], parsed!(year: 42)); - check("-0042", &[num(Year)], parsed!(year: -42)); - check("+0042", &[num(Year)], parsed!(year: 42)); - check("-42195", &[num(Year)], parsed!(year: -42195)); - check("−42195", &[num(Year)], Err(INVALID)); // MINUS SIGN (U+2212) - check("+42195", &[num(Year)], parsed!(year: 42195)); - check(" -42195", &[num(Year)], parsed!(year: -42195)); - check(" +42195", &[num(Year)], parsed!(year: 42195)); - check(" -42195", &[num(Year)], parsed!(year: -42195)); - check(" +42195", &[num(Year)], parsed!(year: 42195)); - check("-42195 ", &[num(Year)], Err(TOO_LONG)); - check("+42195 ", &[num(Year)], Err(TOO_LONG)); - check(" - 42", &[num(Year)], Err(INVALID)); - check(" + 42", &[num(Year)], Err(INVALID)); - check(" -42195", &[Space(" "), num(Year)], parsed!(year: -42195)); - check(" −42195", &[Space(" "), num(Year)], Err(INVALID)); // MINUS SIGN (U+2212) - check(" +42195", &[Space(" "), num(Year)], parsed!(year: 42195)); - check(" - 42", &[Space(" "), num(Year)], Err(INVALID)); - check(" + 42", &[Space(" "), num(Year)], Err(INVALID)); - check("-", &[num(Year)], Err(TOO_SHORT)); - check("+", &[num(Year)], Err(TOO_SHORT)); - - // unsigned numeric - check("345", &[num(Ordinal)], parsed!(ordinal: 345)); - check("+345", &[num(Ordinal)], Err(INVALID)); - check("-345", &[num(Ordinal)], Err(INVALID)); - check(" 345", &[num(Ordinal)], parsed!(ordinal: 345)); - check("−345", &[num(Ordinal)], Err(INVALID)); // MINUS SIGN (U+2212) - check("345 ", &[num(Ordinal)], Err(TOO_LONG)); - check(" 345", &[Space(" "), num(Ordinal)], parsed!(ordinal: 345)); - check("345 ", &[num(Ordinal), Space(" ")], parsed!(ordinal: 345)); - check("345🤠 ", &[num(Ordinal), Literal("🤠"), Space(" ")], parsed!(ordinal: 345)); - check("345🤠", &[num(Ordinal)], Err(TOO_LONG)); - check("\u{0363}345", &[num(Ordinal)], Err(INVALID)); - check(" +345", &[num(Ordinal)], Err(INVALID)); - check(" -345", &[num(Ordinal)], Err(INVALID)); - check("\t345", &[Space("\t"), num(Ordinal)], parsed!(ordinal: 345)); - check(" +345", &[Space(" "), num(Ordinal)], Err(INVALID)); - check(" -345", &[Space(" "), num(Ordinal)], Err(INVALID)); - - // various numeric fields - check("1234 5678", &[num(Year), num(IsoYear)], parsed!(year: 1234, isoyear: 5678)); - check("1234 5678", &[num(Year), num(IsoYear)], parsed!(year: 1234, isoyear: 5678)); - check( - "12 34 56 78", - &[num(YearDiv100), num(YearMod100), num(IsoYearDiv100), num(IsoYearMod100)], - parsed!(year_div_100: 12, year_mod_100: 34, isoyear_div_100: 56, isoyear_mod_100: 78), - ); - check( - "1 2 3 4 5", - &[num(Month), num(Day), num(WeekFromSun), num(NumDaysFromSun), num(IsoWeek)], - parsed!(month: 1, day: 2, week_from_sun: 3, weekday: Weekday::Thu, isoweek: 5), - ); - check( - "6 7 89 01", - &[num(WeekFromMon), num(WeekdayFromMon), num(Ordinal), num(Hour12)], - parsed!(week_from_mon: 6, weekday: Weekday::Sun, ordinal: 89, hour_mod_12: 1), - ); - check( - "23 45 6 78901234 567890123", - &[num(Hour), num(Minute), num(Second), num(Nanosecond), num(Timestamp)], - parsed!(hour_div_12: 1, hour_mod_12: 11, minute: 45, second: 6, nanosecond: 78_901_234, timestamp: 567_890_123), + macro_rules! check { + ($fmt:expr, $items:expr; $err:tt) => ( + assert_eq!(parse_all($fmt, &$items), Err($err)) ); + ($fmt:expr, $items:expr; $($k:ident: $v:expr),*) => (#[allow(unused_mut)] { + let mut expected = Parsed::new(); + $(expected.$k = Some($v);)* + assert_eq!(parse_all($fmt, &$items), Ok(expected)) + }); } - #[test] - fn test_parse_fixed() { - use crate::format::Fixed::*; - use crate::format::Item::{Literal, Space}; - - // fixed: month and weekday names - check("apr", &[fixed(ShortMonthName)], parsed!(month: 4)); - check("Apr", &[fixed(ShortMonthName)], parsed!(month: 4)); - check("APR", &[fixed(ShortMonthName)], parsed!(month: 4)); - check("ApR", &[fixed(ShortMonthName)], parsed!(month: 4)); - check("\u{0363}APR", &[fixed(ShortMonthName)], Err(INVALID)); - check("April", &[fixed(ShortMonthName)], Err(TOO_LONG)); // `Apr` is parsed - check("A", &[fixed(ShortMonthName)], Err(TOO_SHORT)); - check("Sol", &[fixed(ShortMonthName)], Err(INVALID)); - check("Apr", &[fixed(LongMonthName)], parsed!(month: 4)); - check("Apri", &[fixed(LongMonthName)], Err(TOO_LONG)); // `Apr` is parsed - check("April", &[fixed(LongMonthName)], parsed!(month: 4)); - check("Aprill", &[fixed(LongMonthName)], Err(TOO_LONG)); - check("Aprill", &[fixed(LongMonthName), Literal("l")], parsed!(month: 4)); - check("Aprl", &[fixed(LongMonthName), Literal("l")], parsed!(month: 4)); - check("April", &[fixed(LongMonthName), Literal("il")], Err(TOO_SHORT)); // do not backtrack - check("thu", &[fixed(ShortWeekdayName)], parsed!(weekday: Weekday::Thu)); - check("Thu", &[fixed(ShortWeekdayName)], parsed!(weekday: Weekday::Thu)); - check("THU", &[fixed(ShortWeekdayName)], parsed!(weekday: Weekday::Thu)); - check("tHu", &[fixed(ShortWeekdayName)], parsed!(weekday: Weekday::Thu)); - check("Thursday", &[fixed(ShortWeekdayName)], Err(TOO_LONG)); // `Thu` is parsed - check("T", &[fixed(ShortWeekdayName)], Err(TOO_SHORT)); - check("The", &[fixed(ShortWeekdayName)], Err(INVALID)); - check("Nop", &[fixed(ShortWeekdayName)], Err(INVALID)); - check("Thu", &[fixed(LongWeekdayName)], parsed!(weekday: Weekday::Thu)); - check("Thur", &[fixed(LongWeekdayName)], Err(TOO_LONG)); // `Thu` is parsed - check("Thurs", &[fixed(LongWeekdayName)], Err(TOO_LONG)); // `Thu` is parsed - check("Thursday", &[fixed(LongWeekdayName)], parsed!(weekday: Weekday::Thu)); - check("Thursdays", &[fixed(LongWeekdayName)], Err(TOO_LONG)); - check("Thursdays", &[fixed(LongWeekdayName), Literal("s")], parsed!(weekday: Weekday::Thu)); - check("Thus", &[fixed(LongWeekdayName), Literal("s")], parsed!(weekday: Weekday::Thu)); - check("Thursday", &[fixed(LongWeekdayName), Literal("rsday")], Err(TOO_SHORT)); // do not backtrack - - // fixed: am/pm - check("am", &[fixed(LowerAmPm)], parsed!(hour_div_12: 0)); - check("pm", &[fixed(LowerAmPm)], parsed!(hour_div_12: 1)); - check("AM", &[fixed(LowerAmPm)], parsed!(hour_div_12: 0)); - check("PM", &[fixed(LowerAmPm)], parsed!(hour_div_12: 1)); - check("am", &[fixed(UpperAmPm)], parsed!(hour_div_12: 0)); - check("pm", &[fixed(UpperAmPm)], parsed!(hour_div_12: 1)); - check("AM", &[fixed(UpperAmPm)], parsed!(hour_div_12: 0)); - check("PM", &[fixed(UpperAmPm)], parsed!(hour_div_12: 1)); - check("Am", &[fixed(LowerAmPm)], parsed!(hour_div_12: 0)); - check(" Am", &[Space(" "), fixed(LowerAmPm)], parsed!(hour_div_12: 0)); - check("Am🤠", &[fixed(LowerAmPm), Literal("🤠")], parsed!(hour_div_12: 0)); - check("🤠Am", &[Literal("🤠"), fixed(LowerAmPm)], parsed!(hour_div_12: 0)); - check("\u{0363}am", &[fixed(LowerAmPm)], Err(INVALID)); - check("\u{0360}am", &[fixed(LowerAmPm)], Err(INVALID)); - check(" Am", &[fixed(LowerAmPm)], Err(INVALID)); - check("Am ", &[fixed(LowerAmPm)], Err(TOO_LONG)); - check("a.m.", &[fixed(LowerAmPm)], Err(INVALID)); - check("A.M.", &[fixed(LowerAmPm)], Err(INVALID)); - check("ame", &[fixed(LowerAmPm)], Err(TOO_LONG)); // `am` is parsed - check("a", &[fixed(LowerAmPm)], Err(TOO_SHORT)); - check("p", &[fixed(LowerAmPm)], Err(TOO_SHORT)); - check("x", &[fixed(LowerAmPm)], Err(TOO_SHORT)); - check("xx", &[fixed(LowerAmPm)], Err(INVALID)); - check("", &[fixed(LowerAmPm)], Err(TOO_SHORT)); - } - - #[test] - fn test_parse_fixed_nanosecond() { - use crate::format::Fixed::Nanosecond; - use crate::format::InternalInternal::*; - use crate::format::Item::Literal; - use crate::format::Numeric::Second; - - // fixed: dot plus nanoseconds - check("", &[fixed(Nanosecond)], parsed!()); // no field set, but not an error - check(".", &[fixed(Nanosecond)], Err(TOO_SHORT)); - check("4", &[fixed(Nanosecond)], Err(TOO_LONG)); // never consumes `4` - check("4", &[fixed(Nanosecond), num(Second)], parsed!(second: 4)); - check(".0", &[fixed(Nanosecond)], parsed!(nanosecond: 0)); - check(".4", &[fixed(Nanosecond)], parsed!(nanosecond: 400_000_000)); - check(".42", &[fixed(Nanosecond)], parsed!(nanosecond: 420_000_000)); - check(".421", &[fixed(Nanosecond)], parsed!(nanosecond: 421_000_000)); - check(".42195", &[fixed(Nanosecond)], parsed!(nanosecond: 421_950_000)); - check(".421951", &[fixed(Nanosecond)], parsed!(nanosecond: 421_951_000)); - check(".4219512", &[fixed(Nanosecond)], parsed!(nanosecond: 421_951_200)); - check(".42195123", &[fixed(Nanosecond)], parsed!(nanosecond: 421_951_230)); - check(".421950803", &[fixed(Nanosecond)], parsed!(nanosecond: 421_950_803)); - check(".4219508035", &[fixed(Nanosecond)], parsed!(nanosecond: 421_950_803)); - check(".42195080354", &[fixed(Nanosecond)], parsed!(nanosecond: 421_950_803)); - check(".421950803547", &[fixed(Nanosecond)], parsed!(nanosecond: 421_950_803)); - check(".000000003", &[fixed(Nanosecond)], parsed!(nanosecond: 3)); - check(".0000000031", &[fixed(Nanosecond)], parsed!(nanosecond: 3)); - check(".0000000035", &[fixed(Nanosecond)], parsed!(nanosecond: 3)); - check(".000000003547", &[fixed(Nanosecond)], parsed!(nanosecond: 3)); - check(".0000000009", &[fixed(Nanosecond)], parsed!(nanosecond: 0)); - check(".000000000547", &[fixed(Nanosecond)], parsed!(nanosecond: 0)); - check(".0000000009999999999999999999999999", &[fixed(Nanosecond)], parsed!(nanosecond: 0)); - check(".4🤠", &[fixed(Nanosecond), Literal("🤠")], parsed!(nanosecond: 400_000_000)); - check(".4x", &[fixed(Nanosecond)], Err(TOO_LONG)); - check(". 4", &[fixed(Nanosecond)], Err(INVALID)); - check(" .4", &[fixed(Nanosecond)], Err(TOO_LONG)); // no automatic trimming - - // fixed: nanoseconds without the dot - check("", &[internal_fixed(Nanosecond3NoDot)], Err(TOO_SHORT)); - check(".", &[internal_fixed(Nanosecond3NoDot)], Err(TOO_SHORT)); - check("0", &[internal_fixed(Nanosecond3NoDot)], Err(TOO_SHORT)); - check("4", &[internal_fixed(Nanosecond3NoDot)], Err(TOO_SHORT)); - check("42", &[internal_fixed(Nanosecond3NoDot)], Err(TOO_SHORT)); - check("421", &[internal_fixed(Nanosecond3NoDot)], parsed!(nanosecond: 421_000_000)); - check("4210", &[internal_fixed(Nanosecond3NoDot)], Err(TOO_LONG)); - check( - "42143", - &[internal_fixed(Nanosecond3NoDot), num(Second)], - parsed!(nanosecond: 421_000_000, second: 43), - ); - check( - "421🤠", - &[internal_fixed(Nanosecond3NoDot), Literal("🤠")], - parsed!(nanosecond: 421_000_000), - ); - check( - "🤠421", - &[Literal("🤠"), internal_fixed(Nanosecond3NoDot)], - parsed!(nanosecond: 421_000_000), - ); - check("42195", &[internal_fixed(Nanosecond3NoDot)], Err(TOO_LONG)); - check("123456789", &[internal_fixed(Nanosecond3NoDot)], Err(TOO_LONG)); - check("4x", &[internal_fixed(Nanosecond3NoDot)], Err(TOO_SHORT)); - check(" 4", &[internal_fixed(Nanosecond3NoDot)], Err(INVALID)); - check(".421", &[internal_fixed(Nanosecond3NoDot)], Err(INVALID)); - - check("", &[internal_fixed(Nanosecond6NoDot)], Err(TOO_SHORT)); - check(".", &[internal_fixed(Nanosecond6NoDot)], Err(TOO_SHORT)); - check("0", &[internal_fixed(Nanosecond6NoDot)], Err(TOO_SHORT)); - check("1234", &[internal_fixed(Nanosecond6NoDot)], Err(TOO_SHORT)); - check("12345", &[internal_fixed(Nanosecond6NoDot)], Err(TOO_SHORT)); - check("421950", &[internal_fixed(Nanosecond6NoDot)], parsed!(nanosecond: 421_950_000)); - check("000003", &[internal_fixed(Nanosecond6NoDot)], parsed!(nanosecond: 3000)); - check("000000", &[internal_fixed(Nanosecond6NoDot)], parsed!(nanosecond: 0)); - check("1234567", &[internal_fixed(Nanosecond6NoDot)], Err(TOO_LONG)); - check("123456789", &[internal_fixed(Nanosecond6NoDot)], Err(TOO_LONG)); - check("4x", &[internal_fixed(Nanosecond6NoDot)], Err(TOO_SHORT)); - check(" 4", &[internal_fixed(Nanosecond6NoDot)], Err(INVALID)); - check(".42100", &[internal_fixed(Nanosecond6NoDot)], Err(INVALID)); - - check("", &[internal_fixed(Nanosecond9NoDot)], Err(TOO_SHORT)); - check(".", &[internal_fixed(Nanosecond9NoDot)], Err(TOO_SHORT)); - check("42195", &[internal_fixed(Nanosecond9NoDot)], Err(TOO_SHORT)); - check("12345678", &[internal_fixed(Nanosecond9NoDot)], Err(TOO_SHORT)); - check("421950803", &[internal_fixed(Nanosecond9NoDot)], parsed!(nanosecond: 421_950_803)); - check("000000003", &[internal_fixed(Nanosecond9NoDot)], parsed!(nanosecond: 3)); - check( - "42195080354", - &[internal_fixed(Nanosecond9NoDot), num(Second)], - parsed!(nanosecond: 421_950_803, second: 54), - ); // don't skip digits that come after the 9 - check("1234567890", &[internal_fixed(Nanosecond9NoDot)], Err(TOO_LONG)); - check("000000000", &[internal_fixed(Nanosecond9NoDot)], parsed!(nanosecond: 0)); - check("00000000x", &[internal_fixed(Nanosecond9NoDot)], Err(INVALID)); - check(" 4", &[internal_fixed(Nanosecond9NoDot)], Err(INVALID)); - check(".42100000", &[internal_fixed(Nanosecond9NoDot)], Err(INVALID)); - } - - #[test] - fn test_parse_fixed_timezone_offset() { - use crate::format::Fixed::*; - use crate::format::InternalInternal::*; - use crate::format::Item::Literal; - - // TimezoneOffset - check("1", &[fixed(TimezoneOffset)], Err(INVALID)); - check("12", &[fixed(TimezoneOffset)], Err(INVALID)); - check("123", &[fixed(TimezoneOffset)], Err(INVALID)); - check("1234", &[fixed(TimezoneOffset)], Err(INVALID)); - check("12345", &[fixed(TimezoneOffset)], Err(INVALID)); - check("123456", &[fixed(TimezoneOffset)], Err(INVALID)); - check("1234567", &[fixed(TimezoneOffset)], Err(INVALID)); - check("+1", &[fixed(TimezoneOffset)], Err(TOO_SHORT)); - check("+12", &[fixed(TimezoneOffset)], Err(TOO_SHORT)); - check("+123", &[fixed(TimezoneOffset)], Err(TOO_SHORT)); - check("+1234", &[fixed(TimezoneOffset)], parsed!(offset: 45_240)); - check("+12345", &[fixed(TimezoneOffset)], Err(TOO_LONG)); - check("+123456", &[fixed(TimezoneOffset)], Err(TOO_LONG)); - check("+1234567", &[fixed(TimezoneOffset)], Err(TOO_LONG)); - check("+12345678", &[fixed(TimezoneOffset)], Err(TOO_LONG)); - check("+12:", &[fixed(TimezoneOffset)], Err(TOO_SHORT)); - check("+12:3", &[fixed(TimezoneOffset)], Err(TOO_SHORT)); - check("+12:34", &[fixed(TimezoneOffset)], parsed!(offset: 45_240)); - check("-12:34", &[fixed(TimezoneOffset)], parsed!(offset: -45_240)); - check("−12:34", &[fixed(TimezoneOffset)], parsed!(offset: -45_240)); // MINUS SIGN (U+2212) - check("+12:34:", &[fixed(TimezoneOffset)], Err(TOO_LONG)); - check("+12:34:5", &[fixed(TimezoneOffset)], Err(TOO_LONG)); - check("+12:34:56", &[fixed(TimezoneOffset)], Err(TOO_LONG)); - check("+12:34:56:", &[fixed(TimezoneOffset)], Err(TOO_LONG)); - check("+12 34", &[fixed(TimezoneOffset)], parsed!(offset: 45_240)); - check("+12 34", &[fixed(TimezoneOffset)], parsed!(offset: 45_240)); - check("12:34", &[fixed(TimezoneOffset)], Err(INVALID)); - check("12:34:56", &[fixed(TimezoneOffset)], Err(INVALID)); - check("+12::34", &[fixed(TimezoneOffset)], parsed!(offset: 45_240)); - check("+12: :34", &[fixed(TimezoneOffset)], parsed!(offset: 45_240)); - check("+12:::34", &[fixed(TimezoneOffset)], parsed!(offset: 45_240)); - check("+12::::34", &[fixed(TimezoneOffset)], parsed!(offset: 45_240)); - check("+12::34", &[fixed(TimezoneOffset)], parsed!(offset: 45_240)); - check("+12:34:56", &[fixed(TimezoneOffset)], Err(TOO_LONG)); - check("+12:3456", &[fixed(TimezoneOffset)], Err(TOO_LONG)); - check("+1234:56", &[fixed(TimezoneOffset)], Err(TOO_LONG)); - check("+1234:567", &[fixed(TimezoneOffset)], Err(TOO_LONG)); - check("+00:00", &[fixed(TimezoneOffset)], parsed!(offset: 0)); - check("-00:00", &[fixed(TimezoneOffset)], parsed!(offset: 0)); - check("−00:00", &[fixed(TimezoneOffset)], parsed!(offset: 0)); // MINUS SIGN (U+2212) - check("+00:01", &[fixed(TimezoneOffset)], parsed!(offset: 60)); - check("-00:01", &[fixed(TimezoneOffset)], parsed!(offset: -60)); - check("+00:30", &[fixed(TimezoneOffset)], parsed!(offset: 1_800)); - check("-00:30", &[fixed(TimezoneOffset)], parsed!(offset: -1_800)); - check("+24:00", &[fixed(TimezoneOffset)], parsed!(offset: 86_400)); - check("-24:00", &[fixed(TimezoneOffset)], parsed!(offset: -86_400)); - check("−24:00", &[fixed(TimezoneOffset)], parsed!(offset: -86_400)); // MINUS SIGN (U+2212) - check("+99:59", &[fixed(TimezoneOffset)], parsed!(offset: 359_940)); - check("-99:59", &[fixed(TimezoneOffset)], parsed!(offset: -359_940)); - check("+00:60", &[fixed(TimezoneOffset)], Err(OUT_OF_RANGE)); - check("+00:99", &[fixed(TimezoneOffset)], Err(OUT_OF_RANGE)); - check("#12:34", &[fixed(TimezoneOffset)], Err(INVALID)); - check("+12:34 ", &[fixed(TimezoneOffset)], Err(TOO_LONG)); - check("+12 34 ", &[fixed(TimezoneOffset)], Err(TOO_LONG)); - check(" +12:34", &[fixed(TimezoneOffset)], parsed!(offset: 45_240)); - check(" -12:34", &[fixed(TimezoneOffset)], parsed!(offset: -45_240)); - check(" −12:34", &[fixed(TimezoneOffset)], parsed!(offset: -45_240)); // MINUS SIGN (U+2212) - check(" +12:34", &[fixed(TimezoneOffset)], parsed!(offset: 45_240)); - check(" -12:34", &[fixed(TimezoneOffset)], parsed!(offset: -45_240)); - check("\t -12:34", &[fixed(TimezoneOffset)], parsed!(offset: -45_240)); - check("-12: 34", &[fixed(TimezoneOffset)], parsed!(offset: -45_240)); - check("-12 :34", &[fixed(TimezoneOffset)], parsed!(offset: -45_240)); - check("-12 : 34", &[fixed(TimezoneOffset)], parsed!(offset: -45_240)); - check("-12 : 34", &[fixed(TimezoneOffset)], parsed!(offset: -45_240)); - check("-12 : 34", &[fixed(TimezoneOffset)], parsed!(offset: -45_240)); - check("-12: 34", &[fixed(TimezoneOffset)], parsed!(offset: -45_240)); - check("-12 :34", &[fixed(TimezoneOffset)], parsed!(offset: -45_240)); - check("-12 : 34", &[fixed(TimezoneOffset)], parsed!(offset: -45_240)); - check("12:34 ", &[fixed(TimezoneOffset)], Err(INVALID)); - check(" 12:34", &[fixed(TimezoneOffset)], Err(INVALID)); - check("", &[fixed(TimezoneOffset)], Err(TOO_SHORT)); - check("+", &[fixed(TimezoneOffset)], Err(TOO_SHORT)); - check( - "+12345", - &[fixed(TimezoneOffset), num(Numeric::Day)], - parsed!(offset: 45_240, day: 5), - ); - check( - "+12:345", - &[fixed(TimezoneOffset), num(Numeric::Day)], - parsed!(offset: 45_240, day: 5), - ); - check("+12:34:", &[fixed(TimezoneOffset), Literal(":")], parsed!(offset: 45_240)); - check("Z12:34", &[fixed(TimezoneOffset)], Err(INVALID)); - check("X12:34", &[fixed(TimezoneOffset)], Err(INVALID)); - check("Z+12:34", &[fixed(TimezoneOffset)], Err(INVALID)); - check("X+12:34", &[fixed(TimezoneOffset)], Err(INVALID)); - check("X−12:34", &[fixed(TimezoneOffset)], Err(INVALID)); // MINUS SIGN (U+2212) - check("🤠+12:34", &[fixed(TimezoneOffset)], Err(INVALID)); - check("+12:34🤠", &[fixed(TimezoneOffset)], Err(TOO_LONG)); - check("+12:🤠34", &[fixed(TimezoneOffset)], Err(INVALID)); - check("+1234🤠", &[fixed(TimezoneOffset), Literal("🤠")], parsed!(offset: 45_240)); - check("-1234🤠", &[fixed(TimezoneOffset), Literal("🤠")], parsed!(offset: -45_240)); - check("−1234🤠", &[fixed(TimezoneOffset), Literal("🤠")], parsed!(offset: -45_240)); // MINUS SIGN (U+2212) - check("+12:34🤠", &[fixed(TimezoneOffset), Literal("🤠")], parsed!(offset: 45_240)); - check("-12:34🤠", &[fixed(TimezoneOffset), Literal("🤠")], parsed!(offset: -45_240)); - check("−12:34🤠", &[fixed(TimezoneOffset), Literal("🤠")], parsed!(offset: -45_240)); // MINUS SIGN (U+2212) - check("🤠+12:34", &[Literal("🤠"), fixed(TimezoneOffset)], parsed!(offset: 45_240)); - check("Z", &[fixed(TimezoneOffset)], Err(INVALID)); - check("A", &[fixed(TimezoneOffset)], Err(INVALID)); - check("PST", &[fixed(TimezoneOffset)], Err(INVALID)); - check("#Z", &[fixed(TimezoneOffset)], Err(INVALID)); - check(":Z", &[fixed(TimezoneOffset)], Err(INVALID)); - check("+Z", &[fixed(TimezoneOffset)], Err(TOO_SHORT)); - check("+:Z", &[fixed(TimezoneOffset)], Err(INVALID)); - check("+Z:", &[fixed(TimezoneOffset)], Err(INVALID)); - check("z", &[fixed(TimezoneOffset)], Err(INVALID)); - check(" :Z", &[fixed(TimezoneOffset)], Err(INVALID)); - check(" Z", &[fixed(TimezoneOffset)], Err(INVALID)); - check(" z", &[fixed(TimezoneOffset)], Err(INVALID)); - - // TimezoneOffsetColon - check("1", &[fixed(TimezoneOffsetColon)], Err(INVALID)); - check("12", &[fixed(TimezoneOffsetColon)], Err(INVALID)); - check("123", &[fixed(TimezoneOffsetColon)], Err(INVALID)); - check("1234", &[fixed(TimezoneOffsetColon)], Err(INVALID)); - check("12345", &[fixed(TimezoneOffsetColon)], Err(INVALID)); - check("123456", &[fixed(TimezoneOffsetColon)], Err(INVALID)); - check("1234567", &[fixed(TimezoneOffsetColon)], Err(INVALID)); - check("12345678", &[fixed(TimezoneOffsetColon)], Err(INVALID)); - check("+1", &[fixed(TimezoneOffsetColon)], Err(TOO_SHORT)); - check("+12", &[fixed(TimezoneOffsetColon)], Err(TOO_SHORT)); - check("+123", &[fixed(TimezoneOffsetColon)], Err(TOO_SHORT)); - check("+1234", &[fixed(TimezoneOffsetColon)], parsed!(offset: 45_240)); - check("-1234", &[fixed(TimezoneOffsetColon)], parsed!(offset: -45_240)); - check("−1234", &[fixed(TimezoneOffsetColon)], parsed!(offset: -45_240)); // MINUS SIGN (U+2212) - check("+12345", &[fixed(TimezoneOffsetColon)], Err(TOO_LONG)); - check("+123456", &[fixed(TimezoneOffsetColon)], Err(TOO_LONG)); - check("+1234567", &[fixed(TimezoneOffsetColon)], Err(TOO_LONG)); - check("+12345678", &[fixed(TimezoneOffsetColon)], Err(TOO_LONG)); - check("1:", &[fixed(TimezoneOffsetColon)], Err(INVALID)); - check("12:", &[fixed(TimezoneOffsetColon)], Err(INVALID)); - check("12:3", &[fixed(TimezoneOffsetColon)], Err(INVALID)); - check("12:34", &[fixed(TimezoneOffsetColon)], Err(INVALID)); - check("12:34:", &[fixed(TimezoneOffsetColon)], Err(INVALID)); - check("12:34:5", &[fixed(TimezoneOffsetColon)], Err(INVALID)); - check("12:34:56", &[fixed(TimezoneOffsetColon)], Err(INVALID)); - check("+1:", &[fixed(TimezoneOffsetColon)], Err(INVALID)); - check("+12:", &[fixed(TimezoneOffsetColon)], Err(TOO_SHORT)); - check("+12:3", &[fixed(TimezoneOffsetColon)], Err(TOO_SHORT)); - check("+12:34", &[fixed(TimezoneOffsetColon)], parsed!(offset: 45_240)); - check("-12:34", &[fixed(TimezoneOffsetColon)], parsed!(offset: -45_240)); - check("−12:34", &[fixed(TimezoneOffsetColon)], parsed!(offset: -45_240)); // MINUS SIGN (U+2212) - check("+12:34:", &[fixed(TimezoneOffsetColon)], Err(TOO_LONG)); - check("+12:34:5", &[fixed(TimezoneOffsetColon)], Err(TOO_LONG)); - check("+12:34:56", &[fixed(TimezoneOffsetColon)], Err(TOO_LONG)); - check("+12:34:56:", &[fixed(TimezoneOffsetColon)], Err(TOO_LONG)); - check("+12:34:56:7", &[fixed(TimezoneOffsetColon)], Err(TOO_LONG)); - check("+12:34:56:78", &[fixed(TimezoneOffsetColon)], Err(TOO_LONG)); - check("+12:3456", &[fixed(TimezoneOffsetColon)], Err(TOO_LONG)); - check("+1234:56", &[fixed(TimezoneOffsetColon)], Err(TOO_LONG)); - check("−12:34", &[fixed(TimezoneOffsetColon)], parsed!(offset: -45_240)); // MINUS SIGN (U+2212) - check("−12 : 34", &[fixed(TimezoneOffsetColon)], parsed!(offset: -45_240)); // MINUS SIGN (U+2212) - check("+12 :34", &[fixed(TimezoneOffsetColon)], parsed!(offset: 45_240)); - check("+12: 34", &[fixed(TimezoneOffsetColon)], parsed!(offset: 45_240)); - check("+12 34", &[fixed(TimezoneOffsetColon)], parsed!(offset: 45_240)); - check("+12: 34", &[fixed(TimezoneOffsetColon)], parsed!(offset: 45_240)); - check("+12 :34", &[fixed(TimezoneOffsetColon)], parsed!(offset: 45_240)); - check("+12 : 34", &[fixed(TimezoneOffsetColon)], parsed!(offset: 45_240)); - check("-12 : 34", &[fixed(TimezoneOffsetColon)], parsed!(offset: -45_240)); - check("+12 : 34", &[fixed(TimezoneOffsetColon)], parsed!(offset: 45_240)); - check("+12 : 34", &[fixed(TimezoneOffsetColon)], parsed!(offset: 45_240)); - check("+12 : 34", &[fixed(TimezoneOffsetColon)], parsed!(offset: 45_240)); - check("+12::34", &[fixed(TimezoneOffsetColon)], parsed!(offset: 45_240)); - check("+12: :34", &[fixed(TimezoneOffsetColon)], parsed!(offset: 45_240)); - check("+12:::34", &[fixed(TimezoneOffsetColon)], parsed!(offset: 45_240)); - check("+12::::34", &[fixed(TimezoneOffsetColon)], parsed!(offset: 45_240)); - check("+12::34", &[fixed(TimezoneOffsetColon)], parsed!(offset: 45_240)); - check("#1234", &[fixed(TimezoneOffsetColon)], Err(INVALID)); - check("#12:34", &[fixed(TimezoneOffsetColon)], Err(INVALID)); - check("+12:34 ", &[fixed(TimezoneOffsetColon)], Err(TOO_LONG)); - check(" +12:34", &[fixed(TimezoneOffsetColon)], parsed!(offset: 45_240)); - check("\t+12:34", &[fixed(TimezoneOffsetColon)], parsed!(offset: 45_240)); - check("\t\t+12:34", &[fixed(TimezoneOffsetColon)], parsed!(offset: 45_240)); - check("12:34 ", &[fixed(TimezoneOffsetColon)], Err(INVALID)); - check(" 12:34", &[fixed(TimezoneOffsetColon)], Err(INVALID)); - check("", &[fixed(TimezoneOffsetColon)], Err(TOO_SHORT)); - check("+", &[fixed(TimezoneOffsetColon)], Err(TOO_SHORT)); - check(":", &[fixed(TimezoneOffsetColon)], Err(INVALID)); - check( - "+12345", - &[fixed(TimezoneOffsetColon), num(Numeric::Day)], - parsed!(offset: 45_240, day: 5), - ); - check( - "+12:345", - &[fixed(TimezoneOffsetColon), num(Numeric::Day)], - parsed!(offset: 45_240, day: 5), - ); - check("+12:34:", &[fixed(TimezoneOffsetColon), Literal(":")], parsed!(offset: 45_240)); - check("Z", &[fixed(TimezoneOffsetColon)], Err(INVALID)); - check("A", &[fixed(TimezoneOffsetColon)], Err(INVALID)); - check("PST", &[fixed(TimezoneOffsetColon)], Err(INVALID)); - check("#Z", &[fixed(TimezoneOffsetColon)], Err(INVALID)); - check(":Z", &[fixed(TimezoneOffsetColon)], Err(INVALID)); - check("+Z", &[fixed(TimezoneOffsetColon)], Err(TOO_SHORT)); - check("+:Z", &[fixed(TimezoneOffsetColon)], Err(INVALID)); - check("+Z:", &[fixed(TimezoneOffsetColon)], Err(INVALID)); - check("z", &[fixed(TimezoneOffsetColon)], Err(INVALID)); - check(" :Z", &[fixed(TimezoneOffsetColon)], Err(INVALID)); - check(" Z", &[fixed(TimezoneOffsetColon)], Err(INVALID)); - check(" z", &[fixed(TimezoneOffsetColon)], Err(INVALID)); - // testing `TimezoneOffsetColon` also tests same path as `TimezoneOffsetDoubleColon` - // and `TimezoneOffsetTripleColon` for function `parse_internal`. - // No need for separate tests for `TimezoneOffsetDoubleColon` and - // `TimezoneOffsetTripleColon`. - - // TimezoneOffsetZ - check("1", &[fixed(TimezoneOffsetZ)], Err(INVALID)); - check("12", &[fixed(TimezoneOffsetZ)], Err(INVALID)); - check("123", &[fixed(TimezoneOffsetZ)], Err(INVALID)); - check("1234", &[fixed(TimezoneOffsetZ)], Err(INVALID)); - check("12345", &[fixed(TimezoneOffsetZ)], Err(INVALID)); - check("123456", &[fixed(TimezoneOffsetZ)], Err(INVALID)); - check("1234567", &[fixed(TimezoneOffsetZ)], Err(INVALID)); - check("12345678", &[fixed(TimezoneOffsetZ)], Err(INVALID)); - check("+1", &[fixed(TimezoneOffsetZ)], Err(TOO_SHORT)); - check("+12", &[fixed(TimezoneOffsetZ)], Err(TOO_SHORT)); - check("+123", &[fixed(TimezoneOffsetZ)], Err(TOO_SHORT)); - check("+1234", &[fixed(TimezoneOffsetZ)], parsed!(offset: 45_240)); - check("-1234", &[fixed(TimezoneOffsetZ)], parsed!(offset: -45_240)); - check("−1234", &[fixed(TimezoneOffsetZ)], parsed!(offset: -45_240)); // MINUS SIGN (U+2212) - check("+12345", &[fixed(TimezoneOffsetZ)], Err(TOO_LONG)); - check("+123456", &[fixed(TimezoneOffsetZ)], Err(TOO_LONG)); - check("+1234567", &[fixed(TimezoneOffsetZ)], Err(TOO_LONG)); - check("+12345678", &[fixed(TimezoneOffsetZ)], Err(TOO_LONG)); - check("1:", &[fixed(TimezoneOffsetZ)], Err(INVALID)); - check("12:", &[fixed(TimezoneOffsetZ)], Err(INVALID)); - check("12:3", &[fixed(TimezoneOffsetZ)], Err(INVALID)); - check("12:34", &[fixed(TimezoneOffsetZ)], Err(INVALID)); - check("12:34:", &[fixed(TimezoneOffsetZ)], Err(INVALID)); - check("12:34:5", &[fixed(TimezoneOffsetZ)], Err(INVALID)); - check("12:34:56", &[fixed(TimezoneOffsetZ)], Err(INVALID)); - check("+1:", &[fixed(TimezoneOffsetZ)], Err(INVALID)); - check("+12:", &[fixed(TimezoneOffsetZ)], Err(TOO_SHORT)); - check("+12:3", &[fixed(TimezoneOffsetZ)], Err(TOO_SHORT)); - check("+12:34", &[fixed(TimezoneOffsetZ)], parsed!(offset: 45_240)); - check("-12:34", &[fixed(TimezoneOffsetZ)], parsed!(offset: -45_240)); - check("−12:34", &[fixed(TimezoneOffsetZ)], parsed!(offset: -45_240)); // MINUS SIGN (U+2212) - check("+12:34:", &[fixed(TimezoneOffsetZ)], Err(TOO_LONG)); - check("+12:34:5", &[fixed(TimezoneOffsetZ)], Err(TOO_LONG)); - check("+12:34:56", &[fixed(TimezoneOffsetZ)], Err(TOO_LONG)); - check("+12:34:56:", &[fixed(TimezoneOffsetZ)], Err(TOO_LONG)); - check("+12:34:56:7", &[fixed(TimezoneOffsetZ)], Err(TOO_LONG)); - check("+12:34:56:78", &[fixed(TimezoneOffsetZ)], Err(TOO_LONG)); - check("+12::34", &[fixed(TimezoneOffsetZ)], parsed!(offset: 45_240)); - check("+12:3456", &[fixed(TimezoneOffsetZ)], Err(TOO_LONG)); - check("+1234:56", &[fixed(TimezoneOffsetZ)], Err(TOO_LONG)); - check("+12 34", &[fixed(TimezoneOffsetZ)], parsed!(offset: 45_240)); - check("+12 34", &[fixed(TimezoneOffsetZ)], parsed!(offset: 45_240)); - check("+12: 34", &[fixed(TimezoneOffsetZ)], parsed!(offset: 45_240)); - check("+12 :34", &[fixed(TimezoneOffsetZ)], parsed!(offset: 45_240)); - check("+12 : 34", &[fixed(TimezoneOffsetZ)], parsed!(offset: 45_240)); - check("+12 : 34", &[fixed(TimezoneOffsetZ)], parsed!(offset: 45_240)); - check("+12 : 34", &[fixed(TimezoneOffsetZ)], parsed!(offset: 45_240)); - check("+12 : 34", &[fixed(TimezoneOffsetZ)], parsed!(offset: 45_240)); - check("12:34 ", &[fixed(TimezoneOffsetZ)], Err(INVALID)); - check(" 12:34", &[fixed(TimezoneOffsetZ)], Err(INVALID)); - check("+12:34 ", &[fixed(TimezoneOffsetZ)], Err(TOO_LONG)); - check("+12 34 ", &[fixed(TimezoneOffsetZ)], Err(TOO_LONG)); - check(" +12:34", &[fixed(TimezoneOffsetZ)], parsed!(offset: 45_240)); - check( - "+12345", - &[fixed(TimezoneOffsetZ), num(Numeric::Day)], - parsed!(offset: 45_240, day: 5), - ); - check( - "+12:345", - &[fixed(TimezoneOffsetZ), num(Numeric::Day)], - parsed!(offset: 45_240, day: 5), - ); - check("+12:34:", &[fixed(TimezoneOffsetZ), Literal(":")], parsed!(offset: 45_240)); - check("Z12:34", &[fixed(TimezoneOffsetZ)], Err(TOO_LONG)); - check("X12:34", &[fixed(TimezoneOffsetZ)], Err(INVALID)); - check("Z", &[fixed(TimezoneOffsetZ)], parsed!(offset: 0)); - check("z", &[fixed(TimezoneOffsetZ)], parsed!(offset: 0)); - check(" Z", &[fixed(TimezoneOffsetZ)], parsed!(offset: 0)); - check(" z", &[fixed(TimezoneOffsetZ)], parsed!(offset: 0)); - check("\u{0363}Z", &[fixed(TimezoneOffsetZ)], Err(INVALID)); - check("Z ", &[fixed(TimezoneOffsetZ)], Err(TOO_LONG)); - check("A", &[fixed(TimezoneOffsetZ)], Err(INVALID)); - check("PST", &[fixed(TimezoneOffsetZ)], Err(INVALID)); - check("#Z", &[fixed(TimezoneOffsetZ)], Err(INVALID)); - check(":Z", &[fixed(TimezoneOffsetZ)], Err(INVALID)); - check(":z", &[fixed(TimezoneOffsetZ)], Err(INVALID)); - check("+Z", &[fixed(TimezoneOffsetZ)], Err(TOO_SHORT)); - check("-Z", &[fixed(TimezoneOffsetZ)], Err(TOO_SHORT)); - check("+A", &[fixed(TimezoneOffsetZ)], Err(TOO_SHORT)); - check("+🙃", &[fixed(TimezoneOffsetZ)], Err(INVALID)); - check("+Z:", &[fixed(TimezoneOffsetZ)], Err(INVALID)); - check(" :Z", &[fixed(TimezoneOffsetZ)], Err(INVALID)); - check(" +Z", &[fixed(TimezoneOffsetZ)], Err(TOO_SHORT)); - check(" -Z", &[fixed(TimezoneOffsetZ)], Err(TOO_SHORT)); - check("+:Z", &[fixed(TimezoneOffsetZ)], Err(INVALID)); - check("Y", &[fixed(TimezoneOffsetZ)], Err(INVALID)); - check("Zulu", &[fixed(TimezoneOffsetZ), Literal("ulu")], parsed!(offset: 0)); - check("zulu", &[fixed(TimezoneOffsetZ), Literal("ulu")], parsed!(offset: 0)); - check("+1234ulu", &[fixed(TimezoneOffsetZ), Literal("ulu")], parsed!(offset: 45_240)); - check("+12:34ulu", &[fixed(TimezoneOffsetZ), Literal("ulu")], parsed!(offset: 45_240)); - // Testing `TimezoneOffsetZ` also tests same path as `TimezoneOffsetColonZ` - // in function `parse_internal`. - // No need for separate tests for `TimezoneOffsetColonZ`. - - // TimezoneOffsetPermissive - check("1", &[internal_fixed(TimezoneOffsetPermissive)], Err(INVALID)); - check("12", &[internal_fixed(TimezoneOffsetPermissive)], Err(INVALID)); - check("123", &[internal_fixed(TimezoneOffsetPermissive)], Err(INVALID)); - check("1234", &[internal_fixed(TimezoneOffsetPermissive)], Err(INVALID)); - check("12345", &[internal_fixed(TimezoneOffsetPermissive)], Err(INVALID)); - check("123456", &[internal_fixed(TimezoneOffsetPermissive)], Err(INVALID)); - check("1234567", &[internal_fixed(TimezoneOffsetPermissive)], Err(INVALID)); - check("12345678", &[internal_fixed(TimezoneOffsetPermissive)], Err(INVALID)); - check("+1", &[internal_fixed(TimezoneOffsetPermissive)], Err(TOO_SHORT)); - check("+12", &[internal_fixed(TimezoneOffsetPermissive)], parsed!(offset: 43_200)); - check("+123", &[internal_fixed(TimezoneOffsetPermissive)], Err(TOO_SHORT)); - check("+1234", &[internal_fixed(TimezoneOffsetPermissive)], parsed!(offset: 45_240)); - check("-1234", &[internal_fixed(TimezoneOffsetPermissive)], parsed!(offset: -45_240)); - check("−1234", &[internal_fixed(TimezoneOffsetPermissive)], parsed!(offset: -45_240)); // MINUS SIGN (U+2212) - check("+12345", &[internal_fixed(TimezoneOffsetPermissive)], Err(TOO_LONG)); - check("+123456", &[internal_fixed(TimezoneOffsetPermissive)], Err(TOO_LONG)); - check("+1234567", &[internal_fixed(TimezoneOffsetPermissive)], Err(TOO_LONG)); - check("+12345678", &[internal_fixed(TimezoneOffsetPermissive)], Err(TOO_LONG)); - check("1:", &[internal_fixed(TimezoneOffsetPermissive)], Err(INVALID)); - check("12:", &[internal_fixed(TimezoneOffsetPermissive)], Err(INVALID)); - check("12:3", &[internal_fixed(TimezoneOffsetPermissive)], Err(INVALID)); - check("12:34", &[internal_fixed(TimezoneOffsetPermissive)], Err(INVALID)); - check("12:34:", &[internal_fixed(TimezoneOffsetPermissive)], Err(INVALID)); - check("12:34:5", &[internal_fixed(TimezoneOffsetPermissive)], Err(INVALID)); - check("12:34:56", &[internal_fixed(TimezoneOffsetPermissive)], Err(INVALID)); - check("+1:", &[internal_fixed(TimezoneOffsetPermissive)], Err(INVALID)); - check("+12:", &[internal_fixed(TimezoneOffsetPermissive)], parsed!(offset: 43_200)); - check("+12:3", &[internal_fixed(TimezoneOffsetPermissive)], Err(TOO_SHORT)); - check("+12:34", &[internal_fixed(TimezoneOffsetPermissive)], parsed!(offset: 45_240)); - check("-12:34", &[internal_fixed(TimezoneOffsetPermissive)], parsed!(offset: -45_240)); - check("−12:34", &[internal_fixed(TimezoneOffsetPermissive)], parsed!(offset: -45_240)); // MINUS SIGN (U+2212) - check("+12:34:", &[internal_fixed(TimezoneOffsetPermissive)], Err(TOO_LONG)); - check("+12:34:5", &[internal_fixed(TimezoneOffsetPermissive)], Err(TOO_LONG)); - check("+12:34:56", &[internal_fixed(TimezoneOffsetPermissive)], Err(TOO_LONG)); - check("+12:34:56:", &[internal_fixed(TimezoneOffsetPermissive)], Err(TOO_LONG)); - check("+12:34:56:7", &[internal_fixed(TimezoneOffsetPermissive)], Err(TOO_LONG)); - check("+12:34:56:78", &[internal_fixed(TimezoneOffsetPermissive)], Err(TOO_LONG)); - check("+12 34", &[internal_fixed(TimezoneOffsetPermissive)], parsed!(offset: 45_240)); - check("+12 34", &[internal_fixed(TimezoneOffsetPermissive)], parsed!(offset: 45_240)); - check("+12 :34", &[internal_fixed(TimezoneOffsetPermissive)], parsed!(offset: 45_240)); - check("+12: 34", &[internal_fixed(TimezoneOffsetPermissive)], parsed!(offset: 45_240)); - check("+12 : 34", &[internal_fixed(TimezoneOffsetPermissive)], parsed!(offset: 45_240)); - check("+12 :34", &[internal_fixed(TimezoneOffsetPermissive)], parsed!(offset: 45_240)); - check("+12: 34", &[internal_fixed(TimezoneOffsetPermissive)], parsed!(offset: 45_240)); - check("+12 : 34", &[internal_fixed(TimezoneOffsetPermissive)], parsed!(offset: 45_240)); - check("+12::34", &[internal_fixed(TimezoneOffsetPermissive)], parsed!(offset: 45_240)); - check("+12 ::34", &[internal_fixed(TimezoneOffsetPermissive)], parsed!(offset: 45_240)); - check("+12: :34", &[internal_fixed(TimezoneOffsetPermissive)], parsed!(offset: 45_240)); - check("+12:: 34", &[internal_fixed(TimezoneOffsetPermissive)], parsed!(offset: 45_240)); - check("+12 ::34", &[internal_fixed(TimezoneOffsetPermissive)], parsed!(offset: 45_240)); - check("+12: :34", &[internal_fixed(TimezoneOffsetPermissive)], parsed!(offset: 45_240)); - check("+12:: 34", &[internal_fixed(TimezoneOffsetPermissive)], parsed!(offset: 45_240)); - check("+12:::34", &[internal_fixed(TimezoneOffsetPermissive)], parsed!(offset: 45_240)); - check("+12::::34", &[internal_fixed(TimezoneOffsetPermissive)], parsed!(offset: 45_240)); - check("12:34 ", &[internal_fixed(TimezoneOffsetPermissive)], Err(INVALID)); - check(" 12:34", &[internal_fixed(TimezoneOffsetPermissive)], Err(INVALID)); - check("+12:34 ", &[internal_fixed(TimezoneOffsetPermissive)], Err(TOO_LONG)); - check(" +12:34", &[internal_fixed(TimezoneOffsetPermissive)], parsed!(offset: 45_240)); - check(" -12:34", &[internal_fixed(TimezoneOffsetPermissive)], parsed!(offset: -45_240)); - check(" −12:34", &[internal_fixed(TimezoneOffsetPermissive)], parsed!(offset: -45_240)); // MINUS SIGN (U+2212) - check( - "+12345", - &[internal_fixed(TimezoneOffsetPermissive), num(Numeric::Day)], - parsed!(offset: 45_240, day: 5), - ); - check( - "+12:345", - &[internal_fixed(TimezoneOffsetPermissive), num(Numeric::Day)], - parsed!(offset: 45_240, day: 5), - ); - check( - "+12:34:", - &[internal_fixed(TimezoneOffsetPermissive), Literal(":")], - parsed!(offset: 45_240), - ); - check("🤠+12:34", &[internal_fixed(TimezoneOffsetPermissive)], Err(INVALID)); - check("+12:34🤠", &[internal_fixed(TimezoneOffsetPermissive)], Err(TOO_LONG)); - check("+12:🤠34", &[internal_fixed(TimezoneOffsetPermissive)], Err(INVALID)); - check( - "+12:34🤠", - &[internal_fixed(TimezoneOffsetPermissive), Literal("🤠")], - parsed!(offset: 45_240), - ); - check( - "🤠+12:34", - &[Literal("🤠"), internal_fixed(TimezoneOffsetPermissive)], - parsed!(offset: 45_240), - ); - check("Z", &[internal_fixed(TimezoneOffsetPermissive)], parsed!(offset: 0)); - check("A", &[internal_fixed(TimezoneOffsetPermissive)], Err(INVALID)); - check("PST", &[internal_fixed(TimezoneOffsetPermissive)], Err(INVALID)); - check("z", &[internal_fixed(TimezoneOffsetPermissive)], parsed!(offset: 0)); - check(" Z", &[internal_fixed(TimezoneOffsetPermissive)], parsed!(offset: 0)); - check(" z", &[internal_fixed(TimezoneOffsetPermissive)], parsed!(offset: 0)); - check("Z ", &[internal_fixed(TimezoneOffsetPermissive)], Err(TOO_LONG)); - check("#Z", &[internal_fixed(TimezoneOffsetPermissive)], Err(INVALID)); - check(":Z", &[internal_fixed(TimezoneOffsetPermissive)], Err(INVALID)); - check(":z", &[internal_fixed(TimezoneOffsetPermissive)], Err(INVALID)); - check("+Z", &[internal_fixed(TimezoneOffsetPermissive)], Err(TOO_SHORT)); - check("-Z", &[internal_fixed(TimezoneOffsetPermissive)], Err(TOO_SHORT)); - check("+A", &[internal_fixed(TimezoneOffsetPermissive)], Err(TOO_SHORT)); - check("+PST", &[internal_fixed(TimezoneOffsetPermissive)], Err(INVALID)); - check("+🙃", &[internal_fixed(TimezoneOffsetPermissive)], Err(INVALID)); - check("+Z:", &[internal_fixed(TimezoneOffsetPermissive)], Err(INVALID)); - check(" :Z", &[internal_fixed(TimezoneOffsetPermissive)], Err(INVALID)); - check(" +Z", &[internal_fixed(TimezoneOffsetPermissive)], Err(TOO_SHORT)); - check(" -Z", &[internal_fixed(TimezoneOffsetPermissive)], Err(TOO_SHORT)); - check("+:Z", &[internal_fixed(TimezoneOffsetPermissive)], Err(INVALID)); - check("Y", &[internal_fixed(TimezoneOffsetPermissive)], Err(INVALID)); - - // TimezoneName - check("CEST", &[fixed(TimezoneName)], parsed!()); - check("cest", &[fixed(TimezoneName)], parsed!()); // lowercase - check("XXXXXXXX", &[fixed(TimezoneName)], parsed!()); // not a real timezone name - check("!!!!", &[fixed(TimezoneName)], parsed!()); // not a real timezone name! - check("CEST 5", &[fixed(TimezoneName), Literal(" "), num(Numeric::Day)], parsed!(day: 5)); - check("CEST ", &[fixed(TimezoneName)], Err(TOO_LONG)); - check(" CEST", &[fixed(TimezoneName)], Err(TOO_LONG)); - check("CE ST", &[fixed(TimezoneName)], Err(TOO_LONG)); - } - - #[test] - #[rustfmt::skip] - fn test_parse_practical_examples() { - use crate::format::InternalInternal::*; - use crate::format::Item::{Literal, Space}; - use crate::format::Numeric::*; - - // some practical examples - check( - "2015-02-04T14:37:05+09:00", - &[ - num(Year), Literal("-"), num(Month), Literal("-"), num(Day), Literal("T"), - num(Hour), Literal(":"), num(Minute), Literal(":"), num(Second), - fixed(Fixed::TimezoneOffset), - ], - parsed!( - year: 2015, month: 2, day: 4, hour_div_12: 1, hour_mod_12: 2, minute: 37, - second: 5, offset: 32400 - ), - ); - check( - "2015-02-04T14:37:05-09:00", - &[ - num(Year), Literal("-"), num(Month), Literal("-"), num(Day), Literal("T"), - num(Hour), Literal(":"), num(Minute), Literal(":"), num(Second), - fixed(Fixed::TimezoneOffset), - ], - parsed!( - year: 2015, month: 2, day: 4, hour_div_12: 1, hour_mod_12: 2, minute: 37, - second: 5, offset: -32400 - ), - ); - check( - "2015-02-04T14:37:05−09:00", // timezone offset using MINUS SIGN (U+2212) - &[ - num(Year), Literal("-"), num(Month), Literal("-"), num(Day), Literal("T"), - num(Hour), Literal(":"), num(Minute), Literal(":"), num(Second), - fixed(Fixed::TimezoneOffset) - ], - parsed!( - year: 2015, month: 2, day: 4, hour_div_12: 1, hour_mod_12: 2, minute: 37, - second: 5, offset: -32400 - ), - ); - check( - "20150204143705567", - &[ - num(Year), num(Month), num(Day), num(Hour), num(Minute), num(Second), - internal_fixed(Nanosecond3NoDot) - ], - parsed!( - year: 2015, month: 2, day: 4, hour_div_12: 1, hour_mod_12: 2, minute: 37, - second: 5, nanosecond: 567000000 - ), - ); - check( - "Mon, 10 Jun 2013 09:32:37 GMT", - &[ - fixed(Fixed::ShortWeekdayName), Literal(","), Space(" "), num(Day), Space(" "), - fixed(Fixed::ShortMonthName), Space(" "), num(Year), Space(" "), num(Hour), - Literal(":"), num(Minute), Literal(":"), num(Second), Space(" "), Literal("GMT") - ], - parsed!( - year: 2013, month: 6, day: 10, weekday: Weekday::Mon, - hour_div_12: 0, hour_mod_12: 9, minute: 32, second: 37 - ), - ); - check( - "🤠Mon, 10 Jun🤠2013 09:32:37 GMT🤠", - &[ - Literal("🤠"), fixed(Fixed::ShortWeekdayName), Literal(","), Space(" "), num(Day), - Space(" "), fixed(Fixed::ShortMonthName), Literal("🤠"), num(Year), Space(" "), - num(Hour), Literal(":"), num(Minute), Literal(":"), num(Second), Space(" "), - Literal("GMT"), Literal("🤠") - ], - parsed!( - year: 2013, month: 6, day: 10, weekday: Weekday::Mon, - hour_div_12: 0, hour_mod_12: 9, minute: 32, second: 37 - ), - ); - check( - "Sun Aug 02 13:39:15 CEST 2020", - &[ - fixed(Fixed::ShortWeekdayName), Space(" "), fixed(Fixed::ShortMonthName), - Space(" "), num(Day), Space(" "), num(Hour), Literal(":"), num(Minute), - Literal(":"), num(Second), Space(" "), fixed(Fixed::TimezoneName), Space(" "), - num(Year) - ], - parsed!( - year: 2020, month: 8, day: 2, weekday: Weekday::Sun, - hour_div_12: 1, hour_mod_12: 1, minute: 39, second: 15 - ), - ); - check( - "20060102150405", - &[num(Year), num(Month), num(Day), num(Hour), num(Minute), num(Second)], - parsed!( - year: 2006, month: 1, day: 2, hour_div_12: 1, hour_mod_12: 3, minute: 4, second: 5 - ), - ); - check( - "3:14PM", - &[num(Hour12), Literal(":"), num(Minute), fixed(Fixed::LowerAmPm)], - parsed!(hour_div_12: 1, hour_mod_12: 3, minute: 14), - ); - check( - "12345678901234.56789", - &[num(Timestamp), Literal("."), num(Nanosecond)], - parsed!(nanosecond: 56_789, timestamp: 12_345_678_901_234), - ); - check( - "12345678901234.56789", - &[num(Timestamp), fixed(Fixed::Nanosecond)], - parsed!(nanosecond: 567_890_000, timestamp: 12_345_678_901_234), - ); + // empty string + check!("", []; ); + check!(" ", []; TOO_LONG); + check!("a", []; TOO_LONG); + + // whitespaces + check!("", [sp!("")]; ); + check!(" ", [sp!("")]; ); + check!("\t", [sp!("")]; ); + check!(" \n\r \n", [sp!("")]; ); + check!("a", [sp!("")]; TOO_LONG); + + // literal + check!("", [lit!("a")]; TOO_SHORT); + check!(" ", [lit!("a")]; INVALID); + check!("a", [lit!("a")]; ); + check!("aa", [lit!("a")]; TOO_LONG); + check!("A", [lit!("a")]; INVALID); + check!("xy", [lit!("xy")]; ); + check!("xy", [lit!("x"), lit!("y")]; ); + check!("x y", [lit!("x"), lit!("y")]; INVALID); + check!("xy", [lit!("x"), sp!(""), lit!("y")]; ); + check!("x y", [lit!("x"), sp!(""), lit!("y")]; ); + + // numeric + check!("1987", [num!(Year)]; year: 1987); + check!("1987 ", [num!(Year)]; TOO_LONG); + check!("0x12", [num!(Year)]; TOO_LONG); // `0` is parsed + check!("x123", [num!(Year)]; INVALID); + check!("2015", [num!(Year)]; year: 2015); + check!("0000", [num!(Year)]; year: 0); + check!("9999", [num!(Year)]; year: 9999); + check!(" \t987", [num!(Year)]; year: 987); + check!("5", [num!(Year)]; year: 5); + check!("5\0", [num!(Year)]; TOO_LONG); + check!("\x005", [num!(Year)]; INVALID); + check!("", [num!(Year)]; TOO_SHORT); + check!("12345", [num!(Year), lit!("5")]; year: 1234); + check!("12345", [nums!(Year), lit!("5")]; year: 1234); + check!("12345", [num0!(Year), lit!("5")]; year: 1234); + check!("12341234", [num!(Year), num!(Year)]; year: 1234); + check!("1234 1234", [num!(Year), num!(Year)]; year: 1234); + check!("1234 1235", [num!(Year), num!(Year)]; IMPOSSIBLE); + check!("1234 1234", [num!(Year), lit!("x"), num!(Year)]; INVALID); + check!("1234x1234", [num!(Year), lit!("x"), num!(Year)]; year: 1234); + check!("1234xx1234", [num!(Year), lit!("x"), num!(Year)]; INVALID); + check!("1234 x 1234", [num!(Year), lit!("x"), num!(Year)]; INVALID); + + // signed numeric + check!("-42", [num!(Year)]; year: -42); + check!("+42", [num!(Year)]; year: 42); + check!("-0042", [num!(Year)]; year: -42); + check!("+0042", [num!(Year)]; year: 42); + check!("-42195", [num!(Year)]; year: -42195); + check!("+42195", [num!(Year)]; year: 42195); + check!(" -42195", [num!(Year)]; year: -42195); + check!(" +42195", [num!(Year)]; year: 42195); + check!(" - 42", [num!(Year)]; INVALID); + check!(" + 42", [num!(Year)]; INVALID); + check!("-", [num!(Year)]; TOO_SHORT); + check!("+", [num!(Year)]; TOO_SHORT); + + // unsigned numeric + check!("345", [num!(Ordinal)]; ordinal: 345); + check!("+345", [num!(Ordinal)]; INVALID); + check!("-345", [num!(Ordinal)]; INVALID); + check!(" 345", [num!(Ordinal)]; ordinal: 345); + check!(" +345", [num!(Ordinal)]; INVALID); + check!(" -345", [num!(Ordinal)]; INVALID); + + // various numeric fields + check!("1234 5678", + [num!(Year), num!(IsoYear)]; + year: 1234, isoyear: 5678); + check!("12 34 56 78", + [num!(YearDiv100), num!(YearMod100), num!(IsoYearDiv100), num!(IsoYearMod100)]; + year_div_100: 12, year_mod_100: 34, isoyear_div_100: 56, isoyear_mod_100: 78); + check!("1 2 3 4 5 6", + [num!(Month), num!(Day), num!(WeekFromSun), num!(WeekFromMon), num!(IsoWeek), + num!(NumDaysFromSun)]; + month: 1, day: 2, week_from_sun: 3, week_from_mon: 4, isoweek: 5, weekday: Weekday::Sat); + check!("7 89 01", + [num!(WeekdayFromMon), num!(Ordinal), num!(Hour12)]; + weekday: Weekday::Sun, ordinal: 89, hour_mod_12: 1); + check!("23 45 6 78901234 567890123", + [num!(Hour), num!(Minute), num!(Second), num!(Nanosecond), num!(Timestamp)]; + hour_div_12: 1, hour_mod_12: 11, minute: 45, second: 6, nanosecond: 78_901_234, + timestamp: 567_890_123); + + // fixed: month and weekday names + check!("apr", [fix!(ShortMonthName)]; month: 4); + check!("Apr", [fix!(ShortMonthName)]; month: 4); + check!("APR", [fix!(ShortMonthName)]; month: 4); + check!("ApR", [fix!(ShortMonthName)]; month: 4); + check!("April", [fix!(ShortMonthName)]; TOO_LONG); // `Apr` is parsed + check!("A", [fix!(ShortMonthName)]; TOO_SHORT); + check!("Sol", [fix!(ShortMonthName)]; INVALID); + check!("Apr", [fix!(LongMonthName)]; month: 4); + check!("Apri", [fix!(LongMonthName)]; TOO_LONG); // `Apr` is parsed + check!("April", [fix!(LongMonthName)]; month: 4); + check!("Aprill", [fix!(LongMonthName)]; TOO_LONG); + check!("Aprill", [fix!(LongMonthName), lit!("l")]; month: 4); + check!("Aprl", [fix!(LongMonthName), lit!("l")]; month: 4); + check!("April", [fix!(LongMonthName), lit!("il")]; TOO_SHORT); // do not backtrack + check!("thu", [fix!(ShortWeekdayName)]; weekday: Weekday::Thu); + check!("Thu", [fix!(ShortWeekdayName)]; weekday: Weekday::Thu); + check!("THU", [fix!(ShortWeekdayName)]; weekday: Weekday::Thu); + check!("tHu", [fix!(ShortWeekdayName)]; weekday: Weekday::Thu); + check!("Thursday", [fix!(ShortWeekdayName)]; TOO_LONG); // `Thu` is parsed + check!("T", [fix!(ShortWeekdayName)]; TOO_SHORT); + check!("The", [fix!(ShortWeekdayName)]; INVALID); + check!("Nop", [fix!(ShortWeekdayName)]; INVALID); + check!("Thu", [fix!(LongWeekdayName)]; weekday: Weekday::Thu); + check!("Thur", [fix!(LongWeekdayName)]; TOO_LONG); // `Thu` is parsed + check!("Thurs", [fix!(LongWeekdayName)]; TOO_LONG); // ditto + check!("Thursday", [fix!(LongWeekdayName)]; weekday: Weekday::Thu); + check!("Thursdays", [fix!(LongWeekdayName)]; TOO_LONG); + check!("Thursdays", [fix!(LongWeekdayName), lit!("s")]; weekday: Weekday::Thu); + check!("Thus", [fix!(LongWeekdayName), lit!("s")]; weekday: Weekday::Thu); + check!("Thursday", [fix!(LongWeekdayName), lit!("rsday")]; TOO_SHORT); // do not backtrack + + // fixed: am/pm + check!("am", [fix!(LowerAmPm)]; hour_div_12: 0); + check!("pm", [fix!(LowerAmPm)]; hour_div_12: 1); + check!("AM", [fix!(LowerAmPm)]; hour_div_12: 0); + check!("PM", [fix!(LowerAmPm)]; hour_div_12: 1); + check!("am", [fix!(UpperAmPm)]; hour_div_12: 0); + check!("pm", [fix!(UpperAmPm)]; hour_div_12: 1); + check!("AM", [fix!(UpperAmPm)]; hour_div_12: 0); + check!("PM", [fix!(UpperAmPm)]; hour_div_12: 1); + check!("Am", [fix!(LowerAmPm)]; hour_div_12: 0); + check!(" Am", [fix!(LowerAmPm)]; INVALID); + check!("ame", [fix!(LowerAmPm)]; TOO_LONG); // `am` is parsed + check!("a", [fix!(LowerAmPm)]; TOO_SHORT); + check!("p", [fix!(LowerAmPm)]; TOO_SHORT); + check!("x", [fix!(LowerAmPm)]; TOO_SHORT); + check!("xx", [fix!(LowerAmPm)]; INVALID); + check!("", [fix!(LowerAmPm)]; TOO_SHORT); + + // fixed: dot plus nanoseconds + check!("", [fix!(Nanosecond)]; ); // no field set, but not an error + check!(".", [fix!(Nanosecond)]; TOO_SHORT); + check!("4", [fix!(Nanosecond)]; TOO_LONG); // never consumes `4` + check!("4", [fix!(Nanosecond), num!(Second)]; second: 4); + check!(".0", [fix!(Nanosecond)]; nanosecond: 0); + check!(".4", [fix!(Nanosecond)]; nanosecond: 400_000_000); + check!(".42", [fix!(Nanosecond)]; nanosecond: 420_000_000); + check!(".421", [fix!(Nanosecond)]; nanosecond: 421_000_000); + check!(".42195", [fix!(Nanosecond)]; nanosecond: 421_950_000); + check!(".421950803", [fix!(Nanosecond)]; nanosecond: 421_950_803); + check!(".421950803547", [fix!(Nanosecond)]; nanosecond: 421_950_803); + check!(".000000003547", [fix!(Nanosecond)]; nanosecond: 3); + check!(".000000000547", [fix!(Nanosecond)]; nanosecond: 0); + check!(".", [fix!(Nanosecond)]; TOO_SHORT); + check!(".4x", [fix!(Nanosecond)]; TOO_LONG); + check!(". 4", [fix!(Nanosecond)]; INVALID); + check!(" .4", [fix!(Nanosecond)]; TOO_LONG); // no automatic trimming + + // fixed: nanoseconds without the dot + check!("", [internal_fix!(Nanosecond3NoDot)]; TOO_SHORT); + check!(".", [internal_fix!(Nanosecond3NoDot)]; TOO_SHORT); + check!("0", [internal_fix!(Nanosecond3NoDot)]; TOO_SHORT); + check!("4", [internal_fix!(Nanosecond3NoDot)]; TOO_SHORT); + check!("42", [internal_fix!(Nanosecond3NoDot)]; TOO_SHORT); + check!("421", [internal_fix!(Nanosecond3NoDot)]; nanosecond: 421_000_000); + check!("42143", [internal_fix!(Nanosecond3NoDot), num!(Second)]; nanosecond: 421_000_000, second: 43); + check!("42195", [internal_fix!(Nanosecond3NoDot)]; TOO_LONG); + check!("4x", [internal_fix!(Nanosecond3NoDot)]; TOO_SHORT); + check!(" 4", [internal_fix!(Nanosecond3NoDot)]; INVALID); + check!(".421", [internal_fix!(Nanosecond3NoDot)]; INVALID); + + check!("", [internal_fix!(Nanosecond6NoDot)]; TOO_SHORT); + check!(".", [internal_fix!(Nanosecond6NoDot)]; TOO_SHORT); + check!("0", [internal_fix!(Nanosecond6NoDot)]; TOO_SHORT); + check!("42195", [internal_fix!(Nanosecond6NoDot)]; TOO_SHORT); + check!("421950", [internal_fix!(Nanosecond6NoDot)]; nanosecond: 421_950_000); + check!("000003", [internal_fix!(Nanosecond6NoDot)]; nanosecond: 3000); + check!("000000", [internal_fix!(Nanosecond6NoDot)]; nanosecond: 0); + check!("4x", [internal_fix!(Nanosecond6NoDot)]; TOO_SHORT); + check!(" 4", [internal_fix!(Nanosecond6NoDot)]; INVALID); + check!(".42100", [internal_fix!(Nanosecond6NoDot)]; INVALID); + + check!("", [internal_fix!(Nanosecond9NoDot)]; TOO_SHORT); + check!(".", [internal_fix!(Nanosecond9NoDot)]; TOO_SHORT); + check!("42195", [internal_fix!(Nanosecond9NoDot)]; TOO_SHORT); + check!("421950803", [internal_fix!(Nanosecond9NoDot)]; nanosecond: 421_950_803); + check!("000000003", [internal_fix!(Nanosecond9NoDot)]; nanosecond: 3); + check!("42195080354", [internal_fix!(Nanosecond9NoDot), num!(Second)]; nanosecond: 421_950_803, second: 54); // don't skip digits that come after the 9 + check!("421950803547", [internal_fix!(Nanosecond9NoDot)]; TOO_LONG); + check!("000000000", [internal_fix!(Nanosecond9NoDot)]; nanosecond: 0); + check!("00000000x", [internal_fix!(Nanosecond9NoDot)]; INVALID); + check!(" 4", [internal_fix!(Nanosecond9NoDot)]; INVALID); + check!(".42100000", [internal_fix!(Nanosecond9NoDot)]; INVALID); + + // fixed: timezone offsets + check!("+00:00", [fix!(TimezoneOffset)]; offset: 0); + check!("-00:00", [fix!(TimezoneOffset)]; offset: 0); + check!("+00:01", [fix!(TimezoneOffset)]; offset: 60); + check!("-00:01", [fix!(TimezoneOffset)]; offset: -60); + check!("+00:30", [fix!(TimezoneOffset)]; offset: 30 * 60); + check!("-00:30", [fix!(TimezoneOffset)]; offset: -30 * 60); + check!("+04:56", [fix!(TimezoneOffset)]; offset: 296 * 60); + check!("-04:56", [fix!(TimezoneOffset)]; offset: -296 * 60); + check!("+24:00", [fix!(TimezoneOffset)]; offset: 24 * 60 * 60); + check!("-24:00", [fix!(TimezoneOffset)]; offset: -24 * 60 * 60); + check!("+99:59", [fix!(TimezoneOffset)]; offset: (100 * 60 - 1) * 60); + check!("-99:59", [fix!(TimezoneOffset)]; offset: -(100 * 60 - 1) * 60); + check!("+00:59", [fix!(TimezoneOffset)]; offset: 59 * 60); + check!("+00:60", [fix!(TimezoneOffset)]; OUT_OF_RANGE); + check!("+00:99", [fix!(TimezoneOffset)]; OUT_OF_RANGE); + check!("#12:34", [fix!(TimezoneOffset)]; INVALID); + check!("12:34", [fix!(TimezoneOffset)]; INVALID); + check!("+12:34 ", [fix!(TimezoneOffset)]; TOO_LONG); + check!(" +12:34", [fix!(TimezoneOffset)]; offset: 754 * 60); + check!("\t -12:34", [fix!(TimezoneOffset)]; offset: -754 * 60); + check!("", [fix!(TimezoneOffset)]; TOO_SHORT); + check!("+", [fix!(TimezoneOffset)]; TOO_SHORT); + check!("+1", [fix!(TimezoneOffset)]; TOO_SHORT); + check!("+12", [fix!(TimezoneOffset)]; TOO_SHORT); + check!("+123", [fix!(TimezoneOffset)]; TOO_SHORT); + check!("+1234", [fix!(TimezoneOffset)]; offset: 754 * 60); + check!("+12345", [fix!(TimezoneOffset)]; TOO_LONG); + check!("+12345", [fix!(TimezoneOffset), num!(Day)]; offset: 754 * 60, day: 5); + check!("Z", [fix!(TimezoneOffset)]; INVALID); + check!("z", [fix!(TimezoneOffset)]; INVALID); + check!("Z", [fix!(TimezoneOffsetZ)]; offset: 0); + check!("z", [fix!(TimezoneOffsetZ)]; offset: 0); + check!("Y", [fix!(TimezoneOffsetZ)]; INVALID); + check!("Zulu", [fix!(TimezoneOffsetZ), lit!("ulu")]; offset: 0); + check!("zulu", [fix!(TimezoneOffsetZ), lit!("ulu")]; offset: 0); + check!("+1234ulu", [fix!(TimezoneOffsetZ), lit!("ulu")]; offset: 754 * 60); + check!("+12:34ulu", [fix!(TimezoneOffsetZ), lit!("ulu")]; offset: 754 * 60); + check!("Z", [internal_fix!(TimezoneOffsetPermissive)]; offset: 0); + check!("z", [internal_fix!(TimezoneOffsetPermissive)]; offset: 0); + check!("+12:00", [internal_fix!(TimezoneOffsetPermissive)]; offset: 12 * 60 * 60); + check!("+12", [internal_fix!(TimezoneOffsetPermissive)]; offset: 12 * 60 * 60); + check!("CEST 5", [fix!(TimezoneName), lit!(" "), num!(Day)]; day: 5); + + // some practical examples + check!("2015-02-04T14:37:05+09:00", + [num!(Year), lit!("-"), num!(Month), lit!("-"), num!(Day), lit!("T"), + num!(Hour), lit!(":"), num!(Minute), lit!(":"), num!(Second), fix!(TimezoneOffset)]; + year: 2015, month: 2, day: 4, hour_div_12: 1, hour_mod_12: 2, + minute: 37, second: 5, offset: 32400); + check!("20150204143705567", + [num!(Year), num!(Month), num!(Day), + num!(Hour), num!(Minute), num!(Second), internal_fix!(Nanosecond3NoDot)]; + year: 2015, month: 2, day: 4, hour_div_12: 1, hour_mod_12: 2, + minute: 37, second: 5, nanosecond: 567000000); + check!("Mon, 10 Jun 2013 09:32:37 GMT", + [fix!(ShortWeekdayName), lit!(","), sp!(" "), num!(Day), sp!(" "), + fix!(ShortMonthName), sp!(" "), num!(Year), sp!(" "), num!(Hour), lit!(":"), + num!(Minute), lit!(":"), num!(Second), sp!(" "), lit!("GMT")]; + year: 2013, month: 6, day: 10, weekday: Weekday::Mon, + hour_div_12: 0, hour_mod_12: 9, minute: 32, second: 37); + check!("Sun Aug 02 13:39:15 CEST 2020", + [fix!(ShortWeekdayName), sp!(" "), fix!(ShortMonthName), sp!(" "), + num!(Day), sp!(" "), num!(Hour), lit!(":"), num!(Minute), lit!(":"), + num!(Second), sp!(" "), fix!(TimezoneName), sp!(" "), num!(Year)]; + year: 2020, month: 8, day: 2, weekday: Weekday::Sun, + hour_div_12: 1, hour_mod_12: 1, minute: 39, second: 15); + check!("20060102150405", + [num!(Year), num!(Month), num!(Day), num!(Hour), num!(Minute), num!(Second)]; + year: 2006, month: 1, day: 2, hour_div_12: 1, hour_mod_12: 3, minute: 4, second: 5); + check!("3:14PM", + [num!(Hour12), lit!(":"), num!(Minute), fix!(LowerAmPm)]; + hour_div_12: 1, hour_mod_12: 3, minute: 14); + check!("12345678901234.56789", + [num!(Timestamp), lit!("."), num!(Nanosecond)]; + nanosecond: 56_789, timestamp: 12_345_678_901_234); + check!("12345678901234.56789", + [num!(Timestamp), fix!(Nanosecond)]; + nanosecond: 567_890_000, timestamp: 12_345_678_901_234); +} - // docstring examples from `impl str::FromStr` - check( - "2000-01-02T03:04:05Z", - &[ - num(Year), Literal("-"), num(Month), Literal("-"), num(Day), Literal("T"), - num(Hour), Literal(":"), num(Minute), Literal(":"), num(Second), - internal_fixed(TimezoneOffsetPermissive) - ], - parsed!( - year: 2000, month: 1, day: 2, hour_div_12: 0, hour_mod_12: 3, minute: 4, second: 5, - offset: 0 - ), - ); - check( - "2000-01-02 03:04:05Z", - &[ - num(Year), Literal("-"), num(Month), Literal("-"), num(Day), Space(" "), - num(Hour), Literal(":"), num(Minute), Literal(":"), num(Second), - internal_fixed(TimezoneOffsetPermissive) - ], - parsed!( - year: 2000, month: 1, day: 2, hour_div_12: 0, hour_mod_12: 3, minute: 4, second: 5, - offset: 0 - ), - ); - } +#[cfg(test)] +#[test] +fn test_rfc2822() { + use super::NOT_ENOUGH; + use super::*; + use crate::offset::FixedOffset; + use crate::DateTime; + + // Test data - (input, Ok(expected result after parse and format) or Err(error code)) + let testdates = [ + ("Tue, 20 Jan 2015 17:35:20 -0800", Ok("Tue, 20 Jan 2015 17:35:20 -0800")), // normal case + ("Fri, 2 Jan 2015 17:35:20 -0800", Ok("Fri, 02 Jan 2015 17:35:20 -0800")), // folding whitespace + ("Fri, 02 Jan 2015 17:35:20 -0800", Ok("Fri, 02 Jan 2015 17:35:20 -0800")), // leading zero + ("Tue, 20 Jan 2015 17:35:20 -0800 (UTC)", Ok("Tue, 20 Jan 2015 17:35:20 -0800")), // trailing comment + ( + r"Tue, 20 Jan 2015 17:35:20 -0800 ( (UTC ) (\( (a)\(( \t ) ) \\( \) ))", + Ok("Tue, 20 Jan 2015 17:35:20 -0800"), + ), // complex trailing comment + (r"Tue, 20 Jan 2015 17:35:20 -0800 (UTC\)", Err(TOO_LONG)), // incorrect comment, not enough closing parentheses + ( + "Tue, 20 Jan 2015 17:35:20 -0800 (UTC)\t \r\n(Anothercomment)", + Ok("Tue, 20 Jan 2015 17:35:20 -0800"), + ), // multiple comments + ("Tue, 20 Jan 2015 17:35:20 -0800 (UTC) ", Err(TOO_LONG)), // trailing whitespace after comment + ("20 Jan 2015 17:35:20 -0800", Ok("Tue, 20 Jan 2015 17:35:20 -0800")), // no day of week + ("20 JAN 2015 17:35:20 -0800", Ok("Tue, 20 Jan 2015 17:35:20 -0800")), // upper case month + ("Tue, 20 Jan 2015 17:35 -0800", Ok("Tue, 20 Jan 2015 17:35:00 -0800")), // no second + ("11 Sep 2001 09:45:00 EST", Ok("Tue, 11 Sep 2001 09:45:00 -0500")), + ("30 Feb 2015 17:35:20 -0800", Err(OUT_OF_RANGE)), // bad day of month + ("Tue, 20 Jan 2015", Err(TOO_SHORT)), // omitted fields + ("Tue, 20 Avr 2015 17:35:20 -0800", Err(INVALID)), // bad month name + ("Tue, 20 Jan 2015 25:35:20 -0800", Err(OUT_OF_RANGE)), // bad hour + ("Tue, 20 Jan 2015 7:35:20 -0800", Err(INVALID)), // bad # of digits in hour + ("Tue, 20 Jan 2015 17:65:20 -0800", Err(OUT_OF_RANGE)), // bad minute + ("Tue, 20 Jan 2015 17:35:90 -0800", Err(OUT_OF_RANGE)), // bad second + ("Tue, 20 Jan 2015 17:35:20 -0890", Err(OUT_OF_RANGE)), // bad offset + ("6 Jun 1944 04:00:00Z", Err(INVALID)), // bad offset (zulu not allowed) + ("Tue, 20 Jan 2015 17:35:20 HAS", Err(NOT_ENOUGH)), // bad named time zone + // named timezones that have specific timezone offsets + // see https://www.rfc-editor.org/rfc/rfc2822#section-4.3 + ("Tue, 20 Jan 2015 17:35:20 GMT", Ok("Tue, 20 Jan 2015 17:35:20 +0000")), + ("Tue, 20 Jan 2015 17:35:20 UT", Ok("Tue, 20 Jan 2015 17:35:20 +0000")), + ("Tue, 20 Jan 2015 17:35:20 ut", Ok("Tue, 20 Jan 2015 17:35:20 +0000")), + ("Tue, 20 Jan 2015 17:35:20 EDT", Ok("Tue, 20 Jan 2015 17:35:20 -0400")), + ("Tue, 20 Jan 2015 17:35:20 EST", Ok("Tue, 20 Jan 2015 17:35:20 -0500")), + ("Tue, 20 Jan 2015 17:35:20 CDT", Ok("Tue, 20 Jan 2015 17:35:20 -0500")), + ("Tue, 20 Jan 2015 17:35:20 CST", Ok("Tue, 20 Jan 2015 17:35:20 -0600")), + ("Tue, 20 Jan 2015 17:35:20 MDT", Ok("Tue, 20 Jan 2015 17:35:20 -0600")), + ("Tue, 20 Jan 2015 17:35:20 MST", Ok("Tue, 20 Jan 2015 17:35:20 -0700")), + ("Tue, 20 Jan 2015 17:35:20 PDT", Ok("Tue, 20 Jan 2015 17:35:20 -0700")), + ("Tue, 20 Jan 2015 17:35:20 PST", Ok("Tue, 20 Jan 2015 17:35:20 -0800")), + ("Tue, 20 Jan 2015 17:35:20 pst", Ok("Tue, 20 Jan 2015 17:35:20 -0800")), + // named single-letter military timezones must fallback to +0000 + ("Tue, 20 Jan 2015 17:35:20 Z", Ok("Tue, 20 Jan 2015 17:35:20 +0000")), + ("Tue, 20 Jan 2015 17:35:20 A", Ok("Tue, 20 Jan 2015 17:35:20 +0000")), + ("Tue, 20 Jan 2015 17:35:20 a", Ok("Tue, 20 Jan 2015 17:35:20 +0000")), + ("Tue, 20 Jan 2015 17:35:20 K", Ok("Tue, 20 Jan 2015 17:35:20 +0000")), + ("Tue, 20 Jan 2015 17:35:20 k", Ok("Tue, 20 Jan 2015 17:35:20 +0000")), + // named single-letter timezone "J" is specifically not valid + ("Tue, 20 Jan 2015 17:35:20 J", Err(NOT_ENOUGH)), + ]; - #[track_caller] - fn parses(s: &str, items: &[Item]) { + fn rfc2822_to_datetime(date: &str) -> ParseResult> { let mut parsed = Parsed::new(); - assert!(parse(&mut parsed, s, items.iter()).is_ok()); + parse(&mut parsed, date, [Item::Fixed(Fixed::RFC2822)].iter())?; + parsed.to_datetime() } - #[track_caller] - fn check(s: &str, items: &[Item], expected: ParseResult) { - let mut parsed = Parsed::new(); - let result = parse(&mut parsed, s, items.iter()); - let parsed = result.map(|_| parsed); - assert_eq!(parsed, expected); + fn fmt_rfc2822_datetime(dt: DateTime) -> String { + dt.format_with_items([Item::Fixed(Fixed::RFC2822)].iter()).to_string() } - #[test] - fn test_rfc2822() { - let ymd_hmsn = |y, m, d, h, n, s, nano, off| { - FixedOffset::east_opt(off * 60 * 60) - .unwrap() - .with_ymd_and_hms(y, m, d, h, n, s) - .unwrap() - .with_nanosecond(nano) - .unwrap() + // Test against test data above + for &(date, checkdate) in testdates.iter() { + let d = rfc2822_to_datetime(date); // parse a date + let dt = match d { + // did we get a value? + Ok(dt) => Ok(fmt_rfc2822_datetime(dt)), // yes, go on + Err(e) => Err(e), // otherwise keep an error for the comparison }; - - // Test data - (input, Ok(expected result) or Err(error code)) - let testdates = [ - ("Tue, 20 Jan 2015 17:35:20 -0800", Ok(ymd_hmsn(2015, 1, 20, 17, 35, 20, 0, -8))), // normal case - ("Fri, 2 Jan 2015 17:35:20 -0800", Ok(ymd_hmsn(2015, 1, 2, 17, 35, 20, 0, -8))), // folding whitespace - ("Fri, 02 Jan 2015 17:35:20 -0800", Ok(ymd_hmsn(2015, 1, 2, 17, 35, 20, 0, -8))), // leading zero - ("Tue, 20 Jan 2015 17:35:20 -0800 (UTC)", Ok(ymd_hmsn(2015, 1, 20, 17, 35, 20, 0, -8))), // trailing comment - ( - r"Tue, 20 Jan 2015 17:35:20 -0800 ( (UTC ) (\( (a)\(( \t ) ) \\( \) ))", - Ok(ymd_hmsn(2015, 1, 20, 17, 35, 20, 0, -8)), - ), // complex trailing comment - (r"Tue, 20 Jan 2015 17:35:20 -0800 (UTC\)", Err(TOO_LONG)), // incorrect comment, not enough closing parentheses - ( - "Tue, 20 Jan 2015 17:35:20 -0800 (UTC)\t \r\n(Anothercomment)", - Ok(ymd_hmsn(2015, 1, 20, 17, 35, 20, 0, -8)), - ), // multiple comments - ("Tue, 20 Jan 2015 17:35:20 -0800 (UTC) ", Err(TOO_LONG)), // trailing whitespace after comment - ("20 Jan 2015 17:35:20 -0800", Ok(ymd_hmsn(2015, 1, 20, 17, 35, 20, 0, -8))), // no day of week - ("20 JAN 2015 17:35:20 -0800", Ok(ymd_hmsn(2015, 1, 20, 17, 35, 20, 0, -8))), // upper case month - ("Tue, 20 Jan 2015 17:35 -0800", Ok(ymd_hmsn(2015, 1, 20, 17, 35, 0, 0, -8))), // no second - ("11 Sep 2001 09:45:00 +0000", Ok(ymd_hmsn(2001, 9, 11, 9, 45, 0, 0, 0))), - ("11 Sep 2001 09:45:00 EST", Ok(ymd_hmsn(2001, 9, 11, 9, 45, 0, 0, -5))), - ("11 Sep 2001 09:45:00 GMT", Ok(ymd_hmsn(2001, 9, 11, 9, 45, 0, 0, 0))), - ("30 Feb 2015 17:35:20 -0800", Err(OUT_OF_RANGE)), // bad day of month - ("Tue, 20 Jan 2015", Err(TOO_SHORT)), // omitted fields - ("Tue, 20 Avr 2015 17:35:20 -0800", Err(INVALID)), // bad month name - ("Tue, 20 Jan 2015 25:35:20 -0800", Err(OUT_OF_RANGE)), // bad hour - ("Tue, 20 Jan 2015 7:35:20 -0800", Err(INVALID)), // bad # of digits in hour - ("Tue, 20 Jan 2015 17:65:20 -0800", Err(OUT_OF_RANGE)), // bad minute - ("Tue, 20 Jan 2015 17:35:90 -0800", Err(OUT_OF_RANGE)), // bad second - ("Tue, 20 Jan 2015 17:35:20 -0890", Err(OUT_OF_RANGE)), // bad offset - ("6 Jun 1944 04:00:00Z", Err(INVALID)), // bad offset (zulu not allowed) - ("Tue, 20 Jan 2015 17:35:20 HAS", Err(NOT_ENOUGH)), // bad named time zone - // named timezones that have specific timezone offsets - // see https://www.rfc-editor.org/rfc/rfc2822#section-4.3 - ("Tue, 20 Jan 2015 17:35:20 GMT", Ok(ymd_hmsn(2015, 1, 20, 17, 35, 20, 0, 0))), - ("Tue, 20 Jan 2015 17:35:20 UT", Ok(ymd_hmsn(2015, 1, 20, 17, 35, 20, 0, 0))), - ("Tue, 20 Jan 2015 17:35:20 ut", Ok(ymd_hmsn(2015, 1, 20, 17, 35, 20, 0, 0))), - ("Tue, 20 Jan 2015 17:35:20 EDT", Ok(ymd_hmsn(2015, 1, 20, 17, 35, 20, 0, -4))), - ("Tue, 20 Jan 2015 17:35:20 EST", Ok(ymd_hmsn(2015, 1, 20, 17, 35, 20, 0, -5))), - ("Tue, 20 Jan 2015 17:35:20 CDT", Ok(ymd_hmsn(2015, 1, 20, 17, 35, 20, 0, -5))), - ("Tue, 20 Jan 2015 17:35:20 CST", Ok(ymd_hmsn(2015, 1, 20, 17, 35, 20, 0, -6))), - ("Tue, 20 Jan 2015 17:35:20 MDT", Ok(ymd_hmsn(2015, 1, 20, 17, 35, 20, 0, -6))), - ("Tue, 20 Jan 2015 17:35:20 MST", Ok(ymd_hmsn(2015, 1, 20, 17, 35, 20, 0, -7))), - ("Tue, 20 Jan 2015 17:35:20 PDT", Ok(ymd_hmsn(2015, 1, 20, 17, 35, 20, 0, -7))), - ("Tue, 20 Jan 2015 17:35:20 PST", Ok(ymd_hmsn(2015, 1, 20, 17, 35, 20, 0, -8))), - ("Tue, 20 Jan 2015 17:35:20 pst", Ok(ymd_hmsn(2015, 1, 20, 17, 35, 20, 0, -8))), - // named single-letter military timezones must fallback to +0000 - ("Tue, 20 Jan 2015 17:35:20 Z", Ok(ymd_hmsn(2015, 1, 20, 17, 35, 20, 0, 0))), - ("Tue, 20 Jan 2015 17:35:20 A", Ok(ymd_hmsn(2015, 1, 20, 17, 35, 20, 0, 0))), - ("Tue, 20 Jan 2015 17:35:20 a", Ok(ymd_hmsn(2015, 1, 20, 17, 35, 20, 0, 0))), - ("Tue, 20 Jan 2015 17:35:20 K", Ok(ymd_hmsn(2015, 1, 20, 17, 35, 20, 0, 0))), - ("Tue, 20 Jan 2015 17:35:20 k", Ok(ymd_hmsn(2015, 1, 20, 17, 35, 20, 0, 0))), - // named single-letter timezone "J" is specifically not valid - ("Tue, 20 Jan 2015 17:35:20 J", Err(NOT_ENOUGH)), - ("Tue, 20 Jan 2015 17:35:20 -0890", Err(OUT_OF_RANGE)), // bad offset minutes - ("Tue, 20 Jan 2015 17:35:20Z", Err(INVALID)), // bad offset: zulu not allowed - ("Tue, 20 Jan 2015 17:35:20 Zulu", Err(NOT_ENOUGH)), // bad offset: zulu not allowed - ("Tue, 20 Jan 2015 17:35:20 ZULU", Err(NOT_ENOUGH)), // bad offset: zulu not allowed - ("Tue, 20 Jan 2015 17:35:20 −0800", Err(INVALID)), // bad offset: timezone offset using MINUS SIGN (U+2212), not specified for RFC 2822 - ("Tue, 20 Jan 2015 17:35:20 0800", Err(INVALID)), // missing offset sign - ("Tue, 20 Jan 2015 17:35:20 HAS", Err(NOT_ENOUGH)), // bad named timezone - ("Tue, 20 Jan 2015😈17:35:20 -0800", Err(INVALID)), // bad character! - ]; - - fn rfc2822_to_datetime(date: &str) -> ParseResult> { - let mut parsed = Parsed::new(); - parse(&mut parsed, date, [Item::Fixed(Fixed::RFC2822)].iter())?; - parsed.to_datetime() - } - - // Test against test data above - for &(date, checkdate) in testdates.iter() { - #[cfg(feature = "std")] - eprintln!("Test input: {:?}\n Expect: {:?}", date, checkdate); - let dt = rfc2822_to_datetime(date); // parse a date - if dt != checkdate { - // check for expected result - panic!( - "Date conversion failed for {}\nReceived: {:?}\nExpected: {:?}", - date, dt, checkdate - ); - } + if dt != checkdate.map(|s| s.to_string()) { + // check for expected result + panic!( + "Date conversion failed for {}\nReceived: {:?}\nExpected: {:?}", + date, dt, checkdate + ); } } +} - #[test] - fn parse_rfc850() { - static RFC850_FMT: &str = "%A, %d-%b-%y %T GMT"; - - let dt = Utc.with_ymd_and_hms(1994, 11, 6, 8, 49, 37).unwrap(); - - // Check that the format is what we expect - #[cfg(any(feature = "alloc", feature = "std"))] - assert_eq!(dt.format(RFC850_FMT).to_string(), "Sunday, 06-Nov-94 08:49:37 GMT"); - - // Check that it parses correctly - assert_eq!( - NaiveDateTime::parse_from_str("Sunday, 06-Nov-94 08:49:37 GMT", RFC850_FMT), - Ok(dt.naive_utc()) - ); +#[cfg(test)] +#[test] +fn parse_rfc850() { + use crate::{TimeZone, Utc}; + + static RFC850_FMT: &str = "%A, %d-%b-%y %T GMT"; + + let dt_str = "Sunday, 06-Nov-94 08:49:37 GMT"; + let dt = Utc.with_ymd_and_hms(1994, 11, 6, 8, 49, 37).unwrap(); + + // Check that the format is what we expect + assert_eq!(dt.format(RFC850_FMT).to_string(), dt_str); + + // Check that it parses correctly + assert_eq!(Ok(dt), Utc.datetime_from_str("Sunday, 06-Nov-94 08:49:37 GMT", RFC850_FMT)); + + // Check that the rest of the weekdays parse correctly (this test originally failed because + // Sunday parsed incorrectly). + let testdates = [ + (Utc.with_ymd_and_hms(1994, 11, 7, 8, 49, 37).unwrap(), "Monday, 07-Nov-94 08:49:37 GMT"), + (Utc.with_ymd_and_hms(1994, 11, 8, 8, 49, 37).unwrap(), "Tuesday, 08-Nov-94 08:49:37 GMT"), + ( + Utc.with_ymd_and_hms(1994, 11, 9, 8, 49, 37).unwrap(), + "Wednesday, 09-Nov-94 08:49:37 GMT", + ), + ( + Utc.with_ymd_and_hms(1994, 11, 10, 8, 49, 37).unwrap(), + "Thursday, 10-Nov-94 08:49:37 GMT", + ), + (Utc.with_ymd_and_hms(1994, 11, 11, 8, 49, 37).unwrap(), "Friday, 11-Nov-94 08:49:37 GMT"), + ( + Utc.with_ymd_and_hms(1994, 11, 12, 8, 49, 37).unwrap(), + "Saturday, 12-Nov-94 08:49:37 GMT", + ), + ]; - // Check that the rest of the weekdays parse correctly (this test originally failed because - // Sunday parsed incorrectly). - let testdates = [ - ( - Utc.with_ymd_and_hms(1994, 11, 7, 8, 49, 37).unwrap(), - "Monday, 07-Nov-94 08:49:37 GMT", - ), - ( - Utc.with_ymd_and_hms(1994, 11, 8, 8, 49, 37).unwrap(), - "Tuesday, 08-Nov-94 08:49:37 GMT", - ), - ( - Utc.with_ymd_and_hms(1994, 11, 9, 8, 49, 37).unwrap(), - "Wednesday, 09-Nov-94 08:49:37 GMT", - ), - ( - Utc.with_ymd_and_hms(1994, 11, 10, 8, 49, 37).unwrap(), - "Thursday, 10-Nov-94 08:49:37 GMT", - ), - ( - Utc.with_ymd_and_hms(1994, 11, 11, 8, 49, 37).unwrap(), - "Friday, 11-Nov-94 08:49:37 GMT", - ), - ( - Utc.with_ymd_and_hms(1994, 11, 12, 8, 49, 37).unwrap(), - "Saturday, 12-Nov-94 08:49:37 GMT", - ), - ]; + for val in &testdates { + assert_eq!(Ok(val.0), Utc.datetime_from_str(val.1, RFC850_FMT)); + } +} - for val in &testdates { - assert_eq!(NaiveDateTime::parse_from_str(val.1, RFC850_FMT), Ok(val.0.naive_utc())); - } +#[cfg(test)] +#[test] +fn test_rfc3339() { + use super::*; + use crate::offset::FixedOffset; + use crate::DateTime; + + // Test data - (input, Ok(expected result after parse and format) or Err(error code)) + let testdates = [ + ("2015-01-20T17:35:20-08:00", Ok("2015-01-20T17:35:20-08:00")), // normal case + ("1944-06-06T04:04:00Z", Ok("1944-06-06T04:04:00+00:00")), // D-day + ("2001-09-11T09:45:00-08:00", Ok("2001-09-11T09:45:00-08:00")), + ("2015-01-20T17:35:20.001-08:00", Ok("2015-01-20T17:35:20.001-08:00")), + ("2015-01-20T17:35:20.000031-08:00", Ok("2015-01-20T17:35:20.000031-08:00")), + ("2015-01-20T17:35:20.000000004-08:00", Ok("2015-01-20T17:35:20.000000004-08:00")), + ("2015-01-20T17:35:20.000000000452-08:00", Ok("2015-01-20T17:35:20-08:00")), // too small + ("2015-02-30T17:35:20-08:00", Err(OUT_OF_RANGE)), // bad day of month + ("2015-01-20T25:35:20-08:00", Err(OUT_OF_RANGE)), // bad hour + ("2015-01-20T17:65:20-08:00", Err(OUT_OF_RANGE)), // bad minute + ("2015-01-20T17:35:90-08:00", Err(OUT_OF_RANGE)), // bad second + ("2015-01-20T17:35:20-24:00", Err(OUT_OF_RANGE)), // bad offset + ]; - let test_dates_fail = [ - "Saturday, 12-Nov-94 08:49:37", - "Saturday, 12-Nov-94 08:49:37 Z", - "Saturday, 12-Nov-94 08:49:37 GMTTTT", - "Saturday, 12-Nov-94 08:49:37 gmt", - "Saturday, 12-Nov-94 08:49:37 +08:00", - "Caturday, 12-Nov-94 08:49:37 GMT", - "Saturday, 99-Nov-94 08:49:37 GMT", - "Saturday, 12-Nov-2000 08:49:37 GMT", - "Saturday, 12-Mop-94 08:49:37 GMT", - "Saturday, 12-Nov-94 28:49:37 GMT", - "Saturday, 12-Nov-94 08:99:37 GMT", - "Saturday, 12-Nov-94 08:49:99 GMT", - ]; + fn rfc3339_to_datetime(date: &str) -> ParseResult> { + let mut parsed = Parsed::new(); + parse(&mut parsed, date, [Item::Fixed(Fixed::RFC3339)].iter())?; + parsed.to_datetime() + } - for val in &test_dates_fail { - assert!(NaiveDateTime::parse_from_str(val, RFC850_FMT).is_err()); - } + fn fmt_rfc3339_datetime(dt: DateTime) -> String { + dt.format_with_items([Item::Fixed(Fixed::RFC3339)].iter()).to_string() } - #[test] - fn test_rfc3339() { - let ymd_hmsn = |y, m, d, h, n, s, nano, off| { - FixedOffset::east_opt(off * 60 * 60) - .unwrap() - .with_ymd_and_hms(y, m, d, h, n, s) - .unwrap() - .with_nanosecond(nano) - .unwrap() + // Test against test data above + for &(date, checkdate) in testdates.iter() { + let d = rfc3339_to_datetime(date); // parse a date + let dt = match d { + // did we get a value? + Ok(dt) => Ok(fmt_rfc3339_datetime(dt)), // yes, go on + Err(e) => Err(e), // otherwise keep an error for the comparison }; - - // Test data - (input, Ok(expected result) or Err(error code)) - let testdates = [ - ("2015-01-20T17:35:20-08:00", Ok(ymd_hmsn(2015, 1, 20, 17, 35, 20, 0, -8))), // normal case - ("2015-01-20T17:35:20−08:00", Ok(ymd_hmsn(2015, 1, 20, 17, 35, 20, 0, -8))), // normal case with MINUS SIGN (U+2212) - ("1944-06-06T04:04:00Z", Ok(ymd_hmsn(1944, 6, 6, 4, 4, 0, 0, 0))), // D-day - ("2001-09-11T09:45:00-08:00", Ok(ymd_hmsn(2001, 9, 11, 9, 45, 0, 0, -8))), - ("2015-01-20T17:35:20.001-08:00", Ok(ymd_hmsn(2015, 1, 20, 17, 35, 20, 1_000_000, -8))), - ("2015-01-20T17:35:20.001−08:00", Ok(ymd_hmsn(2015, 1, 20, 17, 35, 20, 1_000_000, -8))), // with MINUS SIGN (U+2212) - ("2015-01-20T17:35:20.000031-08:00", Ok(ymd_hmsn(2015, 1, 20, 17, 35, 20, 31_000, -8))), - ("2015-01-20T17:35:20.000000004-08:00", Ok(ymd_hmsn(2015, 1, 20, 17, 35, 20, 4, -8))), - ("2015-01-20T17:35:20.000000004−08:00", Ok(ymd_hmsn(2015, 1, 20, 17, 35, 20, 4, -8))), // with MINUS SIGN (U+2212) - ( - "2015-01-20T17:35:20.000000000452-08:00", - Ok(ymd_hmsn(2015, 1, 20, 17, 35, 20, 0, -8)), - ), // too small - ( - "2015-01-20T17:35:20.000000000452−08:00", - Ok(ymd_hmsn(2015, 1, 20, 17, 35, 20, 0, -8)), - ), // too small with MINUS SIGN (U+2212) - ("2015-01-20 17:35:20-08:00", Ok(ymd_hmsn(2015, 1, 20, 17, 35, 20, 0, -8))), // without 'T' - ("2015/01/20T17:35:20.001-08:00", Err(INVALID)), // wrong separator char YMD - ("2015-01-20T17-35-20.001-08:00", Err(INVALID)), // wrong separator char HMS - ("-01-20T17:35:20-08:00", Err(INVALID)), // missing year - ("99-01-20T17:35:20-08:00", Err(INVALID)), // bad year format - ("99999-01-20T17:35:20-08:00", Err(INVALID)), // bad year value - ("-2000-01-20T17:35:20-08:00", Err(INVALID)), // bad year value - ("2015-02-30T17:35:20-08:00", Err(OUT_OF_RANGE)), // bad day of month value - ("2015-01-20T25:35:20-08:00", Err(OUT_OF_RANGE)), // bad hour value - ("2015-01-20T17:65:20-08:00", Err(OUT_OF_RANGE)), // bad minute value - ("2015-01-20T17:35:90-08:00", Err(OUT_OF_RANGE)), // bad second value - ("2015-01-20T17:35:20-24:00", Err(OUT_OF_RANGE)), // bad offset value - ("15-01-20T17:35:20-08:00", Err(INVALID)), // bad year format - ("15-01-20T17:35:20-08:00:00", Err(INVALID)), // bad year format, bad offset format - ("2015-01-20T17:35:2008:00", Err(INVALID)), // missing offset sign - ("2015-01-20T17:35:20 08:00", Err(INVALID)), // missing offset sign - ("2015-01-20T17:35:20Zulu", Err(TOO_LONG)), // bad offset format - ("2015-01-20T17:35:20 Zulu", Err(INVALID)), // bad offset format - ("2015-01-20T17:35:20GMT", Err(INVALID)), // bad offset format - ("2015-01-20T17:35:20 GMT", Err(INVALID)), // bad offset format - ("2015-01-20T17:35:20+GMT", Err(INVALID)), // bad offset format - ("2015-01-20T17:35:20++08:00", Err(INVALID)), // bad offset format - ("2015-01-20T17:35:20--08:00", Err(INVALID)), // bad offset format - ("2015-01-20T17:35:20−−08:00", Err(INVALID)), // bad offset format with MINUS SIGN (U+2212) - ("2015-01-20T17:35:20±08:00", Err(INVALID)), // bad offset sign - ("2015-01-20T17:35:20-08-00", Err(INVALID)), // bad offset separator - ("2015-01-20T17:35:20-08;00", Err(INVALID)), // bad offset separator - ("2015-01-20T17:35:20-0800", Err(INVALID)), // bad offset separator - ("2015-01-20T17:35:20-08:0", Err(TOO_SHORT)), // bad offset minutes - ("2015-01-20T17:35:20-08:AA", Err(INVALID)), // bad offset minutes - ("2015-01-20T17:35:20-08:ZZ", Err(INVALID)), // bad offset minutes - ("2015-01-20T17:35:20.001-08 : 00", Err(INVALID)), // bad offset separator - ("2015-01-20T17:35:20-08:00:00", Err(TOO_LONG)), // bad offset format - ("2015-01-20T17:35:20+08:", Err(TOO_SHORT)), // bad offset format - ("2015-01-20T17:35:20-08:", Err(TOO_SHORT)), // bad offset format - ("2015-01-20T17:35:20−08:", Err(TOO_SHORT)), // bad offset format with MINUS SIGN (U+2212) - ("2015-01-20T17:35:20-08", Err(TOO_SHORT)), // bad offset format - ("2015-01-20T", Err(TOO_SHORT)), // missing HMS - ("2015-01-20T00:00:1", Err(TOO_SHORT)), // missing complete S - ("2015-01-20T00:00:1-08:00", Err(INVALID)), // missing complete S - ]; - - // Test against test data above - for &(date, checkdate) in testdates.iter() { - let dt = DateTime::::parse_from_rfc3339(date); - if dt != checkdate { - // check for expected result - panic!( - "Date conversion failed for {}\nReceived: {:?}\nExpected: {:?}", - date, dt, checkdate - ); - } + if dt != checkdate.map(|s| s.to_string()) { + // check for expected result + panic!( + "Date conversion failed for {}\nReceived: {:?}\nExpected: {:?}", + date, dt, checkdate + ); } } +} - #[test] - fn test_issue_1010() { - let dt = crate::NaiveDateTime::parse_from_str("\u{c}SUN\u{e}\u{3000}\0m@J\u{3000}\0\u{3000}\0m\u{c}!\u{c}\u{b}\u{c}\u{c}\u{c}\u{c}%A\u{c}\u{b}\0SU\u{c}\u{c}", - "\u{c}\u{c}%A\u{c}\u{b}\0SUN\u{c}\u{c}\u{c}SUNN\u{c}\u{c}\u{c}SUN\u{c}\u{c}!\u{c}\u{b}\u{c}\u{c}\u{c}\u{c}%A\u{c}\u{b}%a"); - assert_eq!(dt, Err(ParseError(ParseErrorKind::Invalid))); - } +#[cfg(test)] +#[test] +fn test_issue_1010() { + let dt = crate::NaiveDateTime::parse_from_str("\u{c}SUN\u{e}\u{3000}\0m@J\u{3000}\0\u{3000}\0m\u{c}!\u{c}\u{b}\u{c}\u{c}\u{c}\u{c}%A\u{c}\u{b}\0SU\u{c}\u{c}", + "\u{c}\u{c}%A\u{c}\u{b}\0SUN\u{c}\u{c}\u{c}SUNN\u{c}\u{c}\u{c}SUN\u{c}\u{c}!\u{c}\u{b}\u{c}\u{c}\u{c}\u{c}%A\u{c}\u{b}%a"); + assert_eq!(dt, Err(ParseError(ParseErrorKind::Invalid))); } diff -Nru temporalio-1.3.0/vendor/chrono/src/format/scan.rs temporalio-1.3.0/vendor/chrono/src/format/scan.rs --- temporalio-1.3.0/vendor/chrono/src/format/scan.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/chrono/src/format/scan.rs 2023-10-30 19:40:00.000000000 +0000 @@ -5,9 +5,29 @@ * Various scanning routines for the parser. */ +#![allow(deprecated)] + use super::{ParseResult, INVALID, OUT_OF_RANGE, TOO_SHORT}; use crate::Weekday; +/// Returns true when two slices are equal case-insensitively (in ASCII). +/// Assumes that the `pattern` is already converted to lower case. +fn equals(s: &[u8], pattern: &str) -> bool { + let mut xs = s.iter().map(|&c| match c { + b'A'..=b'Z' => c + 32, + _ => c, + }); + let mut ys = pattern.as_bytes().iter().cloned(); + loop { + match (xs.next(), ys.next()) { + (None, None) => return true, + (None, _) | (_, None) => return false, + (Some(x), Some(y)) if x != y => return false, + _ => (), + } + } +} + /// Tries to parse the non-negative number from `min` to `max` digits. /// /// The absence of digits at all is an unconditional error. @@ -59,7 +79,7 @@ let v = v.checked_mul(SCALE[consumed]).ok_or(OUT_OF_RANGE)?; // if there are more than 9 digits, skip next digits. - let s = s.trim_start_matches(|c: char| c.is_ascii_digit()); + let s = s.trim_left_matches(|c: char| c.is_ascii_digit()); Ok((s, v)) } @@ -125,16 +145,14 @@ /// It prefers long month names to short month names when both are possible. pub(super) fn short_or_long_month0(s: &str) -> ParseResult<(&str, u8)> { // lowercased month names, minus first three chars - static LONG_MONTH_SUFFIXES: [&[u8]; 12] = [ - b"uary", b"ruary", b"ch", b"il", b"", b"e", b"y", b"ust", b"tember", b"ober", b"ember", - b"ember", - ]; + static LONG_MONTH_SUFFIXES: [&str; 12] = + ["uary", "ruary", "ch", "il", "", "e", "y", "ust", "tember", "ober", "ember", "ember"]; let (mut s, month0) = short_month0(s)?; // tries to consume the suffix if possible let suffix = LONG_MONTH_SUFFIXES[month0 as usize]; - if s.len() >= suffix.len() && s.as_bytes()[..suffix.len()].eq_ignore_ascii_case(suffix) { + if s.len() >= suffix.len() && equals(&s.as_bytes()[..suffix.len()], suffix) { s = &s[suffix.len()..]; } @@ -145,14 +163,14 @@ /// It prefers long weekday names to short weekday names when both are possible. pub(super) fn short_or_long_weekday(s: &str) -> ParseResult<(&str, Weekday)> { // lowercased weekday names, minus first three chars - static LONG_WEEKDAY_SUFFIXES: [&[u8]; 7] = - [b"day", b"sday", b"nesday", b"rsday", b"day", b"urday", b"day"]; + static LONG_WEEKDAY_SUFFIXES: [&str; 7] = + ["day", "sday", "nesday", "rsday", "day", "urday", "day"]; let (mut s, weekday) = short_weekday(s)?; // tries to consume the suffix if possible let suffix = LONG_WEEKDAY_SUFFIXES[weekday.num_days_from_monday() as usize]; - if s.len() >= suffix.len() && s.as_bytes()[..suffix.len()].eq_ignore_ascii_case(suffix) { + if s.len() >= suffix.len() && equals(&s.as_bytes()[..suffix.len()], suffix) { s = &s[suffix.len()..]; } @@ -170,7 +188,7 @@ /// Tries to consume one or more whitespace. pub(super) fn space(s: &str) -> ParseResult<&str> { - let s_ = s.trim_start(); + let s_ = s.trim_left(); if s_.len() < s.len() { Ok(s_) } else if s.is_empty() { @@ -181,40 +199,29 @@ } /// Consumes any number (including zero) of colon or spaces. -pub(crate) fn colon_or_space(s: &str) -> ParseResult<&str> { - Ok(s.trim_start_matches(|c: char| c == ':' || c.is_whitespace())) +pub(super) fn colon_or_space(s: &str) -> ParseResult<&str> { + Ok(s.trim_left_matches(|c: char| c == ':' || c.is_whitespace())) } -/// Parse a timezone from `s` and return the offset in seconds. -/// -/// The `consume_colon` function is used to parse a mandatory or optional `:` -/// separator between hours offset and minutes offset. +/// Tries to parse `[-+]\d\d` continued by `\d\d`. Return an offset in seconds if possible. /// -/// The `allow_missing_minutes` flag allows the timezone minutes offset to be -/// missing from `s`. -/// -/// The `allow_tz_minus_sign` flag allows the timezone offset negative character -/// to also be `−` MINUS SIGN (U+2212) in addition to the typical -/// ASCII-compatible `-` HYPHEN-MINUS (U+2D). -/// This is part of [RFC 3339 & ISO 8601]. -/// -/// [RFC 3339 & ISO 8601]: https://en.wikipedia.org/w/index.php?title=ISO_8601&oldid=1114309368#Time_offsets_from_UTC -pub(crate) fn timezone_offset( +/// The additional `colon` may be used to parse a mandatory or optional `:` +/// between hours and minutes, and should return either a new suffix or `Err` when parsing fails. +pub(super) fn timezone_offset(s: &str, consume_colon: F) -> ParseResult<(&str, i32)> +where + F: FnMut(&str) -> ParseResult<&str>, +{ + timezone_offset_internal(s, consume_colon, false) +} + +fn timezone_offset_internal( mut s: &str, mut consume_colon: F, - allow_zulu: bool, allow_missing_minutes: bool, - allow_tz_minus_sign: bool, ) -> ParseResult<(&str, i32)> where F: FnMut(&str) -> ParseResult<&str>, { - if allow_zulu { - if let Some(&b'Z' | &b'z') = s.as_bytes().first() { - return Ok((&s[1..], 0)); - } - } - const fn digits(s: &str) -> ParseResult<(u8, u8)> { let b = s.as_bytes(); if b.len() < 2 { @@ -223,31 +230,13 @@ Ok((b[0], b[1])) } } - let negative = match s.chars().next() { - Some('+') => { - // PLUS SIGN (U+2B) - s = &s['+'.len_utf8()..]; - - false - } - Some('-') => { - // HYPHEN-MINUS (U+2D) - s = &s['-'.len_utf8()..]; - - true - } - Some('−') => { - // MINUS SIGN (U+2212) - if !allow_tz_minus_sign { - return Err(INVALID); - } - s = &s['−'.len_utf8()..]; - - true - } + let negative = match s.as_bytes().first() { + Some(&b'+') => false, + Some(&b'-') => true, Some(_) => return Err(INVALID), None => return Err(TOO_SHORT), }; + s = &s[1..]; // hours (00--99) let hours = match digits(s)? { @@ -282,6 +271,41 @@ Ok((s, if negative { -seconds } else { seconds })) } +/// Same as `timezone_offset` but also allows for `z`/`Z` which is the same as `+00:00`. +pub(super) fn timezone_offset_zulu(s: &str, colon: F) -> ParseResult<(&str, i32)> +where + F: FnMut(&str) -> ParseResult<&str>, +{ + let bytes = s.as_bytes(); + match bytes.first() { + Some(&b'z') | Some(&b'Z') => Ok((&s[1..], 0)), + Some(&b'u') | Some(&b'U') => { + if bytes.len() >= 3 { + let (b, c) = (bytes[1], bytes[2]); + match (b | 32, c | 32) { + (b't', b'c') => Ok((&s[3..], 0)), + _ => Err(INVALID), + } + } else { + Err(INVALID) + } + } + _ => timezone_offset(s, colon), + } +} + +/// Same as `timezone_offset` but also allows for `z`/`Z` which is the same as +/// `+00:00`, and allows missing minutes entirely. +pub(super) fn timezone_offset_permissive(s: &str, colon: F) -> ParseResult<(&str, i32)> +where + F: FnMut(&str) -> ParseResult<&str>, +{ + match s.as_bytes().first() { + Some(&b'z') | Some(&b'Z') => Ok((&s[1..], 0)), + _ => timezone_offset_internal(s, colon, true), + } +} + /// Same as `timezone_offset` but also allows for RFC 2822 legacy timezones. /// May return `None` which indicates an insufficient offset data (i.e. `-0000`). /// See [RFC 2822 Section 4.3]. @@ -294,17 +318,17 @@ let name = &s.as_bytes()[..upto]; let s = &s[upto..]; let offset_hours = |o| Ok((s, Some(o * 3600))); - if name.eq_ignore_ascii_case(b"gmt") || name.eq_ignore_ascii_case(b"ut") { + if equals(name, "gmt") || equals(name, "ut") { offset_hours(0) - } else if name.eq_ignore_ascii_case(b"edt") { + } else if equals(name, "edt") { offset_hours(-4) - } else if name.eq_ignore_ascii_case(b"est") || name.eq_ignore_ascii_case(b"cdt") { + } else if equals(name, "est") || equals(name, "cdt") { offset_hours(-5) - } else if name.eq_ignore_ascii_case(b"cst") || name.eq_ignore_ascii_case(b"mdt") { + } else if equals(name, "cst") || equals(name, "mdt") { offset_hours(-6) - } else if name.eq_ignore_ascii_case(b"mst") || name.eq_ignore_ascii_case(b"pdt") { + } else if equals(name, "mst") || equals(name, "pdt") { offset_hours(-7) - } else if name.eq_ignore_ascii_case(b"pst") { + } else if equals(name, "pst") { offset_hours(-8) } else if name.len() == 1 { match name[0] { @@ -316,11 +340,17 @@ Ok((s, None)) } } else { - let (s_, offset) = timezone_offset(s, |s| Ok(s), false, false, false)?; + let (s_, offset) = timezone_offset(s, |s| Ok(s))?; Ok((s_, Some(offset))) } } +/// Tries to consume everything until next whitespace-like symbol. +/// Does not provide any offset information from the consumed data. +pub(super) fn timezone_name_skip(s: &str) -> ParseResult<(&str, ())> { + Ok((s.trim_left_matches(|c: char| !c.is_whitespace()), ())) +} + /// Tries to consume an RFC2822 comment including preceding ` `. /// /// Returns the remaining string after the closing parenthesis. @@ -352,83 +382,36 @@ } #[cfg(test)] -mod tests { - use super::{ - comment_2822, nanosecond, nanosecond_fixed, short_or_long_month0, short_or_long_weekday, - timezone_offset_2822, - }; - use crate::format::{INVALID, TOO_SHORT}; - use crate::Weekday; - - #[test] - fn test_rfc2822_comments() { - let testdata = [ - ("", Err(TOO_SHORT)), - (" ", Err(TOO_SHORT)), - ("x", Err(INVALID)), - ("(", Err(TOO_SHORT)), - ("()", Ok("")), - (" \r\n\t()", Ok("")), - ("() ", Ok(" ")), - ("()z", Ok("z")), - ("(x)", Ok("")), - ("(())", Ok("")), - ("((()))", Ok("")), - ("(x(x(x)x)x)", Ok("")), - ("( x ( x ( x ) x ) x )", Ok("")), - (r"(\)", Err(TOO_SHORT)), - (r"(\()", Ok("")), - (r"(\))", Ok("")), - (r"(\\)", Ok("")), - ("(()())", Ok("")), - ("( x ( x ) x ( x ) x )", Ok("")), - ]; - - for (test_in, expected) in testdata.iter() { - let actual = comment_2822(test_in).map(|(s, _)| s); - assert_eq!( - *expected, actual, - "{:?} expected to produce {:?}, but produced {:?}.", - test_in, expected, actual - ); - } - } +#[test] +fn test_rfc2822_comments() { + let testdata = [ + ("", Err(TOO_SHORT)), + (" ", Err(TOO_SHORT)), + ("x", Err(INVALID)), + ("(", Err(TOO_SHORT)), + ("()", Ok("")), + (" \r\n\t()", Ok("")), + ("() ", Ok(" ")), + ("()z", Ok("z")), + ("(x)", Ok("")), + ("(())", Ok("")), + ("((()))", Ok("")), + ("(x(x(x)x)x)", Ok("")), + ("( x ( x ( x ) x ) x )", Ok("")), + (r"(\)", Err(TOO_SHORT)), + (r"(\()", Ok("")), + (r"(\))", Ok("")), + (r"(\\)", Ok("")), + ("(()())", Ok("")), + ("( x ( x ) x ( x ) x )", Ok("")), + ]; - #[test] - fn test_timezone_offset_2822() { - assert_eq!(timezone_offset_2822("cSt").unwrap(), ("", Some(-21600))); - assert_eq!(timezone_offset_2822("pSt").unwrap(), ("", Some(-28800))); - assert_eq!(timezone_offset_2822("mSt").unwrap(), ("", Some(-25200))); - assert_eq!(timezone_offset_2822("-1551").unwrap(), ("", Some(-57060))); - assert_eq!(timezone_offset_2822("Gp").unwrap(), ("", None)); - } - - #[test] - fn test_short_or_long_month0() { - assert_eq!(short_or_long_month0("JUn").unwrap(), ("", 5)); - assert_eq!(short_or_long_month0("mAy").unwrap(), ("", 4)); - assert_eq!(short_or_long_month0("AuG").unwrap(), ("", 7)); - assert_eq!(short_or_long_month0("Aprâ").unwrap(), ("â", 3)); - assert_eq!(short_or_long_month0("JUl").unwrap(), ("", 6)); - assert_eq!(short_or_long_month0("mAr").unwrap(), ("", 2)); - assert_eq!(short_or_long_month0("Jan").unwrap(), ("", 0)); - } - - #[test] - fn test_short_or_long_weekday() { - assert_eq!(short_or_long_weekday("sAtu").unwrap(), ("u", Weekday::Sat)); - assert_eq!(short_or_long_weekday("thu").unwrap(), ("", Weekday::Thu)); - } - - #[test] - fn test_nanosecond_fixed() { - assert_eq!(nanosecond_fixed("", 0usize).unwrap(), ("", 0)); - assert!(nanosecond_fixed("", 1usize).is_err()); - } - - #[test] - fn test_nanosecond() { - assert_eq!(nanosecond("2Ù").unwrap(), ("Ù", 200000000)); - assert_eq!(nanosecond("8").unwrap(), ("", 800000000)); + for (test_in, expected) in testdata.iter() { + let actual = comment_2822(test_in).map(|(s, _)| s); + assert_eq!( + *expected, actual, + "{:?} expected to produce {:?}, but produced {:?}.", + test_in, expected, actual + ); } } diff -Nru temporalio-1.3.0/vendor/chrono/src/format/strftime.rs temporalio-1.3.0/vendor/chrono/src/format/strftime.rs --- temporalio-1.3.0/vendor/chrono/src/format/strftime.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/chrono/src/format/strftime.rs 2023-10-30 19:40:00.000000000 +0000 @@ -53,19 +53,19 @@ | | | | | `%M` | `34` | Minute number (00--59), zero-padded to 2 digits. | | `%S` | `60` | Second number (00--60), zero-padded to 2 digits. [^4] | -| `%f` | `26490000` | Number of nanoseconds since last whole second. [^7] | -| `%.f` | `.026490`| Decimal fraction of a second. Consumes the leading dot. [^7] | -| `%.3f`| `.026` | Decimal fraction of a second with a fixed length of 3. | -| `%.6f`| `.026490` | Decimal fraction of a second with a fixed length of 6. | -| `%.9f`| `.026490000` | Decimal fraction of a second with a fixed length of 9. | -| `%3f` | `026` | Decimal fraction of a second like `%.3f` but without the leading dot. | -| `%6f` | `026490` | Decimal fraction of a second like `%.6f` but without the leading dot. | -| `%9f` | `026490000` | Decimal fraction of a second like `%.9f` but without the leading dot. | +| `%f` | `026490000` | The fractional seconds (in nanoseconds) since last whole second. [^7] | +| `%.f` | `.026490`| Similar to `.%f` but left-aligned. These all consume the leading dot. [^7] | +| `%.3f`| `.026` | Similar to `.%f` but left-aligned but fixed to a length of 3. [^7] | +| `%.6f`| `.026490` | Similar to `.%f` but left-aligned but fixed to a length of 6. [^7] | +| `%.9f`| `.026490000` | Similar to `.%f` but left-aligned but fixed to a length of 9. [^7] | +| `%3f` | `026` | Similar to `%.3f` but without the leading dot. [^7] | +| `%6f` | `026490` | Similar to `%.6f` but without the leading dot. [^7] | +| `%9f` | `026490000` | Similar to `%.9f` but without the leading dot. [^7] | | | | | | `%R` | `00:34` | Hour-minute format. Same as `%H:%M`. | | `%T` | `00:34:60` | Hour-minute-second format. Same as `%H:%M:%S`. | | `%X` | `00:34:60` | Locale's time representation (e.g., 23:13:48). | -| `%r` | `12:34:60 AM` | Locale's 12 hour clock time. (e.g., 11:11:04 PM). Falls back to `%X` if the locale does not have a 12 hour clock format. | +| `%r` | `12:34:60 AM` | Hour-minute-second format in 12-hour clocks. Same as `%I:%M:%S %p`. | | | | | | | | **TIME ZONE SPECIFIERS:** | | `%Z` | `ACST` | Local time zone name. Skips all non-whitespace characters during parsing. Identical to `%:z` when formatting. [^8] | @@ -132,12 +132,36 @@ For the purpose of Chrono, it only accounts for non-leap seconds so it slightly differs from ISO C `strftime` behavior. -[^7]: `%f`, `%.f`: +[^7]: `%f`, `%.f`, `%.3f`, `%.6f`, `%.9f`, `%3f`, `%6f`, `%9f`:
- `%f` and `%.f` are notably different formatting specifiers.
- `%f` counts the number of nanoseconds since the last whole second, while `%.f` is a fraction of a - second.
- Example: 7μs is formatted as `7000` with `%f`, and formatted as `.000007` with `%.f`. + The default `%f` is right-aligned and always zero-padded to 9 digits + for the compatibility with glibc and others, + so it always counts the number of nanoseconds since the last whole second. + E.g. 7ms after the last second will print `007000000`, + and parsing `7000000` will yield the same. +
+
+ The variant `%.f` is left-aligned and print 0, 3, 6 or 9 fractional digits + according to the precision. + E.g. 70ms after the last second under `%.f` will print `.070` (note: not `.07`), + and parsing `.07`, `.070000` etc. will yield the same. + Note that they can print or read nothing if the fractional part is zero or + the next character is not `.`. +
+
+ The variant `%.3f`, `%.6f` and `%.9f` are left-aligned and print 3, 6 or 9 fractional digits + according to the number preceding `f`. + E.g. 70ms after the last second under `%.3f` will print `.070` (note: not `.07`), + and parsing `.07`, `.070000` etc. will yield the same. + Note that they can read nothing if the fractional part is zero or + the next character is not `.` however will print with the specified length. +
+
+ The variant `%3f`, `%6f` and `%9f` are left-aligned and print 3, 6 or 9 fractional digits + according to the number preceding `f`, but without the leading dot. + E.g. 70ms after the last second under `%3f` will print `070` (note: not `07`), + and parsing `07`, `070000` etc. will yield the same. + Note that they can read nothing if the fractional part is zero. [^8]: `%Z`: Since `chrono` is not aware of timezones beyond their offsets, this specifier @@ -156,10 +180,39 @@ China Daylight Time. */ -use super::{fixed, internal_fixed, num, num0, nums}; +#[cfg(feature = "unstable-locales")] +extern crate alloc; + +#[cfg(feature = "unstable-locales")] +use alloc::vec::Vec; + #[cfg(feature = "unstable-locales")] use super::{locales, Locale}; -use super::{Fixed, InternalInternal, Item, Numeric, Pad}; +use super::{Fixed, InternalFixed, InternalInternal, Item, Numeric, Pad}; + +#[cfg(feature = "unstable-locales")] +type Fmt<'a> = Vec>; +#[cfg(not(feature = "unstable-locales"))] +type Fmt<'a> = &'static [Item<'static>]; + +static D_FMT: &[Item<'static>] = + &[num0!(Month), lit!("/"), num0!(Day), lit!("/"), num0!(YearMod100)]; +static D_T_FMT: &[Item<'static>] = &[ + fix!(ShortWeekdayName), + sp!(" "), + fix!(ShortMonthName), + sp!(" "), + nums!(Day), + sp!(" "), + num0!(Hour), + lit!(":"), + num0!(Minute), + lit!(":"), + num0!(Second), + sp!(" "), + num0!(Year), +]; +static T_FMT: &[Item<'static>] = &[num0!(Hour), lit!(":"), num0!(Minute), lit!(":"), num0!(Second)]; /// Parsing iterator for `strftime`-like format strings. #[derive(Clone, Debug)] @@ -167,34 +220,58 @@ /// Remaining portion of the string. remainder: &'a str, /// If the current specifier is composed of multiple formatting items (e.g. `%+`), - /// `queue` stores a slice of `Item`s that have to be returned one by one. - queue: &'static [Item<'static>], - #[cfg(feature = "unstable-locales")] - locale_str: &'a str, - #[cfg(feature = "unstable-locales")] - locale: Option, + /// parser refers to the statically reconstructed slice of them. + /// If `recons` is not empty they have to be returned earlier than the `remainder`. + recons: Fmt<'a>, + /// Date format + d_fmt: Fmt<'a>, + /// Date and time format + d_t_fmt: Fmt<'a>, + /// Time format + t_fmt: Fmt<'a>, } impl<'a> StrftimeItems<'a> { /// Creates a new parsing iterator from the `strftime`-like format string. #[must_use] - pub const fn new(s: &'a str) -> StrftimeItems<'a> { - #[cfg(not(feature = "unstable-locales"))] - { - StrftimeItems { remainder: s, queue: &[] } - } - #[cfg(feature = "unstable-locales")] - { - StrftimeItems { remainder: s, queue: &[], locale_str: "", locale: None } - } + pub fn new(s: &'a str) -> StrftimeItems<'a> { + Self::with_remainer(s) } /// Creates a new parsing iterator from the `strftime`-like format string. #[cfg(feature = "unstable-locales")] #[cfg_attr(docsrs, doc(cfg(feature = "unstable-locales")))] #[must_use] - pub const fn new_with_locale(s: &'a str, locale: Locale) -> StrftimeItems<'a> { - StrftimeItems { remainder: s, queue: &[], locale_str: "", locale: Some(locale) } + pub fn new_with_locale(s: &'a str, locale: Locale) -> StrftimeItems<'a> { + let d_fmt = StrftimeItems::new(locales::d_fmt(locale)).collect(); + let d_t_fmt = StrftimeItems::new(locales::d_t_fmt(locale)).collect(); + let t_fmt = StrftimeItems::new(locales::t_fmt(locale)).collect(); + + StrftimeItems { remainder: s, recons: Vec::new(), d_fmt, d_t_fmt, t_fmt } + } + + #[cfg(not(feature = "unstable-locales"))] + fn with_remainer(s: &'a str) -> StrftimeItems<'a> { + static FMT_NONE: &[Item<'static>; 0] = &[]; + + StrftimeItems { + remainder: s, + recons: FMT_NONE, + d_fmt: D_FMT, + d_t_fmt: D_T_FMT, + t_fmt: T_FMT, + } + } + + #[cfg(feature = "unstable-locales")] + fn with_remainer(s: &'a str) -> StrftimeItems<'a> { + StrftimeItems { + remainder: s, + recons: Vec::new(), + d_fmt: D_FMT.to_vec(), + d_t_fmt: D_T_FMT.to_vec(), + t_fmt: T_FMT.to_vec(), + } } } @@ -204,78 +281,37 @@ type Item = Item<'a>; fn next(&mut self) -> Option> { - // We have items queued to return from a specifier composed of multiple formatting items. - if let Some((item, remainder)) = self.queue.split_first() { - self.queue = remainder; - return Some(item.clone()); - } - - // We are in the middle of parsing the localized formatting string of a specifier. - #[cfg(feature = "unstable-locales")] - if !self.locale_str.is_empty() { - let (remainder, item) = self.parse_next_item(self.locale_str)?; - self.locale_str = remainder; + // we have some reconstructed items to return + if !self.recons.is_empty() { + let item; + #[cfg(feature = "unstable-locales")] + { + item = self.recons.remove(0); + } + #[cfg(not(feature = "unstable-locales"))] + { + item = self.recons[0].clone(); + self.recons = &self.recons[1..]; + } return Some(item); } - // Normal: we are parsing the formatting string. - let (remainder, item) = self.parse_next_item(self.remainder)?; - self.remainder = remainder; - Some(item) - } -} - -impl<'a> StrftimeItems<'a> { - fn parse_next_item(&mut self, mut remainder: &'a str) -> Option<(&'a str, Item<'a>)> { - use InternalInternal::*; - use Item::{Literal, Space}; - use Numeric::*; - - static D_FMT: &[Item<'static>] = - &[num0(Month), Literal("/"), num0(Day), Literal("/"), num0(YearMod100)]; - static D_T_FMT: &[Item<'static>] = &[ - fixed(Fixed::ShortWeekdayName), - Space(" "), - fixed(Fixed::ShortMonthName), - Space(" "), - nums(Day), - Space(" "), - num0(Hour), - Literal(":"), - num0(Minute), - Literal(":"), - num0(Second), - Space(" "), - num0(Year), - ]; - static T_FMT: &[Item<'static>] = - &[num0(Hour), Literal(":"), num0(Minute), Literal(":"), num0(Second)]; - static T_FMT_AMPM: &[Item<'static>] = &[ - num0(Hour12), - Literal(":"), - num0(Minute), - Literal(":"), - num0(Second), - Space(" "), - fixed(Fixed::UpperAmPm), - ]; - - match remainder.chars().next() { + match self.remainder.chars().next() { // we are done None => None, // the next item is a specifier Some('%') => { - remainder = &remainder[1..]; + self.remainder = &self.remainder[1..]; macro_rules! next { () => { - match remainder.chars().next() { + match self.remainder.chars().next() { Some(x) => { - remainder = &remainder[x.len_utf8()..]; + self.remainder = &self.remainder[x.len_utf8()..]; x } - None => return Some((remainder, Item::Error)), // premature end of string + None => return Some(Item::Error), // premature end of string } }; } @@ -290,636 +326,395 @@ let is_alternate = spec == '#'; let spec = if pad_override.is_some() || is_alternate { next!() } else { spec }; if is_alternate && !HAVE_ALTERNATES.contains(spec) { - return Some((remainder, Item::Error)); + return Some(Item::Error); } - macro_rules! queue { + macro_rules! recons { [$head:expr, $($tail:expr),+ $(,)*] => ({ - const QUEUE: &'static [Item<'static>] = &[$($tail),+]; - self.queue = QUEUE; + #[cfg(feature = "unstable-locales")] + { + self.recons.clear(); + $(self.recons.push($tail);)+ + } + #[cfg(not(feature = "unstable-locales"))] + { + const RECONS: &'static [Item<'static>] = &[$($tail),+]; + self.recons = RECONS; + } $head }) } - #[cfg(not(feature = "unstable-locales"))] - macro_rules! queue_from_slice { + + macro_rules! recons_from_slice { ($slice:expr) => {{ - self.queue = &$slice[1..]; + #[cfg(feature = "unstable-locales")] + { + self.recons.clear(); + self.recons.extend_from_slice(&$slice[1..]); + } + #[cfg(not(feature = "unstable-locales"))] + { + self.recons = &$slice[1..]; + } $slice[0].clone() }}; } let item = match spec { - 'A' => fixed(Fixed::LongWeekdayName), - 'B' => fixed(Fixed::LongMonthName), - 'C' => num0(YearDiv100), + 'A' => fix!(LongWeekdayName), + 'B' => fix!(LongMonthName), + 'C' => num0!(YearDiv100), 'D' => { - queue![num0(Month), Literal("/"), num0(Day), Literal("/"), num0(YearMod100)] - } - 'F' => queue![num0(Year), Literal("-"), num0(Month), Literal("-"), num0(Day)], - 'G' => num0(IsoYear), - 'H' => num0(Hour), - 'I' => num0(Hour12), - 'M' => num0(Minute), - 'P' => fixed(Fixed::LowerAmPm), - 'R' => queue![num0(Hour), Literal(":"), num0(Minute)], - 'S' => num0(Second), - 'T' => { - queue![num0(Hour), Literal(":"), num0(Minute), Literal(":"), num0(Second)] - } - 'U' => num0(WeekFromSun), - 'V' => num0(IsoWeek), - 'W' => num0(WeekFromMon), - #[cfg(not(feature = "unstable-locales"))] - 'X' => queue_from_slice!(T_FMT), - #[cfg(feature = "unstable-locales")] - 'X' => self.switch_to_locale_str(locales::t_fmt, T_FMT), - 'Y' => num0(Year), - 'Z' => fixed(Fixed::TimezoneName), - 'a' => fixed(Fixed::ShortWeekdayName), - 'b' | 'h' => fixed(Fixed::ShortMonthName), - #[cfg(not(feature = "unstable-locales"))] - 'c' => queue_from_slice!(D_T_FMT), - #[cfg(feature = "unstable-locales")] - 'c' => self.switch_to_locale_str(locales::d_t_fmt, D_T_FMT), - 'd' => num0(Day), - 'e' => nums(Day), - 'f' => num0(Nanosecond), - 'g' => num0(IsoYearMod100), - 'j' => num0(Ordinal), - 'k' => nums(Hour), - 'l' => nums(Hour12), - 'm' => num0(Month), - 'n' => Space("\n"), - 'p' => fixed(Fixed::UpperAmPm), - #[cfg(not(feature = "unstable-locales"))] - 'r' => queue_from_slice!(T_FMT_AMPM), - #[cfg(feature = "unstable-locales")] - 'r' => { - if self.locale.is_some() - && locales::t_fmt_ampm(self.locale.unwrap()).is_empty() - { - // 12-hour clock not supported by this locale. Switch to 24-hour format. - self.switch_to_locale_str(locales::t_fmt, T_FMT) - } else { - self.switch_to_locale_str(locales::t_fmt_ampm, T_FMT_AMPM) - } + recons![num0!(Month), lit!("/"), num0!(Day), lit!("/"), num0!(YearMod100)] } - 's' => num(Timestamp), - 't' => Space("\t"), - 'u' => num(WeekdayFromMon), + 'F' => recons![num0!(Year), lit!("-"), num0!(Month), lit!("-"), num0!(Day)], + 'G' => num0!(IsoYear), + 'H' => num0!(Hour), + 'I' => num0!(Hour12), + 'M' => num0!(Minute), + 'P' => fix!(LowerAmPm), + 'R' => recons![num0!(Hour), lit!(":"), num0!(Minute)], + 'S' => num0!(Second), + 'T' => recons![num0!(Hour), lit!(":"), num0!(Minute), lit!(":"), num0!(Second)], + 'U' => num0!(WeekFromSun), + 'V' => num0!(IsoWeek), + 'W' => num0!(WeekFromMon), + 'X' => recons_from_slice!(self.t_fmt), + 'Y' => num0!(Year), + 'Z' => fix!(TimezoneName), + 'a' => fix!(ShortWeekdayName), + 'b' | 'h' => fix!(ShortMonthName), + 'c' => recons_from_slice!(self.d_t_fmt), + 'd' => num0!(Day), + 'e' => nums!(Day), + 'f' => num0!(Nanosecond), + 'g' => num0!(IsoYearMod100), + 'j' => num0!(Ordinal), + 'k' => nums!(Hour), + 'l' => nums!(Hour12), + 'm' => num0!(Month), + 'n' => sp!("\n"), + 'p' => fix!(UpperAmPm), + 'r' => recons![ + num0!(Hour12), + lit!(":"), + num0!(Minute), + lit!(":"), + num0!(Second), + sp!(" "), + fix!(UpperAmPm) + ], + 's' => num!(Timestamp), + 't' => sp!("\t"), + 'u' => num!(WeekdayFromMon), 'v' => { - queue![ - nums(Day), - Literal("-"), - fixed(Fixed::ShortMonthName), - Literal("-"), - num0(Year) - ] + recons![nums!(Day), lit!("-"), fix!(ShortMonthName), lit!("-"), num0!(Year)] } - 'w' => num(NumDaysFromSun), - #[cfg(not(feature = "unstable-locales"))] - 'x' => queue_from_slice!(D_FMT), - #[cfg(feature = "unstable-locales")] - 'x' => self.switch_to_locale_str(locales::d_fmt, D_FMT), - 'y' => num0(YearMod100), + 'w' => num!(NumDaysFromSun), + 'x' => recons_from_slice!(self.d_fmt), + 'y' => num0!(YearMod100), 'z' => { if is_alternate { - internal_fixed(TimezoneOffsetPermissive) + internal_fix!(TimezoneOffsetPermissive) } else { - fixed(Fixed::TimezoneOffset) + fix!(TimezoneOffset) } } - '+' => fixed(Fixed::RFC3339), + '+' => fix!(RFC3339), ':' => { - if remainder.starts_with("::z") { - remainder = &remainder[3..]; - fixed(Fixed::TimezoneOffsetTripleColon) - } else if remainder.starts_with(":z") { - remainder = &remainder[2..]; - fixed(Fixed::TimezoneOffsetDoubleColon) - } else if remainder.starts_with('z') { - remainder = &remainder[1..]; - fixed(Fixed::TimezoneOffsetColon) + if self.remainder.starts_with("::z") { + self.remainder = &self.remainder[3..]; + fix!(TimezoneOffsetTripleColon) + } else if self.remainder.starts_with(":z") { + self.remainder = &self.remainder[2..]; + fix!(TimezoneOffsetDoubleColon) + } else if self.remainder.starts_with('z') { + self.remainder = &self.remainder[1..]; + fix!(TimezoneOffsetColon) } else { Item::Error } } '.' => match next!() { '3' => match next!() { - 'f' => fixed(Fixed::Nanosecond3), + 'f' => fix!(Nanosecond3), _ => Item::Error, }, '6' => match next!() { - 'f' => fixed(Fixed::Nanosecond6), + 'f' => fix!(Nanosecond6), _ => Item::Error, }, '9' => match next!() { - 'f' => fixed(Fixed::Nanosecond9), + 'f' => fix!(Nanosecond9), _ => Item::Error, }, - 'f' => fixed(Fixed::Nanosecond), + 'f' => fix!(Nanosecond), _ => Item::Error, }, '3' => match next!() { - 'f' => internal_fixed(Nanosecond3NoDot), + 'f' => internal_fix!(Nanosecond3NoDot), _ => Item::Error, }, '6' => match next!() { - 'f' => internal_fixed(Nanosecond6NoDot), + 'f' => internal_fix!(Nanosecond6NoDot), _ => Item::Error, }, '9' => match next!() { - 'f' => internal_fixed(Nanosecond9NoDot), + 'f' => internal_fix!(Nanosecond9NoDot), _ => Item::Error, }, - '%' => Literal("%"), + '%' => lit!("%"), _ => Item::Error, // no such specifier }; - // Adjust `item` if we have any padding modifier. - // Not allowed on non-numeric items or on specifiers composed out of multiple - // formatting items. + // adjust `item` if we have any padding modifier if let Some(new_pad) = pad_override { match item { - Item::Numeric(ref kind, _pad) if self.queue.is_empty() => { - Some((remainder, Item::Numeric(kind.clone(), new_pad))) + Item::Numeric(ref kind, _pad) if self.recons.is_empty() => { + Some(Item::Numeric(kind.clone(), new_pad)) } - _ => Some((remainder, Item::Error)), + _ => Some(Item::Error), // no reconstructed or non-numeric item allowed } } else { - Some((remainder, item)) + Some(item) } } // the next item is space Some(c) if c.is_whitespace() => { // `%` is not a whitespace, so `c != '%'` is redundant - let nextspec = - remainder.find(|c: char| !c.is_whitespace()).unwrap_or(remainder.len()); + let nextspec = self + .remainder + .find(|c: char| !c.is_whitespace()) + .unwrap_or(self.remainder.len()); assert!(nextspec > 0); - let item = Space(&remainder[..nextspec]); - remainder = &remainder[nextspec..]; - Some((remainder, item)) + let item = sp!(&self.remainder[..nextspec]); + self.remainder = &self.remainder[nextspec..]; + Some(item) } // the next item is literal _ => { - let nextspec = remainder + let nextspec = self + .remainder .find(|c: char| c.is_whitespace() || c == '%') - .unwrap_or(remainder.len()); + .unwrap_or(self.remainder.len()); assert!(nextspec > 0); - let item = Literal(&remainder[..nextspec]); - remainder = &remainder[nextspec..]; - Some((remainder, item)) + let item = lit!(&self.remainder[..nextspec]); + self.remainder = &self.remainder[nextspec..]; + Some(item) } } } - - #[cfg(feature = "unstable-locales")] - fn switch_to_locale_str( - &mut self, - localized_fmt_str: impl Fn(Locale) -> &'static str, - fallback: &'static [Item<'static>], - ) -> Item<'a> { - if let Some(locale) = self.locale { - assert!(self.locale_str.is_empty()); - let (fmt_str, item) = self.parse_next_item(localized_fmt_str(locale)).unwrap(); - self.locale_str = fmt_str; - item - } else { - self.queue = &fallback[1..]; - fallback[0].clone() - } - } } #[cfg(test)] -mod tests { - use super::StrftimeItems; - use crate::format::Item::{self, Literal, Space}; - #[cfg(feature = "unstable-locales")] - use crate::format::Locale; - use crate::format::{fixed, internal_fixed, num, num0, nums}; - use crate::format::{Fixed, InternalInternal, Numeric::*}; - #[cfg(any(feature = "alloc", feature = "std"))] - use crate::{DateTime, FixedOffset, NaiveDate, TimeZone, Timelike, Utc}; - - #[test] - fn test_strftime_items() { - fn parse_and_collect(s: &str) -> Vec> { - // map any error into `[Item::Error]`. useful for easy testing. - eprintln!("test_strftime_items: parse_and_collect({:?})", s); - let items = StrftimeItems::new(s); - let items = items.map(|spec| if spec == Item::Error { None } else { Some(spec) }); - items.collect::>>().unwrap_or_else(|| vec![Item::Error]) - } - - assert_eq!(parse_and_collect(""), []); - assert_eq!(parse_and_collect(" "), [Space(" ")]); - assert_eq!(parse_and_collect(" "), [Space(" ")]); - // ne! - assert_ne!(parse_and_collect(" "), [Space(" "), Space(" ")]); - // eq! - assert_eq!(parse_and_collect(" "), [Space(" ")]); - assert_eq!(parse_and_collect("a"), [Literal("a")]); - assert_eq!(parse_and_collect("ab"), [Literal("ab")]); - assert_eq!(parse_and_collect("😽"), [Literal("😽")]); - assert_eq!(parse_and_collect("a😽"), [Literal("a😽")]); - assert_eq!(parse_and_collect("😽a"), [Literal("😽a")]); - assert_eq!(parse_and_collect(" 😽"), [Space(" "), Literal("😽")]); - assert_eq!(parse_and_collect("😽 "), [Literal("😽"), Space(" ")]); - // ne! - assert_ne!(parse_and_collect("😽😽"), [Literal("😽")]); - assert_ne!(parse_and_collect("😽"), [Literal("😽😽")]); - assert_ne!(parse_and_collect("😽😽"), [Literal("😽😽"), Literal("😽")]); - // eq! - assert_eq!(parse_and_collect("😽😽"), [Literal("😽😽")]); - assert_eq!(parse_and_collect(" \t\n\r "), [Space(" \t\n\r ")]); - assert_eq!(parse_and_collect("hello?"), [Literal("hello?")]); - assert_eq!( - parse_and_collect("a b\t\nc"), - [Literal("a"), Space(" "), Literal("b"), Space("\t\n"), Literal("c")] - ); - assert_eq!(parse_and_collect("100%%"), [Literal("100"), Literal("%")]); - assert_eq!( - parse_and_collect("100%% ok"), - [Literal("100"), Literal("%"), Space(" "), Literal("ok")] - ); - assert_eq!(parse_and_collect("%%PDF-1.0"), [Literal("%"), Literal("PDF-1.0")]); - assert_eq!( - parse_and_collect("%Y-%m-%d"), - [num0(Year), Literal("-"), num0(Month), Literal("-"), num0(Day)] - ); - assert_eq!(parse_and_collect("😽 "), [Literal("😽"), Space(" ")]); - assert_eq!(parse_and_collect("😽😽"), [Literal("😽😽")]); - assert_eq!(parse_and_collect("😽😽😽"), [Literal("😽😽😽")]); - assert_eq!(parse_and_collect("😽😽 😽"), [Literal("😽😽"), Space(" "), Literal("😽")]); - assert_eq!(parse_and_collect("😽😽a 😽"), [Literal("😽😽a"), Space(" "), Literal("😽")]); - assert_eq!(parse_and_collect("😽😽a b😽"), [Literal("😽😽a"), Space(" "), Literal("b😽")]); - assert_eq!( - parse_and_collect("😽😽a b😽c"), - [Literal("😽😽a"), Space(" "), Literal("b😽c")] - ); - assert_eq!(parse_and_collect("😽😽 "), [Literal("😽😽"), Space(" ")]); - assert_eq!(parse_and_collect("😽😽 😽"), [Literal("😽😽"), Space(" "), Literal("😽")]); - assert_eq!(parse_and_collect(" 😽"), [Space(" "), Literal("😽")]); - assert_eq!(parse_and_collect(" 😽 "), [Space(" "), Literal("😽"), Space(" ")]); - assert_eq!( - parse_and_collect(" 😽 😽"), - [Space(" "), Literal("😽"), Space(" "), Literal("😽")] - ); - assert_eq!( - parse_and_collect(" 😽 😽 "), - [Space(" "), Literal("😽"), Space(" "), Literal("😽"), Space(" ")] - ); - assert_eq!( - parse_and_collect(" 😽 😽 "), - [Space(" "), Literal("😽"), Space(" "), Literal("😽"), Space(" ")] - ); - assert_eq!( - parse_and_collect(" 😽 😽😽 "), - [Space(" "), Literal("😽"), Space(" "), Literal("😽😽"), Space(" ")] - ); - assert_eq!(parse_and_collect(" 😽😽"), [Space(" "), Literal("😽😽")]); - assert_eq!(parse_and_collect(" 😽😽 "), [Space(" "), Literal("😽😽"), Space(" ")]); - assert_eq!( - parse_and_collect(" 😽😽 "), - [Space(" "), Literal("😽😽"), Space(" ")] - ); - assert_eq!( - parse_and_collect(" 😽😽 "), - [Space(" "), Literal("😽😽"), Space(" ")] - ); - assert_eq!(parse_and_collect(" 😽😽 "), [Space(" "), Literal("😽😽"), Space(" ")]); - assert_eq!( - parse_and_collect(" 😽 😽😽 "), - [Space(" "), Literal("😽"), Space(" "), Literal("😽😽"), Space(" ")] - ); - assert_eq!( - parse_and_collect(" 😽 😽ã¯ã„😽 ãƒãƒ³ãƒãƒ¼ã‚¬ãƒ¼"), - [ - Space(" "), - Literal("😽"), - Space(" "), - Literal("😽ã¯ã„😽"), - Space(" "), - Literal("ãƒãƒ³ãƒãƒ¼ã‚¬ãƒ¼") - ] - ); - assert_eq!( - parse_and_collect("%%😽%%😽"), - [Literal("%"), Literal("😽"), Literal("%"), Literal("😽")] - ); - assert_eq!(parse_and_collect("%Y--%m"), [num0(Year), Literal("--"), num0(Month)]); - assert_eq!(parse_and_collect("[%F]"), parse_and_collect("[%Y-%m-%d]")); - assert_eq!(parse_and_collect("100%%😽"), [Literal("100"), Literal("%"), Literal("😽")]); - assert_eq!( - parse_and_collect("100%%😽%%a"), - [Literal("100"), Literal("%"), Literal("😽"), Literal("%"), Literal("a")] - ); - assert_eq!(parse_and_collect("😽100%%"), [Literal("😽100"), Literal("%")]); - assert_eq!(parse_and_collect("%m %d"), [num0(Month), Space(" "), num0(Day)]); - assert_eq!(parse_and_collect("%"), [Item::Error]); - assert_eq!(parse_and_collect("%%"), [Literal("%")]); - assert_eq!(parse_and_collect("%%%"), [Item::Error]); - assert_eq!(parse_and_collect("%a"), [fixed(Fixed::ShortWeekdayName)]); - assert_eq!(parse_and_collect("%aa"), [fixed(Fixed::ShortWeekdayName), Literal("a")]); - assert_eq!(parse_and_collect("%%a%"), [Item::Error]); - assert_eq!(parse_and_collect("%😽"), [Item::Error]); - assert_eq!(parse_and_collect("%😽😽"), [Item::Error]); - assert_eq!(parse_and_collect("%%%%"), [Literal("%"), Literal("%")]); - assert_eq!( - parse_and_collect("%%%%ãƒãƒ³ãƒãƒ¼ã‚¬ãƒ¼"), - [Literal("%"), Literal("%"), Literal("ãƒãƒ³ãƒãƒ¼ã‚¬ãƒ¼")] - ); - assert_eq!(parse_and_collect("foo%?"), [Item::Error]); - assert_eq!(parse_and_collect("bar%42"), [Item::Error]); - assert_eq!(parse_and_collect("quux% +"), [Item::Error]); - assert_eq!(parse_and_collect("%.Z"), [Item::Error]); - assert_eq!(parse_and_collect("%:Z"), [Item::Error]); - assert_eq!(parse_and_collect("%-Z"), [Item::Error]); - assert_eq!(parse_and_collect("%0Z"), [Item::Error]); - assert_eq!(parse_and_collect("%_Z"), [Item::Error]); - assert_eq!(parse_and_collect("%.j"), [Item::Error]); - assert_eq!(parse_and_collect("%:j"), [Item::Error]); - assert_eq!(parse_and_collect("%-j"), [num(Ordinal)]); - assert_eq!(parse_and_collect("%0j"), [num0(Ordinal)]); - assert_eq!(parse_and_collect("%_j"), [nums(Ordinal)]); - assert_eq!(parse_and_collect("%.e"), [Item::Error]); - assert_eq!(parse_and_collect("%:e"), [Item::Error]); - assert_eq!(parse_and_collect("%-e"), [num(Day)]); - assert_eq!(parse_and_collect("%0e"), [num0(Day)]); - assert_eq!(parse_and_collect("%_e"), [nums(Day)]); - assert_eq!(parse_and_collect("%z"), [fixed(Fixed::TimezoneOffset)]); - assert_eq!(parse_and_collect("%:z"), [fixed(Fixed::TimezoneOffsetColon)]); - assert_eq!(parse_and_collect("%Z"), [fixed(Fixed::TimezoneName)]); - assert_eq!(parse_and_collect("%ZZZZ"), [fixed(Fixed::TimezoneName), Literal("ZZZ")]); - assert_eq!(parse_and_collect("%Z😽"), [fixed(Fixed::TimezoneName), Literal("😽")]); - assert_eq!( - parse_and_collect("%#z"), - [internal_fixed(InternalInternal::TimezoneOffsetPermissive)] - ); - assert_eq!(parse_and_collect("%#m"), [Item::Error]); - } - - #[test] - #[cfg(any(feature = "alloc", feature = "std"))] - fn test_strftime_docs() { - let dt = FixedOffset::east_opt(34200) - .unwrap() - .from_local_datetime( - &NaiveDate::from_ymd_opt(2001, 7, 8) - .unwrap() - .and_hms_nano_opt(0, 34, 59, 1_026_490_708) - .unwrap(), - ) - .unwrap(); - - // date specifiers - assert_eq!(dt.format("%Y").to_string(), "2001"); - assert_eq!(dt.format("%C").to_string(), "20"); - assert_eq!(dt.format("%y").to_string(), "01"); - assert_eq!(dt.format("%m").to_string(), "07"); - assert_eq!(dt.format("%b").to_string(), "Jul"); - assert_eq!(dt.format("%B").to_string(), "July"); - assert_eq!(dt.format("%h").to_string(), "Jul"); - assert_eq!(dt.format("%d").to_string(), "08"); - assert_eq!(dt.format("%e").to_string(), " 8"); - assert_eq!(dt.format("%e").to_string(), dt.format("%_d").to_string()); - assert_eq!(dt.format("%a").to_string(), "Sun"); - assert_eq!(dt.format("%A").to_string(), "Sunday"); - assert_eq!(dt.format("%w").to_string(), "0"); - assert_eq!(dt.format("%u").to_string(), "7"); - assert_eq!(dt.format("%U").to_string(), "27"); - assert_eq!(dt.format("%W").to_string(), "27"); - assert_eq!(dt.format("%G").to_string(), "2001"); - assert_eq!(dt.format("%g").to_string(), "01"); - assert_eq!(dt.format("%V").to_string(), "27"); - assert_eq!(dt.format("%j").to_string(), "189"); - assert_eq!(dt.format("%D").to_string(), "07/08/01"); - assert_eq!(dt.format("%x").to_string(), "07/08/01"); - assert_eq!(dt.format("%F").to_string(), "2001-07-08"); - assert_eq!(dt.format("%v").to_string(), " 8-Jul-2001"); - - // time specifiers - assert_eq!(dt.format("%H").to_string(), "00"); - assert_eq!(dt.format("%k").to_string(), " 0"); - assert_eq!(dt.format("%k").to_string(), dt.format("%_H").to_string()); - assert_eq!(dt.format("%I").to_string(), "12"); - assert_eq!(dt.format("%l").to_string(), "12"); - assert_eq!(dt.format("%l").to_string(), dt.format("%_I").to_string()); - assert_eq!(dt.format("%P").to_string(), "am"); - assert_eq!(dt.format("%p").to_string(), "AM"); - assert_eq!(dt.format("%M").to_string(), "34"); - assert_eq!(dt.format("%S").to_string(), "60"); - assert_eq!(dt.format("%f").to_string(), "026490708"); - assert_eq!(dt.format("%.f").to_string(), ".026490708"); - assert_eq!(dt.with_nanosecond(1_026_490_000).unwrap().format("%.f").to_string(), ".026490"); - assert_eq!(dt.format("%.3f").to_string(), ".026"); - assert_eq!(dt.format("%.6f").to_string(), ".026490"); - assert_eq!(dt.format("%.9f").to_string(), ".026490708"); - assert_eq!(dt.format("%3f").to_string(), "026"); - assert_eq!(dt.format("%6f").to_string(), "026490"); - assert_eq!(dt.format("%9f").to_string(), "026490708"); - assert_eq!(dt.format("%R").to_string(), "00:34"); - assert_eq!(dt.format("%T").to_string(), "00:34:60"); - assert_eq!(dt.format("%X").to_string(), "00:34:60"); - assert_eq!(dt.format("%r").to_string(), "12:34:60 AM"); - - // time zone specifiers - //assert_eq!(dt.format("%Z").to_string(), "ACST"); - assert_eq!(dt.format("%z").to_string(), "+0930"); - assert_eq!(dt.format("%:z").to_string(), "+09:30"); - assert_eq!(dt.format("%::z").to_string(), "+09:30:00"); - assert_eq!(dt.format("%:::z").to_string(), "+09"); - - // date & time specifiers - assert_eq!(dt.format("%c").to_string(), "Sun Jul 8 00:34:60 2001"); - assert_eq!(dt.format("%+").to_string(), "2001-07-08T00:34:60.026490708+09:30"); - - assert_eq!( - dt.with_timezone(&Utc).format("%+").to_string(), - "2001-07-07T15:04:60.026490708+00:00" - ); - assert_eq!( - dt.with_timezone(&Utc), - DateTime::parse_from_str("2001-07-07T15:04:60.026490708Z", "%+").unwrap() - ); - assert_eq!( - dt.with_timezone(&Utc), - DateTime::parse_from_str("2001-07-07T15:04:60.026490708UTC", "%+").unwrap() - ); - assert_eq!( - dt.with_timezone(&Utc), - DateTime::parse_from_str("2001-07-07t15:04:60.026490708utc", "%+").unwrap() - ); - - assert_eq!( - dt.with_nanosecond(1_026_490_000).unwrap().format("%+").to_string(), - "2001-07-08T00:34:60.026490+09:30" - ); - assert_eq!(dt.format("%s").to_string(), "994518299"); - - // special specifiers - assert_eq!(dt.format("%t").to_string(), "\t"); - assert_eq!(dt.format("%n").to_string(), "\n"); - assert_eq!(dt.format("%%").to_string(), "%"); - - // complex format specifiers - assert_eq!(dt.format(" %Y%d%m%%%%%t%H%M%S\t").to_string(), " 20010807%%\t003460\t"); - assert_eq!( - dt.format(" %Y%d%m%%%%%t%H:%P:%M%S%:::z\t").to_string(), - " 20010807%%\t00:am:3460+09\t" - ); - } - - #[test] - #[cfg(all(feature = "unstable-locales", any(feature = "alloc", feature = "std")))] - fn test_strftime_docs_localized() { - let dt = FixedOffset::east_opt(34200) - .unwrap() - .with_ymd_and_hms(2001, 7, 8, 0, 34, 59) - .unwrap() - .with_nanosecond(1_026_490_708) - .unwrap(); - - // date specifiers - assert_eq!(dt.format_localized("%b", Locale::fr_BE).to_string(), "jui"); - assert_eq!(dt.format_localized("%B", Locale::fr_BE).to_string(), "juillet"); - assert_eq!(dt.format_localized("%h", Locale::fr_BE).to_string(), "jui"); - assert_eq!(dt.format_localized("%a", Locale::fr_BE).to_string(), "dim"); - assert_eq!(dt.format_localized("%A", Locale::fr_BE).to_string(), "dimanche"); - assert_eq!(dt.format_localized("%D", Locale::fr_BE).to_string(), "07/08/01"); - assert_eq!(dt.format_localized("%x", Locale::fr_BE).to_string(), "08/07/01"); - assert_eq!(dt.format_localized("%F", Locale::fr_BE).to_string(), "2001-07-08"); - assert_eq!(dt.format_localized("%v", Locale::fr_BE).to_string(), " 8-jui-2001"); - - // time specifiers - assert_eq!(dt.format_localized("%P", Locale::fr_BE).to_string(), ""); - assert_eq!(dt.format_localized("%p", Locale::fr_BE).to_string(), ""); - assert_eq!(dt.format_localized("%R", Locale::fr_BE).to_string(), "00:34"); - assert_eq!(dt.format_localized("%T", Locale::fr_BE).to_string(), "00:34:60"); - assert_eq!(dt.format_localized("%X", Locale::fr_BE).to_string(), "00:34:60"); - assert_eq!(dt.format_localized("%r", Locale::fr_BE).to_string(), "00:34:60"); - - // date & time specifiers - assert_eq!( - dt.format_localized("%c", Locale::fr_BE).to_string(), - "dim 08 jui 2001 00:34:60 +09:30" - ); - - let nd = NaiveDate::from_ymd_opt(2001, 7, 8).unwrap(); - - // date specifiers - assert_eq!(nd.format_localized("%b", Locale::de_DE).to_string(), "Jul"); - assert_eq!(nd.format_localized("%B", Locale::de_DE).to_string(), "Juli"); - assert_eq!(nd.format_localized("%h", Locale::de_DE).to_string(), "Jul"); - assert_eq!(nd.format_localized("%a", Locale::de_DE).to_string(), "So"); - assert_eq!(nd.format_localized("%A", Locale::de_DE).to_string(), "Sonntag"); - assert_eq!(nd.format_localized("%D", Locale::de_DE).to_string(), "07/08/01"); - assert_eq!(nd.format_localized("%x", Locale::de_DE).to_string(), "08.07.2001"); - assert_eq!(nd.format_localized("%F", Locale::de_DE).to_string(), "2001-07-08"); - assert_eq!(nd.format_localized("%v", Locale::de_DE).to_string(), " 8-Jul-2001"); - } - - /// Ensure parsing a timestamp with the parse-only stftime formatter "%#z" does - /// not cause a panic. - /// - /// See . - #[test] - #[cfg(any(feature = "alloc", feature = "std"))] - fn test_parse_only_timezone_offset_permissive_no_panic() { - use crate::NaiveDate; - use crate::{FixedOffset, TimeZone}; - use std::fmt::Write; - - let dt = FixedOffset::east_opt(34200) - .unwrap() - .from_local_datetime( - &NaiveDate::from_ymd_opt(2001, 7, 8) - .unwrap() - .and_hms_nano_opt(0, 34, 59, 1_026_490_708) - .unwrap(), - ) - .unwrap(); - - let mut buf = String::new(); - let _ = write!(buf, "{}", dt.format("%#z")).expect_err("parse-only formatter should fail"); - } - - #[test] - #[cfg(all(feature = "unstable-locales", any(feature = "alloc", feature = "std")))] - fn test_strftime_localized_korean() { - let dt = FixedOffset::east_opt(34200) - .unwrap() - .with_ymd_and_hms(2001, 7, 8, 0, 34, 59) - .unwrap() - .with_nanosecond(1_026_490_708) - .unwrap(); - - // date specifiers - assert_eq!(dt.format_localized("%b", Locale::ko_KR).to_string(), " 7ì›”"); - assert_eq!(dt.format_localized("%B", Locale::ko_KR).to_string(), "7ì›”"); - assert_eq!(dt.format_localized("%h", Locale::ko_KR).to_string(), " 7ì›”"); - assert_eq!(dt.format_localized("%a", Locale::ko_KR).to_string(), "ì¼"); - assert_eq!(dt.format_localized("%A", Locale::ko_KR).to_string(), "ì¼ìš”ì¼"); - assert_eq!(dt.format_localized("%D", Locale::ko_KR).to_string(), "07/08/01"); - assert_eq!(dt.format_localized("%x", Locale::ko_KR).to_string(), "2001ë…„ 07ì›” 08ì¼"); - assert_eq!(dt.format_localized("%F", Locale::ko_KR).to_string(), "2001-07-08"); - assert_eq!(dt.format_localized("%v", Locale::ko_KR).to_string(), " 8- 7ì›”-2001"); - assert_eq!(dt.format_localized("%r", Locale::ko_KR).to_string(), "오전 12ì‹œ 34분 60ì´ˆ"); - - // date & time specifiers - assert_eq!( - dt.format_localized("%c", Locale::ko_KR).to_string(), - "2001ë…„ 07ì›” 08ì¼ (ì¼) 오전 12ì‹œ 34분 60ì´ˆ" - ); - } - - #[test] - #[cfg(all(feature = "unstable-locales", any(feature = "alloc", feature = "std")))] - fn test_strftime_localized_japanese() { - let dt = FixedOffset::east_opt(34200) - .unwrap() - .with_ymd_and_hms(2001, 7, 8, 0, 34, 59) - .unwrap() - .with_nanosecond(1_026_490_708) - .unwrap(); - - // date specifiers - assert_eq!(dt.format_localized("%b", Locale::ja_JP).to_string(), " 7月"); - assert_eq!(dt.format_localized("%B", Locale::ja_JP).to_string(), "7月"); - assert_eq!(dt.format_localized("%h", Locale::ja_JP).to_string(), " 7月"); - assert_eq!(dt.format_localized("%a", Locale::ja_JP).to_string(), "æ—¥"); - assert_eq!(dt.format_localized("%A", Locale::ja_JP).to_string(), "日曜日"); - assert_eq!(dt.format_localized("%D", Locale::ja_JP).to_string(), "07/08/01"); - assert_eq!(dt.format_localized("%x", Locale::ja_JP).to_string(), "2001å¹´07月08æ—¥"); - assert_eq!(dt.format_localized("%F", Locale::ja_JP).to_string(), "2001-07-08"); - assert_eq!(dt.format_localized("%v", Locale::ja_JP).to_string(), " 8- 7月-2001"); - assert_eq!(dt.format_localized("%r", Locale::ja_JP).to_string(), "åˆå‰12時34分60秒"); - - // date & time specifiers - assert_eq!( - dt.format_localized("%c", Locale::ja_JP).to_string(), - "2001å¹´07月08æ—¥ 00時34分60秒" - ); - } +#[test] +fn test_strftime_items() { + fn parse_and_collect(s: &str) -> Vec> { + // map any error into `[Item::Error]`. useful for easy testing. + let items = StrftimeItems::new(s); + let items = items.map(|spec| if spec == Item::Error { None } else { Some(spec) }); + items.collect::>>().unwrap_or_else(|| vec![Item::Error]) + } + + assert_eq!(parse_and_collect(""), []); + assert_eq!(parse_and_collect(" \t\n\r "), [sp!(" \t\n\r ")]); + assert_eq!(parse_and_collect("hello?"), [lit!("hello?")]); + assert_eq!( + parse_and_collect("a b\t\nc"), + [lit!("a"), sp!(" "), lit!("b"), sp!("\t\n"), lit!("c")] + ); + assert_eq!(parse_and_collect("100%%"), [lit!("100"), lit!("%")]); + assert_eq!(parse_and_collect("100%% ok"), [lit!("100"), lit!("%"), sp!(" "), lit!("ok")]); + assert_eq!(parse_and_collect("%%PDF-1.0"), [lit!("%"), lit!("PDF-1.0")]); + assert_eq!( + parse_and_collect("%Y-%m-%d"), + [num0!(Year), lit!("-"), num0!(Month), lit!("-"), num0!(Day)] + ); + assert_eq!(parse_and_collect("[%F]"), parse_and_collect("[%Y-%m-%d]")); + assert_eq!(parse_and_collect("%m %d"), [num0!(Month), sp!(" "), num0!(Day)]); + assert_eq!(parse_and_collect("%"), [Item::Error]); + assert_eq!(parse_and_collect("%%"), [lit!("%")]); + assert_eq!(parse_and_collect("%%%"), [Item::Error]); + assert_eq!(parse_and_collect("%%%%"), [lit!("%"), lit!("%")]); + assert_eq!(parse_and_collect("foo%?"), [Item::Error]); + assert_eq!(parse_and_collect("bar%42"), [Item::Error]); + assert_eq!(parse_and_collect("quux% +"), [Item::Error]); + assert_eq!(parse_and_collect("%.Z"), [Item::Error]); + assert_eq!(parse_and_collect("%:Z"), [Item::Error]); + assert_eq!(parse_and_collect("%-Z"), [Item::Error]); + assert_eq!(parse_and_collect("%0Z"), [Item::Error]); + assert_eq!(parse_and_collect("%_Z"), [Item::Error]); + assert_eq!(parse_and_collect("%.j"), [Item::Error]); + assert_eq!(parse_and_collect("%:j"), [Item::Error]); + assert_eq!(parse_and_collect("%-j"), [num!(Ordinal)]); + assert_eq!(parse_and_collect("%0j"), [num0!(Ordinal)]); + assert_eq!(parse_and_collect("%_j"), [nums!(Ordinal)]); + assert_eq!(parse_and_collect("%.e"), [Item::Error]); + assert_eq!(parse_and_collect("%:e"), [Item::Error]); + assert_eq!(parse_and_collect("%-e"), [num!(Day)]); + assert_eq!(parse_and_collect("%0e"), [num0!(Day)]); + assert_eq!(parse_and_collect("%_e"), [nums!(Day)]); + assert_eq!(parse_and_collect("%z"), [fix!(TimezoneOffset)]); + assert_eq!(parse_and_collect("%#z"), [internal_fix!(TimezoneOffsetPermissive)]); + assert_eq!(parse_and_collect("%#m"), [Item::Error]); +} - #[test] - #[cfg(all(feature = "unstable-locales", target_pointer_width = "64"))] - fn test_type_sizes() { - use core::mem::size_of; - assert_eq!(size_of::(), 24); - assert_eq!(size_of::(), 56); - assert_eq!(size_of::(), 2); - } +#[cfg(test)] +#[test] +fn test_strftime_docs() { + use crate::NaiveDate; + use crate::{DateTime, FixedOffset, TimeZone, Timelike, Utc}; + + let dt = FixedOffset::east_opt(34200) + .unwrap() + .from_local_datetime( + &NaiveDate::from_ymd_opt(2001, 7, 8) + .unwrap() + .and_hms_nano_opt(0, 34, 59, 1_026_490_708) + .unwrap(), + ) + .unwrap(); + + // date specifiers + assert_eq!(dt.format("%Y").to_string(), "2001"); + assert_eq!(dt.format("%C").to_string(), "20"); + assert_eq!(dt.format("%y").to_string(), "01"); + assert_eq!(dt.format("%m").to_string(), "07"); + assert_eq!(dt.format("%b").to_string(), "Jul"); + assert_eq!(dt.format("%B").to_string(), "July"); + assert_eq!(dt.format("%h").to_string(), "Jul"); + assert_eq!(dt.format("%d").to_string(), "08"); + assert_eq!(dt.format("%e").to_string(), " 8"); + assert_eq!(dt.format("%e").to_string(), dt.format("%_d").to_string()); + assert_eq!(dt.format("%a").to_string(), "Sun"); + assert_eq!(dt.format("%A").to_string(), "Sunday"); + assert_eq!(dt.format("%w").to_string(), "0"); + assert_eq!(dt.format("%u").to_string(), "7"); + assert_eq!(dt.format("%U").to_string(), "27"); + assert_eq!(dt.format("%W").to_string(), "27"); + assert_eq!(dt.format("%G").to_string(), "2001"); + assert_eq!(dt.format("%g").to_string(), "01"); + assert_eq!(dt.format("%V").to_string(), "27"); + assert_eq!(dt.format("%j").to_string(), "189"); + assert_eq!(dt.format("%D").to_string(), "07/08/01"); + assert_eq!(dt.format("%x").to_string(), "07/08/01"); + assert_eq!(dt.format("%F").to_string(), "2001-07-08"); + assert_eq!(dt.format("%v").to_string(), " 8-Jul-2001"); + + // time specifiers + assert_eq!(dt.format("%H").to_string(), "00"); + assert_eq!(dt.format("%k").to_string(), " 0"); + assert_eq!(dt.format("%k").to_string(), dt.format("%_H").to_string()); + assert_eq!(dt.format("%I").to_string(), "12"); + assert_eq!(dt.format("%l").to_string(), "12"); + assert_eq!(dt.format("%l").to_string(), dt.format("%_I").to_string()); + assert_eq!(dt.format("%P").to_string(), "am"); + assert_eq!(dt.format("%p").to_string(), "AM"); + assert_eq!(dt.format("%M").to_string(), "34"); + assert_eq!(dt.format("%S").to_string(), "60"); + assert_eq!(dt.format("%f").to_string(), "026490708"); + assert_eq!(dt.format("%.f").to_string(), ".026490708"); + assert_eq!(dt.with_nanosecond(1_026_490_000).unwrap().format("%.f").to_string(), ".026490"); + assert_eq!(dt.format("%.3f").to_string(), ".026"); + assert_eq!(dt.format("%.6f").to_string(), ".026490"); + assert_eq!(dt.format("%.9f").to_string(), ".026490708"); + assert_eq!(dt.format("%3f").to_string(), "026"); + assert_eq!(dt.format("%6f").to_string(), "026490"); + assert_eq!(dt.format("%9f").to_string(), "026490708"); + assert_eq!(dt.format("%R").to_string(), "00:34"); + assert_eq!(dt.format("%T").to_string(), "00:34:60"); + assert_eq!(dt.format("%X").to_string(), "00:34:60"); + assert_eq!(dt.format("%r").to_string(), "12:34:60 AM"); + + // time zone specifiers + //assert_eq!(dt.format("%Z").to_string(), "ACST"); + assert_eq!(dt.format("%z").to_string(), "+0930"); + assert_eq!(dt.format("%:z").to_string(), "+09:30"); + assert_eq!(dt.format("%::z").to_string(), "+09:30:00"); + assert_eq!(dt.format("%:::z").to_string(), "+09"); + + // date & time specifiers + assert_eq!(dt.format("%c").to_string(), "Sun Jul 8 00:34:60 2001"); + assert_eq!(dt.format("%+").to_string(), "2001-07-08T00:34:60.026490708+09:30"); + + assert_eq!( + dt.with_timezone(&Utc).format("%+").to_string(), + "2001-07-07T15:04:60.026490708+00:00" + ); + assert_eq!( + dt.with_timezone(&Utc), + DateTime::parse_from_str("2001-07-07T15:04:60.026490708Z", "%+").unwrap() + ); + assert_eq!( + dt.with_timezone(&Utc), + DateTime::parse_from_str("2001-07-07T15:04:60.026490708UTC", "%+").unwrap() + ); + assert_eq!( + dt.with_timezone(&Utc), + DateTime::parse_from_str("2001-07-07t15:04:60.026490708utc", "%+").unwrap() + ); + + assert_eq!( + dt.with_nanosecond(1_026_490_000).unwrap().format("%+").to_string(), + "2001-07-08T00:34:60.026490+09:30" + ); + assert_eq!(dt.format("%s").to_string(), "994518299"); + + // special specifiers + assert_eq!(dt.format("%t").to_string(), "\t"); + assert_eq!(dt.format("%n").to_string(), "\n"); + assert_eq!(dt.format("%%").to_string(), "%"); +} - #[test] - #[cfg(all(feature = "unstable-locales", target_pointer_width = "32"))] - fn test_type_sizes() { - use core::mem::size_of; - assert_eq!(size_of::(), 12); - assert_eq!(size_of::(), 28); - assert_eq!(size_of::(), 2); - } +#[cfg(feature = "unstable-locales")] +#[test] +fn test_strftime_docs_localized() { + use crate::{FixedOffset, NaiveDate, TimeZone}; + + let dt = FixedOffset::east_opt(34200).unwrap().ymd_opt(2001, 7, 8).unwrap().and_hms_nano( + 0, + 34, + 59, + 1_026_490_708, + ); + + // date specifiers + assert_eq!(dt.format_localized("%b", Locale::fr_BE).to_string(), "jui"); + assert_eq!(dt.format_localized("%B", Locale::fr_BE).to_string(), "juillet"); + assert_eq!(dt.format_localized("%h", Locale::fr_BE).to_string(), "jui"); + assert_eq!(dt.format_localized("%a", Locale::fr_BE).to_string(), "dim"); + assert_eq!(dt.format_localized("%A", Locale::fr_BE).to_string(), "dimanche"); + assert_eq!(dt.format_localized("%D", Locale::fr_BE).to_string(), "07/08/01"); + assert_eq!(dt.format_localized("%x", Locale::fr_BE).to_string(), "08/07/01"); + assert_eq!(dt.format_localized("%F", Locale::fr_BE).to_string(), "2001-07-08"); + assert_eq!(dt.format_localized("%v", Locale::fr_BE).to_string(), " 8-jui-2001"); + + // time specifiers + assert_eq!(dt.format_localized("%P", Locale::fr_BE).to_string(), ""); + assert_eq!(dt.format_localized("%p", Locale::fr_BE).to_string(), ""); + assert_eq!(dt.format_localized("%R", Locale::fr_BE).to_string(), "00:34"); + assert_eq!(dt.format_localized("%T", Locale::fr_BE).to_string(), "00:34:60"); + assert_eq!(dt.format_localized("%X", Locale::fr_BE).to_string(), "00:34:60"); + assert_eq!(dt.format_localized("%r", Locale::fr_BE).to_string(), "12:34:60 "); + + // date & time specifiers + assert_eq!( + dt.format_localized("%c", Locale::fr_BE).to_string(), + "dim 08 jui 2001 00:34:60 +09:30" + ); + + let nd = NaiveDate::from_ymd_opt(2001, 7, 8).unwrap(); + + // date specifiers + assert_eq!(nd.format_localized("%b", Locale::de_DE).to_string(), "Jul"); + assert_eq!(nd.format_localized("%B", Locale::de_DE).to_string(), "Juli"); + assert_eq!(nd.format_localized("%h", Locale::de_DE).to_string(), "Jul"); + assert_eq!(nd.format_localized("%a", Locale::de_DE).to_string(), "So"); + assert_eq!(nd.format_localized("%A", Locale::de_DE).to_string(), "Sonntag"); + assert_eq!(nd.format_localized("%D", Locale::de_DE).to_string(), "07/08/01"); + assert_eq!(nd.format_localized("%x", Locale::de_DE).to_string(), "08.07.2001"); + assert_eq!(nd.format_localized("%F", Locale::de_DE).to_string(), "2001-07-08"); + assert_eq!(nd.format_localized("%v", Locale::de_DE).to_string(), " 8-Jul-2001"); } diff -Nru temporalio-1.3.0/vendor/chrono/src/lib.rs temporalio-1.3.0/vendor/chrono/src/lib.rs --- temporalio-1.3.0/vendor/chrono/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/chrono/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,21 +1,20 @@ //! # Chrono: Date and Time for Rust //! - -//! Chrono aims to provide all functionality needed to do correct operations on dates and times in the -//! [proleptic Gregorian calendar](https://en.wikipedia.org/wiki/Proleptic_Gregorian_calendar): -//! -//! * The [`DateTime`](https://docs.rs/chrono/latest/chrono/struct.DateTime.html) type is timezone-aware -//! by default, with separate timezone-naive types. -//! * Operations that may produce an invalid or ambiguous date and time return `Option` or -//! [`LocalResult`](https://docs.rs/chrono/latest/chrono/offset/enum.LocalResult.html). -//! * Configurable parsing and formatting with a `strftime` inspired date and time formatting syntax. -//! * The [`Local`](https://docs.rs/chrono/latest/chrono/offset/struct.Local.html) timezone works with -//! the current timezone of the OS. -//! * Types and operations are implemented to be reasonably efficient. -//! -//! Timezone data is not shipped with chrono by default to limit binary sizes. Use the companion crate -//! [Chrono-TZ](https://crates.io/crates/chrono-tz) or [`tzfile`](https://crates.io/crates/tzfile) for -//! full timezone support. +//! It aims to be a feature-complete superset of +//! the [time](https://github.com/rust-lang-deprecated/time) library. +//! In particular, +//! +//! * Chrono strictly adheres to ISO 8601. +//! * Chrono is timezone-aware by default, with separate timezone-naive types. +//! * Chrono is space-optimal and (while not being the primary goal) reasonably efficient. +//! +//! There were several previous attempts to bring a good date and time library to Rust, +//! which Chrono builds upon and should acknowledge: +//! +//! * [Initial research on +//! the wiki](https://github.com/rust-lang/rust-wiki-backup/blob/master/Lib-datetime.md) +//! * Dietrich Epp's [datetime-rs](https://github.com/depp/datetime-rs) +//! * Luis de Bethencourt's [rust-datetime](https://github.com/luisbg/rust-datetime) //! //! ### Features //! @@ -30,18 +29,13 @@ //! and traits. //! - `clock`: Enables reading the system time (`now`) that depends on the standard library for //! UNIX-like operating systems and the Windows API (`winapi`) for Windows. -//! - `wasmbind`: Interface with the JS Date API for the `wasm32` target. //! //! Optional features: //! //! - [`serde`][]: Enable serialization/deserialization via serde. -//! - `rkyv`: Enable serialization/deserialization via rkyv. -//! - `arbitrary`: construct arbitrary instances of a type with the Arbitrary crate. //! - `unstable-locales`: Enable localization. This adds various methods with a //! `_localized` suffix. The implementation and API may change or even be //! removed in a patch release. Feedback welcome. -//! - `oldtime`: this feature no langer has a function, but once offered compatibility with the -//! `time` 0.1 crate. //! //! [`serde`]: https://github.com/serde-rs/serde //! [wasm-bindgen]: https://github.com/rustwasm/wasm-bindgen @@ -62,6 +56,14 @@ //! nanoseconds and does not represent "nominal" components such as days or //! months. //! +//! When the `oldtime` feature is enabled, [`Duration`] is an alias for the +//! [`time::Duration`](https://docs.rs/time/0.1.40/time/struct.Duration.html) +//! type from v0.1 of the time crate. time v0.1 is deprecated, so new code +//! should disable the `oldtime` feature and use the `chrono::Duration` type +//! instead. The `oldtime` feature is enabled by default for backwards +//! compatibility, but future versions of Chrono are likely to remove the +//! feature entirely. +//! //! Chrono does not yet natively support //! the standard [`Duration`](https://doc.rust-lang.org/std/time/struct.Duration.html) type, //! but it will be supported in the future. @@ -296,12 +298,16 @@ //! Ok(fixed_dt.clone())); //! assert_eq!(DateTime::parse_from_rfc3339("2014-11-28T21:00:09+09:00"), Ok(fixed_dt.clone())); //! +//! // method 3 +//! assert_eq!(Utc.datetime_from_str("2014-11-28 12:00:09", "%Y-%m-%d %H:%M:%S"), Ok(dt.clone())); +//! assert_eq!(Utc.datetime_from_str("Fri Nov 28 12:00:09 2014", "%a %b %e %T %Y"), Ok(dt.clone())); +//! //! // oops, the year is missing! -//! assert!(DateTime::parse_from_str("Fri Nov 28 12:00:09", "%a %b %e %T %Y").is_err()); +//! assert!(Utc.datetime_from_str("Fri Nov 28 12:00:09", "%a %b %e %T %Y").is_err()); //! // oops, the format string does not include the year at all! -//! assert!(DateTime::parse_from_str("Fri Nov 28 12:00:09", "%a %b %e %T").is_err()); +//! assert!(Utc.datetime_from_str("Fri Nov 28 12:00:09", "%a %b %e %T").is_err()); //! // oops, the weekday is incorrect! -//! assert!(DateTime::parse_from_str("Sat Nov 28 12:00:09 2014", "%a %b %e %T %Y").is_err()); +//! assert!(Utc.datetime_from_str("Sat Nov 28 12:00:09 2014", "%a %b %e %T %Y").is_err()); //! ``` //! //! Again : See [`format::strftime`](./format/strftime/index.html#specifiers) @@ -309,22 +315,22 @@ //! //! ### Conversion from and to EPOCH timestamps //! -//! Use [`DateTime::from_timestamp(seconds, nanoseconds)`](DateTime::from_timestamp) -//! to construct a [`DateTime`] from a UNIX timestamp +//! Use [`Utc.timestamp(seconds, nanoseconds)`](./offset/trait.TimeZone.html#method.timestamp) +//! to construct a [`DateTime`](./struct.DateTime.html) from a UNIX timestamp //! (seconds, nanoseconds that passed since January 1st 1970). //! -//! Use [`DateTime.timestamp`](DateTime::timestamp) to get the timestamp (in seconds) -//! from a [`DateTime`]. Additionally, you can use -//! [`DateTime.timestamp_subsec_nanos`](DateTime::timestamp_subsec_nanos) +//! Use [`DateTime.timestamp`](./struct.DateTime.html#method.timestamp) to get the timestamp (in seconds) +//! from a [`DateTime`](./struct.DateTime.html). Additionally, you can use +//! [`DateTime.timestamp_subsec_nanos`](./struct.DateTime.html#method.timestamp_subsec_nanos) //! to get the number of additional number of nanoseconds. //! #![cfg_attr(not(feature = "std"), doc = "```ignore")] #![cfg_attr(feature = "std", doc = "```rust")] //! // We need the trait in scope to use Utc::timestamp(). -//! use chrono::{DateTime, Utc}; +//! use chrono::{DateTime, TimeZone, Utc}; //! //! // Construct a datetime from epoch: -//! let dt: DateTime = DateTime::from_timestamp(1_500_000_000, 0).unwrap(); +//! let dt = Utc.timestamp_opt(1_500_000_000, 0).unwrap(); //! assert_eq!(dt.to_rfc2822(), "Fri, 14 Jul 2017 02:40:00 +0000"); //! //! // Get epoch value from a datetime: @@ -351,18 +357,18 @@ //! //! ## Limitations //! -//! Only the proleptic Gregorian calendar (i.e. extended to support older dates) is supported. -//! Date types are limited to about +/- 262,000 years from the common epoch. -//! Time types are limited to nanosecond accuracy. -//! Leap seconds can be represented, but Chrono does not fully support them. -//! See [Leap Second Handling](https://docs.rs/chrono/latest/chrono/naive/struct.NaiveTime.html#leap-second-handling). +//! Only proleptic Gregorian calendar (i.e. extended to support older dates) is supported. +//! Be very careful if you really have to deal with pre-20C dates, they can be in Julian or others. //! -//! ## Rust version requirements +//! Date types are limited in about +/- 262,000 years from the common epoch. +//! Time types are limited in the nanosecond accuracy. //! -//! The Minimum Supported Rust Version (MSRV) is currently **Rust 1.57.0**. -//! -//! The MSRV is explicitly tested in CI. It may be bumped in minor releases, but this is not done -//! lightly. +//! [Leap seconds are supported in the representation but +//! Chrono doesn't try to make use of them](./naive/struct.NaiveTime.html#leap-second-handling). +//! (The main reason is that leap seconds are not really predictable.) +//! Almost *every* operation over the possible leap seconds will ignore them. +//! Consider using `NaiveDateTime` with the implicit TAI (International Atomic Time) scale +//! if you want. //! //! Chrono inherently does not support an inaccurate or partial date and time representation. //! Any operation that can be ambiguous will return `None` in such cases. @@ -375,112 +381,37 @@ //! //! Advanced time zone handling is not yet supported. //! For now you can try the [Chrono-tz](https://github.com/chronotope/chrono-tz/) crate instead. -//! -//! ## Relation between chrono and time 0.1 -//! -//! Rust first had a `time` module added to `std` in its 0.7 release. It later moved to -//! `libextra`, and then to a `libtime` library shipped alongside the standard library. In 2014 -//! work on chrono started in order to provide a full-featured date and time library in Rust. -//! Some improvements from chrono made it into the standard library; notably, `chrono::Duration` -//! was included as `std::time::Duration` ([rust#15934]) in 2014. -//! -//! In preparation of Rust 1.0 at the end of 2014 `libtime` was moved out of the Rust distro and -//! into the `time` crate to eventually be redesigned ([rust#18832], [rust#18858]), like the -//! `num` and `rand` crates. Of course chrono kept its dependency on this `time` crate. `time` -//! started re-exporting `std::time::Duration` during this period. Later, the standard library was -//! changed to have a more limited unsigned `Duration` type ([rust#24920], [RFC 1040]), while the -//! `time` crate kept the full functionality with `time::Duration`. `time::Duration` had been a -//! part of chrono's public API. -//! -//! By 2016 `time` 0.1 lived under the `rust-lang-deprecated` organisation and was not actively -//! maintained ([time#136]). chrono absorbed the platform functionality and `Duration` type of the -//! `time` crate in [chrono#478] (the work started in [chrono#286]). In order to preserve -//! compatibility with downstream crates depending on `time` and `chrono` sharing a `Duration` -//! type, chrono kept depending on time 0.1. chrono offered the option to opt out of the `time` -//! dependency by disabling the `oldtime` feature (swapping it out for an effectively similar -//! chrono type). In 2019, @jhpratt took over maintenance on the `time` crate and released what -//! amounts to a new crate as `time` 0.2. -//! -//! [rust#15934]: https://github.com/rust-lang/rust/pull/15934 -//! [rust#18832]: https://github.com/rust-lang/rust/pull/18832#issuecomment-62448221 -//! [rust#18858]: https://github.com/rust-lang/rust/pull/18858 -//! [rust#24920]: https://github.com/rust-lang/rust/pull/24920 -//! [RFC 1040]: https://rust-lang.github.io/rfcs/1040-duration-reform.html -//! [time#136]: https://github.com/time-rs/time/issues/136 -//! [chrono#286]: https://github.com/chronotope/chrono/pull/286 -//! [chrono#478]: https://github.com/chronotope/chrono/pull/478 -//! -//! ## Security advisories -//! -//! In November of 2020 [CVE-2020-26235] and [RUSTSEC-2020-0071] were opened against the `time` crate. -//! @quininer had found that calls to `localtime_r` may be unsound ([chrono#499]). Eventually, almost -//! a year later, this was also made into a security advisory against chrono as [RUSTSEC-2020-0159], -//! which had platform code similar to `time`. -//! -//! On Unix-like systems a process is given a timezone id or description via the `TZ` environment -//! variable. We need this timezone data to calculate the current local time from a value that is -//! in UTC, such as the time from the system clock. `time` 0.1 and chrono used the POSIX function -//! `localtime_r` to do the conversion to local time, which reads the `TZ` variable. -//! -//! Rust assumes the environment to be writable and uses locks to access it from multiple threads. -//! Some other programming languages and libraries use similar locking strategies, but these are -//! typically not shared across languages. More importantly, POSIX declares modifying the -//! environment in a multi-threaded process as unsafe, and `getenv` in libc can't be changed to -//! take a lock because it returns a pointer to the data (see [rust#27970] for more discussion). -//! -//! Since version 4.20 chrono no longer uses `localtime_r`, instead using Rust code to query the -//! timezone (from the `TZ` variable or via `iana-time-zone` as a fallback) and work with data -//! from the system timezone database directly. The code for this was forked from the [tz-rs crate] -//! by @x-hgg-x. As such, chrono now respects the Rust lock when reading the `TZ` environment -//! variable. In general, code should avoid modifying the environment. -//! -//! [CVE-2020-26235]: https://nvd.nist.gov/vuln/detail/CVE-2020-26235 -//! [RUSTSEC-2020-0071]: https://rustsec.org/advisories/RUSTSEC-2020-0071 -//! [chrono#499]: https://github.com/chronotope/chrono/pull/499 -//! [RUSTSEC-2020-0159]: https://rustsec.org/advisories/RUSTSEC-2020-0159.html -//! [rust#27970]: https://github.com/rust-lang/rust/issues/27970 -//! [chrono#677]: https://github.com/chronotope/chrono/pull/677 -//! [tz-rs crate]: https://crates.io/crates/tz-rs -//! -//! ## Removing time 0.1 -//! -//! Because time 0.1 has been unmaintained for years, however, the security advisory mentioned -//! above has not been addressed. While chrono maintainers were careful not to break backwards -//! compatibility with the `time::Duration` type, there has been a long stream of issues from -//! users inquiring about the time 0.1 dependency with the vulnerability. We investigated the -//! potential breakage of removing the time 0.1 dependency in [chrono#1095] using a crater-like -//! experiment and determined that the potential for breaking (public) dependencies is very low. -//! We reached out to those few crates that did still depend on compatibility with time 0.1. -//! -//! As such, for chrono 0.4.30 we have decided to swap out the time 0.1 `Duration` implementation -//! for a local one that will offer a strict superset of the existing API going forward. This -//! will prevent most downstream users from being affected by the security vulnerability in time -//! 0.1 while minimizing the ecosystem impact of semver-incompatible version churn. -//! -//! [chrono#1095]: https://github.com/chronotope/chrono/pull/1095 #![doc(html_root_url = "https://docs.rs/chrono/latest/", test(attr(deny(warnings))))] #![cfg_attr(feature = "bench", feature(test))] // lib stability features as per RFC #507 #![deny(missing_docs)] #![deny(missing_debug_implementations)] #![warn(unreachable_pub)] -#![deny(clippy::tests_outside_test_module)] +#![deny(dead_code)] #![cfg_attr(not(any(feature = "std", test)), no_std)] // can remove this if/when rustc-serialize support is removed // keeps clippy happy in the meantime #![cfg_attr(feature = "rustc-serialize", allow(deprecated))] #![cfg_attr(docsrs, feature(doc_cfg))] -#[cfg(feature = "alloc")] -extern crate alloc; - -mod duration; -pub use duration::Duration; -#[cfg(feature = "std")] -pub use duration::OutOfRangeError; +#[cfg(feature = "oldtime")] +#[cfg_attr(docsrs, doc(cfg(feature = "oldtime")))] +extern crate time as oldtime; +#[cfg(not(feature = "oldtime"))] +mod oldtime; +// this reexport is to aid the transition and should not be in the prelude! +pub use oldtime::{Duration, OutOfRangeError}; use core::fmt; +#[cfg(feature = "__doctest")] +#[cfg_attr(feature = "__doctest", cfg(doctest))] +use doc_comment::doctest; + +#[cfg(feature = "__doctest")] +#[cfg_attr(feature = "__doctest", cfg(doctest))] +doctest!("../README.md"); + /// A convenience module appropriate for glob imports (`use chrono::prelude::*;`). pub mod prelude { #[doc(no_inline)] @@ -595,25 +526,3 @@ #[cfg(feature = "std")] impl std::error::Error for OutOfRange {} - -/// Workaround because `?` is not (yet) available in const context. -#[macro_export] -macro_rules! try_opt { - ($e:expr) => { - match $e { - Some(v) => v, - None => return None, - } - }; -} - -/// Workaround because `.expect()` is not (yet) available in const context. -#[macro_export] -macro_rules! expect { - ($e:expr, $m:literal) => { - match $e { - Some(v) => v, - None => panic!($m), - } - }; -} diff -Nru temporalio-1.3.0/vendor/chrono/src/month.rs temporalio-1.3.0/vendor/chrono/src/month.rs --- temporalio-1.3.0/vendor/chrono/src/month.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/chrono/src/month.rs 2023-10-30 19:40:00.000000000 +0000 @@ -28,7 +28,7 @@ /// Allows mapping from and to month, from 1-January to 12-December. /// Can be Serialized/Deserialized with serde // Actual implementation is zero-indexed, API intended as 1-indexed for more intuitive behavior. -#[derive(PartialEq, Eq, Copy, Clone, Debug, Hash, PartialOrd, Ord)] +#[derive(PartialEq, Eq, Copy, Clone, Debug, Hash, PartialOrd)] #[cfg_attr(feature = "rustc-serialize", derive(RustcEncodable, RustcDecodable))] #[cfg_attr(feature = "rkyv", derive(Archive, Deserialize, Serialize))] #[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))] @@ -218,7 +218,7 @@ } /// A duration in calendar months -#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq, PartialOrd, Ord)] +#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq, PartialOrd)] #[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))] pub struct Months(pub(crate) u32); @@ -235,16 +235,6 @@ pub(crate) _dummy: (), } -#[cfg(feature = "std")] -#[cfg_attr(docsrs, doc(cfg(feature = "std")))] -impl std::error::Error for ParseMonthError {} - -impl fmt::Display for ParseMonthError { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "ParseMonthError {{ .. }}") - } -} - impl fmt::Debug for ParseMonthError { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!(f, "ParseMonthError {{ .. }}") @@ -293,68 +283,8 @@ deserializer.deserialize_str(MonthVisitor) } } -} - -#[cfg(test)] -mod tests { - use super::Month; - use crate::{Datelike, OutOfRange, TimeZone, Utc}; - - #[test] - fn test_month_enum_try_from() { - assert_eq!(Month::try_from(1), Ok(Month::January)); - assert_eq!(Month::try_from(2), Ok(Month::February)); - assert_eq!(Month::try_from(12), Ok(Month::December)); - assert_eq!(Month::try_from(13), Err(OutOfRange::new())); - - let date = Utc.with_ymd_and_hms(2019, 10, 28, 9, 10, 11).unwrap(); - assert_eq!(Month::try_from(date.month() as u8), Ok(Month::October)); - - let month = Month::January; - let dt = Utc.with_ymd_and_hms(2019, month.number_from_month(), 28, 9, 10, 11).unwrap(); - assert_eq!((dt.year(), dt.month(), dt.day()), (2019, 1, 28)); - } - - #[test] - fn test_month_enum_primitive_parse() { - use num_traits::FromPrimitive; - - let jan_opt = Month::from_u32(1); - let feb_opt = Month::from_u64(2); - let dec_opt = Month::from_i64(12); - let no_month = Month::from_u32(13); - assert_eq!(jan_opt, Some(Month::January)); - assert_eq!(feb_opt, Some(Month::February)); - assert_eq!(dec_opt, Some(Month::December)); - assert_eq!(no_month, None); - - let date = Utc.with_ymd_and_hms(2019, 10, 28, 9, 10, 11).unwrap(); - assert_eq!(Month::from_u32(date.month()), Some(Month::October)); - - let month = Month::January; - let dt = Utc.with_ymd_and_hms(2019, month.number_from_month(), 28, 9, 10, 11).unwrap(); - assert_eq!((dt.year(), dt.month(), dt.day()), (2019, 1, 28)); - } - - #[test] - fn test_month_enum_succ_pred() { - assert_eq!(Month::January.succ(), Month::February); - assert_eq!(Month::December.succ(), Month::January); - assert_eq!(Month::January.pred(), Month::December); - assert_eq!(Month::February.pred(), Month::January); - } - - #[test] - fn test_month_partial_ord() { - assert!(Month::January <= Month::January); - assert!(Month::January < Month::February); - assert!(Month::January < Month::December); - assert!(Month::July >= Month::May); - assert!(Month::September > Month::March); - } #[test] - #[cfg(feature = "serde")] fn test_serde_serialize() { use serde_json::to_string; use Month::*; @@ -381,7 +311,6 @@ } #[test] - #[cfg(feature = "serde")] fn test_serde_deserialize() { use serde_json::from_str; use Month::*; @@ -416,3 +345,62 @@ } } } + +#[cfg(test)] +mod tests { + use super::Month; + use crate::{Datelike, OutOfRange, TimeZone, Utc}; + + #[test] + fn test_month_enum_try_from() { + assert_eq!(Month::try_from(1), Ok(Month::January)); + assert_eq!(Month::try_from(2), Ok(Month::February)); + assert_eq!(Month::try_from(12), Ok(Month::December)); + assert_eq!(Month::try_from(13), Err(OutOfRange::new())); + + let date = Utc.with_ymd_and_hms(2019, 10, 28, 9, 10, 11).unwrap(); + assert_eq!(Month::try_from(date.month() as u8), Ok(Month::October)); + + let month = Month::January; + let dt = Utc.with_ymd_and_hms(2019, month.number_from_month(), 28, 9, 10, 11).unwrap(); + assert_eq!((dt.year(), dt.month(), dt.day()), (2019, 1, 28)); + } + + #[test] + fn test_month_enum_primitive_parse() { + use num_traits::FromPrimitive; + + let jan_opt = Month::from_u32(1); + let feb_opt = Month::from_u64(2); + let dec_opt = Month::from_i64(12); + let no_month = Month::from_u32(13); + assert_eq!(jan_opt, Some(Month::January)); + assert_eq!(feb_opt, Some(Month::February)); + assert_eq!(dec_opt, Some(Month::December)); + assert_eq!(no_month, None); + + let date = Utc.with_ymd_and_hms(2019, 10, 28, 9, 10, 11).unwrap(); + assert_eq!(Month::from_u32(date.month()), Some(Month::October)); + + let month = Month::January; + let dt = Utc.with_ymd_and_hms(2019, month.number_from_month(), 28, 9, 10, 11).unwrap(); + assert_eq!((dt.year(), dt.month(), dt.day()), (2019, 1, 28)); + } + + #[test] + fn test_month_enum_succ_pred() { + assert_eq!(Month::January.succ(), Month::February); + assert_eq!(Month::December.succ(), Month::January); + assert_eq!(Month::January.pred(), Month::December); + assert_eq!(Month::February.pred(), Month::January); + } + + #[test] + fn test_month_partial_ord() { + assert!(Month::January <= Month::January); + assert!(Month::January < Month::February); + assert!(Month::January < Month::December); + assert!(Month::July >= Month::May); + assert!(Month::September > Month::March); + } +} diff -Nru temporalio-1.3.0/vendor/chrono/src/naive/date.rs temporalio-1.3.0/vendor/chrono/src/naive/date.rs --- temporalio-1.3.0/vendor/chrono/src/naive/date.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/chrono/src/naive/date.rs 2023-10-30 19:40:00.000000000 +0000 @@ -3,9 +3,8 @@ //! ISO 8601 calendar date without timezone. -#[cfg(any(feature = "alloc", feature = "std"))] +#[cfg(any(feature = "alloc", feature = "std", test))] use core::borrow::Borrow; -use core::iter::FusedIterator; use core::ops::{Add, AddAssign, RangeInclusive, Sub, SubAssign}; use core::{fmt, str}; @@ -16,8 +15,7 @@ #[cfg(feature = "unstable-locales")] use pure_rust_locales::Locale; -use crate::duration::Duration as OldDuration; -#[cfg(any(feature = "alloc", feature = "std"))] +#[cfg(any(feature = "alloc", feature = "std", test))] use crate::format::DelayedFormat; use crate::format::{ parse, parse_and_remainder, write_hundreds, Item, Numeric, Pad, ParseError, ParseResult, @@ -25,8 +23,8 @@ }; use crate::month::Months; use crate::naive::{IsoWeek, NaiveDateTime, NaiveTime}; -use crate::{expect, try_opt}; -use crate::{Datelike, Weekday}; +use crate::oldtime::Duration as OldDuration; +use crate::{Datelike, Duration, Weekday}; use super::internals::{self, DateImpl, Mdf, Of, YearFlags}; use super::isoweek; @@ -34,6 +32,29 @@ const MAX_YEAR: i32 = internals::MAX_YEAR; const MIN_YEAR: i32 = internals::MIN_YEAR; +// MAX_YEAR-12-31 minus 0000-01-01 +// = ((MAX_YEAR+1)-01-01 minus 0001-01-01) + (0001-01-01 minus 0000-01-01) - 1 day +// = ((MAX_YEAR+1)-01-01 minus 0001-01-01) + 365 days +// = MAX_YEAR * 365 + (# of leap years from 0001 to MAX_YEAR) + 365 days +#[cfg(test)] // only used for testing +const MAX_DAYS_FROM_YEAR_0: i32 = + MAX_YEAR * 365 + MAX_YEAR / 4 - MAX_YEAR / 100 + MAX_YEAR / 400 + 365; + +// MIN_YEAR-01-01 minus 0000-01-01 +// = (MIN_YEAR+400n+1)-01-01 minus (400n+1)-01-01 +// = ((MIN_YEAR+400n+1)-01-01 minus 0001-01-01) - ((400n+1)-01-01 minus 0001-01-01) +// = ((MIN_YEAR+400n+1)-01-01 minus 0001-01-01) - 146097n days +// +// n is set to 1000 for convenience. +#[cfg(test)] // only used for testing +const MIN_DAYS_FROM_YEAR_0: i32 = (MIN_YEAR + 400_000) * 365 + (MIN_YEAR + 400_000) / 4 + - (MIN_YEAR + 400_000) / 100 + + (MIN_YEAR + 400_000) / 400 + - 146_097_000; + +#[cfg(test)] // only used for testing, but duplicated in naive::datetime +const MAX_BITS: usize = 44; + /// A week represented by a [`NaiveDate`] and a [`Weekday`] which is the first /// day of the week. #[derive(Debug)] @@ -45,11 +66,6 @@ impl NaiveWeek { /// Returns a date representing the first day of the week. /// - /// # Panics - /// - /// Panics if the first day of the week happens to fall just out of range of `NaiveDate` - /// (more than ca. 262,000 years away from common era). - /// /// # Examples /// /// ``` @@ -68,16 +84,11 @@ // Do not construct an intermediate date beyond `self.date`, because that may be out of // range if `date` is close to `NaiveDate::MAX`. let days = start - ref_day - if start > ref_day { 7 } else { 0 }; - self.date.add_days(days).unwrap() + self.date.diff_days(days as i64).unwrap() } /// Returns a date representing the last day of the week. /// - /// # Panics - /// - /// Panics if the last day of the week happens to fall just out of range of `NaiveDate` - /// (more than ca. 262,000 years away from common era). - /// /// # Examples /// /// ``` @@ -96,18 +107,13 @@ // Do not construct an intermediate date before `self.date` (like with `first_day()`), // because that may be out of range if `date` is close to `NaiveDate::MIN`. let days = end - ref_day + if end < ref_day { 7 } else { 0 }; - self.date.add_days(days).unwrap() + self.date.diff_days(days as i64).unwrap() } /// Returns a [`RangeInclusive`] representing the whole week bounded by /// [first_day](./struct.NaiveWeek.html#method.first_day) and /// [last_day](./struct.NaiveWeek.html#method.last_day) functions. /// - /// # Panics - /// - /// Panics if the either the first or last day of the week happens to fall just out of range of - /// `NaiveDate` (more than ca. 262,000 years away from common era). - /// /// # Examples /// /// ``` @@ -131,7 +137,7 @@ /// that adding `Duration::days(1)` doesn't increment the day value as expected due to it being a /// fixed number of seconds. This difference applies only when dealing with `DateTime` data types /// and in other cases `Duration::days(n)` and `Days::new(n)` are equivalent. -#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq, PartialOrd, Ord)] +#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq, PartialOrd)] pub struct Days(pub(crate) u64); impl Days { @@ -213,6 +219,34 @@ } } +// as it is hard to verify year flags in `NaiveDate::MIN` and `NaiveDate::MAX`, +// we use a separate run-time test. +#[test] +fn test_date_bounds() { + let calculated_min = NaiveDate::from_ymd_opt(MIN_YEAR, 1, 1).unwrap(); + let calculated_max = NaiveDate::from_ymd_opt(MAX_YEAR, 12, 31).unwrap(); + assert!( + NaiveDate::MIN == calculated_min, + "`NaiveDate::MIN` should have a year flag {:?}", + calculated_min.of().flags() + ); + assert!( + NaiveDate::MAX == calculated_max, + "`NaiveDate::MAX` should have a year flag {:?}", + calculated_max.of().flags() + ); + + // let's also check that the entire range do not exceed 2^44 seconds + // (sometimes used for bounding `Duration` against overflow) + let maxsecs = NaiveDate::MAX.signed_duration_since(NaiveDate::MIN).num_seconds(); + let maxsecs = maxsecs + 86401; // also take care of DateTime + assert!( + maxsecs < (1 << MAX_BITS), + "The entire `NaiveDate` range somehow exceeds 2^{} seconds", + MAX_BITS + ); +} + impl NaiveDate { pub(crate) fn weeks_from(&self, day: Weekday) -> i32 { (self.ordinal() as i32 - self.weekday().num_days_from(day) as i32 + 6) / 7 @@ -228,7 +262,8 @@ if year < MIN_YEAR || year > MAX_YEAR { return None; // Out-of-range } - debug_assert!(YearFlags::from_year(year).0 == flags.0); + // Enable debug check once the MSRV >= 1.57 (panicking in const feature) + // debug_assert!(YearFlags::from_year(year).0 == flags.0); match Of::new(ordinal, flags) { Some(of) => Some(NaiveDate { ymdf: (year << 13) | (of.inner() as DateImpl) }), None => None, // Invalid: Ordinal outside of the nr of days in a year with those flags. @@ -250,25 +285,17 @@ /// Makes a new `NaiveDate` from the [calendar date](#calendar-date) /// (year, month and day). /// - /// # Panics - /// - /// Panics if the specified calendar day does not exist, on invalid values for `month` or `day`, - /// or if `year` is out of range for `NaiveDate`. + /// Panics on the out-of-range date, invalid month and/or day. #[deprecated(since = "0.4.23", note = "use `from_ymd_opt()` instead")] #[must_use] - pub const fn from_ymd(year: i32, month: u32, day: u32) -> NaiveDate { - expect!(NaiveDate::from_ymd_opt(year, month, day), "invalid or out-of-range date") + pub fn from_ymd(year: i32, month: u32, day: u32) -> NaiveDate { + NaiveDate::from_ymd_opt(year, month, day).expect("invalid or out-of-range date") } /// Makes a new `NaiveDate` from the [calendar date](#calendar-date) /// (year, month and day). /// - /// # Errors - /// - /// Returns `None` if: - /// - The specified calendar day does not exist (for example 2023-04-31). - /// - The value for `month` or `day` is invalid. - /// - `year` is out of range for `NaiveDate`. + /// Returns `None` on the out-of-range date, invalid month and/or day. /// /// # Example /// @@ -285,38 +312,25 @@ /// assert!(from_ymd_opt(-400000, 1, 1).is_none()); /// ``` #[must_use] - pub const fn from_ymd_opt(year: i32, month: u32, day: u32) -> Option { + pub fn from_ymd_opt(year: i32, month: u32, day: u32) -> Option { let flags = YearFlags::from_year(year); - - if let Some(mdf) = Mdf::new(month, day, flags) { - NaiveDate::from_mdf(year, mdf) - } else { - None - } + NaiveDate::from_mdf(year, Mdf::new(month, day, flags)?) } /// Makes a new `NaiveDate` from the [ordinal date](#ordinal-date) /// (year and day of the year). /// - /// # Panics - /// - /// Panics if the specified ordinal day does not exist, on invalid values for `ordinal`, or if - /// `year` is out of range for `NaiveDate`. + /// Panics on the out-of-range date and/or invalid day of year. #[deprecated(since = "0.4.23", note = "use `from_yo_opt()` instead")] #[must_use] - pub const fn from_yo(year: i32, ordinal: u32) -> NaiveDate { - expect!(NaiveDate::from_yo_opt(year, ordinal), "invalid or out-of-range date") + pub fn from_yo(year: i32, ordinal: u32) -> NaiveDate { + NaiveDate::from_yo_opt(year, ordinal).expect("invalid or out-of-range date") } /// Makes a new `NaiveDate` from the [ordinal date](#ordinal-date) /// (year and day of the year). /// - /// # Errors - /// - /// Returns `None` if: - /// - The specified ordinal day does not exist (for example 2023-366). - /// - The value for `ordinal` is invalid (for example: `0`, `400`). - /// - `year` is out of range for `NaiveDate`. + /// Returns `None` on the out-of-range date and/or invalid day of year. /// /// # Example /// @@ -334,7 +348,7 @@ /// assert!(from_yo_opt(-400000, 1).is_none()); /// ``` #[must_use] - pub const fn from_yo_opt(year: i32, ordinal: u32) -> Option { + pub fn from_yo_opt(year: i32, ordinal: u32) -> Option { let flags = YearFlags::from_year(year); NaiveDate::from_ordinal_and_flags(year, ordinal, flags) } @@ -343,26 +357,18 @@ /// (year, week number and day of the week). /// The resulting `NaiveDate` may have a different year from the input year. /// - /// # Panics - /// - /// Panics if the specified week does not exist in that year, on invalid values for `week`, or - /// if the resulting date is out of range for `NaiveDate`. + /// Panics on the out-of-range date and/or invalid week number. #[deprecated(since = "0.4.23", note = "use `from_isoywd_opt()` instead")] #[must_use] - pub const fn from_isoywd(year: i32, week: u32, weekday: Weekday) -> NaiveDate { - expect!(NaiveDate::from_isoywd_opt(year, week, weekday), "invalid or out-of-range date") + pub fn from_isoywd(year: i32, week: u32, weekday: Weekday) -> NaiveDate { + NaiveDate::from_isoywd_opt(year, week, weekday).expect("invalid or out-of-range date") } /// Makes a new `NaiveDate` from the [ISO week date](#week-date) /// (year, week number and day of the week). /// The resulting `NaiveDate` may have a different year from the input year. /// - /// # Errors - /// - /// Returns `None` if: - /// - The specified week does not exist in that year (for example 2023 week 53). - /// - The value for `week` is invalid (for example: `0`, `60`). - /// - If the resulting date is out of range for `NaiveDate`. + /// Returns `None` on the out-of-range date and/or invalid week number. /// /// # Example /// @@ -403,7 +409,7 @@ /// assert_eq!(from_isoywd_opt(2016, 1, Weekday::Mon), Some(from_ymd(2016, 1, 4))); /// ``` #[must_use] - pub const fn from_isoywd_opt(year: i32, week: u32, weekday: Weekday) -> Option { + pub fn from_isoywd_opt(year: i32, week: u32, weekday: Weekday) -> Option { let flags = YearFlags::from_year(year); let nweeks = flags.nisoweeks(); if 1 <= week && week <= nweeks { @@ -438,21 +444,17 @@ /// Makes a new `NaiveDate` from a day's number in the proleptic Gregorian calendar, with /// January 1, 1 being day 1. /// - /// # Panics - /// /// Panics if the date is out of range. #[deprecated(since = "0.4.23", note = "use `from_num_days_from_ce_opt()` instead")] #[inline] #[must_use] - pub const fn from_num_days_from_ce(days: i32) -> NaiveDate { - expect!(NaiveDate::from_num_days_from_ce_opt(days), "out-of-range date") + pub fn from_num_days_from_ce(days: i32) -> NaiveDate { + NaiveDate::from_num_days_from_ce_opt(days).expect("out-of-range date") } /// Makes a new `NaiveDate` from a day's number in the proleptic Gregorian calendar, with /// January 1, 1 being day 1. /// - /// # Errors - /// /// Returns `None` if the date is out of range. /// /// # Example @@ -471,58 +473,44 @@ /// assert_eq!(from_ndays_opt(-100_000_000), None); /// ``` #[must_use] - pub const fn from_num_days_from_ce_opt(days: i32) -> Option { - let days = try_opt!(days.checked_add(365)); // make December 31, 1 BCE equal to day 0 - let year_div_400 = days.div_euclid(146_097); - let cycle = days.rem_euclid(146_097); + pub fn from_num_days_from_ce_opt(days: i32) -> Option { + let days = days.checked_add(365)?; // make December 31, 1 BCE equal to day 0 + let (year_div_400, cycle) = div_mod_floor(days, 146_097); let (year_mod_400, ordinal) = internals::cycle_to_yo(cycle as u32); let flags = YearFlags::from_year_mod_400(year_mod_400 as i32); NaiveDate::from_ordinal_and_flags(year_div_400 * 400 + year_mod_400 as i32, ordinal, flags) } /// Makes a new `NaiveDate` by counting the number of occurrences of a particular day-of-week - /// since the beginning of the given month. For instance, if you want the 2nd Friday of March + /// since the beginning of the given month. For instance, if you want the 2nd Friday of March /// 2017, you would use `NaiveDate::from_weekday_of_month(2017, 3, Weekday::Fri, 2)`. /// - /// `n` is 1-indexed. - /// /// # Panics /// - /// Panics if the specified day does not exist in that month, on invalid values for `month` or - /// `n`, or if `year` is out of range for `NaiveDate`. + /// The resulting `NaiveDate` is guaranteed to be in `month`. If `n` is larger than the number + /// of `weekday` in `month` (eg. the 6th Friday of March 2017) then this function will panic. + /// + /// `n` is 1-indexed. Passing `n=0` will cause a panic. #[deprecated(since = "0.4.23", note = "use `from_weekday_of_month_opt()` instead")] #[must_use] - pub const fn from_weekday_of_month( - year: i32, - month: u32, - weekday: Weekday, - n: u8, - ) -> NaiveDate { - expect!(NaiveDate::from_weekday_of_month_opt(year, month, weekday, n), "out-of-range date") + pub fn from_weekday_of_month(year: i32, month: u32, weekday: Weekday, n: u8) -> NaiveDate { + NaiveDate::from_weekday_of_month_opt(year, month, weekday, n).expect("out-of-range date") } /// Makes a new `NaiveDate` by counting the number of occurrences of a particular day-of-week - /// since the beginning of the given month. For instance, if you want the 2nd Friday of March - /// 2017, you would use `NaiveDate::from_weekday_of_month(2017, 3, Weekday::Fri, 2)`. - /// - /// `n` is 1-indexed. - /// - /// # Errors - /// - /// Returns `None` if: - /// - The specified day does not exist in that month (for example the 5th Monday of Apr. 2023). - /// - The value for `month` or `n` is invalid. - /// - `year` is out of range for `NaiveDate`. - /// - /// # Example + /// since the beginning of the given month. For instance, if you want the 2nd Friday of March + /// 2017, you would use `NaiveDate::from_weekday_of_month(2017, 3, Weekday::Fri, 2)`. `n` is 1-indexed. /// /// ``` /// use chrono::{NaiveDate, Weekday}; /// assert_eq!(NaiveDate::from_weekday_of_month_opt(2017, 3, Weekday::Fri, 2), /// NaiveDate::from_ymd_opt(2017, 3, 10)) /// ``` + /// + /// Returns `None` if `n` out-of-range; ie. if `n` is larger than the number of `weekday` in + /// `month` (eg. the 6th Friday of March 2017), or if `n == 0`. #[must_use] - pub const fn from_weekday_of_month_opt( + pub fn from_weekday_of_month_opt( year: i32, month: u32, weekday: Weekday, @@ -531,9 +519,9 @@ if n == 0 { return None; } - let first = try_opt!(NaiveDate::from_ymd_opt(year, month, 1)).weekday(); + let first = NaiveDate::from_ymd_opt(year, month, 1)?.weekday(); let first_to_dow = (7 + weekday.number_from_monday() - first.number_from_monday()) % 7; - let day = (n - 1) as u32 * 7 + first_to_dow + 1; + let day = (u32::from(n) - 1) * 7 + first_to_dow + 1; NaiveDate::from_ymd_opt(year, month, day) } @@ -609,14 +597,10 @@ /// Add a duration in [`Months`] to the date /// - /// Uses the last day of the month if the day does not exist in the resulting month. - /// - /// # Errors + /// If the day would be out of range for the resulting month, use the last day for that month. /// /// Returns `None` if the resulting date would be out of range. /// - /// # Example - /// /// ``` /// # use chrono::{NaiveDate, Months}; /// assert_eq!( @@ -629,7 +613,7 @@ /// ); /// ``` #[must_use] - pub const fn checked_add_months(self, months: Months) -> Option { + pub fn checked_add_months(self, months: Months) -> Option { if months.0 == 0 { return Some(self); } @@ -642,14 +626,10 @@ /// Subtract a duration in [`Months`] from the date /// - /// Uses the last day of the month if the day does not exist in the resulting month. - /// - /// # Errors + /// If the day would be out of range for the resulting month, use the last day for that month. /// /// Returns `None` if the resulting date would be out of range. /// - /// # Example - /// /// ``` /// # use chrono::{NaiveDate, Months}; /// assert_eq!( @@ -664,7 +644,7 @@ /// ); /// ``` #[must_use] - pub const fn checked_sub_months(self, months: Months) -> Option { + pub fn checked_sub_months(self, months: Months) -> Option { if months.0 == 0 { return Some(self); } @@ -676,7 +656,7 @@ } } - const fn diff_months(self, months: i32) -> Option { + fn diff_months(self, months: i32) -> Option { let (years, left) = ((months / 12), (months % 12)); // Determine new year (without taking months into account for now @@ -713,23 +693,15 @@ let flags = YearFlags::from_year(year); let feb_days = if flags.ndays() == 366 { 29 } else { 28 }; let days = [31, feb_days, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; - let day_max = days[(month - 1) as usize]; - let mut day = self.day(); - if day > day_max { - day = day_max; - }; + let day = Ord::min(self.day(), days[(month - 1) as usize]); - NaiveDate::from_mdf(year, try_opt!(Mdf::new(month as u32, day, flags))) + NaiveDate::from_mdf(year, Mdf::new(month as u32, day, flags)?) } /// Add a duration in [`Days`] to the date /// - /// # Errors - /// /// Returns `None` if the resulting date would be out of range. /// - /// # Example - /// /// ``` /// # use chrono::{NaiveDate, Days}; /// assert_eq!( @@ -746,21 +718,18 @@ /// ); /// ``` #[must_use] - pub const fn checked_add_days(self, days: Days) -> Option { - match days.0 <= i32::MAX as u64 { - true => self.add_days(days.0 as i32), - false => None, + pub fn checked_add_days(self, days: Days) -> Option { + if days.0 == 0 { + return Some(self); } + + i64::try_from(days.0).ok().and_then(|d| self.diff_days(d)) } /// Subtract a duration in [`Days`] from the date /// - /// # Errors - /// /// Returns `None` if the resulting date would be out of range. /// - /// # Example - /// /// ``` /// # use chrono::{NaiveDate, Days}; /// assert_eq!( @@ -773,34 +742,20 @@ /// ); /// ``` #[must_use] - pub const fn checked_sub_days(self, days: Days) -> Option { - match days.0 <= i32::MAX as u64 { - true => self.add_days(-(days.0 as i32)), - false => None, + pub fn checked_sub_days(self, days: Days) -> Option { + if days.0 == 0 { + return Some(self); } + + i64::try_from(days.0).ok().and_then(|d| self.diff_days(-d)) } - /// Add a duration of `i32` days to the date. - pub(crate) const fn add_days(self, days: i32) -> Option { - // fast path if the result is within the same year - const ORDINAL_MASK: i32 = 0b1_1111_1111_0000; - if let Some(ordinal) = ((self.ymdf & ORDINAL_MASK) >> 4).checked_add(days) { - if ordinal > 0 && ordinal <= 365 { - let year_and_flags = self.ymdf & !ORDINAL_MASK; - return Some(NaiveDate { ymdf: year_and_flags | (ordinal << 4) }); - } + fn diff_days(self, days: i64) -> Option { + let secs = days.checked_mul(86400)?; // 86400 seconds in one day + if secs >= core::i64::MAX / 1000 || secs <= core::i64::MIN / 1000 { + return None; // See the `time` 0.1 crate. Outside these bounds, `Duration::seconds` will panic } - // do the full check - let year = self.year(); - let (mut year_div_400, year_mod_400) = div_mod_floor(year, 400); - let cycle = internals::yo_to_cycle(year_mod_400 as u32, self.of().ordinal()); - let cycle = try_opt!((cycle as i32).checked_add(days)); - let (cycle_div_400y, cycle) = div_mod_floor(cycle, 146_097); - year_div_400 += cycle_div_400y; - - let (year_mod_400, ordinal) = internals::cycle_to_yo(cycle as u32); - let flags = YearFlags::from_year_mod_400(year_mod_400 as i32); - NaiveDate::from_ordinal_and_flags(year_div_400 * 400 + year_mod_400 as i32, ordinal, flags) + self.checked_add_signed(Duration::seconds(secs)) } /// Makes a new `NaiveDateTime` from the current date and given `NaiveTime`. @@ -828,14 +783,12 @@ /// No [leap second](./struct.NaiveTime.html#leap-second-handling) is allowed here; /// use `NaiveDate::and_hms_*` methods with a subsecond parameter instead. /// - /// # Panics - /// /// Panics on invalid hour, minute and/or second. #[deprecated(since = "0.4.23", note = "use `and_hms_opt()` instead")] #[inline] #[must_use] - pub const fn and_hms(&self, hour: u32, min: u32, sec: u32) -> NaiveDateTime { - expect!(self.and_hms_opt(hour, min, sec), "invalid time") + pub fn and_hms(&self, hour: u32, min: u32, sec: u32) -> NaiveDateTime { + self.and_hms_opt(hour, min, sec).expect("invalid time") } /// Makes a new `NaiveDateTime` from the current date, hour, minute and second. @@ -843,8 +796,6 @@ /// No [leap second](./struct.NaiveTime.html#leap-second-handling) is allowed here; /// use `NaiveDate::and_hms_*_opt` methods with a subsecond parameter instead. /// - /// # Errors - /// /// Returns `None` on invalid hour, minute and/or second. /// /// # Example @@ -860,32 +811,27 @@ /// ``` #[inline] #[must_use] - pub const fn and_hms_opt(&self, hour: u32, min: u32, sec: u32) -> Option { - let time = try_opt!(NaiveTime::from_hms_opt(hour, min, sec)); - Some(self.and_time(time)) + pub fn and_hms_opt(&self, hour: u32, min: u32, sec: u32) -> Option { + NaiveTime::from_hms_opt(hour, min, sec).map(|time| self.and_time(time)) } /// Makes a new `NaiveDateTime` from the current date, hour, minute, second and millisecond. /// - /// The millisecond part is allowed to exceed 1,000,000,000 in order to represent a [leap second]( - /// ./struct.NaiveTime.html#leap-second-handling), but only when `sec == 59`. - /// - /// # Panics + /// The millisecond part can exceed 1,000 + /// in order to represent the [leap second](./struct.NaiveTime.html#leap-second-handling). /// /// Panics on invalid hour, minute, second and/or millisecond. #[deprecated(since = "0.4.23", note = "use `and_hms_milli_opt()` instead")] #[inline] #[must_use] - pub const fn and_hms_milli(&self, hour: u32, min: u32, sec: u32, milli: u32) -> NaiveDateTime { - expect!(self.and_hms_milli_opt(hour, min, sec, milli), "invalid time") + pub fn and_hms_milli(&self, hour: u32, min: u32, sec: u32, milli: u32) -> NaiveDateTime { + self.and_hms_milli_opt(hour, min, sec, milli).expect("invalid time") } /// Makes a new `NaiveDateTime` from the current date, hour, minute, second and millisecond. /// - /// The millisecond part is allowed to exceed 1,000,000,000 in order to represent a [leap second]( - /// ./struct.NaiveTime.html#leap-second-handling), but only when `sec == 59`. - /// - /// # Errors + /// The millisecond part can exceed 1,000 + /// in order to represent the [leap second](./struct.NaiveTime.html#leap-second-handling). /// /// Returns `None` on invalid hour, minute, second and/or millisecond. /// @@ -904,23 +850,20 @@ /// ``` #[inline] #[must_use] - pub const fn and_hms_milli_opt( + pub fn and_hms_milli_opt( &self, hour: u32, min: u32, sec: u32, milli: u32, ) -> Option { - let time = try_opt!(NaiveTime::from_hms_milli_opt(hour, min, sec, milli)); - Some(self.and_time(time)) + NaiveTime::from_hms_milli_opt(hour, min, sec, milli).map(|time| self.and_time(time)) } /// Makes a new `NaiveDateTime` from the current date, hour, minute, second and microsecond. /// - /// The microsecond part is allowed to exceed 1,000,000,000 in order to represent a [leap second]( - /// ./struct.NaiveTime.html#leap-second-handling), but only when `sec == 59`. - /// - /// # Panics + /// The microsecond part can exceed 1,000,000 + /// in order to represent the [leap second](./struct.NaiveTime.html#leap-second-handling). /// /// Panics on invalid hour, minute, second and/or microsecond. /// @@ -940,16 +883,14 @@ #[deprecated(since = "0.4.23", note = "use `and_hms_micro_opt()` instead")] #[inline] #[must_use] - pub const fn and_hms_micro(&self, hour: u32, min: u32, sec: u32, micro: u32) -> NaiveDateTime { - expect!(self.and_hms_micro_opt(hour, min, sec, micro), "invalid time") + pub fn and_hms_micro(&self, hour: u32, min: u32, sec: u32, micro: u32) -> NaiveDateTime { + self.and_hms_micro_opt(hour, min, sec, micro).expect("invalid time") } /// Makes a new `NaiveDateTime` from the current date, hour, minute, second and microsecond. /// - /// The microsecond part is allowed to exceed 1,000,000,000 in order to represent a [leap second]( - /// ./struct.NaiveTime.html#leap-second-handling), but only when `sec == 59`. - /// - /// # Errors + /// The microsecond part can exceed 1,000,000 + /// in order to represent the [leap second](./struct.NaiveTime.html#leap-second-handling). /// /// Returns `None` on invalid hour, minute, second and/or microsecond. /// @@ -968,38 +909,33 @@ /// ``` #[inline] #[must_use] - pub const fn and_hms_micro_opt( + pub fn and_hms_micro_opt( &self, hour: u32, min: u32, sec: u32, micro: u32, ) -> Option { - let time = try_opt!(NaiveTime::from_hms_micro_opt(hour, min, sec, micro)); - Some(self.and_time(time)) + NaiveTime::from_hms_micro_opt(hour, min, sec, micro).map(|time| self.and_time(time)) } /// Makes a new `NaiveDateTime` from the current date, hour, minute, second and nanosecond. /// - /// The nanosecond part is allowed to exceed 1,000,000,000 in order to represent a [leap second]( - /// ./struct.NaiveTime.html#leap-second-handling), but only when `sec == 59`. - /// - /// # Panics + /// The nanosecond part can exceed 1,000,000,000 + /// in order to represent the [leap second](./struct.NaiveTime.html#leap-second-handling). /// /// Panics on invalid hour, minute, second and/or nanosecond. #[deprecated(since = "0.4.23", note = "use `and_hms_nano_opt()` instead")] #[inline] #[must_use] - pub const fn and_hms_nano(&self, hour: u32, min: u32, sec: u32, nano: u32) -> NaiveDateTime { - expect!(self.and_hms_nano_opt(hour, min, sec, nano), "invalid time") + pub fn and_hms_nano(&self, hour: u32, min: u32, sec: u32, nano: u32) -> NaiveDateTime { + self.and_hms_nano_opt(hour, min, sec, nano).expect("invalid time") } /// Makes a new `NaiveDateTime` from the current date, hour, minute, second and nanosecond. /// - /// The nanosecond part is allowed to exceed 1,000,000,000 in order to represent a [leap second]( - /// ./struct.NaiveTime.html#leap-second-handling), but only when `sec == 59`. - /// - /// # Errors + /// The nanosecond part can exceed 1,000,000,000 + /// in order to represent the [leap second](./struct.NaiveTime.html#leap-second-handling). /// /// Returns `None` on invalid hour, minute, second and/or nanosecond. /// @@ -1018,20 +954,19 @@ /// ``` #[inline] #[must_use] - pub const fn and_hms_nano_opt( + pub fn and_hms_nano_opt( &self, hour: u32, min: u32, sec: u32, nano: u32, ) -> Option { - let time = try_opt!(NaiveTime::from_hms_nano_opt(hour, min, sec, nano)); - Some(self.and_time(time)) + NaiveTime::from_hms_nano_opt(hour, min, sec, nano).map(|time| self.and_time(time)) } /// Returns the packed month-day-flags. #[inline] - const fn mdf(&self) -> Mdf { + fn mdf(&self) -> Mdf { self.of().to_mdf() } @@ -1045,8 +980,8 @@ /// /// Returns `None` when the resulting `NaiveDate` would be invalid. #[inline] - const fn with_mdf(&self, mdf: Mdf) -> Option { - Some(self.with_of(try_opt!(mdf.to_of()))) + fn with_mdf(&self, mdf: Mdf) -> Option { + Some(self.with_of(mdf.to_of()?)) } /// Makes a new `NaiveDate` with the packed ordinal-flags changed. @@ -1060,20 +995,16 @@ /// Makes a new `NaiveDate` for the next calendar date. /// - /// # Panics - /// /// Panics when `self` is the last representable date. #[deprecated(since = "0.4.23", note = "use `succ_opt()` instead")] #[inline] #[must_use] - pub const fn succ(&self) -> NaiveDate { - expect!(self.succ_opt(), "out of bound") + pub fn succ(&self) -> NaiveDate { + self.succ_opt().expect("out of bound") } /// Makes a new `NaiveDate` for the next calendar date. /// - /// # Errors - /// /// Returns `None` when `self` is the last representable date. /// /// # Example @@ -1087,7 +1018,7 @@ /// ``` #[inline] #[must_use] - pub const fn succ_opt(&self) -> Option { + pub fn succ_opt(&self) -> Option { match self.of().succ() { Some(of) => Some(self.with_of(of)), None => NaiveDate::from_ymd_opt(self.year() + 1, 1, 1), @@ -1096,20 +1027,16 @@ /// Makes a new `NaiveDate` for the previous calendar date. /// - /// # Panics - /// /// Panics when `self` is the first representable date. #[deprecated(since = "0.4.23", note = "use `pred_opt()` instead")] #[inline] #[must_use] - pub const fn pred(&self) -> NaiveDate { - expect!(self.pred_opt(), "out of bound") + pub fn pred(&self) -> NaiveDate { + self.pred_opt().expect("out of bound") } /// Makes a new `NaiveDate` for the previous calendar date. /// - /// # Errors - /// /// Returns `None` when `self` is the first representable date. /// /// # Example @@ -1123,18 +1050,16 @@ /// ``` #[inline] #[must_use] - pub const fn pred_opt(&self) -> Option { + pub fn pred_opt(&self) -> Option { match self.of().pred() { Some(of) => Some(self.with_of(of)), None => NaiveDate::from_ymd_opt(self.year() - 1, 12, 31), } } - /// Adds the number of whole days in the given `Duration` to the current date. - /// - /// # Errors + /// Adds the `days` part of given `Duration` to the current date. /// - /// Returns `None` if the resulting date would be out of range. + /// Returns `None` when it will result in overflow. /// /// # Example /// @@ -1152,15 +1077,21 @@ /// ``` #[must_use] pub fn checked_add_signed(self, rhs: OldDuration) -> Option { - let days = i32::try_from(rhs.num_days()).ok()?; - self.add_days(days) + let year = self.year(); + let (mut year_div_400, year_mod_400) = div_mod_floor(year, 400); + let cycle = internals::yo_to_cycle(year_mod_400 as u32, self.of().ordinal()); + let cycle = (cycle as i32).checked_add(i32::try_from(rhs.num_days()).ok()?)?; + let (cycle_div_400y, cycle) = div_mod_floor(cycle, 146_097); + year_div_400 += cycle_div_400y; + + let (year_mod_400, ordinal) = internals::cycle_to_yo(cycle as u32); + let flags = YearFlags::from_year_mod_400(year_mod_400 as i32); + NaiveDate::from_ordinal_and_flags(year_div_400 * 400 + year_mod_400 as i32, ordinal, flags) } - /// Subtracts the number of whole days in the given `Duration` from the current date. - /// - /// # Errors + /// Subtracts the `days` part of given `Duration` from the current date. /// - /// Returns `None` if the resulting date would be out of range. + /// Returns `None` when it will result in overflow. /// /// # Example /// @@ -1178,8 +1109,16 @@ /// ``` #[must_use] pub fn checked_sub_signed(self, rhs: OldDuration) -> Option { - let days = i32::try_from(-rhs.num_days()).ok()?; - self.add_days(days) + let year = self.year(); + let (mut year_div_400, year_mod_400) = div_mod_floor(year, 400); + let cycle = internals::yo_to_cycle(year_mod_400 as u32, self.of().ordinal()); + let cycle = (cycle as i32).checked_sub(i32::try_from(rhs.num_days()).ok()?)?; + let (cycle_div_400y, cycle) = div_mod_floor(cycle, 146_097); + year_div_400 += cycle_div_400y; + + let (year_mod_400, ordinal) = internals::cycle_to_yo(cycle as u32); + let flags = YearFlags::from_year_mod_400(year_mod_400 as i32); + NaiveDate::from_ordinal_and_flags(year_div_400 * 400 + year_mod_400 as i32, ordinal, flags) } /// Subtracts another `NaiveDate` from the current date. @@ -1210,24 +1149,18 @@ let year2 = rhs.year(); let (year1_div_400, year1_mod_400) = div_mod_floor(year1, 400); let (year2_div_400, year2_mod_400) = div_mod_floor(year2, 400); - let cycle1 = internals::yo_to_cycle(year1_mod_400 as u32, self.of().ordinal()) as i64; - let cycle2 = internals::yo_to_cycle(year2_mod_400 as u32, rhs.of().ordinal()) as i64; + let cycle1 = i64::from(internals::yo_to_cycle(year1_mod_400 as u32, self.of().ordinal())); + let cycle2 = i64::from(internals::yo_to_cycle(year2_mod_400 as u32, rhs.of().ordinal())); OldDuration::days( - (year1_div_400 as i64 - year2_div_400 as i64) * 146_097 + (cycle1 - cycle2), + (i64::from(year1_div_400) - i64::from(year2_div_400)) * 146_097 + (cycle1 - cycle2), ) } /// Returns the number of whole years from the given `base` until `self`. - /// - /// # Errors - /// - /// Returns `None` if `base < self`. #[must_use] - pub const fn years_since(&self, base: Self) -> Option { + pub fn years_since(&self, base: Self) -> Option { let mut years = self.year() - base.year(); - // Comparing tuples is not (yet) possible in const context. Instead we combine month and - // day into one `u32` for easy comparison. - if (self.month() << 5 | self.day()) < (base.month() << 5 | base.day()) { + if (self.month(), self.day()) < (base.month(), base.day()) { years -= 1; } @@ -1264,7 +1197,7 @@ /// # let d = NaiveDate::from_ymd_opt(2015, 9, 5).unwrap(); /// assert_eq!(format!("{}", d.format_with_items(fmt)), "2015-09-05"); /// ``` - #[cfg(any(feature = "alloc", feature = "std"))] + #[cfg(any(feature = "alloc", feature = "std", test))] #[cfg_attr(docsrs, doc(cfg(any(feature = "alloc", feature = "std"))))] #[inline] #[must_use] @@ -1308,7 +1241,7 @@ /// assert_eq!(format!("{}", d.format("%Y-%m-%d")), "2015-09-05"); /// assert_eq!(format!("{}", d.format("%A, %-d %B, %C%y")), "Saturday, 5 September, 2015"); /// ``` - #[cfg(any(feature = "alloc", feature = "std"))] + #[cfg(any(feature = "alloc", feature = "std", test))] #[cfg_attr(docsrs, doc(cfg(any(feature = "alloc", feature = "std"))))] #[inline] #[must_use] @@ -1418,45 +1351,6 @@ NaiveWeek { date: *self, start } } - /// Returns `true` if this is a leap year. - /// - /// ``` - /// # use chrono::NaiveDate; - /// assert_eq!(NaiveDate::from_ymd_opt(2000, 1, 1).unwrap().leap_year(), true); - /// assert_eq!(NaiveDate::from_ymd_opt(2001, 1, 1).unwrap().leap_year(), false); - /// assert_eq!(NaiveDate::from_ymd_opt(2002, 1, 1).unwrap().leap_year(), false); - /// assert_eq!(NaiveDate::from_ymd_opt(2003, 1, 1).unwrap().leap_year(), false); - /// assert_eq!(NaiveDate::from_ymd_opt(2004, 1, 1).unwrap().leap_year(), true); - /// assert_eq!(NaiveDate::from_ymd_opt(2100, 1, 1).unwrap().leap_year(), false); - /// ``` - pub const fn leap_year(&self) -> bool { - self.ymdf & (0b1000) == 0 - } - - // This duplicates `Datelike::year()`, because trait methods can't be const yet. - #[inline] - const fn year(&self) -> i32 { - self.ymdf >> 13 - } - - // This duplicates `Datelike::month()`, because trait methods can't be const yet. - #[inline] - const fn month(&self) -> u32 { - self.mdf().month() - } - - // This duplicates `Datelike::day()`, because trait methods can't be const yet. - #[inline] - const fn day(&self) -> u32 { - self.mdf().day() - } - - // This duplicates `Datelike::weekday()`, because trait methods can't be const yet. - #[inline] - const fn weekday(&self) -> Weekday { - self.of().weekday() - } - /// The minimum possible `NaiveDate` (January 1, 262145 BCE). pub const MIN: NaiveDate = NaiveDate { ymdf: (MIN_YEAR << 13) | (1 << 4) | 0o07 /*FE*/ }; /// The maximum possible `NaiveDate` (December 31, 262143 CE). @@ -1476,7 +1370,7 @@ /// ``` #[inline] fn year(&self) -> i32 { - self.year() + self.ymdf >> 13 } /// Returns the month number starting from 1. @@ -1493,7 +1387,7 @@ /// ``` #[inline] fn month(&self) -> u32 { - self.month() + self.mdf().month() } /// Returns the month number starting from 0. @@ -1510,7 +1404,7 @@ /// ``` #[inline] fn month0(&self) -> u32 { - self.month() - 1 + self.mdf().month() - 1 } /// Returns the day of month starting from 1. @@ -1550,7 +1444,7 @@ /// ``` #[inline] fn day(&self) -> u32 { - self.day() + self.mdf().day() } /// Returns the day of month starting from 0. @@ -1638,7 +1532,7 @@ /// ``` #[inline] fn weekday(&self) -> Weekday { - self.weekday() + self.of().weekday() } #[inline] @@ -1646,12 +1540,9 @@ isoweek::iso_week_from_yof(self.year(), self.of()) } - /// Makes a new `NaiveDate` with the year number changed, while keeping the same month and day. - /// - /// # Errors + /// Makes a new `NaiveDate` with the year number changed. /// - /// Returns `None` if the resulting date does not exist, or when the `NaiveDate` would be - /// out of range. + /// Returns `None` when the resulting `NaiveDate` would be invalid. /// /// # Example /// @@ -1685,9 +1576,7 @@ /// Makes a new `NaiveDate` with the month number (starting from 1) changed. /// - /// # Errors - /// - /// Returns `None` if the resulting date does not exist, or if the value for `month` is invalid. + /// Returns `None` when the resulting `NaiveDate` would be invalid. /// /// # Example /// @@ -1706,10 +1595,7 @@ /// Makes a new `NaiveDate` with the month number (starting from 0) changed. /// - /// # Errors - /// - /// Returns `None` if the resulting date does not exist, or if the value for `month0` is - /// invalid. + /// Returns `None` when the resulting `NaiveDate` would be invalid. /// /// # Example /// @@ -1729,9 +1615,7 @@ /// Makes a new `NaiveDate` with the day of month (starting from 1) changed. /// - /// # Errors - /// - /// Returns `None` if the resulting date does not exist, or if the value for `day` is invalid. + /// Returns `None` when the resulting `NaiveDate` would be invalid. /// /// # Example /// @@ -1750,9 +1634,7 @@ /// Makes a new `NaiveDate` with the day of month (starting from 0) changed. /// - /// # Errors - /// - /// Returns `None` if the resulting date does not exist, or if the value for `day0` is invalid. + /// Returns `None` when the resulting `NaiveDate` would be invalid. /// /// # Example /// @@ -1772,10 +1654,7 @@ /// Makes a new `NaiveDate` with the day of year (starting from 1) changed. /// - /// # Errors - /// - /// Returns `None` if the resulting date does not exist, or if the value for `ordinal` is - /// invalid. + /// Returns `None` when the resulting `NaiveDate` would be invalid. /// /// # Example /// @@ -1799,10 +1678,7 @@ /// Makes a new `NaiveDate` with the day of year (starting from 0) changed. /// - /// # Errors - /// - /// Returns `None` if the resulting date does not exist, or if the value for `ordinal0` is - /// invalid. + /// Returns `None` when the resulting `NaiveDate` would be invalid. /// /// # Example /// @@ -2023,10 +1899,13 @@ type Item = NaiveDate; fn next(&mut self) -> Option { - // We return the current value, and have no way to return `NaiveDate::MAX`. + if self.value == NaiveDate::MAX { + return None; + } + // current < NaiveDate::MAX from here on: let current = self.value; // This can't panic because current is < NaiveDate::MAX: - self.value = current.succ_opt()?; + self.value = current.succ_opt().unwrap(); Some(current) } @@ -2040,16 +1919,15 @@ impl DoubleEndedIterator for NaiveDateDaysIterator { fn next_back(&mut self) -> Option { - // We return the current value, and have no way to return `NaiveDate::MIN`. + if self.value == NaiveDate::MIN { + return None; + } let current = self.value; - self.value = current.pred_opt()?; + self.value = current.pred_opt().unwrap(); Some(current) } } -impl FusedIterator for NaiveDateDaysIterator {} - -/// Iterator over `NaiveDate` with a step size of one week. #[derive(Debug, Copy, Clone, Hash, PartialEq, PartialOrd, Eq, Ord)] pub struct NaiveDateWeeksIterator { value: NaiveDate, @@ -2059,8 +1937,11 @@ type Item = NaiveDate; fn next(&mut self) -> Option { + if NaiveDate::MAX - self.value < OldDuration::weeks(1) { + return None; + } let current = self.value; - self.value = current.checked_add_signed(OldDuration::weeks(1))?; + self.value = current + OldDuration::weeks(1); Some(current) } @@ -2074,13 +1955,18 @@ impl DoubleEndedIterator for NaiveDateWeeksIterator { fn next_back(&mut self) -> Option { + if self.value - NaiveDate::MIN < OldDuration::weeks(1) { + return None; + } let current = self.value; - self.value = current.checked_sub_signed(OldDuration::weeks(1))?; + self.value = current - OldDuration::weeks(1); Some(current) } } -impl FusedIterator for NaiveDateWeeksIterator {} +// TODO: NaiveDateDaysIterator and NaiveDateWeeksIterator should implement FusedIterator, +// TrustedLen, and Step once they becomes stable. +// See: https://github.com/chronotope/chrono/issues/208 /// The `Debug` output of the naive date `d` is the same as /// [`d.format("%Y-%m-%d")`](../format/strftime/index.html). @@ -2206,7 +2092,7 @@ } } -const fn div_mod_floor(val: i32, div: i32) -> (i32, i32) { +fn div_mod_floor(val: i32, div: i32) -> (i32, i32) { (val.div_euclid(div), val.rem_euclid(div)) } @@ -2294,19 +2180,16 @@ } #[cfg(test)] - mod tests { - use crate::naive::date::{test_decodable_json, test_encodable_json}; - use rustc_serialize::json; - - #[test] - fn test_encodable() { - test_encodable_json(json::encode); - } + use rustc_serialize::json; - #[test] - fn test_decodable() { - test_decodable_json(json::decode); - } + #[test] + fn test_encodable() { + super::test_encodable_json(json::encode); + } + + #[test] + fn test_decodable() { + super::test_decodable_json(json::decode); } } @@ -2347,6 +2230,15 @@ formatter.write_str("a formatted date string") } + #[cfg(any(feature = "std", test))] + fn visit_str(self, value: &str) -> Result + where + E: de::Error, + { + value.parse().map_err(E::custom) + } + + #[cfg(not(any(feature = "std", test)))] fn visit_str(self, value: &str) -> Result where E: de::Error, @@ -2364,68 +2256,37 @@ } } - #[cfg(test)] - mod tests { - use crate::naive::date::{test_decodable_json, test_encodable_json}; - use crate::NaiveDate; - - #[test] - fn test_serde_serialize() { - test_encodable_json(serde_json::to_string); - } - - #[test] - fn test_serde_deserialize() { - test_decodable_json(|input| serde_json::from_str(input)); - } - - #[test] - fn test_serde_bincode() { - // Bincode is relevant to test separately from JSON because - // it is not self-describing. - use bincode::{deserialize, serialize}; - - let d = NaiveDate::from_ymd_opt(2014, 7, 24).unwrap(); - let encoded = serialize(&d).unwrap(); - let decoded: NaiveDate = deserialize(&encoded).unwrap(); - assert_eq!(d, decoded); - } + #[test] + fn test_serde_serialize() { + super::test_encodable_json(serde_json::to_string); + } + + #[test] + fn test_serde_deserialize() { + super::test_decodable_json(|input| serde_json::from_str(input)); + } + + #[test] + fn test_serde_bincode() { + // Bincode is relevant to test separately from JSON because + // it is not self-describing. + use bincode::{deserialize, serialize}; + + let d = NaiveDate::from_ymd_opt(2014, 7, 24).unwrap(); + let encoded = serialize(&d).unwrap(); + let decoded: NaiveDate = deserialize(&encoded).unwrap(); + assert_eq!(d, decoded); } } #[cfg(test)] mod tests { - use super::{Days, Months, NaiveDate, MAX_YEAR, MIN_YEAR}; - use crate::duration::Duration; + use super::{ + Days, Months, NaiveDate, MAX_DAYS_FROM_YEAR_0, MAX_YEAR, MIN_DAYS_FROM_YEAR_0, MIN_YEAR, + }; + use crate::oldtime::Duration; use crate::{Datelike, Weekday}; - - // as it is hard to verify year flags in `NaiveDate::MIN` and `NaiveDate::MAX`, - // we use a separate run-time test. - #[test] - fn test_date_bounds() { - let calculated_min = NaiveDate::from_ymd_opt(MIN_YEAR, 1, 1).unwrap(); - let calculated_max = NaiveDate::from_ymd_opt(MAX_YEAR, 12, 31).unwrap(); - assert!( - NaiveDate::MIN == calculated_min, - "`NaiveDate::MIN` should have a year flag {:?}", - calculated_min.of().flags() - ); - assert!( - NaiveDate::MAX == calculated_max, - "`NaiveDate::MAX` should have a year flag {:?}", - calculated_max.of().flags() - ); - - // let's also check that the entire range do not exceed 2^44 seconds - // (sometimes used for bounding `Duration` against overflow) - let maxsecs = NaiveDate::MAX.signed_duration_since(NaiveDate::MIN).num_seconds(); - let maxsecs = maxsecs + 86401; // also take care of DateTime - assert!( - maxsecs < (1 << MAX_BITS), - "The entire `NaiveDate` range somehow exceeds 2^{} seconds", - MAX_BITS - ); - } + use std::{i32, u32}; #[test] fn diff_months() { @@ -3018,20 +2879,16 @@ "360-02-29", "0360-02-29", "2015-2 -18", - "2015-02-18", "+70-2-18", "+70000-2-18", "+00007-2-18", ]; for &s in &valid { - eprintln!("test_date_from_str valid {:?}", s); let d = match s.parse::() { Ok(d) => d, Err(e) => panic!("parsing `{}` has failed: {}", s, e), }; - eprintln!("d {:?} (NaiveDate)", d); let s_ = format!("{:?}", d); - eprintln!("s_ {:?}", s_); // `s` and `s_` may differ, but `s.parse()` and `s_.parse()` must be same let d_ = match s_.parse::() { Ok(d) => d, @@ -3039,7 +2896,6 @@ panic!("`{}` is parsed into `{:?}`, but reparsing that has failed: {}", s, d, e) } }; - eprintln!("d_ {:?} (NaiveDate)", d_); assert!( d == d_, "`{}` is parsed into `{:?}`, but reparsed result \ @@ -3052,27 +2908,13 @@ // some invalid cases // since `ParseErrorKind` is private, all we can do is to check if there was an error - let invalid = [ - "", // empty - "x", // invalid - "Fri, 09 Aug 2013 GMT", // valid date, wrong format - "Sat Jun 30 2012", // valid date, wrong format - "1441497364.649", // valid datetime, wrong format - "+1441497364.649", // valid datetime, wrong format - "+1441497364", // valid datetime, wrong format - "2014/02/03", // valid date, wrong format - "2014", // datetime missing data - "2014-01", // datetime missing data - "2014-01-00", // invalid day - "2014-11-32", // invalid day - "2014-13-01", // invalid month - "2014-13-57", // invalid month, day - "9999999-9-9", // invalid year (out of bounds) - ]; - for &s in &invalid { - eprintln!("test_date_from_str invalid {:?}", s); - assert!(s.parse::().is_err()); - } + assert!("".parse::().is_err()); + assert!("x".parse::().is_err()); + assert!("2014".parse::().is_err()); + assert!("2014-01".parse::().is_err()); + assert!("2014-01-00".parse::().is_err()); + assert!("2014-13-57".parse::().is_err()); + assert!("9999999-9-9".parse::().is_err()); // out-of-bounds } #[test] @@ -3106,6 +2948,50 @@ } #[test] + fn test_date_format() { + let d = NaiveDate::from_ymd_opt(2012, 3, 4).unwrap(); + assert_eq!(d.format("%Y,%C,%y,%G,%g").to_string(), "2012,20,12,2012,12"); + assert_eq!(d.format("%m,%b,%h,%B").to_string(), "03,Mar,Mar,March"); + assert_eq!(d.format("%d,%e").to_string(), "04, 4"); + assert_eq!(d.format("%U,%W,%V").to_string(), "10,09,09"); + assert_eq!(d.format("%a,%A,%w,%u").to_string(), "Sun,Sunday,0,7"); + assert_eq!(d.format("%j").to_string(), "064"); // since 2012 is a leap year + assert_eq!(d.format("%D,%x").to_string(), "03/04/12,03/04/12"); + assert_eq!(d.format("%F").to_string(), "2012-03-04"); + assert_eq!(d.format("%v").to_string(), " 4-Mar-2012"); + assert_eq!(d.format("%t%n%%%n%t").to_string(), "\t\n%\n\t"); + + // non-four-digit years + assert_eq!( + NaiveDate::from_ymd_opt(12345, 1, 1).unwrap().format("%Y").to_string(), + "+12345" + ); + assert_eq!(NaiveDate::from_ymd_opt(1234, 1, 1).unwrap().format("%Y").to_string(), "1234"); + assert_eq!(NaiveDate::from_ymd_opt(123, 1, 1).unwrap().format("%Y").to_string(), "0123"); + assert_eq!(NaiveDate::from_ymd_opt(12, 1, 1).unwrap().format("%Y").to_string(), "0012"); + assert_eq!(NaiveDate::from_ymd_opt(1, 1, 1).unwrap().format("%Y").to_string(), "0001"); + assert_eq!(NaiveDate::from_ymd_opt(0, 1, 1).unwrap().format("%Y").to_string(), "0000"); + assert_eq!(NaiveDate::from_ymd_opt(-1, 1, 1).unwrap().format("%Y").to_string(), "-0001"); + assert_eq!(NaiveDate::from_ymd_opt(-12, 1, 1).unwrap().format("%Y").to_string(), "-0012"); + assert_eq!(NaiveDate::from_ymd_opt(-123, 1, 1).unwrap().format("%Y").to_string(), "-0123"); + assert_eq!(NaiveDate::from_ymd_opt(-1234, 1, 1).unwrap().format("%Y").to_string(), "-1234"); + assert_eq!( + NaiveDate::from_ymd_opt(-12345, 1, 1).unwrap().format("%Y").to_string(), + "-12345" + ); + + // corner cases + assert_eq!( + NaiveDate::from_ymd_opt(2007, 12, 31).unwrap().format("%G,%g,%U,%W,%V").to_string(), + "2008,08,52,53,01" + ); + assert_eq!( + NaiveDate::from_ymd_opt(2010, 1, 3).unwrap().format("%G,%g,%U,%W,%V").to_string(), + "2009,09,01,00,53" + ); + } + + #[test] fn test_day_iterator_limit() { assert_eq!(NaiveDate::from_ymd_opt(262143, 12, 29).unwrap().iter_days().take(4).count(), 2); assert_eq!( @@ -3129,7 +3015,7 @@ #[test] fn test_naiveweek() { let date = NaiveDate::from_ymd_opt(2022, 5, 18).unwrap(); - let asserts = [ + let asserts = vec![ (Weekday::Mon, "Mon 2022-05-16", "Sun 2022-05-22"), (Weekday::Tue, "Tue 2022-05-17", "Mon 2022-05-23"), (Weekday::Wed, "Wed 2022-05-18", "Tue 2022-05-24"), @@ -3225,35 +3111,4 @@ assert!(dt.with_day0(4294967295).is_none()); assert!(dt.with_ordinal0(4294967295).is_none()); } - - #[test] - fn test_leap_year() { - for year in 0..=MAX_YEAR { - let date = NaiveDate::from_ymd_opt(year, 1, 1).unwrap(); - let is_leap = year % 4 == 0 && (year % 100 != 0 || year % 400 == 0); - assert_eq!(date.leap_year(), is_leap); - assert_eq!(date.leap_year(), date.with_ordinal(366).is_some()); - } - } - - // MAX_YEAR-12-31 minus 0000-01-01 - // = ((MAX_YEAR+1)-01-01 minus 0001-01-01) + (0001-01-01 minus 0000-01-01) - 1 day - // = ((MAX_YEAR+1)-01-01 minus 0001-01-01) + 365 days - // = MAX_YEAR * 365 + (# of leap years from 0001 to MAX_YEAR) + 365 days - const MAX_DAYS_FROM_YEAR_0: i32 = - MAX_YEAR * 365 + MAX_YEAR / 4 - MAX_YEAR / 100 + MAX_YEAR / 400 + 365; - - // MIN_YEAR-01-01 minus 0000-01-01 - // = (MIN_YEAR+400n+1)-01-01 minus (400n+1)-01-01 - // = ((MIN_YEAR+400n+1)-01-01 minus 0001-01-01) - ((400n+1)-01-01 minus 0001-01-01) - // = ((MIN_YEAR+400n+1)-01-01 minus 0001-01-01) - 146097n days - // - // n is set to 1000 for convenience. - const MIN_DAYS_FROM_YEAR_0: i32 = (MIN_YEAR + 400_000) * 365 + (MIN_YEAR + 400_000) / 4 - - (MIN_YEAR + 400_000) / 100 - + (MIN_YEAR + 400_000) / 400 - - 146_097_000; - - // only used for testing, but duplicated in naive::datetime - const MAX_BITS: usize = 44; } diff -Nru temporalio-1.3.0/vendor/chrono/src/naive/datetime/mod.rs temporalio-1.3.0/vendor/chrono/src/naive/datetime/mod.rs --- temporalio-1.3.0/vendor/chrono/src/naive/datetime/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/chrono/src/naive/datetime/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -3,24 +3,23 @@ //! ISO 8601 date and time without timezone. -#[cfg(any(feature = "alloc", feature = "std"))] +#[cfg(any(feature = "alloc", feature = "std", test))] use core::borrow::Borrow; use core::fmt::Write; use core::ops::{Add, AddAssign, Sub, SubAssign}; -use core::time::Duration; use core::{fmt, str}; #[cfg(feature = "rkyv")] use rkyv::{Archive, Deserialize, Serialize}; -use crate::duration::Duration as OldDuration; -#[cfg(any(feature = "alloc", feature = "std"))] +#[cfg(any(feature = "alloc", feature = "std", test))] use crate::format::DelayedFormat; use crate::format::{parse, parse_and_remainder, ParseError, ParseResult, Parsed, StrftimeItems}; use crate::format::{Fixed, Item, Numeric, Pad}; use crate::naive::{Days, IsoWeek, NaiveDate, NaiveTime}; use crate::offset::Utc; -use crate::{expect, DateTime, Datelike, LocalResult, Months, TimeZone, Timelike, Weekday}; +use crate::oldtime::Duration as OldDuration; +use crate::{DateTime, Datelike, LocalResult, Months, TimeZone, Timelike, Weekday}; #[cfg(feature = "rustc-serialize")] pub(super) mod rustc_serialize; @@ -110,15 +109,11 @@ /// For a non-naive version of this function see /// [`TimeZone::timestamp`](../offset/trait.TimeZone.html#method.timestamp). /// - /// The nanosecond part can exceed 1,000,000,000 in order to represent a - /// [leap second](NaiveTime#leap-second-handling), but only when `secs % 60 == 59`. - /// (The true "UNIX timestamp" cannot represent a leap second unambiguously.) - /// - /// # Panics + /// The nanosecond part can exceed 1,000,000,000 in order to represent the + /// [leap second](./struct.NaiveTime.html#leap-second-handling). (The true "UNIX + /// timestamp" cannot represent a leap second unambiguously.) /// - /// Panics if the number of seconds would be out of range for a `NaiveDateTime` (more than - /// ca. 262,000 years away from common era), and panics on an invalid nanosecond (2 seconds or - /// more). + /// Panics on the out-of-range number of seconds and/or invalid nanosecond. #[deprecated(since = "0.4.23", note = "use `from_timestamp_opt()` instead")] #[inline] #[must_use] @@ -131,10 +126,7 @@ /// /// The UNIX epoch starts on midnight, January 1, 1970, UTC. /// - /// # Errors - /// - /// Returns `None` if the number of milliseconds would be out of range for a `NaiveDateTime` - /// (more than ca. 262,000 years away from common era) + /// Returns `None` on an out-of-range number of milliseconds. /// /// # Example /// @@ -163,10 +155,7 @@ /// /// The UNIX epoch starts on midnight, January 1, 1970, UTC. /// - /// # Errors - /// - /// Returns `None` if the number of microseconds would be out of range for a `NaiveDateTime` - /// (more than ca. 262,000 years away from common era) + /// Returns `None` on an out-of-range number of microseconds. /// /// # Example /// @@ -196,15 +185,12 @@ /// since the midnight UTC on January 1, 1970 (aka "UNIX timestamp") /// and the number of nanoseconds since the last whole non-leap second. /// - /// The nanosecond part can exceed 1,000,000,000 in order to represent a - /// [leap second](NaiveTime#leap-second-handling), but only when `secs % 60 == 59`. + /// The nanosecond part can exceed 1,000,000,000 + /// in order to represent the [leap second](./struct.NaiveTime.html#leap-second-handling). /// (The true "UNIX timestamp" cannot represent a leap second unambiguously.) /// - /// # Errors - /// - /// Returns `None` if the number of seconds would be out of range for a `NaiveDateTime` (more - /// than ca. 262,000 years away from common era), and panics on an invalid nanosecond - /// (2 seconds or more). + /// Returns `None` on the out-of-range number of seconds (more than 262 000 years away + /// from common era) and/or invalid nanosecond (2 seconds or more). /// /// # Example /// @@ -216,9 +202,8 @@ /// /// assert!(from_timestamp_opt(0, 0).is_some()); /// assert!(from_timestamp_opt(0, 999_999_999).is_some()); - /// assert!(from_timestamp_opt(0, 1_500_000_000).is_none()); // invalid leap second - /// assert!(from_timestamp_opt(59, 1_500_000_000).is_some()); // leap second - /// assert!(from_timestamp_opt(59, 2_000_000_000).is_none()); + /// assert!(from_timestamp_opt(0, 1_500_000_000).is_some()); // leap second + /// assert!(from_timestamp_opt(0, 2_000_000_000).is_none()); /// assert!(from_timestamp_opt(i64::MAX, 0).is_none()); /// ``` #[inline] @@ -405,6 +390,11 @@ /// Note that this does *not* account for the timezone! /// The true "UNIX timestamp" would count seconds since the midnight *UTC* on the epoch. /// + /// Note also that this does reduce the number of years that can be + /// represented from ~584 Billion to ~584 Million. (If this is a problem, + /// please file an issue to let me know what domain needs millisecond + /// precision over billions of years, I'm curious.) + /// /// # Example /// /// ``` @@ -431,6 +421,11 @@ /// Note that this does *not* account for the timezone! /// The true "UNIX timestamp" would count seconds since the midnight *UTC* on the epoch. /// + /// Note also that this does reduce the number of years that can be + /// represented from ~584 Billion to ~584 Thousand. (If this is a problem, + /// please file an issue to let me know what domain needs microsecond + /// precision over millennia, I'm curious.) + /// /// # Example /// /// ``` @@ -456,31 +451,13 @@ /// /// # Panics /// - /// An `i64` with nanosecond precision can span a range of ~584 years. This function panics on - /// an out of range `NaiveDateTime`. - /// - /// The dates that can be represented as nanoseconds are between 1677-09-21T00:12:44.0 and + /// Note also that this does reduce the number of years that can be + /// represented from ~584 Billion to ~584 years. The dates that can be + /// represented as nanoseconds are between 1677-09-21T00:12:44.0 and /// 2262-04-11T23:47:16.854775804. - #[deprecated(since = "0.4.31", note = "use `timestamp_nanos_opt()` instead")] - #[inline] - #[must_use] - pub fn timestamp_nanos(&self) -> i64 { - self.timestamp_nanos_opt() - .expect("value can not be represented in a timestamp with nanosecond precision.") - } - - /// Returns the number of non-leap *nanoseconds* since midnight on January 1, 1970. - /// - /// Note that this does *not* account for the timezone! - /// The true "UNIX timestamp" would count seconds since the midnight *UTC* on the epoch. - /// - /// # Errors /// - /// An `i64` with nanosecond precision can span a range of ~584 years. This function returns - /// `None` on an out of range `NaiveDateTime`. - /// - /// The dates that can be represented as nanoseconds are between 1677-09-21T00:12:44.0 and - /// 2262-04-11T23:47:16.854775804. + /// (If this is a problem, please file an issue to let me know what domain + /// needs nanosecond precision over millennia, I'm curious.) /// /// # Example /// @@ -488,12 +465,12 @@ /// use chrono::{NaiveDate, NaiveDateTime}; /// /// let dt = NaiveDate::from_ymd_opt(1970, 1, 1).unwrap().and_hms_nano_opt(0, 0, 1, 444).unwrap(); - /// assert_eq!(dt.timestamp_nanos_opt(), Some(1_000_000_444)); + /// assert_eq!(dt.timestamp_nanos(), 1_000_000_444); /// /// let dt = NaiveDate::from_ymd_opt(2001, 9, 9).unwrap().and_hms_nano_opt(1, 46, 40, 555).unwrap(); /// /// const A_BILLION: i64 = 1_000_000_000; - /// let nanos = dt.timestamp_nanos_opt().unwrap(); + /// let nanos = dt.timestamp_nanos(); /// assert_eq!(nanos, 1_000_000_000_000_000_555); /// assert_eq!( /// Some(dt), @@ -502,27 +479,9 @@ /// ``` #[inline] #[must_use] - pub fn timestamp_nanos_opt(&self) -> Option { - let mut timestamp = self.timestamp(); - let mut timestamp_subsec_nanos = i64::from(self.timestamp_subsec_nanos()); - - // subsec nanos are always non-negative, however the timestamp itself (both in seconds and in nanos) can be - // negative. Now i64::MIN is NOT dividable by 1_000_000_000, so - // - // (timestamp * 1_000_000_000) + nanos - // - // may underflow (even when in theory we COULD represent the datetime as i64) because we add the non-negative - // nanos AFTER the multiplication. This is fixed by converting the negative case to - // - // ((timestamp + 1) * 1_000_000_000) + (ns - 1_000_000_000) - // - // Also see . - if timestamp < 0 && timestamp_subsec_nanos > 0 { - timestamp_subsec_nanos -= 1_000_000_000; - timestamp += 1; - } - - timestamp.checked_mul(1_000_000_000).and_then(|ns| ns.checked_add(timestamp_subsec_nanos)) + pub fn timestamp_nanos(&self) -> i64 { + let as_ns = self.timestamp() * 1_000_000_000; + as_ns + i64::from(self.timestamp_subsec_nanos()) } /// Returns the number of milliseconds since the last whole non-leap second. @@ -598,9 +557,7 @@ /// except when the `NaiveDateTime` itself represents a leap second /// in which case the assumption becomes that **there is exactly a single leap second ever**. /// - /// # Errors - /// - /// Returns `None` if the resulting date would be out of range. + /// Returns `None` when it will result in overflow. /// /// # Example /// @@ -673,11 +630,9 @@ /// Adds given `Months` to the current date and time. /// - /// Uses the last day of the month if the day does not exist in the resulting month. - /// - /// # Errors + /// Returns `None` when it will result in overflow. /// - /// Returns `None` if the resulting date would be out of range. + /// Overflow returns `None`. /// /// # Example /// @@ -708,9 +663,7 @@ /// except when the `NaiveDateTime` itself represents a leap second /// in which case the assumption becomes that **there is exactly a single leap second ever**. /// - /// # Errors - /// - /// Returns `None` if the resulting date would be out of range. + /// Returns `None` when it will result in overflow. /// /// # Example /// @@ -779,11 +732,9 @@ /// Subtracts given `Months` from the current date and time. /// - /// Uses the last day of the month if the day does not exist in the resulting month. - /// - /// # Errors + /// Returns `None` when it will result in overflow. /// - /// Returns `None` if the resulting date would be out of range. + /// Overflow returns `None`. /// /// # Example /// @@ -893,7 +844,7 @@ /// # let dt = NaiveDate::from_ymd_opt(2015, 9, 5).unwrap().and_hms_opt(23, 56, 4).unwrap(); /// assert_eq!(format!("{}", dt.format_with_items(fmt)), "2015-09-05 23:56:04"); /// ``` - #[cfg(any(feature = "alloc", feature = "std"))] + #[cfg(any(feature = "alloc", feature = "std", test))] #[cfg_attr(docsrs, doc(cfg(any(feature = "alloc", feature = "std"))))] #[inline] #[must_use] @@ -937,7 +888,7 @@ /// assert_eq!(format!("{}", dt.format("%Y-%m-%d %H:%M:%S")), "2015-09-05 23:56:04"); /// assert_eq!(format!("{}", dt.format("around %l %p on %b %-d")), "around 11 PM on Sep 5"); /// ``` - #[cfg(any(feature = "alloc", feature = "std"))] + #[cfg(any(feature = "alloc", feature = "std", test))] #[cfg_attr(docsrs, doc(cfg(any(feature = "alloc", feature = "std"))))] #[inline] #[must_use] @@ -986,19 +937,14 @@ /// The minimum possible `NaiveDateTime`. pub const MIN: Self = Self { date: NaiveDate::MIN, time: NaiveTime::MIN }; - /// The maximum possible `NaiveDateTime`. pub const MAX: Self = Self { date: NaiveDate::MAX, time: NaiveTime::MAX }; - - /// The Unix Epoch, 1970-01-01 00:00:00. - pub const UNIX_EPOCH: Self = - expect!(NaiveDate::from_ymd_opt(1970, 1, 1), "").and_time(NaiveTime::MIN); } impl Datelike for NaiveDateTime { /// Returns the year number in the [calendar date](./struct.NaiveDate.html#calendar-date). /// - /// See also the [`NaiveDate::year`](./struct.NaiveDate.html#method.year) method. + /// See also the [`NaiveDate::year`] method. /// /// # Example /// @@ -1149,15 +1095,11 @@ self.date.iso_week() } - /// Makes a new `NaiveDateTime` with the year number changed, while keeping the same month and - /// day. - /// - /// See also the [`NaiveDate::with_year`] method. + /// Makes a new `NaiveDateTime` with the year number changed. /// - /// # Errors + /// Returns `None` when the resulting `NaiveDateTime` would be invalid. /// - /// Returns `None` if the resulting date does not exist, or when the `NaiveDateTime` would be - /// out of range. + /// See also the [`NaiveDate::with_year`] method. /// /// # Example /// @@ -1175,11 +1117,9 @@ /// Makes a new `NaiveDateTime` with the month number (starting from 1) changed. /// - /// See also the [`NaiveDate::with_month`] method. - /// - /// # Errors + /// Returns `None` when the resulting `NaiveDateTime` would be invalid. /// - /// Returns `None` if the resulting date does not exist, or if the value for `month` is invalid. + /// See also the [`NaiveDate::with_month`] method. /// /// # Example /// @@ -1198,12 +1138,9 @@ /// Makes a new `NaiveDateTime` with the month number (starting from 0) changed. /// - /// See also the [`NaiveDate::with_month0`] method. - /// - /// # Errors + /// Returns `None` when the resulting `NaiveDateTime` would be invalid. /// - /// Returns `None` if the resulting date does not exist, or if the value for `month0` is - /// invalid. + /// See also the [`NaiveDate::with_month0`] method. /// /// # Example /// @@ -1222,11 +1159,9 @@ /// Makes a new `NaiveDateTime` with the day of month (starting from 1) changed. /// - /// See also the [`NaiveDate::with_day`] method. - /// - /// # Errors + /// Returns `None` when the resulting `NaiveDateTime` would be invalid. /// - /// Returns `None` if the resulting date does not exist, or if the value for `day` is invalid. + /// See also the [`NaiveDate::with_day`] method. /// /// # Example /// @@ -1244,11 +1179,9 @@ /// Makes a new `NaiveDateTime` with the day of month (starting from 0) changed. /// - /// See also the [`NaiveDate::with_day0`] method. - /// - /// # Errors + /// Returns `None` when the resulting `NaiveDateTime` would be invalid. /// - /// Returns `None` if the resulting date does not exist, or if the value for `day0` is invalid. + /// See also the [`NaiveDate::with_day0`] method. /// /// # Example /// @@ -1266,12 +1199,9 @@ /// Makes a new `NaiveDateTime` with the day of year (starting from 1) changed. /// - /// See also the [`NaiveDate::with_ordinal`] method. - /// - /// # Errors + /// Returns `None` when the resulting `NaiveDateTime` would be invalid. /// - /// Returns `None` if the resulting date does not exist, or if the value for `ordinal` is - /// invalid. + /// See also the [`NaiveDate::with_ordinal`] method. /// /// # Example /// @@ -1296,12 +1226,9 @@ /// Makes a new `NaiveDateTime` with the day of year (starting from 0) changed. /// - /// See also the [`NaiveDate::with_ordinal0`] method. - /// - /// # Errors + /// Returns `None` when the resulting `NaiveDateTime` would be invalid. /// - /// Returns `None` if the resulting date does not exist, or if the value for `ordinal0` is - /// invalid. + /// See also the [`NaiveDate::with_ordinal0`] method. /// /// # Example /// @@ -1398,11 +1325,9 @@ /// Makes a new `NaiveDateTime` with the hour number changed. /// - /// See also the [`NaiveTime::with_hour`] method. - /// - /// # Errors + /// Returns `None` when the resulting `NaiveDateTime` would be invalid. /// - /// Returns `None` if the value for `hour` is invalid. + /// See also the [`NaiveTime::with_hour`] method. /// /// # Example /// @@ -1421,11 +1346,10 @@ /// Makes a new `NaiveDateTime` with the minute number changed. /// - /// See also the [`NaiveTime::with_minute`] method. - /// - /// # Errors + /// Returns `None` when the resulting `NaiveDateTime` would be invalid. /// - /// Returns `None` if the value for `minute` is invalid. + /// See also the + /// [`NaiveTime::with_minute`] method. /// /// # Example /// @@ -1444,15 +1368,12 @@ /// Makes a new `NaiveDateTime` with the second number changed. /// - /// As with the [`second`](#method.second) method, - /// the input range is restricted to 0 through 59. + /// Returns `None` when the resulting `NaiveDateTime` would be invalid. As + /// with the [`NaiveDateTime::second`] method, the input range is + /// restricted to 0 through 59. /// /// See also the [`NaiveTime::with_second`] method. /// - /// # Errors - /// - /// Returns `None` if the value for `second` is invalid. - /// /// # Example /// /// ``` @@ -1476,20 +1397,16 @@ /// /// See also the [`NaiveTime::with_nanosecond`] method. /// - /// # Errors - /// - /// Returns `None` if `nanosecond >= 2,000,000,000`. - /// /// # Example /// /// ``` /// use chrono::{NaiveDate, NaiveDateTime, Timelike}; /// - /// let dt: NaiveDateTime = NaiveDate::from_ymd_opt(2015, 9, 8).unwrap().and_hms_milli_opt(12, 34, 59, 789).unwrap(); + /// let dt: NaiveDateTime = NaiveDate::from_ymd_opt(2015, 9, 8).unwrap().and_hms_milli_opt(12, 34, 56, 789).unwrap(); /// assert_eq!(dt.with_nanosecond(333_333_333), - /// Some(NaiveDate::from_ymd_opt(2015, 9, 8).unwrap().and_hms_nano_opt(12, 34, 59, 333_333_333).unwrap())); + /// Some(NaiveDate::from_ymd_opt(2015, 9, 8).unwrap().and_hms_nano_opt(12, 34, 56, 333_333_333).unwrap())); /// assert_eq!(dt.with_nanosecond(1_333_333_333), // leap second - /// Some(NaiveDate::from_ymd_opt(2015, 9, 8).unwrap().and_hms_nano_opt(12, 34, 59, 1_333_333_333).unwrap())); + /// Some(NaiveDate::from_ymd_opt(2015, 9, 8).unwrap().and_hms_nano_opt(12, 34, 56, 1_333_333_333).unwrap())); /// assert_eq!(dt.with_nanosecond(2_000_000_000), None); /// ``` #[inline] @@ -1504,9 +1421,7 @@ /// second ever**, except when the `NaiveDateTime` itself represents a leap second in which case /// the assumption becomes that **there is exactly a single leap second ever**. /// -/// # Panics -/// -/// Panics if the resulting date would be out of range. Use [`NaiveDateTime::checked_add_signed`] +/// Panics on underflow or overflow. Use [`NaiveDateTime::checked_add_signed`] /// to detect that. /// /// # Example @@ -1559,17 +1474,6 @@ } } -impl Add for NaiveDateTime { - type Output = NaiveDateTime; - - #[inline] - fn add(self, rhs: Duration) -> NaiveDateTime { - let rhs = OldDuration::from_std(rhs) - .expect("overflow converting from core::time::Duration to chrono::Duration"); - self.checked_add_signed(rhs).expect("`NaiveDateTime + Duration` overflowed") - } -} - impl AddAssign for NaiveDateTime { #[inline] fn add_assign(&mut self, rhs: OldDuration) { @@ -1577,13 +1481,6 @@ } } -impl AddAssign for NaiveDateTime { - #[inline] - fn add_assign(&mut self, rhs: Duration) { - *self = self.add(rhs); - } -} - impl Add for NaiveDateTime { type Output = NaiveDateTime; @@ -1686,30 +1583,12 @@ } } -impl Sub for NaiveDateTime { - type Output = NaiveDateTime; - - #[inline] - fn sub(self, rhs: Duration) -> NaiveDateTime { - let rhs = OldDuration::from_std(rhs) - .expect("overflow converting from core::time::Duration to chrono::Duration"); - self.checked_sub_signed(rhs).expect("`NaiveDateTime - Duration` overflowed") - } -} - impl SubAssign for NaiveDateTime { #[inline] fn sub_assign(&mut self, rhs: OldDuration) { *self = self.sub(rhs); } } - -impl SubAssign for NaiveDateTime { - #[inline] - fn sub_assign(&mut self, rhs: Duration) { - *self = self.sub(rhs); - } -} /// A subtraction of Months from `NaiveDateTime` clamped to valid days in resulting month. /// diff -Nru temporalio-1.3.0/vendor/chrono/src/naive/datetime/rustc_serialize.rs temporalio-1.3.0/vendor/chrono/src/naive/datetime/rustc_serialize.rs --- temporalio-1.3.0/vendor/chrono/src/naive/datetime/rustc_serialize.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/chrono/src/naive/datetime/rustc_serialize.rs 2023-10-30 19:40:00.000000000 +0000 @@ -55,23 +55,19 @@ } #[cfg(test)] -mod tests { - use crate::naive::datetime::test_encodable_json; - use crate::naive::datetime::{test_decodable_json, test_decodable_json_timestamp}; - use rustc_serialize::json; +use rustc_serialize::json; - #[test] - fn test_encodable() { - test_encodable_json(json::encode); - } +#[test] +fn test_encodable() { + super::test_encodable_json(json::encode); +} - #[test] - fn test_decodable() { - test_decodable_json(json::decode); - } +#[test] +fn test_decodable() { + super::test_decodable_json(json::decode); +} - #[test] - fn test_decodable_timestamps() { - test_decodable_json_timestamp(json::decode); - } +#[test] +fn test_decodable_timestamps() { + super::test_decodable_json_timestamp(json::decode); } diff -Nru temporalio-1.3.0/vendor/chrono/src/naive/datetime/serde.rs temporalio-1.3.0/vendor/chrono/src/naive/datetime/serde.rs --- temporalio-1.3.0/vendor/chrono/src/naive/datetime/serde.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/chrono/src/naive/datetime/serde.rs 2023-10-30 19:40:00.000000000 +0000 @@ -91,14 +91,6 @@ /// /// Intended for use with `serde`s `serialize_with` attribute. /// - /// # Errors - /// - /// An `i64` with nanosecond precision can span a range of ~584 years. This function returns an - /// error on an out of range `DateTime`. - /// - /// The dates that can be represented as nanoseconds are between 1677-09-21T00:12:44.0 and - /// 2262-04-11T23:47:16.854775804. - /// /// # Example: /// /// ```rust @@ -118,13 +110,12 @@ /// assert_eq!(as_string, r#"{"time":1526522699918355733}"#); /// # Ok::<(), serde_json::Error>(()) /// ``` + #[must_use] pub fn serialize(dt: &NaiveDateTime, serializer: S) -> Result where S: ser::Serializer, { - serializer.serialize_i64(dt.timestamp_nanos_opt().ok_or(ser::Error::custom( - "value out of range for a timestamp with nanosecond precision", - ))?) + serializer.serialize_i64(dt.timestamp_nanos()) } /// Deserialize a `NaiveDateTime` from a nanoseconds timestamp @@ -145,11 +136,9 @@ /// /// let my_s: S = serde_json::from_str(r#"{ "time": 1526522699918355733 }"#)?; /// assert_eq!(my_s, S { time: NaiveDateTime::from_timestamp_opt(1526522699, 918355733).unwrap() }); - /// - /// let my_s: S = serde_json::from_str(r#"{ "time": -1 }"#)?; - /// assert_eq!(my_s, S { time: NaiveDateTime::from_timestamp_opt(-1, 999_999_999).unwrap() }); /// # Ok::<(), serde_json::Error>(()) /// ``` + #[must_use] pub fn deserialize<'de, D>(d: D) -> Result where D: de::Deserializer<'de>, @@ -170,11 +159,8 @@ where E: de::Error, { - NaiveDateTime::from_timestamp_opt( - value.div_euclid(1_000_000_000), - (value.rem_euclid(1_000_000_000)) as u32, - ) - .ok_or_else(|| E::custom(ne_timestamp(value))) + NaiveDateTime::from_timestamp_opt(value / 1_000_000_000, (value % 1_000_000_000) as u32) + .ok_or_else(|| E::custom(ne_timestamp(value))) } fn visit_u64(self, value: u64) -> Result @@ -182,8 +168,8 @@ E: de::Error, { NaiveDateTime::from_timestamp_opt( - (value / 1_000_000_000) as i64, - (value % 1_000_000_000) as u32, + value as i64 / 1_000_000_000, + (value as i64 % 1_000_000_000) as u32, ) .ok_or_else(|| E::custom(ne_timestamp(value))) } @@ -228,14 +214,6 @@ /// /// Intended for use with `serde`s `serialize_with` attribute. /// - /// # Errors - /// - /// An `i64` with nanosecond precision can span a range of ~584 years. This function returns an - /// error on an out of range `DateTime`. - /// - /// The dates that can be represented as nanoseconds are between 1677-09-21T00:12:44.0 and - /// 2262-04-11T23:47:16.854775804. - /// /// # Example: /// /// ```rust @@ -255,14 +233,13 @@ /// assert_eq!(as_string, r#"{"time":1526522699918355733}"#); /// # Ok::<(), serde_json::Error>(()) /// ``` + #[must_use] pub fn serialize(opt: &Option, serializer: S) -> Result where S: ser::Serializer, { match *opt { - Some(ref dt) => serializer.serialize_some(&dt.timestamp_nanos_opt().ok_or( - ser::Error::custom("value out of range for a timestamp with nanosecond precision"), - )?), + Some(ref dt) => serializer.serialize_some(&dt.timestamp_nanos()), None => serializer.serialize_none(), } } @@ -285,11 +262,9 @@ /// /// let my_s: S = serde_json::from_str(r#"{ "time": 1526522699918355733 }"#)?; /// assert_eq!(my_s, S { time: NaiveDateTime::from_timestamp_opt(1526522699, 918355733) }); - /// - /// let my_s: S = serde_json::from_str(r#"{ "time": -1 }"#)?; - /// assert_eq!(my_s, S { time: NaiveDateTime::from_timestamp_opt(-1, 999_999_999) }); /// # Ok::<(), serde_json::Error>(()) /// ``` + #[must_use] pub fn deserialize<'de, D>(d: D) -> Result, D::Error> where D: de::Deserializer<'de>, @@ -387,6 +362,7 @@ /// assert_eq!(as_string, r#"{"time":1526522699918355}"#); /// # Ok::<(), serde_json::Error>(()) /// ``` + #[must_use] pub fn serialize(dt: &NaiveDateTime, serializer: S) -> Result where S: ser::Serializer, @@ -412,11 +388,9 @@ /// /// let my_s: S = serde_json::from_str(r#"{ "time": 1526522699918355 }"#)?; /// assert_eq!(my_s, S { time: NaiveDateTime::from_timestamp_opt(1526522699, 918355000).unwrap() }); - /// - /// let my_s: S = serde_json::from_str(r#"{ "time": -1 }"#)?; - /// assert_eq!(my_s, S { time: NaiveDateTime::from_timestamp_opt(-1, 999_999_000).unwrap() }); /// # Ok::<(), serde_json::Error>(()) /// ``` + #[must_use] pub fn deserialize<'de, D>(d: D) -> Result where D: de::Deserializer<'de>, @@ -437,8 +411,11 @@ where E: de::Error, { - NaiveDateTime::from_timestamp_micros(value) - .ok_or_else(|| E::custom(ne_timestamp(value))) + NaiveDateTime::from_timestamp_opt( + value / 1_000_000, + ((value % 1_000_000) * 1000) as u32, + ) + .ok_or_else(|| E::custom(ne_timestamp(value))) } fn visit_u64(self, value: u64) -> Result @@ -511,6 +488,7 @@ /// assert_eq!(as_string, r#"{"time":1526522699918355}"#); /// # Ok::<(), serde_json::Error>(()) /// ``` + #[must_use] pub fn serialize(opt: &Option, serializer: S) -> Result where S: ser::Serializer, @@ -539,11 +517,9 @@ /// /// let my_s: S = serde_json::from_str(r#"{ "time": 1526522699918355 }"#)?; /// assert_eq!(my_s, S { time: NaiveDateTime::from_timestamp_opt(1526522699, 918355000) }); - /// - /// let my_s: S = serde_json::from_str(r#"{ "time": -1 }"#)?; - /// assert_eq!(my_s, S { time: NaiveDateTime::from_timestamp_opt(-1, 999_999_000) }); /// # Ok::<(), serde_json::Error>(()) /// ``` + #[must_use] pub fn deserialize<'de, D>(d: D) -> Result, D::Error> where D: de::Deserializer<'de>, @@ -641,6 +617,7 @@ /// assert_eq!(as_string, r#"{"time":1526522699918}"#); /// # Ok::<(), serde_json::Error>(()) /// ``` + #[must_use] pub fn serialize(dt: &NaiveDateTime, serializer: S) -> Result where S: ser::Serializer, @@ -666,11 +643,9 @@ /// /// let my_s: S = serde_json::from_str(r#"{ "time": 1526522699918 }"#)?; /// assert_eq!(my_s, S { time: NaiveDateTime::from_timestamp_opt(1526522699, 918000000).unwrap() }); - /// - /// let my_s: S = serde_json::from_str(r#"{ "time": -1 }"#)?; - /// assert_eq!(my_s, S { time: NaiveDateTime::from_timestamp_opt(-1, 999_000_000).unwrap() }); /// # Ok::<(), serde_json::Error>(()) /// ``` + #[must_use] pub fn deserialize<'de, D>(d: D) -> Result where D: de::Deserializer<'de>, @@ -691,7 +666,7 @@ where E: de::Error, { - NaiveDateTime::from_timestamp_millis(value) + NaiveDateTime::from_timestamp_opt(value / 1000, ((value % 1000) * 1_000_000) as u32) .ok_or_else(|| E::custom(ne_timestamp(value))) } @@ -765,6 +740,7 @@ /// assert_eq!(as_string, r#"{"time":1526522699918}"#); /// # Ok::<(), serde_json::Error>(()) /// ``` + #[must_use] pub fn serialize(opt: &Option, serializer: S) -> Result where S: ser::Serializer, @@ -793,11 +769,9 @@ /// /// let my_s: S = serde_json::from_str(r#"{ "time": 1526522699918 }"#)?; /// assert_eq!(my_s, S { time: NaiveDateTime::from_timestamp_opt(1526522699, 918000000) }); - /// - /// let my_s: S = serde_json::from_str(r#"{ "time": -1 }"#)?; - /// assert_eq!(my_s, S { time: NaiveDateTime::from_timestamp_opt(-1, 999_000_000) }); /// # Ok::<(), serde_json::Error>(()) /// ``` + #[must_use] pub fn deserialize<'de, D>(d: D) -> Result, D::Error> where D: de::Deserializer<'de>, @@ -895,6 +869,7 @@ /// assert_eq!(as_string, r#"{"time":1431684000}"#); /// # Ok::<(), serde_json::Error>(()) /// ``` + #[must_use] pub fn serialize(dt: &NaiveDateTime, serializer: S) -> Result where S: ser::Serializer, @@ -922,6 +897,7 @@ /// assert_eq!(my_s, S { time: NaiveDateTime::from_timestamp_opt(1431684000, 0).unwrap() }); /// # Ok::<(), serde_json::Error>(()) /// ``` + #[must_use] pub fn deserialize<'de, D>(d: D) -> Result where D: de::Deserializer<'de>, @@ -1013,6 +989,7 @@ /// assert_eq!(as_string, r#"{"time":1526522699}"#); /// # Ok::<(), serde_json::Error>(()) /// ``` + #[must_use] pub fn serialize(opt: &Option, serializer: S) -> Result where S: ser::Serializer, @@ -1043,6 +1020,7 @@ /// assert_eq!(my_s, S { time: NaiveDateTime::from_timestamp_opt(1431684000, 0) }); /// # Ok::<(), serde_json::Error>(()) /// ``` + #[must_use] pub fn deserialize<'de, D>(d: D) -> Result, D::Error> where D: de::Deserializer<'de>, @@ -1085,6 +1063,51 @@ } } +#[test] +fn test_serde_serialize() { + super::test_encodable_json(serde_json::to_string); +} + +#[test] +fn test_serde_deserialize() { + super::test_decodable_json(|input| serde_json::from_str(input)); +} + +// Bincode is relevant to test separately from JSON because +// it is not self-describing. +#[test] +fn test_serde_bincode() { + use crate::NaiveDate; + use bincode::{deserialize, serialize}; + + let dt = NaiveDate::from_ymd_opt(2016, 7, 8).unwrap().and_hms_milli_opt(9, 10, 48, 90).unwrap(); + let encoded = serialize(&dt).unwrap(); + let decoded: NaiveDateTime = deserialize(&encoded).unwrap(); + assert_eq!(dt, decoded); +} + +#[test] +fn test_serde_bincode_optional() { + use crate::prelude::*; + use crate::serde::ts_nanoseconds_option; + use bincode::{deserialize, serialize}; + use serde_derive::{Deserialize, Serialize}; + + #[derive(Debug, PartialEq, Eq, Serialize, Deserialize)] + struct Test { + one: Option, + #[serde(with = "ts_nanoseconds_option")] + two: Option>, + } + + let expected = + Test { one: Some(1), two: Some(Utc.with_ymd_and_hms(1970, 1, 1, 0, 1, 1).unwrap()) }; + let bytes: Vec = serialize(&expected).unwrap(); + let actual = deserialize::(&(bytes)).unwrap(); + + assert_eq!(expected, actual); +} + // lik? function to convert a LocalResult into a serde-ish Result pub(crate) fn serde_from(me: LocalResult, ts: &V) -> Result where @@ -1132,51 +1155,3 @@ } } } - -#[cfg(test)] -mod tests { - use crate::naive::datetime::{test_decodable_json, test_encodable_json}; - use crate::serde::ts_nanoseconds_option; - use crate::{DateTime, NaiveDate, NaiveDateTime, TimeZone, Utc}; - - use bincode::{deserialize, serialize}; - use serde_derive::{Deserialize, Serialize}; - - #[test] - fn test_serde_serialize() { - test_encodable_json(serde_json::to_string); - } - - #[test] - fn test_serde_deserialize() { - test_decodable_json(|input| serde_json::from_str(input)); - } - - // Bincode is relevant to test separately from JSON because - // it is not self-describing. - #[test] - fn test_serde_bincode() { - let dt = - NaiveDate::from_ymd_opt(2016, 7, 8).unwrap().and_hms_milli_opt(9, 10, 48, 90).unwrap(); - let encoded = serialize(&dt).unwrap(); - let decoded: NaiveDateTime = deserialize(&encoded).unwrap(); - assert_eq!(dt, decoded); - } - - #[test] - fn test_serde_bincode_optional() { - #[derive(Debug, PartialEq, Eq, Serialize, Deserialize)] - struct Test { - one: Option, - #[serde(with = "ts_nanoseconds_option")] - two: Option>, - } - - let expected = - Test { one: Some(1), two: Some(Utc.with_ymd_and_hms(1970, 1, 1, 0, 1, 1).unwrap()) }; - let bytes: Vec = serialize(&expected).unwrap(); - let actual = deserialize::(&(bytes)).unwrap(); - - assert_eq!(expected, actual); - } -} diff -Nru temporalio-1.3.0/vendor/chrono/src/naive/datetime/tests.rs temporalio-1.3.0/vendor/chrono/src/naive/datetime/tests.rs --- temporalio-1.3.0/vendor/chrono/src/naive/datetime/tests.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/chrono/src/naive/datetime/tests.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,7 +1,8 @@ use super::NaiveDateTime; -use crate::duration::Duration as OldDuration; +use crate::oldtime::Duration; use crate::NaiveDate; use crate::{Datelike, FixedOffset, Utc}; +use std::i64; #[test] fn test_datetime_from_timestamp_millis() { @@ -16,11 +17,10 @@ (2034061609000, "2034-06-16 09:06:49.000000000"), ]; - for (timestamp_millis, _formatted) in valid_map.iter().copied() { + for (timestamp_millis, formatted) in valid_map.iter().copied() { let naive_datetime = NaiveDateTime::from_timestamp_millis(timestamp_millis); assert_eq!(timestamp_millis, naive_datetime.unwrap().timestamp_millis()); - #[cfg(any(feature = "alloc", feature = "std"))] - assert_eq!(naive_datetime.unwrap().format("%F %T%.9f").to_string(), _formatted); + assert_eq!(naive_datetime.unwrap().format("%F %T%.9f").to_string(), formatted); } let invalid = [i64::MAX, i64::MIN]; @@ -54,11 +54,10 @@ (2034061609000000, "2034-06-16 09:06:49.000000000"), ]; - for (timestamp_micros, _formatted) in valid_map.iter().copied() { + for (timestamp_micros, formatted) in valid_map.iter().copied() { let naive_datetime = NaiveDateTime::from_timestamp_micros(timestamp_micros); assert_eq!(timestamp_micros, naive_datetime.unwrap().timestamp_micros()); - #[cfg(any(feature = "alloc", feature = "std"))] - assert_eq!(naive_datetime.unwrap().format("%F %T%.9f").to_string(), _formatted); + assert_eq!(naive_datetime.unwrap().format("%F %T%.9f").to_string(), formatted); } let invalid = [i64::MAX, i64::MIN]; @@ -97,7 +96,7 @@ fn test_datetime_add() { fn check( (y, m, d, h, n, s): (i32, u32, u32, u32, u32, u32), - rhs: OldDuration, + rhs: Duration, result: Option<(i32, u32, u32, u32, u32, u32)>, ) { let lhs = NaiveDate::from_ymd_opt(y, m, d).unwrap().and_hms_opt(h, n, s).unwrap(); @@ -108,16 +107,12 @@ assert_eq!(lhs.checked_sub_signed(-rhs), sum); } - check((2014, 5, 6, 7, 8, 9), OldDuration::seconds(3600 + 60 + 1), Some((2014, 5, 6, 8, 9, 10))); - check( - (2014, 5, 6, 7, 8, 9), - OldDuration::seconds(-(3600 + 60 + 1)), - Some((2014, 5, 6, 6, 7, 8)), - ); - check((2014, 5, 6, 7, 8, 9), OldDuration::seconds(86399), Some((2014, 5, 7, 7, 8, 8))); - check((2014, 5, 6, 7, 8, 9), OldDuration::seconds(86_400 * 10), Some((2014, 5, 16, 7, 8, 9))); - check((2014, 5, 6, 7, 8, 9), OldDuration::seconds(-86_400 * 10), Some((2014, 4, 26, 7, 8, 9))); - check((2014, 5, 6, 7, 8, 9), OldDuration::seconds(86_400 * 10), Some((2014, 5, 16, 7, 8, 9))); + check((2014, 5, 6, 7, 8, 9), Duration::seconds(3600 + 60 + 1), Some((2014, 5, 6, 8, 9, 10))); + check((2014, 5, 6, 7, 8, 9), Duration::seconds(-(3600 + 60 + 1)), Some((2014, 5, 6, 6, 7, 8))); + check((2014, 5, 6, 7, 8, 9), Duration::seconds(86399), Some((2014, 5, 7, 7, 8, 8))); + check((2014, 5, 6, 7, 8, 9), Duration::seconds(86_400 * 10), Some((2014, 5, 16, 7, 8, 9))); + check((2014, 5, 6, 7, 8, 9), Duration::seconds(-86_400 * 10), Some((2014, 4, 26, 7, 8, 9))); + check((2014, 5, 6, 7, 8, 9), Duration::seconds(86_400 * 10), Some((2014, 5, 16, 7, 8, 9))); // overflow check // assumes that we have correct values for MAX/MIN_DAYS_FROM_YEAR_0 from `naive::date`. @@ -127,17 +122,17 @@ check((0, 1, 1, 0, 0, 0), max_days_from_year_0, Some((NaiveDate::MAX.year(), 12, 31, 0, 0, 0))); check( (0, 1, 1, 0, 0, 0), - max_days_from_year_0 + OldDuration::seconds(86399), + max_days_from_year_0 + Duration::seconds(86399), Some((NaiveDate::MAX.year(), 12, 31, 23, 59, 59)), ); - check((0, 1, 1, 0, 0, 0), max_days_from_year_0 + OldDuration::seconds(86_400), None); - check((0, 1, 1, 0, 0, 0), OldDuration::max_value(), None); + check((0, 1, 1, 0, 0, 0), max_days_from_year_0 + Duration::seconds(86_400), None); + check((0, 1, 1, 0, 0, 0), Duration::max_value(), None); let min_days_from_year_0 = NaiveDate::MIN.signed_duration_since(NaiveDate::from_ymd_opt(0, 1, 1).unwrap()); check((0, 1, 1, 0, 0, 0), min_days_from_year_0, Some((NaiveDate::MIN.year(), 1, 1, 0, 0, 0))); - check((0, 1, 1, 0, 0, 0), min_days_from_year_0 - OldDuration::seconds(1), None); - check((0, 1, 1, 0, 0, 0), OldDuration::min_value(), None); + check((0, 1, 1, 0, 0, 0), min_days_from_year_0 - Duration::seconds(1), None); + check((0, 1, 1, 0, 0, 0), Duration::min_value(), None); } #[test] @@ -145,25 +140,22 @@ let ymdhms = |y, m, d, h, n, s| NaiveDate::from_ymd_opt(y, m, d).unwrap().and_hms_opt(h, n, s).unwrap(); let since = NaiveDateTime::signed_duration_since; - assert_eq!( - since(ymdhms(2014, 5, 6, 7, 8, 9), ymdhms(2014, 5, 6, 7, 8, 9)), - OldDuration::zero() - ); + assert_eq!(since(ymdhms(2014, 5, 6, 7, 8, 9), ymdhms(2014, 5, 6, 7, 8, 9)), Duration::zero()); assert_eq!( since(ymdhms(2014, 5, 6, 7, 8, 10), ymdhms(2014, 5, 6, 7, 8, 9)), - OldDuration::seconds(1) + Duration::seconds(1) ); assert_eq!( since(ymdhms(2014, 5, 6, 7, 8, 9), ymdhms(2014, 5, 6, 7, 8, 10)), - OldDuration::seconds(-1) + Duration::seconds(-1) ); assert_eq!( since(ymdhms(2014, 5, 7, 7, 8, 9), ymdhms(2014, 5, 6, 7, 8, 10)), - OldDuration::seconds(86399) + Duration::seconds(86399) ); assert_eq!( since(ymdhms(2001, 9, 9, 1, 46, 39), ymdhms(1970, 1, 1, 0, 0, 0)), - OldDuration::seconds(999_999_999) + Duration::seconds(999_999_999) ); } @@ -172,9 +164,9 @@ let ymdhms = |y, m, d, h, n, s| NaiveDate::from_ymd_opt(y, m, d).unwrap().and_hms_opt(h, n, s).unwrap(); let mut date = ymdhms(2016, 10, 1, 10, 10, 10); - date += OldDuration::minutes(10_000_000); + date += Duration::minutes(10_000_000); assert_eq!(date, ymdhms(2035, 10, 6, 20, 50, 10)); - date += OldDuration::days(10); + date += Duration::days(10); assert_eq!(date, ymdhms(2035, 10, 16, 20, 50, 10)); } @@ -183,34 +175,13 @@ let ymdhms = |y, m, d, h, n, s| NaiveDate::from_ymd_opt(y, m, d).unwrap().and_hms_opt(h, n, s).unwrap(); let mut date = ymdhms(2016, 10, 1, 10, 10, 10); - date -= OldDuration::minutes(10_000_000); + date -= Duration::minutes(10_000_000); assert_eq!(date, ymdhms(1997, 9, 26, 23, 30, 10)); - date -= OldDuration::days(10); + date -= Duration::days(10); assert_eq!(date, ymdhms(1997, 9, 16, 23, 30, 10)); } #[test] -fn test_core_duration_ops() { - use core::time::Duration; - - let mut dt = NaiveDate::from_ymd_opt(2023, 8, 29).unwrap().and_hms_opt(11, 34, 12).unwrap(); - let same = dt + Duration::ZERO; - assert_eq!(dt, same); - - dt += Duration::new(3600, 0); - assert_eq!(dt, NaiveDate::from_ymd_opt(2023, 8, 29).unwrap().and_hms_opt(12, 34, 12).unwrap()); -} - -#[test] -#[should_panic] -fn test_core_duration_max() { - use core::time::Duration; - - let mut utc_dt = NaiveDate::from_ymd_opt(2023, 8, 29).unwrap().and_hms_opt(11, 34, 12).unwrap(); - utc_dt += Duration::MAX; -} - -#[test] fn test_datetime_timestamp() { let to_timestamp = |y, m, d, h, n, s| { NaiveDate::from_ymd_opt(y, m, d).unwrap().and_hms_opt(h, n, s).unwrap().timestamp() @@ -226,16 +197,11 @@ fn test_datetime_from_str() { // valid cases let valid = [ - "2001-02-03T04:05:06", - "2012-12-12T12:12:12", - "2015-02-18T23:16:09.153", - "2015-2-18T23:16:09.153", + "2015-2-18T23:16:9.15", "-77-02-18T23:16:09", - "+82701-05-6T15:9:60.898989898989", " +82701 - 05 - 6 T 15 : 9 : 60.898989898989 ", ]; for &s in &valid { - eprintln!("test_parse_naivedatetime valid {:?}", s); let d = match s.parse::() { Ok(d) => d, Err(e) => panic!("parsing `{}` has failed: {}", s, e), @@ -260,34 +226,16 @@ // some invalid cases // since `ParseErrorKind` is private, all we can do is to check if there was an error - let invalid = [ - "", // empty - "x", // invalid / missing data - "15", // missing data - "15:8:9", // looks like a time (invalid date) - "15-8-9", // looks like a date (invalid) - "Fri, 09 Aug 2013 23:54:35 GMT", // valid date, wrong format - "Sat Jun 30 23:59:60 2012", // valid date, wrong format - "1441497364.649", // valid date, wrong format - "+1441497364.649", // valid date, wrong format - "+1441497364", // valid date, wrong format - "2014/02/03 04:05:06", // valid date, wrong format - "2015-15-15T15:15:15", // invalid date - "2012-12-12T12:12:12x", // bad timezone / trailing literal - "2012-12-12T12:12:12+00:00", // unexpected timezone / trailing literal - "2012-12-12T12:12:12 +00:00", // unexpected timezone / trailing literal - "2012-12-12T12:12:12 GMT", // unexpected timezone / trailing literal - "2012-123-12T12:12:12", // invalid month - "2012-12-12t12:12:12", // bad divider 't' - "2012-12-12 12:12:12", // missing divider 'T' - "2012-12-12T12:12:12Z", // trailing char 'Z' - "+ 82701-123-12T12:12:12", // strange year, invalid month - "+802701-123-12T12:12:12", // out-of-bound year, invalid month - ]; - for &s in &invalid { - eprintln!("test_datetime_from_str invalid {:?}", s); - assert!(s.parse::().is_err()); - } + assert!("".parse::().is_err()); + assert!("x".parse::().is_err()); + assert!("15".parse::().is_err()); + assert!("15:8:9".parse::().is_err()); + assert!("15-8-9".parse::().is_err()); + assert!("2015-15-15T15:15:15".parse::().is_err()); + assert!("2012-12-12T12:12:12x".parse::().is_err()); + assert!("2012-123-12T12:12:12".parse::().is_err()); + assert!("+ 82701-123-12T12:12:12".parse::().is_err()); + assert!("+802701-123-12T12:12:12".parse::().is_err()); // out-of-bound } #[test] @@ -339,37 +287,17 @@ } #[test] -fn test_datetime_parse_from_str_with_spaces() { - let parse_from_str = NaiveDateTime::parse_from_str; - let dt = NaiveDate::from_ymd_opt(2013, 8, 9).unwrap().and_hms_opt(23, 54, 35).unwrap(); - // with varying spaces - should succeed - assert_eq!(parse_from_str(" Aug 09 2013 23:54:35", " %b %d %Y %H:%M:%S"), Ok(dt)); - assert_eq!(parse_from_str("Aug 09 2013 23:54:35 ", "%b %d %Y %H:%M:%S "), Ok(dt)); - assert_eq!(parse_from_str(" Aug 09 2013 23:54:35 ", " %b %d %Y %H:%M:%S "), Ok(dt)); - assert_eq!(parse_from_str(" Aug 09 2013 23:54:35", " %b %d %Y %H:%M:%S"), Ok(dt)); - assert_eq!(parse_from_str(" Aug 09 2013 23:54:35", " %b %d %Y %H:%M:%S"), Ok(dt)); - assert_eq!(parse_from_str("\n\tAug 09 2013 23:54:35 ", "\n\t%b %d %Y %H:%M:%S "), Ok(dt)); - assert_eq!(parse_from_str("\tAug 09 2013 23:54:35\t", "\t%b %d %Y %H:%M:%S\t"), Ok(dt)); - assert_eq!(parse_from_str("Aug 09 2013 23:54:35", "%b %d %Y %H:%M:%S"), Ok(dt)); - assert_eq!(parse_from_str("Aug 09 2013 23:54:35", "%b %d %Y %H:%M:%S"), Ok(dt)); - assert_eq!(parse_from_str("Aug 09 2013\t23:54:35", "%b %d %Y\t%H:%M:%S"), Ok(dt)); - assert_eq!(parse_from_str("Aug 09 2013\t\t23:54:35", "%b %d %Y\t\t%H:%M:%S"), Ok(dt)); - assert_eq!(parse_from_str("Aug 09 2013 23:54:35 ", "%b %d %Y %H:%M:%S\n"), Ok(dt)); - assert_eq!(parse_from_str("Aug 09 2013 23:54:35", "%b %d %Y\t%H:%M:%S"), Ok(dt)); - assert_eq!(parse_from_str("Aug 09 2013 23:54:35", "%b %d %Y %H:%M:%S "), Ok(dt)); - assert_eq!(parse_from_str("Aug 09 2013 23:54:35", " %b %d %Y %H:%M:%S"), Ok(dt)); - assert_eq!(parse_from_str("Aug 09 2013 23:54:35", "%b %d %Y %H:%M:%S\n"), Ok(dt)); - // with varying spaces - should fail - // leading space in data - assert!(parse_from_str(" Aug 09 2013 23:54:35", "%b %d %Y %H:%M:%S").is_err()); - // trailing space in data - assert!(parse_from_str("Aug 09 2013 23:54:35 ", "%b %d %Y %H:%M:%S").is_err()); - // trailing tab in data - assert!(parse_from_str("Aug 09 2013 23:54:35\t", "%b %d %Y %H:%M:%S").is_err()); - // mismatched newlines - assert!(parse_from_str("\nAug 09 2013 23:54:35", "%b %d %Y %H:%M:%S\n").is_err()); - // trailing literal in data - assert!(parse_from_str("Aug 09 2013 23:54:35 !!!", "%b %d %Y %H:%M:%S ").is_err()); +fn test_datetime_format() { + let dt = NaiveDate::from_ymd_opt(2010, 9, 8).unwrap().and_hms_milli_opt(7, 6, 54, 321).unwrap(); + assert_eq!(dt.format("%c").to_string(), "Wed Sep 8 07:06:54 2010"); + assert_eq!(dt.format("%s").to_string(), "1283929614"); + assert_eq!(dt.format("%t%n%%%n%t").to_string(), "\t\n%\n\t"); + + // a horror of leap second: coming near to you. + let dt = + NaiveDate::from_ymd_opt(2012, 6, 30).unwrap().and_hms_milli_opt(23, 59, 59, 1_000).unwrap(); + assert_eq!(dt.format("%c").to_string(), "Sat Jun 30 23:59:60 2012"); + assert_eq!(dt.format("%s").to_string(), "1341100799"); // not 1341100800, it's intentional. } #[test] @@ -377,7 +305,7 @@ // issue #37 let base = NaiveDate::from_ymd_opt(2000, 1, 1).unwrap().and_hms_opt(0, 0, 0).unwrap(); let t = -946684799990000; - let time = base + OldDuration::microseconds(t); + let time = base + Duration::microseconds(t); assert_eq!(t, time.signed_duration_since(base).num_microseconds().unwrap()); } @@ -386,7 +314,7 @@ const A_BILLION: i64 = 1_000_000_000; let maximum = "2262-04-11T23:47:16.854775804"; let parsed: NaiveDateTime = maximum.parse().unwrap(); - let nanos = parsed.timestamp_nanos_opt().unwrap(); + let nanos = parsed.timestamp_nanos(); assert_eq!( parsed, NaiveDateTime::from_timestamp_opt(nanos / A_BILLION, (nanos % A_BILLION) as u32).unwrap() @@ -394,23 +322,11 @@ let minimum = "1677-09-21T00:12:44.000000000"; let parsed: NaiveDateTime = minimum.parse().unwrap(); - let nanos = parsed.timestamp_nanos_opt().unwrap(); + let nanos = parsed.timestamp_nanos(); assert_eq!( parsed, NaiveDateTime::from_timestamp_opt(nanos / A_BILLION, (nanos % A_BILLION) as u32).unwrap() ); - - // Just beyond range - let maximum = "2262-04-11T23:47:16.854775804"; - let parsed: NaiveDateTime = maximum.parse().unwrap(); - let beyond_max = parsed + OldDuration::milliseconds(300); - assert!(beyond_max.timestamp_nanos_opt().is_none()); - - // Far beyond range - let maximum = "2262-04-11T23:47:16.854775804"; - let parsed: NaiveDateTime = maximum.parse().unwrap(); - let beyond_max = parsed + OldDuration::days(365); - assert!(beyond_max.timestamp_nanos_opt().is_none()); } #[test] diff -Nru temporalio-1.3.0/vendor/chrono/src/naive/internals.rs temporalio-1.3.0/vendor/chrono/src/naive/internals.rs --- temporalio-1.3.0/vendor/chrono/src/naive/internals.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/chrono/src/naive/internals.rs 2023-10-30 19:40:00.000000000 +0000 @@ -16,7 +16,7 @@ #![cfg_attr(feature = "__internal_bench", allow(missing_docs))] use crate::Weekday; -use core::fmt; +use core::{fmt, i32}; /// The internal date representation: `year << 13 | Of` pub(super) type DateImpl = i32; @@ -504,6 +504,8 @@ #[cfg(test)] mod tests { + use std::u32; + use super::weekday_from_u32_mod7; use super::{Mdf, Of}; use super::{YearFlags, A, AG, B, BA, C, CB, D, DC, E, ED, F, FE, G, GF}; diff -Nru temporalio-1.3.0/vendor/chrono/src/naive/isoweek.rs temporalio-1.3.0/vendor/chrono/src/naive/isoweek.rs --- temporalio-1.3.0/vendor/chrono/src/naive/isoweek.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/chrono/src/naive/isoweek.rs 2023-10-30 19:40:00.000000000 +0000 @@ -158,13 +158,11 @@ assert_eq!(minweek.year(), internals::MIN_YEAR); assert_eq!(minweek.week(), 1); assert_eq!(minweek.week0(), 0); - #[cfg(any(feature = "alloc", feature = "std"))] assert_eq!(format!("{:?}", minweek), NaiveDate::MIN.format("%G-W%V").to_string()); assert_eq!(maxweek.year(), internals::MAX_YEAR + 1); assert_eq!(maxweek.week(), 1); assert_eq!(maxweek.week0(), 0); - #[cfg(any(feature = "alloc", feature = "std"))] assert_eq!(format!("{:?}", maxweek), NaiveDate::MAX.format("%G-W%V").to_string()); } diff -Nru temporalio-1.3.0/vendor/chrono/src/naive/mod.rs temporalio-1.3.0/vendor/chrono/src/naive/mod.rs --- temporalio-1.3.0/vendor/chrono/src/naive/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/chrono/src/naive/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -10,9 +10,8 @@ mod isoweek; mod time; -pub use self::date::{Days, NaiveDate, NaiveDateDaysIterator, NaiveDateWeeksIterator, NaiveWeek}; #[allow(deprecated)] -pub use self::date::{MAX_DATE, MIN_DATE}; +pub use self::date::{Days, NaiveDate, NaiveWeek, MAX_DATE, MIN_DATE}; #[cfg(feature = "rustc-serialize")] #[allow(deprecated)] pub use self::datetime::rustc_serialize::TsSeconds; diff -Nru temporalio-1.3.0/vendor/chrono/src/naive/time/mod.rs temporalio-1.3.0/vendor/chrono/src/naive/time/mod.rs --- temporalio-1.3.0/vendor/chrono/src/naive/time/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/chrono/src/naive/time/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -3,24 +3,22 @@ //! ISO 8601 time without timezone. -#[cfg(any(feature = "alloc", feature = "std"))] +#[cfg(any(feature = "alloc", feature = "std", test))] use core::borrow::Borrow; use core::ops::{Add, AddAssign, Sub, SubAssign}; -use core::time::Duration; use core::{fmt, str}; #[cfg(feature = "rkyv")] use rkyv::{Archive, Deserialize, Serialize}; -use crate::duration::Duration as OldDuration; -#[cfg(any(feature = "alloc", feature = "std"))] +#[cfg(any(feature = "alloc", feature = "std", test))] use crate::format::DelayedFormat; use crate::format::{ parse, parse_and_remainder, write_hundreds, Fixed, Item, Numeric, Pad, ParseError, ParseResult, Parsed, StrftimeItems, }; +use crate::oldtime::Duration as OldDuration; use crate::Timelike; -use crate::{expect, try_opt}; #[cfg(feature = "rustc-serialize")] mod rustc_serialize; @@ -102,8 +100,7 @@ /// (short for [`NaiveTime::overflowing_add_signed`](#method.overflowing_add_signed)): /// /// - `03:00:00 + 1s = 03:00:01`. -/// - `03:00:59 + 60s = 03:01:59`. -/// - `03:00:59 + 61s = 03:02:00`. +/// - `03:00:59 + 60s = 03:02:00`. /// - `03:00:59 + 1s = 03:01:00`. /// - `03:00:60 + 1s = 03:01:00`. /// Note that the sum is identical to the previous. @@ -171,33 +168,22 @@ /// assert_eq!(format!("{:?}", dt), "2015-06-30T23:59:60Z"); /// ``` /// -/// There are hypothetical leap seconds not on the minute boundary nevertheless supported by Chrono. -/// They are allowed for the sake of completeness and consistency; there were several "exotic" time -/// zone offsets with fractional minutes prior to UTC after all. -/// For such cases the human-readable representation is ambiguous and would be read back to the next -/// non-leap second. -/// -/// A `NaiveTime` with a leap second that is not on a minute boundary can only be created from a -/// [`DateTime`](crate::DateTime) with fractional minutes as offset, or using -/// [`Timelike::with_nanosecond()`]. -/// -/// ``` -/// use chrono::{FixedOffset, NaiveDate, TimeZone}; -/// -/// let paramaribo_pre1945 = FixedOffset::east_opt(-13236).unwrap(); // -03:40:36 -/// let leap_sec_2015 = -/// NaiveDate::from_ymd_opt(2015, 6, 30).unwrap().and_hms_milli_opt(23, 59, 59, 1_000).unwrap(); -/// let dt1 = paramaribo_pre1945.from_utc_datetime(&leap_sec_2015); -/// assert_eq!(format!("{:?}", dt1), "2015-06-30T20:19:24-03:40:36"); -/// assert_eq!(format!("{:?}", dt1.time()), "20:19:24"); -/// -/// let next_sec = NaiveDate::from_ymd_opt(2015, 7, 1).unwrap().and_hms_opt(0, 0, 0).unwrap(); -/// let dt2 = paramaribo_pre1945.from_utc_datetime(&next_sec); -/// assert_eq!(format!("{:?}", dt2), "2015-06-30T20:19:24-03:40:36"); -/// assert_eq!(format!("{:?}", dt2.time()), "20:19:24"); -/// -/// assert!(dt1.time() != dt2.time()); -/// assert!(dt1.time().to_string() == dt2.time().to_string()); +/// There are hypothetical leap seconds not on the minute boundary +/// nevertheless supported by Chrono. +/// They are allowed for the sake of completeness and consistency; +/// there were several "exotic" time zone offsets with fractional minutes prior to UTC after all. +/// For such cases the human-readable representation is ambiguous +/// and would be read back to the next non-leap second. +/// +/// ``` +/// use chrono::{DateTime, Utc, TimeZone, NaiveDate}; +/// +/// let dt = NaiveDate::from_ymd_opt(2015, 6, 30).unwrap().and_hms_milli_opt(23, 56, 4, 1_000).unwrap().and_local_timezone(Utc).unwrap(); +/// assert_eq!(format!("{:?}", dt), "2015-06-30T23:56:05Z"); +/// +/// let dt = Utc.with_ymd_and_hms(2015, 6, 30, 23, 56, 5).unwrap(); +/// assert_eq!(format!("{:?}", dt), "2015-06-30T23:56:05Z"); +/// assert_eq!(DateTime::parse_from_rfc3339("2015-06-30T23:56:05Z").unwrap(), dt); /// ``` /// /// Since Chrono alone cannot determine any existence of leap seconds, @@ -212,14 +198,9 @@ #[cfg(feature = "arbitrary")] impl arbitrary::Arbitrary<'_> for NaiveTime { fn arbitrary(u: &mut arbitrary::Unstructured) -> arbitrary::Result { - let mins = u.int_in_range(0..=1439)?; - let mut secs = u.int_in_range(0..=60)?; - let mut nano = u.int_in_range(0..=999_999_999)?; - if secs == 60 { - secs = 59; - nano += 1_000_000_000; - } - let time = NaiveTime::from_num_seconds_from_midnight_opt(mins * 60 + secs, nano) + let secs = u.int_in_range(0..=86_399)?; + let nano = u.int_in_range(0..=1_999_999_999)?; + let time = NaiveTime::from_num_seconds_from_midnight_opt(secs, nano) .expect("Could not generate a valid chrono::NaiveTime. It looks like implementation of Arbitrary for NaiveTime is erroneous."); Ok(time) } @@ -231,22 +212,18 @@ /// No [leap second](#leap-second-handling) is allowed here; /// use `NaiveTime::from_hms_*` methods with a subsecond parameter instead. /// - /// # Panics - /// /// Panics on invalid hour, minute and/or second. #[deprecated(since = "0.4.23", note = "use `from_hms_opt()` instead")] #[inline] #[must_use] - pub const fn from_hms(hour: u32, min: u32, sec: u32) -> NaiveTime { - expect!(NaiveTime::from_hms_opt(hour, min, sec), "invalid time") + pub fn from_hms(hour: u32, min: u32, sec: u32) -> NaiveTime { + NaiveTime::from_hms_opt(hour, min, sec).expect("invalid time") } /// Makes a new `NaiveTime` from hour, minute and second. /// - /// The millisecond part is allowed to exceed 1,000,000,000 in order to represent a - /// [leap second](#leap-second-handling), but only when `sec == 59`. - /// - /// # Errors + /// No [leap second](#leap-second-handling) is allowed here; + /// use `NaiveTime::from_hms_*_opt` methods with a subsecond parameter instead. /// /// Returns `None` on invalid hour, minute and/or second. /// @@ -274,22 +251,18 @@ /// The millisecond part can exceed 1,000 /// in order to represent the [leap second](#leap-second-handling). /// - /// # Panics - /// /// Panics on invalid hour, minute, second and/or millisecond. #[deprecated(since = "0.4.23", note = "use `from_hms_milli_opt()` instead")] #[inline] #[must_use] - pub const fn from_hms_milli(hour: u32, min: u32, sec: u32, milli: u32) -> NaiveTime { - expect!(NaiveTime::from_hms_milli_opt(hour, min, sec, milli), "invalid time") + pub fn from_hms_milli(hour: u32, min: u32, sec: u32, milli: u32) -> NaiveTime { + NaiveTime::from_hms_milli_opt(hour, min, sec, milli).expect("invalid time") } /// Makes a new `NaiveTime` from hour, minute, second and millisecond. /// - /// The millisecond part is allowed to exceed 1,000,000,000 in order to represent a - /// [leap second](#leap-second-handling), but only when `sec == 59`. - /// - /// # Errors + /// The millisecond part can exceed 1,000 + /// in order to represent the [leap second](#leap-second-handling). /// /// Returns `None` on invalid hour, minute, second and/or millisecond. /// @@ -310,37 +283,29 @@ /// ``` #[inline] #[must_use] - pub const fn from_hms_milli_opt( - hour: u32, - min: u32, - sec: u32, - milli: u32, - ) -> Option { - let nano = try_opt!(milli.checked_mul(1_000_000)); - NaiveTime::from_hms_nano_opt(hour, min, sec, nano) + pub fn from_hms_milli_opt(hour: u32, min: u32, sec: u32, milli: u32) -> Option { + milli + .checked_mul(1_000_000) + .and_then(|nano| NaiveTime::from_hms_nano_opt(hour, min, sec, nano)) } /// Makes a new `NaiveTime` from hour, minute, second and microsecond. /// - /// The microsecond part is allowed to exceed 1,000,000,000 in order to represent a - /// [leap second](#leap-second-handling), but only when `sec == 59`. - /// - /// # Panics + /// The microsecond part can exceed 1,000,000 + /// in order to represent the [leap second](#leap-second-handling). /// /// Panics on invalid hour, minute, second and/or microsecond. #[deprecated(since = "0.4.23", note = "use `from_hms_micro_opt()` instead")] #[inline] #[must_use] - pub const fn from_hms_micro(hour: u32, min: u32, sec: u32, micro: u32) -> NaiveTime { - expect!(NaiveTime::from_hms_micro_opt(hour, min, sec, micro), "invalid time") + pub fn from_hms_micro(hour: u32, min: u32, sec: u32, micro: u32) -> NaiveTime { + NaiveTime::from_hms_micro_opt(hour, min, sec, micro).expect("invalid time") } /// Makes a new `NaiveTime` from hour, minute, second and microsecond. /// - /// The microsecond part is allowed to exceed 1,000,000,000 in order to represent a - /// [leap second](#leap-second-handling), but only when `sec == 59`. - /// - /// # Errors + /// The microsecond part can exceed 1,000,000 + /// in order to represent the [leap second](#leap-second-handling). /// /// Returns `None` on invalid hour, minute, second and/or microsecond. /// @@ -361,37 +326,27 @@ /// ``` #[inline] #[must_use] - pub const fn from_hms_micro_opt( - hour: u32, - min: u32, - sec: u32, - micro: u32, - ) -> Option { - let nano = try_opt!(micro.checked_mul(1_000)); - NaiveTime::from_hms_nano_opt(hour, min, sec, nano) + pub fn from_hms_micro_opt(hour: u32, min: u32, sec: u32, micro: u32) -> Option { + micro.checked_mul(1_000).and_then(|nano| NaiveTime::from_hms_nano_opt(hour, min, sec, nano)) } /// Makes a new `NaiveTime` from hour, minute, second and nanosecond. /// - /// The nanosecond part is allowed to exceed 1,000,000,000 in order to represent a - /// [leap second](#leap-second-handling), but only when `sec == 59`. - /// - /// # Panics + /// The nanosecond part can exceed 1,000,000,000 + /// in order to represent the [leap second](#leap-second-handling). /// /// Panics on invalid hour, minute, second and/or nanosecond. #[deprecated(since = "0.4.23", note = "use `from_hms_nano_opt()` instead")] #[inline] #[must_use] - pub const fn from_hms_nano(hour: u32, min: u32, sec: u32, nano: u32) -> NaiveTime { - expect!(NaiveTime::from_hms_nano_opt(hour, min, sec, nano), "invalid time") + pub fn from_hms_nano(hour: u32, min: u32, sec: u32, nano: u32) -> NaiveTime { + NaiveTime::from_hms_nano_opt(hour, min, sec, nano).expect("invalid time") } /// Makes a new `NaiveTime` from hour, minute, second and nanosecond. /// - /// The nanosecond part is allowed to exceed 1,000,000,000 in order to represent a - /// [leap second](#leap-second-handling), but only when `sec == 59`. - /// - /// # Errors + /// The nanosecond part can exceed 1,000,000,000 + /// in order to represent the [leap second](#leap-second-handling). /// /// Returns `None` on invalid hour, minute, second and/or nanosecond. /// @@ -413,10 +368,7 @@ #[inline] #[must_use] pub const fn from_hms_nano_opt(hour: u32, min: u32, sec: u32, nano: u32) -> Option { - if (hour >= 24 || min >= 60 || sec >= 60) - || (nano >= 1_000_000_000 && sec != 59) - || nano >= 2_000_000_000 - { + if hour >= 24 || min >= 60 || sec >= 60 || nano >= 2_000_000_000 { return None; } let secs = hour * 3600 + min * 60 + sec; @@ -425,25 +377,21 @@ /// Makes a new `NaiveTime` from the number of seconds since midnight and nanosecond. /// - /// The nanosecond part is allowed to exceed 1,000,000,000 in order to represent a - /// [leap second](#leap-second-handling), but only when `secs % 60 == 59`. - /// - /// # Panics + /// The nanosecond part can exceed 1,000,000,000 + /// in order to represent the [leap second](#leap-second-handling). /// /// Panics on invalid number of seconds and/or nanosecond. #[deprecated(since = "0.4.23", note = "use `from_num_seconds_from_midnight_opt()` instead")] #[inline] #[must_use] - pub const fn from_num_seconds_from_midnight(secs: u32, nano: u32) -> NaiveTime { - expect!(NaiveTime::from_num_seconds_from_midnight_opt(secs, nano), "invalid time") + pub fn from_num_seconds_from_midnight(secs: u32, nano: u32) -> NaiveTime { + NaiveTime::from_num_seconds_from_midnight_opt(secs, nano).expect("invalid time") } /// Makes a new `NaiveTime` from the number of seconds since midnight and nanosecond. /// - /// The nanosecond part is allowed to exceed 1,000,000,000 in order to represent a - /// [leap second](#leap-second-handling), but only when `secs % 60 == 59`. - /// - /// # Errors + /// The nanosecond part can exceed 1,000,000,000 + /// in order to represent the [leap second](#leap-second-handling). /// /// Returns `None` on invalid number of seconds and/or nanosecond. /// @@ -463,7 +411,7 @@ #[inline] #[must_use] pub const fn from_num_seconds_from_midnight_opt(secs: u32, nano: u32) -> Option { - if secs >= 86_400 || nano >= 2_000_000_000 || (nano >= 1_000_000_000 && secs % 60 != 59) { + if secs >= 86_400 || nano >= 2_000_000_000 { return None; } Some(NaiveTime { secs, frac: nano }) @@ -558,8 +506,10 @@ parsed.to_naive_time().map(|t| (t, remainder)) } - /// Adds given `Duration` to the current time, and also returns the number of *seconds* + /// Adds given `Duration` to the current time, + /// and also returns the number of *seconds* /// in the integral number of days ignored from the addition. + /// (We cannot return `Duration` because it is subject to overflow or underflow.) /// /// # Example /// @@ -639,8 +589,10 @@ (NaiveTime { secs: secs as u32, frac: frac as u32 }, morerhssecs) } - /// Subtracts given `Duration` from the current time, and also returns the number of *seconds* + /// Subtracts given `Duration` from the current time, + /// and also returns the number of *seconds* /// in the integral number of days ignored from the subtraction. + /// (We cannot return `Duration` because it is subject to overflow or underflow.) /// /// # Example /// @@ -777,7 +729,7 @@ /// # let t = NaiveTime::from_hms_opt(23, 56, 4).unwrap(); /// assert_eq!(format!("{}", t.format_with_items(fmt)), "23:56:04"); /// ``` - #[cfg(any(feature = "alloc", feature = "std"))] + #[cfg(any(feature = "alloc", feature = "std", test))] #[cfg_attr(docsrs, doc(cfg(any(feature = "alloc", feature = "std"))))] #[inline] #[must_use] @@ -823,7 +775,7 @@ /// assert_eq!(format!("{}", t.format("%H:%M:%S%.6f")), "23:56:04.012345"); /// assert_eq!(format!("{}", t.format("%-I:%M %p")), "11:56 PM"); /// ``` - #[cfg(any(feature = "alloc", feature = "std"))] + #[cfg(any(feature = "alloc", feature = "std", test))] #[cfg_attr(docsrs, doc(cfg(any(feature = "alloc", feature = "std"))))] #[inline] #[must_use] @@ -832,7 +784,7 @@ } /// Returns a triple of the hour, minute and second numbers. - pub(crate) fn hms(&self) -> (u32, u32, u32) { + fn hms(&self) -> (u32, u32, u32) { let sec = self.secs % 60; let mins = self.secs / 60; let min = mins % 60; @@ -934,9 +886,7 @@ /// Makes a new `NaiveTime` with the hour number changed. /// - /// # Errors - /// - /// Returns `None` if the value for `hour` is invalid. + /// Returns `None` when the resulting `NaiveTime` would be invalid. /// /// # Example /// @@ -958,9 +908,7 @@ /// Makes a new `NaiveTime` with the minute number changed. /// - /// # Errors - /// - /// Returns `None` if the value for `minute` is invalid. + /// Returns `None` when the resulting `NaiveTime` would be invalid. /// /// # Example /// @@ -982,13 +930,10 @@ /// Makes a new `NaiveTime` with the second number changed. /// + /// Returns `None` when the resulting `NaiveTime` would be invalid. /// As with the [`second`](#method.second) method, /// the input range is restricted to 0 through 59. /// - /// # Errors - /// - /// Returns `None` if the value for `second` is invalid. - /// /// # Example /// /// ``` @@ -1009,13 +954,10 @@ /// Makes a new `NaiveTime` with nanoseconds since the whole non-leap second changed. /// + /// Returns `None` when the resulting `NaiveTime` would be invalid. /// As with the [`nanosecond`](#method.nanosecond) method, /// the input range can exceed 1,000,000,000 for leap seconds. /// - /// # Errors - /// - /// Returns `None` if `nanosecond >= 2,000,000,000`. - /// /// # Example /// /// ``` @@ -1034,9 +976,9 @@ /// /// ``` /// # use chrono::{NaiveTime, Timelike}; - /// let dt = NaiveTime::from_hms_nano_opt(23, 56, 4, 12_345_678).unwrap(); - /// let strange_leap_second = dt.with_nanosecond(1_333_333_333).unwrap(); - /// assert_eq!(strange_leap_second.nanosecond(), 1_333_333_333); + /// # let dt = NaiveTime::from_hms_nano_opt(23, 56, 4, 12_345_678).unwrap(); + /// assert_eq!(dt.with_nanosecond(1_333_333_333), + /// Some(NaiveTime::from_hms_nano_opt(23, 56, 4, 1_333_333_333).unwrap())); /// ``` #[inline] fn with_nanosecond(&self, nano: u32) -> Option { @@ -1132,26 +1074,6 @@ } } -impl Add for NaiveTime { - type Output = NaiveTime; - - #[inline] - fn add(self, rhs: Duration) -> NaiveTime { - let rhs = OldDuration::from_std(rhs) - .expect("overflow converting from core::time::Duration to chrono::Duration"); - self.overflowing_add_signed(rhs).0 - } -} - -impl AddAssign for NaiveTime { - #[inline] - fn add_assign(&mut self, rhs: Duration) { - let rhs = OldDuration::from_std(rhs) - .expect("overflow converting from core::time::Duration to chrono::Duration"); - *self += rhs; - } -} - /// A subtraction of `Duration` from `NaiveTime` wraps around and never overflows or underflows. /// In particular the addition ignores integral number of days. /// It is the same as the addition with a negated `Duration`. @@ -1214,26 +1136,6 @@ } } -impl Sub for NaiveTime { - type Output = NaiveTime; - - #[inline] - fn sub(self, rhs: Duration) -> NaiveTime { - let rhs = OldDuration::from_std(rhs) - .expect("overflow converting from core::time::Duration to chrono::Duration"); - self.overflowing_sub_signed(rhs).0 - } -} - -impl SubAssign for NaiveTime { - #[inline] - fn sub_assign(&mut self, rhs: Duration) { - let rhs = OldDuration::from_std(rhs) - .expect("overflow converting from core::time::Duration to chrono::Duration"); - *self -= rhs; - } -} - /// Subtracts another `NaiveTime` from the current time. /// Returns a `Duration` within +/- 1 day. /// This does not overflow or underflow at all. @@ -1395,36 +1297,26 @@ /// let t = NaiveTime::from_hms_nano_opt(23, 59, 59, 1_234_567_890).unwrap(); // leap second /// assert_eq!("23:59:60.23456789".parse::(), Ok(t)); /// -/// // Seconds are optional -/// let t = NaiveTime::from_hms_opt(23, 56, 0).unwrap(); -/// assert_eq!("23:56".parse::(), Ok(t)); -/// /// assert!("foo".parse::().is_err()); /// ``` impl str::FromStr for NaiveTime { type Err = ParseError; fn from_str(s: &str) -> ParseResult { - const HOUR_AND_MINUTE: &[Item<'static>] = &[ + const ITEMS: &[Item<'static>] = &[ Item::Numeric(Numeric::Hour, Pad::Zero), Item::Space(""), Item::Literal(":"), Item::Numeric(Numeric::Minute, Pad::Zero), - ]; - const SECOND_AND_NANOS: &[Item<'static>] = &[ Item::Space(""), Item::Literal(":"), Item::Numeric(Numeric::Second, Pad::Zero), Item::Fixed(Fixed::Nanosecond), Item::Space(""), ]; - const TRAILING_WHITESPACE: [Item<'static>; 1] = [Item::Space("")]; let mut parsed = Parsed::new(); - let s = parse_and_remainder(&mut parsed, s, HOUR_AND_MINUTE.iter())?; - // Seconds are optional, don't fail if parsing them doesn't succeed. - let s = parse_and_remainder(&mut parsed, s, SECOND_AND_NANOS.iter()).unwrap_or(s); - parse(&mut parsed, s, TRAILING_WHITESPACE.iter())?; + parse(&mut parsed, s, ITEMS.iter())?; parsed.to_naive_time() } } diff -Nru temporalio-1.3.0/vendor/chrono/src/naive/time/rustc_serialize.rs temporalio-1.3.0/vendor/chrono/src/naive/time/rustc_serialize.rs --- temporalio-1.3.0/vendor/chrono/src/naive/time/rustc_serialize.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/chrono/src/naive/time/rustc_serialize.rs 2023-10-30 19:40:00.000000000 +0000 @@ -16,17 +16,14 @@ } #[cfg(test)] -mod tests { - use crate::naive::time::{test_decodable_json, test_encodable_json}; - use rustc_serialize::json; +use rustc_serialize::json; - #[test] - fn test_encodable() { - test_encodable_json(json::encode); - } +#[test] +fn test_encodable() { + super::test_encodable_json(json::encode); +} - #[test] - fn test_decodable() { - test_decodable_json(json::decode); - } +#[test] +fn test_decodable() { + super::test_decodable_json(json::decode); } diff -Nru temporalio-1.3.0/vendor/chrono/src/naive/time/serde.rs temporalio-1.3.0/vendor/chrono/src/naive/time/serde.rs --- temporalio-1.3.0/vendor/chrono/src/naive/time/serde.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/chrono/src/naive/time/serde.rs 2023-10-30 19:40:00.000000000 +0000 @@ -42,30 +42,24 @@ } } -#[cfg(test)] -mod tests { - use crate::naive::time::{test_decodable_json, test_encodable_json}; - use crate::NaiveTime; - - #[test] - fn test_serde_serialize() { - test_encodable_json(serde_json::to_string); - } +#[test] +fn test_serde_serialize() { + super::test_encodable_json(serde_json::to_string); +} - #[test] - fn test_serde_deserialize() { - test_decodable_json(|input| serde_json::from_str(input)); - } +#[test] +fn test_serde_deserialize() { + super::test_decodable_json(|input| serde_json::from_str(input)); +} - #[test] - fn test_serde_bincode() { - // Bincode is relevant to test separately from JSON because - // it is not self-describing. - use bincode::{deserialize, serialize}; +#[test] +fn test_serde_bincode() { + // Bincode is relevant to test separately from JSON because + // it is not self-describing. + use bincode::{deserialize, serialize}; - let t = NaiveTime::from_hms_nano_opt(3, 5, 7, 98765432).unwrap(); - let encoded = serialize(&t).unwrap(); - let decoded: NaiveTime = deserialize(&encoded).unwrap(); - assert_eq!(t, decoded); - } + let t = NaiveTime::from_hms_nano_opt(3, 5, 7, 98765432).unwrap(); + let encoded = serialize(&t).unwrap(); + let decoded: NaiveTime = deserialize(&encoded).unwrap(); + assert_eq!(t, decoded); } diff -Nru temporalio-1.3.0/vendor/chrono/src/naive/time/tests.rs temporalio-1.3.0/vendor/chrono/src/naive/time/tests.rs --- temporalio-1.3.0/vendor/chrono/src/naive/time/tests.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/chrono/src/naive/time/tests.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,6 +1,7 @@ use super::NaiveTime; -use crate::duration::Duration as OldDuration; +use crate::oldtime::Duration; use crate::Timelike; +use std::u32; #[test] fn test_time_from_hms_milli() { @@ -13,12 +14,12 @@ Some(NaiveTime::from_hms_nano_opt(3, 5, 7, 777_000_000).unwrap()) ); assert_eq!( - NaiveTime::from_hms_milli_opt(3, 5, 59, 1_999), - Some(NaiveTime::from_hms_nano_opt(3, 5, 59, 1_999_000_000).unwrap()) + NaiveTime::from_hms_milli_opt(3, 5, 7, 1_999), + Some(NaiveTime::from_hms_nano_opt(3, 5, 7, 1_999_000_000).unwrap()) ); - assert_eq!(NaiveTime::from_hms_milli_opt(3, 5, 59, 2_000), None); - assert_eq!(NaiveTime::from_hms_milli_opt(3, 5, 59, 5_000), None); // overflow check - assert_eq!(NaiveTime::from_hms_milli_opt(3, 5, 59, u32::MAX), None); + assert_eq!(NaiveTime::from_hms_milli_opt(3, 5, 7, 2_000), None); + assert_eq!(NaiveTime::from_hms_milli_opt(3, 5, 7, 5_000), None); // overflow check + assert_eq!(NaiveTime::from_hms_milli_opt(3, 5, 7, u32::MAX), None); } #[test] @@ -36,12 +37,12 @@ Some(NaiveTime::from_hms_nano_opt(3, 5, 7, 777_777_000).unwrap()) ); assert_eq!( - NaiveTime::from_hms_micro_opt(3, 5, 59, 1_999_999), - Some(NaiveTime::from_hms_nano_opt(3, 5, 59, 1_999_999_000).unwrap()) + NaiveTime::from_hms_micro_opt(3, 5, 7, 1_999_999), + Some(NaiveTime::from_hms_nano_opt(3, 5, 7, 1_999_999_000).unwrap()) ); - assert_eq!(NaiveTime::from_hms_micro_opt(3, 5, 59, 2_000_000), None); - assert_eq!(NaiveTime::from_hms_micro_opt(3, 5, 59, 5_000_000), None); // overflow check - assert_eq!(NaiveTime::from_hms_micro_opt(3, 5, 59, u32::MAX), None); + assert_eq!(NaiveTime::from_hms_micro_opt(3, 5, 7, 2_000_000), None); + assert_eq!(NaiveTime::from_hms_micro_opt(3, 5, 7, 5_000_000), None); // overflow check + assert_eq!(NaiveTime::from_hms_micro_opt(3, 5, 7, u32::MAX), None); } #[test] @@ -94,23 +95,23 @@ let hmsm = |h, m, s, ms| NaiveTime::from_hms_milli_opt(h, m, s, ms).unwrap(); - check!(hmsm(3, 5, 59, 900), OldDuration::zero(), hmsm(3, 5, 59, 900)); - check!(hmsm(3, 5, 59, 900), OldDuration::milliseconds(100), hmsm(3, 6, 0, 0)); - check!(hmsm(3, 5, 59, 1_300), OldDuration::milliseconds(-1800), hmsm(3, 5, 58, 500)); - check!(hmsm(3, 5, 59, 1_300), OldDuration::milliseconds(-800), hmsm(3, 5, 59, 500)); - check!(hmsm(3, 5, 59, 1_300), OldDuration::milliseconds(-100), hmsm(3, 5, 59, 1_200)); - check!(hmsm(3, 5, 59, 1_300), OldDuration::milliseconds(100), hmsm(3, 5, 59, 1_400)); - check!(hmsm(3, 5, 59, 1_300), OldDuration::milliseconds(800), hmsm(3, 6, 0, 100)); - check!(hmsm(3, 5, 59, 1_300), OldDuration::milliseconds(1800), hmsm(3, 6, 1, 100)); - check!(hmsm(3, 5, 59, 900), OldDuration::seconds(86399), hmsm(3, 5, 58, 900)); // overwrap - check!(hmsm(3, 5, 59, 900), OldDuration::seconds(-86399), hmsm(3, 6, 0, 900)); - check!(hmsm(3, 5, 59, 900), OldDuration::days(12345), hmsm(3, 5, 59, 900)); - check!(hmsm(3, 5, 59, 1_300), OldDuration::days(1), hmsm(3, 5, 59, 300)); - check!(hmsm(3, 5, 59, 1_300), OldDuration::days(-1), hmsm(3, 6, 0, 300)); + check!(hmsm(3, 5, 7, 900), Duration::zero(), hmsm(3, 5, 7, 900)); + check!(hmsm(3, 5, 7, 900), Duration::milliseconds(100), hmsm(3, 5, 8, 0)); + check!(hmsm(3, 5, 7, 1_300), Duration::milliseconds(-1800), hmsm(3, 5, 6, 500)); + check!(hmsm(3, 5, 7, 1_300), Duration::milliseconds(-800), hmsm(3, 5, 7, 500)); + check!(hmsm(3, 5, 7, 1_300), Duration::milliseconds(-100), hmsm(3, 5, 7, 1_200)); + check!(hmsm(3, 5, 7, 1_300), Duration::milliseconds(100), hmsm(3, 5, 7, 1_400)); + check!(hmsm(3, 5, 7, 1_300), Duration::milliseconds(800), hmsm(3, 5, 8, 100)); + check!(hmsm(3, 5, 7, 1_300), Duration::milliseconds(1800), hmsm(3, 5, 9, 100)); + check!(hmsm(3, 5, 7, 900), Duration::seconds(86399), hmsm(3, 5, 6, 900)); // overwrap + check!(hmsm(3, 5, 7, 900), Duration::seconds(-86399), hmsm(3, 5, 8, 900)); + check!(hmsm(3, 5, 7, 900), Duration::days(12345), hmsm(3, 5, 7, 900)); + check!(hmsm(3, 5, 7, 1_300), Duration::days(1), hmsm(3, 5, 7, 300)); + check!(hmsm(3, 5, 7, 1_300), Duration::days(-1), hmsm(3, 5, 8, 300)); // regression tests for #37 - check!(hmsm(0, 0, 0, 0), OldDuration::milliseconds(-990), hmsm(23, 59, 59, 10)); - check!(hmsm(0, 0, 0, 0), OldDuration::milliseconds(-9990), hmsm(23, 59, 50, 10)); + check!(hmsm(0, 0, 0, 0), Duration::milliseconds(-990), hmsm(23, 59, 59, 10)); + check!(hmsm(0, 0, 0, 0), Duration::milliseconds(-9990), hmsm(23, 59, 50, 10)); } #[test] @@ -118,26 +119,26 @@ let hmsm = |h, m, s, ms| NaiveTime::from_hms_milli_opt(h, m, s, ms).unwrap(); assert_eq!( - hmsm(3, 4, 5, 678).overflowing_add_signed(OldDuration::hours(11)), + hmsm(3, 4, 5, 678).overflowing_add_signed(Duration::hours(11)), (hmsm(14, 4, 5, 678), 0) ); assert_eq!( - hmsm(3, 4, 5, 678).overflowing_add_signed(OldDuration::hours(23)), + hmsm(3, 4, 5, 678).overflowing_add_signed(Duration::hours(23)), (hmsm(2, 4, 5, 678), 86_400) ); assert_eq!( - hmsm(3, 4, 5, 678).overflowing_add_signed(OldDuration::hours(-7)), + hmsm(3, 4, 5, 678).overflowing_add_signed(Duration::hours(-7)), (hmsm(20, 4, 5, 678), -86_400) ); // overflowing_add_signed with leap seconds may be counter-intuitive assert_eq!( - hmsm(3, 4, 59, 1_678).overflowing_add_signed(OldDuration::days(1)), - (hmsm(3, 4, 59, 678), 86_400) + hmsm(3, 4, 5, 1_678).overflowing_add_signed(Duration::days(1)), + (hmsm(3, 4, 5, 678), 86_400) ); assert_eq!( - hmsm(3, 4, 59, 1_678).overflowing_add_signed(OldDuration::days(-1)), - (hmsm(3, 5, 0, 678), -86_400) + hmsm(3, 4, 5, 1_678).overflowing_add_signed(Duration::days(-1)), + (hmsm(3, 4, 6, 678), -86_400) ); } @@ -145,9 +146,9 @@ fn test_time_addassignment() { let hms = |h, m, s| NaiveTime::from_hms_opt(h, m, s).unwrap(); let mut time = hms(12, 12, 12); - time += OldDuration::hours(10); + time += Duration::hours(10); assert_eq!(time, hms(22, 12, 12)); - time += OldDuration::hours(10); + time += Duration::hours(10); assert_eq!(time, hms(8, 12, 12)); } @@ -155,9 +156,9 @@ fn test_time_subassignment() { let hms = |h, m, s| NaiveTime::from_hms_opt(h, m, s).unwrap(); let mut time = hms(12, 12, 12); - time -= OldDuration::hours(10); + time -= Duration::hours(10); assert_eq!(time, hms(2, 12, 12)); - time -= OldDuration::hours(10); + time -= Duration::hours(10); assert_eq!(time, hms(16, 12, 12)); } @@ -173,40 +174,25 @@ let hmsm = |h, m, s, ms| NaiveTime::from_hms_milli_opt(h, m, s, ms).unwrap(); - check!(hmsm(3, 5, 7, 900), hmsm(3, 5, 7, 900), OldDuration::zero()); - check!(hmsm(3, 5, 7, 900), hmsm(3, 5, 7, 600), OldDuration::milliseconds(300)); - check!(hmsm(3, 5, 7, 200), hmsm(2, 4, 6, 200), OldDuration::seconds(3600 + 60 + 1)); + check!(hmsm(3, 5, 7, 900), hmsm(3, 5, 7, 900), Duration::zero()); + check!(hmsm(3, 5, 7, 900), hmsm(3, 5, 7, 600), Duration::milliseconds(300)); + check!(hmsm(3, 5, 7, 200), hmsm(2, 4, 6, 200), Duration::seconds(3600 + 60 + 1)); check!( hmsm(3, 5, 7, 200), hmsm(2, 4, 6, 300), - OldDuration::seconds(3600 + 60) + OldDuration::milliseconds(900) + Duration::seconds(3600 + 60) + Duration::milliseconds(900) ); // treats the leap second as if it coincides with the prior non-leap second, // as required by `time1 - time2 = duration` and `time2 - time1 = -duration` equivalence. - check!(hmsm(3, 6, 0, 200), hmsm(3, 5, 59, 1_800), OldDuration::milliseconds(400)); - //check!(hmsm(3, 5, 7, 1_200), hmsm(3, 5, 6, 1_800), OldDuration::milliseconds(1400)); - //check!(hmsm(3, 5, 7, 1_200), hmsm(3, 5, 6, 800), OldDuration::milliseconds(1400)); + check!(hmsm(3, 5, 7, 200), hmsm(3, 5, 6, 1_800), Duration::milliseconds(400)); + check!(hmsm(3, 5, 7, 1_200), hmsm(3, 5, 6, 1_800), Duration::milliseconds(1400)); + check!(hmsm(3, 5, 7, 1_200), hmsm(3, 5, 6, 800), Duration::milliseconds(1400)); // additional equality: `time1 + duration = time2` is equivalent to // `time2 - time1 = duration` IF AND ONLY IF `time2` represents a non-leap second. - assert_eq!(hmsm(3, 5, 6, 800) + OldDuration::milliseconds(400), hmsm(3, 5, 7, 200)); - //assert_eq!(hmsm(3, 5, 6, 1_800) + OldDuration::milliseconds(400), hmsm(3, 5, 7, 200)); -} - -#[test] -fn test_core_duration_ops() { - use core::time::Duration; - - let mut t = NaiveTime::from_hms_opt(11, 34, 23).unwrap(); - let same = t + Duration::ZERO; - assert_eq!(t, same); - - t += Duration::new(3600, 0); - assert_eq!(t, NaiveTime::from_hms_opt(12, 34, 23).unwrap()); - - t -= Duration::new(7200, 0); - assert_eq!(t, NaiveTime::from_hms_opt(10, 34, 23).unwrap()); + assert_eq!(hmsm(3, 5, 6, 800) + Duration::milliseconds(400), hmsm(3, 5, 7, 200)); + assert_eq!(hmsm(3, 5, 6, 1_800) + Duration::milliseconds(400), hmsm(3, 5, 7, 200)); } #[test] @@ -240,7 +226,7 @@ } #[test] -fn test_time_from_str() { +fn test_date_from_str() { // valid cases let valid = [ "0:0:0", @@ -248,39 +234,10 @@ "0:0:0.0000003", " 4 : 3 : 2.1 ", " 09:08:07 ", - " 09:08 ", " 9:8:07 ", - "01:02:03", - "4:3:2.1", - "9:8:7", - "09:8:7", - "9:08:7", - "9:8:07", - "09:08:7", - "09:8:07", - "09:08:7", - "9:08:07", - "09:08:07", - "9:8:07.123", - "9:08:7.123", - "09:8:7.123", - "09:08:7.123", - "9:08:07.123", - "09:8:07.123", - "09:08:07.123", - "09:08:07.123", - "09:08:07.1234", - "09:08:07.12345", - "09:08:07.123456", - "09:08:07.1234567", - "09:08:07.12345678", - "09:08:07.123456789", - "09:08:07.1234567891", - "09:08:07.12345678912", "23:59:60.373929310237", ]; for &s in &valid { - eprintln!("test_time_parse_from_str valid {:?}", s); let d = match s.parse::() { Ok(d) => d, Err(e) => panic!("parsing `{}` has failed: {}", s, e), @@ -305,30 +262,15 @@ // some invalid cases // since `ParseErrorKind` is private, all we can do is to check if there was an error - let invalid = [ - "", // empty - "x", // invalid - "15", // missing data - "15:8:", // trailing colon - "15:8:x", // invalid data - "15:8:9x", // invalid data - "23:59:61", // invalid second (out of bounds) - "23:54:35 GMT", // invalid (timezone non-sensical for NaiveTime) - "23:54:35 +0000", // invalid (timezone non-sensical for NaiveTime) - "1441497364.649", // valid datetime, not a NaiveTime - "+1441497364.649", // valid datetime, not a NaiveTime - "+1441497364", // valid datetime, not a NaiveTime - "001:02:03", // invalid hour - "01:002:03", // invalid minute - "01:02:003", // invalid second - "12:34:56.x", // invalid fraction - "12:34:56. 0", // invalid fraction format - "09:08:00000000007", // invalid second / invalid fraction format - ]; - for &s in &invalid { - eprintln!("test_time_parse_from_str invalid {:?}", s); - assert!(s.parse::().is_err()); - } + assert!("".parse::().is_err()); + assert!("x".parse::().is_err()); + assert!("15".parse::().is_err()); + assert!("15:8".parse::().is_err()); + assert!("15:8:x".parse::().is_err()); + assert!("15:8:9x".parse::().is_err()); + assert!("23:59:61".parse::().is_err()); + assert!("12:34:56.x".parse::().is_err()); + assert!("12:34:56. 0".parse::().is_err()); } #[test] @@ -339,14 +281,37 @@ Ok(hms(12, 34, 56)) ); // ignore date and offset assert_eq!(NaiveTime::parse_from_str("PM 12:59", "%P %H:%M"), Ok(hms(12, 59, 0))); - assert_eq!(NaiveTime::parse_from_str("12:59 \n\t PM", "%H:%M \n\t %P"), Ok(hms(12, 59, 0))); - assert_eq!(NaiveTime::parse_from_str("\t\t12:59\tPM\t", "\t\t%H:%M\t%P\t"), Ok(hms(12, 59, 0))); + assert!(NaiveTime::parse_from_str("12:3456", "%H:%M:%S").is_err()); +} + +#[test] +fn test_time_format() { + let t = NaiveTime::from_hms_nano_opt(3, 5, 7, 98765432).unwrap(); + assert_eq!(t.format("%H,%k,%I,%l,%P,%p").to_string(), "03, 3,03, 3,am,AM"); + assert_eq!(t.format("%M").to_string(), "05"); + assert_eq!(t.format("%S,%f,%.f").to_string(), "07,098765432,.098765432"); + assert_eq!(t.format("%.3f,%.6f,%.9f").to_string(), ".098,.098765,.098765432"); + assert_eq!(t.format("%R").to_string(), "03:05"); + assert_eq!(t.format("%T,%X").to_string(), "03:05:07,03:05:07"); + assert_eq!(t.format("%r").to_string(), "03:05:07 AM"); + assert_eq!(t.format("%t%n%%%n%t").to_string(), "\t\n%\n\t"); + + let t = NaiveTime::from_hms_micro_opt(3, 5, 7, 432100).unwrap(); + assert_eq!(t.format("%S,%f,%.f").to_string(), "07,432100000,.432100"); + assert_eq!(t.format("%.3f,%.6f,%.9f").to_string(), ".432,.432100,.432100000"); + + let t = NaiveTime::from_hms_milli_opt(3, 5, 7, 210).unwrap(); + assert_eq!(t.format("%S,%f,%.f").to_string(), "07,210000000,.210"); + assert_eq!(t.format("%.3f,%.6f,%.9f").to_string(), ".210,.210000,.210000000"); + + let t = NaiveTime::from_hms_opt(3, 5, 7).unwrap(); + assert_eq!(t.format("%S,%f,%.f").to_string(), "07,000000000,"); + assert_eq!(t.format("%.3f,%.6f,%.9f").to_string(), ".000,.000000,.000000000"); + + // corner cases + assert_eq!(NaiveTime::from_hms_opt(13, 57, 9).unwrap().format("%r").to_string(), "01:57:09 PM"); assert_eq!( - NaiveTime::parse_from_str("\t\t1259\t\tPM\t", "\t\t%H%M\t\t%P\t"), - Ok(hms(12, 59, 0)) + NaiveTime::from_hms_milli_opt(23, 59, 59, 1_000).unwrap().format("%X").to_string(), + "23:59:60" ); - assert!(NaiveTime::parse_from_str("12:59 PM", "%H:%M\t%P").is_ok()); - assert!(NaiveTime::parse_from_str("\t\t12:59 PM\t", "\t\t%H:%M\t%P\t").is_ok()); - assert!(NaiveTime::parse_from_str("12:59 PM", "%H:%M %P").is_ok()); - assert!(NaiveTime::parse_from_str("12:3456", "%H:%M:%S").is_err()); } diff -Nru temporalio-1.3.0/vendor/chrono/src/offset/fixed.rs temporalio-1.3.0/vendor/chrono/src/offset/fixed.rs --- temporalio-1.3.0/vendor/chrono/src/offset/fixed.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/chrono/src/offset/fixed.rs 2023-10-30 19:40:00.000000000 +0000 @@ -5,16 +5,15 @@ use core::fmt; use core::ops::{Add, Sub}; -use core::str::FromStr; #[cfg(feature = "rkyv")] use rkyv::{Archive, Deserialize, Serialize}; use super::{LocalResult, Offset, TimeZone}; -use crate::duration::Duration as OldDuration; -use crate::format::{scan, OUT_OF_RANGE}; use crate::naive::{NaiveDate, NaiveDateTime, NaiveTime}; -use crate::{DateTime, ParseError, Timelike}; +use crate::oldtime::Duration as OldDuration; +use crate::DateTime; +use crate::Timelike; /// The time zone with fixed offset, from UTC-23:59:59 to UTC+23:59:59. /// @@ -114,15 +113,6 @@ } } -/// Parsing a `str` into a `FixedOffset` uses the format [`%z`](crate::format::strftime). -impl FromStr for FixedOffset { - type Err = ParseError; - fn from_str(s: &str) -> Result { - let (_, offset) = scan::timezone_offset(s, scan::colon_or_space, false, false, true)?; - Self::east_opt(offset).ok_or(OUT_OF_RANGE) - } -} - impl TimeZone for FixedOffset { type Offset = FixedOffset; @@ -256,41 +246,50 @@ mod tests { use super::FixedOffset; use crate::offset::TimeZone; - use std::str::FromStr; #[test] fn test_date_extreme_offset() { // starting from 0.3 we don't have an offset exceeding one day. // this makes everything easier! - let offset = FixedOffset::east_opt(86399).unwrap(); assert_eq!( - format!("{:?}", offset.with_ymd_and_hms(2012, 2, 29, 5, 6, 7).unwrap()), - "2012-02-29T05:06:07+23:59:59" + format!( + "{:?}", + FixedOffset::east_opt(86399) + .unwrap() + .with_ymd_and_hms(2012, 2, 29, 5, 6, 7) + .unwrap() + ), + "2012-02-29T05:06:07+23:59:59".to_string() ); - let offset = FixedOffset::east_opt(-86399).unwrap(); assert_eq!( - format!("{:?}", offset.with_ymd_and_hms(2012, 2, 29, 5, 6, 7).unwrap()), - "2012-02-29T05:06:07-23:59:59" + format!( + "{:?}", + FixedOffset::east_opt(86399) + .unwrap() + .with_ymd_and_hms(2012, 2, 29, 5, 6, 7) + .unwrap() + ), + "2012-02-29T05:06:07+23:59:59".to_string() ); - let offset = FixedOffset::west_opt(86399).unwrap(); assert_eq!( - format!("{:?}", offset.with_ymd_and_hms(2012, 3, 4, 5, 6, 7).unwrap()), - "2012-03-04T05:06:07-23:59:59" + format!( + "{:?}", + FixedOffset::west_opt(86399) + .unwrap() + .with_ymd_and_hms(2012, 3, 4, 5, 6, 7) + .unwrap() + ), + "2012-03-04T05:06:07-23:59:59".to_string() ); - let offset = FixedOffset::west_opt(-86399).unwrap(); assert_eq!( - format!("{:?}", offset.with_ymd_and_hms(2012, 3, 4, 5, 6, 7).unwrap()), - "2012-03-04T05:06:07+23:59:59" + format!( + "{:?}", + FixedOffset::west_opt(86399) + .unwrap() + .with_ymd_and_hms(2012, 3, 4, 5, 6, 7) + .unwrap() + ), + "2012-03-04T05:06:07-23:59:59".to_string() ); } - - #[test] - fn test_parse_offset() { - let offset = FixedOffset::from_str("-0500").unwrap(); - assert_eq!(offset.local_minus_utc, -5 * 3600); - let offset = FixedOffset::from_str("-08:00").unwrap(); - assert_eq!(offset.local_minus_utc, -8 * 3600); - let offset = FixedOffset::from_str("+06:30").unwrap(); - assert_eq!(offset.local_minus_utc, (6 * 3600) + 1800); - } } diff -Nru temporalio-1.3.0/vendor/chrono/src/offset/local/mod.rs temporalio-1.3.0/vendor/chrono/src/offset/local/mod.rs --- temporalio-1.3.0/vendor/chrono/src/offset/local/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/chrono/src/offset/local/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -21,10 +21,6 @@ #[path = "windows.rs"] mod inner; -#[cfg(all(windows, feature = "clock"))] -#[allow(unreachable_pub)] -mod win_bindings; - #[cfg(all( not(unix), not(windows), @@ -54,34 +50,15 @@ not(any(target_os = "emscripten", target_os = "wasi")) ))] mod inner { - use crate::{Datelike, FixedOffset, LocalResult, NaiveDateTime, Timelike}; + use crate::{FixedOffset, LocalResult, NaiveDateTime}; - pub(super) fn offset_from_utc_datetime(utc: &NaiveDateTime) -> LocalResult { - let offset = js_sys::Date::from(utc.and_utc()).get_timezone_offset(); + pub(super) fn offset_from_utc_datetime(_utc: &NaiveDateTime) -> LocalResult { + let offset = js_sys::Date::new_0().get_timezone_offset(); LocalResult::Single(FixedOffset::west_opt((offset as i32) * 60).unwrap()) } pub(super) fn offset_from_local_datetime(local: &NaiveDateTime) -> LocalResult { - let mut year = local.year(); - if year < 100 { - // The API in `js_sys` does not let us create a `Date` with negative years. - // And values for years from `0` to `99` map to the years `1900` to `1999`. - // Shift the value by a multiple of 400 years until it is `>= 100`. - let shift_cycles = (year - 100).div_euclid(400); - year -= shift_cycles * 400; - } - let js_date = js_sys::Date::new_with_year_month_day_hr_min_sec( - year as u32, - local.month0() as i32, - local.day() as i32, - local.hour() as i32, - local.minute() as i32, - local.second() as i32, - // ignore milliseconds, our representation of leap seconds may be problematic - ); - let offset = js_date.get_timezone_offset(); - // We always get a result, even if this time does not exist or is ambiguous. - LocalResult::Single(FixedOffset::west_opt((offset as i32) * 60).unwrap()) + offset_from_utc_datetime(local) } } @@ -117,36 +94,34 @@ Local::now().date() } - /// Returns a `DateTime` which corresponds to the current date, time and offset from - /// UTC. - /// - /// See also the similar [`Utc::now()`] which returns `DateTime`, i.e. without the local - /// offset. - /// - /// # Example - /// - /// ``` - /// # #![allow(unused_variables)] - /// # use chrono::{DateTime, FixedOffset, Local}; - /// // Current local time - /// let now = Local::now(); - /// - /// // Current local date - /// let today = now.date_naive(); - /// - /// // Current local time, converted to `DateTime` - /// let now_fixed_offset = Local::now().fixed_offset(); - /// // or - /// let now_fixed_offset: DateTime = Local::now().into(); - /// - /// // Current time in some timezone (let's use +05:00) - /// // Note that it is usually more efficient to use `Utc::now` for this use case. - /// let offset = FixedOffset::east_opt(5 * 60 * 60).unwrap(); - /// let now_with_offset = Local::now().with_timezone(&offset); - /// ``` + /// Returns a `DateTime` which corresponds to the current date and time. + #[cfg(not(all( + target_arch = "wasm32", + feature = "wasmbind", + not(any(target_os = "emscripten", target_os = "wasi")) + )))] + #[must_use] pub fn now() -> DateTime { Utc::now().with_timezone(&Local) } + + /// Returns a `DateTime` which corresponds to the current date and time. + #[cfg(all( + target_arch = "wasm32", + feature = "wasmbind", + not(any(target_os = "emscripten", target_os = "wasi")) + ))] + #[must_use] + pub fn now() -> DateTime { + use super::Utc; + let now: DateTime = super::Utc::now(); + + // Workaround missing timezone logic in `time` crate + let offset = + FixedOffset::west_opt((js_sys::Date::new_0().get_timezone_offset() as i32) * 60) + .unwrap(); + DateTime::from_utc(now.naive_utc(), offset) + } } impl TimeZone for Local { @@ -257,4 +232,12 @@ ); } } + + /// Test Issue #866 + #[test] + fn test_issue_866() { + #[allow(deprecated)] + let local_20221106 = Local.ymd(2022, 11, 6); + let _dt_20221106 = local_20221106.and_hms_milli_opt(1, 2, 59, 1000).unwrap(); + } } diff -Nru temporalio-1.3.0/vendor/chrono/src/offset/local/tz_info/timezone.rs temporalio-1.3.0/vendor/chrono/src/offset/local/tz_info/timezone.rs --- temporalio-1.3.0/vendor/chrono/src/offset/local/tz_info/timezone.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/chrono/src/offset/local/tz_info/timezone.rs 2023-10-30 19:40:00.000000000 +0000 @@ -177,16 +177,9 @@ match self.extra_rule { Some(extra_rule) => extra_rule, None => { - // RFC 8536 3.2: - // "Local time for timestamps on or after the last transition is - // specified by the TZ string in the footer (Section 3.3) if present - // and nonempty; otherwise, it is unspecified." - // - // Older versions of macOS (1.12 and before?) have TZif file with a - // missing TZ string, and use the offset given by the last transition. - return Ok( - &self.local_time_types[last_transition.local_time_type_index] - ); + return Err(Error::FindLocalTimeType( + "no local time type is available for the specified timestamp", + )) } } } else { @@ -231,8 +224,8 @@ // if we have at least one transition, // we must check _all_ of them, incase of any Overlapping (LocalResult::Ambiguous) or Skipping (LocalResult::None) transitions - let offset_after_last = if !self.transitions.is_empty() { - let mut prev = self.local_time_types[0]; + if !self.transitions.is_empty() { + let mut prev = Some(self.local_time_types[0]); for transition in self.transitions { let after_ltt = self.local_time_types[transition.local_time_type_index]; @@ -240,33 +233,34 @@ // the end and start here refers to where the time starts prior to the transition // and where it ends up after. not the temporal relationship. let transition_end = transition.unix_leap_time + i64::from(after_ltt.ut_offset); - let transition_start = transition.unix_leap_time + i64::from(prev.ut_offset); + let transition_start = + transition.unix_leap_time + i64::from(prev.unwrap().ut_offset); match transition_start.cmp(&transition_end) { Ordering::Greater => { // bakwards transition, eg from DST to regular // this means a given local time could have one of two possible offsets if local_leap_time < transition_end { - return Ok(crate::LocalResult::Single(prev)); + return Ok(crate::LocalResult::Single(prev.unwrap())); } else if local_leap_time >= transition_end && local_leap_time <= transition_start { - if prev.ut_offset < after_ltt.ut_offset { - return Ok(crate::LocalResult::Ambiguous(prev, after_ltt)); + if prev.unwrap().ut_offset < after_ltt.ut_offset { + return Ok(crate::LocalResult::Ambiguous(prev.unwrap(), after_ltt)); } else { - return Ok(crate::LocalResult::Ambiguous(after_ltt, prev)); + return Ok(crate::LocalResult::Ambiguous(after_ltt, prev.unwrap())); } } } Ordering::Equal => { // should this ever happen? presumably we have to handle it anyway. if local_leap_time < transition_start { - return Ok(crate::LocalResult::Single(prev)); + return Ok(crate::LocalResult::Single(prev.unwrap())); } else if local_leap_time == transition_end { - if prev.ut_offset < after_ltt.ut_offset { - return Ok(crate::LocalResult::Ambiguous(prev, after_ltt)); + if prev.unwrap().ut_offset < after_ltt.ut_offset { + return Ok(crate::LocalResult::Ambiguous(prev.unwrap(), after_ltt)); } else { - return Ok(crate::LocalResult::Ambiguous(after_ltt, prev)); + return Ok(crate::LocalResult::Ambiguous(after_ltt, prev.unwrap())); } } } @@ -274,7 +268,7 @@ // forwards transition, eg from regular to DST // this means that times that are skipped are invalid local times if local_leap_time <= transition_start { - return Ok(crate::LocalResult::Single(prev)); + return Ok(crate::LocalResult::Single(prev.unwrap())); } else if local_leap_time < transition_end { return Ok(crate::LocalResult::None); } else if local_leap_time == transition_end { @@ -284,12 +278,8 @@ } // try the next transition, we are fully after this one - prev = after_ltt; + prev = Some(after_ltt); } - - prev - } else { - self.local_time_types[0] }; if let Some(extra_rule) = self.extra_rule { @@ -299,7 +289,7 @@ err => err, } } else { - Ok(crate::LocalResult::Single(offset_after_last)) + Ok(crate::LocalResult::Single(self.local_time_types[0])) } } @@ -331,7 +321,7 @@ // Check leap seconds if !(self.leap_seconds.is_empty() || self.leap_seconds[0].unix_leap_time >= 0 - && self.leap_seconds[0].correction.saturating_abs() == 1) + && saturating_abs(self.leap_seconds[0].correction) == 1) { return Err(Error::TimeZone("invalid leap second")); } @@ -346,7 +336,7 @@ let diff_unix_leap_time = x1.unix_leap_time.saturating_sub(x0.unix_leap_time); let abs_diff_correction = - x1.correction.saturating_sub(x0.correction).saturating_abs(); + saturating_abs(x1.correction.saturating_sub(x0.correction)); if !(diff_unix_leap_time >= min_interval && abs_diff_correction == 1) { return Err(Error::TimeZone("invalid leap second")); @@ -496,11 +486,6 @@ impl TimeZoneName { /// Construct a time zone name - /// - /// man tzfile(5): - /// Time zone designations should consist of at least three (3) and no more than six (6) ASCII - /// characters from the set of alphanumerics, “-â€, and “+â€. This is for compatibility with - /// POSIX requirements for time zone abbreviations. fn new(input: &[u8]) -> Result { let len = input.len(); @@ -630,6 +615,17 @@ } } +#[inline] +const fn saturating_abs(v: i32) -> i32 { + if v.is_positive() { + v + } else if v == i32::min_value() { + i32::max_value() + } else { + -v + } +} + // Possible system timezone directories #[cfg(unix)] const ZONE_INFO_DIRECTORIES: [&str; 4] = @@ -756,51 +752,20 @@ } #[test] - fn test_no_tz_string() -> Result<(), Error> { - // Guayaquil from macOS 10.11 - let bytes = b"TZif\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x02\0\0\0\x02\0\0\0\0\0\0\0\x01\0\0\0\x02\0\0\0\x08\xb6\xa4B\x18\x01\xff\xff\xb6h\0\0\xff\xff\xb9\xb0\0\x04QMT\0ECT\0\0\0\0\0"; - - let time_zone = TimeZone::from_tz_data(bytes)?; - dbg!(&time_zone); - - let time_zone_result = TimeZone::new( - vec![Transition::new(-1230749160, 1)], - vec![ - LocalTimeType::new(-18840, false, Some(b"QMT"))?, - LocalTimeType::new(-18000, false, Some(b"ECT"))?, - ], - Vec::new(), - None, - )?; - - assert_eq!(time_zone, time_zone_result); - - assert_eq!( - *time_zone.find_local_time_type(-1500000000)?, - LocalTimeType::new(-18840, false, Some(b"QMT"))? - ); - assert_eq!( - *time_zone.find_local_time_type(0)?, - LocalTimeType::new(-18000, false, Some(b"ECT"))? - ); - - Ok(()) - } - - #[test] fn test_tz_ascii_str() -> Result<(), Error> { assert!(matches!(TimeZoneName::new(b""), Err(Error::LocalTimeType(_)))); - assert!(matches!(TimeZoneName::new(b"A"), Err(Error::LocalTimeType(_)))); - assert!(matches!(TimeZoneName::new(b"AB"), Err(Error::LocalTimeType(_)))); - assert_eq!(TimeZoneName::new(b"CET")?.as_bytes(), b"CET"); - assert_eq!(TimeZoneName::new(b"CHADT")?.as_bytes(), b"CHADT"); - assert_eq!(TimeZoneName::new(b"abcdefg")?.as_bytes(), b"abcdefg"); - assert_eq!(TimeZoneName::new(b"UTC+02")?.as_bytes(), b"UTC+02"); - assert_eq!(TimeZoneName::new(b"-1230")?.as_bytes(), b"-1230"); - assert!(matches!(TimeZoneName::new("−0330".as_bytes()), Err(Error::LocalTimeType(_)))); // MINUS SIGN (U+2212) - assert!(matches!(TimeZoneName::new(b"\x00123"), Err(Error::LocalTimeType(_)))); + assert!(matches!(TimeZoneName::new(b"1"), Err(Error::LocalTimeType(_)))); + assert!(matches!(TimeZoneName::new(b"12"), Err(Error::LocalTimeType(_)))); + assert_eq!(TimeZoneName::new(b"123")?.as_bytes(), b"123"); + assert_eq!(TimeZoneName::new(b"1234")?.as_bytes(), b"1234"); + assert_eq!(TimeZoneName::new(b"12345")?.as_bytes(), b"12345"); + assert_eq!(TimeZoneName::new(b"123456")?.as_bytes(), b"123456"); + assert_eq!(TimeZoneName::new(b"1234567")?.as_bytes(), b"1234567"); assert!(matches!(TimeZoneName::new(b"12345678"), Err(Error::LocalTimeType(_)))); - assert!(matches!(TimeZoneName::new(b"GMT\0\0\0"), Err(Error::LocalTimeType(_)))); + assert!(matches!(TimeZoneName::new(b"123456789"), Err(Error::LocalTimeType(_)))); + assert!(matches!(TimeZoneName::new(b"1234567890"), Err(Error::LocalTimeType(_)))); + + assert!(matches!(TimeZoneName::new(b"123\0\0\0"), Err(Error::LocalTimeType(_)))); Ok(()) } @@ -829,7 +794,7 @@ assert_eq!(*time_zone_2.find_local_time_type(0)?, cet); assert_eq!(*time_zone_3.find_local_time_type(-1)?, utc); - assert_eq!(*time_zone_3.find_local_time_type(0)?, utc); + assert!(matches!(time_zone_3.find_local_time_type(0), Err(Error::FindLocalTimeType(_)))); assert_eq!(*time_zone_4.find_local_time_type(-1)?, utc); assert_eq!(*time_zone_4.find_local_time_type(0)?, cet); @@ -859,12 +824,8 @@ assert_eq!(time_zone_local, time_zone_local_1); } - // `TimeZone::from_posix_tz("UTC")` will return `Error` if the environment does not have - // a time zone database, like for example some docker containers. - // In that case skip the test. - if let Ok(time_zone_utc) = TimeZone::from_posix_tz("UTC") { - assert_eq!(time_zone_utc.find_local_time_type(0)?.offset(), 0); - } + let time_zone_utc = TimeZone::from_posix_tz("UTC")?; + assert_eq!(time_zone_utc.find_local_time_type(0)?.offset(), 0); } assert!(TimeZone::from_posix_tz("EST5EDT,0/0,J365/25").is_err()); diff -Nru temporalio-1.3.0/vendor/chrono/src/offset/local/win_bindings.rs temporalio-1.3.0/vendor/chrono/src/offset/local/win_bindings.rs --- temporalio-1.3.0/vendor/chrono/src/offset/local/win_bindings.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/chrono/src/offset/local/win_bindings.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,51 +0,0 @@ -// Bindings generated by `windows-bindgen` 0.51.1 - -#![allow(non_snake_case, non_upper_case_globals, non_camel_case_types, dead_code, clippy::all)] -::windows_targets::link!("kernel32.dll" "system" fn SystemTimeToFileTime(lpsystemtime : *const SYSTEMTIME, lpfiletime : *mut FILETIME) -> BOOL); -::windows_targets::link!("kernel32.dll" "system" fn SystemTimeToTzSpecificLocalTime(lptimezoneinformation : *const TIME_ZONE_INFORMATION, lpuniversaltime : *const SYSTEMTIME, lplocaltime : *mut SYSTEMTIME) -> BOOL); -::windows_targets::link!("kernel32.dll" "system" fn TzSpecificLocalTimeToSystemTime(lptimezoneinformation : *const TIME_ZONE_INFORMATION, lplocaltime : *const SYSTEMTIME, lpuniversaltime : *mut SYSTEMTIME) -> BOOL); -pub type BOOL = i32; -#[repr(C)] -pub struct FILETIME { - pub dwLowDateTime: u32, - pub dwHighDateTime: u32, -} -impl ::core::marker::Copy for FILETIME {} -impl ::core::clone::Clone for FILETIME { - fn clone(&self) -> Self { - *self - } -} -#[repr(C)] -pub struct SYSTEMTIME { - pub wYear: u16, - pub wMonth: u16, - pub wDayOfWeek: u16, - pub wDay: u16, - pub wHour: u16, - pub wMinute: u16, - pub wSecond: u16, - pub wMilliseconds: u16, -} -impl ::core::marker::Copy for SYSTEMTIME {} -impl ::core::clone::Clone for SYSTEMTIME { - fn clone(&self) -> Self { - *self - } -} -#[repr(C)] -pub struct TIME_ZONE_INFORMATION { - pub Bias: i32, - pub StandardName: [u16; 32], - pub StandardDate: SYSTEMTIME, - pub StandardBias: i32, - pub DaylightName: [u16; 32], - pub DaylightDate: SYSTEMTIME, - pub DaylightBias: i32, -} -impl ::core::marker::Copy for TIME_ZONE_INFORMATION {} -impl ::core::clone::Clone for TIME_ZONE_INFORMATION { - fn clone(&self) -> Self { - *self - } -} diff -Nru temporalio-1.3.0/vendor/chrono/src/offset/local/win_bindings.txt temporalio-1.3.0/vendor/chrono/src/offset/local/win_bindings.txt --- temporalio-1.3.0/vendor/chrono/src/offset/local/win_bindings.txt 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/chrono/src/offset/local/win_bindings.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,6 +0,0 @@ ---out src/offset/local/win_bindings.rs ---config flatten sys ---filter - Windows.Win32.System.Time.SystemTimeToFileTime - Windows.Win32.System.Time.SystemTimeToTzSpecificLocalTime - Windows.Win32.System.Time.TzSpecificLocalTimeToSystemTime diff -Nru temporalio-1.3.0/vendor/chrono/src/offset/local/windows.rs temporalio-1.3.0/vendor/chrono/src/offset/local/windows.rs --- temporalio-1.3.0/vendor/chrono/src/offset/local/windows.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/chrono/src/offset/local/windows.rs 2023-10-30 19:40:00.000000000 +0000 @@ -13,9 +13,10 @@ use std::ptr; use std::result::Result; -use super::win_bindings::{ +use winapi::shared::minwindef::FILETIME; +use winapi::um::minwinbase::SYSTEMTIME; +use winapi::um::timezoneapi::{ SystemTimeToFileTime, SystemTimeToTzSpecificLocalTime, TzSpecificLocalTimeToSystemTime, - FILETIME, SYSTEMTIME, }; use super::FixedOffset; diff -Nru temporalio-1.3.0/vendor/chrono/src/offset/mod.rs temporalio-1.3.0/vendor/chrono/src/offset/mod.rs --- temporalio-1.3.0/vendor/chrono/src/offset/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/chrono/src/offset/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -347,12 +347,6 @@ /// since January 1, 1970 0:00:00 UTC (aka "UNIX timestamp") /// and the number of nanoseconds since the last whole non-leap second. /// - /// The nanosecond part can exceed 1,000,000,000 in order to represent a - /// [leap second](NaiveTime#leap-second-handling), but only when `secs % 60 == 59`. - /// (The true "UNIX timestamp" cannot represent a leap second unambiguously.) - /// - /// # Panics - /// /// Panics on the out-of-range number of seconds and/or invalid nanosecond, /// for a non-panicking version see [`timestamp_opt`](#method.timestamp_opt). #[deprecated(since = "0.4.23", note = "use `timestamp_opt()` instead")] @@ -364,12 +358,6 @@ /// since January 1, 1970 0:00:00 UTC (aka "UNIX timestamp") /// and the number of nanoseconds since the last whole non-leap second. /// - /// The nanosecond part can exceed 1,000,000,000 in order to represent a - /// [leap second](NaiveTime#leap-second-handling), but only when `secs % 60 == 59`. - /// (The true "UNIX timestamp" cannot represent a leap second unambiguously.) - /// - /// # Errors - /// /// Returns `LocalResult::None` on out-of-range number of seconds and/or /// invalid nanosecond, otherwise always returns `LocalResult::Single`. /// @@ -415,10 +403,12 @@ /// }; /// ``` fn timestamp_millis_opt(&self, millis: i64) -> LocalResult> { - match NaiveDateTime::from_timestamp_millis(millis) { - Some(dt) => LocalResult::Single(self.from_utc_datetime(&dt)), - None => LocalResult::None, + let (mut secs, mut millis) = (millis / 1000, millis % 1000); + if millis < 0 { + secs -= 1; + millis += 1000; } + self.timestamp_opt(secs, millis as u32 * 1_000_000) } /// Makes a new `DateTime` from the number of non-leap nanoseconds @@ -443,22 +433,6 @@ self.timestamp_opt(secs, nanos as u32).unwrap() } - /// Makes a new `DateTime` from the number of non-leap microseconds - /// since January 1, 1970 0:00:00 UTC (aka "UNIX timestamp"). - /// - /// #Example - /// ``` - /// use chrono::{Utc, TimeZone}; - /// - /// assert_eq!(Utc.timestamp_micros(1431648000000).unwrap().timestamp(), 1431648); - /// ``` - fn timestamp_micros(&self, micros: i64) -> LocalResult> { - match NaiveDateTime::from_timestamp_micros(micros) { - Some(dt) => LocalResult::Single(self.from_utc_datetime(&dt)), - None => LocalResult::None, - } - } - /// Parses a string with the specified format string and returns a /// `DateTime` with the current offset. /// @@ -470,7 +444,6 @@ /// /// See also [`DateTime::parse_from_str`] which gives a [`DateTime`] with /// parsed [`FixedOffset`]. - #[deprecated(since = "0.4.29", note = "use `DateTime::parse_from_str` instead")] fn datetime_from_str(&self, s: &str, fmt: &str) -> ParseResult> { let mut parsed = Parsed::new(); parse(&mut parsed, s, StrftimeItems::new(fmt))?; @@ -501,7 +474,7 @@ #[allow(clippy::wrong_self_convention)] fn from_local_datetime(&self, local: &NaiveDateTime) -> LocalResult> { self.offset_from_local_datetime(local) - .map(|offset| DateTime::from_naive_utc_and_offset(*local - offset.fix(), offset)) + .map(|offset| DateTime::from_utc(*local - offset.fix(), offset)) } /// Creates the offset for given UTC `NaiveDate`. This cannot fail. @@ -523,7 +496,7 @@ /// The UTC is continuous and thus this cannot fail (but can give the duplicate local time). #[allow(clippy::wrong_self_convention)] fn from_utc_datetime(&self, utc: &NaiveDateTime) -> DateTime { - DateTime::from_naive_utc_and_offset(*utc, self.offset_from_utc_datetime(utc)) + DateTime::from_utc(*utc, self.offset_from_utc_datetime(utc)) } } @@ -584,18 +557,4 @@ Utc.timestamp_nanos(i64::default()); Utc.timestamp_nanos(i64::min_value()); } - - #[test] - fn test_negative_micros() { - let dt = Utc.timestamp_micros(-1_000_000).unwrap(); - assert_eq!(dt.to_string(), "1969-12-31 23:59:59 UTC"); - let dt = Utc.timestamp_micros(-999_999).unwrap(); - assert_eq!(dt.to_string(), "1969-12-31 23:59:59.000001 UTC"); - let dt = Utc.timestamp_micros(-1).unwrap(); - assert_eq!(dt.to_string(), "1969-12-31 23:59:59.999999 UTC"); - let dt = Utc.timestamp_micros(-60_000_000).unwrap(); - assert_eq!(dt.to_string(), "1969-12-31 23:59:00 UTC"); - let dt = Utc.timestamp_micros(-3_600_000_000).unwrap(); - assert_eq!(dt.to_string(), "1969-12-31 23:00:00 UTC"); - } } diff -Nru temporalio-1.3.0/vendor/chrono/src/offset/utc.rs temporalio-1.3.0/vendor/chrono/src/offset/utc.rs --- temporalio-1.3.0/vendor/chrono/src/offset/utc.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/chrono/src/offset/utc.rs 2023-10-30 19:40:00.000000000 +0000 @@ -33,9 +33,9 @@ /// # Example /// /// ``` -/// use chrono::{TimeZone, NaiveDateTime, Utc}; +/// use chrono::{DateTime, TimeZone, NaiveDateTime, Utc}; /// -/// let dt = Utc.from_utc_datetime(&NaiveDateTime::from_timestamp_opt(61, 0).unwrap()); +/// let dt = DateTime::::from_utc(NaiveDateTime::from_timestamp_opt(61, 0).unwrap(), Utc); /// /// assert_eq!(Utc.timestamp_opt(61, 0).unwrap(), dt); /// assert_eq!(Utc.with_ymd_and_hms(1970, 1, 1, 0, 1, 1).unwrap(), dt); @@ -59,28 +59,7 @@ Utc::now().date() } - /// Returns a `DateTime` which corresponds to the current date and time in UTC. - /// - /// See also the similar [`Local::now()`] which returns `DateTime`, i.e. the local date - /// and time including offset from UTC. - /// - /// [`Local::now()`]: crate::Local::now - /// - /// # Example - /// - /// ``` - /// # #![allow(unused_variables)] - /// # use chrono::{FixedOffset, Utc}; - /// // Current time in UTC - /// let now_utc = Utc::now(); - /// - /// // Current date in UTC - /// let today_utc = now_utc.date_naive(); - /// - /// // Current time in some timezone (let's use +05:00) - /// let offset = FixedOffset::east_opt(5 * 60 * 60).unwrap(); - /// let now_with_offset = Utc::now().with_timezone(&offset); - /// ``` + /// Returns a `DateTime` which corresponds to the current date and time. #[cfg(not(all( target_arch = "wasm32", feature = "wasmbind", @@ -92,7 +71,7 @@ SystemTime::now().duration_since(UNIX_EPOCH).expect("system time before Unix epoch"); let naive = NaiveDateTime::from_timestamp_opt(now.as_secs() as i64, now.subsec_nanos()).unwrap(); - Utc.from_utc_datetime(&naive) + DateTime::from_utc(naive, Utc) } /// Returns a `DateTime` which corresponds to the current date and time. diff -Nru temporalio-1.3.0/vendor/chrono/src/oldtime.rs temporalio-1.3.0/vendor/chrono/src/oldtime.rs --- temporalio-1.3.0/vendor/chrono/src/oldtime.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/chrono/src/oldtime.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,750 @@ +// Copyright 2012-2014 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +//! Temporal quantification + +use core::ops::{Add, Div, Mul, Neg, Sub}; +use core::time::Duration as StdDuration; +use core::{fmt, i64}; +#[cfg(any(feature = "std", test))] +use std::error::Error; + +#[cfg(feature = "rkyv")] +use rkyv::{Archive, Deserialize, Serialize}; + +/// The number of nanoseconds in a microsecond. +const NANOS_PER_MICRO: i32 = 1000; +/// The number of nanoseconds in a millisecond. +const NANOS_PER_MILLI: i32 = 1000_000; +/// The number of nanoseconds in seconds. +const NANOS_PER_SEC: i32 = 1_000_000_000; +/// The number of microseconds per second. +const MICROS_PER_SEC: i64 = 1000_000; +/// The number of milliseconds per second. +const MILLIS_PER_SEC: i64 = 1000; +/// The number of seconds in a minute. +const SECS_PER_MINUTE: i64 = 60; +/// The number of seconds in an hour. +const SECS_PER_HOUR: i64 = 3600; +/// The number of (non-leap) seconds in days. +const SECS_PER_DAY: i64 = 86400; +/// The number of (non-leap) seconds in a week. +const SECS_PER_WEEK: i64 = 604800; + +macro_rules! try_opt { + ($e:expr) => { + match $e { + Some(v) => v, + None => return None, + } + }; +} + +/// ISO 8601 time duration with nanosecond precision. +/// +/// This also allows for the negative duration; see individual methods for details. +#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Debug, Hash)] +#[cfg_attr(feature = "rkyv", derive(Archive, Deserialize, Serialize))] +pub struct Duration { + secs: i64, + nanos: i32, // Always 0 <= nanos < NANOS_PER_SEC +} + +/// The minimum possible `Duration`: `i64::MIN` milliseconds. +pub(crate) const MIN: Duration = Duration { + secs: i64::MIN / MILLIS_PER_SEC - 1, + nanos: NANOS_PER_SEC + (i64::MIN % MILLIS_PER_SEC) as i32 * NANOS_PER_MILLI, +}; + +/// The maximum possible `Duration`: `i64::MAX` milliseconds. +pub(crate) const MAX: Duration = Duration { + secs: i64::MAX / MILLIS_PER_SEC, + nanos: (i64::MAX % MILLIS_PER_SEC) as i32 * NANOS_PER_MILLI, +}; + +impl Duration { + /// Makes a new `Duration` with given number of weeks. + /// Equivalent to `Duration::seconds(weeks * 7 * 24 * 60 * 60)` with overflow checks. + /// Panics when the duration is out of bounds. + #[inline] + #[must_use] + pub fn weeks(weeks: i64) -> Duration { + let secs = weeks.checked_mul(SECS_PER_WEEK).expect("Duration::weeks out of bounds"); + Duration::seconds(secs) + } + + /// Makes a new `Duration` with given number of days. + /// Equivalent to `Duration::seconds(days * 24 * 60 * 60)` with overflow checks. + /// Panics when the duration is out of bounds. + #[inline] + #[must_use] + pub fn days(days: i64) -> Duration { + let secs = days.checked_mul(SECS_PER_DAY).expect("Duration::days out of bounds"); + Duration::seconds(secs) + } + + /// Makes a new `Duration` with given number of hours. + /// Equivalent to `Duration::seconds(hours * 60 * 60)` with overflow checks. + /// Panics when the duration is out of bounds. + #[inline] + #[must_use] + pub fn hours(hours: i64) -> Duration { + let secs = hours.checked_mul(SECS_PER_HOUR).expect("Duration::hours ouf of bounds"); + Duration::seconds(secs) + } + + /// Makes a new `Duration` with given number of minutes. + /// Equivalent to `Duration::seconds(minutes * 60)` with overflow checks. + /// Panics when the duration is out of bounds. + #[inline] + #[must_use] + pub fn minutes(minutes: i64) -> Duration { + let secs = minutes.checked_mul(SECS_PER_MINUTE).expect("Duration::minutes out of bounds"); + Duration::seconds(secs) + } + + /// Makes a new `Duration` with given number of seconds. + /// Panics when the duration is more than `i64::MAX` seconds + /// or less than `i64::MIN` seconds. + #[inline] + #[must_use] + pub fn seconds(seconds: i64) -> Duration { + let d = Duration { secs: seconds, nanos: 0 }; + if d < MIN || d > MAX { + panic!("Duration::seconds out of bounds"); + } + d + } + + /// Makes a new `Duration` with given number of milliseconds. + #[inline] + pub const fn milliseconds(milliseconds: i64) -> Duration { + let (secs, millis) = div_mod_floor_64(milliseconds, MILLIS_PER_SEC); + let nanos = millis as i32 * NANOS_PER_MILLI; + Duration { secs: secs, nanos: nanos } + } + + /// Makes a new `Duration` with given number of microseconds. + #[inline] + pub const fn microseconds(microseconds: i64) -> Duration { + let (secs, micros) = div_mod_floor_64(microseconds, MICROS_PER_SEC); + let nanos = micros as i32 * NANOS_PER_MICRO; + Duration { secs: secs, nanos: nanos } + } + + /// Makes a new `Duration` with given number of nanoseconds. + #[inline] + pub const fn nanoseconds(nanos: i64) -> Duration { + let (secs, nanos) = div_mod_floor_64(nanos, NANOS_PER_SEC as i64); + Duration { secs: secs, nanos: nanos as i32 } + } + + /// Returns the total number of whole weeks in the duration. + #[inline] + pub const fn num_weeks(&self) -> i64 { + self.num_days() / 7 + } + + /// Returns the total number of whole days in the duration. + pub const fn num_days(&self) -> i64 { + self.num_seconds() / SECS_PER_DAY + } + + /// Returns the total number of whole hours in the duration. + #[inline] + pub const fn num_hours(&self) -> i64 { + self.num_seconds() / SECS_PER_HOUR + } + + /// Returns the total number of whole minutes in the duration. + #[inline] + pub const fn num_minutes(&self) -> i64 { + self.num_seconds() / SECS_PER_MINUTE + } + + /// Returns the total number of whole seconds in the duration. + pub const fn num_seconds(&self) -> i64 { + // If secs is negative, nanos should be subtracted from the duration. + if self.secs < 0 && self.nanos > 0 { + self.secs + 1 + } else { + self.secs + } + } + + /// Returns the number of nanoseconds such that + /// `nanos_mod_sec() + num_seconds() * NANOS_PER_SEC` is the total number of + /// nanoseconds in the duration. + const fn nanos_mod_sec(&self) -> i32 { + if self.secs < 0 && self.nanos > 0 { + self.nanos - NANOS_PER_SEC + } else { + self.nanos + } + } + + /// Returns the total number of whole milliseconds in the duration, + pub const fn num_milliseconds(&self) -> i64 { + // A proper Duration will not overflow, because MIN and MAX are defined + // such that the range is exactly i64 milliseconds. + let secs_part = self.num_seconds() * MILLIS_PER_SEC; + let nanos_part = self.nanos_mod_sec() / NANOS_PER_MILLI; + secs_part + nanos_part as i64 + } + + /// Returns the total number of whole microseconds in the duration, + /// or `None` on overflow (exceeding 2^63 microseconds in either direction). + pub const fn num_microseconds(&self) -> Option { + let secs_part = try_opt!(self.num_seconds().checked_mul(MICROS_PER_SEC)); + let nanos_part = self.nanos_mod_sec() / NANOS_PER_MICRO; + secs_part.checked_add(nanos_part as i64) + } + + /// Returns the total number of whole nanoseconds in the duration, + /// or `None` on overflow (exceeding 2^63 nanoseconds in either direction). + pub const fn num_nanoseconds(&self) -> Option { + let secs_part = try_opt!(self.num_seconds().checked_mul(NANOS_PER_SEC as i64)); + let nanos_part = self.nanos_mod_sec(); + secs_part.checked_add(nanos_part as i64) + } + + /// Add two durations, returning `None` if overflow occurred. + #[must_use] + pub fn checked_add(&self, rhs: &Duration) -> Option { + let mut secs = try_opt!(self.secs.checked_add(rhs.secs)); + let mut nanos = self.nanos + rhs.nanos; + if nanos >= NANOS_PER_SEC { + nanos -= NANOS_PER_SEC; + secs = try_opt!(secs.checked_add(1)); + } + let d = Duration { secs: secs, nanos: nanos }; + // Even if d is within the bounds of i64 seconds, + // it might still overflow i64 milliseconds. + if d < MIN || d > MAX { + None + } else { + Some(d) + } + } + + /// Subtract two durations, returning `None` if overflow occurred. + #[must_use] + pub fn checked_sub(&self, rhs: &Duration) -> Option { + let mut secs = try_opt!(self.secs.checked_sub(rhs.secs)); + let mut nanos = self.nanos - rhs.nanos; + if nanos < 0 { + nanos += NANOS_PER_SEC; + secs = try_opt!(secs.checked_sub(1)); + } + let d = Duration { secs: secs, nanos: nanos }; + // Even if d is within the bounds of i64 seconds, + // it might still overflow i64 milliseconds. + if d < MIN || d > MAX { + None + } else { + Some(d) + } + } + + /// Returns the duration as an absolute (non-negative) value. + #[inline] + pub const fn abs(&self) -> Duration { + if self.secs < 0 && self.nanos != 0 { + Duration { secs: (self.secs + 1).abs(), nanos: NANOS_PER_SEC - self.nanos } + } else { + Duration { secs: self.secs.abs(), nanos: self.nanos } + } + } + + /// The minimum possible `Duration`: `i64::MIN` milliseconds. + #[inline] + pub const fn min_value() -> Duration { + MIN + } + + /// The maximum possible `Duration`: `i64::MAX` milliseconds. + #[inline] + pub const fn max_value() -> Duration { + MAX + } + + /// A duration where the stored seconds and nanoseconds are equal to zero. + #[inline] + pub const fn zero() -> Duration { + Duration { secs: 0, nanos: 0 } + } + + /// Returns `true` if the duration equals `Duration::zero()`. + #[inline] + pub const fn is_zero(&self) -> bool { + self.secs == 0 && self.nanos == 0 + } + + /// Creates a `time::Duration` object from `std::time::Duration` + /// + /// This function errors when original duration is larger than the maximum + /// value supported for this type. + pub fn from_std(duration: StdDuration) -> Result { + // We need to check secs as u64 before coercing to i64 + if duration.as_secs() > MAX.secs as u64 { + return Err(OutOfRangeError(())); + } + let d = Duration { secs: duration.as_secs() as i64, nanos: duration.subsec_nanos() as i32 }; + if d > MAX { + return Err(OutOfRangeError(())); + } + Ok(d) + } + + /// Creates a `std::time::Duration` object from `time::Duration` + /// + /// This function errors when duration is less than zero. As standard + /// library implementation is limited to non-negative values. + pub fn to_std(&self) -> Result { + if self.secs < 0 { + return Err(OutOfRangeError(())); + } + Ok(StdDuration::new(self.secs as u64, self.nanos as u32)) + } +} + +impl Neg for Duration { + type Output = Duration; + + #[inline] + fn neg(self) -> Duration { + if self.nanos == 0 { + Duration { secs: -self.secs, nanos: 0 } + } else { + Duration { secs: -self.secs - 1, nanos: NANOS_PER_SEC - self.nanos } + } + } +} + +impl Add for Duration { + type Output = Duration; + + fn add(self, rhs: Duration) -> Duration { + let mut secs = self.secs + rhs.secs; + let mut nanos = self.nanos + rhs.nanos; + if nanos >= NANOS_PER_SEC { + nanos -= NANOS_PER_SEC; + secs += 1; + } + Duration { secs: secs, nanos: nanos } + } +} + +impl Sub for Duration { + type Output = Duration; + + fn sub(self, rhs: Duration) -> Duration { + let mut secs = self.secs - rhs.secs; + let mut nanos = self.nanos - rhs.nanos; + if nanos < 0 { + nanos += NANOS_PER_SEC; + secs -= 1; + } + Duration { secs: secs, nanos: nanos } + } +} + +impl Mul for Duration { + type Output = Duration; + + fn mul(self, rhs: i32) -> Duration { + // Multiply nanoseconds as i64, because it cannot overflow that way. + let total_nanos = self.nanos as i64 * rhs as i64; + let (extra_secs, nanos) = div_mod_floor_64(total_nanos, NANOS_PER_SEC as i64); + let secs = self.secs * rhs as i64 + extra_secs; + Duration { secs: secs, nanos: nanos as i32 } + } +} + +impl Div for Duration { + type Output = Duration; + + fn div(self, rhs: i32) -> Duration { + let mut secs = self.secs / rhs as i64; + let carry = self.secs - secs * rhs as i64; + let extra_nanos = carry * NANOS_PER_SEC as i64 / rhs as i64; + let mut nanos = self.nanos / rhs + extra_nanos as i32; + if nanos >= NANOS_PER_SEC { + nanos -= NANOS_PER_SEC; + secs += 1; + } + if nanos < 0 { + nanos += NANOS_PER_SEC; + secs -= 1; + } + Duration { secs: secs, nanos: nanos } + } +} + +#[cfg(any(feature = "std", test))] +#[cfg_attr(docsrs, doc(cfg(feature = "std")))] +impl<'a> std::iter::Sum<&'a Duration> for Duration { + fn sum>(iter: I) -> Duration { + iter.fold(Duration::zero(), |acc, x| acc + *x) + } +} + +#[cfg(any(feature = "std", test))] +#[cfg_attr(docsrs, doc(cfg(feature = "std")))] +impl std::iter::Sum for Duration { + fn sum>(iter: I) -> Duration { + iter.fold(Duration::zero(), |acc, x| acc + x) + } +} + +impl fmt::Display for Duration { + /// Format a duration using the [ISO 8601] format + /// + /// [ISO 8601]: https://en.wikipedia.org/wiki/ISO_8601#Durations + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + // technically speaking, negative duration is not valid ISO 8601, + // but we need to print it anyway. + let (abs, sign) = if self.secs < 0 { (-*self, "-") } else { (*self, "") }; + + let days = abs.secs / SECS_PER_DAY; + let secs = abs.secs - days * SECS_PER_DAY; + let hasdate = days != 0; + let hastime = (secs != 0 || abs.nanos != 0) || !hasdate; + + write!(f, "{}P", sign)?; + + if hasdate { + write!(f, "{}D", days)?; + } + if hastime { + if abs.nanos == 0 { + write!(f, "T{}S", secs)?; + } else if abs.nanos % NANOS_PER_MILLI == 0 { + write!(f, "T{}.{:03}S", secs, abs.nanos / NANOS_PER_MILLI)?; + } else if abs.nanos % NANOS_PER_MICRO == 0 { + write!(f, "T{}.{:06}S", secs, abs.nanos / NANOS_PER_MICRO)?; + } else { + write!(f, "T{}.{:09}S", secs, abs.nanos)?; + } + } + Ok(()) + } +} + +/// Represents error when converting `Duration` to/from a standard library +/// implementation +/// +/// The `std::time::Duration` supports a range from zero to `u64::MAX` +/// *seconds*, while this module supports signed range of up to +/// `i64::MAX` of *milliseconds*. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub struct OutOfRangeError(()); + +impl fmt::Display for OutOfRangeError { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "Source duration value is out of range for the target type") + } +} + +#[cfg(any(feature = "std", test))] +#[cfg_attr(docsrs, doc(cfg(feature = "std")))] +impl Error for OutOfRangeError { + #[allow(deprecated)] + fn description(&self) -> &str { + "out of range error" + } +} + +#[inline] +const fn div_mod_floor_64(this: i64, other: i64) -> (i64, i64) { + (this.div_euclid(other), this.rem_euclid(other)) +} + +#[cfg(feature = "arbitrary")] +impl arbitrary::Arbitrary<'_> for Duration { + fn arbitrary(u: &mut arbitrary::Unstructured) -> arbitrary::Result { + const MIN_SECS: i64 = i64::MIN / MILLIS_PER_SEC - 1; + const MAX_SECS: i64 = i64::MAX / MILLIS_PER_SEC; + + let secs: i64 = u.int_in_range(MIN_SECS..=MAX_SECS)?; + let nanos: i32 = u.int_in_range(0..=(NANOS_PER_SEC - 1))?; + let duration = Duration { secs, nanos }; + + if duration < MIN || duration > MAX { + Err(arbitrary::Error::IncorrectFormat) + } else { + Ok(duration) + } + } +} + +#[cfg(test)] +mod tests { + use super::{Duration, OutOfRangeError, MAX, MIN}; + use std::time::Duration as StdDuration; + use std::{i32, i64}; + + #[test] + fn test_duration() { + assert!(Duration::seconds(1) != Duration::zero()); + assert_eq!(Duration::seconds(1) + Duration::seconds(2), Duration::seconds(3)); + assert_eq!( + Duration::seconds(86399) + Duration::seconds(4), + Duration::days(1) + Duration::seconds(3) + ); + assert_eq!(Duration::days(10) - Duration::seconds(1000), Duration::seconds(863000)); + assert_eq!(Duration::days(10) - Duration::seconds(1000000), Duration::seconds(-136000)); + assert_eq!( + Duration::days(2) + Duration::seconds(86399) + Duration::nanoseconds(1234567890), + Duration::days(3) + Duration::nanoseconds(234567890) + ); + assert_eq!(-Duration::days(3), Duration::days(-3)); + assert_eq!( + -(Duration::days(3) + Duration::seconds(70)), + Duration::days(-4) + Duration::seconds(86400 - 70) + ); + } + + #[test] + fn test_duration_num_days() { + assert_eq!(Duration::zero().num_days(), 0); + assert_eq!(Duration::days(1).num_days(), 1); + assert_eq!(Duration::days(-1).num_days(), -1); + assert_eq!(Duration::seconds(86399).num_days(), 0); + assert_eq!(Duration::seconds(86401).num_days(), 1); + assert_eq!(Duration::seconds(-86399).num_days(), 0); + assert_eq!(Duration::seconds(-86401).num_days(), -1); + assert_eq!(Duration::days(i32::MAX as i64).num_days(), i32::MAX as i64); + assert_eq!(Duration::days(i32::MIN as i64).num_days(), i32::MIN as i64); + } + + #[test] + fn test_duration_num_seconds() { + assert_eq!(Duration::zero().num_seconds(), 0); + assert_eq!(Duration::seconds(1).num_seconds(), 1); + assert_eq!(Duration::seconds(-1).num_seconds(), -1); + assert_eq!(Duration::milliseconds(999).num_seconds(), 0); + assert_eq!(Duration::milliseconds(1001).num_seconds(), 1); + assert_eq!(Duration::milliseconds(-999).num_seconds(), 0); + assert_eq!(Duration::milliseconds(-1001).num_seconds(), -1); + } + + #[test] + fn test_duration_num_milliseconds() { + assert_eq!(Duration::zero().num_milliseconds(), 0); + assert_eq!(Duration::milliseconds(1).num_milliseconds(), 1); + assert_eq!(Duration::milliseconds(-1).num_milliseconds(), -1); + assert_eq!(Duration::microseconds(999).num_milliseconds(), 0); + assert_eq!(Duration::microseconds(1001).num_milliseconds(), 1); + assert_eq!(Duration::microseconds(-999).num_milliseconds(), 0); + assert_eq!(Duration::microseconds(-1001).num_milliseconds(), -1); + assert_eq!(Duration::milliseconds(i64::MAX).num_milliseconds(), i64::MAX); + assert_eq!(Duration::milliseconds(i64::MIN).num_milliseconds(), i64::MIN); + assert_eq!(MAX.num_milliseconds(), i64::MAX); + assert_eq!(MIN.num_milliseconds(), i64::MIN); + } + + #[test] + fn test_duration_num_microseconds() { + assert_eq!(Duration::zero().num_microseconds(), Some(0)); + assert_eq!(Duration::microseconds(1).num_microseconds(), Some(1)); + assert_eq!(Duration::microseconds(-1).num_microseconds(), Some(-1)); + assert_eq!(Duration::nanoseconds(999).num_microseconds(), Some(0)); + assert_eq!(Duration::nanoseconds(1001).num_microseconds(), Some(1)); + assert_eq!(Duration::nanoseconds(-999).num_microseconds(), Some(0)); + assert_eq!(Duration::nanoseconds(-1001).num_microseconds(), Some(-1)); + assert_eq!(Duration::microseconds(i64::MAX).num_microseconds(), Some(i64::MAX)); + assert_eq!(Duration::microseconds(i64::MIN).num_microseconds(), Some(i64::MIN)); + assert_eq!(MAX.num_microseconds(), None); + assert_eq!(MIN.num_microseconds(), None); + + // overflow checks + const MICROS_PER_DAY: i64 = 86400_000_000; + assert_eq!( + Duration::days(i64::MAX / MICROS_PER_DAY).num_microseconds(), + Some(i64::MAX / MICROS_PER_DAY * MICROS_PER_DAY) + ); + assert_eq!( + Duration::days(i64::MIN / MICROS_PER_DAY).num_microseconds(), + Some(i64::MIN / MICROS_PER_DAY * MICROS_PER_DAY) + ); + assert_eq!(Duration::days(i64::MAX / MICROS_PER_DAY + 1).num_microseconds(), None); + assert_eq!(Duration::days(i64::MIN / MICROS_PER_DAY - 1).num_microseconds(), None); + } + + #[test] + fn test_duration_num_nanoseconds() { + assert_eq!(Duration::zero().num_nanoseconds(), Some(0)); + assert_eq!(Duration::nanoseconds(1).num_nanoseconds(), Some(1)); + assert_eq!(Duration::nanoseconds(-1).num_nanoseconds(), Some(-1)); + assert_eq!(Duration::nanoseconds(i64::MAX).num_nanoseconds(), Some(i64::MAX)); + assert_eq!(Duration::nanoseconds(i64::MIN).num_nanoseconds(), Some(i64::MIN)); + assert_eq!(MAX.num_nanoseconds(), None); + assert_eq!(MIN.num_nanoseconds(), None); + + // overflow checks + const NANOS_PER_DAY: i64 = 86400_000_000_000; + assert_eq!( + Duration::days(i64::MAX / NANOS_PER_DAY).num_nanoseconds(), + Some(i64::MAX / NANOS_PER_DAY * NANOS_PER_DAY) + ); + assert_eq!( + Duration::days(i64::MIN / NANOS_PER_DAY).num_nanoseconds(), + Some(i64::MIN / NANOS_PER_DAY * NANOS_PER_DAY) + ); + assert_eq!(Duration::days(i64::MAX / NANOS_PER_DAY + 1).num_nanoseconds(), None); + assert_eq!(Duration::days(i64::MIN / NANOS_PER_DAY - 1).num_nanoseconds(), None); + } + + #[test] + fn test_duration_checked_ops() { + assert_eq!( + Duration::milliseconds(i64::MAX - 1).checked_add(&Duration::microseconds(999)), + Some(Duration::milliseconds(i64::MAX - 2) + Duration::microseconds(1999)) + ); + assert!(Duration::milliseconds(i64::MAX) + .checked_add(&Duration::microseconds(1000)) + .is_none()); + + assert_eq!( + Duration::milliseconds(i64::MIN).checked_sub(&Duration::milliseconds(0)), + Some(Duration::milliseconds(i64::MIN)) + ); + assert!(Duration::milliseconds(i64::MIN).checked_sub(&Duration::milliseconds(1)).is_none()); + } + + #[test] + fn test_duration_abs() { + assert_eq!(Duration::milliseconds(1300).abs(), Duration::milliseconds(1300)); + assert_eq!(Duration::milliseconds(1000).abs(), Duration::milliseconds(1000)); + assert_eq!(Duration::milliseconds(300).abs(), Duration::milliseconds(300)); + assert_eq!(Duration::milliseconds(0).abs(), Duration::milliseconds(0)); + assert_eq!(Duration::milliseconds(-300).abs(), Duration::milliseconds(300)); + assert_eq!(Duration::milliseconds(-700).abs(), Duration::milliseconds(700)); + assert_eq!(Duration::milliseconds(-1000).abs(), Duration::milliseconds(1000)); + assert_eq!(Duration::milliseconds(-1300).abs(), Duration::milliseconds(1300)); + assert_eq!(Duration::milliseconds(-1700).abs(), Duration::milliseconds(1700)); + } + + #[test] + fn test_duration_mul() { + assert_eq!(Duration::zero() * i32::MAX, Duration::zero()); + assert_eq!(Duration::zero() * i32::MIN, Duration::zero()); + assert_eq!(Duration::nanoseconds(1) * 0, Duration::zero()); + assert_eq!(Duration::nanoseconds(1) * 1, Duration::nanoseconds(1)); + assert_eq!(Duration::nanoseconds(1) * 1_000_000_000, Duration::seconds(1)); + assert_eq!(Duration::nanoseconds(1) * -1_000_000_000, -Duration::seconds(1)); + assert_eq!(-Duration::nanoseconds(1) * 1_000_000_000, -Duration::seconds(1)); + assert_eq!( + Duration::nanoseconds(30) * 333_333_333, + Duration::seconds(10) - Duration::nanoseconds(10) + ); + assert_eq!( + (Duration::nanoseconds(1) + Duration::seconds(1) + Duration::days(1)) * 3, + Duration::nanoseconds(3) + Duration::seconds(3) + Duration::days(3) + ); + assert_eq!(Duration::milliseconds(1500) * -2, Duration::seconds(-3)); + assert_eq!(Duration::milliseconds(-1500) * 2, Duration::seconds(-3)); + } + + #[test] + fn test_duration_div() { + assert_eq!(Duration::zero() / i32::MAX, Duration::zero()); + assert_eq!(Duration::zero() / i32::MIN, Duration::zero()); + assert_eq!(Duration::nanoseconds(123_456_789) / 1, Duration::nanoseconds(123_456_789)); + assert_eq!(Duration::nanoseconds(123_456_789) / -1, -Duration::nanoseconds(123_456_789)); + assert_eq!(-Duration::nanoseconds(123_456_789) / -1, Duration::nanoseconds(123_456_789)); + assert_eq!(-Duration::nanoseconds(123_456_789) / 1, -Duration::nanoseconds(123_456_789)); + assert_eq!(Duration::seconds(1) / 3, Duration::nanoseconds(333_333_333)); + assert_eq!(Duration::seconds(4) / 3, Duration::nanoseconds(1_333_333_333)); + assert_eq!(Duration::seconds(-1) / 2, Duration::milliseconds(-500)); + assert_eq!(Duration::seconds(1) / -2, Duration::milliseconds(-500)); + assert_eq!(Duration::seconds(-1) / -2, Duration::milliseconds(500)); + assert_eq!(Duration::seconds(-4) / 3, Duration::nanoseconds(-1_333_333_333)); + assert_eq!(Duration::seconds(-4) / -3, Duration::nanoseconds(1_333_333_333)); + } + + #[test] + fn test_duration_sum() { + let duration_list_1 = [Duration::zero(), Duration::seconds(1)]; + let sum_1: Duration = duration_list_1.iter().sum(); + assert_eq!(sum_1, Duration::seconds(1)); + + let duration_list_2 = + [Duration::zero(), Duration::seconds(1), Duration::seconds(6), Duration::seconds(10)]; + let sum_2: Duration = duration_list_2.iter().sum(); + assert_eq!(sum_2, Duration::seconds(17)); + + let duration_vec = vec![ + Duration::zero(), + Duration::seconds(1), + Duration::seconds(6), + Duration::seconds(10), + ]; + let sum_3: Duration = duration_vec.into_iter().sum(); + assert_eq!(sum_3, Duration::seconds(17)); + } + + #[test] + fn test_duration_fmt() { + assert_eq!(Duration::zero().to_string(), "PT0S"); + assert_eq!(Duration::days(42).to_string(), "P42D"); + assert_eq!(Duration::days(-42).to_string(), "-P42D"); + assert_eq!(Duration::seconds(42).to_string(), "PT42S"); + assert_eq!(Duration::milliseconds(42).to_string(), "PT0.042S"); + assert_eq!(Duration::microseconds(42).to_string(), "PT0.000042S"); + assert_eq!(Duration::nanoseconds(42).to_string(), "PT0.000000042S"); + assert_eq!((Duration::days(7) + Duration::milliseconds(6543)).to_string(), "P7DT6.543S"); + assert_eq!(Duration::seconds(-86401).to_string(), "-P1DT1S"); + assert_eq!(Duration::nanoseconds(-1).to_string(), "-PT0.000000001S"); + + // the format specifier should have no effect on `Duration` + assert_eq!( + format!("{:30}", Duration::days(1) + Duration::milliseconds(2345)), + "P1DT2.345S" + ); + } + + #[test] + fn test_to_std() { + assert_eq!(Duration::seconds(1).to_std(), Ok(StdDuration::new(1, 0))); + assert_eq!(Duration::seconds(86401).to_std(), Ok(StdDuration::new(86401, 0))); + assert_eq!(Duration::milliseconds(123).to_std(), Ok(StdDuration::new(0, 123000000))); + assert_eq!(Duration::milliseconds(123765).to_std(), Ok(StdDuration::new(123, 765000000))); + assert_eq!(Duration::nanoseconds(777).to_std(), Ok(StdDuration::new(0, 777))); + assert_eq!(MAX.to_std(), Ok(StdDuration::new(9223372036854775, 807000000))); + assert_eq!(Duration::seconds(-1).to_std(), Err(OutOfRangeError(()))); + assert_eq!(Duration::milliseconds(-1).to_std(), Err(OutOfRangeError(()))); + } + + #[test] + fn test_from_std() { + assert_eq!(Ok(Duration::seconds(1)), Duration::from_std(StdDuration::new(1, 0))); + assert_eq!(Ok(Duration::seconds(86401)), Duration::from_std(StdDuration::new(86401, 0))); + assert_eq!( + Ok(Duration::milliseconds(123)), + Duration::from_std(StdDuration::new(0, 123000000)) + ); + assert_eq!( + Ok(Duration::milliseconds(123765)), + Duration::from_std(StdDuration::new(123, 765000000)) + ); + assert_eq!(Ok(Duration::nanoseconds(777)), Duration::from_std(StdDuration::new(0, 777))); + assert_eq!(Ok(MAX), Duration::from_std(StdDuration::new(9223372036854775, 807000000))); + assert_eq!( + Duration::from_std(StdDuration::new(9223372036854776, 0)), + Err(OutOfRangeError(())) + ); + assert_eq!( + Duration::from_std(StdDuration::new(9223372036854775, 807000001)), + Err(OutOfRangeError(())) + ); + } +} diff -Nru temporalio-1.3.0/vendor/chrono/src/round.rs temporalio-1.3.0/vendor/chrono/src/round.rs --- temporalio-1.3.0/vendor/chrono/src/round.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/chrono/src/round.rs 2023-10-30 19:40:00.000000000 +0000 @@ -2,7 +2,7 @@ // See README.md and LICENSE.txt for details. use crate::datetime::DateTime; -use crate::duration::Duration; +use crate::oldtime::Duration; use crate::NaiveDateTime; use crate::TimeZone; use crate::Timelike; @@ -100,11 +100,11 @@ /// will also fail if the `Duration` is bigger than the timestamp. pub trait DurationRound: Sized { /// Error that can occur in rounding or truncating - #[cfg(feature = "std")] + #[cfg(any(feature = "std", test))] type Err: std::error::Error; /// Error that can occur in rounding or truncating - #[cfg(not(feature = "std"))] + #[cfg(not(any(feature = "std", test)))] type Err: fmt::Debug + fmt::Display; /// Return a copy rounded by Duration. @@ -142,6 +142,9 @@ fn duration_trunc(self, duration: Duration) -> Result; } +/// The maximum number of seconds a DateTime can be to be represented as nanoseconds +const MAX_SECONDS_TIMESTAMP_FOR_NANOS: i64 = 9_223_372_036; + impl DurationRound for DateTime { type Err = RoundingError; @@ -178,7 +181,10 @@ if span < 0 { return Err(RoundingError::DurationExceedsLimit); } - let stamp = naive.timestamp_nanos_opt().ok_or(RoundingError::TimestampExceedsLimit)?; + if naive.timestamp().abs() > MAX_SECONDS_TIMESTAMP_FOR_NANOS { + return Err(RoundingError::TimestampExceedsLimit); + } + let stamp = naive.timestamp_nanos(); if span > stamp.abs() { return Err(RoundingError::DurationExceedsTimestamp); } @@ -217,7 +223,10 @@ if span < 0 { return Err(RoundingError::DurationExceedsLimit); } - let stamp = naive.timestamp_nanos_opt().ok_or(RoundingError::TimestampExceedsLimit)?; + if naive.timestamp().abs() > MAX_SECONDS_TIMESTAMP_FOR_NANOS { + return Err(RoundingError::TimestampExceedsLimit); + } + let stamp = naive.timestamp_nanos(); if span > stamp.abs() { return Err(RoundingError::DurationExceedsTimestamp); } @@ -290,7 +299,7 @@ } } -#[cfg(feature = "std")] +#[cfg(any(feature = "std", test))] #[cfg_attr(docsrs, doc(cfg(feature = "std")))] impl std::error::Error for RoundingError { #[allow(deprecated)] @@ -760,16 +769,16 @@ #[test] fn issue1010() { - let dt = NaiveDateTime::from_timestamp_opt(-4_227_854_320, 678_774_288).unwrap(); - let span = Duration::microseconds(-7_019_067_213_869_040); + let dt = NaiveDateTime::from_timestamp_opt(-4227854320, 1678774288).unwrap(); + let span = Duration::microseconds(-7019067213869040); assert_eq!(dt.duration_trunc(span), Err(RoundingError::DurationExceedsLimit)); - let dt = NaiveDateTime::from_timestamp_opt(320_041_586, 920_103_021).unwrap(); - let span = Duration::nanoseconds(-8_923_838_508_697_114_584); + let dt = NaiveDateTime::from_timestamp_opt(320041586, 1920103021).unwrap(); + let span = Duration::nanoseconds(-8923838508697114584); assert_eq!(dt.duration_round(span), Err(RoundingError::DurationExceedsLimit)); - let dt = NaiveDateTime::from_timestamp_opt(-2_621_440, 0).unwrap(); - let span = Duration::nanoseconds(-9_223_372_036_854_771_421); + let dt = NaiveDateTime::from_timestamp_opt(-2621440, 0).unwrap(); + let span = Duration::nanoseconds(-9223372036854771421); assert_eq!(dt.duration_round(span), Err(RoundingError::DurationExceedsLimit)); } } diff -Nru temporalio-1.3.0/vendor/chrono/src/traits.rs temporalio-1.3.0/vendor/chrono/src/traits.rs --- temporalio-1.3.0/vendor/chrono/src/traits.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/chrono/src/traits.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,33 +1,6 @@ use crate::{IsoWeek, Weekday}; /// The common set of methods for date component. -/// -/// Methods such as [`year`], [`month`], [`day`] and [`weekday`] can be used to get basic -/// information about the date. -/// -/// The `with_*` methods can change the date. -/// -/// # Warning -/// -/// The `with_*` methods can be convenient to change a single component of a date, but they must be -/// used with some care. Examples to watch out for: -/// -/// - [`with_year`] changes the year component of a year-month-day value. Don't use this method if -/// you want the ordinal to stay the same after changing the year, of if you want the week and -/// weekday values to stay the same. -/// - Don't combine two `with_*` methods to change two components of the date. For example to -/// change both the year and month components of a date. This could fail because an intermediate -/// value does not exist, while the final date would be valid. -/// -/// For more complex changes to a date, it is best to use the methods on [`NaiveDate`] to create a -/// new value instead of altering an existing date. -/// -/// [`year`]: Datelike::year -/// [`month`]: Datelike::month -/// [`day`]: Datelike::day -/// [`weekday`]: Datelike::weekday -/// [`with_year`]: Datelike::with_year -/// [`NaiveDate`]: crate::NaiveDate pub trait Datelike: Sized { /// Returns the year number in the [calendar date](./naive/struct.NaiveDate.html#calendar-date). fn year(&self) -> i32; @@ -80,157 +53,39 @@ /// Returns the ISO week. fn iso_week(&self) -> IsoWeek; - /// Makes a new value with the year number changed, while keeping the same month and day. + /// Makes a new value with the year number changed. /// - /// This method assumes you want to work on the date as a year-month-day value. Don't use it if - /// you want the ordinal to stay the same after changing the year, of if you want the week and - /// weekday values to stay the same. - /// - /// # Errors - /// - /// Returns `None` when: - /// - /// - The resulting date does not exist (February 29 in a non-leap year). - /// - The year is out of range for [`NaiveDate`]. - /// - In case of [`DateTime`] if the resulting date and time fall within a timezone - /// transition such as from DST to standard time. - /// - /// [`NaiveDate`]: crate::NaiveDate - /// [`DateTime`]: crate::DateTime - /// - /// # Examples - /// - /// ``` - /// use chrono::{NaiveDate, Datelike}; - /// - /// assert_eq!( - /// NaiveDate::from_ymd_opt(2020, 5, 13).unwrap().with_year(2023).unwrap(), - /// NaiveDate::from_ymd_opt(2023, 5, 13).unwrap() - /// ); - /// // Resulting date 2023-02-29 does not exist: - /// assert!(NaiveDate::from_ymd_opt(2020, 2, 29).unwrap().with_year(2023).is_none()); - /// - /// // Don't use `with_year` if you want the ordinal date to stay the same: - /// assert_ne!( - /// NaiveDate::from_yo_opt(2020, 100).unwrap().with_year(2023).unwrap(), - /// NaiveDate::from_yo_opt(2023, 100).unwrap() // result is 2023-101 - /// ); - /// ``` + /// Returns `None` when the resulting value would be invalid. fn with_year(&self, year: i32) -> Option; /// Makes a new value with the month number (starting from 1) changed. /// - /// # Errors - /// - /// Returns `None` when: - /// - /// - The resulting date does not exist (for example `month(4)` when day of the month is 31). - /// - In case of [`DateTime`] if the resulting date and time fall within a timezone - /// transition such as from DST to standard time. - /// - The value for `month` is out of range. - /// - /// [`DateTime`]: crate::DateTime - /// - /// # Examples - /// - /// ``` - /// use chrono::{NaiveDate, Datelike}; - /// - /// assert_eq!( - /// NaiveDate::from_ymd_opt(2023, 5, 12).unwrap().with_month(9).unwrap(), - /// NaiveDate::from_ymd_opt(2023, 9, 12).unwrap() - /// ); - /// // Resulting date 2023-09-31 does not exist: - /// assert!(NaiveDate::from_ymd_opt(2023, 5, 31).unwrap().with_month(9).is_none()); - /// ``` - /// - /// Don't combine multiple `Datelike::with_*` methods. The intermediate value may not exist. - /// ``` - /// use chrono::{NaiveDate, Datelike}; - /// - /// fn with_year_month(date: NaiveDate, year: i32, month: u32) -> Option { - /// date.with_year(year)?.with_month(month) - /// } - /// let d = NaiveDate::from_ymd_opt(2020, 2, 29).unwrap(); - /// assert!(with_year_month(d, 2019, 1).is_none()); // fails because of invalid intermediate value - /// - /// // Correct version: - /// fn with_year_month_fixed(date: NaiveDate, year: i32, month: u32) -> Option { - /// NaiveDate::from_ymd_opt(year, month, date.day()) - /// } - /// let d = NaiveDate::from_ymd_opt(2020, 2, 29).unwrap(); - /// assert_eq!(with_year_month_fixed(d, 2019, 1), NaiveDate::from_ymd_opt(2019, 1, 29)); - /// ``` + /// Returns `None` when the resulting value would be invalid. fn with_month(&self, month: u32) -> Option; /// Makes a new value with the month number (starting from 0) changed. /// - /// # Errors - /// - /// Returns `None` when: - /// - /// - The resulting date does not exist (for example `month0(3)` when day of the month is 31). - /// - In case of [`DateTime`] if the resulting date and time fall within a timezone - /// transition such as from DST to standard time. - /// - The value for `month0` is out of range. - /// - /// [`DateTime`]: crate::DateTime + /// Returns `None` when the resulting value would be invalid. fn with_month0(&self, month0: u32) -> Option; /// Makes a new value with the day of month (starting from 1) changed. /// - /// # Errors - /// - /// Returns `None` when: - /// - /// - The resulting date does not exist (for example `day(31)` in April). - /// - In case of [`DateTime`] if the resulting date and time fall within a timezone - /// transition such as from DST to standard time. - /// - The value for `day` is out of range. - /// - /// [`DateTime`]: crate::DateTime + /// Returns `None` when the resulting value would be invalid. fn with_day(&self, day: u32) -> Option; /// Makes a new value with the day of month (starting from 0) changed. /// - /// # Errors - /// - /// Returns `None` when: - /// - /// - The resulting date does not exist (for example `day0(30)` in April). - /// - In case of [`DateTime`] if the resulting date and time fall within a timezone - /// transition such as from DST to standard time. - /// - The value for `day0` is out of range. - /// - /// [`DateTime`]: crate::DateTime + /// Returns `None` when the resulting value would be invalid. fn with_day0(&self, day0: u32) -> Option; /// Makes a new value with the day of year (starting from 1) changed. /// - /// # Errors - /// - /// Returns `None` when: - /// - /// - The resulting date does not exist (`with_ordinal(366)` in a non-leap year). - /// - In case of [`DateTime`] if the resulting date and time fall within a timezone - /// transition such as from DST to standard time. - /// - The value for `ordinal` is out of range. - /// - /// [`DateTime`]: crate::DateTime + /// Returns `None` when the resulting value would be invalid. fn with_ordinal(&self, ordinal: u32) -> Option; /// Makes a new value with the day of year (starting from 0) changed. /// - /// # Errors - /// - /// Returns `None` when: - /// - /// - The resulting date does not exist (`with_ordinal0(365)` in a non-leap year). - /// - In case of [`DateTime`] if the resulting date and time fall within a timezone - /// transition such as from DST to standard time. - /// - The value for `ordinal0` is out of range. - /// - /// [`DateTime`]: crate::DateTime + /// Returns `None` when the resulting value would be invalid. fn with_ordinal0(&self, ordinal0: u32) -> Option; /// Counts the days in the proleptic Gregorian calendar, with January 1, Year 1 (CE) as day 1. @@ -316,11 +171,6 @@ fn with_nanosecond(&self, nano: u32) -> Option; /// Returns the number of non-leap seconds past the last midnight. - /// - /// Every value in 00:00:00-23:59:59 maps to an integer in 0-86399. - /// - /// This method is not intended to provide the real number of seconds since midnight on a given - /// day. It does not take things like DST transitions into account. #[inline] fn num_seconds_from_midnight(&self) -> u32 { self.hour() * 3600 + self.minute() * 60 + self.second() diff -Nru temporalio-1.3.0/vendor/chrono/src/weekday.rs temporalio-1.3.0/vendor/chrono/src/weekday.rs --- temporalio-1.3.0/vendor/chrono/src/weekday.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/chrono/src/weekday.rs 2023-10-30 19:40:00.000000000 +0000 @@ -114,19 +114,6 @@ /// `w`: | `Mon` | `Tue` | `Wed` | `Thu` | `Fri` | `Sat` | `Sun` /// --------------------------- | ----- | ----- | ----- | ----- | ----- | ----- | ----- /// `w.num_days_from_monday()`: | 0 | 1 | 2 | 3 | 4 | 5 | 6 - /// - /// # Example - /// - #[cfg_attr(not(feature = "clock"), doc = "```ignore")] - #[cfg_attr(feature = "clock", doc = "```rust")] - /// # use chrono::{Local, Datelike}; - /// // MTWRFSU is occasionally used as a single-letter abbreviation of the weekdays. - /// // Use `num_days_from_monday` to index into the array. - /// const MTWRFSU: [char; 7] = ['M', 'T', 'W', 'R', 'F', 'S', 'U']; - /// - /// let today = Local::now().weekday(); - /// println!("{}", MTWRFSU[today.num_days_from_monday() as usize]); - /// ``` #[inline] pub const fn num_days_from_monday(&self) -> u32 { self.num_days_from(Weekday::Mon) @@ -242,6 +229,43 @@ } } +#[cfg(test)] +mod tests { + use super::Weekday; + + #[test] + fn test_num_days_from() { + for i in 0..7 { + let base_day = Weekday::try_from(i).unwrap(); + + assert_eq!(base_day.num_days_from_monday(), base_day.num_days_from(Weekday::Mon)); + assert_eq!(base_day.num_days_from_sunday(), base_day.num_days_from(Weekday::Sun)); + + assert_eq!(base_day.num_days_from(base_day), 0); + + assert_eq!(base_day.num_days_from(base_day.pred()), 1); + assert_eq!(base_day.num_days_from(base_day.pred().pred()), 2); + assert_eq!(base_day.num_days_from(base_day.pred().pred().pred()), 3); + assert_eq!(base_day.num_days_from(base_day.pred().pred().pred().pred()), 4); + assert_eq!(base_day.num_days_from(base_day.pred().pred().pred().pred().pred()), 5); + assert_eq!( + base_day.num_days_from(base_day.pred().pred().pred().pred().pred().pred()), + 6 + ); + + assert_eq!(base_day.num_days_from(base_day.succ()), 6); + assert_eq!(base_day.num_days_from(base_day.succ().succ()), 5); + assert_eq!(base_day.num_days_from(base_day.succ().succ().succ()), 4); + assert_eq!(base_day.num_days_from(base_day.succ().succ().succ().succ()), 3); + assert_eq!(base_day.num_days_from(base_day.succ().succ().succ().succ().succ()), 2); + assert_eq!( + base_day.num_days_from(base_day.succ().succ().succ().succ().succ().succ()), + 1 + ); + } + } +} + // the actual `FromStr` implementation is in the `format` module to leverage the existing code #[cfg(feature = "serde")] @@ -285,46 +309,8 @@ deserializer.deserialize_str(WeekdayVisitor) } } -} - -#[cfg(test)] -mod tests { - use super::Weekday; - - #[test] - fn test_num_days_from() { - for i in 0..7 { - let base_day = Weekday::try_from(i).unwrap(); - - assert_eq!(base_day.num_days_from_monday(), base_day.num_days_from(Weekday::Mon)); - assert_eq!(base_day.num_days_from_sunday(), base_day.num_days_from(Weekday::Sun)); - - assert_eq!(base_day.num_days_from(base_day), 0); - - assert_eq!(base_day.num_days_from(base_day.pred()), 1); - assert_eq!(base_day.num_days_from(base_day.pred().pred()), 2); - assert_eq!(base_day.num_days_from(base_day.pred().pred().pred()), 3); - assert_eq!(base_day.num_days_from(base_day.pred().pred().pred().pred()), 4); - assert_eq!(base_day.num_days_from(base_day.pred().pred().pred().pred().pred()), 5); - assert_eq!( - base_day.num_days_from(base_day.pred().pred().pred().pred().pred().pred()), - 6 - ); - - assert_eq!(base_day.num_days_from(base_day.succ()), 6); - assert_eq!(base_day.num_days_from(base_day.succ().succ()), 5); - assert_eq!(base_day.num_days_from(base_day.succ().succ().succ()), 4); - assert_eq!(base_day.num_days_from(base_day.succ().succ().succ().succ()), 3); - assert_eq!(base_day.num_days_from(base_day.succ().succ().succ().succ().succ()), 2); - assert_eq!( - base_day.num_days_from(base_day.succ().succ().succ().succ().succ().succ()), - 1 - ); - } - } #[test] - #[cfg(feature = "serde")] fn test_serde_serialize() { use serde_json::to_string; use Weekday::*; @@ -346,7 +332,6 @@ } #[test] - #[cfg(feature = "serde")] fn test_serde_deserialize() { use serde_json::from_str; use Weekday::*; diff -Nru temporalio-1.3.0/vendor/chrono/taplo.toml temporalio-1.3.0/vendor/chrono/taplo.toml --- temporalio-1.3.0/vendor/chrono/taplo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/chrono/taplo.toml 1970-01-01 00:00:00.000000000 +0000 @@ -1,4 +0,0 @@ -include = ["deny.toml", "**/Cargo.toml"] - -[formatting] -inline_table_expand = false diff -Nru temporalio-1.3.0/vendor/chrono/tests/dateutils.rs temporalio-1.3.0/vendor/chrono/tests/dateutils.rs --- temporalio-1.3.0/vendor/chrono/tests/dateutils.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/chrono/tests/dateutils.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,8 +1,14 @@ -#![cfg(all(unix, feature = "clock", feature = "std"))] +#[cfg(unix)] +use chrono::offset::TimeZone; +#[cfg(unix)] +use chrono::Local; +#[cfg(unix)] +use chrono::{Datelike, NaiveDate, NaiveDateTime, Timelike}; -use chrono::{Datelike, Local, NaiveDate, NaiveDateTime, NaiveTime, TimeZone, Timelike}; -use std::{path, process, thread}; +#[cfg(unix)] +use std::{path, process}; +#[cfg(unix)] fn verify_against_date_command_local(path: &'static str, dt: NaiveDateTime) { let output = process::Command::new(path) .arg("-d") @@ -52,10 +58,10 @@ /// for testing only #[allow(dead_code)] #[cfg(not(target_os = "aix"))] -const DATE_PATH: &str = "/usr/bin/date"; +const DATE_PATH: &'static str = "/usr/bin/date"; #[allow(dead_code)] #[cfg(target_os = "aix")] -const DATE_PATH: &str = "/opt/freeware/bin/date"; +const DATE_PATH: &'static str = "/opt/freeware/bin/date"; #[cfg(test)] /// test helper to sanity check the date command behaves as expected @@ -75,6 +81,7 @@ } #[test] +#[cfg(unix)] fn try_verify_against_date_command() { if !path::Path::new(DATE_PATH).exists() { eprintln!("date command {:?} not found, skipping", DATE_PATH); @@ -82,26 +89,31 @@ } assert_run_date_version(); + let mut date = NaiveDate::from_ymd_opt(1975, 1, 1).unwrap().and_hms_opt(0, 0, 0).unwrap(); + eprintln!( - "Run command {:?} for every hour from 1975 to 2077, skipping some years...", + "Run command {:?} for every hour from {} to 2077, skipping some years...", DATE_PATH, + date.year() ); - - let mut children = vec![]; - for year in [1975, 1976, 1977, 2020, 2021, 2022, 2073, 2074, 2075, 2076, 2077].iter() { - children.push(thread::spawn(|| { - let mut date = NaiveDate::from_ymd_opt(*year, 1, 1).unwrap().and_time(NaiveTime::MIN); - let end = NaiveDate::from_ymd_opt(*year + 1, 1, 1).unwrap().and_time(NaiveTime::MIN); - while date <= end { - verify_against_date_command_local(DATE_PATH, date); - date += chrono::Duration::hours(1); + let mut count: u64 = 0; + let mut year_at = date.year(); + while date.year() < 2078 { + if (1975..=1977).contains(&date.year()) + || (2020..=2022).contains(&date.year()) + || (2073..=2077).contains(&date.year()) + { + if date.year() != year_at { + eprintln!("at year {}...", date.year()); + year_at = date.year(); } - })); - } - for child in children { - // Wait for the thread to finish. Returns a result. - let _ = child.join(); + verify_against_date_command_local(DATE_PATH, date); + count += 1; + } + + date += chrono::Duration::hours(1); } + eprintln!("Command {:?} was run {} times", DATE_PATH, count); } #[cfg(target_os = "linux")] diff -Nru temporalio-1.3.0/vendor/chrono/tests/wasm.rs temporalio-1.3.0/vendor/chrono/tests/wasm.rs --- temporalio-1.3.0/vendor/chrono/tests/wasm.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/chrono/tests/wasm.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,19 +1,11 @@ -//! Run this test with: -//! `env TZ="$(date +%z)" NOW="$(date +%s)" wasm-pack test --node -- --features wasmbind` -//! -//! The `TZ` and `NOW` variables are used to compare the results inside the WASM environment with -//! the host system. -//! The check will fail if the local timezone does not match one of the timezones defined below. - #![cfg(all( target_arch = "wasm32", feature = "wasmbind", - feature = "clock", not(any(target_os = "emscripten", target_os = "wasi")) ))] -use chrono::prelude::*; -use wasm_bindgen_test::*; +use self::chrono::prelude::*; +use self::wasm_bindgen_test::*; #[wasm_bindgen_test] fn now() { @@ -60,7 +52,7 @@ let dt = DateTime::::from(now.clone()); - assert_eq!(now.get_time() as i64, dt.timestamp_millis()); + assert_eq!(now.get_time() as i64, dt.timestamp_millis_opt().unwrap()); } #[wasm_bindgen_test] @@ -80,7 +72,7 @@ let js_date = js_sys::Date::from(time); assert_eq!(js_date.get_utc_full_year(), 2020); - assert_eq!(js_date.get_utc_month(), 11); // months are numbered 0..=11 + assert_eq!(js_date.get_utc_month(), 12); assert_eq!(js_date.get_utc_date(), 1); assert_eq!(js_date.get_utc_hours(), 3); assert_eq!(js_date.get_utc_minutes(), 1); diff -Nru temporalio-1.3.0/vendor/chrono/tests/win_bindings.rs temporalio-1.3.0/vendor/chrono/tests/win_bindings.rs --- temporalio-1.3.0/vendor/chrono/tests/win_bindings.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/chrono/tests/win_bindings.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,22 +0,0 @@ -#![cfg(all(windows, feature = "clock", feature = "std"))] - -use std::fs; -use windows_bindgen::bindgen; - -#[test] -fn gen_bindings() { - let input = "src/offset/local/win_bindings.txt"; - let output = "src/offset/local/win_bindings.rs"; - let existing = fs::read_to_string(output).unwrap(); - - let log = bindgen(["--etc", input]).unwrap(); - eprintln!("{}", log); - - // Check the output is the same as before. - // Depending on the git configuration the file may have been checked out with `\r\n` newlines or - // with `\n`. Compare line-by-line to ignore this difference. - let new = fs::read_to_string(output).unwrap(); - if !new.lines().eq(existing.lines()) { - panic!("generated file `{}` is changed.", output); - } -} diff -Nru temporalio-1.3.0/vendor/cpufeatures/.cargo-checksum.json temporalio-1.3.0/vendor/cpufeatures/.cargo-checksum.json --- temporalio-1.3.0/vendor/cpufeatures/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/cpufeatures/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"CHANGELOG.md":"716d1f451171228b69bdfd44e7da2a5cf55e6837ad49ab88ad45ff5cf51446ac","Cargo.toml":"32336c5ea5f8efbfaf6aab2cb40861a5cd85de14e32902d49ff1bf3bc3a9f932","LICENSE-APACHE":"a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5","LICENSE-MIT":"904801faf3f1850328af8e1aa1047b9190cc22ed40df5c87f2d93d17f847ef67","README.md":"bc4339a8bfc78dc28ab4782cc539629bc6af72e724543f3e15d173c705e2977a","src/aarch64.rs":"ca05d0dca4bb1aad54c275934bf2761fecc92525aa045f333d55d74f23583af4","src/lib.rs":"1a192980dfc9a2658bea08a98d46f6819a0ffaca6544cabfa6870af09ae7d310","src/loongarch64.rs":"489db8bc4c3ffc3b89ae8ecf94181c5d456d139d66bb74403a597ee4cb58ca2c","src/miri.rs":"acf1a7e7ae31a1de07941084c6b589a2d4c6ea5f87012c811592c865d04c02cb","src/x86.rs":"48454ddb42ada703a7c2401b3e373c0beff1ab662c335ebf8b9a2799a1fedf5c","tests/aarch64.rs":"f6f0f55d821dbcac61e54cec8d35bf944cd09f90f3422eee2b6d55a1e9899635","tests/loongarch64.rs":"1b95140c68f673721699dcb40176540818641785f7863a99214bcad2014aa181","tests/x86.rs":"fcf476ca6ebd0845ab547cea4fe40c2ba2a2324c024264d9a86f666586f3a480"},"package":"ce420fe07aecd3e67c5f910618fe65e94158f6dcc0adf44e00d69ce2bdfe0fd0"} \ No newline at end of file +{"files":{"CHANGELOG.md":"f2de496b0e40963bcb39774842d8c9a485c26b2a3cdbf86cb6f55ef7d106ac45","Cargo.toml":"9c0b8805f68900917ea470cd4c70257958f93f5d380b22a1fee299ab0c86a3c0","LICENSE-APACHE":"a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5","LICENSE-MIT":"904801faf3f1850328af8e1aa1047b9190cc22ed40df5c87f2d93d17f847ef67","README.md":"3a7469c8306dce5e6c1b4eb3f9d7290174e57e9118911e016a06192bc89ae67f","src/aarch64.rs":"03780cca3518699dd0f57345c9fda1cae7d73a3a77c7f1802f7f172204417694","src/lib.rs":"6e5c3f23006241c3135e8df7d25fb68ca8ee768d065a08db7910a4fcaa786a28","src/miri.rs":"acf1a7e7ae31a1de07941084c6b589a2d4c6ea5f87012c811592c865d04c02cb","src/x86.rs":"48454ddb42ada703a7c2401b3e373c0beff1ab662c335ebf8b9a2799a1fedf5c","tests/aarch64.rs":"bdabbe67316c128b57003ba5faa07707b5f339b1f3e984da4bc383cc93c2bedd","tests/x86.rs":"fcf476ca6ebd0845ab547cea4fe40c2ba2a2324c024264d9a86f666586f3a480"},"package":"a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/cpufeatures/Cargo.toml temporalio-1.3.0/vendor/cpufeatures/Cargo.toml --- temporalio-1.3.0/vendor/cpufeatures/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/cpufeatures/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -12,11 +12,11 @@ [package] edition = "2018" name = "cpufeatures" -version = "0.2.11" +version = "0.2.9" authors = ["RustCrypto Developers"] description = """ -Lightweight runtime CPU feature detection for aarch64, loongarch64, and x86/x86_64 targets, -with no_std support and support for mobile targets including Android and iOS +Lightweight runtime CPU feature detection for x86/x86_64 and aarch64 with +no_std support and support for mobile targets including Android and iOS """ documentation = "https://docs.rs/cpufeatures" readme = "README.md" @@ -32,13 +32,10 @@ repository = "https://github.com/RustCrypto/utils" [target.aarch64-linux-android.dependencies.libc] -version = "0.2.149" +version = "0.2.95" [target."cfg(all(target_arch = \"aarch64\", target_os = \"linux\"))".dependencies.libc] -version = "0.2.149" +version = "0.2.95" [target."cfg(all(target_arch = \"aarch64\", target_vendor = \"apple\"))".dependencies.libc] -version = "0.2.149" - -[target."cfg(all(target_arch = \"loongarch64\", target_os = \"linux\"))".dependencies.libc] -version = "0.2.149" +version = "0.2.95" diff -Nru temporalio-1.3.0/vendor/cpufeatures/CHANGELOG.md temporalio-1.3.0/vendor/cpufeatures/CHANGELOG.md --- temporalio-1.3.0/vendor/cpufeatures/CHANGELOG.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/cpufeatures/CHANGELOG.md 2023-10-30 19:40:00.000000000 +0000 @@ -5,18 +5,6 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## 0.2.11 (2023-10-26) -### Added -- Support for AArch64's `sm4` target feature ([#972]) - -[#972]: https://github.com/RustCrypto/utils/pull/972 - -## 0.2.10 (2023-10-20) -### Added -- LoongArch64 target support ([#955]) - -[#955]: https://github.com/RustCrypto/utils/pull/955 - ## 0.2.9 (2023-07-05) ### Added - Support for `avx512vbmi` and `avx512vbmi2` target features ([#926]) diff -Nru temporalio-1.3.0/vendor/cpufeatures/README.md temporalio-1.3.0/vendor/cpufeatures/README.md --- temporalio-1.3.0/vendor/cpufeatures/README.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/cpufeatures/README.md 2023-10-30 19:40:00.000000000 +0000 @@ -7,7 +7,7 @@ [![Project Chat][chat-image]][chat-link] [![Build Status][build-image]][build-link] -Lightweight and efficient runtime CPU feature detection for `aarch64`, `loongarch64`, and +Lightweight and efficient runtime CPU feature detection for `aarch64` and `x86`/`x86_64` targets. Supports `no_std` as well as mobile targets including iOS and Android, @@ -16,6 +16,8 @@ [Documentation][docs-link] +## Supported architectures + # Supported target architectures *NOTE: target features with an asterisk are unstable (nightly-only) and subject @@ -31,26 +33,6 @@ - `sha2`* - `sha3`* -## `loongarch64` - -Linux only (LoongArch64 does not support OS-independent feature detection) - -Target features: - -- `lam`* -- `ual`* -- `fpu`* -- `lsx`* -- `lasx`* -- `crc32`* -- `complex`* -- `crypto`* -- `lvz`* -- `lbt.x86`* -- `lbt.arm`* -- `lbt.mips`* -- `ptw`* - ## `x86`/`x86_64` OS independent and `no_std`-friendly @@ -69,8 +51,6 @@ - `avx512ifma`* - `avx512pf`* - `avx512vl`* -- `avx512vbmi`* -- `avx512vbmi2`* - `bmi1` - `bmi2` - `fma`, diff -Nru temporalio-1.3.0/vendor/cpufeatures/src/aarch64.rs temporalio-1.3.0/vendor/cpufeatures/src/aarch64.rs --- temporalio-1.3.0/vendor/cpufeatures/src/aarch64.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/cpufeatures/src/aarch64.rs 2023-10-30 19:40:00.000000000 +0000 @@ -69,7 +69,6 @@ ("aes", AES), // Enable AES support. ("sha2", SHA2), // Enable SHA1 and SHA256 support. ("sha3", SHA3), // Enable SHA512 and SHA3 support. - ("sm4", SM4), // Enable SM3 and SM4 support. } /// Linux hardware capabilities mapped to target features. @@ -86,7 +85,6 @@ pub const AES: c_ulong = libc::HWCAP_AES | libc::HWCAP_PMULL; pub const SHA2: c_ulong = libc::HWCAP_SHA2; pub const SHA3: c_ulong = libc::HWCAP_SHA3 | libc::HWCAP_SHA512; - pub const SM4: c_ulong = libc::HWCAP_SM3 | libc::HWCAP_SM4; } // Apple OS (macOS, iOS, watchOS, and tvOS) `check!` macro. diff -Nru temporalio-1.3.0/vendor/cpufeatures/src/lib.rs temporalio-1.3.0/vendor/cpufeatures/src/lib.rs --- temporalio-1.3.0/vendor/cpufeatures/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/cpufeatures/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -18,30 +18,6 @@ //! - `sha2`* //! - `sha3`* //! -//! Linux only -//! -//! - `sm4`* -//! -//! ## `loongarch64` -//! -//! Linux only (LoongArch64 does not support OS-independent feature detection) -//! -//! Target features: -//! -//! - `lam`* -//! - `ual`* -//! - `fpu`* -//! - `lsx`* -//! - `lasx`* -//! - `crc32`* -//! - `complex`* -//! - `crypto`* -//! - `lvz`* -//! - `lbt.x86`* -//! - `lbt.arm`* -//! - `lbt.mips`* -//! - `ptw`* -//! //! ## `x86`/`x86_64` //! //! OS independent and `no_std`-friendly @@ -127,29 +103,19 @@ )] #[cfg(not(miri))] -#[cfg(target_arch = "aarch64")] +#[cfg(all(target_arch = "aarch64"))] #[doc(hidden)] pub mod aarch64; #[cfg(not(miri))] -#[cfg(target_arch = "loongarch64")] -#[doc(hidden)] -pub mod loongarch64; - -#[cfg(not(miri))] #[cfg(any(target_arch = "x86", target_arch = "x86_64"))] mod x86; #[cfg(miri)] mod miri; -#[cfg(not(any( - target_arch = "aarch64", - target_arch = "loongarch64", - target_arch = "x86", - target_arch = "x86_64" -)))] -compile_error!("This crate works only on `aarch64`, `loongarch64`, `x86`, and `x86-64` targets."); +#[cfg(not(any(target_arch = "aarch64", target_arch = "x86", target_arch = "x86_64")))] +compile_error!("This crate works only on `aarch64`, `x86`, and `x86-64` targets."); /// Create module with CPU feature detection code. #[macro_export] diff -Nru temporalio-1.3.0/vendor/cpufeatures/src/loongarch64.rs temporalio-1.3.0/vendor/cpufeatures/src/loongarch64.rs --- temporalio-1.3.0/vendor/cpufeatures/src/loongarch64.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/cpufeatures/src/loongarch64.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,106 +0,0 @@ -//! LoongArch64 CPU feature detection support. -//! -//! This implementation relies on OS-specific APIs for feature detection. - -// Evaluate the given `$body` expression any of the supplied target features -// are not enabled. Otherwise returns true. -#[macro_export] -#[doc(hidden)] -macro_rules! __unless_target_features { - ($($tf:tt),+ => $body:expr ) => { - { - #[cfg(not(all($(target_feature=$tf,)*)))] - $body - - #[cfg(all($(target_feature=$tf,)*))] - true - } - }; -} - -// Linux runtime detection of target CPU features using `getauxval`. -#[cfg(target_os = "linux")] -#[macro_export] -#[doc(hidden)] -macro_rules! __detect_target_features { - ($($tf:tt),+) => {{ - let hwcaps = $crate::loongarch64::getauxval_hwcap(); - $($crate::check!(hwcaps, $tf) & )+ true - }}; -} - -/// Linux helper function for calling `getauxval` to get `AT_HWCAP`. -#[cfg(target_os = "linux")] -pub fn getauxval_hwcap() -> u64 { - unsafe { libc::getauxval(libc::AT_HWCAP) } -} - -// Linux `expand_check_macro` -#[cfg(target_os = "linux")] -macro_rules! __expand_check_macro { - ($(($name:tt, $hwcap:ident)),* $(,)?) => { - #[macro_export] - #[doc(hidden)] - macro_rules! check { - $( - ($hwcaps:expr, $name) => { - (($hwcaps & $crate::loongarch64::hwcaps::$hwcap) != 0) - }; - )* - } - }; -} - -// Linux `expand_check_macro` -#[cfg(target_os = "linux")] -__expand_check_macro! { - ("cpucfg", CPUCFG), // Enable CPUCFG support. - ("lam", LAM), // Enable LAM support. - ("ual", UAL), // Enable UAL support. - ("fpu", FPU), // Enable FPU support. - ("lsx", LSX), // Enable LSX support. - ("lasx", LASX), // Enable LASX support. - ("crc32", CRC32), // Enable CRC32 support. - ("complex", COMPLEX), // Enable COMPLEX support. - ("crypto", CRYPTO), // Enable CRYPTO support. - ("lvz", LVZ), // Enable LVZ support. - ("lbt.x86", LBT_X86), // Enable LBT_X86 support. - ("lbt.arm", LBT_ARM), // Enable LBT_ARM support. - ("lbt.mips", LBT_MIPS), // Enable LBT_MIPS support. - ("ptw", PTW), // Enable PTW support. -} - -/// Linux hardware capabilities mapped to target features. -/// -/// Note that LLVM target features are coarser grained than what Linux supports -/// and imply more capabilities under each feature. This module attempts to -/// provide that mapping accordingly. -#[cfg(target_os = "linux")] -pub mod hwcaps { - use libc::c_ulong; - - pub const CPUCFG: c_ulong = libc::HWCAP_CPUCFG; - pub const LAM: c_ulong = libc::HWCAP_LAM; - pub const UAL: c_ulong = libc::HWCAP_UAL; - pub const FPU: c_ulong = libc::HWCAP_FPU; - pub const LSX: c_ulong = libc::HWCAP_LSX; - pub const LASX: c_ulong = libc::HWCAP_LASX; - pub const CRC32: c_ulong = libc::HWCAP_CRC32; - pub const COMPLEX: c_ulong = libc::HWCAP_COMPLEX; - pub const CRYPTO: c_ulong = libc::HWCAP_CRYPTO; - pub const LVZ: c_ulong = libc::HWCAP_LVZ; - pub const LBT_X86: c_ulong = libc::HWCAP_LBT_X86; - pub const LBT_ARM: c_ulong = libc::HWCAP_LBT_ARM; - pub const LBT_MIPS: c_ulong = libc::HWCAP_LBT_MIPS; - pub const PTW: c_ulong = libc::HWCAP_PTW; -} - -// On other targets, runtime CPU feature detection is unavailable -#[cfg(not(target_os = "linux"))] -#[macro_export] -#[doc(hidden)] -macro_rules! __detect_target_features { - ($($tf:tt),+) => { - false - }; -} diff -Nru temporalio-1.3.0/vendor/cpufeatures/tests/aarch64.rs temporalio-1.3.0/vendor/cpufeatures/tests/aarch64.rs --- temporalio-1.3.0/vendor/cpufeatures/tests/aarch64.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/cpufeatures/tests/aarch64.rs 2023-10-30 19:40:00.000000000 +0000 @@ -2,7 +2,7 @@ #![cfg(target_arch = "aarch64")] -cpufeatures::new!(armcaps, "aes", "sha2", "sha3", "sm4"); +cpufeatures::new!(armcaps, "aes", "sha2", "sha3"); #[test] fn init() { diff -Nru temporalio-1.3.0/vendor/cpufeatures/tests/loongarch64.rs temporalio-1.3.0/vendor/cpufeatures/tests/loongarch64.rs --- temporalio-1.3.0/vendor/cpufeatures/tests/loongarch64.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/cpufeatures/tests/loongarch64.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,20 +0,0 @@ -//! LoongArch64 tests - -#![cfg(target_arch = "loongarch64")] - -cpufeatures::new!( - lacaps, "cpucfg", "lam", "ual", "fpu", "lsx", "lasx", "crc32", "complex", "crypto", "lvz", - "lbt.x86", "lbt.arm", "lbt.mips", "ptw" -); - -#[test] -fn init() { - let token: lacaps::InitToken = lacaps::init(); - assert_eq!(token.get(), lacaps::get()); -} - -#[test] -fn init_get() { - let (token, val) = lacaps::init_get(); - assert_eq!(val, token.get()); -} diff -Nru temporalio-1.3.0/vendor/dashmap/.cargo-checksum.json temporalio-1.3.0/vendor/dashmap/.cargo-checksum.json --- temporalio-1.3.0/vendor/dashmap/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/dashmap/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"Cargo.toml":"c758b23fe682b4e447bc5350e1e838577ed6ec4ec8833607ff16f57f1d0495a7","LICENSE":"16692e8cee4aa06e3913787497eba2d47c42002014136f5da67be6ee640e28a3","README.md":"7f7b4edce5b4baabf639df517a66bfa2cd8ff759f09060c17fe6da54531b5819","rust-toolchain.toml":"8e14ad3424881d09f3b219e947b4b95f12726295abde287f91d10af8c5a7dd13","src/arbitrary.rs":"236abf377cbae8393961e0e4327ce2515d5aeeddfb1fabb1f2035c69dfea290c","src/iter.rs":"086a7be951241253b3ea60c64fb324aaa32742038461994e3946bdd8712ce452","src/iter_set.rs":"5327da951dc93d30b293aeb7a805666ee4b8e6364881348ab5d86b23c29a0e13","src/lib.rs":"6ec142f4ad577da1e399738a4bbcdee0baae5290d5b5274e6d295d92bcf113ba","src/lock.rs":"22b1013ee3cbd1598c26403552faf8e5b44fe98a8ff4c8812da15d57bdeee4b3","src/mapref/entry.rs":"c03777d2b863a98fea517ad97037741930c766e7cbd17aea2aab1fbf0e11c719","src/mapref/mod.rs":"15bd45cfc642a9e3e77bbfbf2d9fad9c5fac0ff6904214a3c501e262242ec8b0","src/mapref/multiple.rs":"17a87879229d78f75d71817d100aa0a210d764d6b66e4a05b17a3e092d17e306","src/mapref/one.rs":"0026aff85dd5411b5c181396b8b5b9a9cbc524720a8f409fd4aa62c1b5501146","src/rayon/map.rs":"68d541bb6c9372fe13e44f09d9fcba4f214f52f16649e326486f8976dc03cd99","src/rayon/read_only.rs":"99dc0083f6840f59b2090bc9c5f9767a44088832e63935cb8f6bc7eca8b86102","src/rayon/set.rs":"21fe2ca8c58c8ff1bc753f5e2eb6131afd598211eea375f2ac7190cd0f9abcba","src/read_only.rs":"012a6e44195125eb3c0fd028123b348f5294c7e083bf1c3c0bf8400201c35e27","src/serde.rs":"9854d44b05ebe400ef8ac8ea9c8f140e1c59870d74aaf3ccaf72e82c6dc40905","src/set.rs":"cf75d91db42d18afec314afe9a461cc6e86ddedd11ff9248ed7345780948e5e0","src/setref/mod.rs":"cc39e406a333dc6c04398f4b1336fb400e3a8360c387466d8a91f5d7f4ed40a7","src/setref/multiple.rs":"2270749e83f80dbb4761448f0629ecd02b0b4268f76834236d1167844e6d5e37","src/setref/one.rs":"69738583f2a160f3907e540277ccd88e0036406b3ead66b3d4015ddd938d6937","src/t.rs":"9b40ebfba22369813bf159ed60fa70e742ae72bfaec6aee91a716cba91cb8f0d","src/try_result.rs":"81d1dd396f70b0aa2a6e1969851b706cbfdfb09c802ac9d33dcace882aa28dd1","src/util.rs":"7a8096a713cf04e60d6c9e38cd366314ed74472abab4bb8a3a9ed081a0e0301b"},"package":"978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856"} \ No newline at end of file +{"files":{"Cargo.toml":"413bd1d758f9c3018c60de376426c92299c4736ad5b77f2b342f4361c2403bb7","LICENSE":"16692e8cee4aa06e3913787497eba2d47c42002014136f5da67be6ee640e28a3","README.md":"3f21f1dab0ec2811209a8c9044b5573b0738b2dc76e5956e89d4719d366b8936","rust-toolchain.toml":"04efea63f01dbfbc8fc3dad7a48896d0a1ef294a15ce5855121845b60fd6d768","src/arbitrary.rs":"236abf377cbae8393961e0e4327ce2515d5aeeddfb1fabb1f2035c69dfea290c","src/iter.rs":"086a7be951241253b3ea60c64fb324aaa32742038461994e3946bdd8712ce452","src/iter_set.rs":"5327da951dc93d30b293aeb7a805666ee4b8e6364881348ab5d86b23c29a0e13","src/lib.rs":"cf60ab9db449b7b00e2d38385034fa070ecc11ccb06435d7900625afc85359d0","src/lock.rs":"22b1013ee3cbd1598c26403552faf8e5b44fe98a8ff4c8812da15d57bdeee4b3","src/mapref/entry.rs":"c03777d2b863a98fea517ad97037741930c766e7cbd17aea2aab1fbf0e11c719","src/mapref/mod.rs":"15bd45cfc642a9e3e77bbfbf2d9fad9c5fac0ff6904214a3c501e262242ec8b0","src/mapref/multiple.rs":"17a87879229d78f75d71817d100aa0a210d764d6b66e4a05b17a3e092d17e306","src/mapref/one.rs":"0026aff85dd5411b5c181396b8b5b9a9cbc524720a8f409fd4aa62c1b5501146","src/rayon/map.rs":"68d541bb6c9372fe13e44f09d9fcba4f214f52f16649e326486f8976dc03cd99","src/rayon/read_only.rs":"99dc0083f6840f59b2090bc9c5f9767a44088832e63935cb8f6bc7eca8b86102","src/rayon/set.rs":"21fe2ca8c58c8ff1bc753f5e2eb6131afd598211eea375f2ac7190cd0f9abcba","src/read_only.rs":"678ed7279bd366ce0af4c6b5d4636c026e3b06447edab8871db142ec0f48db18","src/serde.rs":"9854d44b05ebe400ef8ac8ea9c8f140e1c59870d74aaf3ccaf72e82c6dc40905","src/set.rs":"cf75d91db42d18afec314afe9a461cc6e86ddedd11ff9248ed7345780948e5e0","src/setref/mod.rs":"cc39e406a333dc6c04398f4b1336fb400e3a8360c387466d8a91f5d7f4ed40a7","src/setref/multiple.rs":"2270749e83f80dbb4761448f0629ecd02b0b4268f76834236d1167844e6d5e37","src/setref/one.rs":"69738583f2a160f3907e540277ccd88e0036406b3ead66b3d4015ddd938d6937","src/t.rs":"9b40ebfba22369813bf159ed60fa70e742ae72bfaec6aee91a716cba91cb8f0d","src/try_result.rs":"81d1dd396f70b0aa2a6e1969851b706cbfdfb09c802ac9d33dcace882aa28dd1","src/util.rs":"7a8096a713cf04e60d6c9e38cd366314ed74472abab4bb8a3a9ed081a0e0301b"},"package":"edd72493923899c6f10c641bdbdeddc7183d6396641d99c1a0d1597f37f92e28"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/dashmap/Cargo.toml temporalio-1.3.0/vendor/dashmap/Cargo.toml --- temporalio-1.3.0/vendor/dashmap/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/dashmap/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -11,9 +11,9 @@ [package] edition = "2018" -rust-version = "1.65" +rust-version = "1.64" name = "dashmap" -version = "5.5.3" +version = "5.5.1" authors = ["Acrimon "] description = "Blazing fast concurrent HashMap for Rust." homepage = "https://github.com/xacrimon/dashmap" @@ -64,7 +64,7 @@ optional = true [dependencies.serde] -version = "1.0.188" +version = "1.0.171" features = ["derive"] optional = true diff -Nru temporalio-1.3.0/vendor/dashmap/README.md temporalio-1.3.0/vendor/dashmap/README.md --- temporalio-1.3.0/vendor/dashmap/README.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/dashmap/README.md 2023-10-30 19:40:00.000000000 +0000 @@ -20,7 +20,7 @@ [![downloads](https://img.shields.io/crates/d/dashmap)](https://crates.io/crates/dashmap) -[![minimum rustc version](https://img.shields.io/badge/rustc-1.65-orange.svg)](https://crates.io/crates/dashmap) +[![minimum rustc version](https://img.shields.io/badge/rustc-1.64-orange.svg)](https://crates.io/crates/dashmap) ## Cargo features diff -Nru temporalio-1.3.0/vendor/dashmap/rust-toolchain.toml temporalio-1.3.0/vendor/dashmap/rust-toolchain.toml --- temporalio-1.3.0/vendor/dashmap/rust-toolchain.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/dashmap/rust-toolchain.toml 2023-10-30 19:40:00.000000000 +0000 @@ -1,4 +1,4 @@ [toolchain] -channel = "1.65" +channel = "stable-2022-09-22" components = ["rustfmt", "clippy"] profile = "minimal" diff -Nru temporalio-1.3.0/vendor/dashmap/src/lib.rs temporalio-1.3.0/vendor/dashmap/src/lib.rs --- temporalio-1.3.0/vendor/dashmap/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/dashmap/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -34,6 +34,7 @@ use core::hash::{BuildHasher, Hash, Hasher}; use core::iter::FromIterator; use core::ops::{BitAnd, BitOr, Shl, Shr, Sub}; +use hashbrown::hash_map::RawEntryMut; use iter::{Iter, IterMut, OwningIter}; use mapref::entry::{Entry, OccupiedEntry, VacantEntry}; use mapref::multiple::RefMulti; @@ -295,11 +296,15 @@ /// Hash a given item to produce a usize. /// Uses the provided or default HashBuilder. pub fn hash_usize(&self, item: &T) -> usize { + self.hash_u64(item) as usize + } + + fn hash_u64(&self, item: &T) -> u64 { let mut hasher = self.hasher.build_hasher(); item.hash(&mut hasher); - hasher.finish() as usize + hasher.finish() } cfg_if! { @@ -916,9 +921,9 @@ } fn _insert(&self, key: K, value: V) -> Option { - let hash = self.hash_usize(&key); + let hash = self.hash_u64(&key); - let idx = self.determine_shard(hash); + let idx = self.determine_shard(hash as usize); let mut shard = unsafe { self._yield_write_shard(idx) }; @@ -932,9 +937,9 @@ K: Borrow, Q: Hash + Eq + ?Sized, { - let hash = self.hash_usize(&key); + let hash = self.hash_u64(&key); - let idx = self.determine_shard(hash); + let idx = self.determine_shard(hash as usize); let mut shard = unsafe { self._yield_write_shard(idx) }; @@ -946,22 +951,20 @@ K: Borrow, Q: Hash + Eq + ?Sized, { - let hash = self.hash_usize(&key); + let hash = self.hash_u64(&key); - let idx = self.determine_shard(hash); + let idx = self.determine_shard(hash as usize); let mut shard = unsafe { self._yield_write_shard(idx) }; - if let Some((kptr, vptr)) = shard.get_key_value(key) { - unsafe { - let kptr: *const K = kptr; - let vptr: *mut V = vptr.as_ptr(); - - if f(&*kptr, &mut *vptr) { - shard.remove_entry(key).map(|(k, v)| (k, v.into_inner())) - } else { - None - } + if let RawEntryMut::Occupied(entry) = + shard.raw_entry_mut().from_key_hashed_nocheck(hash, key) + { + if f(entry.key(), entry.get().get()) { + let (k, v) = entry.remove_entry(); + Some((k, v.into_inner())) + } else { + None } } else { None @@ -973,22 +976,21 @@ K: Borrow, Q: Hash + Eq + ?Sized, { - let hash = self.hash_usize(&key); + let hash = self.hash_u64(&key); - let idx = self.determine_shard(hash); + let idx = self.determine_shard(hash as usize); let mut shard = unsafe { self._yield_write_shard(idx) }; - if let Some((kptr, vptr)) = shard.get_key_value(key) { - unsafe { - let kptr: *const K = kptr; - let vptr: *mut V = vptr.as_ptr(); - - if f(&*kptr, &mut *vptr) { - shard.remove_entry(key).map(|(k, v)| (k, v.into_inner())) - } else { - None - } + if let RawEntryMut::Occupied(mut entry) = + shard.raw_entry_mut().from_key_hashed_nocheck(hash, key) + { + let (k, v) = entry.get_key_value_mut(); + if f(k, v.get_mut()) { + let (k, v) = entry.remove_entry(); + Some((k, v.into_inner())) + } else { + None } } else { None @@ -1008,13 +1010,13 @@ K: Borrow, Q: Hash + Eq + ?Sized, { - let hash = self.hash_usize(&key); + let hash = self.hash_u64(&key); - let idx = self.determine_shard(hash); + let idx = self.determine_shard(hash as usize); let shard = unsafe { self._yield_read_shard(idx) }; - if let Some((kptr, vptr)) = shard.get_key_value(key) { + if let Some((kptr, vptr)) = shard.raw_entry().from_key_hashed_nocheck(hash, key) { unsafe { let kptr: *const K = kptr; let vptr: *const V = vptr.get(); @@ -1030,16 +1032,18 @@ K: Borrow, Q: Hash + Eq + ?Sized, { - let hash = self.hash_usize(&key); + let hash = self.hash_u64(&key); - let idx = self.determine_shard(hash); + let idx = self.determine_shard(hash as usize); - let shard = unsafe { self._yield_write_shard(idx) }; + let mut shard = unsafe { self._yield_write_shard(idx) }; - if let Some((kptr, vptr)) = shard.get_key_value(key) { + if let RawEntryMut::Occupied(mut entry) = + shard.raw_entry_mut().from_key_hashed_nocheck(hash, key) + { unsafe { - let kptr: *const K = kptr; - let vptr: *mut V = vptr.as_ptr(); + let kptr: *const K = entry.key(); + let vptr: *mut V = entry.get_mut().as_ptr(); Some(RefMut::new(shard, kptr, vptr)) } } else { @@ -1052,16 +1056,16 @@ K: Borrow, Q: Hash + Eq + ?Sized, { - let hash = self.hash_usize(&key); + let hash = self.hash_u64(&key); - let idx = self.determine_shard(hash); + let idx = self.determine_shard(hash as usize); let shard = match unsafe { self._try_yield_read_shard(idx) } { Some(shard) => shard, None => return TryResult::Locked, }; - if let Some((kptr, vptr)) = shard.get_key_value(key) { + if let Some((kptr, vptr)) = shard.raw_entry().from_key_hashed_nocheck(hash, key) { unsafe { let kptr: *const K = kptr; let vptr: *const V = vptr.get(); @@ -1077,16 +1081,16 @@ K: Borrow, Q: Hash + Eq + ?Sized, { - let hash = self.hash_usize(&key); + let hash = self.hash_u64(&key); - let idx = self.determine_shard(hash); + let idx = self.determine_shard(hash as usize); let shard = match unsafe { self._try_yield_write_shard(idx) } { Some(shard) => shard, None => return TryResult::Locked, }; - if let Some((kptr, vptr)) = shard.get_key_value(key) { + if let Some((kptr, vptr)) = shard.raw_entry().from_key_hashed_nocheck(hash, key) { unsafe { let kptr: *const K = kptr; let vptr: *mut V = vptr.as_ptr(); @@ -1145,13 +1149,13 @@ } fn _entry(&'a self, key: K) -> Entry<'a, K, V, S> { - let hash = self.hash_usize(&key); + let hash = self.hash_u64(&key); - let idx = self.determine_shard(hash); + let idx = self.determine_shard(hash as usize); let shard = unsafe { self._yield_write_shard(idx) }; - if let Some((kptr, vptr)) = shard.get_key_value(&key) { + if let Some((kptr, vptr)) = shard.raw_entry().from_key_hashed_nocheck(hash, &key) { unsafe { let kptr: *const K = kptr; let vptr: *mut V = vptr.as_ptr(); @@ -1163,16 +1167,16 @@ } fn _try_entry(&'a self, key: K) -> Option> { - let hash = self.hash_usize(&key); + let hash = self.hash_u64(&key); - let idx = self.determine_shard(hash); + let idx = self.determine_shard(hash as usize); let shard = match unsafe { self._try_yield_write_shard(idx) } { Some(shard) => shard, None => return None, }; - if let Some((kptr, vptr)) = shard.get_key_value(&key) { + if let Some((kptr, vptr)) = shard.raw_entry().from_key_hashed_nocheck(hash, &key) { unsafe { let kptr: *const K = kptr; let vptr: *mut V = vptr.as_ptr(); diff -Nru temporalio-1.3.0/vendor/dashmap/src/read_only.rs temporalio-1.3.0/vendor/dashmap/src/read_only.rs --- temporalio-1.3.0/vendor/dashmap/src/read_only.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/dashmap/src/read_only.rs 2023-10-30 19:40:00.000000000 +0000 @@ -61,13 +61,7 @@ K: Borrow, Q: Hash + Eq + ?Sized, { - let hash = self.map.hash_usize(&key); - - let idx = self.map.determine_shard(hash); - - let shard = unsafe { self.map._get_read_shard(idx) }; - - shard.contains_key(key) + self.get(key).is_some() } /// Returns a reference to the value corresponding to the key. @@ -76,13 +70,7 @@ K: Borrow, Q: Hash + Eq + ?Sized, { - let hash = self.map.hash_usize(&key); - - let idx = self.map.determine_shard(hash); - - let shard = unsafe { self.map._get_read_shard(idx) }; - - shard.get(key).map(|v| v.get()) + self.get_key_value(key).map(|(_k, v)| v) } /// Returns the key-value pair corresponding to the supplied key. @@ -91,13 +79,16 @@ K: Borrow, Q: Hash + Eq + ?Sized, { - let hash = self.map.hash_usize(&key); + let hash = self.map.hash_u64(&key); - let idx = self.map.determine_shard(hash); + let idx = self.map.determine_shard(hash as usize); let shard = unsafe { self.map._get_read_shard(idx) }; - shard.get_key_value(key).map(|(k, v)| (k, v.get())) + shard + .raw_entry() + .from_key_hashed_nocheck(hash, key) + .map(|(k, v)| (k, v.get())) } fn shard_read_iter(&'a self) -> impl Iterator> + 'a { diff -Nru temporalio-1.3.0/vendor/erased-serde/build.rs temporalio-1.3.0/vendor/erased-serde/build.rs --- temporalio-1.3.0/vendor/erased-serde/build.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/erased-serde/build.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,34 @@ +use std::env; +use std::process::Command; +use std::str; + +fn main() { + println!("cargo:rerun-if-changed=build.rs"); + + let compiler = match rustc_minor_version() { + Some(compiler) => compiler, + None => return, + }; + + if compiler < 36 { + // https://doc.rust-lang.org/std/mem/union.MaybeUninit.html + println!("cargo:rustc-cfg=no_maybe_uninit"); + } + + if compiler < 52 { + // #![deny(unsafe_op_in_unsafe_fn)]. + // https://github.com/rust-lang/rust/issues/71668 + println!("cargo:rustc-cfg=no_unsafe_op_in_unsafe_fn_lint"); + } +} + +fn rustc_minor_version() -> Option { + let rustc = env::var_os("RUSTC")?; + let output = Command::new(rustc).arg("--version").output().ok()?; + let version = str::from_utf8(&output.stdout).ok()?; + let mut pieces = version.split('.'); + if pieces.next() != Some("rustc 1") { + return None; + } + pieces.next()?.parse().ok() +} diff -Nru temporalio-1.3.0/vendor/erased-serde/.cargo-checksum.json temporalio-1.3.0/vendor/erased-serde/.cargo-checksum.json --- temporalio-1.3.0/vendor/erased-serde/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/erased-serde/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"Cargo.toml":"de39afb1c0cf20ecc92981167970609c3d9cbb4a8e1c8fe02e6a9986f85807ed","LICENSE-APACHE":"62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","README.md":"f6b87ecbc2801e77cbd1a52b3724e1e665d78222466fcb1460e6b96cb4ee42ac","src/any.rs":"66e1b5dadbfe1d744fad7d59b5ba545fba0c242e3293a7531cccf4228583acf4","src/de.rs":"f232f3096e8b5d5e4fcc83a5ef330d3a0ed7169388f99827d3f2340db6140840","src/error.rs":"f433eb3f6cce216e17f1d0d6ffc218185f72ea8f47eef97dd265f910098d6d84","src/features_check/error.rs":"1f2b5d89f9d59ad84a9b77566f9446d36ce430e45eaffdcc30701e8e4de289b9","src/features_check/mod.rs":"2209f8d5c46b50c8a3b8dc22338dcaf0135d192e8b05d2f456cbe6a73104e958","src/lib.rs":"a1c90d18a80b1666d051a1528135819aead0e58ec0022e49293ec137ac181bca","src/macros.rs":"49a81da2c9d1d30f90fbb098f80a1087f452f2b040e8acdaea22882be6f7525f","src/map.rs":"56f8817b57c5b144575d2c20d3976adb90e1d56d5128cb3fda88c103144fd5da","src/private.rs":"86d585e6d55e9f4752631d5af74cb857aabf7bfe5f21090e5664b4e3cfb4e69f","src/ser.rs":"637348ed7e53c59787370f04953e3a20af72ddc324fc8694483caa9a526b8b6f","tests/compiletest.rs":"022a8e400ef813d7ea1875b944549cee5125f6a995dc33e93b48cba3e1b57bd1","tests/readme.rs":"5912a854d3c2d14d9da6b014c7af611b21217c9d5eadec3a874be41945742196","tests/traitobject.rs":"bbaae0d969b5b971e29efa16f7166850944006dc85abf6fa212e31f5e27d4cd0","tests/ui/missing-supertrait.rs":"4660ac0656579f2d7e4186c4a2158ac96a72b15c136cf06840be3812412c187d","tests/ui/missing-supertrait.stderr":"86edc9111421f57d7d59001a8a4e3b5266dc8200345dbae4df00a128bfe7aa6c"},"package":"6c138974f9d5e7fe373eb04df7cae98833802ae4b11c24ac7039a21d5af4b26c"} \ No newline at end of file +{"files":{"Cargo.toml":"0b0bc37ffa7f4dcc85048f8e5c25ecc1da35bf1d9b20969cb790bd3f600c31cf","LICENSE-APACHE":"62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","README.md":"f6b87ecbc2801e77cbd1a52b3724e1e665d78222466fcb1460e6b96cb4ee42ac","build.rs":"2f7dab0f853b3e0a54f0dd82d386a51fbff11b351ebe6eb3ac12c859a06c4f8f","src/any.rs":"227965cb488f2b27e580ddcfacafd2959fad94f2f360d53e114c0c364288dc98","src/de.rs":"f232f3096e8b5d5e4fcc83a5ef330d3a0ed7169388f99827d3f2340db6140840","src/error.rs":"f433eb3f6cce216e17f1d0d6ffc218185f72ea8f47eef97dd265f910098d6d84","src/features_check/error.rs":"1f2b5d89f9d59ad84a9b77566f9446d36ce430e45eaffdcc30701e8e4de289b9","src/features_check/mod.rs":"2209f8d5c46b50c8a3b8dc22338dcaf0135d192e8b05d2f456cbe6a73104e958","src/lib.rs":"d2d97c7fe5d17cd0841dbd86dac20faf10b7d3e77b0b308bdee3b5b388a9e773","src/macros.rs":"49a81da2c9d1d30f90fbb098f80a1087f452f2b040e8acdaea22882be6f7525f","src/map.rs":"56f8817b57c5b144575d2c20d3976adb90e1d56d5128cb3fda88c103144fd5da","src/private.rs":"86d585e6d55e9f4752631d5af74cb857aabf7bfe5f21090e5664b4e3cfb4e69f","src/ser.rs":"637348ed7e53c59787370f04953e3a20af72ddc324fc8694483caa9a526b8b6f","tests/compiletest.rs":"022a8e400ef813d7ea1875b944549cee5125f6a995dc33e93b48cba3e1b57bd1","tests/readme.rs":"5912a854d3c2d14d9da6b014c7af611b21217c9d5eadec3a874be41945742196","tests/traitobject.rs":"bbaae0d969b5b971e29efa16f7166850944006dc85abf6fa212e31f5e27d4cd0","tests/ui/missing-supertrait.rs":"4660ac0656579f2d7e4186c4a2158ac96a72b15c136cf06840be3812412c187d","tests/ui/missing-supertrait.stderr":"86edc9111421f57d7d59001a8a4e3b5266dc8200345dbae4df00a128bfe7aa6c"},"package":"837c0466252947ada828b975e12daf82e18bb5444e4df87be6038d4469e2a3d2"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/erased-serde/Cargo.toml temporalio-1.3.0/vendor/erased-serde/Cargo.toml --- temporalio-1.3.0/vendor/erased-serde/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/erased-serde/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -13,7 +13,7 @@ edition = "2021" rust-version = "1.56" name = "erased-serde" -version = "0.3.31" +version = "0.3.30" authors = ["David Tolnay "] description = "Type-erased Serialize and Serializer traits" documentation = "https://docs.rs/erased-serde" diff -Nru temporalio-1.3.0/vendor/erased-serde/src/any.rs temporalio-1.3.0/vendor/erased-serde/src/any.rs --- temporalio-1.3.0/vendor/erased-serde/src/any.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/erased-serde/src/any.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,7 +1,9 @@ use crate::alloc::Box; -use core::any::TypeId; +#[cfg(no_maybe_uninit)] use core::marker::PhantomData; -use core::mem::{self, MaybeUninit}; +use core::mem; +#[cfg(not(no_maybe_uninit))] +use core::mem::MaybeUninit; use core::ptr; #[cfg(feature = "unstable-debug")] @@ -10,7 +12,7 @@ pub struct Any { value: Value, drop: unsafe fn(&mut Value), - type_id: TypeId, + fingerprint: Fingerprint, /// For panic messages only. Not used for comparison. #[cfg(feature = "unstable-debug")] @@ -23,7 +25,8 @@ } fn is_small() -> bool { - mem::size_of::() <= mem::size_of::() + cfg!(not(no_maybe_uninit)) + && mem::size_of::() <= mem::size_of::() && mem::align_of::() <= mem::align_of::() } @@ -41,7 +44,7 @@ pub(crate) unsafe fn new(t: T) -> Self { let value: Value; let drop: unsafe fn(&mut Value); - let type_id = non_static_type_id::(); + let fingerprint = Fingerprint::of::(); if is_small::() { let mut inline = [MaybeUninit::uninit(); 2]; @@ -63,7 +66,7 @@ Any { value, drop, - type_id, + fingerprint, #[cfg(feature = "unstable-debug")] type_name: any::type_name::(), } @@ -71,7 +74,7 @@ // This is unsafe -- caller is responsible that T is the correct type. pub(crate) unsafe fn view(&mut self) -> &mut T { - if self.type_id != non_static_type_id::() { + if cfg!(not(miri)) && self.fingerprint != Fingerprint::of::() { self.invalid_cast_to::(); } @@ -86,7 +89,7 @@ // This is unsafe -- caller is responsible that T is the correct type. pub(crate) unsafe fn take(mut self) -> T { - if self.type_id != non_static_type_id::() { + if cfg!(not(miri)) && self.fingerprint != Fingerprint::of::() { self.invalid_cast_to::(); } @@ -122,58 +125,56 @@ } } -trait NonStaticAny { - fn get_type_id(&self) -> TypeId - where - Self: 'static; -} - -impl NonStaticAny for PhantomData { - fn get_type_id(&self) -> TypeId - where - Self: 'static, - { - TypeId::of::() +#[cfg(no_maybe_uninit)] +#[derive(Copy, Clone)] +struct MaybeUninit(PhantomData); + +#[cfg(no_maybe_uninit)] +impl MaybeUninit { + fn uninit() -> Self { + MaybeUninit(PhantomData) } } -fn non_static_type_id() -> TypeId { - let non_static_thing = &PhantomData::; - let thing = unsafe { - mem::transmute::<&dyn NonStaticAny, &(dyn NonStaticAny + 'static)>(non_static_thing) - }; - NonStaticAny::get_type_id(thing) +#[derive(Debug, Eq, PartialEq)] +struct Fingerprint { + size: usize, + align: usize, + #[cfg(include_fnptr_in_fingerprint)] + id: usize, +} + +impl Fingerprint { + fn of() -> Fingerprint { + Fingerprint { + size: mem::size_of::(), + align: mem::align_of::(), + // This is not foolproof -- theoretically Rust or LLVM could + // deduplicate some or all of these methods. But in practice it's + // great in debug mode when running our own test suite for catching + // bugs early. + #[cfg(include_fnptr_in_fingerprint)] + id: Fingerprint::of:: as usize, + } + } } #[test] -fn test_non_static_type_id() { - assert_eq!(non_static_type_id::(), non_static_type_id::()); - assert_eq!( - non_static_type_id::<&str>(), - non_static_type_id::<&'static str>() - ); - - assert_ne!(non_static_type_id::(), non_static_type_id::<[u8; 4]>()); - assert_ne!( - non_static_type_id::(), - non_static_type_id::<[u32; 2]>() - ); - - assert_ne!(non_static_type_id::(), non_static_type_id::()); - assert_ne!( - non_static_type_id::(), - non_static_type_id::<&usize>() - ); - assert_ne!( - non_static_type_id::<&usize>(), - non_static_type_id::<&&usize>() - ); - assert_ne!( - non_static_type_id::<&usize>(), - non_static_type_id::<&mut usize>() - ); - - struct A; - struct B; - assert_ne!(non_static_type_id::(), non_static_type_id::()); +fn test_fingerprint() { + assert_eq!(Fingerprint::of::(), Fingerprint::of::()); + assert_eq!(Fingerprint::of::<&str>(), Fingerprint::of::<&'static str>()); + + assert_ne!(Fingerprint::of::(), Fingerprint::of::<[u8; 4]>()); + assert_ne!(Fingerprint::of::(), Fingerprint::of::<[u32; 2]>()); + + if cfg!(all(include_fnptr_in_fingerprint, not(miri))) { + assert_ne!(Fingerprint::of::(), Fingerprint::of::()); + assert_ne!(Fingerprint::of::(), Fingerprint::of::<&usize>()); + assert_ne!(Fingerprint::of::<&usize>(), Fingerprint::of::<&&usize>()); + assert_ne!(Fingerprint::of::<&usize>(), Fingerprint::of::<&mut usize>()); + + struct A; + struct B; + assert_ne!(Fingerprint::of::(), Fingerprint::of::()); + } } diff -Nru temporalio-1.3.0/vendor/erased-serde/src/lib.rs temporalio-1.3.0/vendor/erased-serde/src/lib.rs --- temporalio-1.3.0/vendor/erased-serde/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/erased-serde/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -95,9 +95,10 @@ //! } //! ``` -#![doc(html_root_url = "https://docs.rs/erased-serde/0.3.31")] +#![doc(html_root_url = "https://docs.rs/erased-serde/0.3.30")] #![cfg_attr(not(feature = "std"), no_std)] -#![deny(unsafe_op_in_unsafe_fn)] +#![cfg_attr(not(no_unsafe_op_in_unsafe_fn_lint), deny(unsafe_op_in_unsafe_fn))] +#![cfg_attr(no_unsafe_op_in_unsafe_fn_lint, allow(unused_unsafe))] #![allow( clippy::derive_partial_eq_without_eq, clippy::extra_unused_type_parameters, diff -Nru temporalio-1.3.0/vendor/errno/.cargo-checksum.json temporalio-1.3.0/vendor/errno/.cargo-checksum.json --- temporalio-1.3.0/vendor/errno/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/errno/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"CHANGELOG.md":"0e7e9b66ccefbe89e04196022c35a799cd6cd9399fc72935efab6b76544d89cc","Cargo.toml":"a93ea470beb86eabc94f7a4bacc40d7837b336a77dc8c02317da75c26386ad88","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"8764a597675778ddfd4e25f81b08a05dbcf089ac05662df7613fe67f150e3aa2","README.md":"96a40903ea0fe68cf512d176a230f4a37df76de262f047f01a46f31de75402bd","clippy.toml":"2c27890fbf0454bb2405bdb013b1daeb78d57c5844b964bcac9afcc125fa46e4","src/hermit.rs":"ad03355bc4d79c180ab3210e1d3edd538eccaaea8d4f9a9b7eb8a0dc2d39b5df","src/lib.rs":"318f864b8cb9296c85f70f9dfb855c552303630b3a9390f147bb4b581b8d8b5c","src/unix.rs":"dc11866f338b4b40ebafb3fc8a2ac7079ea932fe8090d9cae37e4b10d97fca5a","src/wasi.rs":"c606886ebda52b5dc7682c0f3aaf51e146692455acd5e303812cf0d634589d05","src/windows.rs":"7cbcdb8e74582f357fa945bb1c44c4d19c1a10bec958da1223305bf68ec35baf"},"package":"ac3e13f66a2f95e32a39eaa81f6b95d42878ca0e1db0c7543723dfe12557e860"} \ No newline at end of file +{"files":{"CHANGELOG.md":"3a41de28ca83286b98843bbc35c57b8d2e901125b4b7edb7b1bc2e5b37ee2dfb","Cargo.toml":"88ad5fde81b8618f167b79b370297291f0e445576fbb0fb78773b71df75ffc3a","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"8764a597675778ddfd4e25f81b08a05dbcf089ac05662df7613fe67f150e3aa2","README.md":"96a40903ea0fe68cf512d176a230f4a37df76de262f047f01a46f31de75402bd","clippy.toml":"2c27890fbf0454bb2405bdb013b1daeb78d57c5844b964bcac9afcc125fa46e4","src/hermit.rs":"ad03355bc4d79c180ab3210e1d3edd538eccaaea8d4f9a9b7eb8a0dc2d39b5df","src/lib.rs":"318f864b8cb9296c85f70f9dfb855c552303630b3a9390f147bb4b581b8d8b5c","src/unix.rs":"574e9df136366bd2afb91f4bf2daae64bdbc6f147006bcd1c864abf5a90d1679","src/wasi.rs":"c606886ebda52b5dc7682c0f3aaf51e146692455acd5e303812cf0d634589d05","src/windows.rs":"7cbcdb8e74582f357fa945bb1c44c4d19c1a10bec958da1223305bf68ec35baf"},"package":"6b30f669a7961ef1631673d2766cc92f52d64f7ef354d4fe0ddfd30ed52f0f4f"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/errno/Cargo.toml temporalio-1.3.0/vendor/errno/Cargo.toml --- temporalio-1.3.0/vendor/errno/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/errno/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -13,7 +13,7 @@ edition = "2018" rust-version = "1.48" name = "errno" -version = "0.3.5" +version = "0.3.2" authors = ["Chris Wong "] description = "Cross-platform interface to the `errno` variable." documentation = "https://docs.rs/errno" @@ -27,19 +27,19 @@ [features] default = ["std"] -std = ["libc/std"] +std = [] + +[target."cfg(target_os=\"dragonfly\")".dependencies.errno-dragonfly] +version = "0.1.1" [target."cfg(target_os=\"hermit\")".dependencies.libc] version = "0.2" -default-features = false [target."cfg(target_os=\"wasi\")".dependencies.libc] version = "0.2" -default-features = false [target."cfg(unix)".dependencies.libc] version = "0.2" -default-features = false [target."cfg(windows)".dependencies.windows-sys] version = "0.48" diff -Nru temporalio-1.3.0/vendor/errno/CHANGELOG.md temporalio-1.3.0/vendor/errno/CHANGELOG.md --- temporalio-1.3.0/vendor/errno/CHANGELOG.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/errno/CHANGELOG.md 2023-10-30 19:40:00.000000000 +0000 @@ -1,26 +1,5 @@ # [Unreleased] -# [0.3.5] - 2023-10-08 - -- Use __errno_location on DragonFly BSD - [#82](https://github.com/lambda-fairy/rust-errno/pull/82) - -# [0.3.4] - 2023-10-01 - -- Add GNU/Hurd support - [#80](https://github.com/lambda-fairy/rust-errno/pull/80) - -# [0.3.3] - 2023-08-28 - -- Disable "libc/std" in no-std configurations. - [#77](https://github.com/lambda-fairy/rust-errno/pull/77) - -- Bump errno-dragonfly to 0.1.2 - [#75](https://github.com/lambda-fairy/rust-errno/pull/75) - -- Support for the ESP-IDF framework - [#74](https://github.com/lambda-fairy/rust-errno/pull/74) - # [0.3.2] - 2023-07-30 - Fix build on Hermit @@ -62,10 +41,7 @@ - Optionally support no_std [#31](https://github.com/lambda-fairy/rust-errno/pull/31) -[Unreleased]: https://github.com/lambda-fairy/rust-errno/compare/v0.3.5...HEAD -[0.3.5]: https://github.com/lambda-fairy/rust-errno/compare/v0.3.4...v0.3.5 -[0.3.4]: https://github.com/lambda-fairy/rust-errno/compare/v0.3.3...v0.3.4 -[0.3.3]: https://github.com/lambda-fairy/rust-errno/compare/v0.3.2...v0.3.3 +[Unreleased]: https://github.com/lambda-fairy/rust-errno/compare/v0.3.2...HEAD [0.3.2]: https://github.com/lambda-fairy/rust-errno/compare/v0.3.1...v0.3.2 [0.3.1]: https://github.com/lambda-fairy/rust-errno/compare/v0.3.0...v0.3.1 [0.3.0]: https://github.com/lambda-fairy/rust-errno/compare/v0.2.8...v0.3.0 diff -Nru temporalio-1.3.0/vendor/errno/src/unix.rs temporalio-1.3.0/vendor/errno/src/unix.rs --- temporalio-1.3.0/vendor/errno/src/unix.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/errno/src/unix.rs 2023-10-30 19:40:00.000000000 +0000 @@ -13,6 +13,8 @@ // except according to those terms. use core::str; +#[cfg(target_os = "dragonfly")] +use errno_dragonfly::errno_location; use libc::{self, c_char, c_int, size_t, strlen}; use crate::Errno; @@ -55,6 +57,7 @@ } extern "C" { + #[cfg(not(target_os = "dragonfly"))] #[cfg_attr( any(target_os = "macos", target_os = "ios", target_os = "freebsd"), link_name = "__error" @@ -64,8 +67,7 @@ target_os = "openbsd", target_os = "netbsd", target_os = "bitrig", - target_os = "android", - target_os = "espidf" + target_os = "android" ), link_name = "__errno" )] @@ -75,21 +77,13 @@ )] #[cfg_attr(target_os = "haiku", link_name = "_errnop")] #[cfg_attr( - any( - target_os = "linux", - target_os = "hurd", - target_os = "redox", - target_os = "dragonfly" - ), + any(target_os = "linux", target_os = "redox"), link_name = "__errno_location" )] #[cfg_attr(target_os = "aix", link_name = "_Errno")] #[cfg_attr(target_os = "nto", link_name = "__get_errno_ptr")] fn errno_location() -> *mut c_int; - #[cfg_attr( - any(target_os = "linux", target_os = "hurd"), - link_name = "__xpg_strerror_r" - )] + #[cfg_attr(target_os = "linux", link_name = "__xpg_strerror_r")] fn strerror_r(errnum: c_int, buf: *mut c_char, buflen: size_t) -> c_int; } diff -Nru temporalio-1.3.0/vendor/errno-dragonfly/build.rs temporalio-1.3.0/vendor/errno-dragonfly/build.rs --- temporalio-1.3.0/vendor/errno-dragonfly/build.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/errno-dragonfly/build.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,3 @@ +fn main() { + cc::Build::new().file("src/errno.c").compile("liberrno.a"); +} diff -Nru temporalio-1.3.0/vendor/errno-dragonfly/.cargo-checksum.json temporalio-1.3.0/vendor/errno-dragonfly/.cargo-checksum.json --- temporalio-1.3.0/vendor/errno-dragonfly/.cargo-checksum.json 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/errno-dragonfly/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1 @@ +{"files":{"Cargo.toml":"36cf2ca7d85e09d22a7dd384f95c51eb6a7f1a6234d3c54d251dfa575b990430","LICENSE":"e5b1e4fcd8ea2b20b09f378e44ef3f51f4b6a72a72b9f6a729e0f87bddcef97f","README.md":"1e8440a65b6befd65a507b60fb11ab29f314dd77012aa7a11b5d1fadbb5f908f","build.rs":"10d4f05ac56556fea0e98732dc4250ddf3f1acc3fea541c63a0bc130aca772e6","src/errno.c":"a857e47b114acb85fddcb252a610ab5734d225c26b7bedd7c35d7789d46c8526","src/lib.rs":"47245dcfc2d5797584444e70edb1997b2f5e39ecc0779599a7fcded379966c0f"},"package":"aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/errno-dragonfly/Cargo.toml temporalio-1.3.0/vendor/errno-dragonfly/Cargo.toml --- temporalio-1.3.0/vendor/errno-dragonfly/Cargo.toml 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/errno-dragonfly/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,27 @@ +# 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 believe there's an error in this file please file an +# issue against the rust-lang/cargo repository. If you're +# editing this file be aware that the upstream Cargo.toml +# will likely look very different (and much more reasonable) + +[package] +edition = "2018" +name = "errno-dragonfly" +version = "0.1.2" +authors = ["Michael Neumann "] +include = ["Cargo.toml", "LICENSE", "README.md", "build.rs", "src/lib.rs", "src/errno.c"] +description = "Exposes errno functionality to stable Rust on DragonFlyBSD" +keywords = ["dragonfly"] +license = "MIT" +repository = "https://github.com/mneumann/errno-dragonfly-rs" +[dependencies.libc] +version = "0.2" +default-features = false +[build-dependencies.cc] +version = "1.0" diff -Nru temporalio-1.3.0/vendor/errno-dragonfly/LICENSE temporalio-1.3.0/vendor/errno-dragonfly/LICENSE --- temporalio-1.3.0/vendor/errno-dragonfly/LICENSE 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/errno-dragonfly/LICENSE 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017 Michael Neumann + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff -Nru temporalio-1.3.0/vendor/errno-dragonfly/README.md temporalio-1.3.0/vendor/errno-dragonfly/README.md --- temporalio-1.3.0/vendor/errno-dragonfly/README.md 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/errno-dragonfly/README.md 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,3 @@ +# errno-dragonfly-rs + +Exposing `errno` functionality to stable Rust on DragonFly BSD. diff -Nru temporalio-1.3.0/vendor/errno-dragonfly/src/errno.c temporalio-1.3.0/vendor/errno-dragonfly/src/errno.c --- temporalio-1.3.0/vendor/errno-dragonfly/src/errno.c 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/errno-dragonfly/src/errno.c 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,3 @@ +#include + +int *errno_location() { return &errno; } diff -Nru temporalio-1.3.0/vendor/errno-dragonfly/src/lib.rs temporalio-1.3.0/vendor/errno-dragonfly/src/lib.rs --- temporalio-1.3.0/vendor/errno-dragonfly/src/lib.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/errno-dragonfly/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,6 @@ +#![no_std] + +#[link(name = "errno", kind = "static")] +extern "C" { + pub fn errno_location() -> *mut libc::c_int; +} diff -Nru temporalio-1.3.0/vendor/fastrand/.cargo-checksum.json temporalio-1.3.0/vendor/fastrand/.cargo-checksum.json --- temporalio-1.3.0/vendor/fastrand/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/fastrand/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"CHANGELOG.md":"ca095a6db656c9a9bf31ec5c5ec364041b5cce6032dc80d33e8c16cafb801254","Cargo.toml":"a64160075fba894c897d2f800c18333987a8fc9b2734896014befcc05c5f5ea5","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","README.md":"d637d9266758606f027a10a8fdcb67b63d920763f1009d06b8d03476ccbe2f5e","benches/bench.rs":"95df618eeb6f3432e11295d75267c0ececcda35a6d230e9ca504e5d772fa2b62","src/global_rng.rs":"43a74ba2c3c15ebdbbacff65d6da5a90b4c062dedc43c6bf3fcf05499beaeece","src/lib.rs":"6f83c105ff779fb621a4f25eb8eb3e0079b9b099a87b8ea99d437b1f59237a71","tests/char.rs":"a530b41837f5bf43701d983ef0267d9b44779d455f24cbf30b881cd348de9ee1","tests/smoke.rs":"8eac48144705364d142882538be43b8d69018959579404c3b1e638827888e62e"},"package":"25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5"} \ No newline at end of file +{"files":{"CHANGELOG.md":"a88b4ec120e965c0219c8d4a95e0868ed9396acb47d171ca864608eacda7efb8","Cargo.toml":"f0bc7071d293be9565d4a960fa914317f00f319901e9578e7a49a3a86959d90a","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","README.md":"ba09e4125cf5450a26d1bd2236bd079d668b118df639d9055e61eaa4d3c23336","benches/bench.rs":"95df618eeb6f3432e11295d75267c0ececcda35a6d230e9ca504e5d772fa2b62","src/global_rng.rs":"43a74ba2c3c15ebdbbacff65d6da5a90b4c062dedc43c6bf3fcf05499beaeece","src/lib.rs":"67568c53a27b34c5e2eb5e613a9656bcc9da1688a85070c4c36b60c216e3da8b","tests/char.rs":"a530b41837f5bf43701d983ef0267d9b44779d455f24cbf30b881cd348de9ee1","tests/smoke.rs":"8eac48144705364d142882538be43b8d69018959579404c3b1e638827888e62e"},"package":"6999dc1837253364c2ebb0704ba97994bd874e8f195d665c50b7548f6ea92764"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/fastrand/Cargo.toml temporalio-1.3.0/vendor/fastrand/Cargo.toml --- temporalio-1.3.0/vendor/fastrand/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/fastrand/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -13,7 +13,7 @@ edition = "2018" rust-version = "1.36" name = "fastrand" -version = "2.0.1" +version = "2.0.0" authors = ["Stjepan Glavina "] exclude = ["/.*"] description = "A simple and fast random number generator" diff -Nru temporalio-1.3.0/vendor/fastrand/CHANGELOG.md temporalio-1.3.0/vendor/fastrand/CHANGELOG.md --- temporalio-1.3.0/vendor/fastrand/CHANGELOG.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/fastrand/CHANGELOG.md 2023-10-30 19:40:00.000000000 +0000 @@ -1,8 +1,3 @@ -# Version 2.0.1 - -- Clarify documentation for the `fork()` method. (#62) -- Mention `fastrand-contrib` in documentation. (#70) - # Version 2.0.0 - **Breaking:** Remove interior mutability from `Rng`. (#47) diff -Nru temporalio-1.3.0/vendor/fastrand/README.md temporalio-1.3.0/vendor/fastrand/README.md --- temporalio-1.3.0/vendor/fastrand/README.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/fastrand/README.md 2023-10-30 19:40:00.000000000 +0000 @@ -83,16 +83,11 @@ let mut bytes: Vec = repeat_with(|| rng.u8(..)).take(10_000).collect(); ``` -This crate aims to expose a core set of useful randomness primitives. For more niche algorithms, consider using the [`fastrand-contrib`] crate alongside this one. - # Features - `std` (enabled by default): Enables the `std` library. This is required for the global generator and global entropy. Without this feature, [`Rng`] can only be instantiated using - the [`with_seed`](https://docs.rs/fastrand/latest/fastrand/struct.Rng.html#method.with_seed) method. -- `js`: Assumes that WebAssembly targets are being run in a JavaScript environment. - -[`fastrand-contrib`]: https://crates.io/crates/fastrand-contrib + the [`with_seed`](Rng::with_seed) method. ## License diff -Nru temporalio-1.3.0/vendor/fastrand/src/lib.rs temporalio-1.3.0/vendor/fastrand/src/lib.rs --- temporalio-1.3.0/vendor/fastrand/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/fastrand/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -73,9 +73,6 @@ //! let mut bytes: Vec = repeat_with(|| rng.u8(..)).take(10_000).collect(); //! ``` //! -//! This crate aims to expose a core set of useful randomness primitives. For more niche algorithms, -//! consider using the [`fastrand-contrib`] crate alongside this one. -//! //! # Features //! //! - `std` (enabled by default): Enables the `std` library. This is required for the global @@ -95,19 +92,12 @@ //! entropy sources and seed the global RNG. If the `js` feature is not enabled, the global RNG will //! use a predefined seed. //! -//! [`fastrand-contrib`]: https://crates.io/crates/fastrand-contrib //! [`getrandom`]: https://crates.io/crates/getrandom #![cfg_attr(not(feature = "std"), no_std)] #![cfg_attr(docsrs, feature(doc_cfg))] #![forbid(unsafe_code)] #![warn(missing_docs, missing_debug_implementations, rust_2018_idioms)] -#![doc( - html_favicon_url = "https://raw.githubusercontent.com/smol-rs/smol/master/assets/images/logo_fullsize_transparent.png" -)] -#![doc( - html_logo_url = "https://raw.githubusercontent.com/smol-rs/smol/master/assets/images/logo_fullsize_transparent.png" -)] #[cfg(feature = "alloc")] extern crate alloc; @@ -293,25 +283,22 @@ /// Clones the generator by deterministically deriving a new generator based on the initial /// seed. /// - /// This function can be used to create a new generator that is a "spinoff" of the old - /// generator. The new generator will not produce the same sequence of values as the - /// old generator. - /// /// # Example /// /// ``` /// // Seed two generators equally, and clone both of them. - /// let mut base1 = fastrand::Rng::with_seed(0x4d595df4d0f33173); + /// let mut base1 = fastrand::Rng::new(); + /// base1.seed(0x4d595df4d0f33173); /// base1.bool(); // Use the generator once. /// - /// let mut base2 = fastrand::Rng::with_seed(0x4d595df4d0f33173); + /// let mut base2 = fastrand::Rng::new(); + /// base2.seed(0x4d595df4d0f33173); /// base2.bool(); // Use the generator once. /// - /// let mut rng1 = base1.fork(); - /// let mut rng2 = base2.fork(); + /// let mut rng1 = base1.clone(); + /// let mut rng2 = base2.clone(); /// - /// println!("rng1 returns {}", rng1.u32(..)); - /// println!("rng2 returns {}", rng2.u32(..)); + /// assert_eq!(rng1.u64(..), rng2.u64(..), "the cloned generators are identical"); /// ``` #[inline] #[must_use = "this creates a new instance of `Rng`"] diff -Nru temporalio-1.3.0/vendor/flate2/.cargo-checksum.json temporalio-1.3.0/vendor/flate2/.cargo-checksum.json --- temporalio-1.3.0/vendor/flate2/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/flate2/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"Cargo.lock":"2721de22957f2a734adfc7415f27f5219bab8c60dea870f8b1c2dbd30cc46c62","Cargo.toml":"b0c766bc094342b650ce071fe410f4446b6adbe4a776253b2d906ce68393209d","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397","MAINTENANCE.md":"20ef2cb336c850d849652b110ec4806b71e69ed5dd50518a95eb9d453f8bf645","README.md":"a8fab33160befebe83eece4801f401da5932c0e1cca8e97a7ae4bce4aae1b061","examples/compress_file.rs":"cbdb8b0c556409b82f894ad5326babb6dba42c219d2d675927e7f5820053b295","examples/decompress_file.rs":"cd50dfbaccc905b3e02d6c50b26586196a682880203a8694343e0391799b70d5","examples/deflatedecoder-bufread.rs":"5b8abebce157f9b7cc3f6b5c90b9d533890a514e5f8d91bb43439f52fdc9ddce","examples/deflatedecoder-read.rs":"921e13031c5436494d8af0a8705a0adda2da536edefef2e1e311dffa8acd120f","examples/deflatedecoder-write.rs":"cfce37e8758c6d543dd130c7bdff571af3c8cd11bafcc933740107a3576832df","examples/deflateencoder-bufread.rs":"9fdd7d632d861f099d19a3ec1de539d9600f8004a119dd2a70f6aba5965b2e1c","examples/deflateencoder-read.rs":"8740a942ec7d07ccb4b57c5baac7a4d649817bffe4e37ce9a06c7d6d70378e4c","examples/deflateencoder-write.rs":"8e45425684b2368ef95f3704dce6f8077f38b9a90a38d147594c7c570f0d1c6c","examples/gzbuilder.rs":"d09c83417e4a01a8593ce3462a33340e6fe17fa51b4b0b3a6005b68959df4d8c","examples/gzdecoder-bufread.rs":"76880f3e6e10ed4a0bf564be9ddae1c50811aeabf61fb573039538b81805f390","examples/gzdecoder-read.rs":"d99e9a9ce03a27f280244a24e8f5a3282e5af15b455270d99c4bfecd19238d0d","examples/gzdecoder-write.rs":"d0a982377ca1d2fd1786bb32f16454b4f0afdba5e1c7f0ab97e15e8827d351d5","examples/gzencoder-bufread.rs":"760670c124b1c5776b63c300c7e8a1dcd5e0ae633017dcf2e3d2d6e997dcc9c4","examples/gzencoder-read.rs":"27ec68675418bb7d1a110b8d1f33e7b1069f42bcce6f21f8d9235bde405cdf9f","examples/gzencoder-write.rs":"f127f2e398231d03269770fa18ac5d465f8d56d283f1118055f04f1d03369c31","examples/gzmultidecoder-bufread.rs":"bfa6c5554c3da5a61a7d1e1dad115b7ee784d136e2ac61272c87ad3e1eb4ec4c","examples/gzmultidecoder-read.rs":"c058d5eee5bf45b38132f8e487a714c9521191c7dabe2459362d2f8de689c6bf","examples/hello_world.txt":"d2a84f4b8b650937ec8f73cd8be2c74add5a911ba64df27458ed8229da804a26","examples/hello_world.txt.gz":"8b4c5972b92b8ee8dc99116e278afb9165276ddb13c0d334c8da2770fd4d1f7d","examples/zlibdecoder-bufread.rs":"0f541ec64c635d45fc206a02718c0b90c49123a0441a95455d6a8a9e0d20e011","examples/zlibdecoder-read.rs":"bbd85b47b8b804c3294b3f23f978eaf6fb09a187cb46eb86ae1ae2790dfab8d9","examples/zlibdecoder-write.rs":"f347a831d7201d3efd604b006c88421fa2a5906c6377b47c7ae391d0809186e6","examples/zlibencoder-bufread.rs":"e0e05686ad4521ba18b742a5cbbc5937cec1fd8b9e8313070b32c6f178dfbaf6","examples/zlibencoder-read.rs":"4a3156dc73cd77e6ac56700680652be63a1270d95ce384ebcd5c014cce2d5179","examples/zlibencoder-write.rs":"822d4cd326ac7402ff8f828c1dbb3aa108c68a89fc04488da252ca6a74e624b0","src/bufreader.rs":"2d6a59330e8f838eb6474d19104f21cb98236125c189f36bdff75a069a4cea8f","src/crc.rs":"f02b9ffbedf06360c8164f98ecf51fe7f70c48cdb3bfc72e176421419c1de030","src/deflate/bufread.rs":"49b3d3414343811f96f2ce66bf4db2cf02770986ac500368722111060c4de8b1","src/deflate/mod.rs":"d33ef6a3d502d599a4ba6ac99c6312b414002dba43c388d271fc1f8c9c609363","src/deflate/read.rs":"57f7a9609a111e88fb079188fdc0a79e1e20d97d363bd133f134ad11049220e0","src/deflate/write.rs":"fef4deebc0dc29d4ad481718613c694f6d1b733199e241a1f7f064e2707e4908","src/ffi/c.rs":"9a5648a29a534945244376777c41f9b4f100679ebc2ba3016c7e698181fb5cbf","src/ffi/mod.rs":"2b811be787e23654e56a1a5748f64f6b6953a829594aef9bdb8f223fe9a1bba9","src/ffi/rust.rs":"0a69aac9bd08728d212f503a16c0e7fb64a7822a7531bc3a96e78c89c09b6e80","src/gz/bufread.rs":"fd87b3600af9f22b52aa5e9e6f5636ade64573042f852158584234c2895b35f7","src/gz/mod.rs":"c3449201bd4bad2e4289f4cd1081a4be4505e7d9e8fee5a2838248bf979ef9f0","src/gz/read.rs":"4956e0dbe921810e88f86623c28c74f62aa3b0f36a4461a9dbaeabb2d77ef5bb","src/gz/write.rs":"78954929f24229875503ffdc04944924120c199fa502a0742e195cffcc135631","src/lib.rs":"9651a09ff275d464ff4865974797a6dc8f2f786225e159b6bd0dbbfd5afc0cef","src/mem.rs":"9ef7db386d178ef6426877d2b459165e42757b17ea01bd750e26b74f5691e97a","src/zio.rs":"ed5f375f5d6c4f094dfdd43185c9af5e91d1129bfbfa31edc6902a1f7496920b","src/zlib/bufread.rs":"9284cb80c00ff8e78f2845c1a2911a99c99745b1558085d5f42e26520ff011be","src/zlib/mod.rs":"18ea5785b913d90191c6ad8483f57d0c5f98599137659e72f3c0c78324b4f8fa","src/zlib/read.rs":"4a06d07ea137390efd823554afed7d05a8acfc3ab4f5a5382202030380281f23","src/zlib/write.rs":"5cb973ffb9fc0e6ee8f3cc4537d0b32f826dbe7c367723752d2db708af8831bb","tests/corrupt-gz-file.bin":"083dd284aa1621916a2d0f66ea048c8d3ba7a722b22d0d618722633f51e7d39c","tests/early-flush.rs":"9a4db8fcbac659c52cafe5e1ab647d86781cf8b1f298d8dee34223c0292e0d74","tests/empty-read.rs":"39143ff0383655bb115e995b2a953f11e82d0ac03b4bec080973be7c2d421054","tests/good-file.gz":"87296963e53024a74752179ce7e54087565d358a85d3e65c3b37ef36eaa3d4a6","tests/good-file.txt":"bc4e03658a441fe2ad2df7cd2197144b87e41696f01e327b380e869cd9b485a0","tests/gunzip.rs":"c00946db2147b23c4300c77fedf0a04e65c774101575e9828433831311416a50","tests/multi.gz":"efa3341da052f95056314cc6920e02a3da15bdef30234b2552fb407812db5cc6","tests/multi.txt":"dbea9325179efe46ea2add94f7b6b745ca983fabb208dc6d34aa064623d7ee23","tests/zero-write.rs":"cde1a675491d88e59a711103d3b0df4c77b60e8152b90d5a4f01b97879f8f8dc"},"package":"46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e"} \ No newline at end of file +{"files":{"Cargo.lock":"5b74a7b515d919a6daa450d673aca5b4a9e65d78883f4c59bf51ce9b5ac9d2dc","Cargo.toml":"abfa5f6669c976afea17a44d1c9249e0b3db8610322566083f48d4bfe33da10b","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397","MAINTENANCE.md":"20ef2cb336c850d849652b110ec4806b71e69ed5dd50518a95eb9d453f8bf645","README.md":"a8fab33160befebe83eece4801f401da5932c0e1cca8e97a7ae4bce4aae1b061","examples/compress_file.rs":"cbdb8b0c556409b82f894ad5326babb6dba42c219d2d675927e7f5820053b295","examples/decompress_file.rs":"cd50dfbaccc905b3e02d6c50b26586196a682880203a8694343e0391799b70d5","examples/deflatedecoder-bufread.rs":"5b8abebce157f9b7cc3f6b5c90b9d533890a514e5f8d91bb43439f52fdc9ddce","examples/deflatedecoder-read.rs":"921e13031c5436494d8af0a8705a0adda2da536edefef2e1e311dffa8acd120f","examples/deflatedecoder-write.rs":"cfce37e8758c6d543dd130c7bdff571af3c8cd11bafcc933740107a3576832df","examples/deflateencoder-bufread.rs":"9fdd7d632d861f099d19a3ec1de539d9600f8004a119dd2a70f6aba5965b2e1c","examples/deflateencoder-read.rs":"8740a942ec7d07ccb4b57c5baac7a4d649817bffe4e37ce9a06c7d6d70378e4c","examples/deflateencoder-write.rs":"8e45425684b2368ef95f3704dce6f8077f38b9a90a38d147594c7c570f0d1c6c","examples/gzbuilder.rs":"d09c83417e4a01a8593ce3462a33340e6fe17fa51b4b0b3a6005b68959df4d8c","examples/gzdecoder-bufread.rs":"76880f3e6e10ed4a0bf564be9ddae1c50811aeabf61fb573039538b81805f390","examples/gzdecoder-read.rs":"d99e9a9ce03a27f280244a24e8f5a3282e5af15b455270d99c4bfecd19238d0d","examples/gzdecoder-write.rs":"d0a982377ca1d2fd1786bb32f16454b4f0afdba5e1c7f0ab97e15e8827d351d5","examples/gzencoder-bufread.rs":"760670c124b1c5776b63c300c7e8a1dcd5e0ae633017dcf2e3d2d6e997dcc9c4","examples/gzencoder-read.rs":"27ec68675418bb7d1a110b8d1f33e7b1069f42bcce6f21f8d9235bde405cdf9f","examples/gzencoder-write.rs":"f127f2e398231d03269770fa18ac5d465f8d56d283f1118055f04f1d03369c31","examples/gzmultidecoder-bufread.rs":"bfa6c5554c3da5a61a7d1e1dad115b7ee784d136e2ac61272c87ad3e1eb4ec4c","examples/gzmultidecoder-read.rs":"c058d5eee5bf45b38132f8e487a714c9521191c7dabe2459362d2f8de689c6bf","examples/hello_world.txt":"d2a84f4b8b650937ec8f73cd8be2c74add5a911ba64df27458ed8229da804a26","examples/hello_world.txt.gz":"8b4c5972b92b8ee8dc99116e278afb9165276ddb13c0d334c8da2770fd4d1f7d","examples/zlibdecoder-bufread.rs":"0f541ec64c635d45fc206a02718c0b90c49123a0441a95455d6a8a9e0d20e011","examples/zlibdecoder-read.rs":"bbd85b47b8b804c3294b3f23f978eaf6fb09a187cb46eb86ae1ae2790dfab8d9","examples/zlibdecoder-write.rs":"f347a831d7201d3efd604b006c88421fa2a5906c6377b47c7ae391d0809186e6","examples/zlibencoder-bufread.rs":"e0e05686ad4521ba18b742a5cbbc5937cec1fd8b9e8313070b32c6f178dfbaf6","examples/zlibencoder-read.rs":"4a3156dc73cd77e6ac56700680652be63a1270d95ce384ebcd5c014cce2d5179","examples/zlibencoder-write.rs":"822d4cd326ac7402ff8f828c1dbb3aa108c68a89fc04488da252ca6a74e624b0","src/bufreader.rs":"2d6a59330e8f838eb6474d19104f21cb98236125c189f36bdff75a069a4cea8f","src/crc.rs":"f02b9ffbedf06360c8164f98ecf51fe7f70c48cdb3bfc72e176421419c1de030","src/deflate/bufread.rs":"76af1e22d74571304f7a632751bf80ad946808ff516138696cc6b3d6c586529b","src/deflate/mod.rs":"d33ef6a3d502d599a4ba6ac99c6312b414002dba43c388d271fc1f8c9c609363","src/deflate/read.rs":"122632aff99207af0d998b0890bad44cbc68bb671dcf086cf35adae847175c66","src/deflate/write.rs":"fef4deebc0dc29d4ad481718613c694f6d1b733199e241a1f7f064e2707e4908","src/ffi/c.rs":"f564f9b27278e770006ffda9b078a6a9f5219ffd3fbbc9e315c27bc134b0c32f","src/ffi/mod.rs":"2b811be787e23654e56a1a5748f64f6b6953a829594aef9bdb8f223fe9a1bba9","src/ffi/rust.rs":"0a69aac9bd08728d212f503a16c0e7fb64a7822a7531bc3a96e78c89c09b6e80","src/gz/bufread.rs":"ff18bb9bb6564e45ee2b6dbf4c9dbfe72b25982cd26748b6121f9cab8a7b0dab","src/gz/mod.rs":"2cbcf00c6372d9dd383197bdeceec80dacc8d73d8d5ff44a05fa88040681c5cb","src/gz/read.rs":"68c79bcd34ff14e7572b2f9862f3fb12a26885986783180b7fdce77ae4fb9260","src/gz/write.rs":"78954929f24229875503ffdc04944924120c199fa502a0742e195cffcc135631","src/lib.rs":"9651a09ff275d464ff4865974797a6dc8f2f786225e159b6bd0dbbfd5afc0cef","src/mem.rs":"e563f95d7ab3343b4c86c968c8810b96d74d8cf7612818dd60cd1f6bc4f63eb3","src/zio.rs":"ed5f375f5d6c4f094dfdd43185c9af5e91d1129bfbfa31edc6902a1f7496920b","src/zlib/bufread.rs":"4ef683b9035720d19eec5f21f46f70b7d8eaf9385caddcfd9e48533c619cbb26","src/zlib/mod.rs":"18ea5785b913d90191c6ad8483f57d0c5f98599137659e72f3c0c78324b4f8fa","src/zlib/read.rs":"7dea75ca1dec5a2175b0f45fb2445a345fbe1d220cf4c599e25dece43c520271","src/zlib/write.rs":"5cb973ffb9fc0e6ee8f3cc4537d0b32f826dbe7c367723752d2db708af8831bb","tests/corrupt-gz-file.bin":"083dd284aa1621916a2d0f66ea048c8d3ba7a722b22d0d618722633f51e7d39c","tests/early-flush.rs":"9a4db8fcbac659c52cafe5e1ab647d86781cf8b1f298d8dee34223c0292e0d74","tests/empty-read.rs":"39143ff0383655bb115e995b2a953f11e82d0ac03b4bec080973be7c2d421054","tests/good-file.gz":"87296963e53024a74752179ce7e54087565d358a85d3e65c3b37ef36eaa3d4a6","tests/good-file.txt":"bc4e03658a441fe2ad2df7cd2197144b87e41696f01e327b380e869cd9b485a0","tests/gunzip.rs":"c00946db2147b23c4300c77fedf0a04e65c774101575e9828433831311416a50","tests/multi.gz":"efa3341da052f95056314cc6920e02a3da15bdef30234b2552fb407812db5cc6","tests/multi.txt":"dbea9325179efe46ea2add94f7b6b745ca983fabb208dc6d34aa064623d7ee23","tests/zero-write.rs":"cde1a675491d88e59a711103d3b0df4c77b60e8152b90d5a4f01b97879f8f8dc"},"package":"c6c98ee8095e9d1dcbf2fcc6d95acccb90d1c81db1e44725c6a984b1dbdfb010"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/flate2/Cargo.lock temporalio-1.3.0/vendor/flate2/Cargo.lock --- temporalio-1.3.0/vendor/flate2/Cargo.lock 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/flate2/Cargo.lock 2023-10-30 19:40:00.000000000 +0000 @@ -49,7 +49,7 @@ [[package]] name = "flate2" -version = "1.0.28" +version = "1.0.27" dependencies = [ "cloudflare-zlib-sys", "crc32fast", diff -Nru temporalio-1.3.0/vendor/flate2/Cargo.toml temporalio-1.3.0/vendor/flate2/Cargo.toml --- temporalio-1.3.0/vendor/flate2/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/flate2/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -12,7 +12,7 @@ [package] edition = "2018" name = "flate2" -version = "1.0.28" +version = "1.0.27" authors = [ "Alex Crichton ", "Josh Triplett ", diff -Nru temporalio-1.3.0/vendor/flate2/src/deflate/bufread.rs temporalio-1.3.0/vendor/flate2/src/deflate/bufread.rs --- temporalio-1.3.0/vendor/flate2/src/deflate/bufread.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/flate2/src/deflate/bufread.rs 2023-10-30 19:40:00.000000000 +0000 @@ -7,10 +7,9 @@ /// A DEFLATE encoder, or compressor. /// -/// This structure implements a [`Read`] interface. When read from, it reads -/// uncompressed data from the underlying [`BufRead`] and provides the compressed data. +/// This structure consumes a [`BufRead`] interface, reading uncompressed data +/// from the underlying reader, and emitting compressed data. /// -/// [`Read`]: https://doc.rust-lang.org/std/io/trait.Read.html /// [`BufRead`]: https://doc.rust-lang.org/std/io/trait.BufRead.html /// /// # Examples @@ -124,10 +123,9 @@ /// A DEFLATE decoder, or decompressor. /// -/// This structure implements a [`Read`] interface. When read from, it reads -/// compressed data from the underlying [`BufRead`] and provides the uncompressed data. +/// This structure consumes a [`BufRead`] interface, reading compressed data +/// from the underlying reader, and emitting uncompressed data. /// -/// [`Read`]: https://doc.rust-lang.org/std/io/trait.Read.html /// [`BufRead`]: https://doc.rust-lang.org/std/io/trait.BufRead.html /// /// # Examples diff -Nru temporalio-1.3.0/vendor/flate2/src/deflate/read.rs temporalio-1.3.0/vendor/flate2/src/deflate/read.rs --- temporalio-1.3.0/vendor/flate2/src/deflate/read.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/flate2/src/deflate/read.rs 2023-10-30 19:40:00.000000000 +0000 @@ -6,8 +6,8 @@ /// A DEFLATE encoder, or compressor. /// -/// This structure implements a [`Read`] interface. When read from, it reads -/// uncompressed data from the underlying [`Read`] and provides the compressed data. +/// This structure implements a [`Read`] interface and will read uncompressed +/// data from an underlying stream and emit a stream of compressed data. /// /// [`Read`]: https://doc.rust-lang.org/std/io/trait.Read.html /// @@ -120,8 +120,8 @@ /// A DEFLATE decoder, or decompressor. /// -/// This structure implements a [`Read`] interface. When read from, it reads -/// compressed data from the underlying [`Read`] and provides the uncompressed data. +/// This structure implements a [`Read`] interface and takes a stream of +/// compressed data as input, providing the decompressed data when read from. /// /// [`Read`]: https://doc.rust-lang.org/std/io/trait.Read.html /// diff -Nru temporalio-1.3.0/vendor/flate2/src/ffi/c.rs temporalio-1.3.0/vendor/flate2/src/ffi/c.rs --- temporalio-1.3.0/vendor/flate2/src/ffi/c.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/flate2/src/ffi/c.rs 2023-10-30 19:40:00.000000000 +0000 @@ -226,12 +226,6 @@ self.inner.total_in += (raw.next_in as usize - input.as_ptr() as usize) as u64; self.inner.total_out += (raw.next_out as usize - output.as_ptr() as usize) as u64; - // reset these pointers so we don't accidentally read them later - raw.next_in = ptr::null_mut(); - raw.avail_in = 0; - raw.next_out = ptr::null_mut(); - raw.avail_out = 0; - match rc { MZ_DATA_ERROR | MZ_STREAM_ERROR => mem::decompress_failed(self.inner.msg()), MZ_OK => Ok(Status::Ok), @@ -320,12 +314,6 @@ self.inner.total_in += (raw.next_in as usize - input.as_ptr() as usize) as u64; self.inner.total_out += (raw.next_out as usize - output.as_ptr() as usize) as u64; - // reset these pointers so we don't accidentally read them later - raw.next_in = ptr::null_mut(); - raw.avail_in = 0; - raw.next_out = ptr::null_mut(); - raw.avail_out = 0; - match rc { MZ_OK => Ok(Status::Ok), MZ_BUF_ERROR => Ok(Status::BufError), diff -Nru temporalio-1.3.0/vendor/flate2/src/gz/bufread.rs temporalio-1.3.0/vendor/flate2/src/gz/bufread.rs --- temporalio-1.3.0/vendor/flate2/src/gz/bufread.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/flate2/src/gz/bufread.rs 2023-10-30 19:40:00.000000000 +0000 @@ -19,10 +19,10 @@ /// A gzip streaming encoder /// -/// This structure implements a [`Read`] interface. When read from, it reads -/// uncompressed data from the underlying [`BufRead`] and provides the compressed data. +/// This structure exposes a [`BufRead`] interface that will read uncompressed data +/// from the underlying reader and expose the compressed version as a [`BufRead`] +/// interface. /// -/// [`Read`]: https://doc.rust-lang.org/std/io/trait.Read.html /// [`BufRead`]: https://doc.rust-lang.org/std/io/trait.BufRead.html /// /// # Examples @@ -165,8 +165,8 @@ /// A decoder for a single member of a [gzip file]. /// -/// This structure implements a [`Read`] interface. When read from, it reads -/// compressed data from the underlying [`BufRead`] and provides the uncompressed data. +/// This structure exposes a [`BufRead`] interface, reading compressed data +/// from the underlying reader, and emitting uncompressed data. /// /// After reading a single member of the gzip data this reader will return /// Ok(0) even if there are more bytes available in the underlying reader. @@ -178,7 +178,6 @@ /// [in the introduction](../index.html#about-multi-member-gzip-files). /// /// [gzip file]: https://www.rfc-editor.org/rfc/rfc1952#page-5 -/// [`Read`]: https://doc.rust-lang.org/std/io/trait.Read.html /// [`BufRead`]: https://doc.rust-lang.org/std/io/trait.BufRead.html /// /// # Examples @@ -352,8 +351,8 @@ /// A gzip streaming decoder that decodes a [gzip file] that may have multiple members. /// -/// This structure implements a [`Read`] interface. When read from, it reads -/// compressed data from the underlying [`BufRead`] and provides the uncompressed data. +/// This structure exposes a [`BufRead`] interface that will consume compressed +/// data from the underlying reader and emit uncompressed data. /// /// A gzip file consists of a series of *members* concatenated one after another. /// MultiGzDecoder decodes all members from the data and only returns Ok(0) when the @@ -363,7 +362,6 @@ /// [in the introduction](../index.html#about-multi-member-gzip-files). /// /// [gzip file]: https://www.rfc-editor.org/rfc/rfc1952#page-5 -/// [`Read`]: https://doc.rust-lang.org/std/io/trait.Read.html /// [`BufRead`]: https://doc.rust-lang.org/std/io/trait.BufRead.html /// /// # Examples diff -Nru temporalio-1.3.0/vendor/flate2/src/gz/mod.rs temporalio-1.3.0/vendor/flate2/src/gz/mod.rs --- temporalio-1.3.0/vendor/flate2/src/gz/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/flate2/src/gz/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -87,7 +87,7 @@ } } -#[derive(Debug)] +#[derive(Debug, Default)] pub enum GzHeaderState { Start(u8, [u8; 10]), Xlen(Option>, u8, [u8; 2]), @@ -95,15 +95,10 @@ Filename(Option>), Comment(Option>), Crc(Option>, u8, [u8; 2]), + #[default] Complete, } -impl Default for GzHeaderState { - fn default() -> Self { - Self::Complete - } -} - #[derive(Debug, Default)] pub struct GzHeaderParser { state: GzHeaderState, diff -Nru temporalio-1.3.0/vendor/flate2/src/gz/read.rs temporalio-1.3.0/vendor/flate2/src/gz/read.rs --- temporalio-1.3.0/vendor/flate2/src/gz/read.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/flate2/src/gz/read.rs 2023-10-30 19:40:00.000000000 +0000 @@ -8,8 +8,9 @@ /// A gzip streaming encoder /// -/// This structure implements a [`Read`] interface. When read from, it reads -/// uncompressed data from the underlying [`Read`] and provides the compressed data. +/// This structure exposes a [`Read`] interface that will read uncompressed data +/// from the underlying reader and expose the compressed version as a [`Read`] +/// interface. /// /// [`Read`]: https://doc.rust-lang.org/std/io/trait.Read.html /// @@ -91,8 +92,8 @@ /// A decoder for a single member of a [gzip file]. /// -/// This structure implements a [`Read`] interface. When read from, it reads -/// compressed data from the underlying [`Read`] and provides the uncompressed data. +/// This structure exposes a [`Read`] interface that will consume compressed +/// data from the underlying reader and emit uncompressed data. /// /// After reading a single member of the gzip data this reader will return /// Ok(0) even if there are more bytes available in the underlying reader. @@ -200,9 +201,8 @@ /// A gzip streaming decoder that decodes a [gzip file] that may have multiple members. /// -/// This structure implements a [`Read`] interface. When read from, it reads -/// compressed data from the underlying [`Read`] and provides the uncompressed -/// data. +/// This structure exposes a [`Read`] interface that will consume compressed +/// data from the underlying reader and emit uncompressed data. /// /// A gzip file consists of a series of *members* concatenated one after another. /// MultiGzDecoder decodes all members of a file and returns Ok(0) once the diff -Nru temporalio-1.3.0/vendor/flate2/src/mem.rs temporalio-1.3.0/vendor/flate2/src/mem.rs --- temporalio-1.3.0/vendor/flate2/src/mem.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/flate2/src/mem.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,6 +1,7 @@ use std::error::Error; use std::fmt; use std::io; +use std::slice; use crate::ffi::{self, Backend, Deflate, DeflateBackend, ErrorMessage, Inflate, InflateBackend}; use crate::Compression; @@ -341,12 +342,19 @@ output: &mut Vec, flush: FlushCompress, ) -> Result { - write_to_spare_capacity_of_vec(output, |out| { + let cap = output.capacity(); + let len = output.len(); + + unsafe { let before = self.total_out(); - let ret = self.compress(input, out, flush); - let bytes_written = self.total_out() - before; - (bytes_written as usize, ret) - }) + let ret = { + let ptr = output.as_mut_ptr().add(len); + let out = slice::from_raw_parts_mut(ptr, cap - len); + self.compress(input, out, flush) + }; + output.set_len((self.total_out() - before) as usize + len); + ret + } } } @@ -465,12 +473,19 @@ output: &mut Vec, flush: FlushDecompress, ) -> Result { - write_to_spare_capacity_of_vec(output, |out| { + let cap = output.capacity(); + let len = output.len(); + + unsafe { let before = self.total_out(); - let ret = self.decompress(input, out, flush); - let bytes_written = self.total_out() - before; - (bytes_written as usize, ret) - }) + let ret = { + let ptr = output.as_mut_ptr().add(len); + let out = slice::from_raw_parts_mut(ptr, cap - len); + self.decompress(input, out, flush) + }; + output.set_len((self.total_out() - before) as usize + len); + ret + } } /// Specifies the decompression dictionary to use. @@ -559,29 +574,6 @@ } } -/// Allows `writer` to write data into the spare capacity of the `output` vector. -/// This will not reallocate the vector provided or attempt to grow it, so space -/// for the `output` must be reserved by the caller before calling this -/// function. -/// -/// `writer` needs to return the number of bytes written (and can also return -/// another arbitrary return value). -fn write_to_spare_capacity_of_vec( - output: &mut Vec, - writer: impl FnOnce(&mut [u8]) -> (usize, T), -) -> T { - let cap = output.capacity(); - let len = output.len(); - - output.resize(output.capacity(), 0); - let (bytes_written, ret) = writer(&mut output[len..]); - - let new_len = core::cmp::min(len + bytes_written, cap); // Sanitizes `bytes_written`. - output.resize(new_len, 0 /* unused */); - - ret -} - #[cfg(test)] mod tests { use std::io::Write; diff -Nru temporalio-1.3.0/vendor/flate2/src/zlib/bufread.rs temporalio-1.3.0/vendor/flate2/src/zlib/bufread.rs --- temporalio-1.3.0/vendor/flate2/src/zlib/bufread.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/flate2/src/zlib/bufread.rs 2023-10-30 19:40:00.000000000 +0000 @@ -7,10 +7,9 @@ /// A ZLIB encoder, or compressor. /// -/// This structure implements a [`Read`] interface. When read from, it reads -/// uncompressed data from the underlying [`BufRead`] and provides the compressed data. +/// This structure consumes a [`BufRead`] interface, reading uncompressed data +/// from the underlying reader, and emitting compressed data. /// -/// [`Read`]: https://doc.rust-lang.org/std/io/trait.Read.html /// [`BufRead`]: https://doc.rust-lang.org/std/io/trait.BufRead.html /// /// # Examples @@ -129,10 +128,9 @@ /// A ZLIB decoder, or decompressor. /// -/// This structure implements a [`Read`] interface. When read from, it reads -/// compressed data from the underlying [`BufRead`] and provides the uncompressed data. +/// This structure consumes a [`BufRead`] interface, reading compressed data +/// from the underlying reader, and emitting uncompressed data. /// -/// [`Read`]: https://doc.rust-lang.org/std/io/trait.Read.html /// [`BufRead`]: https://doc.rust-lang.org/std/io/trait.BufRead.html /// /// # Examples diff -Nru temporalio-1.3.0/vendor/flate2/src/zlib/read.rs temporalio-1.3.0/vendor/flate2/src/zlib/read.rs --- temporalio-1.3.0/vendor/flate2/src/zlib/read.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/flate2/src/zlib/read.rs 2023-10-30 19:40:00.000000000 +0000 @@ -7,8 +7,8 @@ /// A ZLIB encoder, or compressor. /// -/// This structure implements a [`Read`] interface. When read from, it reads -/// uncompressed data from the underlying [`Read`] and provides the compressed data. +/// This structure implements a [`Read`] interface and will read uncompressed +/// data from an underlying stream and emit a stream of compressed data. /// /// [`Read`]: https://doc.rust-lang.org/std/io/trait.Read.html /// @@ -126,8 +126,8 @@ /// A ZLIB decoder, or decompressor. /// -/// This structure implements a [`Read`] interface. When read from, it reads -/// compressed data from the underlying [`Read`] and provides the uncompressed data. +/// This structure implements a [`Read`] interface and takes a stream of +/// compressed data as input, providing the decompressed data when read from. /// /// [`Read`]: https://doc.rust-lang.org/std/io/trait.Read.html /// diff -Nru temporalio-1.3.0/vendor/futures/.cargo-checksum.json temporalio-1.3.0/vendor/futures/.cargo-checksum.json --- temporalio-1.3.0/vendor/futures/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/futures/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"Cargo.toml":"9162f9effcecfa23c06e5908fb47f0e818cff072b39b8c5bb22867144297d63e","LICENSE-APACHE":"275c491d6d1160553c32fd6127061d7f9606c3ea25abfad6ca3f6ed088785427","LICENSE-MIT":"6652c868f35dfe5e8ef636810a4e576b9d663f3a17fb0f5613ad73583e1b88fd","README.md":"842d0b8a539ab13ba2b9863cd8fb27da4fc7e9def1aefeb21db5aa04269b1e34","src/lib.rs":"bb07f533ba89a36c0385b57de17d51bf23ccab9e13e00ec812a74f376df15930","tests/_require_features.rs":"5ad24019430b498addfc1fd853e955c7b646d78d0727a8ca29f586c9aab45cff","tests/async_await_macros.rs":"87863f5b73217d727a4789d69229ab5dd85252b8e76a1aca0220feb98a0922af","tests/auto_traits.rs":"bff7c984267a9ec98d5549c971623e7d658fc6f26fd78cfcb2630838b73e46d0","tests/bilock.rs":"bd0bf617352528f686b3fbb1847f4da9f6fe351e456e0bdce888bc738311fa83","tests/compat.rs":"1449926cc046d2ae9f86a263efd9353ca8e174ea546c083b360136c5a2aef1d1","tests/eager_drop.rs":"dc25d067207c06bbe094752d70bf161e206f00e162ffa3219583c8b4eb0816a1","tests/eventual.rs":"9050809e5196d0870a3ee2a268a5b4b398739b01617e1e317a673ac0660974cf","tests/future_abortable.rs":"4c81607472a85c5d87a5fe8a510a24cf1e8793fedf7f6cd6741ba1efd66615cd","tests/future_basic_combinators.rs":"4508c1250b85a4f749b7261bbd0ba728d3970e7ba277e84a006e76cf068fb54f","tests/future_fuse.rs":"bb63141f1486e755d0cdea1d93e302ad864a2186aa5287f909a0b3a922e82065","tests/future_inspect.rs":"9c03ceb770ce04fe9fd88a3489362642a0e34ae86a7b4958703e89e8b7a1ecf4","tests/future_join.rs":"f59d7b948df7019e52f902ca7aef17f89ad26582bd1902d520ba99f6f61ba508","tests/future_join_all.rs":"6adacfca4d33a769dbe72fd04c54b49580ecd7a9994a185cfe97dd7a2b55c298","tests/future_obj.rs":"a6aae88a194dc7d3bb961c20db78f180a01796cf7ea4bf106da98c40d89ed36d","tests/future_select_all.rs":"4cefc84d6b7ae2cf0007912cd0325fff6b926a4c26310e7b14a21868de61616f","tests/future_select_ok.rs":"1cabd03268641e1ac42b880344528bad73e3aeb6d6a8a141e652f339dd40184b","tests/future_shared.rs":"4f2cba1e74dacc4fc6b92eef04700df832533efe4fe6a392e3fd0f655b5b8450","tests/future_try_flatten_stream.rs":"aa4542b5d88f62522b736fac4567613081df45ad3eb54b0b659cdadc9409c4db","tests/future_try_join_all.rs":"cca2c5a3b42fe4bf9705301cd1450b30a3822736c5c09793eee06b28ce686a19","tests/io_buf_reader.rs":"1d60479224d5aa9378d4aed6246362b08a823ee7c9977f6a5e44fce7c40116be","tests/io_buf_writer.rs":"8f7a78ab2955d2beb69d0881321d4191235540aef6448e875e7f76a2ffc55b89","tests/io_cursor.rs":"cba5a7b968b9f816ac33316ce1e4da67cb320aa5a21332c0f9a45694fa445dd7","tests/io_line_writer.rs":"5b1140de776a721a677911496daa4e7956cc52cc08838d593ab300a93e0d7984","tests/io_lines.rs":"72a310c885591793ed724d0aa2158ac2c9d1af22de417044d96b714f78317586","tests/io_read.rs":"e0a8fa9b27e042f03c9fe14e8f0f329a67e24afad1ce40b906a1ab4d2abef23a","tests/io_read_exact.rs":"42049cd67589992dc09764ffb3836c475115b26dee441fd4cc7e847b2d166667","tests/io_read_line.rs":"f360c30c32fc8c73b371281e86c3f1095da7ef23b702debb30d335046dc77dac","tests/io_read_to_end.rs":"ea3e961e39a0b92930bded05e8ba26e4902461ab53818843d40fae8065b1a803","tests/io_read_to_string.rs":"824921601ac49f15b9a0b349c900f9cc9081cf2646e6a86f443166f841f1320e","tests/io_read_until.rs":"36d9a98149b2410894121ccba49e5134e3209826b2225acfc787016cea2bc92a","tests/io_window.rs":"0d18334b1eb35f5e93099e19c0cab22abe5971d8531176b81345fc89d07692a8","tests/io_write.rs":"701032ff3d5a6e6a3d8cb4e373d1c93e4708f2e5ee0a6742fa626f27b6094b4d","tests/lock_mutex.rs":"eb47121b842096353165b1444bf679a2df0103b181f811b40042f5c3f1d00c73","tests/macro_comma_support.rs":"627024ccadfe95194469d5bae2cc29b897b0118a664d7222408a2e234a10e939","tests/object_safety.rs":"9d047190387ed8334113687003c23407c80c858411f5ec7d5c505500f9639dfc","tests/oneshot.rs":"2109a8b3b524f4b36be9fb100f9b8c0d38bbd38d51716adcafdb65994b4a81d6","tests/ready_queue.rs":"6380025061025c27cb3b521df9520f169c7aa8e1802b881d539023bb4651744a","tests/recurse.rs":"b01b3d73b69ad90a767d297f974dac435817c39e12556fa6a3e6c725dd84f706","tests/sink.rs":"d9b2ddcbbb6af9e36d057db97dbba233547be645a7e4901b2842a4671f9f0212","tests/sink_fanout.rs":"67ab58422040308353955311f75222e55378e4cc34557c7b34140bd20c259132","tests/stream.rs":"6cb49d74e63a6264b2862d1020517251262010441a9f3e1eb0b3a83c908b705b","tests/stream_abortable.rs":"60052b83b5eeb2395b77bc213f35098d2d5880529f0d83884582a8bbff78b139","tests/stream_buffer_unordered.rs":"143ee19056b9ee9e480903cf4a1b00da7d4e528c5804569bf8c40869e6ac6eed","tests/stream_catch_unwind.rs":"5cdaaf70436c49d3a7107bdc5547ddb8757c3d2057635aded70e485d0cb9cbfc","tests/stream_futures_ordered.rs":"f9083bd8cfa86620c51abffc390564432022b5c8d15a7cba15dd5cb53ae99dd6","tests/stream_futures_unordered.rs":"c888112d760db856e4d9191a2a6a3aa4a757d65e47a12fcd16fc5be7bf0b3e78","tests/stream_into_async_read.rs":"00ecb18289ebc8f46ea0cf43e0dce0631d7698bd1303a7bcd84d0addc9d8b645","tests/stream_peekable.rs":"c0addb0c510e13183ba3d6102633b75a9223651ae80a64542e913c712fe69a30","tests/stream_select_all.rs":"3a9045754939da5b30305e78f0571d79a03aaa77030c6ccf82225f076e9843c9","tests/stream_select_next_some.rs":"871edcee3ffc16c697251b29c9ba500aa4e3e503aa738748d7392e3462c82dce","tests/stream_split.rs":"074e9c9b51b6f7ea83d77347b5a0c8d414ca32b90445fec9b85f7f4cd2a6049f","tests/stream_try_stream.rs":"62ac8242ce3311930d352ad96573208d0df9ea5bc4e37d6edafabc7b3291ef88","tests/stream_unfold.rs":"7c6fbd10c782828793cbe1eb347ec776d99b185dad498e886f7161da76f76880","tests/task_arc_wake.rs":"5a49d074d1d5d9d5ec383dcd9a3868f636c1d7e34662e2573e467948db126206","tests/task_atomic_waker.rs":"8e85b4bc1360788646a52633dfe896d852773d6b482f81626cf534b97b7d937a","tests/test_macro.rs":"a46a946169c342c576936b60909165a50b94350501280ed9bba89d365af69287","tests/try_join.rs":"65f282f8351bd9a74642f2465c7aaf72ee7097002920989f156d60271652549e","tests_disabled/all.rs":"ddcd8fefb0d4a4a91a78328e7e652c35f93dc3669639d76fa0f56452b51abc23","tests_disabled/stream.rs":"8a615a472a35053d12b269d40fe244dfb3ba66fb78d217323aa2be177d5a111e"},"package":"da0290714b38af9b4a7b094b8a37086d1b4e61f2df9122c3cad2577669145335"} \ No newline at end of file +{"files":{"Cargo.toml":"f6608fc3b8f2c4ceff1d038056f9ae359c2c77d72f83158867abcf53a4c957b0","LICENSE-APACHE":"275c491d6d1160553c32fd6127061d7f9606c3ea25abfad6ca3f6ed088785427","LICENSE-MIT":"6652c868f35dfe5e8ef636810a4e576b9d663f3a17fb0f5613ad73583e1b88fd","README.md":"842d0b8a539ab13ba2b9863cd8fb27da4fc7e9def1aefeb21db5aa04269b1e34","src/lib.rs":"bb07f533ba89a36c0385b57de17d51bf23ccab9e13e00ec812a74f376df15930","tests/_require_features.rs":"5ad24019430b498addfc1fd853e955c7b646d78d0727a8ca29f586c9aab45cff","tests/async_await_macros.rs":"87863f5b73217d727a4789d69229ab5dd85252b8e76a1aca0220feb98a0922af","tests/auto_traits.rs":"d5e0e5ed4b6b93103a5d5725cca87b3c65a07c3f891f8c8f52e7d66e3a991833","tests/bilock.rs":"bd0bf617352528f686b3fbb1847f4da9f6fe351e456e0bdce888bc738311fa83","tests/compat.rs":"1449926cc046d2ae9f86a263efd9353ca8e174ea546c083b360136c5a2aef1d1","tests/eager_drop.rs":"dc25d067207c06bbe094752d70bf161e206f00e162ffa3219583c8b4eb0816a1","tests/eventual.rs":"9050809e5196d0870a3ee2a268a5b4b398739b01617e1e317a673ac0660974cf","tests/future_abortable.rs":"4c81607472a85c5d87a5fe8a510a24cf1e8793fedf7f6cd6741ba1efd66615cd","tests/future_basic_combinators.rs":"4508c1250b85a4f749b7261bbd0ba728d3970e7ba277e84a006e76cf068fb54f","tests/future_fuse.rs":"bb63141f1486e755d0cdea1d93e302ad864a2186aa5287f909a0b3a922e82065","tests/future_inspect.rs":"9c03ceb770ce04fe9fd88a3489362642a0e34ae86a7b4958703e89e8b7a1ecf4","tests/future_join.rs":"f59d7b948df7019e52f902ca7aef17f89ad26582bd1902d520ba99f6f61ba508","tests/future_join_all.rs":"6adacfca4d33a769dbe72fd04c54b49580ecd7a9994a185cfe97dd7a2b55c298","tests/future_obj.rs":"a6aae88a194dc7d3bb961c20db78f180a01796cf7ea4bf106da98c40d89ed36d","tests/future_select_all.rs":"4cefc84d6b7ae2cf0007912cd0325fff6b926a4c26310e7b14a21868de61616f","tests/future_select_ok.rs":"1cabd03268641e1ac42b880344528bad73e3aeb6d6a8a141e652f339dd40184b","tests/future_shared.rs":"4f2cba1e74dacc4fc6b92eef04700df832533efe4fe6a392e3fd0f655b5b8450","tests/future_try_flatten_stream.rs":"aa4542b5d88f62522b736fac4567613081df45ad3eb54b0b659cdadc9409c4db","tests/future_try_join_all.rs":"cca2c5a3b42fe4bf9705301cd1450b30a3822736c5c09793eee06b28ce686a19","tests/io_buf_reader.rs":"1d60479224d5aa9378d4aed6246362b08a823ee7c9977f6a5e44fce7c40116be","tests/io_buf_writer.rs":"8f7a78ab2955d2beb69d0881321d4191235540aef6448e875e7f76a2ffc55b89","tests/io_cursor.rs":"cba5a7b968b9f816ac33316ce1e4da67cb320aa5a21332c0f9a45694fa445dd7","tests/io_line_writer.rs":"5b1140de776a721a677911496daa4e7956cc52cc08838d593ab300a93e0d7984","tests/io_lines.rs":"72a310c885591793ed724d0aa2158ac2c9d1af22de417044d96b714f78317586","tests/io_read.rs":"e0a8fa9b27e042f03c9fe14e8f0f329a67e24afad1ce40b906a1ab4d2abef23a","tests/io_read_exact.rs":"42049cd67589992dc09764ffb3836c475115b26dee441fd4cc7e847b2d166667","tests/io_read_line.rs":"f360c30c32fc8c73b371281e86c3f1095da7ef23b702debb30d335046dc77dac","tests/io_read_to_end.rs":"ea3e961e39a0b92930bded05e8ba26e4902461ab53818843d40fae8065b1a803","tests/io_read_to_string.rs":"824921601ac49f15b9a0b349c900f9cc9081cf2646e6a86f443166f841f1320e","tests/io_read_until.rs":"36d9a98149b2410894121ccba49e5134e3209826b2225acfc787016cea2bc92a","tests/io_window.rs":"0d18334b1eb35f5e93099e19c0cab22abe5971d8531176b81345fc89d07692a8","tests/io_write.rs":"701032ff3d5a6e6a3d8cb4e373d1c93e4708f2e5ee0a6742fa626f27b6094b4d","tests/lock_mutex.rs":"eb47121b842096353165b1444bf679a2df0103b181f811b40042f5c3f1d00c73","tests/macro_comma_support.rs":"627024ccadfe95194469d5bae2cc29b897b0118a664d7222408a2e234a10e939","tests/object_safety.rs":"9d047190387ed8334113687003c23407c80c858411f5ec7d5c505500f9639dfc","tests/oneshot.rs":"2109a8b3b524f4b36be9fb100f9b8c0d38bbd38d51716adcafdb65994b4a81d6","tests/ready_queue.rs":"6380025061025c27cb3b521df9520f169c7aa8e1802b881d539023bb4651744a","tests/recurse.rs":"b01b3d73b69ad90a767d297f974dac435817c39e12556fa6a3e6c725dd84f706","tests/sink.rs":"d9b2ddcbbb6af9e36d057db97dbba233547be645a7e4901b2842a4671f9f0212","tests/sink_fanout.rs":"67ab58422040308353955311f75222e55378e4cc34557c7b34140bd20c259132","tests/stream.rs":"049762ea6dad747cc9e7609f63487e25065a4c0032488e276f65fd522a07867c","tests/stream_abortable.rs":"60052b83b5eeb2395b77bc213f35098d2d5880529f0d83884582a8bbff78b139","tests/stream_buffer_unordered.rs":"143ee19056b9ee9e480903cf4a1b00da7d4e528c5804569bf8c40869e6ac6eed","tests/stream_catch_unwind.rs":"5cdaaf70436c49d3a7107bdc5547ddb8757c3d2057635aded70e485d0cb9cbfc","tests/stream_futures_ordered.rs":"f9083bd8cfa86620c51abffc390564432022b5c8d15a7cba15dd5cb53ae99dd6","tests/stream_futures_unordered.rs":"c888112d760db856e4d9191a2a6a3aa4a757d65e47a12fcd16fc5be7bf0b3e78","tests/stream_into_async_read.rs":"00ecb18289ebc8f46ea0cf43e0dce0631d7698bd1303a7bcd84d0addc9d8b645","tests/stream_peekable.rs":"c0addb0c510e13183ba3d6102633b75a9223651ae80a64542e913c712fe69a30","tests/stream_select_all.rs":"3a9045754939da5b30305e78f0571d79a03aaa77030c6ccf82225f076e9843c9","tests/stream_select_next_some.rs":"871edcee3ffc16c697251b29c9ba500aa4e3e503aa738748d7392e3462c82dce","tests/stream_split.rs":"074e9c9b51b6f7ea83d77347b5a0c8d414ca32b90445fec9b85f7f4cd2a6049f","tests/stream_try_stream.rs":"eba57cdda77f2aeee3a6059d5771c9a100f99a7eeb4460e7f7819803759fba86","tests/stream_unfold.rs":"7c6fbd10c782828793cbe1eb347ec776d99b185dad498e886f7161da76f76880","tests/task_arc_wake.rs":"5a49d074d1d5d9d5ec383dcd9a3868f636c1d7e34662e2573e467948db126206","tests/task_atomic_waker.rs":"8e85b4bc1360788646a52633dfe896d852773d6b482f81626cf534b97b7d937a","tests/test_macro.rs":"a46a946169c342c576936b60909165a50b94350501280ed9bba89d365af69287","tests/try_join.rs":"65f282f8351bd9a74642f2465c7aaf72ee7097002920989f156d60271652549e","tests_disabled/all.rs":"ddcd8fefb0d4a4a91a78328e7e652c35f93dc3669639d76fa0f56452b51abc23","tests_disabled/stream.rs":"8a615a472a35053d12b269d40fe244dfb3ba66fb78d217323aa2be177d5a111e"},"package":"23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/futures/Cargo.toml temporalio-1.3.0/vendor/futures/Cargo.toml --- temporalio-1.3.0/vendor/futures/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/futures/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -13,7 +13,7 @@ edition = "2018" rust-version = "1.56" name = "futures" -version = "0.3.29" +version = "0.3.28" description = """ An implementation of futures and streams featuring zero allocations, composability, and iterator-like interfaces. @@ -47,33 +47,33 @@ ] [dependencies.futures-channel] -version = "0.3.29" +version = "0.3.28" features = ["sink"] default-features = false [dependencies.futures-core] -version = "0.3.29" +version = "0.3.28" default-features = false [dependencies.futures-executor] -version = "0.3.29" +version = "0.3.28" optional = true default-features = false [dependencies.futures-io] -version = "0.3.29" +version = "0.3.28" default-features = false [dependencies.futures-sink] -version = "0.3.29" +version = "0.3.28" default-features = false [dependencies.futures-task] -version = "0.3.29" +version = "0.3.28" default-features = false [dependencies.futures-util] -version = "0.3.29" +version = "0.3.28" features = ["sink"] default-features = false diff -Nru temporalio-1.3.0/vendor/futures/tests/auto_traits.rs temporalio-1.3.0/vendor/futures/tests/auto_traits.rs --- temporalio-1.3.0/vendor/futures/tests/auto_traits.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/futures/tests/auto_traits.rs 2023-10-30 19:40:00.000000000 +0000 @@ -18,8 +18,6 @@ pub type SendTryFuture = SendFuture>; pub type SyncFuture = Pin + Sync>>; pub type SyncTryFuture = SyncFuture>; -pub type SendSyncFuture = Pin + Send + Sync>>; -pub type SendSyncTryFuture = SendSyncFuture>; pub type UnpinFuture = LocalFuture; pub type UnpinTryFuture = UnpinFuture>; pub struct PinnedFuture(PhantomPinned, PhantomData); @@ -37,8 +35,6 @@ pub type SendTryStream = SendStream>; pub type SyncStream = Pin + Sync>>; pub type SyncTryStream = SyncStream>; -pub type SendSyncStream = Pin + Send + Sync>>; -pub type SendSyncTryStream = SendSyncStream>; pub type UnpinStream = LocalStream; pub type UnpinTryStream = UnpinStream>; pub struct PinnedStream(PhantomPinned, PhantomData); @@ -369,10 +365,9 @@ assert_impl!(JoinAll>: Send); assert_not_impl!(JoinAll: Send); assert_not_impl!(JoinAll: Send); - assert_impl!(JoinAll>: Sync); - assert_not_impl!(JoinAll>: Sync); - assert_not_impl!(JoinAll>: Sync); - assert_not_impl!(JoinAll: Sync); + assert_impl!(JoinAll>: Sync); + assert_not_impl!(JoinAll: Sync); + assert_not_impl!(JoinAll: Sync); assert_impl!(JoinAll: Unpin); assert_impl!(Lazy<()>: Send); @@ -584,10 +579,9 @@ assert_impl!(TryJoinAll>: Send); assert_not_impl!(TryJoinAll: Send); assert_not_impl!(TryJoinAll: Send); - assert_impl!(TryJoinAll>: Sync); - assert_not_impl!(TryJoinAll>: Sync); - assert_not_impl!(TryJoinAll>: Sync); - assert_not_impl!(TryJoinAll: Sync); + assert_impl!(TryJoinAll>: Sync); + assert_not_impl!(TryJoinAll: Sync); + assert_not_impl!(TryJoinAll: Sync); assert_impl!(TryJoinAll: Unpin); assert_impl!(TrySelect: Send); @@ -1124,9 +1118,10 @@ assert_not_impl!(Buffered>: Send); assert_not_impl!(Buffered>: Send); assert_not_impl!(Buffered>>: Send); - assert_impl!(Buffered>>: Sync); - assert_not_impl!(Buffered>>: Sync); - assert_not_impl!(Buffered>>: Sync); + assert_impl!(Buffered>>: Sync); + assert_not_impl!(Buffered>: Sync); + assert_not_impl!(Buffered>: Sync); + assert_not_impl!(Buffered>>: Sync); assert_impl!(Buffered>: Unpin); assert_not_impl!(Buffered>: Unpin); @@ -1308,10 +1303,9 @@ assert_impl!(FuturesOrdered>: Send); assert_not_impl!(FuturesOrdered: Send); assert_not_impl!(FuturesOrdered: Send); - assert_impl!(FuturesOrdered>: Sync); - assert_not_impl!(FuturesOrdered>: Sync); - assert_not_impl!(FuturesOrdered>: Sync); - assert_not_impl!(FuturesOrdered: Sync); + assert_impl!(FuturesOrdered>: Sync); + assert_not_impl!(FuturesOrdered>: Sync); + assert_not_impl!(FuturesOrdered>: Sync); assert_impl!(FuturesOrdered: Unpin); assert_impl!(FuturesUnordered<()>: Send); @@ -1653,12 +1647,11 @@ assert_not_impl!(TryBuffered>>: Send); assert_not_impl!(TryBuffered>>: Send); assert_not_impl!(TryBuffered>>: Send); - assert_impl!(TryBuffered>>: Sync); - assert_not_impl!(TryBuffered>>: Sync); - assert_not_impl!(TryBuffered>>: Sync); - assert_not_impl!(TryBuffered>>: Sync); - assert_not_impl!(TryBuffered>>: Sync); - assert_not_impl!(TryBuffered>>: Sync); + assert_impl!(TryBuffered>>: Sync); + assert_not_impl!(TryBuffered>>: Sync); + assert_not_impl!(TryBuffered>>: Sync); + assert_not_impl!(TryBuffered>>: Sync); + assert_not_impl!(TryBuffered>>: Sync); assert_impl!(TryBuffered>: Unpin); assert_not_impl!(TryBuffered>: Unpin); diff -Nru temporalio-1.3.0/vendor/futures/tests/stream.rs temporalio-1.3.0/vendor/futures/tests/stream.rs --- temporalio-1.3.0/vendor/futures/tests/stream.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/futures/tests/stream.rs 2023-10-30 19:40:00.000000000 +0000 @@ -535,43 +535,3 @@ assert_eq!(count.get(), times_should_poll + 1); } } - -async fn is_even(number: u8) -> bool { - number % 2 == 0 -} - -#[test] -fn all() { - block_on(async { - let empty: [u8; 0] = []; - let st = stream::iter(empty); - let all = st.all(is_even).await; - assert!(all); - - let st = stream::iter([2, 4, 6, 8]); - let all = st.all(is_even).await; - assert!(all); - - let st = stream::iter([2, 3, 4]); - let all = st.all(is_even).await; - assert!(!all); - }); -} - -#[test] -fn any() { - block_on(async { - let empty: [u8; 0] = []; - let st = stream::iter(empty); - let any = st.any(is_even).await; - assert!(!any); - - let st = stream::iter([1, 2, 3]); - let any = st.any(is_even).await; - assert!(any); - - let st = stream::iter([1, 3, 5]); - let any = st.any(is_even).await; - assert!(!any); - }); -} diff -Nru temporalio-1.3.0/vendor/futures/tests/stream_try_stream.rs temporalio-1.3.0/vendor/futures/tests/stream_try_stream.rs --- temporalio-1.3.0/vendor/futures/tests/stream_try_stream.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/futures/tests/stream_try_stream.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,5 +1,4 @@ use core::pin::Pin; -use std::convert::Infallible; use futures::{ stream::{self, repeat, Repeat, StreamExt, TryStreamExt}, @@ -133,51 +132,3 @@ assert_eq!(taken, 31); }) } - -async fn is_even(number: u8) -> bool { - number % 2 == 0 -} - -#[test] -fn try_all() { - block_on(async { - let empty: [Result; 0] = []; - let st = stream::iter(empty); - let all = st.try_all(is_even).await; - assert_eq!(Ok(true), all); - - let st = stream::iter([Ok::<_, Infallible>(2), Ok(4), Ok(6), Ok(8)]); - let all = st.try_all(is_even).await; - assert_eq!(Ok(true), all); - - let st = stream::iter([Ok::<_, Infallible>(2), Ok(3), Ok(4)]); - let all = st.try_all(is_even).await; - assert_eq!(Ok(false), all); - - let st = stream::iter([Ok(2), Ok(4), Err("err"), Ok(8)]); - let all = st.try_all(is_even).await; - assert_eq!(Err("err"), all); - }); -} - -#[test] -fn try_any() { - block_on(async { - let empty: [Result; 0] = []; - let st = stream::iter(empty); - let any = st.try_any(is_even).await; - assert_eq!(Ok(false), any); - - let st = stream::iter([Ok::<_, Infallible>(1), Ok(2), Ok(3)]); - let any = st.try_any(is_even).await; - assert_eq!(Ok(true), any); - - let st = stream::iter([Ok::<_, Infallible>(1), Ok(3), Ok(5)]); - let any = st.try_any(is_even).await; - assert_eq!(Ok(false), any); - - let st = stream::iter([Ok(1), Ok(3), Err("err"), Ok(8)]); - let any = st.try_any(is_even).await; - assert_eq!(Err("err"), any); - }); -} diff -Nru temporalio-1.3.0/vendor/futures-channel/.cargo-checksum.json temporalio-1.3.0/vendor/futures-channel/.cargo-checksum.json --- temporalio-1.3.0/vendor/futures-channel/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/futures-channel/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"Cargo.toml":"d285eda4d96587b0256112206d1d1d313cd64216c32b0812c097bfe5b0d5c81d","LICENSE-APACHE":"275c491d6d1160553c32fd6127061d7f9606c3ea25abfad6ca3f6ed088785427","LICENSE-MIT":"6652c868f35dfe5e8ef636810a4e576b9d663f3a17fb0f5613ad73583e1b88fd","README.md":"faccd17503a06e7df67feb53da22dba6a8ea80ee88736ed37fae038d0d0906dd","benches/sync_mpsc.rs":"1019dd027f104f58883f396ff70efc3dd69b3a7d62df17af090e07b2b05eaf66","build.rs":"5b263bd2bd587511a9c8daef580b05e0613c15a6c5f800b1e5bc145fa013d99e","no_atomic_cas.rs":"7ae747b83b08dd926c1696faf4ecab9399c652ae77d5179221258c73b8eecb6f","src/lib.rs":"2955e70d292208747fbb29810ef88f390f0f1b22b112fa59d60f95480d470e75","src/lock.rs":"38655a797456ea4f67d132c42055cf74f18195e875c3b337fc81a12901f79292","src/mpsc/mod.rs":"ecb48325aad15406ed79bf7271440bfbab5af19d5e7c7d8018e8b19613ae1558","src/mpsc/queue.rs":"0856f8b744c537c291d60cc7879ddb2d8cd686a6ac0e4a79c6877f8c3f8f6dbc","src/mpsc/sink_impl.rs":"c9977b530187e82c912fcd46e08316e48ed246e77bb2419d53020e69e403d086","src/oneshot.rs":"1e4e33c75d72b5d11cc23710e2a08099e04b72bf2368b68e7c1eb0beb6fc03fa","tests/channel.rs":"88f4a41d82b5c1b01e153d071a2bf48e0697355908c55ca42342ed45e63fdec8","tests/mpsc-close.rs":"cb3a427403051a731701de5d2a489f8a7b7a5eaceb5edfafef4a539e63588d3c","tests/mpsc-size_hint.rs":"50fba3495bdf4e91a84ad105b148b6cd72f73f64a85703414eeb2d07732c66b9","tests/mpsc.rs":"5e09a49bea7b7ee30c9845bc5e80565d720c6e2355bcac4a0c745b3c7e6cc212","tests/oneshot.rs":"0f97d28852a1fd1327211772f43322c93916a639be3f2581e49ad37c9f8a2f88"},"package":"ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb"} \ No newline at end of file +{"files":{"Cargo.toml":"b9e4a55febf64f3b1e637d4e7e2fe7efcf9963c1c10d1e62e989e0ebd491e914","LICENSE-APACHE":"275c491d6d1160553c32fd6127061d7f9606c3ea25abfad6ca3f6ed088785427","LICENSE-MIT":"6652c868f35dfe5e8ef636810a4e576b9d663f3a17fb0f5613ad73583e1b88fd","README.md":"faccd17503a06e7df67feb53da22dba6a8ea80ee88736ed37fae038d0d0906dd","benches/sync_mpsc.rs":"1019dd027f104f58883f396ff70efc3dd69b3a7d62df17af090e07b2b05eaf66","build.rs":"5b263bd2bd587511a9c8daef580b05e0613c15a6c5f800b1e5bc145fa013d99e","no_atomic_cas.rs":"7ae747b83b08dd926c1696faf4ecab9399c652ae77d5179221258c73b8eecb6f","src/lib.rs":"2955e70d292208747fbb29810ef88f390f0f1b22b112fa59d60f95480d470e75","src/lock.rs":"38655a797456ea4f67d132c42055cf74f18195e875c3b337fc81a12901f79292","src/mpsc/mod.rs":"2991f3972780fd16b1aaac3a1b5a489112cd7114a2e8bcaa67cc35d7ab3d8866","src/mpsc/queue.rs":"0856f8b744c537c291d60cc7879ddb2d8cd686a6ac0e4a79c6877f8c3f8f6dbc","src/mpsc/sink_impl.rs":"c9977b530187e82c912fcd46e08316e48ed246e77bb2419d53020e69e403d086","src/oneshot.rs":"c7b5224d52b8c257baf23c385442503ad2ebfccd75ed894e7a4a259097ac9cb5","tests/channel.rs":"88f4a41d82b5c1b01e153d071a2bf48e0697355908c55ca42342ed45e63fdec8","tests/mpsc-close.rs":"cb3a427403051a731701de5d2a489f8a7b7a5eaceb5edfafef4a539e63588d3c","tests/mpsc-size_hint.rs":"50fba3495bdf4e91a84ad105b148b6cd72f73f64a85703414eeb2d07732c66b9","tests/mpsc.rs":"8b0caa7a6c45c0878e0384485b848ac496e4bcd75a0de598e0aee5246348a71b","tests/oneshot.rs":"0f97d28852a1fd1327211772f43322c93916a639be3f2581e49ad37c9f8a2f88"},"package":"955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/futures-channel/Cargo.toml temporalio-1.3.0/vendor/futures-channel/Cargo.toml --- temporalio-1.3.0/vendor/futures-channel/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/futures-channel/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -13,7 +13,7 @@ edition = "2018" rust-version = "1.56" name = "futures-channel" -version = "0.3.29" +version = "0.3.28" description = """ Channels for asynchronous communication using futures-rs. """ @@ -30,11 +30,11 @@ ] [dependencies.futures-core] -version = "0.3.29" +version = "0.3.28" default-features = false [dependencies.futures-sink] -version = "0.3.29" +version = "0.3.28" optional = true default-features = false diff -Nru temporalio-1.3.0/vendor/futures-channel/src/mpsc/mod.rs temporalio-1.3.0/vendor/futures-channel/src/mpsc/mod.rs --- temporalio-1.3.0/vendor/futures-channel/src/mpsc/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/futures-channel/src/mpsc/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -119,12 +119,12 @@ /// The transmission end of a bounded mpsc channel. /// -/// This value is created by the [`channel`] function. +/// This value is created by the [`channel`](channel) function. pub struct Sender(Option>); /// The transmission end of an unbounded mpsc channel. /// -/// This value is created by the [`unbounded`] function. +/// This value is created by the [`unbounded`](unbounded) function. pub struct UnboundedSender(Option>); trait AssertKinds: Send + Sync + Clone {} @@ -132,14 +132,14 @@ /// The receiving end of a bounded mpsc channel. /// -/// This value is created by the [`channel`] function. +/// This value is created by the [`channel`](channel) function. pub struct Receiver { inner: Option>>, } /// The receiving end of an unbounded mpsc channel. /// -/// This value is created by the [`unbounded`] function. +/// This value is created by the [`unbounded`](unbounded) function. pub struct UnboundedReceiver { inner: Option>>, } @@ -343,8 +343,9 @@ /// guaranteed slot in the channel capacity, and on top of that there are /// `buffer` "first come, first serve" slots available to all senders. /// -/// The [`Receiver`] returned implements the [`Stream`] trait, while [`Sender`] -/// implements `Sink`. +/// The [`Receiver`](Receiver) returned implements the +/// [`Stream`](futures_core::stream::Stream) trait, while [`Sender`](Sender) implements +/// `Sink`. pub fn channel(buffer: usize) -> (Sender, Receiver) { // Check that the requested buffer size does not exceed the maximum buffer // size permitted by the system. @@ -841,20 +842,6 @@ let ptr = self.0.as_ref().map(|inner| inner.ptr()); ptr.hash(hasher); } - - /// Return the number of messages in the queue or 0 if channel is disconnected. - pub fn len(&self) -> usize { - if let Some(sender) = &self.0 { - decode_state(sender.inner.state.load(SeqCst)).num_messages - } else { - 0 - } - } - - /// Return false is channel has no queued messages, true otherwise. - pub fn is_empty(&self) -> bool { - self.len() == 0 - } } impl Clone for Sender { diff -Nru temporalio-1.3.0/vendor/futures-channel/src/oneshot.rs temporalio-1.3.0/vendor/futures-channel/src/oneshot.rs --- temporalio-1.3.0/vendor/futures-channel/src/oneshot.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/futures-channel/src/oneshot.rs 2023-10-30 19:40:00.000000000 +0000 @@ -14,7 +14,7 @@ /// A future for a value that will be provided by another asynchronous task. /// -/// This is created by the [`channel`] function. +/// This is created by the [`channel`](channel) function. #[must_use = "futures do nothing unless you `.await` or poll them"] pub struct Receiver { inner: Arc>, @@ -22,7 +22,7 @@ /// A means of transmitting a single value to another task. /// -/// This is created by the [`channel`] function. +/// This is created by the [`channel`](channel) function. pub struct Sender { inner: Arc>, } @@ -332,8 +332,8 @@ /// Completes this oneshot with a successful result. /// /// This function will consume `self` and indicate to the other end, the - /// [`Receiver`], that the value provided is the result of the computation - /// this represents. + /// [`Receiver`](Receiver), that the value provided is the result of the + /// computation this represents. /// /// If the value is successfully enqueued for the remote end to receive, /// then `Ok(())` is returned. If the receiving end was dropped before @@ -343,7 +343,7 @@ } /// Polls this `Sender` half to detect whether its associated - /// [`Receiver`] has been dropped. + /// [`Receiver`](Receiver) has been dropped. /// /// # Return values /// @@ -359,10 +359,10 @@ } /// Creates a future that resolves when this `Sender`'s corresponding - /// [`Receiver`] half has hung up. + /// [`Receiver`](Receiver) half has hung up. /// /// This is a utility wrapping [`poll_canceled`](Sender::poll_canceled) - /// to expose a [`Future`]. + /// to expose a [`Future`](core::future::Future). pub fn cancellation(&mut self) -> Cancellation<'_, T> { Cancellation { inner: self } } @@ -413,8 +413,8 @@ } } -/// Error returned from a [`Receiver`] when the corresponding [`Sender`] is -/// dropped. +/// Error returned from a [`Receiver`](Receiver) when the corresponding +/// [`Sender`](Sender) is dropped. #[derive(Clone, Copy, PartialEq, Eq, Debug)] pub struct Canceled; diff -Nru temporalio-1.3.0/vendor/futures-channel/tests/mpsc.rs temporalio-1.3.0/vendor/futures-channel/tests/mpsc.rs --- temporalio-1.3.0/vendor/futures-channel/tests/mpsc.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/futures-channel/tests/mpsc.rs 2023-10-30 19:40:00.000000000 +0000 @@ -632,26 +632,3 @@ let item = block_on(rx.next()).unwrap(); assert_eq!(item, 2); } - -/// Test that empty channel has zero length and that non-empty channel has length equal to number -/// of enqueued items -#[test] -fn unbounded_len() { - let (tx, mut rx) = mpsc::unbounded(); - assert_eq!(tx.len(), 0); - assert!(tx.is_empty()); - tx.unbounded_send(1).unwrap(); - assert_eq!(tx.len(), 1); - assert!(!tx.is_empty()); - tx.unbounded_send(2).unwrap(); - assert_eq!(tx.len(), 2); - assert!(!tx.is_empty()); - let item = block_on(rx.next()).unwrap(); - assert_eq!(item, 1); - assert_eq!(tx.len(), 1); - assert!(!tx.is_empty()); - let item = block_on(rx.next()).unwrap(); - assert_eq!(item, 2); - assert_eq!(tx.len(), 0); - assert!(tx.is_empty()); -} diff -Nru temporalio-1.3.0/vendor/futures-core/.cargo-checksum.json temporalio-1.3.0/vendor/futures-core/.cargo-checksum.json --- temporalio-1.3.0/vendor/futures-core/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/futures-core/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"Cargo.toml":"a42f5d0345ecafd60c3686aa3212cc9ef2d5a72da5f26783519bf1fcae729c49","LICENSE-APACHE":"275c491d6d1160553c32fd6127061d7f9606c3ea25abfad6ca3f6ed088785427","LICENSE-MIT":"6652c868f35dfe5e8ef636810a4e576b9d663f3a17fb0f5613ad73583e1b88fd","README.md":"e8258273fed6f1796485777655118f2369fd3f000191e9d8cdbd10bf052946a9","build.rs":"5b263bd2bd587511a9c8daef580b05e0613c15a6c5f800b1e5bc145fa013d99e","no_atomic_cas.rs":"7ae747b83b08dd926c1696faf4ecab9399c652ae77d5179221258c73b8eecb6f","src/future.rs":"0cb559fad0d43566dab959e929c4631c25cf749e2e29a5444fbcad464c9262ae","src/lib.rs":"eacd5816fbb914ca061d49ff6203723ebbe639eb7c45ebfa8a0613069d174111","src/stream.rs":"f1c7ab84161c5d5b424655b257fc3183eb6f2ed5324ba4006a70f9a4b0dc8872","src/task/__internal/atomic_waker.rs":"e5184bcc772c1472a2f0f9899bd3e388b74b771d327d801a5ea7e4aca6e57715","src/task/__internal/mod.rs":"6a343eb05b81352bf4b70e1f769d0c16b79e430d86500b084bd19b5ff2f129f5","src/task/mod.rs":"e213602a2fe5ae78ad5f1ca20e6d32dcbab17aba5b6b072fb927a72da99b4a11","src/task/poll.rs":"74c2717c1f9a37587a367da1b690d1cd2312e95dbaffca42be4755f1cd164bb8"},"package":"eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c"} \ No newline at end of file +{"files":{"Cargo.toml":"b7e1e0d8df044b3ebc034f0028807c51a13321fe2eeef99fbb7153b874b9158d","LICENSE-APACHE":"275c491d6d1160553c32fd6127061d7f9606c3ea25abfad6ca3f6ed088785427","LICENSE-MIT":"6652c868f35dfe5e8ef636810a4e576b9d663f3a17fb0f5613ad73583e1b88fd","README.md":"e8258273fed6f1796485777655118f2369fd3f000191e9d8cdbd10bf052946a9","build.rs":"5b263bd2bd587511a9c8daef580b05e0613c15a6c5f800b1e5bc145fa013d99e","no_atomic_cas.rs":"7ae747b83b08dd926c1696faf4ecab9399c652ae77d5179221258c73b8eecb6f","src/future.rs":"0cb559fad0d43566dab959e929c4631c25cf749e2e29a5444fbcad464c9262ae","src/lib.rs":"eacd5816fbb914ca061d49ff6203723ebbe639eb7c45ebfa8a0613069d174111","src/stream.rs":"f1c7ab84161c5d5b424655b257fc3183eb6f2ed5324ba4006a70f9a4b0dc8872","src/task/__internal/atomic_waker.rs":"e5184bcc772c1472a2f0f9899bd3e388b74b771d327d801a5ea7e4aca6e57715","src/task/__internal/mod.rs":"7d0d297f58987b05ffa152605feb78ddc9b6e5168e7d621ec36dfbee558e4bec","src/task/mod.rs":"e213602a2fe5ae78ad5f1ca20e6d32dcbab17aba5b6b072fb927a72da99b4a11","src/task/poll.rs":"74c2717c1f9a37587a367da1b690d1cd2312e95dbaffca42be4755f1cd164bb8"},"package":"4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/futures-core/Cargo.toml temporalio-1.3.0/vendor/futures-core/Cargo.toml --- temporalio-1.3.0/vendor/futures-core/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/futures-core/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -13,7 +13,7 @@ edition = "2018" rust-version = "1.36" name = "futures-core" -version = "0.3.29" +version = "0.3.28" description = """ The core traits and types in for the `futures` library. """ @@ -30,8 +30,7 @@ ] [dependencies.portable-atomic] -version = "1.3" -features = ["require-cas"] +version = "1" optional = true default-features = false diff -Nru temporalio-1.3.0/vendor/futures-core/src/task/__internal/mod.rs temporalio-1.3.0/vendor/futures-core/src/task/__internal/mod.rs --- temporalio-1.3.0/vendor/futures-core/src/task/__internal/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/futures-core/src/task/__internal/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,4 +1,4 @@ -#[cfg(any(not(futures_no_atomic_cas), feature = "portable-atomic"))] +#[cfg(not(futures_no_atomic_cas))] mod atomic_waker; -#[cfg(any(not(futures_no_atomic_cas), feature = "portable-atomic"))] +#[cfg(not(futures_no_atomic_cas))] pub use self::atomic_waker::AtomicWaker; diff -Nru temporalio-1.3.0/vendor/futures-executor/.cargo-checksum.json temporalio-1.3.0/vendor/futures-executor/.cargo-checksum.json --- temporalio-1.3.0/vendor/futures-executor/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/futures-executor/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"Cargo.toml":"b2af1091a3cf05b9a19d7177c17fee6b3e50b205b2423690df9a40e518c089bb","LICENSE-APACHE":"275c491d6d1160553c32fd6127061d7f9606c3ea25abfad6ca3f6ed088785427","LICENSE-MIT":"6652c868f35dfe5e8ef636810a4e576b9d663f3a17fb0f5613ad73583e1b88fd","README.md":"05ba6a5490962c4df45b78e9ad928a29dd5c3fad749284d5b812ca7e765feb6d","benches/thread_notify.rs":"e601968527bee85766f32d2d11de5ed8f6b4bd5a29989b5c369a52bd3cd3d024","src/enter.rs":"e3e890a8fa649e76cd2ce915abb11b67d15f3c5ae5e8e374142e0363917b2406","src/lib.rs":"08a25594c789cb4ce1c8929a9ddd745e67fee1db373e011a7ebe135933522614","src/local_pool.rs":"78177af55564fdfcfdc9f3974afe7d9d0682a7e4654761d83a8fc02abb34a7dc","src/thread_pool.rs":"e52f8527bc37c511513d77d183b44e3991a7b324aaed5d17bee0d092cf448a5b","src/unpark_mutex.rs":"e186464d9bdec22a6d1e1d900ed03a1154e6b0d422ede9bd3b768657cdbb6113","tests/local_pool.rs":"9639c9a290e23faab3913c6fec190853f890defaed6ffe67de177eca5d88932a"},"package":"0f4fb8693db0cf099eadcca0efe2a5a22e4550f98ed16aba6c48700da29597bc"} \ No newline at end of file +{"files":{"Cargo.toml":"dac1d16ebb659583c1092ed30905ea278db9b6a291a4f44e40bc25bd19997b70","LICENSE-APACHE":"275c491d6d1160553c32fd6127061d7f9606c3ea25abfad6ca3f6ed088785427","LICENSE-MIT":"6652c868f35dfe5e8ef636810a4e576b9d663f3a17fb0f5613ad73583e1b88fd","README.md":"05ba6a5490962c4df45b78e9ad928a29dd5c3fad749284d5b812ca7e765feb6d","benches/thread_notify.rs":"e601968527bee85766f32d2d11de5ed8f6b4bd5a29989b5c369a52bd3cd3d024","src/enter.rs":"e3e890a8fa649e76cd2ce915abb11b67d15f3c5ae5e8e374142e0363917b2406","src/lib.rs":"08a25594c789cb4ce1c8929a9ddd745e67fee1db373e011a7ebe135933522614","src/local_pool.rs":"78177af55564fdfcfdc9f3974afe7d9d0682a7e4654761d83a8fc02abb34a7dc","src/thread_pool.rs":"e52f8527bc37c511513d77d183b44e3991a7b324aaed5d17bee0d092cf448a5b","src/unpark_mutex.rs":"e186464d9bdec22a6d1e1d900ed03a1154e6b0d422ede9bd3b768657cdbb6113","tests/local_pool.rs":"9639c9a290e23faab3913c6fec190853f890defaed6ffe67de177eca5d88932a"},"package":"ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/futures-executor/Cargo.toml temporalio-1.3.0/vendor/futures-executor/Cargo.toml --- temporalio-1.3.0/vendor/futures-executor/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/futures-executor/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -13,7 +13,7 @@ edition = "2018" rust-version = "1.56" name = "futures-executor" -version = "0.3.29" +version = "0.3.28" description = """ Executors for asynchronous tasks based on the futures-rs library. """ @@ -30,15 +30,15 @@ ] [dependencies.futures-core] -version = "0.3.29" +version = "0.3.28" default-features = false [dependencies.futures-task] -version = "0.3.29" +version = "0.3.28" default-features = false [dependencies.futures-util] -version = "0.3.29" +version = "0.3.28" default-features = false [dependencies.num_cpus] diff -Nru temporalio-1.3.0/vendor/futures-io/.cargo-checksum.json temporalio-1.3.0/vendor/futures-io/.cargo-checksum.json --- temporalio-1.3.0/vendor/futures-io/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/futures-io/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"Cargo.toml":"4ecb5121321e37cb6138769827977acf349ca970a404a00758119bbe8d266b13","LICENSE-APACHE":"275c491d6d1160553c32fd6127061d7f9606c3ea25abfad6ca3f6ed088785427","LICENSE-MIT":"6652c868f35dfe5e8ef636810a4e576b9d663f3a17fb0f5613ad73583e1b88fd","README.md":"575430be5c47352d85f36b44dcc2c2851a6a19e2384593415c4af22c6654cee7","src/lib.rs":"526e9700c28250b7512f122952257d57adc38eb001af92ef25bdb48a8c453175"},"package":"8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa"} \ No newline at end of file +{"files":{"Cargo.toml":"6bf3d031936336da4e40d967b52e983e0aac5ae100a673e2a73831603c636b94","LICENSE-APACHE":"275c491d6d1160553c32fd6127061d7f9606c3ea25abfad6ca3f6ed088785427","LICENSE-MIT":"6652c868f35dfe5e8ef636810a4e576b9d663f3a17fb0f5613ad73583e1b88fd","README.md":"575430be5c47352d85f36b44dcc2c2851a6a19e2384593415c4af22c6654cee7","src/lib.rs":"526e9700c28250b7512f122952257d57adc38eb001af92ef25bdb48a8c453175"},"package":"4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/futures-io/Cargo.toml temporalio-1.3.0/vendor/futures-io/Cargo.toml --- temporalio-1.3.0/vendor/futures-io/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/futures-io/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -13,7 +13,7 @@ edition = "2018" rust-version = "1.36" name = "futures-io" -version = "0.3.29" +version = "0.3.28" description = """ The `AsyncRead`, `AsyncWrite`, `AsyncSeek`, and `AsyncBufRead` traits for the futures-rs library. """ diff -Nru temporalio-1.3.0/vendor/futures-macro/.cargo-checksum.json temporalio-1.3.0/vendor/futures-macro/.cargo-checksum.json --- temporalio-1.3.0/vendor/futures-macro/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/futures-macro/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"Cargo.toml":"9338dfd6dfea00833912aa366d82bd7d4555e99620bf319e74712855dad169c4","LICENSE-APACHE":"275c491d6d1160553c32fd6127061d7f9606c3ea25abfad6ca3f6ed088785427","LICENSE-MIT":"6652c868f35dfe5e8ef636810a4e576b9d663f3a17fb0f5613ad73583e1b88fd","src/executor.rs":"d2c8545c3438262484da3cddb6d998928bfef8d6d191480c13c0c390f15fe0f1","src/join.rs":"eb1b7beb09e877a88fb76ba195b87b657681234002386ab3519f33b0a6670098","src/lib.rs":"8324c4d5cc4e9e377b2f95afde751168d7e94196c1f2cb35802193c900ca0026","src/select.rs":"6c8193b36ecd06d91036a0502d76ea35b4393537b5fc0432df67aa49f831ad18","src/stream_select.rs":"5fb84834a40876ab1fd975c3af67594d0c5a4f8d724cb164db9bee71e70d14b1"},"package":"53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb"} \ No newline at end of file +{"files":{"Cargo.toml":"94ae7274ca3f2a7a283613a23de7ca2180b226f4cbe7952e7850535709ed3aab","LICENSE-APACHE":"275c491d6d1160553c32fd6127061d7f9606c3ea25abfad6ca3f6ed088785427","LICENSE-MIT":"6652c868f35dfe5e8ef636810a4e576b9d663f3a17fb0f5613ad73583e1b88fd","src/executor.rs":"d2c8545c3438262484da3cddb6d998928bfef8d6d191480c13c0c390f15fe0f1","src/join.rs":"eb1b7beb09e877a88fb76ba195b87b657681234002386ab3519f33b0a6670098","src/lib.rs":"8324c4d5cc4e9e377b2f95afde751168d7e94196c1f2cb35802193c900ca0026","src/select.rs":"6c8193b36ecd06d91036a0502d76ea35b4393537b5fc0432df67aa49f831ad18","src/stream_select.rs":"5fb84834a40876ab1fd975c3af67594d0c5a4f8d724cb164db9bee71e70d14b1"},"package":"89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/futures-macro/Cargo.toml temporalio-1.3.0/vendor/futures-macro/Cargo.toml --- temporalio-1.3.0/vendor/futures-macro/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/futures-macro/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -13,7 +13,7 @@ edition = "2018" rust-version = "1.56" name = "futures-macro" -version = "0.3.29" +version = "0.3.28" description = """ The futures-rs procedural macro implementations. """ @@ -25,7 +25,7 @@ proc-macro = true [dependencies.proc-macro2] -version = "1.0.60" +version = "1.0" [dependencies.quote] version = "1.0" diff -Nru temporalio-1.3.0/vendor/futures-sink/.cargo-checksum.json temporalio-1.3.0/vendor/futures-sink/.cargo-checksum.json --- temporalio-1.3.0/vendor/futures-sink/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/futures-sink/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"Cargo.toml":"99eec39e35c7daf6a96234a343a21e6a6388bb6586805bf65811b19cf1ac7e0a","LICENSE-APACHE":"275c491d6d1160553c32fd6127061d7f9606c3ea25abfad6ca3f6ed088785427","LICENSE-MIT":"6652c868f35dfe5e8ef636810a4e576b9d663f3a17fb0f5613ad73583e1b88fd","README.md":"a509e1ce84f285190130def6d2b9e3861988f9be725f7697f09fba347601d86f","src/lib.rs":"90c41f91e4b6764a218d4f337a9a46fba1e256f59f67b0afa5352ba92bf641c0"},"package":"e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817"} \ No newline at end of file +{"files":{"Cargo.toml":"041c5fb33e5f71dfbbfb3be81f025b6e5c0f369dece00378db58c105e013ac95","LICENSE-APACHE":"275c491d6d1160553c32fd6127061d7f9606c3ea25abfad6ca3f6ed088785427","LICENSE-MIT":"6652c868f35dfe5e8ef636810a4e576b9d663f3a17fb0f5613ad73583e1b88fd","README.md":"a509e1ce84f285190130def6d2b9e3861988f9be725f7697f09fba347601d86f","src/lib.rs":"90c41f91e4b6764a218d4f337a9a46fba1e256f59f67b0afa5352ba92bf641c0"},"package":"f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/futures-sink/Cargo.toml temporalio-1.3.0/vendor/futures-sink/Cargo.toml --- temporalio-1.3.0/vendor/futures-sink/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/futures-sink/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -13,7 +13,7 @@ edition = "2018" rust-version = "1.36" name = "futures-sink" -version = "0.3.29" +version = "0.3.28" description = """ The asynchronous `Sink` trait for the futures-rs library. """ diff -Nru temporalio-1.3.0/vendor/futures-task/.cargo-checksum.json temporalio-1.3.0/vendor/futures-task/.cargo-checksum.json --- temporalio-1.3.0/vendor/futures-task/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/futures-task/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"Cargo.toml":"5d2ffe0a6b7e323ee8b9705c7c7e0333fd0db27015123165bb568abfe3682c03","LICENSE-APACHE":"275c491d6d1160553c32fd6127061d7f9606c3ea25abfad6ca3f6ed088785427","LICENSE-MIT":"6652c868f35dfe5e8ef636810a4e576b9d663f3a17fb0f5613ad73583e1b88fd","README.md":"6762ad0401a70d3b3e1faf6967b310de688da34c16174fd079ebc88fcff2cc4c","build.rs":"5b263bd2bd587511a9c8daef580b05e0613c15a6c5f800b1e5bc145fa013d99e","no_atomic_cas.rs":"7ae747b83b08dd926c1696faf4ecab9399c652ae77d5179221258c73b8eecb6f","src/arc_wake.rs":"0e3f7d7883b75337b0b92ff55e477f0bf96f6eb08def7d953676a289fd9696ec","src/future_obj.rs":"20f210f33c6e61b3889d971fee2d9c23c1661da0e715d51c74f8c6d049c56135","src/lib.rs":"c55281988768d44d3305b2352c7ebb66e6449797239c07b14257a2d8e612e06b","src/noop_waker.rs":"41246601dab77f69bf09257afc3321031a5a31a7eda51787029870eda9922356","src/spawn.rs":"afcf46b98d62e78d2c974f91df32590bd78fe8c79031e4ae7accf9270e1f6224","src/waker.rs":"ed3e4e5f83016e253fe5faf4ded28d4f6ad64e01d015e4eb421004a1dd7b7639","src/waker_ref.rs":"3b65daca6d9236f653ff3be2599e5e30696416a6bab4902cdab2850a17942dd8"},"package":"efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2"} \ No newline at end of file +{"files":{"Cargo.toml":"b499d174086ce07fceb35a3d1aa879f170631d72f66691e1686e65385c90a6d5","LICENSE-APACHE":"275c491d6d1160553c32fd6127061d7f9606c3ea25abfad6ca3f6ed088785427","LICENSE-MIT":"6652c868f35dfe5e8ef636810a4e576b9d663f3a17fb0f5613ad73583e1b88fd","README.md":"6762ad0401a70d3b3e1faf6967b310de688da34c16174fd079ebc88fcff2cc4c","build.rs":"5b263bd2bd587511a9c8daef580b05e0613c15a6c5f800b1e5bc145fa013d99e","no_atomic_cas.rs":"7ae747b83b08dd926c1696faf4ecab9399c652ae77d5179221258c73b8eecb6f","src/arc_wake.rs":"0e3f7d7883b75337b0b92ff55e477f0bf96f6eb08def7d953676a289fd9696ec","src/future_obj.rs":"20f210f33c6e61b3889d971fee2d9c23c1661da0e715d51c74f8c6d049c56135","src/lib.rs":"c55281988768d44d3305b2352c7ebb66e6449797239c07b14257a2d8e612e06b","src/noop_waker.rs":"41246601dab77f69bf09257afc3321031a5a31a7eda51787029870eda9922356","src/spawn.rs":"afcf46b98d62e78d2c974f91df32590bd78fe8c79031e4ae7accf9270e1f6224","src/waker.rs":"ed3e4e5f83016e253fe5faf4ded28d4f6ad64e01d015e4eb421004a1dd7b7639","src/waker_ref.rs":"3b65daca6d9236f653ff3be2599e5e30696416a6bab4902cdab2850a17942dd8"},"package":"76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/futures-task/Cargo.toml temporalio-1.3.0/vendor/futures-task/Cargo.toml --- temporalio-1.3.0/vendor/futures-task/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/futures-task/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -13,7 +13,7 @@ edition = "2018" rust-version = "1.56" name = "futures-task" -version = "0.3.29" +version = "0.3.28" description = """ Tools for working with tasks. """ diff -Nru temporalio-1.3.0/vendor/futures-util/.cargo-checksum.json temporalio-1.3.0/vendor/futures-util/.cargo-checksum.json --- temporalio-1.3.0/vendor/futures-util/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/futures-util/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"Cargo.toml":"e4ef2ba6c838bc052a3b5fa70d18deb3e65781e4869f6d99b7f78888c6b002f6","LICENSE-APACHE":"275c491d6d1160553c32fd6127061d7f9606c3ea25abfad6ca3f6ed088785427","LICENSE-MIT":"6652c868f35dfe5e8ef636810a4e576b9d663f3a17fb0f5613ad73583e1b88fd","README.md":"4094b953bfd2bb2687df0c3c3deb05c307c14ac084e6a79878342b8ee56aa710","benches/bilock.rs":"6f59b71f9b9ca5751018a985eff0ea8d63d4cb6d18a17e672e17bc786b972c20","benches/flatten_unordered.rs":"79330465a5d8f2d6e450861e7ca2ed8ae7fe78a5fb221b6ab7121227810c1bcf","benches/futures_unordered.rs":"5eb8280be8d8fb7bd5fb103ce20db10f618f47e180a402105e0d5e9f8c9fe35a","benches/select.rs":"ca0a79bc3434f0fc025e0b0e37941ba1d592b40f36ce6544cdfede9f23e70581","build.rs":"5b263bd2bd587511a9c8daef580b05e0613c15a6c5f800b1e5bc145fa013d99e","no_atomic_cas.rs":"7ae747b83b08dd926c1696faf4ecab9399c652ae77d5179221258c73b8eecb6f","src/abortable.rs":"38bcb3d48361e4cfa89cc2e225c5f1dc97129837da834d28b69cff3bbf5200a6","src/async_await/join_mod.rs":"8f83c0001df867f5eb47a4174bf4a0c0b548f8ff3be3b532e0c759ad981b87da","src/async_await/mod.rs":"9a81d2eb3c89a31e1241c50438ff92d08d5c1fa879f0f8d52bfbcc261aa88272","src/async_await/pending.rs":"7971ec1d5d89ad80390e2a0c51e396257b2e78f1436cce79ea2b55ac2f13b328","src/async_await/poll.rs":"440c19a89fd42b12da09ff48a69523b5a8a5baea0bcd2f860589a0ab996ed781","src/async_await/random.rs":"daf229cd01595d38ef0f6284865fe2f60ed3b8134f7a15c82564b97ff3a5be98","src/async_await/select_mod.rs":"414c7fb7923cfe21116d558bf3cd1a6ae5bef4ed01f9877f0e7cb3e42ee6c79d","src/async_await/stream_select_mod.rs":"83da70ea9ab215ba9c799539fdcc78de237881dffa8be312934422d88b21dacb","src/compat/compat01as03.rs":"6728ffd4f0a92d4e6aff8b7ff7916ad7ae20a317633d2739813a3b6ffc814204","src/compat/compat03as01.rs":"7cf29e57f8ee14b64123b3d2c16dceced25af5491a5ef81b655b2de2e9587fbe","src/compat/executor.rs":"3e40b4ccd905a99eab42c47fefc5502b530eef869158ce9ceaa28f8f1638436f","src/compat/mod.rs":"6cf3412f6a3f9ee8406118ea75de65468a83febc6ba61bdbad69261f0cfea02e","src/fns.rs":"f8e396128791169098a38a82c3c28aaa6dd5d40718635f7cc30b59b32f7110b8","src/future/abortable.rs":"373ce61c0c7c31718ff572113503bb88f55e3b49ed5d028a3dfafd69070f44c1","src/future/either.rs":"fb00002e68b5c46c8ded09e91efe0be7362c168a1ea00dc5906e1c8c7e38aaa4","src/future/future/catch_unwind.rs":"08b0ac049cdee28325d378209aa5bb4d91b14a29ddd9c2b0e5c661b61f9cfcfe","src/future/future/flatten.rs":"5bf9846cef8dec5dcc38b992653e11146bc149a0d3efc09b1f8268bd29de0b2b","src/future/future/fuse.rs":"65b80a1ba7556e2ef35ce8d23e47489a2a6eb6d1c3ef9ac4e080c63e69eaa07d","src/future/future/map.rs":"de607c2a4d80d2bddb590781c37328ddd294bb9d5064a9ecb99455244239b597","src/future/future/mod.rs":"d1cfcf1e45207705dd858bf4087b611792ac266d098ee7ed103d6a2b0d7bdd0f","src/future/future/remote_handle.rs":"2ae17a409569b32c78e20026a8ecdf667352c2597a4a0a8deefa4761fafcb223","src/future/future/shared.rs":"d1973063327851931c75969ec627657e5e34e8cfa97f295d65a4be288377c446","src/future/join.rs":"38b55fc7cdbbdaaa525e51f8ce09783dbbcb65eabfd7de9f46610593e0bbef17","src/future/join_all.rs":"c77326f420eb0f9240eb2147d1c2cff6fbb123f7c13d11ab8f53694d8ca022d2","src/future/lazy.rs":"d161fc4108a97348c1becbbd5ba8fccb7225dcf1d81c097666f5c8b40718251d","src/future/maybe_done.rs":"559e41cb170f9fe7246d2a5b112527a9f9cbca63b8a5a872b3aa9c861f70f307","src/future/mod.rs":"51e018100362f20b071225268f1d81f25c8e9664e94730af199069c2692bf26a","src/future/option.rs":"73daca814800b91b707753dcfe074265372b0077fae2504ea6efddc713453579","src/future/pending.rs":"3967984d2061e6b201c407f28ba8392a21fc9ef7c0b9201e2e244110af0782c5","src/future/poll_fn.rs":"8e54bf57d60e01d496ae31df35e0b96868f4bda504c024a14f51ab723d67885f","src/future/poll_immediate.rs":"7e199fc102894c9095de17af602a7c8f05d427269aefce5d71cd5136d54659c0","src/future/ready.rs":"c9860ccd8ac529f44f66dee73ca9b9d7f1b1b3e5e9e4dc70c59640c752553d58","src/future/select.rs":"0c358a5ae079858f31c61cf6ea835205fdb9092d07536778440b975995d2626c","src/future/select_all.rs":"5b304210c34cc2bd84f7b1819baa30a68eea2ee578b10b243f5dd884ee9a4791","src/future/select_ok.rs":"dc35027db70c0111399c6ab6f7c977e6e7362f069a3891e4a62006c52643528e","src/future/try_future/into_future.rs":"d966bde7b06a88443f0efd877e95f91541778c4e713f3f4b66e00ca5d3f352b6","src/future/try_future/mod.rs":"991edb3b52903ceb3bcb6599d04d898509023cd038c5974f4872eaafa9748f08","src/future/try_future/try_flatten.rs":"16c02e1780bd312b8b386e41c1d9dd4bcc4e8ef10f26007364f857b3adcc6e99","src/future/try_future/try_flatten_err.rs":"130f3fc3fd95a19f4e4a50e69301106fab02f77d0faf3aac9c473a92b826c2ca","src/future/try_join.rs":"1836931f8ba32da41c6810e6acc0ea2fee75b74b3153e760c4542cb12b220540","src/future/try_join_all.rs":"4d01395c74c7b82c581a578f2cb34087824b091f70075ebcd76a8d12b8476c1f","src/future/try_maybe_done.rs":"1cce46b2ee43ad51b7c5f9c02bc90a890af32bc549ce99098a2c8813508051e1","src/future/try_select.rs":"5d6187ace76b5f26e60c713a1fe9fcb9cbb0d161c5881c532ce9472a230b595d","src/io/allow_std.rs":"a125959c255fd344399fb0be19218a8ee7d613ce2485d6df9cdbc2ed5d3987df","src/io/buf_reader.rs":"46a1e24046c5bc2ab8f266e3d904281bec3ab4ba6c13d4213a52599b57b8de66","src/io/buf_writer.rs":"d6666b8dde60eefbb7fa69da4a2eea2b34ea0e4a85e21e5ac6e83cc680ea9140","src/io/chain.rs":"12f508fc39c3234a71a0f886505245c5d659aed09c7d874b1bd8ca0a0d456cf3","src/io/close.rs":"9832210a870637198fa58642cdf2779afab71f2e31a9953e663fa6854bd73ac7","src/io/copy.rs":"cb2466dcd7ea8bb1f07d00c03e66ed55abf71fe4be6937adc9f533ef9d99fb2d","src/io/copy_buf.rs":"e9a5f6aac8375e298bddb332f23d8b626d056ce452b58f772a05df7e2cd326cf","src/io/copy_buf_abortable.rs":"28ef452bc49423e0a6e8323b5956b37c57335941f99797867e5c5932f9366136","src/io/cursor.rs":"c12e9b82c6eff2108a5524b026d73fbb2c250072e8e3f673cc04d4da02a553b8","src/io/empty.rs":"6ae40b4bc8fc41572abad2d013285d78d8df445868d41fac77bde508ec9bc1a5","src/io/fill_buf.rs":"4f217fed8eb3f66dbde2371c3fbcfa9420d38ba20da544a0658584e5778aa47d","src/io/flush.rs":"0c9b588dfd9da039dc123ba9448ac31ca21ee3da0a164a21f6c2c182183d43e2","src/io/into_sink.rs":"ab5bdb12bff62672175b69b8c9f5a4bbbea716b9cf89169ed6a723ab43da9df8","src/io/line_writer.rs":"16c151c68d89b7c2ab929c4a782539b1ad512b723eed9b544f50f1ff06f0b661","src/io/lines.rs":"137279b6b899ce438fb1b0ee9e6a412976f9f9db54fb7b961d2bad8787a26b1e","src/io/mod.rs":"eefa437d5ac91efb1328d9f50f10572206c7323be1c9919ca10e5ce1973f5c46","src/io/read.rs":"4ea675a83cec98a22c9c4731ff980209f0cf67f63c71871cd1deed53c1266345","src/io/read_exact.rs":"ddebd58db9f6766efa3f50543fb51b138538533921e1ee1da4621fff9c64efe2","src/io/read_line.rs":"e2829eb128f441c10dfc48f089a9dda7b6540753c9700f24cc9585e94affc11c","src/io/read_to_end.rs":"5e9e38dc087623dac5a3ae3ad329ed44ffe4f6205a78e546adadc3ffb76703fc","src/io/read_to_string.rs":"bef4cc292dd95fa9c850d0438ad0cf49a8cc4caf40a0384f763f8c9512ad9e79","src/io/read_until.rs":"354507ce95242a735940f0aaa6ef11cc7d6d0505ae148f05277ce6e7537f168a","src/io/read_vectored.rs":"bd7f442c92f2cb320075d0983b0d08d51c23078898d72e6c2857cf6c7ad4cec7","src/io/repeat.rs":"53bc472e4bd7d286bf90765ce574f13b7aabc871c4f04f712da7cea160491390","src/io/seek.rs":"9863e9fb6495eb6e1f8c45c283c8a6993b9bdb1462f75a3e525e135c6840dec7","src/io/sink.rs":"30a503631d196e5da92c386d0afc1af9656a5f7682456cfa2489a2c30a05cac5","src/io/split.rs":"2aa567452b713497d5b85813980b69e888aee32be14492c92404d261fd50eb09","src/io/take.rs":"c53fec5b5e8c3742b7e60e6ebfa625cf2e566fbea193fb1eee2f0a8e561d63d5","src/io/window.rs":"ec6a9d20a7b252a5b272a74afa32e2279d372b806840ab985eae17bc06a25d27","src/io/write.rs":"60670eb00f999f2e2c43b099759a7fb030325b323744d88c9d20f75926ec30df","src/io/write_all.rs":"8fcd4ff233650b5abd20f7b987000cac095d8de23445572de588dccf710623c6","src/io/write_all_vectored.rs":"53becf89c031bf4c3073f0903ce809eee7606b1b4fbeb518605875badba216d3","src/io/write_vectored.rs":"bc98ff4a709cb75cd9ffedefa8ef251089a49906b98e142d76447ddf4ac098bb","src/lib.rs":"384447fb9bfcd3b110656979cca71b53c3abe72690e970c30563c1baba27fd74","src/lock/bilock.rs":"a294b016cfb39fb54406a6190438546a5fd7c8ef21667ab38a6cea9cb2d3ef7b","src/lock/mod.rs":"ed0f4ef97af382f6038730bd5932b449f32dc3a634e73e7ebb48a24bb7782d6f","src/lock/mutex.rs":"745c68e571f84a7456681cd683b2b8eed28ea8b6d3f9a38337efad105a65e0b6","src/never.rs":"2066481ab04921269cfa768cb8b778a035ab6aa49ec404d9ac0aeb07a4bf6094","src/sink/buffer.rs":"33a7380f8232225a8e9ac5ee138fd095979efa3a64f9fecf5fcaf2e78fcbc355","src/sink/close.rs":"f2f31c884f048163abebd4f5a877b7b4306f7d02beae428325636fd00ed42ca9","src/sink/drain.rs":"60262bf3ef48c09b4d52e52953f9437d536e20f63690b73e975388751405d239","src/sink/err_into.rs":"ced2998b2b0b792d80f7543523c9e07e8f5d20a4336cae93084b995e46671b15","src/sink/fanout.rs":"66dcde056e0bbee4e0074d331838ed2743dc872ea1597f05d61970523dc34926","src/sink/feed.rs":"64b9d296d37aedde37e1421c459ebcd9a7e8814db905996996167850124f3b3f","src/sink/flush.rs":"fbba344f428ca7636541ba013f7db2ece480b404a9e0b421c5537552d61e2492","src/sink/map_err.rs":"0f68f444ef13fe7115164be855c3b7b1d269e1119e69fcdad1706988255641f1","src/sink/mod.rs":"37cf379170f3099992eb59f3181be4c4e4a5c2d3581dbe424d22ab360840d321","src/sink/send.rs":"56aaba9aa4a562e0af39473a5779206d91b0acb1fced4fc06cd8b959d1897524","src/sink/send_all.rs":"a8e4956604fe73e321b0a3896c2018bc5c27149f2862f8406112db140b3aa2dd","src/sink/unfold.rs":"5febcfb9295a79fe1187284d0d45055c787e399b00d73c0e85a0446ae2246d18","src/sink/with.rs":"850cd3b96304df1f38360a0bc60b02d485535e399ef7642acdd9add7876867d8","src/sink/with_flat_map.rs":"5e0f527b33ee8f1cc6a6a46d45b6d74dad5c735d88b2cb24e1cb34fdc6ef501b","src/stream/abortable.rs":"935d79aa44d793f4abe87ca27a9e4a20891500488cf942693cd2756d65b3aab2","src/stream/empty.rs":"5000c856186408a17f68bbef432d4a1a3edb7fb5a07ed8699342fef04b10a181","src/stream/futures_ordered.rs":"6d3a753d7cdc2ada5487682fef4c9c56d8ece61292b125c3eafdee484484511c","src/stream/futures_unordered/abort.rs":"bdfece9f91accafd5122be36d628c37c5b219ac0eecec181267840fbb1e95a45","src/stream/futures_unordered/iter.rs":"01f8aaa2ac7ea493bf727a945424cc6ae695c9a0c289ac57cbb26697abb05827","src/stream/futures_unordered/mod.rs":"9f2a0aa75e2ff154e20f89adbc3b4b28ed69866f99dde8c18e0054bfe572a0c2","src/stream/futures_unordered/ready_to_run_queue.rs":"3a9c08cb5df28e57f2bfe613b8174d0dfb420b8664dd7c46a053e2980a6d3482","src/stream/futures_unordered/task.rs":"2b780bcc97844bc0bdeced7bb4318066e86ba082c08c8628c9b2e92bfe36fb61","src/stream/iter.rs":"609fa821a460e901a54ae51f8da58220881157cef02b8b7b8c9e4321c2d05a23","src/stream/mod.rs":"293a39d4dda306d34d30c657cbed2047cf062a2e6b3ee069af42657ee194a1bc","src/stream/once.rs":"d7b70adabad1f10af711ac3dcef33fd4c287e9852fdb678406e7ff350ba8fd47","src/stream/pending.rs":"84aaa15c8bbb17a250da5b1b5f0c7f6717410915d63340a3fcbf098bebe19d6f","src/stream/poll_fn.rs":"35952ea514b8aade14a3934d7777006475f50bbf0c5b50141710e31637f980be","src/stream/poll_immediate.rs":"e7a53ff8275ebe89dab8f9b984cce2ee0fde0a828e540b77c5500ca017d5bb98","src/stream/repeat.rs":"e4e4a9b6f2fca72bcbf098c3ac0c4a41323a840741d4dce9d9416464b7e8bd0d","src/stream/repeat_with.rs":"525780d24f3f99152b879765ca6eab99bcc0c757dc6654b6635c099b93ea654d","src/stream/select.rs":"28eb422c0eca9fd02778a6003004471b3489db09746a70e617a506303ea8b81d","src/stream/select_all.rs":"19ef94abcf63fa9e46a73b6ab783642d2d069a015c7fa57fea36eeac7b6f2a20","src/stream/select_with_strategy.rs":"caa0f5d1fd02824b48a1cd2be13a6f96b532039eb88cf47ea5d2becf58595073","src/stream/stream/all.rs":"267a2cc251775fa0c60c6e41ae1e4a9611fc493be0fd1c3494ca75f24d60de51","src/stream/stream/any.rs":"a3eb3eecce02142b8eb95d0b8a62178f177c8152d63f52da5effbe3a4be45580","src/stream/stream/buffer_unordered.rs":"b0f7a1c72cee178e7bfd8990e6e426c1258eeba6d952b82c6be8e4cac0a054ea","src/stream/stream/buffered.rs":"e37d08d6a18090ba37079937575920cc8c7569f4183dba710d3f4b94c11da01b","src/stream/stream/catch_unwind.rs":"b2e801ff744d5d9e17177ec1156b0ab67bdd56b94c618ed8590344ec8a0f35e7","src/stream/stream/chain.rs":"809b6b5c8372f65341dc9810d39f60ae3bcf74a78f133b4ab8d289fb5f2a7cbb","src/stream/stream/chunks.rs":"9f872b473de14d2251584050f04d56eada9c3b1d8dc3e746bdd57c1f757bfc6f","src/stream/stream/collect.rs":"6e4d2d580189f7d3b6b294b6b17437e8e2570502f08c11786a71caac207f0309","src/stream/stream/concat.rs":"171ea941b45c0295ed978c3f318a449ea295e33cb4ea82c764f4e9e7c48ad5de","src/stream/stream/count.rs":"ff218aea3d2d2456c8163926ea0c357b2752e92578e5fd4bec6b789fe1246556","src/stream/stream/cycle.rs":"ed7e3d15e7b1adec5ad5789b0d3186b5995a3353cc974fb7f41a72f6d8ad4cbb","src/stream/stream/enumerate.rs":"fc7565d21d39565790859eeac9ae8dd74123a9d15b88258d3abe894f1876cc39","src/stream/stream/filter.rs":"5d871f416d41baff3733121f564229fe31bdf7dfaaeb78ab940fafba6ab4b7c6","src/stream/stream/filter_map.rs":"179045a5ab1295e77ab5cfea1964be69dc50984ef8ac9ee04034adf0a043514f","src/stream/stream/flatten.rs":"69493fc106a1447abe109fd54375bb30363f7bc419463a8f835e4c80d97f2186","src/stream/stream/flatten_unordered.rs":"dd5216fc0e34d09cc69ae6b3c4690efe8ff01404853756bf5aa6b92eb2e6750b","src/stream/stream/fold.rs":"75d61d4321db1bcbbdd1a0102d9ad60206275777167c008fc8953e50cd978a09","src/stream/stream/for_each.rs":"07bca889821bad18ff083e54abe679fbeb8cd19c086581c2f2722cba6b42263f","src/stream/stream/for_each_concurrent.rs":"4e1e7eb3d4ccfae0e8000651b75834e2960a7f9c62ab92dba35a0bdbbf5bbb21","src/stream/stream/forward.rs":"cd024ba1a3d5098d3ff2d5178a12e068916cc4307284b00c18dbc54b554a5560","src/stream/stream/fuse.rs":"061c5385f12f80c7906cb15ddb8f455ced6ce21d1de9a97de9db2616407c0cac","src/stream/stream/into_future.rs":"b46ad45cc03ddd778a9ffaa0d603c8ee0b411f49333100160959942cde9588bd","src/stream/stream/map.rs":"b91bdd5b33821a50c9b5034261a14f89ff1a9d541ab99b9d9a6921b12a5d434e","src/stream/stream/mod.rs":"f6561a11ae60ed0abcbada98506812df50fa52633f68b93a3330668afe444f82","src/stream/stream/next.rs":"7b4d5a22b5e00aa191ea82346bb1f392121cc68692864a8230e462d59e622928","src/stream/stream/peek.rs":"2e08e6990c31186c97edb21737f83fe8640a19561062879af83090935aef99cf","src/stream/stream/ready_chunks.rs":"7e17c49ff29c106c13a2ec13fb05f32ff048e482b47a157d3965bd03c38c01c2","src/stream/stream/scan.rs":"54489c8efef60dbf3c35ee803afee5c5ea7c364fb9b68939a04956e46febb856","src/stream/stream/select_next_some.rs":"0094eccc96cfe78d9b6d0a9bdb82cada8fb7929770a3ac00ffcb5441d7dc4f51","src/stream/stream/skip.rs":"61f7ec7fe25663d2c87cffaad19ed27eda032842edb8af731b521025b244f120","src/stream/stream/skip_while.rs":"6f114a3fa538bd479e4fa24d8aa0e0e0454613643a97c44242c5683ae7293b82","src/stream/stream/split.rs":"0552ddf8f7f3a9980dbc692d0c34b72503107c714f81e853445fb6c81fe328ff","src/stream/stream/take.rs":"57d381b482c3d584c4c26b0e15941bc2ea58e3f39a2e5c74391a2ee7b825cc8c","src/stream/stream/take_until.rs":"0f1fa7d158192a5dee32392dfdd062c15dab6d246b0ca267e91aae490d7d7fdb","src/stream/stream/take_while.rs":"2f57a6e5b903c045da642e9a40eb19dabbc612a80a6ce8098df1a1973555f108","src/stream/stream/then.rs":"c995c6b0d9151927b26b10fba70e135dfc41224b969d1367dc8c11697218c1e9","src/stream/stream/unzip.rs":"e7beedc2192604e0091ac3d0265b487127a37c780198838f6419c21ef1b38df0","src/stream/stream/zip.rs":"3890b40daea00341fac6ac977de0b534d1ec7cdaabece44af5df2ca56026fe62","src/stream/try_stream/and_then.rs":"6f92b333955f5ec30fddf8e087e3f60ebf53a054769fc72c80bbccdf13a9431e","src/stream/try_stream/into_async_read.rs":"5b200c76ccb95460d94286ca8e63f5454940eb62b5f15aae998da48aa06fbffd","src/stream/try_stream/into_stream.rs":"4fee94e89956a42871fc4a0cdba7ae1b7d4265e884528799cd227c9dd851acce","src/stream/try_stream/mod.rs":"76b15ee9e9c5d4d0440998567c7441096f5fe2deb2cfad2296c9f577b5bc9b64","src/stream/try_stream/or_else.rs":"473ca77e0e81a1a0834d2d882076b8823a5a3027b2d7d78f887be2d5edfd0de3","src/stream/try_stream/try_all.rs":"58a4c9abe3b2d6ad2debcfc09701bb828732c9d7edf2a42f12a74beff5ae2db0","src/stream/try_stream/try_any.rs":"baf6a8e440d018597de0a1ee9e9827a27616bc7e65b804b3e0d8f1343d9191c6","src/stream/try_stream/try_buffer_unordered.rs":"64e698ea6aefbe7e32d48e737553b20b9cde5c258963bb20486b48b7d6899660","src/stream/try_stream/try_buffered.rs":"38f60d7290f44471a02084c6b394b754c224a84ee8d2ba01c08568168b48a21f","src/stream/try_stream/try_chunks.rs":"69c4d85a256250d73c6372d8047e6055da7eac918cb5d7ef4f3697898f4dcb4c","src/stream/try_stream/try_collect.rs":"979920e3034dad6c75961e3f6b4c0234691db7063eca1a05562cc5d41f2943c1","src/stream/try_stream/try_concat.rs":"f2330ebeeab30273e9ac0e8600bfe2f405ce671f6386e688b3afb1d2fdd7c2c6","src/stream/try_stream/try_filter.rs":"1344e9aea05e2d0078f30caff176a99e1ccb8fcdf0a287817abc82fbaf09c48b","src/stream/try_stream/try_filter_map.rs":"285e7ea875a3ea3e16942c1b1acae5a1cb26b9bac476dce3903547cb99306602","src/stream/try_stream/try_flatten.rs":"e05614d86a27ab8386476eea35fd424c07e5f7f99cf0401d63a6655eb7ca1247","src/stream/try_stream/try_flatten_unordered.rs":"1cc4c4a5ea0a8db3010958f34fb1886dcfbd2e1584082d2004030eb70b13cd6c","src/stream/try_stream/try_fold.rs":"b96aa2fe1a16f625d5045028a86ff8684dcf5198ef8c7c072f52f39aeaa8b619","src/stream/try_stream/try_for_each.rs":"3f3901d618333b740d470eb02fcbb645df92483493872298bb7bd0382646028a","src/stream/try_stream/try_for_each_concurrent.rs":"78a94a77f329862c2a245ec3add97e49c534985f0d9da98f205b7fa3c7c08df3","src/stream/try_stream/try_next.rs":"6e29473153db1435906e79f7eaa13ce9da842d4528ba9eb1c0034665feacc565","src/stream/try_stream/try_ready_chunks.rs":"e8a658f5e48bb5c12b59998adbc5534f7eb830d0a60b53c0a3acd945752166fd","src/stream/try_stream/try_skip_while.rs":"7c2fa31fe8b0b4e59c5d7f2972c8d9f83e8f01a687b08f5cd631f92a14b402f1","src/stream/try_stream/try_take_while.rs":"2783664637aff0442f0c9204d35600139c941332310f70495cbc4dc345cae99d","src/stream/try_stream/try_unfold.rs":"aaf0f4857a4ec8233ac842ae509f29e5a210827a0bb40cfc0dc3e858f153d2b4","src/stream/unfold.rs":"8b2feb00f979562b43064eb078d53a160cdb3c65deed17ec25a05938df2d370f","src/task/mod.rs":"bc4f1d4a08110adbe3a203246af903bcf6d60bd45b7514c8145947a84a50f6aa","src/task/spawn.rs":"8ff3a3652d8d2cb45717324b6ead9c3f111629e7eb0c0b33d3639a0e7c5bbf3e","src/unfold_state.rs":"ffe848071a99d6afcdbe8281a8a77a559a7dde434fc41f734c90e6b9b5d8a5af"},"package":"a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104"} \ No newline at end of file +{"files":{"Cargo.toml":"2889f27d32d20c79aeba0c92bbe5ff2066d96eb0fd1603bd2dece4090ac2eb29","LICENSE-APACHE":"275c491d6d1160553c32fd6127061d7f9606c3ea25abfad6ca3f6ed088785427","LICENSE-MIT":"6652c868f35dfe5e8ef636810a4e576b9d663f3a17fb0f5613ad73583e1b88fd","README.md":"4094b953bfd2bb2687df0c3c3deb05c307c14ac084e6a79878342b8ee56aa710","benches/bilock.rs":"6f59b71f9b9ca5751018a985eff0ea8d63d4cb6d18a17e672e17bc786b972c20","benches/flatten_unordered.rs":"79330465a5d8f2d6e450861e7ca2ed8ae7fe78a5fb221b6ab7121227810c1bcf","benches/futures_unordered.rs":"5eb8280be8d8fb7bd5fb103ce20db10f618f47e180a402105e0d5e9f8c9fe35a","benches/select.rs":"ca0a79bc3434f0fc025e0b0e37941ba1d592b40f36ce6544cdfede9f23e70581","build.rs":"5b263bd2bd587511a9c8daef580b05e0613c15a6c5f800b1e5bc145fa013d99e","no_atomic_cas.rs":"7ae747b83b08dd926c1696faf4ecab9399c652ae77d5179221258c73b8eecb6f","src/abortable.rs":"38bcb3d48361e4cfa89cc2e225c5f1dc97129837da834d28b69cff3bbf5200a6","src/async_await/join_mod.rs":"8f83c0001df867f5eb47a4174bf4a0c0b548f8ff3be3b532e0c759ad981b87da","src/async_await/mod.rs":"3d25c343cc3e789d3f982cdacd6f8ed91511ba656c3923da310700f318f423a4","src/async_await/pending.rs":"7971ec1d5d89ad80390e2a0c51e396257b2e78f1436cce79ea2b55ac2f13b328","src/async_await/poll.rs":"440c19a89fd42b12da09ff48a69523b5a8a5baea0bcd2f860589a0ab996ed781","src/async_await/random.rs":"daf229cd01595d38ef0f6284865fe2f60ed3b8134f7a15c82564b97ff3a5be98","src/async_await/select_mod.rs":"414c7fb7923cfe21116d558bf3cd1a6ae5bef4ed01f9877f0e7cb3e42ee6c79d","src/async_await/stream_select_mod.rs":"9a51338914cbb1502619fed591dfe4fc676919499b9d041898e59f630fe5e7f0","src/compat/compat01as03.rs":"6728ffd4f0a92d4e6aff8b7ff7916ad7ae20a317633d2739813a3b6ffc814204","src/compat/compat03as01.rs":"7cf29e57f8ee14b64123b3d2c16dceced25af5491a5ef81b655b2de2e9587fbe","src/compat/executor.rs":"3e40b4ccd905a99eab42c47fefc5502b530eef869158ce9ceaa28f8f1638436f","src/compat/mod.rs":"6cf3412f6a3f9ee8406118ea75de65468a83febc6ba61bdbad69261f0cfea02e","src/fns.rs":"f8e396128791169098a38a82c3c28aaa6dd5d40718635f7cc30b59b32f7110b8","src/future/abortable.rs":"373ce61c0c7c31718ff572113503bb88f55e3b49ed5d028a3dfafd69070f44c1","src/future/either.rs":"fb00002e68b5c46c8ded09e91efe0be7362c168a1ea00dc5906e1c8c7e38aaa4","src/future/future/catch_unwind.rs":"08b0ac049cdee28325d378209aa5bb4d91b14a29ddd9c2b0e5c661b61f9cfcfe","src/future/future/flatten.rs":"5bf9846cef8dec5dcc38b992653e11146bc149a0d3efc09b1f8268bd29de0b2b","src/future/future/fuse.rs":"65b80a1ba7556e2ef35ce8d23e47489a2a6eb6d1c3ef9ac4e080c63e69eaa07d","src/future/future/map.rs":"de607c2a4d80d2bddb590781c37328ddd294bb9d5064a9ecb99455244239b597","src/future/future/mod.rs":"ecfac09dcba801cede7c58acfaa76a9ab76d26a3f4c968d66c2a49caa57faefe","src/future/future/remote_handle.rs":"2ae17a409569b32c78e20026a8ecdf667352c2597a4a0a8deefa4761fafcb223","src/future/future/shared.rs":"d1973063327851931c75969ec627657e5e34e8cfa97f295d65a4be288377c446","src/future/join.rs":"38b55fc7cdbbdaaa525e51f8ce09783dbbcb65eabfd7de9f46610593e0bbef17","src/future/join_all.rs":"4813aba0e6ddf02310ba3d368eb6af44b30aaac227d1b799e977996db9e3cf36","src/future/lazy.rs":"d161fc4108a97348c1becbbd5ba8fccb7225dcf1d81c097666f5c8b40718251d","src/future/maybe_done.rs":"559e41cb170f9fe7246d2a5b112527a9f9cbca63b8a5a872b3aa9c861f70f307","src/future/mod.rs":"51e018100362f20b071225268f1d81f25c8e9664e94730af199069c2692bf26a","src/future/option.rs":"73daca814800b91b707753dcfe074265372b0077fae2504ea6efddc713453579","src/future/pending.rs":"3967984d2061e6b201c407f28ba8392a21fc9ef7c0b9201e2e244110af0782c5","src/future/poll_fn.rs":"8e54bf57d60e01d496ae31df35e0b96868f4bda504c024a14f51ab723d67885f","src/future/poll_immediate.rs":"7e199fc102894c9095de17af602a7c8f05d427269aefce5d71cd5136d54659c0","src/future/ready.rs":"c9860ccd8ac529f44f66dee73ca9b9d7f1b1b3e5e9e4dc70c59640c752553d58","src/future/select.rs":"0c358a5ae079858f31c61cf6ea835205fdb9092d07536778440b975995d2626c","src/future/select_all.rs":"5b304210c34cc2bd84f7b1819baa30a68eea2ee578b10b243f5dd884ee9a4791","src/future/select_ok.rs":"dc35027db70c0111399c6ab6f7c977e6e7362f069a3891e4a62006c52643528e","src/future/try_future/into_future.rs":"d966bde7b06a88443f0efd877e95f91541778c4e713f3f4b66e00ca5d3f352b6","src/future/try_future/mod.rs":"991edb3b52903ceb3bcb6599d04d898509023cd038c5974f4872eaafa9748f08","src/future/try_future/try_flatten.rs":"16c02e1780bd312b8b386e41c1d9dd4bcc4e8ef10f26007364f857b3adcc6e99","src/future/try_future/try_flatten_err.rs":"130f3fc3fd95a19f4e4a50e69301106fab02f77d0faf3aac9c473a92b826c2ca","src/future/try_join.rs":"1836931f8ba32da41c6810e6acc0ea2fee75b74b3153e760c4542cb12b220540","src/future/try_join_all.rs":"4d01395c74c7b82c581a578f2cb34087824b091f70075ebcd76a8d12b8476c1f","src/future/try_maybe_done.rs":"1cce46b2ee43ad51b7c5f9c02bc90a890af32bc549ce99098a2c8813508051e1","src/future/try_select.rs":"5d6187ace76b5f26e60c713a1fe9fcb9cbb0d161c5881c532ce9472a230b595d","src/io/allow_std.rs":"a125959c255fd344399fb0be19218a8ee7d613ce2485d6df9cdbc2ed5d3987df","src/io/buf_reader.rs":"46a1e24046c5bc2ab8f266e3d904281bec3ab4ba6c13d4213a52599b57b8de66","src/io/buf_writer.rs":"d6666b8dde60eefbb7fa69da4a2eea2b34ea0e4a85e21e5ac6e83cc680ea9140","src/io/chain.rs":"12f508fc39c3234a71a0f886505245c5d659aed09c7d874b1bd8ca0a0d456cf3","src/io/close.rs":"9832210a870637198fa58642cdf2779afab71f2e31a9953e663fa6854bd73ac7","src/io/copy.rs":"cb2466dcd7ea8bb1f07d00c03e66ed55abf71fe4be6937adc9f533ef9d99fb2d","src/io/copy_buf.rs":"e9a5f6aac8375e298bddb332f23d8b626d056ce452b58f772a05df7e2cd326cf","src/io/copy_buf_abortable.rs":"28ef452bc49423e0a6e8323b5956b37c57335941f99797867e5c5932f9366136","src/io/cursor.rs":"c12e9b82c6eff2108a5524b026d73fbb2c250072e8e3f673cc04d4da02a553b8","src/io/empty.rs":"6ae40b4bc8fc41572abad2d013285d78d8df445868d41fac77bde508ec9bc1a5","src/io/fill_buf.rs":"4f217fed8eb3f66dbde2371c3fbcfa9420d38ba20da544a0658584e5778aa47d","src/io/flush.rs":"0c9b588dfd9da039dc123ba9448ac31ca21ee3da0a164a21f6c2c182183d43e2","src/io/into_sink.rs":"ab5bdb12bff62672175b69b8c9f5a4bbbea716b9cf89169ed6a723ab43da9df8","src/io/line_writer.rs":"16c151c68d89b7c2ab929c4a782539b1ad512b723eed9b544f50f1ff06f0b661","src/io/lines.rs":"137279b6b899ce438fb1b0ee9e6a412976f9f9db54fb7b961d2bad8787a26b1e","src/io/mod.rs":"bead8faa1bd4c3733543e38cf64dc9b52d703440367f2efb460bda9f9baafa0b","src/io/read.rs":"4ea675a83cec98a22c9c4731ff980209f0cf67f63c71871cd1deed53c1266345","src/io/read_exact.rs":"ddebd58db9f6766efa3f50543fb51b138538533921e1ee1da4621fff9c64efe2","src/io/read_line.rs":"e22c853ddfd769c441b1a1dc59cbcda4f22a9c49e86f6a697f94193fce3bcdfb","src/io/read_to_end.rs":"5e9e38dc087623dac5a3ae3ad329ed44ffe4f6205a78e546adadc3ffb76703fc","src/io/read_to_string.rs":"bef4cc292dd95fa9c850d0438ad0cf49a8cc4caf40a0384f763f8c9512ad9e79","src/io/read_until.rs":"354507ce95242a735940f0aaa6ef11cc7d6d0505ae148f05277ce6e7537f168a","src/io/read_vectored.rs":"bd7f442c92f2cb320075d0983b0d08d51c23078898d72e6c2857cf6c7ad4cec7","src/io/repeat.rs":"53bc472e4bd7d286bf90765ce574f13b7aabc871c4f04f712da7cea160491390","src/io/seek.rs":"9863e9fb6495eb6e1f8c45c283c8a6993b9bdb1462f75a3e525e135c6840dec7","src/io/sink.rs":"30a503631d196e5da92c386d0afc1af9656a5f7682456cfa2489a2c30a05cac5","src/io/split.rs":"2aa567452b713497d5b85813980b69e888aee32be14492c92404d261fd50eb09","src/io/take.rs":"c53fec5b5e8c3742b7e60e6ebfa625cf2e566fbea193fb1eee2f0a8e561d63d5","src/io/window.rs":"295d7dc18ad101642003cd67687242e4bdba11552cfb7f18c521cbff369e6f71","src/io/write.rs":"60670eb00f999f2e2c43b099759a7fb030325b323744d88c9d20f75926ec30df","src/io/write_all.rs":"8fcd4ff233650b5abd20f7b987000cac095d8de23445572de588dccf710623c6","src/io/write_all_vectored.rs":"53becf89c031bf4c3073f0903ce809eee7606b1b4fbeb518605875badba216d3","src/io/write_vectored.rs":"bc98ff4a709cb75cd9ffedefa8ef251089a49906b98e142d76447ddf4ac098bb","src/lib.rs":"384447fb9bfcd3b110656979cca71b53c3abe72690e970c30563c1baba27fd74","src/lock/bilock.rs":"a294b016cfb39fb54406a6190438546a5fd7c8ef21667ab38a6cea9cb2d3ef7b","src/lock/mod.rs":"ed0f4ef97af382f6038730bd5932b449f32dc3a634e73e7ebb48a24bb7782d6f","src/lock/mutex.rs":"745c68e571f84a7456681cd683b2b8eed28ea8b6d3f9a38337efad105a65e0b6","src/never.rs":"2066481ab04921269cfa768cb8b778a035ab6aa49ec404d9ac0aeb07a4bf6094","src/sink/buffer.rs":"33a7380f8232225a8e9ac5ee138fd095979efa3a64f9fecf5fcaf2e78fcbc355","src/sink/close.rs":"f2f31c884f048163abebd4f5a877b7b4306f7d02beae428325636fd00ed42ca9","src/sink/drain.rs":"60262bf3ef48c09b4d52e52953f9437d536e20f63690b73e975388751405d239","src/sink/err_into.rs":"ced2998b2b0b792d80f7543523c9e07e8f5d20a4336cae93084b995e46671b15","src/sink/fanout.rs":"66dcde056e0bbee4e0074d331838ed2743dc872ea1597f05d61970523dc34926","src/sink/feed.rs":"64b9d296d37aedde37e1421c459ebcd9a7e8814db905996996167850124f3b3f","src/sink/flush.rs":"fbba344f428ca7636541ba013f7db2ece480b404a9e0b421c5537552d61e2492","src/sink/map_err.rs":"0f68f444ef13fe7115164be855c3b7b1d269e1119e69fcdad1706988255641f1","src/sink/mod.rs":"37cf379170f3099992eb59f3181be4c4e4a5c2d3581dbe424d22ab360840d321","src/sink/send.rs":"56aaba9aa4a562e0af39473a5779206d91b0acb1fced4fc06cd8b959d1897524","src/sink/send_all.rs":"a8e4956604fe73e321b0a3896c2018bc5c27149f2862f8406112db140b3aa2dd","src/sink/unfold.rs":"5febcfb9295a79fe1187284d0d45055c787e399b00d73c0e85a0446ae2246d18","src/sink/with.rs":"850cd3b96304df1f38360a0bc60b02d485535e399ef7642acdd9add7876867d8","src/sink/with_flat_map.rs":"5e0f527b33ee8f1cc6a6a46d45b6d74dad5c735d88b2cb24e1cb34fdc6ef501b","src/stream/abortable.rs":"935d79aa44d793f4abe87ca27a9e4a20891500488cf942693cd2756d65b3aab2","src/stream/empty.rs":"5000c856186408a17f68bbef432d4a1a3edb7fb5a07ed8699342fef04b10a181","src/stream/futures_ordered.rs":"c62010493e68e1c6317c189ce36af48770736407c2e0e60e6c677f3b20b4b12b","src/stream/futures_unordered/abort.rs":"bdfece9f91accafd5122be36d628c37c5b219ac0eecec181267840fbb1e95a45","src/stream/futures_unordered/iter.rs":"01f8aaa2ac7ea493bf727a945424cc6ae695c9a0c289ac57cbb26697abb05827","src/stream/futures_unordered/mod.rs":"460cdf03695f6b292d46bc58138952f0c3d84fe58974337bca6be5a1ff30e48a","src/stream/futures_unordered/ready_to_run_queue.rs":"3a9c08cb5df28e57f2bfe613b8174d0dfb420b8664dd7c46a053e2980a6d3482","src/stream/futures_unordered/task.rs":"2b780bcc97844bc0bdeced7bb4318066e86ba082c08c8628c9b2e92bfe36fb61","src/stream/iter.rs":"609fa821a460e901a54ae51f8da58220881157cef02b8b7b8c9e4321c2d05a23","src/stream/mod.rs":"8ec9b052297b82a1be6b9a2ad631cf686e8cc17e763794ebeeea3a39e3a72805","src/stream/once.rs":"d7b70adabad1f10af711ac3dcef33fd4c287e9852fdb678406e7ff350ba8fd47","src/stream/pending.rs":"84aaa15c8bbb17a250da5b1b5f0c7f6717410915d63340a3fcbf098bebe19d6f","src/stream/poll_fn.rs":"35952ea514b8aade14a3934d7777006475f50bbf0c5b50141710e31637f980be","src/stream/poll_immediate.rs":"e7a53ff8275ebe89dab8f9b984cce2ee0fde0a828e540b77c5500ca017d5bb98","src/stream/repeat.rs":"e4e4a9b6f2fca72bcbf098c3ac0c4a41323a840741d4dce9d9416464b7e8bd0d","src/stream/repeat_with.rs":"525780d24f3f99152b879765ca6eab99bcc0c757dc6654b6635c099b93ea654d","src/stream/select.rs":"28eb422c0eca9fd02778a6003004471b3489db09746a70e617a506303ea8b81d","src/stream/select_all.rs":"19ef94abcf63fa9e46a73b6ab783642d2d069a015c7fa57fea36eeac7b6f2a20","src/stream/select_with_strategy.rs":"caa0f5d1fd02824b48a1cd2be13a6f96b532039eb88cf47ea5d2becf58595073","src/stream/stream/all.rs":"43cfb69de0ea991497d26d0aeb02091f10eb241ef93758b54c5e7aced5b63b63","src/stream/stream/any.rs":"2582da02f9a1ce2bd0af87a64b65188fc93686c5e3dd9128e89e5f57c1d70e43","src/stream/stream/buffer_unordered.rs":"b0f7a1c72cee178e7bfd8990e6e426c1258eeba6d952b82c6be8e4cac0a054ea","src/stream/stream/buffered.rs":"e37d08d6a18090ba37079937575920cc8c7569f4183dba710d3f4b94c11da01b","src/stream/stream/catch_unwind.rs":"b2e801ff744d5d9e17177ec1156b0ab67bdd56b94c618ed8590344ec8a0f35e7","src/stream/stream/chain.rs":"809b6b5c8372f65341dc9810d39f60ae3bcf74a78f133b4ab8d289fb5f2a7cbb","src/stream/stream/chunks.rs":"9f872b473de14d2251584050f04d56eada9c3b1d8dc3e746bdd57c1f757bfc6f","src/stream/stream/collect.rs":"6e4d2d580189f7d3b6b294b6b17437e8e2570502f08c11786a71caac207f0309","src/stream/stream/concat.rs":"171ea941b45c0295ed978c3f318a449ea295e33cb4ea82c764f4e9e7c48ad5de","src/stream/stream/count.rs":"ff218aea3d2d2456c8163926ea0c357b2752e92578e5fd4bec6b789fe1246556","src/stream/stream/cycle.rs":"ed7e3d15e7b1adec5ad5789b0d3186b5995a3353cc974fb7f41a72f6d8ad4cbb","src/stream/stream/enumerate.rs":"fc7565d21d39565790859eeac9ae8dd74123a9d15b88258d3abe894f1876cc39","src/stream/stream/filter.rs":"5d871f416d41baff3733121f564229fe31bdf7dfaaeb78ab940fafba6ab4b7c6","src/stream/stream/filter_map.rs":"179045a5ab1295e77ab5cfea1964be69dc50984ef8ac9ee04034adf0a043514f","src/stream/stream/flatten.rs":"69493fc106a1447abe109fd54375bb30363f7bc419463a8f835e4c80d97f2186","src/stream/stream/flatten_unordered.rs":"dd5216fc0e34d09cc69ae6b3c4690efe8ff01404853756bf5aa6b92eb2e6750b","src/stream/stream/fold.rs":"75d61d4321db1bcbbdd1a0102d9ad60206275777167c008fc8953e50cd978a09","src/stream/stream/for_each.rs":"07bca889821bad18ff083e54abe679fbeb8cd19c086581c2f2722cba6b42263f","src/stream/stream/for_each_concurrent.rs":"4e1e7eb3d4ccfae0e8000651b75834e2960a7f9c62ab92dba35a0bdbbf5bbb21","src/stream/stream/forward.rs":"cd024ba1a3d5098d3ff2d5178a12e068916cc4307284b00c18dbc54b554a5560","src/stream/stream/fuse.rs":"061c5385f12f80c7906cb15ddb8f455ced6ce21d1de9a97de9db2616407c0cac","src/stream/stream/into_future.rs":"b46ad45cc03ddd778a9ffaa0d603c8ee0b411f49333100160959942cde9588bd","src/stream/stream/map.rs":"b91bdd5b33821a50c9b5034261a14f89ff1a9d541ab99b9d9a6921b12a5d434e","src/stream/stream/mod.rs":"ca8f514b5157373408c6b59a8892dca8a1441a4c82557c34e6570342990da487","src/stream/stream/next.rs":"7b4d5a22b5e00aa191ea82346bb1f392121cc68692864a8230e462d59e622928","src/stream/stream/peek.rs":"2e08e6990c31186c97edb21737f83fe8640a19561062879af83090935aef99cf","src/stream/stream/ready_chunks.rs":"7e17c49ff29c106c13a2ec13fb05f32ff048e482b47a157d3965bd03c38c01c2","src/stream/stream/scan.rs":"54489c8efef60dbf3c35ee803afee5c5ea7c364fb9b68939a04956e46febb856","src/stream/stream/select_next_some.rs":"0094eccc96cfe78d9b6d0a9bdb82cada8fb7929770a3ac00ffcb5441d7dc4f51","src/stream/stream/skip.rs":"61f7ec7fe25663d2c87cffaad19ed27eda032842edb8af731b521025b244f120","src/stream/stream/skip_while.rs":"6f114a3fa538bd479e4fa24d8aa0e0e0454613643a97c44242c5683ae7293b82","src/stream/stream/split.rs":"0552ddf8f7f3a9980dbc692d0c34b72503107c714f81e853445fb6c81fe328ff","src/stream/stream/take.rs":"57d381b482c3d584c4c26b0e15941bc2ea58e3f39a2e5c74391a2ee7b825cc8c","src/stream/stream/take_until.rs":"0f1fa7d158192a5dee32392dfdd062c15dab6d246b0ca267e91aae490d7d7fdb","src/stream/stream/take_while.rs":"2f57a6e5b903c045da642e9a40eb19dabbc612a80a6ce8098df1a1973555f108","src/stream/stream/then.rs":"c995c6b0d9151927b26b10fba70e135dfc41224b969d1367dc8c11697218c1e9","src/stream/stream/unzip.rs":"e7beedc2192604e0091ac3d0265b487127a37c780198838f6419c21ef1b38df0","src/stream/stream/zip.rs":"3890b40daea00341fac6ac977de0b534d1ec7cdaabece44af5df2ca56026fe62","src/stream/try_stream/and_then.rs":"6f92b333955f5ec30fddf8e087e3f60ebf53a054769fc72c80bbccdf13a9431e","src/stream/try_stream/into_async_read.rs":"5b200c76ccb95460d94286ca8e63f5454940eb62b5f15aae998da48aa06fbffd","src/stream/try_stream/into_stream.rs":"4fee94e89956a42871fc4a0cdba7ae1b7d4265e884528799cd227c9dd851acce","src/stream/try_stream/mod.rs":"e2460ce64e3b43c92860b9fd6dd6b36f9c6f6750e9d1e7bec8f766ad84889269","src/stream/try_stream/or_else.rs":"473ca77e0e81a1a0834d2d882076b8823a5a3027b2d7d78f887be2d5edfd0de3","src/stream/try_stream/try_buffer_unordered.rs":"64e698ea6aefbe7e32d48e737553b20b9cde5c258963bb20486b48b7d6899660","src/stream/try_stream/try_buffered.rs":"38f60d7290f44471a02084c6b394b754c224a84ee8d2ba01c08568168b48a21f","src/stream/try_stream/try_chunks.rs":"69c4d85a256250d73c6372d8047e6055da7eac918cb5d7ef4f3697898f4dcb4c","src/stream/try_stream/try_collect.rs":"979920e3034dad6c75961e3f6b4c0234691db7063eca1a05562cc5d41f2943c1","src/stream/try_stream/try_concat.rs":"f2330ebeeab30273e9ac0e8600bfe2f405ce671f6386e688b3afb1d2fdd7c2c6","src/stream/try_stream/try_filter.rs":"1344e9aea05e2d0078f30caff176a99e1ccb8fcdf0a287817abc82fbaf09c48b","src/stream/try_stream/try_filter_map.rs":"285e7ea875a3ea3e16942c1b1acae5a1cb26b9bac476dce3903547cb99306602","src/stream/try_stream/try_flatten.rs":"e05614d86a27ab8386476eea35fd424c07e5f7f99cf0401d63a6655eb7ca1247","src/stream/try_stream/try_flatten_unordered.rs":"1cc4c4a5ea0a8db3010958f34fb1886dcfbd2e1584082d2004030eb70b13cd6c","src/stream/try_stream/try_fold.rs":"b96aa2fe1a16f625d5045028a86ff8684dcf5198ef8c7c072f52f39aeaa8b619","src/stream/try_stream/try_for_each.rs":"3f3901d618333b740d470eb02fcbb645df92483493872298bb7bd0382646028a","src/stream/try_stream/try_for_each_concurrent.rs":"78a94a77f329862c2a245ec3add97e49c534985f0d9da98f205b7fa3c7c08df3","src/stream/try_stream/try_next.rs":"6e29473153db1435906e79f7eaa13ce9da842d4528ba9eb1c0034665feacc565","src/stream/try_stream/try_skip_while.rs":"7c2fa31fe8b0b4e59c5d7f2972c8d9f83e8f01a687b08f5cd631f92a14b402f1","src/stream/try_stream/try_take_while.rs":"2783664637aff0442f0c9204d35600139c941332310f70495cbc4dc345cae99d","src/stream/try_stream/try_unfold.rs":"aaf0f4857a4ec8233ac842ae509f29e5a210827a0bb40cfc0dc3e858f153d2b4","src/stream/unfold.rs":"8b2feb00f979562b43064eb078d53a160cdb3c65deed17ec25a05938df2d370f","src/task/mod.rs":"074ce7f3869663d2e768bb08ea201ed1be176e13edd4150f201bc1ea362170d3","src/task/spawn.rs":"8ff3a3652d8d2cb45717324b6ead9c3f111629e7eb0c0b33d3639a0e7c5bbf3e","src/unfold_state.rs":"ffe848071a99d6afcdbe8281a8a77a559a7dde434fc41f734c90e6b9b5d8a5af"},"package":"26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/futures-util/Cargo.toml temporalio-1.3.0/vendor/futures-util/Cargo.toml --- temporalio-1.3.0/vendor/futures-util/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/futures-util/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -13,7 +13,7 @@ edition = "2018" rust-version = "1.56" name = "futures-util" -version = "0.3.29" +version = "0.3.28" description = """ Common utilities and extension traits for the futures-rs library. """ @@ -30,33 +30,33 @@ ] [dependencies.futures-channel] -version = "0.3.29" +version = "0.3.28" features = ["std"] optional = true default-features = false [dependencies.futures-core] -version = "0.3.29" +version = "0.3.28" default-features = false [dependencies.futures-io] -version = "0.3.29" +version = "0.3.28" features = ["std"] optional = true default-features = false [dependencies.futures-macro] -version = "=0.3.29" +version = "=0.3.28" optional = true default-features = false [dependencies.futures-sink] -version = "0.3.29" +version = "0.3.28" optional = true default-features = false [dependencies.futures-task] -version = "0.3.29" +version = "0.3.28" default-features = false [dependencies.futures_01] diff -Nru temporalio-1.3.0/vendor/futures-util/src/async_await/mod.rs temporalio-1.3.0/vendor/futures-util/src/async_await/mod.rs --- temporalio-1.3.0/vendor/futures-util/src/async_await/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/futures-util/src/async_await/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -31,11 +31,9 @@ pub use self::select_mod::*; // Primary export is a macro -#[cfg(feature = "std")] #[cfg(feature = "async-await-macro")] mod stream_select_mod; #[allow(unreachable_pub)] // https://github.com/rust-lang/rust/issues/64762 -#[cfg(feature = "std")] #[cfg(feature = "async-await-macro")] pub use self::stream_select_mod::*; diff -Nru temporalio-1.3.0/vendor/futures-util/src/async_await/stream_select_mod.rs temporalio-1.3.0/vendor/futures-util/src/async_await/stream_select_mod.rs --- temporalio-1.3.0/vendor/futures-util/src/async_await/stream_select_mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/futures-util/src/async_await/stream_select_mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,5 +1,6 @@ //! The `stream_select` macro. +#[cfg(feature = "std")] #[allow(unreachable_pub)] #[doc(hidden)] pub use futures_macro::stream_select_internal; @@ -27,6 +28,7 @@ /// } /// # }); /// ``` +#[cfg(feature = "std")] #[macro_export] macro_rules! stream_select { ($($tokens:tt)*) => {{ diff -Nru temporalio-1.3.0/vendor/futures-util/src/future/future/mod.rs temporalio-1.3.0/vendor/futures-util/src/future/future/mod.rs --- temporalio-1.3.0/vendor/futures-util/src/future/future/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/futures-util/src/future/future/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -463,6 +463,10 @@ /// ``` /// /// ``` + /// // Note, unlike most examples this is written in the context of a + /// // synchronous function to better illustrate the cross-thread aspect of + /// // the `shared` combinator. + /// /// # futures::executor::block_on(async { /// use futures::future::FutureExt; /// use futures::executor::block_on; diff -Nru temporalio-1.3.0/vendor/futures-util/src/future/join_all.rs temporalio-1.3.0/vendor/futures-util/src/future/join_all.rs --- temporalio-1.3.0/vendor/futures-util/src/future/join_all.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/futures-util/src/future/join_all.rs 2023-10-30 19:40:00.000000000 +0000 @@ -77,7 +77,7 @@ /// /// `join_all` will switch to the more powerful [`FuturesOrdered`] for performance /// reasons if the number of futures is large. You may want to look into using it or -/// its counterpart [`FuturesUnordered`][crate::stream::FuturesUnordered] directly. +/// it's counterpart [`FuturesUnordered`][crate::stream::FuturesUnordered] directly. /// /// Some examples for additional functionality provided by these are: /// diff -Nru temporalio-1.3.0/vendor/futures-util/src/io/mod.rs temporalio-1.3.0/vendor/futures-util/src/io/mod.rs --- temporalio-1.3.0/vendor/futures-util/src/io/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/futures-util/src/io/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -804,11 +804,11 @@ /// use futures::io::{AsyncBufReadExt, Cursor}; /// use futures::stream::StreamExt; /// - /// let cursor = Cursor::new(b"lorem\nipsum\xc2\r\ndolor"); + /// let cursor = Cursor::new(b"lorem\nipsum\r\ndolor"); /// - /// let mut lines_stream = cursor.lines().map(|l| l.unwrap_or(String::from("invalid UTF_8"))); + /// let mut lines_stream = cursor.lines().map(|l| l.unwrap()); /// assert_eq!(lines_stream.next().await, Some(String::from("lorem"))); - /// assert_eq!(lines_stream.next().await, Some(String::from("invalid UTF_8"))); + /// assert_eq!(lines_stream.next().await, Some(String::from("ipsum"))); /// assert_eq!(lines_stream.next().await, Some(String::from("dolor"))); /// assert_eq!(lines_stream.next().await, None); /// # Ok::<(), Box>(()) }).unwrap(); diff -Nru temporalio-1.3.0/vendor/futures-util/src/io/read_line.rs temporalio-1.3.0/vendor/futures-util/src/io/read_line.rs --- temporalio-1.3.0/vendor/futures-util/src/io/read_line.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/futures-util/src/io/read_line.rs 2023-10-30 19:40:00.000000000 +0000 @@ -35,7 +35,6 @@ ) -> Poll> { let ret = ready!(read_until_internal(reader, cx, b'\n', bytes, read)); if str::from_utf8(bytes).is_err() { - bytes.clear(); Poll::Ready(ret.and_then(|_| { Err(io::Error::new(io::ErrorKind::InvalidData, "stream did not contain valid UTF-8")) })) diff -Nru temporalio-1.3.0/vendor/futures-util/src/io/window.rs temporalio-1.3.0/vendor/futures-util/src/io/window.rs --- temporalio-1.3.0/vendor/futures-util/src/io/window.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/futures-util/src/io/window.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,6 +1,6 @@ use std::ops::{Bound, Range, RangeBounds}; -/// An owned window around an underlying buffer. +/// A owned window around an underlying buffer. /// /// Normally slices work great for considering sub-portions of a buffer, but /// unfortunately a slice is a *borrowed* type in Rust which has an associated diff -Nru temporalio-1.3.0/vendor/futures-util/src/stream/futures_ordered.rs temporalio-1.3.0/vendor/futures-util/src/stream/futures_ordered.rs --- temporalio-1.3.0/vendor/futures-util/src/stream/futures_ordered.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/futures-util/src/stream/futures_ordered.rs 2023-10-30 19:40:00.000000000 +0000 @@ -58,39 +58,36 @@ /// An unbounded queue of futures. /// -/// This "combinator" is similar to [`FuturesUnordered`], but it imposes a FIFO -/// order on top of the set of futures. While futures in the set will race to +/// This "combinator" is similar to [`FuturesUnordered`], but it imposes a FIFO order +/// on top of the set of futures. While futures in the set will race to /// completion in parallel, results will only be returned in the order their /// originating futures were added to the queue. /// /// Futures are pushed into this queue and their realized values are yielded in /// order. This structure is optimized to manage a large number of futures. -/// Futures managed by [`FuturesOrdered`] will only be polled when they generate +/// Futures managed by `FuturesOrdered` will only be polled when they generate /// notifications. This reduces the required amount of work needed to coordinate /// large numbers of futures. /// -/// When a [`FuturesOrdered`] is first created, it does not contain any futures. -/// Calling [`poll_next`](FuturesOrdered::poll_next) in this state will result -/// in [`Poll::Ready(None)`](Poll::Ready) to be returned. Futures are submitted -/// to the queue using [`push_back`](FuturesOrdered::push_back) (or -/// [`push_front`](FuturesOrdered::push_front)); however, the future will -/// **not** be polled at this point. [`FuturesOrdered`] will only poll managed -/// futures when [`FuturesOrdered::poll_next`] is called. As such, it -/// is important to call [`poll_next`](FuturesOrdered::poll_next) after pushing -/// new futures. -/// -/// If [`FuturesOrdered::poll_next`] returns [`Poll::Ready(None)`](Poll::Ready) -/// this means that the queue is currently not managing any futures. A future -/// may be submitted to the queue at a later time. At that point, a call to -/// [`FuturesOrdered::poll_next`] will either return the future's resolved value -/// **or** [`Poll::Pending`] if the future has not yet completed. When -/// multiple futures are submitted to the queue, [`FuturesOrdered::poll_next`] -/// will return [`Poll::Pending`] until the first future completes, even if +/// When a `FuturesOrdered` is first created, it does not contain any futures. +/// Calling `poll` in this state will result in `Poll::Ready(None))` to be +/// returned. Futures are submitted to the queue using `push`; however, the +/// future will **not** be polled at this point. `FuturesOrdered` will only +/// poll managed futures when `FuturesOrdered::poll` is called. As such, it +/// is important to call `poll` after pushing new futures. +/// +/// If `FuturesOrdered::poll` returns `Poll::Ready(None)` this means that +/// the queue is currently not managing any futures. A future may be submitted +/// to the queue at a later time. At that point, a call to +/// `FuturesOrdered::poll` will either return the future's resolved value +/// **or** `Poll::Pending` if the future has not yet completed. When +/// multiple futures are submitted to the queue, `FuturesOrdered::poll` will +/// return `Poll::Pending` until the first future completes, even if /// some of the later futures have already completed. /// -/// Note that you can create a ready-made [`FuturesOrdered`] via the +/// Note that you can create a ready-made `FuturesOrdered` via the /// [`collect`](Iterator::collect) method, or you can start with an empty queue -/// with the [`FuturesOrdered::new`] constructor. +/// with the `FuturesOrdered::new` constructor. /// /// This type is only available when the `std` or `alloc` feature of this /// library is activated, and it is activated by default. @@ -107,9 +104,8 @@ impl FuturesOrdered { /// Constructs a new, empty `FuturesOrdered` /// - /// The returned [`FuturesOrdered`] does not contain any futures and, in - /// this state, [`FuturesOrdered::poll_next`] will return - /// [`Poll::Ready(None)`](Poll::Ready). + /// The returned `FuturesOrdered` does not contain any futures and, in this + /// state, `FuturesOrdered::poll_next` will return `Poll::Ready(None)`. pub fn new() -> Self { Self { in_progress_queue: FuturesUnordered::new(), @@ -136,9 +132,9 @@ /// Push a future into the queue. /// /// This function submits the given future to the internal set for managing. - /// This function will not call [`poll`](Future::poll) on the submitted - /// future. The caller must ensure that [`FuturesOrdered::poll_next`] is - /// called in order to receive task notifications. + /// This function will not call `poll` on the submitted future. The caller + /// must ensure that `FuturesOrdered::poll` is called in order to receive + /// task notifications. #[deprecated(note = "use `push_back` instead")] pub fn push(&mut self, future: Fut) { self.push_back(future); @@ -147,9 +143,9 @@ /// Pushes a future to the back of the queue. /// /// This function submits the given future to the internal set for managing. - /// This function will not call [`poll`](Future::poll) on the submitted - /// future. The caller must ensure that [`FuturesOrdered::poll_next`] is - /// called in order to receive task notifications. + /// This function will not call `poll` on the submitted future. The caller + /// must ensure that `FuturesOrdered::poll` is called in order to receive + /// task notifications. pub fn push_back(&mut self, future: Fut) { let wrapped = OrderWrapper { data: future, index: self.next_incoming_index }; self.next_incoming_index += 1; @@ -159,10 +155,10 @@ /// Pushes a future to the front of the queue. /// /// This function submits the given future to the internal set for managing. - /// This function will not call [`poll`](Future::poll) on the submitted - /// future. The caller must ensure that [`FuturesOrdered::poll_next`] is - /// called in order to receive task notifications. This future will be - /// the next future to be returned complete. + /// This function will not call `poll` on the submitted future. The caller + /// must ensure that `FuturesOrdered::poll` is called in order to receive + /// task notifications. This future will be the next future to be returned + /// complete. pub fn push_front(&mut self, future: Fut) { let wrapped = OrderWrapper { data: future, index: self.next_outgoing_index - 1 }; self.next_outgoing_index -= 1; diff -Nru temporalio-1.3.0/vendor/futures-util/src/stream/futures_unordered/mod.rs temporalio-1.3.0/vendor/futures-util/src/stream/futures_unordered/mod.rs --- temporalio-1.3.0/vendor/futures-util/src/stream/futures_unordered/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/futures-util/src/stream/futures_unordered/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -62,7 +62,7 @@ } unsafe impl Send for FuturesUnordered {} -unsafe impl Sync for FuturesUnordered {} +unsafe impl Sync for FuturesUnordered {} impl Unpin for FuturesUnordered {} impl Spawn for FuturesUnordered> { diff -Nru temporalio-1.3.0/vendor/futures-util/src/stream/mod.rs temporalio-1.3.0/vendor/futures-util/src/stream/mod.rs --- temporalio-1.3.0/vendor/futures-util/src/stream/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/futures-util/src/stream/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -68,7 +68,7 @@ }; #[cfg(feature = "alloc")] -pub use self::try_stream::{TryChunks, TryChunksError, TryReadyChunks, TryReadyChunksError}; +pub use self::try_stream::{TryChunks, TryChunksError}; // Primitive streams diff -Nru temporalio-1.3.0/vendor/futures-util/src/stream/stream/all.rs temporalio-1.3.0/vendor/futures-util/src/stream/stream/all.rs --- temporalio-1.3.0/vendor/futures-util/src/stream/stream/all.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/futures-util/src/stream/stream/all.rs 2023-10-30 19:40:00.000000000 +0000 @@ -13,7 +13,7 @@ #[pin] stream: St, f: F, - done: bool, + accum: Option, #[pin] future: Option, } @@ -27,7 +27,7 @@ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_struct("All") .field("stream", &self.stream) - .field("done", &self.done) + .field("accum", &self.accum) .field("future", &self.future) .finish() } @@ -40,7 +40,7 @@ Fut: Future, { pub(super) fn new(stream: St, f: F) -> Self { - Self { stream, f, done: false, future: None } + Self { stream, f, accum: Some(true), future: None } } } @@ -51,7 +51,7 @@ Fut: Future, { fn is_terminated(&self) -> bool { - self.done && self.future.is_none() + self.accum.is_none() && self.future.is_none() } } @@ -67,22 +67,21 @@ let mut this = self.project(); Poll::Ready(loop { if let Some(fut) = this.future.as_mut().as_pin_mut() { - // we're currently processing a future to produce a new value - let res = ready!(fut.poll(cx)); - this.future.set(None); - if !res { - *this.done = true; + // we're currently processing a future to produce a new accum value + let acc = this.accum.unwrap() && ready!(fut.poll(cx)); + if !acc { break false; } // early exit - } else if !*this.done { + *this.accum = Some(acc); + this.future.set(None); + } else if this.accum.is_some() { // we're waiting on a new item from the stream match ready!(this.stream.as_mut().poll_next(cx)) { Some(item) => { this.future.set(Some((this.f)(item))); } None => { - *this.done = true; - break true; + break this.accum.take().unwrap(); } } } else { diff -Nru temporalio-1.3.0/vendor/futures-util/src/stream/stream/any.rs temporalio-1.3.0/vendor/futures-util/src/stream/stream/any.rs --- temporalio-1.3.0/vendor/futures-util/src/stream/stream/any.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/futures-util/src/stream/stream/any.rs 2023-10-30 19:40:00.000000000 +0000 @@ -13,7 +13,7 @@ #[pin] stream: St, f: F, - done: bool, + accum: Option, #[pin] future: Option, } @@ -27,7 +27,7 @@ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_struct("Any") .field("stream", &self.stream) - .field("done", &self.done) + .field("accum", &self.accum) .field("future", &self.future) .finish() } @@ -40,7 +40,7 @@ Fut: Future, { pub(super) fn new(stream: St, f: F) -> Self { - Self { stream, f, done: false, future: None } + Self { stream, f, accum: Some(false), future: None } } } @@ -51,7 +51,7 @@ Fut: Future, { fn is_terminated(&self) -> bool { - self.done && self.future.is_none() + self.accum.is_none() && self.future.is_none() } } @@ -67,22 +67,21 @@ let mut this = self.project(); Poll::Ready(loop { if let Some(fut) = this.future.as_mut().as_pin_mut() { - // we're currently processing a future to produce a new value - let res = ready!(fut.poll(cx)); - this.future.set(None); - if res { - *this.done = true; + // we're currently processing a future to produce a new accum value + let acc = this.accum.unwrap() || ready!(fut.poll(cx)); + if acc { break true; } // early exit - } else if !*this.done { + *this.accum = Some(acc); + this.future.set(None); + } else if this.accum.is_some() { // we're waiting on a new item from the stream match ready!(this.stream.as_mut().poll_next(cx)) { Some(item) => { this.future.set(Some((this.f)(item))); } None => { - *this.done = true; - break false; + break this.accum.take().unwrap(); } } } else { diff -Nru temporalio-1.3.0/vendor/futures-util/src/stream/stream/mod.rs temporalio-1.3.0/vendor/futures-util/src/stream/stream/mod.rs --- temporalio-1.3.0/vendor/futures-util/src/stream/stream/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/futures-util/src/stream/stream/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -323,9 +323,6 @@ /// wrapped version of it, similar to the existing `map` methods in the /// standard library. /// - /// See [`StreamExt::then`](Self::then) if you want to use a closure that - /// returns a future instead of a value. - /// /// # Examples /// /// ``` @@ -470,9 +467,6 @@ /// Note that this function consumes the stream passed into it and returns a /// wrapped version of it. /// - /// See [`StreamExt::map`](Self::map) if you want to use a closure that - /// returns a value instead of a future. - /// /// # Examples /// /// ``` diff -Nru temporalio-1.3.0/vendor/futures-util/src/stream/try_stream/mod.rs temporalio-1.3.0/vendor/futures-util/src/stream/try_stream/mod.rs --- temporalio-1.3.0/vendor/futures-util/src/stream/try_stream/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/futures-util/src/stream/try_stream/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -111,12 +111,6 @@ #[allow(unreachable_pub)] // https://github.com/rust-lang/rust/issues/57411 pub use self::try_chunks::{TryChunks, TryChunksError}; -#[cfg(feature = "alloc")] -mod try_ready_chunks; -#[cfg(feature = "alloc")] -#[allow(unreachable_pub)] // https://github.com/rust-lang/rust/issues/57411 -pub use self::try_ready_chunks::{TryReadyChunks, TryReadyChunksError}; - mod try_fold; #[allow(unreachable_pub)] // https://github.com/rust-lang/rust/issues/57411 pub use self::try_fold::TryFold; @@ -166,14 +160,6 @@ #[allow(unreachable_pub)] // https://github.com/rust-lang/rust/issues/57411 pub use self::into_async_read::IntoAsyncRead; -mod try_all; -#[allow(unreachable_pub)] // https://github.com/rust-lang/rust/issues/57411 -pub use self::try_all::TryAll; - -mod try_any; -#[allow(unreachable_pub)] // https://github.com/rust-lang/rust/issues/57411 -pub use self::try_any::TryAny; - impl TryStreamExt for S {} /// Adapters specific to `Result`-returning streams @@ -654,55 +640,6 @@ ) } - /// An adaptor for chunking up successful, ready items of the stream inside a vector. - /// - /// This combinator will attempt to pull successful items from this stream and buffer - /// them into a local vector. At most `capacity` items will get buffered - /// before they're yielded from the returned stream. If the underlying stream - /// returns `Poll::Pending`, and the collected chunk is not empty, it will - /// be immidiatly returned. - /// - /// Note that the vectors returned from this iterator may not always have - /// `capacity` elements. If the underlying stream ended and only a partial - /// vector was created, it'll be returned. Additionally if an error happens - /// from the underlying stream then the currently buffered items will be - /// yielded. - /// - /// This method is only available when the `std` or `alloc` feature of this - /// library is activated, and it is activated by default. - /// - /// This function is similar to - /// [`StreamExt::ready_chunks`](crate::stream::StreamExt::ready_chunks) but exits - /// early if an error occurs. - /// - /// # Examples - /// - /// ``` - /// # futures::executor::block_on(async { - /// use futures::stream::{self, TryReadyChunksError, TryStreamExt}; - /// - /// let stream = stream::iter(vec![Ok::(1), Ok(2), Ok(3), Err(4), Ok(5), Ok(6)]); - /// let mut stream = stream.try_ready_chunks(2); - /// - /// assert_eq!(stream.try_next().await, Ok(Some(vec![1, 2]))); - /// assert_eq!(stream.try_next().await, Err(TryReadyChunksError(vec![3], 4))); - /// assert_eq!(stream.try_next().await, Ok(Some(vec![5, 6]))); - /// # }) - /// ``` - /// - /// # Panics - /// - /// This method will panic if `capacity` is zero. - #[cfg(feature = "alloc")] - fn try_ready_chunks(self, capacity: usize) -> TryReadyChunks - where - Self: Sized, - { - assert_stream::, TryReadyChunksError>, _>( - TryReadyChunks::new(self, capacity), - ) - } - /// Attempt to filter the values produced by this stream according to the /// provided asynchronous closure. /// @@ -1190,62 +1127,4 @@ { crate::io::assert_read(IntoAsyncRead::new(self)) } - - /// Attempt to execute a predicate over an asynchronous stream and evaluate if all items - /// satisfy the predicate. Exits early if an `Err` is encountered or if an `Ok` item is found - /// that does not satisfy the predicate. - /// - /// # Examples - /// - /// ``` - /// # futures::executor::block_on(async { - /// use futures::stream::{self, StreamExt, TryStreamExt}; - /// use std::convert::Infallible; - /// - /// let number_stream = stream::iter(1..10).map(Ok::<_, Infallible>); - /// let positive = number_stream.try_all(|i| async move { i > 0 }); - /// assert_eq!(positive.await, Ok(true)); - /// - /// let stream_with_errors = stream::iter([Ok(1), Err("err"), Ok(3)]); - /// let positive = stream_with_errors.try_all(|i| async move { i > 0 }); - /// assert_eq!(positive.await, Err("err")); - /// # }); - /// ``` - fn try_all(self, f: F) -> TryAll - where - Self: Sized, - F: FnMut(Self::Ok) -> Fut, - Fut: Future, - { - assert_future::, _>(TryAll::new(self, f)) - } - - /// Attempt to execute a predicate over an asynchronous stream and evaluate if any items - /// satisfy the predicate. Exits early if an `Err` is encountered or if an `Ok` item is found - /// that satisfies the predicate. - /// - /// # Examples - /// - /// ``` - /// # futures::executor::block_on(async { - /// use futures::stream::{self, StreamExt, TryStreamExt}; - /// use std::convert::Infallible; - /// - /// let number_stream = stream::iter(0..10).map(Ok::<_, Infallible>); - /// let contain_three = number_stream.try_any(|i| async move { i == 3 }); - /// assert_eq!(contain_three.await, Ok(true)); - /// - /// let stream_with_errors = stream::iter([Ok(1), Err("err"), Ok(3)]); - /// let contain_three = stream_with_errors.try_any(|i| async move { i == 3 }); - /// assert_eq!(contain_three.await, Err("err")); - /// # }); - /// ``` - fn try_any(self, f: F) -> TryAny - where - Self: Sized, - F: FnMut(Self::Ok) -> Fut, - Fut: Future, - { - assert_future::, _>(TryAny::new(self, f)) - } } diff -Nru temporalio-1.3.0/vendor/futures-util/src/stream/try_stream/try_all.rs temporalio-1.3.0/vendor/futures-util/src/stream/try_stream/try_all.rs --- temporalio-1.3.0/vendor/futures-util/src/stream/try_stream/try_all.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/futures-util/src/stream/try_stream/try_all.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,98 +0,0 @@ -use core::fmt; -use core::pin::Pin; -use futures_core::future::{FusedFuture, Future}; -use futures_core::ready; -use futures_core::stream::TryStream; -use futures_core::task::{Context, Poll}; -use pin_project_lite::pin_project; - -pin_project! { - /// Future for the [`try_all`](super::TryStreamExt::try_all) method. - #[must_use = "futures do nothing unless you `.await` or poll them"] - pub struct TryAll { - #[pin] - stream: St, - f: F, - done: bool, - #[pin] - future: Option, - } -} - -impl fmt::Debug for TryAll -where - St: fmt::Debug, - Fut: fmt::Debug, -{ - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("TryAll") - .field("stream", &self.stream) - .field("done", &self.done) - .field("future", &self.future) - .finish() - } -} - -impl TryAll -where - St: TryStream, - F: FnMut(St::Ok) -> Fut, - Fut: Future, -{ - pub(super) fn new(stream: St, f: F) -> Self { - Self { stream, f, done: false, future: None } - } -} - -impl FusedFuture for TryAll -where - St: TryStream, - F: FnMut(St::Ok) -> Fut, - Fut: Future, -{ - fn is_terminated(&self) -> bool { - self.done && self.future.is_none() - } -} - -impl Future for TryAll -where - St: TryStream, - F: FnMut(St::Ok) -> Fut, - Fut: Future, -{ - type Output = Result; - - fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { - let mut this = self.project(); - - Poll::Ready(loop { - if let Some(fut) = this.future.as_mut().as_pin_mut() { - // we're currently processing a future to produce a new value - let acc = ready!(fut.poll(cx)); - this.future.set(None); - if !acc { - *this.done = true; - break Ok(false); - } // early exit - } else if !*this.done { - // we're waiting on a new item from the stream - match ready!(this.stream.as_mut().try_poll_next(cx)) { - Some(Ok(item)) => { - this.future.set(Some((this.f)(item))); - } - Some(Err(err)) => { - *this.done = true; - break Err(err); - } - None => { - *this.done = true; - break Ok(true); - } - } - } else { - panic!("TryAll polled after completion") - } - }) - } -} diff -Nru temporalio-1.3.0/vendor/futures-util/src/stream/try_stream/try_any.rs temporalio-1.3.0/vendor/futures-util/src/stream/try_stream/try_any.rs --- temporalio-1.3.0/vendor/futures-util/src/stream/try_stream/try_any.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/futures-util/src/stream/try_stream/try_any.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,98 +0,0 @@ -use core::fmt; -use core::pin::Pin; -use futures_core::future::{FusedFuture, Future}; -use futures_core::ready; -use futures_core::stream::TryStream; -use futures_core::task::{Context, Poll}; -use pin_project_lite::pin_project; - -pin_project! { - /// Future for the [`any`](super::StreamExt::any) method. - #[must_use = "futures do nothing unless you `.await` or poll them"] - pub struct TryAny { - #[pin] - stream: St, - f: F, - done: bool, - #[pin] - future: Option, - } -} - -impl fmt::Debug for TryAny -where - St: fmt::Debug, - Fut: fmt::Debug, -{ - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("TryAny") - .field("stream", &self.stream) - .field("done", &self.done) - .field("future", &self.future) - .finish() - } -} - -impl TryAny -where - St: TryStream, - F: FnMut(St::Ok) -> Fut, - Fut: Future, -{ - pub(super) fn new(stream: St, f: F) -> Self { - Self { stream, f, done: false, future: None } - } -} - -impl FusedFuture for TryAny -where - St: TryStream, - F: FnMut(St::Ok) -> Fut, - Fut: Future, -{ - fn is_terminated(&self) -> bool { - self.done && self.future.is_none() - } -} - -impl Future for TryAny -where - St: TryStream, - F: FnMut(St::Ok) -> Fut, - Fut: Future, -{ - type Output = Result; - - fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { - let mut this = self.project(); - - Poll::Ready(loop { - if let Some(fut) = this.future.as_mut().as_pin_mut() { - // we're currently processing a future to produce a new value - let acc = ready!(fut.poll(cx)); - this.future.set(None); - if acc { - *this.done = true; - break Ok(true); - } // early exit - } else if !*this.done { - // we're waiting on a new item from the stream - match ready!(this.stream.as_mut().try_poll_next(cx)) { - Some(Ok(item)) => { - this.future.set(Some((this.f)(item))); - } - Some(Err(err)) => { - *this.done = true; - break Err(err); - } - None => { - *this.done = true; - break Ok(false); - } - } - } else { - panic!("TryAny polled after completion") - } - }) - } -} diff -Nru temporalio-1.3.0/vendor/futures-util/src/stream/try_stream/try_ready_chunks.rs temporalio-1.3.0/vendor/futures-util/src/stream/try_stream/try_ready_chunks.rs --- temporalio-1.3.0/vendor/futures-util/src/stream/try_stream/try_ready_chunks.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/futures-util/src/stream/try_stream/try_ready_chunks.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,126 +0,0 @@ -use crate::stream::{Fuse, IntoStream, StreamExt}; - -use alloc::vec::Vec; -use core::fmt; -use core::pin::Pin; -use futures_core::stream::{FusedStream, Stream, TryStream}; -use futures_core::task::{Context, Poll}; -#[cfg(feature = "sink")] -use futures_sink::Sink; -use pin_project_lite::pin_project; - -pin_project! { - /// Stream for the [`try_ready_chunks`](super::TryStreamExt::try_ready_chunks) method. - #[derive(Debug)] - #[must_use = "streams do nothing unless polled"] - pub struct TryReadyChunks { - #[pin] - stream: Fuse>, - cap: usize, // https://github.com/rust-lang/futures-rs/issues/1475 - } -} - -impl TryReadyChunks { - pub(super) fn new(stream: St, capacity: usize) -> Self { - assert!(capacity > 0); - - Self { stream: IntoStream::new(stream).fuse(), cap: capacity } - } - - delegate_access_inner!(stream, St, (. .)); -} - -type TryReadyChunksStreamError = - TryReadyChunksError<::Ok, ::Error>; - -impl Stream for TryReadyChunks { - type Item = Result, TryReadyChunksStreamError>; - - fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { - let mut this = self.as_mut().project(); - - let mut items: Vec = Vec::new(); - - loop { - match this.stream.as_mut().poll_next(cx) { - // Flush all the collected data if the underlying stream doesn't - // contain more ready values - Poll::Pending => { - return if items.is_empty() { - Poll::Pending - } else { - Poll::Ready(Some(Ok(items))) - } - } - - // Push the ready item into the buffer and check whether it is full. - // If so, return the buffer. - Poll::Ready(Some(Ok(item))) => { - if items.is_empty() { - items.reserve_exact(*this.cap); - } - items.push(item); - if items.len() >= *this.cap { - return Poll::Ready(Some(Ok(items))); - } - } - - // Return the already collected items and the error. - Poll::Ready(Some(Err(e))) => { - return Poll::Ready(Some(Err(TryReadyChunksError(items, e)))); - } - - // Since the underlying stream ran out of values, return what we - // have buffered, if we have anything. - Poll::Ready(None) => { - let last = if items.is_empty() { None } else { Some(Ok(items)) }; - return Poll::Ready(last); - } - } - } - } - - fn size_hint(&self) -> (usize, Option) { - let (lower, upper) = self.stream.size_hint(); - let lower = lower / self.cap; - (lower, upper) - } -} - -impl FusedStream for TryReadyChunks { - fn is_terminated(&self) -> bool { - self.stream.is_terminated() - } -} - -// Forwarding impl of Sink from the underlying stream -#[cfg(feature = "sink")] -impl Sink for TryReadyChunks -where - S: TryStream + Sink, -{ - type Error = >::Error; - - delegate_sink!(stream, Item); -} - -/// Error indicating, that while chunk was collected inner stream produced an error. -/// -/// Contains all items that were collected before an error occurred, and the stream error itself. -#[derive(PartialEq, Eq)] -pub struct TryReadyChunksError(pub Vec, pub E); - -impl fmt::Debug for TryReadyChunksError { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - self.1.fmt(f) - } -} - -impl fmt::Display for TryReadyChunksError { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - self.1.fmt(f) - } -} - -#[cfg(feature = "std")] -impl std::error::Error for TryReadyChunksError {} diff -Nru temporalio-1.3.0/vendor/futures-util/src/task/mod.rs temporalio-1.3.0/vendor/futures-util/src/task/mod.rs --- temporalio-1.3.0/vendor/futures-util/src/task/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/futures-util/src/task/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -30,7 +30,7 @@ #[cfg(feature = "alloc")] pub use futures_task::{waker_ref, WakerRef}; -#[cfg(any(not(futures_no_atomic_cas), feature = "portable-atomic"))] +#[cfg(not(futures_no_atomic_cas))] pub use futures_core::task::__internal::AtomicWaker; mod spawn; diff -Nru temporalio-1.3.0/vendor/governor/.cargo-checksum.json temporalio-1.3.0/vendor/governor/.cargo-checksum.json --- temporalio-1.3.0/vendor/governor/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/governor/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"CHANGELOG.md":"f06e27994ecb13192e20caa539222e1ed4350558a404a7c75e255ea3fa222440","Cargo.toml":"e05bd5ed1a17979eef514bcf986fb9d7f9ac2feafa38565b156ffe268f2cf98e","README.md":"621e516f7efe64b9993ce99d2de6220f008b6b2f4964e49b8d7f6605a5620558","benches/governor_criterion_benches.rs":"a53ad224e9700d4a3019a01a387a3f7baf1bcbdda08808bdb65493c205a005e8","benches/multi_threaded.rs":"2aa4e0c06d632cefa56e546652f27131f8de29390b97930c7d49b0df3c27b8b1","benches/realtime_clock.rs":"e24d7402dff164065e05c5795e13cd7cc7eb3413a933ec389df237a0001085ea","benches/single_threaded.rs":"79081b1aac63dcd044e7b306b98907647fc8247b9fd51ae65d3d5d6bc7b19647","doc/centrifugal-governor.png":"d499b0c8cd4d72e5c7419a52ca12e89d867f27d7c8c51b7d87a3df39c16034bd","release.toml":"48ffb067e63ebdc6c015982f3daa2e3b21ebdc89e0d399fe111d854d08ad27a6","src/_guide.rs":"2d86209b34e1d9dd260995a3ec6e2f41d76a7e9feb450815d0547a0672c206d0","src/clock.rs":"31c62ef1fe98c01821ca7f25af3895c0fb071633c57beb327183765769fec46f","src/clock/default.rs":"7e296f7294d703bcab0dc48b510a1c66977481bde4f4f6b30901c9376cf878ca","src/clock/quanta.rs":"43f3f577055d889da690984ca4c3ec07e46619b3a014cad5167e3b0c0d0db9e7","src/clock/with_std.rs":"9fd6addaa89ea561835aa5b071a822558bdfa8d0fc14fd380e19e392a55f89de","src/errors.rs":"e92f27269a0c106dccbf55685fab60e33bcefed280bb7a49b2610964730bd995","src/gcra.rs":"27e12e22d319c6659c15bc9c656daa017d1daff8a05b688543313605a5cb5fce","src/jitter.rs":"b678fcca2139f7b6c44cd97165166f9854088c316cd05fbe933ffb7cdf1e028e","src/lib.rs":"08f82324a8a56728e1b384460b8600eb2c98016c3f193ba05026b68b2a58f3e4","src/middleware.rs":"ffcc94025021f112c39df9ad16fee30392ca843c47ce851ff9211ace30c2c6a1","src/nanos.rs":"a2a74406ace60215b0655d7c86887a5e60a302a70af645f1de2a8c964a707845","src/quota.rs":"b26f8595c094fee1b63b9cf85c5dbf2bae2f2c875b648e2de2135c504aaf3b26","src/state.rs":"15768d300eee9ed723c23ba73a26c0d3266e01556a95b9f3113d6960894ee7e9","src/state/direct.rs":"27df1877fb43559ba21262d110e8c0f4fa7a87c6281bb19ba4da84eb4eb056a3","src/state/direct/future.rs":"9461677fb1bb7381ae9629037a709941f2cd0ec4f58270c5f08004b603e3fb5e","src/state/direct/sinks.rs":"c2cbe03d3aa42aa081f27bf07e0d93e1071de94bae7ae36ebe66affcb916c525","src/state/direct/streams.rs":"ea6ed4536c0b60f032cc68c40c53f6e9711ee2cea53e1f1c6a51158ca2ccc3ef","src/state/in_memory.rs":"b1fc58ca33ba3d99c3d3c51ee10940cb1e13711aec35627ae8d82fab0a6dbd44","src/state/keyed.rs":"9bc6e406232445e7def725ce3b63c6cf87319ce932a5c986066b7b6a3f81e06c","src/state/keyed/dashmap.rs":"a214fdc0432fa1e2bce8382b5c29b64ab7f35cff7b3014f8146bc678cf9190bf","src/state/keyed/future.rs":"5a0c449b9fad5de161b8fa4035f6c218cc829c2681150755683fc29f88423374","src/state/keyed/hashmap.rs":"f00df64d833bac847278c43b3c6bfb06e72fa8010260ff66eb8513e72d548cdc","tests/direct.rs":"becc53b9fddbe0dd7b69fdaf32b357e2dd08c09fdc44d9f65c60ee7a000dbce7","tests/future.rs":"b759cd21c0e2f9392675efe9b89cb38d4a85c7f0ca80a32baaeecce5e1f11d19","tests/keyed_dashmap.rs":"7707b57dd54a7830b7eafab728ae55be666c0e08c2ceaadec6da86f63c9c21a2","tests/keyed_hashmap.rs":"23d255e114e265569f63d5bd9a4e8ca1003f1a4c304f8d18f6260e528422a9fd","tests/memory_leaks.rs":"3e6de2b2638d4bb997f3b28305fd58f756da94879682288895bfb8b447969e89","tests/middleware.rs":"a874889955c9062bd994bcec7e845cb2c0cbad9b0dbccad60477c2b298835047","tests/proptests.regressions":"311cabbcf38957db4fe3d5854f4a1fba91f60cdf008f56b8a65881df35156c18","tests/proptests.rs":"458248b5763113f57306bb3cc9da1c7ff03b12366f3ebd02db41fc8b04c78fd7","tests/sinks.rs":"9c5e327463443ac29304d471fce23d1cfeba198455f6013e78cbdcb5e5a7042a","tests/streams.rs":"e46ad6a349376c54de7912765192c2805969f3d871ff4d5a082681988cc5740b"},"package":"c390a940a5d157878dd057c78680a33ce3415bcd05b4799509ea44210914b4d5"} \ No newline at end of file +{"files":{"CHANGELOG.md":"8a36b82017fda89883cfec4268023bd54909369e0620b3082e141bda0f0a3a09","Cargo.toml":"8b67fe74088e40316485d029f70aa0de95cff2d16ca2c81887dec273f7676343","README.md":"621e516f7efe64b9993ce99d2de6220f008b6b2f4964e49b8d7f6605a5620558","benches/governor_criterion_benches.rs":"a53ad224e9700d4a3019a01a387a3f7baf1bcbdda08808bdb65493c205a005e8","benches/multi_threaded.rs":"2aa4e0c06d632cefa56e546652f27131f8de29390b97930c7d49b0df3c27b8b1","benches/realtime_clock.rs":"e24d7402dff164065e05c5795e13cd7cc7eb3413a933ec389df237a0001085ea","benches/single_threaded.rs":"79081b1aac63dcd044e7b306b98907647fc8247b9fd51ae65d3d5d6bc7b19647","doc/centrifugal-governor.png":"d499b0c8cd4d72e5c7419a52ca12e89d867f27d7c8c51b7d87a3df39c16034bd","release.toml":"48ffb067e63ebdc6c015982f3daa2e3b21ebdc89e0d399fe111d854d08ad27a6","src/_guide.rs":"b7d2c6049928bcd3ac5c4c5e3fff4439a64a2067000c25a1f37cd0a707f0506c","src/clock.rs":"31c62ef1fe98c01821ca7f25af3895c0fb071633c57beb327183765769fec46f","src/clock/default.rs":"7e296f7294d703bcab0dc48b510a1c66977481bde4f4f6b30901c9376cf878ca","src/clock/quanta.rs":"05d00181c9ba57bf680b4bfb717242860fdac3b41625e3f58b844c4e8d22a258","src/clock/with_std.rs":"9fd6addaa89ea561835aa5b071a822558bdfa8d0fc14fd380e19e392a55f89de","src/errors.rs":"08f017ad55958539862174daffb1f1f4c1d0caaf178f1f3ab9bef005faa87109","src/gcra.rs":"ef7cf4695fe0f8b3c8e0e10430f636d66f2806ae24cdfffe0bfa8232f79d51ed","src/jitter.rs":"b678fcca2139f7b6c44cd97165166f9854088c316cd05fbe933ffb7cdf1e028e","src/lib.rs":"c9a13eb4967dff605dcc5a6ef8d2397c88fe135f388776761a700b9b63603696","src/middleware.rs":"ffcc94025021f112c39df9ad16fee30392ca843c47ce851ff9211ace30c2c6a1","src/nanos.rs":"a2a74406ace60215b0655d7c86887a5e60a302a70af645f1de2a8c964a707845","src/quota.rs":"8295090deae30eb8360a83c3fbf0bd22c3538cf95d4888b3835b604d45c61c9c","src/state.rs":"15768d300eee9ed723c23ba73a26c0d3266e01556a95b9f3113d6960894ee7e9","src/state/direct.rs":"89904fcc3d1aa9b35e2f9275dca600784212961b53d8a67a0722adf394b68f47","src/state/direct/future.rs":"17f5621cb4606926660f5a256da29d9a2e74ef7a690cfe8ffd962c77a8550f15","src/state/direct/sinks.rs":"c2cbe03d3aa42aa081f27bf07e0d93e1071de94bae7ae36ebe66affcb916c525","src/state/direct/streams.rs":"ea6ed4536c0b60f032cc68c40c53f6e9711ee2cea53e1f1c6a51158ca2ccc3ef","src/state/in_memory.rs":"b1fc58ca33ba3d99c3d3c51ee10940cb1e13711aec35627ae8d82fab0a6dbd44","src/state/keyed.rs":"4ba4ec5c33485d72243ce4789f02c215ac5187817f49121463a92872651170b7","src/state/keyed/dashmap.rs":"a214fdc0432fa1e2bce8382b5c29b64ab7f35cff7b3014f8146bc678cf9190bf","src/state/keyed/future.rs":"5a0c449b9fad5de161b8fa4035f6c218cc829c2681150755683fc29f88423374","src/state/keyed/hashmap.rs":"f00df64d833bac847278c43b3c6bfb06e72fa8010260ff66eb8513e72d548cdc","tests/direct.rs":"3dc3136cb95284d2d95e83fac9089fb6688ad1de2c0901806d47ee52c49ca49d","tests/future.rs":"b759cd21c0e2f9392675efe9b89cb38d4a85c7f0ca80a32baaeecce5e1f11d19","tests/keyed.rs":"91f799b93b38c8284eab1c9b108b70b0e212e7b815c311c5d471a44bc255c848","tests/keyed_dashmap.rs":"9ede04fa326e2d84f0da4b13a9f4f30608a1911154f9c329b896b24dce2e518a","tests/keyed_hashmap.rs":"56e7e136f63a53c2bb90130f2ede89c2e88cf4ec91d9cba21631f9db1fa97a87","tests/memory_leaks.rs":"3e6de2b2638d4bb997f3b28305fd58f756da94879682288895bfb8b447969e89","tests/middleware.rs":"a874889955c9062bd994bcec7e845cb2c0cbad9b0dbccad60477c2b298835047","tests/proptests.regressions":"311cabbcf38957db4fe3d5854f4a1fba91f60cdf008f56b8a65881df35156c18","tests/proptests.rs":"458248b5763113f57306bb3cc9da1c7ff03b12366f3ebd02db41fc8b04c78fd7","tests/sinks.rs":"9c5e327463443ac29304d471fce23d1cfeba198455f6013e78cbdcb5e5a7042a","tests/streams.rs":"e46ad6a349376c54de7912765192c2805969f3d871ff4d5a082681988cc5740b"},"package":"821239e5672ff23e2a7060901fa622950bbd80b649cdaadd78d1c1767ed14eb4"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/governor/Cargo.toml temporalio-1.3.0/vendor/governor/Cargo.toml --- temporalio-1.3.0/vendor/governor/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/governor/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -12,7 +12,7 @@ [package] edition = "2018" name = "governor" -version = "0.5.1" +version = "0.6.0" authors = ["Andreas Fuchs "] autobenches = false description = "A rate-limiting implementation in Rust" @@ -68,7 +68,7 @@ version = "0.12.0" [dependencies.quanta] -version = "0.9.0" +version = "0.11.1" optional = true [dependencies.rand] @@ -82,7 +82,7 @@ version = "2.2.0" [dev-dependencies.criterion] -version = "0.3.2" +version = "0.5.1" features = ["html_reports"] [dev-dependencies.crossbeam] @@ -109,6 +109,7 @@ ] jitter = ["rand"] no_std = ["no-std-compat/compat_hash"] +quanta = ["dep:quanta"] std = [ "no-std-compat/std", "nonzero_ext/std", diff -Nru temporalio-1.3.0/vendor/governor/CHANGELOG.md temporalio-1.3.0/vendor/governor/CHANGELOG.md --- temporalio-1.3.0/vendor/governor/CHANGELOG.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/governor/CHANGELOG.md 2023-10-30 19:40:00.000000000 +0000 @@ -4,6 +4,31 @@ ## [Unreleased] - ReleaseDate +## [[0.6.0](https://docs.rs/governor/0.6.0/governor/)] - 2023-07-12 + +### Added +* Type aliases `DefaultDirectRateLimiter` and + `DefaultKeyedRateLimiter` to cut down on type-typing of typical rate + limiters in struct and function definitions. Requested in + [#85](https://github.com/antifuchs/governor/issues/85). + +### Changed +* The API for `.check_n` and `.until_n` (and their keyed counterpart) + have changed to return a nested `Result` - the outer indicating + whether the check could ever succeed and the inner one indicating + the rate limiting result, if it could succeed. +* Updated the [quanta dependency to + 0.11.1](https://github.com/metrics-rs/quanta/blob/main/CHANGELOG.md#0110---2023-03-24). + This change also adds a reference u64 instant to all instances of + the `QuantaUpkeepClock` structure. All lower-resolution quanta + timekeeping used by governor will now be relative to that reference + instant. +* Some parts of the documentation for burst sizes has been rephrased + to be less confusing. + +### Contributors +* [@brprkr](https://github.com/brprkr) + ## [[0.5.1](https://docs.rs/governor/0.5.1/governor/)] - 2022-11-29 ### Changed diff -Nru temporalio-1.3.0/vendor/governor/src/clock/quanta.rs temporalio-1.3.0/vendor/governor/src/clock/quanta.rs --- temporalio-1.3.0/vendor/governor/src/clock/quanta.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/governor/src/clock/quanta.rs 2023-10-30 19:40:00.000000000 +0000 @@ -12,12 +12,15 @@ /// clock that uses a quanta background upkeep thread (which allows retrieving the time with an /// atomic read, but requires a background thread that wakes up continually), /// see [`QuantaUpkeepClock`]. -#[derive(Debug, Clone, Default)] -pub struct QuantaClock(quanta::Clock); +#[derive(Debug, Clone)] +pub struct QuantaClock { + clock: quanta::Clock, +} -impl From for Nanos { - fn from(instant: quanta::Instant) -> Self { - instant.as_u64().into() +impl Default for QuantaClock { + fn default() -> Self { + let clock = quanta::Clock::default(); + Self { clock } } } @@ -25,7 +28,8 @@ type Instant = QuantaInstant; fn now(&self) -> Self::Instant { - QuantaInstant(Nanos::from(self.0.now())) + let nowish = self.clock.raw(); + QuantaInstant(Nanos::new(self.clock.delta_as_nanos(0, nowish))) } } @@ -65,7 +69,11 @@ /// and the upkeep interval that you pick; you should measure and compare performance before /// picking one or the other. #[derive(Debug, Clone)] -pub struct QuantaUpkeepClock(quanta::Clock, Arc); +pub struct QuantaUpkeepClock { + clock: quanta::Clock, + _handle: Arc, + reference: quanta::Instant, +} impl QuantaUpkeepClock { /// Returns a new `QuantaUpkeepClock` with an upkeep thread that wakes up once in `interval`. @@ -76,11 +84,14 @@ /// Returns a new `QuantaUpkeepClock` with an upkeep thread as specified by the given builder. pub fn from_builder(builder: quanta::Upkeep) -> Result { - let handle = builder.start()?; - Ok(QuantaUpkeepClock( - quanta::Clock::default(), - Arc::new(handle), - )) + let handle = Arc::new(builder.start()?); + let clock = quanta::Clock::default(); + let reference = clock.recent(); + Ok(QuantaUpkeepClock { + clock, + _handle: handle, + reference, + }) } } @@ -88,7 +99,10 @@ type Instant = QuantaInstant; fn now(&self) -> Self::Instant { - QuantaInstant(Nanos::from(self.0.recent())) + QuantaInstant(Nanos::from( + self.reference + .saturating_duration_since(self.clock.recent()), + )) } } diff -Nru temporalio-1.3.0/vendor/governor/src/errors.rs temporalio-1.3.0/vendor/governor/src/errors.rs --- temporalio-1.3.0/vendor/governor/src/errors.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/governor/src/errors.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,28 +1,37 @@ -/// Gives additional information about the negative outcome of a batch -/// cell decision. -/// -/// Since batch queries can be made for batch sizes bigger than the -/// rate limiter parameter could accomodate, there are now two -/// possible negative outcomes: -/// -/// * `BatchNonConforming` - the query is valid but the Decider can -/// not accomodate them. +use std::fmt; + +/// Error indicating that the number of cells tested (the first +/// argument) is larger than the bucket's capacity. /// -/// * `InsufficientCapacity` - the query was invalid as the rate -/// limite parameters can never accomodate the number of cells -/// queried for. -#[derive(Debug, PartialEq, Eq)] -pub enum NegativeMultiDecision { - /// A batch of cells (the first argument) is non-conforming and - /// can not be let through at this time. The second argument gives - /// information about when that batch of cells might be let - /// through again (not accounting for thundering herds and other, - /// simultaneous decisions). - BatchNonConforming(u32, E), +/// This means the decision can never have a conforming result. The +/// argument gives the maximum number of cells that could ever have a +/// conforming result. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub struct InsufficientCapacity(pub u32); + +impl fmt::Display for InsufficientCapacity { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!( + f, + "required number of cells {} exceeds bucket's capacity", + self.0 + ) + } +} + +#[cfg(feature = "std")] +impl std::error::Error for InsufficientCapacity {} + +#[cfg(all(feature = "std", test))] +mod test { + use super::*; - /// The number of cells tested (the first argument) is larger than - /// the bucket's capacity, which means the decision can never have - /// a conforming result. The argument gives the maximum number of - /// cells that could ever have a conforming result. - InsufficientCapacity(u32), + #[test] + fn coverage() { + let display_output = format!("{}", InsufficientCapacity(3)); + assert!(display_output.contains("3")); + let debug_output = format!("{:?}", InsufficientCapacity(3)); + assert!(debug_output.contains("3")); + assert_eq!(InsufficientCapacity(3), InsufficientCapacity(3)); + } } diff -Nru temporalio-1.3.0/vendor/governor/src/gcra.rs temporalio-1.3.0/vendor/governor/src/gcra.rs --- temporalio-1.3.0/vendor/governor/src/gcra.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/governor/src/gcra.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,5 +1,6 @@ use crate::state::StateStore; -use crate::{clock, middleware::StateSnapshot, NegativeMultiDecision, Quota}; +use crate::InsufficientCapacity; +use crate::{clock, middleware::StateSnapshot, Quota}; use crate::{middleware::RateLimitingMiddleware, nanos::Nanos}; use std::num::NonZeroU32; use std::time::Duration; @@ -142,7 +143,7 @@ n: NonZeroU32, state: &S, t0: P, - ) -> Result> { + ) -> Result, InsufficientCapacity> { let t0 = t0.duration_since(start); let tau = self.tau; let t = self.t; @@ -151,21 +152,16 @@ // check that we can allow enough cells through. Note that `additional_weight` is the // value of the cells *in addition* to the first cell - so add that first cell back. if additional_weight + t > tau { - return Err(NegativeMultiDecision::InsufficientCapacity( - (tau.as_u64() / t.as_u64()) as u32, - )); + return Err(InsufficientCapacity((tau.as_u64() / t.as_u64()) as u32)); } - state.measure_and_replace(key, |tat| { + Ok(state.measure_and_replace(key, |tat| { let tat = tat.unwrap_or_else(|| self.starting_state(t0)); let earliest_time = (tat + additional_weight).saturating_sub(tau); if t0 < earliest_time { - Err(NegativeMultiDecision::BatchNonConforming( - n.get(), - MW::disallow( - key, - StateSnapshot::new(self.t, self.tau, earliest_time, earliest_time), - start, - ), + Err(MW::disallow( + key, + StateSnapshot::new(self.t, self.tau, earliest_time, earliest_time), + start, )) } else { let next = cmp::max(tat, t0) + t + additional_weight; @@ -174,7 +170,7 @@ next, )) } - }) + })) } } diff -Nru temporalio-1.3.0/vendor/governor/src/_guide.rs temporalio-1.3.0/vendor/governor/src/_guide.rs --- temporalio-1.3.0/vendor/governor/src/_guide.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/governor/src/_guide.rs 2023-10-30 19:40:00.000000000 +0000 @@ -85,6 +85,28 @@ //! [KeyedStateStore][crate::state::keyed::KeyedStateStore] trait, and optionally the //! [ShrinkableKeyedStateStore][crate::state::keyed::ShrinkableKeyedStateStore] trait. //! +//! # Type signatures for rate limiters +//! +//! Rate limiters tend to be long-lived, and need to be stored +//! somewhere - sometimes in struct fields, or even just to pass in +//! function arguments. The [`crate::RateLimiter`] type signatures +//! tend to be pretty unwieldy for that, so this crate exports a pair +//! of handy type aliases, [`crate::DefaultDirectRateLimiter`] and +//! [`crate::DefaultDirectRateLimiter`]. +//! +//! Here's an example for embedding a direct rate limiter in a struct: +//! +//! ```rust +//! # use governor::DefaultDirectRateLimiter; +//! struct MyApiClient { +//! limiter: DefaultDirectRateLimiter, +//! } +//! ``` +//! +//! If you need to provide a different clock, or a different +//! implementation of the keyed state, you will still have to fall +//! back to the regular type. +//! //! # Data ownership and references to rate limiters //! //! `governor`'s rate limiter state is not hidden behind an [interior diff -Nru temporalio-1.3.0/vendor/governor/src/lib.rs temporalio-1.3.0/vendor/governor/src/lib.rs --- temporalio-1.3.0/vendor/governor/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/governor/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -68,3 +68,18 @@ #[cfg(feature = "std")] pub use crate::state::direct::StreamRateLimitExt; } + +/// A rate limiter representing a single item of state in memory, running on the default clock. +/// +/// See the [`RateLimiter`] documentation for details. +pub type DefaultDirectRateLimiter< + MW = middleware::NoOpMiddleware<::Instant>, +> = RateLimiter; + +/// A rate limiter with one state per key, running on the default clock. +/// +/// See the [`RateLimiter`] documentation for details. +pub type DefaultKeyedRateLimiter< + K, + MW = middleware::NoOpMiddleware<::Instant>, +> = RateLimiter, clock::DefaultClock, MW>; diff -Nru temporalio-1.3.0/vendor/governor/src/quota.rs temporalio-1.3.0/vendor/governor/src/quota.rs --- temporalio-1.3.0/vendor/governor/src/quota.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/governor/src/quota.rs 2023-10-30 19:40:00.000000000 +0000 @@ -17,8 +17,9 @@ /// # Burst sizes /// There are multiple ways of expressing the same quota: a quota given as `Quota::per_second(1)` /// allows, on average, the same number of cells through as a quota given as `Quota::per_minute(60)`. -/// However, the quota of `Quota::per_minute(60)` has a burst size of 60 cells, meaning it is possible -/// to accommodate 60 cells in one go, followed by a minute of waiting. +/// However, the quota of `Quota::per_minute(60)` has a burst size of 60 cells, meaning it is +/// possible to accomodate 60 cells in one go, after which the equivalent of a minute of inactivity +/// is required for the burst allowance to be fully restored. /// /// Burst size gets really important when you construct a rate limiter that should allow multiple /// elements through at one time (using [`RateLimiter.check_n`](struct.RateLimiter.html#method.check_n) diff -Nru temporalio-1.3.0/vendor/governor/src/state/direct/future.rs temporalio-1.3.0/vendor/governor/src/state/direct/future.rs --- temporalio-1.3.0/vendor/governor/src/state/direct/future.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/governor/src/state/direct/future.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,31 +1,15 @@ -use std::{error::Error, fmt, num::NonZeroU32}; +use std::num::NonZeroU32; use super::RateLimiter; use crate::{ clock, + errors::InsufficientCapacity, middleware::RateLimitingMiddleware, state::{DirectStateStore, NotKeyed}, - Jitter, NegativeMultiDecision, NotUntil, + Jitter, NotUntil, }; use futures_timer::Delay; -/// An error that occurs when the number of cells required in `check_n` -/// exceeds the maximum capacity of the limiter. -#[derive(Debug, Clone)] -pub struct InsufficientCapacity(pub u32); - -impl fmt::Display for InsufficientCapacity { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!( - f, - "required number of cell {} exceeds bucket's capacity", - self.0 - ) - } -} - -impl Error for InsufficientCapacity {} - #[cfg(feature = "std")] /// # Direct rate limiters - `async`/`await` impl RateLimiter @@ -100,17 +84,14 @@ jitter: Jitter, ) -> Result { loop { - match self.check_n(n) { + match self.check_n(n)? { Ok(x) => { return Ok(x); } - Err(NegativeMultiDecision::BatchNonConforming(_, negative)) => { + Err(negative) => { let delay = Delay::new(jitter + negative.wait_time_from(self.clock.now())); delay.await; } - Err(NegativeMultiDecision::InsufficientCapacity(cap)) => { - return Err(InsufficientCapacity(cap)) - } } } } diff -Nru temporalio-1.3.0/vendor/governor/src/state/direct.rs temporalio-1.3.0/vendor/governor/src/state/direct.rs --- temporalio-1.3.0/vendor/governor/src/state/direct.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/governor/src/state/direct.rs 2023-10-30 19:40:00.000000000 +0000 @@ -9,9 +9,10 @@ use crate::{ clock, + errors::InsufficientCapacity, middleware::{NoOpMiddleware, RateLimitingMiddleware}, state::InMemoryState, - NegativeMultiDecision, Quota, + Quota, }; /// The "this state store does not use keys" key type. @@ -97,7 +98,7 @@ pub fn check_n( &self, n: NonZeroU32, - ) -> Result> { + ) -> Result, InsufficientCapacity> { self.gcra .test_n_all_and_update::( self.start, diff -Nru temporalio-1.3.0/vendor/governor/src/state/keyed.rs temporalio-1.3.0/vendor/governor/src/state/keyed.rs --- temporalio-1.3.0/vendor/governor/src/state/keyed.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/governor/src/state/keyed.rs 2023-10-30 19:40:00.000000000 +0000 @@ -14,9 +14,10 @@ use crate::state::StateStore; use crate::{ clock::{self, Reference}, + errors::InsufficientCapacity, middleware::RateLimitingMiddleware, nanos::Nanos, - NegativeMultiDecision, Quota, RateLimiter, + Quota, RateLimiter, }; /// A trait for state stores with one rate limiting state per key. @@ -101,12 +102,12 @@ /// Allow *only all* `n` cells through the rate limiter for the given key. /// /// This method can succeed in only one way and fail in two ways: - /// * Success: If all `n` cells can be accommodated, it returns `Ok(())`. + /// * Success: If all `n` cells can be accommodated, it returns `Ok(Ok(()))`. /// * Failure (but ok): Not all cells can make it through at the current time. - /// The result is `Err(NegativeMultiDecision::BatchNonConforming(NotUntil))`, which can + /// The result is `Ok(Err(NotUntil))`, which can /// be interrogated about when the batch might next conform. /// * Failure (the batch can never go through): The rate limit is too low for the given number - /// of cells. + /// of cells. The result is `Err(InsufficientCapacity)` /// /// ### Performance /// This method diverges a little from the GCRA algorithm, using @@ -116,7 +117,7 @@ &self, key: &K, n: NonZeroU32, - ) -> Result> { + ) -> Result, InsufficientCapacity> { self.gcra.test_n_all_and_update::( self.start, key, diff -Nru temporalio-1.3.0/vendor/governor/tests/direct.rs temporalio-1.3.0/vendor/governor/tests/direct.rs --- temporalio-1.3.0/vendor/governor/tests/direct.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/governor/tests/direct.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,6 +1,6 @@ use governor::{ clock::{Clock, FakeRelativeClock}, - NegativeMultiDecision, Quota, RateLimiter, + DefaultDirectRateLimiter, InsufficientCapacity, Quota, RateLimiter, }; use nonzero_ext::nonzero; use std::time::Duration; @@ -44,21 +44,21 @@ let one = nonzero!(1u32); // use up our burst capacity (2 in the first second): - assert_eq!(Ok(()), lb.check_n(one), "Now: {:?}", clock.now()); + assert_eq!(Ok(Ok(())), lb.check_n(one), "Now: {:?}", clock.now()); clock.advance(ms); - assert_eq!(Ok(()), lb.check_n(one), "Now: {:?}", clock.now()); + assert_eq!(Ok(Ok(())), lb.check_n(one), "Now: {:?}", clock.now()); clock.advance(ms); - assert_ne!(Ok(()), lb.check_n(one), "Now: {:?}", clock.now()); + assert_ne!(Ok(Ok(())), lb.check_n(one), "Now: {:?}", clock.now()); // should be ok again in 1s: clock.advance(ms * 1000); - assert_eq!(Ok(()), lb.check_n(one), "Now: {:?}", clock.now()); + assert_eq!(Ok(Ok(())), lb.check_n(one), "Now: {:?}", clock.now()); clock.advance(ms); - assert_eq!(Ok(()), lb.check_n(one)); + assert_eq!(Ok(Ok(())), lb.check_n(one)); clock.advance(ms); - assert_ne!(Ok(()), lb.check_n(one), "{:?}", lb); + assert_ne!(Ok(Ok(())), lb.check_n(one), "{:?}", lb); } #[test] @@ -68,20 +68,20 @@ let ms = Duration::from_millis(1); // Use up the burst capacity: - assert_eq!(Ok(()), lb.check_n(nonzero!(2u32)), "Now: {:?}", clock.now()); - assert_eq!(Ok(()), lb.check_n(nonzero!(2u32)), "Now: {:?}", clock.now()); + assert_eq!(Ok(Ok(())), lb.check_n(nonzero!(2u32))); + assert_eq!(Ok(Ok(())), lb.check_n(nonzero!(2u32))); clock.advance(ms); - assert_ne!(Ok(()), lb.check_n(nonzero!(2u32)), "Now: {:?}", clock.now()); + assert_ne!(Ok(Ok(())), lb.check_n(nonzero!(2u32))); // should be ok again in 1s: clock.advance(ms * 1000); - assert_eq!(Ok(()), lb.check_n(nonzero!(2u32)), "Now: {:?}", clock.now()); + assert_eq!(Ok(Ok(())), lb.check_n(nonzero!(2u32))); clock.advance(ms); - assert_eq!(Ok(()), lb.check_n(nonzero!(2u32))); + assert_eq!(Ok(Ok(())), lb.check_n(nonzero!(2u32))); clock.advance(ms); - assert_ne!(Ok(()), lb.check_n(nonzero!(2u32)), "{:?}", lb); + assert_ne!(Ok(Ok(())), lb.check_n(nonzero!(2u32)), "{:?}", lb); } #[test] @@ -91,11 +91,11 @@ let ms = Duration::from_millis(1); // Should not allow the first 15 cells on a capacity 5 bucket: - assert_ne!(Ok(()), lb.check_n(nonzero!(15u32))); + assert_ne!(Ok(Ok(())), lb.check_n(nonzero!(15u32))); // After 3 and 20 seconds, it should not allow 15 on that bucket either: clock.advance(ms * 3 * 1000); - assert_ne!(Ok(()), lb.check_n(nonzero!(15u32))); + assert_ne!(Ok(Ok(())), lb.check_n(nonzero!(15u32))); } #[test] @@ -103,18 +103,9 @@ let clock = FakeRelativeClock::default(); let lb = RateLimiter::direct_with_clock(Quota::per_second(nonzero!(5u32)), &clock); - assert_eq!( - Err(NegativeMultiDecision::InsufficientCapacity(5)), - lb.check_n(nonzero!(15u32)) - ); - assert_eq!( - Err(NegativeMultiDecision::InsufficientCapacity(5)), - lb.check_n(nonzero!(6u32)) - ); - assert_eq!( - Err(NegativeMultiDecision::InsufficientCapacity(5)), - lb.check_n(nonzero!(7u32)) - ); + assert_eq!(Err(InsufficientCapacity(5)), lb.check_n(nonzero!(15u32))); + assert_eq!(Err(InsufficientCapacity(5)), lb.check_n(nonzero!(6u32))); + assert_eq!(Err(InsufficientCapacity(5)), lb.check_n(nonzero!(7u32))); } #[test] @@ -163,3 +154,11 @@ clock.advance(ms * 998); assert_eq!(Ok(()), lim.check()); } + +#[test] +fn default_direct() { + let clock = governor::clock::DefaultClock::default(); + let limiter: DefaultDirectRateLimiter = + RateLimiter::direct_with_clock(Quota::per_second(nonzero!(20u32)), &clock); + assert_eq!(Ok(()), limiter.check()); +} diff -Nru temporalio-1.3.0/vendor/governor/tests/keyed_dashmap.rs temporalio-1.3.0/vendor/governor/tests/keyed_dashmap.rs --- temporalio-1.3.0/vendor/governor/tests/keyed_dashmap.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/governor/tests/keyed_dashmap.rs 2023-10-30 19:40:00.000000000 +0000 @@ -155,7 +155,7 @@ assert_eq!( lim.check_key_n(&"long-lived".to_string(), nonzero!(10_u32)), - Ok(()) + Ok(Ok(())) ); assert_eq!(lim.check_key(&"short-lived".to_string()), Ok(())); diff -Nru temporalio-1.3.0/vendor/governor/tests/keyed_hashmap.rs temporalio-1.3.0/vendor/governor/tests/keyed_hashmap.rs --- temporalio-1.3.0/vendor/governor/tests/keyed_hashmap.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/governor/tests/keyed_hashmap.rs 2023-10-30 19:40:00.000000000 +0000 @@ -149,7 +149,7 @@ assert_eq!( lim.check_key_n(&"long-lived".to_string(), nonzero!(10_u32)), - Ok(()) + Ok(Ok(())) ); assert_eq!(lim.check_key(&"short-lived".to_string()), Ok(())); diff -Nru temporalio-1.3.0/vendor/governor/tests/keyed.rs temporalio-1.3.0/vendor/governor/tests/keyed.rs --- temporalio-1.3.0/vendor/governor/tests/keyed.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/governor/tests/keyed.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,9 @@ +use governor::{DefaultKeyedRateLimiter, Quota, RateLimiter}; +use nonzero_ext::nonzero; + +#[test] +fn default_keyed() { + let limiter: DefaultKeyedRateLimiter = + RateLimiter::keyed(Quota::per_second(nonzero!(20u32))); + assert_eq!(Ok(()), limiter.check_key(&1)); +} diff -Nru temporalio-1.3.0/vendor/hashbrown/.cargo-checksum.json temporalio-1.3.0/vendor/hashbrown/.cargo-checksum.json --- temporalio-1.3.0/vendor/hashbrown/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/hashbrown/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"CHANGELOG.md":"9cff035ecd949ca041cae2ab20be5c642360b369a499286ea830d4a48bf3b284","Cargo.toml":"a23bc72f1aed8ac540796975437fb8e158e7b4a186c1d646711717f57c4473ce","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"ff8f68cb076caf8cefe7a6430d4ac086ce6af2ca8ce2c4e5a2004d4552ef52a2","README.md":"84c222ce49510535419d338b7532a72a2bf22b7466e44de78d92d25b6c7d636b","benches/bench.rs":"ef7bc025922f077d307c565640c005d056e3d6c1713448a95aae92d3c22c1005","benches/insert_unique_unchecked.rs":"cb84275f22d5f95a5ac995ac6b2df74ffcf342765b401d27c95f2955c7b7cb9f","clippy.toml":"7535949f908c6d9aea4f9a9f3a7625552c93fc29e963d059d40f4def9d77ea7b","src/external_trait_impls/mod.rs":"0625e6a5e3b8ecc8901a12aeeea54393fd84617fb3a14d98a34d2d2bddb8d257","src/external_trait_impls/rayon/helpers.rs":"ba105bf0853ebc45157f22116ad0f55d3bdab75e721d8e7a677c7b912d0c0c6d","src/external_trait_impls/rayon/map.rs":"96fdf39b3f601f77152d7ce84541b8f51f32b9274b7da9c294862892e721a5d8","src/external_trait_impls/rayon/mod.rs":"126edc882501dddd25e442d9236508b5b386eb8c0a9f5d654f2dd081086c1616","src/external_trait_impls/rayon/raw.rs":"04012fb2e99648819b4bc0044107ed3cb94013e242b7865075c5bd9ebf1b6865","src/external_trait_impls/rayon/set.rs":"7539348ff7bc6e3cce6b3c019d62dc401eea0138c578fef729c2593e8ead1cfa","src/external_trait_impls/rayon/table.rs":"8778d29509c68b5b7cb66859db025d3939ce22e7cf370b20ff3dea4fe4b29fd0","src/external_trait_impls/rkyv/hash_map.rs":"7abe24318143b776016052b05840656afc858b1ba5252f3d418d61972477f53d","src/external_trait_impls/rkyv/hash_set.rs":"38d969125d17d606492ec4ec9fc06b7e7118eb903240dacf40de21b9b06fa5c8","src/external_trait_impls/rkyv/mod.rs":"54399ce5574fd1d84b7b0cb4238fa3e898575e89a6724299be009d2172bda02e","src/external_trait_impls/serde.rs":"6dbe104dee16b453b6b048b541c6e02c6d067d970dfafd243fc4360288b0168c","src/lib.rs":"fbc05970d6458046590e9c4a33fc9a6fdc94ef725b9b00354fa609e207e6ae50","src/macros.rs":"98a26b908fc0fbe6a58d008a317e550013d615eb3cc17a5054a573c62c1d74cb","src/map.rs":"688f2ccecd38f32c66c7fc905703f363dd88511fc29c99bc260bb6973db66430","src/raw/alloc.rs":"902f8588d0fdee3e5c3dc02410f41d4b38ac88843727387f929f3186b3a2d322","src/raw/bitmask.rs":"3b3dce8d6a48856ada19085abf43908f124ab3419fcf434b9ca64d7bff243f67","src/raw/generic.rs":"efc5e603be3e9a17935aef1836a38ce01c78a0093b2af0671548eb5459b37921","src/raw/mod.rs":"73038e430bd54d56c484b6798e67dece4d67b3cf86031639a819629e8376d673","src/raw/neon.rs":"9907d8ebc36fc3df562dde478ea9b72213fda65288a304718d8647f0029dc9ad","src/raw/sse2.rs":"39038e3344e49f4638e211bcdbf56565ac53e90dce56172cc3b526fea911c2af","src/rustc_entry.rs":"8142ed89b50155602ef8c1628382bd62d3ee903920fe49d403d4100a278c6ba4","src/scopeguard.rs":"1a246e08a63c06cd8ad934bd7da229421bf804f991ae93cd7e242da27ca6c601","src/set.rs":"4069da81fc978f6d3b9605d8cf349c2b1b8c7766ab6bf3fec83b6442718fdce7","src/table.rs":"b64e4c4910b911175ae0eb72e744986ce695d3ecc0b52b70d916e3adefdd1908","tests/equivalent_trait.rs":"84faa3fe9d67c375d03fec81f0f1412c47862477d42e84e7d235258236338d5b","tests/hasher.rs":"9a8fdf67e4415618e16729969c386eefe71408cded5d46cf7b67d969276a3452","tests/raw.rs":"43ed2f98877533a0905611d9a30f26b183dd3e103e3856eeab80e7b8ac7894d3","tests/rayon.rs":"39cb24ab45fce8087bb54948715c8b6973ebfba1a325292b5b3cd9aab50b5fd2","tests/serde.rs":"6bac8054db722dd049901b37a6e006535bac30f425eb5cd91af19b5bc1dfe78e","tests/set.rs":"9f8011c29d1059aadb54b6dd4623521d5178b4278b4a56021ef2cee4bbb19fd9"},"package":"f93e7192158dbcda357bdec5fb5788eebf8bbac027f3f33e719d29135ae84156"} \ No newline at end of file +{"files":{"CHANGELOG.md":"f4769b4c6f44e09c379f55694f89a189620a78586a030a6c6c8d183265c31c52","Cargo.toml":"7a3568541b22e0e7dd0a8c2227699c84474673870f5e46dbb7db61ac2eac391f","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"ff8f68cb076caf8cefe7a6430d4ac086ce6af2ca8ce2c4e5a2004d4552ef52a2","README.md":"00e45d59f6f8537aa0f8e3dec17e24e9838b52f35aa9c1815c71ab1e8f63888e","benches/bench.rs":"ef7bc025922f077d307c565640c005d056e3d6c1713448a95aae92d3c22c1005","benches/insert_unique_unchecked.rs":"cb84275f22d5f95a5ac995ac6b2df74ffcf342765b401d27c95f2955c7b7cb9f","clippy.toml":"7535949f908c6d9aea4f9a9f3a7625552c93fc29e963d059d40f4def9d77ea7b","src/external_trait_impls/mod.rs":"0625e6a5e3b8ecc8901a12aeeea54393fd84617fb3a14d98a34d2d2bddb8d257","src/external_trait_impls/rayon/helpers.rs":"ba105bf0853ebc45157f22116ad0f55d3bdab75e721d8e7a677c7b912d0c0c6d","src/external_trait_impls/rayon/map.rs":"c0f50c8c6f2f70c70994a3243d92de3bbda5e78519c906c4f81f207ed63e5cc3","src/external_trait_impls/rayon/mod.rs":"156de9c1ad0123334ea3b7e5a17444faf1b8bf971aa88a1f23e2f2d1c3021141","src/external_trait_impls/rayon/raw.rs":"e62c5f3ca5fffea47357e64b6f8c34cec94af62d9bd28a2b87934da46c22b66e","src/external_trait_impls/rayon/set.rs":"c4c44d44e56c2f59e9e1355662e29d8744ac96645ca4414127a359fb46cb0fbf","src/external_trait_impls/rkyv/hash_map.rs":"7abe24318143b776016052b05840656afc858b1ba5252f3d418d61972477f53d","src/external_trait_impls/rkyv/hash_set.rs":"38d969125d17d606492ec4ec9fc06b7e7118eb903240dacf40de21b9b06fa5c8","src/external_trait_impls/rkyv/mod.rs":"54399ce5574fd1d84b7b0cb4238fa3e898575e89a6724299be009d2172bda02e","src/external_trait_impls/serde.rs":"0bc1a1f218d1ae7a5262557a5e3737b9334caf7d50c136dbdc75ff75680c223b","src/lib.rs":"662765875308544b71a46e20f18782e7a3246fddb11496206e296a24b78b56a5","src/macros.rs":"98a26b908fc0fbe6a58d008a317e550013d615eb3cc17a5054a573c62c1d74cb","src/map.rs":"4f4bdc2a2eb3c4395d655f5ce12d217b82f6edeef3579efcb6b18d08345f1d52","src/raw/alloc.rs":"902f8588d0fdee3e5c3dc02410f41d4b38ac88843727387f929f3186b3a2d322","src/raw/bitmask.rs":"3b3dce8d6a48856ada19085abf43908f124ab3419fcf434b9ca64d7bff243f67","src/raw/generic.rs":"efc5e603be3e9a17935aef1836a38ce01c78a0093b2af0671548eb5459b37921","src/raw/mod.rs":"cecbe517b36042094818887d41226bdafd78c6f67657540a8c1ea020cd5d302f","src/raw/neon.rs":"9907d8ebc36fc3df562dde478ea9b72213fda65288a304718d8647f0029dc9ad","src/raw/sse2.rs":"39038e3344e49f4638e211bcdbf56565ac53e90dce56172cc3b526fea911c2af","src/rustc_entry.rs":"19d3346843bc62c7c0165e8824d26355ab2666086f3088b1150a8b3f59376a76","src/scopeguard.rs":"1a246e08a63c06cd8ad934bd7da229421bf804f991ae93cd7e242da27ca6c601","src/set.rs":"349a1523656a8a3f364b5313d98a969444717461a7ab7133c8e5f215ac2c329d","tests/equivalent_trait.rs":"84faa3fe9d67c375d03fec81f0f1412c47862477d42e84e7d235258236338d5b","tests/hasher.rs":"9a8fdf67e4415618e16729969c386eefe71408cded5d46cf7b67d969276a3452","tests/raw.rs":"43ed2f98877533a0905611d9a30f26b183dd3e103e3856eeab80e7b8ac7894d3","tests/rayon.rs":"39cb24ab45fce8087bb54948715c8b6973ebfba1a325292b5b3cd9aab50b5fd2","tests/serde.rs":"6bac8054db722dd049901b37a6e006535bac30f425eb5cd91af19b5bc1dfe78e","tests/set.rs":"9f8011c29d1059aadb54b6dd4623521d5178b4278b4a56021ef2cee4bbb19fd9"},"package":"2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/hashbrown/Cargo.toml temporalio-1.3.0/vendor/hashbrown/Cargo.toml --- temporalio-1.3.0/vendor/hashbrown/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/hashbrown/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -11,9 +11,9 @@ [package] edition = "2021" -rust-version = "1.63.0" +rust-version = "1.64.0" name = "hashbrown" -version = "0.14.2" +version = "0.14.0" authors = ["Amanieu d'Antras "] exclude = [ ".github", @@ -41,7 +41,6 @@ "serde", "raw", ] -rustdoc-args = ["--generate-link-to-definition"] [dependencies.ahash] version = "0.8.0" @@ -68,11 +67,6 @@ optional = true package = "rustc-std-workspace-core" -[dependencies.equivalent] -version = "1.0" -optional = true -default-features = false - [dependencies.rayon] version = "1.0" optional = true diff -Nru temporalio-1.3.0/vendor/hashbrown/CHANGELOG.md temporalio-1.3.0/vendor/hashbrown/CHANGELOG.md --- temporalio-1.3.0/vendor/hashbrown/CHANGELOG.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/hashbrown/CHANGELOG.md 2023-10-30 19:40:00.000000000 +0000 @@ -7,34 +7,6 @@ ## [Unreleased] -## [v0.14.2] - 2023-10-19 - -### Added - -- `HashTable` type which provides a low-level but safe API with explicit hashing. (#466) - -### Fixed - -- Disabled the use of NEON instructions on big-endian ARM. (#475) -- Disabled the use of NEON instructions on Miri. (#476) - -## [v0.14.1] - 2023-09-28 - -### Added - -- Allow serializing `HashMap`s that use a custom allocator. (#449) - -### Changed - -- Use the `Equivalent` trait from the `equivalent` crate. (#442) -- Slightly improved performance of table resizing. (#451) -- Relaxed MSRV to 1.63.0. (#457) -- Removed `Clone` requirement from custom allocators. (#468) - -### Fixed - -- Fixed custom allocators being leaked in some situations. (#439, #465) - ## [v0.14.0] - 2023-06-01 ### Added @@ -50,7 +22,7 @@ ### Changed - Optimized insertion to only perform a single lookup. (#277) -- `DrainFilter` (`drain_filter`) has been renamed to `ExtractIf` and no longer drops remaining +- `DrainFilter` has been renamed to `ExtractIf` and no longer drops remaining elements when the iterator is dropped. #(374) - Bumped MSRV to 1.64.0. (#431) - `{Map,Set}::raw_table` now returns an immutable reference. (#404) @@ -461,9 +433,7 @@ - Initial release -[Unreleased]: https://github.com/rust-lang/hashbrown/compare/v0.14.2...HEAD -[v0.14.2]: https://github.com/rust-lang/hashbrown/compare/v0.14.1...v0.14.2 -[v0.14.1]: https://github.com/rust-lang/hashbrown/compare/v0.14.0...v0.14.1 +[Unreleased]: https://github.com/rust-lang/hashbrown/compare/v0.14.0...HEAD [v0.14.0]: https://github.com/rust-lang/hashbrown/compare/v0.13.2...v0.14.0 [v0.13.2]: https://github.com/rust-lang/hashbrown/compare/v0.13.1...v0.13.2 [v0.13.1]: https://github.com/rust-lang/hashbrown/compare/v0.12.3...v0.13.1 diff -Nru temporalio-1.3.0/vendor/hashbrown/README.md temporalio-1.3.0/vendor/hashbrown/README.md --- temporalio-1.3.0/vendor/hashbrown/README.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/hashbrown/README.md 2023-10-30 19:40:00.000000000 +0000 @@ -4,7 +4,7 @@ [![Build Status](https://github.com/rust-lang/hashbrown/actions/workflows/rust.yml/badge.svg)](https://github.com/rust-lang/hashbrown/actions) [![Crates.io](https://img.shields.io/crates/v/hashbrown.svg)](https://crates.io/crates/hashbrown) [![Documentation](https://docs.rs/hashbrown/badge.svg)](https://docs.rs/hashbrown) -[![Rust](https://img.shields.io/badge/rust-1.63.0%2B-blue.svg?maxAge=3600)](https://github.com/rust-lang/hashbrown) +[![Rust](https://img.shields.io/badge/rust-1.64.0%2B-blue.svg?maxAge=3600)](https://github.com/rust-lang/hashbrown) This crate is a Rust port of Google's high-performance [SwissTable] hash map, adapted to make it a drop-in replacement for Rust's standard `HashMap` diff -Nru temporalio-1.3.0/vendor/hashbrown/src/external_trait_impls/rayon/map.rs temporalio-1.3.0/vendor/hashbrown/src/external_trait_impls/rayon/map.rs --- temporalio-1.3.0/vendor/hashbrown/src/external_trait_impls/rayon/map.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/hashbrown/src/external_trait_impls/rayon/map.rs 2023-10-30 19:40:00.000000000 +0000 @@ -232,11 +232,11 @@ /// [`into_par_iter`]: /hashbrown/struct.HashMap.html#method.into_par_iter /// [`HashMap`]: /hashbrown/struct.HashMap.html /// [`IntoParallelIterator`]: https://docs.rs/rayon/1.0/rayon/iter/trait.IntoParallelIterator.html -pub struct IntoParIter { +pub struct IntoParIter { inner: RawIntoParIter<(K, V), A>, } -impl ParallelIterator for IntoParIter { +impl ParallelIterator for IntoParIter { type Item = (K, V); #[cfg_attr(feature = "inline-more", inline)] @@ -248,7 +248,9 @@ } } -impl fmt::Debug for IntoParIter { +impl fmt::Debug + for IntoParIter +{ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { ParIter { inner: unsafe { self.inner.par_iter() }, @@ -265,11 +267,11 @@ /// /// [`par_drain`]: /hashbrown/struct.HashMap.html#method.par_drain /// [`HashMap`]: /hashbrown/struct.HashMap.html -pub struct ParDrain<'a, K, V, A: Allocator = Global> { +pub struct ParDrain<'a, K, V, A: Allocator + Clone = Global> { inner: RawParDrain<'a, (K, V), A>, } -impl ParallelIterator for ParDrain<'_, K, V, A> { +impl ParallelIterator for ParDrain<'_, K, V, A> { type Item = (K, V); #[cfg_attr(feature = "inline-more", inline)] @@ -281,7 +283,9 @@ } } -impl fmt::Debug for ParDrain<'_, K, V, A> { +impl fmt::Debug + for ParDrain<'_, K, V, A> +{ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { ParIter { inner: unsafe { self.inner.par_iter() }, @@ -291,7 +295,7 @@ } } -impl HashMap { +impl HashMap { /// Visits (potentially in parallel) immutably borrowed keys in an arbitrary order. #[cfg_attr(feature = "inline-more", inline)] pub fn par_keys(&self) -> ParKeys<'_, K, V> { @@ -311,7 +315,7 @@ } } -impl HashMap { +impl HashMap { /// Visits (potentially in parallel) mutably borrowed values in an arbitrary order. #[cfg_attr(feature = "inline-more", inline)] pub fn par_values_mut(&mut self) -> ParValuesMut<'_, K, V> { @@ -336,7 +340,7 @@ K: Eq + Hash + Sync, V: PartialEq + Sync, S: BuildHasher + Sync, - A: Allocator + Sync, + A: Allocator + Clone + Sync, { /// Returns `true` if the map is equal to another, /// i.e. both maps contain the same keys mapped to the same values. @@ -350,7 +354,9 @@ } } -impl IntoParallelIterator for HashMap { +impl IntoParallelIterator + for HashMap +{ type Item = (K, V); type Iter = IntoParIter; @@ -362,7 +368,9 @@ } } -impl<'a, K: Sync, V: Sync, S, A: Allocator> IntoParallelIterator for &'a HashMap { +impl<'a, K: Sync, V: Sync, S, A: Allocator + Clone> IntoParallelIterator + for &'a HashMap +{ type Item = (&'a K, &'a V); type Iter = ParIter<'a, K, V>; @@ -375,7 +383,9 @@ } } -impl<'a, K: Sync, V: Send, S, A: Allocator> IntoParallelIterator for &'a mut HashMap { +impl<'a, K: Sync, V: Send, S, A: Allocator + Clone> IntoParallelIterator + for &'a mut HashMap +{ type Item = (&'a K, &'a mut V); type Iter = ParIterMut<'a, K, V>; @@ -414,7 +424,7 @@ K: Eq + Hash + Send, V: Send, S: BuildHasher, - A: Allocator, + A: Allocator + Clone, { fn par_extend(&mut self, par_iter: I) where @@ -430,7 +440,7 @@ K: Copy + Eq + Hash + Sync, V: Copy + Sync, S: BuildHasher, - A: Allocator, + A: Allocator + Clone, { fn par_extend(&mut self, par_iter: I) where @@ -446,7 +456,7 @@ K: Eq + Hash, S: BuildHasher, I: IntoParallelIterator, - A: Allocator, + A: Allocator + Clone, HashMap: Extend, { let (list, len) = super::helpers::collect(par_iter); diff -Nru temporalio-1.3.0/vendor/hashbrown/src/external_trait_impls/rayon/mod.rs temporalio-1.3.0/vendor/hashbrown/src/external_trait_impls/rayon/mod.rs --- temporalio-1.3.0/vendor/hashbrown/src/external_trait_impls/rayon/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/hashbrown/src/external_trait_impls/rayon/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -2,4 +2,3 @@ pub(crate) mod map; pub(crate) mod raw; pub(crate) mod set; -pub(crate) mod table; diff -Nru temporalio-1.3.0/vendor/hashbrown/src/external_trait_impls/rayon/raw.rs temporalio-1.3.0/vendor/hashbrown/src/external_trait_impls/rayon/raw.rs --- temporalio-1.3.0/vendor/hashbrown/src/external_trait_impls/rayon/raw.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/hashbrown/src/external_trait_impls/rayon/raw.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,6 +1,7 @@ use crate::raw::Bucket; use crate::raw::{Allocator, Global, RawIter, RawIterRange, RawTable}; use crate::scopeguard::guard; +use alloc::alloc::dealloc; use core::marker::PhantomData; use core::mem; use core::ptr::NonNull; @@ -75,18 +76,18 @@ } /// Parallel iterator which consumes a table and returns elements. -pub struct RawIntoParIter { +pub struct RawIntoParIter { table: RawTable, } -impl RawIntoParIter { +impl RawIntoParIter { #[cfg_attr(feature = "inline-more", inline)] pub(super) unsafe fn par_iter(&self) -> RawParIter { self.table.par_iter() } } -impl ParallelIterator for RawIntoParIter { +impl ParallelIterator for RawIntoParIter { type Item = T; #[cfg_attr(feature = "inline-more", inline)] @@ -96,9 +97,9 @@ { let iter = unsafe { self.table.iter().iter }; let _guard = guard(self.table.into_allocation(), |alloc| { - if let Some((ptr, layout, ref alloc)) = *alloc { + if let Some((ptr, layout)) = *alloc { unsafe { - alloc.deallocate(ptr, layout); + dealloc(ptr.as_ptr(), layout); } } }); @@ -108,23 +109,23 @@ } /// Parallel iterator which consumes elements without freeing the table storage. -pub struct RawParDrain<'a, T, A: Allocator = Global> { +pub struct RawParDrain<'a, T, A: Allocator + Clone = Global> { // We don't use a &'a mut RawTable because we want RawParDrain to be // covariant over T. table: NonNull>, marker: PhantomData<&'a RawTable>, } -unsafe impl Send for RawParDrain<'_, T, A> {} +unsafe impl Send for RawParDrain<'_, T, A> {} -impl RawParDrain<'_, T, A> { +impl RawParDrain<'_, T, A> { #[cfg_attr(feature = "inline-more", inline)] pub(super) unsafe fn par_iter(&self) -> RawParIter { self.table.as_ref().par_iter() } } -impl ParallelIterator for RawParDrain<'_, T, A> { +impl ParallelIterator for RawParDrain<'_, T, A> { type Item = T; #[cfg_attr(feature = "inline-more", inline)] @@ -142,7 +143,7 @@ } } -impl Drop for RawParDrain<'_, T, A> { +impl Drop for RawParDrain<'_, T, A> { fn drop(&mut self) { // If drive_unindexed is not called then simply clear the table. unsafe { @@ -203,7 +204,7 @@ } } -impl RawTable { +impl RawTable { /// Returns a parallel iterator over the elements in a `RawTable`. #[cfg_attr(feature = "inline-more", inline)] pub unsafe fn par_iter(&self) -> RawParIter { diff -Nru temporalio-1.3.0/vendor/hashbrown/src/external_trait_impls/rayon/set.rs temporalio-1.3.0/vendor/hashbrown/src/external_trait_impls/rayon/set.rs --- temporalio-1.3.0/vendor/hashbrown/src/external_trait_impls/rayon/set.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/hashbrown/src/external_trait_impls/rayon/set.rs 2023-10-30 19:40:00.000000000 +0000 @@ -16,11 +16,11 @@ /// [`into_par_iter`]: /hashbrown/struct.HashSet.html#method.into_par_iter /// [`HashSet`]: /hashbrown/struct.HashSet.html /// [`IntoParallelIterator`]: https://docs.rs/rayon/1.0/rayon/iter/trait.IntoParallelIterator.html -pub struct IntoParIter { +pub struct IntoParIter { inner: map::IntoParIter, } -impl ParallelIterator for IntoParIter { +impl ParallelIterator for IntoParIter { type Item = T; fn drive_unindexed(self, consumer: C) -> C::Result @@ -38,11 +38,11 @@ /// /// [`par_drain`]: /hashbrown/struct.HashSet.html#method.par_drain /// [`HashSet`]: /hashbrown/struct.HashSet.html -pub struct ParDrain<'a, T, A: Allocator = Global> { +pub struct ParDrain<'a, T, A: Allocator + Clone = Global> { inner: map::ParDrain<'a, T, (), A>, } -impl ParallelIterator for ParDrain<'_, T, A> { +impl ParallelIterator for ParDrain<'_, T, A> { type Item = T; fn drive_unindexed(self, consumer: C) -> C::Result @@ -85,7 +85,7 @@ /// /// [`par_difference`]: /hashbrown/struct.HashSet.html#method.par_difference /// [`HashSet`]: /hashbrown/struct.HashSet.html -pub struct ParDifference<'a, T, S, A: Allocator = Global> { +pub struct ParDifference<'a, T, S, A: Allocator + Clone = Global> { a: &'a HashSet, b: &'a HashSet, } @@ -94,7 +94,7 @@ where T: Eq + Hash + Sync, S: BuildHasher + Sync, - A: Allocator + Sync, + A: Allocator + Clone + Sync, { type Item = &'a T; @@ -118,7 +118,7 @@ /// /// [`par_symmetric_difference`]: /hashbrown/struct.HashSet.html#method.par_symmetric_difference /// [`HashSet`]: /hashbrown/struct.HashSet.html -pub struct ParSymmetricDifference<'a, T, S, A: Allocator = Global> { +pub struct ParSymmetricDifference<'a, T, S, A: Allocator + Clone = Global> { a: &'a HashSet, b: &'a HashSet, } @@ -127,7 +127,7 @@ where T: Eq + Hash + Sync, S: BuildHasher + Sync, - A: Allocator + Sync, + A: Allocator + Clone + Sync, { type Item = &'a T; @@ -150,7 +150,7 @@ /// /// [`par_intersection`]: /hashbrown/struct.HashSet.html#method.par_intersection /// [`HashSet`]: /hashbrown/struct.HashSet.html -pub struct ParIntersection<'a, T, S, A: Allocator = Global> { +pub struct ParIntersection<'a, T, S, A: Allocator + Clone = Global> { a: &'a HashSet, b: &'a HashSet, } @@ -159,7 +159,7 @@ where T: Eq + Hash + Sync, S: BuildHasher + Sync, - A: Allocator + Sync, + A: Allocator + Clone + Sync, { type Item = &'a T; @@ -181,7 +181,7 @@ /// /// [`par_union`]: /hashbrown/struct.HashSet.html#method.par_union /// [`HashSet`]: /hashbrown/struct.HashSet.html -pub struct ParUnion<'a, T, S, A: Allocator = Global> { +pub struct ParUnion<'a, T, S, A: Allocator + Clone = Global> { a: &'a HashSet, b: &'a HashSet, } @@ -190,7 +190,7 @@ where T: Eq + Hash + Sync, S: BuildHasher + Sync, - A: Allocator + Sync, + A: Allocator + Clone + Sync, { type Item = &'a T; @@ -216,7 +216,7 @@ where T: Eq + Hash + Sync, S: BuildHasher + Sync, - A: Allocator + Sync, + A: Allocator + Clone + Sync, { /// Visits (potentially in parallel) the values representing the union, /// i.e. all the values in `self` or `other`, without duplicates. @@ -289,7 +289,7 @@ impl HashSet where T: Eq + Hash + Send, - A: Allocator + Send, + A: Allocator + Clone + Send, { /// Consumes (potentially in parallel) all values in an arbitrary order, /// while preserving the set's allocated memory for reuse. @@ -301,7 +301,7 @@ } } -impl IntoParallelIterator for HashSet { +impl IntoParallelIterator for HashSet { type Item = T; type Iter = IntoParIter; @@ -313,7 +313,7 @@ } } -impl<'a, T: Sync, S, A: Allocator> IntoParallelIterator for &'a HashSet { +impl<'a, T: Sync, S, A: Allocator + Clone> IntoParallelIterator for &'a HashSet { type Item = &'a T; type Iter = ParIter<'a, T>; @@ -374,7 +374,7 @@ where T: Eq + Hash, S: BuildHasher, - A: Allocator, + A: Allocator + Clone, I: IntoParallelIterator, HashSet: Extend, { diff -Nru temporalio-1.3.0/vendor/hashbrown/src/external_trait_impls/rayon/table.rs temporalio-1.3.0/vendor/hashbrown/src/external_trait_impls/rayon/table.rs --- temporalio-1.3.0/vendor/hashbrown/src/external_trait_impls/rayon/table.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/hashbrown/src/external_trait_impls/rayon/table.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,252 +0,0 @@ -//! Rayon extensions for `HashTable`. - -use super::raw::{RawIntoParIter, RawParDrain, RawParIter}; -use crate::hash_table::HashTable; -use crate::raw::{Allocator, Global}; -use core::fmt; -use core::marker::PhantomData; -use rayon::iter::plumbing::UnindexedConsumer; -use rayon::iter::{IntoParallelIterator, ParallelIterator}; - -/// Parallel iterator over shared references to entries in a map. -/// -/// This iterator is created by the [`par_iter`] method on [`HashTable`] -/// (provided by the [`IntoParallelRefIterator`] trait). -/// See its documentation for more. -/// -/// [`par_iter`]: /hashbrown/struct.HashTable.html#method.par_iter -/// [`HashTable`]: /hashbrown/struct.HashTable.html -/// [`IntoParallelRefIterator`]: https://docs.rs/rayon/1.0/rayon/iter/trait.IntoParallelRefIterator.html -pub struct ParIter<'a, T> { - inner: RawParIter, - marker: PhantomData<&'a T>, -} - -impl<'a, T: Sync> ParallelIterator for ParIter<'a, T> { - type Item = &'a T; - - #[cfg_attr(feature = "inline-more", inline)] - fn drive_unindexed(self, consumer: C) -> C::Result - where - C: UnindexedConsumer, - { - self.inner - .map(|x| unsafe { x.as_ref() }) - .drive_unindexed(consumer) - } -} - -impl Clone for ParIter<'_, T> { - #[cfg_attr(feature = "inline-more", inline)] - fn clone(&self) -> Self { - Self { - inner: self.inner.clone(), - marker: PhantomData, - } - } -} - -impl fmt::Debug for ParIter<'_, T> { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - let iter = unsafe { self.inner.iter() }.map(|x| unsafe { x.as_ref() }); - f.debug_list().entries(iter).finish() - } -} - -/// Parallel iterator over mutable references to entries in a map. -/// -/// This iterator is created by the [`par_iter_mut`] method on [`HashTable`] -/// (provided by the [`IntoParallelRefMutIterator`] trait). -/// See its documentation for more. -/// -/// [`par_iter_mut`]: /hashbrown/struct.HashTable.html#method.par_iter_mut -/// [`HashTable`]: /hashbrown/struct.HashTable.html -/// [`IntoParallelRefMutIterator`]: https://docs.rs/rayon/1.0/rayon/iter/trait.IntoParallelRefMutIterator.html -pub struct ParIterMut<'a, T> { - inner: RawParIter, - marker: PhantomData<&'a mut T>, -} - -impl<'a, T: Send> ParallelIterator for ParIterMut<'a, T> { - type Item = &'a mut T; - - #[cfg_attr(feature = "inline-more", inline)] - fn drive_unindexed(self, consumer: C) -> C::Result - where - C: UnindexedConsumer, - { - self.inner - .map(|x| unsafe { x.as_mut() }) - .drive_unindexed(consumer) - } -} - -impl fmt::Debug for ParIterMut<'_, T> { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - ParIter { - inner: self.inner.clone(), - marker: PhantomData, - } - .fmt(f) - } -} - -/// Parallel iterator over entries of a consumed map. -/// -/// This iterator is created by the [`into_par_iter`] method on [`HashTable`] -/// (provided by the [`IntoParallelIterator`] trait). -/// See its documentation for more. -/// -/// [`into_par_iter`]: /hashbrown/struct.HashTable.html#method.into_par_iter -/// [`HashTable`]: /hashbrown/struct.HashTable.html -/// [`IntoParallelIterator`]: https://docs.rs/rayon/1.0/rayon/iter/trait.IntoParallelIterator.html -pub struct IntoParIter { - inner: RawIntoParIter, -} - -impl ParallelIterator for IntoParIter { - type Item = T; - - #[cfg_attr(feature = "inline-more", inline)] - fn drive_unindexed(self, consumer: C) -> C::Result - where - C: UnindexedConsumer, - { - self.inner.drive_unindexed(consumer) - } -} - -impl fmt::Debug for IntoParIter { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - ParIter { - inner: unsafe { self.inner.par_iter() }, - marker: PhantomData, - } - .fmt(f) - } -} - -/// Parallel draining iterator over entries of a map. -/// -/// This iterator is created by the [`par_drain`] method on [`HashTable`]. -/// See its documentation for more. -/// -/// [`par_drain`]: /hashbrown/struct.HashTable.html#method.par_drain -/// [`HashTable`]: /hashbrown/struct.HashTable.html -pub struct ParDrain<'a, T, A: Allocator = Global> { - inner: RawParDrain<'a, T, A>, -} - -impl ParallelIterator for ParDrain<'_, T, A> { - type Item = T; - - #[cfg_attr(feature = "inline-more", inline)] - fn drive_unindexed(self, consumer: C) -> C::Result - where - C: UnindexedConsumer, - { - self.inner.drive_unindexed(consumer) - } -} - -impl fmt::Debug for ParDrain<'_, T, A> { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - ParIter { - inner: unsafe { self.inner.par_iter() }, - marker: PhantomData, - } - .fmt(f) - } -} - -impl HashTable { - /// Consumes (potentially in parallel) all values in an arbitrary order, - /// while preserving the map's allocated memory for reuse. - #[cfg_attr(feature = "inline-more", inline)] - pub fn par_drain(&mut self) -> ParDrain<'_, T, A> { - ParDrain { - inner: self.raw.par_drain(), - } - } -} - -impl IntoParallelIterator for HashTable { - type Item = T; - type Iter = IntoParIter; - - #[cfg_attr(feature = "inline-more", inline)] - fn into_par_iter(self) -> Self::Iter { - IntoParIter { - inner: self.raw.into_par_iter(), - } - } -} - -impl<'a, T: Sync, A: Allocator> IntoParallelIterator for &'a HashTable { - type Item = &'a T; - type Iter = ParIter<'a, T>; - - #[cfg_attr(feature = "inline-more", inline)] - fn into_par_iter(self) -> Self::Iter { - ParIter { - inner: unsafe { self.raw.par_iter() }, - marker: PhantomData, - } - } -} - -impl<'a, T: Send, A: Allocator> IntoParallelIterator for &'a mut HashTable { - type Item = &'a mut T; - type Iter = ParIterMut<'a, T>; - - #[cfg_attr(feature = "inline-more", inline)] - fn into_par_iter(self) -> Self::Iter { - ParIterMut { - inner: unsafe { self.raw.par_iter() }, - marker: PhantomData, - } - } -} - -#[cfg(test)] -mod test_par_table { - use alloc::vec::Vec; - use core::sync::atomic::{AtomicUsize, Ordering}; - - use rayon::prelude::*; - - use crate::{ - hash_map::{make_hash, DefaultHashBuilder}, - hash_table::HashTable, - }; - - #[test] - fn test_iterate() { - let hasher = DefaultHashBuilder::default(); - let mut a = HashTable::new(); - for i in 0..32 { - a.insert_unique(make_hash(&hasher, &i), i, |x| make_hash(&hasher, x)); - } - let observed = AtomicUsize::new(0); - a.par_iter().for_each(|k| { - observed.fetch_or(1 << *k, Ordering::Relaxed); - }); - assert_eq!(observed.into_inner(), 0xFFFF_FFFF); - } - - #[test] - fn test_move_iter() { - let hasher = DefaultHashBuilder::default(); - let hs = { - let mut hs = HashTable::new(); - - hs.insert_unique(make_hash(&hasher, &'a'), 'a', |x| make_hash(&hasher, x)); - hs.insert_unique(make_hash(&hasher, &'b'), 'b', |x| make_hash(&hasher, x)); - - hs - }; - - let v = hs.into_par_iter().collect::>(); - assert!(v == ['a', 'b'] || v == ['b', 'a']); - } -} diff -Nru temporalio-1.3.0/vendor/hashbrown/src/external_trait_impls/serde.rs temporalio-1.3.0/vendor/hashbrown/src/external_trait_impls/serde.rs --- temporalio-1.3.0/vendor/hashbrown/src/external_trait_impls/serde.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/hashbrown/src/external_trait_impls/serde.rs 2023-10-30 19:40:00.000000000 +0000 @@ -11,7 +11,6 @@ } mod map { - use crate::raw::Allocator; use core::fmt; use core::hash::{BuildHasher, Hash}; use core::marker::PhantomData; @@ -22,12 +21,11 @@ use super::size_hint; - impl Serialize for HashMap + impl Serialize for HashMap where K: Serialize + Eq + Hash, V: Serialize, H: BuildHasher, - A: Allocator, { #[cfg_attr(feature = "inline-more", inline)] fn serialize(&self, serializer: S) -> Result @@ -38,46 +36,40 @@ } } - impl<'de, K, V, S, A> Deserialize<'de> for HashMap + impl<'de, K, V, S> Deserialize<'de> for HashMap where K: Deserialize<'de> + Eq + Hash, V: Deserialize<'de>, S: BuildHasher + Default, - A: Allocator + Default, { fn deserialize(deserializer: D) -> Result where D: Deserializer<'de>, { - struct MapVisitor - where - A: Allocator, - { - marker: PhantomData>, + struct MapVisitor { + marker: PhantomData>, } - impl<'de, K, V, S, A> Visitor<'de> for MapVisitor + impl<'de, K, V, S> Visitor<'de> for MapVisitor where K: Deserialize<'de> + Eq + Hash, V: Deserialize<'de>, S: BuildHasher + Default, - A: Allocator + Default, { - type Value = HashMap; + type Value = HashMap; fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { formatter.write_str("a map") } #[cfg_attr(feature = "inline-more", inline)] - fn visit_map(self, mut map: M) -> Result + fn visit_map(self, mut map: A) -> Result where - M: MapAccess<'de>, + A: MapAccess<'de>, { - let mut values = HashMap::with_capacity_and_hasher_in( + let mut values = HashMap::with_capacity_and_hasher( size_hint::cautious(map.size_hint()), S::default(), - A::default(), ); while let Some((key, value)) = map.next_entry()? { @@ -97,7 +89,6 @@ } mod set { - use crate::raw::Allocator; use core::fmt; use core::hash::{BuildHasher, Hash}; use core::marker::PhantomData; @@ -108,11 +99,10 @@ use super::size_hint; - impl Serialize for HashSet + impl Serialize for HashSet where T: Serialize + Eq + Hash, H: BuildHasher, - A: Allocator, { #[cfg_attr(feature = "inline-more", inline)] fn serialize(&self, serializer: S) -> Result @@ -123,44 +113,38 @@ } } - impl<'de, T, S, A> Deserialize<'de> for HashSet + impl<'de, T, S> Deserialize<'de> for HashSet where T: Deserialize<'de> + Eq + Hash, S: BuildHasher + Default, - A: Allocator + Default, { fn deserialize(deserializer: D) -> Result where D: Deserializer<'de>, { - struct SeqVisitor - where - A: Allocator, - { - marker: PhantomData>, + struct SeqVisitor { + marker: PhantomData>, } - impl<'de, T, S, A> Visitor<'de> for SeqVisitor + impl<'de, T, S> Visitor<'de> for SeqVisitor where T: Deserialize<'de> + Eq + Hash, S: BuildHasher + Default, - A: Allocator + Default, { - type Value = HashSet; + type Value = HashSet; fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { formatter.write_str("a sequence") } #[cfg_attr(feature = "inline-more", inline)] - fn visit_seq(self, mut seq: M) -> Result + fn visit_seq(self, mut seq: A) -> Result where - M: SeqAccess<'de>, + A: SeqAccess<'de>, { - let mut values = HashSet::with_capacity_and_hasher_in( + let mut values = HashSet::with_capacity_and_hasher( size_hint::cautious(seq.size_hint()), S::default(), - A::default(), ); while let Some(value) = seq.next_element()? { @@ -182,15 +166,12 @@ where D: Deserializer<'de>, { - struct SeqInPlaceVisitor<'a, T, S, A>(&'a mut HashSet) - where - A: Allocator; + struct SeqInPlaceVisitor<'a, T, S>(&'a mut HashSet); - impl<'a, 'de, T, S, A> Visitor<'de> for SeqInPlaceVisitor<'a, T, S, A> + impl<'a, 'de, T, S> Visitor<'de> for SeqInPlaceVisitor<'a, T, S> where T: Deserialize<'de> + Eq + Hash, S: BuildHasher + Default, - A: Allocator, { type Value = (); @@ -199,9 +180,9 @@ } #[cfg_attr(feature = "inline-more", inline)] - fn visit_seq(self, mut seq: M) -> Result + fn visit_seq(self, mut seq: A) -> Result where - M: SeqAccess<'de>, + A: SeqAccess<'de>, { self.0.clear(); self.0.reserve(size_hint::cautious(seq.size_hint())); diff -Nru temporalio-1.3.0/vendor/hashbrown/src/lib.rs temporalio-1.3.0/vendor/hashbrown/src/lib.rs --- temporalio-1.3.0/vendor/hashbrown/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/hashbrown/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -81,7 +81,6 @@ mod rustc_entry; mod scopeguard; mod set; -mod table; pub mod hash_map { //! A hash map implemented with quadratic probing and SIMD lookup. @@ -114,30 +113,10 @@ pub use crate::external_trait_impls::rayon::set::*; } } -pub mod hash_table { - //! A hash table implemented with quadratic probing and SIMD lookup. - pub use crate::table::*; - - #[cfg(feature = "rayon")] - /// [rayon]-based parallel iterator types for hash tables. - /// You will rarely need to interact with it directly unless you have need - /// to name one of the iterator types. - /// - /// [rayon]: https://docs.rs/rayon/1.0/rayon - pub mod rayon { - pub use crate::external_trait_impls::rayon::table::*; - } -} pub use crate::map::HashMap; pub use crate::set::HashSet; -pub use crate::table::HashTable; - -#[cfg(feature = "equivalent")] -pub use equivalent::Equivalent; -// This is only used as a fallback when building as part of `std`. -#[cfg(not(feature = "equivalent"))] /// Key equivalence trait. /// /// This trait defines the function used to compare the input value with the @@ -161,7 +140,6 @@ fn equivalent(&self, key: &K) -> bool; } -#[cfg(not(feature = "equivalent"))] impl Equivalent for Q where Q: Eq, diff -Nru temporalio-1.3.0/vendor/hashbrown/src/map.rs temporalio-1.3.0/vendor/hashbrown/src/map.rs --- temporalio-1.3.0/vendor/hashbrown/src/map.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/hashbrown/src/map.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,6 +1,4 @@ -use crate::raw::{ - Allocator, Bucket, Global, RawDrain, RawExtractIf, RawIntoIter, RawIter, RawTable, -}; +use crate::raw::{Allocator, Bucket, Global, RawDrain, RawIntoIter, RawIter, RawTable}; use crate::{Equivalent, TryReserveError}; use core::borrow::Borrow; use core::fmt::{self, Debug}; @@ -187,7 +185,7 @@ /// .iter().cloned().collect(); /// // use the values stored in map /// ``` -pub struct HashMap { +pub struct HashMap { pub(crate) hash_builder: S, pub(crate) table: RawTable<(K, V), A>, } @@ -326,7 +324,7 @@ } #[cfg(feature = "ahash")] -impl HashMap { +impl HashMap { /// Creates an empty `HashMap` using the given allocator. /// /// The hash map is initially created with a capacity of 0, so it will not allocate until it @@ -507,7 +505,7 @@ } } -impl HashMap { +impl HashMap { /// Returns a reference to the underlying allocator. #[inline] pub fn allocator(&self) -> &A { @@ -946,8 +944,6 @@ /// /// Keeps the allocated memory for reuse. /// - /// [`retain()`]: HashMap::retain - /// /// # Examples /// /// ``` @@ -981,7 +977,7 @@ { ExtractIf { f, - inner: RawExtractIf { + inner: ExtractIfInner { iter: unsafe { self.table.iter() }, table: &mut self.table, }, @@ -1073,7 +1069,7 @@ where K: Eq + Hash, S: BuildHasher, - A: Allocator, + A: Allocator + Clone, { /// Reserves capacity for at least `additional` more elements to be inserted /// in the `HashMap`. The collection may reserve more space to avoid @@ -1940,7 +1936,7 @@ } } -impl HashMap { +impl HashMap { /// Creates a raw entry builder for the HashMap. /// /// Raw entries provide the lowest level of control for searching and @@ -2171,7 +2167,7 @@ K: Eq + Hash, V: PartialEq, S: BuildHasher, - A: Allocator, + A: Allocator + Clone, { fn eq(&self, other: &Self) -> bool { if self.len() != other.len() { @@ -2188,7 +2184,7 @@ K: Eq + Hash, V: Eq, S: BuildHasher, - A: Allocator, + A: Allocator + Clone, { } @@ -2196,7 +2192,7 @@ where K: Debug, V: Debug, - A: Allocator, + A: Allocator + Clone, { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_map().entries(self.iter()).finish() @@ -2206,7 +2202,7 @@ impl Default for HashMap where S: Default, - A: Default + Allocator, + A: Default + Allocator + Clone, { /// Creates an empty `HashMap`, with the `Default` value for the hasher and allocator. /// @@ -2234,7 +2230,7 @@ K: Eq + Hash, Q: Hash + Equivalent, S: BuildHasher, - A: Allocator, + A: Allocator + Clone, { type Output = V; @@ -2265,7 +2261,7 @@ impl From<[(K, V); N]> for HashMap where K: Eq + Hash, - A: Default + Allocator, + A: Default + Allocator + Clone, { /// # Examples /// @@ -2410,11 +2406,11 @@ /// assert_eq!(iter.next(), None); /// assert_eq!(iter.next(), None); /// ``` -pub struct IntoIter { +pub struct IntoIter { inner: RawIntoIter<(K, V), A>, } -impl IntoIter { +impl IntoIter { /// Returns a iterator of references over the remaining items. #[cfg_attr(feature = "inline-more", inline)] pub(super) fn iter(&self) -> Iter<'_, K, V> { @@ -2454,11 +2450,11 @@ /// assert_eq!(keys.next(), None); /// assert_eq!(keys.next(), None); /// ``` -pub struct IntoKeys { +pub struct IntoKeys { inner: IntoIter, } -impl Iterator for IntoKeys { +impl Iterator for IntoKeys { type Item = K; #[inline] @@ -2471,16 +2467,16 @@ } } -impl ExactSizeIterator for IntoKeys { +impl ExactSizeIterator for IntoKeys { #[inline] fn len(&self) -> usize { self.inner.len() } } -impl FusedIterator for IntoKeys {} +impl FusedIterator for IntoKeys {} -impl fmt::Debug for IntoKeys { +impl fmt::Debug for IntoKeys { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_list() .entries(self.inner.iter().map(|(k, _)| k)) @@ -2516,11 +2512,11 @@ /// assert_eq!(values.next(), None); /// assert_eq!(values.next(), None); /// ``` -pub struct IntoValues { +pub struct IntoValues { inner: IntoIter, } -impl Iterator for IntoValues { +impl Iterator for IntoValues { type Item = V; #[inline] @@ -2533,16 +2529,16 @@ } } -impl ExactSizeIterator for IntoValues { +impl ExactSizeIterator for IntoValues { #[inline] fn len(&self) -> usize { self.inner.len() } } -impl FusedIterator for IntoValues {} +impl FusedIterator for IntoValues {} -impl fmt::Debug for IntoValues { +impl fmt::Debug for IntoValues { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_list() .entries(self.inner.iter().map(|(_, v)| v)) @@ -2674,11 +2670,11 @@ /// assert_eq!(drain_iter.next(), None); /// assert_eq!(drain_iter.next(), None); /// ``` -pub struct Drain<'a, K, V, A: Allocator = Global> { +pub struct Drain<'a, K, V, A: Allocator + Clone = Global> { inner: RawDrain<'a, (K, V), A>, } -impl Drain<'_, K, V, A> { +impl Drain<'_, K, V, A> { /// Returns a iterator of references over the remaining items. #[cfg_attr(feature = "inline-more", inline)] pub(super) fn iter(&self) -> Iter<'_, K, V> { @@ -2721,24 +2717,24 @@ /// assert_eq!(map.len(), 1); /// ``` #[must_use = "Iterators are lazy unless consumed"] -pub struct ExtractIf<'a, K, V, F, A: Allocator = Global> +pub struct ExtractIf<'a, K, V, F, A: Allocator + Clone = Global> where F: FnMut(&K, &mut V) -> bool, { f: F, - inner: RawExtractIf<'a, (K, V), A>, + inner: ExtractIfInner<'a, K, V, A>, } impl Iterator for ExtractIf<'_, K, V, F, A> where F: FnMut(&K, &mut V) -> bool, - A: Allocator, + A: Allocator + Clone, { type Item = (K, V); #[cfg_attr(feature = "inline-more", inline)] fn next(&mut self) -> Option { - self.inner.next(|&mut (ref k, ref mut v)| (self.f)(k, v)) + self.inner.next(&mut self.f) } #[inline] @@ -2749,6 +2745,30 @@ impl FusedIterator for ExtractIf<'_, K, V, F> where F: FnMut(&K, &mut V) -> bool {} +/// Portions of `ExtractIf` shared with `set::ExtractIf` +pub(super) struct ExtractIfInner<'a, K, V, A: Allocator + Clone> { + pub iter: RawIter<(K, V)>, + pub table: &'a mut RawTable<(K, V), A>, +} + +impl ExtractIfInner<'_, K, V, A> { + #[cfg_attr(feature = "inline-more", inline)] + pub(super) fn next(&mut self, f: &mut F) -> Option<(K, V)> + where + F: FnMut(&K, &mut V) -> bool, + { + unsafe { + for item in &mut self.iter { + let &mut (ref key, ref mut value) = item.as_mut(); + if f(key, value) { + return Some(self.table.remove(item).0); + } + } + } + None + } +} + /// A mutable iterator over the values of a `HashMap` in arbitrary order. /// The iterator element type is `&'a mut V`. /// @@ -2835,7 +2855,7 @@ /// /// assert_eq!(map.len(), 6); /// ``` -pub struct RawEntryBuilderMut<'a, K, V, S, A: Allocator = Global> { +pub struct RawEntryBuilderMut<'a, K, V, S, A: Allocator + Clone = Global> { map: &'a mut HashMap, } @@ -2923,7 +2943,7 @@ /// vec.sort_unstable(); /// assert_eq!(vec, [('a', 10), ('b', 20), ('c', 30), ('d', 40), ('e', 50), ('f', 60)]); /// ``` -pub enum RawEntryMut<'a, K, V, S, A: Allocator = Global> { +pub enum RawEntryMut<'a, K, V, S, A: Allocator + Clone = Global> { /// An occupied entry. /// /// # Examples @@ -3014,7 +3034,7 @@ /// assert_eq!(map.get(&"b"), None); /// assert_eq!(map.len(), 1); /// ``` -pub struct RawOccupiedEntryMut<'a, K, V, S, A: Allocator = Global> { +pub struct RawOccupiedEntryMut<'a, K, V, S, A: Allocator + Clone = Global> { elem: Bucket<(K, V)>, table: &'a mut RawTable<(K, V), A>, hash_builder: &'a S, @@ -3025,7 +3045,7 @@ K: Send, V: Send, S: Send, - A: Send + Allocator, + A: Send + Allocator + Clone, { } unsafe impl Sync for RawOccupiedEntryMut<'_, K, V, S, A> @@ -3033,7 +3053,7 @@ K: Sync, V: Sync, S: Sync, - A: Sync + Allocator, + A: Sync + Allocator + Clone, { } @@ -3085,7 +3105,7 @@ /// } /// assert!(map[&"c"] == 30 && map.len() == 3); /// ``` -pub struct RawVacantEntryMut<'a, K, V, S, A: Allocator = Global> { +pub struct RawVacantEntryMut<'a, K, V, S, A: Allocator + Clone = Global> { table: &'a mut RawTable<(K, V), A>, hash_builder: &'a S, } @@ -3124,11 +3144,11 @@ /// assert_eq!(map.raw_entry().from_key_hashed_nocheck(hash, &k), kv); /// } /// ``` -pub struct RawEntryBuilder<'a, K, V, S, A: Allocator = Global> { +pub struct RawEntryBuilder<'a, K, V, S, A: Allocator + Clone = Global> { map: &'a HashMap, } -impl<'a, K, V, S, A: Allocator> RawEntryBuilderMut<'a, K, V, S, A> { +impl<'a, K, V, S, A: Allocator + Clone> RawEntryBuilderMut<'a, K, V, S, A> { /// Creates a `RawEntryMut` from the given key. /// /// # Examples @@ -3185,7 +3205,7 @@ } } -impl<'a, K, V, S, A: Allocator> RawEntryBuilderMut<'a, K, V, S, A> { +impl<'a, K, V, S, A: Allocator + Clone> RawEntryBuilderMut<'a, K, V, S, A> { /// Creates a `RawEntryMut` from the given hash and matching function. /// /// # Examples @@ -3236,7 +3256,7 @@ } } -impl<'a, K, V, S, A: Allocator> RawEntryBuilder<'a, K, V, S, A> { +impl<'a, K, V, S, A: Allocator + Clone> RawEntryBuilder<'a, K, V, S, A> { /// Access an immutable entry by key. /// /// # Examples @@ -3329,7 +3349,7 @@ } } -impl<'a, K, V, S, A: Allocator> RawEntryMut<'a, K, V, S, A> { +impl<'a, K, V, S, A: Allocator + Clone> RawEntryMut<'a, K, V, S, A> { /// Sets the value of the entry, and returns a RawOccupiedEntryMut. /// /// # Examples @@ -3523,7 +3543,7 @@ } } -impl<'a, K, V, S, A: Allocator> RawOccupiedEntryMut<'a, K, V, S, A> { +impl<'a, K, V, S, A: Allocator + Clone> RawOccupiedEntryMut<'a, K, V, S, A> { /// Gets a reference to the key in the entry. /// /// # Examples @@ -3922,7 +3942,7 @@ } } -impl<'a, K, V, S, A: Allocator> RawVacantEntryMut<'a, K, V, S, A> { +impl<'a, K, V, S, A: Allocator + Clone> RawVacantEntryMut<'a, K, V, S, A> { /// Sets the value of the entry with the VacantEntry's key, /// and returns a mutable reference to it. /// @@ -4068,13 +4088,13 @@ } } -impl Debug for RawEntryBuilderMut<'_, K, V, S, A> { +impl Debug for RawEntryBuilderMut<'_, K, V, S, A> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_struct("RawEntryBuilder").finish() } } -impl Debug for RawEntryMut<'_, K, V, S, A> { +impl Debug for RawEntryMut<'_, K, V, S, A> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match *self { RawEntryMut::Vacant(ref v) => f.debug_tuple("RawEntry").field(v).finish(), @@ -4083,7 +4103,7 @@ } } -impl Debug for RawOccupiedEntryMut<'_, K, V, S, A> { +impl Debug for RawOccupiedEntryMut<'_, K, V, S, A> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_struct("RawOccupiedEntryMut") .field("key", self.key()) @@ -4092,13 +4112,13 @@ } } -impl Debug for RawVacantEntryMut<'_, K, V, S, A> { +impl Debug for RawVacantEntryMut<'_, K, V, S, A> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_struct("RawVacantEntryMut").finish() } } -impl Debug for RawEntryBuilder<'_, K, V, S, A> { +impl Debug for RawEntryBuilder<'_, K, V, S, A> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_struct("RawEntryBuilder").finish() } @@ -4149,7 +4169,7 @@ /// ``` pub enum Entry<'a, K, V, S, A = Global> where - A: Allocator, + A: Allocator + Clone, { /// An occupied entry. /// @@ -4182,7 +4202,7 @@ Vacant(VacantEntry<'a, K, V, S, A>), } -impl Debug for Entry<'_, K, V, S, A> { +impl Debug for Entry<'_, K, V, S, A> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match *self { Entry::Vacant(ref v) => f.debug_tuple("Entry").field(v).finish(), @@ -4231,7 +4251,7 @@ /// assert_eq!(map.get(&"c"), None); /// assert_eq!(map.len(), 2); /// ``` -pub struct OccupiedEntry<'a, K, V, S = DefaultHashBuilder, A: Allocator = Global> { +pub struct OccupiedEntry<'a, K, V, S = DefaultHashBuilder, A: Allocator + Clone = Global> { hash: u64, key: Option, elem: Bucket<(K, V)>, @@ -4243,7 +4263,7 @@ K: Send, V: Send, S: Send, - A: Send + Allocator, + A: Send + Allocator + Clone, { } unsafe impl Sync for OccupiedEntry<'_, K, V, S, A> @@ -4251,11 +4271,11 @@ K: Sync, V: Sync, S: Sync, - A: Sync + Allocator, + A: Sync + Allocator + Clone, { } -impl Debug for OccupiedEntry<'_, K, V, S, A> { +impl Debug for OccupiedEntry<'_, K, V, S, A> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_struct("OccupiedEntry") .field("key", self.key()) @@ -4294,13 +4314,13 @@ /// } /// assert!(map[&"b"] == 20 && map.len() == 2); /// ``` -pub struct VacantEntry<'a, K, V, S = DefaultHashBuilder, A: Allocator = Global> { +pub struct VacantEntry<'a, K, V, S = DefaultHashBuilder, A: Allocator + Clone = Global> { hash: u64, key: K, table: &'a mut HashMap, } -impl Debug for VacantEntry<'_, K, V, S, A> { +impl Debug for VacantEntry<'_, K, V, S, A> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_tuple("VacantEntry").field(self.key()).finish() } @@ -4360,7 +4380,7 @@ /// ``` pub enum EntryRef<'a, 'b, K, Q: ?Sized, V, S, A = Global> where - A: Allocator, + A: Allocator + Clone, { /// An occupied entry. /// @@ -4393,7 +4413,7 @@ Vacant(VacantEntryRef<'a, 'b, K, Q, V, S, A>), } -impl, Q: ?Sized + Debug, V: Debug, S, A: Allocator> Debug +impl, Q: ?Sized + Debug, V: Debug, S, A: Allocator + Clone> Debug for EntryRef<'_, '_, K, Q, V, S, A> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { @@ -4471,7 +4491,7 @@ /// assert_eq!(map.get("c"), None); /// assert_eq!(map.len(), 2); /// ``` -pub struct OccupiedEntryRef<'a, 'b, K, Q: ?Sized, V, S, A: Allocator = Global> { +pub struct OccupiedEntryRef<'a, 'b, K, Q: ?Sized, V, S, A: Allocator + Clone = Global> { hash: u64, key: Option>, elem: Bucket<(K, V)>, @@ -4484,7 +4504,7 @@ Q: Sync + ?Sized, V: Send, S: Send, - A: Send + Allocator, + A: Send + Allocator + Clone, { } unsafe impl<'a, 'b, K, Q, V, S, A> Sync for OccupiedEntryRef<'a, 'b, K, Q, V, S, A> @@ -4493,11 +4513,11 @@ Q: Sync + ?Sized, V: Sync, S: Sync, - A: Sync + Allocator, + A: Sync + Allocator + Clone, { } -impl, Q: ?Sized + Debug, V: Debug, S, A: Allocator> Debug +impl, Q: ?Sized + Debug, V: Debug, S, A: Allocator + Clone> Debug for OccupiedEntryRef<'_, '_, K, Q, V, S, A> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { @@ -4538,13 +4558,13 @@ /// } /// assert!(map["b"] == 20 && map.len() == 2); /// ``` -pub struct VacantEntryRef<'a, 'b, K, Q: ?Sized, V, S, A: Allocator = Global> { +pub struct VacantEntryRef<'a, 'b, K, Q: ?Sized, V, S, A: Allocator + Clone = Global> { hash: u64, key: KeyOrRef<'b, K, Q>, table: &'a mut HashMap, } -impl, Q: ?Sized + Debug, V, S, A: Allocator> Debug +impl, Q: ?Sized + Debug, V, S, A: Allocator + Clone> Debug for VacantEntryRef<'_, '_, K, Q, V, S, A> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { @@ -4576,14 +4596,14 @@ /// } /// assert_eq!(map[&"a"], 100); /// ``` -pub struct OccupiedError<'a, K, V, S, A: Allocator = Global> { +pub struct OccupiedError<'a, K, V, S, A: Allocator + Clone = Global> { /// The entry in the map that was already occupied. pub entry: OccupiedEntry<'a, K, V, S, A>, /// The value which was not inserted, because the entry was already occupied. pub value: V, } -impl Debug for OccupiedError<'_, K, V, S, A> { +impl Debug for OccupiedError<'_, K, V, S, A> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_struct("OccupiedError") .field("key", self.entry.key()) @@ -4593,7 +4613,9 @@ } } -impl<'a, K: Debug, V: Debug, S, A: Allocator> fmt::Display for OccupiedError<'a, K, V, S, A> { +impl<'a, K: Debug, V: Debug, S, A: Allocator + Clone> fmt::Display + for OccupiedError<'a, K, V, S, A> +{ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!( f, @@ -4605,7 +4627,7 @@ } } -impl<'a, K, V, S, A: Allocator> IntoIterator for &'a HashMap { +impl<'a, K, V, S, A: Allocator + Clone> IntoIterator for &'a HashMap { type Item = (&'a K, &'a V); type IntoIter = Iter<'a, K, V>; @@ -4637,7 +4659,7 @@ } } -impl<'a, K, V, S, A: Allocator> IntoIterator for &'a mut HashMap { +impl<'a, K, V, S, A: Allocator + Clone> IntoIterator for &'a mut HashMap { type Item = (&'a K, &'a mut V); type IntoIter = IterMut<'a, K, V>; @@ -4674,7 +4696,7 @@ } } -impl IntoIterator for HashMap { +impl IntoIterator for HashMap { type Item = (K, V); type IntoIter = IntoIter; @@ -4769,7 +4791,7 @@ } } -impl Iterator for IntoIter { +impl Iterator for IntoIter { type Item = (K, V); #[cfg_attr(feature = "inline-more", inline)] @@ -4781,15 +4803,15 @@ self.inner.size_hint() } } -impl ExactSizeIterator for IntoIter { +impl ExactSizeIterator for IntoIter { #[cfg_attr(feature = "inline-more", inline)] fn len(&self) -> usize { self.inner.len() } } -impl FusedIterator for IntoIter {} +impl FusedIterator for IntoIter {} -impl fmt::Debug for IntoIter { +impl fmt::Debug for IntoIter { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_list().entries(self.iter()).finish() } @@ -4875,7 +4897,7 @@ } } -impl<'a, K, V, A: Allocator> Iterator for Drain<'a, K, V, A> { +impl<'a, K, V, A: Allocator + Clone> Iterator for Drain<'a, K, V, A> { type Item = (K, V); #[cfg_attr(feature = "inline-more", inline)] @@ -4887,26 +4909,26 @@ self.inner.size_hint() } } -impl ExactSizeIterator for Drain<'_, K, V, A> { +impl ExactSizeIterator for Drain<'_, K, V, A> { #[cfg_attr(feature = "inline-more", inline)] fn len(&self) -> usize { self.inner.len() } } -impl FusedIterator for Drain<'_, K, V, A> {} +impl FusedIterator for Drain<'_, K, V, A> {} impl fmt::Debug for Drain<'_, K, V, A> where K: fmt::Debug, V: fmt::Debug, - A: Allocator, + A: Allocator + Clone, { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_list().entries(self.iter()).finish() } } -impl<'a, K, V, S, A: Allocator> Entry<'a, K, V, S, A> { +impl<'a, K, V, S, A: Allocator + Clone> Entry<'a, K, V, S, A> { /// Sets the value of the entry, and returns an OccupiedEntry. /// /// # Examples @@ -5153,7 +5175,7 @@ } } -impl<'a, K, V: Default, S, A: Allocator> Entry<'a, K, V, S, A> { +impl<'a, K, V: Default, S, A: Allocator + Clone> Entry<'a, K, V, S, A> { /// Ensures a value is in the entry by inserting the default value if empty, /// and returns a mutable reference to the value in the entry. /// @@ -5186,7 +5208,7 @@ } } -impl<'a, K, V, S, A: Allocator> OccupiedEntry<'a, K, V, S, A> { +impl<'a, K, V, S, A: Allocator + Clone> OccupiedEntry<'a, K, V, S, A> { /// Gets a reference to the key in the entry. /// /// # Examples @@ -5541,7 +5563,7 @@ } } -impl<'a, K, V, S, A: Allocator> VacantEntry<'a, K, V, S, A> { +impl<'a, K, V, S, A: Allocator + Clone> VacantEntry<'a, K, V, S, A> { /// Gets a reference to the key that would be used when inserting a value /// through the `VacantEntry`. /// @@ -5628,7 +5650,7 @@ } } -impl<'a, 'b, K, Q: ?Sized, V, S, A: Allocator> EntryRef<'a, 'b, K, Q, V, S, A> { +impl<'a, 'b, K, Q: ?Sized, V, S, A: Allocator + Clone> EntryRef<'a, 'b, K, Q, V, S, A> { /// Sets the value of the entry, and returns an OccupiedEntryRef. /// /// # Examples @@ -5875,7 +5897,7 @@ } } -impl<'a, 'b, K, Q: ?Sized, V: Default, S, A: Allocator> EntryRef<'a, 'b, K, Q, V, S, A> { +impl<'a, 'b, K, Q: ?Sized, V: Default, S, A: Allocator + Clone> EntryRef<'a, 'b, K, Q, V, S, A> { /// Ensures a value is in the entry by inserting the default value if empty, /// and returns a mutable reference to the value in the entry. /// @@ -5908,7 +5930,7 @@ } } -impl<'a, 'b, K, Q: ?Sized, V, S, A: Allocator> OccupiedEntryRef<'a, 'b, K, Q, V, S, A> { +impl<'a, 'b, K, Q: ?Sized, V, S, A: Allocator + Clone> OccupiedEntryRef<'a, 'b, K, Q, V, S, A> { /// Gets a reference to the key in the entry. /// /// # Examples @@ -6260,7 +6282,7 @@ } } -impl<'a, 'b, K, Q: ?Sized, V, S, A: Allocator> VacantEntryRef<'a, 'b, K, Q, V, S, A> { +impl<'a, 'b, K, Q: ?Sized, V, S, A: Allocator + Clone> VacantEntryRef<'a, 'b, K, Q, V, S, A> { /// Gets a reference to the key that would be used when inserting a value /// through the `VacantEntryRef`. /// @@ -6360,7 +6382,7 @@ where K: Eq + Hash, S: BuildHasher + Default, - A: Default + Allocator, + A: Default + Allocator + Clone, { #[cfg_attr(feature = "inline-more", inline)] fn from_iter>(iter: T) -> Self { @@ -6380,7 +6402,7 @@ where K: Eq + Hash, S: BuildHasher, - A: Allocator, + A: Allocator + Clone, { /// Inserts all new key-values from the iterator to existing `HashMap`. /// Replace values with existing keys with new values returned from the iterator. @@ -6464,7 +6486,7 @@ K: Eq + Hash + Copy, V: Copy, S: BuildHasher, - A: Allocator, + A: Allocator + Clone, { /// Inserts all new key-values from the iterator to existing `HashMap`. /// Replace values with existing keys with new values returned from the iterator. @@ -6529,7 +6551,7 @@ K: Eq + Hash + Copy, V: Copy, S: BuildHasher, - A: Allocator, + A: Allocator + Clone, { /// Inserts all new key-values from the iterator to existing `HashMap`. /// Replace values with existing keys with new values returned from the iterator. @@ -6596,12 +6618,12 @@ fn iter_val<'a, 'new>(v: Iter<'a, u8, &'static str>) -> Iter<'a, u8, &'new str> { v } - fn into_iter_key<'new, A: Allocator>( + fn into_iter_key<'new, A: Allocator + Clone>( v: IntoIter<&'static str, u8, A>, ) -> IntoIter<&'new str, u8, A> { v } - fn into_iter_val<'new, A: Allocator>( + fn into_iter_val<'new, A: Allocator + Clone>( v: IntoIter, ) -> IntoIter { v @@ -6631,12 +6653,6 @@ use super::Entry::{Occupied, Vacant}; use super::EntryRef; use super::{HashMap, RawEntryMut}; - use alloc::string::{String, ToString}; - use alloc::sync::Arc; - use allocator_api2::alloc::{AllocError, Allocator, Global}; - use core::alloc::Layout; - use core::ptr::NonNull; - use core::sync::atomic::{AtomicI8, Ordering}; use rand::{rngs::SmallRng, Rng, SeedableRng}; use std::borrow::ToOwned; use std::cell::RefCell; @@ -8487,396 +8503,4 @@ ); let _map2 = map1.clone(); } - - struct MyAllocInner { - drop_count: Arc, - } - - #[derive(Clone)] - struct MyAlloc { - _inner: Arc, - } - - impl MyAlloc { - fn new(drop_count: Arc) -> Self { - MyAlloc { - _inner: Arc::new(MyAllocInner { drop_count }), - } - } - } - - impl Drop for MyAllocInner { - fn drop(&mut self) { - println!("MyAlloc freed."); - self.drop_count.fetch_sub(1, Ordering::SeqCst); - } - } - - unsafe impl Allocator for MyAlloc { - fn allocate(&self, layout: Layout) -> std::result::Result, AllocError> { - let g = Global; - g.allocate(layout) - } - - unsafe fn deallocate(&self, ptr: NonNull, layout: Layout) { - let g = Global; - g.deallocate(ptr, layout) - } - } - - #[test] - fn test_hashmap_into_iter_bug() { - let dropped: Arc = Arc::new(AtomicI8::new(1)); - - { - let mut map = HashMap::with_capacity_in(10, MyAlloc::new(dropped.clone())); - for i in 0..10 { - map.entry(i).or_insert_with(|| "i".to_string()); - } - - for (k, v) in map { - println!("{}, {}", k, v); - } - } - - // All allocator clones should already be dropped. - assert_eq!(dropped.load(Ordering::SeqCst), 0); - } - - #[derive(Debug)] - struct CheckedCloneDrop { - panic_in_clone: bool, - panic_in_drop: bool, - dropped: bool, - data: T, - } - - impl CheckedCloneDrop { - fn new(panic_in_clone: bool, panic_in_drop: bool, data: T) -> Self { - CheckedCloneDrop { - panic_in_clone, - panic_in_drop, - dropped: false, - data, - } - } - } - - impl Clone for CheckedCloneDrop { - fn clone(&self) -> Self { - if self.panic_in_clone { - panic!("panic in clone") - } - Self { - panic_in_clone: self.panic_in_clone, - panic_in_drop: self.panic_in_drop, - dropped: self.dropped, - data: self.data.clone(), - } - } - } - - impl Drop for CheckedCloneDrop { - fn drop(&mut self) { - if self.panic_in_drop { - self.dropped = true; - panic!("panic in drop"); - } - if self.dropped { - panic!("double drop"); - } - self.dropped = true; - } - } - - /// Return hashmap with predefined distribution of elements. - /// All elements will be located in the same order as elements - /// returned by iterator. - /// - /// This function does not panic, but returns an error as a `String` - /// to distinguish between a test panic and an error in the input data. - fn get_test_map( - iter: I, - mut fun: impl FnMut(u64) -> T, - alloc: A, - ) -> Result, DefaultHashBuilder, A>, String> - where - I: Iterator + Clone + ExactSizeIterator, - A: Allocator, - T: PartialEq + core::fmt::Debug, - { - use crate::scopeguard::guard; - - let mut map: HashMap, _, A> = - HashMap::with_capacity_in(iter.size_hint().0, alloc); - { - let mut guard = guard(&mut map, |map| { - for (_, value) in map.iter_mut() { - value.panic_in_drop = false - } - }); - - let mut count = 0; - // Hash and Key must be equal to each other for controlling the elements placement. - for (panic_in_clone, panic_in_drop) in iter.clone() { - if core::mem::needs_drop::() && panic_in_drop { - return Err(String::from( - "panic_in_drop can be set with a type that doesn't need to be dropped", - )); - } - guard.table.insert( - count, - ( - count, - CheckedCloneDrop::new(panic_in_clone, panic_in_drop, fun(count)), - ), - |(k, _)| *k, - ); - count += 1; - } - - // Let's check that all elements are located as we wanted - let mut check_count = 0; - for ((key, value), (panic_in_clone, panic_in_drop)) in guard.iter().zip(iter) { - if *key != check_count { - return Err(format!( - "key != check_count,\nkey: `{}`,\ncheck_count: `{}`", - key, check_count - )); - } - if value.dropped - || value.panic_in_clone != panic_in_clone - || value.panic_in_drop != panic_in_drop - || value.data != fun(check_count) - { - return Err(format!( - "Value is not equal to expected,\nvalue: `{:?}`,\nexpected: \ - `CheckedCloneDrop {{ panic_in_clone: {}, panic_in_drop: {}, dropped: {}, data: {:?} }}`", - value, panic_in_clone, panic_in_drop, false, fun(check_count) - )); - } - check_count += 1; - } - - if guard.len() != check_count as usize { - return Err(format!( - "map.len() != check_count,\nmap.len(): `{}`,\ncheck_count: `{}`", - guard.len(), - check_count - )); - } - - if count != check_count { - return Err(format!( - "count != check_count,\ncount: `{}`,\ncheck_count: `{}`", - count, check_count - )); - } - core::mem::forget(guard); - } - Ok(map) - } - - const DISARMED: bool = false; - const ARMED: bool = true; - - const ARMED_FLAGS: [bool; 8] = [ - DISARMED, DISARMED, DISARMED, ARMED, DISARMED, DISARMED, DISARMED, DISARMED, - ]; - - const DISARMED_FLAGS: [bool; 8] = [ - DISARMED, DISARMED, DISARMED, DISARMED, DISARMED, DISARMED, DISARMED, DISARMED, - ]; - - #[test] - #[should_panic = "panic in clone"] - fn test_clone_memory_leaks_and_double_drop_one() { - let dropped: Arc = Arc::new(AtomicI8::new(2)); - - { - assert_eq!(ARMED_FLAGS.len(), DISARMED_FLAGS.len()); - - let map: HashMap>, DefaultHashBuilder, MyAlloc> = - match get_test_map( - ARMED_FLAGS.into_iter().zip(DISARMED_FLAGS), - |n| vec![n], - MyAlloc::new(dropped.clone()), - ) { - Ok(map) => map, - Err(msg) => panic!("{msg}"), - }; - - // Clone should normally clone a few elements, and then (when the - // clone function panics), deallocate both its own memory, memory - // of `dropped: Arc` and the memory of already cloned - // elements (Vec memory inside CheckedCloneDrop). - let _map2 = map.clone(); - } - } - - #[test] - #[should_panic = "panic in drop"] - fn test_clone_memory_leaks_and_double_drop_two() { - let dropped: Arc = Arc::new(AtomicI8::new(2)); - - { - assert_eq!(ARMED_FLAGS.len(), DISARMED_FLAGS.len()); - - let map: HashMap, DefaultHashBuilder, _> = match get_test_map( - DISARMED_FLAGS.into_iter().zip(DISARMED_FLAGS), - |n| n, - MyAlloc::new(dropped.clone()), - ) { - Ok(map) => map, - Err(msg) => panic!("{msg}"), - }; - - let mut map2 = match get_test_map( - DISARMED_FLAGS.into_iter().zip(ARMED_FLAGS), - |n| n, - MyAlloc::new(dropped.clone()), - ) { - Ok(map) => map, - Err(msg) => panic!("{msg}"), - }; - - // The `clone_from` should try to drop the elements of `map2` without - // double drop and leaking the allocator. Elements that have not been - // dropped leak their memory. - map2.clone_from(&map); - } - } - - /// We check that we have a working table if the clone operation from another - /// thread ended in a panic (when buckets of maps are equal to each other). - #[test] - fn test_catch_panic_clone_from_when_len_is_equal() { - use std::thread; - - let dropped: Arc = Arc::new(AtomicI8::new(2)); - - { - assert_eq!(ARMED_FLAGS.len(), DISARMED_FLAGS.len()); - - let mut map = match get_test_map( - DISARMED_FLAGS.into_iter().zip(DISARMED_FLAGS), - |n| vec![n], - MyAlloc::new(dropped.clone()), - ) { - Ok(map) => map, - Err(msg) => panic!("{msg}"), - }; - - thread::scope(|s| { - let result: thread::ScopedJoinHandle<'_, String> = s.spawn(|| { - let scope_map = - match get_test_map(ARMED_FLAGS.into_iter().zip(DISARMED_FLAGS), |n| vec![n * 2], MyAlloc::new(dropped.clone())) { - Ok(map) => map, - Err(msg) => return msg, - }; - if map.table.buckets() != scope_map.table.buckets() { - return format!( - "map.table.buckets() != scope_map.table.buckets(),\nleft: `{}`,\nright: `{}`", - map.table.buckets(), scope_map.table.buckets() - ); - } - map.clone_from(&scope_map); - "We must fail the cloning!!!".to_owned() - }); - if let Ok(msg) = result.join() { - panic!("{msg}") - } - }); - - // Let's check that all iterators work fine and do not return elements - // (especially `RawIterRange`, which does not depend on the number of - // elements in the table, but looks directly at the control bytes) - // - // SAFETY: We know for sure that `RawTable` will outlive - // the returned `RawIter / RawIterRange` iterator. - assert_eq!(map.len(), 0); - assert_eq!(map.iter().count(), 0); - assert_eq!(unsafe { map.table.iter().count() }, 0); - assert_eq!(unsafe { map.table.iter().iter.count() }, 0); - - for idx in 0..map.table.buckets() { - let idx = idx as u64; - assert!( - map.table.find(idx, |(k, _)| *k == idx).is_none(), - "Index: {idx}" - ); - } - } - - // All allocator clones should already be dropped. - assert_eq!(dropped.load(Ordering::SeqCst), 0); - } - - /// We check that we have a working table if the clone operation from another - /// thread ended in a panic (when buckets of maps are not equal to each other). - #[test] - fn test_catch_panic_clone_from_when_len_is_not_equal() { - use std::thread; - - let dropped: Arc = Arc::new(AtomicI8::new(2)); - - { - assert_eq!(ARMED_FLAGS.len(), DISARMED_FLAGS.len()); - - let mut map = match get_test_map( - [DISARMED].into_iter().zip([DISARMED]), - |n| vec![n], - MyAlloc::new(dropped.clone()), - ) { - Ok(map) => map, - Err(msg) => panic!("{msg}"), - }; - - thread::scope(|s| { - let result: thread::ScopedJoinHandle<'_, String> = s.spawn(|| { - let scope_map = match get_test_map( - ARMED_FLAGS.into_iter().zip(DISARMED_FLAGS), - |n| vec![n * 2], - MyAlloc::new(dropped.clone()), - ) { - Ok(map) => map, - Err(msg) => return msg, - }; - if map.table.buckets() == scope_map.table.buckets() { - return format!( - "map.table.buckets() == scope_map.table.buckets(): `{}`", - map.table.buckets() - ); - } - map.clone_from(&scope_map); - "We must fail the cloning!!!".to_owned() - }); - if let Ok(msg) = result.join() { - panic!("{msg}") - } - }); - - // Let's check that all iterators work fine and do not return elements - // (especially `RawIterRange`, which does not depend on the number of - // elements in the table, but looks directly at the control bytes) - // - // SAFETY: We know for sure that `RawTable` will outlive - // the returned `RawIter / RawIterRange` iterator. - assert_eq!(map.len(), 0); - assert_eq!(map.iter().count(), 0); - assert_eq!(unsafe { map.table.iter().count() }, 0); - assert_eq!(unsafe { map.table.iter().iter.count() }, 0); - - for idx in 0..map.table.buckets() { - let idx = idx as u64; - assert!( - map.table.find(idx, |(k, _)| *k == idx).is_none(), - "Index: {idx}" - ); - } - } - - // All allocator clones should already be dropped. - assert_eq!(dropped.load(Ordering::SeqCst), 0); - } } diff -Nru temporalio-1.3.0/vendor/hashbrown/src/raw/mod.rs temporalio-1.3.0/vendor/hashbrown/src/raw/mod.rs --- temporalio-1.3.0/vendor/hashbrown/src/raw/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/hashbrown/src/raw/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -4,6 +4,7 @@ use core::iter::FusedIterator; use core::marker::PhantomData; use core::mem; +use core::mem::ManuallyDrop; use core::mem::MaybeUninit; use core::ptr::NonNull; use core::{hint, ptr}; @@ -20,18 +21,11 @@ if #[cfg(all( target_feature = "sse2", any(target_arch = "x86", target_arch = "x86_64"), - not(miri), + not(miri) ))] { mod sse2; use sse2 as imp; - } else if #[cfg(all( - target_arch = "aarch64", - target_feature = "neon", - // NEON intrinsics are currently broken on big-endian targets. - // See https://github.com/rust-lang/stdarch/issues/1484. - target_endian = "little", - not(miri), - ))] { + } else if #[cfg(all(target_arch = "aarch64", target_feature = "neon"))] { mod neon; use neon as imp; } else { @@ -99,13 +93,6 @@ } } -trait SizedTypeProperties: Sized { - const IS_ZERO_SIZED: bool = mem::size_of::() == 0; - const NEEDS_DROP: bool = mem::needs_drop::(); -} - -impl SizedTypeProperties for T {} - /// Control byte value for an empty bucket. const EMPTY: u8 = 0b1111_1111; @@ -307,6 +294,8 @@ } impl Bucket { + const IS_ZERO_SIZED_TYPE: bool = mem::size_of::() == 0; + /// Creates a [`Bucket`] that contain pointer to the data. /// The pointer calculation is performed by calculating the /// offset from given `base` pointer (convenience for @@ -375,7 +364,7 @@ // // where: T0...Tlast - our stored data; C0...Clast - control bytes // or metadata for data. - let ptr = if T::IS_ZERO_SIZED { + let ptr = if Self::IS_ZERO_SIZED_TYPE { // won't overflow because index must be less than length (bucket_mask) // and bucket_mask is guaranteed to be less than `isize::MAX` // (see TableLayout::calculate_layout_for method) @@ -449,7 +438,7 @@ // (base.as_ptr() as usize - self.ptr.as_ptr() as usize) / mem::size_of::() // // where: T0...Tlast - our stored data; C0...Clast - control bytes or metadata for data. - if T::IS_ZERO_SIZED { + if Self::IS_ZERO_SIZED_TYPE { // this can not be UB self.ptr.as_ptr() as usize - 1 } else { @@ -513,7 +502,7 @@ /// ``` #[inline] pub fn as_ptr(&self) -> *mut T { - if T::IS_ZERO_SIZED { + if Self::IS_ZERO_SIZED_TYPE { // Just return an arbitrary ZST pointer which is properly aligned // invalid pointer is good enough for ZST invalid_mut(mem::align_of::()) @@ -561,7 +550,7 @@ /// [`RawTableInner::buckets`]: RawTableInner::buckets #[inline] unsafe fn next_n(&self, offset: usize) -> Self { - let ptr = if T::IS_ZERO_SIZED { + let ptr = if Self::IS_ZERO_SIZED_TYPE { // invalid pointer is good enough for ZST invalid_mut(self.ptr.as_ptr() as usize + offset) } else { @@ -785,16 +774,15 @@ } /// A raw hash table with an unsafe API. -pub struct RawTable { - table: RawTableInner, - alloc: A, +pub struct RawTable { + table: RawTableInner, // Tell dropck that we own instances of T. marker: PhantomData, } /// Non-generic part of `RawTable` which allows functions to be instantiated only once regardless /// of how many different key-value types are used. -struct RawTableInner { +struct RawTableInner { // Mask to get an index from a hash value. The value is one less than the // number of buckets in the table. bucket_mask: usize, @@ -808,6 +796,8 @@ // Number of elements in the table, only really used by len() items: usize, + + alloc: A, } impl RawTable { @@ -819,8 +809,7 @@ #[inline] pub const fn new() -> Self { Self { - table: RawTableInner::NEW, - alloc: Global, + table: RawTableInner::new_in(Global), marker: PhantomData, } } @@ -839,8 +828,9 @@ } } -impl RawTable { +impl RawTable { const TABLE_LAYOUT: TableLayout = TableLayout::new::(); + const DATA_NEEDS_DROP: bool = mem::needs_drop::(); /// Creates a new empty hash table without allocating any memory, using the /// given allocator. @@ -851,8 +841,7 @@ #[inline] pub const fn new_in(alloc: A) -> Self { Self { - table: RawTableInner::NEW, - alloc, + table: RawTableInner::new_in(alloc), marker: PhantomData, } } @@ -870,77 +859,66 @@ Ok(Self { table: RawTableInner::new_uninitialized( - &alloc, + alloc, Self::TABLE_LAYOUT, buckets, fallibility, )?, - alloc, marker: PhantomData, }) } - /// Attempts to allocate a new hash table using the given allocator, with at least enough - /// capacity for inserting the given number of elements without reallocating. - #[cfg(feature = "raw")] - pub fn try_with_capacity_in(capacity: usize, alloc: A) -> Result { + /// Attempts to allocate a new hash table with at least enough capacity + /// for inserting the given number of elements without reallocating. + fn fallible_with_capacity( + alloc: A, + capacity: usize, + fallibility: Fallibility, + ) -> Result { Ok(Self { table: RawTableInner::fallible_with_capacity( - &alloc, + alloc, Self::TABLE_LAYOUT, capacity, - Fallibility::Fallible, + fallibility, )?, - alloc, marker: PhantomData, }) } + /// Attempts to allocate a new hash table using the given allocator, with at least enough + /// capacity for inserting the given number of elements without reallocating. + #[cfg(feature = "raw")] + pub fn try_with_capacity_in(capacity: usize, alloc: A) -> Result { + Self::fallible_with_capacity(alloc, capacity, Fallibility::Fallible) + } + /// Allocates a new hash table using the given allocator, with at least enough capacity for /// inserting the given number of elements without reallocating. pub fn with_capacity_in(capacity: usize, alloc: A) -> Self { - Self { - table: RawTableInner::with_capacity(&alloc, Self::TABLE_LAYOUT, capacity), - alloc, - marker: PhantomData, + // Avoid `Result::unwrap_or_else` because it bloats LLVM IR. + match Self::fallible_with_capacity(alloc, capacity, Fallibility::Infallible) { + Ok(capacity) => capacity, + Err(_) => unsafe { hint::unreachable_unchecked() }, } } /// Returns a reference to the underlying allocator. #[inline] pub fn allocator(&self) -> &A { - &self.alloc + &self.table.alloc } - /// Returns pointer to one past last `data` element in the the table as viewed from - /// the start point of the allocation. - /// - /// The caller must ensure that the `RawTable` outlives the returned [`NonNull`], - /// otherwise using it may result in [`undefined behavior`]. - /// - /// [`undefined behavior`]: https://doc.rust-lang.org/reference/behavior-considered-undefined.html + /// Deallocates the table without dropping any entries. + #[cfg_attr(feature = "inline-more", inline)] + unsafe fn free_buckets(&mut self) { + self.table.free_buckets(Self::TABLE_LAYOUT); + } + + /// Returns pointer to one past last element of data table. #[inline] - pub fn data_end(&self) -> NonNull { - // SAFETY: `self.table.ctrl` is `NonNull`, so casting it is safe - // - // `self.table.ctrl.as_ptr().cast()` returns pointer that - // points here (to the end of `T0`) - // ∨ - // [Pad], T_n, ..., T1, T0, |CT0, CT1, ..., CT_n|, CTa_0, CTa_1, ..., CTa_m - // \________ ________/ - // \/ - // `n = buckets - 1`, i.e. `RawTable::buckets() - 1` - // - // where: T0...T_n - our stored data; - // CT0...CT_n - control bytes or metadata for `data`. - // CTa_0...CTa_m - additional control bytes, where `m = Group::WIDTH - 1` (so that the search - // with loading `Group` bytes from the heap works properly, even if the result - // of `h1(hash) & self.bucket_mask` is equal to `self.bucket_mask`). See also - // `RawTableInner::set_ctrl` function. - // - // P.S. `h1(hash) & self.bucket_mask` is the same as `hash as usize % self.buckets()` because the number - // of buckets is a power of two, and `self.bucket_mask = self.buckets() - 1`. - unsafe { NonNull::new_unchecked(self.table.ctrl.as_ptr().cast()) } + pub unsafe fn data_end(&self) -> NonNull { + NonNull::new_unchecked(self.table.ctrl.as_ptr().cast()) } /// Returns pointer to start of data table. @@ -960,9 +938,7 @@ #[inline] #[cfg(feature = "raw")] pub fn allocation_info(&self) -> (NonNull, Layout) { - // SAFETY: We use the same `table_layout` that was used to allocate - // this table. - unsafe { self.table.allocation_info_or_zero(Self::TABLE_LAYOUT) } + self.table.allocation_info_or_zero(Self::TABLE_LAYOUT) } /// Returns the index of a bucket from a `Bucket`. @@ -972,55 +948,8 @@ } /// Returns a pointer to an element in the table. - /// - /// The caller must ensure that the `RawTable` outlives the returned [`Bucket`], - /// otherwise using it may result in [`undefined behavior`]. - /// - /// # Safety - /// - /// If `mem::size_of::() != 0`, then the caller of this function must observe the - /// following safety rules: - /// - /// * The table must already be allocated; - /// - /// * The `index` must not be greater than the number returned by the [`RawTable::buckets`] - /// function, i.e. `(index + 1) <= self.buckets()`. - /// - /// It is safe to call this function with index of zero (`index == 0`) on a table that has - /// not been allocated, but using the returned [`Bucket`] results in [`undefined behavior`]. - /// - /// If `mem::size_of::() == 0`, then the only requirement is that the `index` must - /// not be greater than the number returned by the [`RawTable::buckets`] function, i.e. - /// `(index + 1) <= self.buckets()`. - /// - /// [`RawTable::buckets`]: RawTable::buckets - /// [`undefined behavior`]: https://doc.rust-lang.org/reference/behavior-considered-undefined.html #[inline] pub unsafe fn bucket(&self, index: usize) -> Bucket { - // If mem::size_of::() != 0 then return a pointer to the `element` in the `data part` of the table - // (we start counting from "0", so that in the expression T[n], the "n" index actually one less than - // the "buckets" number of our `RawTable`, i.e. "n = RawTable::buckets() - 1"): - // - // `table.bucket(3).as_ptr()` returns a pointer that points here in the `data` - // part of the `RawTable`, i.e. to the start of T3 (see `Bucket::as_ptr`) - // | - // | `base = self.data_end()` points here - // | (to the start of CT0 or to the end of T0) - // v v - // [Pad], T_n, ..., |T3|, T2, T1, T0, |CT0, CT1, CT2, CT3, ..., CT_n, CTa_0, CTa_1, ..., CTa_m - // ^ \__________ __________/ - // `table.bucket(3)` returns a pointer that points \/ - // here in the `data` part of the `RawTable` (to additional control bytes - // the end of T3) `m = Group::WIDTH - 1` - // - // where: T0...T_n - our stored data; - // CT0...CT_n - control bytes or metadata for `data`; - // CTa_0...CTa_m - additional control bytes (so that the search with loading `Group` bytes from - // the heap works properly, even if the result of `h1(hash) & self.table.bucket_mask` - // is equal to `self.table.bucket_mask`). See also `RawTableInner::set_ctrl` function. - // - // P.S. `h1(hash) & self.table.bucket_mask` is the same as `hash as usize % self.buckets()` because the number - // of buckets is a power of two, and `self.table.bucket_mask = self.buckets() - 1`. debug_assert_ne!(self.table.bucket_mask, 0); debug_assert!(index < self.buckets()); Bucket::from_base_index(self.data_end(), index) @@ -1099,10 +1028,15 @@ // Ensure that the table is reset even if one of the drops panic let mut self_ = guard(self, |self_| self_.clear_no_drop()); unsafe { - // SAFETY: ScopeGuard sets to zero the `items` field of the table - // even in case of panic during the dropping of the elements so - // that there will be no double drop of the elements. - self_.table.drop_elements::(); + self_.drop_elements(); + } + } + + unsafe fn drop_elements(&mut self) { + if Self::DATA_NEEDS_DROP && !self.is_empty() { + for item in self.iter() { + item.drop(); + } } } @@ -1113,16 +1047,7 @@ // space for. let min_size = usize::max(self.table.items, min_size); if min_size == 0 { - let mut old_inner = mem::replace(&mut self.table, RawTableInner::NEW); - unsafe { - // SAFETY: - // 1. We call the function only once; - // 2. We know for sure that `alloc` and `table_layout` matches the [`Allocator`] - // and [`TableLayout`] that were used to allocate this table. - // 3. If any elements' drop function panics, then there will only be a memory leak, - // because we have replaced the inner table with a new one. - old_inner.drop_inner_table::(&self.alloc, Self::TABLE_LAYOUT); - } + *self = Self::new_in(self.table.alloc.clone()); return; } @@ -1139,33 +1064,14 @@ if min_buckets < self.buckets() { // Fast path if the table is empty if self.table.items == 0 { - let new_inner = - RawTableInner::with_capacity(&self.alloc, Self::TABLE_LAYOUT, min_size); - let mut old_inner = mem::replace(&mut self.table, new_inner); - unsafe { - // SAFETY: - // 1. We call the function only once; - // 2. We know for sure that `alloc` and `table_layout` matches the [`Allocator`] - // and [`TableLayout`] that were used to allocate this table. - // 3. If any elements' drop function panics, then there will only be a memory leak, - // because we have replaced the inner table with a new one. - old_inner.drop_inner_table::(&self.alloc, Self::TABLE_LAYOUT); - } + *self = Self::with_capacity_in(min_size, self.table.alloc.clone()); } else { // Avoid `Result::unwrap_or_else` because it bloats LLVM IR. - unsafe { - // SAFETY: - // 1. We know for sure that `min_size >= self.table.items`. - // 2. The [`RawTableInner`] must already have properly initialized control bytes since - // we will never expose RawTable::new_uninitialized in a public API. - if self - .resize(min_size, hasher, Fallibility::Infallible) - .is_err() - { - // SAFETY: The result of calling the `resize` function cannot be an error - // because `fallibility == Fallibility::Infallible. - hint::unreachable_unchecked() - } + if self + .resize(min_size, hasher, Fallibility::Infallible) + .is_err() + { + unsafe { hint::unreachable_unchecked() } } } } @@ -1177,16 +1083,11 @@ pub fn reserve(&mut self, additional: usize, hasher: impl Fn(&T) -> u64) { if unlikely(additional > self.table.growth_left) { // Avoid `Result::unwrap_or_else` because it bloats LLVM IR. - unsafe { - // SAFETY: The [`RawTableInner`] must already have properly initialized control - // bytes since we will never expose RawTable::new_uninitialized in a public API. - if self - .reserve_rehash(additional, hasher, Fallibility::Infallible) - .is_err() - { - // SAFETY: All allocation errors will be caught inside `RawTableInner::reserve_rehash`. - hint::unreachable_unchecked() - } + if self + .reserve_rehash(additional, hasher, Fallibility::Infallible) + .is_err() + { + unsafe { hint::unreachable_unchecked() } } } } @@ -1200,45 +1101,28 @@ hasher: impl Fn(&T) -> u64, ) -> Result<(), TryReserveError> { if additional > self.table.growth_left { - // SAFETY: The [`RawTableInner`] must already have properly initialized control - // bytes since we will never expose RawTable::new_uninitialized in a public API. - unsafe { self.reserve_rehash(additional, hasher, Fallibility::Fallible) } + self.reserve_rehash(additional, hasher, Fallibility::Fallible) } else { Ok(()) } } /// Out-of-line slow path for `reserve` and `try_reserve`. - /// - /// # Safety - /// - /// The [`RawTableInner`] must have properly initialized control bytes, - /// otherwise calling this function results in [`undefined behavior`] - /// - /// [`undefined behavior`]: https://doc.rust-lang.org/reference/behavior-considered-undefined.html #[cold] #[inline(never)] - unsafe fn reserve_rehash( + fn reserve_rehash( &mut self, additional: usize, hasher: impl Fn(&T) -> u64, fallibility: Fallibility, ) -> Result<(), TryReserveError> { unsafe { - // SAFETY: - // 1. We know for sure that `alloc` and `layout` matches the [`Allocator`] and - // [`TableLayout`] that were used to allocate this table. - // 2. The `drop` function is the actual drop function of the elements stored in - // the table. - // 3. The caller ensures that the control bytes of the `RawTableInner` - // are already initialized. self.table.reserve_rehash_inner( - &self.alloc, additional, &|table, index| hasher(table.bucket::(index).as_ref()), fallibility, Self::TABLE_LAYOUT, - if T::NEEDS_DROP { + if Self::DATA_NEEDS_DROP { Some(mem::transmute(ptr::drop_in_place:: as unsafe fn(*mut T))) } else { None @@ -1249,50 +1133,20 @@ /// Allocates a new table of a different size and moves the contents of the /// current table into it. - /// - /// # Safety - /// - /// The [`RawTableInner`] must have properly initialized control bytes, - /// otherwise calling this function results in [`undefined behavior`] - /// - /// The caller of this function must ensure that `capacity >= self.table.items` - /// otherwise: - /// - /// * If `self.table.items != 0`, calling of this function with `capacity` - /// equal to 0 (`capacity == 0`) results in [`undefined behavior`]. - /// - /// * If `capacity_to_buckets(capacity) < Group::WIDTH` and - /// `self.table.items > capacity_to_buckets(capacity)` - /// calling this function results in [`undefined behavior`]. - /// - /// * If `capacity_to_buckets(capacity) >= Group::WIDTH` and - /// `self.table.items > capacity_to_buckets(capacity)` - /// calling this function are never return (will go into an - /// infinite loop). - /// - /// See [`RawTableInner::find_insert_slot`] for more information. - /// - /// [`RawTableInner::find_insert_slot`]: RawTableInner::find_insert_slot - /// [`undefined behavior`]: https://doc.rust-lang.org/reference/behavior-considered-undefined.html - unsafe fn resize( + fn resize( &mut self, capacity: usize, hasher: impl Fn(&T) -> u64, fallibility: Fallibility, ) -> Result<(), TryReserveError> { - // SAFETY: - // 1. The caller of this function guarantees that `capacity >= self.table.items`. - // 2. We know for sure that `alloc` and `layout` matches the [`Allocator`] and - // [`TableLayout`] that were used to allocate this table. - // 3. The caller ensures that the control bytes of the `RawTableInner` - // are already initialized. - self.table.resize_inner( - &self.alloc, - capacity, - &|table, index| hasher(table.bucket::(index).as_ref()), - fallibility, - Self::TABLE_LAYOUT, - ) + unsafe { + self.table.resize_inner( + capacity, + &|table, index| hasher(table.bucket::(index).as_ref()), + fallibility, + Self::TABLE_LAYOUT, + ) + } } /// Inserts a new element into the table, and returns its raw bucket. @@ -1301,23 +1155,14 @@ #[cfg_attr(feature = "inline-more", inline)] pub fn insert(&mut self, hash: u64, value: T, hasher: impl Fn(&T) -> u64) -> Bucket { unsafe { - // SAFETY: - // 1. The [`RawTableInner`] must already have properly initialized control bytes since - // we will never expose `RawTable::new_uninitialized` in a public API. - // - // 2. We reserve additional space (if necessary) right after calling this function. let mut slot = self.table.find_insert_slot(hash); - // We can avoid growing the table once we have reached our load factor if we are replacing - // a tombstone. This works since the number of EMPTY slots does not change in this case. - // - // SAFETY: The function is guaranteed to return [`InsertSlot`] that contains an index - // in the range `0..=self.buckets()`. + // We can avoid growing the table once we have reached our load + // factor if we are replacing a tombstone. This works since the + // number of EMPTY slots does not change in this case. let old_ctrl = *self.table.ctrl(slot.index); if unlikely(self.table.growth_left == 0 && special_is_empty(old_ctrl)) { self.reserve(1, hasher); - // SAFETY: We know for sure that `RawTableInner` has control bytes - // initialized and that there is extra space in the table. slot = self.table.find_insert_slot(hash); } @@ -1416,22 +1261,13 @@ ) -> Result, InsertSlot> { self.reserve(1, hasher); - unsafe { - // SAFETY: - // 1. We know for sure that there is at least one empty `bucket` in the table. - // 2. The [`RawTableInner`] must already have properly initialized control bytes since we will - // never expose `RawTable::new_uninitialized` in a public API. - // 3. The `find_or_find_insert_slot_inner` function returns the `index` of only the full bucket, - // which is in the range `0..self.buckets()` (since there is at least one empty `bucket` in - // the table), so calling `self.bucket(index)` and `Bucket::as_ref` is safe. - match self - .table - .find_or_find_insert_slot_inner(hash, &mut |index| eq(self.bucket(index).as_ref())) - { - // SAFETY: See explanation above. - Ok(index) => Ok(self.bucket(index)), - Err(slot) => Err(slot), - } + match self + .table + .find_or_find_insert_slot_inner(hash, &mut |index| unsafe { + eq(self.bucket(index).as_ref()) + }) { + Ok(index) => Ok(unsafe { self.bucket(index) }), + Err(slot) => Err(slot), } } @@ -1456,23 +1292,14 @@ /// Searches for an element in the table. #[inline] pub fn find(&self, hash: u64, mut eq: impl FnMut(&T) -> bool) -> Option> { - unsafe { - // SAFETY: - // 1. The [`RawTableInner`] must already have properly initialized control bytes since we - // will never expose `RawTable::new_uninitialized` in a public API. - // 1. The `find_inner` function returns the `index` of only the full bucket, which is in - // the range `0..self.buckets()`, so calling `self.bucket(index)` and `Bucket::as_ref` - // is safe. - let result = self - .table - .find_inner(hash, &mut |index| eq(self.bucket(index).as_ref())); - - // Avoid `Option::map` because it bloats LLVM IR. - match result { - // SAFETY: See explanation above. - Some(index) => Some(self.bucket(index)), - None => None, - } + let result = self.table.find_inner(hash, &mut |index| unsafe { + eq(self.bucket(index).as_ref()) + }); + + // Avoid `Option::map` because it bloats LLVM IR. + match result { + Some(index) => Some(unsafe { self.bucket(index) }), + None => None, } } @@ -1596,11 +1423,11 @@ /// struct, we have to make the `iter` method unsafe. #[inline] pub unsafe fn iter(&self) -> RawIter { - // SAFETY: - // 1. The caller must uphold the safety contract for `iter` method. - // 2. The [`RawTableInner`] must already have properly initialized control bytes since - // we will never expose RawTable::new_uninitialized in a public API. - self.table.iter() + let data = Bucket::from_base_index(self.data_end(), 0); + RawIter { + iter: RawIterRange::new(self.table.ctrl.as_ptr(), data, self.table.buckets()), + items: self.table.items, + } } /// Returns an iterator over occupied buckets that could match a given hash. @@ -1640,8 +1467,8 @@ debug_assert_eq!(iter.len(), self.len()); RawDrain { iter, - table: mem::replace(&mut self.table, RawTableInner::NEW), - orig_table: NonNull::from(&mut self.table), + table: ManuallyDrop::new(mem::replace(self, Self::new_in(self.table.alloc.clone()))), + orig_table: NonNull::from(self), marker: PhantomData, } } @@ -1655,18 +1482,20 @@ pub unsafe fn into_iter_from(self, iter: RawIter) -> RawIntoIter { debug_assert_eq!(iter.len(), self.len()); + let alloc = self.table.alloc.clone(); let allocation = self.into_allocation(); RawIntoIter { iter, allocation, marker: PhantomData, + alloc, } } /// Converts the table into a raw allocation. The contents of the table /// should be dropped using a `RawIter` before freeing the allocation. #[cfg_attr(feature = "inline-more", inline)] - pub(crate) fn into_allocation(self) -> Option<(NonNull, Layout, A)> { + pub(crate) fn into_allocation(self) -> Option<(NonNull, Layout)> { let alloc = if self.table.is_empty_singleton() { None } else { @@ -1679,7 +1508,6 @@ Some(( unsafe { NonNull::new_unchecked(self.table.ctrl.as_ptr().sub(ctrl_offset)) }, layout, - unsafe { ptr::read(&self.alloc) }, )) }; mem::forget(self); @@ -1687,40 +1515,39 @@ } } -unsafe impl Send for RawTable +unsafe impl Send for RawTable where T: Send, A: Send, { } -unsafe impl Sync for RawTable +unsafe impl Sync for RawTable where T: Sync, A: Sync, { } -impl RawTableInner { - const NEW: Self = RawTableInner::new(); - +impl RawTableInner { /// Creates a new empty hash table without allocating any memory. /// /// In effect this returns a table with exactly 1 bucket. However we can /// leave the data pointer dangling since that bucket is never accessed /// due to our load factor forcing us to always have at least 1 free bucket. #[inline] - const fn new() -> Self { + const fn new_in(alloc: A) -> Self { Self { // Be careful to cast the entire slice to a raw pointer. ctrl: unsafe { NonNull::new_unchecked(Group::static_empty() as *const _ as *mut u8) }, bucket_mask: 0, items: 0, growth_left: 0, + alloc, } } } -impl RawTableInner { +impl RawTableInner { /// Allocates a new [`RawTableInner`] with the given number of buckets. /// The control bytes and buckets are left uninitialized. /// @@ -1734,15 +1561,12 @@ /// /// [`Allocator`]: https://doc.rust-lang.org/alloc/alloc/trait.Allocator.html #[cfg_attr(feature = "inline-more", inline)] - unsafe fn new_uninitialized( - alloc: &A, + unsafe fn new_uninitialized( + alloc: A, table_layout: TableLayout, buckets: usize, fallibility: Fallibility, - ) -> Result - where - A: Allocator, - { + ) -> Result { debug_assert!(buckets.is_power_of_two()); // Avoid `Option::ok_or_else` because it bloats LLVM IR. @@ -1751,7 +1575,7 @@ None => return Err(fallibility.capacity_overflow()), }; - let ptr: NonNull = match do_alloc(alloc, layout) { + let ptr: NonNull = match do_alloc(&alloc, layout) { Ok(block) => block.cast(), Err(_) => return Err(fallibility.alloc_err(layout)), }; @@ -1763,6 +1587,7 @@ bucket_mask: buckets - 1, items: 0, growth_left: bucket_mask_to_capacity(buckets - 1), + alloc, }) } @@ -1771,17 +1596,14 @@ /// /// All the control bytes are initialized with the [`EMPTY`] bytes. #[inline] - fn fallible_with_capacity( - alloc: &A, + fn fallible_with_capacity( + alloc: A, table_layout: TableLayout, capacity: usize, fallibility: Fallibility, - ) -> Result - where - A: Allocator, - { + ) -> Result { if capacity == 0 { - Ok(Self::NEW) + Ok(Self::new_in(alloc)) } else { // SAFETY: We checked that we could successfully allocate the new table, and then // initialized all control bytes with the constant `EMPTY` byte. @@ -1800,95 +1622,36 @@ } } - /// Allocates a new [`RawTableInner`] with at least enough capacity for inserting - /// the given number of elements without reallocating. - /// - /// Panics if the new capacity exceeds [`isize::MAX`] bytes and [`abort`] the program - /// in case of allocation error. Use [`fallible_with_capacity`] instead if you want to - /// handle memory allocation failure. - /// - /// All the control bytes are initialized with the [`EMPTY`] bytes. - /// - /// [`fallible_with_capacity`]: RawTableInner::fallible_with_capacity - /// [`abort`]: https://doc.rust-lang.org/alloc/alloc/fn.handle_alloc_error.html - fn with_capacity(alloc: &A, table_layout: TableLayout, capacity: usize) -> Self - where - A: Allocator, - { - // Avoid `Result::unwrap_or_else` because it bloats LLVM IR. - match Self::fallible_with_capacity(alloc, table_layout, capacity, Fallibility::Infallible) { - Ok(table_inner) => table_inner, - // SAFETY: All allocation errors will be caught inside `RawTableInner::new_uninitialized`. - Err(_) => unsafe { hint::unreachable_unchecked() }, - } - } - - /// Fixes up an insertion slot returned by the [`RawTableInner::find_insert_slot_in_group`] method. - /// - /// In tables smaller than the group width (`self.buckets() < Group::WIDTH`), trailing control - /// bytes outside the range of the table are filled with [`EMPTY`] entries. These will unfortunately - /// trigger a match of [`RawTableInner::find_insert_slot_in_group`] function. This is because - /// the `Some(bit)` returned by `group.match_empty_or_deleted().lowest_set_bit()` after masking - /// (`(probe_seq.pos + bit) & self.bucket_mask`) may point to a full bucket that is already occupied. - /// We detect this situation here and perform a second scan starting at the beginning of the table. - /// This second scan is guaranteed to find an empty slot (due to the load factor) before hitting the - /// trailing control bytes (containing [`EMPTY`] bytes). - /// - /// If this function is called correctly, it is guaranteed to return [`InsertSlot`] with an - /// index of an empty or deleted bucket in the range `0..self.buckets()` (see `Warning` and - /// `Safety`). - /// - /// # Warning - /// - /// The table must have at least 1 empty or deleted `bucket`, otherwise if the table is less than - /// the group width (`self.buckets() < Group::WIDTH`) this function returns an index outside of the - /// table indices range `0..self.buckets()` (`0..=self.bucket_mask`). Attempt to write data at that - /// index will cause immediate [`undefined behavior`]. - /// - /// # Safety - /// - /// The safety rules are directly derived from the safety rules for [`RawTableInner::ctrl`] method. - /// Thus, in order to uphold those safety contracts, as well as for the correct logic of the work - /// of this crate, the following rules are necessary and sufficient: - /// - /// * The [`RawTableInner`] must have properly initialized control bytes otherwise calling this - /// function results in [`undefined behavior`]. - /// - /// * This function must only be used on insertion slots found by [`RawTableInner::find_insert_slot_in_group`] - /// (after the `find_insert_slot_in_group` function, but before insertion into the table). - /// - /// * The `index` must not be greater than the `self.bucket_mask`, i.e. `(index + 1) <= self.buckets()` - /// (this one is provided by the [`RawTableInner::find_insert_slot_in_group`] function). - /// - /// Calling this function with an index not provided by [`RawTableInner::find_insert_slot_in_group`] - /// may result in [`undefined behavior`] even if the index satisfies the safety rules of the - /// [`RawTableInner::ctrl`] function (`index < self.bucket_mask + 1 + Group::WIDTH`). - /// - /// [`RawTableInner::ctrl`]: RawTableInner::ctrl - /// [`RawTableInner::find_insert_slot_in_group`]: RawTableInner::find_insert_slot_in_group - /// [`undefined behavior`]: https://doc.rust-lang.org/reference/behavior-considered-undefined.html + /// Fixes up an insertion slot due to false positives for groups smaller than the group width. + /// This must only be used on insertion slots found by `find_insert_slot_in_group`. #[inline] unsafe fn fix_insert_slot(&self, mut index: usize) -> InsertSlot { - // SAFETY: The caller of this function ensures that `index` is in the range `0..=self.bucket_mask`. + // In tables smaller than the group width + // (self.buckets() < Group::WIDTH), trailing control + // bytes outside the range of the table are filled with + // EMPTY entries. These will unfortunately trigger a + // match, but once masked may point to a full bucket that + // is already occupied. We detect this situation here and + // perform a second scan starting at the beginning of the + // table. This second scan is guaranteed to find an empty + // slot (due to the load factor) before hitting the trailing + // control bytes (containing EMPTY). if unlikely(self.is_bucket_full(index)) { debug_assert!(self.bucket_mask < Group::WIDTH); // SAFETY: // - // * Since the caller of this function ensures that the control bytes are properly - // initialized and `ptr = self.ctrl(0)` points to the start of the array of control - // bytes, therefore: `ctrl` is valid for reads, properly aligned to `Group::WIDTH` - // and points to the properly initialized control bytes (see also - // `TableLayout::calculate_layout_for` and `ptr::read`); - // - // * Because the caller of this function ensures that the index was provided by the - // `self.find_insert_slot_in_group()` function, so for for tables larger than the - // group width (self.buckets() >= Group::WIDTH), we will never end up in the given - // branch, since `(probe_seq.pos + bit) & self.bucket_mask` in `find_insert_slot_in_group` - // cannot return a full bucket index. For tables smaller than the group width, calling - // the `unwrap_unchecked` function is also safe, as the trailing control bytes outside - // the range of the table are filled with EMPTY bytes (and we know for sure that there - // is at least one FULL bucket), so this second scan either finds an empty slot (due to - // the load factor) or hits the trailing control bytes (containing EMPTY). + // * We are in range and `ptr = self.ctrl(0)` are valid for reads + // and properly aligned, because the table is already allocated + // (see `TableLayout::calculate_layout_for` and `ptr::read`); + // + // * For tables larger than the group width (self.buckets() >= Group::WIDTH), + // we will never end up in the given branch, since + // `(probe_seq.pos + bit) & self.bucket_mask` in `find_insert_slot_in_group` cannot + // return a full bucket index. For tables smaller than the group width, calling the + // `unwrap_unchecked` function is also + // safe, as the trailing control bytes outside the range of the table are filled + // with EMPTY bytes, so this second scan either finds an empty slot (due to the + // load factor) or hits the trailing control bytes (containing EMPTY). index = Group::load_aligned(self.ctrl(0)) .match_empty_or_deleted() .lowest_set_bit() @@ -1898,62 +1661,25 @@ } /// Finds the position to insert something in a group. - /// - /// **This may have false positives and must be fixed up with `fix_insert_slot` - /// before it's used.** - /// - /// The function is guaranteed to return the index of an empty or deleted [`Bucket`] - /// in the range `0..self.buckets()` (`0..=self.bucket_mask`). + /// This may have false positives and must be fixed up with `fix_insert_slot` before it's used. #[inline] fn find_insert_slot_in_group(&self, group: &Group, probe_seq: &ProbeSeq) -> Option { let bit = group.match_empty_or_deleted().lowest_set_bit(); if likely(bit.is_some()) { - // This is the same as `(probe_seq.pos + bit) % self.buckets()` because the number - // of buckets is a power of two, and `self.bucket_mask = self.buckets() - 1`. Some((probe_seq.pos + bit.unwrap()) & self.bucket_mask) } else { None } } - /// Searches for an element in the table, or a potential slot where that element could - /// be inserted (an empty or deleted [`Bucket`] index). + /// Searches for an element in the table, or a potential slot where that element could be + /// inserted. /// /// This uses dynamic dispatch to reduce the amount of code generated, but that is /// eliminated by LLVM optimizations. - /// - /// This function does not make any changes to the `data` part of the table, or any - /// changes to the `items` or `growth_left` field of the table. - /// - /// The table must have at least 1 empty or deleted `bucket`, otherwise, if the - /// `eq: &mut dyn FnMut(usize) -> bool` function does not return `true`, this function - /// will never return (will go into an infinite loop) for tables larger than the group - /// width, or return an index outside of the table indices range if the table is less - /// than the group width. - /// - /// This function is guaranteed to provide the `eq: &mut dyn FnMut(usize) -> bool` - /// function with only `FULL` buckets' indices and return the `index` of the found - /// element (as `Ok(index)`). If the element is not found and there is at least 1 - /// empty or deleted [`Bucket`] in the table, the function is guaranteed to return - /// [InsertSlot] with an index in the range `0..self.buckets()`, but in any case, - /// if this function returns [`InsertSlot`], it will contain an index in the range - /// `0..=self.buckets()`. - /// - /// # Safety - /// - /// The [`RawTableInner`] must have properly initialized control bytes otherwise calling - /// this function results in [`undefined behavior`]. - /// - /// Attempt to write data at the [`InsertSlot`] returned by this function when the table is - /// less than the group width and if there was not at least one empty or deleted bucket in - /// the table will cause immediate [`undefined behavior`]. This is because in this case the - /// function will return `self.bucket_mask + 1` as an index due to the trailing [`EMPTY] - /// control bytes outside the table range. - /// - /// [`undefined behavior`]: https://doc.rust-lang.org/reference/behavior-considered-undefined.html #[inline] - unsafe fn find_or_find_insert_slot_inner( + fn find_or_find_insert_slot_inner( &self, hash: u64, eq: &mut dyn FnMut(usize) -> bool, @@ -1964,21 +1690,6 @@ let mut probe_seq = self.probe_seq(hash); loop { - // SAFETY: - // * Caller of this function ensures that the control bytes are properly initialized. - // - // * `ProbeSeq.pos` cannot be greater than `self.bucket_mask = self.buckets() - 1` - // of the table due to masking with `self.bucket_mask` and also because mumber of - // buckets is a power of two (see `self.probe_seq` function). - // - // * Even if `ProbeSeq.pos` returns `position == self.bucket_mask`, it is safe to - // call `Group::load` due to the extended control bytes range, which is - // `self.bucket_mask + 1 + Group::WIDTH` (in fact, this means that the last control - // byte will never be read for the allocated table); - // - // * Also, even if `RawTableInner` is not already allocated, `ProbeSeq.pos` will - // always return "0" (zero), so Group::load will read unaligned `Group::static_empty()` - // bytes, which is safe (see RawTableInner::new). let group = unsafe { Group::load(self.ctrl(probe_seq.pos)) }; for bit in group.match_byte(h2_hash) { @@ -2002,10 +1713,6 @@ // least one. For tables smaller than the group width, there will still be an // empty element in the current (and only) group due to the load factor. unsafe { - // SAFETY: - // * Caller of this function ensures that the control bytes are properly initialized. - // - // * We use this function with the slot / index found by `self.find_insert_slot_in_group` return Err(self.fix_insert_slot(insert_slot.unwrap_unchecked())); } } @@ -2014,68 +1721,13 @@ } } - /// Searches for an empty or deleted bucket which is suitable for inserting a new - /// element and sets the hash for that slot. Returns an index of that slot and the - /// old control byte stored in the found index. - /// - /// This function does not check if the given element exists in the table. Also, - /// this function does not check if there is enough space in the table to insert - /// a new element. Caller of the funtion must make ensure that the table has at - /// least 1 empty or deleted `bucket`, otherwise this function will never return - /// (will go into an infinite loop) for tables larger than the group width, or - /// return an index outside of the table indices range if the table is less than - /// the group width. - /// - /// If there is at least 1 empty or deleted `bucket` in the table, the function is - /// guaranteed to return an `index` in the range `0..self.buckets()`, but in any case, - /// if this function returns an `index` it will be in the range `0..=self.buckets()`. - /// - /// This function does not make any changes to the `data` parts of the table, - /// or any changes to the the `items` or `growth_left` field of the table. - /// - /// # Safety - /// - /// The safety rules are directly derived from the safety rules for the - /// [`RawTableInner::set_ctrl_h2`] and [`RawTableInner::find_insert_slot`] methods. - /// Thus, in order to uphold the safety contracts for that methods, as well as for - /// the correct logic of the work of this crate, you must observe the following rules - /// when calling this function: - /// - /// * The [`RawTableInner`] has already been allocated and has properly initialized - /// control bytes otherwise calling this function results in [`undefined behavior`]. - /// - /// * The caller of this function must ensure that the "data" parts of the table - /// will have an entry in the returned index (matching the given hash) right - /// after calling this function. - /// - /// Attempt to write data at the `index` returned by this function when the table is - /// less than the group width and if there was not at least one empty or deleted bucket in - /// the table will cause immediate [`undefined behavior`]. This is because in this case the - /// function will return `self.bucket_mask + 1` as an index due to the trailing [`EMPTY] - /// control bytes outside the table range. - /// - /// The caller must independently increase the `items` field of the table, and also, - /// if the old control byte was [`EMPTY`], then decrease the table's `growth_left` - /// field, and do not change it if the old control byte was [`DELETED`]. - /// - /// See also [`Bucket::as_ptr`] method, for more information about of properly removing - /// or saving `element` from / into the [`RawTable`] / [`RawTableInner`]. + /// Searches for an empty or deleted bucket which is suitable for inserting + /// a new element and sets the hash for that slot. /// - /// [`Bucket::as_ptr`]: Bucket::as_ptr - /// [`undefined behavior`]: https://doc.rust-lang.org/reference/behavior-considered-undefined.html - /// [`RawTableInner::ctrl`]: RawTableInner::ctrl - /// [`RawTableInner::set_ctrl_h2`]: RawTableInner::set_ctrl_h2 - /// [`RawTableInner::find_insert_slot`]: RawTableInner::find_insert_slot + /// There must be at least 1 empty bucket in the table. #[inline] - unsafe fn prepare_insert_slot(&mut self, hash: u64) -> (usize, u8) { - // SAFETY: Caller of this function ensures that the control bytes are properly initialized. - let index: usize = self.find_insert_slot(hash).index; - // SAFETY: - // 1. The `find_insert_slot` function either returns an `index` less than or - // equal to `self.buckets() = self.bucket_mask + 1` of the table, or never - // returns if it cannot find an empty or deleted slot. - // 2. The caller of this function guarantees that the table has already been - // allocated + unsafe fn prepare_insert_slot(&self, hash: u64) -> (usize, u8) { + let index = self.find_insert_slot(hash).index; let old_ctrl = *self.ctrl(index); self.set_ctrl_h2(index, hash); (index, old_ctrl) @@ -2092,33 +1744,24 @@ /// width, or return an index outside of the table indices range if the table is less /// than the group width. /// - /// If there is at least 1 empty or deleted `bucket` in the table, the function is - /// guaranteed to return [`InsertSlot`] with an index in the range `0..self.buckets()`, - /// but in any case, if this function returns [`InsertSlot`], it will contain an index - /// in the range `0..=self.buckets()`. - /// - /// # Safety - /// - /// The [`RawTableInner`] must have properly initialized control bytes otherwise calling - /// this function results in [`undefined behavior`]. + /// # Note /// - /// Attempt to write data at the [`InsertSlot`] returned by this function when the table is - /// less than the group width and if there was not at least one empty or deleted bucket in - /// the table will cause immediate [`undefined behavior`]. This is because in this case the - /// function will return `self.bucket_mask + 1` as an index due to the trailing [`EMPTY] - /// control bytes outside the table range. + /// Calling this function is always safe, but attempting to write data at + /// the index returned by this function when the table is less than the group width + /// and if there was not at least one empty bucket in the table will cause immediate + /// [`undefined behavior`]. This is because in this case the function will return + /// `self.bucket_mask + 1` as an index due to the trailing EMPTY control bytes outside + /// the table range. /// /// [`undefined behavior`]: https://doc.rust-lang.org/reference/behavior-considered-undefined.html #[inline] - unsafe fn find_insert_slot(&self, hash: u64) -> InsertSlot { + fn find_insert_slot(&self, hash: u64) -> InsertSlot { let mut probe_seq = self.probe_seq(hash); loop { // SAFETY: - // * Caller of this function ensures that the control bytes are properly initialized. - // // * `ProbeSeq.pos` cannot be greater than `self.bucket_mask = self.buckets() - 1` // of the table due to masking with `self.bucket_mask` and also because mumber of - // buckets is a power of two (see `self.probe_seq` function). + // buckets is a power of two (see comment for masking below). // // * Even if `ProbeSeq.pos` returns `position == self.bucket_mask`, it is safe to // call `Group::load` due to the extended control bytes range, which is @@ -2127,16 +1770,12 @@ // // * Also, even if `RawTableInner` is not already allocated, `ProbeSeq.pos` will // always return "0" (zero), so Group::load will read unaligned `Group::static_empty()` - // bytes, which is safe (see RawTableInner::new). - let group = unsafe { Group::load(self.ctrl(probe_seq.pos)) }; + // bytes, which is safe (see RawTableInner::new_in). + unsafe { + let group = Group::load(self.ctrl(probe_seq.pos)); + let index = self.find_insert_slot_in_group(&group, &probe_seq); - let index = self.find_insert_slot_in_group(&group, &probe_seq); - if likely(index.is_some()) { - // SAFETY: - // * Caller of this function ensures that the control bytes are properly initialized. - // - // * We use this function with the slot / index found by `self.find_insert_slot_in_group` - unsafe { + if likely(index.is_some()) { return self.fix_insert_slot(index.unwrap_unchecked()); } } @@ -2154,27 +1793,13 @@ /// The table must have at least 1 empty `bucket`, otherwise, if the /// `eq: &mut dyn FnMut(usize) -> bool` function does not return `true`, /// this function will also never return (will go into an infinite loop). - /// - /// This function is guaranteed to provide the `eq: &mut dyn FnMut(usize) -> bool` - /// function with only `FULL` buckets' indices and return the `index` of the found - /// element as `Some(index)`, so the index will always be in the range - /// `0..self.buckets()`. - /// - /// # Safety - /// - /// The [`RawTableInner`] must have properly initialized control bytes otherwise calling - /// this function results in [`undefined behavior`]. - /// - /// [`undefined behavior`]: https://doc.rust-lang.org/reference/behavior-considered-undefined.html #[inline(always)] - unsafe fn find_inner(&self, hash: u64, eq: &mut dyn FnMut(usize) -> bool) -> Option { + fn find_inner(&self, hash: u64, eq: &mut dyn FnMut(usize) -> bool) -> Option { let h2_hash = h2(hash); let mut probe_seq = self.probe_seq(hash); loop { // SAFETY: - // * Caller of this function ensures that the control bytes are properly initialized. - // // * `ProbeSeq.pos` cannot be greater than `self.bucket_mask = self.buckets() - 1` // of the table due to masking with `self.bucket_mask`. // @@ -2228,9 +1853,6 @@ /// to do during the first insert due to tombstones). If the caller does not do /// this, then calling this function may result in a memory leak. /// - /// * The [`RawTableInner`] must have properly initialized control bytes otherwise - /// calling this function results in [`undefined behavior`]. - /// /// Calling this function on a table that has not been allocated results in /// [`undefined behavior`]. /// @@ -2278,332 +1900,27 @@ } } - /// Returns an iterator over every element in the table. - /// - /// # Safety - /// - /// If any of the following conditions are violated, the result - /// is [`undefined behavior`]: - /// - /// * The caller has to ensure that the `RawTableInner` outlives the - /// `RawIter`. Because we cannot make the `next` method unsafe on - /// the `RawIter` struct, we have to make the `iter` method unsafe. - /// - /// * The [`RawTableInner`] must have properly initialized control bytes. - /// - /// The type `T` must be the actual type of the elements stored in the table, - /// otherwise using the returned [`RawIter`] results in [`undefined behavior`]. - /// - /// [`undefined behavior`]: https://doc.rust-lang.org/reference/behavior-considered-undefined.html #[inline] - unsafe fn iter(&self) -> RawIter { - // SAFETY: - // 1. Since the caller of this function ensures that the control bytes - // are properly initialized and `self.data_end()` points to the start - // of the array of control bytes, therefore: `ctrl` is valid for reads, - // properly aligned to `Group::WIDTH` and points to the properly initialized - // control bytes. - // 2. `data` bucket index in the table is equal to the `ctrl` index (i.e. - // equal to zero). - // 3. We pass the exact value of buckets of the table to the function. - // - // `ctrl` points here (to the start - // of the first control byte `CT0`) - // ∨ - // [Pad], T_n, ..., T1, T0, |CT0, CT1, ..., CT_n|, CTa_0, CTa_1, ..., CTa_m - // \________ ________/ - // \/ - // `n = buckets - 1`, i.e. `RawTableInner::buckets() - 1` - // - // where: T0...T_n - our stored data; - // CT0...CT_n - control bytes or metadata for `data`. - // CTa_0...CTa_m - additional control bytes, where `m = Group::WIDTH - 1` (so that the search - // with loading `Group` bytes from the heap works properly, even if the result - // of `h1(hash) & self.bucket_mask` is equal to `self.bucket_mask`). See also - // `RawTableInner::set_ctrl` function. - // - // P.S. `h1(hash) & self.bucket_mask` is the same as `hash as usize % self.buckets()` because the number - // of buckets is a power of two, and `self.bucket_mask = self.buckets() - 1`. - let data = Bucket::from_base_index(self.data_end(), 0); - RawIter { - // SAFETY: See explanation above - iter: RawIterRange::new(self.ctrl.as_ptr(), data, self.buckets()), - items: self.items, - } + unsafe fn bucket(&self, index: usize) -> Bucket { + debug_assert_ne!(self.bucket_mask, 0); + debug_assert!(index < self.buckets()); + Bucket::from_base_index(self.data_end(), index) } - /// Executes the destructors (if any) of the values stored in the table. - /// - /// # Note - /// - /// This function does not erase the control bytes of the table and does - /// not make any changes to the `items` or `growth_left` fields of the - /// table. If necessary, the caller of this function must manually set - /// up these table fields, for example using the [`clear_no_drop`] function. - /// - /// Be careful during calling this function, because drop function of - /// the elements can panic, and this can leave table in an inconsistent - /// state. - /// - /// # Safety - /// - /// The type `T` must be the actual type of the elements stored in the table, - /// otherwise calling this function may result in [`undefined behavior`]. - /// - /// If `T` is a type that should be dropped and **the table is not empty**, - /// calling this function more than once results in [`undefined behavior`]. - /// - /// If `T` is not [`Copy`], attempting to use values stored in the table after - /// calling this function may result in [`undefined behavior`]. - /// - /// It is safe to call this function on a table that has not been allocated, - /// on a table with uninitialized control bytes, and on a table with no actual - /// data but with `Full` control bytes if `self.items == 0`. - /// - /// See also [`Bucket::drop`] / [`Bucket::as_ptr`] methods, for more information - /// about of properly removing or saving `element` from / into the [`RawTable`] / - /// [`RawTableInner`]. - /// - /// [`Bucket::drop`]: Bucket::drop - /// [`Bucket::as_ptr`]: Bucket::as_ptr - /// [`clear_no_drop`]: RawTableInner::clear_no_drop - /// [`undefined behavior`]: https://doc.rust-lang.org/reference/behavior-considered-undefined.html - unsafe fn drop_elements(&mut self) { - // Check that `self.items != 0`. Protects against the possibility - // of creating an iterator on an table with uninitialized control bytes. - if T::NEEDS_DROP && self.items != 0 { - // SAFETY: We know for sure that RawTableInner will outlive the - // returned `RawIter` iterator, and the caller of this function - // must uphold the safety contract for `drop_elements` method. - for item in self.iter::() { - // SAFETY: The caller must uphold the safety contract for - // `drop_elements` method. - item.drop(); - } - } - } - - /// Executes the destructors (if any) of the values stored in the table and than - /// deallocates the table. - /// - /// # Note - /// - /// Calling this function automatically makes invalid (dangling) all instances of - /// buckets ([`Bucket`]) and makes invalid (dangling) the `ctrl` field of the table. - /// - /// This function does not make any changes to the `bucket_mask`, `items` or `growth_left` - /// fields of the table. If necessary, the caller of this function must manually set - /// up these table fields. - /// - /// # Safety - /// - /// If any of the following conditions are violated, the result is [`undefined behavior`]: - /// - /// * Calling this function more than once; - /// - /// * The type `T` must be the actual type of the elements stored in the table. - /// - /// * The `alloc` must be the same [`Allocator`] as the `Allocator` that was used - /// to allocate this table. - /// - /// * The `table_layout` must be the same [`TableLayout`] as the `TableLayout` that - /// was used to allocate this table. - /// - /// The caller of this function should pay attention to the possibility of the - /// elements' drop function panicking, because this: - /// - /// * May leave the table in an inconsistent state; - /// - /// * Memory is never deallocated, so a memory leak may occur. - /// - /// Attempt to use the `ctrl` field of the table (dereference) after calling this - /// function results in [`undefined behavior`]. - /// - /// It is safe to call this function on a table that has not been allocated, - /// on a table with uninitialized control bytes, and on a table with no actual - /// data but with `Full` control bytes if `self.items == 0`. - /// - /// See also [`RawTableInner::drop_elements`] or [`RawTableInner::free_buckets`] - /// for more information. - /// - /// [`RawTableInner::drop_elements`]: RawTableInner::drop_elements - /// [`RawTableInner::free_buckets`]: RawTableInner::free_buckets - /// [`undefined behavior`]: https://doc.rust-lang.org/reference/behavior-considered-undefined.html - unsafe fn drop_inner_table(&mut self, alloc: &A, table_layout: TableLayout) { - if !self.is_empty_singleton() { - unsafe { - // SAFETY: The caller must uphold the safety contract for `drop_inner_table` method. - self.drop_elements::(); - // SAFETY: - // 1. We have checked that our table is allocated. - // 2. The caller must uphold the safety contract for `drop_inner_table` method. - self.free_buckets(alloc, table_layout); - } - } - } - - /// Returns a pointer to an element in the table (convenience for - /// `Bucket::from_base_index(self.data_end::(), index)`). - /// - /// The caller must ensure that the `RawTableInner` outlives the returned [`Bucket`], - /// otherwise using it may result in [`undefined behavior`]. - /// - /// # Safety - /// - /// If `mem::size_of::() != 0`, then the safety rules are directly derived from the - /// safety rules of the [`Bucket::from_base_index`] function. Therefore, when calling - /// this function, the following safety rules must be observed: - /// - /// * The table must already be allocated; - /// - /// * The `index` must not be greater than the number returned by the [`RawTableInner::buckets`] - /// function, i.e. `(index + 1) <= self.buckets()`. - /// - /// * The type `T` must be the actual type of the elements stored in the table, otherwise - /// using the returned [`Bucket`] may result in [`undefined behavior`]. - /// - /// It is safe to call this function with index of zero (`index == 0`) on a table that has - /// not been allocated, but using the returned [`Bucket`] results in [`undefined behavior`]. - /// - /// If `mem::size_of::() == 0`, then the only requirement is that the `index` must - /// not be greater than the number returned by the [`RawTable::buckets`] function, i.e. - /// `(index + 1) <= self.buckets()`. - /// - /// ```none - /// If mem::size_of::() != 0 then return a pointer to the `element` in the `data part` of the table - /// (we start counting from "0", so that in the expression T[n], the "n" index actually one less than - /// the "buckets" number of our `RawTableInner`, i.e. "n = RawTableInner::buckets() - 1"): - /// - /// `table.bucket(3).as_ptr()` returns a pointer that points here in the `data` - /// part of the `RawTableInner`, i.e. to the start of T3 (see [`Bucket::as_ptr`]) - /// | - /// | `base = table.data_end::()` points here - /// | (to the start of CT0 or to the end of T0) - /// v v - /// [Pad], T_n, ..., |T3|, T2, T1, T0, |CT0, CT1, CT2, CT3, ..., CT_n, CTa_0, CTa_1, ..., CTa_m - /// ^ \__________ __________/ - /// `table.bucket(3)` returns a pointer that points \/ - /// here in the `data` part of the `RawTableInner` additional control bytes - /// (to the end of T3) `m = Group::WIDTH - 1` - /// - /// where: T0...T_n - our stored data; - /// CT0...CT_n - control bytes or metadata for `data`; - /// CTa_0...CTa_m - additional control bytes (so that the search with loading `Group` bytes from - /// the heap works properly, even if the result of `h1(hash) & self.bucket_mask` - /// is equal to `self.bucket_mask`). See also `RawTableInner::set_ctrl` function. - /// - /// P.S. `h1(hash) & self.bucket_mask` is the same as `hash as usize % self.buckets()` because the number - /// of buckets is a power of two, and `self.bucket_mask = self.buckets() - 1`. - /// ``` - /// - /// [`Bucket::from_base_index`]: Bucket::from_base_index - /// [`RawTableInner::buckets`]: RawTableInner::buckets - /// [`undefined behavior`]: https://doc.rust-lang.org/reference/behavior-considered-undefined.html - #[inline] - unsafe fn bucket(&self, index: usize) -> Bucket { - debug_assert_ne!(self.bucket_mask, 0); - debug_assert!(index < self.buckets()); - Bucket::from_base_index(self.data_end(), index) - } - - /// Returns a raw `*mut u8` pointer to the start of the `data` element in the table - /// (convenience for `self.data_end::().as_ptr().sub((index + 1) * size_of)`). - /// - /// The caller must ensure that the `RawTableInner` outlives the returned `*mut u8`, - /// otherwise using it may result in [`undefined behavior`]. - /// - /// # Safety - /// - /// If any of the following conditions are violated, the result is [`undefined behavior`]: - /// - /// * The table must already be allocated; - /// - /// * The `index` must not be greater than the number returned by the [`RawTableInner::buckets`] - /// function, i.e. `(index + 1) <= self.buckets()`; - /// - /// * The `size_of` must be equal to the size of the elements stored in the table; - /// - /// ```none - /// If mem::size_of::() != 0 then return a pointer to the `element` in the `data part` of the table - /// (we start counting from "0", so that in the expression T[n], the "n" index actually one less than - /// the "buckets" number of our `RawTableInner`, i.e. "n = RawTableInner::buckets() - 1"): - /// - /// `table.bucket_ptr(3, mem::size_of::())` returns a pointer that points here in the - /// `data` part of the `RawTableInner`, i.e. to the start of T3 - /// | - /// | `base = table.data_end::()` points here - /// | (to the start of CT0 or to the end of T0) - /// v v - /// [Pad], T_n, ..., |T3|, T2, T1, T0, |CT0, CT1, CT2, CT3, ..., CT_n, CTa_0, CTa_1, ..., CTa_m - /// \__________ __________/ - /// \/ - /// additional control bytes - /// `m = Group::WIDTH - 1` - /// - /// where: T0...T_n - our stored data; - /// CT0...CT_n - control bytes or metadata for `data`; - /// CTa_0...CTa_m - additional control bytes (so that the search with loading `Group` bytes from - /// the heap works properly, even if the result of `h1(hash) & self.bucket_mask` - /// is equal to `self.bucket_mask`). See also `RawTableInner::set_ctrl` function. - /// - /// P.S. `h1(hash) & self.bucket_mask` is the same as `hash as usize % self.buckets()` because the number - /// of buckets is a power of two, and `self.bucket_mask = self.buckets() - 1`. - /// ``` - /// - /// [`RawTableInner::buckets`]: RawTableInner::buckets - /// [`undefined behavior`]: https://doc.rust-lang.org/reference/behavior-considered-undefined.html - #[inline] - unsafe fn bucket_ptr(&self, index: usize, size_of: usize) -> *mut u8 { - debug_assert_ne!(self.bucket_mask, 0); - debug_assert!(index < self.buckets()); - let base: *mut u8 = self.data_end().as_ptr(); - base.sub((index + 1) * size_of) - } - - /// Returns pointer to one past last `data` element in the the table as viewed from - /// the start point of the allocation (convenience for `self.ctrl.cast()`). - /// - /// This function actually returns a pointer to the end of the `data element` at - /// index "0" (zero). - /// - /// The caller must ensure that the `RawTableInner` outlives the returned [`NonNull`], - /// otherwise using it may result in [`undefined behavior`]. - /// - /// # Note - /// - /// The type `T` must be the actual type of the elements stored in the table, otherwise - /// using the returned [`NonNull`] may result in [`undefined behavior`]. - /// - /// ```none - /// `table.data_end::()` returns pointer that points here - /// (to the end of `T0`) - /// ∨ - /// [Pad], T_n, ..., T1, T0, |CT0, CT1, ..., CT_n|, CTa_0, CTa_1, ..., CTa_m - /// \________ ________/ - /// \/ - /// `n = buckets - 1`, i.e. `RawTableInner::buckets() - 1` - /// - /// where: T0...T_n - our stored data; - /// CT0...CT_n - control bytes or metadata for `data`. - /// CTa_0...CTa_m - additional control bytes, where `m = Group::WIDTH - 1` (so that the search - /// with loading `Group` bytes from the heap works properly, even if the result - /// of `h1(hash) & self.bucket_mask` is equal to `self.bucket_mask`). See also - /// `RawTableInner::set_ctrl` function. - /// - /// P.S. `h1(hash) & self.bucket_mask` is the same as `hash as usize % self.buckets()` because the number - /// of buckets is a power of two, and `self.bucket_mask = self.buckets() - 1`. - /// ``` - /// - /// [`undefined behavior`]: https://doc.rust-lang.org/reference/behavior-considered-undefined.html - #[inline] - fn data_end(&self) -> NonNull { - unsafe { - // SAFETY: `self.ctrl` is `NonNull`, so casting it is safe - NonNull::new_unchecked(self.ctrl.as_ptr().cast()) - } - } - - /// Returns an iterator-like object for a probe sequence on the table. + #[inline] + unsafe fn bucket_ptr(&self, index: usize, size_of: usize) -> *mut u8 { + debug_assert_ne!(self.bucket_mask, 0); + debug_assert!(index < self.buckets()); + let base: *mut u8 = self.data_end().as_ptr(); + base.sub((index + 1) * size_of) + } + + #[inline] + unsafe fn data_end(&self) -> NonNull { + NonNull::new_unchecked(self.ctrl.as_ptr().cast()) + } + + /// Returns an iterator-like object for a probe sequence on the table. /// /// This iterator never terminates, but is guaranteed to visit each bucket /// group exactly once. The loop using `probe_seq` must terminate upon @@ -2611,8 +1928,6 @@ #[inline] fn probe_seq(&self, hash: u64) -> ProbeSeq { ProbeSeq { - // This is the same as `hash as usize % self.buckets()` because the number - // of buckets is a power of two, and `self.bucket_mask = self.buckets() - 1`. pos: h1(hash) & self.bucket_mask, stride: 0, } @@ -2676,7 +1991,7 @@ /// [`Bucket::as_ptr`]: Bucket::as_ptr /// [`undefined behavior`]: https://doc.rust-lang.org/reference/behavior-considered-undefined.html #[inline] - unsafe fn set_ctrl_h2(&mut self, index: usize, hash: u64) { + unsafe fn set_ctrl_h2(&self, index: usize, hash: u64) { // SAFETY: The caller must uphold the safety rules for the [`RawTableInner::set_ctrl_h2`] self.set_ctrl(index, h2(hash)); } @@ -2710,7 +2025,7 @@ /// [`Bucket::as_ptr`]: Bucket::as_ptr /// [`undefined behavior`]: https://doc.rust-lang.org/reference/behavior-considered-undefined.html #[inline] - unsafe fn replace_ctrl_h2(&mut self, index: usize, hash: u64) -> u8 { + unsafe fn replace_ctrl_h2(&self, index: usize, hash: u64) -> u8 { // SAFETY: The caller must uphold the safety rules for the [`RawTableInner::replace_ctrl_h2`] let prev_ctrl = *self.ctrl(index); self.set_ctrl_h2(index, hash); @@ -2742,12 +2057,9 @@ /// [`Bucket::as_ptr`]: Bucket::as_ptr /// [`undefined behavior`]: https://doc.rust-lang.org/reference/behavior-considered-undefined.html #[inline] - unsafe fn set_ctrl(&mut self, index: usize, ctrl: u8) { + unsafe fn set_ctrl(&self, index: usize, ctrl: u8) { // Replicate the first Group::WIDTH control bytes at the end of - // the array without using a branch. If the tables smaller than - // the group width (self.buckets() < Group::WIDTH), - // `index2 = Group::WIDTH + index`, otherwise `index2` is: - // + // the array without using a branch: // - If index >= Group::WIDTH then index == index2. // - Otherwise index2 == self.bucket_mask + 1 + index. // @@ -2830,45 +2142,25 @@ self.bucket_mask == 0 } - /// Attempts to allocate a new hash table with at least enough capacity - /// for inserting the given number of elements without reallocating, - /// and return it inside ScopeGuard to protect against panic in the hash - /// function. - /// - /// # Note - /// - /// It is recommended (but not required): - /// - /// * That the new table's `capacity` be greater than or equal to `self.items`. - /// - /// * The `alloc` is the same [`Allocator`] as the `Allocator` used - /// to allocate this table. - /// - /// * The `table_layout` is the same [`TableLayout`] as the `TableLayout` used - /// to allocate this table. - /// - /// If `table_layout` does not match the `TableLayout` that was used to allocate - /// this table, then using `mem::swap` with the `self` and the new table returned - /// by this function results in [`undefined behavior`]. - /// - /// [`undefined behavior`]: https://doc.rust-lang.org/reference/behavior-considered-undefined.html #[allow(clippy::mut_mut)] #[inline] - fn prepare_resize<'a, A>( + unsafe fn prepare_resize( &self, - alloc: &'a A, table_layout: TableLayout, capacity: usize, fallibility: Fallibility, - ) -> Result, TryReserveError> - where - A: Allocator, - { + ) -> Result, TryReserveError> { debug_assert!(self.items <= capacity); // Allocate and initialize the new table. - let new_table = - RawTableInner::fallible_with_capacity(alloc, table_layout, capacity, fallibility)?; + let mut new_table = RawTableInner::fallible_with_capacity( + self.alloc.clone(), + table_layout, + capacity, + fallibility, + )?; + new_table.growth_left -= self.items; + new_table.items = self.items; // The hash function may panic, in which case we simply free the new // table without dropping any elements that may have been copied into @@ -2878,11 +2170,7 @@ // the comment at the bottom of this function. Ok(guard(new_table, move |self_| { if !self_.is_empty_singleton() { - // SAFETY: - // 1. We have checked that our table is allocated. - // 2. We know for sure that the `alloc` and `table_layout` matches the - // [`Allocator`] and [`TableLayout`] used to allocate this table. - unsafe { self_.free_buckets(alloc, table_layout) }; + self_.free_buckets(table_layout); } })) } @@ -2891,38 +2179,16 @@ /// /// This uses dynamic dispatch to reduce the amount of /// code generated, but it is eliminated by LLVM optimizations when inlined. - /// - /// # Safety - /// - /// If any of the following conditions are violated, the result is - /// [`undefined behavior`]: - /// - /// * The `alloc` must be the same [`Allocator`] as the `Allocator` used - /// to allocate this table. - /// - /// * The `layout` must be the same [`TableLayout`] as the `TableLayout` - /// used to allocate this table. - /// - /// * The `drop` function (`fn(*mut u8)`) must be the actual drop function of - /// the elements stored in the table. - /// - /// * The [`RawTableInner`] must have properly initialized control bytes. - /// - /// [`undefined behavior`]: https://doc.rust-lang.org/reference/behavior-considered-undefined.html #[allow(clippy::inline_always)] #[inline(always)] - unsafe fn reserve_rehash_inner( + unsafe fn reserve_rehash_inner( &mut self, - alloc: &A, additional: usize, hasher: &dyn Fn(&mut Self, usize) -> u64, fallibility: Fallibility, layout: TableLayout, drop: Option, - ) -> Result<(), TryReserveError> - where - A: Allocator, - { + ) -> Result<(), TryReserveError> { // Avoid `Option::ok_or_else` because it bloats LLVM IR. let new_items = match self.items.checked_add(additional) { Some(new_items) => new_items, @@ -2932,30 +2198,12 @@ if new_items <= full_capacity / 2 { // Rehash in-place without re-allocating if we have plenty of spare // capacity that is locked up due to DELETED entries. - - // SAFETY: - // 1. We know for sure that `[`RawTableInner`]` has already been allocated - // (since new_items <= full_capacity / 2); - // 2. The caller ensures that `drop` function is the actual drop function of - // the elements stored in the table. - // 3. The caller ensures that `layout` matches the [`TableLayout`] that was - // used to allocate this table. - // 4. The caller ensures that the control bytes of the `RawTableInner` - // are already initialized. self.rehash_in_place(hasher, layout.size, drop); Ok(()) } else { // Otherwise, conservatively resize to at least the next size up // to avoid churning deletes into frequent rehashes. - // - // SAFETY: - // 1. We know for sure that `capacity >= self.items`. - // 2. The caller ensures that `alloc` and `layout` matches the [`Allocator`] and - // [`TableLayout`] that were used to allocate this table. - // 3. The caller ensures that the control bytes of the `RawTableInner` - // are already initialized. self.resize_inner( - alloc, usize::max(new_items, full_capacity + 1), hasher, fallibility, @@ -2964,160 +2212,48 @@ } } - /// Returns an iterator over full buckets indices in the table. - /// - /// # Safety - /// - /// Behavior is undefined if any of the following conditions are violated: - /// - /// * The caller has to ensure that the `RawTableInner` outlives the - /// `FullBucketsIndices`. Because we cannot make the `next` method - /// unsafe on the `FullBucketsIndices` struct, we have to make the - /// `full_buckets_indices` method unsafe. - /// - /// * The [`RawTableInner`] must have properly initialized control bytes. - #[inline(always)] - unsafe fn full_buckets_indices(&self) -> FullBucketsIndices { - // SAFETY: - // 1. Since the caller of this function ensures that the control bytes - // are properly initialized and `self.ctrl(0)` points to the start - // of the array of control bytes, therefore: `ctrl` is valid for reads, - // properly aligned to `Group::WIDTH` and points to the properly initialized - // control bytes. - // 2. The value of `items` is equal to the amount of data (values) added - // to the table. - // - // `ctrl` points here (to the start - // of the first control byte `CT0`) - // ∨ - // [Pad], T_n, ..., T1, T0, |CT0, CT1, ..., CT_n|, Group::WIDTH - // \________ ________/ - // \/ - // `n = buckets - 1`, i.e. `RawTableInner::buckets() - 1` - // - // where: T0...T_n - our stored data; - // CT0...CT_n - control bytes or metadata for `data`. - let ctrl = NonNull::new_unchecked(self.ctrl(0)); - - FullBucketsIndices { - // Load the first group - // SAFETY: See explanation above. - current_group: Group::load_aligned(ctrl.as_ptr()).match_full().into_iter(), - group_first_index: 0, - ctrl, - items: self.items, - } - } - /// Allocates a new table of a different size and moves the contents of the /// current table into it. /// /// This uses dynamic dispatch to reduce the amount of /// code generated, but it is eliminated by LLVM optimizations when inlined. - /// - /// # Safety - /// - /// If any of the following conditions are violated, the result is - /// [`undefined behavior`]: - /// - /// * The `alloc` must be the same [`Allocator`] as the `Allocator` used - /// to allocate this table; - /// - /// * The `layout` must be the same [`TableLayout`] as the `TableLayout` - /// used to allocate this table; - /// - /// * The [`RawTableInner`] must have properly initialized control bytes. - /// - /// The caller of this function must ensure that `capacity >= self.items` - /// otherwise: - /// - /// * If `self.items != 0`, calling of this function with `capacity == 0` - /// results in [`undefined behavior`]. - /// - /// * If `capacity_to_buckets(capacity) < Group::WIDTH` and - /// `self.items > capacity_to_buckets(capacity)` calling this function - /// results in [`undefined behavior`]. - /// - /// * If `capacity_to_buckets(capacity) >= Group::WIDTH` and - /// `self.items > capacity_to_buckets(capacity)` calling this function - /// are never return (will go into an infinite loop). - /// - /// Note: It is recommended (but not required) that the new table's `capacity` - /// be greater than or equal to `self.items`. In case if `capacity <= self.items` - /// this function can never return. See [`RawTableInner::find_insert_slot`] for - /// more information. - /// - /// [`RawTableInner::find_insert_slot`]: RawTableInner::find_insert_slot - /// [`undefined behavior`]: https://doc.rust-lang.org/reference/behavior-considered-undefined.html #[allow(clippy::inline_always)] #[inline(always)] - unsafe fn resize_inner( + unsafe fn resize_inner( &mut self, - alloc: &A, capacity: usize, hasher: &dyn Fn(&mut Self, usize) -> u64, fallibility: Fallibility, layout: TableLayout, - ) -> Result<(), TryReserveError> - where - A: Allocator, - { - // SAFETY: We know for sure that `alloc` and `layout` matches the [`Allocator`] and [`TableLayout`] - // that were used to allocate this table. - let mut new_table = self.prepare_resize(alloc, layout, capacity, fallibility)?; - - // SAFETY: We know for sure that RawTableInner will outlive the - // returned `FullBucketsIndices` iterator, and the caller of this - // function ensures that the control bytes are properly initialized. - for full_byte_index in self.full_buckets_indices() { + ) -> Result<(), TryReserveError> { + let mut new_table = self.prepare_resize(layout, capacity, fallibility)?; + + // Copy all elements to the new table. + for i in 0..self.buckets() { + if !self.is_bucket_full(i) { + continue; + } + // This may panic. - let hash = hasher(self, full_byte_index); + let hash = hasher(self, i); - // SAFETY: // We can use a simpler version of insert() here since: - // 1. There are no DELETED entries. - // 2. We know there is enough space in the table. - // 3. All elements are unique. - // 4. The caller of this function guarantees that `capacity > 0` - // so `new_table` must already have some allocated memory. - // 5. We set `growth_left` and `items` fields of the new table - // after the loop. - // 6. We insert into the table, at the returned index, the data - // matching the given hash immediately after calling this function. - let (new_index, _) = new_table.prepare_insert_slot(hash); + // - there are no DELETED entries. + // - we know there is enough space in the table. + // - all elements are unique. + let (index, _) = new_table.prepare_insert_slot(hash); - // SAFETY: - // - // * `src` is valid for reads of `layout.size` bytes, since the - // table is alive and the `full_byte_index` is guaranteed to be - // within bounds (see `FullBucketsIndices::next_impl`); - // - // * `dst` is valid for writes of `layout.size` bytes, since the - // caller ensures that `table_layout` matches the [`TableLayout`] - // that was used to allocate old table and we have the `new_index` - // returned by `prepare_insert_slot`. - // - // * Both `src` and `dst` are properly aligned. - // - // * Both `src` and `dst` point to different region of memory. ptr::copy_nonoverlapping( - self.bucket_ptr(full_byte_index, layout.size), - new_table.bucket_ptr(new_index, layout.size), + self.bucket_ptr(i, layout.size), + new_table.bucket_ptr(index, layout.size), layout.size, ); } - // The hash function didn't panic, so we can safely set the - // `growth_left` and `items` fields of the new table. - new_table.growth_left -= self.items; - new_table.items = self.items; - // We successfully copied all elements without panicking. Now replace // self with the new table. The old table will have its memory freed but // the items will not be dropped (since they have been moved into the // new table). - // SAFETY: The caller ensures that `table_layout` matches the [`TableLayout`] - // that was used to allocate this table. mem::swap(self, &mut new_table); Ok(()) @@ -3130,21 +2266,6 @@ /// /// This uses dynamic dispatch to reduce the amount of /// code generated, but it is eliminated by LLVM optimizations when inlined. - /// - /// # Safety - /// - /// If any of the following conditions are violated, the result is [`undefined behavior`]: - /// - /// * The `size_of` must be equal to the size of the elements stored in the table; - /// - /// * The `drop` function (`fn(*mut u8)`) must be the actual drop function of - /// the elements stored in the table. - /// - /// * The [`RawTableInner`] has already been allocated; - /// - /// * The [`RawTableInner`] must have properly initialized control bytes. - /// - /// [`undefined behavior`]: https://doc.rust-lang.org/reference/behavior-considered-undefined.html #[allow(clippy::inline_always)] #[cfg_attr(feature = "inline-more", inline(always))] #[cfg_attr(not(feature = "inline-more"), inline)] @@ -3188,9 +2309,6 @@ let hash = hasher(*guard, i); // Search for a suitable place to put it - // - // SAFETY: Caller of this function ensures that the control bytes - // are properly initialized. let new_i = guard.find_insert_slot(hash).index; // Probing works by scanning through all of the control @@ -3231,64 +2349,14 @@ mem::forget(guard); } - /// Deallocates the table without dropping any entries. - /// - /// # Note - /// - /// This function must be called only after [`drop_elements`](RawTableInner::drop_elements), - /// else it can lead to leaking of memory. Also calling this function automatically - /// makes invalid (dangling) all instances of buckets ([`Bucket`]) and makes invalid - /// (dangling) the `ctrl` field of the table. - /// - /// # Safety - /// - /// If any of the following conditions are violated, the result is [`Undefined Behavior`]: - /// - /// * The [`RawTableInner`] has already been allocated; - /// - /// * The `alloc` must be the same [`Allocator`] as the `Allocator` that was used - /// to allocate this table. - /// - /// * The `table_layout` must be the same [`TableLayout`] as the `TableLayout` that was used - /// to allocate this table. - /// - /// See also [`GlobalAlloc::dealloc`] or [`Allocator::deallocate`] for more information. - /// - /// [`Undefined Behavior`]: https://doc.rust-lang.org/reference/behavior-considered-undefined.html - /// [`GlobalAlloc::dealloc`]: https://doc.rust-lang.org/alloc/alloc/trait.GlobalAlloc.html#tymethod.dealloc - /// [`Allocator::deallocate`]: https://doc.rust-lang.org/alloc/alloc/trait.Allocator.html#tymethod.deallocate #[inline] - unsafe fn free_buckets(&mut self, alloc: &A, table_layout: TableLayout) - where - A: Allocator, - { - // SAFETY: The caller must uphold the safety contract for `free_buckets` - // method. + unsafe fn free_buckets(&mut self, table_layout: TableLayout) { let (ptr, layout) = self.allocation_info(table_layout); - alloc.deallocate(ptr, layout); + self.alloc.deallocate(ptr, layout); } - /// Returns a pointer to the allocated memory and the layout that was used to - /// allocate the table. - /// - /// # Safety - /// - /// Caller of this function must observe the following safety rules: - /// - /// * The [`RawTableInner`] has already been allocated, otherwise - /// calling this function results in [`undefined behavior`] - /// - /// * The `table_layout` must be the same [`TableLayout`] as the `TableLayout` - /// that was used to allocate this table. Failure to comply with this condition - /// may result in [`undefined behavior`]. - /// - /// See also [`GlobalAlloc::dealloc`] or [`Allocator::deallocate`] for more information. - /// - /// [`undefined behavior`]: https://doc.rust-lang.org/reference/behavior-considered-undefined.html - /// [`GlobalAlloc::dealloc`]: https://doc.rust-lang.org/alloc/alloc/trait.GlobalAlloc.html#tymethod.dealloc - /// [`Allocator::deallocate`]: https://doc.rust-lang.org/alloc/alloc/trait.Allocator.html#tymethod.deallocate #[inline] - unsafe fn allocation_info(&self, table_layout: TableLayout) -> (NonNull, Layout) { + fn allocation_info(&self, table_layout: TableLayout) -> (NonNull, Layout) { debug_assert!( !self.is_empty_singleton(), "this function can only be called on non-empty tables" @@ -3300,37 +2368,17 @@ None => unsafe { hint::unreachable_unchecked() }, }; ( - // SAFETY: The caller must uphold the safety contract for `allocation_info` method. unsafe { NonNull::new_unchecked(self.ctrl.as_ptr().sub(ctrl_offset)) }, layout, ) } - /// Returns a pointer to the allocated memory and the layout that was used to - /// allocate the table. If [`RawTableInner`] has not been allocated, this - /// function return `dangling` pointer and `()` (unit) layout. - /// - /// # Safety - /// - /// The `table_layout` must be the same [`TableLayout`] as the `TableLayout` - /// that was used to allocate this table. Failure to comply with this condition - /// may result in [`undefined behavior`]. - /// - /// See also [`GlobalAlloc::dealloc`] or [`Allocator::deallocate`] for more information. - /// - /// [`undefined behavior`]: https://doc.rust-lang.org/reference/behavior-considered-undefined.html - /// [`GlobalAlloc::dealloc`]: https://doc.rust-lang.org/alloc/alloc/trait.GlobalAlloc.html#tymethod.dealloc - /// [`Allocator::deallocate`]: https://doc.rust-lang.org/alloc/alloc/trait.Allocator.html#tymethod.deallocate #[cfg(feature = "raw")] - unsafe fn allocation_info_or_zero(&self, table_layout: TableLayout) -> (NonNull, Layout) { + fn allocation_info_or_zero(&self, table_layout: TableLayout) -> (NonNull, Layout) { if self.is_empty_singleton() { (NonNull::dangling(), Layout::new::<()>()) } else { - // SAFETY: - // 1. We have checked that our table is allocated. - // 2. The caller ensures that `table_layout` matches the [`TableLayout`] - // that was used to allocate this table. - unsafe { self.allocation_info(table_layout) } + self.allocation_info(table_layout) } } @@ -3443,16 +2491,12 @@ impl Clone for RawTable { fn clone(&self) -> Self { if self.table.is_empty_singleton() { - Self::new_in(self.alloc.clone()) + Self::new_in(self.table.alloc.clone()) } else { unsafe { // Avoid `Result::ok_or_else` because it bloats LLVM IR. - // - // SAFETY: This is safe as we are taking the size of an already allocated table - // and therefore Ñapacity overflow cannot occur, `self.table.buckets()` is power - // of two and all allocator errors will be caught inside `RawTableInner::new_uninitialized`. - let mut new_table = match Self::new_uninitialized( - self.alloc.clone(), + let new_table = match Self::new_uninitialized( + self.table.alloc.clone(), self.table.buckets(), Fallibility::Infallible, ) { @@ -3460,32 +2504,24 @@ Err(_) => hint::unreachable_unchecked(), }; - // Cloning elements may fail (the clone function may panic). But we don't - // need to worry about uninitialized control bits, since: - // 1. The number of items (elements) in the table is zero, which means that - // the control bits will not be readed by Drop function. - // 2. The `clone_from_spec` method will first copy all control bits from - // `self` (thus initializing them). But this will not affect the `Drop` - // function, since the `clone_from_spec` function sets `items` only after - // successfully clonning all elements. - new_table.clone_from_spec(self); - new_table + // If cloning fails then we need to free the allocation for the + // new table. However we don't run its drop since its control + // bytes are not initialized yet. + let mut guard = guard(ManuallyDrop::new(new_table), |new_table| { + new_table.free_buckets(); + }); + + guard.clone_from_spec(self); + + // Disarm the scope guard and return the newly created table. + ManuallyDrop::into_inner(ScopeGuard::into_inner(guard)) } } } fn clone_from(&mut self, source: &Self) { if source.table.is_empty_singleton() { - let mut old_inner = mem::replace(&mut self.table, RawTableInner::NEW); - unsafe { - // SAFETY: - // 1. We call the function only once; - // 2. We know for sure that `alloc` and `table_layout` matches the [`Allocator`] - // and [`TableLayout`] that were used to allocate this table. - // 3. If any elements' drop function panics, then there will only be a memory leak, - // because we have replaced the inner table with a new one. - old_inner.drop_inner_table::(&self.alloc, Self::TABLE_LAYOUT); - } + *self = Self::new_in(self.table.alloc.clone()); } else { unsafe { // Make sure that if any panics occurs, we clear the table and @@ -3500,38 +2536,27 @@ // // This leak is unavoidable: we can't try dropping more elements // since this could lead to another panic and abort the process. - // - // SAFETY: If something gets wrong we clear our table right after - // dropping the elements, so there is no double drop, since `items` - // will be equal to zero. - self_.table.drop_elements::(); + self_.drop_elements(); // If necessary, resize our table to match the source. if self_.buckets() != source.buckets() { - let new_inner = match RawTableInner::new_uninitialized( - &self_.alloc, - Self::TABLE_LAYOUT, - source.buckets(), - Fallibility::Infallible, - ) { - Ok(table) => table, - Err(_) => hint::unreachable_unchecked(), - }; - // Replace the old inner with new uninitialized one. It's ok, since if something gets - // wrong `ScopeGuard` will initialize all control bytes and leave empty table. - let mut old_inner = mem::replace(&mut self_.table, new_inner); - if !old_inner.is_empty_singleton() { - // SAFETY: - // 1. We have checked that our table is allocated. - // 2. We know for sure that `alloc` and `table_layout` matches - // the [`Allocator`] and [`TableLayout`] that were used to allocate this table. - old_inner.free_buckets(&self_.alloc, Self::TABLE_LAYOUT); + // Skip our drop by using ptr::write. + if !self_.table.is_empty_singleton() { + self_.free_buckets(); } + (&mut **self_ as *mut Self).write( + // Avoid `Result::unwrap_or_else` because it bloats LLVM IR. + match Self::new_uninitialized( + self_.table.alloc.clone(), + source.buckets(), + Fallibility::Infallible, + ) { + Ok(table) => table, + Err(_) => hint::unreachable_unchecked(), + }, + ); } - // Cloning elements may fail (the clone function may panic), but the `ScopeGuard` - // inside the `clone_from_impl` function will take care of that, dropping all - // cloned elements if necessary. Our `ScopeGuard` will clear the table. self_.clone_from_spec(source); // Disarm the scope guard if cloning was successful. @@ -3588,7 +2613,7 @@ // to make sure we drop only the elements that have been // cloned so far. let mut guard = guard((0, &mut *self), |(index, self_)| { - if T::NEEDS_DROP { + if Self::DATA_NEEDS_DROP { for i in 0..=*index { if self_.is_bucket_full(i) { self_.bucket(i).drop(); @@ -3625,7 +2650,7 @@ { self.clear(); - let mut guard_self = guard(&mut *self, |self_| { + let guard_self = guard(&mut *self, |self_| { // Clear the partially copied table if a panic occurs, otherwise // items and growth_left will be out of sync with the contents // of the table. @@ -3658,7 +2683,7 @@ } } -impl Default for RawTable { +impl Default for RawTable { #[inline] fn default() -> Self { Self::new_in(Default::default()) @@ -3666,41 +2691,31 @@ } #[cfg(feature = "nightly")] -unsafe impl<#[may_dangle] T, A: Allocator> Drop for RawTable { +unsafe impl<#[may_dangle] T, A: Allocator + Clone> Drop for RawTable { #[cfg_attr(feature = "inline-more", inline)] fn drop(&mut self) { - unsafe { - // SAFETY: - // 1. We call the function only once; - // 2. We know for sure that `alloc` and `table_layout` matches the [`Allocator`] - // and [`TableLayout`] that were used to allocate this table. - // 3. If the drop function of any elements fails, then only a memory leak will occur, - // and we don't care because we are inside the `Drop` function of the `RawTable`, - // so there won't be any table left in an inconsistent state. - self.table - .drop_inner_table::(&self.alloc, Self::TABLE_LAYOUT); + if !self.table.is_empty_singleton() { + unsafe { + self.drop_elements(); + self.free_buckets(); + } } } } #[cfg(not(feature = "nightly"))] -impl Drop for RawTable { +impl Drop for RawTable { #[cfg_attr(feature = "inline-more", inline)] fn drop(&mut self) { - unsafe { - // SAFETY: - // 1. We call the function only once; - // 2. We know for sure that `alloc` and `table_layout` matches the [`Allocator`] - // and [`TableLayout`] that were used to allocate this table. - // 3. If the drop function of any elements fails, then only a memory leak will occur, - // and we don't care because we are inside the `Drop` function of the `RawTable`, - // so there won't be any table left in an inconsistent state. - self.table - .drop_inner_table::(&self.alloc, Self::TABLE_LAYOUT); + if !self.table.is_empty_singleton() { + unsafe { + self.drop_elements(); + self.free_buckets(); + } } } } -impl IntoIterator for RawTable { +impl IntoIterator for RawTable { type Item = T; type IntoIter = RawIntoIter; @@ -3734,39 +2749,14 @@ impl RawIterRange { /// Returns a `RawIterRange` covering a subset of a table. /// - /// # Safety - /// - /// If any of the following conditions are violated, the result is - /// [`undefined behavior`]: - /// - /// * `ctrl` must be [valid] for reads, i.e. table outlives the `RawIterRange`; - /// - /// * `ctrl` must be properly aligned to the group size (Group::WIDTH); - /// - /// * `ctrl` must point to the array of properly initialized control bytes; - /// - /// * `data` must be the [`Bucket`] at the `ctrl` index in the table; - /// - /// * the value of `len` must be less than or equal to the number of table buckets, - /// and the returned value of `ctrl.as_ptr().add(len).offset_from(ctrl.as_ptr())` - /// must be positive. - /// - /// * The `ctrl.add(len)` pointer must be either in bounds or one - /// byte past the end of the same [allocated table]. - /// - /// * The `len` must be a power of two. - /// - /// [valid]: https://doc.rust-lang.org/std/ptr/index.html#safety - /// [`undefined behavior`]: https://doc.rust-lang.org/reference/behavior-considered-undefined.html + /// The control byte address must be aligned to the group size. #[cfg_attr(feature = "inline-more", inline)] unsafe fn new(ctrl: *const u8, data: Bucket, len: usize) -> Self { debug_assert_ne!(len, 0); debug_assert_eq!(ctrl as usize % Group::WIDTH, 0); - // SAFETY: The caller must uphold the safety rules for the [`RawIterRange::new`] let end = ctrl.add(len); // Load the first group and advance ctrl to point to the next group - // SAFETY: The caller must uphold the safety rules for the [`RawIterRange::new`] let current_group = Group::load_aligned(ctrl).match_full(); let next_ctrl = ctrl.add(Group::WIDTH); @@ -3910,6 +2900,8 @@ } impl RawIter { + const DATA_NEEDS_DROP: bool = mem::needs_drop::(); + /// Refresh the iterator so that it reflects a removal from the given bucket. /// /// For the iterator to remain valid, this method must be called once @@ -4025,7 +3017,7 @@ } unsafe fn drop_elements(&mut self) { - if T::NEEDS_DROP && self.items != 0 { + if Self::DATA_NEEDS_DROP && self.len() != 0 { for item in self { item.drop(); } @@ -4074,146 +3066,28 @@ impl ExactSizeIterator for RawIter {} impl FusedIterator for RawIter {} -/// Iterator which returns an index of every full bucket in the table. -/// -/// For maximum flexibility this iterator is not bound by a lifetime, but you -/// must observe several rules when using it: -/// - You must not free the hash table while iterating (including via growing/shrinking). -/// - It is fine to erase a bucket that has been yielded by the iterator. -/// - Erasing a bucket that has not yet been yielded by the iterator may still -/// result in the iterator yielding index of that bucket. -/// - It is unspecified whether an element inserted after the iterator was -/// created will be yielded by that iterator. -/// - The order in which the iterator yields indices of the buckets is unspecified -/// and may change in the future. -pub(crate) struct FullBucketsIndices { - // Mask of full buckets in the current group. Bits are cleared from this - // mask as each element is processed. - current_group: BitMaskIter, - - // Initial value of the bytes' indices of the current group (relative - // to the start of the control bytes). - group_first_index: usize, - - // Pointer to the current group of control bytes, - // Must be aligned to the group size (Group::WIDTH). - ctrl: NonNull, - - // Number of elements in the table. - items: usize, -} - -impl FullBucketsIndices { - /// Advances the iterator and returns the next value. - /// - /// # Safety - /// - /// If any of the following conditions are violated, the result is - /// [`Undefined Behavior`]: - /// - /// * The [`RawTableInner`] / [`RawTable`] must be alive and not moved, - /// i.e. table outlives the `FullBucketsIndices`; - /// - /// * It never tries to iterate after getting all elements. - /// - /// [`Undefined Behavior`]: https://doc.rust-lang.org/reference/behavior-considered-undefined.html - #[inline(always)] - unsafe fn next_impl(&mut self) -> Option { - loop { - if let Some(index) = self.current_group.next() { - // The returned `self.group_first_index + index` will always - // be in the range `0..self.buckets()`. See explanation below. - return Some(self.group_first_index + index); - } - - // SAFETY: The caller of this function ensures that: - // - // 1. It never tries to iterate after getting all the elements; - // 2. The table is alive and did not moved; - // 3. The first `self.ctrl` pointed to the start of the array of control bytes. - // - // Taking the above into account, we always stay within the bounds, because: - // - // 1. For tables smaller than the group width (self.buckets() <= Group::WIDTH), - // we will never end up in the given branch, since we should have already - // yielded all the elements of the table. - // - // 2. For tables larger than the group width. The the number of buckets is a - // power of two (2 ^ n), Group::WIDTH is also power of two (2 ^ k). Sinse - // `(2 ^ n) > (2 ^ k)`, than `(2 ^ n) % (2 ^ k) = 0`. As we start from the - // the start of the array of control bytes, and never try to iterate after - // getting all the elements, the last `self.ctrl` will be equal to - // the `self.buckets() - Group::WIDTH`, so `self.current_group.next()` - // will always contains indices within the range `0..Group::WIDTH`, - // and subsequent `self.group_first_index + index` will always return a - // number less than `self.buckets()`. - self.ctrl = NonNull::new_unchecked(self.ctrl.as_ptr().add(Group::WIDTH)); - - // SAFETY: See explanation above. - self.current_group = Group::load_aligned(self.ctrl.as_ptr()) - .match_full() - .into_iter(); - self.group_first_index += Group::WIDTH; - } - } -} - -impl Iterator for FullBucketsIndices { - type Item = usize; - - /// Advances the iterator and returns the next value. It is up to - /// the caller to ensure that the `RawTable` outlives the `FullBucketsIndices`, - /// because we cannot make the `next` method unsafe. - #[inline(always)] - fn next(&mut self) -> Option { - // Return if we already yielded all items. - if self.items == 0 { - return None; - } - - let nxt = unsafe { - // SAFETY: - // 1. We check number of items to yield using `items` field. - // 2. The caller ensures that the table is alive and has not moved. - self.next_impl() - }; - - debug_assert!(nxt.is_some()); - self.items -= 1; - - nxt - } - - #[inline(always)] - fn size_hint(&self) -> (usize, Option) { - (self.items, Some(self.items)) - } -} - -impl ExactSizeIterator for FullBucketsIndices {} -impl FusedIterator for FullBucketsIndices {} - /// Iterator which consumes a table and returns elements. -pub struct RawIntoIter { +pub struct RawIntoIter { iter: RawIter, - allocation: Option<(NonNull, Layout, A)>, + allocation: Option<(NonNull, Layout)>, marker: PhantomData, + alloc: A, } -impl RawIntoIter { +impl RawIntoIter { #[cfg_attr(feature = "inline-more", inline)] pub fn iter(&self) -> RawIter { self.iter.clone() } } -unsafe impl Send for RawIntoIter +unsafe impl Send for RawIntoIter where T: Send, A: Send, { } -unsafe impl Sync for RawIntoIter +unsafe impl Sync for RawIntoIter where T: Sync, A: Sync, @@ -4221,7 +3095,7 @@ } #[cfg(feature = "nightly")] -unsafe impl<#[may_dangle] T, A: Allocator> Drop for RawIntoIter { +unsafe impl<#[may_dangle] T, A: Allocator + Clone> Drop for RawIntoIter { #[cfg_attr(feature = "inline-more", inline)] fn drop(&mut self) { unsafe { @@ -4229,14 +3103,14 @@ self.iter.drop_elements(); // Free the table - if let Some((ptr, layout, ref alloc)) = self.allocation { - alloc.deallocate(ptr, layout); + if let Some((ptr, layout)) = self.allocation { + self.alloc.deallocate(ptr, layout); } } } } #[cfg(not(feature = "nightly"))] -impl Drop for RawIntoIter { +impl Drop for RawIntoIter { #[cfg_attr(feature = "inline-more", inline)] fn drop(&mut self) { unsafe { @@ -4244,14 +3118,14 @@ self.iter.drop_elements(); // Free the table - if let Some((ptr, layout, ref alloc)) = self.allocation { - alloc.deallocate(ptr, layout); + if let Some((ptr, layout)) = self.allocation { + self.alloc.deallocate(ptr, layout); } } } } -impl Iterator for RawIntoIter { +impl Iterator for RawIntoIter { type Item = T; #[cfg_attr(feature = "inline-more", inline)] @@ -4265,45 +3139,45 @@ } } -impl ExactSizeIterator for RawIntoIter {} -impl FusedIterator for RawIntoIter {} +impl ExactSizeIterator for RawIntoIter {} +impl FusedIterator for RawIntoIter {} /// Iterator which consumes elements without freeing the table storage. -pub struct RawDrain<'a, T, A: Allocator = Global> { +pub struct RawDrain<'a, T, A: Allocator + Clone = Global> { iter: RawIter, // The table is moved into the iterator for the duration of the drain. This // ensures that an empty table is left if the drain iterator is leaked // without dropping. - table: RawTableInner, - orig_table: NonNull, + table: ManuallyDrop>, + orig_table: NonNull>, // We don't use a &'a mut RawTable because we want RawDrain to be // covariant over T. marker: PhantomData<&'a RawTable>, } -impl RawDrain<'_, T, A> { +impl RawDrain<'_, T, A> { #[cfg_attr(feature = "inline-more", inline)] pub fn iter(&self) -> RawIter { self.iter.clone() } } -unsafe impl Send for RawDrain<'_, T, A> +unsafe impl Send for RawDrain<'_, T, A> where T: Send, A: Send, { } -unsafe impl Sync for RawDrain<'_, T, A> +unsafe impl Sync for RawDrain<'_, T, A> where T: Sync, A: Sync, { } -impl Drop for RawDrain<'_, T, A> { +impl Drop for RawDrain<'_, T, A> { #[cfg_attr(feature = "inline-more", inline)] fn drop(&mut self) { unsafe { @@ -4317,12 +3191,12 @@ // Move the now empty table back to its original location. self.orig_table .as_ptr() - .copy_from_nonoverlapping(&self.table, 1); + .copy_from_nonoverlapping(&*self.table, 1); } } } -impl Iterator for RawDrain<'_, T, A> { +impl Iterator for RawDrain<'_, T, A> { type Item = T; #[cfg_attr(feature = "inline-more", inline)] @@ -4339,8 +3213,8 @@ } } -impl ExactSizeIterator for RawDrain<'_, T, A> {} -impl FusedIterator for RawDrain<'_, T, A> {} +impl ExactSizeIterator for RawDrain<'_, T, A> {} +impl FusedIterator for RawDrain<'_, T, A> {} /// Iterator over occupied buckets that could match a given hash. /// @@ -4385,7 +3259,7 @@ impl RawIterHash { #[cfg_attr(feature = "inline-more", inline)] #[cfg(feature = "raw")] - unsafe fn new(table: &RawTable, hash: u64) -> Self { + unsafe fn new(table: &RawTable, hash: u64) -> Self { RawIterHash { inner: RawIterHashInner::new(&table.table, hash), _marker: PhantomData, @@ -4395,7 +3269,7 @@ impl RawIterHashInner { #[cfg_attr(feature = "inline-more", inline)] #[cfg(feature = "raw")] - unsafe fn new(table: &RawTableInner, hash: u64) -> Self { + unsafe fn new(table: &RawTableInner, hash: u64) -> Self { let h2_hash = h2(hash); let probe_seq = table.probe_seq(hash); let group = Group::load(table.ctrl(probe_seq.pos)); @@ -4459,28 +3333,6 @@ } } -pub(crate) struct RawExtractIf<'a, T, A: Allocator> { - pub iter: RawIter, - pub table: &'a mut RawTable, -} - -impl RawExtractIf<'_, T, A> { - #[cfg_attr(feature = "inline-more", inline)] - pub(crate) fn next(&mut self, mut f: F) -> Option - where - F: FnMut(&mut T) -> bool, - { - unsafe { - for item in &mut self.iter { - if f(item.as_mut()) { - return Some(self.table.remove(item).0); - } - } - } - None - } -} - #[cfg(test)] mod test_map { use super::*; @@ -4523,214 +3375,4 @@ assert!(table.find(i + 100, |x| *x == i + 100).is_none()); } } - - /// CHECKING THAT WE ARE NOT TRYING TO READ THE MEMORY OF - /// AN UNINITIALIZED TABLE DURING THE DROP - #[test] - fn test_drop_uninitialized() { - use ::alloc::vec::Vec; - - let table = unsafe { - // SAFETY: The `buckets` is power of two and we're not - // trying to actually use the returned RawTable. - RawTable::<(u64, Vec)>::new_uninitialized(Global, 8, Fallibility::Infallible) - .unwrap() - }; - drop(table); - } - - /// CHECKING THAT WE DON'T TRY TO DROP DATA IF THE `ITEMS` - /// ARE ZERO, EVEN IF WE HAVE `FULL` CONTROL BYTES. - #[test] - fn test_drop_zero_items() { - use ::alloc::vec::Vec; - unsafe { - // SAFETY: The `buckets` is power of two and we're not - // trying to actually use the returned RawTable. - let table = - RawTable::<(u64, Vec)>::new_uninitialized(Global, 8, Fallibility::Infallible) - .unwrap(); - - // WE SIMULATE, AS IT WERE, A FULL TABLE. - - // SAFETY: We checked that the table is allocated and therefore the table already has - // `self.bucket_mask + 1 + Group::WIDTH` number of control bytes (see TableLayout::calculate_layout_for) - // so writing `table.table.num_ctrl_bytes() == bucket_mask + 1 + Group::WIDTH` bytes is safe. - table - .table - .ctrl(0) - .write_bytes(EMPTY, table.table.num_ctrl_bytes()); - - // SAFETY: table.capacity() is guaranteed to be smaller than table.buckets() - table.table.ctrl(0).write_bytes(0, table.capacity()); - - // Fix up the trailing control bytes. See the comments in set_ctrl - // for the handling of tables smaller than the group width. - if table.buckets() < Group::WIDTH { - // SAFETY: We have `self.bucket_mask + 1 + Group::WIDTH` number of control bytes, - // so copying `self.buckets() == self.bucket_mask + 1` bytes with offset equal to - // `Group::WIDTH` is safe - table - .table - .ctrl(0) - .copy_to(table.table.ctrl(Group::WIDTH), table.table.buckets()); - } else { - // SAFETY: We have `self.bucket_mask + 1 + Group::WIDTH` number of - // control bytes,so copying `Group::WIDTH` bytes with offset equal - // to `self.buckets() == self.bucket_mask + 1` is safe - table - .table - .ctrl(0) - .copy_to(table.table.ctrl(table.table.buckets()), Group::WIDTH); - } - drop(table); - } - } - - /// CHECKING THAT WE DON'T TRY TO DROP DATA IF THE `ITEMS` - /// ARE ZERO, EVEN IF WE HAVE `FULL` CONTROL BYTES. - #[test] - fn test_catch_panic_clone_from() { - use ::alloc::sync::Arc; - use ::alloc::vec::Vec; - use allocator_api2::alloc::{AllocError, Allocator, Global}; - use core::sync::atomic::{AtomicI8, Ordering}; - use std::thread; - - struct MyAllocInner { - drop_count: Arc, - } - - #[derive(Clone)] - struct MyAlloc { - _inner: Arc, - } - - impl Drop for MyAllocInner { - fn drop(&mut self) { - println!("MyAlloc freed."); - self.drop_count.fetch_sub(1, Ordering::SeqCst); - } - } - - unsafe impl Allocator for MyAlloc { - fn allocate(&self, layout: Layout) -> std::result::Result, AllocError> { - let g = Global; - g.allocate(layout) - } - - unsafe fn deallocate(&self, ptr: NonNull, layout: Layout) { - let g = Global; - g.deallocate(ptr, layout) - } - } - - const DISARMED: bool = false; - const ARMED: bool = true; - - struct CheckedCloneDrop { - panic_in_clone: bool, - dropped: bool, - need_drop: Vec, - } - - impl Clone for CheckedCloneDrop { - fn clone(&self) -> Self { - if self.panic_in_clone { - panic!("panic in clone") - } - Self { - panic_in_clone: self.panic_in_clone, - dropped: self.dropped, - need_drop: self.need_drop.clone(), - } - } - } - - impl Drop for CheckedCloneDrop { - fn drop(&mut self) { - if self.dropped { - panic!("double drop"); - } - self.dropped = true; - } - } - - let dropped: Arc = Arc::new(AtomicI8::new(2)); - - let mut table = RawTable::new_in(MyAlloc { - _inner: Arc::new(MyAllocInner { - drop_count: dropped.clone(), - }), - }); - - for (idx, panic_in_clone) in core::iter::repeat(DISARMED).take(7).enumerate() { - let idx = idx as u64; - table.insert( - idx, - ( - idx, - CheckedCloneDrop { - panic_in_clone, - dropped: false, - need_drop: vec![idx], - }, - ), - |(k, _)| *k, - ); - } - - assert_eq!(table.len(), 7); - - thread::scope(|s| { - let result = s.spawn(|| { - let armed_flags = [ - DISARMED, DISARMED, ARMED, DISARMED, DISARMED, DISARMED, DISARMED, - ]; - let mut scope_table = RawTable::new_in(MyAlloc { - _inner: Arc::new(MyAllocInner { - drop_count: dropped.clone(), - }), - }); - for (idx, &panic_in_clone) in armed_flags.iter().enumerate() { - let idx = idx as u64; - scope_table.insert( - idx, - ( - idx, - CheckedCloneDrop { - panic_in_clone, - dropped: false, - need_drop: vec![idx + 100], - }, - ), - |(k, _)| *k, - ); - } - table.clone_from(&scope_table); - }); - assert!(result.join().is_err()); - }); - - // Let's check that all iterators work fine and do not return elements - // (especially `RawIterRange`, which does not depend on the number of - // elements in the table, but looks directly at the control bytes) - // - // SAFETY: We know for sure that `RawTable` will outlive - // the returned `RawIter / RawIterRange` iterator. - assert_eq!(table.len(), 0); - assert_eq!(unsafe { table.iter().count() }, 0); - assert_eq!(unsafe { table.iter().iter.count() }, 0); - - for idx in 0..table.buckets() { - let idx = idx as u64; - assert!( - table.find(idx, |(k, _)| *k == idx).is_none(), - "Index: {idx}" - ); - } - - // All allocator clones should already be dropped. - assert_eq!(dropped.load(Ordering::SeqCst), 1); - } } diff -Nru temporalio-1.3.0/vendor/hashbrown/src/rustc_entry.rs temporalio-1.3.0/vendor/hashbrown/src/rustc_entry.rs --- temporalio-1.3.0/vendor/hashbrown/src/rustc_entry.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/hashbrown/src/rustc_entry.rs 2023-10-30 19:40:00.000000000 +0000 @@ -9,7 +9,7 @@ where K: Eq + Hash, S: BuildHasher, - A: Allocator, + A: Allocator + Clone, { /// Gets the given key's corresponding entry in the map for in-place manipulation. /// @@ -62,7 +62,7 @@ /// [`rustc_entry`]: struct.HashMap.html#method.rustc_entry pub enum RustcEntry<'a, K, V, A = Global> where - A: Allocator, + A: Allocator + Clone, { /// An occupied entry. Occupied(RustcOccupiedEntry<'a, K, V, A>), @@ -71,7 +71,7 @@ Vacant(RustcVacantEntry<'a, K, V, A>), } -impl Debug for RustcEntry<'_, K, V, A> { +impl Debug for RustcEntry<'_, K, V, A> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match *self { Vacant(ref v) => f.debug_tuple("Entry").field(v).finish(), @@ -86,7 +86,7 @@ /// [`RustcEntry`]: enum.RustcEntry.html pub struct RustcOccupiedEntry<'a, K, V, A = Global> where - A: Allocator, + A: Allocator + Clone, { key: Option, elem: Bucket<(K, V)>, @@ -97,18 +97,18 @@ where K: Send, V: Send, - A: Allocator + Send, + A: Allocator + Clone + Send, { } unsafe impl Sync for RustcOccupiedEntry<'_, K, V, A> where K: Sync, V: Sync, - A: Allocator + Sync, + A: Allocator + Clone + Sync, { } -impl Debug for RustcOccupiedEntry<'_, K, V, A> { +impl Debug for RustcOccupiedEntry<'_, K, V, A> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_struct("OccupiedEntry") .field("key", self.key()) @@ -123,20 +123,20 @@ /// [`RustcEntry`]: enum.RustcEntry.html pub struct RustcVacantEntry<'a, K, V, A = Global> where - A: Allocator, + A: Allocator + Clone, { hash: u64, key: K, table: &'a mut RawTable<(K, V), A>, } -impl Debug for RustcVacantEntry<'_, K, V, A> { +impl Debug for RustcVacantEntry<'_, K, V, A> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_tuple("VacantEntry").field(self.key()).finish() } } -impl<'a, K, V, A: Allocator> RustcEntry<'a, K, V, A> { +impl<'a, K, V, A: Allocator + Clone> RustcEntry<'a, K, V, A> { /// Sets the value of the entry, and returns a RustcOccupiedEntry. /// /// # Examples @@ -265,7 +265,7 @@ } } -impl<'a, K, V: Default, A: Allocator> RustcEntry<'a, K, V, A> { +impl<'a, K, V: Default, A: Allocator + Clone> RustcEntry<'a, K, V, A> { /// Ensures a value is in the entry by inserting the default value if empty, /// and returns a mutable reference to the value in the entry. /// @@ -293,7 +293,7 @@ } } -impl<'a, K, V, A: Allocator> RustcOccupiedEntry<'a, K, V, A> { +impl<'a, K, V, A: Allocator + Clone> RustcOccupiedEntry<'a, K, V, A> { /// Gets a reference to the key in the entry. /// /// # Examples @@ -518,7 +518,7 @@ } } -impl<'a, K, V, A: Allocator> RustcVacantEntry<'a, K, V, A> { +impl<'a, K, V, A: Allocator + Clone> RustcVacantEntry<'a, K, V, A> { /// Gets a reference to the key that would be used when inserting a value /// through the `RustcVacantEntry`. /// diff -Nru temporalio-1.3.0/vendor/hashbrown/src/set.rs temporalio-1.3.0/vendor/hashbrown/src/set.rs --- temporalio-1.3.0/vendor/hashbrown/src/set.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/hashbrown/src/set.rs 2023-10-30 19:40:00.000000000 +0000 @@ -7,8 +7,8 @@ use core::iter::{Chain, FromIterator, FusedIterator}; use core::ops::{BitAnd, BitOr, BitXor, Sub}; -use super::map::{self, DefaultHashBuilder, HashMap, Keys}; -use crate::raw::{Allocator, Global, RawExtractIf}; +use super::map::{self, DefaultHashBuilder, ExtractIfInner, HashMap, Keys}; +use crate::raw::{Allocator, Global}; // Future Optimization (FIXME!) // ============================= @@ -112,7 +112,7 @@ /// [`HashMap`]: struct.HashMap.html /// [`PartialEq`]: https://doc.rust-lang.org/std/cmp/trait.PartialEq.html /// [`RefCell`]: https://doc.rust-lang.org/std/cell/struct.RefCell.html -pub struct HashSet { +pub struct HashSet { pub(crate) map: HashMap, } @@ -193,7 +193,7 @@ } #[cfg(feature = "ahash")] -impl HashSet { +impl HashSet { /// Creates an empty `HashSet`. /// /// The hash set is initially created with a capacity of 0, so it will not allocate until it @@ -256,7 +256,7 @@ } } -impl HashSet { +impl HashSet { /// Returns the number of elements the set can hold without reallocating. /// /// # Examples @@ -383,8 +383,6 @@ /// or the iteration short-circuits, then the remaining elements will be retained. /// Use [`retain()`] with a negated predicate if you do not need the returned iterator. /// - /// [`retain()`]: HashSet::retain - /// /// # Examples /// /// ``` @@ -408,7 +406,7 @@ { ExtractIf { f, - inner: RawExtractIf { + inner: ExtractIfInner { iter: unsafe { self.map.table.iter() }, table: &mut self.map.table, }, @@ -513,7 +511,7 @@ impl HashSet where - A: Allocator, + A: Allocator + Clone, { /// Returns a reference to the underlying allocator. #[inline] @@ -621,7 +619,7 @@ where T: Eq + Hash, S: BuildHasher, - A: Allocator, + A: Allocator + Clone, { /// Reserves capacity for at least `additional` more elements to be inserted /// in the `HashSet`. The collection may reserve more space to avoid @@ -1225,7 +1223,7 @@ } } -impl HashSet { +impl HashSet { /// Returns a reference to the [`RawTable`] used underneath [`HashSet`]. /// This function is only available if the `raw` feature of the crate is enabled. /// @@ -1271,7 +1269,7 @@ where T: Eq + Hash, S: BuildHasher, - A: Allocator, + A: Allocator + Clone, { fn eq(&self, other: &Self) -> bool { if self.len() != other.len() { @@ -1286,14 +1284,14 @@ where T: Eq + Hash, S: BuildHasher, - A: Allocator, + A: Allocator + Clone, { } impl fmt::Debug for HashSet where T: fmt::Debug, - A: Allocator, + A: Allocator + Clone, { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_set().entries(self.iter()).finish() @@ -1302,7 +1300,7 @@ impl From> for HashSet where - A: Allocator, + A: Allocator + Clone, { fn from(map: HashMap) -> Self { Self { map } @@ -1313,7 +1311,7 @@ where T: Eq + Hash, S: BuildHasher + Default, - A: Default + Allocator, + A: Default + Allocator + Clone, { #[cfg_attr(feature = "inline-more", inline)] fn from_iter>(iter: I) -> Self { @@ -1328,7 +1326,7 @@ impl From<[T; N]> for HashSet where T: Eq + Hash, - A: Default + Allocator, + A: Default + Allocator + Clone, { /// # Examples /// @@ -1348,7 +1346,7 @@ where T: Eq + Hash, S: BuildHasher, - A: Allocator, + A: Allocator + Clone, { #[cfg_attr(feature = "inline-more", inline)] fn extend>(&mut self, iter: I) { @@ -1372,7 +1370,7 @@ where T: 'a + Eq + Hash + Copy, S: BuildHasher, - A: Allocator, + A: Allocator + Clone, { #[cfg_attr(feature = "inline-more", inline)] fn extend>(&mut self, iter: I) { @@ -1395,7 +1393,7 @@ impl Default for HashSet where S: Default, - A: Default + Allocator, + A: Default + Allocator + Clone, { /// Creates an empty `HashSet` with the `Default` value for the hasher. #[cfg_attr(feature = "inline-more", inline)] @@ -1410,7 +1408,7 @@ where T: Eq + Hash + Clone, S: BuildHasher + Default, - A: Allocator, + A: Allocator + Clone, { type Output = HashSet; @@ -1443,7 +1441,7 @@ where T: Eq + Hash + Clone, S: BuildHasher + Default, - A: Allocator, + A: Allocator + Clone, { type Output = HashSet; @@ -1554,7 +1552,7 @@ /// /// [`HashSet`]: struct.HashSet.html /// [`into_iter`]: struct.HashSet.html#method.into_iter -pub struct IntoIter { +pub struct IntoIter { iter: map::IntoIter, } @@ -1565,7 +1563,7 @@ /// /// [`HashSet`]: struct.HashSet.html /// [`drain`]: struct.HashSet.html#method.drain -pub struct Drain<'a, K, A: Allocator = Global> { +pub struct Drain<'a, K, A: Allocator + Clone = Global> { iter: map::Drain<'a, K, (), A>, } @@ -1577,12 +1575,12 @@ /// [`extract_if`]: struct.HashSet.html#method.extract_if /// [`HashSet`]: struct.HashSet.html #[must_use = "Iterators are lazy unless consumed"] -pub struct ExtractIf<'a, K, F, A: Allocator = Global> +pub struct ExtractIf<'a, K, F, A: Allocator + Clone = Global> where F: FnMut(&K) -> bool, { f: F, - inner: RawExtractIf<'a, (K, ()), A>, + inner: ExtractIfInner<'a, K, (), A>, } /// A lazy iterator producing elements in the intersection of `HashSet`s. @@ -1592,7 +1590,7 @@ /// /// [`HashSet`]: struct.HashSet.html /// [`intersection`]: struct.HashSet.html#method.intersection -pub struct Intersection<'a, T, S, A: Allocator = Global> { +pub struct Intersection<'a, T, S, A: Allocator + Clone = Global> { // iterator of the first set iter: Iter<'a, T>, // the second set @@ -1606,7 +1604,7 @@ /// /// [`HashSet`]: struct.HashSet.html /// [`difference`]: struct.HashSet.html#method.difference -pub struct Difference<'a, T, S, A: Allocator = Global> { +pub struct Difference<'a, T, S, A: Allocator + Clone = Global> { // iterator of the first set iter: Iter<'a, T>, // the second set @@ -1620,7 +1618,7 @@ /// /// [`HashSet`]: struct.HashSet.html /// [`symmetric_difference`]: struct.HashSet.html#method.symmetric_difference -pub struct SymmetricDifference<'a, T, S, A: Allocator = Global> { +pub struct SymmetricDifference<'a, T, S, A: Allocator + Clone = Global> { iter: Chain, Difference<'a, T, S, A>>, } @@ -1631,11 +1629,11 @@ /// /// [`HashSet`]: struct.HashSet.html /// [`union`]: struct.HashSet.html#method.union -pub struct Union<'a, T, S, A: Allocator = Global> { +pub struct Union<'a, T, S, A: Allocator + Clone = Global> { iter: Chain, Difference<'a, T, S, A>>, } -impl<'a, T, S, A: Allocator> IntoIterator for &'a HashSet { +impl<'a, T, S, A: Allocator + Clone> IntoIterator for &'a HashSet { type Item = &'a T; type IntoIter = Iter<'a, T>; @@ -1645,7 +1643,7 @@ } } -impl IntoIterator for HashSet { +impl IntoIterator for HashSet { type Item = T; type IntoIter = IntoIter; @@ -1711,7 +1709,7 @@ } } -impl Iterator for IntoIter { +impl Iterator for IntoIter { type Item = K; #[cfg_attr(feature = "inline-more", inline)] @@ -1727,22 +1725,22 @@ self.iter.size_hint() } } -impl ExactSizeIterator for IntoIter { +impl ExactSizeIterator for IntoIter { #[cfg_attr(feature = "inline-more", inline)] fn len(&self) -> usize { self.iter.len() } } -impl FusedIterator for IntoIter {} +impl FusedIterator for IntoIter {} -impl fmt::Debug for IntoIter { +impl fmt::Debug for IntoIter { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { let entries_iter = self.iter.iter().map(|(k, _)| k); f.debug_list().entries(entries_iter).finish() } } -impl Iterator for Drain<'_, K, A> { +impl Iterator for Drain<'_, K, A> { type Item = K; #[cfg_attr(feature = "inline-more", inline)] @@ -1758,22 +1756,22 @@ self.iter.size_hint() } } -impl ExactSizeIterator for Drain<'_, K, A> { +impl ExactSizeIterator for Drain<'_, K, A> { #[cfg_attr(feature = "inline-more", inline)] fn len(&self) -> usize { self.iter.len() } } -impl FusedIterator for Drain<'_, K, A> {} +impl FusedIterator for Drain<'_, K, A> {} -impl fmt::Debug for Drain<'_, K, A> { +impl fmt::Debug for Drain<'_, K, A> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { let entries_iter = self.iter.iter().map(|(k, _)| k); f.debug_list().entries(entries_iter).finish() } } -impl Iterator for ExtractIf<'_, K, F, A> +impl Iterator for ExtractIf<'_, K, F, A> where F: FnMut(&K) -> bool, { @@ -1781,9 +1779,9 @@ #[cfg_attr(feature = "inline-more", inline)] fn next(&mut self) -> Option { - self.inner - .next(|&mut (ref k, ())| (self.f)(k)) - .map(|(k, ())| k) + let f = &mut self.f; + let (k, _) = self.inner.next(&mut |k, _| f(k))?; + Some(k) } #[inline] @@ -1792,9 +1790,9 @@ } } -impl FusedIterator for ExtractIf<'_, K, F, A> where F: FnMut(&K) -> bool {} +impl FusedIterator for ExtractIf<'_, K, F, A> where F: FnMut(&K) -> bool {} -impl Clone for Intersection<'_, T, S, A> { +impl Clone for Intersection<'_, T, S, A> { #[cfg_attr(feature = "inline-more", inline)] fn clone(&self) -> Self { Intersection { @@ -1808,7 +1806,7 @@ where T: Eq + Hash, S: BuildHasher, - A: Allocator, + A: Allocator + Clone, { type Item = &'a T; @@ -1833,7 +1831,7 @@ where T: fmt::Debug + Eq + Hash, S: BuildHasher, - A: Allocator, + A: Allocator + Clone, { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_list().entries(self.clone()).finish() @@ -1844,11 +1842,11 @@ where T: Eq + Hash, S: BuildHasher, - A: Allocator, + A: Allocator + Clone, { } -impl Clone for Difference<'_, T, S, A> { +impl Clone for Difference<'_, T, S, A> { #[cfg_attr(feature = "inline-more", inline)] fn clone(&self) -> Self { Difference { @@ -1862,7 +1860,7 @@ where T: Eq + Hash, S: BuildHasher, - A: Allocator, + A: Allocator + Clone, { type Item = &'a T; @@ -1887,7 +1885,7 @@ where T: Eq + Hash, S: BuildHasher, - A: Allocator, + A: Allocator + Clone, { } @@ -1895,14 +1893,14 @@ where T: fmt::Debug + Eq + Hash, S: BuildHasher, - A: Allocator, + A: Allocator + Clone, { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_list().entries(self.clone()).finish() } } -impl Clone for SymmetricDifference<'_, T, S, A> { +impl Clone for SymmetricDifference<'_, T, S, A> { #[cfg_attr(feature = "inline-more", inline)] fn clone(&self) -> Self { SymmetricDifference { @@ -1915,7 +1913,7 @@ where T: Eq + Hash, S: BuildHasher, - A: Allocator, + A: Allocator + Clone, { type Item = &'a T; @@ -1933,7 +1931,7 @@ where T: Eq + Hash, S: BuildHasher, - A: Allocator, + A: Allocator + Clone, { } @@ -1941,14 +1939,14 @@ where T: fmt::Debug + Eq + Hash, S: BuildHasher, - A: Allocator, + A: Allocator + Clone, { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_list().entries(self.clone()).finish() } } -impl Clone for Union<'_, T, S, A> { +impl Clone for Union<'_, T, S, A> { #[cfg_attr(feature = "inline-more", inline)] fn clone(&self) -> Self { Union { @@ -1961,7 +1959,7 @@ where T: Eq + Hash, S: BuildHasher, - A: Allocator, + A: Allocator + Clone, { } @@ -1969,7 +1967,7 @@ where T: fmt::Debug + Eq + Hash, S: BuildHasher, - A: Allocator, + A: Allocator + Clone, { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_list().entries(self.clone()).finish() @@ -1980,7 +1978,7 @@ where T: Eq + Hash, S: BuildHasher, - A: Allocator, + A: Allocator + Clone, { type Item = &'a T; @@ -2032,7 +2030,7 @@ /// ``` pub enum Entry<'a, T, S, A = Global> where - A: Allocator, + A: Allocator + Clone, { /// An occupied entry. /// @@ -2065,7 +2063,7 @@ Vacant(VacantEntry<'a, T, S, A>), } -impl fmt::Debug for Entry<'_, T, S, A> { +impl fmt::Debug for Entry<'_, T, S, A> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match *self { Entry::Vacant(ref v) => f.debug_tuple("Entry").field(v).finish(), @@ -2110,11 +2108,11 @@ /// assert_eq!(set.get(&"c"), None); /// assert_eq!(set.len(), 2); /// ``` -pub struct OccupiedEntry<'a, T, S, A: Allocator = Global> { +pub struct OccupiedEntry<'a, T, S, A: Allocator + Clone = Global> { inner: map::OccupiedEntry<'a, T, (), S, A>, } -impl fmt::Debug for OccupiedEntry<'_, T, S, A> { +impl fmt::Debug for OccupiedEntry<'_, T, S, A> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_struct("OccupiedEntry") .field("value", self.get()) @@ -2148,17 +2146,17 @@ /// } /// assert!(set.contains("b") && set.len() == 2); /// ``` -pub struct VacantEntry<'a, T, S, A: Allocator = Global> { +pub struct VacantEntry<'a, T, S, A: Allocator + Clone = Global> { inner: map::VacantEntry<'a, T, (), S, A>, } -impl fmt::Debug for VacantEntry<'_, T, S, A> { +impl fmt::Debug for VacantEntry<'_, T, S, A> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_tuple("VacantEntry").field(self.get()).finish() } } -impl<'a, T, S, A: Allocator> Entry<'a, T, S, A> { +impl<'a, T, S, A: Allocator + Clone> Entry<'a, T, S, A> { /// Sets the value of the entry, and returns an OccupiedEntry. /// /// # Examples @@ -2235,7 +2233,7 @@ } } -impl OccupiedEntry<'_, T, S, A> { +impl OccupiedEntry<'_, T, S, A> { /// Gets a reference to the value in the entry. /// /// # Examples @@ -2322,7 +2320,7 @@ } } -impl<'a, T, S, A: Allocator> VacantEntry<'a, T, S, A> { +impl<'a, T, S, A: Allocator + Clone> VacantEntry<'a, T, S, A> { /// Gets a reference to the value that would be used when inserting /// through the `VacantEntry`. /// @@ -2402,30 +2400,34 @@ fn iter<'a, 'new>(v: Iter<'a, &'static str>) -> Iter<'a, &'new str> { v } - fn into_iter<'new, A: Allocator>(v: IntoIter<&'static str, A>) -> IntoIter<&'new str, A> { + fn into_iter<'new, A: Allocator + Clone>( + v: IntoIter<&'static str, A>, + ) -> IntoIter<&'new str, A> { v } - fn difference<'a, 'new, A: Allocator>( + fn difference<'a, 'new, A: Allocator + Clone>( v: Difference<'a, &'static str, DefaultHashBuilder, A>, ) -> Difference<'a, &'new str, DefaultHashBuilder, A> { v } - fn symmetric_difference<'a, 'new, A: Allocator>( + fn symmetric_difference<'a, 'new, A: Allocator + Clone>( v: SymmetricDifference<'a, &'static str, DefaultHashBuilder, A>, ) -> SymmetricDifference<'a, &'new str, DefaultHashBuilder, A> { v } - fn intersection<'a, 'new, A: Allocator>( + fn intersection<'a, 'new, A: Allocator + Clone>( v: Intersection<'a, &'static str, DefaultHashBuilder, A>, ) -> Intersection<'a, &'new str, DefaultHashBuilder, A> { v } - fn union<'a, 'new, A: Allocator>( + fn union<'a, 'new, A: Allocator + Clone>( v: Union<'a, &'static str, DefaultHashBuilder, A>, ) -> Union<'a, &'new str, DefaultHashBuilder, A> { v } - fn drain<'new, A: Allocator>(d: Drain<'static, &'static str, A>) -> Drain<'new, &'new str, A> { + fn drain<'new, A: Allocator + Clone>( + d: Drain<'static, &'static str, A>, + ) -> Drain<'new, &'new str, A> { d } } diff -Nru temporalio-1.3.0/vendor/hashbrown/src/table.rs temporalio-1.3.0/vendor/hashbrown/src/table.rs --- temporalio-1.3.0/vendor/hashbrown/src/table.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/hashbrown/src/table.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,2030 +0,0 @@ -use core::{fmt, iter::FusedIterator, marker::PhantomData}; - -use crate::{ - raw::{ - Allocator, Bucket, Global, InsertSlot, RawDrain, RawExtractIf, RawIntoIter, RawIter, - RawTable, - }, - TryReserveError, -}; - -/// Low-level hash table with explicit hashing. -/// -/// The primary use case for this type over [`HashMap`] or [`HashSet`] is to -/// support types that do not implement the [`Hash`] and [`Eq`] traits, but -/// instead require additional data not contained in the key itself to compute a -/// hash and compare two elements for equality. -/// -/// Examples of when this can be useful include: -/// - An `IndexMap` implementation where indices into a `Vec` are stored as -/// elements in a `HashTable`. Hashing and comparing the elements -/// requires indexing the associated `Vec` to get the actual value referred to -/// by the index. -/// - Avoiding re-computing a hash when it is already known. -/// - Mutating the key of an element in a way that doesn't affect its hash. -/// -/// To achieve this, `HashTable` methods that search for an element in the table -/// require a hash value and equality function to be explicitly passed in as -/// arguments. The method will then iterate over the elements with the given -/// hash and call the equality function on each of them, until a match is found. -/// -/// In most cases, a `HashTable` will not be exposed directly in an API. It will -/// instead be wrapped in a helper type which handles the work of calculating -/// hash values and comparing elements. -/// -/// Due to its low-level nature, this type provides fewer guarantees than -/// [`HashMap`] and [`HashSet`]. Specifically, the API allows you to shoot -/// yourself in the foot by having multiple elements with identical keys in the -/// table. The table itself will still function correctly and lookups will -/// arbitrarily return one of the matching elements. However you should avoid -/// doing this because it changes the runtime of hash table operations from -/// `O(1)` to `O(k)` where `k` is the number of duplicate entries. -/// -/// [`HashMap`]: super::HashMap -/// [`HashSet`]: super::HashSet -pub struct HashTable -where - A: Allocator, -{ - pub(crate) raw: RawTable, -} - -impl HashTable { - /// Creates an empty `HashTable`. - /// - /// The hash table is initially created with a capacity of 0, so it will not allocate until it - /// is first inserted into. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashTable; - /// let mut table: HashTable<&str> = HashTable::new(); - /// assert_eq!(table.len(), 0); - /// assert_eq!(table.capacity(), 0); - /// ``` - pub const fn new() -> Self { - Self { - raw: RawTable::new(), - } - } - - /// Creates an empty `HashTable` with the specified capacity. - /// - /// The hash table will be able to hold at least `capacity` elements without - /// reallocating. If `capacity` is 0, the hash table will not allocate. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashTable; - /// let mut table: HashTable<&str> = HashTable::with_capacity(10); - /// assert_eq!(table.len(), 0); - /// assert!(table.capacity() >= 10); - /// ``` - pub fn with_capacity(capacity: usize) -> Self { - Self { - raw: RawTable::with_capacity(capacity), - } - } -} - -impl HashTable -where - A: Allocator, -{ - /// Creates an empty `HashTable` using the given allocator. - /// - /// The hash table is initially created with a capacity of 0, so it will not allocate until it - /// is first inserted into. - /// - /// # Examples - /// - /// ``` - /// # #[cfg(feature = "nightly")] - /// # fn test() { - /// use ahash::AHasher; - /// use bumpalo::Bump; - /// use hashbrown::HashTable; - /// use std::hash::{BuildHasher, BuildHasherDefault}; - /// - /// let bump = Bump::new(); - /// let mut table = HashTable::new_in(&bump); - /// let hasher = BuildHasherDefault::::default(); - /// let hasher = |val: &_| hasher.hash_one(val); - /// - /// // The created HashTable holds none elements - /// assert_eq!(table.len(), 0); - /// - /// // The created HashTable also doesn't allocate memory - /// assert_eq!(table.capacity(), 0); - /// - /// // Now we insert element inside created HashTable - /// table.insert_unique(hasher(&"One"), "One", hasher); - /// // We can see that the HashTable holds 1 element - /// assert_eq!(table.len(), 1); - /// // And it also allocates some capacity - /// assert!(table.capacity() > 1); - /// # } - /// # fn main() { - /// # #[cfg(feature = "nightly")] - /// # test() - /// # } - /// ``` - pub const fn new_in(alloc: A) -> Self { - Self { - raw: RawTable::new_in(alloc), - } - } - - /// Creates an empty `HashTable` with the specified capacity using the given allocator. - /// - /// The hash table will be able to hold at least `capacity` elements without - /// reallocating. If `capacity` is 0, the hash table will not allocate. - /// - /// # Examples - /// - /// ``` - /// # #[cfg(feature = "nightly")] - /// # fn test() { - /// use ahash::AHasher; - /// use bumpalo::Bump; - /// use hashbrown::HashTable; - /// use std::hash::{BuildHasher, BuildHasherDefault}; - /// - /// let bump = Bump::new(); - /// let mut table = HashTable::with_capacity_in(5, &bump); - /// let hasher = BuildHasherDefault::::default(); - /// let hasher = |val: &_| hasher.hash_one(val); - /// - /// // The created HashTable holds none elements - /// assert_eq!(table.len(), 0); - /// // But it can hold at least 5 elements without reallocating - /// let empty_map_capacity = table.capacity(); - /// assert!(empty_map_capacity >= 5); - /// - /// // Now we insert some 5 elements inside created HashTable - /// table.insert_unique(hasher(&"One"), "One", hasher); - /// table.insert_unique(hasher(&"Two"), "Two", hasher); - /// table.insert_unique(hasher(&"Three"), "Three", hasher); - /// table.insert_unique(hasher(&"Four"), "Four", hasher); - /// table.insert_unique(hasher(&"Five"), "Five", hasher); - /// - /// // We can see that the HashTable holds 5 elements - /// assert_eq!(table.len(), 5); - /// // But its capacity isn't changed - /// assert_eq!(table.capacity(), empty_map_capacity) - /// # } - /// # fn main() { - /// # #[cfg(feature = "nightly")] - /// # test() - /// # } - /// ``` - pub fn with_capacity_in(capacity: usize, alloc: A) -> Self { - Self { - raw: RawTable::with_capacity_in(capacity, alloc), - } - } - - /// Returns a reference to the underlying allocator. - pub fn allocator(&self) -> &A { - self.raw.allocator() - } - - /// Returns a reference to an entry in the table with the given hash and - /// which satisfies the equality function passed. - /// - /// This method will call `eq` for all entries with the given hash, but may - /// also call it for entries with a different hash. `eq` should only return - /// true for the desired entry, at which point the search is stopped. - /// - /// # Examples - /// - /// ``` - /// # #[cfg(feature = "nightly")] - /// # fn test() { - /// use ahash::AHasher; - /// use hashbrown::HashTable; - /// use std::hash::{BuildHasher, BuildHasherDefault}; - /// - /// let mut table = HashTable::new(); - /// let hasher = BuildHasherDefault::::default(); - /// let hasher = |val: &_| hasher.hash_one(val); - /// table.insert_unique(hasher(&1), 1, hasher); - /// table.insert_unique(hasher(&2), 2, hasher); - /// table.insert_unique(hasher(&3), 3, hasher); - /// assert_eq!(table.find(hasher(&2), |&val| val == 2), Some(&2)); - /// assert_eq!(table.find(hasher(&4), |&val| val == 4), None); - /// # } - /// # fn main() { - /// # #[cfg(feature = "nightly")] - /// # test() - /// # } - /// ``` - pub fn find(&self, hash: u64, eq: impl FnMut(&T) -> bool) -> Option<&T> { - self.raw.get(hash, eq) - } - - /// Returns a mutable reference to an entry in the table with the given hash - /// and which satisfies the equality function passed. - /// - /// This method will call `eq` for all entries with the given hash, but may - /// also call it for entries with a different hash. `eq` should only return - /// true for the desired entry, at which point the search is stopped. - /// - /// When mutating an entry, you should ensure that it still retains the same - /// hash value as when it was inserted, otherwise lookups of that entry may - /// fail to find it. - /// - /// # Examples - /// - /// ``` - /// # #[cfg(feature = "nightly")] - /// # fn test() { - /// use ahash::AHasher; - /// use hashbrown::HashTable; - /// use std::hash::{BuildHasher, BuildHasherDefault}; - /// - /// let mut table = HashTable::new(); - /// let hasher = BuildHasherDefault::::default(); - /// let hasher = |val: &_| hasher.hash_one(val); - /// table.insert_unique(hasher(&1), (1, "a"), |val| hasher(&val.0)); - /// if let Some(val) = table.find_mut(hasher(&1), |val| val.0 == 1) { - /// val.1 = "b"; - /// } - /// assert_eq!(table.find(hasher(&1), |val| val.0 == 1), Some(&(1, "b"))); - /// assert_eq!(table.find(hasher(&2), |val| val.0 == 2), None); - /// # } - /// # fn main() { - /// # #[cfg(feature = "nightly")] - /// # test() - /// # } - /// ``` - pub fn find_mut(&mut self, hash: u64, eq: impl FnMut(&T) -> bool) -> Option<&mut T> { - self.raw.get_mut(hash, eq) - } - - /// Returns an `OccupiedEntry` for an entry in the table with the given hash - /// and which satisfies the equality function passed. - /// - /// This can be used to remove the entry from the table. Call - /// [`HashTable::entry`] instead if you wish to insert an entry if the - /// lookup fails. - /// - /// This method will call `eq` for all entries with the given hash, but may - /// also call it for entries with a different hash. `eq` should only return - /// true for the desired entry, at which point the search is stopped. - /// - /// # Examples - /// - /// ``` - /// # #[cfg(feature = "nightly")] - /// # fn test() { - /// use ahash::AHasher; - /// use hashbrown::HashTable; - /// use std::hash::{BuildHasher, BuildHasherDefault}; - /// - /// let mut table = HashTable::new(); - /// let hasher = BuildHasherDefault::::default(); - /// let hasher = |val: &_| hasher.hash_one(val); - /// table.insert_unique(hasher(&1), (1, "a"), |val| hasher(&val.0)); - /// if let Ok(entry) = table.find_entry(hasher(&1), |val| val.0 == 1) { - /// entry.remove(); - /// } - /// assert_eq!(table.find(hasher(&1), |val| val.0 == 1), None); - /// # } - /// # fn main() { - /// # #[cfg(feature = "nightly")] - /// # test() - /// # } - /// ``` - pub fn find_entry( - &mut self, - hash: u64, - eq: impl FnMut(&T) -> bool, - ) -> Result, AbsentEntry<'_, T, A>> { - match self.raw.find(hash, eq) { - Some(bucket) => Ok(OccupiedEntry { - hash, - bucket, - table: self, - }), - None => Err(AbsentEntry { table: self }), - } - } - - /// Returns an `Entry` for an entry in the table with the given hash - /// and which satisfies the equality function passed. - /// - /// This can be used to remove the entry from the table, or insert a new - /// entry with the given hash if one doesn't already exist. - /// - /// This method will call `eq` for all entries with the given hash, but may - /// also call it for entries with a different hash. `eq` should only return - /// true for the desired entry, at which point the search is stopped. - /// - /// This method may grow the table in preparation for an insertion. Call - /// [`HashTable::find_entry`] if this is undesirable. - /// - /// `hasher` is called if entries need to be moved or copied to a new table. - /// This must return the same hash value that each entry was inserted with. - /// - /// # Examples - /// - /// ``` - /// # #[cfg(feature = "nightly")] - /// # fn test() { - /// use ahash::AHasher; - /// use hashbrown::hash_table::Entry; - /// use hashbrown::HashTable; - /// use std::hash::{BuildHasher, BuildHasherDefault}; - /// - /// let mut table = HashTable::new(); - /// let hasher = BuildHasherDefault::::default(); - /// let hasher = |val: &_| hasher.hash_one(val); - /// table.insert_unique(hasher(&1), (1, "a"), |val| hasher(&val.0)); - /// if let Entry::Occupied(entry) = table.entry(hasher(&1), |val| val.0 == 1, |val| hasher(&val.0)) - /// { - /// entry.remove(); - /// } - /// if let Entry::Vacant(entry) = table.entry(hasher(&2), |val| val.0 == 2, |val| hasher(&val.0)) { - /// entry.insert((2, "b")); - /// } - /// assert_eq!(table.find(hasher(&1), |val| val.0 == 1), None); - /// assert_eq!(table.find(hasher(&2), |val| val.0 == 2), Some(&(2, "b"))); - /// # } - /// # fn main() { - /// # #[cfg(feature = "nightly")] - /// # test() - /// # } - /// ``` - pub fn entry( - &mut self, - hash: u64, - eq: impl FnMut(&T) -> bool, - hasher: impl Fn(&T) -> u64, - ) -> Entry<'_, T, A> { - match self.raw.find_or_find_insert_slot(hash, eq, hasher) { - Ok(bucket) => Entry::Occupied(OccupiedEntry { - hash, - bucket, - table: self, - }), - Err(insert_slot) => Entry::Vacant(VacantEntry { - hash, - insert_slot, - table: self, - }), - } - } - - /// Inserts an element into the `HashTable` with the given hash value, but - /// without checking whether an equivalent element already exists within the - /// table. - /// - /// `hasher` is called if entries need to be moved or copied to a new table. - /// This must return the same hash value that each entry was inserted with. - /// - /// # Examples - /// - /// ``` - /// # #[cfg(feature = "nightly")] - /// # fn test() { - /// use ahash::AHasher; - /// use hashbrown::HashTable; - /// use std::hash::{BuildHasher, BuildHasherDefault}; - /// - /// let mut v = HashTable::new(); - /// let hasher = BuildHasherDefault::::default(); - /// let hasher = |val: &_| hasher.hash_one(val); - /// v.insert_unique(hasher(&1), 1, hasher); - /// # } - /// # fn main() { - /// # #[cfg(feature = "nightly")] - /// # test() - /// # } - /// ``` - pub fn insert_unique( - &mut self, - hash: u64, - value: T, - hasher: impl Fn(&T) -> u64, - ) -> OccupiedEntry<'_, T, A> { - let bucket = self.raw.insert(hash, value, hasher); - OccupiedEntry { - hash, - bucket, - table: self, - } - } - - /// Clears the table, removing all values. - /// - /// # Examples - /// - /// ``` - /// # #[cfg(feature = "nightly")] - /// # fn test() { - /// use ahash::AHasher; - /// use hashbrown::HashTable; - /// use std::hash::{BuildHasher, BuildHasherDefault}; - /// - /// let mut v = HashTable::new(); - /// let hasher = BuildHasherDefault::::default(); - /// let hasher = |val: &_| hasher.hash_one(val); - /// v.insert_unique(hasher(&1), 1, hasher); - /// v.clear(); - /// assert!(v.is_empty()); - /// # } - /// # fn main() { - /// # #[cfg(feature = "nightly")] - /// # test() - /// # } - /// ``` - pub fn clear(&mut self) { - self.raw.clear(); - } - - /// Shrinks the capacity of the table as much as possible. It will drop - /// down as much as possible while maintaining the internal rules - /// and possibly leaving some space in accordance with the resize policy. - /// - /// `hasher` is called if entries need to be moved or copied to a new table. - /// This must return the same hash value that each entry was inserted with. - /// - /// # Examples - /// - /// ``` - /// # #[cfg(feature = "nightly")] - /// # fn test() { - /// use ahash::AHasher; - /// use hashbrown::HashTable; - /// use std::hash::{BuildHasher, BuildHasherDefault}; - /// - /// let mut table = HashTable::with_capacity(100); - /// let hasher = BuildHasherDefault::::default(); - /// let hasher = |val: &_| hasher.hash_one(val); - /// table.insert_unique(hasher(&1), 1, hasher); - /// table.insert_unique(hasher(&2), 2, hasher); - /// assert!(table.capacity() >= 100); - /// table.shrink_to_fit(hasher); - /// assert!(table.capacity() >= 2); - /// # } - /// # fn main() { - /// # #[cfg(feature = "nightly")] - /// # test() - /// # } - /// ``` - pub fn shrink_to_fit(&mut self, hasher: impl Fn(&T) -> u64) { - self.raw.shrink_to(self.len(), hasher) - } - - /// Shrinks the capacity of the table with a lower limit. It will drop - /// down no lower than the supplied limit while maintaining the internal rules - /// and possibly leaving some space in accordance with the resize policy. - /// - /// `hasher` is called if entries need to be moved or copied to a new table. - /// This must return the same hash value that each entry was inserted with. - /// - /// Panics if the current capacity is smaller than the supplied - /// minimum capacity. - /// - /// # Examples - /// - /// ``` - /// # #[cfg(feature = "nightly")] - /// # fn test() { - /// use ahash::AHasher; - /// use hashbrown::HashTable; - /// use std::hash::{BuildHasher, BuildHasherDefault}; - /// - /// let mut table = HashTable::with_capacity(100); - /// let hasher = BuildHasherDefault::::default(); - /// let hasher = |val: &_| hasher.hash_one(val); - /// table.insert_unique(hasher(&1), 1, hasher); - /// table.insert_unique(hasher(&2), 2, hasher); - /// assert!(table.capacity() >= 100); - /// table.shrink_to(10, hasher); - /// assert!(table.capacity() >= 10); - /// table.shrink_to(0, hasher); - /// assert!(table.capacity() >= 2); - /// # } - /// # fn main() { - /// # #[cfg(feature = "nightly")] - /// # test() - /// # } - /// ``` - pub fn shrink_to(&mut self, min_capacity: usize, hasher: impl Fn(&T) -> u64) { - self.raw.shrink_to(min_capacity, hasher); - } - - /// Reserves capacity for at least `additional` more elements to be inserted - /// in the `HashTable`. The collection may reserve more space to avoid - /// frequent reallocations. - /// - /// `hasher` is called if entries need to be moved or copied to a new table. - /// This must return the same hash value that each entry was inserted with. - /// - /// # Panics - /// - /// Panics if the new capacity exceeds [`isize::MAX`] bytes and [`abort`] the program - /// in case of allocation error. Use [`try_reserve`](HashTable::try_reserve) instead - /// if you want to handle memory allocation failure. - /// - /// [`isize::MAX`]: https://doc.rust-lang.org/std/primitive.isize.html - /// [`abort`]: https://doc.rust-lang.org/alloc/alloc/fn.handle_alloc_error.html - /// - /// # Examples - /// - /// ``` - /// # #[cfg(feature = "nightly")] - /// # fn test() { - /// use ahash::AHasher; - /// use hashbrown::HashTable; - /// use std::hash::{BuildHasher, BuildHasherDefault}; - /// - /// let mut table: HashTable = HashTable::new(); - /// let hasher = BuildHasherDefault::::default(); - /// let hasher = |val: &_| hasher.hash_one(val); - /// table.reserve(10, hasher); - /// assert!(table.capacity() >= 10); - /// # } - /// # fn main() { - /// # #[cfg(feature = "nightly")] - /// # test() - /// # } - /// ``` - pub fn reserve(&mut self, additional: usize, hasher: impl Fn(&T) -> u64) { - self.raw.reserve(additional, hasher) - } - - /// Tries to reserve capacity for at least `additional` more elements to be inserted - /// in the given `HashTable`. The collection may reserve more space to avoid - /// frequent reallocations. - /// - /// `hasher` is called if entries need to be moved or copied to a new table. - /// This must return the same hash value that each entry was inserted with. - /// - /// # Errors - /// - /// If the capacity overflows, or the allocator reports a failure, then an error - /// is returned. - /// - /// # Examples - /// - /// ``` - /// # #[cfg(feature = "nightly")] - /// # fn test() { - /// use ahash::AHasher; - /// use hashbrown::HashTable; - /// use std::hash::{BuildHasher, BuildHasherDefault}; - /// - /// let mut table: HashTable = HashTable::new(); - /// let hasher = BuildHasherDefault::::default(); - /// let hasher = |val: &_| hasher.hash_one(val); - /// table - /// .try_reserve(10, hasher) - /// .expect("why is the test harness OOMing on 10 bytes?"); - /// # } - /// # fn main() { - /// # #[cfg(feature = "nightly")] - /// # test() - /// # } - /// ``` - pub fn try_reserve( - &mut self, - additional: usize, - hasher: impl Fn(&T) -> u64, - ) -> Result<(), TryReserveError> { - self.raw.try_reserve(additional, hasher) - } - - /// Returns the number of elements the table can hold without reallocating. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashTable; - /// let table: HashTable = HashTable::with_capacity(100); - /// assert!(table.capacity() >= 100); - /// ``` - pub fn capacity(&self) -> usize { - self.raw.capacity() - } - - /// Returns the number of elements in the table. - /// - /// # Examples - /// - /// ``` - /// # #[cfg(feature = "nightly")] - /// # fn test() { - /// use ahash::AHasher; - /// use hashbrown::HashTable; - /// use std::hash::{BuildHasher, BuildHasherDefault}; - /// - /// let hasher = BuildHasherDefault::::default(); - /// let hasher = |val: &_| hasher.hash_one(val); - /// let mut v = HashTable::new(); - /// assert_eq!(v.len(), 0); - /// v.insert_unique(hasher(&1), 1, hasher); - /// assert_eq!(v.len(), 1); - /// # } - /// # fn main() { - /// # #[cfg(feature = "nightly")] - /// # test() - /// # } - /// ``` - pub fn len(&self) -> usize { - self.raw.len() - } - - /// Returns `true` if the set contains no elements. - /// - /// # Examples - /// - /// ``` - /// # #[cfg(feature = "nightly")] - /// # fn test() { - /// use ahash::AHasher; - /// use hashbrown::HashTable; - /// use std::hash::{BuildHasher, BuildHasherDefault}; - /// - /// let hasher = BuildHasherDefault::::default(); - /// let hasher = |val: &_| hasher.hash_one(val); - /// let mut v = HashTable::new(); - /// assert!(v.is_empty()); - /// v.insert_unique(hasher(&1), 1, hasher); - /// assert!(!v.is_empty()); - /// # } - /// # fn main() { - /// # #[cfg(feature = "nightly")] - /// # test() - /// # } - /// ``` - pub fn is_empty(&self) -> bool { - self.raw.is_empty() - } - - /// An iterator visiting all elements in arbitrary order. - /// The iterator element type is `&'a T`. - /// - /// # Examples - /// - /// ``` - /// # #[cfg(feature = "nightly")] - /// # fn test() { - /// use ahash::AHasher; - /// use hashbrown::HashTable; - /// use std::hash::{BuildHasher, BuildHasherDefault}; - /// - /// let mut table = HashTable::new(); - /// let hasher = BuildHasherDefault::::default(); - /// let hasher = |val: &_| hasher.hash_one(val); - /// table.insert_unique(hasher(&"a"), "b", hasher); - /// table.insert_unique(hasher(&"b"), "b", hasher); - /// - /// // Will print in an arbitrary order. - /// for x in table.iter() { - /// println!("{}", x); - /// } - /// # } - /// # fn main() { - /// # #[cfg(feature = "nightly")] - /// # test() - /// # } - /// ``` - pub fn iter(&self) -> Iter<'_, T> { - Iter { - inner: unsafe { self.raw.iter() }, - marker: PhantomData, - } - } - - /// An iterator visiting all elements in arbitrary order, - /// with mutable references to the elements. - /// The iterator element type is `&'a mut T`. - /// - /// # Examples - /// - /// ``` - /// # #[cfg(feature = "nightly")] - /// # fn test() { - /// use ahash::AHasher; - /// use hashbrown::HashTable; - /// use std::hash::{BuildHasher, BuildHasherDefault}; - /// - /// let mut table = HashTable::new(); - /// let hasher = BuildHasherDefault::::default(); - /// let hasher = |val: &_| hasher.hash_one(val); - /// table.insert_unique(hasher(&1), 1, hasher); - /// table.insert_unique(hasher(&2), 2, hasher); - /// table.insert_unique(hasher(&3), 3, hasher); - /// - /// // Update all values - /// for val in table.iter_mut() { - /// *val *= 2; - /// } - /// - /// assert_eq!(table.len(), 3); - /// let mut vec: Vec = Vec::new(); - /// - /// for val in &table { - /// println!("val: {}", val); - /// vec.push(*val); - /// } - /// - /// // The `Iter` iterator produces items in arbitrary order, so the - /// // items must be sorted to test them against a sorted array. - /// vec.sort_unstable(); - /// assert_eq!(vec, [2, 4, 6]); - /// - /// assert_eq!(table.len(), 3); - /// # } - /// # fn main() { - /// # #[cfg(feature = "nightly")] - /// # test() - /// # } - /// ``` - pub fn iter_mut(&mut self) -> IterMut<'_, T> { - IterMut { - inner: unsafe { self.raw.iter() }, - marker: PhantomData, - } - } - - /// Retains only the elements specified by the predicate. - /// - /// In other words, remove all elements `e` such that `f(&e)` returns `false`. - /// - /// # Examples - /// - /// ``` - /// # #[cfg(feature = "nightly")] - /// # fn test() { - /// use ahash::AHasher; - /// use hashbrown::HashTable; - /// use std::hash::{BuildHasher, BuildHasherDefault}; - /// - /// let mut table = HashTable::new(); - /// let hasher = BuildHasherDefault::::default(); - /// let hasher = |val: &_| hasher.hash_one(val); - /// for x in 1..=6 { - /// table.insert_unique(hasher(&x), x, hasher); - /// } - /// table.retain(|&mut x| x % 2 == 0); - /// assert_eq!(table.len(), 3); - /// # } - /// # fn main() { - /// # #[cfg(feature = "nightly")] - /// # test() - /// # } - /// ``` - pub fn retain(&mut self, mut f: impl FnMut(&mut T) -> bool) { - // Here we only use `iter` as a temporary, preventing use-after-free - unsafe { - for item in self.raw.iter() { - if !f(item.as_mut()) { - self.raw.erase(item); - } - } - } - } - - /// Clears the set, returning all elements in an iterator. - /// - /// # Examples - /// - /// ``` - /// # #[cfg(feature = "nightly")] - /// # fn test() { - /// use ahash::AHasher; - /// use hashbrown::HashTable; - /// use std::hash::{BuildHasher, BuildHasherDefault}; - /// - /// let mut table = HashTable::new(); - /// let hasher = BuildHasherDefault::::default(); - /// let hasher = |val: &_| hasher.hash_one(val); - /// for x in 1..=3 { - /// table.insert_unique(hasher(&x), x, hasher); - /// } - /// assert!(!table.is_empty()); - /// - /// // print 1, 2, 3 in an arbitrary order - /// for i in table.drain() { - /// println!("{}", i); - /// } - /// - /// assert!(table.is_empty()); - /// # } - /// # fn main() { - /// # #[cfg(feature = "nightly")] - /// # test() - /// # } - /// ``` - pub fn drain(&mut self) -> Drain<'_, T, A> { - Drain { - inner: self.raw.drain(), - } - } - - /// Drains elements which are true under the given predicate, - /// and returns an iterator over the removed items. - /// - /// In other words, move all elements `e` such that `f(&e)` returns `true` out - /// into another iterator. - /// - /// If the returned `ExtractIf` is not exhausted, e.g. because it is dropped without iterating - /// or the iteration short-circuits, then the remaining elements will be retained. - /// Use [`retain()`] with a negated predicate if you do not need the returned iterator. - /// - /// [`retain()`]: HashTable::retain - /// - /// # Examples - /// - /// ``` - /// # #[cfg(feature = "nightly")] - /// # fn test() { - /// use ahash::AHasher; - /// use hashbrown::HashTable; - /// use std::hash::{BuildHasher, BuildHasherDefault}; - /// - /// let mut table = HashTable::new(); - /// let hasher = BuildHasherDefault::::default(); - /// let hasher = |val: &_| hasher.hash_one(val); - /// for x in 0..8 { - /// table.insert_unique(hasher(&x), x, hasher); - /// } - /// let drained: Vec = table.extract_if(|&mut v| v % 2 == 0).collect(); - /// - /// let mut evens = drained.into_iter().collect::>(); - /// let mut odds = table.into_iter().collect::>(); - /// evens.sort(); - /// odds.sort(); - /// - /// assert_eq!(evens, vec![0, 2, 4, 6]); - /// assert_eq!(odds, vec![1, 3, 5, 7]); - /// # } - /// # fn main() { - /// # #[cfg(feature = "nightly")] - /// # test() - /// # } - /// ``` - pub fn extract_if(&mut self, f: F) -> ExtractIf<'_, T, F, A> - where - F: FnMut(&mut T) -> bool, - { - ExtractIf { - f, - inner: RawExtractIf { - iter: unsafe { self.raw.iter() }, - table: &mut self.raw, - }, - } - } - - /// Attempts to get mutable references to `N` values in the map at once. - /// - /// The `eq` argument should be a closure such that `eq(i, k)` returns true if `k` is equal to - /// the `i`th key to be looked up. - /// - /// Returns an array of length `N` with the results of each query. For soundness, at most one - /// mutable reference will be returned to any value. `None` will be returned if any of the - /// keys are duplicates or missing. - /// - /// # Examples - /// - /// ``` - /// # #[cfg(feature = "nightly")] - /// # fn test() { - /// use ahash::AHasher; - /// use hashbrown::hash_table::Entry; - /// use hashbrown::HashTable; - /// use std::hash::{BuildHasher, BuildHasherDefault}; - /// - /// let mut libraries: HashTable<(&str, u32)> = HashTable::new(); - /// let hasher = BuildHasherDefault::::default(); - /// let hasher = |val: &_| hasher.hash_one(val); - /// for (k, v) in [ - /// ("Bodleian Library", 1602), - /// ("Athenæum", 1807), - /// ("Herzogin-Anna-Amalia-Bibliothek", 1691), - /// ("Library of Congress", 1800), - /// ] { - /// libraries.insert_unique(hasher(&k), (k, v), |(k, _)| hasher(&k)); - /// } - /// - /// let keys = ["Athenæum", "Library of Congress"]; - /// let got = libraries.get_many_mut(keys.map(|k| hasher(&k)), |i, val| keys[i] == val.0); - /// assert_eq!( - /// got, - /// Some([&mut ("Athenæum", 1807), &mut ("Library of Congress", 1800),]), - /// ); - /// - /// // Missing keys result in None - /// let keys = ["Athenæum", "New York Public Library"]; - /// let got = libraries.get_many_mut(keys.map(|k| hasher(&k)), |i, val| keys[i] == val.0); - /// assert_eq!(got, None); - /// - /// // Duplicate keys result in None - /// let keys = ["Athenæum", "Athenæum"]; - /// let got = libraries.get_many_mut(keys.map(|k| hasher(&k)), |i, val| keys[i] == val.0); - /// assert_eq!(got, None); - /// # } - /// # fn main() { - /// # #[cfg(feature = "nightly")] - /// # test() - /// # } - /// ``` - pub fn get_many_mut( - &mut self, - hashes: [u64; N], - eq: impl FnMut(usize, &T) -> bool, - ) -> Option<[&'_ mut T; N]> { - self.raw.get_many_mut(hashes, eq) - } - - /// Attempts to get mutable references to `N` values in the map at once, without validating that - /// the values are unique. - /// - /// The `eq` argument should be a closure such that `eq(i, k)` returns true if `k` is equal to - /// the `i`th key to be looked up. - /// - /// Returns an array of length `N` with the results of each query. `None` will be returned if - /// any of the keys are missing. - /// - /// For a safe alternative see [`get_many_mut`](`HashTable::get_many_mut`). - /// - /// # Safety - /// - /// Calling this method with overlapping keys is *[undefined behavior]* even if the resulting - /// references are not used. - /// - /// [undefined behavior]: https://doc.rust-lang.org/reference/behavior-considered-undefined.html - /// - /// # Examples - /// - /// ``` - /// # #[cfg(feature = "nightly")] - /// # fn test() { - /// use ahash::AHasher; - /// use hashbrown::hash_table::Entry; - /// use hashbrown::HashTable; - /// use std::hash::{BuildHasher, BuildHasherDefault}; - /// - /// let mut libraries: HashTable<(&str, u32)> = HashTable::new(); - /// let hasher = BuildHasherDefault::::default(); - /// let hasher = |val: &_| hasher.hash_one(val); - /// for (k, v) in [ - /// ("Bodleian Library", 1602), - /// ("Athenæum", 1807), - /// ("Herzogin-Anna-Amalia-Bibliothek", 1691), - /// ("Library of Congress", 1800), - /// ] { - /// libraries.insert_unique(hasher(&k), (k, v), |(k, _)| hasher(&k)); - /// } - /// - /// let keys = ["Athenæum", "Library of Congress"]; - /// let got = libraries.get_many_mut(keys.map(|k| hasher(&k)), |i, val| keys[i] == val.0); - /// assert_eq!( - /// got, - /// Some([&mut ("Athenæum", 1807), &mut ("Library of Congress", 1800),]), - /// ); - /// - /// // Missing keys result in None - /// let keys = ["Athenæum", "New York Public Library"]; - /// let got = libraries.get_many_mut(keys.map(|k| hasher(&k)), |i, val| keys[i] == val.0); - /// assert_eq!(got, None); - /// - /// // Duplicate keys result in None - /// let keys = ["Athenæum", "Athenæum"]; - /// let got = libraries.get_many_mut(keys.map(|k| hasher(&k)), |i, val| keys[i] == val.0); - /// assert_eq!(got, None); - /// # } - /// # fn main() { - /// # #[cfg(feature = "nightly")] - /// # test() - /// # } - /// ``` - pub unsafe fn get_many_unchecked_mut( - &mut self, - hashes: [u64; N], - eq: impl FnMut(usize, &T) -> bool, - ) -> Option<[&'_ mut T; N]> { - self.raw.get_many_unchecked_mut(hashes, eq) - } -} - -impl IntoIterator for HashTable -where - A: Allocator, -{ - type Item = T; - type IntoIter = IntoIter; - - fn into_iter(self) -> IntoIter { - IntoIter { - inner: self.raw.into_iter(), - } - } -} - -impl<'a, T, A> IntoIterator for &'a HashTable -where - A: Allocator, -{ - type Item = &'a T; - type IntoIter = Iter<'a, T>; - - fn into_iter(self) -> Iter<'a, T> { - self.iter() - } -} - -impl<'a, T, A> IntoIterator for &'a mut HashTable -where - A: Allocator, -{ - type Item = &'a mut T; - type IntoIter = IterMut<'a, T>; - - fn into_iter(self) -> IterMut<'a, T> { - self.iter_mut() - } -} - -impl Default for HashTable -where - A: Allocator + Default, -{ - fn default() -> Self { - Self { - raw: Default::default(), - } - } -} - -impl Clone for HashTable -where - T: Clone, - A: Allocator + Clone, -{ - fn clone(&self) -> Self { - Self { - raw: self.raw.clone(), - } - } -} - -impl fmt::Debug for HashTable -where - T: fmt::Debug, - A: Allocator, -{ - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_set().entries(self.iter()).finish() - } -} - -/// A view into a single entry in a table, which may either be vacant or occupied. -/// -/// This `enum` is constructed from the [`entry`] method on [`HashTable`]. -/// -/// [`HashTable`]: struct.HashTable.html -/// [`entry`]: struct.HashTable.html#method.entry -/// -/// # Examples -/// -/// ``` -/// # #[cfg(feature = "nightly")] -/// # fn test() { -/// use ahash::AHasher; -/// use hashbrown::hash_table::{Entry, HashTable, OccupiedEntry}; -/// use std::hash::{BuildHasher, BuildHasherDefault}; -/// -/// let mut table = HashTable::new(); -/// let hasher = BuildHasherDefault::::default(); -/// let hasher = |val: &_| hasher.hash_one(val); -/// for x in ["a", "b", "c"] { -/// table.insert_unique(hasher(&x), x, hasher); -/// } -/// assert_eq!(table.len(), 3); -/// -/// // Existing value (insert) -/// let entry: Entry<_> = table.entry(hasher(&"a"), |&x| x == "a", hasher); -/// let _raw_o: OccupiedEntry<_, _> = entry.insert("a"); -/// assert_eq!(table.len(), 3); -/// // Nonexistent value (insert) -/// table.entry(hasher(&"d"), |&x| x == "d", hasher).insert("d"); -/// -/// // Existing value (or_insert) -/// table -/// .entry(hasher(&"b"), |&x| x == "b", hasher) -/// .or_insert("b"); -/// // Nonexistent value (or_insert) -/// table -/// .entry(hasher(&"e"), |&x| x == "e", hasher) -/// .or_insert("e"); -/// -/// println!("Our HashTable: {:?}", table); -/// -/// let mut vec: Vec<_> = table.iter().copied().collect(); -/// // The `Iter` iterator produces items in arbitrary order, so the -/// // items must be sorted to test them against a sorted array. -/// vec.sort_unstable(); -/// assert_eq!(vec, ["a", "b", "c", "d", "e"]); -/// # } -/// # fn main() { -/// # #[cfg(feature = "nightly")] -/// # test() -/// # } -/// ``` -pub enum Entry<'a, T, A = Global> -where - A: Allocator, -{ - /// An occupied entry. - /// - /// # Examples - /// - /// ``` - /// # #[cfg(feature = "nightly")] - /// # fn test() { - /// use ahash::AHasher; - /// use hashbrown::hash_table::{Entry, HashTable, OccupiedEntry}; - /// use std::hash::{BuildHasher, BuildHasherDefault}; - /// - /// let mut table = HashTable::new(); - /// let hasher = BuildHasherDefault::::default(); - /// let hasher = |val: &_| hasher.hash_one(val); - /// for x in ["a", "b"] { - /// table.insert_unique(hasher(&x), x, hasher); - /// } - /// - /// match table.entry(hasher(&"a"), |&x| x == "a", hasher) { - /// Entry::Vacant(_) => unreachable!(), - /// Entry::Occupied(_) => {} - /// } - /// # } - /// # fn main() { - /// # #[cfg(feature = "nightly")] - /// # test() - /// # } - /// ``` - Occupied(OccupiedEntry<'a, T, A>), - - /// A vacant entry. - /// - /// # Examples - /// - /// ``` - /// # #[cfg(feature = "nightly")] - /// # fn test() { - /// use ahash::AHasher; - /// use hashbrown::hash_table::{Entry, HashTable, OccupiedEntry}; - /// use std::hash::{BuildHasher, BuildHasherDefault}; - /// - /// let mut table = HashTable::<&str>::new(); - /// let hasher = BuildHasherDefault::::default(); - /// let hasher = |val: &_| hasher.hash_one(val); - /// - /// match table.entry(hasher(&"a"), |&x| x == "a", hasher) { - /// Entry::Vacant(_) => {} - /// Entry::Occupied(_) => unreachable!(), - /// } - /// # } - /// # fn main() { - /// # #[cfg(feature = "nightly")] - /// # test() - /// # } - /// ``` - Vacant(VacantEntry<'a, T, A>), -} - -impl fmt::Debug for Entry<'_, T, A> { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match *self { - Entry::Vacant(ref v) => f.debug_tuple("Entry").field(v).finish(), - Entry::Occupied(ref o) => f.debug_tuple("Entry").field(o).finish(), - } - } -} - -impl<'a, T, A> Entry<'a, T, A> -where - A: Allocator, -{ - /// Sets the value of the entry, replacing any existing value if there is - /// one, and returns an [`OccupiedEntry`]. - /// - /// # Examples - /// - /// ``` - /// # #[cfg(feature = "nightly")] - /// # fn test() { - /// use ahash::AHasher; - /// use hashbrown::HashTable; - /// use std::hash::{BuildHasher, BuildHasherDefault}; - /// - /// let mut table: HashTable<&str> = HashTable::new(); - /// let hasher = BuildHasherDefault::::default(); - /// let hasher = |val: &_| hasher.hash_one(val); - /// - /// let entry = table - /// .entry(hasher(&"horseyland"), |&x| x == "horseyland", hasher) - /// .insert("horseyland"); - /// - /// assert_eq!(entry.get(), &"horseyland"); - /// # } - /// # fn main() { - /// # #[cfg(feature = "nightly")] - /// # test() - /// # } - /// ``` - pub fn insert(self, value: T) -> OccupiedEntry<'a, T, A> { - match self { - Entry::Occupied(mut entry) => { - *entry.get_mut() = value; - entry - } - Entry::Vacant(entry) => entry.insert(value), - } - } - - /// Ensures a value is in the entry by inserting if it was vacant. - /// - /// Returns an [`OccupiedEntry`] pointing to the now-occupied entry. - /// - /// # Examples - /// - /// ``` - /// # #[cfg(feature = "nightly")] - /// # fn test() { - /// use ahash::AHasher; - /// use hashbrown::HashTable; - /// use std::hash::{BuildHasher, BuildHasherDefault}; - /// - /// let mut table: HashTable<&str> = HashTable::new(); - /// let hasher = BuildHasherDefault::::default(); - /// let hasher = |val: &_| hasher.hash_one(val); - /// - /// // nonexistent key - /// table - /// .entry(hasher(&"poneyland"), |&x| x == "poneyland", hasher) - /// .or_insert("poneyland"); - /// assert!(table - /// .find(hasher(&"poneyland"), |&x| x == "poneyland") - /// .is_some()); - /// - /// // existing key - /// table - /// .entry(hasher(&"poneyland"), |&x| x == "poneyland", hasher) - /// .or_insert("poneyland"); - /// assert!(table - /// .find(hasher(&"poneyland"), |&x| x == "poneyland") - /// .is_some()); - /// assert_eq!(table.len(), 1); - /// # } - /// # fn main() { - /// # #[cfg(feature = "nightly")] - /// # test() - /// # } - /// ``` - pub fn or_insert(self, default: T) -> OccupiedEntry<'a, T, A> { - match self { - Entry::Occupied(entry) => entry, - Entry::Vacant(entry) => entry.insert(default), - } - } - - /// Ensures a value is in the entry by inserting the result of the default function if empty.. - /// - /// Returns an [`OccupiedEntry`] pointing to the now-occupied entry. - /// - /// # Examples - /// - /// ``` - /// # #[cfg(feature = "nightly")] - /// # fn test() { - /// use ahash::AHasher; - /// use hashbrown::HashTable; - /// use std::hash::{BuildHasher, BuildHasherDefault}; - /// - /// let mut table: HashTable = HashTable::new(); - /// let hasher = BuildHasherDefault::::default(); - /// let hasher = |val: &_| hasher.hash_one(val); - /// - /// table - /// .entry(hasher("poneyland"), |x| x == "poneyland", |val| hasher(val)) - /// .or_insert_with(|| "poneyland".to_string()); - /// - /// assert!(table - /// .find(hasher(&"poneyland"), |x| x == "poneyland") - /// .is_some()); - /// # } - /// # fn main() { - /// # #[cfg(feature = "nightly")] - /// # test() - /// # } - /// ``` - pub fn or_insert_with(self, default: impl FnOnce() -> T) -> OccupiedEntry<'a, T, A> { - match self { - Entry::Occupied(entry) => entry, - Entry::Vacant(entry) => entry.insert(default()), - } - } - - /// Provides in-place mutable access to an occupied entry before any - /// potential inserts into the table. - /// - /// # Examples - /// - /// ``` - /// # #[cfg(feature = "nightly")] - /// # fn test() { - /// use ahash::AHasher; - /// use hashbrown::HashTable; - /// use std::hash::{BuildHasher, BuildHasherDefault}; - /// - /// let mut table: HashTable<(&str, u32)> = HashTable::new(); - /// let hasher = BuildHasherDefault::::default(); - /// let hasher = |val: &_| hasher.hash_one(val); - /// - /// table - /// .entry( - /// hasher(&"poneyland"), - /// |&(x, _)| x == "poneyland", - /// |(k, _)| hasher(&k), - /// ) - /// .and_modify(|(_, v)| *v += 1) - /// .or_insert(("poneyland", 42)); - /// assert_eq!( - /// table.find(hasher(&"poneyland"), |&(k, _)| k == "poneyland"), - /// Some(&("poneyland", 42)) - /// ); - /// - /// table - /// .entry( - /// hasher(&"poneyland"), - /// |&(x, _)| x == "poneyland", - /// |(k, _)| hasher(&k), - /// ) - /// .and_modify(|(_, v)| *v += 1) - /// .or_insert(("poneyland", 42)); - /// assert_eq!( - /// table.find(hasher(&"poneyland"), |&(k, _)| k == "poneyland"), - /// Some(&("poneyland", 43)) - /// ); - /// # } - /// # fn main() { - /// # #[cfg(feature = "nightly")] - /// # test() - /// # } - /// ``` - pub fn and_modify(self, f: impl FnOnce(&mut T)) -> Self { - match self { - Entry::Occupied(mut entry) => { - f(entry.get_mut()); - Entry::Occupied(entry) - } - Entry::Vacant(entry) => Entry::Vacant(entry), - } - } -} - -/// A view into an occupied entry in a `HashTable`. -/// It is part of the [`Entry`] enum. -/// -/// [`Entry`]: enum.Entry.html -/// -/// # Examples -/// -/// ``` -/// # #[cfg(feature = "nightly")] -/// # fn test() { -/// use ahash::AHasher; -/// use hashbrown::hash_table::{Entry, HashTable, OccupiedEntry}; -/// use std::hash::{BuildHasher, BuildHasherDefault}; -/// -/// let mut table = HashTable::new(); -/// let hasher = BuildHasherDefault::::default(); -/// let hasher = |val: &_| hasher.hash_one(val); -/// for x in ["a", "b", "c"] { -/// table.insert_unique(hasher(&x), x, hasher); -/// } -/// assert_eq!(table.len(), 3); -/// -/// let _entry_o: OccupiedEntry<_, _> = table.find_entry(hasher(&"a"), |&x| x == "a").unwrap(); -/// assert_eq!(table.len(), 3); -/// -/// // Existing key -/// match table.entry(hasher(&"a"), |&x| x == "a", hasher) { -/// Entry::Vacant(_) => unreachable!(), -/// Entry::Occupied(view) => { -/// assert_eq!(view.get(), &"a"); -/// } -/// } -/// -/// assert_eq!(table.len(), 3); -/// -/// // Existing key (take) -/// match table.entry(hasher(&"c"), |&x| x == "c", hasher) { -/// Entry::Vacant(_) => unreachable!(), -/// Entry::Occupied(view) => { -/// assert_eq!(view.remove().0, "c"); -/// } -/// } -/// assert_eq!(table.find(hasher(&"c"), |&x| x == "c"), None); -/// assert_eq!(table.len(), 2); -/// # } -/// # fn main() { -/// # #[cfg(feature = "nightly")] -/// # test() -/// # } -/// ``` -pub struct OccupiedEntry<'a, T, A = Global> -where - A: Allocator, -{ - hash: u64, - bucket: Bucket, - table: &'a mut HashTable, -} - -unsafe impl Send for OccupiedEntry<'_, T, A> -where - T: Send, - A: Send + Allocator, -{ -} -unsafe impl Sync for OccupiedEntry<'_, T, A> -where - T: Sync, - A: Sync + Allocator, -{ -} - -impl fmt::Debug for OccupiedEntry<'_, T, A> { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("OccupiedEntry") - .field("value", self.get()) - .finish() - } -} - -impl<'a, T, A> OccupiedEntry<'a, T, A> -where - A: Allocator, -{ - /// Takes the value out of the entry, and returns it along with a - /// `VacantEntry` that can be used to insert another value with the same - /// hash as the one that was just removed. - /// - /// # Examples - /// - /// ``` - /// # #[cfg(feature = "nightly")] - /// # fn test() { - /// use ahash::AHasher; - /// use hashbrown::hash_table::Entry; - /// use hashbrown::HashTable; - /// use std::hash::{BuildHasher, BuildHasherDefault}; - /// - /// let mut table: HashTable<&str> = HashTable::new(); - /// let hasher = BuildHasherDefault::::default(); - /// let hasher = |val: &_| hasher.hash_one(val); - /// // The table is empty - /// assert!(table.is_empty() && table.capacity() == 0); - /// - /// table.insert_unique(hasher(&"poneyland"), "poneyland", hasher); - /// let capacity_before_remove = table.capacity(); - /// - /// if let Entry::Occupied(o) = table.entry(hasher(&"poneyland"), |&x| x == "poneyland", hasher) { - /// assert_eq!(o.remove().0, "poneyland"); - /// } - /// - /// assert!(table - /// .find(hasher(&"poneyland"), |&x| x == "poneyland") - /// .is_none()); - /// // Now table hold none elements but capacity is equal to the old one - /// assert!(table.len() == 0 && table.capacity() == capacity_before_remove); - /// # } - /// # fn main() { - /// # #[cfg(feature = "nightly")] - /// # test() - /// # } - /// ``` - pub fn remove(self) -> (T, VacantEntry<'a, T, A>) { - let (val, slot) = unsafe { self.table.raw.remove(self.bucket) }; - ( - val, - VacantEntry { - hash: self.hash, - insert_slot: slot, - table: self.table, - }, - ) - } - - /// Gets a reference to the value in the entry. - /// - /// # Examples - /// - /// ``` - /// # #[cfg(feature = "nightly")] - /// # fn test() { - /// use ahash::AHasher; - /// use hashbrown::hash_table::Entry; - /// use hashbrown::HashTable; - /// use std::hash::{BuildHasher, BuildHasherDefault}; - /// - /// let mut table: HashTable<&str> = HashTable::new(); - /// let hasher = BuildHasherDefault::::default(); - /// let hasher = |val: &_| hasher.hash_one(val); - /// table.insert_unique(hasher(&"poneyland"), "poneyland", hasher); - /// - /// match table.entry(hasher(&"poneyland"), |&x| x == "poneyland", hasher) { - /// Entry::Vacant(_) => panic!(), - /// Entry::Occupied(entry) => assert_eq!(entry.get(), &"poneyland"), - /// } - /// # } - /// # fn main() { - /// # #[cfg(feature = "nightly")] - /// # test() - /// # } - /// ``` - pub fn get(&self) -> &T { - unsafe { self.bucket.as_ref() } - } - - /// Gets a mutable reference to the value in the entry. - /// - /// If you need a reference to the `OccupiedEntry` which may outlive the - /// destruction of the `Entry` value, see [`into_mut`]. - /// - /// [`into_mut`]: #method.into_mut - /// - /// # Examples - /// - /// ``` - /// # #[cfg(feature = "nightly")] - /// # fn test() { - /// use ahash::AHasher; - /// use hashbrown::hash_table::Entry; - /// use hashbrown::HashTable; - /// use std::hash::{BuildHasher, BuildHasherDefault}; - /// - /// let mut table: HashTable<(&str, u32)> = HashTable::new(); - /// let hasher = BuildHasherDefault::::default(); - /// let hasher = |val: &_| hasher.hash_one(val); - /// table.insert_unique(hasher(&"poneyland"), ("poneyland", 12), |(k, _)| hasher(&k)); - /// - /// assert_eq!( - /// table.find(hasher(&"poneyland"), |&(x, _)| x == "poneyland",), - /// Some(&("poneyland", 12)) - /// ); - /// - /// if let Entry::Occupied(mut o) = table.entry( - /// hasher(&"poneyland"), - /// |&(x, _)| x == "poneyland", - /// |(k, _)| hasher(&k), - /// ) { - /// o.get_mut().1 += 10; - /// assert_eq!(o.get().1, 22); - /// - /// // We can use the same Entry multiple times. - /// o.get_mut().1 += 2; - /// } - /// - /// assert_eq!( - /// table.find(hasher(&"poneyland"), |&(x, _)| x == "poneyland",), - /// Some(&("poneyland", 24)) - /// ); - /// # } - /// # fn main() { - /// # #[cfg(feature = "nightly")] - /// # test() - /// # } - /// ``` - pub fn get_mut(&mut self) -> &mut T { - unsafe { self.bucket.as_mut() } - } - - /// Converts the OccupiedEntry into a mutable reference to the value in the entry - /// with a lifetime bound to the table itself. - /// - /// If you need multiple references to the `OccupiedEntry`, see [`get_mut`]. - /// - /// [`get_mut`]: #method.get_mut - /// - /// # Examples - /// - /// ``` - /// # #[cfg(feature = "nightly")] - /// # fn test() { - /// use ahash::AHasher; - /// use hashbrown::hash_table::Entry; - /// use hashbrown::HashTable; - /// use std::hash::{BuildHasher, BuildHasherDefault}; - /// - /// let mut table: HashTable<(&str, u32)> = HashTable::new(); - /// let hasher = BuildHasherDefault::::default(); - /// let hasher = |val: &_| hasher.hash_one(val); - /// table.insert_unique(hasher(&"poneyland"), ("poneyland", 12), |(k, _)| hasher(&k)); - /// - /// assert_eq!( - /// table.find(hasher(&"poneyland"), |&(x, _)| x == "poneyland",), - /// Some(&("poneyland", 12)) - /// ); - /// - /// let value: &mut (&str, u32); - /// match table.entry( - /// hasher(&"poneyland"), - /// |&(x, _)| x == "poneyland", - /// |(k, _)| hasher(&k), - /// ) { - /// Entry::Occupied(entry) => value = entry.into_mut(), - /// Entry::Vacant(_) => panic!(), - /// } - /// value.1 += 10; - /// - /// assert_eq!( - /// table.find(hasher(&"poneyland"), |&(x, _)| x == "poneyland",), - /// Some(&("poneyland", 22)) - /// ); - /// # } - /// # fn main() { - /// # #[cfg(feature = "nightly")] - /// # test() - /// # } - /// ``` - pub fn into_mut(self) -> &'a mut T { - unsafe { self.bucket.as_mut() } - } - - /// Converts the OccupiedEntry into a mutable reference to the underlying - /// table. - pub fn into_table(self) -> &'a mut HashTable { - self.table - } -} - -/// A view into a vacant entry in a `HashTable`. -/// It is part of the [`Entry`] enum. -/// -/// [`Entry`]: enum.Entry.html -/// -/// # Examples -/// -/// ``` -/// # #[cfg(feature = "nightly")] -/// # fn test() { -/// use ahash::AHasher; -/// use hashbrown::hash_table::{Entry, HashTable, VacantEntry}; -/// use std::hash::{BuildHasher, BuildHasherDefault}; -/// -/// let mut table: HashTable<&str> = HashTable::new(); -/// let hasher = BuildHasherDefault::::default(); -/// let hasher = |val: &_| hasher.hash_one(val); -/// -/// let entry_v: VacantEntry<_, _> = match table.entry(hasher(&"a"), |&x| x == "a", hasher) { -/// Entry::Vacant(view) => view, -/// Entry::Occupied(_) => unreachable!(), -/// }; -/// entry_v.insert("a"); -/// assert!(table.find(hasher(&"a"), |&x| x == "a").is_some() && table.len() == 1); -/// -/// // Nonexistent key (insert) -/// match table.entry(hasher(&"b"), |&x| x == "b", hasher) { -/// Entry::Vacant(view) => { -/// view.insert("b"); -/// } -/// Entry::Occupied(_) => unreachable!(), -/// } -/// assert!(table.find(hasher(&"b"), |&x| x == "b").is_some() && table.len() == 2); -/// # } -/// # fn main() { -/// # #[cfg(feature = "nightly")] -/// # test() -/// # } -/// ``` -pub struct VacantEntry<'a, T, A = Global> -where - A: Allocator, -{ - hash: u64, - insert_slot: InsertSlot, - table: &'a mut HashTable, -} - -impl fmt::Debug for VacantEntry<'_, T, A> { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.write_str("VacantEntry") - } -} - -impl<'a, T, A> VacantEntry<'a, T, A> -where - A: Allocator, -{ - /// Inserts a new element into the table with the hash that was used to - /// obtain the `VacantEntry`. - /// - /// An `OccupiedEntry` is returned for the newly inserted element. - /// - /// # Examples - /// - /// ``` - /// # #[cfg(feature = "nightly")] - /// # fn test() { - /// use ahash::AHasher; - /// use hashbrown::hash_table::Entry; - /// use hashbrown::HashTable; - /// use std::hash::{BuildHasher, BuildHasherDefault}; - /// - /// let mut table: HashTable<&str> = HashTable::new(); - /// let hasher = BuildHasherDefault::::default(); - /// let hasher = |val: &_| hasher.hash_one(val); - /// - /// if let Entry::Vacant(o) = table.entry(hasher(&"poneyland"), |&x| x == "poneyland", hasher) { - /// o.insert("poneyland"); - /// } - /// assert_eq!( - /// table.find(hasher(&"poneyland"), |&x| x == "poneyland"), - /// Some(&"poneyland") - /// ); - /// # } - /// # fn main() { - /// # #[cfg(feature = "nightly")] - /// # test() - /// # } - /// ``` - pub fn insert(self, value: T) -> OccupiedEntry<'a, T, A> { - let bucket = unsafe { - self.table - .raw - .insert_in_slot(self.hash, self.insert_slot, value) - }; - OccupiedEntry { - hash: self.hash, - bucket, - table: self.table, - } - } - - /// Converts the VacantEntry into a mutable reference to the underlying - /// table. - pub fn into_table(self) -> &'a mut HashTable { - self.table - } -} - -/// Type representing the absence of an entry, as returned by [`HashTable::find_entry`]. -/// -/// This type only exists due to [limitations] in Rust's NLL borrow checker. In -/// the future, `find_entry` will return an `Option` and this -/// type will be removed. -/// -/// [limitations]: https://smallcultfollowing.com/babysteps/blog/2018/06/15/mir-based-borrow-check-nll-status-update/#polonius -/// -/// # Examples -/// -/// ``` -/// # #[cfg(feature = "nightly")] -/// # fn test() { -/// use ahash::AHasher; -/// use hashbrown::hash_table::{AbsentEntry, Entry, HashTable}; -/// use std::hash::{BuildHasher, BuildHasherDefault}; -/// -/// let mut table: HashTable<&str> = HashTable::new(); -/// let hasher = BuildHasherDefault::::default(); -/// let hasher = |val: &_| hasher.hash_one(val); -/// -/// let entry_v: AbsentEntry<_, _> = table.find_entry(hasher(&"a"), |&x| x == "a").unwrap_err(); -/// entry_v -/// .into_table() -/// .insert_unique(hasher(&"a"), "a", hasher); -/// assert!(table.find(hasher(&"a"), |&x| x == "a").is_some() && table.len() == 1); -/// -/// // Nonexistent key (insert) -/// match table.entry(hasher(&"b"), |&x| x == "b", hasher) { -/// Entry::Vacant(view) => { -/// view.insert("b"); -/// } -/// Entry::Occupied(_) => unreachable!(), -/// } -/// assert!(table.find(hasher(&"b"), |&x| x == "b").is_some() && table.len() == 2); -/// # } -/// # fn main() { -/// # #[cfg(feature = "nightly")] -/// # test() -/// # } -/// ``` -pub struct AbsentEntry<'a, T, A = Global> -where - A: Allocator, -{ - table: &'a mut HashTable, -} - -impl fmt::Debug for AbsentEntry<'_, T, A> { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.write_str("AbsentEntry") - } -} - -impl<'a, T, A> AbsentEntry<'a, T, A> -where - A: Allocator, -{ - /// Converts the AbsentEntry into a mutable reference to the underlying - /// table. - pub fn into_table(self) -> &'a mut HashTable { - self.table - } -} - -/// An iterator over the entries of a `HashTable` in arbitrary order. -/// The iterator element type is `&'a T`. -/// -/// This `struct` is created by the [`iter`] method on [`HashTable`]. See its -/// documentation for more. -/// -/// [`iter`]: struct.HashTable.html#method.iter -/// [`HashTable`]: struct.HashTable.html -pub struct Iter<'a, T> { - inner: RawIter, - marker: PhantomData<&'a T>, -} - -impl<'a, T> Iterator for Iter<'a, T> { - type Item = &'a T; - - fn next(&mut self) -> Option { - self.inner.next().map(|bucket| unsafe { bucket.as_ref() }) - } - - fn size_hint(&self) -> (usize, Option) { - self.inner.size_hint() - } -} - -impl ExactSizeIterator for Iter<'_, T> { - fn len(&self) -> usize { - self.inner.len() - } -} - -impl FusedIterator for Iter<'_, T> {} - -/// A mutable iterator over the entries of a `HashTable` in arbitrary order. -/// The iterator element type is `&'a mut T`. -/// -/// This `struct` is created by the [`iter_mut`] method on [`HashTable`]. See its -/// documentation for more. -/// -/// [`iter_mut`]: struct.HashTable.html#method.iter_mut -/// [`HashTable`]: struct.HashTable.html -pub struct IterMut<'a, T> { - inner: RawIter, - marker: PhantomData<&'a mut T>, -} - -impl<'a, T> Iterator for IterMut<'a, T> { - type Item = &'a mut T; - - fn next(&mut self) -> Option { - self.inner.next().map(|bucket| unsafe { bucket.as_mut() }) - } - - fn size_hint(&self) -> (usize, Option) { - self.inner.size_hint() - } -} - -impl ExactSizeIterator for IterMut<'_, T> { - fn len(&self) -> usize { - self.inner.len() - } -} - -impl FusedIterator for IterMut<'_, T> {} - -/// An owning iterator over the entries of a `HashTable` in arbitrary order. -/// The iterator element type is `T`. -/// -/// This `struct` is created by the [`into_iter`] method on [`HashTable`] -/// (provided by the [`IntoIterator`] trait). See its documentation for more. -/// The table cannot be used after calling that method. -/// -/// [`into_iter`]: struct.HashTable.html#method.into_iter -/// [`HashTable`]: struct.HashTable.html -/// [`IntoIterator`]: https://doc.rust-lang.org/core/iter/trait.IntoIterator.html -pub struct IntoIter -where - A: Allocator, -{ - inner: RawIntoIter, -} - -impl Iterator for IntoIter -where - A: Allocator, -{ - type Item = T; - - fn next(&mut self) -> Option { - self.inner.next() - } - - fn size_hint(&self) -> (usize, Option) { - self.inner.size_hint() - } -} - -impl ExactSizeIterator for IntoIter -where - A: Allocator, -{ - fn len(&self) -> usize { - self.inner.len() - } -} - -impl FusedIterator for IntoIter where A: Allocator {} - -/// A draining iterator over the items of a `HashTable`. -/// -/// This `struct` is created by the [`drain`] method on [`HashTable`]. -/// See its documentation for more. -/// -/// [`HashTable`]: struct.HashTable.html -/// [`drain`]: struct.HashTable.html#method.drain -pub struct Drain<'a, T, A: Allocator = Global> { - inner: RawDrain<'a, T, A>, -} - -impl Drain<'_, T, A> { - /// Returns a iterator of references over the remaining items. - fn iter(&self) -> Iter<'_, T> { - Iter { - inner: self.inner.iter(), - marker: PhantomData, - } - } -} - -impl Iterator for Drain<'_, T, A> { - type Item = T; - - fn next(&mut self) -> Option { - self.inner.next() - } - fn size_hint(&self) -> (usize, Option) { - self.inner.size_hint() - } -} -impl ExactSizeIterator for Drain<'_, T, A> { - fn len(&self) -> usize { - self.inner.len() - } -} -impl FusedIterator for Drain<'_, T, A> {} - -impl fmt::Debug for Drain<'_, T, A> { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_list().entries(self.iter()).finish() - } -} - -/// A draining iterator over entries of a `HashTable` which don't satisfy the predicate `f`. -/// -/// This `struct` is created by [`HashTable::extract_if`]. See its -/// documentation for more. -#[must_use = "Iterators are lazy unless consumed"] -pub struct ExtractIf<'a, T, F, A: Allocator = Global> -where - F: FnMut(&mut T) -> bool, -{ - f: F, - inner: RawExtractIf<'a, T, A>, -} - -impl Iterator for ExtractIf<'_, T, F, A> -where - F: FnMut(&mut T) -> bool, -{ - type Item = T; - - #[inline] - fn next(&mut self) -> Option { - self.inner.next(|val| (self.f)(val)) - } - - #[inline] - fn size_hint(&self) -> (usize, Option) { - (0, self.inner.iter.size_hint().1) - } -} - -impl FusedIterator for ExtractIf<'_, T, F, A> where F: FnMut(&mut T) -> bool {} diff -Nru temporalio-1.3.0/vendor/hashbrown-0.13.2/benches/bench.rs temporalio-1.3.0/vendor/hashbrown-0.13.2/benches/bench.rs --- temporalio-1.3.0/vendor/hashbrown-0.13.2/benches/bench.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/hashbrown-0.13.2/benches/bench.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,331 +0,0 @@ -// This benchmark suite contains some benchmarks along a set of dimensions: -// Hasher: std default (SipHash) and crate default (AHash). -// Int key distribution: low bit heavy, top bit heavy, and random. -// Task: basic functionality: insert, insert_erase, lookup, lookup_fail, iter -#![feature(test)] - -extern crate test; - -use test::{black_box, Bencher}; - -use hashbrown::hash_map::DefaultHashBuilder; -use hashbrown::{HashMap, HashSet}; -use std::{ - collections::hash_map::RandomState, - sync::atomic::{self, AtomicUsize}, -}; - -const SIZE: usize = 1000; - -// The default hashmap when using this crate directly. -type AHashMap = HashMap; -// This uses the hashmap from this crate with the default hasher of the stdlib. -type StdHashMap = HashMap; - -// A random key iterator. -#[derive(Clone, Copy)] -struct RandomKeys { - state: usize, -} - -impl RandomKeys { - fn new() -> Self { - RandomKeys { state: 0 } - } -} - -impl Iterator for RandomKeys { - type Item = usize; - fn next(&mut self) -> Option { - // Add 1 then multiply by some 32 bit prime. - self.state = self.state.wrapping_add(1).wrapping_mul(3_787_392_781); - Some(self.state) - } -} - -// Just an arbitrary side effect to make the maps not shortcircuit to the non-dropping path -// when dropping maps/entries (most real world usages likely have drop in the key or value) -lazy_static::lazy_static! { - static ref SIDE_EFFECT: AtomicUsize = AtomicUsize::new(0); -} - -#[derive(Clone)] -struct DropType(usize); -impl Drop for DropType { - fn drop(&mut self) { - SIDE_EFFECT.fetch_add(self.0, atomic::Ordering::SeqCst); - } -} - -macro_rules! bench_suite { - ($bench_macro:ident, $bench_ahash_serial:ident, $bench_std_serial:ident, - $bench_ahash_highbits:ident, $bench_std_highbits:ident, - $bench_ahash_random:ident, $bench_std_random:ident) => { - $bench_macro!($bench_ahash_serial, AHashMap, 0..); - $bench_macro!($bench_std_serial, StdHashMap, 0..); - $bench_macro!( - $bench_ahash_highbits, - AHashMap, - (0..).map(usize::swap_bytes) - ); - $bench_macro!( - $bench_std_highbits, - StdHashMap, - (0..).map(usize::swap_bytes) - ); - $bench_macro!($bench_ahash_random, AHashMap, RandomKeys::new()); - $bench_macro!($bench_std_random, StdHashMap, RandomKeys::new()); - }; -} - -macro_rules! bench_insert { - ($name:ident, $maptype:ident, $keydist:expr) => { - #[bench] - fn $name(b: &mut Bencher) { - let mut m = $maptype::with_capacity_and_hasher(SIZE, Default::default()); - b.iter(|| { - m.clear(); - for i in ($keydist).take(SIZE) { - m.insert(i, (DropType(i), [i; 20])); - } - black_box(&mut m); - }); - eprintln!("{}", SIDE_EFFECT.load(atomic::Ordering::SeqCst)); - } - }; -} - -bench_suite!( - bench_insert, - insert_ahash_serial, - insert_std_serial, - insert_ahash_highbits, - insert_std_highbits, - insert_ahash_random, - insert_std_random -); - -macro_rules! bench_grow_insert { - ($name:ident, $maptype:ident, $keydist:expr) => { - #[bench] - fn $name(b: &mut Bencher) { - b.iter(|| { - let mut m = $maptype::default(); - for i in ($keydist).take(SIZE) { - m.insert(i, DropType(i)); - } - black_box(&mut m); - }) - } - }; -} - -bench_suite!( - bench_grow_insert, - grow_insert_ahash_serial, - grow_insert_std_serial, - grow_insert_ahash_highbits, - grow_insert_std_highbits, - grow_insert_ahash_random, - grow_insert_std_random -); - -macro_rules! bench_insert_erase { - ($name:ident, $maptype:ident, $keydist:expr) => { - #[bench] - fn $name(b: &mut Bencher) { - let mut base = $maptype::default(); - for i in ($keydist).take(SIZE) { - base.insert(i, DropType(i)); - } - let skip = $keydist.skip(SIZE); - b.iter(|| { - let mut m = base.clone(); - let mut add_iter = skip.clone(); - let mut remove_iter = $keydist; - // While keeping the size constant, - // replace the first keydist with the second. - for (add, remove) in (&mut add_iter).zip(&mut remove_iter).take(SIZE) { - m.insert(add, DropType(add)); - black_box(m.remove(&remove)); - } - black_box(m); - }); - eprintln!("{}", SIDE_EFFECT.load(atomic::Ordering::SeqCst)); - } - }; -} - -bench_suite!( - bench_insert_erase, - insert_erase_ahash_serial, - insert_erase_std_serial, - insert_erase_ahash_highbits, - insert_erase_std_highbits, - insert_erase_ahash_random, - insert_erase_std_random -); - -macro_rules! bench_lookup { - ($name:ident, $maptype:ident, $keydist:expr) => { - #[bench] - fn $name(b: &mut Bencher) { - let mut m = $maptype::default(); - for i in $keydist.take(SIZE) { - m.insert(i, DropType(i)); - } - - b.iter(|| { - for i in $keydist.take(SIZE) { - black_box(m.get(&i)); - } - }); - eprintln!("{}", SIDE_EFFECT.load(atomic::Ordering::SeqCst)); - } - }; -} - -bench_suite!( - bench_lookup, - lookup_ahash_serial, - lookup_std_serial, - lookup_ahash_highbits, - lookup_std_highbits, - lookup_ahash_random, - lookup_std_random -); - -macro_rules! bench_lookup_fail { - ($name:ident, $maptype:ident, $keydist:expr) => { - #[bench] - fn $name(b: &mut Bencher) { - let mut m = $maptype::default(); - let mut iter = $keydist; - for i in (&mut iter).take(SIZE) { - m.insert(i, DropType(i)); - } - - b.iter(|| { - for i in (&mut iter).take(SIZE) { - black_box(m.get(&i)); - } - }) - } - }; -} - -bench_suite!( - bench_lookup_fail, - lookup_fail_ahash_serial, - lookup_fail_std_serial, - lookup_fail_ahash_highbits, - lookup_fail_std_highbits, - lookup_fail_ahash_random, - lookup_fail_std_random -); - -macro_rules! bench_iter { - ($name:ident, $maptype:ident, $keydist:expr) => { - #[bench] - fn $name(b: &mut Bencher) { - let mut m = $maptype::default(); - for i in ($keydist).take(SIZE) { - m.insert(i, DropType(i)); - } - - b.iter(|| { - for i in &m { - black_box(i); - } - }) - } - }; -} - -bench_suite!( - bench_iter, - iter_ahash_serial, - iter_std_serial, - iter_ahash_highbits, - iter_std_highbits, - iter_ahash_random, - iter_std_random -); - -#[bench] -fn clone_small(b: &mut Bencher) { - let mut m = HashMap::new(); - for i in 0..10 { - m.insert(i, DropType(i)); - } - - b.iter(|| { - black_box(m.clone()); - }) -} - -#[bench] -fn clone_from_small(b: &mut Bencher) { - let mut m = HashMap::new(); - let mut m2 = HashMap::new(); - for i in 0..10 { - m.insert(i, DropType(i)); - } - - b.iter(|| { - m2.clone_from(&m); - black_box(&mut m2); - }) -} - -#[bench] -fn clone_large(b: &mut Bencher) { - let mut m = HashMap::new(); - for i in 0..1000 { - m.insert(i, DropType(i)); - } - - b.iter(|| { - black_box(m.clone()); - }) -} - -#[bench] -fn clone_from_large(b: &mut Bencher) { - let mut m = HashMap::new(); - let mut m2 = HashMap::new(); - for i in 0..1000 { - m.insert(i, DropType(i)); - } - - b.iter(|| { - m2.clone_from(&m); - black_box(&mut m2); - }) -} - -#[bench] -fn rehash_in_place(b: &mut Bencher) { - b.iter(|| { - let mut set = HashSet::new(); - - // Each loop triggers one rehash - for _ in 0..10 { - for i in 0..224 { - set.insert(i); - } - - assert_eq!( - set.capacity(), - 224, - "The set must be at or close to capacity to trigger a re hashing" - ); - - for i in 100..1400 { - set.remove(&(i - 100)); - set.insert(i); - } - set.clear(); - } - }); -} diff -Nru temporalio-1.3.0/vendor/hashbrown-0.13.2/benches/insert_unique_unchecked.rs temporalio-1.3.0/vendor/hashbrown-0.13.2/benches/insert_unique_unchecked.rs --- temporalio-1.3.0/vendor/hashbrown-0.13.2/benches/insert_unique_unchecked.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/hashbrown-0.13.2/benches/insert_unique_unchecked.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,32 +0,0 @@ -//! Compare `insert` and `insert_unique_unchecked` operations performance. - -#![feature(test)] - -extern crate test; - -use hashbrown::HashMap; -use test::Bencher; - -#[bench] -fn insert(b: &mut Bencher) { - let keys: Vec = (0..1000).map(|i| format!("xxxx{}yyyy", i)).collect(); - b.iter(|| { - let mut m = HashMap::with_capacity(1000); - for k in &keys { - m.insert(k, k); - } - m - }); -} - -#[bench] -fn insert_unique_unchecked(b: &mut Bencher) { - let keys: Vec = (0..1000).map(|i| format!("xxxx{}yyyy", i)).collect(); - b.iter(|| { - let mut m = HashMap::with_capacity(1000); - for k in &keys { - m.insert_unique_unchecked(k, k); - } - m - }); -} diff -Nru temporalio-1.3.0/vendor/hashbrown-0.13.2/.cargo-checksum.json temporalio-1.3.0/vendor/hashbrown-0.13.2/.cargo-checksum.json --- temporalio-1.3.0/vendor/hashbrown-0.13.2/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/hashbrown-0.13.2/.cargo-checksum.json 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -{"files":{"CHANGELOG.md":"9f6a99787d52bc87da929df9348c5e6db403c54995be5a006eea4b641efb7652","Cargo.toml":"da2b6aaf324e787d10a6a3626347dae7c1b101614a04eba0e13a5f455201bdc7","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"ff8f68cb076caf8cefe7a6430d4ac086ce6af2ca8ce2c4e5a2004d4552ef52a2","README.md":"292bb49a47b4f75f0a94fd2316d43349cd3238823e5b9b96b9ee4d963a88b998","benches/bench.rs":"aadc39d815eadf094ed9357d946319df2d93194203bbccb7c33cea6951d654df","benches/insert_unique_unchecked.rs":"cb84275f22d5f95a5ac995ac6b2df74ffcf342765b401d27c95f2955c7b7cb9f","clippy.toml":"7535949f908c6d9aea4f9a9f3a7625552c93fc29e963d059d40f4def9d77ea7b","src/external_trait_impls/mod.rs":"d69528827794524cfd9acbeacc1ac4f6131e3c7574311e6d919f818f65fbff07","src/external_trait_impls/rayon/helpers.rs":"ba105bf0853ebc45157f22116ad0f55d3bdab75e721d8e7a677c7b912d0c0c6d","src/external_trait_impls/rayon/map.rs":"2809e2a0071db8101c38789deb955f3830c5c3455eb1794ff64a0cf2ceb53fc7","src/external_trait_impls/rayon/mod.rs":"156de9c1ad0123334ea3b7e5a17444faf1b8bf971aa88a1f23e2f2d1c3021141","src/external_trait_impls/rayon/raw.rs":"e62c5f3ca5fffea47357e64b6f8c34cec94af62d9bd28a2b87934da46c22b66e","src/external_trait_impls/rayon/set.rs":"c4c44d44e56c2f59e9e1355662e29d8744ac96645ca4414127a359fb46cb0fbf","src/external_trait_impls/serde.rs":"0bc1a1f218d1ae7a5262557a5e3737b9334caf7d50c136dbdc75ff75680c223b","src/lib.rs":"486e1ea3445e8438f0fb6256471d80621f6c59195f0c198d02c7d951838dd35b","src/macros.rs":"36fe532656879c80f7753d13354b889f5b45caef451a1bb3a27dbc32d74c9878","src/map.rs":"83748649c382b608de5f57e7d64a30455ff4270a24ada22159f9a6d8e084f202","src/raw/alloc.rs":"184a0345bc2c7544b65c28724063be26b1f2b28dbaaa028a0b01192ccac25557","src/raw/bitmask.rs":"820d90b19b7e3433a1048ace008c9526331cd53a576cb0cfc1ff9960b6fe52f8","src/raw/generic.rs":"51720f27d4b76ab411a9658affd0c6faf423402c9def0879481657dd7b1a7928","src/raw/mod.rs":"156c574d7e64f845902ac66032be80356acb1bca758839a92f660a233da91108","src/raw/sse2.rs":"838cfdb1daa1e70951ed25f985283b8b7ab4b46fa130f92eda152047ce6086f6","src/rustc_entry.rs":"cdd70972cba5b79ca1cad79869cb5e184d6dc4798ef90822e966ef89679ba011","src/scopeguard.rs":"1a246e08a63c06cd8ad934bd7da229421bf804f991ae93cd7e242da27ca6c601","src/set.rs":"3e8e6ceb1728dd9a2fa0db1cf351413a608dc73df905a1546e268d0e8e527493","tests/equivalent_trait.rs":"84faa3fe9d67c375d03fec81f0f1412c47862477d42e84e7d235258236338d5b","tests/hasher.rs":"9a8fdf67e4415618e16729969c386eefe71408cded5d46cf7b67d969276a3452","tests/raw.rs":"43ed2f98877533a0905611d9a30f26b183dd3e103e3856eeab80e7b8ac7894d3","tests/rayon.rs":"83d5289771542203f539a41cccb889fbe7ce70f5adf5b903ac9f051e3ba13cfa","tests/serde.rs":"6bac8054db722dd049901b37a6e006535bac30f425eb5cd91af19b5bc1dfe78e","tests/set.rs":"01cf39efb04646ef4c63a809ebb96dfa63cfec472bf8bdb6c121f6526d40c40e"},"package":"43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/hashbrown-0.13.2/Cargo.toml temporalio-1.3.0/vendor/hashbrown-0.13.2/Cargo.toml --- temporalio-1.3.0/vendor/hashbrown-0.13.2/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/hashbrown-0.13.2/Cargo.toml 1970-01-01 00:00:00.000000000 +0000 @@ -1,111 +0,0 @@ -# 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 = "2021" -rust-version = "1.61.0" -name = "hashbrown" -version = "0.13.2" -authors = ["Amanieu d'Antras "] -exclude = [ - ".github", - "/ci/*", -] -description = "A Rust port of Google's SwissTable hash map" -readme = "README.md" -keywords = [ - "hash", - "no_std", - "hashmap", - "swisstable", -] -categories = [ - "data-structures", - "no-std", -] -license = "MIT OR Apache-2.0" -repository = "https://github.com/rust-lang/hashbrown" - -[package.metadata.docs.rs] -features = [ - "nightly", - "rayon", - "serde", - "raw", -] - -[dependencies.ahash] -version = "0.8.0" -optional = true -default-features = false - -[dependencies.alloc] -version = "1.0.0" -optional = true -package = "rustc-std-workspace-alloc" - -[dependencies.bumpalo] -version = "3.5.0" -optional = true - -[dependencies.compiler_builtins] -version = "0.1.2" -optional = true - -[dependencies.core] -version = "1.0.0" -optional = true -package = "rustc-std-workspace-core" - -[dependencies.rayon] -version = "1.0" -optional = true - -[dependencies.serde] -version = "1.0.25" -optional = true -default-features = false - -[dev-dependencies.doc-comment] -version = "0.3.1" - -[dev-dependencies.fnv] -version = "1.0.7" - -[dev-dependencies.lazy_static] -version = "1.4" - -[dev-dependencies.rand] -version = "0.8.3" -features = ["small_rng"] - -[dev-dependencies.rayon] -version = "1.0" - -[dev-dependencies.serde_test] -version = "1.0" - -[features] -default = [ - "ahash", - "inline-more", -] -inline-more = [] -nightly = [] -raw = [] -rustc-dep-of-std = [ - "nightly", - "core", - "compiler_builtins", - "alloc", - "rustc-internal-api", -] -rustc-internal-api = [] diff -Nru temporalio-1.3.0/vendor/hashbrown-0.13.2/CHANGELOG.md temporalio-1.3.0/vendor/hashbrown-0.13.2/CHANGELOG.md --- temporalio-1.3.0/vendor/hashbrown-0.13.2/CHANGELOG.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/hashbrown-0.13.2/CHANGELOG.md 1970-01-01 00:00:00.000000000 +0000 @@ -1,437 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. - -The format is based on [Keep a Changelog](https://keepachangelog.com/) -and this project adheres to [Semantic Versioning](https://semver.org/). - -## [Unreleased] - -## [v0.13.2] - 2023-01-12 - -### Fixed - -- Added `#[inline(always)]` to `find_inner`. (#375) -- Fixed `RawTable::allocation_info` for empty tables. (#376) - -## [v0.13.1] - 2022-11-10 - -### Added - -- Added `Equivalent` trait to customize key lookups. (#350) -- Added support for 16-bit targets. (#368) -- Added `RawTable::allocation_info` which provides information about the memory - usage of a table. (#371) - -### Changed - -- Bumped MSRV to 1.61.0. -- Upgraded to `ahash` 0.8. (#357) -- Make `with_hasher_in` const. (#355) -- The following methods have been removed from the `RawTable` API in favor of - safer alternatives: - - `RawTable::erase_no_drop` => Use `RawTable::erase` or `RawTable::remove` instead. - - `Bucket::read` => Use `RawTable::remove` instead. - - `Bucket::drop` => Use `RawTable::erase` instead. - - `Bucket::write` => Use `Bucket::as_mut` instead. - -### Fixed - -- Ensure that `HashMap` allocations don't exceed `isize::MAX`. (#362) -- Fixed issue with field retagging in scopeguard. (#359) - -## [v0.12.3] - 2022-07-17 - -### Fixed - -- Fixed double-drop in `RawTable::clone_from`. (#348) - -## [v0.12.2] - 2022-07-09 - -### Added - -- Added `Entry` API for `HashSet`. (#342) -- Added `Extend<&'a (K, V)> for HashMap`. (#340) -- Added length-based short-circuiting for hash table iteration. (#338) -- Added a function to access the `RawTable` of a `HashMap`. (#335) - -### Changed - -- Edited `do_alloc` to reduce LLVM IR generated. (#341) - -## [v0.12.1] - 2022-05-02 - -### Fixed - -- Fixed underflow in `RawIterRange::size_hint`. (#325) -- Fixed the implementation of `Debug` for `ValuesMut` and `IntoValues`. (#325) - -## [v0.12.0] - 2022-01-17 - -### Added - -- Added `From<[T; N]>` and `From<[(K, V); N]>` for `HashSet` and `HashMap` respectively. (#297) -- Added an `allocator()` getter to HashMap and HashSet. (#257) -- Added `insert_unique_unchecked` to `HashMap` and `HashSet`. (#293) -- Added `into_keys` and `into_values` to HashMap. (#295) -- Implement `From` on `HashSet` and `HashMap`. (#298) -- Added `entry_ref` API to `HashMap`. (#201) - -### Changed - -- Bumped minimum Rust version to 1.56.1 and edition to 2021. -- Use u64 for the GroupWord on WebAssembly. (#271) -- Optimized `find`. (#279) -- Made rehashing and resizing less generic to reduce compilation time. (#282) -- Inlined small functions. (#283) -- Use `BuildHasher::hash_one` when `feature = "nightly"` is enabled. (#292) -- Relaxed the bounds on `Debug` for `HashSet`. (#296) -- Rename `get_each_mut` to `get_many_mut` and align API with the stdlib. (#291) -- Don't hash the key when searching in an empty table. (#305) - -### Fixed - -- Guard against allocations exceeding isize::MAX. (#268) -- Made `RawTable::insert_no_grow` unsafe. (#254) -- Inline `static_empty`. (#280) -- Fixed trait bounds on Send/Sync impls. (#303) - -## [v0.11.2] - 2021-03-25 - -### Fixed - -- Added missing allocator type parameter to `HashMap`'s and `HashSet`'s `Clone` impls. (#252) - -## [v0.11.1] - 2021-03-20 - -### Fixed - -- Added missing `pub` modifier to `BumpWrapper`. (#251) - -## [v0.11.0] - 2021-03-14 - -### Added -- Added safe `try_insert_no_grow` method to `RawTable`. (#229) -- Added support for `bumpalo` as an allocator without the `nightly` feature. (#231) -- Implemented `Default` for `RawTable`. (#237) -- Added new safe methods `RawTable::get_each_mut`, `HashMap::get_each_mut`, and - `HashMap::get_each_key_value_mut`. (#239) -- Added `From>` for `HashSet`. (#235) -- Added `try_insert` method to `HashMap`. (#247) - -### Changed -- The minimum Rust version has been bumped to 1.49.0. (#230) -- Significantly improved compilation times by reducing the amount of generated IR. (#205) - -### Removed -- We no longer re-export the unstable allocator items from the standard library, nor the stable shims approximating the same. (#227) -- Removed hasher specialization support from `aHash`, which was resulting in inconsistent hashes being generated for a key. (#248) - -### Fixed -- Fixed union length comparison. (#228) - -## ~~[v0.10.0] - 2021-01-16~~ - -This release was _yanked_ due to inconsistent hashes being generated with the `nightly` feature. (#248) - -### Changed -- Parametrized `RawTable`, `HashSet` and `HashMap` over an allocator. (#133) -- Improved branch prediction hints on stable. (#209) -- Optimized hashing of primitive types with AHash using specialization. (#207) -- Only instantiate `RawTable`'s reserve functions once per key-value. (#204) - -## [v0.9.1] - 2020-09-28 - -### Added -- Added safe methods to `RawTable` (#202): - - `get`: `find` and `as_ref` - - `get_mut`: `find` and `as_mut` - - `insert_entry`: `insert` and `as_mut` - - `remove_entry`: `find` and `remove` - - `erase_entry`: `find` and `erase` - -### Changed -- Removed `from_key_hashed_nocheck`'s `Q: Hash`. (#200) -- Made `RawTable::drain` safe. (#201) - -## [v0.9.0] - 2020-09-03 - -### Fixed -- `drain_filter` now removes and yields items that do match the predicate, - rather than items that don't. This is a **breaking change** to match the - behavior of the `drain_filter` methods in `std`. (#187) - -### Added -- Added `replace_entry_with` to `OccupiedEntry`, and `and_replace_entry_with` to `Entry`. (#190) -- Implemented `FusedIterator` and `size_hint` for `DrainFilter`. (#188) - -### Changed -- The minimum Rust version has been bumped to 1.36 (due to `crossbeam` dependency). (#193) -- Updated `ahash` dependency to 0.4. (#198) -- `HashMap::with_hasher` and `HashSet::with_hasher` are now `const fn`. (#195) -- Removed `T: Hash + Eq` and `S: BuildHasher` bounds on `HashSet::new`, - `with_capacity`, `with_hasher`, and `with_capacity_and_hasher`. (#185) - -## [v0.8.2] - 2020-08-08 - -### Changed -- Avoid closures to improve compile times. (#183) -- Do not iterate to drop if empty. (#182) - -## [v0.8.1] - 2020-07-16 - -### Added -- Added `erase` and `remove` to `RawTable`. (#171) -- Added `try_with_capacity` to `RawTable`. (#174) -- Added methods that allow re-using a `RawIter` for `RawDrain`, - `RawIntoIter`, and `RawParIter`. (#175) -- Added `reflect_remove` and `reflect_insert` to `RawIter`. (#175) -- Added a `drain_filter` function to `HashSet`. (#179) - -### Changed -- Deprecated `RawTable::erase_no_drop` in favor of `erase` and `remove`. (#176) -- `insert_no_grow` is now exposed under the `"raw"` feature. (#180) - -## [v0.8.0] - 2020-06-18 - -### Fixed -- Marked `RawTable::par_iter` as `unsafe`. (#157) - -### Changed -- Reduced the size of `HashMap`. (#159) -- No longer create tables with a capacity of 1 element. (#162) -- Removed `K: Eq + Hash` bounds on `retain`. (#163) -- Pulled in `HashMap` changes from rust-lang/rust (#164): - - `extend_one` support on nightly. - - `CollectionAllocErr` renamed to `TryReserveError`. - - Added `HashSet::get_or_insert_owned`. - - `Default` for `HashSet` no longer requires `T: Eq + Hash` and `S: BuildHasher`. - -## [v0.7.2] - 2020-04-27 - -### Added -- Added `or_insert_with_key` to `Entry`. (#152) - -### Fixed -- Partially reverted `Clone` optimization which was unsound. (#154) - -### Changed -- Disabled use of `const-random` by default, which prevented reproducible builds. (#155) -- Optimized `repeat` function. (#150) -- Use `NonNull` for buckets, which improves codegen for iterators. (#148) - -## [v0.7.1] - 2020-03-16 - -### Added -- Added `HashMap::get_key_value_mut`. (#145) - -### Changed -- Optimized `Clone` implementation. (#146) - -## [v0.7.0] - 2020-01-31 - -### Added -- Added a `drain_filter` function to `HashMap`. (#135) - -### Changed -- Updated `ahash` dependency to 0.3. (#141) -- Optimized set union and intersection. (#130) -- `raw_entry` can now be used without requiring `S: BuildHasher`. (#123) -- `RawTable::bucket_index` can now be used under the `raw` feature. (#128) - -## [v0.6.3] - 2019-10-31 - -### Added -- Added an `ahash-compile-time-rng` feature (enabled by default) which allows disabling the - `compile-time-rng` feature in `ahash` to work around a Cargo bug. (#125) - -## [v0.6.2] - 2019-10-23 - -### Added -- Added an `inline-more` feature (enabled by default) which allows choosing a tradeoff between - runtime performance and compilation time. (#119) - -## [v0.6.1] - 2019-10-04 - -### Added -- Added `Entry::insert` and `RawEntryMut::insert`. (#118) - -### Changed -- `Group::static_empty` was changed from a `const` to a `static` (#116). - -## [v0.6.0] - 2019-08-13 - -### Fixed -- Fixed AHash accidentally depending on `std`. (#110) - -### Changed -- The minimum Rust version has been bumped to 1.32 (due to `rand` dependency). - -## ~~[v0.5.1] - 2019-08-04~~ - -This release was _yanked_ due to a breaking change for users of `no-default-features`. - -### Added -- The experimental and unsafe `RawTable` API is available under the "raw" feature. (#108) -- Added entry-like methods for `HashSet`. (#98) - -### Changed -- Changed the default hasher from FxHash to AHash. (#97) -- `hashbrown` is now fully `no_std` on recent Rust versions (1.36+). (#96) - -### Fixed -- We now avoid growing the table during insertions when it wasn't necessary. (#106) -- `RawOccupiedEntryMut` now properly implements `Send` and `Sync`. (#100) -- Relaxed `lazy_static` version. (#92) - -## [v0.5.0] - 2019-06-12 - -### Fixed -- Resize with a more conservative amount of space after deletions. (#86) - -### Changed -- Exposed the Layout of the failed allocation in CollectionAllocErr::AllocErr. (#89) - -## [v0.4.0] - 2019-05-30 - -### Fixed -- Fixed `Send` trait bounds on `IterMut` not matching the libstd one. (#82) - -## [v0.3.1] - 2019-05-30 - -### Fixed -- Fixed incorrect use of slice in unsafe code. (#80) - -## [v0.3.0] - 2019-04-23 - -### Changed -- Changed shrink_to to not panic if min_capacity < capacity. (#67) - -### Fixed -- Worked around emscripten bug emscripten-core/emscripten-fastcomp#258. (#66) - -## [v0.2.2] - 2019-04-16 - -### Fixed -- Inlined non-nightly lowest_set_bit_nonzero. (#64) -- Fixed build on latest nightly. (#65) - -## [v0.2.1] - 2019-04-14 - -### Changed -- Use for_each in map Extend and FromIterator. (#58) -- Improved worst-case performance of HashSet.is_subset. (#61) - -### Fixed -- Removed incorrect debug_assert. (#60) - -## [v0.2.0] - 2019-03-31 - -### Changed -- The code has been updated to Rust 2018 edition. This means that the minimum - Rust version has been bumped to 1.31 (2018 edition). - -### Added -- Added `insert_with_hasher` to the raw_entry API to allow `K: !(Hash + Eq)`. (#54) -- Added support for using hashbrown as the hash table implementation in libstd. (#46) - -### Fixed -- Fixed cargo build with minimal-versions. (#45) -- Fixed `#[may_dangle]` attributes to match the libstd `HashMap`. (#46) -- ZST keys and values are now handled properly. (#46) - -## [v0.1.8] - 2019-01-14 - -### Added -- Rayon parallel iterator support (#37) -- `raw_entry` support (#31) -- `#[may_dangle]` on nightly (#31) -- `try_reserve` support (#31) - -### Fixed -- Fixed variance on `IterMut`. (#31) - -## [v0.1.7] - 2018-12-05 - -### Fixed -- Fixed non-SSE version of convert_special_to_empty_and_full_to_deleted. (#32) -- Fixed overflow in rehash_in_place. (#33) - -## [v0.1.6] - 2018-11-17 - -### Fixed -- Fixed compile error on nightly. (#29) - -## [v0.1.5] - 2018-11-08 - -### Fixed -- Fixed subtraction overflow in generic::Group::match_byte. (#28) - -## [v0.1.4] - 2018-11-04 - -### Fixed -- Fixed a bug in the `erase_no_drop` implementation. (#26) - -## [v0.1.3] - 2018-11-01 - -### Added -- Serde support. (#14) - -### Fixed -- Make the compiler inline functions more aggressively. (#20) - -## [v0.1.2] - 2018-10-31 - -### Fixed -- `clear` segfaults when called on an empty table. (#13) - -## [v0.1.1] - 2018-10-30 - -### Fixed -- `erase_no_drop` optimization not triggering in the SSE2 implementation. (#3) -- Missing `Send` and `Sync` for hash map and iterator types. (#7) -- Bug when inserting into a table smaller than the group width. (#5) - -## v0.1.0 - 2018-10-29 - -- Initial release - -[Unreleased]: https://github.com/rust-lang/hashbrown/compare/v0.13.2...HEAD -[v0.13.2]: https://github.com/rust-lang/hashbrown/compare/v0.13.1...v0.13.2 -[v0.13.1]: https://github.com/rust-lang/hashbrown/compare/v0.12.3...v0.13.1 -[v0.12.3]: https://github.com/rust-lang/hashbrown/compare/v0.12.2...v0.12.3 -[v0.12.2]: https://github.com/rust-lang/hashbrown/compare/v0.12.1...v0.12.2 -[v0.12.1]: https://github.com/rust-lang/hashbrown/compare/v0.12.0...v0.12.1 -[v0.12.0]: https://github.com/rust-lang/hashbrown/compare/v0.11.2...v0.12.0 -[v0.11.2]: https://github.com/rust-lang/hashbrown/compare/v0.11.1...v0.11.2 -[v0.11.1]: https://github.com/rust-lang/hashbrown/compare/v0.11.0...v0.11.1 -[v0.11.0]: https://github.com/rust-lang/hashbrown/compare/v0.10.0...v0.11.0 -[v0.10.0]: https://github.com/rust-lang/hashbrown/compare/v0.9.1...v0.10.0 -[v0.9.1]: https://github.com/rust-lang/hashbrown/compare/v0.9.0...v0.9.1 -[v0.9.0]: https://github.com/rust-lang/hashbrown/compare/v0.8.2...v0.9.0 -[v0.8.2]: https://github.com/rust-lang/hashbrown/compare/v0.8.1...v0.8.2 -[v0.8.1]: https://github.com/rust-lang/hashbrown/compare/v0.8.0...v0.8.1 -[v0.8.0]: https://github.com/rust-lang/hashbrown/compare/v0.7.2...v0.8.0 -[v0.7.2]: https://github.com/rust-lang/hashbrown/compare/v0.7.1...v0.7.2 -[v0.7.1]: https://github.com/rust-lang/hashbrown/compare/v0.7.0...v0.7.1 -[v0.7.0]: https://github.com/rust-lang/hashbrown/compare/v0.6.3...v0.7.0 -[v0.6.3]: https://github.com/rust-lang/hashbrown/compare/v0.6.2...v0.6.3 -[v0.6.2]: https://github.com/rust-lang/hashbrown/compare/v0.6.1...v0.6.2 -[v0.6.1]: https://github.com/rust-lang/hashbrown/compare/v0.6.0...v0.6.1 -[v0.6.0]: https://github.com/rust-lang/hashbrown/compare/v0.5.1...v0.6.0 -[v0.5.1]: https://github.com/rust-lang/hashbrown/compare/v0.5.0...v0.5.1 -[v0.5.0]: https://github.com/rust-lang/hashbrown/compare/v0.4.0...v0.5.0 -[v0.4.0]: https://github.com/rust-lang/hashbrown/compare/v0.3.1...v0.4.0 -[v0.3.1]: https://github.com/rust-lang/hashbrown/compare/v0.3.0...v0.3.1 -[v0.3.0]: https://github.com/rust-lang/hashbrown/compare/v0.2.2...v0.3.0 -[v0.2.2]: https://github.com/rust-lang/hashbrown/compare/v0.2.1...v0.2.2 -[v0.2.1]: https://github.com/rust-lang/hashbrown/compare/v0.2.0...v0.2.1 -[v0.2.0]: https://github.com/rust-lang/hashbrown/compare/v0.1.8...v0.2.0 -[v0.1.8]: https://github.com/rust-lang/hashbrown/compare/v0.1.7...v0.1.8 -[v0.1.7]: https://github.com/rust-lang/hashbrown/compare/v0.1.6...v0.1.7 -[v0.1.6]: https://github.com/rust-lang/hashbrown/compare/v0.1.5...v0.1.6 -[v0.1.5]: https://github.com/rust-lang/hashbrown/compare/v0.1.4...v0.1.5 -[v0.1.4]: https://github.com/rust-lang/hashbrown/compare/v0.1.3...v0.1.4 -[v0.1.3]: https://github.com/rust-lang/hashbrown/compare/v0.1.2...v0.1.3 -[v0.1.2]: https://github.com/rust-lang/hashbrown/compare/v0.1.1...v0.1.2 -[v0.1.1]: https://github.com/rust-lang/hashbrown/compare/v0.1.0...v0.1.1 diff -Nru temporalio-1.3.0/vendor/hashbrown-0.13.2/clippy.toml temporalio-1.3.0/vendor/hashbrown-0.13.2/clippy.toml --- temporalio-1.3.0/vendor/hashbrown-0.13.2/clippy.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/hashbrown-0.13.2/clippy.toml 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -doc-valid-idents = [ "CppCon", "SwissTable", "SipHash", "HashDoS" ] diff -Nru temporalio-1.3.0/vendor/hashbrown-0.13.2/LICENSE-APACHE temporalio-1.3.0/vendor/hashbrown-0.13.2/LICENSE-APACHE --- temporalio-1.3.0/vendor/hashbrown-0.13.2/LICENSE-APACHE 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/hashbrown-0.13.2/LICENSE-APACHE 1970-01-01 00:00:00.000000000 +0000 @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - -Copyright [yyyy] [name of copyright owner] - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff -Nru temporalio-1.3.0/vendor/hashbrown-0.13.2/LICENSE-MIT temporalio-1.3.0/vendor/hashbrown-0.13.2/LICENSE-MIT --- temporalio-1.3.0/vendor/hashbrown-0.13.2/LICENSE-MIT 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/hashbrown-0.13.2/LICENSE-MIT 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -Copyright (c) 2016 Amanieu d'Antras - -Permission is hereby granted, free of charge, to any -person obtaining a copy of this software and associated -documentation files (the "Software"), to deal in the -Software without restriction, including without -limitation the rights to use, copy, modify, merge, -publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software -is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice -shall be included in all copies or substantial portions -of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. diff -Nru temporalio-1.3.0/vendor/hashbrown-0.13.2/README.md temporalio-1.3.0/vendor/hashbrown-0.13.2/README.md --- temporalio-1.3.0/vendor/hashbrown-0.13.2/README.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/hashbrown-0.13.2/README.md 1970-01-01 00:00:00.000000000 +0000 @@ -1,124 +0,0 @@ -hashbrown -========= - -[![Build Status](https://github.com/rust-lang/hashbrown/actions/workflows/rust.yml/badge.svg)](https://github.com/rust-lang/hashbrown/actions) -[![Crates.io](https://img.shields.io/crates/v/hashbrown.svg)](https://crates.io/crates/hashbrown) -[![Documentation](https://docs.rs/hashbrown/badge.svg)](https://docs.rs/hashbrown) -[![Rust](https://img.shields.io/badge/rust-1.61.0%2B-blue.svg?maxAge=3600)](https://github.com/rust-lang/hashbrown) - -This crate is a Rust port of Google's high-performance [SwissTable] hash -map, adapted to make it a drop-in replacement for Rust's standard `HashMap` -and `HashSet` types. - -The original C++ version of SwissTable can be found [here], and this -[CppCon talk] gives an overview of how the algorithm works. - -Since Rust 1.36, this is now the `HashMap` implementation for the Rust standard -library. However you may still want to use this crate instead since it works -in environments without `std`, such as embedded systems and kernels. - -[SwissTable]: https://abseil.io/blog/20180927-swisstables -[here]: https://github.com/abseil/abseil-cpp/blob/master/absl/container/internal/raw_hash_set.h -[CppCon talk]: https://www.youtube.com/watch?v=ncHmEUmJZf4 - -## [Change log](CHANGELOG.md) - -## Features - -- Drop-in replacement for the standard library `HashMap` and `HashSet` types. -- Uses [AHash](https://github.com/tkaitchuck/aHash) as the default hasher, which is much faster than SipHash. - However, AHash does *not provide the same level of HashDoS resistance* as SipHash, so if that is important to you, you might want to consider using a different hasher. -- Around 2x faster than the previous standard library `HashMap`. -- Lower memory usage: only 1 byte of overhead per entry instead of 8. -- Compatible with `#[no_std]` (but requires a global allocator with the `alloc` crate). -- Empty hash maps do not allocate any memory. -- SIMD lookups to scan multiple hash entries in parallel. - -## Performance - -Compared to the previous implementation of `std::collections::HashMap` (Rust 1.35). - -With the hashbrown default AHash hasher: - -| name | oldstdhash ns/iter | hashbrown ns/iter | diff ns/iter | diff % | speedup | -|:------------------------|:-------------------:|------------------:|:------------:|---------:|---------| -| insert_ahash_highbits | 18,865 | 8,020 | -10,845 | -57.49% | x 2.35 | -| insert_ahash_random | 19,711 | 8,019 | -11,692 | -59.32% | x 2.46 | -| insert_ahash_serial | 19,365 | 6,463 | -12,902 | -66.63% | x 3.00 | -| insert_erase_ahash_highbits | 51,136 | 17,916 | -33,220 | -64.96% | x 2.85 | -| insert_erase_ahash_random | 51,157 | 17,688 | -33,469 | -65.42% | x 2.89 | -| insert_erase_ahash_serial | 45,479 | 14,895 | -30,584 | -67.25% | x 3.05 | -| iter_ahash_highbits | 1,399 | 1,092 | -307 | -21.94% | x 1.28 | -| iter_ahash_random | 1,586 | 1,059 | -527 | -33.23% | x 1.50 | -| iter_ahash_serial | 3,168 | 1,079 | -2,089 | -65.94% | x 2.94 | -| lookup_ahash_highbits | 32,351 | 4,792 | -27,559 | -85.19% | x 6.75 | -| lookup_ahash_random | 17,419 | 4,817 | -12,602 | -72.35% | x 3.62 | -| lookup_ahash_serial | 15,254 | 3,606 | -11,648 | -76.36% | x 4.23 | -| lookup_fail_ahash_highbits | 21,187 | 4,369 | -16,818 | -79.38% | x 4.85 | -| lookup_fail_ahash_random | 21,550 | 4,395 | -17,155 | -79.61% | x 4.90 | -| lookup_fail_ahash_serial | 19,450 | 3,176 | -16,274 | -83.67% | x 6.12 | - - -With the libstd default SipHash hasher: - -|name | oldstdhash ns/iter | hashbrown ns/iter | diff ns/iter | diff % | speedup | -|:------------------------|:-------------------:|------------------:|:------------:|---------:|---------| -|insert_std_highbits |19,216 |16,885 | -2,331 | -12.13% | x 1.14 | -|insert_std_random |19,179 |17,034 | -2,145 | -11.18% | x 1.13 | -|insert_std_serial |19,462 |17,493 | -1,969 | -10.12% | x 1.11 | -|insert_erase_std_highbits |50,825 |35,847 | -14,978 | -29.47% | x 1.42 | -|insert_erase_std_random |51,448 |35,392 | -16,056 | -31.21% | x 1.45 | -|insert_erase_std_serial |87,711 |38,091 | -49,620 | -56.57% | x 2.30 | -|iter_std_highbits |1,378 |1,159 | -219 | -15.89% | x 1.19 | -|iter_std_random |1,395 |1,132 | -263 | -18.85% | x 1.23 | -|iter_std_serial |1,704 |1,105 | -599 | -35.15% | x 1.54 | -|lookup_std_highbits |17,195 |13,642 | -3,553 | -20.66% | x 1.26 | -|lookup_std_random |17,181 |13,773 | -3,408 | -19.84% | x 1.25 | -|lookup_std_serial |15,483 |13,651 | -1,832 | -11.83% | x 1.13 | -|lookup_fail_std_highbits |20,926 |13,474 | -7,452 | -35.61% | x 1.55 | -|lookup_fail_std_random |21,766 |13,505 | -8,261 | -37.95% | x 1.61 | -|lookup_fail_std_serial |19,336 |13,519 | -5,817 | -30.08% | x 1.43 | - -## Usage - -Add this to your `Cargo.toml`: - -```toml -[dependencies] -hashbrown = "0.13" -``` - -Then: - -```rust -use hashbrown::HashMap; - -let mut map = HashMap::new(); -map.insert(1, "one"); -``` -## Flags -This crate has the following Cargo features: - -- `nightly`: Enables nightly-only features including: `#[may_dangle]`. -- `serde`: Enables serde serialization support. -- `rayon`: Enables rayon parallel iterator support. -- `raw`: Enables access to the experimental and unsafe `RawTable` API. -- `inline-more`: Adds inline hints to most functions, improving run-time performance at the cost - of compilation time. (enabled by default) -- `bumpalo`: Provides a `BumpWrapper` type which allows `bumpalo` to be used for memory allocation. -- `ahash`: Compiles with ahash as default hasher. (enabled by default) - -## License - -Licensed under either of: - - * Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or https://www.apache.org/licenses/LICENSE-2.0) - * MIT license ([LICENSE-MIT](LICENSE-MIT) or https://opensource.org/licenses/MIT) - -at your option. - -### Contribution - -Unless you explicitly state otherwise, any contribution intentionally submitted -for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any -additional terms or conditions. diff -Nru temporalio-1.3.0/vendor/hashbrown-0.13.2/src/external_trait_impls/mod.rs temporalio-1.3.0/vendor/hashbrown-0.13.2/src/external_trait_impls/mod.rs --- temporalio-1.3.0/vendor/hashbrown-0.13.2/src/external_trait_impls/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/hashbrown-0.13.2/src/external_trait_impls/mod.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,4 +0,0 @@ -#[cfg(feature = "rayon")] -pub(crate) mod rayon; -#[cfg(feature = "serde")] -mod serde; diff -Nru temporalio-1.3.0/vendor/hashbrown-0.13.2/src/external_trait_impls/rayon/helpers.rs temporalio-1.3.0/vendor/hashbrown-0.13.2/src/external_trait_impls/rayon/helpers.rs --- temporalio-1.3.0/vendor/hashbrown-0.13.2/src/external_trait_impls/rayon/helpers.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/hashbrown-0.13.2/src/external_trait_impls/rayon/helpers.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,27 +0,0 @@ -use alloc::collections::LinkedList; -use alloc::vec::Vec; - -use rayon::iter::{IntoParallelIterator, ParallelIterator}; - -/// Helper for collecting parallel iterators to an intermediary -#[allow(clippy::linkedlist)] // yes, we need linked list here for efficient appending! -pub(super) fn collect(iter: I) -> (LinkedList>, usize) { - let list = iter - .into_par_iter() - .fold(Vec::new, |mut vec, elem| { - vec.push(elem); - vec - }) - .map(|vec| { - let mut list = LinkedList::new(); - list.push_back(vec); - list - }) - .reduce(LinkedList::new, |mut list1, mut list2| { - list1.append(&mut list2); - list1 - }); - - let len = list.iter().map(Vec::len).sum(); - (list, len) -} diff -Nru temporalio-1.3.0/vendor/hashbrown-0.13.2/src/external_trait_impls/rayon/map.rs temporalio-1.3.0/vendor/hashbrown-0.13.2/src/external_trait_impls/rayon/map.rs --- temporalio-1.3.0/vendor/hashbrown-0.13.2/src/external_trait_impls/rayon/map.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/hashbrown-0.13.2/src/external_trait_impls/rayon/map.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,734 +0,0 @@ -//! Rayon extensions for `HashMap`. - -use super::raw::{RawIntoParIter, RawParDrain, RawParIter}; -use crate::hash_map::HashMap; -use crate::raw::{Allocator, Global}; -use core::fmt; -use core::hash::{BuildHasher, Hash}; -use core::marker::PhantomData; -use rayon::iter::plumbing::UnindexedConsumer; -use rayon::iter::{FromParallelIterator, IntoParallelIterator, ParallelExtend, ParallelIterator}; - -/// Parallel iterator over shared references to entries in a map. -/// -/// This iterator is created by the [`par_iter`] method on [`HashMap`] -/// (provided by the [`IntoParallelRefIterator`] trait). -/// See its documentation for more. -/// -/// [`par_iter`]: /hashbrown/struct.HashMap.html#method.par_iter -/// [`HashMap`]: /hashbrown/struct.HashMap.html -/// [`IntoParallelRefIterator`]: https://docs.rs/rayon/1.0/rayon/iter/trait.IntoParallelRefIterator.html -pub struct ParIter<'a, K, V> { - inner: RawParIter<(K, V)>, - marker: PhantomData<(&'a K, &'a V)>, -} - -impl<'a, K: Sync, V: Sync> ParallelIterator for ParIter<'a, K, V> { - type Item = (&'a K, &'a V); - - #[cfg_attr(feature = "inline-more", inline)] - fn drive_unindexed(self, consumer: C) -> C::Result - where - C: UnindexedConsumer, - { - self.inner - .map(|x| unsafe { - let r = x.as_ref(); - (&r.0, &r.1) - }) - .drive_unindexed(consumer) - } -} - -impl Clone for ParIter<'_, K, V> { - #[cfg_attr(feature = "inline-more", inline)] - fn clone(&self) -> Self { - Self { - inner: self.inner.clone(), - marker: PhantomData, - } - } -} - -impl fmt::Debug for ParIter<'_, K, V> { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - let iter = unsafe { self.inner.iter() }.map(|x| unsafe { - let r = x.as_ref(); - (&r.0, &r.1) - }); - f.debug_list().entries(iter).finish() - } -} - -/// Parallel iterator over shared references to keys in a map. -/// -/// This iterator is created by the [`par_keys`] method on [`HashMap`]. -/// See its documentation for more. -/// -/// [`par_keys`]: /hashbrown/struct.HashMap.html#method.par_keys -/// [`HashMap`]: /hashbrown/struct.HashMap.html -pub struct ParKeys<'a, K, V> { - inner: RawParIter<(K, V)>, - marker: PhantomData<(&'a K, &'a V)>, -} - -impl<'a, K: Sync, V: Sync> ParallelIterator for ParKeys<'a, K, V> { - type Item = &'a K; - - #[cfg_attr(feature = "inline-more", inline)] - fn drive_unindexed(self, consumer: C) -> C::Result - where - C: UnindexedConsumer, - { - self.inner - .map(|x| unsafe { &x.as_ref().0 }) - .drive_unindexed(consumer) - } -} - -impl Clone for ParKeys<'_, K, V> { - #[cfg_attr(feature = "inline-more", inline)] - fn clone(&self) -> Self { - Self { - inner: self.inner.clone(), - marker: PhantomData, - } - } -} - -impl fmt::Debug for ParKeys<'_, K, V> { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - let iter = unsafe { self.inner.iter() }.map(|x| unsafe { &x.as_ref().0 }); - f.debug_list().entries(iter).finish() - } -} - -/// Parallel iterator over shared references to values in a map. -/// -/// This iterator is created by the [`par_values`] method on [`HashMap`]. -/// See its documentation for more. -/// -/// [`par_values`]: /hashbrown/struct.HashMap.html#method.par_values -/// [`HashMap`]: /hashbrown/struct.HashMap.html -pub struct ParValues<'a, K, V> { - inner: RawParIter<(K, V)>, - marker: PhantomData<(&'a K, &'a V)>, -} - -impl<'a, K: Sync, V: Sync> ParallelIterator for ParValues<'a, K, V> { - type Item = &'a V; - - #[cfg_attr(feature = "inline-more", inline)] - fn drive_unindexed(self, consumer: C) -> C::Result - where - C: UnindexedConsumer, - { - self.inner - .map(|x| unsafe { &x.as_ref().1 }) - .drive_unindexed(consumer) - } -} - -impl Clone for ParValues<'_, K, V> { - #[cfg_attr(feature = "inline-more", inline)] - fn clone(&self) -> Self { - Self { - inner: self.inner.clone(), - marker: PhantomData, - } - } -} - -impl fmt::Debug for ParValues<'_, K, V> { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - let iter = unsafe { self.inner.iter() }.map(|x| unsafe { &x.as_ref().1 }); - f.debug_list().entries(iter).finish() - } -} - -/// Parallel iterator over mutable references to entries in a map. -/// -/// This iterator is created by the [`par_iter_mut`] method on [`HashMap`] -/// (provided by the [`IntoParallelRefMutIterator`] trait). -/// See its documentation for more. -/// -/// [`par_iter_mut`]: /hashbrown/struct.HashMap.html#method.par_iter_mut -/// [`HashMap`]: /hashbrown/struct.HashMap.html -/// [`IntoParallelRefMutIterator`]: https://docs.rs/rayon/1.0/rayon/iter/trait.IntoParallelRefMutIterator.html -pub struct ParIterMut<'a, K, V> { - inner: RawParIter<(K, V)>, - marker: PhantomData<(&'a K, &'a mut V)>, -} - -impl<'a, K: Sync, V: Send> ParallelIterator for ParIterMut<'a, K, V> { - type Item = (&'a K, &'a mut V); - - #[cfg_attr(feature = "inline-more", inline)] - fn drive_unindexed(self, consumer: C) -> C::Result - where - C: UnindexedConsumer, - { - self.inner - .map(|x| unsafe { - let r = x.as_mut(); - (&r.0, &mut r.1) - }) - .drive_unindexed(consumer) - } -} - -impl fmt::Debug for ParIterMut<'_, K, V> { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - ParIter { - inner: self.inner.clone(), - marker: PhantomData, - } - .fmt(f) - } -} - -/// Parallel iterator over mutable references to values in a map. -/// -/// This iterator is created by the [`par_values_mut`] method on [`HashMap`]. -/// See its documentation for more. -/// -/// [`par_values_mut`]: /hashbrown/struct.HashMap.html#method.par_values_mut -/// [`HashMap`]: /hashbrown/struct.HashMap.html -pub struct ParValuesMut<'a, K, V> { - inner: RawParIter<(K, V)>, - marker: PhantomData<(&'a K, &'a mut V)>, -} - -impl<'a, K: Sync, V: Send> ParallelIterator for ParValuesMut<'a, K, V> { - type Item = &'a mut V; - - #[cfg_attr(feature = "inline-more", inline)] - fn drive_unindexed(self, consumer: C) -> C::Result - where - C: UnindexedConsumer, - { - self.inner - .map(|x| unsafe { &mut x.as_mut().1 }) - .drive_unindexed(consumer) - } -} - -impl fmt::Debug for ParValuesMut<'_, K, V> { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - ParValues { - inner: self.inner.clone(), - marker: PhantomData, - } - .fmt(f) - } -} - -/// Parallel iterator over entries of a consumed map. -/// -/// This iterator is created by the [`into_par_iter`] method on [`HashMap`] -/// (provided by the [`IntoParallelIterator`] trait). -/// See its documentation for more. -/// -/// [`into_par_iter`]: /hashbrown/struct.HashMap.html#method.into_par_iter -/// [`HashMap`]: /hashbrown/struct.HashMap.html -/// [`IntoParallelIterator`]: https://docs.rs/rayon/1.0/rayon/iter/trait.IntoParallelIterator.html -pub struct IntoParIter { - inner: RawIntoParIter<(K, V), A>, -} - -impl ParallelIterator for IntoParIter { - type Item = (K, V); - - #[cfg_attr(feature = "inline-more", inline)] - fn drive_unindexed(self, consumer: C) -> C::Result - where - C: UnindexedConsumer, - { - self.inner.drive_unindexed(consumer) - } -} - -impl fmt::Debug - for IntoParIter -{ - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - ParIter { - inner: unsafe { self.inner.par_iter() }, - marker: PhantomData, - } - .fmt(f) - } -} - -/// Parallel draining iterator over entries of a map. -/// -/// This iterator is created by the [`par_drain`] method on [`HashMap`]. -/// See its documentation for more. -/// -/// [`par_drain`]: /hashbrown/struct.HashMap.html#method.par_drain -/// [`HashMap`]: /hashbrown/struct.HashMap.html -pub struct ParDrain<'a, K, V, A: Allocator + Clone = Global> { - inner: RawParDrain<'a, (K, V), A>, -} - -impl ParallelIterator for ParDrain<'_, K, V, A> { - type Item = (K, V); - - #[cfg_attr(feature = "inline-more", inline)] - fn drive_unindexed(self, consumer: C) -> C::Result - where - C: UnindexedConsumer, - { - self.inner.drive_unindexed(consumer) - } -} - -impl fmt::Debug - for ParDrain<'_, K, V, A> -{ - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - ParIter { - inner: unsafe { self.inner.par_iter() }, - marker: PhantomData, - } - .fmt(f) - } -} - -impl HashMap { - /// Visits (potentially in parallel) immutably borrowed keys in an arbitrary order. - #[cfg_attr(feature = "inline-more", inline)] - pub fn par_keys(&self) -> ParKeys<'_, K, V> { - ParKeys { - inner: unsafe { self.table.par_iter() }, - marker: PhantomData, - } - } - - /// Visits (potentially in parallel) immutably borrowed values in an arbitrary order. - #[cfg_attr(feature = "inline-more", inline)] - pub fn par_values(&self) -> ParValues<'_, K, V> { - ParValues { - inner: unsafe { self.table.par_iter() }, - marker: PhantomData, - } - } -} - -impl HashMap { - /// Visits (potentially in parallel) mutably borrowed values in an arbitrary order. - #[cfg_attr(feature = "inline-more", inline)] - pub fn par_values_mut(&mut self) -> ParValuesMut<'_, K, V> { - ParValuesMut { - inner: unsafe { self.table.par_iter() }, - marker: PhantomData, - } - } - - /// Consumes (potentially in parallel) all values in an arbitrary order, - /// while preserving the map's allocated memory for reuse. - #[cfg_attr(feature = "inline-more", inline)] - pub fn par_drain(&mut self) -> ParDrain<'_, K, V, A> { - ParDrain { - inner: self.table.par_drain(), - } - } -} - -impl HashMap -where - K: Eq + Hash + Sync, - V: PartialEq + Sync, - S: BuildHasher + Sync, - A: Allocator + Clone + Sync, -{ - /// Returns `true` if the map is equal to another, - /// i.e. both maps contain the same keys mapped to the same values. - /// - /// This method runs in a potentially parallel fashion. - pub fn par_eq(&self, other: &Self) -> bool { - self.len() == other.len() - && self - .into_par_iter() - .all(|(key, value)| other.get(key).map_or(false, |v| *value == *v)) - } -} - -impl IntoParallelIterator - for HashMap -{ - type Item = (K, V); - type Iter = IntoParIter; - - #[cfg_attr(feature = "inline-more", inline)] - fn into_par_iter(self) -> Self::Iter { - IntoParIter { - inner: self.table.into_par_iter(), - } - } -} - -impl<'a, K: Sync, V: Sync, S, A: Allocator + Clone> IntoParallelIterator - for &'a HashMap -{ - type Item = (&'a K, &'a V); - type Iter = ParIter<'a, K, V>; - - #[cfg_attr(feature = "inline-more", inline)] - fn into_par_iter(self) -> Self::Iter { - ParIter { - inner: unsafe { self.table.par_iter() }, - marker: PhantomData, - } - } -} - -impl<'a, K: Sync, V: Send, S, A: Allocator + Clone> IntoParallelIterator - for &'a mut HashMap -{ - type Item = (&'a K, &'a mut V); - type Iter = ParIterMut<'a, K, V>; - - #[cfg_attr(feature = "inline-more", inline)] - fn into_par_iter(self) -> Self::Iter { - ParIterMut { - inner: unsafe { self.table.par_iter() }, - marker: PhantomData, - } - } -} - -/// Collect (key, value) pairs from a parallel iterator into a -/// hashmap. If multiple pairs correspond to the same key, then the -/// ones produced earlier in the parallel iterator will be -/// overwritten, just as with a sequential iterator. -impl FromParallelIterator<(K, V)> for HashMap -where - K: Eq + Hash + Send, - V: Send, - S: BuildHasher + Default, -{ - fn from_par_iter

(par_iter: P) -> Self - where - P: IntoParallelIterator, - { - let mut map = HashMap::default(); - map.par_extend(par_iter); - map - } -} - -/// Extend a hash map with items from a parallel iterator. -impl ParallelExtend<(K, V)> for HashMap -where - K: Eq + Hash + Send, - V: Send, - S: BuildHasher, - A: Allocator + Clone, -{ - fn par_extend(&mut self, par_iter: I) - where - I: IntoParallelIterator, - { - extend(self, par_iter); - } -} - -/// Extend a hash map with copied items from a parallel iterator. -impl<'a, K, V, S, A> ParallelExtend<(&'a K, &'a V)> for HashMap -where - K: Copy + Eq + Hash + Sync, - V: Copy + Sync, - S: BuildHasher, - A: Allocator + Clone, -{ - fn par_extend(&mut self, par_iter: I) - where - I: IntoParallelIterator, - { - extend(self, par_iter); - } -} - -// This is equal to the normal `HashMap` -- no custom advantage. -fn extend(map: &mut HashMap, par_iter: I) -where - K: Eq + Hash, - S: BuildHasher, - I: IntoParallelIterator, - A: Allocator + Clone, - HashMap: Extend, -{ - let (list, len) = super::helpers::collect(par_iter); - - // Keys may be already present or show multiple times in the iterator. - // Reserve the entire length if the map is empty. - // Otherwise reserve half the length (rounded up), so the map - // will only resize twice in the worst case. - let reserve = if map.is_empty() { len } else { (len + 1) / 2 }; - map.reserve(reserve); - for vec in list { - map.extend(vec); - } -} - -#[cfg(test)] -mod test_par_map { - use alloc::vec::Vec; - use core::hash::{Hash, Hasher}; - use core::sync::atomic::{AtomicUsize, Ordering}; - - use rayon::prelude::*; - - use crate::hash_map::HashMap; - - struct Dropable<'a> { - k: usize, - counter: &'a AtomicUsize, - } - - impl Dropable<'_> { - fn new(k: usize, counter: &AtomicUsize) -> Dropable<'_> { - counter.fetch_add(1, Ordering::Relaxed); - - Dropable { k, counter } - } - } - - impl Drop for Dropable<'_> { - fn drop(&mut self) { - self.counter.fetch_sub(1, Ordering::Relaxed); - } - } - - impl Clone for Dropable<'_> { - fn clone(&self) -> Self { - Dropable::new(self.k, self.counter) - } - } - - impl Hash for Dropable<'_> { - fn hash(&self, state: &mut H) - where - H: Hasher, - { - self.k.hash(state); - } - } - - impl PartialEq for Dropable<'_> { - fn eq(&self, other: &Self) -> bool { - self.k == other.k - } - } - - impl Eq for Dropable<'_> {} - - #[test] - fn test_into_iter_drops() { - let key = AtomicUsize::new(0); - let value = AtomicUsize::new(0); - - let hm = { - let mut hm = HashMap::new(); - - assert_eq!(key.load(Ordering::Relaxed), 0); - assert_eq!(value.load(Ordering::Relaxed), 0); - - for i in 0..100 { - let d1 = Dropable::new(i, &key); - let d2 = Dropable::new(i + 100, &value); - hm.insert(d1, d2); - } - - assert_eq!(key.load(Ordering::Relaxed), 100); - assert_eq!(value.load(Ordering::Relaxed), 100); - - hm - }; - - // By the way, ensure that cloning doesn't screw up the dropping. - drop(hm.clone()); - - assert_eq!(key.load(Ordering::Relaxed), 100); - assert_eq!(value.load(Ordering::Relaxed), 100); - - // Ensure that dropping the iterator does not leak anything. - drop(hm.clone().into_par_iter()); - - { - assert_eq!(key.load(Ordering::Relaxed), 100); - assert_eq!(value.load(Ordering::Relaxed), 100); - - // retain only half - let _v: Vec<_> = hm - .into_par_iter() - .filter(|&(ref key, _)| key.k < 50) - .collect(); - - assert_eq!(key.load(Ordering::Relaxed), 50); - assert_eq!(value.load(Ordering::Relaxed), 50); - }; - - assert_eq!(key.load(Ordering::Relaxed), 0); - assert_eq!(value.load(Ordering::Relaxed), 0); - } - - #[test] - fn test_drain_drops() { - let key = AtomicUsize::new(0); - let value = AtomicUsize::new(0); - - let mut hm = { - let mut hm = HashMap::new(); - - assert_eq!(key.load(Ordering::Relaxed), 0); - assert_eq!(value.load(Ordering::Relaxed), 0); - - for i in 0..100 { - let d1 = Dropable::new(i, &key); - let d2 = Dropable::new(i + 100, &value); - hm.insert(d1, d2); - } - - assert_eq!(key.load(Ordering::Relaxed), 100); - assert_eq!(value.load(Ordering::Relaxed), 100); - - hm - }; - - // By the way, ensure that cloning doesn't screw up the dropping. - drop(hm.clone()); - - assert_eq!(key.load(Ordering::Relaxed), 100); - assert_eq!(value.load(Ordering::Relaxed), 100); - - // Ensure that dropping the drain iterator does not leak anything. - drop(hm.clone().par_drain()); - - { - assert_eq!(key.load(Ordering::Relaxed), 100); - assert_eq!(value.load(Ordering::Relaxed), 100); - - // retain only half - let _v: Vec<_> = hm.drain().filter(|&(ref key, _)| key.k < 50).collect(); - assert!(hm.is_empty()); - - assert_eq!(key.load(Ordering::Relaxed), 50); - assert_eq!(value.load(Ordering::Relaxed), 50); - }; - - assert_eq!(key.load(Ordering::Relaxed), 0); - assert_eq!(value.load(Ordering::Relaxed), 0); - } - - #[test] - fn test_empty_iter() { - let mut m: HashMap = HashMap::new(); - assert_eq!(m.par_drain().count(), 0); - assert_eq!(m.par_keys().count(), 0); - assert_eq!(m.par_values().count(), 0); - assert_eq!(m.par_values_mut().count(), 0); - assert_eq!(m.par_iter().count(), 0); - assert_eq!(m.par_iter_mut().count(), 0); - assert_eq!(m.len(), 0); - assert!(m.is_empty()); - assert_eq!(m.into_par_iter().count(), 0); - } - - #[test] - fn test_iterate() { - let mut m = HashMap::with_capacity(4); - for i in 0..32 { - assert!(m.insert(i, i * 2).is_none()); - } - assert_eq!(m.len(), 32); - - let observed = AtomicUsize::new(0); - - m.par_iter().for_each(|(k, v)| { - assert_eq!(*v, *k * 2); - observed.fetch_or(1 << *k, Ordering::Relaxed); - }); - assert_eq!(observed.into_inner(), 0xFFFF_FFFF); - } - - #[test] - fn test_keys() { - let vec = vec![(1, 'a'), (2, 'b'), (3, 'c')]; - let map: HashMap<_, _> = vec.into_par_iter().collect(); - let keys: Vec<_> = map.par_keys().cloned().collect(); - assert_eq!(keys.len(), 3); - assert!(keys.contains(&1)); - assert!(keys.contains(&2)); - assert!(keys.contains(&3)); - } - - #[test] - fn test_values() { - let vec = vec![(1, 'a'), (2, 'b'), (3, 'c')]; - let map: HashMap<_, _> = vec.into_par_iter().collect(); - let values: Vec<_> = map.par_values().cloned().collect(); - assert_eq!(values.len(), 3); - assert!(values.contains(&'a')); - assert!(values.contains(&'b')); - assert!(values.contains(&'c')); - } - - #[test] - fn test_values_mut() { - let vec = vec![(1, 1), (2, 2), (3, 3)]; - let mut map: HashMap<_, _> = vec.into_par_iter().collect(); - map.par_values_mut().for_each(|value| *value *= 2); - let values: Vec<_> = map.par_values().cloned().collect(); - assert_eq!(values.len(), 3); - assert!(values.contains(&2)); - assert!(values.contains(&4)); - assert!(values.contains(&6)); - } - - #[test] - fn test_eq() { - let mut m1 = HashMap::new(); - m1.insert(1, 2); - m1.insert(2, 3); - m1.insert(3, 4); - - let mut m2 = HashMap::new(); - m2.insert(1, 2); - m2.insert(2, 3); - - assert!(!m1.par_eq(&m2)); - - m2.insert(3, 4); - - assert!(m1.par_eq(&m2)); - } - - #[test] - fn test_from_iter() { - let xs = [(1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6)]; - - let map: HashMap<_, _> = xs.par_iter().cloned().collect(); - - for &(k, v) in &xs { - assert_eq!(map.get(&k), Some(&v)); - } - } - - #[test] - fn test_extend_ref() { - let mut a = HashMap::new(); - a.insert(1, "one"); - let mut b = HashMap::new(); - b.insert(2, "two"); - b.insert(3, "three"); - - a.par_extend(&b); - - assert_eq!(a.len(), 3); - assert_eq!(a[&1], "one"); - assert_eq!(a[&2], "two"); - assert_eq!(a[&3], "three"); - } -} diff -Nru temporalio-1.3.0/vendor/hashbrown-0.13.2/src/external_trait_impls/rayon/mod.rs temporalio-1.3.0/vendor/hashbrown-0.13.2/src/external_trait_impls/rayon/mod.rs --- temporalio-1.3.0/vendor/hashbrown-0.13.2/src/external_trait_impls/rayon/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/hashbrown-0.13.2/src/external_trait_impls/rayon/mod.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,4 +0,0 @@ -mod helpers; -pub(crate) mod map; -pub(crate) mod raw; -pub(crate) mod set; diff -Nru temporalio-1.3.0/vendor/hashbrown-0.13.2/src/external_trait_impls/rayon/raw.rs temporalio-1.3.0/vendor/hashbrown-0.13.2/src/external_trait_impls/rayon/raw.rs --- temporalio-1.3.0/vendor/hashbrown-0.13.2/src/external_trait_impls/rayon/raw.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/hashbrown-0.13.2/src/external_trait_impls/rayon/raw.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,231 +0,0 @@ -use crate::raw::Bucket; -use crate::raw::{Allocator, Global, RawIter, RawIterRange, RawTable}; -use crate::scopeguard::guard; -use alloc::alloc::dealloc; -use core::marker::PhantomData; -use core::mem; -use core::ptr::NonNull; -use rayon::iter::{ - plumbing::{self, Folder, UnindexedConsumer, UnindexedProducer}, - ParallelIterator, -}; - -/// Parallel iterator which returns a raw pointer to every full bucket in the table. -pub struct RawParIter { - iter: RawIterRange, -} - -impl RawParIter { - #[cfg_attr(feature = "inline-more", inline)] - pub(super) unsafe fn iter(&self) -> RawIterRange { - self.iter.clone() - } -} - -impl Clone for RawParIter { - #[cfg_attr(feature = "inline-more", inline)] - fn clone(&self) -> Self { - Self { - iter: self.iter.clone(), - } - } -} - -impl From> for RawParIter { - fn from(it: RawIter) -> Self { - RawParIter { iter: it.iter } - } -} - -impl ParallelIterator for RawParIter { - type Item = Bucket; - - #[cfg_attr(feature = "inline-more", inline)] - fn drive_unindexed(self, consumer: C) -> C::Result - where - C: UnindexedConsumer, - { - let producer = ParIterProducer { iter: self.iter }; - plumbing::bridge_unindexed(producer, consumer) - } -} - -/// Producer which returns a `Bucket` for every element. -struct ParIterProducer { - iter: RawIterRange, -} - -impl UnindexedProducer for ParIterProducer { - type Item = Bucket; - - #[cfg_attr(feature = "inline-more", inline)] - fn split(self) -> (Self, Option) { - let (left, right) = self.iter.split(); - let left = ParIterProducer { iter: left }; - let right = right.map(|right| ParIterProducer { iter: right }); - (left, right) - } - - #[cfg_attr(feature = "inline-more", inline)] - fn fold_with(self, folder: F) -> F - where - F: Folder, - { - folder.consume_iter(self.iter) - } -} - -/// Parallel iterator which consumes a table and returns elements. -pub struct RawIntoParIter { - table: RawTable, -} - -impl RawIntoParIter { - #[cfg_attr(feature = "inline-more", inline)] - pub(super) unsafe fn par_iter(&self) -> RawParIter { - self.table.par_iter() - } -} - -impl ParallelIterator for RawIntoParIter { - type Item = T; - - #[cfg_attr(feature = "inline-more", inline)] - fn drive_unindexed(self, consumer: C) -> C::Result - where - C: UnindexedConsumer, - { - let iter = unsafe { self.table.iter().iter }; - let _guard = guard(self.table.into_allocation(), |alloc| { - if let Some((ptr, layout)) = *alloc { - unsafe { - dealloc(ptr.as_ptr(), layout); - } - } - }); - let producer = ParDrainProducer { iter }; - plumbing::bridge_unindexed(producer, consumer) - } -} - -/// Parallel iterator which consumes elements without freeing the table storage. -pub struct RawParDrain<'a, T, A: Allocator + Clone = Global> { - // We don't use a &'a mut RawTable because we want RawParDrain to be - // covariant over T. - table: NonNull>, - marker: PhantomData<&'a RawTable>, -} - -unsafe impl Send for RawParDrain<'_, T, A> {} - -impl RawParDrain<'_, T, A> { - #[cfg_attr(feature = "inline-more", inline)] - pub(super) unsafe fn par_iter(&self) -> RawParIter { - self.table.as_ref().par_iter() - } -} - -impl ParallelIterator for RawParDrain<'_, T, A> { - type Item = T; - - #[cfg_attr(feature = "inline-more", inline)] - fn drive_unindexed(self, consumer: C) -> C::Result - where - C: UnindexedConsumer, - { - let _guard = guard(self.table, |table| unsafe { - table.as_mut().clear_no_drop(); - }); - let iter = unsafe { self.table.as_ref().iter().iter }; - mem::forget(self); - let producer = ParDrainProducer { iter }; - plumbing::bridge_unindexed(producer, consumer) - } -} - -impl Drop for RawParDrain<'_, T, A> { - fn drop(&mut self) { - // If drive_unindexed is not called then simply clear the table. - unsafe { - self.table.as_mut().clear(); - } - } -} - -/// Producer which will consume all elements in the range, even if it is dropped -/// halfway through. -struct ParDrainProducer { - iter: RawIterRange, -} - -impl UnindexedProducer for ParDrainProducer { - type Item = T; - - #[cfg_attr(feature = "inline-more", inline)] - fn split(self) -> (Self, Option) { - let (left, right) = self.iter.clone().split(); - mem::forget(self); - let left = ParDrainProducer { iter: left }; - let right = right.map(|right| ParDrainProducer { iter: right }); - (left, right) - } - - #[cfg_attr(feature = "inline-more", inline)] - fn fold_with(mut self, mut folder: F) -> F - where - F: Folder, - { - // Make sure to modify the iterator in-place so that any remaining - // elements are processed in our Drop impl. - for item in &mut self.iter { - folder = folder.consume(unsafe { item.read() }); - if folder.full() { - return folder; - } - } - - // If we processed all elements then we don't need to run the drop. - mem::forget(self); - folder - } -} - -impl Drop for ParDrainProducer { - #[cfg_attr(feature = "inline-more", inline)] - fn drop(&mut self) { - // Drop all remaining elements - if mem::needs_drop::() { - for item in &mut self.iter { - unsafe { - item.drop(); - } - } - } - } -} - -impl RawTable { - /// Returns a parallel iterator over the elements in a `RawTable`. - #[cfg_attr(feature = "inline-more", inline)] - pub unsafe fn par_iter(&self) -> RawParIter { - RawParIter { - iter: self.iter().iter, - } - } - - /// Returns a parallel iterator over the elements in a `RawTable`. - #[cfg_attr(feature = "inline-more", inline)] - pub fn into_par_iter(self) -> RawIntoParIter { - RawIntoParIter { table: self } - } - - /// Returns a parallel iterator which consumes all elements of a `RawTable` - /// without freeing its memory allocation. - #[cfg_attr(feature = "inline-more", inline)] - pub fn par_drain(&mut self) -> RawParDrain<'_, T, A> { - RawParDrain { - table: NonNull::from(self), - marker: PhantomData, - } - } -} diff -Nru temporalio-1.3.0/vendor/hashbrown-0.13.2/src/external_trait_impls/rayon/set.rs temporalio-1.3.0/vendor/hashbrown-0.13.2/src/external_trait_impls/rayon/set.rs --- temporalio-1.3.0/vendor/hashbrown-0.13.2/src/external_trait_impls/rayon/set.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/hashbrown-0.13.2/src/external_trait_impls/rayon/set.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,659 +0,0 @@ -//! Rayon extensions for `HashSet`. - -use super::map; -use crate::hash_set::HashSet; -use crate::raw::{Allocator, Global}; -use core::hash::{BuildHasher, Hash}; -use rayon::iter::plumbing::UnindexedConsumer; -use rayon::iter::{FromParallelIterator, IntoParallelIterator, ParallelExtend, ParallelIterator}; - -/// Parallel iterator over elements of a consumed set. -/// -/// This iterator is created by the [`into_par_iter`] method on [`HashSet`] -/// (provided by the [`IntoParallelIterator`] trait). -/// See its documentation for more. -/// -/// [`into_par_iter`]: /hashbrown/struct.HashSet.html#method.into_par_iter -/// [`HashSet`]: /hashbrown/struct.HashSet.html -/// [`IntoParallelIterator`]: https://docs.rs/rayon/1.0/rayon/iter/trait.IntoParallelIterator.html -pub struct IntoParIter { - inner: map::IntoParIter, -} - -impl ParallelIterator for IntoParIter { - type Item = T; - - fn drive_unindexed(self, consumer: C) -> C::Result - where - C: UnindexedConsumer, - { - self.inner.map(|(k, _)| k).drive_unindexed(consumer) - } -} - -/// Parallel draining iterator over entries of a set. -/// -/// This iterator is created by the [`par_drain`] method on [`HashSet`]. -/// See its documentation for more. -/// -/// [`par_drain`]: /hashbrown/struct.HashSet.html#method.par_drain -/// [`HashSet`]: /hashbrown/struct.HashSet.html -pub struct ParDrain<'a, T, A: Allocator + Clone = Global> { - inner: map::ParDrain<'a, T, (), A>, -} - -impl ParallelIterator for ParDrain<'_, T, A> { - type Item = T; - - fn drive_unindexed(self, consumer: C) -> C::Result - where - C: UnindexedConsumer, - { - self.inner.map(|(k, _)| k).drive_unindexed(consumer) - } -} - -/// Parallel iterator over shared references to elements in a set. -/// -/// This iterator is created by the [`par_iter`] method on [`HashSet`] -/// (provided by the [`IntoParallelRefIterator`] trait). -/// See its documentation for more. -/// -/// [`par_iter`]: /hashbrown/struct.HashSet.html#method.par_iter -/// [`HashSet`]: /hashbrown/struct.HashSet.html -/// [`IntoParallelRefIterator`]: https://docs.rs/rayon/1.0/rayon/iter/trait.IntoParallelRefIterator.html -pub struct ParIter<'a, T> { - inner: map::ParKeys<'a, T, ()>, -} - -impl<'a, T: Sync> ParallelIterator for ParIter<'a, T> { - type Item = &'a T; - - fn drive_unindexed(self, consumer: C) -> C::Result - where - C: UnindexedConsumer, - { - self.inner.drive_unindexed(consumer) - } -} - -/// Parallel iterator over shared references to elements in the difference of -/// sets. -/// -/// This iterator is created by the [`par_difference`] method on [`HashSet`]. -/// See its documentation for more. -/// -/// [`par_difference`]: /hashbrown/struct.HashSet.html#method.par_difference -/// [`HashSet`]: /hashbrown/struct.HashSet.html -pub struct ParDifference<'a, T, S, A: Allocator + Clone = Global> { - a: &'a HashSet, - b: &'a HashSet, -} - -impl<'a, T, S, A> ParallelIterator for ParDifference<'a, T, S, A> -where - T: Eq + Hash + Sync, - S: BuildHasher + Sync, - A: Allocator + Clone + Sync, -{ - type Item = &'a T; - - fn drive_unindexed(self, consumer: C) -> C::Result - where - C: UnindexedConsumer, - { - self.a - .into_par_iter() - .filter(|&x| !self.b.contains(x)) - .drive_unindexed(consumer) - } -} - -/// Parallel iterator over shared references to elements in the symmetric -/// difference of sets. -/// -/// This iterator is created by the [`par_symmetric_difference`] method on -/// [`HashSet`]. -/// See its documentation for more. -/// -/// [`par_symmetric_difference`]: /hashbrown/struct.HashSet.html#method.par_symmetric_difference -/// [`HashSet`]: /hashbrown/struct.HashSet.html -pub struct ParSymmetricDifference<'a, T, S, A: Allocator + Clone = Global> { - a: &'a HashSet, - b: &'a HashSet, -} - -impl<'a, T, S, A> ParallelIterator for ParSymmetricDifference<'a, T, S, A> -where - T: Eq + Hash + Sync, - S: BuildHasher + Sync, - A: Allocator + Clone + Sync, -{ - type Item = &'a T; - - fn drive_unindexed(self, consumer: C) -> C::Result - where - C: UnindexedConsumer, - { - self.a - .par_difference(self.b) - .chain(self.b.par_difference(self.a)) - .drive_unindexed(consumer) - } -} - -/// Parallel iterator over shared references to elements in the intersection of -/// sets. -/// -/// This iterator is created by the [`par_intersection`] method on [`HashSet`]. -/// See its documentation for more. -/// -/// [`par_intersection`]: /hashbrown/struct.HashSet.html#method.par_intersection -/// [`HashSet`]: /hashbrown/struct.HashSet.html -pub struct ParIntersection<'a, T, S, A: Allocator + Clone = Global> { - a: &'a HashSet, - b: &'a HashSet, -} - -impl<'a, T, S, A> ParallelIterator for ParIntersection<'a, T, S, A> -where - T: Eq + Hash + Sync, - S: BuildHasher + Sync, - A: Allocator + Clone + Sync, -{ - type Item = &'a T; - - fn drive_unindexed(self, consumer: C) -> C::Result - where - C: UnindexedConsumer, - { - self.a - .into_par_iter() - .filter(|&x| self.b.contains(x)) - .drive_unindexed(consumer) - } -} - -/// Parallel iterator over shared references to elements in the union of sets. -/// -/// This iterator is created by the [`par_union`] method on [`HashSet`]. -/// See its documentation for more. -/// -/// [`par_union`]: /hashbrown/struct.HashSet.html#method.par_union -/// [`HashSet`]: /hashbrown/struct.HashSet.html -pub struct ParUnion<'a, T, S, A: Allocator + Clone = Global> { - a: &'a HashSet, - b: &'a HashSet, -} - -impl<'a, T, S, A> ParallelIterator for ParUnion<'a, T, S, A> -where - T: Eq + Hash + Sync, - S: BuildHasher + Sync, - A: Allocator + Clone + Sync, -{ - type Item = &'a T; - - fn drive_unindexed(self, consumer: C) -> C::Result - where - C: UnindexedConsumer, - { - // We'll iterate one set in full, and only the remaining difference from the other. - // Use the smaller set for the difference in order to reduce hash lookups. - let (smaller, larger) = if self.a.len() <= self.b.len() { - (self.a, self.b) - } else { - (self.b, self.a) - }; - larger - .into_par_iter() - .chain(smaller.par_difference(larger)) - .drive_unindexed(consumer) - } -} - -impl HashSet -where - T: Eq + Hash + Sync, - S: BuildHasher + Sync, - A: Allocator + Clone + Sync, -{ - /// Visits (potentially in parallel) the values representing the union, - /// i.e. all the values in `self` or `other`, without duplicates. - #[cfg_attr(feature = "inline-more", inline)] - pub fn par_union<'a>(&'a self, other: &'a Self) -> ParUnion<'a, T, S, A> { - ParUnion { a: self, b: other } - } - - /// Visits (potentially in parallel) the values representing the difference, - /// i.e. the values that are in `self` but not in `other`. - #[cfg_attr(feature = "inline-more", inline)] - pub fn par_difference<'a>(&'a self, other: &'a Self) -> ParDifference<'a, T, S, A> { - ParDifference { a: self, b: other } - } - - /// Visits (potentially in parallel) the values representing the symmetric - /// difference, i.e. the values that are in `self` or in `other` but not in both. - #[cfg_attr(feature = "inline-more", inline)] - pub fn par_symmetric_difference<'a>( - &'a self, - other: &'a Self, - ) -> ParSymmetricDifference<'a, T, S, A> { - ParSymmetricDifference { a: self, b: other } - } - - /// Visits (potentially in parallel) the values representing the - /// intersection, i.e. the values that are both in `self` and `other`. - #[cfg_attr(feature = "inline-more", inline)] - pub fn par_intersection<'a>(&'a self, other: &'a Self) -> ParIntersection<'a, T, S, A> { - ParIntersection { a: self, b: other } - } - - /// Returns `true` if `self` has no elements in common with `other`. - /// This is equivalent to checking for an empty intersection. - /// - /// This method runs in a potentially parallel fashion. - pub fn par_is_disjoint(&self, other: &Self) -> bool { - self.into_par_iter().all(|x| !other.contains(x)) - } - - /// Returns `true` if the set is a subset of another, - /// i.e. `other` contains at least all the values in `self`. - /// - /// This method runs in a potentially parallel fashion. - pub fn par_is_subset(&self, other: &Self) -> bool { - if self.len() <= other.len() { - self.into_par_iter().all(|x| other.contains(x)) - } else { - false - } - } - - /// Returns `true` if the set is a superset of another, - /// i.e. `self` contains at least all the values in `other`. - /// - /// This method runs in a potentially parallel fashion. - pub fn par_is_superset(&self, other: &Self) -> bool { - other.par_is_subset(self) - } - - /// Returns `true` if the set is equal to another, - /// i.e. both sets contain the same values. - /// - /// This method runs in a potentially parallel fashion. - pub fn par_eq(&self, other: &Self) -> bool { - self.len() == other.len() && self.par_is_subset(other) - } -} - -impl HashSet -where - T: Eq + Hash + Send, - A: Allocator + Clone + Send, -{ - /// Consumes (potentially in parallel) all values in an arbitrary order, - /// while preserving the set's allocated memory for reuse. - #[cfg_attr(feature = "inline-more", inline)] - pub fn par_drain(&mut self) -> ParDrain<'_, T, A> { - ParDrain { - inner: self.map.par_drain(), - } - } -} - -impl IntoParallelIterator for HashSet { - type Item = T; - type Iter = IntoParIter; - - #[cfg_attr(feature = "inline-more", inline)] - fn into_par_iter(self) -> Self::Iter { - IntoParIter { - inner: self.map.into_par_iter(), - } - } -} - -impl<'a, T: Sync, S, A: Allocator + Clone> IntoParallelIterator for &'a HashSet { - type Item = &'a T; - type Iter = ParIter<'a, T>; - - #[cfg_attr(feature = "inline-more", inline)] - fn into_par_iter(self) -> Self::Iter { - ParIter { - inner: self.map.par_keys(), - } - } -} - -/// Collect values from a parallel iterator into a hashset. -impl FromParallelIterator for HashSet -where - T: Eq + Hash + Send, - S: BuildHasher + Default, -{ - fn from_par_iter

(par_iter: P) -> Self - where - P: IntoParallelIterator, - { - let mut set = HashSet::default(); - set.par_extend(par_iter); - set - } -} - -/// Extend a hash set with items from a parallel iterator. -impl ParallelExtend for HashSet -where - T: Eq + Hash + Send, - S: BuildHasher, -{ - fn par_extend(&mut self, par_iter: I) - where - I: IntoParallelIterator, - { - extend(self, par_iter); - } -} - -/// Extend a hash set with copied items from a parallel iterator. -impl<'a, T, S> ParallelExtend<&'a T> for HashSet -where - T: 'a + Copy + Eq + Hash + Sync, - S: BuildHasher, -{ - fn par_extend(&mut self, par_iter: I) - where - I: IntoParallelIterator, - { - extend(self, par_iter); - } -} - -// This is equal to the normal `HashSet` -- no custom advantage. -fn extend(set: &mut HashSet, par_iter: I) -where - T: Eq + Hash, - S: BuildHasher, - A: Allocator + Clone, - I: IntoParallelIterator, - HashSet: Extend, -{ - let (list, len) = super::helpers::collect(par_iter); - - // Values may be already present or show multiple times in the iterator. - // Reserve the entire length if the set is empty. - // Otherwise reserve half the length (rounded up), so the set - // will only resize twice in the worst case. - let reserve = if set.is_empty() { len } else { (len + 1) / 2 }; - set.reserve(reserve); - for vec in list { - set.extend(vec); - } -} - -#[cfg(test)] -mod test_par_set { - use alloc::vec::Vec; - use core::sync::atomic::{AtomicUsize, Ordering}; - - use rayon::prelude::*; - - use crate::hash_set::HashSet; - - #[test] - fn test_disjoint() { - let mut xs = HashSet::new(); - let mut ys = HashSet::new(); - assert!(xs.par_is_disjoint(&ys)); - assert!(ys.par_is_disjoint(&xs)); - assert!(xs.insert(5)); - assert!(ys.insert(11)); - assert!(xs.par_is_disjoint(&ys)); - assert!(ys.par_is_disjoint(&xs)); - assert!(xs.insert(7)); - assert!(xs.insert(19)); - assert!(xs.insert(4)); - assert!(ys.insert(2)); - assert!(ys.insert(-11)); - assert!(xs.par_is_disjoint(&ys)); - assert!(ys.par_is_disjoint(&xs)); - assert!(ys.insert(7)); - assert!(!xs.par_is_disjoint(&ys)); - assert!(!ys.par_is_disjoint(&xs)); - } - - #[test] - fn test_subset_and_superset() { - let mut a = HashSet::new(); - assert!(a.insert(0)); - assert!(a.insert(5)); - assert!(a.insert(11)); - assert!(a.insert(7)); - - let mut b = HashSet::new(); - assert!(b.insert(0)); - assert!(b.insert(7)); - assert!(b.insert(19)); - assert!(b.insert(250)); - assert!(b.insert(11)); - assert!(b.insert(200)); - - assert!(!a.par_is_subset(&b)); - assert!(!a.par_is_superset(&b)); - assert!(!b.par_is_subset(&a)); - assert!(!b.par_is_superset(&a)); - - assert!(b.insert(5)); - - assert!(a.par_is_subset(&b)); - assert!(!a.par_is_superset(&b)); - assert!(!b.par_is_subset(&a)); - assert!(b.par_is_superset(&a)); - } - - #[test] - fn test_iterate() { - let mut a = HashSet::new(); - for i in 0..32 { - assert!(a.insert(i)); - } - let observed = AtomicUsize::new(0); - a.par_iter().for_each(|k| { - observed.fetch_or(1 << *k, Ordering::Relaxed); - }); - assert_eq!(observed.into_inner(), 0xFFFF_FFFF); - } - - #[test] - fn test_intersection() { - let mut a = HashSet::new(); - let mut b = HashSet::new(); - - assert!(a.insert(11)); - assert!(a.insert(1)); - assert!(a.insert(3)); - assert!(a.insert(77)); - assert!(a.insert(103)); - assert!(a.insert(5)); - assert!(a.insert(-5)); - - assert!(b.insert(2)); - assert!(b.insert(11)); - assert!(b.insert(77)); - assert!(b.insert(-9)); - assert!(b.insert(-42)); - assert!(b.insert(5)); - assert!(b.insert(3)); - - let expected = [3, 5, 11, 77]; - let i = a - .par_intersection(&b) - .map(|x| { - assert!(expected.contains(x)); - 1 - }) - .sum::(); - assert_eq!(i, expected.len()); - } - - #[test] - fn test_difference() { - let mut a = HashSet::new(); - let mut b = HashSet::new(); - - assert!(a.insert(1)); - assert!(a.insert(3)); - assert!(a.insert(5)); - assert!(a.insert(9)); - assert!(a.insert(11)); - - assert!(b.insert(3)); - assert!(b.insert(9)); - - let expected = [1, 5, 11]; - let i = a - .par_difference(&b) - .map(|x| { - assert!(expected.contains(x)); - 1 - }) - .sum::(); - assert_eq!(i, expected.len()); - } - - #[test] - fn test_symmetric_difference() { - let mut a = HashSet::new(); - let mut b = HashSet::new(); - - assert!(a.insert(1)); - assert!(a.insert(3)); - assert!(a.insert(5)); - assert!(a.insert(9)); - assert!(a.insert(11)); - - assert!(b.insert(-2)); - assert!(b.insert(3)); - assert!(b.insert(9)); - assert!(b.insert(14)); - assert!(b.insert(22)); - - let expected = [-2, 1, 5, 11, 14, 22]; - let i = a - .par_symmetric_difference(&b) - .map(|x| { - assert!(expected.contains(x)); - 1 - }) - .sum::(); - assert_eq!(i, expected.len()); - } - - #[test] - fn test_union() { - let mut a = HashSet::new(); - let mut b = HashSet::new(); - - assert!(a.insert(1)); - assert!(a.insert(3)); - assert!(a.insert(5)); - assert!(a.insert(9)); - assert!(a.insert(11)); - assert!(a.insert(16)); - assert!(a.insert(19)); - assert!(a.insert(24)); - - assert!(b.insert(-2)); - assert!(b.insert(1)); - assert!(b.insert(5)); - assert!(b.insert(9)); - assert!(b.insert(13)); - assert!(b.insert(19)); - - let expected = [-2, 1, 3, 5, 9, 11, 13, 16, 19, 24]; - let i = a - .par_union(&b) - .map(|x| { - assert!(expected.contains(x)); - 1 - }) - .sum::(); - assert_eq!(i, expected.len()); - } - - #[test] - fn test_from_iter() { - let xs = [1, 2, 3, 4, 5, 6, 7, 8, 9]; - - let set: HashSet<_> = xs.par_iter().cloned().collect(); - - for x in &xs { - assert!(set.contains(x)); - } - } - - #[test] - fn test_move_iter() { - let hs = { - let mut hs = HashSet::new(); - - hs.insert('a'); - hs.insert('b'); - - hs - }; - - let v = hs.into_par_iter().collect::>(); - assert!(v == ['a', 'b'] || v == ['b', 'a']); - } - - #[test] - fn test_eq() { - // These constants once happened to expose a bug in insert(). - // I'm keeping them around to prevent a regression. - let mut s1 = HashSet::new(); - - s1.insert(1); - s1.insert(2); - s1.insert(3); - - let mut s2 = HashSet::new(); - - s2.insert(1); - s2.insert(2); - - assert!(!s1.par_eq(&s2)); - - s2.insert(3); - - assert!(s1.par_eq(&s2)); - } - - #[test] - fn test_extend_ref() { - let mut a = HashSet::new(); - a.insert(1); - - a.par_extend(&[2, 3, 4][..]); - - assert_eq!(a.len(), 4); - assert!(a.contains(&1)); - assert!(a.contains(&2)); - assert!(a.contains(&3)); - assert!(a.contains(&4)); - - let mut b = HashSet::new(); - b.insert(5); - b.insert(6); - - a.par_extend(&b); - - assert_eq!(a.len(), 6); - assert!(a.contains(&1)); - assert!(a.contains(&2)); - assert!(a.contains(&3)); - assert!(a.contains(&4)); - assert!(a.contains(&5)); - assert!(a.contains(&6)); - } -} diff -Nru temporalio-1.3.0/vendor/hashbrown-0.13.2/src/external_trait_impls/serde.rs temporalio-1.3.0/vendor/hashbrown-0.13.2/src/external_trait_impls/serde.rs --- temporalio-1.3.0/vendor/hashbrown-0.13.2/src/external_trait_impls/serde.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/hashbrown-0.13.2/src/external_trait_impls/serde.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,201 +0,0 @@ -mod size_hint { - use core::cmp; - - /// This presumably exists to prevent denial of service attacks. - /// - /// Original discussion: https://github.com/serde-rs/serde/issues/1114. - #[cfg_attr(feature = "inline-more", inline)] - pub(super) fn cautious(hint: Option) -> usize { - cmp::min(hint.unwrap_or(0), 4096) - } -} - -mod map { - use core::fmt; - use core::hash::{BuildHasher, Hash}; - use core::marker::PhantomData; - use serde::de::{Deserialize, Deserializer, MapAccess, Visitor}; - use serde::ser::{Serialize, Serializer}; - - use crate::hash_map::HashMap; - - use super::size_hint; - - impl Serialize for HashMap - where - K: Serialize + Eq + Hash, - V: Serialize, - H: BuildHasher, - { - #[cfg_attr(feature = "inline-more", inline)] - fn serialize(&self, serializer: S) -> Result - where - S: Serializer, - { - serializer.collect_map(self) - } - } - - impl<'de, K, V, S> Deserialize<'de> for HashMap - where - K: Deserialize<'de> + Eq + Hash, - V: Deserialize<'de>, - S: BuildHasher + Default, - { - fn deserialize(deserializer: D) -> Result - where - D: Deserializer<'de>, - { - struct MapVisitor { - marker: PhantomData>, - } - - impl<'de, K, V, S> Visitor<'de> for MapVisitor - where - K: Deserialize<'de> + Eq + Hash, - V: Deserialize<'de>, - S: BuildHasher + Default, - { - type Value = HashMap; - - fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { - formatter.write_str("a map") - } - - #[cfg_attr(feature = "inline-more", inline)] - fn visit_map(self, mut map: A) -> Result - where - A: MapAccess<'de>, - { - let mut values = HashMap::with_capacity_and_hasher( - size_hint::cautious(map.size_hint()), - S::default(), - ); - - while let Some((key, value)) = map.next_entry()? { - values.insert(key, value); - } - - Ok(values) - } - } - - let visitor = MapVisitor { - marker: PhantomData, - }; - deserializer.deserialize_map(visitor) - } - } -} - -mod set { - use core::fmt; - use core::hash::{BuildHasher, Hash}; - use core::marker::PhantomData; - use serde::de::{Deserialize, Deserializer, SeqAccess, Visitor}; - use serde::ser::{Serialize, Serializer}; - - use crate::hash_set::HashSet; - - use super::size_hint; - - impl Serialize for HashSet - where - T: Serialize + Eq + Hash, - H: BuildHasher, - { - #[cfg_attr(feature = "inline-more", inline)] - fn serialize(&self, serializer: S) -> Result - where - S: Serializer, - { - serializer.collect_seq(self) - } - } - - impl<'de, T, S> Deserialize<'de> for HashSet - where - T: Deserialize<'de> + Eq + Hash, - S: BuildHasher + Default, - { - fn deserialize(deserializer: D) -> Result - where - D: Deserializer<'de>, - { - struct SeqVisitor { - marker: PhantomData>, - } - - impl<'de, T, S> Visitor<'de> for SeqVisitor - where - T: Deserialize<'de> + Eq + Hash, - S: BuildHasher + Default, - { - type Value = HashSet; - - fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { - formatter.write_str("a sequence") - } - - #[cfg_attr(feature = "inline-more", inline)] - fn visit_seq(self, mut seq: A) -> Result - where - A: SeqAccess<'de>, - { - let mut values = HashSet::with_capacity_and_hasher( - size_hint::cautious(seq.size_hint()), - S::default(), - ); - - while let Some(value) = seq.next_element()? { - values.insert(value); - } - - Ok(values) - } - } - - let visitor = SeqVisitor { - marker: PhantomData, - }; - deserializer.deserialize_seq(visitor) - } - - #[allow(clippy::missing_errors_doc)] - fn deserialize_in_place(deserializer: D, place: &mut Self) -> Result<(), D::Error> - where - D: Deserializer<'de>, - { - struct SeqInPlaceVisitor<'a, T, S>(&'a mut HashSet); - - impl<'a, 'de, T, S> Visitor<'de> for SeqInPlaceVisitor<'a, T, S> - where - T: Deserialize<'de> + Eq + Hash, - S: BuildHasher + Default, - { - type Value = (); - - fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { - formatter.write_str("a sequence") - } - - #[cfg_attr(feature = "inline-more", inline)] - fn visit_seq(self, mut seq: A) -> Result - where - A: SeqAccess<'de>, - { - self.0.clear(); - self.0.reserve(size_hint::cautious(seq.size_hint())); - - while let Some(value) = seq.next_element()? { - self.0.insert(value); - } - - Ok(()) - } - } - - deserializer.deserialize_seq(SeqInPlaceVisitor(place)) - } - } -} diff -Nru temporalio-1.3.0/vendor/hashbrown-0.13.2/src/lib.rs temporalio-1.3.0/vendor/hashbrown-0.13.2/src/lib.rs --- temporalio-1.3.0/vendor/hashbrown-0.13.2/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/hashbrown-0.13.2/src/lib.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,183 +0,0 @@ -//! This crate is a Rust port of Google's high-performance [SwissTable] hash -//! map, adapted to make it a drop-in replacement for Rust's standard `HashMap` -//! and `HashSet` types. -//! -//! The original C++ version of [SwissTable] can be found [here], and this -//! [CppCon talk] gives an overview of how the algorithm works. -//! -//! [SwissTable]: https://abseil.io/blog/20180927-swisstables -//! [here]: https://github.com/abseil/abseil-cpp/blob/master/absl/container/internal/raw_hash_set.h -//! [CppCon talk]: https://www.youtube.com/watch?v=ncHmEUmJZf4 - -#![no_std] -#![cfg_attr( - feature = "nightly", - feature( - test, - core_intrinsics, - dropck_eyepatch, - min_specialization, - extend_one, - allocator_api, - slice_ptr_get, - nonnull_slice_from_raw_parts, - maybe_uninit_array_assume_init, - build_hasher_simple_hash_one - ) -)] -#![allow( - clippy::doc_markdown, - clippy::module_name_repetitions, - clippy::must_use_candidate, - clippy::option_if_let_else, - clippy::redundant_else, - clippy::manual_map, - clippy::missing_safety_doc, - clippy::missing_errors_doc -)] -#![warn(missing_docs)] -#![warn(rust_2018_idioms)] - -#[cfg(test)] -#[macro_use] -extern crate std; - -#[cfg_attr(test, macro_use)] -extern crate alloc; - -#[cfg(feature = "nightly")] -#[cfg(doctest)] -doc_comment::doctest!("../README.md"); - -#[macro_use] -mod macros; - -#[cfg(feature = "raw")] -/// Experimental and unsafe `RawTable` API. This module is only available if the -/// `raw` feature is enabled. -pub mod raw { - // The RawTable API is still experimental and is not properly documented yet. - #[allow(missing_docs)] - #[path = "mod.rs"] - mod inner; - pub use inner::*; - - #[cfg(feature = "rayon")] - /// [rayon]-based parallel iterator types for hash maps. - /// You will rarely need to interact with it directly unless you have need - /// to name one of the iterator types. - /// - /// [rayon]: https://docs.rs/rayon/1.0/rayon - pub mod rayon { - pub use crate::external_trait_impls::rayon::raw::*; - } -} -#[cfg(not(feature = "raw"))] -mod raw; - -mod external_trait_impls; -mod map; -#[cfg(feature = "rustc-internal-api")] -mod rustc_entry; -mod scopeguard; -mod set; - -pub mod hash_map { - //! A hash map implemented with quadratic probing and SIMD lookup. - pub use crate::map::*; - - #[cfg(feature = "rustc-internal-api")] - pub use crate::rustc_entry::*; - - #[cfg(feature = "rayon")] - /// [rayon]-based parallel iterator types for hash maps. - /// You will rarely need to interact with it directly unless you have need - /// to name one of the iterator types. - /// - /// [rayon]: https://docs.rs/rayon/1.0/rayon - pub mod rayon { - pub use crate::external_trait_impls::rayon::map::*; - } -} -pub mod hash_set { - //! A hash set implemented as a `HashMap` where the value is `()`. - pub use crate::set::*; - - #[cfg(feature = "rayon")] - /// [rayon]-based parallel iterator types for hash sets. - /// You will rarely need to interact with it directly unless you have need - /// to name one of the iterator types. - /// - /// [rayon]: https://docs.rs/rayon/1.0/rayon - pub mod rayon { - pub use crate::external_trait_impls::rayon::set::*; - } -} - -pub use crate::map::HashMap; -pub use crate::set::HashSet; - -/// Key equivalence trait. -/// -/// This trait defines the function used to compare the input value with the -/// map keys (or set values) during a lookup operation such as [`HashMap::get`] -/// or [`HashSet::contains`]. -/// It is provided with a blanket implementation based on the -/// [`Borrow`](core::borrow::Borrow) trait. -/// -/// # Correctness -/// -/// Equivalent values must hash to the same value. -pub trait Equivalent { - /// Checks if this value is equivalent to the given key. - /// - /// Returns `true` if both values are equivalent, and `false` otherwise. - /// - /// # Correctness - /// - /// When this function returns `true`, both `self` and `key` must hash to - /// the same value. - fn equivalent(&self, key: &K) -> bool; -} - -impl Equivalent for Q -where - Q: Eq, - K: core::borrow::Borrow, -{ - fn equivalent(&self, key: &K) -> bool { - self == key.borrow() - } -} - -/// The error type for `try_reserve` methods. -#[derive(Clone, PartialEq, Eq, Debug)] -pub enum TryReserveError { - /// Error due to the computed capacity exceeding the collection's maximum - /// (usually `isize::MAX` bytes). - CapacityOverflow, - - /// The memory allocator returned an error - AllocError { - /// The layout of the allocation request that failed. - layout: alloc::alloc::Layout, - }, -} - -/// Wrapper around `Bump` which allows it to be used as an allocator for -/// `HashMap`, `HashSet` and `RawTable`. -/// -/// `Bump` can be used directly without this wrapper on nightly if you enable -/// the `allocator-api` feature of the `bumpalo` crate. -#[cfg(feature = "bumpalo")] -#[derive(Clone, Copy, Debug)] -pub struct BumpWrapper<'a>(pub &'a bumpalo::Bump); - -#[cfg(feature = "bumpalo")] -#[test] -fn test_bumpalo() { - use bumpalo::Bump; - let bump = Bump::new(); - let mut map = HashMap::new_in(BumpWrapper(&bump)); - map.insert(0, 1); -} diff -Nru temporalio-1.3.0/vendor/hashbrown-0.13.2/src/macros.rs temporalio-1.3.0/vendor/hashbrown-0.13.2/src/macros.rs --- temporalio-1.3.0/vendor/hashbrown-0.13.2/src/macros.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/hashbrown-0.13.2/src/macros.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,70 +0,0 @@ -// See the cfg-if crate. -#[allow(unused_macro_rules)] -macro_rules! cfg_if { - // match if/else chains with a final `else` - ($( - if #[cfg($($meta:meta),*)] { $($it:item)* } - ) else * else { - $($it2:item)* - }) => { - cfg_if! { - @__items - () ; - $( ( ($($meta),*) ($($it)*) ), )* - ( () ($($it2)*) ), - } - }; - - // match if/else chains lacking a final `else` - ( - if #[cfg($($i_met:meta),*)] { $($i_it:item)* } - $( - else if #[cfg($($e_met:meta),*)] { $($e_it:item)* } - )* - ) => { - cfg_if! { - @__items - () ; - ( ($($i_met),*) ($($i_it)*) ), - $( ( ($($e_met),*) ($($e_it)*) ), )* - ( () () ), - } - }; - - // Internal and recursive macro to emit all the items - // - // Collects all the negated cfgs in a list at the beginning and after the - // semicolon is all the remaining items - (@__items ($($not:meta,)*) ; ) => {}; - (@__items ($($not:meta,)*) ; ( ($($m:meta),*) ($($it:item)*) ), $($rest:tt)*) => { - // Emit all items within one block, applying an approprate #[cfg]. The - // #[cfg] will require all `$m` matchers specified and must also negate - // all previous matchers. - cfg_if! { @__apply cfg(all($($m,)* not(any($($not),*)))), $($it)* } - - // Recurse to emit all other items in `$rest`, and when we do so add all - // our `$m` matchers to the list of `$not` matchers as future emissions - // will have to negate everything we just matched as well. - cfg_if! { @__items ($($not,)* $($m,)*) ; $($rest)* } - }; - - // Internal macro to Apply a cfg attribute to a list of items - (@__apply $m:meta, $($it:item)*) => { - $(#[$m] $it)* - }; -} - -// Helper macro for specialization. This also helps avoid parse errors if the -// default fn syntax for specialization changes in the future. -#[cfg(feature = "nightly")] -macro_rules! default_fn { - (#[$($a:tt)*] $($tt:tt)*) => { - #[$($a)*] default $($tt)* - } -} -#[cfg(not(feature = "nightly"))] -macro_rules! default_fn { - ($($tt:tt)*) => { - $($tt)* - } -} diff -Nru temporalio-1.3.0/vendor/hashbrown-0.13.2/src/map.rs temporalio-1.3.0/vendor/hashbrown-0.13.2/src/map.rs --- temporalio-1.3.0/vendor/hashbrown-0.13.2/src/map.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/hashbrown-0.13.2/src/map.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,8512 +0,0 @@ -use crate::raw::{Allocator, Bucket, Global, RawDrain, RawIntoIter, RawIter, RawTable}; -use crate::{Equivalent, TryReserveError}; -use core::borrow::Borrow; -use core::fmt::{self, Debug}; -use core::hash::{BuildHasher, Hash}; -use core::iter::{FromIterator, FusedIterator}; -use core::marker::PhantomData; -use core::mem; -use core::ops::Index; - -/// Default hasher for `HashMap`. -#[cfg(feature = "ahash")] -pub type DefaultHashBuilder = core::hash::BuildHasherDefault; - -/// Dummy default hasher for `HashMap`. -#[cfg(not(feature = "ahash"))] -pub enum DefaultHashBuilder {} - -/// A hash map implemented with quadratic probing and SIMD lookup. -/// -/// The default hashing algorithm is currently [`AHash`], though this is -/// subject to change at any point in the future. This hash function is very -/// fast for all types of keys, but this algorithm will typically *not* protect -/// against attacks such as HashDoS. -/// -/// The hashing algorithm can be replaced on a per-`HashMap` basis using the -/// [`default`], [`with_hasher`], and [`with_capacity_and_hasher`] methods. Many -/// alternative algorithms are available on crates.io, such as the [`fnv`] crate. -/// -/// It is required that the keys implement the [`Eq`] and [`Hash`] traits, although -/// this can frequently be achieved by using `#[derive(PartialEq, Eq, Hash)]`. -/// If you implement these yourself, it is important that the following -/// property holds: -/// -/// ```text -/// k1 == k2 -> hash(k1) == hash(k2) -/// ``` -/// -/// In other words, if two keys are equal, their hashes must be equal. -/// -/// It is a logic error for a key to be modified in such a way that the key's -/// hash, as determined by the [`Hash`] trait, or its equality, as determined by -/// the [`Eq`] trait, changes while it is in the map. This is normally only -/// possible through [`Cell`], [`RefCell`], global state, I/O, or unsafe code. -/// -/// It is also a logic error for the [`Hash`] implementation of a key to panic. -/// This is generally only possible if the trait is implemented manually. If a -/// panic does occur then the contents of the `HashMap` may become corrupted and -/// some items may be dropped from the table. -/// -/// # Examples -/// -/// ``` -/// use hashbrown::HashMap; -/// -/// // Type inference lets us omit an explicit type signature (which -/// // would be `HashMap` in this example). -/// let mut book_reviews = HashMap::new(); -/// -/// // Review some books. -/// book_reviews.insert( -/// "Adventures of Huckleberry Finn".to_string(), -/// "My favorite book.".to_string(), -/// ); -/// book_reviews.insert( -/// "Grimms' Fairy Tales".to_string(), -/// "Masterpiece.".to_string(), -/// ); -/// book_reviews.insert( -/// "Pride and Prejudice".to_string(), -/// "Very enjoyable.".to_string(), -/// ); -/// book_reviews.insert( -/// "The Adventures of Sherlock Holmes".to_string(), -/// "Eye lyked it alot.".to_string(), -/// ); -/// -/// // Check for a specific one. -/// // When collections store owned values (String), they can still be -/// // queried using references (&str). -/// if !book_reviews.contains_key("Les Misérables") { -/// println!("We've got {} reviews, but Les Misérables ain't one.", -/// book_reviews.len()); -/// } -/// -/// // oops, this review has a lot of spelling mistakes, let's delete it. -/// book_reviews.remove("The Adventures of Sherlock Holmes"); -/// -/// // Look up the values associated with some keys. -/// let to_find = ["Pride and Prejudice", "Alice's Adventure in Wonderland"]; -/// for &book in &to_find { -/// match book_reviews.get(book) { -/// Some(review) => println!("{}: {}", book, review), -/// None => println!("{} is unreviewed.", book) -/// } -/// } -/// -/// // Look up the value for a key (will panic if the key is not found). -/// println!("Review for Jane: {}", book_reviews["Pride and Prejudice"]); -/// -/// // Iterate over everything. -/// for (book, review) in &book_reviews { -/// println!("{}: \"{}\"", book, review); -/// } -/// ``` -/// -/// `HashMap` also implements an [`Entry API`](#method.entry), which allows -/// for more complex methods of getting, setting, updating and removing keys and -/// their values: -/// -/// ``` -/// use hashbrown::HashMap; -/// -/// // type inference lets us omit an explicit type signature (which -/// // would be `HashMap<&str, u8>` in this example). -/// let mut player_stats = HashMap::new(); -/// -/// fn random_stat_buff() -> u8 { -/// // could actually return some random value here - let's just return -/// // some fixed value for now -/// 42 -/// } -/// -/// // insert a key only if it doesn't already exist -/// player_stats.entry("health").or_insert(100); -/// -/// // insert a key using a function that provides a new value only if it -/// // doesn't already exist -/// player_stats.entry("defence").or_insert_with(random_stat_buff); -/// -/// // update a key, guarding against the key possibly not being set -/// let stat = player_stats.entry("attack").or_insert(100); -/// *stat += random_stat_buff(); -/// ``` -/// -/// The easiest way to use `HashMap` with a custom key type is to derive [`Eq`] and [`Hash`]. -/// We must also derive [`PartialEq`]. -/// -/// [`Eq`]: https://doc.rust-lang.org/std/cmp/trait.Eq.html -/// [`Hash`]: https://doc.rust-lang.org/std/hash/trait.Hash.html -/// [`PartialEq`]: https://doc.rust-lang.org/std/cmp/trait.PartialEq.html -/// [`RefCell`]: https://doc.rust-lang.org/std/cell/struct.RefCell.html -/// [`Cell`]: https://doc.rust-lang.org/std/cell/struct.Cell.html -/// [`default`]: #method.default -/// [`with_hasher`]: #method.with_hasher -/// [`with_capacity_and_hasher`]: #method.with_capacity_and_hasher -/// [`fnv`]: https://crates.io/crates/fnv -/// [`AHash`]: https://crates.io/crates/ahash -/// -/// ``` -/// use hashbrown::HashMap; -/// -/// #[derive(Hash, Eq, PartialEq, Debug)] -/// struct Viking { -/// name: String, -/// country: String, -/// } -/// -/// impl Viking { -/// /// Creates a new Viking. -/// fn new(name: &str, country: &str) -> Viking { -/// Viking { name: name.to_string(), country: country.to_string() } -/// } -/// } -/// -/// // Use a HashMap to store the vikings' health points. -/// let mut vikings = HashMap::new(); -/// -/// vikings.insert(Viking::new("Einar", "Norway"), 25); -/// vikings.insert(Viking::new("Olaf", "Denmark"), 24); -/// vikings.insert(Viking::new("Harald", "Iceland"), 12); -/// -/// // Use derived implementation to print the status of the vikings. -/// for (viking, health) in &vikings { -/// println!("{:?} has {} hp", viking, health); -/// } -/// ``` -/// -/// A `HashMap` with fixed list of elements can be initialized from an array: -/// -/// ``` -/// use hashbrown::HashMap; -/// -/// let timber_resources: HashMap<&str, i32> = [("Norway", 100), ("Denmark", 50), ("Iceland", 10)] -/// .iter().cloned().collect(); -/// // use the values stored in map -/// ``` -pub struct HashMap { - pub(crate) hash_builder: S, - pub(crate) table: RawTable<(K, V), A>, -} - -impl Clone for HashMap { - fn clone(&self) -> Self { - HashMap { - hash_builder: self.hash_builder.clone(), - table: self.table.clone(), - } - } - - fn clone_from(&mut self, source: &Self) { - self.table.clone_from(&source.table); - - // Update hash_builder only if we successfully cloned all elements. - self.hash_builder.clone_from(&source.hash_builder); - } -} - -/// Ensures that a single closure type across uses of this which, in turn prevents multiple -/// instances of any functions like RawTable::reserve from being generated -#[cfg_attr(feature = "inline-more", inline)] -pub(crate) fn make_hasher(hash_builder: &S) -> impl Fn(&(Q, V)) -> u64 + '_ -where - Q: Hash, - S: BuildHasher, -{ - move |val| make_hash::(hash_builder, &val.0) -} - -/// Ensures that a single closure type across uses of this which, in turn prevents multiple -/// instances of any functions like RawTable::reserve from being generated -#[cfg_attr(feature = "inline-more", inline)] -fn equivalent_key(k: &Q) -> impl Fn(&(K, V)) -> bool + '_ -where - Q: ?Sized + Equivalent, -{ - move |x| k.equivalent(&x.0) -} - -/// Ensures that a single closure type across uses of this which, in turn prevents multiple -/// instances of any functions like RawTable::reserve from being generated -#[cfg_attr(feature = "inline-more", inline)] -fn equivalent(k: &Q) -> impl Fn(&K) -> bool + '_ -where - Q: ?Sized + Equivalent, -{ - move |x| k.equivalent(x) -} - -#[cfg(not(feature = "nightly"))] -#[cfg_attr(feature = "inline-more", inline)] -pub(crate) fn make_hash(hash_builder: &S, val: &Q) -> u64 -where - Q: Hash + ?Sized, - S: BuildHasher, -{ - use core::hash::Hasher; - let mut state = hash_builder.build_hasher(); - val.hash(&mut state); - state.finish() -} - -#[cfg(feature = "nightly")] -#[cfg_attr(feature = "inline-more", inline)] -pub(crate) fn make_hash(hash_builder: &S, val: &Q) -> u64 -where - Q: Hash + ?Sized, - S: BuildHasher, -{ - hash_builder.hash_one(val) -} - -#[cfg(not(feature = "nightly"))] -#[cfg_attr(feature = "inline-more", inline)] -pub(crate) fn make_insert_hash(hash_builder: &S, val: &K) -> u64 -where - K: Hash, - S: BuildHasher, -{ - use core::hash::Hasher; - let mut state = hash_builder.build_hasher(); - val.hash(&mut state); - state.finish() -} - -#[cfg(feature = "nightly")] -#[cfg_attr(feature = "inline-more", inline)] -pub(crate) fn make_insert_hash(hash_builder: &S, val: &K) -> u64 -where - K: Hash, - S: BuildHasher, -{ - hash_builder.hash_one(val) -} - -#[cfg(feature = "ahash")] -impl HashMap { - /// Creates an empty `HashMap`. - /// - /// The hash map is initially created with a capacity of 0, so it will not allocate until it - /// is first inserted into. - /// - /// # HashDoS resistance - /// - /// The `hash_builder` normally use a fixed key by default and that does - /// not allow the `HashMap` to be protected against attacks such as [`HashDoS`]. - /// Users who require HashDoS resistance should explicitly use - /// [`ahash::RandomState`] or [`std::collections::hash_map::RandomState`] - /// as the hasher when creating a [`HashMap`], for example with - /// [`with_hasher`](HashMap::with_hasher) method. - /// - /// [`HashDoS`]: https://en.wikipedia.org/wiki/Collision_attack - /// [`std::collections::hash_map::RandomState`]: https://doc.rust-lang.org/std/collections/hash_map/struct.RandomState.html - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// let mut map: HashMap<&str, i32> = HashMap::new(); - /// assert_eq!(map.len(), 0); - /// assert_eq!(map.capacity(), 0); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn new() -> Self { - Self::default() - } - - /// Creates an empty `HashMap` with the specified capacity. - /// - /// The hash map will be able to hold at least `capacity` elements without - /// reallocating. If `capacity` is 0, the hash map will not allocate. - /// - /// # HashDoS resistance - /// - /// The `hash_builder` normally use a fixed key by default and that does - /// not allow the `HashMap` to be protected against attacks such as [`HashDoS`]. - /// Users who require HashDoS resistance should explicitly use - /// [`ahash::RandomState`] or [`std::collections::hash_map::RandomState`] - /// as the hasher when creating a [`HashMap`], for example with - /// [`with_capacity_and_hasher`](HashMap::with_capacity_and_hasher) method. - /// - /// [`HashDoS`]: https://en.wikipedia.org/wiki/Collision_attack - /// [`std::collections::hash_map::RandomState`]: https://doc.rust-lang.org/std/collections/hash_map/struct.RandomState.html - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// let mut map: HashMap<&str, i32> = HashMap::with_capacity(10); - /// assert_eq!(map.len(), 0); - /// assert!(map.capacity() >= 10); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn with_capacity(capacity: usize) -> Self { - Self::with_capacity_and_hasher(capacity, DefaultHashBuilder::default()) - } -} - -#[cfg(feature = "ahash")] -impl HashMap { - /// Creates an empty `HashMap` using the given allocator. - /// - /// The hash map is initially created with a capacity of 0, so it will not allocate until it - /// is first inserted into. - /// - /// # HashDoS resistance - /// - /// The `hash_builder` normally use a fixed key by default and that does - /// not allow the `HashMap` to be protected against attacks such as [`HashDoS`]. - /// Users who require HashDoS resistance should explicitly use - /// [`ahash::RandomState`] or [`std::collections::hash_map::RandomState`] - /// as the hasher when creating a [`HashMap`], for example with - /// [`with_hasher_in`](HashMap::with_hasher_in) method. - /// - /// [`HashDoS`]: https://en.wikipedia.org/wiki/Collision_attack - /// [`std::collections::hash_map::RandomState`]: https://doc.rust-lang.org/std/collections/hash_map/struct.RandomState.html - /// - /// # Examples - /// - /// ``` - /// # #[cfg(feature = "bumpalo")] - /// # fn test() { - /// use hashbrown::{HashMap, BumpWrapper}; - /// use bumpalo::Bump; - /// - /// let bump = Bump::new(); - /// let mut map = HashMap::new_in(BumpWrapper(&bump)); - /// - /// // The created HashMap holds none elements - /// assert_eq!(map.len(), 0); - /// - /// // The created HashMap also doesn't allocate memory - /// assert_eq!(map.capacity(), 0); - /// - /// // Now we insert element inside created HashMap - /// map.insert("One", 1); - /// // We can see that the HashMap holds 1 element - /// assert_eq!(map.len(), 1); - /// // And it also allocates some capacity - /// assert!(map.capacity() > 1); - /// # } - /// # fn main() { - /// # #[cfg(feature = "bumpalo")] - /// # test() - /// # } - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn new_in(alloc: A) -> Self { - Self::with_hasher_in(DefaultHashBuilder::default(), alloc) - } - - /// Creates an empty `HashMap` with the specified capacity using the given allocator. - /// - /// The hash map will be able to hold at least `capacity` elements without - /// reallocating. If `capacity` is 0, the hash map will not allocate. - /// - /// # HashDoS resistance - /// - /// The `hash_builder` normally use a fixed key by default and that does - /// not allow the `HashMap` to be protected against attacks such as [`HashDoS`]. - /// Users who require HashDoS resistance should explicitly use - /// [`ahash::RandomState`] or [`std::collections::hash_map::RandomState`] - /// as the hasher when creating a [`HashMap`], for example with - /// [`with_capacity_and_hasher_in`](HashMap::with_capacity_and_hasher_in) method. - /// - /// [`HashDoS`]: https://en.wikipedia.org/wiki/Collision_attack - /// [`std::collections::hash_map::RandomState`]: https://doc.rust-lang.org/std/collections/hash_map/struct.RandomState.html - /// - /// # Examples - /// - /// ``` - /// # #[cfg(feature = "bumpalo")] - /// # fn test() { - /// use hashbrown::{HashMap, BumpWrapper}; - /// use bumpalo::Bump; - /// - /// let bump = Bump::new(); - /// let mut map = HashMap::with_capacity_in(5, BumpWrapper(&bump)); - /// - /// // The created HashMap holds none elements - /// assert_eq!(map.len(), 0); - /// // But it can hold at least 5 elements without reallocating - /// let empty_map_capacity = map.capacity(); - /// assert!(empty_map_capacity >= 5); - /// - /// // Now we insert some 5 elements inside created HashMap - /// map.insert("One", 1); - /// map.insert("Two", 2); - /// map.insert("Three", 3); - /// map.insert("Four", 4); - /// map.insert("Five", 5); - /// - /// // We can see that the HashMap holds 5 elements - /// assert_eq!(map.len(), 5); - /// // But its capacity isn't changed - /// assert_eq!(map.capacity(), empty_map_capacity) - /// # } - /// # fn main() { - /// # #[cfg(feature = "bumpalo")] - /// # test() - /// # } - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn with_capacity_in(capacity: usize, alloc: A) -> Self { - Self::with_capacity_and_hasher_in(capacity, DefaultHashBuilder::default(), alloc) - } -} - -impl HashMap { - /// Creates an empty `HashMap` which will use the given hash builder to hash - /// keys. - /// - /// The hash map is initially created with a capacity of 0, so it will not - /// allocate until it is first inserted into. - /// - /// # HashDoS resistance - /// - /// The `hash_builder` normally use a fixed key by default and that does - /// not allow the `HashMap` to be protected against attacks such as [`HashDoS`]. - /// Users who require HashDoS resistance should explicitly use - /// [`ahash::RandomState`] or [`std::collections::hash_map::RandomState`] - /// as the hasher when creating a [`HashMap`]. - /// - /// The `hash_builder` passed should implement the [`BuildHasher`] trait for - /// the HashMap to be useful, see its documentation for details. - /// - /// [`HashDoS`]: https://en.wikipedia.org/wiki/Collision_attack - /// [`std::collections::hash_map::RandomState`]: https://doc.rust-lang.org/std/collections/hash_map/struct.RandomState.html - /// [`BuildHasher`]: https://doc.rust-lang.org/std/hash/trait.BuildHasher.html - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// use hashbrown::hash_map::DefaultHashBuilder; - /// - /// let s = DefaultHashBuilder::default(); - /// let mut map = HashMap::with_hasher(s); - /// assert_eq!(map.len(), 0); - /// assert_eq!(map.capacity(), 0); - /// - /// map.insert(1, 2); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub const fn with_hasher(hash_builder: S) -> Self { - Self { - hash_builder, - table: RawTable::new(), - } - } - - /// Creates an empty `HashMap` with the specified capacity, using `hash_builder` - /// to hash the keys. - /// - /// The hash map will be able to hold at least `capacity` elements without - /// reallocating. If `capacity` is 0, the hash map will not allocate. - /// - /// # HashDoS resistance - /// - /// The `hash_builder` normally use a fixed key by default and that does - /// not allow the `HashMap` to be protected against attacks such as [`HashDoS`]. - /// Users who require HashDoS resistance should explicitly use - /// [`ahash::RandomState`] or [`std::collections::hash_map::RandomState`] - /// as the hasher when creating a [`HashMap`]. - /// - /// The `hash_builder` passed should implement the [`BuildHasher`] trait for - /// the HashMap to be useful, see its documentation for details. - /// - /// [`HashDoS`]: https://en.wikipedia.org/wiki/Collision_attack - /// [`std::collections::hash_map::RandomState`]: https://doc.rust-lang.org/std/collections/hash_map/struct.RandomState.html - /// [`BuildHasher`]: https://doc.rust-lang.org/std/hash/trait.BuildHasher.html - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// use hashbrown::hash_map::DefaultHashBuilder; - /// - /// let s = DefaultHashBuilder::default(); - /// let mut map = HashMap::with_capacity_and_hasher(10, s); - /// assert_eq!(map.len(), 0); - /// assert!(map.capacity() >= 10); - /// - /// map.insert(1, 2); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn with_capacity_and_hasher(capacity: usize, hash_builder: S) -> Self { - Self { - hash_builder, - table: RawTable::with_capacity(capacity), - } - } -} - -impl HashMap { - /// Returns a reference to the underlying allocator. - #[inline] - pub fn allocator(&self) -> &A { - self.table.allocator() - } - - /// Creates an empty `HashMap` which will use the given hash builder to hash - /// keys. It will be allocated with the given allocator. - /// - /// The hash map is initially created with a capacity of 0, so it will not allocate until it - /// is first inserted into. - /// - /// # HashDoS resistance - /// - /// The `hash_builder` normally use a fixed key by default and that does - /// not allow the `HashMap` to be protected against attacks such as [`HashDoS`]. - /// Users who require HashDoS resistance should explicitly use - /// [`ahash::RandomState`] or [`std::collections::hash_map::RandomState`] - /// as the hasher when creating a [`HashMap`]. - /// - /// [`HashDoS`]: https://en.wikipedia.org/wiki/Collision_attack - /// [`std::collections::hash_map::RandomState`]: https://doc.rust-lang.org/std/collections/hash_map/struct.RandomState.html - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// use hashbrown::hash_map::DefaultHashBuilder; - /// - /// let s = DefaultHashBuilder::default(); - /// let mut map = HashMap::with_hasher(s); - /// map.insert(1, 2); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub const fn with_hasher_in(hash_builder: S, alloc: A) -> Self { - Self { - hash_builder, - table: RawTable::new_in(alloc), - } - } - - /// Creates an empty `HashMap` with the specified capacity, using `hash_builder` - /// to hash the keys. It will be allocated with the given allocator. - /// - /// The hash map will be able to hold at least `capacity` elements without - /// reallocating. If `capacity` is 0, the hash map will not allocate. - /// - /// # HashDoS resistance - /// - /// The `hash_builder` normally use a fixed key by default and that does - /// not allow the `HashMap` to be protected against attacks such as [`HashDoS`]. - /// Users who require HashDoS resistance should explicitly use - /// [`ahash::RandomState`] or [`std::collections::hash_map::RandomState`] - /// as the hasher when creating a [`HashMap`]. - /// - /// [`HashDoS`]: https://en.wikipedia.org/wiki/Collision_attack - /// [`std::collections::hash_map::RandomState`]: https://doc.rust-lang.org/std/collections/hash_map/struct.RandomState.html - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// use hashbrown::hash_map::DefaultHashBuilder; - /// - /// let s = DefaultHashBuilder::default(); - /// let mut map = HashMap::with_capacity_and_hasher(10, s); - /// map.insert(1, 2); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn with_capacity_and_hasher_in(capacity: usize, hash_builder: S, alloc: A) -> Self { - Self { - hash_builder, - table: RawTable::with_capacity_in(capacity, alloc), - } - } - - /// Returns a reference to the map's [`BuildHasher`]. - /// - /// [`BuildHasher`]: https://doc.rust-lang.org/std/hash/trait.BuildHasher.html - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// use hashbrown::hash_map::DefaultHashBuilder; - /// - /// let hasher = DefaultHashBuilder::default(); - /// let map: HashMap = HashMap::with_hasher(hasher); - /// let hasher: &DefaultHashBuilder = map.hasher(); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn hasher(&self) -> &S { - &self.hash_builder - } - - /// Returns the number of elements the map can hold without reallocating. - /// - /// This number is a lower bound; the `HashMap` might be able to hold - /// more, but is guaranteed to be able to hold at least this many. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// let map: HashMap = HashMap::with_capacity(100); - /// assert_eq!(map.len(), 0); - /// assert!(map.capacity() >= 100); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn capacity(&self) -> usize { - self.table.capacity() - } - - /// An iterator visiting all keys in arbitrary order. - /// The iterator element type is `&'a K`. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// - /// let mut map = HashMap::new(); - /// map.insert("a", 1); - /// map.insert("b", 2); - /// map.insert("c", 3); - /// assert_eq!(map.len(), 3); - /// let mut vec: Vec<&str> = Vec::new(); - /// - /// for key in map.keys() { - /// println!("{}", key); - /// vec.push(*key); - /// } - /// - /// // The `Keys` iterator produces keys in arbitrary order, so the - /// // keys must be sorted to test them against a sorted array. - /// vec.sort_unstable(); - /// assert_eq!(vec, ["a", "b", "c"]); - /// - /// assert_eq!(map.len(), 3); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn keys(&self) -> Keys<'_, K, V> { - Keys { inner: self.iter() } - } - - /// An iterator visiting all values in arbitrary order. - /// The iterator element type is `&'a V`. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// - /// let mut map = HashMap::new(); - /// map.insert("a", 1); - /// map.insert("b", 2); - /// map.insert("c", 3); - /// assert_eq!(map.len(), 3); - /// let mut vec: Vec = Vec::new(); - /// - /// for val in map.values() { - /// println!("{}", val); - /// vec.push(*val); - /// } - /// - /// // The `Values` iterator produces values in arbitrary order, so the - /// // values must be sorted to test them against a sorted array. - /// vec.sort_unstable(); - /// assert_eq!(vec, [1, 2, 3]); - /// - /// assert_eq!(map.len(), 3); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn values(&self) -> Values<'_, K, V> { - Values { inner: self.iter() } - } - - /// An iterator visiting all values mutably in arbitrary order. - /// The iterator element type is `&'a mut V`. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// - /// let mut map = HashMap::new(); - /// - /// map.insert("a", 1); - /// map.insert("b", 2); - /// map.insert("c", 3); - /// - /// for val in map.values_mut() { - /// *val = *val + 10; - /// } - /// - /// assert_eq!(map.len(), 3); - /// let mut vec: Vec = Vec::new(); - /// - /// for val in map.values() { - /// println!("{}", val); - /// vec.push(*val); - /// } - /// - /// // The `Values` iterator produces values in arbitrary order, so the - /// // values must be sorted to test them against a sorted array. - /// vec.sort_unstable(); - /// assert_eq!(vec, [11, 12, 13]); - /// - /// assert_eq!(map.len(), 3); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn values_mut(&mut self) -> ValuesMut<'_, K, V> { - ValuesMut { - inner: self.iter_mut(), - } - } - - /// An iterator visiting all key-value pairs in arbitrary order. - /// The iterator element type is `(&'a K, &'a V)`. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// - /// let mut map = HashMap::new(); - /// map.insert("a", 1); - /// map.insert("b", 2); - /// map.insert("c", 3); - /// assert_eq!(map.len(), 3); - /// let mut vec: Vec<(&str, i32)> = Vec::new(); - /// - /// for (key, val) in map.iter() { - /// println!("key: {} val: {}", key, val); - /// vec.push((*key, *val)); - /// } - /// - /// // The `Iter` iterator produces items in arbitrary order, so the - /// // items must be sorted to test them against a sorted array. - /// vec.sort_unstable(); - /// assert_eq!(vec, [("a", 1), ("b", 2), ("c", 3)]); - /// - /// assert_eq!(map.len(), 3); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn iter(&self) -> Iter<'_, K, V> { - // Here we tie the lifetime of self to the iter. - unsafe { - Iter { - inner: self.table.iter(), - marker: PhantomData, - } - } - } - - /// An iterator visiting all key-value pairs in arbitrary order, - /// with mutable references to the values. - /// The iterator element type is `(&'a K, &'a mut V)`. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// - /// let mut map = HashMap::new(); - /// map.insert("a", 1); - /// map.insert("b", 2); - /// map.insert("c", 3); - /// - /// // Update all values - /// for (_, val) in map.iter_mut() { - /// *val *= 2; - /// } - /// - /// assert_eq!(map.len(), 3); - /// let mut vec: Vec<(&str, i32)> = Vec::new(); - /// - /// for (key, val) in &map { - /// println!("key: {} val: {}", key, val); - /// vec.push((*key, *val)); - /// } - /// - /// // The `Iter` iterator produces items in arbitrary order, so the - /// // items must be sorted to test them against a sorted array. - /// vec.sort_unstable(); - /// assert_eq!(vec, [("a", 2), ("b", 4), ("c", 6)]); - /// - /// assert_eq!(map.len(), 3); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn iter_mut(&mut self) -> IterMut<'_, K, V> { - // Here we tie the lifetime of self to the iter. - unsafe { - IterMut { - inner: self.table.iter(), - marker: PhantomData, - } - } - } - - #[cfg(test)] - #[cfg_attr(feature = "inline-more", inline)] - fn raw_capacity(&self) -> usize { - self.table.buckets() - } - - /// Returns the number of elements in the map. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// - /// let mut a = HashMap::new(); - /// assert_eq!(a.len(), 0); - /// a.insert(1, "a"); - /// assert_eq!(a.len(), 1); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn len(&self) -> usize { - self.table.len() - } - - /// Returns `true` if the map contains no elements. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// - /// let mut a = HashMap::new(); - /// assert!(a.is_empty()); - /// a.insert(1, "a"); - /// assert!(!a.is_empty()); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn is_empty(&self) -> bool { - self.len() == 0 - } - - /// Clears the map, returning all key-value pairs as an iterator. Keeps the - /// allocated memory for reuse. - /// - /// If the returned iterator is dropped before being fully consumed, it - /// drops the remaining key-value pairs. The returned iterator keeps a - /// mutable borrow on the vector to optimize its implementation. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// - /// let mut a = HashMap::new(); - /// a.insert(1, "a"); - /// a.insert(2, "b"); - /// let capacity_before_drain = a.capacity(); - /// - /// for (k, v) in a.drain().take(1) { - /// assert!(k == 1 || k == 2); - /// assert!(v == "a" || v == "b"); - /// } - /// - /// // As we can see, the map is empty and contains no element. - /// assert!(a.is_empty() && a.len() == 0); - /// // But map capacity is equal to old one. - /// assert_eq!(a.capacity(), capacity_before_drain); - /// - /// let mut a = HashMap::new(); - /// a.insert(1, "a"); - /// a.insert(2, "b"); - /// - /// { // Iterator is dropped without being consumed. - /// let d = a.drain(); - /// } - /// - /// // But the map is empty even if we do not use Drain iterator. - /// assert!(a.is_empty()); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn drain(&mut self) -> Drain<'_, K, V, A> { - Drain { - inner: self.table.drain(), - } - } - - /// Retains only the elements specified by the predicate. Keeps the - /// allocated memory for reuse. - /// - /// In other words, remove all pairs `(k, v)` such that `f(&k, &mut v)` returns `false`. - /// The elements are visited in unsorted (and unspecified) order. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// - /// let mut map: HashMap = (0..8).map(|x|(x, x*10)).collect(); - /// assert_eq!(map.len(), 8); - /// - /// map.retain(|&k, _| k % 2 == 0); - /// - /// // We can see, that the number of elements inside map is changed. - /// assert_eq!(map.len(), 4); - /// - /// let mut vec: Vec<(i32, i32)> = map.iter().map(|(&k, &v)| (k, v)).collect(); - /// vec.sort_unstable(); - /// assert_eq!(vec, [(0, 0), (2, 20), (4, 40), (6, 60)]); - /// ``` - pub fn retain(&mut self, mut f: F) - where - F: FnMut(&K, &mut V) -> bool, - { - // Here we only use `iter` as a temporary, preventing use-after-free - unsafe { - for item in self.table.iter() { - let &mut (ref key, ref mut value) = item.as_mut(); - if !f(key, value) { - self.table.erase(item); - } - } - } - } - - /// Drains elements which are true under the given predicate, - /// and returns an iterator over the removed items. - /// - /// In other words, move all pairs `(k, v)` such that `f(&k, &mut v)` returns `true` out - /// into another iterator. - /// - /// Note that `drain_filter` lets you mutate every value in the filter closure, regardless of - /// whether you choose to keep or remove it. - /// - /// When the returned DrainedFilter is dropped, any remaining elements that satisfy - /// the predicate are dropped from the table. - /// - /// It is unspecified how many more elements will be subjected to the closure - /// if a panic occurs in the closure, or a panic occurs while dropping an element, - /// or if the `DrainFilter` value is leaked. - /// - /// Keeps the allocated memory for reuse. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// - /// let mut map: HashMap = (0..8).map(|x| (x, x)).collect(); - /// - /// let drained: HashMap = map.drain_filter(|k, _v| k % 2 == 0).collect(); - /// - /// let mut evens = drained.keys().cloned().collect::>(); - /// let mut odds = map.keys().cloned().collect::>(); - /// evens.sort(); - /// odds.sort(); - /// - /// assert_eq!(evens, vec![0, 2, 4, 6]); - /// assert_eq!(odds, vec![1, 3, 5, 7]); - /// - /// let mut map: HashMap = (0..8).map(|x| (x, x)).collect(); - /// - /// { // Iterator is dropped without being consumed. - /// let d = map.drain_filter(|k, _v| k % 2 != 0); - /// } - /// - /// // But the map lens have been reduced by half - /// // even if we do not use DrainFilter iterator. - /// assert_eq!(map.len(), 4); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn drain_filter(&mut self, f: F) -> DrainFilter<'_, K, V, F, A> - where - F: FnMut(&K, &mut V) -> bool, - { - DrainFilter { - f, - inner: DrainFilterInner { - iter: unsafe { self.table.iter() }, - table: &mut self.table, - }, - } - } - - /// Clears the map, removing all key-value pairs. Keeps the allocated memory - /// for reuse. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// - /// let mut a = HashMap::new(); - /// a.insert(1, "a"); - /// let capacity_before_clear = a.capacity(); - /// - /// a.clear(); - /// - /// // Map is empty. - /// assert!(a.is_empty()); - /// // But map capacity is equal to old one. - /// assert_eq!(a.capacity(), capacity_before_clear); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn clear(&mut self) { - self.table.clear(); - } - - /// Creates a consuming iterator visiting all the keys in arbitrary order. - /// The map cannot be used after calling this. - /// The iterator element type is `K`. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// - /// let mut map = HashMap::new(); - /// map.insert("a", 1); - /// map.insert("b", 2); - /// map.insert("c", 3); - /// - /// let mut vec: Vec<&str> = map.into_keys().collect(); - /// - /// // The `IntoKeys` iterator produces keys in arbitrary order, so the - /// // keys must be sorted to test them against a sorted array. - /// vec.sort_unstable(); - /// assert_eq!(vec, ["a", "b", "c"]); - /// ``` - #[inline] - pub fn into_keys(self) -> IntoKeys { - IntoKeys { - inner: self.into_iter(), - } - } - - /// Creates a consuming iterator visiting all the values in arbitrary order. - /// The map cannot be used after calling this. - /// The iterator element type is `V`. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// - /// let mut map = HashMap::new(); - /// map.insert("a", 1); - /// map.insert("b", 2); - /// map.insert("c", 3); - /// - /// let mut vec: Vec = map.into_values().collect(); - /// - /// // The `IntoValues` iterator produces values in arbitrary order, so - /// // the values must be sorted to test them against a sorted array. - /// vec.sort_unstable(); - /// assert_eq!(vec, [1, 2, 3]); - /// ``` - #[inline] - pub fn into_values(self) -> IntoValues { - IntoValues { - inner: self.into_iter(), - } - } -} - -impl HashMap -where - K: Eq + Hash, - S: BuildHasher, - A: Allocator + Clone, -{ - /// Reserves capacity for at least `additional` more elements to be inserted - /// in the `HashMap`. The collection may reserve more space to avoid - /// frequent reallocations. - /// - /// # Panics - /// - /// Panics if the new capacity exceeds [`isize::MAX`] bytes and [`abort`] the program - /// in case of allocation error. Use [`try_reserve`](HashMap::try_reserve) instead - /// if you want to handle memory allocation failure. - /// - /// [`isize::MAX`]: https://doc.rust-lang.org/std/primitive.isize.html - /// [`abort`]: https://doc.rust-lang.org/alloc/alloc/fn.handle_alloc_error.html - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// let mut map: HashMap<&str, i32> = HashMap::new(); - /// // Map is empty and doesn't allocate memory - /// assert_eq!(map.capacity(), 0); - /// - /// map.reserve(10); - /// - /// // And now map can hold at least 10 elements - /// assert!(map.capacity() >= 10); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn reserve(&mut self, additional: usize) { - self.table - .reserve(additional, make_hasher::<_, V, S>(&self.hash_builder)); - } - - /// Tries to reserve capacity for at least `additional` more elements to be inserted - /// in the given `HashMap`. The collection may reserve more space to avoid - /// frequent reallocations. - /// - /// # Errors - /// - /// If the capacity overflows, or the allocator reports a failure, then an error - /// is returned. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// - /// let mut map: HashMap<&str, isize> = HashMap::new(); - /// // Map is empty and doesn't allocate memory - /// assert_eq!(map.capacity(), 0); - /// - /// map.try_reserve(10).expect("why is the test harness OOMing on 10 bytes?"); - /// - /// // And now map can hold at least 10 elements - /// assert!(map.capacity() >= 10); - /// ``` - /// If the capacity overflows, or the allocator reports a failure, then an error - /// is returned: - /// ``` - /// # fn test() { - /// use hashbrown::HashMap; - /// use hashbrown::TryReserveError; - /// let mut map: HashMap = HashMap::new(); - /// - /// match map.try_reserve(usize::MAX) { - /// Err(error) => match error { - /// TryReserveError::CapacityOverflow => {} - /// _ => panic!("TryReserveError::AllocError ?"), - /// }, - /// _ => panic!(), - /// } - /// # } - /// # fn main() { - /// # #[cfg(not(miri))] - /// # test() - /// # } - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn try_reserve(&mut self, additional: usize) -> Result<(), TryReserveError> { - self.table - .try_reserve(additional, make_hasher::<_, V, S>(&self.hash_builder)) - } - - /// Shrinks the capacity of the map as much as possible. It will drop - /// down as much as possible while maintaining the internal rules - /// and possibly leaving some space in accordance with the resize policy. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// - /// let mut map: HashMap = HashMap::with_capacity(100); - /// map.insert(1, 2); - /// map.insert(3, 4); - /// assert!(map.capacity() >= 100); - /// map.shrink_to_fit(); - /// assert!(map.capacity() >= 2); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn shrink_to_fit(&mut self) { - self.table - .shrink_to(0, make_hasher::<_, V, S>(&self.hash_builder)); - } - - /// Shrinks the capacity of the map with a lower limit. It will drop - /// down no lower than the supplied limit while maintaining the internal rules - /// and possibly leaving some space in accordance with the resize policy. - /// - /// This function does nothing if the current capacity is smaller than the - /// supplied minimum capacity. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// - /// let mut map: HashMap = HashMap::with_capacity(100); - /// map.insert(1, 2); - /// map.insert(3, 4); - /// assert!(map.capacity() >= 100); - /// map.shrink_to(10); - /// assert!(map.capacity() >= 10); - /// map.shrink_to(0); - /// assert!(map.capacity() >= 2); - /// map.shrink_to(10); - /// assert!(map.capacity() >= 2); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn shrink_to(&mut self, min_capacity: usize) { - self.table - .shrink_to(min_capacity, make_hasher::<_, V, S>(&self.hash_builder)); - } - - /// Gets the given key's corresponding entry in the map for in-place manipulation. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// - /// let mut letters = HashMap::new(); - /// - /// for ch in "a short treatise on fungi".chars() { - /// let counter = letters.entry(ch).or_insert(0); - /// *counter += 1; - /// } - /// - /// assert_eq!(letters[&'s'], 2); - /// assert_eq!(letters[&'t'], 3); - /// assert_eq!(letters[&'u'], 1); - /// assert_eq!(letters.get(&'y'), None); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn entry(&mut self, key: K) -> Entry<'_, K, V, S, A> { - let hash = make_insert_hash::(&self.hash_builder, &key); - if let Some(elem) = self.table.find(hash, equivalent_key(&key)) { - Entry::Occupied(OccupiedEntry { - hash, - key: Some(key), - elem, - table: self, - }) - } else { - Entry::Vacant(VacantEntry { - hash, - key, - table: self, - }) - } - } - - /// Gets the given key's corresponding entry by reference in the map for in-place manipulation. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// - /// let mut words: HashMap = HashMap::new(); - /// let source = ["poneyland", "horseyland", "poneyland", "poneyland"]; - /// for (i, &s) in source.iter().enumerate() { - /// let counter = words.entry_ref(s).or_insert(0); - /// *counter += 1; - /// } - /// - /// assert_eq!(words["poneyland"], 3); - /// assert_eq!(words["horseyland"], 1); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn entry_ref<'a, 'b, Q: ?Sized>(&'a mut self, key: &'b Q) -> EntryRef<'a, 'b, K, Q, V, S, A> - where - Q: Hash + Equivalent, - { - let hash = make_hash::(&self.hash_builder, key); - if let Some(elem) = self.table.find(hash, equivalent_key(key)) { - EntryRef::Occupied(OccupiedEntryRef { - hash, - key: Some(KeyOrRef::Borrowed(key)), - elem, - table: self, - }) - } else { - EntryRef::Vacant(VacantEntryRef { - hash, - key: KeyOrRef::Borrowed(key), - table: self, - }) - } - } - - /// Returns a reference to the value corresponding to the key. - /// - /// The key may be any borrowed form of the map's key type, but - /// [`Hash`] and [`Eq`] on the borrowed form *must* match those for - /// the key type. - /// - /// [`Eq`]: https://doc.rust-lang.org/std/cmp/trait.Eq.html - /// [`Hash`]: https://doc.rust-lang.org/std/hash/trait.Hash.html - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// - /// let mut map = HashMap::new(); - /// map.insert(1, "a"); - /// assert_eq!(map.get(&1), Some(&"a")); - /// assert_eq!(map.get(&2), None); - /// ``` - #[inline] - pub fn get(&self, k: &Q) -> Option<&V> - where - Q: Hash + Equivalent, - { - // Avoid `Option::map` because it bloats LLVM IR. - match self.get_inner(k) { - Some(&(_, ref v)) => Some(v), - None => None, - } - } - - /// Returns the key-value pair corresponding to the supplied key. - /// - /// The supplied key may be any borrowed form of the map's key type, but - /// [`Hash`] and [`Eq`] on the borrowed form *must* match those for - /// the key type. - /// - /// [`Eq`]: https://doc.rust-lang.org/std/cmp/trait.Eq.html - /// [`Hash`]: https://doc.rust-lang.org/std/hash/trait.Hash.html - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// - /// let mut map = HashMap::new(); - /// map.insert(1, "a"); - /// assert_eq!(map.get_key_value(&1), Some((&1, &"a"))); - /// assert_eq!(map.get_key_value(&2), None); - /// ``` - #[inline] - pub fn get_key_value(&self, k: &Q) -> Option<(&K, &V)> - where - Q: Hash + Equivalent, - { - // Avoid `Option::map` because it bloats LLVM IR. - match self.get_inner(k) { - Some(&(ref key, ref value)) => Some((key, value)), - None => None, - } - } - - #[inline] - fn get_inner(&self, k: &Q) -> Option<&(K, V)> - where - Q: Hash + Equivalent, - { - if self.table.is_empty() { - None - } else { - let hash = make_hash::(&self.hash_builder, k); - self.table.get(hash, equivalent_key(k)) - } - } - - /// Returns the key-value pair corresponding to the supplied key, with a mutable reference to value. - /// - /// The supplied key may be any borrowed form of the map's key type, but - /// [`Hash`] and [`Eq`] on the borrowed form *must* match those for - /// the key type. - /// - /// [`Eq`]: https://doc.rust-lang.org/std/cmp/trait.Eq.html - /// [`Hash`]: https://doc.rust-lang.org/std/hash/trait.Hash.html - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// - /// let mut map = HashMap::new(); - /// map.insert(1, "a"); - /// let (k, v) = map.get_key_value_mut(&1).unwrap(); - /// assert_eq!(k, &1); - /// assert_eq!(v, &mut "a"); - /// *v = "b"; - /// assert_eq!(map.get_key_value_mut(&1), Some((&1, &mut "b"))); - /// assert_eq!(map.get_key_value_mut(&2), None); - /// ``` - #[inline] - pub fn get_key_value_mut(&mut self, k: &Q) -> Option<(&K, &mut V)> - where - Q: Hash + Equivalent, - { - // Avoid `Option::map` because it bloats LLVM IR. - match self.get_inner_mut(k) { - Some(&mut (ref key, ref mut value)) => Some((key, value)), - None => None, - } - } - - /// Returns `true` if the map contains a value for the specified key. - /// - /// The key may be any borrowed form of the map's key type, but - /// [`Hash`] and [`Eq`] on the borrowed form *must* match those for - /// the key type. - /// - /// [`Eq`]: https://doc.rust-lang.org/std/cmp/trait.Eq.html - /// [`Hash`]: https://doc.rust-lang.org/std/hash/trait.Hash.html - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// - /// let mut map = HashMap::new(); - /// map.insert(1, "a"); - /// assert_eq!(map.contains_key(&1), true); - /// assert_eq!(map.contains_key(&2), false); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn contains_key(&self, k: &Q) -> bool - where - Q: Hash + Equivalent, - { - self.get_inner(k).is_some() - } - - /// Returns a mutable reference to the value corresponding to the key. - /// - /// The key may be any borrowed form of the map's key type, but - /// [`Hash`] and [`Eq`] on the borrowed form *must* match those for - /// the key type. - /// - /// [`Eq`]: https://doc.rust-lang.org/std/cmp/trait.Eq.html - /// [`Hash`]: https://doc.rust-lang.org/std/hash/trait.Hash.html - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// - /// let mut map = HashMap::new(); - /// map.insert(1, "a"); - /// if let Some(x) = map.get_mut(&1) { - /// *x = "b"; - /// } - /// assert_eq!(map[&1], "b"); - /// - /// assert_eq!(map.get_mut(&2), None); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn get_mut(&mut self, k: &Q) -> Option<&mut V> - where - Q: Hash + Equivalent, - { - // Avoid `Option::map` because it bloats LLVM IR. - match self.get_inner_mut(k) { - Some(&mut (_, ref mut v)) => Some(v), - None => None, - } - } - - #[inline] - fn get_inner_mut(&mut self, k: &Q) -> Option<&mut (K, V)> - where - Q: Hash + Equivalent, - { - if self.table.is_empty() { - None - } else { - let hash = make_hash::(&self.hash_builder, k); - self.table.get_mut(hash, equivalent_key(k)) - } - } - - /// Attempts to get mutable references to `N` values in the map at once. - /// - /// Returns an array of length `N` with the results of each query. For soundness, at most one - /// mutable reference will be returned to any value. `None` will be returned if any of the - /// keys are duplicates or missing. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// - /// let mut libraries = HashMap::new(); - /// libraries.insert("Bodleian Library".to_string(), 1602); - /// libraries.insert("Athenæum".to_string(), 1807); - /// libraries.insert("Herzogin-Anna-Amalia-Bibliothek".to_string(), 1691); - /// libraries.insert("Library of Congress".to_string(), 1800); - /// - /// let got = libraries.get_many_mut([ - /// "Athenæum", - /// "Library of Congress", - /// ]); - /// assert_eq!( - /// got, - /// Some([ - /// &mut 1807, - /// &mut 1800, - /// ]), - /// ); - /// - /// // Missing keys result in None - /// let got = libraries.get_many_mut([ - /// "Athenæum", - /// "New York Public Library", - /// ]); - /// assert_eq!(got, None); - /// - /// // Duplicate keys result in None - /// let got = libraries.get_many_mut([ - /// "Athenæum", - /// "Athenæum", - /// ]); - /// assert_eq!(got, None); - /// ``` - pub fn get_many_mut(&mut self, ks: [&Q; N]) -> Option<[&'_ mut V; N]> - where - Q: Hash + Equivalent, - { - self.get_many_mut_inner(ks).map(|res| res.map(|(_, v)| v)) - } - - /// Attempts to get mutable references to `N` values in the map at once, without validating that - /// the values are unique. - /// - /// Returns an array of length `N` with the results of each query. `None` will be returned if - /// any of the keys are missing. - /// - /// For a safe alternative see [`get_many_mut`](`HashMap::get_many_mut`). - /// - /// # Safety - /// - /// Calling this method with overlapping keys is *[undefined behavior]* even if the resulting - /// references are not used. - /// - /// [undefined behavior]: https://doc.rust-lang.org/reference/behavior-considered-undefined.html - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// - /// let mut libraries = HashMap::new(); - /// libraries.insert("Bodleian Library".to_string(), 1602); - /// libraries.insert("Athenæum".to_string(), 1807); - /// libraries.insert("Herzogin-Anna-Amalia-Bibliothek".to_string(), 1691); - /// libraries.insert("Library of Congress".to_string(), 1800); - /// - /// let got = libraries.get_many_mut([ - /// "Athenæum", - /// "Library of Congress", - /// ]); - /// assert_eq!( - /// got, - /// Some([ - /// &mut 1807, - /// &mut 1800, - /// ]), - /// ); - /// - /// // Missing keys result in None - /// let got = libraries.get_many_mut([ - /// "Athenæum", - /// "New York Public Library", - /// ]); - /// assert_eq!(got, None); - /// ``` - pub unsafe fn get_many_unchecked_mut( - &mut self, - ks: [&Q; N], - ) -> Option<[&'_ mut V; N]> - where - Q: Hash + Equivalent, - { - self.get_many_unchecked_mut_inner(ks) - .map(|res| res.map(|(_, v)| v)) - } - - /// Attempts to get mutable references to `N` values in the map at once, with immutable - /// references to the corresponding keys. - /// - /// Returns an array of length `N` with the results of each query. For soundness, at most one - /// mutable reference will be returned to any value. `None` will be returned if any of the keys - /// are duplicates or missing. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// - /// let mut libraries = HashMap::new(); - /// libraries.insert("Bodleian Library".to_string(), 1602); - /// libraries.insert("Athenæum".to_string(), 1807); - /// libraries.insert("Herzogin-Anna-Amalia-Bibliothek".to_string(), 1691); - /// libraries.insert("Library of Congress".to_string(), 1800); - /// - /// let got = libraries.get_many_key_value_mut([ - /// "Bodleian Library", - /// "Herzogin-Anna-Amalia-Bibliothek", - /// ]); - /// assert_eq!( - /// got, - /// Some([ - /// (&"Bodleian Library".to_string(), &mut 1602), - /// (&"Herzogin-Anna-Amalia-Bibliothek".to_string(), &mut 1691), - /// ]), - /// ); - /// // Missing keys result in None - /// let got = libraries.get_many_key_value_mut([ - /// "Bodleian Library", - /// "Gewandhaus", - /// ]); - /// assert_eq!(got, None); - /// - /// // Duplicate keys result in None - /// let got = libraries.get_many_key_value_mut([ - /// "Bodleian Library", - /// "Herzogin-Anna-Amalia-Bibliothek", - /// "Herzogin-Anna-Amalia-Bibliothek", - /// ]); - /// assert_eq!(got, None); - /// ``` - pub fn get_many_key_value_mut( - &mut self, - ks: [&Q; N], - ) -> Option<[(&'_ K, &'_ mut V); N]> - where - Q: Hash + Equivalent, - { - self.get_many_mut_inner(ks) - .map(|res| res.map(|(k, v)| (&*k, v))) - } - - /// Attempts to get mutable references to `N` values in the map at once, with immutable - /// references to the corresponding keys, without validating that the values are unique. - /// - /// Returns an array of length `N` with the results of each query. `None` will be returned if - /// any of the keys are missing. - /// - /// For a safe alternative see [`get_many_key_value_mut`](`HashMap::get_many_key_value_mut`). - /// - /// # Safety - /// - /// Calling this method with overlapping keys is *[undefined behavior]* even if the resulting - /// references are not used. - /// - /// [undefined behavior]: https://doc.rust-lang.org/reference/behavior-considered-undefined.html - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// - /// let mut libraries = HashMap::new(); - /// libraries.insert("Bodleian Library".to_string(), 1602); - /// libraries.insert("Athenæum".to_string(), 1807); - /// libraries.insert("Herzogin-Anna-Amalia-Bibliothek".to_string(), 1691); - /// libraries.insert("Library of Congress".to_string(), 1800); - /// - /// let got = libraries.get_many_key_value_mut([ - /// "Bodleian Library", - /// "Herzogin-Anna-Amalia-Bibliothek", - /// ]); - /// assert_eq!( - /// got, - /// Some([ - /// (&"Bodleian Library".to_string(), &mut 1602), - /// (&"Herzogin-Anna-Amalia-Bibliothek".to_string(), &mut 1691), - /// ]), - /// ); - /// // Missing keys result in None - /// let got = libraries.get_many_key_value_mut([ - /// "Bodleian Library", - /// "Gewandhaus", - /// ]); - /// assert_eq!(got, None); - /// ``` - pub unsafe fn get_many_key_value_unchecked_mut( - &mut self, - ks: [&Q; N], - ) -> Option<[(&'_ K, &'_ mut V); N]> - where - Q: Hash + Equivalent, - { - self.get_many_unchecked_mut_inner(ks) - .map(|res| res.map(|(k, v)| (&*k, v))) - } - - fn get_many_mut_inner( - &mut self, - ks: [&Q; N], - ) -> Option<[&'_ mut (K, V); N]> - where - Q: Hash + Equivalent, - { - let hashes = self.build_hashes_inner(ks); - self.table - .get_many_mut(hashes, |i, (k, _)| ks[i].equivalent(k)) - } - - unsafe fn get_many_unchecked_mut_inner( - &mut self, - ks: [&Q; N], - ) -> Option<[&'_ mut (K, V); N]> - where - Q: Hash + Equivalent, - { - let hashes = self.build_hashes_inner(ks); - self.table - .get_many_unchecked_mut(hashes, |i, (k, _)| ks[i].equivalent(k)) - } - - fn build_hashes_inner(&self, ks: [&Q; N]) -> [u64; N] - where - Q: Hash + Equivalent, - { - let mut hashes = [0_u64; N]; - for i in 0..N { - hashes[i] = make_hash::(&self.hash_builder, ks[i]); - } - hashes - } - - /// Inserts a key-value pair into the map. - /// - /// If the map did not have this key present, [`None`] is returned. - /// - /// If the map did have this key present, the value is updated, and the old - /// value is returned. The key is not updated, though; this matters for - /// types that can be `==` without being identical. See the [`std::collections`] - /// [module-level documentation] for more. - /// - /// [`None`]: https://doc.rust-lang.org/std/option/enum.Option.html#variant.None - /// [`std::collections`]: https://doc.rust-lang.org/std/collections/index.html - /// [module-level documentation]: https://doc.rust-lang.org/std/collections/index.html#insert-and-complex-keys - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// - /// let mut map = HashMap::new(); - /// assert_eq!(map.insert(37, "a"), None); - /// assert_eq!(map.is_empty(), false); - /// - /// map.insert(37, "b"); - /// assert_eq!(map.insert(37, "c"), Some("b")); - /// assert_eq!(map[&37], "c"); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn insert(&mut self, k: K, v: V) -> Option { - let hash = make_insert_hash::(&self.hash_builder, &k); - if let Some((_, item)) = self.table.get_mut(hash, equivalent_key(&k)) { - Some(mem::replace(item, v)) - } else { - self.table - .insert(hash, (k, v), make_hasher::<_, V, S>(&self.hash_builder)); - None - } - } - - /// Insert a key-value pair into the map without checking - /// if the key already exists in the map. - /// - /// Returns a reference to the key and value just inserted. - /// - /// This operation is safe if a key does not exist in the map. - /// - /// However, if a key exists in the map already, the behavior is unspecified: - /// this operation may panic, loop forever, or any following operation with the map - /// may panic, loop forever or return arbitrary result. - /// - /// That said, this operation (and following operations) are guaranteed to - /// not violate memory safety. - /// - /// This operation is faster than regular insert, because it does not perform - /// lookup before insertion. - /// - /// This operation is useful during initial population of the map. - /// For example, when constructing a map from another map, we know - /// that keys are unique. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// - /// let mut map1 = HashMap::new(); - /// assert_eq!(map1.insert(1, "a"), None); - /// assert_eq!(map1.insert(2, "b"), None); - /// assert_eq!(map1.insert(3, "c"), None); - /// assert_eq!(map1.len(), 3); - /// - /// let mut map2 = HashMap::new(); - /// - /// for (key, value) in map1.into_iter() { - /// map2.insert_unique_unchecked(key, value); - /// } - /// - /// let (key, value) = map2.insert_unique_unchecked(4, "d"); - /// assert_eq!(key, &4); - /// assert_eq!(value, &mut "d"); - /// *value = "e"; - /// - /// assert_eq!(map2[&1], "a"); - /// assert_eq!(map2[&2], "b"); - /// assert_eq!(map2[&3], "c"); - /// assert_eq!(map2[&4], "e"); - /// assert_eq!(map2.len(), 4); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn insert_unique_unchecked(&mut self, k: K, v: V) -> (&K, &mut V) { - let hash = make_insert_hash::(&self.hash_builder, &k); - let bucket = self - .table - .insert(hash, (k, v), make_hasher::<_, V, S>(&self.hash_builder)); - let (k_ref, v_ref) = unsafe { bucket.as_mut() }; - (k_ref, v_ref) - } - - /// Tries to insert a key-value pair into the map, and returns - /// a mutable reference to the value in the entry. - /// - /// # Errors - /// - /// If the map already had this key present, nothing is updated, and - /// an error containing the occupied entry and the value is returned. - /// - /// # Examples - /// - /// Basic usage: - /// - /// ``` - /// use hashbrown::HashMap; - /// use hashbrown::hash_map::OccupiedError; - /// - /// let mut map = HashMap::new(); - /// assert_eq!(map.try_insert(37, "a").unwrap(), &"a"); - /// - /// match map.try_insert(37, "b") { - /// Err(OccupiedError { entry, value }) => { - /// assert_eq!(entry.key(), &37); - /// assert_eq!(entry.get(), &"a"); - /// assert_eq!(value, "b"); - /// } - /// _ => panic!() - /// } - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn try_insert( - &mut self, - key: K, - value: V, - ) -> Result<&mut V, OccupiedError<'_, K, V, S, A>> { - match self.entry(key) { - Entry::Occupied(entry) => Err(OccupiedError { entry, value }), - Entry::Vacant(entry) => Ok(entry.insert(value)), - } - } - - /// Removes a key from the map, returning the value at the key if the key - /// was previously in the map. Keeps the allocated memory for reuse. - /// - /// The key may be any borrowed form of the map's key type, but - /// [`Hash`] and [`Eq`] on the borrowed form *must* match those for - /// the key type. - /// - /// [`Eq`]: https://doc.rust-lang.org/std/cmp/trait.Eq.html - /// [`Hash`]: https://doc.rust-lang.org/std/hash/trait.Hash.html - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// - /// let mut map = HashMap::new(); - /// // The map is empty - /// assert!(map.is_empty() && map.capacity() == 0); - /// - /// map.insert(1, "a"); - /// - /// assert_eq!(map.remove(&1), Some("a")); - /// assert_eq!(map.remove(&1), None); - /// - /// // Now map holds none elements - /// assert!(map.is_empty()); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn remove(&mut self, k: &Q) -> Option - where - Q: Hash + Equivalent, - { - // Avoid `Option::map` because it bloats LLVM IR. - match self.remove_entry(k) { - Some((_, v)) => Some(v), - None => None, - } - } - - /// Removes a key from the map, returning the stored key and value if the - /// key was previously in the map. Keeps the allocated memory for reuse. - /// - /// The key may be any borrowed form of the map's key type, but - /// [`Hash`] and [`Eq`] on the borrowed form *must* match those for - /// the key type. - /// - /// [`Eq`]: https://doc.rust-lang.org/std/cmp/trait.Eq.html - /// [`Hash`]: https://doc.rust-lang.org/std/hash/trait.Hash.html - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// - /// let mut map = HashMap::new(); - /// // The map is empty - /// assert!(map.is_empty() && map.capacity() == 0); - /// - /// map.insert(1, "a"); - /// - /// assert_eq!(map.remove_entry(&1), Some((1, "a"))); - /// assert_eq!(map.remove(&1), None); - /// - /// // Now map hold none elements - /// assert!(map.is_empty()); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn remove_entry(&mut self, k: &Q) -> Option<(K, V)> - where - Q: Hash + Equivalent, - { - let hash = make_hash::(&self.hash_builder, k); - self.table.remove_entry(hash, equivalent_key(k)) - } -} - -impl HashMap { - /// Creates a raw entry builder for the HashMap. - /// - /// Raw entries provide the lowest level of control for searching and - /// manipulating a map. They must be manually initialized with a hash and - /// then manually searched. After this, insertions into a vacant entry - /// still require an owned key to be provided. - /// - /// Raw entries are useful for such exotic situations as: - /// - /// * Hash memoization - /// * Deferring the creation of an owned key until it is known to be required - /// * Using a search key that doesn't work with the Borrow trait - /// * Using custom comparison logic without newtype wrappers - /// - /// Because raw entries provide much more low-level control, it's much easier - /// to put the HashMap into an inconsistent state which, while memory-safe, - /// will cause the map to produce seemingly random results. Higher-level and - /// more foolproof APIs like `entry` should be preferred when possible. - /// - /// In particular, the hash used to initialized the raw entry must still be - /// consistent with the hash of the key that is ultimately stored in the entry. - /// This is because implementations of HashMap may need to recompute hashes - /// when resizing, at which point only the keys are available. - /// - /// Raw entries give mutable access to the keys. This must not be used - /// to modify how the key would compare or hash, as the map will not re-evaluate - /// where the key should go, meaning the keys may become "lost" if their - /// location does not reflect their state. For instance, if you change a key - /// so that the map now contains keys which compare equal, search may start - /// acting erratically, with two keys randomly masking each other. Implementations - /// are free to assume this doesn't happen (within the limits of memory-safety). - /// - /// # Examples - /// - /// ``` - /// use core::hash::{BuildHasher, Hash}; - /// use hashbrown::hash_map::{HashMap, RawEntryMut}; - /// - /// let mut map = HashMap::new(); - /// map.extend([("a", 100), ("b", 200), ("c", 300)]); - /// - /// fn compute_hash(hash_builder: &S, key: &K) -> u64 { - /// use core::hash::Hasher; - /// let mut state = hash_builder.build_hasher(); - /// key.hash(&mut state); - /// state.finish() - /// } - /// - /// // Existing key (insert and update) - /// match map.raw_entry_mut().from_key(&"a") { - /// RawEntryMut::Vacant(_) => unreachable!(), - /// RawEntryMut::Occupied(mut view) => { - /// assert_eq!(view.get(), &100); - /// let v = view.get_mut(); - /// let new_v = (*v) * 10; - /// *v = new_v; - /// assert_eq!(view.insert(1111), 1000); - /// } - /// } - /// - /// assert_eq!(map[&"a"], 1111); - /// assert_eq!(map.len(), 3); - /// - /// // Existing key (take) - /// let hash = compute_hash(map.hasher(), &"c"); - /// match map.raw_entry_mut().from_key_hashed_nocheck(hash, &"c") { - /// RawEntryMut::Vacant(_) => unreachable!(), - /// RawEntryMut::Occupied(view) => { - /// assert_eq!(view.remove_entry(), ("c", 300)); - /// } - /// } - /// assert_eq!(map.raw_entry().from_key(&"c"), None); - /// assert_eq!(map.len(), 2); - /// - /// // Nonexistent key (insert and update) - /// let key = "d"; - /// let hash = compute_hash(map.hasher(), &key); - /// match map.raw_entry_mut().from_hash(hash, |q| *q == key) { - /// RawEntryMut::Occupied(_) => unreachable!(), - /// RawEntryMut::Vacant(view) => { - /// let (k, value) = view.insert("d", 4000); - /// assert_eq!((*k, *value), ("d", 4000)); - /// *value = 40000; - /// } - /// } - /// assert_eq!(map[&"d"], 40000); - /// assert_eq!(map.len(), 3); - /// - /// match map.raw_entry_mut().from_hash(hash, |q| *q == key) { - /// RawEntryMut::Vacant(_) => unreachable!(), - /// RawEntryMut::Occupied(view) => { - /// assert_eq!(view.remove_entry(), ("d", 40000)); - /// } - /// } - /// assert_eq!(map.get(&"d"), None); - /// assert_eq!(map.len(), 2); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn raw_entry_mut(&mut self) -> RawEntryBuilderMut<'_, K, V, S, A> { - RawEntryBuilderMut { map: self } - } - - /// Creates a raw immutable entry builder for the HashMap. - /// - /// Raw entries provide the lowest level of control for searching and - /// manipulating a map. They must be manually initialized with a hash and - /// then manually searched. - /// - /// This is useful for - /// * Hash memoization - /// * Using a search key that doesn't work with the Borrow trait - /// * Using custom comparison logic without newtype wrappers - /// - /// Unless you are in such a situation, higher-level and more foolproof APIs like - /// `get` should be preferred. - /// - /// Immutable raw entries have very limited use; you might instead want `raw_entry_mut`. - /// - /// # Examples - /// - /// ``` - /// use core::hash::{BuildHasher, Hash}; - /// use hashbrown::HashMap; - /// - /// let mut map = HashMap::new(); - /// map.extend([("a", 100), ("b", 200), ("c", 300)]); - /// - /// fn compute_hash(hash_builder: &S, key: &K) -> u64 { - /// use core::hash::Hasher; - /// let mut state = hash_builder.build_hasher(); - /// key.hash(&mut state); - /// state.finish() - /// } - /// - /// for k in ["a", "b", "c", "d", "e", "f"] { - /// let hash = compute_hash(map.hasher(), k); - /// let v = map.get(&k).cloned(); - /// let kv = v.as_ref().map(|v| (&k, v)); - /// - /// println!("Key: {} and value: {:?}", k, v); - /// - /// assert_eq!(map.raw_entry().from_key(&k), kv); - /// assert_eq!(map.raw_entry().from_hash(hash, |q| *q == k), kv); - /// assert_eq!(map.raw_entry().from_key_hashed_nocheck(hash, &k), kv); - /// } - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn raw_entry(&self) -> RawEntryBuilder<'_, K, V, S, A> { - RawEntryBuilder { map: self } - } - - /// Returns a mutable reference to the [`RawTable`] used underneath [`HashMap`]. - /// This function is only available if the `raw` feature of the crate is enabled. - /// - /// # Note - /// - /// Calling this function is safe, but using the raw hash table API may require - /// unsafe functions or blocks. - /// - /// `RawTable` API gives the lowest level of control under the map that can be useful - /// for extending the HashMap's API, but may lead to *[undefined behavior]*. - /// - /// [`HashMap`]: struct.HashMap.html - /// [`RawTable`]: crate::raw::RawTable - /// [undefined behavior]: https://doc.rust-lang.org/reference/behavior-considered-undefined.html - /// - /// # Examples - /// - /// ``` - /// use core::hash::{BuildHasher, Hash}; - /// use hashbrown::HashMap; - /// - /// let mut map = HashMap::new(); - /// map.extend([("a", 10), ("b", 20), ("c", 30)]); - /// assert_eq!(map.len(), 3); - /// - /// // Let's imagine that we have a value and a hash of the key, but not the key itself. - /// // However, if you want to remove the value from the map by hash and value, and you - /// // know exactly that the value is unique, then you can create a function like this: - /// fn remove_by_hash( - /// map: &mut HashMap, - /// hash: u64, - /// is_match: F, - /// ) -> Option<(K, V)> - /// where - /// F: Fn(&(K, V)) -> bool, - /// { - /// let raw_table = map.raw_table(); - /// match raw_table.find(hash, is_match) { - /// Some(bucket) => Some(unsafe { raw_table.remove(bucket) }), - /// None => None, - /// } - /// } - /// - /// fn compute_hash(hash_builder: &S, key: &K) -> u64 { - /// use core::hash::Hasher; - /// let mut state = hash_builder.build_hasher(); - /// key.hash(&mut state); - /// state.finish() - /// } - /// - /// let hash = compute_hash(map.hasher(), "a"); - /// assert_eq!(remove_by_hash(&mut map, hash, |(_, v)| *v == 10), Some(("a", 10))); - /// assert_eq!(map.get(&"a"), None); - /// assert_eq!(map.len(), 2); - /// ``` - #[cfg(feature = "raw")] - #[cfg_attr(feature = "inline-more", inline)] - pub fn raw_table(&mut self) -> &mut RawTable<(K, V), A> { - &mut self.table - } -} - -impl PartialEq for HashMap -where - K: Eq + Hash, - V: PartialEq, - S: BuildHasher, - A: Allocator + Clone, -{ - fn eq(&self, other: &Self) -> bool { - if self.len() != other.len() { - return false; - } - - self.iter() - .all(|(key, value)| other.get(key).map_or(false, |v| *value == *v)) - } -} - -impl Eq for HashMap -where - K: Eq + Hash, - V: Eq, - S: BuildHasher, - A: Allocator + Clone, -{ -} - -impl Debug for HashMap -where - K: Debug, - V: Debug, - A: Allocator + Clone, -{ - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_map().entries(self.iter()).finish() - } -} - -impl Default for HashMap -where - S: Default, - A: Default + Allocator + Clone, -{ - /// Creates an empty `HashMap`, with the `Default` value for the hasher and allocator. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// use std::collections::hash_map::RandomState; - /// - /// // You can specify all types of HashMap, including hasher and allocator. - /// // Created map is empty and don't allocate memory - /// let map: HashMap = Default::default(); - /// assert_eq!(map.capacity(), 0); - /// let map: HashMap = HashMap::default(); - /// assert_eq!(map.capacity(), 0); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - fn default() -> Self { - Self::with_hasher_in(Default::default(), Default::default()) - } -} - -impl Index<&Q> for HashMap -where - K: Eq + Hash, - Q: Hash + Equivalent, - S: BuildHasher, - A: Allocator + Clone, -{ - type Output = V; - - /// Returns a reference to the value corresponding to the supplied key. - /// - /// # Panics - /// - /// Panics if the key is not present in the `HashMap`. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// - /// let map: HashMap<_, _> = [("a", "One"), ("b", "Two")].into(); - /// - /// assert_eq!(map[&"a"], "One"); - /// assert_eq!(map[&"b"], "Two"); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - fn index(&self, key: &Q) -> &V { - self.get(key).expect("no entry found for key") - } -} - -// The default hasher is used to match the std implementation signature -#[cfg(feature = "ahash")] -impl From<[(K, V); N]> for HashMap -where - K: Eq + Hash, - A: Default + Allocator + Clone, -{ - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// - /// let map1 = HashMap::from([(1, 2), (3, 4)]); - /// let map2: HashMap<_, _> = [(1, 2), (3, 4)].into(); - /// assert_eq!(map1, map2); - /// ``` - fn from(arr: [(K, V); N]) -> Self { - arr.into_iter().collect() - } -} - -/// An iterator over the entries of a `HashMap` in arbitrary order. -/// The iterator element type is `(&'a K, &'a V)`. -/// -/// This `struct` is created by the [`iter`] method on [`HashMap`]. See its -/// documentation for more. -/// -/// [`iter`]: struct.HashMap.html#method.iter -/// [`HashMap`]: struct.HashMap.html -/// -/// # Examples -/// -/// ``` -/// use hashbrown::HashMap; -/// -/// let map: HashMap<_, _> = [(1, "a"), (2, "b"), (3, "c")].into(); -/// -/// let mut iter = map.iter(); -/// let mut vec = vec![iter.next(), iter.next(), iter.next()]; -/// -/// // The `Iter` iterator produces items in arbitrary order, so the -/// // items must be sorted to test them against a sorted array. -/// vec.sort_unstable(); -/// assert_eq!(vec, [Some((&1, &"a")), Some((&2, &"b")), Some((&3, &"c"))]); -/// -/// // It is fused iterator -/// assert_eq!(iter.next(), None); -/// assert_eq!(iter.next(), None); -/// ``` -pub struct Iter<'a, K, V> { - inner: RawIter<(K, V)>, - marker: PhantomData<(&'a K, &'a V)>, -} - -// FIXME(#26925) Remove in favor of `#[derive(Clone)]` -impl Clone for Iter<'_, K, V> { - #[cfg_attr(feature = "inline-more", inline)] - fn clone(&self) -> Self { - Iter { - inner: self.inner.clone(), - marker: PhantomData, - } - } -} - -impl fmt::Debug for Iter<'_, K, V> { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_list().entries(self.clone()).finish() - } -} - -/// A mutable iterator over the entries of a `HashMap` in arbitrary order. -/// The iterator element type is `(&'a K, &'a mut V)`. -/// -/// This `struct` is created by the [`iter_mut`] method on [`HashMap`]. See its -/// documentation for more. -/// -/// [`iter_mut`]: struct.HashMap.html#method.iter_mut -/// [`HashMap`]: struct.HashMap.html -/// -/// # Examples -/// -/// ``` -/// use hashbrown::HashMap; -/// -/// let mut map: HashMap<_, _> = [(1, "One".to_owned()), (2, "Two".into())].into(); -/// -/// let mut iter = map.iter_mut(); -/// iter.next().map(|(_, v)| v.push_str(" Mississippi")); -/// iter.next().map(|(_, v)| v.push_str(" Mississippi")); -/// -/// // It is fused iterator -/// assert_eq!(iter.next(), None); -/// assert_eq!(iter.next(), None); -/// -/// assert_eq!(map.get(&1).unwrap(), &"One Mississippi".to_owned()); -/// assert_eq!(map.get(&2).unwrap(), &"Two Mississippi".to_owned()); -/// ``` -pub struct IterMut<'a, K, V> { - inner: RawIter<(K, V)>, - // To ensure invariance with respect to V - marker: PhantomData<(&'a K, &'a mut V)>, -} - -// We override the default Send impl which has K: Sync instead of K: Send. Both -// are correct, but this one is more general since it allows keys which -// implement Send but not Sync. -unsafe impl Send for IterMut<'_, K, V> {} - -impl IterMut<'_, K, V> { - /// Returns a iterator of references over the remaining items. - #[cfg_attr(feature = "inline-more", inline)] - pub(super) fn iter(&self) -> Iter<'_, K, V> { - Iter { - inner: self.inner.clone(), - marker: PhantomData, - } - } -} - -/// An owning iterator over the entries of a `HashMap` in arbitrary order. -/// The iterator element type is `(K, V)`. -/// -/// This `struct` is created by the [`into_iter`] method on [`HashMap`] -/// (provided by the [`IntoIterator`] trait). See its documentation for more. -/// The map cannot be used after calling that method. -/// -/// [`into_iter`]: struct.HashMap.html#method.into_iter -/// [`HashMap`]: struct.HashMap.html -/// [`IntoIterator`]: https://doc.rust-lang.org/core/iter/trait.IntoIterator.html -/// -/// # Examples -/// -/// ``` -/// use hashbrown::HashMap; -/// -/// let map: HashMap<_, _> = [(1, "a"), (2, "b"), (3, "c")].into(); -/// -/// let mut iter = map.into_iter(); -/// let mut vec = vec![iter.next(), iter.next(), iter.next()]; -/// -/// // The `IntoIter` iterator produces items in arbitrary order, so the -/// // items must be sorted to test them against a sorted array. -/// vec.sort_unstable(); -/// assert_eq!(vec, [Some((1, "a")), Some((2, "b")), Some((3, "c"))]); -/// -/// // It is fused iterator -/// assert_eq!(iter.next(), None); -/// assert_eq!(iter.next(), None); -/// ``` -pub struct IntoIter { - inner: RawIntoIter<(K, V), A>, -} - -impl IntoIter { - /// Returns a iterator of references over the remaining items. - #[cfg_attr(feature = "inline-more", inline)] - pub(super) fn iter(&self) -> Iter<'_, K, V> { - Iter { - inner: self.inner.iter(), - marker: PhantomData, - } - } -} - -/// An owning iterator over the keys of a `HashMap` in arbitrary order. -/// The iterator element type is `K`. -/// -/// This `struct` is created by the [`into_keys`] method on [`HashMap`]. -/// See its documentation for more. -/// The map cannot be used after calling that method. -/// -/// [`into_keys`]: struct.HashMap.html#method.into_keys -/// [`HashMap`]: struct.HashMap.html -/// -/// # Examples -/// -/// ``` -/// use hashbrown::HashMap; -/// -/// let map: HashMap<_, _> = [(1, "a"), (2, "b"), (3, "c")].into(); -/// -/// let mut keys = map.into_keys(); -/// let mut vec = vec![keys.next(), keys.next(), keys.next()]; -/// -/// // The `IntoKeys` iterator produces keys in arbitrary order, so the -/// // keys must be sorted to test them against a sorted array. -/// vec.sort_unstable(); -/// assert_eq!(vec, [Some(1), Some(2), Some(3)]); -/// -/// // It is fused iterator -/// assert_eq!(keys.next(), None); -/// assert_eq!(keys.next(), None); -/// ``` -pub struct IntoKeys { - inner: IntoIter, -} - -impl Iterator for IntoKeys { - type Item = K; - - #[inline] - fn next(&mut self) -> Option { - self.inner.next().map(|(k, _)| k) - } - #[inline] - fn size_hint(&self) -> (usize, Option) { - self.inner.size_hint() - } -} - -impl ExactSizeIterator for IntoKeys { - #[inline] - fn len(&self) -> usize { - self.inner.len() - } -} - -impl FusedIterator for IntoKeys {} - -impl fmt::Debug for IntoKeys { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_list() - .entries(self.inner.iter().map(|(k, _)| k)) - .finish() - } -} - -/// An owning iterator over the values of a `HashMap` in arbitrary order. -/// The iterator element type is `V`. -/// -/// This `struct` is created by the [`into_values`] method on [`HashMap`]. -/// See its documentation for more. The map cannot be used after calling that method. -/// -/// [`into_values`]: struct.HashMap.html#method.into_values -/// [`HashMap`]: struct.HashMap.html -/// -/// # Examples -/// -/// ``` -/// use hashbrown::HashMap; -/// -/// let map: HashMap<_, _> = [(1, "a"), (2, "b"), (3, "c")].into(); -/// -/// let mut values = map.into_values(); -/// let mut vec = vec![values.next(), values.next(), values.next()]; -/// -/// // The `IntoValues` iterator produces values in arbitrary order, so -/// // the values must be sorted to test them against a sorted array. -/// vec.sort_unstable(); -/// assert_eq!(vec, [Some("a"), Some("b"), Some("c")]); -/// -/// // It is fused iterator -/// assert_eq!(values.next(), None); -/// assert_eq!(values.next(), None); -/// ``` -pub struct IntoValues { - inner: IntoIter, -} - -impl Iterator for IntoValues { - type Item = V; - - #[inline] - fn next(&mut self) -> Option { - self.inner.next().map(|(_, v)| v) - } - #[inline] - fn size_hint(&self) -> (usize, Option) { - self.inner.size_hint() - } -} - -impl ExactSizeIterator for IntoValues { - #[inline] - fn len(&self) -> usize { - self.inner.len() - } -} - -impl FusedIterator for IntoValues {} - -impl fmt::Debug for IntoValues { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_list() - .entries(self.inner.iter().map(|(_, v)| v)) - .finish() - } -} - -/// An iterator over the keys of a `HashMap` in arbitrary order. -/// The iterator element type is `&'a K`. -/// -/// This `struct` is created by the [`keys`] method on [`HashMap`]. See its -/// documentation for more. -/// -/// [`keys`]: struct.HashMap.html#method.keys -/// [`HashMap`]: struct.HashMap.html -/// -/// # Examples -/// -/// ``` -/// use hashbrown::HashMap; -/// -/// let map: HashMap<_, _> = [(1, "a"), (2, "b"), (3, "c")].into(); -/// -/// let mut keys = map.keys(); -/// let mut vec = vec![keys.next(), keys.next(), keys.next()]; -/// -/// // The `Keys` iterator produces keys in arbitrary order, so the -/// // keys must be sorted to test them against a sorted array. -/// vec.sort_unstable(); -/// assert_eq!(vec, [Some(&1), Some(&2), Some(&3)]); -/// -/// // It is fused iterator -/// assert_eq!(keys.next(), None); -/// assert_eq!(keys.next(), None); -/// ``` -pub struct Keys<'a, K, V> { - inner: Iter<'a, K, V>, -} - -// FIXME(#26925) Remove in favor of `#[derive(Clone)]` -impl Clone for Keys<'_, K, V> { - #[cfg_attr(feature = "inline-more", inline)] - fn clone(&self) -> Self { - Keys { - inner: self.inner.clone(), - } - } -} - -impl fmt::Debug for Keys<'_, K, V> { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_list().entries(self.clone()).finish() - } -} - -/// An iterator over the values of a `HashMap` in arbitrary order. -/// The iterator element type is `&'a V`. -/// -/// This `struct` is created by the [`values`] method on [`HashMap`]. See its -/// documentation for more. -/// -/// [`values`]: struct.HashMap.html#method.values -/// [`HashMap`]: struct.HashMap.html -/// -/// # Examples -/// -/// ``` -/// use hashbrown::HashMap; -/// -/// let map: HashMap<_, _> = [(1, "a"), (2, "b"), (3, "c")].into(); -/// -/// let mut values = map.values(); -/// let mut vec = vec![values.next(), values.next(), values.next()]; -/// -/// // The `Values` iterator produces values in arbitrary order, so the -/// // values must be sorted to test them against a sorted array. -/// vec.sort_unstable(); -/// assert_eq!(vec, [Some(&"a"), Some(&"b"), Some(&"c")]); -/// -/// // It is fused iterator -/// assert_eq!(values.next(), None); -/// assert_eq!(values.next(), None); -/// ``` -pub struct Values<'a, K, V> { - inner: Iter<'a, K, V>, -} - -// FIXME(#26925) Remove in favor of `#[derive(Clone)]` -impl Clone for Values<'_, K, V> { - #[cfg_attr(feature = "inline-more", inline)] - fn clone(&self) -> Self { - Values { - inner: self.inner.clone(), - } - } -} - -impl fmt::Debug for Values<'_, K, V> { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_list().entries(self.clone()).finish() - } -} - -/// A draining iterator over the entries of a `HashMap` in arbitrary -/// order. The iterator element type is `(K, V)`. -/// -/// This `struct` is created by the [`drain`] method on [`HashMap`]. See its -/// documentation for more. -/// -/// [`drain`]: struct.HashMap.html#method.drain -/// [`HashMap`]: struct.HashMap.html -/// -/// # Examples -/// -/// ``` -/// use hashbrown::HashMap; -/// -/// let mut map: HashMap<_, _> = [(1, "a"), (2, "b"), (3, "c")].into(); -/// -/// let mut drain_iter = map.drain(); -/// let mut vec = vec![drain_iter.next(), drain_iter.next(), drain_iter.next()]; -/// -/// // The `Drain` iterator produces items in arbitrary order, so the -/// // items must be sorted to test them against a sorted array. -/// vec.sort_unstable(); -/// assert_eq!(vec, [Some((1, "a")), Some((2, "b")), Some((3, "c"))]); -/// -/// // It is fused iterator -/// assert_eq!(drain_iter.next(), None); -/// assert_eq!(drain_iter.next(), None); -/// ``` -pub struct Drain<'a, K, V, A: Allocator + Clone = Global> { - inner: RawDrain<'a, (K, V), A>, -} - -impl Drain<'_, K, V, A> { - /// Returns a iterator of references over the remaining items. - #[cfg_attr(feature = "inline-more", inline)] - pub(super) fn iter(&self) -> Iter<'_, K, V> { - Iter { - inner: self.inner.iter(), - marker: PhantomData, - } - } -} - -/// A draining iterator over entries of a `HashMap` which don't satisfy the predicate -/// `f(&k, &mut v)` in arbitrary order. The iterator element type is `(K, V)`. -/// -/// This `struct` is created by the [`drain_filter`] method on [`HashMap`]. See its -/// documentation for more. -/// -/// [`drain_filter`]: struct.HashMap.html#method.drain_filter -/// [`HashMap`]: struct.HashMap.html -/// -/// # Examples -/// -/// ``` -/// use hashbrown::HashMap; -/// -/// let mut map: HashMap = [(1, "a"), (2, "b"), (3, "c")].into(); -/// -/// let mut drain_filter = map.drain_filter(|k, _v| k % 2 != 0); -/// let mut vec = vec![drain_filter.next(), drain_filter.next()]; -/// -/// // The `DrainFilter` iterator produces items in arbitrary order, so the -/// // items must be sorted to test them against a sorted array. -/// vec.sort_unstable(); -/// assert_eq!(vec, [Some((1, "a")),Some((3, "c"))]); -/// -/// // It is fused iterator -/// assert_eq!(drain_filter.next(), None); -/// assert_eq!(drain_filter.next(), None); -/// drop(drain_filter); -/// -/// assert_eq!(map.len(), 1); -/// ``` -pub struct DrainFilter<'a, K, V, F, A: Allocator + Clone = Global> -where - F: FnMut(&K, &mut V) -> bool, -{ - f: F, - inner: DrainFilterInner<'a, K, V, A>, -} - -impl<'a, K, V, F, A> Drop for DrainFilter<'a, K, V, F, A> -where - F: FnMut(&K, &mut V) -> bool, - A: Allocator + Clone, -{ - #[cfg_attr(feature = "inline-more", inline)] - fn drop(&mut self) { - while let Some(item) = self.next() { - let guard = ConsumeAllOnDrop(self); - drop(item); - mem::forget(guard); - } - } -} - -pub(super) struct ConsumeAllOnDrop<'a, T: Iterator>(pub &'a mut T); - -impl Drop for ConsumeAllOnDrop<'_, T> { - #[cfg_attr(feature = "inline-more", inline)] - fn drop(&mut self) { - self.0.for_each(drop); - } -} - -impl Iterator for DrainFilter<'_, K, V, F, A> -where - F: FnMut(&K, &mut V) -> bool, - A: Allocator + Clone, -{ - type Item = (K, V); - - #[cfg_attr(feature = "inline-more", inline)] - fn next(&mut self) -> Option { - self.inner.next(&mut self.f) - } - - #[inline] - fn size_hint(&self) -> (usize, Option) { - (0, self.inner.iter.size_hint().1) - } -} - -impl FusedIterator for DrainFilter<'_, K, V, F> where F: FnMut(&K, &mut V) -> bool {} - -/// Portions of `DrainFilter` shared with `set::DrainFilter` -pub(super) struct DrainFilterInner<'a, K, V, A: Allocator + Clone> { - pub iter: RawIter<(K, V)>, - pub table: &'a mut RawTable<(K, V), A>, -} - -impl DrainFilterInner<'_, K, V, A> { - #[cfg_attr(feature = "inline-more", inline)] - pub(super) fn next(&mut self, f: &mut F) -> Option<(K, V)> - where - F: FnMut(&K, &mut V) -> bool, - { - unsafe { - for item in &mut self.iter { - let &mut (ref key, ref mut value) = item.as_mut(); - if f(key, value) { - return Some(self.table.remove(item)); - } - } - } - None - } -} - -/// A mutable iterator over the values of a `HashMap` in arbitrary order. -/// The iterator element type is `&'a mut V`. -/// -/// This `struct` is created by the [`values_mut`] method on [`HashMap`]. See its -/// documentation for more. -/// -/// [`values_mut`]: struct.HashMap.html#method.values_mut -/// [`HashMap`]: struct.HashMap.html -/// -/// # Examples -/// -/// ``` -/// use hashbrown::HashMap; -/// -/// let mut map: HashMap<_, _> = [(1, "One".to_owned()), (2, "Two".into())].into(); -/// -/// let mut values = map.values_mut(); -/// values.next().map(|v| v.push_str(" Mississippi")); -/// values.next().map(|v| v.push_str(" Mississippi")); -/// -/// // It is fused iterator -/// assert_eq!(values.next(), None); -/// assert_eq!(values.next(), None); -/// -/// assert_eq!(map.get(&1).unwrap(), &"One Mississippi".to_owned()); -/// assert_eq!(map.get(&2).unwrap(), &"Two Mississippi".to_owned()); -/// ``` -pub struct ValuesMut<'a, K, V> { - inner: IterMut<'a, K, V>, -} - -/// A builder for computing where in a [`HashMap`] a key-value pair would be stored. -/// -/// See the [`HashMap::raw_entry_mut`] docs for usage examples. -/// -/// [`HashMap::raw_entry_mut`]: struct.HashMap.html#method.raw_entry_mut -/// -/// # Examples -/// -/// ``` -/// use hashbrown::hash_map::{RawEntryBuilderMut, RawEntryMut::Vacant, RawEntryMut::Occupied}; -/// use hashbrown::HashMap; -/// use core::hash::{BuildHasher, Hash}; -/// -/// let mut map = HashMap::new(); -/// map.extend([(1, 11), (2, 12), (3, 13), (4, 14), (5, 15), (6, 16)]); -/// assert_eq!(map.len(), 6); -/// -/// fn compute_hash(hash_builder: &S, key: &K) -> u64 { -/// use core::hash::Hasher; -/// let mut state = hash_builder.build_hasher(); -/// key.hash(&mut state); -/// state.finish() -/// } -/// -/// let builder: RawEntryBuilderMut<_, _, _> = map.raw_entry_mut(); -/// -/// // Existing key -/// match builder.from_key(&6) { -/// Vacant(_) => unreachable!(), -/// Occupied(view) => assert_eq!(view.get(), &16), -/// } -/// -/// for key in 0..12 { -/// let hash = compute_hash(map.hasher(), &key); -/// let value = map.get(&key).cloned(); -/// let key_value = value.as_ref().map(|v| (&key, v)); -/// -/// println!("Key: {} and value: {:?}", key, value); -/// -/// match map.raw_entry_mut().from_key(&key) { -/// Occupied(mut o) => assert_eq!(Some(o.get_key_value()), key_value), -/// Vacant(_) => assert_eq!(value, None), -/// } -/// match map.raw_entry_mut().from_key_hashed_nocheck(hash, &key) { -/// Occupied(mut o) => assert_eq!(Some(o.get_key_value()), key_value), -/// Vacant(_) => assert_eq!(value, None), -/// } -/// match map.raw_entry_mut().from_hash(hash, |q| *q == key) { -/// Occupied(mut o) => assert_eq!(Some(o.get_key_value()), key_value), -/// Vacant(_) => assert_eq!(value, None), -/// } -/// } -/// -/// assert_eq!(map.len(), 6); -/// ``` -pub struct RawEntryBuilderMut<'a, K, V, S, A: Allocator + Clone = Global> { - map: &'a mut HashMap, -} - -/// A view into a single entry in a map, which may either be vacant or occupied. -/// -/// This is a lower-level version of [`Entry`]. -/// -/// This `enum` is constructed through the [`raw_entry_mut`] method on [`HashMap`], -/// then calling one of the methods of that [`RawEntryBuilderMut`]. -/// -/// [`HashMap`]: struct.HashMap.html -/// [`Entry`]: enum.Entry.html -/// [`raw_entry_mut`]: struct.HashMap.html#method.raw_entry_mut -/// [`RawEntryBuilderMut`]: struct.RawEntryBuilderMut.html -/// -/// # Examples -/// -/// ``` -/// use core::hash::{BuildHasher, Hash}; -/// use hashbrown::hash_map::{HashMap, RawEntryMut, RawOccupiedEntryMut}; -/// -/// let mut map = HashMap::new(); -/// map.extend([('a', 1), ('b', 2), ('c', 3)]); -/// assert_eq!(map.len(), 3); -/// -/// fn compute_hash(hash_builder: &S, key: &K) -> u64 { -/// use core::hash::Hasher; -/// let mut state = hash_builder.build_hasher(); -/// key.hash(&mut state); -/// state.finish() -/// } -/// -/// // Existing key (insert) -/// let raw: RawEntryMut<_, _, _> = map.raw_entry_mut().from_key(&'a'); -/// let _raw_o: RawOccupiedEntryMut<_, _, _> = raw.insert('a', 10); -/// assert_eq!(map.len(), 3); -/// -/// // Nonexistent key (insert) -/// map.raw_entry_mut().from_key(&'d').insert('d', 40); -/// assert_eq!(map.len(), 4); -/// -/// // Existing key (or_insert) -/// let hash = compute_hash(map.hasher(), &'b'); -/// let kv = map -/// .raw_entry_mut() -/// .from_key_hashed_nocheck(hash, &'b') -/// .or_insert('b', 20); -/// assert_eq!(kv, (&mut 'b', &mut 2)); -/// *kv.1 = 20; -/// assert_eq!(map.len(), 4); -/// -/// // Nonexistent key (or_insert) -/// let hash = compute_hash(map.hasher(), &'e'); -/// let kv = map -/// .raw_entry_mut() -/// .from_key_hashed_nocheck(hash, &'e') -/// .or_insert('e', 50); -/// assert_eq!(kv, (&mut 'e', &mut 50)); -/// assert_eq!(map.len(), 5); -/// -/// // Existing key (or_insert_with) -/// let hash = compute_hash(map.hasher(), &'c'); -/// let kv = map -/// .raw_entry_mut() -/// .from_hash(hash, |q| q == &'c') -/// .or_insert_with(|| ('c', 30)); -/// assert_eq!(kv, (&mut 'c', &mut 3)); -/// *kv.1 = 30; -/// assert_eq!(map.len(), 5); -/// -/// // Nonexistent key (or_insert_with) -/// let hash = compute_hash(map.hasher(), &'f'); -/// let kv = map -/// .raw_entry_mut() -/// .from_hash(hash, |q| q == &'f') -/// .or_insert_with(|| ('f', 60)); -/// assert_eq!(kv, (&mut 'f', &mut 60)); -/// assert_eq!(map.len(), 6); -/// -/// println!("Our HashMap: {:?}", map); -/// -/// let mut vec: Vec<_> = map.iter().map(|(&k, &v)| (k, v)).collect(); -/// // The `Iter` iterator produces items in arbitrary order, so the -/// // items must be sorted to test them against a sorted array. -/// vec.sort_unstable(); -/// assert_eq!(vec, [('a', 10), ('b', 20), ('c', 30), ('d', 40), ('e', 50), ('f', 60)]); -/// ``` -pub enum RawEntryMut<'a, K, V, S, A: Allocator + Clone = Global> { - /// An occupied entry. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::{hash_map::RawEntryMut, HashMap}; - /// let mut map: HashMap<_, _> = [("a", 100), ("b", 200)].into(); - /// - /// match map.raw_entry_mut().from_key(&"a") { - /// RawEntryMut::Vacant(_) => unreachable!(), - /// RawEntryMut::Occupied(_) => { } - /// } - /// ``` - Occupied(RawOccupiedEntryMut<'a, K, V, S, A>), - /// A vacant entry. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::{hash_map::RawEntryMut, HashMap}; - /// let mut map: HashMap<&str, i32> = HashMap::new(); - /// - /// match map.raw_entry_mut().from_key("a") { - /// RawEntryMut::Occupied(_) => unreachable!(), - /// RawEntryMut::Vacant(_) => { } - /// } - /// ``` - Vacant(RawVacantEntryMut<'a, K, V, S, A>), -} - -/// A view into an occupied entry in a `HashMap`. -/// It is part of the [`RawEntryMut`] enum. -/// -/// [`RawEntryMut`]: enum.RawEntryMut.html -/// -/// # Examples -/// -/// ``` -/// use core::hash::{BuildHasher, Hash}; -/// use hashbrown::hash_map::{HashMap, RawEntryMut, RawOccupiedEntryMut}; -/// -/// let mut map = HashMap::new(); -/// map.extend([("a", 10), ("b", 20), ("c", 30)]); -/// -/// fn compute_hash(hash_builder: &S, key: &K) -> u64 { -/// use core::hash::Hasher; -/// let mut state = hash_builder.build_hasher(); -/// key.hash(&mut state); -/// state.finish() -/// } -/// -/// let _raw_o: RawOccupiedEntryMut<_, _, _> = map.raw_entry_mut().from_key(&"a").insert("a", 100); -/// assert_eq!(map.len(), 3); -/// -/// // Existing key (insert and update) -/// match map.raw_entry_mut().from_key(&"a") { -/// RawEntryMut::Vacant(_) => unreachable!(), -/// RawEntryMut::Occupied(mut view) => { -/// assert_eq!(view.get(), &100); -/// let v = view.get_mut(); -/// let new_v = (*v) * 10; -/// *v = new_v; -/// assert_eq!(view.insert(1111), 1000); -/// } -/// } -/// -/// assert_eq!(map[&"a"], 1111); -/// assert_eq!(map.len(), 3); -/// -/// // Existing key (take) -/// let hash = compute_hash(map.hasher(), &"c"); -/// match map.raw_entry_mut().from_key_hashed_nocheck(hash, &"c") { -/// RawEntryMut::Vacant(_) => unreachable!(), -/// RawEntryMut::Occupied(view) => { -/// assert_eq!(view.remove_entry(), ("c", 30)); -/// } -/// } -/// assert_eq!(map.raw_entry().from_key(&"c"), None); -/// assert_eq!(map.len(), 2); -/// -/// let hash = compute_hash(map.hasher(), &"b"); -/// match map.raw_entry_mut().from_hash(hash, |q| *q == "b") { -/// RawEntryMut::Vacant(_) => unreachable!(), -/// RawEntryMut::Occupied(view) => { -/// assert_eq!(view.remove_entry(), ("b", 20)); -/// } -/// } -/// assert_eq!(map.get(&"b"), None); -/// assert_eq!(map.len(), 1); -/// ``` -pub struct RawOccupiedEntryMut<'a, K, V, S, A: Allocator + Clone = Global> { - elem: Bucket<(K, V)>, - table: &'a mut RawTable<(K, V), A>, - hash_builder: &'a S, -} - -unsafe impl Send for RawOccupiedEntryMut<'_, K, V, S, A> -where - K: Send, - V: Send, - S: Send, - A: Send + Allocator + Clone, -{ -} -unsafe impl Sync for RawOccupiedEntryMut<'_, K, V, S, A> -where - K: Sync, - V: Sync, - S: Sync, - A: Sync + Allocator + Clone, -{ -} - -/// A view into a vacant entry in a `HashMap`. -/// It is part of the [`RawEntryMut`] enum. -/// -/// [`RawEntryMut`]: enum.RawEntryMut.html -/// -/// # Examples -/// -/// ``` -/// use core::hash::{BuildHasher, Hash}; -/// use hashbrown::hash_map::{HashMap, RawEntryMut, RawVacantEntryMut}; -/// -/// let mut map = HashMap::<&str, i32>::new(); -/// -/// fn compute_hash(hash_builder: &S, key: &K) -> u64 { -/// use core::hash::Hasher; -/// let mut state = hash_builder.build_hasher(); -/// key.hash(&mut state); -/// state.finish() -/// } -/// -/// let raw_v: RawVacantEntryMut<_, _, _> = match map.raw_entry_mut().from_key(&"a") { -/// RawEntryMut::Vacant(view) => view, -/// RawEntryMut::Occupied(_) => unreachable!(), -/// }; -/// raw_v.insert("a", 10); -/// assert!(map[&"a"] == 10 && map.len() == 1); -/// -/// // Nonexistent key (insert and update) -/// let hash = compute_hash(map.hasher(), &"b"); -/// match map.raw_entry_mut().from_key_hashed_nocheck(hash, &"b") { -/// RawEntryMut::Occupied(_) => unreachable!(), -/// RawEntryMut::Vacant(view) => { -/// let (k, value) = view.insert("b", 2); -/// assert_eq!((*k, *value), ("b", 2)); -/// *value = 20; -/// } -/// } -/// assert!(map[&"b"] == 20 && map.len() == 2); -/// -/// let hash = compute_hash(map.hasher(), &"c"); -/// match map.raw_entry_mut().from_hash(hash, |q| *q == "c") { -/// RawEntryMut::Occupied(_) => unreachable!(), -/// RawEntryMut::Vacant(view) => { -/// assert_eq!(view.insert("c", 30), (&mut "c", &mut 30)); -/// } -/// } -/// assert!(map[&"c"] == 30 && map.len() == 3); -/// ``` -pub struct RawVacantEntryMut<'a, K, V, S, A: Allocator + Clone = Global> { - table: &'a mut RawTable<(K, V), A>, - hash_builder: &'a S, -} - -/// A builder for computing where in a [`HashMap`] a key-value pair would be stored. -/// -/// See the [`HashMap::raw_entry`] docs for usage examples. -/// -/// [`HashMap::raw_entry`]: struct.HashMap.html#method.raw_entry -/// -/// # Examples -/// -/// ``` -/// use hashbrown::hash_map::{HashMap, RawEntryBuilder}; -/// use core::hash::{BuildHasher, Hash}; -/// -/// let mut map = HashMap::new(); -/// map.extend([(1, 10), (2, 20), (3, 30)]); -/// -/// fn compute_hash(hash_builder: &S, key: &K) -> u64 { -/// use core::hash::Hasher; -/// let mut state = hash_builder.build_hasher(); -/// key.hash(&mut state); -/// state.finish() -/// } -/// -/// for k in 0..6 { -/// let hash = compute_hash(map.hasher(), &k); -/// let v = map.get(&k).cloned(); -/// let kv = v.as_ref().map(|v| (&k, v)); -/// -/// println!("Key: {} and value: {:?}", k, v); -/// let builder: RawEntryBuilder<_, _, _> = map.raw_entry(); -/// assert_eq!(builder.from_key(&k), kv); -/// assert_eq!(map.raw_entry().from_hash(hash, |q| *q == k), kv); -/// assert_eq!(map.raw_entry().from_key_hashed_nocheck(hash, &k), kv); -/// } -/// ``` -pub struct RawEntryBuilder<'a, K, V, S, A: Allocator + Clone = Global> { - map: &'a HashMap, -} - -impl<'a, K, V, S, A: Allocator + Clone> RawEntryBuilderMut<'a, K, V, S, A> { - /// Creates a `RawEntryMut` from the given key. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::hash_map::{HashMap, RawEntryMut}; - /// - /// let mut map: HashMap<&str, u32> = HashMap::new(); - /// let key = "a"; - /// let entry: RawEntryMut<&str, u32, _> = map.raw_entry_mut().from_key(&key); - /// entry.insert(key, 100); - /// assert_eq!(map[&"a"], 100); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - #[allow(clippy::wrong_self_convention)] - pub fn from_key(self, k: &Q) -> RawEntryMut<'a, K, V, S, A> - where - S: BuildHasher, - Q: Hash + Equivalent, - { - let hash = make_hash::(&self.map.hash_builder, k); - self.from_key_hashed_nocheck(hash, k) - } - - /// Creates a `RawEntryMut` from the given key and its hash. - /// - /// # Examples - /// - /// ``` - /// use core::hash::{BuildHasher, Hash}; - /// use hashbrown::hash_map::{HashMap, RawEntryMut}; - /// - /// fn compute_hash(hash_builder: &S, key: &K) -> u64 { - /// use core::hash::Hasher; - /// let mut state = hash_builder.build_hasher(); - /// key.hash(&mut state); - /// state.finish() - /// } - /// - /// let mut map: HashMap<&str, u32> = HashMap::new(); - /// let key = "a"; - /// let hash = compute_hash(map.hasher(), &key); - /// let entry: RawEntryMut<&str, u32, _> = map.raw_entry_mut().from_key_hashed_nocheck(hash, &key); - /// entry.insert(key, 100); - /// assert_eq!(map[&"a"], 100); - /// ``` - #[inline] - #[allow(clippy::wrong_self_convention)] - pub fn from_key_hashed_nocheck(self, hash: u64, k: &Q) -> RawEntryMut<'a, K, V, S, A> - where - Q: Equivalent, - { - self.from_hash(hash, equivalent(k)) - } -} - -impl<'a, K, V, S, A: Allocator + Clone> RawEntryBuilderMut<'a, K, V, S, A> { - /// Creates a `RawEntryMut` from the given hash and matching function. - /// - /// # Examples - /// - /// ``` - /// use core::hash::{BuildHasher, Hash}; - /// use hashbrown::hash_map::{HashMap, RawEntryMut}; - /// - /// fn compute_hash(hash_builder: &S, key: &K) -> u64 { - /// use core::hash::Hasher; - /// let mut state = hash_builder.build_hasher(); - /// key.hash(&mut state); - /// state.finish() - /// } - /// - /// let mut map: HashMap<&str, u32> = HashMap::new(); - /// let key = "a"; - /// let hash = compute_hash(map.hasher(), &key); - /// let entry: RawEntryMut<&str, u32, _> = map.raw_entry_mut().from_hash(hash, |k| k == &key); - /// entry.insert(key, 100); - /// assert_eq!(map[&"a"], 100); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - #[allow(clippy::wrong_self_convention)] - pub fn from_hash(self, hash: u64, is_match: F) -> RawEntryMut<'a, K, V, S, A> - where - for<'b> F: FnMut(&'b K) -> bool, - { - self.search(hash, is_match) - } - - #[cfg_attr(feature = "inline-more", inline)] - fn search(self, hash: u64, mut is_match: F) -> RawEntryMut<'a, K, V, S, A> - where - for<'b> F: FnMut(&'b K) -> bool, - { - match self.map.table.find(hash, |(k, _)| is_match(k)) { - Some(elem) => RawEntryMut::Occupied(RawOccupiedEntryMut { - elem, - table: &mut self.map.table, - hash_builder: &self.map.hash_builder, - }), - None => RawEntryMut::Vacant(RawVacantEntryMut { - table: &mut self.map.table, - hash_builder: &self.map.hash_builder, - }), - } - } -} - -impl<'a, K, V, S, A: Allocator + Clone> RawEntryBuilder<'a, K, V, S, A> { - /// Access an immutable entry by key. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// - /// let map: HashMap<&str, u32> = [("a", 100), ("b", 200)].into(); - /// let key = "a"; - /// assert_eq!(map.raw_entry().from_key(&key), Some((&"a", &100))); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - #[allow(clippy::wrong_self_convention)] - pub fn from_key(self, k: &Q) -> Option<(&'a K, &'a V)> - where - S: BuildHasher, - Q: Hash + Equivalent, - { - let hash = make_hash::(&self.map.hash_builder, k); - self.from_key_hashed_nocheck(hash, k) - } - - /// Access an immutable entry by a key and its hash. - /// - /// # Examples - /// - /// ``` - /// use core::hash::{BuildHasher, Hash}; - /// use hashbrown::HashMap; - /// - /// fn compute_hash(hash_builder: &S, key: &K) -> u64 { - /// use core::hash::Hasher; - /// let mut state = hash_builder.build_hasher(); - /// key.hash(&mut state); - /// state.finish() - /// } - /// - /// let map: HashMap<&str, u32> = [("a", 100), ("b", 200)].into(); - /// let key = "a"; - /// let hash = compute_hash(map.hasher(), &key); - /// assert_eq!(map.raw_entry().from_key_hashed_nocheck(hash, &key), Some((&"a", &100))); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - #[allow(clippy::wrong_self_convention)] - pub fn from_key_hashed_nocheck(self, hash: u64, k: &Q) -> Option<(&'a K, &'a V)> - where - Q: Equivalent, - { - self.from_hash(hash, equivalent(k)) - } - - #[cfg_attr(feature = "inline-more", inline)] - fn search(self, hash: u64, mut is_match: F) -> Option<(&'a K, &'a V)> - where - F: FnMut(&K) -> bool, - { - match self.map.table.get(hash, |(k, _)| is_match(k)) { - Some(&(ref key, ref value)) => Some((key, value)), - None => None, - } - } - - /// Access an immutable entry by hash and matching function. - /// - /// # Examples - /// - /// ``` - /// use core::hash::{BuildHasher, Hash}; - /// use hashbrown::HashMap; - /// - /// fn compute_hash(hash_builder: &S, key: &K) -> u64 { - /// use core::hash::Hasher; - /// let mut state = hash_builder.build_hasher(); - /// key.hash(&mut state); - /// state.finish() - /// } - /// - /// let map: HashMap<&str, u32> = [("a", 100), ("b", 200)].into(); - /// let key = "a"; - /// let hash = compute_hash(map.hasher(), &key); - /// assert_eq!(map.raw_entry().from_hash(hash, |k| k == &key), Some((&"a", &100))); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - #[allow(clippy::wrong_self_convention)] - pub fn from_hash(self, hash: u64, is_match: F) -> Option<(&'a K, &'a V)> - where - F: FnMut(&K) -> bool, - { - self.search(hash, is_match) - } -} - -impl<'a, K, V, S, A: Allocator + Clone> RawEntryMut<'a, K, V, S, A> { - /// Sets the value of the entry, and returns a RawOccupiedEntryMut. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// - /// let mut map: HashMap<&str, u32> = HashMap::new(); - /// let entry = map.raw_entry_mut().from_key("horseyland").insert("horseyland", 37); - /// - /// assert_eq!(entry.remove_entry(), ("horseyland", 37)); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn insert(self, key: K, value: V) -> RawOccupiedEntryMut<'a, K, V, S, A> - where - K: Hash, - S: BuildHasher, - { - match self { - RawEntryMut::Occupied(mut entry) => { - entry.insert(value); - entry - } - RawEntryMut::Vacant(entry) => entry.insert_entry(key, value), - } - } - - /// Ensures a value is in the entry by inserting the default if empty, and returns - /// mutable references to the key and value in the entry. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// - /// let mut map: HashMap<&str, u32> = HashMap::new(); - /// - /// map.raw_entry_mut().from_key("poneyland").or_insert("poneyland", 3); - /// assert_eq!(map["poneyland"], 3); - /// - /// *map.raw_entry_mut().from_key("poneyland").or_insert("poneyland", 10).1 *= 2; - /// assert_eq!(map["poneyland"], 6); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn or_insert(self, default_key: K, default_val: V) -> (&'a mut K, &'a mut V) - where - K: Hash, - S: BuildHasher, - { - match self { - RawEntryMut::Occupied(entry) => entry.into_key_value(), - RawEntryMut::Vacant(entry) => entry.insert(default_key, default_val), - } - } - - /// Ensures a value is in the entry by inserting the result of the default function if empty, - /// and returns mutable references to the key and value in the entry. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// - /// let mut map: HashMap<&str, String> = HashMap::new(); - /// - /// map.raw_entry_mut().from_key("poneyland").or_insert_with(|| { - /// ("poneyland", "hoho".to_string()) - /// }); - /// - /// assert_eq!(map["poneyland"], "hoho".to_string()); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn or_insert_with(self, default: F) -> (&'a mut K, &'a mut V) - where - F: FnOnce() -> (K, V), - K: Hash, - S: BuildHasher, - { - match self { - RawEntryMut::Occupied(entry) => entry.into_key_value(), - RawEntryMut::Vacant(entry) => { - let (k, v) = default(); - entry.insert(k, v) - } - } - } - - /// Provides in-place mutable access to an occupied entry before any - /// potential inserts into the map. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// - /// let mut map: HashMap<&str, u32> = HashMap::new(); - /// - /// map.raw_entry_mut() - /// .from_key("poneyland") - /// .and_modify(|_k, v| { *v += 1 }) - /// .or_insert("poneyland", 42); - /// assert_eq!(map["poneyland"], 42); - /// - /// map.raw_entry_mut() - /// .from_key("poneyland") - /// .and_modify(|_k, v| { *v += 1 }) - /// .or_insert("poneyland", 0); - /// assert_eq!(map["poneyland"], 43); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn and_modify(self, f: F) -> Self - where - F: FnOnce(&mut K, &mut V), - { - match self { - RawEntryMut::Occupied(mut entry) => { - { - let (k, v) = entry.get_key_value_mut(); - f(k, v); - } - RawEntryMut::Occupied(entry) - } - RawEntryMut::Vacant(entry) => RawEntryMut::Vacant(entry), - } - } - - /// Provides shared access to the key and owned access to the value of - /// an occupied entry and allows to replace or remove it based on the - /// value of the returned option. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// use hashbrown::hash_map::RawEntryMut; - /// - /// let mut map: HashMap<&str, u32> = HashMap::new(); - /// - /// let entry = map - /// .raw_entry_mut() - /// .from_key("poneyland") - /// .and_replace_entry_with(|_k, _v| panic!()); - /// - /// match entry { - /// RawEntryMut::Vacant(_) => {}, - /// RawEntryMut::Occupied(_) => panic!(), - /// } - /// - /// map.insert("poneyland", 42); - /// - /// let entry = map - /// .raw_entry_mut() - /// .from_key("poneyland") - /// .and_replace_entry_with(|k, v| { - /// assert_eq!(k, &"poneyland"); - /// assert_eq!(v, 42); - /// Some(v + 1) - /// }); - /// - /// match entry { - /// RawEntryMut::Occupied(e) => { - /// assert_eq!(e.key(), &"poneyland"); - /// assert_eq!(e.get(), &43); - /// }, - /// RawEntryMut::Vacant(_) => panic!(), - /// } - /// - /// assert_eq!(map["poneyland"], 43); - /// - /// let entry = map - /// .raw_entry_mut() - /// .from_key("poneyland") - /// .and_replace_entry_with(|_k, _v| None); - /// - /// match entry { - /// RawEntryMut::Vacant(_) => {}, - /// RawEntryMut::Occupied(_) => panic!(), - /// } - /// - /// assert!(!map.contains_key("poneyland")); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn and_replace_entry_with(self, f: F) -> Self - where - F: FnOnce(&K, V) -> Option, - { - match self { - RawEntryMut::Occupied(entry) => entry.replace_entry_with(f), - RawEntryMut::Vacant(_) => self, - } - } -} - -impl<'a, K, V, S, A: Allocator + Clone> RawOccupiedEntryMut<'a, K, V, S, A> { - /// Gets a reference to the key in the entry. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::hash_map::{HashMap, RawEntryMut}; - /// - /// let mut map: HashMap<&str, u32> = [("a", 100), ("b", 200)].into(); - /// - /// match map.raw_entry_mut().from_key(&"a") { - /// RawEntryMut::Vacant(_) => panic!(), - /// RawEntryMut::Occupied(o) => assert_eq!(o.key(), &"a") - /// } - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn key(&self) -> &K { - unsafe { &self.elem.as_ref().0 } - } - - /// Gets a mutable reference to the key in the entry. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::hash_map::{HashMap, RawEntryMut}; - /// use std::rc::Rc; - /// - /// let key_one = Rc::new("a"); - /// let key_two = Rc::new("a"); - /// - /// let mut map: HashMap, u32> = HashMap::new(); - /// map.insert(key_one.clone(), 10); - /// - /// assert_eq!(map[&key_one], 10); - /// assert!(Rc::strong_count(&key_one) == 2 && Rc::strong_count(&key_two) == 1); - /// - /// match map.raw_entry_mut().from_key(&key_one) { - /// RawEntryMut::Vacant(_) => panic!(), - /// RawEntryMut::Occupied(mut o) => { - /// *o.key_mut() = key_two.clone(); - /// } - /// } - /// assert_eq!(map[&key_two], 10); - /// assert!(Rc::strong_count(&key_one) == 1 && Rc::strong_count(&key_two) == 2); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn key_mut(&mut self) -> &mut K { - unsafe { &mut self.elem.as_mut().0 } - } - - /// Converts the entry into a mutable reference to the key in the entry - /// with a lifetime bound to the map itself. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::hash_map::{HashMap, RawEntryMut}; - /// use std::rc::Rc; - /// - /// let key_one = Rc::new("a"); - /// let key_two = Rc::new("a"); - /// - /// let mut map: HashMap, u32> = HashMap::new(); - /// map.insert(key_one.clone(), 10); - /// - /// assert_eq!(map[&key_one], 10); - /// assert!(Rc::strong_count(&key_one) == 2 && Rc::strong_count(&key_two) == 1); - /// - /// let inside_key: &mut Rc<&str>; - /// - /// match map.raw_entry_mut().from_key(&key_one) { - /// RawEntryMut::Vacant(_) => panic!(), - /// RawEntryMut::Occupied(o) => inside_key = o.into_key(), - /// } - /// *inside_key = key_two.clone(); - /// - /// assert_eq!(map[&key_two], 10); - /// assert!(Rc::strong_count(&key_one) == 1 && Rc::strong_count(&key_two) == 2); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn into_key(self) -> &'a mut K { - unsafe { &mut self.elem.as_mut().0 } - } - - /// Gets a reference to the value in the entry. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::hash_map::{HashMap, RawEntryMut}; - /// - /// let mut map: HashMap<&str, u32> = [("a", 100), ("b", 200)].into(); - /// - /// match map.raw_entry_mut().from_key(&"a") { - /// RawEntryMut::Vacant(_) => panic!(), - /// RawEntryMut::Occupied(o) => assert_eq!(o.get(), &100), - /// } - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn get(&self) -> &V { - unsafe { &self.elem.as_ref().1 } - } - - /// Converts the OccupiedEntry into a mutable reference to the value in the entry - /// with a lifetime bound to the map itself. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::hash_map::{HashMap, RawEntryMut}; - /// - /// let mut map: HashMap<&str, u32> = [("a", 100), ("b", 200)].into(); - /// - /// let value: &mut u32; - /// - /// match map.raw_entry_mut().from_key(&"a") { - /// RawEntryMut::Vacant(_) => panic!(), - /// RawEntryMut::Occupied(o) => value = o.into_mut(), - /// } - /// *value += 900; - /// - /// assert_eq!(map[&"a"], 1000); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn into_mut(self) -> &'a mut V { - unsafe { &mut self.elem.as_mut().1 } - } - - /// Gets a mutable reference to the value in the entry. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::hash_map::{HashMap, RawEntryMut}; - /// - /// let mut map: HashMap<&str, u32> = [("a", 100), ("b", 200)].into(); - /// - /// match map.raw_entry_mut().from_key(&"a") { - /// RawEntryMut::Vacant(_) => panic!(), - /// RawEntryMut::Occupied(mut o) => *o.get_mut() += 900, - /// } - /// - /// assert_eq!(map[&"a"], 1000); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn get_mut(&mut self) -> &mut V { - unsafe { &mut self.elem.as_mut().1 } - } - - /// Gets a reference to the key and value in the entry. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::hash_map::{HashMap, RawEntryMut}; - /// - /// let mut map: HashMap<&str, u32> = [("a", 100), ("b", 200)].into(); - /// - /// match map.raw_entry_mut().from_key(&"a") { - /// RawEntryMut::Vacant(_) => panic!(), - /// RawEntryMut::Occupied(o) => assert_eq!(o.get_key_value(), (&"a", &100)), - /// } - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn get_key_value(&self) -> (&K, &V) { - unsafe { - let &(ref key, ref value) = self.elem.as_ref(); - (key, value) - } - } - - /// Gets a mutable reference to the key and value in the entry. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::hash_map::{HashMap, RawEntryMut}; - /// use std::rc::Rc; - /// - /// let key_one = Rc::new("a"); - /// let key_two = Rc::new("a"); - /// - /// let mut map: HashMap, u32> = HashMap::new(); - /// map.insert(key_one.clone(), 10); - /// - /// assert_eq!(map[&key_one], 10); - /// assert!(Rc::strong_count(&key_one) == 2 && Rc::strong_count(&key_two) == 1); - /// - /// match map.raw_entry_mut().from_key(&key_one) { - /// RawEntryMut::Vacant(_) => panic!(), - /// RawEntryMut::Occupied(mut o) => { - /// let (inside_key, inside_value) = o.get_key_value_mut(); - /// *inside_key = key_two.clone(); - /// *inside_value = 100; - /// } - /// } - /// assert_eq!(map[&key_two], 100); - /// assert!(Rc::strong_count(&key_one) == 1 && Rc::strong_count(&key_two) == 2); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn get_key_value_mut(&mut self) -> (&mut K, &mut V) { - unsafe { - let &mut (ref mut key, ref mut value) = self.elem.as_mut(); - (key, value) - } - } - - /// Converts the OccupiedEntry into a mutable reference to the key and value in the entry - /// with a lifetime bound to the map itself. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::hash_map::{HashMap, RawEntryMut}; - /// use std::rc::Rc; - /// - /// let key_one = Rc::new("a"); - /// let key_two = Rc::new("a"); - /// - /// let mut map: HashMap, u32> = HashMap::new(); - /// map.insert(key_one.clone(), 10); - /// - /// assert_eq!(map[&key_one], 10); - /// assert!(Rc::strong_count(&key_one) == 2 && Rc::strong_count(&key_two) == 1); - /// - /// let inside_key: &mut Rc<&str>; - /// let inside_value: &mut u32; - /// match map.raw_entry_mut().from_key(&key_one) { - /// RawEntryMut::Vacant(_) => panic!(), - /// RawEntryMut::Occupied(o) => { - /// let tuple = o.into_key_value(); - /// inside_key = tuple.0; - /// inside_value = tuple.1; - /// } - /// } - /// *inside_key = key_two.clone(); - /// *inside_value = 100; - /// assert_eq!(map[&key_two], 100); - /// assert!(Rc::strong_count(&key_one) == 1 && Rc::strong_count(&key_two) == 2); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn into_key_value(self) -> (&'a mut K, &'a mut V) { - unsafe { - let &mut (ref mut key, ref mut value) = self.elem.as_mut(); - (key, value) - } - } - - /// Sets the value of the entry, and returns the entry's old value. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::hash_map::{HashMap, RawEntryMut}; - /// - /// let mut map: HashMap<&str, u32> = [("a", 100), ("b", 200)].into(); - /// - /// match map.raw_entry_mut().from_key(&"a") { - /// RawEntryMut::Vacant(_) => panic!(), - /// RawEntryMut::Occupied(mut o) => assert_eq!(o.insert(1000), 100), - /// } - /// - /// assert_eq!(map[&"a"], 1000); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn insert(&mut self, value: V) -> V { - mem::replace(self.get_mut(), value) - } - - /// Sets the value of the entry, and returns the entry's old value. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::hash_map::{HashMap, RawEntryMut}; - /// use std::rc::Rc; - /// - /// let key_one = Rc::new("a"); - /// let key_two = Rc::new("a"); - /// - /// let mut map: HashMap, u32> = HashMap::new(); - /// map.insert(key_one.clone(), 10); - /// - /// assert_eq!(map[&key_one], 10); - /// assert!(Rc::strong_count(&key_one) == 2 && Rc::strong_count(&key_two) == 1); - /// - /// match map.raw_entry_mut().from_key(&key_one) { - /// RawEntryMut::Vacant(_) => panic!(), - /// RawEntryMut::Occupied(mut o) => { - /// let old_key = o.insert_key(key_two.clone()); - /// assert!(Rc::ptr_eq(&old_key, &key_one)); - /// } - /// } - /// assert_eq!(map[&key_two], 10); - /// assert!(Rc::strong_count(&key_one) == 1 && Rc::strong_count(&key_two) == 2); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn insert_key(&mut self, key: K) -> K { - mem::replace(self.key_mut(), key) - } - - /// Takes the value out of the entry, and returns it. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::hash_map::{HashMap, RawEntryMut}; - /// - /// let mut map: HashMap<&str, u32> = [("a", 100), ("b", 200)].into(); - /// - /// match map.raw_entry_mut().from_key(&"a") { - /// RawEntryMut::Vacant(_) => panic!(), - /// RawEntryMut::Occupied(o) => assert_eq!(o.remove(), 100), - /// } - /// assert_eq!(map.get(&"a"), None); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn remove(self) -> V { - self.remove_entry().1 - } - - /// Take the ownership of the key and value from the map. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::hash_map::{HashMap, RawEntryMut}; - /// - /// let mut map: HashMap<&str, u32> = [("a", 100), ("b", 200)].into(); - /// - /// match map.raw_entry_mut().from_key(&"a") { - /// RawEntryMut::Vacant(_) => panic!(), - /// RawEntryMut::Occupied(o) => assert_eq!(o.remove_entry(), ("a", 100)), - /// } - /// assert_eq!(map.get(&"a"), None); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn remove_entry(self) -> (K, V) { - unsafe { self.table.remove(self.elem) } - } - - /// Provides shared access to the key and owned access to the value of - /// the entry and allows to replace or remove it based on the - /// value of the returned option. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::hash_map::{HashMap, RawEntryMut}; - /// - /// let mut map: HashMap<&str, u32> = [("a", 100), ("b", 200)].into(); - /// - /// let raw_entry = match map.raw_entry_mut().from_key(&"a") { - /// RawEntryMut::Vacant(_) => panic!(), - /// RawEntryMut::Occupied(o) => o.replace_entry_with(|k, v| { - /// assert_eq!(k, &"a"); - /// assert_eq!(v, 100); - /// Some(v + 900) - /// }), - /// }; - /// let raw_entry = match raw_entry { - /// RawEntryMut::Vacant(_) => panic!(), - /// RawEntryMut::Occupied(o) => o.replace_entry_with(|k, v| { - /// assert_eq!(k, &"a"); - /// assert_eq!(v, 1000); - /// None - /// }), - /// }; - /// match raw_entry { - /// RawEntryMut::Vacant(_) => { }, - /// RawEntryMut::Occupied(_) => panic!(), - /// }; - /// assert_eq!(map.get(&"a"), None); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn replace_entry_with(self, f: F) -> RawEntryMut<'a, K, V, S, A> - where - F: FnOnce(&K, V) -> Option, - { - unsafe { - let still_occupied = self - .table - .replace_bucket_with(self.elem.clone(), |(key, value)| { - f(&key, value).map(|new_value| (key, new_value)) - }); - - if still_occupied { - RawEntryMut::Occupied(self) - } else { - RawEntryMut::Vacant(RawVacantEntryMut { - table: self.table, - hash_builder: self.hash_builder, - }) - } - } - } -} - -impl<'a, K, V, S, A: Allocator + Clone> RawVacantEntryMut<'a, K, V, S, A> { - /// Sets the value of the entry with the VacantEntry's key, - /// and returns a mutable reference to it. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::hash_map::{HashMap, RawEntryMut}; - /// - /// let mut map: HashMap<&str, u32> = [("a", 100), ("b", 200)].into(); - /// - /// match map.raw_entry_mut().from_key(&"c") { - /// RawEntryMut::Occupied(_) => panic!(), - /// RawEntryMut::Vacant(v) => assert_eq!(v.insert("c", 300), (&mut "c", &mut 300)), - /// } - /// - /// assert_eq!(map[&"c"], 300); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn insert(self, key: K, value: V) -> (&'a mut K, &'a mut V) - where - K: Hash, - S: BuildHasher, - { - let hash = make_insert_hash::(self.hash_builder, &key); - self.insert_hashed_nocheck(hash, key, value) - } - - /// Sets the value of the entry with the VacantEntry's key, - /// and returns a mutable reference to it. - /// - /// # Examples - /// - /// ``` - /// use core::hash::{BuildHasher, Hash}; - /// use hashbrown::hash_map::{HashMap, RawEntryMut}; - /// - /// fn compute_hash(hash_builder: &S, key: &K) -> u64 { - /// use core::hash::Hasher; - /// let mut state = hash_builder.build_hasher(); - /// key.hash(&mut state); - /// state.finish() - /// } - /// - /// let mut map: HashMap<&str, u32> = [("a", 100), ("b", 200)].into(); - /// let key = "c"; - /// let hash = compute_hash(map.hasher(), &key); - /// - /// match map.raw_entry_mut().from_key_hashed_nocheck(hash, &key) { - /// RawEntryMut::Occupied(_) => panic!(), - /// RawEntryMut::Vacant(v) => assert_eq!( - /// v.insert_hashed_nocheck(hash, key, 300), - /// (&mut "c", &mut 300) - /// ), - /// } - /// - /// assert_eq!(map[&"c"], 300); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - #[allow(clippy::shadow_unrelated)] - pub fn insert_hashed_nocheck(self, hash: u64, key: K, value: V) -> (&'a mut K, &'a mut V) - where - K: Hash, - S: BuildHasher, - { - let &mut (ref mut k, ref mut v) = self.table.insert_entry( - hash, - (key, value), - make_hasher::<_, V, S>(self.hash_builder), - ); - (k, v) - } - - /// Set the value of an entry with a custom hasher function. - /// - /// # Examples - /// - /// ``` - /// use core::hash::{BuildHasher, Hash}; - /// use hashbrown::hash_map::{HashMap, RawEntryMut}; - /// - /// fn make_hasher(hash_builder: &S) -> impl Fn(&K) -> u64 + '_ - /// where - /// K: Hash + ?Sized, - /// S: BuildHasher, - /// { - /// move |key: &K| { - /// use core::hash::Hasher; - /// let mut state = hash_builder.build_hasher(); - /// key.hash(&mut state); - /// state.finish() - /// } - /// } - /// - /// let mut map: HashMap<&str, u32> = HashMap::new(); - /// let key = "a"; - /// let hash_builder = map.hasher().clone(); - /// let hash = make_hasher(&hash_builder)(&key); - /// - /// match map.raw_entry_mut().from_hash(hash, |q| q == &key) { - /// RawEntryMut::Occupied(_) => panic!(), - /// RawEntryMut::Vacant(v) => assert_eq!( - /// v.insert_with_hasher(hash, key, 100, make_hasher(&hash_builder)), - /// (&mut "a", &mut 100) - /// ), - /// } - /// map.extend([("b", 200), ("c", 300), ("d", 400), ("e", 500), ("f", 600)]); - /// assert_eq!(map[&"a"], 100); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn insert_with_hasher( - self, - hash: u64, - key: K, - value: V, - hasher: H, - ) -> (&'a mut K, &'a mut V) - where - H: Fn(&K) -> u64, - { - let &mut (ref mut k, ref mut v) = self - .table - .insert_entry(hash, (key, value), |x| hasher(&x.0)); - (k, v) - } - - #[cfg_attr(feature = "inline-more", inline)] - fn insert_entry(self, key: K, value: V) -> RawOccupiedEntryMut<'a, K, V, S, A> - where - K: Hash, - S: BuildHasher, - { - let hash = make_insert_hash::(self.hash_builder, &key); - let elem = self.table.insert( - hash, - (key, value), - make_hasher::<_, V, S>(self.hash_builder), - ); - RawOccupiedEntryMut { - elem, - table: self.table, - hash_builder: self.hash_builder, - } - } -} - -impl Debug for RawEntryBuilderMut<'_, K, V, S, A> { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("RawEntryBuilder").finish() - } -} - -impl Debug for RawEntryMut<'_, K, V, S, A> { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match *self { - RawEntryMut::Vacant(ref v) => f.debug_tuple("RawEntry").field(v).finish(), - RawEntryMut::Occupied(ref o) => f.debug_tuple("RawEntry").field(o).finish(), - } - } -} - -impl Debug for RawOccupiedEntryMut<'_, K, V, S, A> { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("RawOccupiedEntryMut") - .field("key", self.key()) - .field("value", self.get()) - .finish() - } -} - -impl Debug for RawVacantEntryMut<'_, K, V, S, A> { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("RawVacantEntryMut").finish() - } -} - -impl Debug for RawEntryBuilder<'_, K, V, S, A> { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("RawEntryBuilder").finish() - } -} - -/// A view into a single entry in a map, which may either be vacant or occupied. -/// -/// This `enum` is constructed from the [`entry`] method on [`HashMap`]. -/// -/// [`HashMap`]: struct.HashMap.html -/// [`entry`]: struct.HashMap.html#method.entry -/// -/// # Examples -/// -/// ``` -/// use hashbrown::hash_map::{Entry, HashMap, OccupiedEntry}; -/// -/// let mut map = HashMap::new(); -/// map.extend([("a", 10), ("b", 20), ("c", 30)]); -/// assert_eq!(map.len(), 3); -/// -/// // Existing key (insert) -/// let entry: Entry<_, _, _> = map.entry("a"); -/// let _raw_o: OccupiedEntry<_, _, _> = entry.insert(1); -/// assert_eq!(map.len(), 3); -/// // Nonexistent key (insert) -/// map.entry("d").insert(4); -/// -/// // Existing key (or_insert) -/// let v = map.entry("b").or_insert(2); -/// assert_eq!(std::mem::replace(v, 2), 20); -/// // Nonexistent key (or_insert) -/// map.entry("e").or_insert(5); -/// -/// // Existing key (or_insert_with) -/// let v = map.entry("c").or_insert_with(|| 3); -/// assert_eq!(std::mem::replace(v, 3), 30); -/// // Nonexistent key (or_insert_with) -/// map.entry("f").or_insert_with(|| 6); -/// -/// println!("Our HashMap: {:?}", map); -/// -/// let mut vec: Vec<_> = map.iter().map(|(&k, &v)| (k, v)).collect(); -/// // The `Iter` iterator produces items in arbitrary order, so the -/// // items must be sorted to test them against a sorted array. -/// vec.sort_unstable(); -/// assert_eq!(vec, [("a", 1), ("b", 2), ("c", 3), ("d", 4), ("e", 5), ("f", 6)]); -/// ``` -pub enum Entry<'a, K, V, S, A = Global> -where - A: Allocator + Clone, -{ - /// An occupied entry. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::hash_map::{Entry, HashMap}; - /// let mut map: HashMap<_, _> = [("a", 100), ("b", 200)].into(); - /// - /// match map.entry("a") { - /// Entry::Vacant(_) => unreachable!(), - /// Entry::Occupied(_) => { } - /// } - /// ``` - Occupied(OccupiedEntry<'a, K, V, S, A>), - - /// A vacant entry. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::hash_map::{Entry, HashMap}; - /// let mut map: HashMap<&str, i32> = HashMap::new(); - /// - /// match map.entry("a") { - /// Entry::Occupied(_) => unreachable!(), - /// Entry::Vacant(_) => { } - /// } - /// ``` - Vacant(VacantEntry<'a, K, V, S, A>), -} - -impl Debug for Entry<'_, K, V, S, A> { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match *self { - Entry::Vacant(ref v) => f.debug_tuple("Entry").field(v).finish(), - Entry::Occupied(ref o) => f.debug_tuple("Entry").field(o).finish(), - } - } -} - -/// A view into an occupied entry in a `HashMap`. -/// It is part of the [`Entry`] enum. -/// -/// [`Entry`]: enum.Entry.html -/// -/// # Examples -/// -/// ``` -/// use hashbrown::hash_map::{Entry, HashMap, OccupiedEntry}; -/// -/// let mut map = HashMap::new(); -/// map.extend([("a", 10), ("b", 20), ("c", 30)]); -/// -/// let _entry_o: OccupiedEntry<_, _, _> = map.entry("a").insert(100); -/// assert_eq!(map.len(), 3); -/// -/// // Existing key (insert and update) -/// match map.entry("a") { -/// Entry::Vacant(_) => unreachable!(), -/// Entry::Occupied(mut view) => { -/// assert_eq!(view.get(), &100); -/// let v = view.get_mut(); -/// *v *= 10; -/// assert_eq!(view.insert(1111), 1000); -/// } -/// } -/// -/// assert_eq!(map[&"a"], 1111); -/// assert_eq!(map.len(), 3); -/// -/// // Existing key (take) -/// match map.entry("c") { -/// Entry::Vacant(_) => unreachable!(), -/// Entry::Occupied(view) => { -/// assert_eq!(view.remove_entry(), ("c", 30)); -/// } -/// } -/// assert_eq!(map.get(&"c"), None); -/// assert_eq!(map.len(), 2); -/// ``` -pub struct OccupiedEntry<'a, K, V, S, A: Allocator + Clone = Global> { - hash: u64, - key: Option, - elem: Bucket<(K, V)>, - table: &'a mut HashMap, -} - -unsafe impl Send for OccupiedEntry<'_, K, V, S, A> -where - K: Send, - V: Send, - S: Send, - A: Send + Allocator + Clone, -{ -} -unsafe impl Sync for OccupiedEntry<'_, K, V, S, A> -where - K: Sync, - V: Sync, - S: Sync, - A: Sync + Allocator + Clone, -{ -} - -impl Debug for OccupiedEntry<'_, K, V, S, A> { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("OccupiedEntry") - .field("key", self.key()) - .field("value", self.get()) - .finish() - } -} - -/// A view into a vacant entry in a `HashMap`. -/// It is part of the [`Entry`] enum. -/// -/// [`Entry`]: enum.Entry.html -/// -/// # Examples -/// -/// ``` -/// use hashbrown::hash_map::{Entry, HashMap, VacantEntry}; -/// -/// let mut map = HashMap::<&str, i32>::new(); -/// -/// let entry_v: VacantEntry<_, _, _> = match map.entry("a") { -/// Entry::Vacant(view) => view, -/// Entry::Occupied(_) => unreachable!(), -/// }; -/// entry_v.insert(10); -/// assert!(map[&"a"] == 10 && map.len() == 1); -/// -/// // Nonexistent key (insert and update) -/// match map.entry("b") { -/// Entry::Occupied(_) => unreachable!(), -/// Entry::Vacant(view) => { -/// let value = view.insert(2); -/// assert_eq!(*value, 2); -/// *value = 20; -/// } -/// } -/// assert!(map[&"b"] == 20 && map.len() == 2); -/// ``` -pub struct VacantEntry<'a, K, V, S, A: Allocator + Clone = Global> { - hash: u64, - key: K, - table: &'a mut HashMap, -} - -impl Debug for VacantEntry<'_, K, V, S, A> { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_tuple("VacantEntry").field(self.key()).finish() - } -} - -/// A view into a single entry in a map, which may either be vacant or occupied, -/// with any borrowed form of the map's key type. -/// -/// -/// This `enum` is constructed from the [`entry_ref`] method on [`HashMap`]. -/// -/// [`Hash`] and [`Eq`] on the borrowed form of the map's key type *must* match those -/// for the key type. It also require that key may be constructed from the borrowed -/// form through the [`From`] trait. -/// -/// [`HashMap`]: struct.HashMap.html -/// [`entry_ref`]: struct.HashMap.html#method.entry_ref -/// [`Eq`]: https://doc.rust-lang.org/std/cmp/trait.Eq.html -/// [`Hash`]: https://doc.rust-lang.org/std/hash/trait.Hash.html -/// [`From`]: https://doc.rust-lang.org/std/convert/trait.From.html -/// -/// # Examples -/// -/// ``` -/// use hashbrown::hash_map::{EntryRef, HashMap, OccupiedEntryRef}; -/// -/// let mut map = HashMap::new(); -/// map.extend([("a".to_owned(), 10), ("b".into(), 20), ("c".into(), 30)]); -/// assert_eq!(map.len(), 3); -/// -/// // Existing key (insert) -/// let key = String::from("a"); -/// let entry: EntryRef<_, _, _, _> = map.entry_ref(&key); -/// let _raw_o: OccupiedEntryRef<_, _, _, _> = entry.insert(1); -/// assert_eq!(map.len(), 3); -/// // Nonexistent key (insert) -/// map.entry_ref("d").insert(4); -/// -/// // Existing key (or_insert) -/// let v = map.entry_ref("b").or_insert(2); -/// assert_eq!(std::mem::replace(v, 2), 20); -/// // Nonexistent key (or_insert) -/// map.entry_ref("e").or_insert(5); -/// -/// // Existing key (or_insert_with) -/// let v = map.entry_ref("c").or_insert_with(|| 3); -/// assert_eq!(std::mem::replace(v, 3), 30); -/// // Nonexistent key (or_insert_with) -/// map.entry_ref("f").or_insert_with(|| 6); -/// -/// println!("Our HashMap: {:?}", map); -/// -/// for (key, value) in ["a", "b", "c", "d", "e", "f"].into_iter().zip(1..=6) { -/// assert_eq!(map[key], value) -/// } -/// assert_eq!(map.len(), 6); -/// ``` -pub enum EntryRef<'a, 'b, K, Q: ?Sized, V, S, A = Global> -where - A: Allocator + Clone, -{ - /// An occupied entry. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::hash_map::{EntryRef, HashMap}; - /// let mut map: HashMap<_, _> = [("a".to_owned(), 100), ("b".into(), 200)].into(); - /// - /// match map.entry_ref("a") { - /// EntryRef::Vacant(_) => unreachable!(), - /// EntryRef::Occupied(_) => { } - /// } - /// ``` - Occupied(OccupiedEntryRef<'a, 'b, K, Q, V, S, A>), - - /// A vacant entry. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::hash_map::{EntryRef, HashMap}; - /// let mut map: HashMap = HashMap::new(); - /// - /// match map.entry_ref("a") { - /// EntryRef::Occupied(_) => unreachable!(), - /// EntryRef::Vacant(_) => { } - /// } - /// ``` - Vacant(VacantEntryRef<'a, 'b, K, Q, V, S, A>), -} - -impl, Q: ?Sized + Debug, V: Debug, S, A: Allocator + Clone> Debug - for EntryRef<'_, '_, K, Q, V, S, A> -{ - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match *self { - EntryRef::Vacant(ref v) => f.debug_tuple("EntryRef").field(v).finish(), - EntryRef::Occupied(ref o) => f.debug_tuple("EntryRef").field(o).finish(), - } - } -} - -enum KeyOrRef<'a, K, Q: ?Sized> { - Borrowed(&'a Q), - Owned(K), -} - -impl<'a, K, Q: ?Sized> KeyOrRef<'a, K, Q> { - fn into_owned(self) -> K - where - K: From<&'a Q>, - { - match self { - Self::Borrowed(borrowed) => borrowed.into(), - Self::Owned(owned) => owned, - } - } -} - -impl<'a, K: Borrow, Q: ?Sized> AsRef for KeyOrRef<'a, K, Q> { - fn as_ref(&self) -> &Q { - match self { - Self::Borrowed(borrowed) => borrowed, - Self::Owned(owned) => owned.borrow(), - } - } -} - -/// A view into an occupied entry in a `HashMap`. -/// It is part of the [`EntryRef`] enum. -/// -/// [`EntryRef`]: enum.EntryRef.html -/// -/// # Examples -/// -/// ``` -/// use hashbrown::hash_map::{EntryRef, HashMap, OccupiedEntryRef}; -/// -/// let mut map = HashMap::new(); -/// map.extend([("a".to_owned(), 10), ("b".into(), 20), ("c".into(), 30)]); -/// -/// let key = String::from("a"); -/// let _entry_o: OccupiedEntryRef<_, _, _, _> = map.entry_ref(&key).insert(100); -/// assert_eq!(map.len(), 3); -/// -/// // Existing key (insert and update) -/// match map.entry_ref("a") { -/// EntryRef::Vacant(_) => unreachable!(), -/// EntryRef::Occupied(mut view) => { -/// assert_eq!(view.get(), &100); -/// let v = view.get_mut(); -/// *v *= 10; -/// assert_eq!(view.insert(1111), 1000); -/// } -/// } -/// -/// assert_eq!(map["a"], 1111); -/// assert_eq!(map.len(), 3); -/// -/// // Existing key (take) -/// match map.entry_ref("c") { -/// EntryRef::Vacant(_) => unreachable!(), -/// EntryRef::Occupied(view) => { -/// assert_eq!(view.remove_entry(), ("c".to_owned(), 30)); -/// } -/// } -/// assert_eq!(map.get("c"), None); -/// assert_eq!(map.len(), 2); -/// ``` -pub struct OccupiedEntryRef<'a, 'b, K, Q: ?Sized, V, S, A: Allocator + Clone = Global> { - hash: u64, - key: Option>, - elem: Bucket<(K, V)>, - table: &'a mut HashMap, -} - -unsafe impl<'a, 'b, K, Q, V, S, A> Send for OccupiedEntryRef<'a, 'b, K, Q, V, S, A> -where - K: Send, - Q: Sync + ?Sized, - V: Send, - S: Send, - A: Send + Allocator + Clone, -{ -} -unsafe impl<'a, 'b, K, Q, V, S, A> Sync for OccupiedEntryRef<'a, 'b, K, Q, V, S, A> -where - K: Sync, - Q: Sync + ?Sized, - V: Sync, - S: Sync, - A: Sync + Allocator + Clone, -{ -} - -impl, Q: ?Sized + Debug, V: Debug, S, A: Allocator + Clone> Debug - for OccupiedEntryRef<'_, '_, K, Q, V, S, A> -{ - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("OccupiedEntryRef") - .field("key", &self.key()) - .field("value", &self.get()) - .finish() - } -} - -/// A view into a vacant entry in a `HashMap`. -/// It is part of the [`EntryRef`] enum. -/// -/// [`EntryRef`]: enum.EntryRef.html -/// -/// # Examples -/// -/// ``` -/// use hashbrown::hash_map::{EntryRef, HashMap, VacantEntryRef}; -/// -/// let mut map = HashMap::::new(); -/// -/// let entry_v: VacantEntryRef<_, _, _, _> = match map.entry_ref("a") { -/// EntryRef::Vacant(view) => view, -/// EntryRef::Occupied(_) => unreachable!(), -/// }; -/// entry_v.insert(10); -/// assert!(map["a"] == 10 && map.len() == 1); -/// -/// // Nonexistent key (insert and update) -/// match map.entry_ref("b") { -/// EntryRef::Occupied(_) => unreachable!(), -/// EntryRef::Vacant(view) => { -/// let value = view.insert(2); -/// assert_eq!(*value, 2); -/// *value = 20; -/// } -/// } -/// assert!(map["b"] == 20 && map.len() == 2); -/// ``` -pub struct VacantEntryRef<'a, 'b, K, Q: ?Sized, V, S, A: Allocator + Clone = Global> { - hash: u64, - key: KeyOrRef<'b, K, Q>, - table: &'a mut HashMap, -} - -impl, Q: ?Sized + Debug, V, S, A: Allocator + Clone> Debug - for VacantEntryRef<'_, '_, K, Q, V, S, A> -{ - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_tuple("VacantEntryRef").field(&self.key()).finish() - } -} - -/// The error returned by [`try_insert`](HashMap::try_insert) when the key already exists. -/// -/// Contains the occupied entry, and the value that was not inserted. -/// -/// # Examples -/// -/// ``` -/// use hashbrown::hash_map::{HashMap, OccupiedError}; -/// -/// let mut map: HashMap<_, _> = [("a", 10), ("b", 20)].into(); -/// -/// // try_insert method returns mutable reference to the value if keys are vacant, -/// // but if the map did have key present, nothing is updated, and the provided -/// // value is returned inside `Err(_)` variant -/// match map.try_insert("a", 100) { -/// Err(OccupiedError { mut entry, value }) => { -/// assert_eq!(entry.key(), &"a"); -/// assert_eq!(value, 100); -/// assert_eq!(entry.insert(100), 10) -/// } -/// _ => unreachable!(), -/// } -/// assert_eq!(map[&"a"], 100); -/// ``` -pub struct OccupiedError<'a, K, V, S, A: Allocator + Clone = Global> { - /// The entry in the map that was already occupied. - pub entry: OccupiedEntry<'a, K, V, S, A>, - /// The value which was not inserted, because the entry was already occupied. - pub value: V, -} - -impl Debug for OccupiedError<'_, K, V, S, A> { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("OccupiedError") - .field("key", self.entry.key()) - .field("old_value", self.entry.get()) - .field("new_value", &self.value) - .finish() - } -} - -impl<'a, K: Debug, V: Debug, S, A: Allocator + Clone> fmt::Display - for OccupiedError<'a, K, V, S, A> -{ - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!( - f, - "failed to insert {:?}, key {:?} already exists with value {:?}", - self.value, - self.entry.key(), - self.entry.get(), - ) - } -} - -impl<'a, K, V, S, A: Allocator + Clone> IntoIterator for &'a HashMap { - type Item = (&'a K, &'a V); - type IntoIter = Iter<'a, K, V>; - - /// Creates an iterator over the entries of a `HashMap` in arbitrary order. - /// The iterator element type is `(&'a K, &'a V)`. - /// - /// Return the same `Iter` struct as by the [`iter`] method on [`HashMap`]. - /// - /// [`iter`]: struct.HashMap.html#method.iter - /// [`HashMap`]: struct.HashMap.html - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// let map_one: HashMap<_, _> = [(1, "a"), (2, "b"), (3, "c")].into(); - /// let mut map_two = HashMap::new(); - /// - /// for (key, value) in &map_one { - /// println!("Key: {}, Value: {}", key, value); - /// map_two.insert_unique_unchecked(*key, *value); - /// } - /// - /// assert_eq!(map_one, map_two); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - fn into_iter(self) -> Iter<'a, K, V> { - self.iter() - } -} - -impl<'a, K, V, S, A: Allocator + Clone> IntoIterator for &'a mut HashMap { - type Item = (&'a K, &'a mut V); - type IntoIter = IterMut<'a, K, V>; - - /// Creates an iterator over the entries of a `HashMap` in arbitrary order - /// with mutable references to the values. The iterator element type is - /// `(&'a K, &'a mut V)`. - /// - /// Return the same `IterMut` struct as by the [`iter_mut`] method on - /// [`HashMap`]. - /// - /// [`iter_mut`]: struct.HashMap.html#method.iter_mut - /// [`HashMap`]: struct.HashMap.html - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// let mut map: HashMap<_, _> = [("a", 1), ("b", 2), ("c", 3)].into(); - /// - /// for (key, value) in &mut map { - /// println!("Key: {}, Value: {}", key, value); - /// *value *= 2; - /// } - /// - /// let mut vec = map.iter().collect::>(); - /// // The `Iter` iterator produces items in arbitrary order, so the - /// // items must be sorted to test them against a sorted array. - /// vec.sort_unstable(); - /// assert_eq!(vec, [(&"a", &2), (&"b", &4), (&"c", &6)]); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - fn into_iter(self) -> IterMut<'a, K, V> { - self.iter_mut() - } -} - -impl IntoIterator for HashMap { - type Item = (K, V); - type IntoIter = IntoIter; - - /// Creates a consuming iterator, that is, one that moves each key-value - /// pair out of the map in arbitrary order. The map cannot be used after - /// calling this. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// - /// let map: HashMap<_, _> = [("a", 1), ("b", 2), ("c", 3)].into(); - /// - /// // Not possible with .iter() - /// let mut vec: Vec<(&str, i32)> = map.into_iter().collect(); - /// // The `IntoIter` iterator produces items in arbitrary order, so - /// // the items must be sorted to test them against a sorted array. - /// vec.sort_unstable(); - /// assert_eq!(vec, [("a", 1), ("b", 2), ("c", 3)]); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - fn into_iter(self) -> IntoIter { - IntoIter { - inner: self.table.into_iter(), - } - } -} - -impl<'a, K, V> Iterator for Iter<'a, K, V> { - type Item = (&'a K, &'a V); - - #[cfg_attr(feature = "inline-more", inline)] - fn next(&mut self) -> Option<(&'a K, &'a V)> { - // Avoid `Option::map` because it bloats LLVM IR. - match self.inner.next() { - Some(x) => unsafe { - let r = x.as_ref(); - Some((&r.0, &r.1)) - }, - None => None, - } - } - #[cfg_attr(feature = "inline-more", inline)] - fn size_hint(&self) -> (usize, Option) { - self.inner.size_hint() - } -} -impl ExactSizeIterator for Iter<'_, K, V> { - #[cfg_attr(feature = "inline-more", inline)] - fn len(&self) -> usize { - self.inner.len() - } -} - -impl FusedIterator for Iter<'_, K, V> {} - -impl<'a, K, V> Iterator for IterMut<'a, K, V> { - type Item = (&'a K, &'a mut V); - - #[cfg_attr(feature = "inline-more", inline)] - fn next(&mut self) -> Option<(&'a K, &'a mut V)> { - // Avoid `Option::map` because it bloats LLVM IR. - match self.inner.next() { - Some(x) => unsafe { - let r = x.as_mut(); - Some((&r.0, &mut r.1)) - }, - None => None, - } - } - #[cfg_attr(feature = "inline-more", inline)] - fn size_hint(&self) -> (usize, Option) { - self.inner.size_hint() - } -} -impl ExactSizeIterator for IterMut<'_, K, V> { - #[cfg_attr(feature = "inline-more", inline)] - fn len(&self) -> usize { - self.inner.len() - } -} -impl FusedIterator for IterMut<'_, K, V> {} - -impl fmt::Debug for IterMut<'_, K, V> -where - K: fmt::Debug, - V: fmt::Debug, -{ - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_list().entries(self.iter()).finish() - } -} - -impl Iterator for IntoIter { - type Item = (K, V); - - #[cfg_attr(feature = "inline-more", inline)] - fn next(&mut self) -> Option<(K, V)> { - self.inner.next() - } - #[cfg_attr(feature = "inline-more", inline)] - fn size_hint(&self) -> (usize, Option) { - self.inner.size_hint() - } -} -impl ExactSizeIterator for IntoIter { - #[cfg_attr(feature = "inline-more", inline)] - fn len(&self) -> usize { - self.inner.len() - } -} -impl FusedIterator for IntoIter {} - -impl fmt::Debug for IntoIter { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_list().entries(self.iter()).finish() - } -} - -impl<'a, K, V> Iterator for Keys<'a, K, V> { - type Item = &'a K; - - #[cfg_attr(feature = "inline-more", inline)] - fn next(&mut self) -> Option<&'a K> { - // Avoid `Option::map` because it bloats LLVM IR. - match self.inner.next() { - Some((k, _)) => Some(k), - None => None, - } - } - #[cfg_attr(feature = "inline-more", inline)] - fn size_hint(&self) -> (usize, Option) { - self.inner.size_hint() - } -} -impl ExactSizeIterator for Keys<'_, K, V> { - #[cfg_attr(feature = "inline-more", inline)] - fn len(&self) -> usize { - self.inner.len() - } -} -impl FusedIterator for Keys<'_, K, V> {} - -impl<'a, K, V> Iterator for Values<'a, K, V> { - type Item = &'a V; - - #[cfg_attr(feature = "inline-more", inline)] - fn next(&mut self) -> Option<&'a V> { - // Avoid `Option::map` because it bloats LLVM IR. - match self.inner.next() { - Some((_, v)) => Some(v), - None => None, - } - } - #[cfg_attr(feature = "inline-more", inline)] - fn size_hint(&self) -> (usize, Option) { - self.inner.size_hint() - } -} -impl ExactSizeIterator for Values<'_, K, V> { - #[cfg_attr(feature = "inline-more", inline)] - fn len(&self) -> usize { - self.inner.len() - } -} -impl FusedIterator for Values<'_, K, V> {} - -impl<'a, K, V> Iterator for ValuesMut<'a, K, V> { - type Item = &'a mut V; - - #[cfg_attr(feature = "inline-more", inline)] - fn next(&mut self) -> Option<&'a mut V> { - // Avoid `Option::map` because it bloats LLVM IR. - match self.inner.next() { - Some((_, v)) => Some(v), - None => None, - } - } - #[cfg_attr(feature = "inline-more", inline)] - fn size_hint(&self) -> (usize, Option) { - self.inner.size_hint() - } -} -impl ExactSizeIterator for ValuesMut<'_, K, V> { - #[cfg_attr(feature = "inline-more", inline)] - fn len(&self) -> usize { - self.inner.len() - } -} -impl FusedIterator for ValuesMut<'_, K, V> {} - -impl fmt::Debug for ValuesMut<'_, K, V> { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_list() - .entries(self.inner.iter().map(|(_, val)| val)) - .finish() - } -} - -impl<'a, K, V, A: Allocator + Clone> Iterator for Drain<'a, K, V, A> { - type Item = (K, V); - - #[cfg_attr(feature = "inline-more", inline)] - fn next(&mut self) -> Option<(K, V)> { - self.inner.next() - } - #[cfg_attr(feature = "inline-more", inline)] - fn size_hint(&self) -> (usize, Option) { - self.inner.size_hint() - } -} -impl ExactSizeIterator for Drain<'_, K, V, A> { - #[cfg_attr(feature = "inline-more", inline)] - fn len(&self) -> usize { - self.inner.len() - } -} -impl FusedIterator for Drain<'_, K, V, A> {} - -impl fmt::Debug for Drain<'_, K, V, A> -where - K: fmt::Debug, - V: fmt::Debug, - A: Allocator + Clone, -{ - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_list().entries(self.iter()).finish() - } -} - -impl<'a, K, V, S, A: Allocator + Clone> Entry<'a, K, V, S, A> { - /// Sets the value of the entry, and returns an OccupiedEntry. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// - /// let mut map: HashMap<&str, u32> = HashMap::new(); - /// let entry = map.entry("horseyland").insert(37); - /// - /// assert_eq!(entry.key(), &"horseyland"); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn insert(self, value: V) -> OccupiedEntry<'a, K, V, S, A> - where - K: Hash, - S: BuildHasher, - { - match self { - Entry::Occupied(mut entry) => { - entry.insert(value); - entry - } - Entry::Vacant(entry) => entry.insert_entry(value), - } - } - - /// Ensures a value is in the entry by inserting the default if empty, and returns - /// a mutable reference to the value in the entry. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// - /// let mut map: HashMap<&str, u32> = HashMap::new(); - /// - /// // nonexistent key - /// map.entry("poneyland").or_insert(3); - /// assert_eq!(map["poneyland"], 3); - /// - /// // existing key - /// *map.entry("poneyland").or_insert(10) *= 2; - /// assert_eq!(map["poneyland"], 6); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn or_insert(self, default: V) -> &'a mut V - where - K: Hash, - S: BuildHasher, - { - match self { - Entry::Occupied(entry) => entry.into_mut(), - Entry::Vacant(entry) => entry.insert(default), - } - } - - /// Ensures a value is in the entry by inserting the result of the default function if empty, - /// and returns a mutable reference to the value in the entry. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// - /// let mut map: HashMap<&str, u32> = HashMap::new(); - /// - /// // nonexistent key - /// map.entry("poneyland").or_insert_with(|| 3); - /// assert_eq!(map["poneyland"], 3); - /// - /// // existing key - /// *map.entry("poneyland").or_insert_with(|| 10) *= 2; - /// assert_eq!(map["poneyland"], 6); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn or_insert_with V>(self, default: F) -> &'a mut V - where - K: Hash, - S: BuildHasher, - { - match self { - Entry::Occupied(entry) => entry.into_mut(), - Entry::Vacant(entry) => entry.insert(default()), - } - } - - /// Ensures a value is in the entry by inserting, if empty, the result of the default function. - /// This method allows for generating key-derived values for insertion by providing the default - /// function a reference to the key that was moved during the `.entry(key)` method call. - /// - /// The reference to the moved key is provided so that cloning or copying the key is - /// unnecessary, unlike with `.or_insert_with(|| ... )`. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// - /// let mut map: HashMap<&str, usize> = HashMap::new(); - /// - /// // nonexistent key - /// map.entry("poneyland").or_insert_with_key(|key| key.chars().count()); - /// assert_eq!(map["poneyland"], 9); - /// - /// // existing key - /// *map.entry("poneyland").or_insert_with_key(|key| key.chars().count() * 10) *= 2; - /// assert_eq!(map["poneyland"], 18); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn or_insert_with_key V>(self, default: F) -> &'a mut V - where - K: Hash, - S: BuildHasher, - { - match self { - Entry::Occupied(entry) => entry.into_mut(), - Entry::Vacant(entry) => { - let value = default(entry.key()); - entry.insert(value) - } - } - } - - /// Returns a reference to this entry's key. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// - /// let mut map: HashMap<&str, u32> = HashMap::new(); - /// map.entry("poneyland").or_insert(3); - /// // existing key - /// assert_eq!(map.entry("poneyland").key(), &"poneyland"); - /// // nonexistent key - /// assert_eq!(map.entry("horseland").key(), &"horseland"); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn key(&self) -> &K { - match *self { - Entry::Occupied(ref entry) => entry.key(), - Entry::Vacant(ref entry) => entry.key(), - } - } - - /// Provides in-place mutable access to an occupied entry before any - /// potential inserts into the map. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// - /// let mut map: HashMap<&str, u32> = HashMap::new(); - /// - /// map.entry("poneyland") - /// .and_modify(|e| { *e += 1 }) - /// .or_insert(42); - /// assert_eq!(map["poneyland"], 42); - /// - /// map.entry("poneyland") - /// .and_modify(|e| { *e += 1 }) - /// .or_insert(42); - /// assert_eq!(map["poneyland"], 43); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn and_modify(self, f: F) -> Self - where - F: FnOnce(&mut V), - { - match self { - Entry::Occupied(mut entry) => { - f(entry.get_mut()); - Entry::Occupied(entry) - } - Entry::Vacant(entry) => Entry::Vacant(entry), - } - } - - /// Provides shared access to the key and owned access to the value of - /// an occupied entry and allows to replace or remove it based on the - /// value of the returned option. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// use hashbrown::hash_map::Entry; - /// - /// let mut map: HashMap<&str, u32> = HashMap::new(); - /// - /// let entry = map - /// .entry("poneyland") - /// .and_replace_entry_with(|_k, _v| panic!()); - /// - /// match entry { - /// Entry::Vacant(e) => { - /// assert_eq!(e.key(), &"poneyland"); - /// } - /// Entry::Occupied(_) => panic!(), - /// } - /// - /// map.insert("poneyland", 42); - /// - /// let entry = map - /// .entry("poneyland") - /// .and_replace_entry_with(|k, v| { - /// assert_eq!(k, &"poneyland"); - /// assert_eq!(v, 42); - /// Some(v + 1) - /// }); - /// - /// match entry { - /// Entry::Occupied(e) => { - /// assert_eq!(e.key(), &"poneyland"); - /// assert_eq!(e.get(), &43); - /// } - /// Entry::Vacant(_) => panic!(), - /// } - /// - /// assert_eq!(map["poneyland"], 43); - /// - /// let entry = map - /// .entry("poneyland") - /// .and_replace_entry_with(|_k, _v| None); - /// - /// match entry { - /// Entry::Vacant(e) => assert_eq!(e.key(), &"poneyland"), - /// Entry::Occupied(_) => panic!(), - /// } - /// - /// assert!(!map.contains_key("poneyland")); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn and_replace_entry_with(self, f: F) -> Self - where - F: FnOnce(&K, V) -> Option, - { - match self { - Entry::Occupied(entry) => entry.replace_entry_with(f), - Entry::Vacant(_) => self, - } - } -} - -impl<'a, K, V: Default, S, A: Allocator + Clone> Entry<'a, K, V, S, A> { - /// Ensures a value is in the entry by inserting the default value if empty, - /// and returns a mutable reference to the value in the entry. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// - /// let mut map: HashMap<&str, Option> = HashMap::new(); - /// - /// // nonexistent key - /// map.entry("poneyland").or_default(); - /// assert_eq!(map["poneyland"], None); - /// - /// map.insert("horseland", Some(3)); - /// - /// // existing key - /// assert_eq!(map.entry("horseland").or_default(), &mut Some(3)); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn or_default(self) -> &'a mut V - where - K: Hash, - S: BuildHasher, - { - match self { - Entry::Occupied(entry) => entry.into_mut(), - Entry::Vacant(entry) => entry.insert(Default::default()), - } - } -} - -impl<'a, K, V, S, A: Allocator + Clone> OccupiedEntry<'a, K, V, S, A> { - /// Gets a reference to the key in the entry. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::hash_map::{Entry, HashMap}; - /// - /// let mut map: HashMap<&str, u32> = HashMap::new(); - /// map.entry("poneyland").or_insert(12); - /// - /// match map.entry("poneyland") { - /// Entry::Vacant(_) => panic!(), - /// Entry::Occupied(entry) => assert_eq!(entry.key(), &"poneyland"), - /// } - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn key(&self) -> &K { - unsafe { &self.elem.as_ref().0 } - } - - /// Take the ownership of the key and value from the map. - /// Keeps the allocated memory for reuse. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// use hashbrown::hash_map::Entry; - /// - /// let mut map: HashMap<&str, u32> = HashMap::new(); - /// // The map is empty - /// assert!(map.is_empty() && map.capacity() == 0); - /// - /// map.entry("poneyland").or_insert(12); - /// - /// if let Entry::Occupied(o) = map.entry("poneyland") { - /// // We delete the entry from the map. - /// assert_eq!(o.remove_entry(), ("poneyland", 12)); - /// } - /// - /// assert_eq!(map.contains_key("poneyland"), false); - /// // Now map hold none elements - /// assert!(map.is_empty()); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn remove_entry(self) -> (K, V) { - unsafe { self.table.table.remove(self.elem) } - } - - /// Gets a reference to the value in the entry. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// use hashbrown::hash_map::Entry; - /// - /// let mut map: HashMap<&str, u32> = HashMap::new(); - /// map.entry("poneyland").or_insert(12); - /// - /// match map.entry("poneyland") { - /// Entry::Vacant(_) => panic!(), - /// Entry::Occupied(entry) => assert_eq!(entry.get(), &12), - /// } - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn get(&self) -> &V { - unsafe { &self.elem.as_ref().1 } - } - - /// Gets a mutable reference to the value in the entry. - /// - /// If you need a reference to the `OccupiedEntry` which may outlive the - /// destruction of the `Entry` value, see [`into_mut`]. - /// - /// [`into_mut`]: #method.into_mut - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// use hashbrown::hash_map::Entry; - /// - /// let mut map: HashMap<&str, u32> = HashMap::new(); - /// map.entry("poneyland").or_insert(12); - /// - /// assert_eq!(map["poneyland"], 12); - /// if let Entry::Occupied(mut o) = map.entry("poneyland") { - /// *o.get_mut() += 10; - /// assert_eq!(*o.get(), 22); - /// - /// // We can use the same Entry multiple times. - /// *o.get_mut() += 2; - /// } - /// - /// assert_eq!(map["poneyland"], 24); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn get_mut(&mut self) -> &mut V { - unsafe { &mut self.elem.as_mut().1 } - } - - /// Converts the OccupiedEntry into a mutable reference to the value in the entry - /// with a lifetime bound to the map itself. - /// - /// If you need multiple references to the `OccupiedEntry`, see [`get_mut`]. - /// - /// [`get_mut`]: #method.get_mut - /// - /// # Examples - /// - /// ``` - /// use hashbrown::hash_map::{Entry, HashMap}; - /// - /// let mut map: HashMap<&str, u32> = HashMap::new(); - /// map.entry("poneyland").or_insert(12); - /// - /// assert_eq!(map["poneyland"], 12); - /// - /// let value: &mut u32; - /// match map.entry("poneyland") { - /// Entry::Occupied(entry) => value = entry.into_mut(), - /// Entry::Vacant(_) => panic!(), - /// } - /// *value += 10; - /// - /// assert_eq!(map["poneyland"], 22); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn into_mut(self) -> &'a mut V { - unsafe { &mut self.elem.as_mut().1 } - } - - /// Sets the value of the entry, and returns the entry's old value. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// use hashbrown::hash_map::Entry; - /// - /// let mut map: HashMap<&str, u32> = HashMap::new(); - /// map.entry("poneyland").or_insert(12); - /// - /// if let Entry::Occupied(mut o) = map.entry("poneyland") { - /// assert_eq!(o.insert(15), 12); - /// } - /// - /// assert_eq!(map["poneyland"], 15); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn insert(&mut self, value: V) -> V { - mem::replace(self.get_mut(), value) - } - - /// Takes the value out of the entry, and returns it. - /// Keeps the allocated memory for reuse. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// use hashbrown::hash_map::Entry; - /// - /// let mut map: HashMap<&str, u32> = HashMap::new(); - /// // The map is empty - /// assert!(map.is_empty() && map.capacity() == 0); - /// - /// map.entry("poneyland").or_insert(12); - /// - /// if let Entry::Occupied(o) = map.entry("poneyland") { - /// assert_eq!(o.remove(), 12); - /// } - /// - /// assert_eq!(map.contains_key("poneyland"), false); - /// // Now map hold none elements - /// assert!(map.is_empty()); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn remove(self) -> V { - self.remove_entry().1 - } - - /// Replaces the entry, returning the old key and value. The new key in the hash map will be - /// the key used to create this entry. - /// - /// # Panics - /// - /// Will panic if this OccupiedEntry was created through [`Entry::insert`]. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::hash_map::{Entry, HashMap}; - /// use std::rc::Rc; - /// - /// let mut map: HashMap, u32> = HashMap::new(); - /// let key_one = Rc::new("Stringthing".to_string()); - /// let key_two = Rc::new("Stringthing".to_string()); - /// - /// map.insert(key_one.clone(), 15); - /// assert!(Rc::strong_count(&key_one) == 2 && Rc::strong_count(&key_two) == 1); - /// - /// match map.entry(key_two.clone()) { - /// Entry::Occupied(entry) => { - /// let (old_key, old_value): (Rc, u32) = entry.replace_entry(16); - /// assert!(Rc::ptr_eq(&key_one, &old_key) && old_value == 15); - /// } - /// Entry::Vacant(_) => panic!(), - /// } - /// - /// assert!(Rc::strong_count(&key_one) == 1 && Rc::strong_count(&key_two) == 2); - /// assert_eq!(map[&"Stringthing".to_owned()], 16); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn replace_entry(self, value: V) -> (K, V) { - let entry = unsafe { self.elem.as_mut() }; - - let old_key = mem::replace(&mut entry.0, self.key.unwrap()); - let old_value = mem::replace(&mut entry.1, value); - - (old_key, old_value) - } - - /// Replaces the key in the hash map with the key used to create this entry. - /// - /// # Panics - /// - /// Will panic if this OccupiedEntry was created through [`Entry::insert`]. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::hash_map::{Entry, HashMap}; - /// use std::rc::Rc; - /// - /// let mut map: HashMap, usize> = HashMap::with_capacity(6); - /// let mut keys_one: Vec> = Vec::with_capacity(6); - /// let mut keys_two: Vec> = Vec::with_capacity(6); - /// - /// for (value, key) in ["a", "b", "c", "d", "e", "f"].into_iter().enumerate() { - /// let rc_key = Rc::new(key.to_owned()); - /// keys_one.push(rc_key.clone()); - /// map.insert(rc_key.clone(), value); - /// keys_two.push(Rc::new(key.to_owned())); - /// } - /// - /// assert!( - /// keys_one.iter().all(|key| Rc::strong_count(key) == 2) - /// && keys_two.iter().all(|key| Rc::strong_count(key) == 1) - /// ); - /// - /// reclaim_memory(&mut map, &keys_two); - /// - /// assert!( - /// keys_one.iter().all(|key| Rc::strong_count(key) == 1) - /// && keys_two.iter().all(|key| Rc::strong_count(key) == 2) - /// ); - /// - /// fn reclaim_memory(map: &mut HashMap, usize>, keys: &[Rc]) { - /// for key in keys { - /// if let Entry::Occupied(entry) = map.entry(key.clone()) { - /// // Replaces the entry's key with our version of it in `keys`. - /// entry.replace_key(); - /// } - /// } - /// } - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn replace_key(self) -> K { - let entry = unsafe { self.elem.as_mut() }; - mem::replace(&mut entry.0, self.key.unwrap()) - } - - /// Provides shared access to the key and owned access to the value of - /// the entry and allows to replace or remove it based on the - /// value of the returned option. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// use hashbrown::hash_map::Entry; - /// - /// let mut map: HashMap<&str, u32> = HashMap::new(); - /// map.insert("poneyland", 42); - /// - /// let entry = match map.entry("poneyland") { - /// Entry::Occupied(e) => { - /// e.replace_entry_with(|k, v| { - /// assert_eq!(k, &"poneyland"); - /// assert_eq!(v, 42); - /// Some(v + 1) - /// }) - /// } - /// Entry::Vacant(_) => panic!(), - /// }; - /// - /// match entry { - /// Entry::Occupied(e) => { - /// assert_eq!(e.key(), &"poneyland"); - /// assert_eq!(e.get(), &43); - /// } - /// Entry::Vacant(_) => panic!(), - /// } - /// - /// assert_eq!(map["poneyland"], 43); - /// - /// let entry = match map.entry("poneyland") { - /// Entry::Occupied(e) => e.replace_entry_with(|_k, _v| None), - /// Entry::Vacant(_) => panic!(), - /// }; - /// - /// match entry { - /// Entry::Vacant(e) => { - /// assert_eq!(e.key(), &"poneyland"); - /// } - /// Entry::Occupied(_) => panic!(), - /// } - /// - /// assert!(!map.contains_key("poneyland")); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn replace_entry_with(self, f: F) -> Entry<'a, K, V, S, A> - where - F: FnOnce(&K, V) -> Option, - { - unsafe { - let mut spare_key = None; - - self.table - .table - .replace_bucket_with(self.elem.clone(), |(key, value)| { - if let Some(new_value) = f(&key, value) { - Some((key, new_value)) - } else { - spare_key = Some(key); - None - } - }); - - if let Some(key) = spare_key { - Entry::Vacant(VacantEntry { - hash: self.hash, - key, - table: self.table, - }) - } else { - Entry::Occupied(self) - } - } - } -} - -impl<'a, K, V, S, A: Allocator + Clone> VacantEntry<'a, K, V, S, A> { - /// Gets a reference to the key that would be used when inserting a value - /// through the `VacantEntry`. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// - /// let mut map: HashMap<&str, u32> = HashMap::new(); - /// assert_eq!(map.entry("poneyland").key(), &"poneyland"); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn key(&self) -> &K { - &self.key - } - - /// Take ownership of the key. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::hash_map::{Entry, HashMap}; - /// - /// let mut map: HashMap<&str, u32> = HashMap::new(); - /// - /// match map.entry("poneyland") { - /// Entry::Occupied(_) => panic!(), - /// Entry::Vacant(v) => assert_eq!(v.into_key(), "poneyland"), - /// } - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn into_key(self) -> K { - self.key - } - - /// Sets the value of the entry with the VacantEntry's key, - /// and returns a mutable reference to it. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// use hashbrown::hash_map::Entry; - /// - /// let mut map: HashMap<&str, u32> = HashMap::new(); - /// - /// if let Entry::Vacant(o) = map.entry("poneyland") { - /// o.insert(37); - /// } - /// assert_eq!(map["poneyland"], 37); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn insert(self, value: V) -> &'a mut V - where - K: Hash, - S: BuildHasher, - { - let table = &mut self.table.table; - let entry = table.insert_entry( - self.hash, - (self.key, value), - make_hasher::<_, V, S>(&self.table.hash_builder), - ); - &mut entry.1 - } - - #[cfg_attr(feature = "inline-more", inline)] - pub(crate) fn insert_entry(self, value: V) -> OccupiedEntry<'a, K, V, S, A> - where - K: Hash, - S: BuildHasher, - { - let elem = self.table.table.insert( - self.hash, - (self.key, value), - make_hasher::<_, V, S>(&self.table.hash_builder), - ); - OccupiedEntry { - hash: self.hash, - key: None, - elem, - table: self.table, - } - } -} - -impl<'a, 'b, K, Q: ?Sized, V, S, A: Allocator + Clone> EntryRef<'a, 'b, K, Q, V, S, A> { - /// Sets the value of the entry, and returns an OccupiedEntryRef. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// - /// let mut map: HashMap = HashMap::new(); - /// let entry = map.entry_ref("horseyland").insert(37); - /// - /// assert_eq!(entry.key(), "horseyland"); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn insert(self, value: V) -> OccupiedEntryRef<'a, 'b, K, Q, V, S, A> - where - K: Hash + From<&'b Q>, - S: BuildHasher, - { - match self { - EntryRef::Occupied(mut entry) => { - entry.insert(value); - entry - } - EntryRef::Vacant(entry) => entry.insert_entry(value), - } - } - - /// Ensures a value is in the entry by inserting the default if empty, and returns - /// a mutable reference to the value in the entry. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// - /// let mut map: HashMap = HashMap::new(); - /// - /// // nonexistent key - /// map.entry_ref("poneyland").or_insert(3); - /// assert_eq!(map["poneyland"], 3); - /// - /// // existing key - /// *map.entry_ref("poneyland").or_insert(10) *= 2; - /// assert_eq!(map["poneyland"], 6); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn or_insert(self, default: V) -> &'a mut V - where - K: Hash + From<&'b Q>, - S: BuildHasher, - { - match self { - EntryRef::Occupied(entry) => entry.into_mut(), - EntryRef::Vacant(entry) => entry.insert(default), - } - } - - /// Ensures a value is in the entry by inserting the result of the default function if empty, - /// and returns a mutable reference to the value in the entry. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// - /// let mut map: HashMap = HashMap::new(); - /// - /// // nonexistent key - /// map.entry_ref("poneyland").or_insert_with(|| 3); - /// assert_eq!(map["poneyland"], 3); - /// - /// // existing key - /// *map.entry_ref("poneyland").or_insert_with(|| 10) *= 2; - /// assert_eq!(map["poneyland"], 6); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn or_insert_with V>(self, default: F) -> &'a mut V - where - K: Hash + From<&'b Q>, - S: BuildHasher, - { - match self { - EntryRef::Occupied(entry) => entry.into_mut(), - EntryRef::Vacant(entry) => entry.insert(default()), - } - } - - /// Ensures a value is in the entry by inserting, if empty, the result of the default function. - /// This method allows for generating key-derived values for insertion by providing the default - /// function an access to the borrower form of the key. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// - /// let mut map: HashMap = HashMap::new(); - /// - /// // nonexistent key - /// map.entry_ref("poneyland").or_insert_with_key(|key| key.chars().count()); - /// assert_eq!(map["poneyland"], 9); - /// - /// // existing key - /// *map.entry_ref("poneyland").or_insert_with_key(|key| key.chars().count() * 10) *= 2; - /// assert_eq!(map["poneyland"], 18); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn or_insert_with_key V>(self, default: F) -> &'a mut V - where - K: Hash + Borrow + From<&'b Q>, - S: BuildHasher, - { - match self { - EntryRef::Occupied(entry) => entry.into_mut(), - EntryRef::Vacant(entry) => { - let value = default(entry.key.as_ref()); - entry.insert(value) - } - } - } - - /// Returns a reference to this entry's key. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// - /// let mut map: HashMap = HashMap::new(); - /// map.entry_ref("poneyland").or_insert(3); - /// // existing key - /// assert_eq!(map.entry_ref("poneyland").key(), "poneyland"); - /// // nonexistent key - /// assert_eq!(map.entry_ref("horseland").key(), "horseland"); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn key(&self) -> &Q - where - K: Borrow, - { - match *self { - EntryRef::Occupied(ref entry) => entry.key(), - EntryRef::Vacant(ref entry) => entry.key(), - } - } - - /// Provides in-place mutable access to an occupied entry before any - /// potential inserts into the map. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// - /// let mut map: HashMap = HashMap::new(); - /// - /// map.entry_ref("poneyland") - /// .and_modify(|e| { *e += 1 }) - /// .or_insert(42); - /// assert_eq!(map["poneyland"], 42); - /// - /// map.entry_ref("poneyland") - /// .and_modify(|e| { *e += 1 }) - /// .or_insert(42); - /// assert_eq!(map["poneyland"], 43); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn and_modify(self, f: F) -> Self - where - F: FnOnce(&mut V), - { - match self { - EntryRef::Occupied(mut entry) => { - f(entry.get_mut()); - EntryRef::Occupied(entry) - } - EntryRef::Vacant(entry) => EntryRef::Vacant(entry), - } - } - - /// Provides shared access to the key and owned access to the value of - /// an occupied entry and allows to replace or remove it based on the - /// value of the returned option. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// use hashbrown::hash_map::EntryRef; - /// - /// let mut map: HashMap = HashMap::new(); - /// - /// let entry = map - /// .entry_ref("poneyland") - /// .and_replace_entry_with(|_k, _v| panic!()); - /// - /// match entry { - /// EntryRef::Vacant(e) => { - /// assert_eq!(e.key(), "poneyland"); - /// } - /// EntryRef::Occupied(_) => panic!(), - /// } - /// - /// map.insert("poneyland".to_string(), 42); - /// - /// let entry = map - /// .entry_ref("poneyland") - /// .and_replace_entry_with(|k, v| { - /// assert_eq!(k, "poneyland"); - /// assert_eq!(v, 42); - /// Some(v + 1) - /// }); - /// - /// match entry { - /// EntryRef::Occupied(e) => { - /// assert_eq!(e.key(), "poneyland"); - /// assert_eq!(e.get(), &43); - /// } - /// EntryRef::Vacant(_) => panic!(), - /// } - /// - /// assert_eq!(map["poneyland"], 43); - /// - /// let entry = map - /// .entry_ref("poneyland") - /// .and_replace_entry_with(|_k, _v| None); - /// - /// match entry { - /// EntryRef::Vacant(e) => assert_eq!(e.key(), "poneyland"), - /// EntryRef::Occupied(_) => panic!(), - /// } - /// - /// assert!(!map.contains_key("poneyland")); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn and_replace_entry_with(self, f: F) -> Self - where - F: FnOnce(&Q, V) -> Option, - K: Borrow, - { - match self { - EntryRef::Occupied(entry) => entry.replace_entry_with(f), - EntryRef::Vacant(_) => self, - } - } -} - -impl<'a, 'b, K, Q: ?Sized, V: Default, S, A: Allocator + Clone> EntryRef<'a, 'b, K, Q, V, S, A> { - /// Ensures a value is in the entry by inserting the default value if empty, - /// and returns a mutable reference to the value in the entry. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// - /// let mut map: HashMap> = HashMap::new(); - /// - /// // nonexistent key - /// map.entry_ref("poneyland").or_default(); - /// assert_eq!(map["poneyland"], None); - /// - /// map.insert("horseland".to_string(), Some(3)); - /// - /// // existing key - /// assert_eq!(map.entry_ref("horseland").or_default(), &mut Some(3)); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn or_default(self) -> &'a mut V - where - K: Hash + From<&'b Q>, - S: BuildHasher, - { - match self { - EntryRef::Occupied(entry) => entry.into_mut(), - EntryRef::Vacant(entry) => entry.insert(Default::default()), - } - } -} - -impl<'a, 'b, K, Q: ?Sized, V, S, A: Allocator + Clone> OccupiedEntryRef<'a, 'b, K, Q, V, S, A> { - /// Gets a reference to the key in the entry. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::hash_map::{EntryRef, HashMap}; - /// - /// let mut map: HashMap = HashMap::new(); - /// map.entry_ref("poneyland").or_insert(12); - /// - /// match map.entry_ref("poneyland") { - /// EntryRef::Vacant(_) => panic!(), - /// EntryRef::Occupied(entry) => assert_eq!(entry.key(), "poneyland"), - /// } - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn key(&self) -> &Q - where - K: Borrow, - { - unsafe { &self.elem.as_ref().0 }.borrow() - } - - /// Take the ownership of the key and value from the map. - /// Keeps the allocated memory for reuse. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// use hashbrown::hash_map::EntryRef; - /// - /// let mut map: HashMap = HashMap::new(); - /// // The map is empty - /// assert!(map.is_empty() && map.capacity() == 0); - /// - /// map.entry_ref("poneyland").or_insert(12); - /// - /// if let EntryRef::Occupied(o) = map.entry_ref("poneyland") { - /// // We delete the entry from the map. - /// assert_eq!(o.remove_entry(), ("poneyland".to_owned(), 12)); - /// } - /// - /// assert_eq!(map.contains_key("poneyland"), false); - /// // Now map hold none elements but capacity is equal to the old one - /// assert!(map.is_empty()); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn remove_entry(self) -> (K, V) { - unsafe { self.table.table.remove(self.elem) } - } - - /// Gets a reference to the value in the entry. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// use hashbrown::hash_map::EntryRef; - /// - /// let mut map: HashMap = HashMap::new(); - /// map.entry_ref("poneyland").or_insert(12); - /// - /// match map.entry_ref("poneyland") { - /// EntryRef::Vacant(_) => panic!(), - /// EntryRef::Occupied(entry) => assert_eq!(entry.get(), &12), - /// } - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn get(&self) -> &V { - unsafe { &self.elem.as_ref().1 } - } - - /// Gets a mutable reference to the value in the entry. - /// - /// If you need a reference to the `OccupiedEntryRef` which may outlive the - /// destruction of the `EntryRef` value, see [`into_mut`]. - /// - /// [`into_mut`]: #method.into_mut - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// use hashbrown::hash_map::EntryRef; - /// - /// let mut map: HashMap = HashMap::new(); - /// map.entry_ref("poneyland").or_insert(12); - /// - /// assert_eq!(map["poneyland"], 12); - /// if let EntryRef::Occupied(mut o) = map.entry_ref("poneyland") { - /// *o.get_mut() += 10; - /// assert_eq!(*o.get(), 22); - /// - /// // We can use the same Entry multiple times. - /// *o.get_mut() += 2; - /// } - /// - /// assert_eq!(map["poneyland"], 24); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn get_mut(&mut self) -> &mut V { - unsafe { &mut self.elem.as_mut().1 } - } - - /// Converts the OccupiedEntryRef into a mutable reference to the value in the entry - /// with a lifetime bound to the map itself. - /// - /// If you need multiple references to the `OccupiedEntryRef`, see [`get_mut`]. - /// - /// [`get_mut`]: #method.get_mut - /// - /// # Examples - /// - /// ``` - /// use hashbrown::hash_map::{EntryRef, HashMap}; - /// - /// let mut map: HashMap = HashMap::new(); - /// map.entry_ref("poneyland").or_insert(12); - /// - /// let value: &mut u32; - /// match map.entry_ref("poneyland") { - /// EntryRef::Occupied(entry) => value = entry.into_mut(), - /// EntryRef::Vacant(_) => panic!(), - /// } - /// *value += 10; - /// - /// assert_eq!(map["poneyland"], 22); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn into_mut(self) -> &'a mut V { - unsafe { &mut self.elem.as_mut().1 } - } - - /// Sets the value of the entry, and returns the entry's old value. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// use hashbrown::hash_map::EntryRef; - /// - /// let mut map: HashMap = HashMap::new(); - /// map.entry_ref("poneyland").or_insert(12); - /// - /// if let EntryRef::Occupied(mut o) = map.entry_ref("poneyland") { - /// assert_eq!(o.insert(15), 12); - /// } - /// - /// assert_eq!(map["poneyland"], 15); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn insert(&mut self, value: V) -> V { - mem::replace(self.get_mut(), value) - } - - /// Takes the value out of the entry, and returns it. - /// Keeps the allocated memory for reuse. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// use hashbrown::hash_map::EntryRef; - /// - /// let mut map: HashMap = HashMap::new(); - /// // The map is empty - /// assert!(map.is_empty() && map.capacity() == 0); - /// - /// map.entry_ref("poneyland").or_insert(12); - /// - /// if let EntryRef::Occupied(o) = map.entry_ref("poneyland") { - /// assert_eq!(o.remove(), 12); - /// } - /// - /// assert_eq!(map.contains_key("poneyland"), false); - /// // Now map hold none elements but capacity is equal to the old one - /// assert!(map.is_empty()); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn remove(self) -> V { - self.remove_entry().1 - } - - /// Replaces the entry, returning the old key and value. The new key in the hash map will be - /// the key used to create this entry. - /// - /// # Panics - /// - /// Will panic if this OccupiedEntryRef was created through [`EntryRef::insert`]. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::hash_map::{EntryRef, HashMap}; - /// use std::rc::Rc; - /// - /// let mut map: HashMap, u32> = HashMap::new(); - /// let key: Rc = Rc::from("Stringthing"); - /// - /// map.insert(key.clone(), 15); - /// assert_eq!(Rc::strong_count(&key), 2); - /// - /// match map.entry_ref("Stringthing") { - /// EntryRef::Occupied(entry) => { - /// let (old_key, old_value): (Rc, u32) = entry.replace_entry(16); - /// assert!(Rc::ptr_eq(&key, &old_key) && old_value == 15); - /// } - /// EntryRef::Vacant(_) => panic!(), - /// } - /// - /// assert_eq!(Rc::strong_count(&key), 1); - /// assert_eq!(map["Stringthing"], 16); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn replace_entry(self, value: V) -> (K, V) - where - K: From<&'b Q>, - { - let entry = unsafe { self.elem.as_mut() }; - - let old_key = mem::replace(&mut entry.0, self.key.unwrap().into_owned()); - let old_value = mem::replace(&mut entry.1, value); - - (old_key, old_value) - } - - /// Replaces the key in the hash map with the key used to create this entry. - /// - /// # Panics - /// - /// Will panic if this OccupiedEntryRef was created through [`EntryRef::insert`]. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::hash_map::{EntryRef, HashMap}; - /// use std::rc::Rc; - /// - /// let mut map: HashMap, usize> = HashMap::with_capacity(6); - /// let mut keys: Vec> = Vec::with_capacity(6); - /// - /// for (value, key) in ["a", "b", "c", "d", "e", "f"].into_iter().enumerate() { - /// let rc_key: Rc = Rc::from(key); - /// keys.push(rc_key.clone()); - /// map.insert(rc_key.clone(), value); - /// } - /// - /// assert!(keys.iter().all(|key| Rc::strong_count(key) == 2)); - /// - /// // It doesn't matter that we kind of use a vector with the same keys, - /// // because all keys will be newly created from the references - /// reclaim_memory(&mut map, &keys); - /// - /// assert!(keys.iter().all(|key| Rc::strong_count(key) == 1)); - /// - /// fn reclaim_memory(map: &mut HashMap, usize>, keys: &[Rc]) { - /// for key in keys { - /// if let EntryRef::Occupied(entry) = map.entry_ref(key.as_ref()) { - /// // Replaces the entry's key with our version of it in `keys`. - /// entry.replace_key(); - /// } - /// } - /// } - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn replace_key(self) -> K - where - K: From<&'b Q>, - { - let entry = unsafe { self.elem.as_mut() }; - mem::replace(&mut entry.0, self.key.unwrap().into_owned()) - } - - /// Provides shared access to the key and owned access to the value of - /// the entry and allows to replace or remove it based on the - /// value of the returned option. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// use hashbrown::hash_map::EntryRef; - /// - /// let mut map: HashMap = HashMap::new(); - /// map.insert("poneyland".to_string(), 42); - /// - /// let entry = match map.entry_ref("poneyland") { - /// EntryRef::Occupied(e) => { - /// e.replace_entry_with(|k, v| { - /// assert_eq!(k, "poneyland"); - /// assert_eq!(v, 42); - /// Some(v + 1) - /// }) - /// } - /// EntryRef::Vacant(_) => panic!(), - /// }; - /// - /// match entry { - /// EntryRef::Occupied(e) => { - /// assert_eq!(e.key(), "poneyland"); - /// assert_eq!(e.get(), &43); - /// } - /// EntryRef::Vacant(_) => panic!(), - /// } - /// - /// assert_eq!(map["poneyland"], 43); - /// - /// let entry = match map.entry_ref("poneyland") { - /// EntryRef::Occupied(e) => e.replace_entry_with(|_k, _v| None), - /// EntryRef::Vacant(_) => panic!(), - /// }; - /// - /// match entry { - /// EntryRef::Vacant(e) => { - /// assert_eq!(e.key(), "poneyland"); - /// } - /// EntryRef::Occupied(_) => panic!(), - /// } - /// - /// assert!(!map.contains_key("poneyland")); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn replace_entry_with(self, f: F) -> EntryRef<'a, 'b, K, Q, V, S, A> - where - F: FnOnce(&Q, V) -> Option, - K: Borrow, - { - unsafe { - let mut spare_key = None; - - self.table - .table - .replace_bucket_with(self.elem.clone(), |(key, value)| { - if let Some(new_value) = f(key.borrow(), value) { - Some((key, new_value)) - } else { - spare_key = Some(KeyOrRef::Owned(key)); - None - } - }); - - if let Some(key) = spare_key { - EntryRef::Vacant(VacantEntryRef { - hash: self.hash, - key, - table: self.table, - }) - } else { - EntryRef::Occupied(self) - } - } - } -} - -impl<'a, 'b, K, Q: ?Sized, V, S, A: Allocator + Clone> VacantEntryRef<'a, 'b, K, Q, V, S, A> { - /// Gets a reference to the key that would be used when inserting a value - /// through the `VacantEntryRef`. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// - /// let mut map: HashMap = HashMap::new(); - /// let key: &str = "poneyland"; - /// assert_eq!(map.entry_ref(key).key(), "poneyland"); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn key(&self) -> &Q - where - K: Borrow, - { - self.key.as_ref() - } - - /// Take ownership of the key. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::hash_map::{EntryRef, HashMap}; - /// - /// let mut map: HashMap = HashMap::new(); - /// let key: &str = "poneyland"; - /// - /// match map.entry_ref(key) { - /// EntryRef::Occupied(_) => panic!(), - /// EntryRef::Vacant(v) => assert_eq!(v.into_key(), "poneyland".to_owned()), - /// } - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn into_key(self) -> K - where - K: From<&'b Q>, - { - self.key.into_owned() - } - - /// Sets the value of the entry with the VacantEntryRef's key, - /// and returns a mutable reference to it. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// use hashbrown::hash_map::EntryRef; - /// - /// let mut map: HashMap = HashMap::new(); - /// let key: &str = "poneyland"; - /// - /// if let EntryRef::Vacant(o) = map.entry_ref(key) { - /// o.insert(37); - /// } - /// assert_eq!(map["poneyland"], 37); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn insert(self, value: V) -> &'a mut V - where - K: Hash + From<&'b Q>, - S: BuildHasher, - { - let table = &mut self.table.table; - let entry = table.insert_entry( - self.hash, - (self.key.into_owned(), value), - make_hasher::<_, V, S>(&self.table.hash_builder), - ); - &mut entry.1 - } - - #[cfg_attr(feature = "inline-more", inline)] - fn insert_entry(self, value: V) -> OccupiedEntryRef<'a, 'b, K, Q, V, S, A> - where - K: Hash + From<&'b Q>, - S: BuildHasher, - { - let elem = self.table.table.insert( - self.hash, - (self.key.into_owned(), value), - make_hasher::<_, V, S>(&self.table.hash_builder), - ); - OccupiedEntryRef { - hash: self.hash, - key: None, - elem, - table: self.table, - } - } -} - -impl FromIterator<(K, V)> for HashMap -where - K: Eq + Hash, - S: BuildHasher + Default, - A: Default + Allocator + Clone, -{ - #[cfg_attr(feature = "inline-more", inline)] - fn from_iter>(iter: T) -> Self { - let iter = iter.into_iter(); - let mut map = - Self::with_capacity_and_hasher_in(iter.size_hint().0, S::default(), A::default()); - iter.for_each(|(k, v)| { - map.insert(k, v); - }); - map - } -} - -/// Inserts all new key-values from the iterator and replaces values with existing -/// keys with new values returned from the iterator. -impl Extend<(K, V)> for HashMap -where - K: Eq + Hash, - S: BuildHasher, - A: Allocator + Clone, -{ - /// Inserts all new key-values from the iterator to existing `HashMap`. - /// Replace values with existing keys with new values returned from the iterator. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::hash_map::HashMap; - /// - /// let mut map = HashMap::new(); - /// map.insert(1, 100); - /// - /// let some_iter = [(1, 1), (2, 2)].into_iter(); - /// map.extend(some_iter); - /// // Replace values with existing keys with new values returned from the iterator. - /// // So that the map.get(&1) doesn't return Some(&100). - /// assert_eq!(map.get(&1), Some(&1)); - /// - /// let some_vec: Vec<_> = vec![(3, 3), (4, 4)]; - /// map.extend(some_vec); - /// - /// let some_arr = [(5, 5), (6, 6)]; - /// map.extend(some_arr); - /// let old_map_len = map.len(); - /// - /// // You can also extend from another HashMap - /// let mut new_map = HashMap::new(); - /// new_map.extend(map); - /// assert_eq!(new_map.len(), old_map_len); - /// - /// let mut vec: Vec<_> = new_map.into_iter().collect(); - /// // The `IntoIter` iterator produces items in arbitrary order, so the - /// // items must be sorted to test them against a sorted array. - /// vec.sort_unstable(); - /// assert_eq!(vec, [(1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6)]); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - fn extend>(&mut self, iter: T) { - // Keys may be already present or show multiple times in the iterator. - // Reserve the entire hint lower bound if the map is empty. - // Otherwise reserve half the hint (rounded up), so the map - // will only resize twice in the worst case. - let iter = iter.into_iter(); - let reserve = if self.is_empty() { - iter.size_hint().0 - } else { - (iter.size_hint().0 + 1) / 2 - }; - self.reserve(reserve); - iter.for_each(move |(k, v)| { - self.insert(k, v); - }); - } - - #[inline] - #[cfg(feature = "nightly")] - fn extend_one(&mut self, (k, v): (K, V)) { - self.insert(k, v); - } - - #[inline] - #[cfg(feature = "nightly")] - fn extend_reserve(&mut self, additional: usize) { - // Keys may be already present or show multiple times in the iterator. - // Reserve the entire hint lower bound if the map is empty. - // Otherwise reserve half the hint (rounded up), so the map - // will only resize twice in the worst case. - let reserve = if self.is_empty() { - additional - } else { - (additional + 1) / 2 - }; - self.reserve(reserve); - } -} - -/// Inserts all new key-values from the iterator and replaces values with existing -/// keys with new values returned from the iterator. -impl<'a, K, V, S, A> Extend<(&'a K, &'a V)> for HashMap -where - K: Eq + Hash + Copy, - V: Copy, - S: BuildHasher, - A: Allocator + Clone, -{ - /// Inserts all new key-values from the iterator to existing `HashMap`. - /// Replace values with existing keys with new values returned from the iterator. - /// The keys and values must implement [`Copy`] trait. - /// - /// [`Copy`]: https://doc.rust-lang.org/core/marker/trait.Copy.html - /// - /// # Examples - /// - /// ``` - /// use hashbrown::hash_map::HashMap; - /// - /// let mut map = HashMap::new(); - /// map.insert(1, 100); - /// - /// let arr = [(1, 1), (2, 2)]; - /// let some_iter = arr.iter().map(|(k, v)| (k, v)); - /// map.extend(some_iter); - /// // Replace values with existing keys with new values returned from the iterator. - /// // So that the map.get(&1) doesn't return Some(&100). - /// assert_eq!(map.get(&1), Some(&1)); - /// - /// let some_vec: Vec<_> = vec![(3, 3), (4, 4)]; - /// map.extend(some_vec.iter().map(|(k, v)| (k, v))); - /// - /// let some_arr = [(5, 5), (6, 6)]; - /// map.extend(some_arr.iter().map(|(k, v)| (k, v))); - /// - /// // You can also extend from another HashMap - /// let mut new_map = HashMap::new(); - /// new_map.extend(&map); - /// assert_eq!(new_map, map); - /// - /// let mut vec: Vec<_> = new_map.into_iter().collect(); - /// // The `IntoIter` iterator produces items in arbitrary order, so the - /// // items must be sorted to test them against a sorted array. - /// vec.sort_unstable(); - /// assert_eq!(vec, [(1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6)]); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - fn extend>(&mut self, iter: T) { - self.extend(iter.into_iter().map(|(&key, &value)| (key, value))); - } - - #[inline] - #[cfg(feature = "nightly")] - fn extend_one(&mut self, (k, v): (&'a K, &'a V)) { - self.insert(*k, *v); - } - - #[inline] - #[cfg(feature = "nightly")] - fn extend_reserve(&mut self, additional: usize) { - Extend::<(K, V)>::extend_reserve(self, additional); - } -} - -/// Inserts all new key-values from the iterator and replaces values with existing -/// keys with new values returned from the iterator. -impl<'a, K, V, S, A> Extend<&'a (K, V)> for HashMap -where - K: Eq + Hash + Copy, - V: Copy, - S: BuildHasher, - A: Allocator + Clone, -{ - /// Inserts all new key-values from the iterator to existing `HashMap`. - /// Replace values with existing keys with new values returned from the iterator. - /// The keys and values must implement [`Copy`] trait. - /// - /// [`Copy`]: https://doc.rust-lang.org/core/marker/trait.Copy.html - /// - /// # Examples - /// - /// ``` - /// use hashbrown::hash_map::HashMap; - /// - /// let mut map = HashMap::new(); - /// map.insert(1, 100); - /// - /// let arr = [(1, 1), (2, 2)]; - /// let some_iter = arr.iter(); - /// map.extend(some_iter); - /// // Replace values with existing keys with new values returned from the iterator. - /// // So that the map.get(&1) doesn't return Some(&100). - /// assert_eq!(map.get(&1), Some(&1)); - /// - /// let some_vec: Vec<_> = vec![(3, 3), (4, 4)]; - /// map.extend(&some_vec); - /// - /// let some_arr = [(5, 5), (6, 6)]; - /// map.extend(&some_arr); - /// - /// let mut vec: Vec<_> = map.into_iter().collect(); - /// // The `IntoIter` iterator produces items in arbitrary order, so the - /// // items must be sorted to test them against a sorted array. - /// vec.sort_unstable(); - /// assert_eq!(vec, [(1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6)]); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - fn extend>(&mut self, iter: T) { - self.extend(iter.into_iter().map(|&(key, value)| (key, value))); - } - - #[inline] - #[cfg(feature = "nightly")] - fn extend_one(&mut self, &(k, v): &'a (K, V)) { - self.insert(k, v); - } - - #[inline] - #[cfg(feature = "nightly")] - fn extend_reserve(&mut self, additional: usize) { - Extend::<(K, V)>::extend_reserve(self, additional); - } -} - -#[allow(dead_code)] -fn assert_covariance() { - fn map_key<'new>(v: HashMap<&'static str, u8>) -> HashMap<&'new str, u8> { - v - } - fn map_val<'new>(v: HashMap) -> HashMap { - v - } - fn iter_key<'a, 'new>(v: Iter<'a, &'static str, u8>) -> Iter<'a, &'new str, u8> { - v - } - fn iter_val<'a, 'new>(v: Iter<'a, u8, &'static str>) -> Iter<'a, u8, &'new str> { - v - } - fn into_iter_key<'new, A: Allocator + Clone>( - v: IntoIter<&'static str, u8, A>, - ) -> IntoIter<&'new str, u8, A> { - v - } - fn into_iter_val<'new, A: Allocator + Clone>( - v: IntoIter, - ) -> IntoIter { - v - } - fn keys_key<'a, 'new>(v: Keys<'a, &'static str, u8>) -> Keys<'a, &'new str, u8> { - v - } - fn keys_val<'a, 'new>(v: Keys<'a, u8, &'static str>) -> Keys<'a, u8, &'new str> { - v - } - fn values_key<'a, 'new>(v: Values<'a, &'static str, u8>) -> Values<'a, &'new str, u8> { - v - } - fn values_val<'a, 'new>(v: Values<'a, u8, &'static str>) -> Values<'a, u8, &'new str> { - v - } - fn drain<'new>( - d: Drain<'static, &'static str, &'static str>, - ) -> Drain<'new, &'new str, &'new str> { - d - } -} - -#[cfg(test)] -mod test_map { - use super::DefaultHashBuilder; - use super::Entry::{Occupied, Vacant}; - use super::EntryRef; - use super::{HashMap, RawEntryMut}; - use rand::{rngs::SmallRng, Rng, SeedableRng}; - use std::borrow::ToOwned; - use std::cell::RefCell; - use std::usize; - use std::vec::Vec; - - #[test] - fn test_zero_capacities() { - type HM = HashMap; - - let m = HM::new(); - assert_eq!(m.capacity(), 0); - - let m = HM::default(); - assert_eq!(m.capacity(), 0); - - let m = HM::with_hasher(DefaultHashBuilder::default()); - assert_eq!(m.capacity(), 0); - - let m = HM::with_capacity(0); - assert_eq!(m.capacity(), 0); - - let m = HM::with_capacity_and_hasher(0, DefaultHashBuilder::default()); - assert_eq!(m.capacity(), 0); - - let mut m = HM::new(); - m.insert(1, 1); - m.insert(2, 2); - m.remove(&1); - m.remove(&2); - m.shrink_to_fit(); - assert_eq!(m.capacity(), 0); - - let mut m = HM::new(); - m.reserve(0); - assert_eq!(m.capacity(), 0); - } - - #[test] - fn test_create_capacity_zero() { - let mut m = HashMap::with_capacity(0); - - assert!(m.insert(1, 1).is_none()); - - assert!(m.contains_key(&1)); - assert!(!m.contains_key(&0)); - } - - #[test] - fn test_insert() { - let mut m = HashMap::new(); - assert_eq!(m.len(), 0); - assert!(m.insert(1, 2).is_none()); - assert_eq!(m.len(), 1); - assert!(m.insert(2, 4).is_none()); - assert_eq!(m.len(), 2); - assert_eq!(*m.get(&1).unwrap(), 2); - assert_eq!(*m.get(&2).unwrap(), 4); - } - - #[test] - fn test_clone() { - let mut m = HashMap::new(); - assert_eq!(m.len(), 0); - assert!(m.insert(1, 2).is_none()); - assert_eq!(m.len(), 1); - assert!(m.insert(2, 4).is_none()); - assert_eq!(m.len(), 2); - #[allow(clippy::redundant_clone)] - let m2 = m.clone(); - assert_eq!(*m2.get(&1).unwrap(), 2); - assert_eq!(*m2.get(&2).unwrap(), 4); - assert_eq!(m2.len(), 2); - } - - #[test] - fn test_clone_from() { - let mut m = HashMap::new(); - let mut m2 = HashMap::new(); - assert_eq!(m.len(), 0); - assert!(m.insert(1, 2).is_none()); - assert_eq!(m.len(), 1); - assert!(m.insert(2, 4).is_none()); - assert_eq!(m.len(), 2); - m2.clone_from(&m); - assert_eq!(*m2.get(&1).unwrap(), 2); - assert_eq!(*m2.get(&2).unwrap(), 4); - assert_eq!(m2.len(), 2); - } - - thread_local! { static DROP_VECTOR: RefCell> = RefCell::new(Vec::new()) } - - #[derive(Hash, PartialEq, Eq)] - struct Droppable { - k: usize, - } - - impl Droppable { - fn new(k: usize) -> Droppable { - DROP_VECTOR.with(|slot| { - slot.borrow_mut()[k] += 1; - }); - - Droppable { k } - } - } - - impl Drop for Droppable { - fn drop(&mut self) { - DROP_VECTOR.with(|slot| { - slot.borrow_mut()[self.k] -= 1; - }); - } - } - - impl Clone for Droppable { - fn clone(&self) -> Self { - Droppable::new(self.k) - } - } - - #[test] - fn test_drops() { - DROP_VECTOR.with(|slot| { - *slot.borrow_mut() = vec![0; 200]; - }); - - { - let mut m = HashMap::new(); - - DROP_VECTOR.with(|v| { - for i in 0..200 { - assert_eq!(v.borrow()[i], 0); - } - }); - - for i in 0..100 { - let d1 = Droppable::new(i); - let d2 = Droppable::new(i + 100); - m.insert(d1, d2); - } - - DROP_VECTOR.with(|v| { - for i in 0..200 { - assert_eq!(v.borrow()[i], 1); - } - }); - - for i in 0..50 { - let k = Droppable::new(i); - let v = m.remove(&k); - - assert!(v.is_some()); - - DROP_VECTOR.with(|v| { - assert_eq!(v.borrow()[i], 1); - assert_eq!(v.borrow()[i + 100], 1); - }); - } - - DROP_VECTOR.with(|v| { - for i in 0..50 { - assert_eq!(v.borrow()[i], 0); - assert_eq!(v.borrow()[i + 100], 0); - } - - for i in 50..100 { - assert_eq!(v.borrow()[i], 1); - assert_eq!(v.borrow()[i + 100], 1); - } - }); - } - - DROP_VECTOR.with(|v| { - for i in 0..200 { - assert_eq!(v.borrow()[i], 0); - } - }); - } - - #[test] - fn test_into_iter_drops() { - DROP_VECTOR.with(|v| { - *v.borrow_mut() = vec![0; 200]; - }); - - let hm = { - let mut hm = HashMap::new(); - - DROP_VECTOR.with(|v| { - for i in 0..200 { - assert_eq!(v.borrow()[i], 0); - } - }); - - for i in 0..100 { - let d1 = Droppable::new(i); - let d2 = Droppable::new(i + 100); - hm.insert(d1, d2); - } - - DROP_VECTOR.with(|v| { - for i in 0..200 { - assert_eq!(v.borrow()[i], 1); - } - }); - - hm - }; - - // By the way, ensure that cloning doesn't screw up the dropping. - drop(hm.clone()); - - { - let mut half = hm.into_iter().take(50); - - DROP_VECTOR.with(|v| { - for i in 0..200 { - assert_eq!(v.borrow()[i], 1); - } - }); - - #[allow(clippy::let_underscore_drop)] // kind-of a false positive - for _ in half.by_ref() {} - - DROP_VECTOR.with(|v| { - let nk = (0..100).filter(|&i| v.borrow()[i] == 1).count(); - - let nv = (0..100).filter(|&i| v.borrow()[i + 100] == 1).count(); - - assert_eq!(nk, 50); - assert_eq!(nv, 50); - }); - }; - - DROP_VECTOR.with(|v| { - for i in 0..200 { - assert_eq!(v.borrow()[i], 0); - } - }); - } - - #[test] - fn test_empty_remove() { - let mut m: HashMap = HashMap::new(); - assert_eq!(m.remove(&0), None); - } - - #[test] - fn test_empty_entry() { - let mut m: HashMap = HashMap::new(); - match m.entry(0) { - Occupied(_) => panic!(), - Vacant(_) => {} - } - assert!(*m.entry(0).or_insert(true)); - assert_eq!(m.len(), 1); - } - - #[test] - fn test_empty_entry_ref() { - let mut m: HashMap = HashMap::new(); - match m.entry_ref("poneyland") { - EntryRef::Occupied(_) => panic!(), - EntryRef::Vacant(_) => {} - } - assert!(*m.entry_ref("poneyland").or_insert(true)); - assert_eq!(m.len(), 1); - } - - #[test] - fn test_empty_iter() { - let mut m: HashMap = HashMap::new(); - assert_eq!(m.drain().next(), None); - assert_eq!(m.keys().next(), None); - assert_eq!(m.values().next(), None); - assert_eq!(m.values_mut().next(), None); - assert_eq!(m.iter().next(), None); - assert_eq!(m.iter_mut().next(), None); - assert_eq!(m.len(), 0); - assert!(m.is_empty()); - assert_eq!(m.into_iter().next(), None); - } - - #[test] - #[cfg_attr(miri, ignore)] // FIXME: takes too long - fn test_lots_of_insertions() { - let mut m = HashMap::new(); - - // Try this a few times to make sure we never screw up the hashmap's - // internal state. - for _ in 0..10 { - assert!(m.is_empty()); - - for i in 1..1001 { - assert!(m.insert(i, i).is_none()); - - for j in 1..=i { - let r = m.get(&j); - assert_eq!(r, Some(&j)); - } - - for j in i + 1..1001 { - let r = m.get(&j); - assert_eq!(r, None); - } - } - - for i in 1001..2001 { - assert!(!m.contains_key(&i)); - } - - // remove forwards - for i in 1..1001 { - assert!(m.remove(&i).is_some()); - - for j in 1..=i { - assert!(!m.contains_key(&j)); - } - - for j in i + 1..1001 { - assert!(m.contains_key(&j)); - } - } - - for i in 1..1001 { - assert!(!m.contains_key(&i)); - } - - for i in 1..1001 { - assert!(m.insert(i, i).is_none()); - } - - // remove backwards - for i in (1..1001).rev() { - assert!(m.remove(&i).is_some()); - - for j in i..1001 { - assert!(!m.contains_key(&j)); - } - - for j in 1..i { - assert!(m.contains_key(&j)); - } - } - } - } - - #[test] - fn test_find_mut() { - let mut m = HashMap::new(); - assert!(m.insert(1, 12).is_none()); - assert!(m.insert(2, 8).is_none()); - assert!(m.insert(5, 14).is_none()); - let new = 100; - match m.get_mut(&5) { - None => panic!(), - Some(x) => *x = new, - } - assert_eq!(m.get(&5), Some(&new)); - } - - #[test] - fn test_insert_overwrite() { - let mut m = HashMap::new(); - assert!(m.insert(1, 2).is_none()); - assert_eq!(*m.get(&1).unwrap(), 2); - assert!(m.insert(1, 3).is_some()); - assert_eq!(*m.get(&1).unwrap(), 3); - } - - #[test] - fn test_insert_conflicts() { - let mut m = HashMap::with_capacity(4); - assert!(m.insert(1, 2).is_none()); - assert!(m.insert(5, 3).is_none()); - assert!(m.insert(9, 4).is_none()); - assert_eq!(*m.get(&9).unwrap(), 4); - assert_eq!(*m.get(&5).unwrap(), 3); - assert_eq!(*m.get(&1).unwrap(), 2); - } - - #[test] - fn test_conflict_remove() { - let mut m = HashMap::with_capacity(4); - assert!(m.insert(1, 2).is_none()); - assert_eq!(*m.get(&1).unwrap(), 2); - assert!(m.insert(5, 3).is_none()); - assert_eq!(*m.get(&1).unwrap(), 2); - assert_eq!(*m.get(&5).unwrap(), 3); - assert!(m.insert(9, 4).is_none()); - assert_eq!(*m.get(&1).unwrap(), 2); - assert_eq!(*m.get(&5).unwrap(), 3); - assert_eq!(*m.get(&9).unwrap(), 4); - assert!(m.remove(&1).is_some()); - assert_eq!(*m.get(&9).unwrap(), 4); - assert_eq!(*m.get(&5).unwrap(), 3); - } - - #[test] - fn test_insert_unique_unchecked() { - let mut map = HashMap::new(); - let (k1, v1) = map.insert_unique_unchecked(10, 11); - assert_eq!((&10, &mut 11), (k1, v1)); - let (k2, v2) = map.insert_unique_unchecked(20, 21); - assert_eq!((&20, &mut 21), (k2, v2)); - assert_eq!(Some(&11), map.get(&10)); - assert_eq!(Some(&21), map.get(&20)); - assert_eq!(None, map.get(&30)); - } - - #[test] - fn test_is_empty() { - let mut m = HashMap::with_capacity(4); - assert!(m.insert(1, 2).is_none()); - assert!(!m.is_empty()); - assert!(m.remove(&1).is_some()); - assert!(m.is_empty()); - } - - #[test] - fn test_remove() { - let mut m = HashMap::new(); - m.insert(1, 2); - assert_eq!(m.remove(&1), Some(2)); - assert_eq!(m.remove(&1), None); - } - - #[test] - fn test_remove_entry() { - let mut m = HashMap::new(); - m.insert(1, 2); - assert_eq!(m.remove_entry(&1), Some((1, 2))); - assert_eq!(m.remove(&1), None); - } - - #[test] - fn test_iterate() { - let mut m = HashMap::with_capacity(4); - for i in 0..32 { - assert!(m.insert(i, i * 2).is_none()); - } - assert_eq!(m.len(), 32); - - let mut observed: u32 = 0; - - for (k, v) in &m { - assert_eq!(*v, *k * 2); - observed |= 1 << *k; - } - assert_eq!(observed, 0xFFFF_FFFF); - } - - #[test] - fn test_keys() { - let vec = vec![(1, 'a'), (2, 'b'), (3, 'c')]; - let map: HashMap<_, _> = vec.into_iter().collect(); - let keys: Vec<_> = map.keys().copied().collect(); - assert_eq!(keys.len(), 3); - assert!(keys.contains(&1)); - assert!(keys.contains(&2)); - assert!(keys.contains(&3)); - } - - #[test] - fn test_values() { - let vec = vec![(1, 'a'), (2, 'b'), (3, 'c')]; - let map: HashMap<_, _> = vec.into_iter().collect(); - let values: Vec<_> = map.values().copied().collect(); - assert_eq!(values.len(), 3); - assert!(values.contains(&'a')); - assert!(values.contains(&'b')); - assert!(values.contains(&'c')); - } - - #[test] - fn test_values_mut() { - let vec = vec![(1, 1), (2, 2), (3, 3)]; - let mut map: HashMap<_, _> = vec.into_iter().collect(); - for value in map.values_mut() { - *value *= 2; - } - let values: Vec<_> = map.values().copied().collect(); - assert_eq!(values.len(), 3); - assert!(values.contains(&2)); - assert!(values.contains(&4)); - assert!(values.contains(&6)); - } - - #[test] - fn test_into_keys() { - let vec = vec![(1, 'a'), (2, 'b'), (3, 'c')]; - let map: HashMap<_, _> = vec.into_iter().collect(); - let keys: Vec<_> = map.into_keys().collect(); - - assert_eq!(keys.len(), 3); - assert!(keys.contains(&1)); - assert!(keys.contains(&2)); - assert!(keys.contains(&3)); - } - - #[test] - fn test_into_values() { - let vec = vec![(1, 'a'), (2, 'b'), (3, 'c')]; - let map: HashMap<_, _> = vec.into_iter().collect(); - let values: Vec<_> = map.into_values().collect(); - - assert_eq!(values.len(), 3); - assert!(values.contains(&'a')); - assert!(values.contains(&'b')); - assert!(values.contains(&'c')); - } - - #[test] - fn test_find() { - let mut m = HashMap::new(); - assert!(m.get(&1).is_none()); - m.insert(1, 2); - match m.get(&1) { - None => panic!(), - Some(v) => assert_eq!(*v, 2), - } - } - - #[test] - fn test_eq() { - let mut m1 = HashMap::new(); - m1.insert(1, 2); - m1.insert(2, 3); - m1.insert(3, 4); - - let mut m2 = HashMap::new(); - m2.insert(1, 2); - m2.insert(2, 3); - - assert!(m1 != m2); - - m2.insert(3, 4); - - assert_eq!(m1, m2); - } - - #[test] - fn test_show() { - let mut map = HashMap::new(); - let empty: HashMap = HashMap::new(); - - map.insert(1, 2); - map.insert(3, 4); - - let map_str = format!("{:?}", map); - - assert!(map_str == "{1: 2, 3: 4}" || map_str == "{3: 4, 1: 2}"); - assert_eq!(format!("{:?}", empty), "{}"); - } - - #[test] - fn test_expand() { - let mut m = HashMap::new(); - - assert_eq!(m.len(), 0); - assert!(m.is_empty()); - - let mut i = 0; - let old_raw_cap = m.raw_capacity(); - while old_raw_cap == m.raw_capacity() { - m.insert(i, i); - i += 1; - } - - assert_eq!(m.len(), i); - assert!(!m.is_empty()); - } - - #[test] - fn test_behavior_resize_policy() { - let mut m = HashMap::new(); - - assert_eq!(m.len(), 0); - assert_eq!(m.raw_capacity(), 1); - assert!(m.is_empty()); - - m.insert(0, 0); - m.remove(&0); - assert!(m.is_empty()); - let initial_raw_cap = m.raw_capacity(); - m.reserve(initial_raw_cap); - let raw_cap = m.raw_capacity(); - - assert_eq!(raw_cap, initial_raw_cap * 2); - - let mut i = 0; - for _ in 0..raw_cap * 3 / 4 { - m.insert(i, i); - i += 1; - } - // three quarters full - - assert_eq!(m.len(), i); - assert_eq!(m.raw_capacity(), raw_cap); - - for _ in 0..raw_cap / 4 { - m.insert(i, i); - i += 1; - } - // half full - - let new_raw_cap = m.raw_capacity(); - assert_eq!(new_raw_cap, raw_cap * 2); - - for _ in 0..raw_cap / 2 - 1 { - i -= 1; - m.remove(&i); - assert_eq!(m.raw_capacity(), new_raw_cap); - } - // A little more than one quarter full. - m.shrink_to_fit(); - assert_eq!(m.raw_capacity(), raw_cap); - // again, a little more than half full - for _ in 0..raw_cap / 2 { - i -= 1; - m.remove(&i); - } - m.shrink_to_fit(); - - assert_eq!(m.len(), i); - assert!(!m.is_empty()); - assert_eq!(m.raw_capacity(), initial_raw_cap); - } - - #[test] - fn test_reserve_shrink_to_fit() { - let mut m = HashMap::new(); - m.insert(0, 0); - m.remove(&0); - assert!(m.capacity() >= m.len()); - for i in 0..128 { - m.insert(i, i); - } - m.reserve(256); - - let usable_cap = m.capacity(); - for i in 128..(128 + 256) { - m.insert(i, i); - assert_eq!(m.capacity(), usable_cap); - } - - for i in 100..(128 + 256) { - assert_eq!(m.remove(&i), Some(i)); - } - m.shrink_to_fit(); - - assert_eq!(m.len(), 100); - assert!(!m.is_empty()); - assert!(m.capacity() >= m.len()); - - for i in 0..100 { - assert_eq!(m.remove(&i), Some(i)); - } - m.shrink_to_fit(); - m.insert(0, 0); - - assert_eq!(m.len(), 1); - assert!(m.capacity() >= m.len()); - assert_eq!(m.remove(&0), Some(0)); - } - - #[test] - fn test_from_iter() { - let xs = [(1, 1), (2, 2), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6)]; - - let map: HashMap<_, _> = xs.iter().copied().collect(); - - for &(k, v) in &xs { - assert_eq!(map.get(&k), Some(&v)); - } - - assert_eq!(map.iter().len(), xs.len() - 1); - } - - #[test] - fn test_size_hint() { - let xs = [(1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6)]; - - let map: HashMap<_, _> = xs.iter().copied().collect(); - - let mut iter = map.iter(); - - for _ in iter.by_ref().take(3) {} - - assert_eq!(iter.size_hint(), (3, Some(3))); - } - - #[test] - fn test_iter_len() { - let xs = [(1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6)]; - - let map: HashMap<_, _> = xs.iter().copied().collect(); - - let mut iter = map.iter(); - - for _ in iter.by_ref().take(3) {} - - assert_eq!(iter.len(), 3); - } - - #[test] - fn test_mut_size_hint() { - let xs = [(1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6)]; - - let mut map: HashMap<_, _> = xs.iter().copied().collect(); - - let mut iter = map.iter_mut(); - - for _ in iter.by_ref().take(3) {} - - assert_eq!(iter.size_hint(), (3, Some(3))); - } - - #[test] - fn test_iter_mut_len() { - let xs = [(1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6)]; - - let mut map: HashMap<_, _> = xs.iter().copied().collect(); - - let mut iter = map.iter_mut(); - - for _ in iter.by_ref().take(3) {} - - assert_eq!(iter.len(), 3); - } - - #[test] - fn test_index() { - let mut map = HashMap::new(); - - map.insert(1, 2); - map.insert(2, 1); - map.insert(3, 4); - - assert_eq!(map[&2], 1); - } - - #[test] - #[should_panic] - fn test_index_nonexistent() { - let mut map = HashMap::new(); - - map.insert(1, 2); - map.insert(2, 1); - map.insert(3, 4); - - #[allow(clippy::no_effect)] // false positive lint - map[&4]; - } - - #[test] - fn test_entry() { - let xs = [(1, 10), (2, 20), (3, 30), (4, 40), (5, 50), (6, 60)]; - - let mut map: HashMap<_, _> = xs.iter().copied().collect(); - - // Existing key (insert) - match map.entry(1) { - Vacant(_) => unreachable!(), - Occupied(mut view) => { - assert_eq!(view.get(), &10); - assert_eq!(view.insert(100), 10); - } - } - assert_eq!(map.get(&1).unwrap(), &100); - assert_eq!(map.len(), 6); - - // Existing key (update) - match map.entry(2) { - Vacant(_) => unreachable!(), - Occupied(mut view) => { - let v = view.get_mut(); - let new_v = (*v) * 10; - *v = new_v; - } - } - assert_eq!(map.get(&2).unwrap(), &200); - assert_eq!(map.len(), 6); - - // Existing key (take) - match map.entry(3) { - Vacant(_) => unreachable!(), - Occupied(view) => { - assert_eq!(view.remove(), 30); - } - } - assert_eq!(map.get(&3), None); - assert_eq!(map.len(), 5); - - // Inexistent key (insert) - match map.entry(10) { - Occupied(_) => unreachable!(), - Vacant(view) => { - assert_eq!(*view.insert(1000), 1000); - } - } - assert_eq!(map.get(&10).unwrap(), &1000); - assert_eq!(map.len(), 6); - } - - #[test] - fn test_entry_ref() { - let xs = [ - ("One".to_owned(), 10), - ("Two".to_owned(), 20), - ("Three".to_owned(), 30), - ("Four".to_owned(), 40), - ("Five".to_owned(), 50), - ("Six".to_owned(), 60), - ]; - - let mut map: HashMap<_, _> = xs.iter().cloned().collect(); - - // Existing key (insert) - match map.entry_ref("One") { - EntryRef::Vacant(_) => unreachable!(), - EntryRef::Occupied(mut view) => { - assert_eq!(view.get(), &10); - assert_eq!(view.insert(100), 10); - } - } - assert_eq!(map.get("One").unwrap(), &100); - assert_eq!(map.len(), 6); - - // Existing key (update) - match map.entry_ref("Two") { - EntryRef::Vacant(_) => unreachable!(), - EntryRef::Occupied(mut view) => { - let v = view.get_mut(); - let new_v = (*v) * 10; - *v = new_v; - } - } - assert_eq!(map.get("Two").unwrap(), &200); - assert_eq!(map.len(), 6); - - // Existing key (take) - match map.entry_ref("Three") { - EntryRef::Vacant(_) => unreachable!(), - EntryRef::Occupied(view) => { - assert_eq!(view.remove(), 30); - } - } - assert_eq!(map.get("Three"), None); - assert_eq!(map.len(), 5); - - // Inexistent key (insert) - match map.entry_ref("Ten") { - EntryRef::Occupied(_) => unreachable!(), - EntryRef::Vacant(view) => { - assert_eq!(*view.insert(1000), 1000); - } - } - assert_eq!(map.get("Ten").unwrap(), &1000); - assert_eq!(map.len(), 6); - } - - #[test] - fn test_entry_take_doesnt_corrupt() { - #![allow(deprecated)] //rand - // Test for #19292 - fn check(m: &HashMap) { - for k in m.keys() { - assert!(m.contains_key(k), "{} is in keys() but not in the map?", k); - } - } - - let mut m = HashMap::new(); - - let mut rng = { - let seed = u64::from_le_bytes(*b"testseed"); - SmallRng::seed_from_u64(seed) - }; - - // Populate the map with some items. - for _ in 0..50 { - let x = rng.gen_range(-10..10); - m.insert(x, ()); - } - - for _ in 0..1000 { - let x = rng.gen_range(-10..10); - match m.entry(x) { - Vacant(_) => {} - Occupied(e) => { - e.remove(); - } - } - - check(&m); - } - } - - #[test] - fn test_entry_ref_take_doesnt_corrupt() { - #![allow(deprecated)] //rand - // Test for #19292 - fn check(m: &HashMap) { - for k in m.keys() { - assert!(m.contains_key(k), "{} is in keys() but not in the map?", k); - } - } - - let mut m = HashMap::new(); - - let mut rng = { - let seed = u64::from_le_bytes(*b"testseed"); - SmallRng::seed_from_u64(seed) - }; - - // Populate the map with some items. - for _ in 0..50 { - let mut x = std::string::String::with_capacity(1); - x.push(rng.gen_range('a'..='z')); - m.insert(x, ()); - } - - for _ in 0..1000 { - let mut x = std::string::String::with_capacity(1); - x.push(rng.gen_range('a'..='z')); - match m.entry_ref(x.as_str()) { - EntryRef::Vacant(_) => {} - EntryRef::Occupied(e) => { - e.remove(); - } - } - - check(&m); - } - } - - #[test] - fn test_extend_ref_k_ref_v() { - let mut a = HashMap::new(); - a.insert(1, "one"); - let mut b = HashMap::new(); - b.insert(2, "two"); - b.insert(3, "three"); - - a.extend(&b); - - assert_eq!(a.len(), 3); - assert_eq!(a[&1], "one"); - assert_eq!(a[&2], "two"); - assert_eq!(a[&3], "three"); - } - - #[test] - fn test_extend_ref_kv_tuple() { - use std::ops::AddAssign; - let mut a = HashMap::new(); - a.insert(0, 0); - - fn create_arr + Copy, const N: usize>(start: T, step: T) -> [(T, T); N] { - let mut outs: [(T, T); N] = [(start, start); N]; - let mut element = step; - outs.iter_mut().skip(1).for_each(|(k, v)| { - *k += element; - *v += element; - element += step; - }); - outs - } - - let for_iter: Vec<_> = (0..100).map(|i| (i, i)).collect(); - let iter = for_iter.iter(); - let vec: Vec<_> = (100..200).map(|i| (i, i)).collect(); - a.extend(iter); - a.extend(&vec); - a.extend(create_arr::(200, 1)); - - assert_eq!(a.len(), 300); - - for item in 0..300 { - assert_eq!(a[&item], item); - } - } - - #[test] - fn test_capacity_not_less_than_len() { - let mut a = HashMap::new(); - let mut item = 0; - - for _ in 0..116 { - a.insert(item, 0); - item += 1; - } - - assert!(a.capacity() > a.len()); - - let free = a.capacity() - a.len(); - for _ in 0..free { - a.insert(item, 0); - item += 1; - } - - assert_eq!(a.len(), a.capacity()); - - // Insert at capacity should cause allocation. - a.insert(item, 0); - assert!(a.capacity() > a.len()); - } - - #[test] - fn test_occupied_entry_key() { - let mut a = HashMap::new(); - let key = "hello there"; - let value = "value goes here"; - assert!(a.is_empty()); - a.insert(key, value); - assert_eq!(a.len(), 1); - assert_eq!(a[key], value); - - match a.entry(key) { - Vacant(_) => panic!(), - Occupied(e) => assert_eq!(key, *e.key()), - } - assert_eq!(a.len(), 1); - assert_eq!(a[key], value); - } - - #[test] - fn test_occupied_entry_ref_key() { - let mut a = HashMap::new(); - let key = "hello there"; - let value = "value goes here"; - assert!(a.is_empty()); - a.insert(key.to_owned(), value); - assert_eq!(a.len(), 1); - assert_eq!(a[key], value); - - match a.entry_ref(key) { - EntryRef::Vacant(_) => panic!(), - EntryRef::Occupied(e) => assert_eq!(key, e.key()), - } - assert_eq!(a.len(), 1); - assert_eq!(a[key], value); - } - - #[test] - fn test_vacant_entry_key() { - let mut a = HashMap::new(); - let key = "hello there"; - let value = "value goes here"; - - assert!(a.is_empty()); - match a.entry(key) { - Occupied(_) => panic!(), - Vacant(e) => { - assert_eq!(key, *e.key()); - e.insert(value); - } - } - assert_eq!(a.len(), 1); - assert_eq!(a[key], value); - } - - #[test] - fn test_vacant_entry_ref_key() { - let mut a: HashMap = HashMap::new(); - let key = "hello there"; - let value = "value goes here"; - - assert!(a.is_empty()); - match a.entry_ref(key) { - EntryRef::Occupied(_) => panic!(), - EntryRef::Vacant(e) => { - assert_eq!(key, e.key()); - e.insert(value); - } - } - assert_eq!(a.len(), 1); - assert_eq!(a[key], value); - } - - #[test] - fn test_occupied_entry_replace_entry_with() { - let mut a = HashMap::new(); - - let key = "a key"; - let value = "an initial value"; - let new_value = "a new value"; - - let entry = a.entry(key).insert(value).replace_entry_with(|k, v| { - assert_eq!(k, &key); - assert_eq!(v, value); - Some(new_value) - }); - - match entry { - Occupied(e) => { - assert_eq!(e.key(), &key); - assert_eq!(e.get(), &new_value); - } - Vacant(_) => panic!(), - } - - assert_eq!(a[key], new_value); - assert_eq!(a.len(), 1); - - let entry = match a.entry(key) { - Occupied(e) => e.replace_entry_with(|k, v| { - assert_eq!(k, &key); - assert_eq!(v, new_value); - None - }), - Vacant(_) => panic!(), - }; - - match entry { - Vacant(e) => assert_eq!(e.key(), &key), - Occupied(_) => panic!(), - } - - assert!(!a.contains_key(key)); - assert_eq!(a.len(), 0); - } - - #[test] - fn test_occupied_entry_ref_replace_entry_with() { - let mut a: HashMap = HashMap::new(); - - let key = "a key"; - let value = "an initial value"; - let new_value = "a new value"; - - let entry = a.entry_ref(key).insert(value).replace_entry_with(|k, v| { - assert_eq!(k, key); - assert_eq!(v, value); - Some(new_value) - }); - - match entry { - EntryRef::Occupied(e) => { - assert_eq!(e.key(), key); - assert_eq!(e.get(), &new_value); - } - EntryRef::Vacant(_) => panic!(), - } - - assert_eq!(a[key], new_value); - assert_eq!(a.len(), 1); - - let entry = match a.entry_ref(key) { - EntryRef::Occupied(e) => e.replace_entry_with(|k, v| { - assert_eq!(k, key); - assert_eq!(v, new_value); - None - }), - EntryRef::Vacant(_) => panic!(), - }; - - match entry { - EntryRef::Vacant(e) => assert_eq!(e.key(), key), - EntryRef::Occupied(_) => panic!(), - } - - assert!(!a.contains_key(key)); - assert_eq!(a.len(), 0); - } - - #[test] - fn test_entry_and_replace_entry_with() { - let mut a = HashMap::new(); - - let key = "a key"; - let value = "an initial value"; - let new_value = "a new value"; - - let entry = a.entry(key).and_replace_entry_with(|_, _| panic!()); - - match entry { - Vacant(e) => assert_eq!(e.key(), &key), - Occupied(_) => panic!(), - } - - a.insert(key, value); - - let entry = a.entry(key).and_replace_entry_with(|k, v| { - assert_eq!(k, &key); - assert_eq!(v, value); - Some(new_value) - }); - - match entry { - Occupied(e) => { - assert_eq!(e.key(), &key); - assert_eq!(e.get(), &new_value); - } - Vacant(_) => panic!(), - } - - assert_eq!(a[key], new_value); - assert_eq!(a.len(), 1); - - let entry = a.entry(key).and_replace_entry_with(|k, v| { - assert_eq!(k, &key); - assert_eq!(v, new_value); - None - }); - - match entry { - Vacant(e) => assert_eq!(e.key(), &key), - Occupied(_) => panic!(), - } - - assert!(!a.contains_key(key)); - assert_eq!(a.len(), 0); - } - - #[test] - fn test_entry_ref_and_replace_entry_with() { - let mut a = HashMap::new(); - - let key = "a key"; - let value = "an initial value"; - let new_value = "a new value"; - - let entry = a.entry_ref(key).and_replace_entry_with(|_, _| panic!()); - - match entry { - EntryRef::Vacant(e) => assert_eq!(e.key(), key), - EntryRef::Occupied(_) => panic!(), - } - - a.insert(key.to_owned(), value); - - let entry = a.entry_ref(key).and_replace_entry_with(|k, v| { - assert_eq!(k, key); - assert_eq!(v, value); - Some(new_value) - }); - - match entry { - EntryRef::Occupied(e) => { - assert_eq!(e.key(), key); - assert_eq!(e.get(), &new_value); - } - EntryRef::Vacant(_) => panic!(), - } - - assert_eq!(a[key], new_value); - assert_eq!(a.len(), 1); - - let entry = a.entry_ref(key).and_replace_entry_with(|k, v| { - assert_eq!(k, key); - assert_eq!(v, new_value); - None - }); - - match entry { - EntryRef::Vacant(e) => assert_eq!(e.key(), key), - EntryRef::Occupied(_) => panic!(), - } - - assert!(!a.contains_key(key)); - assert_eq!(a.len(), 0); - } - - #[test] - fn test_raw_occupied_entry_replace_entry_with() { - let mut a = HashMap::new(); - - let key = "a key"; - let value = "an initial value"; - let new_value = "a new value"; - - let entry = a - .raw_entry_mut() - .from_key(&key) - .insert(key, value) - .replace_entry_with(|k, v| { - assert_eq!(k, &key); - assert_eq!(v, value); - Some(new_value) - }); - - match entry { - RawEntryMut::Occupied(e) => { - assert_eq!(e.key(), &key); - assert_eq!(e.get(), &new_value); - } - RawEntryMut::Vacant(_) => panic!(), - } - - assert_eq!(a[key], new_value); - assert_eq!(a.len(), 1); - - let entry = match a.raw_entry_mut().from_key(&key) { - RawEntryMut::Occupied(e) => e.replace_entry_with(|k, v| { - assert_eq!(k, &key); - assert_eq!(v, new_value); - None - }), - RawEntryMut::Vacant(_) => panic!(), - }; - - match entry { - RawEntryMut::Vacant(_) => {} - RawEntryMut::Occupied(_) => panic!(), - } - - assert!(!a.contains_key(key)); - assert_eq!(a.len(), 0); - } - - #[test] - fn test_raw_entry_and_replace_entry_with() { - let mut a = HashMap::new(); - - let key = "a key"; - let value = "an initial value"; - let new_value = "a new value"; - - let entry = a - .raw_entry_mut() - .from_key(&key) - .and_replace_entry_with(|_, _| panic!()); - - match entry { - RawEntryMut::Vacant(_) => {} - RawEntryMut::Occupied(_) => panic!(), - } - - a.insert(key, value); - - let entry = a - .raw_entry_mut() - .from_key(&key) - .and_replace_entry_with(|k, v| { - assert_eq!(k, &key); - assert_eq!(v, value); - Some(new_value) - }); - - match entry { - RawEntryMut::Occupied(e) => { - assert_eq!(e.key(), &key); - assert_eq!(e.get(), &new_value); - } - RawEntryMut::Vacant(_) => panic!(), - } - - assert_eq!(a[key], new_value); - assert_eq!(a.len(), 1); - - let entry = a - .raw_entry_mut() - .from_key(&key) - .and_replace_entry_with(|k, v| { - assert_eq!(k, &key); - assert_eq!(v, new_value); - None - }); - - match entry { - RawEntryMut::Vacant(_) => {} - RawEntryMut::Occupied(_) => panic!(), - } - - assert!(!a.contains_key(key)); - assert_eq!(a.len(), 0); - } - - #[test] - fn test_replace_entry_with_doesnt_corrupt() { - #![allow(deprecated)] //rand - // Test for #19292 - fn check(m: &HashMap) { - for k in m.keys() { - assert!(m.contains_key(k), "{} is in keys() but not in the map?", k); - } - } - - let mut m = HashMap::new(); - - let mut rng = { - let seed = u64::from_le_bytes(*b"testseed"); - SmallRng::seed_from_u64(seed) - }; - - // Populate the map with some items. - for _ in 0..50 { - let x = rng.gen_range(-10..10); - m.insert(x, ()); - } - - for _ in 0..1000 { - let x = rng.gen_range(-10..10); - m.entry(x).and_replace_entry_with(|_, _| None); - check(&m); - } - } - - #[test] - fn test_replace_entry_ref_with_doesnt_corrupt() { - #![allow(deprecated)] //rand - // Test for #19292 - fn check(m: &HashMap) { - for k in m.keys() { - assert!(m.contains_key(k), "{} is in keys() but not in the map?", k); - } - } - - let mut m = HashMap::new(); - - let mut rng = { - let seed = u64::from_le_bytes(*b"testseed"); - SmallRng::seed_from_u64(seed) - }; - - // Populate the map with some items. - for _ in 0..50 { - let mut x = std::string::String::with_capacity(1); - x.push(rng.gen_range('a'..='z')); - m.insert(x, ()); - } - - for _ in 0..1000 { - let mut x = std::string::String::with_capacity(1); - x.push(rng.gen_range('a'..='z')); - m.entry_ref(x.as_str()).and_replace_entry_with(|_, _| None); - check(&m); - } - } - - #[test] - fn test_retain() { - let mut map: HashMap = (0..100).map(|x| (x, x * 10)).collect(); - - map.retain(|&k, _| k % 2 == 0); - assert_eq!(map.len(), 50); - assert_eq!(map[&2], 20); - assert_eq!(map[&4], 40); - assert_eq!(map[&6], 60); - } - - #[test] - fn test_drain_filter() { - { - let mut map: HashMap = (0..8).map(|x| (x, x * 10)).collect(); - let drained = map.drain_filter(|&k, _| k % 2 == 0); - let mut out = drained.collect::>(); - out.sort_unstable(); - assert_eq!(vec![(0, 0), (2, 20), (4, 40), (6, 60)], out); - assert_eq!(map.len(), 4); - } - { - let mut map: HashMap = (0..8).map(|x| (x, x * 10)).collect(); - drop(map.drain_filter(|&k, _| k % 2 == 0)); - assert_eq!(map.len(), 4); - } - } - - #[test] - #[cfg_attr(miri, ignore)] // FIXME: no OOM signalling (https://github.com/rust-lang/miri/issues/613) - fn test_try_reserve() { - use crate::TryReserveError::{AllocError, CapacityOverflow}; - - const MAX_ISIZE: usize = isize::MAX as usize; - - let mut empty_bytes: HashMap = HashMap::new(); - - if let Err(CapacityOverflow) = empty_bytes.try_reserve(usize::MAX) { - } else { - panic!("usize::MAX should trigger an overflow!"); - } - - if let Err(CapacityOverflow) = empty_bytes.try_reserve(MAX_ISIZE) { - } else { - panic!("isize::MAX should trigger an overflow!"); - } - - if let Err(AllocError { .. }) = empty_bytes.try_reserve(MAX_ISIZE / 5) { - } else { - // This may succeed if there is enough free memory. Attempt to - // allocate a few more hashmaps to ensure the allocation will fail. - let mut empty_bytes2: HashMap = HashMap::new(); - let _ = empty_bytes2.try_reserve(MAX_ISIZE / 5); - let mut empty_bytes3: HashMap = HashMap::new(); - let _ = empty_bytes3.try_reserve(MAX_ISIZE / 5); - let mut empty_bytes4: HashMap = HashMap::new(); - if let Err(AllocError { .. }) = empty_bytes4.try_reserve(MAX_ISIZE / 5) { - } else { - panic!("isize::MAX / 5 should trigger an OOM!"); - } - } - } - - #[test] - fn test_raw_entry() { - use super::RawEntryMut::{Occupied, Vacant}; - - let xs = [(1_i32, 10_i32), (2, 20), (3, 30), (4, 40), (5, 50), (6, 60)]; - - let mut map: HashMap<_, _> = xs.iter().copied().collect(); - - let compute_hash = |map: &HashMap, k: i32| -> u64 { - super::make_insert_hash::(map.hasher(), &k) - }; - - // Existing key (insert) - match map.raw_entry_mut().from_key(&1) { - Vacant(_) => unreachable!(), - Occupied(mut view) => { - assert_eq!(view.get(), &10); - assert_eq!(view.insert(100), 10); - } - } - let hash1 = compute_hash(&map, 1); - assert_eq!(map.raw_entry().from_key(&1).unwrap(), (&1, &100)); - assert_eq!( - map.raw_entry().from_hash(hash1, |k| *k == 1).unwrap(), - (&1, &100) - ); - assert_eq!( - map.raw_entry().from_key_hashed_nocheck(hash1, &1).unwrap(), - (&1, &100) - ); - assert_eq!(map.len(), 6); - - // Existing key (update) - match map.raw_entry_mut().from_key(&2) { - Vacant(_) => unreachable!(), - Occupied(mut view) => { - let v = view.get_mut(); - let new_v = (*v) * 10; - *v = new_v; - } - } - let hash2 = compute_hash(&map, 2); - assert_eq!(map.raw_entry().from_key(&2).unwrap(), (&2, &200)); - assert_eq!( - map.raw_entry().from_hash(hash2, |k| *k == 2).unwrap(), - (&2, &200) - ); - assert_eq!( - map.raw_entry().from_key_hashed_nocheck(hash2, &2).unwrap(), - (&2, &200) - ); - assert_eq!(map.len(), 6); - - // Existing key (take) - let hash3 = compute_hash(&map, 3); - match map.raw_entry_mut().from_key_hashed_nocheck(hash3, &3) { - Vacant(_) => unreachable!(), - Occupied(view) => { - assert_eq!(view.remove_entry(), (3, 30)); - } - } - assert_eq!(map.raw_entry().from_key(&3), None); - assert_eq!(map.raw_entry().from_hash(hash3, |k| *k == 3), None); - assert_eq!(map.raw_entry().from_key_hashed_nocheck(hash3, &3), None); - assert_eq!(map.len(), 5); - - // Nonexistent key (insert) - match map.raw_entry_mut().from_key(&10) { - Occupied(_) => unreachable!(), - Vacant(view) => { - assert_eq!(view.insert(10, 1000), (&mut 10, &mut 1000)); - } - } - assert_eq!(map.raw_entry().from_key(&10).unwrap(), (&10, &1000)); - assert_eq!(map.len(), 6); - - // Ensure all lookup methods produce equivalent results. - for k in 0..12 { - let hash = compute_hash(&map, k); - let v = map.get(&k).copied(); - let kv = v.as_ref().map(|v| (&k, v)); - - assert_eq!(map.raw_entry().from_key(&k), kv); - assert_eq!(map.raw_entry().from_hash(hash, |q| *q == k), kv); - assert_eq!(map.raw_entry().from_key_hashed_nocheck(hash, &k), kv); - - match map.raw_entry_mut().from_key(&k) { - Occupied(o) => assert_eq!(Some(o.get_key_value()), kv), - Vacant(_) => assert_eq!(v, None), - } - match map.raw_entry_mut().from_key_hashed_nocheck(hash, &k) { - Occupied(o) => assert_eq!(Some(o.get_key_value()), kv), - Vacant(_) => assert_eq!(v, None), - } - match map.raw_entry_mut().from_hash(hash, |q| *q == k) { - Occupied(o) => assert_eq!(Some(o.get_key_value()), kv), - Vacant(_) => assert_eq!(v, None), - } - } - } - - #[test] - fn test_key_without_hash_impl() { - #[derive(Debug)] - struct IntWrapper(u64); - - let mut m: HashMap = HashMap::default(); - { - assert!(m.raw_entry().from_hash(0, |k| k.0 == 0).is_none()); - } - { - let vacant_entry = match m.raw_entry_mut().from_hash(0, |k| k.0 == 0) { - RawEntryMut::Occupied(..) => panic!("Found entry for key 0"), - RawEntryMut::Vacant(e) => e, - }; - vacant_entry.insert_with_hasher(0, IntWrapper(0), (), |k| k.0); - } - { - assert!(m.raw_entry().from_hash(0, |k| k.0 == 0).is_some()); - assert!(m.raw_entry().from_hash(1, |k| k.0 == 1).is_none()); - assert!(m.raw_entry().from_hash(2, |k| k.0 == 2).is_none()); - } - { - let vacant_entry = match m.raw_entry_mut().from_hash(1, |k| k.0 == 1) { - RawEntryMut::Occupied(..) => panic!("Found entry for key 1"), - RawEntryMut::Vacant(e) => e, - }; - vacant_entry.insert_with_hasher(1, IntWrapper(1), (), |k| k.0); - } - { - assert!(m.raw_entry().from_hash(0, |k| k.0 == 0).is_some()); - assert!(m.raw_entry().from_hash(1, |k| k.0 == 1).is_some()); - assert!(m.raw_entry().from_hash(2, |k| k.0 == 2).is_none()); - } - { - let occupied_entry = match m.raw_entry_mut().from_hash(0, |k| k.0 == 0) { - RawEntryMut::Occupied(e) => e, - RawEntryMut::Vacant(..) => panic!("Couldn't find entry for key 0"), - }; - occupied_entry.remove(); - } - assert!(m.raw_entry().from_hash(0, |k| k.0 == 0).is_none()); - assert!(m.raw_entry().from_hash(1, |k| k.0 == 1).is_some()); - assert!(m.raw_entry().from_hash(2, |k| k.0 == 2).is_none()); - } - - #[test] - #[cfg(feature = "raw")] - fn test_into_iter_refresh() { - #[cfg(miri)] - const N: usize = 32; - #[cfg(not(miri))] - const N: usize = 128; - - let mut rng = rand::thread_rng(); - for n in 0..N { - let mut map = HashMap::new(); - for i in 0..n { - assert!(map.insert(i, 2 * i).is_none()); - } - let hash_builder = map.hasher().clone(); - - let mut it = unsafe { map.table.iter() }; - assert_eq!(it.len(), n); - - let mut i = 0; - let mut left = n; - let mut removed = Vec::new(); - loop { - // occasionally remove some elements - if i < n && rng.gen_bool(0.1) { - let hash_value = super::make_insert_hash(&hash_builder, &i); - - unsafe { - let e = map.table.find(hash_value, |q| q.0.eq(&i)); - if let Some(e) = e { - it.reflect_remove(&e); - let t = map.table.remove(e); - removed.push(t); - left -= 1; - } else { - assert!(removed.contains(&(i, 2 * i)), "{} not in {:?}", i, removed); - let e = map.table.insert( - hash_value, - (i, 2 * i), - super::make_hasher::<_, usize, _>(&hash_builder), - ); - it.reflect_insert(&e); - if let Some(p) = removed.iter().position(|e| e == &(i, 2 * i)) { - removed.swap_remove(p); - } - left += 1; - } - } - } - - let e = it.next(); - if e.is_none() { - break; - } - assert!(i < n); - let t = unsafe { e.unwrap().as_ref() }; - assert!(!removed.contains(t)); - let (key, value) = t; - assert_eq!(*value, 2 * key); - i += 1; - } - assert!(i <= n); - - // just for safety: - assert_eq!(map.table.len(), left); - } - } - - #[test] - fn test_const_with_hasher() { - use core::hash::BuildHasher; - use std::collections::hash_map::DefaultHasher; - - #[derive(Clone)] - struct MyHasher; - impl BuildHasher for MyHasher { - type Hasher = DefaultHasher; - - fn build_hasher(&self) -> DefaultHasher { - DefaultHasher::new() - } - } - - const EMPTY_MAP: HashMap = - HashMap::with_hasher(MyHasher); - - let mut map = EMPTY_MAP; - map.insert(17, "seventeen".to_owned()); - assert_eq!("seventeen", map[&17]); - } - - #[test] - fn test_get_each_mut() { - let mut map = HashMap::new(); - map.insert("foo".to_owned(), 0); - map.insert("bar".to_owned(), 10); - map.insert("baz".to_owned(), 20); - map.insert("qux".to_owned(), 30); - - let xs = map.get_many_mut(["foo", "qux"]); - assert_eq!(xs, Some([&mut 0, &mut 30])); - - let xs = map.get_many_mut(["foo", "dud"]); - assert_eq!(xs, None); - - let xs = map.get_many_mut(["foo", "foo"]); - assert_eq!(xs, None); - - let ys = map.get_many_key_value_mut(["bar", "baz"]); - assert_eq!( - ys, - Some([(&"bar".to_owned(), &mut 10), (&"baz".to_owned(), &mut 20),]), - ); - - let ys = map.get_many_key_value_mut(["bar", "dip"]); - assert_eq!(ys, None); - - let ys = map.get_many_key_value_mut(["baz", "baz"]); - assert_eq!(ys, None); - } - - #[test] - #[should_panic = "panic in drop"] - fn test_clone_from_double_drop() { - #[derive(Clone)] - struct CheckedDrop { - panic_in_drop: bool, - dropped: bool, - } - impl Drop for CheckedDrop { - fn drop(&mut self) { - if self.panic_in_drop { - self.dropped = true; - panic!("panic in drop"); - } - if self.dropped { - panic!("double drop"); - } - self.dropped = true; - } - } - const DISARMED: CheckedDrop = CheckedDrop { - panic_in_drop: false, - dropped: false, - }; - const ARMED: CheckedDrop = CheckedDrop { - panic_in_drop: true, - dropped: false, - }; - - let mut map1 = HashMap::new(); - map1.insert(1, DISARMED); - map1.insert(2, DISARMED); - map1.insert(3, DISARMED); - map1.insert(4, DISARMED); - - let mut map2 = HashMap::new(); - map2.insert(1, DISARMED); - map2.insert(2, ARMED); - map2.insert(3, DISARMED); - map2.insert(4, DISARMED); - - map2.clone_from(&map1); - } -} diff -Nru temporalio-1.3.0/vendor/hashbrown-0.13.2/src/raw/alloc.rs temporalio-1.3.0/vendor/hashbrown-0.13.2/src/raw/alloc.rs --- temporalio-1.3.0/vendor/hashbrown-0.13.2/src/raw/alloc.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/hashbrown-0.13.2/src/raw/alloc.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,73 +0,0 @@ -pub(crate) use self::inner::{do_alloc, Allocator, Global}; - -#[cfg(feature = "nightly")] -mod inner { - use crate::alloc::alloc::Layout; - pub use crate::alloc::alloc::{Allocator, Global}; - use core::ptr::NonNull; - - #[allow(clippy::map_err_ignore)] - pub fn do_alloc(alloc: &A, layout: Layout) -> Result, ()> { - match alloc.allocate(layout) { - Ok(ptr) => Ok(ptr.as_non_null_ptr()), - Err(_) => Err(()), - } - } - - #[cfg(feature = "bumpalo")] - unsafe impl Allocator for crate::BumpWrapper<'_> { - #[inline] - fn allocate(&self, layout: Layout) -> Result, core::alloc::AllocError> { - match self.0.try_alloc_layout(layout) { - Ok(ptr) => Ok(NonNull::slice_from_raw_parts(ptr, layout.size())), - Err(_) => Err(core::alloc::AllocError), - } - } - #[inline] - unsafe fn deallocate(&self, _ptr: NonNull, _layout: Layout) {} - } -} - -#[cfg(not(feature = "nightly"))] -mod inner { - use crate::alloc::alloc::{alloc, dealloc, Layout}; - use core::ptr::NonNull; - - #[allow(clippy::missing_safety_doc)] // not exposed outside of this crate - pub unsafe trait Allocator { - fn allocate(&self, layout: Layout) -> Result, ()>; - unsafe fn deallocate(&self, ptr: NonNull, layout: Layout); - } - - #[derive(Copy, Clone)] - pub struct Global; - unsafe impl Allocator for Global { - #[inline] - fn allocate(&self, layout: Layout) -> Result, ()> { - unsafe { NonNull::new(alloc(layout)).ok_or(()) } - } - #[inline] - unsafe fn deallocate(&self, ptr: NonNull, layout: Layout) { - dealloc(ptr.as_ptr(), layout); - } - } - impl Default for Global { - #[inline] - fn default() -> Self { - Global - } - } - - pub fn do_alloc(alloc: &A, layout: Layout) -> Result, ()> { - alloc.allocate(layout) - } - - #[cfg(feature = "bumpalo")] - unsafe impl Allocator for crate::BumpWrapper<'_> { - #[allow(clippy::map_err_ignore)] - fn allocate(&self, layout: Layout) -> Result, ()> { - self.0.try_alloc_layout(layout).map_err(|_| ()) - } - unsafe fn deallocate(&self, _ptr: NonNull, _layout: Layout) {} - } -} diff -Nru temporalio-1.3.0/vendor/hashbrown-0.13.2/src/raw/bitmask.rs temporalio-1.3.0/vendor/hashbrown-0.13.2/src/raw/bitmask.rs --- temporalio-1.3.0/vendor/hashbrown-0.13.2/src/raw/bitmask.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/hashbrown-0.13.2/src/raw/bitmask.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,122 +0,0 @@ -use super::imp::{BitMaskWord, BITMASK_MASK, BITMASK_STRIDE}; -#[cfg(feature = "nightly")] -use core::intrinsics; - -/// A bit mask which contains the result of a `Match` operation on a `Group` and -/// allows iterating through them. -/// -/// The bit mask is arranged so that low-order bits represent lower memory -/// addresses for group match results. -/// -/// For implementation reasons, the bits in the set may be sparsely packed, so -/// that there is only one bit-per-byte used (the high bit, 7). If this is the -/// case, `BITMASK_STRIDE` will be 8 to indicate a divide-by-8 should be -/// performed on counts/indices to normalize this difference. `BITMASK_MASK` is -/// similarly a mask of all the actually-used bits. -#[derive(Copy, Clone)] -pub struct BitMask(pub BitMaskWord); - -#[allow(clippy::use_self)] -impl BitMask { - /// Returns a new `BitMask` with all bits inverted. - #[inline] - #[must_use] - pub fn invert(self) -> Self { - BitMask(self.0 ^ BITMASK_MASK) - } - - /// Flip the bit in the mask for the entry at the given index. - /// - /// Returns the bit's previous state. - #[inline] - #[allow(clippy::cast_ptr_alignment)] - #[cfg(feature = "raw")] - pub unsafe fn flip(&mut self, index: usize) -> bool { - // NOTE: The + BITMASK_STRIDE - 1 is to set the high bit. - let mask = 1 << (index * BITMASK_STRIDE + BITMASK_STRIDE - 1); - self.0 ^= mask; - // The bit was set if the bit is now 0. - self.0 & mask == 0 - } - - /// Returns a new `BitMask` with the lowest bit removed. - #[inline] - #[must_use] - pub fn remove_lowest_bit(self) -> Self { - BitMask(self.0 & (self.0 - 1)) - } - /// Returns whether the `BitMask` has at least one set bit. - #[inline] - pub fn any_bit_set(self) -> bool { - self.0 != 0 - } - - /// Returns the first set bit in the `BitMask`, if there is one. - #[inline] - pub fn lowest_set_bit(self) -> Option { - if self.0 == 0 { - None - } else { - Some(unsafe { self.lowest_set_bit_nonzero() }) - } - } - - /// Returns the first set bit in the `BitMask`, if there is one. The - /// bitmask must not be empty. - #[inline] - #[cfg(feature = "nightly")] - pub unsafe fn lowest_set_bit_nonzero(self) -> usize { - intrinsics::cttz_nonzero(self.0) as usize / BITMASK_STRIDE - } - #[inline] - #[cfg(not(feature = "nightly"))] - pub unsafe fn lowest_set_bit_nonzero(self) -> usize { - self.trailing_zeros() - } - - /// Returns the number of trailing zeroes in the `BitMask`. - #[inline] - pub fn trailing_zeros(self) -> usize { - // ARM doesn't have a trailing_zeroes instruction, and instead uses - // reverse_bits (RBIT) + leading_zeroes (CLZ). However older ARM - // versions (pre-ARMv7) don't have RBIT and need to emulate it - // instead. Since we only have 1 bit set in each byte on ARM, we can - // use swap_bytes (REV) + leading_zeroes instead. - if cfg!(target_arch = "arm") && BITMASK_STRIDE % 8 == 0 { - self.0.swap_bytes().leading_zeros() as usize / BITMASK_STRIDE - } else { - self.0.trailing_zeros() as usize / BITMASK_STRIDE - } - } - - /// Returns the number of leading zeroes in the `BitMask`. - #[inline] - pub fn leading_zeros(self) -> usize { - self.0.leading_zeros() as usize / BITMASK_STRIDE - } -} - -impl IntoIterator for BitMask { - type Item = usize; - type IntoIter = BitMaskIter; - - #[inline] - fn into_iter(self) -> BitMaskIter { - BitMaskIter(self) - } -} - -/// Iterator over the contents of a `BitMask`, returning the indices of set -/// bits. -pub struct BitMaskIter(BitMask); - -impl Iterator for BitMaskIter { - type Item = usize; - - #[inline] - fn next(&mut self) -> Option { - let bit = self.0.lowest_set_bit()?; - self.0 = self.0.remove_lowest_bit(); - Some(bit) - } -} diff -Nru temporalio-1.3.0/vendor/hashbrown-0.13.2/src/raw/generic.rs temporalio-1.3.0/vendor/hashbrown-0.13.2/src/raw/generic.rs --- temporalio-1.3.0/vendor/hashbrown-0.13.2/src/raw/generic.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/hashbrown-0.13.2/src/raw/generic.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,154 +0,0 @@ -use super::bitmask::BitMask; -use super::EMPTY; -use core::{mem, ptr}; - -// Use the native word size as the group size. Using a 64-bit group size on -// a 32-bit architecture will just end up being more expensive because -// shifts and multiplies will need to be emulated. -#[cfg(any( - target_pointer_width = "64", - target_arch = "aarch64", - target_arch = "x86_64", - target_arch = "wasm32", -))] -type GroupWord = u64; -#[cfg(all( - any(target_pointer_width = "32", target_pointer_width = "16"), - not(target_arch = "aarch64"), - not(target_arch = "x86_64"), - not(target_arch = "wasm32"), -))] -type GroupWord = u32; - -pub type BitMaskWord = GroupWord; -pub const BITMASK_STRIDE: usize = 8; -// We only care about the highest bit of each byte for the mask. -#[allow(clippy::cast_possible_truncation, clippy::unnecessary_cast)] -pub const BITMASK_MASK: BitMaskWord = 0x8080_8080_8080_8080_u64 as GroupWord; - -/// Helper function to replicate a byte across a `GroupWord`. -#[inline] -fn repeat(byte: u8) -> GroupWord { - GroupWord::from_ne_bytes([byte; Group::WIDTH]) -} - -/// Abstraction over a group of control bytes which can be scanned in -/// parallel. -/// -/// This implementation uses a word-sized integer. -#[derive(Copy, Clone)] -pub struct Group(GroupWord); - -// We perform all operations in the native endianness, and convert to -// little-endian just before creating a BitMask. The can potentially -// enable the compiler to eliminate unnecessary byte swaps if we are -// only checking whether a BitMask is empty. -#[allow(clippy::use_self)] -impl Group { - /// Number of bytes in the group. - pub const WIDTH: usize = mem::size_of::(); - - /// Returns a full group of empty bytes, suitable for use as the initial - /// value for an empty hash table. - /// - /// This is guaranteed to be aligned to the group size. - #[inline] - pub const fn static_empty() -> &'static [u8; Group::WIDTH] { - #[repr(C)] - struct AlignedBytes { - _align: [Group; 0], - bytes: [u8; Group::WIDTH], - } - const ALIGNED_BYTES: AlignedBytes = AlignedBytes { - _align: [], - bytes: [EMPTY; Group::WIDTH], - }; - &ALIGNED_BYTES.bytes - } - - /// Loads a group of bytes starting at the given address. - #[inline] - #[allow(clippy::cast_ptr_alignment)] // unaligned load - pub unsafe fn load(ptr: *const u8) -> Self { - Group(ptr::read_unaligned(ptr.cast())) - } - - /// Loads a group of bytes starting at the given address, which must be - /// aligned to `mem::align_of::()`. - #[inline] - #[allow(clippy::cast_ptr_alignment)] - pub unsafe fn load_aligned(ptr: *const u8) -> Self { - // FIXME: use align_offset once it stabilizes - debug_assert_eq!(ptr as usize & (mem::align_of::() - 1), 0); - Group(ptr::read(ptr.cast())) - } - - /// Stores the group of bytes to the given address, which must be - /// aligned to `mem::align_of::()`. - #[inline] - #[allow(clippy::cast_ptr_alignment)] - pub unsafe fn store_aligned(self, ptr: *mut u8) { - // FIXME: use align_offset once it stabilizes - debug_assert_eq!(ptr as usize & (mem::align_of::() - 1), 0); - ptr::write(ptr.cast(), self.0); - } - - /// Returns a `BitMask` indicating all bytes in the group which *may* - /// have the given value. - /// - /// This function may return a false positive in certain cases where - /// the byte in the group differs from the searched value only in its - /// lowest bit. This is fine because: - /// - This never happens for `EMPTY` and `DELETED`, only full entries. - /// - The check for key equality will catch these. - /// - This only happens if there is at least 1 true match. - /// - The chance of this happening is very low (< 1% chance per byte). - #[inline] - pub fn match_byte(self, byte: u8) -> BitMask { - // This algorithm is derived from - // https://graphics.stanford.edu/~seander/bithacks.html##ValueInWord - let cmp = self.0 ^ repeat(byte); - BitMask((cmp.wrapping_sub(repeat(0x01)) & !cmp & repeat(0x80)).to_le()) - } - - /// Returns a `BitMask` indicating all bytes in the group which are - /// `EMPTY`. - #[inline] - pub fn match_empty(self) -> BitMask { - // If the high bit is set, then the byte must be either: - // 1111_1111 (EMPTY) or 1000_0000 (DELETED). - // So we can just check if the top two bits are 1 by ANDing them. - BitMask((self.0 & (self.0 << 1) & repeat(0x80)).to_le()) - } - - /// Returns a `BitMask` indicating all bytes in the group which are - /// `EMPTY` or `DELETED`. - #[inline] - pub fn match_empty_or_deleted(self) -> BitMask { - // A byte is EMPTY or DELETED iff the high bit is set - BitMask((self.0 & repeat(0x80)).to_le()) - } - - /// Returns a `BitMask` indicating all bytes in the group which are full. - #[inline] - pub fn match_full(self) -> BitMask { - self.match_empty_or_deleted().invert() - } - - /// Performs the following transformation on all bytes in the group: - /// - `EMPTY => EMPTY` - /// - `DELETED => EMPTY` - /// - `FULL => DELETED` - #[inline] - pub fn convert_special_to_empty_and_full_to_deleted(self) -> Self { - // Map high_bit = 1 (EMPTY or DELETED) to 1111_1111 - // and high_bit = 0 (FULL) to 1000_0000 - // - // Here's this logic expanded to concrete values: - // let full = 1000_0000 (true) or 0000_0000 (false) - // !1000_0000 + 1 = 0111_1111 + 1 = 1000_0000 (no carry) - // !0000_0000 + 0 = 1111_1111 + 0 = 1111_1111 (no carry) - let full = !self.0 & repeat(0x80); - Group(!full + (full >> 7)) - } -} diff -Nru temporalio-1.3.0/vendor/hashbrown-0.13.2/src/raw/mod.rs temporalio-1.3.0/vendor/hashbrown-0.13.2/src/raw/mod.rs --- temporalio-1.3.0/vendor/hashbrown-0.13.2/src/raw/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/hashbrown-0.13.2/src/raw/mod.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,2518 +0,0 @@ -use crate::alloc::alloc::{handle_alloc_error, Layout}; -use crate::scopeguard::{guard, ScopeGuard}; -use crate::TryReserveError; -use core::iter::FusedIterator; -use core::marker::PhantomData; -use core::mem; -use core::mem::ManuallyDrop; -use core::mem::MaybeUninit; -use core::ptr::NonNull; -use core::{hint, ptr}; - -cfg_if! { - // Use the SSE2 implementation if possible: it allows us to scan 16 buckets - // at once instead of 8. We don't bother with AVX since it would require - // runtime dispatch and wouldn't gain us much anyways: the probability of - // finding a match drops off drastically after the first few buckets. - // - // I attempted an implementation on ARM using NEON instructions, but it - // turns out that most NEON instructions have multi-cycle latency, which in - // the end outweighs any gains over the generic implementation. - if #[cfg(all( - target_feature = "sse2", - any(target_arch = "x86", target_arch = "x86_64"), - not(miri) - ))] { - mod sse2; - use sse2 as imp; - } else { - #[path = "generic.rs"] - mod generic; - use generic as imp; - } -} - -mod alloc; -pub(crate) use self::alloc::{do_alloc, Allocator, Global}; - -mod bitmask; - -use self::bitmask::{BitMask, BitMaskIter}; -use self::imp::Group; - -// Branch prediction hint. This is currently only available on nightly but it -// consistently improves performance by 10-15%. -#[cfg(feature = "nightly")] -use core::intrinsics::{likely, unlikely}; - -// On stable we can use #[cold] to get a equivalent effect: this attributes -// suggests that the function is unlikely to be called -#[cfg(not(feature = "nightly"))] -#[inline] -#[cold] -fn cold() {} - -#[cfg(not(feature = "nightly"))] -#[inline] -fn likely(b: bool) -> bool { - if !b { - cold(); - } - b -} -#[cfg(not(feature = "nightly"))] -#[inline] -fn unlikely(b: bool) -> bool { - if b { - cold(); - } - b -} - -#[inline] -unsafe fn offset_from(to: *const T, from: *const T) -> usize { - to.offset_from(from) as usize -} - -/// Whether memory allocation errors should return an error or abort. -#[derive(Copy, Clone)] -enum Fallibility { - Fallible, - Infallible, -} - -impl Fallibility { - /// Error to return on capacity overflow. - #[cfg_attr(feature = "inline-more", inline)] - fn capacity_overflow(self) -> TryReserveError { - match self { - Fallibility::Fallible => TryReserveError::CapacityOverflow, - Fallibility::Infallible => panic!("Hash table capacity overflow"), - } - } - - /// Error to return on allocation error. - #[cfg_attr(feature = "inline-more", inline)] - fn alloc_err(self, layout: Layout) -> TryReserveError { - match self { - Fallibility::Fallible => TryReserveError::AllocError { layout }, - Fallibility::Infallible => handle_alloc_error(layout), - } - } -} - -/// Control byte value for an empty bucket. -const EMPTY: u8 = 0b1111_1111; - -/// Control byte value for a deleted bucket. -const DELETED: u8 = 0b1000_0000; - -/// Checks whether a control byte represents a full bucket (top bit is clear). -#[inline] -fn is_full(ctrl: u8) -> bool { - ctrl & 0x80 == 0 -} - -/// Checks whether a control byte represents a special value (top bit is set). -#[inline] -fn is_special(ctrl: u8) -> bool { - ctrl & 0x80 != 0 -} - -/// Checks whether a special control value is EMPTY (just check 1 bit). -#[inline] -fn special_is_empty(ctrl: u8) -> bool { - debug_assert!(is_special(ctrl)); - ctrl & 0x01 != 0 -} - -/// Primary hash function, used to select the initial bucket to probe from. -#[inline] -#[allow(clippy::cast_possible_truncation)] -fn h1(hash: u64) -> usize { - // On 32-bit platforms we simply ignore the higher hash bits. - hash as usize -} - -// Constant for h2 function that grabing the top 7 bits of the hash. -const MIN_HASH_LEN: usize = if mem::size_of::() < mem::size_of::() { - mem::size_of::() -} else { - mem::size_of::() -}; - -/// Secondary hash function, saved in the low 7 bits of the control byte. -#[inline] -#[allow(clippy::cast_possible_truncation)] -fn h2(hash: u64) -> u8 { - // Grab the top 7 bits of the hash. While the hash is normally a full 64-bit - // value, some hash functions (such as FxHash) produce a usize result - // instead, which means that the top 32 bits are 0 on 32-bit platforms. - // So we use MIN_HASH_LEN constant to handle this. - let top7 = hash >> (MIN_HASH_LEN * 8 - 7); - (top7 & 0x7f) as u8 // truncation -} - -/// Probe sequence based on triangular numbers, which is guaranteed (since our -/// table size is a power of two) to visit every group of elements exactly once. -/// -/// A triangular probe has us jump by 1 more group every time. So first we -/// jump by 1 group (meaning we just continue our linear scan), then 2 groups -/// (skipping over 1 group), then 3 groups (skipping over 2 groups), and so on. -/// -/// Proof that the probe will visit every group in the table: -/// -struct ProbeSeq { - pos: usize, - stride: usize, -} - -impl ProbeSeq { - #[inline] - fn move_next(&mut self, bucket_mask: usize) { - // We should have found an empty bucket by now and ended the probe. - debug_assert!( - self.stride <= bucket_mask, - "Went past end of probe sequence" - ); - - self.stride += Group::WIDTH; - self.pos += self.stride; - self.pos &= bucket_mask; - } -} - -/// Returns the number of buckets needed to hold the given number of items, -/// taking the maximum load factor into account. -/// -/// Returns `None` if an overflow occurs. -// Workaround for emscripten bug emscripten-core/emscripten-fastcomp#258 -#[cfg_attr(target_os = "emscripten", inline(never))] -#[cfg_attr(not(target_os = "emscripten"), inline)] -fn capacity_to_buckets(cap: usize) -> Option { - debug_assert_ne!(cap, 0); - - // For small tables we require at least 1 empty bucket so that lookups are - // guaranteed to terminate if an element doesn't exist in the table. - if cap < 8 { - // We don't bother with a table size of 2 buckets since that can only - // hold a single element. Instead we skip directly to a 4 bucket table - // which can hold 3 elements. - return Some(if cap < 4 { 4 } else { 8 }); - } - - // Otherwise require 1/8 buckets to be empty (87.5% load) - // - // Be careful when modifying this, calculate_layout relies on the - // overflow check here. - let adjusted_cap = cap.checked_mul(8)? / 7; - - // Any overflows will have been caught by the checked_mul. Also, any - // rounding errors from the division above will be cleaned up by - // next_power_of_two (which can't overflow because of the previous division). - Some(adjusted_cap.next_power_of_two()) -} - -/// Returns the maximum effective capacity for the given bucket mask, taking -/// the maximum load factor into account. -#[inline] -fn bucket_mask_to_capacity(bucket_mask: usize) -> usize { - if bucket_mask < 8 { - // For tables with 1/2/4/8 buckets, we always reserve one empty slot. - // Keep in mind that the bucket mask is one less than the bucket count. - bucket_mask - } else { - // For larger tables we reserve 12.5% of the slots as empty. - ((bucket_mask + 1) / 8) * 7 - } -} - -/// Helper which allows the max calculation for ctrl_align to be statically computed for each T -/// while keeping the rest of `calculate_layout_for` independent of `T` -#[derive(Copy, Clone)] -struct TableLayout { - size: usize, - ctrl_align: usize, -} - -impl TableLayout { - #[inline] - const fn new() -> Self { - let layout = Layout::new::(); - Self { - size: layout.size(), - ctrl_align: if layout.align() > Group::WIDTH { - layout.align() - } else { - Group::WIDTH - }, - } - } - - #[inline] - fn calculate_layout_for(self, buckets: usize) -> Option<(Layout, usize)> { - debug_assert!(buckets.is_power_of_two()); - - let TableLayout { size, ctrl_align } = self; - // Manual layout calculation since Layout methods are not yet stable. - let ctrl_offset = - size.checked_mul(buckets)?.checked_add(ctrl_align - 1)? & !(ctrl_align - 1); - let len = ctrl_offset.checked_add(buckets + Group::WIDTH)?; - - // We need an additional check to ensure that the allocation doesn't - // exceed `isize::MAX` (https://github.com/rust-lang/rust/pull/95295). - if len > isize::MAX as usize - (ctrl_align - 1) { - return None; - } - - Some(( - unsafe { Layout::from_size_align_unchecked(len, ctrl_align) }, - ctrl_offset, - )) - } -} - -/// A reference to a hash table bucket containing a `T`. -/// -/// This is usually just a pointer to the element itself. However if the element -/// is a ZST, then we instead track the index of the element in the table so -/// that `erase` works properly. -pub struct Bucket { - // Actually it is pointer to next element than element itself - // this is needed to maintain pointer arithmetic invariants - // keeping direct pointer to element introduces difficulty. - // Using `NonNull` for variance and niche layout - ptr: NonNull, -} - -// This Send impl is needed for rayon support. This is safe since Bucket is -// never exposed in a public API. -unsafe impl Send for Bucket {} - -impl Clone for Bucket { - #[inline] - fn clone(&self) -> Self { - Self { ptr: self.ptr } - } -} - -impl Bucket { - const IS_ZERO_SIZED_TYPE: bool = mem::size_of::() == 0; - - #[inline] - unsafe fn from_base_index(base: NonNull, index: usize) -> Self { - let ptr = if Self::IS_ZERO_SIZED_TYPE { - // won't overflow because index must be less than length - (index + 1) as *mut T - } else { - base.as_ptr().sub(index) - }; - Self { - ptr: NonNull::new_unchecked(ptr), - } - } - #[inline] - unsafe fn to_base_index(&self, base: NonNull) -> usize { - if Self::IS_ZERO_SIZED_TYPE { - self.ptr.as_ptr() as usize - 1 - } else { - offset_from(base.as_ptr(), self.ptr.as_ptr()) - } - } - #[inline] - pub fn as_ptr(&self) -> *mut T { - if Self::IS_ZERO_SIZED_TYPE { - // Just return an arbitrary ZST pointer which is properly aligned - mem::align_of::() as *mut T - } else { - unsafe { self.ptr.as_ptr().sub(1) } - } - } - #[inline] - unsafe fn next_n(&self, offset: usize) -> Self { - let ptr = if Self::IS_ZERO_SIZED_TYPE { - (self.ptr.as_ptr() as usize + offset) as *mut T - } else { - self.ptr.as_ptr().sub(offset) - }; - Self { - ptr: NonNull::new_unchecked(ptr), - } - } - #[cfg_attr(feature = "inline-more", inline)] - pub(crate) unsafe fn drop(&self) { - self.as_ptr().drop_in_place(); - } - #[inline] - pub(crate) unsafe fn read(&self) -> T { - self.as_ptr().read() - } - #[inline] - pub(crate) unsafe fn write(&self, val: T) { - self.as_ptr().write(val); - } - #[inline] - pub unsafe fn as_ref<'a>(&self) -> &'a T { - &*self.as_ptr() - } - #[inline] - pub unsafe fn as_mut<'a>(&self) -> &'a mut T { - &mut *self.as_ptr() - } - #[cfg(feature = "raw")] - #[inline] - pub unsafe fn copy_from_nonoverlapping(&self, other: &Self) { - self.as_ptr().copy_from_nonoverlapping(other.as_ptr(), 1); - } -} - -/// A raw hash table with an unsafe API. -pub struct RawTable { - table: RawTableInner, - // Tell dropck that we own instances of T. - marker: PhantomData, -} - -/// Non-generic part of `RawTable` which allows functions to be instantiated only once regardless -/// of how many different key-value types are used. -struct RawTableInner { - // Mask to get an index from a hash value. The value is one less than the - // number of buckets in the table. - bucket_mask: usize, - - // [Padding], T1, T2, ..., Tlast, C1, C2, ... - // ^ points here - ctrl: NonNull, - - // Number of elements that can be inserted before we need to grow the table - growth_left: usize, - - // Number of elements in the table, only really used by len() - items: usize, - - alloc: A, -} - -impl RawTable { - /// Creates a new empty hash table without allocating any memory. - /// - /// In effect this returns a table with exactly 1 bucket. However we can - /// leave the data pointer dangling since that bucket is never written to - /// due to our load factor forcing us to always have at least 1 free bucket. - #[inline] - pub const fn new() -> Self { - Self { - table: RawTableInner::new_in(Global), - marker: PhantomData, - } - } - - /// Attempts to allocate a new hash table with at least enough capacity - /// for inserting the given number of elements without reallocating. - #[cfg(feature = "raw")] - pub fn try_with_capacity(capacity: usize) -> Result { - Self::try_with_capacity_in(capacity, Global) - } - - /// Allocates a new hash table with at least enough capacity for inserting - /// the given number of elements without reallocating. - pub fn with_capacity(capacity: usize) -> Self { - Self::with_capacity_in(capacity, Global) - } -} - -impl RawTable { - const TABLE_LAYOUT: TableLayout = TableLayout::new::(); - const DATA_NEEDS_DROP: bool = mem::needs_drop::(); - - /// Creates a new empty hash table without allocating any memory, using the - /// given allocator. - /// - /// In effect this returns a table with exactly 1 bucket. However we can - /// leave the data pointer dangling since that bucket is never written to - /// due to our load factor forcing us to always have at least 1 free bucket. - #[inline] - pub const fn new_in(alloc: A) -> Self { - Self { - table: RawTableInner::new_in(alloc), - marker: PhantomData, - } - } - - /// Allocates a new hash table with the given number of buckets. - /// - /// The control bytes are left uninitialized. - #[cfg_attr(feature = "inline-more", inline)] - unsafe fn new_uninitialized( - alloc: A, - buckets: usize, - fallibility: Fallibility, - ) -> Result { - debug_assert!(buckets.is_power_of_two()); - - Ok(Self { - table: RawTableInner::new_uninitialized( - alloc, - Self::TABLE_LAYOUT, - buckets, - fallibility, - )?, - marker: PhantomData, - }) - } - - /// Attempts to allocate a new hash table with at least enough capacity - /// for inserting the given number of elements without reallocating. - fn fallible_with_capacity( - alloc: A, - capacity: usize, - fallibility: Fallibility, - ) -> Result { - Ok(Self { - table: RawTableInner::fallible_with_capacity( - alloc, - Self::TABLE_LAYOUT, - capacity, - fallibility, - )?, - marker: PhantomData, - }) - } - - /// Attempts to allocate a new hash table using the given allocator, with at least enough - /// capacity for inserting the given number of elements without reallocating. - #[cfg(feature = "raw")] - pub fn try_with_capacity_in(capacity: usize, alloc: A) -> Result { - Self::fallible_with_capacity(alloc, capacity, Fallibility::Fallible) - } - - /// Allocates a new hash table using the given allocator, with at least enough capacity for - /// inserting the given number of elements without reallocating. - pub fn with_capacity_in(capacity: usize, alloc: A) -> Self { - // Avoid `Result::unwrap_or_else` because it bloats LLVM IR. - match Self::fallible_with_capacity(alloc, capacity, Fallibility::Infallible) { - Ok(capacity) => capacity, - Err(_) => unsafe { hint::unreachable_unchecked() }, - } - } - - /// Returns a reference to the underlying allocator. - #[inline] - pub fn allocator(&self) -> &A { - &self.table.alloc - } - - /// Deallocates the table without dropping any entries. - #[cfg_attr(feature = "inline-more", inline)] - unsafe fn free_buckets(&mut self) { - self.table.free_buckets(Self::TABLE_LAYOUT); - } - - /// Returns pointer to one past last element of data table. - #[inline] - pub unsafe fn data_end(&self) -> NonNull { - NonNull::new_unchecked(self.table.ctrl.as_ptr().cast()) - } - - /// Returns pointer to start of data table. - #[inline] - #[cfg(feature = "nightly")] - pub unsafe fn data_start(&self) -> *mut T { - self.data_end().as_ptr().wrapping_sub(self.buckets()) - } - - /// Return the information about memory allocated by the table. - /// - /// `RawTable` allocates single memory block to store both data and metadata. - /// This function returns allocation size and alignment and the beginning of the area. - /// These are the arguments which will be passed to `dealloc` when the table is dropped. - /// - /// This function might be useful for memory profiling. - #[inline] - #[cfg(feature = "raw")] - pub fn allocation_info(&self) -> (NonNull, Layout) { - self.table.allocation_info_or_zero(Self::TABLE_LAYOUT) - } - - /// Returns the index of a bucket from a `Bucket`. - #[inline] - pub unsafe fn bucket_index(&self, bucket: &Bucket) -> usize { - bucket.to_base_index(self.data_end()) - } - - /// Returns a pointer to an element in the table. - #[inline] - pub unsafe fn bucket(&self, index: usize) -> Bucket { - debug_assert_ne!(self.table.bucket_mask, 0); - debug_assert!(index < self.buckets()); - Bucket::from_base_index(self.data_end(), index) - } - - /// Erases an element from the table without dropping it. - #[cfg_attr(feature = "inline-more", inline)] - unsafe fn erase_no_drop(&mut self, item: &Bucket) { - let index = self.bucket_index(item); - self.table.erase(index); - } - - /// Erases an element from the table, dropping it in place. - #[cfg_attr(feature = "inline-more", inline)] - #[allow(clippy::needless_pass_by_value)] - pub unsafe fn erase(&mut self, item: Bucket) { - // Erase the element from the table first since drop might panic. - self.erase_no_drop(&item); - item.drop(); - } - - /// Finds and erases an element from the table, dropping it in place. - /// Returns true if an element was found. - #[cfg(feature = "raw")] - #[cfg_attr(feature = "inline-more", inline)] - pub fn erase_entry(&mut self, hash: u64, eq: impl FnMut(&T) -> bool) -> bool { - // Avoid `Option::map` because it bloats LLVM IR. - if let Some(bucket) = self.find(hash, eq) { - unsafe { - self.erase(bucket); - } - true - } else { - false - } - } - - /// Removes an element from the table, returning it. - #[cfg_attr(feature = "inline-more", inline)] - #[allow(clippy::needless_pass_by_value)] - pub unsafe fn remove(&mut self, item: Bucket) -> T { - self.erase_no_drop(&item); - item.read() - } - - /// Finds and removes an element from the table, returning it. - #[cfg_attr(feature = "inline-more", inline)] - pub fn remove_entry(&mut self, hash: u64, eq: impl FnMut(&T) -> bool) -> Option { - // Avoid `Option::map` because it bloats LLVM IR. - match self.find(hash, eq) { - Some(bucket) => Some(unsafe { self.remove(bucket) }), - None => None, - } - } - - /// Marks all table buckets as empty without dropping their contents. - #[cfg_attr(feature = "inline-more", inline)] - pub fn clear_no_drop(&mut self) { - self.table.clear_no_drop(); - } - - /// Removes all elements from the table without freeing the backing memory. - #[cfg_attr(feature = "inline-more", inline)] - pub fn clear(&mut self) { - // Ensure that the table is reset even if one of the drops panic - let mut self_ = guard(self, |self_| self_.clear_no_drop()); - unsafe { - self_.drop_elements(); - } - } - - unsafe fn drop_elements(&mut self) { - if Self::DATA_NEEDS_DROP && !self.is_empty() { - for item in self.iter() { - item.drop(); - } - } - } - - /// Shrinks the table to fit `max(self.len(), min_size)` elements. - #[cfg_attr(feature = "inline-more", inline)] - pub fn shrink_to(&mut self, min_size: usize, hasher: impl Fn(&T) -> u64) { - // Calculate the minimal number of elements that we need to reserve - // space for. - let min_size = usize::max(self.table.items, min_size); - if min_size == 0 { - *self = Self::new_in(self.table.alloc.clone()); - return; - } - - // Calculate the number of buckets that we need for this number of - // elements. If the calculation overflows then the requested bucket - // count must be larger than what we have right and nothing needs to be - // done. - let min_buckets = match capacity_to_buckets(min_size) { - Some(buckets) => buckets, - None => return, - }; - - // If we have more buckets than we need, shrink the table. - if min_buckets < self.buckets() { - // Fast path if the table is empty - if self.table.items == 0 { - *self = Self::with_capacity_in(min_size, self.table.alloc.clone()); - } else { - // Avoid `Result::unwrap_or_else` because it bloats LLVM IR. - if self - .resize(min_size, hasher, Fallibility::Infallible) - .is_err() - { - unsafe { hint::unreachable_unchecked() } - } - } - } - } - - /// Ensures that at least `additional` items can be inserted into the table - /// without reallocation. - #[cfg_attr(feature = "inline-more", inline)] - pub fn reserve(&mut self, additional: usize, hasher: impl Fn(&T) -> u64) { - if additional > self.table.growth_left { - // Avoid `Result::unwrap_or_else` because it bloats LLVM IR. - if self - .reserve_rehash(additional, hasher, Fallibility::Infallible) - .is_err() - { - unsafe { hint::unreachable_unchecked() } - } - } - } - - /// Tries to ensure that at least `additional` items can be inserted into - /// the table without reallocation. - #[cfg_attr(feature = "inline-more", inline)] - pub fn try_reserve( - &mut self, - additional: usize, - hasher: impl Fn(&T) -> u64, - ) -> Result<(), TryReserveError> { - if additional > self.table.growth_left { - self.reserve_rehash(additional, hasher, Fallibility::Fallible) - } else { - Ok(()) - } - } - - /// Out-of-line slow path for `reserve` and `try_reserve`. - #[cold] - #[inline(never)] - fn reserve_rehash( - &mut self, - additional: usize, - hasher: impl Fn(&T) -> u64, - fallibility: Fallibility, - ) -> Result<(), TryReserveError> { - unsafe { - self.table.reserve_rehash_inner( - additional, - &|table, index| hasher(table.bucket::(index).as_ref()), - fallibility, - Self::TABLE_LAYOUT, - if Self::DATA_NEEDS_DROP { - Some(mem::transmute(ptr::drop_in_place:: as unsafe fn(*mut T))) - } else { - None - }, - ) - } - } - - /// Allocates a new table of a different size and moves the contents of the - /// current table into it. - fn resize( - &mut self, - capacity: usize, - hasher: impl Fn(&T) -> u64, - fallibility: Fallibility, - ) -> Result<(), TryReserveError> { - unsafe { - self.table.resize_inner( - capacity, - &|table, index| hasher(table.bucket::(index).as_ref()), - fallibility, - Self::TABLE_LAYOUT, - ) - } - } - - /// Inserts a new element into the table, and returns its raw bucket. - /// - /// This does not check if the given element already exists in the table. - #[cfg_attr(feature = "inline-more", inline)] - pub fn insert(&mut self, hash: u64, value: T, hasher: impl Fn(&T) -> u64) -> Bucket { - unsafe { - let mut index = self.table.find_insert_slot(hash); - - // We can avoid growing the table once we have reached our load - // factor if we are replacing a tombstone. This works since the - // number of EMPTY slots does not change in this case. - let old_ctrl = *self.table.ctrl(index); - if unlikely(self.table.growth_left == 0 && special_is_empty(old_ctrl)) { - self.reserve(1, hasher); - index = self.table.find_insert_slot(hash); - } - - self.table.record_item_insert_at(index, old_ctrl, hash); - - let bucket = self.bucket(index); - bucket.write(value); - bucket - } - } - - /// Attempts to insert a new element without growing the table and return its raw bucket. - /// - /// Returns an `Err` containing the given element if inserting it would require growing the - /// table. - /// - /// This does not check if the given element already exists in the table. - #[cfg(feature = "raw")] - #[cfg_attr(feature = "inline-more", inline)] - pub fn try_insert_no_grow(&mut self, hash: u64, value: T) -> Result, T> { - unsafe { - match self.table.prepare_insert_no_grow(hash) { - Ok(index) => { - let bucket = self.bucket(index); - bucket.write(value); - Ok(bucket) - } - Err(()) => Err(value), - } - } - } - - /// Inserts a new element into the table, and returns a mutable reference to it. - /// - /// This does not check if the given element already exists in the table. - #[cfg_attr(feature = "inline-more", inline)] - pub fn insert_entry(&mut self, hash: u64, value: T, hasher: impl Fn(&T) -> u64) -> &mut T { - unsafe { self.insert(hash, value, hasher).as_mut() } - } - - /// Inserts a new element into the table, without growing the table. - /// - /// There must be enough space in the table to insert the new element. - /// - /// This does not check if the given element already exists in the table. - #[cfg_attr(feature = "inline-more", inline)] - #[cfg(any(feature = "raw", feature = "rustc-internal-api"))] - pub unsafe fn insert_no_grow(&mut self, hash: u64, value: T) -> Bucket { - let (index, old_ctrl) = self.table.prepare_insert_slot(hash); - let bucket = self.table.bucket(index); - - // If we are replacing a DELETED entry then we don't need to update - // the load counter. - self.table.growth_left -= special_is_empty(old_ctrl) as usize; - - bucket.write(value); - self.table.items += 1; - bucket - } - - /// Temporary removes a bucket, applying the given function to the removed - /// element and optionally put back the returned value in the same bucket. - /// - /// Returns `true` if the bucket still contains an element - /// - /// This does not check if the given bucket is actually occupied. - #[cfg_attr(feature = "inline-more", inline)] - pub unsafe fn replace_bucket_with(&mut self, bucket: Bucket, f: F) -> bool - where - F: FnOnce(T) -> Option, - { - let index = self.bucket_index(&bucket); - let old_ctrl = *self.table.ctrl(index); - debug_assert!(self.is_bucket_full(index)); - let old_growth_left = self.table.growth_left; - let item = self.remove(bucket); - if let Some(new_item) = f(item) { - self.table.growth_left = old_growth_left; - self.table.set_ctrl(index, old_ctrl); - self.table.items += 1; - self.bucket(index).write(new_item); - true - } else { - false - } - } - - /// Searches for an element in the table. - #[inline] - pub fn find(&self, hash: u64, mut eq: impl FnMut(&T) -> bool) -> Option> { - let result = self.table.find_inner(hash, &mut |index| unsafe { - eq(self.bucket(index).as_ref()) - }); - - // Avoid `Option::map` because it bloats LLVM IR. - match result { - Some(index) => Some(unsafe { self.bucket(index) }), - None => None, - } - } - - /// Gets a reference to an element in the table. - #[inline] - pub fn get(&self, hash: u64, eq: impl FnMut(&T) -> bool) -> Option<&T> { - // Avoid `Option::map` because it bloats LLVM IR. - match self.find(hash, eq) { - Some(bucket) => Some(unsafe { bucket.as_ref() }), - None => None, - } - } - - /// Gets a mutable reference to an element in the table. - #[inline] - pub fn get_mut(&mut self, hash: u64, eq: impl FnMut(&T) -> bool) -> Option<&mut T> { - // Avoid `Option::map` because it bloats LLVM IR. - match self.find(hash, eq) { - Some(bucket) => Some(unsafe { bucket.as_mut() }), - None => None, - } - } - - /// Attempts to get mutable references to `N` entries in the table at once. - /// - /// Returns an array of length `N` with the results of each query. - /// - /// At most one mutable reference will be returned to any entry. `None` will be returned if any - /// of the hashes are duplicates. `None` will be returned if the hash is not found. - /// - /// The `eq` argument should be a closure such that `eq(i, k)` returns true if `k` is equal to - /// the `i`th key to be looked up. - pub fn get_many_mut( - &mut self, - hashes: [u64; N], - eq: impl FnMut(usize, &T) -> bool, - ) -> Option<[&'_ mut T; N]> { - unsafe { - let ptrs = self.get_many_mut_pointers(hashes, eq)?; - - for (i, &cur) in ptrs.iter().enumerate() { - if ptrs[..i].iter().any(|&prev| ptr::eq::(prev, cur)) { - return None; - } - } - // All bucket are distinct from all previous buckets so we're clear to return the result - // of the lookup. - - // TODO use `MaybeUninit::array_assume_init` here instead once that's stable. - Some(mem::transmute_copy(&ptrs)) - } - } - - pub unsafe fn get_many_unchecked_mut( - &mut self, - hashes: [u64; N], - eq: impl FnMut(usize, &T) -> bool, - ) -> Option<[&'_ mut T; N]> { - let ptrs = self.get_many_mut_pointers(hashes, eq)?; - Some(mem::transmute_copy(&ptrs)) - } - - unsafe fn get_many_mut_pointers( - &mut self, - hashes: [u64; N], - mut eq: impl FnMut(usize, &T) -> bool, - ) -> Option<[*mut T; N]> { - // TODO use `MaybeUninit::uninit_array` here instead once that's stable. - let mut outs: MaybeUninit<[*mut T; N]> = MaybeUninit::uninit(); - let outs_ptr = outs.as_mut_ptr(); - - for (i, &hash) in hashes.iter().enumerate() { - let cur = self.find(hash, |k| eq(i, k))?; - *(*outs_ptr).get_unchecked_mut(i) = cur.as_mut(); - } - - // TODO use `MaybeUninit::array_assume_init` here instead once that's stable. - Some(outs.assume_init()) - } - - /// Returns the number of elements the map can hold without reallocating. - /// - /// This number is a lower bound; the table might be able to hold - /// more, but is guaranteed to be able to hold at least this many. - #[inline] - pub fn capacity(&self) -> usize { - self.table.items + self.table.growth_left - } - - /// Returns the number of elements in the table. - #[inline] - pub fn len(&self) -> usize { - self.table.items - } - - /// Returns `true` if the table contains no elements. - #[inline] - pub fn is_empty(&self) -> bool { - self.len() == 0 - } - - /// Returns the number of buckets in the table. - #[inline] - pub fn buckets(&self) -> usize { - self.table.bucket_mask + 1 - } - - /// Checks whether the bucket at `index` is full. - /// - /// # Safety - /// - /// The caller must ensure `index` is less than the number of buckets. - #[inline] - pub unsafe fn is_bucket_full(&self, index: usize) -> bool { - self.table.is_bucket_full(index) - } - - /// Returns an iterator over every element in the table. It is up to - /// the caller to ensure that the `RawTable` outlives the `RawIter`. - /// Because we cannot make the `next` method unsafe on the `RawIter` - /// struct, we have to make the `iter` method unsafe. - #[inline] - pub unsafe fn iter(&self) -> RawIter { - let data = Bucket::from_base_index(self.data_end(), 0); - RawIter { - iter: RawIterRange::new(self.table.ctrl.as_ptr(), data, self.table.buckets()), - items: self.table.items, - } - } - - /// Returns an iterator over occupied buckets that could match a given hash. - /// - /// `RawTable` only stores 7 bits of the hash value, so this iterator may - /// return items that have a hash value different than the one provided. You - /// should always validate the returned values before using them. - /// - /// It is up to the caller to ensure that the `RawTable` outlives the - /// `RawIterHash`. Because we cannot make the `next` method unsafe on the - /// `RawIterHash` struct, we have to make the `iter_hash` method unsafe. - #[cfg_attr(feature = "inline-more", inline)] - #[cfg(feature = "raw")] - pub unsafe fn iter_hash(&self, hash: u64) -> RawIterHash<'_, T, A> { - RawIterHash::new(self, hash) - } - - /// Returns an iterator which removes all elements from the table without - /// freeing the memory. - #[cfg_attr(feature = "inline-more", inline)] - pub fn drain(&mut self) -> RawDrain<'_, T, A> { - unsafe { - let iter = self.iter(); - self.drain_iter_from(iter) - } - } - - /// Returns an iterator which removes all elements from the table without - /// freeing the memory. - /// - /// Iteration starts at the provided iterator's current location. - /// - /// It is up to the caller to ensure that the iterator is valid for this - /// `RawTable` and covers all items that remain in the table. - #[cfg_attr(feature = "inline-more", inline)] - pub unsafe fn drain_iter_from(&mut self, iter: RawIter) -> RawDrain<'_, T, A> { - debug_assert_eq!(iter.len(), self.len()); - RawDrain { - iter, - table: ManuallyDrop::new(mem::replace(self, Self::new_in(self.table.alloc.clone()))), - orig_table: NonNull::from(self), - marker: PhantomData, - } - } - - /// Returns an iterator which consumes all elements from the table. - /// - /// Iteration starts at the provided iterator's current location. - /// - /// It is up to the caller to ensure that the iterator is valid for this - /// `RawTable` and covers all items that remain in the table. - pub unsafe fn into_iter_from(self, iter: RawIter) -> RawIntoIter { - debug_assert_eq!(iter.len(), self.len()); - - let alloc = self.table.alloc.clone(); - let allocation = self.into_allocation(); - RawIntoIter { - iter, - allocation, - marker: PhantomData, - alloc, - } - } - - /// Converts the table into a raw allocation. The contents of the table - /// should be dropped using a `RawIter` before freeing the allocation. - #[cfg_attr(feature = "inline-more", inline)] - pub(crate) fn into_allocation(self) -> Option<(NonNull, Layout)> { - let alloc = if self.table.is_empty_singleton() { - None - } else { - // Avoid `Option::unwrap_or_else` because it bloats LLVM IR. - let (layout, ctrl_offset) = - match Self::TABLE_LAYOUT.calculate_layout_for(self.table.buckets()) { - Some(lco) => lco, - None => unsafe { hint::unreachable_unchecked() }, - }; - Some(( - unsafe { NonNull::new_unchecked(self.table.ctrl.as_ptr().sub(ctrl_offset)) }, - layout, - )) - }; - mem::forget(self); - alloc - } -} - -unsafe impl Send for RawTable -where - T: Send, - A: Send, -{ -} -unsafe impl Sync for RawTable -where - T: Sync, - A: Sync, -{ -} - -impl RawTableInner { - #[inline] - const fn new_in(alloc: A) -> Self { - Self { - // Be careful to cast the entire slice to a raw pointer. - ctrl: unsafe { NonNull::new_unchecked(Group::static_empty() as *const _ as *mut u8) }, - bucket_mask: 0, - items: 0, - growth_left: 0, - alloc, - } - } -} - -impl RawTableInner { - #[cfg_attr(feature = "inline-more", inline)] - unsafe fn new_uninitialized( - alloc: A, - table_layout: TableLayout, - buckets: usize, - fallibility: Fallibility, - ) -> Result { - debug_assert!(buckets.is_power_of_two()); - - // Avoid `Option::ok_or_else` because it bloats LLVM IR. - let (layout, ctrl_offset) = match table_layout.calculate_layout_for(buckets) { - Some(lco) => lco, - None => return Err(fallibility.capacity_overflow()), - }; - - let ptr: NonNull = match do_alloc(&alloc, layout) { - Ok(block) => block.cast(), - Err(_) => return Err(fallibility.alloc_err(layout)), - }; - - let ctrl = NonNull::new_unchecked(ptr.as_ptr().add(ctrl_offset)); - Ok(Self { - ctrl, - bucket_mask: buckets - 1, - items: 0, - growth_left: bucket_mask_to_capacity(buckets - 1), - alloc, - }) - } - - #[inline] - fn fallible_with_capacity( - alloc: A, - table_layout: TableLayout, - capacity: usize, - fallibility: Fallibility, - ) -> Result { - if capacity == 0 { - Ok(Self::new_in(alloc)) - } else { - unsafe { - let buckets = - capacity_to_buckets(capacity).ok_or_else(|| fallibility.capacity_overflow())?; - - let result = Self::new_uninitialized(alloc, table_layout, buckets, fallibility)?; - result.ctrl(0).write_bytes(EMPTY, result.num_ctrl_bytes()); - - Ok(result) - } - } - } - - /// Searches for an empty or deleted bucket which is suitable for inserting - /// a new element and sets the hash for that slot. - /// - /// There must be at least 1 empty bucket in the table. - #[inline] - unsafe fn prepare_insert_slot(&self, hash: u64) -> (usize, u8) { - let index = self.find_insert_slot(hash); - let old_ctrl = *self.ctrl(index); - self.set_ctrl_h2(index, hash); - (index, old_ctrl) - } - - /// Searches for an empty or deleted bucket which is suitable for inserting - /// a new element. - /// - /// There must be at least 1 empty bucket in the table. - #[inline] - fn find_insert_slot(&self, hash: u64) -> usize { - let mut probe_seq = self.probe_seq(hash); - loop { - unsafe { - let group = Group::load(self.ctrl(probe_seq.pos)); - if let Some(bit) = group.match_empty_or_deleted().lowest_set_bit() { - let result = (probe_seq.pos + bit) & self.bucket_mask; - - // In tables smaller than the group width, trailing control - // bytes outside the range of the table are filled with - // EMPTY entries. These will unfortunately trigger a - // match, but once masked may point to a full bucket that - // is already occupied. We detect this situation here and - // perform a second scan starting at the beginning of the - // table. This second scan is guaranteed to find an empty - // slot (due to the load factor) before hitting the trailing - // control bytes (containing EMPTY). - if unlikely(self.is_bucket_full(result)) { - debug_assert!(self.bucket_mask < Group::WIDTH); - debug_assert_ne!(probe_seq.pos, 0); - return Group::load_aligned(self.ctrl(0)) - .match_empty_or_deleted() - .lowest_set_bit_nonzero(); - } - - return result; - } - } - probe_seq.move_next(self.bucket_mask); - } - } - - /// Searches for an element in the table. This uses dynamic dispatch to reduce the amount of - /// code generated, but it is eliminated by LLVM optimizations. - #[inline(always)] - fn find_inner(&self, hash: u64, eq: &mut dyn FnMut(usize) -> bool) -> Option { - let h2_hash = h2(hash); - let mut probe_seq = self.probe_seq(hash); - - loop { - let group = unsafe { Group::load(self.ctrl(probe_seq.pos)) }; - - for bit in group.match_byte(h2_hash) { - let index = (probe_seq.pos + bit) & self.bucket_mask; - - if likely(eq(index)) { - return Some(index); - } - } - - if likely(group.match_empty().any_bit_set()) { - return None; - } - - probe_seq.move_next(self.bucket_mask); - } - } - - #[allow(clippy::mut_mut)] - #[inline] - unsafe fn prepare_rehash_in_place(&mut self) { - // Bulk convert all full control bytes to DELETED, and all DELETED - // control bytes to EMPTY. This effectively frees up all buckets - // containing a DELETED entry. - for i in (0..self.buckets()).step_by(Group::WIDTH) { - let group = Group::load_aligned(self.ctrl(i)); - let group = group.convert_special_to_empty_and_full_to_deleted(); - group.store_aligned(self.ctrl(i)); - } - - // Fix up the trailing control bytes. See the comments in set_ctrl - // for the handling of tables smaller than the group width. - if self.buckets() < Group::WIDTH { - self.ctrl(0) - .copy_to(self.ctrl(Group::WIDTH), self.buckets()); - } else { - self.ctrl(0) - .copy_to(self.ctrl(self.buckets()), Group::WIDTH); - } - } - - #[inline] - unsafe fn bucket(&self, index: usize) -> Bucket { - debug_assert_ne!(self.bucket_mask, 0); - debug_assert!(index < self.buckets()); - Bucket::from_base_index(self.data_end(), index) - } - - #[inline] - unsafe fn bucket_ptr(&self, index: usize, size_of: usize) -> *mut u8 { - debug_assert_ne!(self.bucket_mask, 0); - debug_assert!(index < self.buckets()); - let base: *mut u8 = self.data_end().as_ptr(); - base.sub((index + 1) * size_of) - } - - #[inline] - unsafe fn data_end(&self) -> NonNull { - NonNull::new_unchecked(self.ctrl.as_ptr().cast()) - } - - /// Returns an iterator-like object for a probe sequence on the table. - /// - /// This iterator never terminates, but is guaranteed to visit each bucket - /// group exactly once. The loop using `probe_seq` must terminate upon - /// reaching a group containing an empty bucket. - #[inline] - fn probe_seq(&self, hash: u64) -> ProbeSeq { - ProbeSeq { - pos: h1(hash) & self.bucket_mask, - stride: 0, - } - } - - /// Returns the index of a bucket for which a value must be inserted if there is enough rooom - /// in the table, otherwise returns error - #[cfg(feature = "raw")] - #[inline] - unsafe fn prepare_insert_no_grow(&mut self, hash: u64) -> Result { - let index = self.find_insert_slot(hash); - let old_ctrl = *self.ctrl(index); - if unlikely(self.growth_left == 0 && special_is_empty(old_ctrl)) { - Err(()) - } else { - self.record_item_insert_at(index, old_ctrl, hash); - Ok(index) - } - } - - #[inline] - unsafe fn record_item_insert_at(&mut self, index: usize, old_ctrl: u8, hash: u64) { - self.growth_left -= usize::from(special_is_empty(old_ctrl)); - self.set_ctrl_h2(index, hash); - self.items += 1; - } - - #[inline] - fn is_in_same_group(&self, i: usize, new_i: usize, hash: u64) -> bool { - let probe_seq_pos = self.probe_seq(hash).pos; - let probe_index = - |pos: usize| (pos.wrapping_sub(probe_seq_pos) & self.bucket_mask) / Group::WIDTH; - probe_index(i) == probe_index(new_i) - } - - /// Sets a control byte to the hash, and possibly also the replicated control byte at - /// the end of the array. - #[inline] - unsafe fn set_ctrl_h2(&self, index: usize, hash: u64) { - self.set_ctrl(index, h2(hash)); - } - - #[inline] - unsafe fn replace_ctrl_h2(&self, index: usize, hash: u64) -> u8 { - let prev_ctrl = *self.ctrl(index); - self.set_ctrl_h2(index, hash); - prev_ctrl - } - - /// Sets a control byte, and possibly also the replicated control byte at - /// the end of the array. - #[inline] - unsafe fn set_ctrl(&self, index: usize, ctrl: u8) { - // Replicate the first Group::WIDTH control bytes at the end of - // the array without using a branch: - // - If index >= Group::WIDTH then index == index2. - // - Otherwise index2 == self.bucket_mask + 1 + index. - // - // The very last replicated control byte is never actually read because - // we mask the initial index for unaligned loads, but we write it - // anyways because it makes the set_ctrl implementation simpler. - // - // If there are fewer buckets than Group::WIDTH then this code will - // replicate the buckets at the end of the trailing group. For example - // with 2 buckets and a group size of 4, the control bytes will look - // like this: - // - // Real | Replicated - // --------------------------------------------- - // | [A] | [B] | [EMPTY] | [EMPTY] | [A] | [B] | - // --------------------------------------------- - let index2 = ((index.wrapping_sub(Group::WIDTH)) & self.bucket_mask) + Group::WIDTH; - - *self.ctrl(index) = ctrl; - *self.ctrl(index2) = ctrl; - } - - /// Returns a pointer to a control byte. - #[inline] - unsafe fn ctrl(&self, index: usize) -> *mut u8 { - debug_assert!(index < self.num_ctrl_bytes()); - self.ctrl.as_ptr().add(index) - } - - #[inline] - fn buckets(&self) -> usize { - self.bucket_mask + 1 - } - - /// Checks whether the bucket at `index` is full. - /// - /// # Safety - /// - /// The caller must ensure `index` is less than the number of buckets. - #[inline] - unsafe fn is_bucket_full(&self, index: usize) -> bool { - debug_assert!(index < self.buckets()); - is_full(*self.ctrl(index)) - } - - #[inline] - fn num_ctrl_bytes(&self) -> usize { - self.bucket_mask + 1 + Group::WIDTH - } - - #[inline] - fn is_empty_singleton(&self) -> bool { - self.bucket_mask == 0 - } - - #[allow(clippy::mut_mut)] - #[inline] - unsafe fn prepare_resize( - &self, - table_layout: TableLayout, - capacity: usize, - fallibility: Fallibility, - ) -> Result, TryReserveError> { - debug_assert!(self.items <= capacity); - - // Allocate and initialize the new table. - let mut new_table = RawTableInner::fallible_with_capacity( - self.alloc.clone(), - table_layout, - capacity, - fallibility, - )?; - new_table.growth_left -= self.items; - new_table.items = self.items; - - // The hash function may panic, in which case we simply free the new - // table without dropping any elements that may have been copied into - // it. - // - // This guard is also used to free the old table on success, see - // the comment at the bottom of this function. - Ok(guard(new_table, move |self_| { - if !self_.is_empty_singleton() { - self_.free_buckets(table_layout); - } - })) - } - - /// Reserves or rehashes to make room for `additional` more elements. - /// - /// This uses dynamic dispatch to reduce the amount of - /// code generated, but it is eliminated by LLVM optimizations when inlined. - #[allow(clippy::inline_always)] - #[inline(always)] - unsafe fn reserve_rehash_inner( - &mut self, - additional: usize, - hasher: &dyn Fn(&mut Self, usize) -> u64, - fallibility: Fallibility, - layout: TableLayout, - drop: Option, - ) -> Result<(), TryReserveError> { - // Avoid `Option::ok_or_else` because it bloats LLVM IR. - let new_items = match self.items.checked_add(additional) { - Some(new_items) => new_items, - None => return Err(fallibility.capacity_overflow()), - }; - let full_capacity = bucket_mask_to_capacity(self.bucket_mask); - if new_items <= full_capacity / 2 { - // Rehash in-place without re-allocating if we have plenty of spare - // capacity that is locked up due to DELETED entries. - self.rehash_in_place(hasher, layout.size, drop); - Ok(()) - } else { - // Otherwise, conservatively resize to at least the next size up - // to avoid churning deletes into frequent rehashes. - self.resize_inner( - usize::max(new_items, full_capacity + 1), - hasher, - fallibility, - layout, - ) - } - } - - /// Allocates a new table of a different size and moves the contents of the - /// current table into it. - /// - /// This uses dynamic dispatch to reduce the amount of - /// code generated, but it is eliminated by LLVM optimizations when inlined. - #[allow(clippy::inline_always)] - #[inline(always)] - unsafe fn resize_inner( - &mut self, - capacity: usize, - hasher: &dyn Fn(&mut Self, usize) -> u64, - fallibility: Fallibility, - layout: TableLayout, - ) -> Result<(), TryReserveError> { - let mut new_table = self.prepare_resize(layout, capacity, fallibility)?; - - // Copy all elements to the new table. - for i in 0..self.buckets() { - if !self.is_bucket_full(i) { - continue; - } - - // This may panic. - let hash = hasher(self, i); - - // We can use a simpler version of insert() here since: - // - there are no DELETED entries. - // - we know there is enough space in the table. - // - all elements are unique. - let (index, _) = new_table.prepare_insert_slot(hash); - - ptr::copy_nonoverlapping( - self.bucket_ptr(i, layout.size), - new_table.bucket_ptr(index, layout.size), - layout.size, - ); - } - - // We successfully copied all elements without panicking. Now replace - // self with the new table. The old table will have its memory freed but - // the items will not be dropped (since they have been moved into the - // new table). - mem::swap(self, &mut new_table); - - Ok(()) - } - - /// Rehashes the contents of the table in place (i.e. without changing the - /// allocation). - /// - /// If `hasher` panics then some the table's contents may be lost. - /// - /// This uses dynamic dispatch to reduce the amount of - /// code generated, but it is eliminated by LLVM optimizations when inlined. - #[allow(clippy::inline_always)] - #[cfg_attr(feature = "inline-more", inline(always))] - #[cfg_attr(not(feature = "inline-more"), inline)] - unsafe fn rehash_in_place( - &mut self, - hasher: &dyn Fn(&mut Self, usize) -> u64, - size_of: usize, - drop: Option, - ) { - // If the hash function panics then properly clean up any elements - // that we haven't rehashed yet. We unfortunately can't preserve the - // element since we lost their hash and have no way of recovering it - // without risking another panic. - self.prepare_rehash_in_place(); - - let mut guard = guard(self, move |self_| { - if let Some(drop) = drop { - for i in 0..self_.buckets() { - if *self_.ctrl(i) == DELETED { - self_.set_ctrl(i, EMPTY); - drop(self_.bucket_ptr(i, size_of)); - self_.items -= 1; - } - } - } - self_.growth_left = bucket_mask_to_capacity(self_.bucket_mask) - self_.items; - }); - - // At this point, DELETED elements are elements that we haven't - // rehashed yet. Find them and re-insert them at their ideal - // position. - 'outer: for i in 0..guard.buckets() { - if *guard.ctrl(i) != DELETED { - continue; - } - - let i_p = guard.bucket_ptr(i, size_of); - - 'inner: loop { - // Hash the current item - let hash = hasher(*guard, i); - - // Search for a suitable place to put it - let new_i = guard.find_insert_slot(hash); - - // Probing works by scanning through all of the control - // bytes in groups, which may not be aligned to the group - // size. If both the new and old position fall within the - // same unaligned group, then there is no benefit in moving - // it and we can just continue to the next item. - if likely(guard.is_in_same_group(i, new_i, hash)) { - guard.set_ctrl_h2(i, hash); - continue 'outer; - } - - let new_i_p = guard.bucket_ptr(new_i, size_of); - - // We are moving the current item to a new position. Write - // our H2 to the control byte of the new position. - let prev_ctrl = guard.replace_ctrl_h2(new_i, hash); - if prev_ctrl == EMPTY { - guard.set_ctrl(i, EMPTY); - // If the target slot is empty, simply move the current - // element into the new slot and clear the old control - // byte. - ptr::copy_nonoverlapping(i_p, new_i_p, size_of); - continue 'outer; - } else { - // If the target slot is occupied, swap the two elements - // and then continue processing the element that we just - // swapped into the old slot. - debug_assert_eq!(prev_ctrl, DELETED); - ptr::swap_nonoverlapping(i_p, new_i_p, size_of); - continue 'inner; - } - } - } - - guard.growth_left = bucket_mask_to_capacity(guard.bucket_mask) - guard.items; - - mem::forget(guard); - } - - #[inline] - unsafe fn free_buckets(&mut self, table_layout: TableLayout) { - let (ptr, layout) = self.allocation_info(table_layout); - self.alloc.deallocate(ptr, layout); - } - - #[inline] - fn allocation_info(&self, table_layout: TableLayout) -> (NonNull, Layout) { - debug_assert!( - !self.is_empty_singleton(), - "this function can only be called on non-empty tables" - ); - - // Avoid `Option::unwrap_or_else` because it bloats LLVM IR. - let (layout, ctrl_offset) = match table_layout.calculate_layout_for(self.buckets()) { - Some(lco) => lco, - None => unsafe { hint::unreachable_unchecked() }, - }; - ( - unsafe { NonNull::new_unchecked(self.ctrl.as_ptr().sub(ctrl_offset)) }, - layout, - ) - } - - #[cfg(feature = "raw")] - fn allocation_info_or_zero(&self, table_layout: TableLayout) -> (NonNull, Layout) { - if self.is_empty_singleton() { - (NonNull::dangling(), Layout::new::<()>()) - } else { - self.allocation_info(table_layout) - } - } - - /// Marks all table buckets as empty without dropping their contents. - #[inline] - fn clear_no_drop(&mut self) { - if !self.is_empty_singleton() { - unsafe { - self.ctrl(0).write_bytes(EMPTY, self.num_ctrl_bytes()); - } - } - self.items = 0; - self.growth_left = bucket_mask_to_capacity(self.bucket_mask); - } - - #[inline] - unsafe fn erase(&mut self, index: usize) { - debug_assert!(self.is_bucket_full(index)); - let index_before = index.wrapping_sub(Group::WIDTH) & self.bucket_mask; - let empty_before = Group::load(self.ctrl(index_before)).match_empty(); - let empty_after = Group::load(self.ctrl(index)).match_empty(); - - // If we are inside a continuous block of Group::WIDTH full or deleted - // cells then a probe window may have seen a full block when trying to - // insert. We therefore need to keep that block non-empty so that - // lookups will continue searching to the next probe window. - // - // Note that in this context `leading_zeros` refers to the bytes at the - // end of a group, while `trailing_zeros` refers to the bytes at the - // beginning of a group. - let ctrl = if empty_before.leading_zeros() + empty_after.trailing_zeros() >= Group::WIDTH { - DELETED - } else { - self.growth_left += 1; - EMPTY - }; - self.set_ctrl(index, ctrl); - self.items -= 1; - } -} - -impl Clone for RawTable { - fn clone(&self) -> Self { - if self.table.is_empty_singleton() { - Self::new_in(self.table.alloc.clone()) - } else { - unsafe { - // Avoid `Result::ok_or_else` because it bloats LLVM IR. - let new_table = match Self::new_uninitialized( - self.table.alloc.clone(), - self.table.buckets(), - Fallibility::Infallible, - ) { - Ok(table) => table, - Err(_) => hint::unreachable_unchecked(), - }; - - // If cloning fails then we need to free the allocation for the - // new table. However we don't run its drop since its control - // bytes are not initialized yet. - let mut guard = guard(ManuallyDrop::new(new_table), |new_table| { - new_table.free_buckets(); - }); - - guard.clone_from_spec(self); - - // Disarm the scope guard and return the newly created table. - ManuallyDrop::into_inner(ScopeGuard::into_inner(guard)) - } - } - } - - fn clone_from(&mut self, source: &Self) { - if source.table.is_empty_singleton() { - *self = Self::new_in(self.table.alloc.clone()); - } else { - unsafe { - // Make sure that if any panics occurs, we clear the table and - // leave it in an empty state. - let mut self_ = guard(self, |self_| { - self_.clear_no_drop(); - }); - - // First, drop all our elements without clearing the control - // bytes. If this panics then the scope guard will clear the - // table, leaking any elements that were not dropped yet. - // - // This leak is unavoidable: we can't try dropping more elements - // since this could lead to another panic and abort the process. - self_.drop_elements(); - - // If necessary, resize our table to match the source. - if self_.buckets() != source.buckets() { - // Skip our drop by using ptr::write. - if !self_.table.is_empty_singleton() { - self_.free_buckets(); - } - (&mut **self_ as *mut Self).write( - // Avoid `Result::unwrap_or_else` because it bloats LLVM IR. - match Self::new_uninitialized( - self_.table.alloc.clone(), - source.buckets(), - Fallibility::Infallible, - ) { - Ok(table) => table, - Err(_) => hint::unreachable_unchecked(), - }, - ); - } - - self_.clone_from_spec(source); - - // Disarm the scope guard if cloning was successful. - ScopeGuard::into_inner(self_); - } - } - } -} - -/// Specialization of `clone_from` for `Copy` types -trait RawTableClone { - unsafe fn clone_from_spec(&mut self, source: &Self); -} -impl RawTableClone for RawTable { - default_fn! { - #[cfg_attr(feature = "inline-more", inline)] - unsafe fn clone_from_spec(&mut self, source: &Self) { - self.clone_from_impl(source); - } - } -} -#[cfg(feature = "nightly")] -impl RawTableClone for RawTable { - #[cfg_attr(feature = "inline-more", inline)] - unsafe fn clone_from_spec(&mut self, source: &Self) { - source - .table - .ctrl(0) - .copy_to_nonoverlapping(self.table.ctrl(0), self.table.num_ctrl_bytes()); - source - .data_start() - .copy_to_nonoverlapping(self.data_start(), self.table.buckets()); - - self.table.items = source.table.items; - self.table.growth_left = source.table.growth_left; - } -} - -impl RawTable { - /// Common code for clone and clone_from. Assumes: - /// - `self.buckets() == source.buckets()`. - /// - Any existing elements have been dropped. - /// - The control bytes are not initialized yet. - #[cfg_attr(feature = "inline-more", inline)] - unsafe fn clone_from_impl(&mut self, source: &Self) { - // Copy the control bytes unchanged. We do this in a single pass - source - .table - .ctrl(0) - .copy_to_nonoverlapping(self.table.ctrl(0), self.table.num_ctrl_bytes()); - - // The cloning of elements may panic, in which case we need - // to make sure we drop only the elements that have been - // cloned so far. - let mut guard = guard((0, &mut *self), |(index, self_)| { - if Self::DATA_NEEDS_DROP && !self_.is_empty() { - for i in 0..=*index { - if self_.is_bucket_full(i) { - self_.bucket(i).drop(); - } - } - } - }); - - for from in source.iter() { - let index = source.bucket_index(&from); - let to = guard.1.bucket(index); - to.write(from.as_ref().clone()); - - // Update the index in case we need to unwind. - guard.0 = index; - } - - // Successfully cloned all items, no need to clean up. - mem::forget(guard); - - self.table.items = source.table.items; - self.table.growth_left = source.table.growth_left; - } - - /// Variant of `clone_from` to use when a hasher is available. - #[cfg(feature = "raw")] - pub fn clone_from_with_hasher(&mut self, source: &Self, hasher: impl Fn(&T) -> u64) { - // If we have enough capacity in the table, just clear it and insert - // elements one by one. We don't do this if we have the same number of - // buckets as the source since we can just copy the contents directly - // in that case. - if self.table.buckets() != source.table.buckets() - && bucket_mask_to_capacity(self.table.bucket_mask) >= source.len() - { - self.clear(); - - let guard_self = guard(&mut *self, |self_| { - // Clear the partially copied table if a panic occurs, otherwise - // items and growth_left will be out of sync with the contents - // of the table. - self_.clear(); - }); - - unsafe { - for item in source.iter() { - // This may panic. - let item = item.as_ref().clone(); - let hash = hasher(&item); - - // We can use a simpler version of insert() here since: - // - there are no DELETED entries. - // - we know there is enough space in the table. - // - all elements are unique. - let (index, _) = guard_self.table.prepare_insert_slot(hash); - guard_self.bucket(index).write(item); - } - } - - // Successfully cloned all items, no need to clean up. - mem::forget(guard_self); - - self.table.items = source.table.items; - self.table.growth_left -= source.table.items; - } else { - self.clone_from(source); - } - } -} - -impl Default for RawTable { - #[inline] - fn default() -> Self { - Self::new_in(Default::default()) - } -} - -#[cfg(feature = "nightly")] -unsafe impl<#[may_dangle] T, A: Allocator + Clone> Drop for RawTable { - #[cfg_attr(feature = "inline-more", inline)] - fn drop(&mut self) { - if !self.table.is_empty_singleton() { - unsafe { - self.drop_elements(); - self.free_buckets(); - } - } - } -} -#[cfg(not(feature = "nightly"))] -impl Drop for RawTable { - #[cfg_attr(feature = "inline-more", inline)] - fn drop(&mut self) { - if !self.table.is_empty_singleton() { - unsafe { - self.drop_elements(); - self.free_buckets(); - } - } - } -} - -impl IntoIterator for RawTable { - type Item = T; - type IntoIter = RawIntoIter; - - #[cfg_attr(feature = "inline-more", inline)] - fn into_iter(self) -> RawIntoIter { - unsafe { - let iter = self.iter(); - self.into_iter_from(iter) - } - } -} - -/// Iterator over a sub-range of a table. Unlike `RawIter` this iterator does -/// not track an item count. -pub(crate) struct RawIterRange { - // Mask of full buckets in the current group. Bits are cleared from this - // mask as each element is processed. - current_group: BitMask, - - // Pointer to the buckets for the current group. - data: Bucket, - - // Pointer to the next group of control bytes, - // Must be aligned to the group size. - next_ctrl: *const u8, - - // Pointer one past the last control byte of this range. - end: *const u8, -} - -impl RawIterRange { - /// Returns a `RawIterRange` covering a subset of a table. - /// - /// The control byte address must be aligned to the group size. - #[cfg_attr(feature = "inline-more", inline)] - unsafe fn new(ctrl: *const u8, data: Bucket, len: usize) -> Self { - debug_assert_ne!(len, 0); - debug_assert_eq!(ctrl as usize % Group::WIDTH, 0); - let end = ctrl.add(len); - - // Load the first group and advance ctrl to point to the next group - let current_group = Group::load_aligned(ctrl).match_full(); - let next_ctrl = ctrl.add(Group::WIDTH); - - Self { - current_group, - data, - next_ctrl, - end, - } - } - - /// Splits a `RawIterRange` into two halves. - /// - /// Returns `None` if the remaining range is smaller than or equal to the - /// group width. - #[cfg_attr(feature = "inline-more", inline)] - #[cfg(feature = "rayon")] - pub(crate) fn split(mut self) -> (Self, Option>) { - unsafe { - if self.end <= self.next_ctrl { - // Nothing to split if the group that we are current processing - // is the last one. - (self, None) - } else { - // len is the remaining number of elements after the group that - // we are currently processing. It must be a multiple of the - // group size (small tables are caught by the check above). - let len = offset_from(self.end, self.next_ctrl); - debug_assert_eq!(len % Group::WIDTH, 0); - - // Split the remaining elements into two halves, but round the - // midpoint down in case there is an odd number of groups - // remaining. This ensures that: - // - The tail is at least 1 group long. - // - The split is roughly even considering we still have the - // current group to process. - let mid = (len / 2) & !(Group::WIDTH - 1); - - let tail = Self::new( - self.next_ctrl.add(mid), - self.data.next_n(Group::WIDTH).next_n(mid), - len - mid, - ); - debug_assert_eq!( - self.data.next_n(Group::WIDTH).next_n(mid).ptr, - tail.data.ptr - ); - debug_assert_eq!(self.end, tail.end); - self.end = self.next_ctrl.add(mid); - debug_assert_eq!(self.end.add(Group::WIDTH), tail.next_ctrl); - (self, Some(tail)) - } - } - } - - /// # Safety - /// If DO_CHECK_PTR_RANGE is false, caller must ensure that we never try to iterate - /// after yielding all elements. - #[cfg_attr(feature = "inline-more", inline)] - unsafe fn next_impl(&mut self) -> Option> { - loop { - if let Some(index) = self.current_group.lowest_set_bit() { - self.current_group = self.current_group.remove_lowest_bit(); - return Some(self.data.next_n(index)); - } - - if DO_CHECK_PTR_RANGE && self.next_ctrl >= self.end { - return None; - } - - // We might read past self.end up to the next group boundary, - // but this is fine because it only occurs on tables smaller - // than the group size where the trailing control bytes are all - // EMPTY. On larger tables self.end is guaranteed to be aligned - // to the group size (since tables are power-of-two sized). - self.current_group = Group::load_aligned(self.next_ctrl).match_full(); - self.data = self.data.next_n(Group::WIDTH); - self.next_ctrl = self.next_ctrl.add(Group::WIDTH); - } - } -} - -// We make raw iterators unconditionally Send and Sync, and let the PhantomData -// in the actual iterator implementations determine the real Send/Sync bounds. -unsafe impl Send for RawIterRange {} -unsafe impl Sync for RawIterRange {} - -impl Clone for RawIterRange { - #[cfg_attr(feature = "inline-more", inline)] - fn clone(&self) -> Self { - Self { - data: self.data.clone(), - next_ctrl: self.next_ctrl, - current_group: self.current_group, - end: self.end, - } - } -} - -impl Iterator for RawIterRange { - type Item = Bucket; - - #[cfg_attr(feature = "inline-more", inline)] - fn next(&mut self) -> Option> { - unsafe { - // SAFETY: We set checker flag to true. - self.next_impl::() - } - } - - #[inline] - fn size_hint(&self) -> (usize, Option) { - // We don't have an item count, so just guess based on the range size. - let remaining_buckets = if self.end > self.next_ctrl { - unsafe { offset_from(self.end, self.next_ctrl) } - } else { - 0 - }; - - // Add a group width to include the group we are currently processing. - (0, Some(Group::WIDTH + remaining_buckets)) - } -} - -impl FusedIterator for RawIterRange {} - -/// Iterator which returns a raw pointer to every full bucket in the table. -/// -/// For maximum flexibility this iterator is not bound by a lifetime, but you -/// must observe several rules when using it: -/// - You must not free the hash table while iterating (including via growing/shrinking). -/// - It is fine to erase a bucket that has been yielded by the iterator. -/// - Erasing a bucket that has not yet been yielded by the iterator may still -/// result in the iterator yielding that bucket (unless `reflect_remove` is called). -/// - It is unspecified whether an element inserted after the iterator was -/// created will be yielded by that iterator (unless `reflect_insert` is called). -/// - The order in which the iterator yields bucket is unspecified and may -/// change in the future. -pub struct RawIter { - pub(crate) iter: RawIterRange, - items: usize, -} - -impl RawIter { - const DATA_NEEDS_DROP: bool = mem::needs_drop::(); - - /// Refresh the iterator so that it reflects a removal from the given bucket. - /// - /// For the iterator to remain valid, this method must be called once - /// for each removed bucket before `next` is called again. - /// - /// This method should be called _before_ the removal is made. It is not necessary to call this - /// method if you are removing an item that this iterator yielded in the past. - #[cfg(feature = "raw")] - pub fn reflect_remove(&mut self, b: &Bucket) { - self.reflect_toggle_full(b, false); - } - - /// Refresh the iterator so that it reflects an insertion into the given bucket. - /// - /// For the iterator to remain valid, this method must be called once - /// for each insert before `next` is called again. - /// - /// This method does not guarantee that an insertion of a bucket with a greater - /// index than the last one yielded will be reflected in the iterator. - /// - /// This method should be called _after_ the given insert is made. - #[cfg(feature = "raw")] - pub fn reflect_insert(&mut self, b: &Bucket) { - self.reflect_toggle_full(b, true); - } - - /// Refresh the iterator so that it reflects a change to the state of the given bucket. - #[cfg(feature = "raw")] - fn reflect_toggle_full(&mut self, b: &Bucket, is_insert: bool) { - unsafe { - if b.as_ptr() > self.iter.data.as_ptr() { - // The iterator has already passed the bucket's group. - // So the toggle isn't relevant to this iterator. - return; - } - - if self.iter.next_ctrl < self.iter.end - && b.as_ptr() <= self.iter.data.next_n(Group::WIDTH).as_ptr() - { - // The iterator has not yet reached the bucket's group. - // We don't need to reload anything, but we do need to adjust the item count. - - if cfg!(debug_assertions) { - // Double-check that the user isn't lying to us by checking the bucket state. - // To do that, we need to find its control byte. We know that self.iter.data is - // at self.iter.next_ctrl - Group::WIDTH, so we work from there: - let offset = offset_from(self.iter.data.as_ptr(), b.as_ptr()); - let ctrl = self.iter.next_ctrl.sub(Group::WIDTH).add(offset); - // This method should be called _before_ a removal, or _after_ an insert, - // so in both cases the ctrl byte should indicate that the bucket is full. - assert!(is_full(*ctrl)); - } - - if is_insert { - self.items += 1; - } else { - self.items -= 1; - } - - return; - } - - // The iterator is at the bucket group that the toggled bucket is in. - // We need to do two things: - // - // - Determine if the iterator already yielded the toggled bucket. - // If it did, we're done. - // - Otherwise, update the iterator cached group so that it won't - // yield a to-be-removed bucket, or _will_ yield a to-be-added bucket. - // We'll also need to update the item count accordingly. - if let Some(index) = self.iter.current_group.lowest_set_bit() { - let next_bucket = self.iter.data.next_n(index); - if b.as_ptr() > next_bucket.as_ptr() { - // The toggled bucket is "before" the bucket the iterator would yield next. We - // therefore don't need to do anything --- the iterator has already passed the - // bucket in question. - // - // The item count must already be correct, since a removal or insert "prior" to - // the iterator's position wouldn't affect the item count. - } else { - // The removed bucket is an upcoming bucket. We need to make sure it does _not_ - // get yielded, and also that it's no longer included in the item count. - // - // NOTE: We can't just reload the group here, both since that might reflect - // inserts we've already passed, and because that might inadvertently unset the - // bits for _other_ removals. If we do that, we'd have to also decrement the - // item count for those other bits that we unset. But the presumably subsequent - // call to reflect for those buckets might _also_ decrement the item count. - // Instead, we _just_ flip the bit for the particular bucket the caller asked - // us to reflect. - let our_bit = offset_from(self.iter.data.as_ptr(), b.as_ptr()); - let was_full = self.iter.current_group.flip(our_bit); - debug_assert_ne!(was_full, is_insert); - - if is_insert { - self.items += 1; - } else { - self.items -= 1; - } - - if cfg!(debug_assertions) { - if b.as_ptr() == next_bucket.as_ptr() { - // The removed bucket should no longer be next - debug_assert_ne!(self.iter.current_group.lowest_set_bit(), Some(index)); - } else { - // We should not have changed what bucket comes next. - debug_assert_eq!(self.iter.current_group.lowest_set_bit(), Some(index)); - } - } - } - } else { - // We must have already iterated past the removed item. - } - } - } - - unsafe fn drop_elements(&mut self) { - if Self::DATA_NEEDS_DROP && self.len() != 0 { - for item in self { - item.drop(); - } - } - } -} - -impl Clone for RawIter { - #[cfg_attr(feature = "inline-more", inline)] - fn clone(&self) -> Self { - Self { - iter: self.iter.clone(), - items: self.items, - } - } -} - -impl Iterator for RawIter { - type Item = Bucket; - - #[cfg_attr(feature = "inline-more", inline)] - fn next(&mut self) -> Option> { - // Inner iterator iterates over buckets - // so it can do unnecessary work if we already yielded all items. - if self.items == 0 { - return None; - } - - let nxt = unsafe { - // SAFETY: We check number of items to yield using `items` field. - self.iter.next_impl::() - }; - - if nxt.is_some() { - self.items -= 1; - } - - nxt - } - - #[inline] - fn size_hint(&self) -> (usize, Option) { - (self.items, Some(self.items)) - } -} - -impl ExactSizeIterator for RawIter {} -impl FusedIterator for RawIter {} - -/// Iterator which consumes a table and returns elements. -pub struct RawIntoIter { - iter: RawIter, - allocation: Option<(NonNull, Layout)>, - marker: PhantomData, - alloc: A, -} - -impl RawIntoIter { - #[cfg_attr(feature = "inline-more", inline)] - pub fn iter(&self) -> RawIter { - self.iter.clone() - } -} - -unsafe impl Send for RawIntoIter -where - T: Send, - A: Send, -{ -} -unsafe impl Sync for RawIntoIter -where - T: Sync, - A: Sync, -{ -} - -#[cfg(feature = "nightly")] -unsafe impl<#[may_dangle] T, A: Allocator + Clone> Drop for RawIntoIter { - #[cfg_attr(feature = "inline-more", inline)] - fn drop(&mut self) { - unsafe { - // Drop all remaining elements - self.iter.drop_elements(); - - // Free the table - if let Some((ptr, layout)) = self.allocation { - self.alloc.deallocate(ptr, layout); - } - } - } -} -#[cfg(not(feature = "nightly"))] -impl Drop for RawIntoIter { - #[cfg_attr(feature = "inline-more", inline)] - fn drop(&mut self) { - unsafe { - // Drop all remaining elements - self.iter.drop_elements(); - - // Free the table - if let Some((ptr, layout)) = self.allocation { - self.alloc.deallocate(ptr, layout); - } - } - } -} - -impl Iterator for RawIntoIter { - type Item = T; - - #[cfg_attr(feature = "inline-more", inline)] - fn next(&mut self) -> Option { - unsafe { Some(self.iter.next()?.read()) } - } - - #[inline] - fn size_hint(&self) -> (usize, Option) { - self.iter.size_hint() - } -} - -impl ExactSizeIterator for RawIntoIter {} -impl FusedIterator for RawIntoIter {} - -/// Iterator which consumes elements without freeing the table storage. -pub struct RawDrain<'a, T, A: Allocator + Clone = Global> { - iter: RawIter, - - // The table is moved into the iterator for the duration of the drain. This - // ensures that an empty table is left if the drain iterator is leaked - // without dropping. - table: ManuallyDrop>, - orig_table: NonNull>, - - // We don't use a &'a mut RawTable because we want RawDrain to be - // covariant over T. - marker: PhantomData<&'a RawTable>, -} - -impl RawDrain<'_, T, A> { - #[cfg_attr(feature = "inline-more", inline)] - pub fn iter(&self) -> RawIter { - self.iter.clone() - } -} - -unsafe impl Send for RawDrain<'_, T, A> -where - T: Send, - A: Send, -{ -} -unsafe impl Sync for RawDrain<'_, T, A> -where - T: Sync, - A: Sync, -{ -} - -impl Drop for RawDrain<'_, T, A> { - #[cfg_attr(feature = "inline-more", inline)] - fn drop(&mut self) { - unsafe { - // Drop all remaining elements. Note that this may panic. - self.iter.drop_elements(); - - // Reset the contents of the table now that all elements have been - // dropped. - self.table.clear_no_drop(); - - // Move the now empty table back to its original location. - self.orig_table - .as_ptr() - .copy_from_nonoverlapping(&*self.table, 1); - } - } -} - -impl Iterator for RawDrain<'_, T, A> { - type Item = T; - - #[cfg_attr(feature = "inline-more", inline)] - fn next(&mut self) -> Option { - unsafe { - let item = self.iter.next()?; - Some(item.read()) - } - } - - #[inline] - fn size_hint(&self) -> (usize, Option) { - self.iter.size_hint() - } -} - -impl ExactSizeIterator for RawDrain<'_, T, A> {} -impl FusedIterator for RawDrain<'_, T, A> {} - -/// Iterator over occupied buckets that could match a given hash. -/// -/// `RawTable` only stores 7 bits of the hash value, so this iterator may return -/// items that have a hash value different than the one provided. You should -/// always validate the returned values before using them. -pub struct RawIterHash<'a, T, A: Allocator + Clone = Global> { - inner: RawIterHashInner<'a, A>, - _marker: PhantomData, -} - -struct RawIterHashInner<'a, A: Allocator + Clone> { - table: &'a RawTableInner, - - // The top 7 bits of the hash. - h2_hash: u8, - - // The sequence of groups to probe in the search. - probe_seq: ProbeSeq, - - group: Group, - - // The elements within the group with a matching h2-hash. - bitmask: BitMaskIter, -} - -impl<'a, T, A: Allocator + Clone> RawIterHash<'a, T, A> { - #[cfg_attr(feature = "inline-more", inline)] - #[cfg(feature = "raw")] - fn new(table: &'a RawTable, hash: u64) -> Self { - RawIterHash { - inner: RawIterHashInner::new(&table.table, hash), - _marker: PhantomData, - } - } -} -impl<'a, A: Allocator + Clone> RawIterHashInner<'a, A> { - #[cfg_attr(feature = "inline-more", inline)] - #[cfg(feature = "raw")] - fn new(table: &'a RawTableInner, hash: u64) -> Self { - unsafe { - let h2_hash = h2(hash); - let probe_seq = table.probe_seq(hash); - let group = Group::load(table.ctrl(probe_seq.pos)); - let bitmask = group.match_byte(h2_hash).into_iter(); - - RawIterHashInner { - table, - h2_hash, - probe_seq, - group, - bitmask, - } - } - } -} - -impl<'a, T, A: Allocator + Clone> Iterator for RawIterHash<'a, T, A> { - type Item = Bucket; - - fn next(&mut self) -> Option> { - unsafe { - match self.inner.next() { - Some(index) => Some(self.inner.table.bucket(index)), - None => None, - } - } - } -} - -impl<'a, A: Allocator + Clone> Iterator for RawIterHashInner<'a, A> { - type Item = usize; - - fn next(&mut self) -> Option { - unsafe { - loop { - if let Some(bit) = self.bitmask.next() { - let index = (self.probe_seq.pos + bit) & self.table.bucket_mask; - return Some(index); - } - if likely(self.group.match_empty().any_bit_set()) { - return None; - } - self.probe_seq.move_next(self.table.bucket_mask); - self.group = Group::load(self.table.ctrl(self.probe_seq.pos)); - self.bitmask = self.group.match_byte(self.h2_hash).into_iter(); - } - } - } -} - -#[cfg(test)] -mod test_map { - use super::*; - - fn rehash_in_place(table: &mut RawTable, hasher: impl Fn(&T) -> u64) { - unsafe { - table.table.rehash_in_place( - &|table, index| hasher(table.bucket::(index).as_ref()), - mem::size_of::(), - if mem::needs_drop::() { - Some(mem::transmute(ptr::drop_in_place:: as unsafe fn(*mut T))) - } else { - None - }, - ); - } - } - - #[test] - fn rehash() { - let mut table = RawTable::new(); - let hasher = |i: &u64| *i; - for i in 0..100 { - table.insert(i, i, hasher); - } - - for i in 0..100 { - unsafe { - assert_eq!(table.find(i, |x| *x == i).map(|b| b.read()), Some(i)); - } - assert!(table.find(i + 100, |x| *x == i + 100).is_none()); - } - - rehash_in_place(&mut table, hasher); - - for i in 0..100 { - unsafe { - assert_eq!(table.find(i, |x| *x == i).map(|b| b.read()), Some(i)); - } - assert!(table.find(i + 100, |x| *x == i + 100).is_none()); - } - } -} diff -Nru temporalio-1.3.0/vendor/hashbrown-0.13.2/src/raw/sse2.rs temporalio-1.3.0/vendor/hashbrown-0.13.2/src/raw/sse2.rs --- temporalio-1.3.0/vendor/hashbrown-0.13.2/src/raw/sse2.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/hashbrown-0.13.2/src/raw/sse2.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,146 +0,0 @@ -use super::bitmask::BitMask; -use super::EMPTY; -use core::mem; - -#[cfg(target_arch = "x86")] -use core::arch::x86; -#[cfg(target_arch = "x86_64")] -use core::arch::x86_64 as x86; - -pub type BitMaskWord = u16; -pub const BITMASK_STRIDE: usize = 1; -pub const BITMASK_MASK: BitMaskWord = 0xffff; - -/// Abstraction over a group of control bytes which can be scanned in -/// parallel. -/// -/// This implementation uses a 128-bit SSE value. -#[derive(Copy, Clone)] -pub struct Group(x86::__m128i); - -// FIXME: https://github.com/rust-lang/rust-clippy/issues/3859 -#[allow(clippy::use_self)] -impl Group { - /// Number of bytes in the group. - pub const WIDTH: usize = mem::size_of::(); - - /// Returns a full group of empty bytes, suitable for use as the initial - /// value for an empty hash table. - /// - /// This is guaranteed to be aligned to the group size. - #[inline] - #[allow(clippy::items_after_statements)] - pub const fn static_empty() -> &'static [u8; Group::WIDTH] { - #[repr(C)] - struct AlignedBytes { - _align: [Group; 0], - bytes: [u8; Group::WIDTH], - } - const ALIGNED_BYTES: AlignedBytes = AlignedBytes { - _align: [], - bytes: [EMPTY; Group::WIDTH], - }; - &ALIGNED_BYTES.bytes - } - - /// Loads a group of bytes starting at the given address. - #[inline] - #[allow(clippy::cast_ptr_alignment)] // unaligned load - pub unsafe fn load(ptr: *const u8) -> Self { - Group(x86::_mm_loadu_si128(ptr.cast())) - } - - /// Loads a group of bytes starting at the given address, which must be - /// aligned to `mem::align_of::()`. - #[inline] - #[allow(clippy::cast_ptr_alignment)] - pub unsafe fn load_aligned(ptr: *const u8) -> Self { - // FIXME: use align_offset once it stabilizes - debug_assert_eq!(ptr as usize & (mem::align_of::() - 1), 0); - Group(x86::_mm_load_si128(ptr.cast())) - } - - /// Stores the group of bytes to the given address, which must be - /// aligned to `mem::align_of::()`. - #[inline] - #[allow(clippy::cast_ptr_alignment)] - pub unsafe fn store_aligned(self, ptr: *mut u8) { - // FIXME: use align_offset once it stabilizes - debug_assert_eq!(ptr as usize & (mem::align_of::() - 1), 0); - x86::_mm_store_si128(ptr.cast(), self.0); - } - - /// Returns a `BitMask` indicating all bytes in the group which have - /// the given value. - #[inline] - pub fn match_byte(self, byte: u8) -> BitMask { - #[allow( - clippy::cast_possible_wrap, // byte: u8 as i8 - // byte: i32 as u16 - // note: _mm_movemask_epi8 returns a 16-bit mask in a i32, the - // upper 16-bits of the i32 are zeroed: - clippy::cast_sign_loss, - clippy::cast_possible_truncation - )] - unsafe { - let cmp = x86::_mm_cmpeq_epi8(self.0, x86::_mm_set1_epi8(byte as i8)); - BitMask(x86::_mm_movemask_epi8(cmp) as u16) - } - } - - /// Returns a `BitMask` indicating all bytes in the group which are - /// `EMPTY`. - #[inline] - pub fn match_empty(self) -> BitMask { - self.match_byte(EMPTY) - } - - /// Returns a `BitMask` indicating all bytes in the group which are - /// `EMPTY` or `DELETED`. - #[inline] - pub fn match_empty_or_deleted(self) -> BitMask { - #[allow( - // byte: i32 as u16 - // note: _mm_movemask_epi8 returns a 16-bit mask in a i32, the - // upper 16-bits of the i32 are zeroed: - clippy::cast_sign_loss, - clippy::cast_possible_truncation - )] - unsafe { - // A byte is EMPTY or DELETED iff the high bit is set - BitMask(x86::_mm_movemask_epi8(self.0) as u16) - } - } - - /// Returns a `BitMask` indicating all bytes in the group which are full. - #[inline] - pub fn match_full(&self) -> BitMask { - self.match_empty_or_deleted().invert() - } - - /// Performs the following transformation on all bytes in the group: - /// - `EMPTY => EMPTY` - /// - `DELETED => EMPTY` - /// - `FULL => DELETED` - #[inline] - pub fn convert_special_to_empty_and_full_to_deleted(self) -> Self { - // Map high_bit = 1 (EMPTY or DELETED) to 1111_1111 - // and high_bit = 0 (FULL) to 1000_0000 - // - // Here's this logic expanded to concrete values: - // let special = 0 > byte = 1111_1111 (true) or 0000_0000 (false) - // 1111_1111 | 1000_0000 = 1111_1111 - // 0000_0000 | 1000_0000 = 1000_0000 - #[allow( - clippy::cast_possible_wrap, // byte: 0x80_u8 as i8 - )] - unsafe { - let zero = x86::_mm_setzero_si128(); - let special = x86::_mm_cmpgt_epi8(zero, self.0); - Group(x86::_mm_or_si128( - special, - x86::_mm_set1_epi8(0x80_u8 as i8), - )) - } - } -} diff -Nru temporalio-1.3.0/vendor/hashbrown-0.13.2/src/rustc_entry.rs temporalio-1.3.0/vendor/hashbrown-0.13.2/src/rustc_entry.rs --- temporalio-1.3.0/vendor/hashbrown-0.13.2/src/rustc_entry.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/hashbrown-0.13.2/src/rustc_entry.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,630 +0,0 @@ -use self::RustcEntry::*; -use crate::map::{make_insert_hash, Drain, HashMap, IntoIter, Iter, IterMut}; -use crate::raw::{Allocator, Bucket, Global, RawTable}; -use core::fmt::{self, Debug}; -use core::hash::{BuildHasher, Hash}; -use core::mem; - -impl HashMap -where - K: Eq + Hash, - S: BuildHasher, - A: Allocator + Clone, -{ - /// Gets the given key's corresponding entry in the map for in-place manipulation. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// - /// let mut letters = HashMap::new(); - /// - /// for ch in "a short treatise on fungi".chars() { - /// let counter = letters.rustc_entry(ch).or_insert(0); - /// *counter += 1; - /// } - /// - /// assert_eq!(letters[&'s'], 2); - /// assert_eq!(letters[&'t'], 3); - /// assert_eq!(letters[&'u'], 1); - /// assert_eq!(letters.get(&'y'), None); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn rustc_entry(&mut self, key: K) -> RustcEntry<'_, K, V, A> { - let hash = make_insert_hash(&self.hash_builder, &key); - if let Some(elem) = self.table.find(hash, |q| q.0.eq(&key)) { - RustcEntry::Occupied(RustcOccupiedEntry { - key: Some(key), - elem, - table: &mut self.table, - }) - } else { - // Ideally we would put this in VacantEntry::insert, but Entry is not - // generic over the BuildHasher and adding a generic parameter would be - // a breaking change. - self.reserve(1); - - RustcEntry::Vacant(RustcVacantEntry { - hash, - key, - table: &mut self.table, - }) - } - } -} - -/// A view into a single entry in a map, which may either be vacant or occupied. -/// -/// This `enum` is constructed from the [`rustc_entry`] method on [`HashMap`]. -/// -/// [`HashMap`]: struct.HashMap.html -/// [`rustc_entry`]: struct.HashMap.html#method.rustc_entry -pub enum RustcEntry<'a, K, V, A = Global> -where - A: Allocator + Clone, -{ - /// An occupied entry. - Occupied(RustcOccupiedEntry<'a, K, V, A>), - - /// A vacant entry. - Vacant(RustcVacantEntry<'a, K, V, A>), -} - -impl Debug for RustcEntry<'_, K, V, A> { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match *self { - Vacant(ref v) => f.debug_tuple("Entry").field(v).finish(), - Occupied(ref o) => f.debug_tuple("Entry").field(o).finish(), - } - } -} - -/// A view into an occupied entry in a `HashMap`. -/// It is part of the [`RustcEntry`] enum. -/// -/// [`RustcEntry`]: enum.RustcEntry.html -pub struct RustcOccupiedEntry<'a, K, V, A = Global> -where - A: Allocator + Clone, -{ - key: Option, - elem: Bucket<(K, V)>, - table: &'a mut RawTable<(K, V), A>, -} - -unsafe impl Send for RustcOccupiedEntry<'_, K, V, A> -where - K: Send, - V: Send, - A: Allocator + Clone + Send, -{ -} -unsafe impl Sync for RustcOccupiedEntry<'_, K, V, A> -where - K: Sync, - V: Sync, - A: Allocator + Clone + Sync, -{ -} - -impl Debug for RustcOccupiedEntry<'_, K, V, A> { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("OccupiedEntry") - .field("key", self.key()) - .field("value", self.get()) - .finish() - } -} - -/// A view into a vacant entry in a `HashMap`. -/// It is part of the [`RustcEntry`] enum. -/// -/// [`RustcEntry`]: enum.RustcEntry.html -pub struct RustcVacantEntry<'a, K, V, A = Global> -where - A: Allocator + Clone, -{ - hash: u64, - key: K, - table: &'a mut RawTable<(K, V), A>, -} - -impl Debug for RustcVacantEntry<'_, K, V, A> { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_tuple("VacantEntry").field(self.key()).finish() - } -} - -impl<'a, K, V, A: Allocator + Clone> RustcEntry<'a, K, V, A> { - /// Sets the value of the entry, and returns a RustcOccupiedEntry. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// - /// let mut map: HashMap<&str, u32> = HashMap::new(); - /// let entry = map.rustc_entry("horseyland").insert(37); - /// - /// assert_eq!(entry.key(), &"horseyland"); - /// ``` - pub fn insert(self, value: V) -> RustcOccupiedEntry<'a, K, V, A> { - match self { - Vacant(entry) => entry.insert_entry(value), - Occupied(mut entry) => { - entry.insert(value); - entry - } - } - } - - /// Ensures a value is in the entry by inserting the default if empty, and returns - /// a mutable reference to the value in the entry. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// - /// let mut map: HashMap<&str, u32> = HashMap::new(); - /// - /// map.rustc_entry("poneyland").or_insert(3); - /// assert_eq!(map["poneyland"], 3); - /// - /// *map.rustc_entry("poneyland").or_insert(10) *= 2; - /// assert_eq!(map["poneyland"], 6); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn or_insert(self, default: V) -> &'a mut V - where - K: Hash, - { - match self { - Occupied(entry) => entry.into_mut(), - Vacant(entry) => entry.insert(default), - } - } - - /// Ensures a value is in the entry by inserting the result of the default function if empty, - /// and returns a mutable reference to the value in the entry. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// - /// let mut map: HashMap<&str, String> = HashMap::new(); - /// let s = "hoho".to_string(); - /// - /// map.rustc_entry("poneyland").or_insert_with(|| s); - /// - /// assert_eq!(map["poneyland"], "hoho".to_string()); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn or_insert_with V>(self, default: F) -> &'a mut V - where - K: Hash, - { - match self { - Occupied(entry) => entry.into_mut(), - Vacant(entry) => entry.insert(default()), - } - } - - /// Returns a reference to this entry's key. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// - /// let mut map: HashMap<&str, u32> = HashMap::new(); - /// assert_eq!(map.rustc_entry("poneyland").key(), &"poneyland"); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn key(&self) -> &K { - match *self { - Occupied(ref entry) => entry.key(), - Vacant(ref entry) => entry.key(), - } - } - - /// Provides in-place mutable access to an occupied entry before any - /// potential inserts into the map. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// - /// let mut map: HashMap<&str, u32> = HashMap::new(); - /// - /// map.rustc_entry("poneyland") - /// .and_modify(|e| { *e += 1 }) - /// .or_insert(42); - /// assert_eq!(map["poneyland"], 42); - /// - /// map.rustc_entry("poneyland") - /// .and_modify(|e| { *e += 1 }) - /// .or_insert(42); - /// assert_eq!(map["poneyland"], 43); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn and_modify(self, f: F) -> Self - where - F: FnOnce(&mut V), - { - match self { - Occupied(mut entry) => { - f(entry.get_mut()); - Occupied(entry) - } - Vacant(entry) => Vacant(entry), - } - } -} - -impl<'a, K, V: Default, A: Allocator + Clone> RustcEntry<'a, K, V, A> { - /// Ensures a value is in the entry by inserting the default value if empty, - /// and returns a mutable reference to the value in the entry. - /// - /// # Examples - /// - /// ``` - /// # fn main() { - /// use hashbrown::HashMap; - /// - /// let mut map: HashMap<&str, Option> = HashMap::new(); - /// map.rustc_entry("poneyland").or_default(); - /// - /// assert_eq!(map["poneyland"], None); - /// # } - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn or_default(self) -> &'a mut V - where - K: Hash, - { - match self { - Occupied(entry) => entry.into_mut(), - Vacant(entry) => entry.insert(Default::default()), - } - } -} - -impl<'a, K, V, A: Allocator + Clone> RustcOccupiedEntry<'a, K, V, A> { - /// Gets a reference to the key in the entry. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// - /// let mut map: HashMap<&str, u32> = HashMap::new(); - /// map.rustc_entry("poneyland").or_insert(12); - /// assert_eq!(map.rustc_entry("poneyland").key(), &"poneyland"); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn key(&self) -> &K { - unsafe { &self.elem.as_ref().0 } - } - - /// Take the ownership of the key and value from the map. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// use hashbrown::hash_map::RustcEntry; - /// - /// let mut map: HashMap<&str, u32> = HashMap::new(); - /// map.rustc_entry("poneyland").or_insert(12); - /// - /// if let RustcEntry::Occupied(o) = map.rustc_entry("poneyland") { - /// // We delete the entry from the map. - /// o.remove_entry(); - /// } - /// - /// assert_eq!(map.contains_key("poneyland"), false); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn remove_entry(self) -> (K, V) { - unsafe { self.table.remove(self.elem) } - } - - /// Gets a reference to the value in the entry. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// use hashbrown::hash_map::RustcEntry; - /// - /// let mut map: HashMap<&str, u32> = HashMap::new(); - /// map.rustc_entry("poneyland").or_insert(12); - /// - /// if let RustcEntry::Occupied(o) = map.rustc_entry("poneyland") { - /// assert_eq!(o.get(), &12); - /// } - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn get(&self) -> &V { - unsafe { &self.elem.as_ref().1 } - } - - /// Gets a mutable reference to the value in the entry. - /// - /// If you need a reference to the `RustcOccupiedEntry` which may outlive the - /// destruction of the `RustcEntry` value, see [`into_mut`]. - /// - /// [`into_mut`]: #method.into_mut - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// use hashbrown::hash_map::RustcEntry; - /// - /// let mut map: HashMap<&str, u32> = HashMap::new(); - /// map.rustc_entry("poneyland").or_insert(12); - /// - /// assert_eq!(map["poneyland"], 12); - /// if let RustcEntry::Occupied(mut o) = map.rustc_entry("poneyland") { - /// *o.get_mut() += 10; - /// assert_eq!(*o.get(), 22); - /// - /// // We can use the same RustcEntry multiple times. - /// *o.get_mut() += 2; - /// } - /// - /// assert_eq!(map["poneyland"], 24); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn get_mut(&mut self) -> &mut V { - unsafe { &mut self.elem.as_mut().1 } - } - - /// Converts the RustcOccupiedEntry into a mutable reference to the value in the entry - /// with a lifetime bound to the map itself. - /// - /// If you need multiple references to the `RustcOccupiedEntry`, see [`get_mut`]. - /// - /// [`get_mut`]: #method.get_mut - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// use hashbrown::hash_map::RustcEntry; - /// - /// let mut map: HashMap<&str, u32> = HashMap::new(); - /// map.rustc_entry("poneyland").or_insert(12); - /// - /// assert_eq!(map["poneyland"], 12); - /// if let RustcEntry::Occupied(o) = map.rustc_entry("poneyland") { - /// *o.into_mut() += 10; - /// } - /// - /// assert_eq!(map["poneyland"], 22); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn into_mut(self) -> &'a mut V { - unsafe { &mut self.elem.as_mut().1 } - } - - /// Sets the value of the entry, and returns the entry's old value. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// use hashbrown::hash_map::RustcEntry; - /// - /// let mut map: HashMap<&str, u32> = HashMap::new(); - /// map.rustc_entry("poneyland").or_insert(12); - /// - /// if let RustcEntry::Occupied(mut o) = map.rustc_entry("poneyland") { - /// assert_eq!(o.insert(15), 12); - /// } - /// - /// assert_eq!(map["poneyland"], 15); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn insert(&mut self, value: V) -> V { - mem::replace(self.get_mut(), value) - } - - /// Takes the value out of the entry, and returns it. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// use hashbrown::hash_map::RustcEntry; - /// - /// let mut map: HashMap<&str, u32> = HashMap::new(); - /// map.rustc_entry("poneyland").or_insert(12); - /// - /// if let RustcEntry::Occupied(o) = map.rustc_entry("poneyland") { - /// assert_eq!(o.remove(), 12); - /// } - /// - /// assert_eq!(map.contains_key("poneyland"), false); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn remove(self) -> V { - self.remove_entry().1 - } - - /// Replaces the entry, returning the old key and value. The new key in the hash map will be - /// the key used to create this entry. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::hash_map::{RustcEntry, HashMap}; - /// use std::rc::Rc; - /// - /// let mut map: HashMap, u32> = HashMap::new(); - /// map.insert(Rc::new("Stringthing".to_string()), 15); - /// - /// let my_key = Rc::new("Stringthing".to_string()); - /// - /// if let RustcEntry::Occupied(entry) = map.rustc_entry(my_key) { - /// // Also replace the key with a handle to our other key. - /// let (old_key, old_value): (Rc, u32) = entry.replace_entry(16); - /// } - /// - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn replace_entry(self, value: V) -> (K, V) { - let entry = unsafe { self.elem.as_mut() }; - - let old_key = mem::replace(&mut entry.0, self.key.unwrap()); - let old_value = mem::replace(&mut entry.1, value); - - (old_key, old_value) - } - - /// Replaces the key in the hash map with the key used to create this entry. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::hash_map::{RustcEntry, HashMap}; - /// use std::rc::Rc; - /// - /// let mut map: HashMap, u32> = HashMap::new(); - /// let mut known_strings: Vec> = Vec::new(); - /// - /// // Initialise known strings, run program, etc. - /// - /// reclaim_memory(&mut map, &known_strings); - /// - /// fn reclaim_memory(map: &mut HashMap, u32>, known_strings: &[Rc] ) { - /// for s in known_strings { - /// if let RustcEntry::Occupied(entry) = map.rustc_entry(s.clone()) { - /// // Replaces the entry's key with our version of it in `known_strings`. - /// entry.replace_key(); - /// } - /// } - /// } - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn replace_key(self) -> K { - let entry = unsafe { self.elem.as_mut() }; - mem::replace(&mut entry.0, self.key.unwrap()) - } -} - -impl<'a, K, V, A: Allocator + Clone> RustcVacantEntry<'a, K, V, A> { - /// Gets a reference to the key that would be used when inserting a value - /// through the `RustcVacantEntry`. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// - /// let mut map: HashMap<&str, u32> = HashMap::new(); - /// assert_eq!(map.rustc_entry("poneyland").key(), &"poneyland"); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn key(&self) -> &K { - &self.key - } - - /// Take ownership of the key. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// use hashbrown::hash_map::RustcEntry; - /// - /// let mut map: HashMap<&str, u32> = HashMap::new(); - /// - /// if let RustcEntry::Vacant(v) = map.rustc_entry("poneyland") { - /// v.into_key(); - /// } - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn into_key(self) -> K { - self.key - } - - /// Sets the value of the entry with the RustcVacantEntry's key, - /// and returns a mutable reference to it. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// use hashbrown::hash_map::RustcEntry; - /// - /// let mut map: HashMap<&str, u32> = HashMap::new(); - /// - /// if let RustcEntry::Vacant(o) = map.rustc_entry("poneyland") { - /// o.insert(37); - /// } - /// assert_eq!(map["poneyland"], 37); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn insert(self, value: V) -> &'a mut V { - unsafe { - let bucket = self.table.insert_no_grow(self.hash, (self.key, value)); - &mut bucket.as_mut().1 - } - } - - /// Sets the value of the entry with the RustcVacantEntry's key, - /// and returns a RustcOccupiedEntry. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashMap; - /// use hashbrown::hash_map::RustcEntry; - /// - /// let mut map: HashMap<&str, u32> = HashMap::new(); - /// - /// if let RustcEntry::Vacant(v) = map.rustc_entry("poneyland") { - /// let o = v.insert_entry(37); - /// assert_eq!(o.get(), &37); - /// } - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn insert_entry(self, value: V) -> RustcOccupiedEntry<'a, K, V, A> { - let bucket = unsafe { self.table.insert_no_grow(self.hash, (self.key, value)) }; - RustcOccupiedEntry { - key: None, - elem: bucket, - table: self.table, - } - } -} - -impl IterMut<'_, K, V> { - /// Returns a iterator of references over the remaining items. - #[cfg_attr(feature = "inline-more", inline)] - pub fn rustc_iter(&self) -> Iter<'_, K, V> { - self.iter() - } -} - -impl IntoIter { - /// Returns a iterator of references over the remaining items. - #[cfg_attr(feature = "inline-more", inline)] - pub fn rustc_iter(&self) -> Iter<'_, K, V> { - self.iter() - } -} - -impl Drain<'_, K, V> { - /// Returns a iterator of references over the remaining items. - #[cfg_attr(feature = "inline-more", inline)] - pub fn rustc_iter(&self) -> Iter<'_, K, V> { - self.iter() - } -} diff -Nru temporalio-1.3.0/vendor/hashbrown-0.13.2/src/scopeguard.rs temporalio-1.3.0/vendor/hashbrown-0.13.2/src/scopeguard.rs --- temporalio-1.3.0/vendor/hashbrown-0.13.2/src/scopeguard.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/hashbrown-0.13.2/src/scopeguard.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,72 +0,0 @@ -// Extracted from the scopeguard crate -use core::{ - mem::ManuallyDrop, - ops::{Deref, DerefMut}, - ptr, -}; - -pub struct ScopeGuard -where - F: FnMut(&mut T), -{ - dropfn: F, - value: T, -} - -#[inline] -pub fn guard(value: T, dropfn: F) -> ScopeGuard -where - F: FnMut(&mut T), -{ - ScopeGuard { dropfn, value } -} - -impl ScopeGuard -where - F: FnMut(&mut T), -{ - #[inline] - pub fn into_inner(guard: Self) -> T { - // Cannot move out of Drop-implementing types, so - // ptr::read the value out of a ManuallyDrop - // Don't use mem::forget as that might invalidate value - let guard = ManuallyDrop::new(guard); - unsafe { - let value = ptr::read(&guard.value); - // read the closure so that it is dropped - let _ = ptr::read(&guard.dropfn); - value - } - } -} - -impl Deref for ScopeGuard -where - F: FnMut(&mut T), -{ - type Target = T; - #[inline] - fn deref(&self) -> &T { - &self.value - } -} - -impl DerefMut for ScopeGuard -where - F: FnMut(&mut T), -{ - #[inline] - fn deref_mut(&mut self) -> &mut T { - &mut self.value - } -} - -impl Drop for ScopeGuard -where - F: FnMut(&mut T), -{ - #[inline] - fn drop(&mut self) { - (self.dropfn)(&mut self.value); - } -} diff -Nru temporalio-1.3.0/vendor/hashbrown-0.13.2/src/set.rs temporalio-1.3.0/vendor/hashbrown-0.13.2/src/set.rs --- temporalio-1.3.0/vendor/hashbrown-0.13.2/src/set.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/hashbrown-0.13.2/src/set.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,2889 +0,0 @@ -#[cfg(feature = "raw")] -use crate::raw::RawTable; -use crate::{Equivalent, TryReserveError}; -use alloc::borrow::ToOwned; -use core::fmt; -use core::hash::{BuildHasher, Hash}; -use core::iter::{Chain, FromIterator, FusedIterator}; -use core::mem; -use core::ops::{BitAnd, BitOr, BitXor, Sub}; - -use super::map::{self, ConsumeAllOnDrop, DefaultHashBuilder, DrainFilterInner, HashMap, Keys}; -use crate::raw::{Allocator, Global}; - -// Future Optimization (FIXME!) -// ============================= -// -// Iteration over zero sized values is a noop. There is no need -// for `bucket.val` in the case of HashSet. I suppose we would need HKT -// to get rid of it properly. - -/// A hash set implemented as a `HashMap` where the value is `()`. -/// -/// As with the [`HashMap`] type, a `HashSet` requires that the elements -/// implement the [`Eq`] and [`Hash`] traits. This can frequently be achieved by -/// using `#[derive(PartialEq, Eq, Hash)]`. If you implement these yourself, -/// it is important that the following property holds: -/// -/// ```text -/// k1 == k2 -> hash(k1) == hash(k2) -/// ``` -/// -/// In other words, if two keys are equal, their hashes must be equal. -/// -/// -/// It is a logic error for an item to be modified in such a way that the -/// item's hash, as determined by the [`Hash`] trait, or its equality, as -/// determined by the [`Eq`] trait, changes while it is in the set. This is -/// normally only possible through [`Cell`], [`RefCell`], global state, I/O, or -/// unsafe code. -/// -/// It is also a logic error for the [`Hash`] implementation of a key to panic. -/// This is generally only possible if the trait is implemented manually. If a -/// panic does occur then the contents of the `HashSet` may become corrupted and -/// some items may be dropped from the table. -/// -/// # Examples -/// -/// ``` -/// use hashbrown::HashSet; -/// // Type inference lets us omit an explicit type signature (which -/// // would be `HashSet` in this example). -/// let mut books = HashSet::new(); -/// -/// // Add some books. -/// books.insert("A Dance With Dragons".to_string()); -/// books.insert("To Kill a Mockingbird".to_string()); -/// books.insert("The Odyssey".to_string()); -/// books.insert("The Great Gatsby".to_string()); -/// -/// // Check for a specific one. -/// if !books.contains("The Winds of Winter") { -/// println!("We have {} books, but The Winds of Winter ain't one.", -/// books.len()); -/// } -/// -/// // Remove a book. -/// books.remove("The Odyssey"); -/// -/// // Iterate over everything. -/// for book in &books { -/// println!("{}", book); -/// } -/// ``` -/// -/// The easiest way to use `HashSet` with a custom type is to derive -/// [`Eq`] and [`Hash`]. We must also derive [`PartialEq`]. This will in the -/// future be implied by [`Eq`]. -/// -/// ``` -/// use hashbrown::HashSet; -/// #[derive(Hash, Eq, PartialEq, Debug)] -/// struct Viking { -/// name: String, -/// power: usize, -/// } -/// -/// let mut vikings = HashSet::new(); -/// -/// vikings.insert(Viking { name: "Einar".to_string(), power: 9 }); -/// vikings.insert(Viking { name: "Einar".to_string(), power: 9 }); -/// vikings.insert(Viking { name: "Olaf".to_string(), power: 4 }); -/// vikings.insert(Viking { name: "Harald".to_string(), power: 8 }); -/// -/// // Use derived implementation to print the vikings. -/// for x in &vikings { -/// println!("{:?}", x); -/// } -/// ``` -/// -/// A `HashSet` with fixed list of elements can be initialized from an array: -/// -/// ``` -/// use hashbrown::HashSet; -/// -/// let viking_names: HashSet<&'static str> = -/// [ "Einar", "Olaf", "Harald" ].iter().cloned().collect(); -/// // use the values stored in the set -/// ``` -/// -/// [`Cell`]: https://doc.rust-lang.org/std/cell/struct.Cell.html -/// [`Eq`]: https://doc.rust-lang.org/std/cmp/trait.Eq.html -/// [`Hash`]: https://doc.rust-lang.org/std/hash/trait.Hash.html -/// [`HashMap`]: struct.HashMap.html -/// [`PartialEq`]: https://doc.rust-lang.org/std/cmp/trait.PartialEq.html -/// [`RefCell`]: https://doc.rust-lang.org/std/cell/struct.RefCell.html -pub struct HashSet { - pub(crate) map: HashMap, -} - -impl Clone for HashSet { - fn clone(&self) -> Self { - HashSet { - map: self.map.clone(), - } - } - - fn clone_from(&mut self, source: &Self) { - self.map.clone_from(&source.map); - } -} - -#[cfg(feature = "ahash")] -impl HashSet { - /// Creates an empty `HashSet`. - /// - /// The hash set is initially created with a capacity of 0, so it will not allocate until it - /// is first inserted into. - /// - /// # HashDoS resistance - /// - /// The `hash_builder` normally use a fixed key by default and that does - /// not allow the `HashSet` to be protected against attacks such as [`HashDoS`]. - /// Users who require HashDoS resistance should explicitly use - /// [`ahash::RandomState`] or [`std::collections::hash_map::RandomState`] - /// as the hasher when creating a [`HashSet`], for example with - /// [`with_hasher`](HashSet::with_hasher) method. - /// - /// [`HashDoS`]: https://en.wikipedia.org/wiki/Collision_attack - /// [`std::collections::hash_map::RandomState`]: https://doc.rust-lang.org/std/collections/hash_map/struct.RandomState.html - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashSet; - /// let set: HashSet = HashSet::new(); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn new() -> Self { - Self { - map: HashMap::new(), - } - } - - /// Creates an empty `HashSet` with the specified capacity. - /// - /// The hash set will be able to hold at least `capacity` elements without - /// reallocating. If `capacity` is 0, the hash set will not allocate. - /// - /// # HashDoS resistance - /// - /// The `hash_builder` normally use a fixed key by default and that does - /// not allow the `HashSet` to be protected against attacks such as [`HashDoS`]. - /// Users who require HashDoS resistance should explicitly use - /// [`ahash::RandomState`] or [`std::collections::hash_map::RandomState`] - /// as the hasher when creating a [`HashSet`], for example with - /// [`with_capacity_and_hasher`](HashSet::with_capacity_and_hasher) method. - /// - /// [`HashDoS`]: https://en.wikipedia.org/wiki/Collision_attack - /// [`std::collections::hash_map::RandomState`]: https://doc.rust-lang.org/std/collections/hash_map/struct.RandomState.html - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashSet; - /// let set: HashSet = HashSet::with_capacity(10); - /// assert!(set.capacity() >= 10); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn with_capacity(capacity: usize) -> Self { - Self { - map: HashMap::with_capacity(capacity), - } - } -} - -#[cfg(feature = "ahash")] -impl HashSet { - /// Creates an empty `HashSet`. - /// - /// The hash set is initially created with a capacity of 0, so it will not allocate until it - /// is first inserted into. - /// - /// # HashDoS resistance - /// - /// The `hash_builder` normally use a fixed key by default and that does - /// not allow the `HashSet` to be protected against attacks such as [`HashDoS`]. - /// Users who require HashDoS resistance should explicitly use - /// [`ahash::RandomState`] or [`std::collections::hash_map::RandomState`] - /// as the hasher when creating a [`HashSet`], for example with - /// [`with_hasher_in`](HashSet::with_hasher_in) method. - /// - /// [`HashDoS`]: https://en.wikipedia.org/wiki/Collision_attack - /// [`std::collections::hash_map::RandomState`]: https://doc.rust-lang.org/std/collections/hash_map/struct.RandomState.html - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashSet; - /// let set: HashSet = HashSet::new(); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn new_in(alloc: A) -> Self { - Self { - map: HashMap::new_in(alloc), - } - } - - /// Creates an empty `HashSet` with the specified capacity. - /// - /// The hash set will be able to hold at least `capacity` elements without - /// reallocating. If `capacity` is 0, the hash set will not allocate. - /// - /// # HashDoS resistance - /// - /// The `hash_builder` normally use a fixed key by default and that does - /// not allow the `HashSet` to be protected against attacks such as [`HashDoS`]. - /// Users who require HashDoS resistance should explicitly use - /// [`ahash::RandomState`] or [`std::collections::hash_map::RandomState`] - /// as the hasher when creating a [`HashSet`], for example with - /// [`with_capacity_and_hasher_in`](HashSet::with_capacity_and_hasher_in) method. - /// - /// [`HashDoS`]: https://en.wikipedia.org/wiki/Collision_attack - /// [`std::collections::hash_map::RandomState`]: https://doc.rust-lang.org/std/collections/hash_map/struct.RandomState.html - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashSet; - /// let set: HashSet = HashSet::with_capacity(10); - /// assert!(set.capacity() >= 10); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn with_capacity_in(capacity: usize, alloc: A) -> Self { - Self { - map: HashMap::with_capacity_in(capacity, alloc), - } - } -} - -impl HashSet { - /// Returns the number of elements the set can hold without reallocating. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashSet; - /// let set: HashSet = HashSet::with_capacity(100); - /// assert!(set.capacity() >= 100); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn capacity(&self) -> usize { - self.map.capacity() - } - - /// An iterator visiting all elements in arbitrary order. - /// The iterator element type is `&'a T`. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashSet; - /// let mut set = HashSet::new(); - /// set.insert("a"); - /// set.insert("b"); - /// - /// // Will print in an arbitrary order. - /// for x in set.iter() { - /// println!("{}", x); - /// } - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn iter(&self) -> Iter<'_, T> { - Iter { - iter: self.map.keys(), - } - } - - /// Returns the number of elements in the set. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashSet; - /// - /// let mut v = HashSet::new(); - /// assert_eq!(v.len(), 0); - /// v.insert(1); - /// assert_eq!(v.len(), 1); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn len(&self) -> usize { - self.map.len() - } - - /// Returns `true` if the set contains no elements. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashSet; - /// - /// let mut v = HashSet::new(); - /// assert!(v.is_empty()); - /// v.insert(1); - /// assert!(!v.is_empty()); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn is_empty(&self) -> bool { - self.map.is_empty() - } - - /// Clears the set, returning all elements in an iterator. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashSet; - /// - /// let mut set: HashSet<_> = [1, 2, 3].iter().cloned().collect(); - /// assert!(!set.is_empty()); - /// - /// // print 1, 2, 3 in an arbitrary order - /// for i in set.drain() { - /// println!("{}", i); - /// } - /// - /// assert!(set.is_empty()); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn drain(&mut self) -> Drain<'_, T, A> { - Drain { - iter: self.map.drain(), - } - } - - /// Retains only the elements specified by the predicate. - /// - /// In other words, remove all elements `e` such that `f(&e)` returns `false`. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashSet; - /// - /// let xs = [1,2,3,4,5,6]; - /// let mut set: HashSet = xs.iter().cloned().collect(); - /// set.retain(|&k| k % 2 == 0); - /// assert_eq!(set.len(), 3); - /// ``` - pub fn retain(&mut self, mut f: F) - where - F: FnMut(&T) -> bool, - { - self.map.retain(|k, _| f(k)); - } - - /// Drains elements which are true under the given predicate, - /// and returns an iterator over the removed items. - /// - /// In other words, move all elements `e` such that `f(&e)` returns `true` out - /// into another iterator. - /// - /// When the returned DrainedFilter is dropped, any remaining elements that satisfy - /// the predicate are dropped from the set. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashSet; - /// - /// let mut set: HashSet = (0..8).collect(); - /// let drained: HashSet = set.drain_filter(|v| v % 2 == 0).collect(); - /// - /// let mut evens = drained.into_iter().collect::>(); - /// let mut odds = set.into_iter().collect::>(); - /// evens.sort(); - /// odds.sort(); - /// - /// assert_eq!(evens, vec![0, 2, 4, 6]); - /// assert_eq!(odds, vec![1, 3, 5, 7]); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn drain_filter(&mut self, f: F) -> DrainFilter<'_, T, F, A> - where - F: FnMut(&T) -> bool, - { - DrainFilter { - f, - inner: DrainFilterInner { - iter: unsafe { self.map.table.iter() }, - table: &mut self.map.table, - }, - } - } - - /// Clears the set, removing all values. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashSet; - /// - /// let mut v = HashSet::new(); - /// v.insert(1); - /// v.clear(); - /// assert!(v.is_empty()); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn clear(&mut self) { - self.map.clear(); - } -} - -impl HashSet { - /// Creates a new empty hash set which will use the given hasher to hash - /// keys. - /// - /// The hash set is initially created with a capacity of 0, so it will not - /// allocate until it is first inserted into. - /// - /// # HashDoS resistance - /// - /// The `hash_builder` normally use a fixed key by default and that does - /// not allow the `HashSet` to be protected against attacks such as [`HashDoS`]. - /// Users who require HashDoS resistance should explicitly use - /// [`ahash::RandomState`] or [`std::collections::hash_map::RandomState`] - /// as the hasher when creating a [`HashSet`]. - /// - /// The `hash_builder` passed should implement the [`BuildHasher`] trait for - /// the HashSet to be useful, see its documentation for details. - /// - /// [`HashDoS`]: https://en.wikipedia.org/wiki/Collision_attack - /// [`std::collections::hash_map::RandomState`]: https://doc.rust-lang.org/std/collections/hash_map/struct.RandomState.html - /// [`BuildHasher`]: https://doc.rust-lang.org/std/hash/trait.BuildHasher.html - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashSet; - /// use hashbrown::hash_map::DefaultHashBuilder; - /// - /// let s = DefaultHashBuilder::default(); - /// let mut set = HashSet::with_hasher(s); - /// set.insert(2); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub const fn with_hasher(hasher: S) -> Self { - Self { - map: HashMap::with_hasher(hasher), - } - } - - /// Creates an empty `HashSet` with the specified capacity, using - /// `hasher` to hash the keys. - /// - /// The hash set will be able to hold at least `capacity` elements without - /// reallocating. If `capacity` is 0, the hash set will not allocate. - /// - /// # HashDoS resistance - /// - /// The `hash_builder` normally use a fixed key by default and that does - /// not allow the `HashSet` to be protected against attacks such as [`HashDoS`]. - /// Users who require HashDoS resistance should explicitly use - /// [`ahash::RandomState`] or [`std::collections::hash_map::RandomState`] - /// as the hasher when creating a [`HashSet`]. - /// - /// The `hash_builder` passed should implement the [`BuildHasher`] trait for - /// the HashSet to be useful, see its documentation for details. - /// - /// [`HashDoS`]: https://en.wikipedia.org/wiki/Collision_attack - /// [`std::collections::hash_map::RandomState`]: https://doc.rust-lang.org/std/collections/hash_map/struct.RandomState.html - /// [`BuildHasher`]: https://doc.rust-lang.org/std/hash/trait.BuildHasher.html - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashSet; - /// use hashbrown::hash_map::DefaultHashBuilder; - /// - /// let s = DefaultHashBuilder::default(); - /// let mut set = HashSet::with_capacity_and_hasher(10, s); - /// set.insert(1); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn with_capacity_and_hasher(capacity: usize, hasher: S) -> Self { - Self { - map: HashMap::with_capacity_and_hasher(capacity, hasher), - } - } -} - -impl HashSet -where - A: Allocator + Clone, -{ - /// Returns a reference to the underlying allocator. - #[inline] - pub fn allocator(&self) -> &A { - self.map.allocator() - } - - /// Creates a new empty hash set which will use the given hasher to hash - /// keys. - /// - /// The hash set is initially created with a capacity of 0, so it will not - /// allocate until it is first inserted into. - /// - /// # HashDoS resistance - /// - /// The `hash_builder` normally use a fixed key by default and that does - /// not allow the `HashSet` to be protected against attacks such as [`HashDoS`]. - /// Users who require HashDoS resistance should explicitly use - /// [`ahash::RandomState`] or [`std::collections::hash_map::RandomState`] - /// as the hasher when creating a [`HashSet`]. - /// - /// The `hash_builder` passed should implement the [`BuildHasher`] trait for - /// the HashSet to be useful, see its documentation for details. - /// - /// [`HashDoS`]: https://en.wikipedia.org/wiki/Collision_attack - /// [`std::collections::hash_map::RandomState`]: https://doc.rust-lang.org/std/collections/hash_map/struct.RandomState.html - /// [`BuildHasher`]: https://doc.rust-lang.org/std/hash/trait.BuildHasher.html - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashSet; - /// use hashbrown::hash_map::DefaultHashBuilder; - /// - /// let s = DefaultHashBuilder::default(); - /// let mut set = HashSet::with_hasher(s); - /// set.insert(2); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub const fn with_hasher_in(hasher: S, alloc: A) -> Self { - Self { - map: HashMap::with_hasher_in(hasher, alloc), - } - } - - /// Creates an empty `HashSet` with the specified capacity, using - /// `hasher` to hash the keys. - /// - /// The hash set will be able to hold at least `capacity` elements without - /// reallocating. If `capacity` is 0, the hash set will not allocate. - /// - /// # HashDoS resistance - /// - /// The `hash_builder` normally use a fixed key by default and that does - /// not allow the `HashSet` to be protected against attacks such as [`HashDoS`]. - /// Users who require HashDoS resistance should explicitly use - /// [`ahash::RandomState`] or [`std::collections::hash_map::RandomState`] - /// as the hasher when creating a [`HashSet`]. - /// - /// The `hash_builder` passed should implement the [`BuildHasher`] trait for - /// the HashSet to be useful, see its documentation for details. - /// - /// [`HashDoS`]: https://en.wikipedia.org/wiki/Collision_attack - /// [`std::collections::hash_map::RandomState`]: https://doc.rust-lang.org/std/collections/hash_map/struct.RandomState.html - /// [`BuildHasher`]: https://doc.rust-lang.org/std/hash/trait.BuildHasher.html - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashSet; - /// use hashbrown::hash_map::DefaultHashBuilder; - /// - /// let s = DefaultHashBuilder::default(); - /// let mut set = HashSet::with_capacity_and_hasher(10, s); - /// set.insert(1); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn with_capacity_and_hasher_in(capacity: usize, hasher: S, alloc: A) -> Self { - Self { - map: HashMap::with_capacity_and_hasher_in(capacity, hasher, alloc), - } - } - - /// Returns a reference to the set's [`BuildHasher`]. - /// - /// [`BuildHasher`]: https://doc.rust-lang.org/std/hash/trait.BuildHasher.html - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashSet; - /// use hashbrown::hash_map::DefaultHashBuilder; - /// - /// let hasher = DefaultHashBuilder::default(); - /// let set: HashSet = HashSet::with_hasher(hasher); - /// let hasher: &DefaultHashBuilder = set.hasher(); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn hasher(&self) -> &S { - self.map.hasher() - } -} - -impl HashSet -where - T: Eq + Hash, - S: BuildHasher, - A: Allocator + Clone, -{ - /// Reserves capacity for at least `additional` more elements to be inserted - /// in the `HashSet`. The collection may reserve more space to avoid - /// frequent reallocations. - /// - /// # Panics - /// - /// Panics if the new capacity exceeds [`isize::MAX`] bytes and [`abort`] the program - /// in case of allocation error. Use [`try_reserve`](HashSet::try_reserve) instead - /// if you want to handle memory allocation failure. - /// - /// [`isize::MAX`]: https://doc.rust-lang.org/std/primitive.isize.html - /// [`abort`]: https://doc.rust-lang.org/alloc/alloc/fn.handle_alloc_error.html - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashSet; - /// let mut set: HashSet = HashSet::new(); - /// set.reserve(10); - /// assert!(set.capacity() >= 10); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn reserve(&mut self, additional: usize) { - self.map.reserve(additional); - } - - /// Tries to reserve capacity for at least `additional` more elements to be inserted - /// in the given `HashSet`. The collection may reserve more space to avoid - /// frequent reallocations. - /// - /// # Errors - /// - /// If the capacity overflows, or the allocator reports a failure, then an error - /// is returned. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashSet; - /// let mut set: HashSet = HashSet::new(); - /// set.try_reserve(10).expect("why is the test harness OOMing on 10 bytes?"); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn try_reserve(&mut self, additional: usize) -> Result<(), TryReserveError> { - self.map.try_reserve(additional) - } - - /// Shrinks the capacity of the set as much as possible. It will drop - /// down as much as possible while maintaining the internal rules - /// and possibly leaving some space in accordance with the resize policy. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashSet; - /// - /// let mut set = HashSet::with_capacity(100); - /// set.insert(1); - /// set.insert(2); - /// assert!(set.capacity() >= 100); - /// set.shrink_to_fit(); - /// assert!(set.capacity() >= 2); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn shrink_to_fit(&mut self) { - self.map.shrink_to_fit(); - } - - /// Shrinks the capacity of the set with a lower limit. It will drop - /// down no lower than the supplied limit while maintaining the internal rules - /// and possibly leaving some space in accordance with the resize policy. - /// - /// Panics if the current capacity is smaller than the supplied - /// minimum capacity. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashSet; - /// - /// let mut set = HashSet::with_capacity(100); - /// set.insert(1); - /// set.insert(2); - /// assert!(set.capacity() >= 100); - /// set.shrink_to(10); - /// assert!(set.capacity() >= 10); - /// set.shrink_to(0); - /// assert!(set.capacity() >= 2); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn shrink_to(&mut self, min_capacity: usize) { - self.map.shrink_to(min_capacity); - } - - /// Visits the values representing the difference, - /// i.e., the values that are in `self` but not in `other`. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashSet; - /// let a: HashSet<_> = [1, 2, 3].iter().cloned().collect(); - /// let b: HashSet<_> = [4, 2, 3, 4].iter().cloned().collect(); - /// - /// // Can be seen as `a - b`. - /// for x in a.difference(&b) { - /// println!("{}", x); // Print 1 - /// } - /// - /// let diff: HashSet<_> = a.difference(&b).collect(); - /// assert_eq!(diff, [1].iter().collect()); - /// - /// // Note that difference is not symmetric, - /// // and `b - a` means something else: - /// let diff: HashSet<_> = b.difference(&a).collect(); - /// assert_eq!(diff, [4].iter().collect()); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn difference<'a>(&'a self, other: &'a Self) -> Difference<'a, T, S, A> { - Difference { - iter: self.iter(), - other, - } - } - - /// Visits the values representing the symmetric difference, - /// i.e., the values that are in `self` or in `other` but not in both. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashSet; - /// let a: HashSet<_> = [1, 2, 3].iter().cloned().collect(); - /// let b: HashSet<_> = [4, 2, 3, 4].iter().cloned().collect(); - /// - /// // Print 1, 4 in arbitrary order. - /// for x in a.symmetric_difference(&b) { - /// println!("{}", x); - /// } - /// - /// let diff1: HashSet<_> = a.symmetric_difference(&b).collect(); - /// let diff2: HashSet<_> = b.symmetric_difference(&a).collect(); - /// - /// assert_eq!(diff1, diff2); - /// assert_eq!(diff1, [1, 4].iter().collect()); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn symmetric_difference<'a>(&'a self, other: &'a Self) -> SymmetricDifference<'a, T, S, A> { - SymmetricDifference { - iter: self.difference(other).chain(other.difference(self)), - } - } - - /// Visits the values representing the intersection, - /// i.e., the values that are both in `self` and `other`. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashSet; - /// let a: HashSet<_> = [1, 2, 3].iter().cloned().collect(); - /// let b: HashSet<_> = [4, 2, 3, 4].iter().cloned().collect(); - /// - /// // Print 2, 3 in arbitrary order. - /// for x in a.intersection(&b) { - /// println!("{}", x); - /// } - /// - /// let intersection: HashSet<_> = a.intersection(&b).collect(); - /// assert_eq!(intersection, [2, 3].iter().collect()); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn intersection<'a>(&'a self, other: &'a Self) -> Intersection<'a, T, S, A> { - let (smaller, larger) = if self.len() <= other.len() { - (self, other) - } else { - (other, self) - }; - Intersection { - iter: smaller.iter(), - other: larger, - } - } - - /// Visits the values representing the union, - /// i.e., all the values in `self` or `other`, without duplicates. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashSet; - /// let a: HashSet<_> = [1, 2, 3].iter().cloned().collect(); - /// let b: HashSet<_> = [4, 2, 3, 4].iter().cloned().collect(); - /// - /// // Print 1, 2, 3, 4 in arbitrary order. - /// for x in a.union(&b) { - /// println!("{}", x); - /// } - /// - /// let union: HashSet<_> = a.union(&b).collect(); - /// assert_eq!(union, [1, 2, 3, 4].iter().collect()); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn union<'a>(&'a self, other: &'a Self) -> Union<'a, T, S, A> { - // We'll iterate one set in full, and only the remaining difference from the other. - // Use the smaller set for the difference in order to reduce hash lookups. - let (smaller, larger) = if self.len() <= other.len() { - (self, other) - } else { - (other, self) - }; - Union { - iter: larger.iter().chain(smaller.difference(larger)), - } - } - - /// Returns `true` if the set contains a value. - /// - /// The value may be any borrowed form of the set's value type, but - /// [`Hash`] and [`Eq`] on the borrowed form *must* match those for - /// the value type. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashSet; - /// - /// let set: HashSet<_> = [1, 2, 3].iter().cloned().collect(); - /// assert_eq!(set.contains(&1), true); - /// assert_eq!(set.contains(&4), false); - /// ``` - /// - /// [`Eq`]: https://doc.rust-lang.org/std/cmp/trait.Eq.html - /// [`Hash`]: https://doc.rust-lang.org/std/hash/trait.Hash.html - #[cfg_attr(feature = "inline-more", inline)] - pub fn contains(&self, value: &Q) -> bool - where - Q: Hash + Equivalent, - { - self.map.contains_key(value) - } - - /// Returns a reference to the value in the set, if any, that is equal to the given value. - /// - /// The value may be any borrowed form of the set's value type, but - /// [`Hash`] and [`Eq`] on the borrowed form *must* match those for - /// the value type. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashSet; - /// - /// let set: HashSet<_> = [1, 2, 3].iter().cloned().collect(); - /// assert_eq!(set.get(&2), Some(&2)); - /// assert_eq!(set.get(&4), None); - /// ``` - /// - /// [`Eq`]: https://doc.rust-lang.org/std/cmp/trait.Eq.html - /// [`Hash`]: https://doc.rust-lang.org/std/hash/trait.Hash.html - #[cfg_attr(feature = "inline-more", inline)] - pub fn get(&self, value: &Q) -> Option<&T> - where - Q: Hash + Equivalent, - { - // Avoid `Option::map` because it bloats LLVM IR. - match self.map.get_key_value(value) { - Some((k, _)) => Some(k), - None => None, - } - } - - /// Inserts the given `value` into the set if it is not present, then - /// returns a reference to the value in the set. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashSet; - /// - /// let mut set: HashSet<_> = [1, 2, 3].iter().cloned().collect(); - /// assert_eq!(set.len(), 3); - /// assert_eq!(set.get_or_insert(2), &2); - /// assert_eq!(set.get_or_insert(100), &100); - /// assert_eq!(set.len(), 4); // 100 was inserted - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn get_or_insert(&mut self, value: T) -> &T { - // Although the raw entry gives us `&mut T`, we only return `&T` to be consistent with - // `get`. Key mutation is "raw" because you're not supposed to affect `Eq` or `Hash`. - self.map - .raw_entry_mut() - .from_key(&value) - .or_insert(value, ()) - .0 - } - - /// Inserts an owned copy of the given `value` into the set if it is not - /// present, then returns a reference to the value in the set. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashSet; - /// - /// let mut set: HashSet = ["cat", "dog", "horse"] - /// .iter().map(|&pet| pet.to_owned()).collect(); - /// - /// assert_eq!(set.len(), 3); - /// for &pet in &["cat", "dog", "fish"] { - /// let value = set.get_or_insert_owned(pet); - /// assert_eq!(value, pet); - /// } - /// assert_eq!(set.len(), 4); // a new "fish" was inserted - /// ``` - #[inline] - pub fn get_or_insert_owned(&mut self, value: &Q) -> &T - where - Q: Hash + Equivalent + ToOwned, - { - // Although the raw entry gives us `&mut T`, we only return `&T` to be consistent with - // `get`. Key mutation is "raw" because you're not supposed to affect `Eq` or `Hash`. - self.map - .raw_entry_mut() - .from_key(value) - .or_insert_with(|| (value.to_owned(), ())) - .0 - } - - /// Inserts a value computed from `f` into the set if the given `value` is - /// not present, then returns a reference to the value in the set. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashSet; - /// - /// let mut set: HashSet = ["cat", "dog", "horse"] - /// .iter().map(|&pet| pet.to_owned()).collect(); - /// - /// assert_eq!(set.len(), 3); - /// for &pet in &["cat", "dog", "fish"] { - /// let value = set.get_or_insert_with(pet, str::to_owned); - /// assert_eq!(value, pet); - /// } - /// assert_eq!(set.len(), 4); // a new "fish" was inserted - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn get_or_insert_with(&mut self, value: &Q, f: F) -> &T - where - Q: Hash + Equivalent, - F: FnOnce(&Q) -> T, - { - // Although the raw entry gives us `&mut T`, we only return `&T` to be consistent with - // `get`. Key mutation is "raw" because you're not supposed to affect `Eq` or `Hash`. - self.map - .raw_entry_mut() - .from_key(value) - .or_insert_with(|| (f(value), ())) - .0 - } - - /// Gets the given value's corresponding entry in the set for in-place manipulation. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashSet; - /// use hashbrown::hash_set::Entry::*; - /// - /// let mut singles = HashSet::new(); - /// let mut dupes = HashSet::new(); - /// - /// for ch in "a short treatise on fungi".chars() { - /// if let Vacant(dupe_entry) = dupes.entry(ch) { - /// // We haven't already seen a duplicate, so - /// // check if we've at least seen it once. - /// match singles.entry(ch) { - /// Vacant(single_entry) => { - /// // We found a new character for the first time. - /// single_entry.insert() - /// } - /// Occupied(single_entry) => { - /// // We've already seen this once, "move" it to dupes. - /// single_entry.remove(); - /// dupe_entry.insert(); - /// } - /// } - /// } - /// } - /// - /// assert!(!singles.contains(&'t') && dupes.contains(&'t')); - /// assert!(singles.contains(&'u') && !dupes.contains(&'u')); - /// assert!(!singles.contains(&'v') && !dupes.contains(&'v')); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn entry(&mut self, value: T) -> Entry<'_, T, S, A> { - match self.map.entry(value) { - map::Entry::Occupied(entry) => Entry::Occupied(OccupiedEntry { inner: entry }), - map::Entry::Vacant(entry) => Entry::Vacant(VacantEntry { inner: entry }), - } - } - - /// Returns `true` if `self` has no elements in common with `other`. - /// This is equivalent to checking for an empty intersection. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashSet; - /// - /// let a: HashSet<_> = [1, 2, 3].iter().cloned().collect(); - /// let mut b = HashSet::new(); - /// - /// assert_eq!(a.is_disjoint(&b), true); - /// b.insert(4); - /// assert_eq!(a.is_disjoint(&b), true); - /// b.insert(1); - /// assert_eq!(a.is_disjoint(&b), false); - /// ``` - pub fn is_disjoint(&self, other: &Self) -> bool { - self.iter().all(|v| !other.contains(v)) - } - - /// Returns `true` if the set is a subset of another, - /// i.e., `other` contains at least all the values in `self`. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashSet; - /// - /// let sup: HashSet<_> = [1, 2, 3].iter().cloned().collect(); - /// let mut set = HashSet::new(); - /// - /// assert_eq!(set.is_subset(&sup), true); - /// set.insert(2); - /// assert_eq!(set.is_subset(&sup), true); - /// set.insert(4); - /// assert_eq!(set.is_subset(&sup), false); - /// ``` - pub fn is_subset(&self, other: &Self) -> bool { - self.len() <= other.len() && self.iter().all(|v| other.contains(v)) - } - - /// Returns `true` if the set is a superset of another, - /// i.e., `self` contains at least all the values in `other`. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashSet; - /// - /// let sub: HashSet<_> = [1, 2].iter().cloned().collect(); - /// let mut set = HashSet::new(); - /// - /// assert_eq!(set.is_superset(&sub), false); - /// - /// set.insert(0); - /// set.insert(1); - /// assert_eq!(set.is_superset(&sub), false); - /// - /// set.insert(2); - /// assert_eq!(set.is_superset(&sub), true); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn is_superset(&self, other: &Self) -> bool { - other.is_subset(self) - } - - /// Adds a value to the set. - /// - /// If the set did not have this value present, `true` is returned. - /// - /// If the set did have this value present, `false` is returned. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashSet; - /// - /// let mut set = HashSet::new(); - /// - /// assert_eq!(set.insert(2), true); - /// assert_eq!(set.insert(2), false); - /// assert_eq!(set.len(), 1); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn insert(&mut self, value: T) -> bool { - self.map.insert(value, ()).is_none() - } - - /// Insert a value the set without checking if the value already exists in the set. - /// - /// Returns a reference to the value just inserted. - /// - /// This operation is safe if a value does not exist in the set. - /// - /// However, if a value exists in the set already, the behavior is unspecified: - /// this operation may panic, loop forever, or any following operation with the set - /// may panic, loop forever or return arbitrary result. - /// - /// That said, this operation (and following operations) are guaranteed to - /// not violate memory safety. - /// - /// This operation is faster than regular insert, because it does not perform - /// lookup before insertion. - /// - /// This operation is useful during initial population of the set. - /// For example, when constructing a set from another set, we know - /// that values are unique. - #[cfg_attr(feature = "inline-more", inline)] - pub fn insert_unique_unchecked(&mut self, value: T) -> &T { - self.map.insert_unique_unchecked(value, ()).0 - } - - /// Adds a value to the set, replacing the existing value, if any, that is equal to the given - /// one. Returns the replaced value. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashSet; - /// - /// let mut set = HashSet::new(); - /// set.insert(Vec::::new()); - /// - /// assert_eq!(set.get(&[][..]).unwrap().capacity(), 0); - /// set.replace(Vec::with_capacity(10)); - /// assert_eq!(set.get(&[][..]).unwrap().capacity(), 10); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn replace(&mut self, value: T) -> Option { - match self.map.entry(value) { - map::Entry::Occupied(occupied) => Some(occupied.replace_key()), - map::Entry::Vacant(vacant) => { - vacant.insert(()); - None - } - } - } - - /// Removes a value from the set. Returns whether the value was - /// present in the set. - /// - /// The value may be any borrowed form of the set's value type, but - /// [`Hash`] and [`Eq`] on the borrowed form *must* match those for - /// the value type. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashSet; - /// - /// let mut set = HashSet::new(); - /// - /// set.insert(2); - /// assert_eq!(set.remove(&2), true); - /// assert_eq!(set.remove(&2), false); - /// ``` - /// - /// [`Eq`]: https://doc.rust-lang.org/std/cmp/trait.Eq.html - /// [`Hash`]: https://doc.rust-lang.org/std/hash/trait.Hash.html - #[cfg_attr(feature = "inline-more", inline)] - pub fn remove(&mut self, value: &Q) -> bool - where - Q: Hash + Equivalent, - { - self.map.remove(value).is_some() - } - - /// Removes and returns the value in the set, if any, that is equal to the given one. - /// - /// The value may be any borrowed form of the set's value type, but - /// [`Hash`] and [`Eq`] on the borrowed form *must* match those for - /// the value type. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashSet; - /// - /// let mut set: HashSet<_> = [1, 2, 3].iter().cloned().collect(); - /// assert_eq!(set.take(&2), Some(2)); - /// assert_eq!(set.take(&2), None); - /// ``` - /// - /// [`Eq`]: https://doc.rust-lang.org/std/cmp/trait.Eq.html - /// [`Hash`]: https://doc.rust-lang.org/std/hash/trait.Hash.html - #[cfg_attr(feature = "inline-more", inline)] - pub fn take(&mut self, value: &Q) -> Option - where - Q: Hash + Equivalent, - { - // Avoid `Option::map` because it bloats LLVM IR. - match self.map.remove_entry(value) { - Some((k, _)) => Some(k), - None => None, - } - } - - /// Returns a mutable reference to the [`RawTable`] used underneath [`HashSet`]. - /// This function is only available if the `raw` feature of the crate is enabled. - /// - /// # Note - /// - /// Calling this function is safe, but using the raw hash table API may require - /// unsafe functions or blocks. - /// - /// `RawTable` API gives the lowest level of control under the set that can be useful - /// for extending the HashSet's API, but may lead to *[undefined behavior]*. - /// - /// [`HashSet`]: struct.HashSet.html - /// [`RawTable`]: crate::raw::RawTable - /// [undefined behavior]: https://doc.rust-lang.org/reference/behavior-considered-undefined.html - #[cfg(feature = "raw")] - #[cfg_attr(feature = "inline-more", inline)] - pub fn raw_table(&mut self) -> &mut RawTable<(T, ()), A> { - self.map.raw_table() - } -} - -impl PartialEq for HashSet -where - T: Eq + Hash, - S: BuildHasher, - A: Allocator + Clone, -{ - fn eq(&self, other: &Self) -> bool { - if self.len() != other.len() { - return false; - } - - self.iter().all(|key| other.contains(key)) - } -} - -impl Eq for HashSet -where - T: Eq + Hash, - S: BuildHasher, - A: Allocator + Clone, -{ -} - -impl fmt::Debug for HashSet -where - T: fmt::Debug, - A: Allocator + Clone, -{ - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_set().entries(self.iter()).finish() - } -} - -impl From> for HashSet -where - A: Allocator + Clone, -{ - fn from(map: HashMap) -> Self { - Self { map } - } -} - -impl FromIterator for HashSet -where - T: Eq + Hash, - S: BuildHasher + Default, - A: Default + Allocator + Clone, -{ - #[cfg_attr(feature = "inline-more", inline)] - fn from_iter>(iter: I) -> Self { - let mut set = Self::with_hasher_in(Default::default(), Default::default()); - set.extend(iter); - set - } -} - -// The default hasher is used to match the std implementation signature -#[cfg(feature = "ahash")] -impl From<[T; N]> for HashSet -where - T: Eq + Hash, - A: Default + Allocator + Clone, -{ - /// # Examples - /// - /// ``` - /// use hashbrown::HashSet; - /// - /// let set1 = HashSet::from([1, 2, 3, 4]); - /// let set2: HashSet<_> = [1, 2, 3, 4].into(); - /// assert_eq!(set1, set2); - /// ``` - fn from(arr: [T; N]) -> Self { - arr.into_iter().collect() - } -} - -impl Extend for HashSet -where - T: Eq + Hash, - S: BuildHasher, - A: Allocator + Clone, -{ - #[cfg_attr(feature = "inline-more", inline)] - fn extend>(&mut self, iter: I) { - self.map.extend(iter.into_iter().map(|k| (k, ()))); - } - - #[inline] - #[cfg(feature = "nightly")] - fn extend_one(&mut self, k: T) { - self.map.insert(k, ()); - } - - #[inline] - #[cfg(feature = "nightly")] - fn extend_reserve(&mut self, additional: usize) { - Extend::<(T, ())>::extend_reserve(&mut self.map, additional); - } -} - -impl<'a, T, S, A> Extend<&'a T> for HashSet -where - T: 'a + Eq + Hash + Copy, - S: BuildHasher, - A: Allocator + Clone, -{ - #[cfg_attr(feature = "inline-more", inline)] - fn extend>(&mut self, iter: I) { - self.extend(iter.into_iter().copied()); - } - - #[inline] - #[cfg(feature = "nightly")] - fn extend_one(&mut self, k: &'a T) { - self.map.insert(*k, ()); - } - - #[inline] - #[cfg(feature = "nightly")] - fn extend_reserve(&mut self, additional: usize) { - Extend::<(T, ())>::extend_reserve(&mut self.map, additional); - } -} - -impl Default for HashSet -where - S: Default, - A: Default + Allocator + Clone, -{ - /// Creates an empty `HashSet` with the `Default` value for the hasher. - #[cfg_attr(feature = "inline-more", inline)] - fn default() -> Self { - Self { - map: HashMap::default(), - } - } -} - -impl BitOr<&HashSet> for &HashSet -where - T: Eq + Hash + Clone, - S: BuildHasher + Default, - A: Allocator + Clone, -{ - type Output = HashSet; - - /// Returns the union of `self` and `rhs` as a new `HashSet`. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashSet; - /// - /// let a: HashSet<_> = vec![1, 2, 3].into_iter().collect(); - /// let b: HashSet<_> = vec![3, 4, 5].into_iter().collect(); - /// - /// let set = &a | &b; - /// - /// let mut i = 0; - /// let expected = [1, 2, 3, 4, 5]; - /// for x in &set { - /// assert!(expected.contains(x)); - /// i += 1; - /// } - /// assert_eq!(i, expected.len()); - /// ``` - fn bitor(self, rhs: &HashSet) -> HashSet { - self.union(rhs).cloned().collect() - } -} - -impl BitAnd<&HashSet> for &HashSet -where - T: Eq + Hash + Clone, - S: BuildHasher + Default, - A: Allocator + Clone, -{ - type Output = HashSet; - - /// Returns the intersection of `self` and `rhs` as a new `HashSet`. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashSet; - /// - /// let a: HashSet<_> = vec![1, 2, 3].into_iter().collect(); - /// let b: HashSet<_> = vec![2, 3, 4].into_iter().collect(); - /// - /// let set = &a & &b; - /// - /// let mut i = 0; - /// let expected = [2, 3]; - /// for x in &set { - /// assert!(expected.contains(x)); - /// i += 1; - /// } - /// assert_eq!(i, expected.len()); - /// ``` - fn bitand(self, rhs: &HashSet) -> HashSet { - self.intersection(rhs).cloned().collect() - } -} - -impl BitXor<&HashSet> for &HashSet -where - T: Eq + Hash + Clone, - S: BuildHasher + Default, -{ - type Output = HashSet; - - /// Returns the symmetric difference of `self` and `rhs` as a new `HashSet`. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashSet; - /// - /// let a: HashSet<_> = vec![1, 2, 3].into_iter().collect(); - /// let b: HashSet<_> = vec![3, 4, 5].into_iter().collect(); - /// - /// let set = &a ^ &b; - /// - /// let mut i = 0; - /// let expected = [1, 2, 4, 5]; - /// for x in &set { - /// assert!(expected.contains(x)); - /// i += 1; - /// } - /// assert_eq!(i, expected.len()); - /// ``` - fn bitxor(self, rhs: &HashSet) -> HashSet { - self.symmetric_difference(rhs).cloned().collect() - } -} - -impl Sub<&HashSet> for &HashSet -where - T: Eq + Hash + Clone, - S: BuildHasher + Default, -{ - type Output = HashSet; - - /// Returns the difference of `self` and `rhs` as a new `HashSet`. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashSet; - /// - /// let a: HashSet<_> = vec![1, 2, 3].into_iter().collect(); - /// let b: HashSet<_> = vec![3, 4, 5].into_iter().collect(); - /// - /// let set = &a - &b; - /// - /// let mut i = 0; - /// let expected = [1, 2]; - /// for x in &set { - /// assert!(expected.contains(x)); - /// i += 1; - /// } - /// assert_eq!(i, expected.len()); - /// ``` - fn sub(self, rhs: &HashSet) -> HashSet { - self.difference(rhs).cloned().collect() - } -} - -/// An iterator over the items of a `HashSet`. -/// -/// This `struct` is created by the [`iter`] method on [`HashSet`]. -/// See its documentation for more. -/// -/// [`HashSet`]: struct.HashSet.html -/// [`iter`]: struct.HashSet.html#method.iter -pub struct Iter<'a, K> { - iter: Keys<'a, K, ()>, -} - -/// An owning iterator over the items of a `HashSet`. -/// -/// This `struct` is created by the [`into_iter`] method on [`HashSet`] -/// (provided by the `IntoIterator` trait). See its documentation for more. -/// -/// [`HashSet`]: struct.HashSet.html -/// [`into_iter`]: struct.HashSet.html#method.into_iter -pub struct IntoIter { - iter: map::IntoIter, -} - -/// A draining iterator over the items of a `HashSet`. -/// -/// This `struct` is created by the [`drain`] method on [`HashSet`]. -/// See its documentation for more. -/// -/// [`HashSet`]: struct.HashSet.html -/// [`drain`]: struct.HashSet.html#method.drain -pub struct Drain<'a, K, A: Allocator + Clone = Global> { - iter: map::Drain<'a, K, (), A>, -} - -/// A draining iterator over entries of a `HashSet` which don't satisfy the predicate `f`. -/// -/// This `struct` is created by the [`drain_filter`] method on [`HashSet`]. See its -/// documentation for more. -/// -/// [`drain_filter`]: struct.HashSet.html#method.drain_filter -/// [`HashSet`]: struct.HashSet.html -pub struct DrainFilter<'a, K, F, A: Allocator + Clone = Global> -where - F: FnMut(&K) -> bool, -{ - f: F, - inner: DrainFilterInner<'a, K, (), A>, -} - -/// A lazy iterator producing elements in the intersection of `HashSet`s. -/// -/// This `struct` is created by the [`intersection`] method on [`HashSet`]. -/// See its documentation for more. -/// -/// [`HashSet`]: struct.HashSet.html -/// [`intersection`]: struct.HashSet.html#method.intersection -pub struct Intersection<'a, T, S, A: Allocator + Clone = Global> { - // iterator of the first set - iter: Iter<'a, T>, - // the second set - other: &'a HashSet, -} - -/// A lazy iterator producing elements in the difference of `HashSet`s. -/// -/// This `struct` is created by the [`difference`] method on [`HashSet`]. -/// See its documentation for more. -/// -/// [`HashSet`]: struct.HashSet.html -/// [`difference`]: struct.HashSet.html#method.difference -pub struct Difference<'a, T, S, A: Allocator + Clone = Global> { - // iterator of the first set - iter: Iter<'a, T>, - // the second set - other: &'a HashSet, -} - -/// A lazy iterator producing elements in the symmetric difference of `HashSet`s. -/// -/// This `struct` is created by the [`symmetric_difference`] method on -/// [`HashSet`]. See its documentation for more. -/// -/// [`HashSet`]: struct.HashSet.html -/// [`symmetric_difference`]: struct.HashSet.html#method.symmetric_difference -pub struct SymmetricDifference<'a, T, S, A: Allocator + Clone = Global> { - iter: Chain, Difference<'a, T, S, A>>, -} - -/// A lazy iterator producing elements in the union of `HashSet`s. -/// -/// This `struct` is created by the [`union`] method on [`HashSet`]. -/// See its documentation for more. -/// -/// [`HashSet`]: struct.HashSet.html -/// [`union`]: struct.HashSet.html#method.union -pub struct Union<'a, T, S, A: Allocator + Clone = Global> { - iter: Chain, Difference<'a, T, S, A>>, -} - -impl<'a, T, S, A: Allocator + Clone> IntoIterator for &'a HashSet { - type Item = &'a T; - type IntoIter = Iter<'a, T>; - - #[cfg_attr(feature = "inline-more", inline)] - fn into_iter(self) -> Iter<'a, T> { - self.iter() - } -} - -impl IntoIterator for HashSet { - type Item = T; - type IntoIter = IntoIter; - - /// Creates a consuming iterator, that is, one that moves each value out - /// of the set in arbitrary order. The set cannot be used after calling - /// this. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashSet; - /// let mut set = HashSet::new(); - /// set.insert("a".to_string()); - /// set.insert("b".to_string()); - /// - /// // Not possible to collect to a Vec with a regular `.iter()`. - /// let v: Vec = set.into_iter().collect(); - /// - /// // Will print in an arbitrary order. - /// for x in &v { - /// println!("{}", x); - /// } - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - fn into_iter(self) -> IntoIter { - IntoIter { - iter: self.map.into_iter(), - } - } -} - -impl Clone for Iter<'_, K> { - #[cfg_attr(feature = "inline-more", inline)] - fn clone(&self) -> Self { - Iter { - iter: self.iter.clone(), - } - } -} -impl<'a, K> Iterator for Iter<'a, K> { - type Item = &'a K; - - #[cfg_attr(feature = "inline-more", inline)] - fn next(&mut self) -> Option<&'a K> { - self.iter.next() - } - #[cfg_attr(feature = "inline-more", inline)] - fn size_hint(&self) -> (usize, Option) { - self.iter.size_hint() - } -} -impl<'a, K> ExactSizeIterator for Iter<'a, K> { - #[cfg_attr(feature = "inline-more", inline)] - fn len(&self) -> usize { - self.iter.len() - } -} -impl FusedIterator for Iter<'_, K> {} - -impl fmt::Debug for Iter<'_, K> { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_list().entries(self.clone()).finish() - } -} - -impl Iterator for IntoIter { - type Item = K; - - #[cfg_attr(feature = "inline-more", inline)] - fn next(&mut self) -> Option { - // Avoid `Option::map` because it bloats LLVM IR. - match self.iter.next() { - Some((k, _)) => Some(k), - None => None, - } - } - #[cfg_attr(feature = "inline-more", inline)] - fn size_hint(&self) -> (usize, Option) { - self.iter.size_hint() - } -} -impl ExactSizeIterator for IntoIter { - #[cfg_attr(feature = "inline-more", inline)] - fn len(&self) -> usize { - self.iter.len() - } -} -impl FusedIterator for IntoIter {} - -impl fmt::Debug for IntoIter { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - let entries_iter = self.iter.iter().map(|(k, _)| k); - f.debug_list().entries(entries_iter).finish() - } -} - -impl Iterator for Drain<'_, K, A> { - type Item = K; - - #[cfg_attr(feature = "inline-more", inline)] - fn next(&mut self) -> Option { - // Avoid `Option::map` because it bloats LLVM IR. - match self.iter.next() { - Some((k, _)) => Some(k), - None => None, - } - } - #[cfg_attr(feature = "inline-more", inline)] - fn size_hint(&self) -> (usize, Option) { - self.iter.size_hint() - } -} -impl ExactSizeIterator for Drain<'_, K, A> { - #[cfg_attr(feature = "inline-more", inline)] - fn len(&self) -> usize { - self.iter.len() - } -} -impl FusedIterator for Drain<'_, K, A> {} - -impl fmt::Debug for Drain<'_, K, A> { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - let entries_iter = self.iter.iter().map(|(k, _)| k); - f.debug_list().entries(entries_iter).finish() - } -} - -impl<'a, K, F, A: Allocator + Clone> Drop for DrainFilter<'a, K, F, A> -where - F: FnMut(&K) -> bool, -{ - #[cfg_attr(feature = "inline-more", inline)] - fn drop(&mut self) { - while let Some(item) = self.next() { - let guard = ConsumeAllOnDrop(self); - drop(item); - mem::forget(guard); - } - } -} - -impl Iterator for DrainFilter<'_, K, F, A> -where - F: FnMut(&K) -> bool, -{ - type Item = K; - - #[cfg_attr(feature = "inline-more", inline)] - fn next(&mut self) -> Option { - let f = &mut self.f; - let (k, _) = self.inner.next(&mut |k, _| f(k))?; - Some(k) - } - - #[inline] - fn size_hint(&self) -> (usize, Option) { - (0, self.inner.iter.size_hint().1) - } -} - -impl FusedIterator for DrainFilter<'_, K, F, A> where - F: FnMut(&K) -> bool -{ -} - -impl Clone for Intersection<'_, T, S, A> { - #[cfg_attr(feature = "inline-more", inline)] - fn clone(&self) -> Self { - Intersection { - iter: self.iter.clone(), - ..*self - } - } -} - -impl<'a, T, S, A> Iterator for Intersection<'a, T, S, A> -where - T: Eq + Hash, - S: BuildHasher, - A: Allocator + Clone, -{ - type Item = &'a T; - - #[cfg_attr(feature = "inline-more", inline)] - fn next(&mut self) -> Option<&'a T> { - loop { - let elt = self.iter.next()?; - if self.other.contains(elt) { - return Some(elt); - } - } - } - - #[cfg_attr(feature = "inline-more", inline)] - fn size_hint(&self) -> (usize, Option) { - let (_, upper) = self.iter.size_hint(); - (0, upper) - } -} - -impl fmt::Debug for Intersection<'_, T, S, A> -where - T: fmt::Debug + Eq + Hash, - S: BuildHasher, - A: Allocator + Clone, -{ - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_list().entries(self.clone()).finish() - } -} - -impl FusedIterator for Intersection<'_, T, S, A> -where - T: Eq + Hash, - S: BuildHasher, - A: Allocator + Clone, -{ -} - -impl Clone for Difference<'_, T, S, A> { - #[cfg_attr(feature = "inline-more", inline)] - fn clone(&self) -> Self { - Difference { - iter: self.iter.clone(), - ..*self - } - } -} - -impl<'a, T, S, A> Iterator for Difference<'a, T, S, A> -where - T: Eq + Hash, - S: BuildHasher, - A: Allocator + Clone, -{ - type Item = &'a T; - - #[cfg_attr(feature = "inline-more", inline)] - fn next(&mut self) -> Option<&'a T> { - loop { - let elt = self.iter.next()?; - if !self.other.contains(elt) { - return Some(elt); - } - } - } - - #[cfg_attr(feature = "inline-more", inline)] - fn size_hint(&self) -> (usize, Option) { - let (_, upper) = self.iter.size_hint(); - (0, upper) - } -} - -impl FusedIterator for Difference<'_, T, S, A> -where - T: Eq + Hash, - S: BuildHasher, - A: Allocator + Clone, -{ -} - -impl fmt::Debug for Difference<'_, T, S, A> -where - T: fmt::Debug + Eq + Hash, - S: BuildHasher, - A: Allocator + Clone, -{ - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_list().entries(self.clone()).finish() - } -} - -impl Clone for SymmetricDifference<'_, T, S, A> { - #[cfg_attr(feature = "inline-more", inline)] - fn clone(&self) -> Self { - SymmetricDifference { - iter: self.iter.clone(), - } - } -} - -impl<'a, T, S, A> Iterator for SymmetricDifference<'a, T, S, A> -where - T: Eq + Hash, - S: BuildHasher, - A: Allocator + Clone, -{ - type Item = &'a T; - - #[cfg_attr(feature = "inline-more", inline)] - fn next(&mut self) -> Option<&'a T> { - self.iter.next() - } - #[cfg_attr(feature = "inline-more", inline)] - fn size_hint(&self) -> (usize, Option) { - self.iter.size_hint() - } -} - -impl FusedIterator for SymmetricDifference<'_, T, S, A> -where - T: Eq + Hash, - S: BuildHasher, - A: Allocator + Clone, -{ -} - -impl fmt::Debug for SymmetricDifference<'_, T, S, A> -where - T: fmt::Debug + Eq + Hash, - S: BuildHasher, - A: Allocator + Clone, -{ - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_list().entries(self.clone()).finish() - } -} - -impl Clone for Union<'_, T, S, A> { - #[cfg_attr(feature = "inline-more", inline)] - fn clone(&self) -> Self { - Union { - iter: self.iter.clone(), - } - } -} - -impl FusedIterator for Union<'_, T, S, A> -where - T: Eq + Hash, - S: BuildHasher, - A: Allocator + Clone, -{ -} - -impl fmt::Debug for Union<'_, T, S, A> -where - T: fmt::Debug + Eq + Hash, - S: BuildHasher, - A: Allocator + Clone, -{ - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_list().entries(self.clone()).finish() - } -} - -impl<'a, T, S, A> Iterator for Union<'a, T, S, A> -where - T: Eq + Hash, - S: BuildHasher, - A: Allocator + Clone, -{ - type Item = &'a T; - - #[cfg_attr(feature = "inline-more", inline)] - fn next(&mut self) -> Option<&'a T> { - self.iter.next() - } - #[cfg_attr(feature = "inline-more", inline)] - fn size_hint(&self) -> (usize, Option) { - self.iter.size_hint() - } -} - -/// A view into a single entry in a set, which may either be vacant or occupied. -/// -/// This `enum` is constructed from the [`entry`] method on [`HashSet`]. -/// -/// [`HashSet`]: struct.HashSet.html -/// [`entry`]: struct.HashSet.html#method.entry -/// -/// # Examples -/// -/// ``` -/// use hashbrown::hash_set::{Entry, HashSet, OccupiedEntry}; -/// -/// let mut set = HashSet::new(); -/// set.extend(["a", "b", "c"]); -/// assert_eq!(set.len(), 3); -/// -/// // Existing value (insert) -/// let entry: Entry<_, _> = set.entry("a"); -/// let _raw_o: OccupiedEntry<_, _> = entry.insert(); -/// assert_eq!(set.len(), 3); -/// // Nonexistent value (insert) -/// set.entry("d").insert(); -/// -/// // Existing value (or_insert) -/// set.entry("b").or_insert(); -/// // Nonexistent value (or_insert) -/// set.entry("e").or_insert(); -/// -/// println!("Our HashSet: {:?}", set); -/// -/// let mut vec: Vec<_> = set.iter().copied().collect(); -/// // The `Iter` iterator produces items in arbitrary order, so the -/// // items must be sorted to test them against a sorted array. -/// vec.sort_unstable(); -/// assert_eq!(vec, ["a", "b", "c", "d", "e"]); -/// ``` -pub enum Entry<'a, T, S, A = Global> -where - A: Allocator + Clone, -{ - /// An occupied entry. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::hash_set::{Entry, HashSet}; - /// let mut set: HashSet<_> = ["a", "b"].into(); - /// - /// match set.entry("a") { - /// Entry::Vacant(_) => unreachable!(), - /// Entry::Occupied(_) => { } - /// } - /// ``` - Occupied(OccupiedEntry<'a, T, S, A>), - - /// A vacant entry. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::hash_set::{Entry, HashSet}; - /// let mut set: HashSet<&str> = HashSet::new(); - /// - /// match set.entry("a") { - /// Entry::Occupied(_) => unreachable!(), - /// Entry::Vacant(_) => { } - /// } - /// ``` - Vacant(VacantEntry<'a, T, S, A>), -} - -impl fmt::Debug for Entry<'_, T, S, A> { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match *self { - Entry::Vacant(ref v) => f.debug_tuple("Entry").field(v).finish(), - Entry::Occupied(ref o) => f.debug_tuple("Entry").field(o).finish(), - } - } -} - -/// A view into an occupied entry in a `HashSet`. -/// It is part of the [`Entry`] enum. -/// -/// [`Entry`]: enum.Entry.html -/// -/// # Examples -/// -/// ``` -/// use hashbrown::hash_set::{Entry, HashSet, OccupiedEntry}; -/// -/// let mut set = HashSet::new(); -/// set.extend(["a", "b", "c"]); -/// -/// let _entry_o: OccupiedEntry<_, _> = set.entry("a").insert(); -/// assert_eq!(set.len(), 3); -/// -/// // Existing key -/// match set.entry("a") { -/// Entry::Vacant(_) => unreachable!(), -/// Entry::Occupied(view) => { -/// assert_eq!(view.get(), &"a"); -/// } -/// } -/// -/// assert_eq!(set.len(), 3); -/// -/// // Existing key (take) -/// match set.entry("c") { -/// Entry::Vacant(_) => unreachable!(), -/// Entry::Occupied(view) => { -/// assert_eq!(view.remove(), "c"); -/// } -/// } -/// assert_eq!(set.get(&"c"), None); -/// assert_eq!(set.len(), 2); -/// ``` -pub struct OccupiedEntry<'a, T, S, A: Allocator + Clone = Global> { - inner: map::OccupiedEntry<'a, T, (), S, A>, -} - -impl fmt::Debug for OccupiedEntry<'_, T, S, A> { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("OccupiedEntry") - .field("value", self.get()) - .finish() - } -} - -/// A view into a vacant entry in a `HashSet`. -/// It is part of the [`Entry`] enum. -/// -/// [`Entry`]: enum.Entry.html -/// -/// # Examples -/// -/// ``` -/// use hashbrown::hash_set::{Entry, HashSet, VacantEntry}; -/// -/// let mut set = HashSet::<&str>::new(); -/// -/// let entry_v: VacantEntry<_, _> = match set.entry("a") { -/// Entry::Vacant(view) => view, -/// Entry::Occupied(_) => unreachable!(), -/// }; -/// entry_v.insert(); -/// assert!(set.contains("a") && set.len() == 1); -/// -/// // Nonexistent key (insert) -/// match set.entry("b") { -/// Entry::Vacant(view) => view.insert(), -/// Entry::Occupied(_) => unreachable!(), -/// } -/// assert!(set.contains("b") && set.len() == 2); -/// ``` -pub struct VacantEntry<'a, T, S, A: Allocator + Clone = Global> { - inner: map::VacantEntry<'a, T, (), S, A>, -} - -impl fmt::Debug for VacantEntry<'_, T, S, A> { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_tuple("VacantEntry").field(self.get()).finish() - } -} - -impl<'a, T, S, A: Allocator + Clone> Entry<'a, T, S, A> { - /// Sets the value of the entry, and returns an OccupiedEntry. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashSet; - /// - /// let mut set: HashSet<&str> = HashSet::new(); - /// let entry = set.entry("horseyland").insert(); - /// - /// assert_eq!(entry.get(), &"horseyland"); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn insert(self) -> OccupiedEntry<'a, T, S, A> - where - T: Hash, - S: BuildHasher, - { - match self { - Entry::Occupied(entry) => entry, - Entry::Vacant(entry) => entry.insert_entry(), - } - } - - /// Ensures a value is in the entry by inserting if it was vacant. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashSet; - /// - /// let mut set: HashSet<&str> = HashSet::new(); - /// - /// // nonexistent key - /// set.entry("poneyland").or_insert(); - /// assert!(set.contains("poneyland")); - /// - /// // existing key - /// set.entry("poneyland").or_insert(); - /// assert!(set.contains("poneyland")); - /// assert_eq!(set.len(), 1); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn or_insert(self) - where - T: Hash, - S: BuildHasher, - { - if let Entry::Vacant(entry) = self { - entry.insert(); - } - } - - /// Returns a reference to this entry's value. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashSet; - /// - /// let mut set: HashSet<&str> = HashSet::new(); - /// set.entry("poneyland").or_insert(); - /// // existing key - /// assert_eq!(set.entry("poneyland").get(), &"poneyland"); - /// // nonexistent key - /// assert_eq!(set.entry("horseland").get(), &"horseland"); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn get(&self) -> &T { - match *self { - Entry::Occupied(ref entry) => entry.get(), - Entry::Vacant(ref entry) => entry.get(), - } - } -} - -impl OccupiedEntry<'_, T, S, A> { - /// Gets a reference to the value in the entry. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::hash_set::{Entry, HashSet}; - /// - /// let mut set: HashSet<&str> = HashSet::new(); - /// set.entry("poneyland").or_insert(); - /// - /// match set.entry("poneyland") { - /// Entry::Vacant(_) => panic!(), - /// Entry::Occupied(entry) => assert_eq!(entry.get(), &"poneyland"), - /// } - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn get(&self) -> &T { - self.inner.key() - } - - /// Takes the value out of the entry, and returns it. - /// Keeps the allocated memory for reuse. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashSet; - /// use hashbrown::hash_set::Entry; - /// - /// let mut set: HashSet<&str> = HashSet::new(); - /// // The set is empty - /// assert!(set.is_empty() && set.capacity() == 0); - /// - /// set.entry("poneyland").or_insert(); - /// let capacity_before_remove = set.capacity(); - /// - /// if let Entry::Occupied(o) = set.entry("poneyland") { - /// assert_eq!(o.remove(), "poneyland"); - /// } - /// - /// assert_eq!(set.contains("poneyland"), false); - /// // Now set hold none elements but capacity is equal to the old one - /// assert!(set.len() == 0 && set.capacity() == capacity_before_remove); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn remove(self) -> T { - self.inner.remove_entry().0 - } - - /// Replaces the entry, returning the old value. The new value in the hash map will be - /// the value used to create this entry. - /// - /// # Panics - /// - /// Will panic if this OccupiedEntry was created through [`Entry::insert`]. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::hash_set::{Entry, HashSet}; - /// use std::rc::Rc; - /// - /// let mut set: HashSet> = HashSet::new(); - /// let key_one = Rc::new("Stringthing".to_string()); - /// let key_two = Rc::new("Stringthing".to_string()); - /// - /// set.insert(key_one.clone()); - /// assert!(Rc::strong_count(&key_one) == 2 && Rc::strong_count(&key_two) == 1); - /// - /// match set.entry(key_two.clone()) { - /// Entry::Occupied(entry) => { - /// let old_key: Rc = entry.replace(); - /// assert!(Rc::ptr_eq(&key_one, &old_key)); - /// } - /// Entry::Vacant(_) => panic!(), - /// } - /// - /// assert!(Rc::strong_count(&key_one) == 1 && Rc::strong_count(&key_two) == 2); - /// assert!(set.contains(&"Stringthing".to_owned())); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn replace(self) -> T { - self.inner.replace_key() - } -} - -impl<'a, T, S, A: Allocator + Clone> VacantEntry<'a, T, S, A> { - /// Gets a reference to the value that would be used when inserting - /// through the `VacantEntry`. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashSet; - /// - /// let mut set: HashSet<&str> = HashSet::new(); - /// assert_eq!(set.entry("poneyland").get(), &"poneyland"); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn get(&self) -> &T { - self.inner.key() - } - - /// Take ownership of the value. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::hash_set::{Entry, HashSet}; - /// - /// let mut set: HashSet<&str> = HashSet::new(); - /// - /// match set.entry("poneyland") { - /// Entry::Occupied(_) => panic!(), - /// Entry::Vacant(v) => assert_eq!(v.into_value(), "poneyland"), - /// } - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn into_value(self) -> T { - self.inner.into_key() - } - - /// Sets the value of the entry with the VacantEntry's value. - /// - /// # Examples - /// - /// ``` - /// use hashbrown::HashSet; - /// use hashbrown::hash_set::Entry; - /// - /// let mut set: HashSet<&str> = HashSet::new(); - /// - /// if let Entry::Vacant(o) = set.entry("poneyland") { - /// o.insert(); - /// } - /// assert!(set.contains("poneyland")); - /// ``` - #[cfg_attr(feature = "inline-more", inline)] - pub fn insert(self) - where - T: Hash, - S: BuildHasher, - { - self.inner.insert(()); - } - - #[cfg_attr(feature = "inline-more", inline)] - fn insert_entry(self) -> OccupiedEntry<'a, T, S, A> - where - T: Hash, - S: BuildHasher, - { - OccupiedEntry { - inner: self.inner.insert_entry(()), - } - } -} - -#[allow(dead_code)] -fn assert_covariance() { - fn set<'new>(v: HashSet<&'static str>) -> HashSet<&'new str> { - v - } - fn iter<'a, 'new>(v: Iter<'a, &'static str>) -> Iter<'a, &'new str> { - v - } - fn into_iter<'new, A: Allocator + Clone>( - v: IntoIter<&'static str, A>, - ) -> IntoIter<&'new str, A> { - v - } - fn difference<'a, 'new, A: Allocator + Clone>( - v: Difference<'a, &'static str, DefaultHashBuilder, A>, - ) -> Difference<'a, &'new str, DefaultHashBuilder, A> { - v - } - fn symmetric_difference<'a, 'new, A: Allocator + Clone>( - v: SymmetricDifference<'a, &'static str, DefaultHashBuilder, A>, - ) -> SymmetricDifference<'a, &'new str, DefaultHashBuilder, A> { - v - } - fn intersection<'a, 'new, A: Allocator + Clone>( - v: Intersection<'a, &'static str, DefaultHashBuilder, A>, - ) -> Intersection<'a, &'new str, DefaultHashBuilder, A> { - v - } - fn union<'a, 'new, A: Allocator + Clone>( - v: Union<'a, &'static str, DefaultHashBuilder, A>, - ) -> Union<'a, &'new str, DefaultHashBuilder, A> { - v - } - fn drain<'new, A: Allocator + Clone>( - d: Drain<'static, &'static str, A>, - ) -> Drain<'new, &'new str, A> { - d - } -} - -#[cfg(test)] -mod test_set { - use super::super::map::DefaultHashBuilder; - use super::HashSet; - use std::vec::Vec; - - #[test] - fn test_zero_capacities() { - type HS = HashSet; - - let s = HS::new(); - assert_eq!(s.capacity(), 0); - - let s = HS::default(); - assert_eq!(s.capacity(), 0); - - let s = HS::with_hasher(DefaultHashBuilder::default()); - assert_eq!(s.capacity(), 0); - - let s = HS::with_capacity(0); - assert_eq!(s.capacity(), 0); - - let s = HS::with_capacity_and_hasher(0, DefaultHashBuilder::default()); - assert_eq!(s.capacity(), 0); - - let mut s = HS::new(); - s.insert(1); - s.insert(2); - s.remove(&1); - s.remove(&2); - s.shrink_to_fit(); - assert_eq!(s.capacity(), 0); - - let mut s = HS::new(); - s.reserve(0); - assert_eq!(s.capacity(), 0); - } - - #[test] - fn test_disjoint() { - let mut xs = HashSet::new(); - let mut ys = HashSet::new(); - assert!(xs.is_disjoint(&ys)); - assert!(ys.is_disjoint(&xs)); - assert!(xs.insert(5)); - assert!(ys.insert(11)); - assert!(xs.is_disjoint(&ys)); - assert!(ys.is_disjoint(&xs)); - assert!(xs.insert(7)); - assert!(xs.insert(19)); - assert!(xs.insert(4)); - assert!(ys.insert(2)); - assert!(ys.insert(-11)); - assert!(xs.is_disjoint(&ys)); - assert!(ys.is_disjoint(&xs)); - assert!(ys.insert(7)); - assert!(!xs.is_disjoint(&ys)); - assert!(!ys.is_disjoint(&xs)); - } - - #[test] - fn test_subset_and_superset() { - let mut a = HashSet::new(); - assert!(a.insert(0)); - assert!(a.insert(5)); - assert!(a.insert(11)); - assert!(a.insert(7)); - - let mut b = HashSet::new(); - assert!(b.insert(0)); - assert!(b.insert(7)); - assert!(b.insert(19)); - assert!(b.insert(250)); - assert!(b.insert(11)); - assert!(b.insert(200)); - - assert!(!a.is_subset(&b)); - assert!(!a.is_superset(&b)); - assert!(!b.is_subset(&a)); - assert!(!b.is_superset(&a)); - - assert!(b.insert(5)); - - assert!(a.is_subset(&b)); - assert!(!a.is_superset(&b)); - assert!(!b.is_subset(&a)); - assert!(b.is_superset(&a)); - } - - #[test] - fn test_iterate() { - let mut a = HashSet::new(); - for i in 0..32 { - assert!(a.insert(i)); - } - let mut observed: u32 = 0; - for k in &a { - observed |= 1 << *k; - } - assert_eq!(observed, 0xFFFF_FFFF); - } - - #[test] - fn test_intersection() { - let mut a = HashSet::new(); - let mut b = HashSet::new(); - - assert!(a.insert(11)); - assert!(a.insert(1)); - assert!(a.insert(3)); - assert!(a.insert(77)); - assert!(a.insert(103)); - assert!(a.insert(5)); - assert!(a.insert(-5)); - - assert!(b.insert(2)); - assert!(b.insert(11)); - assert!(b.insert(77)); - assert!(b.insert(-9)); - assert!(b.insert(-42)); - assert!(b.insert(5)); - assert!(b.insert(3)); - - let mut i = 0; - let expected = [3, 5, 11, 77]; - for x in a.intersection(&b) { - assert!(expected.contains(x)); - i += 1; - } - assert_eq!(i, expected.len()); - } - - #[test] - fn test_difference() { - let mut a = HashSet::new(); - let mut b = HashSet::new(); - - assert!(a.insert(1)); - assert!(a.insert(3)); - assert!(a.insert(5)); - assert!(a.insert(9)); - assert!(a.insert(11)); - - assert!(b.insert(3)); - assert!(b.insert(9)); - - let mut i = 0; - let expected = [1, 5, 11]; - for x in a.difference(&b) { - assert!(expected.contains(x)); - i += 1; - } - assert_eq!(i, expected.len()); - } - - #[test] - fn test_symmetric_difference() { - let mut a = HashSet::new(); - let mut b = HashSet::new(); - - assert!(a.insert(1)); - assert!(a.insert(3)); - assert!(a.insert(5)); - assert!(a.insert(9)); - assert!(a.insert(11)); - - assert!(b.insert(-2)); - assert!(b.insert(3)); - assert!(b.insert(9)); - assert!(b.insert(14)); - assert!(b.insert(22)); - - let mut i = 0; - let expected = [-2, 1, 5, 11, 14, 22]; - for x in a.symmetric_difference(&b) { - assert!(expected.contains(x)); - i += 1; - } - assert_eq!(i, expected.len()); - } - - #[test] - fn test_union() { - let mut a = HashSet::new(); - let mut b = HashSet::new(); - - assert!(a.insert(1)); - assert!(a.insert(3)); - assert!(a.insert(5)); - assert!(a.insert(9)); - assert!(a.insert(11)); - assert!(a.insert(16)); - assert!(a.insert(19)); - assert!(a.insert(24)); - - assert!(b.insert(-2)); - assert!(b.insert(1)); - assert!(b.insert(5)); - assert!(b.insert(9)); - assert!(b.insert(13)); - assert!(b.insert(19)); - - let mut i = 0; - let expected = [-2, 1, 3, 5, 9, 11, 13, 16, 19, 24]; - for x in a.union(&b) { - assert!(expected.contains(x)); - i += 1; - } - assert_eq!(i, expected.len()); - } - - #[test] - fn test_from_map() { - let mut a = crate::HashMap::new(); - a.insert(1, ()); - a.insert(2, ()); - a.insert(3, ()); - a.insert(4, ()); - - let a: HashSet<_> = a.into(); - - assert_eq!(a.len(), 4); - assert!(a.contains(&1)); - assert!(a.contains(&2)); - assert!(a.contains(&3)); - assert!(a.contains(&4)); - } - - #[test] - fn test_from_iter() { - let xs = [1, 2, 2, 3, 4, 5, 6, 7, 8, 9]; - - let set: HashSet<_> = xs.iter().copied().collect(); - - for x in &xs { - assert!(set.contains(x)); - } - - assert_eq!(set.iter().len(), xs.len() - 1); - } - - #[test] - fn test_move_iter() { - let hs = { - let mut hs = HashSet::new(); - - hs.insert('a'); - hs.insert('b'); - - hs - }; - - let v = hs.into_iter().collect::>(); - assert!(v == ['a', 'b'] || v == ['b', 'a']); - } - - #[test] - fn test_eq() { - // These constants once happened to expose a bug in insert(). - // I'm keeping them around to prevent a regression. - let mut s1 = HashSet::new(); - - s1.insert(1); - s1.insert(2); - s1.insert(3); - - let mut s2 = HashSet::new(); - - s2.insert(1); - s2.insert(2); - - assert!(s1 != s2); - - s2.insert(3); - - assert_eq!(s1, s2); - } - - #[test] - fn test_show() { - let mut set = HashSet::new(); - let empty = HashSet::::new(); - - set.insert(1); - set.insert(2); - - let set_str = format!("{:?}", set); - - assert!(set_str == "{1, 2}" || set_str == "{2, 1}"); - assert_eq!(format!("{:?}", empty), "{}"); - } - - #[test] - fn test_trivial_drain() { - let mut s = HashSet::::new(); - for _ in s.drain() {} - assert!(s.is_empty()); - drop(s); - - let mut s = HashSet::::new(); - drop(s.drain()); - assert!(s.is_empty()); - } - - #[test] - fn test_drain() { - let mut s: HashSet<_> = (1..100).collect(); - - // try this a bunch of times to make sure we don't screw up internal state. - for _ in 0..20 { - assert_eq!(s.len(), 99); - - { - let mut last_i = 0; - let mut d = s.drain(); - for (i, x) in d.by_ref().take(50).enumerate() { - last_i = i; - assert!(x != 0); - } - assert_eq!(last_i, 49); - } - - for _ in &s { - panic!("s should be empty!"); - } - - // reset to try again. - s.extend(1..100); - } - } - - #[test] - fn test_replace() { - use core::hash; - - #[derive(Debug)] - struct Foo(&'static str, i32); - - impl PartialEq for Foo { - fn eq(&self, other: &Self) -> bool { - self.0 == other.0 - } - } - - impl Eq for Foo {} - - impl hash::Hash for Foo { - fn hash(&self, h: &mut H) { - self.0.hash(h); - } - } - - let mut s = HashSet::new(); - assert_eq!(s.replace(Foo("a", 1)), None); - assert_eq!(s.len(), 1); - assert_eq!(s.replace(Foo("a", 2)), Some(Foo("a", 1))); - assert_eq!(s.len(), 1); - - let mut it = s.iter(); - assert_eq!(it.next(), Some(&Foo("a", 2))); - assert_eq!(it.next(), None); - } - - #[test] - fn test_extend_ref() { - let mut a = HashSet::new(); - a.insert(1); - - a.extend([2, 3, 4]); - - assert_eq!(a.len(), 4); - assert!(a.contains(&1)); - assert!(a.contains(&2)); - assert!(a.contains(&3)); - assert!(a.contains(&4)); - - let mut b = HashSet::new(); - b.insert(5); - b.insert(6); - - a.extend(&b); - - assert_eq!(a.len(), 6); - assert!(a.contains(&1)); - assert!(a.contains(&2)); - assert!(a.contains(&3)); - assert!(a.contains(&4)); - assert!(a.contains(&5)); - assert!(a.contains(&6)); - } - - #[test] - fn test_retain() { - let xs = [1, 2, 3, 4, 5, 6]; - let mut set: HashSet = xs.iter().copied().collect(); - set.retain(|&k| k % 2 == 0); - assert_eq!(set.len(), 3); - assert!(set.contains(&2)); - assert!(set.contains(&4)); - assert!(set.contains(&6)); - } - - #[test] - fn test_drain_filter() { - { - let mut set: HashSet = (0..8).collect(); - let drained = set.drain_filter(|&k| k % 2 == 0); - let mut out = drained.collect::>(); - out.sort_unstable(); - assert_eq!(vec![0, 2, 4, 6], out); - assert_eq!(set.len(), 4); - } - { - let mut set: HashSet = (0..8).collect(); - drop(set.drain_filter(|&k| k % 2 == 0)); - assert_eq!(set.len(), 4, "Removes non-matching items on drop"); - } - } - - #[test] - fn test_const_with_hasher() { - use core::hash::BuildHasher; - use std::collections::hash_map::DefaultHasher; - - #[derive(Clone)] - struct MyHasher; - impl BuildHasher for MyHasher { - type Hasher = DefaultHasher; - - fn build_hasher(&self) -> DefaultHasher { - DefaultHasher::new() - } - } - - const EMPTY_SET: HashSet = HashSet::with_hasher(MyHasher); - - let mut set = EMPTY_SET; - set.insert(19); - assert!(set.contains(&19)); - } - - #[test] - fn rehash_in_place() { - let mut set = HashSet::new(); - - for i in 0..224 { - set.insert(i); - } - - assert_eq!( - set.capacity(), - 224, - "The set must be at or close to capacity to trigger a re hashing" - ); - - for i in 100..1400 { - set.remove(&(i - 100)); - set.insert(i); - } - } -} diff -Nru temporalio-1.3.0/vendor/hashbrown-0.13.2/tests/equivalent_trait.rs temporalio-1.3.0/vendor/hashbrown-0.13.2/tests/equivalent_trait.rs --- temporalio-1.3.0/vendor/hashbrown-0.13.2/tests/equivalent_trait.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/hashbrown-0.13.2/tests/equivalent_trait.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,53 +0,0 @@ -use hashbrown::Equivalent; -use hashbrown::HashMap; - -use std::hash::Hash; - -#[derive(Debug, Hash)] -pub struct Pair(pub A, pub B); - -impl PartialEq<(A, B)> for Pair -where - C: PartialEq, - D: PartialEq, -{ - fn eq(&self, rhs: &(A, B)) -> bool { - self.0 == rhs.0 && self.1 == rhs.1 - } -} - -impl Equivalent for Pair -where - Pair: PartialEq, - A: Hash + Eq, - B: Hash + Eq, -{ - fn equivalent(&self, other: &X) -> bool { - *self == *other - } -} - -#[test] -fn test_lookup() { - let s = String::from; - let mut map = HashMap::new(); - map.insert((s("a"), s("b")), 1); - map.insert((s("a"), s("x")), 2); - - assert!(map.contains_key(&Pair("a", "b"))); - assert!(!map.contains_key(&Pair("b", "a"))); -} - -#[test] -fn test_string_str() { - let s = String::from; - let mut map = HashMap::new(); - map.insert(s("a"), 1); - map.insert(s("b"), 2); - map.insert(s("x"), 3); - map.insert(s("y"), 4); - - assert!(map.contains_key("a")); - assert!(!map.contains_key("z")); - assert_eq!(map.remove("b"), Some(2)); -} diff -Nru temporalio-1.3.0/vendor/hashbrown-0.13.2/tests/hasher.rs temporalio-1.3.0/vendor/hashbrown-0.13.2/tests/hasher.rs --- temporalio-1.3.0/vendor/hashbrown-0.13.2/tests/hasher.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/hashbrown-0.13.2/tests/hasher.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,65 +0,0 @@ -//! Sanity check that alternate hashers work correctly. - -#![cfg(not(miri))] // FIXME: takes too long - -use hashbrown::HashSet; -use std::hash::{BuildHasher, BuildHasherDefault, Hasher}; - -fn check() { - let range = 0..1_000; - - let mut set = HashSet::::default(); - set.extend(range.clone()); - - assert!(!set.contains(&i32::min_value())); - assert!(!set.contains(&(range.start - 1))); - for i in range.clone() { - assert!(set.contains(&i)); - } - assert!(!set.contains(&range.end)); - assert!(!set.contains(&i32::max_value())); -} - -/// Use hashbrown's default hasher. -#[test] -fn default() { - check::(); -} - -/// Use std's default hasher. -#[test] -fn random_state() { - check::(); -} - -/// Use a constant 0 hash. -#[test] -fn zero() { - #[derive(Default)] - struct ZeroHasher; - - impl Hasher for ZeroHasher { - fn finish(&self) -> u64 { - 0 - } - fn write(&mut self, _: &[u8]) {} - } - - check::>(); -} - -/// Use a constant maximum hash. -#[test] -fn max() { - #[derive(Default)] - struct MaxHasher; - - impl Hasher for MaxHasher { - fn finish(&self) -> u64 { - u64::max_value() - } - fn write(&mut self, _: &[u8]) {} - } - - check::>(); -} diff -Nru temporalio-1.3.0/vendor/hashbrown-0.13.2/tests/raw.rs temporalio-1.3.0/vendor/hashbrown-0.13.2/tests/raw.rs --- temporalio-1.3.0/vendor/hashbrown-0.13.2/tests/raw.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/hashbrown-0.13.2/tests/raw.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,11 +0,0 @@ -#![cfg(feature = "raw")] - -use hashbrown::raw::RawTable; -use std::mem; - -#[test] -fn test_allocation_info() { - assert_eq!(RawTable::<()>::new().allocation_info().1.size(), 0); - assert_eq!(RawTable::::new().allocation_info().1.size(), 0); - assert!(RawTable::::with_capacity(1).allocation_info().1.size() > mem::size_of::()); -} diff -Nru temporalio-1.3.0/vendor/hashbrown-0.13.2/tests/rayon.rs temporalio-1.3.0/vendor/hashbrown-0.13.2/tests/rayon.rs --- temporalio-1.3.0/vendor/hashbrown-0.13.2/tests/rayon.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/hashbrown-0.13.2/tests/rayon.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,533 +0,0 @@ -#![cfg(feature = "rayon")] - -#[macro_use] -extern crate lazy_static; - -use hashbrown::{HashMap, HashSet}; -use rayon::iter::{ - IntoParallelIterator, IntoParallelRefIterator, IntoParallelRefMutIterator, ParallelExtend, - ParallelIterator, -}; - -macro_rules! assert_eq3 { - ($e1:expr, $e2:expr, $e3:expr) => {{ - assert_eq!($e1, $e2); - assert_eq!($e1, $e3); - assert_eq!($e2, $e3); - }}; -} - -lazy_static! { - static ref MAP_EMPTY: HashMap = HashMap::new(); - static ref MAP: HashMap = { - let mut m = HashMap::new(); - m.insert('b', 20); - m.insert('a', 10); - m.insert('c', 30); - m.insert('e', 50); - m.insert('f', 60); - m.insert('d', 40); - m - }; -} - -#[test] -fn map_seq_par_equivalence_iter_empty() { - let vec_seq = MAP_EMPTY.iter().collect::>(); - let vec_par = MAP_EMPTY.par_iter().collect::>(); - - assert_eq3!(vec_seq, vec_par, []); -} - -#[test] -fn map_seq_par_equivalence_iter() { - let mut vec_seq = MAP.iter().collect::>(); - let mut vec_par = MAP.par_iter().collect::>(); - - assert_eq!(vec_seq, vec_par); - - // Do not depend on the exact order of values - let expected_sorted = [ - (&'a', &10), - (&'b', &20), - (&'c', &30), - (&'d', &40), - (&'e', &50), - (&'f', &60), - ]; - - vec_seq.sort_unstable(); - vec_par.sort_unstable(); - - assert_eq3!(vec_seq, vec_par, expected_sorted); -} - -#[test] -fn map_seq_par_equivalence_keys_empty() { - let vec_seq = MAP_EMPTY.keys().collect::>(); - let vec_par = MAP_EMPTY.par_keys().collect::>(); - - let expected: [&char; 0] = []; - - assert_eq3!(vec_seq, vec_par, expected); -} - -#[test] -fn map_seq_par_equivalence_keys() { - let mut vec_seq = MAP.keys().collect::>(); - let mut vec_par = MAP.par_keys().collect::>(); - - assert_eq!(vec_seq, vec_par); - - // Do not depend on the exact order of values - let expected_sorted = [&'a', &'b', &'c', &'d', &'e', &'f']; - - vec_seq.sort_unstable(); - vec_par.sort_unstable(); - - assert_eq3!(vec_seq, vec_par, expected_sorted); -} - -#[test] -fn map_seq_par_equivalence_values_empty() { - let vec_seq = MAP_EMPTY.values().collect::>(); - let vec_par = MAP_EMPTY.par_values().collect::>(); - - let expected: [&u32; 0] = []; - - assert_eq3!(vec_seq, vec_par, expected); -} - -#[test] -fn map_seq_par_equivalence_values() { - let mut vec_seq = MAP.values().collect::>(); - let mut vec_par = MAP.par_values().collect::>(); - - assert_eq!(vec_seq, vec_par); - - // Do not depend on the exact order of values - let expected_sorted = [&10, &20, &30, &40, &50, &60]; - - vec_seq.sort_unstable(); - vec_par.sort_unstable(); - - assert_eq3!(vec_seq, vec_par, expected_sorted); -} - -#[test] -fn map_seq_par_equivalence_iter_mut_empty() { - let mut map1 = MAP_EMPTY.clone(); - let mut map2 = MAP_EMPTY.clone(); - - let vec_seq = map1.iter_mut().collect::>(); - let vec_par = map2.par_iter_mut().collect::>(); - - assert_eq3!(vec_seq, vec_par, []); -} - -#[test] -fn map_seq_par_equivalence_iter_mut() { - let mut map1 = MAP.clone(); - let mut map2 = MAP.clone(); - - let mut vec_seq = map1.iter_mut().collect::>(); - let mut vec_par = map2.par_iter_mut().collect::>(); - - assert_eq!(vec_seq, vec_par); - - // Do not depend on the exact order of values - let expected_sorted = [ - (&'a', &mut 10), - (&'b', &mut 20), - (&'c', &mut 30), - (&'d', &mut 40), - (&'e', &mut 50), - (&'f', &mut 60), - ]; - - vec_seq.sort_unstable(); - vec_par.sort_unstable(); - - assert_eq3!(vec_seq, vec_par, expected_sorted); -} - -#[test] -fn map_seq_par_equivalence_values_mut_empty() { - let mut map1 = MAP_EMPTY.clone(); - let mut map2 = MAP_EMPTY.clone(); - - let vec_seq = map1.values_mut().collect::>(); - let vec_par = map2.par_values_mut().collect::>(); - - let expected: [&u32; 0] = []; - - assert_eq3!(vec_seq, vec_par, expected); -} - -#[test] -fn map_seq_par_equivalence_values_mut() { - let mut map1 = MAP.clone(); - let mut map2 = MAP.clone(); - - let mut vec_seq = map1.values_mut().collect::>(); - let mut vec_par = map2.par_values_mut().collect::>(); - - assert_eq!(vec_seq, vec_par); - - // Do not depend on the exact order of values - let expected_sorted = [&mut 10, &mut 20, &mut 30, &mut 40, &mut 50, &mut 60]; - - vec_seq.sort_unstable(); - vec_par.sort_unstable(); - - assert_eq3!(vec_seq, vec_par, expected_sorted); -} - -#[test] -fn map_seq_par_equivalence_into_iter_empty() { - let vec_seq = MAP_EMPTY.clone().into_iter().collect::>(); - let vec_par = MAP_EMPTY.clone().into_par_iter().collect::>(); - - assert_eq3!(vec_seq, vec_par, []); -} - -#[test] -fn map_seq_par_equivalence_into_iter() { - let mut vec_seq = MAP.clone().into_iter().collect::>(); - let mut vec_par = MAP.clone().into_par_iter().collect::>(); - - assert_eq!(vec_seq, vec_par); - - // Do not depend on the exact order of values - let expected_sorted = [ - ('a', 10), - ('b', 20), - ('c', 30), - ('d', 40), - ('e', 50), - ('f', 60), - ]; - - vec_seq.sort_unstable(); - vec_par.sort_unstable(); - - assert_eq3!(vec_seq, vec_par, expected_sorted); -} - -lazy_static! { - static ref MAP_VEC_EMPTY: Vec<(char, u32)> = vec![]; - static ref MAP_VEC: Vec<(char, u32)> = vec![ - ('b', 20), - ('a', 10), - ('c', 30), - ('e', 50), - ('f', 60), - ('d', 40), - ]; -} - -#[test] -fn map_seq_par_equivalence_collect_empty() { - let map_expected = MAP_EMPTY.clone(); - let map_seq = MAP_VEC_EMPTY.clone().into_iter().collect::>(); - let map_par = MAP_VEC_EMPTY - .clone() - .into_par_iter() - .collect::>(); - - assert_eq!(map_seq, map_par); - assert_eq!(map_seq, map_expected); - assert_eq!(map_par, map_expected); -} - -#[test] -fn map_seq_par_equivalence_collect() { - let map_expected = MAP.clone(); - let map_seq = MAP_VEC.clone().into_iter().collect::>(); - let map_par = MAP_VEC.clone().into_par_iter().collect::>(); - - assert_eq!(map_seq, map_par); - assert_eq!(map_seq, map_expected); - assert_eq!(map_par, map_expected); -} - -lazy_static! { - static ref MAP_EXISTING_EMPTY: HashMap = HashMap::new(); - static ref MAP_EXISTING: HashMap = { - let mut m = HashMap::new(); - m.insert('b', 20); - m.insert('a', 10); - m - }; - static ref MAP_EXTENSION_EMPTY: Vec<(char, u32)> = vec![]; - static ref MAP_EXTENSION: Vec<(char, u32)> = vec![('c', 30), ('e', 50), ('f', 60), ('d', 40),]; -} - -#[test] -fn map_seq_par_equivalence_existing_empty_extend_empty() { - let expected = HashMap::new(); - let mut map_seq = MAP_EXISTING_EMPTY.clone(); - let mut map_par = MAP_EXISTING_EMPTY.clone(); - - map_seq.extend(MAP_EXTENSION_EMPTY.iter().copied()); - map_par.par_extend(MAP_EXTENSION_EMPTY.par_iter().copied()); - - assert_eq3!(map_seq, map_par, expected); -} - -#[test] -fn map_seq_par_equivalence_existing_empty_extend() { - let expected = MAP_EXTENSION.iter().copied().collect::>(); - let mut map_seq = MAP_EXISTING_EMPTY.clone(); - let mut map_par = MAP_EXISTING_EMPTY.clone(); - - map_seq.extend(MAP_EXTENSION.iter().copied()); - map_par.par_extend(MAP_EXTENSION.par_iter().copied()); - - assert_eq3!(map_seq, map_par, expected); -} - -#[test] -fn map_seq_par_equivalence_existing_extend_empty() { - let expected = MAP_EXISTING.clone(); - let mut map_seq = MAP_EXISTING.clone(); - let mut map_par = MAP_EXISTING.clone(); - - map_seq.extend(MAP_EXTENSION_EMPTY.iter().copied()); - map_par.par_extend(MAP_EXTENSION_EMPTY.par_iter().copied()); - - assert_eq3!(map_seq, map_par, expected); -} - -#[test] -fn map_seq_par_equivalence_existing_extend() { - let expected = MAP.clone(); - let mut map_seq = MAP_EXISTING.clone(); - let mut map_par = MAP_EXISTING.clone(); - - map_seq.extend(MAP_EXTENSION.iter().copied()); - map_par.par_extend(MAP_EXTENSION.par_iter().copied()); - - assert_eq3!(map_seq, map_par, expected); -} - -lazy_static! { - static ref SET_EMPTY: HashSet = HashSet::new(); - static ref SET: HashSet = { - let mut s = HashSet::new(); - s.insert('b'); - s.insert('a'); - s.insert('c'); - s.insert('e'); - s.insert('f'); - s.insert('d'); - s - }; -} - -#[test] -fn set_seq_par_equivalence_iter_empty() { - let vec_seq = SET_EMPTY.iter().collect::>(); - let vec_par = SET_EMPTY.par_iter().collect::>(); - - let expected: [&char; 0] = []; - - assert_eq3!(vec_seq, vec_par, expected); -} - -#[test] -fn set_seq_par_equivalence_iter() { - let mut vec_seq = SET.iter().collect::>(); - let mut vec_par = SET.par_iter().collect::>(); - - assert_eq!(vec_seq, vec_par); - - // Do not depend on the exact order of values - let expected_sorted = [&'a', &'b', &'c', &'d', &'e', &'f']; - - vec_seq.sort_unstable(); - vec_par.sort_unstable(); - - assert_eq3!(vec_seq, vec_par, expected_sorted); -} - -#[test] -fn set_seq_par_equivalence_into_iter_empty() { - let vec_seq = SET_EMPTY.clone().into_iter().collect::>(); - let vec_par = SET_EMPTY.clone().into_par_iter().collect::>(); - - assert_eq3!(vec_seq, vec_par, []); -} - -#[test] -fn set_seq_par_equivalence_into_iter() { - let mut vec_seq = SET.clone().into_iter().collect::>(); - let mut vec_par = SET.clone().into_par_iter().collect::>(); - - assert_eq!(vec_seq, vec_par); - - // Do not depend on the exact order of values - let expected_sorted = ['a', 'b', 'c', 'd', 'e', 'f']; - - vec_seq.sort_unstable(); - vec_par.sort_unstable(); - - assert_eq3!(vec_seq, vec_par, expected_sorted); -} - -lazy_static! { - static ref SET_VEC_EMPTY: Vec = vec![]; - static ref SET_VEC: Vec = vec!['b', 'a', 'c', 'e', 'f', 'd',]; -} - -#[test] -fn set_seq_par_equivalence_collect_empty() { - let set_expected = SET_EMPTY.clone(); - let set_seq = SET_VEC_EMPTY.clone().into_iter().collect::>(); - let set_par = SET_VEC_EMPTY - .clone() - .into_par_iter() - .collect::>(); - - assert_eq!(set_seq, set_par); - assert_eq!(set_seq, set_expected); - assert_eq!(set_par, set_expected); -} - -#[test] -fn set_seq_par_equivalence_collect() { - let set_expected = SET.clone(); - let set_seq = SET_VEC.clone().into_iter().collect::>(); - let set_par = SET_VEC.clone().into_par_iter().collect::>(); - - assert_eq!(set_seq, set_par); - assert_eq!(set_seq, set_expected); - assert_eq!(set_par, set_expected); -} - -lazy_static! { - static ref SET_EXISTING_EMPTY: HashSet = HashSet::new(); - static ref SET_EXISTING: HashSet = { - let mut s = HashSet::new(); - s.insert('b'); - s.insert('a'); - s - }; - static ref SET_EXTENSION_EMPTY: Vec = vec![]; - static ref SET_EXTENSION: Vec = vec!['c', 'e', 'f', 'd',]; -} - -#[test] -fn set_seq_par_equivalence_existing_empty_extend_empty() { - let expected = HashSet::new(); - let mut set_seq = SET_EXISTING_EMPTY.clone(); - let mut set_par = SET_EXISTING_EMPTY.clone(); - - set_seq.extend(SET_EXTENSION_EMPTY.iter().copied()); - set_par.par_extend(SET_EXTENSION_EMPTY.par_iter().copied()); - - assert_eq3!(set_seq, set_par, expected); -} - -#[test] -fn set_seq_par_equivalence_existing_empty_extend() { - let expected = SET_EXTENSION.iter().copied().collect::>(); - let mut set_seq = SET_EXISTING_EMPTY.clone(); - let mut set_par = SET_EXISTING_EMPTY.clone(); - - set_seq.extend(SET_EXTENSION.iter().copied()); - set_par.par_extend(SET_EXTENSION.par_iter().copied()); - - assert_eq3!(set_seq, set_par, expected); -} - -#[test] -fn set_seq_par_equivalence_existing_extend_empty() { - let expected = SET_EXISTING.clone(); - let mut set_seq = SET_EXISTING.clone(); - let mut set_par = SET_EXISTING.clone(); - - set_seq.extend(SET_EXTENSION_EMPTY.iter().copied()); - set_par.par_extend(SET_EXTENSION_EMPTY.par_iter().copied()); - - assert_eq3!(set_seq, set_par, expected); -} - -#[test] -fn set_seq_par_equivalence_existing_extend() { - let expected = SET.clone(); - let mut set_seq = SET_EXISTING.clone(); - let mut set_par = SET_EXISTING.clone(); - - set_seq.extend(SET_EXTENSION.iter().copied()); - set_par.par_extend(SET_EXTENSION.par_iter().copied()); - - assert_eq3!(set_seq, set_par, expected); -} - -lazy_static! { - static ref SET_A: HashSet = ['a', 'b', 'c', 'd'].iter().copied().collect(); - static ref SET_B: HashSet = ['a', 'b', 'e', 'f'].iter().copied().collect(); - static ref SET_DIFF_AB: HashSet = ['c', 'd'].iter().copied().collect(); - static ref SET_DIFF_BA: HashSet = ['e', 'f'].iter().copied().collect(); - static ref SET_SYMM_DIFF_AB: HashSet = ['c', 'd', 'e', 'f'].iter().copied().collect(); - static ref SET_INTERSECTION_AB: HashSet = ['a', 'b'].iter().copied().collect(); - static ref SET_UNION_AB: HashSet = - ['a', 'b', 'c', 'd', 'e', 'f'].iter().copied().collect(); -} - -#[test] -fn set_seq_par_equivalence_difference() { - let diff_ab_seq = SET_A.difference(&*SET_B).copied().collect::>(); - let diff_ab_par = SET_A - .par_difference(&*SET_B) - .copied() - .collect::>(); - - assert_eq3!(diff_ab_seq, diff_ab_par, *SET_DIFF_AB); - - let diff_ba_seq = SET_B.difference(&*SET_A).copied().collect::>(); - let diff_ba_par = SET_B - .par_difference(&*SET_A) - .copied() - .collect::>(); - - assert_eq3!(diff_ba_seq, diff_ba_par, *SET_DIFF_BA); -} - -#[test] -fn set_seq_par_equivalence_symmetric_difference() { - let symm_diff_ab_seq = SET_A - .symmetric_difference(&*SET_B) - .copied() - .collect::>(); - let symm_diff_ab_par = SET_A - .par_symmetric_difference(&*SET_B) - .copied() - .collect::>(); - - assert_eq3!(symm_diff_ab_seq, symm_diff_ab_par, *SET_SYMM_DIFF_AB); -} - -#[test] -fn set_seq_par_equivalence_intersection() { - let intersection_ab_seq = SET_A.intersection(&*SET_B).copied().collect::>(); - let intersection_ab_par = SET_A - .par_intersection(&*SET_B) - .copied() - .collect::>(); - - assert_eq3!( - intersection_ab_seq, - intersection_ab_par, - *SET_INTERSECTION_AB - ); -} - -#[test] -fn set_seq_par_equivalence_union() { - let union_ab_seq = SET_A.union(&*SET_B).copied().collect::>(); - let union_ab_par = SET_A.par_union(&*SET_B).copied().collect::>(); - - assert_eq3!(union_ab_seq, union_ab_par, *SET_UNION_AB); -} diff -Nru temporalio-1.3.0/vendor/hashbrown-0.13.2/tests/serde.rs temporalio-1.3.0/vendor/hashbrown-0.13.2/tests/serde.rs --- temporalio-1.3.0/vendor/hashbrown-0.13.2/tests/serde.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/hashbrown-0.13.2/tests/serde.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,65 +0,0 @@ -#![cfg(feature = "serde")] - -use core::hash::BuildHasherDefault; -use fnv::FnvHasher; -use hashbrown::{HashMap, HashSet}; -use serde_test::{assert_tokens, Token}; - -// We use FnvHash for this test because we rely on the ordering -type FnvHashMap = HashMap>; -type FnvHashSet = HashSet>; - -#[test] -fn map_serde_tokens_empty() { - let map = FnvHashMap::::default(); - - assert_tokens(&map, &[Token::Map { len: Some(0) }, Token::MapEnd]); -} - -#[test] -fn map_serde_tokens() { - let mut map = FnvHashMap::default(); - map.insert('b', 20); - map.insert('a', 10); - map.insert('c', 30); - - assert_tokens( - &map, - &[ - Token::Map { len: Some(3) }, - Token::Char('a'), - Token::I32(10), - Token::Char('c'), - Token::I32(30), - Token::Char('b'), - Token::I32(20), - Token::MapEnd, - ], - ); -} - -#[test] -fn set_serde_tokens_empty() { - let set = FnvHashSet::::default(); - - assert_tokens(&set, &[Token::Seq { len: Some(0) }, Token::SeqEnd]); -} - -#[test] -fn set_serde_tokens() { - let mut set = FnvHashSet::default(); - set.insert(20); - set.insert(10); - set.insert(30); - - assert_tokens( - &set, - &[ - Token::Seq { len: Some(3) }, - Token::I32(30), - Token::I32(20), - Token::I32(10), - Token::SeqEnd, - ], - ); -} diff -Nru temporalio-1.3.0/vendor/hashbrown-0.13.2/tests/set.rs temporalio-1.3.0/vendor/hashbrown-0.13.2/tests/set.rs --- temporalio-1.3.0/vendor/hashbrown-0.13.2/tests/set.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/hashbrown-0.13.2/tests/set.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,34 +0,0 @@ -#![cfg(not(miri))] // FIXME: takes too long - -use hashbrown::HashSet; -use rand::{distributions::Alphanumeric, rngs::SmallRng, Rng, SeedableRng}; -use std::iter; - -#[test] -fn test_hashset_insert_remove() { - let mut m: HashSet> = HashSet::new(); - let seed = u64::from_le_bytes(*b"testseed"); - - let rng = &mut SmallRng::seed_from_u64(seed); - let tx: Vec> = iter::repeat_with(|| { - rng.sample_iter(&Alphanumeric) - .take(32) - .map(char::from) - .collect() - }) - .take(4096) - .collect(); - - // more readable with explicit `true` / `false` - #[allow(clippy::bool_assert_comparison)] - for _ in 0..32 { - for x in &tx { - assert_eq!(m.contains(x), false); - assert_eq!(m.insert(x.clone()), true); - } - for (i, x) in tx.iter().enumerate() { - println!("removing {} {:?}", i, x); - assert_eq!(m.remove(x), true); - } - } -} diff -Nru temporalio-1.3.0/vendor/hermit-abi/.cargo-checksum.json temporalio-1.3.0/vendor/hermit-abi/.cargo-checksum.json --- temporalio-1.3.0/vendor/hermit-abi/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/hermit-abi/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"Cargo.toml":"2fdd312de10adc759afb2008d22aa716f275f7ac82b517cafd2adfcf62fb4f14","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","README.md":"d18b009fb1ac087d121ce82ea4a0f557d63b8641f4be4316ad105b00bf85867d","src/errno.rs":"1c0680ead2ddf26b12d34bd7fa3e1dab386df761d6ac1901889ece26682dc465","src/lib.rs":"ce3e2dc736b3d369a80de2645ed5bb10779c236b5ad12e17d7e257d73780aada","src/tcplistener.rs":"1fb1c0c232d4f24afb6cff63a7541d00029b7159da8d25b2eb257dff078940a0","src/tcpstream.rs":"fce8a598c6331b82e40982eda079d758be324b8941bf76f1031cea8d01632823"},"package":"d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7"} \ No newline at end of file +{"files":{"Cargo.toml":"1e9a64af07914259270103fbf03bbb686a0a3f36a6b10bb9ae05fe84ffaba5b6","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","README.md":"322fadd63e558e5a10caf980cbedf83ac1546ba40fd992f54492e21ce54205af","src/errno.rs":"1c0680ead2ddf26b12d34bd7fa3e1dab386df761d6ac1901889ece26682dc465","src/lib.rs":"3d053b92d0e3d6ac3c94c0911106dd68c6e5f9ad253f704b6b5e1a7cf4a70d92","src/tcplistener.rs":"1fb1c0c232d4f24afb6cff63a7541d00029b7159da8d25b2eb257dff078940a0","src/tcpstream.rs":"fce8a598c6331b82e40982eda079d758be324b8941bf76f1031cea8d01632823"},"package":"443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/hermit-abi/Cargo.toml temporalio-1.3.0/vendor/hermit-abi/Cargo.toml --- temporalio-1.3.0/vendor/hermit-abi/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/hermit-abi/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -12,7 +12,7 @@ [package] edition = "2021" name = "hermit-abi" -version = "0.3.3" +version = "0.3.2" authors = ["Stefan Lankes"] description = "Hermit system calls definitions." readme = "README.md" @@ -22,7 +22,7 @@ ] categories = ["os"] license = "MIT OR Apache-2.0" -repository = "https://github.com/hermitcore/hermit-rs" +repository = "https://github.com/hermitcore/rusty-hermit" [dependencies.alloc] version = "1.0.0" diff -Nru temporalio-1.3.0/vendor/hermit-abi/README.md temporalio-1.3.0/vendor/hermit-abi/README.md --- temporalio-1.3.0/vendor/hermit-abi/README.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/hermit-abi/README.md 2023-10-30 19:40:00.000000000 +0000 @@ -1,12 +1,12 @@ # hermit-abi [![Crates.io](https://img.shields.io/crates/v/hermit-abi.svg)](https://crates.io/crates/hermit-abi) -[![Documentation](https://img.shields.io/badge/docs-latest-blue.svg)](https://hermitcore.github.io/hermit-rs/hermit_abi/) +[![Documentation](https://img.shields.io/badge/docs-latest-blue.svg)](https://hermitcore.github.io/rusty-hermit/hermit_abi/) [![License](https://img.shields.io/crates/l/hermit-abi.svg)](https://img.shields.io/crates/l/hermit-abi.svg) -This is small interface to call functions from the [Hermit kernel](https://github.com/hermitcore/kernel). +This is small interface to call functions from the unikernel [RustyHermit](https://github.com/hermitcore/libhermit-rs). -Please read the README of the [Hermit kernel](https://github.com/hermitcore/kernel) for more information. +Please read the README of [RustyHermit](https://github.com/hermitcore/libhermit-rs) for more information. ## License diff -Nru temporalio-1.3.0/vendor/hermit-abi/src/lib.rs temporalio-1.3.0/vendor/hermit-abi/src/lib.rs --- temporalio-1.3.0/vendor/hermit-abi/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/hermit-abi/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,5 +1,5 @@ -//! `hermit-abi` is small interface to call functions from the -//! [Hermit unikernel](https://github.com/hermitcore/kernel). +//! `hermit-abi` is small interface to call functions from the unikernel +//! [RustyHermit](https://github.com/hermitcore/libhermit-rs). #![no_std] #![allow(nonstandard_style)] @@ -252,58 +252,6 @@ pub revents: i16, /* events returned */ } -#[repr(C)] -pub struct dirent { - pub d_ino: u64, - pub d_off: u64, - pub d_namelen: u32, - pub d_type: u32, - pub d_name: [u8; 0], -} - -#[repr(C)] -#[derive(Copy, Clone, Debug)] -pub enum DirectoryEntry { - Invalid(i32), - Valid(*const dirent), -} - -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct stat { - pub st_dev: u64, - pub st_ino: u64, - pub st_nlink: u64, - pub st_mode: u32, - pub st_uid: u32, - pub st_gid: u32, - pub st_rdev: u64, - pub st_size: i64, - pub st_blksize: i64, - pub st_blocks: i64, - pub st_atime: i64, - pub st_atime_nsec: i64, - pub st_mtime: i64, - pub st_mtime_nsec: i64, - pub st_ctime: i64, - pub st_ctime_nsec: i64, -} - -pub const DT_UNKNOWN: u32 = 0; -pub const DT_FIFO: u32 = 1; -pub const DT_CHR: u32 = 2; -pub const DT_DIR: u32 = 4; -pub const DT_BLK: u32 = 6; -pub const DT_REG: u32 = 8; -pub const DT_LNK: u32 = 10; -pub const DT_SOCK: u32 = 12; -pub const DT_WHT: u32 = 14; - -pub const S_IFDIR: u32 = 16384; -pub const S_IFREG: u32 = 32768; -pub const S_IFLNK: u32 = 40960; -pub const S_IFMT: u32 = 61440; - // sysmbols, which are part of the library operating system extern "C" { /// If the value at address matches the expected value, park the current thread until it is either @@ -461,32 +409,10 @@ #[link_name = "sys_open"] pub fn open(name: *const i8, flags: i32, mode: i32) -> i32; - /// open a directory - /// - /// The opendir() system call opens the directory specified by `name`. - #[link_name = "sys_opendir"] - pub fn opendir(name: *const i8) -> i32; - /// delete the file it refers to `name` #[link_name = "sys_unlink"] pub fn unlink(name: *const i8) -> i32; - /// remove directory it refers to `name` - #[link_name = "sys_rmdir"] - pub fn rmdir(name: *const i8) -> i32; - - /// stat - #[link_name = "sys_stat"] - pub fn stat(name: *const i8, stat: *mut stat) -> i32; - - /// lstat - #[link_name = "sys_lstat"] - pub fn lstat(name: *const i8, stat: *mut stat) -> i32; - - /// fstat - #[link_name = "sys_fstat"] - pub fn fstat(fd: i32, stat: *mut stat) -> i32; - /// determines the number of activated processors #[link_name = "sys_get_processor_count"] pub fn get_processor_count() -> usize; @@ -559,17 +485,6 @@ #[link_name = "sys_read"] pub fn read(fd: i32, buf: *mut u8, len: usize) -> isize; - /// 'readdir' returns a pointer to a dirent structure - /// representing the next directory entry in the directory stream - /// pointed to by the file descriptor - #[link_name = "sys_readdir"] - pub fn readdir(fd: i32) -> DirectoryEntry; - - /// 'mkdir' attempts to create a directory, - /// it returns 0 on success and -1 on error - #[link_name = "sys_mkdir"] - pub fn mkdir(name: *const i8, mode: u32) -> i32; - /// Fill `len` bytes in `buf` with cryptographically secure random data. /// /// Returns either the number of bytes written to buf (a positive value) or diff -Nru temporalio-1.3.0/vendor/home/.cargo-checksum.json temporalio-1.3.0/vendor/home/.cargo-checksum.json --- temporalio-1.3.0/vendor/home/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/home/.cargo-checksum.json 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -{"files":{"Cargo.toml":"2e05a776e06aef93bcc4e952c0d461155c62a720b98e3b5acf50bb5f432979c2","LICENSE-APACHE":"8ada45cd9f843acf64e4722ae262c622a2b3b3007c7310ef36ac1061a30f6adb","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","README.md":"132d9e72011322528376c46965004ffb3d1be30841eb6ff5683a4a75deb35b37","src/env.rs":"4e8bd91330f6ae948f5b825e9884720631f4fe9282fb4548915218e1c43b54a5","src/lib.rs":"e884458a0797dcc70333b61c32503509659c165e81ee770553b616176b00df2c","src/windows.rs":"8eecb82021862b4fd04a1f85e14ad5069d8e49c68bb6bcddc57ae598b5bae826"},"package":"5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/home/Cargo.toml temporalio-1.3.0/vendor/home/Cargo.toml --- temporalio-1.3.0/vendor/home/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/home/Cargo.toml 1970-01-01 00:00:00.000000000 +0000 @@ -1,36 +0,0 @@ -# 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 = "home" -version = "0.5.5" -authors = ["Brian Anderson "] -include = [ - "/src", - "/Cargo.toml", - "/CHANGELOG", - "/LICENSE-*", - "/README.md", -] -description = "Shared definitions of home directories." -documentation = "https://docs.rs/home" -readme = "README.md" -license = "MIT OR Apache-2.0" -repository = "https://github.com/rust-lang/cargo" -resolver = "2" - -[target."cfg(windows)".dependencies.windows-sys] -version = "0.48.0" -features = [ - "Win32_Foundation", - "Win32_UI_Shell", -] diff -Nru temporalio-1.3.0/vendor/home/LICENSE-APACHE temporalio-1.3.0/vendor/home/LICENSE-APACHE --- temporalio-1.3.0/vendor/home/LICENSE-APACHE 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/home/LICENSE-APACHE 1970-01-01 00:00:00.000000000 +0000 @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - https://www.apache.org/licenses/LICENSE-2.0 - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - -Copyright [yyyy] [name of copyright owner] - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - https://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff -Nru temporalio-1.3.0/vendor/home/LICENSE-MIT temporalio-1.3.0/vendor/home/LICENSE-MIT --- temporalio-1.3.0/vendor/home/LICENSE-MIT 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/home/LICENSE-MIT 1970-01-01 00:00:00.000000000 +0000 @@ -1,23 +0,0 @@ -Permission is hereby granted, free of charge, to any -person obtaining a copy of this software and associated -documentation files (the "Software"), to deal in the -Software without restriction, including without -limitation the rights to use, copy, modify, merge, -publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software -is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice -shall be included in all copies or substantial portions -of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. diff -Nru temporalio-1.3.0/vendor/home/README.md temporalio-1.3.0/vendor/home/README.md --- temporalio-1.3.0/vendor/home/README.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/home/README.md 1970-01-01 00:00:00.000000000 +0000 @@ -1,27 +0,0 @@ -[![Documentation](https://docs.rs/home/badge.svg)](https://docs.rs/home) -[![crates.io](https://img.shields.io/crates/v/home.svg)](https://crates.io/crates/home) - -Canonical definitions of `home_dir`, `cargo_home`, and `rustup_home`. - -This provides the definition of `home_dir` used by Cargo and rustup, -as well functions to find the correct value of `CARGO_HOME` and -`RUSTUP_HOME`. - -The definition of `home_dir` provided by the standard library is -incorrect because it considers the `HOME` environment variable on -Windows. This causes surprising situations where a Rust program will -behave differently depending on whether it is run under a Unix -emulation environment like Cygwin or MinGW. Neither Cargo nor rustup -use the standard library's definition - they use the definition here. - -This crate further provides two functions, `cargo_home` and -`rustup_home`, which are the canonical way to determine the location -that Cargo and rustup store their data. - -See [rust-lang/rust#43321]. - -[rust-lang/rust#43321]: https://github.com/rust-lang/rust/issues/43321 - -## License - -MIT OR Apache-2.0 diff -Nru temporalio-1.3.0/vendor/home/src/env.rs temporalio-1.3.0/vendor/home/src/env.rs --- temporalio-1.3.0/vendor/home/src/env.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/home/src/env.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,106 +0,0 @@ -//! Lower-level utilities for mocking the process environment. - -use std::{ - ffi::OsString, - io, - path::{Path, PathBuf}, -}; - -/// Permits parameterizing the home functions via the _from variants - used for -/// in-process unit testing by rustup. -pub trait Env { - /// Return the path to the the users home dir, or None if any error occurs: - /// see home_inner. - fn home_dir(&self) -> Option; - /// Return the current working directory. - fn current_dir(&self) -> io::Result; - /// Get an environment variable, as per std::env::var_os. - fn var_os(&self, key: &str) -> Option; -} - -/// Implements Env for the OS context, both Unix style and Windows. -/// -/// This is trait permits in-process testing by providing a control point to -/// allow in-process divergence on what is normally process wide state. -/// -/// Implementations should be provided by whatever testing framework the caller -/// is using. Code that is not performing in-process threaded testing requiring -/// isolated rustup/cargo directories does not need this trait or the _from -/// functions. -pub struct OsEnv; -impl Env for OsEnv { - fn home_dir(&self) -> Option { - crate::home_dir_inner() - } - fn current_dir(&self) -> io::Result { - std::env::current_dir() - } - fn var_os(&self, key: &str) -> Option { - std::env::var_os(key) - } -} - -pub const OS_ENV: OsEnv = OsEnv {}; - -/// Returns the path of the current user's home directory from [`Env::home_dir`]. -pub fn home_dir_with_env(env: &dyn Env) -> Option { - env.home_dir() -} - -/// Variant of cargo_home where the environment source is parameterized. This is -/// specifically to support in-process testing scenarios as environment -/// variables and user home metadata are normally process global state. See the -/// [`Env`] trait. -pub fn cargo_home_with_env(env: &dyn Env) -> io::Result { - let cwd = env.current_dir()?; - cargo_home_with_cwd_env(env, &cwd) -} - -/// Variant of cargo_home_with_cwd where the environment source is -/// parameterized. This is specifically to support in-process testing scenarios -/// as environment variables and user home metadata are normally process global -/// state. See the OsEnv trait. -pub fn cargo_home_with_cwd_env(env: &dyn Env, cwd: &Path) -> io::Result { - match env.var_os("CARGO_HOME").filter(|h| !h.is_empty()) { - Some(home) => { - let home = PathBuf::from(home); - if home.is_absolute() { - Ok(home) - } else { - Ok(cwd.join(&home)) - } - } - _ => home_dir_with_env(env) - .map(|p| p.join(".cargo")) - .ok_or_else(|| io::Error::new(io::ErrorKind::Other, "could not find cargo home dir")), - } -} - -/// Variant of cargo_home_with_cwd where the environment source is -/// parameterized. This is specifically to support in-process testing scenarios -/// as environment variables and user home metadata are normally process global -/// state. See the OsEnv trait. -pub fn rustup_home_with_env(env: &dyn Env) -> io::Result { - let cwd = env.current_dir()?; - rustup_home_with_cwd_env(env, &cwd) -} - -/// Variant of cargo_home_with_cwd where the environment source is -/// parameterized. This is specifically to support in-process testing scenarios -/// as environment variables and user home metadata are normally process global -/// state. See the OsEnv trait. -pub fn rustup_home_with_cwd_env(env: &dyn Env, cwd: &Path) -> io::Result { - match env.var_os("RUSTUP_HOME").filter(|h| !h.is_empty()) { - Some(home) => { - let home = PathBuf::from(home); - if home.is_absolute() { - Ok(home) - } else { - Ok(cwd.join(&home)) - } - } - _ => home_dir_with_env(env) - .map(|d| d.join(".rustup")) - .ok_or_else(|| io::Error::new(io::ErrorKind::Other, "could not find rustup home dir")), - } -} diff -Nru temporalio-1.3.0/vendor/home/src/lib.rs temporalio-1.3.0/vendor/home/src/lib.rs --- temporalio-1.3.0/vendor/home/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/home/src/lib.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,149 +0,0 @@ -//! Canonical definitions of `home_dir`, `cargo_home`, and `rustup_home`. -//! -//! This provides the definition of `home_dir` used by Cargo and -//! rustup, as well functions to find the correct value of -//! `CARGO_HOME` and `RUSTUP_HOME`. -//! -//! See also the [`dirs`](https://docs.rs/dirs) crate. -//! -//! _Note that as of 2019/08/06 it appears that cargo uses this crate. And -//! rustup has used this crate since 2019/08/21._ -//! -//! The definition of `home_dir` provided by the standard library is -//! incorrect because it considers the `HOME` environment variable on -//! Windows. This causes surprising situations where a Rust program -//! will behave differently depending on whether it is run under a -//! Unix emulation environment like Cygwin or MinGW. Neither Cargo nor -//! rustup use the standard libraries definition - they use the -//! definition here. -//! -//! This crate further provides two functions, `cargo_home` and -//! `rustup_home`, which are the canonical way to determine the -//! location that Cargo and rustup store their data. -//! -//! See also this [discussion]. -//! -//! [discussion]: https://github.com/rust-lang/rust/pull/46799#issuecomment-361156935 - -#![doc(html_root_url = "https://docs.rs/home/0.5.5")] -#![deny(rust_2018_idioms)] - -pub mod env; - -#[cfg(target_os = "windows")] -mod windows; - -use std::io; -use std::path::{Path, PathBuf}; - -/// Returns the path of the current user's home directory if known. -/// -/// # Unix -/// -/// Returns the value of the `HOME` environment variable if it is set -/// and not equal to the empty string. Otherwise, it tries to determine the -/// home directory by invoking the `getpwuid_r` function on the UID of the -/// current user. -/// -/// # Windows -/// -/// Returns the value of the `USERPROFILE` environment variable if it -/// is set and not equal to the empty string. If both do not exist, -/// [`SHGetFolderPathW`][msdn] is used to return the appropriate path. -/// -/// [msdn]: https://docs.microsoft.com/en-us/windows/win32/api/shlobj_core/nf-shlobj_core-shgetfolderpathw -/// -/// # Examples -/// -/// ``` -/// match home::home_dir() { -/// Some(path) => println!("{}", path.display()), -/// None => println!("Impossible to get your home dir!"), -/// } -/// ``` -pub fn home_dir() -> Option { - env::home_dir_with_env(&env::OS_ENV) -} - -#[cfg(windows)] -use windows::home_dir_inner; - -#[cfg(any(unix, target_os = "redox"))] -fn home_dir_inner() -> Option { - #[allow(deprecated)] - std::env::home_dir() -} - -/// Returns the storage directory used by Cargo, often knowns as -/// `.cargo` or `CARGO_HOME`. -/// -/// It returns one of the following values, in this order of -/// preference: -/// -/// - The value of the `CARGO_HOME` environment variable, if it is -/// an absolute path. -/// - The value of the current working directory joined with the value -/// of the `CARGO_HOME` environment variable, if `CARGO_HOME` is a -/// relative directory. -/// - The `.cargo` directory in the user's home directory, as reported -/// by the `home_dir` function. -/// -/// # Errors -/// -/// This function fails if it fails to retrieve the current directory, -/// or if the home directory cannot be determined. -/// -/// # Examples -/// -/// ``` -/// match home::cargo_home() { -/// Ok(path) => println!("{}", path.display()), -/// Err(err) => eprintln!("Cannot get your cargo home dir: {:?}", err), -/// } -/// ``` -pub fn cargo_home() -> io::Result { - env::cargo_home_with_env(&env::OS_ENV) -} - -/// Returns the storage directory used by Cargo within `cwd`. -/// For more details, see [`cargo_home`](fn.cargo_home.html). -pub fn cargo_home_with_cwd(cwd: &Path) -> io::Result { - env::cargo_home_with_cwd_env(&env::OS_ENV, cwd) -} - -/// Returns the storage directory used by rustup, often knowns as -/// `.rustup` or `RUSTUP_HOME`. -/// -/// It returns one of the following values, in this order of -/// preference: -/// -/// - The value of the `RUSTUP_HOME` environment variable, if it is -/// an absolute path. -/// - The value of the current working directory joined with the value -/// of the `RUSTUP_HOME` environment variable, if `RUSTUP_HOME` is a -/// relative directory. -/// - The `.rustup` directory in the user's home directory, as reported -/// by the `home_dir` function. -/// -/// # Errors -/// -/// This function fails if it fails to retrieve the current directory, -/// or if the home directory cannot be determined. -/// -/// # Examples -/// -/// ``` -/// match home::rustup_home() { -/// Ok(path) => println!("{}", path.display()), -/// Err(err) => eprintln!("Cannot get your rustup home dir: {:?}", err), -/// } -/// ``` -pub fn rustup_home() -> io::Result { - env::rustup_home_with_env(&env::OS_ENV) -} - -/// Returns the storage directory used by rustup within `cwd`. -/// For more details, see [`rustup_home`](fn.rustup_home.html). -pub fn rustup_home_with_cwd(cwd: &Path) -> io::Result { - env::rustup_home_with_cwd_env(&env::OS_ENV, cwd) -} diff -Nru temporalio-1.3.0/vendor/home/src/windows.rs temporalio-1.3.0/vendor/home/src/windows.rs --- temporalio-1.3.0/vendor/home/src/windows.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/home/src/windows.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,66 +0,0 @@ -use std::env; -use std::ffi::OsString; -use std::os::windows::ffi::OsStringExt; -use std::path::PathBuf; - -use windows_sys::Win32::Foundation::{MAX_PATH, S_OK}; -use windows_sys::Win32::UI::Shell::{SHGetFolderPathW, CSIDL_PROFILE}; - -pub fn home_dir_inner() -> Option { - env::var_os("USERPROFILE") - .filter(|s| !s.is_empty()) - .map(PathBuf::from) - .or_else(home_dir_crt) -} - -#[cfg(not(target_vendor = "uwp"))] -fn home_dir_crt() -> Option { - unsafe { - let mut path: Vec = Vec::with_capacity(MAX_PATH as usize); - match SHGetFolderPathW(0, CSIDL_PROFILE as i32, 0, 0, path.as_mut_ptr()) { - S_OK => { - let len = wcslen(path.as_ptr()); - path.set_len(len); - let s = OsString::from_wide(&path); - Some(PathBuf::from(s)) - } - _ => None, - } - } -} - -#[cfg(target_vendor = "uwp")] -fn home_dir_crt() -> Option { - None -} - -extern "C" { - fn wcslen(buf: *const u16) -> usize; -} - -#[cfg(not(target_vendor = "uwp"))] -#[cfg(test)] -mod tests { - use super::home_dir_inner; - use std::env; - use std::ops::Deref; - use std::path::{Path, PathBuf}; - - #[test] - fn test_with_without() { - let olduserprofile = env::var_os("USERPROFILE").unwrap(); - - env::remove_var("HOME"); - env::remove_var("USERPROFILE"); - - assert_eq!(home_dir_inner(), Some(PathBuf::from(olduserprofile))); - - let home = Path::new(r"C:\Users\foo tar baz"); - - env::set_var("HOME", home.as_os_str()); - assert_ne!(home_dir_inner().as_ref().map(Deref::deref), Some(home)); - - env::set_var("USERPROFILE", home.as_os_str()); - assert_eq!(home_dir_inner().as_ref().map(Deref::deref), Some(home)); - } -} diff -Nru temporalio-1.3.0/vendor/hyper-rustls/.cargo-checksum.json temporalio-1.3.0/vendor/hyper-rustls/.cargo-checksum.json --- temporalio-1.3.0/vendor/hyper-rustls/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/hyper-rustls/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"Cargo.lock":"67de9dbdc98d2c6d085a43150c9d01b0fba3895c80c3f2f96eb17fa28048e9ab","Cargo.toml":"6638e5eaa83b980e409f3b4119b5c7026b2ea533a24a3f3045846b666dd6e11f","LICENSE":"d1ef92123fc699442e1e8d971fe84921947efc8d9a1249ab037f1e661a972a6d","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-ISC":"7cfafc877eccc46c0e346ccbaa5c51bb6b894d2b818e617d970211e232785ad4","LICENSE-MIT":"709e3175b4212f7b13aa93971c9f62ff8c69ec45ad8c6532a7e0c41d7a7d6f8c","README.md":"595ae724eca4c113b1b5f4bbfb3241c9823d9b017df0612579317933d7b65780","RELEASING.md":"01733c2c7ba9966525a0df69ba0c634d5accdeb3aaca466410134fbd6a8e6c03","examples/client.rs":"8f5a14b5cfac8bc9331556a63bc86a760ed0b6ede1b90f24c322ff2cea33eec5","examples/openssl.cnf":"cfa19da355f64e20f0ed90deae3a4cea3fc644bab79955e555b6801d028a81b9","examples/refresh-certificates.sh":"00a421b85e88f794926ce8faf645b1ceeae65029675cf039b3c21d6735dd37ee","examples/sample.pem":"61696c7bd7f3f700d4befb40f5d335adff3f98d8bcf07b76a06387de4faa51e9","examples/sample.rsa":"bca5b33775fffe53d6e4bcdc3d8b33fcfb9cd4cc40bb6e38a0c2761a84c64fcf","examples/server.rs":"a50c9e3b334c36f7a258ad8b590cc7e6bd4d77a8bba3f8d64cac3b4206862246","src/acceptor.rs":"9314b649f304317068f21157b551db3bf083d5c68288e1ed86692f09c0c8a7e7","src/acceptor/builder.rs":"15bf2ff17056398c816a8f226e9d2cc5ba362f0493690bf9d36aa24f3bf4c8ef","src/config.rs":"131465188198c11702b87f4532fc464a99f0e80e4215d2eead24aa46b2dd1f86","src/connector.rs":"365bb773e8b3462513ca34cd99a16d924e8685183f1ddd98dccda3692fed00d2","src/connector/builder.rs":"a611d400b064c964418c60768f408ad073c942179601fe559c0d9e66bcf5f4c0","src/lib.rs":"494f9f545a64ec263eaf1661d0ead66e2293988c90e63d237e5a788b3b0799ed","src/stream.rs":"817ee9e8a024555b40087e41aa555a4b208f350d996383cf5df1c078bf6c6721","tests/tests.rs":"bfe2a34ed347d2ce8ae073cfdea51bd4dc4b5cc89d234404d6ba67dc18fc0938"},"package":"ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590"} \ No newline at end of file +{"files":{"Cargo.lock":"841e879e0ef35ed0d6aaac2fb0a1f4fab38fc2423d0cfd6caa6078629f31e26b","Cargo.toml":"b8c8fad171bc3ac276c5b08b21f3aaf79ada2a9d0d2b0382d794890d785b6ef7","LICENSE":"d1ef92123fc699442e1e8d971fe84921947efc8d9a1249ab037f1e661a972a6d","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-ISC":"7cfafc877eccc46c0e346ccbaa5c51bb6b894d2b818e617d970211e232785ad4","LICENSE-MIT":"709e3175b4212f7b13aa93971c9f62ff8c69ec45ad8c6532a7e0c41d7a7d6f8c","README.md":"595ae724eca4c113b1b5f4bbfb3241c9823d9b017df0612579317933d7b65780","RELEASING.md":"01733c2c7ba9966525a0df69ba0c634d5accdeb3aaca466410134fbd6a8e6c03","examples/client.rs":"8f5a14b5cfac8bc9331556a63bc86a760ed0b6ede1b90f24c322ff2cea33eec5","examples/openssl.cnf":"cfa19da355f64e20f0ed90deae3a4cea3fc644bab79955e555b6801d028a81b9","examples/refresh-certificates.sh":"00a421b85e88f794926ce8faf645b1ceeae65029675cf039b3c21d6735dd37ee","examples/sample.pem":"61696c7bd7f3f700d4befb40f5d335adff3f98d8bcf07b76a06387de4faa51e9","examples/sample.rsa":"bca5b33775fffe53d6e4bcdc3d8b33fcfb9cd4cc40bb6e38a0c2761a84c64fcf","examples/server.rs":"a50c9e3b334c36f7a258ad8b590cc7e6bd4d77a8bba3f8d64cac3b4206862246","src/acceptor.rs":"ccbc510350326caa22dffc46b9ebb16c99b31867a1b524198ba56bb24ef8b15d","src/acceptor/builder.rs":"495673019dfe0f6c3fe4e092ebf2ce9c9c06e45a02f53f9ad9443741c4880fdf","src/config.rs":"cd23e64f326b7aea7efdeb3d412b3d351c304ff4279008fcbede175c374755cf","src/connector.rs":"6eefb83e4174fdecc06300df358026ec36034679974ff432f7af341f7cd09e4c","src/connector/builder.rs":"13129dd6dc0dacd4c8d0d194293903f1c9a329e94f14667838bfc3b1d761a2f6","src/lib.rs":"895306fe92a870c0c4f7f1e6f5af2acde46b890f495d8ac90008a2e4d84252bc","src/stream.rs":"75a3b59d0a6d97dc1b2011a0f51bbf981ba9c2a00884b27d80cdb74272c91355","tests/tests.rs":"c83918a9753fa4b4ad7caef339300edac65f2dde551bd1422f0770a41c60aa21"},"package":"8d78e1e73ec14cf7375674f74d7dde185c8206fd9dea6fb6295e8a98098aaa97"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/hyper-rustls/Cargo.lock temporalio-1.3.0/vendor/hyper-rustls/Cargo.lock --- temporalio-1.3.0/vendor/hyper-rustls/Cargo.lock 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/hyper-rustls/Cargo.lock 2023-10-30 19:40:00.000000000 +0000 @@ -4,9 +4,9 @@ [[package]] name = "addr2line" -version = "0.21.0" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +checksum = "f4fa78e18c64fce05e902adecd7a5eed15a5e0a3439f7b0e169f0252214865e3" dependencies = [ "gimli", ] @@ -25,9 +25,9 @@ [[package]] name = "backtrace" -version = "0.3.69" +version = "0.3.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +checksum = "4319208da049c43661739c5fade2ba182f09d1dc2299b32298d3a31692b17e12" dependencies = [ "addr2line", "cc", @@ -40,9 +40,9 @@ [[package]] name = "base64" -version = "0.21.5" +version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" +checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" [[package]] name = "bitflags" @@ -51,19 +51,22 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] +name = "bumpalo" +version = "3.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" + +[[package]] name = "bytes" -version = "1.5.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" +checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" [[package]] name = "cc" -version = "1.0.83" +version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" -dependencies = [ - "libc", -] +checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" [[package]] name = "cfg-if" @@ -95,65 +98,67 @@ [[package]] name = "futures-channel" -version = "0.3.29" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb" +checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" dependencies = [ "futures-core", ] [[package]] name = "futures-core" -version = "0.3.29" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" +checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" + +[[package]] +name = "futures-macro" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] [[package]] name = "futures-sink" -version = "0.3.29" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817" +checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" [[package]] name = "futures-task" -version = "0.3.29" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2" +checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" [[package]] name = "futures-util" -version = "0.3.29" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104" +checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" dependencies = [ "futures-core", + "futures-macro", "futures-task", "pin-project-lite", "pin-utils", -] - -[[package]] -name = "getrandom" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" -dependencies = [ - "cfg-if", - "libc", - "wasi", + "slab", ] [[package]] name = "gimli" -version = "0.28.0" +version = "0.27.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" +checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" [[package]] name = "h2" -version = "0.3.21" +version = "0.3.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91fc23aa11be92976ef4729127f1a74adf36d8436f7816b185d18df956790833" +checksum = "97ec8491ebaf99c8eaa73058b045fe58073cd6be7f596ac993ced0b0a0c01049" dependencies = [ "bytes", "fnv", @@ -176,9 +181,9 @@ [[package]] name = "hermit-abi" -version = "0.3.3" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" +checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" [[package]] name = "http" @@ -210,9 +215,9 @@ [[package]] name = "httpdate" -version = "1.0.3" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" +checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" [[package]] name = "hyper" @@ -231,7 +236,7 @@ "httpdate", "itoa", "pin-project-lite", - "socket2 0.4.10", + "socket2", "tokio", "tower-service", "tracing", @@ -240,7 +245,7 @@ [[package]] name = "hyper-rustls" -version = "0.24.2" +version = "0.24.1" dependencies = [ "futures-util", "http", @@ -266,27 +271,36 @@ [[package]] name = "itoa" -version = "1.0.9" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" +checksum = "62b02a5381cc465bd3041d84623d0fa3b66738b52b8e2fc3bab8ad63ab032f4a" + +[[package]] +name = "js-sys" +version = "0.3.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" +dependencies = [ + "wasm-bindgen", +] [[package]] name = "libc" -version = "0.2.149" +version = "0.2.147" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a08173bc88b7955d1b3145aa561539096c421ac8debde8cbc3612ec635fee29b" +checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" [[package]] name = "log" -version = "0.4.20" +version = "0.4.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" [[package]] name = "memchr" -version = "2.6.4" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" [[package]] name = "miniz_oxide" @@ -299,9 +313,9 @@ [[package]] name = "mio" -version = "0.8.9" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0" +checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" dependencies = [ "libc", "wasi", @@ -320,9 +334,9 @@ [[package]] name = "object" -version = "0.32.1" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" +checksum = "8bda667d9f2b5051b8833f59f3bf748b28ef54f850f4fcb389a252aa383866d1" dependencies = [ "memchr", ] @@ -341,9 +355,9 @@ [[package]] name = "pin-project-lite" -version = "0.2.13" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" +checksum = "4c40d25201921e5ff0c862a505c6557ea88568a4e3ace775ab55e93f2f4f9d57" [[package]] name = "pin-utils" @@ -353,34 +367,35 @@ [[package]] name = "proc-macro2" -version = "1.0.69" +version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da" +checksum = "7b368fba921b0dce7e60f5e04ec15e565b3303972b42bcfde1d0713b881959eb" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.33" +version = "1.0.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +checksum = "573015e8ab27661678357f27dc26460738fd2b6c86e46f386fde94cb5d913105" dependencies = [ "proc-macro2", ] [[package]] name = "ring" -version = "0.17.5" +version = "0.16.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb0205304757e5d899b9c2e448b867ffd03ae7f988002e47cd24954391394d0b" +checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" dependencies = [ "cc", - "getrandom", "libc", + "once_cell", "spin", "untrusted", - "windows-sys", + "web-sys", + "winapi", ] [[package]] @@ -391,9 +406,9 @@ [[package]] name = "rustls" -version = "0.21.8" +version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "446e14c5cda4f3f30fe71863c34ec70f5ac79d6087097ad0bb433e1be5edf04c" +checksum = "e32ca28af694bc1bbf399c33a516dbdf1c90090b8ab23c2bc24f834aa2247f5f" dependencies = [ "log", "ring", @@ -424,9 +439,9 @@ [[package]] name = "rustls-webpki" -version = "0.101.7" +version = "0.100.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" +checksum = "d6207cd5ed3d8dca7816f8f3725513a34609c0c765bf652b8c3cb4cfd87db46b" dependencies = [ "ring", "untrusted", @@ -443,9 +458,9 @@ [[package]] name = "sct" -version = "0.7.1" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" +checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" dependencies = [ "ring", "untrusted", @@ -453,9 +468,9 @@ [[package]] name = "security-framework" -version = "2.9.2" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" +checksum = "1fc758eb7bffce5b308734e9b0c1468893cae9ff70ebf13e7090be8dcbcc83a8" dependencies = [ "bitflags", "core-foundation", @@ -466,9 +481,9 @@ [[package]] name = "security-framework-sys" -version = "2.9.1" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" +checksum = "f51d0c0d83bec45f16480d0ce0058397a69e48fcdc52d1dc8855fb68acbd31a7" dependencies = [ "core-foundation-sys", "libc", @@ -476,44 +491,34 @@ [[package]] name = "slab" -version = "0.4.9" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" dependencies = [ "autocfg", ] [[package]] name = "socket2" -version = "0.4.10" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" +checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" dependencies = [ "libc", "winapi", ] [[package]] -name = "socket2" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" -dependencies = [ - "libc", - "windows-sys", -] - -[[package]] name = "spin" -version = "0.9.8" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" [[package]] name = "syn" -version = "2.0.38" +version = "2.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e96b79aaa137db8f61e26363a0c9b47d8b4ec75da28b7d1d614c2303e232408b" +checksum = "59fb7d6d8281a51045d62b8eb3a7d1ce347b76f312af50cd3dc0af39c87c1737" dependencies = [ "proc-macro2", "quote", @@ -522,17 +527,18 @@ [[package]] name = "tokio" -version = "1.33.0" +version = "1.29.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f38200e3ef7995e5ef13baec2f432a6da0aa9ac495b2c0e8f3b7eec2c92d653" +checksum = "532826ff75199d5833b9d2c5fe410f29235e25704ee5f0ef599fb51c21f4a4da" dependencies = [ + "autocfg", "backtrace", "bytes", "libc", "mio", "num_cpus", "pin-project-lite", - "socket2 0.5.5", + "socket2", "tokio-macros", "windows-sys", ] @@ -560,9 +566,9 @@ [[package]] name = "tokio-util" -version = "0.7.10" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" +checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" dependencies = [ "bytes", "futures-core", @@ -580,19 +586,20 @@ [[package]] name = "tracing" -version = "0.1.40" +version = "0.1.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" dependencies = [ + "cfg-if", "pin-project-lite", "tracing-core", ] [[package]] name = "tracing-core" -version = "0.1.32" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" dependencies = [ "once_cell", ] @@ -605,15 +612,15 @@ [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +checksum = "22049a19f4a68748a168c0fc439f9516686aa045927ff767eca0a85101fb6e73" [[package]] name = "untrusted" -version = "0.9.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" [[package]] name = "want" @@ -631,10 +638,77 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] +name = "wasm-bindgen" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" + +[[package]] +name = "web-sys" +version = "0.3.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] name = "webpki-roots" -version = "0.25.2" +version = "0.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14247bb57be4f377dfb94c72830b8ce8fc6beac03cf4bf7b9732eadd414123fc" +checksum = "b03058f88386e5ff5310d9111d53f48b17d732b401aeb83a8d5190f2ac459338" +dependencies = [ + "rustls-webpki", +] [[package]] name = "winapi" @@ -669,9 +743,9 @@ [[package]] name = "windows-targets" -version = "0.48.5" +version = "0.48.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" dependencies = [ "windows_aarch64_gnullvm", "windows_aarch64_msvc", @@ -684,42 +758,42 @@ [[package]] name = "windows_aarch64_gnullvm" -version = "0.48.5" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" +checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" [[package]] name = "windows_aarch64_msvc" -version = "0.48.5" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" +checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" [[package]] name = "windows_i686_gnu" -version = "0.48.5" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" +checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" [[package]] name = "windows_i686_msvc" -version = "0.48.5" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" +checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" [[package]] name = "windows_x86_64_gnu" -version = "0.48.5" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" +checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" [[package]] name = "windows_x86_64_gnullvm" -version = "0.48.5" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" +checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" [[package]] name = "windows_x86_64_msvc" -version = "0.48.5" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" +checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" diff -Nru temporalio-1.3.0/vendor/hyper-rustls/Cargo.toml temporalio-1.3.0/vendor/hyper-rustls/Cargo.toml --- temporalio-1.3.0/vendor/hyper-rustls/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/hyper-rustls/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -11,9 +11,9 @@ [package] edition = "2021" -rust-version = "1.63" +rust-version = "1.60" name = "hyper-rustls" -version = "0.24.2" +version = "0.24.1" description = "Rustls+hyper integration for pure rust HTTPS" homepage = "https://github.com/rustls/hyper-rustls" documentation = "https://docs.rs/hyper-rustls/" @@ -46,7 +46,6 @@ [dependencies.futures-util] version = "0.3" -default-features = false [dependencies.http] version = "0.2" @@ -61,7 +60,7 @@ optional = true [dependencies.rustls] -version = "0.21.6" +version = "0.21.0" default-features = false [dependencies.rustls-native-certs] @@ -76,9 +75,13 @@ default-features = false [dependencies.webpki-roots] -version = "0.25" +version = "0.23" optional = true +[dev-dependencies.futures-util] +version = "0.3.1" +default-features = false + [dev-dependencies.hyper] version = "0.14" features = ["full"] diff -Nru temporalio-1.3.0/vendor/hyper-rustls/src/acceptor/builder.rs temporalio-1.3.0/vendor/hyper-rustls/src/acceptor/builder.rs --- temporalio-1.3.0/vendor/hyper-rustls/src/acceptor/builder.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/hyper-rustls/src/acceptor/builder.rs 2023-10-30 19:40:00.000000000 +0000 @@ -90,17 +90,9 @@ /// Passes a [`AddrIncoming`] to configure the TLS connection and /// creates the [`TlsAcceptor`] pub fn with_incoming(self, incoming: impl Into) -> TlsAcceptor { - self.with_acceptor(incoming.into()) - } - - /// Passes an acceptor implementing [`Accept`] to configure the TLS connection and - /// creates the [`TlsAcceptor`] - /// - /// [`Accept`]: hyper::server::accept::Accept - pub fn with_acceptor(self, acceptor: A) -> TlsAcceptor { TlsAcceptor { config: Arc::new(self.0 .0), - acceptor, + incoming: incoming.into(), } } } diff -Nru temporalio-1.3.0/vendor/hyper-rustls/src/acceptor.rs temporalio-1.3.0/vendor/hyper-rustls/src/acceptor.rs --- temporalio-1.3.0/vendor/hyper-rustls/src/acceptor.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/hyper-rustls/src/acceptor.rs 2023-10-30 19:40:00.000000000 +0000 @@ -9,163 +9,131 @@ accept::Accept, conn::{AddrIncoming, AddrStream}, }; -use rustls::{ServerConfig, ServerConnection}; +use rustls::ServerConfig; use tokio::io::{AsyncRead, AsyncWrite, ReadBuf}; mod builder; pub use builder::AcceptorBuilder; use builder::WantsTlsConfig; -/// A TLS acceptor that can be used with hyper servers. -pub struct TlsAcceptor { - config: Arc, - acceptor: A, +enum State { + Handshaking(tokio_rustls::Accept), + Streaming(tokio_rustls::server::TlsStream), } -/// An Acceptor for the `https` scheme. -impl TlsAcceptor { - /// Provides a builder for a `TlsAcceptor`. - pub fn builder() -> AcceptorBuilder { - AcceptorBuilder::new() - } - - /// Creates a new `TlsAcceptor` from a `ServerConfig` and an `AddrIncoming`. - pub fn new(config: Arc, incoming: AddrIncoming) -> Self { - Self { - config, - acceptor: incoming, - } - } -} - -impl Accept for TlsAcceptor -where - A: Accept + Unpin, - A::Conn: AsyncRead + AsyncWrite + Unpin, -{ - type Conn = TlsStream; - type Error = io::Error; - - fn poll_accept( - self: Pin<&mut Self>, - cx: &mut Context<'_>, - ) -> Poll>> { - let pin = self.get_mut(); - Poll::Ready(match ready!(Pin::new(&mut pin.acceptor).poll_accept(cx)) { - Some(Ok(sock)) => Some(Ok(TlsStream::new(sock, pin.config.clone()))), - Some(Err(e)) => Some(Err(e)), - None => None, - }) - } -} - -impl From<(C, I)> for TlsAcceptor -where - C: Into>, - I: Into, -{ - fn from((config, incoming): (C, I)) -> Self { - Self::new(config.into(), incoming.into()) - } -} - -/// A TLS stream constructed by a [`TlsAcceptor`]. // tokio_rustls::server::TlsStream doesn't expose constructor methods, // so we have to TlsAcceptor::accept and handshake to have access to it // TlsStream implements AsyncRead/AsyncWrite by handshaking with tokio_rustls::Accept first -pub struct TlsStream { - state: State, +pub struct TlsStream { + state: State, } -impl TlsStream { - fn new(stream: C, config: Arc) -> Self { +impl TlsStream { + fn new(stream: AddrStream, config: Arc) -> TlsStream { let accept = tokio_rustls::TlsAcceptor::from(config).accept(stream); - Self { + TlsStream { state: State::Handshaking(accept), } } - /// Returns a reference to the underlying IO stream. - /// - /// This should always return `Some`, except if an error has already been yielded. - pub fn io(&self) -> Option<&C> { - match &self.state { - State::Handshaking(accept) => accept.get_ref(), - State::Streaming(stream) => Some(stream.get_ref().0), - } - } - - /// Returns a reference to the underlying [`rustls::ServerConnection']. - /// - /// This will start yielding `Some` only after the handshake has completed. - pub fn connection(&self) -> Option<&ServerConnection> { - match &self.state { - State::Handshaking(_) => None, - State::Streaming(stream) => Some(stream.get_ref().1), - } - } } -impl AsyncRead for TlsStream { +impl AsyncRead for TlsStream { fn poll_read( self: Pin<&mut Self>, cx: &mut Context, buf: &mut ReadBuf, ) -> Poll> { let pin = self.get_mut(); - let accept = match &mut pin.state { - State::Handshaking(accept) => accept, - State::Streaming(stream) => return Pin::new(stream).poll_read(cx, buf), - }; - - let mut stream = match ready!(Pin::new(accept).poll(cx)) { - Ok(stream) => stream, - Err(err) => return Poll::Ready(Err(err)), - }; - - let result = Pin::new(&mut stream).poll_read(cx, buf); - pin.state = State::Streaming(stream); - result + match pin.state { + State::Handshaking(ref mut accept) => match ready!(Pin::new(accept).poll(cx)) { + Ok(mut stream) => { + let result = Pin::new(&mut stream).poll_read(cx, buf); + pin.state = State::Streaming(stream); + result + } + Err(err) => Poll::Ready(Err(err)), + }, + State::Streaming(ref mut stream) => Pin::new(stream).poll_read(cx, buf), + } } } -impl AsyncWrite for TlsStream { +impl AsyncWrite for TlsStream { fn poll_write( self: Pin<&mut Self>, cx: &mut Context<'_>, buf: &[u8], ) -> Poll> { let pin = self.get_mut(); - let accept = match &mut pin.state { - State::Handshaking(accept) => accept, - State::Streaming(stream) => return Pin::new(stream).poll_write(cx, buf), - }; - - let mut stream = match ready!(Pin::new(accept).poll(cx)) { - Ok(stream) => stream, - Err(err) => return Poll::Ready(Err(err)), - }; - - let result = Pin::new(&mut stream).poll_write(cx, buf); - pin.state = State::Streaming(stream); - result + match pin.state { + State::Handshaking(ref mut accept) => match ready!(Pin::new(accept).poll(cx)) { + Ok(mut stream) => { + let result = Pin::new(&mut stream).poll_write(cx, buf); + pin.state = State::Streaming(stream); + result + } + Err(err) => Poll::Ready(Err(err)), + }, + State::Streaming(ref mut stream) => Pin::new(stream).poll_write(cx, buf), + } } fn poll_flush(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { - match &mut self.state { + match self.state { State::Handshaking(_) => Poll::Ready(Ok(())), - State::Streaming(stream) => Pin::new(stream).poll_flush(cx), + State::Streaming(ref mut stream) => Pin::new(stream).poll_flush(cx), } } fn poll_shutdown(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { - match &mut self.state { + match self.state { State::Handshaking(_) => Poll::Ready(Ok(())), - State::Streaming(stream) => Pin::new(stream).poll_shutdown(cx), + State::Streaming(ref mut stream) => Pin::new(stream).poll_shutdown(cx), } } } -enum State { - Handshaking(tokio_rustls::Accept), - Streaming(tokio_rustls::server::TlsStream), +/// A TLS acceptor that can be used with hyper servers. +pub struct TlsAcceptor { + config: Arc, + incoming: AddrIncoming, +} + +/// An Acceptor for the `https` scheme. +impl TlsAcceptor { + /// Provides a builder for a `TlsAcceptor`. + pub fn builder() -> AcceptorBuilder { + AcceptorBuilder::new() + } + /// Creates a new `TlsAcceptor` from a `ServerConfig` and an `AddrIncoming`. + pub fn new(config: Arc, incoming: AddrIncoming) -> TlsAcceptor { + TlsAcceptor { config, incoming } + } +} + +impl From<(C, I)> for TlsAcceptor +where + C: Into>, + I: Into, +{ + fn from((config, incoming): (C, I)) -> TlsAcceptor { + TlsAcceptor::new(config.into(), incoming.into()) + } +} + +impl Accept for TlsAcceptor { + type Conn = TlsStream; + type Error = io::Error; + + fn poll_accept( + self: Pin<&mut Self>, + cx: &mut Context<'_>, + ) -> Poll>> { + let pin = self.get_mut(); + match ready!(Pin::new(&mut pin.incoming).poll_accept(cx)) { + Some(Ok(sock)) => Poll::Ready(Some(Ok(TlsStream::new(sock, pin.config.clone())))), + Some(Err(e)) => Poll::Ready(Some(Err(e))), + None => Poll::Ready(None), + } + } } diff -Nru temporalio-1.3.0/vendor/hyper-rustls/src/config.rs temporalio-1.3.0/vendor/hyper-rustls/src/config.rs --- temporalio-1.3.0/vendor/hyper-rustls/src/config.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/hyper-rustls/src/config.rs 2023-10-30 19:40:00.000000000 +0000 @@ -54,8 +54,9 @@ #[cfg_attr(docsrs, doc(cfg(feature = "webpki-roots")))] fn with_webpki_roots(self) -> ConfigBuilder { let mut roots = rustls::RootCertStore::empty(); - roots.add_trust_anchors( + roots.add_server_trust_anchors( webpki_roots::TLS_SERVER_ROOTS + .0 .iter() .map(|ta| { rustls::OwnedTrustAnchor::from_subject_spki_name_constraints( diff -Nru temporalio-1.3.0/vendor/hyper-rustls/src/connector/builder.rs temporalio-1.3.0/vendor/hyper-rustls/src/connector/builder.rs --- temporalio-1.3.0/vendor/hyper-rustls/src/connector/builder.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/hyper-rustls/src/connector/builder.rs 2023-10-30 19:40:00.000000000 +0000 @@ -174,22 +174,16 @@ }) } - /// Enable all HTTP versions built into this library (enabled with Cargo features) + /// Enable all HTTP versions /// - /// For now, this could enable both HTTP 1 and 2, depending on active features. - /// In the future, other supported versions will be enabled as well. - #[cfg(feature = "http2")] - #[cfg_attr(docsrs, doc(cfg(feature = "http2")))] + /// For now, this enables both HTTP 1 and 2. In the future, other supported versions + /// will be enabled as well. + #[cfg(all(feature = "http1", feature = "http2"))] pub fn enable_all_versions(mut self) -> ConnectorBuilder { - #[cfg(feature = "http1")] - let alpn_protocols = vec![b"h2".to_vec(), b"http/1.1".to_vec()]; - #[cfg(not(feature = "http1"))] - let alpn_protocols = vec![b"h2".to_vec()]; - - self.0.tls_config.alpn_protocols = alpn_protocols; + self.0.tls_config.alpn_protocols = vec![b"h2".to_vec()]; ConnectorBuilder(WantsProtocols3 { inner: self.0, - enable_http1: cfg!(feature = "http1"), + enable_http1: true, }) } @@ -332,7 +326,7 @@ .build(); assert_eq!(&connector.tls_config.alpn_protocols, &[b"h2".to_vec()]); let connector = super::ConnectorBuilder::new() - .with_tls_config(tls_config.clone()) + .with_tls_config(tls_config) .https_only() .enable_http1() .enable_http2() @@ -341,36 +335,5 @@ &connector.tls_config.alpn_protocols, &[b"h2".to_vec(), b"http/1.1".to_vec()] ); - let connector = super::ConnectorBuilder::new() - .with_tls_config(tls_config) - .https_only() - .enable_all_versions() - .build(); - assert_eq!( - &connector.tls_config.alpn_protocols, - &[b"h2".to_vec(), b"http/1.1".to_vec()] - ); - } - - #[test] - #[cfg(all(not(feature = "http1"), feature = "http2"))] - fn test_alpn_http2() { - let roots = rustls::RootCertStore::empty(); - let tls_config = rustls::ClientConfig::builder() - .with_safe_defaults() - .with_root_certificates(roots) - .with_no_client_auth(); - let connector = super::ConnectorBuilder::new() - .with_tls_config(tls_config.clone()) - .https_only() - .enable_http2() - .build(); - assert_eq!(&connector.tls_config.alpn_protocols, &[b"h2".to_vec()]); - let connector = super::ConnectorBuilder::new() - .with_tls_config(tls_config) - .https_only() - .enable_all_versions() - .build(); - assert_eq!(&connector.tls_config.alpn_protocols, &[b"h2".to_vec()]); } } diff -Nru temporalio-1.3.0/vendor/hyper-rustls/src/connector.rs temporalio-1.3.0/vendor/hyper-rustls/src/connector.rs --- temporalio-1.3.0/vendor/hyper-rustls/src/connector.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/hyper-rustls/src/connector.rs 2023-10-30 19:40:00.000000000 +0000 @@ -10,7 +10,7 @@ use crate::stream::MaybeHttpsStream; -pub(crate) mod builder; +pub mod builder; type BoxError = Box; @@ -45,7 +45,7 @@ C: Into>, { fn from((http, cfg): (H, C)) -> Self { - Self { + HttpsConnector { force_https: false, http, tls_config: cfg.into(), diff -Nru temporalio-1.3.0/vendor/hyper-rustls/src/lib.rs temporalio-1.3.0/vendor/hyper-rustls/src/lib.rs --- temporalio-1.3.0/vendor/hyper-rustls/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/hyper-rustls/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -76,19 +76,18 @@ //! # fn main() {} //! ``` -#![warn(missing_docs, unreachable_pub, clippy::use_self)] +#![warn(missing_docs)] #![cfg_attr(docsrs, feature(doc_cfg))] #[cfg(feature = "acceptor")] -/// TLS acceptor implementing hyper's `Accept` trait. -pub mod acceptor; +mod acceptor; mod config; mod connector; mod stream; #[cfg(feature = "logging")] mod log { - pub(crate) use log::{debug, trace}; + pub use log::{debug, trace}; } #[cfg(not(feature = "logging"))] diff -Nru temporalio-1.3.0/vendor/hyper-rustls/src/stream.rs temporalio-1.3.0/vendor/hyper-rustls/src/stream.rs --- temporalio-1.3.0/vendor/hyper-rustls/src/stream.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/hyper-rustls/src/stream.rs 2023-10-30 19:40:00.000000000 +0000 @@ -21,8 +21,8 @@ impl Connection for MaybeHttpsStream { fn connected(&self) -> Connected { match self { - Self::Http(s) => s.connected(), - Self::Https(s) => { + MaybeHttpsStream::Http(s) => s.connected(), + MaybeHttpsStream::Https(s) => { let (tcp, tls) = s.get_ref(); if tls.alpn_protocol() == Some(b"h2") { tcp.connected().negotiated_h2() @@ -37,21 +37,21 @@ impl fmt::Debug for MaybeHttpsStream { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { match *self { - Self::Http(..) => f.pad("Http(..)"), - Self::Https(..) => f.pad("Https(..)"), + MaybeHttpsStream::Http(..) => f.pad("Http(..)"), + MaybeHttpsStream::Https(..) => f.pad("Https(..)"), } } } impl From for MaybeHttpsStream { fn from(inner: T) -> Self { - Self::Http(inner) + MaybeHttpsStream::Http(inner) } } impl From> for MaybeHttpsStream { fn from(inner: TlsStream) -> Self { - Self::Https(inner) + MaybeHttpsStream::Https(inner) } } @@ -63,8 +63,8 @@ buf: &mut ReadBuf<'_>, ) -> Poll> { match Pin::get_mut(self) { - Self::Http(s) => Pin::new(s).poll_read(cx, buf), - Self::Https(s) => Pin::new(s).poll_read(cx, buf), + MaybeHttpsStream::Http(s) => Pin::new(s).poll_read(cx, buf), + MaybeHttpsStream::Https(s) => Pin::new(s).poll_read(cx, buf), } } } @@ -77,24 +77,24 @@ buf: &[u8], ) -> Poll> { match Pin::get_mut(self) { - Self::Http(s) => Pin::new(s).poll_write(cx, buf), - Self::Https(s) => Pin::new(s).poll_write(cx, buf), + MaybeHttpsStream::Http(s) => Pin::new(s).poll_write(cx, buf), + MaybeHttpsStream::Https(s) => Pin::new(s).poll_write(cx, buf), } } #[inline] fn poll_flush(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { match Pin::get_mut(self) { - Self::Http(s) => Pin::new(s).poll_flush(cx), - Self::Https(s) => Pin::new(s).poll_flush(cx), + MaybeHttpsStream::Http(s) => Pin::new(s).poll_flush(cx), + MaybeHttpsStream::Https(s) => Pin::new(s).poll_flush(cx), } } #[inline] fn poll_shutdown(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { match Pin::get_mut(self) { - Self::Http(s) => Pin::new(s).poll_shutdown(cx), - Self::Https(s) => Pin::new(s).poll_shutdown(cx), + MaybeHttpsStream::Http(s) => Pin::new(s).poll_shutdown(cx), + MaybeHttpsStream::Https(s) => Pin::new(s).poll_shutdown(cx), } } } diff -Nru temporalio-1.3.0/vendor/hyper-rustls/tests/tests.rs temporalio-1.3.0/vendor/hyper-rustls/tests/tests.rs --- temporalio-1.3.0/vendor/hyper-rustls/tests/tests.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/hyper-rustls/tests/tests.rs 2023-10-30 19:40:00.000000000 +0000 @@ -24,7 +24,7 @@ fn wait_for_server(addr: &str) { for i in 0..10 { - if TcpStream::connect(addr).is_ok() { + if let Ok(_) = TcpStream::connect(addr) { return; } thread::sleep(time::Duration::from_millis(i * 100)); @@ -72,7 +72,7 @@ println!("curl stderr:\n{}", String::from_utf8_lossy(&output.stderr)); } - assert_eq!(String::from_utf8_lossy(&output.stdout), "Try POST /echo\n"); + assert_eq!(String::from_utf8_lossy(&*output.stdout), "Try POST /echo\n"); } #[test] diff -Nru temporalio-1.3.0/vendor/indexmap/.cargo-checksum.json temporalio-1.3.0/vendor/indexmap/.cargo-checksum.json --- temporalio-1.3.0/vendor/indexmap/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/indexmap/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"Cargo.toml":"fed3c30b57366b7d3a2c16b283d99e7d89a7a359c73930f9fd5568273877971a","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"ecc269ef87fd38a1d98e30bfac9ba964a9dbd9315c3770fed98d4d7cb5882055","README.md":"37c2da326dcc144e67b9371ec98c78becfbbb8fab93d0537999b6083bdb80243","RELEASES.md":"c7e91532768d93b6d24e21bbf65dc4d0221e9b1d4eb6ca460c4f154b3237dd32","benches/bench.rs":"3b2900abbc9e8a60af78b0395222ee75e86bc68519a0f38477387d1572eed397","benches/faststring.rs":"5fdd6cdb19d0557ed58f241e809a240cf8939d9e5b87a72d5f127f81ab98380b","src/arbitrary.rs":"068713b1e8e762dbe9e4d19d555e77c17e59408335a40f4777d6100340605655","src/lib.rs":"66bfcbc906d703f19715a03d42caa84435f71174316bd31d44beca698c22c8d4","src/macros.rs":"32ab59dfb19713598769252e5fbcef31744dd0399bc839375c4edb5f00701b0d","src/map.rs":"ae2696a0c9746c6694db72d46e34b24d5f91e28d16d024be4d507b56e778ea56","src/map/core.rs":"d59dfa0a1838b6a034c32cc41426b42d9180127d5d36324a106c732f94db7e1e","src/map/core/raw.rs":"f8b19c728978278754ae49e98deb8de1034f007805d1f254d43208b0c453ed6f","src/map/iter.rs":"23278a1787d08dcbc30885c0653369d82a695a7b8f1084d7709fbf903e53a776","src/map/serde_seq.rs":"eff1ccbefe20c8f4338afa92732473e28fd0b752cb2bc153600ee5387d484627","src/map/slice.rs":"e264c31592ce382830281605846663ecc1694074d5b57b862de9fd090e022fc9","src/map/tests.rs":"7a192e8330a1df604d6a151e854d1d0638c068a8418f8922e92a65868ae5d569","src/mutable_keys.rs":"2bdd739bde1dd7f81c82e90595b877fbdb1cd9f963b180fcc819128bb1c750a7","src/rayon/map.rs":"22a30fa68437f69c24752c8ed17be6e084d02b0c12730e48e238a4e92f208b55","src/rayon/mod.rs":"019e9379ccab57a299ab5b5a2c0efc7561b77a715a5afe8f797c7e8330c6206c","src/rayon/set.rs":"cea2517db405ee64306e24b571ed773e129eae43ecfc866e93e365c118edc0ed","src/rustc.rs":"fe7a348c5a10a66880cb6c737593fe79d3b6de40f44ba0d7b89204aa95e14a3a","src/serde.rs":"91bbf14e3afbcf518aeb7f8a9b65011d0ede2f88d12857dfddda451f35574281","src/set.rs":"e6a6da85f4dbc1983301138d5273d1167f200a49c82d6a6353378a8ece607fcd","src/set/iter.rs":"9b90c736185889fca8b0a461293da4a1a1e50d9db539bd5b9f72254bee461a3e","src/set/slice.rs":"404cf6c749e220d2b29790180edb66b67056a5370f39955175b8f22d01fd21c1","src/set/tests.rs":"81bbb18834603479f26af1a1a6b676fe5ec949e23b2a358fcc868acedc886fa4","src/util.rs":"dbd57cfdac2a72db8c5ce83bf288bcaf33b5ae59adddcd088792a624c4c0e909","tests/equivalent_trait.rs":"efe9393069e3cfc893d2c9c0343679979578e437fdb98a10baefeced027ba310","tests/macros_full_path.rs":"c33c86d7341581fdd08e2e6375a4afca507fa603540c54a3b9e51c4cd011cd71","tests/quick.rs":"f34ae9ce8aa51d9338595c299a2088ab56dbb5c04786050009a2fa22a6bbfa32","tests/tests.rs":"f6dbeeb0e2950402b0e66ac52bf74c9e4197d3c5d9c0dde64a7998a2ef74d327"},"package":"8adf3ddd720272c6ea8bf59463c04e0f93d0bbf7c5439b691bca2987e0270897"} \ No newline at end of file +{"files":{"Cargo.toml":"22de53b350fe2ece033469dc50c449aed2d48b2e51bd95cd289e5a64281ad941","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"ecc269ef87fd38a1d98e30bfac9ba964a9dbd9315c3770fed98d4d7cb5882055","README.md":"8a6d3b3ddc2b028e309885d80152bea5434dd61c2dc9a64a68daf161fe00233b","RELEASES.md":"6caa90a493de65e6764415168586c647749ad49341f2de807ba70f212f8989b5","benches/bench.rs":"3b2900abbc9e8a60af78b0395222ee75e86bc68519a0f38477387d1572eed397","benches/faststring.rs":"5fdd6cdb19d0557ed58f241e809a240cf8939d9e5b87a72d5f127f81ab98380b","src/arbitrary.rs":"068713b1e8e762dbe9e4d19d555e77c17e59408335a40f4777d6100340605655","src/lib.rs":"f9d5ee25446660e93cbc6de314a8699c1f44da2a56ec3e1b432f61389f77af74","src/macros.rs":"32ab59dfb19713598769252e5fbcef31744dd0399bc839375c4edb5f00701b0d","src/map.rs":"ae2696a0c9746c6694db72d46e34b24d5f91e28d16d024be4d507b56e778ea56","src/map/core.rs":"55ecc1f83ac0b78d687008a057f912be2cfad270af29d1c880dde7b8ad269350","src/map/core/raw.rs":"b0aaa4cf58d789acd056c1d4cca914cd945e3f1f097479298e4432b909ccf9e4","src/map/iter.rs":"23278a1787d08dcbc30885c0653369d82a695a7b8f1084d7709fbf903e53a776","src/map/serde_seq.rs":"eff1ccbefe20c8f4338afa92732473e28fd0b752cb2bc153600ee5387d484627","src/map/slice.rs":"e264c31592ce382830281605846663ecc1694074d5b57b862de9fd090e022fc9","src/map/tests.rs":"7a192e8330a1df604d6a151e854d1d0638c068a8418f8922e92a65868ae5d569","src/mutable_keys.rs":"2bdd739bde1dd7f81c82e90595b877fbdb1cd9f963b180fcc819128bb1c750a7","src/rayon/map.rs":"22a30fa68437f69c24752c8ed17be6e084d02b0c12730e48e238a4e92f208b55","src/rayon/mod.rs":"019e9379ccab57a299ab5b5a2c0efc7561b77a715a5afe8f797c7e8330c6206c","src/rayon/set.rs":"cea2517db405ee64306e24b571ed773e129eae43ecfc866e93e365c118edc0ed","src/rustc.rs":"fe7a348c5a10a66880cb6c737593fe79d3b6de40f44ba0d7b89204aa95e14a3a","src/serde.rs":"91bbf14e3afbcf518aeb7f8a9b65011d0ede2f88d12857dfddda451f35574281","src/set.rs":"e78aa42ea1719f0398c83edd04512b1d7a699eab0578e1f6327a9eec094520ca","src/set/iter.rs":"9b90c736185889fca8b0a461293da4a1a1e50d9db539bd5b9f72254bee461a3e","src/set/slice.rs":"404cf6c749e220d2b29790180edb66b67056a5370f39955175b8f22d01fd21c1","src/set/tests.rs":"81bbb18834603479f26af1a1a6b676fe5ec949e23b2a358fcc868acedc886fa4","src/util.rs":"dbd57cfdac2a72db8c5ce83bf288bcaf33b5ae59adddcd088792a624c4c0e909","tests/equivalent_trait.rs":"efe9393069e3cfc893d2c9c0343679979578e437fdb98a10baefeced027ba310","tests/macros_full_path.rs":"c33c86d7341581fdd08e2e6375a4afca507fa603540c54a3b9e51c4cd011cd71","tests/quick.rs":"f34ae9ce8aa51d9338595c299a2088ab56dbb5c04786050009a2fa22a6bbfa32","tests/tests.rs":"f6dbeeb0e2950402b0e66ac52bf74c9e4197d3c5d9c0dde64a7998a2ef74d327"},"package":"d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/indexmap/Cargo.toml temporalio-1.3.0/vendor/indexmap/Cargo.toml --- temporalio-1.3.0/vendor/indexmap/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/indexmap/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -11,9 +11,9 @@ [package] edition = "2021" -rust-version = "1.63" +rust-version = "1.64" name = "indexmap" -version = "2.0.2" +version = "2.0.0" description = "A hash table with consistent order and fast iteration." documentation = "https://docs.rs/indexmap/" readme = "README.md" @@ -45,7 +45,7 @@ tag-name = "{{version}}" [profile.bench] -debug = 2 +debug = true [lib] bench = false @@ -60,7 +60,7 @@ default-features = false [dependencies.hashbrown] -version = "0.14.1" +version = "0.14" features = ["raw"] default-features = false @@ -90,7 +90,7 @@ version = "0.2.1" [dev-dependencies.itertools] -version = "0.11" +version = "0.10" [dev-dependencies.lazy_static] version = "1.3" diff -Nru temporalio-1.3.0/vendor/indexmap/README.md temporalio-1.3.0/vendor/indexmap/README.md --- temporalio-1.3.0/vendor/indexmap/README.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/indexmap/README.md 2023-10-30 19:40:00.000000000 +0000 @@ -3,7 +3,7 @@ [![build status](https://github.com/bluss/indexmap/workflows/Continuous%20integration/badge.svg?branch=master)](https://github.com/bluss/indexmap/actions) [![crates.io](https://img.shields.io/crates/v/indexmap.svg)](https://crates.io/crates/indexmap) [![docs](https://docs.rs/indexmap/badge.svg)](https://docs.rs/indexmap) -[![rustc](https://img.shields.io/badge/rust-1.63%2B-orange.svg)](https://img.shields.io/badge/rust-1.63%2B-orange.svg) +[![rustc](https://img.shields.io/badge/rust-1.64%2B-orange.svg)](https://img.shields.io/badge/rust-1.64%2B-orange.svg) A pure-Rust hash table which preserves (in a limited sense) insertion order. diff -Nru temporalio-1.3.0/vendor/indexmap/RELEASES.md temporalio-1.3.0/vendor/indexmap/RELEASES.md --- temporalio-1.3.0/vendor/indexmap/RELEASES.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/indexmap/RELEASES.md 2023-10-30 19:40:00.000000000 +0000 @@ -1,13 +1,3 @@ -- 2.0.2 - - - The `hashbrown` dependency has been updated to version 0.14.1 to - complete the support for Rust 1.63. - -- 2.0.1 - - - **MSRV**: Rust 1.63.0 is now supported as well, pending publication of - `hashbrown`'s relaxed MSRV (or use cargo `--ignore-rust-version`). - - 2.0.0 - **MSRV**: Rust 1.64.0 or later is now required. diff -Nru temporalio-1.3.0/vendor/indexmap/src/lib.rs temporalio-1.3.0/vendor/indexmap/src/lib.rs --- temporalio-1.3.0/vendor/indexmap/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/indexmap/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -81,7 +81,7 @@ //! //! ### Rust Version //! -//! This version of indexmap requires Rust 1.63 or later. +//! This version of indexmap requires Rust 1.64 or later. //! //! The indexmap 2.x release series will use a carefully considered version //! upgrade policy, where in a later 2.x version, we will raise the minimum diff -Nru temporalio-1.3.0/vendor/indexmap/src/map/core/raw.rs temporalio-1.3.0/vendor/indexmap/src/map/core/raw.rs --- temporalio-1.3.0/vendor/indexmap/src/map/core/raw.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/indexmap/src/map/core/raw.rs 2023-10-30 19:40:00.000000000 +0000 @@ -100,6 +100,29 @@ // only the item references that are appropriately bound to `&mut self`. unsafe { self.indices.iter().map(|bucket| bucket.as_mut()) } } + + /// Return the raw bucket for the given index + fn find_index(&self, index: usize) -> RawBucket { + // We'll get a "nice" bounds-check from indexing `self.entries`, + // and then we expect to find it in the table as well. + let hash = self.entries[index].hash.get(); + self.indices + .find(hash, move |&i| i == index) + .expect("index not found") + } + + pub(crate) fn swap_indices(&mut self, a: usize, b: usize) { + // SAFETY: Can't take two `get_mut` references from one table, so we + // must use raw buckets to do the swap. This is still safe because we + // are locally sure they won't dangle, and we write them individually. + unsafe { + let raw_bucket_a = self.find_index(a); + let raw_bucket_b = self.find_index(b); + *raw_bucket_a.as_mut() = b; + *raw_bucket_b.as_mut() = a; + } + self.entries.swap(a, b); + } } /// A view into an occupied entry in a `IndexMap`. diff -Nru temporalio-1.3.0/vendor/indexmap/src/map/core.rs temporalio-1.3.0/vendor/indexmap/src/map/core.rs --- temporalio-1.3.0/vendor/indexmap/src/map/core.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/indexmap/src/map/core.rs 2023-10-30 19:40:00.000000000 +0000 @@ -410,26 +410,6 @@ } } - pub(crate) fn swap_indices(&mut self, a: usize, b: usize) { - // If they're equal and in-bounds, there's nothing to do. - if a == b && a < self.entries.len() { - return; - } - - // We'll get a "nice" bounds-check from indexing `self.entries`, - // and then we expect to find it in the table as well. - let [ref_a, ref_b] = self - .indices - .get_many_mut( - [self.entries[a].hash.get(), self.entries[b].hash.get()], - move |i, &x| if i == 0 { x == a } else { x == b }, - ) - .expect("indices not found"); - - mem::swap(ref_a, ref_b); - self.entries.swap(a, b); - } - /// Remove an entry by swapping it with the last pub(crate) fn swap_remove_full(&mut self, hash: HashValue, key: &Q) -> Option<(usize, K, V)> where diff -Nru temporalio-1.3.0/vendor/indexmap/src/set.rs temporalio-1.3.0/vendor/indexmap/src/set.rs --- temporalio-1.3.0/vendor/indexmap/src/set.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/indexmap/src/set.rs 2023-10-30 19:40:00.000000000 +0000 @@ -56,11 +56,6 @@ /// `0..self.len()`. For example, the method `.get_full` looks up the index for /// a value, and the method `.get_index` looks up the value by index. /// -/// # Complexity -/// -/// Internally, `IndexSet` just holds an [`IndexMap`](IndexMap). Thus the complexity -/// of the two are the same for most methods. -/// /// # Examples /// /// ``` @@ -425,8 +420,6 @@ } /// Return item index, if it exists in the set - /// - /// Computes in **O(1)** time (average). pub fn get_index_of(&self, value: &Q) -> Option where Q: Hash + Equivalent, diff -Nru temporalio-1.3.0/vendor/inventory/.cargo-checksum.json temporalio-1.3.0/vendor/inventory/.cargo-checksum.json --- temporalio-1.3.0/vendor/inventory/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/inventory/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"Cargo.lock":"515e538a5846b5d1ba518fef3d0a5b3e90a46ec93942790a0097ecfeaa378682","Cargo.toml":"65b7ef9cf18c7f3b7dd15bbaea8bb1e589a4837ae1392b98d52673b733e4b9cf","LICENSE-APACHE":"62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","README.md":"3eedca993e73fcc3760c26296c64b859c36d8f1be4f1ffa524183c3977a75a79","examples/flags.rs":"5705e0e14d6672f06ceb53ad17ec88181949d8c33dc507f9ea90e46873456fdd","src/lib.rs":"cf841c9edb7b7986dab82018c0035bddabbf261f677b701b7930a5f11c1be3dc","tests/compiletest.rs":"022a8e400ef813d7ea1875b944549cee5125f6a995dc33e93b48cba3e1b57bd1","tests/test.rs":"172e27013e20420722ff8a9afe5b231a02a2a821a7d638f561c63bdc8a158568","tests/ui/collect-unsized.rs":"c2ae61ec8bf5f2e305ca627f7ee2ce36d55a0df2d31cee17022c169b3ffe3b1a","tests/ui/collect-unsized.stderr":"101a48e8060c866d0ddcf21afa1d6ebb69ceda0b9df50ef5dd095885f215fb25","tests/ui/non-sync.rs":"b08b9b3c30997b4fd3cb39e9c9b1f5261813a8fad69612d45806e566208aacaa","tests/ui/non-sync.stderr":"d56b640a7f52e33d27d8ede3fe0d3caa065692144b5a099db9d1b142e5130f38","tests/ui/outer-attr.rs":"5a5e5763c0042ca42cc0e32068c31982fcabf9cbfaed004eb8420d0388bda502","tests/ui/outer-attr.stderr":"fa4b926d7c3375b093030ae858de253533044f71f3b318b81b3965ccea2ca2b5","tests/ui/submit-nonconst.rs":"e91d3e1842032fb8113cb41d1b675f72a9fba006e9428013a877026268e65182","tests/ui/submit-nonconst.stderr":"7d3640dbb6b6bddf8ed32a454033f62cb302663d90e7b4365f7c7c323179c8a8","tests/ui/submit-unrecognized.rs":"a0903bc8cac95f355835fe60f509bcd8321d9ce6cab71e4ce5cf03df4e49d51e","tests/ui/submit-unrecognized.stderr":"524f1ab9ffaf956b427a2f3d41d2c7dfcde4fced562a49276e9c6c30ef9a600f","tests/ui/used-linker.rs":"1b548496563af4f74c8a75296a9d2da35950bff60d84b50ba3a74e66947806db","tests/ui/used-linker.stderr":"61834a88c17e757355300ae70315ac09039c8ed5195a6b48c4ac15c76315dbf1"},"package":"e1be380c410bf0595e94992a648ea89db4dd3f3354ba54af206fd2a68cf5ac8e"} \ No newline at end of file +{"files":{"Cargo.lock":"5e7e3c75eb5e0b171aa4dce2a515ddd3cef54032f9e2b46315d4214ff9006c0e","Cargo.toml":"ddb6ca0d748cb9212925c67a0192c57a2f754a6160adb4aa94225364d0834e4c","LICENSE-APACHE":"62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","README.md":"3eedca993e73fcc3760c26296c64b859c36d8f1be4f1ffa524183c3977a75a79","examples/flags.rs":"5705e0e14d6672f06ceb53ad17ec88181949d8c33dc507f9ea90e46873456fdd","src/lib.rs":"c8a9c6cb4748113bf4230e7fc63dfcc65516854304a497d9ace344a863483d0e","tests/compiletest.rs":"022a8e400ef813d7ea1875b944549cee5125f6a995dc33e93b48cba3e1b57bd1","tests/test.rs":"172e27013e20420722ff8a9afe5b231a02a2a821a7d638f561c63bdc8a158568","tests/ui/collect-unsized.rs":"c2ae61ec8bf5f2e305ca627f7ee2ce36d55a0df2d31cee17022c169b3ffe3b1a","tests/ui/collect-unsized.stderr":"101a48e8060c866d0ddcf21afa1d6ebb69ceda0b9df50ef5dd095885f215fb25","tests/ui/non-sync.rs":"b08b9b3c30997b4fd3cb39e9c9b1f5261813a8fad69612d45806e566208aacaa","tests/ui/non-sync.stderr":"d56b640a7f52e33d27d8ede3fe0d3caa065692144b5a099db9d1b142e5130f38","tests/ui/outer-attr.rs":"5a5e5763c0042ca42cc0e32068c31982fcabf9cbfaed004eb8420d0388bda502","tests/ui/outer-attr.stderr":"fa4b926d7c3375b093030ae858de253533044f71f3b318b81b3965ccea2ca2b5","tests/ui/submit-nonconst.rs":"e91d3e1842032fb8113cb41d1b675f72a9fba006e9428013a877026268e65182","tests/ui/submit-nonconst.stderr":"7d3640dbb6b6bddf8ed32a454033f62cb302663d90e7b4365f7c7c323179c8a8","tests/ui/submit-unrecognized.rs":"a0903bc8cac95f355835fe60f509bcd8321d9ce6cab71e4ce5cf03df4e49d51e","tests/ui/submit-unrecognized.stderr":"524f1ab9ffaf956b427a2f3d41d2c7dfcde4fced562a49276e9c6c30ef9a600f","tests/ui/used-linker.rs":"1b548496563af4f74c8a75296a9d2da35950bff60d84b50ba3a74e66947806db","tests/ui/used-linker.stderr":"61834a88c17e757355300ae70315ac09039c8ed5195a6b48c4ac15c76315dbf1"},"package":"a53088c87cf71c9d4f3372a2cb9eea1e7b8a0b1bf8b7f7d23fe5b76dbb07e63b"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/inventory/Cargo.lock temporalio-1.3.0/vendor/inventory/Cargo.lock --- temporalio-1.3.0/vendor/inventory/Cargo.lock 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/inventory/Cargo.lock 2023-10-30 19:40:00.000000000 +0000 @@ -25,7 +25,7 @@ [[package]] name = "inventory" -version = "0.3.12" +version = "0.3.11" dependencies = [ "rustversion", "trybuild", @@ -54,9 +54,9 @@ [[package]] name = "quote" -version = "1.0.33" +version = "1.0.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +checksum = "5fe8a65d69dd0808184ebb5f836ab526bb259db23c657efa38711b1072ee47f0" dependencies = [ "proc-macro2", ] @@ -75,18 +75,15 @@ [[package]] name = "serde" -version = "1.0.188" +version = "1.0.174" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9e0fcba69a370eed61bcf2b728575f726b50b55cba78064753d708ddc7549e" -dependencies = [ - "serde_derive", -] +checksum = "3b88756493a5bd5e5395d53baa70b194b05764ab85b59e43e4b8f4e1192fa9b1" [[package]] name = "serde_derive" -version = "1.0.188" +version = "1.0.174" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2" +checksum = "6e5c3a298c7f978e53536f95a63bdc4c4a64550582f31a0359a9afda6aede62e" dependencies = [ "proc-macro2", "quote", @@ -95,9 +92,9 @@ [[package]] name = "serde_json" -version = "1.0.105" +version = "1.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "693151e1ac27563d6dbcec9dee9fbd5da8539b20fa14ad3752b2e6d363ace360" +checksum = "d03b412469450d4404fe8499a268edd7f8b79fecb074b0d812ad64ca21f4031b" dependencies = [ "itoa", "ryu", @@ -106,9 +103,9 @@ [[package]] name = "syn" -version = "2.0.29" +version = "2.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c324c494eba9d92503e6f1ef2e6df781e78f6a7705a0202d9801b198807d518a" +checksum = "b60f673f44a8255b9c8c657daf66a596d435f2da81a555b06dc644d080ba45e0" dependencies = [ "proc-macro2", "quote", @@ -126,9 +123,9 @@ [[package]] name = "trybuild" -version = "1.0.83" +version = "1.0.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6df60d81823ed9c520ee897489573da4b1d79ffbe006b8134f46de1a1aa03555" +checksum = "a84e0202ea606ba5ebee8507ab2bfbe89b98551ed9b8f0be198109275cff284b" dependencies = [ "basic-toml", "dissimilar", diff -Nru temporalio-1.3.0/vendor/inventory/Cargo.toml temporalio-1.3.0/vendor/inventory/Cargo.toml --- temporalio-1.3.0/vendor/inventory/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/inventory/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -13,7 +13,7 @@ edition = "2021" rust-version = "1.62" name = "inventory" -version = "0.3.12" +version = "0.3.11" authors = ["David Tolnay "] description = "Typed distributed plugin registration" documentation = "https://docs.rs/inventory" diff -Nru temporalio-1.3.0/vendor/inventory/src/lib.rs temporalio-1.3.0/vendor/inventory/src/lib.rs --- temporalio-1.3.0/vendor/inventory/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/inventory/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -102,7 +102,7 @@ //! There is no guarantee about the order that plugins of the same type are //! visited by the iterator. They may be visited in any order. -#![doc(html_root_url = "https://docs.rs/inventory/0.3.12")] +#![doc(html_root_url = "https://docs.rs/inventory/0.3.11")] #![no_std] #![allow( clippy::doc_markdown, @@ -246,7 +246,6 @@ mod void_iter { enum Void {} - #[repr(C, packed)] pub struct Iter([*const T; 0], Void); unsafe impl Send for Iter {} @@ -480,5 +479,5 @@ #[allow(dead_code)] fn unused() { - let () = ITER; + let _ = ITER; } diff -Nru temporalio-1.3.0/vendor/ipnet/.cargo-checksum.json temporalio-1.3.0/vendor/ipnet/.cargo-checksum.json --- temporalio-1.3.0/vendor/ipnet/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ipnet/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"Cargo.toml":"3c716300c4c8a90b157e7b33679c8bd4daf604368677e9736f38dfc3c7bf0cb6","LICENSE-APACHE":"87d9feb9238c6bd8e0024fc4733b06cff036f89f36d93b7df1c8a0549bbb7a5b","LICENSE-MIT":"47dc9ff29128ddfb4d6a0435383c9f89120bc374dbcc1dd00b933a0b28aa7865","README.md":"0b2be8e81c267658f561623e99dd31456b7430377a0bfaa788ccc446ca9e3a6f","RELEASES.md":"df9a1c842874b31a9de79580e8aad89b6c8edde5211f79e88b4d44a18d477637","src/ipext.rs":"314bf2084213831adb126bdbdd81dc00e39aef79633a122dacc3c1ebc25e6245","src/ipnet.rs":"a2f2e2c6db97d231b1f07e630ae36b2d1073cb4e5cf8ca25428b595c5cc56a8f","src/ipnet_schemars.rs":"017df6a3a0981cc156bad5e53df6f69c298dffff7d550a0b6aa3f64712cd2ac7","src/ipnet_serde.rs":"1536a56ed90c7f37f223b20ae636851b2d4dc8ee1accdeeeeddcff2bec48b51f","src/lib.rs":"03a3b4a9eb40b100bea8ad5838967c6cc5c319a4969c605acd21bfdeb05970d6","src/mask.rs":"eac453f58776b7d84eaf5e640306cd3c3651c602f19bbfb1b3e9a7aeee5917d8","src/parser.rs":"72da58631a055246b685d1b6c84ef3e5e35ea8d5ecb6c5a3b4a2f8318bfa1d94"},"package":"8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3"} \ No newline at end of file +{"files":{"Cargo.toml":"b6c49459e3c291936f5dacdb7c3932ec61c9c468042841a943727a6472a976ee","LICENSE-APACHE":"87d9feb9238c6bd8e0024fc4733b06cff036f89f36d93b7df1c8a0549bbb7a5b","LICENSE-MIT":"47dc9ff29128ddfb4d6a0435383c9f89120bc374dbcc1dd00b933a0b28aa7865","README.md":"0b2be8e81c267658f561623e99dd31456b7430377a0bfaa788ccc446ca9e3a6f","RELEASES.md":"09b321b89a3445448c548ed929f8f1434c84fd27a249c439a89d68148c25b99a","src/ipext.rs":"314bf2084213831adb126bdbdd81dc00e39aef79633a122dacc3c1ebc25e6245","src/ipnet.rs":"a2f2e2c6db97d231b1f07e630ae36b2d1073cb4e5cf8ca25428b595c5cc56a8f","src/ipnet_schemars.rs":"017df6a3a0981cc156bad5e53df6f69c298dffff7d550a0b6aa3f64712cd2ac7","src/ipnet_serde.rs":"1ee97a5d621d360792333dd0205ff4d5b3a662912970be903abf21b74c5ba2c1","src/lib.rs":"96b626714e9c91b998c8b4d2f266ef77f1cfbde2a4a19dff2bbf9c8006eda8e6","src/mask.rs":"eac453f58776b7d84eaf5e640306cd3c3651c602f19bbfb1b3e9a7aeee5917d8","src/parser.rs":"72da58631a055246b685d1b6c84ef3e5e35ea8d5ecb6c5a3b4a2f8318bfa1d94"},"package":"28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/ipnet/Cargo.toml temporalio-1.3.0/vendor/ipnet/Cargo.toml --- temporalio-1.3.0/vendor/ipnet/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ipnet/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -12,7 +12,7 @@ [package] edition = "2018" name = "ipnet" -version = "2.9.0" +version = "2.8.0" authors = ["Kris Price "] description = "Provides types and useful methods for working with IPv4 and IPv6 network addresses, commonly called IP prefixes. The new `IpNet`, `Ipv4Net`, and `Ipv6Net` types build on the existing `IpAddr`, `Ipv4Addr`, and `Ipv6Addr` types already provided in Rust's standard library and align to their design to stay consistent. The module also provides useful traits that extend `Ipv4Addr` and `Ipv6Addr` with methods for `Add`, `Sub`, `BitAnd`, and `BitOr` operations. The module only uses stable feature so it is guaranteed to compile using the stable toolchain." documentation = "https://docs.rs/ipnet" @@ -28,10 +28,6 @@ license = "MIT OR Apache-2.0" repository = "https://github.com/krisprice/ipnet" -[dependencies.heapless] -version = "0" -optional = true - [dependencies.schemars] version = "0.8" optional = true @@ -52,7 +48,6 @@ "serde", "schemars", ] -ser_as_str = ["heapless"] std = [] [badges.travis-ci] diff -Nru temporalio-1.3.0/vendor/ipnet/RELEASES.md temporalio-1.3.0/vendor/ipnet/RELEASES.md --- temporalio-1.3.0/vendor/ipnet/RELEASES.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ipnet/RELEASES.md 2023-10-30 19:40:00.000000000 +0000 @@ -1,9 +1,5 @@ # Releases -## Version 2.9.0 - -* Add ser_as_str feature to serialize using serialize_str() #52 - ## Version 2.8.0 * Add no_std support on nightly #51 diff -Nru temporalio-1.3.0/vendor/ipnet/src/ipnet_serde.rs temporalio-1.3.0/vendor/ipnet/src/ipnet_serde.rs --- temporalio-1.3.0/vendor/ipnet/src/ipnet_serde.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ipnet/src/ipnet_serde.rs 2023-10-30 19:40:00.000000000 +0000 @@ -84,13 +84,6 @@ where S: Serializer { if serializer.is_human_readable() { - #[cfg(feature = "ser_as_str")] - { - let mut buf = heapless::String::<18>::new(); - fmt::write(&mut buf, format_args!("{self}")).unwrap(); - serializer.serialize_str(&buf) - } - #[cfg(not(feature = "ser_as_str"))] serializer.collect_str(self) } else { let mut seq = serializer.serialize_tuple(5)?; @@ -137,13 +130,6 @@ where S: Serializer { if serializer.is_human_readable() { - #[cfg(feature = "ser_as_str")] - { - let mut buf = heapless::String::<43>::new(); - fmt::write(&mut buf, format_args!("{self}")).unwrap(); - serializer.serialize_str(&buf) - } - #[cfg(not(feature = "ser_as_str"))] serializer.collect_str(self) } else { let mut seq = serializer.serialize_tuple(17)?; diff -Nru temporalio-1.3.0/vendor/ipnet/src/lib.rs temporalio-1.3.0/vendor/ipnet/src/lib.rs --- temporalio-1.3.0/vendor/ipnet/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ipnet/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,4 +1,4 @@ -#![doc(html_root_url = "https://docs.rs/ipnet/2.9.0")] +#![doc(html_root_url = "https://docs.rs/ipnet/2.8.0")] //! Types for IPv4 and IPv6 network addresses. //! //! This module provides types and useful methods for working with IPv4 diff -Nru temporalio-1.3.0/vendor/itertools/.cargo-checksum.json temporalio-1.3.0/vendor/itertools/.cargo-checksum.json --- temporalio-1.3.0/vendor/itertools/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"CHANGELOG.md":"ed6c781d541c40d4a19eaecd794cadebb94b3f4d51e32367803542c88f0457ee","Cargo.toml":"6dcbab25126c0cdf64f5089156de0d4346914c6d47c557d370b8e20e039ca7d3","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"7576269ea71f767b99297934c0b2367532690f8c4badc695edf8e04ab6a1e545","README.md":"3acfeb07424200ae70bf571ef63a96bae954c298bddf447c9bea0ea9394825cc","benches/bench1.rs":"bb06f39db0544b1380cd4929139ccf521a9eecab7ca3f910b9499f965ec0a047","benches/combinations.rs":"51523ee1ca438a56f14711f0b04ee943895062d35859fbe23a2714d2fca3289d","benches/combinations_with_replacement.rs":"11f29160652a2d90ce7ca4b1c339c4457888ab6867e2456ce1c62e3adf9be737","benches/extra/mod.rs":"6ca290d72302a1945078621610b5788060b0de29639decebbdc557a80044aa97","benches/extra/zipslices.rs":"40e9f68a7c00f8429193fca463caef18851fa49b33355cc136bad3ccc840d655","benches/fold_specialization.rs":"5a517bbe29d366a15f6f751660e17ab1aa3e7b21552a1983048c662e34f0d69e","benches/powerset.rs":"6fd9d69a3483b37dc2411f99fb4efa6131577696f2dbdc8d1de9e4d7642fe3a3","benches/tree_fold1.rs":"539232e74f9aaea295a42069ac5af707811e90dc1c71c6e0a9064ffc731999de","benches/tuple_combinations.rs":"16366158743307a0289fc1df423a3cec45009807d410a9fe9922d5b6f8b7d002","benches/tuples.rs":"5a620783ae203e9ff9623d10d2c7fe9911d8b6c811cbad7613afa30e390c759d","clippy.toml":"33ffb83bbddb772575b3aa565b7136a8158ee386c216ffc2588fed9e83fa3826","examples/iris.data":"596ffd580471ca4d4880f8e439c7281f3b50d8249a5960353cb200b1490f63a0","examples/iris.rs":"1b465ed6a417180913104bc95a545fd9d1a3d67d121871ab737ad87e31b8be37","src/adaptors/coalesce.rs":"a0073325d40f297d29101538d18a267aef81889a999338dc09cb43a31cb4ec8b","src/adaptors/map.rs":"241971e856e468d71323071fb4a09867fbcedb83877320be132dc03516fe60e8","src/adaptors/mod.rs":"7f3bd7d011a348ce5e4bea486ef2e6346b64c7fe27540334d56d3f147f981d59","src/adaptors/multi_product.rs":"bb43e6dce68c815c21006d5b01c56e038d54b0c3bb8ee6bb8a4de11e2952c7ad","src/combinations.rs":"fb25babb459389093f886721016c72bf9f00e51d02735f638d871bb3a447ffd0","src/combinations_with_replacement.rs":"463011a574facbdd84278386b533a90e4dd517f0417e05adb82d182049db1f50","src/concat_impl.rs":"03b1ed61cbed242c286c3c4c5c848dbd57e02ab83fcef264f3a592b58107f324","src/cons_tuples_impl.rs":"c253d03b861831c01d62cacc57b49715ee62f6171e69f6886bb5a6ca0863bc3a","src/diff.rs":"a7800e9ce7a87b53ebe2338481335751fb43d44fa6a1ca719aceaaab40e5c8fe","src/duplicates_impl.rs":"f62fe4b642f501f785721ce5a505cf622a771e457210726dd0fb8b30be7ebbbc","src/either_or_both.rs":"76b13fbfac6bc959b4c1d8b7c99ce51726e95f994ca5429477e523a3d3950e4a","src/exactly_one_err.rs":"aa50081f6a31b5109b30e3ed305e3ec2413c6908dedc8990ec5378a99cee2b39","src/extrema_set.rs":"2a25b0b86eed2fd5d05622d591a3085cab823973d450816c2c3b8cb76e9c187e","src/flatten_ok.rs":"fe209fd886ecd9cb98d99625aa0c7274af7e644eff4a10de15b4dec8bbbc934a","src/format.rs":"a8192d85c0f9de8e633c202456e3cde0f3bc50f19b6bd8a4b2cfa3ef5123de1a","src/free.rs":"dfc57b7f56a08d4986a96b679018b41346576a7a34b668e008cc01109e728750","src/group_map.rs":"f7b02c964f63505d3e36280cfdc1755e05287714201efe983dacf702eee61434","src/groupbylazy.rs":"4f2181c022a45ff8444597708861fc6863eceb6f7555ea81cf3eeba19b492971","src/grouping_map.rs":"cbc45ac563345c96f3ac50c78f73c83d870523436a7ab88c1c9a685d204461d3","src/impl_macros.rs":"4f829b458873bed556f1aff2ae4e88dbd576766e2b5bcc07ff3ac8756758e6f4","src/intersperse.rs":"b9717242495846a4a979c95d93d5681caccb7c07a0d889eab763ad3d49a46125","src/k_smallest.rs":"603eb34314c01769ff7f6def2a24cf7a7b38507e6f3658b7aafc23a3b2e9b322","src/kmerge_impl.rs":"a347b0f6fa7715afd8a54d85ce139ed5b14c9e58a16c2b3648f5b288fdb5375f","src/lazy_buffer.rs":"834f6ef7fdf9f00c8a6329beb38eaefb706847ceeec309c221dce705c2c1e05b","src/lib.rs":"fadb0045279aafe8e8cccb45fadc383c7b358197b83c9c38fba87ada4cb2f84a","src/merge_join.rs":"1016113f6c983a9498bae5dc0570190437e1357b3333f6e19ea95c88599a1225","src/minmax.rs":"96d3897c28c8c63284d4729becc9ada6855e0953cac6e1bd35cf6f38c50b0ec0","src/multipeek_impl.rs":"35162bca4456bfa20a08e8d40e4d1cc6783dc662778789fdcded60371e975122","src/pad_tail.rs":"04be2ca73abb85815b06b5524c99d6feb2919180c486a4646f9cc6c87462f67b","src/peek_nth.rs":"6a0a51f2f373ce14d3d58595c46464878a14976bf00841a7396c03f9f9ab07ac","src/peeking_take_while.rs":"2b1b77c8882be32cfd76e973d303aa62f73370efd470c60764add0cdcca524d5","src/permutations.rs":"97831e7e26904c3cae68c97e74f7c6981ceb2fb2f2217282a0e5e54083a565fc","src/powerset.rs":"e0ee6b1316b4dd314c1e81502b90ae8113e1cda12168322520c5a65410e584b2","src/process_results_impl.rs":"9ed7fa46c8316238272ef47577387a386c1a109b50377dd3caf4291b6587cb73","src/put_back_n_impl.rs":"821e047fecd6ca0036290029f4febe7638a3abf1faa05e1e747a3bf9d80ff464","src/rciter_impl.rs":"5b156082ef2d25a94a4ad01d94cba2813c4b3e72e212515a8ad0fc8588f8045d","src/repeatn.rs":"bfc8f9145c9d8a3ea651f012b7d5a8d2fbbcbefdee76eafd098d02e7c54cda90","src/size_hint.rs":"021e57aad7df8f1e70ef588e9e9b8a1695aab183b1098f1848561f96c5dc9bcb","src/sources.rs":"61637f32c2cea2290ecfc1980c0b2d0f68463839ac09bd81006f8258ab8ecaae","src/tee.rs":"665832aa547389a420c3441470ff2494249f0ed2841be0c6a578367fe9dbd381","src/tuple_impl.rs":"00a9b61942425fb477b9691c3348646c0f9f534ff94f6321027f38c61ce2478c","src/unique_impl.rs":"3b89cdd668b74cc0a0eabb1522489e2305a0d2d8da25d6a1884e8626bbdb5959","src/unziptuple.rs":"84b50e5d29b9ddbf21a46a1cc2fd7877729c7f7da9bdc8ae1966dbaf2d2f6f60","src/with_position.rs":"c8a9b3476b3b90986b004a8877c19ff54b4c6800c5ac7ca1458d914036dacfe9","src/zip_eq_impl.rs":"4a41dc6dfe99359585d50ce648bdc85f15276c602048872b1d152e90841d8cad","src/zip_longest.rs":"f7cf5fffc3ca053ee80b410a05b27de1a475021f6de3181aea981010d7e8453f","src/ziptuple.rs":"7f9df12bf6556f382bbd4ad8cf17eb8b60c1c47fadbce016141133ba0f3384a1","tests/adaptors_no_collect.rs":"f459f36d54f5d475b2b2e83f5a1c98109c15062756ae822fa379486f3eeed666","tests/flatten_ok.rs":"b7894874132918b8229c7150b2637511d8e3e14197d8eeb9382d46b2a514efa2","tests/macros_hygiene.rs":"522afa0106e3f11a5149e9218f89c2329e405546d2ef0ea756d6a27e8a0e9ca3","tests/merge_join.rs":"b08c4ee6529d234c68d411a413b8781455d18a1eab17872d1828bb75a4fcf79b","tests/peeking_take_while.rs":"4b1c394e44a9ef9bc0de707ae080b45803db722f79834c20f15b826d7c3f1f2e","tests/quick.rs":"6fcc0649b9270f024b169b1f499dd4cc7fecb0c9aec0dfc155b264916cc626e7","tests/specializations.rs":"fdd16dc663330033fedcc478609b393d4aa369dc07dc8cda31a75219fb793087","tests/test_core.rs":"32576ba90aa8e5db985b6e6ffe30e3046bc6a11d392db8f6b4bdd2ba48d9b24d","tests/test_std.rs":"f28a78a1912c950e7c37be1e82867e70dc585d60afecdebc7a97965194eee8e6","tests/tuples.rs":"014e4da776174bfe923270e2a359cd9c95b372fce4b952b8138909d6e2c52762","tests/zip.rs":"99af365fe6054ef1c6089d3e604e34da8fea66e55861ae4be9e7336ec8de4b56"},"package":"b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473"} \ No newline at end of file +{"files":{"CHANGELOG.md":"9f94a3c5bdd8dd758864440205c84d73005b8619cd20833449db54f1f484c6bf","Cargo.lock":"b0443f54560491073ca861d8ed664a07a8039872568a527b2add8f362dd9734b","Cargo.toml":"e64e6e088ab537ba843f25a111af102dd434fd58cea3d446dff314cf42ad33e2","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"7576269ea71f767b99297934c0b2367532690f8c4badc695edf8e04ab6a1e545","README.md":"9de81a03c86ca4573d5d0a98eaa4d938bc6c538816f421d1b7499301efb5a454","benches/bench1.rs":"bb06f39db0544b1380cd4929139ccf521a9eecab7ca3f910b9499f965ec0a047","benches/combinations.rs":"51523ee1ca438a56f14711f0b04ee943895062d35859fbe23a2714d2fca3289d","benches/combinations_with_replacement.rs":"11f29160652a2d90ce7ca4b1c339c4457888ab6867e2456ce1c62e3adf9be737","benches/extra/mod.rs":"6ca290d72302a1945078621610b5788060b0de29639decebbdc557a80044aa97","benches/extra/zipslices.rs":"40e9f68a7c00f8429193fca463caef18851fa49b33355cc136bad3ccc840d655","benches/fold_specialization.rs":"5a517bbe29d366a15f6f751660e17ab1aa3e7b21552a1983048c662e34f0d69e","benches/powerset.rs":"6fd9d69a3483b37dc2411f99fb4efa6131577696f2dbdc8d1de9e4d7642fe3a3","benches/tree_fold1.rs":"539232e74f9aaea295a42069ac5af707811e90dc1c71c6e0a9064ffc731999de","benches/tuple_combinations.rs":"16366158743307a0289fc1df423a3cec45009807d410a9fe9922d5b6f8b7d002","benches/tuples.rs":"5a620783ae203e9ff9623d10d2c7fe9911d8b6c811cbad7613afa30e390c759d","examples/iris.data":"596ffd580471ca4d4880f8e439c7281f3b50d8249a5960353cb200b1490f63a0","examples/iris.rs":"1b465ed6a417180913104bc95a545fd9d1a3d67d121871ab737ad87e31b8be37","src/adaptors/coalesce.rs":"a0073325d40f297d29101538d18a267aef81889a999338dc09cb43a31cb4ec8b","src/adaptors/map.rs":"241971e856e468d71323071fb4a09867fbcedb83877320be132dc03516fe60e8","src/adaptors/mod.rs":"7f3bd7d011a348ce5e4bea486ef2e6346b64c7fe27540334d56d3f147f981d59","src/adaptors/multi_product.rs":"bb43e6dce68c815c21006d5b01c56e038d54b0c3bb8ee6bb8a4de11e2952c7ad","src/combinations.rs":"fb25babb459389093f886721016c72bf9f00e51d02735f638d871bb3a447ffd0","src/combinations_with_replacement.rs":"463011a574facbdd84278386b533a90e4dd517f0417e05adb82d182049db1f50","src/concat_impl.rs":"03b1ed61cbed242c286c3c4c5c848dbd57e02ab83fcef264f3a592b58107f324","src/cons_tuples_impl.rs":"c253d03b861831c01d62cacc57b49715ee62f6171e69f6886bb5a6ca0863bc3a","src/diff.rs":"a7800e9ce7a87b53ebe2338481335751fb43d44fa6a1ca719aceaaab40e5c8fe","src/duplicates_impl.rs":"f62fe4b642f501f785721ce5a505cf622a771e457210726dd0fb8b30be7ebbbc","src/either_or_both.rs":"c7ffe60772350c470fb42a5e4ff5087587985206733fe9814eeefa249983239a","src/exactly_one_err.rs":"aa50081f6a31b5109b30e3ed305e3ec2413c6908dedc8990ec5378a99cee2b39","src/extrema_set.rs":"2a25b0b86eed2fd5d05622d591a3085cab823973d450816c2c3b8cb76e9c187e","src/flatten_ok.rs":"fe209fd886ecd9cb98d99625aa0c7274af7e644eff4a10de15b4dec8bbbc934a","src/format.rs":"20fbbe35a98315ceb77ad910ff92319e163ae16452b0c24a8f1eccbc71c9e171","src/free.rs":"dfc57b7f56a08d4986a96b679018b41346576a7a34b668e008cc01109e728750","src/group_map.rs":"f7b02c964f63505d3e36280cfdc1755e05287714201efe983dacf702eee61434","src/groupbylazy.rs":"57ebf7d8a5a752045f94b76db8b80073f46964c28cc0919510fbdea102244918","src/grouping_map.rs":"cbc45ac563345c96f3ac50c78f73c83d870523436a7ab88c1c9a685d204461d3","src/impl_macros.rs":"4f829b458873bed556f1aff2ae4e88dbd576766e2b5bcc07ff3ac8756758e6f4","src/intersperse.rs":"b9717242495846a4a979c95d93d5681caccb7c07a0d889eab763ad3d49a46125","src/k_smallest.rs":"603eb34314c01769ff7f6def2a24cf7a7b38507e6f3658b7aafc23a3b2e9b322","src/kmerge_impl.rs":"a347b0f6fa7715afd8a54d85ce139ed5b14c9e58a16c2b3648f5b288fdb5375f","src/lazy_buffer.rs":"834f6ef7fdf9f00c8a6329beb38eaefb706847ceeec309c221dce705c2c1e05b","src/lib.rs":"703fa755955007c2ddf1c1abe6a20e9a762ba09746c4eeae905e6d417bf3bf31","src/merge_join.rs":"20574fbb0ca610a6ac0ad89fb7e856a629235a14f285954760386cd0de3dc687","src/minmax.rs":"96d3897c28c8c63284d4729becc9ada6855e0953cac6e1bd35cf6f38c50b0ec0","src/multipeek_impl.rs":"35162bca4456bfa20a08e8d40e4d1cc6783dc662778789fdcded60371e975122","src/pad_tail.rs":"04be2ca73abb85815b06b5524c99d6feb2919180c486a4646f9cc6c87462f67b","src/peek_nth.rs":"6a0a51f2f373ce14d3d58595c46464878a14976bf00841a7396c03f9f9ab07ac","src/peeking_take_while.rs":"2293eaba60142f427a8bd1fa6d347b21469cadaaef69a70f28daed3a4166c1b4","src/permutations.rs":"97831e7e26904c3cae68c97e74f7c6981ceb2fb2f2217282a0e5e54083a565fc","src/powerset.rs":"e0ee6b1316b4dd314c1e81502b90ae8113e1cda12168322520c5a65410e584b2","src/process_results_impl.rs":"fd51b2a4785c3b65145703dea4c088c822e5592de939cf228917c6275bee0778","src/put_back_n_impl.rs":"821e047fecd6ca0036290029f4febe7638a3abf1faa05e1e747a3bf9d80ff464","src/rciter_impl.rs":"5b156082ef2d25a94a4ad01d94cba2813c4b3e72e212515a8ad0fc8588f8045d","src/repeatn.rs":"bfc8f9145c9d8a3ea651f012b7d5a8d2fbbcbefdee76eafd098d02e7c54cda90","src/size_hint.rs":"021e57aad7df8f1e70ef588e9e9b8a1695aab183b1098f1848561f96c5dc9bcb","src/sources.rs":"61637f32c2cea2290ecfc1980c0b2d0f68463839ac09bd81006f8258ab8ecaae","src/take_while_inclusive.rs":"f567e91a7f25ed785c3132ff408e3f17b59dce98909041a8c40cd14c0f350f55","src/tee.rs":"665832aa547389a420c3441470ff2494249f0ed2841be0c6a578367fe9dbd381","src/tuple_impl.rs":"8d6c52850bf7f3b9d03fcbaed0e60e5a5becc2f8421ca4bc79e876659804a258","src/unique_impl.rs":"3b89cdd668b74cc0a0eabb1522489e2305a0d2d8da25d6a1884e8626bbdb5959","src/unziptuple.rs":"84b50e5d29b9ddbf21a46a1cc2fd7877729c7f7da9bdc8ae1966dbaf2d2f6f60","src/with_position.rs":"a3652e3e97de78c5c7eeb9a5306225b5ce517d6165b96663820b5f00fae1bff9","src/zip_eq_impl.rs":"4a41dc6dfe99359585d50ce648bdc85f15276c602048872b1d152e90841d8cad","src/zip_longest.rs":"f7cf5fffc3ca053ee80b410a05b27de1a475021f6de3181aea981010d7e8453f","src/ziptuple.rs":"7f9df12bf6556f382bbd4ad8cf17eb8b60c1c47fadbce016141133ba0f3384a1","tests/adaptors_no_collect.rs":"f459f36d54f5d475b2b2e83f5a1c98109c15062756ae822fa379486f3eeed666","tests/flatten_ok.rs":"b7894874132918b8229c7150b2637511d8e3e14197d8eeb9382d46b2a514efa2","tests/macros_hygiene.rs":"522afa0106e3f11a5149e9218f89c2329e405546d2ef0ea756d6a27e8a0e9ca3","tests/merge_join.rs":"b08c4ee6529d234c68d411a413b8781455d18a1eab17872d1828bb75a4fcf79b","tests/peeking_take_while.rs":"f834361c5520dda15eb9e9ebe87507c905462201412b21859d9f83dab91d0e0b","tests/quick.rs":"203619d7de9ae068a5c0c61c398f65f15a878b6ac759cc4575d19f0c90dfd9fa","tests/specializations.rs":"fdd16dc663330033fedcc478609b393d4aa369dc07dc8cda31a75219fb793087","tests/test_core.rs":"32576ba90aa8e5db985b6e6ffe30e3046bc6a11d392db8f6b4bdd2ba48d9b24d","tests/test_std.rs":"16a03cfe359a570685b48b80473d1947a89a49ec9ef744ea175252e2b95c0336","tests/tuples.rs":"014e4da776174bfe923270e2a359cd9c95b372fce4b952b8138909d6e2c52762","tests/zip.rs":"99af365fe6054ef1c6089d3e604e34da8fea66e55861ae4be9e7336ec8de4b56"},"package":"b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/itertools/Cargo.lock temporalio-1.3.0/vendor/itertools/Cargo.lock --- temporalio-1.3.0/vendor/itertools/Cargo.lock 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools/Cargo.lock 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,681 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "anes" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" + +[[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 = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bumpalo" +version = "3.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1ad822118d20d2c234f427000d5acc36eabe1e29a348c89b63dd60b13f28e5d" + +[[package]] +name = "cast" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "ciborium" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c137568cc60b904a7724001b35ce2630fd00d5d84805fbb608ab89509d788f" +dependencies = [ + "ciborium-io", + "ciborium-ll", + "serde", +] + +[[package]] +name = "ciborium-io" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "346de753af073cc87b52b2083a506b38ac176a44cfb05497b622e27be899b369" + +[[package]] +name = "ciborium-ll" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "213030a2b5a4e0c0892b6652260cf6ccac84827b83a85a534e178e3906c4cf1b" +dependencies = [ + "ciborium-io", + "half", +] + +[[package]] +name = "clap" +version = "3.2.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86447ad904c7fb335a790c9d7fe3d0d971dc523b8ccd1561a520de9a85302750" +dependencies = [ + "bitflags", + "clap_lex", + "indexmap", + "textwrap", +] + +[[package]] +name = "clap_lex" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5" +dependencies = [ + "os_str_bytes", +] + +[[package]] +name = "criterion" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c76e09c1aae2bc52b3d2f29e13c6572553b30c4aa1b8a49fd70de6412654cb" +dependencies = [ + "anes", + "atty", + "cast", + "ciborium", + "clap", + "criterion-plot", + "itertools 0.10.4", + "lazy_static", + "num-traits", + "oorandom", + "plotters", + "rayon", + "regex", + "serde", + "serde_derive", + "serde_json", + "tinytemplate", + "walkdir", +] + +[[package]] +name = "criterion-plot" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1" +dependencies = [ + "cast", + "itertools 0.10.4", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2dd04ddaf88237dc3b8d8f9a3c1004b506b54b3313403944054d23c0870c521" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "715e8152b692bba2d374b53d4875445368fdf21a94751410af607a5ac677d1fc" +dependencies = [ + "cfg-if", + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "045ebe27666471bb549370b4b0b3e51b07f56325befa4284db65fc89c02511b1" +dependencies = [ + "autocfg", + "cfg-if", + "crossbeam-utils", + "memoffset", + "once_cell", + "scopeguard", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51887d4adc7b564537b15adcfb307936f8075dfcd5f00dde9a9f1d29383682bc" +dependencies = [ + "cfg-if", + "once_cell", +] + +[[package]] +name = "either" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" + +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "half" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7" + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + +[[package]] +name = "indexmap" +version = "1.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10a35a97730320ffe8e2d410b5d3b69279b98d2c14bdb8b70ea89ecf7888d41e" +dependencies = [ + "autocfg", + "hashbrown", +] + +[[package]] +name = "itertools" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8bf247779e67a9082a4790b45e71ac7cfd1321331a5c856a74a9faebdab78d0" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.11.0" +dependencies = [ + "criterion", + "either", + "paste", + "permutohedron", + "quickcheck", + "rand", +] + +[[package]] +name = "itoa" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c8af84674fe1f223a982c933a0ee1086ac4d4052aa0fb8060c12c6ad838e754" + +[[package]] +name = "js-sys" +version = "0.3.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49409df3e3bf0856b916e2ceaca09ee28e6871cf7d9ce97a692cacfdb2a25a47" +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.133" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0f80d65747a3e43d1596c7c5492d95d5edddaabd45a7fcdb02b95f644164966" + +[[package]] +name = "log" +version = "0.4.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "memoffset" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num-traits" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_cpus" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "once_cell" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f7254b99e31cad77da24b08ebf628882739a608578bb1bcdfc1f9c21260d7c0" + +[[package]] +name = "oorandom" +version = "11.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575" + +[[package]] +name = "os_str_bytes" +version = "6.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ff7415e9ae3fff1225851df9e0d9e4e5479f947619774677a63572e55e80eff" + +[[package]] +name = "paste" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1de2e551fb905ac83f73f7aedf2f0cb4a0da7e35efa24a202a936269f1f18e1" + +[[package]] +name = "permutohedron" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b687ff7b5da449d39e418ad391e5e08da53ec334903ddbb921db208908fc372c" + +[[package]] +name = "plotters" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2538b639e642295546c50fcd545198c9d64ee2a38620a628724a3b266d5fbf97" +dependencies = [ + "num-traits", + "plotters-backend", + "plotters-svg", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "plotters-backend" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "193228616381fecdc1224c62e96946dfbc73ff4384fba576e052ff8c1bea8142" + +[[package]] +name = "plotters-svg" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9a81d2759aae1dae668f783c308bc5c8ebd191ff4184aaa1b37f65a6ae5a56f" +dependencies = [ + "plotters-backend", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" + +[[package]] +name = "proc-macro2" +version = "1.0.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a2ca2c61bc9f3d74d2886294ab7b9853abd9c1ad903a3ac7815c58989bb7bab" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quickcheck" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a44883e74aa97ad63db83c4bf8ca490f02b2fc02f92575e720c8551e843c945f" +dependencies = [ + "rand", + "rand_core", +] + +[[package]] +name = "quote" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom", + "libc", + "rand_chacha", + "rand_core", + "rand_hc", +] + +[[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", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core", +] + +[[package]] +name = "rayon" +version = "1.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd99e5772ead8baa5215278c9b15bf92087709e9c1b2d1f97cdb5a183c933a7d" +dependencies = [ + "autocfg", + "crossbeam-deque", + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "258bcdb5ac6dad48491bb2992db6b7cf74878b0384908af124823d118c99683f" +dependencies = [ + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-utils", + "num_cpus", +] + +[[package]] +name = "regex" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c4eb3267174b8c6c2f654116623910a0fef09c4753f8dd83db29c48a0df988b" +dependencies = [ + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.6.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3f87b73ce11b1619a3c6332f45341e0047173771e8b8b73f87bfeefb7b56244" + +[[package]] +name = "ryu" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09" + +[[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 = "serde" +version = "1.0.144" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f747710de3dcd43b88c9168773254e809d8ddbdf9653b84e2554ab219f17860" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.144" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94ed3a816fb1d101812f83e789f888322c34e291f894f19590dc310963e87a00" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.85" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e55a28e3aaef9d5ce0506d0a14dbba8054ddc7e499ef522dd8b26859ec9d4a44" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "syn" +version = "1.0.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52205623b1b0f064a4e71182c3b18ae902267282930c6d5462c91b859668426e" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "textwrap" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "949517c0cf1bf4ee812e2e07e08ab448e3ae0d23472aee8a06c985f0c8815b16" + +[[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 = "unicode-ident" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcc811dc4066ac62f84f11307873c4850cb653bfa9b1719cee2bd2204a4bc5dd" + +[[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 = "wasm-bindgen" +version = "0.2.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaf9f5aceeec8be17c128b2e93e031fb8a4d469bb9c4ae2d7dc1888b26887268" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c8ffb332579b0557b52d268b91feab8df3615f265d5270fec2a8c95b17c1142" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "052be0f94026e6cbc75cdefc9bae13fd6052cdcaf532fa6c45e7ae33a1e6c810" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c38c045535d93ec4f0b4defec448e4291638ee608530863b1e2ba115d4fff7f" + +[[package]] +name = "web-sys" +version = "0.3.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcda906d8be16e728fd5adc5b729afad4e444e106ab28cd1c7256e54fa61510f" +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" diff -Nru temporalio-1.3.0/vendor/itertools/Cargo.toml temporalio-1.3.0/vendor/itertools/Cargo.toml --- temporalio-1.3.0/vendor/itertools/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -3,30 +3,38 @@ # 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 +# to registry (e.g., crates.io) dependencies. # -# If you believe there's an error in this file please file an -# issue against the rust-lang/cargo repository. If you're -# editing this file be aware that the upstream Cargo.toml -# will likely look very different (and much more reasonable) +# 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" +rust-version = "1.36.0" name = "itertools" -version = "0.10.5" +version = "0.11.0" authors = ["bluss"] exclude = ["/bors.toml"] description = "Extra iterator adaptors, iterator methods, free functions, and macros." documentation = "https://docs.rs/itertools/" readme = "README.md" -keywords = ["iterator", "data-structure", "zip", "product", "group-by"] -categories = ["algorithms", "rust-patterns"] -license = "MIT/Apache-2.0" +keywords = [ + "iterator", + "data-structure", + "zip", + "product", + "group-by", +] +categories = [ + "algorithms", + "rust-patterns", +] +license = "MIT OR Apache-2.0" repository = "https://github.com/rust-itertools/itertools" -[package.metadata.release] -no-dev-version = true + [profile.bench] -debug = true +debug = 2 [lib] test = false @@ -63,11 +71,13 @@ [[bench]] name = "powerset" harness = false + [dependencies.either] version = "1.0" default-features = false + [dev-dependencies.criterion] -version = "=0" +version = "0.4.0" [dev-dependencies.paste] version = "1.0.0" @@ -77,7 +87,7 @@ [dev-dependencies.quickcheck] version = "0.9" -default-features = false +default_features = false [dev-dependencies.rand] version = "0.7" @@ -85,4 +95,7 @@ [features] default = ["use_std"] use_alloc = [] -use_std = ["use_alloc", "either/use_std"] +use_std = [ + "use_alloc", + "either/use_std", +] diff -Nru temporalio-1.3.0/vendor/itertools/CHANGELOG.md temporalio-1.3.0/vendor/itertools/CHANGELOG.md --- temporalio-1.3.0/vendor/itertools/CHANGELOG.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools/CHANGELOG.md 2023-10-30 19:40:00.000000000 +0000 @@ -1,5 +1,31 @@ # Changelog +## 0.11.0 + +### Breaking +- Make `Itertools::merge_join_by` also accept functions returning bool (#704) +- Implement `PeekingNext` transitively over mutable references (#643) +- Change `with_position` to yield `(Position, Item)` instead of `Position` (#699) + +### Added +- Add `Itertools::take_while_inclusive` (#616) +- Implement `PeekingNext` for `PeekingTakeWhile` (#644) +- Add `EitherOrBoth::{just_left, just_right, into_left, into_right, as_deref, as_deref_mut, left_or_insert, right_or_insert, left_or_insert_with, right_or_insert_with, insert_left, insert_right, insert_both}` (#629) +- Implement `Clone` for `CircularTupleWindows` (#686) +- Implement `Clone` for `Chunks` (#683) +- Add `Itertools::process_results` (#680) + +### Changed +- Use `Cell` instead of `RefCell` in `Format` and `FormatWith` (#608) +- CI tweaks (#674, #675) +- Document and test the difference between stable and unstable sorts (#653) +- Fix documentation error on `Itertools::max_set_by_key` (#692) +- Move MSRV metadata to `Cargo.toml` (#672) +- Implement `equal` with `Iterator::eq` (#591) + +## 0.10.5 + - Maintenance + ## 0.10.4 - Add `EitherOrBoth::or` and `EitherOrBoth::or_else` (#593) - Add `min_set`, `max_set` et al. (#613, #323) @@ -7,6 +33,9 @@ - Documentation fixes (#612, #625, #632, #633, #634, #638) - Code maintenance (#623, #624, #627, #630) +## 0.10.3 + - Maintenance + ## 0.10.2 - Add `Itertools::multiunzip` (#362, #565) - Add `intersperse` and `intersperse_with` free functions (#555) diff -Nru temporalio-1.3.0/vendor/itertools/clippy.toml temporalio-1.3.0/vendor/itertools/clippy.toml --- temporalio-1.3.0/vendor/itertools/clippy.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools/clippy.toml 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -msrv = "1.36.0" diff -Nru temporalio-1.3.0/vendor/itertools/README.md temporalio-1.3.0/vendor/itertools/README.md --- temporalio-1.3.0/vendor/itertools/README.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools/README.md 2023-10-30 19:40:00.000000000 +0000 @@ -11,7 +11,7 @@ ```toml [dependencies] -itertools = "0.10.5" +itertools = "0.11.0" ``` How to use in your crate: diff -Nru temporalio-1.3.0/vendor/itertools/src/either_or_both.rs temporalio-1.3.0/vendor/itertools/src/either_or_both.rs --- temporalio-1.3.0/vendor/itertools/src/either_or_both.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools/src/either_or_both.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,3 +1,5 @@ +use core::ops::{Deref, DerefMut}; + use crate::EitherOrBoth::*; use either::Either; @@ -14,7 +16,7 @@ } impl EitherOrBoth { - /// If `Left`, or `Both`, return true, otherwise, return false. + /// If `Left`, or `Both`, return true. Otherwise, return false. pub fn has_left(&self) -> bool { self.as_ref().left().is_some() } @@ -24,7 +26,7 @@ self.as_ref().right().is_some() } - /// If Left, return true otherwise, return false. + /// If `Left`, return true. Otherwise, return false. /// Exclusive version of [`has_left`](EitherOrBoth::has_left). pub fn is_left(&self) -> bool { match *self { @@ -33,7 +35,7 @@ } } - /// If Right, return true otherwise, return false. + /// If `Right`, return true. Otherwise, return false. /// Exclusive version of [`has_right`](EitherOrBoth::has_right). pub fn is_right(&self) -> bool { match *self { @@ -42,13 +44,12 @@ } } - /// If Right, return true otherwise, return false. - /// Equivalent to `self.as_ref().both().is_some()`. + /// If `Both`, return true. Otherwise, return false. pub fn is_both(&self) -> bool { self.as_ref().both().is_some() } - /// If `Left`, or `Both`, return `Some` with the left value, otherwise, return `None`. + /// If `Left`, or `Both`, return `Some` with the left value. Otherwise, return `None`. pub fn left(self) -> Option { match self { Left(left) | Both(left, _) => Some(left), @@ -56,7 +57,7 @@ } } - /// If `Right`, or `Both`, return `Some` with the right value, otherwise, return `None`. + /// If `Right`, or `Both`, return `Some` with the right value. Otherwise, return `None`. pub fn right(self) -> Option { match self { Right(right) | Both(_, right) => Some(right), @@ -64,7 +65,57 @@ } } - /// If Both, return `Some` tuple containing left and right. + /// If `Left`, return `Some` with the left value. If `Right` or `Both`, return `None`. + /// + /// # Examples + /// + /// ``` + /// // On the `Left` variant. + /// # use itertools::{EitherOrBoth, EitherOrBoth::{Left, Right, Both}}; + /// let x: EitherOrBoth<_, ()> = Left("bonjour"); + /// assert_eq!(x.just_left(), Some("bonjour")); + /// + /// // On the `Right` variant. + /// let x: EitherOrBoth<(), _> = Right("hola"); + /// assert_eq!(x.just_left(), None); + /// + /// // On the `Both` variant. + /// let x = Both("bonjour", "hola"); + /// assert_eq!(x.just_left(), None); + /// ``` + pub fn just_left(self) -> Option { + match self { + Left(left) => Some(left), + _ => None, + } + } + + /// If `Right`, return `Some` with the right value. If `Left` or `Both`, return `None`. + /// + /// # Examples + /// + /// ``` + /// // On the `Left` variant. + /// # use itertools::{EitherOrBoth::{Left, Right, Both}, EitherOrBoth}; + /// let x: EitherOrBoth<_, ()> = Left("auf wiedersehen"); + /// assert_eq!(x.just_left(), Some("auf wiedersehen")); + /// + /// // On the `Right` variant. + /// let x: EitherOrBoth<(), _> = Right("adios"); + /// assert_eq!(x.just_left(), None); + /// + /// // On the `Both` variant. + /// let x = Both("auf wiedersehen", "adios"); + /// assert_eq!(x.just_left(), None); + /// ``` + pub fn just_right(self) -> Option { + match self { + Right(right) => Some(right), + _ => None, + } + } + + /// If `Both`, return `Some` containing the left and right values. Otherwise, return `None`. pub fn both(self) -> Option<(A, B)> { match self { Both(a, b) => Some((a, b)), @@ -72,6 +123,28 @@ } } + /// If `Left` or `Both`, return the left value. Otherwise, convert the right value and return it. + pub fn into_left(self) -> A + where + B: Into, + { + match self { + Left(a) | Both(a, _) => a, + Right(b) => b.into(), + } + } + + /// If `Right` or `Both`, return the right value. Otherwise, convert the left value and return it. + pub fn into_right(self) -> B + where + A: Into, + { + match self { + Right(b) | Both(_, b) => b, + Left(a) => a.into(), + } + } + /// Converts from `&EitherOrBoth` to `EitherOrBoth<&A, &B>`. pub fn as_ref(&self) -> EitherOrBoth<&A, &B> { match *self { @@ -90,6 +163,32 @@ } } + /// Converts from `&EitherOrBoth` to `EitherOrBoth<&_, &_>` using the [`Deref`] trait. + pub fn as_deref(&self) -> EitherOrBoth<&A::Target, &B::Target> + where + A: Deref, + B: Deref, + { + match *self { + Left(ref left) => Left(left), + Right(ref right) => Right(right), + Both(ref left, ref right) => Both(left, right), + } + } + + /// Converts from `&mut EitherOrBoth` to `EitherOrBoth<&mut _, &mut _>` using the [`DerefMut`] trait. + pub fn as_deref_mut(&mut self) -> EitherOrBoth<&mut A::Target, &mut B::Target> + where + A: DerefMut, + B: DerefMut, + { + match *self { + Left(ref mut left) => Left(left), + Right(ref mut right) => Right(right), + Both(ref mut left, ref mut right) => Both(left, right), + } + } + /// Convert `EitherOrBoth` to `EitherOrBoth`. pub fn flip(self) -> EitherOrBoth { match self { @@ -227,10 +326,152 @@ Both(inner_l, inner_r) => (inner_l, inner_r), } } + + /// Returns a mutable reference to the left value. If the left value is not present, + /// it is replaced with `val`. + pub fn left_or_insert(&mut self, val: A) -> &mut A { + self.left_or_insert_with(|| val) + } + + /// Returns a mutable reference to the right value. If the right value is not present, + /// it is replaced with `val`. + pub fn right_or_insert(&mut self, val: B) -> &mut B { + self.right_or_insert_with(|| val) + } + + /// If the left value is not present, replace it the value computed by the closure `f`. + /// Returns a mutable reference to the now-present left value. + pub fn left_or_insert_with(&mut self, f: F) -> &mut A + where + F: FnOnce() -> A, + { + match self { + Left(left) | Both(left, _) => left, + Right(_) => self.insert_left(f()), + } + } + + /// If the right value is not present, replace it the value computed by the closure `f`. + /// Returns a mutable reference to the now-present right value. + pub fn right_or_insert_with(&mut self, f: F) -> &mut B + where + F: FnOnce() -> B, + { + match self { + Right(right) | Both(_, right) => right, + Left(_) => self.insert_right(f()), + } + } + + /// Sets the `left` value of this instance, and returns a mutable reference to it. + /// Does not affect the `right` value. + /// + /// # Examples + /// ``` + /// # use itertools::{EitherOrBoth, EitherOrBoth::{Left, Right, Both}}; + /// + /// // Overwriting a pre-existing value. + /// let mut either: EitherOrBoth<_, ()> = Left(0_u32); + /// assert_eq!(*either.insert_left(69), 69); + /// + /// // Inserting a second value. + /// let mut either = Right("no"); + /// assert_eq!(*either.insert_left("yes"), "yes"); + /// assert_eq!(either, Both("yes", "no")); + /// ``` + pub fn insert_left(&mut self, val: A) -> &mut A { + match self { + Left(left) | Both(left, _) => { + *left = val; + left + } + Right(right) => { + // This is like a map in place operation. We move out of the reference, + // change the value, and then move back into the reference. + unsafe { + // SAFETY: We know this pointer is valid for reading since we got it from a reference. + let right = std::ptr::read(right as *mut _); + // SAFETY: Again, we know the pointer is valid since we got it from a reference. + std::ptr::write(self as *mut _, Both(val, right)); + } + + if let Both(left, _) = self { + left + } else { + // SAFETY: The above pattern will always match, since we just + // set `self` equal to `Both`. + unsafe { std::hint::unreachable_unchecked() } + } + } + } + } + + /// Sets the `right` value of this instance, and returns a mutable reference to it. + /// Does not affect the `left` value. + /// + /// # Examples + /// ``` + /// # use itertools::{EitherOrBoth, EitherOrBoth::{Left, Both}}; + /// // Overwriting a pre-existing value. + /// let mut either: EitherOrBoth<_, ()> = Left(0_u32); + /// assert_eq!(*either.insert_left(69), 69); + /// + /// // Inserting a second value. + /// let mut either = Left("what's"); + /// assert_eq!(*either.insert_right(9 + 10), 21 - 2); + /// assert_eq!(either, Both("what's", 9+10)); + /// ``` + pub fn insert_right(&mut self, val: B) -> &mut B { + match self { + Right(right) | Both(_, right) => { + *right = val; + right + } + Left(left) => { + // This is like a map in place operation. We move out of the reference, + // change the value, and then move back into the reference. + unsafe { + // SAFETY: We know this pointer is valid for reading since we got it from a reference. + let left = std::ptr::read(left as *mut _); + // SAFETY: Again, we know the pointer is valid since we got it from a reference. + std::ptr::write(self as *mut _, Both(left, val)); + } + if let Both(_, right) = self { + right + } else { + // SAFETY: The above pattern will always match, since we just + // set `self` equal to `Both`. + unsafe { std::hint::unreachable_unchecked() } + } + } + } + } + + /// Set `self` to `Both(..)`, containing the specified left and right values, + /// and returns a mutable reference to those values. + pub fn insert_both(&mut self, left: A, right: B) -> (&mut A, &mut B) { + *self = Both(left, right); + if let Both(left, right) = self { + (left, right) + } else { + // SAFETY: The above pattern will always match, since we just + // set `self` equal to `Both`. + unsafe { std::hint::unreachable_unchecked() } + } + } } impl EitherOrBoth { - /// Return either value of left, right, or the product of `f` applied where `Both` are present. + /// Return either value of left, right, or apply a function `f` to both values if both are present. + /// The input function has to return the same type as both Right and Left carry. + /// + /// # Examples + /// ``` + /// # use itertools::EitherOrBoth; + /// assert_eq!(EitherOrBoth::Both(3, 7).reduce(u32::max), 7); + /// assert_eq!(EitherOrBoth::Left(3).reduce(u32::max), 3); + /// assert_eq!(EitherOrBoth::Right(7).reduce(u32::max), 7); + /// ``` pub fn reduce(self, f: F) -> T where F: FnOnce(T, T) -> T, diff -Nru temporalio-1.3.0/vendor/itertools/src/format.rs temporalio-1.3.0/vendor/itertools/src/format.rs --- temporalio-1.3.0/vendor/itertools/src/format.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools/src/format.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,5 +1,5 @@ +use std::cell::Cell; use std::fmt; -use std::cell::RefCell; /// Format all iterator elements lazily, separated by `sep`. /// @@ -7,11 +7,10 @@ /// exhausted. /// /// See [`.format_with()`](crate::Itertools::format_with) for more information. -#[derive(Clone)] pub struct FormatWith<'a, I, F> { sep: &'a str, /// FormatWith uses interior mutability because Display::fmt takes &self. - inner: RefCell>, + inner: Cell>, } /// Format all iterator elements lazily, separated by `sep`. @@ -21,38 +20,40 @@ /// /// See [`.format()`](crate::Itertools::format) /// for more information. -#[derive(Clone)] pub struct Format<'a, I> { sep: &'a str, /// Format uses interior mutability because Display::fmt takes &self. - inner: RefCell>, + inner: Cell>, } pub fn new_format(iter: I, separator: &str, f: F) -> FormatWith<'_, I, F> - where I: Iterator, - F: FnMut(I::Item, &mut dyn FnMut(&dyn fmt::Display) -> fmt::Result) -> fmt::Result +where + I: Iterator, + F: FnMut(I::Item, &mut dyn FnMut(&dyn fmt::Display) -> fmt::Result) -> fmt::Result, { FormatWith { sep: separator, - inner: RefCell::new(Some((iter, f))), + inner: Cell::new(Some((iter, f))), } } pub fn new_format_default(iter: I, separator: &str) -> Format<'_, I> - where I: Iterator, +where + I: Iterator, { Format { sep: separator, - inner: RefCell::new(Some(iter)), + inner: Cell::new(Some(iter)), } } impl<'a, I, F> fmt::Display for FormatWith<'a, I, F> - where I: Iterator, - F: FnMut(I::Item, &mut dyn FnMut(&dyn fmt::Display) -> fmt::Result) -> fmt::Result +where + I: Iterator, + F: FnMut(I::Item, &mut dyn FnMut(&dyn fmt::Display) -> fmt::Result) -> fmt::Result, { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let (mut iter, mut format) = match self.inner.borrow_mut().take() { + let (mut iter, mut format) = match self.inner.take() { Some(t) => t, None => panic!("FormatWith: was already formatted once"), }; @@ -71,12 +72,15 @@ } impl<'a, I> Format<'a, I> - where I: Iterator, +where + I: Iterator, { - fn format(&self, f: &mut fmt::Formatter, mut cb: F) -> fmt::Result - where F: FnMut(&I::Item, &mut fmt::Formatter) -> fmt::Result, - { - let mut iter = match self.inner.borrow_mut().take() { + fn format( + &self, + f: &mut fmt::Formatter, + cb: fn(&I::Item, &mut fmt::Formatter) -> fmt::Result, + ) -> fmt::Result { + let mut iter = match self.inner.take() { Some(t) => t, None => panic!("Format: was already formatted once"), }; @@ -109,5 +113,56 @@ } } -impl_format!{Display Debug - UpperExp LowerExp UpperHex LowerHex Octal Binary Pointer} +impl_format! {Display Debug UpperExp LowerExp UpperHex LowerHex Octal Binary Pointer} + +impl<'a, I, F> Clone for FormatWith<'a, I, F> +where + (I, F): Clone, +{ + fn clone(&self) -> Self { + struct PutBackOnDrop<'r, 'a, I, F> { + into: &'r FormatWith<'a, I, F>, + inner: Option<(I, F)>, + } + // This ensures we preserve the state of the original `FormatWith` if `Clone` panics + impl<'r, 'a, I, F> Drop for PutBackOnDrop<'r, 'a, I, F> { + fn drop(&mut self) { + self.into.inner.set(self.inner.take()) + } + } + let pbod = PutBackOnDrop { + inner: self.inner.take(), + into: self, + }; + Self { + inner: Cell::new(pbod.inner.clone()), + sep: self.sep, + } + } +} + +impl<'a, I> Clone for Format<'a, I> +where + I: Clone, +{ + fn clone(&self) -> Self { + struct PutBackOnDrop<'r, 'a, I> { + into: &'r Format<'a, I>, + inner: Option, + } + // This ensures we preserve the state of the original `FormatWith` if `Clone` panics + impl<'r, 'a, I> Drop for PutBackOnDrop<'r, 'a, I> { + fn drop(&mut self) { + self.into.inner.set(self.inner.take()) + } + } + let pbod = PutBackOnDrop { + inner: self.inner.take(), + into: self, + }; + Self { + inner: Cell::new(pbod.inner.clone()), + sep: self.sep, + } + } +} diff -Nru temporalio-1.3.0/vendor/itertools/src/groupbylazy.rs temporalio-1.3.0/vendor/itertools/src/groupbylazy.rs --- temporalio-1.3.0/vendor/itertools/src/groupbylazy.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools/src/groupbylazy.rs 2023-10-30 19:40:00.000000000 +0000 @@ -19,7 +19,7 @@ /// `ChunkIndex` acts like the grouping key function for `IntoChunks` -#[derive(Debug)] +#[derive(Debug, Clone)] struct ChunkIndex { size: usize, index: usize, @@ -50,7 +50,7 @@ } } - +#[derive(Clone)] struct GroupInner where I: Iterator { @@ -471,6 +471,13 @@ index: Cell, } +impl Clone for IntoChunks + where I: Clone + Iterator, + I::Item: Clone, +{ + clone_fields!(inner, index); +} + impl IntoChunks where I: Iterator, @@ -507,6 +514,7 @@ /// /// See [`.chunks()`](crate::Itertools::chunks) for more information. #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] +#[derive(Clone)] pub struct Chunks<'a, I: 'a> where I: Iterator, I::Item: 'a, diff -Nru temporalio-1.3.0/vendor/itertools/src/lib.rs temporalio-1.3.0/vendor/itertools/src/lib.rs --- temporalio-1.3.0/vendor/itertools/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -146,6 +146,7 @@ pub use crate::repeatn::RepeatN; #[allow(deprecated)] pub use crate::sources::{RepeatCall, Unfold, Iterate}; + pub use crate::take_while_inclusive::TakeWhileInclusive; #[cfg(feature = "use_alloc")] pub use crate::tee::Tee; pub use crate::tuple_impl::{TupleBuffer, TupleWindows, CircularTupleWindows, Tuples}; @@ -233,6 +234,7 @@ mod repeatn; mod size_hint; mod sources; +mod take_while_inclusive; #[cfg(feature = "use_alloc")] mod tee; mod tuple_impl; @@ -904,7 +906,7 @@ /// Return an iterator adaptor that flattens every `Result::Ok` value into /// a series of `Result::Ok` values. `Result::Err` values are unchanged. - /// + /// /// This is useful when you have some common error type for your crate and /// need to propagate it upwards, but the `Result::Ok` case needs to be flattened. /// @@ -914,7 +916,7 @@ /// let input = vec![Ok(0..2), Err(false), Ok(2..4)]; /// let it = input.iter().cloned().flatten_ok(); /// itertools::assert_equal(it.clone(), vec![Ok(0), Ok(1), Err(false), Ok(2), Ok(3)]); - /// + /// /// // This can also be used to propagate errors when collecting. /// let output_result: Result, bool> = it.collect(); /// assert_eq!(output_result, Err(false)); @@ -926,6 +928,43 @@ flatten_ok::flatten_ok(self) } + /// “Lift†a function of the values of the current iterator so as to process + /// an iterator of `Result` values instead. + /// + /// `processor` is a closure that receives an adapted version of the iterator + /// as the only argument — the adapted iterator produces elements of type `T`, + /// as long as the original iterator produces `Ok` values. + /// + /// If the original iterable produces an error at any point, the adapted + /// iterator ends and it will return the error iself. + /// + /// Otherwise, the return value from the closure is returned wrapped + /// inside `Ok`. + /// + /// # Example + /// + /// ``` + /// use itertools::Itertools; + /// + /// type Item = Result; + /// + /// let first_values: Vec = vec![Ok(1), Ok(0), Ok(3)]; + /// let second_values: Vec = vec![Ok(2), Ok(1), Err("overflow")]; + /// + /// // “Lift†the iterator .max() method to work on the Ok-values. + /// let first_max = first_values.into_iter().process_results(|iter| iter.max().unwrap_or(0)); + /// let second_max = second_values.into_iter().process_results(|iter| iter.max().unwrap_or(0)); + /// + /// assert_eq!(first_max, Ok(3)); + /// assert!(second_max.is_err()); + /// ``` + fn process_results(self, processor: F) -> Result + where Self: Iterator> + Sized, + F: FnOnce(ProcessResults) -> R + { + process_results(self, processor) + } + /// Return an iterator adaptor that merges the two base iterators in /// ascending order. If both base iterators are sorted (ascending), the /// result is sorted. @@ -935,8 +974,8 @@ /// ``` /// use itertools::Itertools; /// - /// let a = (0..11).step(3); - /// let b = (0..11).step(5); + /// let a = (0..11).step_by(3); + /// let b = (0..11).step_by(5); /// let it = a.merge(b); /// itertools::assert_equal(it, vec![0, 0, 3, 5, 6, 9, 10]); /// ``` @@ -975,7 +1014,10 @@ /// Create an iterator that merges items from both this and the specified /// iterator in ascending order. /// - /// It chooses whether to pair elements based on the `Ordering` returned by the + /// The function can either return an `Ordering` variant or a boolean. + /// + /// If `cmp_fn` returns `Ordering`, + /// it chooses whether to pair elements based on the `Ordering` returned by the /// specified compare function. At any point, inspecting the tip of the /// iterators `I` and `J` as items `i` of type `I::Item` and `j` of type /// `J::Item` respectively, the resulting iterator will: @@ -991,18 +1033,46 @@ /// use itertools::Itertools; /// use itertools::EitherOrBoth::{Left, Right, Both}; /// - /// let multiples_of_2 = (0..10).step(2); - /// let multiples_of_3 = (0..10).step(3); + /// let a = vec![0, 2, 4, 6, 1].into_iter(); + /// let b = (0..10).step_by(3); + /// + /// itertools::assert_equal( + /// a.merge_join_by(b, |i, j| i.cmp(j)), + /// vec![Both(0, 0), Left(2), Right(3), Left(4), Both(6, 6), Left(1), Right(9)] + /// ); + /// ``` + /// + /// If `cmp_fn` returns `bool`, + /// it chooses whether to pair elements based on the boolean returned by the + /// specified function. At any point, inspecting the tip of the + /// iterators `I` and `J` as items `i` of type `I::Item` and `j` of type + /// `J::Item` respectively, the resulting iterator will: + /// + /// - Emit `Either::Left(i)` when `true`, + /// and remove `i` from its source iterator + /// - Emit `Either::Right(j)` when `false`, + /// and remove `j` from its source iterator + /// + /// It is similar to the `Ordering` case if the first argument is considered + /// "less" than the second argument. + /// + /// ``` + /// use itertools::Itertools; + /// use itertools::Either::{Left, Right}; + /// + /// let a = vec![0, 2, 4, 6, 1].into_iter(); + /// let b = (0..10).step_by(3); /// /// itertools::assert_equal( - /// multiples_of_2.merge_join_by(multiples_of_3, |i, j| i.cmp(j)), - /// vec![Both(0, 0), Left(2), Right(3), Left(4), Both(6, 6), Left(8), Right(9)] + /// a.merge_join_by(b, |i, j| i <= j), + /// vec![Left(0), Right(0), Left(2), Right(3), Left(4), Left(6), Left(1), Right(6), Right(9)] /// ); /// ``` #[inline] - fn merge_join_by(self, other: J, cmp_fn: F) -> MergeJoinBy + fn merge_join_by(self, other: J, cmp_fn: F) -> MergeJoinBy where J: IntoIterator, - F: FnMut(&Self::Item, &J::Item) -> std::cmp::Ordering, + F: FnMut(&Self::Item, &J::Item) -> T, + T: merge_join::OrderingOrBool, Self: Sized { merge_join_by(self, other, cmp_fn) @@ -1018,9 +1088,9 @@ /// ``` /// use itertools::Itertools; /// - /// let a = (0..6).step(3); - /// let b = (1..6).step(3); - /// let c = (2..6).step(3); + /// let a = (0..6).step_by(3); + /// let b = (1..6).step_by(3); + /// let c = (2..6).step_by(3); /// let it = vec![a, b, c].into_iter().kmerge(); /// itertools::assert_equal(it, vec![0, 1, 2, 3, 4, 5]); /// ``` @@ -1389,6 +1459,74 @@ adaptors::take_while_ref(self, accept) } + /// Returns an iterator adaptor that consumes elements while the given + /// predicate is `true`, *including* the element for which the predicate + /// first returned `false`. + /// + /// The [`.take_while()`][std::iter::Iterator::take_while] adaptor is useful + /// when you want items satisfying a predicate, but to know when to stop + /// taking elements, we have to consume that first element that doesn't + /// satisfy the predicate. This adaptor includes that element where + /// [`.take_while()`][std::iter::Iterator::take_while] would drop it. + /// + /// The [`.take_while_ref()`][crate::Itertools::take_while_ref] adaptor + /// serves a similar purpose, but this adaptor doesn't require [`Clone`]ing + /// the underlying elements. + /// + /// ```rust + /// # use itertools::Itertools; + /// let items = vec![1, 2, 3, 4, 5]; + /// let filtered: Vec<_> = items + /// .into_iter() + /// .take_while_inclusive(|&n| n % 3 != 0) + /// .collect(); + /// + /// assert_eq!(filtered, vec![1, 2, 3]); + /// ``` + /// + /// ```rust + /// # use itertools::Itertools; + /// let items = vec![1, 2, 3, 4, 5]; + /// + /// let take_while_inclusive_result: Vec<_> = items + /// .iter() + /// .copied() + /// .take_while_inclusive(|&n| n % 3 != 0) + /// .collect(); + /// let take_while_result: Vec<_> = items + /// .into_iter() + /// .take_while(|&n| n % 3 != 0) + /// .collect(); + /// + /// assert_eq!(take_while_inclusive_result, vec![1, 2, 3]); + /// assert_eq!(take_while_result, vec![1, 2]); + /// // both iterators have the same items remaining at this point---the 3 + /// // is lost from the `take_while` vec + /// ``` + /// + /// ```rust + /// # use itertools::Itertools; + /// #[derive(Debug, PartialEq)] + /// struct NoCloneImpl(i32); + /// + /// let non_clonable_items: Vec<_> = vec![1, 2, 3, 4, 5] + /// .into_iter() + /// .map(NoCloneImpl) + /// .collect(); + /// let filtered: Vec<_> = non_clonable_items + /// .into_iter() + /// .take_while_inclusive(|n| n.0 % 3 != 0) + /// .collect(); + /// let expected: Vec<_> = vec![1, 2, 3].into_iter().map(NoCloneImpl).collect(); + /// assert_eq!(filtered, expected); + fn take_while_inclusive(&mut self, accept: F) -> TakeWhileInclusive + where + Self: Sized, + F: FnMut(&Self::Item) -> bool, + { + take_while_inclusive::TakeWhileInclusive::new(self, accept) + } + /// Return an iterator adaptor that filters `Option` iterator elements /// and produces `A`. Stops on the first `None` encountered. /// @@ -1620,24 +1758,24 @@ pad_tail::pad_using(self, min, f) } - /// Return an iterator adaptor that wraps each element in a `Position` to + /// Return an iterator adaptor that combines each element with a `Position` to /// ease special-case handling of the first or last elements. /// /// Iterator element type is - /// [`Position`](Position) + /// [`(Position, Self::Item)`](Position) /// /// ``` /// use itertools::{Itertools, Position}; /// /// let it = (0..4).with_position(); /// itertools::assert_equal(it, - /// vec![Position::First(0), - /// Position::Middle(1), - /// Position::Middle(2), - /// Position::Last(3)]); + /// vec![(Position::First, 0), + /// (Position::Middle, 1), + /// (Position::Middle, 2), + /// (Position::Last, 3)]); /// /// let it = (0..1).with_position(); - /// itertools::assert_equal(it, vec![Position::Only(0)]); + /// itertools::assert_equal(it, vec![(Position::Only, 0)]); /// ``` fn with_position(self) -> WithPosition where Self: Sized, @@ -1810,14 +1948,14 @@ /// /// #[derive(PartialEq, Debug)] /// enum Enum { A, B, C, D, E, } - /// + /// /// let mut iter = vec![Enum::A, Enum::B, Enum::C, Enum::D].into_iter(); - /// + /// /// // search `iter` for `B` /// assert_eq!(iter.contains(&Enum::B), true); /// // `B` was found, so the iterator now rests at the item after `B` (i.e, `C`). /// assert_eq!(iter.next(), Some(Enum::C)); - /// + /// /// // search `iter` for `E` /// assert_eq!(iter.contains(&Enum::E), false); /// // `E` wasn't found, so `iter` is now exhausted @@ -1858,6 +1996,37 @@ } } + /// If there are elements and they are all equal, return a single copy of that element. + /// If there are no elements, return an Error containing None. + /// If there are elements and they are not all equal, return a tuple containing the first + /// two non-equal elements found. + /// + /// ``` + /// use itertools::Itertools; + /// + /// let data = vec![1, 1, 1, 2, 2, 3, 3, 3, 4, 5, 5]; + /// assert_eq!(data.iter().all_equal_value(), Err(Some((&1, &2)))); + /// assert_eq!(data[0..3].iter().all_equal_value(), Ok(&1)); + /// assert_eq!(data[3..5].iter().all_equal_value(), Ok(&2)); + /// assert_eq!(data[5..8].iter().all_equal_value(), Ok(&3)); + /// + /// let data : Option = None; + /// assert_eq!(data.into_iter().all_equal_value(), Err(None)); + /// ``` + fn all_equal_value(&mut self) -> Result> + where + Self: Sized, + Self::Item: PartialEq + { + let first = self.next().ok_or(None)?; + let other = self.find(|x| x != &first); + if let Some(other) = other { + Err(Some((first, other))) + } else { + Ok(first) + } + } + /// Check whether all elements are unique (non equal). /// /// Empty iterators are considered to have unique elements: @@ -2481,6 +2650,8 @@ /// **Note:** This consumes the entire iterator, uses the /// [`slice::sort_unstable`] method and returns the result as a new /// iterator that owns its elements. + /// + /// This sort is unstable (i.e., may reorder equal elements). /// /// The sorted iterator, if directly collected to a `Vec`, is converted /// without any extra copying or allocation cost. @@ -2510,6 +2681,8 @@ /// **Note:** This consumes the entire iterator, uses the /// [`slice::sort_unstable_by`] method and returns the result as a new /// iterator that owns its elements. + /// + /// This sort is unstable (i.e., may reorder equal elements). /// /// The sorted iterator, if directly collected to a `Vec`, is converted /// without any extra copying or allocation cost. @@ -2543,6 +2716,8 @@ /// **Note:** This consumes the entire iterator, uses the /// [`slice::sort_unstable_by_key`] method and returns the result as a new /// iterator that owns its elements. + /// + /// This sort is unstable (i.e., may reorder equal elements). /// /// The sorted iterator, if directly collected to a `Vec`, is converted /// without any extra copying or allocation cost. @@ -2577,6 +2752,8 @@ /// **Note:** This consumes the entire iterator, uses the /// [`slice::sort`] method and returns the result as a new /// iterator that owns its elements. + /// + /// This sort is stable (i.e., does not reorder equal elements). /// /// The sorted iterator, if directly collected to a `Vec`, is converted /// without any extra copying or allocation cost. @@ -2606,6 +2783,8 @@ /// **Note:** This consumes the entire iterator, uses the /// [`slice::sort_by`] method and returns the result as a new /// iterator that owns its elements. + /// + /// This sort is stable (i.e., does not reorder equal elements). /// /// The sorted iterator, if directly collected to a `Vec`, is converted /// without any extra copying or allocation cost. @@ -2614,7 +2793,7 @@ /// use itertools::Itertools; /// /// // sort people in descending order by age - /// let people = vec![("Jane", 20), ("John", 18), ("Jill", 30), ("Jack", 27)]; + /// let people = vec![("Jane", 20), ("John", 18), ("Jill", 30), ("Jack", 30)]; /// /// let oldest_people_first = people /// .into_iter() @@ -2639,6 +2818,8 @@ /// **Note:** This consumes the entire iterator, uses the /// [`slice::sort_by_key`] method and returns the result as a new /// iterator that owns its elements. + /// + /// This sort is stable (i.e., does not reorder equal elements). /// /// The sorted iterator, if directly collected to a `Vec`, is converted /// without any extra copying or allocation cost. @@ -2647,7 +2828,7 @@ /// use itertools::Itertools; /// /// // sort people in descending order by age - /// let people = vec![("Jane", 20), ("John", 18), ("Jill", 30), ("Jack", 27)]; + /// let people = vec![("Jane", 20), ("John", 18), ("Jill", 30), ("Jack", 30)]; /// /// let oldest_people_first = people /// .into_iter() @@ -2674,6 +2855,8 @@ /// **Note:** This consumes the entire iterator, uses the /// [`slice::sort_by_cached_key`] method and returns the result as a new /// iterator that owns its elements. + /// + /// This sort is stable (i.e., does not reorder equal elements). /// /// The sorted iterator, if directly collected to a `Vec`, is converted /// without any extra copying or allocation cost. @@ -2682,7 +2865,7 @@ /// use itertools::Itertools; /// /// // sort people in descending order by age - /// let people = vec![("Jane", 20), ("John", 18), ("Jill", 30), ("Jack", 27)]; + /// let people = vec![("Jane", 20), ("John", 18), ("Jill", 30), ("Jack", 30)]; /// /// let oldest_people_first = people /// .into_iter() @@ -2867,13 +3050,13 @@ group_map::into_group_map_by(self, f) } - /// Constructs a `GroupingMap` to be used later with one of the efficient + /// Constructs a `GroupingMap` to be used later with one of the efficient /// group-and-fold operations it allows to perform. - /// + /// /// The input iterator must yield item in the form of `(K, V)` where the /// value of type `K` will be used as key to identify the groups and the /// value of type `V` as value for the folding operation. - /// + /// /// See [`GroupingMap`] for more informations /// on what operations are available. #[cfg(feature = "use_std")] @@ -2884,12 +3067,12 @@ grouping_map::new(self) } - /// Constructs a `GroupingMap` to be used later with one of the efficient + /// Constructs a `GroupingMap` to be used later with one of the efficient /// group-and-fold operations it allows to perform. - /// + /// /// The values from this iterator will be used as values for the folding operation /// while the keys will be obtained from the values by calling `key_mapper`. - /// + /// /// See [`GroupingMap`] for more informations /// on what operations are available. #[cfg(feature = "use_std")] @@ -3059,7 +3242,7 @@ ) } - /// Return all minimum elements of an iterator, as determined by + /// Return all maximum elements of an iterator, as determined by /// the specified function. /// /// # Examples @@ -3600,7 +3783,7 @@ /// first_name: &'static str, /// last_name: &'static str, /// } - /// + /// /// let characters = /// vec![ /// Character { first_name: "Amy", last_name: "Pond" }, @@ -3611,12 +3794,12 @@ /// Character { first_name: "James", last_name: "Norington" }, /// Character { first_name: "James", last_name: "Kirk" }, /// ]; - /// - /// let first_name_frequency = + /// + /// let first_name_frequency = /// characters /// .into_iter() /// .counts_by(|c| c.first_name); - /// + /// /// assert_eq!(first_name_frequency["Amy"], 3); /// assert_eq!(first_name_frequency["James"], 4); /// assert_eq!(first_name_frequency.contains_key("Asha"), false); @@ -3637,7 +3820,7 @@ /// column. /// /// This function is, in some sense, the opposite of [`multizip`]. - /// + /// /// ``` /// use itertools::Itertools; /// diff -Nru temporalio-1.3.0/vendor/itertools/src/merge_join.rs temporalio-1.3.0/vendor/itertools/src/merge_join.rs --- temporalio-1.3.0/vendor/itertools/src/merge_join.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools/src/merge_join.rs 2023-10-30 19:40:00.000000000 +0000 @@ -2,19 +2,23 @@ use std::iter::Fuse; use std::fmt; +use either::Either; + use super::adaptors::{PutBack, put_back}; use crate::either_or_both::EitherOrBoth; +use crate::size_hint::{self, SizeHint}; #[cfg(doc)] use crate::Itertools; /// Return an iterator adaptor that merge-joins items from the two base iterators in ascending order. /// /// [`IntoIterator`] enabled version of [`Itertools::merge_join_by`]. -pub fn merge_join_by(left: I, right: J, cmp_fn: F) +pub fn merge_join_by(left: I, right: J, cmp_fn: F) -> MergeJoinBy where I: IntoIterator, J: IntoIterator, - F: FnMut(&I::Item, &J::Item) -> Ordering + F: FnMut(&I::Item, &J::Item) -> T, + T: OrderingOrBool, { MergeJoinBy { left: put_back(left.into_iter().fuse()), @@ -30,7 +34,66 @@ pub struct MergeJoinBy { left: PutBack>, right: PutBack>, - cmp_fn: F + cmp_fn: F, +} + +pub trait OrderingOrBool { + type MergeResult; + fn left(left: L) -> Self::MergeResult; + fn right(right: R) -> Self::MergeResult; + // "merge" never returns (Some(...), Some(...), ...) so Option> + // is appealing but it is always followed by two put_backs, so we think the compiler is + // smart enough to optimize it. Or we could move put_backs into "merge". + fn merge(self, left: L, right: R) -> (Option, Option, Self::MergeResult); + fn size_hint(left: SizeHint, right: SizeHint) -> SizeHint; +} + +impl OrderingOrBool for Ordering { + type MergeResult = EitherOrBoth; + fn left(left: L) -> Self::MergeResult { + EitherOrBoth::Left(left) + } + fn right(right: R) -> Self::MergeResult { + EitherOrBoth::Right(right) + } + fn merge(self, left: L, right: R) -> (Option, Option, Self::MergeResult) { + match self { + Ordering::Equal => (None, None, EitherOrBoth::Both(left, right)), + Ordering::Less => (None, Some(right), EitherOrBoth::Left(left)), + Ordering::Greater => (Some(left), None, EitherOrBoth::Right(right)), + } + } + fn size_hint(left: SizeHint, right: SizeHint) -> SizeHint { + let (a_lower, a_upper) = left; + let (b_lower, b_upper) = right; + let lower = ::std::cmp::max(a_lower, b_lower); + let upper = match (a_upper, b_upper) { + (Some(x), Some(y)) => x.checked_add(y), + _ => None, + }; + (lower, upper) + } +} + +impl OrderingOrBool for bool { + type MergeResult = Either; + fn left(left: L) -> Self::MergeResult { + Either::Left(left) + } + fn right(right: R) -> Self::MergeResult { + Either::Right(right) + } + fn merge(self, left: L, right: R) -> (Option, Option, Self::MergeResult) { + if self { + (None, Some(right), Either::Left(left)) + } else { + (Some(left), None, Either::Right(right)) + } + } + fn size_hint(left: SizeHint, right: SizeHint) -> SizeHint { + // Not ExactSizeIterator because size may be larger than usize + size_hint::add(left, right) + } } impl Clone for MergeJoinBy @@ -52,49 +115,34 @@ debug_fmt_fields!(MergeJoinBy, left, right); } -impl Iterator for MergeJoinBy +impl Iterator for MergeJoinBy where I: Iterator, J: Iterator, - F: FnMut(&I::Item, &J::Item) -> Ordering + F: FnMut(&I::Item, &J::Item) -> T, + T: OrderingOrBool, { - type Item = EitherOrBoth; + type Item = T::MergeResult; fn next(&mut self) -> Option { match (self.left.next(), self.right.next()) { (None, None) => None, - (Some(left), None) => - Some(EitherOrBoth::Left(left)), - (None, Some(right)) => - Some(EitherOrBoth::Right(right)), + (Some(left), None) => Some(T::left(left)), + (None, Some(right)) => Some(T::right(right)), (Some(left), Some(right)) => { - match (self.cmp_fn)(&left, &right) { - Ordering::Equal => - Some(EitherOrBoth::Both(left, right)), - Ordering::Less => { - self.right.put_back(right); - Some(EitherOrBoth::Left(left)) - }, - Ordering::Greater => { - self.left.put_back(left); - Some(EitherOrBoth::Right(right)) - } + let (left, right, next) = (self.cmp_fn)(&left, &right).merge(left, right); + if let Some(left) = left { + self.left.put_back(left); } + if let Some(right) = right { + self.right.put_back(right); + } + Some(next) } } } - fn size_hint(&self) -> (usize, Option) { - let (a_lower, a_upper) = self.left.size_hint(); - let (b_lower, b_upper) = self.right.size_hint(); - - let lower = ::std::cmp::max(a_lower, b_lower); - - let upper = match (a_upper, b_upper) { - (Some(x), Some(y)) => x.checked_add(y), - _ => None, - }; - - (lower, upper) + fn size_hint(&self) -> SizeHint { + T::size_hint(self.left.size_hint(), self.right.size_hint()) } fn count(mut self) -> usize { @@ -106,10 +154,12 @@ (None, Some(_right)) => break count + 1 + self.right.into_parts().1.count(), (Some(left), Some(right)) => { count += 1; - match (self.cmp_fn)(&left, &right) { - Ordering::Equal => {} - Ordering::Less => self.right.put_back(right), - Ordering::Greater => self.left.put_back(left), + let (left, right, _) = (self.cmp_fn)(&left, &right).merge(left, right); + if let Some(left) = left { + self.left.put_back(left); + } + if let Some(right) = right { + self.right.put_back(right); } } } @@ -122,27 +172,24 @@ match (self.left.next(), self.right.next()) { (None, None) => break previous_element, (Some(left), None) => { - break Some(EitherOrBoth::Left( + break Some(T::left( self.left.into_parts().1.last().unwrap_or(left), )) } (None, Some(right)) => { - break Some(EitherOrBoth::Right( + break Some(T::right( self.right.into_parts().1.last().unwrap_or(right), )) } (Some(left), Some(right)) => { - previous_element = match (self.cmp_fn)(&left, &right) { - Ordering::Equal => Some(EitherOrBoth::Both(left, right)), - Ordering::Less => { - self.right.put_back(right); - Some(EitherOrBoth::Left(left)) - } - Ordering::Greater => { - self.left.put_back(left); - Some(EitherOrBoth::Right(right)) - } + let (left, right, elem) = (self.cmp_fn)(&left, &right).merge(left, right); + if let Some(left) = left { + self.left.put_back(left); } + if let Some(right) = right { + self.right.put_back(right); + } + previous_element = Some(elem); } } } @@ -156,13 +203,17 @@ n -= 1; match (self.left.next(), self.right.next()) { (None, None) => break None, - (Some(_left), None) => break self.left.nth(n).map(EitherOrBoth::Left), - (None, Some(_right)) => break self.right.nth(n).map(EitherOrBoth::Right), - (Some(left), Some(right)) => match (self.cmp_fn)(&left, &right) { - Ordering::Equal => {} - Ordering::Less => self.right.put_back(right), - Ordering::Greater => self.left.put_back(left), - }, + (Some(_left), None) => break self.left.nth(n).map(T::left), + (None, Some(_right)) => break self.right.nth(n).map(T::right), + (Some(left), Some(right)) => { + let (left, right, _) = (self.cmp_fn)(&left, &right).merge(left, right); + if let Some(left) = left { + self.left.put_back(left); + } + if let Some(right) = right { + self.right.put_back(right); + } + } } } } diff -Nru temporalio-1.3.0/vendor/itertools/src/peeking_take_while.rs temporalio-1.3.0/vendor/itertools/src/peeking_take_while.rs --- temporalio-1.3.0/vendor/itertools/src/peeking_take_while.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools/src/peeking_take_while.rs 2023-10-30 19:40:00.000000000 +0000 @@ -16,7 +16,18 @@ /// if `accept` returns true, return it as the next element, /// else None. fn peeking_next(&mut self, accept: F) -> Option - where F: FnOnce(&Self::Item) -> bool; + where Self: Sized, + F: FnOnce(&Self::Item) -> bool; +} + +impl<'a, I> PeekingNext for &'a mut I + where I: PeekingNext, +{ + fn peeking_next(&mut self, accept: F) -> Option + where F: FnOnce(&Self::Item) -> bool + { + (*self).peeking_next(accept) + } } impl PeekingNext for Peekable @@ -115,6 +126,18 @@ } } +impl<'a, I, F> PeekingNext for PeekingTakeWhile<'a, I, F> + where I: PeekingNext, + F: FnMut(&I::Item) -> bool, +{ + fn peeking_next(&mut self, g: G) -> Option + where G: FnOnce(&Self::Item) -> bool, + { + let f = &mut self.f; + self.iter.peeking_next(|r| f(r) && g(r)) + } +} + // Some iterators are so lightweight we can simply clone them to save their // state and use that for peeking. macro_rules! peeking_next_by_clone { diff -Nru temporalio-1.3.0/vendor/itertools/src/process_results_impl.rs temporalio-1.3.0/vendor/itertools/src/process_results_impl.rs --- temporalio-1.3.0/vendor/itertools/src/process_results_impl.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools/src/process_results_impl.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,3 +1,5 @@ +#[cfg(doc)] +use crate::Itertools; /// An iterator that produces only the `T` values as long as the /// inner iterator produces `Ok(T)`. @@ -52,38 +54,7 @@ /// “Lift†a function of the values of an iterator so that it can process /// an iterator of `Result` values instead. /// -/// `iterable` is an iterator or iterable with `Result` elements, where -/// `T` is the value type and `E` the error type. -/// -/// `processor` is a closure that receives an adapted version of the iterable -/// as the only argument — the adapted iterator produces elements of type `T`, -/// as long as the original iterator produces `Ok` values. -/// -/// If the original iterable produces an error at any point, the adapted -/// iterator ends and the `process_results` function will return the -/// error iself. -/// -/// Otherwise, the return value from the closure is returned wrapped -/// inside `Ok`. -/// -/// # Example -/// -/// ``` -/// use itertools::process_results; -/// -/// type R = Result; -/// -/// let first_values: Vec = vec![Ok(1), Ok(0), Ok(3)]; -/// let second_values: Vec = vec![Ok(2), Ok(1), Err("overflow")]; -/// -/// // “Lift†the iterator .max() method to work on the values in Results using process_results -/// -/// let first_max = process_results(first_values, |iter| iter.max().unwrap_or(0)); -/// let second_max = process_results(second_values, |iter| iter.max().unwrap_or(0)); -/// -/// assert_eq!(first_max, Ok(3)); -/// assert!(second_max.is_err()); -/// ``` +/// [`IntoIterator`] enabled version of [`Itertools::process_results`]. pub fn process_results(iterable: I, processor: F) -> Result where I: IntoIterator>, F: FnOnce(ProcessResults) -> R diff -Nru temporalio-1.3.0/vendor/itertools/src/take_while_inclusive.rs temporalio-1.3.0/vendor/itertools/src/take_while_inclusive.rs --- temporalio-1.3.0/vendor/itertools/src/take_while_inclusive.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools/src/take_while_inclusive.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,68 @@ +use core::iter::FusedIterator; +use std::fmt; + +/// An iterator adaptor that consumes elements while the given predicate is +/// `true`, including the element for which the predicate first returned +/// `false`. +/// +/// See [`.take_while_inclusive()`](crate::Itertools::take_while_inclusive) +/// for more information. +#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] +pub struct TakeWhileInclusive<'a, I: 'a, F> { + iter: &'a mut I, + predicate: F, + done: bool, +} + +impl<'a, I, F> TakeWhileInclusive<'a, I, F> +where + I: Iterator, + F: FnMut(&I::Item) -> bool, +{ + /// Create a new [`TakeWhileInclusive`] from an iterator and a predicate. + pub fn new(iter: &'a mut I, predicate: F) -> Self { + Self { iter, predicate, done: false} + } +} + +impl<'a, I, F> fmt::Debug for TakeWhileInclusive<'a, I, F> + where I: Iterator + fmt::Debug, +{ + debug_fmt_fields!(TakeWhileInclusive, iter); +} + +impl<'a, I, F> Iterator for TakeWhileInclusive<'a, I, F> +where + I: Iterator, + F: FnMut(&I::Item) -> bool +{ + type Item = I::Item; + + fn next(&mut self) -> Option { + if self.done { + None + } else { + self.iter.next().map(|item| { + if !(self.predicate)(&item) { + self.done = true; + } + item + }) + } + } + + fn size_hint(&self) -> (usize, Option) { + if self.done { + (0, Some(0)) + } else { + (0, self.iter.size_hint().1) + } + } +} + +impl FusedIterator for TakeWhileInclusive<'_, I, F> +where + I: Iterator, + F: FnMut(&I::Item) -> bool +{ +} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/itertools/src/tuple_impl.rs temporalio-1.3.0/vendor/itertools/src/tuple_impl.rs --- temporalio-1.3.0/vendor/itertools/src/tuple_impl.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools/src/tuple_impl.rs 2023-10-30 19:40:00.000000000 +0000 @@ -194,14 +194,14 @@ T::Item: Clone {} -/// An iterator over all windows,wrapping back to the first elements when the +/// An iterator over all windows, wrapping back to the first elements when the /// window would otherwise exceed the length of the iterator, producing tuples /// of a specific size. /// /// See [`.circular_tuple_windows()`](crate::Itertools::circular_tuple_windows) for more /// information. #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] -#[derive(Debug)] +#[derive(Debug, Clone)] pub struct CircularTupleWindows where I: Iterator + Clone, T: TupleCollect + Clone diff -Nru temporalio-1.3.0/vendor/itertools/src/with_position.rs temporalio-1.3.0/vendor/itertools/src/with_position.rs --- temporalio-1.3.0/vendor/itertools/src/with_position.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools/src/with_position.rs 2023-10-30 19:40:00.000000000 +0000 @@ -2,7 +2,7 @@ /// An iterator adaptor that wraps each element in an [`Position`]. /// -/// Iterator element type is `Position`. +/// Iterator element type is `(Position, I::Item)`. /// /// See [`.with_position()`](crate::Itertools::with_position) for more information. #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] @@ -30,36 +30,24 @@ } } -/// A value yielded by `WithPosition`. +/// The first component of the value yielded by `WithPosition`. /// Indicates the position of this element in the iterator results. /// /// See [`.with_position()`](crate::Itertools::with_position) for more information. #[derive(Copy, Clone, Debug, PartialEq)] -pub enum Position { +pub enum Position { /// This is the first element. - First(T), + First, /// This is neither the first nor the last element. - Middle(T), + Middle, /// This is the last element. - Last(T), + Last, /// This is the only element. - Only(T), -} - -impl Position { - /// Return the inner value. - pub fn into_inner(self) -> T { - match self { - Position::First(x) | - Position::Middle(x) | - Position::Last(x) | - Position::Only(x) => x, - } - } + Only, } impl Iterator for WithPosition { - type Item = Position; + type Item = (Position, I::Item); fn next(&mut self) -> Option { match self.peekable.next() { @@ -70,15 +58,15 @@ // Peek to see if this is also the last item, // in which case tag it as `Only`. match self.peekable.peek() { - Some(_) => Some(Position::First(item)), - None => Some(Position::Only(item)), + Some(_) => Some((Position::First, item)), + None => Some((Position::Only, item)), } } else { // Have seen the first item, and there's something left. // Peek to see if this is the last item. match self.peekable.peek() { - Some(_) => Some(Position::Middle(item)), - None => Some(Position::Last(item)), + Some(_) => Some((Position::Middle, item)), + None => Some((Position::Last, item)), } } } diff -Nru temporalio-1.3.0/vendor/itertools/tests/peeking_take_while.rs temporalio-1.3.0/vendor/itertools/tests/peeking_take_while.rs --- temporalio-1.3.0/vendor/itertools/tests/peeking_take_while.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools/tests/peeking_take_while.rs 2023-10-30 19:40:00.000000000 +0000 @@ -48,3 +48,22 @@ r.peeking_take_while(|_| true).count(); assert_eq!(r.next(), None); } + +#[test] +fn peeking_take_while_nested() { + let mut xs = (0..10).peekable(); + let ys: Vec<_> = xs + .peeking_take_while(|x| *x < 6) + .peeking_take_while(|x| *x != 3) + .collect(); + assert_eq!(ys, vec![0, 1, 2]); + assert_eq!(xs.next(), Some(3)); + + let mut xs = (4..10).peekable(); + let ys: Vec<_> = xs + .peeking_take_while(|x| *x != 3) + .peeking_take_while(|x| *x < 6) + .collect(); + assert_eq!(ys, vec![4, 5]); + assert_eq!(xs.next(), Some(6)); +} diff -Nru temporalio-1.3.0/vendor/itertools/tests/quick.rs temporalio-1.3.0/vendor/itertools/tests/quick.rs --- temporalio-1.3.0/vendor/itertools/tests/quick.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools/tests/quick.rs 2023-10-30 19:40:00.000000000 +0000 @@ -830,6 +830,31 @@ } quickcheck! { + fn merge_join_by_ordering_vs_bool(a: Vec, b: Vec) -> bool { + use either::Either; + use itertools::free::merge_join_by; + let mut has_equal = false; + let it_ord = merge_join_by(a.clone(), b.clone(), Ord::cmp).flat_map(|v| match v { + EitherOrBoth::Both(l, r) => { + has_equal = true; + vec![Either::Left(l), Either::Right(r)] + } + EitherOrBoth::Left(l) => vec![Either::Left(l)], + EitherOrBoth::Right(r) => vec![Either::Right(r)], + }); + let it_bool = merge_join_by(a, b, PartialOrd::le); + itertools::equal(it_ord, it_bool) || has_equal + } + fn merge_join_by_bool_unwrapped_is_merge_by(a: Vec, b: Vec) -> bool { + use either::Either; + use itertools::free::merge_join_by; + let it = a.clone().into_iter().merge_by(b.clone(), PartialOrd::ge); + let it_join = merge_join_by(a, b, PartialOrd::ge).map(Either::into_inner); + itertools::equal(it, it_join) + } +} + +quickcheck! { fn size_tee(a: Vec) -> bool { let (mut t1, mut t2) = a.iter().tee(); t1.next(); @@ -994,6 +1019,17 @@ } quickcheck! { + fn chunk_clone_equal(a: Vec, size: u8) -> () { + let mut size = size; + if size == 0 { + size += 1; + } + let it = a.chunks(size as usize); + itertools::assert_equal(it.clone(), it); + } +} + +quickcheck! { fn equal_chunks_lazy(a: Vec, size: u8) -> bool { let mut size = size; if size == 0 { @@ -1010,7 +1046,71 @@ } } +// tuple iterators quickcheck! { + fn equal_circular_tuple_windows_1(a: Vec) -> bool { + let x = a.iter().map(|e| (e,) ); + let y = a.iter().circular_tuple_windows::<(_,)>(); + itertools::assert_equal(x,y); + true + } + + fn equal_circular_tuple_windows_2(a: Vec) -> bool { + let x = (0..a.len()).map(|start_idx| ( + &a[start_idx], + &a[(start_idx + 1) % a.len()], + )); + let y = a.iter().circular_tuple_windows::<(_, _)>(); + itertools::assert_equal(x,y); + true + } + + fn equal_circular_tuple_windows_3(a: Vec) -> bool { + let x = (0..a.len()).map(|start_idx| ( + &a[start_idx], + &a[(start_idx + 1) % a.len()], + &a[(start_idx + 2) % a.len()], + )); + let y = a.iter().circular_tuple_windows::<(_, _, _)>(); + itertools::assert_equal(x,y); + true + } + + fn equal_circular_tuple_windows_4(a: Vec) -> bool { + let x = (0..a.len()).map(|start_idx| ( + &a[start_idx], + &a[(start_idx + 1) % a.len()], + &a[(start_idx + 2) % a.len()], + &a[(start_idx + 3) % a.len()], + )); + let y = a.iter().circular_tuple_windows::<(_, _, _, _)>(); + itertools::assert_equal(x,y); + true + } + + fn equal_cloned_circular_tuple_windows(a: Vec) -> bool { + let x = a.iter().circular_tuple_windows::<(_, _, _, _)>(); + let y = x.clone(); + itertools::assert_equal(x,y); + true + } + + fn equal_cloned_circular_tuple_windows_noninitial(a: Vec) -> bool { + let mut x = a.iter().circular_tuple_windows::<(_, _, _, _)>(); + let _ = x.next(); + let y = x.clone(); + itertools::assert_equal(x,y); + true + } + + fn equal_cloned_circular_tuple_windows_complete(a: Vec) -> bool { + let mut x = a.iter().circular_tuple_windows::<(_, _, _, _)>(); + for _ in x.by_ref() {} + let y = x.clone(); + itertools::assert_equal(x,y); + true + } + fn equal_tuple_windows_1(a: Vec) -> bool { let x = a.windows(1).map(|s| (&s[0], )); let y = a.iter().tuple_windows::<(_,)>(); diff -Nru temporalio-1.3.0/vendor/itertools/tests/test_std.rs temporalio-1.3.0/vendor/itertools/tests/test_std.rs --- temporalio-1.3.0/vendor/itertools/tests/test_std.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools/tests/test_std.rs 2023-10-30 19:40:00.000000000 +0000 @@ -221,6 +221,22 @@ } #[test] +fn all_equal_value() { + assert_eq!("".chars().all_equal_value(), Err(None)); + assert_eq!("A".chars().all_equal_value(), Ok('A')); + assert_eq!("AABBCCC".chars().all_equal_value(), Err(Some(('A', 'B')))); + assert_eq!("AAAAAAA".chars().all_equal_value(), Ok('A')); + { + let mut it = [1,2,3].iter().copied(); + let result = it.all_equal_value(); + assert_eq!(result, Err(Some((1, 2)))); + let remaining = it.next(); + assert_eq!(remaining, Some(3)); + assert!(it.next().is_none()); + } +} + +#[test] fn all_unique() { assert!("ABCDEFGH".chars().all_unique()); assert!(!"ABCDEFGA".chars().all_unique()); @@ -1160,9 +1176,9 @@ #[test] fn multiunzip() { - let (a, b, c): (Vec<_>, Vec<_>, Vec<_>) = [(0, 1, 2), (3, 4, 5), (6, 7, 8)].iter().cloned().multiunzip(); + let (a, b, c): (Vec<_>, Vec<_>, Vec<_>) = [(0, 1, 2), (3, 4, 5), (6, 7, 8)].iter().cloned().multiunzip(); assert_eq!((a, b, c), (vec![0, 3, 6], vec![1, 4, 7], vec![2, 5, 8])); let (): () = [(), (), ()].iter().cloned().multiunzip(); - let t: (Vec<_>, Vec<_>, Vec<_>, Vec<_>, Vec<_>, Vec<_>, Vec<_>, Vec<_>, Vec<_>, Vec<_>, Vec<_>, Vec<_>) = [(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)].iter().cloned().multiunzip(); + let t: (Vec<_>, Vec<_>, Vec<_>, Vec<_>, Vec<_>, Vec<_>, Vec<_>, Vec<_>, Vec<_>, Vec<_>, Vec<_>, Vec<_>) = [(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)].iter().cloned().multiunzip(); assert_eq!(t, (vec![0], vec![1], vec![2], vec![3], vec![4], vec![5], vec![6], vec![7], vec![8], vec![9], vec![10], vec![11])); } diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/benches/bench1.rs temporalio-1.3.0/vendor/itertools-0.10.5/benches/bench1.rs --- temporalio-1.3.0/vendor/itertools-0.10.5/benches/bench1.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/benches/bench1.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,877 @@ +use criterion::{black_box, criterion_group, criterion_main, Criterion}; +use itertools::Itertools; +use itertools::free::cloned; +use itertools::iproduct; + +use std::iter::repeat; +use std::cmp; +use std::ops::{Add, Range}; + +mod extra; + +use crate::extra::ZipSlices; + +fn slice_iter(c: &mut Criterion) { + let xs: Vec<_> = repeat(1i32).take(20).collect(); + + c.bench_function("slice iter", move |b| { + b.iter(|| for elt in xs.iter() { + black_box(elt); + }) + }); +} + +fn slice_iter_rev(c: &mut Criterion) { + let xs: Vec<_> = repeat(1i32).take(20).collect(); + + c.bench_function("slice iter rev", move |b| { + b.iter(|| for elt in xs.iter().rev() { + black_box(elt); + }) + }); +} + +fn zip_default_zip(c: &mut Criterion) { + let xs = vec![0; 1024]; + let ys = vec![0; 768]; + let xs = black_box(xs); + let ys = black_box(ys); + + c.bench_function("zip default zip", move |b| { + b.iter(|| { + for (&x, &y) in xs.iter().zip(&ys) { + black_box(x); + black_box(y); + } + }) + }); +} + +fn zipdot_i32_default_zip(c: &mut Criterion) { + let xs = vec![2; 1024]; + let ys = vec![2; 768]; + let xs = black_box(xs); + let ys = black_box(ys); + + c.bench_function("zipdot i32 default zip", move |b| { + b.iter(|| { + let mut s = 0; + for (&x, &y) in xs.iter().zip(&ys) { + s += x * y; + } + s + }) + }); +} + +fn zipdot_f32_default_zip(c: &mut Criterion) { + let xs = vec![2f32; 1024]; + let ys = vec![2f32; 768]; + let xs = black_box(xs); + let ys = black_box(ys); + + c.bench_function("zipdot f32 default zip", move |b| { + b.iter(|| { + let mut s = 0.; + for (&x, &y) in xs.iter().zip(&ys) { + s += x * y; + } + s + }) + }); +} + +fn zip_default_zip3(c: &mut Criterion) { + let xs = vec![0; 1024]; + let ys = vec![0; 768]; + let zs = vec![0; 766]; + let xs = black_box(xs); + let ys = black_box(ys); + let zs = black_box(zs); + + c.bench_function("zip default zip3", move |b| { + b.iter(|| { + for ((&x, &y), &z) in xs.iter().zip(&ys).zip(&zs) { + black_box(x); + black_box(y); + black_box(z); + } + }) + }); +} + +fn zip_slices_ziptuple(c: &mut Criterion) { + let xs = vec![0; 1024]; + let ys = vec![0; 768]; + + c.bench_function("zip slices ziptuple", move |b| { + b.iter(|| { + let xs = black_box(&xs); + let ys = black_box(&ys); + for (&x, &y) in itertools::multizip((xs, ys)) { + black_box(x); + black_box(y); + } + }) + }); +} + +fn zipslices(c: &mut Criterion) { + let xs = vec![0; 1024]; + let ys = vec![0; 768]; + let xs = black_box(xs); + let ys = black_box(ys); + + c.bench_function("zipslices", move |b| { + b.iter(|| { + for (&x, &y) in ZipSlices::new(&xs, &ys) { + black_box(x); + black_box(y); + } + }) + }); +} + +fn zipslices_mut(c: &mut Criterion) { + let xs = vec![0; 1024]; + let ys = vec![0; 768]; + let xs = black_box(xs); + let mut ys = black_box(ys); + + c.bench_function("zipslices mut", move |b| { + b.iter(|| { + for (&x, &mut y) in ZipSlices::from_slices(&xs[..], &mut ys[..]) { + black_box(x); + black_box(y); + } + }) + }); +} + +fn zipdot_i32_zipslices(c: &mut Criterion) { + let xs = vec![2; 1024]; + let ys = vec![2; 768]; + let xs = black_box(xs); + let ys = black_box(ys); + + c.bench_function("zipdot i32 zipslices", move |b| { + b.iter(|| { + let mut s = 0i32; + for (&x, &y) in ZipSlices::new(&xs, &ys) { + s += x * y; + } + s + }) + }); +} + +fn zipdot_f32_zipslices(c: &mut Criterion) { + let xs = vec![2f32; 1024]; + let ys = vec![2f32; 768]; + let xs = black_box(xs); + let ys = black_box(ys); + + c.bench_function("zipdot f32 zipslices", move |b| { + b.iter(|| { + let mut s = 0.; + for (&x, &y) in ZipSlices::new(&xs, &ys) { + s += x * y; + } + s + }) + }); +} + +fn zip_checked_counted_loop(c: &mut Criterion) { + let xs = vec![0; 1024]; + let ys = vec![0; 768]; + let xs = black_box(xs); + let ys = black_box(ys); + + c.bench_function("zip checked counted loop", move |b| { + b.iter(|| { + // Must slice to equal lengths, and then bounds checks are eliminated! + let len = cmp::min(xs.len(), ys.len()); + let xs = &xs[..len]; + let ys = &ys[..len]; + + for i in 0..len { + let x = xs[i]; + let y = ys[i]; + black_box(x); + black_box(y); + } + }) + }); +} + +fn zipdot_i32_checked_counted_loop(c: &mut Criterion) { + let xs = vec![2; 1024]; + let ys = vec![2; 768]; + let xs = black_box(xs); + let ys = black_box(ys); + + c.bench_function("zipdot i32 checked counted loop", move |b| { + b.iter(|| { + // Must slice to equal lengths, and then bounds checks are eliminated! + let len = cmp::min(xs.len(), ys.len()); + let xs = &xs[..len]; + let ys = &ys[..len]; + + let mut s = 0i32; + + for i in 0..len { + s += xs[i] * ys[i]; + } + s + }) + }); +} + +fn zipdot_f32_checked_counted_loop(c: &mut Criterion) { + let xs = vec![2f32; 1024]; + let ys = vec![2f32; 768]; + let xs = black_box(xs); + let ys = black_box(ys); + + c.bench_function("zipdot f32 checked counted loop", move |b| { + b.iter(|| { + // Must slice to equal lengths, and then bounds checks are eliminated! + let len = cmp::min(xs.len(), ys.len()); + let xs = &xs[..len]; + let ys = &ys[..len]; + + let mut s = 0.; + + for i in 0..len { + s += xs[i] * ys[i]; + } + s + }) + }); +} + +fn zipdot_f32_checked_counted_unrolled_loop(c: &mut Criterion) { + let xs = vec![2f32; 1024]; + let ys = vec![2f32; 768]; + let xs = black_box(xs); + let ys = black_box(ys); + + c.bench_function("zipdot f32 checked counted unrolled loop", move |b| { + b.iter(|| { + // Must slice to equal lengths, and then bounds checks are eliminated! + let len = cmp::min(xs.len(), ys.len()); + let mut xs = &xs[..len]; + let mut ys = &ys[..len]; + + let mut s = 0.; + let (mut p0, mut p1, mut p2, mut p3, mut p4, mut p5, mut p6, mut p7) = + (0., 0., 0., 0., 0., 0., 0., 0.); + + // how to unroll and have bounds checks eliminated (by cristicbz) + // split sum into eight parts to enable vectorization (by bluss) + while xs.len() >= 8 { + p0 += xs[0] * ys[0]; + p1 += xs[1] * ys[1]; + p2 += xs[2] * ys[2]; + p3 += xs[3] * ys[3]; + p4 += xs[4] * ys[4]; + p5 += xs[5] * ys[5]; + p6 += xs[6] * ys[6]; + p7 += xs[7] * ys[7]; + + xs = &xs[8..]; + ys = &ys[8..]; + } + s += p0 + p4; + s += p1 + p5; + s += p2 + p6; + s += p3 + p7; + + for i in 0..xs.len() { + s += xs[i] * ys[i]; + } + s + }) + }); +} + +fn zip_unchecked_counted_loop(c: &mut Criterion) { + let xs = vec![0; 1024]; + let ys = vec![0; 768]; + let xs = black_box(xs); + let ys = black_box(ys); + + c.bench_function("zip unchecked counted loop", move |b| { + b.iter(|| { + let len = cmp::min(xs.len(), ys.len()); + for i in 0..len { + unsafe { + let x = *xs.get_unchecked(i); + let y = *ys.get_unchecked(i); + black_box(x); + black_box(y); + } + } + }) + }); +} + +fn zipdot_i32_unchecked_counted_loop(c: &mut Criterion) { + let xs = vec![2; 1024]; + let ys = vec![2; 768]; + let xs = black_box(xs); + let ys = black_box(ys); + + c.bench_function("zipdot i32 unchecked counted loop", move |b| { + b.iter(|| { + let len = cmp::min(xs.len(), ys.len()); + let mut s = 0i32; + for i in 0..len { + unsafe { + let x = *xs.get_unchecked(i); + let y = *ys.get_unchecked(i); + s += x * y; + } + } + s + }) + }); +} + +fn zipdot_f32_unchecked_counted_loop(c: &mut Criterion) { + let xs = vec![2.; 1024]; + let ys = vec![2.; 768]; + let xs = black_box(xs); + let ys = black_box(ys); + + c.bench_function("zipdot f32 unchecked counted loop", move |b| { + b.iter(|| { + let len = cmp::min(xs.len(), ys.len()); + let mut s = 0f32; + for i in 0..len { + unsafe { + let x = *xs.get_unchecked(i); + let y = *ys.get_unchecked(i); + s += x * y; + } + } + s + }) + }); +} + +fn zip_unchecked_counted_loop3(c: &mut Criterion) { + let xs = vec![0; 1024]; + let ys = vec![0; 768]; + let zs = vec![0; 766]; + let xs = black_box(xs); + let ys = black_box(ys); + let zs = black_box(zs); + + c.bench_function("zip unchecked counted loop3", move |b| { + b.iter(|| { + let len = cmp::min(xs.len(), cmp::min(ys.len(), zs.len())); + for i in 0..len { + unsafe { + let x = *xs.get_unchecked(i); + let y = *ys.get_unchecked(i); + let z = *zs.get_unchecked(i); + black_box(x); + black_box(y); + black_box(z); + } + } + }) + }); +} + +fn group_by_lazy_1(c: &mut Criterion) { + let mut data = vec![0; 1024]; + for (index, elt) in data.iter_mut().enumerate() { + *elt = index / 10; + } + + let data = black_box(data); + + c.bench_function("group by lazy 1", move |b| { + b.iter(|| { + for (_key, group) in &data.iter().group_by(|elt| **elt) { + for elt in group { + black_box(elt); + } + } + }) + }); +} + +fn group_by_lazy_2(c: &mut Criterion) { + let mut data = vec![0; 1024]; + for (index, elt) in data.iter_mut().enumerate() { + *elt = index / 2; + } + + let data = black_box(data); + + c.bench_function("group by lazy 2", move |b| { + b.iter(|| { + for (_key, group) in &data.iter().group_by(|elt| **elt) { + for elt in group { + black_box(elt); + } + } + }) + }); +} + +fn slice_chunks(c: &mut Criterion) { + let data = vec![0; 1024]; + + let data = black_box(data); + let sz = black_box(10); + + c.bench_function("slice chunks", move |b| { + b.iter(|| { + for group in data.chunks(sz) { + for elt in group { + black_box(elt); + } + } + }) + }); +} + +fn chunks_lazy_1(c: &mut Criterion) { + let data = vec![0; 1024]; + + let data = black_box(data); + let sz = black_box(10); + + c.bench_function("chunks lazy 1", move |b| { + b.iter(|| { + for group in &data.iter().chunks(sz) { + for elt in group { + black_box(elt); + } + } + }) + }); +} + +fn equal(c: &mut Criterion) { + let data = vec![7; 1024]; + let l = data.len(); + let alpha = black_box(&data[1..]); + let beta = black_box(&data[..l - 1]); + + c.bench_function("equal", move |b| { + b.iter(|| { + itertools::equal(alpha, beta) + }) + }); +} + +fn merge_default(c: &mut Criterion) { + let mut data1 = vec![0; 1024]; + let mut data2 = vec![0; 800]; + let mut x = 0; + for (_, elt) in data1.iter_mut().enumerate() { + *elt = x; + x += 1; + } + + let mut y = 0; + for (i, elt) in data2.iter_mut().enumerate() { + *elt += y; + if i % 3 == 0 { + y += 3; + } else { + y += 0; + } + } + let data1 = black_box(data1); + let data2 = black_box(data2); + + c.bench_function("merge default", move |b| { + b.iter(|| { + data1.iter().merge(&data2).count() + }) + }); +} + +fn merge_by_cmp(c: &mut Criterion) { + let mut data1 = vec![0; 1024]; + let mut data2 = vec![0; 800]; + let mut x = 0; + for (_, elt) in data1.iter_mut().enumerate() { + *elt = x; + x += 1; + } + + let mut y = 0; + for (i, elt) in data2.iter_mut().enumerate() { + *elt += y; + if i % 3 == 0 { + y += 3; + } else { + y += 0; + } + } + let data1 = black_box(data1); + let data2 = black_box(data2); + + c.bench_function("merge by cmp", move |b| { + b.iter(|| { + data1.iter().merge_by(&data2, PartialOrd::le).count() + }) + }); +} + +fn merge_by_lt(c: &mut Criterion) { + let mut data1 = vec![0; 1024]; + let mut data2 = vec![0; 800]; + let mut x = 0; + for (_, elt) in data1.iter_mut().enumerate() { + *elt = x; + x += 1; + } + + let mut y = 0; + for (i, elt) in data2.iter_mut().enumerate() { + *elt += y; + if i % 3 == 0 { + y += 3; + } else { + y += 0; + } + } + let data1 = black_box(data1); + let data2 = black_box(data2); + + c.bench_function("merge by lt", move |b| { + b.iter(|| { + data1.iter().merge_by(&data2, |a, b| a <= b).count() + }) + }); +} + +fn kmerge_default(c: &mut Criterion) { + let mut data1 = vec![0; 1024]; + let mut data2 = vec![0; 800]; + let mut x = 0; + for (_, elt) in data1.iter_mut().enumerate() { + *elt = x; + x += 1; + } + + let mut y = 0; + for (i, elt) in data2.iter_mut().enumerate() { + *elt += y; + if i % 3 == 0 { + y += 3; + } else { + y += 0; + } + } + let data1 = black_box(data1); + let data2 = black_box(data2); + let its = &[data1.iter(), data2.iter()]; + + c.bench_function("kmerge default", move |b| { + b.iter(|| { + its.iter().cloned().kmerge().count() + }) + }); +} + +fn kmerge_tenway(c: &mut Criterion) { + let mut data = vec![0; 10240]; + + let mut state = 1729u16; + fn rng(state: &mut u16) -> u16 { + let new = state.wrapping_mul(31421) + 6927; + *state = new; + new + } + + for elt in &mut data { + *elt = rng(&mut state); + } + + let mut chunks = Vec::new(); + let mut rest = &mut data[..]; + while rest.len() > 0 { + let chunk_len = 1 + rng(&mut state) % 512; + let chunk_len = cmp::min(rest.len(), chunk_len as usize); + let (fst, tail) = {rest}.split_at_mut(chunk_len); + fst.sort(); + chunks.push(fst.iter().cloned()); + rest = tail; + } + + // println!("Chunk lengths: {}", chunks.iter().format_with(", ", |elt, f| f(&elt.len()))); + + c.bench_function("kmerge tenway", move |b| { + b.iter(|| { + chunks.iter().cloned().kmerge().count() + }) + }); +} + +fn fast_integer_sum(iter: I) -> I::Item + where I: IntoIterator, + I::Item: Default + Add +{ + iter.into_iter().fold(<_>::default(), |x, y| x + y) +} + +fn step_vec_2(c: &mut Criterion) { + let v = vec![0; 1024]; + + c.bench_function("step vec 2", move |b| { + b.iter(|| { + fast_integer_sum(cloned(v.iter().step_by(2))) + }) + }); +} + +fn step_vec_10(c: &mut Criterion) { + let v = vec![0; 1024]; + + c.bench_function("step vec 10", move |b| { + b.iter(|| { + fast_integer_sum(cloned(v.iter().step_by(10))) + }) + }); +} + +fn step_range_2(c: &mut Criterion) { + let v = black_box(0..1024); + + c.bench_function("step range 2", move |b| { + b.iter(|| { + fast_integer_sum(v.clone().step_by(2)) + }) + }); +} + +fn step_range_10(c: &mut Criterion) { + let v = black_box(0..1024); + + c.bench_function("step range 10", move |b| { + b.iter(|| { + fast_integer_sum(v.clone().step_by(10)) + }) + }); +} + +fn cartesian_product_iterator(c: &mut Criterion) { + let xs = vec![0; 16]; + + c.bench_function("cartesian product iterator", move |b| { + b.iter(|| { + let mut sum = 0; + for (&x, &y, &z) in iproduct!(&xs, &xs, &xs) { + sum += x; + sum += y; + sum += z; + } + sum + }) + }); +} + +fn cartesian_product_fold(c: &mut Criterion) { + let xs = vec![0; 16]; + + c.bench_function("cartesian product fold", move |b| { + b.iter(|| { + let mut sum = 0; + iproduct!(&xs, &xs, &xs).fold((), |(), (&x, &y, &z)| { + sum += x; + sum += y; + sum += z; + }); + sum + }) + }); +} + +fn multi_cartesian_product_iterator(c: &mut Criterion) { + let xs = [vec![0; 16], vec![0; 16], vec![0; 16]]; + + c.bench_function("multi cartesian product iterator", move |b| { + b.iter(|| { + let mut sum = 0; + for x in xs.iter().multi_cartesian_product() { + sum += x[0]; + sum += x[1]; + sum += x[2]; + } + sum + }) + }); +} + +fn multi_cartesian_product_fold(c: &mut Criterion) { + let xs = [vec![0; 16], vec![0; 16], vec![0; 16]]; + + c.bench_function("multi cartesian product fold", move |b| { + b.iter(|| { + let mut sum = 0; + xs.iter().multi_cartesian_product().fold((), |(), x| { + sum += x[0]; + sum += x[1]; + sum += x[2]; + }); + sum + }) + }); +} + +fn cartesian_product_nested_for(c: &mut Criterion) { + let xs = vec![0; 16]; + + c.bench_function("cartesian product nested for", move |b| { + b.iter(|| { + let mut sum = 0; + for &x in &xs { + for &y in &xs { + for &z in &xs { + sum += x; + sum += y; + sum += z; + } + } + } + sum + }) + }); +} + +fn all_equal(c: &mut Criterion) { + let mut xs = vec![0; 5_000_000]; + xs.extend(vec![1; 5_000_000]); + + c.bench_function("all equal", move |b| { + b.iter(|| xs.iter().all_equal()) + }); +} + +fn all_equal_for(c: &mut Criterion) { + let mut xs = vec![0; 5_000_000]; + xs.extend(vec![1; 5_000_000]); + + c.bench_function("all equal for", move |b| { + b.iter(|| { + for &x in &xs { + if x != xs[0] { + return false; + } + } + true + }) + }); +} + +fn all_equal_default(c: &mut Criterion) { + let mut xs = vec![0; 5_000_000]; + xs.extend(vec![1; 5_000_000]); + + c.bench_function("all equal default", move |b| { + b.iter(|| xs.iter().dedup().nth(1).is_none()) + }); +} + +const PERM_COUNT: usize = 6; + +fn permutations_iter(c: &mut Criterion) { + struct NewIterator(Range); + + impl Iterator for NewIterator { + type Item = usize; + + fn next(&mut self) -> Option { + self.0.next() + } + } + + c.bench_function("permutations iter", move |b| { + b.iter(|| { + for _ in NewIterator(0..PERM_COUNT).permutations(PERM_COUNT) { + + } + }) + }); +} + +fn permutations_range(c: &mut Criterion) { + c.bench_function("permutations range", move |b| { + b.iter(|| { + for _ in (0..PERM_COUNT).permutations(PERM_COUNT) { + + } + }) + }); +} + +fn permutations_slice(c: &mut Criterion) { + let v = (0..PERM_COUNT).collect_vec(); + + c.bench_function("permutations slice", move |b| { + b.iter(|| { + for _ in v.as_slice().iter().permutations(PERM_COUNT) { + + } + }) + }); +} + +criterion_group!( + benches, + slice_iter, + slice_iter_rev, + zip_default_zip, + zipdot_i32_default_zip, + zipdot_f32_default_zip, + zip_default_zip3, + zip_slices_ziptuple, + zipslices, + zipslices_mut, + zipdot_i32_zipslices, + zipdot_f32_zipslices, + zip_checked_counted_loop, + zipdot_i32_checked_counted_loop, + zipdot_f32_checked_counted_loop, + zipdot_f32_checked_counted_unrolled_loop, + zip_unchecked_counted_loop, + zipdot_i32_unchecked_counted_loop, + zipdot_f32_unchecked_counted_loop, + zip_unchecked_counted_loop3, + group_by_lazy_1, + group_by_lazy_2, + slice_chunks, + chunks_lazy_1, + equal, + merge_default, + merge_by_cmp, + merge_by_lt, + kmerge_default, + kmerge_tenway, + step_vec_2, + step_vec_10, + step_range_2, + step_range_10, + cartesian_product_iterator, + cartesian_product_fold, + multi_cartesian_product_iterator, + multi_cartesian_product_fold, + cartesian_product_nested_for, + all_equal, + all_equal_for, + all_equal_default, + permutations_iter, + permutations_range, + permutations_slice, +); +criterion_main!(benches); diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/benches/combinations.rs temporalio-1.3.0/vendor/itertools-0.10.5/benches/combinations.rs --- temporalio-1.3.0/vendor/itertools-0.10.5/benches/combinations.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/benches/combinations.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,125 @@ +use criterion::{black_box, criterion_group, criterion_main, Criterion}; +use itertools::Itertools; + +// approximate 100_000 iterations for each combination +const N1: usize = 100_000; +const N2: usize = 448; +const N3: usize = 86; +const N4: usize = 41; +const N14: usize = 21; + +fn comb_for1(c: &mut Criterion) { + c.bench_function("comb for1", move |b| { + b.iter(|| { + for i in 0..N1 { + black_box(vec![i]); + } + }) + }); +} + +fn comb_for2(c: &mut Criterion) { + c.bench_function("comb for2", move |b| { + b.iter(|| { + for i in 0..N2 { + for j in (i + 1)..N2 { + black_box(vec![i, j]); + } + } + }) + }); +} + +fn comb_for3(c: &mut Criterion) { + c.bench_function("comb for3", move |b| { + b.iter(|| { + for i in 0..N3 { + for j in (i + 1)..N3 { + for k in (j + 1)..N3 { + black_box(vec![i, j, k]); + } + } + } + }) + }); +} + +fn comb_for4(c: &mut Criterion) { + c.bench_function("comb for4", move |b| { + b.iter(|| { + for i in 0..N4 { + for j in (i + 1)..N4 { + for k in (j + 1)..N4 { + for l in (k + 1)..N4 { + black_box(vec![i, j, k, l]); + } + } + } + } + }) + }); +} + +fn comb_c1(c: &mut Criterion) { + c.bench_function("comb c1", move |b| { + b.iter(|| { + for combo in (0..N1).combinations(1) { + black_box(combo); + } + }) + }); +} + +fn comb_c2(c: &mut Criterion) { + c.bench_function("comb c2", move |b| { + b.iter(|| { + for combo in (0..N2).combinations(2) { + black_box(combo); + } + }) + }); +} + +fn comb_c3(c: &mut Criterion) { + c.bench_function("comb c3", move |b| { + b.iter(|| { + for combo in (0..N3).combinations(3) { + black_box(combo); + } + }) + }); +} + +fn comb_c4(c: &mut Criterion) { + c.bench_function("comb c4", move |b| { + b.iter(|| { + for combo in (0..N4).combinations(4) { + black_box(combo); + } + }) + }); +} + +fn comb_c14(c: &mut Criterion) { + c.bench_function("comb c14", move |b| { + b.iter(|| { + for combo in (0..N14).combinations(14) { + black_box(combo); + } + }) + }); +} + +criterion_group!( + benches, + comb_for1, + comb_for2, + comb_for3, + comb_for4, + comb_c1, + comb_c2, + comb_c3, + comb_c4, + comb_c14, +); +criterion_main!(benches); diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/benches/combinations_with_replacement.rs temporalio-1.3.0/vendor/itertools-0.10.5/benches/combinations_with_replacement.rs --- temporalio-1.3.0/vendor/itertools-0.10.5/benches/combinations_with_replacement.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/benches/combinations_with_replacement.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,40 @@ +use criterion::{black_box, criterion_group, criterion_main, Criterion}; +use itertools::Itertools; + +fn comb_replacement_n10_k5(c: &mut Criterion) { + c.bench_function("comb replacement n10k5", move |b| { + b.iter(|| { + for i in (0..10).combinations_with_replacement(5) { + black_box(i); + } + }) + }); +} + +fn comb_replacement_n5_k10(c: &mut Criterion) { + c.bench_function("comb replacement n5 k10", move |b| { + b.iter(|| { + for i in (0..5).combinations_with_replacement(10) { + black_box(i); + } + }) + }); +} + +fn comb_replacement_n10_k10(c: &mut Criterion) { + c.bench_function("comb replacement n10 k10", move |b| { + b.iter(|| { + for i in (0..10).combinations_with_replacement(10) { + black_box(i); + } + }) + }); +} + +criterion_group!( + benches, + comb_replacement_n10_k5, + comb_replacement_n5_k10, + comb_replacement_n10_k10, +); +criterion_main!(benches); diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/benches/extra/mod.rs temporalio-1.3.0/vendor/itertools-0.10.5/benches/extra/mod.rs --- temporalio-1.3.0/vendor/itertools-0.10.5/benches/extra/mod.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/benches/extra/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,2 @@ +pub use self::zipslices::ZipSlices; +mod zipslices; diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/benches/extra/zipslices.rs temporalio-1.3.0/vendor/itertools-0.10.5/benches/extra/zipslices.rs --- temporalio-1.3.0/vendor/itertools-0.10.5/benches/extra/zipslices.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/benches/extra/zipslices.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,188 @@ +use std::cmp; + +// Note: There are different ways to implement ZipSlices. +// This version performed the best in benchmarks. +// +// I also implemented a version with three pointers (tptr, tend, uptr), +// that mimiced slice::Iter and only checked bounds by using tptr == tend, +// but that was inferior to this solution. + +/// An iterator which iterates two slices simultaneously. +/// +/// `ZipSlices` acts like a double-ended `.zip()` iterator. +/// +/// It was intended to be more efficient than `.zip()`, and it was, then +/// rustc changed how it optimizes so it can not promise improved performance +/// at this time. +/// +/// Note that elements past the end of the shortest of the two slices are ignored. +/// +/// Iterator element type for `ZipSlices` is `(T::Item, U::Item)`. For example, +/// for a `ZipSlices<&'a [A], &'b mut [B]>`, the element type is `(&'a A, &'b mut B)`. +#[derive(Clone)] +pub struct ZipSlices { + t: T, + u: U, + len: usize, + index: usize, +} + +impl<'a, 'b, A, B> ZipSlices<&'a [A], &'b [B]> { + /// Create a new `ZipSlices` from slices `a` and `b`. + /// + /// Act like a double-ended `.zip()` iterator, but more efficiently. + /// + /// Note that elements past the end of the shortest of the two slices are ignored. + #[inline(always)] + pub fn new(a: &'a [A], b: &'b [B]) -> Self { + let minl = cmp::min(a.len(), b.len()); + ZipSlices { + t: a, + u: b, + len: minl, + index: 0, + } + } +} + +impl ZipSlices + where T: Slice, + U: Slice +{ + /// Create a new `ZipSlices` from slices `a` and `b`. + /// + /// Act like a double-ended `.zip()` iterator, but more efficiently. + /// + /// Note that elements past the end of the shortest of the two slices are ignored. + #[inline(always)] + pub fn from_slices(a: T, b: U) -> Self { + let minl = cmp::min(a.len(), b.len()); + ZipSlices { + t: a, + u: b, + len: minl, + index: 0, + } + } +} + +impl Iterator for ZipSlices + where T: Slice, + U: Slice +{ + type Item = (T::Item, U::Item); + + #[inline(always)] + fn next(&mut self) -> Option { + unsafe { + if self.index >= self.len { + None + } else { + let i = self.index; + self.index += 1; + Some(( + self.t.get_unchecked(i), + self.u.get_unchecked(i))) + } + } + } + + #[inline] + fn size_hint(&self) -> (usize, Option) { + let len = self.len - self.index; + (len, Some(len)) + } +} + +impl DoubleEndedIterator for ZipSlices + where T: Slice, + U: Slice +{ + #[inline(always)] + fn next_back(&mut self) -> Option { + unsafe { + if self.index >= self.len { + None + } else { + self.len -= 1; + let i = self.len; + Some(( + self.t.get_unchecked(i), + self.u.get_unchecked(i))) + } + } + } +} + +impl ExactSizeIterator for ZipSlices + where T: Slice, + U: Slice +{} + +unsafe impl Slice for ZipSlices + where T: Slice, + U: Slice +{ + type Item = (T::Item, U::Item); + + fn len(&self) -> usize { + self.len - self.index + } + + unsafe fn get_unchecked(&mut self, i: usize) -> Self::Item { + (self.t.get_unchecked(i), + self.u.get_unchecked(i)) + } +} + +/// A helper trait to let `ZipSlices` accept both `&[T]` and `&mut [T]`. +/// +/// Unsafe trait because: +/// +/// - Implementors must guarantee that `get_unchecked` is valid for all indices `0..len()`. +pub unsafe trait Slice { + /// The type of a reference to the slice's elements + type Item; + #[doc(hidden)] + fn len(&self) -> usize; + #[doc(hidden)] + unsafe fn get_unchecked(&mut self, i: usize) -> Self::Item; +} + +unsafe impl<'a, T> Slice for &'a [T] { + type Item = &'a T; + #[inline(always)] + fn len(&self) -> usize { (**self).len() } + #[inline(always)] + unsafe fn get_unchecked(&mut self, i: usize) -> &'a T { + debug_assert!(i < self.len()); + (**self).get_unchecked(i) + } +} + +unsafe impl<'a, T> Slice for &'a mut [T] { + type Item = &'a mut T; + #[inline(always)] + fn len(&self) -> usize { (**self).len() } + #[inline(always)] + unsafe fn get_unchecked(&mut self, i: usize) -> &'a mut T { + debug_assert!(i < self.len()); + // override the lifetime constraints of &mut &'a mut [T] + (*(*self as *mut [T])).get_unchecked_mut(i) + } +} + +#[test] +fn zipslices() { + + let xs = [1, 2, 3, 4, 5, 6]; + let ys = [1, 2, 3, 7]; + ::itertools::assert_equal(ZipSlices::new(&xs, &ys), xs.iter().zip(&ys)); + + let xs = [1, 2, 3, 4, 5, 6]; + let mut ys = [0; 6]; + for (x, y) in ZipSlices::from_slices(&xs[..], &mut ys[..]) { + *y = *x; + } + ::itertools::assert_equal(&xs, &ys); +} diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/benches/fold_specialization.rs temporalio-1.3.0/vendor/itertools-0.10.5/benches/fold_specialization.rs --- temporalio-1.3.0/vendor/itertools-0.10.5/benches/fold_specialization.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/benches/fold_specialization.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,73 @@ +use criterion::{criterion_group, criterion_main, Criterion}; +use itertools::Itertools; + +struct Unspecialized(I); + +impl Iterator for Unspecialized +where I: Iterator +{ + type Item = I::Item; + + #[inline(always)] + fn next(&mut self) -> Option { + self.0.next() + } + + #[inline(always)] + fn size_hint(&self) -> (usize, Option) { + self.0.size_hint() + } +} + +mod specialization { + use super::*; + + pub mod intersperse { + use super::*; + + pub fn external(c: &mut Criterion) + { + let arr = [1; 1024]; + + c.bench_function("external", move |b| { + b.iter(|| { + let mut sum = 0; + for &x in arr.iter().intersperse(&0) { + sum += x; + } + sum + }) + }); + } + + pub fn internal_specialized(c: &mut Criterion) + { + let arr = [1; 1024]; + + c.bench_function("internal specialized", move |b| { + b.iter(|| { + arr.iter().intersperse(&0).fold(0, |acc, x| acc + x) + }) + }); + } + + pub fn internal_unspecialized(c: &mut Criterion) + { + let arr = [1; 1024]; + + c.bench_function("internal unspecialized", move |b| { + b.iter(|| { + Unspecialized(arr.iter().intersperse(&0)).fold(0, |acc, x| acc + x) + }) + }); + } + } +} + +criterion_group!( + benches, + specialization::intersperse::external, + specialization::intersperse::internal_specialized, + specialization::intersperse::internal_unspecialized, +); +criterion_main!(benches); diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/benches/powerset.rs temporalio-1.3.0/vendor/itertools-0.10.5/benches/powerset.rs --- temporalio-1.3.0/vendor/itertools-0.10.5/benches/powerset.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/benches/powerset.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,44 @@ +use criterion::{black_box, criterion_group, criterion_main, Criterion}; +use itertools::Itertools; + +// Keep aggregate generated elements the same, regardless of powerset length. +const TOTAL_ELEMENTS: usize = 1 << 12; +const fn calc_iters(n: usize) -> usize { + TOTAL_ELEMENTS / (1 << n) +} + +fn powerset_n(c: &mut Criterion, n: usize) { + let id = format!("powerset {}", n); + c.bench_function(id.as_str(), move |b| { + b.iter(|| { + for _ in 0..calc_iters(n) { + for elt in (0..n).powerset() { + black_box(elt); + } + } + }) + }); +} + +fn powerset_0(c: &mut Criterion) { powerset_n(c, 0); } + +fn powerset_1(c: &mut Criterion) { powerset_n(c, 1); } + +fn powerset_2(c: &mut Criterion) { powerset_n(c, 2); } + +fn powerset_4(c: &mut Criterion) { powerset_n(c, 4); } + +fn powerset_8(c: &mut Criterion) { powerset_n(c, 8); } + +fn powerset_12(c: &mut Criterion) { powerset_n(c, 12); } + +criterion_group!( + benches, + powerset_0, + powerset_1, + powerset_2, + powerset_4, + powerset_8, + powerset_12, +); +criterion_main!(benches); \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/benches/tree_fold1.rs temporalio-1.3.0/vendor/itertools-0.10.5/benches/tree_fold1.rs --- temporalio-1.3.0/vendor/itertools-0.10.5/benches/tree_fold1.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/benches/tree_fold1.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,144 @@ +use criterion::{criterion_group, criterion_main, Criterion}; +use itertools::{Itertools, cloned}; + +trait IterEx : Iterator { + // Another efficient implementation against which to compare, + // but needs `std` so is less desirable. + fn tree_fold1_vec(self, mut f: F) -> Option + where F: FnMut(Self::Item, Self::Item) -> Self::Item, + Self: Sized, + { + let hint = self.size_hint().0; + let cap = std::mem::size_of::() * 8 - hint.leading_zeros() as usize; + let mut stack = Vec::with_capacity(cap); + self.enumerate().for_each(|(mut i, mut x)| { + while (i & 1) != 0 { + x = f(stack.pop().unwrap(), x); + i >>= 1; + } + stack.push(x); + }); + stack.into_iter().fold1(f) + } +} +impl IterEx for T {} + +macro_rules! def_benchs { + ($N:expr, + $FUN:ident, + $BENCH_NAME:ident, + ) => ( + mod $BENCH_NAME { + use super::*; + + pub fn sum(c: &mut Criterion) { + let v: Vec = (0.. $N).collect(); + + c.bench_function(&(stringify!($BENCH_NAME).replace('_', " ") + " sum"), move |b| { + b.iter(|| { + cloned(&v).$FUN(|x, y| x + y) + }) + }); + } + + pub fn complex_iter(c: &mut Criterion) { + let u = (3..).take($N / 2); + let v = (5..).take($N / 2); + let it = u.chain(v); + + c.bench_function(&(stringify!($BENCH_NAME).replace('_', " ") + " complex iter"), move |b| { + b.iter(|| { + it.clone().map(|x| x as f32).$FUN(f32::atan2) + }) + }); + } + + pub fn string_format(c: &mut Criterion) { + // This goes quadratic with linear `fold1`, so use a smaller + // size to not waste too much time in travis. The allocations + // in here are so expensive anyway that it'll still take + // way longer per iteration than the other two benchmarks. + let v: Vec = (0.. ($N/4)).collect(); + + c.bench_function(&(stringify!($BENCH_NAME).replace('_', " ") + " string format"), move |b| { + b.iter(|| { + cloned(&v).map(|x| x.to_string()).$FUN(|x, y| format!("{} + {}", x, y)) + }) + }); + } + } + + criterion_group!( + $BENCH_NAME, + $BENCH_NAME::sum, + $BENCH_NAME::complex_iter, + $BENCH_NAME::string_format, + ); + ) +} + +def_benchs!{ + 10_000, + fold1, + fold1_10k, +} + +def_benchs!{ + 10_000, + tree_fold1, + tree_fold1_stack_10k, +} + +def_benchs!{ + 10_000, + tree_fold1_vec, + tree_fold1_vec_10k, +} + +def_benchs!{ + 100, + fold1, + fold1_100, +} + +def_benchs!{ + 100, + tree_fold1, + tree_fold1_stack_100, +} + +def_benchs!{ + 100, + tree_fold1_vec, + tree_fold1_vec_100, +} + +def_benchs!{ + 8, + fold1, + fold1_08, +} + +def_benchs!{ + 8, + tree_fold1, + tree_fold1_stack_08, +} + +def_benchs!{ + 8, + tree_fold1_vec, + tree_fold1_vec_08, +} + +criterion_main!( + fold1_10k, + tree_fold1_stack_10k, + tree_fold1_vec_10k, + fold1_100, + tree_fold1_stack_100, + tree_fold1_vec_100, + fold1_08, + tree_fold1_stack_08, + tree_fold1_vec_08, +); diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/benches/tuple_combinations.rs temporalio-1.3.0/vendor/itertools-0.10.5/benches/tuple_combinations.rs --- temporalio-1.3.0/vendor/itertools-0.10.5/benches/tuple_combinations.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/benches/tuple_combinations.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,113 @@ +use criterion::{black_box, criterion_group, criterion_main, Criterion}; +use itertools::Itertools; + +// approximate 100_000 iterations for each combination +const N1: usize = 100_000; +const N2: usize = 448; +const N3: usize = 86; +const N4: usize = 41; + +fn tuple_comb_for1(c: &mut Criterion) { + c.bench_function("tuple comb for1", move |b| { + b.iter(|| { + for i in 0..N1 { + black_box(i); + } + }) + }); +} + +fn tuple_comb_for2(c: &mut Criterion) { + c.bench_function("tuple comb for2", move |b| { + b.iter(|| { + for i in 0..N2 { + for j in (i + 1)..N2 { + black_box(i + j); + } + } + }) + }); +} + +fn tuple_comb_for3(c: &mut Criterion) { + c.bench_function("tuple comb for3", move |b| { + b.iter(|| { + for i in 0..N3 { + for j in (i + 1)..N3 { + for k in (j + 1)..N3 { + black_box(i + j + k); + } + } + } + }) + }); +} + +fn tuple_comb_for4(c: &mut Criterion) { + c.bench_function("tuple comb for4", move |b| { + b.iter(|| { + for i in 0..N4 { + for j in (i + 1)..N4 { + for k in (j + 1)..N4 { + for l in (k + 1)..N4 { + black_box(i + j + k + l); + } + } + } + } + }) + }); +} + +fn tuple_comb_c1(c: &mut Criterion) { + c.bench_function("tuple comb c1", move |b| { + b.iter(|| { + for (i,) in (0..N1).tuple_combinations() { + black_box(i); + } + }) + }); +} + +fn tuple_comb_c2(c: &mut Criterion) { + c.bench_function("tuple comb c2", move |b| { + b.iter(|| { + for (i, j) in (0..N2).tuple_combinations() { + black_box(i + j); + } + }) + }); +} + +fn tuple_comb_c3(c: &mut Criterion) { + c.bench_function("tuple comb c3", move |b| { + b.iter(|| { + for (i, j, k) in (0..N3).tuple_combinations() { + black_box(i + j + k); + } + }) + }); +} + +fn tuple_comb_c4(c: &mut Criterion) { + c.bench_function("tuple comb c4", move |b| { + b.iter(|| { + for (i, j, k, l) in (0..N4).tuple_combinations() { + black_box(i + j + k + l); + } + }) + }); +} + +criterion_group!( + benches, + tuple_comb_for1, + tuple_comb_for2, + tuple_comb_for3, + tuple_comb_for4, + tuple_comb_c1, + tuple_comb_c2, + tuple_comb_c3, + tuple_comb_c4, +); +criterion_main!(benches); diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/benches/tuples.rs temporalio-1.3.0/vendor/itertools-0.10.5/benches/tuples.rs --- temporalio-1.3.0/vendor/itertools-0.10.5/benches/tuples.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/benches/tuples.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,213 @@ +use criterion::{criterion_group, criterion_main, Criterion}; +use itertools::Itertools; + +fn s1(a: u32) -> u32 { + a +} + +fn s2(a: u32, b: u32) -> u32 { + a + b +} + +fn s3(a: u32, b: u32, c: u32) -> u32 { + a + b + c +} + +fn s4(a: u32, b: u32, c: u32, d: u32) -> u32 { + a + b + c + d +} + +fn sum_s1(s: &[u32]) -> u32 { + s1(s[0]) +} + +fn sum_s2(s: &[u32]) -> u32 { + s2(s[0], s[1]) +} + +fn sum_s3(s: &[u32]) -> u32 { + s3(s[0], s[1], s[2]) +} + +fn sum_s4(s: &[u32]) -> u32 { + s4(s[0], s[1], s[2], s[3]) +} + +fn sum_t1(s: &(&u32, )) -> u32 { + s1(*s.0) +} + +fn sum_t2(s: &(&u32, &u32)) -> u32 { + s2(*s.0, *s.1) +} + +fn sum_t3(s: &(&u32, &u32, &u32)) -> u32 { + s3(*s.0, *s.1, *s.2) +} + +fn sum_t4(s: &(&u32, &u32, &u32, &u32)) -> u32 { + s4(*s.0, *s.1, *s.2, *s.3) +} + +macro_rules! def_benchs { + ($N:expr; + $BENCH_GROUP:ident, + $TUPLE_FUN:ident, + $TUPLES:ident, + $TUPLE_WINDOWS:ident; + $SLICE_FUN:ident, + $CHUNKS:ident, + $WINDOWS:ident; + $FOR_CHUNKS:ident, + $FOR_WINDOWS:ident + ) => ( + fn $FOR_CHUNKS(c: &mut Criterion) { + let v: Vec = (0.. $N * 1_000).collect(); + let mut s = 0; + c.bench_function(&stringify!($FOR_CHUNKS).replace('_', " "), move |b| { + b.iter(|| { + let mut j = 0; + for _ in 0..1_000 { + s += $SLICE_FUN(&v[j..(j + $N)]); + j += $N; + } + s + }) + }); + } + + fn $FOR_WINDOWS(c: &mut Criterion) { + let v: Vec = (0..1_000).collect(); + let mut s = 0; + c.bench_function(&stringify!($FOR_WINDOWS).replace('_', " "), move |b| { + b.iter(|| { + for i in 0..(1_000 - $N) { + s += $SLICE_FUN(&v[i..(i + $N)]); + } + s + }) + }); + } + + fn $TUPLES(c: &mut Criterion) { + let v: Vec = (0.. $N * 1_000).collect(); + let mut s = 0; + c.bench_function(&stringify!($TUPLES).replace('_', " "), move |b| { + b.iter(|| { + for x in v.iter().tuples() { + s += $TUPLE_FUN(&x); + } + s + }) + }); + } + + fn $CHUNKS(c: &mut Criterion) { + let v: Vec = (0.. $N * 1_000).collect(); + let mut s = 0; + c.bench_function(&stringify!($CHUNKS).replace('_', " "), move |b| { + b.iter(|| { + for x in v.chunks($N) { + s += $SLICE_FUN(x); + } + s + }) + }); + } + + fn $TUPLE_WINDOWS(c: &mut Criterion) { + let v: Vec = (0..1_000).collect(); + let mut s = 0; + c.bench_function(&stringify!($TUPLE_WINDOWS).replace('_', " "), move |b| { + b.iter(|| { + for x in v.iter().tuple_windows() { + s += $TUPLE_FUN(&x); + } + s + }) + }); + } + + fn $WINDOWS(c: &mut Criterion) { + let v: Vec = (0..1_000).collect(); + let mut s = 0; + c.bench_function(&stringify!($WINDOWS).replace('_', " "), move |b| { + b.iter(|| { + for x in v.windows($N) { + s += $SLICE_FUN(x); + } + s + }) + }); + } + + criterion_group!( + $BENCH_GROUP, + $FOR_CHUNKS, + $FOR_WINDOWS, + $TUPLES, + $CHUNKS, + $TUPLE_WINDOWS, + $WINDOWS, + ); + ) +} + +def_benchs!{ + 1; + benches_1, + sum_t1, + tuple_chunks_1, + tuple_windows_1; + sum_s1, + slice_chunks_1, + slice_windows_1; + for_chunks_1, + for_windows_1 +} + +def_benchs!{ + 2; + benches_2, + sum_t2, + tuple_chunks_2, + tuple_windows_2; + sum_s2, + slice_chunks_2, + slice_windows_2; + for_chunks_2, + for_windows_2 +} + +def_benchs!{ + 3; + benches_3, + sum_t3, + tuple_chunks_3, + tuple_windows_3; + sum_s3, + slice_chunks_3, + slice_windows_3; + for_chunks_3, + for_windows_3 +} + +def_benchs!{ + 4; + benches_4, + sum_t4, + tuple_chunks_4, + tuple_windows_4; + sum_s4, + slice_chunks_4, + slice_windows_4; + for_chunks_4, + for_windows_4 +} + +criterion_main!( + benches_1, + benches_2, + benches_3, + benches_4, +); diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/.cargo-checksum.json temporalio-1.3.0/vendor/itertools-0.10.5/.cargo-checksum.json --- temporalio-1.3.0/vendor/itertools-0.10.5/.cargo-checksum.json 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1 @@ +{"files":{"CHANGELOG.md":"ed6c781d541c40d4a19eaecd794cadebb94b3f4d51e32367803542c88f0457ee","Cargo.toml":"6dcbab25126c0cdf64f5089156de0d4346914c6d47c557d370b8e20e039ca7d3","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"7576269ea71f767b99297934c0b2367532690f8c4badc695edf8e04ab6a1e545","README.md":"3acfeb07424200ae70bf571ef63a96bae954c298bddf447c9bea0ea9394825cc","benches/bench1.rs":"bb06f39db0544b1380cd4929139ccf521a9eecab7ca3f910b9499f965ec0a047","benches/combinations.rs":"51523ee1ca438a56f14711f0b04ee943895062d35859fbe23a2714d2fca3289d","benches/combinations_with_replacement.rs":"11f29160652a2d90ce7ca4b1c339c4457888ab6867e2456ce1c62e3adf9be737","benches/extra/mod.rs":"6ca290d72302a1945078621610b5788060b0de29639decebbdc557a80044aa97","benches/extra/zipslices.rs":"40e9f68a7c00f8429193fca463caef18851fa49b33355cc136bad3ccc840d655","benches/fold_specialization.rs":"5a517bbe29d366a15f6f751660e17ab1aa3e7b21552a1983048c662e34f0d69e","benches/powerset.rs":"6fd9d69a3483b37dc2411f99fb4efa6131577696f2dbdc8d1de9e4d7642fe3a3","benches/tree_fold1.rs":"539232e74f9aaea295a42069ac5af707811e90dc1c71c6e0a9064ffc731999de","benches/tuple_combinations.rs":"16366158743307a0289fc1df423a3cec45009807d410a9fe9922d5b6f8b7d002","benches/tuples.rs":"5a620783ae203e9ff9623d10d2c7fe9911d8b6c811cbad7613afa30e390c759d","clippy.toml":"33ffb83bbddb772575b3aa565b7136a8158ee386c216ffc2588fed9e83fa3826","examples/iris.data":"596ffd580471ca4d4880f8e439c7281f3b50d8249a5960353cb200b1490f63a0","examples/iris.rs":"1b465ed6a417180913104bc95a545fd9d1a3d67d121871ab737ad87e31b8be37","src/adaptors/coalesce.rs":"a0073325d40f297d29101538d18a267aef81889a999338dc09cb43a31cb4ec8b","src/adaptors/map.rs":"241971e856e468d71323071fb4a09867fbcedb83877320be132dc03516fe60e8","src/adaptors/mod.rs":"7f3bd7d011a348ce5e4bea486ef2e6346b64c7fe27540334d56d3f147f981d59","src/adaptors/multi_product.rs":"bb43e6dce68c815c21006d5b01c56e038d54b0c3bb8ee6bb8a4de11e2952c7ad","src/combinations.rs":"fb25babb459389093f886721016c72bf9f00e51d02735f638d871bb3a447ffd0","src/combinations_with_replacement.rs":"463011a574facbdd84278386b533a90e4dd517f0417e05adb82d182049db1f50","src/concat_impl.rs":"03b1ed61cbed242c286c3c4c5c848dbd57e02ab83fcef264f3a592b58107f324","src/cons_tuples_impl.rs":"c253d03b861831c01d62cacc57b49715ee62f6171e69f6886bb5a6ca0863bc3a","src/diff.rs":"a7800e9ce7a87b53ebe2338481335751fb43d44fa6a1ca719aceaaab40e5c8fe","src/duplicates_impl.rs":"f62fe4b642f501f785721ce5a505cf622a771e457210726dd0fb8b30be7ebbbc","src/either_or_both.rs":"76b13fbfac6bc959b4c1d8b7c99ce51726e95f994ca5429477e523a3d3950e4a","src/exactly_one_err.rs":"aa50081f6a31b5109b30e3ed305e3ec2413c6908dedc8990ec5378a99cee2b39","src/extrema_set.rs":"2a25b0b86eed2fd5d05622d591a3085cab823973d450816c2c3b8cb76e9c187e","src/flatten_ok.rs":"fe209fd886ecd9cb98d99625aa0c7274af7e644eff4a10de15b4dec8bbbc934a","src/format.rs":"a8192d85c0f9de8e633c202456e3cde0f3bc50f19b6bd8a4b2cfa3ef5123de1a","src/free.rs":"dfc57b7f56a08d4986a96b679018b41346576a7a34b668e008cc01109e728750","src/group_map.rs":"f7b02c964f63505d3e36280cfdc1755e05287714201efe983dacf702eee61434","src/groupbylazy.rs":"4f2181c022a45ff8444597708861fc6863eceb6f7555ea81cf3eeba19b492971","src/grouping_map.rs":"cbc45ac563345c96f3ac50c78f73c83d870523436a7ab88c1c9a685d204461d3","src/impl_macros.rs":"4f829b458873bed556f1aff2ae4e88dbd576766e2b5bcc07ff3ac8756758e6f4","src/intersperse.rs":"b9717242495846a4a979c95d93d5681caccb7c07a0d889eab763ad3d49a46125","src/k_smallest.rs":"603eb34314c01769ff7f6def2a24cf7a7b38507e6f3658b7aafc23a3b2e9b322","src/kmerge_impl.rs":"a347b0f6fa7715afd8a54d85ce139ed5b14c9e58a16c2b3648f5b288fdb5375f","src/lazy_buffer.rs":"834f6ef7fdf9f00c8a6329beb38eaefb706847ceeec309c221dce705c2c1e05b","src/lib.rs":"fadb0045279aafe8e8cccb45fadc383c7b358197b83c9c38fba87ada4cb2f84a","src/merge_join.rs":"1016113f6c983a9498bae5dc0570190437e1357b3333f6e19ea95c88599a1225","src/minmax.rs":"96d3897c28c8c63284d4729becc9ada6855e0953cac6e1bd35cf6f38c50b0ec0","src/multipeek_impl.rs":"35162bca4456bfa20a08e8d40e4d1cc6783dc662778789fdcded60371e975122","src/pad_tail.rs":"04be2ca73abb85815b06b5524c99d6feb2919180c486a4646f9cc6c87462f67b","src/peek_nth.rs":"6a0a51f2f373ce14d3d58595c46464878a14976bf00841a7396c03f9f9ab07ac","src/peeking_take_while.rs":"2b1b77c8882be32cfd76e973d303aa62f73370efd470c60764add0cdcca524d5","src/permutations.rs":"97831e7e26904c3cae68c97e74f7c6981ceb2fb2f2217282a0e5e54083a565fc","src/powerset.rs":"e0ee6b1316b4dd314c1e81502b90ae8113e1cda12168322520c5a65410e584b2","src/process_results_impl.rs":"9ed7fa46c8316238272ef47577387a386c1a109b50377dd3caf4291b6587cb73","src/put_back_n_impl.rs":"821e047fecd6ca0036290029f4febe7638a3abf1faa05e1e747a3bf9d80ff464","src/rciter_impl.rs":"5b156082ef2d25a94a4ad01d94cba2813c4b3e72e212515a8ad0fc8588f8045d","src/repeatn.rs":"bfc8f9145c9d8a3ea651f012b7d5a8d2fbbcbefdee76eafd098d02e7c54cda90","src/size_hint.rs":"021e57aad7df8f1e70ef588e9e9b8a1695aab183b1098f1848561f96c5dc9bcb","src/sources.rs":"61637f32c2cea2290ecfc1980c0b2d0f68463839ac09bd81006f8258ab8ecaae","src/tee.rs":"665832aa547389a420c3441470ff2494249f0ed2841be0c6a578367fe9dbd381","src/tuple_impl.rs":"00a9b61942425fb477b9691c3348646c0f9f534ff94f6321027f38c61ce2478c","src/unique_impl.rs":"3b89cdd668b74cc0a0eabb1522489e2305a0d2d8da25d6a1884e8626bbdb5959","src/unziptuple.rs":"84b50e5d29b9ddbf21a46a1cc2fd7877729c7f7da9bdc8ae1966dbaf2d2f6f60","src/with_position.rs":"c8a9b3476b3b90986b004a8877c19ff54b4c6800c5ac7ca1458d914036dacfe9","src/zip_eq_impl.rs":"4a41dc6dfe99359585d50ce648bdc85f15276c602048872b1d152e90841d8cad","src/zip_longest.rs":"f7cf5fffc3ca053ee80b410a05b27de1a475021f6de3181aea981010d7e8453f","src/ziptuple.rs":"7f9df12bf6556f382bbd4ad8cf17eb8b60c1c47fadbce016141133ba0f3384a1","tests/adaptors_no_collect.rs":"f459f36d54f5d475b2b2e83f5a1c98109c15062756ae822fa379486f3eeed666","tests/flatten_ok.rs":"b7894874132918b8229c7150b2637511d8e3e14197d8eeb9382d46b2a514efa2","tests/macros_hygiene.rs":"522afa0106e3f11a5149e9218f89c2329e405546d2ef0ea756d6a27e8a0e9ca3","tests/merge_join.rs":"b08c4ee6529d234c68d411a413b8781455d18a1eab17872d1828bb75a4fcf79b","tests/peeking_take_while.rs":"4b1c394e44a9ef9bc0de707ae080b45803db722f79834c20f15b826d7c3f1f2e","tests/quick.rs":"6fcc0649b9270f024b169b1f499dd4cc7fecb0c9aec0dfc155b264916cc626e7","tests/specializations.rs":"fdd16dc663330033fedcc478609b393d4aa369dc07dc8cda31a75219fb793087","tests/test_core.rs":"32576ba90aa8e5db985b6e6ffe30e3046bc6a11d392db8f6b4bdd2ba48d9b24d","tests/test_std.rs":"f28a78a1912c950e7c37be1e82867e70dc585d60afecdebc7a97965194eee8e6","tests/tuples.rs":"014e4da776174bfe923270e2a359cd9c95b372fce4b952b8138909d6e2c52762","tests/zip.rs":"99af365fe6054ef1c6089d3e604e34da8fea66e55861ae4be9e7336ec8de4b56"},"package":"b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/Cargo.toml temporalio-1.3.0/vendor/itertools-0.10.5/Cargo.toml --- temporalio-1.3.0/vendor/itertools-0.10.5/Cargo.toml 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,88 @@ +# 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 believe there's an error in this file please file an +# issue against the rust-lang/cargo repository. If you're +# editing this file be aware that the upstream Cargo.toml +# will likely look very different (and much more reasonable) + +[package] +edition = "2018" +name = "itertools" +version = "0.10.5" +authors = ["bluss"] +exclude = ["/bors.toml"] +description = "Extra iterator adaptors, iterator methods, free functions, and macros." +documentation = "https://docs.rs/itertools/" +readme = "README.md" +keywords = ["iterator", "data-structure", "zip", "product", "group-by"] +categories = ["algorithms", "rust-patterns"] +license = "MIT/Apache-2.0" +repository = "https://github.com/rust-itertools/itertools" +[package.metadata.release] +no-dev-version = true +[profile.bench] +debug = true + +[lib] +test = false +bench = false + +[[bench]] +name = "tuple_combinations" +harness = false + +[[bench]] +name = "tuples" +harness = false + +[[bench]] +name = "fold_specialization" +harness = false + +[[bench]] +name = "combinations_with_replacement" +harness = false + +[[bench]] +name = "tree_fold1" +harness = false + +[[bench]] +name = "bench1" +harness = false + +[[bench]] +name = "combinations" +harness = false + +[[bench]] +name = "powerset" +harness = false +[dependencies.either] +version = "1.0" +default-features = false +[dev-dependencies.criterion] +version = "=0" + +[dev-dependencies.paste] +version = "1.0.0" + +[dev-dependencies.permutohedron] +version = "0.2" + +[dev-dependencies.quickcheck] +version = "0.9" +default-features = false + +[dev-dependencies.rand] +version = "0.7" + +[features] +default = ["use_std"] +use_alloc = [] +use_std = ["use_alloc", "either/use_std"] diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/CHANGELOG.md temporalio-1.3.0/vendor/itertools-0.10.5/CHANGELOG.md --- temporalio-1.3.0/vendor/itertools-0.10.5/CHANGELOG.md 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/CHANGELOG.md 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,380 @@ +# Changelog + +## 0.10.4 + - Add `EitherOrBoth::or` and `EitherOrBoth::or_else` (#593) + - Add `min_set`, `max_set` et al. (#613, #323) + - Use `either/use_std` (#628) + - Documentation fixes (#612, #625, #632, #633, #634, #638) + - Code maintenance (#623, #624, #627, #630) + +## 0.10.2 + - Add `Itertools::multiunzip` (#362, #565) + - Add `intersperse` and `intersperse_with` free functions (#555) + - Add `Itertools::sorted_by_cached_key` (#424, #575) + - Specialize `ProcessResults::fold` (#563) + - Fix subtraction overflow in `DuplicatesBy::size_hint` (#552) + - Fix specialization tests (#574) + - More `Debug` impls (#573) + - Deprecate `fold1` (use `reduce` instead) (#580) + - Documentation fixes (`HomogenousTuple`, `into_group_map`, `into_group_map_by`, `MultiPeek::peek`) (#543 et al.) + +## 0.10.1 + - Add `Itertools::contains` (#514) + - Add `Itertools::counts_by` (#515) + - Add `Itertools::partition_result` (#511) + - Add `Itertools::all_unique` (#241) + - Add `Itertools::duplicates` and `Itertools::duplicates_by` (#502) + - Add `chain!` (#525) + - Add `Itertools::at_most_one` (#523) + - Add `Itertools::flatten_ok` (#527) + - Add `EitherOrBoth::or_default` (#583) + - Add `Itertools::find_or_last` and `Itertools::find_or_first` (#535) + - Implement `FusedIterator` for `FilterOk`, `FilterMapOk`, `InterleaveShortest`, `KMergeBy`, `MergeBy`, `PadUsing`, `Positions`, `Product` , `RcIter`, `TupleWindows`, `Unique`, `UniqueBy`, `Update`, `WhileSome`, `Combinations`, `CombinationsWithReplacement`, `Powerset`, `RepeatN`, and `WithPosition` (#550) + - Implement `FusedIterator` for `Interleave`, `IntersperseWith`, and `ZipLongest` (#548) + +## 0.10.0 + - **Increase minimum supported Rust version to 1.32.0** + - Improve macro hygiene (#507) + - Add `Itertools::powerset` (#335) + - Add `Itertools::sorted_unstable`, `Itertools::sorted_unstable_by`, and `Itertools::sorted_unstable_by_key` (#494) + - Implement `Error` for `ExactlyOneError` (#484) + - Undeprecate `Itertools::fold_while` (#476) + - Tuple-related adapters work for tuples of arity up to 12 (#475) + - `use_alloc` feature for users who have `alloc`, but not `std` (#474) + - Add `Itertools::k_smallest` (#473) + - Add `Itertools::into_grouping_map` and `GroupingMap` (#465) + - Add `Itertools::into_grouping_map_by` and `GroupingMapBy` (#465) + - Add `Itertools::counts` (#468) + - Add implementation of `DoubleEndedIterator` for `Unique` (#442) + - Add implementation of `DoubleEndedIterator` for `UniqueBy` (#442) + - Add implementation of `DoubleEndedIterator` for `Zip` (#346) + - Add `Itertools::multipeek` (#435) + - Add `Itertools::dedup_with_count` and `DedupWithCount` (#423) + - Add `Itertools::dedup_by_with_count` and `DedupByWithCount` (#423) + - Add `Itertools::intersperse_with` and `IntersperseWith` (#381) + - Add `Itertools::filter_ok` and `FilterOk` (#377) + - Add `Itertools::filter_map_ok` and `FilterMapOk` (#377) + - Deprecate `Itertools::fold_results`, use `Itertools::fold_ok` instead (#377) + - Deprecate `Itertools::map_results`, use `Itertools::map_ok` instead (#377) + - Deprecate `FoldResults`, use `FoldOk` instead (#377) + - Deprecate `MapResults`, use `MapOk` instead (#377) + - Add `Itertools::circular_tuple_windows` and `CircularTupleWindows` (#350) + - Add `peek_nth` and `PeekNth` (#303) + +## 0.9.0 + - Fix potential overflow in `MergeJoinBy::size_hint` (#385) + - Add `derive(Clone)` where possible (#382) + - Add `try_collect` method (#394) + - Add `HomogeneousTuple` trait (#389) + - Fix `combinations(0)` and `combinations_with_replacement(0)` (#383) + - Don't require `ParitalEq` to the `Item` of `DedupBy` (#397) + - Implement missing specializations on the `PutBack` adaptor and on the `MergeJoinBy` iterator (#372) + - Add `position_*` methods (#412) + - Derive `Hash` for `EitherOrBoth` (#417) + - Increase minimum supported Rust version to 1.32.0 + +## 0.8.2 + - Use `slice::iter` instead of `into_iter` to avoid future breakage (#378, by @LukasKalbertodt) +## 0.8.1 + - Added a [`.exactly_one()`](https://docs.rs/itertools/0.8.1/itertools/trait.Itertools.html#method.exactly_one) iterator method that, on success, extracts the single value of an iterator ; by @Xaeroxe + - Added combinatory iterator adaptors: + - [`.permutations(k)`](https://docs.rs/itertools/0.8.1/itertools/trait.Itertools.html#method.permutations): + + `[0, 1, 2].iter().permutations(2)` yields + + ```rust + [ + vec![0, 1], + vec![0, 2], + vec![1, 0], + vec![1, 2], + vec![2, 0], + vec![2, 1], + ] + ``` + + ; by @tobz1000 + + - [`.combinations_with_replacement(k)`](https://docs.rs/itertools/0.8.1/itertools/trait.Itertools.html#method.combinations_with_replacement): + + `[0, 1, 2].iter().combinations_with_replacement(2)` yields + + ```rust + [ + vec![0, 0], + vec![0, 1], + vec![0, 2], + vec![1, 1], + vec![1, 2], + vec![2, 2], + ] + ``` + + ; by @tommilligan + + - For reference, these methods join the already existing [`.combinations(k)`](https://docs.rs/itertools/0.8.1/itertools/trait.Itertools.html#method.combinations): + + `[0, 1, 2].iter().combinations(2)` yields + + ```rust + [ + vec![0, 1], + vec![0, 2], + vec![1, 2], + ] + ``` + + - Improved the performance of [`.fold()`](https://docs.rs/itertools/0.8.1/itertools/trait.Itertools.html#method.fold)-based internal iteration for the [`.intersperse()`](https://docs.rs/itertools/0.8.1/itertools/trait.Itertools.html#method.intersperse) iterator ; by @jswrenn + - Added [`.dedup_by()`](https://docs.rs/itertools/0.8.1/itertools/trait.Itertools.html#method.dedup_by), [`.merge_by()`](https://docs.rs/itertools/0.8.1/itertools/trait.Itertools.html#method.merge_by) and [`.kmerge_by()`](https://docs.rs/itertools/0.8.1/itertools/trait.Itertools.html#method.kmerge_by) adaptors that work like [`.dedup()`](https://docs.rs/itertools/0.8.1/itertools/trait.Itertools.html#method.dedup), [`.merge()`](https://docs.rs/itertools/0.8.1/itertools/trait.Itertools.html#method.merge) and [`.kmerge()`](https://docs.rs/itertools/0.8.1/itertools/trait.Itertools.html#method.kmerge), but taking an additional custom comparison closure parameter. ; by @phimuemue + - Improved the performance of [`.all_equal()`](https://docs.rs/itertools/0.8.1/itertools/trait.Itertools.html#method.all_equal) ; by @fyrchik + - Loosened the bounds on [`.partition_map()`](https://docs.rs/itertools/0.8.1/itertools/trait.Itertools.html#method.partition_map) to take just a `FnMut` closure rather than a `Fn` closure, and made its implementation use internal iteration for better performance ; by @danielhenrymantilla + - Added convenience methods to [`EitherOrBoth`](https://docs.rs/itertools/0.8.1/itertools/enum.EitherOrBoth.html) elements yielded from the [`.zip_longest()`](https://docs.rs/itertools/0.8.1/itertools/trait.Itertools.html#method.zip_longest) iterator adaptor ; by @Avi-D-coder + - Added [`.sum1()`](https://docs.rs/itertools/0.8.1/itertools/trait.Itertools.html#method.sum1) and [`.product1()`](https://docs.rs/itertools/0.8.1/itertools/trait.Itertools.html#method.product1) iterator methods that respectively try to return the sum and the product of the elements of an iterator **when it is not empty**, otherwise they return `None` ; by @Emerentius +## 0.8.0 + - Added new adaptor `.map_into()` for conversions using `Into` by @vorner + - Improved `Itertools` docs by @JohnHeitmann + - The return type of `.sorted_by_by_key()` is now an iterator, not a Vec. + - The return type of the `izip!(x, y)` macro with exactly two arguments is now the usual `Iterator::zip`. + - Remove `.flatten()` in favour of std's `.flatten()` + - Deprecate `.foreach()` in favour of std's `.for_each()` + - Deprecate `.step()` in favour of std's `.step_by()` + - Deprecate `repeat_call` in favour of std's `repeat_with` + - Deprecate `.fold_while()` in favour of std's `.try_fold()` + - Require Rust 1.24 as minimal version. +## 0.7.11 + - Add convenience methods to `EitherOrBoth`, making it more similar to `Option` and `Either` by @jethrogb +## 0.7.10 + - No changes. +## 0.7.9 + - New inclusion policy: See the readme about suggesting features for std before accepting them in itertools. + - The `FoldWhile` type now implements `Eq` and `PartialEq` by @jturner314 +## 0.7.8 + - Add new iterator method `.tree_fold1()` which is like `.fold1()` except items are combined in a tree structure (see its docs). By @scottmcm + - Add more `Debug` impls by @phimuemue: KMerge, KMergeBy, MergeJoinBy, ConsTuples, Intersperse, ProcessResults, RcIter, Tee, TupleWindows, Tee, ZipLongest, ZipEq, Zip. +## 0.7.7 + - Add new iterator method `.into_group_map() -> HashMap>` which turns an iterator of `(K, V)` elements into such a hash table, where values are grouped by key. By @tobz1000 + - Add new free function `flatten` for the `.flatten()` adaptor. **NOTE:** recent Rust nightlies have `Iterator::flatten` and thus a clash with our flatten adaptor. One workaround is to use the itertools `flatten` free function. +## 0.7.6 + - Add new adaptor `.multi_cartesian_product()` which is an n-ary product iterator by @tobz1000 + - Add new method `.sorted_by_key()` by @Xion + - Provide simpler and faster `.count()` for `.unique()` and `.unique_by()` +## 0.7.5 + - `.multipeek()` now implements `PeekingNext`, by @nicopap. +## 0.7.4 + - Add new adaptor `.update()` by @lucasem; this adaptor is used to modify an element before passing it on in an iterator chain. +## 0.7.3 + - Add new method `.collect_tuple()` by @matklad; it makes a tuple out of the iterator's elements if the number of them matches **exactly**. + - Implement `fold` and `collect` for `.map_results()` which means it reuses the code of the standard `.map()` for these methods. +## 0.7.2 + - Add new adaptor `.merge_join_by` by @srijs; a heterogeneous merge join for two ordered sequences. +## 0.7.1 + - Iterator adaptors and iterators in itertools now use the same `must_use` reminder that the standard library adaptors do, by @matematikaedit and @bluss *“iterator adaptors are lazy and do nothing unless consumedâ€*. +## 0.7.0 + - Faster `izip!()` by @krdln + - `izip!()` is now a wrapper for repeated regular `.zip()` and a single `.map()`. This means it optimizes as well as the standard library `.zip()` it uses. **Note:** `multizip` and `izip!()` are now different! The former has a named type but the latter optimizes better. + - Faster `.unique()` + - `no_std` support, which is opt-in! + - Many lovable features are still there without std, like `izip!()` or `.format()` or `.merge()`, but not those that use collections. + - Trait bounds were required up front instead of just on the type: `group_by`'s `PartialEq` by @Phlosioneer and `repeat_call`'s `FnMut`. + - Removed deprecated constructor `Zip::new` — use `izip!()` or `multizip()` +## 0.6.5 + - Fix bug in `.cartesian_product()`'s fold (which only was visible for unfused iterators). +## 0.6.4 + - Add specific `fold` implementations for `.cartesian_product()` and `cons_tuples()`, which improves their performance in fold, foreach, and iterator consumers derived from them. +## 0.6.3 + - Add iterator adaptor `.positions(predicate)` by @tmccombs +## 0.6.2 + - Add function `process_results` which can “lift†a function of the regular values of an iterator so that it can process the `Ok` values from an iterator of `Results` instead, by @shepmaster + - Add iterator method `.concat()` which combines all iterator elements into a single collection using the `Extend` trait, by @srijs +## 0.6.1 + - Better size hint testing and subsequent size hint bugfixes by @rkarp. Fixes bugs in product, `interleave_shortest` size hints. + - New iterator method `.all_equal()` by @phimuemue +## 0.6.0 + - Deprecated names were removed in favour of their replacements + - `.flatten()` does not implement double ended iteration anymore + - `.fold_while()` uses `&mut self` and returns `FoldWhile`, for composability #168 + - `.foreach()` and `.fold1()` use `self`, like `.fold()` does. + - `.combinations(0)` now produces a single empty vector. #174 +## 0.5.10 + - Add itertools method `.kmerge_by()` (and corresponding free function) + - Relaxed trait requirement of `.kmerge()` and `.minmax()` to PartialOrd. +## 0.5.9 + - Add multipeek method `.reset_peek()` + - Add categories +## 0.5.8 + - Add iterator adaptor `.peeking_take_while()` and its trait `PeekingNext`. +## 0.5.7 + - Add iterator adaptor `.with_position()` + - Fix multipeek's performance for long peeks by using `VecDeque`. +## 0.5.6 + - Add `.map_results()` +## 0.5.5 + - Many more adaptors now implement `Debug` + - Add free function constructor `repeat_n`. `RepeatN::new` is now deprecated. +## 0.5.4 + - Add infinite generator function `iterate`, that takes a seed and a closure. +## 0.5.3 + - Special-cased `.fold()` for flatten and put back. `.foreach()` now uses fold on the iterator, to pick up any iterator specific loop implementation. + - `.combinations(n)` asserts up front that `n != 0`, instead of running into an error on the second iterator element. +## 0.5.2 + - Add `.tuples::()` that iterates by two, three or four elements at a time (where `T` is a tuple type). + - Add `.tuple_windows::()` that iterates using a window of the two, three or four most recent elements. + - Add `.next_tuple::()` method, that picks the next two, three or four elements in one go. + - `.interleave()` now has an accurate size hint. +## 0.5.1 + - Workaround module/function name clash that made racer crash on completing itertools. Only internal changes needed. +## 0.5.0 + - [Release announcement](https://bluss.github.io/rust/2016/09/26/itertools-0.5.0/) + - Renamed: + - `combinations` is now `tuple_combinations` + - `combinations_n` to `combinations` + - `group_by_lazy`, `chunks_lazy` to `group_by`, `chunks` + - `Unfold::new` to `unfold()` + - `RepeatCall::new` to `repeat_call()` + - `Zip::new` to `multizip` + - `PutBack::new`, `PutBackN::new` to `put_back`, `put_back_n` + - `PutBack::with_value` is now a builder setter, not a constructor + - `MultiPeek::new`, `.multipeek()` to `multipeek()` + - `format` to `format_with` and `format_default` to `format` + - `.into_rc()` to `rciter` + - `Partition` enum is now `Either` + - Module reorganization: + - All iterator structs are under `itertools::structs` but also reexported to the top level, for backwards compatibility + - All free functions are reexported at the root, `itertools::free` will be removed in the next version + - Removed: + - `ZipSlices`, use `.zip()` instead + - `.enumerate_from()`, `ZipTrusted`, due to being unstable + - `.mend_slices()`, moved to crate `odds` + - Stride, StrideMut, moved to crate `odds` + - `linspace()`, moved to crate `itertools-num` + - `.sort_by()`, use `.sorted_by()` + - `.is_empty_hint()`, use `.size_hint()` + - `.dropn()`, use `.dropping()` + - `.map_fn()`, use `.map()` + - `.slice()`, use `.take()` / `.skip()` + - helper traits in `misc` + - `new` constructors on iterator structs, use `Itertools` trait or free functions instead + - `itertools::size_hint` is now private + - Behaviour changes: + - `format` and `format_with` helpers now panic if you try to format them more than once. + - `repeat_call` is not double ended anymore + - New features: + - tuple flattening iterator is constructible with `cons_tuples` + - itertools reexports `Either` from the `either` crate. `Either` is an iterator when `L, R` are. + - `MinMaxResult` now implements `Copy` and `Clone` + - `tuple_combinations` supports 1-4 tuples of combinations (previously just 2) +## 0.4.19 + - Add `.minmax_by()` + - Add `itertools::free::cloned` + - Add `itertools::free::rciter` + - Improve `.step(n)` slightly to take advantage of specialized Fuse better. +## 0.4.18 + - Only changes related to the "unstable" crate feature. This feature is more or less deprecated. + - Use deprecated warnings when unstable is enabled. `.enumerate_from()` will be removed imminently since it's using a deprecated libstd trait. +## 0.4.17 + - Fix bug in `.kmerge()` that caused it to often produce the wrong order #134 +## 0.4.16 + - Improve precision of the `interleave_shortest` adaptor's size hint (it is now computed exactly when possible). +## 0.4.15 + - Fixup on top of the workaround in 0.4.14. A function in `itertools::free` was removed by mistake and now it is added back again. +## 0.4.14 + - Workaround an upstream regression in a Rust nightly build that broke compilation of of `itertools::free::{interleave, merge}` +## 0.4.13 + - Add `.minmax()` and `.minmax_by_key()`, iterator methods for finding both minimum and maximum in one scan. + - Add `.format_default()`, a simpler version of `.format()` (lazy formatting for iterators). +## 0.4.12 + - Add `.zip_eq()`, an adaptor like `.zip()` except it ensures iterators of inequal length don't pass silently (instead it panics). + - Add `.fold_while()`, an iterator method that is a fold that can short-circuit. + - Add `.partition_map()`, an iterator method that can separate elements into two collections. +## 0.4.11 + - Add `.get()` for `Stride{,Mut}` and `.get_mut()` for `StrideMut` +## 0.4.10 + - Improve performance of `.kmerge()` +## 0.4.9 + - Add k-ary merge adaptor `.kmerge()` + - Fix a bug in `.islice()` with ranges `a..b` where a `> b`. +## 0.4.8 + - Implement `Clone`, `Debug` for `Linspace` +## 0.4.7 + - Add function `diff_with()` that compares two iterators + - Add `.combinations_n()`, an n-ary combinations iterator + - Add methods `PutBack::with_value` and `PutBack::into_parts`. +## 0.4.6 + - Add method `.sorted()` + - Add module `itertools::free` with free function variants of common iterator adaptors and methods. For example `enumerate(iterable)`, `rev(iterable)`, and so on. +## 0.4.5 + - Add `.flatten()` +## 0.4.4 + - Allow composing `ZipSlices` with itself +## 0.4.3 + - Write `iproduct!()` as a single expression; this allows temporary values in its arguments. +## 0.4.2 + - Add `.fold_options()` + - Require Rust 1.1 or later +## 0.4.1 + - Update `.dropping()` to take advantage of `.nth()` +## 0.4.0 + - `.merge()`, `.unique()` and `.dedup()` now perform better due to not using function pointers + - Add free functions `enumerate()` and `rev()` + - Breaking changes: + - Return types of `.merge()` and `.merge_by()` renamed and changed + - Method `Merge::new` removed + - `.merge_by()` now takes a closure that returns bool. + - Return type of `.dedup()` changed + - Return type of `.mend_slices()` changed + - Return type of `.unique()` changed + - Removed function `times()`, struct `Times`: use a range instead + - Removed deprecated macro `icompr!()` + - Removed deprecated `FnMap` and method `.fn_map()`: use `.map_fn()` + - `.interleave_shortest()` is no longer guaranteed to act like fused +## 0.3.25 + - Rename `.sort_by()` to `.sorted_by()`. Old name is deprecated. + - Fix well-formedness warnings from RFC 1214, no user visible impact +## 0.3.24 + - Improve performance of `.merge()`'s ordering function slightly +## 0.3.23 + - Added `.chunks()`, similar to (and based on) `.group_by_lazy()`. + - Tweak linspace to match numpy.linspace and make it double ended. +## 0.3.22 + - Added `ZipSlices`, a fast zip for slices +## 0.3.21 + - Remove `Debug` impl for `Format`, it will have different use later +## 0.3.20 + - Optimize `.group_by_lazy()` +## 0.3.19 + - Added `.group_by_lazy()`, a possibly nonallocating group by + - Added `.format()`, a nonallocating formatting helper for iterators + - Remove uses of `RandomAccessIterator` since it has been deprecated in Rust. +## 0.3.17 + - Added (adopted) `Unfold` from Rust +## 0.3.16 + - Added adaptors `.unique()`, `.unique_by()` +## 0.3.15 + - Added method `.sort_by()` +## 0.3.14 + - Added adaptor `.while_some()` +## 0.3.13 + - Added adaptor `.interleave_shortest()` + - Added adaptor `.pad_using()` +## 0.3.11 + - Added `assert_equal` function +## 0.3.10 + - Bugfix `.combinations()` `size_hint`. +## 0.3.8 + - Added source `RepeatCall` +## 0.3.7 + - Added adaptor `PutBackN` + - Added adaptor `.combinations()` +## 0.3.6 + - Added `itertools::partition`, partition a sequence in place based on a predicate. + - Deprecate `icompr!()` with no replacement. +## 0.3.5 + - `.map_fn()` replaces deprecated `.fn_map()`. +## 0.3.4 + - `.take_while_ref()` *by-ref adaptor* + - `.coalesce()` *adaptor* + - `.mend_slices()` *adaptor* +## 0.3.3 + - `.dropping_back()` *method* + - `.fold1()` *method* + - `.is_empty_hint()` *method* diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/clippy.toml temporalio-1.3.0/vendor/itertools-0.10.5/clippy.toml --- temporalio-1.3.0/vendor/itertools-0.10.5/clippy.toml 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/clippy.toml 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1 @@ +msrv = "1.36.0" diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/examples/iris.data temporalio-1.3.0/vendor/itertools-0.10.5/examples/iris.data --- temporalio-1.3.0/vendor/itertools-0.10.5/examples/iris.data 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/examples/iris.data 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,150 @@ +5.1,3.5,1.4,0.2,Iris-setosa +4.9,3.0,1.4,0.2,Iris-setosa +4.7,3.2,1.3,0.2,Iris-setosa +4.6,3.1,1.5,0.2,Iris-setosa +5.0,3.6,1.4,0.2,Iris-setosa +5.4,3.9,1.7,0.4,Iris-setosa +4.6,3.4,1.4,0.3,Iris-setosa +5.0,3.4,1.5,0.2,Iris-setosa +4.4,2.9,1.4,0.2,Iris-setosa +4.9,3.1,1.5,0.1,Iris-setosa +5.4,3.7,1.5,0.2,Iris-setosa +4.8,3.4,1.6,0.2,Iris-setosa +4.8,3.0,1.4,0.1,Iris-setosa +4.3,3.0,1.1,0.1,Iris-setosa +5.8,4.0,1.2,0.2,Iris-setosa +5.7,4.4,1.5,0.4,Iris-setosa +5.4,3.9,1.3,0.4,Iris-setosa +5.1,3.5,1.4,0.3,Iris-setosa +5.7,3.8,1.7,0.3,Iris-setosa +5.1,3.8,1.5,0.3,Iris-setosa +5.4,3.4,1.7,0.2,Iris-setosa +5.1,3.7,1.5,0.4,Iris-setosa +4.6,3.6,1.0,0.2,Iris-setosa +5.1,3.3,1.7,0.5,Iris-setosa +4.8,3.4,1.9,0.2,Iris-setosa +5.0,3.0,1.6,0.2,Iris-setosa +5.0,3.4,1.6,0.4,Iris-setosa +5.2,3.5,1.5,0.2,Iris-setosa +5.2,3.4,1.4,0.2,Iris-setosa +4.7,3.2,1.6,0.2,Iris-setosa +4.8,3.1,1.6,0.2,Iris-setosa +5.4,3.4,1.5,0.4,Iris-setosa +5.2,4.1,1.5,0.1,Iris-setosa +5.5,4.2,1.4,0.2,Iris-setosa +4.9,3.1,1.5,0.1,Iris-setosa +5.0,3.2,1.2,0.2,Iris-setosa +5.5,3.5,1.3,0.2,Iris-setosa +4.9,3.1,1.5,0.1,Iris-setosa +4.4,3.0,1.3,0.2,Iris-setosa +5.1,3.4,1.5,0.2,Iris-setosa +5.0,3.5,1.3,0.3,Iris-setosa +4.5,2.3,1.3,0.3,Iris-setosa +4.4,3.2,1.3,0.2,Iris-setosa +5.0,3.5,1.6,0.6,Iris-setosa +5.1,3.8,1.9,0.4,Iris-setosa +4.8,3.0,1.4,0.3,Iris-setosa +5.1,3.8,1.6,0.2,Iris-setosa +4.6,3.2,1.4,0.2,Iris-setosa +5.3,3.7,1.5,0.2,Iris-setosa +5.0,3.3,1.4,0.2,Iris-setosa +7.0,3.2,4.7,1.4,Iris-versicolor +6.4,3.2,4.5,1.5,Iris-versicolor +6.9,3.1,4.9,1.5,Iris-versicolor +5.5,2.3,4.0,1.3,Iris-versicolor +6.5,2.8,4.6,1.5,Iris-versicolor +5.7,2.8,4.5,1.3,Iris-versicolor +6.3,3.3,4.7,1.6,Iris-versicolor +4.9,2.4,3.3,1.0,Iris-versicolor +6.6,2.9,4.6,1.3,Iris-versicolor +5.2,2.7,3.9,1.4,Iris-versicolor +5.0,2.0,3.5,1.0,Iris-versicolor +5.9,3.0,4.2,1.5,Iris-versicolor +6.0,2.2,4.0,1.0,Iris-versicolor +6.1,2.9,4.7,1.4,Iris-versicolor +5.6,2.9,3.6,1.3,Iris-versicolor +6.7,3.1,4.4,1.4,Iris-versicolor +5.6,3.0,4.5,1.5,Iris-versicolor +5.8,2.7,4.1,1.0,Iris-versicolor +6.2,2.2,4.5,1.5,Iris-versicolor +5.6,2.5,3.9,1.1,Iris-versicolor +5.9,3.2,4.8,1.8,Iris-versicolor +6.1,2.8,4.0,1.3,Iris-versicolor +6.3,2.5,4.9,1.5,Iris-versicolor +6.1,2.8,4.7,1.2,Iris-versicolor +6.4,2.9,4.3,1.3,Iris-versicolor +6.6,3.0,4.4,1.4,Iris-versicolor +6.8,2.8,4.8,1.4,Iris-versicolor +6.7,3.0,5.0,1.7,Iris-versicolor +6.0,2.9,4.5,1.5,Iris-versicolor +5.7,2.6,3.5,1.0,Iris-versicolor +5.5,2.4,3.8,1.1,Iris-versicolor +5.5,2.4,3.7,1.0,Iris-versicolor +5.8,2.7,3.9,1.2,Iris-versicolor +6.0,2.7,5.1,1.6,Iris-versicolor +5.4,3.0,4.5,1.5,Iris-versicolor +6.0,3.4,4.5,1.6,Iris-versicolor +6.7,3.1,4.7,1.5,Iris-versicolor +6.3,2.3,4.4,1.3,Iris-versicolor +5.6,3.0,4.1,1.3,Iris-versicolor +5.5,2.5,4.0,1.3,Iris-versicolor +5.5,2.6,4.4,1.2,Iris-versicolor +6.1,3.0,4.6,1.4,Iris-versicolor +5.8,2.6,4.0,1.2,Iris-versicolor +5.0,2.3,3.3,1.0,Iris-versicolor +5.6,2.7,4.2,1.3,Iris-versicolor +5.7,3.0,4.2,1.2,Iris-versicolor +5.7,2.9,4.2,1.3,Iris-versicolor +6.2,2.9,4.3,1.3,Iris-versicolor +5.1,2.5,3.0,1.1,Iris-versicolor +5.7,2.8,4.1,1.3,Iris-versicolor +6.3,3.3,6.0,2.5,Iris-virginica +5.8,2.7,5.1,1.9,Iris-virginica +7.1,3.0,5.9,2.1,Iris-virginica +6.3,2.9,5.6,1.8,Iris-virginica +6.5,3.0,5.8,2.2,Iris-virginica +7.6,3.0,6.6,2.1,Iris-virginica +4.9,2.5,4.5,1.7,Iris-virginica +7.3,2.9,6.3,1.8,Iris-virginica +6.7,2.5,5.8,1.8,Iris-virginica +7.2,3.6,6.1,2.5,Iris-virginica +6.5,3.2,5.1,2.0,Iris-virginica +6.4,2.7,5.3,1.9,Iris-virginica +6.8,3.0,5.5,2.1,Iris-virginica +5.7,2.5,5.0,2.0,Iris-virginica +5.8,2.8,5.1,2.4,Iris-virginica +6.4,3.2,5.3,2.3,Iris-virginica +6.5,3.0,5.5,1.8,Iris-virginica +7.7,3.8,6.7,2.2,Iris-virginica +7.7,2.6,6.9,2.3,Iris-virginica +6.0,2.2,5.0,1.5,Iris-virginica +6.9,3.2,5.7,2.3,Iris-virginica +5.6,2.8,4.9,2.0,Iris-virginica +7.7,2.8,6.7,2.0,Iris-virginica +6.3,2.7,4.9,1.8,Iris-virginica +6.7,3.3,5.7,2.1,Iris-virginica +7.2,3.2,6.0,1.8,Iris-virginica +6.2,2.8,4.8,1.8,Iris-virginica +6.1,3.0,4.9,1.8,Iris-virginica +6.4,2.8,5.6,2.1,Iris-virginica +7.2,3.0,5.8,1.6,Iris-virginica +7.4,2.8,6.1,1.9,Iris-virginica +7.9,3.8,6.4,2.0,Iris-virginica +6.4,2.8,5.6,2.2,Iris-virginica +6.3,2.8,5.1,1.5,Iris-virginica +6.1,2.6,5.6,1.4,Iris-virginica +7.7,3.0,6.1,2.3,Iris-virginica +6.3,3.4,5.6,2.4,Iris-virginica +6.4,3.1,5.5,1.8,Iris-virginica +6.0,3.0,4.8,1.8,Iris-virginica +6.9,3.1,5.4,2.1,Iris-virginica +6.7,3.1,5.6,2.4,Iris-virginica +6.9,3.1,5.1,2.3,Iris-virginica +5.8,2.7,5.1,1.9,Iris-virginica +6.8,3.2,5.9,2.3,Iris-virginica +6.7,3.3,5.7,2.5,Iris-virginica +6.7,3.0,5.2,2.3,Iris-virginica +6.3,2.5,5.0,1.9,Iris-virginica +6.5,3.0,5.2,2.0,Iris-virginica +6.2,3.4,5.4,2.3,Iris-virginica +5.9,3.0,5.1,1.8,Iris-virginica diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/examples/iris.rs temporalio-1.3.0/vendor/itertools-0.10.5/examples/iris.rs --- temporalio-1.3.0/vendor/itertools-0.10.5/examples/iris.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/examples/iris.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,137 @@ +/// +/// This example parses, sorts and groups the iris dataset +/// and does some simple manipulations. +/// +/// Iterators and itertools functionality are used throughout. + +use itertools::Itertools; +use std::collections::HashMap; +use std::iter::repeat; +use std::num::ParseFloatError; +use std::str::FromStr; + +static DATA: &'static str = include_str!("iris.data"); + +#[derive(Clone, Debug)] +struct Iris { + name: String, + data: [f32; 4], +} + +#[derive(Clone, Debug)] +enum ParseError { + Numeric(ParseFloatError), + Other(&'static str), +} + +impl From for ParseError { + fn from(err: ParseFloatError) -> Self { + ParseError::Numeric(err) + } +} + +/// Parse an Iris from a comma-separated line +impl FromStr for Iris { + type Err = ParseError; + + fn from_str(s: &str) -> Result { + let mut iris = Iris { name: "".into(), data: [0.; 4] }; + let mut parts = s.split(",").map(str::trim); + + // using Iterator::by_ref() + for (index, part) in parts.by_ref().take(4).enumerate() { + iris.data[index] = part.parse::()?; + } + if let Some(name) = parts.next() { + iris.name = name.into(); + } else { + return Err(ParseError::Other("Missing name")) + } + Ok(iris) + } +} + +fn main() { + // using Itertools::fold_results to create the result of parsing + let irises = DATA.lines() + .map(str::parse) + .fold_ok(Vec::new(), |mut v, iris: Iris| { + v.push(iris); + v + }); + let mut irises = match irises { + Err(e) => { + println!("Error parsing: {:?}", e); + std::process::exit(1); + } + Ok(data) => data, + }; + + // Sort them and group them + irises.sort_by(|a, b| Ord::cmp(&a.name, &b.name)); + + // using Iterator::cycle() + let mut plot_symbols = "+ox".chars().cycle(); + let mut symbolmap = HashMap::new(); + + // using Itertools::group_by + for (species, species_group) in &irises.iter().group_by(|iris| &iris.name) { + // assign a plot symbol + symbolmap.entry(species).or_insert_with(|| { + plot_symbols.next().unwrap() + }); + println!("{} (symbol={})", species, symbolmap[species]); + + for iris in species_group { + // using Itertools::format for lazy formatting + println!("{:>3.1}", iris.data.iter().format(", ")); + } + + } + + // Look at all combinations of the four columns + // + // See https://en.wikipedia.org/wiki/Iris_flower_data_set + // + let n = 30; // plot size + let mut plot = vec![' '; n * n]; + + // using Itertools::tuple_combinations + for (a, b) in (0..4).tuple_combinations() { + println!("Column {} vs {}:", a, b); + + // Clear plot + // + // using std::iter::repeat; + // using Itertools::set_from + plot.iter_mut().set_from(repeat(' ')); + + // using Itertools::minmax + let min_max = |data: &[Iris], col| { + data.iter() + .map(|iris| iris.data[col]) + .minmax() + .into_option() + .expect("Can't find min/max of empty iterator") + }; + let (min_x, max_x) = min_max(&irises, a); + let (min_y, max_y) = min_max(&irises, b); + + // Plot the data points + let round_to_grid = |x, min, max| ((x - min) / (max - min) * ((n - 1) as f32)) as usize; + let flip = |ix| n - 1 - ix; // reverse axis direction + + for iris in &irises { + let ix = round_to_grid(iris.data[a], min_x, max_x); + let iy = flip(round_to_grid(iris.data[b], min_y, max_y)); + plot[n * iy + ix] = symbolmap[&iris.name]; + } + + // render plot + // + // using Itertools::join + for line in plot.chunks(n) { + println!("{}", line.iter().join(" ")) + } + } +} diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/LICENSE-APACHE temporalio-1.3.0/vendor/itertools-0.10.5/LICENSE-APACHE --- temporalio-1.3.0/vendor/itertools-0.10.5/LICENSE-APACHE 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/LICENSE-APACHE 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/LICENSE-MIT temporalio-1.3.0/vendor/itertools-0.10.5/LICENSE-MIT --- temporalio-1.3.0/vendor/itertools-0.10.5/LICENSE-MIT 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/LICENSE-MIT 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,25 @@ +Copyright (c) 2015 + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/README.md temporalio-1.3.0/vendor/itertools-0.10.5/README.md --- temporalio-1.3.0/vendor/itertools-0.10.5/README.md 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/README.md 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,44 @@ +# Itertools + +Extra iterator adaptors, functions and macros. + +Please read the [API documentation here](https://docs.rs/itertools/). + +[![build_status](https://github.com/rust-itertools/itertools/actions/workflows/ci.yml/badge.svg)](https://github.com/rust-itertools/itertools/actions) +[![crates.io](https://img.shields.io/crates/v/itertools.svg)](https://crates.io/crates/itertools) + +How to use with Cargo: + +```toml +[dependencies] +itertools = "0.10.5" +``` + +How to use in your crate: + +```rust +use itertools::Itertools; +``` + +## How to contribute + +- Fix a bug or implement a new thing +- Include tests for your new feature, preferably a QuickCheck test +- Make a Pull Request + +For new features, please first consider filing a PR to [rust-lang/rust](https://github.com/rust-lang/rust), +adding your new feature to the `Iterator` trait of the standard library, if you believe it is reasonable. +If it isn't accepted there, proposing it for inclusion in ``itertools`` is a good idea. +The reason for doing is this is so that we avoid future breakage as with ``.flatten()``. +However, if your feature involves heap allocation, such as storing elements in a ``Vec``, +then it can't be accepted into ``libcore``, and you should propose it for ``itertools`` directly instead. + +## License + +Dual-licensed to be compatible with the Rust project. + +Licensed under the Apache License, Version 2.0 +https://www.apache.org/licenses/LICENSE-2.0 or the MIT license +https://opensource.org/licenses/MIT, at your +option. This file may not be copied, modified, or distributed +except according to those terms. diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/src/adaptors/coalesce.rs temporalio-1.3.0/vendor/itertools-0.10.5/src/adaptors/coalesce.rs --- temporalio-1.3.0/vendor/itertools-0.10.5/src/adaptors/coalesce.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/src/adaptors/coalesce.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,235 @@ +use std::fmt; +use std::iter::FusedIterator; + +use crate::size_hint; + +#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] +pub struct CoalesceBy +where + I: Iterator, +{ + iter: I, + last: Option, + f: F, +} + +impl Clone for CoalesceBy +where + I: Iterator, +{ + clone_fields!(last, iter, f); +} + +impl fmt::Debug for CoalesceBy +where + I: Iterator + fmt::Debug, + T: fmt::Debug, +{ + debug_fmt_fields!(CoalesceBy, iter); +} + +pub trait CoalescePredicate { + fn coalesce_pair(&mut self, t: T, item: Item) -> Result; +} + +impl Iterator for CoalesceBy +where + I: Iterator, + F: CoalescePredicate, +{ + type Item = T; + + fn next(&mut self) -> Option { + // this fuses the iterator + let last = self.last.take()?; + + let self_last = &mut self.last; + let self_f = &mut self.f; + Some( + self.iter + .try_fold(last, |last, next| match self_f.coalesce_pair(last, next) { + Ok(joined) => Ok(joined), + Err((last_, next_)) => { + *self_last = Some(next_); + Err(last_) + } + }) + .unwrap_or_else(|x| x), + ) + } + + fn size_hint(&self) -> (usize, Option) { + let (low, hi) = size_hint::add_scalar(self.iter.size_hint(), self.last.is_some() as usize); + ((low > 0) as usize, hi) + } + + fn fold(self, acc: Acc, mut fn_acc: FnAcc) -> Acc + where + FnAcc: FnMut(Acc, Self::Item) -> Acc, + { + if let Some(last) = self.last { + let mut f = self.f; + let (last, acc) = self.iter.fold((last, acc), |(last, acc), elt| { + match f.coalesce_pair(last, elt) { + Ok(joined) => (joined, acc), + Err((last_, next_)) => (next_, fn_acc(acc, last_)), + } + }); + fn_acc(acc, last) + } else { + acc + } + } +} + +impl, T> FusedIterator for CoalesceBy {} + +/// An iterator adaptor that may join together adjacent elements. +/// +/// See [`.coalesce()`](crate::Itertools::coalesce) for more information. +pub type Coalesce = CoalesceBy::Item>; + +impl CoalescePredicate for F +where + F: FnMut(T, Item) -> Result, +{ + fn coalesce_pair(&mut self, t: T, item: Item) -> Result { + self(t, item) + } +} + +/// Create a new `Coalesce`. +pub fn coalesce(mut iter: I, f: F) -> Coalesce +where + I: Iterator, +{ + Coalesce { + last: iter.next(), + iter, + f, + } +} + +/// An iterator adaptor that removes repeated duplicates, determining equality using a comparison function. +/// +/// See [`.dedup_by()`](crate::Itertools::dedup_by) or [`.dedup()`](crate::Itertools::dedup) for more information. +pub type DedupBy = CoalesceBy, ::Item>; + +#[derive(Clone)] +pub struct DedupPred2CoalescePred(DP); + +impl fmt::Debug for DedupPred2CoalescePred { + debug_fmt_fields!(DedupPred2CoalescePred,); +} + +pub trait DedupPredicate { + // TODO replace by Fn(&T, &T)->bool once Rust supports it + fn dedup_pair(&mut self, a: &T, b: &T) -> bool; +} + +impl CoalescePredicate for DedupPred2CoalescePred +where + DP: DedupPredicate, +{ + fn coalesce_pair(&mut self, t: T, item: T) -> Result { + if self.0.dedup_pair(&t, &item) { + Ok(t) + } else { + Err((t, item)) + } + } +} + +#[derive(Clone, Debug)] +pub struct DedupEq; + +impl DedupPredicate for DedupEq { + fn dedup_pair(&mut self, a: &T, b: &T) -> bool { + a == b + } +} + +impl bool> DedupPredicate for F { + fn dedup_pair(&mut self, a: &T, b: &T) -> bool { + self(a, b) + } +} + +/// Create a new `DedupBy`. +pub fn dedup_by(mut iter: I, dedup_pred: Pred) -> DedupBy +where + I: Iterator, +{ + DedupBy { + last: iter.next(), + iter, + f: DedupPred2CoalescePred(dedup_pred), + } +} + +/// An iterator adaptor that removes repeated duplicates. +/// +/// See [`.dedup()`](crate::Itertools::dedup) for more information. +pub type Dedup = DedupBy; + +/// Create a new `Dedup`. +pub fn dedup(iter: I) -> Dedup +where + I: Iterator, +{ + dedup_by(iter, DedupEq) +} + +/// An iterator adaptor that removes repeated duplicates, while keeping a count of how many +/// repeated elements were present. This will determine equality using a comparison function. +/// +/// See [`.dedup_by_with_count()`](crate::Itertools::dedup_by_with_count) or +/// [`.dedup_with_count()`](crate::Itertools::dedup_with_count) for more information. +pub type DedupByWithCount = + CoalesceBy, (usize, ::Item)>; + +#[derive(Clone, Debug)] +pub struct DedupPredWithCount2CoalescePred(DP); + +impl CoalescePredicate for DedupPredWithCount2CoalescePred +where + DP: DedupPredicate, +{ + fn coalesce_pair( + &mut self, + (c, t): (usize, T), + item: T, + ) -> Result<(usize, T), ((usize, T), (usize, T))> { + if self.0.dedup_pair(&t, &item) { + Ok((c + 1, t)) + } else { + Err(((c, t), (1, item))) + } + } +} + +/// An iterator adaptor that removes repeated duplicates, while keeping a count of how many +/// repeated elements were present. +/// +/// See [`.dedup_with_count()`](crate::Itertools::dedup_with_count) for more information. +pub type DedupWithCount = DedupByWithCount; + +/// Create a new `DedupByWithCount`. +pub fn dedup_by_with_count(mut iter: I, dedup_pred: Pred) -> DedupByWithCount +where + I: Iterator, +{ + DedupByWithCount { + last: iter.next().map(|v| (1, v)), + iter, + f: DedupPredWithCount2CoalescePred(dedup_pred), + } +} + +/// Create a new `DedupWithCount`. +pub fn dedup_with_count(iter: I) -> DedupWithCount +where + I: Iterator, +{ + dedup_by_with_count(iter, DedupEq) +} diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/src/adaptors/map.rs temporalio-1.3.0/vendor/itertools-0.10.5/src/adaptors/map.rs --- temporalio-1.3.0/vendor/itertools-0.10.5/src/adaptors/map.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/src/adaptors/map.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,124 @@ +use std::iter::FromIterator; +use std::marker::PhantomData; + +#[derive(Clone, Debug)] +#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] +pub struct MapSpecialCase { + iter: I, + f: F, +} + +pub trait MapSpecialCaseFn { + type Out; + fn call(&mut self, t: T) -> Self::Out; +} + +impl Iterator for MapSpecialCase +where + I: Iterator, + R: MapSpecialCaseFn, +{ + type Item = R::Out; + + fn next(&mut self) -> Option { + self.iter.next().map(|i| self.f.call(i)) + } + + fn size_hint(&self) -> (usize, Option) { + self.iter.size_hint() + } + + fn fold(self, init: Acc, mut fold_f: Fold) -> Acc + where + Fold: FnMut(Acc, Self::Item) -> Acc, + { + let mut f = self.f; + self.iter.fold(init, move |acc, v| fold_f(acc, f.call(v))) + } + + fn collect(self) -> C + where + C: FromIterator, + { + let mut f = self.f; + self.iter.map(move |v| f.call(v)).collect() + } +} + +impl DoubleEndedIterator for MapSpecialCase +where + I: DoubleEndedIterator, + R: MapSpecialCaseFn, +{ + fn next_back(&mut self) -> Option { + self.iter.next_back().map(|i| self.f.call(i)) + } +} + +impl ExactSizeIterator for MapSpecialCase +where + I: ExactSizeIterator, + R: MapSpecialCaseFn, +{ +} + +/// An iterator adapter to apply a transformation within a nested `Result::Ok`. +/// +/// See [`.map_ok()`](crate::Itertools::map_ok) for more information. +pub type MapOk = MapSpecialCase>; + +/// See [`MapOk`]. +#[deprecated(note = "Use MapOk instead", since = "0.10.0")] +pub type MapResults = MapOk; + +impl MapSpecialCaseFn> for MapSpecialCaseFnOk +where + F: FnMut(T) -> U, +{ + type Out = Result; + fn call(&mut self, t: Result) -> Self::Out { + t.map(|v| self.0(v)) + } +} + +#[derive(Clone)] +pub struct MapSpecialCaseFnOk(F); + +impl std::fmt::Debug for MapSpecialCaseFnOk { + debug_fmt_fields!(MapSpecialCaseFnOk,); +} + +/// Create a new `MapOk` iterator. +pub fn map_ok(iter: I, f: F) -> MapOk +where + I: Iterator>, + F: FnMut(T) -> U, +{ + MapSpecialCase { + iter, + f: MapSpecialCaseFnOk(f), + } +} + +/// An iterator adapter to apply `Into` conversion to each element. +/// +/// See [`.map_into()`](crate::Itertools::map_into) for more information. +pub type MapInto = MapSpecialCase>; + +impl, U> MapSpecialCaseFn for MapSpecialCaseFnInto { + type Out = U; + fn call(&mut self, t: T) -> Self::Out { + t.into() + } +} + +#[derive(Clone, Debug)] +pub struct MapSpecialCaseFnInto(PhantomData); + +/// Create a new [`MapInto`] iterator. +pub fn map_into(iter: I) -> MapInto { + MapSpecialCase { + iter, + f: MapSpecialCaseFnInto(PhantomData), + } +} diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/src/adaptors/mod.rs temporalio-1.3.0/vendor/itertools-0.10.5/src/adaptors/mod.rs --- temporalio-1.3.0/vendor/itertools-0.10.5/src/adaptors/mod.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/src/adaptors/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,1151 @@ +//! Licensed under the Apache License, Version 2.0 +//! or the MIT license +//! , at your +//! option. This file may not be copied, modified, or distributed +//! except according to those terms. + +mod coalesce; +mod map; +mod multi_product; +pub use self::coalesce::*; +pub use self::map::{map_into, map_ok, MapInto, MapOk}; +#[allow(deprecated)] +pub use self::map::MapResults; +#[cfg(feature = "use_alloc")] +pub use self::multi_product::*; + +use std::fmt; +use std::iter::{Fuse, Peekable, FromIterator, FusedIterator}; +use std::marker::PhantomData; +use crate::size_hint; + +/// An iterator adaptor that alternates elements from two iterators until both +/// run out. +/// +/// This iterator is *fused*. +/// +/// See [`.interleave()`](crate::Itertools::interleave) for more information. +#[derive(Clone, Debug)] +#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] +pub struct Interleave { + a: Fuse, + b: Fuse, + flag: bool, +} + +/// Create an iterator that interleaves elements in `i` and `j`. +/// +/// [`IntoIterator`] enabled version of `[Itertools::interleave]`. +pub fn interleave(i: I, j: J) -> Interleave<::IntoIter, ::IntoIter> + where I: IntoIterator, + J: IntoIterator +{ + Interleave { + a: i.into_iter().fuse(), + b: j.into_iter().fuse(), + flag: false, + } +} + +impl Iterator for Interleave + where I: Iterator, + J: Iterator +{ + type Item = I::Item; + #[inline] + fn next(&mut self) -> Option { + self.flag = !self.flag; + if self.flag { + match self.a.next() { + None => self.b.next(), + r => r, + } + } else { + match self.b.next() { + None => self.a.next(), + r => r, + } + } + } + + fn size_hint(&self) -> (usize, Option) { + size_hint::add(self.a.size_hint(), self.b.size_hint()) + } +} + +impl FusedIterator for Interleave + where I: Iterator, + J: Iterator +{} + +/// An iterator adaptor that alternates elements from the two iterators until +/// one of them runs out. +/// +/// This iterator is *fused*. +/// +/// See [`.interleave_shortest()`](crate::Itertools::interleave_shortest) +/// for more information. +#[derive(Clone, Debug)] +#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] +pub struct InterleaveShortest + where I: Iterator, + J: Iterator +{ + it0: I, + it1: J, + phase: bool, // false ==> it0, true ==> it1 +} + +/// Create a new `InterleaveShortest` iterator. +pub fn interleave_shortest(a: I, b: J) -> InterleaveShortest + where I: Iterator, + J: Iterator +{ + InterleaveShortest { + it0: a, + it1: b, + phase: false, + } +} + +impl Iterator for InterleaveShortest + where I: Iterator, + J: Iterator +{ + type Item = I::Item; + + #[inline] + fn next(&mut self) -> Option { + let e = if self.phase { self.it1.next() } else { self.it0.next() }; + if e.is_some() { + self.phase = !self.phase; + } + e + } + + #[inline] + fn size_hint(&self) -> (usize, Option) { + let (curr_hint, next_hint) = { + let it0_hint = self.it0.size_hint(); + let it1_hint = self.it1.size_hint(); + if self.phase { + (it1_hint, it0_hint) + } else { + (it0_hint, it1_hint) + } + }; + let (curr_lower, curr_upper) = curr_hint; + let (next_lower, next_upper) = next_hint; + let (combined_lower, combined_upper) = + size_hint::mul_scalar(size_hint::min(curr_hint, next_hint), 2); + let lower = + if curr_lower > next_lower { + combined_lower + 1 + } else { + combined_lower + }; + let upper = { + let extra_elem = match (curr_upper, next_upper) { + (_, None) => false, + (None, Some(_)) => true, + (Some(curr_max), Some(next_max)) => curr_max > next_max, + }; + if extra_elem { + combined_upper.and_then(|x| x.checked_add(1)) + } else { + combined_upper + } + }; + (lower, upper) + } +} + +impl FusedIterator for InterleaveShortest + where I: FusedIterator, + J: FusedIterator +{} + +#[derive(Clone, Debug)] +/// An iterator adaptor that allows putting back a single +/// item to the front of the iterator. +/// +/// Iterator element type is `I::Item`. +pub struct PutBack + where I: Iterator +{ + top: Option, + iter: I, +} + +/// Create an iterator where you can put back a single item +pub fn put_back(iterable: I) -> PutBack + where I: IntoIterator +{ + PutBack { + top: None, + iter: iterable.into_iter(), + } +} + +impl PutBack + where I: Iterator +{ + /// put back value `value` (builder method) + pub fn with_value(mut self, value: I::Item) -> Self { + self.put_back(value); + self + } + + /// Split the `PutBack` into its parts. + #[inline] + pub fn into_parts(self) -> (Option, I) { + let PutBack{top, iter} = self; + (top, iter) + } + + /// Put back a single value to the front of the iterator. + /// + /// If a value is already in the put back slot, it is overwritten. + #[inline] + pub fn put_back(&mut self, x: I::Item) { + self.top = Some(x); + } +} + +impl Iterator for PutBack + where I: Iterator +{ + type Item = I::Item; + #[inline] + fn next(&mut self) -> Option { + match self.top { + None => self.iter.next(), + ref mut some => some.take(), + } + } + #[inline] + fn size_hint(&self) -> (usize, Option) { + // Not ExactSizeIterator because size may be larger than usize + size_hint::add_scalar(self.iter.size_hint(), self.top.is_some() as usize) + } + + fn count(self) -> usize { + self.iter.count() + (self.top.is_some() as usize) + } + + fn last(self) -> Option { + self.iter.last().or(self.top) + } + + fn nth(&mut self, n: usize) -> Option { + match self.top { + None => self.iter.nth(n), + ref mut some => { + if n == 0 { + some.take() + } else { + *some = None; + self.iter.nth(n - 1) + } + } + } + } + + fn all(&mut self, mut f: G) -> bool + where G: FnMut(Self::Item) -> bool + { + if let Some(elt) = self.top.take() { + if !f(elt) { + return false; + } + } + self.iter.all(f) + } + + fn fold(mut self, init: Acc, mut f: G) -> Acc + where G: FnMut(Acc, Self::Item) -> Acc, + { + let mut accum = init; + if let Some(elt) = self.top.take() { + accum = f(accum, elt); + } + self.iter.fold(accum, f) + } +} + +#[derive(Debug, Clone)] +/// An iterator adaptor that iterates over the cartesian product of +/// the element sets of two iterators `I` and `J`. +/// +/// Iterator element type is `(I::Item, J::Item)`. +/// +/// See [`.cartesian_product()`](crate::Itertools::cartesian_product) for more information. +#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] +pub struct Product + where I: Iterator +{ + a: I, + a_cur: Option, + b: J, + b_orig: J, +} + +/// Create a new cartesian product iterator +/// +/// Iterator element type is `(I::Item, J::Item)`. +pub fn cartesian_product(mut i: I, j: J) -> Product + where I: Iterator, + J: Clone + Iterator, + I::Item: Clone +{ + Product { + a_cur: i.next(), + a: i, + b: j.clone(), + b_orig: j, + } +} + +impl Iterator for Product + where I: Iterator, + J: Clone + Iterator, + I::Item: Clone +{ + type Item = (I::Item, J::Item); + + fn next(&mut self) -> Option { + let elt_b = match self.b.next() { + None => { + self.b = self.b_orig.clone(); + match self.b.next() { + None => return None, + Some(x) => { + self.a_cur = self.a.next(); + x + } + } + } + Some(x) => x + }; + self.a_cur.as_ref().map(|a| (a.clone(), elt_b)) + } + + fn size_hint(&self) -> (usize, Option) { + let has_cur = self.a_cur.is_some() as usize; + // Not ExactSizeIterator because size may be larger than usize + let (b_min, b_max) = self.b.size_hint(); + + // Compute a * b_orig + b for both lower and upper bound + size_hint::add( + size_hint::mul(self.a.size_hint(), self.b_orig.size_hint()), + (b_min * has_cur, b_max.map(move |x| x * has_cur))) + } + + fn fold(mut self, mut accum: Acc, mut f: G) -> Acc + where G: FnMut(Acc, Self::Item) -> Acc, + { + // use a split loop to handle the loose a_cur as well as avoiding to + // clone b_orig at the end. + if let Some(mut a) = self.a_cur.take() { + let mut b = self.b; + loop { + accum = b.fold(accum, |acc, elt| f(acc, (a.clone(), elt))); + + // we can only continue iterating a if we had a first element; + if let Some(next_a) = self.a.next() { + b = self.b_orig.clone(); + a = next_a; + } else { + break; + } + } + } + accum + } +} + +impl FusedIterator for Product + where I: FusedIterator, + J: Clone + FusedIterator, + I::Item: Clone +{} + +/// A “meta iterator adaptorâ€. Its closure receives a reference to the iterator +/// and may pick off as many elements as it likes, to produce the next iterator element. +/// +/// Iterator element type is *X*, if the return type of `F` is *Option\*. +/// +/// See [`.batching()`](crate::Itertools::batching) for more information. +#[derive(Clone)] +#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] +pub struct Batching { + f: F, + iter: I, +} + +impl fmt::Debug for Batching where I: fmt::Debug { + debug_fmt_fields!(Batching, iter); +} + +/// Create a new Batching iterator. +pub fn batching(iter: I, f: F) -> Batching { + Batching { f, iter } +} + +impl Iterator for Batching + where I: Iterator, + F: FnMut(&mut I) -> Option +{ + type Item = B; + #[inline] + fn next(&mut self) -> Option { + (self.f)(&mut self.iter) + } +} + +/// An iterator adaptor that steps a number elements in the base iterator +/// for each iteration. +/// +/// The iterator steps by yielding the next element from the base iterator, +/// then skipping forward *n-1* elements. +/// +/// See [`.step()`](crate::Itertools::step) for more information. +#[deprecated(note="Use std .step_by() instead", since="0.8.0")] +#[allow(deprecated)] +#[derive(Clone, Debug)] +#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] +pub struct Step { + iter: Fuse, + skip: usize, +} + +/// Create a `Step` iterator. +/// +/// **Panics** if the step is 0. +#[allow(deprecated)] +pub fn step(iter: I, step: usize) -> Step + where I: Iterator +{ + assert!(step != 0); + Step { + iter: iter.fuse(), + skip: step - 1, + } +} + +#[allow(deprecated)] +impl Iterator for Step + where I: Iterator +{ + type Item = I::Item; + #[inline] + fn next(&mut self) -> Option { + let elt = self.iter.next(); + if self.skip > 0 { + self.iter.nth(self.skip - 1); + } + elt + } + + fn size_hint(&self) -> (usize, Option) { + let (low, high) = self.iter.size_hint(); + let div = |x: usize| { + if x == 0 { + 0 + } else { + 1 + (x - 1) / (self.skip + 1) + } + }; + (div(low), high.map(div)) + } +} + +// known size +#[allow(deprecated)] +impl ExactSizeIterator for Step + where I: ExactSizeIterator +{} + +pub trait MergePredicate { + fn merge_pred(&mut self, a: &T, b: &T) -> bool; +} + +#[derive(Clone, Debug)] +pub struct MergeLte; + +impl MergePredicate for MergeLte { + fn merge_pred(&mut self, a: &T, b: &T) -> bool { + a <= b + } +} + +/// An iterator adaptor that merges the two base iterators in ascending order. +/// If both base iterators are sorted (ascending), the result is sorted. +/// +/// Iterator element type is `I::Item`. +/// +/// See [`.merge()`](crate::Itertools::merge_by) for more information. +pub type Merge = MergeBy; + +/// Create an iterator that merges elements in `i` and `j`. +/// +/// [`IntoIterator`] enabled version of [`Itertools::merge`](crate::Itertools::merge). +/// +/// ``` +/// use itertools::merge; +/// +/// for elt in merge(&[1, 2, 3], &[2, 3, 4]) { +/// /* loop body */ +/// } +/// ``` +pub fn merge(i: I, j: J) -> Merge<::IntoIter, ::IntoIter> + where I: IntoIterator, + J: IntoIterator, + I::Item: PartialOrd +{ + merge_by_new(i, j, MergeLte) +} + +/// An iterator adaptor that merges the two base iterators in ascending order. +/// If both base iterators are sorted (ascending), the result is sorted. +/// +/// Iterator element type is `I::Item`. +/// +/// See [`.merge_by()`](crate::Itertools::merge_by) for more information. +#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] +pub struct MergeBy + where I: Iterator, + J: Iterator +{ + a: Peekable, + b: Peekable, + fused: Option, + cmp: F, +} + +impl fmt::Debug for MergeBy + where I: Iterator + fmt::Debug, J: Iterator + fmt::Debug, + I::Item: fmt::Debug, +{ + debug_fmt_fields!(MergeBy, a, b); +} + +implbool> MergePredicate for F { + fn merge_pred(&mut self, a: &T, b: &T) -> bool { + self(a, b) + } +} + +/// Create a `MergeBy` iterator. +pub fn merge_by_new(a: I, b: J, cmp: F) -> MergeBy + where I: IntoIterator, + J: IntoIterator, + F: MergePredicate, +{ + MergeBy { + a: a.into_iter().peekable(), + b: b.into_iter().peekable(), + fused: None, + cmp, + } +} + +impl Clone for MergeBy + where I: Iterator, + J: Iterator, + Peekable: Clone, + Peekable: Clone, + F: Clone +{ + clone_fields!(a, b, fused, cmp); +} + +impl Iterator for MergeBy + where I: Iterator, + J: Iterator, + F: MergePredicate +{ + type Item = I::Item; + + fn next(&mut self) -> Option { + let less_than = match self.fused { + Some(lt) => lt, + None => match (self.a.peek(), self.b.peek()) { + (Some(a), Some(b)) => self.cmp.merge_pred(a, b), + (Some(_), None) => { + self.fused = Some(true); + true + } + (None, Some(_)) => { + self.fused = Some(false); + false + } + (None, None) => return None, + } + }; + if less_than { + self.a.next() + } else { + self.b.next() + } + } + + fn size_hint(&self) -> (usize, Option) { + // Not ExactSizeIterator because size may be larger than usize + size_hint::add(self.a.size_hint(), self.b.size_hint()) + } +} + +impl FusedIterator for MergeBy + where I: FusedIterator, + J: FusedIterator, + F: MergePredicate +{} + +/// An iterator adaptor that borrows from a `Clone`-able iterator +/// to only pick off elements while the predicate returns `true`. +/// +/// See [`.take_while_ref()`](crate::Itertools::take_while_ref) for more information. +#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] +pub struct TakeWhileRef<'a, I: 'a, F> { + iter: &'a mut I, + f: F, +} + +impl<'a, I, F> fmt::Debug for TakeWhileRef<'a, I, F> + where I: Iterator + fmt::Debug, +{ + debug_fmt_fields!(TakeWhileRef, iter); +} + +/// Create a new `TakeWhileRef` from a reference to clonable iterator. +pub fn take_while_ref(iter: &mut I, f: F) -> TakeWhileRef + where I: Iterator + Clone +{ + TakeWhileRef { iter, f } +} + +impl<'a, I, F> Iterator for TakeWhileRef<'a, I, F> + where I: Iterator + Clone, + F: FnMut(&I::Item) -> bool +{ + type Item = I::Item; + + fn next(&mut self) -> Option { + let old = self.iter.clone(); + match self.iter.next() { + None => None, + Some(elt) => { + if (self.f)(&elt) { + Some(elt) + } else { + *self.iter = old; + None + } + } + } + } + + fn size_hint(&self) -> (usize, Option) { + (0, self.iter.size_hint().1) + } +} + +/// An iterator adaptor that filters `Option` iterator elements +/// and produces `A`. Stops on the first `None` encountered. +/// +/// See [`.while_some()`](crate::Itertools::while_some) for more information. +#[derive(Clone, Debug)] +#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] +pub struct WhileSome { + iter: I, +} + +/// Create a new `WhileSome`. +pub fn while_some(iter: I) -> WhileSome { + WhileSome { iter } +} + +impl Iterator for WhileSome + where I: Iterator> +{ + type Item = A; + + fn next(&mut self) -> Option { + match self.iter.next() { + None | Some(None) => None, + Some(elt) => elt, + } + } + + fn size_hint(&self) -> (usize, Option) { + (0, self.iter.size_hint().1) + } +} + +/// An iterator to iterate through all combinations in a `Clone`-able iterator that produces tuples +/// of a specific size. +/// +/// See [`.tuple_combinations()`](crate::Itertools::tuple_combinations) for more +/// information. +#[derive(Clone, Debug)] +#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] +pub struct TupleCombinations + where I: Iterator, + T: HasCombination +{ + iter: T::Combination, + _mi: PhantomData, +} + +pub trait HasCombination: Sized { + type Combination: From + Iterator; +} + +/// Create a new `TupleCombinations` from a clonable iterator. +pub fn tuple_combinations(iter: I) -> TupleCombinations + where I: Iterator + Clone, + I::Item: Clone, + T: HasCombination, +{ + TupleCombinations { + iter: T::Combination::from(iter), + _mi: PhantomData, + } +} + +impl Iterator for TupleCombinations + where I: Iterator, + T: HasCombination, +{ + type Item = T; + + fn next(&mut self) -> Option { + self.iter.next() + } +} + +impl FusedIterator for TupleCombinations + where I: FusedIterator, + T: HasCombination, +{} + +#[derive(Clone, Debug)] +pub struct Tuple1Combination { + iter: I, +} + +impl From for Tuple1Combination { + fn from(iter: I) -> Self { + Tuple1Combination { iter } + } +} + +impl Iterator for Tuple1Combination { + type Item = (I::Item,); + + fn next(&mut self) -> Option { + self.iter.next().map(|x| (x,)) + } +} + +impl HasCombination for (I::Item,) { + type Combination = Tuple1Combination; +} + +macro_rules! impl_tuple_combination { + ($C:ident $P:ident ; $($X:ident)*) => ( + #[derive(Clone, Debug)] + pub struct $C { + item: Option, + iter: I, + c: $P, + } + + impl From for $C { + fn from(mut iter: I) -> Self { + Self { + item: iter.next(), + iter: iter.clone(), + c: iter.into(), + } + } + } + + impl From for $C> { + fn from(iter: I) -> Self { + Self::from(iter.fuse()) + } + } + + impl Iterator for $C + where I: Iterator + Clone, + I::Item: Clone + { + type Item = (A, $(ignore_ident!($X, A)),*); + + fn next(&mut self) -> Option { + if let Some(($($X),*,)) = self.c.next() { + let z = self.item.clone().unwrap(); + Some((z, $($X),*)) + } else { + self.item = self.iter.next(); + self.item.clone().and_then(|z| { + self.c = self.iter.clone().into(); + self.c.next().map(|($($X),*,)| (z, $($X),*)) + }) + } + } + } + + impl HasCombination for (A, $(ignore_ident!($X, A)),*) + where I: Iterator + Clone, + I::Item: Clone + { + type Combination = $C>; + } + ) +} + +// This snippet generates the twelve `impl_tuple_combination!` invocations: +// use core::iter; +// use itertools::Itertools; +// +// for i in 2..=12 { +// println!("impl_tuple_combination!(Tuple{arity}Combination Tuple{prev}Combination; {idents});", +// arity = i, +// prev = i - 1, +// idents = ('a'..'z').take(i - 1).join(" "), +// ); +// } +// It could probably be replaced by a bit more macro cleverness. +impl_tuple_combination!(Tuple2Combination Tuple1Combination; a); +impl_tuple_combination!(Tuple3Combination Tuple2Combination; a b); +impl_tuple_combination!(Tuple4Combination Tuple3Combination; a b c); +impl_tuple_combination!(Tuple5Combination Tuple4Combination; a b c d); +impl_tuple_combination!(Tuple6Combination Tuple5Combination; a b c d e); +impl_tuple_combination!(Tuple7Combination Tuple6Combination; a b c d e f); +impl_tuple_combination!(Tuple8Combination Tuple7Combination; a b c d e f g); +impl_tuple_combination!(Tuple9Combination Tuple8Combination; a b c d e f g h); +impl_tuple_combination!(Tuple10Combination Tuple9Combination; a b c d e f g h i); +impl_tuple_combination!(Tuple11Combination Tuple10Combination; a b c d e f g h i j); +impl_tuple_combination!(Tuple12Combination Tuple11Combination; a b c d e f g h i j k); + +/// An iterator adapter to filter values within a nested `Result::Ok`. +/// +/// See [`.filter_ok()`](crate::Itertools::filter_ok) for more information. +#[derive(Clone)] +#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] +pub struct FilterOk { + iter: I, + f: F +} + +impl fmt::Debug for FilterOk +where + I: fmt::Debug, +{ + debug_fmt_fields!(FilterOk, iter); +} + +/// Create a new `FilterOk` iterator. +pub fn filter_ok(iter: I, f: F) -> FilterOk + where I: Iterator>, + F: FnMut(&T) -> bool, +{ + FilterOk { + iter, + f, + } +} + +impl Iterator for FilterOk + where I: Iterator>, + F: FnMut(&T) -> bool, +{ + type Item = Result; + + fn next(&mut self) -> Option { + loop { + match self.iter.next() { + Some(Ok(v)) => { + if (self.f)(&v) { + return Some(Ok(v)); + } + }, + Some(Err(e)) => return Some(Err(e)), + None => return None, + } + } + } + + fn size_hint(&self) -> (usize, Option) { + (0, self.iter.size_hint().1) + } + + fn fold(self, init: Acc, fold_f: Fold) -> Acc + where Fold: FnMut(Acc, Self::Item) -> Acc, + { + let mut f = self.f; + self.iter.filter(|v| { + v.as_ref().map(&mut f).unwrap_or(true) + }).fold(init, fold_f) + } + + fn collect(self) -> C + where C: FromIterator + { + let mut f = self.f; + self.iter.filter(|v| { + v.as_ref().map(&mut f).unwrap_or(true) + }).collect() + } +} + +impl FusedIterator for FilterOk + where I: FusedIterator>, + F: FnMut(&T) -> bool, +{} + +/// An iterator adapter to filter and apply a transformation on values within a nested `Result::Ok`. +/// +/// See [`.filter_map_ok()`](crate::Itertools::filter_map_ok) for more information. +#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] +pub struct FilterMapOk { + iter: I, + f: F +} + +impl fmt::Debug for FilterMapOk +where + I: fmt::Debug, +{ + debug_fmt_fields!(FilterMapOk, iter); +} + +fn transpose_result(result: Result, E>) -> Option> { + match result { + Ok(Some(v)) => Some(Ok(v)), + Ok(None) => None, + Err(e) => Some(Err(e)), + } +} + +/// Create a new `FilterOk` iterator. +pub fn filter_map_ok(iter: I, f: F) -> FilterMapOk + where I: Iterator>, + F: FnMut(T) -> Option, +{ + FilterMapOk { + iter, + f, + } +} + +impl Iterator for FilterMapOk + where I: Iterator>, + F: FnMut(T) -> Option, +{ + type Item = Result; + + fn next(&mut self) -> Option { + loop { + match self.iter.next() { + Some(Ok(v)) => { + if let Some(v) = (self.f)(v) { + return Some(Ok(v)); + } + }, + Some(Err(e)) => return Some(Err(e)), + None => return None, + } + } + } + + fn size_hint(&self) -> (usize, Option) { + (0, self.iter.size_hint().1) + } + + fn fold(self, init: Acc, fold_f: Fold) -> Acc + where Fold: FnMut(Acc, Self::Item) -> Acc, + { + let mut f = self.f; + self.iter.filter_map(|v| { + transpose_result(v.map(&mut f)) + }).fold(init, fold_f) + } + + fn collect(self) -> C + where C: FromIterator + { + let mut f = self.f; + self.iter.filter_map(|v| { + transpose_result(v.map(&mut f)) + }).collect() + } +} + +impl FusedIterator for FilterMapOk + where I: FusedIterator>, + F: FnMut(T) -> Option, +{} + +/// An iterator adapter to get the positions of each element that matches a predicate. +/// +/// See [`.positions()`](crate::Itertools::positions) for more information. +#[derive(Clone)] +#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] +pub struct Positions { + iter: I, + f: F, + count: usize, +} + +impl fmt::Debug for Positions +where + I: fmt::Debug, +{ + debug_fmt_fields!(Positions, iter, count); +} + +/// Create a new `Positions` iterator. +pub fn positions(iter: I, f: F) -> Positions + where I: Iterator, + F: FnMut(I::Item) -> bool, +{ + Positions { + iter, + f, + count: 0 + } +} + +impl Iterator for Positions + where I: Iterator, + F: FnMut(I::Item) -> bool, +{ + type Item = usize; + + fn next(&mut self) -> Option { + while let Some(v) = self.iter.next() { + let i = self.count; + self.count = i + 1; + if (self.f)(v) { + return Some(i); + } + } + None + } + + fn size_hint(&self) -> (usize, Option) { + (0, self.iter.size_hint().1) + } +} + +impl DoubleEndedIterator for Positions + where I: DoubleEndedIterator + ExactSizeIterator, + F: FnMut(I::Item) -> bool, +{ + fn next_back(&mut self) -> Option { + while let Some(v) = self.iter.next_back() { + if (self.f)(v) { + return Some(self.count + self.iter.len()) + } + } + None + } +} + +impl FusedIterator for Positions + where I: FusedIterator, + F: FnMut(I::Item) -> bool, +{} + +/// An iterator adapter to apply a mutating function to each element before yielding it. +/// +/// See [`.update()`](crate::Itertools::update) for more information. +#[derive(Clone)] +#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] +pub struct Update { + iter: I, + f: F, +} + +impl fmt::Debug for Update +where + I: fmt::Debug, +{ + debug_fmt_fields!(Update, iter); +} + +/// Create a new `Update` iterator. +pub fn update(iter: I, f: F) -> Update +where + I: Iterator, + F: FnMut(&mut I::Item), +{ + Update { iter, f } +} + +impl Iterator for Update +where + I: Iterator, + F: FnMut(&mut I::Item), +{ + type Item = I::Item; + + fn next(&mut self) -> Option { + if let Some(mut v) = self.iter.next() { + (self.f)(&mut v); + Some(v) + } else { + None + } + } + + fn size_hint(&self) -> (usize, Option) { + self.iter.size_hint() + } + + fn fold(self, init: Acc, mut g: G) -> Acc + where G: FnMut(Acc, Self::Item) -> Acc, + { + let mut f = self.f; + self.iter.fold(init, move |acc, mut v| { f(&mut v); g(acc, v) }) + } + + // if possible, re-use inner iterator specializations in collect + fn collect(self) -> C + where C: FromIterator + { + let mut f = self.f; + self.iter.map(move |mut v| { f(&mut v); v }).collect() + } +} + +impl ExactSizeIterator for Update +where + I: ExactSizeIterator, + F: FnMut(&mut I::Item), +{} + +impl DoubleEndedIterator for Update +where + I: DoubleEndedIterator, + F: FnMut(&mut I::Item), +{ + fn next_back(&mut self) -> Option { + if let Some(mut v) = self.iter.next_back() { + (self.f)(&mut v); + Some(v) + } else { + None + } + } +} + +impl FusedIterator for Update +where + I: FusedIterator, + F: FnMut(&mut I::Item), +{} diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/src/adaptors/multi_product.rs temporalio-1.3.0/vendor/itertools-0.10.5/src/adaptors/multi_product.rs --- temporalio-1.3.0/vendor/itertools-0.10.5/src/adaptors/multi_product.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/src/adaptors/multi_product.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,230 @@ +#![cfg(feature = "use_alloc")] + +use crate::size_hint; +use crate::Itertools; + +use alloc::vec::Vec; + +#[derive(Clone)] +/// An iterator adaptor that iterates over the cartesian product of +/// multiple iterators of type `I`. +/// +/// An iterator element type is `Vec`. +/// +/// See [`.multi_cartesian_product()`](crate::Itertools::multi_cartesian_product) +/// for more information. +#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] +pub struct MultiProduct(Vec>) + where I: Iterator + Clone, + I::Item: Clone; + +impl std::fmt::Debug for MultiProduct +where + I: Iterator + Clone + std::fmt::Debug, + I::Item: Clone + std::fmt::Debug, +{ + debug_fmt_fields!(CoalesceBy, 0); +} + +/// Create a new cartesian product iterator over an arbitrary number +/// of iterators of the same type. +/// +/// Iterator element is of type `Vec`. +pub fn multi_cartesian_product(iters: H) -> MultiProduct<::IntoIter> + where H: Iterator, + H::Item: IntoIterator, + ::IntoIter: Clone, + ::Item: Clone +{ + MultiProduct(iters.map(|i| MultiProductIter::new(i.into_iter())).collect()) +} + +#[derive(Clone, Debug)] +/// Holds the state of a single iterator within a `MultiProduct`. +struct MultiProductIter + where I: Iterator + Clone, + I::Item: Clone +{ + cur: Option, + iter: I, + iter_orig: I, +} + +/// Holds the current state during an iteration of a `MultiProduct`. +#[derive(Debug)] +enum MultiProductIterState { + StartOfIter, + MidIter { on_first_iter: bool }, +} + +impl MultiProduct + where I: Iterator + Clone, + I::Item: Clone +{ + /// Iterates the rightmost iterator, then recursively iterates iterators + /// to the left if necessary. + /// + /// Returns true if the iteration succeeded, else false. + fn iterate_last( + multi_iters: &mut [MultiProductIter], + mut state: MultiProductIterState + ) -> bool { + use self::MultiProductIterState::*; + + if let Some((last, rest)) = multi_iters.split_last_mut() { + let on_first_iter = match state { + StartOfIter => { + let on_first_iter = !last.in_progress(); + state = MidIter { on_first_iter }; + on_first_iter + }, + MidIter { on_first_iter } => on_first_iter + }; + + if !on_first_iter { + last.iterate(); + } + + if last.in_progress() { + true + } else if MultiProduct::iterate_last(rest, state) { + last.reset(); + last.iterate(); + // If iterator is None twice consecutively, then iterator is + // empty; whole product is empty. + last.in_progress() + } else { + false + } + } else { + // Reached end of iterator list. On initialisation, return true. + // At end of iteration (final iterator finishes), finish. + match state { + StartOfIter => false, + MidIter { on_first_iter } => on_first_iter + } + } + } + + /// Returns the unwrapped value of the next iteration. + fn curr_iterator(&self) -> Vec { + self.0.iter().map(|multi_iter| { + multi_iter.cur.clone().unwrap() + }).collect() + } + + /// Returns true if iteration has started and has not yet finished; false + /// otherwise. + fn in_progress(&self) -> bool { + if let Some(last) = self.0.last() { + last.in_progress() + } else { + false + } + } +} + +impl MultiProductIter + where I: Iterator + Clone, + I::Item: Clone +{ + fn new(iter: I) -> Self { + MultiProductIter { + cur: None, + iter: iter.clone(), + iter_orig: iter + } + } + + /// Iterate the managed iterator. + fn iterate(&mut self) { + self.cur = self.iter.next(); + } + + /// Reset the managed iterator. + fn reset(&mut self) { + self.iter = self.iter_orig.clone(); + } + + /// Returns true if the current iterator has been started and has not yet + /// finished; false otherwise. + fn in_progress(&self) -> bool { + self.cur.is_some() + } +} + +impl Iterator for MultiProduct + where I: Iterator + Clone, + I::Item: Clone +{ + type Item = Vec; + + fn next(&mut self) -> Option { + if MultiProduct::iterate_last( + &mut self.0, + MultiProductIterState::StartOfIter + ) { + Some(self.curr_iterator()) + } else { + None + } + } + + fn count(self) -> usize { + if self.0.is_empty() { + return 0; + } + + if !self.in_progress() { + return self.0.into_iter().fold(1, |acc, multi_iter| { + acc * multi_iter.iter.count() + }); + } + + self.0.into_iter().fold( + 0, + |acc, MultiProductIter { iter, iter_orig, cur: _ }| { + let total_count = iter_orig.count(); + let cur_count = iter.count(); + acc * total_count + cur_count + } + ) + } + + fn size_hint(&self) -> (usize, Option) { + // Not ExactSizeIterator because size may be larger than usize + if self.0.is_empty() { + return (0, Some(0)); + } + + if !self.in_progress() { + return self.0.iter().fold((1, Some(1)), |acc, multi_iter| { + size_hint::mul(acc, multi_iter.iter.size_hint()) + }); + } + + self.0.iter().fold( + (0, Some(0)), + |acc, &MultiProductIter { ref iter, ref iter_orig, cur: _ }| { + let cur_size = iter.size_hint(); + let total_size = iter_orig.size_hint(); + size_hint::add(size_hint::mul(acc, total_size), cur_size) + } + ) + } + + fn last(self) -> Option { + let iter_count = self.0.len(); + + let lasts: Self::Item = self.0.into_iter() + .map(|multi_iter| multi_iter.iter.last()) + .while_some() + .collect(); + + if lasts.len() == iter_count { + Some(lasts) + } else { + None + } + } +} diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/src/combinations.rs temporalio-1.3.0/vendor/itertools-0.10.5/src/combinations.rs --- temporalio-1.3.0/vendor/itertools-0.10.5/src/combinations.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/src/combinations.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,128 @@ +use std::fmt; +use std::iter::FusedIterator; + +use super::lazy_buffer::LazyBuffer; +use alloc::vec::Vec; + +/// An iterator to iterate through all the `k`-length combinations in an iterator. +/// +/// See [`.combinations()`](crate::Itertools::combinations) for more information. +#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] +pub struct Combinations { + indices: Vec, + pool: LazyBuffer, + first: bool, +} + +impl Clone for Combinations + where I: Clone + Iterator, + I::Item: Clone, +{ + clone_fields!(indices, pool, first); +} + +impl fmt::Debug for Combinations + where I: Iterator + fmt::Debug, + I::Item: fmt::Debug, +{ + debug_fmt_fields!(Combinations, indices, pool, first); +} + +/// Create a new `Combinations` from a clonable iterator. +pub fn combinations(iter: I, k: usize) -> Combinations + where I: Iterator +{ + let mut pool = LazyBuffer::new(iter); + pool.prefill(k); + + Combinations { + indices: (0..k).collect(), + pool, + first: true, + } +} + +impl Combinations { + /// Returns the length of a combination produced by this iterator. + #[inline] + pub fn k(&self) -> usize { self.indices.len() } + + /// Returns the (current) length of the pool from which combination elements are + /// selected. This value can change between invocations of [`next`](Combinations::next). + #[inline] + pub fn n(&self) -> usize { self.pool.len() } + + /// Returns a reference to the source iterator. + #[inline] + pub(crate) fn src(&self) -> &I { &self.pool.it } + + /// Resets this `Combinations` back to an initial state for combinations of length + /// `k` over the same pool data source. If `k` is larger than the current length + /// of the data pool an attempt is made to prefill the pool so that it holds `k` + /// elements. + pub(crate) fn reset(&mut self, k: usize) { + self.first = true; + + if k < self.indices.len() { + self.indices.truncate(k); + for i in 0..k { + self.indices[i] = i; + } + + } else { + for i in 0..self.indices.len() { + self.indices[i] = i; + } + self.indices.extend(self.indices.len()..k); + self.pool.prefill(k); + } + } +} + +impl Iterator for Combinations + where I: Iterator, + I::Item: Clone +{ + type Item = Vec; + fn next(&mut self) -> Option { + if self.first { + if self.k() > self.n() { + return None; + } + self.first = false; + } else if self.indices.is_empty() { + return None; + } else { + // Scan from the end, looking for an index to increment + let mut i: usize = self.indices.len() - 1; + + // Check if we need to consume more from the iterator + if self.indices[i] == self.pool.len() - 1 { + self.pool.get_next(); // may change pool size + } + + while self.indices[i] == i + self.pool.len() - self.indices.len() { + if i > 0 { + i -= 1; + } else { + // Reached the last combination + return None; + } + } + + // Increment index, and reset the ones to its right + self.indices[i] += 1; + for j in i+1..self.indices.len() { + self.indices[j] = self.indices[j - 1] + 1; + } + } + + // Create result vector based on the indices + Some(self.indices.iter().map(|i| self.pool[*i].clone()).collect()) + } +} + +impl FusedIterator for Combinations + where I: Iterator, + I::Item: Clone +{} diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/src/combinations_with_replacement.rs temporalio-1.3.0/vendor/itertools-0.10.5/src/combinations_with_replacement.rs --- temporalio-1.3.0/vendor/itertools-0.10.5/src/combinations_with_replacement.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/src/combinations_with_replacement.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,109 @@ +use alloc::vec::Vec; +use std::fmt; +use std::iter::FusedIterator; + +use super::lazy_buffer::LazyBuffer; + +/// An iterator to iterate through all the `n`-length combinations in an iterator, with replacement. +/// +/// See [`.combinations_with_replacement()`](crate::Itertools::combinations_with_replacement) +/// for more information. +#[derive(Clone)] +pub struct CombinationsWithReplacement +where + I: Iterator, + I::Item: Clone, +{ + indices: Vec, + pool: LazyBuffer, + first: bool, +} + +impl fmt::Debug for CombinationsWithReplacement +where + I: Iterator + fmt::Debug, + I::Item: fmt::Debug + Clone, +{ + debug_fmt_fields!(Combinations, indices, pool, first); +} + +impl CombinationsWithReplacement +where + I: Iterator, + I::Item: Clone, +{ + /// Map the current mask over the pool to get an output combination + fn current(&self) -> Vec { + self.indices.iter().map(|i| self.pool[*i].clone()).collect() + } +} + +/// Create a new `CombinationsWithReplacement` from a clonable iterator. +pub fn combinations_with_replacement(iter: I, k: usize) -> CombinationsWithReplacement +where + I: Iterator, + I::Item: Clone, +{ + let indices: Vec = alloc::vec![0; k]; + let pool: LazyBuffer = LazyBuffer::new(iter); + + CombinationsWithReplacement { + indices, + pool, + first: true, + } +} + +impl Iterator for CombinationsWithReplacement +where + I: Iterator, + I::Item: Clone, +{ + type Item = Vec; + fn next(&mut self) -> Option { + // If this is the first iteration, return early + if self.first { + // In empty edge cases, stop iterating immediately + return if !(self.indices.is_empty() || self.pool.get_next()) { + None + // Otherwise, yield the initial state + } else { + self.first = false; + Some(self.current()) + }; + } + + // Check if we need to consume more from the iterator + // This will run while we increment our first index digit + self.pool.get_next(); + + // Work out where we need to update our indices + let mut increment: Option<(usize, usize)> = None; + for (i, indices_int) in self.indices.iter().enumerate().rev() { + if *indices_int < self.pool.len()-1 { + increment = Some((i, indices_int + 1)); + break; + } + } + + match increment { + // If we can update the indices further + Some((increment_from, increment_value)) => { + // We need to update the rightmost non-max value + // and all those to the right + for indices_index in increment_from..self.indices.len() { + self.indices[indices_index] = increment_value; + } + Some(self.current()) + } + // Otherwise, we're done + None => None, + } + } +} + +impl FusedIterator for CombinationsWithReplacement +where + I: Iterator, + I::Item: Clone, +{} diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/src/concat_impl.rs temporalio-1.3.0/vendor/itertools-0.10.5/src/concat_impl.rs --- temporalio-1.3.0/vendor/itertools-0.10.5/src/concat_impl.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/src/concat_impl.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,23 @@ +use crate::Itertools; + +/// Combine all an iterator's elements into one element by using [`Extend`]. +/// +/// [`IntoIterator`]-enabled version of [`Itertools::concat`]. +/// +/// This combinator will extend the first item with each of the rest of the +/// items of the iterator. If the iterator is empty, the default value of +/// `I::Item` is returned. +/// +/// ```rust +/// use itertools::concat; +/// +/// let input = vec![vec![1], vec![2, 3], vec![4, 5, 6]]; +/// assert_eq!(concat(input), vec![1, 2, 3, 4, 5, 6]); +/// ``` +pub fn concat(iterable: I) -> I::Item + where I: IntoIterator, + I::Item: Extend<<::Item as IntoIterator>::Item> + IntoIterator + Default +{ + #[allow(deprecated)] //TODO: once msrv hits 1.51. replace `fold1` with `reduce` + iterable.into_iter().fold1(|mut a, b| { a.extend(b); a }).unwrap_or_default() +} diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/src/cons_tuples_impl.rs temporalio-1.3.0/vendor/itertools-0.10.5/src/cons_tuples_impl.rs --- temporalio-1.3.0/vendor/itertools-0.10.5/src/cons_tuples_impl.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/src/cons_tuples_impl.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,64 @@ + +macro_rules! impl_cons_iter( + ($_A:ident, $_B:ident, ) => (); // stop + + ($A:ident, $($B:ident,)*) => ( + impl_cons_iter!($($B,)*); + #[allow(non_snake_case)] + impl Iterator for ConsTuples + where Iter: Iterator, + { + type Item = ($($B,)* X, ); + fn next(&mut self) -> Option { + self.iter.next().map(|(($($B,)*), x)| ($($B,)* x, )) + } + + fn size_hint(&self) -> (usize, Option) { + self.iter.size_hint() + } + fn fold(self, accum: Acc, mut f: Fold) -> Acc + where Fold: FnMut(Acc, Self::Item) -> Acc, + { + self.iter.fold(accum, move |acc, (($($B,)*), x)| f(acc, ($($B,)* x, ))) + } + } + + #[allow(non_snake_case)] + impl DoubleEndedIterator for ConsTuples + where Iter: DoubleEndedIterator, + { + fn next_back(&mut self) -> Option { + self.iter.next().map(|(($($B,)*), x)| ($($B,)* x, )) + } + } + + ); +); + +impl_cons_iter!(A, B, C, D, E, F, G, H, I, J, K, L,); + +/// An iterator that maps an iterator of tuples like +/// `((A, B), C)` to an iterator of `(A, B, C)`. +/// +/// Used by the `iproduct!()` macro. +#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] +#[derive(Debug)] +pub struct ConsTuples + where I: Iterator, +{ + iter: I, +} + +impl Clone for ConsTuples + where I: Clone + Iterator, +{ + clone_fields!(iter); +} + +/// Create an iterator that maps for example iterators of +/// `((A, B), C)` to `(A, B, C)`. +pub fn cons_tuples(iterable: I) -> ConsTuples + where I: IntoIterator +{ + ConsTuples { iter: iterable.into_iter() } +} diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/src/diff.rs temporalio-1.3.0/vendor/itertools-0.10.5/src/diff.rs --- temporalio-1.3.0/vendor/itertools-0.10.5/src/diff.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/src/diff.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,61 @@ +//! "Diff"ing iterators for caching elements to sequential collections without requiring the new +//! elements' iterator to be `Clone`. +//! +//! - [`Diff`] (produced by the [`diff_with`] function) +//! describes the difference between two non-`Clone` iterators `I` and `J` after breaking ASAP from +//! a lock-step comparison. + +use crate::free::put_back; +use crate::structs::PutBack; + +/// A type returned by the [`diff_with`] function. +/// +/// `Diff` represents the way in which the elements yielded by the iterator `I` differ to some +/// iterator `J`. +pub enum Diff + where I: Iterator, + J: Iterator +{ + /// The index of the first non-matching element along with both iterator's remaining elements + /// starting with the first mis-match. + FirstMismatch(usize, PutBack, PutBack), + /// The total number of elements that were in `J` along with the remaining elements of `I`. + Shorter(usize, PutBack), + /// The total number of elements that were in `I` along with the remaining elements of `J`. + Longer(usize, PutBack), +} + +/// Compares every element yielded by both `i` and `j` with the given function in lock-step and +/// returns a [`Diff`] which describes how `j` differs from `i`. +/// +/// If the number of elements yielded by `j` is less than the number of elements yielded by `i`, +/// the number of `j` elements yielded will be returned along with `i`'s remaining elements as +/// `Diff::Shorter`. +/// +/// If the two elements of a step differ, the index of those elements along with the remaining +/// elements of both `i` and `j` are returned as `Diff::FirstMismatch`. +/// +/// If `i` becomes exhausted before `j` becomes exhausted, the number of elements in `i` along with +/// the remaining `j` elements will be returned as `Diff::Longer`. +pub fn diff_with(i: I, j: J, is_equal: F) + -> Option> + where I: IntoIterator, + J: IntoIterator, + F: Fn(&I::Item, &J::Item) -> bool +{ + let mut i = i.into_iter(); + let mut j = j.into_iter(); + let mut idx = 0; + while let Some(i_elem) = i.next() { + match j.next() { + None => return Some(Diff::Shorter(idx, put_back(i).with_value(i_elem))), + Some(j_elem) => if !is_equal(&i_elem, &j_elem) { + let remaining_i = put_back(i).with_value(i_elem); + let remaining_j = put_back(j).with_value(j_elem); + return Some(Diff::FirstMismatch(idx, remaining_i, remaining_j)); + }, + } + idx += 1; + } + j.next().map(|j_elem| Diff::Longer(idx, put_back(j).with_value(j_elem))) +} diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/src/duplicates_impl.rs temporalio-1.3.0/vendor/itertools-0.10.5/src/duplicates_impl.rs --- temporalio-1.3.0/vendor/itertools-0.10.5/src/duplicates_impl.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/src/duplicates_impl.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,216 @@ +use std::hash::Hash; + +mod private { + use std::collections::HashMap; + use std::hash::Hash; + use std::fmt; + + #[derive(Clone)] + #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] + pub struct DuplicatesBy { + pub(crate) iter: I, + pub(crate) meta: Meta, + } + + impl fmt::Debug for DuplicatesBy + where + I: Iterator + fmt::Debug, + V: fmt::Debug + Hash + Eq, + { + debug_fmt_fields!(DuplicatesBy, iter, meta.used); + } + + impl DuplicatesBy { + pub(crate) fn new(iter: I, key_method: F) -> Self { + DuplicatesBy { + iter, + meta: Meta { + used: HashMap::new(), + pending: 0, + key_method, + }, + } + } + } + + #[derive(Clone)] + pub struct Meta { + used: HashMap, + pending: usize, + key_method: F, + } + + impl Meta + where + Key: Eq + Hash, + { + /// Takes an item and returns it back to the caller if it's the second time we see it. + /// Otherwise the item is consumed and None is returned + #[inline(always)] + fn filter(&mut self, item: I) -> Option + where + F: KeyMethod, + { + let kv = self.key_method.make(item); + match self.used.get_mut(kv.key_ref()) { + None => { + self.used.insert(kv.key(), false); + self.pending += 1; + None + } + Some(true) => None, + Some(produced) => { + *produced = true; + self.pending -= 1; + Some(kv.value()) + } + } + } + } + + impl Iterator for DuplicatesBy + where + I: Iterator, + Key: Eq + Hash, + F: KeyMethod, + { + type Item = I::Item; + + fn next(&mut self) -> Option { + let DuplicatesBy { iter, meta } = self; + iter.find_map(|v| meta.filter(v)) + } + + #[inline] + fn size_hint(&self) -> (usize, Option) { + let (_, hi) = self.iter.size_hint(); + let hi = hi.map(|hi| { + if hi <= self.meta.pending { + // fewer or equally many iter-remaining elements than pending elements + // => at most, each iter-remaining element is matched + hi + } else { + // fewer pending elements than iter-remaining elements + // => at most: + // * each pending element is matched + // * the other iter-remaining elements come in pairs + self.meta.pending + (hi - self.meta.pending) / 2 + } + }); + // The lower bound is always 0 since we might only get unique items from now on + (0, hi) + } + } + + impl DoubleEndedIterator for DuplicatesBy + where + I: DoubleEndedIterator, + Key: Eq + Hash, + F: KeyMethod, + { + fn next_back(&mut self) -> Option { + let DuplicatesBy { iter, meta } = self; + iter.rev().find_map(|v| meta.filter(v)) + } + } + + /// A keying method for use with `DuplicatesBy` + pub trait KeyMethod { + type Container: KeyXorValue; + + fn make(&mut self, value: V) -> Self::Container; + } + + /// Apply the identity function to elements before checking them for equality. + #[derive(Debug)] + pub struct ById; + impl KeyMethod for ById { + type Container = JustValue; + + fn make(&mut self, v: V) -> Self::Container { + JustValue(v) + } + } + + /// Apply a user-supplied function to elements before checking them for equality. + pub struct ByFn(pub(crate) F); + impl fmt::Debug for ByFn { + debug_fmt_fields!(ByFn,); + } + impl KeyMethod for ByFn + where + F: FnMut(&V) -> K, + { + type Container = KeyValue; + + fn make(&mut self, v: V) -> Self::Container { + KeyValue((self.0)(&v), v) + } + } + + // Implementors of this trait can hold onto a key and a value but only give access to one of them + // at a time. This allows the key and the value to be the same value internally + pub trait KeyXorValue { + fn key_ref(&self) -> &K; + fn key(self) -> K; + fn value(self) -> V; + } + + #[derive(Debug)] + pub struct KeyValue(K, V); + impl KeyXorValue for KeyValue { + fn key_ref(&self) -> &K { + &self.0 + } + fn key(self) -> K { + self.0 + } + fn value(self) -> V { + self.1 + } + } + + #[derive(Debug)] + pub struct JustValue(V); + impl KeyXorValue for JustValue { + fn key_ref(&self) -> &V { + &self.0 + } + fn key(self) -> V { + self.0 + } + fn value(self) -> V { + self.0 + } + } +} + +/// An iterator adapter to filter for duplicate elements. +/// +/// See [`.duplicates_by()`](crate::Itertools::duplicates_by) for more information. +pub type DuplicatesBy = private::DuplicatesBy>; + +/// Create a new `DuplicatesBy` iterator. +pub fn duplicates_by(iter: I, f: F) -> DuplicatesBy +where + Key: Eq + Hash, + F: FnMut(&I::Item) -> Key, + I: Iterator, +{ + DuplicatesBy::new(iter, private::ByFn(f)) +} + +/// An iterator adapter to filter out duplicate elements. +/// +/// See [`.duplicates()`](crate::Itertools::duplicates) for more information. +pub type Duplicates = private::DuplicatesBy::Item, private::ById>; + +/// Create a new `Duplicates` iterator. +pub fn duplicates(iter: I) -> Duplicates +where + I: Iterator, + I::Item: Eq + Hash, +{ + Duplicates::new(iter, private::ById) +} + diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/src/either_or_both.rs temporalio-1.3.0/vendor/itertools-0.10.5/src/either_or_both.rs --- temporalio-1.3.0/vendor/itertools-0.10.5/src/either_or_both.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/src/either_or_both.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,254 @@ +use crate::EitherOrBoth::*; + +use either::Either; + +/// Value that either holds a single A or B, or both. +#[derive(Clone, PartialEq, Eq, Hash, Debug)] +pub enum EitherOrBoth { + /// Both values are present. + Both(A, B), + /// Only the left value of type `A` is present. + Left(A), + /// Only the right value of type `B` is present. + Right(B), +} + +impl EitherOrBoth { + /// If `Left`, or `Both`, return true, otherwise, return false. + pub fn has_left(&self) -> bool { + self.as_ref().left().is_some() + } + + /// If `Right`, or `Both`, return true, otherwise, return false. + pub fn has_right(&self) -> bool { + self.as_ref().right().is_some() + } + + /// If Left, return true otherwise, return false. + /// Exclusive version of [`has_left`](EitherOrBoth::has_left). + pub fn is_left(&self) -> bool { + match *self { + Left(_) => true, + _ => false, + } + } + + /// If Right, return true otherwise, return false. + /// Exclusive version of [`has_right`](EitherOrBoth::has_right). + pub fn is_right(&self) -> bool { + match *self { + Right(_) => true, + _ => false, + } + } + + /// If Right, return true otherwise, return false. + /// Equivalent to `self.as_ref().both().is_some()`. + pub fn is_both(&self) -> bool { + self.as_ref().both().is_some() + } + + /// If `Left`, or `Both`, return `Some` with the left value, otherwise, return `None`. + pub fn left(self) -> Option { + match self { + Left(left) | Both(left, _) => Some(left), + _ => None, + } + } + + /// If `Right`, or `Both`, return `Some` with the right value, otherwise, return `None`. + pub fn right(self) -> Option { + match self { + Right(right) | Both(_, right) => Some(right), + _ => None, + } + } + + /// If Both, return `Some` tuple containing left and right. + pub fn both(self) -> Option<(A, B)> { + match self { + Both(a, b) => Some((a, b)), + _ => None, + } + } + + /// Converts from `&EitherOrBoth` to `EitherOrBoth<&A, &B>`. + pub fn as_ref(&self) -> EitherOrBoth<&A, &B> { + match *self { + Left(ref left) => Left(left), + Right(ref right) => Right(right), + Both(ref left, ref right) => Both(left, right), + } + } + + /// Converts from `&mut EitherOrBoth` to `EitherOrBoth<&mut A, &mut B>`. + pub fn as_mut(&mut self) -> EitherOrBoth<&mut A, &mut B> { + match *self { + Left(ref mut left) => Left(left), + Right(ref mut right) => Right(right), + Both(ref mut left, ref mut right) => Both(left, right), + } + } + + /// Convert `EitherOrBoth` to `EitherOrBoth`. + pub fn flip(self) -> EitherOrBoth { + match self { + Left(a) => Right(a), + Right(b) => Left(b), + Both(a, b) => Both(b, a), + } + } + + /// Apply the function `f` on the value `a` in `Left(a)` or `Both(a, b)` variants. If it is + /// present rewrapping the result in `self`'s original variant. + pub fn map_left(self, f: F) -> EitherOrBoth + where + F: FnOnce(A) -> M, + { + match self { + Both(a, b) => Both(f(a), b), + Left(a) => Left(f(a)), + Right(b) => Right(b), + } + } + + /// Apply the function `f` on the value `b` in `Right(b)` or `Both(a, b)` variants. + /// If it is present rewrapping the result in `self`'s original variant. + pub fn map_right(self, f: F) -> EitherOrBoth + where + F: FnOnce(B) -> M, + { + match self { + Left(a) => Left(a), + Right(b) => Right(f(b)), + Both(a, b) => Both(a, f(b)), + } + } + + /// Apply the functions `f` and `g` on the value `a` and `b` respectively; + /// found in `Left(a)`, `Right(b)`, or `Both(a, b)` variants. + /// The Result is rewrapped `self`'s original variant. + pub fn map_any(self, f: F, g: G) -> EitherOrBoth + where + F: FnOnce(A) -> L, + G: FnOnce(B) -> R, + { + match self { + Left(a) => Left(f(a)), + Right(b) => Right(g(b)), + Both(a, b) => Both(f(a), g(b)), + } + } + + /// Apply the function `f` on the value `a` in `Left(a)` or `Both(a, _)` variants if it is + /// present. + pub fn left_and_then(self, f: F) -> EitherOrBoth + where + F: FnOnce(A) -> EitherOrBoth, + { + match self { + Left(a) | Both(a, _) => f(a), + Right(b) => Right(b), + } + } + + /// Apply the function `f` on the value `b` + /// in `Right(b)` or `Both(_, b)` variants if it is present. + pub fn right_and_then(self, f: F) -> EitherOrBoth + where + F: FnOnce(B) -> EitherOrBoth, + { + match self { + Left(a) => Left(a), + Right(b) | Both(_, b) => f(b), + } + } + + /// Returns a tuple consisting of the `l` and `r` in `Both(l, r)`, if present. + /// Otherwise, returns the wrapped value for the present element, and the supplied + /// value for the other. The first (`l`) argument is used for a missing `Left` + /// value. The second (`r`) argument is used for a missing `Right` value. + /// + /// Arguments passed to `or` are eagerly evaluated; if you are passing + /// the result of a function call, it is recommended to use [`or_else`], + /// which is lazily evaluated. + /// + /// [`or_else`]: EitherOrBoth::or_else + /// + /// # Examples + /// + /// ``` + /// # use itertools::EitherOrBoth; + /// assert_eq!(EitherOrBoth::Both("tree", 1).or("stone", 5), ("tree", 1)); + /// assert_eq!(EitherOrBoth::Left("tree").or("stone", 5), ("tree", 5)); + /// assert_eq!(EitherOrBoth::Right(1).or("stone", 5), ("stone", 1)); + /// ``` + pub fn or(self, l: A, r: B) -> (A, B) { + match self { + Left(inner_l) => (inner_l, r), + Right(inner_r) => (l, inner_r), + Both(inner_l, inner_r) => (inner_l, inner_r), + } + } + + /// Returns a tuple consisting of the `l` and `r` in `Both(l, r)`, if present. + /// Otherwise, returns the wrapped value for the present element, and the [`default`](Default::default) + /// for the other. + pub fn or_default(self) -> (A, B) + where + A: Default, + B: Default, + { + match self { + EitherOrBoth::Left(l) => (l, B::default()), + EitherOrBoth::Right(r) => (A::default(), r), + EitherOrBoth::Both(l, r) => (l, r), + } + } + + /// Returns a tuple consisting of the `l` and `r` in `Both(l, r)`, if present. + /// Otherwise, returns the wrapped value for the present element, and computes the + /// missing value with the supplied closure. The first argument (`l`) is used for a + /// missing `Left` value. The second argument (`r`) is used for a missing `Right` value. + /// + /// # Examples + /// + /// ``` + /// # use itertools::EitherOrBoth; + /// let k = 10; + /// assert_eq!(EitherOrBoth::Both("tree", 1).or_else(|| "stone", || 2 * k), ("tree", 1)); + /// assert_eq!(EitherOrBoth::Left("tree").or_else(|| "stone", || 2 * k), ("tree", 20)); + /// assert_eq!(EitherOrBoth::Right(1).or_else(|| "stone", || 2 * k), ("stone", 1)); + /// ``` + pub fn or_else A, R: FnOnce() -> B>(self, l: L, r: R) -> (A, B) { + match self { + Left(inner_l) => (inner_l, r()), + Right(inner_r) => (l(), inner_r), + Both(inner_l, inner_r) => (inner_l, inner_r), + } + } +} + +impl EitherOrBoth { + /// Return either value of left, right, or the product of `f` applied where `Both` are present. + pub fn reduce(self, f: F) -> T + where + F: FnOnce(T, T) -> T, + { + match self { + Left(a) => a, + Right(b) => b, + Both(a, b) => f(a, b), + } + } +} + +impl Into>> for EitherOrBoth { + fn into(self) -> Option> { + match self { + EitherOrBoth::Left(l) => Some(Either::Left(l)), + EitherOrBoth::Right(r) => Some(Either::Right(r)), + _ => None, + } + } +} diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/src/exactly_one_err.rs temporalio-1.3.0/vendor/itertools-0.10.5/src/exactly_one_err.rs --- temporalio-1.3.0/vendor/itertools-0.10.5/src/exactly_one_err.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/src/exactly_one_err.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,110 @@ +#[cfg(feature = "use_std")] +use std::error::Error; +use std::fmt::{Debug, Display, Formatter, Result as FmtResult}; + +use std::iter::ExactSizeIterator; + +use either::Either; + +use crate::size_hint; + +/// Iterator returned for the error case of `IterTools::exactly_one()` +/// This iterator yields exactly the same elements as the input iterator. +/// +/// During the execution of `exactly_one` the iterator must be mutated. This wrapper +/// effectively "restores" the state of the input iterator when it's handed back. +/// +/// This is very similar to `PutBackN` except this iterator only supports 0-2 elements and does not +/// use a `Vec`. +#[derive(Clone)] +pub struct ExactlyOneError +where + I: Iterator, +{ + first_two: Option>, + inner: I, +} + +impl ExactlyOneError +where + I: Iterator, +{ + /// Creates a new `ExactlyOneErr` iterator. + pub(crate) fn new(first_two: Option>, inner: I) -> Self { + Self { first_two, inner } + } + + fn additional_len(&self) -> usize { + match self.first_two { + Some(Either::Left(_)) => 2, + Some(Either::Right(_)) => 1, + None => 0, + } + } +} + +impl Iterator for ExactlyOneError +where + I: Iterator, +{ + type Item = I::Item; + + fn next(&mut self) -> Option { + match self.first_two.take() { + Some(Either::Left([first, second])) => { + self.first_two = Some(Either::Right(second)); + Some(first) + }, + Some(Either::Right(second)) => { + Some(second) + } + None => { + self.inner.next() + } + } + } + + fn size_hint(&self) -> (usize, Option) { + size_hint::add_scalar(self.inner.size_hint(), self.additional_len()) + } +} + + +impl ExactSizeIterator for ExactlyOneError where I: ExactSizeIterator {} + +impl Display for ExactlyOneError + where I: Iterator, +{ + fn fmt(&self, f: &mut Formatter) -> FmtResult { + let additional = self.additional_len(); + if additional > 0 { + write!(f, "got at least 2 elements when exactly one was expected") + } else { + write!(f, "got zero elements when exactly one was expected") + } + } +} + +impl Debug for ExactlyOneError + where I: Iterator + Debug, + I::Item: Debug, +{ + fn fmt(&self, f: &mut Formatter) -> FmtResult { + match &self.first_two { + Some(Either::Left([first, second])) => { + write!(f, "ExactlyOneError[First: {:?}, Second: {:?}, RemainingIter: {:?}]", first, second, self.inner) + }, + Some(Either::Right(second)) => { + write!(f, "ExactlyOneError[Second: {:?}, RemainingIter: {:?}]", second, self.inner) + } + None => { + write!(f, "ExactlyOneError[RemainingIter: {:?}]", self.inner) + } + } + } +} + +#[cfg(feature = "use_std")] +impl Error for ExactlyOneError where I: Iterator + Debug, I::Item: Debug, {} + + diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/src/extrema_set.rs temporalio-1.3.0/vendor/itertools-0.10.5/src/extrema_set.rs --- temporalio-1.3.0/vendor/itertools-0.10.5/src/extrema_set.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/src/extrema_set.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,48 @@ +use std::cmp::Ordering; + +/// Implementation guts for `min_set`, `min_set_by`, and `min_set_by_key`. +pub fn min_set_impl( + mut it: I, + mut key_for: F, + mut compare: Compare, +) -> Vec +where + I: Iterator, + F: FnMut(&I::Item) -> K, + Compare: FnMut(&I::Item, &I::Item, &K, &K) -> Ordering, +{ + match it.next() { + None => Vec::new(), + Some(element) => { + let mut current_key = key_for(&element); + let mut result = vec![element]; + it.for_each(|element| { + let key = key_for(&element); + match compare(&element, &result[0], &key, ¤t_key) { + Ordering::Less => { + result.clear(); + result.push(element); + current_key = key; + } + Ordering::Equal => { + result.push(element); + } + Ordering::Greater => {} + } + }); + result + } + } +} + +/// Implementation guts for `ax_set`, `max_set_by`, and `max_set_by_key`. +pub fn max_set_impl(it: I, key_for: F, mut compare: Compare) -> Vec +where + I: Iterator, + F: FnMut(&I::Item) -> K, + Compare: FnMut(&I::Item, &I::Item, &K, &K) -> Ordering, +{ + min_set_impl(it, key_for, |it1, it2, key1, key2| { + compare(it2, it1, key2, key1) + }) +} diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/src/flatten_ok.rs temporalio-1.3.0/vendor/itertools-0.10.5/src/flatten_ok.rs --- temporalio-1.3.0/vendor/itertools-0.10.5/src/flatten_ok.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/src/flatten_ok.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,165 @@ +use crate::size_hint; +use std::{ + fmt, + iter::{DoubleEndedIterator, FusedIterator}, +}; + +pub fn flatten_ok(iter: I) -> FlattenOk +where + I: Iterator>, + T: IntoIterator, +{ + FlattenOk { + iter, + inner_front: None, + inner_back: None, + } +} + +/// An iterator adaptor that flattens `Result::Ok` values and +/// allows `Result::Err` values through unchanged. +/// +/// See [`.flatten_ok()`](crate::Itertools::flatten_ok) for more information. +#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] +pub struct FlattenOk +where + I: Iterator>, + T: IntoIterator, +{ + iter: I, + inner_front: Option, + inner_back: Option, +} + +impl Iterator for FlattenOk +where + I: Iterator>, + T: IntoIterator, +{ + type Item = Result; + + fn next(&mut self) -> Option { + loop { + // Handle the front inner iterator. + if let Some(inner) = &mut self.inner_front { + if let Some(item) = inner.next() { + return Some(Ok(item)); + } + + // This is necessary for the iterator to implement `FusedIterator` + // with only the original iterator being fused. + self.inner_front = None; + } + + match self.iter.next() { + Some(Ok(ok)) => self.inner_front = Some(ok.into_iter()), + Some(Err(e)) => return Some(Err(e)), + None => { + // Handle the back inner iterator. + if let Some(inner) = &mut self.inner_back { + if let Some(item) = inner.next() { + return Some(Ok(item)); + } + + // This is necessary for the iterator to implement `FusedIterator` + // with only the original iterator being fused. + self.inner_back = None; + } else { + return None; + } + } + } + } + } + + fn size_hint(&self) -> (usize, Option) { + let inner_hint = |inner: &Option| { + inner + .as_ref() + .map(Iterator::size_hint) + .unwrap_or((0, Some(0))) + }; + let inner_front = inner_hint(&self.inner_front); + let inner_back = inner_hint(&self.inner_back); + // The outer iterator `Ok` case could be (0, None) as we don't know its size_hint yet. + let outer = match self.iter.size_hint() { + (0, Some(0)) => (0, Some(0)), + _ => (0, None), + }; + + size_hint::add(size_hint::add(inner_front, inner_back), outer) + } +} + +impl DoubleEndedIterator for FlattenOk +where + I: DoubleEndedIterator>, + T: IntoIterator, + T::IntoIter: DoubleEndedIterator, +{ + fn next_back(&mut self) -> Option { + loop { + // Handle the back inner iterator. + if let Some(inner) = &mut self.inner_back { + if let Some(item) = inner.next_back() { + return Some(Ok(item)); + } + + // This is necessary for the iterator to implement `FusedIterator` + // with only the original iterator being fused. + self.inner_back = None; + } + + match self.iter.next_back() { + Some(Ok(ok)) => self.inner_back = Some(ok.into_iter()), + Some(Err(e)) => return Some(Err(e)), + None => { + // Handle the front inner iterator. + if let Some(inner) = &mut self.inner_front { + if let Some(item) = inner.next_back() { + return Some(Ok(item)); + } + + // This is necessary for the iterator to implement `FusedIterator` + // with only the original iterator being fused. + self.inner_front = None; + } else { + return None; + } + } + } + } + } +} + +impl Clone for FlattenOk +where + I: Iterator> + Clone, + T: IntoIterator, + T::IntoIter: Clone, +{ + clone_fields!(iter, inner_front, inner_back); +} + +impl fmt::Debug for FlattenOk +where + I: Iterator> + fmt::Debug, + T: IntoIterator, + T::IntoIter: fmt::Debug, +{ + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_struct("FlattenOk") + .field("iter", &self.iter) + .field("inner_front", &self.inner_front) + .field("inner_back", &self.inner_back) + .finish() + } +} + +/// Only the iterator being flattened needs to implement [`FusedIterator`]. +impl FusedIterator for FlattenOk +where + I: FusedIterator>, + T: IntoIterator, +{ +} diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/src/format.rs temporalio-1.3.0/vendor/itertools-0.10.5/src/format.rs --- temporalio-1.3.0/vendor/itertools-0.10.5/src/format.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/src/format.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,113 @@ +use std::fmt; +use std::cell::RefCell; + +/// Format all iterator elements lazily, separated by `sep`. +/// +/// The format value can only be formatted once, after that the iterator is +/// exhausted. +/// +/// See [`.format_with()`](crate::Itertools::format_with) for more information. +#[derive(Clone)] +pub struct FormatWith<'a, I, F> { + sep: &'a str, + /// FormatWith uses interior mutability because Display::fmt takes &self. + inner: RefCell>, +} + +/// Format all iterator elements lazily, separated by `sep`. +/// +/// The format value can only be formatted once, after that the iterator is +/// exhausted. +/// +/// See [`.format()`](crate::Itertools::format) +/// for more information. +#[derive(Clone)] +pub struct Format<'a, I> { + sep: &'a str, + /// Format uses interior mutability because Display::fmt takes &self. + inner: RefCell>, +} + +pub fn new_format(iter: I, separator: &str, f: F) -> FormatWith<'_, I, F> + where I: Iterator, + F: FnMut(I::Item, &mut dyn FnMut(&dyn fmt::Display) -> fmt::Result) -> fmt::Result +{ + FormatWith { + sep: separator, + inner: RefCell::new(Some((iter, f))), + } +} + +pub fn new_format_default(iter: I, separator: &str) -> Format<'_, I> + where I: Iterator, +{ + Format { + sep: separator, + inner: RefCell::new(Some(iter)), + } +} + +impl<'a, I, F> fmt::Display for FormatWith<'a, I, F> + where I: Iterator, + F: FnMut(I::Item, &mut dyn FnMut(&dyn fmt::Display) -> fmt::Result) -> fmt::Result +{ + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + let (mut iter, mut format) = match self.inner.borrow_mut().take() { + Some(t) => t, + None => panic!("FormatWith: was already formatted once"), + }; + + if let Some(fst) = iter.next() { + format(fst, &mut |disp: &dyn fmt::Display| disp.fmt(f))?; + iter.try_for_each(|elt| { + if !self.sep.is_empty() { + f.write_str(self.sep)?; + } + format(elt, &mut |disp: &dyn fmt::Display| disp.fmt(f)) + })?; + } + Ok(()) + } +} + +impl<'a, I> Format<'a, I> + where I: Iterator, +{ + fn format(&self, f: &mut fmt::Formatter, mut cb: F) -> fmt::Result + where F: FnMut(&I::Item, &mut fmt::Formatter) -> fmt::Result, + { + let mut iter = match self.inner.borrow_mut().take() { + Some(t) => t, + None => panic!("Format: was already formatted once"), + }; + + if let Some(fst) = iter.next() { + cb(&fst, f)?; + iter.try_for_each(|elt| { + if !self.sep.is_empty() { + f.write_str(self.sep)?; + } + cb(&elt, f) + })?; + } + Ok(()) + } +} + +macro_rules! impl_format { + ($($fmt_trait:ident)*) => { + $( + impl<'a, I> fmt::$fmt_trait for Format<'a, I> + where I: Iterator, + I::Item: fmt::$fmt_trait, + { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + self.format(f, fmt::$fmt_trait::fmt) + } + } + )* + } +} + +impl_format!{Display Debug + UpperExp LowerExp UpperHex LowerHex Octal Binary Pointer} diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/src/free.rs temporalio-1.3.0/vendor/itertools-0.10.5/src/free.rs --- temporalio-1.3.0/vendor/itertools-0.10.5/src/free.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/src/free.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,286 @@ +//! Free functions that create iterator adaptors or call iterator methods. +//! +//! The benefit of free functions is that they accept any [`IntoIterator`] as +//! argument, so the resulting code may be easier to read. + +#[cfg(feature = "use_alloc")] +use std::fmt::Display; +use std::iter::{self, Zip}; +#[cfg(feature = "use_alloc")] +type VecIntoIter = alloc::vec::IntoIter; + +#[cfg(feature = "use_alloc")] +use alloc::{ + string::String, +}; + +use crate::Itertools; +use crate::intersperse::{Intersperse, IntersperseWith}; + +pub use crate::adaptors::{ + interleave, + merge, + put_back, +}; +#[cfg(feature = "use_alloc")] +pub use crate::put_back_n_impl::put_back_n; +#[cfg(feature = "use_alloc")] +pub use crate::multipeek_impl::multipeek; +#[cfg(feature = "use_alloc")] +pub use crate::peek_nth::peek_nth; +#[cfg(feature = "use_alloc")] +pub use crate::kmerge_impl::kmerge; +pub use crate::zip_eq_impl::zip_eq; +pub use crate::merge_join::merge_join_by; +#[cfg(feature = "use_alloc")] +pub use crate::rciter_impl::rciter; + +/// Iterate `iterable` with a particular value inserted between each element. +/// +/// [`IntoIterator`] enabled version of [`Iterator::intersperse`]. +/// +/// ``` +/// use itertools::intersperse; +/// +/// itertools::assert_equal(intersperse((0..3), 8), vec![0, 8, 1, 8, 2]); +/// ``` +pub fn intersperse(iterable: I, element: I::Item) -> Intersperse + where I: IntoIterator, + ::Item: Clone +{ + Itertools::intersperse(iterable.into_iter(), element) +} + +/// Iterate `iterable` with a particular value created by a function inserted +/// between each element. +/// +/// [`IntoIterator`] enabled version of [`Iterator::intersperse_with`]. +/// +/// ``` +/// use itertools::intersperse_with; +/// +/// let mut i = 10; +/// itertools::assert_equal(intersperse_with((0..3), || { i -= 1; i }), vec![0, 9, 1, 8, 2]); +/// assert_eq!(i, 8); +/// ``` +pub fn intersperse_with(iterable: I, element: F) -> IntersperseWith + where I: IntoIterator, + F: FnMut() -> I::Item +{ + Itertools::intersperse_with(iterable.into_iter(), element) +} + +/// Iterate `iterable` with a running index. +/// +/// [`IntoIterator`] enabled version of [`Iterator::enumerate`]. +/// +/// ``` +/// use itertools::enumerate; +/// +/// for (i, elt) in enumerate(&[1, 2, 3]) { +/// /* loop body */ +/// } +/// ``` +pub fn enumerate(iterable: I) -> iter::Enumerate + where I: IntoIterator +{ + iterable.into_iter().enumerate() +} + +/// Iterate `iterable` in reverse. +/// +/// [`IntoIterator`] enabled version of [`Iterator::rev`]. +/// +/// ``` +/// use itertools::rev; +/// +/// for elt in rev(&[1, 2, 3]) { +/// /* loop body */ +/// } +/// ``` +pub fn rev(iterable: I) -> iter::Rev + where I: IntoIterator, + I::IntoIter: DoubleEndedIterator +{ + iterable.into_iter().rev() +} + +/// Converts the arguments to iterators and zips them. +/// +/// [`IntoIterator`] enabled version of [`Iterator::zip`]. +/// +/// ## Example +/// +/// ``` +/// use itertools::zip; +/// +/// let mut result: Vec<(i32, char)> = Vec::new(); +/// +/// for (a, b) in zip(&[1, 2, 3, 4, 5], &['a', 'b', 'c']) { +/// result.push((*a, *b)); +/// } +/// assert_eq!(result, vec![(1, 'a'),(2, 'b'),(3, 'c')]); +/// ``` +#[deprecated(note="Use [std::iter::zip](https://doc.rust-lang.org/std/iter/fn.zip.html) instead", since="0.10.4")] +pub fn zip(i: I, j: J) -> Zip + where I: IntoIterator, + J: IntoIterator +{ + i.into_iter().zip(j) +} + + +/// Takes two iterables and creates a new iterator over both in sequence. +/// +/// [`IntoIterator`] enabled version of [`Iterator::chain`]. +/// +/// ## Example +/// ``` +/// use itertools::chain; +/// +/// let mut result:Vec = Vec::new(); +/// +/// for element in chain(&[1, 2, 3], &[4]) { +/// result.push(*element); +/// } +/// assert_eq!(result, vec![1, 2, 3, 4]); +/// ``` +pub fn chain(i: I, j: J) -> iter::Chain<::IntoIter, ::IntoIter> + where I: IntoIterator, + J: IntoIterator +{ + i.into_iter().chain(j) +} + +/// Create an iterator that clones each element from &T to T +/// +/// [`IntoIterator`] enabled version of [`Iterator::cloned`]. +/// +/// ``` +/// use itertools::cloned; +/// +/// assert_eq!(cloned(b"abc").next(), Some(b'a')); +/// ``` +pub fn cloned<'a, I, T: 'a>(iterable: I) -> iter::Cloned + where I: IntoIterator, + T: Clone, +{ + iterable.into_iter().cloned() +} + +/// Perform a fold operation over the iterable. +/// +/// [`IntoIterator`] enabled version of [`Iterator::fold`]. +/// +/// ``` +/// use itertools::fold; +/// +/// assert_eq!(fold(&[1., 2., 3.], 0., |a, &b| f32::max(a, b)), 3.); +/// ``` +pub fn fold(iterable: I, init: B, f: F) -> B + where I: IntoIterator, + F: FnMut(B, I::Item) -> B +{ + iterable.into_iter().fold(init, f) +} + +/// Test whether the predicate holds for all elements in the iterable. +/// +/// [`IntoIterator`] enabled version of [`Iterator::all`]. +/// +/// ``` +/// use itertools::all; +/// +/// assert!(all(&[1, 2, 3], |elt| *elt > 0)); +/// ``` +pub fn all(iterable: I, f: F) -> bool + where I: IntoIterator, + F: FnMut(I::Item) -> bool +{ + iterable.into_iter().all(f) +} + +/// Test whether the predicate holds for any elements in the iterable. +/// +/// [`IntoIterator`] enabled version of [`Iterator::any`]. +/// +/// ``` +/// use itertools::any; +/// +/// assert!(any(&[0, -1, 2], |elt| *elt > 0)); +/// ``` +pub fn any(iterable: I, f: F) -> bool + where I: IntoIterator, + F: FnMut(I::Item) -> bool +{ + iterable.into_iter().any(f) +} + +/// Return the maximum value of the iterable. +/// +/// [`IntoIterator`] enabled version of [`Iterator::max`]. +/// +/// ``` +/// use itertools::max; +/// +/// assert_eq!(max(0..10), Some(9)); +/// ``` +pub fn max(iterable: I) -> Option + where I: IntoIterator, + I::Item: Ord +{ + iterable.into_iter().max() +} + +/// Return the minimum value of the iterable. +/// +/// [`IntoIterator`] enabled version of [`Iterator::min`]. +/// +/// ``` +/// use itertools::min; +/// +/// assert_eq!(min(0..10), Some(0)); +/// ``` +pub fn min(iterable: I) -> Option + where I: IntoIterator, + I::Item: Ord +{ + iterable.into_iter().min() +} + + +/// Combine all iterator elements into one String, separated by `sep`. +/// +/// [`IntoIterator`] enabled version of [`Itertools::join`]. +/// +/// ``` +/// use itertools::join; +/// +/// assert_eq!(join(&[1, 2, 3], ", "), "1, 2, 3"); +/// ``` +#[cfg(feature = "use_alloc")] +pub fn join(iterable: I, sep: &str) -> String + where I: IntoIterator, + I::Item: Display +{ + iterable.into_iter().join(sep) +} + +/// Sort all iterator elements into a new iterator in ascending order. +/// +/// [`IntoIterator`] enabled version of [`Itertools::sorted`]. +/// +/// ``` +/// use itertools::sorted; +/// use itertools::assert_equal; +/// +/// assert_equal(sorted("rust".chars()), "rstu".chars()); +/// ``` +#[cfg(feature = "use_alloc")] +pub fn sorted(iterable: I) -> VecIntoIter + where I: IntoIterator, + I::Item: Ord +{ + iterable.into_iter().sorted() +} + diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/src/groupbylazy.rs temporalio-1.3.0/vendor/itertools-0.10.5/src/groupbylazy.rs --- temporalio-1.3.0/vendor/itertools-0.10.5/src/groupbylazy.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/src/groupbylazy.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,571 @@ +use std::cell::{Cell, RefCell}; +use alloc::vec::{self, Vec}; + +/// A trait to unify `FnMut` for `GroupBy` with the chunk key in `IntoChunks` +trait KeyFunction { + type Key; + fn call_mut(&mut self, arg: A) -> Self::Key; +} + +impl KeyFunction for F + where F: FnMut(A) -> K +{ + type Key = K; + #[inline] + fn call_mut(&mut self, arg: A) -> Self::Key { + (*self)(arg) + } +} + + +/// `ChunkIndex` acts like the grouping key function for `IntoChunks` +#[derive(Debug)] +struct ChunkIndex { + size: usize, + index: usize, + key: usize, +} + +impl ChunkIndex { + #[inline(always)] + fn new(size: usize) -> Self { + ChunkIndex { + size, + index: 0, + key: 0, + } + } +} + +impl KeyFunction for ChunkIndex { + type Key = usize; + #[inline(always)] + fn call_mut(&mut self, _arg: A) -> Self::Key { + if self.index == self.size { + self.key += 1; + self.index = 0; + } + self.index += 1; + self.key + } +} + + +struct GroupInner + where I: Iterator +{ + key: F, + iter: I, + current_key: Option, + current_elt: Option, + /// flag set if iterator is exhausted + done: bool, + /// Index of group we are currently buffering or visiting + top_group: usize, + /// Least index for which we still have elements buffered + oldest_buffered_group: usize, + /// Group index for `buffer[0]` -- the slots + /// bottom_group..oldest_buffered_group are unused and will be erased when + /// that range is large enough. + bottom_group: usize, + /// Buffered groups, from `bottom_group` (index 0) to `top_group`. + buffer: Vec>, + /// index of last group iter that was dropped, usize::MAX == none + dropped_group: usize, +} + +impl GroupInner + where I: Iterator, + F: for<'a> KeyFunction<&'a I::Item, Key=K>, + K: PartialEq, +{ + /// `client`: Index of group that requests next element + #[inline(always)] + fn step(&mut self, client: usize) -> Option { + /* + println!("client={}, bottom_group={}, oldest_buffered_group={}, top_group={}, buffers=[{}]", + client, self.bottom_group, self.oldest_buffered_group, + self.top_group, + self.buffer.iter().map(|elt| elt.len()).format(", ")); + */ + if client < self.oldest_buffered_group { + None + } else if client < self.top_group || + (client == self.top_group && + self.buffer.len() > self.top_group - self.bottom_group) + { + self.lookup_buffer(client) + } else if self.done { + None + } else if self.top_group == client { + self.step_current() + } else { + self.step_buffering(client) + } + } + + #[inline(never)] + fn lookup_buffer(&mut self, client: usize) -> Option { + // if `bufidx` doesn't exist in self.buffer, it might be empty + let bufidx = client - self.bottom_group; + if client < self.oldest_buffered_group { + return None; + } + let elt = self.buffer.get_mut(bufidx).and_then(|queue| queue.next()); + if elt.is_none() && client == self.oldest_buffered_group { + // FIXME: VecDeque is unfortunately not zero allocation when empty, + // so we do this job manually. + // `bottom_group..oldest_buffered_group` is unused, and if it's large enough, erase it. + self.oldest_buffered_group += 1; + // skip forward further empty queues too + while self.buffer.get(self.oldest_buffered_group - self.bottom_group) + .map_or(false, |buf| buf.len() == 0) + { + self.oldest_buffered_group += 1; + } + + let nclear = self.oldest_buffered_group - self.bottom_group; + if nclear > 0 && nclear >= self.buffer.len() / 2 { + let mut i = 0; + self.buffer.retain(|buf| { + i += 1; + debug_assert!(buf.len() == 0 || i > nclear); + i > nclear + }); + self.bottom_group = self.oldest_buffered_group; + } + } + elt + } + + /// Take the next element from the iterator, and set the done + /// flag if exhausted. Must not be called after done. + #[inline(always)] + fn next_element(&mut self) -> Option { + debug_assert!(!self.done); + match self.iter.next() { + None => { self.done = true; None } + otherwise => otherwise, + } + } + + + #[inline(never)] + fn step_buffering(&mut self, client: usize) -> Option { + // requested a later group -- walk through the current group up to + // the requested group index, and buffer the elements (unless + // the group is marked as dropped). + // Because the `Groups` iterator is always the first to request + // each group index, client is the next index efter top_group. + debug_assert!(self.top_group + 1 == client); + let mut group = Vec::new(); + + if let Some(elt) = self.current_elt.take() { + if self.top_group != self.dropped_group { + group.push(elt); + } + } + let mut first_elt = None; // first element of the next group + + while let Some(elt) = self.next_element() { + let key = self.key.call_mut(&elt); + match self.current_key.take() { + None => {} + Some(old_key) => if old_key != key { + self.current_key = Some(key); + first_elt = Some(elt); + break; + }, + } + self.current_key = Some(key); + if self.top_group != self.dropped_group { + group.push(elt); + } + } + + if self.top_group != self.dropped_group { + self.push_next_group(group); + } + if first_elt.is_some() { + self.top_group += 1; + debug_assert!(self.top_group == client); + } + first_elt + } + + fn push_next_group(&mut self, group: Vec) { + // When we add a new buffered group, fill up slots between oldest_buffered_group and top_group + while self.top_group - self.bottom_group > self.buffer.len() { + if self.buffer.is_empty() { + self.bottom_group += 1; + self.oldest_buffered_group += 1; + } else { + self.buffer.push(Vec::new().into_iter()); + } + } + self.buffer.push(group.into_iter()); + debug_assert!(self.top_group + 1 - self.bottom_group == self.buffer.len()); + } + + /// This is the immediate case, where we use no buffering + #[inline] + fn step_current(&mut self) -> Option { + debug_assert!(!self.done); + if let elt @ Some(..) = self.current_elt.take() { + return elt; + } + match self.next_element() { + None => None, + Some(elt) => { + let key = self.key.call_mut(&elt); + match self.current_key.take() { + None => {} + Some(old_key) => if old_key != key { + self.current_key = Some(key); + self.current_elt = Some(elt); + self.top_group += 1; + return None; + }, + } + self.current_key = Some(key); + Some(elt) + } + } + } + + /// Request the just started groups' key. + /// + /// `client`: Index of group + /// + /// **Panics** if no group key is available. + fn group_key(&mut self, client: usize) -> K { + // This can only be called after we have just returned the first + // element of a group. + // Perform this by simply buffering one more element, grabbing the + // next key. + debug_assert!(!self.done); + debug_assert!(client == self.top_group); + debug_assert!(self.current_key.is_some()); + debug_assert!(self.current_elt.is_none()); + let old_key = self.current_key.take().unwrap(); + if let Some(elt) = self.next_element() { + let key = self.key.call_mut(&elt); + if old_key != key { + self.top_group += 1; + } + self.current_key = Some(key); + self.current_elt = Some(elt); + } + old_key + } +} + +impl GroupInner + where I: Iterator, +{ + /// Called when a group is dropped + fn drop_group(&mut self, client: usize) { + // It's only useful to track the maximal index + if self.dropped_group == !0 || client > self.dropped_group { + self.dropped_group = client; + } + } +} + +/// `GroupBy` is the storage for the lazy grouping operation. +/// +/// If the groups are consumed in their original order, or if each +/// group is dropped without keeping it around, then `GroupBy` uses +/// no allocations. It needs allocations only if several group iterators +/// are alive at the same time. +/// +/// This type implements [`IntoIterator`] (it is **not** an iterator +/// itself), because the group iterators need to borrow from this +/// value. It should be stored in a local variable or temporary and +/// iterated. +/// +/// See [`.group_by()`](crate::Itertools::group_by) for more information. +#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] +pub struct GroupBy + where I: Iterator, +{ + inner: RefCell>, + // the group iterator's current index. Keep this in the main value + // so that simultaneous iterators all use the same state. + index: Cell, +} + +/// Create a new +pub fn new(iter: J, f: F) -> GroupBy + where J: IntoIterator, + F: FnMut(&J::Item) -> K, +{ + GroupBy { + inner: RefCell::new(GroupInner { + key: f, + iter: iter.into_iter(), + current_key: None, + current_elt: None, + done: false, + top_group: 0, + oldest_buffered_group: 0, + bottom_group: 0, + buffer: Vec::new(), + dropped_group: !0, + }), + index: Cell::new(0), + } +} + +impl GroupBy + where I: Iterator, +{ + /// `client`: Index of group that requests next element + fn step(&self, client: usize) -> Option + where F: FnMut(&I::Item) -> K, + K: PartialEq, + { + self.inner.borrow_mut().step(client) + } + + /// `client`: Index of group + fn drop_group(&self, client: usize) { + self.inner.borrow_mut().drop_group(client); + } +} + +impl<'a, K, I, F> IntoIterator for &'a GroupBy + where I: Iterator, + I::Item: 'a, + F: FnMut(&I::Item) -> K, + K: PartialEq +{ + type Item = (K, Group<'a, K, I, F>); + type IntoIter = Groups<'a, K, I, F>; + + fn into_iter(self) -> Self::IntoIter { + Groups { parent: self } + } +} + + +/// An iterator that yields the Group iterators. +/// +/// Iterator element type is `(K, Group)`: +/// the group's key `K` and the group's iterator. +/// +/// See [`.group_by()`](crate::Itertools::group_by) for more information. +#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] +pub struct Groups<'a, K: 'a, I: 'a, F: 'a> + where I: Iterator, + I::Item: 'a +{ + parent: &'a GroupBy, +} + +impl<'a, K, I, F> Iterator for Groups<'a, K, I, F> + where I: Iterator, + I::Item: 'a, + F: FnMut(&I::Item) -> K, + K: PartialEq +{ + type Item = (K, Group<'a, K, I, F>); + + #[inline] + fn next(&mut self) -> Option { + let index = self.parent.index.get(); + self.parent.index.set(index + 1); + let inner = &mut *self.parent.inner.borrow_mut(); + inner.step(index).map(|elt| { + let key = inner.group_key(index); + (key, Group { + parent: self.parent, + index, + first: Some(elt), + }) + }) + } +} + +/// An iterator for the elements in a single group. +/// +/// Iterator element type is `I::Item`. +pub struct Group<'a, K: 'a, I: 'a, F: 'a> + where I: Iterator, + I::Item: 'a, +{ + parent: &'a GroupBy, + index: usize, + first: Option, +} + +impl<'a, K, I, F> Drop for Group<'a, K, I, F> + where I: Iterator, + I::Item: 'a, +{ + fn drop(&mut self) { + self.parent.drop_group(self.index); + } +} + +impl<'a, K, I, F> Iterator for Group<'a, K, I, F> + where I: Iterator, + I::Item: 'a, + F: FnMut(&I::Item) -> K, + K: PartialEq, +{ + type Item = I::Item; + #[inline] + fn next(&mut self) -> Option { + if let elt @ Some(..) = self.first.take() { + return elt; + } + self.parent.step(self.index) + } +} + +///// IntoChunks ///// + +/// Create a new +pub fn new_chunks(iter: J, size: usize) -> IntoChunks + where J: IntoIterator, +{ + IntoChunks { + inner: RefCell::new(GroupInner { + key: ChunkIndex::new(size), + iter: iter.into_iter(), + current_key: None, + current_elt: None, + done: false, + top_group: 0, + oldest_buffered_group: 0, + bottom_group: 0, + buffer: Vec::new(), + dropped_group: !0, + }), + index: Cell::new(0), + } +} + + +/// `ChunkLazy` is the storage for a lazy chunking operation. +/// +/// `IntoChunks` behaves just like `GroupBy`: it is iterable, and +/// it only buffers if several chunk iterators are alive at the same time. +/// +/// This type implements [`IntoIterator`] (it is **not** an iterator +/// itself), because the chunk iterators need to borrow from this +/// value. It should be stored in a local variable or temporary and +/// iterated. +/// +/// Iterator element type is `Chunk`, each chunk's iterator. +/// +/// See [`.chunks()`](crate::Itertools::chunks) for more information. +#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] +pub struct IntoChunks + where I: Iterator, +{ + inner: RefCell>, + // the chunk iterator's current index. Keep this in the main value + // so that simultaneous iterators all use the same state. + index: Cell, +} + + +impl IntoChunks + where I: Iterator, +{ + /// `client`: Index of chunk that requests next element + fn step(&self, client: usize) -> Option { + self.inner.borrow_mut().step(client) + } + + /// `client`: Index of chunk + fn drop_group(&self, client: usize) { + self.inner.borrow_mut().drop_group(client); + } +} + +impl<'a, I> IntoIterator for &'a IntoChunks + where I: Iterator, + I::Item: 'a, +{ + type Item = Chunk<'a, I>; + type IntoIter = Chunks<'a, I>; + + fn into_iter(self) -> Self::IntoIter { + Chunks { + parent: self, + } + } +} + + +/// An iterator that yields the Chunk iterators. +/// +/// Iterator element type is `Chunk`. +/// +/// See [`.chunks()`](crate::Itertools::chunks) for more information. +#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] +pub struct Chunks<'a, I: 'a> + where I: Iterator, + I::Item: 'a, +{ + parent: &'a IntoChunks, +} + +impl<'a, I> Iterator for Chunks<'a, I> + where I: Iterator, + I::Item: 'a, +{ + type Item = Chunk<'a, I>; + + #[inline] + fn next(&mut self) -> Option { + let index = self.parent.index.get(); + self.parent.index.set(index + 1); + let inner = &mut *self.parent.inner.borrow_mut(); + inner.step(index).map(|elt| { + Chunk { + parent: self.parent, + index, + first: Some(elt), + } + }) + } +} + +/// An iterator for the elements in a single chunk. +/// +/// Iterator element type is `I::Item`. +pub struct Chunk<'a, I: 'a> + where I: Iterator, + I::Item: 'a, +{ + parent: &'a IntoChunks, + index: usize, + first: Option, +} + +impl<'a, I> Drop for Chunk<'a, I> + where I: Iterator, + I::Item: 'a, +{ + fn drop(&mut self) { + self.parent.drop_group(self.index); + } +} + +impl<'a, I> Iterator for Chunk<'a, I> + where I: Iterator, + I::Item: 'a, +{ + type Item = I::Item; + #[inline] + fn next(&mut self) -> Option { + if let elt @ Some(..) = self.first.take() { + return elt; + } + self.parent.step(self.index) + } +} diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/src/grouping_map.rs temporalio-1.3.0/vendor/itertools-0.10.5/src/grouping_map.rs --- temporalio-1.3.0/vendor/itertools-0.10.5/src/grouping_map.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/src/grouping_map.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,535 @@ +#![cfg(feature = "use_std")] + +use crate::MinMaxResult; +use std::collections::HashMap; +use std::cmp::Ordering; +use std::hash::Hash; +use std::iter::Iterator; +use std::ops::{Add, Mul}; + +/// A wrapper to allow for an easy [`into_grouping_map_by`](crate::Itertools::into_grouping_map_by) +#[derive(Clone, Debug)] +pub struct MapForGrouping(I, F); + +impl MapForGrouping { + pub(crate) fn new(iter: I, key_mapper: F) -> Self { + Self(iter, key_mapper) + } +} + +impl Iterator for MapForGrouping + where I: Iterator, + K: Hash + Eq, + F: FnMut(&V) -> K, +{ + type Item = (K, V); + fn next(&mut self) -> Option { + self.0.next().map(|val| ((self.1)(&val), val)) + } +} + +/// Creates a new `GroupingMap` from `iter` +pub fn new(iter: I) -> GroupingMap + where I: Iterator, + K: Hash + Eq, +{ + GroupingMap { iter } +} + +/// `GroupingMapBy` is an intermediate struct for efficient group-and-fold operations. +/// +/// See [`GroupingMap`] for more informations. +pub type GroupingMapBy = GroupingMap>; + +/// `GroupingMap` is an intermediate struct for efficient group-and-fold operations. +/// It groups elements by their key and at the same time fold each group +/// using some aggregating operation. +/// +/// No method on this struct performs temporary allocations. +#[derive(Clone, Debug)] +#[must_use = "GroupingMap is lazy and do nothing unless consumed"] +pub struct GroupingMap { + iter: I, +} + +impl GroupingMap + where I: Iterator, + K: Hash + Eq, +{ + /// This is the generic way to perform any operation on a `GroupingMap`. + /// It's suggested to use this method only to implement custom operations + /// when the already provided ones are not enough. + /// + /// Groups elements from the `GroupingMap` source by key and applies `operation` to the elements + /// of each group sequentially, passing the previously accumulated value, a reference to the key + /// and the current element as arguments, and stores the results in an `HashMap`. + /// + /// The `operation` function is invoked on each element with the following parameters: + /// - the current value of the accumulator of the group if there is currently one; + /// - a reference to the key of the group this element belongs to; + /// - the element from the source being aggregated; + /// + /// If `operation` returns `Some(element)` then the accumulator is updated with `element`, + /// otherwise the previous accumulation is discarded. + /// + /// Return a `HashMap` associating the key of each group with the result of aggregation of + /// that group's elements. If the aggregation of the last element of a group discards the + /// accumulator then there won't be an entry associated to that group's key. + /// + /// ``` + /// use itertools::Itertools; + /// + /// let data = vec![2, 8, 5, 7, 9, 0, 4, 10]; + /// let lookup = data.into_iter() + /// .into_grouping_map_by(|&n| n % 4) + /// .aggregate(|acc, _key, val| { + /// if val == 0 || val == 10 { + /// None + /// } else { + /// Some(acc.unwrap_or(0) + val) + /// } + /// }); + /// + /// assert_eq!(lookup[&0], 4); // 0 resets the accumulator so only 4 is summed + /// assert_eq!(lookup[&1], 5 + 9); + /// assert_eq!(lookup.get(&2), None); // 10 resets the accumulator and nothing is summed afterward + /// assert_eq!(lookup[&3], 7); + /// assert_eq!(lookup.len(), 3); // The final keys are only 0, 1 and 2 + /// ``` + pub fn aggregate(self, mut operation: FO) -> HashMap + where FO: FnMut(Option, &K, V) -> Option, + { + let mut destination_map = HashMap::new(); + + self.iter.for_each(|(key, val)| { + let acc = destination_map.remove(&key); + if let Some(op_res) = operation(acc, &key, val) { + destination_map.insert(key, op_res); + } + }); + + destination_map + } + + /// Groups elements from the `GroupingMap` source by key and applies `operation` to the elements + /// of each group sequentially, passing the previously accumulated value, a reference to the key + /// and the current element as arguments, and stores the results in a new map. + /// + /// `init` is the value from which will be cloned the initial value of each accumulator. + /// + /// `operation` is a function that is invoked on each element with the following parameters: + /// - the current value of the accumulator of the group; + /// - a reference to the key of the group this element belongs to; + /// - the element from the source being accumulated. + /// + /// Return a `HashMap` associating the key of each group with the result of folding that group's elements. + /// + /// ``` + /// use itertools::Itertools; + /// + /// let lookup = (1..=7) + /// .into_grouping_map_by(|&n| n % 3) + /// .fold(0, |acc, _key, val| acc + val); + /// + /// assert_eq!(lookup[&0], 3 + 6); + /// assert_eq!(lookup[&1], 1 + 4 + 7); + /// assert_eq!(lookup[&2], 2 + 5); + /// assert_eq!(lookup.len(), 3); + /// ``` + pub fn fold(self, init: R, mut operation: FO) -> HashMap + where R: Clone, + FO: FnMut(R, &K, V) -> R, + { + self.aggregate(|acc, key, val| { + let acc = acc.unwrap_or_else(|| init.clone()); + Some(operation(acc, key, val)) + }) + } + + /// Groups elements from the `GroupingMap` source by key and applies `operation` to the elements + /// of each group sequentially, passing the previously accumulated value, a reference to the key + /// and the current element as arguments, and stores the results in a new map. + /// + /// This is similar to [`fold`] but the initial value of the accumulator is the first element of the group. + /// + /// `operation` is a function that is invoked on each element with the following parameters: + /// - the current value of the accumulator of the group; + /// - a reference to the key of the group this element belongs to; + /// - the element from the source being accumulated. + /// + /// Return a `HashMap` associating the key of each group with the result of folding that group's elements. + /// + /// [`fold`]: GroupingMap::fold + /// + /// ``` + /// use itertools::Itertools; + /// + /// let lookup = (1..=7) + /// .into_grouping_map_by(|&n| n % 3) + /// .fold_first(|acc, _key, val| acc + val); + /// + /// assert_eq!(lookup[&0], 3 + 6); + /// assert_eq!(lookup[&1], 1 + 4 + 7); + /// assert_eq!(lookup[&2], 2 + 5); + /// assert_eq!(lookup.len(), 3); + /// ``` + pub fn fold_first(self, mut operation: FO) -> HashMap + where FO: FnMut(V, &K, V) -> V, + { + self.aggregate(|acc, key, val| { + Some(match acc { + Some(acc) => operation(acc, key, val), + None => val, + }) + }) + } + + /// Groups elements from the `GroupingMap` source by key and collects the elements of each group in + /// an instance of `C`. The iteration order is preserved when inserting elements. + /// + /// Return a `HashMap` associating the key of each group with the collection containing that group's elements. + /// + /// ``` + /// use itertools::Itertools; + /// use std::collections::HashSet; + /// + /// let lookup = vec![0, 1, 2, 3, 4, 5, 6, 2, 3, 6].into_iter() + /// .into_grouping_map_by(|&n| n % 3) + /// .collect::>(); + /// + /// assert_eq!(lookup[&0], vec![0, 3, 6].into_iter().collect::>()); + /// assert_eq!(lookup[&1], vec![1, 4].into_iter().collect::>()); + /// assert_eq!(lookup[&2], vec![2, 5].into_iter().collect::>()); + /// assert_eq!(lookup.len(), 3); + /// ``` + pub fn collect(self) -> HashMap + where C: Default + Extend, + { + let mut destination_map = HashMap::new(); + + self.iter.for_each(|(key, val)| { + destination_map.entry(key).or_insert_with(C::default).extend(Some(val)); + }); + + destination_map + } + + /// Groups elements from the `GroupingMap` source by key and finds the maximum of each group. + /// + /// If several elements are equally maximum, the last element is picked. + /// + /// Returns a `HashMap` associating the key of each group with the maximum of that group's elements. + /// + /// ``` + /// use itertools::Itertools; + /// + /// let lookup = vec![1, 3, 4, 5, 7, 8, 9, 12].into_iter() + /// .into_grouping_map_by(|&n| n % 3) + /// .max(); + /// + /// assert_eq!(lookup[&0], 12); + /// assert_eq!(lookup[&1], 7); + /// assert_eq!(lookup[&2], 8); + /// assert_eq!(lookup.len(), 3); + /// ``` + pub fn max(self) -> HashMap + where V: Ord, + { + self.max_by(|_, v1, v2| V::cmp(v1, v2)) + } + + /// Groups elements from the `GroupingMap` source by key and finds the maximum of each group + /// with respect to the specified comparison function. + /// + /// If several elements are equally maximum, the last element is picked. + /// + /// Returns a `HashMap` associating the key of each group with the maximum of that group's elements. + /// + /// ``` + /// use itertools::Itertools; + /// + /// let lookup = vec![1, 3, 4, 5, 7, 8, 9, 12].into_iter() + /// .into_grouping_map_by(|&n| n % 3) + /// .max_by(|_key, x, y| y.cmp(x)); + /// + /// assert_eq!(lookup[&0], 3); + /// assert_eq!(lookup[&1], 1); + /// assert_eq!(lookup[&2], 5); + /// assert_eq!(lookup.len(), 3); + /// ``` + pub fn max_by(self, mut compare: F) -> HashMap + where F: FnMut(&K, &V, &V) -> Ordering, + { + self.fold_first(|acc, key, val| match compare(key, &acc, &val) { + Ordering::Less | Ordering::Equal => val, + Ordering::Greater => acc + }) + } + + /// Groups elements from the `GroupingMap` source by key and finds the element of each group + /// that gives the maximum from the specified function. + /// + /// If several elements are equally maximum, the last element is picked. + /// + /// Returns a `HashMap` associating the key of each group with the maximum of that group's elements. + /// + /// ``` + /// use itertools::Itertools; + /// + /// let lookup = vec![1, 3, 4, 5, 7, 8, 9, 12].into_iter() + /// .into_grouping_map_by(|&n| n % 3) + /// .max_by_key(|_key, &val| val % 4); + /// + /// assert_eq!(lookup[&0], 3); + /// assert_eq!(lookup[&1], 7); + /// assert_eq!(lookup[&2], 5); + /// assert_eq!(lookup.len(), 3); + /// ``` + pub fn max_by_key(self, mut f: F) -> HashMap + where F: FnMut(&K, &V) -> CK, + CK: Ord, + { + self.max_by(|key, v1, v2| f(key, v1).cmp(&f(key, v2))) + } + + /// Groups elements from the `GroupingMap` source by key and finds the minimum of each group. + /// + /// If several elements are equally minimum, the first element is picked. + /// + /// Returns a `HashMap` associating the key of each group with the minimum of that group's elements. + /// + /// ``` + /// use itertools::Itertools; + /// + /// let lookup = vec![1, 3, 4, 5, 7, 8, 9, 12].into_iter() + /// .into_grouping_map_by(|&n| n % 3) + /// .min(); + /// + /// assert_eq!(lookup[&0], 3); + /// assert_eq!(lookup[&1], 1); + /// assert_eq!(lookup[&2], 5); + /// assert_eq!(lookup.len(), 3); + /// ``` + pub fn min(self) -> HashMap + where V: Ord, + { + self.min_by(|_, v1, v2| V::cmp(v1, v2)) + } + + /// Groups elements from the `GroupingMap` source by key and finds the minimum of each group + /// with respect to the specified comparison function. + /// + /// If several elements are equally minimum, the first element is picked. + /// + /// Returns a `HashMap` associating the key of each group with the minimum of that group's elements. + /// + /// ``` + /// use itertools::Itertools; + /// + /// let lookup = vec![1, 3, 4, 5, 7, 8, 9, 12].into_iter() + /// .into_grouping_map_by(|&n| n % 3) + /// .min_by(|_key, x, y| y.cmp(x)); + /// + /// assert_eq!(lookup[&0], 12); + /// assert_eq!(lookup[&1], 7); + /// assert_eq!(lookup[&2], 8); + /// assert_eq!(lookup.len(), 3); + /// ``` + pub fn min_by(self, mut compare: F) -> HashMap + where F: FnMut(&K, &V, &V) -> Ordering, + { + self.fold_first(|acc, key, val| match compare(key, &acc, &val) { + Ordering::Less | Ordering::Equal => acc, + Ordering::Greater => val + }) + } + + /// Groups elements from the `GroupingMap` source by key and finds the element of each group + /// that gives the minimum from the specified function. + /// + /// If several elements are equally minimum, the first element is picked. + /// + /// Returns a `HashMap` associating the key of each group with the minimum of that group's elements. + /// + /// ``` + /// use itertools::Itertools; + /// + /// let lookup = vec![1, 3, 4, 5, 7, 8, 9, 12].into_iter() + /// .into_grouping_map_by(|&n| n % 3) + /// .min_by_key(|_key, &val| val % 4); + /// + /// assert_eq!(lookup[&0], 12); + /// assert_eq!(lookup[&1], 4); + /// assert_eq!(lookup[&2], 8); + /// assert_eq!(lookup.len(), 3); + /// ``` + pub fn min_by_key(self, mut f: F) -> HashMap + where F: FnMut(&K, &V) -> CK, + CK: Ord, + { + self.min_by(|key, v1, v2| f(key, v1).cmp(&f(key, v2))) + } + + /// Groups elements from the `GroupingMap` source by key and find the maximum and minimum of + /// each group. + /// + /// If several elements are equally maximum, the last element is picked. + /// If several elements are equally minimum, the first element is picked. + /// + /// See [.minmax()](crate::Itertools::minmax) for the non-grouping version. + /// + /// Differences from the non grouping version: + /// - It never produces a `MinMaxResult::NoElements` + /// - It doesn't have any speedup + /// + /// Returns a `HashMap` associating the key of each group with the minimum and maximum of that group's elements. + /// + /// ``` + /// use itertools::Itertools; + /// use itertools::MinMaxResult::{OneElement, MinMax}; + /// + /// let lookup = vec![1, 3, 4, 5, 7, 9, 12].into_iter() + /// .into_grouping_map_by(|&n| n % 3) + /// .minmax(); + /// + /// assert_eq!(lookup[&0], MinMax(3, 12)); + /// assert_eq!(lookup[&1], MinMax(1, 7)); + /// assert_eq!(lookup[&2], OneElement(5)); + /// assert_eq!(lookup.len(), 3); + /// ``` + pub fn minmax(self) -> HashMap> + where V: Ord, + { + self.minmax_by(|_, v1, v2| V::cmp(v1, v2)) + } + + /// Groups elements from the `GroupingMap` source by key and find the maximum and minimum of + /// each group with respect to the specified comparison function. + /// + /// If several elements are equally maximum, the last element is picked. + /// If several elements are equally minimum, the first element is picked. + /// + /// It has the same differences from the non-grouping version as `minmax`. + /// + /// Returns a `HashMap` associating the key of each group with the minimum and maximum of that group's elements. + /// + /// ``` + /// use itertools::Itertools; + /// use itertools::MinMaxResult::{OneElement, MinMax}; + /// + /// let lookup = vec![1, 3, 4, 5, 7, 9, 12].into_iter() + /// .into_grouping_map_by(|&n| n % 3) + /// .minmax_by(|_key, x, y| y.cmp(x)); + /// + /// assert_eq!(lookup[&0], MinMax(12, 3)); + /// assert_eq!(lookup[&1], MinMax(7, 1)); + /// assert_eq!(lookup[&2], OneElement(5)); + /// assert_eq!(lookup.len(), 3); + /// ``` + pub fn minmax_by(self, mut compare: F) -> HashMap> + where F: FnMut(&K, &V, &V) -> Ordering, + { + self.aggregate(|acc, key, val| { + Some(match acc { + Some(MinMaxResult::OneElement(e)) => { + if compare(key, &val, &e) == Ordering::Less { + MinMaxResult::MinMax(val, e) + } else { + MinMaxResult::MinMax(e, val) + } + } + Some(MinMaxResult::MinMax(min, max)) => { + if compare(key, &val, &min) == Ordering::Less { + MinMaxResult::MinMax(val, max) + } else if compare(key, &val, &max) != Ordering::Less { + MinMaxResult::MinMax(min, val) + } else { + MinMaxResult::MinMax(min, max) + } + } + None => MinMaxResult::OneElement(val), + Some(MinMaxResult::NoElements) => unreachable!(), + }) + }) + } + + /// Groups elements from the `GroupingMap` source by key and find the elements of each group + /// that gives the minimum and maximum from the specified function. + /// + /// If several elements are equally maximum, the last element is picked. + /// If several elements are equally minimum, the first element is picked. + /// + /// It has the same differences from the non-grouping version as `minmax`. + /// + /// Returns a `HashMap` associating the key of each group with the minimum and maximum of that group's elements. + /// + /// ``` + /// use itertools::Itertools; + /// use itertools::MinMaxResult::{OneElement, MinMax}; + /// + /// let lookup = vec![1, 3, 4, 5, 7, 9, 12].into_iter() + /// .into_grouping_map_by(|&n| n % 3) + /// .minmax_by_key(|_key, &val| val % 4); + /// + /// assert_eq!(lookup[&0], MinMax(12, 3)); + /// assert_eq!(lookup[&1], MinMax(4, 7)); + /// assert_eq!(lookup[&2], OneElement(5)); + /// assert_eq!(lookup.len(), 3); + /// ``` + pub fn minmax_by_key(self, mut f: F) -> HashMap> + where F: FnMut(&K, &V) -> CK, + CK: Ord, + { + self.minmax_by(|key, v1, v2| f(key, v1).cmp(&f(key, v2))) + } + + /// Groups elements from the `GroupingMap` source by key and sums them. + /// + /// This is just a shorthand for `self.fold_first(|acc, _, val| acc + val)`. + /// It is more limited than `Iterator::sum` since it doesn't use the `Sum` trait. + /// + /// Returns a `HashMap` associating the key of each group with the sum of that group's elements. + /// + /// ``` + /// use itertools::Itertools; + /// + /// let lookup = vec![1, 3, 4, 5, 7, 8, 9, 12].into_iter() + /// .into_grouping_map_by(|&n| n % 3) + /// .sum(); + /// + /// assert_eq!(lookup[&0], 3 + 9 + 12); + /// assert_eq!(lookup[&1], 1 + 4 + 7); + /// assert_eq!(lookup[&2], 5 + 8); + /// assert_eq!(lookup.len(), 3); + /// ``` + pub fn sum(self) -> HashMap + where V: Add + { + self.fold_first(|acc, _, val| acc + val) + } + + /// Groups elements from the `GroupingMap` source by key and multiply them. + /// + /// This is just a shorthand for `self.fold_first(|acc, _, val| acc * val)`. + /// It is more limited than `Iterator::product` since it doesn't use the `Product` trait. + /// + /// Returns a `HashMap` associating the key of each group with the product of that group's elements. + /// + /// ``` + /// use itertools::Itertools; + /// + /// let lookup = vec![1, 3, 4, 5, 7, 8, 9, 12].into_iter() + /// .into_grouping_map_by(|&n| n % 3) + /// .product(); + /// + /// assert_eq!(lookup[&0], 3 * 9 * 12); + /// assert_eq!(lookup[&1], 1 * 4 * 7); + /// assert_eq!(lookup[&2], 5 * 8); + /// assert_eq!(lookup.len(), 3); + /// ``` + pub fn product(self) -> HashMap + where V: Mul, + { + self.fold_first(|acc, _, val| acc * val) + } +} diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/src/group_map.rs temporalio-1.3.0/vendor/itertools-0.10.5/src/group_map.rs --- temporalio-1.3.0/vendor/itertools-0.10.5/src/group_map.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/src/group_map.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,32 @@ +#![cfg(feature = "use_std")] + +use std::collections::HashMap; +use std::hash::Hash; +use std::iter::Iterator; + +/// Return a `HashMap` of keys mapped to a list of their corresponding values. +/// +/// See [`.into_group_map()`](crate::Itertools::into_group_map) +/// for more information. +pub fn into_group_map(iter: I) -> HashMap> + where I: Iterator, + K: Hash + Eq, +{ + let mut lookup = HashMap::new(); + + iter.for_each(|(key, val)| { + lookup.entry(key).or_insert_with(Vec::new).push(val); + }); + + lookup +} + +pub fn into_group_map_by(iter: I, f: impl Fn(&V) -> K) -> HashMap> + where + I: Iterator, + K: Hash + Eq, +{ + into_group_map( + iter.map(|v| (f(&v), v)) + ) +} diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/src/impl_macros.rs temporalio-1.3.0/vendor/itertools-0.10.5/src/impl_macros.rs --- temporalio-1.3.0/vendor/itertools-0.10.5/src/impl_macros.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/src/impl_macros.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,29 @@ +//! +//! Implementation's internal macros + +macro_rules! debug_fmt_fields { + ($tyname:ident, $($($field:tt/*TODO ideally we would accept ident or tuple element here*/).+),*) => { + fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + f.debug_struct(stringify!($tyname)) + $( + .field(stringify!($($field).+), &self.$($field).+) + )* + .finish() + } + } +} + +macro_rules! clone_fields { + ($($field:ident),*) => { + #[inline] // TODO is this sensible? + fn clone(&self) -> Self { + Self { + $($field: self.$field.clone(),)* + } + } + } +} + +macro_rules! ignore_ident{ + ($id:ident, $($t:tt)*) => {$($t)*}; +} diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/src/intersperse.rs temporalio-1.3.0/vendor/itertools-0.10.5/src/intersperse.rs --- temporalio-1.3.0/vendor/itertools-0.10.5/src/intersperse.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/src/intersperse.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,118 @@ +use std::iter::{Fuse, FusedIterator}; +use super::size_hint; + +pub trait IntersperseElement { + fn generate(&mut self) -> Item; +} + +#[derive(Debug, Clone)] +pub struct IntersperseElementSimple(Item); + +impl IntersperseElement for IntersperseElementSimple { + fn generate(&mut self) -> Item { + self.0.clone() + } +} + +/// An iterator adaptor to insert a particular value +/// between each element of the adapted iterator. +/// +/// Iterator element type is `I::Item` +/// +/// This iterator is *fused*. +/// +/// See [`.intersperse()`](crate::Itertools::intersperse) for more information. +pub type Intersperse = IntersperseWith::Item>>; + +/// Create a new Intersperse iterator +pub fn intersperse(iter: I, elt: I::Item) -> Intersperse + where I: Iterator, +{ + intersperse_with(iter, IntersperseElementSimple(elt)) +} + +implItem> IntersperseElement for F { + fn generate(&mut self) -> Item { + self() + } +} + +/// An iterator adaptor to insert a particular value created by a function +/// between each element of the adapted iterator. +/// +/// Iterator element type is `I::Item` +/// +/// This iterator is *fused*. +/// +/// See [`.intersperse_with()`](crate::Itertools::intersperse_with) for more information. +#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] +#[derive(Clone, Debug)] +pub struct IntersperseWith + where I: Iterator, +{ + element: ElemF, + iter: Fuse, + peek: Option, +} + +/// Create a new `IntersperseWith` iterator +pub fn intersperse_with(iter: I, elt: ElemF) -> IntersperseWith + where I: Iterator, +{ + let mut iter = iter.fuse(); + IntersperseWith { + peek: iter.next(), + iter, + element: elt, + } +} + +impl Iterator for IntersperseWith + where I: Iterator, + ElemF: IntersperseElement +{ + type Item = I::Item; + #[inline] + fn next(&mut self) -> Option { + if self.peek.is_some() { + self.peek.take() + } else { + self.peek = self.iter.next(); + if self.peek.is_some() { + Some(self.element.generate()) + } else { + None + } + } + } + + fn size_hint(&self) -> (usize, Option) { + // 2 * SH + { 1 or 0 } + let has_peek = self.peek.is_some() as usize; + let sh = self.iter.size_hint(); + size_hint::add_scalar(size_hint::add(sh, sh), has_peek) + } + + fn fold(mut self, init: B, mut f: F) -> B where + Self: Sized, F: FnMut(B, Self::Item) -> B, + { + let mut accum = init; + + if let Some(x) = self.peek.take() { + accum = f(accum, x); + } + + let element = &mut self.element; + + self.iter.fold(accum, + |accum, x| { + let accum = f(accum, element.generate()); + f(accum, x) + }) + } +} + +impl FusedIterator for IntersperseWith + where I: Iterator, + ElemF: IntersperseElement +{} diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/src/kmerge_impl.rs temporalio-1.3.0/vendor/itertools-0.10.5/src/kmerge_impl.rs --- temporalio-1.3.0/vendor/itertools-0.10.5/src/kmerge_impl.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/src/kmerge_impl.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,227 @@ +use crate::size_hint; +use crate::Itertools; + +use alloc::vec::Vec; +use std::iter::FusedIterator; +use std::mem::replace; +use std::fmt; + +/// Head element and Tail iterator pair +/// +/// `PartialEq`, `Eq`, `PartialOrd` and `Ord` are implemented by comparing sequences based on +/// first items (which are guaranteed to exist). +/// +/// The meanings of `PartialOrd` and `Ord` are reversed so as to turn the heap used in +/// `KMerge` into a min-heap. +#[derive(Debug)] +struct HeadTail + where I: Iterator +{ + head: I::Item, + tail: I, +} + +impl HeadTail + where I: Iterator +{ + /// Constructs a `HeadTail` from an `Iterator`. Returns `None` if the `Iterator` is empty. + fn new(mut it: I) -> Option> { + let head = it.next(); + head.map(|h| { + HeadTail { + head: h, + tail: it, + } + }) + } + + /// Get the next element and update `head`, returning the old head in `Some`. + /// + /// Returns `None` when the tail is exhausted (only `head` then remains). + fn next(&mut self) -> Option { + if let Some(next) = self.tail.next() { + Some(replace(&mut self.head, next)) + } else { + None + } + } + + /// Hints at the size of the sequence, same as the `Iterator` method. + fn size_hint(&self) -> (usize, Option) { + size_hint::add_scalar(self.tail.size_hint(), 1) + } +} + +impl Clone for HeadTail + where I: Iterator + Clone, + I::Item: Clone +{ + clone_fields!(head, tail); +} + +/// Make `data` a heap (min-heap w.r.t the sorting). +fn heapify(data: &mut [T], mut less_than: S) + where S: FnMut(&T, &T) -> bool +{ + for i in (0..data.len() / 2).rev() { + sift_down(data, i, &mut less_than); + } +} + +/// Sift down element at `index` (`heap` is a min-heap wrt the ordering) +fn sift_down(heap: &mut [T], index: usize, mut less_than: S) + where S: FnMut(&T, &T) -> bool +{ + debug_assert!(index <= heap.len()); + let mut pos = index; + let mut child = 2 * pos + 1; + // Require the right child to be present + // This allows to find the index of the smallest child without a branch + // that wouldn't be predicted if present + while child + 1 < heap.len() { + // pick the smaller of the two children + // use arithmetic to avoid an unpredictable branch + child += less_than(&heap[child+1], &heap[child]) as usize; + + // sift down is done if we are already in order + if !less_than(&heap[child], &heap[pos]) { + return; + } + heap.swap(pos, child); + pos = child; + child = 2 * pos + 1; + } + // Check if the last (left) child was an only child + // if it is then it has to be compared with the parent + if child + 1 == heap.len() && less_than(&heap[child], &heap[pos]) { + heap.swap(pos, child); + } +} + +/// An iterator adaptor that merges an abitrary number of base iterators in ascending order. +/// If all base iterators are sorted (ascending), the result is sorted. +/// +/// Iterator element type is `I::Item`. +/// +/// See [`.kmerge()`](crate::Itertools::kmerge) for more information. +pub type KMerge = KMergeBy; + +pub trait KMergePredicate { + fn kmerge_pred(&mut self, a: &T, b: &T) -> bool; +} + +#[derive(Clone, Debug)] +pub struct KMergeByLt; + +impl KMergePredicate for KMergeByLt { + fn kmerge_pred(&mut self, a: &T, b: &T) -> bool { + a < b + } +} + +implbool> KMergePredicate for F { + fn kmerge_pred(&mut self, a: &T, b: &T) -> bool { + self(a, b) + } +} + +/// Create an iterator that merges elements of the contained iterators using +/// the ordering function. +/// +/// [`IntoIterator`] enabled version of [`Itertools::kmerge`]. +/// +/// ``` +/// use itertools::kmerge; +/// +/// for elt in kmerge(vec![vec![0, 2, 4], vec![1, 3, 5], vec![6, 7]]) { +/// /* loop body */ +/// } +/// ``` +pub fn kmerge(iterable: I) -> KMerge<::IntoIter> + where I: IntoIterator, + I::Item: IntoIterator, + <::Item as IntoIterator>::Item: PartialOrd +{ + kmerge_by(iterable, KMergeByLt) +} + +/// An iterator adaptor that merges an abitrary number of base iterators +/// according to an ordering function. +/// +/// Iterator element type is `I::Item`. +/// +/// See [`.kmerge_by()`](crate::Itertools::kmerge_by) for more +/// information. +#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] +pub struct KMergeBy + where I: Iterator, +{ + heap: Vec>, + less_than: F, +} + +impl fmt::Debug for KMergeBy + where I: Iterator + fmt::Debug, + I::Item: fmt::Debug, +{ + debug_fmt_fields!(KMergeBy, heap); +} + +/// Create an iterator that merges elements of the contained iterators. +/// +/// [`IntoIterator`] enabled version of [`Itertools::kmerge_by`]. +pub fn kmerge_by(iterable: I, mut less_than: F) + -> KMergeBy<::IntoIter, F> + where I: IntoIterator, + I::Item: IntoIterator, + F: KMergePredicate<<::Item as IntoIterator>::Item>, +{ + let iter = iterable.into_iter(); + let (lower, _) = iter.size_hint(); + let mut heap: Vec<_> = Vec::with_capacity(lower); + heap.extend(iter.filter_map(|it| HeadTail::new(it.into_iter()))); + heapify(&mut heap, |a, b| less_than.kmerge_pred(&a.head, &b.head)); + KMergeBy { heap, less_than } +} + +impl Clone for KMergeBy + where I: Iterator + Clone, + I::Item: Clone, + F: Clone, +{ + clone_fields!(heap, less_than); +} + +impl Iterator for KMergeBy + where I: Iterator, + F: KMergePredicate +{ + type Item = I::Item; + + fn next(&mut self) -> Option { + if self.heap.is_empty() { + return None; + } + let result = if let Some(next) = self.heap[0].next() { + next + } else { + self.heap.swap_remove(0).head + }; + let less_than = &mut self.less_than; + sift_down(&mut self.heap, 0, |a, b| less_than.kmerge_pred(&a.head, &b.head)); + Some(result) + } + + fn size_hint(&self) -> (usize, Option) { + #[allow(deprecated)] //TODO: once msrv hits 1.51. replace `fold1` with `reduce` + self.heap.iter() + .map(|i| i.size_hint()) + .fold1(size_hint::add) + .unwrap_or((0, Some(0))) + } +} + +impl FusedIterator for KMergeBy + where I: Iterator, + F: KMergePredicate +{} diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/src/k_smallest.rs temporalio-1.3.0/vendor/itertools-0.10.5/src/k_smallest.rs --- temporalio-1.3.0/vendor/itertools-0.10.5/src/k_smallest.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/src/k_smallest.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,20 @@ +use alloc::collections::BinaryHeap; +use core::cmp::Ord; + +pub(crate) fn k_smallest>(mut iter: I, k: usize) -> BinaryHeap { + if k == 0 { return BinaryHeap::new(); } + + let mut heap = iter.by_ref().take(k).collect::>(); + + iter.for_each(|i| { + debug_assert_eq!(heap.len(), k); + // Equivalent to heap.push(min(i, heap.pop())) but more efficient. + // This should be done with a single `.peek_mut().unwrap()` but + // `PeekMut` sifts-down unconditionally on Rust 1.46.0 and prior. + if *heap.peek().unwrap() > i { + *heap.peek_mut().unwrap() = i; + } + }); + + heap +} diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/src/lazy_buffer.rs temporalio-1.3.0/vendor/itertools-0.10.5/src/lazy_buffer.rs --- temporalio-1.3.0/vendor/itertools-0.10.5/src/lazy_buffer.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/src/lazy_buffer.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,63 @@ +use std::ops::Index; +use alloc::vec::Vec; + +#[derive(Debug, Clone)] +pub struct LazyBuffer { + pub it: I, + done: bool, + buffer: Vec, +} + +impl LazyBuffer +where + I: Iterator, +{ + pub fn new(it: I) -> LazyBuffer { + LazyBuffer { + it, + done: false, + buffer: Vec::new(), + } + } + + pub fn len(&self) -> usize { + self.buffer.len() + } + + pub fn get_next(&mut self) -> bool { + if self.done { + return false; + } + if let Some(x) = self.it.next() { + self.buffer.push(x); + true + } else { + self.done = true; + false + } + } + + pub fn prefill(&mut self, len: usize) { + let buffer_len = self.buffer.len(); + + if !self.done && len > buffer_len { + let delta = len - buffer_len; + + self.buffer.extend(self.it.by_ref().take(delta)); + self.done = self.buffer.len() < len; + } + } +} + +impl Index for LazyBuffer +where + I: Iterator, + I::Item: Sized, + Vec: Index +{ + type Output = as Index>::Output; + + fn index(&self, index: J) -> &Self::Output { + self.buffer.index(index) + } +} diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/src/lib.rs temporalio-1.3.0/vendor/itertools-0.10.5/src/lib.rs --- temporalio-1.3.0/vendor/itertools-0.10.5/src/lib.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,3784 @@ +#![warn(missing_docs)] +#![crate_name="itertools"] +#![cfg_attr(not(feature = "use_std"), no_std)] + +//! Extra iterator adaptors, functions and macros. +//! +//! To extend [`Iterator`] with methods in this crate, import +//! the [`Itertools`] trait: +//! +//! ``` +//! use itertools::Itertools; +//! ``` +//! +//! Now, new methods like [`interleave`](Itertools::interleave) +//! are available on all iterators: +//! +//! ``` +//! use itertools::Itertools; +//! +//! let it = (1..3).interleave(vec![-1, -2]); +//! itertools::assert_equal(it, vec![1, -1, 2, -2]); +//! ``` +//! +//! Most iterator methods are also provided as functions (with the benefit +//! that they convert parameters using [`IntoIterator`]): +//! +//! ``` +//! use itertools::interleave; +//! +//! for elt in interleave(&[1, 2, 3], &[2, 3, 4]) { +//! /* loop body */ +//! } +//! ``` +//! +//! ## Crate Features +//! +//! - `use_std` +//! - Enabled by default. +//! - Disable to compile itertools using `#![no_std]`. This disables +//! any items that depend on collections (like `group_by`, `unique`, +//! `kmerge`, `join` and many more). +//! +//! ## Rust Version +//! +//! This version of itertools requires Rust 1.32 or later. +#![doc(html_root_url="https://docs.rs/itertools/0.8/")] + +#[cfg(not(feature = "use_std"))] +extern crate core as std; + +#[cfg(feature = "use_alloc")] +extern crate alloc; + +#[cfg(feature = "use_alloc")] +use alloc::{ + string::String, + vec::Vec, +}; + +pub use either::Either; + +use core::borrow::Borrow; +#[cfg(feature = "use_std")] +use std::collections::HashMap; +use std::iter::{IntoIterator, once}; +use std::cmp::Ordering; +use std::fmt; +#[cfg(feature = "use_std")] +use std::collections::HashSet; +#[cfg(feature = "use_std")] +use std::hash::Hash; +#[cfg(feature = "use_alloc")] +use std::fmt::Write; +#[cfg(feature = "use_alloc")] +type VecIntoIter = alloc::vec::IntoIter; +#[cfg(feature = "use_alloc")] +use std::iter::FromIterator; + +#[macro_use] +mod impl_macros; + +// for compatibility with no std and macros +#[doc(hidden)] +pub use std::iter as __std_iter; + +/// The concrete iterator types. +pub mod structs { + pub use crate::adaptors::{ + Dedup, + DedupBy, + DedupWithCount, + DedupByWithCount, + Interleave, + InterleaveShortest, + FilterMapOk, + FilterOk, + Product, + PutBack, + Batching, + MapInto, + MapOk, + Merge, + MergeBy, + TakeWhileRef, + WhileSome, + Coalesce, + TupleCombinations, + Positions, + Update, + }; + #[allow(deprecated)] + pub use crate::adaptors::{MapResults, Step}; + #[cfg(feature = "use_alloc")] + pub use crate::adaptors::MultiProduct; + #[cfg(feature = "use_alloc")] + pub use crate::combinations::Combinations; + #[cfg(feature = "use_alloc")] + pub use crate::combinations_with_replacement::CombinationsWithReplacement; + pub use crate::cons_tuples_impl::ConsTuples; + pub use crate::exactly_one_err::ExactlyOneError; + pub use crate::format::{Format, FormatWith}; + pub use crate::flatten_ok::FlattenOk; + #[cfg(feature = "use_std")] + pub use crate::grouping_map::{GroupingMap, GroupingMapBy}; + #[cfg(feature = "use_alloc")] + pub use crate::groupbylazy::{IntoChunks, Chunk, Chunks, GroupBy, Group, Groups}; + pub use crate::intersperse::{Intersperse, IntersperseWith}; + #[cfg(feature = "use_alloc")] + pub use crate::kmerge_impl::{KMerge, KMergeBy}; + pub use crate::merge_join::MergeJoinBy; + #[cfg(feature = "use_alloc")] + pub use crate::multipeek_impl::MultiPeek; + #[cfg(feature = "use_alloc")] + pub use crate::peek_nth::PeekNth; + pub use crate::pad_tail::PadUsing; + pub use crate::peeking_take_while::PeekingTakeWhile; + #[cfg(feature = "use_alloc")] + pub use crate::permutations::Permutations; + pub use crate::process_results_impl::ProcessResults; + #[cfg(feature = "use_alloc")] + pub use crate::powerset::Powerset; + #[cfg(feature = "use_alloc")] + pub use crate::put_back_n_impl::PutBackN; + #[cfg(feature = "use_alloc")] + pub use crate::rciter_impl::RcIter; + pub use crate::repeatn::RepeatN; + #[allow(deprecated)] + pub use crate::sources::{RepeatCall, Unfold, Iterate}; + #[cfg(feature = "use_alloc")] + pub use crate::tee::Tee; + pub use crate::tuple_impl::{TupleBuffer, TupleWindows, CircularTupleWindows, Tuples}; + #[cfg(feature = "use_std")] + pub use crate::duplicates_impl::{Duplicates, DuplicatesBy}; + #[cfg(feature = "use_std")] + pub use crate::unique_impl::{Unique, UniqueBy}; + pub use crate::with_position::WithPosition; + pub use crate::zip_eq_impl::ZipEq; + pub use crate::zip_longest::ZipLongest; + pub use crate::ziptuple::Zip; +} + +/// Traits helpful for using certain `Itertools` methods in generic contexts. +pub mod traits { + pub use crate::tuple_impl::HomogeneousTuple; +} + +#[allow(deprecated)] +pub use crate::structs::*; +pub use crate::concat_impl::concat; +pub use crate::cons_tuples_impl::cons_tuples; +pub use crate::diff::diff_with; +pub use crate::diff::Diff; +#[cfg(feature = "use_alloc")] +pub use crate::kmerge_impl::{kmerge_by}; +pub use crate::minmax::MinMaxResult; +pub use crate::peeking_take_while::PeekingNext; +pub use crate::process_results_impl::process_results; +pub use crate::repeatn::repeat_n; +#[allow(deprecated)] +pub use crate::sources::{repeat_call, unfold, iterate}; +pub use crate::with_position::Position; +pub use crate::unziptuple::{multiunzip, MultiUnzip}; +pub use crate::ziptuple::multizip; +mod adaptors; +mod either_or_both; +pub use crate::either_or_both::EitherOrBoth; +#[doc(hidden)] +pub mod free; +#[doc(inline)] +pub use crate::free::*; +mod concat_impl; +mod cons_tuples_impl; +#[cfg(feature = "use_alloc")] +mod combinations; +#[cfg(feature = "use_alloc")] +mod combinations_with_replacement; +mod exactly_one_err; +mod diff; +mod flatten_ok; +#[cfg(feature = "use_std")] +mod extrema_set; +mod format; +#[cfg(feature = "use_std")] +mod grouping_map; +#[cfg(feature = "use_alloc")] +mod group_map; +#[cfg(feature = "use_alloc")] +mod groupbylazy; +mod intersperse; +#[cfg(feature = "use_alloc")] +mod k_smallest; +#[cfg(feature = "use_alloc")] +mod kmerge_impl; +#[cfg(feature = "use_alloc")] +mod lazy_buffer; +mod merge_join; +mod minmax; +#[cfg(feature = "use_alloc")] +mod multipeek_impl; +mod pad_tail; +#[cfg(feature = "use_alloc")] +mod peek_nth; +mod peeking_take_while; +#[cfg(feature = "use_alloc")] +mod permutations; +#[cfg(feature = "use_alloc")] +mod powerset; +mod process_results_impl; +#[cfg(feature = "use_alloc")] +mod put_back_n_impl; +#[cfg(feature = "use_alloc")] +mod rciter_impl; +mod repeatn; +mod size_hint; +mod sources; +#[cfg(feature = "use_alloc")] +mod tee; +mod tuple_impl; +#[cfg(feature = "use_std")] +mod duplicates_impl; +#[cfg(feature = "use_std")] +mod unique_impl; +mod unziptuple; +mod with_position; +mod zip_eq_impl; +mod zip_longest; +mod ziptuple; + +#[macro_export] +/// Create an iterator over the “cartesian product†of iterators. +/// +/// Iterator element type is like `(A, B, ..., E)` if formed +/// from iterators `(I, J, ..., M)` with element types `I::Item = A`, `J::Item = B`, etc. +/// +/// ``` +/// # use itertools::iproduct; +/// # +/// # fn main() { +/// // Iterate over the coordinates of a 4 x 4 x 4 grid +/// // from (0, 0, 0), (0, 0, 1), .., (0, 1, 0), (0, 1, 1), .. etc until (3, 3, 3) +/// for (i, j, k) in iproduct!(0..4, 0..4, 0..4) { +/// // .. +/// } +/// # } +/// ``` +macro_rules! iproduct { + (@flatten $I:expr,) => ( + $I + ); + (@flatten $I:expr, $J:expr, $($K:expr,)*) => ( + $crate::iproduct!(@flatten $crate::cons_tuples($crate::iproduct!($I, $J)), $($K,)*) + ); + ($I:expr) => ( + $crate::__std_iter::IntoIterator::into_iter($I) + ); + ($I:expr, $J:expr) => ( + $crate::Itertools::cartesian_product($crate::iproduct!($I), $crate::iproduct!($J)) + ); + ($I:expr, $J:expr, $($K:expr),+) => ( + $crate::iproduct!(@flatten $crate::iproduct!($I, $J), $($K,)+) + ); +} + +#[macro_export] +/// Create an iterator running multiple iterators in lockstep. +/// +/// The `izip!` iterator yields elements until any subiterator +/// returns `None`. +/// +/// This is a version of the standard ``.zip()`` that's supporting more than +/// two iterators. The iterator element type is a tuple with one element +/// from each of the input iterators. Just like ``.zip()``, the iteration stops +/// when the shortest of the inputs reaches its end. +/// +/// **Note:** The result of this macro is in the general case an iterator +/// composed of repeated `.zip()` and a `.map()`; it has an anonymous type. +/// The special cases of one and two arguments produce the equivalent of +/// `$a.into_iter()` and `$a.into_iter().zip($b)` respectively. +/// +/// Prefer this macro `izip!()` over [`multizip`] for the performance benefits +/// of using the standard library `.zip()`. +/// +/// ``` +/// # use itertools::izip; +/// # +/// # fn main() { +/// +/// // iterate over three sequences side-by-side +/// let mut results = [0, 0, 0, 0]; +/// let inputs = [3, 7, 9, 6]; +/// +/// for (r, index, input) in izip!(&mut results, 0..10, &inputs) { +/// *r = index * 10 + input; +/// } +/// +/// assert_eq!(results, [0 + 3, 10 + 7, 29, 36]); +/// # } +/// ``` +macro_rules! izip { + // @closure creates a tuple-flattening closure for .map() call. usage: + // @closure partial_pattern => partial_tuple , rest , of , iterators + // eg. izip!( @closure ((a, b), c) => (a, b, c) , dd , ee ) + ( @closure $p:pat => $tup:expr ) => { + |$p| $tup + }; + + // The "b" identifier is a different identifier on each recursion level thanks to hygiene. + ( @closure $p:pat => ( $($tup:tt)* ) , $_iter:expr $( , $tail:expr )* ) => { + $crate::izip!(@closure ($p, b) => ( $($tup)*, b ) $( , $tail )*) + }; + + // unary + ($first:expr $(,)*) => { + $crate::__std_iter::IntoIterator::into_iter($first) + }; + + // binary + ($first:expr, $second:expr $(,)*) => { + $crate::izip!($first) + .zip($second) + }; + + // n-ary where n > 2 + ( $first:expr $( , $rest:expr )* $(,)* ) => { + $crate::izip!($first) + $( + .zip($rest) + )* + .map( + $crate::izip!(@closure a => (a) $( , $rest )*) + ) + }; +} + +#[macro_export] +/// [Chain][`chain`] zero or more iterators together into one sequence. +/// +/// The comma-separated arguments must implement [`IntoIterator`]. +/// The final argument may be followed by a trailing comma. +/// +/// [`chain`]: Iterator::chain +/// +/// # Examples +/// +/// Empty invocations of `chain!` expand to an invocation of [`std::iter::empty`]: +/// ``` +/// use std::iter; +/// use itertools::chain; +/// +/// let _: iter::Empty<()> = chain!(); +/// let _: iter::Empty = chain!(); +/// ``` +/// +/// Invocations of `chain!` with one argument expand to [`arg.into_iter()`](IntoIterator): +/// ``` +/// use std::{ops::Range, slice}; +/// use itertools::chain; +/// let _: as IntoIterator>::IntoIter = chain!((2..6),); // trailing comma optional! +/// let _: <&[_] as IntoIterator>::IntoIter = chain!(&[2, 3, 4]); +/// ``` +/// +/// Invocations of `chain!` with multiple arguments [`.into_iter()`](IntoIterator) each +/// argument, and then [`chain`] them together: +/// ``` +/// use std::{iter::*, ops::Range, slice}; +/// use itertools::{assert_equal, chain}; +/// +/// // e.g., this: +/// let with_macro: Chain, Take>>, slice::Iter<_>> = +/// chain![once(&0), repeat(&1).take(2), &[2, 3, 5],]; +/// +/// // ...is equivalent to this: +/// let with_method: Chain, Take>>, slice::Iter<_>> = +/// once(&0) +/// .chain(repeat(&1).take(2)) +/// .chain(&[2, 3, 5]); +/// +/// assert_equal(with_macro, with_method); +/// ``` +macro_rules! chain { + () => { + core::iter::empty() + }; + ($first:expr $(, $rest:expr )* $(,)?) => { + { + let iter = core::iter::IntoIterator::into_iter($first); + $( + let iter = + core::iter::Iterator::chain( + iter, + core::iter::IntoIterator::into_iter($rest)); + )* + iter + } + }; +} + +/// An [`Iterator`] blanket implementation that provides extra adaptors and +/// methods. +/// +/// This trait defines a number of methods. They are divided into two groups: +/// +/// * *Adaptors* take an iterator and parameter as input, and return +/// a new iterator value. These are listed first in the trait. An example +/// of an adaptor is [`.interleave()`](Itertools::interleave) +/// +/// * *Regular methods* are those that don't return iterators and instead +/// return a regular value of some other kind. +/// [`.next_tuple()`](Itertools::next_tuple) is an example and the first regular +/// method in the list. +pub trait Itertools : Iterator { + // adaptors + + /// Alternate elements from two iterators until both have run out. + /// + /// Iterator element type is `Self::Item`. + /// + /// This iterator is *fused*. + /// + /// ``` + /// use itertools::Itertools; + /// + /// let it = (1..7).interleave(vec![-1, -2]); + /// itertools::assert_equal(it, vec![1, -1, 2, -2, 3, 4, 5, 6]); + /// ``` + fn interleave(self, other: J) -> Interleave + where J: IntoIterator, + Self: Sized + { + interleave(self, other) + } + + /// Alternate elements from two iterators until at least one of them has run + /// out. + /// + /// Iterator element type is `Self::Item`. + /// + /// ``` + /// use itertools::Itertools; + /// + /// let it = (1..7).interleave_shortest(vec![-1, -2]); + /// itertools::assert_equal(it, vec![1, -1, 2, -2, 3]); + /// ``` + fn interleave_shortest(self, other: J) -> InterleaveShortest + where J: IntoIterator, + Self: Sized + { + adaptors::interleave_shortest(self, other.into_iter()) + } + + /// An iterator adaptor to insert a particular value + /// between each element of the adapted iterator. + /// + /// Iterator element type is `Self::Item`. + /// + /// This iterator is *fused*. + /// + /// ``` + /// use itertools::Itertools; + /// + /// itertools::assert_equal((0..3).intersperse(8), vec![0, 8, 1, 8, 2]); + /// ``` + fn intersperse(self, element: Self::Item) -> Intersperse + where Self: Sized, + Self::Item: Clone + { + intersperse::intersperse(self, element) + } + + /// An iterator adaptor to insert a particular value created by a function + /// between each element of the adapted iterator. + /// + /// Iterator element type is `Self::Item`. + /// + /// This iterator is *fused*. + /// + /// ``` + /// use itertools::Itertools; + /// + /// let mut i = 10; + /// itertools::assert_equal((0..3).intersperse_with(|| { i -= 1; i }), vec![0, 9, 1, 8, 2]); + /// assert_eq!(i, 8); + /// ``` + fn intersperse_with(self, element: F) -> IntersperseWith + where Self: Sized, + F: FnMut() -> Self::Item + { + intersperse::intersperse_with(self, element) + } + + /// Create an iterator which iterates over both this and the specified + /// iterator simultaneously, yielding pairs of two optional elements. + /// + /// This iterator is *fused*. + /// + /// As long as neither input iterator is exhausted yet, it yields two values + /// via `EitherOrBoth::Both`. + /// + /// When the parameter iterator is exhausted, it only yields a value from the + /// `self` iterator via `EitherOrBoth::Left`. + /// + /// When the `self` iterator is exhausted, it only yields a value from the + /// parameter iterator via `EitherOrBoth::Right`. + /// + /// When both iterators return `None`, all further invocations of `.next()` + /// will return `None`. + /// + /// Iterator element type is + /// [`EitherOrBoth`](EitherOrBoth). + /// + /// ```rust + /// use itertools::EitherOrBoth::{Both, Right}; + /// use itertools::Itertools; + /// let it = (0..1).zip_longest(1..3); + /// itertools::assert_equal(it, vec![Both(0, 1), Right(2)]); + /// ``` + #[inline] + fn zip_longest(self, other: J) -> ZipLongest + where J: IntoIterator, + Self: Sized + { + zip_longest::zip_longest(self, other.into_iter()) + } + + /// Create an iterator which iterates over both this and the specified + /// iterator simultaneously, yielding pairs of elements. + /// + /// **Panics** if the iterators reach an end and they are not of equal + /// lengths. + #[inline] + fn zip_eq(self, other: J) -> ZipEq + where J: IntoIterator, + Self: Sized + { + zip_eq(self, other) + } + + /// A “meta iterator adaptorâ€. Its closure receives a reference to the + /// iterator and may pick off as many elements as it likes, to produce the + /// next iterator element. + /// + /// Iterator element type is `B`. + /// + /// ``` + /// use itertools::Itertools; + /// + /// // An adaptor that gathers elements in pairs + /// let pit = (0..4).batching(|it| { + /// match it.next() { + /// None => None, + /// Some(x) => match it.next() { + /// None => None, + /// Some(y) => Some((x, y)), + /// } + /// } + /// }); + /// + /// itertools::assert_equal(pit, vec![(0, 1), (2, 3)]); + /// ``` + /// + fn batching(self, f: F) -> Batching + where F: FnMut(&mut Self) -> Option, + Self: Sized + { + adaptors::batching(self, f) + } + + /// Return an *iterable* that can group iterator elements. + /// Consecutive elements that map to the same key (“runsâ€), are assigned + /// to the same group. + /// + /// `GroupBy` is the storage for the lazy grouping operation. + /// + /// If the groups are consumed in order, or if each group's iterator is + /// dropped without keeping it around, then `GroupBy` uses no + /// allocations. It needs allocations only if several group iterators + /// are alive at the same time. + /// + /// This type implements [`IntoIterator`] (it is **not** an iterator + /// itself), because the group iterators need to borrow from this + /// value. It should be stored in a local variable or temporary and + /// iterated. + /// + /// Iterator element type is `(K, Group)`: the group's key and the + /// group iterator. + /// + /// ``` + /// use itertools::Itertools; + /// + /// // group data into runs of larger than zero or not. + /// let data = vec![1, 3, -2, -2, 1, 0, 1, 2]; + /// // groups: |---->|------>|--------->| + /// + /// // Note: The `&` is significant here, `GroupBy` is iterable + /// // only by reference. You can also call `.into_iter()` explicitly. + /// let mut data_grouped = Vec::new(); + /// for (key, group) in &data.into_iter().group_by(|elt| *elt >= 0) { + /// data_grouped.push((key, group.collect())); + /// } + /// assert_eq!(data_grouped, vec![(true, vec![1, 3]), (false, vec![-2, -2]), (true, vec![1, 0, 1, 2])]); + /// ``` + #[cfg(feature = "use_alloc")] + fn group_by(self, key: F) -> GroupBy + where Self: Sized, + F: FnMut(&Self::Item) -> K, + K: PartialEq, + { + groupbylazy::new(self, key) + } + + /// Return an *iterable* that can chunk the iterator. + /// + /// Yield subiterators (chunks) that each yield a fixed number elements, + /// determined by `size`. The last chunk will be shorter if there aren't + /// enough elements. + /// + /// `IntoChunks` is based on `GroupBy`: it is iterable (implements + /// `IntoIterator`, **not** `Iterator`), and it only buffers if several + /// chunk iterators are alive at the same time. + /// + /// Iterator element type is `Chunk`, each chunk's iterator. + /// + /// **Panics** if `size` is 0. + /// + /// ``` + /// use itertools::Itertools; + /// + /// let data = vec![1, 1, 2, -2, 6, 0, 3, 1]; + /// //chunk size=3 |------->|-------->|--->| + /// + /// // Note: The `&` is significant here, `IntoChunks` is iterable + /// // only by reference. You can also call `.into_iter()` explicitly. + /// for chunk in &data.into_iter().chunks(3) { + /// // Check that the sum of each chunk is 4. + /// assert_eq!(4, chunk.sum()); + /// } + /// ``` + #[cfg(feature = "use_alloc")] + fn chunks(self, size: usize) -> IntoChunks + where Self: Sized, + { + assert!(size != 0); + groupbylazy::new_chunks(self, size) + } + + /// Return an iterator over all contiguous windows producing tuples of + /// a specific size (up to 12). + /// + /// `tuple_windows` clones the iterator elements so that they can be + /// part of successive windows, this makes it most suited for iterators + /// of references and other values that are cheap to copy. + /// + /// ``` + /// use itertools::Itertools; + /// let mut v = Vec::new(); + /// + /// // pairwise iteration + /// for (a, b) in (1..5).tuple_windows() { + /// v.push((a, b)); + /// } + /// assert_eq!(v, vec![(1, 2), (2, 3), (3, 4)]); + /// + /// let mut it = (1..5).tuple_windows(); + /// assert_eq!(Some((1, 2, 3)), it.next()); + /// assert_eq!(Some((2, 3, 4)), it.next()); + /// assert_eq!(None, it.next()); + /// + /// // this requires a type hint + /// let it = (1..5).tuple_windows::<(_, _, _)>(); + /// itertools::assert_equal(it, vec![(1, 2, 3), (2, 3, 4)]); + /// + /// // you can also specify the complete type + /// use itertools::TupleWindows; + /// use std::ops::Range; + /// + /// let it: TupleWindows, (u32, u32, u32)> = (1..5).tuple_windows(); + /// itertools::assert_equal(it, vec![(1, 2, 3), (2, 3, 4)]); + /// ``` + fn tuple_windows(self) -> TupleWindows + where Self: Sized + Iterator, + T: traits::HomogeneousTuple, + T::Item: Clone + { + tuple_impl::tuple_windows(self) + } + + /// Return an iterator over all windows, wrapping back to the first + /// elements when the window would otherwise exceed the length of the + /// iterator, producing tuples of a specific size (up to 12). + /// + /// `circular_tuple_windows` clones the iterator elements so that they can be + /// part of successive windows, this makes it most suited for iterators + /// of references and other values that are cheap to copy. + /// + /// ``` + /// use itertools::Itertools; + /// let mut v = Vec::new(); + /// for (a, b) in (1..5).circular_tuple_windows() { + /// v.push((a, b)); + /// } + /// assert_eq!(v, vec![(1, 2), (2, 3), (3, 4), (4, 1)]); + /// + /// let mut it = (1..5).circular_tuple_windows(); + /// assert_eq!(Some((1, 2, 3)), it.next()); + /// assert_eq!(Some((2, 3, 4)), it.next()); + /// assert_eq!(Some((3, 4, 1)), it.next()); + /// assert_eq!(Some((4, 1, 2)), it.next()); + /// assert_eq!(None, it.next()); + /// + /// // this requires a type hint + /// let it = (1..5).circular_tuple_windows::<(_, _, _)>(); + /// itertools::assert_equal(it, vec![(1, 2, 3), (2, 3, 4), (3, 4, 1), (4, 1, 2)]); + /// ``` + fn circular_tuple_windows(self) -> CircularTupleWindows + where Self: Sized + Clone + Iterator + ExactSizeIterator, + T: tuple_impl::TupleCollect + Clone, + T::Item: Clone + { + tuple_impl::circular_tuple_windows(self) + } + /// Return an iterator that groups the items in tuples of a specific size + /// (up to 12). + /// + /// See also the method [`.next_tuple()`](Itertools::next_tuple). + /// + /// ``` + /// use itertools::Itertools; + /// let mut v = Vec::new(); + /// for (a, b) in (1..5).tuples() { + /// v.push((a, b)); + /// } + /// assert_eq!(v, vec![(1, 2), (3, 4)]); + /// + /// let mut it = (1..7).tuples(); + /// assert_eq!(Some((1, 2, 3)), it.next()); + /// assert_eq!(Some((4, 5, 6)), it.next()); + /// assert_eq!(None, it.next()); + /// + /// // this requires a type hint + /// let it = (1..7).tuples::<(_, _, _)>(); + /// itertools::assert_equal(it, vec![(1, 2, 3), (4, 5, 6)]); + /// + /// // you can also specify the complete type + /// use itertools::Tuples; + /// use std::ops::Range; + /// + /// let it: Tuples, (u32, u32, u32)> = (1..7).tuples(); + /// itertools::assert_equal(it, vec![(1, 2, 3), (4, 5, 6)]); + /// ``` + /// + /// See also [`Tuples::into_buffer`]. + fn tuples(self) -> Tuples + where Self: Sized + Iterator, + T: traits::HomogeneousTuple + { + tuple_impl::tuples(self) + } + + /// Split into an iterator pair that both yield all elements from + /// the original iterator. + /// + /// **Note:** If the iterator is clonable, prefer using that instead + /// of using this method. Cloning is likely to be more efficient. + /// + /// Iterator element type is `Self::Item`. + /// + /// ``` + /// use itertools::Itertools; + /// let xs = vec![0, 1, 2, 3]; + /// + /// let (mut t1, t2) = xs.into_iter().tee(); + /// itertools::assert_equal(t1.next(), Some(0)); + /// itertools::assert_equal(t2, 0..4); + /// itertools::assert_equal(t1, 1..4); + /// ``` + #[cfg(feature = "use_alloc")] + fn tee(self) -> (Tee, Tee) + where Self: Sized, + Self::Item: Clone + { + tee::new(self) + } + + /// Return an iterator adaptor that steps `n` elements in the base iterator + /// for each iteration. + /// + /// The iterator steps by yielding the next element from the base iterator, + /// then skipping forward `n - 1` elements. + /// + /// Iterator element type is `Self::Item`. + /// + /// **Panics** if the step is 0. + /// + /// ``` + /// use itertools::Itertools; + /// + /// let it = (0..8).step(3); + /// itertools::assert_equal(it, vec![0, 3, 6]); + /// ``` + #[deprecated(note="Use std .step_by() instead", since="0.8.0")] + #[allow(deprecated)] + fn step(self, n: usize) -> Step + where Self: Sized + { + adaptors::step(self, n) + } + + /// Convert each item of the iterator using the [`Into`] trait. + /// + /// ```rust + /// use itertools::Itertools; + /// + /// (1i32..42i32).map_into::().collect_vec(); + /// ``` + fn map_into(self) -> MapInto + where Self: Sized, + Self::Item: Into, + { + adaptors::map_into(self) + } + + /// See [`.map_ok()`](Itertools::map_ok). + #[deprecated(note="Use .map_ok() instead", since="0.10.0")] + fn map_results(self, f: F) -> MapOk + where Self: Iterator> + Sized, + F: FnMut(T) -> U, + { + self.map_ok(f) + } + + /// Return an iterator adaptor that applies the provided closure + /// to every `Result::Ok` value. `Result::Err` values are + /// unchanged. + /// + /// ``` + /// use itertools::Itertools; + /// + /// let input = vec![Ok(41), Err(false), Ok(11)]; + /// let it = input.into_iter().map_ok(|i| i + 1); + /// itertools::assert_equal(it, vec![Ok(42), Err(false), Ok(12)]); + /// ``` + fn map_ok(self, f: F) -> MapOk + where Self: Iterator> + Sized, + F: FnMut(T) -> U, + { + adaptors::map_ok(self, f) + } + + /// Return an iterator adaptor that filters every `Result::Ok` + /// value with the provided closure. `Result::Err` values are + /// unchanged. + /// + /// ``` + /// use itertools::Itertools; + /// + /// let input = vec![Ok(22), Err(false), Ok(11)]; + /// let it = input.into_iter().filter_ok(|&i| i > 20); + /// itertools::assert_equal(it, vec![Ok(22), Err(false)]); + /// ``` + fn filter_ok(self, f: F) -> FilterOk + where Self: Iterator> + Sized, + F: FnMut(&T) -> bool, + { + adaptors::filter_ok(self, f) + } + + /// Return an iterator adaptor that filters and transforms every + /// `Result::Ok` value with the provided closure. `Result::Err` + /// values are unchanged. + /// + /// ``` + /// use itertools::Itertools; + /// + /// let input = vec![Ok(22), Err(false), Ok(11)]; + /// let it = input.into_iter().filter_map_ok(|i| if i > 20 { Some(i * 2) } else { None }); + /// itertools::assert_equal(it, vec![Ok(44), Err(false)]); + /// ``` + fn filter_map_ok(self, f: F) -> FilterMapOk + where Self: Iterator> + Sized, + F: FnMut(T) -> Option, + { + adaptors::filter_map_ok(self, f) + } + + /// Return an iterator adaptor that flattens every `Result::Ok` value into + /// a series of `Result::Ok` values. `Result::Err` values are unchanged. + /// + /// This is useful when you have some common error type for your crate and + /// need to propagate it upwards, but the `Result::Ok` case needs to be flattened. + /// + /// ``` + /// use itertools::Itertools; + /// + /// let input = vec![Ok(0..2), Err(false), Ok(2..4)]; + /// let it = input.iter().cloned().flatten_ok(); + /// itertools::assert_equal(it.clone(), vec![Ok(0), Ok(1), Err(false), Ok(2), Ok(3)]); + /// + /// // This can also be used to propagate errors when collecting. + /// let output_result: Result, bool> = it.collect(); + /// assert_eq!(output_result, Err(false)); + /// ``` + fn flatten_ok(self) -> FlattenOk + where Self: Iterator> + Sized, + T: IntoIterator + { + flatten_ok::flatten_ok(self) + } + + /// Return an iterator adaptor that merges the two base iterators in + /// ascending order. If both base iterators are sorted (ascending), the + /// result is sorted. + /// + /// Iterator element type is `Self::Item`. + /// + /// ``` + /// use itertools::Itertools; + /// + /// let a = (0..11).step(3); + /// let b = (0..11).step(5); + /// let it = a.merge(b); + /// itertools::assert_equal(it, vec![0, 0, 3, 5, 6, 9, 10]); + /// ``` + fn merge(self, other: J) -> Merge + where Self: Sized, + Self::Item: PartialOrd, + J: IntoIterator + { + merge(self, other) + } + + /// Return an iterator adaptor that merges the two base iterators in order. + /// This is much like [`.merge()`](Itertools::merge) but allows for a custom ordering. + /// + /// This can be especially useful for sequences of tuples. + /// + /// Iterator element type is `Self::Item`. + /// + /// ``` + /// use itertools::Itertools; + /// + /// let a = (0..).zip("bc".chars()); + /// let b = (0..).zip("ad".chars()); + /// let it = a.merge_by(b, |x, y| x.1 <= y.1); + /// itertools::assert_equal(it, vec![(0, 'a'), (0, 'b'), (1, 'c'), (1, 'd')]); + /// ``` + + fn merge_by(self, other: J, is_first: F) -> MergeBy + where Self: Sized, + J: IntoIterator, + F: FnMut(&Self::Item, &Self::Item) -> bool + { + adaptors::merge_by_new(self, other.into_iter(), is_first) + } + + /// Create an iterator that merges items from both this and the specified + /// iterator in ascending order. + /// + /// It chooses whether to pair elements based on the `Ordering` returned by the + /// specified compare function. At any point, inspecting the tip of the + /// iterators `I` and `J` as items `i` of type `I::Item` and `j` of type + /// `J::Item` respectively, the resulting iterator will: + /// + /// - Emit `EitherOrBoth::Left(i)` when `i < j`, + /// and remove `i` from its source iterator + /// - Emit `EitherOrBoth::Right(j)` when `i > j`, + /// and remove `j` from its source iterator + /// - Emit `EitherOrBoth::Both(i, j)` when `i == j`, + /// and remove both `i` and `j` from their respective source iterators + /// + /// ``` + /// use itertools::Itertools; + /// use itertools::EitherOrBoth::{Left, Right, Both}; + /// + /// let multiples_of_2 = (0..10).step(2); + /// let multiples_of_3 = (0..10).step(3); + /// + /// itertools::assert_equal( + /// multiples_of_2.merge_join_by(multiples_of_3, |i, j| i.cmp(j)), + /// vec![Both(0, 0), Left(2), Right(3), Left(4), Both(6, 6), Left(8), Right(9)] + /// ); + /// ``` + #[inline] + fn merge_join_by(self, other: J, cmp_fn: F) -> MergeJoinBy + where J: IntoIterator, + F: FnMut(&Self::Item, &J::Item) -> std::cmp::Ordering, + Self: Sized + { + merge_join_by(self, other, cmp_fn) + } + + /// Return an iterator adaptor that flattens an iterator of iterators by + /// merging them in ascending order. + /// + /// If all base iterators are sorted (ascending), the result is sorted. + /// + /// Iterator element type is `Self::Item`. + /// + /// ``` + /// use itertools::Itertools; + /// + /// let a = (0..6).step(3); + /// let b = (1..6).step(3); + /// let c = (2..6).step(3); + /// let it = vec![a, b, c].into_iter().kmerge(); + /// itertools::assert_equal(it, vec![0, 1, 2, 3, 4, 5]); + /// ``` + #[cfg(feature = "use_alloc")] + fn kmerge(self) -> KMerge<::IntoIter> + where Self: Sized, + Self::Item: IntoIterator, + ::Item: PartialOrd, + { + kmerge(self) + } + + /// Return an iterator adaptor that flattens an iterator of iterators by + /// merging them according to the given closure. + /// + /// The closure `first` is called with two elements *a*, *b* and should + /// return `true` if *a* is ordered before *b*. + /// + /// If all base iterators are sorted according to `first`, the result is + /// sorted. + /// + /// Iterator element type is `Self::Item`. + /// + /// ``` + /// use itertools::Itertools; + /// + /// let a = vec![-1f64, 2., 3., -5., 6., -7.]; + /// let b = vec![0., 2., -4.]; + /// let mut it = vec![a, b].into_iter().kmerge_by(|a, b| a.abs() < b.abs()); + /// assert_eq!(it.next(), Some(0.)); + /// assert_eq!(it.last(), Some(-7.)); + /// ``` + #[cfg(feature = "use_alloc")] + fn kmerge_by(self, first: F) + -> KMergeBy<::IntoIter, F> + where Self: Sized, + Self::Item: IntoIterator, + F: FnMut(&::Item, + &::Item) -> bool + { + kmerge_by(self, first) + } + + /// Return an iterator adaptor that iterates over the cartesian product of + /// the element sets of two iterators `self` and `J`. + /// + /// Iterator element type is `(Self::Item, J::Item)`. + /// + /// ``` + /// use itertools::Itertools; + /// + /// let it = (0..2).cartesian_product("αβ".chars()); + /// itertools::assert_equal(it, vec![(0, 'α'), (0, 'β'), (1, 'α'), (1, 'β')]); + /// ``` + fn cartesian_product(self, other: J) -> Product + where Self: Sized, + Self::Item: Clone, + J: IntoIterator, + J::IntoIter: Clone + { + adaptors::cartesian_product(self, other.into_iter()) + } + + /// Return an iterator adaptor that iterates over the cartesian product of + /// all subiterators returned by meta-iterator `self`. + /// + /// All provided iterators must yield the same `Item` type. To generate + /// the product of iterators yielding multiple types, use the + /// [`iproduct`] macro instead. + /// + /// + /// The iterator element type is `Vec`, where `T` is the iterator element + /// of the subiterators. + /// + /// ``` + /// use itertools::Itertools; + /// let mut multi_prod = (0..3).map(|i| (i * 2)..(i * 2 + 2)) + /// .multi_cartesian_product(); + /// assert_eq!(multi_prod.next(), Some(vec![0, 2, 4])); + /// assert_eq!(multi_prod.next(), Some(vec![0, 2, 5])); + /// assert_eq!(multi_prod.next(), Some(vec![0, 3, 4])); + /// assert_eq!(multi_prod.next(), Some(vec![0, 3, 5])); + /// assert_eq!(multi_prod.next(), Some(vec![1, 2, 4])); + /// assert_eq!(multi_prod.next(), Some(vec![1, 2, 5])); + /// assert_eq!(multi_prod.next(), Some(vec![1, 3, 4])); + /// assert_eq!(multi_prod.next(), Some(vec![1, 3, 5])); + /// assert_eq!(multi_prod.next(), None); + /// ``` + #[cfg(feature = "use_alloc")] + fn multi_cartesian_product(self) -> MultiProduct<::IntoIter> + where Self: Sized, + Self::Item: IntoIterator, + ::IntoIter: Clone, + ::Item: Clone + { + adaptors::multi_cartesian_product(self) + } + + /// Return an iterator adaptor that uses the passed-in closure to + /// optionally merge together consecutive elements. + /// + /// The closure `f` is passed two elements, `previous` and `current` and may + /// return either (1) `Ok(combined)` to merge the two values or + /// (2) `Err((previous', current'))` to indicate they can't be merged. + /// In (2), the value `previous'` is emitted by the iterator. + /// Either (1) `combined` or (2) `current'` becomes the previous value + /// when coalesce continues with the next pair of elements to merge. The + /// value that remains at the end is also emitted by the iterator. + /// + /// Iterator element type is `Self::Item`. + /// + /// This iterator is *fused*. + /// + /// ``` + /// use itertools::Itertools; + /// + /// // sum same-sign runs together + /// let data = vec![-1., -2., -3., 3., 1., 0., -1.]; + /// itertools::assert_equal(data.into_iter().coalesce(|x, y| + /// if (x >= 0.) == (y >= 0.) { + /// Ok(x + y) + /// } else { + /// Err((x, y)) + /// }), + /// vec![-6., 4., -1.]); + /// ``` + fn coalesce(self, f: F) -> Coalesce + where Self: Sized, + F: FnMut(Self::Item, Self::Item) + -> Result + { + adaptors::coalesce(self, f) + } + + /// Remove duplicates from sections of consecutive identical elements. + /// If the iterator is sorted, all elements will be unique. + /// + /// Iterator element type is `Self::Item`. + /// + /// This iterator is *fused*. + /// + /// ``` + /// use itertools::Itertools; + /// + /// let data = vec![1., 1., 2., 3., 3., 2., 2.]; + /// itertools::assert_equal(data.into_iter().dedup(), + /// vec![1., 2., 3., 2.]); + /// ``` + fn dedup(self) -> Dedup + where Self: Sized, + Self::Item: PartialEq, + { + adaptors::dedup(self) + } + + /// Remove duplicates from sections of consecutive identical elements, + /// determining equality using a comparison function. + /// If the iterator is sorted, all elements will be unique. + /// + /// Iterator element type is `Self::Item`. + /// + /// This iterator is *fused*. + /// + /// ``` + /// use itertools::Itertools; + /// + /// let data = vec![(0, 1.), (1, 1.), (0, 2.), (0, 3.), (1, 3.), (1, 2.), (2, 2.)]; + /// itertools::assert_equal(data.into_iter().dedup_by(|x, y| x.1 == y.1), + /// vec![(0, 1.), (0, 2.), (0, 3.), (1, 2.)]); + /// ``` + fn dedup_by(self, cmp: Cmp) -> DedupBy + where Self: Sized, + Cmp: FnMut(&Self::Item, &Self::Item)->bool, + { + adaptors::dedup_by(self, cmp) + } + + /// Remove duplicates from sections of consecutive identical elements, while keeping a count of + /// how many repeated elements were present. + /// If the iterator is sorted, all elements will be unique. + /// + /// Iterator element type is `(usize, Self::Item)`. + /// + /// This iterator is *fused*. + /// + /// ``` + /// use itertools::Itertools; + /// + /// let data = vec!['a', 'a', 'b', 'c', 'c', 'b', 'b']; + /// itertools::assert_equal(data.into_iter().dedup_with_count(), + /// vec![(2, 'a'), (1, 'b'), (2, 'c'), (2, 'b')]); + /// ``` + fn dedup_with_count(self) -> DedupWithCount + where + Self: Sized, + { + adaptors::dedup_with_count(self) + } + + /// Remove duplicates from sections of consecutive identical elements, while keeping a count of + /// how many repeated elements were present. + /// This will determine equality using a comparison function. + /// If the iterator is sorted, all elements will be unique. + /// + /// Iterator element type is `(usize, Self::Item)`. + /// + /// This iterator is *fused*. + /// + /// ``` + /// use itertools::Itertools; + /// + /// let data = vec![(0, 'a'), (1, 'a'), (0, 'b'), (0, 'c'), (1, 'c'), (1, 'b'), (2, 'b')]; + /// itertools::assert_equal(data.into_iter().dedup_by_with_count(|x, y| x.1 == y.1), + /// vec![(2, (0, 'a')), (1, (0, 'b')), (2, (0, 'c')), (2, (1, 'b'))]); + /// ``` + fn dedup_by_with_count(self, cmp: Cmp) -> DedupByWithCount + where + Self: Sized, + Cmp: FnMut(&Self::Item, &Self::Item) -> bool, + { + adaptors::dedup_by_with_count(self, cmp) + } + + /// Return an iterator adaptor that produces elements that appear more than once during the + /// iteration. Duplicates are detected using hash and equality. + /// + /// The iterator is stable, returning the duplicate items in the order in which they occur in + /// the adapted iterator. Each duplicate item is returned exactly once. If an item appears more + /// than twice, the second item is the item retained and the rest are discarded. + /// + /// ``` + /// use itertools::Itertools; + /// + /// let data = vec![10, 20, 30, 20, 40, 10, 50]; + /// itertools::assert_equal(data.into_iter().duplicates(), + /// vec![20, 10]); + /// ``` + #[cfg(feature = "use_std")] + fn duplicates(self) -> Duplicates + where Self: Sized, + Self::Item: Eq + Hash + { + duplicates_impl::duplicates(self) + } + + /// Return an iterator adaptor that produces elements that appear more than once during the + /// iteration. Duplicates are detected using hash and equality. + /// + /// Duplicates are detected by comparing the key they map to with the keying function `f` by + /// hash and equality. The keys are stored in a hash map in the iterator. + /// + /// The iterator is stable, returning the duplicate items in the order in which they occur in + /// the adapted iterator. Each duplicate item is returned exactly once. If an item appears more + /// than twice, the second item is the item retained and the rest are discarded. + /// + /// ``` + /// use itertools::Itertools; + /// + /// let data = vec!["a", "bb", "aa", "c", "ccc"]; + /// itertools::assert_equal(data.into_iter().duplicates_by(|s| s.len()), + /// vec!["aa", "c"]); + /// ``` + #[cfg(feature = "use_std")] + fn duplicates_by(self, f: F) -> DuplicatesBy + where Self: Sized, + V: Eq + Hash, + F: FnMut(&Self::Item) -> V + { + duplicates_impl::duplicates_by(self, f) + } + + /// Return an iterator adaptor that filters out elements that have + /// already been produced once during the iteration. Duplicates + /// are detected using hash and equality. + /// + /// Clones of visited elements are stored in a hash set in the + /// iterator. + /// + /// The iterator is stable, returning the non-duplicate items in the order + /// in which they occur in the adapted iterator. In a set of duplicate + /// items, the first item encountered is the item retained. + /// + /// ``` + /// use itertools::Itertools; + /// + /// let data = vec![10, 20, 30, 20, 40, 10, 50]; + /// itertools::assert_equal(data.into_iter().unique(), + /// vec![10, 20, 30, 40, 50]); + /// ``` + #[cfg(feature = "use_std")] + fn unique(self) -> Unique + where Self: Sized, + Self::Item: Clone + Eq + Hash + { + unique_impl::unique(self) + } + + /// Return an iterator adaptor that filters out elements that have + /// already been produced once during the iteration. + /// + /// Duplicates are detected by comparing the key they map to + /// with the keying function `f` by hash and equality. + /// The keys are stored in a hash set in the iterator. + /// + /// The iterator is stable, returning the non-duplicate items in the order + /// in which they occur in the adapted iterator. In a set of duplicate + /// items, the first item encountered is the item retained. + /// + /// ``` + /// use itertools::Itertools; + /// + /// let data = vec!["a", "bb", "aa", "c", "ccc"]; + /// itertools::assert_equal(data.into_iter().unique_by(|s| s.len()), + /// vec!["a", "bb", "ccc"]); + /// ``` + #[cfg(feature = "use_std")] + fn unique_by(self, f: F) -> UniqueBy + where Self: Sized, + V: Eq + Hash, + F: FnMut(&Self::Item) -> V + { + unique_impl::unique_by(self, f) + } + + /// Return an iterator adaptor that borrows from this iterator and + /// takes items while the closure `accept` returns `true`. + /// + /// This adaptor can only be used on iterators that implement `PeekingNext` + /// like `.peekable()`, `put_back` and a few other collection iterators. + /// + /// The last and rejected element (first `false`) is still available when + /// `peeking_take_while` is done. + /// + /// + /// See also [`.take_while_ref()`](Itertools::take_while_ref) + /// which is a similar adaptor. + fn peeking_take_while(&mut self, accept: F) -> PeekingTakeWhile + where Self: Sized + PeekingNext, + F: FnMut(&Self::Item) -> bool, + { + peeking_take_while::peeking_take_while(self, accept) + } + + /// Return an iterator adaptor that borrows from a `Clone`-able iterator + /// to only pick off elements while the predicate `accept` returns `true`. + /// + /// It uses the `Clone` trait to restore the original iterator so that the + /// last and rejected element (first `false`) is still available when + /// `take_while_ref` is done. + /// + /// ``` + /// use itertools::Itertools; + /// + /// let mut hexadecimals = "0123456789abcdef".chars(); + /// + /// let decimals = hexadecimals.take_while_ref(|c| c.is_numeric()) + /// .collect::(); + /// assert_eq!(decimals, "0123456789"); + /// assert_eq!(hexadecimals.next(), Some('a')); + /// + /// ``` + fn take_while_ref(&mut self, accept: F) -> TakeWhileRef + where Self: Clone, + F: FnMut(&Self::Item) -> bool + { + adaptors::take_while_ref(self, accept) + } + + /// Return an iterator adaptor that filters `Option` iterator elements + /// and produces `A`. Stops on the first `None` encountered. + /// + /// Iterator element type is `A`, the unwrapped element. + /// + /// ``` + /// use itertools::Itertools; + /// + /// // List all hexadecimal digits + /// itertools::assert_equal( + /// (0..).map(|i| std::char::from_digit(i, 16)).while_some(), + /// "0123456789abcdef".chars()); + /// + /// ``` + fn while_some(self) -> WhileSome + where Self: Sized + Iterator> + { + adaptors::while_some(self) + } + + /// Return an iterator adaptor that iterates over the combinations of the + /// elements from an iterator. + /// + /// Iterator element can be any homogeneous tuple of type `Self::Item` with + /// size up to 12. + /// + /// ``` + /// use itertools::Itertools; + /// + /// let mut v = Vec::new(); + /// for (a, b) in (1..5).tuple_combinations() { + /// v.push((a, b)); + /// } + /// assert_eq!(v, vec![(1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)]); + /// + /// let mut it = (1..5).tuple_combinations(); + /// assert_eq!(Some((1, 2, 3)), it.next()); + /// assert_eq!(Some((1, 2, 4)), it.next()); + /// assert_eq!(Some((1, 3, 4)), it.next()); + /// assert_eq!(Some((2, 3, 4)), it.next()); + /// assert_eq!(None, it.next()); + /// + /// // this requires a type hint + /// let it = (1..5).tuple_combinations::<(_, _, _)>(); + /// itertools::assert_equal(it, vec![(1, 2, 3), (1, 2, 4), (1, 3, 4), (2, 3, 4)]); + /// + /// // you can also specify the complete type + /// use itertools::TupleCombinations; + /// use std::ops::Range; + /// + /// let it: TupleCombinations, (u32, u32, u32)> = (1..5).tuple_combinations(); + /// itertools::assert_equal(it, vec![(1, 2, 3), (1, 2, 4), (1, 3, 4), (2, 3, 4)]); + /// ``` + fn tuple_combinations(self) -> TupleCombinations + where Self: Sized + Clone, + Self::Item: Clone, + T: adaptors::HasCombination, + { + adaptors::tuple_combinations(self) + } + + /// Return an iterator adaptor that iterates over the `k`-length combinations of + /// the elements from an iterator. + /// + /// Iterator element type is `Vec`. The iterator produces a new Vec per iteration, + /// and clones the iterator elements. + /// + /// ``` + /// use itertools::Itertools; + /// + /// let it = (1..5).combinations(3); + /// itertools::assert_equal(it, vec![ + /// vec![1, 2, 3], + /// vec![1, 2, 4], + /// vec![1, 3, 4], + /// vec![2, 3, 4], + /// ]); + /// ``` + /// + /// Note: Combinations does not take into account the equality of the iterated values. + /// ``` + /// use itertools::Itertools; + /// + /// let it = vec![1, 2, 2].into_iter().combinations(2); + /// itertools::assert_equal(it, vec![ + /// vec![1, 2], // Note: these are the same + /// vec![1, 2], // Note: these are the same + /// vec![2, 2], + /// ]); + /// ``` + #[cfg(feature = "use_alloc")] + fn combinations(self, k: usize) -> Combinations + where Self: Sized, + Self::Item: Clone + { + combinations::combinations(self, k) + } + + /// Return an iterator that iterates over the `k`-length combinations of + /// the elements from an iterator, with replacement. + /// + /// Iterator element type is `Vec`. The iterator produces a new Vec per iteration, + /// and clones the iterator elements. + /// + /// ``` + /// use itertools::Itertools; + /// + /// let it = (1..4).combinations_with_replacement(2); + /// itertools::assert_equal(it, vec![ + /// vec![1, 1], + /// vec![1, 2], + /// vec![1, 3], + /// vec![2, 2], + /// vec![2, 3], + /// vec![3, 3], + /// ]); + /// ``` + #[cfg(feature = "use_alloc")] + fn combinations_with_replacement(self, k: usize) -> CombinationsWithReplacement + where + Self: Sized, + Self::Item: Clone, + { + combinations_with_replacement::combinations_with_replacement(self, k) + } + + /// Return an iterator adaptor that iterates over all k-permutations of the + /// elements from an iterator. + /// + /// Iterator element type is `Vec` with length `k`. The iterator + /// produces a new Vec per iteration, and clones the iterator elements. + /// + /// If `k` is greater than the length of the input iterator, the resultant + /// iterator adaptor will be empty. + /// + /// ``` + /// use itertools::Itertools; + /// + /// let perms = (5..8).permutations(2); + /// itertools::assert_equal(perms, vec![ + /// vec![5, 6], + /// vec![5, 7], + /// vec![6, 5], + /// vec![6, 7], + /// vec![7, 5], + /// vec![7, 6], + /// ]); + /// ``` + /// + /// Note: Permutations does not take into account the equality of the iterated values. + /// + /// ``` + /// use itertools::Itertools; + /// + /// let it = vec![2, 2].into_iter().permutations(2); + /// itertools::assert_equal(it, vec![ + /// vec![2, 2], // Note: these are the same + /// vec![2, 2], // Note: these are the same + /// ]); + /// ``` + /// + /// Note: The source iterator is collected lazily, and will not be + /// re-iterated if the permutations adaptor is completed and re-iterated. + #[cfg(feature = "use_alloc")] + fn permutations(self, k: usize) -> Permutations + where Self: Sized, + Self::Item: Clone + { + permutations::permutations(self, k) + } + + /// Return an iterator that iterates through the powerset of the elements from an + /// iterator. + /// + /// Iterator element type is `Vec`. The iterator produces a new `Vec` + /// per iteration, and clones the iterator elements. + /// + /// The powerset of a set contains all subsets including the empty set and the full + /// input set. A powerset has length _2^n_ where _n_ is the length of the input + /// set. + /// + /// Each `Vec` produced by this iterator represents a subset of the elements + /// produced by the source iterator. + /// + /// ``` + /// use itertools::Itertools; + /// + /// let sets = (1..4).powerset().collect::>(); + /// itertools::assert_equal(sets, vec![ + /// vec![], + /// vec![1], + /// vec![2], + /// vec![3], + /// vec![1, 2], + /// vec![1, 3], + /// vec![2, 3], + /// vec![1, 2, 3], + /// ]); + /// ``` + #[cfg(feature = "use_alloc")] + fn powerset(self) -> Powerset + where Self: Sized, + Self::Item: Clone, + { + powerset::powerset(self) + } + + /// Return an iterator adaptor that pads the sequence to a minimum length of + /// `min` by filling missing elements using a closure `f`. + /// + /// Iterator element type is `Self::Item`. + /// + /// ``` + /// use itertools::Itertools; + /// + /// let it = (0..5).pad_using(10, |i| 2*i); + /// itertools::assert_equal(it, vec![0, 1, 2, 3, 4, 10, 12, 14, 16, 18]); + /// + /// let it = (0..10).pad_using(5, |i| 2*i); + /// itertools::assert_equal(it, vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9]); + /// + /// let it = (0..5).pad_using(10, |i| 2*i).rev(); + /// itertools::assert_equal(it, vec![18, 16, 14, 12, 10, 4, 3, 2, 1, 0]); + /// ``` + fn pad_using(self, min: usize, f: F) -> PadUsing + where Self: Sized, + F: FnMut(usize) -> Self::Item + { + pad_tail::pad_using(self, min, f) + } + + /// Return an iterator adaptor that wraps each element in a `Position` to + /// ease special-case handling of the first or last elements. + /// + /// Iterator element type is + /// [`Position`](Position) + /// + /// ``` + /// use itertools::{Itertools, Position}; + /// + /// let it = (0..4).with_position(); + /// itertools::assert_equal(it, + /// vec![Position::First(0), + /// Position::Middle(1), + /// Position::Middle(2), + /// Position::Last(3)]); + /// + /// let it = (0..1).with_position(); + /// itertools::assert_equal(it, vec![Position::Only(0)]); + /// ``` + fn with_position(self) -> WithPosition + where Self: Sized, + { + with_position::with_position(self) + } + + /// Return an iterator adaptor that yields the indices of all elements + /// satisfying a predicate, counted from the start of the iterator. + /// + /// Equivalent to `iter.enumerate().filter(|(_, v)| predicate(v)).map(|(i, _)| i)`. + /// + /// ``` + /// use itertools::Itertools; + /// + /// let data = vec![1, 2, 3, 3, 4, 6, 7, 9]; + /// itertools::assert_equal(data.iter().positions(|v| v % 2 == 0), vec![1, 4, 5]); + /// + /// itertools::assert_equal(data.iter().positions(|v| v % 2 == 1).rev(), vec![7, 6, 3, 2, 0]); + /// ``` + fn positions

(self, predicate: P) -> Positions + where Self: Sized, + P: FnMut(Self::Item) -> bool, + { + adaptors::positions(self, predicate) + } + + /// Return an iterator adaptor that applies a mutating function + /// to each element before yielding it. + /// + /// ``` + /// use itertools::Itertools; + /// + /// let input = vec![vec![1], vec![3, 2, 1]]; + /// let it = input.into_iter().update(|mut v| v.push(0)); + /// itertools::assert_equal(it, vec![vec![1, 0], vec![3, 2, 1, 0]]); + /// ``` + fn update(self, updater: F) -> Update + where Self: Sized, + F: FnMut(&mut Self::Item), + { + adaptors::update(self, updater) + } + + // non-adaptor methods + /// Advances the iterator and returns the next items grouped in a tuple of + /// a specific size (up to 12). + /// + /// If there are enough elements to be grouped in a tuple, then the tuple is + /// returned inside `Some`, otherwise `None` is returned. + /// + /// ``` + /// use itertools::Itertools; + /// + /// let mut iter = 1..5; + /// + /// assert_eq!(Some((1, 2)), iter.next_tuple()); + /// ``` + fn next_tuple(&mut self) -> Option + where Self: Sized + Iterator, + T: traits::HomogeneousTuple + { + T::collect_from_iter_no_buf(self) + } + + /// Collects all items from the iterator into a tuple of a specific size + /// (up to 12). + /// + /// If the number of elements inside the iterator is **exactly** equal to + /// the tuple size, then the tuple is returned inside `Some`, otherwise + /// `None` is returned. + /// + /// ``` + /// use itertools::Itertools; + /// + /// let iter = 1..3; + /// + /// if let Some((x, y)) = iter.collect_tuple() { + /// assert_eq!((x, y), (1, 2)) + /// } else { + /// panic!("Expected two elements") + /// } + /// ``` + fn collect_tuple(mut self) -> Option + where Self: Sized + Iterator, + T: traits::HomogeneousTuple + { + match self.next_tuple() { + elt @ Some(_) => match self.next() { + Some(_) => None, + None => elt, + }, + _ => None + } + } + + + /// Find the position and value of the first element satisfying a predicate. + /// + /// The iterator is not advanced past the first element found. + /// + /// ``` + /// use itertools::Itertools; + /// + /// let text = "Hα"; + /// assert_eq!(text.chars().find_position(|ch| ch.is_lowercase()), Some((1, 'α'))); + /// ``` + fn find_position

(&mut self, mut pred: P) -> Option<(usize, Self::Item)> + where P: FnMut(&Self::Item) -> bool + { + for (index, elt) in self.enumerate() { + if pred(&elt) { + return Some((index, elt)); + } + } + None + } + /// Find the value of the first element satisfying a predicate or return the last element, if any. + /// + /// The iterator is not advanced past the first element found. + /// + /// ``` + /// use itertools::Itertools; + /// + /// let numbers = [1, 2, 3, 4]; + /// assert_eq!(numbers.iter().find_or_last(|&&x| x > 5), Some(&4)); + /// assert_eq!(numbers.iter().find_or_last(|&&x| x > 2), Some(&3)); + /// assert_eq!(std::iter::empty::().find_or_last(|&x| x > 5), None); + /// ``` + fn find_or_last

(mut self, mut predicate: P) -> Option + where Self: Sized, + P: FnMut(&Self::Item) -> bool, + { + let mut prev = None; + self.find_map(|x| if predicate(&x) { Some(x) } else { prev = Some(x); None }) + .or(prev) + } + /// Find the value of the first element satisfying a predicate or return the first element, if any. + /// + /// The iterator is not advanced past the first element found. + /// + /// ``` + /// use itertools::Itertools; + /// + /// let numbers = [1, 2, 3, 4]; + /// assert_eq!(numbers.iter().find_or_first(|&&x| x > 5), Some(&1)); + /// assert_eq!(numbers.iter().find_or_first(|&&x| x > 2), Some(&3)); + /// assert_eq!(std::iter::empty::().find_or_first(|&x| x > 5), None); + /// ``` + fn find_or_first

(mut self, mut predicate: P) -> Option + where Self: Sized, + P: FnMut(&Self::Item) -> bool, + { + let first = self.next()?; + Some(if predicate(&first) { + first + } else { + self.find(|x| predicate(x)).unwrap_or(first) + }) + } + /// Returns `true` if the given item is present in this iterator. + /// + /// This method is short-circuiting. If the given item is present in this + /// iterator, this method will consume the iterator up-to-and-including + /// the item. If the given item is not present in this iterator, the + /// iterator will be exhausted. + /// + /// ``` + /// use itertools::Itertools; + /// + /// #[derive(PartialEq, Debug)] + /// enum Enum { A, B, C, D, E, } + /// + /// let mut iter = vec![Enum::A, Enum::B, Enum::C, Enum::D].into_iter(); + /// + /// // search `iter` for `B` + /// assert_eq!(iter.contains(&Enum::B), true); + /// // `B` was found, so the iterator now rests at the item after `B` (i.e, `C`). + /// assert_eq!(iter.next(), Some(Enum::C)); + /// + /// // search `iter` for `E` + /// assert_eq!(iter.contains(&Enum::E), false); + /// // `E` wasn't found, so `iter` is now exhausted + /// assert_eq!(iter.next(), None); + /// ``` + fn contains(&mut self, query: &Q) -> bool + where + Self: Sized, + Self::Item: Borrow, + Q: PartialEq, + { + self.any(|x| x.borrow() == query) + } + + /// Check whether all elements compare equal. + /// + /// Empty iterators are considered to have equal elements: + /// + /// ``` + /// use itertools::Itertools; + /// + /// let data = vec![1, 1, 1, 2, 2, 3, 3, 3, 4, 5, 5]; + /// assert!(!data.iter().all_equal()); + /// assert!(data[0..3].iter().all_equal()); + /// assert!(data[3..5].iter().all_equal()); + /// assert!(data[5..8].iter().all_equal()); + /// + /// let data : Option = None; + /// assert!(data.into_iter().all_equal()); + /// ``` + fn all_equal(&mut self) -> bool + where Self: Sized, + Self::Item: PartialEq, + { + match self.next() { + None => true, + Some(a) => self.all(|x| a == x), + } + } + + /// Check whether all elements are unique (non equal). + /// + /// Empty iterators are considered to have unique elements: + /// + /// ``` + /// use itertools::Itertools; + /// + /// let data = vec![1, 2, 3, 4, 1, 5]; + /// assert!(!data.iter().all_unique()); + /// assert!(data[0..4].iter().all_unique()); + /// assert!(data[1..6].iter().all_unique()); + /// + /// let data : Option = None; + /// assert!(data.into_iter().all_unique()); + /// ``` + #[cfg(feature = "use_std")] + fn all_unique(&mut self) -> bool + where Self: Sized, + Self::Item: Eq + Hash + { + let mut used = HashSet::new(); + self.all(move |elt| used.insert(elt)) + } + + /// Consume the first `n` elements from the iterator eagerly, + /// and return the same iterator again. + /// + /// It works similarly to *.skip(* `n` *)* except it is eager and + /// preserves the iterator type. + /// + /// ``` + /// use itertools::Itertools; + /// + /// let mut iter = "αβγ".chars().dropping(2); + /// itertools::assert_equal(iter, "γ".chars()); + /// ``` + /// + /// *Fusing notes: if the iterator is exhausted by dropping, + /// the result of calling `.next()` again depends on the iterator implementation.* + fn dropping(mut self, n: usize) -> Self + where Self: Sized + { + if n > 0 { + self.nth(n - 1); + } + self + } + + /// Consume the last `n` elements from the iterator eagerly, + /// and return the same iterator again. + /// + /// This is only possible on double ended iterators. `n` may be + /// larger than the number of elements. + /// + /// Note: This method is eager, dropping the back elements immediately and + /// preserves the iterator type. + /// + /// ``` + /// use itertools::Itertools; + /// + /// let init = vec![0, 3, 6, 9].into_iter().dropping_back(1); + /// itertools::assert_equal(init, vec![0, 3, 6]); + /// ``` + fn dropping_back(mut self, n: usize) -> Self + where Self: Sized, + Self: DoubleEndedIterator + { + if n > 0 { + (&mut self).rev().nth(n - 1); + } + self + } + + /// Run the closure `f` eagerly on each element of the iterator. + /// + /// Consumes the iterator until its end. + /// + /// ``` + /// use std::sync::mpsc::channel; + /// use itertools::Itertools; + /// + /// let (tx, rx) = channel(); + /// + /// // use .foreach() to apply a function to each value -- sending it + /// (0..5).map(|x| x * 2 + 1).foreach(|x| { tx.send(x).unwrap(); } ); + /// + /// drop(tx); + /// + /// itertools::assert_equal(rx.iter(), vec![1, 3, 5, 7, 9]); + /// ``` + #[deprecated(note="Use .for_each() instead", since="0.8.0")] + fn foreach(self, f: F) + where F: FnMut(Self::Item), + Self: Sized, + { + self.for_each(f); + } + + /// Combine all an iterator's elements into one element by using [`Extend`]. + /// + /// This combinator will extend the first item with each of the rest of the + /// items of the iterator. If the iterator is empty, the default value of + /// `I::Item` is returned. + /// + /// ```rust + /// use itertools::Itertools; + /// + /// let input = vec![vec![1], vec![2, 3], vec![4, 5, 6]]; + /// assert_eq!(input.into_iter().concat(), + /// vec![1, 2, 3, 4, 5, 6]); + /// ``` + fn concat(self) -> Self::Item + where Self: Sized, + Self::Item: Extend<<::Item as IntoIterator>::Item> + IntoIterator + Default + { + concat(self) + } + + /// `.collect_vec()` is simply a type specialization of [`Iterator::collect`], + /// for convenience. + #[cfg(feature = "use_alloc")] + fn collect_vec(self) -> Vec + where Self: Sized + { + self.collect() + } + + /// `.try_collect()` is more convenient way of writing + /// `.collect::>()` + /// + /// # Example + /// + /// ``` + /// use std::{fs, io}; + /// use itertools::Itertools; + /// + /// fn process_dir_entries(entries: &[fs::DirEntry]) { + /// // ... + /// } + /// + /// fn do_stuff() -> std::io::Result<()> { + /// let entries: Vec<_> = fs::read_dir(".")?.try_collect()?; + /// process_dir_entries(&entries); + /// + /// Ok(()) + /// } + /// ``` + #[cfg(feature = "use_alloc")] + fn try_collect(self) -> Result + where + Self: Sized + Iterator>, + Result: FromIterator>, + { + self.collect() + } + + /// Assign to each reference in `self` from the `from` iterator, + /// stopping at the shortest of the two iterators. + /// + /// The `from` iterator is queried for its next element before the `self` + /// iterator, and if either is exhausted the method is done. + /// + /// Return the number of elements written. + /// + /// ``` + /// use itertools::Itertools; + /// + /// let mut xs = [0; 4]; + /// xs.iter_mut().set_from(1..); + /// assert_eq!(xs, [1, 2, 3, 4]); + /// ``` + #[inline] + fn set_from<'a, A: 'a, J>(&mut self, from: J) -> usize + where Self: Iterator, + J: IntoIterator + { + let mut count = 0; + for elt in from { + match self.next() { + None => break, + Some(ptr) => *ptr = elt, + } + count += 1; + } + count + } + + /// Combine all iterator elements into one String, separated by `sep`. + /// + /// Use the `Display` implementation of each element. + /// + /// ``` + /// use itertools::Itertools; + /// + /// assert_eq!(["a", "b", "c"].iter().join(", "), "a, b, c"); + /// assert_eq!([1, 2, 3].iter().join(", "), "1, 2, 3"); + /// ``` + #[cfg(feature = "use_alloc")] + fn join(&mut self, sep: &str) -> String + where Self::Item: std::fmt::Display + { + match self.next() { + None => String::new(), + Some(first_elt) => { + // estimate lower bound of capacity needed + let (lower, _) = self.size_hint(); + let mut result = String::with_capacity(sep.len() * lower); + write!(&mut result, "{}", first_elt).unwrap(); + self.for_each(|elt| { + result.push_str(sep); + write!(&mut result, "{}", elt).unwrap(); + }); + result + } + } + } + + /// Format all iterator elements, separated by `sep`. + /// + /// All elements are formatted (any formatting trait) + /// with `sep` inserted between each element. + /// + /// **Panics** if the formatter helper is formatted more than once. + /// + /// ``` + /// use itertools::Itertools; + /// + /// let data = [1.1, 2.71828, -3.]; + /// assert_eq!( + /// format!("{:.2}", data.iter().format(", ")), + /// "1.10, 2.72, -3.00"); + /// ``` + fn format(self, sep: &str) -> Format + where Self: Sized, + { + format::new_format_default(self, sep) + } + + /// Format all iterator elements, separated by `sep`. + /// + /// This is a customizable version of [`.format()`](Itertools::format). + /// + /// The supplied closure `format` is called once per iterator element, + /// with two arguments: the element and a callback that takes a + /// `&Display` value, i.e. any reference to type that implements `Display`. + /// + /// Using `&format_args!(...)` is the most versatile way to apply custom + /// element formatting. The callback can be called multiple times if needed. + /// + /// **Panics** if the formatter helper is formatted more than once. + /// + /// ``` + /// use itertools::Itertools; + /// + /// let data = [1.1, 2.71828, -3.]; + /// let data_formatter = data.iter().format_with(", ", |elt, f| f(&format_args!("{:.2}", elt))); + /// assert_eq!(format!("{}", data_formatter), + /// "1.10, 2.72, -3.00"); + /// + /// // .format_with() is recursively composable + /// let matrix = [[1., 2., 3.], + /// [4., 5., 6.]]; + /// let matrix_formatter = matrix.iter().format_with("\n", |row, f| { + /// f(&row.iter().format_with(", ", |elt, g| g(&elt))) + /// }); + /// assert_eq!(format!("{}", matrix_formatter), + /// "1, 2, 3\n4, 5, 6"); + /// + /// + /// ``` + fn format_with(self, sep: &str, format: F) -> FormatWith + where Self: Sized, + F: FnMut(Self::Item, &mut dyn FnMut(&dyn fmt::Display) -> fmt::Result) -> fmt::Result, + { + format::new_format(self, sep, format) + } + + /// See [`.fold_ok()`](Itertools::fold_ok). + #[deprecated(note="Use .fold_ok() instead", since="0.10.0")] + fn fold_results(&mut self, start: B, f: F) -> Result + where Self: Iterator>, + F: FnMut(B, A) -> B + { + self.fold_ok(start, f) + } + + /// Fold `Result` values from an iterator. + /// + /// Only `Ok` values are folded. If no error is encountered, the folded + /// value is returned inside `Ok`. Otherwise, the operation terminates + /// and returns the first `Err` value it encounters. No iterator elements are + /// consumed after the first error. + /// + /// The first accumulator value is the `start` parameter. + /// Each iteration passes the accumulator value and the next value inside `Ok` + /// to the fold function `f` and its return value becomes the new accumulator value. + /// + /// For example the sequence *Ok(1), Ok(2), Ok(3)* will result in a + /// computation like this: + /// + /// ```ignore + /// let mut accum = start; + /// accum = f(accum, 1); + /// accum = f(accum, 2); + /// accum = f(accum, 3); + /// ``` + /// + /// With a `start` value of 0 and an addition as folding function, + /// this effectively results in *((0 + 1) + 2) + 3* + /// + /// ``` + /// use std::ops::Add; + /// use itertools::Itertools; + /// + /// let values = [1, 2, -2, -1, 2, 1]; + /// assert_eq!( + /// values.iter() + /// .map(Ok::<_, ()>) + /// .fold_ok(0, Add::add), + /// Ok(3) + /// ); + /// assert!( + /// values.iter() + /// .map(|&x| if x >= 0 { Ok(x) } else { Err("Negative number") }) + /// .fold_ok(0, Add::add) + /// .is_err() + /// ); + /// ``` + fn fold_ok(&mut self, mut start: B, mut f: F) -> Result + where Self: Iterator>, + F: FnMut(B, A) -> B + { + for elt in self { + match elt { + Ok(v) => start = f(start, v), + Err(u) => return Err(u), + } + } + Ok(start) + } + + /// Fold `Option` values from an iterator. + /// + /// Only `Some` values are folded. If no `None` is encountered, the folded + /// value is returned inside `Some`. Otherwise, the operation terminates + /// and returns `None`. No iterator elements are consumed after the `None`. + /// + /// This is the `Option` equivalent to [`fold_ok`](Itertools::fold_ok). + /// + /// ``` + /// use std::ops::Add; + /// use itertools::Itertools; + /// + /// let mut values = vec![Some(1), Some(2), Some(-2)].into_iter(); + /// assert_eq!(values.fold_options(5, Add::add), Some(5 + 1 + 2 - 2)); + /// + /// let mut more_values = vec![Some(2), None, Some(0)].into_iter(); + /// assert!(more_values.fold_options(0, Add::add).is_none()); + /// assert_eq!(more_values.next().unwrap(), Some(0)); + /// ``` + fn fold_options(&mut self, mut start: B, mut f: F) -> Option + where Self: Iterator>, + F: FnMut(B, A) -> B + { + for elt in self { + match elt { + Some(v) => start = f(start, v), + None => return None, + } + } + Some(start) + } + + /// Accumulator of the elements in the iterator. + /// + /// Like `.fold()`, without a base case. If the iterator is + /// empty, return `None`. With just one element, return it. + /// Otherwise elements are accumulated in sequence using the closure `f`. + /// + /// ``` + /// use itertools::Itertools; + /// + /// assert_eq!((0..10).fold1(|x, y| x + y).unwrap_or(0), 45); + /// assert_eq!((0..0).fold1(|x, y| x * y), None); + /// ``` + #[deprecated(since = "0.10.2", note = "Use `Iterator::reduce` instead")] + fn fold1(mut self, f: F) -> Option + where F: FnMut(Self::Item, Self::Item) -> Self::Item, + Self: Sized, + { + self.next().map(move |x| self.fold(x, f)) + } + + /// Accumulate the elements in the iterator in a tree-like manner. + /// + /// You can think of it as, while there's more than one item, repeatedly + /// combining adjacent items. It does so in bottom-up-merge-sort order, + /// however, so that it needs only logarithmic stack space. + /// + /// This produces a call tree like the following (where the calls under + /// an item are done after reading that item): + /// + /// ```text + /// 1 2 3 4 5 6 7 + /// │ │ │ │ │ │ │ + /// └─f └─f └─f │ + /// │ │ │ │ + /// └───f └─f + /// │ │ + /// └─────f + /// ``` + /// + /// Which, for non-associative functions, will typically produce a different + /// result than the linear call tree used by [`Iterator::reduce`]: + /// + /// ```text + /// 1 2 3 4 5 6 7 + /// │ │ │ │ │ │ │ + /// └─f─f─f─f─f─f + /// ``` + /// + /// If `f` is associative, prefer the normal [`Iterator::reduce`] instead. + /// + /// ``` + /// use itertools::Itertools; + /// + /// // The same tree as above + /// let num_strings = (1..8).map(|x| x.to_string()); + /// assert_eq!(num_strings.tree_fold1(|x, y| format!("f({}, {})", x, y)), + /// Some(String::from("f(f(f(1, 2), f(3, 4)), f(f(5, 6), 7))"))); + /// + /// // Like fold1, an empty iterator produces None + /// assert_eq!((0..0).tree_fold1(|x, y| x * y), None); + /// + /// // tree_fold1 matches fold1 for associative operations... + /// assert_eq!((0..10).tree_fold1(|x, y| x + y), + /// (0..10).fold1(|x, y| x + y)); + /// // ...but not for non-associative ones + /// assert_ne!((0..10).tree_fold1(|x, y| x - y), + /// (0..10).fold1(|x, y| x - y)); + /// ``` + fn tree_fold1(mut self, mut f: F) -> Option + where F: FnMut(Self::Item, Self::Item) -> Self::Item, + Self: Sized, + { + type State = Result>; + + fn inner0(it: &mut II, f: &mut FF) -> State + where + II: Iterator, + FF: FnMut(T, T) -> T + { + // This function could be replaced with `it.next().ok_or(None)`, + // but half the useful tree_fold1 work is combining adjacent items, + // so put that in a form that LLVM is more likely to optimize well. + + let a = + if let Some(v) = it.next() { v } + else { return Err(None) }; + let b = + if let Some(v) = it.next() { v } + else { return Err(Some(a)) }; + Ok(f(a, b)) + } + + fn inner(stop: usize, it: &mut II, f: &mut FF) -> State + where + II: Iterator, + FF: FnMut(T, T) -> T + { + let mut x = inner0(it, f)?; + for height in 0..stop { + // Try to get another tree the same size with which to combine it, + // creating a new tree that's twice as big for next time around. + let next = + if height == 0 { + inner0(it, f) + } else { + inner(height, it, f) + }; + match next { + Ok(y) => x = f(x, y), + + // If we ran out of items, combine whatever we did manage + // to get. It's better combined with the current value + // than something in a parent frame, because the tree in + // the parent is always as least as big as this one. + Err(None) => return Err(Some(x)), + Err(Some(y)) => return Err(Some(f(x, y))), + } + } + Ok(x) + } + + match inner(usize::max_value(), &mut self, &mut f) { + Err(x) => x, + _ => unreachable!(), + } + } + + /// An iterator method that applies a function, producing a single, final value. + /// + /// `fold_while()` is basically equivalent to [`Iterator::fold`] but with additional support for + /// early exit via short-circuiting. + /// + /// ``` + /// use itertools::Itertools; + /// use itertools::FoldWhile::{Continue, Done}; + /// + /// let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; + /// + /// let mut result = 0; + /// + /// // for loop: + /// for i in &numbers { + /// if *i > 5 { + /// break; + /// } + /// result = result + i; + /// } + /// + /// // fold: + /// let result2 = numbers.iter().fold(0, |acc, x| { + /// if *x > 5 { acc } else { acc + x } + /// }); + /// + /// // fold_while: + /// let result3 = numbers.iter().fold_while(0, |acc, x| { + /// if *x > 5 { Done(acc) } else { Continue(acc + x) } + /// }).into_inner(); + /// + /// // they're the same + /// assert_eq!(result, result2); + /// assert_eq!(result2, result3); + /// ``` + /// + /// The big difference between the computations of `result2` and `result3` is that while + /// `fold()` called the provided closure for every item of the callee iterator, + /// `fold_while()` actually stopped iterating as soon as it encountered `Fold::Done(_)`. + fn fold_while(&mut self, init: B, mut f: F) -> FoldWhile + where Self: Sized, + F: FnMut(B, Self::Item) -> FoldWhile + { + use Result::{ + Ok as Continue, + Err as Break, + }; + + let result = self.try_fold(init, #[inline(always)] |acc, v| + match f(acc, v) { + FoldWhile::Continue(acc) => Continue(acc), + FoldWhile::Done(acc) => Break(acc), + } + ); + + match result { + Continue(acc) => FoldWhile::Continue(acc), + Break(acc) => FoldWhile::Done(acc), + } + } + + /// Iterate over the entire iterator and add all the elements. + /// + /// An empty iterator returns `None`, otherwise `Some(sum)`. + /// + /// # Panics + /// + /// When calling `sum1()` and a primitive integer type is being returned, this + /// method will panic if the computation overflows and debug assertions are + /// enabled. + /// + /// # Examples + /// + /// ``` + /// use itertools::Itertools; + /// + /// let empty_sum = (1..1).sum1::(); + /// assert_eq!(empty_sum, None); + /// + /// let nonempty_sum = (1..11).sum1::(); + /// assert_eq!(nonempty_sum, Some(55)); + /// ``` + fn sum1(mut self) -> Option + where Self: Sized, + S: std::iter::Sum, + { + self.next() + .map(|first| once(first).chain(self).sum()) + } + + /// Iterate over the entire iterator and multiply all the elements. + /// + /// An empty iterator returns `None`, otherwise `Some(product)`. + /// + /// # Panics + /// + /// When calling `product1()` and a primitive integer type is being returned, + /// method will panic if the computation overflows and debug assertions are + /// enabled. + /// + /// # Examples + /// ``` + /// use itertools::Itertools; + /// + /// let empty_product = (1..1).product1::(); + /// assert_eq!(empty_product, None); + /// + /// let nonempty_product = (1..11).product1::(); + /// assert_eq!(nonempty_product, Some(3628800)); + /// ``` + fn product1

(mut self) -> Option

+ where Self: Sized, + P: std::iter::Product, + { + self.next() + .map(|first| once(first).chain(self).product()) + } + + /// Sort all iterator elements into a new iterator in ascending order. + /// + /// **Note:** This consumes the entire iterator, uses the + /// [`slice::sort_unstable`] method and returns the result as a new + /// iterator that owns its elements. + /// + /// The sorted iterator, if directly collected to a `Vec`, is converted + /// without any extra copying or allocation cost. + /// + /// ``` + /// use itertools::Itertools; + /// + /// // sort the letters of the text in ascending order + /// let text = "bdacfe"; + /// itertools::assert_equal(text.chars().sorted_unstable(), + /// "abcdef".chars()); + /// ``` + #[cfg(feature = "use_alloc")] + fn sorted_unstable(self) -> VecIntoIter + where Self: Sized, + Self::Item: Ord + { + // Use .sort_unstable() directly since it is not quite identical with + // .sort_by(Ord::cmp) + let mut v = Vec::from_iter(self); + v.sort_unstable(); + v.into_iter() + } + + /// Sort all iterator elements into a new iterator in ascending order. + /// + /// **Note:** This consumes the entire iterator, uses the + /// [`slice::sort_unstable_by`] method and returns the result as a new + /// iterator that owns its elements. + /// + /// The sorted iterator, if directly collected to a `Vec`, is converted + /// without any extra copying or allocation cost. + /// + /// ``` + /// use itertools::Itertools; + /// + /// // sort people in descending order by age + /// let people = vec![("Jane", 20), ("John", 18), ("Jill", 30), ("Jack", 27)]; + /// + /// let oldest_people_first = people + /// .into_iter() + /// .sorted_unstable_by(|a, b| Ord::cmp(&b.1, &a.1)) + /// .map(|(person, _age)| person); + /// + /// itertools::assert_equal(oldest_people_first, + /// vec!["Jill", "Jack", "Jane", "John"]); + /// ``` + #[cfg(feature = "use_alloc")] + fn sorted_unstable_by(self, cmp: F) -> VecIntoIter + where Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering, + { + let mut v = Vec::from_iter(self); + v.sort_unstable_by(cmp); + v.into_iter() + } + + /// Sort all iterator elements into a new iterator in ascending order. + /// + /// **Note:** This consumes the entire iterator, uses the + /// [`slice::sort_unstable_by_key`] method and returns the result as a new + /// iterator that owns its elements. + /// + /// The sorted iterator, if directly collected to a `Vec`, is converted + /// without any extra copying or allocation cost. + /// + /// ``` + /// use itertools::Itertools; + /// + /// // sort people in descending order by age + /// let people = vec![("Jane", 20), ("John", 18), ("Jill", 30), ("Jack", 27)]; + /// + /// let oldest_people_first = people + /// .into_iter() + /// .sorted_unstable_by_key(|x| -x.1) + /// .map(|(person, _age)| person); + /// + /// itertools::assert_equal(oldest_people_first, + /// vec!["Jill", "Jack", "Jane", "John"]); + /// ``` + #[cfg(feature = "use_alloc")] + fn sorted_unstable_by_key(self, f: F) -> VecIntoIter + where Self: Sized, + K: Ord, + F: FnMut(&Self::Item) -> K, + { + let mut v = Vec::from_iter(self); + v.sort_unstable_by_key(f); + v.into_iter() + } + + /// Sort all iterator elements into a new iterator in ascending order. + /// + /// **Note:** This consumes the entire iterator, uses the + /// [`slice::sort`] method and returns the result as a new + /// iterator that owns its elements. + /// + /// The sorted iterator, if directly collected to a `Vec`, is converted + /// without any extra copying or allocation cost. + /// + /// ``` + /// use itertools::Itertools; + /// + /// // sort the letters of the text in ascending order + /// let text = "bdacfe"; + /// itertools::assert_equal(text.chars().sorted(), + /// "abcdef".chars()); + /// ``` + #[cfg(feature = "use_alloc")] + fn sorted(self) -> VecIntoIter + where Self: Sized, + Self::Item: Ord + { + // Use .sort() directly since it is not quite identical with + // .sort_by(Ord::cmp) + let mut v = Vec::from_iter(self); + v.sort(); + v.into_iter() + } + + /// Sort all iterator elements into a new iterator in ascending order. + /// + /// **Note:** This consumes the entire iterator, uses the + /// [`slice::sort_by`] method and returns the result as a new + /// iterator that owns its elements. + /// + /// The sorted iterator, if directly collected to a `Vec`, is converted + /// without any extra copying or allocation cost. + /// + /// ``` + /// use itertools::Itertools; + /// + /// // sort people in descending order by age + /// let people = vec![("Jane", 20), ("John", 18), ("Jill", 30), ("Jack", 27)]; + /// + /// let oldest_people_first = people + /// .into_iter() + /// .sorted_by(|a, b| Ord::cmp(&b.1, &a.1)) + /// .map(|(person, _age)| person); + /// + /// itertools::assert_equal(oldest_people_first, + /// vec!["Jill", "Jack", "Jane", "John"]); + /// ``` + #[cfg(feature = "use_alloc")] + fn sorted_by(self, cmp: F) -> VecIntoIter + where Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering, + { + let mut v = Vec::from_iter(self); + v.sort_by(cmp); + v.into_iter() + } + + /// Sort all iterator elements into a new iterator in ascending order. + /// + /// **Note:** This consumes the entire iterator, uses the + /// [`slice::sort_by_key`] method and returns the result as a new + /// iterator that owns its elements. + /// + /// The sorted iterator, if directly collected to a `Vec`, is converted + /// without any extra copying or allocation cost. + /// + /// ``` + /// use itertools::Itertools; + /// + /// // sort people in descending order by age + /// let people = vec![("Jane", 20), ("John", 18), ("Jill", 30), ("Jack", 27)]; + /// + /// let oldest_people_first = people + /// .into_iter() + /// .sorted_by_key(|x| -x.1) + /// .map(|(person, _age)| person); + /// + /// itertools::assert_equal(oldest_people_first, + /// vec!["Jill", "Jack", "Jane", "John"]); + /// ``` + #[cfg(feature = "use_alloc")] + fn sorted_by_key(self, f: F) -> VecIntoIter + where Self: Sized, + K: Ord, + F: FnMut(&Self::Item) -> K, + { + let mut v = Vec::from_iter(self); + v.sort_by_key(f); + v.into_iter() + } + + /// Sort all iterator elements into a new iterator in ascending order. The key function is + /// called exactly once per key. + /// + /// **Note:** This consumes the entire iterator, uses the + /// [`slice::sort_by_cached_key`] method and returns the result as a new + /// iterator that owns its elements. + /// + /// The sorted iterator, if directly collected to a `Vec`, is converted + /// without any extra copying or allocation cost. + /// + /// ``` + /// use itertools::Itertools; + /// + /// // sort people in descending order by age + /// let people = vec![("Jane", 20), ("John", 18), ("Jill", 30), ("Jack", 27)]; + /// + /// let oldest_people_first = people + /// .into_iter() + /// .sorted_by_cached_key(|x| -x.1) + /// .map(|(person, _age)| person); + /// + /// itertools::assert_equal(oldest_people_first, + /// vec!["Jill", "Jack", "Jane", "John"]); + /// ``` + #[cfg(feature = "use_alloc")] + fn sorted_by_cached_key(self, f: F) -> VecIntoIter + where + Self: Sized, + K: Ord, + F: FnMut(&Self::Item) -> K, + { + let mut v = Vec::from_iter(self); + v.sort_by_cached_key(f); + v.into_iter() + } + + /// Sort the k smallest elements into a new iterator, in ascending order. + /// + /// **Note:** This consumes the entire iterator, and returns the result + /// as a new iterator that owns its elements. If the input contains + /// less than k elements, the result is equivalent to `self.sorted()`. + /// + /// This is guaranteed to use `k * sizeof(Self::Item) + O(1)` memory + /// and `O(n log k)` time, with `n` the number of elements in the input. + /// + /// The sorted iterator, if directly collected to a `Vec`, is converted + /// without any extra copying or allocation cost. + /// + /// **Note:** This is functionally-equivalent to `self.sorted().take(k)` + /// but much more efficient. + /// + /// ``` + /// use itertools::Itertools; + /// + /// // A random permutation of 0..15 + /// let numbers = vec![6, 9, 1, 14, 0, 4, 8, 7, 11, 2, 10, 3, 13, 12, 5]; + /// + /// let five_smallest = numbers + /// .into_iter() + /// .k_smallest(5); + /// + /// itertools::assert_equal(five_smallest, 0..5); + /// ``` + #[cfg(feature = "use_alloc")] + fn k_smallest(self, k: usize) -> VecIntoIter + where Self: Sized, + Self::Item: Ord + { + crate::k_smallest::k_smallest(self, k) + .into_sorted_vec() + .into_iter() + } + + /// Collect all iterator elements into one of two + /// partitions. Unlike [`Iterator::partition`], each partition may + /// have a distinct type. + /// + /// ``` + /// use itertools::{Itertools, Either}; + /// + /// let successes_and_failures = vec![Ok(1), Err(false), Err(true), Ok(2)]; + /// + /// let (successes, failures): (Vec<_>, Vec<_>) = successes_and_failures + /// .into_iter() + /// .partition_map(|r| { + /// match r { + /// Ok(v) => Either::Left(v), + /// Err(v) => Either::Right(v), + /// } + /// }); + /// + /// assert_eq!(successes, [1, 2]); + /// assert_eq!(failures, [false, true]); + /// ``` + fn partition_map(self, mut predicate: F) -> (A, B) + where Self: Sized, + F: FnMut(Self::Item) -> Either, + A: Default + Extend, + B: Default + Extend, + { + let mut left = A::default(); + let mut right = B::default(); + + self.for_each(|val| match predicate(val) { + Either::Left(v) => left.extend(Some(v)), + Either::Right(v) => right.extend(Some(v)), + }); + + (left, right) + } + + /// Partition a sequence of `Result`s into one list of all the `Ok` elements + /// and another list of all the `Err` elements. + /// + /// ``` + /// use itertools::Itertools; + /// + /// let successes_and_failures = vec![Ok(1), Err(false), Err(true), Ok(2)]; + /// + /// let (successes, failures): (Vec<_>, Vec<_>) = successes_and_failures + /// .into_iter() + /// .partition_result(); + /// + /// assert_eq!(successes, [1, 2]); + /// assert_eq!(failures, [false, true]); + /// ``` + fn partition_result(self) -> (A, B) + where + Self: Iterator> + Sized, + A: Default + Extend, + B: Default + Extend, + { + self.partition_map(|r| match r { + Ok(v) => Either::Left(v), + Err(v) => Either::Right(v), + }) + } + + /// Return a `HashMap` of keys mapped to `Vec`s of values. Keys and values + /// are taken from `(Key, Value)` tuple pairs yielded by the input iterator. + /// + /// Essentially a shorthand for `.into_grouping_map().collect::>()`. + /// + /// ``` + /// use itertools::Itertools; + /// + /// let data = vec![(0, 10), (2, 12), (3, 13), (0, 20), (3, 33), (2, 42)]; + /// let lookup = data.into_iter().into_group_map(); + /// + /// assert_eq!(lookup[&0], vec![10, 20]); + /// assert_eq!(lookup.get(&1), None); + /// assert_eq!(lookup[&2], vec![12, 42]); + /// assert_eq!(lookup[&3], vec![13, 33]); + /// ``` + #[cfg(feature = "use_std")] + fn into_group_map(self) -> HashMap> + where Self: Iterator + Sized, + K: Hash + Eq, + { + group_map::into_group_map(self) + } + + /// Return an `Iterator` on a `HashMap`. Keys mapped to `Vec`s of values. The key is specified + /// in the closure. + /// + /// Essentially a shorthand for `.into_grouping_map_by(f).collect::>()`. + /// + /// ``` + /// use itertools::Itertools; + /// use std::collections::HashMap; + /// + /// let data = vec![(0, 10), (2, 12), (3, 13), (0, 20), (3, 33), (2, 42)]; + /// let lookup: HashMap> = + /// data.clone().into_iter().into_group_map_by(|a| a.0); + /// + /// assert_eq!(lookup[&0], vec![(0,10),(0,20)]); + /// assert_eq!(lookup.get(&1), None); + /// assert_eq!(lookup[&2], vec![(2,12), (2,42)]); + /// assert_eq!(lookup[&3], vec![(3,13), (3,33)]); + /// + /// assert_eq!( + /// data.into_iter() + /// .into_group_map_by(|x| x.0) + /// .into_iter() + /// .map(|(key, values)| (key, values.into_iter().fold(0,|acc, (_,v)| acc + v ))) + /// .collect::>()[&0], + /// 30, + /// ); + /// ``` + #[cfg(feature = "use_std")] + fn into_group_map_by(self, f: F) -> HashMap> + where + Self: Iterator + Sized, + K: Hash + Eq, + F: Fn(&V) -> K, + { + group_map::into_group_map_by(self, f) + } + + /// Constructs a `GroupingMap` to be used later with one of the efficient + /// group-and-fold operations it allows to perform. + /// + /// The input iterator must yield item in the form of `(K, V)` where the + /// value of type `K` will be used as key to identify the groups and the + /// value of type `V` as value for the folding operation. + /// + /// See [`GroupingMap`] for more informations + /// on what operations are available. + #[cfg(feature = "use_std")] + fn into_grouping_map(self) -> GroupingMap + where Self: Iterator + Sized, + K: Hash + Eq, + { + grouping_map::new(self) + } + + /// Constructs a `GroupingMap` to be used later with one of the efficient + /// group-and-fold operations it allows to perform. + /// + /// The values from this iterator will be used as values for the folding operation + /// while the keys will be obtained from the values by calling `key_mapper`. + /// + /// See [`GroupingMap`] for more informations + /// on what operations are available. + #[cfg(feature = "use_std")] + fn into_grouping_map_by(self, key_mapper: F) -> GroupingMapBy + where Self: Iterator + Sized, + K: Hash + Eq, + F: FnMut(&V) -> K + { + grouping_map::new(grouping_map::MapForGrouping::new(self, key_mapper)) + } + + /// Return all minimum elements of an iterator. + /// + /// # Examples + /// + /// ``` + /// use itertools::Itertools; + /// + /// let a: [i32; 0] = []; + /// assert_eq!(a.iter().min_set(), Vec::<&i32>::new()); + /// + /// let a = [1]; + /// assert_eq!(a.iter().min_set(), vec![&1]); + /// + /// let a = [1, 2, 3, 4, 5]; + /// assert_eq!(a.iter().min_set(), vec![&1]); + /// + /// let a = [1, 1, 1, 1]; + /// assert_eq!(a.iter().min_set(), vec![&1, &1, &1, &1]); + /// ``` + /// + /// The elements can be floats but no particular result is guaranteed + /// if an element is NaN. + #[cfg(feature = "use_std")] + fn min_set(self) -> Vec + where Self: Sized, Self::Item: Ord + { + extrema_set::min_set_impl(self, |_| (), |x, y, _, _| x.cmp(y)) + } + + /// Return all minimum elements of an iterator, as determined by + /// the specified function. + /// + /// # Examples + /// + /// ``` + /// # use std::cmp::Ordering; + /// use itertools::Itertools; + /// + /// let a: [(i32, i32); 0] = []; + /// assert_eq!(a.iter().min_set_by(|_, _| Ordering::Equal), Vec::<&(i32, i32)>::new()); + /// + /// let a = [(1, 2)]; + /// assert_eq!(a.iter().min_set_by(|&&(k1,_), &&(k2, _)| k1.cmp(&k2)), vec![&(1, 2)]); + /// + /// let a = [(1, 2), (2, 2), (3, 9), (4, 8), (5, 9)]; + /// assert_eq!(a.iter().min_set_by(|&&(_,k1), &&(_,k2)| k1.cmp(&k2)), vec![&(1, 2), &(2, 2)]); + /// + /// let a = [(1, 2), (1, 3), (1, 4), (1, 5)]; + /// assert_eq!(a.iter().min_set_by(|&&(k1,_), &&(k2, _)| k1.cmp(&k2)), vec![&(1, 2), &(1, 3), &(1, 4), &(1, 5)]); + /// ``` + /// + /// The elements can be floats but no particular result is guaranteed + /// if an element is NaN. + #[cfg(feature = "use_std")] + fn min_set_by(self, mut compare: F) -> Vec + where Self: Sized, F: FnMut(&Self::Item, &Self::Item) -> Ordering + { + extrema_set::min_set_impl( + self, + |_| (), + |x, y, _, _| compare(x, y) + ) + } + + /// Return all minimum elements of an iterator, as determined by + /// the specified function. + /// + /// # Examples + /// + /// ``` + /// use itertools::Itertools; + /// + /// let a: [(i32, i32); 0] = []; + /// assert_eq!(a.iter().min_set_by_key(|_| ()), Vec::<&(i32, i32)>::new()); + /// + /// let a = [(1, 2)]; + /// assert_eq!(a.iter().min_set_by_key(|&&(k,_)| k), vec![&(1, 2)]); + /// + /// let a = [(1, 2), (2, 2), (3, 9), (4, 8), (5, 9)]; + /// assert_eq!(a.iter().min_set_by_key(|&&(_, k)| k), vec![&(1, 2), &(2, 2)]); + /// + /// let a = [(1, 2), (1, 3), (1, 4), (1, 5)]; + /// assert_eq!(a.iter().min_set_by_key(|&&(k, _)| k), vec![&(1, 2), &(1, 3), &(1, 4), &(1, 5)]); + /// ``` + /// + /// The elements can be floats but no particular result is guaranteed + /// if an element is NaN. + #[cfg(feature = "use_std")] + fn min_set_by_key(self, key: F) -> Vec + where Self: Sized, K: Ord, F: FnMut(&Self::Item) -> K + { + extrema_set::min_set_impl(self, key, |_, _, kx, ky| kx.cmp(ky)) + } + + /// Return all maximum elements of an iterator. + /// + /// # Examples + /// + /// ``` + /// use itertools::Itertools; + /// + /// let a: [i32; 0] = []; + /// assert_eq!(a.iter().max_set(), Vec::<&i32>::new()); + /// + /// let a = [1]; + /// assert_eq!(a.iter().max_set(), vec![&1]); + /// + /// let a = [1, 2, 3, 4, 5]; + /// assert_eq!(a.iter().max_set(), vec![&5]); + /// + /// let a = [1, 1, 1, 1]; + /// assert_eq!(a.iter().max_set(), vec![&1, &1, &1, &1]); + /// ``` + /// + /// The elements can be floats but no particular result is guaranteed + /// if an element is NaN. + #[cfg(feature = "use_std")] + fn max_set(self) -> Vec + where Self: Sized, Self::Item: Ord + { + extrema_set::max_set_impl(self, |_| (), |x, y, _, _| x.cmp(y)) + } + + /// Return all maximum elements of an iterator, as determined by + /// the specified function. + /// + /// # Examples + /// + /// ``` + /// # use std::cmp::Ordering; + /// use itertools::Itertools; + /// + /// let a: [(i32, i32); 0] = []; + /// assert_eq!(a.iter().max_set_by(|_, _| Ordering::Equal), Vec::<&(i32, i32)>::new()); + /// + /// let a = [(1, 2)]; + /// assert_eq!(a.iter().max_set_by(|&&(k1,_), &&(k2, _)| k1.cmp(&k2)), vec![&(1, 2)]); + /// + /// let a = [(1, 2), (2, 2), (3, 9), (4, 8), (5, 9)]; + /// assert_eq!(a.iter().max_set_by(|&&(_,k1), &&(_,k2)| k1.cmp(&k2)), vec![&(3, 9), &(5, 9)]); + /// + /// let a = [(1, 2), (1, 3), (1, 4), (1, 5)]; + /// assert_eq!(a.iter().max_set_by(|&&(k1,_), &&(k2, _)| k1.cmp(&k2)), vec![&(1, 2), &(1, 3), &(1, 4), &(1, 5)]); + /// ``` + /// + /// The elements can be floats but no particular result is guaranteed + /// if an element is NaN. + #[cfg(feature = "use_std")] + fn max_set_by(self, mut compare: F) -> Vec + where Self: Sized, F: FnMut(&Self::Item, &Self::Item) -> Ordering + { + extrema_set::max_set_impl( + self, + |_| (), + |x, y, _, _| compare(x, y) + ) + } + + /// Return all minimum elements of an iterator, as determined by + /// the specified function. + /// + /// # Examples + /// + /// ``` + /// use itertools::Itertools; + /// + /// let a: [(i32, i32); 0] = []; + /// assert_eq!(a.iter().max_set_by_key(|_| ()), Vec::<&(i32, i32)>::new()); + /// + /// let a = [(1, 2)]; + /// assert_eq!(a.iter().max_set_by_key(|&&(k,_)| k), vec![&(1, 2)]); + /// + /// let a = [(1, 2), (2, 2), (3, 9), (4, 8), (5, 9)]; + /// assert_eq!(a.iter().max_set_by_key(|&&(_, k)| k), vec![&(3, 9), &(5, 9)]); + /// + /// let a = [(1, 2), (1, 3), (1, 4), (1, 5)]; + /// assert_eq!(a.iter().max_set_by_key(|&&(k, _)| k), vec![&(1, 2), &(1, 3), &(1, 4), &(1, 5)]); + /// ``` + /// + /// The elements can be floats but no particular result is guaranteed + /// if an element is NaN. + #[cfg(feature = "use_std")] + fn max_set_by_key(self, key: F) -> Vec + where Self: Sized, K: Ord, F: FnMut(&Self::Item) -> K + { + extrema_set::max_set_impl(self, key, |_, _, kx, ky| kx.cmp(ky)) + } + + /// Return the minimum and maximum elements in the iterator. + /// + /// The return type `MinMaxResult` is an enum of three variants: + /// + /// - `NoElements` if the iterator is empty. + /// - `OneElement(x)` if the iterator has exactly one element. + /// - `MinMax(x, y)` is returned otherwise, where `x <= y`. Two + /// values are equal if and only if there is more than one + /// element in the iterator and all elements are equal. + /// + /// On an iterator of length `n`, `minmax` does `1.5 * n` comparisons, + /// and so is faster than calling `min` and `max` separately which does + /// `2 * n` comparisons. + /// + /// # Examples + /// + /// ``` + /// use itertools::Itertools; + /// use itertools::MinMaxResult::{NoElements, OneElement, MinMax}; + /// + /// let a: [i32; 0] = []; + /// assert_eq!(a.iter().minmax(), NoElements); + /// + /// let a = [1]; + /// assert_eq!(a.iter().minmax(), OneElement(&1)); + /// + /// let a = [1, 2, 3, 4, 5]; + /// assert_eq!(a.iter().minmax(), MinMax(&1, &5)); + /// + /// let a = [1, 1, 1, 1]; + /// assert_eq!(a.iter().minmax(), MinMax(&1, &1)); + /// ``` + /// + /// The elements can be floats but no particular result is guaranteed + /// if an element is NaN. + fn minmax(self) -> MinMaxResult + where Self: Sized, Self::Item: PartialOrd + { + minmax::minmax_impl(self, |_| (), |x, y, _, _| x < y) + } + + /// Return the minimum and maximum element of an iterator, as determined by + /// the specified function. + /// + /// The return value is a variant of [`MinMaxResult`] like for [`.minmax()`](Itertools::minmax). + /// + /// For the minimum, the first minimal element is returned. For the maximum, + /// the last maximal element wins. This matches the behavior of the standard + /// [`Iterator::min`] and [`Iterator::max`] methods. + /// + /// The keys can be floats but no particular result is guaranteed + /// if a key is NaN. + fn minmax_by_key(self, key: F) -> MinMaxResult + where Self: Sized, K: PartialOrd, F: FnMut(&Self::Item) -> K + { + minmax::minmax_impl(self, key, |_, _, xk, yk| xk < yk) + } + + /// Return the minimum and maximum element of an iterator, as determined by + /// the specified comparison function. + /// + /// The return value is a variant of [`MinMaxResult`] like for [`.minmax()`](Itertools::minmax). + /// + /// For the minimum, the first minimal element is returned. For the maximum, + /// the last maximal element wins. This matches the behavior of the standard + /// [`Iterator::min`] and [`Iterator::max`] methods. + fn minmax_by(self, mut compare: F) -> MinMaxResult + where Self: Sized, F: FnMut(&Self::Item, &Self::Item) -> Ordering + { + minmax::minmax_impl( + self, + |_| (), + |x, y, _, _| Ordering::Less == compare(x, y) + ) + } + + /// Return the position of the maximum element in the iterator. + /// + /// If several elements are equally maximum, the position of the + /// last of them is returned. + /// + /// # Examples + /// + /// ``` + /// use itertools::Itertools; + /// + /// let a: [i32; 0] = []; + /// assert_eq!(a.iter().position_max(), None); + /// + /// let a = [-3, 0, 1, 5, -10]; + /// assert_eq!(a.iter().position_max(), Some(3)); + /// + /// let a = [1, 1, -1, -1]; + /// assert_eq!(a.iter().position_max(), Some(1)); + /// ``` + fn position_max(self) -> Option + where Self: Sized, Self::Item: Ord + { + self.enumerate() + .max_by(|x, y| Ord::cmp(&x.1, &y.1)) + .map(|x| x.0) + } + + /// Return the position of the maximum element in the iterator, as + /// determined by the specified function. + /// + /// If several elements are equally maximum, the position of the + /// last of them is returned. + /// + /// # Examples + /// + /// ``` + /// use itertools::Itertools; + /// + /// let a: [i32; 0] = []; + /// assert_eq!(a.iter().position_max_by_key(|x| x.abs()), None); + /// + /// let a = [-3_i32, 0, 1, 5, -10]; + /// assert_eq!(a.iter().position_max_by_key(|x| x.abs()), Some(4)); + /// + /// let a = [1_i32, 1, -1, -1]; + /// assert_eq!(a.iter().position_max_by_key(|x| x.abs()), Some(3)); + /// ``` + fn position_max_by_key(self, mut key: F) -> Option + where Self: Sized, K: Ord, F: FnMut(&Self::Item) -> K + { + self.enumerate() + .max_by(|x, y| Ord::cmp(&key(&x.1), &key(&y.1))) + .map(|x| x.0) + } + + /// Return the position of the maximum element in the iterator, as + /// determined by the specified comparison function. + /// + /// If several elements are equally maximum, the position of the + /// last of them is returned. + /// + /// # Examples + /// + /// ``` + /// use itertools::Itertools; + /// + /// let a: [i32; 0] = []; + /// assert_eq!(a.iter().position_max_by(|x, y| x.cmp(y)), None); + /// + /// let a = [-3_i32, 0, 1, 5, -10]; + /// assert_eq!(a.iter().position_max_by(|x, y| x.cmp(y)), Some(3)); + /// + /// let a = [1_i32, 1, -1, -1]; + /// assert_eq!(a.iter().position_max_by(|x, y| x.cmp(y)), Some(1)); + /// ``` + fn position_max_by(self, mut compare: F) -> Option + where Self: Sized, F: FnMut(&Self::Item, &Self::Item) -> Ordering + { + self.enumerate() + .max_by(|x, y| compare(&x.1, &y.1)) + .map(|x| x.0) + } + + /// Return the position of the minimum element in the iterator. + /// + /// If several elements are equally minimum, the position of the + /// first of them is returned. + /// + /// # Examples + /// + /// ``` + /// use itertools::Itertools; + /// + /// let a: [i32; 0] = []; + /// assert_eq!(a.iter().position_min(), None); + /// + /// let a = [-3, 0, 1, 5, -10]; + /// assert_eq!(a.iter().position_min(), Some(4)); + /// + /// let a = [1, 1, -1, -1]; + /// assert_eq!(a.iter().position_min(), Some(2)); + /// ``` + fn position_min(self) -> Option + where Self: Sized, Self::Item: Ord + { + self.enumerate() + .min_by(|x, y| Ord::cmp(&x.1, &y.1)) + .map(|x| x.0) + } + + /// Return the position of the minimum element in the iterator, as + /// determined by the specified function. + /// + /// If several elements are equally minimum, the position of the + /// first of them is returned. + /// + /// # Examples + /// + /// ``` + /// use itertools::Itertools; + /// + /// let a: [i32; 0] = []; + /// assert_eq!(a.iter().position_min_by_key(|x| x.abs()), None); + /// + /// let a = [-3_i32, 0, 1, 5, -10]; + /// assert_eq!(a.iter().position_min_by_key(|x| x.abs()), Some(1)); + /// + /// let a = [1_i32, 1, -1, -1]; + /// assert_eq!(a.iter().position_min_by_key(|x| x.abs()), Some(0)); + /// ``` + fn position_min_by_key(self, mut key: F) -> Option + where Self: Sized, K: Ord, F: FnMut(&Self::Item) -> K + { + self.enumerate() + .min_by(|x, y| Ord::cmp(&key(&x.1), &key(&y.1))) + .map(|x| x.0) + } + + /// Return the position of the minimum element in the iterator, as + /// determined by the specified comparison function. + /// + /// If several elements are equally minimum, the position of the + /// first of them is returned. + /// + /// # Examples + /// + /// ``` + /// use itertools::Itertools; + /// + /// let a: [i32; 0] = []; + /// assert_eq!(a.iter().position_min_by(|x, y| x.cmp(y)), None); + /// + /// let a = [-3_i32, 0, 1, 5, -10]; + /// assert_eq!(a.iter().position_min_by(|x, y| x.cmp(y)), Some(4)); + /// + /// let a = [1_i32, 1, -1, -1]; + /// assert_eq!(a.iter().position_min_by(|x, y| x.cmp(y)), Some(2)); + /// ``` + fn position_min_by(self, mut compare: F) -> Option + where Self: Sized, F: FnMut(&Self::Item, &Self::Item) -> Ordering + { + self.enumerate() + .min_by(|x, y| compare(&x.1, &y.1)) + .map(|x| x.0) + } + + /// Return the positions of the minimum and maximum elements in + /// the iterator. + /// + /// The return type [`MinMaxResult`] is an enum of three variants: + /// + /// - `NoElements` if the iterator is empty. + /// - `OneElement(xpos)` if the iterator has exactly one element. + /// - `MinMax(xpos, ypos)` is returned otherwise, where the + /// element at `xpos` ≤ the element at `ypos`. While the + /// referenced elements themselves may be equal, `xpos` cannot + /// be equal to `ypos`. + /// + /// On an iterator of length `n`, `position_minmax` does `1.5 * n` + /// comparisons, and so is faster than calling `position_min` and + /// `position_max` separately which does `2 * n` comparisons. + /// + /// For the minimum, if several elements are equally minimum, the + /// position of the first of them is returned. For the maximum, if + /// several elements are equally maximum, the position of the last + /// of them is returned. + /// + /// The elements can be floats but no particular result is + /// guaranteed if an element is NaN. + /// + /// # Examples + /// + /// ``` + /// use itertools::Itertools; + /// use itertools::MinMaxResult::{NoElements, OneElement, MinMax}; + /// + /// let a: [i32; 0] = []; + /// assert_eq!(a.iter().position_minmax(), NoElements); + /// + /// let a = [10]; + /// assert_eq!(a.iter().position_minmax(), OneElement(0)); + /// + /// let a = [-3, 0, 1, 5, -10]; + /// assert_eq!(a.iter().position_minmax(), MinMax(4, 3)); + /// + /// let a = [1, 1, -1, -1]; + /// assert_eq!(a.iter().position_minmax(), MinMax(2, 1)); + /// ``` + fn position_minmax(self) -> MinMaxResult + where Self: Sized, Self::Item: PartialOrd + { + use crate::MinMaxResult::{NoElements, OneElement, MinMax}; + match minmax::minmax_impl(self.enumerate(), |_| (), |x, y, _, _| x.1 < y.1) { + NoElements => NoElements, + OneElement(x) => OneElement(x.0), + MinMax(x, y) => MinMax(x.0, y.0), + } + } + + /// Return the postions of the minimum and maximum elements of an + /// iterator, as determined by the specified function. + /// + /// The return value is a variant of [`MinMaxResult`] like for + /// [`position_minmax`]. + /// + /// For the minimum, if several elements are equally minimum, the + /// position of the first of them is returned. For the maximum, if + /// several elements are equally maximum, the position of the last + /// of them is returned. + /// + /// The keys can be floats but no particular result is guaranteed + /// if a key is NaN. + /// + /// # Examples + /// + /// ``` + /// use itertools::Itertools; + /// use itertools::MinMaxResult::{NoElements, OneElement, MinMax}; + /// + /// let a: [i32; 0] = []; + /// assert_eq!(a.iter().position_minmax_by_key(|x| x.abs()), NoElements); + /// + /// let a = [10_i32]; + /// assert_eq!(a.iter().position_minmax_by_key(|x| x.abs()), OneElement(0)); + /// + /// let a = [-3_i32, 0, 1, 5, -10]; + /// assert_eq!(a.iter().position_minmax_by_key(|x| x.abs()), MinMax(1, 4)); + /// + /// let a = [1_i32, 1, -1, -1]; + /// assert_eq!(a.iter().position_minmax_by_key(|x| x.abs()), MinMax(0, 3)); + /// ``` + /// + /// [`position_minmax`]: Self::position_minmax + fn position_minmax_by_key(self, mut key: F) -> MinMaxResult + where Self: Sized, K: PartialOrd, F: FnMut(&Self::Item) -> K + { + use crate::MinMaxResult::{NoElements, OneElement, MinMax}; + match self.enumerate().minmax_by_key(|e| key(&e.1)) { + NoElements => NoElements, + OneElement(x) => OneElement(x.0), + MinMax(x, y) => MinMax(x.0, y.0), + } + } + + /// Return the postions of the minimum and maximum elements of an + /// iterator, as determined by the specified comparison function. + /// + /// The return value is a variant of [`MinMaxResult`] like for + /// [`position_minmax`]. + /// + /// For the minimum, if several elements are equally minimum, the + /// position of the first of them is returned. For the maximum, if + /// several elements are equally maximum, the position of the last + /// of them is returned. + /// + /// # Examples + /// + /// ``` + /// use itertools::Itertools; + /// use itertools::MinMaxResult::{NoElements, OneElement, MinMax}; + /// + /// let a: [i32; 0] = []; + /// assert_eq!(a.iter().position_minmax_by(|x, y| x.cmp(y)), NoElements); + /// + /// let a = [10_i32]; + /// assert_eq!(a.iter().position_minmax_by(|x, y| x.cmp(y)), OneElement(0)); + /// + /// let a = [-3_i32, 0, 1, 5, -10]; + /// assert_eq!(a.iter().position_minmax_by(|x, y| x.cmp(y)), MinMax(4, 3)); + /// + /// let a = [1_i32, 1, -1, -1]; + /// assert_eq!(a.iter().position_minmax_by(|x, y| x.cmp(y)), MinMax(2, 1)); + /// ``` + /// + /// [`position_minmax`]: Self::position_minmax + fn position_minmax_by(self, mut compare: F) -> MinMaxResult + where Self: Sized, F: FnMut(&Self::Item, &Self::Item) -> Ordering + { + use crate::MinMaxResult::{NoElements, OneElement, MinMax}; + match self.enumerate().minmax_by(|x, y| compare(&x.1, &y.1)) { + NoElements => NoElements, + OneElement(x) => OneElement(x.0), + MinMax(x, y) => MinMax(x.0, y.0), + } + } + + /// If the iterator yields exactly one element, that element will be returned, otherwise + /// an error will be returned containing an iterator that has the same output as the input + /// iterator. + /// + /// This provides an additional layer of validation over just calling `Iterator::next()`. + /// If your assumption that there should only be one element yielded is false this provides + /// the opportunity to detect and handle that, preventing errors at a distance. + /// + /// # Examples + /// ``` + /// use itertools::Itertools; + /// + /// assert_eq!((0..10).filter(|&x| x == 2).exactly_one().unwrap(), 2); + /// assert!((0..10).filter(|&x| x > 1 && x < 4).exactly_one().unwrap_err().eq(2..4)); + /// assert!((0..10).filter(|&x| x > 1 && x < 5).exactly_one().unwrap_err().eq(2..5)); + /// assert!((0..10).filter(|&_| false).exactly_one().unwrap_err().eq(0..0)); + /// ``` + fn exactly_one(mut self) -> Result> + where + Self: Sized, + { + match self.next() { + Some(first) => { + match self.next() { + Some(second) => { + Err(ExactlyOneError::new(Some(Either::Left([first, second])), self)) + } + None => { + Ok(first) + } + } + } + None => Err(ExactlyOneError::new(None, self)), + } + } + + /// If the iterator yields no elements, Ok(None) will be returned. If the iterator yields + /// exactly one element, that element will be returned, otherwise an error will be returned + /// containing an iterator that has the same output as the input iterator. + /// + /// This provides an additional layer of validation over just calling `Iterator::next()`. + /// If your assumption that there should be at most one element yielded is false this provides + /// the opportunity to detect and handle that, preventing errors at a distance. + /// + /// # Examples + /// ``` + /// use itertools::Itertools; + /// + /// assert_eq!((0..10).filter(|&x| x == 2).at_most_one().unwrap(), Some(2)); + /// assert!((0..10).filter(|&x| x > 1 && x < 4).at_most_one().unwrap_err().eq(2..4)); + /// assert!((0..10).filter(|&x| x > 1 && x < 5).at_most_one().unwrap_err().eq(2..5)); + /// assert_eq!((0..10).filter(|&_| false).at_most_one().unwrap(), None); + /// ``` + fn at_most_one(mut self) -> Result, ExactlyOneError> + where + Self: Sized, + { + match self.next() { + Some(first) => { + match self.next() { + Some(second) => { + Err(ExactlyOneError::new(Some(Either::Left([first, second])), self)) + } + None => { + Ok(Some(first)) + } + } + } + None => Ok(None), + } + } + + /// An iterator adaptor that allows the user to peek at multiple `.next()` + /// values without advancing the base iterator. + /// + /// # Examples + /// ``` + /// use itertools::Itertools; + /// + /// let mut iter = (0..10).multipeek(); + /// assert_eq!(iter.peek(), Some(&0)); + /// assert_eq!(iter.peek(), Some(&1)); + /// assert_eq!(iter.peek(), Some(&2)); + /// assert_eq!(iter.next(), Some(0)); + /// assert_eq!(iter.peek(), Some(&1)); + /// ``` + #[cfg(feature = "use_alloc")] + fn multipeek(self) -> MultiPeek + where + Self: Sized, + { + multipeek_impl::multipeek(self) + } + + /// Collect the items in this iterator and return a `HashMap` which + /// contains each item that appears in the iterator and the number + /// of times it appears. + /// + /// # Examples + /// ``` + /// # use itertools::Itertools; + /// let counts = [1, 1, 1, 3, 3, 5].into_iter().counts(); + /// assert_eq!(counts[&1], 3); + /// assert_eq!(counts[&3], 2); + /// assert_eq!(counts[&5], 1); + /// assert_eq!(counts.get(&0), None); + /// ``` + #[cfg(feature = "use_std")] + fn counts(self) -> HashMap + where + Self: Sized, + Self::Item: Eq + Hash, + { + let mut counts = HashMap::new(); + self.for_each(|item| *counts.entry(item).or_default() += 1); + counts + } + + /// Collect the items in this iterator and return a `HashMap` which + /// contains each item that appears in the iterator and the number + /// of times it appears, + /// determining identity using a keying function. + /// + /// ``` + /// # use itertools::Itertools; + /// struct Character { + /// first_name: &'static str, + /// last_name: &'static str, + /// } + /// + /// let characters = + /// vec![ + /// Character { first_name: "Amy", last_name: "Pond" }, + /// Character { first_name: "Amy", last_name: "Wong" }, + /// Character { first_name: "Amy", last_name: "Santiago" }, + /// Character { first_name: "James", last_name: "Bond" }, + /// Character { first_name: "James", last_name: "Sullivan" }, + /// Character { first_name: "James", last_name: "Norington" }, + /// Character { first_name: "James", last_name: "Kirk" }, + /// ]; + /// + /// let first_name_frequency = + /// characters + /// .into_iter() + /// .counts_by(|c| c.first_name); + /// + /// assert_eq!(first_name_frequency["Amy"], 3); + /// assert_eq!(first_name_frequency["James"], 4); + /// assert_eq!(first_name_frequency.contains_key("Asha"), false); + /// ``` + #[cfg(feature = "use_std")] + fn counts_by(self, f: F) -> HashMap + where + Self: Sized, + K: Eq + Hash, + F: FnMut(Self::Item) -> K, + { + self.map(f).counts() + } + + /// Converts an iterator of tuples into a tuple of containers. + /// + /// `unzip()` consumes an entire iterator of n-ary tuples, producing `n` collections, one for each + /// column. + /// + /// This function is, in some sense, the opposite of [`multizip`]. + /// + /// ``` + /// use itertools::Itertools; + /// + /// let inputs = vec![(1, 2, 3), (4, 5, 6), (7, 8, 9)]; + /// + /// let (a, b, c): (Vec<_>, Vec<_>, Vec<_>) = inputs + /// .into_iter() + /// .multiunzip(); + /// + /// assert_eq!(a, vec![1, 4, 7]); + /// assert_eq!(b, vec![2, 5, 8]); + /// assert_eq!(c, vec![3, 6, 9]); + /// ``` + fn multiunzip(self) -> FromI + where + Self: Sized + MultiUnzip, + { + MultiUnzip::multiunzip(self) + } +} + +impl Itertools for T where T: Iterator { } + +/// Return `true` if both iterables produce equal sequences +/// (elements pairwise equal and sequences of the same length), +/// `false` otherwise. +/// +/// [`IntoIterator`] enabled version of [`Iterator::eq`]. +/// +/// ``` +/// assert!(itertools::equal(vec![1, 2, 3], 1..4)); +/// assert!(!itertools::equal(&[0, 0], &[0, 0, 0])); +/// ``` +pub fn equal(a: I, b: J) -> bool + where I: IntoIterator, + J: IntoIterator, + I::Item: PartialEq +{ + a.into_iter().eq(b) +} + +/// Assert that two iterables produce equal sequences, with the same +/// semantics as [`equal(a, b)`](equal). +/// +/// **Panics** on assertion failure with a message that shows the +/// two iteration elements. +/// +/// ```ignore +/// assert_equal("exceed".split('c'), "excess".split('c')); +/// // ^PANIC: panicked at 'Failed assertion Some("eed") == Some("ess") for iteration 1', +/// ``` +pub fn assert_equal(a: I, b: J) + where I: IntoIterator, + J: IntoIterator, + I::Item: fmt::Debug + PartialEq, + J::Item: fmt::Debug, +{ + let mut ia = a.into_iter(); + let mut ib = b.into_iter(); + let mut i = 0; + loop { + match (ia.next(), ib.next()) { + (None, None) => return, + (a, b) => { + let equal = match (&a, &b) { + (&Some(ref a), &Some(ref b)) => a == b, + _ => false, + }; + assert!(equal, "Failed assertion {a:?} == {b:?} for iteration {i}", + i=i, a=a, b=b); + i += 1; + } + } + } +} + +/// Partition a sequence using predicate `pred` so that elements +/// that map to `true` are placed before elements which map to `false`. +/// +/// The order within the partitions is arbitrary. +/// +/// Return the index of the split point. +/// +/// ``` +/// use itertools::partition; +/// +/// # // use repeated numbers to not promise any ordering +/// let mut data = [7, 1, 1, 7, 1, 1, 7]; +/// let split_index = partition(&mut data, |elt| *elt >= 3); +/// +/// assert_eq!(data, [7, 7, 7, 1, 1, 1, 1]); +/// assert_eq!(split_index, 3); +/// ``` +pub fn partition<'a, A: 'a, I, F>(iter: I, mut pred: F) -> usize + where I: IntoIterator, + I::IntoIter: DoubleEndedIterator, + F: FnMut(&A) -> bool +{ + let mut split_index = 0; + let mut iter = iter.into_iter(); + 'main: while let Some(front) = iter.next() { + if !pred(front) { + loop { + match iter.next_back() { + Some(back) => if pred(back) { + std::mem::swap(front, back); + break; + }, + None => break 'main, + } + } + } + split_index += 1; + } + split_index +} + +/// An enum used for controlling the execution of `fold_while`. +/// +/// See [`.fold_while()`](Itertools::fold_while) for more information. +#[derive(Copy, Clone, Debug, Eq, PartialEq)] +pub enum FoldWhile { + /// Continue folding with this value + Continue(T), + /// Fold is complete and will return this value + Done(T), +} + +impl FoldWhile { + /// Return the value in the continue or done. + pub fn into_inner(self) -> T { + match self { + FoldWhile::Continue(x) | FoldWhile::Done(x) => x, + } + } + + /// Return true if `self` is `Done`, false if it is `Continue`. + pub fn is_done(&self) -> bool { + match *self { + FoldWhile::Continue(_) => false, + FoldWhile::Done(_) => true, + } + } +} diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/src/merge_join.rs temporalio-1.3.0/vendor/itertools-0.10.5/src/merge_join.rs --- temporalio-1.3.0/vendor/itertools-0.10.5/src/merge_join.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/src/merge_join.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,169 @@ +use std::cmp::Ordering; +use std::iter::Fuse; +use std::fmt; + +use super::adaptors::{PutBack, put_back}; +use crate::either_or_both::EitherOrBoth; +#[cfg(doc)] +use crate::Itertools; + +/// Return an iterator adaptor that merge-joins items from the two base iterators in ascending order. +/// +/// [`IntoIterator`] enabled version of [`Itertools::merge_join_by`]. +pub fn merge_join_by(left: I, right: J, cmp_fn: F) + -> MergeJoinBy + where I: IntoIterator, + J: IntoIterator, + F: FnMut(&I::Item, &J::Item) -> Ordering +{ + MergeJoinBy { + left: put_back(left.into_iter().fuse()), + right: put_back(right.into_iter().fuse()), + cmp_fn, + } +} + +/// An iterator adaptor that merge-joins items from the two base iterators in ascending order. +/// +/// See [`.merge_join_by()`](crate::Itertools::merge_join_by) for more information. +#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] +pub struct MergeJoinBy { + left: PutBack>, + right: PutBack>, + cmp_fn: F +} + +impl Clone for MergeJoinBy + where I: Iterator, + J: Iterator, + PutBack>: Clone, + PutBack>: Clone, + F: Clone, +{ + clone_fields!(left, right, cmp_fn); +} + +impl fmt::Debug for MergeJoinBy + where I: Iterator + fmt::Debug, + I::Item: fmt::Debug, + J: Iterator + fmt::Debug, + J::Item: fmt::Debug, +{ + debug_fmt_fields!(MergeJoinBy, left, right); +} + +impl Iterator for MergeJoinBy + where I: Iterator, + J: Iterator, + F: FnMut(&I::Item, &J::Item) -> Ordering +{ + type Item = EitherOrBoth; + + fn next(&mut self) -> Option { + match (self.left.next(), self.right.next()) { + (None, None) => None, + (Some(left), None) => + Some(EitherOrBoth::Left(left)), + (None, Some(right)) => + Some(EitherOrBoth::Right(right)), + (Some(left), Some(right)) => { + match (self.cmp_fn)(&left, &right) { + Ordering::Equal => + Some(EitherOrBoth::Both(left, right)), + Ordering::Less => { + self.right.put_back(right); + Some(EitherOrBoth::Left(left)) + }, + Ordering::Greater => { + self.left.put_back(left); + Some(EitherOrBoth::Right(right)) + } + } + } + } + } + + fn size_hint(&self) -> (usize, Option) { + let (a_lower, a_upper) = self.left.size_hint(); + let (b_lower, b_upper) = self.right.size_hint(); + + let lower = ::std::cmp::max(a_lower, b_lower); + + let upper = match (a_upper, b_upper) { + (Some(x), Some(y)) => x.checked_add(y), + _ => None, + }; + + (lower, upper) + } + + fn count(mut self) -> usize { + let mut count = 0; + loop { + match (self.left.next(), self.right.next()) { + (None, None) => break count, + (Some(_left), None) => break count + 1 + self.left.into_parts().1.count(), + (None, Some(_right)) => break count + 1 + self.right.into_parts().1.count(), + (Some(left), Some(right)) => { + count += 1; + match (self.cmp_fn)(&left, &right) { + Ordering::Equal => {} + Ordering::Less => self.right.put_back(right), + Ordering::Greater => self.left.put_back(left), + } + } + } + } + } + + fn last(mut self) -> Option { + let mut previous_element = None; + loop { + match (self.left.next(), self.right.next()) { + (None, None) => break previous_element, + (Some(left), None) => { + break Some(EitherOrBoth::Left( + self.left.into_parts().1.last().unwrap_or(left), + )) + } + (None, Some(right)) => { + break Some(EitherOrBoth::Right( + self.right.into_parts().1.last().unwrap_or(right), + )) + } + (Some(left), Some(right)) => { + previous_element = match (self.cmp_fn)(&left, &right) { + Ordering::Equal => Some(EitherOrBoth::Both(left, right)), + Ordering::Less => { + self.right.put_back(right); + Some(EitherOrBoth::Left(left)) + } + Ordering::Greater => { + self.left.put_back(left); + Some(EitherOrBoth::Right(right)) + } + } + } + } + } + } + + fn nth(&mut self, mut n: usize) -> Option { + loop { + if n == 0 { + break self.next(); + } + n -= 1; + match (self.left.next(), self.right.next()) { + (None, None) => break None, + (Some(_left), None) => break self.left.nth(n).map(EitherOrBoth::Left), + (None, Some(_right)) => break self.right.nth(n).map(EitherOrBoth::Right), + (Some(left), Some(right)) => match (self.cmp_fn)(&left, &right) { + Ordering::Equal => {} + Ordering::Less => self.right.put_back(right), + Ordering::Greater => self.left.put_back(left), + }, + } + } + } +} diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/src/minmax.rs temporalio-1.3.0/vendor/itertools-0.10.5/src/minmax.rs --- temporalio-1.3.0/vendor/itertools-0.10.5/src/minmax.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/src/minmax.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,115 @@ + +/// `MinMaxResult` is an enum returned by `minmax`. +/// +/// See [`.minmax()`](crate::Itertools::minmax) for more detail. +#[derive(Copy, Clone, PartialEq, Debug)] +pub enum MinMaxResult { + /// Empty iterator + NoElements, + + /// Iterator with one element, so the minimum and maximum are the same + OneElement(T), + + /// More than one element in the iterator, the first element is not larger + /// than the second + MinMax(T, T) +} + +impl MinMaxResult { + /// `into_option` creates an `Option` of type `(T, T)`. The returned `Option` + /// has variant `None` if and only if the `MinMaxResult` has variant + /// `NoElements`. Otherwise `Some((x, y))` is returned where `x <= y`. + /// If the `MinMaxResult` has variant `OneElement(x)`, performing this + /// operation will make one clone of `x`. + /// + /// # Examples + /// + /// ``` + /// use itertools::MinMaxResult::{self, NoElements, OneElement, MinMax}; + /// + /// let r: MinMaxResult = NoElements; + /// assert_eq!(r.into_option(), None); + /// + /// let r = OneElement(1); + /// assert_eq!(r.into_option(), Some((1, 1))); + /// + /// let r = MinMax(1, 2); + /// assert_eq!(r.into_option(), Some((1, 2))); + /// ``` + pub fn into_option(self) -> Option<(T,T)> { + match self { + MinMaxResult::NoElements => None, + MinMaxResult::OneElement(x) => Some((x.clone(), x)), + MinMaxResult::MinMax(x, y) => Some((x, y)) + } + } +} + +/// Implementation guts for `minmax` and `minmax_by_key`. +pub fn minmax_impl(mut it: I, mut key_for: F, + mut lt: L) -> MinMaxResult + where I: Iterator, + F: FnMut(&I::Item) -> K, + L: FnMut(&I::Item, &I::Item, &K, &K) -> bool, +{ + let (mut min, mut max, mut min_key, mut max_key) = match it.next() { + None => return MinMaxResult::NoElements, + Some(x) => { + match it.next() { + None => return MinMaxResult::OneElement(x), + Some(y) => { + let xk = key_for(&x); + let yk = key_for(&y); + if !lt(&y, &x, &yk, &xk) {(x, y, xk, yk)} else {(y, x, yk, xk)} + } + } + } + }; + + loop { + // `first` and `second` are the two next elements we want to look + // at. We first compare `first` and `second` (#1). The smaller one + // is then compared to current minimum (#2). The larger one is + // compared to current maximum (#3). This way we do 3 comparisons + // for 2 elements. + let first = match it.next() { + None => break, + Some(x) => x + }; + let second = match it.next() { + None => { + let first_key = key_for(&first); + if lt(&first, &min, &first_key, &min_key) { + min = first; + } else if !lt(&first, &max, &first_key, &max_key) { + max = first; + } + break; + } + Some(x) => x + }; + let first_key = key_for(&first); + let second_key = key_for(&second); + if !lt(&second, &first, &second_key, &first_key) { + if lt(&first, &min, &first_key, &min_key) { + min = first; + min_key = first_key; + } + if !lt(&second, &max, &second_key, &max_key) { + max = second; + max_key = second_key; + } + } else { + if lt(&second, &min, &second_key, &min_key) { + min = second; + min_key = second_key; + } + if !lt(&first, &max, &first_key, &max_key) { + max = first; + max_key = first_key; + } + } + } + + MinMaxResult::MinMax(min, max) +} diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/src/multipeek_impl.rs temporalio-1.3.0/vendor/itertools-0.10.5/src/multipeek_impl.rs --- temporalio-1.3.0/vendor/itertools-0.10.5/src/multipeek_impl.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/src/multipeek_impl.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,101 @@ +use std::iter::Fuse; +use alloc::collections::VecDeque; +use crate::size_hint; +use crate::PeekingNext; +#[cfg(doc)] +use crate::Itertools; + +/// See [`multipeek()`] for more information. +#[derive(Clone, Debug)] +pub struct MultiPeek + where I: Iterator +{ + iter: Fuse, + buf: VecDeque, + index: usize, +} + +/// An iterator adaptor that allows the user to peek at multiple `.next()` +/// values without advancing the base iterator. +/// +/// [`IntoIterator`] enabled version of [`Itertools::multipeek`]. +pub fn multipeek(iterable: I) -> MultiPeek + where I: IntoIterator +{ + MultiPeek { + iter: iterable.into_iter().fuse(), + buf: VecDeque::new(), + index: 0, + } +} + +impl MultiPeek + where I: Iterator +{ + /// Reset the peeking “cursor†+ pub fn reset_peek(&mut self) { + self.index = 0; + } +} + +impl MultiPeek { + /// Works exactly like `.next()` with the only difference that it doesn't + /// advance itself. `.peek()` can be called multiple times, to peek + /// further ahead. + /// When `.next()` is called, reset the peeking “cursorâ€. + pub fn peek(&mut self) -> Option<&I::Item> { + let ret = if self.index < self.buf.len() { + Some(&self.buf[self.index]) + } else { + match self.iter.next() { + Some(x) => { + self.buf.push_back(x); + Some(&self.buf[self.index]) + } + None => return None, + } + }; + + self.index += 1; + ret + } +} + +impl PeekingNext for MultiPeek + where I: Iterator, +{ + fn peeking_next(&mut self, accept: F) -> Option + where F: FnOnce(&Self::Item) -> bool + { + if self.buf.is_empty() { + if let Some(r) = self.peek() { + if !accept(r) { return None } + } + } else if let Some(r) = self.buf.get(0) { + if !accept(r) { return None } + } + self.next() + } +} + +impl Iterator for MultiPeek + where I: Iterator +{ + type Item = I::Item; + + fn next(&mut self) -> Option { + self.index = 0; + self.buf.pop_front().or_else(|| self.iter.next()) + } + + fn size_hint(&self) -> (usize, Option) { + size_hint::add_scalar(self.iter.size_hint(), self.buf.len()) + } +} + +// Same size +impl ExactSizeIterator for MultiPeek + where I: ExactSizeIterator +{} + + diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/src/pad_tail.rs temporalio-1.3.0/vendor/itertools-0.10.5/src/pad_tail.rs --- temporalio-1.3.0/vendor/itertools-0.10.5/src/pad_tail.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/src/pad_tail.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,96 @@ +use std::iter::{Fuse, FusedIterator}; +use crate::size_hint; + +/// An iterator adaptor that pads a sequence to a minimum length by filling +/// missing elements using a closure. +/// +/// Iterator element type is `I::Item`. +/// +/// See [`.pad_using()`](crate::Itertools::pad_using) for more information. +#[derive(Clone)] +#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] +pub struct PadUsing { + iter: Fuse, + min: usize, + pos: usize, + filler: F, +} + +impl std::fmt::Debug for PadUsing +where + I: std::fmt::Debug, +{ + debug_fmt_fields!(PadUsing, iter, min, pos); +} + +/// Create a new `PadUsing` iterator. +pub fn pad_using(iter: I, min: usize, filler: F) -> PadUsing + where I: Iterator, + F: FnMut(usize) -> I::Item +{ + PadUsing { + iter: iter.fuse(), + min, + pos: 0, + filler, + } +} + +impl Iterator for PadUsing + where I: Iterator, + F: FnMut(usize) -> I::Item +{ + type Item = I::Item; + + #[inline] + fn next(&mut self) -> Option { + match self.iter.next() { + None => { + if self.pos < self.min { + let e = Some((self.filler)(self.pos)); + self.pos += 1; + e + } else { + None + } + }, + e => { + self.pos += 1; + e + } + } + } + + fn size_hint(&self) -> (usize, Option) { + let tail = self.min.saturating_sub(self.pos); + size_hint::max(self.iter.size_hint(), (tail, Some(tail))) + } +} + +impl DoubleEndedIterator for PadUsing + where I: DoubleEndedIterator + ExactSizeIterator, + F: FnMut(usize) -> I::Item +{ + fn next_back(&mut self) -> Option { + if self.min == 0 { + self.iter.next_back() + } else if self.iter.len() >= self.min { + self.min -= 1; + self.iter.next_back() + } else { + self.min -= 1; + Some((self.filler)(self.min)) + } + } +} + +impl ExactSizeIterator for PadUsing + where I: ExactSizeIterator, + F: FnMut(usize) -> I::Item +{} + + +impl FusedIterator for PadUsing + where I: FusedIterator, + F: FnMut(usize) -> I::Item +{} diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/src/peeking_take_while.rs temporalio-1.3.0/vendor/itertools-0.10.5/src/peeking_take_while.rs --- temporalio-1.3.0/vendor/itertools-0.10.5/src/peeking_take_while.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/src/peeking_take_while.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,154 @@ +use std::iter::Peekable; +use crate::PutBack; +#[cfg(feature = "use_alloc")] +use crate::PutBackN; + +/// An iterator that allows peeking at an element before deciding to accept it. +/// +/// See [`.peeking_take_while()`](crate::Itertools::peeking_take_while) +/// for more information. +/// +/// This is implemented by peeking adaptors like peekable and put back, +/// but also by a few iterators that can be peeked natively, like the slice’s +/// by reference iterator (`std::slice::Iter`). +pub trait PeekingNext : Iterator { + /// Pass a reference to the next iterator element to the closure `accept`; + /// if `accept` returns true, return it as the next element, + /// else None. + fn peeking_next(&mut self, accept: F) -> Option + where F: FnOnce(&Self::Item) -> bool; +} + +impl PeekingNext for Peekable + where I: Iterator, +{ + fn peeking_next(&mut self, accept: F) -> Option + where F: FnOnce(&Self::Item) -> bool + { + if let Some(r) = self.peek() { + if !accept(r) { + return None; + } + } + self.next() + } +} + +impl PeekingNext for PutBack + where I: Iterator, +{ + fn peeking_next(&mut self, accept: F) -> Option + where F: FnOnce(&Self::Item) -> bool + { + if let Some(r) = self.next() { + if !accept(&r) { + self.put_back(r); + return None; + } + Some(r) + } else { + None + } + } +} + +#[cfg(feature = "use_alloc")] +impl PeekingNext for PutBackN + where I: Iterator, +{ + fn peeking_next(&mut self, accept: F) -> Option + where F: FnOnce(&Self::Item) -> bool + { + if let Some(r) = self.next() { + if !accept(&r) { + self.put_back(r); + return None; + } + Some(r) + } else { + None + } + } +} + +/// An iterator adaptor that takes items while a closure returns `true`. +/// +/// See [`.peeking_take_while()`](crate::Itertools::peeking_take_while) +/// for more information. +#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] +pub struct PeekingTakeWhile<'a, I: 'a, F> + where I: Iterator, +{ + iter: &'a mut I, + f: F, +} + +impl<'a, I: 'a, F> std::fmt::Debug for PeekingTakeWhile<'a, I, F> +where + I: Iterator + std::fmt::Debug, +{ + debug_fmt_fields!(PeekingTakeWhile, iter); +} + +/// Create a `PeekingTakeWhile` +pub fn peeking_take_while(iter: &mut I, f: F) -> PeekingTakeWhile + where I: Iterator, +{ + PeekingTakeWhile { + iter, + f, + } +} + +impl<'a, I, F> Iterator for PeekingTakeWhile<'a, I, F> + where I: PeekingNext, + F: FnMut(&I::Item) -> bool, + +{ + type Item = I::Item; + fn next(&mut self) -> Option { + self.iter.peeking_next(&mut self.f) + } + + fn size_hint(&self) -> (usize, Option) { + (0, self.iter.size_hint().1) + } +} + +// Some iterators are so lightweight we can simply clone them to save their +// state and use that for peeking. +macro_rules! peeking_next_by_clone { + ([$($typarm:tt)*] $type_:ty) => { + impl<$($typarm)*> PeekingNext for $type_ { + fn peeking_next(&mut self, accept: F) -> Option + where F: FnOnce(&Self::Item) -> bool + { + let saved_state = self.clone(); + if let Some(r) = self.next() { + if !accept(&r) { + *self = saved_state; + } else { + return Some(r) + } + } + None + } + } + } +} + +peeking_next_by_clone! { ['a, T] ::std::slice::Iter<'a, T> } +peeking_next_by_clone! { ['a] ::std::str::Chars<'a> } +peeking_next_by_clone! { ['a] ::std::str::CharIndices<'a> } +peeking_next_by_clone! { ['a] ::std::str::Bytes<'a> } +peeking_next_by_clone! { ['a, T] ::std::option::Iter<'a, T> } +peeking_next_by_clone! { ['a, T] ::std::result::Iter<'a, T> } +peeking_next_by_clone! { [T] ::std::iter::Empty } +#[cfg(feature = "use_alloc")] +peeking_next_by_clone! { ['a, T] alloc::collections::linked_list::Iter<'a, T> } +#[cfg(feature = "use_alloc")] +peeking_next_by_clone! { ['a, T] alloc::collections::vec_deque::Iter<'a, T> } + +// cloning a Rev has no extra overhead; peekable and put backs are never DEI. +peeking_next_by_clone! { [I: Clone + PeekingNext + DoubleEndedIterator] + ::std::iter::Rev } diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/src/peek_nth.rs temporalio-1.3.0/vendor/itertools-0.10.5/src/peek_nth.rs --- temporalio-1.3.0/vendor/itertools-0.10.5/src/peek_nth.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/src/peek_nth.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,102 @@ +use crate::size_hint; +use crate::PeekingNext; +use alloc::collections::VecDeque; +use std::iter::Fuse; + +/// See [`peek_nth()`] for more information. +#[derive(Clone, Debug)] +pub struct PeekNth +where + I: Iterator, +{ + iter: Fuse, + buf: VecDeque, +} + +/// A drop-in replacement for [`std::iter::Peekable`] which adds a `peek_nth` +/// method allowing the user to `peek` at a value several iterations forward +/// without advancing the base iterator. +/// +/// This differs from `multipeek` in that subsequent calls to `peek` or +/// `peek_nth` will always return the same value until `next` is called +/// (making `reset_peek` unnecessary). +pub fn peek_nth(iterable: I) -> PeekNth +where + I: IntoIterator, +{ + PeekNth { + iter: iterable.into_iter().fuse(), + buf: VecDeque::new(), + } +} + +impl PeekNth +where + I: Iterator, +{ + /// Works exactly like the `peek` method in `std::iter::Peekable` + pub fn peek(&mut self) -> Option<&I::Item> { + self.peek_nth(0) + } + + /// Returns a reference to the `nth` value without advancing the iterator. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ```rust + /// use itertools::peek_nth; + /// + /// let xs = vec![1,2,3]; + /// let mut iter = peek_nth(xs.iter()); + /// + /// assert_eq!(iter.peek_nth(0), Some(&&1)); + /// assert_eq!(iter.next(), Some(&1)); + /// + /// // The iterator does not advance even if we call `peek_nth` multiple times + /// assert_eq!(iter.peek_nth(0), Some(&&2)); + /// assert_eq!(iter.peek_nth(1), Some(&&3)); + /// assert_eq!(iter.next(), Some(&2)); + /// + /// // Calling `peek_nth` past the end of the iterator will return `None` + /// assert_eq!(iter.peek_nth(1), None); + /// ``` + pub fn peek_nth(&mut self, n: usize) -> Option<&I::Item> { + let unbuffered_items = (n + 1).saturating_sub(self.buf.len()); + + self.buf.extend(self.iter.by_ref().take(unbuffered_items)); + + self.buf.get(n) + } +} + +impl Iterator for PeekNth +where + I: Iterator, +{ + type Item = I::Item; + + fn next(&mut self) -> Option { + self.buf.pop_front().or_else(|| self.iter.next()) + } + + fn size_hint(&self) -> (usize, Option) { + size_hint::add_scalar(self.iter.size_hint(), self.buf.len()) + } +} + +impl ExactSizeIterator for PeekNth where I: ExactSizeIterator {} + +impl PeekingNext for PeekNth +where + I: Iterator, +{ + fn peeking_next(&mut self, accept: F) -> Option + where + F: FnOnce(&Self::Item) -> bool, + { + self.peek().filter(|item| accept(item))?; + self.next() + } +} diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/src/permutations.rs temporalio-1.3.0/vendor/itertools-0.10.5/src/permutations.rs --- temporalio-1.3.0/vendor/itertools-0.10.5/src/permutations.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/src/permutations.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,277 @@ +use alloc::vec::Vec; +use std::fmt; +use std::iter::once; + +use super::lazy_buffer::LazyBuffer; + +/// An iterator adaptor that iterates through all the `k`-permutations of the +/// elements from an iterator. +/// +/// See [`.permutations()`](crate::Itertools::permutations) for +/// more information. +#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] +pub struct Permutations { + vals: LazyBuffer, + state: PermutationState, +} + +impl Clone for Permutations + where I: Clone + Iterator, + I::Item: Clone, +{ + clone_fields!(vals, state); +} + +#[derive(Clone, Debug)] +enum PermutationState { + StartUnknownLen { + k: usize, + }, + OngoingUnknownLen { + k: usize, + min_n: usize, + }, + Complete(CompleteState), + Empty, +} + +#[derive(Clone, Debug)] +enum CompleteState { + Start { + n: usize, + k: usize, + }, + Ongoing { + indices: Vec, + cycles: Vec, + } +} + +enum CompleteStateRemaining { + Known(usize), + Overflow, +} + +impl fmt::Debug for Permutations + where I: Iterator + fmt::Debug, + I::Item: fmt::Debug, +{ + debug_fmt_fields!(Permutations, vals, state); +} + +pub fn permutations(iter: I, k: usize) -> Permutations { + let mut vals = LazyBuffer::new(iter); + + if k == 0 { + // Special case, yields single empty vec; `n` is irrelevant + let state = PermutationState::Complete(CompleteState::Start { n: 0, k: 0 }); + + return Permutations { + vals, + state + }; + } + + let mut enough_vals = true; + + while vals.len() < k { + if !vals.get_next() { + enough_vals = false; + break; + } + } + + let state = if enough_vals { + PermutationState::StartUnknownLen { k } + } else { + PermutationState::Empty + }; + + Permutations { + vals, + state + } +} + +impl Iterator for Permutations +where + I: Iterator, + I::Item: Clone +{ + type Item = Vec; + + fn next(&mut self) -> Option { + self.advance(); + + let &mut Permutations { ref vals, ref state } = self; + + match *state { + PermutationState::StartUnknownLen { .. } => panic!("unexpected iterator state"), + PermutationState::OngoingUnknownLen { k, min_n } => { + let latest_idx = min_n - 1; + let indices = (0..(k - 1)).chain(once(latest_idx)); + + Some(indices.map(|i| vals[i].clone()).collect()) + } + PermutationState::Complete(CompleteState::Ongoing { ref indices, ref cycles }) => { + let k = cycles.len(); + Some(indices[0..k].iter().map(|&i| vals[i].clone()).collect()) + }, + PermutationState::Complete(CompleteState::Start { .. }) | PermutationState::Empty => None + } + } + + fn count(self) -> usize { + fn from_complete(complete_state: CompleteState) -> usize { + match complete_state.remaining() { + CompleteStateRemaining::Known(count) => count, + CompleteStateRemaining::Overflow => { + panic!("Iterator count greater than usize::MAX"); + } + } + } + + let Permutations { vals, state } = self; + match state { + PermutationState::StartUnknownLen { k } => { + let n = vals.len() + vals.it.count(); + let complete_state = CompleteState::Start { n, k }; + + from_complete(complete_state) + } + PermutationState::OngoingUnknownLen { k, min_n } => { + let prev_iteration_count = min_n - k + 1; + let n = vals.len() + vals.it.count(); + let complete_state = CompleteState::Start { n, k }; + + from_complete(complete_state) - prev_iteration_count + }, + PermutationState::Complete(state) => from_complete(state), + PermutationState::Empty => 0 + } + } + + fn size_hint(&self) -> (usize, Option) { + match self.state { + PermutationState::StartUnknownLen { .. } | + PermutationState::OngoingUnknownLen { .. } => (0, None), // TODO can we improve this lower bound? + PermutationState::Complete(ref state) => match state.remaining() { + CompleteStateRemaining::Known(count) => (count, Some(count)), + CompleteStateRemaining::Overflow => (::std::usize::MAX, None) + } + PermutationState::Empty => (0, Some(0)) + } + } +} + +impl Permutations +where + I: Iterator, + I::Item: Clone +{ + fn advance(&mut self) { + let &mut Permutations { ref mut vals, ref mut state } = self; + + *state = match *state { + PermutationState::StartUnknownLen { k } => { + PermutationState::OngoingUnknownLen { k, min_n: k } + } + PermutationState::OngoingUnknownLen { k, min_n } => { + if vals.get_next() { + PermutationState::OngoingUnknownLen { k, min_n: min_n + 1 } + } else { + let n = min_n; + let prev_iteration_count = n - k + 1; + let mut complete_state = CompleteState::Start { n, k }; + + // Advance the complete-state iterator to the correct point + for _ in 0..(prev_iteration_count + 1) { + complete_state.advance(); + } + + PermutationState::Complete(complete_state) + } + } + PermutationState::Complete(ref mut state) => { + state.advance(); + + return; + } + PermutationState::Empty => { return; } + }; + } +} + +impl CompleteState { + fn advance(&mut self) { + *self = match *self { + CompleteState::Start { n, k } => { + let indices = (0..n).collect(); + let cycles = ((n - k)..n).rev().collect(); + + CompleteState::Ongoing { + cycles, + indices + } + }, + CompleteState::Ongoing { ref mut indices, ref mut cycles } => { + let n = indices.len(); + let k = cycles.len(); + + for i in (0..k).rev() { + if cycles[i] == 0 { + cycles[i] = n - i - 1; + + let to_push = indices.remove(i); + indices.push(to_push); + } else { + let swap_index = n - cycles[i]; + indices.swap(i, swap_index); + + cycles[i] -= 1; + return; + } + } + + CompleteState::Start { n, k } + } + } + } + + fn remaining(&self) -> CompleteStateRemaining { + use self::CompleteStateRemaining::{Known, Overflow}; + + match *self { + CompleteState::Start { n, k } => { + if n < k { + return Known(0); + } + + let count: Option = (n - k + 1..n + 1).fold(Some(1), |acc, i| { + acc.and_then(|acc| acc.checked_mul(i)) + }); + + match count { + Some(count) => Known(count), + None => Overflow + } + } + CompleteState::Ongoing { ref indices, ref cycles } => { + let mut count: usize = 0; + + for (i, &c) in cycles.iter().enumerate() { + let radix = indices.len() - i; + let next_count = count.checked_mul(radix) + .and_then(|count| count.checked_add(c)); + + count = match next_count { + Some(count) => count, + None => { return Overflow; } + }; + } + + Known(count) + } + } + } +} diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/src/powerset.rs temporalio-1.3.0/vendor/itertools-0.10.5/src/powerset.rs --- temporalio-1.3.0/vendor/itertools-0.10.5/src/powerset.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/src/powerset.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,90 @@ +use std::fmt; +use std::iter::FusedIterator; +use std::usize; +use alloc::vec::Vec; + +use super::combinations::{Combinations, combinations}; +use super::size_hint; + +/// An iterator to iterate through the powerset of the elements from an iterator. +/// +/// See [`.powerset()`](crate::Itertools::powerset) for more +/// information. +#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] +pub struct Powerset { + combs: Combinations, + // Iterator `position` (equal to count of yielded elements). + pos: usize, +} + +impl Clone for Powerset + where I: Clone + Iterator, + I::Item: Clone, +{ + clone_fields!(combs, pos); +} + +impl fmt::Debug for Powerset + where I: Iterator + fmt::Debug, + I::Item: fmt::Debug, +{ + debug_fmt_fields!(Powerset, combs, pos); +} + +/// Create a new `Powerset` from a clonable iterator. +pub fn powerset(src: I) -> Powerset + where I: Iterator, + I::Item: Clone, +{ + Powerset { + combs: combinations(src, 0), + pos: 0, + } +} + +impl Iterator for Powerset + where + I: Iterator, + I::Item: Clone, +{ + type Item = Vec; + + fn next(&mut self) -> Option { + if let Some(elt) = self.combs.next() { + self.pos = self.pos.saturating_add(1); + Some(elt) + } else if self.combs.k() < self.combs.n() + || self.combs.k() == 0 + { + self.combs.reset(self.combs.k() + 1); + self.combs.next().map(|elt| { + self.pos = self.pos.saturating_add(1); + elt + }) + } else { + None + } + } + + fn size_hint(&self) -> (usize, Option) { + // Total bounds for source iterator. + let src_total = size_hint::add_scalar(self.combs.src().size_hint(), self.combs.n()); + + // Total bounds for self ( length(powerset(set) == 2 ^ length(set) ) + let self_total = size_hint::pow_scalar_base(2, src_total); + + if self.pos < usize::MAX { + // Subtract count of elements already yielded from total. + size_hint::sub_scalar(self_total, self.pos) + } else { + // Fallback: self.pos is saturated and no longer reliable. + (0, self_total.1) + } + } +} + +impl FusedIterator for Powerset + where + I: Iterator, + I::Item: Clone, +{} diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/src/process_results_impl.rs temporalio-1.3.0/vendor/itertools-0.10.5/src/process_results_impl.rs --- temporalio-1.3.0/vendor/itertools-0.10.5/src/process_results_impl.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/src/process_results_impl.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,97 @@ + +/// An iterator that produces only the `T` values as long as the +/// inner iterator produces `Ok(T)`. +/// +/// Used by [`process_results`](crate::process_results), see its docs +/// for more information. +#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] +#[derive(Debug)] +pub struct ProcessResults<'a, I, E: 'a> { + error: &'a mut Result<(), E>, + iter: I, +} + +impl<'a, I, T, E> Iterator for ProcessResults<'a, I, E> + where I: Iterator> +{ + type Item = T; + + fn next(&mut self) -> Option { + match self.iter.next() { + Some(Ok(x)) => Some(x), + Some(Err(e)) => { + *self.error = Err(e); + None + } + None => None, + } + } + + fn size_hint(&self) -> (usize, Option) { + (0, self.iter.size_hint().1) + } + + fn fold(mut self, init: B, mut f: F) -> B + where + Self: Sized, + F: FnMut(B, Self::Item) -> B, + { + let error = self.error; + self.iter + .try_fold(init, |acc, opt| match opt { + Ok(x) => Ok(f(acc, x)), + Err(e) => { + *error = Err(e); + Err(acc) + } + }) + .unwrap_or_else(|e| e) + } +} + +/// “Lift†a function of the values of an iterator so that it can process +/// an iterator of `Result` values instead. +/// +/// `iterable` is an iterator or iterable with `Result` elements, where +/// `T` is the value type and `E` the error type. +/// +/// `processor` is a closure that receives an adapted version of the iterable +/// as the only argument — the adapted iterator produces elements of type `T`, +/// as long as the original iterator produces `Ok` values. +/// +/// If the original iterable produces an error at any point, the adapted +/// iterator ends and the `process_results` function will return the +/// error iself. +/// +/// Otherwise, the return value from the closure is returned wrapped +/// inside `Ok`. +/// +/// # Example +/// +/// ``` +/// use itertools::process_results; +/// +/// type R = Result; +/// +/// let first_values: Vec = vec![Ok(1), Ok(0), Ok(3)]; +/// let second_values: Vec = vec![Ok(2), Ok(1), Err("overflow")]; +/// +/// // “Lift†the iterator .max() method to work on the values in Results using process_results +/// +/// let first_max = process_results(first_values, |iter| iter.max().unwrap_or(0)); +/// let second_max = process_results(second_values, |iter| iter.max().unwrap_or(0)); +/// +/// assert_eq!(first_max, Ok(3)); +/// assert!(second_max.is_err()); +/// ``` +pub fn process_results(iterable: I, processor: F) -> Result + where I: IntoIterator>, + F: FnOnce(ProcessResults) -> R +{ + let iter = iterable.into_iter(); + let mut error = Ok(()); + + let result = processor(ProcessResults { error: &mut error, iter }); + + error.map(|_| result) +} diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/src/put_back_n_impl.rs temporalio-1.3.0/vendor/itertools-0.10.5/src/put_back_n_impl.rs --- temporalio-1.3.0/vendor/itertools-0.10.5/src/put_back_n_impl.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/src/put_back_n_impl.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,61 @@ +use alloc::vec::Vec; + +use crate::size_hint; + +/// An iterator adaptor that allows putting multiple +/// items in front of the iterator. +/// +/// Iterator element type is `I::Item`. +#[derive(Debug, Clone)] +pub struct PutBackN { + top: Vec, + iter: I, +} + +/// Create an iterator where you can put back multiple values to the front +/// of the iteration. +/// +/// Iterator element type is `I::Item`. +pub fn put_back_n(iterable: I) -> PutBackN + where I: IntoIterator +{ + PutBackN { + top: Vec::new(), + iter: iterable.into_iter(), + } +} + +impl PutBackN { + /// Puts x in front of the iterator. + /// The values are yielded in order of the most recently put back + /// values first. + /// + /// ```rust + /// use itertools::put_back_n; + /// + /// let mut it = put_back_n(1..5); + /// it.next(); + /// it.put_back(1); + /// it.put_back(0); + /// + /// assert!(itertools::equal(it, 0..5)); + /// ``` + #[inline] + pub fn put_back(&mut self, x: I::Item) { + self.top.push(x); + } +} + +impl Iterator for PutBackN { + type Item = I::Item; + #[inline] + fn next(&mut self) -> Option { + self.top.pop().or_else(|| self.iter.next()) + } + + #[inline] + fn size_hint(&self) -> (usize, Option) { + size_hint::add_scalar(self.iter.size_hint(), self.top.len()) + } +} + diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/src/rciter_impl.rs temporalio-1.3.0/vendor/itertools-0.10.5/src/rciter_impl.rs --- temporalio-1.3.0/vendor/itertools-0.10.5/src/rciter_impl.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/src/rciter_impl.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,99 @@ + +use std::iter::{FusedIterator, IntoIterator}; +use alloc::rc::Rc; +use std::cell::RefCell; + +/// A wrapper for `Rc>`, that implements the `Iterator` trait. +#[derive(Debug)] +pub struct RcIter { + /// The boxed iterator. + pub rciter: Rc>, +} + +/// Return an iterator inside a `Rc>` wrapper. +/// +/// The returned `RcIter` can be cloned, and each clone will refer back to the +/// same original iterator. +/// +/// `RcIter` allows doing interesting things like using `.zip()` on an iterator with +/// itself, at the cost of runtime borrow checking which may have a performance +/// penalty. +/// +/// Iterator element type is `Self::Item`. +/// +/// ``` +/// use itertools::rciter; +/// use itertools::zip; +/// +/// // In this example a range iterator is created and we iterate it using +/// // three separate handles (two of them given to zip). +/// // We also use the IntoIterator implementation for `&RcIter`. +/// +/// let mut iter = rciter(0..9); +/// let mut z = zip(&iter, &iter); +/// +/// assert_eq!(z.next(), Some((0, 1))); +/// assert_eq!(z.next(), Some((2, 3))); +/// assert_eq!(z.next(), Some((4, 5))); +/// assert_eq!(iter.next(), Some(6)); +/// assert_eq!(z.next(), Some((7, 8))); +/// assert_eq!(z.next(), None); +/// ``` +/// +/// **Panics** in iterator methods if a borrow error is encountered in the +/// iterator methods. It can only happen if the `RcIter` is reentered in +/// `.next()`, i.e. if it somehow participates in an “iterator knot†+/// where it is an adaptor of itself. +pub fn rciter(iterable: I) -> RcIter + where I: IntoIterator +{ + RcIter { rciter: Rc::new(RefCell::new(iterable.into_iter())) } +} + +impl Clone for RcIter { + clone_fields!(rciter); +} + +impl Iterator for RcIter + where I: Iterator +{ + type Item = A; + #[inline] + fn next(&mut self) -> Option { + self.rciter.borrow_mut().next() + } + + #[inline] + fn size_hint(&self) -> (usize, Option) { + // To work sanely with other API that assume they own an iterator, + // so it can't change in other places, we can't guarantee as much + // in our size_hint. Other clones may drain values under our feet. + (0, self.rciter.borrow().size_hint().1) + } +} + +impl DoubleEndedIterator for RcIter + where I: DoubleEndedIterator +{ + #[inline] + fn next_back(&mut self) -> Option { + self.rciter.borrow_mut().next_back() + } +} + +/// Return an iterator from `&RcIter` (by simply cloning it). +impl<'a, I> IntoIterator for &'a RcIter + where I: Iterator +{ + type Item = I::Item; + type IntoIter = RcIter; + + fn into_iter(self) -> RcIter { + self.clone() + } +} + + +impl FusedIterator for RcIter + where I: FusedIterator +{} diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/src/repeatn.rs temporalio-1.3.0/vendor/itertools-0.10.5/src/repeatn.rs --- temporalio-1.3.0/vendor/itertools-0.10.5/src/repeatn.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/src/repeatn.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,59 @@ +use std::iter::FusedIterator; + +/// An iterator that produces *n* repetitions of an element. +/// +/// See [`repeat_n()`](crate::repeat_n) for more information. +#[must_use = "iterators are lazy and do nothing unless consumed"] +#[derive(Clone, Debug)] +pub struct RepeatN { + elt: Option, + n: usize, +} + +/// Create an iterator that produces `n` repetitions of `element`. +pub fn repeat_n(element: A, n: usize) -> RepeatN + where A: Clone, +{ + if n == 0 { + RepeatN { elt: None, n, } + } else { + RepeatN { elt: Some(element), n, } + } +} + +impl Iterator for RepeatN + where A: Clone +{ + type Item = A; + + fn next(&mut self) -> Option { + if self.n > 1 { + self.n -= 1; + self.elt.as_ref().cloned() + } else { + self.n = 0; + self.elt.take() + } + } + + fn size_hint(&self) -> (usize, Option) { + (self.n, Some(self.n)) + } +} + +impl DoubleEndedIterator for RepeatN + where A: Clone +{ + #[inline] + fn next_back(&mut self) -> Option { + self.next() + } +} + +impl ExactSizeIterator for RepeatN + where A: Clone +{} + +impl FusedIterator for RepeatN + where A: Clone +{} diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/src/size_hint.rs temporalio-1.3.0/vendor/itertools-0.10.5/src/size_hint.rs --- temporalio-1.3.0/vendor/itertools-0.10.5/src/size_hint.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/src/size_hint.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,119 @@ +//! Arithmetic on `Iterator.size_hint()` values. +//! + +use std::usize; +use std::cmp; +use std::u32; + +/// `SizeHint` is the return type of `Iterator::size_hint()`. +pub type SizeHint = (usize, Option); + +/// Add `SizeHint` correctly. +#[inline] +pub fn add(a: SizeHint, b: SizeHint) -> SizeHint { + let min = a.0.saturating_add(b.0); + let max = match (a.1, b.1) { + (Some(x), Some(y)) => x.checked_add(y), + _ => None, + }; + + (min, max) +} + +/// Add `x` correctly to a `SizeHint`. +#[inline] +pub fn add_scalar(sh: SizeHint, x: usize) -> SizeHint { + let (mut low, mut hi) = sh; + low = low.saturating_add(x); + hi = hi.and_then(|elt| elt.checked_add(x)); + (low, hi) +} + +/// Subtract `x` correctly from a `SizeHint`. +#[inline] +#[allow(dead_code)] +pub fn sub_scalar(sh: SizeHint, x: usize) -> SizeHint { + let (mut low, mut hi) = sh; + low = low.saturating_sub(x); + hi = hi.map(|elt| elt.saturating_sub(x)); + (low, hi) +} + + +/// Multiply `SizeHint` correctly +/// +/// ```ignore +/// use std::usize; +/// use itertools::size_hint; +/// +/// assert_eq!(size_hint::mul((3, Some(4)), (3, Some(4))), +/// (9, Some(16))); +/// +/// assert_eq!(size_hint::mul((3, Some(4)), (usize::MAX, None)), +/// (usize::MAX, None)); +/// +/// assert_eq!(size_hint::mul((3, None), (0, Some(0))), +/// (0, Some(0))); +/// ``` +#[inline] +pub fn mul(a: SizeHint, b: SizeHint) -> SizeHint { + let low = a.0.saturating_mul(b.0); + let hi = match (a.1, b.1) { + (Some(x), Some(y)) => x.checked_mul(y), + (Some(0), None) | (None, Some(0)) => Some(0), + _ => None, + }; + (low, hi) +} + +/// Multiply `x` correctly with a `SizeHint`. +#[inline] +pub fn mul_scalar(sh: SizeHint, x: usize) -> SizeHint { + let (mut low, mut hi) = sh; + low = low.saturating_mul(x); + hi = hi.and_then(|elt| elt.checked_mul(x)); + (low, hi) +} + +/// Raise `base` correctly by a `SizeHint` exponent. +#[inline] +pub fn pow_scalar_base(base: usize, exp: SizeHint) -> SizeHint { + let exp_low = cmp::min(exp.0, u32::MAX as usize) as u32; + let low = base.saturating_pow(exp_low); + + let hi = exp.1.and_then(|exp| { + let exp_hi = cmp::min(exp, u32::MAX as usize) as u32; + base.checked_pow(exp_hi) + }); + + (low, hi) +} + +/// Return the maximum +#[inline] +pub fn max(a: SizeHint, b: SizeHint) -> SizeHint { + let (a_lower, a_upper) = a; + let (b_lower, b_upper) = b; + + let lower = cmp::max(a_lower, b_lower); + + let upper = match (a_upper, b_upper) { + (Some(x), Some(y)) => Some(cmp::max(x, y)), + _ => None, + }; + + (lower, upper) +} + +/// Return the minimum +#[inline] +pub fn min(a: SizeHint, b: SizeHint) -> SizeHint { + let (a_lower, a_upper) = a; + let (b_lower, b_upper) = b; + let lower = cmp::min(a_lower, b_lower); + let upper = match (a_upper, b_upper) { + (Some(u1), Some(u2)) => Some(cmp::min(u1, u2)), + _ => a_upper.or(b_upper), + }; + (lower, upper) +} diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/src/sources.rs temporalio-1.3.0/vendor/itertools-0.10.5/src/sources.rs --- temporalio-1.3.0/vendor/itertools-0.10.5/src/sources.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/src/sources.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,183 @@ +//! Iterators that are sources (produce elements from parameters, +//! not from another iterator). +#![allow(deprecated)] + +use std::fmt; +use std::mem; + +/// See [`repeat_call`](crate::repeat_call) for more information. +#[derive(Clone)] +#[deprecated(note="Use std repeat_with() instead", since="0.8.0")] +pub struct RepeatCall { + f: F, +} + +impl fmt::Debug for RepeatCall +{ + debug_fmt_fields!(RepeatCall, ); +} + +/// An iterator source that produces elements indefinitely by calling +/// a given closure. +/// +/// Iterator element type is the return type of the closure. +/// +/// ``` +/// use itertools::repeat_call; +/// use itertools::Itertools; +/// use std::collections::BinaryHeap; +/// +/// let mut heap = BinaryHeap::from(vec![2, 5, 3, 7, 8]); +/// +/// // extract each element in sorted order +/// for element in repeat_call(|| heap.pop()).while_some() { +/// print!("{}", element); +/// } +/// +/// itertools::assert_equal( +/// repeat_call(|| 1).take(5), +/// vec![1, 1, 1, 1, 1] +/// ); +/// ``` +#[deprecated(note="Use std repeat_with() instead", since="0.8.0")] +pub fn repeat_call(function: F) -> RepeatCall + where F: FnMut() -> A +{ + RepeatCall { f: function } +} + +impl Iterator for RepeatCall + where F: FnMut() -> A +{ + type Item = A; + + #[inline] + fn next(&mut self) -> Option { + Some((self.f)()) + } + + fn size_hint(&self) -> (usize, Option) { + (usize::max_value(), None) + } +} + +/// Creates a new unfold source with the specified closure as the "iterator +/// function" and an initial state to eventually pass to the closure +/// +/// `unfold` is a general iterator builder: it has a mutable state value, +/// and a closure with access to the state that produces the next value. +/// +/// This more or less equivalent to a regular struct with an [`Iterator`] +/// implementation, and is useful for one-off iterators. +/// +/// ``` +/// // an iterator that yields sequential Fibonacci numbers, +/// // and stops at the maximum representable value. +/// +/// use itertools::unfold; +/// +/// let mut fibonacci = unfold((1u32, 1u32), |(x1, x2)| { +/// // Attempt to get the next Fibonacci number +/// let next = x1.saturating_add(*x2); +/// +/// // Shift left: ret <- x1 <- x2 <- next +/// let ret = *x1; +/// *x1 = *x2; +/// *x2 = next; +/// +/// // If addition has saturated at the maximum, we are finished +/// if ret == *x1 && ret > 1 { +/// None +/// } else { +/// Some(ret) +/// } +/// }); +/// +/// itertools::assert_equal(fibonacci.by_ref().take(8), +/// vec![1, 1, 2, 3, 5, 8, 13, 21]); +/// assert_eq!(fibonacci.last(), Some(2_971_215_073)) +/// ``` +pub fn unfold(initial_state: St, f: F) -> Unfold + where F: FnMut(&mut St) -> Option +{ + Unfold { + f, + state: initial_state, + } +} + +impl fmt::Debug for Unfold + where St: fmt::Debug, +{ + debug_fmt_fields!(Unfold, state); +} + +/// See [`unfold`](crate::unfold) for more information. +#[derive(Clone)] +#[must_use = "iterators are lazy and do nothing unless consumed"] +pub struct Unfold { + f: F, + /// Internal state that will be passed to the closure on the next iteration + pub state: St, +} + +impl Iterator for Unfold + where F: FnMut(&mut St) -> Option +{ + type Item = A; + + #[inline] + fn next(&mut self) -> Option { + (self.f)(&mut self.state) + } +} + +/// An iterator that infinitely applies function to value and yields results. +/// +/// This `struct` is created by the [`iterate()`](crate::iterate) function. +/// See its documentation for more. +#[derive(Clone)] +#[must_use = "iterators are lazy and do nothing unless consumed"] +pub struct Iterate { + state: St, + f: F, +} + +impl fmt::Debug for Iterate + where St: fmt::Debug, +{ + debug_fmt_fields!(Iterate, state); +} + +impl Iterator for Iterate + where F: FnMut(&St) -> St +{ + type Item = St; + + #[inline] + fn next(&mut self) -> Option { + let next_state = (self.f)(&self.state); + Some(mem::replace(&mut self.state, next_state)) + } + + #[inline] + fn size_hint(&self) -> (usize, Option) { + (usize::max_value(), None) + } +} + +/// Creates a new iterator that infinitely applies function to value and yields results. +/// +/// ``` +/// use itertools::iterate; +/// +/// itertools::assert_equal(iterate(1, |&i| i * 3).take(5), vec![1, 3, 9, 27, 81]); +/// ``` +pub fn iterate(initial_value: St, f: F) -> Iterate + where F: FnMut(&St) -> St +{ + Iterate { + state: initial_value, + f, + } +} diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/src/tee.rs temporalio-1.3.0/vendor/itertools-0.10.5/src/tee.rs --- temporalio-1.3.0/vendor/itertools-0.10.5/src/tee.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/src/tee.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,78 @@ +use super::size_hint; + +use std::cell::RefCell; +use alloc::collections::VecDeque; +use alloc::rc::Rc; + +/// Common buffer object for the two tee halves +#[derive(Debug)] +struct TeeBuffer { + backlog: VecDeque, + iter: I, + /// The owner field indicates which id should read from the backlog + owner: bool, +} + +/// One half of an iterator pair where both return the same elements. +/// +/// See [`.tee()`](crate::Itertools::tee) for more information. +#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] +#[derive(Debug)] +pub struct Tee + where I: Iterator +{ + rcbuffer: Rc>>, + id: bool, +} + +pub fn new(iter: I) -> (Tee, Tee) + where I: Iterator +{ + let buffer = TeeBuffer{backlog: VecDeque::new(), iter, owner: false}; + let t1 = Tee{rcbuffer: Rc::new(RefCell::new(buffer)), id: true}; + let t2 = Tee{rcbuffer: t1.rcbuffer.clone(), id: false}; + (t1, t2) +} + +impl Iterator for Tee + where I: Iterator, + I::Item: Clone +{ + type Item = I::Item; + fn next(&mut self) -> Option { + // .borrow_mut may fail here -- but only if the user has tied some kind of weird + // knot where the iterator refers back to itself. + let mut buffer = self.rcbuffer.borrow_mut(); + if buffer.owner == self.id { + match buffer.backlog.pop_front() { + None => {} + some_elt => return some_elt, + } + } + match buffer.iter.next() { + None => None, + Some(elt) => { + buffer.backlog.push_back(elt.clone()); + buffer.owner = !self.id; + Some(elt) + } + } + } + + fn size_hint(&self) -> (usize, Option) { + let buffer = self.rcbuffer.borrow(); + let sh = buffer.iter.size_hint(); + + if buffer.owner == self.id { + let log_len = buffer.backlog.len(); + size_hint::add_scalar(sh, log_len) + } else { + sh + } + } +} + +impl ExactSizeIterator for Tee + where I: ExactSizeIterator, + I::Item: Clone +{} diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/src/tuple_impl.rs temporalio-1.3.0/vendor/itertools-0.10.5/src/tuple_impl.rs --- temporalio-1.3.0/vendor/itertools-0.10.5/src/tuple_impl.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/src/tuple_impl.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,331 @@ +//! Some iterator that produces tuples + +use std::iter::Fuse; +use std::iter::FusedIterator; +use std::iter::Take; +use std::iter::Cycle; +use std::marker::PhantomData; + +// `HomogeneousTuple` is a public facade for `TupleCollect`, allowing +// tuple-related methods to be used by clients in generic contexts, while +// hiding the implementation details of `TupleCollect`. +// See https://github.com/rust-itertools/itertools/issues/387 + +/// Implemented for homogeneous tuples of size up to 12. +pub trait HomogeneousTuple + : TupleCollect +{} + +impl HomogeneousTuple for T {} + +/// An iterator over a incomplete tuple. +/// +/// See [`.tuples()`](crate::Itertools::tuples) and +/// [`Tuples::into_buffer()`]. +#[derive(Clone, Debug)] +pub struct TupleBuffer + where T: HomogeneousTuple +{ + cur: usize, + buf: T::Buffer, +} + +impl TupleBuffer + where T: HomogeneousTuple +{ + fn new(buf: T::Buffer) -> Self { + TupleBuffer { + cur: 0, + buf, + } + } +} + +impl Iterator for TupleBuffer + where T: HomogeneousTuple +{ + type Item = T::Item; + + fn next(&mut self) -> Option { + let s = self.buf.as_mut(); + if let Some(ref mut item) = s.get_mut(self.cur) { + self.cur += 1; + item.take() + } else { + None + } + } + + fn size_hint(&self) -> (usize, Option) { + let buffer = &self.buf.as_ref()[self.cur..]; + let len = if buffer.is_empty() { + 0 + } else { + buffer.iter() + .position(|x| x.is_none()) + .unwrap_or_else(|| buffer.len()) + }; + (len, Some(len)) + } +} + +impl ExactSizeIterator for TupleBuffer + where T: HomogeneousTuple +{ +} + +/// An iterator that groups the items in tuples of a specific size. +/// +/// See [`.tuples()`](crate::Itertools::tuples) for more information. +#[derive(Clone, Debug)] +#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] +pub struct Tuples + where I: Iterator, + T: HomogeneousTuple +{ + iter: Fuse, + buf: T::Buffer, +} + +/// Create a new tuples iterator. +pub fn tuples(iter: I) -> Tuples + where I: Iterator, + T: HomogeneousTuple +{ + Tuples { + iter: iter.fuse(), + buf: Default::default(), + } +} + +impl Iterator for Tuples + where I: Iterator, + T: HomogeneousTuple +{ + type Item = T; + + fn next(&mut self) -> Option { + T::collect_from_iter(&mut self.iter, &mut self.buf) + } +} + +impl Tuples + where I: Iterator, + T: HomogeneousTuple +{ + /// Return a buffer with the produced items that was not enough to be grouped in a tuple. + /// + /// ``` + /// use itertools::Itertools; + /// + /// let mut iter = (0..5).tuples(); + /// assert_eq!(Some((0, 1, 2)), iter.next()); + /// assert_eq!(None, iter.next()); + /// itertools::assert_equal(vec![3, 4], iter.into_buffer()); + /// ``` + pub fn into_buffer(self) -> TupleBuffer { + TupleBuffer::new(self.buf) + } +} + + +/// An iterator over all contiguous windows that produces tuples of a specific size. +/// +/// See [`.tuple_windows()`](crate::Itertools::tuple_windows) for more +/// information. +#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] +#[derive(Clone, Debug)] +pub struct TupleWindows + where I: Iterator, + T: HomogeneousTuple +{ + iter: I, + last: Option, +} + +/// Create a new tuple windows iterator. +pub fn tuple_windows(mut iter: I) -> TupleWindows + where I: Iterator, + T: HomogeneousTuple, + T::Item: Clone +{ + use std::iter::once; + + let mut last = None; + if T::num_items() != 1 { + // put in a duplicate item in front of the tuple; this simplifies + // .next() function. + if let Some(item) = iter.next() { + let iter = once(item.clone()).chain(once(item)).chain(&mut iter); + last = T::collect_from_iter_no_buf(iter); + } + } + + TupleWindows { + iter, + last, + } +} + +impl Iterator for TupleWindows + where I: Iterator, + T: HomogeneousTuple + Clone, + T::Item: Clone +{ + type Item = T; + + fn next(&mut self) -> Option { + if T::num_items() == 1 { + return T::collect_from_iter_no_buf(&mut self.iter) + } + if let Some(ref mut last) = self.last { + if let Some(new) = self.iter.next() { + last.left_shift_push(new); + return Some(last.clone()); + } + } + None + } +} + +impl FusedIterator for TupleWindows + where I: FusedIterator, + T: HomogeneousTuple + Clone, + T::Item: Clone +{} + +/// An iterator over all windows,wrapping back to the first elements when the +/// window would otherwise exceed the length of the iterator, producing tuples +/// of a specific size. +/// +/// See [`.circular_tuple_windows()`](crate::Itertools::circular_tuple_windows) for more +/// information. +#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] +#[derive(Debug)] +pub struct CircularTupleWindows + where I: Iterator + Clone, + T: TupleCollect + Clone +{ + iter: Take, T>>, + phantom_data: PhantomData +} + +pub fn circular_tuple_windows(iter: I) -> CircularTupleWindows + where I: Iterator + Clone + ExactSizeIterator, + T: TupleCollect + Clone, + T::Item: Clone +{ + let len = iter.len(); + let iter = tuple_windows(iter.cycle()).take(len); + + CircularTupleWindows { + iter, + phantom_data: PhantomData{} + } +} + +impl Iterator for CircularTupleWindows + where I: Iterator + Clone, + T: TupleCollect + Clone, + T::Item: Clone +{ + type Item = T; + + fn next(&mut self) -> Option { + self.iter.next() + } +} + +pub trait TupleCollect: Sized { + type Item; + type Buffer: Default + AsRef<[Option]> + AsMut<[Option]>; + + fn collect_from_iter(iter: I, buf: &mut Self::Buffer) -> Option + where I: IntoIterator; + + fn collect_from_iter_no_buf(iter: I) -> Option + where I: IntoIterator; + + fn num_items() -> usize; + + fn left_shift_push(&mut self, item: Self::Item); +} + +macro_rules! count_ident{ + () => {0}; + ($i0:ident, $($i:ident,)*) => {1 + count_ident!($($i,)*)}; +} +macro_rules! rev_for_each_ident{ + ($m:ident, ) => {}; + ($m:ident, $i0:ident, $($i:ident,)*) => { + rev_for_each_ident!($m, $($i,)*); + $m!($i0); + }; +} + +macro_rules! impl_tuple_collect { + ($dummy:ident,) => {}; // stop + ($dummy:ident, $($Y:ident,)*) => ( + impl_tuple_collect!($($Y,)*); + impl TupleCollect for ($(ignore_ident!($Y, A),)*) { + type Item = A; + type Buffer = [Option; count_ident!($($Y,)*) - 1]; + + #[allow(unused_assignments, unused_mut)] + fn collect_from_iter(iter: I, buf: &mut Self::Buffer) -> Option + where I: IntoIterator + { + let mut iter = iter.into_iter(); + $( + let mut $Y = None; + )* + + loop { + $( + $Y = iter.next(); + if $Y.is_none() { + break + } + )* + return Some(($($Y.unwrap()),*,)) + } + + let mut i = 0; + let mut s = buf.as_mut(); + $( + if i < s.len() { + s[i] = $Y; + i += 1; + } + )* + return None; + } + + fn collect_from_iter_no_buf(iter: I) -> Option + where I: IntoIterator + { + let mut iter = iter.into_iter(); + + Some(($( + { let $Y = iter.next()?; $Y }, + )*)) + } + + fn num_items() -> usize { + count_ident!($($Y,)*) + } + + fn left_shift_push(&mut self, mut item: A) { + use std::mem::replace; + + let &mut ($(ref mut $Y),*,) = self; + macro_rules! replace_item{($i:ident) => { + item = replace($i, item); + }} + rev_for_each_ident!(replace_item, $($Y,)*); + drop(item); + } + } + ) +} +impl_tuple_collect!(dummy, a, b, c, d, e, f, g, h, i, j, k, l,); diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/src/unique_impl.rs temporalio-1.3.0/vendor/itertools-0.10.5/src/unique_impl.rs --- temporalio-1.3.0/vendor/itertools-0.10.5/src/unique_impl.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/src/unique_impl.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,179 @@ +use std::collections::HashMap; +use std::collections::hash_map::Entry; +use std::hash::Hash; +use std::fmt; +use std::iter::FusedIterator; + +/// An iterator adapter to filter out duplicate elements. +/// +/// See [`.unique_by()`](crate::Itertools::unique) for more information. +#[derive(Clone)] +#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] +pub struct UniqueBy { + iter: I, + // Use a Hashmap for the Entry API in order to prevent hashing twice. + // This can maybe be replaced with a HashSet once `get_or_insert_with` + // or a proper Entry API for Hashset is stable and meets this msrv + used: HashMap, + f: F, +} + +impl fmt::Debug for UniqueBy + where I: Iterator + fmt::Debug, + V: fmt::Debug + Hash + Eq, +{ + debug_fmt_fields!(UniqueBy, iter, used); +} + +/// Create a new `UniqueBy` iterator. +pub fn unique_by(iter: I, f: F) -> UniqueBy + where V: Eq + Hash, + F: FnMut(&I::Item) -> V, + I: Iterator, +{ + UniqueBy { + iter, + used: HashMap::new(), + f, + } +} + +// count the number of new unique keys in iterable (`used` is the set already seen) +fn count_new_keys(mut used: HashMap, iterable: I) -> usize + where I: IntoIterator, + K: Hash + Eq, +{ + let iter = iterable.into_iter(); + let current_used = used.len(); + used.extend(iter.map(|key| (key, ()))); + used.len() - current_used +} + +impl Iterator for UniqueBy + where I: Iterator, + V: Eq + Hash, + F: FnMut(&I::Item) -> V +{ + type Item = I::Item; + + fn next(&mut self) -> Option { + while let Some(v) = self.iter.next() { + let key = (self.f)(&v); + if self.used.insert(key, ()).is_none() { + return Some(v); + } + } + None + } + + #[inline] + fn size_hint(&self) -> (usize, Option) { + let (low, hi) = self.iter.size_hint(); + ((low > 0 && self.used.is_empty()) as usize, hi) + } + + fn count(self) -> usize { + let mut key_f = self.f; + count_new_keys(self.used, self.iter.map(move |elt| key_f(&elt))) + } +} + +impl DoubleEndedIterator for UniqueBy + where I: DoubleEndedIterator, + V: Eq + Hash, + F: FnMut(&I::Item) -> V +{ + fn next_back(&mut self) -> Option { + while let Some(v) = self.iter.next_back() { + let key = (self.f)(&v); + if self.used.insert(key, ()).is_none() { + return Some(v); + } + } + None + } +} + +impl FusedIterator for UniqueBy + where I: FusedIterator, + V: Eq + Hash, + F: FnMut(&I::Item) -> V +{} + +impl Iterator for Unique + where I: Iterator, + I::Item: Eq + Hash + Clone +{ + type Item = I::Item; + + fn next(&mut self) -> Option { + while let Some(v) = self.iter.iter.next() { + if let Entry::Vacant(entry) = self.iter.used.entry(v) { + let elt = entry.key().clone(); + entry.insert(()); + return Some(elt); + } + } + None + } + + #[inline] + fn size_hint(&self) -> (usize, Option) { + let (low, hi) = self.iter.iter.size_hint(); + ((low > 0 && self.iter.used.is_empty()) as usize, hi) + } + + fn count(self) -> usize { + count_new_keys(self.iter.used, self.iter.iter) + } +} + +impl DoubleEndedIterator for Unique + where I: DoubleEndedIterator, + I::Item: Eq + Hash + Clone +{ + fn next_back(&mut self) -> Option { + while let Some(v) = self.iter.iter.next_back() { + if let Entry::Vacant(entry) = self.iter.used.entry(v) { + let elt = entry.key().clone(); + entry.insert(()); + return Some(elt); + } + } + None + } +} + +impl FusedIterator for Unique + where I: FusedIterator, + I::Item: Eq + Hash + Clone +{} + +/// An iterator adapter to filter out duplicate elements. +/// +/// See [`.unique()`](crate::Itertools::unique) for more information. +#[derive(Clone)] +#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] +pub struct Unique { + iter: UniqueBy, +} + +impl fmt::Debug for Unique + where I: Iterator + fmt::Debug, + I::Item: Hash + Eq + fmt::Debug, +{ + debug_fmt_fields!(Unique, iter); +} + +pub fn unique(iter: I) -> Unique + where I: Iterator, + I::Item: Eq + Hash, +{ + Unique { + iter: UniqueBy { + iter, + used: HashMap::new(), + f: (), + } + } +} diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/src/unziptuple.rs temporalio-1.3.0/vendor/itertools-0.10.5/src/unziptuple.rs --- temporalio-1.3.0/vendor/itertools-0.10.5/src/unziptuple.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/src/unziptuple.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,80 @@ +/// Converts an iterator of tuples into a tuple of containers. +/// +/// `unzip()` consumes an entire iterator of n-ary tuples, producing `n` collections, one for each +/// column. +/// +/// This function is, in some sense, the opposite of [`multizip`]. +/// +/// ``` +/// use itertools::multiunzip; +/// +/// let inputs = vec![(1, 2, 3), (4, 5, 6), (7, 8, 9)]; +/// +/// let (a, b, c): (Vec<_>, Vec<_>, Vec<_>) = multiunzip(inputs); +/// +/// assert_eq!(a, vec![1, 4, 7]); +/// assert_eq!(b, vec![2, 5, 8]); +/// assert_eq!(c, vec![3, 6, 9]); +/// ``` +/// +/// [`multizip`]: crate::multizip +pub fn multiunzip(i: I) -> FromI +where + I: IntoIterator, + I::IntoIter: MultiUnzip, +{ + i.into_iter().multiunzip() +} + +/// An iterator that can be unzipped into multiple collections. +/// +/// See [`.multiunzip()`](crate::Itertools::multiunzip) for more information. +pub trait MultiUnzip: Iterator { + /// Unzip this iterator into multiple collections. + fn multiunzip(self) -> FromI; +} + +macro_rules! impl_unzip_iter { + ($($T:ident => $FromT:ident),*) => ( + #[allow(non_snake_case)] + impl, $($T, $FromT: Default + Extend<$T>),* > MultiUnzip<($($FromT,)*)> for IT { + fn multiunzip(self) -> ($($FromT,)*) { + // This implementation mirrors the logic of Iterator::unzip resp. Extend for (A, B) as close as possible. + // Unfortunately a lot of the used api there is still unstable (https://github.com/rust-lang/rust/issues/72631). + // + // Iterator::unzip: https://doc.rust-lang.org/src/core/iter/traits/iterator.rs.html#2825-2865 + // Extend for (A, B): https://doc.rust-lang.org/src/core/iter/traits/collect.rs.html#370-411 + + let mut res = ($($FromT::default(),)*); + let ($($FromT,)*) = &mut res; + + // Still unstable #72631 + // let (lower_bound, _) = self.size_hint(); + // if lower_bound > 0 { + // $($FromT.extend_reserve(lower_bound);)* + // } + + self.fold((), |(), ($($T,)*)| { + // Still unstable #72631 + // $( $FromT.extend_one($T); )* + $( $FromT.extend(std::iter::once($T)); )* + }); + res + } + } + ); +} + +impl_unzip_iter!(); +impl_unzip_iter!(A => FromA); +impl_unzip_iter!(A => FromA, B => FromB); +impl_unzip_iter!(A => FromA, B => FromB, C => FromC); +impl_unzip_iter!(A => FromA, B => FromB, C => FromC, D => FromD); +impl_unzip_iter!(A => FromA, B => FromB, C => FromC, D => FromD, E => FromE); +impl_unzip_iter!(A => FromA, B => FromB, C => FromC, D => FromD, E => FromE, F => FromF); +impl_unzip_iter!(A => FromA, B => FromB, C => FromC, D => FromD, E => FromE, F => FromF, G => FromG); +impl_unzip_iter!(A => FromA, B => FromB, C => FromC, D => FromD, E => FromE, F => FromF, G => FromG, H => FromH); +impl_unzip_iter!(A => FromA, B => FromB, C => FromC, D => FromD, E => FromE, F => FromF, G => FromG, H => FromH, I => FromI); +impl_unzip_iter!(A => FromA, B => FromB, C => FromC, D => FromD, E => FromE, F => FromF, G => FromG, H => FromH, I => FromI, J => FromJ); +impl_unzip_iter!(A => FromA, B => FromB, C => FromC, D => FromD, E => FromE, F => FromF, G => FromG, H => FromH, I => FromI, J => FromJ, K => FromK); +impl_unzip_iter!(A => FromA, B => FromB, C => FromC, D => FromD, E => FromE, F => FromF, G => FromG, H => FromH, I => FromI, J => FromJ, K => FromK, L => FromL); diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/src/with_position.rs temporalio-1.3.0/vendor/itertools-0.10.5/src/with_position.rs --- temporalio-1.3.0/vendor/itertools-0.10.5/src/with_position.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/src/with_position.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,100 @@ +use std::iter::{Fuse,Peekable, FusedIterator}; + +/// An iterator adaptor that wraps each element in an [`Position`]. +/// +/// Iterator element type is `Position`. +/// +/// See [`.with_position()`](crate::Itertools::with_position) for more information. +#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] +pub struct WithPosition + where I: Iterator, +{ + handled_first: bool, + peekable: Peekable>, +} + +impl Clone for WithPosition + where I: Clone + Iterator, + I::Item: Clone, +{ + clone_fields!(handled_first, peekable); +} + +/// Create a new `WithPosition` iterator. +pub fn with_position(iter: I) -> WithPosition + where I: Iterator, +{ + WithPosition { + handled_first: false, + peekable: iter.fuse().peekable(), + } +} + +/// A value yielded by `WithPosition`. +/// Indicates the position of this element in the iterator results. +/// +/// See [`.with_position()`](crate::Itertools::with_position) for more information. +#[derive(Copy, Clone, Debug, PartialEq)] +pub enum Position { + /// This is the first element. + First(T), + /// This is neither the first nor the last element. + Middle(T), + /// This is the last element. + Last(T), + /// This is the only element. + Only(T), +} + +impl Position { + /// Return the inner value. + pub fn into_inner(self) -> T { + match self { + Position::First(x) | + Position::Middle(x) | + Position::Last(x) | + Position::Only(x) => x, + } + } +} + +impl Iterator for WithPosition { + type Item = Position; + + fn next(&mut self) -> Option { + match self.peekable.next() { + Some(item) => { + if !self.handled_first { + // Haven't seen the first item yet, and there is one to give. + self.handled_first = true; + // Peek to see if this is also the last item, + // in which case tag it as `Only`. + match self.peekable.peek() { + Some(_) => Some(Position::First(item)), + None => Some(Position::Only(item)), + } + } else { + // Have seen the first item, and there's something left. + // Peek to see if this is the last item. + match self.peekable.peek() { + Some(_) => Some(Position::Middle(item)), + None => Some(Position::Last(item)), + } + } + } + // Iterator is finished. + None => None, + } + } + + fn size_hint(&self) -> (usize, Option) { + self.peekable.size_hint() + } +} + +impl ExactSizeIterator for WithPosition + where I: ExactSizeIterator, +{ } + +impl FusedIterator for WithPosition +{} diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/src/zip_eq_impl.rs temporalio-1.3.0/vendor/itertools-0.10.5/src/zip_eq_impl.rs --- temporalio-1.3.0/vendor/itertools-0.10.5/src/zip_eq_impl.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/src/zip_eq_impl.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,60 @@ +use super::size_hint; + +/// An iterator which iterates two other iterators simultaneously +/// +/// See [`.zip_eq()`](crate::Itertools::zip_eq) for more information. +#[derive(Clone, Debug)] +#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] +pub struct ZipEq { + a: I, + b: J, +} + +/// Iterate `i` and `j` in lock step. +/// +/// **Panics** if the iterators are not of the same length. +/// +/// [`IntoIterator`] enabled version of [`Itertools::zip_eq`](crate::Itertools::zip_eq). +/// +/// ``` +/// use itertools::zip_eq; +/// +/// let data = [1, 2, 3, 4, 5]; +/// for (a, b) in zip_eq(&data[..data.len() - 1], &data[1..]) { +/// /* loop body */ +/// } +/// ``` +pub fn zip_eq(i: I, j: J) -> ZipEq + where I: IntoIterator, + J: IntoIterator +{ + ZipEq { + a: i.into_iter(), + b: j.into_iter(), + } +} + +impl Iterator for ZipEq + where I: Iterator, + J: Iterator +{ + type Item = (I::Item, J::Item); + + fn next(&mut self) -> Option { + match (self.a.next(), self.b.next()) { + (None, None) => None, + (Some(a), Some(b)) => Some((a, b)), + (None, Some(_)) | (Some(_), None) => + panic!("itertools: .zip_eq() reached end of one iterator before the other") + } + } + + fn size_hint(&self) -> (usize, Option) { + size_hint::min(self.a.size_hint(), self.b.size_hint()) + } +} + +impl ExactSizeIterator for ZipEq + where I: ExactSizeIterator, + J: ExactSizeIterator +{} diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/src/zip_longest.rs temporalio-1.3.0/vendor/itertools-0.10.5/src/zip_longest.rs --- temporalio-1.3.0/vendor/itertools-0.10.5/src/zip_longest.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/src/zip_longest.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,83 @@ +use std::cmp::Ordering::{Equal, Greater, Less}; +use super::size_hint; +use std::iter::{Fuse, FusedIterator}; + +use crate::either_or_both::EitherOrBoth; + +// ZipLongest originally written by SimonSapin, +// and dedicated to itertools https://github.com/rust-lang/rust/pull/19283 + +/// An iterator which iterates two other iterators simultaneously +/// +/// This iterator is *fused*. +/// +/// See [`.zip_longest()`](crate::Itertools::zip_longest) for more information. +#[derive(Clone, Debug)] +#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] +pub struct ZipLongest { + a: Fuse, + b: Fuse, +} + +/// Create a new `ZipLongest` iterator. +pub fn zip_longest(a: T, b: U) -> ZipLongest + where T: Iterator, + U: Iterator +{ + ZipLongest { + a: a.fuse(), + b: b.fuse(), + } +} + +impl Iterator for ZipLongest + where T: Iterator, + U: Iterator +{ + type Item = EitherOrBoth; + + #[inline] + fn next(&mut self) -> Option { + match (self.a.next(), self.b.next()) { + (None, None) => None, + (Some(a), None) => Some(EitherOrBoth::Left(a)), + (None, Some(b)) => Some(EitherOrBoth::Right(b)), + (Some(a), Some(b)) => Some(EitherOrBoth::Both(a, b)), + } + } + + #[inline] + fn size_hint(&self) -> (usize, Option) { + size_hint::max(self.a.size_hint(), self.b.size_hint()) + } +} + +impl DoubleEndedIterator for ZipLongest + where T: DoubleEndedIterator + ExactSizeIterator, + U: DoubleEndedIterator + ExactSizeIterator +{ + #[inline] + fn next_back(&mut self) -> Option { + match self.a.len().cmp(&self.b.len()) { + Equal => match (self.a.next_back(), self.b.next_back()) { + (None, None) => None, + (Some(a), Some(b)) => Some(EitherOrBoth::Both(a, b)), + // These can only happen if .len() is inconsistent with .next_back() + (Some(a), None) => Some(EitherOrBoth::Left(a)), + (None, Some(b)) => Some(EitherOrBoth::Right(b)), + }, + Greater => self.a.next_back().map(EitherOrBoth::Left), + Less => self.b.next_back().map(EitherOrBoth::Right), + } + } +} + +impl ExactSizeIterator for ZipLongest + where T: ExactSizeIterator, + U: ExactSizeIterator +{} + +impl FusedIterator for ZipLongest + where T: Iterator, + U: Iterator +{} diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/src/ziptuple.rs temporalio-1.3.0/vendor/itertools-0.10.5/src/ziptuple.rs --- temporalio-1.3.0/vendor/itertools-0.10.5/src/ziptuple.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/src/ziptuple.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,138 @@ +use super::size_hint; + +/// See [`multizip`] for more information. +#[derive(Clone, Debug)] +#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] +pub struct Zip { + t: T, +} + +/// An iterator that generalizes *.zip()* and allows running multiple iterators in lockstep. +/// +/// The iterator `Zip<(I, J, ..., M)>` is formed from a tuple of iterators (or values that +/// implement [`IntoIterator`]) and yields elements +/// until any of the subiterators yields `None`. +/// +/// The iterator element type is a tuple like like `(A, B, ..., E)` where `A` to `E` are the +/// element types of the subiterator. +/// +/// **Note:** The result of this macro is a value of a named type (`Zip<(I, J, +/// ..)>` of each component iterator `I, J, ...`) if each component iterator is +/// nameable. +/// +/// Prefer [`izip!()`] over `multizip` for the performance benefits of using the +/// standard library `.zip()`. Prefer `multizip` if a nameable type is needed. +/// +/// ``` +/// use itertools::multizip; +/// +/// // iterate over three sequences side-by-side +/// let mut results = [0, 0, 0, 0]; +/// let inputs = [3, 7, 9, 6]; +/// +/// for (r, index, input) in multizip((&mut results, 0..10, &inputs)) { +/// *r = index * 10 + input; +/// } +/// +/// assert_eq!(results, [0 + 3, 10 + 7, 29, 36]); +/// ``` +/// [`izip!()`]: crate::izip +pub fn multizip(t: U) -> Zip + where Zip: From, + Zip: Iterator, +{ + Zip::from(t) +} + +macro_rules! impl_zip_iter { + ($($B:ident),*) => ( + #[allow(non_snake_case)] + impl<$($B: IntoIterator),*> From<($($B,)*)> for Zip<($($B::IntoIter,)*)> { + fn from(t: ($($B,)*)) -> Self { + let ($($B,)*) = t; + Zip { t: ($($B.into_iter(),)*) } + } + } + + #[allow(non_snake_case)] + #[allow(unused_assignments)] + impl<$($B),*> Iterator for Zip<($($B,)*)> + where + $( + $B: Iterator, + )* + { + type Item = ($($B::Item,)*); + + fn next(&mut self) -> Option + { + let ($(ref mut $B,)*) = self.t; + + // NOTE: Just like iter::Zip, we check the iterators + // for None in order. We may finish unevenly (some + // iterators gave n + 1 elements, some only n). + $( + let $B = match $B.next() { + None => return None, + Some(elt) => elt + }; + )* + Some(($($B,)*)) + } + + fn size_hint(&self) -> (usize, Option) + { + let sh = (::std::usize::MAX, None); + let ($(ref $B,)*) = self.t; + $( + let sh = size_hint::min($B.size_hint(), sh); + )* + sh + } + } + + #[allow(non_snake_case)] + impl<$($B),*> ExactSizeIterator for Zip<($($B,)*)> where + $( + $B: ExactSizeIterator, + )* + { } + + #[allow(non_snake_case)] + impl<$($B),*> DoubleEndedIterator for Zip<($($B,)*)> where + $( + $B: DoubleEndedIterator + ExactSizeIterator, + )* + { + #[inline] + fn next_back(&mut self) -> Option { + let ($(ref mut $B,)*) = self.t; + let size = *[$( $B.len(), )*].iter().min().unwrap(); + + $( + if $B.len() != size { + for _ in 0..$B.len() - size { $B.next_back(); } + } + )* + + match ($($B.next_back(),)*) { + ($(Some($B),)*) => Some(($($B,)*)), + _ => None, + } + } + } + ); +} + +impl_zip_iter!(A); +impl_zip_iter!(A, B); +impl_zip_iter!(A, B, C); +impl_zip_iter!(A, B, C, D); +impl_zip_iter!(A, B, C, D, E); +impl_zip_iter!(A, B, C, D, E, F); +impl_zip_iter!(A, B, C, D, E, F, G); +impl_zip_iter!(A, B, C, D, E, F, G, H); +impl_zip_iter!(A, B, C, D, E, F, G, H, I); +impl_zip_iter!(A, B, C, D, E, F, G, H, I, J); +impl_zip_iter!(A, B, C, D, E, F, G, H, I, J, K); +impl_zip_iter!(A, B, C, D, E, F, G, H, I, J, K, L); diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/tests/adaptors_no_collect.rs temporalio-1.3.0/vendor/itertools-0.10.5/tests/adaptors_no_collect.rs --- temporalio-1.3.0/vendor/itertools-0.10.5/tests/adaptors_no_collect.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/tests/adaptors_no_collect.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,46 @@ +use itertools::Itertools; + +struct PanickingCounter { + curr: usize, + max: usize, +} + +impl Iterator for PanickingCounter { + type Item = (); + + fn next(&mut self) -> Option { + self.curr += 1; + + assert_ne!( + self.curr, self.max, + "Input iterator reached maximum of {} suggesting collection by adaptor", + self.max + ); + + Some(()) + } +} + +fn no_collect_test(to_adaptor: T) + where A: Iterator, T: Fn(PanickingCounter) -> A +{ + let counter = PanickingCounter { curr: 0, max: 10_000 }; + let adaptor = to_adaptor(counter); + + for _ in adaptor.take(5) {} +} + +#[test] +fn permutations_no_collect() { + no_collect_test(|iter| iter.permutations(5)) +} + +#[test] +fn combinations_no_collect() { + no_collect_test(|iter| iter.combinations(5)) +} + +#[test] +fn combinations_with_replacement_no_collect() { + no_collect_test(|iter| iter.combinations_with_replacement(5)) +} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/tests/flatten_ok.rs temporalio-1.3.0/vendor/itertools-0.10.5/tests/flatten_ok.rs --- temporalio-1.3.0/vendor/itertools-0.10.5/tests/flatten_ok.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/tests/flatten_ok.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,76 @@ +use itertools::{assert_equal, Itertools}; +use std::{ops::Range, vec::IntoIter}; + +fn mix_data() -> IntoIter, bool>> { + vec![Ok(0..2), Err(false), Ok(2..4), Err(true), Ok(4..6)].into_iter() +} + +fn ok_data() -> IntoIter, bool>> { + vec![Ok(0..2), Ok(2..4), Ok(4..6)].into_iter() +} + +#[test] +fn flatten_ok_mixed_expected_forward() { + assert_equal( + mix_data().flatten_ok(), + vec![ + Ok(0), + Ok(1), + Err(false), + Ok(2), + Ok(3), + Err(true), + Ok(4), + Ok(5), + ], + ); +} + +#[test] +fn flatten_ok_mixed_expected_reverse() { + assert_equal( + mix_data().flatten_ok().rev(), + vec![ + Ok(5), + Ok(4), + Err(true), + Ok(3), + Ok(2), + Err(false), + Ok(1), + Ok(0), + ], + ); +} + +#[test] +fn flatten_ok_collect_mixed_forward() { + assert_eq!( + mix_data().flatten_ok().collect::, _>>(), + Err(false) + ); +} + +#[test] +fn flatten_ok_collect_mixed_reverse() { + assert_eq!( + mix_data().flatten_ok().rev().collect::, _>>(), + Err(true) + ); +} + +#[test] +fn flatten_ok_collect_ok_forward() { + assert_eq!( + ok_data().flatten_ok().collect::, _>>(), + Ok((0..6).collect()) + ); +} + +#[test] +fn flatten_ok_collect_ok_reverse() { + assert_eq!( + ok_data().flatten_ok().rev().collect::, _>>(), + Ok((0..6).rev().collect()) + ); +} diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/tests/macros_hygiene.rs temporalio-1.3.0/vendor/itertools-0.10.5/tests/macros_hygiene.rs --- temporalio-1.3.0/vendor/itertools-0.10.5/tests/macros_hygiene.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/tests/macros_hygiene.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,13 @@ +#[test] +fn iproduct_hygiene() { + let _ = itertools::iproduct!(0..6); + let _ = itertools::iproduct!(0..6, 0..9); + let _ = itertools::iproduct!(0..6, 0..9, 0..12); +} + +#[test] +fn izip_hygiene() { + let _ = itertools::izip!(0..6); + let _ = itertools::izip!(0..6, 0..9); + let _ = itertools::izip!(0..6, 0..9, 0..12); +} diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/tests/merge_join.rs temporalio-1.3.0/vendor/itertools-0.10.5/tests/merge_join.rs --- temporalio-1.3.0/vendor/itertools-0.10.5/tests/merge_join.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/tests/merge_join.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,108 @@ +use itertools::EitherOrBoth; +use itertools::free::merge_join_by; + +#[test] +fn empty() { + let left: Vec = vec![]; + let right: Vec = vec![]; + let expected_result: Vec> = vec![]; + let actual_result = merge_join_by(left, right, |l, r| l.cmp(r)) + .collect::>(); + assert_eq!(expected_result, actual_result); +} + +#[test] +fn left_only() { + let left: Vec = vec![1,2,3]; + let right: Vec = vec![]; + let expected_result: Vec> = vec![ + EitherOrBoth::Left(1), + EitherOrBoth::Left(2), + EitherOrBoth::Left(3) + ]; + let actual_result = merge_join_by(left, right, |l, r| l.cmp(r)) + .collect::>(); + assert_eq!(expected_result, actual_result); +} + +#[test] +fn right_only() { + let left: Vec = vec![]; + let right: Vec = vec![1,2,3]; + let expected_result: Vec> = vec![ + EitherOrBoth::Right(1), + EitherOrBoth::Right(2), + EitherOrBoth::Right(3) + ]; + let actual_result = merge_join_by(left, right, |l, r| l.cmp(r)) + .collect::>(); + assert_eq!(expected_result, actual_result); +} + +#[test] +fn first_left_then_right() { + let left: Vec = vec![1,2,3]; + let right: Vec = vec![4,5,6]; + let expected_result: Vec> = vec![ + EitherOrBoth::Left(1), + EitherOrBoth::Left(2), + EitherOrBoth::Left(3), + EitherOrBoth::Right(4), + EitherOrBoth::Right(5), + EitherOrBoth::Right(6) + ]; + let actual_result = merge_join_by(left, right, |l, r| l.cmp(r)) + .collect::>(); + assert_eq!(expected_result, actual_result); +} + +#[test] +fn first_right_then_left() { + let left: Vec = vec![4,5,6]; + let right: Vec = vec![1,2,3]; + let expected_result: Vec> = vec![ + EitherOrBoth::Right(1), + EitherOrBoth::Right(2), + EitherOrBoth::Right(3), + EitherOrBoth::Left(4), + EitherOrBoth::Left(5), + EitherOrBoth::Left(6) + ]; + let actual_result = merge_join_by(left, right, |l, r| l.cmp(r)) + .collect::>(); + assert_eq!(expected_result, actual_result); +} + +#[test] +fn interspersed_left_and_right() { + let left: Vec = vec![1,3,5]; + let right: Vec = vec![2,4,6]; + let expected_result: Vec> = vec![ + EitherOrBoth::Left(1), + EitherOrBoth::Right(2), + EitherOrBoth::Left(3), + EitherOrBoth::Right(4), + EitherOrBoth::Left(5), + EitherOrBoth::Right(6) + ]; + let actual_result = merge_join_by(left, right, |l, r| l.cmp(r)) + .collect::>(); + assert_eq!(expected_result, actual_result); +} + +#[test] +fn overlapping_left_and_right() { + let left: Vec = vec![1,3,4,6]; + let right: Vec = vec![2,3,4,5]; + let expected_result: Vec> = vec![ + EitherOrBoth::Left(1), + EitherOrBoth::Right(2), + EitherOrBoth::Both(3, 3), + EitherOrBoth::Both(4, 4), + EitherOrBoth::Right(5), + EitherOrBoth::Left(6) + ]; + let actual_result = merge_join_by(left, right, |l, r| l.cmp(r)) + .collect::>(); + assert_eq!(expected_result, actual_result); +} diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/tests/peeking_take_while.rs temporalio-1.3.0/vendor/itertools-0.10.5/tests/peeking_take_while.rs --- temporalio-1.3.0/vendor/itertools-0.10.5/tests/peeking_take_while.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/tests/peeking_take_while.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,50 @@ +use itertools::Itertools; +use itertools::{put_back, put_back_n}; + +#[test] +fn peeking_take_while_peekable() { + let mut r = (0..10).peekable(); + r.peeking_take_while(|x| *x <= 3).count(); + assert_eq!(r.next(), Some(4)); +} + +#[test] +fn peeking_take_while_put_back() { + let mut r = put_back(0..10); + r.peeking_take_while(|x| *x <= 3).count(); + assert_eq!(r.next(), Some(4)); + r.peeking_take_while(|_| true).count(); + assert_eq!(r.next(), None); +} + +#[test] +fn peeking_take_while_put_back_n() { + let mut r = put_back_n(6..10); + for elt in (0..6).rev() { + r.put_back(elt); + } + r.peeking_take_while(|x| *x <= 3).count(); + assert_eq!(r.next(), Some(4)); + r.peeking_take_while(|_| true).count(); + assert_eq!(r.next(), None); +} + +#[test] +fn peeking_take_while_slice_iter() { + let v = [1, 2, 3, 4, 5, 6]; + let mut r = v.iter(); + r.peeking_take_while(|x| **x <= 3).count(); + assert_eq!(r.next(), Some(&4)); + r.peeking_take_while(|_| true).count(); + assert_eq!(r.next(), None); +} + +#[test] +fn peeking_take_while_slice_iter_rev() { + let v = [1, 2, 3, 4, 5, 6]; + let mut r = v.iter().rev(); + r.peeking_take_while(|x| **x >= 3).count(); + assert_eq!(r.next(), Some(&2)); + r.peeking_take_while(|_| true).count(); + assert_eq!(r.next(), None); +} diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/tests/quick.rs temporalio-1.3.0/vendor/itertools-0.10.5/tests/quick.rs --- temporalio-1.3.0/vendor/itertools-0.10.5/tests/quick.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/tests/quick.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,1749 @@ +//! The purpose of these tests is to cover corner cases of iterators +//! and adaptors. +//! +//! In particular we test the tedious size_hint and exact size correctness. + +use quickcheck as qc; +use std::default::Default; +use std::num::Wrapping; +use std::ops::Range; +use std::cmp::{max, min, Ordering}; +use std::collections::{HashMap, HashSet}; +use itertools::Itertools; +use itertools::{ + multizip, + EitherOrBoth, + iproduct, + izip, +}; +use itertools::free::{ + cloned, + enumerate, + multipeek, + peek_nth, + put_back, + put_back_n, + rciter, + zip, + zip_eq, +}; + +use rand::Rng; +use rand::seq::SliceRandom; +use quickcheck::TestResult; + +/// Trait for size hint modifier types +trait HintKind: Copy + Send + qc::Arbitrary { + fn loosen_bounds(&self, org_hint: (usize, Option)) -> (usize, Option); +} + +/// Exact size hint variant that leaves hints unchanged +#[derive(Clone, Copy, Debug)] +struct Exact {} + +impl HintKind for Exact { + fn loosen_bounds(&self, org_hint: (usize, Option)) -> (usize, Option) { + org_hint + } +} + +impl qc::Arbitrary for Exact { + fn arbitrary(_: &mut G) -> Self { + Exact {} + } +} + +/// Inexact size hint variant to simulate imprecise (but valid) size hints +/// +/// Will always decrease the lower bound and increase the upper bound +/// of the size hint by set amounts. +#[derive(Clone, Copy, Debug)] +struct Inexact { + underestimate: usize, + overestimate: usize, +} + +impl HintKind for Inexact { + fn loosen_bounds(&self, org_hint: (usize, Option)) -> (usize, Option) { + let (org_lower, org_upper) = org_hint; + (org_lower.saturating_sub(self.underestimate), + org_upper.and_then(move |x| x.checked_add(self.overestimate))) + } +} + +impl qc::Arbitrary for Inexact { + fn arbitrary(g: &mut G) -> Self { + let ue_value = usize::arbitrary(g); + let oe_value = usize::arbitrary(g); + // Compensate for quickcheck using extreme values too rarely + let ue_choices = &[0, ue_value, usize::max_value()]; + let oe_choices = &[0, oe_value, usize::max_value()]; + Inexact { + underestimate: *ue_choices.choose(g).unwrap(), + overestimate: *oe_choices.choose(g).unwrap(), + } + } + + fn shrink(&self) -> Box> { + let underestimate_value = self.underestimate; + let overestimate_value = self.overestimate; + Box::new( + underestimate_value.shrink().flat_map(move |ue_value| + overestimate_value.shrink().map(move |oe_value| + Inexact { + underestimate: ue_value, + overestimate: oe_value, + } + ) + ) + ) + } +} + +/// Our base iterator that we can impl Arbitrary for +/// +/// By default we'll return inexact bounds estimates for size_hint +/// to make tests harder to pass. +/// +/// NOTE: Iter is tricky and is not fused, to help catch bugs. +/// At the end it will return None once, then return Some(0), +/// then return None again. +#[derive(Clone, Debug)] +struct Iter { + iterator: Range, + // fuse/done flag + fuse_flag: i32, + hint_kind: SK, +} + +impl Iter where HK: HintKind +{ + fn new(it: Range, hint_kind: HK) -> Self { + Iter { + iterator: it, + fuse_flag: 0, + hint_kind, + } + } +} + +impl Iterator for Iter + where Range: Iterator, + as Iterator>::Item: Default, + HK: HintKind, +{ + type Item = as Iterator>::Item; + + fn next(&mut self) -> Option + { + let elt = self.iterator.next(); + if elt.is_none() { + self.fuse_flag += 1; + // check fuse flag + if self.fuse_flag == 2 { + return Some(Default::default()) + } + } + elt + } + + fn size_hint(&self) -> (usize, Option) + { + let org_hint = self.iterator.size_hint(); + self.hint_kind.loosen_bounds(org_hint) + } +} + +impl DoubleEndedIterator for Iter + where Range: DoubleEndedIterator, + as Iterator>::Item: Default, + HK: HintKind +{ + fn next_back(&mut self) -> Option { self.iterator.next_back() } +} + +impl ExactSizeIterator for Iter where Range: ExactSizeIterator, + as Iterator>::Item: Default, +{ } + +impl qc::Arbitrary for Iter + where T: qc::Arbitrary, + HK: HintKind, +{ + fn arbitrary(g: &mut G) -> Self + { + Iter::new(T::arbitrary(g)..T::arbitrary(g), HK::arbitrary(g)) + } + + fn shrink(&self) -> Box>> + { + let r = self.iterator.clone(); + let hint_kind = self.hint_kind; + Box::new( + r.start.shrink().flat_map(move |a| + r.end.shrink().map(move |b| + Iter::new(a.clone()..b, hint_kind) + ) + ) + ) + } +} + +/// A meta-iterator which yields `Iter`s whose start/endpoints are +/// increased or decreased linearly on each iteration. +#[derive(Clone, Debug)] +struct ShiftRange { + range_start: i32, + range_end: i32, + start_step: i32, + end_step: i32, + iter_count: u32, + hint_kind: HK, +} + +impl Iterator for ShiftRange where HK: HintKind { + type Item = Iter; + + fn next(&mut self) -> Option { + if self.iter_count == 0 { + return None; + } + + let iter = Iter::new(self.range_start..self.range_end, self.hint_kind); + + self.range_start += self.start_step; + self.range_end += self.end_step; + self.iter_count -= 1; + + Some(iter) + } +} + +impl ExactSizeIterator for ShiftRange { } + +impl qc::Arbitrary for ShiftRange + where HK: HintKind +{ + fn arbitrary(g: &mut G) -> Self { + const MAX_STARTING_RANGE_DIFF: i32 = 32; + const MAX_STEP_MODULO: i32 = 8; + const MAX_ITER_COUNT: u32 = 3; + + let range_start = qc::Arbitrary::arbitrary(g); + let range_end = range_start + g.gen_range(0, MAX_STARTING_RANGE_DIFF + 1); + let start_step = g.gen_range(-MAX_STEP_MODULO, MAX_STEP_MODULO + 1); + let end_step = g.gen_range(-MAX_STEP_MODULO, MAX_STEP_MODULO + 1); + let iter_count = g.gen_range(0, MAX_ITER_COUNT + 1); + let hint_kind = qc::Arbitrary::arbitrary(g); + + ShiftRange { + range_start, + range_end, + start_step, + end_step, + iter_count, + hint_kind, + } + } +} + +fn correct_count(get_it: F) -> bool +where + I: Iterator, + F: Fn() -> I +{ + let mut counts = vec![get_it().count()]; + + 'outer: loop { + let mut it = get_it(); + + for _ in 0..(counts.len() - 1) { + #[allow(clippy::manual_assert)] + if it.next().is_none() { + panic!("Iterator shouldn't be finished, may not be deterministic"); + } + } + + if it.next().is_none() { + break 'outer; + } + + counts.push(it.count()); + } + + let total_actual_count = counts.len() - 1; + + for (i, returned_count) in counts.into_iter().enumerate() { + let actual_count = total_actual_count - i; + if actual_count != returned_count { + println!("Total iterations: {} True count: {} returned count: {}", i, actual_count, returned_count); + + return false; + } + } + + true +} + +fn correct_size_hint(mut it: I) -> bool { + // record size hint at each iteration + let initial_hint = it.size_hint(); + let mut hints = Vec::with_capacity(initial_hint.0 + 1); + hints.push(initial_hint); + while let Some(_) = it.next() { + hints.push(it.size_hint()) + } + + let mut true_count = hints.len(); // start off +1 too much + + // check all the size hints + for &(low, hi) in &hints { + true_count -= 1; + if low > true_count || + (hi.is_some() && hi.unwrap() < true_count) + { + println!("True size: {:?}, size hint: {:?}", true_count, (low, hi)); + //println!("All hints: {:?}", hints); + return false + } + } + true +} + +fn exact_size(mut it: I) -> bool { + // check every iteration + let (mut low, mut hi) = it.size_hint(); + if Some(low) != hi { return false; } + while let Some(_) = it.next() { + let (xlow, xhi) = it.size_hint(); + if low != xlow + 1 { return false; } + low = xlow; + hi = xhi; + if Some(low) != hi { return false; } + } + let (low, hi) = it.size_hint(); + low == 0 && hi == Some(0) +} + +// Exact size for this case, without ExactSizeIterator +fn exact_size_for_this(mut it: I) -> bool { + // check every iteration + let (mut low, mut hi) = it.size_hint(); + if Some(low) != hi { return false; } + while let Some(_) = it.next() { + let (xlow, xhi) = it.size_hint(); + if low != xlow + 1 { return false; } + low = xlow; + hi = xhi; + if Some(low) != hi { return false; } + } + let (low, hi) = it.size_hint(); + low == 0 && hi == Some(0) +} + +/* + * NOTE: Range is broken! + * (all signed ranges are) +#[quickcheck] +fn size_range_i8(a: Iter) -> bool { + exact_size(a) +} + +#[quickcheck] +fn size_range_i16(a: Iter) -> bool { + exact_size(a) +} + +#[quickcheck] +fn size_range_u8(a: Iter) -> bool { + exact_size(a) +} + */ + +macro_rules! quickcheck { + // accept several property function definitions + // The property functions can use pattern matching and `mut` as usual + // in the function arguments, but the functions can not be generic. + {$($(#$attr:tt)* fn $fn_name:ident($($arg:tt)*) -> $ret:ty { $($code:tt)* })*} => ( + $( + #[test] + $(#$attr)* + fn $fn_name() { + fn prop($($arg)*) -> $ret { + $($code)* + } + ::quickcheck::quickcheck(quickcheck!(@fn prop [] $($arg)*)); + } + )* + ); + // parse argument list (with patterns allowed) into prop as fn(_, _) -> _ + (@fn $f:ident [$($t:tt)*]) => { + $f as fn($($t),*) -> _ + }; + (@fn $f:ident [$($p:tt)*] : $($tail:tt)*) => { + quickcheck!(@fn $f [$($p)* _] $($tail)*) + }; + (@fn $f:ident [$($p:tt)*] $t:tt $($tail:tt)*) => { + quickcheck!(@fn $f [$($p)*] $($tail)*) + }; +} + +quickcheck! { + + fn size_product(a: Iter, b: Iter) -> bool { + correct_size_hint(a.cartesian_product(b)) + } + fn size_product3(a: Iter, b: Iter, c: Iter) -> bool { + correct_size_hint(iproduct!(a, b, c)) + } + + fn correct_cartesian_product3(a: Iter, b: Iter, c: Iter, + take_manual: usize) -> () + { + // test correctness of iproduct through regular iteration (take) + // and through fold. + let ac = a.clone(); + let br = &b.clone(); + let cr = &c.clone(); + let answer: Vec<_> = ac.flat_map(move |ea| br.clone().flat_map(move |eb| cr.clone().map(move |ec| (ea, eb, ec)))).collect(); + let mut product_iter = iproduct!(a, b, c); + let mut actual = Vec::new(); + + actual.extend((&mut product_iter).take(take_manual)); + if actual.len() == take_manual { + product_iter.fold((), |(), elt| actual.push(elt)); + } + assert_eq!(answer, actual); + } + + fn size_multi_product(a: ShiftRange) -> bool { + correct_size_hint(a.multi_cartesian_product()) + } + fn correct_multi_product3(a: ShiftRange, take_manual: usize) -> () { + // Fix no. of iterators at 3 + let a = ShiftRange { iter_count: 3, ..a }; + + // test correctness of MultiProduct through regular iteration (take) + // and through fold. + let mut iters = a.clone(); + let i0 = iters.next().unwrap(); + let i1r = &iters.next().unwrap(); + let i2r = &iters.next().unwrap(); + let answer: Vec<_> = i0.flat_map(move |ei0| i1r.clone().flat_map(move |ei1| i2r.clone().map(move |ei2| vec![ei0, ei1, ei2]))).collect(); + let mut multi_product = a.clone().multi_cartesian_product(); + let mut actual = Vec::new(); + + actual.extend((&mut multi_product).take(take_manual)); + if actual.len() == take_manual { + multi_product.fold((), |(), elt| actual.push(elt)); + } + assert_eq!(answer, actual); + + assert_eq!(answer.into_iter().last(), a.multi_cartesian_product().last()); + } + + #[allow(deprecated)] + fn size_step(a: Iter, s: usize) -> bool { + let mut s = s; + if s == 0 { + s += 1; // never zero + } + let filt = a.clone().dedup(); + correct_size_hint(filt.step(s)) && + exact_size(a.step(s)) + } + + #[allow(deprecated)] + fn equal_step(a: Iter, s: usize) -> bool { + let mut s = s; + if s == 0 { + s += 1; // never zero + } + let mut i = 0; + itertools::equal(a.clone().step(s), a.filter(|_| { + let keep = i % s == 0; + i += 1; + keep + })) + } + + #[allow(deprecated)] + fn equal_step_vec(a: Vec, s: usize) -> bool { + let mut s = s; + if s == 0 { + s += 1; // never zero + } + let mut i = 0; + itertools::equal(a.iter().step(s), a.iter().filter(|_| { + let keep = i % s == 0; + i += 1; + keep + })) + } + + fn size_multipeek(a: Iter, s: u8) -> bool { + let mut it = multipeek(a); + // peek a few times + for _ in 0..s { + it.peek(); + } + exact_size(it) + } + + fn size_peek_nth(a: Iter, s: u8) -> bool { + let mut it = peek_nth(a); + // peek a few times + for n in 0..s { + it.peek_nth(n as usize); + } + exact_size(it) + } + + fn equal_merge(mut a: Vec, mut b: Vec) -> bool { + a.sort(); + b.sort(); + let mut merged = a.clone(); + merged.extend(b.iter().cloned()); + merged.sort(); + itertools::equal(&merged, a.iter().merge(&b)) + } + fn size_merge(a: Iter, b: Iter) -> bool { + correct_size_hint(a.merge(b)) + } + fn size_zip(a: Iter, b: Iter, c: Iter) -> bool { + let filt = a.clone().dedup(); + correct_size_hint(multizip((filt, b.clone(), c.clone()))) && + exact_size(multizip((a, b, c))) + } + fn size_zip_rc(a: Iter, b: Iter) -> bool { + let rc = rciter(a); + correct_size_hint(multizip((&rc, &rc, b))) + } + + fn size_zip_macro(a: Iter, b: Iter, c: Iter) -> bool { + let filt = a.clone().dedup(); + correct_size_hint(izip!(filt, b.clone(), c.clone())) && + exact_size(izip!(a, b, c)) + } + fn equal_kmerge(mut a: Vec, mut b: Vec, mut c: Vec) -> bool { + use itertools::free::kmerge; + a.sort(); + b.sort(); + c.sort(); + let mut merged = a.clone(); + merged.extend(b.iter().cloned()); + merged.extend(c.iter().cloned()); + merged.sort(); + itertools::equal(merged.into_iter(), kmerge(vec![a, b, c])) + } + + // Any number of input iterators + fn equal_kmerge_2(mut inputs: Vec>) -> bool { + use itertools::free::kmerge; + // sort the inputs + for input in &mut inputs { + input.sort(); + } + let mut merged = inputs.concat(); + merged.sort(); + itertools::equal(merged.into_iter(), kmerge(inputs)) + } + + // Any number of input iterators + fn equal_kmerge_by_ge(mut inputs: Vec>) -> bool { + // sort the inputs + for input in &mut inputs { + input.sort(); + input.reverse(); + } + let mut merged = inputs.concat(); + merged.sort(); + merged.reverse(); + itertools::equal(merged.into_iter(), + inputs.into_iter().kmerge_by(|x, y| x >= y)) + } + + // Any number of input iterators + fn equal_kmerge_by_lt(mut inputs: Vec>) -> bool { + // sort the inputs + for input in &mut inputs { + input.sort(); + } + let mut merged = inputs.concat(); + merged.sort(); + itertools::equal(merged.into_iter(), + inputs.into_iter().kmerge_by(|x, y| x < y)) + } + + // Any number of input iterators + fn equal_kmerge_by_le(mut inputs: Vec>) -> bool { + // sort the inputs + for input in &mut inputs { + input.sort(); + } + let mut merged = inputs.concat(); + merged.sort(); + itertools::equal(merged.into_iter(), + inputs.into_iter().kmerge_by(|x, y| x <= y)) + } + fn size_kmerge(a: Iter, b: Iter, c: Iter) -> bool { + use itertools::free::kmerge; + correct_size_hint(kmerge(vec![a, b, c])) + } + fn equal_zip_eq(a: Vec, b: Vec) -> bool { + let len = std::cmp::min(a.len(), b.len()); + let a = &a[..len]; + let b = &b[..len]; + itertools::equal(zip_eq(a, b), zip(a, b)) + } + fn size_zip_longest(a: Iter, b: Iter) -> bool { + let filt = a.clone().dedup(); + let filt2 = b.clone().dedup(); + correct_size_hint(filt.zip_longest(b.clone())) && + correct_size_hint(a.clone().zip_longest(filt2)) && + exact_size(a.zip_longest(b)) + } + fn size_2_zip_longest(a: Iter, b: Iter) -> bool { + let it = a.clone().zip_longest(b.clone()); + let jt = a.clone().zip_longest(b.clone()); + itertools::equal(a, + it.filter_map(|elt| match elt { + EitherOrBoth::Both(x, _) => Some(x), + EitherOrBoth::Left(x) => Some(x), + _ => None, + } + )) + && + itertools::equal(b, + jt.filter_map(|elt| match elt { + EitherOrBoth::Both(_, y) => Some(y), + EitherOrBoth::Right(y) => Some(y), + _ => None, + } + )) + } + fn size_interleave(a: Iter, b: Iter) -> bool { + correct_size_hint(a.interleave(b)) + } + fn exact_interleave(a: Iter, b: Iter) -> bool { + exact_size_for_this(a.interleave(b)) + } + fn size_interleave_shortest(a: Iter, b: Iter) -> bool { + correct_size_hint(a.interleave_shortest(b)) + } + fn exact_interleave_shortest(a: Vec<()>, b: Vec<()>) -> bool { + exact_size_for_this(a.iter().interleave_shortest(&b)) + } + fn size_intersperse(a: Iter, x: i16) -> bool { + correct_size_hint(a.intersperse(x)) + } + fn equal_intersperse(a: Vec, x: i32) -> bool { + let mut inter = false; + let mut i = 0; + for elt in a.iter().cloned().intersperse(x) { + if inter { + if elt != x { return false } + } else { + if elt != a[i] { return false } + i += 1; + } + inter = !inter; + } + true + } + + fn equal_combinations_2(a: Vec) -> bool { + let mut v = Vec::new(); + for (i, x) in enumerate(&a) { + for y in &a[i + 1..] { + v.push((x, y)); + } + } + itertools::equal(a.iter().tuple_combinations::<(_, _)>(), v) + } + + fn collect_tuple_matches_size(a: Iter) -> bool { + let size = a.clone().count(); + a.collect_tuple::<(_, _, _)>().is_some() == (size == 3) + } + + fn correct_permutations(vals: HashSet, k: usize) -> () { + // Test permutations only on iterators of distinct integers, to prevent + // false positives. + + const MAX_N: usize = 5; + + let n = min(vals.len(), MAX_N); + let vals: HashSet = vals.into_iter().take(n).collect(); + + let perms = vals.iter().permutations(k); + + let mut actual = HashSet::new(); + + for perm in perms { + assert_eq!(perm.len(), k); + + let all_items_valid = perm.iter().all(|p| vals.contains(p)); + assert!(all_items_valid, "perm contains value not from input: {:?}", perm); + + // Check that all perm items are distinct + let distinct_len = { + let perm_set: HashSet<_> = perm.iter().collect(); + perm_set.len() + }; + assert_eq!(perm.len(), distinct_len); + + // Check that the perm is new + assert!(actual.insert(perm.clone()), "perm already encountered: {:?}", perm); + } + } + + fn permutations_lexic_order(a: usize, b: usize) -> () { + let a = a % 6; + let b = b % 6; + + let n = max(a, b); + let k = min (a, b); + + let expected_first: Vec = (0..k).collect(); + let expected_last: Vec = ((n - k)..n).rev().collect(); + + let mut perms = (0..n).permutations(k); + + let mut curr_perm = match perms.next() { + Some(p) => p, + None => { return; } + }; + + assert_eq!(expected_first, curr_perm); + + for next_perm in perms { + assert!( + next_perm > curr_perm, + "next perm isn't greater-than current; next_perm={:?} curr_perm={:?} n={}", + next_perm, curr_perm, n + ); + + curr_perm = next_perm; + } + + assert_eq!(expected_last, curr_perm); + + } + + fn permutations_count(n: usize, k: usize) -> bool { + let n = n % 6; + + correct_count(|| (0..n).permutations(k)) + } + + fn permutations_size(a: Iter, k: usize) -> bool { + correct_size_hint(a.take(5).permutations(k)) + } + + fn permutations_k0_yields_once(n: usize) -> () { + let k = 0; + let expected: Vec> = vec![vec![]]; + let actual = (0..n).permutations(k).collect_vec(); + + assert_eq!(expected, actual); + } +} + +quickcheck! { + fn dedup_via_coalesce(a: Vec) -> bool { + let mut b = a.clone(); + b.dedup(); + itertools::equal( + &b, + a + .iter() + .coalesce(|x, y| { + if x==y { + Ok(x) + } else { + Err((x, y)) + } + }) + .fold(vec![], |mut v, n| { + v.push(n); + v + }) + ) + } +} + +quickcheck! { + fn equal_dedup(a: Vec) -> bool { + let mut b = a.clone(); + b.dedup(); + itertools::equal(&b, a.iter().dedup()) + } +} + +quickcheck! { + fn equal_dedup_by(a: Vec<(i32, i32)>) -> bool { + let mut b = a.clone(); + b.dedup_by(|x, y| x.0==y.0); + itertools::equal(&b, a.iter().dedup_by(|x, y| x.0==y.0)) + } +} + +quickcheck! { + fn size_dedup(a: Vec) -> bool { + correct_size_hint(a.iter().dedup()) + } +} + +quickcheck! { + fn size_dedup_by(a: Vec<(i32, i32)>) -> bool { + correct_size_hint(a.iter().dedup_by(|x, y| x.0==y.0)) + } +} + +quickcheck! { + fn exact_repeatn((n, x): (usize, i32)) -> bool { + let it = itertools::repeat_n(x, n); + exact_size(it) + } +} + +quickcheck! { + fn size_put_back(a: Vec, x: Option) -> bool { + let mut it = put_back(a.into_iter()); + match x { + Some(t) => it.put_back(t), + None => {} + } + correct_size_hint(it) + } +} + +quickcheck! { + fn size_put_backn(a: Vec, b: Vec) -> bool { + let mut it = put_back_n(a.into_iter()); + for elt in b { + it.put_back(elt) + } + correct_size_hint(it) + } +} + +quickcheck! { + fn size_tee(a: Vec) -> bool { + let (mut t1, mut t2) = a.iter().tee(); + t1.next(); + t1.next(); + t2.next(); + exact_size(t1) && exact_size(t2) + } +} + +quickcheck! { + fn size_tee_2(a: Vec) -> bool { + let (mut t1, mut t2) = a.iter().dedup().tee(); + t1.next(); + t1.next(); + t2.next(); + correct_size_hint(t1) && correct_size_hint(t2) + } +} + +quickcheck! { + fn size_take_while_ref(a: Vec, stop: u8) -> bool { + correct_size_hint(a.iter().take_while_ref(|x| **x != stop)) + } +} + +quickcheck! { + fn equal_partition(a: Vec) -> bool { + let mut a = a; + let mut ap = a.clone(); + let split_index = itertools::partition(&mut ap, |x| *x >= 0); + let parted = (0..split_index).all(|i| ap[i] >= 0) && + (split_index..a.len()).all(|i| ap[i] < 0); + + a.sort(); + ap.sort(); + parted && (a == ap) + } +} + +quickcheck! { + fn size_combinations(it: Iter) -> bool { + correct_size_hint(it.tuple_combinations::<(_, _)>()) + } +} + +quickcheck! { + fn equal_combinations(it: Iter) -> bool { + let values = it.clone().collect_vec(); + let mut cmb = it.tuple_combinations(); + for i in 0..values.len() { + for j in i+1..values.len() { + let pair = (values[i], values[j]); + if pair != cmb.next().unwrap() { + return false; + } + } + } + cmb.next() == None + } +} + +quickcheck! { + fn size_pad_tail(it: Iter, pad: u8) -> bool { + correct_size_hint(it.clone().pad_using(pad as usize, |_| 0)) && + correct_size_hint(it.dropping(1).rev().pad_using(pad as usize, |_| 0)) + } +} + +quickcheck! { + fn size_pad_tail2(it: Iter, pad: u8) -> bool { + exact_size(it.pad_using(pad as usize, |_| 0)) + } +} + +quickcheck! { + fn size_powerset(it: Iter) -> bool { + // Powerset cardinality gets large very quickly, limit input to keep test fast. + correct_size_hint(it.take(12).powerset()) + } +} + +quickcheck! { + fn size_duplicates(it: Iter) -> bool { + correct_size_hint(it.duplicates()) + } +} + +quickcheck! { + fn size_unique(it: Iter) -> bool { + correct_size_hint(it.unique()) + } + + fn count_unique(it: Vec, take_first: u8) -> () { + let answer = { + let mut v = it.clone(); + v.sort(); v.dedup(); + v.len() + }; + let mut iter = cloned(&it).unique(); + let first_count = (&mut iter).take(take_first as usize).count(); + let rest_count = iter.count(); + assert_eq!(answer, first_count + rest_count); + } +} + +quickcheck! { + fn fuzz_group_by_lazy_1(it: Iter) -> bool { + let jt = it.clone(); + let groups = it.group_by(|k| *k); + itertools::equal(jt, groups.into_iter().flat_map(|(_, x)| x)) + } +} + +quickcheck! { + fn fuzz_group_by_lazy_2(data: Vec) -> bool { + let groups = data.iter().group_by(|k| *k / 10); + let res = itertools::equal(data.iter(), groups.into_iter().flat_map(|(_, x)| x)); + res + } +} + +quickcheck! { + fn fuzz_group_by_lazy_3(data: Vec) -> bool { + let grouper = data.iter().group_by(|k| *k / 10); + let groups = grouper.into_iter().collect_vec(); + let res = itertools::equal(data.iter(), groups.into_iter().flat_map(|(_, x)| x)); + res + } +} + +quickcheck! { + fn fuzz_group_by_lazy_duo(data: Vec, order: Vec<(bool, bool)>) -> bool { + let grouper = data.iter().group_by(|k| *k / 3); + let mut groups1 = grouper.into_iter(); + let mut groups2 = grouper.into_iter(); + let mut elts = Vec::<&u8>::new(); + let mut old_groups = Vec::new(); + + let tup1 = |(_, b)| b; + for &(ord, consume_now) in &order { + let iter = &mut [&mut groups1, &mut groups2][ord as usize]; + match iter.next() { + Some((_, gr)) => if consume_now { + for og in old_groups.drain(..) { + elts.extend(og); + } + elts.extend(gr); + } else { + old_groups.push(gr); + }, + None => break, + } + } + for og in old_groups.drain(..) { + elts.extend(og); + } + for gr in groups1.map(&tup1) { elts.extend(gr); } + for gr in groups2.map(&tup1) { elts.extend(gr); } + itertools::assert_equal(&data, elts); + true + } +} + +quickcheck! { + fn equal_chunks_lazy(a: Vec, size: u8) -> bool { + let mut size = size; + if size == 0 { + size += 1; + } + let chunks = a.iter().chunks(size as usize); + let it = a.chunks(size as usize); + for (a, b) in chunks.into_iter().zip(it) { + if !itertools::equal(a, b) { + return false; + } + } + true + } +} + +quickcheck! { + fn equal_tuple_windows_1(a: Vec) -> bool { + let x = a.windows(1).map(|s| (&s[0], )); + let y = a.iter().tuple_windows::<(_,)>(); + itertools::equal(x, y) + } + + fn equal_tuple_windows_2(a: Vec) -> bool { + let x = a.windows(2).map(|s| (&s[0], &s[1])); + let y = a.iter().tuple_windows::<(_, _)>(); + itertools::equal(x, y) + } + + fn equal_tuple_windows_3(a: Vec) -> bool { + let x = a.windows(3).map(|s| (&s[0], &s[1], &s[2])); + let y = a.iter().tuple_windows::<(_, _, _)>(); + itertools::equal(x, y) + } + + fn equal_tuple_windows_4(a: Vec) -> bool { + let x = a.windows(4).map(|s| (&s[0], &s[1], &s[2], &s[3])); + let y = a.iter().tuple_windows::<(_, _, _, _)>(); + itertools::equal(x, y) + } + + fn equal_tuples_1(a: Vec) -> bool { + let x = a.chunks(1).map(|s| (&s[0], )); + let y = a.iter().tuples::<(_,)>(); + itertools::equal(x, y) + } + + fn equal_tuples_2(a: Vec) -> bool { + let x = a.chunks(2).filter(|s| s.len() == 2).map(|s| (&s[0], &s[1])); + let y = a.iter().tuples::<(_, _)>(); + itertools::equal(x, y) + } + + fn equal_tuples_3(a: Vec) -> bool { + let x = a.chunks(3).filter(|s| s.len() == 3).map(|s| (&s[0], &s[1], &s[2])); + let y = a.iter().tuples::<(_, _, _)>(); + itertools::equal(x, y) + } + + fn equal_tuples_4(a: Vec) -> bool { + let x = a.chunks(4).filter(|s| s.len() == 4).map(|s| (&s[0], &s[1], &s[2], &s[3])); + let y = a.iter().tuples::<(_, _, _, _)>(); + itertools::equal(x, y) + } + + fn exact_tuple_buffer(a: Vec) -> bool { + let mut iter = a.iter().tuples::<(_, _, _, _)>(); + (&mut iter).last(); + let buffer = iter.into_buffer(); + assert_eq!(buffer.len(), a.len() % 4); + exact_size(buffer) + } +} + +// with_position +quickcheck! { + fn with_position_exact_size_1(a: Vec) -> bool { + exact_size_for_this(a.iter().with_position()) + } + fn with_position_exact_size_2(a: Iter) -> bool { + exact_size_for_this(a.with_position()) + } +} + +quickcheck! { + fn correct_group_map_modulo_key(a: Vec, modulo: u8) -> () { + let modulo = if modulo == 0 { 1 } else { modulo }; // Avoid `% 0` + let count = a.len(); + let lookup = a.into_iter().map(|i| (i % modulo, i)).into_group_map(); + + assert_eq!(lookup.values().flat_map(|vals| vals.iter()).count(), count); + + for (&key, vals) in lookup.iter() { + assert!(vals.iter().all(|&val| val % modulo == key)); + } + } +} + +/// A peculiar type: Equality compares both tuple items, but ordering only the +/// first item. This is so we can check the stability property easily. +#[derive(Clone, Debug, PartialEq, Eq)] +struct Val(u32, u32); + +impl PartialOrd for Val { + fn partial_cmp(&self, other: &Val) -> Option { + self.0.partial_cmp(&other.0) + } +} + +impl Ord for Val { + fn cmp(&self, other: &Val) -> Ordering { + self.0.cmp(&other.0) + } +} + +impl qc::Arbitrary for Val { + fn arbitrary(g: &mut G) -> Self { + let (x, y) = <(u32, u32)>::arbitrary(g); + Val(x, y) + } + fn shrink(&self) -> Box> { + Box::new((self.0, self.1).shrink().map(|(x, y)| Val(x, y))) + } +} + +quickcheck! { + fn minmax(a: Vec) -> bool { + use itertools::MinMaxResult; + + + let minmax = a.iter().minmax(); + let expected = match a.len() { + 0 => MinMaxResult::NoElements, + 1 => MinMaxResult::OneElement(&a[0]), + _ => MinMaxResult::MinMax(a.iter().min().unwrap(), + a.iter().max().unwrap()), + }; + minmax == expected + } +} + +quickcheck! { + fn minmax_f64(a: Vec) -> TestResult { + use itertools::MinMaxResult; + + if a.iter().any(|x| x.is_nan()) { + return TestResult::discard(); + } + + let min = cloned(&a).fold1(f64::min); + let max = cloned(&a).fold1(f64::max); + + let minmax = cloned(&a).minmax(); + let expected = match a.len() { + 0 => MinMaxResult::NoElements, + 1 => MinMaxResult::OneElement(min.unwrap()), + _ => MinMaxResult::MinMax(min.unwrap(), max.unwrap()), + }; + TestResult::from_bool(minmax == expected) + } +} + +quickcheck! { + #[allow(deprecated)] + fn tree_fold1_f64(mut a: Vec) -> TestResult { + fn collapse_adjacent(x: Vec, mut f: F) -> Vec + where F: FnMut(f64, f64) -> f64 + { + let mut out = Vec::new(); + for i in (0..x.len()).step(2) { + if i == x.len()-1 { + out.push(x[i]) + } else { + out.push(f(x[i], x[i+1])); + } + } + out + } + + if a.iter().any(|x| x.is_nan()) { + return TestResult::discard(); + } + + let actual = a.iter().cloned().tree_fold1(f64::atan2); + + while a.len() > 1 { + a = collapse_adjacent(a, f64::atan2); + } + let expected = a.pop(); + + TestResult::from_bool(actual == expected) + } +} + +quickcheck! { + fn exactly_one_i32(a: Vec) -> TestResult { + let ret = a.iter().cloned().exactly_one(); + match a.len() { + 1 => TestResult::from_bool(ret.unwrap() == a[0]), + _ => TestResult::from_bool(ret.unwrap_err().eq(a.iter().cloned())), + } + } +} + +quickcheck! { + fn at_most_one_i32(a: Vec) -> TestResult { + let ret = a.iter().cloned().at_most_one(); + match a.len() { + 0 => TestResult::from_bool(ret.unwrap() == None), + 1 => TestResult::from_bool(ret.unwrap() == Some(a[0])), + _ => TestResult::from_bool(ret.unwrap_err().eq(a.iter().cloned())), + } + } +} + +quickcheck! { + fn consistent_grouping_map_with_by(a: Vec, modulo: u8) -> () { + let modulo = if modulo == 0 { 1 } else { modulo }; // Avoid `% 0` + + let lookup_grouping_map = a.iter().copied().map(|i| (i % modulo, i)).into_grouping_map().collect::>(); + let lookup_grouping_map_by = a.iter().copied().into_grouping_map_by(|i| i % modulo).collect::>(); + + assert_eq!(lookup_grouping_map, lookup_grouping_map_by); + } + + fn correct_grouping_map_by_aggregate_modulo_key(a: Vec, modulo: u8) -> () { + let modulo = if modulo < 2 { 2 } else { modulo } as u64; // Avoid `% 0` + let lookup = a.iter() + .map(|&b| b as u64) // Avoid overflows + .into_grouping_map_by(|i| i % modulo) + .aggregate(|acc, &key, val| { + assert!(val % modulo == key); + if val % (modulo - 1) == 0 { + None + } else { + Some(acc.unwrap_or(0) + val) + } + }); + + let group_map_lookup = a.iter() + .map(|&b| b as u64) + .map(|i| (i % modulo, i)) + .into_group_map() + .into_iter() + .filter_map(|(key, vals)| { + vals.into_iter().fold(None, |acc, val| { + if val % (modulo - 1) == 0 { + None + } else { + Some(acc.unwrap_or(0) + val) + } + }).map(|new_val| (key, new_val)) + }) + .collect::>(); + assert_eq!(lookup, group_map_lookup); + + for m in 0..modulo { + assert_eq!( + lookup.get(&m).copied(), + a.iter() + .map(|&b| b as u64) + .filter(|&val| val % modulo == m) + .fold(None, |acc, val| { + if val % (modulo - 1) == 0 { + None + } else { + Some(acc.unwrap_or(0) + val) + } + }) + ); + } + } + + fn correct_grouping_map_by_fold_modulo_key(a: Vec, modulo: u8) -> () { + let modulo = if modulo == 0 { 1 } else { modulo } as u64; // Avoid `% 0` + let lookup = a.iter().map(|&b| b as u64) // Avoid overflows + .into_grouping_map_by(|i| i % modulo) + .fold(0u64, |acc, &key, val| { + assert!(val % modulo == key); + acc + val + }); + + let group_map_lookup = a.iter() + .map(|&b| b as u64) + .map(|i| (i % modulo, i)) + .into_group_map() + .into_iter() + .map(|(key, vals)| (key, vals.into_iter().sum())) + .collect::>(); + assert_eq!(lookup, group_map_lookup); + + for (&key, &sum) in lookup.iter() { + assert_eq!(sum, a.iter().map(|&b| b as u64).filter(|&val| val % modulo == key).sum::()); + } + } + + fn correct_grouping_map_by_fold_first_modulo_key(a: Vec, modulo: u8) -> () { + let modulo = if modulo == 0 { 1 } else { modulo } as u64; // Avoid `% 0` + let lookup = a.iter().map(|&b| b as u64) // Avoid overflows + .into_grouping_map_by(|i| i % modulo) + .fold_first(|acc, &key, val| { + assert!(val % modulo == key); + acc + val + }); + + // TODO: Swap `fold1` with stdlib's `fold_first` when it's stabilized + let group_map_lookup = a.iter() + .map(|&b| b as u64) + .map(|i| (i % modulo, i)) + .into_group_map() + .into_iter() + .map(|(key, vals)| (key, vals.into_iter().fold1(|acc, val| acc + val).unwrap())) + .collect::>(); + assert_eq!(lookup, group_map_lookup); + + for (&key, &sum) in lookup.iter() { + assert_eq!(sum, a.iter().map(|&b| b as u64).filter(|&val| val % modulo == key).sum::()); + } + } + + fn correct_grouping_map_by_collect_modulo_key(a: Vec, modulo: u8) -> () { + let modulo = if modulo == 0 { 1 } else { modulo }; // Avoid `% 0` + let lookup_grouping_map = a.iter().copied().into_grouping_map_by(|i| i % modulo).collect::>(); + let lookup_group_map = a.iter().copied().map(|i| (i % modulo, i)).into_group_map(); + + assert_eq!(lookup_grouping_map, lookup_group_map); + } + + fn correct_grouping_map_by_max_modulo_key(a: Vec, modulo: u8) -> () { + let modulo = if modulo == 0 { 1 } else { modulo }; // Avoid `% 0` + let lookup = a.iter().copied().into_grouping_map_by(|i| i % modulo).max(); + + let group_map_lookup = a.iter().copied() + .map(|i| (i % modulo, i)) + .into_group_map() + .into_iter() + .map(|(key, vals)| (key, vals.into_iter().max().unwrap())) + .collect::>(); + assert_eq!(lookup, group_map_lookup); + + for (&key, &max) in lookup.iter() { + assert_eq!(Some(max), a.iter().copied().filter(|&val| val % modulo == key).max()); + } + } + + fn correct_grouping_map_by_max_by_modulo_key(a: Vec, modulo: u8) -> () { + let modulo = if modulo == 0 { 1 } else { modulo }; // Avoid `% 0` + let lookup = a.iter().copied().into_grouping_map_by(|i| i % modulo).max_by(|_, v1, v2| v1.cmp(v2)); + + let group_map_lookup = a.iter().copied() + .map(|i| (i % modulo, i)) + .into_group_map() + .into_iter() + .map(|(key, vals)| (key, vals.into_iter().max_by(|v1, v2| v1.cmp(v2)).unwrap())) + .collect::>(); + assert_eq!(lookup, group_map_lookup); + + for (&key, &max) in lookup.iter() { + assert_eq!(Some(max), a.iter().copied().filter(|&val| val % modulo == key).max_by(|v1, v2| v1.cmp(v2))); + } + } + + fn correct_grouping_map_by_max_by_key_modulo_key(a: Vec, modulo: u8) -> () { + let modulo = if modulo == 0 { 1 } else { modulo }; // Avoid `% 0` + let lookup = a.iter().copied().into_grouping_map_by(|i| i % modulo).max_by_key(|_, &val| val); + + let group_map_lookup = a.iter().copied() + .map(|i| (i % modulo, i)) + .into_group_map() + .into_iter() + .map(|(key, vals)| (key, vals.into_iter().max_by_key(|&val| val).unwrap())) + .collect::>(); + assert_eq!(lookup, group_map_lookup); + + for (&key, &max) in lookup.iter() { + assert_eq!(Some(max), a.iter().copied().filter(|&val| val % modulo == key).max_by_key(|&val| val)); + } + } + + fn correct_grouping_map_by_min_modulo_key(a: Vec, modulo: u8) -> () { + let modulo = if modulo == 0 { 1 } else { modulo }; // Avoid `% 0` + let lookup = a.iter().copied().into_grouping_map_by(|i| i % modulo).min(); + + let group_map_lookup = a.iter().copied() + .map(|i| (i % modulo, i)) + .into_group_map() + .into_iter() + .map(|(key, vals)| (key, vals.into_iter().min().unwrap())) + .collect::>(); + assert_eq!(lookup, group_map_lookup); + + for (&key, &min) in lookup.iter() { + assert_eq!(Some(min), a.iter().copied().filter(|&val| val % modulo == key).min()); + } + } + + fn correct_grouping_map_by_min_by_modulo_key(a: Vec, modulo: u8) -> () { + let modulo = if modulo == 0 { 1 } else { modulo }; // Avoid `% 0` + let lookup = a.iter().copied().into_grouping_map_by(|i| i % modulo).min_by(|_, v1, v2| v1.cmp(v2)); + + let group_map_lookup = a.iter().copied() + .map(|i| (i % modulo, i)) + .into_group_map() + .into_iter() + .map(|(key, vals)| (key, vals.into_iter().min_by(|v1, v2| v1.cmp(v2)).unwrap())) + .collect::>(); + assert_eq!(lookup, group_map_lookup); + + for (&key, &min) in lookup.iter() { + assert_eq!(Some(min), a.iter().copied().filter(|&val| val % modulo == key).min_by(|v1, v2| v1.cmp(v2))); + } + } + + fn correct_grouping_map_by_min_by_key_modulo_key(a: Vec, modulo: u8) -> () { + let modulo = if modulo == 0 { 1 } else { modulo }; // Avoid `% 0` + let lookup = a.iter().copied().into_grouping_map_by(|i| i % modulo).min_by_key(|_, &val| val); + + let group_map_lookup = a.iter().copied() + .map(|i| (i % modulo, i)) + .into_group_map() + .into_iter() + .map(|(key, vals)| (key, vals.into_iter().min_by_key(|&val| val).unwrap())) + .collect::>(); + assert_eq!(lookup, group_map_lookup); + + for (&key, &min) in lookup.iter() { + assert_eq!(Some(min), a.iter().copied().filter(|&val| val % modulo == key).min_by_key(|&val| val)); + } + } + + fn correct_grouping_map_by_minmax_modulo_key(a: Vec, modulo: u8) -> () { + let modulo = if modulo == 0 { 1 } else { modulo }; // Avoid `% 0` + let lookup = a.iter().copied().into_grouping_map_by(|i| i % modulo).minmax(); + + let group_map_lookup = a.iter().copied() + .map(|i| (i % modulo, i)) + .into_group_map() + .into_iter() + .map(|(key, vals)| (key, vals.into_iter().minmax())) + .collect::>(); + assert_eq!(lookup, group_map_lookup); + + for (&key, &minmax) in lookup.iter() { + assert_eq!(minmax, a.iter().copied().filter(|&val| val % modulo == key).minmax()); + } + } + + fn correct_grouping_map_by_minmax_by_modulo_key(a: Vec, modulo: u8) -> () { + let modulo = if modulo == 0 { 1 } else { modulo }; // Avoid `% 0` + let lookup = a.iter().copied().into_grouping_map_by(|i| i % modulo).minmax_by(|_, v1, v2| v1.cmp(v2)); + + let group_map_lookup = a.iter().copied() + .map(|i| (i % modulo, i)) + .into_group_map() + .into_iter() + .map(|(key, vals)| (key, vals.into_iter().minmax_by(|v1, v2| v1.cmp(v2)))) + .collect::>(); + assert_eq!(lookup, group_map_lookup); + + for (&key, &minmax) in lookup.iter() { + assert_eq!(minmax, a.iter().copied().filter(|&val| val % modulo == key).minmax_by(|v1, v2| v1.cmp(v2))); + } + } + + fn correct_grouping_map_by_minmax_by_key_modulo_key(a: Vec, modulo: u8) -> () { + let modulo = if modulo == 0 { 1 } else { modulo }; // Avoid `% 0` + let lookup = a.iter().copied().into_grouping_map_by(|i| i % modulo).minmax_by_key(|_, &val| val); + + let group_map_lookup = a.iter().copied() + .map(|i| (i % modulo, i)) + .into_group_map() + .into_iter() + .map(|(key, vals)| (key, vals.into_iter().minmax_by_key(|&val| val))) + .collect::>(); + assert_eq!(lookup, group_map_lookup); + + for (&key, &minmax) in lookup.iter() { + assert_eq!(minmax, a.iter().copied().filter(|&val| val % modulo == key).minmax_by_key(|&val| val)); + } + } + + fn correct_grouping_map_by_sum_modulo_key(a: Vec, modulo: u8) -> () { + let modulo = if modulo == 0 { 1 } else { modulo } as u64; // Avoid `% 0` + let lookup = a.iter().map(|&b| b as u64) // Avoid overflows + .into_grouping_map_by(|i| i % modulo) + .sum(); + + let group_map_lookup = a.iter().map(|&b| b as u64) + .map(|i| (i % modulo, i)) + .into_group_map() + .into_iter() + .map(|(key, vals)| (key, vals.into_iter().sum())) + .collect::>(); + assert_eq!(lookup, group_map_lookup); + + for (&key, &sum) in lookup.iter() { + assert_eq!(sum, a.iter().map(|&b| b as u64).filter(|&val| val % modulo == key).sum::()); + } + } + + fn correct_grouping_map_by_product_modulo_key(a: Vec, modulo: u8) -> () { + let modulo = Wrapping(if modulo == 0 { 1 } else { modulo } as u64); // Avoid `% 0` + let lookup = a.iter().map(|&b| Wrapping(b as u64)) // Avoid overflows + .into_grouping_map_by(|i| i % modulo) + .product(); + + let group_map_lookup = a.iter().map(|&b| Wrapping(b as u64)) + .map(|i| (i % modulo, i)) + .into_group_map() + .into_iter() + .map(|(key, vals)| (key, vals.into_iter().product::>())) + .collect::>(); + assert_eq!(lookup, group_map_lookup); + + for (&key, &prod) in lookup.iter() { + assert_eq!( + prod, + a.iter() + .map(|&b| Wrapping(b as u64)) + .filter(|&val| val % modulo == key) + .product::>() + ); + } + } + + // This should check that if multiple elements are equally minimum or maximum + // then `max`, `min` and `minmax` pick the first minimum and the last maximum. + // This is to be consistent with `std::iter::max` and `std::iter::min`. + fn correct_grouping_map_by_min_max_minmax_order_modulo_key() -> () { + use itertools::MinMaxResult; + + let lookup = (0..=10) + .into_grouping_map_by(|_| 0) + .max_by(|_, _, _| Ordering::Equal); + + assert_eq!(lookup[&0], 10); + + let lookup = (0..=10) + .into_grouping_map_by(|_| 0) + .min_by(|_, _, _| Ordering::Equal); + + assert_eq!(lookup[&0], 0); + + let lookup = (0..=10) + .into_grouping_map_by(|_| 0) + .minmax_by(|_, _, _| Ordering::Equal); + + assert_eq!(lookup[&0], MinMaxResult::MinMax(0, 10)); + } +} + +quickcheck! { + fn counts(nums: Vec) -> TestResult { + let counts = nums.iter().counts(); + for (&item, &count) in counts.iter() { + #[allow(clippy::absurd_extreme_comparisons)] + if count <= 0 { + return TestResult::failed(); + } + if count != nums.iter().filter(|&x| x == item).count() { + return TestResult::failed(); + } + } + for item in nums.iter() { + if !counts.contains_key(item) { + return TestResult::failed(); + } + } + TestResult::passed() + } +} + +quickcheck! { + fn test_double_ended_zip_2(a: Vec, b: Vec) -> TestResult { + let mut x = + multizip((a.clone().into_iter(), b.clone().into_iter())) + .collect_vec(); + x.reverse(); + + let y = + multizip((a.into_iter(), b.into_iter())) + .rfold(Vec::new(), |mut vec, e| { vec.push(e); vec }); + + TestResult::from_bool(itertools::equal(x, y)) + } + + fn test_double_ended_zip_3(a: Vec, b: Vec, c: Vec) -> TestResult { + let mut x = + multizip((a.clone().into_iter(), b.clone().into_iter(), c.clone().into_iter())) + .collect_vec(); + x.reverse(); + + let y = + multizip((a.into_iter(), b.into_iter(), c.into_iter())) + .rfold(Vec::new(), |mut vec, e| { vec.push(e); vec }); + + TestResult::from_bool(itertools::equal(x, y)) + } +} + + +fn is_fused(mut it: I) -> bool +{ + for _ in it.by_ref() {} + for _ in 0..10{ + if it.next().is_some(){ + return false; + } + } + true +} + +quickcheck! { + fn fused_combination(a: Iter) -> bool + { + is_fused(a.clone().combinations(1)) && + is_fused(a.combinations(3)) + } + + fn fused_combination_with_replacement(a: Iter) -> bool + { + is_fused(a.clone().combinations_with_replacement(1)) && + is_fused(a.combinations_with_replacement(3)) + } + + fn fused_tuple_combination(a: Iter) -> bool + { + is_fused(a.clone().fuse().tuple_combinations::<(_,)>()) && + is_fused(a.fuse().tuple_combinations::<(_,_,_)>()) + } + + fn fused_unique(a: Iter) -> bool + { + is_fused(a.fuse().unique()) + } + + fn fused_unique_by(a: Iter) -> bool + { + is_fused(a.fuse().unique_by(|x| x % 100)) + } + + fn fused_interleave_shortest(a: Iter, b: Iter) -> bool + { + !is_fused(a.clone().interleave_shortest(b.clone())) && + is_fused(a.fuse().interleave_shortest(b.fuse())) + } + + fn fused_product(a: Iter, b: Iter) -> bool + { + is_fused(a.fuse().cartesian_product(b.fuse())) + } + + fn fused_merge(a: Iter, b: Iter) -> bool + { + is_fused(a.fuse().merge(b.fuse())) + } + + fn fused_filter_ok(a: Iter) -> bool + { + is_fused(a.map(|x| if x % 2 == 0 {Ok(x)} else {Err(x)} ) + .filter_ok(|x| x % 3 == 0) + .fuse()) + } + + fn fused_filter_map_ok(a: Iter) -> bool + { + is_fused(a.map(|x| if x % 2 == 0 {Ok(x)} else {Err(x)} ) + .filter_map_ok(|x| if x % 3 == 0 {Some(x / 3)} else {None}) + .fuse()) + } + + fn fused_positions(a: Iter) -> bool + { + !is_fused(a.clone().positions(|x|x%2==0)) && + is_fused(a.fuse().positions(|x|x%2==0)) + } + + fn fused_update(a: Iter) -> bool + { + !is_fused(a.clone().update(|x|*x+=1)) && + is_fused(a.fuse().update(|x|*x+=1)) + } + + fn fused_tuple_windows(a: Iter) -> bool + { + is_fused(a.fuse().tuple_windows::<(_,_)>()) + } + + fn fused_pad_using(a: Iter) -> bool + { + is_fused(a.fuse().pad_using(100,|_|0)) + } +} + +quickcheck! { + fn min_set_contains_min(a: Vec<(usize, char)>) -> bool { + let result_set = a.iter().min_set(); + if let Some(result_element) = a.iter().min() { + result_set.contains(&result_element) + } else { + result_set.is_empty() + } + } + + fn min_set_by_contains_min(a: Vec<(usize, char)>) -> bool { + let compare = |x: &&(usize, char), y: &&(usize, char)| x.1.cmp(&y.1); + let result_set = a.iter().min_set_by(compare); + if let Some(result_element) = a.iter().min_by(compare) { + result_set.contains(&result_element) + } else { + result_set.is_empty() + } + } + + fn min_set_by_key_contains_min(a: Vec<(usize, char)>) -> bool { + let key = |x: &&(usize, char)| x.1; + let result_set = a.iter().min_set_by_key(&key); + if let Some(result_element) = a.iter().min_by_key(&key) { + result_set.contains(&result_element) + } else { + result_set.is_empty() + } + } + + fn max_set_contains_max(a: Vec<(usize, char)>) -> bool { + let result_set = a.iter().max_set(); + if let Some(result_element) = a.iter().max() { + result_set.contains(&result_element) + } else { + result_set.is_empty() + } + } + + fn max_set_by_contains_max(a: Vec<(usize, char)>) -> bool { + let compare = |x: &&(usize, char), y: &&(usize, char)| x.1.cmp(&y.1); + let result_set = a.iter().max_set_by(compare); + if let Some(result_element) = a.iter().max_by(compare) { + result_set.contains(&result_element) + } else { + result_set.is_empty() + } + } + + fn max_set_by_key_contains_max(a: Vec<(usize, char)>) -> bool { + let key = |x: &&(usize, char)| x.1; + let result_set = a.iter().max_set_by_key(&key); + if let Some(result_element) = a.iter().max_by_key(&key) { + result_set.contains(&result_element) + } else { + result_set.is_empty() + } + } +} diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/tests/specializations.rs temporalio-1.3.0/vendor/itertools-0.10.5/tests/specializations.rs --- temporalio-1.3.0/vendor/itertools-0.10.5/tests/specializations.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/tests/specializations.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,153 @@ +use itertools::Itertools; +use std::fmt::Debug; +use quickcheck::quickcheck; + +struct Unspecialized(I); +impl Iterator for Unspecialized +where + I: Iterator, +{ + type Item = I::Item; + + #[inline(always)] + fn next(&mut self) -> Option { + self.0.next() + } +} + +macro_rules! check_specialized { + ($src:expr, |$it:pat| $closure:expr) => { + let $it = $src.clone(); + let v1 = $closure; + + let $it = Unspecialized($src.clone()); + let v2 = $closure; + + assert_eq!(v1, v2); + } +} + +fn test_specializations( + it: &Iter, +) where + IterItem: Eq + Debug + Clone, + Iter: Iterator + Clone, +{ + check_specialized!(it, |i| i.count()); + check_specialized!(it, |i| i.last()); + check_specialized!(it, |i| i.collect::>()); + check_specialized!(it, |i| { + let mut parameters_from_fold = vec![]; + let fold_result = i.fold(vec![], |mut acc, v: IterItem| { + parameters_from_fold.push((acc.clone(), v.clone())); + acc.push(v); + acc + }); + (parameters_from_fold, fold_result) + }); + check_specialized!(it, |mut i| { + let mut parameters_from_all = vec![]; + let first = i.next(); + let all_result = i.all(|x| { + parameters_from_all.push(x.clone()); + Some(x)==first + }); + (parameters_from_all, all_result) + }); + let size = it.clone().count(); + for n in 0..size + 2 { + check_specialized!(it, |mut i| i.nth(n)); + } + // size_hint is a bit harder to check + let mut it_sh = it.clone(); + for n in 0..size + 2 { + let len = it_sh.clone().count(); + let (min, max) = it_sh.size_hint(); + assert_eq!(size - n.min(size), len); + assert!(min <= len); + if let Some(max) = max { + assert!(len <= max); + } + it_sh.next(); + } +} + +quickcheck! { + fn intersperse(v: Vec) -> () { + test_specializations(&v.into_iter().intersperse(0)); + } +} + +quickcheck! { + fn put_back_qc(test_vec: Vec) -> () { + test_specializations(&itertools::put_back(test_vec.iter())); + let mut pb = itertools::put_back(test_vec.into_iter()); + pb.put_back(1); + test_specializations(&pb); + } +} + +quickcheck! { + fn merge_join_by_qc(i1: Vec, i2: Vec) -> () { + test_specializations(&i1.into_iter().merge_join_by(i2.into_iter(), std::cmp::Ord::cmp)); + } +} + +quickcheck! { + fn map_into(v: Vec) -> () { + test_specializations(&v.into_iter().map_into::()); + } +} + +quickcheck! { + fn map_ok(v: Vec>) -> () { + test_specializations(&v.into_iter().map_ok(|u| u.checked_add(1))); + } +} + +quickcheck! { + fn process_results(v: Vec>) -> () { + helper(v.iter().copied()); + helper(v.iter().copied().filter(Result::is_ok)); + + fn helper(it: impl Iterator> + Clone) { + macro_rules! check_results_specialized { + ($src:expr, |$it:pat| $closure:expr) => { + assert_eq!( + itertools::process_results($src.clone(), |$it| $closure), + itertools::process_results($src.clone(), |i| { + let $it = Unspecialized(i); + $closure + }), + ) + } + } + + check_results_specialized!(it, |i| i.count()); + check_results_specialized!(it, |i| i.last()); + check_results_specialized!(it, |i| i.collect::>()); + check_results_specialized!(it, |i| { + let mut parameters_from_fold = vec![]; + let fold_result = i.fold(vec![], |mut acc, v| { + parameters_from_fold.push((acc.clone(), v)); + acc.push(v); + acc + }); + (parameters_from_fold, fold_result) + }); + check_results_specialized!(it, |mut i| { + let mut parameters_from_all = vec![]; + let first = i.next(); + let all_result = i.all(|x| { + parameters_from_all.push(x); + Some(x)==first + }); + (parameters_from_all, all_result) + }); + let size = it.clone().count(); + for n in 0..size + 2 { + check_results_specialized!(it, |mut i| i.nth(n)); + } + } + } +} diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/tests/test_core.rs temporalio-1.3.0/vendor/itertools-0.10.5/tests/test_core.rs --- temporalio-1.3.0/vendor/itertools-0.10.5/tests/test_core.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/tests/test_core.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,317 @@ +//! Licensed under the Apache License, Version 2.0 +//! https://www.apache.org/licenses/LICENSE-2.0 or the MIT license +//! https://opensource.org/licenses/MIT, at your +//! option. This file may not be copied, modified, or distributed +//! except according to those terms. +#![no_std] + +use core::iter; +use itertools as it; +use crate::it::Itertools; +use crate::it::interleave; +use crate::it::intersperse; +use crate::it::intersperse_with; +use crate::it::multizip; +use crate::it::free::put_back; +use crate::it::iproduct; +use crate::it::izip; +use crate::it::chain; + +#[test] +fn product2() { + let s = "αβ"; + + let mut prod = iproduct!(s.chars(), 0..2); + assert!(prod.next() == Some(('α', 0))); + assert!(prod.next() == Some(('α', 1))); + assert!(prod.next() == Some(('β', 0))); + assert!(prod.next() == Some(('β', 1))); + assert!(prod.next() == None); +} + +#[test] +fn product_temporary() { + for (_x, _y, _z) in iproduct!( + [0, 1, 2].iter().cloned(), + [0, 1, 2].iter().cloned(), + [0, 1, 2].iter().cloned()) + { + // ok + } +} + + +#[test] +fn izip_macro() { + let mut zip = izip!(2..3); + assert!(zip.next() == Some(2)); + assert!(zip.next().is_none()); + + let mut zip = izip!(0..3, 0..2, 0..2i8); + for i in 0..2 { + assert!((i as usize, i, i as i8) == zip.next().unwrap()); + } + assert!(zip.next().is_none()); + + let xs: [isize; 0] = []; + let mut zip = izip!(0..3, 0..2, 0..2i8, &xs); + assert!(zip.next().is_none()); +} + +#[test] +fn izip2() { + let _zip1: iter::Zip<_, _> = izip!(1.., 2..); + let _zip2: iter::Zip<_, _> = izip!(1.., 2.., ); +} + +#[test] +fn izip3() { + let mut zip: iter::Map, _> = izip!(0..3, 0..2, 0..2i8); + for i in 0..2 { + assert!((i as usize, i, i as i8) == zip.next().unwrap()); + } + assert!(zip.next().is_none()); +} + +#[test] +fn multizip3() { + let mut zip = multizip((0..3, 0..2, 0..2i8)); + for i in 0..2 { + assert!((i as usize, i, i as i8) == zip.next().unwrap()); + } + assert!(zip.next().is_none()); + + let xs: [isize; 0] = []; + let mut zip = multizip((0..3, 0..2, 0..2i8, xs.iter())); + assert!(zip.next().is_none()); + + for (_, _, _, _, _) in multizip((0..3, 0..2, xs.iter(), &xs, xs.to_vec())) { + /* test compiles */ + } +} + +#[test] +fn chain_macro() { + let mut chain = chain!(2..3); + assert!(chain.next() == Some(2)); + assert!(chain.next().is_none()); + + let mut chain = chain!(0..2, 2..3, 3..5i8); + for i in 0..5i8 { + assert_eq!(Some(i), chain.next()); + } + assert!(chain.next().is_none()); + + let mut chain = chain!(); + assert_eq!(chain.next(), Option::<()>::None); +} + +#[test] +fn chain2() { + let _ = chain!(1.., 2..); + let _ = chain!(1.., 2.., ); +} + +#[test] +fn write_to() { + let xs = [7, 9, 8]; + let mut ys = [0; 5]; + let cnt = ys.iter_mut().set_from(xs.iter().copied()); + assert!(cnt == xs.len()); + assert!(ys == [7, 9, 8, 0, 0]); + + let cnt = ys.iter_mut().set_from(0..10); + assert!(cnt == ys.len()); + assert!(ys == [0, 1, 2, 3, 4]); +} + +#[test] +fn test_interleave() { + let xs: [u8; 0] = []; + let ys = [7u8, 9, 8, 10]; + let zs = [2u8, 77]; + let it = interleave(xs.iter(), ys.iter()); + it::assert_equal(it, ys.iter()); + + let rs = [7u8, 2, 9, 77, 8, 10]; + let it = interleave(ys.iter(), zs.iter()); + it::assert_equal(it, rs.iter()); +} + +#[test] +fn test_intersperse() { + let xs = [1u8, 2, 3]; + let ys = [1u8, 0, 2, 0, 3]; + let it = intersperse(&xs, &0); + it::assert_equal(it, ys.iter()); +} + +#[test] +fn test_intersperse_with() { + let xs = [1u8, 2, 3]; + let ys = [1u8, 10, 2, 10, 3]; + let i = 10; + let it = intersperse_with(&xs, || &i); + it::assert_equal(it, ys.iter()); +} + +#[allow(deprecated)] +#[test] +fn foreach() { + let xs = [1i32, 2, 3]; + let mut sum = 0; + xs.iter().foreach(|elt| sum += *elt); + assert!(sum == 6); +} + +#[test] +fn dropping() { + let xs = [1, 2, 3]; + let mut it = xs.iter().dropping(2); + assert_eq!(it.next(), Some(&3)); + assert!(it.next().is_none()); + let mut it = xs.iter().dropping(5); + assert!(it.next().is_none()); +} + +#[test] +fn batching() { + let xs = [0, 1, 2, 1, 3]; + let ys = [(0, 1), (2, 1)]; + + // An iterator that gathers elements up in pairs + let pit = xs + .iter() + .cloned() + .batching(|it| it.next().and_then(|x| it.next().map(|y| (x, y)))); + it::assert_equal(pit, ys.iter().cloned()); +} + +#[test] +fn test_put_back() { + let xs = [0, 1, 1, 1, 2, 1, 3, 3]; + let mut pb = put_back(xs.iter().cloned()); + pb.next(); + pb.put_back(1); + pb.put_back(0); + it::assert_equal(pb, xs.iter().cloned()); +} + +#[allow(deprecated)] +#[test] +fn step() { + it::assert_equal((0..10).step(1), 0..10); + it::assert_equal((0..10).step(2), (0..10).filter(|x: &i32| *x % 2 == 0)); + it::assert_equal((0..10).step(10), 0..1); +} + +#[allow(deprecated)] +#[test] +fn merge() { + it::assert_equal((0..10).step(2).merge((1..10).step(2)), 0..10); +} + + +#[test] +fn repeatn() { + let s = "α"; + let mut it = it::repeat_n(s, 3); + assert_eq!(it.len(), 3); + assert_eq!(it.next(), Some(s)); + assert_eq!(it.next(), Some(s)); + assert_eq!(it.next(), Some(s)); + assert_eq!(it.next(), None); + assert_eq!(it.next(), None); +} + +#[test] +fn count_clones() { + // Check that RepeatN only clones N - 1 times. + + use core::cell::Cell; + #[derive(PartialEq, Debug)] + struct Foo { + n: Cell + } + + impl Clone for Foo + { + fn clone(&self) -> Self + { + let n = self.n.get(); + self.n.set(n + 1); + Foo { n: Cell::new(n + 1) } + } + } + + + for n in 0..10 { + let f = Foo{n: Cell::new(0)}; + let it = it::repeat_n(f, n); + // drain it + let last = it.last(); + if n == 0 { + assert_eq!(last, None); + } else { + assert_eq!(last, Some(Foo{n: Cell::new(n - 1)})); + } + } +} + +#[test] +fn part() { + let mut data = [7, 1, 1, 9, 1, 1, 3]; + let i = it::partition(&mut data, |elt| *elt >= 3); + assert_eq!(i, 3); + assert_eq!(data, [7, 3, 9, 1, 1, 1, 1]); + + let i = it::partition(&mut data, |elt| *elt == 1); + assert_eq!(i, 4); + assert_eq!(data, [1, 1, 1, 1, 9, 3, 7]); + + let mut data = [1, 2, 3, 4, 5, 6, 7, 8, 9]; + let i = it::partition(&mut data, |elt| *elt % 3 == 0); + assert_eq!(i, 3); + assert_eq!(data, [9, 6, 3, 4, 5, 2, 7, 8, 1]); +} + +#[test] +fn tree_fold1() { + for i in 0..100 { + assert_eq!((0..i).tree_fold1(|x, y| x + y), (0..i).fold1(|x, y| x + y)); + } +} + +#[test] +fn exactly_one() { + assert_eq!((0..10).filter(|&x| x == 2).exactly_one().unwrap(), 2); + assert!((0..10).filter(|&x| x > 1 && x < 4).exactly_one().unwrap_err().eq(2..4)); + assert!((0..10).filter(|&x| x > 1 && x < 5).exactly_one().unwrap_err().eq(2..5)); + assert!((0..10).filter(|&_| false).exactly_one().unwrap_err().eq(0..0)); +} + +#[test] +fn at_most_one() { + assert_eq!((0..10).filter(|&x| x == 2).at_most_one().unwrap(), Some(2)); + assert!((0..10).filter(|&x| x > 1 && x < 4).at_most_one().unwrap_err().eq(2..4)); + assert!((0..10).filter(|&x| x > 1 && x < 5).at_most_one().unwrap_err().eq(2..5)); + assert_eq!((0..10).filter(|&_| false).at_most_one().unwrap(), None); +} + +#[test] +fn sum1() { + let v: &[i32] = &[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; + assert_eq!(v[..0].iter().cloned().sum1::(), None); + assert_eq!(v[1..2].iter().cloned().sum1::(), Some(1)); + assert_eq!(v[1..3].iter().cloned().sum1::(), Some(3)); + assert_eq!(v.iter().cloned().sum1::(), Some(55)); +} + +#[test] +fn product1() { + let v: &[i32] = &[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; + assert_eq!(v[..0].iter().cloned().product1::(), None); + assert_eq!(v[..1].iter().cloned().product1::(), Some(0)); + assert_eq!(v[1..3].iter().cloned().product1::(), Some(2)); + assert_eq!(v[1..5].iter().cloned().product1::(), Some(24)); +} diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/tests/test_std.rs temporalio-1.3.0/vendor/itertools-0.10.5/tests/test_std.rs --- temporalio-1.3.0/vendor/itertools-0.10.5/tests/test_std.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/tests/test_std.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,1168 @@ +use quickcheck as qc; +use rand::{distributions::{Distribution, Standard}, Rng, SeedableRng, rngs::StdRng}; +use rand::{seq::SliceRandom, thread_rng}; +use std::{cmp::min, fmt::Debug, marker::PhantomData}; +use itertools as it; +use crate::it::Itertools; +use crate::it::ExactlyOneError; +use crate::it::multizip; +use crate::it::multipeek; +use crate::it::peek_nth; +use crate::it::free::rciter; +use crate::it::free::put_back_n; +use crate::it::FoldWhile; +use crate::it::cloned; +use crate::it::iproduct; +use crate::it::izip; + +#[test] +fn product3() { + let prod = iproduct!(0..3, 0..2, 0..2); + assert_eq!(prod.size_hint(), (12, Some(12))); + let v = prod.collect_vec(); + for i in 0..3 { + for j in 0..2 { + for k in 0..2 { + assert!((i, j, k) == v[(i * 2 * 2 + j * 2 + k) as usize]); + } + } + } + for (_, _, _, _) in iproduct!(0..3, 0..2, 0..2, 0..3) { + /* test compiles */ + } +} + +#[test] +fn interleave_shortest() { + let v0: Vec = vec![0, 2, 4]; + let v1: Vec = vec![1, 3, 5, 7]; + let it = v0.into_iter().interleave_shortest(v1.into_iter()); + assert_eq!(it.size_hint(), (6, Some(6))); + assert_eq!(it.collect_vec(), vec![0, 1, 2, 3, 4, 5]); + + let v0: Vec = vec![0, 2, 4, 6, 8]; + let v1: Vec = vec![1, 3, 5]; + let it = v0.into_iter().interleave_shortest(v1.into_iter()); + assert_eq!(it.size_hint(), (7, Some(7))); + assert_eq!(it.collect_vec(), vec![0, 1, 2, 3, 4, 5, 6]); + + let i0 = ::std::iter::repeat(0); + let v1: Vec<_> = vec![1, 3, 5]; + let it = i0.interleave_shortest(v1.into_iter()); + assert_eq!(it.size_hint(), (7, Some(7))); + + let v0: Vec<_> = vec![0, 2, 4]; + let i1 = ::std::iter::repeat(1); + let it = v0.into_iter().interleave_shortest(i1); + assert_eq!(it.size_hint(), (6, Some(6))); +} + +#[test] +fn duplicates_by() { + let xs = ["aaa", "bbbbb", "aa", "ccc", "bbbb", "aaaaa", "cccc"]; + let ys = ["aa", "bbbb", "cccc"]; + it::assert_equal(ys.iter(), xs.iter().duplicates_by(|x| x[..2].to_string())); + it::assert_equal(ys.iter(), xs.iter().rev().duplicates_by(|x| x[..2].to_string()).rev()); + let ys_rev = ["ccc", "aa", "bbbbb"]; + it::assert_equal(ys_rev.iter(), xs.iter().duplicates_by(|x| x[..2].to_string()).rev()); +} + +#[test] +fn duplicates() { + let xs = [0, 1, 2, 3, 2, 1, 3]; + let ys = [2, 1, 3]; + it::assert_equal(ys.iter(), xs.iter().duplicates()); + it::assert_equal(ys.iter(), xs.iter().rev().duplicates().rev()); + let ys_rev = [3, 2, 1]; + it::assert_equal(ys_rev.iter(), xs.iter().duplicates().rev()); + + let xs = [0, 1, 0, 1]; + let ys = [0, 1]; + it::assert_equal(ys.iter(), xs.iter().duplicates()); + it::assert_equal(ys.iter(), xs.iter().rev().duplicates().rev()); + let ys_rev = [1, 0]; + it::assert_equal(ys_rev.iter(), xs.iter().duplicates().rev()); + + let xs = vec![0, 1, 2, 1, 2]; + let ys = vec![1, 2]; + assert_eq!(ys, xs.iter().duplicates().cloned().collect_vec()); + assert_eq!(ys, xs.iter().rev().duplicates().rev().cloned().collect_vec()); + let ys_rev = vec![2, 1]; + assert_eq!(ys_rev, xs.iter().duplicates().rev().cloned().collect_vec()); +} + +#[test] +fn unique_by() { + let xs = ["aaa", "bbbbb", "aa", "ccc", "bbbb", "aaaaa", "cccc"]; + let ys = ["aaa", "bbbbb", "ccc"]; + it::assert_equal(ys.iter(), xs.iter().unique_by(|x| x[..2].to_string())); + it::assert_equal(ys.iter(), xs.iter().rev().unique_by(|x| x[..2].to_string()).rev()); + let ys_rev = ["cccc", "aaaaa", "bbbb"]; + it::assert_equal(ys_rev.iter(), xs.iter().unique_by(|x| x[..2].to_string()).rev()); +} + +#[test] +fn unique() { + let xs = [0, 1, 2, 3, 2, 1, 3]; + let ys = [0, 1, 2, 3]; + it::assert_equal(ys.iter(), xs.iter().unique()); + it::assert_equal(ys.iter(), xs.iter().rev().unique().rev()); + let ys_rev = [3, 1, 2, 0]; + it::assert_equal(ys_rev.iter(), xs.iter().unique().rev()); + + let xs = [0, 1]; + let ys = [0, 1]; + it::assert_equal(ys.iter(), xs.iter().unique()); + it::assert_equal(ys.iter(), xs.iter().rev().unique().rev()); + let ys_rev = [1, 0]; + it::assert_equal(ys_rev.iter(), xs.iter().unique().rev()); +} + +#[test] +fn intersperse() { + let xs = ["a", "", "b", "c"]; + let v: Vec<&str> = xs.iter().cloned().intersperse(", ").collect(); + let text: String = v.concat(); + assert_eq!(text, "a, , b, c".to_string()); + + let ys = [0, 1, 2, 3]; + let mut it = ys[..0].iter().copied().intersperse(1); + assert!(it.next() == None); +} + +#[test] +fn dedup() { + let xs = [0, 1, 1, 1, 2, 1, 3, 3]; + let ys = [0, 1, 2, 1, 3]; + it::assert_equal(ys.iter(), xs.iter().dedup()); + let xs = [0, 0, 0, 0, 0]; + let ys = [0]; + it::assert_equal(ys.iter(), xs.iter().dedup()); + + let xs = [0, 1, 1, 1, 2, 1, 3, 3]; + let ys = [0, 1, 2, 1, 3]; + let mut xs_d = Vec::new(); + xs.iter().dedup().fold((), |(), &elt| xs_d.push(elt)); + assert_eq!(&xs_d, &ys); +} + +#[test] +fn coalesce() { + let data = vec![-1., -2., -3., 3., 1., 0., -1.]; + let it = data.iter().cloned().coalesce(|x, y| + if (x >= 0.) == (y >= 0.) { + Ok(x + y) + } else { + Err((x, y)) + } + ); + itertools::assert_equal(it.clone(), vec![-6., 4., -1.]); + assert_eq!( + it.fold(vec![], |mut v, n| { + v.push(n); + v + }), + vec![-6., 4., -1.] + ); +} + +#[test] +fn dedup_by() { + let xs = [(0, 0), (0, 1), (1, 1), (2, 1), (0, 2), (3, 1), (0, 3), (1, 3)]; + let ys = [(0, 0), (0, 1), (0, 2), (3, 1), (0, 3)]; + it::assert_equal(ys.iter(), xs.iter().dedup_by(|x, y| x.1==y.1)); + let xs = [(0, 1), (0, 2), (0, 3), (0, 4), (0, 5)]; + let ys = [(0, 1)]; + it::assert_equal(ys.iter(), xs.iter().dedup_by(|x, y| x.0==y.0)); + + let xs = [(0, 0), (0, 1), (1, 1), (2, 1), (0, 2), (3, 1), (0, 3), (1, 3)]; + let ys = [(0, 0), (0, 1), (0, 2), (3, 1), (0, 3)]; + let mut xs_d = Vec::new(); + xs.iter().dedup_by(|x, y| x.1==y.1).fold((), |(), &elt| xs_d.push(elt)); + assert_eq!(&xs_d, &ys); +} + +#[test] +fn dedup_with_count() { + let xs: [i32; 8] = [0, 1, 1, 1, 2, 1, 3, 3]; + let ys: [(usize, &i32); 5] = [(1, &0), (3, &1), (1, &2), (1, &1), (2, &3)]; + + it::assert_equal(ys.iter().cloned(), xs.iter().dedup_with_count()); + + let xs: [i32; 5] = [0, 0, 0, 0, 0]; + let ys: [(usize, &i32); 1] = [(5, &0)]; + + it::assert_equal(ys.iter().cloned(), xs.iter().dedup_with_count()); +} + + +#[test] +fn dedup_by_with_count() { + let xs = [(0, 0), (0, 1), (1, 1), (2, 1), (0, 2), (3, 1), (0, 3), (1, 3)]; + let ys = [(1, &(0, 0)), (3, &(0, 1)), (1, &(0, 2)), (1, &(3, 1)), (2, &(0, 3))]; + + it::assert_equal(ys.iter().cloned(), xs.iter().dedup_by_with_count(|x, y| x.1==y.1)); + + let xs = [(0, 1), (0, 2), (0, 3), (0, 4), (0, 5)]; + let ys = [( 5, &(0, 1))]; + + it::assert_equal(ys.iter().cloned(), xs.iter().dedup_by_with_count(|x, y| x.0==y.0)); +} + +#[test] +fn all_equal() { + assert!("".chars().all_equal()); + assert!("A".chars().all_equal()); + assert!(!"AABBCCC".chars().all_equal()); + assert!("AAAAAAA".chars().all_equal()); + for (_key, mut sub) in &"AABBCCC".chars().group_by(|&x| x) { + assert!(sub.all_equal()); + } +} + +#[test] +fn all_unique() { + assert!("ABCDEFGH".chars().all_unique()); + assert!(!"ABCDEFGA".chars().all_unique()); + assert!(::std::iter::empty::().all_unique()); +} + +#[test] +fn test_put_back_n() { + let xs = [0, 1, 1, 1, 2, 1, 3, 3]; + let mut pb = put_back_n(xs.iter().cloned()); + pb.next(); + pb.next(); + pb.put_back(1); + pb.put_back(0); + it::assert_equal(pb, xs.iter().cloned()); +} + +#[test] +fn tee() { + let xs = [0, 1, 2, 3]; + let (mut t1, mut t2) = xs.iter().cloned().tee(); + assert_eq!(t1.next(), Some(0)); + assert_eq!(t2.next(), Some(0)); + assert_eq!(t1.next(), Some(1)); + assert_eq!(t1.next(), Some(2)); + assert_eq!(t1.next(), Some(3)); + assert_eq!(t1.next(), None); + assert_eq!(t2.next(), Some(1)); + assert_eq!(t2.next(), Some(2)); + assert_eq!(t1.next(), None); + assert_eq!(t2.next(), Some(3)); + assert_eq!(t2.next(), None); + assert_eq!(t1.next(), None); + assert_eq!(t2.next(), None); + + let (t1, t2) = xs.iter().cloned().tee(); + it::assert_equal(t1, xs.iter().cloned()); + it::assert_equal(t2, xs.iter().cloned()); + + let (t1, t2) = xs.iter().cloned().tee(); + it::assert_equal(t1.zip(t2), xs.iter().cloned().zip(xs.iter().cloned())); +} + + +#[test] +fn test_rciter() { + let xs = [0, 1, 1, 1, 2, 1, 3, 5, 6]; + + let mut r1 = rciter(xs.iter().cloned()); + let mut r2 = r1.clone(); + assert_eq!(r1.next(), Some(0)); + assert_eq!(r2.next(), Some(1)); + let mut z = r1.zip(r2); + assert_eq!(z.next(), Some((1, 1))); + assert_eq!(z.next(), Some((2, 1))); + assert_eq!(z.next(), Some((3, 5))); + assert_eq!(z.next(), None); + + // test intoiterator + let r1 = rciter(0..5); + let mut z = izip!(&r1, r1); + assert_eq!(z.next(), Some((0, 1))); +} + +#[allow(deprecated)] +#[test] +fn trait_pointers() { + struct ByRef<'r, I: ?Sized>(&'r mut I) ; + + impl<'r, X, I: ?Sized> Iterator for ByRef<'r, I> where + I: 'r + Iterator + { + type Item = X; + fn next(&mut self) -> Option + { + self.0.next() + } + } + + let mut it = Box::new(0..10) as Box>; + assert_eq!(it.next(), Some(0)); + + { + /* make sure foreach works on non-Sized */ + let jt: &mut dyn Iterator = &mut *it; + assert_eq!(jt.next(), Some(1)); + + { + let mut r = ByRef(jt); + assert_eq!(r.next(), Some(2)); + } + + assert_eq!(jt.find_position(|x| *x == 4), Some((1, 4))); + jt.foreach(|_| ()); + } +} + +#[test] +fn merge_by() { + let odd : Vec<(u32, &str)> = vec![(1, "hello"), (3, "world"), (5, "!")]; + let even = vec![(2, "foo"), (4, "bar"), (6, "baz")]; + let expected = vec![(1, "hello"), (2, "foo"), (3, "world"), (4, "bar"), (5, "!"), (6, "baz")]; + let results = odd.iter().merge_by(even.iter(), |a, b| a.0 <= b.0); + it::assert_equal(results, expected.iter()); +} + +#[test] +fn merge_by_btree() { + use std::collections::BTreeMap; + let mut bt1 = BTreeMap::new(); + bt1.insert("hello", 1); + bt1.insert("world", 3); + let mut bt2 = BTreeMap::new(); + bt2.insert("foo", 2); + bt2.insert("bar", 4); + let results = bt1.into_iter().merge_by(bt2.into_iter(), |a, b| a.0 <= b.0 ); + let expected = vec![("bar", 4), ("foo", 2), ("hello", 1), ("world", 3)]; + it::assert_equal(results, expected.into_iter()); +} + +#[allow(deprecated)] +#[test] +fn kmerge() { + let its = (0..4).map(|s| (s..10).step(4)); + + it::assert_equal(its.kmerge(), 0..10); +} + +#[allow(deprecated)] +#[test] +fn kmerge_2() { + let its = vec![3, 2, 1, 0].into_iter().map(|s| (s..10).step(4)); + + it::assert_equal(its.kmerge(), 0..10); +} + +#[test] +fn kmerge_empty() { + let its = (0..4).map(|_| 0..0); + assert_eq!(its.kmerge().next(), None); +} + +#[test] +fn kmerge_size_hint() { + let its = (0..5).map(|_| (0..10)); + assert_eq!(its.kmerge().size_hint(), (50, Some(50))); +} + +#[test] +fn kmerge_empty_size_hint() { + let its = (0..5).map(|_| (0..0)); + assert_eq!(its.kmerge().size_hint(), (0, Some(0))); +} + +#[test] +fn join() { + let many = [1, 2, 3]; + let one = [1]; + let none: Vec = vec![]; + + assert_eq!(many.iter().join(", "), "1, 2, 3"); + assert_eq!( one.iter().join(", "), "1"); + assert_eq!(none.iter().join(", "), ""); +} + +#[test] +fn sorted_unstable_by() { + let sc = [3, 4, 1, 2].iter().cloned().sorted_by(|&a, &b| { + a.cmp(&b) + }); + it::assert_equal(sc, vec![1, 2, 3, 4]); + + let v = (0..5).sorted_unstable_by(|&a, &b| a.cmp(&b).reverse()); + it::assert_equal(v, vec![4, 3, 2, 1, 0]); +} + +#[test] +fn sorted_unstable_by_key() { + let sc = [3, 4, 1, 2].iter().cloned().sorted_unstable_by_key(|&x| x); + it::assert_equal(sc, vec![1, 2, 3, 4]); + + let v = (0..5).sorted_unstable_by_key(|&x| -x); + it::assert_equal(v, vec![4, 3, 2, 1, 0]); +} + +#[test] +fn sorted_by() { + let sc = [3, 4, 1, 2].iter().cloned().sorted_by(|&a, &b| { + a.cmp(&b) + }); + it::assert_equal(sc, vec![1, 2, 3, 4]); + + let v = (0..5).sorted_by(|&a, &b| a.cmp(&b).reverse()); + it::assert_equal(v, vec![4, 3, 2, 1, 0]); +} + +qc::quickcheck! { + fn k_smallest_range(n: u64, m: u16, k: u16) -> () { + // u16 is used to constrain k and m to 0..2¹â¶, + // otherwise the test could use too much memory. + let (k, m) = (k as u64, m as u64); + + // Generate a random permutation of n..n+m + let i = { + let mut v: Vec = (n..n.saturating_add(m)).collect(); + v.shuffle(&mut thread_rng()); + v.into_iter() + }; + + // Check that taking the k smallest elements yields n..n+min(k, m) + it::assert_equal( + i.k_smallest(k as usize), + n..n.saturating_add(min(k, m)) + ); + } +} + +#[derive(Clone, Debug)] +struct RandIter { + idx: usize, + len: usize, + rng: R, + _t: PhantomData +} + +impl Iterator for RandIter +where Standard: Distribution { + type Item = T; + fn next(&mut self) -> Option { + if self.idx == self.len { + None + } else { + self.idx += 1; + Some(self.rng.gen()) + } + } +} + +impl qc::Arbitrary for RandIter { + fn arbitrary(g: &mut G) -> Self { + RandIter { + idx: 0, + len: g.size(), + rng: R::seed_from_u64(g.next_u64()), + _t : PhantomData{}, + } + } +} + +// Check that taking the k smallest is the same as +// sorting then taking the k first elements +fn k_smallest_sort(i: I, k: u16) +where + I: Iterator + Clone, + I::Item: Ord + Debug, +{ + let j = i.clone(); + let k = k as usize; + it::assert_equal( + i.k_smallest(k), + j.sorted().take(k) + ) +} + +macro_rules! generic_test { + ($f:ident, $($t:ty),+) => { + $(paste::item! { + qc::quickcheck! { + fn [< $f _ $t >](i: RandIter<$t>, k: u16) -> () { + $f(i, k) + } + } + })+ + }; +} + +generic_test!(k_smallest_sort, u8, u16, u32, u64, i8, i16, i32, i64); + +#[test] +fn sorted_by_key() { + let sc = [3, 4, 1, 2].iter().cloned().sorted_by_key(|&x| x); + it::assert_equal(sc, vec![1, 2, 3, 4]); + + let v = (0..5).sorted_by_key(|&x| -x); + it::assert_equal(v, vec![4, 3, 2, 1, 0]); +} + +#[test] +fn sorted_by_cached_key() { + // Track calls to key function + let mut ncalls = 0; + + let sorted = [3, 4, 1, 2].iter().cloned().sorted_by_cached_key(|&x| { + ncalls += 1; + x.to_string() + }); + it::assert_equal(sorted, vec![1, 2, 3, 4]); + // Check key function called once per element + assert_eq!(ncalls, 4); + + let mut ncalls = 0; + + let sorted = (0..5).sorted_by_cached_key(|&x| { + ncalls += 1; + -x + }); + it::assert_equal(sorted, vec![4, 3, 2, 1, 0]); + // Check key function called once per element + assert_eq!(ncalls, 5); +} + +#[test] +fn test_multipeek() { + let nums = vec![1u8,2,3,4,5]; + + let mp = multipeek(nums.iter().copied()); + assert_eq!(nums, mp.collect::>()); + + let mut mp = multipeek(nums.iter().copied()); + assert_eq!(mp.peek(), Some(&1)); + assert_eq!(mp.next(), Some(1)); + assert_eq!(mp.peek(), Some(&2)); + assert_eq!(mp.peek(), Some(&3)); + assert_eq!(mp.next(), Some(2)); + assert_eq!(mp.peek(), Some(&3)); + assert_eq!(mp.peek(), Some(&4)); + assert_eq!(mp.peek(), Some(&5)); + assert_eq!(mp.peek(), None); + assert_eq!(mp.next(), Some(3)); + assert_eq!(mp.next(), Some(4)); + assert_eq!(mp.peek(), Some(&5)); + assert_eq!(mp.peek(), None); + assert_eq!(mp.next(), Some(5)); + assert_eq!(mp.next(), None); + assert_eq!(mp.peek(), None); +} + +#[test] +fn test_multipeek_reset() { + let data = [1, 2, 3, 4]; + + let mut mp = multipeek(cloned(&data)); + assert_eq!(mp.peek(), Some(&1)); + assert_eq!(mp.next(), Some(1)); + assert_eq!(mp.peek(), Some(&2)); + assert_eq!(mp.peek(), Some(&3)); + mp.reset_peek(); + assert_eq!(mp.peek(), Some(&2)); + assert_eq!(mp.next(), Some(2)); +} + +#[test] +fn test_multipeek_peeking_next() { + use crate::it::PeekingNext; + let nums = vec![1u8,2,3,4,5,6,7]; + + let mut mp = multipeek(nums.iter().copied()); + assert_eq!(mp.peeking_next(|&x| x != 0), Some(1)); + assert_eq!(mp.next(), Some(2)); + assert_eq!(mp.peek(), Some(&3)); + assert_eq!(mp.peek(), Some(&4)); + assert_eq!(mp.peeking_next(|&x| x == 3), Some(3)); + assert_eq!(mp.peek(), Some(&4)); + assert_eq!(mp.peeking_next(|&x| x != 4), None); + assert_eq!(mp.peeking_next(|&x| x == 4), Some(4)); + assert_eq!(mp.peek(), Some(&5)); + assert_eq!(mp.peek(), Some(&6)); + assert_eq!(mp.peeking_next(|&x| x != 5), None); + assert_eq!(mp.peek(), Some(&7)); + assert_eq!(mp.peeking_next(|&x| x == 5), Some(5)); + assert_eq!(mp.peeking_next(|&x| x == 6), Some(6)); + assert_eq!(mp.peek(), Some(&7)); + assert_eq!(mp.peek(), None); + assert_eq!(mp.next(), Some(7)); + assert_eq!(mp.peek(), None); +} + +#[test] +fn test_peek_nth() { + let nums = vec![1u8,2,3,4,5]; + + let iter = peek_nth(nums.iter().copied()); + assert_eq!(nums, iter.collect::>()); + + let mut iter = peek_nth(nums.iter().copied()); + + assert_eq!(iter.peek_nth(0), Some(&1)); + assert_eq!(iter.peek_nth(0), Some(&1)); + assert_eq!(iter.next(), Some(1)); + + assert_eq!(iter.peek_nth(0), Some(&2)); + assert_eq!(iter.peek_nth(1), Some(&3)); + assert_eq!(iter.next(), Some(2)); + + assert_eq!(iter.peek_nth(0), Some(&3)); + assert_eq!(iter.peek_nth(1), Some(&4)); + assert_eq!(iter.peek_nth(2), Some(&5)); + assert_eq!(iter.peek_nth(3), None); + + assert_eq!(iter.next(), Some(3)); + assert_eq!(iter.next(), Some(4)); + + assert_eq!(iter.peek_nth(0), Some(&5)); + assert_eq!(iter.peek_nth(1), None); + assert_eq!(iter.next(), Some(5)); + assert_eq!(iter.next(), None); + + assert_eq!(iter.peek_nth(0), None); + assert_eq!(iter.peek_nth(1), None); +} + +#[test] +fn test_peek_nth_peeking_next() { + use it::PeekingNext; + let nums = vec![1u8,2,3,4,5,6,7]; + let mut iter = peek_nth(nums.iter().copied()); + + assert_eq!(iter.peeking_next(|&x| x != 0), Some(1)); + assert_eq!(iter.next(), Some(2)); + + assert_eq!(iter.peek_nth(0), Some(&3)); + assert_eq!(iter.peek_nth(1), Some(&4)); + assert_eq!(iter.peeking_next(|&x| x == 3), Some(3)); + assert_eq!(iter.peek(), Some(&4)); + + assert_eq!(iter.peeking_next(|&x| x != 4), None); + assert_eq!(iter.peeking_next(|&x| x == 4), Some(4)); + assert_eq!(iter.peek_nth(0), Some(&5)); + assert_eq!(iter.peek_nth(1), Some(&6)); + + assert_eq!(iter.peeking_next(|&x| x != 5), None); + assert_eq!(iter.peek(), Some(&5)); + + assert_eq!(iter.peeking_next(|&x| x == 5), Some(5)); + assert_eq!(iter.peeking_next(|&x| x == 6), Some(6)); + assert_eq!(iter.peek_nth(0), Some(&7)); + assert_eq!(iter.peek_nth(1), None); + assert_eq!(iter.next(), Some(7)); + assert_eq!(iter.peek(), None); +} + +#[test] +fn pad_using() { + it::assert_equal((0..0).pad_using(1, |_| 1), 1..2); + + let v: Vec = vec![0, 1, 2]; + let r = v.into_iter().pad_using(5, |n| n); + it::assert_equal(r, vec![0, 1, 2, 3, 4]); + + let v: Vec = vec![0, 1, 2]; + let r = v.into_iter().pad_using(1, |_| panic!()); + it::assert_equal(r, vec![0, 1, 2]); +} + +#[test] +fn group_by() { + for (ch1, sub) in &"AABBCCC".chars().group_by(|&x| x) { + for ch2 in sub { + assert_eq!(ch1, ch2); + } + } + + for (ch1, sub) in &"AAABBBCCCCDDDD".chars().group_by(|&x| x) { + for ch2 in sub { + assert_eq!(ch1, ch2); + if ch1 == 'C' { + break; + } + } + } + + let toupper = |ch: &char| ch.to_uppercase().next().unwrap(); + + // try all possible orderings + for indices in permutohedron::Heap::new(&mut [0, 1, 2, 3]) { + let groups = "AaaBbbccCcDDDD".chars().group_by(&toupper); + let mut subs = groups.into_iter().collect_vec(); + + for &idx in &indices[..] { + let (key, text) = match idx { + 0 => ('A', "Aaa".chars()), + 1 => ('B', "Bbb".chars()), + 2 => ('C', "ccCc".chars()), + 3 => ('D', "DDDD".chars()), + _ => unreachable!(), + }; + assert_eq!(key, subs[idx].0); + it::assert_equal(&mut subs[idx].1, text); + } + } + + let groups = "AAABBBCCCCDDDD".chars().group_by(|&x| x); + let mut subs = groups.into_iter().map(|(_, g)| g).collect_vec(); + + let sd = subs.pop().unwrap(); + let sc = subs.pop().unwrap(); + let sb = subs.pop().unwrap(); + let sa = subs.pop().unwrap(); + for (a, b, c, d) in multizip((sa, sb, sc, sd)) { + assert_eq!(a, 'A'); + assert_eq!(b, 'B'); + assert_eq!(c, 'C'); + assert_eq!(d, 'D'); + } + + // check that the key closure is called exactly n times + { + let mut ntimes = 0; + let text = "AABCCC"; + for (_, sub) in &text.chars().group_by(|&x| { ntimes += 1; x}) { + for _ in sub { + } + } + assert_eq!(ntimes, text.len()); + } + + { + let mut ntimes = 0; + let text = "AABCCC"; + for _ in &text.chars().group_by(|&x| { ntimes += 1; x}) { + } + assert_eq!(ntimes, text.len()); + } + + { + let text = "ABCCCDEEFGHIJJKK"; + let gr = text.chars().group_by(|&x| x); + it::assert_equal(gr.into_iter().flat_map(|(_, sub)| sub), text.chars()); + } +} + +#[test] +fn group_by_lazy_2() { + let data = vec![0, 1]; + let groups = data.iter().group_by(|k| *k); + let gs = groups.into_iter().collect_vec(); + it::assert_equal(data.iter(), gs.into_iter().flat_map(|(_k, g)| g)); + + let data = vec![0, 1, 1, 0, 0]; + let groups = data.iter().group_by(|k| *k); + let mut gs = groups.into_iter().collect_vec(); + gs[1..].reverse(); + it::assert_equal(&[0, 0, 0, 1, 1], gs.into_iter().flat_map(|(_, g)| g)); + + let grouper = data.iter().group_by(|k| *k); + let mut groups = Vec::new(); + for (k, group) in &grouper { + if *k == 1 { + groups.push(group); + } + } + it::assert_equal(&mut groups[0], &[1, 1]); + + let data = vec![0, 0, 0, 1, 1, 0, 0, 2, 2, 3, 3]; + let grouper = data.iter().group_by(|k| *k); + let mut groups = Vec::new(); + for (i, (_, group)) in grouper.into_iter().enumerate() { + if i < 2 { + groups.push(group); + } else if i < 4 { + for _ in group { + } + } else { + groups.push(group); + } + } + it::assert_equal(&mut groups[0], &[0, 0, 0]); + it::assert_equal(&mut groups[1], &[1, 1]); + it::assert_equal(&mut groups[2], &[3, 3]); + + // use groups as chunks + let data = vec![0, 0, 0, 1, 1, 0, 0, 2, 2, 3, 3]; + let mut i = 0; + let grouper = data.iter().group_by(move |_| { let k = i / 3; i += 1; k }); + for (i, group) in &grouper { + match i { + 0 => it::assert_equal(group, &[0, 0, 0]), + 1 => it::assert_equal(group, &[1, 1, 0]), + 2 => it::assert_equal(group, &[0, 2, 2]), + 3 => it::assert_equal(group, &[3, 3]), + _ => unreachable!(), + } + } +} + +#[test] +fn group_by_lazy_3() { + // test consuming each group on the lap after it was produced + let data = vec![0, 0, 0, 1, 1, 0, 0, 1, 1, 2, 2]; + let grouper = data.iter().group_by(|elt| *elt); + let mut last = None; + for (key, group) in &grouper { + if let Some(gr) = last.take() { + for elt in gr { + assert!(elt != key && i32::abs(elt - key) == 1); + } + } + last = Some(group); + } +} + +#[test] +fn chunks() { + let data = vec![0, 0, 0, 1, 1, 0, 0, 2, 2, 3, 3]; + let grouper = data.iter().chunks(3); + for (i, chunk) in grouper.into_iter().enumerate() { + match i { + 0 => it::assert_equal(chunk, &[0, 0, 0]), + 1 => it::assert_equal(chunk, &[1, 1, 0]), + 2 => it::assert_equal(chunk, &[0, 2, 2]), + 3 => it::assert_equal(chunk, &[3, 3]), + _ => unreachable!(), + } + } +} + +#[test] +fn concat_empty() { + let data: Vec> = Vec::new(); + assert_eq!(data.into_iter().concat(), Vec::new()) +} + +#[test] +fn concat_non_empty() { + let data = vec![vec![1,2,3], vec![4,5,6], vec![7,8,9]]; + assert_eq!(data.into_iter().concat(), vec![1,2,3,4,5,6,7,8,9]) +} + +#[test] +fn combinations() { + assert!((1..3).combinations(5).next().is_none()); + + let it = (1..3).combinations(2); + it::assert_equal(it, vec![ + vec![1, 2], + ]); + + let it = (1..5).combinations(2); + it::assert_equal(it, vec![ + vec![1, 2], + vec![1, 3], + vec![1, 4], + vec![2, 3], + vec![2, 4], + vec![3, 4], + ]); + + it::assert_equal((0..0).tuple_combinations::<(_, _)>(), >::new()); + it::assert_equal((0..1).tuple_combinations::<(_, _)>(), >::new()); + it::assert_equal((0..2).tuple_combinations::<(_, _)>(), vec![(0, 1)]); + + it::assert_equal((0..0).combinations(2), >>::new()); + it::assert_equal((0..1).combinations(1), vec![vec![0]]); + it::assert_equal((0..2).combinations(1), vec![vec![0], vec![1]]); + it::assert_equal((0..2).combinations(2), vec![vec![0, 1]]); +} + +#[test] +fn combinations_of_too_short() { + for i in 1..10 { + assert!((0..0).combinations(i).next().is_none()); + assert!((0..i - 1).combinations(i).next().is_none()); + } +} + + +#[test] +fn combinations_zero() { + it::assert_equal((1..3).combinations(0), vec![vec![]]); + it::assert_equal((0..0).combinations(0), vec![vec![]]); +} + +#[test] +fn permutations_zero() { + it::assert_equal((1..3).permutations(0), vec![vec![]]); + it::assert_equal((0..0).permutations(0), vec![vec![]]); +} + +#[test] +fn combinations_with_replacement() { + // Pool smaller than n + it::assert_equal((0..1).combinations_with_replacement(2), vec![vec![0, 0]]); + // Pool larger than n + it::assert_equal( + (0..3).combinations_with_replacement(2), + vec![ + vec![0, 0], + vec![0, 1], + vec![0, 2], + vec![1, 1], + vec![1, 2], + vec![2, 2], + ], + ); + // Zero size + it::assert_equal( + (0..3).combinations_with_replacement(0), + vec![vec![]], + ); + // Zero size on empty pool + it::assert_equal( + (0..0).combinations_with_replacement(0), + vec![vec![]], + ); + // Empty pool + it::assert_equal( + (0..0).combinations_with_replacement(2), + >>::new(), + ); +} + +#[test] +fn powerset() { + it::assert_equal((0..0).powerset(), vec![vec![]]); + it::assert_equal((0..1).powerset(), vec![vec![], vec![0]]); + it::assert_equal((0..2).powerset(), vec![vec![], vec![0], vec![1], vec![0, 1]]); + it::assert_equal((0..3).powerset(), vec![ + vec![], + vec![0], vec![1], vec![2], + vec![0, 1], vec![0, 2], vec![1, 2], + vec![0, 1, 2] + ]); + + assert_eq!((0..4).powerset().count(), 1 << 4); + assert_eq!((0..8).powerset().count(), 1 << 8); + assert_eq!((0..16).powerset().count(), 1 << 16); +} + +#[test] +fn diff_mismatch() { + let a = vec![1, 2, 3, 4]; + let b = vec![1.0, 5.0, 3.0, 4.0]; + let b_map = b.into_iter().map(|f| f as i32); + let diff = it::diff_with(a.iter(), b_map, |a, b| *a == b); + + assert!(match diff { + Some(it::Diff::FirstMismatch(1, _, from_diff)) => + from_diff.collect::>() == vec![5, 3, 4], + _ => false, + }); +} + +#[test] +fn diff_longer() { + let a = vec![1, 2, 3, 4]; + let b = vec![1.0, 2.0, 3.0, 4.0, 5.0, 6.0]; + let b_map = b.into_iter().map(|f| f as i32); + let diff = it::diff_with(a.iter(), b_map, |a, b| *a == b); + + assert!(match diff { + Some(it::Diff::Longer(_, remaining)) => + remaining.collect::>() == vec![5, 6], + _ => false, + }); +} + +#[test] +fn diff_shorter() { + let a = vec![1, 2, 3, 4]; + let b = vec![1.0, 2.0]; + let b_map = b.into_iter().map(|f| f as i32); + let diff = it::diff_with(a.iter(), b_map, |a, b| *a == b); + + assert!(match diff { + Some(it::Diff::Shorter(len, _)) => len == 2, + _ => false, + }); +} + +#[test] +fn extrema_set() { + use std::cmp::Ordering; + + // A peculiar type: Equality compares both tuple items, but ordering only the + // first item. Used to distinguish equal elements. + #[derive(Clone, Debug, PartialEq, Eq)] + struct Val(u32, u32); + + impl PartialOrd for Val { + fn partial_cmp(&self, other: &Val) -> Option { + self.0.partial_cmp(&other.0) + } + } + + impl Ord for Val { + fn cmp(&self, other: &Val) -> Ordering { + self.0.cmp(&other.0) + } + } + + assert_eq!(None::.iter().min_set(), Vec::<&u32>::new()); + assert_eq!(None::.iter().max_set(), Vec::<&u32>::new()); + + assert_eq!(Some(1u32).iter().min_set(), vec![&1]); + assert_eq!(Some(1u32).iter().max_set(), vec![&1]); + + let data = vec![Val(0, 1), Val(2, 0), Val(0, 2), Val(1, 0), Val(2, 1)]; + + let min_set = data.iter().min_set(); + assert_eq!(min_set, vec![&Val(0, 1), &Val(0, 2)]); + + let min_set_by_key = data.iter().min_set_by_key(|v| v.1); + assert_eq!(min_set_by_key, vec![&Val(2, 0), &Val(1, 0)]); + + let min_set_by = data.iter().min_set_by(|x, y| x.1.cmp(&y.1)); + assert_eq!(min_set_by, vec![&Val(2, 0), &Val(1, 0)]); + + let max_set = data.iter().max_set(); + assert_eq!(max_set, vec![&Val(2, 0), &Val(2, 1)]); + + let max_set_by_key = data.iter().max_set_by_key(|v| v.1); + assert_eq!(max_set_by_key, vec![&Val(0, 2)]); + + let max_set_by = data.iter().max_set_by(|x, y| x.1.cmp(&y.1)); + assert_eq!(max_set_by, vec![&Val(0, 2)]); +} + +#[test] +fn minmax() { + use std::cmp::Ordering; + use crate::it::MinMaxResult; + + // A peculiar type: Equality compares both tuple items, but ordering only the + // first item. This is so we can check the stability property easily. + #[derive(Clone, Debug, PartialEq, Eq)] + struct Val(u32, u32); + + impl PartialOrd for Val { + fn partial_cmp(&self, other: &Val) -> Option { + self.0.partial_cmp(&other.0) + } + } + + impl Ord for Val { + fn cmp(&self, other: &Val) -> Ordering { + self.0.cmp(&other.0) + } + } + + assert_eq!(None::>.iter().minmax(), MinMaxResult::NoElements); + + assert_eq!(Some(1u32).iter().minmax(), MinMaxResult::OneElement(&1)); + + let data = vec![Val(0, 1), Val(2, 0), Val(0, 2), Val(1, 0), Val(2, 1)]; + + let minmax = data.iter().minmax(); + assert_eq!(minmax, MinMaxResult::MinMax(&Val(0, 1), &Val(2, 1))); + + let (min, max) = data.iter().minmax_by_key(|v| v.1).into_option().unwrap(); + assert_eq!(min, &Val(2, 0)); + assert_eq!(max, &Val(0, 2)); + + let (min, max) = data.iter().minmax_by(|x, y| x.1.cmp(&y.1)).into_option().unwrap(); + assert_eq!(min, &Val(2, 0)); + assert_eq!(max, &Val(0, 2)); +} + +#[test] +fn format() { + let data = [0, 1, 2, 3]; + let ans1 = "0, 1, 2, 3"; + let ans2 = "0--1--2--3"; + + let t1 = format!("{}", data.iter().format(", ")); + assert_eq!(t1, ans1); + let t2 = format!("{:?}", data.iter().format("--")); + assert_eq!(t2, ans2); + + let dataf = [1.1, 5.71828, -22.]; + let t3 = format!("{:.2e}", dataf.iter().format(", ")); + assert_eq!(t3, "1.10e0, 5.72e0, -2.20e1"); +} + +#[test] +fn while_some() { + let ns = (1..10).map(|x| if x % 5 != 0 { Some(x) } else { None }) + .while_some(); + it::assert_equal(ns, vec![1, 2, 3, 4]); +} + +#[allow(deprecated)] +#[test] +fn fold_while() { + let mut iterations = 0; + let vec = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; + let sum = vec.into_iter().fold_while(0, |acc, item| { + iterations += 1; + let new_sum = acc + item; + if new_sum <= 20 { + FoldWhile::Continue(new_sum) + } else { + FoldWhile::Done(acc) + } + }).into_inner(); + assert_eq!(iterations, 6); + assert_eq!(sum, 15); +} + +#[test] +fn tree_fold1() { + let x = [ + "", + "0", + "0 1 x", + "0 1 x 2 x", + "0 1 x 2 3 x x", + "0 1 x 2 3 x x 4 x", + "0 1 x 2 3 x x 4 5 x x", + "0 1 x 2 3 x x 4 5 x 6 x x", + "0 1 x 2 3 x x 4 5 x 6 7 x x x", + "0 1 x 2 3 x x 4 5 x 6 7 x x x 8 x", + "0 1 x 2 3 x x 4 5 x 6 7 x x x 8 9 x x", + "0 1 x 2 3 x x 4 5 x 6 7 x x x 8 9 x 10 x x", + "0 1 x 2 3 x x 4 5 x 6 7 x x x 8 9 x 10 11 x x x", + "0 1 x 2 3 x x 4 5 x 6 7 x x x 8 9 x 10 11 x x 12 x x", + "0 1 x 2 3 x x 4 5 x 6 7 x x x 8 9 x 10 11 x x 12 13 x x x", + "0 1 x 2 3 x x 4 5 x 6 7 x x x 8 9 x 10 11 x x 12 13 x 14 x x x", + "0 1 x 2 3 x x 4 5 x 6 7 x x x 8 9 x 10 11 x x 12 13 x 14 15 x x x x", + ]; + for (i, &s) in x.iter().enumerate() { + let expected = if s.is_empty() { None } else { Some(s.to_string()) }; + let num_strings = (0..i).map(|x| x.to_string()); + let actual = num_strings.tree_fold1(|a, b| format!("{} {} x", a, b)); + assert_eq!(actual, expected); + } +} + +#[test] +fn exactly_one_question_mark_syntax_works() { + exactly_one_question_mark_return().unwrap_err(); +} + +fn exactly_one_question_mark_return() -> Result<(), ExactlyOneError>> { + [].iter().exactly_one()?; + Ok(()) +} + +#[test] +fn multiunzip() { + let (a, b, c): (Vec<_>, Vec<_>, Vec<_>) = [(0, 1, 2), (3, 4, 5), (6, 7, 8)].iter().cloned().multiunzip(); + assert_eq!((a, b, c), (vec![0, 3, 6], vec![1, 4, 7], vec![2, 5, 8])); + let (): () = [(), (), ()].iter().cloned().multiunzip(); + let t: (Vec<_>, Vec<_>, Vec<_>, Vec<_>, Vec<_>, Vec<_>, Vec<_>, Vec<_>, Vec<_>, Vec<_>, Vec<_>, Vec<_>) = [(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)].iter().cloned().multiunzip(); + assert_eq!(t, (vec![0], vec![1], vec![2], vec![3], vec![4], vec![5], vec![6], vec![7], vec![8], vec![9], vec![10], vec![11])); +} diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/tests/tuples.rs temporalio-1.3.0/vendor/itertools-0.10.5/tests/tuples.rs --- temporalio-1.3.0/vendor/itertools-0.10.5/tests/tuples.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/tests/tuples.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,86 @@ +use itertools::Itertools; + +#[test] +fn tuples() { + let v = [1, 2, 3, 4, 5]; + let mut iter = v.iter().cloned().tuples(); + assert_eq!(Some((1,)), iter.next()); + assert_eq!(Some((2,)), iter.next()); + assert_eq!(Some((3,)), iter.next()); + assert_eq!(Some((4,)), iter.next()); + assert_eq!(Some((5,)), iter.next()); + assert_eq!(None, iter.next()); + assert_eq!(None, iter.into_buffer().next()); + + let mut iter = v.iter().cloned().tuples(); + assert_eq!(Some((1, 2)), iter.next()); + assert_eq!(Some((3, 4)), iter.next()); + assert_eq!(None, iter.next()); + itertools::assert_equal(vec![5], iter.into_buffer()); + + let mut iter = v.iter().cloned().tuples(); + assert_eq!(Some((1, 2, 3)), iter.next()); + assert_eq!(None, iter.next()); + itertools::assert_equal(vec![4, 5], iter.into_buffer()); + + let mut iter = v.iter().cloned().tuples(); + assert_eq!(Some((1, 2, 3, 4)), iter.next()); + assert_eq!(None, iter.next()); + itertools::assert_equal(vec![5], iter.into_buffer()); +} + +#[test] +fn tuple_windows() { + let v = [1, 2, 3, 4, 5]; + + let mut iter = v.iter().cloned().tuple_windows(); + assert_eq!(Some((1,)), iter.next()); + assert_eq!(Some((2,)), iter.next()); + assert_eq!(Some((3,)), iter.next()); + + let mut iter = v.iter().cloned().tuple_windows(); + assert_eq!(Some((1, 2)), iter.next()); + assert_eq!(Some((2, 3)), iter.next()); + assert_eq!(Some((3, 4)), iter.next()); + assert_eq!(Some((4, 5)), iter.next()); + assert_eq!(None, iter.next()); + + let mut iter = v.iter().cloned().tuple_windows(); + assert_eq!(Some((1, 2, 3)), iter.next()); + assert_eq!(Some((2, 3, 4)), iter.next()); + assert_eq!(Some((3, 4, 5)), iter.next()); + assert_eq!(None, iter.next()); + + let mut iter = v.iter().cloned().tuple_windows(); + assert_eq!(Some((1, 2, 3, 4)), iter.next()); + assert_eq!(Some((2, 3, 4, 5)), iter.next()); + assert_eq!(None, iter.next()); + + let v = [1, 2, 3]; + let mut iter = v.iter().cloned().tuple_windows::<(_, _, _, _)>(); + assert_eq!(None, iter.next()); +} + +#[test] +fn next_tuple() { + let v = [1, 2, 3, 4, 5]; + let mut iter = v.iter(); + assert_eq!(iter.next_tuple().map(|(&x, &y)| (x, y)), Some((1, 2))); + assert_eq!(iter.next_tuple().map(|(&x, &y)| (x, y)), Some((3, 4))); + assert_eq!(iter.next_tuple::<(_, _)>(), None); +} + +#[test] +fn collect_tuple() { + let v = [1, 2]; + let iter = v.iter().cloned(); + assert_eq!(iter.collect_tuple(), Some((1, 2))); + + let v = [1]; + let iter = v.iter().cloned(); + assert_eq!(iter.collect_tuple::<(_, _)>(), None); + + let v = [1, 2, 3]; + let iter = v.iter().cloned(); + assert_eq!(iter.collect_tuple::<(_, _)>(), None); +} diff -Nru temporalio-1.3.0/vendor/itertools-0.10.5/tests/zip.rs temporalio-1.3.0/vendor/itertools-0.10.5/tests/zip.rs --- temporalio-1.3.0/vendor/itertools-0.10.5/tests/zip.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/itertools-0.10.5/tests/zip.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,77 @@ +use itertools::Itertools; +use itertools::EitherOrBoth::{Both, Left, Right}; +use itertools::free::zip_eq; +use itertools::multizip; + +#[test] +fn zip_longest_fused() { + let a = [Some(1), None, Some(3), Some(4)]; + let b = [1, 2, 3]; + + let unfused = a.iter().batching(|it| *it.next().unwrap()) + .zip_longest(b.iter().cloned()); + itertools::assert_equal(unfused, + vec![Both(1, 1), Right(2), Right(3)]); +} + +#[test] +fn test_zip_longest_size_hint() { + let c = (1..10).cycle(); + let v: &[_] = &[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; + let v2 = &[10, 11, 12]; + + assert_eq!(c.zip_longest(v.iter()).size_hint(), (std::usize::MAX, None)); + + assert_eq!(v.iter().zip_longest(v2.iter()).size_hint(), (10, Some(10))); +} + +#[test] +fn test_double_ended_zip_longest() { + let xs = [1, 2, 3, 4, 5, 6]; + let ys = [1, 2, 3, 7]; + let a = xs.iter().copied(); + let b = ys.iter().copied(); + let mut it = a.zip_longest(b); + assert_eq!(it.next(), Some(Both(1, 1))); + assert_eq!(it.next(), Some(Both(2, 2))); + assert_eq!(it.next_back(), Some(Left(6))); + assert_eq!(it.next_back(), Some(Left(5))); + assert_eq!(it.next_back(), Some(Both(4, 7))); + assert_eq!(it.next(), Some(Both(3, 3))); + assert_eq!(it.next(), None); +} + +#[test] +fn test_double_ended_zip() { + let xs = [1, 2, 3, 4, 5, 6]; + let ys = [1, 2, 3, 7]; + let a = xs.iter().copied(); + let b = ys.iter().copied(); + let mut it = multizip((a, b)); + assert_eq!(it.next_back(), Some((4, 7))); + assert_eq!(it.next_back(), Some((3, 3))); + assert_eq!(it.next_back(), Some((2, 2))); + assert_eq!(it.next_back(), Some((1, 1))); + assert_eq!(it.next_back(), None); +} + + +#[should_panic] +#[test] +fn zip_eq_panic1() +{ + let a = [1, 2]; + let b = [1, 2, 3]; + + zip_eq(&a, &b).count(); +} + +#[should_panic] +#[test] +fn zip_eq_panic2() +{ + let a: [i32; 0] = []; + let b = [1, 2, 3]; + + zip_eq(&a, &b).count(); +} diff -Nru temporalio-1.3.0/vendor/jobserver/.cargo-checksum.json temporalio-1.3.0/vendor/jobserver/.cargo-checksum.json --- temporalio-1.3.0/vendor/jobserver/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/jobserver/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"Cargo.toml":"7236550dc71dfeecdd220976fd14dff13c99219c927b0f45a09900ae778c3764","LICENSE-APACHE":"7cfd738c53d61c79f07e348f622bf7707c9084237054d37fbe07788a75f5881c","LICENSE-MIT":"29c9533fc9a32ee529e928bcb12308f0745d237fdea80d83c0258f23243d65d1","README.md":"bf650d48029473e7e2d93b4a6bb46ab08c4ae60a327dc294351372685dcedfa5","src/error.rs":"5ffc1e2e35c25266a521a947c50ebe6292a6d88142235f404a5dc79bf393f8b5","src/lib.rs":"8eba0ff1829e68aec642fdb0e7928e199dfd2109d6c4d797bdfddbf4c08585ef","src/unix.rs":"64e559fac928156468490258728c89fbda75cd81e6c70baf05f5355b2c2623ff","src/wasm.rs":"791974e745b72f8133a55a9d15b8b6efd6513d921ac58f4ddc4e6035cd87a9af","src/windows.rs":"6b9faff05d572716d5ac1387300cf0cc8e0f0cfe80100bc2007572b12863d170","tests/client-of-myself.rs":"0ea04ff17614e248e281e5e730ecc615f1e310aefac42a7f95da2dcfb42c1c5e","tests/client.rs":"770ac4065207985c1427ededb95d6dcb341ca26a36aad65f4f1e245d09f28677","tests/helper.rs":"1e970fef77b828948e453d46487c6195b0e7774d6c14f16b32623b3ec6e2186c","tests/make-as-a-client.rs":"4f96a30f24c0a93e003d6107ccc767549ef18a7b0d022dbbab8dc70348f698ee","tests/server.rs":"231493b95789b62987f2790c0f4df2a23db27a3a66dacb20987c67e7203cdd6c"},"package":"8c37f63953c4c63420ed5fd3d6d398c719489b9f872b9fa683262f8edd363c7d"} \ No newline at end of file +{"files":{"Cargo.toml":"0f712c94e98313fc5833521e1dc0c42a57e5603ea54d1e05a004b95b52fb39b7","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397","README.md":"07d8d79f8f6b6a94321fe8db78d26ed409de47cee49290947bd6bbfa29d05e9c","src/lib.rs":"be789fda33a51375fcc87e4bf9bf1256930d718f698f700bbec5e335c83e0659","src/unix.rs":"1e1efc5cd1f381fea83bdaaee474ad3530b396305a9bbdc9da08b0c36baced31","src/wasm.rs":"65d3d8ed45972b4459581505906481d32a50d2f7514cd7ff2a595fceeaa672f0","src/windows.rs":"8e0fa3ab29757d809d4fa03c8101870435ce8c4ceaebe491df3144d62fe0aaaf","tests/client-of-myself.rs":"ca09bf398f69df4bac1730999e954dbbc3faf3c6512678c136e0938e7e9cd0ab","tests/client.rs":"d4745cdd650c86d19bc81f6c9b35df498996deffb86ae6412ad040af96a19183","tests/helper.rs":"c0e6c00eaf849295d8ec23e374690b6645c0f7d993e91abf7ad53ac960f71762","tests/make-as-a-client.rs":"8be1f3fef1e9e65c7904dbaa04364bf0f44e9deab84a2a247a5a94b5cf0df9bc","tests/server.rs":"da15bf12e1df1883f660892b996c9e0d92485aace3f7b50ee70c4a8e6deae8da"},"package":"936cfd212a0155903bcbc060e316fb6cc7cbf2e1907329391ebadc1fe0ce77c2"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/jobserver/Cargo.toml temporalio-1.3.0/vendor/jobserver/Cargo.toml --- temporalio-1.3.0/vendor/jobserver/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/jobserver/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -12,7 +12,7 @@ [package] edition = "2018" name = "jobserver" -version = "0.1.27" +version = "0.1.26" authors = ["Alex Crichton "] description = """ An implementation of the GNU make jobserver for Rust diff -Nru temporalio-1.3.0/vendor/jobserver/LICENSE-APACHE temporalio-1.3.0/vendor/jobserver/LICENSE-APACHE --- temporalio-1.3.0/vendor/jobserver/LICENSE-APACHE 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/jobserver/LICENSE-APACHE 2023-10-30 19:40:00.000000000 +0000 @@ -1,201 +1,201 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - -Copyright [yyyy] [name of copyright owner] - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff -Nru temporalio-1.3.0/vendor/jobserver/LICENSE-MIT temporalio-1.3.0/vendor/jobserver/LICENSE-MIT --- temporalio-1.3.0/vendor/jobserver/LICENSE-MIT 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/jobserver/LICENSE-MIT 2023-10-30 19:40:00.000000000 +0000 @@ -1,25 +1,25 @@ -Copyright (c) 2014 Alex Crichton - -Permission is hereby granted, free of charge, to any -person obtaining a copy of this software and associated -documentation files (the "Software"), to deal in the -Software without restriction, including without -limitation the rights to use, copy, modify, merge, -publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software -is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice -shall be included in all copies or substantial portions -of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. +Copyright (c) 2014 Alex Crichton + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff -Nru temporalio-1.3.0/vendor/jobserver/README.md temporalio-1.3.0/vendor/jobserver/README.md --- temporalio-1.3.0/vendor/jobserver/README.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/jobserver/README.md 2023-10-30 19:40:00.000000000 +0000 @@ -1,39 +1,39 @@ -# jobserver-rs - -An implementation of the GNU make jobserver for Rust - -[![Crates.io](https://img.shields.io/crates/v/jobserver.svg?maxAge=2592000)](https://crates.io/crates/jobserver) - -[Documentation](https://docs.rs/jobserver) - -## Usage - -First, add this to your `Cargo.toml`: - -```toml -[dependencies] -jobserver = "0.1" -``` - -Next, add this to your crate: - -```rust -extern crate jobserver; -``` - -# License - -This project is licensed under either of - - * Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or - http://www.apache.org/licenses/LICENSE-2.0) - * MIT license ([LICENSE-MIT](LICENSE-MIT) or - http://opensource.org/licenses/MIT) - -at your option. - -### Contribution - -Unless you explicitly state otherwise, any contribution intentionally submitted -for inclusion in jobserver-rs by you, as defined in the Apache-2.0 license, shall be -dual licensed as above, without any additional terms or conditions. +# jobserver-rs + +An implementation of the GNU make jobserver for Rust + +[![Crates.io](https://img.shields.io/crates/v/jobserver.svg?maxAge=2592000)](https://crates.io/crates/jobserver) + +[Documentation](https://docs.rs/jobserver) + +## Usage + +First, add this to your `Cargo.toml`: + +```toml +[dependencies] +jobserver = "0.1" +``` + +Next, add this to your crate: + +```rust +extern crate jobserver; +``` + +# License + +This project is licensed under either of + + * Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or + http://www.apache.org/licenses/LICENSE-2.0) + * MIT license ([LICENSE-MIT](LICENSE-MIT) or + http://opensource.org/licenses/MIT) + +at your option. + +### Contribution + +Unless you explicitly state otherwise, any contribution intentionally submitted +for inclusion in jobserver-rs by you, as defined in the Apache-2.0 license, shall be +dual licensed as above, without any additional terms or conditions. diff -Nru temporalio-1.3.0/vendor/jobserver/src/error.rs temporalio-1.3.0/vendor/jobserver/src/error.rs --- temporalio-1.3.0/vendor/jobserver/src/error.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/jobserver/src/error.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,84 +0,0 @@ -#[cfg(unix)] -type RawFd = std::os::fd::RawFd; -#[cfg(not(unix))] -type RawFd = std::convert::Infallible; - -/// Error type for `from_env_ext` function. -#[derive(Debug)] -pub struct FromEnvError { - pub(crate) inner: FromEnvErrorInner, -} - -/// Kind of an error returned from `from_env_ext` function. -#[derive(Debug)] -#[non_exhaustive] -pub enum FromEnvErrorKind { - /// There is no environment variable that describes jobserver to inherit. - NoEnvVar, - /// There is no jobserver in the environment variable. - /// Variables associated with Make can be used for passing data other than jobserver info. - NoJobserver, - /// Cannot parse jobserver environment variable value, incorrect format. - CannotParse, - /// Cannot open path or name from the jobserver environment variable value. - CannotOpenPath, - /// Cannot open file descriptor from the jobserver environment variable value. - CannotOpenFd, - /// File descriptor from the jobserver environment variable value is not a pipe. - NotAPipe, - /// Jobserver inheritance is not supported on this platform. - Unsupported, -} - -impl FromEnvError { - /// Get the error kind. - pub fn kind(&self) -> FromEnvErrorKind { - match self.inner { - FromEnvErrorInner::NoEnvVar => FromEnvErrorKind::NoEnvVar, - FromEnvErrorInner::NoJobserver => FromEnvErrorKind::NoJobserver, - FromEnvErrorInner::CannotParse(_) => FromEnvErrorKind::CannotParse, - FromEnvErrorInner::CannotOpenPath(..) => FromEnvErrorKind::CannotOpenPath, - FromEnvErrorInner::CannotOpenFd(..) => FromEnvErrorKind::CannotOpenFd, - FromEnvErrorInner::NotAPipe(..) => FromEnvErrorKind::NotAPipe, - FromEnvErrorInner::Unsupported => FromEnvErrorKind::Unsupported, - } - } -} - -impl std::fmt::Display for FromEnvError { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match &self.inner { - FromEnvErrorInner::NoEnvVar => write!(f, "there is no environment variable that describes jobserver to inherit"), - FromEnvErrorInner::NoJobserver => write!(f, "there is no `--jobserver-fds=` or `--jobserver-auth=` in the environment variable"), - FromEnvErrorInner::CannotParse(s) => write!(f, "cannot parse jobserver environment variable value: {s}"), - FromEnvErrorInner::CannotOpenPath(s, err) => write!(f, "cannot open path or name {s} from the jobserver environment variable value: {err}"), - FromEnvErrorInner::CannotOpenFd(fd, err) => write!(f, "cannot open file descriptor {fd} from the jobserver environment variable value: {err}"), - FromEnvErrorInner::NotAPipe(fd, None) => write!(f, "file descriptor {fd} from the jobserver environment variable value is not a pipe"), - FromEnvErrorInner::NotAPipe(fd, Some(err)) => write!(f, "file descriptor {fd} from the jobserver environment variable value is not a pipe: {err}"), - FromEnvErrorInner::Unsupported => write!(f, "jobserver inheritance is not supported on this platform"), - } - } -} -impl std::error::Error for FromEnvError { - fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { - match &self.inner { - FromEnvErrorInner::CannotOpenPath(_, err) => Some(err), - FromEnvErrorInner::NotAPipe(_, Some(err)) | FromEnvErrorInner::CannotOpenFd(_, err) => { - Some(err) - } - _ => None, - } - } -} - -#[allow(dead_code)] -#[derive(Debug)] -pub(crate) enum FromEnvErrorInner { - NoEnvVar, - NoJobserver, - CannotParse(String), - CannotOpenPath(String, std::io::Error), - CannotOpenFd(RawFd, std::io::Error), - NotAPipe(RawFd, Option), - Unsupported, -} diff -Nru temporalio-1.3.0/vendor/jobserver/src/lib.rs temporalio-1.3.0/vendor/jobserver/src/lib.rs --- temporalio-1.3.0/vendor/jobserver/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/jobserver/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,596 +1,544 @@ -//! An implementation of the GNU make jobserver. -//! -//! This crate is an implementation, in Rust, of the GNU `make` jobserver for -//! CLI tools that are interoperating with make or otherwise require some form -//! of parallelism limiting across process boundaries. This was originally -//! written for usage in Cargo to both (a) work when `cargo` is invoked from -//! `make` (using `make`'s jobserver) and (b) work when `cargo` invokes build -//! scripts, exporting a jobserver implementation for `make` processes to -//! transitively use. -//! -//! The jobserver implementation can be found in [detail online][docs] but -//! basically boils down to a cross-process semaphore. On Unix this is -//! implemented with the `pipe` syscall and read/write ends of a pipe and on -//! Windows this is implemented literally with IPC semaphores. Starting from -//! GNU `make` version 4.4, named pipe becomes the default way in communication -//! on Unix. This crate also supports that feature in the sense of inheriting -//! and forwarding the correct environment. -//! -//! The jobserver protocol in `make` also dictates when tokens are acquired to -//! run child work, and clients using this crate should take care to implement -//! such details to ensure correct interoperation with `make` itself. -//! -//! ## Examples -//! -//! Connect to a jobserver that was set up by `make` or a different process: -//! -//! ```no_run -//! use jobserver::Client; -//! -//! // See API documentation for why this is `unsafe` -//! let client = match unsafe { Client::from_env() } { -//! Some(client) => client, -//! None => panic!("client not configured"), -//! }; -//! ``` -//! -//! Acquire and release token from a jobserver: -//! -//! ```no_run -//! use jobserver::Client; -//! -//! let client = unsafe { Client::from_env().unwrap() }; -//! let token = client.acquire().unwrap(); // blocks until it is available -//! drop(token); // releases the token when the work is done -//! ``` -//! -//! Create a new jobserver and configure a child process to have access: -//! -//! ``` -//! use std::process::Command; -//! use jobserver::Client; -//! -//! let client = Client::new(4).expect("failed to create jobserver"); -//! let mut cmd = Command::new("make"); -//! client.configure(&mut cmd); -//! ``` -//! -//! ## Caveats -//! -//! This crate makes no attempt to release tokens back to a jobserver on -//! abnormal exit of a process. If a process which acquires a token is killed -//! with ctrl-c or some similar signal then tokens will not be released and the -//! jobserver may be in a corrupt state. -//! -//! Note that this is typically ok as ctrl-c means that an entire build process -//! is being torn down, but it's worth being aware of at least! -//! -//! ## Windows caveats -//! -//! There appear to be two implementations of `make` on Windows. On MSYS2 one -//! typically comes as `mingw32-make` and the other as `make` itself. I'm not -//! personally too familiar with what's going on here, but for jobserver-related -//! information the `mingw32-make` implementation uses Windows semaphores -//! whereas the `make` program does not. The `make` program appears to use file -//! descriptors and I'm not really sure how it works, so this crate is not -//! compatible with `make` on Windows. It is, however, compatible with -//! `mingw32-make`. -//! -//! [docs]: http://make.mad-scientist.net/papers/jobserver-implementation/ - -#![deny(missing_docs, missing_debug_implementations)] -#![doc(html_root_url = "https://docs.rs/jobserver/0.1")] - -use std::env; -use std::ffi::OsString; -use std::io; -use std::process::Command; -use std::sync::{Arc, Condvar, Mutex, MutexGuard}; - -mod error; -#[cfg(unix)] -#[path = "unix.rs"] -mod imp; -#[cfg(windows)] -#[path = "windows.rs"] -mod imp; -#[cfg(not(any(unix, windows)))] -#[path = "wasm.rs"] -mod imp; - -/// A client of a jobserver -/// -/// This structure is the main type exposed by this library, and is where -/// interaction to a jobserver is configured through. Clients are either created -/// from scratch in which case the internal semphore is initialied on the spot, -/// or a client is created from the environment to connect to a jobserver -/// already created. -/// -/// Some usage examples can be found in the crate documentation for using a -/// client. -/// -/// Note that a `Client` implements the `Clone` trait, and all instances of a -/// `Client` refer to the same jobserver instance. -#[derive(Clone, Debug)] -pub struct Client { - inner: Arc, -} - -/// An acquired token from a jobserver. -/// -/// This token will be released back to the jobserver when it is dropped and -/// otherwise represents the ability to spawn off another thread of work. -#[derive(Debug)] -pub struct Acquired { - client: Arc, - data: imp::Acquired, - disabled: bool, -} - -impl Acquired { - /// This drops the `Acquired` token without releasing the associated token. - /// - /// This is not generally useful, but can be helpful if you do not have the - /// ability to store an Acquired token but need to not yet release it. - /// - /// You'll typically want to follow this up with a call to `release_raw` or - /// similar to actually release the token later on. - pub fn drop_without_releasing(mut self) { - self.disabled = true; - } -} - -#[derive(Default, Debug)] -struct HelperState { - lock: Mutex, - cvar: Condvar, -} - -#[derive(Default, Debug)] -struct HelperInner { - requests: usize, - producer_done: bool, - consumer_done: bool, -} - -use error::FromEnvErrorInner; -pub use error::{FromEnvError, FromEnvErrorKind}; - -/// Return type for `from_env_ext` function. -#[derive(Debug)] -pub struct FromEnv { - /// Result of trying to get jobserver client from env. - pub client: Result, - /// Name and value of the environment variable. - /// `None` if no relevant environment variable is found. - pub var: Option<(&'static str, OsString)>, -} - -impl FromEnv { - fn new_ok(client: Client, var_name: &'static str, var_value: OsString) -> FromEnv { - FromEnv { - client: Ok(client), - var: Some((var_name, var_value)), - } - } - fn new_err(kind: FromEnvErrorInner, var_name: &'static str, var_value: OsString) -> FromEnv { - FromEnv { - client: Err(FromEnvError { inner: kind }), - var: Some((var_name, var_value)), - } - } -} - -impl Client { - /// Creates a new jobserver initialized with the given parallelism limit. - /// - /// A client to the jobserver created will be returned. This client will - /// allow at most `limit` tokens to be acquired from it in parallel. More - /// calls to `acquire` will cause the calling thread to block. - /// - /// Note that the created `Client` is not automatically inherited into - /// spawned child processes from this program. Manual usage of the - /// `configure` function is required for a child process to have access to a - /// job server. - /// - /// # Examples - /// - /// ``` - /// use jobserver::Client; - /// - /// let client = Client::new(4).expect("failed to create jobserver"); - /// ``` - /// - /// # Errors - /// - /// Returns an error if any I/O error happens when attempting to create the - /// jobserver client. - pub fn new(limit: usize) -> io::Result { - Ok(Client { - inner: Arc::new(imp::Client::new(limit)?), - }) - } - - /// Attempts to connect to the jobserver specified in this process's - /// environment. - /// - /// When the a `make` executable calls a child process it will configure the - /// environment of the child to ensure that it has handles to the jobserver - /// it's passing down. This function will attempt to look for these details - /// and connect to the jobserver. - /// - /// Note that the created `Client` is not automatically inherited into - /// spawned child processes from this program. Manual usage of the - /// `configure` function is required for a child process to have access to a - /// job server. - /// - /// # Return value - /// - /// `FromEnv` contains result and relevant environment variable. - /// If a jobserver was found in the environment and it looks correct then - /// result with the connected client will be returned. In other cases - /// result will contain `Err(FromEnvErr)`. - /// - /// Note that on Unix the `Client` returned **takes ownership of the file - /// descriptors specified in the environment**. Jobservers on Unix are - /// implemented with `pipe` file descriptors, and they're inherited from - /// parent processes. This `Client` returned takes ownership of the file - /// descriptors for this process and will close the file descriptors after - /// this value is dropped. - /// - /// Additionally on Unix this function will configure the file descriptors - /// with `CLOEXEC` so they're not automatically inherited by spawned - /// children. - /// - /// On unix if `check_pipe` enabled this function will check if provided - /// files are actually pipes. - /// - /// # Safety - /// - /// This function is `unsafe` to call on Unix specifically as it - /// transitively requires usage of the `from_raw_fd` function, which is - /// itself unsafe in some circumstances. - /// - /// It's recommended to call this function very early in the lifetime of a - /// program before any other file descriptors are opened. That way you can - /// make sure to take ownership properly of the file descriptors passed - /// down, if any. - /// - /// It's generally unsafe to call this function twice in a program if the - /// previous invocation returned `Some`. - /// - /// Note, though, that on Windows it should be safe to call this function - /// any number of times. - pub unsafe fn from_env_ext(check_pipe: bool) -> FromEnv { - let (env, var_os) = match ["CARGO_MAKEFLAGS", "MAKEFLAGS", "MFLAGS"] - .iter() - .map(|&env| env::var_os(env).map(|var| (env, var))) - .find_map(|p| p) - { - Some((env, var_os)) => (env, var_os), - None => return FromEnv::new_err(FromEnvErrorInner::NoEnvVar, "", Default::default()), - }; - - let var = match var_os.to_str() { - Some(var) => var, - None => { - let err = FromEnvErrorInner::CannotParse("not valid UTF-8".to_string()); - return FromEnv::new_err(err, env, var_os); - } - }; - - let (arg, pos) = match ["--jobserver-fds=", "--jobserver-auth="] - .iter() - .map(|&arg| var.find(arg).map(|pos| (arg, pos))) - .find_map(|pos| pos) - { - Some((arg, pos)) => (arg, pos), - None => return FromEnv::new_err(FromEnvErrorInner::NoJobserver, env, var_os), - }; - - let s = var[pos + arg.len()..].split(' ').next().unwrap(); - match imp::Client::open(s, check_pipe) { - Ok(c) => FromEnv::new_ok(Client { inner: Arc::new(c) }, env, var_os), - Err(err) => FromEnv::new_err(err, env, var_os), - } - } - - /// Attempts to connect to the jobserver specified in this process's - /// environment. - /// - /// Wraps `from_env_ext` and discards error details. - pub unsafe fn from_env() -> Option { - Self::from_env_ext(false).client.ok() - } - - /// Acquires a token from this jobserver client. - /// - /// This function will block the calling thread until a new token can be - /// acquired from the jobserver. - /// - /// # Return value - /// - /// On successful acquisition of a token an instance of `Acquired` is - /// returned. This structure, when dropped, will release the token back to - /// the jobserver. It's recommended to avoid leaking this value. - /// - /// # Errors - /// - /// If an I/O error happens while acquiring a token then this function will - /// return immediately with the error. If an error is returned then a token - /// was not acquired. - pub fn acquire(&self) -> io::Result { - let data = self.inner.acquire()?; - Ok(Acquired { - client: self.inner.clone(), - data, - disabled: false, - }) - } - - /// Returns amount of tokens in the read-side pipe. - /// - /// # Return value - /// - /// Number of bytes available to be read from the jobserver pipe - /// - /// # Errors - /// - /// Underlying errors from the ioctl will be passed up. - pub fn available(&self) -> io::Result { - self.inner.available() - } - - /// Configures a child process to have access to this client's jobserver as - /// well. - /// - /// This function is required to be called to ensure that a jobserver is - /// properly inherited to a child process. If this function is *not* called - /// then this `Client` will not be accessible in the child process. In other - /// words, if not called, then `Client::from_env` will return `None` in the - /// child process (or the equivalent of `Child::from_env` that `make` uses). - /// - /// ## Platform-specific behavior - /// - /// On Unix and Windows this will clobber the `CARGO_MAKEFLAGS` environment - /// variables for the child process, and on Unix this will also allow the - /// two file descriptors for this client to be inherited to the child. - /// - /// On platforms other than Unix and Windows this panics. - pub fn configure(&self, cmd: &mut Command) { - cmd.env("CARGO_MAKEFLAGS", &self.mflags_env()); - self.inner.configure(cmd); - } - - /// Configures a child process to have access to this client's jobserver as - /// well. - /// - /// This function is required to be called to ensure that a jobserver is - /// properly inherited to a child process. If this function is *not* called - /// then this `Client` will not be accessible in the child process. In other - /// words, if not called, then `Client::from_env` will return `None` in the - /// child process (or the equivalent of `Child::from_env` that `make` uses). - /// - /// ## Platform-specific behavior - /// - /// On Unix and Windows this will clobber the `CARGO_MAKEFLAGS`, - /// `MAKEFLAGS` and `MFLAGS` environment variables for the child process, - /// and on Unix this will also allow the two file descriptors for - /// this client to be inherited to the child. - /// - /// On platforms other than Unix and Windows this panics. - pub fn configure_make(&self, cmd: &mut Command) { - let value = self.mflags_env(); - cmd.env("CARGO_MAKEFLAGS", &value); - cmd.env("MAKEFLAGS", &value); - cmd.env("MFLAGS", &value); - self.inner.configure(cmd); - } - - fn mflags_env(&self) -> String { - let arg = self.inner.string_arg(); - // Older implementations of make use `--jobserver-fds` and newer - // implementations use `--jobserver-auth`, pass both to try to catch - // both implementations. - format!("-j --jobserver-fds={0} --jobserver-auth={0}", arg) - } - - /// Converts this `Client` into a helper thread to deal with a blocking - /// `acquire` function a little more easily. - /// - /// The fact that the `acquire` function on `Client` blocks isn't always - /// the easiest to work with. Typically you're using a jobserver to - /// manage running other events in parallel! This means that you need to - /// either (a) wait for an existing job to finish or (b) wait for a - /// new token to become available. - /// - /// Unfortunately the blocking in `acquire` happens at the implementation - /// layer of jobservers. On Unix this requires a blocking call to `read` - /// and on Windows this requires one of the `WaitFor*` functions. Both - /// of these situations aren't the easiest to deal with: - /// - /// * On Unix there's basically only one way to wake up a `read` early, and - /// that's through a signal. This is what the `make` implementation - /// itself uses, relying on `SIGCHLD` to wake up a blocking acquisition - /// of a new job token. Unfortunately nonblocking I/O is not an option - /// here, so it means that "waiting for one of two events" means that - /// the latter event must generate a signal! This is not always the case - /// on unix for all jobservers. - /// - /// * On Windows you'd have to basically use the `WaitForMultipleObjects` - /// which means that you've got to canonicalize all your event sources - /// into a `HANDLE` which also isn't the easiest thing to do - /// unfortunately. - /// - /// This function essentially attempts to ease these limitations by - /// converting this `Client` into a helper thread spawned into this - /// process. The application can then request that the helper thread - /// acquires tokens and the provided closure will be invoked for each token - /// acquired. - /// - /// The intention is that this function can be used to translate the event - /// of a token acquisition into an arbitrary user-defined event. - /// - /// # Arguments - /// - /// This function will consume the `Client` provided to be transferred to - /// the helper thread that is spawned. Additionally a closure `f` is - /// provided to be invoked whenever a token is acquired. - /// - /// This closure is only invoked after calls to - /// `HelperThread::request_token` have been made and a token itself has - /// been acquired. If an error happens while acquiring the token then - /// an error will be yielded to the closure as well. - /// - /// # Return Value - /// - /// This function will return an instance of the `HelperThread` structure - /// which is used to manage the helper thread associated with this client. - /// Through the `HelperThread` you'll request that tokens are acquired. - /// When acquired, the closure provided here is invoked. - /// - /// When the `HelperThread` structure is returned it will be gracefully - /// torn down, and the calling thread will be blocked until the thread is - /// torn down (which should be prompt). - /// - /// # Errors - /// - /// This function may fail due to creation of the helper thread or - /// auxiliary I/O objects to manage the helper thread. In any of these - /// situations the error is propagated upwards. - /// - /// # Platform-specific behavior - /// - /// On Windows this function behaves pretty normally as expected, but on - /// Unix the implementation is... a little heinous. As mentioned above - /// we're forced into blocking I/O for token acquisition, namely a blocking - /// call to `read`. We must be able to unblock this, however, to tear down - /// the helper thread gracefully! - /// - /// Essentially what happens is that we'll send a signal to the helper - /// thread spawned and rely on `EINTR` being returned to wake up the helper - /// thread. This involves installing a global `SIGUSR1` handler that does - /// nothing along with sending signals to that thread. This may cause - /// odd behavior in some applications, so it's recommended to review and - /// test thoroughly before using this. - pub fn into_helper_thread(self, f: F) -> io::Result - where - F: FnMut(io::Result) + Send + 'static, - { - let state = Arc::new(HelperState::default()); - Ok(HelperThread { - inner: Some(imp::spawn_helper(self, state.clone(), Box::new(f))?), - state, - }) - } - - /// Blocks the current thread until a token is acquired. - /// - /// This is the same as `acquire`, except that it doesn't return an RAII - /// helper. If successful the process will need to guarantee that - /// `release_raw` is called in the future. - pub fn acquire_raw(&self) -> io::Result<()> { - self.inner.acquire()?; - Ok(()) - } - - /// Releases a jobserver token back to the original jobserver. - /// - /// This is intended to be paired with `acquire_raw` if it was called, but - /// in some situations it could also be called to relinquish a process's - /// implicit token temporarily which is then re-acquired later. - pub fn release_raw(&self) -> io::Result<()> { - self.inner.release(None)?; - Ok(()) - } -} - -impl Drop for Acquired { - fn drop(&mut self) { - if !self.disabled { - drop(self.client.release(Some(&self.data))); - } - } -} - -/// Structure returned from `Client::into_helper_thread` to manage the lifetime -/// of the helper thread returned, see those associated docs for more info. -#[derive(Debug)] -pub struct HelperThread { - inner: Option, - state: Arc, -} - -impl HelperThread { - /// Request that the helper thread acquires a token, eventually calling the - /// original closure with a token when it's available. - /// - /// For more information, see the docs on that function. - pub fn request_token(&self) { - // Indicate that there's one more request for a token and then wake up - // the helper thread if it's sleeping. - self.state.lock().requests += 1; - self.state.cvar.notify_one(); - } -} - -impl Drop for HelperThread { - fn drop(&mut self) { - // Flag that the producer half is done so the helper thread should exit - // quickly if it's waiting. Wake it up if it's actually waiting - self.state.lock().producer_done = true; - self.state.cvar.notify_one(); - - // ... and afterwards perform any thread cleanup logic - self.inner.take().unwrap().join(); - } -} - -impl HelperState { - fn lock(&self) -> MutexGuard<'_, HelperInner> { - self.lock.lock().unwrap_or_else(|e| e.into_inner()) - } - - /// Executes `f` for each request for a token, where `f` is expected to - /// block and then provide the original closure with a token once it's - /// acquired. - /// - /// This is an infinite loop until the helper thread is dropped, at which - /// point everything should get interrupted. - fn for_each_request(&self, mut f: impl FnMut(&HelperState)) { - let mut lock = self.lock(); - - // We only execute while we could receive requests, but as soon as - // that's `false` we're out of here. - while !lock.producer_done { - // If no one's requested a token then we wait for someone to - // request a token. - if lock.requests == 0 { - lock = self.cvar.wait(lock).unwrap_or_else(|e| e.into_inner()); - continue; - } - - // Consume the request for a token, and then actually acquire a - // token after unlocking our lock (not that acquisition happens in - // `f`). This ensures that we don't actually hold the lock if we - // wait for a long time for a token. - lock.requests -= 1; - drop(lock); - f(self); - lock = self.lock(); - } - lock.consumer_done = true; - self.cvar.notify_one(); - } - - fn producer_done(&self) -> bool { - self.lock().producer_done - } -} - -#[test] -fn no_helper_deadlock() { - let x = crate::Client::new(32).unwrap(); - let _y = x.clone(); - std::mem::drop(x.into_helper_thread(|_| {}).unwrap()); -} +//! An implementation of the GNU make jobserver. +//! +//! This crate is an implementation, in Rust, of the GNU `make` jobserver for +//! CLI tools that are interoperating with make or otherwise require some form +//! of parallelism limiting across process boundaries. This was originally +//! written for usage in Cargo to both (a) work when `cargo` is invoked from +//! `make` (using `make`'s jobserver) and (b) work when `cargo` invokes build +//! scripts, exporting a jobserver implementation for `make` processes to +//! transitively use. +//! +//! The jobserver implementation can be found in [detail online][docs] but +//! basically boils down to a cross-process semaphore. On Unix this is +//! implemented with the `pipe` syscall and read/write ends of a pipe and on +//! Windows this is implemented literally with IPC semaphores. Starting from +//! GNU `make` version 4.4, named pipe becomes the default way in communication +//! on Unix. This crate also supports that feature in the sense of inheriting +//! and forwarding the correct environment. +//! +//! The jobserver protocol in `make` also dictates when tokens are acquired to +//! run child work, and clients using this crate should take care to implement +//! such details to ensure correct interoperation with `make` itself. +//! +//! ## Examples +//! +//! Connect to a jobserver that was set up by `make` or a different process: +//! +//! ```no_run +//! use jobserver::Client; +//! +//! // See API documentation for why this is `unsafe` +//! let client = match unsafe { Client::from_env() } { +//! Some(client) => client, +//! None => panic!("client not configured"), +//! }; +//! ``` +//! +//! Acquire and release token from a jobserver: +//! +//! ```no_run +//! use jobserver::Client; +//! +//! let client = unsafe { Client::from_env().unwrap() }; +//! let token = client.acquire().unwrap(); // blocks until it is available +//! drop(token); // releases the token when the work is done +//! ``` +//! +//! Create a new jobserver and configure a child process to have access: +//! +//! ``` +//! use std::process::Command; +//! use jobserver::Client; +//! +//! let client = Client::new(4).expect("failed to create jobserver"); +//! let mut cmd = Command::new("make"); +//! client.configure(&mut cmd); +//! ``` +//! +//! ## Caveats +//! +//! This crate makes no attempt to release tokens back to a jobserver on +//! abnormal exit of a process. If a process which acquires a token is killed +//! with ctrl-c or some similar signal then tokens will not be released and the +//! jobserver may be in a corrupt state. +//! +//! Note that this is typically ok as ctrl-c means that an entire build process +//! is being torn down, but it's worth being aware of at least! +//! +//! ## Windows caveats +//! +//! There appear to be two implementations of `make` on Windows. On MSYS2 one +//! typically comes as `mingw32-make` and the other as `make` itself. I'm not +//! personally too familiar with what's going on here, but for jobserver-related +//! information the `mingw32-make` implementation uses Windows semaphores +//! whereas the `make` program does not. The `make` program appears to use file +//! descriptors and I'm not really sure how it works, so this crate is not +//! compatible with `make` on Windows. It is, however, compatible with +//! `mingw32-make`. +//! +//! [docs]: http://make.mad-scientist.net/papers/jobserver-implementation/ + +#![deny(missing_docs, missing_debug_implementations)] +#![doc(html_root_url = "https://docs.rs/jobserver/0.1")] + +use std::env; +use std::io; +use std::process::Command; +use std::sync::{Arc, Condvar, Mutex, MutexGuard}; + +#[cfg(unix)] +#[path = "unix.rs"] +mod imp; +#[cfg(windows)] +#[path = "windows.rs"] +mod imp; +#[cfg(not(any(unix, windows)))] +#[path = "wasm.rs"] +mod imp; + +/// A client of a jobserver +/// +/// This structure is the main type exposed by this library, and is where +/// interaction to a jobserver is configured through. Clients are either created +/// from scratch in which case the internal semphore is initialied on the spot, +/// or a client is created from the environment to connect to a jobserver +/// already created. +/// +/// Some usage examples can be found in the crate documentation for using a +/// client. +/// +/// Note that a `Client` implements the `Clone` trait, and all instances of a +/// `Client` refer to the same jobserver instance. +#[derive(Clone, Debug)] +pub struct Client { + inner: Arc, +} + +/// An acquired token from a jobserver. +/// +/// This token will be released back to the jobserver when it is dropped and +/// otherwise represents the ability to spawn off another thread of work. +#[derive(Debug)] +pub struct Acquired { + client: Arc, + data: imp::Acquired, + disabled: bool, +} + +impl Acquired { + /// This drops the `Acquired` token without releasing the associated token. + /// + /// This is not generally useful, but can be helpful if you do not have the + /// ability to store an Acquired token but need to not yet release it. + /// + /// You'll typically want to follow this up with a call to `release_raw` or + /// similar to actually release the token later on. + pub fn drop_without_releasing(mut self) { + self.disabled = true; + } +} + +#[derive(Default, Debug)] +struct HelperState { + lock: Mutex, + cvar: Condvar, +} + +#[derive(Default, Debug)] +struct HelperInner { + requests: usize, + producer_done: bool, + consumer_done: bool, +} + +impl Client { + /// Creates a new jobserver initialized with the given parallelism limit. + /// + /// A client to the jobserver created will be returned. This client will + /// allow at most `limit` tokens to be acquired from it in parallel. More + /// calls to `acquire` will cause the calling thread to block. + /// + /// Note that the created `Client` is not automatically inherited into + /// spawned child processes from this program. Manual usage of the + /// `configure` function is required for a child process to have access to a + /// job server. + /// + /// # Examples + /// + /// ``` + /// use jobserver::Client; + /// + /// let client = Client::new(4).expect("failed to create jobserver"); + /// ``` + /// + /// # Errors + /// + /// Returns an error if any I/O error happens when attempting to create the + /// jobserver client. + pub fn new(limit: usize) -> io::Result { + Ok(Client { + inner: Arc::new(imp::Client::new(limit)?), + }) + } + + /// Attempts to connect to the jobserver specified in this process's + /// environment. + /// + /// When the a `make` executable calls a child process it will configure the + /// environment of the child to ensure that it has handles to the jobserver + /// it's passing down. This function will attempt to look for these details + /// and connect to the jobserver. + /// + /// Note that the created `Client` is not automatically inherited into + /// spawned child processes from this program. Manual usage of the + /// `configure` function is required for a child process to have access to a + /// job server. + /// + /// # Return value + /// + /// If a jobserver was found in the environment and it looks correct then + /// `Some` of the connected client will be returned. If no jobserver was + /// found then `None` will be returned. + /// + /// Note that on Unix the `Client` returned **takes ownership of the file + /// descriptors specified in the environment**. Jobservers on Unix are + /// implemented with `pipe` file descriptors, and they're inherited from + /// parent processes. This `Client` returned takes ownership of the file + /// descriptors for this process and will close the file descriptors after + /// this value is dropped. + /// + /// Additionally on Unix this function will configure the file descriptors + /// with `CLOEXEC` so they're not automatically inherited by spawned + /// children. + /// + /// # Safety + /// + /// This function is `unsafe` to call on Unix specifically as it + /// transitively requires usage of the `from_raw_fd` function, which is + /// itself unsafe in some circumstances. + /// + /// It's recommended to call this function very early in the lifetime of a + /// program before any other file descriptors are opened. That way you can + /// make sure to take ownership properly of the file descriptors passed + /// down, if any. + /// + /// It's generally unsafe to call this function twice in a program if the + /// previous invocation returned `Some`. + /// + /// Note, though, that on Windows it should be safe to call this function + /// any number of times. + pub unsafe fn from_env() -> Option { + let var = match env::var("CARGO_MAKEFLAGS") + .or_else(|_| env::var("MAKEFLAGS")) + .or_else(|_| env::var("MFLAGS")) + { + Ok(s) => s, + Err(_) => return None, + }; + let mut arg = "--jobserver-fds="; + let pos = match var.find(arg) { + Some(i) => i, + None => { + arg = "--jobserver-auth="; + match var.find(arg) { + Some(i) => i, + None => return None, + } + } + }; + + let s = var[pos + arg.len()..].split(' ').next().unwrap(); + imp::Client::open(s).map(|c| Client { inner: Arc::new(c) }) + } + + /// Acquires a token from this jobserver client. + /// + /// This function will block the calling thread until a new token can be + /// acquired from the jobserver. + /// + /// # Return value + /// + /// On successful acquisition of a token an instance of `Acquired` is + /// returned. This structure, when dropped, will release the token back to + /// the jobserver. It's recommended to avoid leaking this value. + /// + /// # Errors + /// + /// If an I/O error happens while acquiring a token then this function will + /// return immediately with the error. If an error is returned then a token + /// was not acquired. + pub fn acquire(&self) -> io::Result { + let data = self.inner.acquire()?; + Ok(Acquired { + client: self.inner.clone(), + data, + disabled: false, + }) + } + + /// Returns amount of tokens in the read-side pipe. + /// + /// # Return value + /// + /// Number of bytes available to be read from the jobserver pipe + /// + /// # Errors + /// + /// Underlying errors from the ioctl will be passed up. + pub fn available(&self) -> io::Result { + self.inner.available() + } + + /// Configures a child process to have access to this client's jobserver as + /// well. + /// + /// This function is required to be called to ensure that a jobserver is + /// properly inherited to a child process. If this function is *not* called + /// then this `Client` will not be accessible in the child process. In other + /// words, if not called, then `Client::from_env` will return `None` in the + /// child process (or the equivalent of `Child::from_env` that `make` uses). + /// + /// ## Platform-specific behavior + /// + /// On Unix and Windows this will clobber the `CARGO_MAKEFLAGS` environment + /// variables for the child process, and on Unix this will also allow the + /// two file descriptors for this client to be inherited to the child. + /// + /// On platforms other than Unix and Windows this panics. + pub fn configure(&self, cmd: &mut Command) { + cmd.env("CARGO_MAKEFLAGS", &self.mflags_env()); + self.inner.configure(cmd); + } + + /// Configures a child process to have access to this client's jobserver as + /// well. + /// + /// This function is required to be called to ensure that a jobserver is + /// properly inherited to a child process. If this function is *not* called + /// then this `Client` will not be accessible in the child process. In other + /// words, if not called, then `Client::from_env` will return `None` in the + /// child process (or the equivalent of `Child::from_env` that `make` uses). + /// + /// ## Platform-specific behavior + /// + /// On Unix and Windows this will clobber the `CARGO_MAKEFLAGS`, + /// `MAKEFLAGS` and `MFLAGS` environment variables for the child process, + /// and on Unix this will also allow the two file descriptors for + /// this client to be inherited to the child. + /// + /// On platforms other than Unix and Windows this panics. + pub fn configure_make(&self, cmd: &mut Command) { + let value = self.mflags_env(); + cmd.env("CARGO_MAKEFLAGS", &value); + cmd.env("MAKEFLAGS", &value); + cmd.env("MFLAGS", &value); + self.inner.configure(cmd); + } + + fn mflags_env(&self) -> String { + let arg = self.inner.string_arg(); + // Older implementations of make use `--jobserver-fds` and newer + // implementations use `--jobserver-auth`, pass both to try to catch + // both implementations. + format!("-j --jobserver-fds={0} --jobserver-auth={0}", arg) + } + + /// Converts this `Client` into a helper thread to deal with a blocking + /// `acquire` function a little more easily. + /// + /// The fact that the `acquire` function on `Client` blocks isn't always + /// the easiest to work with. Typically you're using a jobserver to + /// manage running other events in parallel! This means that you need to + /// either (a) wait for an existing job to finish or (b) wait for a + /// new token to become available. + /// + /// Unfortunately the blocking in `acquire` happens at the implementation + /// layer of jobservers. On Unix this requires a blocking call to `read` + /// and on Windows this requires one of the `WaitFor*` functions. Both + /// of these situations aren't the easiest to deal with: + /// + /// * On Unix there's basically only one way to wake up a `read` early, and + /// that's through a signal. This is what the `make` implementation + /// itself uses, relying on `SIGCHLD` to wake up a blocking acquisition + /// of a new job token. Unfortunately nonblocking I/O is not an option + /// here, so it means that "waiting for one of two events" means that + /// the latter event must generate a signal! This is not always the case + /// on unix for all jobservers. + /// + /// * On Windows you'd have to basically use the `WaitForMultipleObjects` + /// which means that you've got to canonicalize all your event sources + /// into a `HANDLE` which also isn't the easiest thing to do + /// unfortunately. + /// + /// This function essentially attempts to ease these limitations by + /// converting this `Client` into a helper thread spawned into this + /// process. The application can then request that the helper thread + /// acquires tokens and the provided closure will be invoked for each token + /// acquired. + /// + /// The intention is that this function can be used to translate the event + /// of a token acquisition into an arbitrary user-defined event. + /// + /// # Arguments + /// + /// This function will consume the `Client` provided to be transferred to + /// the helper thread that is spawned. Additionally a closure `f` is + /// provided to be invoked whenever a token is acquired. + /// + /// This closure is only invoked after calls to + /// `HelperThread::request_token` have been made and a token itself has + /// been acquired. If an error happens while acquiring the token then + /// an error will be yielded to the closure as well. + /// + /// # Return Value + /// + /// This function will return an instance of the `HelperThread` structure + /// which is used to manage the helper thread associated with this client. + /// Through the `HelperThread` you'll request that tokens are acquired. + /// When acquired, the closure provided here is invoked. + /// + /// When the `HelperThread` structure is returned it will be gracefully + /// torn down, and the calling thread will be blocked until the thread is + /// torn down (which should be prompt). + /// + /// # Errors + /// + /// This function may fail due to creation of the helper thread or + /// auxiliary I/O objects to manage the helper thread. In any of these + /// situations the error is propagated upwards. + /// + /// # Platform-specific behavior + /// + /// On Windows this function behaves pretty normally as expected, but on + /// Unix the implementation is... a little heinous. As mentioned above + /// we're forced into blocking I/O for token acquisition, namely a blocking + /// call to `read`. We must be able to unblock this, however, to tear down + /// the helper thread gracefully! + /// + /// Essentially what happens is that we'll send a signal to the helper + /// thread spawned and rely on `EINTR` being returned to wake up the helper + /// thread. This involves installing a global `SIGUSR1` handler that does + /// nothing along with sending signals to that thread. This may cause + /// odd behavior in some applications, so it's recommended to review and + /// test thoroughly before using this. + pub fn into_helper_thread(self, f: F) -> io::Result + where + F: FnMut(io::Result) + Send + 'static, + { + let state = Arc::new(HelperState::default()); + Ok(HelperThread { + inner: Some(imp::spawn_helper(self, state.clone(), Box::new(f))?), + state, + }) + } + + /// Blocks the current thread until a token is acquired. + /// + /// This is the same as `acquire`, except that it doesn't return an RAII + /// helper. If successful the process will need to guarantee that + /// `release_raw` is called in the future. + pub fn acquire_raw(&self) -> io::Result<()> { + self.inner.acquire()?; + Ok(()) + } + + /// Releases a jobserver token back to the original jobserver. + /// + /// This is intended to be paired with `acquire_raw` if it was called, but + /// in some situations it could also be called to relinquish a process's + /// implicit token temporarily which is then re-acquired later. + pub fn release_raw(&self) -> io::Result<()> { + self.inner.release(None)?; + Ok(()) + } +} + +impl Drop for Acquired { + fn drop(&mut self) { + if !self.disabled { + drop(self.client.release(Some(&self.data))); + } + } +} + +/// Structure returned from `Client::into_helper_thread` to manage the lifetime +/// of the helper thread returned, see those associated docs for more info. +#[derive(Debug)] +pub struct HelperThread { + inner: Option, + state: Arc, +} + +impl HelperThread { + /// Request that the helper thread acquires a token, eventually calling the + /// original closure with a token when it's available. + /// + /// For more information, see the docs on that function. + pub fn request_token(&self) { + // Indicate that there's one more request for a token and then wake up + // the helper thread if it's sleeping. + self.state.lock().requests += 1; + self.state.cvar.notify_one(); + } +} + +impl Drop for HelperThread { + fn drop(&mut self) { + // Flag that the producer half is done so the helper thread should exit + // quickly if it's waiting. Wake it up if it's actually waiting + self.state.lock().producer_done = true; + self.state.cvar.notify_one(); + + // ... and afterwards perform any thread cleanup logic + self.inner.take().unwrap().join(); + } +} + +impl HelperState { + fn lock(&self) -> MutexGuard<'_, HelperInner> { + self.lock.lock().unwrap_or_else(|e| e.into_inner()) + } + + /// Executes `f` for each request for a token, where `f` is expected to + /// block and then provide the original closure with a token once it's + /// acquired. + /// + /// This is an infinite loop until the helper thread is dropped, at which + /// point everything should get interrupted. + fn for_each_request(&self, mut f: impl FnMut(&HelperState)) { + let mut lock = self.lock(); + + // We only execute while we could receive requests, but as soon as + // that's `false` we're out of here. + while !lock.producer_done { + // If no one's requested a token then we wait for someone to + // request a token. + if lock.requests == 0 { + lock = self.cvar.wait(lock).unwrap_or_else(|e| e.into_inner()); + continue; + } + + // Consume the request for a token, and then actually acquire a + // token after unlocking our lock (not that acquisition happens in + // `f`). This ensures that we don't actually hold the lock if we + // wait for a long time for a token. + lock.requests -= 1; + drop(lock); + f(self); + lock = self.lock(); + } + lock.consumer_done = true; + self.cvar.notify_one(); + } + + fn producer_done(&self) -> bool { + self.lock().producer_done + } +} + +#[test] +fn no_helper_deadlock() { + let x = crate::Client::new(32).unwrap(); + let _y = x.clone(); + std::mem::drop(x.into_helper_thread(|_| {}).unwrap()); +} diff -Nru temporalio-1.3.0/vendor/jobserver/src/unix.rs temporalio-1.3.0/vendor/jobserver/src/unix.rs --- temporalio-1.3.0/vendor/jobserver/src/unix.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/jobserver/src/unix.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,477 +1,431 @@ -use libc::c_int; - -use crate::FromEnvErrorInner; -use std::fs::{File, OpenOptions}; -use std::io::{self, Read, Write}; -use std::mem; -use std::mem::MaybeUninit; -use std::os::unix::prelude::*; -use std::path::{Path, PathBuf}; -use std::process::Command; -use std::ptr; -use std::sync::{Arc, Once}; -use std::thread::{self, Builder, JoinHandle}; -use std::time::Duration; - -#[derive(Debug)] -pub enum Client { - /// `--jobserver-auth=R,W` - Pipe { read: File, write: File }, - /// `--jobserver-auth=fifo:PATH` - Fifo { file: File, path: PathBuf }, -} - -#[derive(Debug)] -pub struct Acquired { - byte: u8, -} - -impl Client { - pub fn new(mut limit: usize) -> io::Result { - let client = unsafe { Client::mk()? }; - - // I don't think the character written here matters, but I could be - // wrong! - const BUFFER: [u8; 128] = [b'|'; 128]; - - let mut write = client.write(); - - set_nonblocking(write.as_raw_fd(), true)?; - - while limit > 0 { - let n = limit.min(BUFFER.len()); - - write.write_all(&BUFFER[..n])?; - limit -= n; - } - - set_nonblocking(write.as_raw_fd(), false)?; - - Ok(client) - } - - unsafe fn mk() -> io::Result { - let mut pipes = [0; 2]; - - // Attempt atomically-create-with-cloexec if we can on Linux, - // detected by using the `syscall` function in `libc` to try to work - // with as many kernels/glibc implementations as possible. - #[cfg(target_os = "linux")] - { - use std::sync::atomic::{AtomicBool, Ordering}; - - static PIPE2_AVAILABLE: AtomicBool = AtomicBool::new(true); - if PIPE2_AVAILABLE.load(Ordering::SeqCst) { - match libc::syscall(libc::SYS_pipe2, pipes.as_mut_ptr(), libc::O_CLOEXEC) { - -1 => { - let err = io::Error::last_os_error(); - if err.raw_os_error() == Some(libc::ENOSYS) { - PIPE2_AVAILABLE.store(false, Ordering::SeqCst); - } else { - return Err(err); - } - } - _ => return Ok(Client::from_fds(pipes[0], pipes[1])), - } - } - } - - cvt(libc::pipe(pipes.as_mut_ptr()))?; - drop(set_cloexec(pipes[0], true)); - drop(set_cloexec(pipes[1], true)); - Ok(Client::from_fds(pipes[0], pipes[1])) - } - - pub(crate) unsafe fn open(s: &str, check_pipe: bool) -> Result { - if let Some(client) = Self::from_fifo(s)? { - return Ok(client); - } - if let Some(client) = Self::from_pipe(s, check_pipe)? { - return Ok(client); - } - Err(FromEnvErrorInner::CannotParse(format!( - "expected `fifo:PATH` or `R,W`, found `{s}`" - ))) - } - - /// `--jobserver-auth=fifo:PATH` - fn from_fifo(s: &str) -> Result, FromEnvErrorInner> { - let mut parts = s.splitn(2, ':'); - if parts.next().unwrap() != "fifo" { - return Ok(None); - } - let path_str = parts.next().ok_or_else(|| { - FromEnvErrorInner::CannotParse("expected a path after `fifo:`".to_string()) - })?; - let path = Path::new(path_str); - let file = OpenOptions::new() - .read(true) - .write(true) - .open(path) - .map_err(|err| FromEnvErrorInner::CannotOpenPath(path_str.to_string(), err))?; - Ok(Some(Client::Fifo { - file, - path: path.into(), - })) - } - - /// `--jobserver-auth=R,W` - unsafe fn from_pipe(s: &str, check_pipe: bool) -> Result, FromEnvErrorInner> { - let mut parts = s.splitn(2, ','); - let read = parts.next().unwrap(); - let write = match parts.next() { - Some(w) => w, - None => return Ok(None), - }; - let read = read - .parse() - .map_err(|e| FromEnvErrorInner::CannotParse(format!("cannot parse `read` fd: {e}")))?; - let write = write - .parse() - .map_err(|e| FromEnvErrorInner::CannotParse(format!("cannot parse `write` fd: {e}")))?; - - // Ok so we've got two integers that look like file descriptors, but - // for extra sanity checking let's see if they actually look like - // valid files and instances of a pipe if feature enabled before we - // return the client. - // - // If we're called from `make` *without* the leading + on our rule - // then we'll have `MAKEFLAGS` env vars but won't actually have - // access to the file descriptors. - // - // `NotAPipe` is a worse error, return it if it's reported for any of the two fds. - match (fd_check(read, check_pipe), fd_check(write, check_pipe)) { - (read_err @ Err(FromEnvErrorInner::NotAPipe(..)), _) => read_err?, - (_, write_err @ Err(FromEnvErrorInner::NotAPipe(..))) => write_err?, - (read_err, write_err) => { - read_err?; - write_err?; - } - } - - drop(set_cloexec(read, true)); - drop(set_cloexec(write, true)); - Ok(Some(Client::from_fds(read, write))) - } - - unsafe fn from_fds(read: c_int, write: c_int) -> Client { - Client::Pipe { - read: File::from_raw_fd(read), - write: File::from_raw_fd(write), - } - } - - /// Gets the read end of our jobserver client. - fn read(&self) -> &File { - match self { - Client::Pipe { read, .. } => read, - Client::Fifo { file, .. } => file, - } - } - - /// Gets the write end of our jobserver client. - fn write(&self) -> &File { - match self { - Client::Pipe { write, .. } => write, - Client::Fifo { file, .. } => file, - } - } - - pub fn acquire(&self) -> io::Result { - // Ignore interrupts and keep trying if that happens - loop { - if let Some(token) = self.acquire_allow_interrupts()? { - return Ok(token); - } - } - } - - /// Block waiting for a token, returning `None` if we're interrupted with - /// EINTR. - fn acquire_allow_interrupts(&self) -> io::Result> { - // We don't actually know if the file descriptor here is set in - // blocking or nonblocking mode. AFAIK all released versions of - // `make` use blocking fds for the jobserver, but the unreleased - // version of `make` doesn't. In the unreleased version jobserver - // fds are set to nonblocking and combined with `pselect` - // internally. - // - // Here we try to be compatible with both strategies. We optimistically - // try to read from the file descriptor which then may block, return - // a token or indicate that polling is needed. - // Blocking reads (if possible) allows the kernel to be more selective - // about which readers to wake up when a token is written to the pipe. - // - // We use `poll` here to block this thread waiting for read - // readiness, and then afterwards we perform the `read` itself. If - // the `read` returns that it would block then we start over and try - // again. - // - // Also note that we explicitly don't handle EINTR here. That's used - // to shut us down, so we otherwise punt all errors upwards. - unsafe { - let mut fd: libc::pollfd = mem::zeroed(); - let mut read = self.read(); - fd.fd = read.as_raw_fd(); - fd.events = libc::POLLIN; - loop { - let mut buf = [0]; - match read.read(&mut buf) { - Ok(1) => return Ok(Some(Acquired { byte: buf[0] })), - Ok(_) => { - return Err(io::Error::new( - io::ErrorKind::Other, - "early EOF on jobserver pipe", - )); - } - Err(e) => match e.kind() { - io::ErrorKind::WouldBlock => { /* fall through to polling */ } - io::ErrorKind::Interrupted => return Ok(None), - _ => return Err(e), - }, - } - - loop { - fd.revents = 0; - if libc::poll(&mut fd, 1, -1) == -1 { - let e = io::Error::last_os_error(); - return match e.kind() { - io::ErrorKind::Interrupted => Ok(None), - _ => Err(e), - }; - } - if fd.revents != 0 { - break; - } - } - } - } - } - - pub fn release(&self, data: Option<&Acquired>) -> io::Result<()> { - // Note that the fd may be nonblocking but we're going to go ahead - // and assume that the writes here are always nonblocking (we can - // always quickly release a token). If that turns out to not be the - // case we'll get an error anyway! - let byte = data.map(|d| d.byte).unwrap_or(b'+'); - match self.write().write(&[byte])? { - 1 => Ok(()), - _ => Err(io::Error::new( - io::ErrorKind::Other, - "failed to write token back to jobserver", - )), - } - } - - pub fn string_arg(&self) -> String { - match self { - Client::Pipe { read, write } => format!("{},{}", read.as_raw_fd(), write.as_raw_fd()), - Client::Fifo { path, .. } => format!("fifo:{}", path.to_str().unwrap()), - } - } - - pub fn available(&self) -> io::Result { - let mut len = MaybeUninit::::uninit(); - cvt(unsafe { libc::ioctl(self.read().as_raw_fd(), libc::FIONREAD, len.as_mut_ptr()) })?; - Ok(unsafe { len.assume_init() } as usize) - } - - pub fn configure(&self, cmd: &mut Command) { - match self { - // We `File::open`ed it when inheriting from environment, - // so no need to set cloexec for fifo. - Client::Fifo { .. } => return, - Client::Pipe { .. } => {} - }; - // Here we basically just want to say that in the child process - // we'll configure the read/write file descriptors to *not* be - // cloexec, so they're inherited across the exec and specified as - // integers through `string_arg` above. - let read = self.read().as_raw_fd(); - let write = self.write().as_raw_fd(); - unsafe { - cmd.pre_exec(move || { - set_cloexec(read, false)?; - set_cloexec(write, false)?; - Ok(()) - }); - } - } -} - -#[derive(Debug)] -pub struct Helper { - thread: JoinHandle<()>, - state: Arc, -} - -pub(crate) fn spawn_helper( - client: crate::Client, - state: Arc, - mut f: Box) + Send>, -) -> io::Result { - static USR1_INIT: Once = Once::new(); - let mut err = None; - USR1_INIT.call_once(|| unsafe { - let mut new: libc::sigaction = mem::zeroed(); - #[cfg(target_os = "aix")] - { - new.sa_union.__su_sigaction = sigusr1_handler; - } - #[cfg(not(target_os = "aix"))] - { - new.sa_sigaction = sigusr1_handler as usize; - } - new.sa_flags = libc::SA_SIGINFO as _; - if libc::sigaction(libc::SIGUSR1, &new, ptr::null_mut()) != 0 { - err = Some(io::Error::last_os_error()); - } - }); - - if let Some(e) = err.take() { - return Err(e); - } - - let state2 = state.clone(); - let thread = Builder::new().spawn(move || { - state2.for_each_request(|helper| loop { - match client.inner.acquire_allow_interrupts() { - Ok(Some(data)) => { - break f(Ok(crate::Acquired { - client: client.inner.clone(), - data, - disabled: false, - })); - } - Err(e) => break f(Err(e)), - Ok(None) if helper.producer_done() => break, - Ok(None) => {} - } - }); - })?; - - Ok(Helper { thread, state }) -} - -impl Helper { - pub fn join(self) { - let dur = Duration::from_millis(10); - let mut state = self.state.lock(); - debug_assert!(state.producer_done); - - // We need to join our helper thread, and it could be blocked in one - // of two locations. First is the wait for a request, but the - // initial drop of `HelperState` will take care of that. Otherwise - // it may be blocked in `client.acquire()`. We actually have no way - // of interrupting that, so resort to `pthread_kill` as a fallback. - // This signal should interrupt any blocking `read` call with - // `io::ErrorKind::Interrupt` and cause the thread to cleanly exit. - // - // Note that we don't do this forever though since there's a chance - // of bugs, so only do this opportunistically to make a best effort - // at clearing ourselves up. - for _ in 0..100 { - if state.consumer_done { - break; - } - unsafe { - // Ignore the return value here of `pthread_kill`, - // apparently on OSX if you kill a dead thread it will - // return an error, but on other platforms it may not. In - // that sense we don't actually know if this will succeed or - // not! - libc::pthread_kill(self.thread.as_pthread_t() as _, libc::SIGUSR1); - } - state = self - .state - .cvar - .wait_timeout(state, dur) - .unwrap_or_else(|e| e.into_inner()) - .0; - thread::yield_now(); // we really want the other thread to run - } - - // If we managed to actually see the consumer get done, then we can - // definitely wait for the thread. Otherwise it's... off in the ether - // I guess? - if state.consumer_done { - drop(self.thread.join()); - } - } -} - -unsafe fn fcntl_check(fd: c_int) -> Result<(), FromEnvErrorInner> { - match libc::fcntl(fd, libc::F_GETFD) { - -1 => Err(FromEnvErrorInner::CannotOpenFd( - fd, - io::Error::last_os_error(), - )), - _ => Ok(()), - } -} - -unsafe fn fd_check(fd: c_int, check_pipe: bool) -> Result<(), FromEnvErrorInner> { - if check_pipe { - let mut stat = mem::zeroed(); - if libc::fstat(fd, &mut stat) == -1 { - let last_os_error = io::Error::last_os_error(); - fcntl_check(fd)?; - Err(FromEnvErrorInner::NotAPipe(fd, Some(last_os_error))) - } else { - // On android arm and i686 mode_t is u16 and st_mode is u32, - // this generates a type mismatch when S_IFIFO (declared as mode_t) - // is used in operations with st_mode, so we use this workaround - // to get the value of S_IFIFO with the same type of st_mode. - #[allow(unused_assignments)] - let mut s_ififo = stat.st_mode; - s_ififo = libc::S_IFIFO as _; - if stat.st_mode & s_ififo == s_ififo { - return Ok(()); - } - Err(FromEnvErrorInner::NotAPipe(fd, None)) - } - } else { - fcntl_check(fd) - } -} - -fn set_cloexec(fd: c_int, set: bool) -> io::Result<()> { - unsafe { - let previous = cvt(libc::fcntl(fd, libc::F_GETFD))?; - let new = if set { - previous | libc::FD_CLOEXEC - } else { - previous & !libc::FD_CLOEXEC - }; - if new != previous { - cvt(libc::fcntl(fd, libc::F_SETFD, new))?; - } - Ok(()) - } -} - -fn set_nonblocking(fd: c_int, set: bool) -> io::Result<()> { - let status_flag = if set { libc::O_NONBLOCK } else { 0 }; - - unsafe { - cvt(libc::fcntl(fd, libc::F_SETFL, status_flag))?; - } - - Ok(()) -} - -fn cvt(t: c_int) -> io::Result { - if t == -1 { - Err(io::Error::last_os_error()) - } else { - Ok(t) - } -} - -extern "C" fn sigusr1_handler( - _signum: c_int, - _info: *mut libc::siginfo_t, - _ptr: *mut libc::c_void, -) { - // nothing to do -} +use libc::c_int; + +use std::fs::{File, OpenOptions}; +use std::io::{self, Read, Write}; +use std::mem; +use std::mem::MaybeUninit; +use std::os::unix::prelude::*; +use std::path::{Path, PathBuf}; +use std::process::Command; +use std::ptr; +use std::sync::{Arc, Once}; +use std::thread::{self, Builder, JoinHandle}; +use std::time::Duration; + +#[derive(Debug)] +pub enum Client { + /// `--jobserver-auth=R,W` + Pipe { read: File, write: File }, + /// `--jobserver-auth=fifo:PATH` + Fifo { file: File, path: PathBuf }, +} + +#[derive(Debug)] +pub struct Acquired { + byte: u8, +} + +impl Client { + pub fn new(mut limit: usize) -> io::Result { + let client = unsafe { Client::mk()? }; + + // I don't think the character written here matters, but I could be + // wrong! + const BUFFER: [u8; 128] = [b'|'; 128]; + + let mut write = client.write(); + + set_nonblocking(write.as_raw_fd(), true)?; + + while limit > 0 { + let n = limit.min(BUFFER.len()); + + write.write_all(&BUFFER[..n])?; + limit -= n; + } + + set_nonblocking(write.as_raw_fd(), false)?; + + Ok(client) + } + + unsafe fn mk() -> io::Result { + let mut pipes = [0; 2]; + + // Attempt atomically-create-with-cloexec if we can on Linux, + // detected by using the `syscall` function in `libc` to try to work + // with as many kernels/glibc implementations as possible. + #[cfg(target_os = "linux")] + { + use std::sync::atomic::{AtomicBool, Ordering}; + + static PIPE2_AVAILABLE: AtomicBool = AtomicBool::new(true); + if PIPE2_AVAILABLE.load(Ordering::SeqCst) { + match libc::syscall(libc::SYS_pipe2, pipes.as_mut_ptr(), libc::O_CLOEXEC) { + -1 => { + let err = io::Error::last_os_error(); + if err.raw_os_error() == Some(libc::ENOSYS) { + PIPE2_AVAILABLE.store(false, Ordering::SeqCst); + } else { + return Err(err); + } + } + _ => return Ok(Client::from_fds(pipes[0], pipes[1])), + } + } + } + + cvt(libc::pipe(pipes.as_mut_ptr()))?; + drop(set_cloexec(pipes[0], true)); + drop(set_cloexec(pipes[1], true)); + Ok(Client::from_fds(pipes[0], pipes[1])) + } + + pub unsafe fn open(s: &str) -> Option { + Client::from_fifo(s).or_else(|| Client::from_pipe(s)) + } + + /// `--jobserver-auth=fifo:PATH` + fn from_fifo(s: &str) -> Option { + let mut parts = s.splitn(2, ':'); + if parts.next().unwrap() != "fifo" { + return None; + } + let path = match parts.next() { + Some(p) => Path::new(p), + None => return None, + }; + let file = match OpenOptions::new().read(true).write(true).open(path) { + Ok(f) => f, + Err(_) => return None, + }; + Some(Client::Fifo { + file, + path: path.into(), + }) + } + + /// `--jobserver-auth=R,W` + unsafe fn from_pipe(s: &str) -> Option { + let mut parts = s.splitn(2, ','); + let read = parts.next().unwrap(); + let write = match parts.next() { + Some(s) => s, + None => return None, + }; + + let read = match read.parse() { + Ok(n) => n, + Err(_) => return None, + }; + let write = match write.parse() { + Ok(n) => n, + Err(_) => return None, + }; + + // Ok so we've got two integers that look like file descriptors, but + // for extra sanity checking let's see if they actually look like + // instances of a pipe before we return the client. + // + // If we're called from `make` *without* the leading + on our rule + // then we'll have `MAKEFLAGS` env vars but won't actually have + // access to the file descriptors. + if is_valid_fd(read) && is_valid_fd(write) { + drop(set_cloexec(read, true)); + drop(set_cloexec(write, true)); + Some(Client::from_fds(read, write)) + } else { + None + } + } + + unsafe fn from_fds(read: c_int, write: c_int) -> Client { + Client::Pipe { + read: File::from_raw_fd(read), + write: File::from_raw_fd(write), + } + } + + /// Gets the read end of our jobserver client. + fn read(&self) -> &File { + match self { + Client::Pipe { read, .. } => read, + Client::Fifo { file, .. } => file, + } + } + + /// Gets the write end of our jobserver client. + fn write(&self) -> &File { + match self { + Client::Pipe { write, .. } => write, + Client::Fifo { file, .. } => file, + } + } + + pub fn acquire(&self) -> io::Result { + // Ignore interrupts and keep trying if that happens + loop { + if let Some(token) = self.acquire_allow_interrupts()? { + return Ok(token); + } + } + } + + /// Block waiting for a token, returning `None` if we're interrupted with + /// EINTR. + fn acquire_allow_interrupts(&self) -> io::Result> { + // We don't actually know if the file descriptor here is set in + // blocking or nonblocking mode. AFAIK all released versions of + // `make` use blocking fds for the jobserver, but the unreleased + // version of `make` doesn't. In the unreleased version jobserver + // fds are set to nonblocking and combined with `pselect` + // internally. + // + // Here we try to be compatible with both strategies. We optimistically + // try to read from the file descriptor which then may block, return + // a token or indicate that polling is needed. + // Blocking reads (if possible) allows the kernel to be more selective + // about which readers to wake up when a token is written to the pipe. + // + // We use `poll` here to block this thread waiting for read + // readiness, and then afterwards we perform the `read` itself. If + // the `read` returns that it would block then we start over and try + // again. + // + // Also note that we explicitly don't handle EINTR here. That's used + // to shut us down, so we otherwise punt all errors upwards. + unsafe { + let mut fd: libc::pollfd = mem::zeroed(); + let mut read = self.read(); + fd.fd = read.as_raw_fd(); + fd.events = libc::POLLIN; + loop { + let mut buf = [0]; + match read.read(&mut buf) { + Ok(1) => return Ok(Some(Acquired { byte: buf[0] })), + Ok(_) => { + return Err(io::Error::new( + io::ErrorKind::Other, + "early EOF on jobserver pipe", + )) + } + Err(e) => match e.kind() { + io::ErrorKind::WouldBlock => { /* fall through to polling */ } + io::ErrorKind::Interrupted => return Ok(None), + _ => return Err(e), + }, + } + + loop { + fd.revents = 0; + if libc::poll(&mut fd, 1, -1) == -1 { + let e = io::Error::last_os_error(); + return match e.kind() { + io::ErrorKind::Interrupted => Ok(None), + _ => Err(e), + }; + } + if fd.revents != 0 { + break; + } + } + } + } + } + + pub fn release(&self, data: Option<&Acquired>) -> io::Result<()> { + // Note that the fd may be nonblocking but we're going to go ahead + // and assume that the writes here are always nonblocking (we can + // always quickly release a token). If that turns out to not be the + // case we'll get an error anyway! + let byte = data.map(|d| d.byte).unwrap_or(b'+'); + match self.write().write(&[byte])? { + 1 => Ok(()), + _ => Err(io::Error::new( + io::ErrorKind::Other, + "failed to write token back to jobserver", + )), + } + } + + pub fn string_arg(&self) -> String { + match self { + Client::Pipe { read, write } => format!("{},{}", read.as_raw_fd(), write.as_raw_fd()), + Client::Fifo { path, .. } => format!("fifo:{}", path.to_str().unwrap()), + } + } + + pub fn available(&self) -> io::Result { + let mut len = MaybeUninit::::uninit(); + cvt(unsafe { libc::ioctl(self.read().as_raw_fd(), libc::FIONREAD, len.as_mut_ptr()) })?; + Ok(unsafe { len.assume_init() } as usize) + } + + pub fn configure(&self, cmd: &mut Command) { + match self { + // We `File::open`ed it when inheriting from environment, + // so no need to set cloexec for fifo. + Client::Fifo { .. } => return, + Client::Pipe { .. } => {} + }; + // Here we basically just want to say that in the child process + // we'll configure the read/write file descriptors to *not* be + // cloexec, so they're inherited across the exec and specified as + // integers through `string_arg` above. + let read = self.read().as_raw_fd(); + let write = self.write().as_raw_fd(); + unsafe { + cmd.pre_exec(move || { + set_cloexec(read, false)?; + set_cloexec(write, false)?; + Ok(()) + }); + } + } +} + +#[derive(Debug)] +pub struct Helper { + thread: JoinHandle<()>, + state: Arc, +} + +pub(crate) fn spawn_helper( + client: crate::Client, + state: Arc, + mut f: Box) + Send>, +) -> io::Result { + static USR1_INIT: Once = Once::new(); + let mut err = None; + USR1_INIT.call_once(|| unsafe { + let mut new: libc::sigaction = mem::zeroed(); + #[cfg(target_os = "aix")] + { + new.sa_union.__su_sigaction = sigusr1_handler; + } + #[cfg(not(target_os = "aix"))] + { + new.sa_sigaction = sigusr1_handler as usize; + } + new.sa_flags = libc::SA_SIGINFO as _; + if libc::sigaction(libc::SIGUSR1, &new, ptr::null_mut()) != 0 { + err = Some(io::Error::last_os_error()); + } + }); + + if let Some(e) = err.take() { + return Err(e); + } + + let state2 = state.clone(); + let thread = Builder::new().spawn(move || { + state2.for_each_request(|helper| loop { + match client.inner.acquire_allow_interrupts() { + Ok(Some(data)) => { + break f(Ok(crate::Acquired { + client: client.inner.clone(), + data, + disabled: false, + })) + } + Err(e) => break f(Err(e)), + Ok(None) if helper.producer_done() => break, + Ok(None) => {} + } + }); + })?; + + Ok(Helper { thread, state }) +} + +impl Helper { + pub fn join(self) { + let dur = Duration::from_millis(10); + let mut state = self.state.lock(); + debug_assert!(state.producer_done); + + // We need to join our helper thread, and it could be blocked in one + // of two locations. First is the wait for a request, but the + // initial drop of `HelperState` will take care of that. Otherwise + // it may be blocked in `client.acquire()`. We actually have no way + // of interrupting that, so resort to `pthread_kill` as a fallback. + // This signal should interrupt any blocking `read` call with + // `io::ErrorKind::Interrupt` and cause the thread to cleanly exit. + // + // Note that we don't do this forever though since there's a chance + // of bugs, so only do this opportunistically to make a best effort + // at clearing ourselves up. + for _ in 0..100 { + if state.consumer_done { + break; + } + unsafe { + // Ignore the return value here of `pthread_kill`, + // apparently on OSX if you kill a dead thread it will + // return an error, but on other platforms it may not. In + // that sense we don't actually know if this will succeed or + // not! + libc::pthread_kill(self.thread.as_pthread_t() as _, libc::SIGUSR1); + } + state = self + .state + .cvar + .wait_timeout(state, dur) + .unwrap_or_else(|e| e.into_inner()) + .0; + thread::yield_now(); // we really want the other thread to run + } + + // If we managed to actually see the consumer get done, then we can + // definitely wait for the thread. Otherwise it's... off in the ether + // I guess? + if state.consumer_done { + drop(self.thread.join()); + } + } +} + +fn is_valid_fd(fd: c_int) -> bool { + unsafe { libc::fcntl(fd, libc::F_GETFD) != -1 } +} + +fn set_cloexec(fd: c_int, set: bool) -> io::Result<()> { + unsafe { + let previous = cvt(libc::fcntl(fd, libc::F_GETFD))?; + let new = if set { + previous | libc::FD_CLOEXEC + } else { + previous & !libc::FD_CLOEXEC + }; + if new != previous { + cvt(libc::fcntl(fd, libc::F_SETFD, new))?; + } + Ok(()) + } +} + +fn set_nonblocking(fd: c_int, set: bool) -> io::Result<()> { + let status_flag = if set { libc::O_NONBLOCK } else { 0 }; + + unsafe { + cvt(libc::fcntl(fd, libc::F_SETFL, status_flag))?; + } + + Ok(()) +} + +fn cvt(t: c_int) -> io::Result { + if t == -1 { + Err(io::Error::last_os_error()) + } else { + Ok(t) + } +} + +extern "C" fn sigusr1_handler( + _signum: c_int, + _info: *mut libc::siginfo_t, + _ptr: *mut libc::c_void, +) { + // nothing to do +} diff -Nru temporalio-1.3.0/vendor/jobserver/src/wasm.rs temporalio-1.3.0/vendor/jobserver/src/wasm.rs --- temporalio-1.3.0/vendor/jobserver/src/wasm.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/jobserver/src/wasm.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,96 +1,95 @@ -use crate::FromEnvErrorInner; -use std::io; -use std::process::Command; -use std::sync::{Arc, Condvar, Mutex}; -use std::thread::{Builder, JoinHandle}; - -#[derive(Debug)] -pub struct Client { - inner: Arc, -} - -#[derive(Debug)] -struct Inner { - count: Mutex, - cvar: Condvar, -} - -#[derive(Debug)] -pub struct Acquired(()); - -impl Client { - pub fn new(limit: usize) -> io::Result { - Ok(Client { - inner: Arc::new(Inner { - count: Mutex::new(limit), - cvar: Condvar::new(), - }), - }) - } - - pub(crate) unsafe fn open(_s: &str, _check_pipe: bool) -> Result { - Err(FromEnvErrorInner::Unsupported) - } - - pub fn acquire(&self) -> io::Result { - let mut lock = self.inner.count.lock().unwrap_or_else(|e| e.into_inner()); - while *lock == 0 { - lock = self - .inner - .cvar - .wait(lock) - .unwrap_or_else(|e| e.into_inner()); - } - *lock -= 1; - Ok(Acquired(())) - } - - pub fn release(&self, _data: Option<&Acquired>) -> io::Result<()> { - let mut lock = self.inner.count.lock().unwrap_or_else(|e| e.into_inner()); - *lock += 1; - drop(lock); - self.inner.cvar.notify_one(); - Ok(()) - } - - pub fn string_arg(&self) -> String { - panic!( - "On this platform there is no cross process jobserver support, - so Client::configure is not supported." - ); - } - - pub fn available(&self) -> io::Result { - let lock = self.inner.count.lock().unwrap_or_else(|e| e.into_inner()); - Ok(*lock) - } - - pub fn configure(&self, _cmd: &mut Command) { - unreachable!(); - } -} - -#[derive(Debug)] -pub struct Helper { - thread: JoinHandle<()>, -} - -pub(crate) fn spawn_helper( - client: crate::Client, - state: Arc, - mut f: Box) + Send>, -) -> io::Result { - let thread = Builder::new().spawn(move || { - state.for_each_request(|_| f(client.acquire())); - })?; - - Ok(Helper { thread: thread }) -} - -impl Helper { - pub fn join(self) { - // TODO: this is not correct if the thread is blocked in - // `client.acquire()`. - drop(self.thread.join()); - } -} +use std::io; +use std::process::Command; +use std::sync::{Arc, Condvar, Mutex}; +use std::thread::{Builder, JoinHandle}; + +#[derive(Debug)] +pub struct Client { + inner: Arc, +} + +#[derive(Debug)] +struct Inner { + count: Mutex, + cvar: Condvar, +} + +#[derive(Debug)] +pub struct Acquired(()); + +impl Client { + pub fn new(limit: usize) -> io::Result { + Ok(Client { + inner: Arc::new(Inner { + count: Mutex::new(limit), + cvar: Condvar::new(), + }), + }) + } + + pub unsafe fn open(_s: &str) -> Option { + None + } + + pub fn acquire(&self) -> io::Result { + let mut lock = self.inner.count.lock().unwrap_or_else(|e| e.into_inner()); + while *lock == 0 { + lock = self + .inner + .cvar + .wait(lock) + .unwrap_or_else(|e| e.into_inner()); + } + *lock -= 1; + Ok(Acquired(())) + } + + pub fn release(&self, _data: Option<&Acquired>) -> io::Result<()> { + let mut lock = self.inner.count.lock().unwrap_or_else(|e| e.into_inner()); + *lock += 1; + drop(lock); + self.inner.cvar.notify_one(); + Ok(()) + } + + pub fn string_arg(&self) -> String { + panic!( + "On this platform there is no cross process jobserver support, + so Client::configure is not supported." + ); + } + + pub fn available(&self) -> io::Result { + let lock = self.inner.count.lock().unwrap_or_else(|e| e.into_inner()); + Ok(*lock) + } + + pub fn configure(&self, _cmd: &mut Command) { + unreachable!(); + } +} + +#[derive(Debug)] +pub struct Helper { + thread: JoinHandle<()>, +} + +pub(crate) fn spawn_helper( + client: crate::Client, + state: Arc, + mut f: Box) + Send>, +) -> io::Result { + let thread = Builder::new().spawn(move || { + state.for_each_request(|_| f(client.acquire())); + })?; + + Ok(Helper { thread: thread }) +} + +impl Helper { + pub fn join(self) { + // TODO: this is not correct if the thread is blocked in + // `client.acquire()`. + drop(self.thread.join()); + } +} diff -Nru temporalio-1.3.0/vendor/jobserver/src/windows.rs temporalio-1.3.0/vendor/jobserver/src/windows.rs --- temporalio-1.3.0/vendor/jobserver/src/windows.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/jobserver/src/windows.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,270 +1,266 @@ -use crate::FromEnvErrorInner; -use std::ffi::CString; -use std::io; -use std::process::Command; -use std::ptr; -use std::sync::Arc; -use std::thread::{Builder, JoinHandle}; - -#[derive(Debug)] -pub struct Client { - sem: Handle, - name: String, -} - -#[derive(Debug)] -pub struct Acquired; - -type BOOL = i32; -type DWORD = u32; -type HANDLE = *mut u8; -type LONG = i32; - -const ERROR_ALREADY_EXISTS: DWORD = 183; -const FALSE: BOOL = 0; -const INFINITE: DWORD = 0xffffffff; -const SEMAPHORE_MODIFY_STATE: DWORD = 0x2; -const SYNCHRONIZE: DWORD = 0x00100000; -const TRUE: BOOL = 1; -const WAIT_OBJECT_0: DWORD = 0; - -extern "system" { - fn CloseHandle(handle: HANDLE) -> BOOL; - fn SetEvent(hEvent: HANDLE) -> BOOL; - fn WaitForMultipleObjects( - ncount: DWORD, - lpHandles: *const HANDLE, - bWaitAll: BOOL, - dwMilliseconds: DWORD, - ) -> DWORD; - fn CreateEventA( - lpEventAttributes: *mut u8, - bManualReset: BOOL, - bInitialState: BOOL, - lpName: *const i8, - ) -> HANDLE; - fn ReleaseSemaphore( - hSemaphore: HANDLE, - lReleaseCount: LONG, - lpPreviousCount: *mut LONG, - ) -> BOOL; - fn CreateSemaphoreA( - lpEventAttributes: *mut u8, - lInitialCount: LONG, - lMaximumCount: LONG, - lpName: *const i8, - ) -> HANDLE; - fn OpenSemaphoreA(dwDesiredAccess: DWORD, bInheritHandle: BOOL, lpName: *const i8) -> HANDLE; - fn WaitForSingleObject(hHandle: HANDLE, dwMilliseconds: DWORD) -> DWORD; - #[link_name = "SystemFunction036"] - fn RtlGenRandom(RandomBuffer: *mut u8, RandomBufferLength: u32) -> u8; -} - -// Note that we ideally would use the `getrandom` crate, but unfortunately -// that causes build issues when this crate is used in rust-lang/rust (see -// rust-lang/rust#65014 for more information). As a result we just inline -// the pretty simple Windows-specific implementation of generating -// randomness. -fn getrandom(dest: &mut [u8]) -> io::Result<()> { - // Prevent overflow of u32 - for chunk in dest.chunks_mut(u32::max_value() as usize) { - let ret = unsafe { RtlGenRandom(chunk.as_mut_ptr(), chunk.len() as u32) }; - if ret == 0 { - return Err(io::Error::new( - io::ErrorKind::Other, - "failed to generate random bytes", - )); - } - } - Ok(()) -} - -impl Client { - pub fn new(limit: usize) -> io::Result { - // Try a bunch of random semaphore names until we get a unique one, - // but don't try for too long. - // - // Note that `limit == 0` is a valid argument above but Windows - // won't let us create a semaphore with 0 slots available to it. Get - // `limit == 0` working by creating a semaphore instead with one - // slot and then immediately acquire it (without ever releaseing it - // back). - for _ in 0..100 { - let mut bytes = [0; 4]; - getrandom(&mut bytes)?; - let mut name = format!("__rust_jobserver_semaphore_{}\0", u32::from_ne_bytes(bytes)); - unsafe { - let create_limit = if limit == 0 { 1 } else { limit }; - let r = CreateSemaphoreA( - ptr::null_mut(), - create_limit as LONG, - create_limit as LONG, - name.as_ptr() as *const _, - ); - if r.is_null() { - return Err(io::Error::last_os_error()); - } - let handle = Handle(r); - - let err = io::Error::last_os_error(); - if err.raw_os_error() == Some(ERROR_ALREADY_EXISTS as i32) { - continue; - } - name.pop(); // chop off the trailing nul - let client = Client { - sem: handle, - name: name, - }; - if create_limit != limit { - client.acquire()?; - } - return Ok(client); - } - } - - Err(io::Error::new( - io::ErrorKind::Other, - "failed to find a unique name for a semaphore", - )) - } - - pub(crate) unsafe fn open(s: &str, _check_pipe: bool) -> Result { - let name = match CString::new(s) { - Ok(s) => s, - Err(e) => return Err(FromEnvErrorInner::CannotParse(e.to_string())), - }; - - let sem = OpenSemaphoreA(SYNCHRONIZE | SEMAPHORE_MODIFY_STATE, FALSE, name.as_ptr()); - if sem.is_null() { - Err(FromEnvErrorInner::CannotOpenPath( - s.to_string(), - io::Error::last_os_error(), - )) - } else { - Ok(Client { - sem: Handle(sem), - name: s.to_string(), - }) - } - } - - pub fn acquire(&self) -> io::Result { - unsafe { - let r = WaitForSingleObject(self.sem.0, INFINITE); - if r == WAIT_OBJECT_0 { - Ok(Acquired) - } else { - Err(io::Error::last_os_error()) - } - } - } - - pub fn release(&self, _data: Option<&Acquired>) -> io::Result<()> { - unsafe { - let r = ReleaseSemaphore(self.sem.0, 1, ptr::null_mut()); - if r != 0 { - Ok(()) - } else { - Err(io::Error::last_os_error()) - } - } - } - - pub fn string_arg(&self) -> String { - self.name.clone() - } - - pub fn available(&self) -> io::Result { - // Can't read value of a semaphore on Windows, so - // try to acquire without sleeping, since we can find out the - // old value on release. If acquisiton fails, then available is 0. - unsafe { - let r = WaitForSingleObject(self.sem.0, 0); - if r != WAIT_OBJECT_0 { - Ok(0) - } else { - let mut prev: LONG = 0; - let r = ReleaseSemaphore(self.sem.0, 1, &mut prev); - if r != 0 { - Ok(prev as usize + 1) - } else { - Err(io::Error::last_os_error()) - } - } - } - } - - pub fn configure(&self, _cmd: &mut Command) { - // nothing to do here, we gave the name of our semaphore to the - // child above - } -} - -#[derive(Debug)] -struct Handle(HANDLE); -// HANDLE is a raw ptr, but we're send/sync -unsafe impl Sync for Handle {} -unsafe impl Send for Handle {} - -impl Drop for Handle { - fn drop(&mut self) { - unsafe { - CloseHandle(self.0); - } - } -} - -#[derive(Debug)] -pub struct Helper { - event: Arc, - thread: JoinHandle<()>, -} - -pub(crate) fn spawn_helper( - client: crate::Client, - state: Arc, - mut f: Box) + Send>, -) -> io::Result { - let event = unsafe { - let r = CreateEventA(ptr::null_mut(), TRUE, FALSE, ptr::null()); - if r.is_null() { - return Err(io::Error::last_os_error()); - } else { - Handle(r) - } - }; - let event = Arc::new(event); - let event2 = event.clone(); - let thread = Builder::new().spawn(move || { - let objects = [event2.0, client.inner.sem.0]; - state.for_each_request(|_| { - const WAIT_OBJECT_1: u32 = WAIT_OBJECT_0 + 1; - match unsafe { WaitForMultipleObjects(2, objects.as_ptr(), FALSE, INFINITE) } { - WAIT_OBJECT_0 => return, - WAIT_OBJECT_1 => f(Ok(crate::Acquired { - client: client.inner.clone(), - data: Acquired, - disabled: false, - })), - _ => f(Err(io::Error::last_os_error())), - } - }); - })?; - Ok(Helper { thread, event }) -} - -impl Helper { - pub fn join(self) { - // Unlike unix this logic is much easier. If our thread was blocked - // in waiting for requests it should already be woken up and - // exiting. Otherwise it's waiting for a token, so we wake it up - // with a different event that it's also waiting on here. After - // these two we should be guaranteed the thread is on its way out, - // so we can safely `join`. - let r = unsafe { SetEvent(self.event.0) }; - if r == 0 { - panic!("failed to set event: {}", io::Error::last_os_error()); - } - drop(self.thread.join()); - } -} +use std::ffi::CString; +use std::io; +use std::process::Command; +use std::ptr; +use std::sync::Arc; +use std::thread::{Builder, JoinHandle}; + +#[derive(Debug)] +pub struct Client { + sem: Handle, + name: String, +} + +#[derive(Debug)] +pub struct Acquired; + +type BOOL = i32; +type DWORD = u32; +type HANDLE = *mut u8; +type LONG = i32; + +const ERROR_ALREADY_EXISTS: DWORD = 183; +const FALSE: BOOL = 0; +const INFINITE: DWORD = 0xffffffff; +const SEMAPHORE_MODIFY_STATE: DWORD = 0x2; +const SYNCHRONIZE: DWORD = 0x00100000; +const TRUE: BOOL = 1; +const WAIT_OBJECT_0: DWORD = 0; + +extern "system" { + fn CloseHandle(handle: HANDLE) -> BOOL; + fn SetEvent(hEvent: HANDLE) -> BOOL; + fn WaitForMultipleObjects( + ncount: DWORD, + lpHandles: *const HANDLE, + bWaitAll: BOOL, + dwMilliseconds: DWORD, + ) -> DWORD; + fn CreateEventA( + lpEventAttributes: *mut u8, + bManualReset: BOOL, + bInitialState: BOOL, + lpName: *const i8, + ) -> HANDLE; + fn ReleaseSemaphore( + hSemaphore: HANDLE, + lReleaseCount: LONG, + lpPreviousCount: *mut LONG, + ) -> BOOL; + fn CreateSemaphoreA( + lpEventAttributes: *mut u8, + lInitialCount: LONG, + lMaximumCount: LONG, + lpName: *const i8, + ) -> HANDLE; + fn OpenSemaphoreA(dwDesiredAccess: DWORD, bInheritHandle: BOOL, lpName: *const i8) -> HANDLE; + fn WaitForSingleObject(hHandle: HANDLE, dwMilliseconds: DWORD) -> DWORD; + #[link_name = "SystemFunction036"] + fn RtlGenRandom(RandomBuffer: *mut u8, RandomBufferLength: u32) -> u8; +} + +// Note that we ideally would use the `getrandom` crate, but unfortunately +// that causes build issues when this crate is used in rust-lang/rust (see +// rust-lang/rust#65014 for more information). As a result we just inline +// the pretty simple Windows-specific implementation of generating +// randomness. +fn getrandom(dest: &mut [u8]) -> io::Result<()> { + // Prevent overflow of u32 + for chunk in dest.chunks_mut(u32::max_value() as usize) { + let ret = unsafe { RtlGenRandom(chunk.as_mut_ptr(), chunk.len() as u32) }; + if ret == 0 { + return Err(io::Error::new( + io::ErrorKind::Other, + "failed to generate random bytes", + )); + } + } + Ok(()) +} + +impl Client { + pub fn new(limit: usize) -> io::Result { + // Try a bunch of random semaphore names until we get a unique one, + // but don't try for too long. + // + // Note that `limit == 0` is a valid argument above but Windows + // won't let us create a semaphore with 0 slots available to it. Get + // `limit == 0` working by creating a semaphore instead with one + // slot and then immediately acquire it (without ever releaseing it + // back). + for _ in 0..100 { + let mut bytes = [0; 4]; + getrandom(&mut bytes)?; + let mut name = format!("__rust_jobserver_semaphore_{}\0", u32::from_ne_bytes(bytes)); + unsafe { + let create_limit = if limit == 0 { 1 } else { limit }; + let r = CreateSemaphoreA( + ptr::null_mut(), + create_limit as LONG, + create_limit as LONG, + name.as_ptr() as *const _, + ); + if r.is_null() { + return Err(io::Error::last_os_error()); + } + let handle = Handle(r); + + let err = io::Error::last_os_error(); + if err.raw_os_error() == Some(ERROR_ALREADY_EXISTS as i32) { + continue; + } + name.pop(); // chop off the trailing nul + let client = Client { + sem: handle, + name: name, + }; + if create_limit != limit { + client.acquire()?; + } + return Ok(client); + } + } + + Err(io::Error::new( + io::ErrorKind::Other, + "failed to find a unique name for a semaphore", + )) + } + + pub unsafe fn open(s: &str) -> Option { + let name = match CString::new(s) { + Ok(s) => s, + Err(_) => return None, + }; + + let sem = OpenSemaphoreA(SYNCHRONIZE | SEMAPHORE_MODIFY_STATE, FALSE, name.as_ptr()); + if sem.is_null() { + None + } else { + Some(Client { + sem: Handle(sem), + name: s.to_string(), + }) + } + } + + pub fn acquire(&self) -> io::Result { + unsafe { + let r = WaitForSingleObject(self.sem.0, INFINITE); + if r == WAIT_OBJECT_0 { + Ok(Acquired) + } else { + Err(io::Error::last_os_error()) + } + } + } + + pub fn release(&self, _data: Option<&Acquired>) -> io::Result<()> { + unsafe { + let r = ReleaseSemaphore(self.sem.0, 1, ptr::null_mut()); + if r != 0 { + Ok(()) + } else { + Err(io::Error::last_os_error()) + } + } + } + + pub fn string_arg(&self) -> String { + self.name.clone() + } + + pub fn available(&self) -> io::Result { + // Can't read value of a semaphore on Windows, so + // try to acquire without sleeping, since we can find out the + // old value on release. If acquisiton fails, then available is 0. + unsafe { + let r = WaitForSingleObject(self.sem.0, 0); + if r != WAIT_OBJECT_0 { + Ok(0) + } else { + let mut prev: LONG = 0; + let r = ReleaseSemaphore(self.sem.0, 1, &mut prev); + if r != 0 { + Ok(prev as usize + 1) + } else { + Err(io::Error::last_os_error()) + } + } + } + } + + pub fn configure(&self, _cmd: &mut Command) { + // nothing to do here, we gave the name of our semaphore to the + // child above + } +} + +#[derive(Debug)] +struct Handle(HANDLE); +// HANDLE is a raw ptr, but we're send/sync +unsafe impl Sync for Handle {} +unsafe impl Send for Handle {} + +impl Drop for Handle { + fn drop(&mut self) { + unsafe { + CloseHandle(self.0); + } + } +} + +#[derive(Debug)] +pub struct Helper { + event: Arc, + thread: JoinHandle<()>, +} + +pub(crate) fn spawn_helper( + client: crate::Client, + state: Arc, + mut f: Box) + Send>, +) -> io::Result { + let event = unsafe { + let r = CreateEventA(ptr::null_mut(), TRUE, FALSE, ptr::null()); + if r.is_null() { + return Err(io::Error::last_os_error()); + } else { + Handle(r) + } + }; + let event = Arc::new(event); + let event2 = event.clone(); + let thread = Builder::new().spawn(move || { + let objects = [event2.0, client.inner.sem.0]; + state.for_each_request(|_| { + const WAIT_OBJECT_1: u32 = WAIT_OBJECT_0 + 1; + match unsafe { WaitForMultipleObjects(2, objects.as_ptr(), FALSE, INFINITE) } { + WAIT_OBJECT_0 => return, + WAIT_OBJECT_1 => f(Ok(crate::Acquired { + client: client.inner.clone(), + data: Acquired, + disabled: false, + })), + _ => f(Err(io::Error::last_os_error())), + } + }); + })?; + Ok(Helper { thread, event }) +} + +impl Helper { + pub fn join(self) { + // Unlike unix this logic is much easier. If our thread was blocked + // in waiting for requests it should already be woken up and + // exiting. Otherwise it's waiting for a token, so we wake it up + // with a different event that it's also waiting on here. After + // these two we should be guaranteed the thread is on its way out, + // so we can safely `join`. + let r = unsafe { SetEvent(self.event.0) }; + if r == 0 { + panic!("failed to set event: {}", io::Error::last_os_error()); + } + drop(self.thread.join()); + } +} diff -Nru temporalio-1.3.0/vendor/jobserver/tests/client-of-myself.rs temporalio-1.3.0/vendor/jobserver/tests/client-of-myself.rs --- temporalio-1.3.0/vendor/jobserver/tests/client-of-myself.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/jobserver/tests/client-of-myself.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,59 +1,59 @@ -use std::env; -use std::io::prelude::*; -use std::io::BufReader; -use std::process::{Command, Stdio}; -use std::sync::mpsc; -use std::thread; - -use jobserver::Client; - -macro_rules! t { - ($e:expr) => { - match $e { - Ok(e) => e, - Err(e) => panic!("{} failed with {}", stringify!($e), e), - } - }; -} - -fn main() { - if env::var("I_AM_THE_CLIENT").is_ok() { - client(); - } else { - server(); - } -} - -fn server() { - let me = t!(env::current_exe()); - let client = t!(Client::new(1)); - let mut cmd = Command::new(me); - cmd.env("I_AM_THE_CLIENT", "1").stdout(Stdio::piped()); - client.configure(&mut cmd); - let acq = client.acquire().unwrap(); - let mut child = t!(cmd.spawn()); - let stdout = child.stdout.take().unwrap(); - let (tx, rx) = mpsc::channel(); - let t = thread::spawn(move || { - for line in BufReader::new(stdout).lines() { - tx.send(t!(line)).unwrap(); - } - }); - - for _ in 0..100 { - assert!(rx.try_recv().is_err()); - } - - drop(acq); - assert_eq!(rx.recv().unwrap(), "hello!"); - t.join().unwrap(); - assert!(rx.recv().is_err()); - client.acquire().unwrap(); -} - -fn client() { - let client = unsafe { Client::from_env().unwrap() }; - let acq = client.acquire().unwrap(); - println!("hello!"); - drop(acq); -} +use std::env; +use std::io::prelude::*; +use std::io::BufReader; +use std::process::{Command, Stdio}; +use std::sync::mpsc; +use std::thread; + +use jobserver::Client; + +macro_rules! t { + ($e:expr) => { + match $e { + Ok(e) => e, + Err(e) => panic!("{} failed with {}", stringify!($e), e), + } + }; +} + +fn main() { + if env::var("I_AM_THE_CLIENT").is_ok() { + client(); + } else { + server(); + } +} + +fn server() { + let me = t!(env::current_exe()); + let client = t!(Client::new(1)); + let mut cmd = Command::new(me); + cmd.env("I_AM_THE_CLIENT", "1").stdout(Stdio::piped()); + client.configure(&mut cmd); + let acq = client.acquire().unwrap(); + let mut child = t!(cmd.spawn()); + let stdout = child.stdout.take().unwrap(); + let (tx, rx) = mpsc::channel(); + let t = thread::spawn(move || { + for line in BufReader::new(stdout).lines() { + tx.send(t!(line)).unwrap(); + } + }); + + for _ in 0..100 { + assert!(rx.try_recv().is_err()); + } + + drop(acq); + assert_eq!(rx.recv().unwrap(), "hello!"); + t.join().unwrap(); + assert!(rx.recv().is_err()); + client.acquire().unwrap(); +} + +fn client() { + let client = unsafe { Client::from_env().unwrap() }; + let acq = client.acquire().unwrap(); + println!("hello!"); + drop(acq); +} diff -Nru temporalio-1.3.0/vendor/jobserver/tests/client.rs temporalio-1.3.0/vendor/jobserver/tests/client.rs --- temporalio-1.3.0/vendor/jobserver/tests/client.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/jobserver/tests/client.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,198 +1,198 @@ -use std::env; -use std::fs::File; -use std::io::Write; -use std::process::Command; -use std::sync::atomic::{AtomicBool, Ordering}; -use std::sync::mpsc; -use std::sync::Arc; -use std::thread; - -use futures::future::{self, Future}; -use futures::stream::{self, Stream}; -use jobserver::Client; -use tokio_core::reactor::Core; -use tokio_process::CommandExt; - -macro_rules! t { - ($e:expr) => { - match $e { - Ok(e) => e, - Err(e) => panic!("{} failed with {}", stringify!($e), e), - } - }; -} - -struct Test { - name: &'static str, - f: &'static dyn Fn(), - make_args: &'static [&'static str], - rule: &'static dyn Fn(&str) -> String, -} - -const TESTS: &[Test] = &[ - Test { - name: "no j args", - make_args: &[], - rule: &|me| me.to_string(), - f: &|| { - assert!(unsafe { Client::from_env().is_none() }); - }, - }, - Test { - name: "no j args with plus", - make_args: &[], - rule: &|me| format!("+{}", me), - f: &|| { - assert!(unsafe { Client::from_env().is_none() }); - }, - }, - Test { - name: "j args with plus", - make_args: &["-j2"], - rule: &|me| format!("+{}", me), - f: &|| { - assert!(unsafe { Client::from_env().is_some() }); - }, - }, - Test { - name: "acquire", - make_args: &["-j2"], - rule: &|me| format!("+{}", me), - f: &|| { - let c = unsafe { Client::from_env().unwrap() }; - drop(c.acquire().unwrap()); - drop(c.acquire().unwrap()); - }, - }, - Test { - name: "acquire3", - make_args: &["-j3"], - rule: &|me| format!("+{}", me), - f: &|| { - let c = unsafe { Client::from_env().unwrap() }; - let a = c.acquire().unwrap(); - let b = c.acquire().unwrap(); - drop((a, b)); - }, - }, - Test { - name: "acquire blocks", - make_args: &["-j2"], - rule: &|me| format!("+{}", me), - f: &|| { - let c = unsafe { Client::from_env().unwrap() }; - let a = c.acquire().unwrap(); - let hit = Arc::new(AtomicBool::new(false)); - let hit2 = hit.clone(); - let (tx, rx) = mpsc::channel(); - let t = thread::spawn(move || { - tx.send(()).unwrap(); - let _b = c.acquire().unwrap(); - hit2.store(true, Ordering::SeqCst); - }); - rx.recv().unwrap(); - assert!(!hit.load(Ordering::SeqCst)); - drop(a); - t.join().unwrap(); - assert!(hit.load(Ordering::SeqCst)); - }, - }, - Test { - name: "acquire_raw", - make_args: &["-j2"], - rule: &|me| format!("+{}", me), - f: &|| { - let c = unsafe { Client::from_env().unwrap() }; - c.acquire_raw().unwrap(); - c.release_raw().unwrap(); - }, - }, -]; - -fn main() { - if let Ok(test) = env::var("TEST_TO_RUN") { - return (TESTS.iter().find(|t| t.name == test).unwrap().f)(); - } - - let me = t!(env::current_exe()); - let me = me.to_str().unwrap(); - let filter = env::args().nth(1); - - let mut core = t!(Core::new()); - - let futures = TESTS - .iter() - .filter(|test| match filter { - Some(ref s) => test.name.contains(s), - None => true, - }) - .map(|test| { - let td = t!(tempfile::tempdir()); - let makefile = format!( - "\ -all: export TEST_TO_RUN={} -all: -\t{} -", - test.name, - (test.rule)(me) - ); - t!(t!(File::create(td.path().join("Makefile"))).write_all(makefile.as_bytes())); - let prog = env::var("MAKE").unwrap_or_else(|_| "make".to_string()); - let mut cmd = Command::new(prog); - cmd.args(test.make_args); - cmd.current_dir(td.path()); - future::lazy(move || { - cmd.output_async().map(move |e| { - drop(td); - (test, e) - }) - }) - }) - .collect::>(); - - println!("\nrunning {} tests\n", futures.len()); - - let stream = stream::iter(futures.into_iter().map(Ok)).buffer_unordered(num_cpus::get()); - - let mut failures = Vec::new(); - t!(core.run(stream.for_each(|(test, output)| { - if output.status.success() { - println!("test {} ... ok", test.name); - } else { - println!("test {} ... FAIL", test.name); - failures.push((test, output)); - } - Ok(()) - }))); - - if failures.is_empty() { - println!("\ntest result: ok\n"); - return; - } - - println!("\n----------- failures"); - - for (test, output) in failures { - println!("test {}", test.name); - let stdout = String::from_utf8_lossy(&output.stdout); - let stderr = String::from_utf8_lossy(&output.stderr); - - println!("\texit status: {}", output.status); - if !stdout.is_empty() { - println!("\tstdout ==="); - for line in stdout.lines() { - println!("\t\t{}", line); - } - } - - if !stderr.is_empty() { - println!("\tstderr ==="); - for line in stderr.lines() { - println!("\t\t{}", line); - } - } - } - - std::process::exit(4); -} +use std::env; +use std::fs::File; +use std::io::Write; +use std::process::Command; +use std::sync::atomic::{AtomicBool, Ordering}; +use std::sync::mpsc; +use std::sync::Arc; +use std::thread; + +use futures::future::{self, Future}; +use futures::stream::{self, Stream}; +use jobserver::Client; +use tokio_core::reactor::Core; +use tokio_process::CommandExt; + +macro_rules! t { + ($e:expr) => { + match $e { + Ok(e) => e, + Err(e) => panic!("{} failed with {}", stringify!($e), e), + } + }; +} + +struct Test { + name: &'static str, + f: &'static dyn Fn(), + make_args: &'static [&'static str], + rule: &'static dyn Fn(&str) -> String, +} + +const TESTS: &[Test] = &[ + Test { + name: "no j args", + make_args: &[], + rule: &|me| me.to_string(), + f: &|| { + assert!(unsafe { Client::from_env().is_none() }); + }, + }, + Test { + name: "no j args with plus", + make_args: &[], + rule: &|me| format!("+{}", me), + f: &|| { + assert!(unsafe { Client::from_env().is_none() }); + }, + }, + Test { + name: "j args with plus", + make_args: &["-j2"], + rule: &|me| format!("+{}", me), + f: &|| { + assert!(unsafe { Client::from_env().is_some() }); + }, + }, + Test { + name: "acquire", + make_args: &["-j2"], + rule: &|me| format!("+{}", me), + f: &|| { + let c = unsafe { Client::from_env().unwrap() }; + drop(c.acquire().unwrap()); + drop(c.acquire().unwrap()); + }, + }, + Test { + name: "acquire3", + make_args: &["-j3"], + rule: &|me| format!("+{}", me), + f: &|| { + let c = unsafe { Client::from_env().unwrap() }; + let a = c.acquire().unwrap(); + let b = c.acquire().unwrap(); + drop((a, b)); + }, + }, + Test { + name: "acquire blocks", + make_args: &["-j2"], + rule: &|me| format!("+{}", me), + f: &|| { + let c = unsafe { Client::from_env().unwrap() }; + let a = c.acquire().unwrap(); + let hit = Arc::new(AtomicBool::new(false)); + let hit2 = hit.clone(); + let (tx, rx) = mpsc::channel(); + let t = thread::spawn(move || { + tx.send(()).unwrap(); + let _b = c.acquire().unwrap(); + hit2.store(true, Ordering::SeqCst); + }); + rx.recv().unwrap(); + assert!(!hit.load(Ordering::SeqCst)); + drop(a); + t.join().unwrap(); + assert!(hit.load(Ordering::SeqCst)); + }, + }, + Test { + name: "acquire_raw", + make_args: &["-j2"], + rule: &|me| format!("+{}", me), + f: &|| { + let c = unsafe { Client::from_env().unwrap() }; + c.acquire_raw().unwrap(); + c.release_raw().unwrap(); + }, + }, +]; + +fn main() { + if let Ok(test) = env::var("TEST_TO_RUN") { + return (TESTS.iter().find(|t| t.name == test).unwrap().f)(); + } + + let me = t!(env::current_exe()); + let me = me.to_str().unwrap(); + let filter = env::args().nth(1); + + let mut core = t!(Core::new()); + + let futures = TESTS + .iter() + .filter(|test| match filter { + Some(ref s) => test.name.contains(s), + None => true, + }) + .map(|test| { + let td = t!(tempfile::tempdir()); + let makefile = format!( + "\ +all: export TEST_TO_RUN={} +all: +\t{} +", + test.name, + (test.rule)(me) + ); + t!(t!(File::create(td.path().join("Makefile"))).write_all(makefile.as_bytes())); + let prog = env::var("MAKE").unwrap_or_else(|_| "make".to_string()); + let mut cmd = Command::new(prog); + cmd.args(test.make_args); + cmd.current_dir(td.path()); + future::lazy(move || { + cmd.output_async().map(move |e| { + drop(td); + (test, e) + }) + }) + }) + .collect::>(); + + println!("\nrunning {} tests\n", futures.len()); + + let stream = stream::iter(futures.into_iter().map(Ok)).buffer_unordered(num_cpus::get()); + + let mut failures = Vec::new(); + t!(core.run(stream.for_each(|(test, output)| { + if output.status.success() { + println!("test {} ... ok", test.name); + } else { + println!("test {} ... FAIL", test.name); + failures.push((test, output)); + } + Ok(()) + }))); + + if failures.is_empty() { + println!("\ntest result: ok\n"); + return; + } + + println!("\n----------- failures"); + + for (test, output) in failures { + println!("test {}", test.name); + let stdout = String::from_utf8_lossy(&output.stdout); + let stderr = String::from_utf8_lossy(&output.stderr); + + println!("\texit status: {}", output.status); + if !stdout.is_empty() { + println!("\tstdout ==="); + for line in stdout.lines() { + println!("\t\t{}", line); + } + } + + if !stderr.is_empty() { + println!("\tstderr ==="); + for line in stderr.lines() { + println!("\t\t{}", line); + } + } + } + + std::process::exit(4); +} diff -Nru temporalio-1.3.0/vendor/jobserver/tests/helper.rs temporalio-1.3.0/vendor/jobserver/tests/helper.rs --- temporalio-1.3.0/vendor/jobserver/tests/helper.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/jobserver/tests/helper.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,77 +1,77 @@ -use jobserver::Client; -use std::sync::atomic::*; -use std::sync::mpsc; -use std::sync::*; - -macro_rules! t { - ($e:expr) => { - match $e { - Ok(e) => e, - Err(e) => panic!("{} failed with {}", stringify!($e), e), - } - }; -} - -#[test] -fn helper_smoke() { - let client = t!(Client::new(1)); - drop(client.clone().into_helper_thread(|_| ()).unwrap()); - drop(client.clone().into_helper_thread(|_| ()).unwrap()); - drop(client.clone().into_helper_thread(|_| ()).unwrap()); - drop(client.clone().into_helper_thread(|_| ()).unwrap()); - drop(client.clone().into_helper_thread(|_| ()).unwrap()); - drop(client.into_helper_thread(|_| ()).unwrap()); -} - -#[test] -fn acquire() { - let (tx, rx) = mpsc::channel(); - let client = t!(Client::new(1)); - let helper = client - .into_helper_thread(move |a| drop(tx.send(a))) - .unwrap(); - assert!(rx.try_recv().is_err()); - helper.request_token(); - rx.recv().unwrap().unwrap(); - helper.request_token(); - rx.recv().unwrap().unwrap(); - - helper.request_token(); - helper.request_token(); - rx.recv().unwrap().unwrap(); - rx.recv().unwrap().unwrap(); - - helper.request_token(); - helper.request_token(); - drop(helper); -} - -#[test] -fn prompt_shutdown() { - for _ in 0..100 { - let client = jobserver::Client::new(4).unwrap(); - let count = Arc::new(AtomicU32::new(0)); - let count2 = count.clone(); - let tokens = Arc::new(Mutex::new(Vec::new())); - let helper = client - .into_helper_thread(move |token| { - tokens.lock().unwrap().push(token); - count2.fetch_add(1, Ordering::SeqCst); - }) - .unwrap(); - - // Request more tokens than what are available. - for _ in 0..5 { - helper.request_token(); - } - // Wait for at least some of the requests to finish. - while count.load(Ordering::SeqCst) < 3 { - std::thread::yield_now(); - } - // Drop helper - let t = std::time::Instant::now(); - drop(helper); - let d = t.elapsed(); - assert!(d.as_secs_f64() < 0.5); - } -} +use jobserver::Client; +use std::sync::atomic::*; +use std::sync::mpsc; +use std::sync::*; + +macro_rules! t { + ($e:expr) => { + match $e { + Ok(e) => e, + Err(e) => panic!("{} failed with {}", stringify!($e), e), + } + }; +} + +#[test] +fn helper_smoke() { + let client = t!(Client::new(1)); + drop(client.clone().into_helper_thread(|_| ()).unwrap()); + drop(client.clone().into_helper_thread(|_| ()).unwrap()); + drop(client.clone().into_helper_thread(|_| ()).unwrap()); + drop(client.clone().into_helper_thread(|_| ()).unwrap()); + drop(client.clone().into_helper_thread(|_| ()).unwrap()); + drop(client.into_helper_thread(|_| ()).unwrap()); +} + +#[test] +fn acquire() { + let (tx, rx) = mpsc::channel(); + let client = t!(Client::new(1)); + let helper = client + .into_helper_thread(move |a| drop(tx.send(a))) + .unwrap(); + assert!(rx.try_recv().is_err()); + helper.request_token(); + rx.recv().unwrap().unwrap(); + helper.request_token(); + rx.recv().unwrap().unwrap(); + + helper.request_token(); + helper.request_token(); + rx.recv().unwrap().unwrap(); + rx.recv().unwrap().unwrap(); + + helper.request_token(); + helper.request_token(); + drop(helper); +} + +#[test] +fn prompt_shutdown() { + for _ in 0..100 { + let client = jobserver::Client::new(4).unwrap(); + let count = Arc::new(AtomicU32::new(0)); + let count2 = count.clone(); + let tokens = Arc::new(Mutex::new(Vec::new())); + let helper = client + .into_helper_thread(move |token| { + tokens.lock().unwrap().push(token); + count2.fetch_add(1, Ordering::SeqCst); + }) + .unwrap(); + + // Request more tokens than what are available. + for _ in 0..5 { + helper.request_token(); + } + // Wait for at least some of the requests to finish. + while count.load(Ordering::SeqCst) < 3 { + std::thread::yield_now(); + } + // Drop helper + let t = std::time::Instant::now(); + drop(helper); + let d = t.elapsed(); + assert!(d.as_secs_f64() < 0.5); + } +} diff -Nru temporalio-1.3.0/vendor/jobserver/tests/make-as-a-client.rs temporalio-1.3.0/vendor/jobserver/tests/make-as-a-client.rs --- temporalio-1.3.0/vendor/jobserver/tests/make-as-a-client.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/jobserver/tests/make-as-a-client.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,81 +1,81 @@ -use std::env; -use std::fs::File; -use std::io::prelude::*; -use std::net::{TcpListener, TcpStream}; -use std::process::Command; - -use jobserver::Client; - -macro_rules! t { - ($e:expr) => { - match $e { - Ok(e) => e, - Err(e) => panic!("{} failed with {}", stringify!($e), e), - } - }; -} - -fn main() { - if env::var("_DO_THE_TEST").is_ok() { - std::process::exit( - Command::new(env::var_os("MAKE").unwrap()) - .env("MAKEFLAGS", env::var_os("CARGO_MAKEFLAGS").unwrap()) - .env_remove("_DO_THE_TEST") - .args(&env::args_os().skip(1).collect::>()) - .status() - .unwrap() - .code() - .unwrap_or(1), - ); - } - - if let Ok(s) = env::var("TEST_ADDR") { - let mut contents = Vec::new(); - t!(t!(TcpStream::connect(&s)).read_to_end(&mut contents)); - return; - } - - let c = t!(Client::new(1)); - let td = tempfile::tempdir().unwrap(); - - let prog = env::var("MAKE").unwrap_or_else(|_| "make".to_string()); - - let me = t!(env::current_exe()); - let me = me.to_str().unwrap(); - - let mut cmd = Command::new(&me); - cmd.current_dir(td.path()); - cmd.env("MAKE", prog); - cmd.env("_DO_THE_TEST", "1"); - - t!(t!(File::create(td.path().join("Makefile"))).write_all( - format!( - "\ -all: foo bar -foo: -\t{0} -bar: -\t{0} -", - me - ) - .as_bytes() - )); - - // We're leaking one extra token to `make` sort of violating the makefile - // jobserver protocol. It has the desired effect though. - c.configure(&mut cmd); - - let listener = t!(TcpListener::bind("127.0.0.1:0")); - let addr = t!(listener.local_addr()); - cmd.env("TEST_ADDR", addr.to_string()); - let mut child = t!(cmd.spawn()); - - // We should get both connections as the two programs should be run - // concurrently. - let a = t!(listener.accept()); - let b = t!(listener.accept()); - drop((a, b)); - - assert!(t!(child.wait()).success()); -} +use std::env; +use std::fs::File; +use std::io::prelude::*; +use std::net::{TcpListener, TcpStream}; +use std::process::Command; + +use jobserver::Client; + +macro_rules! t { + ($e:expr) => { + match $e { + Ok(e) => e, + Err(e) => panic!("{} failed with {}", stringify!($e), e), + } + }; +} + +fn main() { + if env::var("_DO_THE_TEST").is_ok() { + std::process::exit( + Command::new(env::var_os("MAKE").unwrap()) + .env("MAKEFLAGS", env::var_os("CARGO_MAKEFLAGS").unwrap()) + .env_remove("_DO_THE_TEST") + .args(&env::args_os().skip(1).collect::>()) + .status() + .unwrap() + .code() + .unwrap_or(1), + ); + } + + if let Ok(s) = env::var("TEST_ADDR") { + let mut contents = Vec::new(); + t!(t!(TcpStream::connect(&s)).read_to_end(&mut contents)); + return; + } + + let c = t!(Client::new(1)); + let td = tempfile::tempdir().unwrap(); + + let prog = env::var("MAKE").unwrap_or_else(|_| "make".to_string()); + + let me = t!(env::current_exe()); + let me = me.to_str().unwrap(); + + let mut cmd = Command::new(&me); + cmd.current_dir(td.path()); + cmd.env("MAKE", prog); + cmd.env("_DO_THE_TEST", "1"); + + t!(t!(File::create(td.path().join("Makefile"))).write_all( + format!( + "\ +all: foo bar +foo: +\t{0} +bar: +\t{0} +", + me + ) + .as_bytes() + )); + + // We're leaking one extra token to `make` sort of violating the makefile + // jobserver protocol. It has the desired effect though. + c.configure(&mut cmd); + + let listener = t!(TcpListener::bind("127.0.0.1:0")); + let addr = t!(listener.local_addr()); + cmd.env("TEST_ADDR", addr.to_string()); + let mut child = t!(cmd.spawn()); + + // We should get both connections as the two programs should be run + // concurrently. + let a = t!(listener.accept()); + let b = t!(listener.accept()); + drop((a, b)); + + assert!(t!(child.wait()).success()); +} diff -Nru temporalio-1.3.0/vendor/jobserver/tests/server.rs temporalio-1.3.0/vendor/jobserver/tests/server.rs --- temporalio-1.3.0/vendor/jobserver/tests/server.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/jobserver/tests/server.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,181 +1,181 @@ -use std::env; -use std::fs::File; -use std::io::prelude::*; -use std::process::Command; -use std::sync::atomic::{AtomicBool, Ordering}; -use std::sync::mpsc; -use std::sync::Arc; -use std::thread; - -use jobserver::Client; - -macro_rules! t { - ($e:expr) => { - match $e { - Ok(e) => e, - Err(e) => panic!("{} failed with {}", stringify!($e), e), - } - }; -} - -#[test] -fn server_smoke() { - let c = t!(Client::new(1)); - drop(c.acquire().unwrap()); - drop(c.acquire().unwrap()); -} - -#[test] -fn server_multiple() { - let c = t!(Client::new(2)); - let a = c.acquire().unwrap(); - let b = c.acquire().unwrap(); - drop((a, b)); -} - -#[test] -fn server_available() { - let c = t!(Client::new(10)); - assert_eq!(c.available().unwrap(), 10); - let a = c.acquire().unwrap(); - assert_eq!(c.available().unwrap(), 9); - drop(a); - assert_eq!(c.available().unwrap(), 10); -} - -#[test] -fn server_none_available() { - let c = t!(Client::new(2)); - assert_eq!(c.available().unwrap(), 2); - let a = c.acquire().unwrap(); - assert_eq!(c.available().unwrap(), 1); - let b = c.acquire().unwrap(); - assert_eq!(c.available().unwrap(), 0); - drop(a); - assert_eq!(c.available().unwrap(), 1); - drop(b); - assert_eq!(c.available().unwrap(), 2); -} - -#[test] -fn server_blocks() { - let c = t!(Client::new(1)); - let a = c.acquire().unwrap(); - let hit = Arc::new(AtomicBool::new(false)); - let hit2 = hit.clone(); - let (tx, rx) = mpsc::channel(); - let t = thread::spawn(move || { - tx.send(()).unwrap(); - let _b = c.acquire().unwrap(); - hit2.store(true, Ordering::SeqCst); - }); - rx.recv().unwrap(); - assert!(!hit.load(Ordering::SeqCst)); - drop(a); - t.join().unwrap(); - assert!(hit.load(Ordering::SeqCst)); -} - -#[test] -fn make_as_a_single_thread_client() { - let c = t!(Client::new(1)); - let td = tempfile::tempdir().unwrap(); - - let prog = env::var("MAKE").unwrap_or_else(|_| "make".to_string()); - let mut cmd = Command::new(prog); - cmd.current_dir(td.path()); - - t!(t!(File::create(td.path().join("Makefile"))).write_all( - b" -all: foo bar -foo: -\techo foo -bar: -\techo bar -" - )); - - // The jobserver protocol means that the `make` process itself "runs with a - // token", so we acquire our one token to drain the jobserver, and this - // should mean that `make` itself never has a second token available to it. - let _a = c.acquire(); - c.configure(&mut cmd); - let output = t!(cmd.output()); - println!( - "\n\t=== stderr\n\t\t{}", - String::from_utf8_lossy(&output.stderr).replace("\n", "\n\t\t") - ); - println!( - "\t=== stdout\n\t\t{}", - String::from_utf8_lossy(&output.stdout).replace("\n", "\n\t\t") - ); - - assert!(output.status.success()); - assert!(output.stderr.is_empty()); - - let stdout = String::from_utf8_lossy(&output.stdout).replace("\r\n", "\n"); - let a = "\ -echo foo -foo -echo bar -bar -"; - let b = "\ -echo bar -bar -echo foo -foo -"; - - assert!(stdout == a || stdout == b); -} - -#[test] -fn make_as_a_multi_thread_client() { - let c = t!(Client::new(1)); - let td = tempfile::tempdir().unwrap(); - - let prog = env::var("MAKE").unwrap_or_else(|_| "make".to_string()); - let mut cmd = Command::new(prog); - cmd.current_dir(td.path()); - - t!(t!(File::create(td.path().join("Makefile"))).write_all( - b" -all: foo bar -foo: -\techo foo -bar: -\techo bar -" - )); - - // We're leaking one extra token to `make` sort of violating the makefile - // jobserver protocol. It has the desired effect though. - c.configure(&mut cmd); - let output = t!(cmd.output()); - println!( - "\n\t=== stderr\n\t\t{}", - String::from_utf8_lossy(&output.stderr).replace("\n", "\n\t\t") - ); - println!( - "\t=== stdout\n\t\t{}", - String::from_utf8_lossy(&output.stdout).replace("\n", "\n\t\t") - ); - - assert!(output.status.success()); -} - -#[test] -fn zero_client() { - let client = t!(Client::new(0)); - let (tx, rx) = mpsc::channel(); - let helper = client - .into_helper_thread(move |a| drop(tx.send(a))) - .unwrap(); - helper.request_token(); - helper.request_token(); - - for _ in 0..1000 { - assert!(rx.try_recv().is_err()); - } -} +use std::env; +use std::fs::File; +use std::io::prelude::*; +use std::process::Command; +use std::sync::atomic::{AtomicBool, Ordering}; +use std::sync::mpsc; +use std::sync::Arc; +use std::thread; + +use jobserver::Client; + +macro_rules! t { + ($e:expr) => { + match $e { + Ok(e) => e, + Err(e) => panic!("{} failed with {}", stringify!($e), e), + } + }; +} + +#[test] +fn server_smoke() { + let c = t!(Client::new(1)); + drop(c.acquire().unwrap()); + drop(c.acquire().unwrap()); +} + +#[test] +fn server_multiple() { + let c = t!(Client::new(2)); + let a = c.acquire().unwrap(); + let b = c.acquire().unwrap(); + drop((a, b)); +} + +#[test] +fn server_available() { + let c = t!(Client::new(10)); + assert_eq!(c.available().unwrap(), 10); + let a = c.acquire().unwrap(); + assert_eq!(c.available().unwrap(), 9); + drop(a); + assert_eq!(c.available().unwrap(), 10); +} + +#[test] +fn server_none_available() { + let c = t!(Client::new(2)); + assert_eq!(c.available().unwrap(), 2); + let a = c.acquire().unwrap(); + assert_eq!(c.available().unwrap(), 1); + let b = c.acquire().unwrap(); + assert_eq!(c.available().unwrap(), 0); + drop(a); + assert_eq!(c.available().unwrap(), 1); + drop(b); + assert_eq!(c.available().unwrap(), 2); +} + +#[test] +fn server_blocks() { + let c = t!(Client::new(1)); + let a = c.acquire().unwrap(); + let hit = Arc::new(AtomicBool::new(false)); + let hit2 = hit.clone(); + let (tx, rx) = mpsc::channel(); + let t = thread::spawn(move || { + tx.send(()).unwrap(); + let _b = c.acquire().unwrap(); + hit2.store(true, Ordering::SeqCst); + }); + rx.recv().unwrap(); + assert!(!hit.load(Ordering::SeqCst)); + drop(a); + t.join().unwrap(); + assert!(hit.load(Ordering::SeqCst)); +} + +#[test] +fn make_as_a_single_thread_client() { + let c = t!(Client::new(1)); + let td = tempfile::tempdir().unwrap(); + + let prog = env::var("MAKE").unwrap_or_else(|_| "make".to_string()); + let mut cmd = Command::new(prog); + cmd.current_dir(td.path()); + + t!(t!(File::create(td.path().join("Makefile"))).write_all( + b" +all: foo bar +foo: +\techo foo +bar: +\techo bar +" + )); + + // The jobserver protocol means that the `make` process itself "runs with a + // token", so we acquire our one token to drain the jobserver, and this + // should mean that `make` itself never has a second token available to it. + let _a = c.acquire(); + c.configure(&mut cmd); + let output = t!(cmd.output()); + println!( + "\n\t=== stderr\n\t\t{}", + String::from_utf8_lossy(&output.stderr).replace("\n", "\n\t\t") + ); + println!( + "\t=== stdout\n\t\t{}", + String::from_utf8_lossy(&output.stdout).replace("\n", "\n\t\t") + ); + + assert!(output.status.success()); + assert!(output.stderr.is_empty()); + + let stdout = String::from_utf8_lossy(&output.stdout).replace("\r\n", "\n"); + let a = "\ +echo foo +foo +echo bar +bar +"; + let b = "\ +echo bar +bar +echo foo +foo +"; + + assert!(stdout == a || stdout == b); +} + +#[test] +fn make_as_a_multi_thread_client() { + let c = t!(Client::new(1)); + let td = tempfile::tempdir().unwrap(); + + let prog = env::var("MAKE").unwrap_or_else(|_| "make".to_string()); + let mut cmd = Command::new(prog); + cmd.current_dir(td.path()); + + t!(t!(File::create(td.path().join("Makefile"))).write_all( + b" +all: foo bar +foo: +\techo foo +bar: +\techo bar +" + )); + + // We're leaking one extra token to `make` sort of violating the makefile + // jobserver protocol. It has the desired effect though. + c.configure(&mut cmd); + let output = t!(cmd.output()); + println!( + "\n\t=== stderr\n\t\t{}", + String::from_utf8_lossy(&output.stderr).replace("\n", "\n\t\t") + ); + println!( + "\t=== stdout\n\t\t{}", + String::from_utf8_lossy(&output.stdout).replace("\n", "\n\t\t") + ); + + assert!(output.status.success()); +} + +#[test] +fn zero_client() { + let client = t!(Client::new(0)); + let (tx, rx) = mpsc::channel(); + let helper = client + .into_helper_thread(move |a| drop(tx.send(a))) + .unwrap(); + helper.request_token(); + helper.request_token(); + + for _ in 0..1000 { + assert!(rx.try_recv().is_err()); + } +} diff -Nru temporalio-1.3.0/vendor/libc/build.rs temporalio-1.3.0/vendor/libc/build.rs --- temporalio-1.3.0/vendor/libc/build.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/libc/build.rs 2023-10-30 19:40:00.000000000 +0000 @@ -7,7 +7,6 @@ // need to know all the possible cfgs that this script will set. If you need to set another cfg // make sure to add it to this list as well. const ALLOWED_CFGS: &'static [&'static str] = &[ - "emscripten_new_stat_abi", "freebsd10", "freebsd11", "freebsd12", @@ -33,12 +32,9 @@ // Extra values to allow for check-cfg. const CHECK_CFG_EXTRA: &'static [(&'static str, &'static [&'static str])] = &[ - ("target_os", &["switch", "aix", "ohos", "hurd"]), + ("target_os", &["switch", "aix", "ohos"]), ("target_env", &["illumos", "wasi", "aix", "ohos"]), - ( - "target_arch", - &["loongarch64", "mips32r6", "mips64r6", "csky"], - ), + ("target_arch", &["loongarch64"]), ]; fn main() { @@ -73,12 +69,6 @@ Some(_) | None => set_cfg("freebsd11"), } - match emcc_version_code() { - Some(v) if (v >= 30142) => set_cfg("emscripten_new_stat_abi"), - // Non-Emscripten or version < 3.1.42. - Some(_) | None => (), - } - // On CI: deny all warnings if libc_ci { set_cfg("libc_deny_warnings"); @@ -248,33 +238,6 @@ } } -fn emcc_version_code() -> Option { - let output = std::process::Command::new("emcc") - .arg("-dumpversion") - .output() - .ok(); - if output.is_none() { - return None; - } - let output = output.unwrap(); - if !output.status.success() { - return None; - } - - let stdout = String::from_utf8(output.stdout).ok(); - if stdout.is_none() { - return None; - } - let version = stdout.unwrap(); - let mut pieces = version.trim().split('.'); - - let major = pieces.next().and_then(|x| x.parse().ok()).unwrap_or(0); - let minor = pieces.next().and_then(|x| x.parse().ok()).unwrap_or(0); - let patch = pieces.next().and_then(|x| x.parse().ok()).unwrap_or(0); - - Some(major * 10000 + minor * 100 + patch) -} - fn set_cfg(cfg: &str) { if !ALLOWED_CFGS.contains(&cfg) { panic!("trying to set cfg {}, but it is not in ALLOWED_CFGS", cfg); diff -Nru temporalio-1.3.0/vendor/libc/.cargo-checksum.json temporalio-1.3.0/vendor/libc/.cargo-checksum.json --- temporalio-1.3.0/vendor/libc/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/libc/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"CONTRIBUTING.md":"bdc90b52cf803faac96e594069a86dd8ea150d5ba7fb3e6cadfc08dac4c7b0ce","Cargo.toml":"1fe212ccdaf53e0074061bfb94700b80479fc54cdf1e3e8b1c5a4ef12977cf0a","LICENSE-APACHE":"62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a","LICENSE-MIT":"a8d47ff51ca256f56a8932dba07660672dbfe3004257ca8de708aac1415937a1","README.md":"ecc47e284f8d007fc048666d5108dd41cdc440ab9eedfe8c47d1634613522787","build.rs":"12534abf4fcbb56ca25823f75fcbc75ab9e11f81519baa03d82f4a4e873339b0","rustfmt.toml":"eaa2ea84fc1ba0359b77680804903e07bb38d257ab11986b95b158e460f787b2","src/fixed_width_ints.rs":"7f986e5f5e68d25ef04d386fd2f640e8be8f15427a8d4a458ea01d26b8dca0ca","src/fuchsia/aarch64.rs":"893fcec48142d273063ffd814dca33fbec92205fd39ada97075f85201d803996","src/fuchsia/align.rs":"ae1cf8f011a99737eabeb14ffff768e60f13b13363d7646744dbb0f443dab3d6","src/fuchsia/mod.rs":"baa0b7c7fadcee5ea91a693138a214de17eed1c592096035a9f4c565ecea9d92","src/fuchsia/no_align.rs":"303f3f1b255e0088b5715094353cf00476131d8e94e6aebb3f469557771c8b8a","src/fuchsia/riscv64.rs":"617cd75e79e0e20f664db764a4dc2a396d9fd11a4d95371acd91ed4811293b11","src/fuchsia/x86_64.rs":"93a3632b5cf67d2a6bcb7dc0a558605252d5fe689e0f38d8aa2ec5852255ac87","src/hermit/aarch64.rs":"86048676e335944c37a63d0083d0f368ae10ceccefeed9debb3bbe08777fc682","src/hermit/mod.rs":"2d04cfa0d55dc0a2e36fdc4a45819b9d3722af19bb1932778b44feb4c2f81036","src/hermit/x86_64.rs":"ab832b7524e5fb15c49ff7431165ab1a37dc4667ae0b58e8306f4c539bfa110c","src/lib.rs":"eb01b3a4b59a629a527d4f9e11027dee0510171c1395b970ddbb47a899221a88","src/macros.rs":"b457eb028b8e8ab3c24bb7292b874ad4e491edbb83594f6a3da024df5348c088","src/psp.rs":"dd31aabd46171d474ec5828372e28588935120e7355c90c105360d8fa9264c1c","src/sgx.rs":"16a95cdefc81c5ee00d8353a60db363c4cc3e0f75abcd5d0144723f2a306ed1b","src/solid/aarch64.rs":"a726e47f324adf73a4a0b67a2c183408d0cad105ae66acf36db37a42ab7f8707","src/solid/arm.rs":"e39a4f74ebbef3b97b8c95758ad741123d84ed3eb48d9cf4f1f4872097fc27fe","src/solid/mod.rs":"5f4151dca5132e4b4e4c23ab9737e12856dddbdc0ca3f7dbc004328ef3c8acde","src/switch.rs":"9da3dd39b3de45a7928789926e8572d00e1e11a39e6f7289a1349aadce90edba","src/teeos/mod.rs":"423614a3916abcdc34c948764510bd73077d4bd20a818ba8bdc413b6b54359ba","src/unix/aix/mod.rs":"db4873bca1ad51d5fcf300c274624a6496e4e5eb7a84c714e473b8bf86f7d7df","src/unix/aix/powerpc64.rs":"cf374d81139d45f9d77c6a764f640bfbf7e0a5903689652c8296f8e10d55169b","src/unix/align.rs":"2cdc7c826ef7ae61f5171c5ae8c445a743d86f1a7f2d9d7e4ceeec56d6874f65","src/unix/bsd/apple/b32/align.rs":"ec833a747866fe19ca2d9b4d3c9ff0385faba5edf4bd0d15fa68884c40b0e26c","src/unix/bsd/apple/b32/mod.rs":"2546ad3eb6aecb95f916648bc63264117c92b4b4859532b34cb011e4c75a5a72","src/unix/bsd/apple/b64/aarch64/align.rs":"2eaf0f561a32bdcbf4e0477c8895d5e7bcb5cdebd5fef7b4df2ca8e38e144d94","src/unix/bsd/apple/b64/aarch64/mod.rs":"44c217a4f263afe7a97435de9323d20a96c37836f899ca0925306d4b7e073c27","src/unix/bsd/apple/b64/align.rs":"ec833a747866fe19ca2d9b4d3c9ff0385faba5edf4bd0d15fa68884c40b0e26c","src/unix/bsd/apple/b64/mod.rs":"f5e278a1af7fb358891d1c9be4eb7e815aaca0c5cb738d0c3604ba2208a856f7","src/unix/bsd/apple/b64/x86_64/align.rs":"ec833a747866fe19ca2d9b4d3c9ff0385faba5edf4bd0d15fa68884c40b0e26c","src/unix/bsd/apple/b64/x86_64/mod.rs":"8c87c5855038aae5d433c8f5eb3b29b0a175879a0245342b3bfd83bdf4cfd936","src/unix/bsd/apple/long_array.rs":"3cf1f19b812e6d093c819dc65ce55b13491963e0780eda0d0bd1577603e81948","src/unix/bsd/apple/mod.rs":"1aa886e811accd4d32dc20f3d83e7f0367a591e1a556f2c9924924327173bae5","src/unix/bsd/freebsdlike/dragonfly/errno.rs":"8295b8bb0dfd38d2cdb4d9192cdeeb534cc6c3b208170e64615fa3e0edb3e578","src/unix/bsd/freebsdlike/dragonfly/mod.rs":"f2e78625fe1eb14f43e730a3987eba888cb8ac04c23008e7c2d2f7c72258b9e6","src/unix/bsd/freebsdlike/freebsd/aarch64.rs":"6c8e216385f53a4bf5f171749b57602fc34a4e4b160a44ca31c058cb0c8a2126","src/unix/bsd/freebsdlike/freebsd/arm.rs":"59d6a670eea562fb87686e243e0a84603d29a2028a3d4b3f99ccc01bd04d2f47","src/unix/bsd/freebsdlike/freebsd/freebsd11/b64.rs":"9808d152c1196aa647f1b0f0cf84dac8c930da7d7f897a44975545e3d9d17681","src/unix/bsd/freebsdlike/freebsd/freebsd11/mod.rs":"e243ae0e89623d4fa9f85afe14369cc5fd5f2028ea715773dbec722ba80dac1f","src/unix/bsd/freebsdlike/freebsd/freebsd12/b64.rs":"61cbe45f8499bedb168106b686d4f8239472f25c7553b069eec2afe197ff2df6","src/unix/bsd/freebsdlike/freebsd/freebsd12/mod.rs":"bef9fae288a4f29e941ea369be1cd20b170040e60665a4d49a4a9e79009b72d8","src/unix/bsd/freebsdlike/freebsd/freebsd12/x86_64.rs":"2df36a7f122f6d6e5753cfb4d22e915cc80f6bc91c0161b3daae55a481bfd052","src/unix/bsd/freebsdlike/freebsd/freebsd13/b64.rs":"61cbe45f8499bedb168106b686d4f8239472f25c7553b069eec2afe197ff2df6","src/unix/bsd/freebsdlike/freebsd/freebsd13/mod.rs":"3c514e037694ce22724abb3c9c4687defda7f0e3456b615ca73593e860e38b16","src/unix/bsd/freebsdlike/freebsd/freebsd13/x86_64.rs":"2df36a7f122f6d6e5753cfb4d22e915cc80f6bc91c0161b3daae55a481bfd052","src/unix/bsd/freebsdlike/freebsd/freebsd14/b64.rs":"61cbe45f8499bedb168106b686d4f8239472f25c7553b069eec2afe197ff2df6","src/unix/bsd/freebsdlike/freebsd/freebsd14/mod.rs":"318abe48bfdd1c74ecd6afbd6c9329c5c72ce4f7d420edd6be2fc12b223ae32f","src/unix/bsd/freebsdlike/freebsd/freebsd14/x86_64.rs":"e7b5863e222d6cc416b6b0fbe71690fad909e899b4c4ae810bbca117e4fcb650","src/unix/bsd/freebsdlike/freebsd/mod.rs":"2ecf34df11f40b2ba1f3a9ee2d2ec170b2a5c5f358b40a5baffa51eb41e111f8","src/unix/bsd/freebsdlike/freebsd/powerpc.rs":"9ca3f82f88974e6db5569f2d76a5a3749b248a31747a6c0da5820492bdfeca42","src/unix/bsd/freebsdlike/freebsd/powerpc64.rs":"2dae3ecc87eac3b11657aa98915def55fc4b5c0de11fe26aae23329a54628a9a","src/unix/bsd/freebsdlike/freebsd/riscv64.rs":"fa4bed4c58cad24ba3395941c7fa6b11e089551a04714f9561078e400f5b2b62","src/unix/bsd/freebsdlike/freebsd/x86.rs":"6766e2ce85e187b306cd3b0b8d7e15b8f4042c5cff81d89b3af69ecc99c70ab0","src/unix/bsd/freebsdlike/freebsd/x86_64/align.rs":"0e1f69a88fca1c32874b1daf5db3d446fefbe518dca497f096cc9168c39dde70","src/unix/bsd/freebsdlike/freebsd/x86_64/mod.rs":"51e4dd0c8ae247bb652feda5adad9333ea3bb30c750c3a3935e0b0e47d7803eb","src/unix/bsd/freebsdlike/mod.rs":"a27b222ec24763266413e7a82000d3250654a03f8cec892114b9acfa1572dd6d","src/unix/bsd/mod.rs":"dad51a24a524e92bfe9de3ac3b7d394d86058b9b8a1ccd4efa9bbb5c78e7fa1a","src/unix/bsd/netbsdlike/mod.rs":"0a66f7de43710e35a6a546e6c39066aa8b91a6efadb71db88738b0a577fd5537","src/unix/bsd/netbsdlike/netbsd/aarch64.rs":"65dcb58d11e8d8028401a9d07ca3eb4cb4f053e04249cc877353449d84ccc4cb","src/unix/bsd/netbsdlike/netbsd/arm.rs":"58cdbb70b0d6f536551f0f3bb3725d2d75c4690db12c26c034e7d6ec4a924452","src/unix/bsd/netbsdlike/netbsd/mod.rs":"1f1beb74c33bd3ad6a5d7aae2afdacf0ccbad0f9dacda2894d2cfdc2414174ae","src/unix/bsd/netbsdlike/netbsd/powerpc.rs":"ee7ff5d89d0ed22f531237b5059aa669df93a3b5c489fa641465ace8d405bf41","src/unix/bsd/netbsdlike/netbsd/sparc64.rs":"9489f4b3e4566f43bb12dfb92238960613dac7f6a45cc13068a8d152b902d7d9","src/unix/bsd/netbsdlike/netbsd/x86.rs":"20692320e36bfe028d1a34d16fe12ca77aa909cb02bda167376f98f1a09aefe7","src/unix/bsd/netbsdlike/netbsd/x86_64.rs":"1afe5ef46b14397cdd68664b5b232e4f5b035b6db1d4cf411c899d51ebca9f30","src/unix/bsd/netbsdlike/openbsd/aarch64.rs":"dd91931d373b7ecaf6e2de25adadee10d16fa9b12c2cbacdff3eb291e1ba36af","src/unix/bsd/netbsdlike/openbsd/arm.rs":"01580d261bc6447bb327a0d982181b7bdabfa066cee65a30373d3ced729ad307","src/unix/bsd/netbsdlike/openbsd/mips64.rs":"8532a189ae10c7d668d9d4065da8b05d124e09bd39442c9f74a7f231c43eca48","src/unix/bsd/netbsdlike/openbsd/mod.rs":"522fbce33ae600333b81a4ae04515633f8d9373dad7b3a085335f1dfb9d4c6fa","src/unix/bsd/netbsdlike/openbsd/powerpc.rs":"01580d261bc6447bb327a0d982181b7bdabfa066cee65a30373d3ced729ad307","src/unix/bsd/netbsdlike/openbsd/powerpc64.rs":"1dd5449dd1fd3d51e30ffdeeaece91d0aaf05c710e0ac699fecc5461cfa2c28e","src/unix/bsd/netbsdlike/openbsd/riscv64.rs":"1dd5449dd1fd3d51e30ffdeeaece91d0aaf05c710e0ac699fecc5461cfa2c28e","src/unix/bsd/netbsdlike/openbsd/sparc64.rs":"d04fd287afbaa2c5df9d48c94e8374a532a3ba491b424ddf018270c7312f4085","src/unix/bsd/netbsdlike/openbsd/x86.rs":"6f7f5c4fde2a2259eb547890cbd86570cea04ef85347d7569e94e679448bec87","src/unix/bsd/netbsdlike/openbsd/x86_64.rs":"d31db31630289c85af3339dbe357998a21ca584cbae31607448fe2cf7675a4e1","src/unix/haiku/b32.rs":"a2efdbf7158a6da341e1db9176b0ab193ba88b449616239ed95dced11f54d87b","src/unix/haiku/b64.rs":"ff8115367d3d7d354f792d6176dfaaa26353f57056197b563bf4681f91ff7985","src/unix/haiku/mod.rs":"3526293942482ad5368f02aa45c961ad4482be8e8a547226ea5a020364a602dc","src/unix/haiku/native.rs":"dbfcbf4954a79d1df2ff58e0590bbcb8c57dfc7a32392aa73ee4726b66bd6cc8","src/unix/haiku/x86_64.rs":"3ec3aeeb7ed208b8916f3e32d42bfd085ff5e16936a1a35d9a52789f043b7237","src/unix/hurd/align.rs":"03c79b2cd8270ebd0cf93cb475a8f1ff85b28175ea0de007ede17cad94a89b03","src/unix/hurd/b32.rs":"851f7e1ad0ca4e44628292e203755624f41e0cbccd64e6f70802f01f6fd4c6dc","src/unix/hurd/b64.rs":"0c957bd3c8e2cf1ad6723fa2c98b5340571c3dcee44fc5cdd9e9a7148ef23a61","src/unix/hurd/mod.rs":"214c0e4048124d64fb5d8dd4067b6dbd22fcbfd50d56a1e54c1f1af4fed1c7ef","src/unix/hurd/no_align.rs":"03c79b2cd8270ebd0cf93cb475a8f1ff85b28175ea0de007ede17cad94a89b03","src/unix/linux_like/android/b32/arm.rs":"ce582de7e983a33d3bfad13075c53aac9016cee35f06ad8653ee9072c3ec2564","src/unix/linux_like/android/b32/mod.rs":"7c173e0375119bf06a3081652faede95e5bcd6858e7576b7533d037978737c8f","src/unix/linux_like/android/b32/x86/align.rs":"812914e4241df82e32b12375ca3374615dc3a4bdd4cf31f0423c5815320c0dab","src/unix/linux_like/android/b32/x86/mod.rs":"e6d107efbcd37b5b85dfa18f683300cbf768ffa0237997a9fa52b184a53323ac","src/unix/linux_like/android/b64/aarch64/align.rs":"2179c3b1608fa4bf68840482bfc2b2fa3ee2faf6fcae3770f9e505cddca35c7b","src/unix/linux_like/android/b64/aarch64/int128.rs":"1735f6f5c56770d20dd426442f09724d9b2052b46a7cd82f23f3288a4a7276de","src/unix/linux_like/android/b64/aarch64/mod.rs":"10e963e29ff209703de6336c99cca96fd79789438d34c82a693eae56e8916c3c","src/unix/linux_like/android/b64/mod.rs":"71e4fcbe952bfa4a5f9022f3972e906917b38f729b9d8ef57cd5d179104894ac","src/unix/linux_like/android/b64/riscv64/align.rs":"0bf138f84e5327d8339bcd4adf071a6832b516445e597552c82bbd881095e3a8","src/unix/linux_like/android/b64/riscv64/mod.rs":"19d4bf2237c47127eba9144e0b82e995bc079315e719179a91813b0ae7b0e49d","src/unix/linux_like/android/b64/x86_64/align.rs":"7169d07a9fd4716f7512719aec9fda5d8bed306dc0720ffc1b21696c9951e3c6","src/unix/linux_like/android/b64/x86_64/mod.rs":"4ec2de11a9b65c4325b7b991f0b99a414975e0e61ba8668caca5d921e9b314d1","src/unix/linux_like/android/mod.rs":"74992c64761e51d2222518f50622c42b0f0f21c78f484352ec2428126a9a8e21","src/unix/linux_like/emscripten/align.rs":"86c95cbed7a7161b1f23ee06843e7b0e2340ad92b2cb86fe2a8ef3e0e8c36216","src/unix/linux_like/emscripten/lfs64.rs":"3776af30a758d765a88920ec4fde442ab89040da13d3b3625c7fbcb8a958559f","src/unix/linux_like/emscripten/mod.rs":"e447d3f5e5840c0431496359164e724a8f254c68483ef842192b44e9f237d020","src/unix/linux_like/emscripten/no_align.rs":"0128e4aa721a9902754828b61b5ec7d8a86619983ed1e0544a85d35b1051fad6","src/unix/linux_like/linux/align.rs":"bc5abcd38e2320171e0981e773c9c5fe3e0d5a66fdff049228f6a1acad80ef8b","src/unix/linux_like/linux/arch/generic/mod.rs":"55ed968a3b656a6e0c67759ac3637a6b3ba2c1001333e23bd7a2f95ce8ba6563","src/unix/linux_like/linux/arch/mips/mod.rs":"b81b4cd040360a77079597ca221159fb17461145786ebfff4d979ae0b0c3344a","src/unix/linux_like/linux/arch/mod.rs":"5bd5361f8a6ab4e18bbba6da9f92c164ae252b15a0ed10064812544aa1fdf198","src/unix/linux_like/linux/arch/powerpc/mod.rs":"e868a956f7c982b6dfbd56962c5f6803d0b9af3b2e977ce56501e3edbc233ce7","src/unix/linux_like/linux/arch/sparc/mod.rs":"737e3b4554e132d88700f3cd35aad60a1a5308ad295b87569a15c0b0b6cb6d48","src/unix/linux_like/linux/gnu/align.rs":"e4a3c27fe20a57b8d612c34cb05bc70646edb5cec7251957315afa53a7b9f936","src/unix/linux_like/linux/gnu/b32/arm/align.rs":"6ec0eb3ee93f7ae99fd714b4deabfb5e97fbcefd8c26f5a45fb8e7150899cdeb","src/unix/linux_like/linux/gnu/b32/arm/mod.rs":"9ab3e97b579a9122690cd01026e14528862860346b700aafbb755a7e04054f7f","src/unix/linux_like/linux/gnu/b32/csky/align.rs":"3fed009dc9af3cc81be7087da9d2d7d1f39845e4497e290259c5cdbae25f039d","src/unix/linux_like/linux/gnu/b32/csky/mod.rs":"4c21d6e7463bb22f00b984294893d12c84018d5d26ec661d6a30f4a9625ba639","src/unix/linux_like/linux/gnu/b32/m68k/align.rs":"8faa92f77a9232c035418d45331774e64a9a841d99c91791570a203bf2b45bcb","src/unix/linux_like/linux/gnu/b32/m68k/mod.rs":"6aab7f1b864e9691d14aa7d389f717c4077b8eed72a7f11e3b8c7fef245e4046","src/unix/linux_like/linux/gnu/b32/mips/align.rs":"429fb5e005cb7143602d430098b6ebfb7d360685b194f333dfd587472ae954ee","src/unix/linux_like/linux/gnu/b32/mips/mod.rs":"6b9a5dac6f937ddc1453e808e3c43502c87143332df9e43ac64fb8b1eda6c116","src/unix/linux_like/linux/gnu/b32/mod.rs":"b56625dd20dd48a8699034d349ef089c540c0ddcbf8a3481d598d101f8b40b78","src/unix/linux_like/linux/gnu/b32/powerpc.rs":"5c5d90326b54b57b98eff4745fe7a3fb02f053b2dc782241a73e807b491936a3","src/unix/linux_like/linux/gnu/b32/riscv32/align.rs":"d321491612be8d5c61b6ec2dc0111beb3a22e58803f99cd37543efe86621b119","src/unix/linux_like/linux/gnu/b32/riscv32/mod.rs":"491a9a97cf712985b75d3ad714691ef60898d88c78bc386a6917de0a6774cc26","src/unix/linux_like/linux/gnu/b32/sparc/align.rs":"21adbed27df73e2d1ed934aaf733a643003d7baf2bde9c48ea440895bcca6d41","src/unix/linux_like/linux/gnu/b32/sparc/mod.rs":"80894eece66e9348f45d1b07ad37c757ea694bbd10ed49d3f920b34e9f51a9a3","src/unix/linux_like/linux/gnu/b32/x86/align.rs":"e4bafdc4a519a7922a81b37a62bbfd1177a2f620890eef8f1fbc47162e9eb413","src/unix/linux_like/linux/gnu/b32/x86/mod.rs":"c703cc5e9de2dc31d9e5831bfb6f354d6e3518b2ae02263f68a9a70f1c0167e2","src/unix/linux_like/linux/gnu/b64/aarch64/align.rs":"fdf1c72375a2167699157e0dd825422690bb6719f7bc69515a2e5846d0431d7c","src/unix/linux_like/linux/gnu/b64/aarch64/fallback.rs":"832e7487249c1c0bb6e9911ce3f7d32ca22378e42392ab83c56915cbc59d8be3","src/unix/linux_like/linux/gnu/b64/aarch64/ilp32.rs":"bf4611b737813deef6787babf6c01698605f3b75482269b8546318667bc68e29","src/unix/linux_like/linux/gnu/b64/aarch64/int128.rs":"1735f6f5c56770d20dd426442f09724d9b2052b46a7cd82f23f3288a4a7276de","src/unix/linux_like/linux/gnu/b64/aarch64/lp64.rs":"11a950697fdda0258c6e37c6b13993348c8de4134105ed4faa79358e53175072","src/unix/linux_like/linux/gnu/b64/aarch64/mod.rs":"172495fbfdf659b9b825148bffc2b62704f63fc872428617e868eb15802c9978","src/unix/linux_like/linux/gnu/b64/loongarch64/align.rs":"060aa33cc737966c691aab8511c5c5729e551458ce18d0e284e0d45f39beeb60","src/unix/linux_like/linux/gnu/b64/loongarch64/mod.rs":"dc29dfdadd754ec355b82a7ca6636de7ed97f7ba98f132b71cb49f39d6bd8e3f","src/unix/linux_like/linux/gnu/b64/mips64/align.rs":"7169d07a9fd4716f7512719aec9fda5d8bed306dc0720ffc1b21696c9951e3c6","src/unix/linux_like/linux/gnu/b64/mips64/mod.rs":"628c410b9aaec3c8f43838a28616b577a1d6de60a9799b09bb884d80281f96eb","src/unix/linux_like/linux/gnu/b64/mod.rs":"6a160ef25439c4fecdb0e3bd0b818742263c791364da874d4febd3aa644ec8e2","src/unix/linux_like/linux/gnu/b64/powerpc64/align.rs":"e29c4868bbecfa4a6cd8a2ad06193f3bbc78a468cc1dc9df83f002f1268130d9","src/unix/linux_like/linux/gnu/b64/powerpc64/mod.rs":"c778a136f06c2ffeacea19fa14ce79b828f91b67a002dec5ce87289bae36234e","src/unix/linux_like/linux/gnu/b64/riscv64/align.rs":"d321491612be8d5c61b6ec2dc0111beb3a22e58803f99cd37543efe86621b119","src/unix/linux_like/linux/gnu/b64/riscv64/mod.rs":"c8f07efc5ddd5d874f1ebc329cd6907818d132ac3e30f4f2a4b04be3fb388551","src/unix/linux_like/linux/gnu/b64/s390x.rs":"a2fd9277c2dcf76f7a16a3bcca745d5a9932c765c0dc2feb31c3641be25eb0aa","src/unix/linux_like/linux/gnu/b64/sparc64/align.rs":"e29c4868bbecfa4a6cd8a2ad06193f3bbc78a468cc1dc9df83f002f1268130d9","src/unix/linux_like/linux/gnu/b64/sparc64/mod.rs":"e8047e9966a2b90063e0151a0278c54885e7b323286cf5ab55cbaf151fc772d3","src/unix/linux_like/linux/gnu/b64/x86_64/align.rs":"62e822478356db4a73b6bbd1b36d825b893939ab4b308ec11b0578bcc4b49769","src/unix/linux_like/linux/gnu/b64/x86_64/mod.rs":"891e595d33714b9883b92f0554d1d361fba2b6c3f6cac09a288252f44c6ec667","src/unix/linux_like/linux/gnu/b64/x86_64/not_x32.rs":"38f74ce15d9662ce4818815a2b87be1618d5e45f190f7e4db84ff3285b4421fb","src/unix/linux_like/linux/gnu/b64/x86_64/x32.rs":"b20218a11364a6dec87f96d6c0d8b19e660697ab09ad5ee0e9b3a9dafedaaebb","src/unix/linux_like/linux/gnu/mod.rs":"b7f0a667068029792d40d1b2f2f6e476ef7648168d8968e98e46103f9b5f8d46","src/unix/linux_like/linux/gnu/no_align.rs":"9cd223135de75315840ff9c3fd5441ba1cb632b96b5c85a76f8316c86653db25","src/unix/linux_like/linux/mod.rs":"1be939b604c8a12d88480b03843959ec288311946ba59dadf73f8481c1c3f072","src/unix/linux_like/linux/musl/b32/arm/align.rs":"3e8ac052c1043764776b54c93ba4260e061df998631737a897d9d47d54f7b80c","src/unix/linux_like/linux/musl/b32/arm/mod.rs":"f5b217a93f99c2852f7fd1459f529798372fa7df84ee0cfd3d8cdd5b2021b8cf","src/unix/linux_like/linux/musl/b32/hexagon.rs":"63412fb322c1f13f30b131d9bd5bafd7b9aed6feeaba790a18cd510643bd58b5","src/unix/linux_like/linux/musl/b32/mips/align.rs":"429fb5e005cb7143602d430098b6ebfb7d360685b194f333dfd587472ae954ee","src/unix/linux_like/linux/musl/b32/mips/mod.rs":"16f614dd59695497a01b542deacd1669335678bdd0b14d16dde482fb5c4e02f4","src/unix/linux_like/linux/musl/b32/mod.rs":"31677597fd9544c4b1ec1477628288f6273fabbc06e38f33da862ad55f019ce1","src/unix/linux_like/linux/musl/b32/powerpc.rs":"ebf73f570b11512adc4a7b513aedff02a55125ead167fe5dbd45c39afb87cddb","src/unix/linux_like/linux/musl/b32/riscv32/align.rs":"efd2accf33b87de7c7547903359a5da896edc33cd6c719552c7474b60d4a5d48","src/unix/linux_like/linux/musl/b32/riscv32/mod.rs":"7b067c7989a80e35daa9987af799d97dd1fb3df71ef82285137f51fbad2354d9","src/unix/linux_like/linux/musl/b32/x86/align.rs":"08e77fbd7435d7dec2ff56932433bece3f02e47ce810f89004a275a86d39cbe1","src/unix/linux_like/linux/musl/b32/x86/mod.rs":"de632ac323bd2bb4f83d4826d6eb7e29d4b0e6293aa0c4cb9c99ef0fcabc71b7","src/unix/linux_like/linux/musl/b64/aarch64/align.rs":"6ba32725d24d7d8e6aa111f3b57aafa318f83b606abe96561329151829821133","src/unix/linux_like/linux/musl/b64/aarch64/int128.rs":"1735f6f5c56770d20dd426442f09724d9b2052b46a7cd82f23f3288a4a7276de","src/unix/linux_like/linux/musl/b64/aarch64/mod.rs":"31e75179cbb4e26425b3f5b052e358f593153da662884655e60801d852e55dc2","src/unix/linux_like/linux/musl/b64/mips64.rs":"9a5d29f666332bb056d0e2951e9de989aa1dc016075f009db3f2f628e0cdda8c","src/unix/linux_like/linux/musl/b64/mod.rs":"884243eb5af7df963d858d5baf47e622b45f04e0ae701728b134e986191b614b","src/unix/linux_like/linux/musl/b64/powerpc64.rs":"e77f4cf5d65320023043e4354725397f6b079c1b7b6b3cef2c3293350b46b303","src/unix/linux_like/linux/musl/b64/riscv64/align.rs":"d321491612be8d5c61b6ec2dc0111beb3a22e58803f99cd37543efe86621b119","src/unix/linux_like/linux/musl/b64/riscv64/mod.rs":"a80b1813148dec8bc396c02638978c0b4e5e040edafd56d98f8683fe2ae51ab5","src/unix/linux_like/linux/musl/b64/s390x.rs":"80a92e54e47016d051c7bd55bee9580cbedd298164199d71a67d49167e744432","src/unix/linux_like/linux/musl/b64/x86_64/align.rs":"77309276ad7a42cbe59ca381f23590b7a143aded05555b34a5b307b808cbca6e","src/unix/linux_like/linux/musl/b64/x86_64/mod.rs":"032863c74d3ca73cb75483218f9bd774ae1ae7d3646d2ffb21e4cc7d4b5e0e3d","src/unix/linux_like/linux/musl/lfs64.rs":"3e4fb381f3a0756520bde0f1692d4fa45e4ae8133bf7d7c64b0e3fdd512f235f","src/unix/linux_like/linux/musl/mod.rs":"f79e4d7bef14f422c6a77f1573ff503a82305bfa5ac3e4c6f571c09212b75620","src/unix/linux_like/linux/no_align.rs":"62cdca0e011937aaf09a51ca86d9f0ee0fdb05f61ec3c058e6a5d5fa6357d784","src/unix/linux_like/linux/non_exhaustive.rs":"181a05bf94fdb911db83ce793b993bd6548a4115b306a7ef3c10f745a8fea3e9","src/unix/linux_like/linux/uclibc/align.rs":"9ed16138d8e439bd90930845a65eafa7ebd67366e6bf633936d44014f6e4c959","src/unix/linux_like/linux/uclibc/arm/align.rs":"e4a3c27fe20a57b8d612c34cb05bc70646edb5cec7251957315afa53a7b9f936","src/unix/linux_like/linux/uclibc/arm/mod.rs":"50288ff9e411ab0966da24838f2c2a5618021bc19c422a04f577b2979ef4081e","src/unix/linux_like/linux/uclibc/arm/no_align.rs":"9cd223135de75315840ff9c3fd5441ba1cb632b96b5c85a76f8316c86653db25","src/unix/linux_like/linux/uclibc/mips/mips32/align.rs":"e4a3c27fe20a57b8d612c34cb05bc70646edb5cec7251957315afa53a7b9f936","src/unix/linux_like/linux/uclibc/mips/mips32/mod.rs":"d0c4434e2bf813372c418a8f516c706cdccc9f7be2f0921b2207b0afdb66fe81","src/unix/linux_like/linux/uclibc/mips/mips32/no_align.rs":"9cd223135de75315840ff9c3fd5441ba1cb632b96b5c85a76f8316c86653db25","src/unix/linux_like/linux/uclibc/mips/mips64/align.rs":"a7bdcb18a37a2d91e64d5fad83ea3edc78f5412adb28f77ab077dbb26dd08b2d","src/unix/linux_like/linux/uclibc/mips/mips64/mod.rs":"3f38ee6a4690b9d7594be20d216467a34d955f7653c2c8ce1e6147daeb53f1e0","src/unix/linux_like/linux/uclibc/mips/mips64/no_align.rs":"4a18e3875698c85229599225ac3401a2a40da87e77b2ad4ef47c6fcd5a24ed30","src/unix/linux_like/linux/uclibc/mips/mod.rs":"a048fce1c2d9b1ad57305642e8ad05ca0f0c7e4753267a2e2d6b4fee5db3b072","src/unix/linux_like/linux/uclibc/mod.rs":"1c3d25cddcfefa2bd17bdc81550826be31a08eef235e13f825f169a5029c8bca","src/unix/linux_like/linux/uclibc/no_align.rs":"3f28637046524618adaa1012e26cb7ffe94b9396e6b518cccdc69d59f274d709","src/unix/linux_like/linux/uclibc/x86_64/l4re.rs":"024eba5753e852dbdd212427351affe7e83f9916c1864bce414d7aa2618f192e","src/unix/linux_like/linux/uclibc/x86_64/mod.rs":"196d03affbefb85716937c15904831e731eb222ee906e05e42102d639a8152ea","src/unix/linux_like/linux/uclibc/x86_64/other.rs":"42c3f71e58cabba373f6a55a623f3c31b85049eb64824c09c2b082b3b2d6a0a8","src/unix/linux_like/mod.rs":"26321ca3d882a7a5b88c83f6019801324474f1a0df5adabb2e0d3a65a483f5cd","src/unix/mod.rs":"2c778b44b07a66151898caeb4b3a70d43dfbb84177ce3c30d1382f3b21644dfe","src/unix/newlib/aarch64/mod.rs":"964c096288da836b53c0c71d7f3a97048d177da220a69314c5ce93ba330d72af","src/unix/newlib/align.rs":"28aaf87fafbc6b312622719d472d8cf65f9e5467d15339df5f73e66d8502b28a","src/unix/newlib/arm/mod.rs":"cf754f8b1197489fca01e881a4b4b146e814998e4b365f116fa1a102c00e6a4e","src/unix/newlib/espidf/mod.rs":"29969da41f0042197b21cfa7c0ad2244b4519ecab0fb7de3d0a7655b4f3937e1","src/unix/newlib/generic.rs":"5f0b5d07ddb5a5d60580f9561fdb05e9218d9751d4068c4aadad2ba6b950aabf","src/unix/newlib/horizon/mod.rs":"3a521d22bf932fc01c1d26d1f9bff20f11b1855b03c8236a8eb18310f6cab5a8","src/unix/newlib/mod.rs":"e5d5faf27a6336b9f1c02b8726427801d906a14dae766852b4e85c1a92df06c8","src/unix/newlib/no_align.rs":"e0743b2179495a9514bc3a4d1781e492878c4ec834ee0085d0891dd1712e82fb","src/unix/newlib/powerpc/mod.rs":"cc9e188711b9bf614323ad6c48e0d2e1a1ecc5d3bc64961ba451f29c6c22d2d8","src/unix/newlib/vita/mod.rs":"d849a01841744ea5e04635c8f69c9e2b44791320eb9d629b9d0fee0a4c5d502a","src/unix/no_align.rs":"c06e95373b9088266e0b14bba0954eef95f93fb2b01d951855e382d22de78e53","src/unix/nto/aarch64.rs":"4709c9afdc8d583be876598e7c238499ee3e8da5bd2baa614d9c7dd414851555","src/unix/nto/mod.rs":"8cacb926904eb9c901ba27d9914e62b7d5e88fc1001cdf0e392666e0f331f327","src/unix/nto/neutrino.rs":"799bff4ab01a6424db6c5a2b76aa5679826d41495f9d13c63485bf13bc80026b","src/unix/nto/x86_64.rs":"a3e18e93c2999da1cd7a6f748a4b60c07aefb73d8ea2aafec19a84cfb040bc8e","src/unix/redox/mod.rs":"6247f774a6ed3c13bca311b711cfca657b42e200a72f1d662d447e36cb94ca2f","src/unix/solarish/compat.rs":"00f1ee3faec9da69204e42f025f6735dd13d894071a154425dcc43ecbdd06e7f","src/unix/solarish/illumos.rs":"cd93c2d84722bbf9933a92842a8998eb0b2afc962f50bc2546ad127b82809fa7","src/unix/solarish/mod.rs":"b1660c631a599a3355116e7485b88ab2f8f2929c2e37851a763431387b902f14","src/unix/solarish/solaris.rs":"41b350a89ddf01cd12a10f93640f92be53be0b0d976021cdc08da17bf3e72edf","src/unix/solarish/x86.rs":"e86e806df0caed72765040eaa2f3c883198d1aa91508540adf9b7008c77f522e","src/unix/solarish/x86_64.rs":"ec2b01f194eb8a6a27133c57681da195a949e03098f3ea1e847227a9c09ef5fc","src/unix/solarish/x86_common.rs":"ac869d9c3c95645c22460468391eb1982023c3a8e02b9e06a72e3aef3d5f1eac","src/vxworks/aarch64.rs":"98f0afdc511cd02557e506c21fed6737585490a1dce7a9d4941d08c437762b99","src/vxworks/arm.rs":"acb7968ce99fe3f4abdf39d98f8133d21a4fba435b8ef7084777cb181d788e88","src/vxworks/mod.rs":"e4edcbcf43a325e738c9465507594d0c87abf3f0e2b9b046c1425f8d44bdad0f","src/vxworks/powerpc.rs":"acb7968ce99fe3f4abdf39d98f8133d21a4fba435b8ef7084777cb181d788e88","src/vxworks/powerpc64.rs":"98f0afdc511cd02557e506c21fed6737585490a1dce7a9d4941d08c437762b99","src/vxworks/x86.rs":"552f007f38317620b23889cb7c49d1d115841252439060122f52f434fbc6e5ba","src/vxworks/x86_64.rs":"018d92be3ad628a129eff9f2f5dfbc0883d8b8e5f2fa917b900a7f98ed6b514a","src/wasi.rs":"09ee3b3348b212b050f6ca8ae008a28679ea44a375674307a4e7c9ca0d3ed7d5","src/windows/gnu/align.rs":"b2c13ec1b9f3b39a75c452c80c951dff9d0215e31d77e883b4502afb31794647","src/windows/gnu/mod.rs":"3c8c7edb7cdf5d0c44af936db2a94869585c69dfabeef30571b4f4e38375767a","src/windows/mod.rs":"9fdc5e1c62c441abef7bc62a7343efb2041edc24db9ac0efc0f74df55b69e249","src/windows/msvc/mod.rs":"c068271e00fca6b62bc4bf44bcf142cfc38caeded9b6c4e01d1ceef3ccf986f4","src/xous.rs":"eb0675f25ba01f73072d2b70907fb8abb1148facefe5a20756c49250f3d65fae","tests/const_fn.rs":"cb75a1f0864f926aebe79118fc34d51a0d1ade2c20a394e7774c7e545f21f1f4"},"package":"a08173bc88b7955d1b3145aa561539096c421ac8debde8cbc3612ec635fee29b"} \ No newline at end of file +{"files":{"CONTRIBUTING.md":"bdc90b52cf803faac96e594069a86dd8ea150d5ba7fb3e6cadfc08dac4c7b0ce","Cargo.toml":"a1d4350481d43c600687f1921083036db242f3a9e5bc9906d4d469fdfe588d48","LICENSE-APACHE":"62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a","LICENSE-MIT":"a8d47ff51ca256f56a8932dba07660672dbfe3004257ca8de708aac1415937a1","README.md":"ecc47e284f8d007fc048666d5108dd41cdc440ab9eedfe8c47d1634613522787","build.rs":"5bd78d7e4e79b183fb1dab92cd640a611330131d54c479c69adbe87cbdc95ae3","rustfmt.toml":"eaa2ea84fc1ba0359b77680804903e07bb38d257ab11986b95b158e460f787b2","src/fixed_width_ints.rs":"7f986e5f5e68d25ef04d386fd2f640e8be8f15427a8d4a458ea01d26b8dca0ca","src/fuchsia/aarch64.rs":"893fcec48142d273063ffd814dca33fbec92205fd39ada97075f85201d803996","src/fuchsia/align.rs":"ae1cf8f011a99737eabeb14ffff768e60f13b13363d7646744dbb0f443dab3d6","src/fuchsia/mod.rs":"30f4dc83ef120300d61896696512436377c5f36f1431d98ab7e01e498c0c47d5","src/fuchsia/no_align.rs":"303f3f1b255e0088b5715094353cf00476131d8e94e6aebb3f469557771c8b8a","src/fuchsia/riscv64.rs":"617cd75e79e0e20f664db764a4dc2a396d9fd11a4d95371acd91ed4811293b11","src/fuchsia/x86_64.rs":"93a3632b5cf67d2a6bcb7dc0a558605252d5fe689e0f38d8aa2ec5852255ac87","src/hermit/aarch64.rs":"86048676e335944c37a63d0083d0f368ae10ceccefeed9debb3bbe08777fc682","src/hermit/mod.rs":"d3bfce41e4463d4be8020a2d063c9bfa8b665f45f1cc6cbf3163f5d01e7cb21f","src/hermit/x86_64.rs":"ab832b7524e5fb15c49ff7431165ab1a37dc4667ae0b58e8306f4c539bfa110c","src/lib.rs":"24111461547739f3646f95bcb66c43f2ae679a727ff5938299434c522c02e458","src/macros.rs":"b457eb028b8e8ab3c24bb7292b874ad4e491edbb83594f6a3da024df5348c088","src/psp.rs":"dd31aabd46171d474ec5828372e28588935120e7355c90c105360d8fa9264c1c","src/sgx.rs":"16a95cdefc81c5ee00d8353a60db363c4cc3e0f75abcd5d0144723f2a306ed1b","src/solid/aarch64.rs":"a726e47f324adf73a4a0b67a2c183408d0cad105ae66acf36db37a42ab7f8707","src/solid/arm.rs":"e39a4f74ebbef3b97b8c95758ad741123d84ed3eb48d9cf4f1f4872097fc27fe","src/solid/mod.rs":"5f4151dca5132e4b4e4c23ab9737e12856dddbdc0ca3f7dbc004328ef3c8acde","src/switch.rs":"9da3dd39b3de45a7928789926e8572d00e1e11a39e6f7289a1349aadce90edba","src/unix/aix/mod.rs":"54229b5e774669c16912112e8b50fa938db76f534971222a11723a05195a0948","src/unix/aix/powerpc64.rs":"cf374d81139d45f9d77c6a764f640bfbf7e0a5903689652c8296f8e10d55169b","src/unix/align.rs":"2cdc7c826ef7ae61f5171c5ae8c445a743d86f1a7f2d9d7e4ceeec56d6874f65","src/unix/bsd/apple/b32/align.rs":"ec833a747866fe19ca2d9b4d3c9ff0385faba5edf4bd0d15fa68884c40b0e26c","src/unix/bsd/apple/b32/mod.rs":"2546ad3eb6aecb95f916648bc63264117c92b4b4859532b34cb011e4c75a5a72","src/unix/bsd/apple/b64/aarch64/align.rs":"e8eb38d064b5fefec6f37d42873820a0483e7c758ed336cc59a7155455ca89c9","src/unix/bsd/apple/b64/aarch64/mod.rs":"44c217a4f263afe7a97435de9323d20a96c37836f899ca0925306d4b7e073c27","src/unix/bsd/apple/b64/align.rs":"ec833a747866fe19ca2d9b4d3c9ff0385faba5edf4bd0d15fa68884c40b0e26c","src/unix/bsd/apple/b64/mod.rs":"f5e278a1af7fb358891d1c9be4eb7e815aaca0c5cb738d0c3604ba2208a856f7","src/unix/bsd/apple/b64/x86_64/align.rs":"ec833a747866fe19ca2d9b4d3c9ff0385faba5edf4bd0d15fa68884c40b0e26c","src/unix/bsd/apple/b64/x86_64/mod.rs":"8c87c5855038aae5d433c8f5eb3b29b0a175879a0245342b3bfd83bdf4cfd936","src/unix/bsd/apple/long_array.rs":"3cf1f19b812e6d093c819dc65ce55b13491963e0780eda0d0bd1577603e81948","src/unix/bsd/apple/mod.rs":"a6662488273ffff2a097403281db6b5f4cd1a325f7a1582264bb8da0b553a822","src/unix/bsd/freebsdlike/dragonfly/errno.rs":"8295b8bb0dfd38d2cdb4d9192cdeeb534cc6c3b208170e64615fa3e0edb3e578","src/unix/bsd/freebsdlike/dragonfly/mod.rs":"f2e78625fe1eb14f43e730a3987eba888cb8ac04c23008e7c2d2f7c72258b9e6","src/unix/bsd/freebsdlike/freebsd/aarch64.rs":"6c8e216385f53a4bf5f171749b57602fc34a4e4b160a44ca31c058cb0c8a2126","src/unix/bsd/freebsdlike/freebsd/arm.rs":"59d6a670eea562fb87686e243e0a84603d29a2028a3d4b3f99ccc01bd04d2f47","src/unix/bsd/freebsdlike/freebsd/freebsd11/b64.rs":"9808d152c1196aa647f1b0f0cf84dac8c930da7d7f897a44975545e3d9d17681","src/unix/bsd/freebsdlike/freebsd/freebsd11/mod.rs":"e243ae0e89623d4fa9f85afe14369cc5fd5f2028ea715773dbec722ba80dac1f","src/unix/bsd/freebsdlike/freebsd/freebsd12/b64.rs":"61cbe45f8499bedb168106b686d4f8239472f25c7553b069eec2afe197ff2df6","src/unix/bsd/freebsdlike/freebsd/freebsd12/mod.rs":"bef9fae288a4f29e941ea369be1cd20b170040e60665a4d49a4a9e79009b72d8","src/unix/bsd/freebsdlike/freebsd/freebsd12/x86_64.rs":"2df36a7f122f6d6e5753cfb4d22e915cc80f6bc91c0161b3daae55a481bfd052","src/unix/bsd/freebsdlike/freebsd/freebsd13/b64.rs":"61cbe45f8499bedb168106b686d4f8239472f25c7553b069eec2afe197ff2df6","src/unix/bsd/freebsdlike/freebsd/freebsd13/mod.rs":"3c514e037694ce22724abb3c9c4687defda7f0e3456b615ca73593e860e38b16","src/unix/bsd/freebsdlike/freebsd/freebsd13/x86_64.rs":"2df36a7f122f6d6e5753cfb4d22e915cc80f6bc91c0161b3daae55a481bfd052","src/unix/bsd/freebsdlike/freebsd/freebsd14/b64.rs":"61cbe45f8499bedb168106b686d4f8239472f25c7553b069eec2afe197ff2df6","src/unix/bsd/freebsdlike/freebsd/freebsd14/mod.rs":"318abe48bfdd1c74ecd6afbd6c9329c5c72ce4f7d420edd6be2fc12b223ae32f","src/unix/bsd/freebsdlike/freebsd/freebsd14/x86_64.rs":"e7b5863e222d6cc416b6b0fbe71690fad909e899b4c4ae810bbca117e4fcb650","src/unix/bsd/freebsdlike/freebsd/mod.rs":"4c3cd57aaf7fbce072e28e0d2d285b5fda9702e924561d2fd01e49e6ee186a98","src/unix/bsd/freebsdlike/freebsd/powerpc.rs":"9ca3f82f88974e6db5569f2d76a5a3749b248a31747a6c0da5820492bdfeca42","src/unix/bsd/freebsdlike/freebsd/powerpc64.rs":"2dae3ecc87eac3b11657aa98915def55fc4b5c0de11fe26aae23329a54628a9a","src/unix/bsd/freebsdlike/freebsd/riscv64.rs":"fa4bed4c58cad24ba3395941c7fa6b11e089551a04714f9561078e400f5b2b62","src/unix/bsd/freebsdlike/freebsd/x86.rs":"6766e2ce85e187b306cd3b0b8d7e15b8f4042c5cff81d89b3af69ecc99c70ab0","src/unix/bsd/freebsdlike/freebsd/x86_64/align.rs":"0e1f69a88fca1c32874b1daf5db3d446fefbe518dca497f096cc9168c39dde70","src/unix/bsd/freebsdlike/freebsd/x86_64/mod.rs":"51e4dd0c8ae247bb652feda5adad9333ea3bb30c750c3a3935e0b0e47d7803eb","src/unix/bsd/freebsdlike/mod.rs":"0eacafac87fb3a32ef1b85980fece2792e70eba9856af18a7407cc35be68ea57","src/unix/bsd/mod.rs":"dad51a24a524e92bfe9de3ac3b7d394d86058b9b8a1ccd4efa9bbb5c78e7fa1a","src/unix/bsd/netbsdlike/mod.rs":"0a66f7de43710e35a6a546e6c39066aa8b91a6efadb71db88738b0a577fd5537","src/unix/bsd/netbsdlike/netbsd/aarch64.rs":"65dcb58d11e8d8028401a9d07ca3eb4cb4f053e04249cc877353449d84ccc4cb","src/unix/bsd/netbsdlike/netbsd/arm.rs":"58cdbb70b0d6f536551f0f3bb3725d2d75c4690db12c26c034e7d6ec4a924452","src/unix/bsd/netbsdlike/netbsd/mod.rs":"90dd33ef20dc3be8aef5bd152a6a06e7ab34f9527b3978487b593aaa16a907bd","src/unix/bsd/netbsdlike/netbsd/powerpc.rs":"ee7ff5d89d0ed22f531237b5059aa669df93a3b5c489fa641465ace8d405bf41","src/unix/bsd/netbsdlike/netbsd/sparc64.rs":"9489f4b3e4566f43bb12dfb92238960613dac7f6a45cc13068a8d152b902d7d9","src/unix/bsd/netbsdlike/netbsd/x86.rs":"20692320e36bfe028d1a34d16fe12ca77aa909cb02bda167376f98f1a09aefe7","src/unix/bsd/netbsdlike/netbsd/x86_64.rs":"1afe5ef46b14397cdd68664b5b232e4f5b035b6db1d4cf411c899d51ebca9f30","src/unix/bsd/netbsdlike/openbsd/aarch64.rs":"dd91931d373b7ecaf6e2de25adadee10d16fa9b12c2cbacdff3eb291e1ba36af","src/unix/bsd/netbsdlike/openbsd/arm.rs":"01580d261bc6447bb327a0d982181b7bdabfa066cee65a30373d3ced729ad307","src/unix/bsd/netbsdlike/openbsd/mips64.rs":"8532a189ae10c7d668d9d4065da8b05d124e09bd39442c9f74a7f231c43eca48","src/unix/bsd/netbsdlike/openbsd/mod.rs":"892e0b409ced2dfd81d98cbe9630eb83979c1668d323b304a91be13aa711d5db","src/unix/bsd/netbsdlike/openbsd/powerpc.rs":"01580d261bc6447bb327a0d982181b7bdabfa066cee65a30373d3ced729ad307","src/unix/bsd/netbsdlike/openbsd/powerpc64.rs":"1dd5449dd1fd3d51e30ffdeeaece91d0aaf05c710e0ac699fecc5461cfa2c28e","src/unix/bsd/netbsdlike/openbsd/riscv64.rs":"1dd5449dd1fd3d51e30ffdeeaece91d0aaf05c710e0ac699fecc5461cfa2c28e","src/unix/bsd/netbsdlike/openbsd/sparc64.rs":"d04fd287afbaa2c5df9d48c94e8374a532a3ba491b424ddf018270c7312f4085","src/unix/bsd/netbsdlike/openbsd/x86.rs":"6f7f5c4fde2a2259eb547890cbd86570cea04ef85347d7569e94e679448bec87","src/unix/bsd/netbsdlike/openbsd/x86_64.rs":"d31db31630289c85af3339dbe357998a21ca584cbae31607448fe2cf7675a4e1","src/unix/haiku/b32.rs":"a2efdbf7158a6da341e1db9176b0ab193ba88b449616239ed95dced11f54d87b","src/unix/haiku/b64.rs":"ff8115367d3d7d354f792d6176dfaaa26353f57056197b563bf4681f91ff7985","src/unix/haiku/mod.rs":"d7ec086b73db4f72799179627aa6330a513dcf786b06e19c75ff884d1235948e","src/unix/haiku/native.rs":"dbfcbf4954a79d1df2ff58e0590bbcb8c57dfc7a32392aa73ee4726b66bd6cc8","src/unix/haiku/x86_64.rs":"3ec3aeeb7ed208b8916f3e32d42bfd085ff5e16936a1a35d9a52789f043b7237","src/unix/hermit/aarch64.rs":"86048676e335944c37a63d0083d0f368ae10ceccefeed9debb3bbe08777fc682","src/unix/hermit/mod.rs":"a1494a0bddf301cceb0d9b8529a84b5882fe855ceae77a1c4e8d6034e705e26c","src/unix/hermit/x86_64.rs":"ab832b7524e5fb15c49ff7431165ab1a37dc4667ae0b58e8306f4c539bfa110c","src/unix/linux_like/android/b32/arm.rs":"ce582de7e983a33d3bfad13075c53aac9016cee35f06ad8653ee9072c3ec2564","src/unix/linux_like/android/b32/mod.rs":"7c173e0375119bf06a3081652faede95e5bcd6858e7576b7533d037978737c8f","src/unix/linux_like/android/b32/x86/align.rs":"812914e4241df82e32b12375ca3374615dc3a4bdd4cf31f0423c5815320c0dab","src/unix/linux_like/android/b32/x86/mod.rs":"e6d107efbcd37b5b85dfa18f683300cbf768ffa0237997a9fa52b184a53323ac","src/unix/linux_like/android/b64/aarch64/align.rs":"2179c3b1608fa4bf68840482bfc2b2fa3ee2faf6fcae3770f9e505cddca35c7b","src/unix/linux_like/android/b64/aarch64/int128.rs":"1735f6f5c56770d20dd426442f09724d9b2052b46a7cd82f23f3288a4a7276de","src/unix/linux_like/android/b64/aarch64/mod.rs":"171f8c37a2d2e45065bd3547dfcec70b02aa3da34cd99d259d150c753f620846","src/unix/linux_like/android/b64/mod.rs":"71e4fcbe952bfa4a5f9022f3972e906917b38f729b9d8ef57cd5d179104894ac","src/unix/linux_like/android/b64/riscv64/align.rs":"0bf138f84e5327d8339bcd4adf071a6832b516445e597552c82bbd881095e3a8","src/unix/linux_like/android/b64/riscv64/mod.rs":"19d4bf2237c47127eba9144e0b82e995bc079315e719179a91813b0ae7b0e49d","src/unix/linux_like/android/b64/x86_64/align.rs":"7169d07a9fd4716f7512719aec9fda5d8bed306dc0720ffc1b21696c9951e3c6","src/unix/linux_like/android/b64/x86_64/mod.rs":"4ec2de11a9b65c4325b7b991f0b99a414975e0e61ba8668caca5d921e9b314d1","src/unix/linux_like/android/mod.rs":"fe4c4015cdafc40b537619c9325168f519249ee5acc00cc43b9f0aa5fb95f331","src/unix/linux_like/emscripten/align.rs":"86c95cbed7a7161b1f23ee06843e7b0e2340ad92b2cb86fe2a8ef3e0e8c36216","src/unix/linux_like/emscripten/mod.rs":"712c52856ee323b8057b9452e4ab484a0e652581a530b67c3db25e819919d718","src/unix/linux_like/emscripten/no_align.rs":"0128e4aa721a9902754828b61b5ec7d8a86619983ed1e0544a85d35b1051fad6","src/unix/linux_like/linux/align.rs":"87401c80ff504def5cd4309a53a63fdd481642980b9daaa7fee0164a807c2c61","src/unix/linux_like/linux/arch/generic/mod.rs":"778742250aa456cb94efe67a4f8d0213827d90ab74eb5074f9afb9a30e6ea71c","src/unix/linux_like/linux/arch/mips/mod.rs":"60ace1dd76aa88d6b3b5e52fef4bec7881d452780dfff635474067b512e03df1","src/unix/linux_like/linux/arch/mod.rs":"466a29622e47c6c7f1500682b2eb17f5566dd81b322cd6348f0fdd355cec593a","src/unix/linux_like/linux/arch/powerpc/mod.rs":"bef6b7af9e5e2b4e5545c9c7e3e23a8b743277a0ed95853e7eddc38e44299f02","src/unix/linux_like/linux/arch/sparc/mod.rs":"91593ec0440f1dd8f8e612028f432c44c14089286e2aca50e10511ab942db8c3","src/unix/linux_like/linux/gnu/align.rs":"e4a3c27fe20a57b8d612c34cb05bc70646edb5cec7251957315afa53a7b9f936","src/unix/linux_like/linux/gnu/b32/arm/align.rs":"6ec0eb3ee93f7ae99fd714b4deabfb5e97fbcefd8c26f5a45fb8e7150899cdeb","src/unix/linux_like/linux/gnu/b32/arm/mod.rs":"9ab3e97b579a9122690cd01026e14528862860346b700aafbb755a7e04054f7f","src/unix/linux_like/linux/gnu/b32/m68k/align.rs":"8faa92f77a9232c035418d45331774e64a9a841d99c91791570a203bf2b45bcb","src/unix/linux_like/linux/gnu/b32/m68k/mod.rs":"6aab7f1b864e9691d14aa7d389f717c4077b8eed72a7f11e3b8c7fef245e4046","src/unix/linux_like/linux/gnu/b32/mips/align.rs":"429fb5e005cb7143602d430098b6ebfb7d360685b194f333dfd587472ae954ee","src/unix/linux_like/linux/gnu/b32/mips/mod.rs":"6b9a5dac6f937ddc1453e808e3c43502c87143332df9e43ac64fb8b1eda6c116","src/unix/linux_like/linux/gnu/b32/mod.rs":"caade9dc8b7179711102da342819bdf330c42c796b4587d0ed419550dab2e9ad","src/unix/linux_like/linux/gnu/b32/powerpc.rs":"5c5d90326b54b57b98eff4745fe7a3fb02f053b2dc782241a73e807b491936a3","src/unix/linux_like/linux/gnu/b32/riscv32/align.rs":"d321491612be8d5c61b6ec2dc0111beb3a22e58803f99cd37543efe86621b119","src/unix/linux_like/linux/gnu/b32/riscv32/mod.rs":"491a9a97cf712985b75d3ad714691ef60898d88c78bc386a6917de0a6774cc26","src/unix/linux_like/linux/gnu/b32/sparc/align.rs":"21adbed27df73e2d1ed934aaf733a643003d7baf2bde9c48ea440895bcca6d41","src/unix/linux_like/linux/gnu/b32/sparc/mod.rs":"80894eece66e9348f45d1b07ad37c757ea694bbd10ed49d3f920b34e9f51a9a3","src/unix/linux_like/linux/gnu/b32/x86/align.rs":"e4bafdc4a519a7922a81b37a62bbfd1177a2f620890eef8f1fbc47162e9eb413","src/unix/linux_like/linux/gnu/b32/x86/mod.rs":"c703cc5e9de2dc31d9e5831bfb6f354d6e3518b2ae02263f68a9a70f1c0167e2","src/unix/linux_like/linux/gnu/b64/aarch64/align.rs":"ea39d5fd8ca5a71314127d1e1f542bca34ac566eac9a95662076d91ea4bee548","src/unix/linux_like/linux/gnu/b64/aarch64/ilp32.rs":"bf4611b737813deef6787babf6c01698605f3b75482269b8546318667bc68e29","src/unix/linux_like/linux/gnu/b64/aarch64/int128.rs":"1735f6f5c56770d20dd426442f09724d9b2052b46a7cd82f23f3288a4a7276de","src/unix/linux_like/linux/gnu/b64/aarch64/lp64.rs":"11a950697fdda0258c6e37c6b13993348c8de4134105ed4faa79358e53175072","src/unix/linux_like/linux/gnu/b64/aarch64/mod.rs":"d7be998105fc2f6248b7fdfcedb5a0519122d28625fcfd5dccf72617fb30c45e","src/unix/linux_like/linux/gnu/b64/loongarch64/align.rs":"060aa33cc737966c691aab8511c5c5729e551458ce18d0e284e0d45f39beeb60","src/unix/linux_like/linux/gnu/b64/loongarch64/mod.rs":"18edada8aa5d4127d9aa1bd81c62b5a4209f1efd8b2b2631e801c9e855ab1480","src/unix/linux_like/linux/gnu/b64/mips64/align.rs":"7169d07a9fd4716f7512719aec9fda5d8bed306dc0720ffc1b21696c9951e3c6","src/unix/linux_like/linux/gnu/b64/mips64/mod.rs":"628c410b9aaec3c8f43838a28616b577a1d6de60a9799b09bb884d80281f96eb","src/unix/linux_like/linux/gnu/b64/mod.rs":"3c6555f30a7a8852757b31a542ea73fb6a16a6e27e838397e819278ad56e57a4","src/unix/linux_like/linux/gnu/b64/powerpc64/align.rs":"e29c4868bbecfa4a6cd8a2ad06193f3bbc78a468cc1dc9df83f002f1268130d9","src/unix/linux_like/linux/gnu/b64/powerpc64/mod.rs":"c778a136f06c2ffeacea19fa14ce79b828f91b67a002dec5ce87289bae36234e","src/unix/linux_like/linux/gnu/b64/riscv64/align.rs":"d321491612be8d5c61b6ec2dc0111beb3a22e58803f99cd37543efe86621b119","src/unix/linux_like/linux/gnu/b64/riscv64/mod.rs":"c8f07efc5ddd5d874f1ebc329cd6907818d132ac3e30f4f2a4b04be3fb388551","src/unix/linux_like/linux/gnu/b64/s390x.rs":"a2fd9277c2dcf76f7a16a3bcca745d5a9932c765c0dc2feb31c3641be25eb0aa","src/unix/linux_like/linux/gnu/b64/sparc64/align.rs":"e29c4868bbecfa4a6cd8a2ad06193f3bbc78a468cc1dc9df83f002f1268130d9","src/unix/linux_like/linux/gnu/b64/sparc64/mod.rs":"e8047e9966a2b90063e0151a0278c54885e7b323286cf5ab55cbaf151fc772d3","src/unix/linux_like/linux/gnu/b64/x86_64/align.rs":"62e822478356db4a73b6bbd1b36d825b893939ab4b308ec11b0578bcc4b49769","src/unix/linux_like/linux/gnu/b64/x86_64/mod.rs":"891e595d33714b9883b92f0554d1d361fba2b6c3f6cac09a288252f44c6ec667","src/unix/linux_like/linux/gnu/b64/x86_64/not_x32.rs":"38f74ce15d9662ce4818815a2b87be1618d5e45f190f7e4db84ff3285b4421fb","src/unix/linux_like/linux/gnu/b64/x86_64/x32.rs":"b20218a11364a6dec87f96d6c0d8b19e660697ab09ad5ee0e9b3a9dafedaaebb","src/unix/linux_like/linux/gnu/mod.rs":"a105e27dac14401935ad2acb60618c0d0c078f65d5bc06c92940d6ab93659b96","src/unix/linux_like/linux/gnu/no_align.rs":"9cd223135de75315840ff9c3fd5441ba1cb632b96b5c85a76f8316c86653db25","src/unix/linux_like/linux/mod.rs":"657a86280094d5ce31e1f85d116c95637cb994baeb724b78dcbd7684b9be1b96","src/unix/linux_like/linux/musl/b32/arm/align.rs":"3e8ac052c1043764776b54c93ba4260e061df998631737a897d9d47d54f7b80c","src/unix/linux_like/linux/musl/b32/arm/mod.rs":"f5b217a93f99c2852f7fd1459f529798372fa7df84ee0cfd3d8cdd5b2021b8cf","src/unix/linux_like/linux/musl/b32/hexagon.rs":"226a8b64ce9c75abbbee6d2dceb0b44f7b6c750c4102ebd4d015194afee6666e","src/unix/linux_like/linux/musl/b32/mips/align.rs":"429fb5e005cb7143602d430098b6ebfb7d360685b194f333dfd587472ae954ee","src/unix/linux_like/linux/musl/b32/mips/mod.rs":"16f614dd59695497a01b542deacd1669335678bdd0b14d16dde482fb5c4e02f4","src/unix/linux_like/linux/musl/b32/mod.rs":"31677597fd9544c4b1ec1477628288f6273fabbc06e38f33da862ad55f019ce1","src/unix/linux_like/linux/musl/b32/powerpc.rs":"69e3ab4471f876055215a7fccabe514e69299ecfe2fa95d989e4d799e03f43e9","src/unix/linux_like/linux/musl/b32/riscv32/align.rs":"efd2accf33b87de7c7547903359a5da896edc33cd6c719552c7474b60d4a5d48","src/unix/linux_like/linux/musl/b32/riscv32/mod.rs":"7b067c7989a80e35daa9987af799d97dd1fb3df71ef82285137f51fbad2354d9","src/unix/linux_like/linux/musl/b32/x86/align.rs":"08e77fbd7435d7dec2ff56932433bece3f02e47ce810f89004a275a86d39cbe1","src/unix/linux_like/linux/musl/b32/x86/mod.rs":"de632ac323bd2bb4f83d4826d6eb7e29d4b0e6293aa0c4cb9c99ef0fcabc71b7","src/unix/linux_like/linux/musl/b64/aarch64/align.rs":"6ba32725d24d7d8e6aa111f3b57aafa318f83b606abe96561329151829821133","src/unix/linux_like/linux/musl/b64/aarch64/int128.rs":"1735f6f5c56770d20dd426442f09724d9b2052b46a7cd82f23f3288a4a7276de","src/unix/linux_like/linux/musl/b64/aarch64/mod.rs":"31e75179cbb4e26425b3f5b052e358f593153da662884655e60801d852e55dc2","src/unix/linux_like/linux/musl/b64/mips64.rs":"9a5d29f666332bb056d0e2951e9de989aa1dc016075f009db3f2f628e0cdda8c","src/unix/linux_like/linux/musl/b64/mod.rs":"884243eb5af7df963d858d5baf47e622b45f04e0ae701728b134e986191b614b","src/unix/linux_like/linux/musl/b64/powerpc64.rs":"e77f4cf5d65320023043e4354725397f6b079c1b7b6b3cef2c3293350b46b303","src/unix/linux_like/linux/musl/b64/riscv64/align.rs":"d321491612be8d5c61b6ec2dc0111beb3a22e58803f99cd37543efe86621b119","src/unix/linux_like/linux/musl/b64/riscv64/mod.rs":"a80b1813148dec8bc396c02638978c0b4e5e040edafd56d98f8683fe2ae51ab5","src/unix/linux_like/linux/musl/b64/s390x.rs":"80a92e54e47016d051c7bd55bee9580cbedd298164199d71a67d49167e744432","src/unix/linux_like/linux/musl/b64/x86_64/align.rs":"77309276ad7a42cbe59ca381f23590b7a143aded05555b34a5b307b808cbca6e","src/unix/linux_like/linux/musl/b64/x86_64/mod.rs":"032863c74d3ca73cb75483218f9bd774ae1ae7d3646d2ffb21e4cc7d4b5e0e3d","src/unix/linux_like/linux/musl/lfs64.rs":"3e4fb381f3a0756520bde0f1692d4fa45e4ae8133bf7d7c64b0e3fdd512f235f","src/unix/linux_like/linux/musl/mod.rs":"f79e4d7bef14f422c6a77f1573ff503a82305bfa5ac3e4c6f571c09212b75620","src/unix/linux_like/linux/no_align.rs":"1a754a4af299894a79835aa092d8322d301179e2b20609defd6bb4bc880e6b4a","src/unix/linux_like/linux/non_exhaustive.rs":"181a05bf94fdb911db83ce793b993bd6548a4115b306a7ef3c10f745a8fea3e9","src/unix/linux_like/linux/uclibc/align.rs":"9ed16138d8e439bd90930845a65eafa7ebd67366e6bf633936d44014f6e4c959","src/unix/linux_like/linux/uclibc/arm/align.rs":"e4a3c27fe20a57b8d612c34cb05bc70646edb5cec7251957315afa53a7b9f936","src/unix/linux_like/linux/uclibc/arm/mod.rs":"50288ff9e411ab0966da24838f2c2a5618021bc19c422a04f577b2979ef4081e","src/unix/linux_like/linux/uclibc/arm/no_align.rs":"9cd223135de75315840ff9c3fd5441ba1cb632b96b5c85a76f8316c86653db25","src/unix/linux_like/linux/uclibc/mips/mips32/align.rs":"e4a3c27fe20a57b8d612c34cb05bc70646edb5cec7251957315afa53a7b9f936","src/unix/linux_like/linux/uclibc/mips/mips32/mod.rs":"d0c4434e2bf813372c418a8f516c706cdccc9f7be2f0921b2207b0afdb66fe81","src/unix/linux_like/linux/uclibc/mips/mips32/no_align.rs":"9cd223135de75315840ff9c3fd5441ba1cb632b96b5c85a76f8316c86653db25","src/unix/linux_like/linux/uclibc/mips/mips64/align.rs":"a7bdcb18a37a2d91e64d5fad83ea3edc78f5412adb28f77ab077dbb26dd08b2d","src/unix/linux_like/linux/uclibc/mips/mips64/mod.rs":"3f38ee6a4690b9d7594be20d216467a34d955f7653c2c8ce1e6147daeb53f1e0","src/unix/linux_like/linux/uclibc/mips/mips64/no_align.rs":"4a18e3875698c85229599225ac3401a2a40da87e77b2ad4ef47c6fcd5a24ed30","src/unix/linux_like/linux/uclibc/mips/mod.rs":"a048fce1c2d9b1ad57305642e8ad05ca0f0c7e4753267a2e2d6b4fee5db3b072","src/unix/linux_like/linux/uclibc/mod.rs":"1c3d25cddcfefa2bd17bdc81550826be31a08eef235e13f825f169a5029c8bca","src/unix/linux_like/linux/uclibc/no_align.rs":"3f28637046524618adaa1012e26cb7ffe94b9396e6b518cccdc69d59f274d709","src/unix/linux_like/linux/uclibc/x86_64/l4re.rs":"024eba5753e852dbdd212427351affe7e83f9916c1864bce414d7aa2618f192e","src/unix/linux_like/linux/uclibc/x86_64/mod.rs":"196d03affbefb85716937c15904831e731eb222ee906e05e42102d639a8152ea","src/unix/linux_like/linux/uclibc/x86_64/other.rs":"42c3f71e58cabba373f6a55a623f3c31b85049eb64824c09c2b082b3b2d6a0a8","src/unix/linux_like/mod.rs":"45c98e7a0fad03b03c4c76f11a80e2423873f0a6563e35c60309a29b2c8ff44f","src/unix/mod.rs":"dd4ce377ba9517182e718848739a5c3f58cdbbcd4ee467eef9aaf8df5aed5053","src/unix/newlib/aarch64/mod.rs":"bac93836a9a57b2c710f32f852e92a4d11ad6759ab0fb6ad33e71d60e53278af","src/unix/newlib/align.rs":"28aaf87fafbc6b312622719d472d8cf65f9e5467d15339df5f73e66d8502b28a","src/unix/newlib/arm/mod.rs":"cbba6b3e957eceb496806e60de8725a23ff3fa0015983b4b4fa27b233732b526","src/unix/newlib/espidf/mod.rs":"816f235f4aa4baabba7f2606b31d0fdb03988c52194c966728de8690bf17299d","src/unix/newlib/generic.rs":"eab066d9f0a0f3eb53cc1073d01496bba0110989e1f6a59838afd19f870cd599","src/unix/newlib/horizon/mod.rs":"7cc5cc120437421db139bfa6a90b18168cd3070bdd0f5be96d40fe4c996f3ca1","src/unix/newlib/mod.rs":"9e36de3fd78e10cb6b9a59dc5ebe5a1b44a63ccb91433bb33653fb30d0c303c6","src/unix/newlib/no_align.rs":"e0743b2179495a9514bc3a4d1781e492878c4ec834ee0085d0891dd1712e82fb","src/unix/newlib/powerpc/mod.rs":"0202ffd57caf75b6afa2c9717750ffb96e375ac33df0ae9609a3f831be393b67","src/unix/newlib/vita/mod.rs":"68e0ce186b44e0b3031eb824710e7454dc2a9df98db98120840c3c6f4d885871","src/unix/no_align.rs":"c06e95373b9088266e0b14bba0954eef95f93fb2b01d951855e382d22de78e53","src/unix/nto/aarch64.rs":"4709c9afdc8d583be876598e7c238499ee3e8da5bd2baa614d9c7dd414851555","src/unix/nto/mod.rs":"59ab89a8fb6e0a6d22fa968ed4873c2bafa19a0f60a90c9a5148816cb7440889","src/unix/nto/neutrino.rs":"799bff4ab01a6424db6c5a2b76aa5679826d41495f9d13c63485bf13bc80026b","src/unix/nto/x86_64.rs":"a3e18e93c2999da1cd7a6f748a4b60c07aefb73d8ea2aafec19a84cfb040bc8e","src/unix/redox/mod.rs":"73658b0d28c82a122875aa2b45c489834f4de58c378add7932bbaf3ffb2ae789","src/unix/solarish/compat.rs":"00f1ee3faec9da69204e42f025f6735dd13d894071a154425dcc43ecbdd06e7f","src/unix/solarish/illumos.rs":"cd93c2d84722bbf9933a92842a8998eb0b2afc962f50bc2546ad127b82809fa7","src/unix/solarish/mod.rs":"55ce4624745e31ad226b47fde177a46176a89da3fa5030663673a115102471f9","src/unix/solarish/solaris.rs":"41b350a89ddf01cd12a10f93640f92be53be0b0d976021cdc08da17bf3e72edf","src/unix/solarish/x86.rs":"e86e806df0caed72765040eaa2f3c883198d1aa91508540adf9b7008c77f522e","src/unix/solarish/x86_64.rs":"ec2b01f194eb8a6a27133c57681da195a949e03098f3ea1e847227a9c09ef5fc","src/unix/solarish/x86_common.rs":"ac869d9c3c95645c22460468391eb1982023c3a8e02b9e06a72e3aef3d5f1eac","src/vxworks/aarch64.rs":"98f0afdc511cd02557e506c21fed6737585490a1dce7a9d4941d08c437762b99","src/vxworks/arm.rs":"acb7968ce99fe3f4abdf39d98f8133d21a4fba435b8ef7084777cb181d788e88","src/vxworks/mod.rs":"e4edcbcf43a325e738c9465507594d0c87abf3f0e2b9b046c1425f8d44bdad0f","src/vxworks/powerpc.rs":"acb7968ce99fe3f4abdf39d98f8133d21a4fba435b8ef7084777cb181d788e88","src/vxworks/powerpc64.rs":"98f0afdc511cd02557e506c21fed6737585490a1dce7a9d4941d08c437762b99","src/vxworks/x86.rs":"552f007f38317620b23889cb7c49d1d115841252439060122f52f434fbc6e5ba","src/vxworks/x86_64.rs":"018d92be3ad628a129eff9f2f5dfbc0883d8b8e5f2fa917b900a7f98ed6b514a","src/wasi.rs":"09ee3b3348b212b050f6ca8ae008a28679ea44a375674307a4e7c9ca0d3ed7d5","src/windows/gnu/align.rs":"b2c13ec1b9f3b39a75c452c80c951dff9d0215e31d77e883b4502afb31794647","src/windows/gnu/mod.rs":"3c8c7edb7cdf5d0c44af936db2a94869585c69dfabeef30571b4f4e38375767a","src/windows/mod.rs":"a9a95e9ebc0102c334650607351d4d4dbaff0eaf7730eed1c8020d20e9bbebfd","src/windows/msvc/mod.rs":"c068271e00fca6b62bc4bf44bcf142cfc38caeded9b6c4e01d1ceef3ccf986f4","src/xous.rs":"eb0675f25ba01f73072d2b70907fb8abb1148facefe5a20756c49250f3d65fae","tests/const_fn.rs":"cb75a1f0864f926aebe79118fc34d51a0d1ade2c20a394e7774c7e545f21f1f4"},"package":"b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/libc/Cargo.toml temporalio-1.3.0/vendor/libc/Cargo.toml --- temporalio-1.3.0/vendor/libc/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/libc/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -11,7 +11,7 @@ [package] name = "libc" -version = "0.2.149" +version = "0.2.147" authors = ["The Rust Project Developers"] build = "build.rs" exclude = [ @@ -42,14 +42,13 @@ repository = "https://github.com/rust-lang/libc" [package.metadata.docs.rs] -cargo-args = ["-Zbuild-std=core"] +cargo-args = ["-Zbuild-std"] default-target = "x86_64-unknown-linux-gnu" features = [ "const-extern-fn", "extra_traits", ] targets = [ - "aarch64-apple-ios", "aarch64-linux-android", "aarch64-pc-windows-msvc", "aarch64-unknown-freebsd", @@ -114,7 +113,6 @@ "riscv32imac-unknown-none-elf", "riscv32imc-unknown-none-elf", "riscv64gc-unknown-freebsd", - "riscv64gc-unknown-hermit", "riscv64gc-unknown-linux-gnu", "riscv64gc-unknown-linux-musl", "riscv64gc-unknown-none-elf", @@ -134,12 +132,12 @@ "wasm32-unknown-emscripten", "wasm32-unknown-unknown", "wasm32-wasi", - "x86_64-apple-darwin", - "x86_64-apple-ios", "x86_64-fortanix-unknown-sgx", "x86_64-linux-android", "x86_64-pc-solaris", "x86_64-pc-windows-gnu", + "x86_64-pc-windows-gnu", + "x86_64-pc-windows-msvc", "x86_64-pc-windows-msvc", "x86_64-unknown-dragonfly", "x86_64-unknown-freebsd", diff -Nru temporalio-1.3.0/vendor/libc/src/fuchsia/mod.rs temporalio-1.3.0/vendor/libc/src/fuchsia/mod.rs --- temporalio-1.3.0/vendor/libc/src/fuchsia/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/libc/src/fuchsia/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -2679,87 +2679,7 @@ pub const PT_GNU_RELRO: u32 = 0x6474e552; // Ethernet protocol IDs. -pub const ETH_P_LOOP: ::c_int = 0x0060; -pub const ETH_P_PUP: ::c_int = 0x0200; -pub const ETH_P_PUPAT: ::c_int = 0x0201; pub const ETH_P_IP: ::c_int = 0x0800; -pub const ETH_P_X25: ::c_int = 0x0805; -pub const ETH_P_ARP: ::c_int = 0x0806; -pub const ETH_P_BPQ: ::c_int = 0x08FF; -pub const ETH_P_IEEEPUP: ::c_int = 0x0a00; -pub const ETH_P_IEEEPUPAT: ::c_int = 0x0a01; -pub const ETH_P_BATMAN: ::c_int = 0x4305; -pub const ETH_P_DEC: ::c_int = 0x6000; -pub const ETH_P_DNA_DL: ::c_int = 0x6001; -pub const ETH_P_DNA_RC: ::c_int = 0x6002; -pub const ETH_P_DNA_RT: ::c_int = 0x6003; -pub const ETH_P_LAT: ::c_int = 0x6004; -pub const ETH_P_DIAG: ::c_int = 0x6005; -pub const ETH_P_CUST: ::c_int = 0x6006; -pub const ETH_P_SCA: ::c_int = 0x6007; -pub const ETH_P_TEB: ::c_int = 0x6558; -pub const ETH_P_RARP: ::c_int = 0x8035; -pub const ETH_P_ATALK: ::c_int = 0x809B; -pub const ETH_P_AARP: ::c_int = 0x80F3; -pub const ETH_P_8021Q: ::c_int = 0x8100; -pub const ETH_P_IPX: ::c_int = 0x8137; -pub const ETH_P_IPV6: ::c_int = 0x86DD; -pub const ETH_P_PAUSE: ::c_int = 0x8808; -pub const ETH_P_SLOW: ::c_int = 0x8809; -pub const ETH_P_WCCP: ::c_int = 0x883E; -pub const ETH_P_MPLS_UC: ::c_int = 0x8847; -pub const ETH_P_MPLS_MC: ::c_int = 0x8848; -pub const ETH_P_ATMMPOA: ::c_int = 0x884c; -pub const ETH_P_PPP_DISC: ::c_int = 0x8863; -pub const ETH_P_PPP_SES: ::c_int = 0x8864; -pub const ETH_P_LINK_CTL: ::c_int = 0x886c; -pub const ETH_P_ATMFATE: ::c_int = 0x8884; -pub const ETH_P_PAE: ::c_int = 0x888E; -pub const ETH_P_AOE: ::c_int = 0x88A2; -pub const ETH_P_8021AD: ::c_int = 0x88A8; -pub const ETH_P_802_EX1: ::c_int = 0x88B5; -pub const ETH_P_TIPC: ::c_int = 0x88CA; -pub const ETH_P_8021AH: ::c_int = 0x88E7; -pub const ETH_P_MVRP: ::c_int = 0x88F5; -pub const ETH_P_1588: ::c_int = 0x88F7; -pub const ETH_P_PRP: ::c_int = 0x88FB; -pub const ETH_P_FCOE: ::c_int = 0x8906; -pub const ETH_P_TDLS: ::c_int = 0x890D; -pub const ETH_P_FIP: ::c_int = 0x8914; -pub const ETH_P_80221: ::c_int = 0x8917; -pub const ETH_P_LOOPBACK: ::c_int = 0x9000; -pub const ETH_P_QINQ1: ::c_int = 0x9100; -pub const ETH_P_QINQ2: ::c_int = 0x9200; -pub const ETH_P_QINQ3: ::c_int = 0x9300; -pub const ETH_P_EDSA: ::c_int = 0xDADA; -pub const ETH_P_AF_IUCV: ::c_int = 0xFBFB; - -pub const ETH_P_802_3_MIN: ::c_int = 0x0600; - -pub const ETH_P_802_3: ::c_int = 0x0001; -pub const ETH_P_AX25: ::c_int = 0x0002; -pub const ETH_P_ALL: ::c_int = 0x0003; -pub const ETH_P_802_2: ::c_int = 0x0004; -pub const ETH_P_SNAP: ::c_int = 0x0005; -pub const ETH_P_DDCMP: ::c_int = 0x0006; -pub const ETH_P_WAN_PPP: ::c_int = 0x0007; -pub const ETH_P_PPP_MP: ::c_int = 0x0008; -pub const ETH_P_LOCALTALK: ::c_int = 0x0009; -pub const ETH_P_CAN: ::c_int = 0x000C; -pub const ETH_P_CANFD: ::c_int = 0x000D; -pub const ETH_P_PPPTALK: ::c_int = 0x0010; -pub const ETH_P_TR_802_2: ::c_int = 0x0011; -pub const ETH_P_MOBITEX: ::c_int = 0x0015; -pub const ETH_P_CONTROL: ::c_int = 0x0016; -pub const ETH_P_IRDA: ::c_int = 0x0017; -pub const ETH_P_ECONET: ::c_int = 0x0018; -pub const ETH_P_HDLC: ::c_int = 0x0019; -pub const ETH_P_ARCNET: ::c_int = 0x001A; -pub const ETH_P_DSA: ::c_int = 0x001B; -pub const ETH_P_TRAILER: ::c_int = 0x001C; -pub const ETH_P_PHONET: ::c_int = 0x00F5; -pub const ETH_P_IEEE802154: ::c_int = 0x00F6; -pub const ETH_P_CAIF: ::c_int = 0x00F7; pub const SFD_CLOEXEC: ::c_int = 0x080000; @@ -2811,10 +2731,7 @@ pub const RLIM_INFINITY: ::rlim_t = !0; pub const RLIMIT_RTTIME: ::c_int = 15; -#[deprecated(since = "0.2.64", note = "Not stable across OS versions")] pub const RLIMIT_NLIMITS: ::c_int = 16; -#[allow(deprecated)] -#[deprecated(since = "0.2.64", note = "Not stable across OS versions")] pub const RLIM_NLIMITS: ::c_int = RLIMIT_NLIMITS; pub const MAP_ANONYMOUS: ::c_int = MAP_ANON; @@ -3770,10 +3687,6 @@ pub fn pthread_exit(value: *mut ::c_void) -> !; pub fn pthread_attr_init(attr: *mut ::pthread_attr_t) -> ::c_int; pub fn pthread_attr_destroy(attr: *mut ::pthread_attr_t) -> ::c_int; - pub fn pthread_attr_getstacksize( - attr: *const ::pthread_attr_t, - stacksize: *mut ::size_t, - ) -> ::c_int; pub fn pthread_attr_setstacksize(attr: *mut ::pthread_attr_t, stack_size: ::size_t) -> ::c_int; pub fn pthread_attr_setdetachstate(attr: *mut ::pthread_attr_t, state: ::c_int) -> ::c_int; pub fn pthread_detach(thread: ::pthread_t) -> ::c_int; @@ -4248,7 +4161,6 @@ attr: *const ::pthread_attr_t, guardsize: *mut ::size_t, ) -> ::c_int; - pub fn pthread_attr_setguardsize(attr: *mut ::pthread_attr_t, guardsize: ::size_t) -> ::c_int; pub fn sethostname(name: *const ::c_char, len: ::size_t) -> ::c_int; pub fn sched_get_priority_min(policy: ::c_int) -> ::c_int; pub fn umount2(target: *const ::c_char, flags: ::c_int) -> ::c_int; diff -Nru temporalio-1.3.0/vendor/libc/src/hermit/mod.rs temporalio-1.3.0/vendor/libc/src/hermit/mod.rs --- temporalio-1.3.0/vendor/libc/src/hermit/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/libc/src/hermit/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,4 +1,7 @@ -//! Hermit C types definition +// libc port for HermitCore (https://hermitcore.org) +// +// Ported by Colin Fink +// and Stefan Lankes pub type c_schar = i8; pub type c_uchar = u8; diff -Nru temporalio-1.3.0/vendor/libc/src/lib.rs temporalio-1.3.0/vendor/libc/src/lib.rs --- temporalio-1.3.0/vendor/libc/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/libc/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -139,12 +139,6 @@ mod hermit; pub use hermit::*; - } else if #[cfg(target_os = "teeos")] { - mod fixed_width_ints; - pub use fixed_width_ints::*; - - mod teeos; - pub use teeos::*; } else if #[cfg(all(target_env = "sgx", target_vendor = "fortanix"))] { mod fixed_width_ints; pub use fixed_width_ints::*; diff -Nru temporalio-1.3.0/vendor/libc/src/teeos/mod.rs temporalio-1.3.0/vendor/libc/src/teeos/mod.rs --- temporalio-1.3.0/vendor/libc/src/teeos/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/libc/src/teeos/mod.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,1377 +0,0 @@ -//! Libc bindings for teeos -//! -//! Apparently the loader just dynamically links it anyway, but fails -//! when linking is explicitly requested. -#![allow(non_camel_case_types)] -#![allow(non_snake_case)] - -// only supported on Rust > 1.59, so we can directly reexport c_void from core. -pub use core::ffi::c_void; - -pub type c_schar = i8; - -pub type c_uchar = u8; - -pub type c_short = i16; - -pub type c_ushort = u16; - -pub type c_int = i32; - -pub type c_uint = u32; - -pub type c_bool = i32; - -pub type c_float = f32; - -pub type c_double = f64; - -pub type c_longlong = i64; - -pub type c_ulonglong = u64; - -pub type intmax_t = i64; - -pub type uintmax_t = u64; - -pub type size_t = usize; - -pub type ptrdiff_t = isize; - -pub type intptr_t = isize; - -pub type uintptr_t = usize; - -pub type ssize_t = isize; - -pub type pid_t = c_int; - -// aarch64 specifc -pub type c_char = u8; - -pub type wchar_t = u32; - -pub type c_long = i64; - -pub type c_ulong = u64; - -#[repr(align(16))] -pub struct _CLongDouble(pub u128); - -// long double in C means A float point value, which has 128bit length. -// but some bit maybe not used, so the really length of long double could be 80(x86) or 128(power pc/IEEE) -// this is different from f128(not stable and not inculded default) in Rust, so we use u128 for FFI(Rust to C). -// this is unstable and will couse to memfault/data abort. -pub type c_longdouble = _CLongDouble; - -pub type pthread_t = c_ulong; - -pub type pthread_key_t = c_uint; - -pub type pthread_spinlock_t = c_int; - -pub type off_t = i64; - -pub type time_t = c_long; - -pub type clock_t = c_long; - -pub type clockid_t = c_int; - -pub type suseconds_t = c_long; - -pub type once_fn = extern "C" fn() -> c_void; - -pub type pthread_once_t = c_int; - -pub type va_list = *mut c_char; - -pub type wint_t = c_uint; - -pub type wctype_t = c_ulong; - -pub type cmpfunc = extern "C" fn(x: *const c_void, y: *const c_void) -> c_int; - -#[repr(align(8))] -#[repr(C)] -pub struct pthread_cond_t { - #[doc(hidden)] - size: [u8; __SIZEOF_PTHREAD_COND_T], -} - -#[repr(align(8))] -#[repr(C)] -pub struct pthread_mutex_t { - #[doc(hidden)] - size: [u8; __SIZEOF_PTHREAD_MUTEX_T], -} - -#[repr(align(4))] -#[repr(C)] -pub struct pthread_mutexattr_t { - #[doc(hidden)] - size: [u8; __SIZEOF_PTHREAD_MUTEXATTR_T], -} - -#[repr(align(4))] -#[repr(C)] -pub struct pthread_condattr_t { - #[doc(hidden)] - size: [u8; __SIZEOF_PTHREAD_CONDATTR_T], -} - -#[repr(C)] -pub struct pthread_attr_t { - __size: [u64; 7], -} - -#[repr(C)] -pub struct cpu_set_t { - bits: [c_ulong; 128 / core::mem::size_of::()], -} - -#[repr(C)] -pub struct timespec { - pub tv_sec: time_t, - pub tv_nsec: c_long, -} - -#[repr(C)] -pub struct timeval { - pub tv_sec: time_t, - pub tv_usec: suseconds_t, -} - -#[repr(C)] -pub struct tm { - pub tm_sec: c_int, - pub tm_min: c_int, - pub tm_hour: c_int, - pub tm_mday: c_int, - pub tm_mon: c_int, - pub tm_year: c_int, - pub tm_wday: c_int, - pub tm_yday: c_int, - pub tm_isdst: c_int, - pub __tm_gmtoff: c_long, - pub __tm_zone: *const c_char, -} - -#[repr(C)] -pub struct mbstate_t { - pub __opaque1: c_uint, - pub __opaque2: c_uint, -} - -#[repr(C)] -pub struct sem_t { - pub __val: [c_int; 4 * core::mem::size_of::() / core::mem::size_of::()], -} - -#[repr(C)] -pub struct div_t { - pub quot: c_int, - pub rem: c_int, -} - -// fcntl -pub const O_CREAT: u32 = 0100; - -pub const O_EXCL: u32 = 0200; - -pub const O_NOCTTY: u32 = 0400; - -pub const O_TRUNC: u32 = 01000; - -pub const O_APPEND: u32 = 02000; - -pub const O_NONBLOCK: u32 = 04000; - -pub const O_DSYNC: u32 = 010000; - -pub const O_SYNC: u32 = 04010000; - -pub const O_RSYNC: u32 = 04010000; - -pub const O_DIRECTORY: u32 = 0200000; - -pub const O_NOFOLLOW: u32 = 0400000; - -pub const O_CLOEXEC: u32 = 02000000; - -pub const O_ASYNC: u32 = 020000; - -pub const O_DIRECT: u32 = 040000; - -pub const O_LARGEFILE: u32 = 0100000; - -pub const O_NOATIME: u32 = 01000000; - -pub const O_PATH: u32 = 010000000; - -pub const O_TMPFILE: u32 = 020200000; - -pub const O_NDELAY: u32 = O_NONBLOCK; - -pub const F_DUPFD: u32 = 0; - -pub const F_GETFD: u32 = 1; - -pub const F_SETFD: u32 = 2; - -pub const F_GETFL: u32 = 3; - -pub const F_SETFL: u32 = 4; - -pub const F_SETOWN: u32 = 8; - -pub const F_GETOWN: u32 = 9; - -pub const F_SETSIG: u32 = 10; - -pub const F_GETSIG: u32 = 11; - -pub const F_GETLK: u32 = 12; - -pub const F_SETLK: u32 = 13; - -pub const F_SETLKW: u32 = 14; - -pub const F_SETOWN_EX: u32 = 15; - -pub const F_GETOWN_EX: u32 = 16; - -pub const F_GETOWNER_UIDS: u32 = 17; - -// mman -pub const MAP_FAILED: u64 = 0xffffffffffffffff; - -pub const MAP_FIXED_NOREPLACE: u32 = 0x100000; - -pub const MAP_SHARED_VALIDATE: u32 = 0x03; - -pub const MAP_SHARED: u32 = 0x01; - -pub const MAP_PRIVATE: u32 = 0x02; - -pub const MAP_TYPE: u32 = 0x0f; - -pub const MAP_FIXED: u32 = 0x10; - -pub const MAP_ANON: u32 = 0x20; - -pub const MAP_ANONYMOUS: u32 = MAP_ANON; - -pub const MAP_NORESERVE: u32 = 0x4000; - -pub const MAP_GROWSDOWN: u32 = 0x0100; - -pub const MAP_DENYWRITE: u32 = 0x0800; - -pub const MAP_EXECUTABLE: u32 = 0x1000; - -pub const MAP_LOCKED: u32 = 0x2000; - -pub const MAP_POPULATE: u32 = 0x8000; - -pub const MAP_NONBLOCK: u32 = 0x10000; - -pub const MAP_STACK: u32 = 0x20000; - -pub const MAP_HUGETLB: u32 = 0x40000; - -pub const MAP_SYNC: u32 = 0x80000; - -pub const MAP_FILE: u32 = 0; - -pub const MAP_HUGE_SHIFT: u32 = 26; - -pub const MAP_HUGE_MASK: u32 = 0x3f; - -pub const MAP_HUGE_16KB: u32 = 14 << 26; - -pub const MAP_HUGE_64KB: u32 = 16 << 26; - -pub const MAP_HUGE_512KB: u32 = 19 << 26; - -pub const MAP_HUGE_1MB: u32 = 20 << 26; - -pub const MAP_HUGE_2MB: u32 = 21 << 26; - -pub const MAP_HUGE_8MB: u32 = 23 << 26; - -pub const MAP_HUGE_16MB: u32 = 24 << 26; - -pub const MAP_HUGE_32MB: u32 = 25 << 26; - -pub const MAP_HUGE_256MB: u32 = 28 << 26; - -pub const MAP_HUGE_512MB: u32 = 29 << 26; - -pub const MAP_HUGE_1GB: u32 = 30 << 26; - -pub const MAP_HUGE_2GB: u32 = 31 << 26; - -pub const MAP_HUGE_16GB: u32 = 34u32 << 26; - -pub const PROT_NONE: u32 = 0; - -pub const PROT_READ: u32 = 1; - -pub const PROT_WRITE: u32 = 2; - -pub const PROT_EXEC: u32 = 4; - -pub const PROT_GROWSDOWN: u32 = 0x01000000; - -pub const PROT_GROWSUP: u32 = 0x02000000; - -pub const MS_ASYNC: u32 = 1; - -pub const MS_INVALIDATE: u32 = 2; - -pub const MS_SYNC: u32 = 4; - -pub const MCL_CURRENT: u32 = 1; - -pub const MCL_FUTURE: u32 = 2; - -pub const MCL_ONFAULT: u32 = 4; - -pub const POSIX_MADV_NORMAL: u32 = 0; - -pub const POSIX_MADV_RANDOM: u32 = 1; - -pub const POSIX_MADV_SEQUENTIAL: u32 = 2; - -pub const POSIX_MADV_WILLNEED: u32 = 3; - -pub const POSIX_MADV_DONTNEED: u32 = 4; - -// wctype -pub const WCTYPE_ALNUM: u64 = 1; - -pub const WCTYPE_ALPHA: u64 = 2; - -pub const WCTYPE_BLANK: u64 = 3; - -pub const WCTYPE_CNTRL: u64 = 4; - -pub const WCTYPE_DIGIT: u64 = 5; - -pub const WCTYPE_GRAPH: u64 = 6; - -pub const WCTYPE_LOWER: u64 = 7; - -pub const WCTYPE_PRINT: u64 = 8; - -pub const WCTYPE_PUNCT: u64 = 9; - -pub const WCTYPE_SPACE: u64 = 10; - -pub const WCTYPE_UPPER: u64 = 11; - -pub const WCTYPE_XDIGIT: u64 = 12; - -// locale -pub const LC_CTYPE: i32 = 0; - -pub const LC_NUMERIC: i32 = 1; - -pub const LC_TIME: i32 = 2; - -pub const LC_COLLATE: i32 = 3; - -pub const LC_MONETARY: i32 = 4; - -pub const LC_MESSAGES: i32 = 5; - -pub const LC_ALL: i32 = 6; - -// pthread -pub const __SIZEOF_PTHREAD_COND_T: usize = 48; - -pub const __SIZEOF_PTHREAD_MUTEX_T: usize = 40; - -pub const __SIZEOF_PTHREAD_MUTEXATTR_T: usize = 4; - -pub const __SIZEOF_PTHREAD_CONDATTR_T: usize = 4; - -// errno.h -pub const EPERM: c_int = 1; - -pub const ENOENT: c_int = 2; - -pub const ESRCH: c_int = 3; - -pub const EINTR: c_int = 4; - -pub const EIO: c_int = 5; - -pub const ENXIO: c_int = 6; - -pub const E2BIG: c_int = 7; - -pub const ENOEXEC: c_int = 8; - -pub const EBADF: c_int = 9; - -pub const ECHILD: c_int = 10; - -pub const EAGAIN: c_int = 11; - -pub const ENOMEM: c_int = 12; - -pub const EACCES: c_int = 13; - -pub const EFAULT: c_int = 14; - -pub const ENOTBLK: c_int = 15; - -pub const EBUSY: c_int = 16; - -pub const EEXIST: c_int = 17; - -pub const EXDEV: c_int = 18; - -pub const ENODEV: c_int = 19; - -pub const ENOTDIR: c_int = 20; - -pub const EISDIR: c_int = 21; - -pub const EINVAL: c_int = 22; - -pub const ENFILE: c_int = 23; - -pub const EMFILE: c_int = 24; - -pub const ENOTTY: c_int = 25; - -pub const ETXTBSY: c_int = 26; - -pub const EFBIG: c_int = 27; - -pub const ENOSPC: c_int = 28; - -pub const ESPIPE: c_int = 29; - -pub const EROFS: c_int = 30; - -pub const EMLINK: c_int = 31; - -pub const EPIPE: c_int = 32; - -pub const EDOM: c_int = 33; - -pub const ERANGE: c_int = 34; - -pub const EDEADLK: c_int = 35; - -pub const ENAMETOOLONG: c_int = 36; - -pub const ENOLCK: c_int = 37; - -pub const ENOSYS: c_int = 38; - -pub const ENOTEMPTY: c_int = 39; - -pub const ELOOP: c_int = 40; - -pub const EWOULDBLOCK: c_int = EAGAIN; - -pub const ENOMSG: c_int = 42; - -pub const EIDRM: c_int = 43; - -pub const ECHRNG: c_int = 44; - -pub const EL2NSYNC: c_int = 45; - -pub const EL3HLT: c_int = 46; - -pub const EL3RST: c_int = 47; - -pub const ELNRNG: c_int = 48; - -pub const EUNATCH: c_int = 49; - -pub const ENOCSI: c_int = 50; - -pub const EL2HLT: c_int = 51; - -pub const EBADE: c_int = 52; - -pub const EBADR: c_int = 53; - -pub const EXFULL: c_int = 54; - -pub const ENOANO: c_int = 55; - -pub const EBADRQC: c_int = 56; - -pub const EBADSLT: c_int = 57; - -pub const EDEADLOCK: c_int = EDEADLK; - -pub const EBFONT: c_int = 59; - -pub const ENOSTR: c_int = 60; - -pub const ENODATA: c_int = 61; - -pub const ETIME: c_int = 62; - -pub const ENOSR: c_int = 63; - -pub const ENONET: c_int = 64; - -pub const ENOPKG: c_int = 65; - -pub const EREMOTE: c_int = 66; - -pub const ENOLINK: c_int = 67; - -pub const EADV: c_int = 68; - -pub const ESRMNT: c_int = 69; - -pub const ECOMM: c_int = 70; - -pub const EPROTO: c_int = 71; - -pub const EMULTIHOP: c_int = 72; - -pub const EDOTDOT: c_int = 73; - -pub const EBADMSG: c_int = 74; - -pub const EOVERFLOW: c_int = 75; - -pub const ENOTUNIQ: c_int = 76; - -pub const EBADFD: c_int = 77; - -pub const EREMCHG: c_int = 78; - -pub const ELIBACC: c_int = 79; - -pub const ELIBBAD: c_int = 80; - -pub const ELIBSCN: c_int = 81; - -pub const ELIBMAX: c_int = 82; - -pub const ELIBEXEC: c_int = 83; - -pub const EILSEQ: c_int = 84; - -pub const ERESTART: c_int = 85; - -pub const ESTRPIPE: c_int = 86; - -pub const EUSERS: c_int = 87; - -pub const ENOTSOCK: c_int = 88; - -pub const EDESTADDRREQ: c_int = 89; - -pub const EMSGSIZE: c_int = 90; - -pub const EPROTOTYPE: c_int = 91; - -pub const ENOPROTOOPT: c_int = 92; - -pub const EPROTONOSUPPOR: c_int = 93; - -pub const ESOCKTNOSUPPOR: c_int = 94; - -pub const EOPNOTSUPP: c_int = 95; - -pub const ENOTSUP: c_int = EOPNOTSUPP; - -pub const EPFNOSUPPORT: c_int = 96; - -pub const EAFNOSUPPORT: c_int = 97; - -pub const EADDRINUSE: c_int = 98; - -pub const EADDRNOTAVAIL: c_int = 99; - -pub const ENETDOWN: c_int = 100; - -pub const ENETUNREACH: c_int = 101; - -pub const ENETRESET: c_int = 102; - -pub const ECONNABORTED: c_int = 103; - -pub const ECONNRESET: c_int = 104; - -pub const ENOBUFS: c_int = 105; - -pub const EISCONN: c_int = 106; - -pub const ENOTCONN: c_int = 107; - -pub const ESHUTDOWN: c_int = 108; - -pub const ETOOMANYREFS: c_int = 109; - -pub const ETIMEDOUT: c_int = 110; - -pub const ECONNREFUSED: c_int = 111; - -pub const EHOSTDOWN: c_int = 112; - -pub const EHOSTUNREACH: c_int = 113; - -pub const EALREADY: c_int = 114; - -pub const EINPROGRESS: c_int = 115; - -pub const ESTALE: c_int = 116; - -pub const EUCLEAN: c_int = 117; - -pub const ENOTNAM: c_int = 118; - -pub const ENAVAIL: c_int = 119; - -pub const EISNAM: c_int = 120; - -pub const EREMOTEIO: c_int = 121; - -pub const EDQUOT: c_int = 122; - -pub const ENOMEDIUM: c_int = 123; - -pub const EMEDIUMTYPE: c_int = 124; - -pub const ECANCELED: c_int = 125; - -pub const ENOKEY: c_int = 126; - -pub const EKEYEXPIRED: c_int = 127; - -pub const EKEYREVOKED: c_int = 128; - -pub const EKEYREJECTED: c_int = 129; - -pub const EOWNERDEAD: c_int = 130; - -pub const ENOTRECOVERABLE: c_int = 131; - -pub const ERFKILL: c_int = 132; - -pub const EHWPOISON: c_int = 133; - -// pthread_attr.h -pub const TEESMP_THREAD_ATTR_CA_WILDCARD: c_int = 0; - -pub const TEESMP_THREAD_ATTR_CA_INHERIT: c_int = -1; - -pub const TEESMP_THREAD_ATTR_TASK_ID_INHERIT: c_int = -1; - -pub const TEESMP_THREAD_ATTR_HAS_SHADOW: c_int = 0x1; - -pub const TEESMP_THREAD_ATTR_NO_SHADOW: c_int = 0x0; - -// unistd.h -pub const _SC_ARG_MAX: c_int = 0; - -pub const _SC_CHILD_MAX: c_int = 1; - -pub const _SC_CLK_TCK: c_int = 2; - -pub const _SC_NGROUPS_MAX: c_int = 3; - -pub const _SC_OPEN_MAX: c_int = 4; - -pub const _SC_STREAM_MAX: c_int = 5; - -pub const _SC_TZNAME_MAX: c_int = 6; - -pub const _SC_JOB_CONTROL: c_int = 7; - -pub const _SC_SAVED_IDS: c_int = 8; - -pub const _SC_REALTIME_SIGNALS: c_int = 9; - -pub const _SC_PRIORITY_SCHEDULING: c_int = 10; - -pub const _SC_TIMERS: c_int = 11; - -pub const _SC_ASYNCHRONOUS_IO: c_int = 12; - -pub const _SC_PRIORITIZED_IO: c_int = 13; - -pub const _SC_SYNCHRONIZED_IO: c_int = 14; - -pub const _SC_FSYNC: c_int = 15; - -pub const _SC_MAPPED_FILES: c_int = 16; - -pub const _SC_MEMLOCK: c_int = 17; - -pub const _SC_MEMLOCK_RANGE: c_int = 18; - -pub const _SC_MEMORY_PROTECTION: c_int = 19; - -pub const _SC_MESSAGE_PASSING: c_int = 20; - -pub const _SC_SEMAPHORES: c_int = 21; - -pub const _SC_SHARED_MEMORY_OBJECTS: c_int = 22; - -pub const _SC_AIO_LISTIO_MAX: c_int = 23; - -pub const _SC_AIO_MAX: c_int = 24; - -pub const _SC_AIO_PRIO_DELTA_MAX: c_int = 25; - -pub const _SC_DELAYTIMER_MAX: c_int = 26; - -pub const _SC_MQ_OPEN_MAX: c_int = 27; - -pub const _SC_MQ_PRIO_MAX: c_int = 28; - -pub const _SC_VERSION: c_int = 29; - -pub const _SC_PAGE_SIZE: c_int = 30; - -pub const _SC_PAGESIZE: c_int = 30; /* !! */ - -pub const _SC_RTSIG_MAX: c_int = 31; - -pub const _SC_SEM_NSEMS_MAX: c_int = 32; - -pub const _SC_SEM_VALUE_MAX: c_int = 33; - -pub const _SC_SIGQUEUE_MAX: c_int = 34; - -pub const _SC_TIMER_MAX: c_int = 35; - -pub const _SC_BC_BASE_MAX: c_int = 36; - -pub const _SC_BC_DIM_MAX: c_int = 37; - -pub const _SC_BC_SCALE_MAX: c_int = 38; - -pub const _SC_BC_STRING_MAX: c_int = 39; - -pub const _SC_COLL_WEIGHTS_MAX: c_int = 40; - -pub const _SC_EXPR_NEST_MAX: c_int = 42; - -pub const _SC_LINE_MAX: c_int = 43; - -pub const _SC_RE_DUP_MAX: c_int = 44; - -pub const _SC_2_VERSION: c_int = 46; - -pub const _SC_2_C_BIND: c_int = 47; - -pub const _SC_2_C_DEV: c_int = 48; - -pub const _SC_2_FORT_DEV: c_int = 49; - -pub const _SC_2_FORT_RUN: c_int = 50; - -pub const _SC_2_SW_DEV: c_int = 51; - -pub const _SC_2_LOCALEDEF: c_int = 52; - -pub const _SC_UIO_MAXIOV: c_int = 60; /* !! */ - -pub const _SC_IOV_MAX: c_int = 60; - -pub const _SC_THREADS: c_int = 67; - -pub const _SC_THREAD_SAFE_FUNCTIONS: c_int = 68; - -pub const _SC_GETGR_R_SIZE_MAX: c_int = 69; - -pub const _SC_GETPW_R_SIZE_MAX: c_int = 70; - -pub const _SC_LOGIN_NAME_MAX: c_int = 71; - -pub const _SC_TTY_NAME_MAX: c_int = 72; - -pub const _SC_THREAD_DESTRUCTOR_ITERATIONS: c_int = 73; - -pub const _SC_THREAD_KEYS_MAX: c_int = 74; - -pub const _SC_THREAD_STACK_MIN: c_int = 75; - -pub const _SC_THREAD_THREADS_MAX: c_int = 76; - -pub const _SC_THREAD_ATTR_STACKADDR: c_int = 77; - -pub const _SC_THREAD_ATTR_STACKSIZE: c_int = 78; - -pub const _SC_THREAD_PRIORITY_SCHEDULING: c_int = 79; - -pub const _SC_THREAD_PRIO_INHERIT: c_int = 80; - -pub const _SC_THREAD_PRIO_PROTECT: c_int = 81; - -pub const _SC_THREAD_PROCESS_SHARED: c_int = 82; - -pub const _SC_NPROCESSORS_CONF: c_int = 83; - -pub const _SC_NPROCESSORS_ONLN: c_int = 84; - -pub const _SC_PHYS_PAGES: c_int = 85; - -pub const _SC_AVPHYS_PAGES: c_int = 86; - -pub const _SC_ATEXIT_MAX: c_int = 87; - -pub const _SC_PASS_MAX: c_int = 88; - -pub const _SC_XOPEN_VERSION: c_int = 89; - -pub const _SC_XOPEN_XCU_VERSION: c_int = 90; - -pub const _SC_XOPEN_UNIX: c_int = 91; - -pub const _SC_XOPEN_CRYPT: c_int = 92; - -pub const _SC_XOPEN_ENH_I18N: c_int = 93; - -pub const _SC_XOPEN_SHM: c_int = 94; - -pub const _SC_2_CHAR_TERM: c_int = 95; - -pub const _SC_2_UPE: c_int = 97; - -pub const _SC_XOPEN_XPG2: c_int = 98; - -pub const _SC_XOPEN_XPG3: c_int = 99; - -pub const _SC_XOPEN_XPG4: c_int = 100; - -pub const _SC_NZERO: c_int = 109; - -pub const _SC_XBS5_ILP32_OFF32: c_int = 125; - -pub const _SC_XBS5_ILP32_OFFBIG: c_int = 126; - -pub const _SC_XBS5_LP64_OFF64: c_int = 127; - -pub const _SC_XBS5_LPBIG_OFFBIG: c_int = 128; - -pub const _SC_XOPEN_LEGACY: c_int = 129; - -pub const _SC_XOPEN_REALTIME: c_int = 130; - -pub const _SC_XOPEN_REALTIME_THREADS: c_int = 131; - -pub const _SC_ADVISORY_INFO: c_int = 132; - -pub const _SC_BARRIERS: c_int = 133; - -pub const _SC_CLOCK_SELECTION: c_int = 137; - -pub const _SC_CPUTIME: c_int = 138; - -pub const _SC_THREAD_CPUTIME: c_int = 139; - -pub const _SC_MONOTONIC_CLOCK: c_int = 149; - -pub const _SC_READER_WRITER_LOCKS: c_int = 153; - -pub const _SC_SPIN_LOCKS: c_int = 154; - -pub const _SC_REGEXP: c_int = 155; - -pub const _SC_SHELL: c_int = 157; - -pub const _SC_SPAWN: c_int = 159; - -pub const _SC_SPORADIC_SERVER: c_int = 160; - -pub const _SC_THREAD_SPORADIC_SERVER: c_int = 161; - -pub const _SC_TIMEOUTS: c_int = 164; - -pub const _SC_TYPED_MEMORY_OBJECTS: c_int = 165; - -pub const _SC_2_PBS: c_int = 168; - -pub const _SC_2_PBS_ACCOUNTING: c_int = 169; - -pub const _SC_2_PBS_LOCATE: c_int = 170; - -pub const _SC_2_PBS_MESSAGE: c_int = 171; - -pub const _SC_2_PBS_TRACK: c_int = 172; - -pub const _SC_SYMLOOP_MAX: c_int = 173; - -pub const _SC_STREAMS: c_int = 174; - -pub const _SC_2_PBS_CHECKPOINT: c_int = 175; - -pub const _SC_V6_ILP32_OFF32: c_int = 176; - -pub const _SC_V6_ILP32_OFFBIG: c_int = 177; - -pub const _SC_V6_LP64_OFF64: c_int = 178; - -pub const _SC_V6_LPBIG_OFFBIG: c_int = 179; - -pub const _SC_HOST_NAME_MAX: c_int = 180; - -pub const _SC_TRACE: c_int = 181; - -pub const _SC_TRACE_EVENT_FILTER: c_int = 182; - -pub const _SC_TRACE_INHERIT: c_int = 183; - -pub const _SC_TRACE_LOG: c_int = 184; - -pub const _SC_IPV6: c_int = 235; - -pub const _SC_RAW_SOCKETS: c_int = 236; - -pub const _SC_V7_ILP32_OFF32: c_int = 237; - -pub const _SC_V7_ILP32_OFFBIG: c_int = 238; - -pub const _SC_V7_LP64_OFF64: c_int = 239; - -pub const _SC_V7_LPBIG_OFFBIG: c_int = 240; - -pub const _SC_SS_REPL_MAX: c_int = 241; - -pub const _SC_TRACE_EVENT_NAME_MAX: c_int = 242; - -pub const _SC_TRACE_NAME_MAX: c_int = 243; - -pub const _SC_TRACE_SYS_MAX: c_int = 244; - -pub const _SC_TRACE_USER_EVENT_MAX: c_int = 245; - -pub const _SC_XOPEN_STREAMS: c_int = 246; - -pub const _SC_THREAD_ROBUST_PRIO_INHERIT: c_int = 247; - -pub const _SC_THREAD_ROBUST_PRIO_PROTECT: c_int = 248; - -// limits.h -pub const PTHREAD_KEYS_MAX: c_int = 128; - -pub const PTHREAD_STACK_MIN: c_int = 2048; - -pub const PTHREAD_DESTRUCTOR_ITERATIONS: c_int = 4; - -pub const SEM_VALUE_MAX: c_int = 0x7fffffff; - -pub const SEM_NSEMS_MAX: c_int = 256; - -pub const DELAYTIMER_MAX: c_int = 0x7fffffff; - -pub const MQ_PRIO_MAX: c_int = 32768; - -pub const LOGIN_NAME_MAX: c_int = 256; - -// time.h -pub const CLOCK_REALTIME: clockid_t = 0; - -pub const CLOCK_MONOTONIC: clockid_t = 1; - -pub const PTHREAD_MUTEX_INITIALIZER: pthread_mutex_t = pthread_mutex_t { - size: [0; __SIZEOF_PTHREAD_MUTEX_T], -}; - -pub const PTHREAD_COND_INITIALIZER: pthread_cond_t = pthread_cond_t { - size: [0; __SIZEOF_PTHREAD_COND_T], -}; - -pub const PTHREAD_MUTEX_NORMAL: c_int = 0; - -pub const PTHREAD_MUTEX_RECURSIVE: c_int = 1; - -pub const PTHREAD_MUTEX_ERRORCHECK: c_int = 2; - -pub const PTHREAD_MUTEX_DEFAULT: c_int = PTHREAD_MUTEX_NORMAL; - -pub const PTHREAD_MUTEX_STALLED: c_int = 0; - -pub const PTHREAD_MUTEX_ROBUST: c_int = 1; - -extern "C" { - // ---- ALLOC ----------------------------------------------------------------------------- - pub fn calloc(nobj: size_t, size: size_t) -> *mut c_void; - - pub fn malloc(size: size_t) -> *mut c_void; - - pub fn realloc(p: *mut c_void, size: size_t) -> *mut c_void; - - pub fn aligned_alloc(align: size_t, len: size_t) -> *mut c_void; - - pub fn free(p: *mut c_void); - - pub fn posix_memalign(memptr: *mut *mut c_void, align: size_t, size: size_t) -> c_int; - - pub fn memchr(cx: *const c_void, c: c_int, n: size_t) -> *mut c_void; - - pub fn wmemchr(cx: *const wchar_t, c: wchar_t, n: size_t) -> *mut wchar_t; - - pub fn memcmp(cx: *const c_void, ct: *const c_void, n: size_t) -> c_int; - - pub fn memcpy(dest: *mut c_void, src: *const c_void, n: size_t) -> *mut c_void; - - pub fn memmove(dest: *mut c_void, src: *const c_void, n: size_t) -> *mut c_void; - - pub fn memset(dest: *mut c_void, c: c_int, n: size_t) -> *mut c_void; - - // ----- PTHREAD --------------------------------------------------------------------------- - pub fn pthread_self() -> pthread_t; - - pub fn pthread_join(native: pthread_t, value: *mut *mut c_void) -> c_int; - - // detach or pthread_attr_setdetachstate must not be called! - //pub fn pthread_detach(thread: pthread_t) -> c_int; - - pub fn pthread_exit(value: *mut c_void) -> !; - - pub fn pthread_attr_init(attr: *mut pthread_attr_t) -> c_int; - - pub fn pthread_attr_destroy(attr: *mut pthread_attr_t) -> c_int; - - pub fn pthread_attr_getstack( - attr: *const pthread_attr_t, - stackaddr: *mut *mut c_void, - stacksize: *mut size_t, - ) -> c_int; - - pub fn pthread_attr_setstacksize(attr: *mut pthread_attr_t, stack_size: size_t) -> c_int; - - pub fn pthread_attr_getstacksize(attr: *const pthread_attr_t, size: *mut size_t) -> c_int; - - pub fn pthread_attr_settee( - attr: *mut pthread_attr_t, - ca: c_int, - task_id: c_int, - shadow: c_int, - ) -> c_int; - - // C-TA API do not include this interface, but TA can use. - pub fn sched_yield() -> c_int; - - pub fn pthread_key_create( - key: *mut pthread_key_t, - dtor: Option, - ) -> c_int; - - pub fn pthread_key_delete(key: pthread_key_t) -> c_int; - - pub fn pthread_getspecific(key: pthread_key_t) -> *mut c_void; - - pub fn pthread_setspecific(key: pthread_key_t, value: *const c_void) -> c_int; - - pub fn pthread_mutex_destroy(lock: *mut pthread_mutex_t) -> c_int; - - pub fn pthread_mutex_init( - lock: *mut pthread_mutex_t, - attr: *const pthread_mutexattr_t, - ) -> c_int; - - pub fn pthread_mutex_lock(lock: *mut pthread_mutex_t) -> c_int; - - pub fn pthread_mutex_trylock(lock: *mut pthread_mutex_t) -> c_int; - - pub fn pthread_mutex_unlock(lock: *mut pthread_mutex_t) -> c_int; - - pub fn pthread_mutexattr_destroy(attr: *mut pthread_mutexattr_t) -> c_int; - - pub fn pthread_mutexattr_init(attr: *mut pthread_mutexattr_t) -> c_int; - - pub fn pthread_mutexattr_settype(attr: *mut pthread_mutexattr_t, _type: c_int) -> c_int; - - pub fn pthread_mutexattr_setpshared(attr: *mut pthread_mutexattr_t, pshared: c_int) -> c_int; - - pub fn pthread_cond_broadcast(cond: *mut pthread_cond_t) -> c_int; - - pub fn pthread_cond_destroy(cond: *mut pthread_cond_t) -> c_int; - - pub fn pthread_cond_init(cond: *mut pthread_cond_t, attr: *const pthread_condattr_t) -> c_int; - - pub fn pthread_cond_signal(cond: *mut pthread_cond_t) -> c_int; - - pub fn pthread_cond_wait(cond: *mut pthread_cond_t, lock: *mut pthread_mutex_t) -> c_int; - - pub fn pthread_mutexattr_setrobust(attr: *mut pthread_mutexattr_t, robustness: c_int) -> c_int; - - pub fn pthread_create( - native: *mut pthread_t, - attr: *const pthread_attr_t, - f: extern "C" fn(*mut c_void) -> *mut c_void, - value: *mut c_void, - ) -> c_int; - - pub fn pthread_spin_init(lock: *mut pthread_spinlock_t, pshared: c_int) -> c_int; - - pub fn pthread_spin_destroy(lock: *mut pthread_spinlock_t) -> c_int; - - pub fn pthread_spin_lock(lock: *mut pthread_spinlock_t) -> c_int; - - pub fn pthread_spin_trylock(lock: *mut pthread_spinlock_t) -> c_int; - - pub fn pthread_spin_unlock(lock: *mut pthread_spinlock_t) -> c_int; - - pub fn pthread_setschedprio(native: pthread_t, priority: c_int) -> c_int; - - pub fn pthread_once(pot: *mut pthread_once_t, f: Option) -> c_int; - - pub fn pthread_equal(p1: pthread_t, p2: pthread_t) -> c_int; - - pub fn pthread_mutexattr_setprotocol(a: *mut pthread_mutexattr_t, protocol: c_int) -> c_int; - - pub fn pthread_attr_setstack( - attr: *mut pthread_attr_t, - stack: *mut c_void, - size: size_t, - ) -> c_int; - - pub fn pthread_setaffinity_np(td: pthread_t, size: size_t, set: *const cpu_set_t) -> c_int; - - pub fn pthread_getaffinity_np(td: pthread_t, size: size_t, set: *mut cpu_set_t) -> c_int; - - // stdio.h - pub fn printf(fmt: *const c_char, ...) -> c_int; - - pub fn scanf(fmt: *const c_char, ...) -> c_int; - - pub fn snprintf(s: *mut c_char, n: size_t, fmt: *const c_char, ...) -> c_int; - - pub fn sprintf(s: *mut c_char, fmt: *const c_char, ...) -> c_int; - - pub fn vsnprintf(s: *mut c_char, n: size_t, fmt: *const c_char, ap: va_list) -> c_int; - - pub fn vsprintf(s: *mut c_char, fmt: *const c_char, ap: va_list) -> c_int; - - // Not available. - //pub fn pthread_setname_np(thread: pthread_t, name: *const c_char) -> c_int; - - pub fn abort() -> !; - - // Not available. - //pub fn prctl(op: c_int, ...) -> c_int; - - pub fn sched_getaffinity(pid: pid_t, cpusetsize: size_t, cpuset: *mut cpu_set_t) -> c_int; - - pub fn sched_setaffinity(pid: pid_t, cpusetsize: size_t, cpuset: *const cpu_set_t) -> c_int; - - // sysconf is currently only implemented as a stub. - pub fn sysconf(name: c_int) -> c_long; - - // mman.h - pub fn mmap( - addr: *mut c_void, - len: size_t, - prot: c_int, - flags: c_int, - fd: c_int, - offset: off_t, - ) -> *mut c_void; - pub fn munmap(addr: *mut c_void, len: size_t) -> c_int; - - // errno.h - pub fn __errno_location() -> *mut c_int; - - pub fn strerror(e: c_int) -> *mut c_char; - - // time.h - pub fn clock_gettime(clock_id: clockid_t, tp: *mut timespec) -> c_int; - - // unistd - pub fn getpid() -> pid_t; - - // time - pub fn gettimeofday(tv: *mut timeval, tz: *mut c_void) -> c_int; - - pub fn strftime( - restrict: *mut c_char, - sz: size_t, - _restrict: *const c_char, - __restrict: *const tm, - ) -> size_t; - - pub fn time(t: *mut time_t) -> time_t; - - // sem - pub fn sem_close(sem: *mut sem_t) -> c_int; - - pub fn sem_destroy(sem: *mut sem_t) -> c_int; - - pub fn sem_getvalue(sem: *mut sem_t, valp: *mut c_int) -> c_int; - - pub fn sem_init(sem: *mut sem_t, pshared: c_int, value: c_uint) -> c_int; - - pub fn sem_open(name: *const c_char, flags: c_int, ...) -> *mut sem_t; - - pub fn sem_post(sem: *mut sem_t) -> c_int; - - pub fn sem_unlink(name: *const c_char) -> c_int; - - pub fn sem_wait(sem: *mut sem_t) -> c_int; - - // locale - pub fn setlocale(cat: c_int, name: *const c_char) -> *mut c_char; - - pub fn strcoll(l: *const c_char, r: *const c_char) -> c_int; - - pub fn strxfrm(dest: *mut c_char, src: *const c_char, n: size_t) -> size_t; - - pub fn strtod(s: *const c_char, p: *mut *mut c_char) -> c_double; - - // multibyte - pub fn mbrtowc(wc: *mut wchar_t, src: *const c_char, n: size_t, st: *mut mbstate_t) -> size_t; - - pub fn wcrtomb(s: *mut c_char, wc: wchar_t, st: *mut mbstate_t) -> size_t; - - pub fn wctob(c: wint_t) -> c_int; - - // prng - pub fn srandom(seed: c_uint); - - pub fn initstate(seed: c_uint, state: *mut c_char, size: size_t) -> *mut c_char; - - pub fn setstate(state: *mut c_char) -> *mut c_char; - - pub fn random() -> c_long; - - // string - pub fn strchr(s: *const c_char, c: c_int) -> *mut c_char; - - pub fn strlen(cs: *const c_char) -> size_t; - - pub fn strcmp(l: *const c_char, r: *const c_char) -> c_int; - - pub fn strcpy(dest: *mut c_char, src: *const c_char) -> *mut c_char; - - pub fn strncmp(_l: *const c_char, r: *const c_char, n: size_t) -> c_int; - - pub fn strncpy(dest: *mut c_char, src: *const c_char, n: size_t) -> *mut c_char; - - pub fn strnlen(cs: *const c_char, n: size_t) -> size_t; - - pub fn strrchr(s: *const c_char, c: c_int) -> *mut c_char; - - pub fn strstr(h: *const c_char, n: *const c_char) -> *mut c_char; - - pub fn wcschr(s: *const wchar_t, c: wchar_t) -> *mut wchar_t; - - pub fn wcslen(s: *const wchar_t) -> size_t; - - // ctype - pub fn isalpha(c: c_int) -> c_int; - - pub fn isascii(c: c_int) -> c_int; - - pub fn isdigit(c: c_int) -> c_int; - - pub fn islower(c: c_int) -> c_int; - - pub fn isprint(c: c_int) -> c_int; - - pub fn isspace(c: c_int) -> c_int; - - pub fn iswctype(wc: wint_t, ttype: wctype_t) -> c_int; - - pub fn iswdigit(wc: wint_t) -> c_int; - - pub fn iswlower(wc: wint_t) -> c_int; - - pub fn iswspace(wc: wint_t) -> c_int; - - pub fn iswupper(wc: wint_t) -> c_int; - - pub fn towupper(wc: wint_t) -> wint_t; - - pub fn towlower(wc: wint_t) -> wint_t; - - // cmath - pub fn atan(x: c_double) -> c_double; - - pub fn ceil(x: c_double) -> c_double; - - pub fn ceilf(x: c_float) -> c_float; - - pub fn exp(x: c_double) -> c_double; - - pub fn fabs(x: c_double) -> c_double; - - pub fn floor(x: c_double) -> c_double; - - pub fn frexp(x: c_double, e: *mut c_int) -> c_double; - - pub fn log(x: c_double) -> c_double; - - pub fn log2(x: c_double) -> c_double; - - pub fn pow(x: c_double, y: c_double) -> c_double; - - pub fn roundf(x: c_float) -> c_float; - - pub fn scalbn(x: c_double, n: c_int) -> c_double; - - pub fn sqrt(x: c_double) -> c_double; - - // stdlib - pub fn abs(x: c_int) -> c_int; - - pub fn atof(s: *const c_char) -> c_double; - - pub fn atoi(s: *const c_char) -> c_int; - - pub fn atol(s: *const c_char) -> c_long; - - pub fn atoll(s: *const c_char) -> c_longlong; - - pub fn bsearch( - key: *const c_void, - base: *const c_void, - nel: size_t, - width: size_t, - cmp: cmpfunc, - ) -> *mut c_void; - - pub fn div(num: c_int, den: c_int) -> div_t; - - pub fn ecvt(x: c_double, n: c_int, dp: *mut c_int, sign: *mut c_int) -> *mut c_char; - - pub fn imaxabs(a: intmax_t) -> intmax_t; - - pub fn llabs(a: c_longlong) -> c_longlong; - - pub fn qsort(base: *mut c_void, nel: size_t, width: size_t, cmp: cmpfunc); - - pub fn strtoul(s: *const c_char, p: *mut *mut c_char, base: c_int) -> c_ulong; - - pub fn strtol(s: *const c_char, p: *mut *mut c_char, base: c_int) -> c_long; - - pub fn wcstod(s: *const wchar_t, p: *mut *mut wchar_t) -> c_double; -} - -pub fn errno() -> c_int { - unsafe { *__errno_location() } -} - -pub fn CPU_COUNT_S(size: usize, cpuset: &cpu_set_t) -> c_int { - let mut s: u32 = 0; - let size_of_mask = core::mem::size_of_val(&cpuset.bits[0]); - - for i in cpuset.bits[..(size / size_of_mask)].iter() { - s += i.count_ones(); - } - s as c_int -} - -pub fn CPU_COUNT(cpuset: &cpu_set_t) -> c_int { - CPU_COUNT_S(core::mem::size_of::(), cpuset) -} diff -Nru temporalio-1.3.0/vendor/libc/src/unix/aix/mod.rs temporalio-1.3.0/vendor/libc/src/unix/aix/mod.rs --- temporalio-1.3.0/vendor/libc/src/unix/aix/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/libc/src/unix/aix/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1762,7 +1762,6 @@ pub const RUSAGE_THREAD: ::c_int = 1; pub const RLIM_SAVED_MAX: ::c_ulong = RLIM_INFINITY - 1; pub const RLIM_SAVED_CUR: ::c_ulong = RLIM_INFINITY - 2; -#[deprecated(since = "0.2.64", note = "Not stable across OS versions")] pub const RLIM_NLIMITS: ::c_int = 10; // sys/sched.h @@ -2670,7 +2669,6 @@ attr: *const ::pthread_attr_t, guardsize: *mut ::size_t, ) -> ::c_int; - pub fn pthread_attr_setguardsize(attr: *mut ::pthread_attr_t, guardsize: ::size_t) -> ::c_int; pub fn pthread_attr_getschedparam( attr: *const ::pthread_attr_t, param: *mut sched_param, diff -Nru temporalio-1.3.0/vendor/libc/src/unix/bsd/apple/b64/aarch64/align.rs temporalio-1.3.0/vendor/libc/src/unix/bsd/apple/b64/aarch64/align.rs --- temporalio-1.3.0/vendor/libc/src/unix/bsd/apple/b64/aarch64/align.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/libc/src/unix/bsd/apple/b64/aarch64/align.rs 2023-10-30 19:40:00.000000000 +0000 @@ -15,6 +15,7 @@ pub uc_link: *mut ::ucontext_t, pub uc_mcsize: usize, pub uc_mcontext: mcontext_t, + __mcontext_data: __darwin_mcontext64, } pub struct __darwin_mcontext64 { diff -Nru temporalio-1.3.0/vendor/libc/src/unix/bsd/apple/mod.rs temporalio-1.3.0/vendor/libc/src/unix/bsd/apple/mod.rs --- temporalio-1.3.0/vendor/libc/src/unix/bsd/apple/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/libc/src/unix/bsd/apple/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -145,16 +145,6 @@ pub type copyfile_state_t = *mut ::c_void; pub type copyfile_flags_t = u32; -pub type copyfile_callback_t = ::Option< - extern "C" fn( - ::c_int, - ::c_int, - copyfile_state_t, - *const ::c_char, - *const ::c_char, - *mut ::c_void, - ) -> ::c_int, ->; pub type attrgroup_t = u32; pub type vol_capabilities_set_t = [u32; 4]; @@ -378,25 +368,6 @@ pub fst_bytesalloc: ::off_t, } - pub struct fpunchhole_t { - pub fp_flags: ::c_uint, /* unused */ - pub reserved: ::c_uint, /* (to maintain 8-byte alignment) */ - pub fp_offset: ::off_t, /* IN: start of the region */ - pub fp_length: ::off_t, /* IN: size of the region */ - } - - pub struct ftrimactivefile_t { - pub fta_offset: ::off_t, - pub fta_length: ::off_t, - } - - pub struct fspecread_t { - pub fsr_flags: ::c_uint, - pub reserved: ::c_uint, - pub fsr_offset: ::off_t, - pub fsr_length: ::off_t, - } - pub struct radvisory { pub ra_offset: ::off_t, pub ra_count: ::c_int, @@ -3260,9 +3231,6 @@ pub const F_NODIRECT: ::c_int = 62; pub const F_LOG2PHYS_EXT: ::c_int = 65; pub const F_BARRIERFSYNC: ::c_int = 85; -pub const F_PUNCHHOLE: ::c_int = 99; -pub const F_TRIM_ACTIVE_FILE: ::c_int = 100; -pub const F_SPECULATIVE_READ: ::c_int = 101; pub const F_GETPATH_NOFIRMLINK: ::c_int = 102; pub const F_ALLOCATECONTIG: ::c_uint = 0x02; @@ -4221,7 +4189,6 @@ pub const RTLD_NODELETE: ::c_int = 0x80; pub const RTLD_NOLOAD: ::c_int = 0x10; pub const RTLD_GLOBAL: ::c_int = 0x8; -pub const RTLD_MAIN_ONLY: *mut ::c_void = -5isize as *mut ::c_void; pub const _WSTOPPED: ::c_int = 0o177; @@ -4943,19 +4910,6 @@ pub const COPYFILE_CONTINUE: ::c_int = 0; pub const COPYFILE_SKIP: ::c_int = 1; pub const COPYFILE_QUIT: ::c_int = 2; -pub const COPYFILE_STATE_SRC_FD: ::c_int = 1; -pub const COPYFILE_STATE_SRC_FILENAME: ::c_int = 2; -pub const COPYFILE_STATE_DST_FD: ::c_int = 3; -pub const COPYFILE_STATE_DST_FILENAME: ::c_int = 4; -pub const COPYFILE_STATE_QUARANTINE: ::c_int = 5; -pub const COPYFILE_STATE_STATUS_CB: ::c_int = 6; -pub const COPYFILE_STATE_STATUS_CTX: ::c_int = 7; -pub const COPYFILE_STATE_COPIED: ::c_int = 8; -pub const COPYFILE_STATE_XATTRNAME: ::c_int = 9; -pub const COPYFILE_STATE_WAS_CLONED: ::c_int = 10; -pub const COPYFILE_STATE_SRC_BSIZE: ::c_int = 11; -pub const COPYFILE_STATE_DST_BSIZE: ::c_int = 12; -pub const COPYFILE_STATE_BSIZE: ::c_int = 13; // pub const ATTR_BIT_MAP_COUNT: ::c_ushort = 5; @@ -5864,10 +5818,6 @@ state: copyfile_state_t, flags: copyfile_flags_t, ) -> ::c_int; - pub fn copyfile_state_free(s: copyfile_state_t) -> ::c_int; - pub fn copyfile_state_alloc() -> copyfile_state_t; - pub fn copyfile_state_get(s: copyfile_state_t, flags: u32, dst: *mut ::c_void) -> ::c_int; - pub fn copyfile_state_set(s: copyfile_state_t, flags: u32, src: *const ::c_void) -> ::c_int; // Added in macOS 10.13 // ISO/IEC 9899:2011 ("ISO C11") K.3.7.4.1 @@ -6108,15 +6058,6 @@ pub fn dirname(path: *mut ::c_char) -> *mut ::c_char; pub fn basename(path: *mut ::c_char) -> *mut ::c_char; - - pub fn mkfifoat(dirfd: ::c_int, pathname: *const ::c_char, mode: ::mode_t) -> ::c_int; - pub fn mknodat( - dirfd: ::c_int, - pathname: *const ::c_char, - mode: ::mode_t, - dev: dev_t, - ) -> ::c_int; - pub fn freadlink(fd: ::c_int, buf: *mut ::c_char, size: ::size_t) -> ::c_int; } pub unsafe fn mach_task_self() -> ::mach_port_t { @@ -6131,7 +6072,7 @@ } } cfg_if! { - if #[cfg(any(target_os = "macos", target_os = "ios", target_os = "tvos"))] { + if #[cfg(any(target_os = "macos", target_os = "ios"))] { extern "C" { pub fn memmem( haystack: *const ::c_void, diff -Nru temporalio-1.3.0/vendor/libc/src/unix/bsd/freebsdlike/freebsd/mod.rs temporalio-1.3.0/vendor/libc/src/unix/bsd/freebsdlike/freebsd/mod.rs --- temporalio-1.3.0/vendor/libc/src/unix/bsd/freebsdlike/freebsd/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/libc/src/unix/bsd/freebsdlike/freebsd/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -2664,9 +2664,7 @@ pub const MAP_GUARD: ::c_int = 0x00002000; pub const MAP_EXCL: ::c_int = 0x00004000; pub const MAP_PREFAULT_READ: ::c_int = 0x00040000; -pub const MAP_ALIGNMENT_SHIFT: ::c_int = 24; -pub const MAP_ALIGNMENT_MASK: ::c_int = 0xff << MAP_ALIGNMENT_SHIFT; -pub const MAP_ALIGNED_SUPER: ::c_int = 1 << MAP_ALIGNMENT_SHIFT; +pub const MAP_ALIGNED_SUPER: ::c_int = 1 << 24; pub const POSIX_FADV_NORMAL: ::c_int = 0; pub const POSIX_FADV_RANDOM: ::c_int = 1; @@ -4695,11 +4693,6 @@ pub const RB_PROBE: ::c_int = 0x10000000; pub const RB_MULTIPLE: ::c_int = 0x20000000; -// sys/timerfd.h - -pub const TFD_NONBLOCK: ::c_int = ::O_NONBLOCK; -pub const TFD_CLOEXEC: ::c_int = O_CLOEXEC; - cfg_if! { if #[cfg(libc_const_extern_fn)] { pub const fn MAP_ALIGNED(a: ::c_int) -> ::c_int { @@ -5413,15 +5406,6 @@ infotype: *mut ::c_uint, flags: *mut ::c_int, ) -> ::ssize_t; - - pub fn timerfd_create(clockid: ::c_int, flags: ::c_int) -> ::c_int; - pub fn timerfd_gettime(fd: ::c_int, curr_value: *mut itimerspec) -> ::c_int; - pub fn timerfd_settime( - fd: ::c_int, - flags: ::c_int, - new_value: *const itimerspec, - old_value: *mut itimerspec, - ) -> ::c_int; } #[link(name = "memstat")] diff -Nru temporalio-1.3.0/vendor/libc/src/unix/bsd/freebsdlike/mod.rs temporalio-1.3.0/vendor/libc/src/unix/bsd/freebsdlike/mod.rs --- temporalio-1.3.0/vendor/libc/src/unix/bsd/freebsdlike/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/libc/src/unix/bsd/freebsdlike/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1590,7 +1590,6 @@ attr: *const ::pthread_attr_t, guardsize: *mut ::size_t, ) -> ::c_int; - pub fn pthread_attr_setguardsize(attr: *mut ::pthread_attr_t, guardsize: ::size_t) -> ::c_int; pub fn pthread_attr_getstack( attr: *const ::pthread_attr_t, stackaddr: *mut *mut ::c_void, diff -Nru temporalio-1.3.0/vendor/libc/src/unix/bsd/netbsdlike/netbsd/mod.rs temporalio-1.3.0/vendor/libc/src/unix/bsd/netbsdlike/netbsd/mod.rs --- temporalio-1.3.0/vendor/libc/src/unix/bsd/netbsdlike/netbsd/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/libc/src/unix/bsd/netbsdlike/netbsd/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1852,9 +1852,6 @@ pub const MNT_SOFTDEP: ::c_int = 0x80000000; pub const MNT_POSIX1EACLS: ::c_int = 0x00000800; pub const MNT_ACLS: ::c_int = MNT_POSIX1EACLS; -pub const MNT_WAIT: ::c_int = 1; -pub const MNT_NOWAIT: ::c_int = 2; -pub const MNT_LAZY: ::c_int = 3; // pub const NTP_API: ::c_int = 4; @@ -2730,7 +2727,6 @@ attr: *const ::pthread_attr_t, guardsize: *mut ::size_t, ) -> ::c_int; - pub fn pthread_attr_setguardsize(attr: *mut ::pthread_attr_t, guardsize: ::size_t) -> ::c_int; pub fn pthread_attr_getstack( attr: *const ::pthread_attr_t, stackaddr: *mut *mut ::c_void, @@ -3157,38 +3153,6 @@ pub fn kinfo_getvmmap(pid: ::pid_t, cntp: *mut ::size_t) -> *mut kinfo_vmentry; } -#[link(name = "execinfo")] -extern "C" { - pub fn backtrace(addrlist: *mut *mut ::c_void, len: ::size_t) -> ::size_t; - pub fn backtrace_symbols(addrlist: *const *mut ::c_void, len: ::size_t) -> *mut *mut ::c_char; - pub fn backtrace_symbols_fd( - addrlist: *const *mut ::c_void, - len: ::size_t, - fd: ::c_int, - ) -> ::c_int; - pub fn backtrace_symbols_fmt( - addrlist: *const *mut ::c_void, - len: ::size_t, - fmt: *const ::c_char, - ) -> *mut *mut ::c_char; - pub fn backtrace_symbols_fd_fmt( - addrlist: *const *mut ::c_void, - len: ::size_t, - fd: ::c_int, - fmt: *const ::c_char, - ) -> ::c_int; -} - -cfg_if! { - if #[cfg(libc_union)] { - extern { - // these functions use statvfs: - pub fn getmntinfo(mntbufp: *mut *mut ::statvfs, flags: ::c_int) -> ::c_int; - pub fn getvfsstat(buf: *mut statvfs, bufsize: ::size_t, flags: ::c_int) -> ::c_int; - } - } -} - cfg_if! { if #[cfg(target_arch = "aarch64")] { mod aarch64; diff -Nru temporalio-1.3.0/vendor/libc/src/unix/bsd/netbsdlike/openbsd/mod.rs temporalio-1.3.0/vendor/libc/src/unix/bsd/netbsdlike/openbsd/mod.rs --- temporalio-1.3.0/vendor/libc/src/unix/bsd/netbsdlike/openbsd/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/libc/src/unix/bsd/netbsdlike/openbsd/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -999,8 +999,6 @@ pub const SO_RTABLE: ::c_int = 0x1021; pub const SO_PEERCRED: ::c_int = 0x1022; pub const SO_SPLICE: ::c_int = 0x1023; -pub const SO_DOMAIN: ::c_int = 0x1024; -pub const SO_PROTOCOL: ::c_int = 0x1025; // sys/netinet/in.h // Protocols (RFC 1700) @@ -1827,7 +1825,6 @@ attr: *const ::pthread_attr_t, guardsize: *mut ::size_t, ) -> ::c_int; - pub fn pthread_attr_setguardsize(attr: *mut ::pthread_attr_t, guardsize: ::size_t) -> ::c_int; pub fn pthread_attr_getstack( attr: *const ::pthread_attr_t, stackaddr: *mut *mut ::c_void, diff -Nru temporalio-1.3.0/vendor/libc/src/unix/haiku/mod.rs temporalio-1.3.0/vendor/libc/src/unix/haiku/mod.rs --- temporalio-1.3.0/vendor/libc/src/unix/haiku/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/libc/src/unix/haiku/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -741,7 +741,6 @@ pub const RLIM_INFINITY: ::rlim_t = 0xffffffff; // Haiku specific pub const RLIMIT_NOVMON: ::c_int = 7; -#[deprecated(since = "0.2.64", note = "Not stable across OS versions")] pub const RLIM_NLIMITS: ::c_int = 8; pub const RUSAGE_SELF: ::c_int = 0; @@ -1680,7 +1679,6 @@ attr: *const ::pthread_attr_t, guardsize: *mut ::size_t, ) -> ::c_int; - pub fn pthread_attr_setguardsize(attr: *mut ::pthread_attr_t, guardsize: ::size_t) -> ::c_int; pub fn pthread_attr_getstack( attr: *const ::pthread_attr_t, stackaddr: *mut *mut ::c_void, @@ -2065,14 +2063,6 @@ search: *const ::c_void, searchLength: ::size_t, ) -> *mut ::c_void; - - pub fn pthread_getattr_np(thread: ::pthread_t, attr: *mut ::pthread_attr_t) -> ::c_int; - pub fn pthread_getname_np( - thread: ::pthread_t, - buffer: *mut ::c_char, - length: ::size_t, - ) -> ::c_int; - pub fn pthread_setname_np(thread: ::pthread_t, name: *const ::c_char) -> ::c_int; } cfg_if! { diff -Nru temporalio-1.3.0/vendor/libc/src/unix/hermit/aarch64.rs temporalio-1.3.0/vendor/libc/src/unix/hermit/aarch64.rs --- temporalio-1.3.0/vendor/libc/src/unix/hermit/aarch64.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/libc/src/unix/hermit/aarch64.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,2 @@ +pub type c_char = u8; +pub type wchar_t = u32; diff -Nru temporalio-1.3.0/vendor/libc/src/unix/hermit/mod.rs temporalio-1.3.0/vendor/libc/src/unix/hermit/mod.rs --- temporalio-1.3.0/vendor/libc/src/unix/hermit/mod.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/libc/src/unix/hermit/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,1023 @@ +// liblibc port for HermitCore (https://hermitcore.org) +// HermitCore is a unikernel based on lwIP, newlib, and +// pthread-embedded. +// Consider these definitions when porting liblibc to another +// lwIP/newlib/pte-based target. +// +// Ported by Colin Finck + +pub type c_long = i64; +pub type c_ulong = u64; + +pub type speed_t = ::c_uint; +pub type mode_t = u32; +pub type dev_t = i16; +pub type nfds_t = ::c_ulong; +pub type socklen_t = u32; +pub type sa_family_t = u8; +pub type clock_t = c_ulong; +pub type time_t = c_long; +pub type suseconds_t = c_long; +pub type off_t = i64; +pub type rlim_t = ::c_ulonglong; +pub type sigset_t = ::c_ulong; +pub type ino_t = u16; +pub type nlink_t = u16; +pub type blksize_t = c_long; +pub type blkcnt_t = c_long; +pub type stat64 = stat; +pub type clockid_t = c_ulong; +pub type pthread_t = pte_handle_t; +pub type pthread_attr_t = usize; +pub type pthread_cond_t = usize; +pub type pthread_condattr_t = usize; +pub type pthread_key_t = usize; +pub type pthread_mutex_t = usize; +pub type pthread_mutexattr_t = usize; +pub type pthread_rwlock_t = usize; +pub type pthread_rwlockattr_t = usize; + +s_no_extra_traits! { + pub struct dirent { + pub d_ino: ::c_long, + pub d_off: off_t, + pub d_reclen: u16, + pub d_name: [::c_char; 256], + } + + // Dummy + pub struct sockaddr_un { + pub sun_family: sa_family_t, + pub sun_path: [::c_char; 108], + } + + pub struct sockaddr { + pub sa_len: u8, + pub sa_family: sa_family_t, + pub sa_data: [::c_char; 14], + } + + pub struct sockaddr_in { + pub sin_len: u8, + pub sin_family: sa_family_t, + pub sin_port: ::in_port_t, + pub sin_addr: ::in_addr, + pub sin_zero: [::c_char; 8], + } + + pub struct fd_set { + fds_bits: [::c_ulong; FD_SETSIZE / ULONG_SIZE], + } + + pub struct sockaddr_storage { + pub s2_len: u8, + pub ss_family: sa_family_t, + pub s2_data1: [::c_char; 2], + pub s2_data2: [u32; 3], + pub s2_data3: [u32; 3], + } + + pub struct stat { + pub st_dev: ::dev_t, + pub st_ino: ::ino_t, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: dev_t, + pub st_size: off_t, + pub st_atime: time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: time_t, + pub st_ctime_nsec: ::c_long, + pub st_blksize: blksize_t, + pub st_blocks: blkcnt_t, + pub st_spare4: [::c_long; 2], + } +} + +cfg_if! { + if #[cfg(feature = "extra_traits")] { + impl PartialEq for dirent { + fn eq(&self, other: &dirent) -> bool { + self.d_ino == other.d_ino + && self.d_off == other.d_off + && self.d_reclen == other.d_reclen + && self + .d_name + .iter() + .zip(other.d_name.iter()) + .all(|(a,b)| a == b) + } + } + impl Eq for dirent {} + impl ::fmt::Debug for dirent { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("dirent") + .field("d_ino", &self.d_ino) + .field("d_off", &self.d_off) + .field("d_reclen", &self.d_reclen) + // FIXME: .field("d_name", &self.d_name) + .finish() + } + } + impl ::hash::Hash for dirent { + fn hash(&self, state: &mut H) { + self.d_ino.hash(state); + self.d_off.hash(state); + self.d_reclen.hash(state); + self.d_name.hash(state); + } + } + + impl PartialEq for sockaddr_un { + fn eq(&self, other: &sockaddr_un) -> bool { + self.sun_family == other.sun_family + && self + .sun_path + .iter() + .zip(other.sun_path.iter()) + .all(|(a,b)| a == b) + } + } + impl Eq for sockaddr_un {} + impl ::fmt::Debug for sockaddr_un { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("sockaddr_un") + .field("sun_family", &self.sun_family) + // FIXME: .field("sun_path", &self.sun_path) + .finish() + } + } + impl ::hash::Hash for sockaddr_un { + fn hash(&self, state: &mut H) { + self.sun_family.hash(state); + self.sun_path.hash(state); + } + } + + impl PartialEq for sockaddr { + fn eq(&self, other: &sockaddr) -> bool { + self.sa_len == other.sa_len + && self.sa_family == other.sa_family + && self + .sa_data + .iter() + .zip(other.sa_data.iter()) + .all(|(a,b)| a == b) + } + } + impl Eq for sockaddr {} + impl ::fmt::Debug for sockaddr { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("sockaddr") + .field("sa_len", &self.sa_len) + .field("sa_family", &self.sa_family) + // FIXME: .field("sa_data", &self.sa_data) + .finish() + } + } + impl ::hash::Hash for sockaddr { + fn hash(&self, state: &mut H) { + self.sa_len.hash(state); + self.sa_family.hash(state); + self.sa_data.hash(state); + } + } + + impl PartialEq for sockaddr_in { + fn eq(&self, other: &sockaddr_in) -> bool { + self.sin_len == other.sin_len + && self.sin_family == other.sin_family + && self.sin_port == other.sin_port + && self.sin_addr == other.sin_addr + && self + .sin_zero + .iter() + .zip(other.sin_zero.iter()) + .all(|(a,b)| a == b) + } + } + impl Eq for sockaddr_in {} + impl ::fmt::Debug for sockaddr_in { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("sockaddr_in") + .field("sin_len", &self.sin_len) + .field("sin_family", &self.sin_family) + .field("sin_port", &self.sin_port) + .field("sin_addr", &self.sin_addr) + // FIXME: .field("sin_zero", &self.sin_zero) + .finish() + } + } + impl ::hash::Hash for sockaddr_in { + fn hash(&self, state: &mut H) { + self.sin_len.hash(state); + self.sin_family.hash(state); + self.sin_port.hash(state); + self.sin_addr.hash(state); + self.sin_zero.hash(state); + } + } + + impl PartialEq for fd_set { + fn eq(&self, other: &fd_set) -> bool { + self.fds_bits + .iter() + .zip(other.fds_bits.iter()) + .all(|(a,b)| a == b) + } + } + impl Eq for fd_set {} + impl ::fmt::Debug for fd_set { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("fd_set") + // FIXME: .field("fds_bits", &self.fds_bits) + .finish() + } + } + impl ::hash::Hash for fd_set { + fn hash(&self, state: &mut H) { + self.fds_bits.hash(state); + } + } + + impl PartialEq for sockaddr_storage { + fn eq(&self, other: &sockaddr_storage) -> bool { + self.s2_len == other.s2_len + && self.ss_family == other.ss_family + && self.s2_data1 + .iter() + .zip(other.s2_data1.iter()) + .all(|(a,b)| a == b) + && self.s2_data2 + .iter() + .zip(other.s2_data2.iter()) + .all(|(a,b)| a == b) + && self.s2_data3 + .iter() + .zip(other.s2_data3.iter()) + .all(|(a,b)| a == b) + } + } + impl Eq for sockaddr_storage {} + impl ::fmt::Debug for sockaddr_storage { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("sockaddr_storage") + .field("s2_len", &self.s2_len) + .field("ss_family", &self.ss_family) + // FIXME: .field("s2_data1", &self.s2_data1) + // FIXME: .field("s2_data2", &self.s2_data2) + // FIXME: .field("s2_data3", &self.s2_data3) + .finish() + } + } + impl ::hash::Hash for sockaddr_storage { + fn hash(&self, state: &mut H) { + self.s2_len.hash(state); + self.ss_family.hash(state); + self.s2_data1.hash(state); + self.s2_data2.hash(state); + self.s2_data3.hash(state); + } + } + + impl PartialEq for stat { + fn eq(&self, other: &stat) -> bool { + self.st_dev == other.st_dev + && self.st_ino == other.st_ino + && self.st_mode == other.st_mode + && self.st_nlink == other.st_nlink + && self.st_uid == other.st_uid + && self.st_gid == other.st_gid + && self.st_rdev == other.st_rdev + && self.st_size == other.st_size + && self.st_atime == other.st_atime + && self.st_atime_nsec == other.st_atime_nsec + && self.st_mtime == other.st_mtime + && self.st_mtime_nsec == other.st_mtime_nsec + && self.st_ctime == other.st_ctime + && self.st_ctime_nsec == other.st_ctime_nsec + && self.st_blksize == other.st_blksize + && self.st_blocks == other.st_blocks + && self + .st_spare4 + .iter() + .zip(other.st_spare4.iter()) + .all(|(a,b)| a == b) + } + } + impl Eq for stat {} + impl ::fmt::Debug for stat { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("stat") + .field("st_dev", &self.st_dev) + .field("st_ino", &self.st_ino) + .field("st_mode", &self.st_mode) + .field("st_nlink", &self.st_nlink) + .field("st_uid", &self.st_uid) + .field("st_gid", &self.st_gid) + .field("st_rdev", &self.st_rdev) + .field("st_size", &self.st_size) + .field("st_atime", &self.st_atime) + .field("st_atime_nsec", &self.st_atime_nsec) + .field("st_mtime", &self.st_mtime) + .field("st_mtime_nsec", &self.st_mtime_nsec) + .field("st_ctime", &self.st_ctime) + .field("st_ctime_nsec", &self.st_ctime_nsec) + .field("st_blksize", &self.st_blksize) + .field("st_blocks", &self.st_blocks) + // FIXME: .field("st_spare4", &self.st_spare4) + .finish() + } + } + impl ::hash::Hash for stat { + fn hash(&self, state: &mut H) { + self.st_dev.hash(state); + self.st_ino.hash(state); + self.st_mode.hash(state); + self.st_nlink.hash(state); + self.st_uid.hash(state); + self.st_gid.hash(state); + self.st_rdev.hash(state); + self.st_size.hash(state); + self.st_atime.hash(state); + self.st_atime_nsec.hash(state); + self.st_mtime.hash(state); + self.st_mtime_nsec.hash(state); + self.st_ctime.hash(state); + self.st_ctime_nsec.hash(state); + self.st_blksize.hash(state); + self.st_blocks.hash(state); + self.st_spare4.hash(state); + } + } + } +} + +s! { + pub struct in_addr { + pub s_addr: ::in_addr_t, + } + + pub struct ip_mreq { + pub imr_multiaddr: in_addr, + pub imr_interface: in_addr, + } + + pub struct addrinfo { + pub ai_flags: ::c_int, + pub ai_family: ::c_int, + pub ai_socktype: ::c_int, + pub ai_protocol: ::c_int, + pub ai_addrlen: socklen_t, + pub ai_addr: *mut ::sockaddr, + pub ai_canonname: *mut c_char, + pub ai_next: *mut addrinfo, + } + + pub struct Dl_info {} + + pub struct lconv { + pub decimal_point: *mut ::c_char, + pub thousands_sep: *mut ::c_char, + pub grouping: *mut ::c_char, + pub int_curr_symbol: *mut ::c_char, + pub currency_symbol: *mut ::c_char, + pub mon_decimal_point: *mut ::c_char, + pub mon_thousands_sep: *mut ::c_char, + pub mon_grouping: *mut ::c_char, + pub positive_sign: *mut ::c_char, + pub negative_sign: *mut ::c_char, + pub int_frac_digits: ::c_char, + pub frac_digits: ::c_char, + pub p_cs_precedes: ::c_char, + pub p_sep_by_space: ::c_char, + pub n_cs_precedes: ::c_char, + pub n_sep_by_space: ::c_char, + pub p_sign_posn: ::c_char, + pub n_sign_posn: ::c_char, + pub int_p_cs_precedes: ::c_char, + pub int_p_sep_by_space: ::c_char, + pub int_n_cs_precedes: ::c_char, + pub int_n_sep_by_space: ::c_char, + pub int_p_sign_posn: ::c_char, + pub int_n_sign_posn: ::c_char, + } + + pub struct passwd { // Unverified + pub pw_name: *mut ::c_char, + pub pw_passwd: *mut ::c_char, + pub pw_uid: ::uid_t, + pub pw_gid: ::gid_t, + pub pw_gecos: *mut ::c_char, + pub pw_dir: *mut ::c_char, + pub pw_shell: *mut ::c_char, + } + + pub struct pte_handle_t { + pub p: usize, + pub x: ::c_uint, + } + + pub struct sched_param { + pub sched_priority: ::c_int, + } + + pub struct sem_t { + pub value: i32, + pub lock: usize, + pub sem: usize, + } + + pub struct sigaction { + pub sa_flags: ::c_int, + pub sa_mask: sigset_t, + pub sa_handler: usize, + } + + pub struct sockaddr_in6 { + pub sin6_len: u8, + pub sin6_family: sa_family_t, + pub sin6_port: ::in_port_t, + pub sin6_flowinfo: u32, + pub sin6_addr: ::in6_addr, + pub sin6_scope_id: u32, + } + + pub struct statvfs {} + + pub struct tm { + pub tm_sec: ::c_int, + pub tm_min: ::c_int, + pub tm_hour: ::c_int, + pub tm_mday: ::c_int, + pub tm_mon: ::c_int, + pub tm_year: ::c_int, + pub tm_wday: ::c_int, + pub tm_yday: ::c_int, + pub tm_isdst: ::c_int, + } + + pub struct tms { + pub tms_utime: ::clock_t, + pub tms_stime: ::clock_t, + pub tms_cutime: ::clock_t, + pub tms_cstime: ::clock_t, + } + + pub struct termios {} + + pub struct utsname {} +} + +pub const AF_UNSPEC: ::c_int = 0; +pub const AF_INET: ::c_int = 2; +pub const AF_INET6: ::c_int = 10; + +// Dummy +pub const AF_UNIX: ::c_int = 1; + +pub const CLOCK_REALTIME: ::clockid_t = 1; +pub const CLOCK_MONOTONIC: ::clockid_t = 4; + +// Dummy +pub const EAI_SYSTEM: ::c_int = -11; + +pub const EPERM: ::c_int = 1; +pub const ENOENT: ::c_int = 2; +pub const ESRCH: ::c_int = 3; +pub const EINTR: ::c_int = 4; +pub const EIO: ::c_int = 5; +pub const ENXIO: ::c_int = 6; +pub const E2BIG: ::c_int = 7; +pub const ENOEXEC: ::c_int = 8; +pub const EBADF: ::c_int = 9; +pub const ECHILD: ::c_int = 10; +pub const EAGAIN: ::c_int = 11; +pub const ENOMEM: ::c_int = 12; +pub const EACCES: ::c_int = 13; +pub const EFAULT: ::c_int = 14; +pub const EBUSY: ::c_int = 16; +pub const EEXIST: ::c_int = 17; +pub const EXDEV: ::c_int = 18; +pub const ENODEV: ::c_int = 19; +pub const ENOTDIR: ::c_int = 20; +pub const EISDIR: ::c_int = 21; +pub const EINVAL: ::c_int = 22; +pub const ENFILE: ::c_int = 23; +pub const EMFILE: ::c_int = 24; +pub const ENOTTY: ::c_int = 25; +pub const ETXTBSY: ::c_int = 26; +pub const EFBIG: ::c_int = 27; +pub const ENOSPC: ::c_int = 28; +pub const ESPIPE: ::c_int = 29; +pub const EROFS: ::c_int = 30; +pub const EMLINK: ::c_int = 31; +pub const EPIPE: ::c_int = 32; +pub const EDOM: ::c_int = 33; +pub const ERANGE: ::c_int = 34; +pub const EDEADLK: ::c_int = 35; +pub const ENAMETOOLONG: ::c_int = 36; +pub const ENOLCK: ::c_int = 37; +pub const ENOSYS: ::c_int = 38; +pub const ENOTEMPTY: ::c_int = 39; +pub const ELOOP: ::c_int = 40; +pub const EWOULDBLOCK: ::c_int = EAGAIN; +pub const ENOMSG: ::c_int = 42; +pub const EIDRM: ::c_int = 43; +pub const ECHRNG: ::c_int = 44; +pub const EL2NSYNC: ::c_int = 45; +pub const EL3HLT: ::c_int = 46; +pub const EL3RST: ::c_int = 47; +pub const ELNRNG: ::c_int = 48; +pub const EUNATCH: ::c_int = 49; +pub const ENOCSI: ::c_int = 50; +pub const EL2HLT: ::c_int = 51; +pub const EBADE: ::c_int = 52; +pub const EBADR: ::c_int = 53; +pub const EXFULL: ::c_int = 54; +pub const ENOANO: ::c_int = 55; +pub const EBADRQC: ::c_int = 56; +pub const EBADSLT: ::c_int = 57; +pub const EDEADLOCK: ::c_int = EDEADLK; +pub const EBFONT: ::c_int = 59; +pub const ENOSTR: ::c_int = 60; +pub const ENODATA: ::c_int = 61; +pub const ETIME: ::c_int = 62; +pub const ENOSR: ::c_int = 63; +pub const ENONET: ::c_int = 64; +pub const ENOPKG: ::c_int = 65; +pub const EREMOTE: ::c_int = 66; +pub const ENOLINK: ::c_int = 67; +pub const EADV: ::c_int = 68; +pub const ESRMNT: ::c_int = 69; +pub const ECOMM: ::c_int = 70; +pub const EPROTO: ::c_int = 71; +pub const EMULTIHOP: ::c_int = 72; +pub const EDOTDOT: ::c_int = 73; +pub const EBADMSG: ::c_int = 74; +pub const EOVERFLOW: ::c_int = 75; +pub const ENOTUNIQ: ::c_int = 76; +pub const EBADFD: ::c_int = 77; +pub const EREMCHG: ::c_int = 78; +pub const ELIBACC: ::c_int = 79; +pub const ELIBBAD: ::c_int = 80; +pub const ELIBSCN: ::c_int = 81; +pub const ELIBMAX: ::c_int = 82; +pub const ELIBEXEC: ::c_int = 83; +pub const EILSEQ: ::c_int = 84; +pub const ERESTART: ::c_int = 85; +pub const ESTRPIPE: ::c_int = 86; +pub const EUSERS: ::c_int = 87; +pub const ENOTSOCK: ::c_int = 88; +pub const EDESTADDRREQ: ::c_int = 89; +pub const EMSGSIZE: ::c_int = 90; +pub const EPROTOTYPE: ::c_int = 91; +pub const ENOPROTOOPT: ::c_int = 92; +pub const EPROTONOSUPPORT: ::c_int = 93; +pub const ESOCKTNOSUPPORT: ::c_int = 94; +pub const EOPNOTSUPP: ::c_int = 95; +pub const EPFNOSUPPORT: ::c_int = 96; +pub const EAFNOSUPPORT: ::c_int = 97; +pub const EADDRINUSE: ::c_int = 98; +pub const EADDRNOTAVAIL: ::c_int = 99; +pub const ENETDOWN: ::c_int = 100; +pub const ENETUNREACH: ::c_int = 101; +pub const ENETRESET: ::c_int = 102; +pub const ECONNABORTED: ::c_int = 103; +pub const ECONNRESET: ::c_int = 104; +pub const ENOBUFS: ::c_int = 105; +pub const EISCONN: ::c_int = 106; +pub const ENOTCONN: ::c_int = 107; +pub const ESHUTDOWN: ::c_int = 108; +pub const ETOOMANYREFS: ::c_int = 109; +pub const ETIMEDOUT: ::c_int = 110; +pub const ECONNREFUSED: ::c_int = 111; +pub const EHOSTDOWN: ::c_int = 112; +pub const EHOSTUNREACH: ::c_int = 113; +pub const EALREADY: ::c_int = 114; +pub const EINPROGRESS: ::c_int = 115; +pub const ESTALE: ::c_int = 116; +pub const EUCLEAN: ::c_int = 117; +pub const ENOTNAM: ::c_int = 118; +pub const ENAVAIL: ::c_int = 119; +pub const EISNAM: ::c_int = 120; +pub const EREMOTEIO: ::c_int = 121; +pub const EDQUOT: ::c_int = 122; +pub const ENOMEDIUM: ::c_int = 123; +pub const EMEDIUMTYPE: ::c_int = 124; +pub const ECANCELED: ::c_int = 125; +pub const ENOKEY: ::c_int = 126; +pub const EKEYEXPIRED: ::c_int = 127; +pub const EKEYREVOKED: ::c_int = 128; +pub const EKEYREJECTED: ::c_int = 129; +pub const EOWNERDEAD: ::c_int = 130; +pub const ENOTRECOVERABLE: ::c_int = 131; +pub const ERFKILL: ::c_int = 132; +pub const EHWPOISON: ::c_int = 133; + +pub const EXIT_FAILURE: ::c_int = 1; +pub const EXIT_SUCCESS: ::c_int = 0; + +pub const F_DUPFD: ::c_int = 0; +pub const F_GETFD: ::c_int = 1; +pub const F_SETFD: ::c_int = 2; +pub const F_GETFL: ::c_int = 3; +pub const F_SETFL: ::c_int = 4; +pub const F_GETOWN: ::c_int = 5; +pub const F_SETOWN: ::c_int = 6; +pub const F_GETLK: ::c_int = 7; +pub const F_SETLK: ::c_int = 8; +pub const F_SETLKW: ::c_int = 9; +pub const F_RGETLK: ::c_int = 10; +pub const F_RSETLK: ::c_int = 11; +pub const F_CNVT: ::c_int = 12; +pub const F_RSETLKW: ::c_int = 13; +pub const F_DUPFD_CLOEXEC: ::c_int = 14; + +pub const FD_SETSIZE: usize = 1024; + +// Dummy +pub const FIOCLEX: ::c_int = 0x5451; + +pub const FIONBIO: ::c_int = 0x8004667e; +pub const FIONREAD: ::c_int = 0x4004667f; + +pub const IP_ADD_MEMBERSHIP: ::c_int = 3; +pub const IP_DROP_MEMBERSHIP: ::c_int = 4; + +pub const IP_TOS: ::c_int = 1; +pub const IP_TTL: ::c_int = 2; + +pub const IP_MULTICAST_TTL: ::c_int = 5; +pub const IP_MULTICAST_IF: ::c_int = 6; +pub const IP_MULTICAST_LOOP: ::c_int = 7; + +pub const IPV6_JOIN_GROUP: ::c_int = 12; +pub const IPV6_ADD_MEMBERSHIP: ::c_int = 12; +pub const IPV6_LEAVE_GROUP: ::c_int = 13; +pub const IPV6_DROP_MEMBERSHIP: ::c_int = 13; +pub const IPV6_V6ONLY: ::c_int = 27; + +// Dummy +pub const IPV6_MULTICAST_LOOP: ::c_int = 7; + +pub const MSG_PEEK: ::c_int = 0x01; +pub const MSG_WAITALL: ::c_int = 0x02; +pub const MSG_OOB: ::c_int = 0x04; +pub const MSG_DONTWAIT: ::c_int = 0x08; +pub const MSG_MORE: ::c_int = 0x10; + +pub const O_ACCMODE: ::c_int = 3; +pub const O_RDONLY: ::c_int = 0; +pub const O_WRONLY: ::c_int = 1; +pub const O_RDWR: ::c_int = 2; +pub const O_APPEND: ::c_int = 1024; +pub const O_CREAT: ::c_int = 64; +pub const O_EXCL: ::c_int = 128; +pub const O_NOCTTY: ::c_int = 256; +pub const O_NONBLOCK: ::c_int = 2048; +pub const O_TRUNC: ::c_int = 512; +pub const O_CLOEXEC: ::c_int = 524288; + +pub const POLLIN: ::c_short = 0x1; +pub const POLLPRI: ::c_short = 0x2; +pub const POLLOUT: ::c_short = 0x4; +pub const POLLERR: ::c_short = 0x8; +pub const POLLHUP: ::c_short = 0x10; +pub const POLLNVAL: ::c_short = 0x20; + +pub const PTHREAD_COND_INITIALIZER: pthread_cond_t = usize::max_value(); +pub const PTHREAD_MUTEX_INITIALIZER: pthread_mutex_t = usize::max_value(); +pub const PTHREAD_RWLOCK_INITIALIZER: pthread_rwlock_t = usize::max_value(); + +pub const PTHREAD_MUTEX_NORMAL: ::c_int = 0; +pub const PTHREAD_MUTEX_RECURSIVE: ::c_int = 1; +pub const PTHREAD_STACK_MIN: ::size_t = 0; + +// Dummy +pub const RTLD_DEFAULT: *mut ::c_void = 0i64 as *mut ::c_void; + +pub const _SC_ARG_MAX: ::c_int = 0; +pub const _SC_CHILD_MAX: ::c_int = 1; +pub const _SC_CLK_TCK: ::c_int = 2; +pub const _SC_NGROUPS_MAX: ::c_int = 3; +pub const _SC_OPEN_MAX: ::c_int = 4; +pub const _SC_JOB_CONTROL: ::c_int = 5; +pub const _SC_SAVED_IDS: ::c_int = 6; +pub const _SC_VERSION: ::c_int = 7; +pub const _SC_PAGESIZE: ::c_int = 8; +pub const _SC_PAGE_SIZE: ::c_int = _SC_PAGESIZE; +pub const _SC_NPROCESSORS_CONF: ::c_int = 9; +pub const _SC_NPROCESSORS_ONLN: ::c_int = 10; +pub const _SC_PHYS_PAGES: ::c_int = 11; +pub const _SC_AVPHYS_PAGES: ::c_int = 12; +pub const _SC_MQ_OPEN_MAX: ::c_int = 13; +pub const _SC_MQ_PRIO_MAX: ::c_int = 14; +pub const _SC_RTSIG_MAX: ::c_int = 15; +pub const _SC_SEM_NSEMS_MAX: ::c_int = 16; +pub const _SC_SEM_VALUE_MAX: ::c_int = 17; +pub const _SC_SIGQUEUE_MAX: ::c_int = 18; +pub const _SC_TIMER_MAX: ::c_int = 19; +pub const _SC_TZNAME_MAX: ::c_int = 20; +pub const _SC_ASYNCHRONOUS_IO: ::c_int = 21; +pub const _SC_FSYNC: ::c_int = 22; +pub const _SC_MAPPED_FILES: ::c_int = 23; +pub const _SC_MEMLOCK: ::c_int = 24; +pub const _SC_MEMLOCK_RANGE: ::c_int = 25; +pub const _SC_MEMORY_PROTECTION: ::c_int = 26; +pub const _SC_MESSAGE_PASSING: ::c_int = 27; +pub const _SC_PRIORITIZED_IO: ::c_int = 28; +pub const _SC_REALTIME_SIGNALS: ::c_int = 29; +pub const _SC_SEMAPHORES: ::c_int = 30; +pub const _SC_SHARED_MEMORY_OBJECTS: ::c_int = 31; +pub const _SC_SYNCHRONIZED_IO: ::c_int = 32; +pub const _SC_TIMERS: ::c_int = 33; +pub const _SC_AIO_LISTIO_MAX: ::c_int = 34; +pub const _SC_AIO_MAX: ::c_int = 35; +pub const _SC_AIO_PRIO_DELTA_MAX: ::c_int = 36; +pub const _SC_DELAYTIMER_MAX: ::c_int = 37; +pub const _SC_THREAD_KEYS_MAX: ::c_int = 38; +pub const _SC_THREAD_STACK_MIN: ::c_int = 39; +pub const _SC_THREAD_THREADS_MAX: ::c_int = 40; +pub const _SC_TTY_NAME_MAX: ::c_int = 41; +pub const _SC_THREADS: ::c_int = 42; +pub const _SC_THREAD_ATTR_STACKADDR: ::c_int = 43; +pub const _SC_THREAD_ATTR_STACKSIZE: ::c_int = 44; +pub const _SC_THREAD_PRIORITY_SCHEDULING: ::c_int = 45; +pub const _SC_THREAD_PRIO_INHERIT: ::c_int = 46; +pub const _SC_THREAD_PRIO_PROTECT: ::c_int = 47; +pub const _SC_THREAD_PRIO_CEILING: ::c_int = _SC_THREAD_PRIO_PROTECT; +pub const _SC_THREAD_PROCESS_SHARED: ::c_int = 48; +pub const _SC_THREAD_SAFE_FUNCTIONS: ::c_int = 49; +pub const _SC_GETGR_R_SIZE_MAX: ::c_int = 50; +pub const _SC_GETPW_R_SIZE_MAX: ::c_int = 51; +pub const _SC_LOGIN_NAME_MAX: ::c_int = 52; +pub const _SC_THREAD_DESTRUCTOR_ITERATIONS: ::c_int = 53; +pub const _SC_ADVISORY_INFO: ::c_int = 54; +pub const _SC_ATEXIT_MAX: ::c_int = 55; +pub const _SC_BARRIERS: ::c_int = 56; +pub const _SC_BC_BASE_MAX: ::c_int = 57; +pub const _SC_BC_DIM_MAX: ::c_int = 58; +pub const _SC_BC_SCALE_MAX: ::c_int = 59; +pub const _SC_BC_STRING_MAX: ::c_int = 60; +pub const _SC_CLOCK_SELECTION: ::c_int = 61; +pub const _SC_COLL_WEIGHTS_MAX: ::c_int = 62; +pub const _SC_CPUTIME: ::c_int = 63; +pub const _SC_EXPR_NEST_MAX: ::c_int = 64; +pub const _SC_HOST_NAME_MAX: ::c_int = 65; +pub const _SC_IOV_MAX: ::c_int = 66; +pub const _SC_IPV6: ::c_int = 67; +pub const _SC_LINE_MAX: ::c_int = 68; +pub const _SC_MONOTONIC_CLOCK: ::c_int = 69; +pub const _SC_RAW_SOCKETS: ::c_int = 70; +pub const _SC_READER_WRITER_LOCKS: ::c_int = 71; +pub const _SC_REGEXP: ::c_int = 72; +pub const _SC_RE_DUP_MAX: ::c_int = 73; +pub const _SC_SHELL: ::c_int = 74; +pub const _SC_SPAWN: ::c_int = 75; +pub const _SC_SPIN_LOCKS: ::c_int = 76; +pub const _SC_SPORADIC_SERVER: ::c_int = 77; +pub const _SC_SS_REPL_MAX: ::c_int = 78; +pub const _SC_SYMLOOP_MAX: ::c_int = 79; +pub const _SC_THREAD_CPUTIME: ::c_int = 80; +pub const _SC_THREAD_SPORADIC_SERVER: ::c_int = 81; +pub const _SC_TIMEOUTS: ::c_int = 82; +pub const _SC_TRACE: ::c_int = 83; +pub const _SC_TRACE_EVENT_FILTER: ::c_int = 84; +pub const _SC_TRACE_EVENT_NAME_MAX: ::c_int = 85; +pub const _SC_TRACE_INHERIT: ::c_int = 86; +pub const _SC_TRACE_LOG: ::c_int = 87; +pub const _SC_TRACE_NAME_MAX: ::c_int = 88; +pub const _SC_TRACE_SYS_MAX: ::c_int = 89; +pub const _SC_TRACE_USER_EVENT_MAX: ::c_int = 90; +pub const _SC_TYPED_MEMORY_OBJECTS: ::c_int = 91; +pub const _SC_V7_ILP32_OFF32: ::c_int = 92; +pub const _SC_V6_ILP32_OFF32: ::c_int = _SC_V7_ILP32_OFF32; +pub const _SC_XBS5_ILP32_OFF32: ::c_int = _SC_V7_ILP32_OFF32; +pub const _SC_V7_ILP32_OFFBIG: ::c_int = 93; +pub const _SC_V6_ILP32_OFFBIG: ::c_int = _SC_V7_ILP32_OFFBIG; +pub const _SC_XBS5_ILP32_OFFBIG: ::c_int = _SC_V7_ILP32_OFFBIG; +pub const _SC_V7_LP64_OFF64: ::c_int = 94; +pub const _SC_V6_LP64_OFF64: ::c_int = _SC_V7_LP64_OFF64; +pub const _SC_XBS5_LP64_OFF64: ::c_int = _SC_V7_LP64_OFF64; +pub const _SC_V7_LPBIG_OFFBIG: ::c_int = 95; +pub const _SC_V6_LPBIG_OFFBIG: ::c_int = _SC_V7_LPBIG_OFFBIG; +pub const _SC_XBS5_LPBIG_OFFBIG: ::c_int = _SC_V7_LPBIG_OFFBIG; +pub const _SC_XOPEN_CRYPT: ::c_int = 96; +pub const _SC_XOPEN_ENH_I18N: ::c_int = 97; +pub const _SC_XOPEN_LEGACY: ::c_int = 98; +pub const _SC_XOPEN_REALTIME: ::c_int = 99; +pub const _SC_STREAM_MAX: ::c_int = 100; +pub const _SC_PRIORITY_SCHEDULING: ::c_int = 101; +pub const _SC_XOPEN_REALTIME_THREADS: ::c_int = 102; +pub const _SC_XOPEN_SHM: ::c_int = 103; +pub const _SC_XOPEN_STREAMS: ::c_int = 104; +pub const _SC_XOPEN_UNIX: ::c_int = 105; +pub const _SC_XOPEN_VERSION: ::c_int = 106; +pub const _SC_2_CHAR_TERM: ::c_int = 107; +pub const _SC_2_C_BIND: ::c_int = 108; +pub const _SC_2_C_DEV: ::c_int = 109; +pub const _SC_2_FORT_DEV: ::c_int = 110; +pub const _SC_2_FORT_RUN: ::c_int = 111; +pub const _SC_2_LOCALEDEF: ::c_int = 112; +pub const _SC_2_PBS: ::c_int = 113; +pub const _SC_2_PBS_ACCOUNTING: ::c_int = 114; +pub const _SC_2_PBS_CHECKPOINT: ::c_int = 115; +pub const _SC_2_PBS_LOCATE: ::c_int = 116; +pub const _SC_2_PBS_MESSAGE: ::c_int = 117; +pub const _SC_2_PBS_TRACK: ::c_int = 118; +pub const _SC_2_SW_DEV: ::c_int = 119; +pub const _SC_2_UPE: ::c_int = 120; +pub const _SC_2_VERSION: ::c_int = 121; +pub const _SC_THREAD_ROBUST_PRIO_INHERIT: ::c_int = 122; +pub const _SC_THREAD_ROBUST_PRIO_PROTECT: ::c_int = 123; +pub const _SC_XOPEN_UUCP: ::c_int = 124; +pub const _SC_LEVEL1_ICACHE_SIZE: ::c_int = 125; +pub const _SC_LEVEL1_ICACHE_ASSOC: ::c_int = 126; +pub const _SC_LEVEL1_ICACHE_LINESIZE: ::c_int = 127; +pub const _SC_LEVEL1_DCACHE_SIZE: ::c_int = 128; +pub const _SC_LEVEL1_DCACHE_ASSOC: ::c_int = 129; +pub const _SC_LEVEL1_DCACHE_LINESIZE: ::c_int = 130; +pub const _SC_LEVEL2_CACHE_SIZE: ::c_int = 131; +pub const _SC_LEVEL2_CACHE_ASSOC: ::c_int = 132; +pub const _SC_LEVEL2_CACHE_LINESIZE: ::c_int = 133; +pub const _SC_LEVEL3_CACHE_SIZE: ::c_int = 134; +pub const _SC_LEVEL3_CACHE_ASSOC: ::c_int = 135; +pub const _SC_LEVEL3_CACHE_LINESIZE: ::c_int = 136; +pub const _SC_LEVEL4_CACHE_SIZE: ::c_int = 137; +pub const _SC_LEVEL4_CACHE_ASSOC: ::c_int = 138; +pub const _SC_LEVEL4_CACHE_LINESIZE: ::c_int = 139; + +pub const S_BLKSIZE: ::mode_t = 1024; +pub const S_IREAD: ::mode_t = 256; +pub const S_IWRITE: ::mode_t = 128; +pub const S_IEXEC: ::mode_t = 64; +pub const S_ENFMT: ::mode_t = 1024; +pub const S_IFMT: ::mode_t = 61440; +pub const S_IFDIR: ::mode_t = 16384; +pub const S_IFCHR: ::mode_t = 8192; +pub const S_IFBLK: ::mode_t = 24576; +pub const S_IFREG: ::mode_t = 32768; +pub const S_IFLNK: ::mode_t = 40960; +pub const S_IFSOCK: ::mode_t = 49152; +pub const S_IFIFO: ::mode_t = 4096; +pub const S_IRUSR: ::mode_t = 256; +pub const S_IWUSR: ::mode_t = 128; +pub const S_IXUSR: ::mode_t = 64; +pub const S_IRGRP: ::mode_t = 32; +pub const S_IWGRP: ::mode_t = 16; +pub const S_IXGRP: ::mode_t = 8; +pub const S_IROTH: ::mode_t = 4; +pub const S_IWOTH: ::mode_t = 2; +pub const S_IXOTH: ::mode_t = 1; + +pub const SEEK_SET: ::c_int = 0; +pub const SEEK_CUR: ::c_int = 1; +pub const SEEK_END: ::c_int = 2; + +pub const SHUT_RD: ::c_int = 0; +pub const SHUT_WR: ::c_int = 1; +pub const SHUT_RDWR: ::c_int = 2; + +pub const SIG_SETMASK: ::c_int = 0; + +pub const SIGHUP: ::c_int = 1; +pub const SIGINT: ::c_int = 2; +pub const SIGQUIT: ::c_int = 3; +pub const SIGILL: ::c_int = 4; +pub const SIGABRT: ::c_int = 6; +pub const SIGEMT: ::c_int = 7; +pub const SIGFPE: ::c_int = 8; +pub const SIGKILL: ::c_int = 9; +pub const SIGSEGV: ::c_int = 11; +pub const SIGPIPE: ::c_int = 13; +pub const SIGALRM: ::c_int = 14; +pub const SIGTERM: ::c_int = 15; + +pub const SO_DEBUG: ::c_int = 0x0001; +pub const SO_ACCEPTCONN: ::c_int = 0x0002; +pub const SO_REUSEADDR: ::c_int = 0x0004; +pub const SO_KEEPALIVE: ::c_int = 0x0008; +pub const SO_DONTROUTE: ::c_int = 0x0010; +pub const SO_BROADCAST: ::c_int = 0x0020; +pub const SO_USELOOPBACK: ::c_int = 0x0040; +pub const SO_LINGER: ::c_int = 0x0080; +pub const SO_OOBINLINE: ::c_int = 0x0100; +pub const SO_REUSEPORT: ::c_int = 0x0200; +pub const SO_SNDBUF: ::c_int = 0x1001; +pub const SO_RCVBUF: ::c_int = 0x1002; +pub const SO_SNDLOWAT: ::c_int = 0x1003; +pub const SO_RCVLOWAT: ::c_int = 0x1004; +pub const SO_SNDTIMEO: ::c_int = 0x1005; +pub const SO_RCVTIMEO: ::c_int = 0x1006; +pub const SO_ERROR: ::c_int = 0x1007; +pub const SO_TYPE: ::c_int = 0x1008; +pub const SO_CONTIMEO: ::c_int = 0x1009; +pub const SO_NO_CHECK: ::c_int = 0x100a; + +pub const SOCK_STREAM: ::c_int = 1; +pub const SOCK_DGRAM: ::c_int = 2; +pub const SOCK_RAW: ::c_int = 3; + +pub const SOL_SOCKET: ::c_int = 0xfff; + +pub const STDIN_FILENO: ::c_int = 0; +pub const STDOUT_FILENO: ::c_int = 1; +pub const STDERR_FILENO: ::c_int = 2; + +pub const TCP_NODELAY: ::c_int = 0x01; +pub const TCP_KEEPALIVE: ::c_int = 0x02; +pub const TCP_KEEPIDLE: ::c_int = 0x03; +pub const TCP_KEEPINTVL: ::c_int = 0x04; +pub const TCP_KEEPCNT: ::c_int = 0x05; + +const ULONG_SIZE: usize = 64; + +pub const WNOHANG: ::c_int = 0x00000001; + +pub const PRIO_PROCESS: ::c_int = 0; +pub const PRIO_PGRP: ::c_int = 1; +pub const PRIO_USER: ::c_int = 2; + +safe_f! { + pub {const} fn WEXITSTATUS(status: ::c_int) -> ::c_int { + (status >> 8) & 0xff + } + + pub {const} fn WIFEXITED(status: ::c_int) -> bool { + (status & 0xff) == 0 + } + + pub {const} fn WTERMSIG(status: ::c_int) -> ::c_int { + status & 0x7f + } +} + +extern "C" { + pub fn getrlimit(resource: ::c_int, rlim: *mut ::rlimit) -> ::c_int; + pub fn setrlimit(resource: ::c_int, rlim: *const ::rlimit) -> ::c_int; + pub fn strerror_r(errnum: ::c_int, buf: *mut c_char, buflen: ::size_t) -> ::c_int; + + pub fn sem_destroy(sem: *mut sem_t) -> ::c_int; + pub fn sem_init(sem: *mut sem_t, pshared: ::c_int, value: ::c_uint) -> ::c_int; + + pub fn abs(i: ::c_int) -> ::c_int; + pub fn labs(i: ::c_long) -> ::c_long; + pub fn rand() -> ::c_int; + pub fn srand(seed: ::c_uint); + + pub fn bind(s: ::c_int, name: *const ::sockaddr, namelen: ::socklen_t) -> ::c_int; + + pub fn clock_gettime(clock_id: ::clockid_t, tp: *mut ::timespec) -> ::c_int; + + pub fn gettimeofday(tp: *mut ::timeval, tz: *mut ::c_void) -> ::c_int; + pub fn getpwuid_r( + uid: ::uid_t, + pwd: *mut passwd, + buf: *mut ::c_char, + buflen: ::size_t, + result: *mut *mut passwd, + ) -> ::c_int; + + // Dummy + pub fn ioctl(fd: ::c_int, request: ::c_int, ...) -> ::c_int; + + pub fn memalign(align: ::size_t, nbytes: ::size_t) -> *mut ::c_void; + + pub fn pthread_create( + tid: *mut ::pthread_t, + attr: *const ::pthread_attr_t, + start: extern "C" fn(*mut ::c_void) -> *mut ::c_void, + arg: *mut ::c_void, + ) -> ::c_int; + + pub fn pthread_sigmask(how: ::c_int, set: *const ::sigset_t, oset: *mut ::sigset_t) -> ::c_int; + + pub fn recvfrom( + s: ::c_int, + mem: *mut ::c_void, + len: ::size_t, + flags: ::c_int, + from: *mut ::sockaddr, + fromlen: *mut ::socklen_t, + ) -> ::c_int; + + pub fn setgroups(ngroups: ::c_int, grouplist: *const ::gid_t) -> ::c_int; + pub fn uname(buf: *mut ::utsname) -> ::c_int; +} + +cfg_if! { + if #[cfg(target_arch = "aarch64")] { + mod aarch64; + pub use self::aarch64::*; + } else if #[cfg(target_arch = "x86_64")] { + mod x86_64; + pub use self::x86_64::*; + } else { + // Unknown target_arch + } +} diff -Nru temporalio-1.3.0/vendor/libc/src/unix/hermit/x86_64.rs temporalio-1.3.0/vendor/libc/src/unix/hermit/x86_64.rs --- temporalio-1.3.0/vendor/libc/src/unix/hermit/x86_64.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/libc/src/unix/hermit/x86_64.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,2 @@ +pub type c_char = i8; +pub type wchar_t = i32; diff -Nru temporalio-1.3.0/vendor/libc/src/unix/hurd/align.rs temporalio-1.3.0/vendor/libc/src/unix/hurd/align.rs --- temporalio-1.3.0/vendor/libc/src/unix/hurd/align.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/libc/src/unix/hurd/align.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -// Placeholder file diff -Nru temporalio-1.3.0/vendor/libc/src/unix/hurd/b32.rs temporalio-1.3.0/vendor/libc/src/unix/hurd/b32.rs --- temporalio-1.3.0/vendor/libc/src/unix/hurd/b32.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/libc/src/unix/hurd/b32.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,91 +0,0 @@ -pub type c_long = i32; -pub type c_ulong = u32; - -pub type __int64_t = ::c_longlong; -pub type __uint64_t = ::c_ulonglong; - -pub type int_fast16_t = ::c_int; -pub type int_fast32_t = ::c_int; -pub type int_fast64_t = ::c_longlong; -pub type uint_fast16_t = ::c_uint; -pub type uint_fast32_t = ::c_uint; -pub type uint_fast64_t = ::c_ulonglong; - -pub type __quad_t = ::c_longlong; -pub type __u_quad_t = ::c_ulonglong; -pub type __intmax_t = ::c_longlong; -pub type __uintmax_t = ::c_ulonglong; - -pub type __squad_type = ::__int64_t; -pub type __uquad_type = ::__uint64_t; -pub type __sword_type = ::c_int; -pub type __uword_type = ::c_uint; -pub type __slong32_type = ::c_long; -pub type __ulong32_type = ::c_ulong; -pub type __s64_type = ::__int64_t; -pub type __u64_type = ::__uint64_t; - -pub type Elf32_Half = u16; -pub type Elf32_Word = u32; -pub type Elf32_Off = u32; -pub type Elf32_Addr = u32; -pub type Elf32_Section = u16; - -pub type Elf_Addr = ::Elf32_Addr; -pub type Elf_Half = ::Elf32_Half; -pub type Elf_Ehdr = ::Elf32_Ehdr; -pub type Elf_Phdr = ::Elf32_Phdr; -pub type Elf_Shdr = ::Elf32_Shdr; -pub type Elf_Sym = ::Elf32_Sym; - -s! { - pub struct Elf32_Ehdr { - pub e_ident: [::c_uchar; 16], - pub e_type: Elf32_Half, - pub e_machine: Elf32_Half, - pub e_version: Elf32_Word, - pub e_entry: Elf32_Addr, - pub e_phoff: Elf32_Off, - pub e_shoff: Elf32_Off, - pub e_flags: Elf32_Word, - pub e_ehsize: Elf32_Half, - pub e_phentsize: Elf32_Half, - pub e_phnum: Elf32_Half, - pub e_shentsize: Elf32_Half, - pub e_shnum: Elf32_Half, - pub e_shstrndx: Elf32_Half, - } - - pub struct Elf32_Shdr { - pub sh_name: Elf32_Word, - pub sh_type: Elf32_Word, - pub sh_flags: Elf32_Word, - pub sh_addr: Elf32_Addr, - pub sh_offset: Elf32_Off, - pub sh_size: Elf32_Word, - pub sh_link: Elf32_Word, - pub sh_info: Elf32_Word, - pub sh_addralign: Elf32_Word, - pub sh_entsize: Elf32_Word, - } - - pub struct Elf32_Sym { - pub st_name: Elf32_Word, - pub st_value: Elf32_Addr, - pub st_size: Elf32_Word, - pub st_info: ::c_uchar, - pub st_other: ::c_uchar, - pub st_shndx: Elf32_Section, - } - - pub struct Elf32_Phdr { - pub p_type: ::Elf32_Word, - pub p_offset: ::Elf32_Off, - pub p_vaddr: ::Elf32_Addr, - pub p_paddr: ::Elf32_Addr, - pub p_filesz: ::Elf32_Word, - pub p_memsz: ::Elf32_Word, - pub p_flags: ::Elf32_Word, - pub p_align: ::Elf32_Word, - } -} diff -Nru temporalio-1.3.0/vendor/libc/src/unix/hurd/b64.rs temporalio-1.3.0/vendor/libc/src/unix/hurd/b64.rs --- temporalio-1.3.0/vendor/libc/src/unix/hurd/b64.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/libc/src/unix/hurd/b64.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,93 +0,0 @@ -pub type c_long = i64; -pub type c_ulong = u64; - -pub type __int64_t = ::c_long; -pub type __uint64_t = ::c_ulong; - -pub type int_fast16_t = ::c_long; -pub type int_fast32_t = ::c_long; -pub type int_fast64_t = ::c_long; -pub type uint_fast16_t = ::c_ulong; -pub type uint_fast32_t = ::c_ulong; -pub type uint_fast64_t = ::c_ulong; - -pub type __quad_t = ::c_long; -pub type __u_quad_t = ::c_ulong; -pub type __intmax_t = ::c_long; -pub type __uintmax_t = ::c_ulong; - -pub type __squad_type = ::c_long; -pub type __uquad_type = ::c_ulong; -pub type __sword_type = ::c_long; -pub type __uword_type = ::c_ulong; -pub type __slong32_type = ::c_int; -pub type __ulong32_type = ::c_uint; -pub type __s64_type = ::c_long; -pub type __u64_type = ::c_ulong; - -pub type Elf64_Half = u16; -pub type Elf64_Word = u32; -pub type Elf64_Off = u64; -pub type Elf64_Addr = u64; -pub type Elf64_Xword = u64; -pub type Elf64_Sxword = i64; -pub type Elf64_Section = u16; - -pub type Elf_Addr = ::Elf64_Addr; -pub type Elf_Half = ::Elf64_Half; -pub type Elf_Ehdr = ::Elf64_Ehdr; -pub type Elf_Phdr = ::Elf64_Phdr; -pub type Elf_Shdr = ::Elf64_Shdr; -pub type Elf_Sym = ::Elf64_Sym; - -s! { - pub struct Elf64_Ehdr { - pub e_ident: [::c_uchar; 16], - pub e_type: Elf64_Half, - pub e_machine: Elf64_Half, - pub e_version: Elf64_Word, - pub e_entry: Elf64_Addr, - pub e_phoff: Elf64_Off, - pub e_shoff: Elf64_Off, - pub e_flags: Elf64_Word, - pub e_ehsize: Elf64_Half, - pub e_phentsize: Elf64_Half, - pub e_phnum: Elf64_Half, - pub e_shentsize: Elf64_Half, - pub e_shnum: Elf64_Half, - pub e_shstrndx: Elf64_Half, - } - - pub struct Elf64_Shdr { - pub sh_name: Elf64_Word, - pub sh_type: Elf64_Word, - pub sh_flags: Elf64_Xword, - pub sh_addr: Elf64_Addr, - pub sh_offset: Elf64_Off, - pub sh_size: Elf64_Xword, - pub sh_link: Elf64_Word, - pub sh_info: Elf64_Word, - pub sh_addralign: Elf64_Xword, - pub sh_entsize: Elf64_Xword, - } - - pub struct Elf64_Sym { - pub st_name: Elf64_Word, - pub st_info: ::c_uchar, - pub st_other: ::c_uchar, - pub st_shndx: Elf64_Section, - pub st_value: Elf64_Addr, - pub st_size: Elf64_Xword, - } - - pub struct Elf64_Phdr { - pub p_type: ::Elf64_Word, - pub p_flags: ::Elf64_Word, - pub p_offset: ::Elf64_Off, - pub p_vaddr: ::Elf64_Addr, - pub p_paddr: ::Elf64_Addr, - pub p_filesz: ::Elf64_Xword, - pub p_memsz: ::Elf64_Xword, - pub p_align: ::Elf64_Xword, - } -} diff -Nru temporalio-1.3.0/vendor/libc/src/unix/hurd/mod.rs temporalio-1.3.0/vendor/libc/src/unix/hurd/mod.rs --- temporalio-1.3.0/vendor/libc/src/unix/hurd/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/libc/src/unix/hurd/mod.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,3107 +0,0 @@ -#![allow(dead_code)] - -// types -pub type c_char = i8; - -pub type __s16_type = ::c_short; -pub type __u16_type = ::c_ushort; -pub type __s32_type = ::c_int; -pub type __u32_type = ::c_uint; -pub type __slongword_type = ::c_long; -pub type __ulongword_type = ::c_ulong; - -pub type __u_char = ::c_uchar; -pub type __u_short = ::c_ushort; -pub type __u_int = ::c_uint; -pub type __u_long = ::c_ulong; -pub type __int8_t = ::c_schar; -pub type __uint8_t = ::c_uchar; -pub type __int16_t = ::c_short; -pub type __uint16_t = ::c_ushort; -pub type __int32_t = ::c_int; -pub type __uint32_t = ::c_uint; -pub type __int_least8_t = __int8_t; -pub type __uint_least8_t = __uint8_t; -pub type __int_least16_t = __int16_t; -pub type __uint_least16_t = __uint16_t; -pub type __int_least32_t = __int32_t; -pub type __uint_least32_t = __uint32_t; -pub type __int_least64_t = __int64_t; -pub type __uint_least64_t = __uint64_t; - -pub type __dev_t = __uword_type; -pub type __uid_t = __u32_type; -pub type __gid_t = __u32_type; -pub type __ino_t = __ulongword_type; -pub type __ino64_t = __uquad_type; -pub type __mode_t = __u32_type; -pub type __nlink_t = __uword_type; -pub type __off_t = __slongword_type; -pub type __off64_t = __squad_type; -pub type __pid_t = __s32_type; -pub type __rlim_t = __ulongword_type; -pub type __rlim64_t = __uquad_type; -pub type __blkcnt_t = __slongword_type; -pub type __blkcnt64_t = __squad_type; -pub type __fsblkcnt_t = __ulongword_type; -pub type __fsblkcnt64_t = __uquad_type; -pub type __fsfilcnt_t = __ulongword_type; -pub type __fsfilcnt64_t = __uquad_type; -pub type __fsword_t = __sword_type; -pub type __id_t = __u32_type; -pub type __clock_t = __slongword_type; -pub type __time_t = __slongword_type; -pub type __useconds_t = __u32_type; -pub type __suseconds_t = __slongword_type; -pub type __suseconds64_t = __squad_type; -pub type __daddr_t = __s32_type; -pub type __key_t = __s32_type; -pub type __clockid_t = __s32_type; -pub type __timer_t = __uword_type; -pub type __blksize_t = __slongword_type; -pub type __fsid_t = __uquad_type; -pub type __ssize_t = __sword_type; -pub type __syscall_slong_t = __slongword_type; -pub type __syscall_ulong_t = __ulongword_type; -pub type __cpu_mask = __ulongword_type; - -pub type __loff_t = __off64_t; -pub type __caddr_t = *mut ::c_char; -pub type __intptr_t = __sword_type; -pub type __ptrdiff_t = __sword_type; -pub type __socklen_t = __u32_type; -pub type __sig_atomic_t = ::c_int; -pub type __time64_t = __int64_t; -pub type ssize_t = __ssize_t; -pub type size_t = ::c_ulong; -pub type wchar_t = ::c_int; -pub type wint_t = ::c_uint; -pub type gid_t = __gid_t; -pub type uid_t = __uid_t; -pub type off_t = __off_t; -pub type off64_t = __off64_t; -pub type useconds_t = __useconds_t; -pub type pid_t = __pid_t; -pub type socklen_t = __socklen_t; - -pub type in_addr_t = u32; - -pub type _Float32 = f32; -pub type _Float64 = f64; -pub type _Float32x = f64; -pub type _Float64x = f64; - -pub type __locale_t = *mut __locale_struct; -pub type locale_t = __locale_t; - -pub type u_char = __u_char; -pub type u_short = __u_short; -pub type u_int = __u_int; -pub type u_long = __u_long; -pub type quad_t = __quad_t; -pub type u_quad_t = __u_quad_t; -pub type fsid_t = __fsid_t; -pub type loff_t = __loff_t; -pub type ino_t = __ino_t; -pub type ino64_t = __ino64_t; -pub type dev_t = __dev_t; -pub type mode_t = __mode_t; -pub type nlink_t = __nlink_t; -pub type id_t = __id_t; -pub type daddr_t = __daddr_t; -pub type caddr_t = __caddr_t; -pub type key_t = __key_t; -pub type clock_t = __clock_t; -pub type clockid_t = __clockid_t; -pub type time_t = __time_t; -pub type timer_t = __timer_t; -pub type suseconds_t = __suseconds_t; -pub type ulong = ::c_ulong; -pub type ushort = ::c_ushort; -pub type uint = ::c_uint; -pub type u_int8_t = __uint8_t; -pub type u_int16_t = __uint16_t; -pub type u_int32_t = __uint32_t; -pub type u_int64_t = __uint64_t; -pub type register_t = ::c_int; -pub type __sigset_t = ::c_ulong; -pub type sigset_t = __sigset_t; - -pub type __fd_mask = ::c_long; -pub type fd_mask = __fd_mask; -pub type blksize_t = __blksize_t; -pub type blkcnt_t = __blkcnt_t; -pub type fsblkcnt_t = __fsblkcnt_t; -pub type fsfilcnt_t = __fsfilcnt_t; -pub type blkcnt64_t = __blkcnt64_t; -pub type fsblkcnt64_t = __fsblkcnt64_t; -pub type fsfilcnt64_t = __fsfilcnt64_t; - -pub type __pthread_spinlock_t = ::c_int; -pub type __tss_t = ::c_int; -pub type __thrd_t = ::c_long; -pub type __pthread_t = ::c_long; -pub type pthread_t = __pthread_t; -pub type __pthread_process_shared = ::c_uint; -pub type __pthread_inheritsched = ::c_uint; -pub type __pthread_contentionscope = ::c_uint; -pub type __pthread_detachstate = ::c_uint; -pub type pthread_attr_t = __pthread_attr; -pub type __pthread_mutex_protocol = ::c_uint; -pub type __pthread_mutex_type = ::c_uint; -pub type __pthread_mutex_robustness = ::c_uint; -pub type pthread_mutexattr_t = __pthread_mutexattr; -pub type pthread_mutex_t = __pthread_mutex; -pub type pthread_condattr_t = __pthread_condattr; -pub type pthread_cond_t = __pthread_cond; -pub type pthread_spinlock_t = __pthread_spinlock_t; -pub type pthread_rwlockattr_t = __pthread_rwlockattr; -pub type pthread_rwlock_t = __pthread_rwlock; -pub type pthread_barrierattr_t = __pthread_barrierattr; -pub type pthread_barrier_t = __pthread_barrier; -pub type __pthread_key = ::c_int; -pub type pthread_key_t = __pthread_key; -pub type pthread_once_t = __pthread_once; - -pub type __rlimit_resource = ::c_uint; -pub type rlim_t = __rlim_t; -pub type rlim64_t = __rlim64_t; - -pub type __rusage_who = ::c_int; - -pub type __priority_which = ::c_uint; - -pub type sa_family_t = ::c_uchar; - -pub type in_port_t = u16; - -pub type __sigval_t = ::sigval; - -pub type sigevent_t = sigevent; - -pub type nfds_t = ::c_ulong; - -pub type tcflag_t = ::c_uint; -pub type cc_t = ::c_uchar; -pub type speed_t = ::c_int; - -pub type sigval_t = ::sigval; - -pub type greg_t = ::c_int; -pub type gregset_t = [greg_t; 19usize]; - -pub type __ioctl_dir = ::c_uint; - -pub type __ioctl_datum = ::c_uint; - -pub type __error_t_codes = ::c_int; - -pub type int_least8_t = __int_least8_t; -pub type int_least16_t = __int_least16_t; -pub type int_least32_t = __int_least32_t; -pub type int_least64_t = __int_least64_t; -pub type uint_least8_t = __uint_least8_t; -pub type uint_least16_t = __uint_least16_t; -pub type uint_least32_t = __uint_least32_t; -pub type uint_least64_t = __uint_least64_t; -pub type int_fast8_t = ::c_schar; -pub type uint_fast8_t = ::c_uchar; -pub type intmax_t = __intmax_t; -pub type uintmax_t = __uintmax_t; - -pub type tcp_seq = u32; - -pub type tcp_ca_state = ::c_uint; - -pub type idtype_t = ::c_uint; - -// structs -s! { - pub struct ip_mreq { - pub imr_multiaddr: in_addr, - pub imr_interface: in_addr, - } - - pub struct ip_mreqn { - pub imr_multiaddr: in_addr, - pub imr_address: in_addr, - pub imr_ifindex: ::c_int, - } - - pub struct sockaddr { - pub sa_len: ::c_uchar, - pub sa_family: sa_family_t, - pub sa_data: [::c_char; 14usize], - } - - pub struct in_addr { - pub s_addr: in_addr_t, - } - - pub struct sockaddr_in { - pub sin_len: ::c_uchar, - pub sin_family: sa_family_t, - pub sin_port: in_port_t, - pub sin_addr: ::in_addr, - pub sin_zero: [::c_uchar; 8usize], - } - - pub struct sockaddr_in6 { - pub sin6_len: ::c_uchar, - pub sin6_family: sa_family_t, - pub sin6_port: in_port_t, - pub sin6_flowinfo: u32, - pub sin6_addr: ::in6_addr, - pub sin6_scope_id: u32, - } - - pub struct sockaddr_un { - pub sun_len: ::c_uchar, - pub sun_family: sa_family_t, - pub sun_path: [::c_char; 108usize], - } - - pub struct sockaddr_storage { - pub ss_len: ::c_uchar, - pub ss_family: sa_family_t, - pub __ss_padding: [::c_char; 122usize], - pub __ss_align: __uint32_t, - } - - pub struct sockaddr_at { - pub _address: u8, - } - - pub struct sockaddr_ax25 { - pub _address: u8, - } - - pub struct sockaddr_x25 { - pub _address: u8, - } - - pub struct sockaddr_dl { - pub _address: u8, - } - pub struct sockaddr_eon { - pub _address: u8, - } - pub struct sockaddr_inarp { - pub _address: u8, - } - - pub struct sockaddr_ipx { - pub _address: u8, - } - pub struct sockaddr_iso { - pub _address: u8, - } - - pub struct sockaddr_ns { - pub _address: u8, - } - - pub struct addrinfo { - pub ai_flags: ::c_int, - pub ai_family: ::c_int, - pub ai_socktype: ::c_int, - pub ai_protocol: ::c_int, - pub ai_addrlen: socklen_t, - pub ai_addr: *mut sockaddr, - pub ai_canonname: *mut ::c_char, - pub ai_next: *mut addrinfo, - } - - pub struct msghdr { - pub msg_name: *mut ::c_void, - pub msg_namelen: socklen_t, - pub msg_iov: *mut iovec, - pub msg_iovlen: ::c_int, - pub msg_control: *mut ::c_void, - pub msg_controllen: socklen_t, - pub msg_flags: ::c_int, - } - - pub struct dirent { - pub d_ino: __ino_t, - pub d_reclen: ::c_ushort, - pub d_type: ::c_uchar, - pub d_namlen: ::c_uchar, - pub d_name: [::c_char; 1usize], - } - - pub struct dirent64 { - pub d_ino: __ino64_t, - pub d_reclen: ::c_ushort, - pub d_type: ::c_uchar, - pub d_namlen: ::c_uchar, - pub d_name: [::c_char; 1usize], - } - - pub struct fd_set { - pub fds_bits: [__fd_mask; 8usize], - } - - pub struct termios { - pub c_iflag: tcflag_t, - pub c_oflag: tcflag_t, - pub c_cflag: tcflag_t, - pub c_lflag: tcflag_t, - pub c_cc: [cc_t; 20usize], - pub __ispeed: speed_t, - pub __ospeed: speed_t, - } - - pub struct sigaction { - pub sa_sigaction: ::sighandler_t, - pub sa_mask: __sigset_t, - pub sa_flags: ::c_int, - } - - pub struct sigevent { - pub sigev_value: ::sigval, - pub sigev_signo: ::c_int, - pub sigev_notify: ::c_int, - __unused1: *mut ::c_void, //actually a function pointer - pub sigev_notify_attributes: *mut pthread_attr_t, - } - - pub struct siginfo_t { - pub si_signo: ::c_int, - pub si_errno: ::c_int, - pub si_code: ::c_int, - pub si_pid: __pid_t, - pub si_uid: __uid_t, - pub si_addr: *mut ::c_void, - pub si_status: ::c_int, - pub si_band: ::c_long, - pub si_value: ::sigval, - } - - pub struct timespec { - pub tv_sec: __time_t, - pub tv_nsec: __syscall_slong_t, - } - - pub struct __locale_data { - pub _address: u8, - } - - pub struct stat { - pub st_fstype: ::c_int, - pub st_fsid: __fsid_t, - pub st_ino: __ino_t, - pub st_gen: ::c_uint, - pub st_rdev: __dev_t, - pub st_mode: __mode_t, - pub st_nlink: __nlink_t, - pub st_uid: __uid_t, - pub st_gid: __gid_t, - pub st_size: __off_t, - pub st_atim: ::timespec, - pub st_mtim: ::timespec, - pub st_ctim: ::timespec, - pub st_blksize: __blksize_t, - pub st_blocks: __blkcnt_t, - pub st_author: __uid_t, - pub st_flags: ::c_uint, - pub st_spare: [::c_int; 11usize], - } - - pub struct stat64 { - pub st_fstype: ::c_int, - pub st_fsid: __fsid_t, - pub st_ino: __ino64_t, - pub st_gen: ::c_uint, - pub st_rdev: __dev_t, - pub st_mode: __mode_t, - pub st_nlink: __nlink_t, - pub st_uid: __uid_t, - pub st_gid: __gid_t, - pub st_size: __off64_t, - pub st_atim: ::timespec, - pub st_mtim: ::timespec, - pub st_ctim: ::timespec, - pub st_blksize: __blksize_t, - pub st_blocks: __blkcnt64_t, - pub st_author: __uid_t, - pub st_flags: ::c_uint, - pub st_spare: [::c_int; 8usize], - } - - pub struct statfs { - pub f_type: ::c_uint, - pub f_bsize: ::c_ulong, - pub f_blocks: __fsblkcnt_t, - pub f_bfree: __fsblkcnt_t, - pub f_bavail: __fsblkcnt_t, - pub f_files: __fsblkcnt_t, - pub f_ffree: __fsblkcnt_t, - pub f_fsid: __fsid_t, - pub f_namelen: ::c_ulong, - pub f_favail: __fsfilcnt_t, - pub f_frsize: ::c_ulong, - pub f_flag: ::c_ulong, - pub f_spare: [::c_uint; 3usize], - } - - pub struct statfs64 { - pub f_type: ::c_uint, - pub f_bsize: ::c_ulong, - pub f_blocks: __fsblkcnt64_t, - pub f_bfree: __fsblkcnt64_t, - pub f_bavail: __fsblkcnt64_t, - pub f_files: __fsblkcnt64_t, - pub f_ffree: __fsblkcnt64_t, - pub f_fsid: __fsid_t, - pub f_namelen: ::c_ulong, - pub f_favail: __fsfilcnt64_t, - pub f_frsize: ::c_ulong, - pub f_flag: ::c_ulong, - pub f_spare: [::c_uint ; 3usize], - } - - pub struct statvfs { - pub __f_type: ::c_uint, - pub f_bsize: ::c_ulong, - pub f_blocks: __fsblkcnt_t, - pub f_bfree: __fsblkcnt_t, - pub f_bavail: __fsblkcnt_t, - pub f_files: __fsfilcnt_t, - pub f_ffree: __fsfilcnt_t, - pub f_fsid: __fsid_t, - pub f_namemax: ::c_ulong, - pub f_favail: __fsfilcnt_t, - pub f_frsize: ::c_ulong, - pub f_flag: ::c_ulong, - pub f_spare: [::c_uint; 3usize], - } - - pub struct statvfs64 { - pub __f_type: ::c_uint, - pub f_bsize: ::c_ulong, - pub f_blocks: __fsblkcnt64_t, - pub f_bfree: __fsblkcnt64_t, - pub f_bavail: __fsblkcnt64_t, - pub f_files: __fsfilcnt64_t, - pub f_ffree: __fsfilcnt64_t, - pub f_fsid: __fsid_t, - pub f_namemax: ::c_ulong, - pub f_favail: __fsfilcnt64_t, - pub f_frsize: ::c_ulong, - pub f_flag: ::c_ulong, - pub f_spare: [::c_uint; 3usize], - } - - #[cfg_attr(target_pointer_width = "32", - repr(align(4)))] - #[cfg_attr(target_pointer_width = "64", - repr(align(8)))] - pub struct sem_t { - __size: [::c_char; 20usize], - } - - pub struct __pthread { - pub _address: u8, - } - - pub struct __pthread_mutexattr { - pub __prioceiling: ::c_int, - pub __protocol: __pthread_mutex_protocol, - pub __pshared: __pthread_process_shared, - pub __mutex_type: __pthread_mutex_type, - } - pub struct __pthread_mutex { - pub __lock: ::c_uint, - pub __owner_id: ::c_uint, - pub __cnt: ::c_uint, - pub __shpid: ::c_int, - pub __type: ::c_int, - pub __flags: ::c_int, - pub __reserved1: ::c_uint, - pub __reserved2: ::c_uint, - } - - pub struct __pthread_condattr { - pub __pshared: __pthread_process_shared, - pub __clock: __clockid_t, - } - - pub struct __pthread_rwlockattr { - pub __pshared: __pthread_process_shared, - } - - pub struct __pthread_barrierattr { - pub __pshared: __pthread_process_shared, - } - - pub struct __pthread_once { - pub __run: ::c_int, - pub __lock: __pthread_spinlock_t, - } - - pub struct __pthread_cond { - pub __lock: __pthread_spinlock_t, - pub __queue: *mut __pthread, - pub __attr: *mut __pthread_condattr, - pub __wrefs: ::c_uint, - pub __data: *mut ::c_void, - } - - pub struct __pthread_attr { - pub __schedparam: __sched_param, - pub __stackaddr: *mut ::c_void, - pub __stacksize: size_t, - pub __guardsize: size_t, - pub __detachstate: __pthread_detachstate, - pub __inheritsched: __pthread_inheritsched, - pub __contentionscope: __pthread_contentionscope, - pub __schedpolicy: ::c_int, - } - - pub struct __pthread_rwlock { - pub __held: __pthread_spinlock_t, - pub __lock: __pthread_spinlock_t, - pub __readers: ::c_int, - pub __readerqueue: *mut __pthread, - pub __writerqueue: *mut __pthread, - pub __attr: *mut __pthread_rwlockattr, - pub __data: *mut ::c_void, - } - - pub struct __pthread_barrier { - pub __lock: __pthread_spinlock_t, - pub __queue: *mut __pthread, - pub __pending: ::c_uint, - pub __count: ::c_uint, - pub __attr: *mut __pthread_barrierattr, - pub __data: *mut ::c_void, - } - - pub struct _IO_FILE { - _unused: [u8; 0], - } - - pub struct __sched_param { - pub __sched_priority: ::c_int, - } - - pub struct iovec { - pub iov_base: *mut ::c_void, - pub iov_len: size_t, - } - - pub struct passwd { - pub pw_name: *mut ::c_char, - pub pw_passwd: *mut ::c_char, - pub pw_uid: __uid_t, - pub pw_gid: __gid_t, - pub pw_gecos: *mut ::c_char, - pub pw_dir: *mut ::c_char, - pub pw_shell: *mut ::c_char, - } - - pub struct tm { - pub tm_sec: ::c_int, - pub tm_min: ::c_int, - pub tm_hour: ::c_int, - pub tm_mday: ::c_int, - pub tm_mon: ::c_int, - pub tm_year: ::c_int, - pub tm_wday: ::c_int, - pub tm_yday: ::c_int, - pub tm_isdst: ::c_int, - pub tm_gmtoff: ::c_long, - pub tm_zone: *const ::c_char, - } - - pub struct lconv { - pub decimal_point: *mut ::c_char, - pub thousands_sep: *mut ::c_char, - pub grouping: *mut ::c_char, - pub int_curr_symbol: *mut ::c_char, - pub currency_symbol: *mut ::c_char, - pub mon_decimal_point: *mut ::c_char, - pub mon_thousands_sep: *mut ::c_char, - pub mon_grouping: *mut ::c_char, - pub positive_sign: *mut ::c_char, - pub negative_sign: *mut ::c_char, - pub int_frac_digits: ::c_char, - pub frac_digits: ::c_char, - pub p_cs_precedes: ::c_char, - pub p_sep_by_space: ::c_char, - pub n_cs_precedes: ::c_char, - pub n_sep_by_space: ::c_char, - pub p_sign_posn: ::c_char, - pub n_sign_posn: ::c_char, - pub int_p_cs_precedes: ::c_char, - pub int_p_sep_by_space: ::c_char, - pub int_n_cs_precedes: ::c_char, - pub int_n_sep_by_space: ::c_char, - pub int_p_sign_posn: ::c_char, - pub int_n_sign_posn: ::c_char, - } - - pub struct Dl_info { - pub dli_fname: *const ::c_char, - pub dli_fbase: *mut ::c_void, - pub dli_sname: *const ::c_char, - pub dli_saddr: *mut ::c_void, - } - - pub struct __locale_struct { - pub __locales: [*mut __locale_data; 13usize], - pub __ctype_b: *const ::c_ushort, - pub __ctype_tolower: *const ::c_int, - pub __ctype_toupper: *const ::c_int, - pub __names: [*const ::c_char; 13usize], - } - - pub struct utsname { - pub sysname: [::c_char; 65], - pub nodename: [::c_char; 65], - pub release: [::c_char; 65], - pub version: [::c_char; 65], - pub machine: [::c_char; 65], - pub domainname: [::c_char; 65] - } - - pub struct rlimit64 { - pub rlim_cur: rlim64_t, - pub rlim_max: rlim64_t, - } - - pub struct stack_t { - pub ss_sp: * mut ::c_void, - pub ss_size: ::size_t, - pub ss_flags: ::c_int, - } - - pub struct dl_phdr_info { - pub dlpi_addr: Elf_Addr, - pub dlpi_name: *const ::c_char, - pub dlpi_phdr: *const Elf_Phdr, - pub dlpi_phnum: Elf_Half, - pub dlpi_adds: ::c_ulonglong, - pub dlpi_subs: ::c_ulonglong, - pub dlpi_tls_modid: ::size_t, - pub dlpi_tls_data: *mut ::c_void, - } - - pub struct flock { - #[cfg(target_pointer_width = "32")] - pub l_type : ::c_int, - #[cfg(target_pointer_width = "32")] - pub l_whence : ::c_int, - #[cfg(target_pointer_width = "64")] - pub l_type : ::c_short, - #[cfg(target_pointer_width = "64")] - pub l_whence : ::c_short, - pub l_start : __off_t, - pub l_len : __off_t, - pub l_pid : __pid_t, - } - - pub struct flock64 { - #[cfg(target_pointer_width = "32")] - pub l_type : ::c_int, - #[cfg(target_pointer_width = "32")] - pub l_whence : ::c_int, - #[cfg(target_pointer_width = "64")] - pub l_type : ::c_short, - #[cfg(target_pointer_width = "64")] - pub l_whence : ::c_short, - pub l_start : __off_t, - pub l_len : __off64_t, - pub l_pid : __pid_t, - } -} - -impl siginfo_t { - pub unsafe fn si_addr(&self) -> *mut ::c_void { - self.si_addr - } - - pub unsafe fn si_value(&self) -> ::sigval { - self.si_value - } - - pub unsafe fn si_pid(&self) -> ::pid_t { - self.si_pid - } - - pub unsafe fn si_uid(&self) -> ::uid_t { - self.si_uid - } - - pub unsafe fn si_status(&self) -> ::c_int { - self.si_status - } -} - -// const -pub const IPOPT_COPY: u8 = 0x80; -pub const IPOPT_NUMBER_MASK: u8 = 0x1f; -pub const IPOPT_CLASS_MASK: u8 = 0x60; -pub const IPTOS_ECN_MASK: u8 = 0x03; -pub const MSG_CMSG_CLOEXEC: ::c_int = 0x40000000; - -// unistd.h -pub const STDIN_FILENO: c_long = 0; -pub const STDOUT_FILENO: c_long = 1; -pub const STDERR_FILENO: c_long = 2; -pub const __FD_SETSIZE: usize = 256; -pub const R_OK: ::c_int = 4; -pub const W_OK: ::c_int = 2; -pub const X_OK: ::c_int = 1; -pub const F_OK: ::c_int = 0; -pub const SEEK_SET: ::c_int = 0; -pub const SEEK_CUR: ::c_int = 1; -pub const SEEK_END: ::c_int = 2; -pub const SEEK_DATA: ::c_int = 3; -pub const SEEK_HOLE: ::c_int = 4; -pub const L_SET: ::c_int = 0; -pub const L_INCR: ::c_int = 1; -pub const L_XTND: ::c_int = 2; -pub const F_ULOCK: ::c_int = 0; -pub const F_LOCK: ::c_int = 1; -pub const F_TLOCK: ::c_int = 2; -pub const F_TEST: ::c_int = 3; -pub const CLOSE_RANGE_CLOEXEC: ::c_int = 4; - -// stdlib.h -pub const WNOHANG: ::c_int = 1; -pub const WUNTRACED: ::c_int = 2; -pub const WSTOPPED: ::c_int = 2; -pub const WCONTINUED: ::c_int = 4; -pub const WNOWAIT: ::c_int = 8; -pub const WEXITED: ::c_int = 16; -pub const __W_CONTINUED: ::c_int = 65535; -pub const __WCOREFLAG: ::c_int = 128; -pub const RAND_MAX: ::c_int = 2147483647; -pub const EXIT_FAILURE: ::c_int = 1; -pub const EXIT_SUCCESS: ::c_int = 0; -pub const __LITTLE_ENDIAN: usize = 1234; -pub const __BIG_ENDIAN: usize = 4321; -pub const __PDP_ENDIAN: usize = 3412; -pub const __BYTE_ORDER: usize = 1234; -pub const __FLOAT_WORD_ORDER: usize = 1234; -pub const LITTLE_ENDIAN: usize = 1234; -pub const BIG_ENDIAN: usize = 4321; -pub const PDP_ENDIAN: usize = 3412; -pub const BYTE_ORDER: usize = 1234; - -// sys/select.h -pub const FD_SETSIZE: usize = 256; -pub const __SIZEOF_PTHREAD_MUTEX_T: usize = 32; -pub const __SIZEOF_PTHREAD_ATTR_T: usize = 32; -pub const __SIZEOF_PTHREAD_RWLOCK_T: usize = 28; -pub const __SIZEOF_PTHREAD_BARRIER_T: usize = 24; -pub const __SIZEOF_PTHREAD_MUTEXATTR_T: usize = 16; -pub const __SIZEOF_PTHREAD_COND_T: usize = 20; -pub const __SIZEOF_PTHREAD_CONDATTR_T: usize = 8; -pub const __SIZEOF_PTHREAD_RWLOCKATTR_T: usize = 4; -pub const __SIZEOF_PTHREAD_BARRIERATTR_T: usize = 4; -pub const __SIZEOF_PTHREAD_ONCE_T: usize = 8; -pub const __PTHREAD_SPIN_LOCK_INITIALIZER: ::c_int = 0; -pub const PTHREAD_MUTEX_NORMAL: ::c_int = 0; - -// sys/resource.h -pub const RLIM_INFINITY: ::rlim_t = 2147483647; -pub const RLIM64_INFINITY: ::rlim64_t = 9223372036854775807; -pub const RLIM_SAVED_MAX: ::rlim_t = RLIM_INFINITY; -pub const RLIM_SAVED_CUR: ::rlim_t = RLIM_INFINITY; -pub const PRIO_MIN: ::c_int = -20; -pub const PRIO_MAX: ::c_int = 20; - -// pwd.h -pub const NSS_BUFLEN_PASSWD: usize = 1024; - -// sys/socket.h -pub const SOCK_TYPE_MASK: usize = 15; -pub const PF_UNSPEC: ::c_int = 0; -pub const PF_LOCAL: ::c_int = 1; -pub const PF_UNIX: ::c_int = 1; -pub const PF_FILE: ::c_int = 1; -pub const PF_INET: ::c_int = 2; -pub const PF_IMPLINK: ::c_int = 3; -pub const PF_PUP: ::c_int = 4; -pub const PF_CHAOS: ::c_int = 5; -pub const PF_NS: ::c_int = 6; -pub const PF_ISO: ::c_int = 7; -pub const PF_OSI: ::c_int = 7; -pub const PF_ECMA: ::c_int = 8; -pub const PF_DATAKIT: ::c_int = 9; -pub const PF_CCITT: ::c_int = 10; -pub const PF_SNA: ::c_int = 11; -pub const PF_DECnet: ::c_int = 12; -pub const PF_DLI: ::c_int = 13; -pub const PF_LAT: ::c_int = 14; -pub const PF_HYLINK: ::c_int = 15; -pub const PF_APPLETALK: ::c_int = 16; -pub const PF_ROUTE: ::c_int = 17; -pub const PF_XTP: ::c_int = 19; -pub const PF_COIP: ::c_int = 20; -pub const PF_CNT: ::c_int = 21; -pub const PF_RTIP: ::c_int = 22; -pub const PF_IPX: ::c_int = 23; -pub const PF_SIP: ::c_int = 24; -pub const PF_PIP: ::c_int = 25; -pub const PF_INET6: ::c_int = 26; -pub const PF_MAX: ::c_int = 27; -pub const AF_UNSPEC: ::c_int = 0; -pub const AF_LOCAL: ::c_int = 1; -pub const AF_UNIX: ::c_int = 1; -pub const AF_FILE: ::c_int = 1; -pub const AF_INET: ::c_int = 2; -pub const AF_IMPLINK: ::c_int = 3; -pub const AF_PUP: ::c_int = 4; -pub const AF_CHAOS: ::c_int = 5; -pub const AF_NS: ::c_int = 6; -pub const AF_ISO: ::c_int = 7; -pub const AF_OSI: ::c_int = 7; -pub const AF_ECMA: ::c_int = 8; -pub const AF_DATAKIT: ::c_int = 9; -pub const AF_CCITT: ::c_int = 10; -pub const AF_SNA: ::c_int = 11; -pub const AF_DECnet: ::c_int = 12; -pub const AF_DLI: ::c_int = 13; -pub const AF_LAT: ::c_int = 14; -pub const AF_HYLINK: ::c_int = 15; -pub const AF_APPLETALK: ::c_int = 16; -pub const AF_ROUTE: ::c_int = 17; -pub const pseudo_AF_XTP: ::c_int = 19; -pub const AF_COIP: ::c_int = 20; -pub const AF_CNT: ::c_int = 21; -pub const pseudo_AF_RTIP: ::c_int = 22; -pub const AF_IPX: ::c_int = 23; -pub const AF_SIP: ::c_int = 24; -pub const pseudo_AF_PIP: ::c_int = 25; -pub const AF_INET6: ::c_int = 26; -pub const AF_MAX: ::c_int = 27; -pub const SOMAXCONN: ::c_int = 4096; -pub const _SS_SIZE: usize = 128; -pub const CMGROUP_MAX: usize = 16; -pub const SOL_SOCKET: ::c_int = 65535; - -// netinet/in.h -pub const SOL_IP: ::c_int = 0; -pub const IP_OPTIONS: ::c_int = 1; -pub const IP_HDRINCL: ::c_int = 2; -pub const IP_TOS: ::c_int = 3; -pub const IP_TTL: ::c_int = 4; -pub const IP_RECVOPTS: ::c_int = 5; -pub const IP_RECVRETOPTS: ::c_int = 6; -pub const IP_RECVDSTADDR: ::c_int = 7; -pub const IP_RETOPTS: ::c_int = 8; -pub const IP_MULTICAST_IF: ::c_int = 9; -pub const IP_MULTICAST_TTL: ::c_int = 10; -pub const IP_MULTICAST_LOOP: ::c_int = 11; -pub const IP_ADD_MEMBERSHIP: ::c_int = 12; -pub const IP_DROP_MEMBERSHIP: ::c_int = 13; -pub const SOL_IPV6: ::c_int = 41; -pub const SOL_ICMPV6: ::c_int = 58; -pub const IPV6_ADDRFORM: ::c_int = 1; -pub const IPV6_2292PKTINFO: ::c_int = 2; -pub const IPV6_2292HOPOPTS: ::c_int = 3; -pub const IPV6_2292DSTOPTS: ::c_int = 4; -pub const IPV6_2292RTHDR: ::c_int = 5; -pub const IPV6_2292PKTOPTIONS: ::c_int = 6; -pub const IPV6_CHECKSUM: ::c_int = 7; -pub const IPV6_2292HOPLIMIT: ::c_int = 8; -pub const IPV6_RXINFO: ::c_int = 2; -pub const IPV6_TXINFO: ::c_int = 2; -pub const SCM_SRCINFO: ::c_int = 2; -pub const IPV6_UNICAST_HOPS: ::c_int = 16; -pub const IPV6_MULTICAST_IF: ::c_int = 17; -pub const IPV6_MULTICAST_HOPS: ::c_int = 18; -pub const IPV6_MULTICAST_LOOP: ::c_int = 19; -pub const IPV6_JOIN_GROUP: ::c_int = 20; -pub const IPV6_LEAVE_GROUP: ::c_int = 21; -pub const IPV6_ROUTER_ALERT: ::c_int = 22; -pub const IPV6_MTU_DISCOVER: ::c_int = 23; -pub const IPV6_MTU: ::c_int = 24; -pub const IPV6_RECVERR: ::c_int = 25; -pub const IPV6_V6ONLY: ::c_int = 26; -pub const IPV6_JOIN_ANYCAST: ::c_int = 27; -pub const IPV6_LEAVE_ANYCAST: ::c_int = 28; -pub const IPV6_RECVPKTINFO: ::c_int = 49; -pub const IPV6_PKTINFO: ::c_int = 50; -pub const IPV6_RECVHOPLIMIT: ::c_int = 51; -pub const IPV6_HOPLIMIT: ::c_int = 52; -pub const IPV6_RECVHOPOPTS: ::c_int = 53; -pub const IPV6_HOPOPTS: ::c_int = 54; -pub const IPV6_RTHDRDSTOPTS: ::c_int = 55; -pub const IPV6_RECVRTHDR: ::c_int = 56; -pub const IPV6_RTHDR: ::c_int = 57; -pub const IPV6_RECVDSTOPTS: ::c_int = 58; -pub const IPV6_DSTOPTS: ::c_int = 59; -pub const IPV6_RECVPATHMTU: ::c_int = 60; -pub const IPV6_PATHMTU: ::c_int = 61; -pub const IPV6_DONTFRAG: ::c_int = 62; -pub const IPV6_RECVTCLASS: ::c_int = 66; -pub const IPV6_TCLASS: ::c_int = 67; -pub const IPV6_ADDR_PREFERENCES: ::c_int = 72; -pub const IPV6_MINHOPCOUNT: ::c_int = 73; -pub const IPV6_ADD_MEMBERSHIP: ::c_int = 20; -pub const IPV6_DROP_MEMBERSHIP: ::c_int = 21; -pub const IPV6_RXHOPOPTS: ::c_int = 3; -pub const IPV6_RXDSTOPTS: ::c_int = 4; -pub const IPV6_RTHDR_LOOSE: ::c_int = 0; -pub const IPV6_RTHDR_STRICT: ::c_int = 1; -pub const IPV6_RTHDR_TYPE_0: ::c_int = 0; -pub const IN_CLASSA_NET: u32 = 4278190080; -pub const IN_CLASSA_NSHIFT: usize = 24; -pub const IN_CLASSA_HOST: u32 = 16777215; -pub const IN_CLASSA_MAX: u32 = 128; -pub const IN_CLASSB_NET: u32 = 4294901760; -pub const IN_CLASSB_NSHIFT: usize = 16; -pub const IN_CLASSB_HOST: u32 = 65535; -pub const IN_CLASSB_MAX: u32 = 65536; -pub const IN_CLASSC_NET: u32 = 4294967040; -pub const IN_CLASSC_NSHIFT: usize = 8; -pub const IN_CLASSC_HOST: u32 = 255; -pub const IN_LOOPBACKNET: u32 = 127; -pub const INET_ADDRSTRLEN: usize = 16; -pub const INET6_ADDRSTRLEN: usize = 46; - -// bits/posix1_lim.h -pub const _POSIX_AIO_LISTIO_MAX: usize = 2; -pub const _POSIX_AIO_MAX: usize = 1; -pub const _POSIX_ARG_MAX: usize = 4096; -pub const _POSIX_CHILD_MAX: usize = 25; -pub const _POSIX_DELAYTIMER_MAX: usize = 32; -pub const _POSIX_HOST_NAME_MAX: usize = 255; -pub const _POSIX_LINK_MAX: usize = 8; -pub const _POSIX_LOGIN_NAME_MAX: usize = 9; -pub const _POSIX_MAX_CANON: usize = 255; -pub const _POSIX_MAX_INPUT: usize = 255; -pub const _POSIX_MQ_OPEN_MAX: usize = 8; -pub const _POSIX_MQ_PRIO_MAX: usize = 32; -pub const _POSIX_NAME_MAX: usize = 14; -pub const _POSIX_NGROUPS_MAX: usize = 8; -pub const _POSIX_OPEN_MAX: usize = 20; -pub const _POSIX_FD_SETSIZE: usize = 20; -pub const _POSIX_PATH_MAX: usize = 256; -pub const _POSIX_PIPE_BUF: usize = 512; -pub const _POSIX_RE_DUP_MAX: usize = 255; -pub const _POSIX_RTSIG_MAX: usize = 8; -pub const _POSIX_SEM_NSEMS_MAX: usize = 256; -pub const _POSIX_SEM_VALUE_MAX: usize = 32767; -pub const _POSIX_SIGQUEUE_MAX: usize = 32; -pub const _POSIX_SSIZE_MAX: usize = 32767; -pub const _POSIX_STREAM_MAX: usize = 8; -pub const _POSIX_SYMLINK_MAX: usize = 255; -pub const _POSIX_SYMLOOP_MAX: usize = 8; -pub const _POSIX_TIMER_MAX: usize = 32; -pub const _POSIX_TTY_NAME_MAX: usize = 9; -pub const _POSIX_TZNAME_MAX: usize = 6; -pub const _POSIX_QLIMIT: usize = 1; -pub const _POSIX_HIWAT: usize = 512; -pub const _POSIX_UIO_MAXIOV: usize = 16; -pub const _POSIX_CLOCKRES_MIN: usize = 20000000; -pub const NAME_MAX: usize = 255; -pub const NGROUPS_MAX: usize = 256; -pub const _POSIX_THREAD_KEYS_MAX: usize = 128; -pub const _POSIX_THREAD_DESTRUCTOR_ITERATIONS: usize = 4; -pub const _POSIX_THREAD_THREADS_MAX: usize = 64; -pub const SEM_VALUE_MAX: ::c_int = 2147483647; -pub const MAXNAMLEN: usize = 255; - -// netdb.h -pub const _PATH_HEQUIV: &'static [u8; 17usize] = b"/etc/hosts.equiv\0"; -pub const _PATH_HOSTS: &'static [u8; 11usize] = b"/etc/hosts\0"; -pub const _PATH_NETWORKS: &'static [u8; 14usize] = b"/etc/networks\0"; -pub const _PATH_NSSWITCH_CONF: &'static [u8; 19usize] = b"/etc/nsswitch.conf\0"; -pub const _PATH_PROTOCOLS: &'static [u8; 15usize] = b"/etc/protocols\0"; -pub const _PATH_SERVICES: &'static [u8; 14usize] = b"/etc/services\0"; -pub const HOST_NOT_FOUND: ::c_int = 1; -pub const TRY_AGAIN: ::c_int = 2; -pub const NO_RECOVERY: ::c_int = 3; -pub const NO_DATA: ::c_int = 4; -pub const NETDB_INTERNAL: ::c_int = -1; -pub const NETDB_SUCCESS: ::c_int = 0; -pub const NO_ADDRESS: ::c_int = 4; -pub const IPPORT_RESERVED: ::c_int = 1024; -pub const SCOPE_DELIMITER: u8 = 37u8; -pub const GAI_WAIT: ::c_int = 0; -pub const GAI_NOWAIT: ::c_int = 1; -pub const AI_PASSIVE: ::c_int = 1; -pub const AI_CANONNAME: ::c_int = 2; -pub const AI_NUMERICHOST: ::c_int = 4; -pub const AI_V4MAPPED: ::c_int = 8; -pub const AI_ALL: ::c_int = 16; -pub const AI_ADDRCONFIG: ::c_int = 32; -pub const AI_IDN: ::c_int = 64; -pub const AI_CANONIDN: ::c_int = 128; -pub const AI_NUMERICSERV: ::c_int = 1024; -pub const EAI_BADFLAGS: ::c_int = -1; -pub const EAI_NONAME: ::c_int = -2; -pub const EAI_AGAIN: ::c_int = -3; -pub const EAI_FAIL: ::c_int = -4; -pub const EAI_FAMILY: ::c_int = -6; -pub const EAI_SOCKTYPE: ::c_int = -7; -pub const EAI_SERVICE: ::c_int = -8; -pub const EAI_MEMORY: ::c_int = -10; -pub const EAI_SYSTEM: ::c_int = -11; -pub const EAI_OVERFLOW: ::c_int = -12; -pub const EAI_NODATA: ::c_int = -5; -pub const EAI_ADDRFAMILY: ::c_int = -9; -pub const EAI_INPROGRESS: ::c_int = -100; -pub const EAI_CANCELED: ::c_int = -101; -pub const EAI_NOTCANCELED: ::c_int = -102; -pub const EAI_ALLDONE: ::c_int = -103; -pub const EAI_INTR: ::c_int = -104; -pub const EAI_IDN_ENCODE: ::c_int = -105; -pub const NI_MAXHOST: usize = 1025; -pub const NI_MAXSERV: usize = 32; -pub const NI_NUMERICHOST: ::c_int = 1; -pub const NI_NUMERICSERV: ::c_int = 2; -pub const NI_NOFQDN: ::c_int = 4; -pub const NI_NAMEREQD: ::c_int = 8; -pub const NI_DGRAM: ::c_int = 16; -pub const NI_IDN: ::c_int = 32; - -// time.h -pub const CLOCK_REALTIME: clockid_t = 0; -pub const CLOCK_MONOTONIC: clockid_t = 1; -pub const CLOCK_PROCESS_CPUTIME_ID: clockid_t = 2; -pub const CLOCK_THREAD_CPUTIME_ID: clockid_t = 3; -pub const CLOCK_MONOTONIC_RAW: clockid_t = 4; -pub const CLOCK_REALTIME_COARSE: clockid_t = 5; -pub const CLOCK_MONOTONIC_COARSE: clockid_t = 6; -pub const TIMER_ABSTIME: ::c_int = 1; -pub const TIME_UTC: ::c_int = 1; - -// sys/poll.h -pub const POLLIN: i16 = 1; -pub const POLLPRI: i16 = 2; -pub const POLLOUT: i16 = 4; -pub const POLLRDNORM: i16 = 1; -pub const POLLRDBAND: i16 = 2; -pub const POLLWRNORM: i16 = 4; -pub const POLLWRBAND: i16 = 4; -pub const POLLERR: i16 = 8; -pub const POLLHUP: i16 = 16; -pub const POLLNVAL: i16 = 32; - -// locale.h -pub const __LC_CTYPE: usize = 0; -pub const __LC_NUMERIC: usize = 1; -pub const __LC_TIME: usize = 2; -pub const __LC_COLLATE: usize = 3; -pub const __LC_MONETARY: usize = 4; -pub const __LC_MESSAGES: usize = 5; -pub const __LC_ALL: usize = 6; -pub const __LC_PAPER: usize = 7; -pub const __LC_NAME: usize = 8; -pub const __LC_ADDRESS: usize = 9; -pub const __LC_TELEPHONE: usize = 10; -pub const __LC_MEASUREMENT: usize = 11; -pub const __LC_IDENTIFICATION: usize = 12; -pub const LC_CTYPE: ::c_int = 0; -pub const LC_NUMERIC: ::c_int = 1; -pub const LC_TIME: ::c_int = 2; -pub const LC_COLLATE: ::c_int = 3; -pub const LC_MONETARY: ::c_int = 4; -pub const LC_MESSAGES: ::c_int = 5; -pub const LC_ALL: ::c_int = 6; -pub const LC_PAPER: ::c_int = 7; -pub const LC_NAME: ::c_int = 8; -pub const LC_ADDRESS: ::c_int = 9; -pub const LC_TELEPHONE: ::c_int = 10; -pub const LC_MEASUREMENT: ::c_int = 11; -pub const LC_IDENTIFICATION: ::c_int = 12; -pub const LC_CTYPE_MASK: ::c_int = 1; -pub const LC_NUMERIC_MASK: ::c_int = 2; -pub const LC_TIME_MASK: ::c_int = 4; -pub const LC_COLLATE_MASK: ::c_int = 8; -pub const LC_MONETARY_MASK: ::c_int = 16; -pub const LC_MESSAGES_MASK: ::c_int = 32; -pub const LC_PAPER_MASK: ::c_int = 128; -pub const LC_NAME_MASK: ::c_int = 256; -pub const LC_ADDRESS_MASK: ::c_int = 512; -pub const LC_TELEPHONE_MASK: ::c_int = 1024; -pub const LC_MEASUREMENT_MASK: ::c_int = 2048; -pub const LC_IDENTIFICATION_MASK: ::c_int = 4096; -pub const LC_ALL_MASK: ::c_int = 8127; - -// semaphore.h -pub const __SIZEOF_SEM_T: usize = 20; - -// termios.h -pub const IGNBRK: tcflag_t = 1; -pub const BRKINT: tcflag_t = 2; -pub const IGNPAR: tcflag_t = 4; -pub const PARMRK: tcflag_t = 8; -pub const INPCK: tcflag_t = 16; -pub const ISTRIP: tcflag_t = 32; -pub const INLCR: tcflag_t = 64; -pub const IGNCR: tcflag_t = 128; -pub const ICRNL: tcflag_t = 256; -pub const IXON: tcflag_t = 512; -pub const IXOFF: tcflag_t = 1024; -pub const IXANY: tcflag_t = 2048; -pub const IMAXBEL: tcflag_t = 8192; -pub const IUCLC: tcflag_t = 16384; -pub const OPOST: tcflag_t = 1; -pub const ONLCR: tcflag_t = 2; -pub const ONOEOT: tcflag_t = 8; -pub const OCRNL: tcflag_t = 16; -pub const ONOCR: tcflag_t = 32; -pub const ONLRET: tcflag_t = 64; -pub const NLDLY: tcflag_t = 768; -pub const NL0: tcflag_t = 0; -pub const NL1: tcflag_t = 256; -pub const TABDLY: tcflag_t = 3076; -pub const TAB0: tcflag_t = 0; -pub const TAB1: tcflag_t = 1024; -pub const TAB2: tcflag_t = 2048; -pub const TAB3: tcflag_t = 4; -pub const CRDLY: tcflag_t = 12288; -pub const CR0: tcflag_t = 0; -pub const CR1: tcflag_t = 4096; -pub const CR2: tcflag_t = 8192; -pub const CR3: tcflag_t = 12288; -pub const FFDLY: tcflag_t = 16384; -pub const FF0: tcflag_t = 0; -pub const FF1: tcflag_t = 16384; -pub const BSDLY: tcflag_t = 32768; -pub const BS0: tcflag_t = 0; -pub const BS1: tcflag_t = 32768; -pub const VTDLY: tcflag_t = 65536; -pub const VT0: tcflag_t = 0; -pub const VT1: tcflag_t = 65536; -pub const OLCUC: tcflag_t = 131072; -pub const OFILL: tcflag_t = 262144; -pub const OFDEL: tcflag_t = 524288; -pub const CIGNORE: tcflag_t = 1; -pub const CSIZE: tcflag_t = 768; -pub const CS5: tcflag_t = 0; -pub const CS6: tcflag_t = 256; -pub const CS7: tcflag_t = 512; -pub const CS8: tcflag_t = 768; -pub const CSTOPB: tcflag_t = 1024; -pub const CREAD: tcflag_t = 2048; -pub const PARENB: tcflag_t = 4096; -pub const PARODD: tcflag_t = 8192; -pub const HUPCL: tcflag_t = 16384; -pub const CLOCAL: tcflag_t = 32768; -pub const CRTSCTS: tcflag_t = 65536; -pub const CRTS_IFLOW: tcflag_t = 65536; -pub const CCTS_OFLOW: tcflag_t = 65536; -pub const CDTRCTS: tcflag_t = 131072; -pub const MDMBUF: tcflag_t = 1048576; -pub const CHWFLOW: tcflag_t = 1245184; -pub const ECHOKE: tcflag_t = 1; -pub const _ECHOE: tcflag_t = 2; -pub const ECHOE: tcflag_t = 2; -pub const _ECHOK: tcflag_t = 4; -pub const ECHOK: tcflag_t = 4; -pub const _ECHO: tcflag_t = 8; -pub const ECHO: tcflag_t = 8; -pub const _ECHONL: tcflag_t = 16; -pub const ECHONL: tcflag_t = 16; -pub const ECHOPRT: tcflag_t = 32; -pub const ECHOCTL: tcflag_t = 64; -pub const _ISIG: tcflag_t = 128; -pub const ISIG: tcflag_t = 128; -pub const _ICANON: tcflag_t = 256; -pub const ICANON: tcflag_t = 256; -pub const ALTWERASE: tcflag_t = 512; -pub const _IEXTEN: tcflag_t = 1024; -pub const IEXTEN: tcflag_t = 1024; -pub const EXTPROC: tcflag_t = 2048; -pub const _TOSTOP: tcflag_t = 4194304; -pub const TOSTOP: tcflag_t = 4194304; -pub const FLUSHO: tcflag_t = 8388608; -pub const NOKERNINFO: tcflag_t = 33554432; -pub const PENDIN: tcflag_t = 536870912; -pub const _NOFLSH: tcflag_t = 2147483648; -pub const NOFLSH: tcflag_t = 2147483648; -pub const VEOF: cc_t = 0; -pub const VEOL: cc_t = 1; -pub const VEOL2: cc_t = 2; -pub const VERASE: cc_t = 3; -pub const VWERASE: cc_t = 4; -pub const VKILL: cc_t = 5; -pub const VREPRINT: cc_t = 6; -pub const VINTR: cc_t = 8; -pub const VQUIT: cc_t = 9; -pub const VSUSP: cc_t = 10; -pub const VDSUSP: cc_t = 11; -pub const VSTART: cc_t = 12; -pub const VSTOP: cc_t = 13; -pub const VLNEXT: cc_t = 14; -pub const VDISCARD: cc_t = 15; -pub const VMIN: cc_t = 16; -pub const VTIME: cc_t = 17; -pub const VSTATUS: cc_t = 18; -pub const NCCS: usize = 20; -pub const B0: speed_t = 0; -pub const B50: speed_t = 50; -pub const B75: speed_t = 75; -pub const B110: speed_t = 110; -pub const B134: speed_t = 134; -pub const B150: speed_t = 150; -pub const B200: speed_t = 200; -pub const B300: speed_t = 300; -pub const B600: speed_t = 600; -pub const B1200: speed_t = 1200; -pub const B1800: speed_t = 1800; -pub const B2400: speed_t = 2400; -pub const B4800: speed_t = 4800; -pub const B9600: speed_t = 9600; -pub const B7200: speed_t = 7200; -pub const B14400: speed_t = 14400; -pub const B19200: speed_t = 19200; -pub const B28800: speed_t = 28800; -pub const B38400: speed_t = 38400; -pub const EXTA: speed_t = 19200; -pub const EXTB: speed_t = 38400; -pub const B57600: speed_t = 57600; -pub const B76800: speed_t = 76800; -pub const B115200: speed_t = 115200; -pub const B230400: speed_t = 230400; -pub const B460800: speed_t = 460800; -pub const B500000: speed_t = 500000; -pub const B576000: speed_t = 576000; -pub const B921600: speed_t = 921600; -pub const B1000000: speed_t = 1000000; -pub const B1152000: speed_t = 1152000; -pub const B1500000: speed_t = 1500000; -pub const B2000000: speed_t = 2000000; -pub const B2500000: speed_t = 2500000; -pub const B3000000: speed_t = 3000000; -pub const B3500000: speed_t = 3500000; -pub const B4000000: speed_t = 4000000; -pub const TCSANOW: ::c_int = 0; -pub const TCSADRAIN: ::c_int = 1; -pub const TCSAFLUSH: ::c_int = 2; -pub const TCSASOFT: ::c_int = 16; -pub const TCIFLUSH: ::c_int = 1; -pub const TCOFLUSH: ::c_int = 2; -pub const TCIOFLUSH: ::c_int = 3; -pub const TCOOFF: ::c_int = 1; -pub const TCOON: ::c_int = 2; -pub const TCIOFF: ::c_int = 3; -pub const TCION: ::c_int = 4; -pub const TTYDEF_IFLAG: tcflag_t = 11042; -pub const TTYDEF_LFLAG: tcflag_t = 1483; -pub const TTYDEF_CFLAG: tcflag_t = 23040; -pub const TTYDEF_SPEED: tcflag_t = 9600; -pub const CEOL: u8 = 0u8; -pub const CERASE: u8 = 127; -pub const CMIN: u8 = 1; -pub const CQUIT: u8 = 28; -pub const CTIME: u8 = 0; -pub const CBRK: u8 = 0u8; - -// dlfcn.h -pub const RTLD_DEFAULT: *mut ::c_void = 0i64 as *mut ::c_void; -pub const RTLD_LAZY: ::c_int = 1; -pub const RTLD_NOW: ::c_int = 2; -pub const RTLD_BINDING_MASK: ::c_int = 3; -pub const RTLD_NOLOAD: ::c_int = 4; -pub const RTLD_DEEPBIND: ::c_int = 8; -pub const RTLD_GLOBAL: ::c_int = 256; -pub const RTLD_LOCAL: ::c_int = 0; -pub const RTLD_NODELETE: ::c_int = 4096; -pub const DLFO_STRUCT_HAS_EH_DBASE: usize = 1; -pub const DLFO_STRUCT_HAS_EH_COUNT: usize = 0; -pub const LM_ID_BASE: c_long = 0; -pub const LM_ID_NEWLM: c_long = -1; - -// bits/signum_generic.h -pub const SIGINT: ::c_int = 2; -pub const SIGILL: ::c_int = 4; -pub const SIGABRT: ::c_int = 6; -pub const SIGFPE: ::c_int = 8; -pub const SIGSEGV: ::c_int = 11; -pub const SIGTERM: ::c_int = 15; -pub const SIGHUP: ::c_int = 1; -pub const SIGQUIT: ::c_int = 3; -pub const SIGTRAP: ::c_int = 5; -pub const SIGKILL: ::c_int = 9; -pub const SIGPIPE: ::c_int = 13; -pub const SIGALRM: ::c_int = 14; -pub const SIGIOT: ::c_int = 6; -pub const SIGBUS: ::c_int = 10; -pub const SIGSYS: ::c_int = 12; -pub const SIGEMT: ::c_int = 7; -pub const SIGINFO: ::c_int = 29; -pub const SIGLOST: ::c_int = 32; -pub const SIGURG: ::c_int = 16; -pub const SIGSTOP: ::c_int = 17; -pub const SIGTSTP: ::c_int = 18; -pub const SIGCONT: ::c_int = 19; -pub const SIGCHLD: ::c_int = 20; -pub const SIGTTIN: ::c_int = 21; -pub const SIGTTOU: ::c_int = 22; -pub const SIGPOLL: ::c_int = 23; -pub const SIGXCPU: ::c_int = 24; -pub const SIGVTALRM: ::c_int = 26; -pub const SIGPROF: ::c_int = 27; -pub const SIGXFSZ: ::c_int = 25; -pub const SIGUSR1: ::c_int = 30; -pub const SIGUSR2: ::c_int = 31; -pub const SIGWINCH: ::c_int = 28; -pub const SIGIO: ::c_int = 23; -pub const SIGCLD: ::c_int = 20; -pub const __SIGRTMIN: usize = 32; -pub const __SIGRTMAX: usize = 32; -pub const _NSIG: usize = 33; -pub const NSIG: usize = 33; - -// bits/sigaction.h -pub const SA_ONSTACK: ::c_int = 1; -pub const SA_RESTART: ::c_int = 2; -pub const SA_NODEFER: ::c_int = 16; -pub const SA_RESETHAND: ::c_int = 4; -pub const SA_NOCLDSTOP: ::c_int = 8; -pub const SA_SIGINFO: ::c_int = 64; -pub const SA_INTERRUPT: ::c_int = 0; -pub const SA_NOMASK: ::c_int = 16; -pub const SA_ONESHOT: ::c_int = 4; -pub const SA_STACK: ::c_int = 1; -pub const SIG_BLOCK: ::c_int = 1; -pub const SIG_UNBLOCK: ::c_int = 2; -pub const SIG_SETMASK: ::c_int = 3; - -// bits/sigcontext.h -pub const FPC_IE: u16 = 1; -pub const FPC_IM: u16 = 1; -pub const FPC_DE: u16 = 2; -pub const FPC_DM: u16 = 2; -pub const FPC_ZE: u16 = 4; -pub const FPC_ZM: u16 = 4; -pub const FPC_OE: u16 = 8; -pub const FPC_OM: u16 = 8; -pub const FPC_UE: u16 = 16; -pub const FPC_PE: u16 = 32; -pub const FPC_PC: u16 = 768; -pub const FPC_PC_24: u16 = 0; -pub const FPC_PC_53: u16 = 512; -pub const FPC_PC_64: u16 = 768; -pub const FPC_RC: u16 = 3072; -pub const FPC_RC_RN: u16 = 0; -pub const FPC_RC_RD: u16 = 1024; -pub const FPC_RC_RU: u16 = 2048; -pub const FPC_RC_CHOP: u16 = 3072; -pub const FPC_IC: u16 = 4096; -pub const FPC_IC_PROJ: u16 = 0; -pub const FPC_IC_AFF: u16 = 4096; -pub const FPS_IE: u16 = 1; -pub const FPS_DE: u16 = 2; -pub const FPS_ZE: u16 = 4; -pub const FPS_OE: u16 = 8; -pub const FPS_UE: u16 = 16; -pub const FPS_PE: u16 = 32; -pub const FPS_SF: u16 = 64; -pub const FPS_ES: u16 = 128; -pub const FPS_C0: u16 = 256; -pub const FPS_C1: u16 = 512; -pub const FPS_C2: u16 = 1024; -pub const FPS_TOS: u16 = 14336; -pub const FPS_TOS_SHIFT: u16 = 11; -pub const FPS_C3: u16 = 16384; -pub const FPS_BUSY: u16 = 32768; -pub const FPE_INTOVF_TRAP: ::c_int = 1; -pub const FPE_INTDIV_FAULT: ::c_int = 2; -pub const FPE_FLTOVF_FAULT: ::c_int = 3; -pub const FPE_FLTDIV_FAULT: ::c_int = 4; -pub const FPE_FLTUND_FAULT: ::c_int = 5; -pub const FPE_SUBRNG_FAULT: ::c_int = 7; -pub const FPE_FLTDNR_FAULT: ::c_int = 8; -pub const FPE_FLTINX_FAULT: ::c_int = 9; -pub const FPE_EMERR_FAULT: ::c_int = 10; -pub const FPE_EMBND_FAULT: ::c_int = 11; -pub const ILL_INVOPR_FAULT: ::c_int = 1; -pub const ILL_STACK_FAULT: ::c_int = 2; -pub const ILL_FPEOPR_FAULT: ::c_int = 3; -pub const DBG_SINGLE_TRAP: ::c_int = 1; -pub const DBG_BRKPNT_FAULT: ::c_int = 2; -pub const __NGREG: usize = 19; -pub const NGREG: usize = 19; - -// bits/sigstack.h -pub const MINSIGSTKSZ: usize = 8192; -pub const SIGSTKSZ: usize = 40960; - -// sys/stat.h -pub const __S_IFMT: mode_t = 61440; -pub const __S_IFDIR: mode_t = 16384; -pub const __S_IFCHR: mode_t = 8192; -pub const __S_IFBLK: mode_t = 24576; -pub const __S_IFREG: mode_t = 32768; -pub const __S_IFLNK: mode_t = 40960; -pub const __S_IFSOCK: mode_t = 49152; -pub const __S_IFIFO: mode_t = 4096; -pub const __S_ISUID: mode_t = 2048; -pub const __S_ISGID: mode_t = 1024; -pub const __S_ISVTX: mode_t = 512; -pub const __S_IREAD: mode_t = 256; -pub const __S_IWRITE: mode_t = 128; -pub const __S_IEXEC: mode_t = 64; -pub const S_INOCACHE: mode_t = 65536; -pub const S_IUSEUNK: mode_t = 131072; -pub const S_IUNKNOWN: mode_t = 1835008; -pub const S_IUNKSHIFT: mode_t = 12; -pub const S_IPTRANS: mode_t = 2097152; -pub const S_IATRANS: mode_t = 4194304; -pub const S_IROOT: mode_t = 8388608; -pub const S_ITRANS: mode_t = 14680064; -pub const S_IMMAP0: mode_t = 16777216; -pub const CMASK: mode_t = 18; -pub const UF_SETTABLE: ::c_uint = 65535; -pub const UF_NODUMP: ::c_uint = 1; -pub const UF_IMMUTABLE: ::c_uint = 2; -pub const UF_APPEND: ::c_uint = 4; -pub const UF_OPAQUE: ::c_uint = 8; -pub const UF_NOUNLINK: ::c_uint = 16; -pub const SF_SETTABLE: ::c_uint = 4294901760; -pub const SF_ARCHIVED: ::c_uint = 65536; -pub const SF_IMMUTABLE: ::c_uint = 131072; -pub const SF_APPEND: ::c_uint = 262144; -pub const SF_NOUNLINK: ::c_uint = 1048576; -pub const SF_SNAPSHOT: ::c_uint = 2097152; -pub const UTIME_NOW: ::c_long = -1; -pub const UTIME_OMIT: ::c_long = -2; -pub const S_IFMT: mode_t = 61440; -pub const S_IFDIR: mode_t = 16384; -pub const S_IFCHR: mode_t = 8192; -pub const S_IFBLK: mode_t = 24576; -pub const S_IFREG: mode_t = 32768; -pub const S_IFIFO: mode_t = 4096; -pub const S_IFLNK: mode_t = 40960; -pub const S_IFSOCK: mode_t = 49152; -pub const S_ISUID: mode_t = 2048; -pub const S_ISGID: mode_t = 1024; -pub const S_ISVTX: mode_t = 512; -pub const S_IRUSR: mode_t = 256; -pub const S_IWUSR: mode_t = 128; -pub const S_IXUSR: mode_t = 64; -pub const S_IRWXU: mode_t = 448; -pub const S_IREAD: mode_t = 256; -pub const S_IWRITE: mode_t = 128; -pub const S_IEXEC: mode_t = 64; -pub const S_IRGRP: mode_t = 32; -pub const S_IWGRP: mode_t = 16; -pub const S_IXGRP: mode_t = 8; -pub const S_IRWXG: mode_t = 56; -pub const S_IROTH: mode_t = 4; -pub const S_IWOTH: mode_t = 2; -pub const S_IXOTH: mode_t = 1; -pub const S_IRWXO: mode_t = 7; -pub const ACCESSPERMS: mode_t = 511; -pub const ALLPERMS: mode_t = 4095; -pub const DEFFILEMODE: mode_t = 438; -pub const S_BLKSIZE: usize = 512; -pub const STATX_TYPE: ::c_uint = 1; -pub const STATX_MODE: ::c_uint = 2; -pub const STATX_NLINK: ::c_uint = 4; -pub const STATX_UID: ::c_uint = 8; -pub const STATX_GID: ::c_uint = 16; -pub const STATX_ATIME: ::c_uint = 32; -pub const STATX_MTIME: ::c_uint = 64; -pub const STATX_CTIME: ::c_uint = 128; -pub const STATX_INO: ::c_uint = 256; -pub const STATX_SIZE: ::c_uint = 512; -pub const STATX_BLOCKS: ::c_uint = 1024; -pub const STATX_BASIC_STATS: ::c_uint = 2047; -pub const STATX_ALL: ::c_uint = 4095; -pub const STATX_BTIME: ::c_uint = 2048; -pub const STATX_MNT_ID: ::c_uint = 4096; -pub const STATX_DIOALIGN: ::c_uint = 8192; -pub const STATX__RESERVED: ::c_uint = 2147483648; -pub const STATX_ATTR_COMPRESSED: ::c_uint = 4; -pub const STATX_ATTR_IMMUTABLE: ::c_uint = 16; -pub const STATX_ATTR_APPEND: ::c_uint = 32; -pub const STATX_ATTR_NODUMP: ::c_uint = 64; -pub const STATX_ATTR_ENCRYPTED: ::c_uint = 2048; -pub const STATX_ATTR_AUTOMOUNT: ::c_uint = 4096; -pub const STATX_ATTR_MOUNT_ROOT: ::c_uint = 8192; -pub const STATX_ATTR_VERITY: ::c_uint = 1048576; -pub const STATX_ATTR_DAX: ::c_uint = 2097152; - -// sys/ioctl.h -pub const TIOCM_LE: ::c_int = 1; -pub const TIOCM_DTR: ::c_int = 2; -pub const TIOCM_RTS: ::c_int = 4; -pub const TIOCM_ST: ::c_int = 8; -pub const TIOCM_SR: ::c_int = 16; -pub const TIOCM_CTS: ::c_int = 32; -pub const TIOCM_CAR: ::c_int = 64; -pub const TIOCM_CD: ::c_int = 64; -pub const TIOCM_RNG: ::c_int = 128; -pub const TIOCM_RI: ::c_int = 128; -pub const TIOCM_DSR: ::c_int = 256; -pub const TIOCPKT_DATA: ::c_int = 0; -pub const TIOCPKT_FLUSHREAD: ::c_int = 1; -pub const TIOCPKT_FLUSHWRITE: ::c_int = 2; -pub const TIOCPKT_STOP: ::c_int = 4; -pub const TIOCPKT_START: ::c_int = 8; -pub const TIOCPKT_NOSTOP: ::c_int = 16; -pub const TIOCPKT_DOSTOP: ::c_int = 32; -pub const TIOCPKT_IOCTL: ::c_int = 64; -pub const TTYDISC: ::c_int = 0; -pub const TABLDISC: ::c_int = 3; -pub const SLIPDISC: ::c_int = 4; -pub const TANDEM: tcflag_t = 1; -pub const CBREAK: tcflag_t = 2; -pub const LCASE: tcflag_t = 4; -pub const CRMOD: tcflag_t = 16; -pub const RAW: tcflag_t = 32; -pub const ODDP: tcflag_t = 64; -pub const EVENP: tcflag_t = 128; -pub const ANYP: tcflag_t = 192; -pub const NLDELAY: tcflag_t = 768; -pub const NL2: tcflag_t = 512; -pub const NL3: tcflag_t = 768; -pub const TBDELAY: tcflag_t = 3072; -pub const XTABS: tcflag_t = 3072; -pub const CRDELAY: tcflag_t = 12288; -pub const VTDELAY: tcflag_t = 16384; -pub const BSDELAY: tcflag_t = 32768; -pub const ALLDELAY: tcflag_t = 65280; -pub const CRTBS: tcflag_t = 65536; -pub const PRTERA: tcflag_t = 131072; -pub const CRTERA: tcflag_t = 262144; -pub const TILDE: tcflag_t = 524288; -pub const LITOUT: tcflag_t = 2097152; -pub const NOHANG: tcflag_t = 16777216; -pub const L001000: tcflag_t = 33554432; -pub const CRTKIL: tcflag_t = 67108864; -pub const PASS8: tcflag_t = 134217728; -pub const CTLECH: tcflag_t = 268435456; -pub const DECCTQ: tcflag_t = 1073741824; - -pub const FIONBIO: ::c_ulong = 0xa008007e; -pub const FIONREAD: ::c_ulong = 0x6008007f; -pub const TIOCSWINSZ: ::c_ulong = 0x90200767; -pub const TIOCGWINSZ: ::c_ulong = 0x50200768; -pub const TIOCEXCL: ::c_ulong = 0x70d; -pub const TIOCNXCL: ::c_ulong = 0x70e; -pub const TIOCSCTTY: ::c_ulong = 0x761; - -pub const FIOCLEX: ::c_ulong = 1; - -// fcntl.h -pub const O_EXEC: ::c_int = 4; -pub const O_NORW: ::c_int = 0; -pub const O_RDONLY: ::c_int = 1; -pub const O_WRONLY: ::c_int = 2; -pub const O_RDWR: ::c_int = 3; -pub const O_ACCMODE: ::c_int = 3; -pub const O_LARGEFILE: ::c_int = 0; -pub const O_CREAT: ::c_int = 16; -pub const O_EXCL: ::c_int = 32; -pub const O_NOLINK: ::c_int = 64; -pub const O_NOTRANS: ::c_int = 128; -pub const O_NOFOLLOW: ::c_int = 1048576; -pub const O_DIRECTORY: ::c_int = 2097152; -pub const O_APPEND: ::c_int = 256; -pub const O_ASYNC: ::c_int = 512; -pub const O_FSYNC: ::c_int = 1024; -pub const O_SYNC: ::c_int = 1024; -pub const O_NOATIME: ::c_int = 2048; -pub const O_SHLOCK: ::c_int = 131072; -pub const O_EXLOCK: ::c_int = 262144; -pub const O_DSYNC: ::c_int = 1024; -pub const O_RSYNC: ::c_int = 1024; -pub const O_NONBLOCK: ::c_int = 8; -pub const O_NDELAY: ::c_int = 8; -pub const O_HURD: ::c_int = 458751; -pub const O_TRUNC: ::c_int = 65536; -pub const O_CLOEXEC: ::c_int = 4194304; -pub const O_IGNORE_CTTY: ::c_int = 524288; -pub const O_TMPFILE: ::c_int = 8388608; -pub const O_NOCTTY: ::c_int = 0; -pub const FREAD: ::c_int = 1; -pub const FWRITE: ::c_int = 2; -pub const FASYNC: ::c_int = 512; -pub const FCREAT: ::c_int = 16; -pub const FEXCL: ::c_int = 32; -pub const FTRUNC: ::c_int = 65536; -pub const FNOCTTY: ::c_int = 0; -pub const FFSYNC: ::c_int = 1024; -pub const FSYNC: ::c_int = 1024; -pub const FAPPEND: ::c_int = 256; -pub const FNONBLOCK: ::c_int = 8; -pub const FNDELAY: ::c_int = 8; -pub const F_DUPFD: ::c_int = 0; -pub const F_GETFD: ::c_int = 1; -pub const F_SETFD: ::c_int = 2; -pub const F_GETFL: ::c_int = 3; -pub const F_SETFL: ::c_int = 4; -pub const F_GETOWN: ::c_int = 5; -pub const F_SETOWN: ::c_int = 6; -pub const F_GETLK: ::c_int = 7; -pub const F_SETLK: ::c_int = 8; -pub const F_SETLKW: ::c_int = 9; -pub const F_GETLK64: ::c_int = 10; -pub const F_SETLK64: ::c_int = 11; -pub const F_SETLKW64: ::c_int = 12; -pub const F_DUPFD_CLOEXEC: ::c_int = 1030; -pub const FD_CLOEXEC: ::c_int = 1; -pub const F_RDLCK: ::c_int = 1; -pub const F_WRLCK: ::c_int = 2; -pub const F_UNLCK: ::c_int = 3; -pub const POSIX_FADV_NORMAL: ::c_int = 0; -pub const POSIX_FADV_RANDOM: ::c_int = 1; -pub const POSIX_FADV_SEQUENTIAL: ::c_int = 2; -pub const POSIX_FADV_WILLNEED: ::c_int = 3; -pub const POSIX_FADV_DONTNEED: ::c_int = 4; -pub const POSIX_FADV_NOREUSE: ::c_int = 5; -pub const AT_FDCWD: ::c_int = -100; -pub const AT_SYMLINK_NOFOLLOW: ::c_int = 256; -pub const AT_REMOVEDIR: ::c_int = 512; -pub const AT_SYMLINK_FOLLOW: ::c_int = 1024; -pub const AT_NO_AUTOMOUNT: ::c_int = 2048; -pub const AT_EMPTY_PATH: ::c_int = 4096; -pub const AT_STATX_SYNC_TYPE: ::c_int = 24576; -pub const AT_STATX_SYNC_AS_STAT: ::c_int = 0; -pub const AT_STATX_FORCE_SYNC: ::c_int = 8192; -pub const AT_STATX_DONT_SYNC: ::c_int = 16384; -pub const AT_RECURSIVE: ::c_int = 32768; -pub const AT_EACCESS: ::c_int = 512; - -// sys/uio.h -pub const RWF_HIPRI: ::c_int = 1; -pub const RWF_DSYNC: ::c_int = 2; -pub const RWF_SYNC: ::c_int = 4; -pub const RWF_NOWAIT: ::c_int = 8; -pub const RWF_APPEND: ::c_int = 16; - -// errno.h -pub const EPERM: ::c_int = 1073741825; -pub const ENOENT: ::c_int = 1073741826; -pub const ESRCH: ::c_int = 1073741827; -pub const EINTR: ::c_int = 1073741828; -pub const EIO: ::c_int = 1073741829; -pub const ENXIO: ::c_int = 1073741830; -pub const E2BIG: ::c_int = 1073741831; -pub const ENOEXEC: ::c_int = 1073741832; -pub const EBADF: ::c_int = 1073741833; -pub const ECHILD: ::c_int = 1073741834; -pub const EDEADLK: ::c_int = 1073741835; -pub const ENOMEM: ::c_int = 1073741836; -pub const EACCES: ::c_int = 1073741837; -pub const EFAULT: ::c_int = 1073741838; -pub const ENOTBLK: ::c_int = 1073741839; -pub const EBUSY: ::c_int = 1073741840; -pub const EEXIST: ::c_int = 1073741841; -pub const EXDEV: ::c_int = 1073741842; -pub const ENODEV: ::c_int = 1073741843; -pub const ENOTDIR: ::c_int = 1073741844; -pub const EISDIR: ::c_int = 1073741845; -pub const EINVAL: ::c_int = 1073741846; -pub const EMFILE: ::c_int = 1073741848; -pub const ENFILE: ::c_int = 1073741847; -pub const ENOTTY: ::c_int = 1073741849; -pub const ETXTBSY: ::c_int = 1073741850; -pub const EFBIG: ::c_int = 1073741851; -pub const ENOSPC: ::c_int = 1073741852; -pub const ESPIPE: ::c_int = 1073741853; -pub const EROFS: ::c_int = 1073741854; -pub const EMLINK: ::c_int = 1073741855; -pub const EPIPE: ::c_int = 1073741856; -pub const EDOM: ::c_int = 1073741857; -pub const ERANGE: ::c_int = 1073741858; -pub const EAGAIN: ::c_int = 1073741859; -pub const EWOULDBLOCK: ::c_int = 1073741859; -pub const EINPROGRESS: ::c_int = 1073741860; -pub const EALREADY: ::c_int = 1073741861; -pub const ENOTSOCK: ::c_int = 1073741862; -pub const EMSGSIZE: ::c_int = 1073741864; -pub const EPROTOTYPE: ::c_int = 1073741865; -pub const ENOPROTOOPT: ::c_int = 1073741866; -pub const EPROTONOSUPPORT: ::c_int = 1073741867; -pub const ESOCKTNOSUPPORT: ::c_int = 1073741868; -pub const EOPNOTSUPP: ::c_int = 1073741869; -pub const EPFNOSUPPORT: ::c_int = 1073741870; -pub const EAFNOSUPPORT: ::c_int = 1073741871; -pub const EADDRINUSE: ::c_int = 1073741872; -pub const EADDRNOTAVAIL: ::c_int = 1073741873; -pub const ENETDOWN: ::c_int = 1073741874; -pub const ENETUNREACH: ::c_int = 1073741875; -pub const ENETRESET: ::c_int = 1073741876; -pub const ECONNABORTED: ::c_int = 1073741877; -pub const ECONNRESET: ::c_int = 1073741878; -pub const ENOBUFS: ::c_int = 1073741879; -pub const EISCONN: ::c_int = 1073741880; -pub const ENOTCONN: ::c_int = 1073741881; -pub const EDESTADDRREQ: ::c_int = 1073741863; -pub const ESHUTDOWN: ::c_int = 1073741882; -pub const ETOOMANYREFS: ::c_int = 1073741883; -pub const ETIMEDOUT: ::c_int = 1073741884; -pub const ECONNREFUSED: ::c_int = 1073741885; -pub const ELOOP: ::c_int = 1073741886; -pub const ENAMETOOLONG: ::c_int = 1073741887; -pub const EHOSTDOWN: ::c_int = 1073741888; -pub const EHOSTUNREACH: ::c_int = 1073741889; -pub const ENOTEMPTY: ::c_int = 1073741890; -pub const EPROCLIM: ::c_int = 1073741891; -pub const EUSERS: ::c_int = 1073741892; -pub const EDQUOT: ::c_int = 1073741893; -pub const ESTALE: ::c_int = 1073741894; -pub const EREMOTE: ::c_int = 1073741895; -pub const EBADRPC: ::c_int = 1073741896; -pub const ERPCMISMATCH: ::c_int = 1073741897; -pub const EPROGUNAVAIL: ::c_int = 1073741898; -pub const EPROGMISMATCH: ::c_int = 1073741899; -pub const EPROCUNAVAIL: ::c_int = 1073741900; -pub const ENOLCK: ::c_int = 1073741901; -pub const EFTYPE: ::c_int = 1073741903; -pub const EAUTH: ::c_int = 1073741904; -pub const ENEEDAUTH: ::c_int = 1073741905; -pub const ENOSYS: ::c_int = 1073741902; -pub const ELIBEXEC: ::c_int = 1073741907; -pub const ENOTSUP: ::c_int = 1073741942; -pub const EILSEQ: ::c_int = 1073741930; -pub const EBACKGROUND: ::c_int = 1073741924; -pub const EDIED: ::c_int = 1073741925; -pub const EGREGIOUS: ::c_int = 1073741927; -pub const EIEIO: ::c_int = 1073741928; -pub const EGRATUITOUS: ::c_int = 1073741929; -pub const EBADMSG: ::c_int = 1073741931; -pub const EIDRM: ::c_int = 1073741932; -pub const EMULTIHOP: ::c_int = 1073741933; -pub const ENODATA: ::c_int = 1073741934; -pub const ENOLINK: ::c_int = 1073741935; -pub const ENOMSG: ::c_int = 1073741936; -pub const ENOSR: ::c_int = 1073741937; -pub const ENOSTR: ::c_int = 1073741938; -pub const EOVERFLOW: ::c_int = 1073741939; -pub const EPROTO: ::c_int = 1073741940; -pub const ETIME: ::c_int = 1073741941; -pub const ECANCELED: ::c_int = 1073741943; -pub const EOWNERDEAD: ::c_int = 1073741944; -pub const ENOTRECOVERABLE: ::c_int = 1073741945; -pub const EMACH_SEND_IN_PROGRESS: ::c_int = 268435457; -pub const EMACH_SEND_INVALID_DATA: ::c_int = 268435458; -pub const EMACH_SEND_INVALID_DEST: ::c_int = 268435459; -pub const EMACH_SEND_TIMED_OUT: ::c_int = 268435460; -pub const EMACH_SEND_WILL_NOTIFY: ::c_int = 268435461; -pub const EMACH_SEND_NOTIFY_IN_PROGRESS: ::c_int = 268435462; -pub const EMACH_SEND_INTERRUPTED: ::c_int = 268435463; -pub const EMACH_SEND_MSG_TOO_SMALL: ::c_int = 268435464; -pub const EMACH_SEND_INVALID_REPLY: ::c_int = 268435465; -pub const EMACH_SEND_INVALID_RIGHT: ::c_int = 268435466; -pub const EMACH_SEND_INVALID_NOTIFY: ::c_int = 268435467; -pub const EMACH_SEND_INVALID_MEMORY: ::c_int = 268435468; -pub const EMACH_SEND_NO_BUFFER: ::c_int = 268435469; -pub const EMACH_SEND_NO_NOTIFY: ::c_int = 268435470; -pub const EMACH_SEND_INVALID_TYPE: ::c_int = 268435471; -pub const EMACH_SEND_INVALID_HEADER: ::c_int = 268435472; -pub const EMACH_RCV_IN_PROGRESS: ::c_int = 268451841; -pub const EMACH_RCV_INVALID_NAME: ::c_int = 268451842; -pub const EMACH_RCV_TIMED_OUT: ::c_int = 268451843; -pub const EMACH_RCV_TOO_LARGE: ::c_int = 268451844; -pub const EMACH_RCV_INTERRUPTED: ::c_int = 268451845; -pub const EMACH_RCV_PORT_CHANGED: ::c_int = 268451846; -pub const EMACH_RCV_INVALID_NOTIFY: ::c_int = 268451847; -pub const EMACH_RCV_INVALID_DATA: ::c_int = 268451848; -pub const EMACH_RCV_PORT_DIED: ::c_int = 268451849; -pub const EMACH_RCV_IN_SET: ::c_int = 268451850; -pub const EMACH_RCV_HEADER_ERROR: ::c_int = 268451851; -pub const EMACH_RCV_BODY_ERROR: ::c_int = 268451852; -pub const EKERN_INVALID_ADDRESS: ::c_int = 1; -pub const EKERN_PROTECTION_FAILURE: ::c_int = 2; -pub const EKERN_NO_SPACE: ::c_int = 3; -pub const EKERN_INVALID_ARGUMENT: ::c_int = 4; -pub const EKERN_FAILURE: ::c_int = 5; -pub const EKERN_RESOURCE_SHORTAGE: ::c_int = 6; -pub const EKERN_NOT_RECEIVER: ::c_int = 7; -pub const EKERN_NO_ACCESS: ::c_int = 8; -pub const EKERN_MEMORY_FAILURE: ::c_int = 9; -pub const EKERN_MEMORY_ERROR: ::c_int = 10; -pub const EKERN_NOT_IN_SET: ::c_int = 12; -pub const EKERN_NAME_EXISTS: ::c_int = 13; -pub const EKERN_ABORTED: ::c_int = 14; -pub const EKERN_INVALID_NAME: ::c_int = 15; -pub const EKERN_INVALID_TASK: ::c_int = 16; -pub const EKERN_INVALID_RIGHT: ::c_int = 17; -pub const EKERN_INVALID_VALUE: ::c_int = 18; -pub const EKERN_UREFS_OVERFLOW: ::c_int = 19; -pub const EKERN_INVALID_CAPABILITY: ::c_int = 20; -pub const EKERN_RIGHT_EXISTS: ::c_int = 21; -pub const EKERN_INVALID_HOST: ::c_int = 22; -pub const EKERN_MEMORY_PRESENT: ::c_int = 23; -pub const EKERN_WRITE_PROTECTION_FAILURE: ::c_int = 24; -pub const EKERN_TERMINATED: ::c_int = 26; -pub const EKERN_TIMEDOUT: ::c_int = 27; -pub const EKERN_INTERRUPTED: ::c_int = 28; -pub const EMIG_TYPE_ERROR: ::c_int = -300; -pub const EMIG_REPLY_MISMATCH: ::c_int = -301; -pub const EMIG_REMOTE_ERROR: ::c_int = -302; -pub const EMIG_BAD_ID: ::c_int = -303; -pub const EMIG_BAD_ARGUMENTS: ::c_int = -304; -pub const EMIG_NO_REPLY: ::c_int = -305; -pub const EMIG_EXCEPTION: ::c_int = -306; -pub const EMIG_ARRAY_TOO_LARGE: ::c_int = -307; -pub const EMIG_SERVER_DIED: ::c_int = -308; -pub const EMIG_DESTROY_REQUEST: ::c_int = -309; -pub const ED_IO_ERROR: ::c_int = 2500; -pub const ED_WOULD_BLOCK: ::c_int = 2501; -pub const ED_NO_SUCH_DEVICE: ::c_int = 2502; -pub const ED_ALREADY_OPEN: ::c_int = 2503; -pub const ED_DEVICE_DOWN: ::c_int = 2504; -pub const ED_INVALID_OPERATION: ::c_int = 2505; -pub const ED_INVALID_RECNUM: ::c_int = 2506; -pub const ED_INVALID_SIZE: ::c_int = 2507; -pub const ED_NO_MEMORY: ::c_int = 2508; -pub const ED_READ_ONLY: ::c_int = 2509; -pub const _HURD_ERRNOS: usize = 122; - -// sched.h -pub const SCHED_OTHER: ::c_int = 0; -pub const SCHED_FIFO: ::c_int = 1; -pub const SCHED_RR: ::c_int = 2; -pub const _BITS_TYPES_STRUCT_SCHED_PARAM: usize = 1; -pub const __CPU_SETSIZE: usize = 1024; -pub const CPU_SETSIZE: usize = 1024; - -// pthread.h -pub const PTHREAD_SPINLOCK_INITIALIZER: ::c_int = 0; -pub const PTHREAD_CANCEL_DISABLE: ::c_int = 0; -pub const PTHREAD_CANCEL_ENABLE: ::c_int = 1; -pub const PTHREAD_CANCEL_DEFERRED: ::c_int = 0; -pub const PTHREAD_CANCEL_ASYNCHRONOUS: ::c_int = 1; -pub const PTHREAD_BARRIER_SERIAL_THREAD: ::c_int = -1; - -// netinet/tcp.h -pub const TCP_NODELAY: ::c_int = 1; -pub const TCP_MAXSEG: ::c_int = 2; -pub const TCP_CORK: ::c_int = 3; -pub const TCP_KEEPIDLE: ::c_int = 4; -pub const TCP_KEEPINTVL: ::c_int = 5; -pub const TCP_KEEPCNT: ::c_int = 6; -pub const TCP_SYNCNT: ::c_int = 7; -pub const TCP_LINGER2: ::c_int = 8; -pub const TCP_DEFER_ACCEPT: ::c_int = 9; -pub const TCP_WINDOW_CLAMP: ::c_int = 10; -pub const TCP_INFO: ::c_int = 11; -pub const TCP_QUICKACK: ::c_int = 12; -pub const TCP_CONGESTION: ::c_int = 13; -pub const TCP_MD5SIG: ::c_int = 14; -pub const TCP_COOKIE_TRANSACTIONS: ::c_int = 15; -pub const TCP_THIN_LINEAR_TIMEOUTS: ::c_int = 16; -pub const TCP_THIN_DUPACK: ::c_int = 17; -pub const TCP_USER_TIMEOUT: ::c_int = 18; -pub const TCP_REPAIR: ::c_int = 19; -pub const TCP_REPAIR_QUEUE: ::c_int = 20; -pub const TCP_QUEUE_SEQ: ::c_int = 21; -pub const TCP_REPAIR_OPTIONS: ::c_int = 22; -pub const TCP_FASTOPEN: ::c_int = 23; -pub const TCP_TIMESTAMP: ::c_int = 24; -pub const TCP_NOTSENT_LOWAT: ::c_int = 25; -pub const TCP_CC_INFO: ::c_int = 26; -pub const TCP_SAVE_SYN: ::c_int = 27; -pub const TCP_SAVED_SYN: ::c_int = 28; -pub const TCP_REPAIR_WINDOW: ::c_int = 29; -pub const TCP_FASTOPEN_CONNECT: ::c_int = 30; -pub const TCP_ULP: ::c_int = 31; -pub const TCP_MD5SIG_EXT: ::c_int = 32; -pub const TCP_FASTOPEN_KEY: ::c_int = 33; -pub const TCP_FASTOPEN_NO_COOKIE: ::c_int = 34; -pub const TCP_ZEROCOPY_RECEIVE: ::c_int = 35; -pub const TCP_INQ: ::c_int = 36; -pub const TCP_CM_INQ: ::c_int = 36; -pub const TCP_TX_DELAY: ::c_int = 37; -pub const TCP_REPAIR_ON: ::c_int = 1; -pub const TCP_REPAIR_OFF: ::c_int = 0; -pub const TCP_REPAIR_OFF_NO_WP: ::c_int = -1; - -// stdint.h -pub const INT8_MIN: i8 = -128; -pub const INT16_MIN: i16 = -32768; -pub const INT32_MIN: i32 = -2147483648; -pub const INT8_MAX: i8 = 127; -pub const INT16_MAX: i16 = 32767; -pub const INT32_MAX: i32 = 2147483647; -pub const UINT8_MAX: u8 = 255; -pub const UINT16_MAX: u16 = 65535; -pub const UINT32_MAX: u32 = 4294967295; -pub const INT_LEAST8_MIN: int_least8_t = -128; -pub const INT_LEAST16_MIN: int_least16_t = -32768; -pub const INT_LEAST32_MIN: int_least32_t = -2147483648; -pub const INT_LEAST8_MAX: int_least8_t = 127; -pub const INT_LEAST16_MAX: int_least16_t = 32767; -pub const INT_LEAST32_MAX: int_least32_t = 2147483647; -pub const UINT_LEAST8_MAX: uint_least8_t = 255; -pub const UINT_LEAST16_MAX: uint_least16_t = 65535; -pub const UINT_LEAST32_MAX: uint_least32_t = 4294967295; -pub const INT_FAST8_MIN: int_fast8_t = -128; -pub const INT_FAST16_MIN: int_fast16_t = -2147483648; -pub const INT_FAST32_MIN: int_fast32_t = -2147483648; -pub const INT_FAST8_MAX: int_fast8_t = 127; -pub const INT_FAST16_MAX: int_fast16_t = 2147483647; -pub const INT_FAST32_MAX: int_fast32_t = 2147483647; -pub const UINT_FAST8_MAX: uint_fast8_t = 255; -pub const UINT_FAST16_MAX: uint_fast16_t = 4294967295; -pub const UINT_FAST32_MAX: uint_fast32_t = 4294967295; -pub const INTPTR_MIN: __intptr_t = -2147483648; -pub const INTPTR_MAX: __intptr_t = 2147483647; -pub const UINTPTR_MAX: usize = 4294967295; -pub const PTRDIFF_MIN: __ptrdiff_t = -2147483648; -pub const PTRDIFF_MAX: __ptrdiff_t = 2147483647; -pub const SIG_ATOMIC_MIN: __sig_atomic_t = -2147483648; -pub const SIG_ATOMIC_MAX: __sig_atomic_t = 2147483647; -pub const SIZE_MAX: usize = 4294967295; -pub const WINT_MIN: wint_t = 0; -pub const WINT_MAX: wint_t = 4294967295; -pub const INT8_WIDTH: usize = 8; -pub const UINT8_WIDTH: usize = 8; -pub const INT16_WIDTH: usize = 16; -pub const UINT16_WIDTH: usize = 16; -pub const INT32_WIDTH: usize = 32; -pub const UINT32_WIDTH: usize = 32; -pub const INT64_WIDTH: usize = 64; -pub const UINT64_WIDTH: usize = 64; -pub const INT_LEAST8_WIDTH: usize = 8; -pub const UINT_LEAST8_WIDTH: usize = 8; -pub const INT_LEAST16_WIDTH: usize = 16; -pub const UINT_LEAST16_WIDTH: usize = 16; -pub const INT_LEAST32_WIDTH: usize = 32; -pub const UINT_LEAST32_WIDTH: usize = 32; -pub const INT_LEAST64_WIDTH: usize = 64; -pub const UINT_LEAST64_WIDTH: usize = 64; -pub const INT_FAST8_WIDTH: usize = 8; -pub const UINT_FAST8_WIDTH: usize = 8; -pub const INT_FAST16_WIDTH: usize = 32; -pub const UINT_FAST16_WIDTH: usize = 32; -pub const INT_FAST32_WIDTH: usize = 32; -pub const UINT_FAST32_WIDTH: usize = 32; -pub const INT_FAST64_WIDTH: usize = 64; -pub const UINT_FAST64_WIDTH: usize = 64; -pub const INTPTR_WIDTH: usize = 32; -pub const UINTPTR_WIDTH: usize = 32; -pub const INTMAX_WIDTH: usize = 64; -pub const UINTMAX_WIDTH: usize = 64; -pub const PTRDIFF_WIDTH: usize = 32; -pub const SIG_ATOMIC_WIDTH: usize = 32; -pub const SIZE_WIDTH: usize = 32; -pub const WCHAR_WIDTH: usize = 32; -pub const WINT_WIDTH: usize = 32; - -pub const TH_FIN: u8 = 1; -pub const TH_SYN: u8 = 2; -pub const TH_RST: u8 = 4; -pub const TH_PUSH: u8 = 8; -pub const TH_ACK: u8 = 16; -pub const TH_URG: u8 = 32; -pub const TCPOPT_EOL: u8 = 0; -pub const TCPOPT_NOP: u8 = 1; -pub const TCPOPT_MAXSEG: u8 = 2; -pub const TCPOLEN_MAXSEG: u8 = 4; -pub const TCPOPT_WINDOW: u8 = 3; -pub const TCPOLEN_WINDOW: u8 = 3; -pub const TCPOPT_SACK_PERMITTED: u8 = 4; -pub const TCPOLEN_SACK_PERMITTED: u8 = 2; -pub const TCPOPT_SACK: u8 = 5; -pub const TCPOPT_TIMESTAMP: u8 = 8; -pub const TCPOLEN_TIMESTAMP: u8 = 10; -pub const TCPOLEN_TSTAMP_APPA: u8 = 12; -pub const TCPOPT_TSTAMP_HDR: u32 = 16844810; -pub const TCP_MSS: usize = 512; -pub const TCP_MAXWIN: usize = 65535; -pub const TCP_MAX_WINSHIFT: usize = 14; -pub const SOL_TCP: ::c_int = 6; -pub const TCPI_OPT_TIMESTAMPS: u8 = 1; -pub const TCPI_OPT_SACK: u8 = 2; -pub const TCPI_OPT_WSCALE: u8 = 4; -pub const TCPI_OPT_ECN: u8 = 8; -pub const TCPI_OPT_ECN_SEEN: u8 = 16; -pub const TCPI_OPT_SYN_DATA: u8 = 32; -pub const TCP_MD5SIG_MAXKEYLEN: usize = 80; -pub const TCP_MD5SIG_FLAG_PREFIX: usize = 1; -pub const TCP_COOKIE_MIN: usize = 8; -pub const TCP_COOKIE_MAX: usize = 16; -pub const TCP_COOKIE_PAIR_SIZE: usize = 32; -pub const TCP_COOKIE_IN_ALWAYS: ::c_int = 1; -pub const TCP_COOKIE_OUT_NEVER: ::c_int = 2; -pub const TCP_S_DATA_IN: ::c_int = 4; -pub const TCP_S_DATA_OUT: ::c_int = 8; -pub const TCP_MSS_DEFAULT: usize = 536; -pub const TCP_MSS_DESIRED: usize = 1220; - -// sys/wait.h -pub const WCOREFLAG: ::c_int = 128; -pub const WAIT_ANY: pid_t = -1; -pub const WAIT_MYPGRP: pid_t = 0; - -// sys/file.h -pub const LOCK_SH: ::c_int = 1; -pub const LOCK_EX: ::c_int = 2; -pub const LOCK_UN: ::c_int = 8; -pub const LOCK_NB: ::c_int = 4; - -// sys/mman.h -pub const PROT_NONE: ::c_int = 0; -pub const PROT_READ: ::c_int = 4; -pub const PROT_WRITE: ::c_int = 2; -pub const PROT_EXEC: ::c_int = 1; -pub const MAP_PRIVATE: ::c_int = 0; -pub const MAP_FILE: ::c_int = 1; -pub const MAP_ANON: ::c_int = 2; -pub const MAP_SHARED: ::c_int = 16; -pub const MAP_COPY: ::c_int = 32; -pub const MAP_FIXED: ::c_int = 256; -pub const MAP_FAILED: *mut ::c_void = !0 as *mut ::c_void; -pub const MS_SYNC: ::c_int = 0; -pub const MS_ASYNC: ::c_int = 1; -pub const MS_INVALIDATE: ::c_int = 2; -pub const MADV_NORMAL: ::c_int = 0; -pub const MADV_RANDOM: ::c_int = 1; -pub const MADV_SEQUENTIAL: ::c_int = 2; -pub const MADV_WILLNEED: ::c_int = 3; -pub const MADV_DONTNEED: ::c_int = 4; - -// random.h -pub const GRND_NONBLOCK: ::c_uint = 1; -pub const GRND_RANDOM: ::c_uint = 2; -pub const GRND_INSECURE: ::c_uint = 4; - -pub const _PC_LINK_MAX: ::c_int = 0; -pub const _PC_MAX_CANON: ::c_int = 1; -pub const _PC_MAX_INPUT: ::c_int = 2; -pub const _PC_NAME_MAX: ::c_int = 3; -pub const _PC_PATH_MAX: ::c_int = 4; -pub const _PC_PIPE_BUF: ::c_int = 5; -pub const _PC_CHOWN_RESTRICTED: ::c_int = 6; -pub const _PC_NO_TRUNC: ::c_int = 7; -pub const _PC_VDISABLE: ::c_int = 8; -pub const _PC_SYNC_IO: ::c_int = 9; -pub const _PC_ASYNC_IO: ::c_int = 10; -pub const _PC_PRIO_IO: ::c_int = 11; -pub const _PC_SOCK_MAXBUF: ::c_int = 12; -pub const _PC_FILESIZEBITS: ::c_int = 13; -pub const _PC_REC_INCR_XFER_SIZE: ::c_int = 14; -pub const _PC_REC_MAX_XFER_SIZE: ::c_int = 15; -pub const _PC_REC_MIN_XFER_SIZE: ::c_int = 16; -pub const _PC_REC_XFER_ALIGN: ::c_int = 17; -pub const _PC_ALLOC_SIZE_MIN: ::c_int = 18; -pub const _PC_SYMLINK_MAX: ::c_int = 19; -pub const _PC_2_SYMLINKS: ::c_int = 20; -pub const _SC_ARG_MAX: ::c_int = 0; -pub const _SC_CHILD_MAX: ::c_int = 1; -pub const _SC_CLK_TCK: ::c_int = 2; -pub const _SC_NGROUPS_MAX: ::c_int = 3; -pub const _SC_OPEN_MAX: ::c_int = 4; -pub const _SC_STREAM_MAX: ::c_int = 5; -pub const _SC_TZNAME_MAX: ::c_int = 6; -pub const _SC_JOB_CONTROL: ::c_int = 7; -pub const _SC_SAVED_IDS: ::c_int = 8; -pub const _SC_REALTIME_SIGNALS: ::c_int = 9; -pub const _SC_PRIORITY_SCHEDULING: ::c_int = 10; -pub const _SC_TIMERS: ::c_int = 11; -pub const _SC_ASYNCHRONOUS_IO: ::c_int = 12; -pub const _SC_PRIORITIZED_IO: ::c_int = 13; -pub const _SC_SYNCHRONIZED_IO: ::c_int = 14; -pub const _SC_FSYNC: ::c_int = 15; -pub const _SC_MAPPED_FILES: ::c_int = 16; -pub const _SC_MEMLOCK: ::c_int = 17; -pub const _SC_MEMLOCK_RANGE: ::c_int = 18; -pub const _SC_MEMORY_PROTECTION: ::c_int = 19; -pub const _SC_MESSAGE_PASSING: ::c_int = 20; -pub const _SC_SEMAPHORES: ::c_int = 21; -pub const _SC_SHARED_MEMORY_OBJECTS: ::c_int = 22; -pub const _SC_AIO_LISTIO_MAX: ::c_int = 23; -pub const _SC_AIO_MAX: ::c_int = 24; -pub const _SC_AIO_PRIO_DELTA_MAX: ::c_int = 25; -pub const _SC_DELAYTIMER_MAX: ::c_int = 26; -pub const _SC_MQ_OPEN_MAX: ::c_int = 27; -pub const _SC_MQ_PRIO_MAX: ::c_int = 28; -pub const _SC_VERSION: ::c_int = 29; -pub const _SC_PAGESIZE: ::c_int = 30; -pub const _SC_PAGE_SIZE: ::c_int = 30; -pub const _SC_RTSIG_MAX: ::c_int = 31; -pub const _SC_SEM_NSEMS_MAX: ::c_int = 32; -pub const _SC_SEM_VALUE_MAX: ::c_int = 33; -pub const _SC_SIGQUEUE_MAX: ::c_int = 34; -pub const _SC_TIMER_MAX: ::c_int = 35; -pub const _SC_BC_BASE_MAX: ::c_int = 36; -pub const _SC_BC_DIM_MAX: ::c_int = 37; -pub const _SC_BC_SCALE_MAX: ::c_int = 38; -pub const _SC_BC_STRING_MAX: ::c_int = 39; -pub const _SC_COLL_WEIGHTS_MAX: ::c_int = 40; -pub const _SC_EQUIV_CLASS_MAX: ::c_int = 41; -pub const _SC_EXPR_NEST_MAX: ::c_int = 42; -pub const _SC_LINE_MAX: ::c_int = 43; -pub const _SC_RE_DUP_MAX: ::c_int = 44; -pub const _SC_CHARCLASS_NAME_MAX: ::c_int = 45; -pub const _SC_2_VERSION: ::c_int = 46; -pub const _SC_2_C_BIND: ::c_int = 47; -pub const _SC_2_C_DEV: ::c_int = 48; -pub const _SC_2_FORT_DEV: ::c_int = 49; -pub const _SC_2_FORT_RUN: ::c_int = 50; -pub const _SC_2_SW_DEV: ::c_int = 51; -pub const _SC_2_LOCALEDEF: ::c_int = 52; -pub const _SC_PII: ::c_int = 53; -pub const _SC_PII_XTI: ::c_int = 54; -pub const _SC_PII_SOCKET: ::c_int = 55; -pub const _SC_PII_INTERNET: ::c_int = 56; -pub const _SC_PII_OSI: ::c_int = 57; -pub const _SC_POLL: ::c_int = 58; -pub const _SC_SELECT: ::c_int = 59; -pub const _SC_UIO_MAXIOV: ::c_int = 60; -pub const _SC_IOV_MAX: ::c_int = 60; -pub const _SC_PII_INTERNET_STREAM: ::c_int = 61; -pub const _SC_PII_INTERNET_DGRAM: ::c_int = 62; -pub const _SC_PII_OSI_COTS: ::c_int = 63; -pub const _SC_PII_OSI_CLTS: ::c_int = 64; -pub const _SC_PII_OSI_M: ::c_int = 65; -pub const _SC_T_IOV_MAX: ::c_int = 66; -pub const _SC_THREADS: ::c_int = 67; -pub const _SC_THREAD_SAFE_FUNCTIONS: ::c_int = 68; -pub const _SC_GETGR_R_SIZE_MAX: ::c_int = 69; -pub const _SC_GETPW_R_SIZE_MAX: ::c_int = 70; -pub const _SC_LOGIN_NAME_MAX: ::c_int = 71; -pub const _SC_TTY_NAME_MAX: ::c_int = 72; -pub const _SC_THREAD_DESTRUCTOR_ITERATIONS: ::c_int = 73; -pub const _SC_THREAD_KEYS_MAX: ::c_int = 74; -pub const _SC_THREAD_STACK_MIN: ::c_int = 75; -pub const _SC_THREAD_THREADS_MAX: ::c_int = 76; -pub const _SC_THREAD_ATTR_STACKADDR: ::c_int = 77; -pub const _SC_THREAD_ATTR_STACKSIZE: ::c_int = 78; -pub const _SC_THREAD_PRIORITY_SCHEDULING: ::c_int = 79; -pub const _SC_THREAD_PRIO_INHERIT: ::c_int = 80; -pub const _SC_THREAD_PRIO_PROTECT: ::c_int = 81; -pub const _SC_THREAD_PROCESS_SHARED: ::c_int = 82; -pub const _SC_NPROCESSORS_CONF: ::c_int = 83; -pub const _SC_NPROCESSORS_ONLN: ::c_int = 84; -pub const _SC_PHYS_PAGES: ::c_int = 85; -pub const _SC_AVPHYS_PAGES: ::c_int = 86; -pub const _SC_ATEXIT_MAX: ::c_int = 87; -pub const _SC_PASS_MAX: ::c_int = 88; -pub const _SC_XOPEN_VERSION: ::c_int = 89; -pub const _SC_XOPEN_XCU_VERSION: ::c_int = 90; -pub const _SC_XOPEN_UNIX: ::c_int = 91; -pub const _SC_XOPEN_CRYPT: ::c_int = 92; -pub const _SC_XOPEN_ENH_I18N: ::c_int = 93; -pub const _SC_XOPEN_SHM: ::c_int = 94; -pub const _SC_2_CHAR_TERM: ::c_int = 95; -pub const _SC_2_C_VERSION: ::c_int = 96; -pub const _SC_2_UPE: ::c_int = 97; -pub const _SC_XOPEN_XPG2: ::c_int = 98; -pub const _SC_XOPEN_XPG3: ::c_int = 99; -pub const _SC_XOPEN_XPG4: ::c_int = 100; -pub const _SC_CHAR_BIT: ::c_int = 101; -pub const _SC_CHAR_MAX: ::c_int = 102; -pub const _SC_CHAR_MIN: ::c_int = 103; -pub const _SC_INT_MAX: ::c_int = 104; -pub const _SC_INT_MIN: ::c_int = 105; -pub const _SC_LONG_BIT: ::c_int = 106; -pub const _SC_WORD_BIT: ::c_int = 107; -pub const _SC_MB_LEN_MAX: ::c_int = 108; -pub const _SC_NZERO: ::c_int = 109; -pub const _SC_SSIZE_MAX: ::c_int = 110; -pub const _SC_SCHAR_MAX: ::c_int = 111; -pub const _SC_SCHAR_MIN: ::c_int = 112; -pub const _SC_SHRT_MAX: ::c_int = 113; -pub const _SC_SHRT_MIN: ::c_int = 114; -pub const _SC_UCHAR_MAX: ::c_int = 115; -pub const _SC_UINT_MAX: ::c_int = 116; -pub const _SC_ULONG_MAX: ::c_int = 117; -pub const _SC_USHRT_MAX: ::c_int = 118; -pub const _SC_NL_ARGMAX: ::c_int = 119; -pub const _SC_NL_LANGMAX: ::c_int = 120; -pub const _SC_NL_MSGMAX: ::c_int = 121; -pub const _SC_NL_NMAX: ::c_int = 122; -pub const _SC_NL_SETMAX: ::c_int = 123; -pub const _SC_NL_TEXTMAX: ::c_int = 124; -pub const _SC_XBS5_ILP32_OFF32: ::c_int = 125; -pub const _SC_XBS5_ILP32_OFFBIG: ::c_int = 126; -pub const _SC_XBS5_LP64_OFF64: ::c_int = 127; -pub const _SC_XBS5_LPBIG_OFFBIG: ::c_int = 128; -pub const _SC_XOPEN_LEGACY: ::c_int = 129; -pub const _SC_XOPEN_REALTIME: ::c_int = 130; -pub const _SC_XOPEN_REALTIME_THREADS: ::c_int = 131; -pub const _SC_ADVISORY_INFO: ::c_int = 132; -pub const _SC_BARRIERS: ::c_int = 133; -pub const _SC_BASE: ::c_int = 134; -pub const _SC_C_LANG_SUPPORT: ::c_int = 135; -pub const _SC_C_LANG_SUPPORT_R: ::c_int = 136; -pub const _SC_CLOCK_SELECTION: ::c_int = 137; -pub const _SC_CPUTIME: ::c_int = 138; -pub const _SC_THREAD_CPUTIME: ::c_int = 139; -pub const _SC_DEVICE_IO: ::c_int = 140; -pub const _SC_DEVICE_SPECIFIC: ::c_int = 141; -pub const _SC_DEVICE_SPECIFIC_R: ::c_int = 142; -pub const _SC_FD_MGMT: ::c_int = 143; -pub const _SC_FIFO: ::c_int = 144; -pub const _SC_PIPE: ::c_int = 145; -pub const _SC_FILE_ATTRIBUTES: ::c_int = 146; -pub const _SC_FILE_LOCKING: ::c_int = 147; -pub const _SC_FILE_SYSTEM: ::c_int = 148; -pub const _SC_MONOTONIC_CLOCK: ::c_int = 149; -pub const _SC_MULTI_PROCESS: ::c_int = 150; -pub const _SC_SINGLE_PROCESS: ::c_int = 151; -pub const _SC_NETWORKING: ::c_int = 152; -pub const _SC_READER_WRITER_LOCKS: ::c_int = 153; -pub const _SC_SPIN_LOCKS: ::c_int = 154; -pub const _SC_REGEXP: ::c_int = 155; -pub const _SC_REGEX_VERSION: ::c_int = 156; -pub const _SC_SHELL: ::c_int = 157; -pub const _SC_SIGNALS: ::c_int = 158; -pub const _SC_SPAWN: ::c_int = 159; -pub const _SC_SPORADIC_SERVER: ::c_int = 160; -pub const _SC_THREAD_SPORADIC_SERVER: ::c_int = 161; -pub const _SC_SYSTEM_DATABASE: ::c_int = 162; -pub const _SC_SYSTEM_DATABASE_R: ::c_int = 163; -pub const _SC_TIMEOUTS: ::c_int = 164; -pub const _SC_TYPED_MEMORY_OBJECTS: ::c_int = 165; -pub const _SC_USER_GROUPS: ::c_int = 166; -pub const _SC_USER_GROUPS_R: ::c_int = 167; -pub const _SC_2_PBS: ::c_int = 168; -pub const _SC_2_PBS_ACCOUNTING: ::c_int = 169; -pub const _SC_2_PBS_LOCATE: ::c_int = 170; -pub const _SC_2_PBS_MESSAGE: ::c_int = 171; -pub const _SC_2_PBS_TRACK: ::c_int = 172; -pub const _SC_SYMLOOP_MAX: ::c_int = 173; -pub const _SC_STREAMS: ::c_int = 174; -pub const _SC_2_PBS_CHECKPOINT: ::c_int = 175; -pub const _SC_V6_ILP32_OFF32: ::c_int = 176; -pub const _SC_V6_ILP32_OFFBIG: ::c_int = 177; -pub const _SC_V6_LP64_OFF64: ::c_int = 178; -pub const _SC_V6_LPBIG_OFFBIG: ::c_int = 179; -pub const _SC_HOST_NAME_MAX: ::c_int = 180; -pub const _SC_TRACE: ::c_int = 181; -pub const _SC_TRACE_EVENT_FILTER: ::c_int = 182; -pub const _SC_TRACE_INHERIT: ::c_int = 183; -pub const _SC_TRACE_LOG: ::c_int = 184; -pub const _SC_LEVEL1_ICACHE_SIZE: ::c_int = 185; -pub const _SC_LEVEL1_ICACHE_ASSOC: ::c_int = 186; -pub const _SC_LEVEL1_ICACHE_LINESIZE: ::c_int = 187; -pub const _SC_LEVEL1_DCACHE_SIZE: ::c_int = 188; -pub const _SC_LEVEL1_DCACHE_ASSOC: ::c_int = 189; -pub const _SC_LEVEL1_DCACHE_LINESIZE: ::c_int = 190; -pub const _SC_LEVEL2_CACHE_SIZE: ::c_int = 191; -pub const _SC_LEVEL2_CACHE_ASSOC: ::c_int = 192; -pub const _SC_LEVEL2_CACHE_LINESIZE: ::c_int = 193; -pub const _SC_LEVEL3_CACHE_SIZE: ::c_int = 194; -pub const _SC_LEVEL3_CACHE_ASSOC: ::c_int = 195; -pub const _SC_LEVEL3_CACHE_LINESIZE: ::c_int = 196; -pub const _SC_LEVEL4_CACHE_SIZE: ::c_int = 197; -pub const _SC_LEVEL4_CACHE_ASSOC: ::c_int = 198; -pub const _SC_LEVEL4_CACHE_LINESIZE: ::c_int = 199; -pub const _SC_IPV6: ::c_int = 235; -pub const _SC_RAW_SOCKETS: ::c_int = 236; -pub const _SC_V7_ILP32_OFF32: ::c_int = 237; -pub const _SC_V7_ILP32_OFFBIG: ::c_int = 238; -pub const _SC_V7_LP64_OFF64: ::c_int = 239; -pub const _SC_V7_LPBIG_OFFBIG: ::c_int = 240; -pub const _SC_SS_REPL_MAX: ::c_int = 241; -pub const _SC_TRACE_EVENT_NAME_MAX: ::c_int = 242; -pub const _SC_TRACE_NAME_MAX: ::c_int = 243; -pub const _SC_TRACE_SYS_MAX: ::c_int = 244; -pub const _SC_TRACE_USER_EVENT_MAX: ::c_int = 245; -pub const _SC_XOPEN_STREAMS: ::c_int = 246; -pub const _SC_THREAD_ROBUST_PRIO_INHERIT: ::c_int = 247; -pub const _SC_THREAD_ROBUST_PRIO_PROTECT: ::c_int = 248; -pub const _SC_MINSIGSTKSZ: ::c_int = 249; -pub const _SC_SIGSTKSZ: ::c_int = 250; - -pub const _CS_PATH: ::c_int = 0; -pub const _CS_V6_WIDTH_RESTRICTED_ENVS: ::c_int = 1; -pub const _CS_GNU_LIBC_VERSION: ::c_int = 2; -pub const _CS_GNU_LIBPTHREAD_VERSION: ::c_int = 3; -pub const _CS_V5_WIDTH_RESTRICTED_ENVS: ::c_int = 4; -pub const _CS_V7_WIDTH_RESTRICTED_ENVS: ::c_int = 5; -pub const _CS_LFS_CFLAGS: ::c_int = 1000; -pub const _CS_LFS_LDFLAGS: ::c_int = 1001; -pub const _CS_LFS_LIBS: ::c_int = 1002; -pub const _CS_LFS_LINTFLAGS: ::c_int = 1003; -pub const _CS_LFS64_CFLAGS: ::c_int = 1004; -pub const _CS_LFS64_LDFLAGS: ::c_int = 1005; -pub const _CS_LFS64_LIBS: ::c_int = 1006; -pub const _CS_LFS64_LINTFLAGS: ::c_int = 1007; -pub const _CS_XBS5_ILP32_OFF32_CFLAGS: ::c_int = 1100; -pub const _CS_XBS5_ILP32_OFF32_LDFLAGS: ::c_int = 1101; -pub const _CS_XBS5_ILP32_OFF32_LIBS: ::c_int = 1102; -pub const _CS_XBS5_ILP32_OFF32_LINTFLAGS: ::c_int = 1103; -pub const _CS_XBS5_ILP32_OFFBIG_CFLAGS: ::c_int = 1104; -pub const _CS_XBS5_ILP32_OFFBIG_LDFLAGS: ::c_int = 1105; -pub const _CS_XBS5_ILP32_OFFBIG_LIBS: ::c_int = 1106; -pub const _CS_XBS5_ILP32_OFFBIG_LINTFLAGS: ::c_int = 1107; -pub const _CS_XBS5_LP64_OFF64_CFLAGS: ::c_int = 1108; -pub const _CS_XBS5_LP64_OFF64_LDFLAGS: ::c_int = 1109; -pub const _CS_XBS5_LP64_OFF64_LIBS: ::c_int = 1110; -pub const _CS_XBS5_LP64_OFF64_LINTFLAGS: ::c_int = 1111; -pub const _CS_XBS5_LPBIG_OFFBIG_CFLAGS: ::c_int = 1112; -pub const _CS_XBS5_LPBIG_OFFBIG_LDFLAGS: ::c_int = 1113; -pub const _CS_XBS5_LPBIG_OFFBIG_LIBS: ::c_int = 1114; -pub const _CS_XBS5_LPBIG_OFFBIG_LINTFLAGS: ::c_int = 1115; -pub const _CS_POSIX_V6_ILP32_OFF32_CFLAGS: ::c_int = 1116; -pub const _CS_POSIX_V6_ILP32_OFF32_LDFLAGS: ::c_int = 1117; -pub const _CS_POSIX_V6_ILP32_OFF32_LIBS: ::c_int = 1118; -pub const _CS_POSIX_V6_ILP32_OFF32_LINTFLAGS: ::c_int = 1119; -pub const _CS_POSIX_V6_ILP32_OFFBIG_CFLAGS: ::c_int = 1120; -pub const _CS_POSIX_V6_ILP32_OFFBIG_LDFLAGS: ::c_int = 1121; -pub const _CS_POSIX_V6_ILP32_OFFBIG_LIBS: ::c_int = 1122; -pub const _CS_POSIX_V6_ILP32_OFFBIG_LINTFLAGS: ::c_int = 1123; -pub const _CS_POSIX_V6_LP64_OFF64_CFLAGS: ::c_int = 1124; -pub const _CS_POSIX_V6_LP64_OFF64_LDFLAGS: ::c_int = 1125; -pub const _CS_POSIX_V6_LP64_OFF64_LIBS: ::c_int = 1126; -pub const _CS_POSIX_V6_LP64_OFF64_LINTFLAGS: ::c_int = 1127; -pub const _CS_POSIX_V6_LPBIG_OFFBIG_CFLAGS: ::c_int = 1128; -pub const _CS_POSIX_V6_LPBIG_OFFBIG_LDFLAGS: ::c_int = 1129; -pub const _CS_POSIX_V6_LPBIG_OFFBIG_LIBS: ::c_int = 1130; -pub const _CS_POSIX_V6_LPBIG_OFFBIG_LINTFLAGS: ::c_int = 1131; -pub const _CS_POSIX_V7_ILP32_OFF32_CFLAGS: ::c_int = 1132; -pub const _CS_POSIX_V7_ILP32_OFF32_LDFLAGS: ::c_int = 1133; -pub const _CS_POSIX_V7_ILP32_OFF32_LIBS: ::c_int = 1134; -pub const _CS_POSIX_V7_ILP32_OFF32_LINTFLAGS: ::c_int = 1135; -pub const _CS_POSIX_V7_ILP32_OFFBIG_CFLAGS: ::c_int = 1136; -pub const _CS_POSIX_V7_ILP32_OFFBIG_LDFLAGS: ::c_int = 1137; -pub const _CS_POSIX_V7_ILP32_OFFBIG_LIBS: ::c_int = 1138; -pub const _CS_POSIX_V7_ILP32_OFFBIG_LINTFLAGS: ::c_int = 1139; -pub const _CS_POSIX_V7_LP64_OFF64_CFLAGS: ::c_int = 1140; -pub const _CS_POSIX_V7_LP64_OFF64_LDFLAGS: ::c_int = 1141; -pub const _CS_POSIX_V7_LP64_OFF64_LIBS: ::c_int = 1142; -pub const _CS_POSIX_V7_LP64_OFF64_LINTFLAGS: ::c_int = 1143; -pub const _CS_POSIX_V7_LPBIG_OFFBIG_CFLAGS: ::c_int = 1144; -pub const _CS_POSIX_V7_LPBIG_OFFBIG_LDFLAGS: ::c_int = 1145; -pub const _CS_POSIX_V7_LPBIG_OFFBIG_LIBS: ::c_int = 1146; -pub const _CS_POSIX_V7_LPBIG_OFFBIG_LINTFLAGS: ::c_int = 1147; -pub const _CS_V6_ENV: ::c_int = 1148; -pub const _CS_V7_ENV: ::c_int = 1149; - -pub const PTHREAD_PROCESS_PRIVATE: __pthread_process_shared = 0; -pub const PTHREAD_PROCESS_SHARED: __pthread_process_shared = 1; - -pub const PTHREAD_EXPLICIT_SCHED: __pthread_inheritsched = 0; -pub const PTHREAD_INHERIT_SCHED: __pthread_inheritsched = 1; - -pub const PTHREAD_SCOPE_SYSTEM: __pthread_contentionscope = 0; -pub const PTHREAD_SCOPE_PROCESS: __pthread_contentionscope = 1; - -pub const PTHREAD_CREATE_JOINABLE: __pthread_detachstate = 0; -pub const PTHREAD_CREATE_DETACHED: __pthread_detachstate = 1; - -pub const PTHREAD_PRIO_NONE: __pthread_mutex_protocol = 0; -pub const PTHREAD_PRIO_INHERIT: __pthread_mutex_protocol = 1; -pub const PTHREAD_PRIO_PROTECT: __pthread_mutex_protocol = 2; - -pub const PTHREAD_MUTEX_TIMED: __pthread_mutex_type = 0; -pub const PTHREAD_MUTEX_ERRORCHECK: __pthread_mutex_type = 1; -pub const PTHREAD_MUTEX_RECURSIVE: __pthread_mutex_type = 2; - -pub const PTHREAD_MUTEX_STALLED: __pthread_mutex_robustness = 0; -pub const PTHREAD_MUTEX_ROBUST: __pthread_mutex_robustness = 256; - -pub const RLIMIT_CPU: __rlimit_resource = 0; -pub const RLIMIT_FSIZE: __rlimit_resource = 1; -pub const RLIMIT_DATA: __rlimit_resource = 2; -pub const RLIMIT_STACK: __rlimit_resource = 3; -pub const RLIMIT_CORE: __rlimit_resource = 4; -pub const RLIMIT_RSS: __rlimit_resource = 5; -pub const RLIMIT_MEMLOCK: __rlimit_resource = 6; -pub const RLIMIT_NPROC: __rlimit_resource = 7; -pub const RLIMIT_OFILE: __rlimit_resource = 8; -pub const RLIMIT_NOFILE: __rlimit_resource = 8; -pub const RLIMIT_SBSIZE: __rlimit_resource = 9; -pub const RLIMIT_AS: __rlimit_resource = 10; -pub const RLIMIT_VMEM: __rlimit_resource = 10; -pub const RLIMIT_NLIMITS: __rlimit_resource = 11; -pub const RLIM_NLIMITS: __rlimit_resource = 11; - -pub const RUSAGE_SELF: __rusage_who = 0; -pub const RUSAGE_CHILDREN: __rusage_who = -1; - -pub const PRIO_PROCESS: __priority_which = 0; -pub const PRIO_PGRP: __priority_which = 1; -pub const PRIO_USER: __priority_which = 2; - -pub const SOCK_STREAM: ::c_int = 1; -pub const SOCK_DGRAM: ::c_int = 2; -pub const SOCK_RAW: ::c_int = 3; -pub const SOCK_RDM: ::c_int = 4; -pub const SOCK_SEQPACKET: ::c_int = 5; -pub const SOCK_CLOEXEC: ::c_int = 4194304; -pub const SOCK_NONBLOCK: ::c_int = 2048; - -pub const MSG_OOB: ::c_int = 1; -pub const MSG_PEEK: ::c_int = 2; -pub const MSG_DONTROUTE: ::c_int = 4; -pub const MSG_EOR: ::c_int = 8; -pub const MSG_TRUNC: ::c_int = 16; -pub const MSG_CTRUNC: ::c_int = 32; -pub const MSG_WAITALL: ::c_int = 64; -pub const MSG_DONTWAIT: ::c_int = 128; -pub const MSG_NOSIGNAL: ::c_int = 1024; - -pub const SCM_RIGHTS: ::c_int = 1; -pub const SCM_TIMESTAMP: ::c_int = 2; -pub const SCM_CREDS: ::c_int = 3; - -pub const SO_DEBUG: ::c_int = 1; -pub const SO_ACCEPTCONN: ::c_int = 2; -pub const SO_REUSEADDR: ::c_int = 4; -pub const SO_KEEPALIVE: ::c_int = 8; -pub const SO_DONTROUTE: ::c_int = 16; -pub const SO_BROADCAST: ::c_int = 32; -pub const SO_USELOOPBACK: ::c_int = 64; -pub const SO_LINGER: ::c_int = 128; -pub const SO_OOBINLINE: ::c_int = 256; -pub const SO_REUSEPORT: ::c_int = 512; -pub const SO_SNDBUF: ::c_int = 4097; -pub const SO_RCVBUF: ::c_int = 4098; -pub const SO_SNDLOWAT: ::c_int = 4099; -pub const SO_RCVLOWAT: ::c_int = 4100; -pub const SO_SNDTIMEO: ::c_int = 4101; -pub const SO_RCVTIMEO: ::c_int = 4102; -pub const SO_ERROR: ::c_int = 4103; -pub const SO_STYLE: ::c_int = 4104; -pub const SO_TYPE: ::c_int = 4104; - -pub const IPPROTO_IP: ::c_int = 0; -pub const IPPROTO_ICMP: ::c_int = 1; -pub const IPPROTO_IGMP: ::c_int = 2; -pub const IPPROTO_IPIP: ::c_int = 4; -pub const IPPROTO_TCP: ::c_int = 6; -pub const IPPROTO_EGP: ::c_int = 8; -pub const IPPROTO_PUP: ::c_int = 12; -pub const IPPROTO_UDP: ::c_int = 17; -pub const IPPROTO_IDP: ::c_int = 22; -pub const IPPROTO_TP: ::c_int = 29; -pub const IPPROTO_DCCP: ::c_int = 33; -pub const IPPROTO_IPV6: ::c_int = 41; -pub const IPPROTO_RSVP: ::c_int = 46; -pub const IPPROTO_GRE: ::c_int = 47; -pub const IPPROTO_ESP: ::c_int = 50; -pub const IPPROTO_AH: ::c_int = 51; -pub const IPPROTO_MTP: ::c_int = 92; -pub const IPPROTO_BEETPH: ::c_int = 94; -pub const IPPROTO_ENCAP: ::c_int = 98; -pub const IPPROTO_PIM: ::c_int = 103; -pub const IPPROTO_COMP: ::c_int = 108; -pub const IPPROTO_L2TP: ::c_int = 115; -pub const IPPROTO_SCTP: ::c_int = 132; -pub const IPPROTO_UDPLITE: ::c_int = 136; -pub const IPPROTO_MPLS: ::c_int = 137; -pub const IPPROTO_ETHERNET: ::c_int = 143; -pub const IPPROTO_RAW: ::c_int = 255; -pub const IPPROTO_MPTCP: ::c_int = 262; -pub const IPPROTO_MAX: ::c_int = 263; - -pub const IPPROTO_HOPOPTS: ::c_int = 0; -pub const IPPROTO_ROUTING: ::c_int = 43; -pub const IPPROTO_FRAGMENT: ::c_int = 44; -pub const IPPROTO_ICMPV6: ::c_int = 58; -pub const IPPROTO_NONE: ::c_int = 59; -pub const IPPROTO_DSTOPTS: ::c_int = 60; -pub const IPPROTO_MH: ::c_int = 135; - -pub const IPPORT_ECHO: in_port_t = 7; -pub const IPPORT_DISCARD: in_port_t = 9; -pub const IPPORT_SYSTAT: in_port_t = 11; -pub const IPPORT_DAYTIME: in_port_t = 13; -pub const IPPORT_NETSTAT: in_port_t = 15; -pub const IPPORT_FTP: in_port_t = 21; -pub const IPPORT_TELNET: in_port_t = 23; -pub const IPPORT_SMTP: in_port_t = 25; -pub const IPPORT_TIMESERVER: in_port_t = 37; -pub const IPPORT_NAMESERVER: in_port_t = 42; -pub const IPPORT_WHOIS: in_port_t = 43; -pub const IPPORT_MTP: in_port_t = 57; -pub const IPPORT_TFTP: in_port_t = 69; -pub const IPPORT_RJE: in_port_t = 77; -pub const IPPORT_FINGER: in_port_t = 79; -pub const IPPORT_TTYLINK: in_port_t = 87; -pub const IPPORT_SUPDUP: in_port_t = 95; -pub const IPPORT_EXECSERVER: in_port_t = 512; -pub const IPPORT_LOGINSERVER: in_port_t = 513; -pub const IPPORT_CMDSERVER: in_port_t = 514; -pub const IPPORT_EFSSERVER: in_port_t = 520; -pub const IPPORT_BIFFUDP: in_port_t = 512; -pub const IPPORT_WHOSERVER: in_port_t = 513; -pub const IPPORT_ROUTESERVER: in_port_t = 520; -pub const IPPORT_USERRESERVED: in_port_t = 5000; - -pub const DT_UNKNOWN: ::c_uchar = 0; -pub const DT_FIFO: ::c_uchar = 1; -pub const DT_CHR: ::c_uchar = 2; -pub const DT_DIR: ::c_uchar = 4; -pub const DT_BLK: ::c_uchar = 6; -pub const DT_REG: ::c_uchar = 8; -pub const DT_LNK: ::c_uchar = 10; -pub const DT_SOCK: ::c_uchar = 12; -pub const DT_WHT: ::c_uchar = 14; - -pub const ST_RDONLY: ::c_ulong = 1; -pub const ST_NOSUID: ::c_ulong = 2; -pub const ST_NOEXEC: ::c_ulong = 8; -pub const ST_SYNCHRONOUS: ::c_ulong = 16; -pub const ST_NOATIME: ::c_ulong = 32; -pub const ST_RELATIME: ::c_ulong = 64; - -pub const RTLD_DI_LMID: ::c_int = 1; -pub const RTLD_DI_LINKMAP: ::c_int = 2; -pub const RTLD_DI_CONFIGADDR: ::c_int = 3; -pub const RTLD_DI_SERINFO: ::c_int = 4; -pub const RTLD_DI_SERINFOSIZE: ::c_int = 5; -pub const RTLD_DI_ORIGIN: ::c_int = 6; -pub const RTLD_DI_PROFILENAME: ::c_int = 7; -pub const RTLD_DI_PROFILEOUT: ::c_int = 8; -pub const RTLD_DI_TLS_MODID: ::c_int = 9; -pub const RTLD_DI_TLS_DATA: ::c_int = 10; -pub const RTLD_DI_PHDR: ::c_int = 11; -pub const RTLD_DI_MAX: ::c_int = 11; - -pub const SI_ASYNCIO: ::c_int = -4; -pub const SI_MESGQ: ::c_int = -3; -pub const SI_TIMER: ::c_int = -2; -pub const SI_QUEUE: ::c_int = -1; -pub const SI_USER: ::c_int = 0; - -pub const ILL_ILLOPC: ::c_int = 1; -pub const ILL_ILLOPN: ::c_int = 2; -pub const ILL_ILLADR: ::c_int = 3; -pub const ILL_ILLTRP: ::c_int = 4; -pub const ILL_PRVOPC: ::c_int = 5; -pub const ILL_PRVREG: ::c_int = 6; -pub const ILL_COPROC: ::c_int = 7; -pub const ILL_BADSTK: ::c_int = 8; - -pub const FPE_INTDIV: ::c_int = 1; -pub const FPE_INTOVF: ::c_int = 2; -pub const FPE_FLTDIV: ::c_int = 3; -pub const FPE_FLTOVF: ::c_int = 4; -pub const FPE_FLTUND: ::c_int = 5; -pub const FPE_FLTRES: ::c_int = 6; -pub const FPE_FLTINV: ::c_int = 7; -pub const FPE_FLTSUB: ::c_int = 8; - -pub const SEGV_MAPERR: ::c_int = 1; -pub const SEGV_ACCERR: ::c_int = 2; - -pub const BUS_ADRALN: ::c_int = 1; -pub const BUS_ADRERR: ::c_int = 2; -pub const BUS_OBJERR: ::c_int = 3; - -pub const TRAP_BRKPT: ::c_int = 1; -pub const TRAP_TRACE: ::c_int = 2; - -pub const CLD_EXITED: ::c_int = 1; -pub const CLD_KILLED: ::c_int = 2; -pub const CLD_DUMPED: ::c_int = 3; -pub const CLD_TRAPPED: ::c_int = 4; -pub const CLD_STOPPED: ::c_int = 5; -pub const CLD_CONTINUED: ::c_int = 6; - -pub const POLL_IN: ::c_int = 1; -pub const POLL_OUT: ::c_int = 2; -pub const POLL_MSG: ::c_int = 3; -pub const POLL_ERR: ::c_int = 4; -pub const POLL_PRI: ::c_int = 5; -pub const POLL_HUP: ::c_int = 6; - -pub const SIGEV_SIGNAL: ::c_int = 0; -pub const SIGEV_NONE: ::c_int = 1; -pub const SIGEV_THREAD: ::c_int = 2; - -pub const REG_GS: ::c_uint = 0; -pub const REG_FS: ::c_uint = 1; -pub const REG_ES: ::c_uint = 2; -pub const REG_DS: ::c_uint = 3; -pub const REG_EDI: ::c_uint = 4; -pub const REG_ESI: ::c_uint = 5; -pub const REG_EBP: ::c_uint = 6; -pub const REG_ESP: ::c_uint = 7; -pub const REG_EBX: ::c_uint = 8; -pub const REG_EDX: ::c_uint = 9; -pub const REG_ECX: ::c_uint = 10; -pub const REG_EAX: ::c_uint = 11; -pub const REG_TRAPNO: ::c_uint = 12; -pub const REG_ERR: ::c_uint = 13; -pub const REG_EIP: ::c_uint = 14; -pub const REG_CS: ::c_uint = 15; -pub const REG_EFL: ::c_uint = 16; -pub const REG_UESP: ::c_uint = 17; -pub const REG_SS: ::c_uint = 18; - -pub const IOC_VOID: __ioctl_dir = 0; -pub const IOC_OUT: __ioctl_dir = 1; -pub const IOC_IN: __ioctl_dir = 2; -pub const IOC_INOUT: __ioctl_dir = 3; - -pub const IOC_8: __ioctl_datum = 0; -pub const IOC_16: __ioctl_datum = 1; -pub const IOC_32: __ioctl_datum = 2; -pub const IOC_64: __ioctl_datum = 3; - -pub const TCP_ESTABLISHED: ::c_uint = 1; -pub const TCP_SYN_SENT: ::c_uint = 2; -pub const TCP_SYN_RECV: ::c_uint = 3; -pub const TCP_FIN_WAIT1: ::c_uint = 4; -pub const TCP_FIN_WAIT2: ::c_uint = 5; -pub const TCP_TIME_WAIT: ::c_uint = 6; -pub const TCP_CLOSE: ::c_uint = 7; -pub const TCP_CLOSE_WAIT: ::c_uint = 8; -pub const TCP_LAST_ACK: ::c_uint = 9; -pub const TCP_LISTEN: ::c_uint = 10; -pub const TCP_CLOSING: ::c_uint = 11; - -pub const TCP_CA_Open: tcp_ca_state = 0; -pub const TCP_CA_Disorder: tcp_ca_state = 1; -pub const TCP_CA_CWR: tcp_ca_state = 2; -pub const TCP_CA_Recovery: tcp_ca_state = 3; -pub const TCP_CA_Loss: tcp_ca_state = 4; - -pub const TCP_NO_QUEUE: ::c_uint = 0; -pub const TCP_RECV_QUEUE: ::c_uint = 1; -pub const TCP_SEND_QUEUE: ::c_uint = 2; -pub const TCP_QUEUES_NR: ::c_uint = 3; - -pub const P_ALL: idtype_t = 0; -pub const P_PID: idtype_t = 1; -pub const P_PGID: idtype_t = 2; - -pub const SS_ONSTACK: ::c_int = 1; -pub const SS_DISABLE: ::c_int = 4; - -pub const SHUT_RD: ::c_int = 0; -pub const SHUT_WR: ::c_int = 1; -pub const SHUT_RDWR: ::c_int = 2; -pub const PTHREAD_MUTEX_INITIALIZER: pthread_mutex_t = pthread_mutex_t { - __lock: 0, - __owner_id: 0, - __cnt: 0, - __shpid: 0, - __type: PTHREAD_MUTEX_TIMED as ::c_int, - __flags: 0, - __reserved1: 0, - __reserved2: 0, -}; -pub const PTHREAD_COND_INITIALIZER: pthread_cond_t = pthread_cond_t { - __lock: __PTHREAD_SPIN_LOCK_INITIALIZER, - __queue: 0i64 as *mut __pthread, - __attr: 0i64 as *mut __pthread_condattr, - __wrefs: 0, - __data: 0i64 as *mut ::c_void, -}; -pub const PTHREAD_RWLOCK_INITIALIZER: pthread_rwlock_t = pthread_rwlock_t { - __held: __PTHREAD_SPIN_LOCK_INITIALIZER, - __lock: __PTHREAD_SPIN_LOCK_INITIALIZER, - __readers: 0, - __readerqueue: 0i64 as *mut __pthread, - __writerqueue: 0i64 as *mut __pthread, - __attr: 0i64 as *mut __pthread_rwlockattr, - __data: 0i64 as *mut ::c_void, -}; -pub const PTHREAD_STACK_MIN: ::size_t = 0; - -// functions -f! { - pub fn major(dev: ::dev_t) -> ::c_uint { - ((dev >> 8) & 0xff) as ::c_uint - } - - pub fn minor(dev: ::dev_t) -> ::c_uint { - (dev & 0xffff00ff) as ::c_uint - } - - pub fn FD_CLR(fd: ::c_int, set: *mut fd_set) -> () { - let fd = fd as usize; - let size = ::mem::size_of_val(&(*set).fds_bits[0]) * 8; - (*set).fds_bits[fd / size] &= !(1 << (fd % size)); - return - } - - pub fn FD_ISSET(fd: ::c_int, set: *const fd_set) -> bool { - let fd = fd as usize; - let size = ::mem::size_of_val(&(*set).fds_bits[0]) * 8; - return ((*set).fds_bits[fd / size] & (1 << (fd % size))) != 0 - } - - pub fn FD_SET(fd: ::c_int, set: *mut fd_set) -> () { - let fd = fd as usize; - let size = ::mem::size_of_val(&(*set).fds_bits[0]) * 8; - (*set).fds_bits[fd / size] |= 1 << (fd % size); - return - } - - pub fn FD_ZERO(set: *mut fd_set) -> () { - for slot in (*set).fds_bits.iter_mut() { - *slot = 0; - } - } -} - -extern "C" { - pub fn lutimes(file: *const ::c_char, times: *const ::timeval) -> ::c_int; - - pub fn futimes(fd: ::c_int, times: *const ::timeval) -> ::c_int; - pub fn futimens(__fd: ::c_int, __times: *const ::timespec) -> ::c_int; - - pub fn utimensat( - dirfd: ::c_int, - path: *const ::c_char, - times: *const ::timespec, - flag: ::c_int, - ) -> ::c_int; - - pub fn mkfifoat(__fd: ::c_int, __path: *const ::c_char, __mode: __mode_t) -> ::c_int; - - pub fn mknodat( - dirfd: ::c_int, - pathname: *const ::c_char, - mode: ::mode_t, - dev: dev_t, - ) -> ::c_int; - - pub fn __libc_current_sigrtmin() -> ::c_int; - - pub fn __libc_current_sigrtmax() -> ::c_int; - - pub fn waitid(idtype: idtype_t, id: id_t, infop: *mut ::siginfo_t, options: ::c_int) - -> ::c_int; - - pub fn sigwait(__set: *const sigset_t, __sig: *mut ::c_int) -> ::c_int; - - pub fn sigaltstack(ss: *const stack_t, oss: *mut stack_t) -> ::c_int; - - pub fn ioctl(__fd: ::c_int, __request: ::c_ulong, ...) -> ::c_int; - - pub fn pipe2(fds: *mut ::c_int, flags: ::c_int) -> ::c_int; - - pub fn dup3(oldfd: ::c_int, newfd: ::c_int, flags: ::c_int) -> ::c_int; - - pub fn pread64(fd: ::c_int, buf: *mut ::c_void, count: ::size_t, offset: off64_t) -> ::ssize_t; - pub fn pwrite64( - fd: ::c_int, - buf: *const ::c_void, - count: ::size_t, - offset: off64_t, - ) -> ::ssize_t; - - pub fn readv(__fd: ::c_int, __iovec: *const ::iovec, __count: ::c_int) -> ::ssize_t; - pub fn writev(__fd: ::c_int, __iovec: *const ::iovec, __count: ::c_int) -> ::ssize_t; - - pub fn preadv( - __fd: ::c_int, - __iovec: *const ::iovec, - __count: ::c_int, - __offset: __off_t, - ) -> ssize_t; - pub fn pwritev( - __fd: ::c_int, - __iovec: *const ::iovec, - __count: ::c_int, - __offset: __off_t, - ) -> ssize_t; - - pub fn preadv64( - fd: ::c_int, - iov: *const ::iovec, - iovcnt: ::c_int, - offset: ::off64_t, - ) -> ::ssize_t; - pub fn pwritev64( - fd: ::c_int, - iov: *const ::iovec, - iovcnt: ::c_int, - offset: ::off64_t, - ) -> ::ssize_t; - - pub fn lseek64(__fd: ::c_int, __offset: __off64_t, __whence: ::c_int) -> __off64_t; - - pub fn lseek(__fd: ::c_int, __offset: __off_t, __whence: ::c_int) -> __off_t; - - pub fn bind(__fd: ::c_int, __addr: *const sockaddr, __len: socklen_t) -> ::c_int; - - pub fn accept4( - fd: ::c_int, - addr: *mut ::sockaddr, - len: *mut ::socklen_t, - flg: ::c_int, - ) -> ::c_int; - - pub fn recvmsg(__fd: ::c_int, __message: *mut msghdr, __flags: ::c_int) -> ::ssize_t; - - pub fn sendmsg(__fd: ::c_int, __message: *const msghdr, __flags: ::c_int) -> ssize_t; - - pub fn recvfrom( - socket: ::c_int, - buf: *mut ::c_void, - len: ::size_t, - flags: ::c_int, - addr: *mut ::sockaddr, - addrlen: *mut ::socklen_t, - ) -> ::ssize_t; - - pub fn shutdown(__fd: ::c_int, __how: ::c_int) -> ::c_int; - - pub fn sethostname(name: *const ::c_char, len: ::size_t) -> ::c_int; - - pub fn uname(buf: *mut ::utsname) -> ::c_int; - - pub fn getpwuid_r( - uid: ::uid_t, - pwd: *mut passwd, - buf: *mut ::c_char, - buflen: ::size_t, - result: *mut *mut passwd, - ) -> ::c_int; - - pub fn setgroups(ngroups: ::size_t, ptr: *const ::gid_t) -> ::c_int; - - pub fn pthread_create( - native: *mut ::pthread_t, - attr: *const ::pthread_attr_t, - f: extern "C" fn(*mut ::c_void) -> *mut ::c_void, - value: *mut ::c_void, - ) -> ::c_int; - pub fn pthread_kill(__threadid: pthread_t, __signo: ::c_int) -> ::c_int; - pub fn __pthread_equal(__t1: __pthread_t, __t2: __pthread_t) -> ::c_int; - - pub fn pthread_getattr_np(__thr: pthread_t, __attr: *mut pthread_attr_t) -> ::c_int; - - pub fn pthread_attr_getguardsize( - __attr: *const pthread_attr_t, - __guardsize: *mut ::size_t, - ) -> ::c_int; - - pub fn pthread_attr_getstack( - __attr: *const pthread_attr_t, - __stackaddr: *mut *mut ::c_void, - __stacksize: *mut ::size_t, - ) -> ::c_int; - - pub fn pthread_condattr_setclock( - __attr: *mut pthread_condattr_t, - __clock_id: __clockid_t, - ) -> ::c_int; - - pub fn pthread_atfork( - prepare: ::Option, - parent: ::Option, - child: ::Option, - ) -> ::c_int; - - pub fn pthread_sigmask( - __how: ::c_int, - __newmask: *const __sigset_t, - __oldmask: *mut __sigset_t, - ) -> ::c_int; - - pub fn clock_getres(__clock_id: clockid_t, __res: *mut ::timespec) -> ::c_int; - pub fn clock_gettime(__clock_id: clockid_t, __tp: *mut ::timespec) -> ::c_int; - pub fn clock_settime(__clock_id: clockid_t, __tp: *const ::timespec) -> ::c_int; - - pub fn fstat(__fd: ::c_int, __buf: *mut stat) -> ::c_int; - pub fn fstat64(__fd: ::c_int, __buf: *mut stat64) -> ::c_int; - - pub fn fstatat( - __fd: ::c_int, - __file: *const ::c_char, - __buf: *mut stat, - __flag: ::c_int, - ) -> ::c_int; - pub fn fstatat64( - __fd: ::c_int, - __file: *const ::c_char, - __buf: *mut stat64, - __flag: ::c_int, - ) -> ::c_int; - - pub fn ftruncate(__fd: ::c_int, __length: __off_t) -> ::c_int; - pub fn ftruncate64(__fd: ::c_int, __length: __off64_t) -> ::c_int; - pub fn truncate64(__file: *const ::c_char, __length: __off64_t) -> ::c_int; - - pub fn lstat(__file: *const ::c_char, __buf: *mut stat) -> ::c_int; - pub fn lstat64(__file: *const ::c_char, __buf: *mut stat64) -> ::c_int; - - pub fn statfs(path: *const ::c_char, buf: *mut statfs) -> ::c_int; - pub fn statfs64(__file: *const ::c_char, __buf: *mut statfs64) -> ::c_int; - pub fn fstatfs(fd: ::c_int, buf: *mut statfs) -> ::c_int; - pub fn fstatfs64(__fildes: ::c_int, __buf: *mut statfs64) -> ::c_int; - - pub fn statvfs(__file: *const ::c_char, __buf: *mut statvfs) -> ::c_int; - pub fn statvfs64(__file: *const ::c_char, __buf: *mut statvfs64) -> ::c_int; - pub fn fstatvfs(__fildes: ::c_int, __buf: *mut statvfs) -> ::c_int; - pub fn fstatvfs64(__fildes: ::c_int, __buf: *mut statvfs64) -> ::c_int; - - pub fn open(__file: *const ::c_char, __oflag: ::c_int, ...) -> ::c_int; - pub fn open64(__file: *const ::c_char, __oflag: ::c_int, ...) -> ::c_int; - - pub fn openat(__fd: ::c_int, __file: *const ::c_char, __oflag: ::c_int, ...) -> ::c_int; - pub fn openat64(__fd: ::c_int, __file: *const ::c_char, __oflag: ::c_int, ...) -> ::c_int; - - pub fn faccessat( - dirfd: ::c_int, - pathname: *const ::c_char, - mode: ::c_int, - flags: ::c_int, - ) -> ::c_int; - - pub fn stat(__file: *const ::c_char, __buf: *mut stat) -> ::c_int; - pub fn stat64(__file: *const ::c_char, __buf: *mut stat64) -> ::c_int; - - pub fn readdir(dirp: *mut ::DIR) -> *mut ::dirent; - pub fn readdir64(dirp: *mut ::DIR) -> *mut ::dirent64; - pub fn readdir_r(dirp: *mut ::DIR, entry: *mut ::dirent, result: *mut *mut ::dirent) - -> ::c_int; - - pub fn dirfd(dirp: *mut ::DIR) -> ::c_int; - - #[link_name = "__xpg_strerror_r"] - pub fn strerror_r(__errnum: ::c_int, __buf: *mut ::c_char, __buflen: ::size_t) -> ::c_int; - - pub fn __errno_location() -> *mut ::c_int; - - pub fn mmap64( - __addr: *mut ::c_void, - __len: size_t, - __prot: ::c_int, - __flags: ::c_int, - __fd: ::c_int, - __offset: __off64_t, - ) -> *mut ::c_void; - - pub fn mprotect(__addr: *mut ::c_void, __len: ::size_t, __prot: ::c_int) -> ::c_int; - - pub fn msync(__addr: *mut ::c_void, __len: ::size_t, __flags: ::c_int) -> ::c_int; - pub fn sync(); - pub fn syncfs(fd: ::c_int) -> ::c_int; - pub fn fdatasync(fd: ::c_int) -> ::c_int; - - pub fn fallocate64(fd: ::c_int, mode: ::c_int, offset: ::off64_t, len: ::off64_t) -> ::c_int; - pub fn posix_fallocate(fd: ::c_int, offset: ::off_t, len: ::off_t) -> ::c_int; - pub fn posix_fallocate64(fd: ::c_int, offset: ::off64_t, len: ::off64_t) -> ::c_int; - - pub fn posix_fadvise(fd: ::c_int, offset: ::off_t, len: ::off_t, advise: ::c_int) -> ::c_int; - - pub fn posix_fadvise64( - fd: ::c_int, - offset: ::off64_t, - len: ::off64_t, - advise: ::c_int, - ) -> ::c_int; - - pub fn madvise(__addr: *mut ::c_void, __len: ::size_t, __advice: ::c_int) -> ::c_int; - - pub fn getrlimit(resource: ::__rlimit_resource, rlim: *mut ::rlimit) -> ::c_int; - pub fn getrlimit64(resource: ::__rlimit_resource, rlim: *mut ::rlimit64) -> ::c_int; - pub fn setrlimit(resource: ::__rlimit_resource, rlim: *const ::rlimit) -> ::c_int; - pub fn setrlimit64(resource: ::__rlimit_resource, rlim: *const ::rlimit64) -> ::c_int; - - pub fn getpriority(which: ::__priority_which, who: ::id_t) -> ::c_int; - pub fn setpriority(which: ::__priority_which, who: ::id_t, prio: ::c_int) -> ::c_int; - - pub fn getrandom(__buffer: *mut ::c_void, __length: ::size_t, __flags: ::c_uint) -> ::ssize_t; - pub fn getentropy(__buffer: *mut ::c_void, __length: ::size_t) -> ::c_int; - - pub fn backtrace(buf: *mut *mut ::c_void, sz: ::c_int) -> ::c_int; - pub fn dl_iterate_phdr( - callback: ::Option< - unsafe extern "C" fn( - info: *mut ::dl_phdr_info, - size: ::size_t, - data: *mut ::c_void, - ) -> ::c_int, - >, - data: *mut ::c_void, - ) -> ::c_int; -} - -safe_f! { - pub {const} fn makedev(major: ::c_uint, minor: ::c_uint) -> ::dev_t { - let major = major as ::dev_t; - let minor = minor as ::dev_t; - let mut dev = 0; - dev |= major << 8; - dev |= minor; - dev - } - - pub fn SIGRTMAX() -> ::c_int { - unsafe { __libc_current_sigrtmax() } - } - - pub fn SIGRTMIN() -> ::c_int { - unsafe { __libc_current_sigrtmin() } - } - - pub {const} fn WIFSTOPPED(status: ::c_int) -> bool { - (status & 0xff) == 0x7f - } - - pub {const} fn WSTOPSIG(status: ::c_int) -> ::c_int { - (status >> 8) & 0xff - } - - pub {const} fn WIFCONTINUED(status: ::c_int) -> bool { - status == 0xffff - } - - pub {const} fn WIFSIGNALED(status: ::c_int) -> bool { - ((status & 0x7f) + 1) as i8 >= 2 - } - - pub {const} fn WTERMSIG(status: ::c_int) -> ::c_int { - status & 0x7f - } - - pub {const} fn WIFEXITED(status: ::c_int) -> bool { - (status & 0x7f) == 0 - } - - pub {const} fn WEXITSTATUS(status: ::c_int) -> ::c_int { - (status >> 8) & 0xff - } - - pub {const} fn WCOREDUMP(status: ::c_int) -> bool { - (status & 0x80) != 0 - } - - pub {const} fn W_EXITCODE(ret: ::c_int, sig: ::c_int) -> ::c_int { - (ret << 8) | sig - } - - pub {const} fn W_STOPCODE(sig: ::c_int) -> ::c_int { - (sig << 8) | 0x7f - } - - pub {const} fn QCMD(cmd: ::c_int, type_: ::c_int) -> ::c_int { - (cmd << 8) | (type_ & 0x00ff) - } - - pub {const} fn IPOPT_COPIED(o: u8) -> u8 { - o & IPOPT_COPY - } - - pub {const} fn IPOPT_CLASS(o: u8) -> u8 { - o & IPOPT_CLASS_MASK - } - - pub {const} fn IPOPT_NUMBER(o: u8) -> u8 { - o & IPOPT_NUMBER_MASK - } - - pub {const} fn IPTOS_ECN(x: u8) -> u8 { - x & ::IPTOS_ECN_MASK - } -} - -cfg_if! { - if #[cfg(libc_align)] { - mod align; - pub use self::align::*; - } else { - mod no_align; - pub use self::no_align::*; - } -} - -cfg_if! { - if #[cfg(target_pointer_width = "64")] { - mod b64; - pub use self::b64::*; - } else { - mod b32; - pub use self::b32::*; - } -} diff -Nru temporalio-1.3.0/vendor/libc/src/unix/hurd/no_align.rs temporalio-1.3.0/vendor/libc/src/unix/hurd/no_align.rs --- temporalio-1.3.0/vendor/libc/src/unix/hurd/no_align.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/libc/src/unix/hurd/no_align.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -// Placeholder file diff -Nru temporalio-1.3.0/vendor/libc/src/unix/linux_like/android/b64/aarch64/mod.rs temporalio-1.3.0/vendor/libc/src/unix/linux_like/android/b64/aarch64/mod.rs --- temporalio-1.3.0/vendor/libc/src/unix/linux_like/android/b64/aarch64/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/libc/src/unix/linux_like/android/b64/aarch64/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -412,9 +412,6 @@ pub const SYS_fspick: ::c_long = 433; pub const SYS_syscalls: ::c_long = 436; -pub const PROT_BTI: ::c_int = 0x10; -pub const PROT_MTE: ::c_int = 0x20; - cfg_if! { if #[cfg(libc_align)] { mod align; diff -Nru temporalio-1.3.0/vendor/libc/src/unix/linux_like/android/mod.rs temporalio-1.3.0/vendor/libc/src/unix/linux_like/android/mod.rs --- temporalio-1.3.0/vendor/libc/src/unix/linux_like/android/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/libc/src/unix/linux_like/android/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -350,11 +350,6 @@ pub args: [::__u64; 6], } - pub struct seccomp_metadata { - pub filter_off: ::__u64, - pub flags: ::__u64, - } - pub struct ptrace_peeksiginfo_args { pub off: ::__u64, pub flags: ::__u32, @@ -1224,9 +1219,6 @@ pub const PTHREAD_MUTEX_ERRORCHECK: ::c_int = 2; pub const PTHREAD_MUTEX_DEFAULT: ::c_int = PTHREAD_MUTEX_NORMAL; -pub const PTHREAD_EXPLICIT_SCHED: ::c_int = 0; -pub const PTHREAD_INHERIT_SCHED: ::c_int = 1; - // stdio.h pub const RENAME_NOREPLACE: ::c_int = 1; pub const RENAME_EXCHANGE: ::c_int = 2; @@ -1530,7 +1522,6 @@ pub const PTRACE_SETSIGINFO: ::c_int = 0x4203; pub const PTRACE_GETREGSET: ::c_int = 0x4204; pub const PTRACE_SETREGSET: ::c_int = 0x4205; -pub const PTRACE_SECCOMP_GET_METADATA: ::c_int = 0x420d; pub const PTRACE_EVENT_STOP: ::c_int = 128; @@ -1562,7 +1553,6 @@ pub const RLIMIT_NICE: ::c_int = 13; pub const RLIMIT_RTPRIO: ::c_int = 14; -#[deprecated(since = "0.2.64", note = "Not stable across OS versions")] pub const RLIM_NLIMITS: ::c_int = 16; pub const RLIM_INFINITY: ::rlim_t = !0; @@ -2591,88 +2581,6 @@ /* see rust-lang/libc#924 pub const ETH_P_MAP: ::c_int = 0x00F9;*/ // end android/platform/bionic/libc/kernel/uapi/linux/if_ether.h -// start android/platform/bionic/libc/kernel/uapi/linux/neighbour.h -pub const NDA_UNSPEC: ::c_ushort = 0; -pub const NDA_DST: ::c_ushort = 1; -pub const NDA_LLADDR: ::c_ushort = 2; -pub const NDA_CACHEINFO: ::c_ushort = 3; -pub const NDA_PROBES: ::c_ushort = 4; -pub const NDA_VLAN: ::c_ushort = 5; -pub const NDA_PORT: ::c_ushort = 6; -pub const NDA_VNI: ::c_ushort = 7; -pub const NDA_IFINDEX: ::c_ushort = 8; -pub const NDA_MASTER: ::c_ushort = 9; -pub const NDA_LINK_NETNSID: ::c_ushort = 10; -pub const NDA_SRC_VNI: ::c_ushort = 11; -pub const NDA_PROTOCOL: ::c_ushort = 12; -pub const NDA_NH_ID: ::c_ushort = 13; -pub const NDA_FDB_EXT_ATTRS: ::c_ushort = 14; -pub const NDA_FLAGS_EXT: ::c_ushort = 15; -pub const NDA_NDM_STATE_MASK: ::c_ushort = 16; -pub const NDA_NDM_FLAGS_MASK: ::c_ushort = 17; - -pub const NTF_USE: u8 = 0x01; -pub const NTF_SELF: u8 = 0x02; -pub const NTF_MASTER: u8 = 0x04; -pub const NTF_PROXY: u8 = 0x08; -pub const NTF_EXT_LEARNED: u8 = 0x10; -pub const NTF_OFFLOADED: u8 = 0x20; -pub const NTF_STICKY: u8 = 0x40; -pub const NTF_ROUTER: u8 = 0x80; - -pub const NTF_EXT_MANAGED: u8 = 0x01; -pub const NTF_EXT_LOCKED: u8 = 0x02; - -pub const NUD_NONE: u16 = 0x00; -pub const NUD_INCOMPLETE: u16 = 0x01; -pub const NUD_REACHABLE: u16 = 0x02; -pub const NUD_STALE: u16 = 0x04; -pub const NUD_DELAY: u16 = 0x08; -pub const NUD_PROBE: u16 = 0x10; -pub const NUD_FAILED: u16 = 0x20; -pub const NUD_NOARP: u16 = 0x40; -pub const NUD_PERMANENT: u16 = 0x80; - -pub const NDTPA_UNSPEC: ::c_ushort = 0; -pub const NDTPA_IFINDEX: ::c_ushort = 1; -pub const NDTPA_REFCNT: ::c_ushort = 2; -pub const NDTPA_REACHABLE_TIME: ::c_ushort = 3; -pub const NDTPA_BASE_REACHABLE_TIME: ::c_ushort = 4; -pub const NDTPA_RETRANS_TIME: ::c_ushort = 5; -pub const NDTPA_GC_STALETIME: ::c_ushort = 6; -pub const NDTPA_DELAY_PROBE_TIME: ::c_ushort = 7; -pub const NDTPA_QUEUE_LEN: ::c_ushort = 8; -pub const NDTPA_APP_PROBES: ::c_ushort = 9; -pub const NDTPA_UCAST_PROBES: ::c_ushort = 10; -pub const NDTPA_MCAST_PROBES: ::c_ushort = 11; -pub const NDTPA_ANYCAST_DELAY: ::c_ushort = 12; -pub const NDTPA_PROXY_DELAY: ::c_ushort = 13; -pub const NDTPA_PROXY_QLEN: ::c_ushort = 14; -pub const NDTPA_LOCKTIME: ::c_ushort = 15; -pub const NDTPA_QUEUE_LENBYTES: ::c_ushort = 16; -pub const NDTPA_MCAST_REPROBES: ::c_ushort = 17; -pub const NDTPA_PAD: ::c_ushort = 18; -pub const NDTPA_INTERVAL_PROBE_TIME_MS: ::c_ushort = 19; - -pub const NDTA_UNSPEC: ::c_ushort = 0; -pub const NDTA_NAME: ::c_ushort = 1; -pub const NDTA_THRESH1: ::c_ushort = 2; -pub const NDTA_THRESH2: ::c_ushort = 3; -pub const NDTA_THRESH3: ::c_ushort = 4; -pub const NDTA_CONFIG: ::c_ushort = 5; -pub const NDTA_PARMS: ::c_ushort = 6; -pub const NDTA_STATS: ::c_ushort = 7; -pub const NDTA_GC_INTERVAL: ::c_ushort = 8; -pub const NDTA_PAD: ::c_ushort = 9; - -pub const FDB_NOTIFY_BIT: u16 = 0x01; -pub const FDB_NOTIFY_INACTIVE_BIT: u16 = 0x02; - -pub const NFEA_UNSPEC: ::c_ushort = 0; -pub const NFEA_ACTIVITY_NOTIFY: ::c_ushort = 1; -pub const NFEA_DONT_REFRESH: ::c_ushort = 2; -// end android/platform/bionic/libc/kernel/uapi/linux/neighbour.h - pub const SIOCADDRT: ::c_ulong = 0x0000890B; pub const SIOCDELRT: ::c_ulong = 0x0000890C; pub const SIOCGIFNAME: ::c_ulong = 0x00008910; @@ -3010,19 +2918,6 @@ pub const IFLA_NEW_IFINDEX: ::c_ushort = 49; pub const IFLA_MIN_MTU: ::c_ushort = 50; pub const IFLA_MAX_MTU: ::c_ushort = 51; -pub const IFLA_PROP_LIST: ::c_ushort = 52; -pub const IFLA_ALT_IFNAME: ::c_ushort = 53; -pub const IFLA_PERM_ADDRESS: ::c_ushort = 54; -pub const IFLA_PROTO_DOWN_REASON: ::c_ushort = 55; -pub const IFLA_PARENT_DEV_NAME: ::c_ushort = 56; -pub const IFLA_PARENT_DEV_BUS_NAME: ::c_ushort = 57; -pub const IFLA_GRO_MAX_SIZE: ::c_ushort = 58; -pub const IFLA_TSO_MAX_SIZE: ::c_ushort = 59; -pub const IFLA_TSO_MAX_SEGS: ::c_ushort = 60; -pub const IFLA_ALLMULTI: ::c_ushort = 61; -pub const IFLA_DEVLINK_PORT: ::c_ushort = 62; -pub const IFLA_GSO_IPV4_MAX_SIZE: ::c_ushort = 63; -pub const IFLA_GRO_IPV4_MAX_SIZE: ::c_ushort = 64; pub const IFLA_INFO_UNSPEC: ::c_ushort = 0; pub const IFLA_INFO_KIND: ::c_ushort = 1; @@ -3498,12 +3393,6 @@ attr: *const ::pthread_attr_t, guardsize: *mut ::size_t, ) -> ::c_int; - pub fn pthread_attr_setguardsize(attr: *mut ::pthread_attr_t, guardsize: ::size_t) -> ::c_int; - pub fn pthread_attr_getinheritsched( - attr: *const ::pthread_attr_t, - flag: *mut ::c_int, - ) -> ::c_int; - pub fn pthread_attr_setinheritsched(attr: *mut ::pthread_attr_t, flag: ::c_int) -> ::c_int; pub fn sethostname(name: *const ::c_char, len: ::size_t) -> ::c_int; pub fn sched_get_priority_min(policy: ::c_int) -> ::c_int; pub fn pthread_condattr_getpshared( diff -Nru temporalio-1.3.0/vendor/libc/src/unix/linux_like/emscripten/lfs64.rs temporalio-1.3.0/vendor/libc/src/unix/linux_like/emscripten/lfs64.rs --- temporalio-1.3.0/vendor/libc/src/unix/linux_like/emscripten/lfs64.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/libc/src/unix/linux_like/emscripten/lfs64.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,213 +0,0 @@ -// In-sync with ../linux/musl/lfs64.rs except for fallocate64, prlimit64 and sendfile64 - -#[inline] -pub unsafe extern "C" fn creat64(path: *const ::c_char, mode: ::mode_t) -> ::c_int { - ::creat(path, mode) -} - -#[inline] -pub unsafe extern "C" fn fgetpos64(stream: *mut ::FILE, pos: *mut ::fpos64_t) -> ::c_int { - ::fgetpos(stream, pos as *mut _) -} - -#[inline] -pub unsafe extern "C" fn fopen64(pathname: *const ::c_char, mode: *const ::c_char) -> *mut ::FILE { - ::fopen(pathname, mode) -} - -#[inline] -pub unsafe extern "C" fn freopen64( - pathname: *const ::c_char, - mode: *const ::c_char, - stream: *mut ::FILE, -) -> *mut ::FILE { - ::freopen(pathname, mode, stream) -} - -#[inline] -pub unsafe extern "C" fn fseeko64( - stream: *mut ::FILE, - offset: ::off64_t, - whence: ::c_int, -) -> ::c_int { - ::fseeko(stream, offset, whence) -} - -#[inline] -pub unsafe extern "C" fn fsetpos64(stream: *mut ::FILE, pos: *const ::fpos64_t) -> ::c_int { - ::fsetpos(stream, pos as *mut _) -} - -#[inline] -pub unsafe extern "C" fn fstat64(fildes: ::c_int, buf: *mut ::stat64) -> ::c_int { - ::fstat(fildes, buf as *mut _) -} - -#[inline] -pub unsafe extern "C" fn fstatat64( - fd: ::c_int, - path: *const ::c_char, - buf: *mut ::stat64, - flag: ::c_int, -) -> ::c_int { - ::fstatat(fd, path, buf as *mut _, flag) -} - -#[inline] -pub unsafe extern "C" fn fstatfs64(fd: ::c_int, buf: *mut ::statfs64) -> ::c_int { - ::fstatfs(fd, buf as *mut _) -} - -#[inline] -pub unsafe extern "C" fn fstatvfs64(fd: ::c_int, buf: *mut ::statvfs64) -> ::c_int { - ::fstatvfs(fd, buf as *mut _) -} - -#[inline] -pub unsafe extern "C" fn ftello64(stream: *mut ::FILE) -> ::off64_t { - ::ftello(stream) -} - -#[inline] -pub unsafe extern "C" fn ftruncate64(fd: ::c_int, length: ::off64_t) -> ::c_int { - ::ftruncate(fd, length) -} - -#[inline] -pub unsafe extern "C" fn getrlimit64(resource: ::c_int, rlim: *mut ::rlimit64) -> ::c_int { - ::getrlimit(resource, rlim as *mut _) -} - -#[inline] -pub unsafe extern "C" fn lseek64(fd: ::c_int, offset: ::off64_t, whence: ::c_int) -> ::off64_t { - ::lseek(fd, offset, whence) -} - -#[inline] -pub unsafe extern "C" fn lstat64(path: *const ::c_char, buf: *mut ::stat64) -> ::c_int { - ::lstat(path, buf as *mut _) -} - -#[inline] -pub unsafe extern "C" fn mmap64( - addr: *mut ::c_void, - length: ::size_t, - prot: ::c_int, - flags: ::c_int, - fd: ::c_int, - offset: ::off64_t, -) -> *mut ::c_void { - ::mmap(addr, length, prot, flags, fd, offset) -} - -// These functions are variadic in the C ABI since the `mode` argument is "optional". Variadic -// `extern "C"` functions are unstable in Rust so we cannot write a shim function for these -// entrypoints. See https://github.com/rust-lang/rust/issues/44930. -// -// These aliases are mostly fine though, neither function takes a LFS64-namespaced type as an -// argument, nor do their names clash with any declared types. -pub use open as open64; -pub use openat as openat64; - -#[inline] -pub unsafe extern "C" fn posix_fadvise64( - fd: ::c_int, - offset: ::off64_t, - len: ::off64_t, - advice: ::c_int, -) -> ::c_int { - ::posix_fadvise(fd, offset, len, advice) -} - -#[inline] -pub unsafe extern "C" fn posix_fallocate64( - fd: ::c_int, - offset: ::off64_t, - len: ::off64_t, -) -> ::c_int { - ::posix_fallocate(fd, offset, len) -} - -#[inline] -pub unsafe extern "C" fn pread64( - fd: ::c_int, - buf: *mut ::c_void, - count: ::size_t, - offset: ::off64_t, -) -> ::ssize_t { - ::pread(fd, buf, count, offset) -} - -#[inline] -pub unsafe extern "C" fn preadv64( - fd: ::c_int, - iov: *const ::iovec, - iovcnt: ::c_int, - offset: ::off64_t, -) -> ::ssize_t { - ::preadv(fd, iov, iovcnt, offset) -} - -#[inline] -pub unsafe extern "C" fn pwrite64( - fd: ::c_int, - buf: *const ::c_void, - count: ::size_t, - offset: ::off64_t, -) -> ::ssize_t { - ::pwrite(fd, buf, count, offset) -} - -#[inline] -pub unsafe extern "C" fn pwritev64( - fd: ::c_int, - iov: *const ::iovec, - iovcnt: ::c_int, - offset: ::off64_t, -) -> ::ssize_t { - ::pwritev(fd, iov, iovcnt, offset) -} - -#[inline] -pub unsafe extern "C" fn readdir64(dirp: *mut ::DIR) -> *mut ::dirent64 { - ::readdir(dirp) as *mut _ -} - -#[inline] -pub unsafe extern "C" fn readdir64_r( - dirp: *mut ::DIR, - entry: *mut ::dirent64, - result: *mut *mut ::dirent64, -) -> ::c_int { - ::readdir_r(dirp, entry as *mut _, result as *mut _) -} - -#[inline] -pub unsafe extern "C" fn setrlimit64(resource: ::c_int, rlim: *const ::rlimit64) -> ::c_int { - ::setrlimit(resource, rlim as *mut _) -} - -#[inline] -pub unsafe extern "C" fn stat64(pathname: *const ::c_char, statbuf: *mut ::stat64) -> ::c_int { - ::stat(pathname, statbuf as *mut _) -} - -#[inline] -pub unsafe extern "C" fn statfs64(pathname: *const ::c_char, buf: *mut ::statfs64) -> ::c_int { - ::statfs(pathname, buf as *mut _) -} - -#[inline] -pub unsafe extern "C" fn statvfs64(path: *const ::c_char, buf: *mut ::statvfs64) -> ::c_int { - ::statvfs(path, buf as *mut _) -} - -#[inline] -pub unsafe extern "C" fn tmpfile64() -> *mut ::FILE { - ::tmpfile() -} - -#[inline] -pub unsafe extern "C" fn truncate64(path: *const ::c_char, length: ::off64_t) -> ::c_int { - ::truncate(path, length) -} diff -Nru temporalio-1.3.0/vendor/libc/src/unix/linux_like/emscripten/mod.rs temporalio-1.3.0/vendor/libc/src/unix/linux_like/emscripten/mod.rs --- temporalio-1.3.0/vendor/libc/src/unix/linux_like/emscripten/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/libc/src/unix/linux_like/emscripten/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -5,6 +5,10 @@ pub type socklen_t = u32; pub type pthread_t = c_ulong; pub type mode_t = u32; +pub type ino64_t = u64; +pub type off64_t = i64; +pub type blkcnt64_t = i32; +pub type rlim64_t = u64; pub type shmatt_t = ::c_ulong; pub type mqd_t = ::c_int; pub type msgqnum_t = ::c_ulong; @@ -25,23 +29,11 @@ pub type blksize_t = c_long; pub type fsblkcnt_t = u32; pub type fsfilcnt_t = u32; -pub type rlim_t = u64; +pub type rlim_t = ::c_ulonglong; pub type c_long = i32; pub type c_ulong = u32; pub type nlink_t = u32; -pub type ino64_t = ::ino_t; -pub type off64_t = ::off_t; -pub type blkcnt64_t = ::blkcnt_t; -pub type rlim64_t = ::rlim_t; - -pub type rlimit64 = ::rlimit; -pub type flock64 = ::flock; -pub type stat64 = ::stat; -pub type statfs64 = ::statfs; -pub type statvfs64 = ::statvfs; -pub type dirent64 = ::dirent; - #[cfg_attr(feature = "extra_traits", derive(Debug))] pub enum fpos64_t {} // FIXME: fill this out with a struct impl ::Copy for fpos64_t {} @@ -52,6 +44,11 @@ } s! { + pub struct rlimit64 { + pub rlim_cur: rlim64_t, + pub rlim_max: rlim64_t, + } + pub struct glob_t { pub gl_pathc: ::size_t, pub gl_pathv: *mut *mut c_char, @@ -226,6 +223,14 @@ pub l_pid: ::pid_t, } + pub struct flock64 { + pub l_type: ::c_short, + pub l_whence: ::c_short, + pub l_start: ::off64_t, + pub l_len: ::off64_t, + pub l_pid: ::pid_t, + } + pub struct pthread_attr_t { __size: [u32; 11] } @@ -255,16 +260,35 @@ } pub struct stat { pub st_dev: ::dev_t, - #[cfg(not(emscripten_new_stat_abi))] __st_dev_padding: ::c_int, - #[cfg(not(emscripten_new_stat_abi))] __st_ino_truncated: ::c_long, pub st_mode: ::mode_t, pub st_nlink: ::nlink_t, pub st_uid: ::uid_t, pub st_gid: ::gid_t, pub st_rdev: ::dev_t, - #[cfg(not(emscripten_new_stat_abi))] + __st_rdev_padding: ::c_int, + pub st_size: ::off_t, + pub st_blksize: ::blksize_t, + pub st_blocks: ::blkcnt_t, + pub st_atime: ::time_t, + pub st_atime_nsec: ::c_long, + pub st_mtime: ::time_t, + pub st_mtime_nsec: ::c_long, + pub st_ctime: ::time_t, + pub st_ctime_nsec: ::c_long, + pub st_ino: ::ino_t, + } + + pub struct stat64 { + pub st_dev: ::dev_t, + __st_dev_padding: ::c_int, + __st_ino_truncated: ::c_long, + pub st_mode: ::mode_t, + pub st_nlink: ::nlink_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, __st_rdev_padding: ::c_int, pub st_size: ::off_t, pub st_blksize: ::blksize_t, @@ -340,6 +364,37 @@ _align: [usize; 0], } + pub struct statfs64 { + pub f_type: ::c_ulong, + pub f_bsize: ::c_ulong, + pub f_blocks: ::fsblkcnt_t, + pub f_bfree: ::fsblkcnt_t, + pub f_bavail: ::fsblkcnt_t, + pub f_files: ::fsfilcnt_t, + pub f_ffree: ::fsfilcnt_t, + pub f_fsid: ::fsid_t, + pub f_namelen: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_flags: ::c_ulong, + pub f_spare: [::c_ulong; 4], + } + + pub struct statvfs64 { + pub f_bsize: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_blocks: u32, + pub f_bfree: u32, + pub f_bavail: u32, + pub f_files: u32, + pub f_ffree: u32, + pub f_favail: u32, + pub f_fsid: ::c_ulong, + __f_unused: ::c_int, + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + __f_spare: [::c_int; 6], + } + pub struct arpd_request { pub req: ::c_ushort, pub ip: u32, @@ -359,6 +414,14 @@ pub d_name: [::c_char; 256], } + pub struct dirent64 { + pub d_ino: ::ino64_t, + pub d_off: ::off64_t, + pub d_reclen: ::c_ushort, + pub d_type: ::c_uchar, + pub d_name: [::c_char; 256], + } + pub struct sysinfo { pub uptime: ::c_ulong, pub loads: [::c_ulong; 3], @@ -422,6 +485,41 @@ } } + impl PartialEq for dirent64 { + fn eq(&self, other: &dirent64) -> bool { + self.d_ino == other.d_ino + && self.d_off == other.d_off + && self.d_reclen == other.d_reclen + && self.d_type == other.d_type + && self + .d_name + .iter() + .zip(other.d_name.iter()) + .all(|(a,b)| a == b) + } + } + impl Eq for dirent64 {} + impl ::fmt::Debug for dirent64 { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("dirent64") + .field("d_ino", &self.d_ino) + .field("d_off", &self.d_off) + .field("d_reclen", &self.d_reclen) + .field("d_type", &self.d_type) + // FIXME: .field("d_name", &self.d_name) + .finish() + } + } + impl ::hash::Hash for dirent64 { + fn hash(&self, state: &mut H) { + self.d_ino.hash(state); + self.d_off.hash(state); + self.d_reclen.hash(state); + self.d_type.hash(state); + self.d_name.hash(state); + } + } + impl PartialEq for sysinfo { fn eq(&self, other: &sysinfo) -> bool { self.uptime == other.uptime @@ -1230,10 +1328,7 @@ pub const POSIX_MADV_DONTNEED: ::c_int = 0; pub const RLIM_INFINITY: ::rlim_t = !0; -#[deprecated(since = "0.2.64", note = "Not stable across OS versions")] pub const RLIMIT_NLIMITS: ::c_int = 15; -#[allow(deprecated)] -#[deprecated(since = "0.2.64", note = "Not stable across OS versions")] pub const RLIM_NLIMITS: ::c_int = RLIMIT_NLIMITS; pub const MAP_ANONYMOUS: ::c_int = MAP_ANON; @@ -1662,6 +1757,8 @@ } extern "C" { + pub fn getrlimit64(resource: ::c_int, rlim: *mut rlimit64) -> ::c_int; + pub fn setrlimit64(resource: ::c_int, rlim: *const rlimit64) -> ::c_int; pub fn getrlimit(resource: ::c_int, rlim: *mut ::rlimit) -> ::c_int; pub fn setrlimit(resource: ::c_int, rlim: *const ::rlimit) -> ::c_int; pub fn strerror_r(errnum: ::c_int, buf: *mut c_char, buflen: ::size_t) -> ::c_int; @@ -1682,6 +1779,17 @@ pub fn mprotect(addr: *mut ::c_void, len: ::size_t, prot: ::c_int) -> ::c_int; pub fn __errno_location() -> *mut ::c_int; + pub fn fopen64(filename: *const c_char, mode: *const c_char) -> *mut ::FILE; + pub fn freopen64( + filename: *const c_char, + mode: *const c_char, + file: *mut ::FILE, + ) -> *mut ::FILE; + pub fn tmpfile64() -> *mut ::FILE; + pub fn fgetpos64(stream: *mut ::FILE, ptr: *mut fpos64_t) -> ::c_int; + pub fn fsetpos64(stream: *mut ::FILE, ptr: *const fpos64_t) -> ::c_int; + pub fn fseeko64(stream: *mut ::FILE, offset: ::off64_t, whence: ::c_int) -> ::c_int; + pub fn ftello64(stream: *mut ::FILE) -> ::off64_t; pub fn posix_fallocate(fd: ::c_int, offset: ::off_t, len: ::off_t) -> ::c_int; pub fn pwritev(fd: ::c_int, iov: *const ::iovec, iovcnt: ::c_int, offset: ::off_t) -> ::ssize_t; @@ -1778,10 +1886,6 @@ pub fn getentropy(buf: *mut ::c_void, buflen: ::size_t) -> ::c_int; } -// Alias to 64 to mimic glibc's LFS64 support -mod lfs64; -pub use self::lfs64::*; - cfg_if! { if #[cfg(libc_align)] { #[macro_use] diff -Nru temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/align.rs temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/align.rs --- temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/align.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/align.rs 2023-10-30 19:40:00.000000000 +0000 @@ -5,7 +5,6 @@ target_arch = "x86_64", target_arch = "powerpc64", target_arch = "mips64", - target_arch = "mips64r6", target_arch = "s390x", target_arch = "sparc64", target_arch = "aarch64", @@ -17,7 +16,6 @@ target_arch = "x86_64", target_arch = "powerpc64", target_arch = "mips64", - target_arch = "mips64r6", target_arch = "s390x", target_arch = "sparc64", target_arch = "aarch64", @@ -85,11 +83,9 @@ #[cfg_attr(all(target_pointer_width = "32", any(target_arch = "mips", - target_arch = "mips32r6", target_arch = "arm", target_arch = "hexagon", target_arch = "m68k", - target_arch = "csky", target_arch = "powerpc", target_arch = "sparc", target_arch = "x86_64", @@ -97,11 +93,9 @@ repr(align(4)))] #[cfg_attr(any(target_pointer_width = "64", not(any(target_arch = "mips", - target_arch = "mips32r6", target_arch = "arm", target_arch = "hexagon", target_arch = "m68k", - target_arch = "csky", target_arch = "powerpc", target_arch = "sparc", target_arch = "x86_64", @@ -114,11 +108,9 @@ #[cfg_attr(all(target_pointer_width = "32", any(target_arch = "mips", - target_arch = "mips32r6", target_arch = "arm", target_arch = "hexagon", target_arch = "m68k", - target_arch = "csky", target_arch = "powerpc", target_arch = "sparc", target_arch = "x86_64", @@ -126,7 +118,6 @@ repr(align(4)))] #[cfg_attr(any(target_pointer_width = "64", not(any(target_arch = "mips", - target_arch = "mips32r6", target_arch = "arm", target_arch = "hexagon", target_arch = "m68k", @@ -141,11 +132,9 @@ #[cfg_attr(all(target_pointer_width = "32", any(target_arch = "mips", - target_arch = "mips32r6", target_arch = "arm", target_arch = "hexagon", target_arch = "m68k", - target_arch = "csky", target_arch = "powerpc", target_arch = "sparc", target_arch = "x86_64", @@ -153,11 +142,9 @@ repr(align(4)))] #[cfg_attr(any(target_pointer_width = "64", not(any(target_arch = "mips", - target_arch = "mips32r6", target_arch = "arm", target_arch = "hexagon", target_arch = "m68k", - target_arch = "csky", target_arch = "powerpc", target_arch = "sparc", target_arch = "x86_64", diff -Nru temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/arch/generic/mod.rs temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/arch/generic/mod.rs --- temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/arch/generic/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/arch/generic/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -95,7 +95,6 @@ if #[cfg(all(any(target_arch = "x86", target_arch = "x86_64", target_arch = "aarch64", - target_arch = "csky", target_arch = "loongarch64"), not(any(target_env = "musl", target_env = "ohos"))))] { pub const SO_TIMESTAMP_NEW: ::c_int = 63; @@ -116,7 +115,6 @@ target_arch = "aarch64", target_arch = "riscv64", target_arch = "s390x", - target_arch = "csky", target_arch = "loongarch64"))] { pub const FICLONE: ::c_ulong = 0x40049409; pub const FICLONERANGE: ::c_ulong = 0x4020940D; @@ -257,8 +255,6 @@ pub const RLIMIT_NICE: ::__rlimit_resource_t = 13; pub const RLIMIT_RTPRIO: ::__rlimit_resource_t = 14; pub const RLIMIT_RTTIME: ::__rlimit_resource_t = 15; - #[allow(deprecated)] - #[deprecated(since = "0.2.64", note = "Not stable across OS versions")] pub const RLIMIT_NLIMITS: ::__rlimit_resource_t = RLIM_NLIMITS; } else if #[cfg(any(target_env = "musl", target_env = "ohos"))] { @@ -279,21 +275,16 @@ pub const RLIMIT_NICE: ::c_int = 13; pub const RLIMIT_RTPRIO: ::c_int = 14; pub const RLIMIT_RTTIME: ::c_int = 15; - #[deprecated(since = "0.2.64", note = "Not stable across OS versions")] pub const RLIM_NLIMITS: ::c_int = 15; - #[allow(deprecated)] - #[deprecated(since = "0.2.64", note = "Not stable across OS versions")] pub const RLIMIT_NLIMITS: ::c_int = RLIM_NLIMITS; } } cfg_if! { if #[cfg(target_env = "gnu")] { - #[deprecated(since = "0.2.64", note = "Not stable across OS versions")] pub const RLIM_NLIMITS: ::__rlimit_resource_t = 16; } else if #[cfg(target_env = "uclibc")] { - #[deprecated(since = "0.2.64", note = "Not stable across OS versions")] pub const RLIM_NLIMITS: ::__rlimit_resource_t = 15; } } diff -Nru temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/arch/mips/mod.rs temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/arch/mips/mod.rs --- temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/arch/mips/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/arch/mips/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -237,8 +237,6 @@ pub const RLIMIT_NICE: ::__rlimit_resource_t = 13; pub const RLIMIT_RTPRIO: ::__rlimit_resource_t = 14; pub const RLIMIT_RTTIME: ::__rlimit_resource_t = 15; - #[allow(deprecated)] - #[deprecated(since = "0.2.64", note = "Not stable across OS versions")] pub const RLIMIT_NLIMITS: ::__rlimit_resource_t = RLIM_NLIMITS; } else if #[cfg(target_env = "musl")] { @@ -259,10 +257,7 @@ pub const RLIMIT_NICE: ::c_int = 13; pub const RLIMIT_RTPRIO: ::c_int = 14; pub const RLIMIT_RTTIME: ::c_int = 15; - #[deprecated(since = "0.2.64", note = "Not stable across OS versions")] pub const RLIM_NLIMITS: ::c_int = 15; - #[allow(deprecated)] - #[deprecated(since = "0.2.64", note = "Not stable across OS versions")] pub const RLIMIT_NLIMITS: ::c_int = RLIM_NLIMITS; pub const RLIM_INFINITY: ::rlim_t = !0; } @@ -270,16 +265,14 @@ cfg_if! { if #[cfg(target_env = "gnu")] { - #[deprecated(since = "0.2.64", note = "Not stable across OS versions")] pub const RLIM_NLIMITS: ::__rlimit_resource_t = 16; } else if #[cfg(target_env = "uclibc")] { - #[deprecated(since = "0.2.64", note = "Not stable across OS versions")] pub const RLIM_NLIMITS: ::__rlimit_resource_t = 15; } } cfg_if! { - if #[cfg(any(target_arch = "mips64", target_arch = "mips64r6"), + if #[cfg(target_arch = "mips64", any(target_env = "gnu", target_env = "uclibc"))] { pub const RLIM_INFINITY: ::rlim_t = !0; @@ -287,7 +280,7 @@ } cfg_if! { - if #[cfg(any(target_arch = "mips", target_arch = "mips32r6"), + if #[cfg(target_arch = "mips", any(target_env = "gnu", target_env = "uclibc"))] { pub const RLIM_INFINITY: ::rlim_t = 0x7fffffff; diff -Nru temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/arch/mod.rs temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/arch/mod.rs --- temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/arch/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/arch/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,8 +1,5 @@ cfg_if! { - if #[cfg(any(target_arch = "mips", - target_arch = "mips32r6", - target_arch = "mips64", - target_arch = "mips64r6"))] { + if #[cfg(any(target_arch = "mips", target_arch = "mips64"))] { mod mips; pub use self::mips::*; } else if #[cfg(any(target_arch = "powerpc", target_arch = "powerpc64"))] { diff -Nru temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/arch/powerpc/mod.rs temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/arch/powerpc/mod.rs --- temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/arch/powerpc/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/arch/powerpc/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -215,10 +215,7 @@ pub const RLIMIT_NICE: ::__rlimit_resource_t = 13; pub const RLIMIT_RTPRIO: ::__rlimit_resource_t = 14; pub const RLIMIT_RTTIME: ::__rlimit_resource_t = 15; - #[deprecated(since = "0.2.64", note = "Not stable across OS versions")] pub const RLIM_NLIMITS: ::__rlimit_resource_t = 16; - #[allow(deprecated)] - #[deprecated(since = "0.2.64", note = "Not stable across OS versions")] pub const RLIMIT_NLIMITS: ::__rlimit_resource_t = RLIM_NLIMITS; } else if #[cfg(target_env = "musl")] { @@ -239,10 +236,7 @@ pub const RLIMIT_NICE: ::c_int = 13; pub const RLIMIT_RTPRIO: ::c_int = 14; pub const RLIMIT_RTTIME: ::c_int = 15; - #[deprecated(since = "0.2.64", note = "Not stable across OS versions")] pub const RLIM_NLIMITS: ::c_int = 15; - #[allow(deprecated)] - #[deprecated(since = "0.2.64", note = "Not stable across OS versions")] pub const RLIMIT_NLIMITS: ::c_int = RLIM_NLIMITS; } } diff -Nru temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/arch/sparc/mod.rs temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/arch/sparc/mod.rs --- temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/arch/sparc/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/arch/sparc/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -216,10 +216,7 @@ pub const RLIMIT_NICE: ::__rlimit_resource_t = 13; pub const RLIMIT_RTPRIO: ::__rlimit_resource_t = 14; pub const RLIMIT_RTTIME: ::__rlimit_resource_t = 15; -#[deprecated(since = "0.2.64", note = "Not stable across OS versions")] pub const RLIM_NLIMITS: ::__rlimit_resource_t = 16; -#[allow(deprecated)] -#[deprecated(since = "0.2.64", note = "Not stable across OS versions")] pub const RLIMIT_NLIMITS: ::__rlimit_resource_t = RLIM_NLIMITS; cfg_if! { diff -Nru temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/gnu/b32/csky/align.rs temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/gnu/b32/csky/align.rs --- temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/gnu/b32/csky/align.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/gnu/b32/csky/align.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ -s_no_extra_traits! { - #[allow(missing_debug_implementations)] - #[repr(align(8))] - pub struct max_align_t { - priv_: [i64; 2] - } -} diff -Nru temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/gnu/b32/csky/mod.rs temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/gnu/b32/csky/mod.rs --- temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/gnu/b32/csky/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/gnu/b32/csky/mod.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,745 +0,0 @@ -pub type c_char = u8; -pub type wchar_t = u32; - -s! { - pub struct sigaction { - pub sa_sigaction: ::sighandler_t, - pub sa_mask: ::sigset_t, - pub sa_flags: ::c_int, - pub sa_restorer: ::Option, - } - - pub struct statfs { - pub f_type: ::__fsword_t, - pub f_bsize: ::__fsword_t, - pub f_blocks: ::fsblkcnt_t, - pub f_bfree: ::fsblkcnt_t, - pub f_bavail: ::fsblkcnt_t, - - pub f_files: ::fsfilcnt_t, - pub f_ffree: ::fsfilcnt_t, - pub f_fsid: ::fsid_t, - - pub f_namelen: ::__fsword_t, - pub f_frsize: ::__fsword_t, - f_spare: [::__fsword_t; 5], - } - - pub struct flock { - pub l_type: ::c_short, - pub l_whence: ::c_short, - pub l_start: ::off_t, - pub l_len: ::off_t, - pub l_pid: ::pid_t, - } - - pub struct flock64 { - pub l_type: ::c_short, - pub l_whence: ::c_short, - pub l_start: ::off64_t, - pub l_len: ::off64_t, - pub l_pid: ::pid_t, - } - - pub struct ipc_perm { - pub __key: ::key_t, - pub uid: ::uid_t, - pub gid: ::gid_t, - pub cuid: ::uid_t, - pub cgid: ::gid_t, - pub mode: ::c_ushort, - __pad1: ::c_ushort, - pub __seq: ::c_ushort, - __pad2: ::c_ushort, - __unused1: ::c_ulong, - __unused2: ::c_ulong - } - - pub struct stat64 { - pub st_dev: ::dev_t, - __pad1: ::c_uint, - __st_ino: ::ino_t, - pub st_mode: ::mode_t, - pub st_nlink: ::nlink_t, - pub st_uid: ::uid_t, - pub st_gid: ::gid_t, - pub st_rdev: ::dev_t, - __pad2: ::c_uint, - pub st_size: ::off64_t, - pub st_blksize: ::blksize_t, - pub st_blocks: ::blkcnt64_t, - pub st_atime: ::time_t, - pub st_atime_nsec: ::c_long, - pub st_mtime: ::time_t, - pub st_mtime_nsec: ::c_long, - pub st_ctime: ::time_t, - pub st_ctime_nsec: ::c_long, - pub st_ino: ::ino64_t, - } - - pub struct statfs64 { - pub f_type: ::__fsword_t, - pub f_bsize: ::__fsword_t, - pub f_blocks: u64, - pub f_bfree: u64, - pub f_bavail: u64, - pub f_files: u64, - pub f_ffree: u64, - pub f_fsid: ::fsid_t, - pub f_namelen: ::__fsword_t, - pub f_frsize: ::__fsword_t, - pub f_flags: ::__fsword_t, - pub f_spare: [::__fsword_t; 4], - } - - pub struct statvfs64 { - pub f_bsize: ::c_ulong, - pub f_frsize: ::c_ulong, - pub f_blocks: u64, - pub f_bfree: u64, - pub f_bavail: u64, - pub f_files: u64, - pub f_ffree: u64, - pub f_favail: u64, - pub f_fsid: ::c_ulong, - __f_unused: ::c_int, - pub f_flag: ::c_ulong, - pub f_namemax: ::c_ulong, - __f_spare: [::c_int; 6], - } - - pub struct shmid_ds { - pub shm_perm: ::ipc_perm, - pub shm_segsz: ::size_t, - pub shm_atime: ::time_t, - __unused1: ::c_ulong, - pub shm_dtime: ::time_t, - __unused2: ::c_ulong, - pub shm_ctime: ::time_t, - __unused3: ::c_ulong, - pub shm_cpid: ::pid_t, - pub shm_lpid: ::pid_t, - pub shm_nattch: ::shmatt_t, - __unused4: ::c_ulong, - __unused5: ::c_ulong - } - - pub struct msqid_ds { - pub msg_perm: ::ipc_perm, - pub msg_stime: ::time_t, - __glibc_reserved1: ::c_ulong, - pub msg_rtime: ::time_t, - __glibc_reserved2: ::c_ulong, - pub msg_ctime: ::time_t, - __glibc_reserved3: ::c_ulong, - __msg_cbytes: ::c_ulong, - pub msg_qnum: ::msgqnum_t, - pub msg_qbytes: ::msglen_t, - pub msg_lspid: ::pid_t, - pub msg_lrpid: ::pid_t, - __glibc_reserved4: ::c_ulong, - __glibc_reserved5: ::c_ulong, - } - - pub struct siginfo_t { - pub si_signo: ::c_int, - pub si_errno: ::c_int, - pub si_code: ::c_int, - #[doc(hidden)] - #[deprecated( - since="0.2.54", - note="Please leave a comment on \ - https://github.com/rust-lang/libc/pull/1316 if you're using \ - this field" - )] - pub _pad: [::c_int; 29], - _align: [usize; 0], - } - - pub struct stack_t { - pub ss_sp: *mut ::c_void, - pub ss_flags: ::c_int, - pub ss_size: ::size_t - } -} - -pub const VEOF: usize = 4; -pub const RTLD_DEEPBIND: ::c_int = 0x8; -pub const RTLD_GLOBAL: ::c_int = 0x100; -pub const RTLD_NOLOAD: ::c_int = 0x4; -pub const O_DIRECT: ::c_int = 0x4000; -pub const O_DIRECTORY: ::c_int = 0x10000; -pub const O_NOFOLLOW: ::c_int = 0x20000; -pub const O_LARGEFILE: ::c_int = 0o100000; -pub const O_APPEND: ::c_int = 1024; -pub const O_CREAT: ::c_int = 64; -pub const O_EXCL: ::c_int = 128; -pub const O_NOCTTY: ::c_int = 256; -pub const O_NONBLOCK: ::c_int = 2048; -pub const O_SYNC: ::c_int = 1052672; -pub const O_RSYNC: ::c_int = 1052672; -pub const O_DSYNC: ::c_int = 4096; -pub const O_FSYNC: ::c_int = 0x101000; -pub const O_ASYNC: ::c_int = 0x2000; -pub const O_NDELAY: ::c_int = 0x800; - -pub const MADV_SOFT_OFFLINE: ::c_int = 101; -pub const MAP_LOCKED: ::c_int = 0x02000; -pub const MAP_NORESERVE: ::c_int = 0x04000; -pub const MAP_ANON: ::c_int = 0x0020; -pub const MAP_ANONYMOUS: ::c_int = 0x0020; -pub const MAP_DENYWRITE: ::c_int = 0x0800; -pub const MAP_EXECUTABLE: ::c_int = 0x01000; -pub const MAP_POPULATE: ::c_int = 0x08000; -pub const MAP_NONBLOCK: ::c_int = 0x010000; -pub const MAP_STACK: ::c_int = 0x020000; -pub const MAP_HUGETLB: ::c_int = 0x040000; -pub const MAP_GROWSDOWN: ::c_int = 0x0100; -pub const MAP_SYNC: ::c_int = 0x080000; - -pub const EDEADLOCK: ::c_int = 35; -pub const EUCLEAN: ::c_int = 117; -pub const ENOTNAM: ::c_int = 118; -pub const ENAVAIL: ::c_int = 119; -pub const EISNAM: ::c_int = 120; -pub const EREMOTEIO: ::c_int = 121; -pub const EDEADLK: ::c_int = 35; -pub const ENAMETOOLONG: ::c_int = 36; -pub const ENOLCK: ::c_int = 37; -pub const ENOSYS: ::c_int = 38; -pub const ENOTEMPTY: ::c_int = 39; -pub const ELOOP: ::c_int = 40; -pub const ENOMSG: ::c_int = 42; -pub const EIDRM: ::c_int = 43; -pub const ECHRNG: ::c_int = 44; -pub const EL2NSYNC: ::c_int = 45; -pub const EL3HLT: ::c_int = 46; -pub const EL3RST: ::c_int = 47; -pub const ELNRNG: ::c_int = 48; -pub const EUNATCH: ::c_int = 49; -pub const ENOCSI: ::c_int = 50; -pub const EL2HLT: ::c_int = 51; -pub const EBADE: ::c_int = 52; -pub const EBADR: ::c_int = 53; -pub const EXFULL: ::c_int = 54; -pub const ENOANO: ::c_int = 55; -pub const EBADRQC: ::c_int = 56; -pub const EBADSLT: ::c_int = 57; -pub const EMULTIHOP: ::c_int = 72; -pub const EOVERFLOW: ::c_int = 75; -pub const ENOTUNIQ: ::c_int = 76; -pub const EBADFD: ::c_int = 77; -pub const EBADMSG: ::c_int = 74; -pub const EREMCHG: ::c_int = 78; -pub const ELIBACC: ::c_int = 79; -pub const ELIBBAD: ::c_int = 80; -pub const ELIBSCN: ::c_int = 81; -pub const ELIBMAX: ::c_int = 82; -pub const ELIBEXEC: ::c_int = 83; -pub const EILSEQ: ::c_int = 84; -pub const ERESTART: ::c_int = 85; -pub const ESTRPIPE: ::c_int = 86; -pub const EUSERS: ::c_int = 87; -pub const ENOTSOCK: ::c_int = 88; -pub const EDESTADDRREQ: ::c_int = 89; -pub const EMSGSIZE: ::c_int = 90; -pub const EPROTOTYPE: ::c_int = 91; -pub const ENOPROTOOPT: ::c_int = 92; -pub const EPROTONOSUPPORT: ::c_int = 93; -pub const ESOCKTNOSUPPORT: ::c_int = 94; -pub const EOPNOTSUPP: ::c_int = 95; -pub const EPFNOSUPPORT: ::c_int = 96; -pub const EAFNOSUPPORT: ::c_int = 97; -pub const EADDRINUSE: ::c_int = 98; -pub const EADDRNOTAVAIL: ::c_int = 99; -pub const ENETDOWN: ::c_int = 100; -pub const ENETUNREACH: ::c_int = 101; -pub const ENETRESET: ::c_int = 102; -pub const ECONNABORTED: ::c_int = 103; -pub const ECONNRESET: ::c_int = 104; -pub const ENOBUFS: ::c_int = 105; -pub const EISCONN: ::c_int = 106; -pub const ENOTCONN: ::c_int = 107; -pub const ESHUTDOWN: ::c_int = 108; -pub const ETOOMANYREFS: ::c_int = 109; -pub const ETIMEDOUT: ::c_int = 110; -pub const ECONNREFUSED: ::c_int = 111; -pub const EHOSTDOWN: ::c_int = 112; -pub const EHOSTUNREACH: ::c_int = 113; -pub const EALREADY: ::c_int = 114; -pub const EINPROGRESS: ::c_int = 115; -pub const ESTALE: ::c_int = 116; -pub const EDQUOT: ::c_int = 122; -pub const ENOMEDIUM: ::c_int = 123; -pub const EMEDIUMTYPE: ::c_int = 124; -pub const ECANCELED: ::c_int = 125; -pub const ENOKEY: ::c_int = 126; -pub const EKEYEXPIRED: ::c_int = 127; -pub const EKEYREVOKED: ::c_int = 128; -pub const EKEYREJECTED: ::c_int = 129; -pub const EOWNERDEAD: ::c_int = 130; -pub const ENOTRECOVERABLE: ::c_int = 131; -pub const EHWPOISON: ::c_int = 133; -pub const ERFKILL: ::c_int = 132; - -pub const SA_SIGINFO: ::c_int = 0x00000004; -pub const SA_NOCLDWAIT: ::c_int = 0x00000002; - -pub const SOCK_STREAM: ::c_int = 1; -pub const SOCK_DGRAM: ::c_int = 2; - -pub const MCL_CURRENT: ::c_int = 0x0001; -pub const MCL_FUTURE: ::c_int = 0x0002; - -pub const POLLWRNORM: ::c_short = 0x100; -pub const POLLWRBAND: ::c_short = 0x200; - -pub const F_GETLK: ::c_int = 5; -pub const F_GETOWN: ::c_int = 9; -pub const F_SETOWN: ::c_int = 8; - -pub const EFD_NONBLOCK: ::c_int = 0x800; -pub const SFD_NONBLOCK: ::c_int = 0x0800; - -pub const SIGCHLD: ::c_int = 17; -pub const SIGBUS: ::c_int = 7; -pub const SIGUSR1: ::c_int = 10; -pub const SIGUSR2: ::c_int = 12; -pub const SIGCONT: ::c_int = 18; -pub const SIGSTOP: ::c_int = 19; -pub const SIGTSTP: ::c_int = 20; -pub const SIGURG: ::c_int = 23; -pub const SIGIO: ::c_int = 29; -pub const SIGSYS: ::c_int = 31; -pub const SIGSTKFLT: ::c_int = 16; -#[deprecated(since = "0.2.55", note = "Use SIGSYS instead")] -pub const SIGUNUSED: ::c_int = 31; -pub const SIGPOLL: ::c_int = 29; -pub const SIGPWR: ::c_int = 30; -pub const SIG_SETMASK: ::c_int = 2; -pub const SIG_BLOCK: ::c_int = 0x000000; -pub const SIG_UNBLOCK: ::c_int = 0x01; -pub const SIGTTIN: ::c_int = 21; -pub const SIGTTOU: ::c_int = 22; -pub const SIGXCPU: ::c_int = 24; -pub const SIGXFSZ: ::c_int = 25; -pub const SIGVTALRM: ::c_int = 26; -pub const SIGPROF: ::c_int = 27; -pub const SIGWINCH: ::c_int = 28; -pub const SIGSTKSZ: ::size_t = 8192; -pub const MINSIGSTKSZ: ::size_t = 2048; -pub const CBAUD: ::tcflag_t = 0o0010017; -pub const TAB1: ::tcflag_t = 0x00000800; -pub const TAB2: ::tcflag_t = 0x00001000; -pub const TAB3: ::tcflag_t = 0x00001800; -pub const CR1: ::tcflag_t = 0x00000200; -pub const CR2: ::tcflag_t = 0x00000400; -pub const CR3: ::tcflag_t = 0x00000600; -pub const FF1: ::tcflag_t = 0x00008000; -pub const BS1: ::tcflag_t = 0x00002000; -pub const VT1: ::tcflag_t = 0x00004000; -pub const VWERASE: usize = 14; -pub const VREPRINT: usize = 12; -pub const VSUSP: usize = 10; -pub const VSTART: usize = 8; -pub const VSTOP: usize = 9; -pub const VDISCARD: usize = 13; -pub const VTIME: usize = 5; -pub const IXON: ::tcflag_t = 0x00000400; -pub const IXOFF: ::tcflag_t = 0x00001000; -pub const ONLCR: ::tcflag_t = 0x4; -pub const CSIZE: ::tcflag_t = 0x00000030; -pub const CS6: ::tcflag_t = 0x00000010; -pub const CS7: ::tcflag_t = 0x00000020; -pub const CS8: ::tcflag_t = 0x00000030; -pub const CSTOPB: ::tcflag_t = 0x00000040; -pub const CREAD: ::tcflag_t = 0x00000080; -pub const PARENB: ::tcflag_t = 0x00000100; -pub const PARODD: ::tcflag_t = 0x00000200; -pub const HUPCL: ::tcflag_t = 0x00000400; -pub const CLOCAL: ::tcflag_t = 0x00000800; -pub const ECHOKE: ::tcflag_t = 0x00000800; -pub const ECHOE: ::tcflag_t = 0x00000010; -pub const ECHOK: ::tcflag_t = 0x00000020; -pub const ECHONL: ::tcflag_t = 0x00000040; -pub const ECHOPRT: ::tcflag_t = 0x00000400; -pub const ECHOCTL: ::tcflag_t = 0x00000200; -pub const ISIG: ::tcflag_t = 0x00000001; -pub const ICANON: ::tcflag_t = 0x00000002; -pub const PENDIN: ::tcflag_t = 0x00004000; -pub const NOFLSH: ::tcflag_t = 0x00000080; -pub const CIBAUD: ::tcflag_t = 0o02003600000; -pub const CBAUDEX: ::tcflag_t = 0o010000; -pub const VSWTC: usize = 7; -pub const OLCUC: ::tcflag_t = 0o000002; -pub const NLDLY: ::tcflag_t = 0o000400; -pub const CRDLY: ::tcflag_t = 0o003000; -pub const TABDLY: ::tcflag_t = 0o014000; -pub const BSDLY: ::tcflag_t = 0o020000; -pub const FFDLY: ::tcflag_t = 0o100000; -pub const VTDLY: ::tcflag_t = 0o040000; -pub const XTABS: ::tcflag_t = 0o014000; - -pub const B0: ::speed_t = 0o000000; -pub const B50: ::speed_t = 0o000001; -pub const B75: ::speed_t = 0o000002; -pub const B110: ::speed_t = 0o000003; -pub const B134: ::speed_t = 0o000004; -pub const B150: ::speed_t = 0o000005; -pub const B200: ::speed_t = 0o000006; -pub const B300: ::speed_t = 0o000007; -pub const B600: ::speed_t = 0o000010; -pub const B1200: ::speed_t = 0o000011; -pub const B1800: ::speed_t = 0o000012; -pub const B2400: ::speed_t = 0o000013; -pub const B4800: ::speed_t = 0o000014; -pub const B9600: ::speed_t = 0o000015; -pub const B19200: ::speed_t = 0o000016; -pub const B38400: ::speed_t = 0o000017; -pub const EXTA: ::speed_t = B19200; -pub const EXTB: ::speed_t = B38400; -pub const B57600: ::speed_t = 0o010001; -pub const B115200: ::speed_t = 0o010002; -pub const B230400: ::speed_t = 0o010003; -pub const B460800: ::speed_t = 0o010004; -pub const B500000: ::speed_t = 0o010005; -pub const B576000: ::speed_t = 0o010006; -pub const B921600: ::speed_t = 0o010007; -pub const B1000000: ::speed_t = 0o010010; -pub const B1152000: ::speed_t = 0o010011; -pub const B1500000: ::speed_t = 0o010012; -pub const B2000000: ::speed_t = 0o010013; -pub const B2500000: ::speed_t = 0o010014; -pub const B3000000: ::speed_t = 0o010015; -pub const B3500000: ::speed_t = 0o010016; -pub const B4000000: ::speed_t = 0o010017; - -pub const SECCOMP_SET_MODE_STRICT: ::c_uint = 0; -pub const SECCOMP_SET_MODE_FILTER: ::c_uint = 1; -pub const SECCOMP_GET_ACTION_AVAIL: ::c_uint = 2; -pub const SECCOMP_GET_NOTIF_SIZES: ::c_uint = 3; - -pub const VEOL: usize = 11; -pub const VEOL2: usize = 16; -pub const VMIN: usize = 6; -pub const IEXTEN: ::tcflag_t = 0x00008000; -pub const TOSTOP: ::tcflag_t = 0x00000100; -pub const FLUSHO: ::tcflag_t = 0x00001000; -pub const EXTPROC: ::tcflag_t = 0x00010000; - -pub const TCSANOW: ::c_int = 0; -pub const TCSADRAIN: ::c_int = 1; -pub const TCSAFLUSH: ::c_int = 2; - -// Syscall table -pub const SYS_read: ::c_long = 63; -pub const SYS_write: ::c_long = 64; -pub const SYS_close: ::c_long = 57; -pub const SYS_fstat: ::c_long = 80; -pub const SYS_lseek: ::c_long = 62; -pub const SYS_mmap: ::c_long = 222; -pub const SYS_mprotect: ::c_long = 226; -pub const SYS_munmap: ::c_long = 215; -pub const SYS_brk: ::c_long = 214; -pub const SYS_rt_sigaction: ::c_long = 134; -pub const SYS_rt_sigprocmask: ::c_long = 135; -pub const SYS_rt_sigreturn: ::c_long = 139; -pub const SYS_ioctl: ::c_long = 29; -pub const SYS_pread64: ::c_long = 67; -pub const SYS_pwrite64: ::c_long = 68; -pub const SYS_readv: ::c_long = 65; -pub const SYS_writev: ::c_long = 66; -pub const SYS_sched_yield: ::c_long = 124; -pub const SYS_mremap: ::c_long = 216; -pub const SYS_msync: ::c_long = 227; -pub const SYS_mincore: ::c_long = 232; -pub const SYS_madvise: ::c_long = 233; -pub const SYS_shmget: ::c_long = 194; -pub const SYS_shmat: ::c_long = 196; -pub const SYS_shmctl: ::c_long = 195; -pub const SYS_dup: ::c_long = 23; -pub const SYS_nanosleep: ::c_long = 101; -pub const SYS_getitimer: ::c_long = 102; -pub const SYS_setitimer: ::c_long = 103; -pub const SYS_getpid: ::c_long = 172; -pub const SYS_sendfile: ::c_long = 71; -pub const SYS_socket: ::c_long = 198; -pub const SYS_connect: ::c_long = 203; -pub const SYS_accept: ::c_long = 202; -pub const SYS_sendto: ::c_long = 206; -pub const SYS_recvfrom: ::c_long = 207; -pub const SYS_sendmsg: ::c_long = 211; -pub const SYS_recvmsg: ::c_long = 212; -pub const SYS_shutdown: ::c_long = 210; -pub const SYS_bind: ::c_long = 200; -pub const SYS_listen: ::c_long = 201; -pub const SYS_getsockname: ::c_long = 204; -pub const SYS_getpeername: ::c_long = 205; -pub const SYS_socketpair: ::c_long = 199; -pub const SYS_setsockopt: ::c_long = 208; -pub const SYS_getsockopt: ::c_long = 209; -pub const SYS_clone: ::c_long = 220; -pub const SYS_execve: ::c_long = 221; -pub const SYS_exit: ::c_long = 93; -pub const SYS_wait4: ::c_long = 260; -pub const SYS_kill: ::c_long = 129; -pub const SYS_uname: ::c_long = 160; -pub const SYS_semget: ::c_long = 190; -pub const SYS_semop: ::c_long = 193; -pub const SYS_semctl: ::c_long = 191; -pub const SYS_shmdt: ::c_long = 197; -pub const SYS_msgget: ::c_long = 186; -pub const SYS_msgsnd: ::c_long = 189; -pub const SYS_msgrcv: ::c_long = 188; -pub const SYS_msgctl: ::c_long = 187; -pub const SYS_fcntl: ::c_long = 25; -pub const SYS_flock: ::c_long = 32; -pub const SYS_fsync: ::c_long = 82; -pub const SYS_fdatasync: ::c_long = 83; -pub const SYS_truncate: ::c_long = 45; -pub const SYS_ftruncate: ::c_long = 46; -pub const SYS_getcwd: ::c_long = 17; -pub const SYS_chdir: ::c_long = 49; -pub const SYS_fchdir: ::c_long = 50; -pub const SYS_fchmod: ::c_long = 52; -pub const SYS_fchown: ::c_long = 55; -pub const SYS_umask: ::c_long = 166; -pub const SYS_gettimeofday: ::c_long = 169; -pub const SYS_getrlimit: ::c_long = 163; -pub const SYS_getrusage: ::c_long = 165; -pub const SYS_sysinfo: ::c_long = 179; -pub const SYS_times: ::c_long = 153; -pub const SYS_ptrace: ::c_long = 117; -pub const SYS_getuid: ::c_long = 174; -pub const SYS_syslog: ::c_long = 116; -pub const SYS_getgid: ::c_long = 176; -pub const SYS_setuid: ::c_long = 146; -pub const SYS_setgid: ::c_long = 144; -pub const SYS_geteuid: ::c_long = 175; -pub const SYS_getegid: ::c_long = 177; -pub const SYS_setpgid: ::c_long = 154; -pub const SYS_getppid: ::c_long = 173; -pub const SYS_setsid: ::c_long = 157; -pub const SYS_setreuid: ::c_long = 145; -pub const SYS_setregid: ::c_long = 143; -pub const SYS_getgroups: ::c_long = 158; -pub const SYS_setgroups: ::c_long = 159; -pub const SYS_setresuid: ::c_long = 147; -pub const SYS_getresuid: ::c_long = 148; -pub const SYS_setresgid: ::c_long = 149; -pub const SYS_getresgid: ::c_long = 150; -pub const SYS_getpgid: ::c_long = 155; -pub const SYS_setfsuid: ::c_long = 151; -pub const SYS_setfsgid: ::c_long = 152; -pub const SYS_getsid: ::c_long = 156; -pub const SYS_capget: ::c_long = 90; -pub const SYS_capset: ::c_long = 91; -pub const SYS_rt_sigpending: ::c_long = 136; -pub const SYS_rt_sigtimedwait: ::c_long = 137; -pub const SYS_rt_sigqueueinfo: ::c_long = 138; -pub const SYS_rt_sigsuspend: ::c_long = 133; -pub const SYS_sigaltstack: ::c_long = 132; -pub const SYS_personality: ::c_long = 92; -pub const SYS_statfs: ::c_long = 43; -pub const SYS_fstatfs: ::c_long = 44; -pub const SYS_getpriority: ::c_long = 141; -pub const SYS_setpriority: ::c_long = 140; -pub const SYS_sched_setparam: ::c_long = 118; -pub const SYS_sched_getparam: ::c_long = 121; -pub const SYS_sched_setscheduler: ::c_long = 119; -pub const SYS_sched_getscheduler: ::c_long = 120; -pub const SYS_sched_get_priority_max: ::c_long = 125; -pub const SYS_sched_get_priority_min: ::c_long = 126; -pub const SYS_sched_rr_get_interval: ::c_long = 127; -pub const SYS_mlock: ::c_long = 228; -pub const SYS_munlock: ::c_long = 229; -pub const SYS_mlockall: ::c_long = 230; -pub const SYS_munlockall: ::c_long = 231; -pub const SYS_vhangup: ::c_long = 58; -pub const SYS_pivot_root: ::c_long = 41; -pub const SYS_prctl: ::c_long = 167; -pub const SYS_adjtimex: ::c_long = 171; -pub const SYS_setrlimit: ::c_long = 164; -pub const SYS_chroot: ::c_long = 51; -pub const SYS_sync: ::c_long = 81; -pub const SYS_acct: ::c_long = 89; -pub const SYS_settimeofday: ::c_long = 170; -pub const SYS_mount: ::c_long = 40; -pub const SYS_umount2: ::c_long = 39; -pub const SYS_swapon: ::c_long = 224; -pub const SYS_swapoff: ::c_long = 225; -pub const SYS_reboot: ::c_long = 142; -pub const SYS_sethostname: ::c_long = 161; -pub const SYS_setdomainname: ::c_long = 162; -pub const SYS_init_module: ::c_long = 105; -pub const SYS_delete_module: ::c_long = 106; -pub const SYS_quotactl: ::c_long = 60; -pub const SYS_nfsservctl: ::c_long = 42; -pub const SYS_gettid: ::c_long = 178; -pub const SYS_readahead: ::c_long = 213; -pub const SYS_setxattr: ::c_long = 5; -pub const SYS_lsetxattr: ::c_long = 6; -pub const SYS_fsetxattr: ::c_long = 7; -pub const SYS_getxattr: ::c_long = 8; -pub const SYS_lgetxattr: ::c_long = 9; -pub const SYS_fgetxattr: ::c_long = 10; -pub const SYS_listxattr: ::c_long = 11; -pub const SYS_llistxattr: ::c_long = 12; -pub const SYS_flistxattr: ::c_long = 13; -pub const SYS_removexattr: ::c_long = 14; -pub const SYS_lremovexattr: ::c_long = 15; -pub const SYS_fremovexattr: ::c_long = 16; -pub const SYS_tkill: ::c_long = 130; -pub const SYS_futex: ::c_long = 98; -pub const SYS_sched_setaffinity: ::c_long = 122; -pub const SYS_sched_getaffinity: ::c_long = 123; -pub const SYS_io_setup: ::c_long = 0; -pub const SYS_io_destroy: ::c_long = 1; -pub const SYS_io_getevents: ::c_long = 4; -pub const SYS_io_submit: ::c_long = 2; -pub const SYS_io_cancel: ::c_long = 3; -pub const SYS_lookup_dcookie: ::c_long = 18; -pub const SYS_remap_file_pages: ::c_long = 234; -pub const SYS_getdents64: ::c_long = 61; -pub const SYS_set_tid_address: ::c_long = 96; -pub const SYS_restart_syscall: ::c_long = 128; -pub const SYS_semtimedop: ::c_long = 192; -pub const SYS_fadvise64: ::c_long = 223; -pub const SYS_timer_create: ::c_long = 107; -pub const SYS_timer_settime: ::c_long = 110; -pub const SYS_timer_gettime: ::c_long = 108; -pub const SYS_timer_getoverrun: ::c_long = 109; -pub const SYS_timer_delete: ::c_long = 111; -pub const SYS_clock_settime: ::c_long = 112; -pub const SYS_clock_gettime: ::c_long = 113; -pub const SYS_clock_getres: ::c_long = 114; -pub const SYS_clock_nanosleep: ::c_long = 115; -pub const SYS_exit_group: ::c_long = 94; -pub const SYS_epoll_ctl: ::c_long = 21; -pub const SYS_tgkill: ::c_long = 131; -pub const SYS_mbind: ::c_long = 235; -pub const SYS_set_mempolicy: ::c_long = 237; -pub const SYS_get_mempolicy: ::c_long = 236; -pub const SYS_mq_open: ::c_long = 180; -pub const SYS_mq_unlink: ::c_long = 181; -pub const SYS_mq_timedsend: ::c_long = 182; -pub const SYS_mq_timedreceive: ::c_long = 183; -pub const SYS_mq_notify: ::c_long = 184; -pub const SYS_mq_getsetattr: ::c_long = 185; -pub const SYS_kexec_load: ::c_long = 104; -pub const SYS_waitid: ::c_long = 95; -pub const SYS_add_key: ::c_long = 217; -pub const SYS_request_key: ::c_long = 218; -pub const SYS_keyctl: ::c_long = 219; -pub const SYS_ioprio_set: ::c_long = 30; -pub const SYS_ioprio_get: ::c_long = 31; -pub const SYS_inotify_add_watch: ::c_long = 27; -pub const SYS_inotify_rm_watch: ::c_long = 28; -pub const SYS_migrate_pages: ::c_long = 238; -pub const SYS_openat: ::c_long = 56; -pub const SYS_mkdirat: ::c_long = 34; -pub const SYS_mknodat: ::c_long = 33; -pub const SYS_fchownat: ::c_long = 54; -pub const SYS_newfstatat: ::c_long = 79; -pub const SYS_unlinkat: ::c_long = 35; -pub const SYS_linkat: ::c_long = 37; -pub const SYS_symlinkat: ::c_long = 36; -pub const SYS_readlinkat: ::c_long = 78; -pub const SYS_fchmodat: ::c_long = 53; -pub const SYS_faccessat: ::c_long = 48; -pub const SYS_pselect6: ::c_long = 72; -pub const SYS_ppoll: ::c_long = 73; -pub const SYS_unshare: ::c_long = 97; -pub const SYS_set_robust_list: ::c_long = 99; -pub const SYS_get_robust_list: ::c_long = 100; -pub const SYS_splice: ::c_long = 76; -pub const SYS_tee: ::c_long = 77; -pub const SYS_sync_file_range: ::c_long = 84; -pub const SYS_vmsplice: ::c_long = 75; -pub const SYS_move_pages: ::c_long = 239; -pub const SYS_utimensat: ::c_long = 88; -pub const SYS_epoll_pwait: ::c_long = 22; -pub const SYS_timerfd_create: ::c_long = 85; -pub const SYS_fallocate: ::c_long = 47; -pub const SYS_timerfd_settime: ::c_long = 86; -pub const SYS_timerfd_gettime: ::c_long = 87; -pub const SYS_accept4: ::c_long = 242; -pub const SYS_signalfd4: ::c_long = 74; -pub const SYS_eventfd2: ::c_long = 19; -pub const SYS_epoll_create1: ::c_long = 20; -pub const SYS_dup3: ::c_long = 24; -pub const SYS_pipe2: ::c_long = 59; -pub const SYS_inotify_init1: ::c_long = 26; -pub const SYS_preadv: ::c_long = 69; -pub const SYS_pwritev: ::c_long = 70; -pub const SYS_rt_tgsigqueueinfo: ::c_long = 240; -pub const SYS_perf_event_open: ::c_long = 241; -pub const SYS_recvmmsg: ::c_long = 243; -pub const SYS_fanotify_init: ::c_long = 262; -pub const SYS_fanotify_mark: ::c_long = 263; -pub const SYS_prlimit64: ::c_long = 261; -pub const SYS_name_to_handle_at: ::c_long = 264; -pub const SYS_open_by_handle_at: ::c_long = 265; -pub const SYS_clock_adjtime: ::c_long = 266; -pub const SYS_syncfs: ::c_long = 267; -pub const SYS_sendmmsg: ::c_long = 269; -pub const SYS_setns: ::c_long = 268; -pub const SYS_getcpu: ::c_long = 168; -pub const SYS_process_vm_readv: ::c_long = 270; -pub const SYS_process_vm_writev: ::c_long = 271; -pub const SYS_kcmp: ::c_long = 272; -pub const SYS_finit_module: ::c_long = 273; -pub const SYS_sched_setattr: ::c_long = 274; -pub const SYS_sched_getattr: ::c_long = 275; -pub const SYS_renameat2: ::c_long = 276; -pub const SYS_seccomp: ::c_long = 277; -pub const SYS_getrandom: ::c_long = 278; -pub const SYS_memfd_create: ::c_long = 279; -pub const SYS_bpf: ::c_long = 280; -pub const SYS_execveat: ::c_long = 281; -pub const SYS_userfaultfd: ::c_long = 282; -pub const SYS_membarrier: ::c_long = 283; -pub const SYS_mlock2: ::c_long = 284; -pub const SYS_copy_file_range: ::c_long = 285; -pub const SYS_preadv2: ::c_long = 286; -pub const SYS_pwritev2: ::c_long = 287; -pub const SYS_pkey_mprotect: ::c_long = 288; -pub const SYS_pkey_alloc: ::c_long = 289; -pub const SYS_pkey_free: ::c_long = 290; -pub const SYS_statx: ::c_long = 291; -pub const SYS_rseq: ::c_long = 293; -pub const SYS_syscall: ::c_long = 294; -pub const SYS_pidfd_send_signal: ::c_long = 424; -pub const SYS_io_uring_setup: ::c_long = 425; -pub const SYS_io_uring_enter: ::c_long = 426; -pub const SYS_io_uring_register: ::c_long = 427; -pub const SYS_open_tree: ::c_long = 428; -pub const SYS_move_mount: ::c_long = 429; -pub const SYS_fsopen: ::c_long = 430; -pub const SYS_fsconfig: ::c_long = 431; -pub const SYS_fsmount: ::c_long = 432; -pub const SYS_fspick: ::c_long = 433; -pub const SYS_pidfd_open: ::c_long = 434; -pub const SYS_clone3: ::c_long = 435; -pub const SYS_close_range: ::c_long = 436; -pub const SYS_openat2: ::c_long = 437; -pub const SYS_pidfd_getfd: ::c_long = 438; -pub const SYS_faccessat2: ::c_long = 439; -pub const SYS_process_madvise: ::c_long = 440; -pub const SYS_epoll_pwait2: ::c_long = 441; -pub const SYS_mount_setattr: ::c_long = 442; -pub const SYS_quotactl_fd: ::c_long = 443; -pub const SYS_landlock_create_ruleset: ::c_long = 444; -pub const SYS_landlock_add_rule: ::c_long = 445; -pub const SYS_landlock_restrict_self: ::c_long = 446; -pub const SYS_memfd_secret: ::c_long = 447; -pub const SYS_process_mrelease: ::c_long = 448; -pub const SYS_futex_waitv: ::c_long = 449; -pub const SYS_set_mempolicy_home_node: ::c_long = 450; - -cfg_if! { - if #[cfg(libc_align)] { - mod align; - pub use self::align::*; - } -} diff -Nru temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/gnu/b32/mod.rs temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/gnu/b32/mod.rs --- temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/gnu/b32/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/gnu/b32/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -43,34 +43,34 @@ s! { pub struct stat { - #[cfg(not(any(target_arch = "mips", target_arch = "mips32r6")))] + #[cfg(not(target_arch = "mips"))] pub st_dev: ::dev_t, - #[cfg(any(target_arch = "mips", target_arch = "mips32r6"))] + #[cfg(target_arch = "mips")] pub st_dev: ::c_ulong, - #[cfg(not(any(target_arch = "mips", target_arch = "mips32r6")))] + #[cfg(not(target_arch = "mips"))] __pad1: ::c_short, - #[cfg(any(target_arch = "mips", target_arch = "mips32r6"))] + #[cfg(target_arch = "mips")] st_pad1: [::c_long; 3], pub st_ino: ::ino_t, pub st_mode: ::mode_t, pub st_nlink: ::nlink_t, pub st_uid: ::uid_t, pub st_gid: ::gid_t, - #[cfg(not(any(target_arch = "mips", target_arch = "mips32r6")))] + #[cfg(not(target_arch = "mips"))] pub st_rdev: ::dev_t, - #[cfg(any(target_arch = "mips", target_arch = "mips32r6"))] + #[cfg(target_arch = "mips")] pub st_rdev: ::c_ulong, - #[cfg(not(any(target_arch = "mips", target_arch = "mips32r6")))] + #[cfg(not(target_arch = "mips"))] __pad2: ::c_short, - #[cfg(any(target_arch = "mips", target_arch = "mips32r6"))] + #[cfg(target_arch = "mips")] st_pad2: [::c_long; 2], pub st_size: ::off_t, - #[cfg(any(target_arch = "mips", target_arch = "mips32r6"))] + #[cfg(target_arch = "mips")] st_pad3: ::c_long, - #[cfg(not(any(target_arch = "mips", target_arch = "mips32r6")))] + #[cfg(not(target_arch = "mips"))] pub st_blksize: ::blksize_t, - #[cfg(not(any(target_arch = "mips", target_arch = "mips32r6")))] + #[cfg(not(target_arch = "mips"))] pub st_blocks: ::blkcnt_t, pub st_atime: ::time_t, pub st_atime_nsec: ::c_long, @@ -78,15 +78,15 @@ pub st_mtime_nsec: ::c_long, pub st_ctime: ::time_t, pub st_ctime_nsec: ::c_long, - #[cfg(not(any(target_arch = "mips", target_arch = "mips32r6")))] + #[cfg(not(target_arch = "mips"))] __unused4: ::c_long, - #[cfg(not(any(target_arch = "mips", target_arch = "mips32r6")))] + #[cfg(not(target_arch = "mips"))] __unused5: ::c_long, - #[cfg(any(target_arch = "mips", target_arch = "mips32r6"))] + #[cfg(target_arch = "mips")] pub st_blksize: ::blksize_t, - #[cfg(any(target_arch = "mips", target_arch = "mips32r6"))] + #[cfg(target_arch = "mips")] pub st_blocks: ::blkcnt_t, - #[cfg(any(target_arch = "mips", target_arch = "mips32r6"))] + #[cfg(target_arch = "mips")] st_pad5: [::c_long; 14], } @@ -140,12 +140,12 @@ #[cfg(target_arch = "powerpc")] __reserved: ::__syscall_ulong_t, pub sem_otime: ::time_t, - #[cfg(not(any(target_arch = "mips", target_arch = "mips32r6", target_arch = "powerpc")))] + #[cfg(not(any(target_arch = "mips", target_arch = "powerpc")))] __reserved: ::__syscall_ulong_t, #[cfg(target_arch = "powerpc")] __reserved2: ::__syscall_ulong_t, pub sem_ctime: ::time_t, - #[cfg(not(any(target_arch = "mips", target_arch = "mips32r6", target_arch = "powerpc")))] + #[cfg(not(any(target_arch = "mips", target_arch = "powerpc")))] __reserved2: ::__syscall_ulong_t, pub sem_nsems: ::__syscall_ulong_t, __glibc_reserved3: ::__syscall_ulong_t, @@ -337,7 +337,7 @@ } else if #[cfg(target_arch = "arm")] { mod arm; pub use self::arm::*; - } else if #[cfg(any(target_arch = "mips", target_arch = "mips32r6"))] { + } else if #[cfg(target_arch = "mips")] { mod mips; pub use self::mips::*; } else if #[cfg(target_arch = "m68k")] { @@ -352,9 +352,6 @@ } else if #[cfg(target_arch = "riscv32")] { mod riscv32; pub use self::riscv32::*; - } else if #[cfg(target_arch = "csky")] { - mod csky; - pub use self::csky::*; } else { // Unknown target_arch } diff -Nru temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/gnu/b64/aarch64/align.rs temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/gnu/b64/aarch64/align.rs --- temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/gnu/b64/aarch64/align.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/gnu/b64/aarch64/align.rs 2023-10-30 19:40:00.000000000 +0000 @@ -27,6 +27,13 @@ __reserved: [[u64; 32]; 16], } + #[repr(align(16))] + pub struct user_fpsimd_struct { + pub vregs: [[u64; 2]; 32], + pub fpsr: ::c_uint, + pub fpcr: ::c_uint, + } + #[repr(align(8))] pub struct clone_args { pub flags: ::c_ulonglong, diff -Nru temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/gnu/b64/aarch64/fallback.rs temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/gnu/b64/aarch64/fallback.rs --- temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/gnu/b64/aarch64/fallback.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/gnu/b64/aarch64/fallback.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,8 +0,0 @@ -s! { - #[repr(align(16))] - pub struct user_fpsimd_struct { - pub vregs: [[u64; 2]; 32], - pub fpsr: ::c_uint, - pub fpcr: ::c_uint, - } -} diff -Nru temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/gnu/b64/aarch64/mod.rs temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/gnu/b64/aarch64/mod.rs --- temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/gnu/b64/aarch64/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/gnu/b64/aarch64/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -902,9 +902,6 @@ pub const SYS_futex_waitv: ::c_long = 449; pub const SYS_set_mempolicy_home_node: ::c_long = 450; -pub const PROT_BTI: ::c_int = 0x10; -pub const PROT_MTE: ::c_int = 0x20; - extern "C" { pub fn sysctl( name: *mut ::c_int, @@ -931,16 +928,11 @@ mod align; pub use self::align::*; } - - } cfg_if! { if #[cfg(libc_int128)] { mod int128; pub use self::int128::*; - } else if #[cfg(libc_align)] { - mod fallback; - pub use self::fallback::*; } } diff -Nru temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/gnu/b64/loongarch64/mod.rs temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/gnu/b64/loongarch64/mod.rs --- temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/gnu/b64/loongarch64/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/gnu/b64/loongarch64/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -264,21 +264,6 @@ }; } -pub const HWCAP_CPUCFG: ::c_ulong = 1 << 0; -pub const HWCAP_LAM: ::c_ulong = 1 << 1; -pub const HWCAP_UAL: ::c_ulong = 1 << 2; -pub const HWCAP_FPU: ::c_ulong = 1 << 3; -pub const HWCAP_LSX: ::c_ulong = 1 << 4; -pub const HWCAP_LASX: ::c_ulong = 1 << 5; -pub const HWCAP_CRC32: ::c_ulong = 1 << 6; -pub const HWCAP_COMPLEX: ::c_ulong = 1 << 7; -pub const HWCAP_CRYPTO: ::c_ulong = 1 << 8; -pub const HWCAP_LVZ: ::c_ulong = 1 << 9; -pub const HWCAP_LBT_X86: ::c_ulong = 1 << 10; -pub const HWCAP_LBT_ARM: ::c_ulong = 1 << 11; -pub const HWCAP_LBT_MIPS: ::c_ulong = 1 << 12; -pub const HWCAP_PTW: ::c_ulong = 1 << 13; - pub const SYS_io_setup: ::c_long = 0; pub const SYS_io_destroy: ::c_long = 1; pub const SYS_io_submit: ::c_long = 2; diff -Nru temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/gnu/b64/mod.rs temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/gnu/b64/mod.rs --- temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/gnu/b64/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/gnu/b64/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -72,7 +72,6 @@ target_arch = "aarch64", target_arch = "loongarch64", target_arch = "mips64", - target_arch = "mips64r6", target_arch = "powerpc64", target_arch = "riscv64", target_arch = "sparc64")))] @@ -82,7 +81,6 @@ target_arch = "aarch64", target_arch = "loongarch64", target_arch = "mips64", - target_arch = "mips64r6", target_arch = "powerpc64", target_arch = "riscv64", target_arch = "sparc64")))] @@ -107,7 +105,7 @@ } else if #[cfg(any(target_arch = "sparc64"))] { mod sparc64; pub use self::sparc64::*; - } else if #[cfg(any(target_arch = "mips64", target_arch = "mips64r6"))] { + } else if #[cfg(any(target_arch = "mips64"))] { mod mips64; pub use self::mips64::*; } else if #[cfg(any(target_arch = "s390x"))] { diff -Nru temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/gnu/mod.rs temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/gnu/mod.rs --- temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/gnu/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/gnu/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -116,17 +116,13 @@ target_arch = "sparc", target_arch = "sparc64", target_arch = "mips", - target_arch = "mips32r6", - target_arch = "mips64", - target_arch = "mips64r6")))] + target_arch = "mips64")))] pub c_ispeed: ::speed_t, #[cfg(not(any( target_arch = "sparc", target_arch = "sparc64", target_arch = "mips", - target_arch = "mips32r6", - target_arch = "mips64", - target_arch = "mips64r6")))] + target_arch = "mips64")))] pub c_ospeed: ::speed_t, } @@ -958,10 +954,7 @@ pub const KEYCTL_SUPPORTS_SIGN: u32 = 0x04; pub const KEYCTL_SUPPORTS_VERIFY: u32 = 0x08; cfg_if! { - if #[cfg(not(any(target_arch = "mips", - target_arch = "mips32r6", - target_arch = "mips64", - target_arch = "mips64r6")))] { + if #[cfg(not(any(target_arch="mips", target_arch="mips64")))] { pub const KEYCTL_MOVE: u32 = 30; pub const KEYCTL_CAPABILITIES: u32 = 31; @@ -1083,18 +1076,6 @@ pub const TIME_BAD: ::c_int = TIME_ERROR; pub const MAXTC: ::c_long = 6; -// Portable GLOB_* flags are defined at the `linux_like` level. -// The following are GNU extensions. -pub const GLOB_PERIOD: ::c_int = 1 << 7; -pub const GLOB_ALTDIRFUNC: ::c_int = 1 << 9; -pub const GLOB_BRACE: ::c_int = 1 << 10; -pub const GLOB_NOMAGIC: ::c_int = 1 << 11; -pub const GLOB_TILDE: ::c_int = 1 << 12; -pub const GLOB_ONLYDIR: ::c_int = 1 << 13; -pub const GLOB_TILDE_CHECK: ::c_int = 1 << 14; - -pub const MADV_COLLAPSE: ::c_int = 25; - cfg_if! { if #[cfg(any( target_arch = "arm", @@ -1391,26 +1372,13 @@ buf: *mut ::c_char, buflen: ::c_int, ) -> *mut ::mntent; - - pub fn execveat( - dirfd: ::c_int, - pathname: *const ::c_char, - argv: *const *mut c_char, - envp: *const *mut c_char, - flags: ::c_int, - ) -> ::c_int; - - // Added in `glibc` 2.34 - pub fn close_range(first: ::c_uint, last: ::c_uint, flags: ::c_int) -> ::c_int; } cfg_if! { if #[cfg(any(target_arch = "x86", target_arch = "arm", target_arch = "m68k", - target_arch = "csky", target_arch = "mips", - target_arch = "mips32r6", target_arch = "powerpc", target_arch = "sparc", target_arch = "riscv32"))] { @@ -1420,7 +1388,6 @@ target_arch = "aarch64", target_arch = "powerpc64", target_arch = "mips64", - target_arch = "mips64r6", target_arch = "s390x", target_arch = "sparc64", target_arch = "riscv64", diff -Nru temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/mod.rs temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/mod.rs --- temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -2766,7 +2766,6 @@ pub const SIOCSIFMEM: ::c_ulong = 0x00008920; pub const SIOCGIFMTU: ::c_ulong = 0x00008921; pub const SIOCSIFMTU: ::c_ulong = 0x00008922; -pub const SIOCSIFNAME: ::c_ulong = 0x00008923; pub const SIOCSIFHWADDR: ::c_ulong = 0x00008924; pub const SIOCGIFENCAP: ::c_ulong = 0x00008925; pub const SIOCSIFENCAP: ::c_ulong = 0x00008926; @@ -3183,11 +3182,6 @@ pub const HWTSTAMP_FILTER_PTP_V2_DELAY_REQ: ::c_uint = 14; pub const HWTSTAMP_FILTER_NTP_ALL: ::c_uint = 15; -// linux/tls.h -pub const TLS_GET_RECORD_TYPE: ::c_int = 2; - -pub const SOL_TLS: ::c_int = 282; - // linux/if_alg.h pub const ALG_SET_KEY: ::c_int = 1; pub const ALG_SET_IV: ::c_int = 2; @@ -4582,7 +4576,6 @@ attr: *const ::pthread_attr_t, guardsize: *mut ::size_t, ) -> ::c_int; - pub fn pthread_attr_setguardsize(attr: *mut ::pthread_attr_t, guardsize: ::size_t) -> ::c_int; pub fn sethostname(name: *const ::c_char, len: ::size_t) -> ::c_int; pub fn sched_get_priority_min(policy: ::c_int) -> ::c_int; pub fn pthread_condattr_getpshared( diff -Nru temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/musl/b32/hexagon.rs temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/musl/b32/hexagon.rs --- temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/musl/b32/hexagon.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/musl/b32/hexagon.rs 2023-10-30 19:40:00.000000000 +0000 @@ -265,6 +265,7 @@ pub const PF_KCM: ::c_int = 41; pub const PF_MAX: ::c_int = 43; pub const PF_QIPCRTR: ::c_int = 42; +#[deprecated(since = "0.2.64", note = "Not stable across OS versions")] pub const SA_ONSTACK: ::c_int = 0x08000000; pub const SA_SIGINFO: ::c_int = 0x00000004; pub const SA_NOCLDWAIT: ::c_int = 0x00000002; diff -Nru temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/musl/b32/powerpc.rs temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/musl/b32/powerpc.rs --- temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/musl/b32/powerpc.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/musl/b32/powerpc.rs 2023-10-30 19:40:00.000000000 +0000 @@ -380,6 +380,8 @@ pub const EXTPROC: ::tcflag_t = 0x10000000; +pub const MAP_HUGETLB: ::c_int = 0x040000; + pub const F_GETLK: ::c_int = 12; pub const F_GETOWN: ::c_int = 9; pub const F_SETLK: ::c_int = 13; diff -Nru temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/no_align.rs temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/no_align.rs --- temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/no_align.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/libc/src/unix/linux_like/linux/no_align.rs 2023-10-30 19:40:00.000000000 +0000 @@ -5,7 +5,6 @@ #[cfg(any(target_arch = "x86_64", target_arch = "powerpc64", target_arch = "mips64", - target_arch = "mips64r6", target_arch = "s390x", target_arch = "sparc64", target_arch = "riscv64", @@ -17,7 +16,6 @@ #[cfg(not(any(target_arch = "x86_64", target_arch = "powerpc64", target_arch = "mips64", - target_arch = "mips64r6", target_arch = "s390x", target_arch = "sparc64", target_arch = "riscv64", @@ -70,20 +68,16 @@ pub struct pthread_mutex_t { #[cfg(any(target_arch = "mips", - target_arch = "mips32r6", target_arch = "arm", target_arch = "m68k", - target_arch = "csky", target_arch = "powerpc", target_arch = "sparc", all(target_arch = "x86_64", target_pointer_width = "32")))] __align: [::c_long; 0], #[cfg(not(any(target_arch = "mips", - target_arch = "mips32r6", target_arch = "arm", target_arch = "m68k", - target_arch = "csky", target_arch = "powerpc", target_arch = "sparc", all(target_arch = "x86_64", @@ -94,20 +88,16 @@ pub struct pthread_rwlock_t { #[cfg(any(target_arch = "mips", - target_arch = "mips32r6", target_arch = "arm", target_arch = "m68k", - target_arch = "csky", target_arch = "powerpc", target_arch = "sparc", all(target_arch = "x86_64", target_pointer_width = "32")))] __align: [::c_long; 0], #[cfg(not(any(target_arch = "mips", - target_arch = "mips32r6", target_arch = "arm", target_arch = "m68k", - target_arch = "csky", target_arch = "powerpc", target_arch = "sparc", all(target_arch = "x86_64", @@ -118,20 +108,16 @@ pub struct pthread_barrier_t { #[cfg(any(target_arch = "mips", - target_arch = "mips32r6", target_arch = "arm", target_arch = "m68k", - target_arch = "csky", target_arch = "powerpc", target_arch = "sparc", all(target_arch = "x86_64", target_pointer_width = "32")))] __align: [::c_long; 0], #[cfg(not(any(target_arch = "mips", - target_arch = "mips32r6", target_arch = "arm", target_arch = "m68k", - target_arch = "csky", target_arch = "powerpc", target_arch = "sparc", all(target_arch = "x86_64", diff -Nru temporalio-1.3.0/vendor/libc/src/unix/linux_like/mod.rs temporalio-1.3.0/vendor/libc/src/unix/linux_like/mod.rs --- temporalio-1.3.0/vendor/libc/src/unix/linux_like/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/libc/src/unix/linux_like/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1783,10 +1783,10 @@ // LFS64 extensions // -// * musl and Emscripten has 64-bit versions only so aliases the LFS64 symbols to the standard ones +// * musl has 64-bit versions only so aliases the LFS64 symbols to the standard ones // * ulibc doesn't have preadv64/pwritev64 cfg_if! { - if #[cfg(not(any(target_env = "musl", target_os = "emscripten")))] { + if #[cfg(not(target_env = "musl"))] { extern "C" { pub fn fstatfs64(fd: ::c_int, buf: *mut statfs64) -> ::c_int; pub fn statvfs64(path: *const ::c_char, buf: *mut statvfs64) -> ::c_int; @@ -1844,7 +1844,7 @@ } cfg_if! { - if #[cfg(not(any(target_env = "uclibc", target_env = "musl", target_os = "emscripten")))] { + if #[cfg(not(any(target_env = "uclibc", target_env = "musl")))] { extern "C" { pub fn preadv64( fd: ::c_int, diff -Nru temporalio-1.3.0/vendor/libc/src/unix/mod.rs temporalio-1.3.0/vendor/libc/src/unix/mod.rs --- temporalio-1.3.0/vendor/libc/src/unix/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/libc/src/unix/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -388,6 +388,11 @@ #[link(name = "c")] #[link(name = "m")] extern {} + } else if #[cfg(target_os = "hermit")] { + // no_default_libraries is set to false for HermitCore, so only a link + // to "pthread" needs to be added. + #[link(name = "pthread")] + extern {} } else if #[cfg(target_env = "illumos")] { #[link(name = "c")] #[link(name = "m")] @@ -1076,10 +1081,6 @@ pub fn pthread_exit(value: *mut ::c_void) -> !; pub fn pthread_attr_init(attr: *mut ::pthread_attr_t) -> ::c_int; pub fn pthread_attr_destroy(attr: *mut ::pthread_attr_t) -> ::c_int; - pub fn pthread_attr_getstacksize( - attr: *const ::pthread_attr_t, - stacksize: *mut ::size_t, - ) -> ::c_int; pub fn pthread_attr_setstacksize(attr: *mut ::pthread_attr_t, stack_size: ::size_t) -> ::c_int; pub fn pthread_attr_setdetachstate(attr: *mut ::pthread_attr_t, state: ::c_int) -> ::c_int; pub fn pthread_detach(thread: ::pthread_t) -> ::c_int; @@ -1412,7 +1413,6 @@ pub fn lockf(fd: ::c_int, cmd: ::c_int, len: ::off_t) -> ::c_int; } - cfg_if! { if #[cfg(not(any(target_os = "emscripten", target_os = "android", @@ -1582,6 +1582,9 @@ } else if #[cfg(target_os = "haiku")] { mod haiku; pub use self::haiku::*; + } else if #[cfg(target_os = "hermit")] { + mod hermit; + pub use self::hermit::*; } else if #[cfg(target_os = "redox")] { mod redox; pub use self::redox::*; @@ -1591,9 +1594,6 @@ } else if #[cfg(target_os = "aix")] { mod aix; pub use self::aix::*; - } else if #[cfg(target_os = "hurd")] { - mod hurd; - pub use self::hurd::*; } else { // Unknown target_os } diff -Nru temporalio-1.3.0/vendor/libc/src/unix/newlib/aarch64/mod.rs temporalio-1.3.0/vendor/libc/src/unix/newlib/aarch64/mod.rs --- temporalio-1.3.0/vendor/libc/src/unix/newlib/aarch64/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/libc/src/unix/newlib/aarch64/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -51,4 +51,4 @@ pub const MSG_MORE: ::c_int = 0; pub const MSG_NOSIGNAL: ::c_int = 0; -pub use crate::unix::newlib::generic::{dirent, sigset_t, stat}; +pub use crate::unix::newlib::generic::{sigset_t, stat}; diff -Nru temporalio-1.3.0/vendor/libc/src/unix/newlib/arm/mod.rs temporalio-1.3.0/vendor/libc/src/unix/newlib/arm/mod.rs --- temporalio-1.3.0/vendor/libc/src/unix/newlib/arm/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/libc/src/unix/newlib/arm/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -53,4 +53,4 @@ pub const MSG_MORE: ::c_int = 0; pub const MSG_NOSIGNAL: ::c_int = 0; -pub use crate::unix::newlib::generic::{dirent, sigset_t, stat}; +pub use crate::unix::newlib::generic::{sigset_t, stat}; diff -Nru temporalio-1.3.0/vendor/libc/src/unix/newlib/espidf/mod.rs temporalio-1.3.0/vendor/libc/src/unix/newlib/espidf/mod.rs --- temporalio-1.3.0/vendor/libc/src/unix/newlib/espidf/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/libc/src/unix/newlib/espidf/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -107,4 +107,4 @@ pub fn eventfd(initval: ::c_uint, flags: ::c_int) -> ::c_int; } -pub use crate::unix::newlib::generic::{dirent, sigset_t, stat}; +pub use crate::unix::newlib::generic::{sigset_t, stat}; diff -Nru temporalio-1.3.0/vendor/libc/src/unix/newlib/generic.rs temporalio-1.3.0/vendor/libc/src/unix/newlib/generic.rs --- temporalio-1.3.0/vendor/libc/src/unix/newlib/generic.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/libc/src/unix/newlib/generic.rs 2023-10-30 19:40:00.000000000 +0000 @@ -24,10 +24,4 @@ pub st_blocks: ::blkcnt_t, pub st_spare4: [::c_long; 2usize], } - - pub struct dirent { - pub d_ino: ::ino_t, - pub d_type: ::c_uchar, - pub d_name: [::c_char; 256usize], - } } diff -Nru temporalio-1.3.0/vendor/libc/src/unix/newlib/horizon/mod.rs temporalio-1.3.0/vendor/libc/src/unix/newlib/horizon/mod.rs --- temporalio-1.3.0/vendor/libc/src/unix/newlib/horizon/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/libc/src/unix/newlib/horizon/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -266,5 +266,3 @@ pub fn gethostid() -> ::c_long; } - -pub use crate::unix::newlib::generic::dirent; diff -Nru temporalio-1.3.0/vendor/libc/src/unix/newlib/mod.rs temporalio-1.3.0/vendor/libc/src/unix/newlib/mod.rs --- temporalio-1.3.0/vendor/libc/src/unix/newlib/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/libc/src/unix/newlib/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,7 +1,13 @@ pub type blkcnt_t = i32; pub type blksize_t = i32; -pub type clockid_t = ::c_ulong; +cfg_if! { + if #[cfg(target_os = "vita")] { + pub type clockid_t = ::c_uint; + } else { + pub type clockid_t = ::c_ulong; + } +} cfg_if! { if #[cfg(any(target_os = "espidf"))] { @@ -164,6 +170,16 @@ pub sa_flags: ::c_int, } + pub struct dirent { + #[cfg(not(target_os = "vita"))] + pub d_ino: ino_t, + #[cfg(not(target_os = "vita"))] + pub d_type: ::c_uchar, + #[cfg(target_os = "vita")] + __offset: [u8; 88], + pub d_name: [::c_char; 256usize], + } + pub struct stack_t { pub ss_sp: *mut ::c_void, pub ss_flags: ::c_int, @@ -530,16 +546,8 @@ pub const IFF_ALTPHYS: ::c_int = IFF_LINK2; // use alternate physical connection pub const IFF_MULTICAST: ::c_int = 0x8000; // supports multicast -cfg_if! { - if #[cfg(target_os = "vita")] { - pub const TCP_NODELAY: ::c_int = 1; - pub const TCP_MAXSEG: ::c_int = 2; - } else { - pub const TCP_NODELAY: ::c_int = 8193; - pub const TCP_MAXSEG: ::c_int = 8194; - } -} - +pub const TCP_NODELAY: ::c_int = 8193; +pub const TCP_MAXSEG: ::c_int = 8194; pub const TCP_NOPUSH: ::c_int = 4; pub const TCP_NOOPT: ::c_int = 8; pub const TCP_KEEPIDLE: ::c_int = 256; @@ -553,25 +561,13 @@ pub const IP_TOS: ::c_int = 3; } } -cfg_if! { - if #[cfg(target_os = "vita")] { - pub const IP_TTL: ::c_int = 4; - } else { - pub const IP_TTL: ::c_int = 8; - } -} +pub const IP_TTL: ::c_int = 8; pub const IP_MULTICAST_IF: ::c_int = 9; pub const IP_MULTICAST_TTL: ::c_int = 10; pub const IP_MULTICAST_LOOP: ::c_int = 11; -cfg_if! { - if #[cfg(target_os = "vita")] { - pub const IP_ADD_MEMBERSHIP: ::c_int = 12; - pub const IP_DROP_MEMBERSHIP: ::c_int = 13; - } else { - pub const IP_ADD_MEMBERSHIP: ::c_int = 11; - pub const IP_DROP_MEMBERSHIP: ::c_int = 12; - } -} +pub const IP_ADD_MEMBERSHIP: ::c_int = 11; +pub const IP_DROP_MEMBERSHIP: ::c_int = 12; + pub const IPV6_UNICAST_HOPS: ::c_int = 4; pub const IPV6_MULTICAST_IF: ::c_int = 9; pub const IPV6_MULTICAST_HOPS: ::c_int = 10; @@ -602,15 +598,10 @@ pub const NI_NUMERICSERV: ::c_int = 0; pub const NI_DGRAM: ::c_int = 0; -cfg_if! { - // Defined in vita/mod.rs for "vita" - if #[cfg(not(target_os = "vita"))] { - pub const EAI_FAMILY: ::c_int = -303; - pub const EAI_MEMORY: ::c_int = -304; - pub const EAI_NONAME: ::c_int = -305; - pub const EAI_SOCKTYPE: ::c_int = -307; - } -} +pub const EAI_FAMILY: ::c_int = -303; +pub const EAI_MEMORY: ::c_int = -304; +pub const EAI_NONAME: ::c_int = -305; +pub const EAI_SOCKTYPE: ::c_int = -307; pub const EXIT_SUCCESS: ::c_int = 0; pub const EXIT_FAILURE: ::c_int = 1; diff -Nru temporalio-1.3.0/vendor/libc/src/unix/newlib/powerpc/mod.rs temporalio-1.3.0/vendor/libc/src/unix/newlib/powerpc/mod.rs --- temporalio-1.3.0/vendor/libc/src/unix/newlib/powerpc/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/libc/src/unix/newlib/powerpc/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -5,7 +5,7 @@ pub type c_long = i32; pub type c_ulong = u32; -pub use crate::unix::newlib::generic::{dirent, sigset_t, stat}; +pub use crate::unix::newlib::generic::{sigset_t, stat}; // the newlib shipped with devkitPPC does not support the following components: // - sockaddr diff -Nru temporalio-1.3.0/vendor/libc/src/unix/newlib/vita/mod.rs temporalio-1.3.0/vendor/libc/src/unix/newlib/vita/mod.rs --- temporalio-1.3.0/vendor/libc/src/unix/newlib/vita/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/libc/src/unix/newlib/vita/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -9,16 +9,6 @@ pub type sigset_t = ::c_ulong; s! { - pub struct msghdr { - pub msg_name: *mut ::c_void, - pub msg_namelen: ::socklen_t, - pub msg_iov: *mut ::iovec, - pub msg_iovlen: ::c_int, - pub msg_control: *mut ::c_void, - pub msg_controllen: ::socklen_t, - pub msg_flags: ::c_int, - } - pub struct sockaddr { pub sa_len: u8, pub sa_family: ::sa_family_t, @@ -45,7 +35,6 @@ } pub struct sockaddr_un { - pub ss_len: u8, pub sun_family: ::sa_family_t, pub sun_path: [::c_char; 108usize], } @@ -53,9 +42,9 @@ pub struct sockaddr_storage { pub ss_len: u8, pub ss_family: ::sa_family_t, - pub __ss_pad1: [u8; 2], + pub __ss_pad1: [u8; 4], pub __ss_align: i64, - pub __ss_pad2: [u8; 116], + pub __ss_pad2: [u8; 4], } pub struct sched_param { @@ -78,31 +67,16 @@ pub st_blocks: ::blkcnt_t, pub st_spare4: [::c_long; 2usize], } - - #[repr(align(8))] - pub struct dirent { - __offset: [u8; 88], - pub d_name: [::c_char; 256usize], - __pad: [u8; 8], - } } pub const AF_UNIX: ::c_int = 1; pub const AF_INET6: ::c_int = 24; -pub const SOCK_RAW: ::c_int = 3; -pub const SOCK_RDM: ::c_int = 4; -pub const SOCK_SEQPACKET: ::c_int = 5; - pub const FIONBIO: ::c_ulong = 1; pub const POLLIN: ::c_short = 0x0001; pub const POLLPRI: ::c_short = POLLIN; pub const POLLOUT: ::c_short = 0x0004; -pub const POLLRDNORM: ::c_short = POLLIN; -pub const POLLRDBAND: ::c_short = POLLIN; -pub const POLLWRNORM: ::c_short = POLLOUT; -pub const POLLWRBAND: ::c_short = POLLOUT; pub const POLLERR: ::c_short = 0x0008; pub const POLLHUP: ::c_short = 0x0010; pub const POLLNVAL: ::c_short = 0x0020; @@ -167,16 +141,11 @@ pub const _SC_GETPW_R_SIZE_MAX: ::c_int = 51; pub const PTHREAD_STACK_MIN: ::size_t = 32 * 1024; -pub const IP_HDRINCL: ::c_int = 2; - extern "C" { pub fn futimens(fd: ::c_int, times: *const ::timespec) -> ::c_int; pub fn writev(fd: ::c_int, iov: *const ::iovec, iovcnt: ::c_int) -> ::ssize_t; pub fn readv(fd: ::c_int, iov: *const ::iovec, iovcnt: ::c_int) -> ::ssize_t; - pub fn sendmsg(s: ::c_int, msg: *const ::msghdr, flags: ::c_int) -> ::ssize_t; - pub fn recvmsg(s: ::c_int, msg: *mut ::msghdr, flags: ::c_int) -> ::ssize_t; - pub fn pthread_create( native: *mut ::pthread_t, attr: *const ::pthread_attr_t, @@ -229,6 +198,4 @@ pub fn pthread_getprocessorid_np() -> ::c_int; pub fn getentropy(buf: *mut ::c_void, buflen: ::size_t) -> ::c_int; - - pub fn pipe2(fds: *mut ::c_int, flags: ::c_int) -> ::c_int; } diff -Nru temporalio-1.3.0/vendor/libc/src/unix/nto/mod.rs temporalio-1.3.0/vendor/libc/src/unix/nto/mod.rs --- temporalio-1.3.0/vendor/libc/src/unix/nto/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/libc/src/unix/nto/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -2557,7 +2557,6 @@ pub const RLIMIT_RSS: ::c_int = 6; pub const RLIMIT_STACK: ::c_int = 3; pub const RLIMIT_VMEM: ::c_int = 6; -#[deprecated(since = "0.2.64", note = "Not stable across OS versions")] pub const RLIM_NLIMITS: ::c_int = 14; pub const SCHED_ADJTOHEAD: ::c_int = 5; @@ -3093,7 +3092,6 @@ attr: *const ::pthread_attr_t, guardsize: *mut ::size_t, ) -> ::c_int; - pub fn pthread_attr_setguardsize(attr: *mut ::pthread_attr_t, guardsize: ::size_t) -> ::c_int; pub fn sethostname(name: *const ::c_char, len: ::size_t) -> ::c_int; pub fn sched_get_priority_min(policy: ::c_int) -> ::c_int; pub fn pthread_condattr_getpshared( diff -Nru temporalio-1.3.0/vendor/libc/src/unix/redox/mod.rs temporalio-1.3.0/vendor/libc/src/unix/redox/mod.rs --- temporalio-1.3.0/vendor/libc/src/unix/redox/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/libc/src/unix/redox/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -28,13 +28,20 @@ pub type nlink_t = ::c_ulong; pub type off_t = ::c_longlong; pub type pthread_t = *mut ::c_void; +pub type pthread_attr_t = *mut ::c_void; +pub type pthread_cond_t = *mut ::c_void; +pub type pthread_condattr_t = *mut ::c_void; // Must be usize due to libstd/sys_common/thread_local.rs, // should technically be *mut ::c_void pub type pthread_key_t = usize; +pub type pthread_mutex_t = *mut ::c_void; +pub type pthread_mutexattr_t = *mut ::c_void; +pub type pthread_rwlock_t = *mut ::c_void; +pub type pthread_rwlockattr_t = *mut ::c_void; pub type rlim_t = ::c_ulonglong; pub type sa_family_t = u16; pub type sem_t = *mut ::c_void; -pub type sigset_t = ::c_ulonglong; +pub type sigset_t = ::c_ulong; pub type socklen_t = u32; pub type speed_t = u32; pub type suseconds_t = ::c_int; @@ -258,74 +265,7 @@ pub uid: uid_t, pub gid: gid_t, } - - #[cfg_attr(target_pointer_width = "32", repr(C, align(4)))] - #[cfg_attr(target_pointer_width = "64", repr(C, align(8)))] - pub struct pthread_attr_t { - bytes: [u8; _PTHREAD_ATTR_SIZE], - } - #[repr(C)] - #[repr(align(4))] - pub struct pthread_barrier_t { - bytes: [u8; _PTHREAD_BARRIER_SIZE], - } - #[repr(C)] - #[repr(align(4))] - pub struct pthread_barrierattr_t { - bytes: [u8; _PTHREAD_BARRIERATTR_SIZE], - } - #[repr(C)] - #[repr(align(4))] - pub struct pthread_mutex_t { - bytes: [u8; _PTHREAD_MUTEX_SIZE], - } - #[repr(C)] - #[repr(align(4))] - pub struct pthread_rwlock_t { - bytes: [u8; _PTHREAD_RWLOCK_SIZE], - } - #[repr(C)] - #[repr(align(4))] - pub struct pthread_mutexattr_t { - bytes: [u8; _PTHREAD_MUTEXATTR_SIZE], - } - #[repr(C)] - #[repr(align(1))] - pub struct pthread_rwlockattr_t { - bytes: [u8; _PTHREAD_RWLOCKATTR_SIZE], - } - #[repr(C)] - #[repr(align(4))] - pub struct pthread_cond_t { - bytes: [u8; _PTHREAD_COND_SIZE], - } - #[repr(C)] - #[repr(align(4))] - pub struct pthread_condattr_t { - bytes: [u8; _PTHREAD_CONDATTR_SIZE], - } - #[repr(C)] - #[repr(align(4))] - pub struct pthread_once_t { - bytes: [u8; _PTHREAD_ONCE_SIZE], - } - #[repr(C)] - #[repr(align(4))] - pub struct pthread_spinlock_t { - bytes: [u8; _PTHREAD_SPINLOCK_SIZE], - } } -const _PTHREAD_ATTR_SIZE: usize = 32; -const _PTHREAD_RWLOCKATTR_SIZE: usize = 1; -const _PTHREAD_RWLOCK_SIZE: usize = 4; -const _PTHREAD_BARRIER_SIZE: usize = 24; -const _PTHREAD_BARRIERATTR_SIZE: usize = 4; -const _PTHREAD_CONDATTR_SIZE: usize = 8; -const _PTHREAD_COND_SIZE: usize = 8; -const _PTHREAD_MUTEX_SIZE: usize = 12; -const _PTHREAD_MUTEXATTR_SIZE: usize = 20; -const _PTHREAD_ONCE_SIZE: usize = 4; -const _PTHREAD_SPINLOCK_SIZE: usize = 4; pub const UTSLENGTH: usize = 65; @@ -609,15 +549,9 @@ // pthread.h pub const PTHREAD_MUTEX_NORMAL: ::c_int = 0; pub const PTHREAD_MUTEX_RECURSIVE: ::c_int = 1; -pub const PTHREAD_MUTEX_INITIALIZER: ::pthread_mutex_t = ::pthread_mutex_t { - bytes: [0; _PTHREAD_MUTEX_SIZE], -}; -pub const PTHREAD_COND_INITIALIZER: ::pthread_cond_t = ::pthread_cond_t { - bytes: [0; _PTHREAD_COND_SIZE], -}; -pub const PTHREAD_RWLOCK_INITIALIZER: ::pthread_rwlock_t = ::pthread_rwlock_t { - bytes: [0; _PTHREAD_RWLOCK_SIZE], -}; +pub const PTHREAD_MUTEX_INITIALIZER: ::pthread_mutex_t = -1isize as *mut _; +pub const PTHREAD_COND_INITIALIZER: ::pthread_cond_t = -1isize as *mut _; +pub const PTHREAD_RWLOCK_INITIALIZER: ::pthread_rwlock_t = -1isize as *mut _; pub const PTHREAD_STACK_MIN: ::size_t = 4096; // signal.h diff -Nru temporalio-1.3.0/vendor/libc/src/unix/solarish/mod.rs temporalio-1.3.0/vendor/libc/src/unix/solarish/mod.rs --- temporalio-1.3.0/vendor/libc/src/unix/solarish/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/libc/src/unix/solarish/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1825,8 +1825,6 @@ pub const SO_RCVTIMEO: ::c_int = 0x1006; pub const SO_ERROR: ::c_int = 0x1007; pub const SO_TYPE: ::c_int = 0x1008; -pub const SO_PROTOTYPE: ::c_int = 0x1009; -pub const SO_DOMAIN: ::c_int = 0x100c; pub const SO_TIMESTAMP: ::c_int = 0x1013; pub const SCM_RIGHTS: ::c_int = 0x1010; diff -Nru temporalio-1.3.0/vendor/libc/src/windows/mod.rs temporalio-1.3.0/vendor/libc/src/windows/mod.rs --- temporalio-1.3.0/vendor/libc/src/windows/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/libc/src/windows/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -345,7 +345,6 @@ pub fn strtoull(s: *const c_char, endp: *mut *mut c_char, base: c_int) -> c_ulonglong; pub fn calloc(nobj: size_t, size: size_t) -> *mut c_void; pub fn malloc(size: size_t) -> *mut c_void; - pub fn _msize(p: *mut c_void) -> size_t; pub fn realloc(p: *mut c_void, size: size_t) -> *mut c_void; pub fn free(p: *mut c_void); pub fn abort() -> !; diff -Nru temporalio-1.3.0/vendor/linux-raw-sys/.cargo-checksum.json temporalio-1.3.0/vendor/linux-raw-sys/.cargo-checksum.json --- temporalio-1.3.0/vendor/linux-raw-sys/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/linux-raw-sys/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"CODE_OF_CONDUCT.md":"ccd9e538ce44713a2486cc8e4c01b8c8b846d1ccff15de728d8d6fa9a7f846cd","COPYRIGHT":"3290ae0fbc9ddb77d2239121d710f0bb9d31b3b4744e6d97fe01e652b4c1870b","Cargo.toml":"0d02ea4bc018631a52900423cb7466bc905571bd1d767769739bde626360c123","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-Apache-2.0_WITH_LLVM-exception":"268872b9816f90fd8e85db5a28d33f8150ebb8dd016653fb39ef1f94f2686bc5","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","ORG_CODE_OF_CONDUCT.md":"a62b69bf86e605ee1bcbb2f0a12ba79e4cebb6983a7b6491949750aecc4f2178","README.md":"3d4ae2ec9429adfd329b4506f7ca6faa84dca30d1c3b416f8f4e6f57bdb3aa96","src/aarch64/errno.rs":"db283e5ea7fb63e0f57acb241e6471a951b4218660c01ca37b80be9a53629b92","src/aarch64/general.rs":"0cc1ed00b1ef7efb16a7109138acdf679d591325458938cee150b221af063822","src/aarch64/if_ether.rs":"f558bfec1f5e80235db79f507e4afd3120647a5caddf17a87b7ad5540e5c1462","src/aarch64/io_uring.rs":"9ce4c9005b5b99e041b9d58be6866367605e4bee1e30a7096235cb234ed73e1b","src/aarch64/ioctl.rs":"f83af7f7cab6611c9f316b2289998d3276d844ac8f96111bc65f6c3340c3301a","src/aarch64/net.rs":"9c5fe44f91072b08899a6304cb22a51545034adde444740b67b8b310f3906a30","src/aarch64/netlink.rs":"f6642310b8bd37b5775ba1a52cfe638beddd7c880f8dfacab62c3180255fb75f","src/aarch64/prctl.rs":"a80e2f89aa978210d980538e1d9c5b922bb073d118ee51b1f14c1f397c7cd576","src/aarch64/system.rs":"851a95c0d1b76782970a28c373a313954eea0db35f6ebce562e6047095f587c4","src/arm/errno.rs":"db283e5ea7fb63e0f57acb241e6471a951b4218660c01ca37b80be9a53629b92","src/arm/general.rs":"bdbb40ba5630044c9555fe38a3640638f3ff7f437d94f82428e2bedad32e180f","src/arm/if_ether.rs":"3873beb1f57bdcc52da345608c5deda5937d7b92b114b414ce6161784173b925","src/arm/io_uring.rs":"5e2e254d5853ed30568e17fab184f8cc458607465d19dcee6c87ca1b565d6d2d","src/arm/ioctl.rs":"54cb9bdc5fe4ee7cff30e087bb0d04f1d811b55be7604bb056387f859120935a","src/arm/net.rs":"c79f443ab6585f81a71eff3350700ece82098264206eb79f78714153d6e43529","src/arm/netlink.rs":"2f98b8c0349c2d3d538164e4d06c28fa1fb9308f7691aa097526ce2fb3ac176f","src/arm/prctl.rs":"5477c74fec958d9f9d2028f58e95657840ead28445956e53fe0894e45922f8a5","src/arm/system.rs":"9aca94a4a553e09e6d2d43741fb8c120c05a193822e850951dc469bbd89cc703","src/csky/errno.rs":"db283e5ea7fb63e0f57acb241e6471a951b4218660c01ca37b80be9a53629b92","src/csky/general.rs":"94aba82d2a76a9ca272b4766f8d2f5f14e10bc2166e03d695a5b8b5d207e6755","src/csky/if_ether.rs":"aac7a069000195b9b18c6d25b2d7c338efb1062347a84e31cda7c93de374b3c6","src/csky/io_uring.rs":"bb7541d82f627cb681ea11f4e5c4162b0d0616ca08fcc6d31bcf22ef813f754d","src/csky/ioctl.rs":"77f30e67f9a4748bc31184454a0ff45fd821c3536cd98dc2411def8eeb59a268","src/csky/net.rs":"2796ca3744e82cecd816b4d1b1fba0bcb389fbc4603e0af7b6cdc562c666b512","src/csky/netlink.rs":"9fc99e88df0efc15d39b397c9d653c32b4729e31a2434e730435fbdfcb362da4","src/csky/prctl.rs":"8df2f33387d5b4865d9417f796cc4d43b3cf549cfa41d7ce7d41dd367ed8b6c9","src/csky/system.rs":"a2913685b359e60bbfae413b89a6fd37ea38fa448f980ffadef42d227b33ada5","src/elf.rs":"441bcf378b5603f957e053369d18d95c1efe981665846c220bca82123c04843a","src/lib.rs":"f3399ba35206764ac4e2d755cfc7e0c580464b8fcc76968f6c4b9f64523a1d02","src/loongarch64/errno.rs":"db283e5ea7fb63e0f57acb241e6471a951b4218660c01ca37b80be9a53629b92","src/loongarch64/general.rs":"fadd5884c6ad645300540dd30150984857819a986772fca4eba1e1fc0c3f4f1e","src/loongarch64/if_ether.rs":"a7b0918afc9dbf8e79490f83a809e4bd563af20ab2b3432d58b763ff31418daf","src/loongarch64/io_uring.rs":"ef851913c86bc2d629048e781edc76b59c63e659f8bd4bcd7fa7ff982186ed6d","src/loongarch64/ioctl.rs":"6f631e0ac37f2c2398168683a1523d1559b85369ffe4cdcc284ffe7455672c18","src/loongarch64/net.rs":"21add3f1bfa5898d9a5ef91342f6cd94ad4585df6525b9a4cf6cdf743345a9c7","src/loongarch64/netlink.rs":"789357343b94276e6f8fc8f3a32f06f3d3efd464c7850b2568dc609a49d1f305","src/loongarch64/prctl.rs":"624e4d3b8f3b4f1d6dcb1540c124ed03ce47f0580aa3425c0baed431dcd267ea","src/loongarch64/system.rs":"4cfcd4c28481b9ff5fc0330d5c713d637d3615c0184830d3a4391882eaed68f5","src/mips/errno.rs":"9ab1ed2bf371a27401745c2a6f9692f7e66dfd481d032cb40a354826d394ea8e","src/mips/general.rs":"1c16f4e0a015eaf27e9a30f4b74ec824220798f47c535d3aaf322ad799c054ab","src/mips/if_ether.rs":"1ecdc654cb3eda633bb7192829b1001a0a5ae5a126110b4208bbee5b41f87f5e","src/mips/io_uring.rs":"c69479bb1f862febe78e0989745c202146aaef7e8ceaa0d7bf291af584748992","src/mips/ioctl.rs":"f7464d2cd0548ab4735a1ca8deba47f13ea0946a9bf86adfec1a77feb3a0f475","src/mips/net.rs":"843204e91d8d6c34ddf4d29e1e822980b3e058ff7fc55ecc5f2b0fdf4a72825d","src/mips/netlink.rs":"5045dece259abaa5b5974500a20a9325e4cd6eb87c344dd7448056dff469994f","src/mips/prctl.rs":"cd59615adf6f561ef6c542df59cf25f75877693ca1c4c489f5e460eb7e798d4d","src/mips/system.rs":"acbc69a1fe7299860f8bd142bc2ff5595a410e1528994139062fc680d1a87e71","src/mips32r6/errno.rs":"9ab1ed2bf371a27401745c2a6f9692f7e66dfd481d032cb40a354826d394ea8e","src/mips32r6/general.rs":"1c16f4e0a015eaf27e9a30f4b74ec824220798f47c535d3aaf322ad799c054ab","src/mips32r6/if_ether.rs":"1ecdc654cb3eda633bb7192829b1001a0a5ae5a126110b4208bbee5b41f87f5e","src/mips32r6/io_uring.rs":"c69479bb1f862febe78e0989745c202146aaef7e8ceaa0d7bf291af584748992","src/mips32r6/ioctl.rs":"f7464d2cd0548ab4735a1ca8deba47f13ea0946a9bf86adfec1a77feb3a0f475","src/mips32r6/net.rs":"843204e91d8d6c34ddf4d29e1e822980b3e058ff7fc55ecc5f2b0fdf4a72825d","src/mips32r6/netlink.rs":"5045dece259abaa5b5974500a20a9325e4cd6eb87c344dd7448056dff469994f","src/mips32r6/prctl.rs":"cd59615adf6f561ef6c542df59cf25f75877693ca1c4c489f5e460eb7e798d4d","src/mips32r6/system.rs":"acbc69a1fe7299860f8bd142bc2ff5595a410e1528994139062fc680d1a87e71","src/mips64/errno.rs":"9ab1ed2bf371a27401745c2a6f9692f7e66dfd481d032cb40a354826d394ea8e","src/mips64/general.rs":"700b52614c604ce58aa8a5bb1ebd46221c0106ec2d8d6600d681d1594a89118a","src/mips64/if_ether.rs":"6d24518acba5bc8fa2a775d039ed9594de8349d6028621134626ccaa8ea18bcd","src/mips64/io_uring.rs":"18bd5d96c53aff44f4a37a71f16fa12c11b7c934b395bf841e47d98283146a50","src/mips64/ioctl.rs":"39f3276ec6f36ba78f5635bd418310b21bc228902d4da889fa01094c26f9b57d","src/mips64/net.rs":"e641379a7004ded90413b084504468148ecdbea4f753cbca83a4d22698cd7bab","src/mips64/netlink.rs":"18f139573337be18fb9bd56de4d0bd8af5c80828cdf68ef68751c18dcb39c761","src/mips64/prctl.rs":"a8d9ae240ce582d7b66e13937b99df73c7247ce9f69bfdd12109903d7c6dfb0e","src/mips64/system.rs":"95805c533a8eb8f53c28f138e6a2d12064681cc9db55d3042ee748c655a5d7cd","src/mips64r6/errno.rs":"9ab1ed2bf371a27401745c2a6f9692f7e66dfd481d032cb40a354826d394ea8e","src/mips64r6/general.rs":"700b52614c604ce58aa8a5bb1ebd46221c0106ec2d8d6600d681d1594a89118a","src/mips64r6/if_ether.rs":"6d24518acba5bc8fa2a775d039ed9594de8349d6028621134626ccaa8ea18bcd","src/mips64r6/io_uring.rs":"18bd5d96c53aff44f4a37a71f16fa12c11b7c934b395bf841e47d98283146a50","src/mips64r6/ioctl.rs":"39f3276ec6f36ba78f5635bd418310b21bc228902d4da889fa01094c26f9b57d","src/mips64r6/net.rs":"e641379a7004ded90413b084504468148ecdbea4f753cbca83a4d22698cd7bab","src/mips64r6/netlink.rs":"18f139573337be18fb9bd56de4d0bd8af5c80828cdf68ef68751c18dcb39c761","src/mips64r6/prctl.rs":"a8d9ae240ce582d7b66e13937b99df73c7247ce9f69bfdd12109903d7c6dfb0e","src/mips64r6/system.rs":"95805c533a8eb8f53c28f138e6a2d12064681cc9db55d3042ee748c655a5d7cd","src/powerpc/errno.rs":"db283e5ea7fb63e0f57acb241e6471a951b4218660c01ca37b80be9a53629b92","src/powerpc/general.rs":"7940ad742585d501f4742af51c6310ecf651863a8aaa0305193e9c8ee07aca90","src/powerpc/if_ether.rs":"56ab5fbf8c9d0dd0654412fabdca6759cbb421a876e5cebe2fec10e25728b55c","src/powerpc/io_uring.rs":"38ead79180c96e8af69929dacbc36e8cfbccec96875c61f094e531e6860639db","src/powerpc/ioctl.rs":"513a1dda33b2cd6c57212263c1bf0d8d443e54af6efe75e938fd700c1ca2b630","src/powerpc/net.rs":"b0228b15161fb750596d6e7e8e612381d9cf2acfed208715b93e8bb4b3340dc7","src/powerpc/netlink.rs":"4f10870fbd23de17efd4cba6d5a40ba85564effc5d0b71f9d7f928a42cb77b20","src/powerpc/prctl.rs":"f236987bc8ae993ab2b0e88b2eacbae51eee4da170ac075552070a76c717d803","src/powerpc/system.rs":"3e01e5e145adb87263f04c9e053faac0c0758689fd32917d2c7c2eec1d89f9e6","src/powerpc64/errno.rs":"db283e5ea7fb63e0f57acb241e6471a951b4218660c01ca37b80be9a53629b92","src/powerpc64/general.rs":"7862eb3dfac845331b624b3322bdeb3441bb86e914719e125dd5dc7b3860db43","src/powerpc64/if_ether.rs":"15e12d56b1367cb5c9d8fd1b9995acf1429a923bf603698bd732efe1acc30cd6","src/powerpc64/io_uring.rs":"50018e504d78c584beaec3b1a6d477d30d566d25cb1a40b0a2adfb23d726674f","src/powerpc64/ioctl.rs":"513a1dda33b2cd6c57212263c1bf0d8d443e54af6efe75e938fd700c1ca2b630","src/powerpc64/net.rs":"0a1468b8a270470a619e492fd6c50c59ea9eeaccd1c7827a0a0d55a0ae981cd4","src/powerpc64/netlink.rs":"352a06995f7de6e4fc1c2ff54c1eccb93a3d833a923e834ec75c6a4d30ea5051","src/powerpc64/prctl.rs":"1fcccc5b6dac472a30b7701b5c9e436c238410077cfe158d600b51d55bcc074a","src/powerpc64/system.rs":"500116b7613a504ebad028cec1ba37323310e29864d885ae62191ccb1f86d333","src/riscv32/errno.rs":"db283e5ea7fb63e0f57acb241e6471a951b4218660c01ca37b80be9a53629b92","src/riscv32/general.rs":"16ffe747a8f75ac6594dc7afddef4fbb89735da50af9f19f152fd2f04b509463","src/riscv32/if_ether.rs":"aac7a069000195b9b18c6d25b2d7c338efb1062347a84e31cda7c93de374b3c6","src/riscv32/io_uring.rs":"5c67dde8fdb3641407d4ebd744171606b82596176343fe6766afd3220eda2ab1","src/riscv32/ioctl.rs":"b2a4c7d649b18a4d2a1142400de687d48c195dcf8a86b58ac261413c33809d7b","src/riscv32/net.rs":"2796ca3744e82cecd816b4d1b1fba0bcb389fbc4603e0af7b6cdc562c666b512","src/riscv32/netlink.rs":"9fc99e88df0efc15d39b397c9d653c32b4729e31a2434e730435fbdfcb362da4","src/riscv32/prctl.rs":"8df2f33387d5b4865d9417f796cc4d43b3cf549cfa41d7ce7d41dd367ed8b6c9","src/riscv32/system.rs":"a2913685b359e60bbfae413b89a6fd37ea38fa448f980ffadef42d227b33ada5","src/riscv64/errno.rs":"db283e5ea7fb63e0f57acb241e6471a951b4218660c01ca37b80be9a53629b92","src/riscv64/general.rs":"8ec4907ac81b62e21451731a468e5f4fe7a37a46d80c56b33e0969d2d059d442","src/riscv64/if_ether.rs":"a7b0918afc9dbf8e79490f83a809e4bd563af20ab2b3432d58b763ff31418daf","src/riscv64/io_uring.rs":"ef851913c86bc2d629048e781edc76b59c63e659f8bd4bcd7fa7ff982186ed6d","src/riscv64/ioctl.rs":"6f631e0ac37f2c2398168683a1523d1559b85369ffe4cdcc284ffe7455672c18","src/riscv64/net.rs":"21add3f1bfa5898d9a5ef91342f6cd94ad4585df6525b9a4cf6cdf743345a9c7","src/riscv64/netlink.rs":"789357343b94276e6f8fc8f3a32f06f3d3efd464c7850b2568dc609a49d1f305","src/riscv64/prctl.rs":"624e4d3b8f3b4f1d6dcb1540c124ed03ce47f0580aa3425c0baed431dcd267ea","src/riscv64/system.rs":"4cfcd4c28481b9ff5fc0330d5c713d637d3615c0184830d3a4391882eaed68f5","src/s390x/errno.rs":"db283e5ea7fb63e0f57acb241e6471a951b4218660c01ca37b80be9a53629b92","src/s390x/general.rs":"687f6e3d4502d31aaec08a41335b6a368f0949049875d939065a66df86e06b8a","src/s390x/if_ether.rs":"2a6b2132be1aebe126eb64ea230a82c2ab18433ece37226c9dacd81392ad6ca2","src/s390x/io_uring.rs":"57790b4ce46a4a2a87a329ff935033dfb430117bcc2154fa066c5d681f115319","src/s390x/ioctl.rs":"f806407c91520bc994c7cd638576686710700a4cfa30c8ca3f81d55ce1d6ecdd","src/s390x/net.rs":"3f89cf2040475eb446daa3f54b5cd016ca8d2d3966f02efb3f0f2f425ccc7adb","src/s390x/netlink.rs":"c3c11102a55d15dfb534d748c8bc8ece58c9d56170b6afe07d1f2cc783fd6372","src/s390x/prctl.rs":"6fe9f5349f9a694b391f309f208235c1d4669430d3f051ef64467576e91df7a1","src/s390x/system.rs":"f68e8afbd02bc87a8fec2cae4e367f296873f2c1a651032da4ccc4f1c0ed4670","src/sparc/errno.rs":"b3c5e1a6c8378d613c6ef3dd44e2199ea7455da65e83d6bb19582a79de880f80","src/sparc/general.rs":"a38a371e8ceeecc4384999b4cc8ee6d65a35a20542c96c62e04c24b2b2953858","src/sparc/if_ether.rs":"c574c6d1ea11a8bb213b18928fe2d342c897d8ff04458991a5192eb401fbbc57","src/sparc/io_uring.rs":"d813aabc93f383c8522773ed431209627d810c78bcdb4dae931a702aae55e09f","src/sparc/ioctl.rs":"b2a4c7d649b18a4d2a1142400de687d48c195dcf8a86b58ac261413c33809d7b","src/sparc/net.rs":"00115a0deec75249c34bf61c76d4a95181be21ac3a1b5200875186d5ea501dac","src/sparc/netlink.rs":"0f176c24de7b2b19ac16dd95625947b8047d48bc7b871e12a3acd31f8e97c6f5","src/sparc/prctl.rs":"5f5686fe04d8cc5e746d789340331095044f244c123ecf1468dcb089bbb931cd","src/sparc/system.rs":"6f1f8ce9978693845621880031ac4805f00027315a691cfe1d466703c7a96e8d","src/sparc64/errno.rs":"b3c5e1a6c8378d613c6ef3dd44e2199ea7455da65e83d6bb19582a79de880f80","src/sparc64/general.rs":"d4138f0e663833811365fdc2e1008525df0f21044b5e31ab80d97d63fcb9f45f","src/sparc64/if_ether.rs":"e51661cb54922c3c01853617a61b3d141768adf5b94162c4aefb326d31ef55f5","src/sparc64/io_uring.rs":"688f4678c259eb940aa0216c0183843d436b918d214e13bed56a38ddb55132db","src/sparc64/ioctl.rs":"b2a4c7d649b18a4d2a1142400de687d48c195dcf8a86b58ac261413c33809d7b","src/sparc64/net.rs":"e1b51c9efe4a00b645100f2b4aa6f2349a50627521fa020370b1bf8ab0b3a575","src/sparc64/netlink.rs":"7cec2a77af7ec17cad96d63027fd4a9164f0e6503f2e6cc2a99e79aa1bba3147","src/sparc64/prctl.rs":"ff897312b99274ce4eefecccc9797e34accc69efce1299712ab631e9542cb8ca","src/sparc64/system.rs":"becb2e706ed6df77860a2a3884b28181dca606db22fcd604a8a1803f937e8baf","src/x32/errno.rs":"db283e5ea7fb63e0f57acb241e6471a951b4218660c01ca37b80be9a53629b92","src/x32/general.rs":"c2aeaf3096d559a86d3f72e0ec4a91245edfce35e85c51b50d13e115ec357974","src/x32/if_ether.rs":"859047581be4a3ae923b88516e86230a4f9a447a5203285dd8bcc539038c5c4f","src/x32/io_uring.rs":"40834d29cf819e43a23f9a2e075e2ea0c001be817f7200aa059c24eae6d29123","src/x32/ioctl.rs":"085227ec906237903b5e8b2e90b80fd078ddb4f9e44bbd6c9bee54ea7d5d6b1a","src/x32/net.rs":"e2d77e5bbae1fb298e48382204db55e4e49de2039369e3b2b77097029006c9d1","src/x32/netlink.rs":"f74042f6cf0eabccfa6b8008a89ee7ab347fb7eaa89499757a786b13b2403982","src/x32/prctl.rs":"2d1eb6873dc5b72a8252f12e695d98a045e01026f730302a6515f53a394bba7c","src/x32/system.rs":"69c125aea6b21f2c4981f3386602283a691524671fef1da7d67de3b67fffdc42","src/x86/errno.rs":"db283e5ea7fb63e0f57acb241e6471a951b4218660c01ca37b80be9a53629b92","src/x86/general.rs":"a9b002ea136dabb9fd1c489c999cd1bfeca62490202aab095221fc70c2b6e30e","src/x86/if_ether.rs":"3873beb1f57bdcc52da345608c5deda5937d7b92b114b414ce6161784173b925","src/x86/io_uring.rs":"3f60400dfc11a5eafa5a54466f7f9ca74a63219feda2278c388529bf40c0a6a3","src/x86/ioctl.rs":"8dd0afaa7c3017c3866e579705699be75acc1a095694232b2903a12b3c07a770","src/x86/net.rs":"c79f443ab6585f81a71eff3350700ece82098264206eb79f78714153d6e43529","src/x86/netlink.rs":"2f98b8c0349c2d3d538164e4d06c28fa1fb9308f7691aa097526ce2fb3ac176f","src/x86/prctl.rs":"5477c74fec958d9f9d2028f58e95657840ead28445956e53fe0894e45922f8a5","src/x86/system.rs":"9aca94a4a553e09e6d2d43741fb8c120c05a193822e850951dc469bbd89cc703","src/x86_64/errno.rs":"db283e5ea7fb63e0f57acb241e6471a951b4218660c01ca37b80be9a53629b92","src/x86_64/general.rs":"f0c763abb8d7e7bd594c674d2774b272844829ecee4e3ed42932004616a2380e","src/x86_64/if_ether.rs":"feb5362d90fbd5113b6f1f22fcc77a7b3bb7c8f5081be7eacb2e270d2f24a293","src/x86_64/io_uring.rs":"6c008c59b6905b7872b788e30d546efa3b5bb03a0fe17e33b90bfc8beec23f29","src/x86_64/ioctl.rs":"085227ec906237903b5e8b2e90b80fd078ddb4f9e44bbd6c9bee54ea7d5d6b1a","src/x86_64/net.rs":"0f81db11e3497486f0d2022a8302716816d2442bf7ffd25fa88a25a9bdc1ca83","src/x86_64/netlink.rs":"d47b8b117007b1c29db325dad68ed1b92562b98f90916b1b192f57a935a98038","src/x86_64/prctl.rs":"6d0f63fff8d76cc2f4678f38e40a68d072d7da4094d5217ce92872370bb4df9b","src/x86_64/system.rs":"6a415f104e7dd34829b36c19ad89e0cfcfbc69a846c87f81e202411386d46966"},"package":"da2479e8c062e40bf0066ffa0bc823de0a9368974af99c9f6df941d2c231e03f"} \ No newline at end of file +{"files":{"CODE_OF_CONDUCT.md":"ccd9e538ce44713a2486cc8e4c01b8c8b846d1ccff15de728d8d6fa9a7f846cd","COPYRIGHT":"3290ae0fbc9ddb77d2239121d710f0bb9d31b3b4744e6d97fe01e652b4c1870b","Cargo.toml":"3f7fbc8067889a39c33eb48ba790863395c1825ec6eb1ea53fe13eb00948d84b","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-Apache-2.0_WITH_LLVM-exception":"268872b9816f90fd8e85db5a28d33f8150ebb8dd016653fb39ef1f94f2686bc5","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","ORG_CODE_OF_CONDUCT.md":"a62b69bf86e605ee1bcbb2f0a12ba79e4cebb6983a7b6491949750aecc4f2178","README.md":"3d4ae2ec9429adfd329b4506f7ca6faa84dca30d1c3b416f8f4e6f57bdb3aa96","src/aarch64/errno.rs":"db283e5ea7fb63e0f57acb241e6471a951b4218660c01ca37b80be9a53629b92","src/aarch64/general.rs":"a5be5de0f98244a28265c46588c324ba3f8dee51717e6222a1241b10a9ac593d","src/aarch64/if_ether.rs":"f558bfec1f5e80235db79f507e4afd3120647a5caddf17a87b7ad5540e5c1462","src/aarch64/io_uring.rs":"9ce4c9005b5b99e041b9d58be6866367605e4bee1e30a7096235cb234ed73e1b","src/aarch64/ioctl.rs":"f83af7f7cab6611c9f316b2289998d3276d844ac8f96111bc65f6c3340c3301a","src/aarch64/net.rs":"b88bcacd7cd153d417cb3adb176bbc441dda1e90880e53d89404439adf47ab88","src/aarch64/netlink.rs":"f6642310b8bd37b5775ba1a52cfe638beddd7c880f8dfacab62c3180255fb75f","src/aarch64/prctl.rs":"a80e2f89aa978210d980538e1d9c5b922bb073d118ee51b1f14c1f397c7cd576","src/aarch64/system.rs":"851a95c0d1b76782970a28c373a313954eea0db35f6ebce562e6047095f587c4","src/arm/errno.rs":"db283e5ea7fb63e0f57acb241e6471a951b4218660c01ca37b80be9a53629b92","src/arm/general.rs":"eb33bd0c5835ecf0a33e582e8460f056ef79d9a2fca06c7607568ed0605d1391","src/arm/if_ether.rs":"3873beb1f57bdcc52da345608c5deda5937d7b92b114b414ce6161784173b925","src/arm/io_uring.rs":"5e2e254d5853ed30568e17fab184f8cc458607465d19dcee6c87ca1b565d6d2d","src/arm/ioctl.rs":"54cb9bdc5fe4ee7cff30e087bb0d04f1d811b55be7604bb056387f859120935a","src/arm/net.rs":"3192a24c15f0f4e4d856678fd05e82d7ae3585921f6243e907c539d603873896","src/arm/netlink.rs":"2f98b8c0349c2d3d538164e4d06c28fa1fb9308f7691aa097526ce2fb3ac176f","src/arm/prctl.rs":"5477c74fec958d9f9d2028f58e95657840ead28445956e53fe0894e45922f8a5","src/arm/system.rs":"9aca94a4a553e09e6d2d43741fb8c120c05a193822e850951dc469bbd89cc703","src/lib.rs":"e79affd8f9f4bc3a7bd9c177d10580956983df7909e126d01250e34dd40d03e3","src/loongarch64/errno.rs":"db283e5ea7fb63e0f57acb241e6471a951b4218660c01ca37b80be9a53629b92","src/loongarch64/general.rs":"95fbc2507feb167109ce386f939e72b8c5f5a16c18f8ab0389a74516c3ca288e","src/loongarch64/if_ether.rs":"a7b0918afc9dbf8e79490f83a809e4bd563af20ab2b3432d58b763ff31418daf","src/loongarch64/io_uring.rs":"ef851913c86bc2d629048e781edc76b59c63e659f8bd4bcd7fa7ff982186ed6d","src/loongarch64/ioctl.rs":"6f631e0ac37f2c2398168683a1523d1559b85369ffe4cdcc284ffe7455672c18","src/loongarch64/net.rs":"50ef111f314db8683e0f2f845f930e7e2209b97a17aa3e9fa774832ee9ef0599","src/loongarch64/netlink.rs":"789357343b94276e6f8fc8f3a32f06f3d3efd464c7850b2568dc609a49d1f305","src/loongarch64/prctl.rs":"624e4d3b8f3b4f1d6dcb1540c124ed03ce47f0580aa3425c0baed431dcd267ea","src/loongarch64/system.rs":"4cfcd4c28481b9ff5fc0330d5c713d637d3615c0184830d3a4391882eaed68f5","src/mips/errno.rs":"9ab1ed2bf371a27401745c2a6f9692f7e66dfd481d032cb40a354826d394ea8e","src/mips/general.rs":"ff31df33aa8a2ff9c1fdca63224130d2503bc3a1ff75bd86c16562069df4e9dd","src/mips/if_ether.rs":"1ecdc654cb3eda633bb7192829b1001a0a5ae5a126110b4208bbee5b41f87f5e","src/mips/io_uring.rs":"c69479bb1f862febe78e0989745c202146aaef7e8ceaa0d7bf291af584748992","src/mips/ioctl.rs":"f7464d2cd0548ab4735a1ca8deba47f13ea0946a9bf86adfec1a77feb3a0f475","src/mips/net.rs":"89b8cc80411dadd23843b037ceb06cef47af1e57244d974a805c3914d7ffa4aa","src/mips/netlink.rs":"5045dece259abaa5b5974500a20a9325e4cd6eb87c344dd7448056dff469994f","src/mips/prctl.rs":"cd59615adf6f561ef6c542df59cf25f75877693ca1c4c489f5e460eb7e798d4d","src/mips/system.rs":"acbc69a1fe7299860f8bd142bc2ff5595a410e1528994139062fc680d1a87e71","src/mips32r6/errno.rs":"9ab1ed2bf371a27401745c2a6f9692f7e66dfd481d032cb40a354826d394ea8e","src/mips32r6/general.rs":"a8cfa4b85043689e4bf124304e90d9dc37c669fb89bc4c11e3b73c82861be11e","src/mips32r6/if_ether.rs":"1ecdc654cb3eda633bb7192829b1001a0a5ae5a126110b4208bbee5b41f87f5e","src/mips32r6/io_uring.rs":"aa3345e6790b5870a73ae15ccb54d34490549de9ddcecca78f33ab2762633c88","src/mips32r6/ioctl.rs":"f7464d2cd0548ab4735a1ca8deba47f13ea0946a9bf86adfec1a77feb3a0f475","src/mips32r6/net.rs":"2cba812b3eeca4c09490a9c1d14c03dbb0c097d0ddd6e7b7cc29589a8bba24e8","src/mips32r6/netlink.rs":"cfeb63530e44ad1289222cab547646eca7c5d334d26266aa4d04292caa02d69f","src/mips32r6/prctl.rs":"59d0c9560727a6aa2bc88ac4a1085bd1c4716b362f3ad01754de2eb7c70bc14e","src/mips32r6/system.rs":"acbc69a1fe7299860f8bd142bc2ff5595a410e1528994139062fc680d1a87e71","src/mips64/errno.rs":"9ab1ed2bf371a27401745c2a6f9692f7e66dfd481d032cb40a354826d394ea8e","src/mips64/general.rs":"c7eaf11b39338a76aa1647a2ca90fbb8657e9811558aa831ad979da56e5a6a60","src/mips64/if_ether.rs":"6d24518acba5bc8fa2a775d039ed9594de8349d6028621134626ccaa8ea18bcd","src/mips64/io_uring.rs":"18bd5d96c53aff44f4a37a71f16fa12c11b7c934b395bf841e47d98283146a50","src/mips64/ioctl.rs":"39f3276ec6f36ba78f5635bd418310b21bc228902d4da889fa01094c26f9b57d","src/mips64/net.rs":"f979c44d7d0bd12847664a2864b2c38bfd8f5b90826e9e31d5c6e64ba6365859","src/mips64/netlink.rs":"18f139573337be18fb9bd56de4d0bd8af5c80828cdf68ef68751c18dcb39c761","src/mips64/prctl.rs":"a8d9ae240ce582d7b66e13937b99df73c7247ce9f69bfdd12109903d7c6dfb0e","src/mips64/system.rs":"95805c533a8eb8f53c28f138e6a2d12064681cc9db55d3042ee748c655a5d7cd","src/mips64r6/errno.rs":"9ab1ed2bf371a27401745c2a6f9692f7e66dfd481d032cb40a354826d394ea8e","src/mips64r6/general.rs":"aa6ecb5c25c09c512f51ae8dda303e7c87d1d9997f5975e0dd22dcbd3e151111","src/mips64r6/if_ether.rs":"6d24518acba5bc8fa2a775d039ed9594de8349d6028621134626ccaa8ea18bcd","src/mips64r6/io_uring.rs":"ee4dfec06270f6689c07d2583d3cd1bac4565cea0e257d9a01187b80ed222072","src/mips64r6/ioctl.rs":"39f3276ec6f36ba78f5635bd418310b21bc228902d4da889fa01094c26f9b57d","src/mips64r6/net.rs":"15cf366647af9739797dc9ffb3da317c1ccda8e51d0bf51e7bbe4bb9219eab90","src/mips64r6/netlink.rs":"ae4029f03ab30a99f33747f54f34301170323e86aa0c0126606c9c0f637bb926","src/mips64r6/prctl.rs":"f4e413984133a53b8e499aa804cc4216b0b94dcf4dad85cfa66f6811747bc21c","src/mips64r6/system.rs":"95805c533a8eb8f53c28f138e6a2d12064681cc9db55d3042ee748c655a5d7cd","src/powerpc/errno.rs":"db283e5ea7fb63e0f57acb241e6471a951b4218660c01ca37b80be9a53629b92","src/powerpc/general.rs":"f88e1b68f45f544c80b639d0aa8b9dba1ab79f4a0c47f3f65ece335cf36df8c7","src/powerpc/if_ether.rs":"56ab5fbf8c9d0dd0654412fabdca6759cbb421a876e5cebe2fec10e25728b55c","src/powerpc/io_uring.rs":"38ead79180c96e8af69929dacbc36e8cfbccec96875c61f094e531e6860639db","src/powerpc/ioctl.rs":"513a1dda33b2cd6c57212263c1bf0d8d443e54af6efe75e938fd700c1ca2b630","src/powerpc/net.rs":"86d206a03f980402d580fd872c26c2156acf6ea64cde4cc9379201a36bd3330a","src/powerpc/netlink.rs":"4f10870fbd23de17efd4cba6d5a40ba85564effc5d0b71f9d7f928a42cb77b20","src/powerpc/prctl.rs":"f236987bc8ae993ab2b0e88b2eacbae51eee4da170ac075552070a76c717d803","src/powerpc/system.rs":"3e01e5e145adb87263f04c9e053faac0c0758689fd32917d2c7c2eec1d89f9e6","src/powerpc64/errno.rs":"db283e5ea7fb63e0f57acb241e6471a951b4218660c01ca37b80be9a53629b92","src/powerpc64/general.rs":"87d30f8909dc64b9fa914139db7f0aad8544015b197f2113807a7baa31b1eacf","src/powerpc64/if_ether.rs":"15e12d56b1367cb5c9d8fd1b9995acf1429a923bf603698bd732efe1acc30cd6","src/powerpc64/io_uring.rs":"50018e504d78c584beaec3b1a6d477d30d566d25cb1a40b0a2adfb23d726674f","src/powerpc64/ioctl.rs":"513a1dda33b2cd6c57212263c1bf0d8d443e54af6efe75e938fd700c1ca2b630","src/powerpc64/net.rs":"70622d7df4f2c89941eee6b629e77b09c3b69d7b4b5ad40b1425843a470ab8cd","src/powerpc64/netlink.rs":"352a06995f7de6e4fc1c2ff54c1eccb93a3d833a923e834ec75c6a4d30ea5051","src/powerpc64/prctl.rs":"1fcccc5b6dac472a30b7701b5c9e436c238410077cfe158d600b51d55bcc074a","src/powerpc64/system.rs":"500116b7613a504ebad028cec1ba37323310e29864d885ae62191ccb1f86d333","src/riscv32/errno.rs":"db283e5ea7fb63e0f57acb241e6471a951b4218660c01ca37b80be9a53629b92","src/riscv32/general.rs":"7bd0740d489d74f2e4af6cf17ff4c5a0201bb8b1e074c0ef51c2af2a54a46243","src/riscv32/if_ether.rs":"aac7a069000195b9b18c6d25b2d7c338efb1062347a84e31cda7c93de374b3c6","src/riscv32/io_uring.rs":"5c67dde8fdb3641407d4ebd744171606b82596176343fe6766afd3220eda2ab1","src/riscv32/ioctl.rs":"b2a4c7d649b18a4d2a1142400de687d48c195dcf8a86b58ac261413c33809d7b","src/riscv32/net.rs":"6df28547fc867f3e66dab6561e494573a416add67c1968ec2371c43d8e28da86","src/riscv32/netlink.rs":"9fc99e88df0efc15d39b397c9d653c32b4729e31a2434e730435fbdfcb362da4","src/riscv32/prctl.rs":"8df2f33387d5b4865d9417f796cc4d43b3cf549cfa41d7ce7d41dd367ed8b6c9","src/riscv32/system.rs":"a2913685b359e60bbfae413b89a6fd37ea38fa448f980ffadef42d227b33ada5","src/riscv64/errno.rs":"db283e5ea7fb63e0f57acb241e6471a951b4218660c01ca37b80be9a53629b92","src/riscv64/general.rs":"bb8edd39188ced7f8e3f404c7559af11e1d80c8f18126e83ce03272d89e8ef0d","src/riscv64/if_ether.rs":"a7b0918afc9dbf8e79490f83a809e4bd563af20ab2b3432d58b763ff31418daf","src/riscv64/io_uring.rs":"ef851913c86bc2d629048e781edc76b59c63e659f8bd4bcd7fa7ff982186ed6d","src/riscv64/ioctl.rs":"6f631e0ac37f2c2398168683a1523d1559b85369ffe4cdcc284ffe7455672c18","src/riscv64/net.rs":"50ef111f314db8683e0f2f845f930e7e2209b97a17aa3e9fa774832ee9ef0599","src/riscv64/netlink.rs":"789357343b94276e6f8fc8f3a32f06f3d3efd464c7850b2568dc609a49d1f305","src/riscv64/prctl.rs":"624e4d3b8f3b4f1d6dcb1540c124ed03ce47f0580aa3425c0baed431dcd267ea","src/riscv64/system.rs":"4cfcd4c28481b9ff5fc0330d5c713d637d3615c0184830d3a4391882eaed68f5","src/s390x/errno.rs":"db283e5ea7fb63e0f57acb241e6471a951b4218660c01ca37b80be9a53629b92","src/s390x/general.rs":"f7fb19059aca9182d4cc97a807fbe1727b4082791e316c63365d115803948d18","src/s390x/if_ether.rs":"2a6b2132be1aebe126eb64ea230a82c2ab18433ece37226c9dacd81392ad6ca2","src/s390x/io_uring.rs":"57790b4ce46a4a2a87a329ff935033dfb430117bcc2154fa066c5d681f115319","src/s390x/ioctl.rs":"f806407c91520bc994c7cd638576686710700a4cfa30c8ca3f81d55ce1d6ecdd","src/s390x/net.rs":"28abfbe5beca5dff444ed226f90ea9e37e2f7bb5c12e564c1efb59600322d773","src/s390x/netlink.rs":"c3c11102a55d15dfb534d748c8bc8ece58c9d56170b6afe07d1f2cc783fd6372","src/s390x/prctl.rs":"6fe9f5349f9a694b391f309f208235c1d4669430d3f051ef64467576e91df7a1","src/s390x/system.rs":"f68e8afbd02bc87a8fec2cae4e367f296873f2c1a651032da4ccc4f1c0ed4670","src/sparc/errno.rs":"b3c5e1a6c8378d613c6ef3dd44e2199ea7455da65e83d6bb19582a79de880f80","src/sparc/general.rs":"13c5b4e0c6f9f2cfb9c062de637f88ff0b9114aaf940278cd7b4161b3d52c0c4","src/sparc/if_ether.rs":"c574c6d1ea11a8bb213b18928fe2d342c897d8ff04458991a5192eb401fbbc57","src/sparc/io_uring.rs":"d813aabc93f383c8522773ed431209627d810c78bcdb4dae931a702aae55e09f","src/sparc/ioctl.rs":"b2a4c7d649b18a4d2a1142400de687d48c195dcf8a86b58ac261413c33809d7b","src/sparc/net.rs":"aee68381686374b66f05b33d2b8235530af957831121c17c4583caef2e515855","src/sparc/netlink.rs":"0f176c24de7b2b19ac16dd95625947b8047d48bc7b871e12a3acd31f8e97c6f5","src/sparc/prctl.rs":"5f5686fe04d8cc5e746d789340331095044f244c123ecf1468dcb089bbb931cd","src/sparc/system.rs":"6f1f8ce9978693845621880031ac4805f00027315a691cfe1d466703c7a96e8d","src/sparc64/errno.rs":"b3c5e1a6c8378d613c6ef3dd44e2199ea7455da65e83d6bb19582a79de880f80","src/sparc64/general.rs":"a026441b0dbfc2dd3138bd7fc15c99a0843b13ff194a610dbe97498d068ef769","src/sparc64/if_ether.rs":"e51661cb54922c3c01853617a61b3d141768adf5b94162c4aefb326d31ef55f5","src/sparc64/io_uring.rs":"688f4678c259eb940aa0216c0183843d436b918d214e13bed56a38ddb55132db","src/sparc64/ioctl.rs":"b2a4c7d649b18a4d2a1142400de687d48c195dcf8a86b58ac261413c33809d7b","src/sparc64/net.rs":"a9ee3df43212c6f5016fd59b8fcf28b8b49016b4e143e2de97b7b60093f326d5","src/sparc64/netlink.rs":"7cec2a77af7ec17cad96d63027fd4a9164f0e6503f2e6cc2a99e79aa1bba3147","src/sparc64/prctl.rs":"ff897312b99274ce4eefecccc9797e34accc69efce1299712ab631e9542cb8ca","src/sparc64/system.rs":"becb2e706ed6df77860a2a3884b28181dca606db22fcd604a8a1803f937e8baf","src/x32/errno.rs":"db283e5ea7fb63e0f57acb241e6471a951b4218660c01ca37b80be9a53629b92","src/x32/general.rs":"ab1327fc01e9529abded9429e6720ec84b441744b68898f1a1cf8ce48d7de85d","src/x32/if_ether.rs":"859047581be4a3ae923b88516e86230a4f9a447a5203285dd8bcc539038c5c4f","src/x32/io_uring.rs":"40834d29cf819e43a23f9a2e075e2ea0c001be817f7200aa059c24eae6d29123","src/x32/ioctl.rs":"085227ec906237903b5e8b2e90b80fd078ddb4f9e44bbd6c9bee54ea7d5d6b1a","src/x32/net.rs":"c3133d3ac4cafff36bf8e0e374a788bd6aae6b36d0cd28be0cc1ee140529962a","src/x32/netlink.rs":"f74042f6cf0eabccfa6b8008a89ee7ab347fb7eaa89499757a786b13b2403982","src/x32/prctl.rs":"2d1eb6873dc5b72a8252f12e695d98a045e01026f730302a6515f53a394bba7c","src/x32/system.rs":"69c125aea6b21f2c4981f3386602283a691524671fef1da7d67de3b67fffdc42","src/x86/errno.rs":"db283e5ea7fb63e0f57acb241e6471a951b4218660c01ca37b80be9a53629b92","src/x86/general.rs":"8f48e3f5136a3aadf0282674937c4748dabc59dbb3cce4b9f2f73f8d2d25d52f","src/x86/if_ether.rs":"3873beb1f57bdcc52da345608c5deda5937d7b92b114b414ce6161784173b925","src/x86/io_uring.rs":"3f60400dfc11a5eafa5a54466f7f9ca74a63219feda2278c388529bf40c0a6a3","src/x86/ioctl.rs":"8dd0afaa7c3017c3866e579705699be75acc1a095694232b2903a12b3c07a770","src/x86/net.rs":"3192a24c15f0f4e4d856678fd05e82d7ae3585921f6243e907c539d603873896","src/x86/netlink.rs":"2f98b8c0349c2d3d538164e4d06c28fa1fb9308f7691aa097526ce2fb3ac176f","src/x86/prctl.rs":"5477c74fec958d9f9d2028f58e95657840ead28445956e53fe0894e45922f8a5","src/x86/system.rs":"9aca94a4a553e09e6d2d43741fb8c120c05a193822e850951dc469bbd89cc703","src/x86_64/errno.rs":"db283e5ea7fb63e0f57acb241e6471a951b4218660c01ca37b80be9a53629b92","src/x86_64/general.rs":"24f147e5800b36d49645997571cffab9d6e562c4b317000278f743dc41e3ef71","src/x86_64/if_ether.rs":"feb5362d90fbd5113b6f1f22fcc77a7b3bb7c8f5081be7eacb2e270d2f24a293","src/x86_64/io_uring.rs":"6c008c59b6905b7872b788e30d546efa3b5bb03a0fe17e33b90bfc8beec23f29","src/x86_64/ioctl.rs":"085227ec906237903b5e8b2e90b80fd078ddb4f9e44bbd6c9bee54ea7d5d6b1a","src/x86_64/net.rs":"d0f08df0ce735b8c75b6a7f466b97a199330395ccc04e8a8d5899f8426a9e798","src/x86_64/netlink.rs":"d47b8b117007b1c29db325dad68ed1b92562b98f90916b1b192f57a935a98038","src/x86_64/prctl.rs":"6d0f63fff8d76cc2f4678f38e40a68d072d7da4094d5217ce92872370bb4df9b","src/x86_64/system.rs":"6a415f104e7dd34829b36c19ad89e0cfcfbc69a846c87f81e202411386d46966"},"package":"57bcfdad1b858c2db7c38303a6d2ad4dfaf5eb53dfeb0910128b2c26d6158503"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/linux-raw-sys/Cargo.toml temporalio-1.3.0/vendor/linux-raw-sys/Cargo.toml --- temporalio-1.3.0/vendor/linux-raw-sys/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/linux-raw-sys/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -13,7 +13,7 @@ edition = "2021" rust-version = "1.63" name = "linux-raw-sys" -version = "0.4.10" +version = "0.4.5" authors = ["Dan Gohman "] exclude = [ "/gen", @@ -36,11 +36,6 @@ "default", "ioctl", "netlink", - "io_uring", - "if_ether", - "net", - "prctl", - "elf", ] targets = [ "x86_64-unknown-linux-gnu", @@ -68,7 +63,6 @@ "general", "errno", ] -elf = [] errno = [] general = [] if_ether = [] diff -Nru temporalio-1.3.0/vendor/linux-raw-sys/src/aarch64/general.rs temporalio-1.3.0/vendor/linux-raw-sys/src/aarch64/general.rs --- temporalio-1.3.0/vendor/linux-raw-sys/src/aarch64/general.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/linux-raw-sys/src/aarch64/general.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1570,19 +1570,6 @@ pub const GRND_NONBLOCK: u32 = 1; pub const GRND_RANDOM: u32 = 2; pub const GRND_INSECURE: u32 = 4; -pub const LINUX_REBOOT_MAGIC1: u32 = 4276215469; -pub const LINUX_REBOOT_MAGIC2: u32 = 672274793; -pub const LINUX_REBOOT_MAGIC2A: u32 = 85072278; -pub const LINUX_REBOOT_MAGIC2B: u32 = 369367448; -pub const LINUX_REBOOT_MAGIC2C: u32 = 537993216; -pub const LINUX_REBOOT_CMD_RESTART: u32 = 19088743; -pub const LINUX_REBOOT_CMD_HALT: u32 = 3454992675; -pub const LINUX_REBOOT_CMD_CAD_ON: u32 = 2309737967; -pub const LINUX_REBOOT_CMD_CAD_OFF: u32 = 0; -pub const LINUX_REBOOT_CMD_POWER_OFF: u32 = 1126301404; -pub const LINUX_REBOOT_CMD_RESTART2: u32 = 2712847316; -pub const LINUX_REBOOT_CMD_SW_SUSPEND: u32 = 3489725666; -pub const LINUX_REBOOT_CMD_KEXEC: u32 = 1163412803; pub const ITIMER_REAL: u32 = 0; pub const ITIMER_VIRTUAL: u32 = 1; pub const ITIMER_PROF: u32 = 2; diff -Nru temporalio-1.3.0/vendor/linux-raw-sys/src/aarch64/net.rs temporalio-1.3.0/vendor/linux-raw-sys/src/aarch64/net.rs --- temporalio-1.3.0/vendor/linux-raw-sys/src/aarch64/net.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/linux-raw-sys/src/aarch64/net.rs 2023-10-30 19:40:00.000000000 +0000 @@ -476,255 +476,6 @@ } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct sync_serial_settings { -pub clock_rate: crate::ctypes::c_uint, -pub clock_type: crate::ctypes::c_uint, -pub loopback: crate::ctypes::c_ushort, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct te1_settings { -pub clock_rate: crate::ctypes::c_uint, -pub clock_type: crate::ctypes::c_uint, -pub loopback: crate::ctypes::c_ushort, -pub slot_map: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct raw_hdlc_proto { -pub encoding: crate::ctypes::c_ushort, -pub parity: crate::ctypes::c_ushort, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fr_proto { -pub t391: crate::ctypes::c_uint, -pub t392: crate::ctypes::c_uint, -pub n391: crate::ctypes::c_uint, -pub n392: crate::ctypes::c_uint, -pub n393: crate::ctypes::c_uint, -pub lmi: crate::ctypes::c_ushort, -pub dce: crate::ctypes::c_ushort, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fr_proto_pvc { -pub dlci: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fr_proto_pvc_info { -pub dlci: crate::ctypes::c_uint, -pub master: [crate::ctypes::c_char; 16usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct cisco_proto { -pub interval: crate::ctypes::c_uint, -pub timeout: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct x25_hdlc_proto { -pub dce: crate::ctypes::c_ushort, -pub modulo: crate::ctypes::c_uint, -pub window: crate::ctypes::c_uint, -pub t1: crate::ctypes::c_uint, -pub t2: crate::ctypes::c_uint, -pub n2: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ifmap { -pub mem_start: crate::ctypes::c_ulong, -pub mem_end: crate::ctypes::c_ulong, -pub base_addr: crate::ctypes::c_ushort, -pub irq: crate::ctypes::c_uchar, -pub dma: crate::ctypes::c_uchar, -pub port: crate::ctypes::c_uchar, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct if_settings { -pub type_: crate::ctypes::c_uint, -pub size: crate::ctypes::c_uint, -pub ifs_ifsu: if_settings__bindgen_ty_1, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ifreq { -pub ifr_ifrn: ifreq__bindgen_ty_1, -pub ifr_ifru: ifreq__bindgen_ty_2, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ifconf { -pub ifc_len: crate::ctypes::c_int, -pub ifc_ifcu: ifconf__bindgen_ty_1, -} -#[repr(C)] -pub struct xt_entry_match { -pub u: xt_entry_match__bindgen_ty_1, -pub data: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_match__bindgen_ty_1__bindgen_ty_1 { -pub match_size: __u16, -pub name: [crate::ctypes::c_char; 29usize], -pub revision: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_match__bindgen_ty_1__bindgen_ty_2 { -pub match_size: __u16, -pub match_: *mut xt_match, -} -#[repr(C)] -pub struct xt_entry_target { -pub u: xt_entry_target__bindgen_ty_1, -pub data: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_target__bindgen_ty_1__bindgen_ty_1 { -pub target_size: __u16, -pub name: [crate::ctypes::c_char; 29usize], -pub revision: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_target__bindgen_ty_1__bindgen_ty_2 { -pub target_size: __u16, -pub target: *mut xt_target, -} -#[repr(C)] -pub struct xt_standard_target { -pub target: xt_entry_target, -pub verdict: crate::ctypes::c_int, -} -#[repr(C)] -pub struct xt_error_target { -pub target: xt_entry_target, -pub errorname: [crate::ctypes::c_char; 30usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_get_revision { -pub name: [crate::ctypes::c_char; 29usize], -pub revision: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct _xt_align { -pub u8_: __u8, -pub u16_: __u16, -pub u32_: __u32, -pub u64_: __u64, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_counters { -pub pcnt: __u64, -pub bcnt: __u64, -} -#[repr(C)] -#[derive(Debug)] -pub struct xt_counters_info { -pub name: [crate::ctypes::c_char; 32usize], -pub num_counters: crate::ctypes::c_uint, -pub counters: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_tcp { -pub spts: [__u16; 2usize], -pub dpts: [__u16; 2usize], -pub option: __u8, -pub flg_mask: __u8, -pub flg_cmp: __u8, -pub invflags: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_udp { -pub spts: [__u16; 2usize], -pub dpts: [__u16; 2usize], -pub invflags: __u8, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ip6t_ip6 { -pub src: in6_addr, -pub dst: in6_addr, -pub smsk: in6_addr, -pub dmsk: in6_addr, -pub iniface: [crate::ctypes::c_char; 16usize], -pub outiface: [crate::ctypes::c_char; 16usize], -pub iniface_mask: [crate::ctypes::c_uchar; 16usize], -pub outiface_mask: [crate::ctypes::c_uchar; 16usize], -pub proto: __u16, -pub tos: __u8, -pub flags: __u8, -pub invflags: __u8, -} -#[repr(C)] -pub struct ip6t_entry { -pub ipv6: ip6t_ip6, -pub nfcache: crate::ctypes::c_uint, -pub target_offset: __u16, -pub next_offset: __u16, -pub comefrom: crate::ctypes::c_uint, -pub counters: xt_counters, -pub elems: __IncompleteArrayField, -} -#[repr(C)] -pub struct ip6t_standard { -pub entry: ip6t_entry, -pub target: xt_standard_target, -} -#[repr(C)] -pub struct ip6t_error { -pub entry: ip6t_entry, -pub target: xt_error_target, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ip6t_icmp { -pub type_: __u8, -pub code: [__u8; 2usize], -pub invflags: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ip6t_getinfo { -pub name: [crate::ctypes::c_char; 32usize], -pub valid_hooks: crate::ctypes::c_uint, -pub hook_entry: [crate::ctypes::c_uint; 5usize], -pub underflow: [crate::ctypes::c_uint; 5usize], -pub num_entries: crate::ctypes::c_uint, -pub size: crate::ctypes::c_uint, -} -#[repr(C)] -pub struct ip6t_replace { -pub name: [crate::ctypes::c_char; 32usize], -pub valid_hooks: crate::ctypes::c_uint, -pub num_entries: crate::ctypes::c_uint, -pub size: crate::ctypes::c_uint, -pub hook_entry: [crate::ctypes::c_uint; 5usize], -pub underflow: [crate::ctypes::c_uint; 5usize], -pub num_counters: crate::ctypes::c_uint, -pub counters: *mut xt_counters, -pub entries: __IncompleteArrayField, -} -#[repr(C)] -pub struct ip6t_get_entries { -pub name: [crate::ctypes::c_char; 32usize], -pub size: crate::ctypes::c_uint, -pub entrytable: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] pub struct linger { pub l_onoff: crate::ctypes::c_int, pub l_linger: crate::ctypes::c_int, @@ -762,16 +513,6 @@ } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct xt_match { -pub _address: u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_target { -pub _address: u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] pub struct iovec { pub _address: u8, } @@ -1194,135 +935,6 @@ pub const TCP_MD5SIG_FLAG_IFINDEX: u32 = 2; pub const TCP_RECEIVE_ZEROCOPY_FLAG_TLB_CLEAN_HINT: u32 = 1; pub const UNIX_PATH_MAX: u32 = 108; -pub const IFNAMSIZ: u32 = 16; -pub const IFALIASZ: u32 = 256; -pub const ALTIFNAMSIZ: u32 = 128; -pub const GENERIC_HDLC_VERSION: u32 = 4; -pub const CLOCK_DEFAULT: u32 = 0; -pub const CLOCK_EXT: u32 = 1; -pub const CLOCK_INT: u32 = 2; -pub const CLOCK_TXINT: u32 = 3; -pub const CLOCK_TXFROMRX: u32 = 4; -pub const ENCODING_DEFAULT: u32 = 0; -pub const ENCODING_NRZ: u32 = 1; -pub const ENCODING_NRZI: u32 = 2; -pub const ENCODING_FM_MARK: u32 = 3; -pub const ENCODING_FM_SPACE: u32 = 4; -pub const ENCODING_MANCHESTER: u32 = 5; -pub const PARITY_DEFAULT: u32 = 0; -pub const PARITY_NONE: u32 = 1; -pub const PARITY_CRC16_PR0: u32 = 2; -pub const PARITY_CRC16_PR1: u32 = 3; -pub const PARITY_CRC16_PR0_CCITT: u32 = 4; -pub const PARITY_CRC16_PR1_CCITT: u32 = 5; -pub const PARITY_CRC32_PR0_CCITT: u32 = 6; -pub const PARITY_CRC32_PR1_CCITT: u32 = 7; -pub const LMI_DEFAULT: u32 = 0; -pub const LMI_NONE: u32 = 1; -pub const LMI_ANSI: u32 = 2; -pub const LMI_CCITT: u32 = 3; -pub const LMI_CISCO: u32 = 4; -pub const IF_GET_IFACE: u32 = 1; -pub const IF_GET_PROTO: u32 = 2; -pub const IF_IFACE_V35: u32 = 4096; -pub const IF_IFACE_V24: u32 = 4097; -pub const IF_IFACE_X21: u32 = 4098; -pub const IF_IFACE_T1: u32 = 4099; -pub const IF_IFACE_E1: u32 = 4100; -pub const IF_IFACE_SYNC_SERIAL: u32 = 4101; -pub const IF_IFACE_X21D: u32 = 4102; -pub const IF_PROTO_HDLC: u32 = 8192; -pub const IF_PROTO_PPP: u32 = 8193; -pub const IF_PROTO_CISCO: u32 = 8194; -pub const IF_PROTO_FR: u32 = 8195; -pub const IF_PROTO_FR_ADD_PVC: u32 = 8196; -pub const IF_PROTO_FR_DEL_PVC: u32 = 8197; -pub const IF_PROTO_X25: u32 = 8198; -pub const IF_PROTO_HDLC_ETH: u32 = 8199; -pub const IF_PROTO_FR_ADD_ETH_PVC: u32 = 8200; -pub const IF_PROTO_FR_DEL_ETH_PVC: u32 = 8201; -pub const IF_PROTO_FR_PVC: u32 = 8202; -pub const IF_PROTO_FR_ETH_PVC: u32 = 8203; -pub const IF_PROTO_RAW: u32 = 8204; -pub const IFHWADDRLEN: u32 = 6; -pub const NF_DROP: u32 = 0; -pub const NF_ACCEPT: u32 = 1; -pub const NF_STOLEN: u32 = 2; -pub const NF_QUEUE: u32 = 3; -pub const NF_REPEAT: u32 = 4; -pub const NF_STOP: u32 = 5; -pub const NF_MAX_VERDICT: u32 = 5; -pub const NF_VERDICT_MASK: u32 = 255; -pub const NF_VERDICT_FLAG_QUEUE_BYPASS: u32 = 32768; -pub const NF_VERDICT_QMASK: u32 = 4294901760; -pub const NF_VERDICT_QBITS: u32 = 16; -pub const NF_VERDICT_BITS: u32 = 16; -pub const NF_IP6_PRE_ROUTING: u32 = 0; -pub const NF_IP6_LOCAL_IN: u32 = 1; -pub const NF_IP6_FORWARD: u32 = 2; -pub const NF_IP6_LOCAL_OUT: u32 = 3; -pub const NF_IP6_POST_ROUTING: u32 = 4; -pub const NF_IP6_NUMHOOKS: u32 = 5; -pub const XT_FUNCTION_MAXNAMELEN: u32 = 30; -pub const XT_EXTENSION_MAXNAMELEN: u32 = 29; -pub const XT_TABLE_MAXNAMELEN: u32 = 32; -pub const XT_CONTINUE: u32 = 4294967295; -pub const XT_RETURN: i32 = -5; -pub const XT_STANDARD_TARGET: &[u8; 1] = b"\0"; -pub const XT_ERROR_TARGET: &[u8; 6] = b"ERROR\0"; -pub const XT_INV_PROTO: u32 = 64; -pub const IP6T_FUNCTION_MAXNAMELEN: u32 = 30; -pub const IP6T_TABLE_MAXNAMELEN: u32 = 32; -pub const IP6T_CONTINUE: u32 = 4294967295; -pub const IP6T_RETURN: i32 = -5; -pub const XT_TCP_INV_SRCPT: u32 = 1; -pub const XT_TCP_INV_DSTPT: u32 = 2; -pub const XT_TCP_INV_FLAGS: u32 = 4; -pub const XT_TCP_INV_OPTION: u32 = 8; -pub const XT_TCP_INV_MASK: u32 = 15; -pub const XT_UDP_INV_SRCPT: u32 = 1; -pub const XT_UDP_INV_DSTPT: u32 = 2; -pub const XT_UDP_INV_MASK: u32 = 3; -pub const IP6T_TCP_INV_SRCPT: u32 = 1; -pub const IP6T_TCP_INV_DSTPT: u32 = 2; -pub const IP6T_TCP_INV_FLAGS: u32 = 4; -pub const IP6T_TCP_INV_OPTION: u32 = 8; -pub const IP6T_TCP_INV_MASK: u32 = 15; -pub const IP6T_UDP_INV_SRCPT: u32 = 1; -pub const IP6T_UDP_INV_DSTPT: u32 = 2; -pub const IP6T_UDP_INV_MASK: u32 = 3; -pub const IP6T_STANDARD_TARGET: &[u8; 1] = b"\0"; -pub const IP6T_ERROR_TARGET: &[u8; 6] = b"ERROR\0"; -pub const IP6T_F_PROTO: u32 = 1; -pub const IP6T_F_TOS: u32 = 2; -pub const IP6T_F_GOTO: u32 = 4; -pub const IP6T_F_MASK: u32 = 7; -pub const IP6T_INV_VIA_IN: u32 = 1; -pub const IP6T_INV_VIA_OUT: u32 = 2; -pub const IP6T_INV_TOS: u32 = 4; -pub const IP6T_INV_SRCIP: u32 = 8; -pub const IP6T_INV_DSTIP: u32 = 16; -pub const IP6T_INV_FRAG: u32 = 32; -pub const IP6T_INV_PROTO: u32 = 64; -pub const IP6T_INV_MASK: u32 = 127; -pub const IP6T_BASE_CTL: u32 = 64; -pub const IP6T_SO_SET_REPLACE: u32 = 64; -pub const IP6T_SO_SET_ADD_COUNTERS: u32 = 65; -pub const IP6T_SO_SET_MAX: u32 = 65; -pub const IP6T_SO_GET_INFO: u32 = 64; -pub const IP6T_SO_GET_ENTRIES: u32 = 65; -pub const IP6T_SO_GET_REVISION_MATCH: u32 = 68; -pub const IP6T_SO_GET_REVISION_TARGET: u32 = 69; -pub const IP6T_SO_GET_MAX: u32 = 69; -pub const IP6T_SO_ORIGINAL_DST: u32 = 80; -pub const IP6T_ICMP_INV: u32 = 1; -pub const NF_IP_PRE_ROUTING: u32 = 0; -pub const NF_IP_LOCAL_IN: u32 = 1; -pub const NF_IP_FORWARD: u32 = 2; -pub const NF_IP_LOCAL_OUT: u32 = 3; -pub const NF_IP_POST_ROUTING: u32 = 4; -pub const NF_IP_NUMHOOKS: u32 = 5; -pub const SO_ORIGINAL_DST: u32 = 80; pub const SHUT_RD: u32 = 0; pub const SHUT_WR: u32 = 1; pub const SHUT_RDWR: u32 = 2; @@ -1551,25 +1163,6 @@ pub const TCP_NLA_EDT: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_EDT; pub const TCP_NLA_TTL: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_TTL; pub const TCP_NLA_REHASH: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_REHASH; -pub const IF_OPER_UNKNOWN: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_UNKNOWN; -pub const IF_OPER_NOTPRESENT: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_NOTPRESENT; -pub const IF_OPER_DOWN: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_DOWN; -pub const IF_OPER_LOWERLAYERDOWN: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_LOWERLAYERDOWN; -pub const IF_OPER_TESTING: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_TESTING; -pub const IF_OPER_DORMANT: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_DORMANT; -pub const IF_OPER_UP: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_UP; -pub const IF_LINK_MODE_DEFAULT: _bindgen_ty_8 = _bindgen_ty_8::IF_LINK_MODE_DEFAULT; -pub const IF_LINK_MODE_DORMANT: _bindgen_ty_8 = _bindgen_ty_8::IF_LINK_MODE_DORMANT; -pub const IF_LINK_MODE_TESTING: _bindgen_ty_8 = _bindgen_ty_8::IF_LINK_MODE_TESTING; -pub const NFPROTO_UNSPEC: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_UNSPEC; -pub const NFPROTO_INET: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_INET; -pub const NFPROTO_IPV4: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_IPV4; -pub const NFPROTO_ARP: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_ARP; -pub const NFPROTO_NETDEV: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_NETDEV; -pub const NFPROTO_BRIDGE: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_BRIDGE; -pub const NFPROTO_IPV6: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_IPV6; -pub const NFPROTO_DECNET: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_DECNET; -pub const NFPROTO_NUMPROTO: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_NUMPROTO; #[repr(u32)] #[non_exhaustive] #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] @@ -1793,121 +1386,6 @@ TCP_NLA_TTL = 26, TCP_NLA_REHASH = 27, } -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum net_device_flags { -IFF_UP = 1, -IFF_BROADCAST = 2, -IFF_DEBUG = 4, -IFF_LOOPBACK = 8, -IFF_POINTOPOINT = 16, -IFF_NOTRAILERS = 32, -IFF_RUNNING = 64, -IFF_NOARP = 128, -IFF_PROMISC = 256, -IFF_ALLMULTI = 512, -IFF_MASTER = 1024, -IFF_SLAVE = 2048, -IFF_MULTICAST = 4096, -IFF_PORTSEL = 8192, -IFF_AUTOMEDIA = 16384, -IFF_DYNAMIC = 32768, -IFF_LOWER_UP = 65536, -IFF_DORMANT = 131072, -IFF_ECHO = 262144, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_7 { -IF_OPER_UNKNOWN = 0, -IF_OPER_NOTPRESENT = 1, -IF_OPER_DOWN = 2, -IF_OPER_LOWERLAYERDOWN = 3, -IF_OPER_TESTING = 4, -IF_OPER_DORMANT = 5, -IF_OPER_UP = 6, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_8 { -IF_LINK_MODE_DEFAULT = 0, -IF_LINK_MODE_DORMANT = 1, -IF_LINK_MODE_TESTING = 2, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_inet_hooks { -NF_INET_PRE_ROUTING = 0, -NF_INET_LOCAL_IN = 1, -NF_INET_FORWARD = 2, -NF_INET_LOCAL_OUT = 3, -NF_INET_POST_ROUTING = 4, -NF_INET_NUMHOOKS = 5, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_dev_hooks { -NF_NETDEV_INGRESS = 0, -NF_NETDEV_EGRESS = 1, -NF_NETDEV_NUMHOOKS = 2, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_9 { -NFPROTO_UNSPEC = 0, -NFPROTO_INET = 1, -NFPROTO_IPV4 = 2, -NFPROTO_ARP = 3, -NFPROTO_NETDEV = 5, -NFPROTO_BRIDGE = 7, -NFPROTO_IPV6 = 10, -NFPROTO_DECNET = 12, -NFPROTO_NUMPROTO = 13, -} -#[repr(i32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_ip6_hook_priorities { -NF_IP6_PRI_FIRST = -2147483648, -NF_IP6_PRI_RAW_BEFORE_DEFRAG = -450, -NF_IP6_PRI_CONNTRACK_DEFRAG = -400, -NF_IP6_PRI_RAW = -300, -NF_IP6_PRI_SELINUX_FIRST = -225, -NF_IP6_PRI_CONNTRACK = -200, -NF_IP6_PRI_MANGLE = -150, -NF_IP6_PRI_NAT_DST = -100, -NF_IP6_PRI_FILTER = 0, -NF_IP6_PRI_SECURITY = 50, -NF_IP6_PRI_NAT_SRC = 100, -NF_IP6_PRI_SELINUX_LAST = 225, -NF_IP6_PRI_CONNTRACK_HELPER = 300, -NF_IP6_PRI_LAST = 2147483647, -} -#[repr(i32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_ip_hook_priorities { -NF_IP_PRI_FIRST = -2147483648, -NF_IP_PRI_RAW_BEFORE_DEFRAG = -450, -NF_IP_PRI_CONNTRACK_DEFRAG = -400, -NF_IP_PRI_RAW = -300, -NF_IP_PRI_SELINUX_FIRST = -225, -NF_IP_PRI_CONNTRACK = -200, -NF_IP_PRI_MANGLE = -150, -NF_IP_PRI_NAT_DST = -100, -NF_IP_PRI_FILTER = 0, -NF_IP_PRI_SECURITY = 50, -NF_IP_PRI_NAT_SRC = 100, -NF_IP_PRI_SELINUX_LAST = 225, -NF_IP_PRI_CONNTRACK_HELPER = 300, -NF_IP_PRI_CONNTRACK_CONFIRM = 2147483647, -} #[repr(C)] #[derive(Copy, Clone)] pub union __kernel_sockaddr_storage__bindgen_ty_1 { @@ -1939,69 +1417,6 @@ pub hdr: tcphdr, pub words: [__be32; 5usize], } -#[repr(C)] -#[derive(Copy, Clone)] -pub union if_settings__bindgen_ty_1 { -pub raw_hdlc: *mut raw_hdlc_proto, -pub cisco: *mut cisco_proto, -pub fr: *mut fr_proto, -pub fr_pvc: *mut fr_proto_pvc, -pub fr_pvc_info: *mut fr_proto_pvc_info, -pub x25: *mut x25_hdlc_proto, -pub sync: *mut sync_serial_settings, -pub te1: *mut te1_settings, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ifreq__bindgen_ty_1 { -pub ifrn_name: [crate::ctypes::c_char; 16usize], -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ifreq__bindgen_ty_2 { -pub ifru_addr: sockaddr, -pub ifru_dstaddr: sockaddr, -pub ifru_broadaddr: sockaddr, -pub ifru_netmask: sockaddr, -pub ifru_hwaddr: sockaddr, -pub ifru_flags: crate::ctypes::c_short, -pub ifru_ivalue: crate::ctypes::c_int, -pub ifru_mtu: crate::ctypes::c_int, -pub ifru_map: ifmap, -pub ifru_slave: [crate::ctypes::c_char; 16usize], -pub ifru_newname: [crate::ctypes::c_char; 16usize], -pub ifru_data: *mut crate::ctypes::c_void, -pub ifru_settings: if_settings, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ifconf__bindgen_ty_1 { -pub ifcu_buf: *mut crate::ctypes::c_char, -pub ifcu_req: *mut ifreq, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union nf_inet_addr { -pub all: [__u32; 4usize], -pub ip: __be32, -pub ip6: [__be32; 4usize], -pub in_: in_addr, -pub in6: in6_addr, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union xt_entry_match__bindgen_ty_1 { -pub user: xt_entry_match__bindgen_ty_1__bindgen_ty_1, -pub kernel: xt_entry_match__bindgen_ty_1__bindgen_ty_2, -pub match_size: __u16, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union xt_entry_target__bindgen_ty_1 { -pub user: xt_entry_target__bindgen_ty_1__bindgen_ty_1, -pub kernel: xt_entry_target__bindgen_ty_1__bindgen_ty_2, -pub target_size: __u16, -} impl __BindgenBitfieldUnit { #[inline] pub const fn new(storage: Storage) -> Self { @@ -2427,9 +1842,3 @@ __bindgen_bitfield_unit } } -impl nf_inet_hooks { -pub const NF_INET_INGRESS: nf_inet_hooks = nf_inet_hooks::NF_INET_NUMHOOKS; -} -impl nf_ip_hook_priorities { -pub const NF_IP_PRI_LAST: nf_ip_hook_priorities = nf_ip_hook_priorities::NF_IP_PRI_CONNTRACK_CONFIRM; -} diff -Nru temporalio-1.3.0/vendor/linux-raw-sys/src/arm/general.rs temporalio-1.3.0/vendor/linux-raw-sys/src/arm/general.rs --- temporalio-1.3.0/vendor/linux-raw-sys/src/arm/general.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/linux-raw-sys/src/arm/general.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1601,19 +1601,6 @@ pub const GRND_NONBLOCK: u32 = 1; pub const GRND_RANDOM: u32 = 2; pub const GRND_INSECURE: u32 = 4; -pub const LINUX_REBOOT_MAGIC1: u32 = 4276215469; -pub const LINUX_REBOOT_MAGIC2: u32 = 672274793; -pub const LINUX_REBOOT_MAGIC2A: u32 = 85072278; -pub const LINUX_REBOOT_MAGIC2B: u32 = 369367448; -pub const LINUX_REBOOT_MAGIC2C: u32 = 537993216; -pub const LINUX_REBOOT_CMD_RESTART: u32 = 19088743; -pub const LINUX_REBOOT_CMD_HALT: u32 = 3454992675; -pub const LINUX_REBOOT_CMD_CAD_ON: u32 = 2309737967; -pub const LINUX_REBOOT_CMD_CAD_OFF: u32 = 0; -pub const LINUX_REBOOT_CMD_POWER_OFF: u32 = 1126301404; -pub const LINUX_REBOOT_CMD_RESTART2: u32 = 2712847316; -pub const LINUX_REBOOT_CMD_SW_SUSPEND: u32 = 3489725666; -pub const LINUX_REBOOT_CMD_KEXEC: u32 = 1163412803; pub const ITIMER_REAL: u32 = 0; pub const ITIMER_VIRTUAL: u32 = 1; pub const ITIMER_PROF: u32 = 2; diff -Nru temporalio-1.3.0/vendor/linux-raw-sys/src/arm/net.rs temporalio-1.3.0/vendor/linux-raw-sys/src/arm/net.rs --- temporalio-1.3.0/vendor/linux-raw-sys/src/arm/net.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/linux-raw-sys/src/arm/net.rs 2023-10-30 19:40:00.000000000 +0000 @@ -476,255 +476,6 @@ } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct sync_serial_settings { -pub clock_rate: crate::ctypes::c_uint, -pub clock_type: crate::ctypes::c_uint, -pub loopback: crate::ctypes::c_ushort, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct te1_settings { -pub clock_rate: crate::ctypes::c_uint, -pub clock_type: crate::ctypes::c_uint, -pub loopback: crate::ctypes::c_ushort, -pub slot_map: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct raw_hdlc_proto { -pub encoding: crate::ctypes::c_ushort, -pub parity: crate::ctypes::c_ushort, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fr_proto { -pub t391: crate::ctypes::c_uint, -pub t392: crate::ctypes::c_uint, -pub n391: crate::ctypes::c_uint, -pub n392: crate::ctypes::c_uint, -pub n393: crate::ctypes::c_uint, -pub lmi: crate::ctypes::c_ushort, -pub dce: crate::ctypes::c_ushort, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fr_proto_pvc { -pub dlci: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fr_proto_pvc_info { -pub dlci: crate::ctypes::c_uint, -pub master: [crate::ctypes::c_char; 16usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct cisco_proto { -pub interval: crate::ctypes::c_uint, -pub timeout: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct x25_hdlc_proto { -pub dce: crate::ctypes::c_ushort, -pub modulo: crate::ctypes::c_uint, -pub window: crate::ctypes::c_uint, -pub t1: crate::ctypes::c_uint, -pub t2: crate::ctypes::c_uint, -pub n2: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ifmap { -pub mem_start: crate::ctypes::c_ulong, -pub mem_end: crate::ctypes::c_ulong, -pub base_addr: crate::ctypes::c_ushort, -pub irq: crate::ctypes::c_uchar, -pub dma: crate::ctypes::c_uchar, -pub port: crate::ctypes::c_uchar, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct if_settings { -pub type_: crate::ctypes::c_uint, -pub size: crate::ctypes::c_uint, -pub ifs_ifsu: if_settings__bindgen_ty_1, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ifreq { -pub ifr_ifrn: ifreq__bindgen_ty_1, -pub ifr_ifru: ifreq__bindgen_ty_2, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ifconf { -pub ifc_len: crate::ctypes::c_int, -pub ifc_ifcu: ifconf__bindgen_ty_1, -} -#[repr(C)] -pub struct xt_entry_match { -pub u: xt_entry_match__bindgen_ty_1, -pub data: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_match__bindgen_ty_1__bindgen_ty_1 { -pub match_size: __u16, -pub name: [crate::ctypes::c_char; 29usize], -pub revision: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_match__bindgen_ty_1__bindgen_ty_2 { -pub match_size: __u16, -pub match_: *mut xt_match, -} -#[repr(C)] -pub struct xt_entry_target { -pub u: xt_entry_target__bindgen_ty_1, -pub data: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_target__bindgen_ty_1__bindgen_ty_1 { -pub target_size: __u16, -pub name: [crate::ctypes::c_char; 29usize], -pub revision: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_target__bindgen_ty_1__bindgen_ty_2 { -pub target_size: __u16, -pub target: *mut xt_target, -} -#[repr(C)] -pub struct xt_standard_target { -pub target: xt_entry_target, -pub verdict: crate::ctypes::c_int, -} -#[repr(C)] -pub struct xt_error_target { -pub target: xt_entry_target, -pub errorname: [crate::ctypes::c_char; 30usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_get_revision { -pub name: [crate::ctypes::c_char; 29usize], -pub revision: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct _xt_align { -pub u8_: __u8, -pub u16_: __u16, -pub u32_: __u32, -pub u64_: __u64, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_counters { -pub pcnt: __u64, -pub bcnt: __u64, -} -#[repr(C)] -#[derive(Debug)] -pub struct xt_counters_info { -pub name: [crate::ctypes::c_char; 32usize], -pub num_counters: crate::ctypes::c_uint, -pub counters: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_tcp { -pub spts: [__u16; 2usize], -pub dpts: [__u16; 2usize], -pub option: __u8, -pub flg_mask: __u8, -pub flg_cmp: __u8, -pub invflags: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_udp { -pub spts: [__u16; 2usize], -pub dpts: [__u16; 2usize], -pub invflags: __u8, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ip6t_ip6 { -pub src: in6_addr, -pub dst: in6_addr, -pub smsk: in6_addr, -pub dmsk: in6_addr, -pub iniface: [crate::ctypes::c_char; 16usize], -pub outiface: [crate::ctypes::c_char; 16usize], -pub iniface_mask: [crate::ctypes::c_uchar; 16usize], -pub outiface_mask: [crate::ctypes::c_uchar; 16usize], -pub proto: __u16, -pub tos: __u8, -pub flags: __u8, -pub invflags: __u8, -} -#[repr(C)] -pub struct ip6t_entry { -pub ipv6: ip6t_ip6, -pub nfcache: crate::ctypes::c_uint, -pub target_offset: __u16, -pub next_offset: __u16, -pub comefrom: crate::ctypes::c_uint, -pub counters: xt_counters, -pub elems: __IncompleteArrayField, -} -#[repr(C)] -pub struct ip6t_standard { -pub entry: ip6t_entry, -pub target: xt_standard_target, -} -#[repr(C)] -pub struct ip6t_error { -pub entry: ip6t_entry, -pub target: xt_error_target, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ip6t_icmp { -pub type_: __u8, -pub code: [__u8; 2usize], -pub invflags: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ip6t_getinfo { -pub name: [crate::ctypes::c_char; 32usize], -pub valid_hooks: crate::ctypes::c_uint, -pub hook_entry: [crate::ctypes::c_uint; 5usize], -pub underflow: [crate::ctypes::c_uint; 5usize], -pub num_entries: crate::ctypes::c_uint, -pub size: crate::ctypes::c_uint, -} -#[repr(C)] -pub struct ip6t_replace { -pub name: [crate::ctypes::c_char; 32usize], -pub valid_hooks: crate::ctypes::c_uint, -pub num_entries: crate::ctypes::c_uint, -pub size: crate::ctypes::c_uint, -pub hook_entry: [crate::ctypes::c_uint; 5usize], -pub underflow: [crate::ctypes::c_uint; 5usize], -pub num_counters: crate::ctypes::c_uint, -pub counters: *mut xt_counters, -pub entries: __IncompleteArrayField, -} -#[repr(C)] -pub struct ip6t_get_entries { -pub name: [crate::ctypes::c_char; 32usize], -pub size: crate::ctypes::c_uint, -pub entrytable: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] pub struct linger { pub l_onoff: crate::ctypes::c_int, pub l_linger: crate::ctypes::c_int, @@ -762,16 +513,6 @@ } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct xt_match { -pub _address: u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_target { -pub _address: u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] pub struct iovec { pub _address: u8, } @@ -1186,135 +927,6 @@ pub const TCP_MD5SIG_FLAG_IFINDEX: u32 = 2; pub const TCP_RECEIVE_ZEROCOPY_FLAG_TLB_CLEAN_HINT: u32 = 1; pub const UNIX_PATH_MAX: u32 = 108; -pub const IFNAMSIZ: u32 = 16; -pub const IFALIASZ: u32 = 256; -pub const ALTIFNAMSIZ: u32 = 128; -pub const GENERIC_HDLC_VERSION: u32 = 4; -pub const CLOCK_DEFAULT: u32 = 0; -pub const CLOCK_EXT: u32 = 1; -pub const CLOCK_INT: u32 = 2; -pub const CLOCK_TXINT: u32 = 3; -pub const CLOCK_TXFROMRX: u32 = 4; -pub const ENCODING_DEFAULT: u32 = 0; -pub const ENCODING_NRZ: u32 = 1; -pub const ENCODING_NRZI: u32 = 2; -pub const ENCODING_FM_MARK: u32 = 3; -pub const ENCODING_FM_SPACE: u32 = 4; -pub const ENCODING_MANCHESTER: u32 = 5; -pub const PARITY_DEFAULT: u32 = 0; -pub const PARITY_NONE: u32 = 1; -pub const PARITY_CRC16_PR0: u32 = 2; -pub const PARITY_CRC16_PR1: u32 = 3; -pub const PARITY_CRC16_PR0_CCITT: u32 = 4; -pub const PARITY_CRC16_PR1_CCITT: u32 = 5; -pub const PARITY_CRC32_PR0_CCITT: u32 = 6; -pub const PARITY_CRC32_PR1_CCITT: u32 = 7; -pub const LMI_DEFAULT: u32 = 0; -pub const LMI_NONE: u32 = 1; -pub const LMI_ANSI: u32 = 2; -pub const LMI_CCITT: u32 = 3; -pub const LMI_CISCO: u32 = 4; -pub const IF_GET_IFACE: u32 = 1; -pub const IF_GET_PROTO: u32 = 2; -pub const IF_IFACE_V35: u32 = 4096; -pub const IF_IFACE_V24: u32 = 4097; -pub const IF_IFACE_X21: u32 = 4098; -pub const IF_IFACE_T1: u32 = 4099; -pub const IF_IFACE_E1: u32 = 4100; -pub const IF_IFACE_SYNC_SERIAL: u32 = 4101; -pub const IF_IFACE_X21D: u32 = 4102; -pub const IF_PROTO_HDLC: u32 = 8192; -pub const IF_PROTO_PPP: u32 = 8193; -pub const IF_PROTO_CISCO: u32 = 8194; -pub const IF_PROTO_FR: u32 = 8195; -pub const IF_PROTO_FR_ADD_PVC: u32 = 8196; -pub const IF_PROTO_FR_DEL_PVC: u32 = 8197; -pub const IF_PROTO_X25: u32 = 8198; -pub const IF_PROTO_HDLC_ETH: u32 = 8199; -pub const IF_PROTO_FR_ADD_ETH_PVC: u32 = 8200; -pub const IF_PROTO_FR_DEL_ETH_PVC: u32 = 8201; -pub const IF_PROTO_FR_PVC: u32 = 8202; -pub const IF_PROTO_FR_ETH_PVC: u32 = 8203; -pub const IF_PROTO_RAW: u32 = 8204; -pub const IFHWADDRLEN: u32 = 6; -pub const NF_DROP: u32 = 0; -pub const NF_ACCEPT: u32 = 1; -pub const NF_STOLEN: u32 = 2; -pub const NF_QUEUE: u32 = 3; -pub const NF_REPEAT: u32 = 4; -pub const NF_STOP: u32 = 5; -pub const NF_MAX_VERDICT: u32 = 5; -pub const NF_VERDICT_MASK: u32 = 255; -pub const NF_VERDICT_FLAG_QUEUE_BYPASS: u32 = 32768; -pub const NF_VERDICT_QMASK: u32 = 4294901760; -pub const NF_VERDICT_QBITS: u32 = 16; -pub const NF_VERDICT_BITS: u32 = 16; -pub const NF_IP6_PRE_ROUTING: u32 = 0; -pub const NF_IP6_LOCAL_IN: u32 = 1; -pub const NF_IP6_FORWARD: u32 = 2; -pub const NF_IP6_LOCAL_OUT: u32 = 3; -pub const NF_IP6_POST_ROUTING: u32 = 4; -pub const NF_IP6_NUMHOOKS: u32 = 5; -pub const XT_FUNCTION_MAXNAMELEN: u32 = 30; -pub const XT_EXTENSION_MAXNAMELEN: u32 = 29; -pub const XT_TABLE_MAXNAMELEN: u32 = 32; -pub const XT_CONTINUE: u32 = 4294967295; -pub const XT_RETURN: i32 = -5; -pub const XT_STANDARD_TARGET: &[u8; 1] = b"\0"; -pub const XT_ERROR_TARGET: &[u8; 6] = b"ERROR\0"; -pub const XT_INV_PROTO: u32 = 64; -pub const IP6T_FUNCTION_MAXNAMELEN: u32 = 30; -pub const IP6T_TABLE_MAXNAMELEN: u32 = 32; -pub const IP6T_CONTINUE: u32 = 4294967295; -pub const IP6T_RETURN: i32 = -5; -pub const XT_TCP_INV_SRCPT: u32 = 1; -pub const XT_TCP_INV_DSTPT: u32 = 2; -pub const XT_TCP_INV_FLAGS: u32 = 4; -pub const XT_TCP_INV_OPTION: u32 = 8; -pub const XT_TCP_INV_MASK: u32 = 15; -pub const XT_UDP_INV_SRCPT: u32 = 1; -pub const XT_UDP_INV_DSTPT: u32 = 2; -pub const XT_UDP_INV_MASK: u32 = 3; -pub const IP6T_TCP_INV_SRCPT: u32 = 1; -pub const IP6T_TCP_INV_DSTPT: u32 = 2; -pub const IP6T_TCP_INV_FLAGS: u32 = 4; -pub const IP6T_TCP_INV_OPTION: u32 = 8; -pub const IP6T_TCP_INV_MASK: u32 = 15; -pub const IP6T_UDP_INV_SRCPT: u32 = 1; -pub const IP6T_UDP_INV_DSTPT: u32 = 2; -pub const IP6T_UDP_INV_MASK: u32 = 3; -pub const IP6T_STANDARD_TARGET: &[u8; 1] = b"\0"; -pub const IP6T_ERROR_TARGET: &[u8; 6] = b"ERROR\0"; -pub const IP6T_F_PROTO: u32 = 1; -pub const IP6T_F_TOS: u32 = 2; -pub const IP6T_F_GOTO: u32 = 4; -pub const IP6T_F_MASK: u32 = 7; -pub const IP6T_INV_VIA_IN: u32 = 1; -pub const IP6T_INV_VIA_OUT: u32 = 2; -pub const IP6T_INV_TOS: u32 = 4; -pub const IP6T_INV_SRCIP: u32 = 8; -pub const IP6T_INV_DSTIP: u32 = 16; -pub const IP6T_INV_FRAG: u32 = 32; -pub const IP6T_INV_PROTO: u32 = 64; -pub const IP6T_INV_MASK: u32 = 127; -pub const IP6T_BASE_CTL: u32 = 64; -pub const IP6T_SO_SET_REPLACE: u32 = 64; -pub const IP6T_SO_SET_ADD_COUNTERS: u32 = 65; -pub const IP6T_SO_SET_MAX: u32 = 65; -pub const IP6T_SO_GET_INFO: u32 = 64; -pub const IP6T_SO_GET_ENTRIES: u32 = 65; -pub const IP6T_SO_GET_REVISION_MATCH: u32 = 68; -pub const IP6T_SO_GET_REVISION_TARGET: u32 = 69; -pub const IP6T_SO_GET_MAX: u32 = 69; -pub const IP6T_SO_ORIGINAL_DST: u32 = 80; -pub const IP6T_ICMP_INV: u32 = 1; -pub const NF_IP_PRE_ROUTING: u32 = 0; -pub const NF_IP_LOCAL_IN: u32 = 1; -pub const NF_IP_FORWARD: u32 = 2; -pub const NF_IP_LOCAL_OUT: u32 = 3; -pub const NF_IP_POST_ROUTING: u32 = 4; -pub const NF_IP_NUMHOOKS: u32 = 5; -pub const SO_ORIGINAL_DST: u32 = 80; pub const SHUT_RD: u32 = 0; pub const SHUT_WR: u32 = 1; pub const SHUT_RDWR: u32 = 2; @@ -1543,25 +1155,6 @@ pub const TCP_NLA_EDT: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_EDT; pub const TCP_NLA_TTL: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_TTL; pub const TCP_NLA_REHASH: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_REHASH; -pub const IF_OPER_UNKNOWN: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_UNKNOWN; -pub const IF_OPER_NOTPRESENT: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_NOTPRESENT; -pub const IF_OPER_DOWN: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_DOWN; -pub const IF_OPER_LOWERLAYERDOWN: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_LOWERLAYERDOWN; -pub const IF_OPER_TESTING: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_TESTING; -pub const IF_OPER_DORMANT: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_DORMANT; -pub const IF_OPER_UP: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_UP; -pub const IF_LINK_MODE_DEFAULT: _bindgen_ty_8 = _bindgen_ty_8::IF_LINK_MODE_DEFAULT; -pub const IF_LINK_MODE_DORMANT: _bindgen_ty_8 = _bindgen_ty_8::IF_LINK_MODE_DORMANT; -pub const IF_LINK_MODE_TESTING: _bindgen_ty_8 = _bindgen_ty_8::IF_LINK_MODE_TESTING; -pub const NFPROTO_UNSPEC: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_UNSPEC; -pub const NFPROTO_INET: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_INET; -pub const NFPROTO_IPV4: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_IPV4; -pub const NFPROTO_ARP: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_ARP; -pub const NFPROTO_NETDEV: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_NETDEV; -pub const NFPROTO_BRIDGE: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_BRIDGE; -pub const NFPROTO_IPV6: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_IPV6; -pub const NFPROTO_DECNET: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_DECNET; -pub const NFPROTO_NUMPROTO: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_NUMPROTO; #[repr(u32)] #[non_exhaustive] #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] @@ -1785,121 +1378,6 @@ TCP_NLA_TTL = 26, TCP_NLA_REHASH = 27, } -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum net_device_flags { -IFF_UP = 1, -IFF_BROADCAST = 2, -IFF_DEBUG = 4, -IFF_LOOPBACK = 8, -IFF_POINTOPOINT = 16, -IFF_NOTRAILERS = 32, -IFF_RUNNING = 64, -IFF_NOARP = 128, -IFF_PROMISC = 256, -IFF_ALLMULTI = 512, -IFF_MASTER = 1024, -IFF_SLAVE = 2048, -IFF_MULTICAST = 4096, -IFF_PORTSEL = 8192, -IFF_AUTOMEDIA = 16384, -IFF_DYNAMIC = 32768, -IFF_LOWER_UP = 65536, -IFF_DORMANT = 131072, -IFF_ECHO = 262144, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_7 { -IF_OPER_UNKNOWN = 0, -IF_OPER_NOTPRESENT = 1, -IF_OPER_DOWN = 2, -IF_OPER_LOWERLAYERDOWN = 3, -IF_OPER_TESTING = 4, -IF_OPER_DORMANT = 5, -IF_OPER_UP = 6, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_8 { -IF_LINK_MODE_DEFAULT = 0, -IF_LINK_MODE_DORMANT = 1, -IF_LINK_MODE_TESTING = 2, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_inet_hooks { -NF_INET_PRE_ROUTING = 0, -NF_INET_LOCAL_IN = 1, -NF_INET_FORWARD = 2, -NF_INET_LOCAL_OUT = 3, -NF_INET_POST_ROUTING = 4, -NF_INET_NUMHOOKS = 5, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_dev_hooks { -NF_NETDEV_INGRESS = 0, -NF_NETDEV_EGRESS = 1, -NF_NETDEV_NUMHOOKS = 2, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_9 { -NFPROTO_UNSPEC = 0, -NFPROTO_INET = 1, -NFPROTO_IPV4 = 2, -NFPROTO_ARP = 3, -NFPROTO_NETDEV = 5, -NFPROTO_BRIDGE = 7, -NFPROTO_IPV6 = 10, -NFPROTO_DECNET = 12, -NFPROTO_NUMPROTO = 13, -} -#[repr(i32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_ip6_hook_priorities { -NF_IP6_PRI_FIRST = -2147483648, -NF_IP6_PRI_RAW_BEFORE_DEFRAG = -450, -NF_IP6_PRI_CONNTRACK_DEFRAG = -400, -NF_IP6_PRI_RAW = -300, -NF_IP6_PRI_SELINUX_FIRST = -225, -NF_IP6_PRI_CONNTRACK = -200, -NF_IP6_PRI_MANGLE = -150, -NF_IP6_PRI_NAT_DST = -100, -NF_IP6_PRI_FILTER = 0, -NF_IP6_PRI_SECURITY = 50, -NF_IP6_PRI_NAT_SRC = 100, -NF_IP6_PRI_SELINUX_LAST = 225, -NF_IP6_PRI_CONNTRACK_HELPER = 300, -NF_IP6_PRI_LAST = 2147483647, -} -#[repr(i32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_ip_hook_priorities { -NF_IP_PRI_FIRST = -2147483648, -NF_IP_PRI_RAW_BEFORE_DEFRAG = -450, -NF_IP_PRI_CONNTRACK_DEFRAG = -400, -NF_IP_PRI_RAW = -300, -NF_IP_PRI_SELINUX_FIRST = -225, -NF_IP_PRI_CONNTRACK = -200, -NF_IP_PRI_MANGLE = -150, -NF_IP_PRI_NAT_DST = -100, -NF_IP_PRI_FILTER = 0, -NF_IP_PRI_SECURITY = 50, -NF_IP_PRI_NAT_SRC = 100, -NF_IP_PRI_SELINUX_LAST = 225, -NF_IP_PRI_CONNTRACK_HELPER = 300, -NF_IP_PRI_CONNTRACK_CONFIRM = 2147483647, -} #[repr(C)] #[derive(Copy, Clone)] pub union __kernel_sockaddr_storage__bindgen_ty_1 { @@ -1931,69 +1409,6 @@ pub hdr: tcphdr, pub words: [__be32; 5usize], } -#[repr(C)] -#[derive(Copy, Clone)] -pub union if_settings__bindgen_ty_1 { -pub raw_hdlc: *mut raw_hdlc_proto, -pub cisco: *mut cisco_proto, -pub fr: *mut fr_proto, -pub fr_pvc: *mut fr_proto_pvc, -pub fr_pvc_info: *mut fr_proto_pvc_info, -pub x25: *mut x25_hdlc_proto, -pub sync: *mut sync_serial_settings, -pub te1: *mut te1_settings, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ifreq__bindgen_ty_1 { -pub ifrn_name: [crate::ctypes::c_char; 16usize], -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ifreq__bindgen_ty_2 { -pub ifru_addr: sockaddr, -pub ifru_dstaddr: sockaddr, -pub ifru_broadaddr: sockaddr, -pub ifru_netmask: sockaddr, -pub ifru_hwaddr: sockaddr, -pub ifru_flags: crate::ctypes::c_short, -pub ifru_ivalue: crate::ctypes::c_int, -pub ifru_mtu: crate::ctypes::c_int, -pub ifru_map: ifmap, -pub ifru_slave: [crate::ctypes::c_char; 16usize], -pub ifru_newname: [crate::ctypes::c_char; 16usize], -pub ifru_data: *mut crate::ctypes::c_void, -pub ifru_settings: if_settings, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ifconf__bindgen_ty_1 { -pub ifcu_buf: *mut crate::ctypes::c_char, -pub ifcu_req: *mut ifreq, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union nf_inet_addr { -pub all: [__u32; 4usize], -pub ip: __be32, -pub ip6: [__be32; 4usize], -pub in_: in_addr, -pub in6: in6_addr, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union xt_entry_match__bindgen_ty_1 { -pub user: xt_entry_match__bindgen_ty_1__bindgen_ty_1, -pub kernel: xt_entry_match__bindgen_ty_1__bindgen_ty_2, -pub match_size: __u16, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union xt_entry_target__bindgen_ty_1 { -pub user: xt_entry_target__bindgen_ty_1__bindgen_ty_1, -pub kernel: xt_entry_target__bindgen_ty_1__bindgen_ty_2, -pub target_size: __u16, -} impl __BindgenBitfieldUnit { #[inline] pub const fn new(storage: Storage) -> Self { @@ -2419,9 +1834,3 @@ __bindgen_bitfield_unit } } -impl nf_inet_hooks { -pub const NF_INET_INGRESS: nf_inet_hooks = nf_inet_hooks::NF_INET_NUMHOOKS; -} -impl nf_ip_hook_priorities { -pub const NF_IP_PRI_LAST: nf_ip_hook_priorities = nf_ip_hook_priorities::NF_IP_PRI_CONNTRACK_CONFIRM; -} diff -Nru temporalio-1.3.0/vendor/linux-raw-sys/src/csky/errno.rs temporalio-1.3.0/vendor/linux-raw-sys/src/csky/errno.rs --- temporalio-1.3.0/vendor/linux-raw-sys/src/csky/errno.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/linux-raw-sys/src/csky/errno.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,135 +0,0 @@ -/* automatically generated by rust-bindgen 0.66.1 */ - -pub const EPERM: u32 = 1; -pub const ENOENT: u32 = 2; -pub const ESRCH: u32 = 3; -pub const EINTR: u32 = 4; -pub const EIO: u32 = 5; -pub const ENXIO: u32 = 6; -pub const E2BIG: u32 = 7; -pub const ENOEXEC: u32 = 8; -pub const EBADF: u32 = 9; -pub const ECHILD: u32 = 10; -pub const EAGAIN: u32 = 11; -pub const ENOMEM: u32 = 12; -pub const EACCES: u32 = 13; -pub const EFAULT: u32 = 14; -pub const ENOTBLK: u32 = 15; -pub const EBUSY: u32 = 16; -pub const EEXIST: u32 = 17; -pub const EXDEV: u32 = 18; -pub const ENODEV: u32 = 19; -pub const ENOTDIR: u32 = 20; -pub const EISDIR: u32 = 21; -pub const EINVAL: u32 = 22; -pub const ENFILE: u32 = 23; -pub const EMFILE: u32 = 24; -pub const ENOTTY: u32 = 25; -pub const ETXTBSY: u32 = 26; -pub const EFBIG: u32 = 27; -pub const ENOSPC: u32 = 28; -pub const ESPIPE: u32 = 29; -pub const EROFS: u32 = 30; -pub const EMLINK: u32 = 31; -pub const EPIPE: u32 = 32; -pub const EDOM: u32 = 33; -pub const ERANGE: u32 = 34; -pub const EDEADLK: u32 = 35; -pub const ENAMETOOLONG: u32 = 36; -pub const ENOLCK: u32 = 37; -pub const ENOSYS: u32 = 38; -pub const ENOTEMPTY: u32 = 39; -pub const ELOOP: u32 = 40; -pub const EWOULDBLOCK: u32 = 11; -pub const ENOMSG: u32 = 42; -pub const EIDRM: u32 = 43; -pub const ECHRNG: u32 = 44; -pub const EL2NSYNC: u32 = 45; -pub const EL3HLT: u32 = 46; -pub const EL3RST: u32 = 47; -pub const ELNRNG: u32 = 48; -pub const EUNATCH: u32 = 49; -pub const ENOCSI: u32 = 50; -pub const EL2HLT: u32 = 51; -pub const EBADE: u32 = 52; -pub const EBADR: u32 = 53; -pub const EXFULL: u32 = 54; -pub const ENOANO: u32 = 55; -pub const EBADRQC: u32 = 56; -pub const EBADSLT: u32 = 57; -pub const EDEADLOCK: u32 = 35; -pub const EBFONT: u32 = 59; -pub const ENOSTR: u32 = 60; -pub const ENODATA: u32 = 61; -pub const ETIME: u32 = 62; -pub const ENOSR: u32 = 63; -pub const ENONET: u32 = 64; -pub const ENOPKG: u32 = 65; -pub const EREMOTE: u32 = 66; -pub const ENOLINK: u32 = 67; -pub const EADV: u32 = 68; -pub const ESRMNT: u32 = 69; -pub const ECOMM: u32 = 70; -pub const EPROTO: u32 = 71; -pub const EMULTIHOP: u32 = 72; -pub const EDOTDOT: u32 = 73; -pub const EBADMSG: u32 = 74; -pub const EOVERFLOW: u32 = 75; -pub const ENOTUNIQ: u32 = 76; -pub const EBADFD: u32 = 77; -pub const EREMCHG: u32 = 78; -pub const ELIBACC: u32 = 79; -pub const ELIBBAD: u32 = 80; -pub const ELIBSCN: u32 = 81; -pub const ELIBMAX: u32 = 82; -pub const ELIBEXEC: u32 = 83; -pub const EILSEQ: u32 = 84; -pub const ERESTART: u32 = 85; -pub const ESTRPIPE: u32 = 86; -pub const EUSERS: u32 = 87; -pub const ENOTSOCK: u32 = 88; -pub const EDESTADDRREQ: u32 = 89; -pub const EMSGSIZE: u32 = 90; -pub const EPROTOTYPE: u32 = 91; -pub const ENOPROTOOPT: u32 = 92; -pub const EPROTONOSUPPORT: u32 = 93; -pub const ESOCKTNOSUPPORT: u32 = 94; -pub const EOPNOTSUPP: u32 = 95; -pub const EPFNOSUPPORT: u32 = 96; -pub const EAFNOSUPPORT: u32 = 97; -pub const EADDRINUSE: u32 = 98; -pub const EADDRNOTAVAIL: u32 = 99; -pub const ENETDOWN: u32 = 100; -pub const ENETUNREACH: u32 = 101; -pub const ENETRESET: u32 = 102; -pub const ECONNABORTED: u32 = 103; -pub const ECONNRESET: u32 = 104; -pub const ENOBUFS: u32 = 105; -pub const EISCONN: u32 = 106; -pub const ENOTCONN: u32 = 107; -pub const ESHUTDOWN: u32 = 108; -pub const ETOOMANYREFS: u32 = 109; -pub const ETIMEDOUT: u32 = 110; -pub const ECONNREFUSED: u32 = 111; -pub const EHOSTDOWN: u32 = 112; -pub const EHOSTUNREACH: u32 = 113; -pub const EALREADY: u32 = 114; -pub const EINPROGRESS: u32 = 115; -pub const ESTALE: u32 = 116; -pub const EUCLEAN: u32 = 117; -pub const ENOTNAM: u32 = 118; -pub const ENAVAIL: u32 = 119; -pub const EISNAM: u32 = 120; -pub const EREMOTEIO: u32 = 121; -pub const EDQUOT: u32 = 122; -pub const ENOMEDIUM: u32 = 123; -pub const EMEDIUMTYPE: u32 = 124; -pub const ECANCELED: u32 = 125; -pub const ENOKEY: u32 = 126; -pub const EKEYEXPIRED: u32 = 127; -pub const EKEYREVOKED: u32 = 128; -pub const EKEYREJECTED: u32 = 129; -pub const EOWNERDEAD: u32 = 130; -pub const ENOTRECOVERABLE: u32 = 131; -pub const ERFKILL: u32 = 132; -pub const EHWPOISON: u32 = 133; diff -Nru temporalio-1.3.0/vendor/linux-raw-sys/src/csky/general.rs temporalio-1.3.0/vendor/linux-raw-sys/src/csky/general.rs --- temporalio-1.3.0/vendor/linux-raw-sys/src/csky/general.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/linux-raw-sys/src/csky/general.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,2859 +0,0 @@ -/* automatically generated by rust-bindgen 0.66.1 */ - -pub type __s8 = crate::ctypes::c_schar; -pub type __u8 = crate::ctypes::c_uchar; -pub type __s16 = crate::ctypes::c_short; -pub type __u16 = crate::ctypes::c_ushort; -pub type __s32 = crate::ctypes::c_int; -pub type __u32 = crate::ctypes::c_uint; -pub type __s64 = crate::ctypes::c_longlong; -pub type __u64 = crate::ctypes::c_ulonglong; -pub type __kernel_sighandler_t = ::core::option::Option; -pub type __kernel_key_t = crate::ctypes::c_int; -pub type __kernel_mqd_t = crate::ctypes::c_int; -pub type __kernel_long_t = crate::ctypes::c_long; -pub type __kernel_ulong_t = crate::ctypes::c_ulong; -pub type __kernel_ino_t = __kernel_ulong_t; -pub type __kernel_mode_t = crate::ctypes::c_uint; -pub type __kernel_pid_t = crate::ctypes::c_int; -pub type __kernel_ipc_pid_t = crate::ctypes::c_int; -pub type __kernel_uid_t = crate::ctypes::c_uint; -pub type __kernel_gid_t = crate::ctypes::c_uint; -pub type __kernel_suseconds_t = __kernel_long_t; -pub type __kernel_daddr_t = crate::ctypes::c_int; -pub type __kernel_uid32_t = crate::ctypes::c_uint; -pub type __kernel_gid32_t = crate::ctypes::c_uint; -pub type __kernel_old_uid_t = __kernel_uid_t; -pub type __kernel_old_gid_t = __kernel_gid_t; -pub type __kernel_old_dev_t = crate::ctypes::c_uint; -pub type __kernel_size_t = crate::ctypes::c_uint; -pub type __kernel_ssize_t = crate::ctypes::c_int; -pub type __kernel_ptrdiff_t = crate::ctypes::c_int; -pub type __kernel_off_t = __kernel_long_t; -pub type __kernel_loff_t = crate::ctypes::c_longlong; -pub type __kernel_old_time_t = __kernel_long_t; -pub type __kernel_time_t = __kernel_long_t; -pub type __kernel_time64_t = crate::ctypes::c_longlong; -pub type __kernel_clock_t = __kernel_long_t; -pub type __kernel_timer_t = crate::ctypes::c_int; -pub type __kernel_clockid_t = crate::ctypes::c_int; -pub type __kernel_caddr_t = *mut crate::ctypes::c_char; -pub type __kernel_uid16_t = crate::ctypes::c_ushort; -pub type __kernel_gid16_t = crate::ctypes::c_ushort; -pub type __le16 = __u16; -pub type __be16 = __u16; -pub type __le32 = __u32; -pub type __be32 = __u32; -pub type __le64 = __u64; -pub type __be64 = __u64; -pub type __sum16 = __u16; -pub type __wsum = __u32; -pub type __poll_t = crate::ctypes::c_uint; -pub type cap_user_header_t = *mut __user_cap_header_struct; -pub type cap_user_data_t = *mut __user_cap_data_struct; -pub type __kernel_rwf_t = crate::ctypes::c_int; -pub type old_sigset_t = crate::ctypes::c_ulong; -pub type __signalfn_t = ::core::option::Option; -pub type __sighandler_t = __signalfn_t; -pub type __restorefn_t = ::core::option::Option; -pub type __sigrestore_t = __restorefn_t; -pub type stack_t = sigaltstack; -pub type sigval_t = sigval; -pub type siginfo_t = siginfo; -pub type sigevent_t = sigevent; -pub type cc_t = crate::ctypes::c_uchar; -pub type speed_t = crate::ctypes::c_uint; -pub type tcflag_t = crate::ctypes::c_uint; -pub type __fsword_t = __u32; -#[repr(C)] -#[derive(Copy, Clone, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd)] -pub struct __BindgenBitfieldUnit { -storage: Storage, -} -#[repr(C)] -#[derive(Default)] -pub struct __IncompleteArrayField(::core::marker::PhantomData, [T; 0]); -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct __kernel_fd_set { -pub fds_bits: [crate::ctypes::c_ulong; 32usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct __kernel_fsid_t { -pub val: [crate::ctypes::c_int; 2usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct __user_cap_header_struct { -pub version: __u32, -pub pid: crate::ctypes::c_int, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct __user_cap_data_struct { -pub effective: __u32, -pub permitted: __u32, -pub inheritable: __u32, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct vfs_cap_data { -pub magic_etc: __le32, -pub data: [vfs_cap_data__bindgen_ty_1; 2usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct vfs_cap_data__bindgen_ty_1 { -pub permitted: __le32, -pub inheritable: __le32, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct vfs_ns_cap_data { -pub magic_etc: __le32, -pub data: [vfs_ns_cap_data__bindgen_ty_1; 2usize], -pub rootid: __le32, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct vfs_ns_cap_data__bindgen_ty_1 { -pub permitted: __le32, -pub inheritable: __le32, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct f_owner_ex { -pub type_: crate::ctypes::c_int, -pub pid: __kernel_pid_t, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct flock { -pub l_type: crate::ctypes::c_short, -pub l_whence: crate::ctypes::c_short, -pub l_start: __kernel_off_t, -pub l_len: __kernel_off_t, -pub l_pid: __kernel_pid_t, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct flock64 { -pub l_type: crate::ctypes::c_short, -pub l_whence: crate::ctypes::c_short, -pub l_start: __kernel_loff_t, -pub l_len: __kernel_loff_t, -pub l_pid: __kernel_pid_t, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct open_how { -pub flags: __u64, -pub mode: __u64, -pub resolve: __u64, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct epoll_event { -pub events: __poll_t, -pub data: __u64, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fscrypt_policy_v1 { -pub version: __u8, -pub contents_encryption_mode: __u8, -pub filenames_encryption_mode: __u8, -pub flags: __u8, -pub master_key_descriptor: [__u8; 8usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fscrypt_key { -pub mode: __u32, -pub raw: [__u8; 64usize], -pub size: __u32, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fscrypt_policy_v2 { -pub version: __u8, -pub contents_encryption_mode: __u8, -pub filenames_encryption_mode: __u8, -pub flags: __u8, -pub __reserved: [__u8; 4usize], -pub master_key_identifier: [__u8; 16usize], -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct fscrypt_get_policy_ex_arg { -pub policy_size: __u64, -pub policy: fscrypt_get_policy_ex_arg__bindgen_ty_1, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct fscrypt_key_specifier { -pub type_: __u32, -pub __reserved: __u32, -pub u: fscrypt_key_specifier__bindgen_ty_1, -} -#[repr(C)] -#[derive(Debug)] -pub struct fscrypt_provisioning_key_payload { -pub type_: __u32, -pub __reserved: __u32, -pub raw: __IncompleteArrayField<__u8>, -} -#[repr(C)] -pub struct fscrypt_add_key_arg { -pub key_spec: fscrypt_key_specifier, -pub raw_size: __u32, -pub key_id: __u32, -pub __reserved: [__u32; 8usize], -pub raw: __IncompleteArrayField<__u8>, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct fscrypt_remove_key_arg { -pub key_spec: fscrypt_key_specifier, -pub removal_status_flags: __u32, -pub __reserved: [__u32; 5usize], -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct fscrypt_get_key_status_arg { -pub key_spec: fscrypt_key_specifier, -pub __reserved: [__u32; 6usize], -pub status: __u32, -pub status_flags: __u32, -pub user_count: __u32, -pub __out_reserved: [__u32; 13usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct mount_attr { -pub attr_set: __u64, -pub attr_clr: __u64, -pub propagation: __u64, -pub userns_fd: __u64, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct file_clone_range { -pub src_fd: __s64, -pub src_offset: __u64, -pub src_length: __u64, -pub dest_offset: __u64, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fstrim_range { -pub start: __u64, -pub len: __u64, -pub minlen: __u64, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct file_dedupe_range_info { -pub dest_fd: __s64, -pub dest_offset: __u64, -pub bytes_deduped: __u64, -pub status: __s32, -pub reserved: __u32, -} -#[repr(C)] -#[derive(Debug)] -pub struct file_dedupe_range { -pub src_offset: __u64, -pub src_length: __u64, -pub dest_count: __u16, -pub reserved1: __u16, -pub reserved2: __u32, -pub info: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct files_stat_struct { -pub nr_files: crate::ctypes::c_ulong, -pub nr_free_files: crate::ctypes::c_ulong, -pub max_files: crate::ctypes::c_ulong, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct inodes_stat_t { -pub nr_inodes: crate::ctypes::c_long, -pub nr_unused: crate::ctypes::c_long, -pub dummy: [crate::ctypes::c_long; 5usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fsxattr { -pub fsx_xflags: __u32, -pub fsx_extsize: __u32, -pub fsx_nextents: __u32, -pub fsx_projid: __u32, -pub fsx_cowextsize: __u32, -pub fsx_pad: [crate::ctypes::c_uchar; 8usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct futex_waitv { -pub val: __u64, -pub uaddr: __u64, -pub flags: __u32, -pub __reserved: __u32, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct robust_list { -pub next: *mut robust_list, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct robust_list_head { -pub list: robust_list, -pub futex_offset: crate::ctypes::c_long, -pub list_op_pending: *mut robust_list, -} -#[repr(C)] -#[derive(Debug)] -pub struct inotify_event { -pub wd: __s32, -pub mask: __u32, -pub cookie: __u32, -pub len: __u32, -pub name: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct pollfd { -pub fd: crate::ctypes::c_int, -pub events: crate::ctypes::c_short, -pub revents: crate::ctypes::c_short, -} -#[repr(C)] -#[derive(Debug)] -pub struct rand_pool_info { -pub entropy_count: crate::ctypes::c_int, -pub buf_size: crate::ctypes::c_int, -pub buf: __IncompleteArrayField<__u32>, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct __kernel_timespec { -pub tv_sec: __kernel_time64_t, -pub tv_nsec: crate::ctypes::c_longlong, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct __kernel_itimerspec { -pub it_interval: __kernel_timespec, -pub it_value: __kernel_timespec, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct __kernel_old_timeval { -pub tv_sec: __kernel_long_t, -pub tv_usec: __kernel_long_t, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct __kernel_old_timespec { -pub tv_sec: __kernel_old_time_t, -pub tv_nsec: crate::ctypes::c_long, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct __kernel_old_itimerval { -pub it_interval: __kernel_old_timeval, -pub it_value: __kernel_old_timeval, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct __kernel_sock_timeval { -pub tv_sec: __s64, -pub tv_usec: __s64, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct timespec { -pub tv_sec: __kernel_old_time_t, -pub tv_nsec: crate::ctypes::c_long, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct timeval { -pub tv_sec: __kernel_old_time_t, -pub tv_usec: __kernel_suseconds_t, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct itimerspec { -pub it_interval: timespec, -pub it_value: timespec, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct itimerval { -pub it_interval: timeval, -pub it_value: timeval, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct timezone { -pub tz_minuteswest: crate::ctypes::c_int, -pub tz_dsttime: crate::ctypes::c_int, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct rusage { -pub ru_utime: __kernel_old_timeval, -pub ru_stime: __kernel_old_timeval, -pub ru_maxrss: __kernel_long_t, -pub ru_ixrss: __kernel_long_t, -pub ru_idrss: __kernel_long_t, -pub ru_isrss: __kernel_long_t, -pub ru_minflt: __kernel_long_t, -pub ru_majflt: __kernel_long_t, -pub ru_nswap: __kernel_long_t, -pub ru_inblock: __kernel_long_t, -pub ru_oublock: __kernel_long_t, -pub ru_msgsnd: __kernel_long_t, -pub ru_msgrcv: __kernel_long_t, -pub ru_nsignals: __kernel_long_t, -pub ru_nvcsw: __kernel_long_t, -pub ru_nivcsw: __kernel_long_t, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct rlimit { -pub rlim_cur: __kernel_ulong_t, -pub rlim_max: __kernel_ulong_t, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct rlimit64 { -pub rlim_cur: __u64, -pub rlim_max: __u64, -} -#[repr(C)] -#[repr(align(8))] -#[derive(Debug, Copy, Clone)] -pub struct clone_args { -pub flags: __u64, -pub pidfd: __u64, -pub child_tid: __u64, -pub parent_tid: __u64, -pub exit_signal: __u64, -pub stack: __u64, -pub stack_size: __u64, -pub tls: __u64, -pub set_tid: __u64, -pub set_tid_size: __u64, -pub cgroup: __u64, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct sigset_t { -pub sig: [crate::ctypes::c_ulong; 2usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct sigaction { -pub sa_handler: __sighandler_t, -pub sa_flags: crate::ctypes::c_ulong, -pub sa_mask: sigset_t, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct sigaltstack { -pub ss_sp: *mut crate::ctypes::c_void, -pub ss_flags: crate::ctypes::c_int, -pub ss_size: __kernel_size_t, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct __sifields__bindgen_ty_1 { -pub _pid: __kernel_pid_t, -pub _uid: __kernel_uid32_t, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct __sifields__bindgen_ty_2 { -pub _tid: __kernel_timer_t, -pub _overrun: crate::ctypes::c_int, -pub _sigval: sigval_t, -pub _sys_private: crate::ctypes::c_int, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct __sifields__bindgen_ty_3 { -pub _pid: __kernel_pid_t, -pub _uid: __kernel_uid32_t, -pub _sigval: sigval_t, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct __sifields__bindgen_ty_4 { -pub _pid: __kernel_pid_t, -pub _uid: __kernel_uid32_t, -pub _status: crate::ctypes::c_int, -pub _utime: __kernel_clock_t, -pub _stime: __kernel_clock_t, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct __sifields__bindgen_ty_5 { -pub _addr: *mut crate::ctypes::c_void, -pub __bindgen_anon_1: __sifields__bindgen_ty_5__bindgen_ty_1, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct __sifields__bindgen_ty_5__bindgen_ty_1__bindgen_ty_1 { -pub _dummy_bnd: [crate::ctypes::c_char; 4usize], -pub _lower: *mut crate::ctypes::c_void, -pub _upper: *mut crate::ctypes::c_void, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct __sifields__bindgen_ty_5__bindgen_ty_1__bindgen_ty_2 { -pub _dummy_pkey: [crate::ctypes::c_char; 4usize], -pub _pkey: __u32, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct __sifields__bindgen_ty_5__bindgen_ty_1__bindgen_ty_3 { -pub _data: crate::ctypes::c_ulong, -pub _type: __u32, -pub _flags: __u32, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct __sifields__bindgen_ty_6 { -pub _band: crate::ctypes::c_long, -pub _fd: crate::ctypes::c_int, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct __sifields__bindgen_ty_7 { -pub _call_addr: *mut crate::ctypes::c_void, -pub _syscall: crate::ctypes::c_int, -pub _arch: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct siginfo { -pub __bindgen_anon_1: siginfo__bindgen_ty_1, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct siginfo__bindgen_ty_1__bindgen_ty_1 { -pub si_signo: crate::ctypes::c_int, -pub si_errno: crate::ctypes::c_int, -pub si_code: crate::ctypes::c_int, -pub _sifields: __sifields, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct sigevent { -pub sigev_value: sigval_t, -pub sigev_signo: crate::ctypes::c_int, -pub sigev_notify: crate::ctypes::c_int, -pub _sigev_un: sigevent__bindgen_ty_1, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct sigevent__bindgen_ty_1__bindgen_ty_1 { -pub _function: ::core::option::Option, -pub _attribute: *mut crate::ctypes::c_void, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct statx_timestamp { -pub tv_sec: __s64, -pub tv_nsec: __u32, -pub __reserved: __s32, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct statx { -pub stx_mask: __u32, -pub stx_blksize: __u32, -pub stx_attributes: __u64, -pub stx_nlink: __u32, -pub stx_uid: __u32, -pub stx_gid: __u32, -pub stx_mode: __u16, -pub __spare0: [__u16; 1usize], -pub stx_ino: __u64, -pub stx_size: __u64, -pub stx_blocks: __u64, -pub stx_attributes_mask: __u64, -pub stx_atime: statx_timestamp, -pub stx_btime: statx_timestamp, -pub stx_ctime: statx_timestamp, -pub stx_mtime: statx_timestamp, -pub stx_rdev_major: __u32, -pub stx_rdev_minor: __u32, -pub stx_dev_major: __u32, -pub stx_dev_minor: __u32, -pub stx_mnt_id: __u64, -pub stx_dio_mem_align: __u32, -pub stx_dio_offset_align: __u32, -pub __spare3: [__u64; 12usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct termios { -pub c_iflag: tcflag_t, -pub c_oflag: tcflag_t, -pub c_cflag: tcflag_t, -pub c_lflag: tcflag_t, -pub c_line: cc_t, -pub c_cc: [cc_t; 19usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct termios2 { -pub c_iflag: tcflag_t, -pub c_oflag: tcflag_t, -pub c_cflag: tcflag_t, -pub c_lflag: tcflag_t, -pub c_line: cc_t, -pub c_cc: [cc_t; 19usize], -pub c_ispeed: speed_t, -pub c_ospeed: speed_t, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ktermios { -pub c_iflag: tcflag_t, -pub c_oflag: tcflag_t, -pub c_cflag: tcflag_t, -pub c_lflag: tcflag_t, -pub c_line: cc_t, -pub c_cc: [cc_t; 19usize], -pub c_ispeed: speed_t, -pub c_ospeed: speed_t, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct winsize { -pub ws_row: crate::ctypes::c_ushort, -pub ws_col: crate::ctypes::c_ushort, -pub ws_xpixel: crate::ctypes::c_ushort, -pub ws_ypixel: crate::ctypes::c_ushort, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct termio { -pub c_iflag: crate::ctypes::c_ushort, -pub c_oflag: crate::ctypes::c_ushort, -pub c_cflag: crate::ctypes::c_ushort, -pub c_lflag: crate::ctypes::c_ushort, -pub c_line: crate::ctypes::c_uchar, -pub c_cc: [crate::ctypes::c_uchar; 8usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct iovec { -pub iov_base: *mut crate::ctypes::c_void, -pub iov_len: __kernel_size_t, -} -#[repr(C, packed)] -#[derive(Copy, Clone)] -pub struct uffd_msg { -pub event: __u8, -pub reserved1: __u8, -pub reserved2: __u16, -pub reserved3: __u32, -pub arg: uffd_msg__bindgen_ty_1, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct uffd_msg__bindgen_ty_1__bindgen_ty_1 { -pub flags: __u64, -pub address: __u64, -pub feat: uffd_msg__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct uffd_msg__bindgen_ty_1__bindgen_ty_2 { -pub ufd: __u32, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct uffd_msg__bindgen_ty_1__bindgen_ty_3 { -pub from: __u64, -pub to: __u64, -pub len: __u64, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct uffd_msg__bindgen_ty_1__bindgen_ty_4 { -pub start: __u64, -pub end: __u64, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct uffd_msg__bindgen_ty_1__bindgen_ty_5 { -pub reserved1: __u64, -pub reserved2: __u64, -pub reserved3: __u64, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct uffdio_api { -pub api: __u64, -pub features: __u64, -pub ioctls: __u64, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct uffdio_range { -pub start: __u64, -pub len: __u64, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct uffdio_register { -pub range: uffdio_range, -pub mode: __u64, -pub ioctls: __u64, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct uffdio_copy { -pub dst: __u64, -pub src: __u64, -pub len: __u64, -pub mode: __u64, -pub copy: __s64, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct uffdio_zeropage { -pub range: uffdio_range, -pub mode: __u64, -pub zeropage: __s64, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct uffdio_writeprotect { -pub range: uffdio_range, -pub mode: __u64, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct uffdio_continue { -pub range: uffdio_range, -pub mode: __u64, -pub mapped: __s64, -} -#[repr(C)] -#[derive(Debug)] -pub struct linux_dirent64 { -pub d_ino: crate::ctypes::c_ulonglong, -pub d_off: crate::ctypes::c_longlong, -pub d_reclen: __u16, -pub d_type: __u8, -pub d_name: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct stat { -pub st_dev: crate::ctypes::c_ulong, -pub st_ino: crate::ctypes::c_ulong, -pub st_mode: crate::ctypes::c_uint, -pub st_nlink: crate::ctypes::c_uint, -pub st_uid: crate::ctypes::c_uint, -pub st_gid: crate::ctypes::c_uint, -pub st_rdev: crate::ctypes::c_ulong, -pub __pad1: crate::ctypes::c_ulong, -pub st_size: crate::ctypes::c_long, -pub st_blksize: crate::ctypes::c_int, -pub __pad2: crate::ctypes::c_int, -pub st_blocks: crate::ctypes::c_long, -pub st_atime: crate::ctypes::c_long, -pub st_atime_nsec: crate::ctypes::c_ulong, -pub st_mtime: crate::ctypes::c_long, -pub st_mtime_nsec: crate::ctypes::c_ulong, -pub st_ctime: crate::ctypes::c_long, -pub st_ctime_nsec: crate::ctypes::c_ulong, -pub __unused4: crate::ctypes::c_uint, -pub __unused5: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct stat64 { -pub st_dev: crate::ctypes::c_ulonglong, -pub st_ino: crate::ctypes::c_ulonglong, -pub st_mode: crate::ctypes::c_uint, -pub st_nlink: crate::ctypes::c_uint, -pub st_uid: crate::ctypes::c_uint, -pub st_gid: crate::ctypes::c_uint, -pub st_rdev: crate::ctypes::c_ulonglong, -pub __pad1: crate::ctypes::c_ulonglong, -pub st_size: crate::ctypes::c_longlong, -pub st_blksize: crate::ctypes::c_int, -pub __pad2: crate::ctypes::c_int, -pub st_blocks: crate::ctypes::c_longlong, -pub st_atime: crate::ctypes::c_int, -pub st_atime_nsec: crate::ctypes::c_uint, -pub st_mtime: crate::ctypes::c_int, -pub st_mtime_nsec: crate::ctypes::c_uint, -pub st_ctime: crate::ctypes::c_int, -pub st_ctime_nsec: crate::ctypes::c_uint, -pub __unused4: crate::ctypes::c_uint, -pub __unused5: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct statfs { -pub f_type: __u32, -pub f_bsize: __u32, -pub f_blocks: __u32, -pub f_bfree: __u32, -pub f_bavail: __u32, -pub f_files: __u32, -pub f_ffree: __u32, -pub f_fsid: __kernel_fsid_t, -pub f_namelen: __u32, -pub f_frsize: __u32, -pub f_flags: __u32, -pub f_spare: [__u32; 4usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct statfs64 { -pub f_type: __u32, -pub f_bsize: __u32, -pub f_blocks: __u64, -pub f_bfree: __u64, -pub f_bavail: __u64, -pub f_files: __u64, -pub f_ffree: __u64, -pub f_fsid: __kernel_fsid_t, -pub f_namelen: __u32, -pub f_frsize: __u32, -pub f_flags: __u32, -pub f_spare: [__u32; 4usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct compat_statfs64 { -pub f_type: __u32, -pub f_bsize: __u32, -pub f_blocks: __u64, -pub f_bfree: __u64, -pub f_bavail: __u64, -pub f_files: __u64, -pub f_ffree: __u64, -pub f_fsid: __kernel_fsid_t, -pub f_namelen: __u32, -pub f_frsize: __u32, -pub f_flags: __u32, -pub f_spare: [__u32; 4usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct user_desc { -pub entry_number: crate::ctypes::c_uint, -pub base_addr: crate::ctypes::c_uint, -pub limit: crate::ctypes::c_uint, -pub _bitfield_align_1: [u8; 0], -pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, -pub __bindgen_padding_0: [u8; 3usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct kernel_sigset_t { -pub sig: [crate::ctypes::c_ulong; 2usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct kernel_sigaction { -pub sa_handler_kernel: __kernel_sighandler_t, -pub sa_flags: crate::ctypes::c_ulong, -pub sa_mask: kernel_sigset_t, -} -pub const LINUX_VERSION_CODE: u32 = 393984; -pub const LINUX_VERSION_MAJOR: u32 = 6; -pub const LINUX_VERSION_PATCHLEVEL: u32 = 3; -pub const LINUX_VERSION_SUBLEVEL: u32 = 0; -pub const AT_NULL: u32 = 0; -pub const AT_IGNORE: u32 = 1; -pub const AT_EXECFD: u32 = 2; -pub const AT_PHDR: u32 = 3; -pub const AT_PHENT: u32 = 4; -pub const AT_PHNUM: u32 = 5; -pub const AT_PAGESZ: u32 = 6; -pub const AT_BASE: u32 = 7; -pub const AT_FLAGS: u32 = 8; -pub const AT_ENTRY: u32 = 9; -pub const AT_NOTELF: u32 = 10; -pub const AT_UID: u32 = 11; -pub const AT_EUID: u32 = 12; -pub const AT_GID: u32 = 13; -pub const AT_EGID: u32 = 14; -pub const AT_PLATFORM: u32 = 15; -pub const AT_HWCAP: u32 = 16; -pub const AT_CLKTCK: u32 = 17; -pub const AT_SECURE: u32 = 23; -pub const AT_BASE_PLATFORM: u32 = 24; -pub const AT_RANDOM: u32 = 25; -pub const AT_HWCAP2: u32 = 26; -pub const AT_RSEQ_FEATURE_SIZE: u32 = 27; -pub const AT_RSEQ_ALIGN: u32 = 28; -pub const AT_EXECFN: u32 = 31; -pub const AT_MINSIGSTKSZ: u32 = 51; -pub const __FD_SETSIZE: u32 = 1024; -pub const _LINUX_CAPABILITY_VERSION_1: u32 = 429392688; -pub const _LINUX_CAPABILITY_U32S_1: u32 = 1; -pub const _LINUX_CAPABILITY_VERSION_2: u32 = 537333798; -pub const _LINUX_CAPABILITY_U32S_2: u32 = 2; -pub const _LINUX_CAPABILITY_VERSION_3: u32 = 537396514; -pub const _LINUX_CAPABILITY_U32S_3: u32 = 2; -pub const VFS_CAP_REVISION_MASK: u32 = 4278190080; -pub const VFS_CAP_REVISION_SHIFT: u32 = 24; -pub const VFS_CAP_FLAGS_MASK: i64 = -4278190081; -pub const VFS_CAP_FLAGS_EFFECTIVE: u32 = 1; -pub const VFS_CAP_REVISION_1: u32 = 16777216; -pub const VFS_CAP_U32_1: u32 = 1; -pub const VFS_CAP_REVISION_2: u32 = 33554432; -pub const VFS_CAP_U32_2: u32 = 2; -pub const VFS_CAP_REVISION_3: u32 = 50331648; -pub const VFS_CAP_U32_3: u32 = 2; -pub const VFS_CAP_U32: u32 = 2; -pub const VFS_CAP_REVISION: u32 = 50331648; -pub const _LINUX_CAPABILITY_VERSION: u32 = 429392688; -pub const _LINUX_CAPABILITY_U32S: u32 = 1; -pub const CAP_CHOWN: u32 = 0; -pub const CAP_DAC_OVERRIDE: u32 = 1; -pub const CAP_DAC_READ_SEARCH: u32 = 2; -pub const CAP_FOWNER: u32 = 3; -pub const CAP_FSETID: u32 = 4; -pub const CAP_KILL: u32 = 5; -pub const CAP_SETGID: u32 = 6; -pub const CAP_SETUID: u32 = 7; -pub const CAP_SETPCAP: u32 = 8; -pub const CAP_LINUX_IMMUTABLE: u32 = 9; -pub const CAP_NET_BIND_SERVICE: u32 = 10; -pub const CAP_NET_BROADCAST: u32 = 11; -pub const CAP_NET_ADMIN: u32 = 12; -pub const CAP_NET_RAW: u32 = 13; -pub const CAP_IPC_LOCK: u32 = 14; -pub const CAP_IPC_OWNER: u32 = 15; -pub const CAP_SYS_MODULE: u32 = 16; -pub const CAP_SYS_RAWIO: u32 = 17; -pub const CAP_SYS_CHROOT: u32 = 18; -pub const CAP_SYS_PTRACE: u32 = 19; -pub const CAP_SYS_PACCT: u32 = 20; -pub const CAP_SYS_ADMIN: u32 = 21; -pub const CAP_SYS_BOOT: u32 = 22; -pub const CAP_SYS_NICE: u32 = 23; -pub const CAP_SYS_RESOURCE: u32 = 24; -pub const CAP_SYS_TIME: u32 = 25; -pub const CAP_SYS_TTY_CONFIG: u32 = 26; -pub const CAP_MKNOD: u32 = 27; -pub const CAP_LEASE: u32 = 28; -pub const CAP_AUDIT_WRITE: u32 = 29; -pub const CAP_AUDIT_CONTROL: u32 = 30; -pub const CAP_SETFCAP: u32 = 31; -pub const CAP_MAC_OVERRIDE: u32 = 32; -pub const CAP_MAC_ADMIN: u32 = 33; -pub const CAP_SYSLOG: u32 = 34; -pub const CAP_WAKE_ALARM: u32 = 35; -pub const CAP_BLOCK_SUSPEND: u32 = 36; -pub const CAP_AUDIT_READ: u32 = 37; -pub const CAP_PERFMON: u32 = 38; -pub const CAP_BPF: u32 = 39; -pub const CAP_CHECKPOINT_RESTORE: u32 = 40; -pub const CAP_LAST_CAP: u32 = 40; -pub const O_ACCMODE: u32 = 3; -pub const O_RDONLY: u32 = 0; -pub const O_WRONLY: u32 = 1; -pub const O_RDWR: u32 = 2; -pub const O_CREAT: u32 = 64; -pub const O_EXCL: u32 = 128; -pub const O_NOCTTY: u32 = 256; -pub const O_TRUNC: u32 = 512; -pub const O_APPEND: u32 = 1024; -pub const O_NONBLOCK: u32 = 2048; -pub const O_DSYNC: u32 = 4096; -pub const FASYNC: u32 = 8192; -pub const O_DIRECT: u32 = 16384; -pub const O_LARGEFILE: u32 = 32768; -pub const O_DIRECTORY: u32 = 65536; -pub const O_NOFOLLOW: u32 = 131072; -pub const O_NOATIME: u32 = 262144; -pub const O_CLOEXEC: u32 = 524288; -pub const __O_SYNC: u32 = 1048576; -pub const O_SYNC: u32 = 1052672; -pub const O_PATH: u32 = 2097152; -pub const __O_TMPFILE: u32 = 4194304; -pub const O_TMPFILE: u32 = 4259840; -pub const O_TMPFILE_MASK: u32 = 4259904; -pub const O_NDELAY: u32 = 2048; -pub const F_DUPFD: u32 = 0; -pub const F_GETFD: u32 = 1; -pub const F_SETFD: u32 = 2; -pub const F_GETFL: u32 = 3; -pub const F_SETFL: u32 = 4; -pub const F_GETLK: u32 = 5; -pub const F_SETLK: u32 = 6; -pub const F_SETLKW: u32 = 7; -pub const F_SETOWN: u32 = 8; -pub const F_GETOWN: u32 = 9; -pub const F_SETSIG: u32 = 10; -pub const F_GETSIG: u32 = 11; -pub const F_GETLK64: u32 = 12; -pub const F_SETLK64: u32 = 13; -pub const F_SETLKW64: u32 = 14; -pub const F_SETOWN_EX: u32 = 15; -pub const F_GETOWN_EX: u32 = 16; -pub const F_GETOWNER_UIDS: u32 = 17; -pub const F_OFD_GETLK: u32 = 36; -pub const F_OFD_SETLK: u32 = 37; -pub const F_OFD_SETLKW: u32 = 38; -pub const F_OWNER_TID: u32 = 0; -pub const F_OWNER_PID: u32 = 1; -pub const F_OWNER_PGRP: u32 = 2; -pub const FD_CLOEXEC: u32 = 1; -pub const F_RDLCK: u32 = 0; -pub const F_WRLCK: u32 = 1; -pub const F_UNLCK: u32 = 2; -pub const F_EXLCK: u32 = 4; -pub const F_SHLCK: u32 = 8; -pub const LOCK_SH: u32 = 1; -pub const LOCK_EX: u32 = 2; -pub const LOCK_NB: u32 = 4; -pub const LOCK_UN: u32 = 8; -pub const LOCK_MAND: u32 = 32; -pub const LOCK_READ: u32 = 64; -pub const LOCK_WRITE: u32 = 128; -pub const LOCK_RW: u32 = 192; -pub const F_LINUX_SPECIFIC_BASE: u32 = 1024; -pub const RESOLVE_NO_XDEV: u32 = 1; -pub const RESOLVE_NO_MAGICLINKS: u32 = 2; -pub const RESOLVE_NO_SYMLINKS: u32 = 4; -pub const RESOLVE_BENEATH: u32 = 8; -pub const RESOLVE_IN_ROOT: u32 = 16; -pub const RESOLVE_CACHED: u32 = 32; -pub const F_SETLEASE: u32 = 1024; -pub const F_GETLEASE: u32 = 1025; -pub const F_CANCELLK: u32 = 1029; -pub const F_DUPFD_CLOEXEC: u32 = 1030; -pub const F_NOTIFY: u32 = 1026; -pub const F_SETPIPE_SZ: u32 = 1031; -pub const F_GETPIPE_SZ: u32 = 1032; -pub const F_ADD_SEALS: u32 = 1033; -pub const F_GET_SEALS: u32 = 1034; -pub const F_SEAL_SEAL: u32 = 1; -pub const F_SEAL_SHRINK: u32 = 2; -pub const F_SEAL_GROW: u32 = 4; -pub const F_SEAL_WRITE: u32 = 8; -pub const F_SEAL_FUTURE_WRITE: u32 = 16; -pub const F_SEAL_EXEC: u32 = 32; -pub const F_GET_RW_HINT: u32 = 1035; -pub const F_SET_RW_HINT: u32 = 1036; -pub const F_GET_FILE_RW_HINT: u32 = 1037; -pub const F_SET_FILE_RW_HINT: u32 = 1038; -pub const RWH_WRITE_LIFE_NOT_SET: u32 = 0; -pub const RWH_WRITE_LIFE_NONE: u32 = 1; -pub const RWH_WRITE_LIFE_SHORT: u32 = 2; -pub const RWH_WRITE_LIFE_MEDIUM: u32 = 3; -pub const RWH_WRITE_LIFE_LONG: u32 = 4; -pub const RWH_WRITE_LIFE_EXTREME: u32 = 5; -pub const RWF_WRITE_LIFE_NOT_SET: u32 = 0; -pub const DN_ACCESS: u32 = 1; -pub const DN_MODIFY: u32 = 2; -pub const DN_CREATE: u32 = 4; -pub const DN_DELETE: u32 = 8; -pub const DN_RENAME: u32 = 16; -pub const DN_ATTRIB: u32 = 32; -pub const DN_MULTISHOT: u32 = 2147483648; -pub const AT_FDCWD: i32 = -100; -pub const AT_SYMLINK_NOFOLLOW: u32 = 256; -pub const AT_EACCESS: u32 = 512; -pub const AT_REMOVEDIR: u32 = 512; -pub const AT_SYMLINK_FOLLOW: u32 = 1024; -pub const AT_NO_AUTOMOUNT: u32 = 2048; -pub const AT_EMPTY_PATH: u32 = 4096; -pub const AT_STATX_SYNC_TYPE: u32 = 24576; -pub const AT_STATX_SYNC_AS_STAT: u32 = 0; -pub const AT_STATX_FORCE_SYNC: u32 = 8192; -pub const AT_STATX_DONT_SYNC: u32 = 16384; -pub const AT_RECURSIVE: u32 = 32768; -pub const EPOLL_CLOEXEC: u32 = 524288; -pub const EPOLL_CTL_ADD: u32 = 1; -pub const EPOLL_CTL_DEL: u32 = 2; -pub const EPOLL_CTL_MOD: u32 = 3; -pub const POSIX_FADV_NORMAL: u32 = 0; -pub const POSIX_FADV_RANDOM: u32 = 1; -pub const POSIX_FADV_SEQUENTIAL: u32 = 2; -pub const POSIX_FADV_WILLNEED: u32 = 3; -pub const POSIX_FADV_DONTNEED: u32 = 4; -pub const POSIX_FADV_NOREUSE: u32 = 5; -pub const FALLOC_FL_KEEP_SIZE: u32 = 1; -pub const FALLOC_FL_PUNCH_HOLE: u32 = 2; -pub const FALLOC_FL_NO_HIDE_STALE: u32 = 4; -pub const FALLOC_FL_COLLAPSE_RANGE: u32 = 8; -pub const FALLOC_FL_ZERO_RANGE: u32 = 16; -pub const FALLOC_FL_INSERT_RANGE: u32 = 32; -pub const FALLOC_FL_UNSHARE_RANGE: u32 = 64; -pub const NR_OPEN: u32 = 1024; -pub const NGROUPS_MAX: u32 = 65536; -pub const ARG_MAX: u32 = 131072; -pub const LINK_MAX: u32 = 127; -pub const MAX_CANON: u32 = 255; -pub const MAX_INPUT: u32 = 255; -pub const NAME_MAX: u32 = 255; -pub const PATH_MAX: u32 = 4096; -pub const PIPE_BUF: u32 = 4096; -pub const XATTR_NAME_MAX: u32 = 255; -pub const XATTR_SIZE_MAX: u32 = 65536; -pub const XATTR_LIST_MAX: u32 = 65536; -pub const RTSIG_MAX: u32 = 32; -pub const _IOC_NRBITS: u32 = 8; -pub const _IOC_TYPEBITS: u32 = 8; -pub const _IOC_SIZEBITS: u32 = 14; -pub const _IOC_DIRBITS: u32 = 2; -pub const _IOC_NRMASK: u32 = 255; -pub const _IOC_TYPEMASK: u32 = 255; -pub const _IOC_SIZEMASK: u32 = 16383; -pub const _IOC_DIRMASK: u32 = 3; -pub const _IOC_NRSHIFT: u32 = 0; -pub const _IOC_TYPESHIFT: u32 = 8; -pub const _IOC_SIZESHIFT: u32 = 16; -pub const _IOC_DIRSHIFT: u32 = 30; -pub const _IOC_NONE: u32 = 0; -pub const _IOC_WRITE: u32 = 1; -pub const _IOC_READ: u32 = 2; -pub const IOC_IN: u32 = 1073741824; -pub const IOC_OUT: u32 = 2147483648; -pub const IOC_INOUT: u32 = 3221225472; -pub const IOCSIZE_MASK: u32 = 1073676288; -pub const IOCSIZE_SHIFT: u32 = 16; -pub const FSCRYPT_POLICY_FLAGS_PAD_4: u32 = 0; -pub const FSCRYPT_POLICY_FLAGS_PAD_8: u32 = 1; -pub const FSCRYPT_POLICY_FLAGS_PAD_16: u32 = 2; -pub const FSCRYPT_POLICY_FLAGS_PAD_32: u32 = 3; -pub const FSCRYPT_POLICY_FLAGS_PAD_MASK: u32 = 3; -pub const FSCRYPT_POLICY_FLAG_DIRECT_KEY: u32 = 4; -pub const FSCRYPT_POLICY_FLAG_IV_INO_LBLK_64: u32 = 8; -pub const FSCRYPT_POLICY_FLAG_IV_INO_LBLK_32: u32 = 16; -pub const FSCRYPT_MODE_AES_256_XTS: u32 = 1; -pub const FSCRYPT_MODE_AES_256_CTS: u32 = 4; -pub const FSCRYPT_MODE_AES_128_CBC: u32 = 5; -pub const FSCRYPT_MODE_AES_128_CTS: u32 = 6; -pub const FSCRYPT_MODE_SM4_XTS: u32 = 7; -pub const FSCRYPT_MODE_SM4_CTS: u32 = 8; -pub const FSCRYPT_MODE_ADIANTUM: u32 = 9; -pub const FSCRYPT_MODE_AES_256_HCTR2: u32 = 10; -pub const FSCRYPT_POLICY_V1: u32 = 0; -pub const FSCRYPT_KEY_DESCRIPTOR_SIZE: u32 = 8; -pub const FSCRYPT_KEY_DESC_PREFIX: &[u8; 9] = b"fscrypt:\0"; -pub const FSCRYPT_KEY_DESC_PREFIX_SIZE: u32 = 8; -pub const FSCRYPT_MAX_KEY_SIZE: u32 = 64; -pub const FSCRYPT_POLICY_V2: u32 = 2; -pub const FSCRYPT_KEY_IDENTIFIER_SIZE: u32 = 16; -pub const FSCRYPT_KEY_SPEC_TYPE_DESCRIPTOR: u32 = 1; -pub const FSCRYPT_KEY_SPEC_TYPE_IDENTIFIER: u32 = 2; -pub const FSCRYPT_KEY_REMOVAL_STATUS_FLAG_FILES_BUSY: u32 = 1; -pub const FSCRYPT_KEY_REMOVAL_STATUS_FLAG_OTHER_USERS: u32 = 2; -pub const FSCRYPT_KEY_STATUS_ABSENT: u32 = 1; -pub const FSCRYPT_KEY_STATUS_PRESENT: u32 = 2; -pub const FSCRYPT_KEY_STATUS_INCOMPLETELY_REMOVED: u32 = 3; -pub const FSCRYPT_KEY_STATUS_FLAG_ADDED_BY_SELF: u32 = 1; -pub const FS_KEY_DESCRIPTOR_SIZE: u32 = 8; -pub const FS_POLICY_FLAGS_PAD_4: u32 = 0; -pub const FS_POLICY_FLAGS_PAD_8: u32 = 1; -pub const FS_POLICY_FLAGS_PAD_16: u32 = 2; -pub const FS_POLICY_FLAGS_PAD_32: u32 = 3; -pub const FS_POLICY_FLAGS_PAD_MASK: u32 = 3; -pub const FS_POLICY_FLAG_DIRECT_KEY: u32 = 4; -pub const FS_POLICY_FLAGS_VALID: u32 = 7; -pub const FS_ENCRYPTION_MODE_INVALID: u32 = 0; -pub const FS_ENCRYPTION_MODE_AES_256_XTS: u32 = 1; -pub const FS_ENCRYPTION_MODE_AES_256_GCM: u32 = 2; -pub const FS_ENCRYPTION_MODE_AES_256_CBC: u32 = 3; -pub const FS_ENCRYPTION_MODE_AES_256_CTS: u32 = 4; -pub const FS_ENCRYPTION_MODE_AES_128_CBC: u32 = 5; -pub const FS_ENCRYPTION_MODE_AES_128_CTS: u32 = 6; -pub const FS_ENCRYPTION_MODE_ADIANTUM: u32 = 9; -pub const FS_KEY_DESC_PREFIX: &[u8; 9] = b"fscrypt:\0"; -pub const FS_KEY_DESC_PREFIX_SIZE: u32 = 8; -pub const FS_MAX_KEY_SIZE: u32 = 64; -pub const MS_RDONLY: u32 = 1; -pub const MS_NOSUID: u32 = 2; -pub const MS_NODEV: u32 = 4; -pub const MS_NOEXEC: u32 = 8; -pub const MS_SYNCHRONOUS: u32 = 16; -pub const MS_REMOUNT: u32 = 32; -pub const MS_MANDLOCK: u32 = 64; -pub const MS_DIRSYNC: u32 = 128; -pub const MS_NOSYMFOLLOW: u32 = 256; -pub const MS_NOATIME: u32 = 1024; -pub const MS_NODIRATIME: u32 = 2048; -pub const MS_BIND: u32 = 4096; -pub const MS_MOVE: u32 = 8192; -pub const MS_REC: u32 = 16384; -pub const MS_VERBOSE: u32 = 32768; -pub const MS_SILENT: u32 = 32768; -pub const MS_POSIXACL: u32 = 65536; -pub const MS_UNBINDABLE: u32 = 131072; -pub const MS_PRIVATE: u32 = 262144; -pub const MS_SLAVE: u32 = 524288; -pub const MS_SHARED: u32 = 1048576; -pub const MS_RELATIME: u32 = 2097152; -pub const MS_KERNMOUNT: u32 = 4194304; -pub const MS_I_VERSION: u32 = 8388608; -pub const MS_STRICTATIME: u32 = 16777216; -pub const MS_LAZYTIME: u32 = 33554432; -pub const MS_SUBMOUNT: u32 = 67108864; -pub const MS_NOREMOTELOCK: u32 = 134217728; -pub const MS_NOSEC: u32 = 268435456; -pub const MS_BORN: u32 = 536870912; -pub const MS_ACTIVE: u32 = 1073741824; -pub const MS_NOUSER: u32 = 2147483648; -pub const MS_RMT_MASK: u32 = 41943121; -pub const MS_MGC_VAL: u32 = 3236757504; -pub const MS_MGC_MSK: u32 = 4294901760; -pub const OPEN_TREE_CLONE: u32 = 1; -pub const OPEN_TREE_CLOEXEC: u32 = 524288; -pub const MOVE_MOUNT_F_SYMLINKS: u32 = 1; -pub const MOVE_MOUNT_F_AUTOMOUNTS: u32 = 2; -pub const MOVE_MOUNT_F_EMPTY_PATH: u32 = 4; -pub const MOVE_MOUNT_T_SYMLINKS: u32 = 16; -pub const MOVE_MOUNT_T_AUTOMOUNTS: u32 = 32; -pub const MOVE_MOUNT_T_EMPTY_PATH: u32 = 64; -pub const MOVE_MOUNT_SET_GROUP: u32 = 256; -pub const MOVE_MOUNT__MASK: u32 = 375; -pub const FSOPEN_CLOEXEC: u32 = 1; -pub const FSPICK_CLOEXEC: u32 = 1; -pub const FSPICK_SYMLINK_NOFOLLOW: u32 = 2; -pub const FSPICK_NO_AUTOMOUNT: u32 = 4; -pub const FSPICK_EMPTY_PATH: u32 = 8; -pub const FSMOUNT_CLOEXEC: u32 = 1; -pub const MOUNT_ATTR_RDONLY: u32 = 1; -pub const MOUNT_ATTR_NOSUID: u32 = 2; -pub const MOUNT_ATTR_NODEV: u32 = 4; -pub const MOUNT_ATTR_NOEXEC: u32 = 8; -pub const MOUNT_ATTR__ATIME: u32 = 112; -pub const MOUNT_ATTR_RELATIME: u32 = 0; -pub const MOUNT_ATTR_NOATIME: u32 = 16; -pub const MOUNT_ATTR_STRICTATIME: u32 = 32; -pub const MOUNT_ATTR_NODIRATIME: u32 = 128; -pub const MOUNT_ATTR_IDMAP: u32 = 1048576; -pub const MOUNT_ATTR_NOSYMFOLLOW: u32 = 2097152; -pub const MOUNT_ATTR_SIZE_VER0: u32 = 32; -pub const INR_OPEN_CUR: u32 = 1024; -pub const INR_OPEN_MAX: u32 = 4096; -pub const BLOCK_SIZE_BITS: u32 = 10; -pub const BLOCK_SIZE: u32 = 1024; -pub const SEEK_SET: u32 = 0; -pub const SEEK_CUR: u32 = 1; -pub const SEEK_END: u32 = 2; -pub const SEEK_DATA: u32 = 3; -pub const SEEK_HOLE: u32 = 4; -pub const SEEK_MAX: u32 = 4; -pub const RENAME_NOREPLACE: u32 = 1; -pub const RENAME_EXCHANGE: u32 = 2; -pub const RENAME_WHITEOUT: u32 = 4; -pub const FILE_DEDUPE_RANGE_SAME: u32 = 0; -pub const FILE_DEDUPE_RANGE_DIFFERS: u32 = 1; -pub const NR_FILE: u32 = 8192; -pub const FS_XFLAG_REALTIME: u32 = 1; -pub const FS_XFLAG_PREALLOC: u32 = 2; -pub const FS_XFLAG_IMMUTABLE: u32 = 8; -pub const FS_XFLAG_APPEND: u32 = 16; -pub const FS_XFLAG_SYNC: u32 = 32; -pub const FS_XFLAG_NOATIME: u32 = 64; -pub const FS_XFLAG_NODUMP: u32 = 128; -pub const FS_XFLAG_RTINHERIT: u32 = 256; -pub const FS_XFLAG_PROJINHERIT: u32 = 512; -pub const FS_XFLAG_NOSYMLINKS: u32 = 1024; -pub const FS_XFLAG_EXTSIZE: u32 = 2048; -pub const FS_XFLAG_EXTSZINHERIT: u32 = 4096; -pub const FS_XFLAG_NODEFRAG: u32 = 8192; -pub const FS_XFLAG_FILESTREAM: u32 = 16384; -pub const FS_XFLAG_DAX: u32 = 32768; -pub const FS_XFLAG_COWEXTSIZE: u32 = 65536; -pub const FS_XFLAG_HASATTR: u32 = 2147483648; -pub const BMAP_IOCTL: u32 = 1; -pub const FSLABEL_MAX: u32 = 256; -pub const FS_SECRM_FL: u32 = 1; -pub const FS_UNRM_FL: u32 = 2; -pub const FS_COMPR_FL: u32 = 4; -pub const FS_SYNC_FL: u32 = 8; -pub const FS_IMMUTABLE_FL: u32 = 16; -pub const FS_APPEND_FL: u32 = 32; -pub const FS_NODUMP_FL: u32 = 64; -pub const FS_NOATIME_FL: u32 = 128; -pub const FS_DIRTY_FL: u32 = 256; -pub const FS_COMPRBLK_FL: u32 = 512; -pub const FS_NOCOMP_FL: u32 = 1024; -pub const FS_ENCRYPT_FL: u32 = 2048; -pub const FS_BTREE_FL: u32 = 4096; -pub const FS_INDEX_FL: u32 = 4096; -pub const FS_IMAGIC_FL: u32 = 8192; -pub const FS_JOURNAL_DATA_FL: u32 = 16384; -pub const FS_NOTAIL_FL: u32 = 32768; -pub const FS_DIRSYNC_FL: u32 = 65536; -pub const FS_TOPDIR_FL: u32 = 131072; -pub const FS_HUGE_FILE_FL: u32 = 262144; -pub const FS_EXTENT_FL: u32 = 524288; -pub const FS_VERITY_FL: u32 = 1048576; -pub const FS_EA_INODE_FL: u32 = 2097152; -pub const FS_EOFBLOCKS_FL: u32 = 4194304; -pub const FS_NOCOW_FL: u32 = 8388608; -pub const FS_DAX_FL: u32 = 33554432; -pub const FS_INLINE_DATA_FL: u32 = 268435456; -pub const FS_PROJINHERIT_FL: u32 = 536870912; -pub const FS_CASEFOLD_FL: u32 = 1073741824; -pub const FS_RESERVED_FL: u32 = 2147483648; -pub const FS_FL_USER_VISIBLE: u32 = 253951; -pub const FS_FL_USER_MODIFIABLE: u32 = 229631; -pub const SYNC_FILE_RANGE_WAIT_BEFORE: u32 = 1; -pub const SYNC_FILE_RANGE_WRITE: u32 = 2; -pub const SYNC_FILE_RANGE_WAIT_AFTER: u32 = 4; -pub const SYNC_FILE_RANGE_WRITE_AND_WAIT: u32 = 7; -pub const FUTEX_WAIT: u32 = 0; -pub const FUTEX_WAKE: u32 = 1; -pub const FUTEX_FD: u32 = 2; -pub const FUTEX_REQUEUE: u32 = 3; -pub const FUTEX_CMP_REQUEUE: u32 = 4; -pub const FUTEX_WAKE_OP: u32 = 5; -pub const FUTEX_LOCK_PI: u32 = 6; -pub const FUTEX_UNLOCK_PI: u32 = 7; -pub const FUTEX_TRYLOCK_PI: u32 = 8; -pub const FUTEX_WAIT_BITSET: u32 = 9; -pub const FUTEX_WAKE_BITSET: u32 = 10; -pub const FUTEX_WAIT_REQUEUE_PI: u32 = 11; -pub const FUTEX_CMP_REQUEUE_PI: u32 = 12; -pub const FUTEX_LOCK_PI2: u32 = 13; -pub const FUTEX_PRIVATE_FLAG: u32 = 128; -pub const FUTEX_CLOCK_REALTIME: u32 = 256; -pub const FUTEX_CMD_MASK: i32 = -385; -pub const FUTEX_WAIT_PRIVATE: u32 = 128; -pub const FUTEX_WAKE_PRIVATE: u32 = 129; -pub const FUTEX_REQUEUE_PRIVATE: u32 = 131; -pub const FUTEX_CMP_REQUEUE_PRIVATE: u32 = 132; -pub const FUTEX_WAKE_OP_PRIVATE: u32 = 133; -pub const FUTEX_LOCK_PI_PRIVATE: u32 = 134; -pub const FUTEX_LOCK_PI2_PRIVATE: u32 = 141; -pub const FUTEX_UNLOCK_PI_PRIVATE: u32 = 135; -pub const FUTEX_TRYLOCK_PI_PRIVATE: u32 = 136; -pub const FUTEX_WAIT_BITSET_PRIVATE: u32 = 137; -pub const FUTEX_WAKE_BITSET_PRIVATE: u32 = 138; -pub const FUTEX_WAIT_REQUEUE_PI_PRIVATE: u32 = 139; -pub const FUTEX_CMP_REQUEUE_PI_PRIVATE: u32 = 140; -pub const FUTEX_32: u32 = 2; -pub const FUTEX_WAITV_MAX: u32 = 128; -pub const FUTEX_WAITERS: u32 = 2147483648; -pub const FUTEX_OWNER_DIED: u32 = 1073741824; -pub const FUTEX_TID_MASK: u32 = 1073741823; -pub const ROBUST_LIST_LIMIT: u32 = 2048; -pub const FUTEX_BITSET_MATCH_ANY: u32 = 4294967295; -pub const FUTEX_OP_SET: u32 = 0; -pub const FUTEX_OP_ADD: u32 = 1; -pub const FUTEX_OP_OR: u32 = 2; -pub const FUTEX_OP_ANDN: u32 = 3; -pub const FUTEX_OP_XOR: u32 = 4; -pub const FUTEX_OP_OPARG_SHIFT: u32 = 8; -pub const FUTEX_OP_CMP_EQ: u32 = 0; -pub const FUTEX_OP_CMP_NE: u32 = 1; -pub const FUTEX_OP_CMP_LT: u32 = 2; -pub const FUTEX_OP_CMP_LE: u32 = 3; -pub const FUTEX_OP_CMP_GT: u32 = 4; -pub const FUTEX_OP_CMP_GE: u32 = 5; -pub const IN_ACCESS: u32 = 1; -pub const IN_MODIFY: u32 = 2; -pub const IN_ATTRIB: u32 = 4; -pub const IN_CLOSE_WRITE: u32 = 8; -pub const IN_CLOSE_NOWRITE: u32 = 16; -pub const IN_OPEN: u32 = 32; -pub const IN_MOVED_FROM: u32 = 64; -pub const IN_MOVED_TO: u32 = 128; -pub const IN_CREATE: u32 = 256; -pub const IN_DELETE: u32 = 512; -pub const IN_DELETE_SELF: u32 = 1024; -pub const IN_MOVE_SELF: u32 = 2048; -pub const IN_UNMOUNT: u32 = 8192; -pub const IN_Q_OVERFLOW: u32 = 16384; -pub const IN_IGNORED: u32 = 32768; -pub const IN_CLOSE: u32 = 24; -pub const IN_MOVE: u32 = 192; -pub const IN_ONLYDIR: u32 = 16777216; -pub const IN_DONT_FOLLOW: u32 = 33554432; -pub const IN_EXCL_UNLINK: u32 = 67108864; -pub const IN_MASK_CREATE: u32 = 268435456; -pub const IN_MASK_ADD: u32 = 536870912; -pub const IN_ISDIR: u32 = 1073741824; -pub const IN_ONESHOT: u32 = 2147483648; -pub const IN_ALL_EVENTS: u32 = 4095; -pub const IN_CLOEXEC: u32 = 524288; -pub const IN_NONBLOCK: u32 = 2048; -pub const ADFS_SUPER_MAGIC: u32 = 44533; -pub const AFFS_SUPER_MAGIC: u32 = 44543; -pub const AFS_SUPER_MAGIC: u32 = 1397113167; -pub const AUTOFS_SUPER_MAGIC: u32 = 391; -pub const CEPH_SUPER_MAGIC: u32 = 12805120; -pub const CODA_SUPER_MAGIC: u32 = 1937076805; -pub const CRAMFS_MAGIC: u32 = 684539205; -pub const CRAMFS_MAGIC_WEND: u32 = 1161678120; -pub const DEBUGFS_MAGIC: u32 = 1684170528; -pub const SECURITYFS_MAGIC: u32 = 1935894131; -pub const SELINUX_MAGIC: u32 = 4185718668; -pub const SMACK_MAGIC: u32 = 1128357203; -pub const RAMFS_MAGIC: u32 = 2240043254; -pub const TMPFS_MAGIC: u32 = 16914836; -pub const HUGETLBFS_MAGIC: u32 = 2508478710; -pub const SQUASHFS_MAGIC: u32 = 1936814952; -pub const ECRYPTFS_SUPER_MAGIC: u32 = 61791; -pub const EFS_SUPER_MAGIC: u32 = 4278867; -pub const EROFS_SUPER_MAGIC_V1: u32 = 3774210530; -pub const EXT2_SUPER_MAGIC: u32 = 61267; -pub const EXT3_SUPER_MAGIC: u32 = 61267; -pub const XENFS_SUPER_MAGIC: u32 = 2881100148; -pub const EXT4_SUPER_MAGIC: u32 = 61267; -pub const BTRFS_SUPER_MAGIC: u32 = 2435016766; -pub const NILFS_SUPER_MAGIC: u32 = 13364; -pub const F2FS_SUPER_MAGIC: u32 = 4076150800; -pub const HPFS_SUPER_MAGIC: u32 = 4187351113; -pub const ISOFS_SUPER_MAGIC: u32 = 38496; -pub const JFFS2_SUPER_MAGIC: u32 = 29366; -pub const XFS_SUPER_MAGIC: u32 = 1481003842; -pub const PSTOREFS_MAGIC: u32 = 1634035564; -pub const EFIVARFS_MAGIC: u32 = 3730735588; -pub const HOSTFS_SUPER_MAGIC: u32 = 12648430; -pub const OVERLAYFS_SUPER_MAGIC: u32 = 2035054128; -pub const FUSE_SUPER_MAGIC: u32 = 1702057286; -pub const MINIX_SUPER_MAGIC: u32 = 4991; -pub const MINIX_SUPER_MAGIC2: u32 = 5007; -pub const MINIX2_SUPER_MAGIC: u32 = 9320; -pub const MINIX2_SUPER_MAGIC2: u32 = 9336; -pub const MINIX3_SUPER_MAGIC: u32 = 19802; -pub const MSDOS_SUPER_MAGIC: u32 = 19780; -pub const EXFAT_SUPER_MAGIC: u32 = 538032816; -pub const NCP_SUPER_MAGIC: u32 = 22092; -pub const NFS_SUPER_MAGIC: u32 = 26985; -pub const OCFS2_SUPER_MAGIC: u32 = 1952539503; -pub const OPENPROM_SUPER_MAGIC: u32 = 40865; -pub const QNX4_SUPER_MAGIC: u32 = 47; -pub const QNX6_SUPER_MAGIC: u32 = 1746473250; -pub const AFS_FS_MAGIC: u32 = 1799439955; -pub const REISERFS_SUPER_MAGIC: u32 = 1382369651; -pub const REISERFS_SUPER_MAGIC_STRING: &[u8; 9] = b"ReIsErFs\0"; -pub const REISER2FS_SUPER_MAGIC_STRING: &[u8; 10] = b"ReIsEr2Fs\0"; -pub const REISER2FS_JR_SUPER_MAGIC_STRING: &[u8; 10] = b"ReIsEr3Fs\0"; -pub const SMB_SUPER_MAGIC: u32 = 20859; -pub const CIFS_SUPER_MAGIC: u32 = 4283649346; -pub const SMB2_SUPER_MAGIC: u32 = 4266872130; -pub const CGROUP_SUPER_MAGIC: u32 = 2613483; -pub const CGROUP2_SUPER_MAGIC: u32 = 1667723888; -pub const RDTGROUP_SUPER_MAGIC: u32 = 124082209; -pub const STACK_END_MAGIC: u32 = 1470918301; -pub const TRACEFS_MAGIC: u32 = 1953653091; -pub const V9FS_MAGIC: u32 = 16914839; -pub const BDEVFS_MAGIC: u32 = 1650746742; -pub const DAXFS_MAGIC: u32 = 1684300152; -pub const BINFMTFS_MAGIC: u32 = 1112100429; -pub const DEVPTS_SUPER_MAGIC: u32 = 7377; -pub const BINDERFS_SUPER_MAGIC: u32 = 1819242352; -pub const FUTEXFS_SUPER_MAGIC: u32 = 195894762; -pub const PIPEFS_MAGIC: u32 = 1346981957; -pub const PROC_SUPER_MAGIC: u32 = 40864; -pub const SOCKFS_MAGIC: u32 = 1397703499; -pub const SYSFS_MAGIC: u32 = 1650812274; -pub const USBDEVICE_SUPER_MAGIC: u32 = 40866; -pub const MTD_INODE_FS_MAGIC: u32 = 288389204; -pub const ANON_INODE_FS_MAGIC: u32 = 151263540; -pub const BTRFS_TEST_MAGIC: u32 = 1936880249; -pub const NSFS_MAGIC: u32 = 1853056627; -pub const BPF_FS_MAGIC: u32 = 3405662737; -pub const AAFS_MAGIC: u32 = 1513908720; -pub const ZONEFS_MAGIC: u32 = 1515144787; -pub const UDF_SUPER_MAGIC: u32 = 352400198; -pub const DMA_BUF_MAGIC: u32 = 1145913666; -pub const DEVMEM_MAGIC: u32 = 1162691661; -pub const SECRETMEM_MAGIC: u32 = 1397048141; -pub const PROT_READ: u32 = 1; -pub const PROT_WRITE: u32 = 2; -pub const PROT_EXEC: u32 = 4; -pub const PROT_SEM: u32 = 8; -pub const PROT_NONE: u32 = 0; -pub const PROT_GROWSDOWN: u32 = 16777216; -pub const PROT_GROWSUP: u32 = 33554432; -pub const MAP_TYPE: u32 = 15; -pub const MAP_FIXED: u32 = 16; -pub const MAP_ANONYMOUS: u32 = 32; -pub const MAP_POPULATE: u32 = 32768; -pub const MAP_NONBLOCK: u32 = 65536; -pub const MAP_STACK: u32 = 131072; -pub const MAP_HUGETLB: u32 = 262144; -pub const MAP_SYNC: u32 = 524288; -pub const MAP_FIXED_NOREPLACE: u32 = 1048576; -pub const MAP_UNINITIALIZED: u32 = 67108864; -pub const MLOCK_ONFAULT: u32 = 1; -pub const MS_ASYNC: u32 = 1; -pub const MS_INVALIDATE: u32 = 2; -pub const MS_SYNC: u32 = 4; -pub const MADV_NORMAL: u32 = 0; -pub const MADV_RANDOM: u32 = 1; -pub const MADV_SEQUENTIAL: u32 = 2; -pub const MADV_WILLNEED: u32 = 3; -pub const MADV_DONTNEED: u32 = 4; -pub const MADV_FREE: u32 = 8; -pub const MADV_REMOVE: u32 = 9; -pub const MADV_DONTFORK: u32 = 10; -pub const MADV_DOFORK: u32 = 11; -pub const MADV_HWPOISON: u32 = 100; -pub const MADV_SOFT_OFFLINE: u32 = 101; -pub const MADV_MERGEABLE: u32 = 12; -pub const MADV_UNMERGEABLE: u32 = 13; -pub const MADV_HUGEPAGE: u32 = 14; -pub const MADV_NOHUGEPAGE: u32 = 15; -pub const MADV_DONTDUMP: u32 = 16; -pub const MADV_DODUMP: u32 = 17; -pub const MADV_WIPEONFORK: u32 = 18; -pub const MADV_KEEPONFORK: u32 = 19; -pub const MADV_COLD: u32 = 20; -pub const MADV_PAGEOUT: u32 = 21; -pub const MADV_POPULATE_READ: u32 = 22; -pub const MADV_POPULATE_WRITE: u32 = 23; -pub const MADV_DONTNEED_LOCKED: u32 = 24; -pub const MADV_COLLAPSE: u32 = 25; -pub const MAP_FILE: u32 = 0; -pub const PKEY_DISABLE_ACCESS: u32 = 1; -pub const PKEY_DISABLE_WRITE: u32 = 2; -pub const PKEY_ACCESS_MASK: u32 = 3; -pub const MAP_GROWSDOWN: u32 = 256; -pub const MAP_DENYWRITE: u32 = 2048; -pub const MAP_EXECUTABLE: u32 = 4096; -pub const MAP_LOCKED: u32 = 8192; -pub const MAP_NORESERVE: u32 = 16384; -pub const MCL_CURRENT: u32 = 1; -pub const MCL_FUTURE: u32 = 2; -pub const MCL_ONFAULT: u32 = 4; -pub const HUGETLB_FLAG_ENCODE_SHIFT: u32 = 26; -pub const HUGETLB_FLAG_ENCODE_MASK: u32 = 63; -pub const HUGETLB_FLAG_ENCODE_16KB: u32 = 939524096; -pub const HUGETLB_FLAG_ENCODE_64KB: u32 = 1073741824; -pub const HUGETLB_FLAG_ENCODE_512KB: u32 = 1275068416; -pub const HUGETLB_FLAG_ENCODE_1MB: u32 = 1342177280; -pub const HUGETLB_FLAG_ENCODE_2MB: u32 = 1409286144; -pub const HUGETLB_FLAG_ENCODE_8MB: u32 = 1543503872; -pub const HUGETLB_FLAG_ENCODE_16MB: u32 = 1610612736; -pub const HUGETLB_FLAG_ENCODE_32MB: u32 = 1677721600; -pub const HUGETLB_FLAG_ENCODE_256MB: u32 = 1879048192; -pub const HUGETLB_FLAG_ENCODE_512MB: u32 = 1946157056; -pub const HUGETLB_FLAG_ENCODE_1GB: u32 = 2013265920; -pub const HUGETLB_FLAG_ENCODE_2GB: u32 = 2080374784; -pub const HUGETLB_FLAG_ENCODE_16GB: u32 = 2281701376; -pub const MREMAP_MAYMOVE: u32 = 1; -pub const MREMAP_FIXED: u32 = 2; -pub const MREMAP_DONTUNMAP: u32 = 4; -pub const OVERCOMMIT_GUESS: u32 = 0; -pub const OVERCOMMIT_ALWAYS: u32 = 1; -pub const OVERCOMMIT_NEVER: u32 = 2; -pub const MAP_SHARED: u32 = 1; -pub const MAP_PRIVATE: u32 = 2; -pub const MAP_SHARED_VALIDATE: u32 = 3; -pub const MAP_HUGE_SHIFT: u32 = 26; -pub const MAP_HUGE_MASK: u32 = 63; -pub const MAP_HUGE_16KB: u32 = 939524096; -pub const MAP_HUGE_64KB: u32 = 1073741824; -pub const MAP_HUGE_512KB: u32 = 1275068416; -pub const MAP_HUGE_1MB: u32 = 1342177280; -pub const MAP_HUGE_2MB: u32 = 1409286144; -pub const MAP_HUGE_8MB: u32 = 1543503872; -pub const MAP_HUGE_16MB: u32 = 1610612736; -pub const MAP_HUGE_32MB: u32 = 1677721600; -pub const MAP_HUGE_256MB: u32 = 1879048192; -pub const MAP_HUGE_512MB: u32 = 1946157056; -pub const MAP_HUGE_1GB: u32 = 2013265920; -pub const MAP_HUGE_2GB: u32 = 2080374784; -pub const MAP_HUGE_16GB: u32 = 2281701376; -pub const POLLIN: u32 = 1; -pub const POLLPRI: u32 = 2; -pub const POLLOUT: u32 = 4; -pub const POLLERR: u32 = 8; -pub const POLLHUP: u32 = 16; -pub const POLLNVAL: u32 = 32; -pub const POLLRDNORM: u32 = 64; -pub const POLLRDBAND: u32 = 128; -pub const POLLWRNORM: u32 = 256; -pub const POLLWRBAND: u32 = 512; -pub const POLLMSG: u32 = 1024; -pub const POLLREMOVE: u32 = 4096; -pub const POLLRDHUP: u32 = 8192; -pub const GRND_NONBLOCK: u32 = 1; -pub const GRND_RANDOM: u32 = 2; -pub const GRND_INSECURE: u32 = 4; -pub const LINUX_REBOOT_MAGIC1: u32 = 4276215469; -pub const LINUX_REBOOT_MAGIC2: u32 = 672274793; -pub const LINUX_REBOOT_MAGIC2A: u32 = 85072278; -pub const LINUX_REBOOT_MAGIC2B: u32 = 369367448; -pub const LINUX_REBOOT_MAGIC2C: u32 = 537993216; -pub const LINUX_REBOOT_CMD_RESTART: u32 = 19088743; -pub const LINUX_REBOOT_CMD_HALT: u32 = 3454992675; -pub const LINUX_REBOOT_CMD_CAD_ON: u32 = 2309737967; -pub const LINUX_REBOOT_CMD_CAD_OFF: u32 = 0; -pub const LINUX_REBOOT_CMD_POWER_OFF: u32 = 1126301404; -pub const LINUX_REBOOT_CMD_RESTART2: u32 = 2712847316; -pub const LINUX_REBOOT_CMD_SW_SUSPEND: u32 = 3489725666; -pub const LINUX_REBOOT_CMD_KEXEC: u32 = 1163412803; -pub const ITIMER_REAL: u32 = 0; -pub const ITIMER_VIRTUAL: u32 = 1; -pub const ITIMER_PROF: u32 = 2; -pub const CLOCK_REALTIME: u32 = 0; -pub const CLOCK_MONOTONIC: u32 = 1; -pub const CLOCK_PROCESS_CPUTIME_ID: u32 = 2; -pub const CLOCK_THREAD_CPUTIME_ID: u32 = 3; -pub const CLOCK_MONOTONIC_RAW: u32 = 4; -pub const CLOCK_REALTIME_COARSE: u32 = 5; -pub const CLOCK_MONOTONIC_COARSE: u32 = 6; -pub const CLOCK_BOOTTIME: u32 = 7; -pub const CLOCK_REALTIME_ALARM: u32 = 8; -pub const CLOCK_BOOTTIME_ALARM: u32 = 9; -pub const CLOCK_SGI_CYCLE: u32 = 10; -pub const CLOCK_TAI: u32 = 11; -pub const MAX_CLOCKS: u32 = 16; -pub const CLOCKS_MASK: u32 = 1; -pub const CLOCKS_MONO: u32 = 1; -pub const TIMER_ABSTIME: u32 = 1; -pub const RUSAGE_SELF: u32 = 0; -pub const RUSAGE_CHILDREN: i32 = -1; -pub const RUSAGE_BOTH: i32 = -2; -pub const RUSAGE_THREAD: u32 = 1; -pub const RLIM64_INFINITY: i32 = -1; -pub const PRIO_MIN: i32 = -20; -pub const PRIO_MAX: u32 = 20; -pub const PRIO_PROCESS: u32 = 0; -pub const PRIO_PGRP: u32 = 1; -pub const PRIO_USER: u32 = 2; -pub const _STK_LIM: u32 = 8388608; -pub const MLOCK_LIMIT: u32 = 8388608; -pub const RLIMIT_CPU: u32 = 0; -pub const RLIMIT_FSIZE: u32 = 1; -pub const RLIMIT_DATA: u32 = 2; -pub const RLIMIT_STACK: u32 = 3; -pub const RLIMIT_CORE: u32 = 4; -pub const RLIMIT_RSS: u32 = 5; -pub const RLIMIT_NPROC: u32 = 6; -pub const RLIMIT_NOFILE: u32 = 7; -pub const RLIMIT_MEMLOCK: u32 = 8; -pub const RLIMIT_AS: u32 = 9; -pub const RLIMIT_LOCKS: u32 = 10; -pub const RLIMIT_SIGPENDING: u32 = 11; -pub const RLIMIT_MSGQUEUE: u32 = 12; -pub const RLIMIT_NICE: u32 = 13; -pub const RLIMIT_RTPRIO: u32 = 14; -pub const RLIMIT_RTTIME: u32 = 15; -pub const RLIM_NLIMITS: u32 = 16; -pub const RLIM_INFINITY: i32 = -1; -pub const CSIGNAL: u32 = 255; -pub const CLONE_VM: u32 = 256; -pub const CLONE_FS: u32 = 512; -pub const CLONE_FILES: u32 = 1024; -pub const CLONE_SIGHAND: u32 = 2048; -pub const CLONE_PIDFD: u32 = 4096; -pub const CLONE_PTRACE: u32 = 8192; -pub const CLONE_VFORK: u32 = 16384; -pub const CLONE_PARENT: u32 = 32768; -pub const CLONE_THREAD: u32 = 65536; -pub const CLONE_NEWNS: u32 = 131072; -pub const CLONE_SYSVSEM: u32 = 262144; -pub const CLONE_SETTLS: u32 = 524288; -pub const CLONE_PARENT_SETTID: u32 = 1048576; -pub const CLONE_CHILD_CLEARTID: u32 = 2097152; -pub const CLONE_DETACHED: u32 = 4194304; -pub const CLONE_UNTRACED: u32 = 8388608; -pub const CLONE_CHILD_SETTID: u32 = 16777216; -pub const CLONE_NEWCGROUP: u32 = 33554432; -pub const CLONE_NEWUTS: u32 = 67108864; -pub const CLONE_NEWIPC: u32 = 134217728; -pub const CLONE_NEWUSER: u32 = 268435456; -pub const CLONE_NEWPID: u32 = 536870912; -pub const CLONE_NEWNET: u32 = 1073741824; -pub const CLONE_IO: u32 = 2147483648; -pub const CLONE_CLEAR_SIGHAND: u64 = 4294967296; -pub const CLONE_INTO_CGROUP: u64 = 8589934592; -pub const CLONE_NEWTIME: u32 = 128; -pub const CLONE_ARGS_SIZE_VER0: u32 = 64; -pub const CLONE_ARGS_SIZE_VER1: u32 = 80; -pub const CLONE_ARGS_SIZE_VER2: u32 = 88; -pub const SCHED_NORMAL: u32 = 0; -pub const SCHED_FIFO: u32 = 1; -pub const SCHED_RR: u32 = 2; -pub const SCHED_BATCH: u32 = 3; -pub const SCHED_IDLE: u32 = 5; -pub const SCHED_DEADLINE: u32 = 6; -pub const SCHED_RESET_ON_FORK: u32 = 1073741824; -pub const SCHED_FLAG_RESET_ON_FORK: u32 = 1; -pub const SCHED_FLAG_RECLAIM: u32 = 2; -pub const SCHED_FLAG_DL_OVERRUN: u32 = 4; -pub const SCHED_FLAG_KEEP_POLICY: u32 = 8; -pub const SCHED_FLAG_KEEP_PARAMS: u32 = 16; -pub const SCHED_FLAG_UTIL_CLAMP_MIN: u32 = 32; -pub const SCHED_FLAG_UTIL_CLAMP_MAX: u32 = 64; -pub const SCHED_FLAG_KEEP_ALL: u32 = 24; -pub const SCHED_FLAG_UTIL_CLAMP: u32 = 96; -pub const SCHED_FLAG_ALL: u32 = 127; -pub const _NSIG: u32 = 64; -pub const _NSIG_BPW: u32 = 32; -pub const _NSIG_WORDS: u32 = 2; -pub const SIGHUP: u32 = 1; -pub const SIGINT: u32 = 2; -pub const SIGQUIT: u32 = 3; -pub const SIGILL: u32 = 4; -pub const SIGTRAP: u32 = 5; -pub const SIGABRT: u32 = 6; -pub const SIGIOT: u32 = 6; -pub const SIGBUS: u32 = 7; -pub const SIGFPE: u32 = 8; -pub const SIGKILL: u32 = 9; -pub const SIGUSR1: u32 = 10; -pub const SIGSEGV: u32 = 11; -pub const SIGUSR2: u32 = 12; -pub const SIGPIPE: u32 = 13; -pub const SIGALRM: u32 = 14; -pub const SIGTERM: u32 = 15; -pub const SIGSTKFLT: u32 = 16; -pub const SIGCHLD: u32 = 17; -pub const SIGCONT: u32 = 18; -pub const SIGSTOP: u32 = 19; -pub const SIGTSTP: u32 = 20; -pub const SIGTTIN: u32 = 21; -pub const SIGTTOU: u32 = 22; -pub const SIGURG: u32 = 23; -pub const SIGXCPU: u32 = 24; -pub const SIGXFSZ: u32 = 25; -pub const SIGVTALRM: u32 = 26; -pub const SIGPROF: u32 = 27; -pub const SIGWINCH: u32 = 28; -pub const SIGIO: u32 = 29; -pub const SIGPOLL: u32 = 29; -pub const SIGPWR: u32 = 30; -pub const SIGSYS: u32 = 31; -pub const SIGUNUSED: u32 = 31; -pub const SIGRTMIN: u32 = 32; -pub const SIGRTMAX: u32 = 64; -pub const MINSIGSTKSZ: u32 = 2048; -pub const SIGSTKSZ: u32 = 8192; -pub const SA_NOCLDSTOP: u32 = 1; -pub const SA_NOCLDWAIT: u32 = 2; -pub const SA_SIGINFO: u32 = 4; -pub const SA_UNSUPPORTED: u32 = 1024; -pub const SA_EXPOSE_TAGBITS: u32 = 2048; -pub const SA_ONSTACK: u32 = 134217728; -pub const SA_RESTART: u32 = 268435456; -pub const SA_NODEFER: u32 = 1073741824; -pub const SA_RESETHAND: u32 = 2147483648; -pub const SA_NOMASK: u32 = 1073741824; -pub const SA_ONESHOT: u32 = 2147483648; -pub const SIG_BLOCK: u32 = 0; -pub const SIG_UNBLOCK: u32 = 1; -pub const SIG_SETMASK: u32 = 2; -pub const SI_MAX_SIZE: u32 = 128; -pub const SI_USER: u32 = 0; -pub const SI_KERNEL: u32 = 128; -pub const SI_QUEUE: i32 = -1; -pub const SI_TIMER: i32 = -2; -pub const SI_MESGQ: i32 = -3; -pub const SI_ASYNCIO: i32 = -4; -pub const SI_SIGIO: i32 = -5; -pub const SI_TKILL: i32 = -6; -pub const SI_DETHREAD: i32 = -7; -pub const SI_ASYNCNL: i32 = -60; -pub const ILL_ILLOPC: u32 = 1; -pub const ILL_ILLOPN: u32 = 2; -pub const ILL_ILLADR: u32 = 3; -pub const ILL_ILLTRP: u32 = 4; -pub const ILL_PRVOPC: u32 = 5; -pub const ILL_PRVREG: u32 = 6; -pub const ILL_COPROC: u32 = 7; -pub const ILL_BADSTK: u32 = 8; -pub const ILL_BADIADDR: u32 = 9; -pub const __ILL_BREAK: u32 = 10; -pub const __ILL_BNDMOD: u32 = 11; -pub const NSIGILL: u32 = 11; -pub const FPE_INTDIV: u32 = 1; -pub const FPE_INTOVF: u32 = 2; -pub const FPE_FLTDIV: u32 = 3; -pub const FPE_FLTOVF: u32 = 4; -pub const FPE_FLTUND: u32 = 5; -pub const FPE_FLTRES: u32 = 6; -pub const FPE_FLTINV: u32 = 7; -pub const FPE_FLTSUB: u32 = 8; -pub const __FPE_DECOVF: u32 = 9; -pub const __FPE_DECDIV: u32 = 10; -pub const __FPE_DECERR: u32 = 11; -pub const __FPE_INVASC: u32 = 12; -pub const __FPE_INVDEC: u32 = 13; -pub const FPE_FLTUNK: u32 = 14; -pub const FPE_CONDTRAP: u32 = 15; -pub const NSIGFPE: u32 = 15; -pub const SEGV_MAPERR: u32 = 1; -pub const SEGV_ACCERR: u32 = 2; -pub const SEGV_BNDERR: u32 = 3; -pub const SEGV_PKUERR: u32 = 4; -pub const SEGV_ACCADI: u32 = 5; -pub const SEGV_ADIDERR: u32 = 6; -pub const SEGV_ADIPERR: u32 = 7; -pub const SEGV_MTEAERR: u32 = 8; -pub const SEGV_MTESERR: u32 = 9; -pub const NSIGSEGV: u32 = 9; -pub const BUS_ADRALN: u32 = 1; -pub const BUS_ADRERR: u32 = 2; -pub const BUS_OBJERR: u32 = 3; -pub const BUS_MCEERR_AR: u32 = 4; -pub const BUS_MCEERR_AO: u32 = 5; -pub const NSIGBUS: u32 = 5; -pub const TRAP_BRKPT: u32 = 1; -pub const TRAP_TRACE: u32 = 2; -pub const TRAP_BRANCH: u32 = 3; -pub const TRAP_HWBKPT: u32 = 4; -pub const TRAP_UNK: u32 = 5; -pub const TRAP_PERF: u32 = 6; -pub const NSIGTRAP: u32 = 6; -pub const TRAP_PERF_FLAG_ASYNC: u32 = 1; -pub const CLD_EXITED: u32 = 1; -pub const CLD_KILLED: u32 = 2; -pub const CLD_DUMPED: u32 = 3; -pub const CLD_TRAPPED: u32 = 4; -pub const CLD_STOPPED: u32 = 5; -pub const CLD_CONTINUED: u32 = 6; -pub const NSIGCHLD: u32 = 6; -pub const POLL_IN: u32 = 1; -pub const POLL_OUT: u32 = 2; -pub const POLL_MSG: u32 = 3; -pub const POLL_ERR: u32 = 4; -pub const POLL_PRI: u32 = 5; -pub const POLL_HUP: u32 = 6; -pub const NSIGPOLL: u32 = 6; -pub const SYS_SECCOMP: u32 = 1; -pub const SYS_USER_DISPATCH: u32 = 2; -pub const NSIGSYS: u32 = 2; -pub const EMT_TAGOVF: u32 = 1; -pub const NSIGEMT: u32 = 1; -pub const SIGEV_SIGNAL: u32 = 0; -pub const SIGEV_NONE: u32 = 1; -pub const SIGEV_THREAD: u32 = 2; -pub const SIGEV_THREAD_ID: u32 = 4; -pub const SIGEV_MAX_SIZE: u32 = 64; -pub const SS_ONSTACK: u32 = 1; -pub const SS_DISABLE: u32 = 2; -pub const SS_AUTODISARM: u32 = 2147483648; -pub const SS_FLAG_BITS: u32 = 2147483648; -pub const S_IFMT: u32 = 61440; -pub const S_IFSOCK: u32 = 49152; -pub const S_IFLNK: u32 = 40960; -pub const S_IFREG: u32 = 32768; -pub const S_IFBLK: u32 = 24576; -pub const S_IFDIR: u32 = 16384; -pub const S_IFCHR: u32 = 8192; -pub const S_IFIFO: u32 = 4096; -pub const S_ISUID: u32 = 2048; -pub const S_ISGID: u32 = 1024; -pub const S_ISVTX: u32 = 512; -pub const S_IRWXU: u32 = 448; -pub const S_IRUSR: u32 = 256; -pub const S_IWUSR: u32 = 128; -pub const S_IXUSR: u32 = 64; -pub const S_IRWXG: u32 = 56; -pub const S_IRGRP: u32 = 32; -pub const S_IWGRP: u32 = 16; -pub const S_IXGRP: u32 = 8; -pub const S_IRWXO: u32 = 7; -pub const S_IROTH: u32 = 4; -pub const S_IWOTH: u32 = 2; -pub const S_IXOTH: u32 = 1; -pub const STATX_TYPE: u32 = 1; -pub const STATX_MODE: u32 = 2; -pub const STATX_NLINK: u32 = 4; -pub const STATX_UID: u32 = 8; -pub const STATX_GID: u32 = 16; -pub const STATX_ATIME: u32 = 32; -pub const STATX_MTIME: u32 = 64; -pub const STATX_CTIME: u32 = 128; -pub const STATX_INO: u32 = 256; -pub const STATX_SIZE: u32 = 512; -pub const STATX_BLOCKS: u32 = 1024; -pub const STATX_BASIC_STATS: u32 = 2047; -pub const STATX_BTIME: u32 = 2048; -pub const STATX_MNT_ID: u32 = 4096; -pub const STATX_DIOALIGN: u32 = 8192; -pub const STATX__RESERVED: u32 = 2147483648; -pub const STATX_ALL: u32 = 4095; -pub const STATX_ATTR_COMPRESSED: u32 = 4; -pub const STATX_ATTR_IMMUTABLE: u32 = 16; -pub const STATX_ATTR_APPEND: u32 = 32; -pub const STATX_ATTR_NODUMP: u32 = 64; -pub const STATX_ATTR_ENCRYPTED: u32 = 2048; -pub const STATX_ATTR_AUTOMOUNT: u32 = 4096; -pub const STATX_ATTR_MOUNT_ROOT: u32 = 8192; -pub const STATX_ATTR_VERITY: u32 = 1048576; -pub const STATX_ATTR_DAX: u32 = 2097152; -pub const IGNBRK: u32 = 1; -pub const BRKINT: u32 = 2; -pub const IGNPAR: u32 = 4; -pub const PARMRK: u32 = 8; -pub const INPCK: u32 = 16; -pub const ISTRIP: u32 = 32; -pub const INLCR: u32 = 64; -pub const IGNCR: u32 = 128; -pub const ICRNL: u32 = 256; -pub const IXANY: u32 = 2048; -pub const OPOST: u32 = 1; -pub const OCRNL: u32 = 8; -pub const ONOCR: u32 = 16; -pub const ONLRET: u32 = 32; -pub const OFILL: u32 = 64; -pub const OFDEL: u32 = 128; -pub const B0: u32 = 0; -pub const B50: u32 = 1; -pub const B75: u32 = 2; -pub const B110: u32 = 3; -pub const B134: u32 = 4; -pub const B150: u32 = 5; -pub const B200: u32 = 6; -pub const B300: u32 = 7; -pub const B600: u32 = 8; -pub const B1200: u32 = 9; -pub const B1800: u32 = 10; -pub const B2400: u32 = 11; -pub const B4800: u32 = 12; -pub const B9600: u32 = 13; -pub const B19200: u32 = 14; -pub const B38400: u32 = 15; -pub const EXTA: u32 = 14; -pub const EXTB: u32 = 15; -pub const ADDRB: u32 = 536870912; -pub const CMSPAR: u32 = 1073741824; -pub const CRTSCTS: u32 = 2147483648; -pub const IBSHIFT: u32 = 16; -pub const TCOOFF: u32 = 0; -pub const TCOON: u32 = 1; -pub const TCIOFF: u32 = 2; -pub const TCION: u32 = 3; -pub const TCIFLUSH: u32 = 0; -pub const TCOFLUSH: u32 = 1; -pub const TCIOFLUSH: u32 = 2; -pub const NCCS: u32 = 19; -pub const VINTR: u32 = 0; -pub const VQUIT: u32 = 1; -pub const VERASE: u32 = 2; -pub const VKILL: u32 = 3; -pub const VEOF: u32 = 4; -pub const VTIME: u32 = 5; -pub const VMIN: u32 = 6; -pub const VSWTC: u32 = 7; -pub const VSTART: u32 = 8; -pub const VSTOP: u32 = 9; -pub const VSUSP: u32 = 10; -pub const VEOL: u32 = 11; -pub const VREPRINT: u32 = 12; -pub const VDISCARD: u32 = 13; -pub const VWERASE: u32 = 14; -pub const VLNEXT: u32 = 15; -pub const VEOL2: u32 = 16; -pub const IUCLC: u32 = 512; -pub const IXON: u32 = 1024; -pub const IXOFF: u32 = 4096; -pub const IMAXBEL: u32 = 8192; -pub const IUTF8: u32 = 16384; -pub const OLCUC: u32 = 2; -pub const ONLCR: u32 = 4; -pub const NLDLY: u32 = 256; -pub const NL0: u32 = 0; -pub const NL1: u32 = 256; -pub const CRDLY: u32 = 1536; -pub const CR0: u32 = 0; -pub const CR1: u32 = 512; -pub const CR2: u32 = 1024; -pub const CR3: u32 = 1536; -pub const TABDLY: u32 = 6144; -pub const TAB0: u32 = 0; -pub const TAB1: u32 = 2048; -pub const TAB2: u32 = 4096; -pub const TAB3: u32 = 6144; -pub const XTABS: u32 = 6144; -pub const BSDLY: u32 = 8192; -pub const BS0: u32 = 0; -pub const BS1: u32 = 8192; -pub const VTDLY: u32 = 16384; -pub const VT0: u32 = 0; -pub const VT1: u32 = 16384; -pub const FFDLY: u32 = 32768; -pub const FF0: u32 = 0; -pub const FF1: u32 = 32768; -pub const CBAUD: u32 = 4111; -pub const CSIZE: u32 = 48; -pub const CS5: u32 = 0; -pub const CS6: u32 = 16; -pub const CS7: u32 = 32; -pub const CS8: u32 = 48; -pub const CSTOPB: u32 = 64; -pub const CREAD: u32 = 128; -pub const PARENB: u32 = 256; -pub const PARODD: u32 = 512; -pub const HUPCL: u32 = 1024; -pub const CLOCAL: u32 = 2048; -pub const CBAUDEX: u32 = 4096; -pub const BOTHER: u32 = 4096; -pub const B57600: u32 = 4097; -pub const B115200: u32 = 4098; -pub const B230400: u32 = 4099; -pub const B460800: u32 = 4100; -pub const B500000: u32 = 4101; -pub const B576000: u32 = 4102; -pub const B921600: u32 = 4103; -pub const B1000000: u32 = 4104; -pub const B1152000: u32 = 4105; -pub const B1500000: u32 = 4106; -pub const B2000000: u32 = 4107; -pub const B2500000: u32 = 4108; -pub const B3000000: u32 = 4109; -pub const B3500000: u32 = 4110; -pub const B4000000: u32 = 4111; -pub const CIBAUD: u32 = 269418496; -pub const ISIG: u32 = 1; -pub const ICANON: u32 = 2; -pub const XCASE: u32 = 4; -pub const ECHO: u32 = 8; -pub const ECHOE: u32 = 16; -pub const ECHOK: u32 = 32; -pub const ECHONL: u32 = 64; -pub const NOFLSH: u32 = 128; -pub const TOSTOP: u32 = 256; -pub const ECHOCTL: u32 = 512; -pub const ECHOPRT: u32 = 1024; -pub const ECHOKE: u32 = 2048; -pub const FLUSHO: u32 = 4096; -pub const PENDIN: u32 = 16384; -pub const IEXTEN: u32 = 32768; -pub const EXTPROC: u32 = 65536; -pub const TCSANOW: u32 = 0; -pub const TCSADRAIN: u32 = 1; -pub const TCSAFLUSH: u32 = 2; -pub const TIOCPKT_DATA: u32 = 0; -pub const TIOCPKT_FLUSHREAD: u32 = 1; -pub const TIOCPKT_FLUSHWRITE: u32 = 2; -pub const TIOCPKT_STOP: u32 = 4; -pub const TIOCPKT_START: u32 = 8; -pub const TIOCPKT_NOSTOP: u32 = 16; -pub const TIOCPKT_DOSTOP: u32 = 32; -pub const TIOCPKT_IOCTL: u32 = 64; -pub const TIOCSER_TEMT: u32 = 1; -pub const NCC: u32 = 8; -pub const TIOCM_LE: u32 = 1; -pub const TIOCM_DTR: u32 = 2; -pub const TIOCM_RTS: u32 = 4; -pub const TIOCM_ST: u32 = 8; -pub const TIOCM_SR: u32 = 16; -pub const TIOCM_CTS: u32 = 32; -pub const TIOCM_CAR: u32 = 64; -pub const TIOCM_RNG: u32 = 128; -pub const TIOCM_DSR: u32 = 256; -pub const TIOCM_CD: u32 = 64; -pub const TIOCM_RI: u32 = 128; -pub const TIOCM_OUT1: u32 = 8192; -pub const TIOCM_OUT2: u32 = 16384; -pub const TIOCM_LOOP: u32 = 32768; -pub const UIO_FASTIOV: u32 = 8; -pub const UIO_MAXIOV: u32 = 1024; -pub const __NR_io_setup: u32 = 0; -pub const __NR_io_destroy: u32 = 1; -pub const __NR_io_submit: u32 = 2; -pub const __NR_io_cancel: u32 = 3; -pub const __NR_io_getevents: u32 = 4; -pub const __NR_setxattr: u32 = 5; -pub const __NR_lsetxattr: u32 = 6; -pub const __NR_fsetxattr: u32 = 7; -pub const __NR_getxattr: u32 = 8; -pub const __NR_lgetxattr: u32 = 9; -pub const __NR_fgetxattr: u32 = 10; -pub const __NR_listxattr: u32 = 11; -pub const __NR_llistxattr: u32 = 12; -pub const __NR_flistxattr: u32 = 13; -pub const __NR_removexattr: u32 = 14; -pub const __NR_lremovexattr: u32 = 15; -pub const __NR_fremovexattr: u32 = 16; -pub const __NR_getcwd: u32 = 17; -pub const __NR_lookup_dcookie: u32 = 18; -pub const __NR_eventfd2: u32 = 19; -pub const __NR_epoll_create1: u32 = 20; -pub const __NR_epoll_ctl: u32 = 21; -pub const __NR_epoll_pwait: u32 = 22; -pub const __NR_dup: u32 = 23; -pub const __NR_dup3: u32 = 24; -pub const __NR3264_fcntl: u32 = 25; -pub const __NR_inotify_init1: u32 = 26; -pub const __NR_inotify_add_watch: u32 = 27; -pub const __NR_inotify_rm_watch: u32 = 28; -pub const __NR_ioctl: u32 = 29; -pub const __NR_ioprio_set: u32 = 30; -pub const __NR_ioprio_get: u32 = 31; -pub const __NR_flock: u32 = 32; -pub const __NR_mknodat: u32 = 33; -pub const __NR_mkdirat: u32 = 34; -pub const __NR_unlinkat: u32 = 35; -pub const __NR_symlinkat: u32 = 36; -pub const __NR_linkat: u32 = 37; -pub const __NR_umount2: u32 = 39; -pub const __NR_mount: u32 = 40; -pub const __NR_pivot_root: u32 = 41; -pub const __NR_nfsservctl: u32 = 42; -pub const __NR3264_statfs: u32 = 43; -pub const __NR3264_fstatfs: u32 = 44; -pub const __NR3264_truncate: u32 = 45; -pub const __NR3264_ftruncate: u32 = 46; -pub const __NR_fallocate: u32 = 47; -pub const __NR_faccessat: u32 = 48; -pub const __NR_chdir: u32 = 49; -pub const __NR_fchdir: u32 = 50; -pub const __NR_chroot: u32 = 51; -pub const __NR_fchmod: u32 = 52; -pub const __NR_fchmodat: u32 = 53; -pub const __NR_fchownat: u32 = 54; -pub const __NR_fchown: u32 = 55; -pub const __NR_openat: u32 = 56; -pub const __NR_close: u32 = 57; -pub const __NR_vhangup: u32 = 58; -pub const __NR_pipe2: u32 = 59; -pub const __NR_quotactl: u32 = 60; -pub const __NR_getdents64: u32 = 61; -pub const __NR3264_lseek: u32 = 62; -pub const __NR_read: u32 = 63; -pub const __NR_write: u32 = 64; -pub const __NR_readv: u32 = 65; -pub const __NR_writev: u32 = 66; -pub const __NR_pread64: u32 = 67; -pub const __NR_pwrite64: u32 = 68; -pub const __NR_preadv: u32 = 69; -pub const __NR_pwritev: u32 = 70; -pub const __NR3264_sendfile: u32 = 71; -pub const __NR_pselect6: u32 = 72; -pub const __NR_ppoll: u32 = 73; -pub const __NR_signalfd4: u32 = 74; -pub const __NR_vmsplice: u32 = 75; -pub const __NR_splice: u32 = 76; -pub const __NR_tee: u32 = 77; -pub const __NR_readlinkat: u32 = 78; -pub const __NR3264_fstatat: u32 = 79; -pub const __NR3264_fstat: u32 = 80; -pub const __NR_sync: u32 = 81; -pub const __NR_fsync: u32 = 82; -pub const __NR_fdatasync: u32 = 83; -pub const __NR_sync_file_range: u32 = 84; -pub const __NR_timerfd_create: u32 = 85; -pub const __NR_timerfd_settime: u32 = 86; -pub const __NR_timerfd_gettime: u32 = 87; -pub const __NR_utimensat: u32 = 88; -pub const __NR_acct: u32 = 89; -pub const __NR_capget: u32 = 90; -pub const __NR_capset: u32 = 91; -pub const __NR_personality: u32 = 92; -pub const __NR_exit: u32 = 93; -pub const __NR_exit_group: u32 = 94; -pub const __NR_waitid: u32 = 95; -pub const __NR_set_tid_address: u32 = 96; -pub const __NR_unshare: u32 = 97; -pub const __NR_futex: u32 = 98; -pub const __NR_set_robust_list: u32 = 99; -pub const __NR_get_robust_list: u32 = 100; -pub const __NR_nanosleep: u32 = 101; -pub const __NR_getitimer: u32 = 102; -pub const __NR_setitimer: u32 = 103; -pub const __NR_kexec_load: u32 = 104; -pub const __NR_init_module: u32 = 105; -pub const __NR_delete_module: u32 = 106; -pub const __NR_timer_create: u32 = 107; -pub const __NR_timer_gettime: u32 = 108; -pub const __NR_timer_getoverrun: u32 = 109; -pub const __NR_timer_settime: u32 = 110; -pub const __NR_timer_delete: u32 = 111; -pub const __NR_clock_settime: u32 = 112; -pub const __NR_clock_gettime: u32 = 113; -pub const __NR_clock_getres: u32 = 114; -pub const __NR_clock_nanosleep: u32 = 115; -pub const __NR_syslog: u32 = 116; -pub const __NR_ptrace: u32 = 117; -pub const __NR_sched_setparam: u32 = 118; -pub const __NR_sched_setscheduler: u32 = 119; -pub const __NR_sched_getscheduler: u32 = 120; -pub const __NR_sched_getparam: u32 = 121; -pub const __NR_sched_setaffinity: u32 = 122; -pub const __NR_sched_getaffinity: u32 = 123; -pub const __NR_sched_yield: u32 = 124; -pub const __NR_sched_get_priority_max: u32 = 125; -pub const __NR_sched_get_priority_min: u32 = 126; -pub const __NR_sched_rr_get_interval: u32 = 127; -pub const __NR_restart_syscall: u32 = 128; -pub const __NR_kill: u32 = 129; -pub const __NR_tkill: u32 = 130; -pub const __NR_tgkill: u32 = 131; -pub const __NR_sigaltstack: u32 = 132; -pub const __NR_rt_sigsuspend: u32 = 133; -pub const __NR_rt_sigaction: u32 = 134; -pub const __NR_rt_sigprocmask: u32 = 135; -pub const __NR_rt_sigpending: u32 = 136; -pub const __NR_rt_sigtimedwait: u32 = 137; -pub const __NR_rt_sigqueueinfo: u32 = 138; -pub const __NR_rt_sigreturn: u32 = 139; -pub const __NR_setpriority: u32 = 140; -pub const __NR_getpriority: u32 = 141; -pub const __NR_reboot: u32 = 142; -pub const __NR_setregid: u32 = 143; -pub const __NR_setgid: u32 = 144; -pub const __NR_setreuid: u32 = 145; -pub const __NR_setuid: u32 = 146; -pub const __NR_setresuid: u32 = 147; -pub const __NR_getresuid: u32 = 148; -pub const __NR_setresgid: u32 = 149; -pub const __NR_getresgid: u32 = 150; -pub const __NR_setfsuid: u32 = 151; -pub const __NR_setfsgid: u32 = 152; -pub const __NR_times: u32 = 153; -pub const __NR_setpgid: u32 = 154; -pub const __NR_getpgid: u32 = 155; -pub const __NR_getsid: u32 = 156; -pub const __NR_setsid: u32 = 157; -pub const __NR_getgroups: u32 = 158; -pub const __NR_setgroups: u32 = 159; -pub const __NR_uname: u32 = 160; -pub const __NR_sethostname: u32 = 161; -pub const __NR_setdomainname: u32 = 162; -pub const __NR_getrlimit: u32 = 163; -pub const __NR_setrlimit: u32 = 164; -pub const __NR_getrusage: u32 = 165; -pub const __NR_umask: u32 = 166; -pub const __NR_prctl: u32 = 167; -pub const __NR_getcpu: u32 = 168; -pub const __NR_gettimeofday: u32 = 169; -pub const __NR_settimeofday: u32 = 170; -pub const __NR_adjtimex: u32 = 171; -pub const __NR_getpid: u32 = 172; -pub const __NR_getppid: u32 = 173; -pub const __NR_getuid: u32 = 174; -pub const __NR_geteuid: u32 = 175; -pub const __NR_getgid: u32 = 176; -pub const __NR_getegid: u32 = 177; -pub const __NR_gettid: u32 = 178; -pub const __NR_sysinfo: u32 = 179; -pub const __NR_mq_open: u32 = 180; -pub const __NR_mq_unlink: u32 = 181; -pub const __NR_mq_timedsend: u32 = 182; -pub const __NR_mq_timedreceive: u32 = 183; -pub const __NR_mq_notify: u32 = 184; -pub const __NR_mq_getsetattr: u32 = 185; -pub const __NR_msgget: u32 = 186; -pub const __NR_msgctl: u32 = 187; -pub const __NR_msgrcv: u32 = 188; -pub const __NR_msgsnd: u32 = 189; -pub const __NR_semget: u32 = 190; -pub const __NR_semctl: u32 = 191; -pub const __NR_semtimedop: u32 = 192; -pub const __NR_semop: u32 = 193; -pub const __NR_shmget: u32 = 194; -pub const __NR_shmctl: u32 = 195; -pub const __NR_shmat: u32 = 196; -pub const __NR_shmdt: u32 = 197; -pub const __NR_socket: u32 = 198; -pub const __NR_socketpair: u32 = 199; -pub const __NR_bind: u32 = 200; -pub const __NR_listen: u32 = 201; -pub const __NR_accept: u32 = 202; -pub const __NR_connect: u32 = 203; -pub const __NR_getsockname: u32 = 204; -pub const __NR_getpeername: u32 = 205; -pub const __NR_sendto: u32 = 206; -pub const __NR_recvfrom: u32 = 207; -pub const __NR_setsockopt: u32 = 208; -pub const __NR_getsockopt: u32 = 209; -pub const __NR_shutdown: u32 = 210; -pub const __NR_sendmsg: u32 = 211; -pub const __NR_recvmsg: u32 = 212; -pub const __NR_readahead: u32 = 213; -pub const __NR_brk: u32 = 214; -pub const __NR_munmap: u32 = 215; -pub const __NR_mremap: u32 = 216; -pub const __NR_add_key: u32 = 217; -pub const __NR_request_key: u32 = 218; -pub const __NR_keyctl: u32 = 219; -pub const __NR_clone: u32 = 220; -pub const __NR_execve: u32 = 221; -pub const __NR3264_mmap: u32 = 222; -pub const __NR3264_fadvise64: u32 = 223; -pub const __NR_swapon: u32 = 224; -pub const __NR_swapoff: u32 = 225; -pub const __NR_mprotect: u32 = 226; -pub const __NR_msync: u32 = 227; -pub const __NR_mlock: u32 = 228; -pub const __NR_munlock: u32 = 229; -pub const __NR_mlockall: u32 = 230; -pub const __NR_munlockall: u32 = 231; -pub const __NR_mincore: u32 = 232; -pub const __NR_madvise: u32 = 233; -pub const __NR_remap_file_pages: u32 = 234; -pub const __NR_mbind: u32 = 235; -pub const __NR_get_mempolicy: u32 = 236; -pub const __NR_set_mempolicy: u32 = 237; -pub const __NR_migrate_pages: u32 = 238; -pub const __NR_move_pages: u32 = 239; -pub const __NR_rt_tgsigqueueinfo: u32 = 240; -pub const __NR_perf_event_open: u32 = 241; -pub const __NR_accept4: u32 = 242; -pub const __NR_recvmmsg: u32 = 243; -pub const __NR_arch_specific_syscall: u32 = 244; -pub const __NR_wait4: u32 = 260; -pub const __NR_prlimit64: u32 = 261; -pub const __NR_fanotify_init: u32 = 262; -pub const __NR_fanotify_mark: u32 = 263; -pub const __NR_name_to_handle_at: u32 = 264; -pub const __NR_open_by_handle_at: u32 = 265; -pub const __NR_clock_adjtime: u32 = 266; -pub const __NR_syncfs: u32 = 267; -pub const __NR_setns: u32 = 268; -pub const __NR_sendmmsg: u32 = 269; -pub const __NR_process_vm_readv: u32 = 270; -pub const __NR_process_vm_writev: u32 = 271; -pub const __NR_kcmp: u32 = 272; -pub const __NR_finit_module: u32 = 273; -pub const __NR_sched_setattr: u32 = 274; -pub const __NR_sched_getattr: u32 = 275; -pub const __NR_renameat2: u32 = 276; -pub const __NR_seccomp: u32 = 277; -pub const __NR_getrandom: u32 = 278; -pub const __NR_memfd_create: u32 = 279; -pub const __NR_bpf: u32 = 280; -pub const __NR_execveat: u32 = 281; -pub const __NR_userfaultfd: u32 = 282; -pub const __NR_membarrier: u32 = 283; -pub const __NR_mlock2: u32 = 284; -pub const __NR_copy_file_range: u32 = 285; -pub const __NR_preadv2: u32 = 286; -pub const __NR_pwritev2: u32 = 287; -pub const __NR_pkey_mprotect: u32 = 288; -pub const __NR_pkey_alloc: u32 = 289; -pub const __NR_pkey_free: u32 = 290; -pub const __NR_statx: u32 = 291; -pub const __NR_io_pgetevents: u32 = 292; -pub const __NR_rseq: u32 = 293; -pub const __NR_kexec_file_load: u32 = 294; -pub const __NR_clock_gettime64: u32 = 403; -pub const __NR_clock_settime64: u32 = 404; -pub const __NR_clock_adjtime64: u32 = 405; -pub const __NR_clock_getres_time64: u32 = 406; -pub const __NR_clock_nanosleep_time64: u32 = 407; -pub const __NR_timer_gettime64: u32 = 408; -pub const __NR_timer_settime64: u32 = 409; -pub const __NR_timerfd_gettime64: u32 = 410; -pub const __NR_timerfd_settime64: u32 = 411; -pub const __NR_utimensat_time64: u32 = 412; -pub const __NR_pselect6_time64: u32 = 413; -pub const __NR_ppoll_time64: u32 = 414; -pub const __NR_io_pgetevents_time64: u32 = 416; -pub const __NR_recvmmsg_time64: u32 = 417; -pub const __NR_mq_timedsend_time64: u32 = 418; -pub const __NR_mq_timedreceive_time64: u32 = 419; -pub const __NR_semtimedop_time64: u32 = 420; -pub const __NR_rt_sigtimedwait_time64: u32 = 421; -pub const __NR_futex_time64: u32 = 422; -pub const __NR_sched_rr_get_interval_time64: u32 = 423; -pub const __NR_pidfd_send_signal: u32 = 424; -pub const __NR_io_uring_setup: u32 = 425; -pub const __NR_io_uring_enter: u32 = 426; -pub const __NR_io_uring_register: u32 = 427; -pub const __NR_open_tree: u32 = 428; -pub const __NR_move_mount: u32 = 429; -pub const __NR_fsopen: u32 = 430; -pub const __NR_fsconfig: u32 = 431; -pub const __NR_fsmount: u32 = 432; -pub const __NR_fspick: u32 = 433; -pub const __NR_pidfd_open: u32 = 434; -pub const __NR_clone3: u32 = 435; -pub const __NR_close_range: u32 = 436; -pub const __NR_openat2: u32 = 437; -pub const __NR_pidfd_getfd: u32 = 438; -pub const __NR_faccessat2: u32 = 439; -pub const __NR_process_madvise: u32 = 440; -pub const __NR_epoll_pwait2: u32 = 441; -pub const __NR_mount_setattr: u32 = 442; -pub const __NR_quotactl_fd: u32 = 443; -pub const __NR_landlock_create_ruleset: u32 = 444; -pub const __NR_landlock_add_rule: u32 = 445; -pub const __NR_landlock_restrict_self: u32 = 446; -pub const __NR_process_mrelease: u32 = 448; -pub const __NR_futex_waitv: u32 = 449; -pub const __NR_set_mempolicy_home_node: u32 = 450; -pub const __NR_syscalls: u32 = 451; -pub const __NR_fcntl64: u32 = 25; -pub const __NR_statfs64: u32 = 43; -pub const __NR_fstatfs64: u32 = 44; -pub const __NR_truncate64: u32 = 45; -pub const __NR_ftruncate64: u32 = 46; -pub const __NR_llseek: u32 = 62; -pub const __NR_sendfile64: u32 = 71; -pub const __NR_fstatat64: u32 = 79; -pub const __NR_fstat64: u32 = 80; -pub const __NR_mmap2: u32 = 222; -pub const __NR_fadvise64_64: u32 = 223; -pub const __NR_set_thread_area: u32 = 244; -pub const __NR_cacheflush: u32 = 245; -pub const WNOHANG: u32 = 1; -pub const WUNTRACED: u32 = 2; -pub const WSTOPPED: u32 = 2; -pub const WEXITED: u32 = 4; -pub const WCONTINUED: u32 = 8; -pub const WNOWAIT: u32 = 16777216; -pub const __WNOTHREAD: u32 = 536870912; -pub const __WALL: u32 = 1073741824; -pub const __WCLONE: u32 = 2147483648; -pub const P_ALL: u32 = 0; -pub const P_PID: u32 = 1; -pub const P_PGID: u32 = 2; -pub const P_PIDFD: u32 = 3; -pub const XATTR_CREATE: u32 = 1; -pub const XATTR_REPLACE: u32 = 2; -pub const XATTR_OS2_PREFIX: &[u8; 5] = b"os2.\0"; -pub const XATTR_MAC_OSX_PREFIX: &[u8; 5] = b"osx.\0"; -pub const XATTR_BTRFS_PREFIX: &[u8; 7] = b"btrfs.\0"; -pub const XATTR_HURD_PREFIX: &[u8; 5] = b"gnu.\0"; -pub const XATTR_SECURITY_PREFIX: &[u8; 10] = b"security.\0"; -pub const XATTR_SYSTEM_PREFIX: &[u8; 8] = b"system.\0"; -pub const XATTR_TRUSTED_PREFIX: &[u8; 9] = b"trusted.\0"; -pub const XATTR_USER_PREFIX: &[u8; 6] = b"user.\0"; -pub const XATTR_EVM_SUFFIX: &[u8; 4] = b"evm\0"; -pub const XATTR_NAME_EVM: &[u8; 13] = b"security.evm\0"; -pub const XATTR_IMA_SUFFIX: &[u8; 4] = b"ima\0"; -pub const XATTR_NAME_IMA: &[u8; 13] = b"security.ima\0"; -pub const XATTR_SELINUX_SUFFIX: &[u8; 8] = b"selinux\0"; -pub const XATTR_NAME_SELINUX: &[u8; 17] = b"security.selinux\0"; -pub const XATTR_SMACK_SUFFIX: &[u8; 8] = b"SMACK64\0"; -pub const XATTR_SMACK_IPIN: &[u8; 12] = b"SMACK64IPIN\0"; -pub const XATTR_SMACK_IPOUT: &[u8; 13] = b"SMACK64IPOUT\0"; -pub const XATTR_SMACK_EXEC: &[u8; 12] = b"SMACK64EXEC\0"; -pub const XATTR_SMACK_TRANSMUTE: &[u8; 17] = b"SMACK64TRANSMUTE\0"; -pub const XATTR_SMACK_MMAP: &[u8; 12] = b"SMACK64MMAP\0"; -pub const XATTR_NAME_SMACK: &[u8; 17] = b"security.SMACK64\0"; -pub const XATTR_NAME_SMACKIPIN: &[u8; 21] = b"security.SMACK64IPIN\0"; -pub const XATTR_NAME_SMACKIPOUT: &[u8; 22] = b"security.SMACK64IPOUT\0"; -pub const XATTR_NAME_SMACKEXEC: &[u8; 21] = b"security.SMACK64EXEC\0"; -pub const XATTR_NAME_SMACKTRANSMUTE: &[u8; 26] = b"security.SMACK64TRANSMUTE\0"; -pub const XATTR_NAME_SMACKMMAP: &[u8; 21] = b"security.SMACK64MMAP\0"; -pub const XATTR_APPARMOR_SUFFIX: &[u8; 9] = b"apparmor\0"; -pub const XATTR_NAME_APPARMOR: &[u8; 18] = b"security.apparmor\0"; -pub const XATTR_CAPS_SUFFIX: &[u8; 11] = b"capability\0"; -pub const XATTR_NAME_CAPS: &[u8; 20] = b"security.capability\0"; -pub const XATTR_POSIX_ACL_ACCESS: &[u8; 17] = b"posix_acl_access\0"; -pub const XATTR_NAME_POSIX_ACL_ACCESS: &[u8; 24] = b"system.posix_acl_access\0"; -pub const XATTR_POSIX_ACL_DEFAULT: &[u8; 18] = b"posix_acl_default\0"; -pub const XATTR_NAME_POSIX_ACL_DEFAULT: &[u8; 25] = b"system.posix_acl_default\0"; -pub const MFD_CLOEXEC: u32 = 1; -pub const MFD_ALLOW_SEALING: u32 = 2; -pub const MFD_HUGETLB: u32 = 4; -pub const MFD_NOEXEC_SEAL: u32 = 8; -pub const MFD_EXEC: u32 = 16; -pub const MFD_HUGE_SHIFT: u32 = 26; -pub const MFD_HUGE_MASK: u32 = 63; -pub const MFD_HUGE_64KB: u32 = 1073741824; -pub const MFD_HUGE_512KB: u32 = 1275068416; -pub const MFD_HUGE_1MB: u32 = 1342177280; -pub const MFD_HUGE_2MB: u32 = 1409286144; -pub const MFD_HUGE_8MB: u32 = 1543503872; -pub const MFD_HUGE_16MB: u32 = 1610612736; -pub const MFD_HUGE_32MB: u32 = 1677721600; -pub const MFD_HUGE_256MB: u32 = 1879048192; -pub const MFD_HUGE_512MB: u32 = 1946157056; -pub const MFD_HUGE_1GB: u32 = 2013265920; -pub const MFD_HUGE_2GB: u32 = 2080374784; -pub const MFD_HUGE_16GB: u32 = 2281701376; -pub const TFD_TIMER_ABSTIME: u32 = 1; -pub const TFD_TIMER_CANCEL_ON_SET: u32 = 2; -pub const TFD_CLOEXEC: u32 = 524288; -pub const TFD_NONBLOCK: u32 = 2048; -pub const USERFAULTFD_IOC: u32 = 170; -pub const _UFFDIO_REGISTER: u32 = 0; -pub const _UFFDIO_UNREGISTER: u32 = 1; -pub const _UFFDIO_WAKE: u32 = 2; -pub const _UFFDIO_COPY: u32 = 3; -pub const _UFFDIO_ZEROPAGE: u32 = 4; -pub const _UFFDIO_WRITEPROTECT: u32 = 6; -pub const _UFFDIO_CONTINUE: u32 = 7; -pub const _UFFDIO_API: u32 = 63; -pub const UFFDIO: u32 = 170; -pub const UFFD_EVENT_PAGEFAULT: u32 = 18; -pub const UFFD_EVENT_FORK: u32 = 19; -pub const UFFD_EVENT_REMAP: u32 = 20; -pub const UFFD_EVENT_REMOVE: u32 = 21; -pub const UFFD_EVENT_UNMAP: u32 = 22; -pub const UFFD_PAGEFAULT_FLAG_WRITE: u32 = 1; -pub const UFFD_PAGEFAULT_FLAG_WP: u32 = 2; -pub const UFFD_PAGEFAULT_FLAG_MINOR: u32 = 4; -pub const UFFD_FEATURE_PAGEFAULT_FLAG_WP: u32 = 1; -pub const UFFD_FEATURE_EVENT_FORK: u32 = 2; -pub const UFFD_FEATURE_EVENT_REMAP: u32 = 4; -pub const UFFD_FEATURE_EVENT_REMOVE: u32 = 8; -pub const UFFD_FEATURE_MISSING_HUGETLBFS: u32 = 16; -pub const UFFD_FEATURE_MISSING_SHMEM: u32 = 32; -pub const UFFD_FEATURE_EVENT_UNMAP: u32 = 64; -pub const UFFD_FEATURE_SIGBUS: u32 = 128; -pub const UFFD_FEATURE_THREAD_ID: u32 = 256; -pub const UFFD_FEATURE_MINOR_HUGETLBFS: u32 = 512; -pub const UFFD_FEATURE_MINOR_SHMEM: u32 = 1024; -pub const UFFD_FEATURE_EXACT_ADDRESS: u32 = 2048; -pub const UFFD_FEATURE_WP_HUGETLBFS_SHMEM: u32 = 4096; -pub const UFFD_USER_MODE_ONLY: u32 = 1; -pub const DT_UNKNOWN: u32 = 0; -pub const DT_FIFO: u32 = 1; -pub const DT_CHR: u32 = 2; -pub const DT_DIR: u32 = 4; -pub const DT_BLK: u32 = 6; -pub const DT_REG: u32 = 8; -pub const DT_LNK: u32 = 10; -pub const DT_SOCK: u32 = 12; -pub const STAT_HAVE_NSEC: u32 = 1; -pub const F_OK: u32 = 0; -pub const R_OK: u32 = 4; -pub const W_OK: u32 = 2; -pub const X_OK: u32 = 1; -pub const UTIME_NOW: u32 = 1073741823; -pub const UTIME_OMIT: u32 = 1073741822; -pub const MNT_FORCE: u32 = 1; -pub const MNT_DETACH: u32 = 2; -pub const MNT_EXPIRE: u32 = 4; -pub const UMOUNT_NOFOLLOW: u32 = 8; -pub const UMOUNT_UNUSED: u32 = 2147483648; -pub const STDIN_FILENO: u32 = 0; -pub const STDOUT_FILENO: u32 = 1; -pub const STDERR_FILENO: u32 = 2; -pub const RWF_HIPRI: u32 = 1; -pub const RWF_DSYNC: u32 = 2; -pub const RWF_SYNC: u32 = 4; -pub const RWF_NOWAIT: u32 = 8; -pub const RWF_APPEND: u32 = 16; -pub const EFD_SEMAPHORE: u32 = 1; -pub const EFD_CLOEXEC: u32 = 524288; -pub const EFD_NONBLOCK: u32 = 2048; -pub const EPOLLIN: u32 = 1; -pub const EPOLLPRI: u32 = 2; -pub const EPOLLOUT: u32 = 4; -pub const EPOLLERR: u32 = 8; -pub const EPOLLHUP: u32 = 16; -pub const EPOLLNVAL: u32 = 32; -pub const EPOLLRDNORM: u32 = 64; -pub const EPOLLRDBAND: u32 = 128; -pub const EPOLLWRNORM: u32 = 256; -pub const EPOLLWRBAND: u32 = 512; -pub const EPOLLMSG: u32 = 1024; -pub const EPOLLRDHUP: u32 = 8192; -pub const EPOLLEXCLUSIVE: u32 = 268435456; -pub const EPOLLWAKEUP: u32 = 536870912; -pub const EPOLLONESHOT: u32 = 1073741824; -pub const EPOLLET: u32 = 2147483648; -pub const TFD_SHARED_FCNTL_FLAGS: u32 = 526336; -pub const TFD_CREATE_FLAGS: u32 = 526336; -pub const TFD_SETTIME_FLAGS: u32 = 1; -pub const UFFD_API: u32 = 170; -pub const UFFDIO_REGISTER_MODE_MISSING: u32 = 1; -pub const UFFDIO_REGISTER_MODE_WP: u32 = 2; -pub const UFFDIO_REGISTER_MODE_MINOR: u32 = 4; -pub const UFFDIO_COPY_MODE_DONTWAKE: u32 = 1; -pub const UFFDIO_COPY_MODE_WP: u32 = 2; -pub const UFFDIO_ZEROPAGE_MODE_DONTWAKE: u32 = 1; -pub const SPLICE_F_MOVE: u32 = 1; -pub const SPLICE_F_NONBLOCK: u32 = 2; -pub const SPLICE_F_MORE: u32 = 4; -pub const SPLICE_F_GIFT: u32 = 8; -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum fsconfig_command { -FSCONFIG_SET_FLAG = 0, -FSCONFIG_SET_STRING = 1, -FSCONFIG_SET_BINARY = 2, -FSCONFIG_SET_PATH = 3, -FSCONFIG_SET_PATH_EMPTY = 4, -FSCONFIG_SET_FD = 5, -FSCONFIG_CMD_CREATE = 6, -FSCONFIG_CMD_RECONFIGURE = 7, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum membarrier_cmd { -MEMBARRIER_CMD_QUERY = 0, -MEMBARRIER_CMD_GLOBAL = 1, -MEMBARRIER_CMD_GLOBAL_EXPEDITED = 2, -MEMBARRIER_CMD_REGISTER_GLOBAL_EXPEDITED = 4, -MEMBARRIER_CMD_PRIVATE_EXPEDITED = 8, -MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED = 16, -MEMBARRIER_CMD_PRIVATE_EXPEDITED_SYNC_CORE = 32, -MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_SYNC_CORE = 64, -MEMBARRIER_CMD_PRIVATE_EXPEDITED_RSEQ = 128, -MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_RSEQ = 256, -MEMBARRIER_CMD_GET_REGISTRATIONS = 512, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum membarrier_cmd_flag { -MEMBARRIER_CMD_FLAG_CPU = 1, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union fscrypt_get_policy_ex_arg__bindgen_ty_1 { -pub version: __u8, -pub v1: fscrypt_policy_v1, -pub v2: fscrypt_policy_v2, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union fscrypt_key_specifier__bindgen_ty_1 { -pub __reserved: [__u8; 32usize], -pub descriptor: [__u8; 8usize], -pub identifier: [__u8; 16usize], -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union sigval { -pub sival_int: crate::ctypes::c_int, -pub sival_ptr: *mut crate::ctypes::c_void, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union __sifields { -pub _kill: __sifields__bindgen_ty_1, -pub _timer: __sifields__bindgen_ty_2, -pub _rt: __sifields__bindgen_ty_3, -pub _sigchld: __sifields__bindgen_ty_4, -pub _sigfault: __sifields__bindgen_ty_5, -pub _sigpoll: __sifields__bindgen_ty_6, -pub _sigsys: __sifields__bindgen_ty_7, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union __sifields__bindgen_ty_5__bindgen_ty_1 { -pub _trapno: crate::ctypes::c_int, -pub _addr_lsb: crate::ctypes::c_short, -pub _addr_bnd: __sifields__bindgen_ty_5__bindgen_ty_1__bindgen_ty_1, -pub _addr_pkey: __sifields__bindgen_ty_5__bindgen_ty_1__bindgen_ty_2, -pub _perf: __sifields__bindgen_ty_5__bindgen_ty_1__bindgen_ty_3, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union siginfo__bindgen_ty_1 { -pub __bindgen_anon_1: siginfo__bindgen_ty_1__bindgen_ty_1, -pub _si_pad: [crate::ctypes::c_int; 32usize], -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union sigevent__bindgen_ty_1 { -pub _pad: [crate::ctypes::c_int; 13usize], -pub _tid: crate::ctypes::c_int, -pub _sigev_thread: sigevent__bindgen_ty_1__bindgen_ty_1, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union uffd_msg__bindgen_ty_1 { -pub pagefault: uffd_msg__bindgen_ty_1__bindgen_ty_1, -pub fork: uffd_msg__bindgen_ty_1__bindgen_ty_2, -pub remap: uffd_msg__bindgen_ty_1__bindgen_ty_3, -pub remove: uffd_msg__bindgen_ty_1__bindgen_ty_4, -pub reserved: uffd_msg__bindgen_ty_1__bindgen_ty_5, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union uffd_msg__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1 { -pub ptid: __u32, -} -impl __BindgenBitfieldUnit { -#[inline] -pub const fn new(storage: Storage) -> Self { -Self { storage } -} -} -impl __BindgenBitfieldUnit -where -Storage: AsRef<[u8]> + AsMut<[u8]>, -{ -#[inline] -pub fn get_bit(&self, index: usize) -> bool { -debug_assert!(index / 8 < self.storage.as_ref().len()); -let byte_index = index / 8; -let byte = self.storage.as_ref()[byte_index]; -let bit_index = if cfg!(target_endian = "big") { 7 - (index % 8) } else { index % 8 }; -let mask = 1 << bit_index; -byte & mask == mask -} -#[inline] -pub fn set_bit(&mut self, index: usize, val: bool) { -debug_assert!(index / 8 < self.storage.as_ref().len()); -let byte_index = index / 8; -let byte = &mut self.storage.as_mut()[byte_index]; -let bit_index = if cfg!(target_endian = "big") { 7 - (index % 8) } else { index % 8 }; -let mask = 1 << bit_index; -if val { -*byte |= mask; -} else { -*byte &= !mask; -} -} -#[inline] -pub fn get(&self, bit_offset: usize, bit_width: u8) -> u64 { -debug_assert!(bit_width <= 64); -debug_assert!(bit_offset / 8 < self.storage.as_ref().len()); -debug_assert!((bit_offset + (bit_width as usize)) / 8 <= self.storage.as_ref().len()); -let mut val = 0; -for i in 0..(bit_width as usize) { -if self.get_bit(i + bit_offset) { -let index = if cfg!(target_endian = "big") { bit_width as usize - 1 - i } else { i }; -val |= 1 << index; -} -} -val -} -#[inline] -pub fn set(&mut self, bit_offset: usize, bit_width: u8, val: u64) { -debug_assert!(bit_width <= 64); -debug_assert!(bit_offset / 8 < self.storage.as_ref().len()); -debug_assert!((bit_offset + (bit_width as usize)) / 8 <= self.storage.as_ref().len()); -for i in 0..(bit_width as usize) { -let mask = 1 << i; -let val_bit_is_set = val & mask == mask; -let index = if cfg!(target_endian = "big") { bit_width as usize - 1 - i } else { i }; -self.set_bit(index + bit_offset, val_bit_is_set); -} -} -} -impl __IncompleteArrayField { -#[inline] -pub const fn new() -> Self { -__IncompleteArrayField(::core::marker::PhantomData, []) -} -#[inline] -pub fn as_ptr(&self) -> *const T { -self as *const _ as *const T -} -#[inline] -pub fn as_mut_ptr(&mut self) -> *mut T { -self as *mut _ as *mut T -} -#[inline] -pub unsafe fn as_slice(&self, len: usize) -> &[T] { -::core::slice::from_raw_parts(self.as_ptr(), len) -} -#[inline] -pub unsafe fn as_mut_slice(&mut self, len: usize) -> &mut [T] { -::core::slice::from_raw_parts_mut(self.as_mut_ptr(), len) -} -} -impl ::core::fmt::Debug for __IncompleteArrayField { -fn fmt(&self, fmt: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { -fmt.write_str("__IncompleteArrayField") -} -} -impl membarrier_cmd { -pub const MEMBARRIER_CMD_SHARED: membarrier_cmd = membarrier_cmd::MEMBARRIER_CMD_GLOBAL; -} -impl user_desc { -#[inline] -pub fn seg_32bit(&self) -> crate::ctypes::c_uint { -unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u32) } -} -#[inline] -pub fn set_seg_32bit(&mut self, val: crate::ctypes::c_uint) { -unsafe { -let val: u32 = ::core::mem::transmute(val); -self._bitfield_1.set(0usize, 1u8, val as u64) -} -} -#[inline] -pub fn contents(&self) -> crate::ctypes::c_uint { -unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 2u8) as u32) } -} -#[inline] -pub fn set_contents(&mut self, val: crate::ctypes::c_uint) { -unsafe { -let val: u32 = ::core::mem::transmute(val); -self._bitfield_1.set(1usize, 2u8, val as u64) -} -} -#[inline] -pub fn read_exec_only(&self) -> crate::ctypes::c_uint { -unsafe { ::core::mem::transmute(self._bitfield_1.get(3usize, 1u8) as u32) } -} -#[inline] -pub fn set_read_exec_only(&mut self, val: crate::ctypes::c_uint) { -unsafe { -let val: u32 = ::core::mem::transmute(val); -self._bitfield_1.set(3usize, 1u8, val as u64) -} -} -#[inline] -pub fn limit_in_pages(&self) -> crate::ctypes::c_uint { -unsafe { ::core::mem::transmute(self._bitfield_1.get(4usize, 1u8) as u32) } -} -#[inline] -pub fn set_limit_in_pages(&mut self, val: crate::ctypes::c_uint) { -unsafe { -let val: u32 = ::core::mem::transmute(val); -self._bitfield_1.set(4usize, 1u8, val as u64) -} -} -#[inline] -pub fn seg_not_present(&self) -> crate::ctypes::c_uint { -unsafe { ::core::mem::transmute(self._bitfield_1.get(5usize, 1u8) as u32) } -} -#[inline] -pub fn set_seg_not_present(&mut self, val: crate::ctypes::c_uint) { -unsafe { -let val: u32 = ::core::mem::transmute(val); -self._bitfield_1.set(5usize, 1u8, val as u64) -} -} -#[inline] -pub fn useable(&self) -> crate::ctypes::c_uint { -unsafe { ::core::mem::transmute(self._bitfield_1.get(6usize, 1u8) as u32) } -} -#[inline] -pub fn set_useable(&mut self, val: crate::ctypes::c_uint) { -unsafe { -let val: u32 = ::core::mem::transmute(val); -self._bitfield_1.set(6usize, 1u8, val as u64) -} -} -#[inline] -pub fn new_bitfield_1(seg_32bit: crate::ctypes::c_uint, contents: crate::ctypes::c_uint, read_exec_only: crate::ctypes::c_uint, limit_in_pages: crate::ctypes::c_uint, seg_not_present: crate::ctypes::c_uint, useable: crate::ctypes::c_uint) -> __BindgenBitfieldUnit<[u8; 1usize]> { -let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); -__bindgen_bitfield_unit.set(0usize, 1u8, { -let seg_32bit: u32 = unsafe { ::core::mem::transmute(seg_32bit) }; -seg_32bit as u64 -}); -__bindgen_bitfield_unit.set(1usize, 2u8, { -let contents: u32 = unsafe { ::core::mem::transmute(contents) }; -contents as u64 -}); -__bindgen_bitfield_unit.set(3usize, 1u8, { -let read_exec_only: u32 = unsafe { ::core::mem::transmute(read_exec_only) }; -read_exec_only as u64 -}); -__bindgen_bitfield_unit.set(4usize, 1u8, { -let limit_in_pages: u32 = unsafe { ::core::mem::transmute(limit_in_pages) }; -limit_in_pages as u64 -}); -__bindgen_bitfield_unit.set(5usize, 1u8, { -let seg_not_present: u32 = unsafe { ::core::mem::transmute(seg_not_present) }; -seg_not_present as u64 -}); -__bindgen_bitfield_unit.set(6usize, 1u8, { -let useable: u32 = unsafe { ::core::mem::transmute(useable) }; -useable as u64 -}); -__bindgen_bitfield_unit -} -} diff -Nru temporalio-1.3.0/vendor/linux-raw-sys/src/csky/if_ether.rs temporalio-1.3.0/vendor/linux-raw-sys/src/csky/if_ether.rs --- temporalio-1.3.0/vendor/linux-raw-sys/src/csky/if_ether.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/linux-raw-sys/src/csky/if_ether.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,167 +0,0 @@ -/* automatically generated by rust-bindgen 0.66.1 */ - -pub type __s8 = crate::ctypes::c_schar; -pub type __u8 = crate::ctypes::c_uchar; -pub type __s16 = crate::ctypes::c_short; -pub type __u16 = crate::ctypes::c_ushort; -pub type __s32 = crate::ctypes::c_int; -pub type __u32 = crate::ctypes::c_uint; -pub type __s64 = crate::ctypes::c_longlong; -pub type __u64 = crate::ctypes::c_ulonglong; -pub type __kernel_key_t = crate::ctypes::c_int; -pub type __kernel_mqd_t = crate::ctypes::c_int; -pub type __kernel_long_t = crate::ctypes::c_long; -pub type __kernel_ulong_t = crate::ctypes::c_ulong; -pub type __kernel_ino_t = __kernel_ulong_t; -pub type __kernel_mode_t = crate::ctypes::c_uint; -pub type __kernel_pid_t = crate::ctypes::c_int; -pub type __kernel_ipc_pid_t = crate::ctypes::c_int; -pub type __kernel_uid_t = crate::ctypes::c_uint; -pub type __kernel_gid_t = crate::ctypes::c_uint; -pub type __kernel_suseconds_t = __kernel_long_t; -pub type __kernel_daddr_t = crate::ctypes::c_int; -pub type __kernel_uid32_t = crate::ctypes::c_uint; -pub type __kernel_gid32_t = crate::ctypes::c_uint; -pub type __kernel_old_uid_t = __kernel_uid_t; -pub type __kernel_old_gid_t = __kernel_gid_t; -pub type __kernel_old_dev_t = crate::ctypes::c_uint; -pub type __kernel_size_t = crate::ctypes::c_uint; -pub type __kernel_ssize_t = crate::ctypes::c_int; -pub type __kernel_ptrdiff_t = crate::ctypes::c_int; -pub type __kernel_off_t = __kernel_long_t; -pub type __kernel_loff_t = crate::ctypes::c_longlong; -pub type __kernel_old_time_t = __kernel_long_t; -pub type __kernel_time_t = __kernel_long_t; -pub type __kernel_time64_t = crate::ctypes::c_longlong; -pub type __kernel_clock_t = __kernel_long_t; -pub type __kernel_timer_t = crate::ctypes::c_int; -pub type __kernel_clockid_t = crate::ctypes::c_int; -pub type __kernel_caddr_t = *mut crate::ctypes::c_char; -pub type __kernel_uid16_t = crate::ctypes::c_ushort; -pub type __kernel_gid16_t = crate::ctypes::c_ushort; -pub type __le16 = __u16; -pub type __be16 = __u16; -pub type __le32 = __u32; -pub type __be32 = __u32; -pub type __le64 = __u64; -pub type __be64 = __u64; -pub type __sum16 = __u16; -pub type __wsum = __u32; -pub type __poll_t = crate::ctypes::c_uint; -#[repr(C, packed)] -#[derive(Debug, Copy, Clone)] -pub struct ethhdr { -pub h_dest: [crate::ctypes::c_uchar; 6usize], -pub h_source: [crate::ctypes::c_uchar; 6usize], -pub h_proto: __be16, -} -pub const ETH_ALEN: u32 = 6; -pub const ETH_TLEN: u32 = 2; -pub const ETH_HLEN: u32 = 14; -pub const ETH_ZLEN: u32 = 60; -pub const ETH_DATA_LEN: u32 = 1500; -pub const ETH_FRAME_LEN: u32 = 1514; -pub const ETH_FCS_LEN: u32 = 4; -pub const ETH_MIN_MTU: u32 = 68; -pub const ETH_MAX_MTU: u32 = 65535; -pub const ETH_P_LOOP: u32 = 96; -pub const ETH_P_PUP: u32 = 512; -pub const ETH_P_PUPAT: u32 = 513; -pub const ETH_P_TSN: u32 = 8944; -pub const ETH_P_ERSPAN2: u32 = 8939; -pub const ETH_P_IP: u32 = 2048; -pub const ETH_P_X25: u32 = 2053; -pub const ETH_P_ARP: u32 = 2054; -pub const ETH_P_BPQ: u32 = 2303; -pub const ETH_P_IEEEPUP: u32 = 2560; -pub const ETH_P_IEEEPUPAT: u32 = 2561; -pub const ETH_P_BATMAN: u32 = 17157; -pub const ETH_P_DEC: u32 = 24576; -pub const ETH_P_DNA_DL: u32 = 24577; -pub const ETH_P_DNA_RC: u32 = 24578; -pub const ETH_P_DNA_RT: u32 = 24579; -pub const ETH_P_LAT: u32 = 24580; -pub const ETH_P_DIAG: u32 = 24581; -pub const ETH_P_CUST: u32 = 24582; -pub const ETH_P_SCA: u32 = 24583; -pub const ETH_P_TEB: u32 = 25944; -pub const ETH_P_RARP: u32 = 32821; -pub const ETH_P_ATALK: u32 = 32923; -pub const ETH_P_AARP: u32 = 33011; -pub const ETH_P_8021Q: u32 = 33024; -pub const ETH_P_ERSPAN: u32 = 35006; -pub const ETH_P_IPX: u32 = 33079; -pub const ETH_P_IPV6: u32 = 34525; -pub const ETH_P_PAUSE: u32 = 34824; -pub const ETH_P_SLOW: u32 = 34825; -pub const ETH_P_WCCP: u32 = 34878; -pub const ETH_P_MPLS_UC: u32 = 34887; -pub const ETH_P_MPLS_MC: u32 = 34888; -pub const ETH_P_ATMMPOA: u32 = 34892; -pub const ETH_P_PPP_DISC: u32 = 34915; -pub const ETH_P_PPP_SES: u32 = 34916; -pub const ETH_P_LINK_CTL: u32 = 34924; -pub const ETH_P_ATMFATE: u32 = 34948; -pub const ETH_P_PAE: u32 = 34958; -pub const ETH_P_PROFINET: u32 = 34962; -pub const ETH_P_REALTEK: u32 = 34969; -pub const ETH_P_AOE: u32 = 34978; -pub const ETH_P_ETHERCAT: u32 = 34980; -pub const ETH_P_8021AD: u32 = 34984; -pub const ETH_P_802_EX1: u32 = 34997; -pub const ETH_P_PREAUTH: u32 = 35015; -pub const ETH_P_TIPC: u32 = 35018; -pub const ETH_P_LLDP: u32 = 35020; -pub const ETH_P_MRP: u32 = 35043; -pub const ETH_P_MACSEC: u32 = 35045; -pub const ETH_P_8021AH: u32 = 35047; -pub const ETH_P_MVRP: u32 = 35061; -pub const ETH_P_1588: u32 = 35063; -pub const ETH_P_NCSI: u32 = 35064; -pub const ETH_P_PRP: u32 = 35067; -pub const ETH_P_CFM: u32 = 35074; -pub const ETH_P_FCOE: u32 = 35078; -pub const ETH_P_IBOE: u32 = 35093; -pub const ETH_P_TDLS: u32 = 35085; -pub const ETH_P_FIP: u32 = 35092; -pub const ETH_P_80221: u32 = 35095; -pub const ETH_P_HSR: u32 = 35119; -pub const ETH_P_NSH: u32 = 35151; -pub const ETH_P_LOOPBACK: u32 = 36864; -pub const ETH_P_QINQ1: u32 = 37120; -pub const ETH_P_QINQ2: u32 = 37376; -pub const ETH_P_QINQ3: u32 = 37632; -pub const ETH_P_EDSA: u32 = 56026; -pub const ETH_P_DSA_8021Q: u32 = 56027; -pub const ETH_P_DSA_A5PSW: u32 = 57345; -pub const ETH_P_IFE: u32 = 60734; -pub const ETH_P_AF_IUCV: u32 = 64507; -pub const ETH_P_802_3_MIN: u32 = 1536; -pub const ETH_P_802_3: u32 = 1; -pub const ETH_P_AX25: u32 = 2; -pub const ETH_P_ALL: u32 = 3; -pub const ETH_P_802_2: u32 = 4; -pub const ETH_P_SNAP: u32 = 5; -pub const ETH_P_DDCMP: u32 = 6; -pub const ETH_P_WAN_PPP: u32 = 7; -pub const ETH_P_PPP_MP: u32 = 8; -pub const ETH_P_LOCALTALK: u32 = 9; -pub const ETH_P_CAN: u32 = 12; -pub const ETH_P_CANFD: u32 = 13; -pub const ETH_P_CANXL: u32 = 14; -pub const ETH_P_PPPTALK: u32 = 16; -pub const ETH_P_TR_802_2: u32 = 17; -pub const ETH_P_MOBITEX: u32 = 21; -pub const ETH_P_CONTROL: u32 = 22; -pub const ETH_P_IRDA: u32 = 23; -pub const ETH_P_ECONET: u32 = 24; -pub const ETH_P_HDLC: u32 = 25; -pub const ETH_P_ARCNET: u32 = 26; -pub const ETH_P_DSA: u32 = 27; -pub const ETH_P_TRAILER: u32 = 28; -pub const ETH_P_PHONET: u32 = 245; -pub const ETH_P_IEEE802154: u32 = 246; -pub const ETH_P_CAIF: u32 = 247; -pub const ETH_P_XDSA: u32 = 248; -pub const ETH_P_MAP: u32 = 249; -pub const ETH_P_MCTP: u32 = 250; diff -Nru temporalio-1.3.0/vendor/linux-raw-sys/src/csky/ioctl.rs temporalio-1.3.0/vendor/linux-raw-sys/src/csky/ioctl.rs --- temporalio-1.3.0/vendor/linux-raw-sys/src/csky/ioctl.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/linux-raw-sys/src/csky/ioctl.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,1489 +0,0 @@ -/* automatically generated by rust-bindgen 0.66.1 */ - -pub const FIONREAD: u32 = 21531; -pub const FIONBIO: u32 = 21537; -pub const FIOCLEX: u32 = 21585; -pub const FIONCLEX: u32 = 21584; -pub const FIOASYNC: u32 = 21586; -pub const FIOQSIZE: u32 = 21600; -pub const TCXONC: u32 = 21514; -pub const TCFLSH: u32 = 21515; -pub const TIOCSCTTY: u32 = 21518; -pub const TIOCSPGRP: u32 = 21520; -pub const TIOCOUTQ: u32 = 21521; -pub const TIOCSTI: u32 = 21522; -pub const TIOCSWINSZ: u32 = 21524; -pub const TIOCMGET: u32 = 21525; -pub const TIOCMBIS: u32 = 21526; -pub const TIOCMBIC: u32 = 21527; -pub const TIOCMSET: u32 = 21528; -pub const TIOCSSOFTCAR: u32 = 21530; -pub const TIOCLINUX: u32 = 21532; -pub const TIOCCONS: u32 = 21533; -pub const TIOCSSERIAL: u32 = 21535; -pub const TIOCPKT: u32 = 21536; -pub const TIOCNOTTY: u32 = 21538; -pub const TIOCSETD: u32 = 21539; -pub const TIOCSBRK: u32 = 21543; -pub const TIOCCBRK: u32 = 21544; -pub const TIOCSRS485: u32 = 21551; -pub const TIOCSPTLCK: u32 = 1074025521; -pub const TIOCSIG: u32 = 1074025526; -pub const TIOCVHANGUP: u32 = 21559; -pub const TIOCSERCONFIG: u32 = 21587; -pub const TIOCSERGWILD: u32 = 21588; -pub const TIOCSERSWILD: u32 = 21589; -pub const TIOCSLCKTRMIOS: u32 = 21591; -pub const TIOCSERGSTRUCT: u32 = 21592; -pub const TIOCSERGETLSR: u32 = 21593; -pub const TIOCSERGETMULTI: u32 = 21594; -pub const TIOCSERSETMULTI: u32 = 21595; -pub const TIOCMIWAIT: u32 = 21596; -pub const TCGETS: u32 = 21505; -pub const TCGETA: u32 = 21509; -pub const TCSBRK: u32 = 21513; -pub const TCSBRKP: u32 = 21541; -pub const TCSETA: u32 = 21510; -pub const TCSETAF: u32 = 21512; -pub const TCSETAW: u32 = 21511; -pub const TIOCEXCL: u32 = 21516; -pub const TIOCNXCL: u32 = 21517; -pub const TIOCGDEV: u32 = 2147767346; -pub const TIOCGEXCL: u32 = 2147767360; -pub const TIOCGICOUNT: u32 = 21597; -pub const TIOCGLCKTRMIOS: u32 = 21590; -pub const TIOCGPGRP: u32 = 21519; -pub const TIOCGPKT: u32 = 2147767352; -pub const TIOCGPTLCK: u32 = 2147767353; -pub const TIOCGPTN: u32 = 2147767344; -pub const TIOCGPTPEER: u32 = 21569; -pub const TIOCGRS485: u32 = 21550; -pub const TIOCGSERIAL: u32 = 21534; -pub const TIOCGSID: u32 = 21545; -pub const TIOCGSOFTCAR: u32 = 21529; -pub const TIOCGWINSZ: u32 = 21523; -pub const TCGETS2: u32 = 2150388778; -pub const TCGETX: u32 = 21554; -pub const TCSETS: u32 = 21506; -pub const TCSETS2: u32 = 1076646955; -pub const TCSETSF: u32 = 21508; -pub const TCSETSF2: u32 = 1076646957; -pub const TCSETSW: u32 = 21507; -pub const TCSETSW2: u32 = 1076646956; -pub const TCSETX: u32 = 21555; -pub const TCSETXF: u32 = 21556; -pub const TCSETXW: u32 = 21557; -pub const TIOCGETD: u32 = 21540; -pub const MTIOCGET: u32 = 2149346562; -pub const BLKSSZGET: u32 = 4712; -pub const BLKPBSZGET: u32 = 4731; -pub const BLKROSET: u32 = 4701; -pub const BLKROGET: u32 = 4702; -pub const BLKRRPART: u32 = 4703; -pub const BLKGETSIZE: u32 = 4704; -pub const BLKFLSBUF: u32 = 4705; -pub const BLKRASET: u32 = 4706; -pub const BLKRAGET: u32 = 4707; -pub const BLKFRASET: u32 = 4708; -pub const BLKFRAGET: u32 = 4709; -pub const BLKSECTSET: u32 = 4710; -pub const BLKSECTGET: u32 = 4711; -pub const BLKPG: u32 = 4713; -pub const BLKBSZGET: u32 = 2147750512; -pub const BLKBSZSET: u32 = 1074008689; -pub const BLKGETSIZE64: u32 = 2147750514; -pub const BLKTRACESETUP: u32 = 3225424499; -pub const BLKTRACESTART: u32 = 4724; -pub const BLKTRACESTOP: u32 = 4725; -pub const BLKTRACETEARDOWN: u32 = 4726; -pub const BLKDISCARD: u32 = 4727; -pub const BLKIOMIN: u32 = 4728; -pub const BLKIOOPT: u32 = 4729; -pub const BLKALIGNOFF: u32 = 4730; -pub const BLKDISCARDZEROES: u32 = 4732; -pub const BLKSECDISCARD: u32 = 4733; -pub const BLKROTATIONAL: u32 = 4734; -pub const BLKZEROOUT: u32 = 4735; -pub const UFFDIO_REGISTER: u32 = 3223366144; -pub const UFFDIO_UNREGISTER: u32 = 2148575745; -pub const UFFDIO_WAKE: u32 = 2148575746; -pub const UFFDIO_COPY: u32 = 3223890435; -pub const UFFDIO_ZEROPAGE: u32 = 3223366148; -pub const UFFDIO_WRITEPROTECT: u32 = 3222841862; -pub const UFFDIO_API: u32 = 3222841919; -pub const NS_GET_USERNS: u32 = 46849; -pub const NS_GET_PARENT: u32 = 46850; -pub const NS_GET_NSTYPE: u32 = 46851; -pub const KDGETLED: u32 = 19249; -pub const KDSETLED: u32 = 19250; -pub const KDGKBLED: u32 = 19300; -pub const KDSKBLED: u32 = 19301; -pub const KDGKBTYPE: u32 = 19251; -pub const KDADDIO: u32 = 19252; -pub const KDDELIO: u32 = 19253; -pub const KDENABIO: u32 = 19254; -pub const KDDISABIO: u32 = 19255; -pub const KDSETMODE: u32 = 19258; -pub const KDGETMODE: u32 = 19259; -pub const KDMKTONE: u32 = 19248; -pub const KIOCSOUND: u32 = 19247; -pub const GIO_CMAP: u32 = 19312; -pub const PIO_CMAP: u32 = 19313; -pub const GIO_FONT: u32 = 19296; -pub const GIO_FONTX: u32 = 19307; -pub const PIO_FONT: u32 = 19297; -pub const PIO_FONTX: u32 = 19308; -pub const PIO_FONTRESET: u32 = 19309; -pub const GIO_SCRNMAP: u32 = 19264; -pub const GIO_UNISCRNMAP: u32 = 19305; -pub const PIO_SCRNMAP: u32 = 19265; -pub const PIO_UNISCRNMAP: u32 = 19306; -pub const GIO_UNIMAP: u32 = 19302; -pub const PIO_UNIMAP: u32 = 19303; -pub const PIO_UNIMAPCLR: u32 = 19304; -pub const KDGKBMODE: u32 = 19268; -pub const KDSKBMODE: u32 = 19269; -pub const KDGKBMETA: u32 = 19298; -pub const KDSKBMETA: u32 = 19299; -pub const KDGKBENT: u32 = 19270; -pub const KDSKBENT: u32 = 19271; -pub const KDGKBSENT: u32 = 19272; -pub const KDSKBSENT: u32 = 19273; -pub const KDGKBDIACR: u32 = 19274; -pub const KDGETKEYCODE: u32 = 19276; -pub const KDSETKEYCODE: u32 = 19277; -pub const KDSIGACCEPT: u32 = 19278; -pub const VT_OPENQRY: u32 = 22016; -pub const VT_GETMODE: u32 = 22017; -pub const VT_SETMODE: u32 = 22018; -pub const VT_GETSTATE: u32 = 22019; -pub const VT_RELDISP: u32 = 22021; -pub const VT_ACTIVATE: u32 = 22022; -pub const VT_WAITACTIVE: u32 = 22023; -pub const VT_DISALLOCATE: u32 = 22024; -pub const VT_RESIZE: u32 = 22025; -pub const VT_RESIZEX: u32 = 22026; -pub const FIOSETOWN: u32 = 35073; -pub const SIOCSPGRP: u32 = 35074; -pub const FIOGETOWN: u32 = 35075; -pub const SIOCGPGRP: u32 = 35076; -pub const SIOCATMARK: u32 = 35077; -pub const SIOCGSTAMP: u32 = 35078; -pub const TIOCINQ: u32 = 21531; -pub const SIOCADDRT: u32 = 35083; -pub const SIOCDELRT: u32 = 35084; -pub const SIOCGIFNAME: u32 = 35088; -pub const SIOCSIFLINK: u32 = 35089; -pub const SIOCGIFCONF: u32 = 35090; -pub const SIOCGIFFLAGS: u32 = 35091; -pub const SIOCSIFFLAGS: u32 = 35092; -pub const SIOCGIFADDR: u32 = 35093; -pub const SIOCSIFADDR: u32 = 35094; -pub const SIOCGIFDSTADDR: u32 = 35095; -pub const SIOCSIFDSTADDR: u32 = 35096; -pub const SIOCGIFBRDADDR: u32 = 35097; -pub const SIOCSIFBRDADDR: u32 = 35098; -pub const SIOCGIFNETMASK: u32 = 35099; -pub const SIOCSIFNETMASK: u32 = 35100; -pub const SIOCGIFMETRIC: u32 = 35101; -pub const SIOCSIFMETRIC: u32 = 35102; -pub const SIOCGIFMEM: u32 = 35103; -pub const SIOCSIFMEM: u32 = 35104; -pub const SIOCGIFMTU: u32 = 35105; -pub const SIOCSIFMTU: u32 = 35106; -pub const SIOCSIFHWADDR: u32 = 35108; -pub const SIOCGIFENCAP: u32 = 35109; -pub const SIOCSIFENCAP: u32 = 35110; -pub const SIOCGIFHWADDR: u32 = 35111; -pub const SIOCGIFSLAVE: u32 = 35113; -pub const SIOCSIFSLAVE: u32 = 35120; -pub const SIOCADDMULTI: u32 = 35121; -pub const SIOCDELMULTI: u32 = 35122; -pub const SIOCDARP: u32 = 35155; -pub const SIOCGARP: u32 = 35156; -pub const SIOCSARP: u32 = 35157; -pub const SIOCDRARP: u32 = 35168; -pub const SIOCGRARP: u32 = 35169; -pub const SIOCSRARP: u32 = 35170; -pub const SIOCGIFMAP: u32 = 35184; -pub const SIOCSIFMAP: u32 = 35185; -pub const SIOCRTMSG: u32 = 35085; -pub const SIOCSIFNAME: u32 = 35107; -pub const SIOCGIFINDEX: u32 = 35123; -pub const SIOGIFINDEX: u32 = 35123; -pub const SIOCSIFPFLAGS: u32 = 35124; -pub const SIOCGIFPFLAGS: u32 = 35125; -pub const SIOCDIFADDR: u32 = 35126; -pub const SIOCSIFHWBROADCAST: u32 = 35127; -pub const SIOCGIFCOUNT: u32 = 35128; -pub const SIOCGIFBR: u32 = 35136; -pub const SIOCSIFBR: u32 = 35137; -pub const SIOCGIFTXQLEN: u32 = 35138; -pub const SIOCSIFTXQLEN: u32 = 35139; -pub const SIOCADDDLCI: u32 = 35200; -pub const SIOCDELDLCI: u32 = 35201; -pub const SIOCDEVPRIVATE: u32 = 35312; -pub const SIOCPROTOPRIVATE: u32 = 35296; -pub const FIBMAP: u32 = 1; -pub const FIGETBSZ: u32 = 2; -pub const FIFREEZE: u32 = 3221510263; -pub const FITHAW: u32 = 3221510264; -pub const FITRIM: u32 = 3222820985; -pub const FICLONE: u32 = 1074041865; -pub const FICLONERANGE: u32 = 1075876877; -pub const FIDEDUPERANGE: u32 = 3222836278; -pub const FS_IOC_GETFLAGS: u32 = 2147771905; -pub const FS_IOC_SETFLAGS: u32 = 1074030082; -pub const FS_IOC_GETVERSION: u32 = 2147776001; -pub const FS_IOC_SETVERSION: u32 = 1074034178; -pub const FS_IOC_FIEMAP: u32 = 3223348747; -pub const FS_IOC32_GETFLAGS: u32 = 2147771905; -pub const FS_IOC32_SETFLAGS: u32 = 1074030082; -pub const FS_IOC32_GETVERSION: u32 = 2147776001; -pub const FS_IOC32_SETVERSION: u32 = 1074034178; -pub const FS_IOC_FSGETXATTR: u32 = 2149341215; -pub const FS_IOC_FSSETXATTR: u32 = 1075599392; -pub const FS_IOC_GETFSLABEL: u32 = 2164298801; -pub const FS_IOC_SETFSLABEL: u32 = 1090556978; -pub const EXT4_IOC_GETVERSION: u32 = 2147771907; -pub const EXT4_IOC_SETVERSION: u32 = 1074030084; -pub const EXT4_IOC_GETVERSION_OLD: u32 = 2147776001; -pub const EXT4_IOC_SETVERSION_OLD: u32 = 1074034178; -pub const EXT4_IOC_GETRSVSZ: u32 = 2147771909; -pub const EXT4_IOC_SETRSVSZ: u32 = 1074030086; -pub const EXT4_IOC_GROUP_EXTEND: u32 = 1074030087; -pub const EXT4_IOC_MIGRATE: u32 = 26121; -pub const EXT4_IOC_ALLOC_DA_BLKS: u32 = 26124; -pub const EXT4_IOC_RESIZE_FS: u32 = 1074292240; -pub const EXT4_IOC_SWAP_BOOT: u32 = 26129; -pub const EXT4_IOC_PRECACHE_EXTENTS: u32 = 26130; -pub const EXT4_IOC_CLEAR_ES_CACHE: u32 = 26152; -pub const EXT4_IOC_GETSTATE: u32 = 1074030121; -pub const EXT4_IOC_GET_ES_CACHE: u32 = 3223348778; -pub const EXT4_IOC_CHECKPOINT: u32 = 1074030123; -pub const EXT4_IOC_SHUTDOWN: u32 = 2147768445; -pub const EXT4_IOC32_GETVERSION: u32 = 2147771907; -pub const EXT4_IOC32_SETVERSION: u32 = 1074030084; -pub const EXT4_IOC32_GETRSVSZ: u32 = 2147771909; -pub const EXT4_IOC32_SETRSVSZ: u32 = 1074030086; -pub const EXT4_IOC32_GROUP_EXTEND: u32 = 1074030087; -pub const EXT4_IOC32_GETVERSION_OLD: u32 = 2147776001; -pub const EXT4_IOC32_SETVERSION_OLD: u32 = 1074034178; -pub const VIDIOC_SUBDEV_QUERYSTD: u32 = 2148030015; -pub const AUTOFS_DEV_IOCTL_CLOSEMOUNT: u32 = 3222836085; -pub const LIRC_SET_SEND_CARRIER: u32 = 1074030867; -pub const AUTOFS_IOC_PROTOSUBVER: u32 = 2147783527; -pub const PTP_SYS_OFFSET_PRECISE: u32 = 3225435400; -pub const FSI_SCOM_WRITE: u32 = 3223352066; -pub const ATM_GETCIRANGE: u32 = 1074553226; -pub const DMA_BUF_SET_NAME_B: u32 = 1074291201; -pub const RIO_CM_EP_GET_LIST_SIZE: u32 = 3221512961; -pub const TUNSETPERSIST: u32 = 1074025675; -pub const FS_IOC_GET_ENCRYPTION_POLICY: u32 = 1074554389; -pub const CEC_RECEIVE: u32 = 3224920326; -pub const MGSL_IOCGPARAMS: u32 = 2149608705; -pub const ENI_SETMULT: u32 = 1074553191; -pub const RIO_GET_EVENT_MASK: u32 = 2147773710; -pub const LIRC_GET_MAX_TIMEOUT: u32 = 2147772681; -pub const USBDEVFS_CLAIMINTERFACE: u32 = 2147767567; -pub const CHIOMOVE: u32 = 1075077889; -pub const SONYPI_IOCGBATFLAGS: u32 = 2147579399; -pub const BTRFS_IOC_SYNC: u32 = 37896; -pub const VIDIOC_TRY_FMT: u32 = 3234616896; -pub const LIRC_SET_REC_MODE: u32 = 1074030866; -pub const VIDIOC_DQEVENT: u32 = 2155370073; -pub const RPMSG_DESTROY_EPT_IOCTL: u32 = 46338; -pub const UVCIOC_CTRL_MAP: u32 = 3227022624; -pub const VHOST_SET_BACKEND_FEATURES: u32 = 1074310949; -pub const VHOST_VSOCK_SET_GUEST_CID: u32 = 1074311008; -pub const UI_SET_KEYBIT: u32 = 1074025829; -pub const LIRC_SET_REC_TIMEOUT: u32 = 1074030872; -pub const FS_IOC_GET_ENCRYPTION_KEY_STATUS: u32 = 3229640218; -pub const BTRFS_IOC_TREE_SEARCH_V2: u32 = 3228603409; -pub const VHOST_SET_VRING_BASE: u32 = 1074310930; -pub const RIO_ENABLE_DOORBELL_RANGE: u32 = 1074294025; -pub const VIDIOC_TRY_EXT_CTRLS: u32 = 3222820425; -pub const LIRC_GET_REC_MODE: u32 = 2147772674; -pub const PPGETTIME: u32 = 2148036757; -pub const BTRFS_IOC_RM_DEV: u32 = 1342215179; -pub const ATM_SETBACKEND: u32 = 1073897970; -pub const FSL_HV_IOCTL_PARTITION_START: u32 = 3222318851; -pub const FBIO_WAITEVENT: u32 = 18056; -pub const SWITCHTEC_IOCTL_PORT_TO_PFF: u32 = 3222034245; -pub const NVME_IOCTL_IO_CMD: u32 = 3225964099; -pub const IPMICTL_RECEIVE_MSG_TRUNC: u32 = 3222825227; -pub const FDTWADDLE: u32 = 601; -pub const NVME_IOCTL_SUBMIT_IO: u32 = 1076645442; -pub const NILFS_IOCTL_SYNC: u32 = 2148036234; -pub const VIDIOC_SUBDEV_S_DV_TIMINGS: u32 = 3229898327; -pub const ASPEED_LPC_CTRL_IOCTL_GET_SIZE: u32 = 3222319616; -pub const DM_DEV_STATUS: u32 = 3241737479; -pub const TEE_IOC_CLOSE_SESSION: u32 = 2147787781; -pub const NS_GETPSTAT: u32 = 3222036833; -pub const UI_SET_PROPBIT: u32 = 1074025838; -pub const TUNSETFILTEREBPF: u32 = 2147767521; -pub const RIO_MPORT_MAINT_COMPTAG_SET: u32 = 1074031874; -pub const AUTOFS_DEV_IOCTL_VERSION: u32 = 3222836081; -pub const WDIOC_SETOPTIONS: u32 = 2147768068; -pub const VHOST_SCSI_SET_ENDPOINT: u32 = 1088991040; -pub const MGSL_IOCGTXIDLE: u32 = 27907; -pub const ATM_ADDLECSADDR: u32 = 1074553230; -pub const FSL_HV_IOCTL_GETPROP: u32 = 3223891719; -pub const FDGETPRM: u32 = 2149319172; -pub const HIDIOCAPPLICATION: u32 = 18434; -pub const ENI_MEMDUMP: u32 = 1074553184; -pub const PTP_SYS_OFFSET2: u32 = 1128283406; -pub const VIDIOC_SUBDEV_G_DV_TIMINGS: u32 = 3229898328; -pub const DMA_BUF_SET_NAME_A: u32 = 1074029057; -pub const PTP_PIN_GETFUNC: u32 = 3227532550; -pub const PTP_SYS_OFFSET_EXTENDED: u32 = 3300932873; -pub const DFL_FPGA_PORT_UINT_SET_IRQ: u32 = 1074312776; -pub const RTC_EPOCH_READ: u32 = 2147774477; -pub const VIDIOC_SUBDEV_S_SELECTION: u32 = 3225441854; -pub const VIDIOC_QUERY_EXT_CTRL: u32 = 3236451943; -pub const ATM_GETLECSADDR: u32 = 1074553232; -pub const FSL_HV_IOCTL_PARTITION_STOP: u32 = 3221794564; -pub const SONET_GETDIAG: u32 = 2147770644; -pub const ATMMPC_DATA: u32 = 25049; -pub const IPMICTL_UNREGISTER_FOR_CMD_CHANS: u32 = 2148296989; -pub const HIDIOCGCOLLECTIONINDEX: u32 = 1075333136; -pub const RPMSG_CREATE_EPT_IOCTL: u32 = 1076409601; -pub const GPIOHANDLE_GET_LINE_VALUES_IOCTL: u32 = 3225465864; -pub const UI_DEV_SETUP: u32 = 1079792899; -pub const ISST_IF_IO_CMD: u32 = 1074068994; -pub const RIO_MPORT_MAINT_READ_REMOTE: u32 = 2149084423; -pub const VIDIOC_OMAP3ISP_HIST_CFG: u32 = 3224393412; -pub const BLKGETNRZONES: u32 = 2147750533; -pub const VIDIOC_G_MODULATOR: u32 = 3225703990; -pub const VBG_IOCTL_WRITE_CORE_DUMP: u32 = 3223082515; -pub const USBDEVFS_SETINTERFACE: u32 = 2148029700; -pub const PPPIOCGCHAN: u32 = 2147775543; -pub const EVIOCGVERSION: u32 = 2147763457; -pub const VHOST_NET_SET_BACKEND: u32 = 1074310960; -pub const USBDEVFS_REAPURBNDELAY: u32 = 1074025741; -pub const RNDZAPENTCNT: u32 = 20996; -pub const VIDIOC_G_PARM: u32 = 3234616853; -pub const TUNGETDEVNETNS: u32 = 21731; -pub const LIRC_SET_MEASURE_CARRIER_MODE: u32 = 1074030877; -pub const VHOST_SET_VRING_ERR: u32 = 1074310946; -pub const VDUSE_VQ_SETUP: u32 = 1075872020; -pub const AUTOFS_IOC_SETTIMEOUT: u32 = 3221525348; -pub const VIDIOC_S_FREQUENCY: u32 = 1076647481; -pub const F2FS_IOC_SEC_TRIM_FILE: u32 = 1075377428; -pub const FS_IOC_REMOVE_ENCRYPTION_KEY: u32 = 3225445912; -pub const WDIOC_GETPRETIMEOUT: u32 = 2147768073; -pub const USBDEVFS_DROP_PRIVILEGES: u32 = 1074025758; -pub const BTRFS_IOC_SNAP_CREATE_V2: u32 = 1342215191; -pub const VHOST_VSOCK_SET_RUNNING: u32 = 1074048865; -pub const STP_SET_OPTIONS: u32 = 1074275586; -pub const FBIO_RADEON_GET_MIRROR: u32 = 2147762179; -pub const IVTVFB_IOC_DMA_FRAME: u32 = 1074550464; -pub const IPMICTL_SEND_COMMAND: u32 = 2148821261; -pub const VIDIOC_G_ENC_INDEX: u32 = 2283296332; -pub const DFL_FPGA_FME_PORT_PR: u32 = 46720; -pub const CHIOSVOLTAG: u32 = 1076912914; -pub const ATM_SETESIF: u32 = 1074553229; -pub const FW_CDEV_IOC_SEND_RESPONSE: u32 = 1075061508; -pub const PMU_IOC_GET_MODEL: u32 = 2147762691; -pub const JSIOCGBTNMAP: u32 = 2214619700; -pub const USBDEVFS_HUB_PORTINFO: u32 = 2155894035; -pub const VBG_IOCTL_INTERRUPT_ALL_WAIT_FOR_EVENTS: u32 = 3222820363; -pub const FDCLRPRM: u32 = 577; -pub const BTRFS_IOC_SCRUB: u32 = 3288372251; -pub const USBDEVFS_DISCONNECT: u32 = 21782; -pub const TUNSETVNETBE: u32 = 1074025694; -pub const ATMTCP_REMOVE: u32 = 24975; -pub const VHOST_VDPA_GET_CONFIG: u32 = 2148052851; -pub const PPPIOCGNPMODE: u32 = 3221779532; -pub const FDGETDRVPRM: u32 = 2153251345; -pub const TUNSETVNETLE: u32 = 1074025692; -pub const PHN_SETREG: u32 = 1074294790; -pub const PPPIOCDETACH: u32 = 1074033724; -pub const MMTIMER_GETRES: u32 = 2147773697; -pub const VIDIOC_SUBDEV_ENUMSTD: u32 = 3225441817; -pub const PPGETFLAGS: u32 = 2147774618; -pub const VDUSE_DEV_GET_FEATURES: u32 = 2148040977; -pub const CAPI_MANUFACTURER_CMD: u32 = 3221766944; -pub const VIDIOC_G_TUNER: u32 = 3226752541; -pub const DM_TABLE_STATUS: u32 = 3241737484; -pub const DM_DEV_ARM_POLL: u32 = 3241737488; -pub const NE_CREATE_VM: u32 = 2148052512; -pub const MEDIA_IOC_ENUM_LINKS: u32 = 3223092226; -pub const F2FS_IOC_PRECACHE_EXTENTS: u32 = 62735; -pub const DFL_FPGA_PORT_DMA_MAP: u32 = 46659; -pub const MGSL_IOCGXCTRL: u32 = 27926; -pub const FW_CDEV_IOC_SEND_REQUEST: u32 = 1076110081; -pub const SONYPI_IOCGBLUE: u32 = 2147579400; -pub const F2FS_IOC_DECOMPRESS_FILE: u32 = 62743; -pub const I2OHTML: u32 = 3223087369; -pub const VFIO_GET_API_VERSION: u32 = 15204; -pub const IDT77105_GETSTATZ: u32 = 1074553139; -pub const I2OPARMSET: u32 = 3222825219; -pub const TEE_IOC_CANCEL: u32 = 2148049924; -pub const PTP_SYS_OFFSET_PRECISE2: u32 = 3225435409; -pub const DFL_FPGA_PORT_RESET: u32 = 46656; -pub const PPPIOCGASYNCMAP: u32 = 2147775576; -pub const EVIOCGKEYCODE_V2: u32 = 2150122756; -pub const DM_DEV_SET_GEOMETRY: u32 = 3241737487; -pub const HIDIOCSUSAGE: u32 = 1075333132; -pub const FW_CDEV_IOC_DEALLOCATE_ISO_RESOURCE_ONCE: u32 = 1075323664; -pub const PTP_EXTTS_REQUEST: u32 = 1074806018; -pub const SWITCHTEC_IOCTL_EVENT_CTL: u32 = 3223869251; -pub const WDIOC_SETPRETIMEOUT: u32 = 3221509896; -pub const VHOST_SCSI_CLEAR_ENDPOINT: u32 = 1088991041; -pub const JSIOCGAXES: u32 = 2147576337; -pub const HIDIOCSFLAG: u32 = 1074022415; -pub const PTP_PEROUT_REQUEST2: u32 = 1077427468; -pub const PPWDATA: u32 = 1073836166; -pub const PTP_CLOCK_GETCAPS: u32 = 2152742145; -pub const FDGETMAXERRS: u32 = 2148794894; -pub const TUNSETQUEUE: u32 = 1074025689; -pub const PTP_ENABLE_PPS: u32 = 1074019588; -pub const SIOCSIFATMTCP: u32 = 24960; -pub const CEC_ADAP_G_LOG_ADDRS: u32 = 2153537795; -pub const ND_IOCTL_ARS_CAP: u32 = 3223342593; -pub const NBD_SET_BLKSIZE: u32 = 43777; -pub const NBD_SET_TIMEOUT: u32 = 43785; -pub const VHOST_SCSI_GET_ABI_VERSION: u32 = 1074048834; -pub const RIO_UNMAP_INBOUND: u32 = 1074294034; -pub const ATM_QUERYLOOP: u32 = 1074553172; -pub const DFL_FPGA_GET_API_VERSION: u32 = 46592; -pub const USBDEVFS_WAIT_FOR_RESUME: u32 = 21795; -pub const FBIO_CURSOR: u32 = 3225961992; -pub const RNDCLEARPOOL: u32 = 20998; -pub const VIDIOC_QUERYSTD: u32 = 2148030015; -pub const DMA_BUF_IOCTL_SYNC: u32 = 1074291200; -pub const SCIF_RECV: u32 = 3222565639; -pub const PTP_PIN_GETFUNC2: u32 = 3227532559; -pub const FW_CDEV_IOC_ALLOCATE: u32 = 3223331586; -pub const CEC_ADAP_G_CAPS: u32 = 3226231040; -pub const VIDIOC_G_FBUF: u32 = 2150389258; -pub const PTP_ENABLE_PPS2: u32 = 1074019597; -pub const PCITEST_CLEAR_IRQ: u32 = 20496; -pub const IPMICTL_SET_GETS_EVENTS_CMD: u32 = 2147772688; -pub const BTRFS_IOC_DEVICES_READY: u32 = 2415957031; -pub const JSIOCGAXMAP: u32 = 2151705138; -pub const FW_CDEV_IOC_GET_CYCLE_TIMER: u32 = 2148279052; -pub const FW_CDEV_IOC_SET_ISO_CHANNELS: u32 = 1074537239; -pub const RTC_WIE_OFF: u32 = 28688; -pub const PPGETMODE: u32 = 2147774616; -pub const VIDIOC_DBG_G_REGISTER: u32 = 3224917584; -pub const PTP_SYS_OFFSET: u32 = 1128283397; -pub const BTRFS_IOC_SPACE_INFO: u32 = 3222311956; -pub const VIDIOC_SUBDEV_ENUM_FRAME_SIZE: u32 = 3225441866; -pub const ND_IOCTL_VENDOR: u32 = 3221769737; -pub const SCIF_VREADFROM: u32 = 3223614220; -pub const BTRFS_IOC_TRANS_START: u32 = 37894; -pub const INOTIFY_IOC_SETNEXTWD: u32 = 1074022656; -pub const SNAPSHOT_GET_IMAGE_SIZE: u32 = 2148021006; -pub const TUNDETACHFILTER: u32 = 1074287830; -pub const ND_IOCTL_CLEAR_ERROR: u32 = 3223342596; -pub const IOC_PR_CLEAR: u32 = 1074819277; -pub const SCIF_READFROM: u32 = 3223614218; -pub const PPPIOCGDEBUG: u32 = 2147775553; -pub const BLKGETZONESZ: u32 = 2147750532; -pub const HIDIOCGUSAGES: u32 = 3491514387; -pub const SONYPI_IOCGTEMP: u32 = 2147579404; -pub const UI_SET_MSCBIT: u32 = 1074025832; -pub const APM_IOC_SUSPEND: u32 = 16642; -pub const BTRFS_IOC_TREE_SEARCH: u32 = 3489698833; -pub const RTC_PLL_GET: u32 = 2149347345; -pub const RIO_CM_EP_GET_LIST: u32 = 3221512962; -pub const USBDEVFS_DISCSIGNAL: u32 = 2148029710; -pub const LIRC_GET_MIN_TIMEOUT: u32 = 2147772680; -pub const SWITCHTEC_IOCTL_EVENT_SUMMARY_LEGACY: u32 = 2174244674; -pub const DM_TARGET_MSG: u32 = 3241737486; -pub const SONYPI_IOCGBAT1REM: u32 = 2147644931; -pub const EVIOCSFF: u32 = 1076643200; -pub const TUNSETGROUP: u32 = 1074025678; -pub const EVIOCGKEYCODE: u32 = 2148025604; -pub const KCOV_REMOTE_ENABLE: u32 = 1075340134; -pub const ND_IOCTL_GET_CONFIG_SIZE: u32 = 3222031876; -pub const FDEJECT: u32 = 602; -pub const TUNSETOFFLOAD: u32 = 1074025680; -pub const PPPIOCCONNECT: u32 = 1074033722; -pub const ATM_ADDADDR: u32 = 1074553224; -pub const VDUSE_DEV_INJECT_CONFIG_IRQ: u32 = 33043; -pub const AUTOFS_DEV_IOCTL_ASKUMOUNT: u32 = 3222836093; -pub const VHOST_VDPA_GET_STATUS: u32 = 2147594097; -pub const CCISS_PASSTHRU: u32 = 3226747403; -pub const MGSL_IOCCLRMODCOUNT: u32 = 27919; -pub const TEE_IOC_SUPPL_SEND: u32 = 2148574215; -pub const ATMARPD_CTRL: u32 = 25057; -pub const UI_ABS_SETUP: u32 = 1075598596; -pub const UI_DEV_DESTROY: u32 = 21762; -pub const BTRFS_IOC_QUOTA_CTL: u32 = 3222311976; -pub const RTC_AIE_ON: u32 = 28673; -pub const AUTOFS_IOC_EXPIRE: u32 = 2165085029; -pub const PPPIOCSDEBUG: u32 = 1074033728; -pub const GPIO_V2_LINE_SET_VALUES_IOCTL: u32 = 3222320143; -pub const PPPIOCSMRU: u32 = 1074033746; -pub const CCISS_DEREGDISK: u32 = 16908; -pub const UI_DEV_CREATE: u32 = 21761; -pub const FUSE_DEV_IOC_CLONE: u32 = 2147804416; -pub const BTRFS_IOC_START_SYNC: u32 = 2148045848; -pub const NILFS_IOCTL_DELETE_CHECKPOINT: u32 = 1074294401; -pub const SNAPSHOT_AVAIL_SWAP_SIZE: u32 = 2148021011; -pub const DM_TABLE_CLEAR: u32 = 3241737482; -pub const CCISS_GETINTINFO: u32 = 2148024834; -pub const PPPIOCSASYNCMAP: u32 = 1074033751; -pub const I2OEVTGET: u32 = 2154326283; -pub const NVME_IOCTL_RESET: u32 = 20036; -pub const PPYIELD: u32 = 28813; -pub const NVME_IOCTL_IO64_CMD: u32 = 3226488392; -pub const TUNSETCARRIER: u32 = 1074025698; -pub const DM_DEV_WAIT: u32 = 3241737480; -pub const RTC_WIE_ON: u32 = 28687; -pub const MEDIA_IOC_DEVICE_INFO: u32 = 3238034432; -pub const RIO_CM_CHAN_CREATE: u32 = 3221381891; -pub const MGSL_IOCSPARAMS: u32 = 1075866880; -pub const RTC_SET_TIME: u32 = 1076129802; -pub const VHOST_RESET_OWNER: u32 = 44802; -pub const IOC_OPAL_PSID_REVERT_TPR: u32 = 1091072232; -pub const AUTOFS_DEV_IOCTL_OPENMOUNT: u32 = 3222836084; -pub const UDF_GETEABLOCK: u32 = 2147773505; -pub const VFIO_IOMMU_MAP_DMA: u32 = 15217; -pub const VIDIOC_SUBSCRIBE_EVENT: u32 = 1075861082; -pub const HIDIOCGFLAG: u32 = 2147764238; -pub const HIDIOCGUCODE: u32 = 3222816781; -pub const VIDIOC_OMAP3ISP_AF_CFG: u32 = 3226228421; -pub const DM_REMOVE_ALL: u32 = 3241737473; -pub const ASPEED_LPC_CTRL_IOCTL_MAP: u32 = 1074835969; -pub const CCISS_GETFIRMVER: u32 = 2147762696; -pub const ND_IOCTL_ARS_START: u32 = 3223342594; -pub const PPPIOCSMRRU: u32 = 1074033723; -pub const CEC_ADAP_S_LOG_ADDRS: u32 = 3227279620; -pub const RPROC_GET_SHUTDOWN_ON_RELEASE: u32 = 2147792642; -pub const DMA_HEAP_IOCTL_ALLOC: u32 = 3222816768; -pub const PPSETTIME: u32 = 1074294934; -pub const RTC_ALM_READ: u32 = 2149871624; -pub const VDUSE_SET_API_VERSION: u32 = 1074299137; -pub const RIO_MPORT_MAINT_WRITE_REMOTE: u32 = 1075342600; -pub const VIDIOC_SUBDEV_S_CROP: u32 = 3224917564; -pub const USBDEVFS_CONNECT: u32 = 21783; -pub const SYNC_IOC_FILE_INFO: u32 = 3224911364; -pub const ATMARP_MKIP: u32 = 25058; -pub const VFIO_IOMMU_SPAPR_TCE_GET_INFO: u32 = 15216; -pub const CCISS_GETHEARTBEAT: u32 = 2147762694; -pub const ATM_RSTADDR: u32 = 1074553223; -pub const NBD_SET_SIZE: u32 = 43778; -pub const UDF_GETVOLIDENT: u32 = 2147773506; -pub const GPIO_V2_LINE_GET_VALUES_IOCTL: u32 = 3222320142; -pub const MGSL_IOCSTXIDLE: u32 = 27906; -pub const FSL_HV_IOCTL_SETPROP: u32 = 3223891720; -pub const BTRFS_IOC_GET_DEV_STATS: u32 = 3288896564; -pub const PPRSTATUS: u32 = 2147577985; -pub const MGSL_IOCTXENABLE: u32 = 27908; -pub const UDF_GETEASIZE: u32 = 2147773504; -pub const NVME_IOCTL_ADMIN64_CMD: u32 = 3226488391; -pub const VHOST_SET_OWNER: u32 = 44801; -pub const RIO_ALLOC_DMA: u32 = 3222826259; -pub const RIO_CM_CHAN_ACCEPT: u32 = 3221775111; -pub const I2OHRTGET: u32 = 3222038785; -pub const ATM_SETCIRANGE: u32 = 1074553227; -pub const HPET_IE_ON: u32 = 26625; -pub const PERF_EVENT_IOC_ID: u32 = 2147755015; -pub const TUNSETSNDBUF: u32 = 1074025684; -pub const PTP_PIN_SETFUNC: u32 = 1080048903; -pub const PPPIOCDISCONN: u32 = 29753; -pub const VIDIOC_QUERYCTRL: u32 = 3225703972; -pub const PPEXCL: u32 = 28815; -pub const PCITEST_MSI: u32 = 1074024451; -pub const FDWERRORCLR: u32 = 598; -pub const AUTOFS_IOC_FAIL: u32 = 37729; -pub const USBDEVFS_IOCTL: u32 = 3222033682; -pub const VIDIOC_S_STD: u32 = 1074288152; -pub const F2FS_IOC_RESIZE_FS: u32 = 1074328848; -pub const SONET_SETDIAG: u32 = 3221512466; -pub const BTRFS_IOC_DEFRAG: u32 = 1342215170; -pub const CCISS_GETDRIVVER: u32 = 2147762697; -pub const IPMICTL_GET_TIMING_PARMS_CMD: u32 = 2148034839; -pub const HPET_IRQFREQ: u32 = 1074030598; -pub const ATM_GETESI: u32 = 1074553221; -pub const CCISS_GETLUNINFO: u32 = 2148286993; -pub const AUTOFS_DEV_IOCTL_ISMOUNTPOINT: u32 = 3222836094; -pub const TEE_IOC_SHM_ALLOC: u32 = 3222316033; -pub const PERF_EVENT_IOC_SET_BPF: u32 = 1074013192; -pub const UDMABUF_CREATE_LIST: u32 = 1074296131; -pub const VHOST_SET_LOG_BASE: u32 = 1074310916; -pub const ZATM_GETPOOL: u32 = 1074553185; -pub const BR2684_SETFILT: u32 = 1075601808; -pub const RNDGETPOOL: u32 = 2148028930; -pub const PPS_GETPARAMS: u32 = 2147774625; -pub const IOC_PR_RESERVE: u32 = 1074819273; -pub const VIDIOC_TRY_DECODER_CMD: u32 = 3225966177; -pub const RIO_CM_CHAN_CLOSE: u32 = 1073898244; -pub const VIDIOC_DV_TIMINGS_CAP: u32 = 3230684772; -pub const IOCTL_MEI_CONNECT_CLIENT_VTAG: u32 = 3222554628; -pub const PMU_IOC_GET_BACKLIGHT: u32 = 2147762689; -pub const USBDEVFS_GET_CAPABILITIES: u32 = 2147767578; -pub const SCIF_WRITETO: u32 = 3223614219; -pub const UDF_RELOCATE_BLOCKS: u32 = 3221515331; -pub const FSL_HV_IOCTL_PARTITION_RESTART: u32 = 3221794561; -pub const CCISS_REGNEWD: u32 = 16910; -pub const FAT_IOCTL_SET_ATTRIBUTES: u32 = 1074033169; -pub const VIDIOC_CREATE_BUFS: u32 = 3237500508; -pub const CAPI_GET_VERSION: u32 = 3222291207; -pub const SWITCHTEC_IOCTL_EVENT_SUMMARY: u32 = 2228508482; -pub const VFIO_EEH_PE_OP: u32 = 15225; -pub const FW_CDEV_IOC_CREATE_ISO_CONTEXT: u32 = 3223069448; -pub const F2FS_IOC_RELEASE_COMPRESS_BLOCKS: u32 = 2148070674; -pub const NBD_SET_SIZE_BLOCKS: u32 = 43783; -pub const IPMI_BMC_IOCTL_SET_SMS_ATN: u32 = 45312; -pub const ASPEED_P2A_CTRL_IOCTL_GET_MEMORY_CONFIG: u32 = 3222319873; -pub const VIDIOC_S_AUDOUT: u32 = 1077171762; -pub const VIDIOC_S_FMT: u32 = 3234616837; -pub const PPPIOCATTACH: u32 = 1074033725; -pub const VHOST_GET_VRING_BUSYLOOP_TIMEOUT: u32 = 1074310948; -pub const FS_IOC_MEASURE_VERITY: u32 = 3221513862; -pub const CCISS_BIG_PASSTHRU: u32 = 3227009554; -pub const IPMICTL_SET_MY_LUN_CMD: u32 = 2147772691; -pub const PCITEST_LEGACY_IRQ: u32 = 20482; -pub const USBDEVFS_SUBMITURB: u32 = 2150389002; -pub const AUTOFS_IOC_READY: u32 = 37728; -pub const BTRFS_IOC_SEND: u32 = 1078236198; -pub const VIDIOC_G_EXT_CTRLS: u32 = 3222820423; -pub const JSIOCSBTNMAP: u32 = 1140877875; -pub const PPPIOCSFLAGS: u32 = 1074033753; -pub const NVRAM_INIT: u32 = 28736; -pub const RFKILL_IOCTL_NOINPUT: u32 = 20993; -pub const BTRFS_IOC_BALANCE: u32 = 1342215180; -pub const FS_IOC_GETFSMAP: u32 = 3233830971; -pub const IPMICTL_GET_MY_CHANNEL_LUN_CMD: u32 = 2147772699; -pub const STP_POLICY_ID_GET: u32 = 2148541697; -pub const PPSETFLAGS: u32 = 1074032795; -pub const CEC_ADAP_S_PHYS_ADDR: u32 = 1073897730; -pub const ATMTCP_CREATE: u32 = 24974; -pub const IPMI_BMC_IOCTL_FORCE_ABORT: u32 = 45314; -pub const PPPIOCGXASYNCMAP: u32 = 2149610576; -pub const VHOST_SET_VRING_CALL: u32 = 1074310945; -pub const LIRC_GET_FEATURES: u32 = 2147772672; -pub const GSMIOC_DISABLE_NET: u32 = 18179; -pub const AUTOFS_IOC_CATATONIC: u32 = 37730; -pub const NBD_DO_IT: u32 = 43779; -pub const LIRC_SET_REC_CARRIER_RANGE: u32 = 1074030879; -pub const IPMICTL_GET_MY_CHANNEL_ADDRESS_CMD: u32 = 2147772697; -pub const EVIOCSCLOCKID: u32 = 1074021792; -pub const USBDEVFS_FREE_STREAMS: u32 = 2148029725; -pub const FSI_SCOM_RESET: u32 = 1074033411; -pub const PMU_IOC_GRAB_BACKLIGHT: u32 = 2147762694; -pub const VIDIOC_SUBDEV_S_FMT: u32 = 3227014661; -pub const FDDEFPRM: u32 = 1075577411; -pub const TEE_IOC_INVOKE: u32 = 2148574211; -pub const USBDEVFS_BULK: u32 = 3222295810; -pub const SCIF_VWRITETO: u32 = 3223614221; -pub const SONYPI_IOCSBRT: u32 = 1073837568; -pub const BTRFS_IOC_FILE_EXTENT_SAME: u32 = 3222836278; -pub const RTC_PIE_ON: u32 = 28677; -pub const BTRFS_IOC_SCAN_DEV: u32 = 1342215172; -pub const PPPIOCXFERUNIT: u32 = 29774; -pub const WDIOC_GETTIMEOUT: u32 = 2147768071; -pub const BTRFS_IOC_SET_RECEIVED_SUBVOL: u32 = 3233846309; -pub const DFL_FPGA_PORT_ERR_SET_IRQ: u32 = 1074312774; -pub const FBIO_WAITFORVSYNC: u32 = 1074021920; -pub const RTC_PIE_OFF: u32 = 28678; -pub const EVIOCGRAB: u32 = 1074021776; -pub const PMU_IOC_SET_BACKLIGHT: u32 = 1074020866; -pub const EVIOCGREP: u32 = 2148025603; -pub const PERF_EVENT_IOC_MODIFY_ATTRIBUTES: u32 = 1074013195; -pub const UFFDIO_CONTINUE: u32 = 3223366151; -pub const VDUSE_GET_API_VERSION: u32 = 2148040960; -pub const RTC_RD_TIME: u32 = 2149871625; -pub const FDMSGOFF: u32 = 582; -pub const IPMICTL_REGISTER_FOR_CMD_CHANS: u32 = 2148296988; -pub const CAPI_GET_ERRCODE: u32 = 2147631905; -pub const PCITEST_SET_IRQTYPE: u32 = 1074024456; -pub const VIDIOC_SUBDEV_S_EDID: u32 = 3223606825; -pub const MATROXFB_SET_OUTPUT_MODE: u32 = 1074032378; -pub const RIO_DEV_ADD: u32 = 1075866903; -pub const VIDIOC_ENUM_FREQ_BANDS: u32 = 3225441893; -pub const FBIO_RADEON_SET_MIRROR: u32 = 1074020356; -pub const PCITEST_GET_IRQTYPE: u32 = 20489; -pub const JSIOCGVERSION: u32 = 2147772929; -pub const SONYPI_IOCSBLUE: u32 = 1073837577; -pub const SNAPSHOT_PREF_IMAGE_SIZE: u32 = 13074; -pub const F2FS_IOC_GET_FEATURES: u32 = 2147808524; -pub const SCIF_REG: u32 = 3223876360; -pub const NILFS_IOCTL_CLEAN_SEGMENTS: u32 = 1081634440; -pub const FW_CDEV_IOC_INITIATE_BUS_RESET: u32 = 1074012933; -pub const RIO_WAIT_FOR_ASYNC: u32 = 1074294038; -pub const VHOST_SET_VRING_NUM: u32 = 1074310928; -pub const AUTOFS_DEV_IOCTL_PROTOVER: u32 = 3222836082; -pub const RIO_FREE_DMA: u32 = 1074294036; -pub const MGSL_IOCRXENABLE: u32 = 27909; -pub const IOCTL_VM_SOCKETS_GET_LOCAL_CID: u32 = 1977; -pub const IPMICTL_SET_TIMING_PARMS_CMD: u32 = 2148034838; -pub const PPPIOCGL2TPSTATS: u32 = 2152231990; -pub const PERF_EVENT_IOC_PERIOD: u32 = 1074275332; -pub const PTP_PIN_SETFUNC2: u32 = 1080048912; -pub const CHIOEXCHANGE: u32 = 1075602178; -pub const NILFS_IOCTL_GET_SUINFO: u32 = 2149084804; -pub const CEC_DQEVENT: u32 = 3226493191; -pub const UI_SET_SWBIT: u32 = 1074025837; -pub const VHOST_VDPA_SET_CONFIG: u32 = 1074311028; -pub const TUNSETIFF: u32 = 1074025674; -pub const CHIOPOSITION: u32 = 1074553603; -pub const IPMICTL_SET_MAINTENANCE_MODE_CMD: u32 = 1074030879; -pub const BTRFS_IOC_DEFAULT_SUBVOL: u32 = 1074304019; -pub const RIO_UNMAP_OUTBOUND: u32 = 1076391184; -pub const CAPI_CLR_FLAGS: u32 = 2147762981; -pub const FW_CDEV_IOC_ALLOCATE_ISO_RESOURCE_ONCE: u32 = 1075323663; -pub const MATROXFB_GET_OUTPUT_CONNECTION: u32 = 2147774200; -pub const EVIOCSMASK: u32 = 1074808211; -pub const BTRFS_IOC_FORGET_DEV: u32 = 1342215173; -pub const CXL_MEM_QUERY_COMMANDS: u32 = 2148060673; -pub const CEC_S_MODE: u32 = 1074028809; -pub const MGSL_IOCSIF: u32 = 27914; -pub const SWITCHTEC_IOCTL_PFF_TO_PORT: u32 = 3222034244; -pub const PPSETMODE: u32 = 1074032768; -pub const VFIO_DEVICE_SET_IRQS: u32 = 15214; -pub const VIDIOC_PREPARE_BUF: u32 = 3225704029; -pub const CEC_ADAP_G_CONNECTOR_INFO: u32 = 2151964938; -pub const IOC_OPAL_WRITE_SHADOW_MBR: u32 = 1092645098; -pub const VIDIOC_SUBDEV_ENUM_FRAME_INTERVAL: u32 = 3225441867; -pub const UDMABUF_CREATE: u32 = 1075344706; -pub const SONET_CLRDIAG: u32 = 3221512467; -pub const PHN_SET_REG: u32 = 1074032641; -pub const RNDADDTOENTCNT: u32 = 1074024961; -pub const VBG_IOCTL_CHECK_BALLOON: u32 = 3223344657; -pub const VIDIOC_OMAP3ISP_STAT_REQ: u32 = 3222820550; -pub const PPS_FETCH: u32 = 3221516452; -pub const RTC_AIE_OFF: u32 = 28674; -pub const VFIO_GROUP_SET_CONTAINER: u32 = 15208; -pub const FW_CDEV_IOC_RECEIVE_PHY_PACKETS: u32 = 1074275094; -pub const VFIO_IOMMU_SPAPR_TCE_REMOVE: u32 = 15224; -pub const VFIO_IOMMU_GET_INFO: u32 = 15216; -pub const DM_DEV_SUSPEND: u32 = 3241737478; -pub const F2FS_IOC_GET_COMPRESS_OPTION: u32 = 2147677461; -pub const FW_CDEV_IOC_STOP_ISO: u32 = 1074012939; -pub const GPIO_V2_GET_LINEINFO_IOCTL: u32 = 3238048773; -pub const ATMMPC_CTRL: u32 = 25048; -pub const PPPIOCSXASYNCMAP: u32 = 1075868751; -pub const CHIOGSTATUS: u32 = 1074291464; -pub const FW_CDEV_IOC_ALLOCATE_ISO_RESOURCE: u32 = 3222807309; -pub const RIO_MPORT_MAINT_PORT_IDX_GET: u32 = 2147773699; -pub const CAPI_SET_FLAGS: u32 = 2147762980; -pub const VFIO_GROUP_GET_DEVICE_FD: u32 = 15210; -pub const VHOST_SET_MEM_TABLE: u32 = 1074310915; -pub const MATROXFB_SET_OUTPUT_CONNECTION: u32 = 1074032376; -pub const DFL_FPGA_PORT_GET_REGION_INFO: u32 = 46658; -pub const VHOST_GET_FEATURES: u32 = 2148052736; -pub const LIRC_GET_REC_RESOLUTION: u32 = 2147772679; -pub const PACKET_CTRL_CMD: u32 = 3222820865; -pub const LIRC_SET_TRANSMITTER_MASK: u32 = 1074030871; -pub const BTRFS_IOC_ADD_DEV: u32 = 1342215178; -pub const JSIOCGCORR: u32 = 2149870114; -pub const VIDIOC_G_FMT: u32 = 3234616836; -pub const RTC_EPOCH_SET: u32 = 1074032654; -pub const CAPI_GET_PROFILE: u32 = 3225436937; -pub const ATM_GETLOOP: u32 = 1074553170; -pub const SCIF_LISTEN: u32 = 1074033410; -pub const NBD_CLEAR_QUE: u32 = 43781; -pub const F2FS_IOC_MOVE_RANGE: u32 = 3223123209; -pub const LIRC_GET_LENGTH: u32 = 2147772687; -pub const I8K_SET_FAN: u32 = 3221514631; -pub const FDSETMAXERRS: u32 = 1075053132; -pub const VIDIOC_SUBDEV_QUERYCAP: u32 = 2151699968; -pub const SNAPSHOT_SET_SWAP_AREA: u32 = 1074541325; -pub const LIRC_GET_REC_TIMEOUT: u32 = 2147772708; -pub const EVIOCRMFF: u32 = 1074021761; -pub const GPIO_GET_LINEEVENT_IOCTL: u32 = 3224417284; -pub const PPRDATA: u32 = 2147577989; -pub const RIO_MPORT_GET_PROPERTIES: u32 = 2150657284; -pub const TUNSETVNETHDRSZ: u32 = 1074025688; -pub const GPIO_GET_LINEINFO_IOCTL: u32 = 3225990146; -pub const GSMIOC_GETCONF: u32 = 2152482560; -pub const LIRC_GET_SEND_MODE: u32 = 2147772673; -pub const PPPIOCSACTIVE: u32 = 1074295878; -pub const SIOCGSTAMPNS_NEW: u32 = 2148567303; -pub const IPMICTL_RECEIVE_MSG: u32 = 3222825228; -pub const LIRC_SET_SEND_DUTY_CYCLE: u32 = 1074030869; -pub const UI_END_FF_ERASE: u32 = 1074550219; -pub const SWITCHTEC_IOCTL_FLASH_PART_INFO: u32 = 3222296385; -pub const FW_CDEV_IOC_SEND_PHY_PACKET: u32 = 3222545173; -pub const NBD_SET_FLAGS: u32 = 43786; -pub const VFIO_DEVICE_GET_REGION_INFO: u32 = 15212; -pub const REISERFS_IOC_UNPACK: u32 = 1074056449; -pub const FW_CDEV_IOC_REMOVE_DESCRIPTOR: u32 = 1074012935; -pub const RIO_SET_EVENT_MASK: u32 = 1074031885; -pub const SNAPSHOT_ALLOC_SWAP_PAGE: u32 = 2148021012; -pub const VDUSE_VQ_INJECT_IRQ: u32 = 1074037015; -pub const I2OPASSTHRU: u32 = 2148034828; -pub const IOC_OPAL_SET_PW: u32 = 1109422304; -pub const FSI_SCOM_READ: u32 = 3223352065; -pub const VHOST_VDPA_GET_DEVICE_ID: u32 = 2147790704; -pub const VIDIOC_QBUF: u32 = 3225703951; -pub const VIDIOC_S_TUNER: u32 = 1079268894; -pub const TUNGETVNETHDRSZ: u32 = 2147767511; -pub const CAPI_NCCI_GETUNIT: u32 = 2147762983; -pub const DFL_FPGA_PORT_UINT_GET_IRQ_NUM: u32 = 2147792455; -pub const VIDIOC_OMAP3ISP_STAT_EN: u32 = 3221509831; -pub const GPIO_V2_LINE_SET_CONFIG_IOCTL: u32 = 3239097357; -pub const TEE_IOC_VERSION: u32 = 2148312064; -pub const VIDIOC_LOG_STATUS: u32 = 22086; -pub const IPMICTL_SEND_COMMAND_SETTIME: u32 = 2149345557; -pub const VHOST_SET_LOG_FD: u32 = 1074048775; -pub const SCIF_SEND: u32 = 3222565638; -pub const VIDIOC_SUBDEV_G_FMT: u32 = 3227014660; -pub const NS_ADJBUFLEV: u32 = 24931; -pub const VIDIOC_DBG_S_REGISTER: u32 = 1077433935; -pub const NILFS_IOCTL_RESIZE: u32 = 1074294411; -pub const PHN_GETREG: u32 = 3221778437; -pub const I2OSWDL: u32 = 3223087365; -pub const VBG_IOCTL_VMMDEV_REQUEST_BIG: u32 = 22019; -pub const JSIOCGBUTTONS: u32 = 2147576338; -pub const VFIO_IOMMU_ENABLE: u32 = 15219; -pub const DM_DEV_RENAME: u32 = 3241737477; -pub const MEDIA_IOC_SETUP_LINK: u32 = 3224665091; -pub const VIDIOC_ENUMOUTPUT: u32 = 3225966128; -pub const STP_POLICY_ID_SET: u32 = 3222283520; -pub const VHOST_VDPA_SET_CONFIG_CALL: u32 = 1074048887; -pub const VIDIOC_SUBDEV_G_CROP: u32 = 3224917563; -pub const VIDIOC_S_CROP: u32 = 1075074620; -pub const WDIOC_GETTEMP: u32 = 2147768067; -pub const IOC_OPAL_ADD_USR_TO_LR: u32 = 1092120804; -pub const UI_SET_LEDBIT: u32 = 1074025833; -pub const NBD_SET_SOCK: u32 = 43776; -pub const BTRFS_IOC_SNAP_DESTROY_V2: u32 = 1342215231; -pub const HIDIOCGCOLLECTIONINFO: u32 = 3222292497; -pub const I2OSWUL: u32 = 3223087366; -pub const IOCTL_MEI_NOTIFY_GET: u32 = 2147764227; -pub const FDFMTTRK: u32 = 1074528840; -pub const MMTIMER_GETBITS: u32 = 27908; -pub const VIDIOC_ENUMSTD: u32 = 3225441817; -pub const VHOST_GET_VRING_BASE: u32 = 3221794578; -pub const VFIO_DEVICE_IOEVENTFD: u32 = 15220; -pub const ATMARP_SETENTRY: u32 = 25059; -pub const CCISS_REVALIDVOLS: u32 = 16906; -pub const MGSL_IOCLOOPTXDONE: u32 = 27913; -pub const RTC_VL_READ: u32 = 2147774483; -pub const ND_IOCTL_ARS_STATUS: u32 = 3224391171; -pub const RIO_DEV_DEL: u32 = 1075866904; -pub const VBG_IOCTL_ACQUIRE_GUEST_CAPABILITIES: u32 = 3223606797; -pub const VIDIOC_SUBDEV_DV_TIMINGS_CAP: u32 = 3230684772; -pub const SONYPI_IOCSFAN: u32 = 1073837579; -pub const SPIOCSTYPE: u32 = 1074032897; -pub const IPMICTL_REGISTER_FOR_CMD: u32 = 2147641614; -pub const I8K_GET_FAN: u32 = 3221514630; -pub const TUNGETVNETBE: u32 = 2147767519; -pub const AUTOFS_DEV_IOCTL_FAIL: u32 = 3222836087; -pub const UI_END_FF_UPLOAD: u32 = 1080055241; -pub const TOSH_SMM: u32 = 3222828176; -pub const SONYPI_IOCGBAT2REM: u32 = 2147644933; -pub const F2FS_IOC_GET_COMPRESS_BLOCKS: u32 = 2148070673; -pub const PPPIOCSNPMODE: u32 = 1074295883; -pub const USBDEVFS_CONTROL: u32 = 3222295808; -pub const HIDIOCGUSAGE: u32 = 3222816779; -pub const TUNSETTXFILTER: u32 = 1074025681; -pub const TUNGETVNETLE: u32 = 2147767517; -pub const VIDIOC_ENUM_DV_TIMINGS: u32 = 3230946914; -pub const BTRFS_IOC_INO_PATHS: u32 = 3224933411; -pub const MGSL_IOCGXSYNC: u32 = 27924; -pub const HIDIOCGFIELDINFO: u32 = 3224913930; -pub const VIDIOC_SUBDEV_G_STD: u32 = 2148029975; -pub const I2OVALIDATE: u32 = 2147772680; -pub const VIDIOC_TRY_ENCODER_CMD: u32 = 3223869006; -pub const NILFS_IOCTL_GET_CPINFO: u32 = 2149084802; -pub const VIDIOC_G_FREQUENCY: u32 = 3224131128; -pub const VFAT_IOCTL_READDIR_SHORT: u32 = 2182640130; -pub const ND_IOCTL_GET_CONFIG_DATA: u32 = 3222031877; -pub const F2FS_IOC_RESERVE_COMPRESS_BLOCKS: u32 = 2148070675; -pub const FDGETDRVSTAT: u32 = 2150892050; -pub const SYNC_IOC_MERGE: u32 = 3224387075; -pub const VIDIOC_S_DV_TIMINGS: u32 = 3229898327; -pub const PPPIOCBRIDGECHAN: u32 = 1074033717; -pub const LIRC_SET_SEND_MODE: u32 = 1074030865; -pub const RIO_ENABLE_PORTWRITE_RANGE: u32 = 1074818315; -pub const ATM_GETTYPE: u32 = 1074553220; -pub const PHN_GETREGS: u32 = 3223875591; -pub const FDSETEMSGTRESH: u32 = 586; -pub const NILFS_IOCTL_GET_VINFO: u32 = 3222826630; -pub const MGSL_IOCWAITEVENT: u32 = 3221515528; -pub const CAPI_INSTALLED: u32 = 2147631906; -pub const EVIOCGMASK: u32 = 2148550034; -pub const BTRFS_IOC_SUBVOL_GETFLAGS: u32 = 2148045849; -pub const FSL_HV_IOCTL_PARTITION_GET_STATUS: u32 = 3222056706; -pub const MEDIA_IOC_ENUM_ENTITIES: u32 = 3238034433; -pub const GSMIOC_GETFIRST: u32 = 2147763972; -pub const FW_CDEV_IOC_FLUSH_ISO: u32 = 1074012952; -pub const VIDIOC_DBG_G_CHIP_INFO: u32 = 3234354790; -pub const F2FS_IOC_RELEASE_VOLATILE_WRITE: u32 = 62724; -pub const CAPI_GET_SERIAL: u32 = 3221504776; -pub const FDSETDRVPRM: u32 = 1079509648; -pub const IOC_OPAL_SAVE: u32 = 1092120796; -pub const VIDIOC_G_DV_TIMINGS: u32 = 3229898328; -pub const TUNSETIFINDEX: u32 = 1074025690; -pub const CCISS_SETINTINFO: u32 = 1074283011; -pub const CM_IOSDBGLVL: u32 = 1074029562; -pub const RTC_VL_CLR: u32 = 28692; -pub const VIDIOC_REQBUFS: u32 = 3222558216; -pub const USBDEVFS_REAPURBNDELAY32: u32 = 1074025741; -pub const TEE_IOC_SHM_REGISTER: u32 = 3222840329; -pub const USBDEVFS_SETCONFIGURATION: u32 = 2147767557; -pub const CCISS_GETNODENAME: u32 = 2148549124; -pub const VIDIOC_SUBDEV_S_FRAME_INTERVAL: u32 = 3224393238; -pub const VIDIOC_ENUM_FRAMESIZES: u32 = 3224131146; -pub const VFIO_DEVICE_PCI_HOT_RESET: u32 = 15217; -pub const FW_CDEV_IOC_SEND_BROADCAST_REQUEST: u32 = 1076110098; -pub const LPSETTIMEOUT_NEW: u32 = 1074791951; -pub const RIO_CM_MPORT_GET_LIST: u32 = 3221512971; -pub const FW_CDEV_IOC_QUEUE_ISO: u32 = 3222807305; -pub const FDRAWCMD: u32 = 600; -pub const SCIF_UNREG: u32 = 3222303497; -pub const PPPIOCGIDLE64: u32 = 2148561983; -pub const USBDEVFS_RELEASEINTERFACE: u32 = 2147767568; -pub const VIDIOC_CROPCAP: u32 = 3224131130; -pub const DFL_FPGA_PORT_GET_INFO: u32 = 46657; -pub const PHN_SET_REGS: u32 = 1074032643; -pub const ATMLEC_DATA: u32 = 25041; -pub const PPPOEIOCDFWD: u32 = 45313; -pub const VIDIOC_S_SELECTION: u32 = 3225441887; -pub const SNAPSHOT_FREE_SWAP_PAGES: u32 = 13065; -pub const BTRFS_IOC_LOGICAL_INO: u32 = 3224933412; -pub const VIDIOC_S_CTRL: u32 = 3221771804; -pub const ZATM_SETPOOL: u32 = 1074553187; -pub const MTIOCPOS: u32 = 2147773699; -pub const PMU_IOC_SLEEP: u32 = 16896; -pub const AUTOFS_DEV_IOCTL_PROTOSUBVER: u32 = 3222836083; -pub const VBG_IOCTL_CHANGE_FILTER_MASK: u32 = 3223344652; -pub const NILFS_IOCTL_GET_SUSTAT: u32 = 2150657669; -pub const VIDIOC_QUERYCAP: u32 = 2154321408; -pub const HPET_INFO: u32 = 2148296707; -pub const VIDIOC_AM437X_CCDC_CFG: u32 = 1074026177; -pub const DM_LIST_DEVICES: u32 = 3241737474; -pub const TUNSETOWNER: u32 = 1074025676; -pub const VBG_IOCTL_CHANGE_GUEST_CAPABILITIES: u32 = 3223344654; -pub const RNDADDENTROPY: u32 = 1074287107; -pub const USBDEVFS_RESET: u32 = 21780; -pub const BTRFS_IOC_SUBVOL_CREATE: u32 = 1342215182; -pub const USBDEVFS_FORBID_SUSPEND: u32 = 21793; -pub const FDGETDRVTYP: u32 = 2148532751; -pub const PPWCONTROL: u32 = 1073836164; -pub const VIDIOC_ENUM_FRAMEINTERVALS: u32 = 3224655435; -pub const KCOV_DISABLE: u32 = 25445; -pub const IOC_OPAL_ACTIVATE_LSP: u32 = 1092120799; -pub const VHOST_VDPA_GET_IOVA_RANGE: u32 = 2148577144; -pub const PPPIOCSPASS: u32 = 1074295879; -pub const RIO_CM_CHAN_CONNECT: u32 = 1074291464; -pub const I2OSWDEL: u32 = 3223087367; -pub const FS_IOC_SET_ENCRYPTION_POLICY: u32 = 2148296211; -pub const IOC_OPAL_MBR_DONE: u32 = 1091596521; -pub const PPPIOCSMAXCID: u32 = 1074033745; -pub const PPSETPHASE: u32 = 1074032788; -pub const VHOST_VDPA_SET_VRING_ENABLE: u32 = 1074311029; -pub const USBDEVFS_GET_SPEED: u32 = 21791; -pub const SONET_GETFRAMING: u32 = 2147770646; -pub const VIDIOC_QUERYBUF: u32 = 3225703945; -pub const VIDIOC_S_EDID: u32 = 3223606825; -pub const BTRFS_IOC_QGROUP_ASSIGN: u32 = 1075352617; -pub const PPS_GETCAP: u32 = 2147774627; -pub const SNAPSHOT_PLATFORM_SUPPORT: u32 = 13071; -pub const LIRC_SET_REC_TIMEOUT_REPORTS: u32 = 1074030873; -pub const SCIF_GET_NODEIDS: u32 = 3222565646; -pub const NBD_DISCONNECT: u32 = 43784; -pub const VIDIOC_SUBDEV_G_FRAME_INTERVAL: u32 = 3224393237; -pub const VFIO_IOMMU_DISABLE: u32 = 15220; -pub const SNAPSHOT_CREATE_IMAGE: u32 = 1074017041; -pub const SNAPSHOT_POWER_OFF: u32 = 13072; -pub const APM_IOC_STANDBY: u32 = 16641; -pub const PPPIOCGUNIT: u32 = 2147775574; -pub const AUTOFS_IOC_EXPIRE_MULTI: u32 = 1074041702; -pub const SCIF_BIND: u32 = 3221779201; -pub const IOC_WATCH_QUEUE_SET_SIZE: u32 = 22368; -pub const NILFS_IOCTL_CHANGE_CPMODE: u32 = 1074818688; -pub const IOC_OPAL_LOCK_UNLOCK: u32 = 1092120797; -pub const F2FS_IOC_SET_PIN_FILE: u32 = 1074066701; -pub const PPPIOCGRASYNCMAP: u32 = 2147775573; -pub const MMTIMER_MMAPAVAIL: u32 = 27910; -pub const I2OPASSTHRU32: u32 = 2148034828; -pub const DFL_FPGA_FME_PORT_RELEASE: u32 = 1074050689; -pub const VIDIOC_SUBDEV_QUERY_DV_TIMINGS: u32 = 2156156515; -pub const UI_SET_SNDBIT: u32 = 1074025834; -pub const VIDIOC_G_AUDOUT: u32 = 2150913585; -pub const RTC_PLL_SET: u32 = 1075605522; -pub const VIDIOC_ENUMAUDIO: u32 = 3224655425; -pub const AUTOFS_DEV_IOCTL_TIMEOUT: u32 = 3222836090; -pub const VBG_IOCTL_DRIVER_VERSION_INFO: u32 = 3224131072; -pub const VHOST_SCSI_GET_EVENTS_MISSED: u32 = 1074048836; -pub const VHOST_SET_VRING_ADDR: u32 = 1076408081; -pub const VDUSE_CREATE_DEV: u32 = 1095794946; -pub const FDFLUSH: u32 = 587; -pub const VBG_IOCTL_WAIT_FOR_EVENTS: u32 = 3223344650; -pub const DFL_FPGA_FME_ERR_SET_IRQ: u32 = 1074312836; -pub const F2FS_IOC_GET_PIN_FILE: u32 = 2147808526; -pub const SCIF_CONNECT: u32 = 3221779203; -pub const BLKREPORTZONE: u32 = 3222278786; -pub const AUTOFS_IOC_ASKUMOUNT: u32 = 2147783536; -pub const ATM_ADDPARTY: u32 = 1074291188; -pub const FDSETPRM: u32 = 1075577410; -pub const ATM_GETSTATZ: u32 = 1074553169; -pub const ISST_IF_MSR_COMMAND: u32 = 3221552644; -pub const BTRFS_IOC_GET_SUBVOL_INFO: u32 = 2179503164; -pub const VIDIOC_UNSUBSCRIBE_EVENT: u32 = 1075861083; -pub const SEV_ISSUE_CMD: u32 = 3222295296; -pub const GPIOHANDLE_SET_LINE_VALUES_IOCTL: u32 = 3225465865; -pub const PCITEST_COPY: u32 = 1074024454; -pub const IPMICTL_GET_MY_ADDRESS_CMD: u32 = 2147772690; -pub const CHIOGPICKER: u32 = 2147771140; -pub const CAPI_NCCI_OPENCOUNT: u32 = 2147762982; -pub const CXL_MEM_SEND_COMMAND: u32 = 3224423938; -pub const PERF_EVENT_IOC_SET_FILTER: u32 = 1074013190; -pub const IOC_OPAL_REVERT_TPR: u32 = 1091072226; -pub const CHIOGVPARAMS: u32 = 2154849043; -pub const PTP_PEROUT_REQUEST: u32 = 1077427459; -pub const FSI_SCOM_CHECK: u32 = 2147775232; -pub const RTC_IRQP_READ: u32 = 2147774475; -pub const RIO_MPORT_MAINT_READ_LOCAL: u32 = 2149084421; -pub const HIDIOCGRDESCSIZE: u32 = 2147764225; -pub const UI_GET_VERSION: u32 = 2147767597; -pub const NILFS_IOCTL_GET_CPSTAT: u32 = 2149084803; -pub const CCISS_GETBUSTYPES: u32 = 2147762695; -pub const VFIO_IOMMU_SPAPR_TCE_CREATE: u32 = 15223; -pub const VIDIOC_EXPBUF: u32 = 3225441808; -pub const UI_SET_RELBIT: u32 = 1074025830; -pub const VFIO_SET_IOMMU: u32 = 15206; -pub const VIDIOC_S_MODULATOR: u32 = 1078220343; -pub const TUNGETFILTER: u32 = 2148029659; -pub const MEYEIOC_SYNC: u32 = 3221518019; -pub const CCISS_SETNODENAME: u32 = 1074807301; -pub const FBIO_GETCONTROL2: u32 = 2147763849; -pub const TUNSETDEBUG: u32 = 1074025673; -pub const DM_DEV_REMOVE: u32 = 3241737476; -pub const HIDIOCSUSAGES: u32 = 1344030740; -pub const FS_IOC_ADD_ENCRYPTION_KEY: u32 = 3226494487; -pub const FBIOGET_VBLANK: u32 = 2149598738; -pub const ATM_GETSTAT: u32 = 1074553168; -pub const VIDIOC_G_JPEGCOMP: u32 = 2156680765; -pub const TUNATTACHFILTER: u32 = 1074287829; -pub const UI_SET_ABSBIT: u32 = 1074025831; -pub const DFL_FPGA_PORT_ERR_GET_IRQ_NUM: u32 = 2147792453; -pub const USBDEVFS_REAPURB32: u32 = 1074025740; -pub const BTRFS_IOC_TRANS_END: u32 = 37895; -pub const CAPI_REGISTER: u32 = 1074545409; -pub const F2FS_IOC_COMPRESS_FILE: u32 = 62744; -pub const USBDEVFS_DISCARDURB: u32 = 21771; -pub const HE_GET_REG: u32 = 1074553184; -pub const ATM_SETLOOP: u32 = 1074553171; -pub const ATMSIGD_CTRL: u32 = 25072; -pub const CIOC_KERNEL_VERSION: u32 = 3221512970; -pub const BTRFS_IOC_CLONE_RANGE: u32 = 1075876877; -pub const SNAPSHOT_UNFREEZE: u32 = 13058; -pub const F2FS_IOC_START_VOLATILE_WRITE: u32 = 62723; -pub const PMU_IOC_HAS_ADB: u32 = 2147762692; -pub const I2OGETIOPS: u32 = 2149607680; -pub const VIDIOC_S_FBUF: u32 = 1076647435; -pub const PPRCONTROL: u32 = 2147577987; -pub const CHIOSPICKER: u32 = 1074029317; -pub const VFIO_IOMMU_SPAPR_REGISTER_MEMORY: u32 = 15221; -pub const TUNGETSNDBUF: u32 = 2147767507; -pub const GSMIOC_SETCONF: u32 = 1078740737; -pub const IOC_PR_PREEMPT: u32 = 1075343563; -pub const KCOV_INIT_TRACE: u32 = 2147771137; -pub const SONYPI_IOCGBAT1CAP: u32 = 2147644930; -pub const SWITCHTEC_IOCTL_FLASH_INFO: u32 = 2148554560; -pub const MTIOCTOP: u32 = 1074294017; -pub const VHOST_VDPA_SET_STATUS: u32 = 1073852274; -pub const VHOST_SCSI_SET_EVENTS_MISSED: u32 = 1074048835; -pub const VFIO_IOMMU_DIRTY_PAGES: u32 = 15221; -pub const BTRFS_IOC_SCRUB_PROGRESS: u32 = 3288372253; -pub const PPPIOCGMRU: u32 = 2147775571; -pub const BTRFS_IOC_DEV_REPLACE: u32 = 3391394869; -pub const PPPIOCGFLAGS: u32 = 2147775578; -pub const NILFS_IOCTL_SET_SUINFO: u32 = 1075342989; -pub const FW_CDEV_IOC_GET_CYCLE_TIMER2: u32 = 3222545172; -pub const ATM_DELLECSADDR: u32 = 1074553231; -pub const FW_CDEV_IOC_GET_SPEED: u32 = 8977; -pub const PPPIOCGIDLE32: u32 = 2148037695; -pub const VFIO_DEVICE_RESET: u32 = 15215; -pub const GPIO_GET_LINEINFO_UNWATCH_IOCTL: u32 = 3221533708; -pub const WDIOC_GETSTATUS: u32 = 2147768065; -pub const BTRFS_IOC_SET_FEATURES: u32 = 1076925497; -pub const IOCTL_MEI_CONNECT_CLIENT: u32 = 3222292481; -pub const VIDIOC_OMAP3ISP_AEWB_CFG: u32 = 3223344835; -pub const PCITEST_READ: u32 = 1074024453; -pub const VFIO_GROUP_GET_STATUS: u32 = 15207; -pub const MATROXFB_GET_ALL_OUTPUTS: u32 = 2147774203; -pub const USBDEVFS_CLEAR_HALT: u32 = 2147767573; -pub const VIDIOC_DECODER_CMD: u32 = 3225966176; -pub const VIDIOC_G_AUDIO: u32 = 2150913569; -pub const CCISS_RESCANDISK: u32 = 16912; -pub const RIO_DISABLE_PORTWRITE_RANGE: u32 = 1074818316; -pub const IOC_OPAL_SECURE_ERASE_LR: u32 = 1091596519; -pub const USBDEVFS_REAPURB: u32 = 1074025740; -pub const DFL_FPGA_CHECK_EXTENSION: u32 = 46593; -pub const AUTOFS_IOC_PROTOVER: u32 = 2147783523; -pub const FSL_HV_IOCTL_MEMCPY: u32 = 3223891717; -pub const BTRFS_IOC_GET_FEATURES: u32 = 2149094457; -pub const PCITEST_MSIX: u32 = 1074024455; -pub const BTRFS_IOC_DEFRAG_RANGE: u32 = 1076925456; -pub const UI_BEGIN_FF_ERASE: u32 = 3222033866; -pub const DM_GET_TARGET_VERSION: u32 = 3241737489; -pub const PPPIOCGIDLE: u32 = 2148037695; -pub const NVRAM_SETCKS: u32 = 28737; -pub const WDIOC_GETSUPPORT: u32 = 2150127360; -pub const GSMIOC_ENABLE_NET: u32 = 1077167874; -pub const GPIO_GET_CHIPINFO_IOCTL: u32 = 2151986177; -pub const NE_ADD_VCPU: u32 = 3221532193; -pub const EVIOCSKEYCODE_V2: u32 = 1076380932; -pub const PTP_SYS_OFFSET_EXTENDED2: u32 = 3300932882; -pub const SCIF_FENCE_WAIT: u32 = 3221517072; -pub const RIO_TRANSFER: u32 = 3222826261; -pub const FSL_HV_IOCTL_DOORBELL: u32 = 3221794566; -pub const RIO_MPORT_MAINT_WRITE_LOCAL: u32 = 1075342598; -pub const I2OEVTREG: u32 = 1074555146; -pub const I2OPARMGET: u32 = 3222825220; -pub const EVIOCGID: u32 = 2148025602; -pub const BTRFS_IOC_QGROUP_CREATE: u32 = 1074828330; -pub const AUTOFS_DEV_IOCTL_SETPIPEFD: u32 = 3222836088; -pub const VIDIOC_S_PARM: u32 = 3234616854; -pub const TUNSETSTEERINGEBPF: u32 = 2147767520; -pub const ATM_GETNAMES: u32 = 1074291075; -pub const VIDIOC_QUERYMENU: u32 = 3224131109; -pub const DFL_FPGA_PORT_DMA_UNMAP: u32 = 46660; -pub const I2OLCTGET: u32 = 3222038786; -pub const FS_IOC_GET_ENCRYPTION_PWSALT: u32 = 1074816532; -pub const NS_SETBUFLEV: u32 = 1074553186; -pub const BLKCLOSEZONE: u32 = 1074795143; -pub const SONET_GETFRSENSE: u32 = 2147901719; -pub const UI_SET_EVBIT: u32 = 1074025828; -pub const DM_LIST_VERSIONS: u32 = 3241737485; -pub const HIDIOCGSTRING: u32 = 2164541444; -pub const PPPIOCATTCHAN: u32 = 1074033720; -pub const VDUSE_DEV_SET_CONFIG: u32 = 1074299154; -pub const TUNGETFEATURES: u32 = 2147767503; -pub const VFIO_GROUP_UNSET_CONTAINER: u32 = 15209; -pub const IPMICTL_SET_MY_ADDRESS_CMD: u32 = 2147772689; -pub const CCISS_REGNEWDISK: u32 = 1074020877; -pub const VIDIOC_QUERY_DV_TIMINGS: u32 = 2156156515; -pub const PHN_SETREGS: u32 = 1076391944; -pub const FAT_IOCTL_GET_ATTRIBUTES: u32 = 2147774992; -pub const FSL_MC_SEND_MC_COMMAND: u32 = 3225440992; -pub const TUNGETIFF: u32 = 2147767506; -pub const PTP_CLOCK_GETCAPS2: u32 = 2152742154; -pub const BTRFS_IOC_RESIZE: u32 = 1342215171; -pub const VHOST_SET_VRING_ENDIAN: u32 = 1074310931; -pub const PPS_KC_BIND: u32 = 1074032805; -pub const F2FS_IOC_WRITE_CHECKPOINT: u32 = 62727; -pub const UI_SET_FFBIT: u32 = 1074025835; -pub const IPMICTL_GET_MY_LUN_CMD: u32 = 2147772692; -pub const CEC_ADAP_G_PHYS_ADDR: u32 = 2147639553; -pub const CEC_G_MODE: u32 = 2147770632; -pub const USBDEVFS_RESETEP: u32 = 2147767555; -pub const MEDIA_REQUEST_IOC_QUEUE: u32 = 31872; -pub const USBDEVFS_ALLOC_STREAMS: u32 = 2148029724; -pub const MGSL_IOCSXCTRL: u32 = 27925; -pub const MEDIA_IOC_G_TOPOLOGY: u32 = 3225975812; -pub const PPPIOCUNBRIDGECHAN: u32 = 29748; -pub const F2FS_IOC_COMMIT_ATOMIC_WRITE: u32 = 62722; -pub const ISST_IF_GET_PLATFORM_INFO: u32 = 2147810816; -pub const SCIF_FENCE_MARK: u32 = 3222041359; -pub const USBDEVFS_RELEASE_PORT: u32 = 2147767577; -pub const VFIO_CHECK_EXTENSION: u32 = 15205; -pub const BTRFS_IOC_QGROUP_LIMIT: u32 = 2150667307; -pub const FAT_IOCTL_GET_VOLUME_ID: u32 = 2147774995; -pub const UI_SET_PHYS: u32 = 1074025836; -pub const FDWERRORGET: u32 = 2149057047; -pub const VIDIOC_SUBDEV_G_EDID: u32 = 3223606824; -pub const MGSL_IOCGSTATS: u32 = 27911; -pub const RPROC_SET_SHUTDOWN_ON_RELEASE: u32 = 1074050817; -pub const SIOCGSTAMP_NEW: u32 = 2148567302; -pub const RTC_WKALM_RD: u32 = 2150133776; -pub const PHN_GET_REG: u32 = 3221516288; -pub const DELL_WMI_SMBIOS_CMD: u32 = 3224655616; -pub const PHN_NOT_OH: u32 = 28676; -pub const PPGETMODES: u32 = 2147774615; -pub const CHIOGPARAMS: u32 = 2148819718; -pub const VFIO_DEVICE_GET_GFX_DMABUF: u32 = 15219; -pub const VHOST_SET_VRING_BUSYLOOP_TIMEOUT: u32 = 1074310947; -pub const VIDIOC_SUBDEV_G_SELECTION: u32 = 3225441853; -pub const BTRFS_IOC_RM_DEV_V2: u32 = 1342215226; -pub const MGSL_IOCWAITGPIO: u32 = 3222301970; -pub const PMU_IOC_CAN_SLEEP: u32 = 2147762693; -pub const KCOV_ENABLE: u32 = 25444; -pub const BTRFS_IOC_CLONE: u32 = 1074041865; -pub const F2FS_IOC_DEFRAGMENT: u32 = 3222336776; -pub const FW_CDEV_IOC_DEALLOCATE_ISO_RESOURCE: u32 = 1074012942; -pub const AGPIOC_ALLOCATE: u32 = 3221504262; -pub const NE_SET_USER_MEMORY_REGION: u32 = 1075359267; -pub const MGSL_IOCTXABORT: u32 = 27910; -pub const MGSL_IOCSGPIO: u32 = 1074818320; -pub const LIRC_SET_REC_CARRIER: u32 = 1074030868; -pub const F2FS_IOC_FLUSH_DEVICE: u32 = 1074328842; -pub const SNAPSHOT_ATOMIC_RESTORE: u32 = 13060; -pub const RTC_UIE_OFF: u32 = 28676; -pub const BT_BMC_IOCTL_SMS_ATN: u32 = 45312; -pub const NVME_IOCTL_ID: u32 = 20032; -pub const NE_START_ENCLAVE: u32 = 3222318628; -pub const VIDIOC_STREAMON: u32 = 1074026002; -pub const FDPOLLDRVSTAT: u32 = 2150892051; -pub const AUTOFS_DEV_IOCTL_READY: u32 = 3222836086; -pub const VIDIOC_ENUMAUDOUT: u32 = 3224655426; -pub const VIDIOC_SUBDEV_S_STD: u32 = 1074288152; -pub const WDIOC_GETTIMELEFT: u32 = 2147768074; -pub const ATM_GETLINKRATE: u32 = 1074553217; -pub const RTC_WKALM_SET: u32 = 1076391951; -pub const VHOST_GET_BACKEND_FEATURES: u32 = 2148052774; -pub const ATMARP_ENCAP: u32 = 25061; -pub const CAPI_GET_FLAGS: u32 = 2147762979; -pub const IPMICTL_SET_MY_CHANNEL_ADDRESS_CMD: u32 = 2147772696; -pub const DFL_FPGA_FME_PORT_ASSIGN: u32 = 1074050690; -pub const NS_GET_OWNER_UID: u32 = 46852; -pub const VIDIOC_OVERLAY: u32 = 1074025998; -pub const BTRFS_IOC_WAIT_SYNC: u32 = 1074304022; -pub const GPIOHANDLE_SET_CONFIG_IOCTL: u32 = 3226776586; -pub const VHOST_GET_VRING_ENDIAN: u32 = 1074310932; -pub const ATM_GETADDR: u32 = 1074553222; -pub const PHN_GET_REGS: u32 = 3221516290; -pub const AUTOFS_DEV_IOCTL_REQUESTER: u32 = 3222836091; -pub const AUTOFS_DEV_IOCTL_EXPIRE: u32 = 3222836092; -pub const SNAPSHOT_S2RAM: u32 = 13067; -pub const JSIOCSAXMAP: u32 = 1077963313; -pub const F2FS_IOC_SET_COMPRESS_OPTION: u32 = 1073935638; -pub const VBG_IOCTL_HGCM_DISCONNECT: u32 = 3223082501; -pub const SCIF_FENCE_SIGNAL: u32 = 3223614225; -pub const VFIO_DEVICE_GET_PCI_HOT_RESET_INFO: u32 = 15216; -pub const VIDIOC_SUBDEV_ENUM_MBUS_CODE: u32 = 3224393218; -pub const MMTIMER_GETOFFSET: u32 = 27904; -pub const RIO_CM_CHAN_LISTEN: u32 = 1073898246; -pub const ATM_SETSC: u32 = 1074029041; -pub const F2FS_IOC_SHUTDOWN: u32 = 2147768445; -pub const NVME_IOCTL_RESCAN: u32 = 20038; -pub const BLKOPENZONE: u32 = 1074795142; -pub const DM_VERSION: u32 = 3241737472; -pub const CEC_TRANSMIT: u32 = 3224920325; -pub const FS_IOC_GET_ENCRYPTION_POLICY_EX: u32 = 3221841430; -pub const SIOCMKCLIP: u32 = 25056; -pub const IPMI_BMC_IOCTL_CLEAR_SMS_ATN: u32 = 45313; -pub const HIDIOCGVERSION: u32 = 2147764225; -pub const VIDIOC_S_INPUT: u32 = 3221509671; -pub const VIDIOC_G_CROP: u32 = 3222558267; -pub const LIRC_SET_WIDEBAND_RECEIVER: u32 = 1074030883; -pub const EVIOCGEFFECTS: u32 = 2147763588; -pub const UVCIOC_CTRL_QUERY: u32 = 3222041889; -pub const IOC_OPAL_GENERIC_TABLE_RW: u32 = 1094217963; -pub const FS_IOC_READ_VERITY_METADATA: u32 = 3223873159; -pub const ND_IOCTL_SET_CONFIG_DATA: u32 = 3221769734; -pub const USBDEVFS_GETDRIVER: u32 = 1090802952; -pub const IDT77105_GETSTAT: u32 = 1074553138; -pub const HIDIOCINITREPORT: u32 = 18437; -pub const VFIO_DEVICE_GET_INFO: u32 = 15211; -pub const RIO_CM_CHAN_RECEIVE: u32 = 3222299402; -pub const RNDGETENTCNT: u32 = 2147766784; -pub const PPPIOCNEWUNIT: u32 = 3221517374; -pub const BTRFS_IOC_INO_LOOKUP: u32 = 3489698834; -pub const FDRESET: u32 = 596; -pub const IOC_PR_REGISTER: u32 = 1075343560; -pub const HIDIOCSREPORT: u32 = 1074546696; -pub const TEE_IOC_OPEN_SESSION: u32 = 2148574210; -pub const TEE_IOC_SUPPL_RECV: u32 = 2148574214; -pub const BTRFS_IOC_BALANCE_CTL: u32 = 1074041889; -pub const GPIO_GET_LINEINFO_WATCH_IOCTL: u32 = 3225990155; -pub const HIDIOCGRAWINFO: u32 = 2148026371; -pub const PPPIOCSCOMPRESS: u32 = 1074558029; -pub const USBDEVFS_CONNECTINFO: u32 = 1074287889; -pub const BLKRESETZONE: u32 = 1074795139; -pub const CHIOINITELEM: u32 = 25361; -pub const NILFS_IOCTL_SET_ALLOC_RANGE: u32 = 1074818700; -pub const AUTOFS_DEV_IOCTL_CATATONIC: u32 = 3222836089; -pub const RIO_MPORT_MAINT_HDID_SET: u32 = 1073900801; -pub const PPGETPHASE: u32 = 2147774617; -pub const USBDEVFS_DISCONNECT_CLAIM: u32 = 2164806939; -pub const FDMSGON: u32 = 581; -pub const VIDIOC_G_SLICED_VBI_CAP: u32 = 3228849733; -pub const BTRFS_IOC_BALANCE_V2: u32 = 3288372256; -pub const MEDIA_REQUEST_IOC_REINIT: u32 = 31873; -pub const IOC_OPAL_ERASE_LR: u32 = 1091596518; -pub const FDFMTBEG: u32 = 583; -pub const RNDRESEEDCRNG: u32 = 20999; -pub const ISST_IF_GET_PHY_ID: u32 = 3221552641; -pub const TUNSETNOCSUM: u32 = 1074025672; -pub const SONET_GETSTAT: u32 = 2149867792; -pub const TFD_IOC_SET_TICKS: u32 = 1074287616; -pub const PPDATADIR: u32 = 1074032784; -pub const IOC_OPAL_ENABLE_DISABLE_MBR: u32 = 1091596517; -pub const GPIO_V2_GET_LINE_IOCTL: u32 = 3260068871; -pub const RIO_CM_CHAN_SEND: u32 = 1074815753; -pub const PPWCTLONIRQ: u32 = 1073836178; -pub const SONYPI_IOCGBRT: u32 = 2147579392; -pub const IOC_PR_RELEASE: u32 = 1074819274; -pub const PPCLRIRQ: u32 = 2147774611; -pub const IPMICTL_SET_MY_CHANNEL_LUN_CMD: u32 = 2147772698; -pub const MGSL_IOCSXSYNC: u32 = 27923; -pub const HPET_IE_OFF: u32 = 26626; -pub const IOC_OPAL_ACTIVATE_USR: u32 = 1091596513; -pub const SONET_SETFRAMING: u32 = 1074028821; -pub const PERF_EVENT_IOC_PAUSE_OUTPUT: u32 = 1074013193; -pub const BTRFS_IOC_LOGICAL_INO_V2: u32 = 3224933435; -pub const VBG_IOCTL_HGCM_CONNECT: u32 = 3231471108; -pub const BLKFINISHZONE: u32 = 1074795144; -pub const EVIOCREVOKE: u32 = 1074021777; -pub const VFIO_DEVICE_FEATURE: u32 = 15221; -pub const CCISS_GETPCIINFO: u32 = 2148024833; -pub const ISST_IF_MBOX_COMMAND: u32 = 3221552643; -pub const SCIF_ACCEPTREQ: u32 = 3222303492; -pub const PERF_EVENT_IOC_QUERY_BPF: u32 = 3221496842; -pub const VIDIOC_STREAMOFF: u32 = 1074026003; -pub const VDUSE_DESTROY_DEV: u32 = 1090552067; -pub const FDGETFDCSTAT: u32 = 2149581333; -pub const CM_IOCGATR: u32 = 3221512961; -pub const VIDIOC_S_PRIORITY: u32 = 1074026052; -pub const SNAPSHOT_FREEZE: u32 = 13057; -pub const VIDIOC_ENUMINPUT: u32 = 3226228250; -pub const ZATM_GETPOOLZ: u32 = 1074553186; -pub const RIO_DISABLE_DOORBELL_RANGE: u32 = 1074294026; -pub const GPIO_V2_GET_LINEINFO_WATCH_IOCTL: u32 = 3238048774; -pub const VIDIOC_G_STD: u32 = 2148029975; -pub const USBDEVFS_ALLOW_SUSPEND: u32 = 21794; -pub const SONET_GETSTATZ: u32 = 2149867793; -pub const SCIF_ACCEPTREG: u32 = 3221779205; -pub const VIDIOC_ENCODER_CMD: u32 = 3223869005; -pub const PPPIOCSRASYNCMAP: u32 = 1074033748; -pub const IOCTL_MEI_NOTIFY_SET: u32 = 1074022402; -pub const BTRFS_IOC_QUOTA_RESCAN_STATUS: u32 = 2151715885; -pub const F2FS_IOC_GARBAGE_COLLECT: u32 = 1074066694; -pub const ATMLEC_CTRL: u32 = 25040; -pub const MATROXFB_GET_AVAILABLE_OUTPUTS: u32 = 2147774201; -pub const DM_DEV_CREATE: u32 = 3241737475; -pub const VHOST_VDPA_GET_VRING_NUM: u32 = 2147659638; -pub const VIDIOC_G_CTRL: u32 = 3221771803; -pub const NBD_CLEAR_SOCK: u32 = 43780; -pub const VFIO_DEVICE_QUERY_GFX_PLANE: u32 = 15218; -pub const WDIOC_KEEPALIVE: u32 = 2147768069; -pub const NVME_IOCTL_SUBSYS_RESET: u32 = 20037; -pub const PTP_EXTTS_REQUEST2: u32 = 1074806027; -pub const PCITEST_BAR: u32 = 20481; -pub const MGSL_IOCGGPIO: u32 = 2148560145; -pub const EVIOCSREP: u32 = 1074283779; -pub const VFIO_DEVICE_GET_IRQ_INFO: u32 = 15213; -pub const HPET_DPI: u32 = 26629; -pub const VDUSE_VQ_SETUP_KICKFD: u32 = 1074299158; -pub const ND_IOCTL_CALL: u32 = 3225439754; -pub const HIDIOCGDEVINFO: u32 = 2149337091; -pub const DM_TABLE_DEPS: u32 = 3241737483; -pub const BTRFS_IOC_DEV_INFO: u32 = 3489698846; -pub const VDUSE_IOTLB_GET_FD: u32 = 3223093520; -pub const FW_CDEV_IOC_GET_INFO: u32 = 3223593728; -pub const VIDIOC_G_PRIORITY: u32 = 2147767875; -pub const ATM_NEWBACKENDIF: u32 = 1073897971; -pub const VIDIOC_S_EXT_CTRLS: u32 = 3222820424; -pub const VIDIOC_SUBDEV_ENUM_DV_TIMINGS: u32 = 3230946914; -pub const VIDIOC_OMAP3ISP_CCDC_CFG: u32 = 3223344833; -pub const VIDIOC_S_HW_FREQ_SEEK: u32 = 1076909650; -pub const DM_TABLE_LOAD: u32 = 3241737481; -pub const F2FS_IOC_START_ATOMIC_WRITE: u32 = 62721; -pub const VIDIOC_G_OUTPUT: u32 = 2147767854; -pub const ATM_DROPPARTY: u32 = 1074029045; -pub const CHIOGELEM: u32 = 1080845072; -pub const BTRFS_IOC_GET_SUPPORTED_FEATURES: u32 = 2152240185; -pub const EVIOCSKEYCODE: u32 = 1074283780; -pub const NE_GET_IMAGE_LOAD_INFO: u32 = 3222318626; -pub const TUNSETLINK: u32 = 1074025677; -pub const FW_CDEV_IOC_ADD_DESCRIPTOR: u32 = 3222807302; -pub const BTRFS_IOC_SCRUB_CANCEL: u32 = 37916; -pub const PPS_SETPARAMS: u32 = 1074032802; -pub const IOC_OPAL_LR_SETUP: u32 = 1093169379; -pub const FW_CDEV_IOC_DEALLOCATE: u32 = 1074012931; -pub const WDIOC_SETTIMEOUT: u32 = 3221509894; -pub const IOC_WATCH_QUEUE_SET_FILTER: u32 = 22369; -pub const CAPI_GET_MANUFACTURER: u32 = 3221504774; -pub const VFIO_IOMMU_SPAPR_UNREGISTER_MEMORY: u32 = 15222; -pub const ASPEED_P2A_CTRL_IOCTL_SET_WINDOW: u32 = 1074836224; -pub const VIDIOC_G_EDID: u32 = 3223606824; -pub const F2FS_IOC_GARBAGE_COLLECT_RANGE: u32 = 1075115275; -pub const RIO_MAP_INBOUND: u32 = 3223874833; -pub const IOC_OPAL_TAKE_OWNERSHIP: u32 = 1091072222; -pub const USBDEVFS_CLAIM_PORT: u32 = 2147767576; -pub const VIDIOC_S_AUDIO: u32 = 1077171746; -pub const FS_IOC_GET_ENCRYPTION_NONCE: u32 = 2148558363; -pub const FW_CDEV_IOC_SEND_STREAM_PACKET: u32 = 1076372243; -pub const BTRFS_IOC_SNAP_DESTROY: u32 = 1342215183; -pub const SNAPSHOT_FREE: u32 = 13061; -pub const I8K_GET_SPEED: u32 = 3221514629; -pub const HIDIOCGREPORT: u32 = 1074546695; -pub const HPET_EPI: u32 = 26628; -pub const JSIOCSCORR: u32 = 1076128289; -pub const IOC_PR_PREEMPT_ABORT: u32 = 1075343564; -pub const RIO_MAP_OUTBOUND: u32 = 3223874831; -pub const ATM_SETESI: u32 = 1074553228; -pub const FW_CDEV_IOC_START_ISO: u32 = 1074799370; -pub const ATM_DELADDR: u32 = 1074553225; -pub const PPFCONTROL: u32 = 1073901710; -pub const SONYPI_IOCGFAN: u32 = 2147579402; -pub const RTC_IRQP_SET: u32 = 1074032652; -pub const PCITEST_WRITE: u32 = 1074024452; -pub const PPCLAIM: u32 = 28811; -pub const VIDIOC_S_JPEGCOMP: u32 = 1082938942; -pub const IPMICTL_UNREGISTER_FOR_CMD: u32 = 2147641615; -pub const VHOST_SET_FEATURES: u32 = 1074310912; -pub const TOSHIBA_ACPI_SCI: u32 = 3222828177; -pub const VIDIOC_DQBUF: u32 = 3225703953; -pub const BTRFS_IOC_BALANCE_PROGRESS: u32 = 2214630434; -pub const BTRFS_IOC_SUBVOL_SETFLAGS: u32 = 1074304026; -pub const ATMLEC_MCAST: u32 = 25042; -pub const MMTIMER_GETFREQ: u32 = 2147773698; -pub const VIDIOC_G_SELECTION: u32 = 3225441886; -pub const RTC_ALM_SET: u32 = 1076129799; -pub const PPPOEIOCSFWD: u32 = 1074049280; -pub const IPMICTL_GET_MAINTENANCE_MODE_CMD: u32 = 2147772702; -pub const FS_IOC_ENABLE_VERITY: u32 = 1082156677; -pub const NILFS_IOCTL_GET_BDESCS: u32 = 3222826631; -pub const FDFMTEND: u32 = 585; -pub const DMA_BUF_SET_NAME: u32 = 1074029057; -pub const UI_BEGIN_FF_UPLOAD: u32 = 3227538888; -pub const RTC_UIE_ON: u32 = 28675; -pub const PPRELEASE: u32 = 28812; -pub const VFIO_IOMMU_UNMAP_DMA: u32 = 15218; -pub const VIDIOC_OMAP3ISP_PRV_CFG: u32 = 3225179842; -pub const GPIO_GET_LINEHANDLE_IOCTL: u32 = 3245126659; -pub const VFAT_IOCTL_READDIR_BOTH: u32 = 2182640129; -pub const NVME_IOCTL_ADMIN_CMD: u32 = 3225964097; -pub const VHOST_SET_VRING_KICK: u32 = 1074310944; -pub const BTRFS_IOC_SUBVOL_CREATE_V2: u32 = 1342215192; -pub const BTRFS_IOC_SNAP_CREATE: u32 = 1342215169; -pub const SONYPI_IOCGBAT2CAP: u32 = 2147644932; -pub const PPNEGOT: u32 = 1074032785; -pub const NBD_PRINT_DEBUG: u32 = 43782; -pub const BTRFS_IOC_INO_LOOKUP_USER: u32 = 3489698878; -pub const BTRFS_IOC_GET_SUBVOL_ROOTREF: u32 = 3489698877; -pub const FS_IOC_REMOVE_ENCRYPTION_KEY_ALL_USERS: u32 = 3225445913; -pub const BTRFS_IOC_FS_INFO: u32 = 2214630431; -pub const VIDIOC_ENUM_FMT: u32 = 3225441794; -pub const VIDIOC_G_INPUT: u32 = 2147767846; -pub const VTPM_PROXY_IOC_NEW_DEV: u32 = 3222577408; -pub const DFL_FPGA_FME_ERR_GET_IRQ_NUM: u32 = 2147792515; -pub const ND_IOCTL_DIMM_FLAGS: u32 = 3221769731; -pub const BTRFS_IOC_QUOTA_RESCAN: u32 = 1077974060; -pub const MMTIMER_GETCOUNTER: u32 = 2147773705; -pub const MATROXFB_GET_OUTPUT_MODE: u32 = 3221516026; -pub const BTRFS_IOC_QUOTA_RESCAN_WAIT: u32 = 37934; -pub const RIO_CM_CHAN_BIND: u32 = 1074291461; -pub const HIDIOCGRDESC: u32 = 2416199682; -pub const MGSL_IOCGIF: u32 = 27915; -pub const VIDIOC_S_OUTPUT: u32 = 3221509679; -pub const HIDIOCGREPORTINFO: u32 = 3222030345; -pub const WDIOC_GETBOOTSTATUS: u32 = 2147768066; -pub const VDUSE_VQ_GET_INFO: u32 = 3224142101; -pub const ACRN_IOCTL_ASSIGN_PCIDEV: u32 = 1076142677; -pub const BLKGETDISKSEQ: u32 = 2148012672; -pub const ACRN_IOCTL_PM_GET_CPU_STATE: u32 = 3221791328; -pub const ACRN_IOCTL_DESTROY_VM: u32 = 41489; -pub const ACRN_IOCTL_SET_PTDEV_INTR: u32 = 1075094099; -pub const ACRN_IOCTL_CREATE_IOREQ_CLIENT: u32 = 41522; -pub const ACRN_IOCTL_IRQFD: u32 = 1075356273; -pub const ACRN_IOCTL_CREATE_VM: u32 = 3224412688; -pub const ACRN_IOCTL_INJECT_MSI: u32 = 1074831907; -pub const ACRN_IOCTL_ATTACH_IOREQ_CLIENT: u32 = 41523; -pub const ACRN_IOCTL_RESET_PTDEV_INTR: u32 = 1075094100; -pub const ACRN_IOCTL_NOTIFY_REQUEST_FINISH: u32 = 1074307633; -pub const ACRN_IOCTL_SET_IRQLINE: u32 = 1074307621; -pub const ACRN_IOCTL_START_VM: u32 = 41490; -pub const ACRN_IOCTL_SET_VCPU_REGS: u32 = 1092919830; -pub const ACRN_IOCTL_SET_MEMSEG: u32 = 1075880513; -pub const ACRN_IOCTL_PAUSE_VM: u32 = 41491; -pub const ACRN_IOCTL_CLEAR_VM_IOREQ: u32 = 41525; -pub const ACRN_IOCTL_UNSET_MEMSEG: u32 = 1075880514; -pub const ACRN_IOCTL_IOEVENTFD: u32 = 1075880560; -pub const ACRN_IOCTL_DEASSIGN_PCIDEV: u32 = 1076142678; -pub const ACRN_IOCTL_RESET_VM: u32 = 41493; -pub const ACRN_IOCTL_DESTROY_IOREQ_CLIENT: u32 = 41524; -pub const ACRN_IOCTL_VM_INTR_MONITOR: u32 = 1074045476; diff -Nru temporalio-1.3.0/vendor/linux-raw-sys/src/csky/io_uring.rs temporalio-1.3.0/vendor/linux-raw-sys/src/csky/io_uring.rs --- temporalio-1.3.0/vendor/linux-raw-sys/src/csky/io_uring.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/linux-raw-sys/src/csky/io_uring.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,1087 +0,0 @@ -/* automatically generated by rust-bindgen 0.66.1 */ - -pub type __s8 = crate::ctypes::c_schar; -pub type __u8 = crate::ctypes::c_uchar; -pub type __s16 = crate::ctypes::c_short; -pub type __u16 = crate::ctypes::c_ushort; -pub type __s32 = crate::ctypes::c_int; -pub type __u32 = crate::ctypes::c_uint; -pub type __s64 = crate::ctypes::c_longlong; -pub type __u64 = crate::ctypes::c_ulonglong; -pub type __kernel_key_t = crate::ctypes::c_int; -pub type __kernel_mqd_t = crate::ctypes::c_int; -pub type __kernel_long_t = crate::ctypes::c_long; -pub type __kernel_ulong_t = crate::ctypes::c_ulong; -pub type __kernel_ino_t = __kernel_ulong_t; -pub type __kernel_mode_t = crate::ctypes::c_uint; -pub type __kernel_pid_t = crate::ctypes::c_int; -pub type __kernel_ipc_pid_t = crate::ctypes::c_int; -pub type __kernel_uid_t = crate::ctypes::c_uint; -pub type __kernel_gid_t = crate::ctypes::c_uint; -pub type __kernel_suseconds_t = __kernel_long_t; -pub type __kernel_daddr_t = crate::ctypes::c_int; -pub type __kernel_uid32_t = crate::ctypes::c_uint; -pub type __kernel_gid32_t = crate::ctypes::c_uint; -pub type __kernel_old_uid_t = __kernel_uid_t; -pub type __kernel_old_gid_t = __kernel_gid_t; -pub type __kernel_old_dev_t = crate::ctypes::c_uint; -pub type __kernel_size_t = crate::ctypes::c_uint; -pub type __kernel_ssize_t = crate::ctypes::c_int; -pub type __kernel_ptrdiff_t = crate::ctypes::c_int; -pub type __kernel_off_t = __kernel_long_t; -pub type __kernel_loff_t = crate::ctypes::c_longlong; -pub type __kernel_old_time_t = __kernel_long_t; -pub type __kernel_time_t = __kernel_long_t; -pub type __kernel_time64_t = crate::ctypes::c_longlong; -pub type __kernel_clock_t = __kernel_long_t; -pub type __kernel_timer_t = crate::ctypes::c_int; -pub type __kernel_clockid_t = crate::ctypes::c_int; -pub type __kernel_caddr_t = *mut crate::ctypes::c_char; -pub type __kernel_uid16_t = crate::ctypes::c_ushort; -pub type __kernel_gid16_t = crate::ctypes::c_ushort; -pub type __le16 = __u16; -pub type __be16 = __u16; -pub type __le32 = __u32; -pub type __be32 = __u32; -pub type __le64 = __u64; -pub type __be64 = __u64; -pub type __sum16 = __u16; -pub type __wsum = __u32; -pub type __poll_t = crate::ctypes::c_uint; -pub type __kernel_rwf_t = crate::ctypes::c_int; -#[repr(C)] -#[derive(Default)] -pub struct __IncompleteArrayField(::core::marker::PhantomData, [T; 0]); -#[repr(C)] -pub struct __BindgenUnionField(::core::marker::PhantomData); -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fscrypt_policy_v1 { -pub version: __u8, -pub contents_encryption_mode: __u8, -pub filenames_encryption_mode: __u8, -pub flags: __u8, -pub master_key_descriptor: [__u8; 8usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fscrypt_key { -pub mode: __u32, -pub raw: [__u8; 64usize], -pub size: __u32, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fscrypt_policy_v2 { -pub version: __u8, -pub contents_encryption_mode: __u8, -pub filenames_encryption_mode: __u8, -pub flags: __u8, -pub __reserved: [__u8; 4usize], -pub master_key_identifier: [__u8; 16usize], -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct fscrypt_get_policy_ex_arg { -pub policy_size: __u64, -pub policy: fscrypt_get_policy_ex_arg__bindgen_ty_1, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct fscrypt_key_specifier { -pub type_: __u32, -pub __reserved: __u32, -pub u: fscrypt_key_specifier__bindgen_ty_1, -} -#[repr(C)] -#[derive(Debug)] -pub struct fscrypt_provisioning_key_payload { -pub type_: __u32, -pub __reserved: __u32, -pub raw: __IncompleteArrayField<__u8>, -} -#[repr(C)] -pub struct fscrypt_add_key_arg { -pub key_spec: fscrypt_key_specifier, -pub raw_size: __u32, -pub key_id: __u32, -pub __reserved: [__u32; 8usize], -pub raw: __IncompleteArrayField<__u8>, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct fscrypt_remove_key_arg { -pub key_spec: fscrypt_key_specifier, -pub removal_status_flags: __u32, -pub __reserved: [__u32; 5usize], -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct fscrypt_get_key_status_arg { -pub key_spec: fscrypt_key_specifier, -pub __reserved: [__u32; 6usize], -pub status: __u32, -pub status_flags: __u32, -pub user_count: __u32, -pub __out_reserved: [__u32; 13usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct mount_attr { -pub attr_set: __u64, -pub attr_clr: __u64, -pub propagation: __u64, -pub userns_fd: __u64, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct file_clone_range { -pub src_fd: __s64, -pub src_offset: __u64, -pub src_length: __u64, -pub dest_offset: __u64, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fstrim_range { -pub start: __u64, -pub len: __u64, -pub minlen: __u64, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct file_dedupe_range_info { -pub dest_fd: __s64, -pub dest_offset: __u64, -pub bytes_deduped: __u64, -pub status: __s32, -pub reserved: __u32, -} -#[repr(C)] -#[derive(Debug)] -pub struct file_dedupe_range { -pub src_offset: __u64, -pub src_length: __u64, -pub dest_count: __u16, -pub reserved1: __u16, -pub reserved2: __u32, -pub info: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct files_stat_struct { -pub nr_files: crate::ctypes::c_ulong, -pub nr_free_files: crate::ctypes::c_ulong, -pub max_files: crate::ctypes::c_ulong, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct inodes_stat_t { -pub nr_inodes: crate::ctypes::c_long, -pub nr_unused: crate::ctypes::c_long, -pub dummy: [crate::ctypes::c_long; 5usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fsxattr { -pub fsx_xflags: __u32, -pub fsx_extsize: __u32, -pub fsx_nextents: __u32, -pub fsx_projid: __u32, -pub fsx_cowextsize: __u32, -pub fsx_pad: [crate::ctypes::c_uchar; 8usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct __kernel_timespec { -pub tv_sec: __kernel_time64_t, -pub tv_nsec: crate::ctypes::c_longlong, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct __kernel_itimerspec { -pub it_interval: __kernel_timespec, -pub it_value: __kernel_timespec, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct __kernel_old_timeval { -pub tv_sec: __kernel_long_t, -pub tv_usec: __kernel_long_t, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct __kernel_old_timespec { -pub tv_sec: __kernel_old_time_t, -pub tv_nsec: crate::ctypes::c_long, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct __kernel_old_itimerval { -pub it_interval: __kernel_old_timeval, -pub it_value: __kernel_old_timeval, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct __kernel_sock_timeval { -pub tv_sec: __s64, -pub tv_usec: __s64, -} -#[repr(C)] -pub struct io_uring_sqe { -pub opcode: __u8, -pub flags: __u8, -pub ioprio: __u16, -pub fd: __s32, -pub __bindgen_anon_1: io_uring_sqe__bindgen_ty_1, -pub __bindgen_anon_2: io_uring_sqe__bindgen_ty_2, -pub len: __u32, -pub __bindgen_anon_3: io_uring_sqe__bindgen_ty_3, -pub user_data: __u64, -pub __bindgen_anon_4: io_uring_sqe__bindgen_ty_4, -pub personality: __u16, -pub __bindgen_anon_5: io_uring_sqe__bindgen_ty_5, -pub __bindgen_anon_6: io_uring_sqe__bindgen_ty_6, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct io_uring_sqe__bindgen_ty_1__bindgen_ty_1 { -pub cmd_op: __u32, -pub __pad1: __u32, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct io_uring_sqe__bindgen_ty_5__bindgen_ty_1 { -pub addr_len: __u16, -pub __pad3: [__u16; 1usize], -} -#[repr(C)] -pub struct io_uring_sqe__bindgen_ty_6 { -pub __bindgen_anon_1: __BindgenUnionField, -pub cmd: __BindgenUnionField<[__u8; 0usize]>, -pub bindgen_union_field: [u32; 4usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct io_uring_sqe__bindgen_ty_6__bindgen_ty_1 { -pub addr3: __u64, -pub __pad2: [__u64; 1usize], -} -#[repr(C)] -#[derive(Debug)] -pub struct io_uring_cqe { -pub user_data: __u64, -pub res: __s32, -pub flags: __u32, -pub big_cqe: __IncompleteArrayField<__u64>, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct io_sqring_offsets { -pub head: __u32, -pub tail: __u32, -pub ring_mask: __u32, -pub ring_entries: __u32, -pub flags: __u32, -pub dropped: __u32, -pub array: __u32, -pub resv1: __u32, -pub resv2: __u64, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct io_cqring_offsets { -pub head: __u32, -pub tail: __u32, -pub ring_mask: __u32, -pub ring_entries: __u32, -pub overflow: __u32, -pub cqes: __u32, -pub flags: __u32, -pub resv1: __u32, -pub resv2: __u64, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct io_uring_params { -pub sq_entries: __u32, -pub cq_entries: __u32, -pub flags: __u32, -pub sq_thread_cpu: __u32, -pub sq_thread_idle: __u32, -pub features: __u32, -pub wq_fd: __u32, -pub resv: [__u32; 3usize], -pub sq_off: io_sqring_offsets, -pub cq_off: io_cqring_offsets, -} -#[repr(C)] -#[repr(align(8))] -#[derive(Debug, Copy, Clone)] -pub struct io_uring_files_update { -pub offset: __u32, -pub resv: __u32, -pub fds: __u64, -} -#[repr(C)] -#[repr(align(8))] -#[derive(Debug, Copy, Clone)] -pub struct io_uring_rsrc_register { -pub nr: __u32, -pub flags: __u32, -pub resv2: __u64, -pub data: __u64, -pub tags: __u64, -} -#[repr(C)] -#[repr(align(8))] -#[derive(Debug, Copy, Clone)] -pub struct io_uring_rsrc_update { -pub offset: __u32, -pub resv: __u32, -pub data: __u64, -} -#[repr(C)] -#[repr(align(8))] -#[derive(Debug, Copy, Clone)] -pub struct io_uring_rsrc_update2 { -pub offset: __u32, -pub resv: __u32, -pub data: __u64, -pub tags: __u64, -pub nr: __u32, -pub resv2: __u32, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct io_uring_notification_slot { -pub tag: __u64, -pub resv: [__u64; 3usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct io_uring_notification_register { -pub nr_slots: __u32, -pub resv: __u32, -pub resv2: __u64, -pub data: __u64, -pub resv3: __u64, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct io_uring_probe_op { -pub op: __u8, -pub resv: __u8, -pub flags: __u16, -pub resv2: __u32, -} -#[repr(C)] -#[derive(Debug)] -pub struct io_uring_probe { -pub last_op: __u8, -pub ops_len: __u8, -pub resv: __u16, -pub resv2: [__u32; 3usize], -pub ops: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct io_uring_restriction { -pub opcode: __u16, -pub __bindgen_anon_1: io_uring_restriction__bindgen_ty_1, -pub resv: __u8, -pub resv2: [__u32; 3usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct io_uring_buf { -pub addr: __u64, -pub len: __u32, -pub bid: __u16, -pub resv: __u16, -} -#[repr(C)] -pub struct io_uring_buf_ring { -pub __bindgen_anon_1: io_uring_buf_ring__bindgen_ty_1, -} -#[repr(C)] -pub struct io_uring_buf_ring__bindgen_ty_1 { -pub __bindgen_anon_1: __BindgenUnionField, -pub __bindgen_anon_2: __BindgenUnionField, -pub bindgen_union_field: [u32; 4usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct io_uring_buf_ring__bindgen_ty_1__bindgen_ty_1 { -pub resv1: __u64, -pub resv2: __u32, -pub resv3: __u16, -pub tail: __u16, -} -#[repr(C)] -#[derive(Debug)] -pub struct io_uring_buf_ring__bindgen_ty_1__bindgen_ty_2 { -pub __empty_bufs: io_uring_buf_ring__bindgen_ty_1__bindgen_ty_2__bindgen_ty_1, -pub bufs: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct io_uring_buf_ring__bindgen_ty_1__bindgen_ty_2__bindgen_ty_1 {} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct io_uring_buf_reg { -pub ring_addr: __u64, -pub ring_entries: __u32, -pub bgid: __u16, -pub pad: __u16, -pub resv: [__u64; 3usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct io_uring_getevents_arg { -pub sigmask: __u64, -pub sigmask_sz: __u32, -pub pad: __u32, -pub ts: __u64, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct io_uring_sync_cancel_reg { -pub addr: __u64, -pub fd: __s32, -pub flags: __u32, -pub timeout: __kernel_timespec, -pub pad: [__u64; 4usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct io_uring_file_index_range { -pub off: __u32, -pub len: __u32, -pub resv: __u64, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct io_uring_recvmsg_out { -pub namelen: __u32, -pub controllen: __u32, -pub payloadlen: __u32, -pub flags: __u32, -} -pub const NR_OPEN: u32 = 1024; -pub const NGROUPS_MAX: u32 = 65536; -pub const ARG_MAX: u32 = 131072; -pub const LINK_MAX: u32 = 127; -pub const MAX_CANON: u32 = 255; -pub const MAX_INPUT: u32 = 255; -pub const NAME_MAX: u32 = 255; -pub const PATH_MAX: u32 = 4096; -pub const PIPE_BUF: u32 = 4096; -pub const XATTR_NAME_MAX: u32 = 255; -pub const XATTR_SIZE_MAX: u32 = 65536; -pub const XATTR_LIST_MAX: u32 = 65536; -pub const RTSIG_MAX: u32 = 32; -pub const _IOC_NRBITS: u32 = 8; -pub const _IOC_TYPEBITS: u32 = 8; -pub const _IOC_SIZEBITS: u32 = 14; -pub const _IOC_DIRBITS: u32 = 2; -pub const _IOC_NRMASK: u32 = 255; -pub const _IOC_TYPEMASK: u32 = 255; -pub const _IOC_SIZEMASK: u32 = 16383; -pub const _IOC_DIRMASK: u32 = 3; -pub const _IOC_NRSHIFT: u32 = 0; -pub const _IOC_TYPESHIFT: u32 = 8; -pub const _IOC_SIZESHIFT: u32 = 16; -pub const _IOC_DIRSHIFT: u32 = 30; -pub const _IOC_NONE: u32 = 0; -pub const _IOC_WRITE: u32 = 1; -pub const _IOC_READ: u32 = 2; -pub const IOC_IN: u32 = 1073741824; -pub const IOC_OUT: u32 = 2147483648; -pub const IOC_INOUT: u32 = 3221225472; -pub const IOCSIZE_MASK: u32 = 1073676288; -pub const IOCSIZE_SHIFT: u32 = 16; -pub const FSCRYPT_POLICY_FLAGS_PAD_4: u32 = 0; -pub const FSCRYPT_POLICY_FLAGS_PAD_8: u32 = 1; -pub const FSCRYPT_POLICY_FLAGS_PAD_16: u32 = 2; -pub const FSCRYPT_POLICY_FLAGS_PAD_32: u32 = 3; -pub const FSCRYPT_POLICY_FLAGS_PAD_MASK: u32 = 3; -pub const FSCRYPT_POLICY_FLAG_DIRECT_KEY: u32 = 4; -pub const FSCRYPT_POLICY_FLAG_IV_INO_LBLK_64: u32 = 8; -pub const FSCRYPT_POLICY_FLAG_IV_INO_LBLK_32: u32 = 16; -pub const FSCRYPT_MODE_AES_256_XTS: u32 = 1; -pub const FSCRYPT_MODE_AES_256_CTS: u32 = 4; -pub const FSCRYPT_MODE_AES_128_CBC: u32 = 5; -pub const FSCRYPT_MODE_AES_128_CTS: u32 = 6; -pub const FSCRYPT_MODE_SM4_XTS: u32 = 7; -pub const FSCRYPT_MODE_SM4_CTS: u32 = 8; -pub const FSCRYPT_MODE_ADIANTUM: u32 = 9; -pub const FSCRYPT_MODE_AES_256_HCTR2: u32 = 10; -pub const FSCRYPT_POLICY_V1: u32 = 0; -pub const FSCRYPT_KEY_DESCRIPTOR_SIZE: u32 = 8; -pub const FSCRYPT_KEY_DESC_PREFIX: &[u8; 9] = b"fscrypt:\0"; -pub const FSCRYPT_KEY_DESC_PREFIX_SIZE: u32 = 8; -pub const FSCRYPT_MAX_KEY_SIZE: u32 = 64; -pub const FSCRYPT_POLICY_V2: u32 = 2; -pub const FSCRYPT_KEY_IDENTIFIER_SIZE: u32 = 16; -pub const FSCRYPT_KEY_SPEC_TYPE_DESCRIPTOR: u32 = 1; -pub const FSCRYPT_KEY_SPEC_TYPE_IDENTIFIER: u32 = 2; -pub const FSCRYPT_KEY_REMOVAL_STATUS_FLAG_FILES_BUSY: u32 = 1; -pub const FSCRYPT_KEY_REMOVAL_STATUS_FLAG_OTHER_USERS: u32 = 2; -pub const FSCRYPT_KEY_STATUS_ABSENT: u32 = 1; -pub const FSCRYPT_KEY_STATUS_PRESENT: u32 = 2; -pub const FSCRYPT_KEY_STATUS_INCOMPLETELY_REMOVED: u32 = 3; -pub const FSCRYPT_KEY_STATUS_FLAG_ADDED_BY_SELF: u32 = 1; -pub const FS_KEY_DESCRIPTOR_SIZE: u32 = 8; -pub const FS_POLICY_FLAGS_PAD_4: u32 = 0; -pub const FS_POLICY_FLAGS_PAD_8: u32 = 1; -pub const FS_POLICY_FLAGS_PAD_16: u32 = 2; -pub const FS_POLICY_FLAGS_PAD_32: u32 = 3; -pub const FS_POLICY_FLAGS_PAD_MASK: u32 = 3; -pub const FS_POLICY_FLAG_DIRECT_KEY: u32 = 4; -pub const FS_POLICY_FLAGS_VALID: u32 = 7; -pub const FS_ENCRYPTION_MODE_INVALID: u32 = 0; -pub const FS_ENCRYPTION_MODE_AES_256_XTS: u32 = 1; -pub const FS_ENCRYPTION_MODE_AES_256_GCM: u32 = 2; -pub const FS_ENCRYPTION_MODE_AES_256_CBC: u32 = 3; -pub const FS_ENCRYPTION_MODE_AES_256_CTS: u32 = 4; -pub const FS_ENCRYPTION_MODE_AES_128_CBC: u32 = 5; -pub const FS_ENCRYPTION_MODE_AES_128_CTS: u32 = 6; -pub const FS_ENCRYPTION_MODE_ADIANTUM: u32 = 9; -pub const FS_KEY_DESC_PREFIX: &[u8; 9] = b"fscrypt:\0"; -pub const FS_KEY_DESC_PREFIX_SIZE: u32 = 8; -pub const FS_MAX_KEY_SIZE: u32 = 64; -pub const MS_RDONLY: u32 = 1; -pub const MS_NOSUID: u32 = 2; -pub const MS_NODEV: u32 = 4; -pub const MS_NOEXEC: u32 = 8; -pub const MS_SYNCHRONOUS: u32 = 16; -pub const MS_REMOUNT: u32 = 32; -pub const MS_MANDLOCK: u32 = 64; -pub const MS_DIRSYNC: u32 = 128; -pub const MS_NOSYMFOLLOW: u32 = 256; -pub const MS_NOATIME: u32 = 1024; -pub const MS_NODIRATIME: u32 = 2048; -pub const MS_BIND: u32 = 4096; -pub const MS_MOVE: u32 = 8192; -pub const MS_REC: u32 = 16384; -pub const MS_VERBOSE: u32 = 32768; -pub const MS_SILENT: u32 = 32768; -pub const MS_POSIXACL: u32 = 65536; -pub const MS_UNBINDABLE: u32 = 131072; -pub const MS_PRIVATE: u32 = 262144; -pub const MS_SLAVE: u32 = 524288; -pub const MS_SHARED: u32 = 1048576; -pub const MS_RELATIME: u32 = 2097152; -pub const MS_KERNMOUNT: u32 = 4194304; -pub const MS_I_VERSION: u32 = 8388608; -pub const MS_STRICTATIME: u32 = 16777216; -pub const MS_LAZYTIME: u32 = 33554432; -pub const MS_SUBMOUNT: u32 = 67108864; -pub const MS_NOREMOTELOCK: u32 = 134217728; -pub const MS_NOSEC: u32 = 268435456; -pub const MS_BORN: u32 = 536870912; -pub const MS_ACTIVE: u32 = 1073741824; -pub const MS_NOUSER: u32 = 2147483648; -pub const MS_RMT_MASK: u32 = 41943121; -pub const MS_MGC_VAL: u32 = 3236757504; -pub const MS_MGC_MSK: u32 = 4294901760; -pub const OPEN_TREE_CLONE: u32 = 1; -pub const MOVE_MOUNT_F_SYMLINKS: u32 = 1; -pub const MOVE_MOUNT_F_AUTOMOUNTS: u32 = 2; -pub const MOVE_MOUNT_F_EMPTY_PATH: u32 = 4; -pub const MOVE_MOUNT_T_SYMLINKS: u32 = 16; -pub const MOVE_MOUNT_T_AUTOMOUNTS: u32 = 32; -pub const MOVE_MOUNT_T_EMPTY_PATH: u32 = 64; -pub const MOVE_MOUNT_SET_GROUP: u32 = 256; -pub const MOVE_MOUNT__MASK: u32 = 375; -pub const FSOPEN_CLOEXEC: u32 = 1; -pub const FSPICK_CLOEXEC: u32 = 1; -pub const FSPICK_SYMLINK_NOFOLLOW: u32 = 2; -pub const FSPICK_NO_AUTOMOUNT: u32 = 4; -pub const FSPICK_EMPTY_PATH: u32 = 8; -pub const FSMOUNT_CLOEXEC: u32 = 1; -pub const MOUNT_ATTR_RDONLY: u32 = 1; -pub const MOUNT_ATTR_NOSUID: u32 = 2; -pub const MOUNT_ATTR_NODEV: u32 = 4; -pub const MOUNT_ATTR_NOEXEC: u32 = 8; -pub const MOUNT_ATTR__ATIME: u32 = 112; -pub const MOUNT_ATTR_RELATIME: u32 = 0; -pub const MOUNT_ATTR_NOATIME: u32 = 16; -pub const MOUNT_ATTR_STRICTATIME: u32 = 32; -pub const MOUNT_ATTR_NODIRATIME: u32 = 128; -pub const MOUNT_ATTR_IDMAP: u32 = 1048576; -pub const MOUNT_ATTR_NOSYMFOLLOW: u32 = 2097152; -pub const MOUNT_ATTR_SIZE_VER0: u32 = 32; -pub const INR_OPEN_CUR: u32 = 1024; -pub const INR_OPEN_MAX: u32 = 4096; -pub const BLOCK_SIZE_BITS: u32 = 10; -pub const BLOCK_SIZE: u32 = 1024; -pub const SEEK_SET: u32 = 0; -pub const SEEK_CUR: u32 = 1; -pub const SEEK_END: u32 = 2; -pub const SEEK_DATA: u32 = 3; -pub const SEEK_HOLE: u32 = 4; -pub const SEEK_MAX: u32 = 4; -pub const RENAME_NOREPLACE: u32 = 1; -pub const RENAME_EXCHANGE: u32 = 2; -pub const RENAME_WHITEOUT: u32 = 4; -pub const FILE_DEDUPE_RANGE_SAME: u32 = 0; -pub const FILE_DEDUPE_RANGE_DIFFERS: u32 = 1; -pub const NR_FILE: u32 = 8192; -pub const FS_XFLAG_REALTIME: u32 = 1; -pub const FS_XFLAG_PREALLOC: u32 = 2; -pub const FS_XFLAG_IMMUTABLE: u32 = 8; -pub const FS_XFLAG_APPEND: u32 = 16; -pub const FS_XFLAG_SYNC: u32 = 32; -pub const FS_XFLAG_NOATIME: u32 = 64; -pub const FS_XFLAG_NODUMP: u32 = 128; -pub const FS_XFLAG_RTINHERIT: u32 = 256; -pub const FS_XFLAG_PROJINHERIT: u32 = 512; -pub const FS_XFLAG_NOSYMLINKS: u32 = 1024; -pub const FS_XFLAG_EXTSIZE: u32 = 2048; -pub const FS_XFLAG_EXTSZINHERIT: u32 = 4096; -pub const FS_XFLAG_NODEFRAG: u32 = 8192; -pub const FS_XFLAG_FILESTREAM: u32 = 16384; -pub const FS_XFLAG_DAX: u32 = 32768; -pub const FS_XFLAG_COWEXTSIZE: u32 = 65536; -pub const FS_XFLAG_HASATTR: u32 = 2147483648; -pub const BMAP_IOCTL: u32 = 1; -pub const FSLABEL_MAX: u32 = 256; -pub const FS_SECRM_FL: u32 = 1; -pub const FS_UNRM_FL: u32 = 2; -pub const FS_COMPR_FL: u32 = 4; -pub const FS_SYNC_FL: u32 = 8; -pub const FS_IMMUTABLE_FL: u32 = 16; -pub const FS_APPEND_FL: u32 = 32; -pub const FS_NODUMP_FL: u32 = 64; -pub const FS_NOATIME_FL: u32 = 128; -pub const FS_DIRTY_FL: u32 = 256; -pub const FS_COMPRBLK_FL: u32 = 512; -pub const FS_NOCOMP_FL: u32 = 1024; -pub const FS_ENCRYPT_FL: u32 = 2048; -pub const FS_BTREE_FL: u32 = 4096; -pub const FS_INDEX_FL: u32 = 4096; -pub const FS_IMAGIC_FL: u32 = 8192; -pub const FS_JOURNAL_DATA_FL: u32 = 16384; -pub const FS_NOTAIL_FL: u32 = 32768; -pub const FS_DIRSYNC_FL: u32 = 65536; -pub const FS_TOPDIR_FL: u32 = 131072; -pub const FS_HUGE_FILE_FL: u32 = 262144; -pub const FS_EXTENT_FL: u32 = 524288; -pub const FS_VERITY_FL: u32 = 1048576; -pub const FS_EA_INODE_FL: u32 = 2097152; -pub const FS_EOFBLOCKS_FL: u32 = 4194304; -pub const FS_NOCOW_FL: u32 = 8388608; -pub const FS_DAX_FL: u32 = 33554432; -pub const FS_INLINE_DATA_FL: u32 = 268435456; -pub const FS_PROJINHERIT_FL: u32 = 536870912; -pub const FS_CASEFOLD_FL: u32 = 1073741824; -pub const FS_RESERVED_FL: u32 = 2147483648; -pub const FS_FL_USER_VISIBLE: u32 = 253951; -pub const FS_FL_USER_MODIFIABLE: u32 = 229631; -pub const SYNC_FILE_RANGE_WAIT_BEFORE: u32 = 1; -pub const SYNC_FILE_RANGE_WRITE: u32 = 2; -pub const SYNC_FILE_RANGE_WAIT_AFTER: u32 = 4; -pub const SYNC_FILE_RANGE_WRITE_AND_WAIT: u32 = 7; -pub const IORING_FILE_INDEX_ALLOC: i32 = -1; -pub const IORING_SETUP_IOPOLL: u32 = 1; -pub const IORING_SETUP_SQPOLL: u32 = 2; -pub const IORING_SETUP_SQ_AFF: u32 = 4; -pub const IORING_SETUP_CQSIZE: u32 = 8; -pub const IORING_SETUP_CLAMP: u32 = 16; -pub const IORING_SETUP_ATTACH_WQ: u32 = 32; -pub const IORING_SETUP_R_DISABLED: u32 = 64; -pub const IORING_SETUP_SUBMIT_ALL: u32 = 128; -pub const IORING_SETUP_COOP_TASKRUN: u32 = 256; -pub const IORING_SETUP_TASKRUN_FLAG: u32 = 512; -pub const IORING_SETUP_SQE128: u32 = 1024; -pub const IORING_SETUP_CQE32: u32 = 2048; -pub const IORING_SETUP_SINGLE_ISSUER: u32 = 4096; -pub const IORING_SETUP_DEFER_TASKRUN: u32 = 8192; -pub const IORING_URING_CMD_FIXED: u32 = 1; -pub const IORING_FSYNC_DATASYNC: u32 = 1; -pub const IORING_TIMEOUT_ABS: u32 = 1; -pub const IORING_TIMEOUT_UPDATE: u32 = 2; -pub const IORING_TIMEOUT_BOOTTIME: u32 = 4; -pub const IORING_TIMEOUT_REALTIME: u32 = 8; -pub const IORING_LINK_TIMEOUT_UPDATE: u32 = 16; -pub const IORING_TIMEOUT_ETIME_SUCCESS: u32 = 32; -pub const IORING_TIMEOUT_CLOCK_MASK: u32 = 12; -pub const IORING_TIMEOUT_UPDATE_MASK: u32 = 18; -pub const SPLICE_F_FD_IN_FIXED: u32 = 2147483648; -pub const IORING_POLL_ADD_MULTI: u32 = 1; -pub const IORING_POLL_UPDATE_EVENTS: u32 = 2; -pub const IORING_POLL_UPDATE_USER_DATA: u32 = 4; -pub const IORING_POLL_ADD_LEVEL: u32 = 8; -pub const IORING_ASYNC_CANCEL_ALL: u32 = 1; -pub const IORING_ASYNC_CANCEL_FD: u32 = 2; -pub const IORING_ASYNC_CANCEL_ANY: u32 = 4; -pub const IORING_ASYNC_CANCEL_FD_FIXED: u32 = 8; -pub const IORING_RECVSEND_POLL_FIRST: u32 = 1; -pub const IORING_RECV_MULTISHOT: u32 = 2; -pub const IORING_RECVSEND_FIXED_BUF: u32 = 4; -pub const IORING_SEND_ZC_REPORT_USAGE: u32 = 8; -pub const IORING_NOTIF_USAGE_ZC_COPIED: u32 = 2147483648; -pub const IORING_ACCEPT_MULTISHOT: u32 = 1; -pub const IORING_MSG_RING_CQE_SKIP: u32 = 1; -pub const IORING_MSG_RING_FLAGS_PASS: u32 = 2; -pub const IORING_CQE_F_BUFFER: u32 = 1; -pub const IORING_CQE_F_MORE: u32 = 2; -pub const IORING_CQE_F_SOCK_NONEMPTY: u32 = 4; -pub const IORING_CQE_F_NOTIF: u32 = 8; -pub const IORING_OFF_SQ_RING: u32 = 0; -pub const IORING_OFF_CQ_RING: u32 = 134217728; -pub const IORING_OFF_SQES: u32 = 268435456; -pub const IORING_SQ_NEED_WAKEUP: u32 = 1; -pub const IORING_SQ_CQ_OVERFLOW: u32 = 2; -pub const IORING_SQ_TASKRUN: u32 = 4; -pub const IORING_CQ_EVENTFD_DISABLED: u32 = 1; -pub const IORING_ENTER_GETEVENTS: u32 = 1; -pub const IORING_ENTER_SQ_WAKEUP: u32 = 2; -pub const IORING_ENTER_SQ_WAIT: u32 = 4; -pub const IORING_ENTER_EXT_ARG: u32 = 8; -pub const IORING_ENTER_REGISTERED_RING: u32 = 16; -pub const IORING_FEAT_SINGLE_MMAP: u32 = 1; -pub const IORING_FEAT_NODROP: u32 = 2; -pub const IORING_FEAT_SUBMIT_STABLE: u32 = 4; -pub const IORING_FEAT_RW_CUR_POS: u32 = 8; -pub const IORING_FEAT_CUR_PERSONALITY: u32 = 16; -pub const IORING_FEAT_FAST_POLL: u32 = 32; -pub const IORING_FEAT_POLL_32BITS: u32 = 64; -pub const IORING_FEAT_SQPOLL_NONFIXED: u32 = 128; -pub const IORING_FEAT_EXT_ARG: u32 = 256; -pub const IORING_FEAT_NATIVE_WORKERS: u32 = 512; -pub const IORING_FEAT_RSRC_TAGS: u32 = 1024; -pub const IORING_FEAT_CQE_SKIP: u32 = 2048; -pub const IORING_FEAT_LINKED_FILE: u32 = 4096; -pub const IORING_FEAT_REG_REG_RING: u32 = 8192; -pub const IORING_RSRC_REGISTER_SPARSE: u32 = 1; -pub const IORING_REGISTER_FILES_SKIP: i32 = -2; -pub const IO_URING_OP_SUPPORTED: u32 = 1; -pub const IOSQE_FIXED_FILE_BIT: _bindgen_ty_1 = _bindgen_ty_1::IOSQE_FIXED_FILE_BIT; -pub const IOSQE_IO_DRAIN_BIT: _bindgen_ty_1 = _bindgen_ty_1::IOSQE_IO_DRAIN_BIT; -pub const IOSQE_IO_LINK_BIT: _bindgen_ty_1 = _bindgen_ty_1::IOSQE_IO_LINK_BIT; -pub const IOSQE_IO_HARDLINK_BIT: _bindgen_ty_1 = _bindgen_ty_1::IOSQE_IO_HARDLINK_BIT; -pub const IOSQE_ASYNC_BIT: _bindgen_ty_1 = _bindgen_ty_1::IOSQE_ASYNC_BIT; -pub const IOSQE_BUFFER_SELECT_BIT: _bindgen_ty_1 = _bindgen_ty_1::IOSQE_BUFFER_SELECT_BIT; -pub const IOSQE_CQE_SKIP_SUCCESS_BIT: _bindgen_ty_1 = _bindgen_ty_1::IOSQE_CQE_SKIP_SUCCESS_BIT; -pub const IORING_MSG_DATA: _bindgen_ty_2 = _bindgen_ty_2::IORING_MSG_DATA; -pub const IORING_MSG_SEND_FD: _bindgen_ty_2 = _bindgen_ty_2::IORING_MSG_SEND_FD; -pub const IORING_CQE_BUFFER_SHIFT: _bindgen_ty_3 = _bindgen_ty_3::IORING_CQE_BUFFER_SHIFT; -pub const IORING_REGISTER_BUFFERS: _bindgen_ty_4 = _bindgen_ty_4::IORING_REGISTER_BUFFERS; -pub const IORING_UNREGISTER_BUFFERS: _bindgen_ty_4 = _bindgen_ty_4::IORING_UNREGISTER_BUFFERS; -pub const IORING_REGISTER_FILES: _bindgen_ty_4 = _bindgen_ty_4::IORING_REGISTER_FILES; -pub const IORING_UNREGISTER_FILES: _bindgen_ty_4 = _bindgen_ty_4::IORING_UNREGISTER_FILES; -pub const IORING_REGISTER_EVENTFD: _bindgen_ty_4 = _bindgen_ty_4::IORING_REGISTER_EVENTFD; -pub const IORING_UNREGISTER_EVENTFD: _bindgen_ty_4 = _bindgen_ty_4::IORING_UNREGISTER_EVENTFD; -pub const IORING_REGISTER_FILES_UPDATE: _bindgen_ty_4 = _bindgen_ty_4::IORING_REGISTER_FILES_UPDATE; -pub const IORING_REGISTER_EVENTFD_ASYNC: _bindgen_ty_4 = _bindgen_ty_4::IORING_REGISTER_EVENTFD_ASYNC; -pub const IORING_REGISTER_PROBE: _bindgen_ty_4 = _bindgen_ty_4::IORING_REGISTER_PROBE; -pub const IORING_REGISTER_PERSONALITY: _bindgen_ty_4 = _bindgen_ty_4::IORING_REGISTER_PERSONALITY; -pub const IORING_UNREGISTER_PERSONALITY: _bindgen_ty_4 = _bindgen_ty_4::IORING_UNREGISTER_PERSONALITY; -pub const IORING_REGISTER_RESTRICTIONS: _bindgen_ty_4 = _bindgen_ty_4::IORING_REGISTER_RESTRICTIONS; -pub const IORING_REGISTER_ENABLE_RINGS: _bindgen_ty_4 = _bindgen_ty_4::IORING_REGISTER_ENABLE_RINGS; -pub const IORING_REGISTER_FILES2: _bindgen_ty_4 = _bindgen_ty_4::IORING_REGISTER_FILES2; -pub const IORING_REGISTER_FILES_UPDATE2: _bindgen_ty_4 = _bindgen_ty_4::IORING_REGISTER_FILES_UPDATE2; -pub const IORING_REGISTER_BUFFERS2: _bindgen_ty_4 = _bindgen_ty_4::IORING_REGISTER_BUFFERS2; -pub const IORING_REGISTER_BUFFERS_UPDATE: _bindgen_ty_4 = _bindgen_ty_4::IORING_REGISTER_BUFFERS_UPDATE; -pub const IORING_REGISTER_IOWQ_AFF: _bindgen_ty_4 = _bindgen_ty_4::IORING_REGISTER_IOWQ_AFF; -pub const IORING_UNREGISTER_IOWQ_AFF: _bindgen_ty_4 = _bindgen_ty_4::IORING_UNREGISTER_IOWQ_AFF; -pub const IORING_REGISTER_IOWQ_MAX_WORKERS: _bindgen_ty_4 = _bindgen_ty_4::IORING_REGISTER_IOWQ_MAX_WORKERS; -pub const IORING_REGISTER_RING_FDS: _bindgen_ty_4 = _bindgen_ty_4::IORING_REGISTER_RING_FDS; -pub const IORING_UNREGISTER_RING_FDS: _bindgen_ty_4 = _bindgen_ty_4::IORING_UNREGISTER_RING_FDS; -pub const IORING_REGISTER_PBUF_RING: _bindgen_ty_4 = _bindgen_ty_4::IORING_REGISTER_PBUF_RING; -pub const IORING_UNREGISTER_PBUF_RING: _bindgen_ty_4 = _bindgen_ty_4::IORING_UNREGISTER_PBUF_RING; -pub const IORING_REGISTER_SYNC_CANCEL: _bindgen_ty_4 = _bindgen_ty_4::IORING_REGISTER_SYNC_CANCEL; -pub const IORING_REGISTER_FILE_ALLOC_RANGE: _bindgen_ty_4 = _bindgen_ty_4::IORING_REGISTER_FILE_ALLOC_RANGE; -pub const IORING_REGISTER_LAST: _bindgen_ty_4 = _bindgen_ty_4::IORING_REGISTER_LAST; -pub const IORING_REGISTER_USE_REGISTERED_RING: _bindgen_ty_4 = _bindgen_ty_4::IORING_REGISTER_USE_REGISTERED_RING; -pub const IO_WQ_BOUND: _bindgen_ty_5 = _bindgen_ty_5::IO_WQ_BOUND; -pub const IO_WQ_UNBOUND: _bindgen_ty_5 = _bindgen_ty_5::IO_WQ_UNBOUND; -pub const IORING_RESTRICTION_REGISTER_OP: _bindgen_ty_6 = _bindgen_ty_6::IORING_RESTRICTION_REGISTER_OP; -pub const IORING_RESTRICTION_SQE_OP: _bindgen_ty_6 = _bindgen_ty_6::IORING_RESTRICTION_SQE_OP; -pub const IORING_RESTRICTION_SQE_FLAGS_ALLOWED: _bindgen_ty_6 = _bindgen_ty_6::IORING_RESTRICTION_SQE_FLAGS_ALLOWED; -pub const IORING_RESTRICTION_SQE_FLAGS_REQUIRED: _bindgen_ty_6 = _bindgen_ty_6::IORING_RESTRICTION_SQE_FLAGS_REQUIRED; -pub const IORING_RESTRICTION_LAST: _bindgen_ty_6 = _bindgen_ty_6::IORING_RESTRICTION_LAST; -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum fsconfig_command { -FSCONFIG_SET_FLAG = 0, -FSCONFIG_SET_STRING = 1, -FSCONFIG_SET_BINARY = 2, -FSCONFIG_SET_PATH = 3, -FSCONFIG_SET_PATH_EMPTY = 4, -FSCONFIG_SET_FD = 5, -FSCONFIG_CMD_CREATE = 6, -FSCONFIG_CMD_RECONFIGURE = 7, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_1 { -IOSQE_FIXED_FILE_BIT = 0, -IOSQE_IO_DRAIN_BIT = 1, -IOSQE_IO_LINK_BIT = 2, -IOSQE_IO_HARDLINK_BIT = 3, -IOSQE_ASYNC_BIT = 4, -IOSQE_BUFFER_SELECT_BIT = 5, -IOSQE_CQE_SKIP_SUCCESS_BIT = 6, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum io_uring_op { -IORING_OP_NOP = 0, -IORING_OP_READV = 1, -IORING_OP_WRITEV = 2, -IORING_OP_FSYNC = 3, -IORING_OP_READ_FIXED = 4, -IORING_OP_WRITE_FIXED = 5, -IORING_OP_POLL_ADD = 6, -IORING_OP_POLL_REMOVE = 7, -IORING_OP_SYNC_FILE_RANGE = 8, -IORING_OP_SENDMSG = 9, -IORING_OP_RECVMSG = 10, -IORING_OP_TIMEOUT = 11, -IORING_OP_TIMEOUT_REMOVE = 12, -IORING_OP_ACCEPT = 13, -IORING_OP_ASYNC_CANCEL = 14, -IORING_OP_LINK_TIMEOUT = 15, -IORING_OP_CONNECT = 16, -IORING_OP_FALLOCATE = 17, -IORING_OP_OPENAT = 18, -IORING_OP_CLOSE = 19, -IORING_OP_FILES_UPDATE = 20, -IORING_OP_STATX = 21, -IORING_OP_READ = 22, -IORING_OP_WRITE = 23, -IORING_OP_FADVISE = 24, -IORING_OP_MADVISE = 25, -IORING_OP_SEND = 26, -IORING_OP_RECV = 27, -IORING_OP_OPENAT2 = 28, -IORING_OP_EPOLL_CTL = 29, -IORING_OP_SPLICE = 30, -IORING_OP_PROVIDE_BUFFERS = 31, -IORING_OP_REMOVE_BUFFERS = 32, -IORING_OP_TEE = 33, -IORING_OP_SHUTDOWN = 34, -IORING_OP_RENAMEAT = 35, -IORING_OP_UNLINKAT = 36, -IORING_OP_MKDIRAT = 37, -IORING_OP_SYMLINKAT = 38, -IORING_OP_LINKAT = 39, -IORING_OP_MSG_RING = 40, -IORING_OP_FSETXATTR = 41, -IORING_OP_SETXATTR = 42, -IORING_OP_FGETXATTR = 43, -IORING_OP_GETXATTR = 44, -IORING_OP_SOCKET = 45, -IORING_OP_URING_CMD = 46, -IORING_OP_SEND_ZC = 47, -IORING_OP_SENDMSG_ZC = 48, -IORING_OP_LAST = 49, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_2 { -IORING_MSG_DATA = 0, -IORING_MSG_SEND_FD = 1, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_3 { -IORING_CQE_BUFFER_SHIFT = 16, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_4 { -IORING_REGISTER_BUFFERS = 0, -IORING_UNREGISTER_BUFFERS = 1, -IORING_REGISTER_FILES = 2, -IORING_UNREGISTER_FILES = 3, -IORING_REGISTER_EVENTFD = 4, -IORING_UNREGISTER_EVENTFD = 5, -IORING_REGISTER_FILES_UPDATE = 6, -IORING_REGISTER_EVENTFD_ASYNC = 7, -IORING_REGISTER_PROBE = 8, -IORING_REGISTER_PERSONALITY = 9, -IORING_UNREGISTER_PERSONALITY = 10, -IORING_REGISTER_RESTRICTIONS = 11, -IORING_REGISTER_ENABLE_RINGS = 12, -IORING_REGISTER_FILES2 = 13, -IORING_REGISTER_FILES_UPDATE2 = 14, -IORING_REGISTER_BUFFERS2 = 15, -IORING_REGISTER_BUFFERS_UPDATE = 16, -IORING_REGISTER_IOWQ_AFF = 17, -IORING_UNREGISTER_IOWQ_AFF = 18, -IORING_REGISTER_IOWQ_MAX_WORKERS = 19, -IORING_REGISTER_RING_FDS = 20, -IORING_UNREGISTER_RING_FDS = 21, -IORING_REGISTER_PBUF_RING = 22, -IORING_UNREGISTER_PBUF_RING = 23, -IORING_REGISTER_SYNC_CANCEL = 24, -IORING_REGISTER_FILE_ALLOC_RANGE = 25, -IORING_REGISTER_LAST = 26, -IORING_REGISTER_USE_REGISTERED_RING = 2147483648, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_5 { -IO_WQ_BOUND = 0, -IO_WQ_UNBOUND = 1, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_6 { -IORING_RESTRICTION_REGISTER_OP = 0, -IORING_RESTRICTION_SQE_OP = 1, -IORING_RESTRICTION_SQE_FLAGS_ALLOWED = 2, -IORING_RESTRICTION_SQE_FLAGS_REQUIRED = 3, -IORING_RESTRICTION_LAST = 4, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union fscrypt_get_policy_ex_arg__bindgen_ty_1 { -pub version: __u8, -pub v1: fscrypt_policy_v1, -pub v2: fscrypt_policy_v2, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union fscrypt_key_specifier__bindgen_ty_1 { -pub __reserved: [__u8; 32usize], -pub descriptor: [__u8; 8usize], -pub identifier: [__u8; 16usize], -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union io_uring_sqe__bindgen_ty_1 { -pub off: __u64, -pub addr2: __u64, -pub __bindgen_anon_1: io_uring_sqe__bindgen_ty_1__bindgen_ty_1, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union io_uring_sqe__bindgen_ty_2 { -pub addr: __u64, -pub splice_off_in: __u64, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union io_uring_sqe__bindgen_ty_3 { -pub rw_flags: __kernel_rwf_t, -pub fsync_flags: __u32, -pub poll_events: __u16, -pub poll32_events: __u32, -pub sync_range_flags: __u32, -pub msg_flags: __u32, -pub timeout_flags: __u32, -pub accept_flags: __u32, -pub cancel_flags: __u32, -pub open_flags: __u32, -pub statx_flags: __u32, -pub fadvise_advice: __u32, -pub splice_flags: __u32, -pub rename_flags: __u32, -pub unlink_flags: __u32, -pub hardlink_flags: __u32, -pub xattr_flags: __u32, -pub msg_ring_flags: __u32, -pub uring_cmd_flags: __u32, -} -#[repr(C, packed)] -#[derive(Copy, Clone)] -pub union io_uring_sqe__bindgen_ty_4 { -pub buf_index: __u16, -pub buf_group: __u16, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union io_uring_sqe__bindgen_ty_5 { -pub splice_fd_in: __s32, -pub file_index: __u32, -pub __bindgen_anon_1: io_uring_sqe__bindgen_ty_5__bindgen_ty_1, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union io_uring_restriction__bindgen_ty_1 { -pub register_op: __u8, -pub sqe_op: __u8, -pub sqe_flags: __u8, -} -impl __IncompleteArrayField { -#[inline] -pub const fn new() -> Self { -__IncompleteArrayField(::core::marker::PhantomData, []) -} -#[inline] -pub fn as_ptr(&self) -> *const T { -self as *const _ as *const T -} -#[inline] -pub fn as_mut_ptr(&mut self) -> *mut T { -self as *mut _ as *mut T -} -#[inline] -pub unsafe fn as_slice(&self, len: usize) -> &[T] { -::core::slice::from_raw_parts(self.as_ptr(), len) -} -#[inline] -pub unsafe fn as_mut_slice(&mut self, len: usize) -> &mut [T] { -::core::slice::from_raw_parts_mut(self.as_mut_ptr(), len) -} -} -impl ::core::fmt::Debug for __IncompleteArrayField { -fn fmt(&self, fmt: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { -fmt.write_str("__IncompleteArrayField") -} -} -impl __BindgenUnionField { -#[inline] -pub const fn new() -> Self { -__BindgenUnionField(::core::marker::PhantomData) -} -#[inline] -pub unsafe fn as_ref(&self) -> &T { -::core::mem::transmute(self) -} -#[inline] -pub unsafe fn as_mut(&mut self) -> &mut T { -::core::mem::transmute(self) -} -} -impl ::core::default::Default for __BindgenUnionField { -#[inline] -fn default() -> Self { -Self::new() -} -} -impl ::core::clone::Clone for __BindgenUnionField { -#[inline] -fn clone(&self) -> Self { -Self::new() -} -} -impl ::core::marker::Copy for __BindgenUnionField {} -impl ::core::fmt::Debug for __BindgenUnionField { -fn fmt(&self, fmt: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { -fmt.write_str("__BindgenUnionField") -} -} -impl ::core::hash::Hash for __BindgenUnionField { -fn hash(&self, _state: &mut H) {} -} -impl ::core::cmp::PartialEq for __BindgenUnionField { -fn eq(&self, _other: &__BindgenUnionField) -> bool { -true -} -} -impl ::core::cmp::Eq for __BindgenUnionField {} diff -Nru temporalio-1.3.0/vendor/linux-raw-sys/src/csky/netlink.rs temporalio-1.3.0/vendor/linux-raw-sys/src/csky/netlink.rs --- temporalio-1.3.0/vendor/linux-raw-sys/src/csky/netlink.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/linux-raw-sys/src/csky/netlink.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,2854 +0,0 @@ -/* automatically generated by rust-bindgen 0.66.1 */ - -pub type __kernel_sa_family_t = crate::ctypes::c_ushort; -pub type __s8 = crate::ctypes::c_schar; -pub type __u8 = crate::ctypes::c_uchar; -pub type __s16 = crate::ctypes::c_short; -pub type __u16 = crate::ctypes::c_ushort; -pub type __s32 = crate::ctypes::c_int; -pub type __u32 = crate::ctypes::c_uint; -pub type __s64 = crate::ctypes::c_longlong; -pub type __u64 = crate::ctypes::c_ulonglong; -pub type __kernel_key_t = crate::ctypes::c_int; -pub type __kernel_mqd_t = crate::ctypes::c_int; -pub type __kernel_long_t = crate::ctypes::c_long; -pub type __kernel_ulong_t = crate::ctypes::c_ulong; -pub type __kernel_ino_t = __kernel_ulong_t; -pub type __kernel_mode_t = crate::ctypes::c_uint; -pub type __kernel_pid_t = crate::ctypes::c_int; -pub type __kernel_ipc_pid_t = crate::ctypes::c_int; -pub type __kernel_uid_t = crate::ctypes::c_uint; -pub type __kernel_gid_t = crate::ctypes::c_uint; -pub type __kernel_suseconds_t = __kernel_long_t; -pub type __kernel_daddr_t = crate::ctypes::c_int; -pub type __kernel_uid32_t = crate::ctypes::c_uint; -pub type __kernel_gid32_t = crate::ctypes::c_uint; -pub type __kernel_old_uid_t = __kernel_uid_t; -pub type __kernel_old_gid_t = __kernel_gid_t; -pub type __kernel_old_dev_t = crate::ctypes::c_uint; -pub type __kernel_size_t = crate::ctypes::c_uint; -pub type __kernel_ssize_t = crate::ctypes::c_int; -pub type __kernel_ptrdiff_t = crate::ctypes::c_int; -pub type __kernel_off_t = __kernel_long_t; -pub type __kernel_loff_t = crate::ctypes::c_longlong; -pub type __kernel_old_time_t = __kernel_long_t; -pub type __kernel_time_t = __kernel_long_t; -pub type __kernel_time64_t = crate::ctypes::c_longlong; -pub type __kernel_clock_t = __kernel_long_t; -pub type __kernel_timer_t = crate::ctypes::c_int; -pub type __kernel_clockid_t = crate::ctypes::c_int; -pub type __kernel_caddr_t = *mut crate::ctypes::c_char; -pub type __kernel_uid16_t = crate::ctypes::c_ushort; -pub type __kernel_gid16_t = crate::ctypes::c_ushort; -pub type __le16 = __u16; -pub type __be16 = __u16; -pub type __le32 = __u32; -pub type __be32 = __u32; -pub type __le64 = __u64; -pub type __be64 = __u64; -pub type __sum16 = __u16; -pub type __wsum = __u32; -pub type __poll_t = crate::ctypes::c_uint; -#[repr(C)] -#[derive(Default)] -pub struct __IncompleteArrayField(::core::marker::PhantomData, [T; 0]); -#[repr(C)] -#[derive(Copy, Clone)] -pub struct __kernel_sockaddr_storage { -pub __bindgen_anon_1: __kernel_sockaddr_storage__bindgen_ty_1, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct __kernel_sockaddr_storage__bindgen_ty_1__bindgen_ty_1 { -pub ss_family: __kernel_sa_family_t, -pub __data: [crate::ctypes::c_char; 126usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct sockaddr_nl { -pub nl_family: __kernel_sa_family_t, -pub nl_pad: crate::ctypes::c_ushort, -pub nl_pid: __u32, -pub nl_groups: __u32, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct nlmsghdr { -pub nlmsg_len: __u32, -pub nlmsg_type: __u16, -pub nlmsg_flags: __u16, -pub nlmsg_seq: __u32, -pub nlmsg_pid: __u32, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct nlmsgerr { -pub error: crate::ctypes::c_int, -pub msg: nlmsghdr, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct nl_pktinfo { -pub group: __u32, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct nl_mmap_req { -pub nm_block_size: crate::ctypes::c_uint, -pub nm_block_nr: crate::ctypes::c_uint, -pub nm_frame_size: crate::ctypes::c_uint, -pub nm_frame_nr: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct nl_mmap_hdr { -pub nm_status: crate::ctypes::c_uint, -pub nm_len: crate::ctypes::c_uint, -pub nm_group: __u32, -pub nm_pid: __u32, -pub nm_uid: __u32, -pub nm_gid: __u32, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct nlattr { -pub nla_len: __u16, -pub nla_type: __u16, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct nla_bitfield32 { -pub value: __u32, -pub selector: __u32, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct rtnl_link_stats { -pub rx_packets: __u32, -pub tx_packets: __u32, -pub rx_bytes: __u32, -pub tx_bytes: __u32, -pub rx_errors: __u32, -pub tx_errors: __u32, -pub rx_dropped: __u32, -pub tx_dropped: __u32, -pub multicast: __u32, -pub collisions: __u32, -pub rx_length_errors: __u32, -pub rx_over_errors: __u32, -pub rx_crc_errors: __u32, -pub rx_frame_errors: __u32, -pub rx_fifo_errors: __u32, -pub rx_missed_errors: __u32, -pub tx_aborted_errors: __u32, -pub tx_carrier_errors: __u32, -pub tx_fifo_errors: __u32, -pub tx_heartbeat_errors: __u32, -pub tx_window_errors: __u32, -pub rx_compressed: __u32, -pub tx_compressed: __u32, -pub rx_nohandler: __u32, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct rtnl_link_stats64 { -pub rx_packets: __u64, -pub tx_packets: __u64, -pub rx_bytes: __u64, -pub tx_bytes: __u64, -pub rx_errors: __u64, -pub tx_errors: __u64, -pub rx_dropped: __u64, -pub tx_dropped: __u64, -pub multicast: __u64, -pub collisions: __u64, -pub rx_length_errors: __u64, -pub rx_over_errors: __u64, -pub rx_crc_errors: __u64, -pub rx_frame_errors: __u64, -pub rx_fifo_errors: __u64, -pub rx_missed_errors: __u64, -pub tx_aborted_errors: __u64, -pub tx_carrier_errors: __u64, -pub tx_fifo_errors: __u64, -pub tx_heartbeat_errors: __u64, -pub tx_window_errors: __u64, -pub rx_compressed: __u64, -pub tx_compressed: __u64, -pub rx_nohandler: __u64, -pub rx_otherhost_dropped: __u64, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct rtnl_hw_stats64 { -pub rx_packets: __u64, -pub tx_packets: __u64, -pub rx_bytes: __u64, -pub tx_bytes: __u64, -pub rx_errors: __u64, -pub tx_errors: __u64, -pub rx_dropped: __u64, -pub tx_dropped: __u64, -pub multicast: __u64, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct rtnl_link_ifmap { -pub mem_start: __u64, -pub mem_end: __u64, -pub base_addr: __u64, -pub irq: __u16, -pub dma: __u8, -pub port: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ifla_bridge_id { -pub prio: [__u8; 2usize], -pub addr: [__u8; 6usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ifla_cacheinfo { -pub max_reasm_len: __u32, -pub tstamp: __u32, -pub reachable_time: __u32, -pub retrans_time: __u32, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ifla_vlan_flags { -pub flags: __u32, -pub mask: __u32, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ifla_vlan_qos_mapping { -pub from: __u32, -pub to: __u32, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct tunnel_msg { -pub family: __u8, -pub flags: __u8, -pub reserved2: __u16, -pub ifindex: __u32, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ifla_vxlan_port_range { -pub low: __be16, -pub high: __be16, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ifla_vf_mac { -pub vf: __u32, -pub mac: [__u8; 32usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ifla_vf_broadcast { -pub broadcast: [__u8; 32usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ifla_vf_vlan { -pub vf: __u32, -pub vlan: __u32, -pub qos: __u32, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ifla_vf_vlan_info { -pub vf: __u32, -pub vlan: __u32, -pub qos: __u32, -pub vlan_proto: __be16, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ifla_vf_tx_rate { -pub vf: __u32, -pub rate: __u32, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ifla_vf_rate { -pub vf: __u32, -pub min_tx_rate: __u32, -pub max_tx_rate: __u32, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ifla_vf_spoofchk { -pub vf: __u32, -pub setting: __u32, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ifla_vf_guid { -pub vf: __u32, -pub guid: __u64, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ifla_vf_link_state { -pub vf: __u32, -pub link_state: __u32, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ifla_vf_rss_query_en { -pub vf: __u32, -pub setting: __u32, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ifla_vf_trust { -pub vf: __u32, -pub setting: __u32, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ifla_port_vsi { -pub vsi_mgr_id: __u8, -pub vsi_type_id: [__u8; 3usize], -pub vsi_type_version: __u8, -pub pad: [__u8; 3usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct if_stats_msg { -pub family: __u8, -pub pad1: __u8, -pub pad2: __u16, -pub ifindex: __u32, -pub filter_mask: __u32, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ifla_rmnet_flags { -pub flags: __u32, -pub mask: __u32, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ifaddrmsg { -pub ifa_family: __u8, -pub ifa_prefixlen: __u8, -pub ifa_flags: __u8, -pub ifa_scope: __u8, -pub ifa_index: __u32, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ifa_cacheinfo { -pub ifa_prefered: __u32, -pub ifa_valid: __u32, -pub cstamp: __u32, -pub tstamp: __u32, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ndmsg { -pub ndm_family: __u8, -pub ndm_pad1: __u8, -pub ndm_pad2: __u16, -pub ndm_ifindex: __s32, -pub ndm_state: __u16, -pub ndm_flags: __u8, -pub ndm_type: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct nda_cacheinfo { -pub ndm_confirmed: __u32, -pub ndm_used: __u32, -pub ndm_updated: __u32, -pub ndm_refcnt: __u32, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ndt_stats { -pub ndts_allocs: __u64, -pub ndts_destroys: __u64, -pub ndts_hash_grows: __u64, -pub ndts_res_failed: __u64, -pub ndts_lookups: __u64, -pub ndts_hits: __u64, -pub ndts_rcv_probes_mcast: __u64, -pub ndts_rcv_probes_ucast: __u64, -pub ndts_periodic_gc_runs: __u64, -pub ndts_forced_gc_runs: __u64, -pub ndts_table_fulls: __u64, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ndtmsg { -pub ndtm_family: __u8, -pub ndtm_pad1: __u8, -pub ndtm_pad2: __u16, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ndt_config { -pub ndtc_key_len: __u16, -pub ndtc_entry_size: __u16, -pub ndtc_entries: __u32, -pub ndtc_last_flush: __u32, -pub ndtc_last_rand: __u32, -pub ndtc_hash_rnd: __u32, -pub ndtc_hash_mask: __u32, -pub ndtc_hash_chain_gc: __u32, -pub ndtc_proxy_qlen: __u32, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct rtattr { -pub rta_len: crate::ctypes::c_ushort, -pub rta_type: crate::ctypes::c_ushort, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct rtmsg { -pub rtm_family: crate::ctypes::c_uchar, -pub rtm_dst_len: crate::ctypes::c_uchar, -pub rtm_src_len: crate::ctypes::c_uchar, -pub rtm_tos: crate::ctypes::c_uchar, -pub rtm_table: crate::ctypes::c_uchar, -pub rtm_protocol: crate::ctypes::c_uchar, -pub rtm_scope: crate::ctypes::c_uchar, -pub rtm_type: crate::ctypes::c_uchar, -pub rtm_flags: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct rtnexthop { -pub rtnh_len: crate::ctypes::c_ushort, -pub rtnh_flags: crate::ctypes::c_uchar, -pub rtnh_hops: crate::ctypes::c_uchar, -pub rtnh_ifindex: crate::ctypes::c_int, -} -#[repr(C)] -#[derive(Debug)] -pub struct rtvia { -pub rtvia_family: __kernel_sa_family_t, -pub rtvia_addr: __IncompleteArrayField<__u8>, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct rta_cacheinfo { -pub rta_clntref: __u32, -pub rta_lastuse: __u32, -pub rta_expires: __s32, -pub rta_error: __u32, -pub rta_used: __u32, -pub rta_id: __u32, -pub rta_ts: __u32, -pub rta_tsage: __u32, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct rta_session { -pub proto: __u8, -pub pad1: __u8, -pub pad2: __u16, -pub u: rta_session__bindgen_ty_1, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct rta_session__bindgen_ty_1__bindgen_ty_1 { -pub sport: __u16, -pub dport: __u16, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct rta_session__bindgen_ty_1__bindgen_ty_2 { -pub type_: __u8, -pub code: __u8, -pub ident: __u16, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct rta_mfc_stats { -pub mfcs_packets: __u64, -pub mfcs_bytes: __u64, -pub mfcs_wrong_if: __u64, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct rtgenmsg { -pub rtgen_family: crate::ctypes::c_uchar, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ifinfomsg { -pub ifi_family: crate::ctypes::c_uchar, -pub __ifi_pad: crate::ctypes::c_uchar, -pub ifi_type: crate::ctypes::c_ushort, -pub ifi_index: crate::ctypes::c_int, -pub ifi_flags: crate::ctypes::c_uint, -pub ifi_change: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct prefixmsg { -pub prefix_family: crate::ctypes::c_uchar, -pub prefix_pad1: crate::ctypes::c_uchar, -pub prefix_pad2: crate::ctypes::c_ushort, -pub prefix_ifindex: crate::ctypes::c_int, -pub prefix_type: crate::ctypes::c_uchar, -pub prefix_len: crate::ctypes::c_uchar, -pub prefix_flags: crate::ctypes::c_uchar, -pub prefix_pad3: crate::ctypes::c_uchar, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct prefix_cacheinfo { -pub preferred_time: __u32, -pub valid_time: __u32, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct tcmsg { -pub tcm_family: crate::ctypes::c_uchar, -pub tcm__pad1: crate::ctypes::c_uchar, -pub tcm__pad2: crate::ctypes::c_ushort, -pub tcm_ifindex: crate::ctypes::c_int, -pub tcm_handle: __u32, -pub tcm_parent: __u32, -pub tcm_info: __u32, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct nduseroptmsg { -pub nduseropt_family: crate::ctypes::c_uchar, -pub nduseropt_pad1: crate::ctypes::c_uchar, -pub nduseropt_opts_len: crate::ctypes::c_ushort, -pub nduseropt_ifindex: crate::ctypes::c_int, -pub nduseropt_icmp_type: __u8, -pub nduseropt_icmp_code: __u8, -pub nduseropt_pad2: crate::ctypes::c_ushort, -pub nduseropt_pad3: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct tcamsg { -pub tca_family: crate::ctypes::c_uchar, -pub tca__pad1: crate::ctypes::c_uchar, -pub tca__pad2: crate::ctypes::c_ushort, -} -pub const _K_SS_MAXSIZE: u32 = 128; -pub const SOCK_SNDBUF_LOCK: u32 = 1; -pub const SOCK_RCVBUF_LOCK: u32 = 2; -pub const SOCK_BUF_LOCK_MASK: u32 = 3; -pub const SOCK_TXREHASH_DEFAULT: u32 = 255; -pub const SOCK_TXREHASH_DISABLED: u32 = 0; -pub const SOCK_TXREHASH_ENABLED: u32 = 1; -pub const NETLINK_ROUTE: u32 = 0; -pub const NETLINK_UNUSED: u32 = 1; -pub const NETLINK_USERSOCK: u32 = 2; -pub const NETLINK_FIREWALL: u32 = 3; -pub const NETLINK_SOCK_DIAG: u32 = 4; -pub const NETLINK_NFLOG: u32 = 5; -pub const NETLINK_XFRM: u32 = 6; -pub const NETLINK_SELINUX: u32 = 7; -pub const NETLINK_ISCSI: u32 = 8; -pub const NETLINK_AUDIT: u32 = 9; -pub const NETLINK_FIB_LOOKUP: u32 = 10; -pub const NETLINK_CONNECTOR: u32 = 11; -pub const NETLINK_NETFILTER: u32 = 12; -pub const NETLINK_IP6_FW: u32 = 13; -pub const NETLINK_DNRTMSG: u32 = 14; -pub const NETLINK_KOBJECT_UEVENT: u32 = 15; -pub const NETLINK_GENERIC: u32 = 16; -pub const NETLINK_SCSITRANSPORT: u32 = 18; -pub const NETLINK_ECRYPTFS: u32 = 19; -pub const NETLINK_RDMA: u32 = 20; -pub const NETLINK_CRYPTO: u32 = 21; -pub const NETLINK_SMC: u32 = 22; -pub const NETLINK_INET_DIAG: u32 = 4; -pub const MAX_LINKS: u32 = 32; -pub const NLM_F_REQUEST: u32 = 1; -pub const NLM_F_MULTI: u32 = 2; -pub const NLM_F_ACK: u32 = 4; -pub const NLM_F_ECHO: u32 = 8; -pub const NLM_F_DUMP_INTR: u32 = 16; -pub const NLM_F_DUMP_FILTERED: u32 = 32; -pub const NLM_F_ROOT: u32 = 256; -pub const NLM_F_MATCH: u32 = 512; -pub const NLM_F_ATOMIC: u32 = 1024; -pub const NLM_F_DUMP: u32 = 768; -pub const NLM_F_REPLACE: u32 = 256; -pub const NLM_F_EXCL: u32 = 512; -pub const NLM_F_CREATE: u32 = 1024; -pub const NLM_F_APPEND: u32 = 2048; -pub const NLM_F_NONREC: u32 = 256; -pub const NLM_F_BULK: u32 = 512; -pub const NLM_F_CAPPED: u32 = 256; -pub const NLM_F_ACK_TLVS: u32 = 512; -pub const NLMSG_ALIGNTO: u32 = 4; -pub const NLMSG_NOOP: u32 = 1; -pub const NLMSG_ERROR: u32 = 2; -pub const NLMSG_DONE: u32 = 3; -pub const NLMSG_OVERRUN: u32 = 4; -pub const NLMSG_MIN_TYPE: u32 = 16; -pub const NETLINK_ADD_MEMBERSHIP: u32 = 1; -pub const NETLINK_DROP_MEMBERSHIP: u32 = 2; -pub const NETLINK_PKTINFO: u32 = 3; -pub const NETLINK_BROADCAST_ERROR: u32 = 4; -pub const NETLINK_NO_ENOBUFS: u32 = 5; -pub const NETLINK_RX_RING: u32 = 6; -pub const NETLINK_TX_RING: u32 = 7; -pub const NETLINK_LISTEN_ALL_NSID: u32 = 8; -pub const NETLINK_LIST_MEMBERSHIPS: u32 = 9; -pub const NETLINK_CAP_ACK: u32 = 10; -pub const NETLINK_EXT_ACK: u32 = 11; -pub const NETLINK_GET_STRICT_CHK: u32 = 12; -pub const NL_MMAP_MSG_ALIGNMENT: u32 = 4; -pub const NET_MAJOR: u32 = 36; -pub const NLA_F_NESTED: u32 = 32768; -pub const NLA_F_NET_BYTEORDER: u32 = 16384; -pub const NLA_TYPE_MASK: i32 = -49153; -pub const NLA_ALIGNTO: u32 = 4; -pub const MACVLAN_FLAG_NOPROMISC: u32 = 1; -pub const MACVLAN_FLAG_NODST: u32 = 2; -pub const IPVLAN_F_PRIVATE: u32 = 1; -pub const IPVLAN_F_VEPA: u32 = 2; -pub const TUNNEL_MSG_FLAG_STATS: u32 = 1; -pub const TUNNEL_MSG_VALID_USER_FLAGS: u32 = 1; -pub const MAX_VLAN_LIST_LEN: u32 = 1; -pub const PORT_PROFILE_MAX: u32 = 40; -pub const PORT_UUID_MAX: u32 = 16; -pub const PORT_SELF_VF: i32 = -1; -pub const XDP_FLAGS_UPDATE_IF_NOEXIST: u32 = 1; -pub const XDP_FLAGS_SKB_MODE: u32 = 2; -pub const XDP_FLAGS_DRV_MODE: u32 = 4; -pub const XDP_FLAGS_HW_MODE: u32 = 8; -pub const XDP_FLAGS_REPLACE: u32 = 16; -pub const XDP_FLAGS_MODES: u32 = 14; -pub const XDP_FLAGS_MASK: u32 = 31; -pub const RMNET_FLAGS_INGRESS_DEAGGREGATION: u32 = 1; -pub const RMNET_FLAGS_INGRESS_MAP_COMMANDS: u32 = 2; -pub const RMNET_FLAGS_INGRESS_MAP_CKSUMV4: u32 = 4; -pub const RMNET_FLAGS_EGRESS_MAP_CKSUMV4: u32 = 8; -pub const RMNET_FLAGS_INGRESS_MAP_CKSUMV5: u32 = 16; -pub const RMNET_FLAGS_EGRESS_MAP_CKSUMV5: u32 = 32; -pub const IFA_F_SECONDARY: u32 = 1; -pub const IFA_F_TEMPORARY: u32 = 1; -pub const IFA_F_NODAD: u32 = 2; -pub const IFA_F_OPTIMISTIC: u32 = 4; -pub const IFA_F_DADFAILED: u32 = 8; -pub const IFA_F_HOMEADDRESS: u32 = 16; -pub const IFA_F_DEPRECATED: u32 = 32; -pub const IFA_F_TENTATIVE: u32 = 64; -pub const IFA_F_PERMANENT: u32 = 128; -pub const IFA_F_MANAGETEMPADDR: u32 = 256; -pub const IFA_F_NOPREFIXROUTE: u32 = 512; -pub const IFA_F_MCAUTOJOIN: u32 = 1024; -pub const IFA_F_STABLE_PRIVACY: u32 = 2048; -pub const IFAPROT_UNSPEC: u32 = 0; -pub const IFAPROT_KERNEL_LO: u32 = 1; -pub const IFAPROT_KERNEL_RA: u32 = 2; -pub const IFAPROT_KERNEL_LL: u32 = 3; -pub const NTF_USE: u32 = 1; -pub const NTF_SELF: u32 = 2; -pub const NTF_MASTER: u32 = 4; -pub const NTF_PROXY: u32 = 8; -pub const NTF_EXT_LEARNED: u32 = 16; -pub const NTF_OFFLOADED: u32 = 32; -pub const NTF_STICKY: u32 = 64; -pub const NTF_ROUTER: u32 = 128; -pub const NTF_EXT_MANAGED: u32 = 1; -pub const NTF_EXT_LOCKED: u32 = 2; -pub const NUD_INCOMPLETE: u32 = 1; -pub const NUD_REACHABLE: u32 = 2; -pub const NUD_STALE: u32 = 4; -pub const NUD_DELAY: u32 = 8; -pub const NUD_PROBE: u32 = 16; -pub const NUD_FAILED: u32 = 32; -pub const NUD_NOARP: u32 = 64; -pub const NUD_PERMANENT: u32 = 128; -pub const NUD_NONE: u32 = 0; -pub const RTNL_FAMILY_IPMR: u32 = 128; -pub const RTNL_FAMILY_IP6MR: u32 = 129; -pub const RTNL_FAMILY_MAX: u32 = 129; -pub const RTA_ALIGNTO: u32 = 4; -pub const RTPROT_UNSPEC: u32 = 0; -pub const RTPROT_REDIRECT: u32 = 1; -pub const RTPROT_KERNEL: u32 = 2; -pub const RTPROT_BOOT: u32 = 3; -pub const RTPROT_STATIC: u32 = 4; -pub const RTPROT_GATED: u32 = 8; -pub const RTPROT_RA: u32 = 9; -pub const RTPROT_MRT: u32 = 10; -pub const RTPROT_ZEBRA: u32 = 11; -pub const RTPROT_BIRD: u32 = 12; -pub const RTPROT_DNROUTED: u32 = 13; -pub const RTPROT_XORP: u32 = 14; -pub const RTPROT_NTK: u32 = 15; -pub const RTPROT_DHCP: u32 = 16; -pub const RTPROT_MROUTED: u32 = 17; -pub const RTPROT_KEEPALIVED: u32 = 18; -pub const RTPROT_BABEL: u32 = 42; -pub const RTPROT_OPENR: u32 = 99; -pub const RTPROT_BGP: u32 = 186; -pub const RTPROT_ISIS: u32 = 187; -pub const RTPROT_OSPF: u32 = 188; -pub const RTPROT_RIP: u32 = 189; -pub const RTPROT_EIGRP: u32 = 192; -pub const RTM_F_NOTIFY: u32 = 256; -pub const RTM_F_CLONED: u32 = 512; -pub const RTM_F_EQUALIZE: u32 = 1024; -pub const RTM_F_PREFIX: u32 = 2048; -pub const RTM_F_LOOKUP_TABLE: u32 = 4096; -pub const RTM_F_FIB_MATCH: u32 = 8192; -pub const RTM_F_OFFLOAD: u32 = 16384; -pub const RTM_F_TRAP: u32 = 32768; -pub const RTM_F_OFFLOAD_FAILED: u32 = 536870912; -pub const RTNH_F_DEAD: u32 = 1; -pub const RTNH_F_PERVASIVE: u32 = 2; -pub const RTNH_F_ONLINK: u32 = 4; -pub const RTNH_F_OFFLOAD: u32 = 8; -pub const RTNH_F_LINKDOWN: u32 = 16; -pub const RTNH_F_UNRESOLVED: u32 = 32; -pub const RTNH_F_TRAP: u32 = 64; -pub const RTNH_COMPARE_MASK: u32 = 89; -pub const RTNH_ALIGNTO: u32 = 4; -pub const RTNETLINK_HAVE_PEERINFO: u32 = 1; -pub const RTAX_FEATURE_ECN: u32 = 1; -pub const RTAX_FEATURE_SACK: u32 = 2; -pub const RTAX_FEATURE_TIMESTAMP: u32 = 4; -pub const RTAX_FEATURE_ALLFRAG: u32 = 8; -pub const RTAX_FEATURE_MASK: u32 = 15; -pub const TCM_IFINDEX_MAGIC_BLOCK: u32 = 4294967295; -pub const TCA_DUMP_FLAGS_TERSE: u32 = 1; -pub const RTMGRP_LINK: u32 = 1; -pub const RTMGRP_NOTIFY: u32 = 2; -pub const RTMGRP_NEIGH: u32 = 4; -pub const RTMGRP_TC: u32 = 8; -pub const RTMGRP_IPV4_IFADDR: u32 = 16; -pub const RTMGRP_IPV4_MROUTE: u32 = 32; -pub const RTMGRP_IPV4_ROUTE: u32 = 64; -pub const RTMGRP_IPV4_RULE: u32 = 128; -pub const RTMGRP_IPV6_IFADDR: u32 = 256; -pub const RTMGRP_IPV6_MROUTE: u32 = 512; -pub const RTMGRP_IPV6_ROUTE: u32 = 1024; -pub const RTMGRP_IPV6_IFINFO: u32 = 2048; -pub const RTMGRP_DECnet_IFADDR: u32 = 4096; -pub const RTMGRP_DECnet_ROUTE: u32 = 16384; -pub const RTMGRP_IPV6_PREFIX: u32 = 131072; -pub const TCA_FLAG_LARGE_DUMP_ON: u32 = 1; -pub const TCA_ACT_FLAG_LARGE_DUMP_ON: u32 = 1; -pub const TCA_ACT_FLAG_TERSE_DUMP: u32 = 2; -pub const RTEXT_FILTER_VF: u32 = 1; -pub const RTEXT_FILTER_BRVLAN: u32 = 2; -pub const RTEXT_FILTER_BRVLAN_COMPRESSED: u32 = 4; -pub const RTEXT_FILTER_SKIP_STATS: u32 = 8; -pub const RTEXT_FILTER_MRP: u32 = 16; -pub const RTEXT_FILTER_CFM_CONFIG: u32 = 32; -pub const RTEXT_FILTER_CFM_STATUS: u32 = 64; -pub const RTEXT_FILTER_MST: u32 = 128; -pub const NETLINK_UNCONNECTED: _bindgen_ty_1 = _bindgen_ty_1::NETLINK_UNCONNECTED; -pub const NETLINK_CONNECTED: _bindgen_ty_1 = _bindgen_ty_1::NETLINK_CONNECTED; -pub const IFLA_UNSPEC: _bindgen_ty_2 = _bindgen_ty_2::IFLA_UNSPEC; -pub const IFLA_ADDRESS: _bindgen_ty_2 = _bindgen_ty_2::IFLA_ADDRESS; -pub const IFLA_BROADCAST: _bindgen_ty_2 = _bindgen_ty_2::IFLA_BROADCAST; -pub const IFLA_IFNAME: _bindgen_ty_2 = _bindgen_ty_2::IFLA_IFNAME; -pub const IFLA_MTU: _bindgen_ty_2 = _bindgen_ty_2::IFLA_MTU; -pub const IFLA_LINK: _bindgen_ty_2 = _bindgen_ty_2::IFLA_LINK; -pub const IFLA_QDISC: _bindgen_ty_2 = _bindgen_ty_2::IFLA_QDISC; -pub const IFLA_STATS: _bindgen_ty_2 = _bindgen_ty_2::IFLA_STATS; -pub const IFLA_COST: _bindgen_ty_2 = _bindgen_ty_2::IFLA_COST; -pub const IFLA_PRIORITY: _bindgen_ty_2 = _bindgen_ty_2::IFLA_PRIORITY; -pub const IFLA_MASTER: _bindgen_ty_2 = _bindgen_ty_2::IFLA_MASTER; -pub const IFLA_WIRELESS: _bindgen_ty_2 = _bindgen_ty_2::IFLA_WIRELESS; -pub const IFLA_PROTINFO: _bindgen_ty_2 = _bindgen_ty_2::IFLA_PROTINFO; -pub const IFLA_TXQLEN: _bindgen_ty_2 = _bindgen_ty_2::IFLA_TXQLEN; -pub const IFLA_MAP: _bindgen_ty_2 = _bindgen_ty_2::IFLA_MAP; -pub const IFLA_WEIGHT: _bindgen_ty_2 = _bindgen_ty_2::IFLA_WEIGHT; -pub const IFLA_OPERSTATE: _bindgen_ty_2 = _bindgen_ty_2::IFLA_OPERSTATE; -pub const IFLA_LINKMODE: _bindgen_ty_2 = _bindgen_ty_2::IFLA_LINKMODE; -pub const IFLA_LINKINFO: _bindgen_ty_2 = _bindgen_ty_2::IFLA_LINKINFO; -pub const IFLA_NET_NS_PID: _bindgen_ty_2 = _bindgen_ty_2::IFLA_NET_NS_PID; -pub const IFLA_IFALIAS: _bindgen_ty_2 = _bindgen_ty_2::IFLA_IFALIAS; -pub const IFLA_NUM_VF: _bindgen_ty_2 = _bindgen_ty_2::IFLA_NUM_VF; -pub const IFLA_VFINFO_LIST: _bindgen_ty_2 = _bindgen_ty_2::IFLA_VFINFO_LIST; -pub const IFLA_STATS64: _bindgen_ty_2 = _bindgen_ty_2::IFLA_STATS64; -pub const IFLA_VF_PORTS: _bindgen_ty_2 = _bindgen_ty_2::IFLA_VF_PORTS; -pub const IFLA_PORT_SELF: _bindgen_ty_2 = _bindgen_ty_2::IFLA_PORT_SELF; -pub const IFLA_AF_SPEC: _bindgen_ty_2 = _bindgen_ty_2::IFLA_AF_SPEC; -pub const IFLA_GROUP: _bindgen_ty_2 = _bindgen_ty_2::IFLA_GROUP; -pub const IFLA_NET_NS_FD: _bindgen_ty_2 = _bindgen_ty_2::IFLA_NET_NS_FD; -pub const IFLA_EXT_MASK: _bindgen_ty_2 = _bindgen_ty_2::IFLA_EXT_MASK; -pub const IFLA_PROMISCUITY: _bindgen_ty_2 = _bindgen_ty_2::IFLA_PROMISCUITY; -pub const IFLA_NUM_TX_QUEUES: _bindgen_ty_2 = _bindgen_ty_2::IFLA_NUM_TX_QUEUES; -pub const IFLA_NUM_RX_QUEUES: _bindgen_ty_2 = _bindgen_ty_2::IFLA_NUM_RX_QUEUES; -pub const IFLA_CARRIER: _bindgen_ty_2 = _bindgen_ty_2::IFLA_CARRIER; -pub const IFLA_PHYS_PORT_ID: _bindgen_ty_2 = _bindgen_ty_2::IFLA_PHYS_PORT_ID; -pub const IFLA_CARRIER_CHANGES: _bindgen_ty_2 = _bindgen_ty_2::IFLA_CARRIER_CHANGES; -pub const IFLA_PHYS_SWITCH_ID: _bindgen_ty_2 = _bindgen_ty_2::IFLA_PHYS_SWITCH_ID; -pub const IFLA_LINK_NETNSID: _bindgen_ty_2 = _bindgen_ty_2::IFLA_LINK_NETNSID; -pub const IFLA_PHYS_PORT_NAME: _bindgen_ty_2 = _bindgen_ty_2::IFLA_PHYS_PORT_NAME; -pub const IFLA_PROTO_DOWN: _bindgen_ty_2 = _bindgen_ty_2::IFLA_PROTO_DOWN; -pub const IFLA_GSO_MAX_SEGS: _bindgen_ty_2 = _bindgen_ty_2::IFLA_GSO_MAX_SEGS; -pub const IFLA_GSO_MAX_SIZE: _bindgen_ty_2 = _bindgen_ty_2::IFLA_GSO_MAX_SIZE; -pub const IFLA_PAD: _bindgen_ty_2 = _bindgen_ty_2::IFLA_PAD; -pub const IFLA_XDP: _bindgen_ty_2 = _bindgen_ty_2::IFLA_XDP; -pub const IFLA_EVENT: _bindgen_ty_2 = _bindgen_ty_2::IFLA_EVENT; -pub const IFLA_NEW_NETNSID: _bindgen_ty_2 = _bindgen_ty_2::IFLA_NEW_NETNSID; -pub const IFLA_IF_NETNSID: _bindgen_ty_2 = _bindgen_ty_2::IFLA_IF_NETNSID; -pub const IFLA_TARGET_NETNSID: _bindgen_ty_2 = _bindgen_ty_2::IFLA_IF_NETNSID; -pub const IFLA_CARRIER_UP_COUNT: _bindgen_ty_2 = _bindgen_ty_2::IFLA_CARRIER_UP_COUNT; -pub const IFLA_CARRIER_DOWN_COUNT: _bindgen_ty_2 = _bindgen_ty_2::IFLA_CARRIER_DOWN_COUNT; -pub const IFLA_NEW_IFINDEX: _bindgen_ty_2 = _bindgen_ty_2::IFLA_NEW_IFINDEX; -pub const IFLA_MIN_MTU: _bindgen_ty_2 = _bindgen_ty_2::IFLA_MIN_MTU; -pub const IFLA_MAX_MTU: _bindgen_ty_2 = _bindgen_ty_2::IFLA_MAX_MTU; -pub const IFLA_PROP_LIST: _bindgen_ty_2 = _bindgen_ty_2::IFLA_PROP_LIST; -pub const IFLA_ALT_IFNAME: _bindgen_ty_2 = _bindgen_ty_2::IFLA_ALT_IFNAME; -pub const IFLA_PERM_ADDRESS: _bindgen_ty_2 = _bindgen_ty_2::IFLA_PERM_ADDRESS; -pub const IFLA_PROTO_DOWN_REASON: _bindgen_ty_2 = _bindgen_ty_2::IFLA_PROTO_DOWN_REASON; -pub const IFLA_PARENT_DEV_NAME: _bindgen_ty_2 = _bindgen_ty_2::IFLA_PARENT_DEV_NAME; -pub const IFLA_PARENT_DEV_BUS_NAME: _bindgen_ty_2 = _bindgen_ty_2::IFLA_PARENT_DEV_BUS_NAME; -pub const IFLA_GRO_MAX_SIZE: _bindgen_ty_2 = _bindgen_ty_2::IFLA_GRO_MAX_SIZE; -pub const IFLA_TSO_MAX_SIZE: _bindgen_ty_2 = _bindgen_ty_2::IFLA_TSO_MAX_SIZE; -pub const IFLA_TSO_MAX_SEGS: _bindgen_ty_2 = _bindgen_ty_2::IFLA_TSO_MAX_SEGS; -pub const IFLA_ALLMULTI: _bindgen_ty_2 = _bindgen_ty_2::IFLA_ALLMULTI; -pub const IFLA_DEVLINK_PORT: _bindgen_ty_2 = _bindgen_ty_2::IFLA_DEVLINK_PORT; -pub const IFLA_GSO_IPV4_MAX_SIZE: _bindgen_ty_2 = _bindgen_ty_2::IFLA_GSO_IPV4_MAX_SIZE; -pub const IFLA_GRO_IPV4_MAX_SIZE: _bindgen_ty_2 = _bindgen_ty_2::IFLA_GRO_IPV4_MAX_SIZE; -pub const __IFLA_MAX: _bindgen_ty_2 = _bindgen_ty_2::__IFLA_MAX; -pub const IFLA_PROTO_DOWN_REASON_UNSPEC: _bindgen_ty_3 = _bindgen_ty_3::IFLA_PROTO_DOWN_REASON_UNSPEC; -pub const IFLA_PROTO_DOWN_REASON_MASK: _bindgen_ty_3 = _bindgen_ty_3::IFLA_PROTO_DOWN_REASON_MASK; -pub const IFLA_PROTO_DOWN_REASON_VALUE: _bindgen_ty_3 = _bindgen_ty_3::IFLA_PROTO_DOWN_REASON_VALUE; -pub const __IFLA_PROTO_DOWN_REASON_CNT: _bindgen_ty_3 = _bindgen_ty_3::__IFLA_PROTO_DOWN_REASON_CNT; -pub const IFLA_PROTO_DOWN_REASON_MAX: _bindgen_ty_3 = _bindgen_ty_3::IFLA_PROTO_DOWN_REASON_VALUE; -pub const IFLA_INET_UNSPEC: _bindgen_ty_4 = _bindgen_ty_4::IFLA_INET_UNSPEC; -pub const IFLA_INET_CONF: _bindgen_ty_4 = _bindgen_ty_4::IFLA_INET_CONF; -pub const __IFLA_INET_MAX: _bindgen_ty_4 = _bindgen_ty_4::__IFLA_INET_MAX; -pub const IFLA_INET6_UNSPEC: _bindgen_ty_5 = _bindgen_ty_5::IFLA_INET6_UNSPEC; -pub const IFLA_INET6_FLAGS: _bindgen_ty_5 = _bindgen_ty_5::IFLA_INET6_FLAGS; -pub const IFLA_INET6_CONF: _bindgen_ty_5 = _bindgen_ty_5::IFLA_INET6_CONF; -pub const IFLA_INET6_STATS: _bindgen_ty_5 = _bindgen_ty_5::IFLA_INET6_STATS; -pub const IFLA_INET6_MCAST: _bindgen_ty_5 = _bindgen_ty_5::IFLA_INET6_MCAST; -pub const IFLA_INET6_CACHEINFO: _bindgen_ty_5 = _bindgen_ty_5::IFLA_INET6_CACHEINFO; -pub const IFLA_INET6_ICMP6STATS: _bindgen_ty_5 = _bindgen_ty_5::IFLA_INET6_ICMP6STATS; -pub const IFLA_INET6_TOKEN: _bindgen_ty_5 = _bindgen_ty_5::IFLA_INET6_TOKEN; -pub const IFLA_INET6_ADDR_GEN_MODE: _bindgen_ty_5 = _bindgen_ty_5::IFLA_INET6_ADDR_GEN_MODE; -pub const IFLA_INET6_RA_MTU: _bindgen_ty_5 = _bindgen_ty_5::IFLA_INET6_RA_MTU; -pub const __IFLA_INET6_MAX: _bindgen_ty_5 = _bindgen_ty_5::__IFLA_INET6_MAX; -pub const IFLA_BR_UNSPEC: _bindgen_ty_6 = _bindgen_ty_6::IFLA_BR_UNSPEC; -pub const IFLA_BR_FORWARD_DELAY: _bindgen_ty_6 = _bindgen_ty_6::IFLA_BR_FORWARD_DELAY; -pub const IFLA_BR_HELLO_TIME: _bindgen_ty_6 = _bindgen_ty_6::IFLA_BR_HELLO_TIME; -pub const IFLA_BR_MAX_AGE: _bindgen_ty_6 = _bindgen_ty_6::IFLA_BR_MAX_AGE; -pub const IFLA_BR_AGEING_TIME: _bindgen_ty_6 = _bindgen_ty_6::IFLA_BR_AGEING_TIME; -pub const IFLA_BR_STP_STATE: _bindgen_ty_6 = _bindgen_ty_6::IFLA_BR_STP_STATE; -pub const IFLA_BR_PRIORITY: _bindgen_ty_6 = _bindgen_ty_6::IFLA_BR_PRIORITY; -pub const IFLA_BR_VLAN_FILTERING: _bindgen_ty_6 = _bindgen_ty_6::IFLA_BR_VLAN_FILTERING; -pub const IFLA_BR_VLAN_PROTOCOL: _bindgen_ty_6 = _bindgen_ty_6::IFLA_BR_VLAN_PROTOCOL; -pub const IFLA_BR_GROUP_FWD_MASK: _bindgen_ty_6 = _bindgen_ty_6::IFLA_BR_GROUP_FWD_MASK; -pub const IFLA_BR_ROOT_ID: _bindgen_ty_6 = _bindgen_ty_6::IFLA_BR_ROOT_ID; -pub const IFLA_BR_BRIDGE_ID: _bindgen_ty_6 = _bindgen_ty_6::IFLA_BR_BRIDGE_ID; -pub const IFLA_BR_ROOT_PORT: _bindgen_ty_6 = _bindgen_ty_6::IFLA_BR_ROOT_PORT; -pub const IFLA_BR_ROOT_PATH_COST: _bindgen_ty_6 = _bindgen_ty_6::IFLA_BR_ROOT_PATH_COST; -pub const IFLA_BR_TOPOLOGY_CHANGE: _bindgen_ty_6 = _bindgen_ty_6::IFLA_BR_TOPOLOGY_CHANGE; -pub const IFLA_BR_TOPOLOGY_CHANGE_DETECTED: _bindgen_ty_6 = _bindgen_ty_6::IFLA_BR_TOPOLOGY_CHANGE_DETECTED; -pub const IFLA_BR_HELLO_TIMER: _bindgen_ty_6 = _bindgen_ty_6::IFLA_BR_HELLO_TIMER; -pub const IFLA_BR_TCN_TIMER: _bindgen_ty_6 = _bindgen_ty_6::IFLA_BR_TCN_TIMER; -pub const IFLA_BR_TOPOLOGY_CHANGE_TIMER: _bindgen_ty_6 = _bindgen_ty_6::IFLA_BR_TOPOLOGY_CHANGE_TIMER; -pub const IFLA_BR_GC_TIMER: _bindgen_ty_6 = _bindgen_ty_6::IFLA_BR_GC_TIMER; -pub const IFLA_BR_GROUP_ADDR: _bindgen_ty_6 = _bindgen_ty_6::IFLA_BR_GROUP_ADDR; -pub const IFLA_BR_FDB_FLUSH: _bindgen_ty_6 = _bindgen_ty_6::IFLA_BR_FDB_FLUSH; -pub const IFLA_BR_MCAST_ROUTER: _bindgen_ty_6 = _bindgen_ty_6::IFLA_BR_MCAST_ROUTER; -pub const IFLA_BR_MCAST_SNOOPING: _bindgen_ty_6 = _bindgen_ty_6::IFLA_BR_MCAST_SNOOPING; -pub const IFLA_BR_MCAST_QUERY_USE_IFADDR: _bindgen_ty_6 = _bindgen_ty_6::IFLA_BR_MCAST_QUERY_USE_IFADDR; -pub const IFLA_BR_MCAST_QUERIER: _bindgen_ty_6 = _bindgen_ty_6::IFLA_BR_MCAST_QUERIER; -pub const IFLA_BR_MCAST_HASH_ELASTICITY: _bindgen_ty_6 = _bindgen_ty_6::IFLA_BR_MCAST_HASH_ELASTICITY; -pub const IFLA_BR_MCAST_HASH_MAX: _bindgen_ty_6 = _bindgen_ty_6::IFLA_BR_MCAST_HASH_MAX; -pub const IFLA_BR_MCAST_LAST_MEMBER_CNT: _bindgen_ty_6 = _bindgen_ty_6::IFLA_BR_MCAST_LAST_MEMBER_CNT; -pub const IFLA_BR_MCAST_STARTUP_QUERY_CNT: _bindgen_ty_6 = _bindgen_ty_6::IFLA_BR_MCAST_STARTUP_QUERY_CNT; -pub const IFLA_BR_MCAST_LAST_MEMBER_INTVL: _bindgen_ty_6 = _bindgen_ty_6::IFLA_BR_MCAST_LAST_MEMBER_INTVL; -pub const IFLA_BR_MCAST_MEMBERSHIP_INTVL: _bindgen_ty_6 = _bindgen_ty_6::IFLA_BR_MCAST_MEMBERSHIP_INTVL; -pub const IFLA_BR_MCAST_QUERIER_INTVL: _bindgen_ty_6 = _bindgen_ty_6::IFLA_BR_MCAST_QUERIER_INTVL; -pub const IFLA_BR_MCAST_QUERY_INTVL: _bindgen_ty_6 = _bindgen_ty_6::IFLA_BR_MCAST_QUERY_INTVL; -pub const IFLA_BR_MCAST_QUERY_RESPONSE_INTVL: _bindgen_ty_6 = _bindgen_ty_6::IFLA_BR_MCAST_QUERY_RESPONSE_INTVL; -pub const IFLA_BR_MCAST_STARTUP_QUERY_INTVL: _bindgen_ty_6 = _bindgen_ty_6::IFLA_BR_MCAST_STARTUP_QUERY_INTVL; -pub const IFLA_BR_NF_CALL_IPTABLES: _bindgen_ty_6 = _bindgen_ty_6::IFLA_BR_NF_CALL_IPTABLES; -pub const IFLA_BR_NF_CALL_IP6TABLES: _bindgen_ty_6 = _bindgen_ty_6::IFLA_BR_NF_CALL_IP6TABLES; -pub const IFLA_BR_NF_CALL_ARPTABLES: _bindgen_ty_6 = _bindgen_ty_6::IFLA_BR_NF_CALL_ARPTABLES; -pub const IFLA_BR_VLAN_DEFAULT_PVID: _bindgen_ty_6 = _bindgen_ty_6::IFLA_BR_VLAN_DEFAULT_PVID; -pub const IFLA_BR_PAD: _bindgen_ty_6 = _bindgen_ty_6::IFLA_BR_PAD; -pub const IFLA_BR_VLAN_STATS_ENABLED: _bindgen_ty_6 = _bindgen_ty_6::IFLA_BR_VLAN_STATS_ENABLED; -pub const IFLA_BR_MCAST_STATS_ENABLED: _bindgen_ty_6 = _bindgen_ty_6::IFLA_BR_MCAST_STATS_ENABLED; -pub const IFLA_BR_MCAST_IGMP_VERSION: _bindgen_ty_6 = _bindgen_ty_6::IFLA_BR_MCAST_IGMP_VERSION; -pub const IFLA_BR_MCAST_MLD_VERSION: _bindgen_ty_6 = _bindgen_ty_6::IFLA_BR_MCAST_MLD_VERSION; -pub const IFLA_BR_VLAN_STATS_PER_PORT: _bindgen_ty_6 = _bindgen_ty_6::IFLA_BR_VLAN_STATS_PER_PORT; -pub const IFLA_BR_MULTI_BOOLOPT: _bindgen_ty_6 = _bindgen_ty_6::IFLA_BR_MULTI_BOOLOPT; -pub const IFLA_BR_MCAST_QUERIER_STATE: _bindgen_ty_6 = _bindgen_ty_6::IFLA_BR_MCAST_QUERIER_STATE; -pub const __IFLA_BR_MAX: _bindgen_ty_6 = _bindgen_ty_6::__IFLA_BR_MAX; -pub const BRIDGE_MODE_UNSPEC: _bindgen_ty_7 = _bindgen_ty_7::BRIDGE_MODE_UNSPEC; -pub const BRIDGE_MODE_HAIRPIN: _bindgen_ty_7 = _bindgen_ty_7::BRIDGE_MODE_HAIRPIN; -pub const IFLA_BRPORT_UNSPEC: _bindgen_ty_8 = _bindgen_ty_8::IFLA_BRPORT_UNSPEC; -pub const IFLA_BRPORT_STATE: _bindgen_ty_8 = _bindgen_ty_8::IFLA_BRPORT_STATE; -pub const IFLA_BRPORT_PRIORITY: _bindgen_ty_8 = _bindgen_ty_8::IFLA_BRPORT_PRIORITY; -pub const IFLA_BRPORT_COST: _bindgen_ty_8 = _bindgen_ty_8::IFLA_BRPORT_COST; -pub const IFLA_BRPORT_MODE: _bindgen_ty_8 = _bindgen_ty_8::IFLA_BRPORT_MODE; -pub const IFLA_BRPORT_GUARD: _bindgen_ty_8 = _bindgen_ty_8::IFLA_BRPORT_GUARD; -pub const IFLA_BRPORT_PROTECT: _bindgen_ty_8 = _bindgen_ty_8::IFLA_BRPORT_PROTECT; -pub const IFLA_BRPORT_FAST_LEAVE: _bindgen_ty_8 = _bindgen_ty_8::IFLA_BRPORT_FAST_LEAVE; -pub const IFLA_BRPORT_LEARNING: _bindgen_ty_8 = _bindgen_ty_8::IFLA_BRPORT_LEARNING; -pub const IFLA_BRPORT_UNICAST_FLOOD: _bindgen_ty_8 = _bindgen_ty_8::IFLA_BRPORT_UNICAST_FLOOD; -pub const IFLA_BRPORT_PROXYARP: _bindgen_ty_8 = _bindgen_ty_8::IFLA_BRPORT_PROXYARP; -pub const IFLA_BRPORT_LEARNING_SYNC: _bindgen_ty_8 = _bindgen_ty_8::IFLA_BRPORT_LEARNING_SYNC; -pub const IFLA_BRPORT_PROXYARP_WIFI: _bindgen_ty_8 = _bindgen_ty_8::IFLA_BRPORT_PROXYARP_WIFI; -pub const IFLA_BRPORT_ROOT_ID: _bindgen_ty_8 = _bindgen_ty_8::IFLA_BRPORT_ROOT_ID; -pub const IFLA_BRPORT_BRIDGE_ID: _bindgen_ty_8 = _bindgen_ty_8::IFLA_BRPORT_BRIDGE_ID; -pub const IFLA_BRPORT_DESIGNATED_PORT: _bindgen_ty_8 = _bindgen_ty_8::IFLA_BRPORT_DESIGNATED_PORT; -pub const IFLA_BRPORT_DESIGNATED_COST: _bindgen_ty_8 = _bindgen_ty_8::IFLA_BRPORT_DESIGNATED_COST; -pub const IFLA_BRPORT_ID: _bindgen_ty_8 = _bindgen_ty_8::IFLA_BRPORT_ID; -pub const IFLA_BRPORT_NO: _bindgen_ty_8 = _bindgen_ty_8::IFLA_BRPORT_NO; -pub const IFLA_BRPORT_TOPOLOGY_CHANGE_ACK: _bindgen_ty_8 = _bindgen_ty_8::IFLA_BRPORT_TOPOLOGY_CHANGE_ACK; -pub const IFLA_BRPORT_CONFIG_PENDING: _bindgen_ty_8 = _bindgen_ty_8::IFLA_BRPORT_CONFIG_PENDING; -pub const IFLA_BRPORT_MESSAGE_AGE_TIMER: _bindgen_ty_8 = _bindgen_ty_8::IFLA_BRPORT_MESSAGE_AGE_TIMER; -pub const IFLA_BRPORT_FORWARD_DELAY_TIMER: _bindgen_ty_8 = _bindgen_ty_8::IFLA_BRPORT_FORWARD_DELAY_TIMER; -pub const IFLA_BRPORT_HOLD_TIMER: _bindgen_ty_8 = _bindgen_ty_8::IFLA_BRPORT_HOLD_TIMER; -pub const IFLA_BRPORT_FLUSH: _bindgen_ty_8 = _bindgen_ty_8::IFLA_BRPORT_FLUSH; -pub const IFLA_BRPORT_MULTICAST_ROUTER: _bindgen_ty_8 = _bindgen_ty_8::IFLA_BRPORT_MULTICAST_ROUTER; -pub const IFLA_BRPORT_PAD: _bindgen_ty_8 = _bindgen_ty_8::IFLA_BRPORT_PAD; -pub const IFLA_BRPORT_MCAST_FLOOD: _bindgen_ty_8 = _bindgen_ty_8::IFLA_BRPORT_MCAST_FLOOD; -pub const IFLA_BRPORT_MCAST_TO_UCAST: _bindgen_ty_8 = _bindgen_ty_8::IFLA_BRPORT_MCAST_TO_UCAST; -pub const IFLA_BRPORT_VLAN_TUNNEL: _bindgen_ty_8 = _bindgen_ty_8::IFLA_BRPORT_VLAN_TUNNEL; -pub const IFLA_BRPORT_BCAST_FLOOD: _bindgen_ty_8 = _bindgen_ty_8::IFLA_BRPORT_BCAST_FLOOD; -pub const IFLA_BRPORT_GROUP_FWD_MASK: _bindgen_ty_8 = _bindgen_ty_8::IFLA_BRPORT_GROUP_FWD_MASK; -pub const IFLA_BRPORT_NEIGH_SUPPRESS: _bindgen_ty_8 = _bindgen_ty_8::IFLA_BRPORT_NEIGH_SUPPRESS; -pub const IFLA_BRPORT_ISOLATED: _bindgen_ty_8 = _bindgen_ty_8::IFLA_BRPORT_ISOLATED; -pub const IFLA_BRPORT_BACKUP_PORT: _bindgen_ty_8 = _bindgen_ty_8::IFLA_BRPORT_BACKUP_PORT; -pub const IFLA_BRPORT_MRP_RING_OPEN: _bindgen_ty_8 = _bindgen_ty_8::IFLA_BRPORT_MRP_RING_OPEN; -pub const IFLA_BRPORT_MRP_IN_OPEN: _bindgen_ty_8 = _bindgen_ty_8::IFLA_BRPORT_MRP_IN_OPEN; -pub const IFLA_BRPORT_MCAST_EHT_HOSTS_LIMIT: _bindgen_ty_8 = _bindgen_ty_8::IFLA_BRPORT_MCAST_EHT_HOSTS_LIMIT; -pub const IFLA_BRPORT_MCAST_EHT_HOSTS_CNT: _bindgen_ty_8 = _bindgen_ty_8::IFLA_BRPORT_MCAST_EHT_HOSTS_CNT; -pub const IFLA_BRPORT_LOCKED: _bindgen_ty_8 = _bindgen_ty_8::IFLA_BRPORT_LOCKED; -pub const IFLA_BRPORT_MAB: _bindgen_ty_8 = _bindgen_ty_8::IFLA_BRPORT_MAB; -pub const IFLA_BRPORT_MCAST_N_GROUPS: _bindgen_ty_8 = _bindgen_ty_8::IFLA_BRPORT_MCAST_N_GROUPS; -pub const IFLA_BRPORT_MCAST_MAX_GROUPS: _bindgen_ty_8 = _bindgen_ty_8::IFLA_BRPORT_MCAST_MAX_GROUPS; -pub const __IFLA_BRPORT_MAX: _bindgen_ty_8 = _bindgen_ty_8::__IFLA_BRPORT_MAX; -pub const IFLA_INFO_UNSPEC: _bindgen_ty_9 = _bindgen_ty_9::IFLA_INFO_UNSPEC; -pub const IFLA_INFO_KIND: _bindgen_ty_9 = _bindgen_ty_9::IFLA_INFO_KIND; -pub const IFLA_INFO_DATA: _bindgen_ty_9 = _bindgen_ty_9::IFLA_INFO_DATA; -pub const IFLA_INFO_XSTATS: _bindgen_ty_9 = _bindgen_ty_9::IFLA_INFO_XSTATS; -pub const IFLA_INFO_SLAVE_KIND: _bindgen_ty_9 = _bindgen_ty_9::IFLA_INFO_SLAVE_KIND; -pub const IFLA_INFO_SLAVE_DATA: _bindgen_ty_9 = _bindgen_ty_9::IFLA_INFO_SLAVE_DATA; -pub const __IFLA_INFO_MAX: _bindgen_ty_9 = _bindgen_ty_9::__IFLA_INFO_MAX; -pub const IFLA_VLAN_UNSPEC: _bindgen_ty_10 = _bindgen_ty_10::IFLA_VLAN_UNSPEC; -pub const IFLA_VLAN_ID: _bindgen_ty_10 = _bindgen_ty_10::IFLA_VLAN_ID; -pub const IFLA_VLAN_FLAGS: _bindgen_ty_10 = _bindgen_ty_10::IFLA_VLAN_FLAGS; -pub const IFLA_VLAN_EGRESS_QOS: _bindgen_ty_10 = _bindgen_ty_10::IFLA_VLAN_EGRESS_QOS; -pub const IFLA_VLAN_INGRESS_QOS: _bindgen_ty_10 = _bindgen_ty_10::IFLA_VLAN_INGRESS_QOS; -pub const IFLA_VLAN_PROTOCOL: _bindgen_ty_10 = _bindgen_ty_10::IFLA_VLAN_PROTOCOL; -pub const __IFLA_VLAN_MAX: _bindgen_ty_10 = _bindgen_ty_10::__IFLA_VLAN_MAX; -pub const IFLA_VLAN_QOS_UNSPEC: _bindgen_ty_11 = _bindgen_ty_11::IFLA_VLAN_QOS_UNSPEC; -pub const IFLA_VLAN_QOS_MAPPING: _bindgen_ty_11 = _bindgen_ty_11::IFLA_VLAN_QOS_MAPPING; -pub const __IFLA_VLAN_QOS_MAX: _bindgen_ty_11 = _bindgen_ty_11::__IFLA_VLAN_QOS_MAX; -pub const IFLA_MACVLAN_UNSPEC: _bindgen_ty_12 = _bindgen_ty_12::IFLA_MACVLAN_UNSPEC; -pub const IFLA_MACVLAN_MODE: _bindgen_ty_12 = _bindgen_ty_12::IFLA_MACVLAN_MODE; -pub const IFLA_MACVLAN_FLAGS: _bindgen_ty_12 = _bindgen_ty_12::IFLA_MACVLAN_FLAGS; -pub const IFLA_MACVLAN_MACADDR_MODE: _bindgen_ty_12 = _bindgen_ty_12::IFLA_MACVLAN_MACADDR_MODE; -pub const IFLA_MACVLAN_MACADDR: _bindgen_ty_12 = _bindgen_ty_12::IFLA_MACVLAN_MACADDR; -pub const IFLA_MACVLAN_MACADDR_DATA: _bindgen_ty_12 = _bindgen_ty_12::IFLA_MACVLAN_MACADDR_DATA; -pub const IFLA_MACVLAN_MACADDR_COUNT: _bindgen_ty_12 = _bindgen_ty_12::IFLA_MACVLAN_MACADDR_COUNT; -pub const IFLA_MACVLAN_BC_QUEUE_LEN: _bindgen_ty_12 = _bindgen_ty_12::IFLA_MACVLAN_BC_QUEUE_LEN; -pub const IFLA_MACVLAN_BC_QUEUE_LEN_USED: _bindgen_ty_12 = _bindgen_ty_12::IFLA_MACVLAN_BC_QUEUE_LEN_USED; -pub const __IFLA_MACVLAN_MAX: _bindgen_ty_12 = _bindgen_ty_12::__IFLA_MACVLAN_MAX; -pub const IFLA_VRF_UNSPEC: _bindgen_ty_13 = _bindgen_ty_13::IFLA_VRF_UNSPEC; -pub const IFLA_VRF_TABLE: _bindgen_ty_13 = _bindgen_ty_13::IFLA_VRF_TABLE; -pub const __IFLA_VRF_MAX: _bindgen_ty_13 = _bindgen_ty_13::__IFLA_VRF_MAX; -pub const IFLA_VRF_PORT_UNSPEC: _bindgen_ty_14 = _bindgen_ty_14::IFLA_VRF_PORT_UNSPEC; -pub const IFLA_VRF_PORT_TABLE: _bindgen_ty_14 = _bindgen_ty_14::IFLA_VRF_PORT_TABLE; -pub const __IFLA_VRF_PORT_MAX: _bindgen_ty_14 = _bindgen_ty_14::__IFLA_VRF_PORT_MAX; -pub const IFLA_MACSEC_UNSPEC: _bindgen_ty_15 = _bindgen_ty_15::IFLA_MACSEC_UNSPEC; -pub const IFLA_MACSEC_SCI: _bindgen_ty_15 = _bindgen_ty_15::IFLA_MACSEC_SCI; -pub const IFLA_MACSEC_PORT: _bindgen_ty_15 = _bindgen_ty_15::IFLA_MACSEC_PORT; -pub const IFLA_MACSEC_ICV_LEN: _bindgen_ty_15 = _bindgen_ty_15::IFLA_MACSEC_ICV_LEN; -pub const IFLA_MACSEC_CIPHER_SUITE: _bindgen_ty_15 = _bindgen_ty_15::IFLA_MACSEC_CIPHER_SUITE; -pub const IFLA_MACSEC_WINDOW: _bindgen_ty_15 = _bindgen_ty_15::IFLA_MACSEC_WINDOW; -pub const IFLA_MACSEC_ENCODING_SA: _bindgen_ty_15 = _bindgen_ty_15::IFLA_MACSEC_ENCODING_SA; -pub const IFLA_MACSEC_ENCRYPT: _bindgen_ty_15 = _bindgen_ty_15::IFLA_MACSEC_ENCRYPT; -pub const IFLA_MACSEC_PROTECT: _bindgen_ty_15 = _bindgen_ty_15::IFLA_MACSEC_PROTECT; -pub const IFLA_MACSEC_INC_SCI: _bindgen_ty_15 = _bindgen_ty_15::IFLA_MACSEC_INC_SCI; -pub const IFLA_MACSEC_ES: _bindgen_ty_15 = _bindgen_ty_15::IFLA_MACSEC_ES; -pub const IFLA_MACSEC_SCB: _bindgen_ty_15 = _bindgen_ty_15::IFLA_MACSEC_SCB; -pub const IFLA_MACSEC_REPLAY_PROTECT: _bindgen_ty_15 = _bindgen_ty_15::IFLA_MACSEC_REPLAY_PROTECT; -pub const IFLA_MACSEC_VALIDATION: _bindgen_ty_15 = _bindgen_ty_15::IFLA_MACSEC_VALIDATION; -pub const IFLA_MACSEC_PAD: _bindgen_ty_15 = _bindgen_ty_15::IFLA_MACSEC_PAD; -pub const IFLA_MACSEC_OFFLOAD: _bindgen_ty_15 = _bindgen_ty_15::IFLA_MACSEC_OFFLOAD; -pub const __IFLA_MACSEC_MAX: _bindgen_ty_15 = _bindgen_ty_15::__IFLA_MACSEC_MAX; -pub const IFLA_XFRM_UNSPEC: _bindgen_ty_16 = _bindgen_ty_16::IFLA_XFRM_UNSPEC; -pub const IFLA_XFRM_LINK: _bindgen_ty_16 = _bindgen_ty_16::IFLA_XFRM_LINK; -pub const IFLA_XFRM_IF_ID: _bindgen_ty_16 = _bindgen_ty_16::IFLA_XFRM_IF_ID; -pub const IFLA_XFRM_COLLECT_METADATA: _bindgen_ty_16 = _bindgen_ty_16::IFLA_XFRM_COLLECT_METADATA; -pub const __IFLA_XFRM_MAX: _bindgen_ty_16 = _bindgen_ty_16::__IFLA_XFRM_MAX; -pub const IFLA_IPVLAN_UNSPEC: _bindgen_ty_17 = _bindgen_ty_17::IFLA_IPVLAN_UNSPEC; -pub const IFLA_IPVLAN_MODE: _bindgen_ty_17 = _bindgen_ty_17::IFLA_IPVLAN_MODE; -pub const IFLA_IPVLAN_FLAGS: _bindgen_ty_17 = _bindgen_ty_17::IFLA_IPVLAN_FLAGS; -pub const __IFLA_IPVLAN_MAX: _bindgen_ty_17 = _bindgen_ty_17::__IFLA_IPVLAN_MAX; -pub const VNIFILTER_ENTRY_STATS_UNSPEC: _bindgen_ty_18 = _bindgen_ty_18::VNIFILTER_ENTRY_STATS_UNSPEC; -pub const VNIFILTER_ENTRY_STATS_RX_BYTES: _bindgen_ty_18 = _bindgen_ty_18::VNIFILTER_ENTRY_STATS_RX_BYTES; -pub const VNIFILTER_ENTRY_STATS_RX_PKTS: _bindgen_ty_18 = _bindgen_ty_18::VNIFILTER_ENTRY_STATS_RX_PKTS; -pub const VNIFILTER_ENTRY_STATS_RX_DROPS: _bindgen_ty_18 = _bindgen_ty_18::VNIFILTER_ENTRY_STATS_RX_DROPS; -pub const VNIFILTER_ENTRY_STATS_RX_ERRORS: _bindgen_ty_18 = _bindgen_ty_18::VNIFILTER_ENTRY_STATS_RX_ERRORS; -pub const VNIFILTER_ENTRY_STATS_TX_BYTES: _bindgen_ty_18 = _bindgen_ty_18::VNIFILTER_ENTRY_STATS_TX_BYTES; -pub const VNIFILTER_ENTRY_STATS_TX_PKTS: _bindgen_ty_18 = _bindgen_ty_18::VNIFILTER_ENTRY_STATS_TX_PKTS; -pub const VNIFILTER_ENTRY_STATS_TX_DROPS: _bindgen_ty_18 = _bindgen_ty_18::VNIFILTER_ENTRY_STATS_TX_DROPS; -pub const VNIFILTER_ENTRY_STATS_TX_ERRORS: _bindgen_ty_18 = _bindgen_ty_18::VNIFILTER_ENTRY_STATS_TX_ERRORS; -pub const VNIFILTER_ENTRY_STATS_PAD: _bindgen_ty_18 = _bindgen_ty_18::VNIFILTER_ENTRY_STATS_PAD; -pub const __VNIFILTER_ENTRY_STATS_MAX: _bindgen_ty_18 = _bindgen_ty_18::__VNIFILTER_ENTRY_STATS_MAX; -pub const VXLAN_VNIFILTER_ENTRY_UNSPEC: _bindgen_ty_19 = _bindgen_ty_19::VXLAN_VNIFILTER_ENTRY_UNSPEC; -pub const VXLAN_VNIFILTER_ENTRY_START: _bindgen_ty_19 = _bindgen_ty_19::VXLAN_VNIFILTER_ENTRY_START; -pub const VXLAN_VNIFILTER_ENTRY_END: _bindgen_ty_19 = _bindgen_ty_19::VXLAN_VNIFILTER_ENTRY_END; -pub const VXLAN_VNIFILTER_ENTRY_GROUP: _bindgen_ty_19 = _bindgen_ty_19::VXLAN_VNIFILTER_ENTRY_GROUP; -pub const VXLAN_VNIFILTER_ENTRY_GROUP6: _bindgen_ty_19 = _bindgen_ty_19::VXLAN_VNIFILTER_ENTRY_GROUP6; -pub const VXLAN_VNIFILTER_ENTRY_STATS: _bindgen_ty_19 = _bindgen_ty_19::VXLAN_VNIFILTER_ENTRY_STATS; -pub const __VXLAN_VNIFILTER_ENTRY_MAX: _bindgen_ty_19 = _bindgen_ty_19::__VXLAN_VNIFILTER_ENTRY_MAX; -pub const VXLAN_VNIFILTER_UNSPEC: _bindgen_ty_20 = _bindgen_ty_20::VXLAN_VNIFILTER_UNSPEC; -pub const VXLAN_VNIFILTER_ENTRY: _bindgen_ty_20 = _bindgen_ty_20::VXLAN_VNIFILTER_ENTRY; -pub const __VXLAN_VNIFILTER_MAX: _bindgen_ty_20 = _bindgen_ty_20::__VXLAN_VNIFILTER_MAX; -pub const IFLA_VXLAN_UNSPEC: _bindgen_ty_21 = _bindgen_ty_21::IFLA_VXLAN_UNSPEC; -pub const IFLA_VXLAN_ID: _bindgen_ty_21 = _bindgen_ty_21::IFLA_VXLAN_ID; -pub const IFLA_VXLAN_GROUP: _bindgen_ty_21 = _bindgen_ty_21::IFLA_VXLAN_GROUP; -pub const IFLA_VXLAN_LINK: _bindgen_ty_21 = _bindgen_ty_21::IFLA_VXLAN_LINK; -pub const IFLA_VXLAN_LOCAL: _bindgen_ty_21 = _bindgen_ty_21::IFLA_VXLAN_LOCAL; -pub const IFLA_VXLAN_TTL: _bindgen_ty_21 = _bindgen_ty_21::IFLA_VXLAN_TTL; -pub const IFLA_VXLAN_TOS: _bindgen_ty_21 = _bindgen_ty_21::IFLA_VXLAN_TOS; -pub const IFLA_VXLAN_LEARNING: _bindgen_ty_21 = _bindgen_ty_21::IFLA_VXLAN_LEARNING; -pub const IFLA_VXLAN_AGEING: _bindgen_ty_21 = _bindgen_ty_21::IFLA_VXLAN_AGEING; -pub const IFLA_VXLAN_LIMIT: _bindgen_ty_21 = _bindgen_ty_21::IFLA_VXLAN_LIMIT; -pub const IFLA_VXLAN_PORT_RANGE: _bindgen_ty_21 = _bindgen_ty_21::IFLA_VXLAN_PORT_RANGE; -pub const IFLA_VXLAN_PROXY: _bindgen_ty_21 = _bindgen_ty_21::IFLA_VXLAN_PROXY; -pub const IFLA_VXLAN_RSC: _bindgen_ty_21 = _bindgen_ty_21::IFLA_VXLAN_RSC; -pub const IFLA_VXLAN_L2MISS: _bindgen_ty_21 = _bindgen_ty_21::IFLA_VXLAN_L2MISS; -pub const IFLA_VXLAN_L3MISS: _bindgen_ty_21 = _bindgen_ty_21::IFLA_VXLAN_L3MISS; -pub const IFLA_VXLAN_PORT: _bindgen_ty_21 = _bindgen_ty_21::IFLA_VXLAN_PORT; -pub const IFLA_VXLAN_GROUP6: _bindgen_ty_21 = _bindgen_ty_21::IFLA_VXLAN_GROUP6; -pub const IFLA_VXLAN_LOCAL6: _bindgen_ty_21 = _bindgen_ty_21::IFLA_VXLAN_LOCAL6; -pub const IFLA_VXLAN_UDP_CSUM: _bindgen_ty_21 = _bindgen_ty_21::IFLA_VXLAN_UDP_CSUM; -pub const IFLA_VXLAN_UDP_ZERO_CSUM6_TX: _bindgen_ty_21 = _bindgen_ty_21::IFLA_VXLAN_UDP_ZERO_CSUM6_TX; -pub const IFLA_VXLAN_UDP_ZERO_CSUM6_RX: _bindgen_ty_21 = _bindgen_ty_21::IFLA_VXLAN_UDP_ZERO_CSUM6_RX; -pub const IFLA_VXLAN_REMCSUM_TX: _bindgen_ty_21 = _bindgen_ty_21::IFLA_VXLAN_REMCSUM_TX; -pub const IFLA_VXLAN_REMCSUM_RX: _bindgen_ty_21 = _bindgen_ty_21::IFLA_VXLAN_REMCSUM_RX; -pub const IFLA_VXLAN_GBP: _bindgen_ty_21 = _bindgen_ty_21::IFLA_VXLAN_GBP; -pub const IFLA_VXLAN_REMCSUM_NOPARTIAL: _bindgen_ty_21 = _bindgen_ty_21::IFLA_VXLAN_REMCSUM_NOPARTIAL; -pub const IFLA_VXLAN_COLLECT_METADATA: _bindgen_ty_21 = _bindgen_ty_21::IFLA_VXLAN_COLLECT_METADATA; -pub const IFLA_VXLAN_LABEL: _bindgen_ty_21 = _bindgen_ty_21::IFLA_VXLAN_LABEL; -pub const IFLA_VXLAN_GPE: _bindgen_ty_21 = _bindgen_ty_21::IFLA_VXLAN_GPE; -pub const IFLA_VXLAN_TTL_INHERIT: _bindgen_ty_21 = _bindgen_ty_21::IFLA_VXLAN_TTL_INHERIT; -pub const IFLA_VXLAN_DF: _bindgen_ty_21 = _bindgen_ty_21::IFLA_VXLAN_DF; -pub const IFLA_VXLAN_VNIFILTER: _bindgen_ty_21 = _bindgen_ty_21::IFLA_VXLAN_VNIFILTER; -pub const __IFLA_VXLAN_MAX: _bindgen_ty_21 = _bindgen_ty_21::__IFLA_VXLAN_MAX; -pub const IFLA_GENEVE_UNSPEC: _bindgen_ty_22 = _bindgen_ty_22::IFLA_GENEVE_UNSPEC; -pub const IFLA_GENEVE_ID: _bindgen_ty_22 = _bindgen_ty_22::IFLA_GENEVE_ID; -pub const IFLA_GENEVE_REMOTE: _bindgen_ty_22 = _bindgen_ty_22::IFLA_GENEVE_REMOTE; -pub const IFLA_GENEVE_TTL: _bindgen_ty_22 = _bindgen_ty_22::IFLA_GENEVE_TTL; -pub const IFLA_GENEVE_TOS: _bindgen_ty_22 = _bindgen_ty_22::IFLA_GENEVE_TOS; -pub const IFLA_GENEVE_PORT: _bindgen_ty_22 = _bindgen_ty_22::IFLA_GENEVE_PORT; -pub const IFLA_GENEVE_COLLECT_METADATA: _bindgen_ty_22 = _bindgen_ty_22::IFLA_GENEVE_COLLECT_METADATA; -pub const IFLA_GENEVE_REMOTE6: _bindgen_ty_22 = _bindgen_ty_22::IFLA_GENEVE_REMOTE6; -pub const IFLA_GENEVE_UDP_CSUM: _bindgen_ty_22 = _bindgen_ty_22::IFLA_GENEVE_UDP_CSUM; -pub const IFLA_GENEVE_UDP_ZERO_CSUM6_TX: _bindgen_ty_22 = _bindgen_ty_22::IFLA_GENEVE_UDP_ZERO_CSUM6_TX; -pub const IFLA_GENEVE_UDP_ZERO_CSUM6_RX: _bindgen_ty_22 = _bindgen_ty_22::IFLA_GENEVE_UDP_ZERO_CSUM6_RX; -pub const IFLA_GENEVE_LABEL: _bindgen_ty_22 = _bindgen_ty_22::IFLA_GENEVE_LABEL; -pub const IFLA_GENEVE_TTL_INHERIT: _bindgen_ty_22 = _bindgen_ty_22::IFLA_GENEVE_TTL_INHERIT; -pub const IFLA_GENEVE_DF: _bindgen_ty_22 = _bindgen_ty_22::IFLA_GENEVE_DF; -pub const IFLA_GENEVE_INNER_PROTO_INHERIT: _bindgen_ty_22 = _bindgen_ty_22::IFLA_GENEVE_INNER_PROTO_INHERIT; -pub const __IFLA_GENEVE_MAX: _bindgen_ty_22 = _bindgen_ty_22::__IFLA_GENEVE_MAX; -pub const IFLA_BAREUDP_UNSPEC: _bindgen_ty_23 = _bindgen_ty_23::IFLA_BAREUDP_UNSPEC; -pub const IFLA_BAREUDP_PORT: _bindgen_ty_23 = _bindgen_ty_23::IFLA_BAREUDP_PORT; -pub const IFLA_BAREUDP_ETHERTYPE: _bindgen_ty_23 = _bindgen_ty_23::IFLA_BAREUDP_ETHERTYPE; -pub const IFLA_BAREUDP_SRCPORT_MIN: _bindgen_ty_23 = _bindgen_ty_23::IFLA_BAREUDP_SRCPORT_MIN; -pub const IFLA_BAREUDP_MULTIPROTO_MODE: _bindgen_ty_23 = _bindgen_ty_23::IFLA_BAREUDP_MULTIPROTO_MODE; -pub const __IFLA_BAREUDP_MAX: _bindgen_ty_23 = _bindgen_ty_23::__IFLA_BAREUDP_MAX; -pub const IFLA_PPP_UNSPEC: _bindgen_ty_24 = _bindgen_ty_24::IFLA_PPP_UNSPEC; -pub const IFLA_PPP_DEV_FD: _bindgen_ty_24 = _bindgen_ty_24::IFLA_PPP_DEV_FD; -pub const __IFLA_PPP_MAX: _bindgen_ty_24 = _bindgen_ty_24::__IFLA_PPP_MAX; -pub const IFLA_GTP_UNSPEC: _bindgen_ty_25 = _bindgen_ty_25::IFLA_GTP_UNSPEC; -pub const IFLA_GTP_FD0: _bindgen_ty_25 = _bindgen_ty_25::IFLA_GTP_FD0; -pub const IFLA_GTP_FD1: _bindgen_ty_25 = _bindgen_ty_25::IFLA_GTP_FD1; -pub const IFLA_GTP_PDP_HASHSIZE: _bindgen_ty_25 = _bindgen_ty_25::IFLA_GTP_PDP_HASHSIZE; -pub const IFLA_GTP_ROLE: _bindgen_ty_25 = _bindgen_ty_25::IFLA_GTP_ROLE; -pub const IFLA_GTP_CREATE_SOCKETS: _bindgen_ty_25 = _bindgen_ty_25::IFLA_GTP_CREATE_SOCKETS; -pub const IFLA_GTP_RESTART_COUNT: _bindgen_ty_25 = _bindgen_ty_25::IFLA_GTP_RESTART_COUNT; -pub const __IFLA_GTP_MAX: _bindgen_ty_25 = _bindgen_ty_25::__IFLA_GTP_MAX; -pub const IFLA_BOND_UNSPEC: _bindgen_ty_26 = _bindgen_ty_26::IFLA_BOND_UNSPEC; -pub const IFLA_BOND_MODE: _bindgen_ty_26 = _bindgen_ty_26::IFLA_BOND_MODE; -pub const IFLA_BOND_ACTIVE_SLAVE: _bindgen_ty_26 = _bindgen_ty_26::IFLA_BOND_ACTIVE_SLAVE; -pub const IFLA_BOND_MIIMON: _bindgen_ty_26 = _bindgen_ty_26::IFLA_BOND_MIIMON; -pub const IFLA_BOND_UPDELAY: _bindgen_ty_26 = _bindgen_ty_26::IFLA_BOND_UPDELAY; -pub const IFLA_BOND_DOWNDELAY: _bindgen_ty_26 = _bindgen_ty_26::IFLA_BOND_DOWNDELAY; -pub const IFLA_BOND_USE_CARRIER: _bindgen_ty_26 = _bindgen_ty_26::IFLA_BOND_USE_CARRIER; -pub const IFLA_BOND_ARP_INTERVAL: _bindgen_ty_26 = _bindgen_ty_26::IFLA_BOND_ARP_INTERVAL; -pub const IFLA_BOND_ARP_IP_TARGET: _bindgen_ty_26 = _bindgen_ty_26::IFLA_BOND_ARP_IP_TARGET; -pub const IFLA_BOND_ARP_VALIDATE: _bindgen_ty_26 = _bindgen_ty_26::IFLA_BOND_ARP_VALIDATE; -pub const IFLA_BOND_ARP_ALL_TARGETS: _bindgen_ty_26 = _bindgen_ty_26::IFLA_BOND_ARP_ALL_TARGETS; -pub const IFLA_BOND_PRIMARY: _bindgen_ty_26 = _bindgen_ty_26::IFLA_BOND_PRIMARY; -pub const IFLA_BOND_PRIMARY_RESELECT: _bindgen_ty_26 = _bindgen_ty_26::IFLA_BOND_PRIMARY_RESELECT; -pub const IFLA_BOND_FAIL_OVER_MAC: _bindgen_ty_26 = _bindgen_ty_26::IFLA_BOND_FAIL_OVER_MAC; -pub const IFLA_BOND_XMIT_HASH_POLICY: _bindgen_ty_26 = _bindgen_ty_26::IFLA_BOND_XMIT_HASH_POLICY; -pub const IFLA_BOND_RESEND_IGMP: _bindgen_ty_26 = _bindgen_ty_26::IFLA_BOND_RESEND_IGMP; -pub const IFLA_BOND_NUM_PEER_NOTIF: _bindgen_ty_26 = _bindgen_ty_26::IFLA_BOND_NUM_PEER_NOTIF; -pub const IFLA_BOND_ALL_SLAVES_ACTIVE: _bindgen_ty_26 = _bindgen_ty_26::IFLA_BOND_ALL_SLAVES_ACTIVE; -pub const IFLA_BOND_MIN_LINKS: _bindgen_ty_26 = _bindgen_ty_26::IFLA_BOND_MIN_LINKS; -pub const IFLA_BOND_LP_INTERVAL: _bindgen_ty_26 = _bindgen_ty_26::IFLA_BOND_LP_INTERVAL; -pub const IFLA_BOND_PACKETS_PER_SLAVE: _bindgen_ty_26 = _bindgen_ty_26::IFLA_BOND_PACKETS_PER_SLAVE; -pub const IFLA_BOND_AD_LACP_RATE: _bindgen_ty_26 = _bindgen_ty_26::IFLA_BOND_AD_LACP_RATE; -pub const IFLA_BOND_AD_SELECT: _bindgen_ty_26 = _bindgen_ty_26::IFLA_BOND_AD_SELECT; -pub const IFLA_BOND_AD_INFO: _bindgen_ty_26 = _bindgen_ty_26::IFLA_BOND_AD_INFO; -pub const IFLA_BOND_AD_ACTOR_SYS_PRIO: _bindgen_ty_26 = _bindgen_ty_26::IFLA_BOND_AD_ACTOR_SYS_PRIO; -pub const IFLA_BOND_AD_USER_PORT_KEY: _bindgen_ty_26 = _bindgen_ty_26::IFLA_BOND_AD_USER_PORT_KEY; -pub const IFLA_BOND_AD_ACTOR_SYSTEM: _bindgen_ty_26 = _bindgen_ty_26::IFLA_BOND_AD_ACTOR_SYSTEM; -pub const IFLA_BOND_TLB_DYNAMIC_LB: _bindgen_ty_26 = _bindgen_ty_26::IFLA_BOND_TLB_DYNAMIC_LB; -pub const IFLA_BOND_PEER_NOTIF_DELAY: _bindgen_ty_26 = _bindgen_ty_26::IFLA_BOND_PEER_NOTIF_DELAY; -pub const IFLA_BOND_AD_LACP_ACTIVE: _bindgen_ty_26 = _bindgen_ty_26::IFLA_BOND_AD_LACP_ACTIVE; -pub const IFLA_BOND_MISSED_MAX: _bindgen_ty_26 = _bindgen_ty_26::IFLA_BOND_MISSED_MAX; -pub const IFLA_BOND_NS_IP6_TARGET: _bindgen_ty_26 = _bindgen_ty_26::IFLA_BOND_NS_IP6_TARGET; -pub const __IFLA_BOND_MAX: _bindgen_ty_26 = _bindgen_ty_26::__IFLA_BOND_MAX; -pub const IFLA_BOND_AD_INFO_UNSPEC: _bindgen_ty_27 = _bindgen_ty_27::IFLA_BOND_AD_INFO_UNSPEC; -pub const IFLA_BOND_AD_INFO_AGGREGATOR: _bindgen_ty_27 = _bindgen_ty_27::IFLA_BOND_AD_INFO_AGGREGATOR; -pub const IFLA_BOND_AD_INFO_NUM_PORTS: _bindgen_ty_27 = _bindgen_ty_27::IFLA_BOND_AD_INFO_NUM_PORTS; -pub const IFLA_BOND_AD_INFO_ACTOR_KEY: _bindgen_ty_27 = _bindgen_ty_27::IFLA_BOND_AD_INFO_ACTOR_KEY; -pub const IFLA_BOND_AD_INFO_PARTNER_KEY: _bindgen_ty_27 = _bindgen_ty_27::IFLA_BOND_AD_INFO_PARTNER_KEY; -pub const IFLA_BOND_AD_INFO_PARTNER_MAC: _bindgen_ty_27 = _bindgen_ty_27::IFLA_BOND_AD_INFO_PARTNER_MAC; -pub const __IFLA_BOND_AD_INFO_MAX: _bindgen_ty_27 = _bindgen_ty_27::__IFLA_BOND_AD_INFO_MAX; -pub const IFLA_BOND_SLAVE_UNSPEC: _bindgen_ty_28 = _bindgen_ty_28::IFLA_BOND_SLAVE_UNSPEC; -pub const IFLA_BOND_SLAVE_STATE: _bindgen_ty_28 = _bindgen_ty_28::IFLA_BOND_SLAVE_STATE; -pub const IFLA_BOND_SLAVE_MII_STATUS: _bindgen_ty_28 = _bindgen_ty_28::IFLA_BOND_SLAVE_MII_STATUS; -pub const IFLA_BOND_SLAVE_LINK_FAILURE_COUNT: _bindgen_ty_28 = _bindgen_ty_28::IFLA_BOND_SLAVE_LINK_FAILURE_COUNT; -pub const IFLA_BOND_SLAVE_PERM_HWADDR: _bindgen_ty_28 = _bindgen_ty_28::IFLA_BOND_SLAVE_PERM_HWADDR; -pub const IFLA_BOND_SLAVE_QUEUE_ID: _bindgen_ty_28 = _bindgen_ty_28::IFLA_BOND_SLAVE_QUEUE_ID; -pub const IFLA_BOND_SLAVE_AD_AGGREGATOR_ID: _bindgen_ty_28 = _bindgen_ty_28::IFLA_BOND_SLAVE_AD_AGGREGATOR_ID; -pub const IFLA_BOND_SLAVE_AD_ACTOR_OPER_PORT_STATE: _bindgen_ty_28 = _bindgen_ty_28::IFLA_BOND_SLAVE_AD_ACTOR_OPER_PORT_STATE; -pub const IFLA_BOND_SLAVE_AD_PARTNER_OPER_PORT_STATE: _bindgen_ty_28 = _bindgen_ty_28::IFLA_BOND_SLAVE_AD_PARTNER_OPER_PORT_STATE; -pub const IFLA_BOND_SLAVE_PRIO: _bindgen_ty_28 = _bindgen_ty_28::IFLA_BOND_SLAVE_PRIO; -pub const __IFLA_BOND_SLAVE_MAX: _bindgen_ty_28 = _bindgen_ty_28::__IFLA_BOND_SLAVE_MAX; -pub const IFLA_VF_INFO_UNSPEC: _bindgen_ty_29 = _bindgen_ty_29::IFLA_VF_INFO_UNSPEC; -pub const IFLA_VF_INFO: _bindgen_ty_29 = _bindgen_ty_29::IFLA_VF_INFO; -pub const __IFLA_VF_INFO_MAX: _bindgen_ty_29 = _bindgen_ty_29::__IFLA_VF_INFO_MAX; -pub const IFLA_VF_UNSPEC: _bindgen_ty_30 = _bindgen_ty_30::IFLA_VF_UNSPEC; -pub const IFLA_VF_MAC: _bindgen_ty_30 = _bindgen_ty_30::IFLA_VF_MAC; -pub const IFLA_VF_VLAN: _bindgen_ty_30 = _bindgen_ty_30::IFLA_VF_VLAN; -pub const IFLA_VF_TX_RATE: _bindgen_ty_30 = _bindgen_ty_30::IFLA_VF_TX_RATE; -pub const IFLA_VF_SPOOFCHK: _bindgen_ty_30 = _bindgen_ty_30::IFLA_VF_SPOOFCHK; -pub const IFLA_VF_LINK_STATE: _bindgen_ty_30 = _bindgen_ty_30::IFLA_VF_LINK_STATE; -pub const IFLA_VF_RATE: _bindgen_ty_30 = _bindgen_ty_30::IFLA_VF_RATE; -pub const IFLA_VF_RSS_QUERY_EN: _bindgen_ty_30 = _bindgen_ty_30::IFLA_VF_RSS_QUERY_EN; -pub const IFLA_VF_STATS: _bindgen_ty_30 = _bindgen_ty_30::IFLA_VF_STATS; -pub const IFLA_VF_TRUST: _bindgen_ty_30 = _bindgen_ty_30::IFLA_VF_TRUST; -pub const IFLA_VF_IB_NODE_GUID: _bindgen_ty_30 = _bindgen_ty_30::IFLA_VF_IB_NODE_GUID; -pub const IFLA_VF_IB_PORT_GUID: _bindgen_ty_30 = _bindgen_ty_30::IFLA_VF_IB_PORT_GUID; -pub const IFLA_VF_VLAN_LIST: _bindgen_ty_30 = _bindgen_ty_30::IFLA_VF_VLAN_LIST; -pub const IFLA_VF_BROADCAST: _bindgen_ty_30 = _bindgen_ty_30::IFLA_VF_BROADCAST; -pub const __IFLA_VF_MAX: _bindgen_ty_30 = _bindgen_ty_30::__IFLA_VF_MAX; -pub const IFLA_VF_VLAN_INFO_UNSPEC: _bindgen_ty_31 = _bindgen_ty_31::IFLA_VF_VLAN_INFO_UNSPEC; -pub const IFLA_VF_VLAN_INFO: _bindgen_ty_31 = _bindgen_ty_31::IFLA_VF_VLAN_INFO; -pub const __IFLA_VF_VLAN_INFO_MAX: _bindgen_ty_31 = _bindgen_ty_31::__IFLA_VF_VLAN_INFO_MAX; -pub const IFLA_VF_LINK_STATE_AUTO: _bindgen_ty_32 = _bindgen_ty_32::IFLA_VF_LINK_STATE_AUTO; -pub const IFLA_VF_LINK_STATE_ENABLE: _bindgen_ty_32 = _bindgen_ty_32::IFLA_VF_LINK_STATE_ENABLE; -pub const IFLA_VF_LINK_STATE_DISABLE: _bindgen_ty_32 = _bindgen_ty_32::IFLA_VF_LINK_STATE_DISABLE; -pub const __IFLA_VF_LINK_STATE_MAX: _bindgen_ty_32 = _bindgen_ty_32::__IFLA_VF_LINK_STATE_MAX; -pub const IFLA_VF_STATS_RX_PACKETS: _bindgen_ty_33 = _bindgen_ty_33::IFLA_VF_STATS_RX_PACKETS; -pub const IFLA_VF_STATS_TX_PACKETS: _bindgen_ty_33 = _bindgen_ty_33::IFLA_VF_STATS_TX_PACKETS; -pub const IFLA_VF_STATS_RX_BYTES: _bindgen_ty_33 = _bindgen_ty_33::IFLA_VF_STATS_RX_BYTES; -pub const IFLA_VF_STATS_TX_BYTES: _bindgen_ty_33 = _bindgen_ty_33::IFLA_VF_STATS_TX_BYTES; -pub const IFLA_VF_STATS_BROADCAST: _bindgen_ty_33 = _bindgen_ty_33::IFLA_VF_STATS_BROADCAST; -pub const IFLA_VF_STATS_MULTICAST: _bindgen_ty_33 = _bindgen_ty_33::IFLA_VF_STATS_MULTICAST; -pub const IFLA_VF_STATS_PAD: _bindgen_ty_33 = _bindgen_ty_33::IFLA_VF_STATS_PAD; -pub const IFLA_VF_STATS_RX_DROPPED: _bindgen_ty_33 = _bindgen_ty_33::IFLA_VF_STATS_RX_DROPPED; -pub const IFLA_VF_STATS_TX_DROPPED: _bindgen_ty_33 = _bindgen_ty_33::IFLA_VF_STATS_TX_DROPPED; -pub const __IFLA_VF_STATS_MAX: _bindgen_ty_33 = _bindgen_ty_33::__IFLA_VF_STATS_MAX; -pub const IFLA_VF_PORT_UNSPEC: _bindgen_ty_34 = _bindgen_ty_34::IFLA_VF_PORT_UNSPEC; -pub const IFLA_VF_PORT: _bindgen_ty_34 = _bindgen_ty_34::IFLA_VF_PORT; -pub const __IFLA_VF_PORT_MAX: _bindgen_ty_34 = _bindgen_ty_34::__IFLA_VF_PORT_MAX; -pub const IFLA_PORT_UNSPEC: _bindgen_ty_35 = _bindgen_ty_35::IFLA_PORT_UNSPEC; -pub const IFLA_PORT_VF: _bindgen_ty_35 = _bindgen_ty_35::IFLA_PORT_VF; -pub const IFLA_PORT_PROFILE: _bindgen_ty_35 = _bindgen_ty_35::IFLA_PORT_PROFILE; -pub const IFLA_PORT_VSI_TYPE: _bindgen_ty_35 = _bindgen_ty_35::IFLA_PORT_VSI_TYPE; -pub const IFLA_PORT_INSTANCE_UUID: _bindgen_ty_35 = _bindgen_ty_35::IFLA_PORT_INSTANCE_UUID; -pub const IFLA_PORT_HOST_UUID: _bindgen_ty_35 = _bindgen_ty_35::IFLA_PORT_HOST_UUID; -pub const IFLA_PORT_REQUEST: _bindgen_ty_35 = _bindgen_ty_35::IFLA_PORT_REQUEST; -pub const IFLA_PORT_RESPONSE: _bindgen_ty_35 = _bindgen_ty_35::IFLA_PORT_RESPONSE; -pub const __IFLA_PORT_MAX: _bindgen_ty_35 = _bindgen_ty_35::__IFLA_PORT_MAX; -pub const PORT_REQUEST_PREASSOCIATE: _bindgen_ty_36 = _bindgen_ty_36::PORT_REQUEST_PREASSOCIATE; -pub const PORT_REQUEST_PREASSOCIATE_RR: _bindgen_ty_36 = _bindgen_ty_36::PORT_REQUEST_PREASSOCIATE_RR; -pub const PORT_REQUEST_ASSOCIATE: _bindgen_ty_36 = _bindgen_ty_36::PORT_REQUEST_ASSOCIATE; -pub const PORT_REQUEST_DISASSOCIATE: _bindgen_ty_36 = _bindgen_ty_36::PORT_REQUEST_DISASSOCIATE; -pub const PORT_VDP_RESPONSE_SUCCESS: _bindgen_ty_37 = _bindgen_ty_37::PORT_VDP_RESPONSE_SUCCESS; -pub const PORT_VDP_RESPONSE_INVALID_FORMAT: _bindgen_ty_37 = _bindgen_ty_37::PORT_VDP_RESPONSE_INVALID_FORMAT; -pub const PORT_VDP_RESPONSE_INSUFFICIENT_RESOURCES: _bindgen_ty_37 = _bindgen_ty_37::PORT_VDP_RESPONSE_INSUFFICIENT_RESOURCES; -pub const PORT_VDP_RESPONSE_UNUSED_VTID: _bindgen_ty_37 = _bindgen_ty_37::PORT_VDP_RESPONSE_UNUSED_VTID; -pub const PORT_VDP_RESPONSE_VTID_VIOLATION: _bindgen_ty_37 = _bindgen_ty_37::PORT_VDP_RESPONSE_VTID_VIOLATION; -pub const PORT_VDP_RESPONSE_VTID_VERSION_VIOALTION: _bindgen_ty_37 = _bindgen_ty_37::PORT_VDP_RESPONSE_VTID_VERSION_VIOALTION; -pub const PORT_VDP_RESPONSE_OUT_OF_SYNC: _bindgen_ty_37 = _bindgen_ty_37::PORT_VDP_RESPONSE_OUT_OF_SYNC; -pub const PORT_PROFILE_RESPONSE_SUCCESS: _bindgen_ty_37 = _bindgen_ty_37::PORT_PROFILE_RESPONSE_SUCCESS; -pub const PORT_PROFILE_RESPONSE_INPROGRESS: _bindgen_ty_37 = _bindgen_ty_37::PORT_PROFILE_RESPONSE_INPROGRESS; -pub const PORT_PROFILE_RESPONSE_INVALID: _bindgen_ty_37 = _bindgen_ty_37::PORT_PROFILE_RESPONSE_INVALID; -pub const PORT_PROFILE_RESPONSE_BADSTATE: _bindgen_ty_37 = _bindgen_ty_37::PORT_PROFILE_RESPONSE_BADSTATE; -pub const PORT_PROFILE_RESPONSE_INSUFFICIENT_RESOURCES: _bindgen_ty_37 = _bindgen_ty_37::PORT_PROFILE_RESPONSE_INSUFFICIENT_RESOURCES; -pub const PORT_PROFILE_RESPONSE_ERROR: _bindgen_ty_37 = _bindgen_ty_37::PORT_PROFILE_RESPONSE_ERROR; -pub const IFLA_IPOIB_UNSPEC: _bindgen_ty_38 = _bindgen_ty_38::IFLA_IPOIB_UNSPEC; -pub const IFLA_IPOIB_PKEY: _bindgen_ty_38 = _bindgen_ty_38::IFLA_IPOIB_PKEY; -pub const IFLA_IPOIB_MODE: _bindgen_ty_38 = _bindgen_ty_38::IFLA_IPOIB_MODE; -pub const IFLA_IPOIB_UMCAST: _bindgen_ty_38 = _bindgen_ty_38::IFLA_IPOIB_UMCAST; -pub const __IFLA_IPOIB_MAX: _bindgen_ty_38 = _bindgen_ty_38::__IFLA_IPOIB_MAX; -pub const IPOIB_MODE_DATAGRAM: _bindgen_ty_39 = _bindgen_ty_39::IPOIB_MODE_DATAGRAM; -pub const IPOIB_MODE_CONNECTED: _bindgen_ty_39 = _bindgen_ty_39::IPOIB_MODE_CONNECTED; -pub const HSR_PROTOCOL_HSR: _bindgen_ty_40 = _bindgen_ty_40::HSR_PROTOCOL_HSR; -pub const HSR_PROTOCOL_PRP: _bindgen_ty_40 = _bindgen_ty_40::HSR_PROTOCOL_PRP; -pub const HSR_PROTOCOL_MAX: _bindgen_ty_40 = _bindgen_ty_40::HSR_PROTOCOL_MAX; -pub const IFLA_HSR_UNSPEC: _bindgen_ty_41 = _bindgen_ty_41::IFLA_HSR_UNSPEC; -pub const IFLA_HSR_SLAVE1: _bindgen_ty_41 = _bindgen_ty_41::IFLA_HSR_SLAVE1; -pub const IFLA_HSR_SLAVE2: _bindgen_ty_41 = _bindgen_ty_41::IFLA_HSR_SLAVE2; -pub const IFLA_HSR_MULTICAST_SPEC: _bindgen_ty_41 = _bindgen_ty_41::IFLA_HSR_MULTICAST_SPEC; -pub const IFLA_HSR_SUPERVISION_ADDR: _bindgen_ty_41 = _bindgen_ty_41::IFLA_HSR_SUPERVISION_ADDR; -pub const IFLA_HSR_SEQ_NR: _bindgen_ty_41 = _bindgen_ty_41::IFLA_HSR_SEQ_NR; -pub const IFLA_HSR_VERSION: _bindgen_ty_41 = _bindgen_ty_41::IFLA_HSR_VERSION; -pub const IFLA_HSR_PROTOCOL: _bindgen_ty_41 = _bindgen_ty_41::IFLA_HSR_PROTOCOL; -pub const __IFLA_HSR_MAX: _bindgen_ty_41 = _bindgen_ty_41::__IFLA_HSR_MAX; -pub const IFLA_STATS_UNSPEC: _bindgen_ty_42 = _bindgen_ty_42::IFLA_STATS_UNSPEC; -pub const IFLA_STATS_LINK_64: _bindgen_ty_42 = _bindgen_ty_42::IFLA_STATS_LINK_64; -pub const IFLA_STATS_LINK_XSTATS: _bindgen_ty_42 = _bindgen_ty_42::IFLA_STATS_LINK_XSTATS; -pub const IFLA_STATS_LINK_XSTATS_SLAVE: _bindgen_ty_42 = _bindgen_ty_42::IFLA_STATS_LINK_XSTATS_SLAVE; -pub const IFLA_STATS_LINK_OFFLOAD_XSTATS: _bindgen_ty_42 = _bindgen_ty_42::IFLA_STATS_LINK_OFFLOAD_XSTATS; -pub const IFLA_STATS_AF_SPEC: _bindgen_ty_42 = _bindgen_ty_42::IFLA_STATS_AF_SPEC; -pub const __IFLA_STATS_MAX: _bindgen_ty_42 = _bindgen_ty_42::__IFLA_STATS_MAX; -pub const IFLA_STATS_GETSET_UNSPEC: _bindgen_ty_43 = _bindgen_ty_43::IFLA_STATS_GETSET_UNSPEC; -pub const IFLA_STATS_GET_FILTERS: _bindgen_ty_43 = _bindgen_ty_43::IFLA_STATS_GET_FILTERS; -pub const IFLA_STATS_SET_OFFLOAD_XSTATS_L3_STATS: _bindgen_ty_43 = _bindgen_ty_43::IFLA_STATS_SET_OFFLOAD_XSTATS_L3_STATS; -pub const __IFLA_STATS_GETSET_MAX: _bindgen_ty_43 = _bindgen_ty_43::__IFLA_STATS_GETSET_MAX; -pub const LINK_XSTATS_TYPE_UNSPEC: _bindgen_ty_44 = _bindgen_ty_44::LINK_XSTATS_TYPE_UNSPEC; -pub const LINK_XSTATS_TYPE_BRIDGE: _bindgen_ty_44 = _bindgen_ty_44::LINK_XSTATS_TYPE_BRIDGE; -pub const LINK_XSTATS_TYPE_BOND: _bindgen_ty_44 = _bindgen_ty_44::LINK_XSTATS_TYPE_BOND; -pub const __LINK_XSTATS_TYPE_MAX: _bindgen_ty_44 = _bindgen_ty_44::__LINK_XSTATS_TYPE_MAX; -pub const IFLA_OFFLOAD_XSTATS_UNSPEC: _bindgen_ty_45 = _bindgen_ty_45::IFLA_OFFLOAD_XSTATS_UNSPEC; -pub const IFLA_OFFLOAD_XSTATS_CPU_HIT: _bindgen_ty_45 = _bindgen_ty_45::IFLA_OFFLOAD_XSTATS_CPU_HIT; -pub const IFLA_OFFLOAD_XSTATS_HW_S_INFO: _bindgen_ty_45 = _bindgen_ty_45::IFLA_OFFLOAD_XSTATS_HW_S_INFO; -pub const IFLA_OFFLOAD_XSTATS_L3_STATS: _bindgen_ty_45 = _bindgen_ty_45::IFLA_OFFLOAD_XSTATS_L3_STATS; -pub const __IFLA_OFFLOAD_XSTATS_MAX: _bindgen_ty_45 = _bindgen_ty_45::__IFLA_OFFLOAD_XSTATS_MAX; -pub const IFLA_OFFLOAD_XSTATS_HW_S_INFO_UNSPEC: _bindgen_ty_46 = _bindgen_ty_46::IFLA_OFFLOAD_XSTATS_HW_S_INFO_UNSPEC; -pub const IFLA_OFFLOAD_XSTATS_HW_S_INFO_REQUEST: _bindgen_ty_46 = _bindgen_ty_46::IFLA_OFFLOAD_XSTATS_HW_S_INFO_REQUEST; -pub const IFLA_OFFLOAD_XSTATS_HW_S_INFO_USED: _bindgen_ty_46 = _bindgen_ty_46::IFLA_OFFLOAD_XSTATS_HW_S_INFO_USED; -pub const __IFLA_OFFLOAD_XSTATS_HW_S_INFO_MAX: _bindgen_ty_46 = _bindgen_ty_46::__IFLA_OFFLOAD_XSTATS_HW_S_INFO_MAX; -pub const XDP_ATTACHED_NONE: _bindgen_ty_47 = _bindgen_ty_47::XDP_ATTACHED_NONE; -pub const XDP_ATTACHED_DRV: _bindgen_ty_47 = _bindgen_ty_47::XDP_ATTACHED_DRV; -pub const XDP_ATTACHED_SKB: _bindgen_ty_47 = _bindgen_ty_47::XDP_ATTACHED_SKB; -pub const XDP_ATTACHED_HW: _bindgen_ty_47 = _bindgen_ty_47::XDP_ATTACHED_HW; -pub const XDP_ATTACHED_MULTI: _bindgen_ty_47 = _bindgen_ty_47::XDP_ATTACHED_MULTI; -pub const IFLA_XDP_UNSPEC: _bindgen_ty_48 = _bindgen_ty_48::IFLA_XDP_UNSPEC; -pub const IFLA_XDP_FD: _bindgen_ty_48 = _bindgen_ty_48::IFLA_XDP_FD; -pub const IFLA_XDP_ATTACHED: _bindgen_ty_48 = _bindgen_ty_48::IFLA_XDP_ATTACHED; -pub const IFLA_XDP_FLAGS: _bindgen_ty_48 = _bindgen_ty_48::IFLA_XDP_FLAGS; -pub const IFLA_XDP_PROG_ID: _bindgen_ty_48 = _bindgen_ty_48::IFLA_XDP_PROG_ID; -pub const IFLA_XDP_DRV_PROG_ID: _bindgen_ty_48 = _bindgen_ty_48::IFLA_XDP_DRV_PROG_ID; -pub const IFLA_XDP_SKB_PROG_ID: _bindgen_ty_48 = _bindgen_ty_48::IFLA_XDP_SKB_PROG_ID; -pub const IFLA_XDP_HW_PROG_ID: _bindgen_ty_48 = _bindgen_ty_48::IFLA_XDP_HW_PROG_ID; -pub const IFLA_XDP_EXPECTED_FD: _bindgen_ty_48 = _bindgen_ty_48::IFLA_XDP_EXPECTED_FD; -pub const __IFLA_XDP_MAX: _bindgen_ty_48 = _bindgen_ty_48::__IFLA_XDP_MAX; -pub const IFLA_EVENT_NONE: _bindgen_ty_49 = _bindgen_ty_49::IFLA_EVENT_NONE; -pub const IFLA_EVENT_REBOOT: _bindgen_ty_49 = _bindgen_ty_49::IFLA_EVENT_REBOOT; -pub const IFLA_EVENT_FEATURES: _bindgen_ty_49 = _bindgen_ty_49::IFLA_EVENT_FEATURES; -pub const IFLA_EVENT_BONDING_FAILOVER: _bindgen_ty_49 = _bindgen_ty_49::IFLA_EVENT_BONDING_FAILOVER; -pub const IFLA_EVENT_NOTIFY_PEERS: _bindgen_ty_49 = _bindgen_ty_49::IFLA_EVENT_NOTIFY_PEERS; -pub const IFLA_EVENT_IGMP_RESEND: _bindgen_ty_49 = _bindgen_ty_49::IFLA_EVENT_IGMP_RESEND; -pub const IFLA_EVENT_BONDING_OPTIONS: _bindgen_ty_49 = _bindgen_ty_49::IFLA_EVENT_BONDING_OPTIONS; -pub const IFLA_TUN_UNSPEC: _bindgen_ty_50 = _bindgen_ty_50::IFLA_TUN_UNSPEC; -pub const IFLA_TUN_OWNER: _bindgen_ty_50 = _bindgen_ty_50::IFLA_TUN_OWNER; -pub const IFLA_TUN_GROUP: _bindgen_ty_50 = _bindgen_ty_50::IFLA_TUN_GROUP; -pub const IFLA_TUN_TYPE: _bindgen_ty_50 = _bindgen_ty_50::IFLA_TUN_TYPE; -pub const IFLA_TUN_PI: _bindgen_ty_50 = _bindgen_ty_50::IFLA_TUN_PI; -pub const IFLA_TUN_VNET_HDR: _bindgen_ty_50 = _bindgen_ty_50::IFLA_TUN_VNET_HDR; -pub const IFLA_TUN_PERSIST: _bindgen_ty_50 = _bindgen_ty_50::IFLA_TUN_PERSIST; -pub const IFLA_TUN_MULTI_QUEUE: _bindgen_ty_50 = _bindgen_ty_50::IFLA_TUN_MULTI_QUEUE; -pub const IFLA_TUN_NUM_QUEUES: _bindgen_ty_50 = _bindgen_ty_50::IFLA_TUN_NUM_QUEUES; -pub const IFLA_TUN_NUM_DISABLED_QUEUES: _bindgen_ty_50 = _bindgen_ty_50::IFLA_TUN_NUM_DISABLED_QUEUES; -pub const __IFLA_TUN_MAX: _bindgen_ty_50 = _bindgen_ty_50::__IFLA_TUN_MAX; -pub const IFLA_RMNET_UNSPEC: _bindgen_ty_51 = _bindgen_ty_51::IFLA_RMNET_UNSPEC; -pub const IFLA_RMNET_MUX_ID: _bindgen_ty_51 = _bindgen_ty_51::IFLA_RMNET_MUX_ID; -pub const IFLA_RMNET_FLAGS: _bindgen_ty_51 = _bindgen_ty_51::IFLA_RMNET_FLAGS; -pub const __IFLA_RMNET_MAX: _bindgen_ty_51 = _bindgen_ty_51::__IFLA_RMNET_MAX; -pub const IFLA_MCTP_UNSPEC: _bindgen_ty_52 = _bindgen_ty_52::IFLA_MCTP_UNSPEC; -pub const IFLA_MCTP_NET: _bindgen_ty_52 = _bindgen_ty_52::IFLA_MCTP_NET; -pub const __IFLA_MCTP_MAX: _bindgen_ty_52 = _bindgen_ty_52::__IFLA_MCTP_MAX; -pub const IFLA_DSA_UNSPEC: _bindgen_ty_53 = _bindgen_ty_53::IFLA_DSA_UNSPEC; -pub const IFLA_DSA_MASTER: _bindgen_ty_53 = _bindgen_ty_53::IFLA_DSA_MASTER; -pub const __IFLA_DSA_MAX: _bindgen_ty_53 = _bindgen_ty_53::__IFLA_DSA_MAX; -pub const IFA_UNSPEC: _bindgen_ty_54 = _bindgen_ty_54::IFA_UNSPEC; -pub const IFA_ADDRESS: _bindgen_ty_54 = _bindgen_ty_54::IFA_ADDRESS; -pub const IFA_LOCAL: _bindgen_ty_54 = _bindgen_ty_54::IFA_LOCAL; -pub const IFA_LABEL: _bindgen_ty_54 = _bindgen_ty_54::IFA_LABEL; -pub const IFA_BROADCAST: _bindgen_ty_54 = _bindgen_ty_54::IFA_BROADCAST; -pub const IFA_ANYCAST: _bindgen_ty_54 = _bindgen_ty_54::IFA_ANYCAST; -pub const IFA_CACHEINFO: _bindgen_ty_54 = _bindgen_ty_54::IFA_CACHEINFO; -pub const IFA_MULTICAST: _bindgen_ty_54 = _bindgen_ty_54::IFA_MULTICAST; -pub const IFA_FLAGS: _bindgen_ty_54 = _bindgen_ty_54::IFA_FLAGS; -pub const IFA_RT_PRIORITY: _bindgen_ty_54 = _bindgen_ty_54::IFA_RT_PRIORITY; -pub const IFA_TARGET_NETNSID: _bindgen_ty_54 = _bindgen_ty_54::IFA_TARGET_NETNSID; -pub const IFA_PROTO: _bindgen_ty_54 = _bindgen_ty_54::IFA_PROTO; -pub const __IFA_MAX: _bindgen_ty_54 = _bindgen_ty_54::__IFA_MAX; -pub const NDA_UNSPEC: _bindgen_ty_55 = _bindgen_ty_55::NDA_UNSPEC; -pub const NDA_DST: _bindgen_ty_55 = _bindgen_ty_55::NDA_DST; -pub const NDA_LLADDR: _bindgen_ty_55 = _bindgen_ty_55::NDA_LLADDR; -pub const NDA_CACHEINFO: _bindgen_ty_55 = _bindgen_ty_55::NDA_CACHEINFO; -pub const NDA_PROBES: _bindgen_ty_55 = _bindgen_ty_55::NDA_PROBES; -pub const NDA_VLAN: _bindgen_ty_55 = _bindgen_ty_55::NDA_VLAN; -pub const NDA_PORT: _bindgen_ty_55 = _bindgen_ty_55::NDA_PORT; -pub const NDA_VNI: _bindgen_ty_55 = _bindgen_ty_55::NDA_VNI; -pub const NDA_IFINDEX: _bindgen_ty_55 = _bindgen_ty_55::NDA_IFINDEX; -pub const NDA_MASTER: _bindgen_ty_55 = _bindgen_ty_55::NDA_MASTER; -pub const NDA_LINK_NETNSID: _bindgen_ty_55 = _bindgen_ty_55::NDA_LINK_NETNSID; -pub const NDA_SRC_VNI: _bindgen_ty_55 = _bindgen_ty_55::NDA_SRC_VNI; -pub const NDA_PROTOCOL: _bindgen_ty_55 = _bindgen_ty_55::NDA_PROTOCOL; -pub const NDA_NH_ID: _bindgen_ty_55 = _bindgen_ty_55::NDA_NH_ID; -pub const NDA_FDB_EXT_ATTRS: _bindgen_ty_55 = _bindgen_ty_55::NDA_FDB_EXT_ATTRS; -pub const NDA_FLAGS_EXT: _bindgen_ty_55 = _bindgen_ty_55::NDA_FLAGS_EXT; -pub const NDA_NDM_STATE_MASK: _bindgen_ty_55 = _bindgen_ty_55::NDA_NDM_STATE_MASK; -pub const NDA_NDM_FLAGS_MASK: _bindgen_ty_55 = _bindgen_ty_55::NDA_NDM_FLAGS_MASK; -pub const __NDA_MAX: _bindgen_ty_55 = _bindgen_ty_55::__NDA_MAX; -pub const NDTPA_UNSPEC: _bindgen_ty_56 = _bindgen_ty_56::NDTPA_UNSPEC; -pub const NDTPA_IFINDEX: _bindgen_ty_56 = _bindgen_ty_56::NDTPA_IFINDEX; -pub const NDTPA_REFCNT: _bindgen_ty_56 = _bindgen_ty_56::NDTPA_REFCNT; -pub const NDTPA_REACHABLE_TIME: _bindgen_ty_56 = _bindgen_ty_56::NDTPA_REACHABLE_TIME; -pub const NDTPA_BASE_REACHABLE_TIME: _bindgen_ty_56 = _bindgen_ty_56::NDTPA_BASE_REACHABLE_TIME; -pub const NDTPA_RETRANS_TIME: _bindgen_ty_56 = _bindgen_ty_56::NDTPA_RETRANS_TIME; -pub const NDTPA_GC_STALETIME: _bindgen_ty_56 = _bindgen_ty_56::NDTPA_GC_STALETIME; -pub const NDTPA_DELAY_PROBE_TIME: _bindgen_ty_56 = _bindgen_ty_56::NDTPA_DELAY_PROBE_TIME; -pub const NDTPA_QUEUE_LEN: _bindgen_ty_56 = _bindgen_ty_56::NDTPA_QUEUE_LEN; -pub const NDTPA_APP_PROBES: _bindgen_ty_56 = _bindgen_ty_56::NDTPA_APP_PROBES; -pub const NDTPA_UCAST_PROBES: _bindgen_ty_56 = _bindgen_ty_56::NDTPA_UCAST_PROBES; -pub const NDTPA_MCAST_PROBES: _bindgen_ty_56 = _bindgen_ty_56::NDTPA_MCAST_PROBES; -pub const NDTPA_ANYCAST_DELAY: _bindgen_ty_56 = _bindgen_ty_56::NDTPA_ANYCAST_DELAY; -pub const NDTPA_PROXY_DELAY: _bindgen_ty_56 = _bindgen_ty_56::NDTPA_PROXY_DELAY; -pub const NDTPA_PROXY_QLEN: _bindgen_ty_56 = _bindgen_ty_56::NDTPA_PROXY_QLEN; -pub const NDTPA_LOCKTIME: _bindgen_ty_56 = _bindgen_ty_56::NDTPA_LOCKTIME; -pub const NDTPA_QUEUE_LENBYTES: _bindgen_ty_56 = _bindgen_ty_56::NDTPA_QUEUE_LENBYTES; -pub const NDTPA_MCAST_REPROBES: _bindgen_ty_56 = _bindgen_ty_56::NDTPA_MCAST_REPROBES; -pub const NDTPA_PAD: _bindgen_ty_56 = _bindgen_ty_56::NDTPA_PAD; -pub const NDTPA_INTERVAL_PROBE_TIME_MS: _bindgen_ty_56 = _bindgen_ty_56::NDTPA_INTERVAL_PROBE_TIME_MS; -pub const __NDTPA_MAX: _bindgen_ty_56 = _bindgen_ty_56::__NDTPA_MAX; -pub const NDTA_UNSPEC: _bindgen_ty_57 = _bindgen_ty_57::NDTA_UNSPEC; -pub const NDTA_NAME: _bindgen_ty_57 = _bindgen_ty_57::NDTA_NAME; -pub const NDTA_THRESH1: _bindgen_ty_57 = _bindgen_ty_57::NDTA_THRESH1; -pub const NDTA_THRESH2: _bindgen_ty_57 = _bindgen_ty_57::NDTA_THRESH2; -pub const NDTA_THRESH3: _bindgen_ty_57 = _bindgen_ty_57::NDTA_THRESH3; -pub const NDTA_CONFIG: _bindgen_ty_57 = _bindgen_ty_57::NDTA_CONFIG; -pub const NDTA_PARMS: _bindgen_ty_57 = _bindgen_ty_57::NDTA_PARMS; -pub const NDTA_STATS: _bindgen_ty_57 = _bindgen_ty_57::NDTA_STATS; -pub const NDTA_GC_INTERVAL: _bindgen_ty_57 = _bindgen_ty_57::NDTA_GC_INTERVAL; -pub const NDTA_PAD: _bindgen_ty_57 = _bindgen_ty_57::NDTA_PAD; -pub const __NDTA_MAX: _bindgen_ty_57 = _bindgen_ty_57::__NDTA_MAX; -pub const FDB_NOTIFY_BIT: _bindgen_ty_58 = _bindgen_ty_58::FDB_NOTIFY_BIT; -pub const FDB_NOTIFY_INACTIVE_BIT: _bindgen_ty_58 = _bindgen_ty_58::FDB_NOTIFY_INACTIVE_BIT; -pub const NFEA_UNSPEC: _bindgen_ty_59 = _bindgen_ty_59::NFEA_UNSPEC; -pub const NFEA_ACTIVITY_NOTIFY: _bindgen_ty_59 = _bindgen_ty_59::NFEA_ACTIVITY_NOTIFY; -pub const NFEA_DONT_REFRESH: _bindgen_ty_59 = _bindgen_ty_59::NFEA_DONT_REFRESH; -pub const __NFEA_MAX: _bindgen_ty_59 = _bindgen_ty_59::__NFEA_MAX; -pub const RTM_BASE: _bindgen_ty_60 = _bindgen_ty_60::RTM_BASE; -pub const RTM_NEWLINK: _bindgen_ty_60 = _bindgen_ty_60::RTM_BASE; -pub const RTM_DELLINK: _bindgen_ty_60 = _bindgen_ty_60::RTM_DELLINK; -pub const RTM_GETLINK: _bindgen_ty_60 = _bindgen_ty_60::RTM_GETLINK; -pub const RTM_SETLINK: _bindgen_ty_60 = _bindgen_ty_60::RTM_SETLINK; -pub const RTM_NEWADDR: _bindgen_ty_60 = _bindgen_ty_60::RTM_NEWADDR; -pub const RTM_DELADDR: _bindgen_ty_60 = _bindgen_ty_60::RTM_DELADDR; -pub const RTM_GETADDR: _bindgen_ty_60 = _bindgen_ty_60::RTM_GETADDR; -pub const RTM_NEWROUTE: _bindgen_ty_60 = _bindgen_ty_60::RTM_NEWROUTE; -pub const RTM_DELROUTE: _bindgen_ty_60 = _bindgen_ty_60::RTM_DELROUTE; -pub const RTM_GETROUTE: _bindgen_ty_60 = _bindgen_ty_60::RTM_GETROUTE; -pub const RTM_NEWNEIGH: _bindgen_ty_60 = _bindgen_ty_60::RTM_NEWNEIGH; -pub const RTM_DELNEIGH: _bindgen_ty_60 = _bindgen_ty_60::RTM_DELNEIGH; -pub const RTM_GETNEIGH: _bindgen_ty_60 = _bindgen_ty_60::RTM_GETNEIGH; -pub const RTM_NEWRULE: _bindgen_ty_60 = _bindgen_ty_60::RTM_NEWRULE; -pub const RTM_DELRULE: _bindgen_ty_60 = _bindgen_ty_60::RTM_DELRULE; -pub const RTM_GETRULE: _bindgen_ty_60 = _bindgen_ty_60::RTM_GETRULE; -pub const RTM_NEWQDISC: _bindgen_ty_60 = _bindgen_ty_60::RTM_NEWQDISC; -pub const RTM_DELQDISC: _bindgen_ty_60 = _bindgen_ty_60::RTM_DELQDISC; -pub const RTM_GETQDISC: _bindgen_ty_60 = _bindgen_ty_60::RTM_GETQDISC; -pub const RTM_NEWTCLASS: _bindgen_ty_60 = _bindgen_ty_60::RTM_NEWTCLASS; -pub const RTM_DELTCLASS: _bindgen_ty_60 = _bindgen_ty_60::RTM_DELTCLASS; -pub const RTM_GETTCLASS: _bindgen_ty_60 = _bindgen_ty_60::RTM_GETTCLASS; -pub const RTM_NEWTFILTER: _bindgen_ty_60 = _bindgen_ty_60::RTM_NEWTFILTER; -pub const RTM_DELTFILTER: _bindgen_ty_60 = _bindgen_ty_60::RTM_DELTFILTER; -pub const RTM_GETTFILTER: _bindgen_ty_60 = _bindgen_ty_60::RTM_GETTFILTER; -pub const RTM_NEWACTION: _bindgen_ty_60 = _bindgen_ty_60::RTM_NEWACTION; -pub const RTM_DELACTION: _bindgen_ty_60 = _bindgen_ty_60::RTM_DELACTION; -pub const RTM_GETACTION: _bindgen_ty_60 = _bindgen_ty_60::RTM_GETACTION; -pub const RTM_NEWPREFIX: _bindgen_ty_60 = _bindgen_ty_60::RTM_NEWPREFIX; -pub const RTM_GETMULTICAST: _bindgen_ty_60 = _bindgen_ty_60::RTM_GETMULTICAST; -pub const RTM_GETANYCAST: _bindgen_ty_60 = _bindgen_ty_60::RTM_GETANYCAST; -pub const RTM_NEWNEIGHTBL: _bindgen_ty_60 = _bindgen_ty_60::RTM_NEWNEIGHTBL; -pub const RTM_GETNEIGHTBL: _bindgen_ty_60 = _bindgen_ty_60::RTM_GETNEIGHTBL; -pub const RTM_SETNEIGHTBL: _bindgen_ty_60 = _bindgen_ty_60::RTM_SETNEIGHTBL; -pub const RTM_NEWNDUSEROPT: _bindgen_ty_60 = _bindgen_ty_60::RTM_NEWNDUSEROPT; -pub const RTM_NEWADDRLABEL: _bindgen_ty_60 = _bindgen_ty_60::RTM_NEWADDRLABEL; -pub const RTM_DELADDRLABEL: _bindgen_ty_60 = _bindgen_ty_60::RTM_DELADDRLABEL; -pub const RTM_GETADDRLABEL: _bindgen_ty_60 = _bindgen_ty_60::RTM_GETADDRLABEL; -pub const RTM_GETDCB: _bindgen_ty_60 = _bindgen_ty_60::RTM_GETDCB; -pub const RTM_SETDCB: _bindgen_ty_60 = _bindgen_ty_60::RTM_SETDCB; -pub const RTM_NEWNETCONF: _bindgen_ty_60 = _bindgen_ty_60::RTM_NEWNETCONF; -pub const RTM_DELNETCONF: _bindgen_ty_60 = _bindgen_ty_60::RTM_DELNETCONF; -pub const RTM_GETNETCONF: _bindgen_ty_60 = _bindgen_ty_60::RTM_GETNETCONF; -pub const RTM_NEWMDB: _bindgen_ty_60 = _bindgen_ty_60::RTM_NEWMDB; -pub const RTM_DELMDB: _bindgen_ty_60 = _bindgen_ty_60::RTM_DELMDB; -pub const RTM_GETMDB: _bindgen_ty_60 = _bindgen_ty_60::RTM_GETMDB; -pub const RTM_NEWNSID: _bindgen_ty_60 = _bindgen_ty_60::RTM_NEWNSID; -pub const RTM_DELNSID: _bindgen_ty_60 = _bindgen_ty_60::RTM_DELNSID; -pub const RTM_GETNSID: _bindgen_ty_60 = _bindgen_ty_60::RTM_GETNSID; -pub const RTM_NEWSTATS: _bindgen_ty_60 = _bindgen_ty_60::RTM_NEWSTATS; -pub const RTM_GETSTATS: _bindgen_ty_60 = _bindgen_ty_60::RTM_GETSTATS; -pub const RTM_SETSTATS: _bindgen_ty_60 = _bindgen_ty_60::RTM_SETSTATS; -pub const RTM_NEWCACHEREPORT: _bindgen_ty_60 = _bindgen_ty_60::RTM_NEWCACHEREPORT; -pub const RTM_NEWCHAIN: _bindgen_ty_60 = _bindgen_ty_60::RTM_NEWCHAIN; -pub const RTM_DELCHAIN: _bindgen_ty_60 = _bindgen_ty_60::RTM_DELCHAIN; -pub const RTM_GETCHAIN: _bindgen_ty_60 = _bindgen_ty_60::RTM_GETCHAIN; -pub const RTM_NEWNEXTHOP: _bindgen_ty_60 = _bindgen_ty_60::RTM_NEWNEXTHOP; -pub const RTM_DELNEXTHOP: _bindgen_ty_60 = _bindgen_ty_60::RTM_DELNEXTHOP; -pub const RTM_GETNEXTHOP: _bindgen_ty_60 = _bindgen_ty_60::RTM_GETNEXTHOP; -pub const RTM_NEWLINKPROP: _bindgen_ty_60 = _bindgen_ty_60::RTM_NEWLINKPROP; -pub const RTM_DELLINKPROP: _bindgen_ty_60 = _bindgen_ty_60::RTM_DELLINKPROP; -pub const RTM_GETLINKPROP: _bindgen_ty_60 = _bindgen_ty_60::RTM_GETLINKPROP; -pub const RTM_NEWVLAN: _bindgen_ty_60 = _bindgen_ty_60::RTM_NEWVLAN; -pub const RTM_DELVLAN: _bindgen_ty_60 = _bindgen_ty_60::RTM_DELVLAN; -pub const RTM_GETVLAN: _bindgen_ty_60 = _bindgen_ty_60::RTM_GETVLAN; -pub const RTM_NEWNEXTHOPBUCKET: _bindgen_ty_60 = _bindgen_ty_60::RTM_NEWNEXTHOPBUCKET; -pub const RTM_DELNEXTHOPBUCKET: _bindgen_ty_60 = _bindgen_ty_60::RTM_DELNEXTHOPBUCKET; -pub const RTM_GETNEXTHOPBUCKET: _bindgen_ty_60 = _bindgen_ty_60::RTM_GETNEXTHOPBUCKET; -pub const RTM_NEWTUNNEL: _bindgen_ty_60 = _bindgen_ty_60::RTM_NEWTUNNEL; -pub const RTM_DELTUNNEL: _bindgen_ty_60 = _bindgen_ty_60::RTM_DELTUNNEL; -pub const RTM_GETTUNNEL: _bindgen_ty_60 = _bindgen_ty_60::RTM_GETTUNNEL; -pub const __RTM_MAX: _bindgen_ty_60 = _bindgen_ty_60::__RTM_MAX; -pub const RTN_UNSPEC: _bindgen_ty_61 = _bindgen_ty_61::RTN_UNSPEC; -pub const RTN_UNICAST: _bindgen_ty_61 = _bindgen_ty_61::RTN_UNICAST; -pub const RTN_LOCAL: _bindgen_ty_61 = _bindgen_ty_61::RTN_LOCAL; -pub const RTN_BROADCAST: _bindgen_ty_61 = _bindgen_ty_61::RTN_BROADCAST; -pub const RTN_ANYCAST: _bindgen_ty_61 = _bindgen_ty_61::RTN_ANYCAST; -pub const RTN_MULTICAST: _bindgen_ty_61 = _bindgen_ty_61::RTN_MULTICAST; -pub const RTN_BLACKHOLE: _bindgen_ty_61 = _bindgen_ty_61::RTN_BLACKHOLE; -pub const RTN_UNREACHABLE: _bindgen_ty_61 = _bindgen_ty_61::RTN_UNREACHABLE; -pub const RTN_PROHIBIT: _bindgen_ty_61 = _bindgen_ty_61::RTN_PROHIBIT; -pub const RTN_THROW: _bindgen_ty_61 = _bindgen_ty_61::RTN_THROW; -pub const RTN_NAT: _bindgen_ty_61 = _bindgen_ty_61::RTN_NAT; -pub const RTN_XRESOLVE: _bindgen_ty_61 = _bindgen_ty_61::RTN_XRESOLVE; -pub const __RTN_MAX: _bindgen_ty_61 = _bindgen_ty_61::__RTN_MAX; -pub const RTAX_UNSPEC: _bindgen_ty_62 = _bindgen_ty_62::RTAX_UNSPEC; -pub const RTAX_LOCK: _bindgen_ty_62 = _bindgen_ty_62::RTAX_LOCK; -pub const RTAX_MTU: _bindgen_ty_62 = _bindgen_ty_62::RTAX_MTU; -pub const RTAX_WINDOW: _bindgen_ty_62 = _bindgen_ty_62::RTAX_WINDOW; -pub const RTAX_RTT: _bindgen_ty_62 = _bindgen_ty_62::RTAX_RTT; -pub const RTAX_RTTVAR: _bindgen_ty_62 = _bindgen_ty_62::RTAX_RTTVAR; -pub const RTAX_SSTHRESH: _bindgen_ty_62 = _bindgen_ty_62::RTAX_SSTHRESH; -pub const RTAX_CWND: _bindgen_ty_62 = _bindgen_ty_62::RTAX_CWND; -pub const RTAX_ADVMSS: _bindgen_ty_62 = _bindgen_ty_62::RTAX_ADVMSS; -pub const RTAX_REORDERING: _bindgen_ty_62 = _bindgen_ty_62::RTAX_REORDERING; -pub const RTAX_HOPLIMIT: _bindgen_ty_62 = _bindgen_ty_62::RTAX_HOPLIMIT; -pub const RTAX_INITCWND: _bindgen_ty_62 = _bindgen_ty_62::RTAX_INITCWND; -pub const RTAX_FEATURES: _bindgen_ty_62 = _bindgen_ty_62::RTAX_FEATURES; -pub const RTAX_RTO_MIN: _bindgen_ty_62 = _bindgen_ty_62::RTAX_RTO_MIN; -pub const RTAX_INITRWND: _bindgen_ty_62 = _bindgen_ty_62::RTAX_INITRWND; -pub const RTAX_QUICKACK: _bindgen_ty_62 = _bindgen_ty_62::RTAX_QUICKACK; -pub const RTAX_CC_ALGO: _bindgen_ty_62 = _bindgen_ty_62::RTAX_CC_ALGO; -pub const RTAX_FASTOPEN_NO_COOKIE: _bindgen_ty_62 = _bindgen_ty_62::RTAX_FASTOPEN_NO_COOKIE; -pub const __RTAX_MAX: _bindgen_ty_62 = _bindgen_ty_62::__RTAX_MAX; -pub const PREFIX_UNSPEC: _bindgen_ty_63 = _bindgen_ty_63::PREFIX_UNSPEC; -pub const PREFIX_ADDRESS: _bindgen_ty_63 = _bindgen_ty_63::PREFIX_ADDRESS; -pub const PREFIX_CACHEINFO: _bindgen_ty_63 = _bindgen_ty_63::PREFIX_CACHEINFO; -pub const __PREFIX_MAX: _bindgen_ty_63 = _bindgen_ty_63::__PREFIX_MAX; -pub const TCA_UNSPEC: _bindgen_ty_64 = _bindgen_ty_64::TCA_UNSPEC; -pub const TCA_KIND: _bindgen_ty_64 = _bindgen_ty_64::TCA_KIND; -pub const TCA_OPTIONS: _bindgen_ty_64 = _bindgen_ty_64::TCA_OPTIONS; -pub const TCA_STATS: _bindgen_ty_64 = _bindgen_ty_64::TCA_STATS; -pub const TCA_XSTATS: _bindgen_ty_64 = _bindgen_ty_64::TCA_XSTATS; -pub const TCA_RATE: _bindgen_ty_64 = _bindgen_ty_64::TCA_RATE; -pub const TCA_FCNT: _bindgen_ty_64 = _bindgen_ty_64::TCA_FCNT; -pub const TCA_STATS2: _bindgen_ty_64 = _bindgen_ty_64::TCA_STATS2; -pub const TCA_STAB: _bindgen_ty_64 = _bindgen_ty_64::TCA_STAB; -pub const TCA_PAD: _bindgen_ty_64 = _bindgen_ty_64::TCA_PAD; -pub const TCA_DUMP_INVISIBLE: _bindgen_ty_64 = _bindgen_ty_64::TCA_DUMP_INVISIBLE; -pub const TCA_CHAIN: _bindgen_ty_64 = _bindgen_ty_64::TCA_CHAIN; -pub const TCA_HW_OFFLOAD: _bindgen_ty_64 = _bindgen_ty_64::TCA_HW_OFFLOAD; -pub const TCA_INGRESS_BLOCK: _bindgen_ty_64 = _bindgen_ty_64::TCA_INGRESS_BLOCK; -pub const TCA_EGRESS_BLOCK: _bindgen_ty_64 = _bindgen_ty_64::TCA_EGRESS_BLOCK; -pub const TCA_DUMP_FLAGS: _bindgen_ty_64 = _bindgen_ty_64::TCA_DUMP_FLAGS; -pub const TCA_EXT_WARN_MSG: _bindgen_ty_64 = _bindgen_ty_64::TCA_EXT_WARN_MSG; -pub const __TCA_MAX: _bindgen_ty_64 = _bindgen_ty_64::__TCA_MAX; -pub const NDUSEROPT_UNSPEC: _bindgen_ty_65 = _bindgen_ty_65::NDUSEROPT_UNSPEC; -pub const NDUSEROPT_SRCADDR: _bindgen_ty_65 = _bindgen_ty_65::NDUSEROPT_SRCADDR; -pub const __NDUSEROPT_MAX: _bindgen_ty_65 = _bindgen_ty_65::__NDUSEROPT_MAX; -pub const TCA_ROOT_UNSPEC: _bindgen_ty_66 = _bindgen_ty_66::TCA_ROOT_UNSPEC; -pub const TCA_ROOT_TAB: _bindgen_ty_66 = _bindgen_ty_66::TCA_ROOT_TAB; -pub const TCA_ROOT_FLAGS: _bindgen_ty_66 = _bindgen_ty_66::TCA_ROOT_FLAGS; -pub const TCA_ROOT_COUNT: _bindgen_ty_66 = _bindgen_ty_66::TCA_ROOT_COUNT; -pub const TCA_ROOT_TIME_DELTA: _bindgen_ty_66 = _bindgen_ty_66::TCA_ROOT_TIME_DELTA; -pub const TCA_ROOT_EXT_WARN_MSG: _bindgen_ty_66 = _bindgen_ty_66::TCA_ROOT_EXT_WARN_MSG; -pub const __TCA_ROOT_MAX: _bindgen_ty_66 = _bindgen_ty_66::__TCA_ROOT_MAX; -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nlmsgerr_attrs { -NLMSGERR_ATTR_UNUSED = 0, -NLMSGERR_ATTR_MSG = 1, -NLMSGERR_ATTR_OFFS = 2, -NLMSGERR_ATTR_COOKIE = 3, -NLMSGERR_ATTR_POLICY = 4, -NLMSGERR_ATTR_MISS_TYPE = 5, -NLMSGERR_ATTR_MISS_NEST = 6, -__NLMSGERR_ATTR_MAX = 7, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nl_mmap_status { -NL_MMAP_STATUS_UNUSED = 0, -NL_MMAP_STATUS_RESERVED = 1, -NL_MMAP_STATUS_VALID = 2, -NL_MMAP_STATUS_COPY = 3, -NL_MMAP_STATUS_SKIP = 4, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_1 { -NETLINK_UNCONNECTED = 0, -NETLINK_CONNECTED = 1, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum netlink_attribute_type { -NL_ATTR_TYPE_INVALID = 0, -NL_ATTR_TYPE_FLAG = 1, -NL_ATTR_TYPE_U8 = 2, -NL_ATTR_TYPE_U16 = 3, -NL_ATTR_TYPE_U32 = 4, -NL_ATTR_TYPE_U64 = 5, -NL_ATTR_TYPE_S8 = 6, -NL_ATTR_TYPE_S16 = 7, -NL_ATTR_TYPE_S32 = 8, -NL_ATTR_TYPE_S64 = 9, -NL_ATTR_TYPE_BINARY = 10, -NL_ATTR_TYPE_STRING = 11, -NL_ATTR_TYPE_NUL_STRING = 12, -NL_ATTR_TYPE_NESTED = 13, -NL_ATTR_TYPE_NESTED_ARRAY = 14, -NL_ATTR_TYPE_BITFIELD32 = 15, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum netlink_policy_type_attr { -NL_POLICY_TYPE_ATTR_UNSPEC = 0, -NL_POLICY_TYPE_ATTR_TYPE = 1, -NL_POLICY_TYPE_ATTR_MIN_VALUE_S = 2, -NL_POLICY_TYPE_ATTR_MAX_VALUE_S = 3, -NL_POLICY_TYPE_ATTR_MIN_VALUE_U = 4, -NL_POLICY_TYPE_ATTR_MAX_VALUE_U = 5, -NL_POLICY_TYPE_ATTR_MIN_LENGTH = 6, -NL_POLICY_TYPE_ATTR_MAX_LENGTH = 7, -NL_POLICY_TYPE_ATTR_POLICY_IDX = 8, -NL_POLICY_TYPE_ATTR_POLICY_MAXTYPE = 9, -NL_POLICY_TYPE_ATTR_BITFIELD32_MASK = 10, -NL_POLICY_TYPE_ATTR_PAD = 11, -NL_POLICY_TYPE_ATTR_MASK = 12, -__NL_POLICY_TYPE_ATTR_MAX = 13, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_2 { -IFLA_UNSPEC = 0, -IFLA_ADDRESS = 1, -IFLA_BROADCAST = 2, -IFLA_IFNAME = 3, -IFLA_MTU = 4, -IFLA_LINK = 5, -IFLA_QDISC = 6, -IFLA_STATS = 7, -IFLA_COST = 8, -IFLA_PRIORITY = 9, -IFLA_MASTER = 10, -IFLA_WIRELESS = 11, -IFLA_PROTINFO = 12, -IFLA_TXQLEN = 13, -IFLA_MAP = 14, -IFLA_WEIGHT = 15, -IFLA_OPERSTATE = 16, -IFLA_LINKMODE = 17, -IFLA_LINKINFO = 18, -IFLA_NET_NS_PID = 19, -IFLA_IFALIAS = 20, -IFLA_NUM_VF = 21, -IFLA_VFINFO_LIST = 22, -IFLA_STATS64 = 23, -IFLA_VF_PORTS = 24, -IFLA_PORT_SELF = 25, -IFLA_AF_SPEC = 26, -IFLA_GROUP = 27, -IFLA_NET_NS_FD = 28, -IFLA_EXT_MASK = 29, -IFLA_PROMISCUITY = 30, -IFLA_NUM_TX_QUEUES = 31, -IFLA_NUM_RX_QUEUES = 32, -IFLA_CARRIER = 33, -IFLA_PHYS_PORT_ID = 34, -IFLA_CARRIER_CHANGES = 35, -IFLA_PHYS_SWITCH_ID = 36, -IFLA_LINK_NETNSID = 37, -IFLA_PHYS_PORT_NAME = 38, -IFLA_PROTO_DOWN = 39, -IFLA_GSO_MAX_SEGS = 40, -IFLA_GSO_MAX_SIZE = 41, -IFLA_PAD = 42, -IFLA_XDP = 43, -IFLA_EVENT = 44, -IFLA_NEW_NETNSID = 45, -IFLA_IF_NETNSID = 46, -IFLA_CARRIER_UP_COUNT = 47, -IFLA_CARRIER_DOWN_COUNT = 48, -IFLA_NEW_IFINDEX = 49, -IFLA_MIN_MTU = 50, -IFLA_MAX_MTU = 51, -IFLA_PROP_LIST = 52, -IFLA_ALT_IFNAME = 53, -IFLA_PERM_ADDRESS = 54, -IFLA_PROTO_DOWN_REASON = 55, -IFLA_PARENT_DEV_NAME = 56, -IFLA_PARENT_DEV_BUS_NAME = 57, -IFLA_GRO_MAX_SIZE = 58, -IFLA_TSO_MAX_SIZE = 59, -IFLA_TSO_MAX_SEGS = 60, -IFLA_ALLMULTI = 61, -IFLA_DEVLINK_PORT = 62, -IFLA_GSO_IPV4_MAX_SIZE = 63, -IFLA_GRO_IPV4_MAX_SIZE = 64, -__IFLA_MAX = 65, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_3 { -IFLA_PROTO_DOWN_REASON_UNSPEC = 0, -IFLA_PROTO_DOWN_REASON_MASK = 1, -IFLA_PROTO_DOWN_REASON_VALUE = 2, -__IFLA_PROTO_DOWN_REASON_CNT = 3, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_4 { -IFLA_INET_UNSPEC = 0, -IFLA_INET_CONF = 1, -__IFLA_INET_MAX = 2, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_5 { -IFLA_INET6_UNSPEC = 0, -IFLA_INET6_FLAGS = 1, -IFLA_INET6_CONF = 2, -IFLA_INET6_STATS = 3, -IFLA_INET6_MCAST = 4, -IFLA_INET6_CACHEINFO = 5, -IFLA_INET6_ICMP6STATS = 6, -IFLA_INET6_TOKEN = 7, -IFLA_INET6_ADDR_GEN_MODE = 8, -IFLA_INET6_RA_MTU = 9, -__IFLA_INET6_MAX = 10, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum in6_addr_gen_mode { -IN6_ADDR_GEN_MODE_EUI64 = 0, -IN6_ADDR_GEN_MODE_NONE = 1, -IN6_ADDR_GEN_MODE_STABLE_PRIVACY = 2, -IN6_ADDR_GEN_MODE_RANDOM = 3, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_6 { -IFLA_BR_UNSPEC = 0, -IFLA_BR_FORWARD_DELAY = 1, -IFLA_BR_HELLO_TIME = 2, -IFLA_BR_MAX_AGE = 3, -IFLA_BR_AGEING_TIME = 4, -IFLA_BR_STP_STATE = 5, -IFLA_BR_PRIORITY = 6, -IFLA_BR_VLAN_FILTERING = 7, -IFLA_BR_VLAN_PROTOCOL = 8, -IFLA_BR_GROUP_FWD_MASK = 9, -IFLA_BR_ROOT_ID = 10, -IFLA_BR_BRIDGE_ID = 11, -IFLA_BR_ROOT_PORT = 12, -IFLA_BR_ROOT_PATH_COST = 13, -IFLA_BR_TOPOLOGY_CHANGE = 14, -IFLA_BR_TOPOLOGY_CHANGE_DETECTED = 15, -IFLA_BR_HELLO_TIMER = 16, -IFLA_BR_TCN_TIMER = 17, -IFLA_BR_TOPOLOGY_CHANGE_TIMER = 18, -IFLA_BR_GC_TIMER = 19, -IFLA_BR_GROUP_ADDR = 20, -IFLA_BR_FDB_FLUSH = 21, -IFLA_BR_MCAST_ROUTER = 22, -IFLA_BR_MCAST_SNOOPING = 23, -IFLA_BR_MCAST_QUERY_USE_IFADDR = 24, -IFLA_BR_MCAST_QUERIER = 25, -IFLA_BR_MCAST_HASH_ELASTICITY = 26, -IFLA_BR_MCAST_HASH_MAX = 27, -IFLA_BR_MCAST_LAST_MEMBER_CNT = 28, -IFLA_BR_MCAST_STARTUP_QUERY_CNT = 29, -IFLA_BR_MCAST_LAST_MEMBER_INTVL = 30, -IFLA_BR_MCAST_MEMBERSHIP_INTVL = 31, -IFLA_BR_MCAST_QUERIER_INTVL = 32, -IFLA_BR_MCAST_QUERY_INTVL = 33, -IFLA_BR_MCAST_QUERY_RESPONSE_INTVL = 34, -IFLA_BR_MCAST_STARTUP_QUERY_INTVL = 35, -IFLA_BR_NF_CALL_IPTABLES = 36, -IFLA_BR_NF_CALL_IP6TABLES = 37, -IFLA_BR_NF_CALL_ARPTABLES = 38, -IFLA_BR_VLAN_DEFAULT_PVID = 39, -IFLA_BR_PAD = 40, -IFLA_BR_VLAN_STATS_ENABLED = 41, -IFLA_BR_MCAST_STATS_ENABLED = 42, -IFLA_BR_MCAST_IGMP_VERSION = 43, -IFLA_BR_MCAST_MLD_VERSION = 44, -IFLA_BR_VLAN_STATS_PER_PORT = 45, -IFLA_BR_MULTI_BOOLOPT = 46, -IFLA_BR_MCAST_QUERIER_STATE = 47, -__IFLA_BR_MAX = 48, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_7 { -BRIDGE_MODE_UNSPEC = 0, -BRIDGE_MODE_HAIRPIN = 1, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_8 { -IFLA_BRPORT_UNSPEC = 0, -IFLA_BRPORT_STATE = 1, -IFLA_BRPORT_PRIORITY = 2, -IFLA_BRPORT_COST = 3, -IFLA_BRPORT_MODE = 4, -IFLA_BRPORT_GUARD = 5, -IFLA_BRPORT_PROTECT = 6, -IFLA_BRPORT_FAST_LEAVE = 7, -IFLA_BRPORT_LEARNING = 8, -IFLA_BRPORT_UNICAST_FLOOD = 9, -IFLA_BRPORT_PROXYARP = 10, -IFLA_BRPORT_LEARNING_SYNC = 11, -IFLA_BRPORT_PROXYARP_WIFI = 12, -IFLA_BRPORT_ROOT_ID = 13, -IFLA_BRPORT_BRIDGE_ID = 14, -IFLA_BRPORT_DESIGNATED_PORT = 15, -IFLA_BRPORT_DESIGNATED_COST = 16, -IFLA_BRPORT_ID = 17, -IFLA_BRPORT_NO = 18, -IFLA_BRPORT_TOPOLOGY_CHANGE_ACK = 19, -IFLA_BRPORT_CONFIG_PENDING = 20, -IFLA_BRPORT_MESSAGE_AGE_TIMER = 21, -IFLA_BRPORT_FORWARD_DELAY_TIMER = 22, -IFLA_BRPORT_HOLD_TIMER = 23, -IFLA_BRPORT_FLUSH = 24, -IFLA_BRPORT_MULTICAST_ROUTER = 25, -IFLA_BRPORT_PAD = 26, -IFLA_BRPORT_MCAST_FLOOD = 27, -IFLA_BRPORT_MCAST_TO_UCAST = 28, -IFLA_BRPORT_VLAN_TUNNEL = 29, -IFLA_BRPORT_BCAST_FLOOD = 30, -IFLA_BRPORT_GROUP_FWD_MASK = 31, -IFLA_BRPORT_NEIGH_SUPPRESS = 32, -IFLA_BRPORT_ISOLATED = 33, -IFLA_BRPORT_BACKUP_PORT = 34, -IFLA_BRPORT_MRP_RING_OPEN = 35, -IFLA_BRPORT_MRP_IN_OPEN = 36, -IFLA_BRPORT_MCAST_EHT_HOSTS_LIMIT = 37, -IFLA_BRPORT_MCAST_EHT_HOSTS_CNT = 38, -IFLA_BRPORT_LOCKED = 39, -IFLA_BRPORT_MAB = 40, -IFLA_BRPORT_MCAST_N_GROUPS = 41, -IFLA_BRPORT_MCAST_MAX_GROUPS = 42, -__IFLA_BRPORT_MAX = 43, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_9 { -IFLA_INFO_UNSPEC = 0, -IFLA_INFO_KIND = 1, -IFLA_INFO_DATA = 2, -IFLA_INFO_XSTATS = 3, -IFLA_INFO_SLAVE_KIND = 4, -IFLA_INFO_SLAVE_DATA = 5, -__IFLA_INFO_MAX = 6, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_10 { -IFLA_VLAN_UNSPEC = 0, -IFLA_VLAN_ID = 1, -IFLA_VLAN_FLAGS = 2, -IFLA_VLAN_EGRESS_QOS = 3, -IFLA_VLAN_INGRESS_QOS = 4, -IFLA_VLAN_PROTOCOL = 5, -__IFLA_VLAN_MAX = 6, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_11 { -IFLA_VLAN_QOS_UNSPEC = 0, -IFLA_VLAN_QOS_MAPPING = 1, -__IFLA_VLAN_QOS_MAX = 2, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_12 { -IFLA_MACVLAN_UNSPEC = 0, -IFLA_MACVLAN_MODE = 1, -IFLA_MACVLAN_FLAGS = 2, -IFLA_MACVLAN_MACADDR_MODE = 3, -IFLA_MACVLAN_MACADDR = 4, -IFLA_MACVLAN_MACADDR_DATA = 5, -IFLA_MACVLAN_MACADDR_COUNT = 6, -IFLA_MACVLAN_BC_QUEUE_LEN = 7, -IFLA_MACVLAN_BC_QUEUE_LEN_USED = 8, -__IFLA_MACVLAN_MAX = 9, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum macvlan_mode { -MACVLAN_MODE_PRIVATE = 1, -MACVLAN_MODE_VEPA = 2, -MACVLAN_MODE_BRIDGE = 4, -MACVLAN_MODE_PASSTHRU = 8, -MACVLAN_MODE_SOURCE = 16, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum macvlan_macaddr_mode { -MACVLAN_MACADDR_ADD = 0, -MACVLAN_MACADDR_DEL = 1, -MACVLAN_MACADDR_FLUSH = 2, -MACVLAN_MACADDR_SET = 3, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_13 { -IFLA_VRF_UNSPEC = 0, -IFLA_VRF_TABLE = 1, -__IFLA_VRF_MAX = 2, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_14 { -IFLA_VRF_PORT_UNSPEC = 0, -IFLA_VRF_PORT_TABLE = 1, -__IFLA_VRF_PORT_MAX = 2, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_15 { -IFLA_MACSEC_UNSPEC = 0, -IFLA_MACSEC_SCI = 1, -IFLA_MACSEC_PORT = 2, -IFLA_MACSEC_ICV_LEN = 3, -IFLA_MACSEC_CIPHER_SUITE = 4, -IFLA_MACSEC_WINDOW = 5, -IFLA_MACSEC_ENCODING_SA = 6, -IFLA_MACSEC_ENCRYPT = 7, -IFLA_MACSEC_PROTECT = 8, -IFLA_MACSEC_INC_SCI = 9, -IFLA_MACSEC_ES = 10, -IFLA_MACSEC_SCB = 11, -IFLA_MACSEC_REPLAY_PROTECT = 12, -IFLA_MACSEC_VALIDATION = 13, -IFLA_MACSEC_PAD = 14, -IFLA_MACSEC_OFFLOAD = 15, -__IFLA_MACSEC_MAX = 16, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_16 { -IFLA_XFRM_UNSPEC = 0, -IFLA_XFRM_LINK = 1, -IFLA_XFRM_IF_ID = 2, -IFLA_XFRM_COLLECT_METADATA = 3, -__IFLA_XFRM_MAX = 4, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum macsec_validation_type { -MACSEC_VALIDATE_DISABLED = 0, -MACSEC_VALIDATE_CHECK = 1, -MACSEC_VALIDATE_STRICT = 2, -__MACSEC_VALIDATE_END = 3, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum macsec_offload { -MACSEC_OFFLOAD_OFF = 0, -MACSEC_OFFLOAD_PHY = 1, -MACSEC_OFFLOAD_MAC = 2, -__MACSEC_OFFLOAD_END = 3, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_17 { -IFLA_IPVLAN_UNSPEC = 0, -IFLA_IPVLAN_MODE = 1, -IFLA_IPVLAN_FLAGS = 2, -__IFLA_IPVLAN_MAX = 3, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum ipvlan_mode { -IPVLAN_MODE_L2 = 0, -IPVLAN_MODE_L3 = 1, -IPVLAN_MODE_L3S = 2, -IPVLAN_MODE_MAX = 3, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_18 { -VNIFILTER_ENTRY_STATS_UNSPEC = 0, -VNIFILTER_ENTRY_STATS_RX_BYTES = 1, -VNIFILTER_ENTRY_STATS_RX_PKTS = 2, -VNIFILTER_ENTRY_STATS_RX_DROPS = 3, -VNIFILTER_ENTRY_STATS_RX_ERRORS = 4, -VNIFILTER_ENTRY_STATS_TX_BYTES = 5, -VNIFILTER_ENTRY_STATS_TX_PKTS = 6, -VNIFILTER_ENTRY_STATS_TX_DROPS = 7, -VNIFILTER_ENTRY_STATS_TX_ERRORS = 8, -VNIFILTER_ENTRY_STATS_PAD = 9, -__VNIFILTER_ENTRY_STATS_MAX = 10, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_19 { -VXLAN_VNIFILTER_ENTRY_UNSPEC = 0, -VXLAN_VNIFILTER_ENTRY_START = 1, -VXLAN_VNIFILTER_ENTRY_END = 2, -VXLAN_VNIFILTER_ENTRY_GROUP = 3, -VXLAN_VNIFILTER_ENTRY_GROUP6 = 4, -VXLAN_VNIFILTER_ENTRY_STATS = 5, -__VXLAN_VNIFILTER_ENTRY_MAX = 6, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_20 { -VXLAN_VNIFILTER_UNSPEC = 0, -VXLAN_VNIFILTER_ENTRY = 1, -__VXLAN_VNIFILTER_MAX = 2, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_21 { -IFLA_VXLAN_UNSPEC = 0, -IFLA_VXLAN_ID = 1, -IFLA_VXLAN_GROUP = 2, -IFLA_VXLAN_LINK = 3, -IFLA_VXLAN_LOCAL = 4, -IFLA_VXLAN_TTL = 5, -IFLA_VXLAN_TOS = 6, -IFLA_VXLAN_LEARNING = 7, -IFLA_VXLAN_AGEING = 8, -IFLA_VXLAN_LIMIT = 9, -IFLA_VXLAN_PORT_RANGE = 10, -IFLA_VXLAN_PROXY = 11, -IFLA_VXLAN_RSC = 12, -IFLA_VXLAN_L2MISS = 13, -IFLA_VXLAN_L3MISS = 14, -IFLA_VXLAN_PORT = 15, -IFLA_VXLAN_GROUP6 = 16, -IFLA_VXLAN_LOCAL6 = 17, -IFLA_VXLAN_UDP_CSUM = 18, -IFLA_VXLAN_UDP_ZERO_CSUM6_TX = 19, -IFLA_VXLAN_UDP_ZERO_CSUM6_RX = 20, -IFLA_VXLAN_REMCSUM_TX = 21, -IFLA_VXLAN_REMCSUM_RX = 22, -IFLA_VXLAN_GBP = 23, -IFLA_VXLAN_REMCSUM_NOPARTIAL = 24, -IFLA_VXLAN_COLLECT_METADATA = 25, -IFLA_VXLAN_LABEL = 26, -IFLA_VXLAN_GPE = 27, -IFLA_VXLAN_TTL_INHERIT = 28, -IFLA_VXLAN_DF = 29, -IFLA_VXLAN_VNIFILTER = 30, -__IFLA_VXLAN_MAX = 31, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum ifla_vxlan_df { -VXLAN_DF_UNSET = 0, -VXLAN_DF_SET = 1, -VXLAN_DF_INHERIT = 2, -__VXLAN_DF_END = 3, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_22 { -IFLA_GENEVE_UNSPEC = 0, -IFLA_GENEVE_ID = 1, -IFLA_GENEVE_REMOTE = 2, -IFLA_GENEVE_TTL = 3, -IFLA_GENEVE_TOS = 4, -IFLA_GENEVE_PORT = 5, -IFLA_GENEVE_COLLECT_METADATA = 6, -IFLA_GENEVE_REMOTE6 = 7, -IFLA_GENEVE_UDP_CSUM = 8, -IFLA_GENEVE_UDP_ZERO_CSUM6_TX = 9, -IFLA_GENEVE_UDP_ZERO_CSUM6_RX = 10, -IFLA_GENEVE_LABEL = 11, -IFLA_GENEVE_TTL_INHERIT = 12, -IFLA_GENEVE_DF = 13, -IFLA_GENEVE_INNER_PROTO_INHERIT = 14, -__IFLA_GENEVE_MAX = 15, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum ifla_geneve_df { -GENEVE_DF_UNSET = 0, -GENEVE_DF_SET = 1, -GENEVE_DF_INHERIT = 2, -__GENEVE_DF_END = 3, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_23 { -IFLA_BAREUDP_UNSPEC = 0, -IFLA_BAREUDP_PORT = 1, -IFLA_BAREUDP_ETHERTYPE = 2, -IFLA_BAREUDP_SRCPORT_MIN = 3, -IFLA_BAREUDP_MULTIPROTO_MODE = 4, -__IFLA_BAREUDP_MAX = 5, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_24 { -IFLA_PPP_UNSPEC = 0, -IFLA_PPP_DEV_FD = 1, -__IFLA_PPP_MAX = 2, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum ifla_gtp_role { -GTP_ROLE_GGSN = 0, -GTP_ROLE_SGSN = 1, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_25 { -IFLA_GTP_UNSPEC = 0, -IFLA_GTP_FD0 = 1, -IFLA_GTP_FD1 = 2, -IFLA_GTP_PDP_HASHSIZE = 3, -IFLA_GTP_ROLE = 4, -IFLA_GTP_CREATE_SOCKETS = 5, -IFLA_GTP_RESTART_COUNT = 6, -__IFLA_GTP_MAX = 7, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_26 { -IFLA_BOND_UNSPEC = 0, -IFLA_BOND_MODE = 1, -IFLA_BOND_ACTIVE_SLAVE = 2, -IFLA_BOND_MIIMON = 3, -IFLA_BOND_UPDELAY = 4, -IFLA_BOND_DOWNDELAY = 5, -IFLA_BOND_USE_CARRIER = 6, -IFLA_BOND_ARP_INTERVAL = 7, -IFLA_BOND_ARP_IP_TARGET = 8, -IFLA_BOND_ARP_VALIDATE = 9, -IFLA_BOND_ARP_ALL_TARGETS = 10, -IFLA_BOND_PRIMARY = 11, -IFLA_BOND_PRIMARY_RESELECT = 12, -IFLA_BOND_FAIL_OVER_MAC = 13, -IFLA_BOND_XMIT_HASH_POLICY = 14, -IFLA_BOND_RESEND_IGMP = 15, -IFLA_BOND_NUM_PEER_NOTIF = 16, -IFLA_BOND_ALL_SLAVES_ACTIVE = 17, -IFLA_BOND_MIN_LINKS = 18, -IFLA_BOND_LP_INTERVAL = 19, -IFLA_BOND_PACKETS_PER_SLAVE = 20, -IFLA_BOND_AD_LACP_RATE = 21, -IFLA_BOND_AD_SELECT = 22, -IFLA_BOND_AD_INFO = 23, -IFLA_BOND_AD_ACTOR_SYS_PRIO = 24, -IFLA_BOND_AD_USER_PORT_KEY = 25, -IFLA_BOND_AD_ACTOR_SYSTEM = 26, -IFLA_BOND_TLB_DYNAMIC_LB = 27, -IFLA_BOND_PEER_NOTIF_DELAY = 28, -IFLA_BOND_AD_LACP_ACTIVE = 29, -IFLA_BOND_MISSED_MAX = 30, -IFLA_BOND_NS_IP6_TARGET = 31, -__IFLA_BOND_MAX = 32, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_27 { -IFLA_BOND_AD_INFO_UNSPEC = 0, -IFLA_BOND_AD_INFO_AGGREGATOR = 1, -IFLA_BOND_AD_INFO_NUM_PORTS = 2, -IFLA_BOND_AD_INFO_ACTOR_KEY = 3, -IFLA_BOND_AD_INFO_PARTNER_KEY = 4, -IFLA_BOND_AD_INFO_PARTNER_MAC = 5, -__IFLA_BOND_AD_INFO_MAX = 6, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_28 { -IFLA_BOND_SLAVE_UNSPEC = 0, -IFLA_BOND_SLAVE_STATE = 1, -IFLA_BOND_SLAVE_MII_STATUS = 2, -IFLA_BOND_SLAVE_LINK_FAILURE_COUNT = 3, -IFLA_BOND_SLAVE_PERM_HWADDR = 4, -IFLA_BOND_SLAVE_QUEUE_ID = 5, -IFLA_BOND_SLAVE_AD_AGGREGATOR_ID = 6, -IFLA_BOND_SLAVE_AD_ACTOR_OPER_PORT_STATE = 7, -IFLA_BOND_SLAVE_AD_PARTNER_OPER_PORT_STATE = 8, -IFLA_BOND_SLAVE_PRIO = 9, -__IFLA_BOND_SLAVE_MAX = 10, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_29 { -IFLA_VF_INFO_UNSPEC = 0, -IFLA_VF_INFO = 1, -__IFLA_VF_INFO_MAX = 2, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_30 { -IFLA_VF_UNSPEC = 0, -IFLA_VF_MAC = 1, -IFLA_VF_VLAN = 2, -IFLA_VF_TX_RATE = 3, -IFLA_VF_SPOOFCHK = 4, -IFLA_VF_LINK_STATE = 5, -IFLA_VF_RATE = 6, -IFLA_VF_RSS_QUERY_EN = 7, -IFLA_VF_STATS = 8, -IFLA_VF_TRUST = 9, -IFLA_VF_IB_NODE_GUID = 10, -IFLA_VF_IB_PORT_GUID = 11, -IFLA_VF_VLAN_LIST = 12, -IFLA_VF_BROADCAST = 13, -__IFLA_VF_MAX = 14, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_31 { -IFLA_VF_VLAN_INFO_UNSPEC = 0, -IFLA_VF_VLAN_INFO = 1, -__IFLA_VF_VLAN_INFO_MAX = 2, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_32 { -IFLA_VF_LINK_STATE_AUTO = 0, -IFLA_VF_LINK_STATE_ENABLE = 1, -IFLA_VF_LINK_STATE_DISABLE = 2, -__IFLA_VF_LINK_STATE_MAX = 3, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_33 { -IFLA_VF_STATS_RX_PACKETS = 0, -IFLA_VF_STATS_TX_PACKETS = 1, -IFLA_VF_STATS_RX_BYTES = 2, -IFLA_VF_STATS_TX_BYTES = 3, -IFLA_VF_STATS_BROADCAST = 4, -IFLA_VF_STATS_MULTICAST = 5, -IFLA_VF_STATS_PAD = 6, -IFLA_VF_STATS_RX_DROPPED = 7, -IFLA_VF_STATS_TX_DROPPED = 8, -__IFLA_VF_STATS_MAX = 9, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_34 { -IFLA_VF_PORT_UNSPEC = 0, -IFLA_VF_PORT = 1, -__IFLA_VF_PORT_MAX = 2, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_35 { -IFLA_PORT_UNSPEC = 0, -IFLA_PORT_VF = 1, -IFLA_PORT_PROFILE = 2, -IFLA_PORT_VSI_TYPE = 3, -IFLA_PORT_INSTANCE_UUID = 4, -IFLA_PORT_HOST_UUID = 5, -IFLA_PORT_REQUEST = 6, -IFLA_PORT_RESPONSE = 7, -__IFLA_PORT_MAX = 8, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_36 { -PORT_REQUEST_PREASSOCIATE = 0, -PORT_REQUEST_PREASSOCIATE_RR = 1, -PORT_REQUEST_ASSOCIATE = 2, -PORT_REQUEST_DISASSOCIATE = 3, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_37 { -PORT_VDP_RESPONSE_SUCCESS = 0, -PORT_VDP_RESPONSE_INVALID_FORMAT = 1, -PORT_VDP_RESPONSE_INSUFFICIENT_RESOURCES = 2, -PORT_VDP_RESPONSE_UNUSED_VTID = 3, -PORT_VDP_RESPONSE_VTID_VIOLATION = 4, -PORT_VDP_RESPONSE_VTID_VERSION_VIOALTION = 5, -PORT_VDP_RESPONSE_OUT_OF_SYNC = 6, -PORT_PROFILE_RESPONSE_SUCCESS = 256, -PORT_PROFILE_RESPONSE_INPROGRESS = 257, -PORT_PROFILE_RESPONSE_INVALID = 258, -PORT_PROFILE_RESPONSE_BADSTATE = 259, -PORT_PROFILE_RESPONSE_INSUFFICIENT_RESOURCES = 260, -PORT_PROFILE_RESPONSE_ERROR = 261, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_38 { -IFLA_IPOIB_UNSPEC = 0, -IFLA_IPOIB_PKEY = 1, -IFLA_IPOIB_MODE = 2, -IFLA_IPOIB_UMCAST = 3, -__IFLA_IPOIB_MAX = 4, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_39 { -IPOIB_MODE_DATAGRAM = 0, -IPOIB_MODE_CONNECTED = 1, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_40 { -HSR_PROTOCOL_HSR = 0, -HSR_PROTOCOL_PRP = 1, -HSR_PROTOCOL_MAX = 2, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_41 { -IFLA_HSR_UNSPEC = 0, -IFLA_HSR_SLAVE1 = 1, -IFLA_HSR_SLAVE2 = 2, -IFLA_HSR_MULTICAST_SPEC = 3, -IFLA_HSR_SUPERVISION_ADDR = 4, -IFLA_HSR_SEQ_NR = 5, -IFLA_HSR_VERSION = 6, -IFLA_HSR_PROTOCOL = 7, -__IFLA_HSR_MAX = 8, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_42 { -IFLA_STATS_UNSPEC = 0, -IFLA_STATS_LINK_64 = 1, -IFLA_STATS_LINK_XSTATS = 2, -IFLA_STATS_LINK_XSTATS_SLAVE = 3, -IFLA_STATS_LINK_OFFLOAD_XSTATS = 4, -IFLA_STATS_AF_SPEC = 5, -__IFLA_STATS_MAX = 6, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_43 { -IFLA_STATS_GETSET_UNSPEC = 0, -IFLA_STATS_GET_FILTERS = 1, -IFLA_STATS_SET_OFFLOAD_XSTATS_L3_STATS = 2, -__IFLA_STATS_GETSET_MAX = 3, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_44 { -LINK_XSTATS_TYPE_UNSPEC = 0, -LINK_XSTATS_TYPE_BRIDGE = 1, -LINK_XSTATS_TYPE_BOND = 2, -__LINK_XSTATS_TYPE_MAX = 3, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_45 { -IFLA_OFFLOAD_XSTATS_UNSPEC = 0, -IFLA_OFFLOAD_XSTATS_CPU_HIT = 1, -IFLA_OFFLOAD_XSTATS_HW_S_INFO = 2, -IFLA_OFFLOAD_XSTATS_L3_STATS = 3, -__IFLA_OFFLOAD_XSTATS_MAX = 4, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_46 { -IFLA_OFFLOAD_XSTATS_HW_S_INFO_UNSPEC = 0, -IFLA_OFFLOAD_XSTATS_HW_S_INFO_REQUEST = 1, -IFLA_OFFLOAD_XSTATS_HW_S_INFO_USED = 2, -__IFLA_OFFLOAD_XSTATS_HW_S_INFO_MAX = 3, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_47 { -XDP_ATTACHED_NONE = 0, -XDP_ATTACHED_DRV = 1, -XDP_ATTACHED_SKB = 2, -XDP_ATTACHED_HW = 3, -XDP_ATTACHED_MULTI = 4, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_48 { -IFLA_XDP_UNSPEC = 0, -IFLA_XDP_FD = 1, -IFLA_XDP_ATTACHED = 2, -IFLA_XDP_FLAGS = 3, -IFLA_XDP_PROG_ID = 4, -IFLA_XDP_DRV_PROG_ID = 5, -IFLA_XDP_SKB_PROG_ID = 6, -IFLA_XDP_HW_PROG_ID = 7, -IFLA_XDP_EXPECTED_FD = 8, -__IFLA_XDP_MAX = 9, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_49 { -IFLA_EVENT_NONE = 0, -IFLA_EVENT_REBOOT = 1, -IFLA_EVENT_FEATURES = 2, -IFLA_EVENT_BONDING_FAILOVER = 3, -IFLA_EVENT_NOTIFY_PEERS = 4, -IFLA_EVENT_IGMP_RESEND = 5, -IFLA_EVENT_BONDING_OPTIONS = 6, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_50 { -IFLA_TUN_UNSPEC = 0, -IFLA_TUN_OWNER = 1, -IFLA_TUN_GROUP = 2, -IFLA_TUN_TYPE = 3, -IFLA_TUN_PI = 4, -IFLA_TUN_VNET_HDR = 5, -IFLA_TUN_PERSIST = 6, -IFLA_TUN_MULTI_QUEUE = 7, -IFLA_TUN_NUM_QUEUES = 8, -IFLA_TUN_NUM_DISABLED_QUEUES = 9, -__IFLA_TUN_MAX = 10, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_51 { -IFLA_RMNET_UNSPEC = 0, -IFLA_RMNET_MUX_ID = 1, -IFLA_RMNET_FLAGS = 2, -__IFLA_RMNET_MAX = 3, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_52 { -IFLA_MCTP_UNSPEC = 0, -IFLA_MCTP_NET = 1, -__IFLA_MCTP_MAX = 2, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_53 { -IFLA_DSA_UNSPEC = 0, -IFLA_DSA_MASTER = 1, -__IFLA_DSA_MAX = 2, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_54 { -IFA_UNSPEC = 0, -IFA_ADDRESS = 1, -IFA_LOCAL = 2, -IFA_LABEL = 3, -IFA_BROADCAST = 4, -IFA_ANYCAST = 5, -IFA_CACHEINFO = 6, -IFA_MULTICAST = 7, -IFA_FLAGS = 8, -IFA_RT_PRIORITY = 9, -IFA_TARGET_NETNSID = 10, -IFA_PROTO = 11, -__IFA_MAX = 12, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_55 { -NDA_UNSPEC = 0, -NDA_DST = 1, -NDA_LLADDR = 2, -NDA_CACHEINFO = 3, -NDA_PROBES = 4, -NDA_VLAN = 5, -NDA_PORT = 6, -NDA_VNI = 7, -NDA_IFINDEX = 8, -NDA_MASTER = 9, -NDA_LINK_NETNSID = 10, -NDA_SRC_VNI = 11, -NDA_PROTOCOL = 12, -NDA_NH_ID = 13, -NDA_FDB_EXT_ATTRS = 14, -NDA_FLAGS_EXT = 15, -NDA_NDM_STATE_MASK = 16, -NDA_NDM_FLAGS_MASK = 17, -__NDA_MAX = 18, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_56 { -NDTPA_UNSPEC = 0, -NDTPA_IFINDEX = 1, -NDTPA_REFCNT = 2, -NDTPA_REACHABLE_TIME = 3, -NDTPA_BASE_REACHABLE_TIME = 4, -NDTPA_RETRANS_TIME = 5, -NDTPA_GC_STALETIME = 6, -NDTPA_DELAY_PROBE_TIME = 7, -NDTPA_QUEUE_LEN = 8, -NDTPA_APP_PROBES = 9, -NDTPA_UCAST_PROBES = 10, -NDTPA_MCAST_PROBES = 11, -NDTPA_ANYCAST_DELAY = 12, -NDTPA_PROXY_DELAY = 13, -NDTPA_PROXY_QLEN = 14, -NDTPA_LOCKTIME = 15, -NDTPA_QUEUE_LENBYTES = 16, -NDTPA_MCAST_REPROBES = 17, -NDTPA_PAD = 18, -NDTPA_INTERVAL_PROBE_TIME_MS = 19, -__NDTPA_MAX = 20, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_57 { -NDTA_UNSPEC = 0, -NDTA_NAME = 1, -NDTA_THRESH1 = 2, -NDTA_THRESH2 = 3, -NDTA_THRESH3 = 4, -NDTA_CONFIG = 5, -NDTA_PARMS = 6, -NDTA_STATS = 7, -NDTA_GC_INTERVAL = 8, -NDTA_PAD = 9, -__NDTA_MAX = 10, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_58 { -FDB_NOTIFY_BIT = 1, -FDB_NOTIFY_INACTIVE_BIT = 2, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_59 { -NFEA_UNSPEC = 0, -NFEA_ACTIVITY_NOTIFY = 1, -NFEA_DONT_REFRESH = 2, -__NFEA_MAX = 3, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_60 { -RTM_BASE = 16, -RTM_DELLINK = 17, -RTM_GETLINK = 18, -RTM_SETLINK = 19, -RTM_NEWADDR = 20, -RTM_DELADDR = 21, -RTM_GETADDR = 22, -RTM_NEWROUTE = 24, -RTM_DELROUTE = 25, -RTM_GETROUTE = 26, -RTM_NEWNEIGH = 28, -RTM_DELNEIGH = 29, -RTM_GETNEIGH = 30, -RTM_NEWRULE = 32, -RTM_DELRULE = 33, -RTM_GETRULE = 34, -RTM_NEWQDISC = 36, -RTM_DELQDISC = 37, -RTM_GETQDISC = 38, -RTM_NEWTCLASS = 40, -RTM_DELTCLASS = 41, -RTM_GETTCLASS = 42, -RTM_NEWTFILTER = 44, -RTM_DELTFILTER = 45, -RTM_GETTFILTER = 46, -RTM_NEWACTION = 48, -RTM_DELACTION = 49, -RTM_GETACTION = 50, -RTM_NEWPREFIX = 52, -RTM_GETMULTICAST = 58, -RTM_GETANYCAST = 62, -RTM_NEWNEIGHTBL = 64, -RTM_GETNEIGHTBL = 66, -RTM_SETNEIGHTBL = 67, -RTM_NEWNDUSEROPT = 68, -RTM_NEWADDRLABEL = 72, -RTM_DELADDRLABEL = 73, -RTM_GETADDRLABEL = 74, -RTM_GETDCB = 78, -RTM_SETDCB = 79, -RTM_NEWNETCONF = 80, -RTM_DELNETCONF = 81, -RTM_GETNETCONF = 82, -RTM_NEWMDB = 84, -RTM_DELMDB = 85, -RTM_GETMDB = 86, -RTM_NEWNSID = 88, -RTM_DELNSID = 89, -RTM_GETNSID = 90, -RTM_NEWSTATS = 92, -RTM_GETSTATS = 94, -RTM_SETSTATS = 95, -RTM_NEWCACHEREPORT = 96, -RTM_NEWCHAIN = 100, -RTM_DELCHAIN = 101, -RTM_GETCHAIN = 102, -RTM_NEWNEXTHOP = 104, -RTM_DELNEXTHOP = 105, -RTM_GETNEXTHOP = 106, -RTM_NEWLINKPROP = 108, -RTM_DELLINKPROP = 109, -RTM_GETLINKPROP = 110, -RTM_NEWVLAN = 112, -RTM_DELVLAN = 113, -RTM_GETVLAN = 114, -RTM_NEWNEXTHOPBUCKET = 116, -RTM_DELNEXTHOPBUCKET = 117, -RTM_GETNEXTHOPBUCKET = 118, -RTM_NEWTUNNEL = 120, -RTM_DELTUNNEL = 121, -RTM_GETTUNNEL = 122, -__RTM_MAX = 123, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_61 { -RTN_UNSPEC = 0, -RTN_UNICAST = 1, -RTN_LOCAL = 2, -RTN_BROADCAST = 3, -RTN_ANYCAST = 4, -RTN_MULTICAST = 5, -RTN_BLACKHOLE = 6, -RTN_UNREACHABLE = 7, -RTN_PROHIBIT = 8, -RTN_THROW = 9, -RTN_NAT = 10, -RTN_XRESOLVE = 11, -__RTN_MAX = 12, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum rt_scope_t { -RT_SCOPE_UNIVERSE = 0, -RT_SCOPE_SITE = 200, -RT_SCOPE_LINK = 253, -RT_SCOPE_HOST = 254, -RT_SCOPE_NOWHERE = 255, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum rt_class_t { -RT_TABLE_UNSPEC = 0, -RT_TABLE_COMPAT = 252, -RT_TABLE_DEFAULT = 253, -RT_TABLE_MAIN = 254, -RT_TABLE_LOCAL = 255, -RT_TABLE_MAX = 4294967295, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum rtattr_type_t { -RTA_UNSPEC = 0, -RTA_DST = 1, -RTA_SRC = 2, -RTA_IIF = 3, -RTA_OIF = 4, -RTA_GATEWAY = 5, -RTA_PRIORITY = 6, -RTA_PREFSRC = 7, -RTA_METRICS = 8, -RTA_MULTIPATH = 9, -RTA_PROTOINFO = 10, -RTA_FLOW = 11, -RTA_CACHEINFO = 12, -RTA_SESSION = 13, -RTA_MP_ALGO = 14, -RTA_TABLE = 15, -RTA_MARK = 16, -RTA_MFC_STATS = 17, -RTA_VIA = 18, -RTA_NEWDST = 19, -RTA_PREF = 20, -RTA_ENCAP_TYPE = 21, -RTA_ENCAP = 22, -RTA_EXPIRES = 23, -RTA_PAD = 24, -RTA_UID = 25, -RTA_TTL_PROPAGATE = 26, -RTA_IP_PROTO = 27, -RTA_SPORT = 28, -RTA_DPORT = 29, -RTA_NH_ID = 30, -__RTA_MAX = 31, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_62 { -RTAX_UNSPEC = 0, -RTAX_LOCK = 1, -RTAX_MTU = 2, -RTAX_WINDOW = 3, -RTAX_RTT = 4, -RTAX_RTTVAR = 5, -RTAX_SSTHRESH = 6, -RTAX_CWND = 7, -RTAX_ADVMSS = 8, -RTAX_REORDERING = 9, -RTAX_HOPLIMIT = 10, -RTAX_INITCWND = 11, -RTAX_FEATURES = 12, -RTAX_RTO_MIN = 13, -RTAX_INITRWND = 14, -RTAX_QUICKACK = 15, -RTAX_CC_ALGO = 16, -RTAX_FASTOPEN_NO_COOKIE = 17, -__RTAX_MAX = 18, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_63 { -PREFIX_UNSPEC = 0, -PREFIX_ADDRESS = 1, -PREFIX_CACHEINFO = 2, -__PREFIX_MAX = 3, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_64 { -TCA_UNSPEC = 0, -TCA_KIND = 1, -TCA_OPTIONS = 2, -TCA_STATS = 3, -TCA_XSTATS = 4, -TCA_RATE = 5, -TCA_FCNT = 6, -TCA_STATS2 = 7, -TCA_STAB = 8, -TCA_PAD = 9, -TCA_DUMP_INVISIBLE = 10, -TCA_CHAIN = 11, -TCA_HW_OFFLOAD = 12, -TCA_INGRESS_BLOCK = 13, -TCA_EGRESS_BLOCK = 14, -TCA_DUMP_FLAGS = 15, -TCA_EXT_WARN_MSG = 16, -__TCA_MAX = 17, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_65 { -NDUSEROPT_UNSPEC = 0, -NDUSEROPT_SRCADDR = 1, -__NDUSEROPT_MAX = 2, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum rtnetlink_groups { -RTNLGRP_NONE = 0, -RTNLGRP_LINK = 1, -RTNLGRP_NOTIFY = 2, -RTNLGRP_NEIGH = 3, -RTNLGRP_TC = 4, -RTNLGRP_IPV4_IFADDR = 5, -RTNLGRP_IPV4_MROUTE = 6, -RTNLGRP_IPV4_ROUTE = 7, -RTNLGRP_IPV4_RULE = 8, -RTNLGRP_IPV6_IFADDR = 9, -RTNLGRP_IPV6_MROUTE = 10, -RTNLGRP_IPV6_ROUTE = 11, -RTNLGRP_IPV6_IFINFO = 12, -RTNLGRP_DECnet_IFADDR = 13, -RTNLGRP_NOP2 = 14, -RTNLGRP_DECnet_ROUTE = 15, -RTNLGRP_DECnet_RULE = 16, -RTNLGRP_NOP4 = 17, -RTNLGRP_IPV6_PREFIX = 18, -RTNLGRP_IPV6_RULE = 19, -RTNLGRP_ND_USEROPT = 20, -RTNLGRP_PHONET_IFADDR = 21, -RTNLGRP_PHONET_ROUTE = 22, -RTNLGRP_DCB = 23, -RTNLGRP_IPV4_NETCONF = 24, -RTNLGRP_IPV6_NETCONF = 25, -RTNLGRP_MDB = 26, -RTNLGRP_MPLS_ROUTE = 27, -RTNLGRP_NSID = 28, -RTNLGRP_MPLS_NETCONF = 29, -RTNLGRP_IPV4_MROUTE_R = 30, -RTNLGRP_IPV6_MROUTE_R = 31, -RTNLGRP_NEXTHOP = 32, -RTNLGRP_BRVLAN = 33, -RTNLGRP_MCTP_IFADDR = 34, -RTNLGRP_TUNNEL = 35, -RTNLGRP_STATS = 36, -__RTNLGRP_MAX = 37, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_66 { -TCA_ROOT_UNSPEC = 0, -TCA_ROOT_TAB = 1, -TCA_ROOT_FLAGS = 2, -TCA_ROOT_COUNT = 3, -TCA_ROOT_TIME_DELTA = 4, -TCA_ROOT_EXT_WARN_MSG = 5, -__TCA_ROOT_MAX = 6, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union __kernel_sockaddr_storage__bindgen_ty_1 { -pub __bindgen_anon_1: __kernel_sockaddr_storage__bindgen_ty_1__bindgen_ty_1, -pub __align: *mut crate::ctypes::c_void, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union rta_session__bindgen_ty_1 { -pub ports: rta_session__bindgen_ty_1__bindgen_ty_1, -pub icmpt: rta_session__bindgen_ty_1__bindgen_ty_2, -pub spi: __u32, -} -impl __IncompleteArrayField { -#[inline] -pub const fn new() -> Self { -__IncompleteArrayField(::core::marker::PhantomData, []) -} -#[inline] -pub fn as_ptr(&self) -> *const T { -self as *const _ as *const T -} -#[inline] -pub fn as_mut_ptr(&mut self) -> *mut T { -self as *mut _ as *mut T -} -#[inline] -pub unsafe fn as_slice(&self, len: usize) -> &[T] { -::core::slice::from_raw_parts(self.as_ptr(), len) -} -#[inline] -pub unsafe fn as_mut_slice(&mut self, len: usize) -> &mut [T] { -::core::slice::from_raw_parts_mut(self.as_mut_ptr(), len) -} -} -impl ::core::fmt::Debug for __IncompleteArrayField { -fn fmt(&self, fmt: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { -fmt.write_str("__IncompleteArrayField") -} -} -impl nlmsgerr_attrs { -pub const NLMSGERR_ATTR_MAX: nlmsgerr_attrs = nlmsgerr_attrs::NLMSGERR_ATTR_MISS_NEST; -} -impl netlink_policy_type_attr { -pub const NL_POLICY_TYPE_ATTR_MAX: netlink_policy_type_attr = netlink_policy_type_attr::NL_POLICY_TYPE_ATTR_MASK; -} -impl macsec_validation_type { -pub const MACSEC_VALIDATE_MAX: macsec_validation_type = macsec_validation_type::MACSEC_VALIDATE_STRICT; -} -impl macsec_offload { -pub const MACSEC_OFFLOAD_MAX: macsec_offload = macsec_offload::MACSEC_OFFLOAD_MAC; -} -impl ifla_vxlan_df { -pub const VXLAN_DF_MAX: ifla_vxlan_df = ifla_vxlan_df::VXLAN_DF_INHERIT; -} -impl ifla_geneve_df { -pub const GENEVE_DF_MAX: ifla_geneve_df = ifla_geneve_df::GENEVE_DF_INHERIT; -} diff -Nru temporalio-1.3.0/vendor/linux-raw-sys/src/csky/net.rs temporalio-1.3.0/vendor/linux-raw-sys/src/csky/net.rs --- temporalio-1.3.0/vendor/linux-raw-sys/src/csky/net.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/linux-raw-sys/src/csky/net.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,2427 +0,0 @@ -/* automatically generated by rust-bindgen 0.66.1 */ - -pub type __s8 = crate::ctypes::c_schar; -pub type __u8 = crate::ctypes::c_uchar; -pub type __s16 = crate::ctypes::c_short; -pub type __u16 = crate::ctypes::c_ushort; -pub type __s32 = crate::ctypes::c_int; -pub type __u32 = crate::ctypes::c_uint; -pub type __s64 = crate::ctypes::c_longlong; -pub type __u64 = crate::ctypes::c_ulonglong; -pub type __kernel_key_t = crate::ctypes::c_int; -pub type __kernel_mqd_t = crate::ctypes::c_int; -pub type __kernel_long_t = crate::ctypes::c_long; -pub type __kernel_ulong_t = crate::ctypes::c_ulong; -pub type __kernel_ino_t = __kernel_ulong_t; -pub type __kernel_mode_t = crate::ctypes::c_uint; -pub type __kernel_pid_t = crate::ctypes::c_int; -pub type __kernel_ipc_pid_t = crate::ctypes::c_int; -pub type __kernel_uid_t = crate::ctypes::c_uint; -pub type __kernel_gid_t = crate::ctypes::c_uint; -pub type __kernel_suseconds_t = __kernel_long_t; -pub type __kernel_daddr_t = crate::ctypes::c_int; -pub type __kernel_uid32_t = crate::ctypes::c_uint; -pub type __kernel_gid32_t = crate::ctypes::c_uint; -pub type __kernel_old_uid_t = __kernel_uid_t; -pub type __kernel_old_gid_t = __kernel_gid_t; -pub type __kernel_old_dev_t = crate::ctypes::c_uint; -pub type __kernel_size_t = crate::ctypes::c_uint; -pub type __kernel_ssize_t = crate::ctypes::c_int; -pub type __kernel_ptrdiff_t = crate::ctypes::c_int; -pub type __kernel_off_t = __kernel_long_t; -pub type __kernel_loff_t = crate::ctypes::c_longlong; -pub type __kernel_old_time_t = __kernel_long_t; -pub type __kernel_time_t = __kernel_long_t; -pub type __kernel_time64_t = crate::ctypes::c_longlong; -pub type __kernel_clock_t = __kernel_long_t; -pub type __kernel_timer_t = crate::ctypes::c_int; -pub type __kernel_clockid_t = crate::ctypes::c_int; -pub type __kernel_caddr_t = *mut crate::ctypes::c_char; -pub type __kernel_uid16_t = crate::ctypes::c_ushort; -pub type __kernel_gid16_t = crate::ctypes::c_ushort; -pub type __le16 = __u16; -pub type __be16 = __u16; -pub type __le32 = __u32; -pub type __be32 = __u32; -pub type __le64 = __u64; -pub type __be64 = __u64; -pub type __sum16 = __u16; -pub type __wsum = __u32; -pub type __poll_t = crate::ctypes::c_uint; -pub type __kernel_sa_family_t = crate::ctypes::c_ushort; -pub type socklen_t = crate::ctypes::c_uint; -#[repr(C)] -#[derive(Copy, Clone, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd)] -pub struct __BindgenBitfieldUnit { -storage: Storage, -} -#[repr(C)] -#[derive(Default)] -pub struct __IncompleteArrayField(::core::marker::PhantomData, [T; 0]); -#[repr(C)] -pub struct __BindgenUnionField(::core::marker::PhantomData); -#[repr(C)] -#[derive(Copy, Clone)] -pub struct __kernel_sockaddr_storage { -pub __bindgen_anon_1: __kernel_sockaddr_storage__bindgen_ty_1, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct __kernel_sockaddr_storage__bindgen_ty_1__bindgen_ty_1 { -pub ss_family: __kernel_sa_family_t, -pub __data: [crate::ctypes::c_char; 126usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct in_addr { -pub s_addr: __be32, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ip_mreq { -pub imr_multiaddr: in_addr, -pub imr_interface: in_addr, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ip_mreqn { -pub imr_multiaddr: in_addr, -pub imr_address: in_addr, -pub imr_ifindex: crate::ctypes::c_int, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ip_mreq_source { -pub imr_multiaddr: __be32, -pub imr_interface: __be32, -pub imr_sourceaddr: __be32, -} -#[repr(C)] -pub struct ip_msfilter { -pub imsf_multiaddr: __be32, -pub imsf_interface: __be32, -pub imsf_fmode: __u32, -pub imsf_numsrc: __u32, -pub __bindgen_anon_1: ip_msfilter__bindgen_ty_1, -} -#[repr(C)] -pub struct ip_msfilter__bindgen_ty_1 { -pub imsf_slist: __BindgenUnionField<[__be32; 1usize]>, -pub __bindgen_anon_1: __BindgenUnionField, -pub bindgen_union_field: u32, -} -#[repr(C)] -#[derive(Debug)] -pub struct ip_msfilter__bindgen_ty_1__bindgen_ty_1 { -pub __empty_imsf_slist_flex: ip_msfilter__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1, -pub imsf_slist_flex: __IncompleteArrayField<__be32>, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ip_msfilter__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1 {} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct group_req { -pub gr_interface: __u32, -pub gr_group: __kernel_sockaddr_storage, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct group_source_req { -pub gsr_interface: __u32, -pub gsr_group: __kernel_sockaddr_storage, -pub gsr_source: __kernel_sockaddr_storage, -} -#[repr(C)] -pub struct group_filter { -pub __bindgen_anon_1: group_filter__bindgen_ty_1, -} -#[repr(C)] -pub struct group_filter__bindgen_ty_1 { -pub __bindgen_anon_1: __BindgenUnionField, -pub __bindgen_anon_2: __BindgenUnionField, -pub bindgen_union_field: [u32; 67usize], -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct group_filter__bindgen_ty_1__bindgen_ty_1 { -pub gf_interface_aux: __u32, -pub gf_group_aux: __kernel_sockaddr_storage, -pub gf_fmode_aux: __u32, -pub gf_numsrc_aux: __u32, -pub gf_slist: [__kernel_sockaddr_storage; 1usize], -} -#[repr(C)] -pub struct group_filter__bindgen_ty_1__bindgen_ty_2 { -pub gf_interface: __u32, -pub gf_group: __kernel_sockaddr_storage, -pub gf_fmode: __u32, -pub gf_numsrc: __u32, -pub gf_slist_flex: __IncompleteArrayField<__kernel_sockaddr_storage>, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct in_pktinfo { -pub ipi_ifindex: crate::ctypes::c_int, -pub ipi_spec_dst: in_addr, -pub ipi_addr: in_addr, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct sockaddr_in { -pub sin_family: __kernel_sa_family_t, -pub sin_port: __be16, -pub sin_addr: in_addr, -pub __pad: [crate::ctypes::c_uchar; 8usize], -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct iphdr { -pub _bitfield_align_1: [u8; 0], -pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, -pub tos: __u8, -pub tot_len: __be16, -pub id: __be16, -pub frag_off: __be16, -pub ttl: __u8, -pub protocol: __u8, -pub check: __sum16, -pub __bindgen_anon_1: iphdr__bindgen_ty_1, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct iphdr__bindgen_ty_1__bindgen_ty_1 { -pub saddr: __be32, -pub daddr: __be32, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct iphdr__bindgen_ty_1__bindgen_ty_2 { -pub saddr: __be32, -pub daddr: __be32, -} -#[repr(C)] -#[derive(Debug)] -pub struct ip_auth_hdr { -pub nexthdr: __u8, -pub hdrlen: __u8, -pub reserved: __be16, -pub spi: __be32, -pub seq_no: __be32, -pub auth_data: __IncompleteArrayField<__u8>, -} -#[repr(C)] -#[derive(Debug)] -pub struct ip_esp_hdr { -pub spi: __be32, -pub seq_no: __be32, -pub enc_data: __IncompleteArrayField<__u8>, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ip_comp_hdr { -pub nexthdr: __u8, -pub flags: __u8, -pub cpi: __be16, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ip_beet_phdr { -pub nexthdr: __u8, -pub hdrlen: __u8, -pub padlen: __u8, -pub reserved: __u8, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct in6_addr { -pub in6_u: in6_addr__bindgen_ty_1, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct sockaddr_in6 { -pub sin6_family: crate::ctypes::c_ushort, -pub sin6_port: __be16, -pub sin6_flowinfo: __be32, -pub sin6_addr: in6_addr, -pub sin6_scope_id: __u32, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ipv6_mreq { -pub ipv6mr_multiaddr: in6_addr, -pub ipv6mr_ifindex: crate::ctypes::c_int, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct in6_flowlabel_req { -pub flr_dst: in6_addr, -pub flr_label: __be32, -pub flr_action: __u8, -pub flr_share: __u8, -pub flr_flags: __u16, -pub flr_expires: __u16, -pub flr_linger: __u16, -pub __flr_pad: __u32, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct in6_pktinfo { -pub ipi6_addr: in6_addr, -pub ipi6_ifindex: crate::ctypes::c_int, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ip6_mtuinfo { -pub ip6m_addr: sockaddr_in6, -pub ip6m_mtu: __u32, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct in6_ifreq { -pub ifr6_addr: in6_addr, -pub ifr6_prefixlen: __u32, -pub ifr6_ifindex: crate::ctypes::c_int, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ipv6_rt_hdr { -pub nexthdr: __u8, -pub hdrlen: __u8, -pub type_: __u8, -pub segments_left: __u8, -} -#[repr(C, packed)] -#[derive(Debug, Copy, Clone)] -pub struct ipv6_opt_hdr { -pub nexthdr: __u8, -pub hdrlen: __u8, -} -#[repr(C)] -pub struct rt0_hdr { -pub rt_hdr: ipv6_rt_hdr, -pub reserved: __u32, -pub addr: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct rt2_hdr { -pub rt_hdr: ipv6_rt_hdr, -pub reserved: __u32, -pub addr: in6_addr, -} -#[repr(C, packed)] -#[derive(Copy, Clone)] -pub struct ipv6_destopt_hao { -pub type_: __u8, -pub length: __u8, -pub addr: in6_addr, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ipv6hdr { -pub _bitfield_align_1: [u8; 0], -pub _bitfield_1: __BindgenBitfieldUnit<[u8; 1usize]>, -pub flow_lbl: [__u8; 3usize], -pub payload_len: __be16, -pub nexthdr: __u8, -pub hop_limit: __u8, -pub __bindgen_anon_1: ipv6hdr__bindgen_ty_1, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ipv6hdr__bindgen_ty_1__bindgen_ty_1 { -pub saddr: in6_addr, -pub daddr: in6_addr, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ipv6hdr__bindgen_ty_1__bindgen_ty_2 { -pub saddr: in6_addr, -pub daddr: in6_addr, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct tcphdr { -pub source: __be16, -pub dest: __be16, -pub seq: __be32, -pub ack_seq: __be32, -pub _bitfield_align_1: [u8; 0], -pub _bitfield_1: __BindgenBitfieldUnit<[u8; 2usize]>, -pub window: __be16, -pub check: __sum16, -pub urg_ptr: __be16, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct tcp_repair_opt { -pub opt_code: __u32, -pub opt_val: __u32, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct tcp_repair_window { -pub snd_wl1: __u32, -pub snd_wnd: __u32, -pub max_window: __u32, -pub rcv_wnd: __u32, -pub rcv_wup: __u32, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct tcp_info { -pub tcpi_state: __u8, -pub tcpi_ca_state: __u8, -pub tcpi_retransmits: __u8, -pub tcpi_probes: __u8, -pub tcpi_backoff: __u8, -pub tcpi_options: __u8, -pub _bitfield_align_1: [u8; 0], -pub _bitfield_1: __BindgenBitfieldUnit<[u8; 2usize]>, -pub tcpi_rto: __u32, -pub tcpi_ato: __u32, -pub tcpi_snd_mss: __u32, -pub tcpi_rcv_mss: __u32, -pub tcpi_unacked: __u32, -pub tcpi_sacked: __u32, -pub tcpi_lost: __u32, -pub tcpi_retrans: __u32, -pub tcpi_fackets: __u32, -pub tcpi_last_data_sent: __u32, -pub tcpi_last_ack_sent: __u32, -pub tcpi_last_data_recv: __u32, -pub tcpi_last_ack_recv: __u32, -pub tcpi_pmtu: __u32, -pub tcpi_rcv_ssthresh: __u32, -pub tcpi_rtt: __u32, -pub tcpi_rttvar: __u32, -pub tcpi_snd_ssthresh: __u32, -pub tcpi_snd_cwnd: __u32, -pub tcpi_advmss: __u32, -pub tcpi_reordering: __u32, -pub tcpi_rcv_rtt: __u32, -pub tcpi_rcv_space: __u32, -pub tcpi_total_retrans: __u32, -pub tcpi_pacing_rate: __u64, -pub tcpi_max_pacing_rate: __u64, -pub tcpi_bytes_acked: __u64, -pub tcpi_bytes_received: __u64, -pub tcpi_segs_out: __u32, -pub tcpi_segs_in: __u32, -pub tcpi_notsent_bytes: __u32, -pub tcpi_min_rtt: __u32, -pub tcpi_data_segs_in: __u32, -pub tcpi_data_segs_out: __u32, -pub tcpi_delivery_rate: __u64, -pub tcpi_busy_time: __u64, -pub tcpi_rwnd_limited: __u64, -pub tcpi_sndbuf_limited: __u64, -pub tcpi_delivered: __u32, -pub tcpi_delivered_ce: __u32, -pub tcpi_bytes_sent: __u64, -pub tcpi_bytes_retrans: __u64, -pub tcpi_dsack_dups: __u32, -pub tcpi_reord_seen: __u32, -pub tcpi_rcv_ooopack: __u32, -pub tcpi_snd_wnd: __u32, -pub tcpi_rcv_wnd: __u32, -pub tcpi_rehash: __u32, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct tcp_md5sig { -pub tcpm_addr: __kernel_sockaddr_storage, -pub tcpm_flags: __u8, -pub tcpm_prefixlen: __u8, -pub tcpm_keylen: __u16, -pub tcpm_ifindex: crate::ctypes::c_int, -pub tcpm_key: [__u8; 80usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct tcp_diag_md5sig { -pub tcpm_family: __u8, -pub tcpm_prefixlen: __u8, -pub tcpm_keylen: __u16, -pub tcpm_addr: [__be32; 4usize], -pub tcpm_key: [__u8; 80usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct tcp_zerocopy_receive { -pub address: __u64, -pub length: __u32, -pub recv_skip_hint: __u32, -pub inq: __u32, -pub err: __s32, -pub copybuf_address: __u64, -pub copybuf_len: __s32, -pub flags: __u32, -pub msg_control: __u64, -pub msg_controllen: __u64, -pub msg_flags: __u32, -pub reserved: __u32, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct sockaddr_un { -pub sun_family: __kernel_sa_family_t, -pub sun_path: [crate::ctypes::c_char; 108usize], -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct sockaddr { -pub __storage: __kernel_sockaddr_storage, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct sync_serial_settings { -pub clock_rate: crate::ctypes::c_uint, -pub clock_type: crate::ctypes::c_uint, -pub loopback: crate::ctypes::c_ushort, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct te1_settings { -pub clock_rate: crate::ctypes::c_uint, -pub clock_type: crate::ctypes::c_uint, -pub loopback: crate::ctypes::c_ushort, -pub slot_map: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct raw_hdlc_proto { -pub encoding: crate::ctypes::c_ushort, -pub parity: crate::ctypes::c_ushort, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fr_proto { -pub t391: crate::ctypes::c_uint, -pub t392: crate::ctypes::c_uint, -pub n391: crate::ctypes::c_uint, -pub n392: crate::ctypes::c_uint, -pub n393: crate::ctypes::c_uint, -pub lmi: crate::ctypes::c_ushort, -pub dce: crate::ctypes::c_ushort, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fr_proto_pvc { -pub dlci: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fr_proto_pvc_info { -pub dlci: crate::ctypes::c_uint, -pub master: [crate::ctypes::c_char; 16usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct cisco_proto { -pub interval: crate::ctypes::c_uint, -pub timeout: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct x25_hdlc_proto { -pub dce: crate::ctypes::c_ushort, -pub modulo: crate::ctypes::c_uint, -pub window: crate::ctypes::c_uint, -pub t1: crate::ctypes::c_uint, -pub t2: crate::ctypes::c_uint, -pub n2: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ifmap { -pub mem_start: crate::ctypes::c_ulong, -pub mem_end: crate::ctypes::c_ulong, -pub base_addr: crate::ctypes::c_ushort, -pub irq: crate::ctypes::c_uchar, -pub dma: crate::ctypes::c_uchar, -pub port: crate::ctypes::c_uchar, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct if_settings { -pub type_: crate::ctypes::c_uint, -pub size: crate::ctypes::c_uint, -pub ifs_ifsu: if_settings__bindgen_ty_1, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ifreq { -pub ifr_ifrn: ifreq__bindgen_ty_1, -pub ifr_ifru: ifreq__bindgen_ty_2, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ifconf { -pub ifc_len: crate::ctypes::c_int, -pub ifc_ifcu: ifconf__bindgen_ty_1, -} -#[repr(C)] -pub struct xt_entry_match { -pub u: xt_entry_match__bindgen_ty_1, -pub data: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_match__bindgen_ty_1__bindgen_ty_1 { -pub match_size: __u16, -pub name: [crate::ctypes::c_char; 29usize], -pub revision: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_match__bindgen_ty_1__bindgen_ty_2 { -pub match_size: __u16, -pub match_: *mut xt_match, -} -#[repr(C)] -pub struct xt_entry_target { -pub u: xt_entry_target__bindgen_ty_1, -pub data: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_target__bindgen_ty_1__bindgen_ty_1 { -pub target_size: __u16, -pub name: [crate::ctypes::c_char; 29usize], -pub revision: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_target__bindgen_ty_1__bindgen_ty_2 { -pub target_size: __u16, -pub target: *mut xt_target, -} -#[repr(C)] -pub struct xt_standard_target { -pub target: xt_entry_target, -pub verdict: crate::ctypes::c_int, -} -#[repr(C)] -pub struct xt_error_target { -pub target: xt_entry_target, -pub errorname: [crate::ctypes::c_char; 30usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_get_revision { -pub name: [crate::ctypes::c_char; 29usize], -pub revision: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct _xt_align { -pub u8_: __u8, -pub u16_: __u16, -pub u32_: __u32, -pub u64_: __u64, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_counters { -pub pcnt: __u64, -pub bcnt: __u64, -} -#[repr(C)] -#[derive(Debug)] -pub struct xt_counters_info { -pub name: [crate::ctypes::c_char; 32usize], -pub num_counters: crate::ctypes::c_uint, -pub counters: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_tcp { -pub spts: [__u16; 2usize], -pub dpts: [__u16; 2usize], -pub option: __u8, -pub flg_mask: __u8, -pub flg_cmp: __u8, -pub invflags: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_udp { -pub spts: [__u16; 2usize], -pub dpts: [__u16; 2usize], -pub invflags: __u8, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ip6t_ip6 { -pub src: in6_addr, -pub dst: in6_addr, -pub smsk: in6_addr, -pub dmsk: in6_addr, -pub iniface: [crate::ctypes::c_char; 16usize], -pub outiface: [crate::ctypes::c_char; 16usize], -pub iniface_mask: [crate::ctypes::c_uchar; 16usize], -pub outiface_mask: [crate::ctypes::c_uchar; 16usize], -pub proto: __u16, -pub tos: __u8, -pub flags: __u8, -pub invflags: __u8, -} -#[repr(C)] -pub struct ip6t_entry { -pub ipv6: ip6t_ip6, -pub nfcache: crate::ctypes::c_uint, -pub target_offset: __u16, -pub next_offset: __u16, -pub comefrom: crate::ctypes::c_uint, -pub counters: xt_counters, -pub elems: __IncompleteArrayField, -} -#[repr(C)] -pub struct ip6t_standard { -pub entry: ip6t_entry, -pub target: xt_standard_target, -} -#[repr(C)] -pub struct ip6t_error { -pub entry: ip6t_entry, -pub target: xt_error_target, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ip6t_icmp { -pub type_: __u8, -pub code: [__u8; 2usize], -pub invflags: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ip6t_getinfo { -pub name: [crate::ctypes::c_char; 32usize], -pub valid_hooks: crate::ctypes::c_uint, -pub hook_entry: [crate::ctypes::c_uint; 5usize], -pub underflow: [crate::ctypes::c_uint; 5usize], -pub num_entries: crate::ctypes::c_uint, -pub size: crate::ctypes::c_uint, -} -#[repr(C)] -pub struct ip6t_replace { -pub name: [crate::ctypes::c_char; 32usize], -pub valid_hooks: crate::ctypes::c_uint, -pub num_entries: crate::ctypes::c_uint, -pub size: crate::ctypes::c_uint, -pub hook_entry: [crate::ctypes::c_uint; 5usize], -pub underflow: [crate::ctypes::c_uint; 5usize], -pub num_counters: crate::ctypes::c_uint, -pub counters: *mut xt_counters, -pub entries: __IncompleteArrayField, -} -#[repr(C)] -pub struct ip6t_get_entries { -pub name: [crate::ctypes::c_char; 32usize], -pub size: crate::ctypes::c_uint, -pub entrytable: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct linger { -pub l_onoff: crate::ctypes::c_int, -pub l_linger: crate::ctypes::c_int, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct msghdr { -pub msg_name: *mut crate::ctypes::c_void, -pub msg_namelen: crate::ctypes::c_int, -pub msg_iov: *mut iovec, -pub msg_iovlen: usize, -pub msg_control: *mut crate::ctypes::c_void, -pub msg_controllen: usize, -pub msg_flags: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct cmsghdr { -pub cmsg_len: usize, -pub cmsg_level: crate::ctypes::c_int, -pub cmsg_type: crate::ctypes::c_int, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ucred { -pub pid: __u32, -pub uid: __u32, -pub gid: __u32, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct mmsghdr { -pub msg_hdr: msghdr, -pub msg_len: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_match { -pub _address: u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_target { -pub _address: u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct iovec { -pub _address: u8, -} -pub const _K_SS_MAXSIZE: u32 = 128; -pub const SOCK_SNDBUF_LOCK: u32 = 1; -pub const SOCK_RCVBUF_LOCK: u32 = 2; -pub const SOCK_BUF_LOCK_MASK: u32 = 3; -pub const SOCK_TXREHASH_DEFAULT: u32 = 255; -pub const SOCK_TXREHASH_DISABLED: u32 = 0; -pub const SOCK_TXREHASH_ENABLED: u32 = 1; -pub const IP_TOS: u32 = 1; -pub const IP_TTL: u32 = 2; -pub const IP_HDRINCL: u32 = 3; -pub const IP_OPTIONS: u32 = 4; -pub const IP_ROUTER_ALERT: u32 = 5; -pub const IP_RECVOPTS: u32 = 6; -pub const IP_RETOPTS: u32 = 7; -pub const IP_PKTINFO: u32 = 8; -pub const IP_PKTOPTIONS: u32 = 9; -pub const IP_MTU_DISCOVER: u32 = 10; -pub const IP_RECVERR: u32 = 11; -pub const IP_RECVTTL: u32 = 12; -pub const IP_RECVTOS: u32 = 13; -pub const IP_MTU: u32 = 14; -pub const IP_FREEBIND: u32 = 15; -pub const IP_IPSEC_POLICY: u32 = 16; -pub const IP_XFRM_POLICY: u32 = 17; -pub const IP_PASSSEC: u32 = 18; -pub const IP_TRANSPARENT: u32 = 19; -pub const IP_RECVRETOPTS: u32 = 7; -pub const IP_ORIGDSTADDR: u32 = 20; -pub const IP_RECVORIGDSTADDR: u32 = 20; -pub const IP_MINTTL: u32 = 21; -pub const IP_NODEFRAG: u32 = 22; -pub const IP_CHECKSUM: u32 = 23; -pub const IP_BIND_ADDRESS_NO_PORT: u32 = 24; -pub const IP_RECVFRAGSIZE: u32 = 25; -pub const IP_RECVERR_RFC4884: u32 = 26; -pub const IP_PMTUDISC_DONT: u32 = 0; -pub const IP_PMTUDISC_WANT: u32 = 1; -pub const IP_PMTUDISC_DO: u32 = 2; -pub const IP_PMTUDISC_PROBE: u32 = 3; -pub const IP_PMTUDISC_INTERFACE: u32 = 4; -pub const IP_PMTUDISC_OMIT: u32 = 5; -pub const IP_MULTICAST_IF: u32 = 32; -pub const IP_MULTICAST_TTL: u32 = 33; -pub const IP_MULTICAST_LOOP: u32 = 34; -pub const IP_ADD_MEMBERSHIP: u32 = 35; -pub const IP_DROP_MEMBERSHIP: u32 = 36; -pub const IP_UNBLOCK_SOURCE: u32 = 37; -pub const IP_BLOCK_SOURCE: u32 = 38; -pub const IP_ADD_SOURCE_MEMBERSHIP: u32 = 39; -pub const IP_DROP_SOURCE_MEMBERSHIP: u32 = 40; -pub const IP_MSFILTER: u32 = 41; -pub const MCAST_JOIN_GROUP: u32 = 42; -pub const MCAST_BLOCK_SOURCE: u32 = 43; -pub const MCAST_UNBLOCK_SOURCE: u32 = 44; -pub const MCAST_LEAVE_GROUP: u32 = 45; -pub const MCAST_JOIN_SOURCE_GROUP: u32 = 46; -pub const MCAST_LEAVE_SOURCE_GROUP: u32 = 47; -pub const MCAST_MSFILTER: u32 = 48; -pub const IP_MULTICAST_ALL: u32 = 49; -pub const IP_UNICAST_IF: u32 = 50; -pub const IP_LOCAL_PORT_RANGE: u32 = 51; -pub const MCAST_EXCLUDE: u32 = 0; -pub const MCAST_INCLUDE: u32 = 1; -pub const IP_DEFAULT_MULTICAST_TTL: u32 = 1; -pub const IP_DEFAULT_MULTICAST_LOOP: u32 = 1; -pub const __SOCK_SIZE__: u32 = 16; -pub const IN_CLASSA_NET: u32 = 4278190080; -pub const IN_CLASSA_NSHIFT: u32 = 24; -pub const IN_CLASSA_HOST: u32 = 16777215; -pub const IN_CLASSA_MAX: u32 = 128; -pub const IN_CLASSB_NET: u32 = 4294901760; -pub const IN_CLASSB_NSHIFT: u32 = 16; -pub const IN_CLASSB_HOST: u32 = 65535; -pub const IN_CLASSB_MAX: u32 = 65536; -pub const IN_CLASSC_NET: u32 = 4294967040; -pub const IN_CLASSC_NSHIFT: u32 = 8; -pub const IN_CLASSC_HOST: u32 = 255; -pub const IN_MULTICAST_NET: u32 = 3758096384; -pub const IN_CLASSE_NET: u32 = 4294967295; -pub const IN_CLASSE_NSHIFT: u32 = 0; -pub const IN_LOOPBACKNET: u32 = 127; -pub const INADDR_LOOPBACK: u32 = 2130706433; -pub const INADDR_UNSPEC_GROUP: u32 = 3758096384; -pub const INADDR_ALLHOSTS_GROUP: u32 = 3758096385; -pub const INADDR_ALLRTRS_GROUP: u32 = 3758096386; -pub const INADDR_ALLSNOOPERS_GROUP: u32 = 3758096490; -pub const INADDR_MAX_LOCAL_GROUP: u32 = 3758096639; -pub const __LITTLE_ENDIAN: u32 = 1234; -pub const IPTOS_TOS_MASK: u32 = 30; -pub const IPTOS_LOWDELAY: u32 = 16; -pub const IPTOS_THROUGHPUT: u32 = 8; -pub const IPTOS_RELIABILITY: u32 = 4; -pub const IPTOS_MINCOST: u32 = 2; -pub const IPTOS_PREC_MASK: u32 = 224; -pub const IPTOS_PREC_NETCONTROL: u32 = 224; -pub const IPTOS_PREC_INTERNETCONTROL: u32 = 192; -pub const IPTOS_PREC_CRITIC_ECP: u32 = 160; -pub const IPTOS_PREC_FLASHOVERRIDE: u32 = 128; -pub const IPTOS_PREC_FLASH: u32 = 96; -pub const IPTOS_PREC_IMMEDIATE: u32 = 64; -pub const IPTOS_PREC_PRIORITY: u32 = 32; -pub const IPTOS_PREC_ROUTINE: u32 = 0; -pub const IPOPT_COPY: u32 = 128; -pub const IPOPT_CLASS_MASK: u32 = 96; -pub const IPOPT_NUMBER_MASK: u32 = 31; -pub const IPOPT_CONTROL: u32 = 0; -pub const IPOPT_RESERVED1: u32 = 32; -pub const IPOPT_MEASUREMENT: u32 = 64; -pub const IPOPT_RESERVED2: u32 = 96; -pub const IPOPT_END: u32 = 0; -pub const IPOPT_NOOP: u32 = 1; -pub const IPOPT_SEC: u32 = 130; -pub const IPOPT_LSRR: u32 = 131; -pub const IPOPT_TIMESTAMP: u32 = 68; -pub const IPOPT_CIPSO: u32 = 134; -pub const IPOPT_RR: u32 = 7; -pub const IPOPT_SID: u32 = 136; -pub const IPOPT_SSRR: u32 = 137; -pub const IPOPT_RA: u32 = 148; -pub const IPVERSION: u32 = 4; -pub const MAXTTL: u32 = 255; -pub const IPDEFTTL: u32 = 64; -pub const IPOPT_OPTVAL: u32 = 0; -pub const IPOPT_OLEN: u32 = 1; -pub const IPOPT_OFFSET: u32 = 2; -pub const IPOPT_MINOFF: u32 = 4; -pub const MAX_IPOPTLEN: u32 = 40; -pub const IPOPT_NOP: u32 = 1; -pub const IPOPT_EOL: u32 = 0; -pub const IPOPT_TS: u32 = 68; -pub const IPOPT_TS_TSONLY: u32 = 0; -pub const IPOPT_TS_TSANDADDR: u32 = 1; -pub const IPOPT_TS_PRESPEC: u32 = 3; -pub const IPV4_BEET_PHMAXLEN: u32 = 8; -pub const IPV6_FL_A_GET: u32 = 0; -pub const IPV6_FL_A_PUT: u32 = 1; -pub const IPV6_FL_A_RENEW: u32 = 2; -pub const IPV6_FL_F_CREATE: u32 = 1; -pub const IPV6_FL_F_EXCL: u32 = 2; -pub const IPV6_FL_F_REFLECT: u32 = 4; -pub const IPV6_FL_F_REMOTE: u32 = 8; -pub const IPV6_FL_S_NONE: u32 = 0; -pub const IPV6_FL_S_EXCL: u32 = 1; -pub const IPV6_FL_S_PROCESS: u32 = 2; -pub const IPV6_FL_S_USER: u32 = 3; -pub const IPV6_FL_S_ANY: u32 = 255; -pub const IPV6_FLOWINFO_FLOWLABEL: u32 = 1048575; -pub const IPV6_FLOWINFO_PRIORITY: u32 = 267386880; -pub const IPV6_PRIORITY_UNCHARACTERIZED: u32 = 0; -pub const IPV6_PRIORITY_FILLER: u32 = 256; -pub const IPV6_PRIORITY_UNATTENDED: u32 = 512; -pub const IPV6_PRIORITY_RESERVED1: u32 = 768; -pub const IPV6_PRIORITY_BULK: u32 = 1024; -pub const IPV6_PRIORITY_RESERVED2: u32 = 1280; -pub const IPV6_PRIORITY_INTERACTIVE: u32 = 1536; -pub const IPV6_PRIORITY_CONTROL: u32 = 1792; -pub const IPV6_PRIORITY_8: u32 = 2048; -pub const IPV6_PRIORITY_9: u32 = 2304; -pub const IPV6_PRIORITY_10: u32 = 2560; -pub const IPV6_PRIORITY_11: u32 = 2816; -pub const IPV6_PRIORITY_12: u32 = 3072; -pub const IPV6_PRIORITY_13: u32 = 3328; -pub const IPV6_PRIORITY_14: u32 = 3584; -pub const IPV6_PRIORITY_15: u32 = 3840; -pub const IPPROTO_HOPOPTS: u32 = 0; -pub const IPPROTO_ROUTING: u32 = 43; -pub const IPPROTO_FRAGMENT: u32 = 44; -pub const IPPROTO_ICMPV6: u32 = 58; -pub const IPPROTO_NONE: u32 = 59; -pub const IPPROTO_DSTOPTS: u32 = 60; -pub const IPPROTO_MH: u32 = 135; -pub const IPV6_TLV_PAD1: u32 = 0; -pub const IPV6_TLV_PADN: u32 = 1; -pub const IPV6_TLV_ROUTERALERT: u32 = 5; -pub const IPV6_TLV_CALIPSO: u32 = 7; -pub const IPV6_TLV_IOAM: u32 = 49; -pub const IPV6_TLV_JUMBO: u32 = 194; -pub const IPV6_TLV_HAO: u32 = 201; -pub const IPV6_ADDRFORM: u32 = 1; -pub const IPV6_2292PKTINFO: u32 = 2; -pub const IPV6_2292HOPOPTS: u32 = 3; -pub const IPV6_2292DSTOPTS: u32 = 4; -pub const IPV6_2292RTHDR: u32 = 5; -pub const IPV6_2292PKTOPTIONS: u32 = 6; -pub const IPV6_CHECKSUM: u32 = 7; -pub const IPV6_2292HOPLIMIT: u32 = 8; -pub const IPV6_NEXTHOP: u32 = 9; -pub const IPV6_AUTHHDR: u32 = 10; -pub const IPV6_FLOWINFO: u32 = 11; -pub const IPV6_UNICAST_HOPS: u32 = 16; -pub const IPV6_MULTICAST_IF: u32 = 17; -pub const IPV6_MULTICAST_HOPS: u32 = 18; -pub const IPV6_MULTICAST_LOOP: u32 = 19; -pub const IPV6_ADD_MEMBERSHIP: u32 = 20; -pub const IPV6_DROP_MEMBERSHIP: u32 = 21; -pub const IPV6_ROUTER_ALERT: u32 = 22; -pub const IPV6_MTU_DISCOVER: u32 = 23; -pub const IPV6_MTU: u32 = 24; -pub const IPV6_RECVERR: u32 = 25; -pub const IPV6_V6ONLY: u32 = 26; -pub const IPV6_JOIN_ANYCAST: u32 = 27; -pub const IPV6_LEAVE_ANYCAST: u32 = 28; -pub const IPV6_MULTICAST_ALL: u32 = 29; -pub const IPV6_ROUTER_ALERT_ISOLATE: u32 = 30; -pub const IPV6_RECVERR_RFC4884: u32 = 31; -pub const IPV6_PMTUDISC_DONT: u32 = 0; -pub const IPV6_PMTUDISC_WANT: u32 = 1; -pub const IPV6_PMTUDISC_DO: u32 = 2; -pub const IPV6_PMTUDISC_PROBE: u32 = 3; -pub const IPV6_PMTUDISC_INTERFACE: u32 = 4; -pub const IPV6_PMTUDISC_OMIT: u32 = 5; -pub const IPV6_FLOWLABEL_MGR: u32 = 32; -pub const IPV6_FLOWINFO_SEND: u32 = 33; -pub const IPV6_IPSEC_POLICY: u32 = 34; -pub const IPV6_XFRM_POLICY: u32 = 35; -pub const IPV6_HDRINCL: u32 = 36; -pub const IPV6_RECVPKTINFO: u32 = 49; -pub const IPV6_PKTINFO: u32 = 50; -pub const IPV6_RECVHOPLIMIT: u32 = 51; -pub const IPV6_HOPLIMIT: u32 = 52; -pub const IPV6_RECVHOPOPTS: u32 = 53; -pub const IPV6_HOPOPTS: u32 = 54; -pub const IPV6_RTHDRDSTOPTS: u32 = 55; -pub const IPV6_RECVRTHDR: u32 = 56; -pub const IPV6_RTHDR: u32 = 57; -pub const IPV6_RECVDSTOPTS: u32 = 58; -pub const IPV6_DSTOPTS: u32 = 59; -pub const IPV6_RECVPATHMTU: u32 = 60; -pub const IPV6_PATHMTU: u32 = 61; -pub const IPV6_DONTFRAG: u32 = 62; -pub const IPV6_RECVTCLASS: u32 = 66; -pub const IPV6_TCLASS: u32 = 67; -pub const IPV6_AUTOFLOWLABEL: u32 = 70; -pub const IPV6_ADDR_PREFERENCES: u32 = 72; -pub const IPV6_PREFER_SRC_TMP: u32 = 1; -pub const IPV6_PREFER_SRC_PUBLIC: u32 = 2; -pub const IPV6_PREFER_SRC_PUBTMP_DEFAULT: u32 = 256; -pub const IPV6_PREFER_SRC_COA: u32 = 4; -pub const IPV6_PREFER_SRC_HOME: u32 = 1024; -pub const IPV6_PREFER_SRC_CGA: u32 = 8; -pub const IPV6_PREFER_SRC_NONCGA: u32 = 2048; -pub const IPV6_MINHOPCOUNT: u32 = 73; -pub const IPV6_ORIGDSTADDR: u32 = 74; -pub const IPV6_RECVORIGDSTADDR: u32 = 74; -pub const IPV6_TRANSPARENT: u32 = 75; -pub const IPV6_UNICAST_IF: u32 = 76; -pub const IPV6_RECVFRAGSIZE: u32 = 77; -pub const IPV6_FREEBIND: u32 = 78; -pub const IPV6_MIN_MTU: u32 = 1280; -pub const IPV6_SRCRT_STRICT: u32 = 1; -pub const IPV6_SRCRT_TYPE_0: u32 = 0; -pub const IPV6_SRCRT_TYPE_2: u32 = 2; -pub const IPV6_SRCRT_TYPE_3: u32 = 3; -pub const IPV6_SRCRT_TYPE_4: u32 = 4; -pub const IPV6_OPT_ROUTERALERT_MLD: u32 = 0; -pub const SIOCGSTAMP_OLD: u32 = 35078; -pub const SIOCGSTAMPNS_OLD: u32 = 35079; -pub const SOL_SOCKET: u32 = 1; -pub const SO_DEBUG: u32 = 1; -pub const SO_REUSEADDR: u32 = 2; -pub const SO_TYPE: u32 = 3; -pub const SO_ERROR: u32 = 4; -pub const SO_DONTROUTE: u32 = 5; -pub const SO_BROADCAST: u32 = 6; -pub const SO_SNDBUF: u32 = 7; -pub const SO_RCVBUF: u32 = 8; -pub const SO_SNDBUFFORCE: u32 = 32; -pub const SO_RCVBUFFORCE: u32 = 33; -pub const SO_KEEPALIVE: u32 = 9; -pub const SO_OOBINLINE: u32 = 10; -pub const SO_NO_CHECK: u32 = 11; -pub const SO_PRIORITY: u32 = 12; -pub const SO_LINGER: u32 = 13; -pub const SO_BSDCOMPAT: u32 = 14; -pub const SO_REUSEPORT: u32 = 15; -pub const SO_PASSCRED: u32 = 16; -pub const SO_PEERCRED: u32 = 17; -pub const SO_RCVLOWAT: u32 = 18; -pub const SO_SNDLOWAT: u32 = 19; -pub const SO_RCVTIMEO_OLD: u32 = 20; -pub const SO_SNDTIMEO_OLD: u32 = 21; -pub const SO_SECURITY_AUTHENTICATION: u32 = 22; -pub const SO_SECURITY_ENCRYPTION_TRANSPORT: u32 = 23; -pub const SO_SECURITY_ENCRYPTION_NETWORK: u32 = 24; -pub const SO_BINDTODEVICE: u32 = 25; -pub const SO_ATTACH_FILTER: u32 = 26; -pub const SO_DETACH_FILTER: u32 = 27; -pub const SO_GET_FILTER: u32 = 26; -pub const SO_PEERNAME: u32 = 28; -pub const SO_ACCEPTCONN: u32 = 30; -pub const SO_PEERSEC: u32 = 31; -pub const SO_PASSSEC: u32 = 34; -pub const SO_MARK: u32 = 36; -pub const SO_PROTOCOL: u32 = 38; -pub const SO_DOMAIN: u32 = 39; -pub const SO_RXQ_OVFL: u32 = 40; -pub const SO_WIFI_STATUS: u32 = 41; -pub const SCM_WIFI_STATUS: u32 = 41; -pub const SO_PEEK_OFF: u32 = 42; -pub const SO_NOFCS: u32 = 43; -pub const SO_LOCK_FILTER: u32 = 44; -pub const SO_SELECT_ERR_QUEUE: u32 = 45; -pub const SO_BUSY_POLL: u32 = 46; -pub const SO_MAX_PACING_RATE: u32 = 47; -pub const SO_BPF_EXTENSIONS: u32 = 48; -pub const SO_INCOMING_CPU: u32 = 49; -pub const SO_ATTACH_BPF: u32 = 50; -pub const SO_DETACH_BPF: u32 = 27; -pub const SO_ATTACH_REUSEPORT_CBPF: u32 = 51; -pub const SO_ATTACH_REUSEPORT_EBPF: u32 = 52; -pub const SO_CNX_ADVICE: u32 = 53; -pub const SCM_TIMESTAMPING_OPT_STATS: u32 = 54; -pub const SO_MEMINFO: u32 = 55; -pub const SO_INCOMING_NAPI_ID: u32 = 56; -pub const SO_COOKIE: u32 = 57; -pub const SCM_TIMESTAMPING_PKTINFO: u32 = 58; -pub const SO_PEERGROUPS: u32 = 59; -pub const SO_ZEROCOPY: u32 = 60; -pub const SO_TXTIME: u32 = 61; -pub const SCM_TXTIME: u32 = 61; -pub const SO_BINDTOIFINDEX: u32 = 62; -pub const SO_TIMESTAMP_OLD: u32 = 29; -pub const SO_TIMESTAMPNS_OLD: u32 = 35; -pub const SO_TIMESTAMPING_OLD: u32 = 37; -pub const SO_TIMESTAMP_NEW: u32 = 63; -pub const SO_TIMESTAMPNS_NEW: u32 = 64; -pub const SO_TIMESTAMPING_NEW: u32 = 65; -pub const SO_RCVTIMEO_NEW: u32 = 66; -pub const SO_SNDTIMEO_NEW: u32 = 67; -pub const SO_DETACH_REUSEPORT_BPF: u32 = 68; -pub const SO_PREFER_BUSY_POLL: u32 = 69; -pub const SO_BUSY_POLL_BUDGET: u32 = 70; -pub const SO_NETNS_COOKIE: u32 = 71; -pub const SO_BUF_LOCK: u32 = 72; -pub const SO_RESERVE_MEM: u32 = 73; -pub const SO_TXREHASH: u32 = 74; -pub const SO_RCVMARK: u32 = 75; -pub const SYS_SOCKET: u32 = 1; -pub const SYS_BIND: u32 = 2; -pub const SYS_CONNECT: u32 = 3; -pub const SYS_LISTEN: u32 = 4; -pub const SYS_ACCEPT: u32 = 5; -pub const SYS_GETSOCKNAME: u32 = 6; -pub const SYS_GETPEERNAME: u32 = 7; -pub const SYS_SOCKETPAIR: u32 = 8; -pub const SYS_SEND: u32 = 9; -pub const SYS_RECV: u32 = 10; -pub const SYS_SENDTO: u32 = 11; -pub const SYS_RECVFROM: u32 = 12; -pub const SYS_SHUTDOWN: u32 = 13; -pub const SYS_SETSOCKOPT: u32 = 14; -pub const SYS_GETSOCKOPT: u32 = 15; -pub const SYS_SENDMSG: u32 = 16; -pub const SYS_RECVMSG: u32 = 17; -pub const SYS_ACCEPT4: u32 = 18; -pub const SYS_RECVMMSG: u32 = 19; -pub const SYS_SENDMMSG: u32 = 20; -pub const __SO_ACCEPTCON: u32 = 65536; -pub const TCP_MSS_DEFAULT: u32 = 536; -pub const TCP_MSS_DESIRED: u32 = 1220; -pub const TCP_NODELAY: u32 = 1; -pub const TCP_MAXSEG: u32 = 2; -pub const TCP_CORK: u32 = 3; -pub const TCP_KEEPIDLE: u32 = 4; -pub const TCP_KEEPINTVL: u32 = 5; -pub const TCP_KEEPCNT: u32 = 6; -pub const TCP_SYNCNT: u32 = 7; -pub const TCP_LINGER2: u32 = 8; -pub const TCP_DEFER_ACCEPT: u32 = 9; -pub const TCP_WINDOW_CLAMP: u32 = 10; -pub const TCP_INFO: u32 = 11; -pub const TCP_QUICKACK: u32 = 12; -pub const TCP_CONGESTION: u32 = 13; -pub const TCP_MD5SIG: u32 = 14; -pub const TCP_THIN_LINEAR_TIMEOUTS: u32 = 16; -pub const TCP_THIN_DUPACK: u32 = 17; -pub const TCP_USER_TIMEOUT: u32 = 18; -pub const TCP_REPAIR: u32 = 19; -pub const TCP_REPAIR_QUEUE: u32 = 20; -pub const TCP_QUEUE_SEQ: u32 = 21; -pub const TCP_REPAIR_OPTIONS: u32 = 22; -pub const TCP_FASTOPEN: u32 = 23; -pub const TCP_TIMESTAMP: u32 = 24; -pub const TCP_NOTSENT_LOWAT: u32 = 25; -pub const TCP_CC_INFO: u32 = 26; -pub const TCP_SAVE_SYN: u32 = 27; -pub const TCP_SAVED_SYN: u32 = 28; -pub const TCP_REPAIR_WINDOW: u32 = 29; -pub const TCP_FASTOPEN_CONNECT: u32 = 30; -pub const TCP_ULP: u32 = 31; -pub const TCP_MD5SIG_EXT: u32 = 32; -pub const TCP_FASTOPEN_KEY: u32 = 33; -pub const TCP_FASTOPEN_NO_COOKIE: u32 = 34; -pub const TCP_ZEROCOPY_RECEIVE: u32 = 35; -pub const TCP_INQ: u32 = 36; -pub const TCP_CM_INQ: u32 = 36; -pub const TCP_TX_DELAY: u32 = 37; -pub const TCP_REPAIR_ON: u32 = 1; -pub const TCP_REPAIR_OFF: u32 = 0; -pub const TCP_REPAIR_OFF_NO_WP: i32 = -1; -pub const TCPI_OPT_TIMESTAMPS: u32 = 1; -pub const TCPI_OPT_SACK: u32 = 2; -pub const TCPI_OPT_WSCALE: u32 = 4; -pub const TCPI_OPT_ECN: u32 = 8; -pub const TCPI_OPT_ECN_SEEN: u32 = 16; -pub const TCPI_OPT_SYN_DATA: u32 = 32; -pub const TCP_MD5SIG_MAXKEYLEN: u32 = 80; -pub const TCP_MD5SIG_FLAG_PREFIX: u32 = 1; -pub const TCP_MD5SIG_FLAG_IFINDEX: u32 = 2; -pub const TCP_RECEIVE_ZEROCOPY_FLAG_TLB_CLEAN_HINT: u32 = 1; -pub const UNIX_PATH_MAX: u32 = 108; -pub const IFNAMSIZ: u32 = 16; -pub const IFALIASZ: u32 = 256; -pub const ALTIFNAMSIZ: u32 = 128; -pub const GENERIC_HDLC_VERSION: u32 = 4; -pub const CLOCK_DEFAULT: u32 = 0; -pub const CLOCK_EXT: u32 = 1; -pub const CLOCK_INT: u32 = 2; -pub const CLOCK_TXINT: u32 = 3; -pub const CLOCK_TXFROMRX: u32 = 4; -pub const ENCODING_DEFAULT: u32 = 0; -pub const ENCODING_NRZ: u32 = 1; -pub const ENCODING_NRZI: u32 = 2; -pub const ENCODING_FM_MARK: u32 = 3; -pub const ENCODING_FM_SPACE: u32 = 4; -pub const ENCODING_MANCHESTER: u32 = 5; -pub const PARITY_DEFAULT: u32 = 0; -pub const PARITY_NONE: u32 = 1; -pub const PARITY_CRC16_PR0: u32 = 2; -pub const PARITY_CRC16_PR1: u32 = 3; -pub const PARITY_CRC16_PR0_CCITT: u32 = 4; -pub const PARITY_CRC16_PR1_CCITT: u32 = 5; -pub const PARITY_CRC32_PR0_CCITT: u32 = 6; -pub const PARITY_CRC32_PR1_CCITT: u32 = 7; -pub const LMI_DEFAULT: u32 = 0; -pub const LMI_NONE: u32 = 1; -pub const LMI_ANSI: u32 = 2; -pub const LMI_CCITT: u32 = 3; -pub const LMI_CISCO: u32 = 4; -pub const IF_GET_IFACE: u32 = 1; -pub const IF_GET_PROTO: u32 = 2; -pub const IF_IFACE_V35: u32 = 4096; -pub const IF_IFACE_V24: u32 = 4097; -pub const IF_IFACE_X21: u32 = 4098; -pub const IF_IFACE_T1: u32 = 4099; -pub const IF_IFACE_E1: u32 = 4100; -pub const IF_IFACE_SYNC_SERIAL: u32 = 4101; -pub const IF_IFACE_X21D: u32 = 4102; -pub const IF_PROTO_HDLC: u32 = 8192; -pub const IF_PROTO_PPP: u32 = 8193; -pub const IF_PROTO_CISCO: u32 = 8194; -pub const IF_PROTO_FR: u32 = 8195; -pub const IF_PROTO_FR_ADD_PVC: u32 = 8196; -pub const IF_PROTO_FR_DEL_PVC: u32 = 8197; -pub const IF_PROTO_X25: u32 = 8198; -pub const IF_PROTO_HDLC_ETH: u32 = 8199; -pub const IF_PROTO_FR_ADD_ETH_PVC: u32 = 8200; -pub const IF_PROTO_FR_DEL_ETH_PVC: u32 = 8201; -pub const IF_PROTO_FR_PVC: u32 = 8202; -pub const IF_PROTO_FR_ETH_PVC: u32 = 8203; -pub const IF_PROTO_RAW: u32 = 8204; -pub const IFHWADDRLEN: u32 = 6; -pub const NF_DROP: u32 = 0; -pub const NF_ACCEPT: u32 = 1; -pub const NF_STOLEN: u32 = 2; -pub const NF_QUEUE: u32 = 3; -pub const NF_REPEAT: u32 = 4; -pub const NF_STOP: u32 = 5; -pub const NF_MAX_VERDICT: u32 = 5; -pub const NF_VERDICT_MASK: u32 = 255; -pub const NF_VERDICT_FLAG_QUEUE_BYPASS: u32 = 32768; -pub const NF_VERDICT_QMASK: u32 = 4294901760; -pub const NF_VERDICT_QBITS: u32 = 16; -pub const NF_VERDICT_BITS: u32 = 16; -pub const NF_IP6_PRE_ROUTING: u32 = 0; -pub const NF_IP6_LOCAL_IN: u32 = 1; -pub const NF_IP6_FORWARD: u32 = 2; -pub const NF_IP6_LOCAL_OUT: u32 = 3; -pub const NF_IP6_POST_ROUTING: u32 = 4; -pub const NF_IP6_NUMHOOKS: u32 = 5; -pub const XT_FUNCTION_MAXNAMELEN: u32 = 30; -pub const XT_EXTENSION_MAXNAMELEN: u32 = 29; -pub const XT_TABLE_MAXNAMELEN: u32 = 32; -pub const XT_CONTINUE: u32 = 4294967295; -pub const XT_RETURN: i32 = -5; -pub const XT_STANDARD_TARGET: &[u8; 1] = b"\0"; -pub const XT_ERROR_TARGET: &[u8; 6] = b"ERROR\0"; -pub const XT_INV_PROTO: u32 = 64; -pub const IP6T_FUNCTION_MAXNAMELEN: u32 = 30; -pub const IP6T_TABLE_MAXNAMELEN: u32 = 32; -pub const IP6T_CONTINUE: u32 = 4294967295; -pub const IP6T_RETURN: i32 = -5; -pub const XT_TCP_INV_SRCPT: u32 = 1; -pub const XT_TCP_INV_DSTPT: u32 = 2; -pub const XT_TCP_INV_FLAGS: u32 = 4; -pub const XT_TCP_INV_OPTION: u32 = 8; -pub const XT_TCP_INV_MASK: u32 = 15; -pub const XT_UDP_INV_SRCPT: u32 = 1; -pub const XT_UDP_INV_DSTPT: u32 = 2; -pub const XT_UDP_INV_MASK: u32 = 3; -pub const IP6T_TCP_INV_SRCPT: u32 = 1; -pub const IP6T_TCP_INV_DSTPT: u32 = 2; -pub const IP6T_TCP_INV_FLAGS: u32 = 4; -pub const IP6T_TCP_INV_OPTION: u32 = 8; -pub const IP6T_TCP_INV_MASK: u32 = 15; -pub const IP6T_UDP_INV_SRCPT: u32 = 1; -pub const IP6T_UDP_INV_DSTPT: u32 = 2; -pub const IP6T_UDP_INV_MASK: u32 = 3; -pub const IP6T_STANDARD_TARGET: &[u8; 1] = b"\0"; -pub const IP6T_ERROR_TARGET: &[u8; 6] = b"ERROR\0"; -pub const IP6T_F_PROTO: u32 = 1; -pub const IP6T_F_TOS: u32 = 2; -pub const IP6T_F_GOTO: u32 = 4; -pub const IP6T_F_MASK: u32 = 7; -pub const IP6T_INV_VIA_IN: u32 = 1; -pub const IP6T_INV_VIA_OUT: u32 = 2; -pub const IP6T_INV_TOS: u32 = 4; -pub const IP6T_INV_SRCIP: u32 = 8; -pub const IP6T_INV_DSTIP: u32 = 16; -pub const IP6T_INV_FRAG: u32 = 32; -pub const IP6T_INV_PROTO: u32 = 64; -pub const IP6T_INV_MASK: u32 = 127; -pub const IP6T_BASE_CTL: u32 = 64; -pub const IP6T_SO_SET_REPLACE: u32 = 64; -pub const IP6T_SO_SET_ADD_COUNTERS: u32 = 65; -pub const IP6T_SO_SET_MAX: u32 = 65; -pub const IP6T_SO_GET_INFO: u32 = 64; -pub const IP6T_SO_GET_ENTRIES: u32 = 65; -pub const IP6T_SO_GET_REVISION_MATCH: u32 = 68; -pub const IP6T_SO_GET_REVISION_TARGET: u32 = 69; -pub const IP6T_SO_GET_MAX: u32 = 69; -pub const IP6T_SO_ORIGINAL_DST: u32 = 80; -pub const IP6T_ICMP_INV: u32 = 1; -pub const NF_IP_PRE_ROUTING: u32 = 0; -pub const NF_IP_LOCAL_IN: u32 = 1; -pub const NF_IP_FORWARD: u32 = 2; -pub const NF_IP_LOCAL_OUT: u32 = 3; -pub const NF_IP_POST_ROUTING: u32 = 4; -pub const NF_IP_NUMHOOKS: u32 = 5; -pub const SO_ORIGINAL_DST: u32 = 80; -pub const SHUT_RD: u32 = 0; -pub const SHUT_WR: u32 = 1; -pub const SHUT_RDWR: u32 = 2; -pub const SOCK_STREAM: u32 = 1; -pub const SOCK_DGRAM: u32 = 2; -pub const SOCK_RAW: u32 = 3; -pub const SOCK_RDM: u32 = 4; -pub const SOCK_SEQPACKET: u32 = 5; -pub const MSG_DONTWAIT: u32 = 64; -pub const AF_UNSPEC: u32 = 0; -pub const AF_UNIX: u32 = 1; -pub const AF_INET: u32 = 2; -pub const AF_AX25: u32 = 3; -pub const AF_IPX: u32 = 4; -pub const AF_APPLETALK: u32 = 5; -pub const AF_NETROM: u32 = 6; -pub const AF_BRIDGE: u32 = 7; -pub const AF_ATMPVC: u32 = 8; -pub const AF_X25: u32 = 9; -pub const AF_INET6: u32 = 10; -pub const AF_ROSE: u32 = 11; -pub const AF_DECnet: u32 = 12; -pub const AF_NETBEUI: u32 = 13; -pub const AF_SECURITY: u32 = 14; -pub const AF_KEY: u32 = 15; -pub const AF_NETLINK: u32 = 16; -pub const AF_PACKET: u32 = 17; -pub const AF_ASH: u32 = 18; -pub const AF_ECONET: u32 = 19; -pub const AF_ATMSVC: u32 = 20; -pub const AF_RDS: u32 = 21; -pub const AF_SNA: u32 = 22; -pub const AF_IRDA: u32 = 23; -pub const AF_PPPOX: u32 = 24; -pub const AF_WANPIPE: u32 = 25; -pub const AF_LLC: u32 = 26; -pub const AF_CAN: u32 = 29; -pub const AF_TIPC: u32 = 30; -pub const AF_BLUETOOTH: u32 = 31; -pub const AF_IUCV: u32 = 32; -pub const AF_RXRPC: u32 = 33; -pub const AF_ISDN: u32 = 34; -pub const AF_PHONET: u32 = 35; -pub const AF_IEEE802154: u32 = 36; -pub const AF_MAX: u32 = 37; -pub const MSG_OOB: u32 = 1; -pub const MSG_PEEK: u32 = 2; -pub const MSG_DONTROUTE: u32 = 4; -pub const MSG_CTRUNC: u32 = 8; -pub const MSG_PROBE: u32 = 16; -pub const MSG_TRUNC: u32 = 32; -pub const MSG_EOR: u32 = 128; -pub const MSG_WAITALL: u32 = 256; -pub const MSG_FIN: u32 = 512; -pub const MSG_SYN: u32 = 1024; -pub const MSG_CONFIRM: u32 = 2048; -pub const MSG_RST: u32 = 4096; -pub const MSG_ERRQUEUE: u32 = 8192; -pub const MSG_NOSIGNAL: u32 = 16384; -pub const MSG_MORE: u32 = 32768; -pub const MSG_CMSG_CLOEXEC: u32 = 1073741824; -pub const SCM_RIGHTS: u32 = 1; -pub const SCM_CREDENTIALS: u32 = 2; -pub const SCM_SECURITY: u32 = 3; -pub const IPPROTO_IP: _bindgen_ty_1 = _bindgen_ty_1::IPPROTO_IP; -pub const IPPROTO_ICMP: _bindgen_ty_1 = _bindgen_ty_1::IPPROTO_ICMP; -pub const IPPROTO_IGMP: _bindgen_ty_1 = _bindgen_ty_1::IPPROTO_IGMP; -pub const IPPROTO_IPIP: _bindgen_ty_1 = _bindgen_ty_1::IPPROTO_IPIP; -pub const IPPROTO_TCP: _bindgen_ty_1 = _bindgen_ty_1::IPPROTO_TCP; -pub const IPPROTO_EGP: _bindgen_ty_1 = _bindgen_ty_1::IPPROTO_EGP; -pub const IPPROTO_PUP: _bindgen_ty_1 = _bindgen_ty_1::IPPROTO_PUP; -pub const IPPROTO_UDP: _bindgen_ty_1 = _bindgen_ty_1::IPPROTO_UDP; -pub const IPPROTO_IDP: _bindgen_ty_1 = _bindgen_ty_1::IPPROTO_IDP; -pub const IPPROTO_TP: _bindgen_ty_1 = _bindgen_ty_1::IPPROTO_TP; -pub const IPPROTO_DCCP: _bindgen_ty_1 = _bindgen_ty_1::IPPROTO_DCCP; -pub const IPPROTO_IPV6: _bindgen_ty_1 = _bindgen_ty_1::IPPROTO_IPV6; -pub const IPPROTO_RSVP: _bindgen_ty_1 = _bindgen_ty_1::IPPROTO_RSVP; -pub const IPPROTO_GRE: _bindgen_ty_1 = _bindgen_ty_1::IPPROTO_GRE; -pub const IPPROTO_ESP: _bindgen_ty_1 = _bindgen_ty_1::IPPROTO_ESP; -pub const IPPROTO_AH: _bindgen_ty_1 = _bindgen_ty_1::IPPROTO_AH; -pub const IPPROTO_MTP: _bindgen_ty_1 = _bindgen_ty_1::IPPROTO_MTP; -pub const IPPROTO_BEETPH: _bindgen_ty_1 = _bindgen_ty_1::IPPROTO_BEETPH; -pub const IPPROTO_ENCAP: _bindgen_ty_1 = _bindgen_ty_1::IPPROTO_ENCAP; -pub const IPPROTO_PIM: _bindgen_ty_1 = _bindgen_ty_1::IPPROTO_PIM; -pub const IPPROTO_COMP: _bindgen_ty_1 = _bindgen_ty_1::IPPROTO_COMP; -pub const IPPROTO_L2TP: _bindgen_ty_1 = _bindgen_ty_1::IPPROTO_L2TP; -pub const IPPROTO_SCTP: _bindgen_ty_1 = _bindgen_ty_1::IPPROTO_SCTP; -pub const IPPROTO_UDPLITE: _bindgen_ty_1 = _bindgen_ty_1::IPPROTO_UDPLITE; -pub const IPPROTO_MPLS: _bindgen_ty_1 = _bindgen_ty_1::IPPROTO_MPLS; -pub const IPPROTO_ETHERNET: _bindgen_ty_1 = _bindgen_ty_1::IPPROTO_ETHERNET; -pub const IPPROTO_RAW: _bindgen_ty_1 = _bindgen_ty_1::IPPROTO_RAW; -pub const IPPROTO_MPTCP: _bindgen_ty_1 = _bindgen_ty_1::IPPROTO_MPTCP; -pub const IPPROTO_MAX: _bindgen_ty_1 = _bindgen_ty_1::IPPROTO_MAX; -pub const IPV4_DEVCONF_FORWARDING: _bindgen_ty_2 = _bindgen_ty_2::IPV4_DEVCONF_FORWARDING; -pub const IPV4_DEVCONF_MC_FORWARDING: _bindgen_ty_2 = _bindgen_ty_2::IPV4_DEVCONF_MC_FORWARDING; -pub const IPV4_DEVCONF_PROXY_ARP: _bindgen_ty_2 = _bindgen_ty_2::IPV4_DEVCONF_PROXY_ARP; -pub const IPV4_DEVCONF_ACCEPT_REDIRECTS: _bindgen_ty_2 = _bindgen_ty_2::IPV4_DEVCONF_ACCEPT_REDIRECTS; -pub const IPV4_DEVCONF_SECURE_REDIRECTS: _bindgen_ty_2 = _bindgen_ty_2::IPV4_DEVCONF_SECURE_REDIRECTS; -pub const IPV4_DEVCONF_SEND_REDIRECTS: _bindgen_ty_2 = _bindgen_ty_2::IPV4_DEVCONF_SEND_REDIRECTS; -pub const IPV4_DEVCONF_SHARED_MEDIA: _bindgen_ty_2 = _bindgen_ty_2::IPV4_DEVCONF_SHARED_MEDIA; -pub const IPV4_DEVCONF_RP_FILTER: _bindgen_ty_2 = _bindgen_ty_2::IPV4_DEVCONF_RP_FILTER; -pub const IPV4_DEVCONF_ACCEPT_SOURCE_ROUTE: _bindgen_ty_2 = _bindgen_ty_2::IPV4_DEVCONF_ACCEPT_SOURCE_ROUTE; -pub const IPV4_DEVCONF_BOOTP_RELAY: _bindgen_ty_2 = _bindgen_ty_2::IPV4_DEVCONF_BOOTP_RELAY; -pub const IPV4_DEVCONF_LOG_MARTIANS: _bindgen_ty_2 = _bindgen_ty_2::IPV4_DEVCONF_LOG_MARTIANS; -pub const IPV4_DEVCONF_TAG: _bindgen_ty_2 = _bindgen_ty_2::IPV4_DEVCONF_TAG; -pub const IPV4_DEVCONF_ARPFILTER: _bindgen_ty_2 = _bindgen_ty_2::IPV4_DEVCONF_ARPFILTER; -pub const IPV4_DEVCONF_MEDIUM_ID: _bindgen_ty_2 = _bindgen_ty_2::IPV4_DEVCONF_MEDIUM_ID; -pub const IPV4_DEVCONF_NOXFRM: _bindgen_ty_2 = _bindgen_ty_2::IPV4_DEVCONF_NOXFRM; -pub const IPV4_DEVCONF_NOPOLICY: _bindgen_ty_2 = _bindgen_ty_2::IPV4_DEVCONF_NOPOLICY; -pub const IPV4_DEVCONF_FORCE_IGMP_VERSION: _bindgen_ty_2 = _bindgen_ty_2::IPV4_DEVCONF_FORCE_IGMP_VERSION; -pub const IPV4_DEVCONF_ARP_ANNOUNCE: _bindgen_ty_2 = _bindgen_ty_2::IPV4_DEVCONF_ARP_ANNOUNCE; -pub const IPV4_DEVCONF_ARP_IGNORE: _bindgen_ty_2 = _bindgen_ty_2::IPV4_DEVCONF_ARP_IGNORE; -pub const IPV4_DEVCONF_PROMOTE_SECONDARIES: _bindgen_ty_2 = _bindgen_ty_2::IPV4_DEVCONF_PROMOTE_SECONDARIES; -pub const IPV4_DEVCONF_ARP_ACCEPT: _bindgen_ty_2 = _bindgen_ty_2::IPV4_DEVCONF_ARP_ACCEPT; -pub const IPV4_DEVCONF_ARP_NOTIFY: _bindgen_ty_2 = _bindgen_ty_2::IPV4_DEVCONF_ARP_NOTIFY; -pub const IPV4_DEVCONF_ACCEPT_LOCAL: _bindgen_ty_2 = _bindgen_ty_2::IPV4_DEVCONF_ACCEPT_LOCAL; -pub const IPV4_DEVCONF_SRC_VMARK: _bindgen_ty_2 = _bindgen_ty_2::IPV4_DEVCONF_SRC_VMARK; -pub const IPV4_DEVCONF_PROXY_ARP_PVLAN: _bindgen_ty_2 = _bindgen_ty_2::IPV4_DEVCONF_PROXY_ARP_PVLAN; -pub const IPV4_DEVCONF_ROUTE_LOCALNET: _bindgen_ty_2 = _bindgen_ty_2::IPV4_DEVCONF_ROUTE_LOCALNET; -pub const IPV4_DEVCONF_IGMPV2_UNSOLICITED_REPORT_INTERVAL: _bindgen_ty_2 = _bindgen_ty_2::IPV4_DEVCONF_IGMPV2_UNSOLICITED_REPORT_INTERVAL; -pub const IPV4_DEVCONF_IGMPV3_UNSOLICITED_REPORT_INTERVAL: _bindgen_ty_2 = _bindgen_ty_2::IPV4_DEVCONF_IGMPV3_UNSOLICITED_REPORT_INTERVAL; -pub const IPV4_DEVCONF_IGNORE_ROUTES_WITH_LINKDOWN: _bindgen_ty_2 = _bindgen_ty_2::IPV4_DEVCONF_IGNORE_ROUTES_WITH_LINKDOWN; -pub const IPV4_DEVCONF_DROP_UNICAST_IN_L2_MULTICAST: _bindgen_ty_2 = _bindgen_ty_2::IPV4_DEVCONF_DROP_UNICAST_IN_L2_MULTICAST; -pub const IPV4_DEVCONF_DROP_GRATUITOUS_ARP: _bindgen_ty_2 = _bindgen_ty_2::IPV4_DEVCONF_DROP_GRATUITOUS_ARP; -pub const IPV4_DEVCONF_BC_FORWARDING: _bindgen_ty_2 = _bindgen_ty_2::IPV4_DEVCONF_BC_FORWARDING; -pub const IPV4_DEVCONF_ARP_EVICT_NOCARRIER: _bindgen_ty_2 = _bindgen_ty_2::IPV4_DEVCONF_ARP_EVICT_NOCARRIER; -pub const __IPV4_DEVCONF_MAX: _bindgen_ty_2 = _bindgen_ty_2::__IPV4_DEVCONF_MAX; -pub const DEVCONF_FORWARDING: _bindgen_ty_3 = _bindgen_ty_3::DEVCONF_FORWARDING; -pub const DEVCONF_HOPLIMIT: _bindgen_ty_3 = _bindgen_ty_3::DEVCONF_HOPLIMIT; -pub const DEVCONF_MTU6: _bindgen_ty_3 = _bindgen_ty_3::DEVCONF_MTU6; -pub const DEVCONF_ACCEPT_RA: _bindgen_ty_3 = _bindgen_ty_3::DEVCONF_ACCEPT_RA; -pub const DEVCONF_ACCEPT_REDIRECTS: _bindgen_ty_3 = _bindgen_ty_3::DEVCONF_ACCEPT_REDIRECTS; -pub const DEVCONF_AUTOCONF: _bindgen_ty_3 = _bindgen_ty_3::DEVCONF_AUTOCONF; -pub const DEVCONF_DAD_TRANSMITS: _bindgen_ty_3 = _bindgen_ty_3::DEVCONF_DAD_TRANSMITS; -pub const DEVCONF_RTR_SOLICITS: _bindgen_ty_3 = _bindgen_ty_3::DEVCONF_RTR_SOLICITS; -pub const DEVCONF_RTR_SOLICIT_INTERVAL: _bindgen_ty_3 = _bindgen_ty_3::DEVCONF_RTR_SOLICIT_INTERVAL; -pub const DEVCONF_RTR_SOLICIT_DELAY: _bindgen_ty_3 = _bindgen_ty_3::DEVCONF_RTR_SOLICIT_DELAY; -pub const DEVCONF_USE_TEMPADDR: _bindgen_ty_3 = _bindgen_ty_3::DEVCONF_USE_TEMPADDR; -pub const DEVCONF_TEMP_VALID_LFT: _bindgen_ty_3 = _bindgen_ty_3::DEVCONF_TEMP_VALID_LFT; -pub const DEVCONF_TEMP_PREFERED_LFT: _bindgen_ty_3 = _bindgen_ty_3::DEVCONF_TEMP_PREFERED_LFT; -pub const DEVCONF_REGEN_MAX_RETRY: _bindgen_ty_3 = _bindgen_ty_3::DEVCONF_REGEN_MAX_RETRY; -pub const DEVCONF_MAX_DESYNC_FACTOR: _bindgen_ty_3 = _bindgen_ty_3::DEVCONF_MAX_DESYNC_FACTOR; -pub const DEVCONF_MAX_ADDRESSES: _bindgen_ty_3 = _bindgen_ty_3::DEVCONF_MAX_ADDRESSES; -pub const DEVCONF_FORCE_MLD_VERSION: _bindgen_ty_3 = _bindgen_ty_3::DEVCONF_FORCE_MLD_VERSION; -pub const DEVCONF_ACCEPT_RA_DEFRTR: _bindgen_ty_3 = _bindgen_ty_3::DEVCONF_ACCEPT_RA_DEFRTR; -pub const DEVCONF_ACCEPT_RA_PINFO: _bindgen_ty_3 = _bindgen_ty_3::DEVCONF_ACCEPT_RA_PINFO; -pub const DEVCONF_ACCEPT_RA_RTR_PREF: _bindgen_ty_3 = _bindgen_ty_3::DEVCONF_ACCEPT_RA_RTR_PREF; -pub const DEVCONF_RTR_PROBE_INTERVAL: _bindgen_ty_3 = _bindgen_ty_3::DEVCONF_RTR_PROBE_INTERVAL; -pub const DEVCONF_ACCEPT_RA_RT_INFO_MAX_PLEN: _bindgen_ty_3 = _bindgen_ty_3::DEVCONF_ACCEPT_RA_RT_INFO_MAX_PLEN; -pub const DEVCONF_PROXY_NDP: _bindgen_ty_3 = _bindgen_ty_3::DEVCONF_PROXY_NDP; -pub const DEVCONF_OPTIMISTIC_DAD: _bindgen_ty_3 = _bindgen_ty_3::DEVCONF_OPTIMISTIC_DAD; -pub const DEVCONF_ACCEPT_SOURCE_ROUTE: _bindgen_ty_3 = _bindgen_ty_3::DEVCONF_ACCEPT_SOURCE_ROUTE; -pub const DEVCONF_MC_FORWARDING: _bindgen_ty_3 = _bindgen_ty_3::DEVCONF_MC_FORWARDING; -pub const DEVCONF_DISABLE_IPV6: _bindgen_ty_3 = _bindgen_ty_3::DEVCONF_DISABLE_IPV6; -pub const DEVCONF_ACCEPT_DAD: _bindgen_ty_3 = _bindgen_ty_3::DEVCONF_ACCEPT_DAD; -pub const DEVCONF_FORCE_TLLAO: _bindgen_ty_3 = _bindgen_ty_3::DEVCONF_FORCE_TLLAO; -pub const DEVCONF_NDISC_NOTIFY: _bindgen_ty_3 = _bindgen_ty_3::DEVCONF_NDISC_NOTIFY; -pub const DEVCONF_MLDV1_UNSOLICITED_REPORT_INTERVAL: _bindgen_ty_3 = _bindgen_ty_3::DEVCONF_MLDV1_UNSOLICITED_REPORT_INTERVAL; -pub const DEVCONF_MLDV2_UNSOLICITED_REPORT_INTERVAL: _bindgen_ty_3 = _bindgen_ty_3::DEVCONF_MLDV2_UNSOLICITED_REPORT_INTERVAL; -pub const DEVCONF_SUPPRESS_FRAG_NDISC: _bindgen_ty_3 = _bindgen_ty_3::DEVCONF_SUPPRESS_FRAG_NDISC; -pub const DEVCONF_ACCEPT_RA_FROM_LOCAL: _bindgen_ty_3 = _bindgen_ty_3::DEVCONF_ACCEPT_RA_FROM_LOCAL; -pub const DEVCONF_USE_OPTIMISTIC: _bindgen_ty_3 = _bindgen_ty_3::DEVCONF_USE_OPTIMISTIC; -pub const DEVCONF_ACCEPT_RA_MTU: _bindgen_ty_3 = _bindgen_ty_3::DEVCONF_ACCEPT_RA_MTU; -pub const DEVCONF_STABLE_SECRET: _bindgen_ty_3 = _bindgen_ty_3::DEVCONF_STABLE_SECRET; -pub const DEVCONF_USE_OIF_ADDRS_ONLY: _bindgen_ty_3 = _bindgen_ty_3::DEVCONF_USE_OIF_ADDRS_ONLY; -pub const DEVCONF_ACCEPT_RA_MIN_HOP_LIMIT: _bindgen_ty_3 = _bindgen_ty_3::DEVCONF_ACCEPT_RA_MIN_HOP_LIMIT; -pub const DEVCONF_IGNORE_ROUTES_WITH_LINKDOWN: _bindgen_ty_3 = _bindgen_ty_3::DEVCONF_IGNORE_ROUTES_WITH_LINKDOWN; -pub const DEVCONF_DROP_UNICAST_IN_L2_MULTICAST: _bindgen_ty_3 = _bindgen_ty_3::DEVCONF_DROP_UNICAST_IN_L2_MULTICAST; -pub const DEVCONF_DROP_UNSOLICITED_NA: _bindgen_ty_3 = _bindgen_ty_3::DEVCONF_DROP_UNSOLICITED_NA; -pub const DEVCONF_KEEP_ADDR_ON_DOWN: _bindgen_ty_3 = _bindgen_ty_3::DEVCONF_KEEP_ADDR_ON_DOWN; -pub const DEVCONF_RTR_SOLICIT_MAX_INTERVAL: _bindgen_ty_3 = _bindgen_ty_3::DEVCONF_RTR_SOLICIT_MAX_INTERVAL; -pub const DEVCONF_SEG6_ENABLED: _bindgen_ty_3 = _bindgen_ty_3::DEVCONF_SEG6_ENABLED; -pub const DEVCONF_SEG6_REQUIRE_HMAC: _bindgen_ty_3 = _bindgen_ty_3::DEVCONF_SEG6_REQUIRE_HMAC; -pub const DEVCONF_ENHANCED_DAD: _bindgen_ty_3 = _bindgen_ty_3::DEVCONF_ENHANCED_DAD; -pub const DEVCONF_ADDR_GEN_MODE: _bindgen_ty_3 = _bindgen_ty_3::DEVCONF_ADDR_GEN_MODE; -pub const DEVCONF_DISABLE_POLICY: _bindgen_ty_3 = _bindgen_ty_3::DEVCONF_DISABLE_POLICY; -pub const DEVCONF_ACCEPT_RA_RT_INFO_MIN_PLEN: _bindgen_ty_3 = _bindgen_ty_3::DEVCONF_ACCEPT_RA_RT_INFO_MIN_PLEN; -pub const DEVCONF_NDISC_TCLASS: _bindgen_ty_3 = _bindgen_ty_3::DEVCONF_NDISC_TCLASS; -pub const DEVCONF_RPL_SEG_ENABLED: _bindgen_ty_3 = _bindgen_ty_3::DEVCONF_RPL_SEG_ENABLED; -pub const DEVCONF_RA_DEFRTR_METRIC: _bindgen_ty_3 = _bindgen_ty_3::DEVCONF_RA_DEFRTR_METRIC; -pub const DEVCONF_IOAM6_ENABLED: _bindgen_ty_3 = _bindgen_ty_3::DEVCONF_IOAM6_ENABLED; -pub const DEVCONF_IOAM6_ID: _bindgen_ty_3 = _bindgen_ty_3::DEVCONF_IOAM6_ID; -pub const DEVCONF_IOAM6_ID_WIDE: _bindgen_ty_3 = _bindgen_ty_3::DEVCONF_IOAM6_ID_WIDE; -pub const DEVCONF_NDISC_EVICT_NOCARRIER: _bindgen_ty_3 = _bindgen_ty_3::DEVCONF_NDISC_EVICT_NOCARRIER; -pub const DEVCONF_ACCEPT_UNTRACKED_NA: _bindgen_ty_3 = _bindgen_ty_3::DEVCONF_ACCEPT_UNTRACKED_NA; -pub const DEVCONF_MAX: _bindgen_ty_3 = _bindgen_ty_3::DEVCONF_MAX; -pub const TCP_FLAG_CWR: _bindgen_ty_4 = _bindgen_ty_4::TCP_FLAG_CWR; -pub const TCP_FLAG_ECE: _bindgen_ty_4 = _bindgen_ty_4::TCP_FLAG_ECE; -pub const TCP_FLAG_URG: _bindgen_ty_4 = _bindgen_ty_4::TCP_FLAG_URG; -pub const TCP_FLAG_ACK: _bindgen_ty_4 = _bindgen_ty_4::TCP_FLAG_ACK; -pub const TCP_FLAG_PSH: _bindgen_ty_4 = _bindgen_ty_4::TCP_FLAG_PSH; -pub const TCP_FLAG_RST: _bindgen_ty_4 = _bindgen_ty_4::TCP_FLAG_RST; -pub const TCP_FLAG_SYN: _bindgen_ty_4 = _bindgen_ty_4::TCP_FLAG_SYN; -pub const TCP_FLAG_FIN: _bindgen_ty_4 = _bindgen_ty_4::TCP_FLAG_FIN; -pub const TCP_RESERVED_BITS: _bindgen_ty_4 = _bindgen_ty_4::TCP_RESERVED_BITS; -pub const TCP_DATA_OFFSET: _bindgen_ty_4 = _bindgen_ty_4::TCP_DATA_OFFSET; -pub const TCP_NO_QUEUE: _bindgen_ty_5 = _bindgen_ty_5::TCP_NO_QUEUE; -pub const TCP_RECV_QUEUE: _bindgen_ty_5 = _bindgen_ty_5::TCP_RECV_QUEUE; -pub const TCP_SEND_QUEUE: _bindgen_ty_5 = _bindgen_ty_5::TCP_SEND_QUEUE; -pub const TCP_QUEUES_NR: _bindgen_ty_5 = _bindgen_ty_5::TCP_QUEUES_NR; -pub const TCP_NLA_PAD: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_PAD; -pub const TCP_NLA_BUSY: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_BUSY; -pub const TCP_NLA_RWND_LIMITED: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_RWND_LIMITED; -pub const TCP_NLA_SNDBUF_LIMITED: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_SNDBUF_LIMITED; -pub const TCP_NLA_DATA_SEGS_OUT: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_DATA_SEGS_OUT; -pub const TCP_NLA_TOTAL_RETRANS: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_TOTAL_RETRANS; -pub const TCP_NLA_PACING_RATE: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_PACING_RATE; -pub const TCP_NLA_DELIVERY_RATE: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_DELIVERY_RATE; -pub const TCP_NLA_SND_CWND: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_SND_CWND; -pub const TCP_NLA_REORDERING: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_REORDERING; -pub const TCP_NLA_MIN_RTT: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_MIN_RTT; -pub const TCP_NLA_RECUR_RETRANS: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_RECUR_RETRANS; -pub const TCP_NLA_DELIVERY_RATE_APP_LMT: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_DELIVERY_RATE_APP_LMT; -pub const TCP_NLA_SNDQ_SIZE: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_SNDQ_SIZE; -pub const TCP_NLA_CA_STATE: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_CA_STATE; -pub const TCP_NLA_SND_SSTHRESH: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_SND_SSTHRESH; -pub const TCP_NLA_DELIVERED: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_DELIVERED; -pub const TCP_NLA_DELIVERED_CE: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_DELIVERED_CE; -pub const TCP_NLA_BYTES_SENT: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_BYTES_SENT; -pub const TCP_NLA_BYTES_RETRANS: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_BYTES_RETRANS; -pub const TCP_NLA_DSACK_DUPS: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_DSACK_DUPS; -pub const TCP_NLA_REORD_SEEN: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_REORD_SEEN; -pub const TCP_NLA_SRTT: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_SRTT; -pub const TCP_NLA_TIMEOUT_REHASH: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_TIMEOUT_REHASH; -pub const TCP_NLA_BYTES_NOTSENT: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_BYTES_NOTSENT; -pub const TCP_NLA_EDT: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_EDT; -pub const TCP_NLA_TTL: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_TTL; -pub const TCP_NLA_REHASH: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_REHASH; -pub const IF_OPER_UNKNOWN: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_UNKNOWN; -pub const IF_OPER_NOTPRESENT: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_NOTPRESENT; -pub const IF_OPER_DOWN: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_DOWN; -pub const IF_OPER_LOWERLAYERDOWN: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_LOWERLAYERDOWN; -pub const IF_OPER_TESTING: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_TESTING; -pub const IF_OPER_DORMANT: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_DORMANT; -pub const IF_OPER_UP: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_UP; -pub const IF_LINK_MODE_DEFAULT: _bindgen_ty_8 = _bindgen_ty_8::IF_LINK_MODE_DEFAULT; -pub const IF_LINK_MODE_DORMANT: _bindgen_ty_8 = _bindgen_ty_8::IF_LINK_MODE_DORMANT; -pub const IF_LINK_MODE_TESTING: _bindgen_ty_8 = _bindgen_ty_8::IF_LINK_MODE_TESTING; -pub const NFPROTO_UNSPEC: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_UNSPEC; -pub const NFPROTO_INET: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_INET; -pub const NFPROTO_IPV4: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_IPV4; -pub const NFPROTO_ARP: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_ARP; -pub const NFPROTO_NETDEV: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_NETDEV; -pub const NFPROTO_BRIDGE: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_BRIDGE; -pub const NFPROTO_IPV6: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_IPV6; -pub const NFPROTO_DECNET: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_DECNET; -pub const NFPROTO_NUMPROTO: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_NUMPROTO; -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_1 { -IPPROTO_IP = 0, -IPPROTO_ICMP = 1, -IPPROTO_IGMP = 2, -IPPROTO_IPIP = 4, -IPPROTO_TCP = 6, -IPPROTO_EGP = 8, -IPPROTO_PUP = 12, -IPPROTO_UDP = 17, -IPPROTO_IDP = 22, -IPPROTO_TP = 29, -IPPROTO_DCCP = 33, -IPPROTO_IPV6 = 41, -IPPROTO_RSVP = 46, -IPPROTO_GRE = 47, -IPPROTO_ESP = 50, -IPPROTO_AH = 51, -IPPROTO_MTP = 92, -IPPROTO_BEETPH = 94, -IPPROTO_ENCAP = 98, -IPPROTO_PIM = 103, -IPPROTO_COMP = 108, -IPPROTO_L2TP = 115, -IPPROTO_SCTP = 132, -IPPROTO_UDPLITE = 136, -IPPROTO_MPLS = 137, -IPPROTO_ETHERNET = 143, -IPPROTO_RAW = 255, -IPPROTO_MPTCP = 262, -IPPROTO_MAX = 263, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_2 { -IPV4_DEVCONF_FORWARDING = 1, -IPV4_DEVCONF_MC_FORWARDING = 2, -IPV4_DEVCONF_PROXY_ARP = 3, -IPV4_DEVCONF_ACCEPT_REDIRECTS = 4, -IPV4_DEVCONF_SECURE_REDIRECTS = 5, -IPV4_DEVCONF_SEND_REDIRECTS = 6, -IPV4_DEVCONF_SHARED_MEDIA = 7, -IPV4_DEVCONF_RP_FILTER = 8, -IPV4_DEVCONF_ACCEPT_SOURCE_ROUTE = 9, -IPV4_DEVCONF_BOOTP_RELAY = 10, -IPV4_DEVCONF_LOG_MARTIANS = 11, -IPV4_DEVCONF_TAG = 12, -IPV4_DEVCONF_ARPFILTER = 13, -IPV4_DEVCONF_MEDIUM_ID = 14, -IPV4_DEVCONF_NOXFRM = 15, -IPV4_DEVCONF_NOPOLICY = 16, -IPV4_DEVCONF_FORCE_IGMP_VERSION = 17, -IPV4_DEVCONF_ARP_ANNOUNCE = 18, -IPV4_DEVCONF_ARP_IGNORE = 19, -IPV4_DEVCONF_PROMOTE_SECONDARIES = 20, -IPV4_DEVCONF_ARP_ACCEPT = 21, -IPV4_DEVCONF_ARP_NOTIFY = 22, -IPV4_DEVCONF_ACCEPT_LOCAL = 23, -IPV4_DEVCONF_SRC_VMARK = 24, -IPV4_DEVCONF_PROXY_ARP_PVLAN = 25, -IPV4_DEVCONF_ROUTE_LOCALNET = 26, -IPV4_DEVCONF_IGMPV2_UNSOLICITED_REPORT_INTERVAL = 27, -IPV4_DEVCONF_IGMPV3_UNSOLICITED_REPORT_INTERVAL = 28, -IPV4_DEVCONF_IGNORE_ROUTES_WITH_LINKDOWN = 29, -IPV4_DEVCONF_DROP_UNICAST_IN_L2_MULTICAST = 30, -IPV4_DEVCONF_DROP_GRATUITOUS_ARP = 31, -IPV4_DEVCONF_BC_FORWARDING = 32, -IPV4_DEVCONF_ARP_EVICT_NOCARRIER = 33, -__IPV4_DEVCONF_MAX = 34, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_3 { -DEVCONF_FORWARDING = 0, -DEVCONF_HOPLIMIT = 1, -DEVCONF_MTU6 = 2, -DEVCONF_ACCEPT_RA = 3, -DEVCONF_ACCEPT_REDIRECTS = 4, -DEVCONF_AUTOCONF = 5, -DEVCONF_DAD_TRANSMITS = 6, -DEVCONF_RTR_SOLICITS = 7, -DEVCONF_RTR_SOLICIT_INTERVAL = 8, -DEVCONF_RTR_SOLICIT_DELAY = 9, -DEVCONF_USE_TEMPADDR = 10, -DEVCONF_TEMP_VALID_LFT = 11, -DEVCONF_TEMP_PREFERED_LFT = 12, -DEVCONF_REGEN_MAX_RETRY = 13, -DEVCONF_MAX_DESYNC_FACTOR = 14, -DEVCONF_MAX_ADDRESSES = 15, -DEVCONF_FORCE_MLD_VERSION = 16, -DEVCONF_ACCEPT_RA_DEFRTR = 17, -DEVCONF_ACCEPT_RA_PINFO = 18, -DEVCONF_ACCEPT_RA_RTR_PREF = 19, -DEVCONF_RTR_PROBE_INTERVAL = 20, -DEVCONF_ACCEPT_RA_RT_INFO_MAX_PLEN = 21, -DEVCONF_PROXY_NDP = 22, -DEVCONF_OPTIMISTIC_DAD = 23, -DEVCONF_ACCEPT_SOURCE_ROUTE = 24, -DEVCONF_MC_FORWARDING = 25, -DEVCONF_DISABLE_IPV6 = 26, -DEVCONF_ACCEPT_DAD = 27, -DEVCONF_FORCE_TLLAO = 28, -DEVCONF_NDISC_NOTIFY = 29, -DEVCONF_MLDV1_UNSOLICITED_REPORT_INTERVAL = 30, -DEVCONF_MLDV2_UNSOLICITED_REPORT_INTERVAL = 31, -DEVCONF_SUPPRESS_FRAG_NDISC = 32, -DEVCONF_ACCEPT_RA_FROM_LOCAL = 33, -DEVCONF_USE_OPTIMISTIC = 34, -DEVCONF_ACCEPT_RA_MTU = 35, -DEVCONF_STABLE_SECRET = 36, -DEVCONF_USE_OIF_ADDRS_ONLY = 37, -DEVCONF_ACCEPT_RA_MIN_HOP_LIMIT = 38, -DEVCONF_IGNORE_ROUTES_WITH_LINKDOWN = 39, -DEVCONF_DROP_UNICAST_IN_L2_MULTICAST = 40, -DEVCONF_DROP_UNSOLICITED_NA = 41, -DEVCONF_KEEP_ADDR_ON_DOWN = 42, -DEVCONF_RTR_SOLICIT_MAX_INTERVAL = 43, -DEVCONF_SEG6_ENABLED = 44, -DEVCONF_SEG6_REQUIRE_HMAC = 45, -DEVCONF_ENHANCED_DAD = 46, -DEVCONF_ADDR_GEN_MODE = 47, -DEVCONF_DISABLE_POLICY = 48, -DEVCONF_ACCEPT_RA_RT_INFO_MIN_PLEN = 49, -DEVCONF_NDISC_TCLASS = 50, -DEVCONF_RPL_SEG_ENABLED = 51, -DEVCONF_RA_DEFRTR_METRIC = 52, -DEVCONF_IOAM6_ENABLED = 53, -DEVCONF_IOAM6_ID = 54, -DEVCONF_IOAM6_ID_WIDE = 55, -DEVCONF_NDISC_EVICT_NOCARRIER = 56, -DEVCONF_ACCEPT_UNTRACKED_NA = 57, -DEVCONF_MAX = 58, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum socket_state { -SS_FREE = 0, -SS_UNCONNECTED = 1, -SS_CONNECTING = 2, -SS_CONNECTED = 3, -SS_DISCONNECTING = 4, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_4 { -TCP_FLAG_CWR = 32768, -TCP_FLAG_ECE = 16384, -TCP_FLAG_URG = 8192, -TCP_FLAG_ACK = 4096, -TCP_FLAG_PSH = 2048, -TCP_FLAG_RST = 1024, -TCP_FLAG_SYN = 512, -TCP_FLAG_FIN = 256, -TCP_RESERVED_BITS = 15, -TCP_DATA_OFFSET = 240, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_5 { -TCP_NO_QUEUE = 0, -TCP_RECV_QUEUE = 1, -TCP_SEND_QUEUE = 2, -TCP_QUEUES_NR = 3, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum tcp_fastopen_client_fail { -TFO_STATUS_UNSPEC = 0, -TFO_COOKIE_UNAVAILABLE = 1, -TFO_DATA_NOT_ACKED = 2, -TFO_SYN_RETRANSMITTED = 3, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum tcp_ca_state { -TCP_CA_Open = 0, -TCP_CA_Disorder = 1, -TCP_CA_CWR = 2, -TCP_CA_Recovery = 3, -TCP_CA_Loss = 4, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_6 { -TCP_NLA_PAD = 0, -TCP_NLA_BUSY = 1, -TCP_NLA_RWND_LIMITED = 2, -TCP_NLA_SNDBUF_LIMITED = 3, -TCP_NLA_DATA_SEGS_OUT = 4, -TCP_NLA_TOTAL_RETRANS = 5, -TCP_NLA_PACING_RATE = 6, -TCP_NLA_DELIVERY_RATE = 7, -TCP_NLA_SND_CWND = 8, -TCP_NLA_REORDERING = 9, -TCP_NLA_MIN_RTT = 10, -TCP_NLA_RECUR_RETRANS = 11, -TCP_NLA_DELIVERY_RATE_APP_LMT = 12, -TCP_NLA_SNDQ_SIZE = 13, -TCP_NLA_CA_STATE = 14, -TCP_NLA_SND_SSTHRESH = 15, -TCP_NLA_DELIVERED = 16, -TCP_NLA_DELIVERED_CE = 17, -TCP_NLA_BYTES_SENT = 18, -TCP_NLA_BYTES_RETRANS = 19, -TCP_NLA_DSACK_DUPS = 20, -TCP_NLA_REORD_SEEN = 21, -TCP_NLA_SRTT = 22, -TCP_NLA_TIMEOUT_REHASH = 23, -TCP_NLA_BYTES_NOTSENT = 24, -TCP_NLA_EDT = 25, -TCP_NLA_TTL = 26, -TCP_NLA_REHASH = 27, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum net_device_flags { -IFF_UP = 1, -IFF_BROADCAST = 2, -IFF_DEBUG = 4, -IFF_LOOPBACK = 8, -IFF_POINTOPOINT = 16, -IFF_NOTRAILERS = 32, -IFF_RUNNING = 64, -IFF_NOARP = 128, -IFF_PROMISC = 256, -IFF_ALLMULTI = 512, -IFF_MASTER = 1024, -IFF_SLAVE = 2048, -IFF_MULTICAST = 4096, -IFF_PORTSEL = 8192, -IFF_AUTOMEDIA = 16384, -IFF_DYNAMIC = 32768, -IFF_LOWER_UP = 65536, -IFF_DORMANT = 131072, -IFF_ECHO = 262144, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_7 { -IF_OPER_UNKNOWN = 0, -IF_OPER_NOTPRESENT = 1, -IF_OPER_DOWN = 2, -IF_OPER_LOWERLAYERDOWN = 3, -IF_OPER_TESTING = 4, -IF_OPER_DORMANT = 5, -IF_OPER_UP = 6, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_8 { -IF_LINK_MODE_DEFAULT = 0, -IF_LINK_MODE_DORMANT = 1, -IF_LINK_MODE_TESTING = 2, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_inet_hooks { -NF_INET_PRE_ROUTING = 0, -NF_INET_LOCAL_IN = 1, -NF_INET_FORWARD = 2, -NF_INET_LOCAL_OUT = 3, -NF_INET_POST_ROUTING = 4, -NF_INET_NUMHOOKS = 5, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_dev_hooks { -NF_NETDEV_INGRESS = 0, -NF_NETDEV_EGRESS = 1, -NF_NETDEV_NUMHOOKS = 2, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_9 { -NFPROTO_UNSPEC = 0, -NFPROTO_INET = 1, -NFPROTO_IPV4 = 2, -NFPROTO_ARP = 3, -NFPROTO_NETDEV = 5, -NFPROTO_BRIDGE = 7, -NFPROTO_IPV6 = 10, -NFPROTO_DECNET = 12, -NFPROTO_NUMPROTO = 13, -} -#[repr(i32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_ip6_hook_priorities { -NF_IP6_PRI_FIRST = -2147483648, -NF_IP6_PRI_RAW_BEFORE_DEFRAG = -450, -NF_IP6_PRI_CONNTRACK_DEFRAG = -400, -NF_IP6_PRI_RAW = -300, -NF_IP6_PRI_SELINUX_FIRST = -225, -NF_IP6_PRI_CONNTRACK = -200, -NF_IP6_PRI_MANGLE = -150, -NF_IP6_PRI_NAT_DST = -100, -NF_IP6_PRI_FILTER = 0, -NF_IP6_PRI_SECURITY = 50, -NF_IP6_PRI_NAT_SRC = 100, -NF_IP6_PRI_SELINUX_LAST = 225, -NF_IP6_PRI_CONNTRACK_HELPER = 300, -NF_IP6_PRI_LAST = 2147483647, -} -#[repr(i32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_ip_hook_priorities { -NF_IP_PRI_FIRST = -2147483648, -NF_IP_PRI_RAW_BEFORE_DEFRAG = -450, -NF_IP_PRI_CONNTRACK_DEFRAG = -400, -NF_IP_PRI_RAW = -300, -NF_IP_PRI_SELINUX_FIRST = -225, -NF_IP_PRI_CONNTRACK = -200, -NF_IP_PRI_MANGLE = -150, -NF_IP_PRI_NAT_DST = -100, -NF_IP_PRI_FILTER = 0, -NF_IP_PRI_SECURITY = 50, -NF_IP_PRI_NAT_SRC = 100, -NF_IP_PRI_SELINUX_LAST = 225, -NF_IP_PRI_CONNTRACK_HELPER = 300, -NF_IP_PRI_CONNTRACK_CONFIRM = 2147483647, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union __kernel_sockaddr_storage__bindgen_ty_1 { -pub __bindgen_anon_1: __kernel_sockaddr_storage__bindgen_ty_1__bindgen_ty_1, -pub __align: *mut crate::ctypes::c_void, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union iphdr__bindgen_ty_1 { -pub __bindgen_anon_1: iphdr__bindgen_ty_1__bindgen_ty_1, -pub addrs: iphdr__bindgen_ty_1__bindgen_ty_2, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union in6_addr__bindgen_ty_1 { -pub u6_addr8: [__u8; 16usize], -pub u6_addr16: [__be16; 8usize], -pub u6_addr32: [__be32; 4usize], -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ipv6hdr__bindgen_ty_1 { -pub __bindgen_anon_1: ipv6hdr__bindgen_ty_1__bindgen_ty_1, -pub addrs: ipv6hdr__bindgen_ty_1__bindgen_ty_2, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union tcp_word_hdr { -pub hdr: tcphdr, -pub words: [__be32; 5usize], -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union if_settings__bindgen_ty_1 { -pub raw_hdlc: *mut raw_hdlc_proto, -pub cisco: *mut cisco_proto, -pub fr: *mut fr_proto, -pub fr_pvc: *mut fr_proto_pvc, -pub fr_pvc_info: *mut fr_proto_pvc_info, -pub x25: *mut x25_hdlc_proto, -pub sync: *mut sync_serial_settings, -pub te1: *mut te1_settings, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ifreq__bindgen_ty_1 { -pub ifrn_name: [crate::ctypes::c_char; 16usize], -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ifreq__bindgen_ty_2 { -pub ifru_addr: sockaddr, -pub ifru_dstaddr: sockaddr, -pub ifru_broadaddr: sockaddr, -pub ifru_netmask: sockaddr, -pub ifru_hwaddr: sockaddr, -pub ifru_flags: crate::ctypes::c_short, -pub ifru_ivalue: crate::ctypes::c_int, -pub ifru_mtu: crate::ctypes::c_int, -pub ifru_map: ifmap, -pub ifru_slave: [crate::ctypes::c_char; 16usize], -pub ifru_newname: [crate::ctypes::c_char; 16usize], -pub ifru_data: *mut crate::ctypes::c_void, -pub ifru_settings: if_settings, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ifconf__bindgen_ty_1 { -pub ifcu_buf: *mut crate::ctypes::c_char, -pub ifcu_req: *mut ifreq, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union nf_inet_addr { -pub all: [__u32; 4usize], -pub ip: __be32, -pub ip6: [__be32; 4usize], -pub in_: in_addr, -pub in6: in6_addr, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union xt_entry_match__bindgen_ty_1 { -pub user: xt_entry_match__bindgen_ty_1__bindgen_ty_1, -pub kernel: xt_entry_match__bindgen_ty_1__bindgen_ty_2, -pub match_size: __u16, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union xt_entry_target__bindgen_ty_1 { -pub user: xt_entry_target__bindgen_ty_1__bindgen_ty_1, -pub kernel: xt_entry_target__bindgen_ty_1__bindgen_ty_2, -pub target_size: __u16, -} -impl __BindgenBitfieldUnit { -#[inline] -pub const fn new(storage: Storage) -> Self { -Self { storage } -} -} -impl __BindgenBitfieldUnit -where -Storage: AsRef<[u8]> + AsMut<[u8]>, -{ -#[inline] -pub fn get_bit(&self, index: usize) -> bool { -debug_assert!(index / 8 < self.storage.as_ref().len()); -let byte_index = index / 8; -let byte = self.storage.as_ref()[byte_index]; -let bit_index = if cfg!(target_endian = "big") { 7 - (index % 8) } else { index % 8 }; -let mask = 1 << bit_index; -byte & mask == mask -} -#[inline] -pub fn set_bit(&mut self, index: usize, val: bool) { -debug_assert!(index / 8 < self.storage.as_ref().len()); -let byte_index = index / 8; -let byte = &mut self.storage.as_mut()[byte_index]; -let bit_index = if cfg!(target_endian = "big") { 7 - (index % 8) } else { index % 8 }; -let mask = 1 << bit_index; -if val { -*byte |= mask; -} else { -*byte &= !mask; -} -} -#[inline] -pub fn get(&self, bit_offset: usize, bit_width: u8) -> u64 { -debug_assert!(bit_width <= 64); -debug_assert!(bit_offset / 8 < self.storage.as_ref().len()); -debug_assert!((bit_offset + (bit_width as usize)) / 8 <= self.storage.as_ref().len()); -let mut val = 0; -for i in 0..(bit_width as usize) { -if self.get_bit(i + bit_offset) { -let index = if cfg!(target_endian = "big") { bit_width as usize - 1 - i } else { i }; -val |= 1 << index; -} -} -val -} -#[inline] -pub fn set(&mut self, bit_offset: usize, bit_width: u8, val: u64) { -debug_assert!(bit_width <= 64); -debug_assert!(bit_offset / 8 < self.storage.as_ref().len()); -debug_assert!((bit_offset + (bit_width as usize)) / 8 <= self.storage.as_ref().len()); -for i in 0..(bit_width as usize) { -let mask = 1 << i; -let val_bit_is_set = val & mask == mask; -let index = if cfg!(target_endian = "big") { bit_width as usize - 1 - i } else { i }; -self.set_bit(index + bit_offset, val_bit_is_set); -} -} -} -impl __IncompleteArrayField { -#[inline] -pub const fn new() -> Self { -__IncompleteArrayField(::core::marker::PhantomData, []) -} -#[inline] -pub fn as_ptr(&self) -> *const T { -self as *const _ as *const T -} -#[inline] -pub fn as_mut_ptr(&mut self) -> *mut T { -self as *mut _ as *mut T -} -#[inline] -pub unsafe fn as_slice(&self, len: usize) -> &[T] { -::core::slice::from_raw_parts(self.as_ptr(), len) -} -#[inline] -pub unsafe fn as_mut_slice(&mut self, len: usize) -> &mut [T] { -::core::slice::from_raw_parts_mut(self.as_mut_ptr(), len) -} -} -impl ::core::fmt::Debug for __IncompleteArrayField { -fn fmt(&self, fmt: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { -fmt.write_str("__IncompleteArrayField") -} -} -impl __BindgenUnionField { -#[inline] -pub const fn new() -> Self { -__BindgenUnionField(::core::marker::PhantomData) -} -#[inline] -pub unsafe fn as_ref(&self) -> &T { -::core::mem::transmute(self) -} -#[inline] -pub unsafe fn as_mut(&mut self) -> &mut T { -::core::mem::transmute(self) -} -} -impl ::core::default::Default for __BindgenUnionField { -#[inline] -fn default() -> Self { -Self::new() -} -} -impl ::core::clone::Clone for __BindgenUnionField { -#[inline] -fn clone(&self) -> Self { -Self::new() -} -} -impl ::core::marker::Copy for __BindgenUnionField {} -impl ::core::fmt::Debug for __BindgenUnionField { -fn fmt(&self, fmt: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { -fmt.write_str("__BindgenUnionField") -} -} -impl ::core::hash::Hash for __BindgenUnionField { -fn hash(&self, _state: &mut H) {} -} -impl ::core::cmp::PartialEq for __BindgenUnionField { -fn eq(&self, _other: &__BindgenUnionField) -> bool { -true -} -} -impl ::core::cmp::Eq for __BindgenUnionField {} -impl iphdr { -#[inline] -pub fn ihl(&self) -> __u8 { -unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 4u8) as u8) } -} -#[inline] -pub fn set_ihl(&mut self, val: __u8) { -unsafe { -let val: u8 = ::core::mem::transmute(val); -self._bitfield_1.set(0usize, 4u8, val as u64) -} -} -#[inline] -pub fn version(&self) -> __u8 { -unsafe { ::core::mem::transmute(self._bitfield_1.get(4usize, 4u8) as u8) } -} -#[inline] -pub fn set_version(&mut self, val: __u8) { -unsafe { -let val: u8 = ::core::mem::transmute(val); -self._bitfield_1.set(4usize, 4u8, val as u64) -} -} -#[inline] -pub fn new_bitfield_1(ihl: __u8, version: __u8) -> __BindgenBitfieldUnit<[u8; 1usize]> { -let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); -__bindgen_bitfield_unit.set(0usize, 4u8, { -let ihl: u8 = unsafe { ::core::mem::transmute(ihl) }; -ihl as u64 -}); -__bindgen_bitfield_unit.set(4usize, 4u8, { -let version: u8 = unsafe { ::core::mem::transmute(version) }; -version as u64 -}); -__bindgen_bitfield_unit -} -} -impl ipv6hdr { -#[inline] -pub fn priority(&self) -> __u8 { -unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 4u8) as u8) } -} -#[inline] -pub fn set_priority(&mut self, val: __u8) { -unsafe { -let val: u8 = ::core::mem::transmute(val); -self._bitfield_1.set(0usize, 4u8, val as u64) -} -} -#[inline] -pub fn version(&self) -> __u8 { -unsafe { ::core::mem::transmute(self._bitfield_1.get(4usize, 4u8) as u8) } -} -#[inline] -pub fn set_version(&mut self, val: __u8) { -unsafe { -let val: u8 = ::core::mem::transmute(val); -self._bitfield_1.set(4usize, 4u8, val as u64) -} -} -#[inline] -pub fn new_bitfield_1(priority: __u8, version: __u8) -> __BindgenBitfieldUnit<[u8; 1usize]> { -let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 1usize]> = Default::default(); -__bindgen_bitfield_unit.set(0usize, 4u8, { -let priority: u8 = unsafe { ::core::mem::transmute(priority) }; -priority as u64 -}); -__bindgen_bitfield_unit.set(4usize, 4u8, { -let version: u8 = unsafe { ::core::mem::transmute(version) }; -version as u64 -}); -__bindgen_bitfield_unit -} -} -impl tcphdr { -#[inline] -pub fn res1(&self) -> __u16 { -unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 4u8) as u16) } -} -#[inline] -pub fn set_res1(&mut self, val: __u16) { -unsafe { -let val: u16 = ::core::mem::transmute(val); -self._bitfield_1.set(0usize, 4u8, val as u64) -} -} -#[inline] -pub fn doff(&self) -> __u16 { -unsafe { ::core::mem::transmute(self._bitfield_1.get(4usize, 4u8) as u16) } -} -#[inline] -pub fn set_doff(&mut self, val: __u16) { -unsafe { -let val: u16 = ::core::mem::transmute(val); -self._bitfield_1.set(4usize, 4u8, val as u64) -} -} -#[inline] -pub fn fin(&self) -> __u16 { -unsafe { ::core::mem::transmute(self._bitfield_1.get(8usize, 1u8) as u16) } -} -#[inline] -pub fn set_fin(&mut self, val: __u16) { -unsafe { -let val: u16 = ::core::mem::transmute(val); -self._bitfield_1.set(8usize, 1u8, val as u64) -} -} -#[inline] -pub fn syn(&self) -> __u16 { -unsafe { ::core::mem::transmute(self._bitfield_1.get(9usize, 1u8) as u16) } -} -#[inline] -pub fn set_syn(&mut self, val: __u16) { -unsafe { -let val: u16 = ::core::mem::transmute(val); -self._bitfield_1.set(9usize, 1u8, val as u64) -} -} -#[inline] -pub fn rst(&self) -> __u16 { -unsafe { ::core::mem::transmute(self._bitfield_1.get(10usize, 1u8) as u16) } -} -#[inline] -pub fn set_rst(&mut self, val: __u16) { -unsafe { -let val: u16 = ::core::mem::transmute(val); -self._bitfield_1.set(10usize, 1u8, val as u64) -} -} -#[inline] -pub fn psh(&self) -> __u16 { -unsafe { ::core::mem::transmute(self._bitfield_1.get(11usize, 1u8) as u16) } -} -#[inline] -pub fn set_psh(&mut self, val: __u16) { -unsafe { -let val: u16 = ::core::mem::transmute(val); -self._bitfield_1.set(11usize, 1u8, val as u64) -} -} -#[inline] -pub fn ack(&self) -> __u16 { -unsafe { ::core::mem::transmute(self._bitfield_1.get(12usize, 1u8) as u16) } -} -#[inline] -pub fn set_ack(&mut self, val: __u16) { -unsafe { -let val: u16 = ::core::mem::transmute(val); -self._bitfield_1.set(12usize, 1u8, val as u64) -} -} -#[inline] -pub fn urg(&self) -> __u16 { -unsafe { ::core::mem::transmute(self._bitfield_1.get(13usize, 1u8) as u16) } -} -#[inline] -pub fn set_urg(&mut self, val: __u16) { -unsafe { -let val: u16 = ::core::mem::transmute(val); -self._bitfield_1.set(13usize, 1u8, val as u64) -} -} -#[inline] -pub fn ece(&self) -> __u16 { -unsafe { ::core::mem::transmute(self._bitfield_1.get(14usize, 1u8) as u16) } -} -#[inline] -pub fn set_ece(&mut self, val: __u16) { -unsafe { -let val: u16 = ::core::mem::transmute(val); -self._bitfield_1.set(14usize, 1u8, val as u64) -} -} -#[inline] -pub fn cwr(&self) -> __u16 { -unsafe { ::core::mem::transmute(self._bitfield_1.get(15usize, 1u8) as u16) } -} -#[inline] -pub fn set_cwr(&mut self, val: __u16) { -unsafe { -let val: u16 = ::core::mem::transmute(val); -self._bitfield_1.set(15usize, 1u8, val as u64) -} -} -#[inline] -pub fn new_bitfield_1(res1: __u16, doff: __u16, fin: __u16, syn: __u16, rst: __u16, psh: __u16, ack: __u16, urg: __u16, ece: __u16, cwr: __u16) -> __BindgenBitfieldUnit<[u8; 2usize]> { -let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 2usize]> = Default::default(); -__bindgen_bitfield_unit.set(0usize, 4u8, { -let res1: u16 = unsafe { ::core::mem::transmute(res1) }; -res1 as u64 -}); -__bindgen_bitfield_unit.set(4usize, 4u8, { -let doff: u16 = unsafe { ::core::mem::transmute(doff) }; -doff as u64 -}); -__bindgen_bitfield_unit.set(8usize, 1u8, { -let fin: u16 = unsafe { ::core::mem::transmute(fin) }; -fin as u64 -}); -__bindgen_bitfield_unit.set(9usize, 1u8, { -let syn: u16 = unsafe { ::core::mem::transmute(syn) }; -syn as u64 -}); -__bindgen_bitfield_unit.set(10usize, 1u8, { -let rst: u16 = unsafe { ::core::mem::transmute(rst) }; -rst as u64 -}); -__bindgen_bitfield_unit.set(11usize, 1u8, { -let psh: u16 = unsafe { ::core::mem::transmute(psh) }; -psh as u64 -}); -__bindgen_bitfield_unit.set(12usize, 1u8, { -let ack: u16 = unsafe { ::core::mem::transmute(ack) }; -ack as u64 -}); -__bindgen_bitfield_unit.set(13usize, 1u8, { -let urg: u16 = unsafe { ::core::mem::transmute(urg) }; -urg as u64 -}); -__bindgen_bitfield_unit.set(14usize, 1u8, { -let ece: u16 = unsafe { ::core::mem::transmute(ece) }; -ece as u64 -}); -__bindgen_bitfield_unit.set(15usize, 1u8, { -let cwr: u16 = unsafe { ::core::mem::transmute(cwr) }; -cwr as u64 -}); -__bindgen_bitfield_unit -} -} -impl tcp_info { -#[inline] -pub fn tcpi_snd_wscale(&self) -> __u8 { -unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 4u8) as u8) } -} -#[inline] -pub fn set_tcpi_snd_wscale(&mut self, val: __u8) { -unsafe { -let val: u8 = ::core::mem::transmute(val); -self._bitfield_1.set(0usize, 4u8, val as u64) -} -} -#[inline] -pub fn tcpi_rcv_wscale(&self) -> __u8 { -unsafe { ::core::mem::transmute(self._bitfield_1.get(4usize, 4u8) as u8) } -} -#[inline] -pub fn set_tcpi_rcv_wscale(&mut self, val: __u8) { -unsafe { -let val: u8 = ::core::mem::transmute(val); -self._bitfield_1.set(4usize, 4u8, val as u64) -} -} -#[inline] -pub fn tcpi_delivery_rate_app_limited(&self) -> __u8 { -unsafe { ::core::mem::transmute(self._bitfield_1.get(8usize, 1u8) as u8) } -} -#[inline] -pub fn set_tcpi_delivery_rate_app_limited(&mut self, val: __u8) { -unsafe { -let val: u8 = ::core::mem::transmute(val); -self._bitfield_1.set(8usize, 1u8, val as u64) -} -} -#[inline] -pub fn tcpi_fastopen_client_fail(&self) -> __u8 { -unsafe { ::core::mem::transmute(self._bitfield_1.get(9usize, 2u8) as u8) } -} -#[inline] -pub fn set_tcpi_fastopen_client_fail(&mut self, val: __u8) { -unsafe { -let val: u8 = ::core::mem::transmute(val); -self._bitfield_1.set(9usize, 2u8, val as u64) -} -} -#[inline] -pub fn new_bitfield_1(tcpi_snd_wscale: __u8, tcpi_rcv_wscale: __u8, tcpi_delivery_rate_app_limited: __u8, tcpi_fastopen_client_fail: __u8) -> __BindgenBitfieldUnit<[u8; 2usize]> { -let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 2usize]> = Default::default(); -__bindgen_bitfield_unit.set(0usize, 4u8, { -let tcpi_snd_wscale: u8 = unsafe { ::core::mem::transmute(tcpi_snd_wscale) }; -tcpi_snd_wscale as u64 -}); -__bindgen_bitfield_unit.set(4usize, 4u8, { -let tcpi_rcv_wscale: u8 = unsafe { ::core::mem::transmute(tcpi_rcv_wscale) }; -tcpi_rcv_wscale as u64 -}); -__bindgen_bitfield_unit.set(8usize, 1u8, { -let tcpi_delivery_rate_app_limited: u8 = unsafe { ::core::mem::transmute(tcpi_delivery_rate_app_limited) }; -tcpi_delivery_rate_app_limited as u64 -}); -__bindgen_bitfield_unit.set(9usize, 2u8, { -let tcpi_fastopen_client_fail: u8 = unsafe { ::core::mem::transmute(tcpi_fastopen_client_fail) }; -tcpi_fastopen_client_fail as u64 -}); -__bindgen_bitfield_unit -} -} -impl nf_inet_hooks { -pub const NF_INET_INGRESS: nf_inet_hooks = nf_inet_hooks::NF_INET_NUMHOOKS; -} -impl nf_ip_hook_priorities { -pub const NF_IP_PRI_LAST: nf_ip_hook_priorities = nf_ip_hook_priorities::NF_IP_PRI_CONNTRACK_CONFIRM; -} diff -Nru temporalio-1.3.0/vendor/linux-raw-sys/src/csky/prctl.rs temporalio-1.3.0/vendor/linux-raw-sys/src/csky/prctl.rs --- temporalio-1.3.0/vendor/linux-raw-sys/src/csky/prctl.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/linux-raw-sys/src/csky/prctl.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,221 +0,0 @@ -/* automatically generated by rust-bindgen 0.66.1 */ - -pub type __s8 = crate::ctypes::c_schar; -pub type __u8 = crate::ctypes::c_uchar; -pub type __s16 = crate::ctypes::c_short; -pub type __u16 = crate::ctypes::c_ushort; -pub type __s32 = crate::ctypes::c_int; -pub type __u32 = crate::ctypes::c_uint; -pub type __s64 = crate::ctypes::c_longlong; -pub type __u64 = crate::ctypes::c_ulonglong; -pub type __kernel_key_t = crate::ctypes::c_int; -pub type __kernel_mqd_t = crate::ctypes::c_int; -pub type __kernel_long_t = crate::ctypes::c_long; -pub type __kernel_ulong_t = crate::ctypes::c_ulong; -pub type __kernel_ino_t = __kernel_ulong_t; -pub type __kernel_mode_t = crate::ctypes::c_uint; -pub type __kernel_pid_t = crate::ctypes::c_int; -pub type __kernel_ipc_pid_t = crate::ctypes::c_int; -pub type __kernel_uid_t = crate::ctypes::c_uint; -pub type __kernel_gid_t = crate::ctypes::c_uint; -pub type __kernel_suseconds_t = __kernel_long_t; -pub type __kernel_daddr_t = crate::ctypes::c_int; -pub type __kernel_uid32_t = crate::ctypes::c_uint; -pub type __kernel_gid32_t = crate::ctypes::c_uint; -pub type __kernel_old_uid_t = __kernel_uid_t; -pub type __kernel_old_gid_t = __kernel_gid_t; -pub type __kernel_old_dev_t = crate::ctypes::c_uint; -pub type __kernel_size_t = crate::ctypes::c_uint; -pub type __kernel_ssize_t = crate::ctypes::c_int; -pub type __kernel_ptrdiff_t = crate::ctypes::c_int; -pub type __kernel_off_t = __kernel_long_t; -pub type __kernel_loff_t = crate::ctypes::c_longlong; -pub type __kernel_old_time_t = __kernel_long_t; -pub type __kernel_time_t = __kernel_long_t; -pub type __kernel_time64_t = crate::ctypes::c_longlong; -pub type __kernel_clock_t = __kernel_long_t; -pub type __kernel_timer_t = crate::ctypes::c_int; -pub type __kernel_clockid_t = crate::ctypes::c_int; -pub type __kernel_caddr_t = *mut crate::ctypes::c_char; -pub type __kernel_uid16_t = crate::ctypes::c_ushort; -pub type __kernel_gid16_t = crate::ctypes::c_ushort; -pub type __le16 = __u16; -pub type __be16 = __u16; -pub type __le32 = __u32; -pub type __be32 = __u32; -pub type __le64 = __u64; -pub type __be64 = __u64; -pub type __sum16 = __u16; -pub type __wsum = __u32; -pub type __poll_t = crate::ctypes::c_uint; -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct prctl_mm_map { -pub start_code: __u64, -pub end_code: __u64, -pub start_data: __u64, -pub end_data: __u64, -pub start_brk: __u64, -pub brk: __u64, -pub start_stack: __u64, -pub arg_start: __u64, -pub arg_end: __u64, -pub env_start: __u64, -pub env_end: __u64, -pub auxv: *mut __u64, -pub auxv_size: __u32, -pub exe_fd: __u32, -} -pub const PR_SET_PDEATHSIG: u32 = 1; -pub const PR_GET_PDEATHSIG: u32 = 2; -pub const PR_GET_DUMPABLE: u32 = 3; -pub const PR_SET_DUMPABLE: u32 = 4; -pub const PR_GET_UNALIGN: u32 = 5; -pub const PR_SET_UNALIGN: u32 = 6; -pub const PR_UNALIGN_NOPRINT: u32 = 1; -pub const PR_UNALIGN_SIGBUS: u32 = 2; -pub const PR_GET_KEEPCAPS: u32 = 7; -pub const PR_SET_KEEPCAPS: u32 = 8; -pub const PR_GET_FPEMU: u32 = 9; -pub const PR_SET_FPEMU: u32 = 10; -pub const PR_FPEMU_NOPRINT: u32 = 1; -pub const PR_FPEMU_SIGFPE: u32 = 2; -pub const PR_GET_FPEXC: u32 = 11; -pub const PR_SET_FPEXC: u32 = 12; -pub const PR_FP_EXC_SW_ENABLE: u32 = 128; -pub const PR_FP_EXC_DIV: u32 = 65536; -pub const PR_FP_EXC_OVF: u32 = 131072; -pub const PR_FP_EXC_UND: u32 = 262144; -pub const PR_FP_EXC_RES: u32 = 524288; -pub const PR_FP_EXC_INV: u32 = 1048576; -pub const PR_FP_EXC_DISABLED: u32 = 0; -pub const PR_FP_EXC_NONRECOV: u32 = 1; -pub const PR_FP_EXC_ASYNC: u32 = 2; -pub const PR_FP_EXC_PRECISE: u32 = 3; -pub const PR_GET_TIMING: u32 = 13; -pub const PR_SET_TIMING: u32 = 14; -pub const PR_TIMING_STATISTICAL: u32 = 0; -pub const PR_TIMING_TIMESTAMP: u32 = 1; -pub const PR_SET_NAME: u32 = 15; -pub const PR_GET_NAME: u32 = 16; -pub const PR_GET_ENDIAN: u32 = 19; -pub const PR_SET_ENDIAN: u32 = 20; -pub const PR_ENDIAN_BIG: u32 = 0; -pub const PR_ENDIAN_LITTLE: u32 = 1; -pub const PR_ENDIAN_PPC_LITTLE: u32 = 2; -pub const PR_GET_SECCOMP: u32 = 21; -pub const PR_SET_SECCOMP: u32 = 22; -pub const PR_CAPBSET_READ: u32 = 23; -pub const PR_CAPBSET_DROP: u32 = 24; -pub const PR_GET_TSC: u32 = 25; -pub const PR_SET_TSC: u32 = 26; -pub const PR_TSC_ENABLE: u32 = 1; -pub const PR_TSC_SIGSEGV: u32 = 2; -pub const PR_GET_SECUREBITS: u32 = 27; -pub const PR_SET_SECUREBITS: u32 = 28; -pub const PR_SET_TIMERSLACK: u32 = 29; -pub const PR_GET_TIMERSLACK: u32 = 30; -pub const PR_TASK_PERF_EVENTS_DISABLE: u32 = 31; -pub const PR_TASK_PERF_EVENTS_ENABLE: u32 = 32; -pub const PR_MCE_KILL: u32 = 33; -pub const PR_MCE_KILL_CLEAR: u32 = 0; -pub const PR_MCE_KILL_SET: u32 = 1; -pub const PR_MCE_KILL_LATE: u32 = 0; -pub const PR_MCE_KILL_EARLY: u32 = 1; -pub const PR_MCE_KILL_DEFAULT: u32 = 2; -pub const PR_MCE_KILL_GET: u32 = 34; -pub const PR_SET_MM: u32 = 35; -pub const PR_SET_MM_START_CODE: u32 = 1; -pub const PR_SET_MM_END_CODE: u32 = 2; -pub const PR_SET_MM_START_DATA: u32 = 3; -pub const PR_SET_MM_END_DATA: u32 = 4; -pub const PR_SET_MM_START_STACK: u32 = 5; -pub const PR_SET_MM_START_BRK: u32 = 6; -pub const PR_SET_MM_BRK: u32 = 7; -pub const PR_SET_MM_ARG_START: u32 = 8; -pub const PR_SET_MM_ARG_END: u32 = 9; -pub const PR_SET_MM_ENV_START: u32 = 10; -pub const PR_SET_MM_ENV_END: u32 = 11; -pub const PR_SET_MM_AUXV: u32 = 12; -pub const PR_SET_MM_EXE_FILE: u32 = 13; -pub const PR_SET_MM_MAP: u32 = 14; -pub const PR_SET_MM_MAP_SIZE: u32 = 15; -pub const PR_SET_PTRACER: u32 = 1499557217; -pub const PR_SET_CHILD_SUBREAPER: u32 = 36; -pub const PR_GET_CHILD_SUBREAPER: u32 = 37; -pub const PR_SET_NO_NEW_PRIVS: u32 = 38; -pub const PR_GET_NO_NEW_PRIVS: u32 = 39; -pub const PR_GET_TID_ADDRESS: u32 = 40; -pub const PR_SET_THP_DISABLE: u32 = 41; -pub const PR_GET_THP_DISABLE: u32 = 42; -pub const PR_MPX_ENABLE_MANAGEMENT: u32 = 43; -pub const PR_MPX_DISABLE_MANAGEMENT: u32 = 44; -pub const PR_SET_FP_MODE: u32 = 45; -pub const PR_GET_FP_MODE: u32 = 46; -pub const PR_FP_MODE_FR: u32 = 1; -pub const PR_FP_MODE_FRE: u32 = 2; -pub const PR_CAP_AMBIENT: u32 = 47; -pub const PR_CAP_AMBIENT_IS_SET: u32 = 1; -pub const PR_CAP_AMBIENT_RAISE: u32 = 2; -pub const PR_CAP_AMBIENT_LOWER: u32 = 3; -pub const PR_CAP_AMBIENT_CLEAR_ALL: u32 = 4; -pub const PR_SVE_SET_VL: u32 = 50; -pub const PR_SVE_SET_VL_ONEXEC: u32 = 262144; -pub const PR_SVE_GET_VL: u32 = 51; -pub const PR_SVE_VL_LEN_MASK: u32 = 65535; -pub const PR_SVE_VL_INHERIT: u32 = 131072; -pub const PR_GET_SPECULATION_CTRL: u32 = 52; -pub const PR_SET_SPECULATION_CTRL: u32 = 53; -pub const PR_SPEC_STORE_BYPASS: u32 = 0; -pub const PR_SPEC_INDIRECT_BRANCH: u32 = 1; -pub const PR_SPEC_L1D_FLUSH: u32 = 2; -pub const PR_SPEC_NOT_AFFECTED: u32 = 0; -pub const PR_SPEC_PRCTL: u32 = 1; -pub const PR_SPEC_ENABLE: u32 = 2; -pub const PR_SPEC_DISABLE: u32 = 4; -pub const PR_SPEC_FORCE_DISABLE: u32 = 8; -pub const PR_SPEC_DISABLE_NOEXEC: u32 = 16; -pub const PR_PAC_RESET_KEYS: u32 = 54; -pub const PR_PAC_APIAKEY: u32 = 1; -pub const PR_PAC_APIBKEY: u32 = 2; -pub const PR_PAC_APDAKEY: u32 = 4; -pub const PR_PAC_APDBKEY: u32 = 8; -pub const PR_PAC_APGAKEY: u32 = 16; -pub const PR_SET_TAGGED_ADDR_CTRL: u32 = 55; -pub const PR_GET_TAGGED_ADDR_CTRL: u32 = 56; -pub const PR_TAGGED_ADDR_ENABLE: u32 = 1; -pub const PR_MTE_TCF_NONE: u32 = 0; -pub const PR_MTE_TCF_SYNC: u32 = 2; -pub const PR_MTE_TCF_ASYNC: u32 = 4; -pub const PR_MTE_TCF_MASK: u32 = 6; -pub const PR_MTE_TAG_SHIFT: u32 = 3; -pub const PR_MTE_TAG_MASK: u32 = 524280; -pub const PR_MTE_TCF_SHIFT: u32 = 1; -pub const PR_SET_IO_FLUSHER: u32 = 57; -pub const PR_GET_IO_FLUSHER: u32 = 58; -pub const PR_SET_SYSCALL_USER_DISPATCH: u32 = 59; -pub const PR_SYS_DISPATCH_OFF: u32 = 0; -pub const PR_SYS_DISPATCH_ON: u32 = 1; -pub const SYSCALL_DISPATCH_FILTER_ALLOW: u32 = 0; -pub const SYSCALL_DISPATCH_FILTER_BLOCK: u32 = 1; -pub const PR_PAC_SET_ENABLED_KEYS: u32 = 60; -pub const PR_PAC_GET_ENABLED_KEYS: u32 = 61; -pub const PR_SCHED_CORE: u32 = 62; -pub const PR_SCHED_CORE_GET: u32 = 0; -pub const PR_SCHED_CORE_CREATE: u32 = 1; -pub const PR_SCHED_CORE_SHARE_TO: u32 = 2; -pub const PR_SCHED_CORE_SHARE_FROM: u32 = 3; -pub const PR_SCHED_CORE_MAX: u32 = 4; -pub const PR_SCHED_CORE_SCOPE_THREAD: u32 = 0; -pub const PR_SCHED_CORE_SCOPE_THREAD_GROUP: u32 = 1; -pub const PR_SCHED_CORE_SCOPE_PROCESS_GROUP: u32 = 2; -pub const PR_SME_SET_VL: u32 = 63; -pub const PR_SME_SET_VL_ONEXEC: u32 = 262144; -pub const PR_SME_GET_VL: u32 = 64; -pub const PR_SME_VL_LEN_MASK: u32 = 65535; -pub const PR_SME_VL_INHERIT: u32 = 131072; -pub const PR_SET_MDWE: u32 = 65; -pub const PR_MDWE_REFUSE_EXEC_GAIN: u32 = 1; -pub const PR_GET_MDWE: u32 = 66; -pub const PR_SET_VMA: u32 = 1398164801; -pub const PR_SET_VMA_ANON_NAME: u32 = 0; diff -Nru temporalio-1.3.0/vendor/linux-raw-sys/src/csky/system.rs temporalio-1.3.0/vendor/linux-raw-sys/src/csky/system.rs --- temporalio-1.3.0/vendor/linux-raw-sys/src/csky/system.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/linux-raw-sys/src/csky/system.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,99 +0,0 @@ -/* automatically generated by rust-bindgen 0.66.1 */ - -pub type __s8 = crate::ctypes::c_schar; -pub type __u8 = crate::ctypes::c_uchar; -pub type __s16 = crate::ctypes::c_short; -pub type __u16 = crate::ctypes::c_ushort; -pub type __s32 = crate::ctypes::c_int; -pub type __u32 = crate::ctypes::c_uint; -pub type __s64 = crate::ctypes::c_longlong; -pub type __u64 = crate::ctypes::c_ulonglong; -pub type __kernel_key_t = crate::ctypes::c_int; -pub type __kernel_mqd_t = crate::ctypes::c_int; -pub type __kernel_long_t = crate::ctypes::c_long; -pub type __kernel_ulong_t = crate::ctypes::c_ulong; -pub type __kernel_ino_t = __kernel_ulong_t; -pub type __kernel_mode_t = crate::ctypes::c_uint; -pub type __kernel_pid_t = crate::ctypes::c_int; -pub type __kernel_ipc_pid_t = crate::ctypes::c_int; -pub type __kernel_uid_t = crate::ctypes::c_uint; -pub type __kernel_gid_t = crate::ctypes::c_uint; -pub type __kernel_suseconds_t = __kernel_long_t; -pub type __kernel_daddr_t = crate::ctypes::c_int; -pub type __kernel_uid32_t = crate::ctypes::c_uint; -pub type __kernel_gid32_t = crate::ctypes::c_uint; -pub type __kernel_old_uid_t = __kernel_uid_t; -pub type __kernel_old_gid_t = __kernel_gid_t; -pub type __kernel_old_dev_t = crate::ctypes::c_uint; -pub type __kernel_size_t = crate::ctypes::c_uint; -pub type __kernel_ssize_t = crate::ctypes::c_int; -pub type __kernel_ptrdiff_t = crate::ctypes::c_int; -pub type __kernel_off_t = __kernel_long_t; -pub type __kernel_loff_t = crate::ctypes::c_longlong; -pub type __kernel_old_time_t = __kernel_long_t; -pub type __kernel_time_t = __kernel_long_t; -pub type __kernel_time64_t = crate::ctypes::c_longlong; -pub type __kernel_clock_t = __kernel_long_t; -pub type __kernel_timer_t = crate::ctypes::c_int; -pub type __kernel_clockid_t = crate::ctypes::c_int; -pub type __kernel_caddr_t = *mut crate::ctypes::c_char; -pub type __kernel_uid16_t = crate::ctypes::c_ushort; -pub type __kernel_gid16_t = crate::ctypes::c_ushort; -pub type __le16 = __u16; -pub type __be16 = __u16; -pub type __le32 = __u32; -pub type __be32 = __u32; -pub type __le64 = __u64; -pub type __be64 = __u64; -pub type __sum16 = __u16; -pub type __wsum = __u32; -pub type __poll_t = crate::ctypes::c_uint; -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct sysinfo { -pub uptime: __kernel_long_t, -pub loads: [__kernel_ulong_t; 3usize], -pub totalram: __kernel_ulong_t, -pub freeram: __kernel_ulong_t, -pub sharedram: __kernel_ulong_t, -pub bufferram: __kernel_ulong_t, -pub totalswap: __kernel_ulong_t, -pub freeswap: __kernel_ulong_t, -pub procs: __u16, -pub pad: __u16, -pub totalhigh: __kernel_ulong_t, -pub freehigh: __kernel_ulong_t, -pub mem_unit: __u32, -pub _f: [crate::ctypes::c_char; 8usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct oldold_utsname { -pub sysname: [crate::ctypes::c_char; 9usize], -pub nodename: [crate::ctypes::c_char; 9usize], -pub release: [crate::ctypes::c_char; 9usize], -pub version: [crate::ctypes::c_char; 9usize], -pub machine: [crate::ctypes::c_char; 9usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct old_utsname { -pub sysname: [crate::ctypes::c_char; 65usize], -pub nodename: [crate::ctypes::c_char; 65usize], -pub release: [crate::ctypes::c_char; 65usize], -pub version: [crate::ctypes::c_char; 65usize], -pub machine: [crate::ctypes::c_char; 65usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct new_utsname { -pub sysname: [crate::ctypes::c_char; 65usize], -pub nodename: [crate::ctypes::c_char; 65usize], -pub release: [crate::ctypes::c_char; 65usize], -pub version: [crate::ctypes::c_char; 65usize], -pub machine: [crate::ctypes::c_char; 65usize], -pub domainname: [crate::ctypes::c_char; 65usize], -} -pub const SI_LOAD_SHIFT: u32 = 16; -pub const __OLD_UTS_LEN: u32 = 8; -pub const __NEW_UTS_LEN: u32 = 64; diff -Nru temporalio-1.3.0/vendor/linux-raw-sys/src/elf.rs temporalio-1.3.0/vendor/linux-raw-sys/src/elf.rs --- temporalio-1.3.0/vendor/linux-raw-sys/src/elf.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/linux-raw-sys/src/elf.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,287 +0,0 @@ -//! The ELF ABI. 🧠- -pub const SELFMAG: usize = 4; -pub const ELFMAG: [u8; SELFMAG] = [0x7f, b'E', b'L', b'F']; -pub const EI_CLASS: usize = 4; -pub const EI_DATA: usize = 5; -pub const EI_VERSION: usize = 6; -pub const EI_OSABI: usize = 7; -pub const EI_ABIVERSION: usize = 8; -pub const EV_CURRENT: u8 = 1; -#[cfg(target_pointer_width = "32")] -pub const ELFCLASS: u8 = 1; // ELFCLASS32 -#[cfg(target_pointer_width = "64")] -pub const ELFCLASS: u8 = 2; // ELFCLASS64 -#[cfg(target_endian = "little")] -pub const ELFDATA: u8 = 1; // ELFDATA2LSB -#[cfg(target_endian = "big")] -pub const ELFDATA: u8 = 2; // ELFDATA2MSB -pub const ELFOSABI_SYSV: u8 = 0; -pub const ELFOSABI_LINUX: u8 = 3; -// At present all of our supported platforms use 0. -pub const ELFABIVERSION: u8 = 0; -pub const ET_DYN: u16 = 3; -pub const EI_NIDENT: usize = 16; -pub const SHN_UNDEF: u16 = 0; -pub const SHN_ABS: u16 = 0xfff1; -pub const PN_XNUM: u16 = 0xffff; -pub const PT_LOAD: u32 = 1; -pub const PT_DYNAMIC: u32 = 2; -pub const PT_INTERP: u32 = 3; -pub const PT_PHDR: u32 = 6; -pub const PT_TLS: u32 = 7; -pub const PT_GNU_STACK: u32 = 0x6474_e551; -pub const PT_GNU_RELRO: u32 = 0x6474_e552; -pub const PF_X: u32 = 1; -pub const PF_W: u32 = 2; -pub const PF_R: u32 = 4; -pub const DT_NULL: usize = 0; -pub const DT_HASH: usize = 4; -pub const DT_STRTAB: usize = 5; -pub const DT_SYMTAB: usize = 6; -pub const DT_RELA: usize = 7; -pub const DT_RELASZ: usize = 8; -pub const DT_RELAENT: usize = 9; -pub const DT_REL: usize = 17; -pub const DT_RELSZ: usize = 18; -pub const DT_RELENT: usize = 19; -pub const DT_SYMENT: usize = 11; -pub const DT_VERSYM: usize = 0x6fff_fff0; -pub const DT_VERDEF: usize = 0x6fff_fffc; -pub const STB_WEAK: u8 = 2; -pub const STB_GLOBAL: u8 = 1; -pub const STT_NOTYPE: u8 = 0; -pub const STT_FUNC: u8 = 2; -pub const STN_UNDEF: u32 = 0; -pub const VER_FLG_BASE: u16 = 0x1; -pub const VER_DEF_CURRENT: u16 = 1; -pub const STV_DEFAULT: u8 = 0; -#[cfg(target_arch = "arm")] -pub const EM_CURRENT: u16 = 40; // EM_ARM -#[cfg(target_arch = "x86")] -pub const EM_CURRENT: u16 = 3; // EM_386 -#[cfg(target_arch = "powerpc64")] -pub const EM_CURRENT: u16 = 21; // EM_PPC64 -#[cfg(any( - target_arch = "mips", - target_arch = "mips32r6", - target_arch = "mips64", - target_arch = "mips64r6" -))] -pub const EM_CURRENT: u16 = 8; // EM_MIPS -#[cfg(target_arch = "x86_64")] -pub const EM_CURRENT: u16 = 62; // EM_X86_64 -#[cfg(target_arch = "aarch64")] -pub const EM_CURRENT: u16 = 183; // EM_AARCH64 -#[cfg(target_arch = "riscv64")] -pub const EM_CURRENT: u16 = 243; // EM_RISCV - -#[inline] -pub const fn ELF_ST_VISIBILITY(o: u8) -> u8 { - o & 0x03 -} - -#[inline] -pub const fn ELF_ST_BIND(val: u8) -> u8 { - val >> 4 -} - -#[inline] -pub const fn ELF_ST_TYPE(val: u8) -> u8 { - val & 0xf -} - -#[repr(C)] -pub struct Elf_Ehdr { - pub e_ident: [u8; EI_NIDENT], - pub e_type: u16, - pub e_machine: u16, - pub e_version: u32, - pub e_entry: usize, - pub e_phoff: usize, - pub e_shoff: usize, - pub e_flags: u32, - pub e_ehsize: u16, - pub e_phentsize: u16, - pub e_phnum: u16, - pub e_shentsize: u16, - pub e_shnum: u16, - pub e_shstrndx: u16, -} - -#[cfg(target_pointer_width = "32")] -#[repr(C)] -pub struct Elf_Phdr { - pub p_type: u32, - pub p_offset: usize, - pub p_vaddr: usize, - pub p_paddr: usize, - pub p_filesz: usize, - pub p_memsz: usize, - pub p_flags: u32, - pub p_align: usize, -} - -#[cfg(target_pointer_width = "64")] -#[repr(C)] -pub struct Elf_Phdr { - pub p_type: u32, - pub p_flags: u32, - pub p_offset: usize, - pub p_vaddr: usize, - pub p_paddr: usize, - pub p_filesz: usize, - pub p_memsz: usize, - pub p_align: usize, -} - -#[cfg(target_pointer_width = "32")] -#[repr(C)] -pub struct Elf_Sym { - pub st_name: u32, - pub st_value: usize, - pub st_size: usize, - pub st_info: u8, - pub st_other: u8, - pub st_shndx: u16, -} - -#[cfg(target_pointer_width = "64")] -#[repr(C)] -pub struct Elf_Sym { - pub st_name: u32, - pub st_info: u8, - pub st_other: u8, - pub st_shndx: u16, - pub st_value: usize, - pub st_size: usize, -} - -#[repr(C)] -pub struct Elf_Verdef { - pub vd_version: u16, - pub vd_flags: u16, - pub vd_ndx: u16, - pub vd_cnt: u16, - pub vd_hash: u32, - pub vd_aux: u32, - pub vd_next: u32, -} - -#[repr(C)] -pub struct Elf_Verdaux { - pub vda_name: u32, - pub _vda_next: u32, -} - -#[cfg(target_pointer_width = "32")] -#[repr(C)] -#[derive(Copy, Clone)] -pub struct Elf_Dyn { - pub d_tag: usize, - pub d_un: Elf_Dyn_Union, -} - -#[cfg(target_pointer_width = "32")] -#[repr(C)] -#[derive(Copy, Clone)] -pub union Elf_Dyn_Union { - pub d_val: u32, - pub d_ptr: usize, -} - -#[cfg(target_pointer_width = "64")] -#[repr(C)] -#[derive(Copy, Clone)] -pub struct Elf_Dyn { - pub d_tag: usize, - pub d_un: Elf_Dyn_Union, -} - -#[cfg(target_pointer_width = "64")] -#[repr(C)] -#[derive(Copy, Clone)] -pub union Elf_Dyn_Union { - pub d_val: u64, - pub d_ptr: usize, -} - -#[cfg(target_pointer_width = "32")] -#[repr(C)] -pub struct Elf_Rela { - pub r_offset: usize, - pub r_info: u32, - pub r_addend: usize, -} - -#[cfg(target_pointer_width = "64")] -#[repr(C)] -pub struct Elf_Rela { - pub r_offset: usize, - pub r_info: u64, - pub r_addend: usize, -} - -impl Elf_Rela { - #[inline] - pub fn type_(&self) -> u32 { - #[cfg(target_pointer_width = "32")] - { - self.r_info & 0xff - } - #[cfg(target_pointer_width = "64")] - { - (self.r_info & 0xffff_ffff) as u32 - } - } -} - -#[cfg(target_pointer_width = "32")] -#[repr(C)] -pub struct Elf_Rel { - pub r_offset: usize, - pub r_info: u32, -} - -#[cfg(target_pointer_width = "64")] -#[repr(C)] -pub struct Elf_Rel { - pub r_offset: usize, - pub r_info: u64, -} - -impl Elf_Rel { - #[inline] - pub fn type_(&self) -> u32 { - #[cfg(target_pointer_width = "32")] - { - self.r_info & 0xff - } - #[cfg(target_pointer_width = "64")] - { - (self.r_info & 0xffff_ffff) as u32 - } - } -} - -#[cfg(target_arch = "x86_64")] -pub const R_RELATIVE: u32 = 8; // `R_X86_64_RELATIVE` -#[cfg(target_arch = "x86")] -pub const R_RELATIVE: u32 = 8; // `R_386_RELATIVE` -#[cfg(target_arch = "aarch64")] -pub const R_RELATIVE: u32 = 1027; // `R_AARCH64_RELATIVE` -#[cfg(target_arch = "riscv64")] -pub const R_RELATIVE: u32 = 3; // `R_RISCV_RELATIVE` -#[cfg(target_arch = "arm")] -pub const R_RELATIVE: u32 = 23; // `R_ARM_RELATIVE` - -#[repr(C)] -#[derive(Clone)] -pub struct Elf_auxv_t { - pub a_type: usize, - - // Some of the values in the auxv array are pointers, so we make `a_val` a - // pointer, in order to preserve their provenance. For the values which are - // integers, we cast this to `usize`. - pub a_val: *mut crate::ctypes::c_void, -} diff -Nru temporalio-1.3.0/vendor/linux-raw-sys/src/lib.rs temporalio-1.3.0/vendor/linux-raw-sys/src/lib.rs --- temporalio-1.3.0/vendor/linux-raw-sys/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/linux-raw-sys/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -186,9 +186,6 @@ } } -#[cfg(feature = "elf")] -pub mod elf; - // The rest of this file is auto-generated! #[cfg(feature = "errno")] #[cfg(target_arch = "arm")] @@ -263,42 +260,6 @@ #[path = "aarch64/system.rs"] pub mod system; #[cfg(feature = "errno")] -#[cfg(target_arch = "csky")] -#[path = "csky/errno.rs"] -pub mod errno; -#[cfg(feature = "general")] -#[cfg(target_arch = "csky")] -#[path = "csky/general.rs"] -pub mod general; -#[cfg(feature = "if_ether")] -#[cfg(target_arch = "csky")] -#[path = "csky/if_ether.rs"] -pub mod if_ether; -#[cfg(feature = "io_uring")] -#[cfg(target_arch = "csky")] -#[path = "csky/io_uring.rs"] -pub mod io_uring; -#[cfg(feature = "ioctl")] -#[cfg(target_arch = "csky")] -#[path = "csky/ioctl.rs"] -pub mod ioctl; -#[cfg(feature = "net")] -#[cfg(target_arch = "csky")] -#[path = "csky/net.rs"] -pub mod net; -#[cfg(feature = "netlink")] -#[cfg(target_arch = "csky")] -#[path = "csky/netlink.rs"] -pub mod netlink; -#[cfg(feature = "prctl")] -#[cfg(target_arch = "csky")] -#[path = "csky/prctl.rs"] -pub mod prctl; -#[cfg(feature = "system")] -#[cfg(target_arch = "csky")] -#[path = "csky/system.rs"] -pub mod system; -#[cfg(feature = "errno")] #[cfg(target_arch = "loongarch64")] #[path = "loongarch64/errno.rs"] pub mod errno; diff -Nru temporalio-1.3.0/vendor/linux-raw-sys/src/loongarch64/general.rs temporalio-1.3.0/vendor/linux-raw-sys/src/loongarch64/general.rs --- temporalio-1.3.0/vendor/linux-raw-sys/src/loongarch64/general.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/linux-raw-sys/src/loongarch64/general.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1566,19 +1566,6 @@ pub const GRND_NONBLOCK: u32 = 1; pub const GRND_RANDOM: u32 = 2; pub const GRND_INSECURE: u32 = 4; -pub const LINUX_REBOOT_MAGIC1: u32 = 4276215469; -pub const LINUX_REBOOT_MAGIC2: u32 = 672274793; -pub const LINUX_REBOOT_MAGIC2A: u32 = 85072278; -pub const LINUX_REBOOT_MAGIC2B: u32 = 369367448; -pub const LINUX_REBOOT_MAGIC2C: u32 = 537993216; -pub const LINUX_REBOOT_CMD_RESTART: u32 = 19088743; -pub const LINUX_REBOOT_CMD_HALT: u32 = 3454992675; -pub const LINUX_REBOOT_CMD_CAD_ON: u32 = 2309737967; -pub const LINUX_REBOOT_CMD_CAD_OFF: u32 = 0; -pub const LINUX_REBOOT_CMD_POWER_OFF: u32 = 1126301404; -pub const LINUX_REBOOT_CMD_RESTART2: u32 = 2712847316; -pub const LINUX_REBOOT_CMD_SW_SUSPEND: u32 = 3489725666; -pub const LINUX_REBOOT_CMD_KEXEC: u32 = 1163412803; pub const ITIMER_REAL: u32 = 0; pub const ITIMER_VIRTUAL: u32 = 1; pub const ITIMER_PROF: u32 = 2; diff -Nru temporalio-1.3.0/vendor/linux-raw-sys/src/loongarch64/net.rs temporalio-1.3.0/vendor/linux-raw-sys/src/loongarch64/net.rs --- temporalio-1.3.0/vendor/linux-raw-sys/src/loongarch64/net.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/linux-raw-sys/src/loongarch64/net.rs 2023-10-30 19:40:00.000000000 +0000 @@ -476,255 +476,6 @@ } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct sync_serial_settings { -pub clock_rate: crate::ctypes::c_uint, -pub clock_type: crate::ctypes::c_uint, -pub loopback: crate::ctypes::c_ushort, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct te1_settings { -pub clock_rate: crate::ctypes::c_uint, -pub clock_type: crate::ctypes::c_uint, -pub loopback: crate::ctypes::c_ushort, -pub slot_map: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct raw_hdlc_proto { -pub encoding: crate::ctypes::c_ushort, -pub parity: crate::ctypes::c_ushort, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fr_proto { -pub t391: crate::ctypes::c_uint, -pub t392: crate::ctypes::c_uint, -pub n391: crate::ctypes::c_uint, -pub n392: crate::ctypes::c_uint, -pub n393: crate::ctypes::c_uint, -pub lmi: crate::ctypes::c_ushort, -pub dce: crate::ctypes::c_ushort, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fr_proto_pvc { -pub dlci: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fr_proto_pvc_info { -pub dlci: crate::ctypes::c_uint, -pub master: [crate::ctypes::c_char; 16usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct cisco_proto { -pub interval: crate::ctypes::c_uint, -pub timeout: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct x25_hdlc_proto { -pub dce: crate::ctypes::c_ushort, -pub modulo: crate::ctypes::c_uint, -pub window: crate::ctypes::c_uint, -pub t1: crate::ctypes::c_uint, -pub t2: crate::ctypes::c_uint, -pub n2: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ifmap { -pub mem_start: crate::ctypes::c_ulong, -pub mem_end: crate::ctypes::c_ulong, -pub base_addr: crate::ctypes::c_ushort, -pub irq: crate::ctypes::c_uchar, -pub dma: crate::ctypes::c_uchar, -pub port: crate::ctypes::c_uchar, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct if_settings { -pub type_: crate::ctypes::c_uint, -pub size: crate::ctypes::c_uint, -pub ifs_ifsu: if_settings__bindgen_ty_1, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ifreq { -pub ifr_ifrn: ifreq__bindgen_ty_1, -pub ifr_ifru: ifreq__bindgen_ty_2, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ifconf { -pub ifc_len: crate::ctypes::c_int, -pub ifc_ifcu: ifconf__bindgen_ty_1, -} -#[repr(C)] -pub struct xt_entry_match { -pub u: xt_entry_match__bindgen_ty_1, -pub data: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_match__bindgen_ty_1__bindgen_ty_1 { -pub match_size: __u16, -pub name: [crate::ctypes::c_char; 29usize], -pub revision: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_match__bindgen_ty_1__bindgen_ty_2 { -pub match_size: __u16, -pub match_: *mut xt_match, -} -#[repr(C)] -pub struct xt_entry_target { -pub u: xt_entry_target__bindgen_ty_1, -pub data: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_target__bindgen_ty_1__bindgen_ty_1 { -pub target_size: __u16, -pub name: [crate::ctypes::c_char; 29usize], -pub revision: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_target__bindgen_ty_1__bindgen_ty_2 { -pub target_size: __u16, -pub target: *mut xt_target, -} -#[repr(C)] -pub struct xt_standard_target { -pub target: xt_entry_target, -pub verdict: crate::ctypes::c_int, -} -#[repr(C)] -pub struct xt_error_target { -pub target: xt_entry_target, -pub errorname: [crate::ctypes::c_char; 30usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_get_revision { -pub name: [crate::ctypes::c_char; 29usize], -pub revision: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct _xt_align { -pub u8_: __u8, -pub u16_: __u16, -pub u32_: __u32, -pub u64_: __u64, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_counters { -pub pcnt: __u64, -pub bcnt: __u64, -} -#[repr(C)] -#[derive(Debug)] -pub struct xt_counters_info { -pub name: [crate::ctypes::c_char; 32usize], -pub num_counters: crate::ctypes::c_uint, -pub counters: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_tcp { -pub spts: [__u16; 2usize], -pub dpts: [__u16; 2usize], -pub option: __u8, -pub flg_mask: __u8, -pub flg_cmp: __u8, -pub invflags: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_udp { -pub spts: [__u16; 2usize], -pub dpts: [__u16; 2usize], -pub invflags: __u8, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ip6t_ip6 { -pub src: in6_addr, -pub dst: in6_addr, -pub smsk: in6_addr, -pub dmsk: in6_addr, -pub iniface: [crate::ctypes::c_char; 16usize], -pub outiface: [crate::ctypes::c_char; 16usize], -pub iniface_mask: [crate::ctypes::c_uchar; 16usize], -pub outiface_mask: [crate::ctypes::c_uchar; 16usize], -pub proto: __u16, -pub tos: __u8, -pub flags: __u8, -pub invflags: __u8, -} -#[repr(C)] -pub struct ip6t_entry { -pub ipv6: ip6t_ip6, -pub nfcache: crate::ctypes::c_uint, -pub target_offset: __u16, -pub next_offset: __u16, -pub comefrom: crate::ctypes::c_uint, -pub counters: xt_counters, -pub elems: __IncompleteArrayField, -} -#[repr(C)] -pub struct ip6t_standard { -pub entry: ip6t_entry, -pub target: xt_standard_target, -} -#[repr(C)] -pub struct ip6t_error { -pub entry: ip6t_entry, -pub target: xt_error_target, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ip6t_icmp { -pub type_: __u8, -pub code: [__u8; 2usize], -pub invflags: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ip6t_getinfo { -pub name: [crate::ctypes::c_char; 32usize], -pub valid_hooks: crate::ctypes::c_uint, -pub hook_entry: [crate::ctypes::c_uint; 5usize], -pub underflow: [crate::ctypes::c_uint; 5usize], -pub num_entries: crate::ctypes::c_uint, -pub size: crate::ctypes::c_uint, -} -#[repr(C)] -pub struct ip6t_replace { -pub name: [crate::ctypes::c_char; 32usize], -pub valid_hooks: crate::ctypes::c_uint, -pub num_entries: crate::ctypes::c_uint, -pub size: crate::ctypes::c_uint, -pub hook_entry: [crate::ctypes::c_uint; 5usize], -pub underflow: [crate::ctypes::c_uint; 5usize], -pub num_counters: crate::ctypes::c_uint, -pub counters: *mut xt_counters, -pub entries: __IncompleteArrayField, -} -#[repr(C)] -pub struct ip6t_get_entries { -pub name: [crate::ctypes::c_char; 32usize], -pub size: crate::ctypes::c_uint, -pub entrytable: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] pub struct linger { pub l_onoff: crate::ctypes::c_int, pub l_linger: crate::ctypes::c_int, @@ -762,16 +513,6 @@ } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct xt_match { -pub _address: u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_target { -pub _address: u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] pub struct iovec { pub _address: u8, } @@ -1194,135 +935,6 @@ pub const TCP_MD5SIG_FLAG_IFINDEX: u32 = 2; pub const TCP_RECEIVE_ZEROCOPY_FLAG_TLB_CLEAN_HINT: u32 = 1; pub const UNIX_PATH_MAX: u32 = 108; -pub const IFNAMSIZ: u32 = 16; -pub const IFALIASZ: u32 = 256; -pub const ALTIFNAMSIZ: u32 = 128; -pub const GENERIC_HDLC_VERSION: u32 = 4; -pub const CLOCK_DEFAULT: u32 = 0; -pub const CLOCK_EXT: u32 = 1; -pub const CLOCK_INT: u32 = 2; -pub const CLOCK_TXINT: u32 = 3; -pub const CLOCK_TXFROMRX: u32 = 4; -pub const ENCODING_DEFAULT: u32 = 0; -pub const ENCODING_NRZ: u32 = 1; -pub const ENCODING_NRZI: u32 = 2; -pub const ENCODING_FM_MARK: u32 = 3; -pub const ENCODING_FM_SPACE: u32 = 4; -pub const ENCODING_MANCHESTER: u32 = 5; -pub const PARITY_DEFAULT: u32 = 0; -pub const PARITY_NONE: u32 = 1; -pub const PARITY_CRC16_PR0: u32 = 2; -pub const PARITY_CRC16_PR1: u32 = 3; -pub const PARITY_CRC16_PR0_CCITT: u32 = 4; -pub const PARITY_CRC16_PR1_CCITT: u32 = 5; -pub const PARITY_CRC32_PR0_CCITT: u32 = 6; -pub const PARITY_CRC32_PR1_CCITT: u32 = 7; -pub const LMI_DEFAULT: u32 = 0; -pub const LMI_NONE: u32 = 1; -pub const LMI_ANSI: u32 = 2; -pub const LMI_CCITT: u32 = 3; -pub const LMI_CISCO: u32 = 4; -pub const IF_GET_IFACE: u32 = 1; -pub const IF_GET_PROTO: u32 = 2; -pub const IF_IFACE_V35: u32 = 4096; -pub const IF_IFACE_V24: u32 = 4097; -pub const IF_IFACE_X21: u32 = 4098; -pub const IF_IFACE_T1: u32 = 4099; -pub const IF_IFACE_E1: u32 = 4100; -pub const IF_IFACE_SYNC_SERIAL: u32 = 4101; -pub const IF_IFACE_X21D: u32 = 4102; -pub const IF_PROTO_HDLC: u32 = 8192; -pub const IF_PROTO_PPP: u32 = 8193; -pub const IF_PROTO_CISCO: u32 = 8194; -pub const IF_PROTO_FR: u32 = 8195; -pub const IF_PROTO_FR_ADD_PVC: u32 = 8196; -pub const IF_PROTO_FR_DEL_PVC: u32 = 8197; -pub const IF_PROTO_X25: u32 = 8198; -pub const IF_PROTO_HDLC_ETH: u32 = 8199; -pub const IF_PROTO_FR_ADD_ETH_PVC: u32 = 8200; -pub const IF_PROTO_FR_DEL_ETH_PVC: u32 = 8201; -pub const IF_PROTO_FR_PVC: u32 = 8202; -pub const IF_PROTO_FR_ETH_PVC: u32 = 8203; -pub const IF_PROTO_RAW: u32 = 8204; -pub const IFHWADDRLEN: u32 = 6; -pub const NF_DROP: u32 = 0; -pub const NF_ACCEPT: u32 = 1; -pub const NF_STOLEN: u32 = 2; -pub const NF_QUEUE: u32 = 3; -pub const NF_REPEAT: u32 = 4; -pub const NF_STOP: u32 = 5; -pub const NF_MAX_VERDICT: u32 = 5; -pub const NF_VERDICT_MASK: u32 = 255; -pub const NF_VERDICT_FLAG_QUEUE_BYPASS: u32 = 32768; -pub const NF_VERDICT_QMASK: u32 = 4294901760; -pub const NF_VERDICT_QBITS: u32 = 16; -pub const NF_VERDICT_BITS: u32 = 16; -pub const NF_IP6_PRE_ROUTING: u32 = 0; -pub const NF_IP6_LOCAL_IN: u32 = 1; -pub const NF_IP6_FORWARD: u32 = 2; -pub const NF_IP6_LOCAL_OUT: u32 = 3; -pub const NF_IP6_POST_ROUTING: u32 = 4; -pub const NF_IP6_NUMHOOKS: u32 = 5; -pub const XT_FUNCTION_MAXNAMELEN: u32 = 30; -pub const XT_EXTENSION_MAXNAMELEN: u32 = 29; -pub const XT_TABLE_MAXNAMELEN: u32 = 32; -pub const XT_CONTINUE: u32 = 4294967295; -pub const XT_RETURN: i32 = -5; -pub const XT_STANDARD_TARGET: &[u8; 1] = b"\0"; -pub const XT_ERROR_TARGET: &[u8; 6] = b"ERROR\0"; -pub const XT_INV_PROTO: u32 = 64; -pub const IP6T_FUNCTION_MAXNAMELEN: u32 = 30; -pub const IP6T_TABLE_MAXNAMELEN: u32 = 32; -pub const IP6T_CONTINUE: u32 = 4294967295; -pub const IP6T_RETURN: i32 = -5; -pub const XT_TCP_INV_SRCPT: u32 = 1; -pub const XT_TCP_INV_DSTPT: u32 = 2; -pub const XT_TCP_INV_FLAGS: u32 = 4; -pub const XT_TCP_INV_OPTION: u32 = 8; -pub const XT_TCP_INV_MASK: u32 = 15; -pub const XT_UDP_INV_SRCPT: u32 = 1; -pub const XT_UDP_INV_DSTPT: u32 = 2; -pub const XT_UDP_INV_MASK: u32 = 3; -pub const IP6T_TCP_INV_SRCPT: u32 = 1; -pub const IP6T_TCP_INV_DSTPT: u32 = 2; -pub const IP6T_TCP_INV_FLAGS: u32 = 4; -pub const IP6T_TCP_INV_OPTION: u32 = 8; -pub const IP6T_TCP_INV_MASK: u32 = 15; -pub const IP6T_UDP_INV_SRCPT: u32 = 1; -pub const IP6T_UDP_INV_DSTPT: u32 = 2; -pub const IP6T_UDP_INV_MASK: u32 = 3; -pub const IP6T_STANDARD_TARGET: &[u8; 1] = b"\0"; -pub const IP6T_ERROR_TARGET: &[u8; 6] = b"ERROR\0"; -pub const IP6T_F_PROTO: u32 = 1; -pub const IP6T_F_TOS: u32 = 2; -pub const IP6T_F_GOTO: u32 = 4; -pub const IP6T_F_MASK: u32 = 7; -pub const IP6T_INV_VIA_IN: u32 = 1; -pub const IP6T_INV_VIA_OUT: u32 = 2; -pub const IP6T_INV_TOS: u32 = 4; -pub const IP6T_INV_SRCIP: u32 = 8; -pub const IP6T_INV_DSTIP: u32 = 16; -pub const IP6T_INV_FRAG: u32 = 32; -pub const IP6T_INV_PROTO: u32 = 64; -pub const IP6T_INV_MASK: u32 = 127; -pub const IP6T_BASE_CTL: u32 = 64; -pub const IP6T_SO_SET_REPLACE: u32 = 64; -pub const IP6T_SO_SET_ADD_COUNTERS: u32 = 65; -pub const IP6T_SO_SET_MAX: u32 = 65; -pub const IP6T_SO_GET_INFO: u32 = 64; -pub const IP6T_SO_GET_ENTRIES: u32 = 65; -pub const IP6T_SO_GET_REVISION_MATCH: u32 = 68; -pub const IP6T_SO_GET_REVISION_TARGET: u32 = 69; -pub const IP6T_SO_GET_MAX: u32 = 69; -pub const IP6T_SO_ORIGINAL_DST: u32 = 80; -pub const IP6T_ICMP_INV: u32 = 1; -pub const NF_IP_PRE_ROUTING: u32 = 0; -pub const NF_IP_LOCAL_IN: u32 = 1; -pub const NF_IP_FORWARD: u32 = 2; -pub const NF_IP_LOCAL_OUT: u32 = 3; -pub const NF_IP_POST_ROUTING: u32 = 4; -pub const NF_IP_NUMHOOKS: u32 = 5; -pub const SO_ORIGINAL_DST: u32 = 80; pub const SHUT_RD: u32 = 0; pub const SHUT_WR: u32 = 1; pub const SHUT_RDWR: u32 = 2; @@ -1551,25 +1163,6 @@ pub const TCP_NLA_EDT: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_EDT; pub const TCP_NLA_TTL: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_TTL; pub const TCP_NLA_REHASH: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_REHASH; -pub const IF_OPER_UNKNOWN: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_UNKNOWN; -pub const IF_OPER_NOTPRESENT: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_NOTPRESENT; -pub const IF_OPER_DOWN: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_DOWN; -pub const IF_OPER_LOWERLAYERDOWN: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_LOWERLAYERDOWN; -pub const IF_OPER_TESTING: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_TESTING; -pub const IF_OPER_DORMANT: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_DORMANT; -pub const IF_OPER_UP: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_UP; -pub const IF_LINK_MODE_DEFAULT: _bindgen_ty_8 = _bindgen_ty_8::IF_LINK_MODE_DEFAULT; -pub const IF_LINK_MODE_DORMANT: _bindgen_ty_8 = _bindgen_ty_8::IF_LINK_MODE_DORMANT; -pub const IF_LINK_MODE_TESTING: _bindgen_ty_8 = _bindgen_ty_8::IF_LINK_MODE_TESTING; -pub const NFPROTO_UNSPEC: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_UNSPEC; -pub const NFPROTO_INET: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_INET; -pub const NFPROTO_IPV4: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_IPV4; -pub const NFPROTO_ARP: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_ARP; -pub const NFPROTO_NETDEV: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_NETDEV; -pub const NFPROTO_BRIDGE: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_BRIDGE; -pub const NFPROTO_IPV6: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_IPV6; -pub const NFPROTO_DECNET: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_DECNET; -pub const NFPROTO_NUMPROTO: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_NUMPROTO; #[repr(u32)] #[non_exhaustive] #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] @@ -1793,121 +1386,6 @@ TCP_NLA_TTL = 26, TCP_NLA_REHASH = 27, } -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum net_device_flags { -IFF_UP = 1, -IFF_BROADCAST = 2, -IFF_DEBUG = 4, -IFF_LOOPBACK = 8, -IFF_POINTOPOINT = 16, -IFF_NOTRAILERS = 32, -IFF_RUNNING = 64, -IFF_NOARP = 128, -IFF_PROMISC = 256, -IFF_ALLMULTI = 512, -IFF_MASTER = 1024, -IFF_SLAVE = 2048, -IFF_MULTICAST = 4096, -IFF_PORTSEL = 8192, -IFF_AUTOMEDIA = 16384, -IFF_DYNAMIC = 32768, -IFF_LOWER_UP = 65536, -IFF_DORMANT = 131072, -IFF_ECHO = 262144, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_7 { -IF_OPER_UNKNOWN = 0, -IF_OPER_NOTPRESENT = 1, -IF_OPER_DOWN = 2, -IF_OPER_LOWERLAYERDOWN = 3, -IF_OPER_TESTING = 4, -IF_OPER_DORMANT = 5, -IF_OPER_UP = 6, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_8 { -IF_LINK_MODE_DEFAULT = 0, -IF_LINK_MODE_DORMANT = 1, -IF_LINK_MODE_TESTING = 2, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_inet_hooks { -NF_INET_PRE_ROUTING = 0, -NF_INET_LOCAL_IN = 1, -NF_INET_FORWARD = 2, -NF_INET_LOCAL_OUT = 3, -NF_INET_POST_ROUTING = 4, -NF_INET_NUMHOOKS = 5, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_dev_hooks { -NF_NETDEV_INGRESS = 0, -NF_NETDEV_EGRESS = 1, -NF_NETDEV_NUMHOOKS = 2, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_9 { -NFPROTO_UNSPEC = 0, -NFPROTO_INET = 1, -NFPROTO_IPV4 = 2, -NFPROTO_ARP = 3, -NFPROTO_NETDEV = 5, -NFPROTO_BRIDGE = 7, -NFPROTO_IPV6 = 10, -NFPROTO_DECNET = 12, -NFPROTO_NUMPROTO = 13, -} -#[repr(i32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_ip6_hook_priorities { -NF_IP6_PRI_FIRST = -2147483648, -NF_IP6_PRI_RAW_BEFORE_DEFRAG = -450, -NF_IP6_PRI_CONNTRACK_DEFRAG = -400, -NF_IP6_PRI_RAW = -300, -NF_IP6_PRI_SELINUX_FIRST = -225, -NF_IP6_PRI_CONNTRACK = -200, -NF_IP6_PRI_MANGLE = -150, -NF_IP6_PRI_NAT_DST = -100, -NF_IP6_PRI_FILTER = 0, -NF_IP6_PRI_SECURITY = 50, -NF_IP6_PRI_NAT_SRC = 100, -NF_IP6_PRI_SELINUX_LAST = 225, -NF_IP6_PRI_CONNTRACK_HELPER = 300, -NF_IP6_PRI_LAST = 2147483647, -} -#[repr(i32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_ip_hook_priorities { -NF_IP_PRI_FIRST = -2147483648, -NF_IP_PRI_RAW_BEFORE_DEFRAG = -450, -NF_IP_PRI_CONNTRACK_DEFRAG = -400, -NF_IP_PRI_RAW = -300, -NF_IP_PRI_SELINUX_FIRST = -225, -NF_IP_PRI_CONNTRACK = -200, -NF_IP_PRI_MANGLE = -150, -NF_IP_PRI_NAT_DST = -100, -NF_IP_PRI_FILTER = 0, -NF_IP_PRI_SECURITY = 50, -NF_IP_PRI_NAT_SRC = 100, -NF_IP_PRI_SELINUX_LAST = 225, -NF_IP_PRI_CONNTRACK_HELPER = 300, -NF_IP_PRI_CONNTRACK_CONFIRM = 2147483647, -} #[repr(C)] #[derive(Copy, Clone)] pub union __kernel_sockaddr_storage__bindgen_ty_1 { @@ -1939,69 +1417,6 @@ pub hdr: tcphdr, pub words: [__be32; 5usize], } -#[repr(C)] -#[derive(Copy, Clone)] -pub union if_settings__bindgen_ty_1 { -pub raw_hdlc: *mut raw_hdlc_proto, -pub cisco: *mut cisco_proto, -pub fr: *mut fr_proto, -pub fr_pvc: *mut fr_proto_pvc, -pub fr_pvc_info: *mut fr_proto_pvc_info, -pub x25: *mut x25_hdlc_proto, -pub sync: *mut sync_serial_settings, -pub te1: *mut te1_settings, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ifreq__bindgen_ty_1 { -pub ifrn_name: [crate::ctypes::c_char; 16usize], -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ifreq__bindgen_ty_2 { -pub ifru_addr: sockaddr, -pub ifru_dstaddr: sockaddr, -pub ifru_broadaddr: sockaddr, -pub ifru_netmask: sockaddr, -pub ifru_hwaddr: sockaddr, -pub ifru_flags: crate::ctypes::c_short, -pub ifru_ivalue: crate::ctypes::c_int, -pub ifru_mtu: crate::ctypes::c_int, -pub ifru_map: ifmap, -pub ifru_slave: [crate::ctypes::c_char; 16usize], -pub ifru_newname: [crate::ctypes::c_char; 16usize], -pub ifru_data: *mut crate::ctypes::c_void, -pub ifru_settings: if_settings, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ifconf__bindgen_ty_1 { -pub ifcu_buf: *mut crate::ctypes::c_char, -pub ifcu_req: *mut ifreq, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union nf_inet_addr { -pub all: [__u32; 4usize], -pub ip: __be32, -pub ip6: [__be32; 4usize], -pub in_: in_addr, -pub in6: in6_addr, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union xt_entry_match__bindgen_ty_1 { -pub user: xt_entry_match__bindgen_ty_1__bindgen_ty_1, -pub kernel: xt_entry_match__bindgen_ty_1__bindgen_ty_2, -pub match_size: __u16, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union xt_entry_target__bindgen_ty_1 { -pub user: xt_entry_target__bindgen_ty_1__bindgen_ty_1, -pub kernel: xt_entry_target__bindgen_ty_1__bindgen_ty_2, -pub target_size: __u16, -} impl __BindgenBitfieldUnit { #[inline] pub const fn new(storage: Storage) -> Self { @@ -2427,9 +1842,3 @@ __bindgen_bitfield_unit } } -impl nf_inet_hooks { -pub const NF_INET_INGRESS: nf_inet_hooks = nf_inet_hooks::NF_INET_NUMHOOKS; -} -impl nf_ip_hook_priorities { -pub const NF_IP_PRI_LAST: nf_ip_hook_priorities = nf_ip_hook_priorities::NF_IP_PRI_CONNTRACK_CONFIRM; -} diff -Nru temporalio-1.3.0/vendor/linux-raw-sys/src/mips/general.rs temporalio-1.3.0/vendor/linux-raw-sys/src/mips/general.rs --- temporalio-1.3.0/vendor/linux-raw-sys/src/mips/general.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/linux-raw-sys/src/mips/general.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1619,19 +1619,6 @@ pub const GRND_NONBLOCK: u32 = 1; pub const GRND_RANDOM: u32 = 2; pub const GRND_INSECURE: u32 = 4; -pub const LINUX_REBOOT_MAGIC1: u32 = 4276215469; -pub const LINUX_REBOOT_MAGIC2: u32 = 672274793; -pub const LINUX_REBOOT_MAGIC2A: u32 = 85072278; -pub const LINUX_REBOOT_MAGIC2B: u32 = 369367448; -pub const LINUX_REBOOT_MAGIC2C: u32 = 537993216; -pub const LINUX_REBOOT_CMD_RESTART: u32 = 19088743; -pub const LINUX_REBOOT_CMD_HALT: u32 = 3454992675; -pub const LINUX_REBOOT_CMD_CAD_ON: u32 = 2309737967; -pub const LINUX_REBOOT_CMD_CAD_OFF: u32 = 0; -pub const LINUX_REBOOT_CMD_POWER_OFF: u32 = 1126301404; -pub const LINUX_REBOOT_CMD_RESTART2: u32 = 2712847316; -pub const LINUX_REBOOT_CMD_SW_SUSPEND: u32 = 3489725666; -pub const LINUX_REBOOT_CMD_KEXEC: u32 = 1163412803; pub const ITIMER_REAL: u32 = 0; pub const ITIMER_VIRTUAL: u32 = 1; pub const ITIMER_PROF: u32 = 2; diff -Nru temporalio-1.3.0/vendor/linux-raw-sys/src/mips/net.rs temporalio-1.3.0/vendor/linux-raw-sys/src/mips/net.rs --- temporalio-1.3.0/vendor/linux-raw-sys/src/mips/net.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/linux-raw-sys/src/mips/net.rs 2023-10-30 19:40:00.000000000 +0000 @@ -476,255 +476,6 @@ } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct sync_serial_settings { -pub clock_rate: crate::ctypes::c_uint, -pub clock_type: crate::ctypes::c_uint, -pub loopback: crate::ctypes::c_ushort, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct te1_settings { -pub clock_rate: crate::ctypes::c_uint, -pub clock_type: crate::ctypes::c_uint, -pub loopback: crate::ctypes::c_ushort, -pub slot_map: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct raw_hdlc_proto { -pub encoding: crate::ctypes::c_ushort, -pub parity: crate::ctypes::c_ushort, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fr_proto { -pub t391: crate::ctypes::c_uint, -pub t392: crate::ctypes::c_uint, -pub n391: crate::ctypes::c_uint, -pub n392: crate::ctypes::c_uint, -pub n393: crate::ctypes::c_uint, -pub lmi: crate::ctypes::c_ushort, -pub dce: crate::ctypes::c_ushort, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fr_proto_pvc { -pub dlci: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fr_proto_pvc_info { -pub dlci: crate::ctypes::c_uint, -pub master: [crate::ctypes::c_char; 16usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct cisco_proto { -pub interval: crate::ctypes::c_uint, -pub timeout: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct x25_hdlc_proto { -pub dce: crate::ctypes::c_ushort, -pub modulo: crate::ctypes::c_uint, -pub window: crate::ctypes::c_uint, -pub t1: crate::ctypes::c_uint, -pub t2: crate::ctypes::c_uint, -pub n2: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ifmap { -pub mem_start: crate::ctypes::c_ulong, -pub mem_end: crate::ctypes::c_ulong, -pub base_addr: crate::ctypes::c_ushort, -pub irq: crate::ctypes::c_uchar, -pub dma: crate::ctypes::c_uchar, -pub port: crate::ctypes::c_uchar, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct if_settings { -pub type_: crate::ctypes::c_uint, -pub size: crate::ctypes::c_uint, -pub ifs_ifsu: if_settings__bindgen_ty_1, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ifreq { -pub ifr_ifrn: ifreq__bindgen_ty_1, -pub ifr_ifru: ifreq__bindgen_ty_2, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ifconf { -pub ifc_len: crate::ctypes::c_int, -pub ifc_ifcu: ifconf__bindgen_ty_1, -} -#[repr(C)] -pub struct xt_entry_match { -pub u: xt_entry_match__bindgen_ty_1, -pub data: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_match__bindgen_ty_1__bindgen_ty_1 { -pub match_size: __u16, -pub name: [crate::ctypes::c_char; 29usize], -pub revision: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_match__bindgen_ty_1__bindgen_ty_2 { -pub match_size: __u16, -pub match_: *mut xt_match, -} -#[repr(C)] -pub struct xt_entry_target { -pub u: xt_entry_target__bindgen_ty_1, -pub data: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_target__bindgen_ty_1__bindgen_ty_1 { -pub target_size: __u16, -pub name: [crate::ctypes::c_char; 29usize], -pub revision: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_target__bindgen_ty_1__bindgen_ty_2 { -pub target_size: __u16, -pub target: *mut xt_target, -} -#[repr(C)] -pub struct xt_standard_target { -pub target: xt_entry_target, -pub verdict: crate::ctypes::c_int, -} -#[repr(C)] -pub struct xt_error_target { -pub target: xt_entry_target, -pub errorname: [crate::ctypes::c_char; 30usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_get_revision { -pub name: [crate::ctypes::c_char; 29usize], -pub revision: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct _xt_align { -pub u8_: __u8, -pub u16_: __u16, -pub u32_: __u32, -pub u64_: __u64, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_counters { -pub pcnt: __u64, -pub bcnt: __u64, -} -#[repr(C)] -#[derive(Debug)] -pub struct xt_counters_info { -pub name: [crate::ctypes::c_char; 32usize], -pub num_counters: crate::ctypes::c_uint, -pub counters: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_tcp { -pub spts: [__u16; 2usize], -pub dpts: [__u16; 2usize], -pub option: __u8, -pub flg_mask: __u8, -pub flg_cmp: __u8, -pub invflags: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_udp { -pub spts: [__u16; 2usize], -pub dpts: [__u16; 2usize], -pub invflags: __u8, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ip6t_ip6 { -pub src: in6_addr, -pub dst: in6_addr, -pub smsk: in6_addr, -pub dmsk: in6_addr, -pub iniface: [crate::ctypes::c_char; 16usize], -pub outiface: [crate::ctypes::c_char; 16usize], -pub iniface_mask: [crate::ctypes::c_uchar; 16usize], -pub outiface_mask: [crate::ctypes::c_uchar; 16usize], -pub proto: __u16, -pub tos: __u8, -pub flags: __u8, -pub invflags: __u8, -} -#[repr(C)] -pub struct ip6t_entry { -pub ipv6: ip6t_ip6, -pub nfcache: crate::ctypes::c_uint, -pub target_offset: __u16, -pub next_offset: __u16, -pub comefrom: crate::ctypes::c_uint, -pub counters: xt_counters, -pub elems: __IncompleteArrayField, -} -#[repr(C)] -pub struct ip6t_standard { -pub entry: ip6t_entry, -pub target: xt_standard_target, -} -#[repr(C)] -pub struct ip6t_error { -pub entry: ip6t_entry, -pub target: xt_error_target, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ip6t_icmp { -pub type_: __u8, -pub code: [__u8; 2usize], -pub invflags: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ip6t_getinfo { -pub name: [crate::ctypes::c_char; 32usize], -pub valid_hooks: crate::ctypes::c_uint, -pub hook_entry: [crate::ctypes::c_uint; 5usize], -pub underflow: [crate::ctypes::c_uint; 5usize], -pub num_entries: crate::ctypes::c_uint, -pub size: crate::ctypes::c_uint, -} -#[repr(C)] -pub struct ip6t_replace { -pub name: [crate::ctypes::c_char; 32usize], -pub valid_hooks: crate::ctypes::c_uint, -pub num_entries: crate::ctypes::c_uint, -pub size: crate::ctypes::c_uint, -pub hook_entry: [crate::ctypes::c_uint; 5usize], -pub underflow: [crate::ctypes::c_uint; 5usize], -pub num_counters: crate::ctypes::c_uint, -pub counters: *mut xt_counters, -pub entries: __IncompleteArrayField, -} -#[repr(C)] -pub struct ip6t_get_entries { -pub name: [crate::ctypes::c_char; 32usize], -pub size: crate::ctypes::c_uint, -pub entrytable: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] pub struct linger { pub l_onoff: crate::ctypes::c_int, pub l_linger: crate::ctypes::c_int, @@ -762,16 +513,6 @@ } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct xt_match { -pub _address: u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_target { -pub _address: u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] pub struct iovec { pub _address: u8, } @@ -1217,135 +958,6 @@ pub const TCP_MD5SIG_FLAG_IFINDEX: u32 = 2; pub const TCP_RECEIVE_ZEROCOPY_FLAG_TLB_CLEAN_HINT: u32 = 1; pub const UNIX_PATH_MAX: u32 = 108; -pub const IFNAMSIZ: u32 = 16; -pub const IFALIASZ: u32 = 256; -pub const ALTIFNAMSIZ: u32 = 128; -pub const GENERIC_HDLC_VERSION: u32 = 4; -pub const CLOCK_DEFAULT: u32 = 0; -pub const CLOCK_EXT: u32 = 1; -pub const CLOCK_INT: u32 = 2; -pub const CLOCK_TXINT: u32 = 3; -pub const CLOCK_TXFROMRX: u32 = 4; -pub const ENCODING_DEFAULT: u32 = 0; -pub const ENCODING_NRZ: u32 = 1; -pub const ENCODING_NRZI: u32 = 2; -pub const ENCODING_FM_MARK: u32 = 3; -pub const ENCODING_FM_SPACE: u32 = 4; -pub const ENCODING_MANCHESTER: u32 = 5; -pub const PARITY_DEFAULT: u32 = 0; -pub const PARITY_NONE: u32 = 1; -pub const PARITY_CRC16_PR0: u32 = 2; -pub const PARITY_CRC16_PR1: u32 = 3; -pub const PARITY_CRC16_PR0_CCITT: u32 = 4; -pub const PARITY_CRC16_PR1_CCITT: u32 = 5; -pub const PARITY_CRC32_PR0_CCITT: u32 = 6; -pub const PARITY_CRC32_PR1_CCITT: u32 = 7; -pub const LMI_DEFAULT: u32 = 0; -pub const LMI_NONE: u32 = 1; -pub const LMI_ANSI: u32 = 2; -pub const LMI_CCITT: u32 = 3; -pub const LMI_CISCO: u32 = 4; -pub const IF_GET_IFACE: u32 = 1; -pub const IF_GET_PROTO: u32 = 2; -pub const IF_IFACE_V35: u32 = 4096; -pub const IF_IFACE_V24: u32 = 4097; -pub const IF_IFACE_X21: u32 = 4098; -pub const IF_IFACE_T1: u32 = 4099; -pub const IF_IFACE_E1: u32 = 4100; -pub const IF_IFACE_SYNC_SERIAL: u32 = 4101; -pub const IF_IFACE_X21D: u32 = 4102; -pub const IF_PROTO_HDLC: u32 = 8192; -pub const IF_PROTO_PPP: u32 = 8193; -pub const IF_PROTO_CISCO: u32 = 8194; -pub const IF_PROTO_FR: u32 = 8195; -pub const IF_PROTO_FR_ADD_PVC: u32 = 8196; -pub const IF_PROTO_FR_DEL_PVC: u32 = 8197; -pub const IF_PROTO_X25: u32 = 8198; -pub const IF_PROTO_HDLC_ETH: u32 = 8199; -pub const IF_PROTO_FR_ADD_ETH_PVC: u32 = 8200; -pub const IF_PROTO_FR_DEL_ETH_PVC: u32 = 8201; -pub const IF_PROTO_FR_PVC: u32 = 8202; -pub const IF_PROTO_FR_ETH_PVC: u32 = 8203; -pub const IF_PROTO_RAW: u32 = 8204; -pub const IFHWADDRLEN: u32 = 6; -pub const NF_DROP: u32 = 0; -pub const NF_ACCEPT: u32 = 1; -pub const NF_STOLEN: u32 = 2; -pub const NF_QUEUE: u32 = 3; -pub const NF_REPEAT: u32 = 4; -pub const NF_STOP: u32 = 5; -pub const NF_MAX_VERDICT: u32 = 5; -pub const NF_VERDICT_MASK: u32 = 255; -pub const NF_VERDICT_FLAG_QUEUE_BYPASS: u32 = 32768; -pub const NF_VERDICT_QMASK: u32 = 4294901760; -pub const NF_VERDICT_QBITS: u32 = 16; -pub const NF_VERDICT_BITS: u32 = 16; -pub const NF_IP6_PRE_ROUTING: u32 = 0; -pub const NF_IP6_LOCAL_IN: u32 = 1; -pub const NF_IP6_FORWARD: u32 = 2; -pub const NF_IP6_LOCAL_OUT: u32 = 3; -pub const NF_IP6_POST_ROUTING: u32 = 4; -pub const NF_IP6_NUMHOOKS: u32 = 5; -pub const XT_FUNCTION_MAXNAMELEN: u32 = 30; -pub const XT_EXTENSION_MAXNAMELEN: u32 = 29; -pub const XT_TABLE_MAXNAMELEN: u32 = 32; -pub const XT_CONTINUE: u32 = 4294967295; -pub const XT_RETURN: i32 = -5; -pub const XT_STANDARD_TARGET: &[u8; 1] = b"\0"; -pub const XT_ERROR_TARGET: &[u8; 6] = b"ERROR\0"; -pub const XT_INV_PROTO: u32 = 64; -pub const IP6T_FUNCTION_MAXNAMELEN: u32 = 30; -pub const IP6T_TABLE_MAXNAMELEN: u32 = 32; -pub const IP6T_CONTINUE: u32 = 4294967295; -pub const IP6T_RETURN: i32 = -5; -pub const XT_TCP_INV_SRCPT: u32 = 1; -pub const XT_TCP_INV_DSTPT: u32 = 2; -pub const XT_TCP_INV_FLAGS: u32 = 4; -pub const XT_TCP_INV_OPTION: u32 = 8; -pub const XT_TCP_INV_MASK: u32 = 15; -pub const XT_UDP_INV_SRCPT: u32 = 1; -pub const XT_UDP_INV_DSTPT: u32 = 2; -pub const XT_UDP_INV_MASK: u32 = 3; -pub const IP6T_TCP_INV_SRCPT: u32 = 1; -pub const IP6T_TCP_INV_DSTPT: u32 = 2; -pub const IP6T_TCP_INV_FLAGS: u32 = 4; -pub const IP6T_TCP_INV_OPTION: u32 = 8; -pub const IP6T_TCP_INV_MASK: u32 = 15; -pub const IP6T_UDP_INV_SRCPT: u32 = 1; -pub const IP6T_UDP_INV_DSTPT: u32 = 2; -pub const IP6T_UDP_INV_MASK: u32 = 3; -pub const IP6T_STANDARD_TARGET: &[u8; 1] = b"\0"; -pub const IP6T_ERROR_TARGET: &[u8; 6] = b"ERROR\0"; -pub const IP6T_F_PROTO: u32 = 1; -pub const IP6T_F_TOS: u32 = 2; -pub const IP6T_F_GOTO: u32 = 4; -pub const IP6T_F_MASK: u32 = 7; -pub const IP6T_INV_VIA_IN: u32 = 1; -pub const IP6T_INV_VIA_OUT: u32 = 2; -pub const IP6T_INV_TOS: u32 = 4; -pub const IP6T_INV_SRCIP: u32 = 8; -pub const IP6T_INV_DSTIP: u32 = 16; -pub const IP6T_INV_FRAG: u32 = 32; -pub const IP6T_INV_PROTO: u32 = 64; -pub const IP6T_INV_MASK: u32 = 127; -pub const IP6T_BASE_CTL: u32 = 64; -pub const IP6T_SO_SET_REPLACE: u32 = 64; -pub const IP6T_SO_SET_ADD_COUNTERS: u32 = 65; -pub const IP6T_SO_SET_MAX: u32 = 65; -pub const IP6T_SO_GET_INFO: u32 = 64; -pub const IP6T_SO_GET_ENTRIES: u32 = 65; -pub const IP6T_SO_GET_REVISION_MATCH: u32 = 68; -pub const IP6T_SO_GET_REVISION_TARGET: u32 = 69; -pub const IP6T_SO_GET_MAX: u32 = 69; -pub const IP6T_SO_ORIGINAL_DST: u32 = 80; -pub const IP6T_ICMP_INV: u32 = 1; -pub const NF_IP_PRE_ROUTING: u32 = 0; -pub const NF_IP_LOCAL_IN: u32 = 1; -pub const NF_IP_FORWARD: u32 = 2; -pub const NF_IP_LOCAL_OUT: u32 = 3; -pub const NF_IP_POST_ROUTING: u32 = 4; -pub const NF_IP_NUMHOOKS: u32 = 5; -pub const SO_ORIGINAL_DST: u32 = 80; pub const SHUT_RD: u32 = 0; pub const SHUT_WR: u32 = 1; pub const SHUT_RDWR: u32 = 2; @@ -1574,25 +1186,6 @@ pub const TCP_NLA_EDT: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_EDT; pub const TCP_NLA_TTL: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_TTL; pub const TCP_NLA_REHASH: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_REHASH; -pub const IF_OPER_UNKNOWN: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_UNKNOWN; -pub const IF_OPER_NOTPRESENT: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_NOTPRESENT; -pub const IF_OPER_DOWN: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_DOWN; -pub const IF_OPER_LOWERLAYERDOWN: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_LOWERLAYERDOWN; -pub const IF_OPER_TESTING: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_TESTING; -pub const IF_OPER_DORMANT: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_DORMANT; -pub const IF_OPER_UP: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_UP; -pub const IF_LINK_MODE_DEFAULT: _bindgen_ty_8 = _bindgen_ty_8::IF_LINK_MODE_DEFAULT; -pub const IF_LINK_MODE_DORMANT: _bindgen_ty_8 = _bindgen_ty_8::IF_LINK_MODE_DORMANT; -pub const IF_LINK_MODE_TESTING: _bindgen_ty_8 = _bindgen_ty_8::IF_LINK_MODE_TESTING; -pub const NFPROTO_UNSPEC: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_UNSPEC; -pub const NFPROTO_INET: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_INET; -pub const NFPROTO_IPV4: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_IPV4; -pub const NFPROTO_ARP: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_ARP; -pub const NFPROTO_NETDEV: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_NETDEV; -pub const NFPROTO_BRIDGE: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_BRIDGE; -pub const NFPROTO_IPV6: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_IPV6; -pub const NFPROTO_DECNET: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_DECNET; -pub const NFPROTO_NUMPROTO: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_NUMPROTO; #[repr(u32)] #[non_exhaustive] #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] @@ -1816,121 +1409,6 @@ TCP_NLA_TTL = 26, TCP_NLA_REHASH = 27, } -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum net_device_flags { -IFF_UP = 1, -IFF_BROADCAST = 2, -IFF_DEBUG = 4, -IFF_LOOPBACK = 8, -IFF_POINTOPOINT = 16, -IFF_NOTRAILERS = 32, -IFF_RUNNING = 64, -IFF_NOARP = 128, -IFF_PROMISC = 256, -IFF_ALLMULTI = 512, -IFF_MASTER = 1024, -IFF_SLAVE = 2048, -IFF_MULTICAST = 4096, -IFF_PORTSEL = 8192, -IFF_AUTOMEDIA = 16384, -IFF_DYNAMIC = 32768, -IFF_LOWER_UP = 65536, -IFF_DORMANT = 131072, -IFF_ECHO = 262144, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_7 { -IF_OPER_UNKNOWN = 0, -IF_OPER_NOTPRESENT = 1, -IF_OPER_DOWN = 2, -IF_OPER_LOWERLAYERDOWN = 3, -IF_OPER_TESTING = 4, -IF_OPER_DORMANT = 5, -IF_OPER_UP = 6, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_8 { -IF_LINK_MODE_DEFAULT = 0, -IF_LINK_MODE_DORMANT = 1, -IF_LINK_MODE_TESTING = 2, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_inet_hooks { -NF_INET_PRE_ROUTING = 0, -NF_INET_LOCAL_IN = 1, -NF_INET_FORWARD = 2, -NF_INET_LOCAL_OUT = 3, -NF_INET_POST_ROUTING = 4, -NF_INET_NUMHOOKS = 5, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_dev_hooks { -NF_NETDEV_INGRESS = 0, -NF_NETDEV_EGRESS = 1, -NF_NETDEV_NUMHOOKS = 2, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_9 { -NFPROTO_UNSPEC = 0, -NFPROTO_INET = 1, -NFPROTO_IPV4 = 2, -NFPROTO_ARP = 3, -NFPROTO_NETDEV = 5, -NFPROTO_BRIDGE = 7, -NFPROTO_IPV6 = 10, -NFPROTO_DECNET = 12, -NFPROTO_NUMPROTO = 13, -} -#[repr(i32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_ip6_hook_priorities { -NF_IP6_PRI_FIRST = -2147483648, -NF_IP6_PRI_RAW_BEFORE_DEFRAG = -450, -NF_IP6_PRI_CONNTRACK_DEFRAG = -400, -NF_IP6_PRI_RAW = -300, -NF_IP6_PRI_SELINUX_FIRST = -225, -NF_IP6_PRI_CONNTRACK = -200, -NF_IP6_PRI_MANGLE = -150, -NF_IP6_PRI_NAT_DST = -100, -NF_IP6_PRI_FILTER = 0, -NF_IP6_PRI_SECURITY = 50, -NF_IP6_PRI_NAT_SRC = 100, -NF_IP6_PRI_SELINUX_LAST = 225, -NF_IP6_PRI_CONNTRACK_HELPER = 300, -NF_IP6_PRI_LAST = 2147483647, -} -#[repr(i32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_ip_hook_priorities { -NF_IP_PRI_FIRST = -2147483648, -NF_IP_PRI_RAW_BEFORE_DEFRAG = -450, -NF_IP_PRI_CONNTRACK_DEFRAG = -400, -NF_IP_PRI_RAW = -300, -NF_IP_PRI_SELINUX_FIRST = -225, -NF_IP_PRI_CONNTRACK = -200, -NF_IP_PRI_MANGLE = -150, -NF_IP_PRI_NAT_DST = -100, -NF_IP_PRI_FILTER = 0, -NF_IP_PRI_SECURITY = 50, -NF_IP_PRI_NAT_SRC = 100, -NF_IP_PRI_SELINUX_LAST = 225, -NF_IP_PRI_CONNTRACK_HELPER = 300, -NF_IP_PRI_CONNTRACK_CONFIRM = 2147483647, -} #[repr(C)] #[derive(Copy, Clone)] pub union __kernel_sockaddr_storage__bindgen_ty_1 { @@ -1962,69 +1440,6 @@ pub hdr: tcphdr, pub words: [__be32; 5usize], } -#[repr(C)] -#[derive(Copy, Clone)] -pub union if_settings__bindgen_ty_1 { -pub raw_hdlc: *mut raw_hdlc_proto, -pub cisco: *mut cisco_proto, -pub fr: *mut fr_proto, -pub fr_pvc: *mut fr_proto_pvc, -pub fr_pvc_info: *mut fr_proto_pvc_info, -pub x25: *mut x25_hdlc_proto, -pub sync: *mut sync_serial_settings, -pub te1: *mut te1_settings, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ifreq__bindgen_ty_1 { -pub ifrn_name: [crate::ctypes::c_char; 16usize], -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ifreq__bindgen_ty_2 { -pub ifru_addr: sockaddr, -pub ifru_dstaddr: sockaddr, -pub ifru_broadaddr: sockaddr, -pub ifru_netmask: sockaddr, -pub ifru_hwaddr: sockaddr, -pub ifru_flags: crate::ctypes::c_short, -pub ifru_ivalue: crate::ctypes::c_int, -pub ifru_mtu: crate::ctypes::c_int, -pub ifru_map: ifmap, -pub ifru_slave: [crate::ctypes::c_char; 16usize], -pub ifru_newname: [crate::ctypes::c_char; 16usize], -pub ifru_data: *mut crate::ctypes::c_void, -pub ifru_settings: if_settings, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ifconf__bindgen_ty_1 { -pub ifcu_buf: *mut crate::ctypes::c_char, -pub ifcu_req: *mut ifreq, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union nf_inet_addr { -pub all: [__u32; 4usize], -pub ip: __be32, -pub ip6: [__be32; 4usize], -pub in_: in_addr, -pub in6: in6_addr, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union xt_entry_match__bindgen_ty_1 { -pub user: xt_entry_match__bindgen_ty_1__bindgen_ty_1, -pub kernel: xt_entry_match__bindgen_ty_1__bindgen_ty_2, -pub match_size: __u16, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union xt_entry_target__bindgen_ty_1 { -pub user: xt_entry_target__bindgen_ty_1__bindgen_ty_1, -pub kernel: xt_entry_target__bindgen_ty_1__bindgen_ty_2, -pub target_size: __u16, -} impl __BindgenBitfieldUnit { #[inline] pub const fn new(storage: Storage) -> Self { @@ -2450,9 +1865,3 @@ __bindgen_bitfield_unit } } -impl nf_inet_hooks { -pub const NF_INET_INGRESS: nf_inet_hooks = nf_inet_hooks::NF_INET_NUMHOOKS; -} -impl nf_ip_hook_priorities { -pub const NF_IP_PRI_LAST: nf_ip_hook_priorities = nf_ip_hook_priorities::NF_IP_PRI_CONNTRACK_CONFIRM; -} diff -Nru temporalio-1.3.0/vendor/linux-raw-sys/src/mips32r6/general.rs temporalio-1.3.0/vendor/linux-raw-sys/src/mips32r6/general.rs --- temporalio-1.3.0/vendor/linux-raw-sys/src/mips32r6/general.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/linux-raw-sys/src/mips32r6/general.rs 2023-10-30 19:40:00.000000000 +0000 @@ -892,9 +892,9 @@ pub sa_flags: crate::ctypes::c_ulong, pub sa_mask: kernel_sigset_t, } -pub const LINUX_VERSION_CODE: u32 = 393984; +pub const LINUX_VERSION_CODE: u32 = 394240; pub const LINUX_VERSION_MAJOR: u32 = 6; -pub const LINUX_VERSION_PATCHLEVEL: u32 = 3; +pub const LINUX_VERSION_PATCHLEVEL: u32 = 4; pub const LINUX_VERSION_SUBLEVEL: u32 = 0; pub const AT_SYSINFO_EHDR: u32 = 33; pub const AT_VECTOR_SIZE_ARCH: u32 = 1; @@ -1028,7 +1028,6 @@ pub const O_PATH: u32 = 2097152; pub const __O_TMPFILE: u32 = 4194304; pub const O_TMPFILE: u32 = 4259840; -pub const O_TMPFILE_MASK: u32 = 4260096; pub const O_NDELAY: u32 = 128; pub const F_DUPFD: u32 = 0; pub const F_GETFD: u32 = 1; @@ -1619,19 +1618,6 @@ pub const GRND_NONBLOCK: u32 = 1; pub const GRND_RANDOM: u32 = 2; pub const GRND_INSECURE: u32 = 4; -pub const LINUX_REBOOT_MAGIC1: u32 = 4276215469; -pub const LINUX_REBOOT_MAGIC2: u32 = 672274793; -pub const LINUX_REBOOT_MAGIC2A: u32 = 85072278; -pub const LINUX_REBOOT_MAGIC2B: u32 = 369367448; -pub const LINUX_REBOOT_MAGIC2C: u32 = 537993216; -pub const LINUX_REBOOT_CMD_RESTART: u32 = 19088743; -pub const LINUX_REBOOT_CMD_HALT: u32 = 3454992675; -pub const LINUX_REBOOT_CMD_CAD_ON: u32 = 2309737967; -pub const LINUX_REBOOT_CMD_CAD_OFF: u32 = 0; -pub const LINUX_REBOOT_CMD_POWER_OFF: u32 = 1126301404; -pub const LINUX_REBOOT_CMD_RESTART2: u32 = 2712847316; -pub const LINUX_REBOOT_CMD_SW_SUSPEND: u32 = 3489725666; -pub const LINUX_REBOOT_CMD_KEXEC: u32 = 1163412803; pub const ITIMER_REAL: u32 = 0; pub const ITIMER_VIRTUAL: u32 = 1; pub const ITIMER_PROF: u32 = 2; @@ -2757,6 +2743,7 @@ pub const UFFD_FEATURE_MINOR_SHMEM: u32 = 1024; pub const UFFD_FEATURE_EXACT_ADDRESS: u32 = 2048; pub const UFFD_FEATURE_WP_HUGETLBFS_SHMEM: u32 = 4096; +pub const UFFD_FEATURE_WP_UNPOPULATED: u32 = 8192; pub const UFFD_USER_MODE_ONLY: u32 = 1; pub const DT_UNKNOWN: u32 = 0; pub const DT_FIFO: u32 = 1; diff -Nru temporalio-1.3.0/vendor/linux-raw-sys/src/mips32r6/io_uring.rs temporalio-1.3.0/vendor/linux-raw-sys/src/mips32r6/io_uring.rs --- temporalio-1.3.0/vendor/linux-raw-sys/src/mips32r6/io_uring.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/linux-raw-sys/src/mips32r6/io_uring.rs 2023-10-30 19:40:00.000000000 +0000 @@ -350,21 +350,6 @@ } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct io_uring_notification_slot { -pub tag: __u64, -pub resv: [__u64; 3usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct io_uring_notification_register { -pub nr_slots: __u32, -pub resv: __u32, -pub resv2: __u64, -pub data: __u64, -pub resv3: __u64, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] pub struct io_uring_probe_op { pub op: __u8, pub resv: __u8, @@ -429,7 +414,7 @@ pub ring_addr: __u64, pub ring_entries: __u32, pub bgid: __u16, -pub pad: __u16, +pub flags: __u16, pub resv: [__u64; 3usize], } #[repr(C)] @@ -713,6 +698,7 @@ pub const IORING_TIMEOUT_REALTIME: u32 = 8; pub const IORING_LINK_TIMEOUT_UPDATE: u32 = 16; pub const IORING_TIMEOUT_ETIME_SUCCESS: u32 = 32; +pub const IORING_TIMEOUT_MULTISHOT: u32 = 64; pub const IORING_TIMEOUT_CLOCK_MASK: u32 = 12; pub const IORING_TIMEOUT_UPDATE_MASK: u32 = 18; pub const SPLICE_F_FD_IN_FIXED: u32 = 2147483648; @@ -739,6 +725,9 @@ pub const IORING_OFF_SQ_RING: u32 = 0; pub const IORING_OFF_CQ_RING: u32 = 134217728; pub const IORING_OFF_SQES: u32 = 268435456; +pub const IORING_OFF_PBUF_RING: u32 = 2147483648; +pub const IORING_OFF_PBUF_SHIFT: u32 = 16; +pub const IORING_OFF_MMAP_MASK: u32 = 4160749568; pub const IORING_SQ_NEED_WAKEUP: u32 = 1; pub const IORING_SQ_CQ_OVERFLOW: u32 = 2; pub const IORING_SQ_TASKRUN: u32 = 4; @@ -805,11 +794,12 @@ pub const IORING_REGISTER_USE_REGISTERED_RING: _bindgen_ty_4 = _bindgen_ty_4::IORING_REGISTER_USE_REGISTERED_RING; pub const IO_WQ_BOUND: _bindgen_ty_5 = _bindgen_ty_5::IO_WQ_BOUND; pub const IO_WQ_UNBOUND: _bindgen_ty_5 = _bindgen_ty_5::IO_WQ_UNBOUND; -pub const IORING_RESTRICTION_REGISTER_OP: _bindgen_ty_6 = _bindgen_ty_6::IORING_RESTRICTION_REGISTER_OP; -pub const IORING_RESTRICTION_SQE_OP: _bindgen_ty_6 = _bindgen_ty_6::IORING_RESTRICTION_SQE_OP; -pub const IORING_RESTRICTION_SQE_FLAGS_ALLOWED: _bindgen_ty_6 = _bindgen_ty_6::IORING_RESTRICTION_SQE_FLAGS_ALLOWED; -pub const IORING_RESTRICTION_SQE_FLAGS_REQUIRED: _bindgen_ty_6 = _bindgen_ty_6::IORING_RESTRICTION_SQE_FLAGS_REQUIRED; -pub const IORING_RESTRICTION_LAST: _bindgen_ty_6 = _bindgen_ty_6::IORING_RESTRICTION_LAST; +pub const IOU_PBUF_RING_MMAP: _bindgen_ty_6 = _bindgen_ty_6::IOU_PBUF_RING_MMAP; +pub const IORING_RESTRICTION_REGISTER_OP: _bindgen_ty_7 = _bindgen_ty_7::IORING_RESTRICTION_REGISTER_OP; +pub const IORING_RESTRICTION_SQE_OP: _bindgen_ty_7 = _bindgen_ty_7::IORING_RESTRICTION_SQE_OP; +pub const IORING_RESTRICTION_SQE_FLAGS_ALLOWED: _bindgen_ty_7 = _bindgen_ty_7::IORING_RESTRICTION_SQE_FLAGS_ALLOWED; +pub const IORING_RESTRICTION_SQE_FLAGS_REQUIRED: _bindgen_ty_7 = _bindgen_ty_7::IORING_RESTRICTION_SQE_FLAGS_REQUIRED; +pub const IORING_RESTRICTION_LAST: _bindgen_ty_7 = _bindgen_ty_7::IORING_RESTRICTION_LAST; #[repr(u32)] #[non_exhaustive] #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] @@ -947,6 +937,12 @@ #[non_exhaustive] #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] pub enum _bindgen_ty_6 { +IOU_PBUF_RING_MMAP = 1, +} +#[repr(u32)] +#[non_exhaustive] +#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] +pub enum _bindgen_ty_7 { IORING_RESTRICTION_REGISTER_OP = 0, IORING_RESTRICTION_SQE_OP = 1, IORING_RESTRICTION_SQE_FLAGS_ALLOWED = 2, diff -Nru temporalio-1.3.0/vendor/linux-raw-sys/src/mips32r6/netlink.rs temporalio-1.3.0/vendor/linux-raw-sys/src/mips32r6/netlink.rs --- temporalio-1.3.0/vendor/linux-raw-sys/src/mips32r6/netlink.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/linux-raw-sys/src/mips32r6/netlink.rs 2023-10-30 19:40:00.000000000 +0000 @@ -943,6 +943,7 @@ pub const IFLA_BRPORT_MAB: _bindgen_ty_8 = _bindgen_ty_8::IFLA_BRPORT_MAB; pub const IFLA_BRPORT_MCAST_N_GROUPS: _bindgen_ty_8 = _bindgen_ty_8::IFLA_BRPORT_MCAST_N_GROUPS; pub const IFLA_BRPORT_MCAST_MAX_GROUPS: _bindgen_ty_8 = _bindgen_ty_8::IFLA_BRPORT_MCAST_MAX_GROUPS; +pub const IFLA_BRPORT_NEIGH_VLAN_SUPPRESS: _bindgen_ty_8 = _bindgen_ty_8::IFLA_BRPORT_NEIGH_VLAN_SUPPRESS; pub const __IFLA_BRPORT_MAX: _bindgen_ty_8 = _bindgen_ty_8::__IFLA_BRPORT_MAX; pub const IFLA_INFO_UNSPEC: _bindgen_ty_9 = _bindgen_ty_9::IFLA_INFO_UNSPEC; pub const IFLA_INFO_KIND: _bindgen_ty_9 = _bindgen_ty_9::IFLA_INFO_KIND; @@ -970,6 +971,7 @@ pub const IFLA_MACVLAN_MACADDR_COUNT: _bindgen_ty_12 = _bindgen_ty_12::IFLA_MACVLAN_MACADDR_COUNT; pub const IFLA_MACVLAN_BC_QUEUE_LEN: _bindgen_ty_12 = _bindgen_ty_12::IFLA_MACVLAN_BC_QUEUE_LEN; pub const IFLA_MACVLAN_BC_QUEUE_LEN_USED: _bindgen_ty_12 = _bindgen_ty_12::IFLA_MACVLAN_BC_QUEUE_LEN_USED; +pub const IFLA_MACVLAN_BC_CUTOFF: _bindgen_ty_12 = _bindgen_ty_12::IFLA_MACVLAN_BC_CUTOFF; pub const __IFLA_MACVLAN_MAX: _bindgen_ty_12 = _bindgen_ty_12::__IFLA_MACVLAN_MAX; pub const IFLA_VRF_UNSPEC: _bindgen_ty_13 = _bindgen_ty_13::IFLA_VRF_UNSPEC; pub const IFLA_VRF_TABLE: _bindgen_ty_13 = _bindgen_ty_13::IFLA_VRF_TABLE; @@ -1788,7 +1790,8 @@ IFLA_BRPORT_MAB = 40, IFLA_BRPORT_MCAST_N_GROUPS = 41, IFLA_BRPORT_MCAST_MAX_GROUPS = 42, -__IFLA_BRPORT_MAX = 43, +IFLA_BRPORT_NEIGH_VLAN_SUPPRESS = 43, +__IFLA_BRPORT_MAX = 44, } #[repr(u32)] #[non_exhaustive] @@ -1835,7 +1838,8 @@ IFLA_MACVLAN_MACADDR_COUNT = 6, IFLA_MACVLAN_BC_QUEUE_LEN = 7, IFLA_MACVLAN_BC_QUEUE_LEN_USED = 8, -__IFLA_MACVLAN_MAX = 9, +IFLA_MACVLAN_BC_CUTOFF = 9, +__IFLA_MACVLAN_MAX = 10, } #[repr(u32)] #[non_exhaustive] diff -Nru temporalio-1.3.0/vendor/linux-raw-sys/src/mips32r6/net.rs temporalio-1.3.0/vendor/linux-raw-sys/src/mips32r6/net.rs --- temporalio-1.3.0/vendor/linux-raw-sys/src/mips32r6/net.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/linux-raw-sys/src/mips32r6/net.rs 2023-10-30 19:40:00.000000000 +0000 @@ -476,255 +476,6 @@ } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct sync_serial_settings { -pub clock_rate: crate::ctypes::c_uint, -pub clock_type: crate::ctypes::c_uint, -pub loopback: crate::ctypes::c_ushort, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct te1_settings { -pub clock_rate: crate::ctypes::c_uint, -pub clock_type: crate::ctypes::c_uint, -pub loopback: crate::ctypes::c_ushort, -pub slot_map: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct raw_hdlc_proto { -pub encoding: crate::ctypes::c_ushort, -pub parity: crate::ctypes::c_ushort, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fr_proto { -pub t391: crate::ctypes::c_uint, -pub t392: crate::ctypes::c_uint, -pub n391: crate::ctypes::c_uint, -pub n392: crate::ctypes::c_uint, -pub n393: crate::ctypes::c_uint, -pub lmi: crate::ctypes::c_ushort, -pub dce: crate::ctypes::c_ushort, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fr_proto_pvc { -pub dlci: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fr_proto_pvc_info { -pub dlci: crate::ctypes::c_uint, -pub master: [crate::ctypes::c_char; 16usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct cisco_proto { -pub interval: crate::ctypes::c_uint, -pub timeout: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct x25_hdlc_proto { -pub dce: crate::ctypes::c_ushort, -pub modulo: crate::ctypes::c_uint, -pub window: crate::ctypes::c_uint, -pub t1: crate::ctypes::c_uint, -pub t2: crate::ctypes::c_uint, -pub n2: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ifmap { -pub mem_start: crate::ctypes::c_ulong, -pub mem_end: crate::ctypes::c_ulong, -pub base_addr: crate::ctypes::c_ushort, -pub irq: crate::ctypes::c_uchar, -pub dma: crate::ctypes::c_uchar, -pub port: crate::ctypes::c_uchar, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct if_settings { -pub type_: crate::ctypes::c_uint, -pub size: crate::ctypes::c_uint, -pub ifs_ifsu: if_settings__bindgen_ty_1, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ifreq { -pub ifr_ifrn: ifreq__bindgen_ty_1, -pub ifr_ifru: ifreq__bindgen_ty_2, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ifconf { -pub ifc_len: crate::ctypes::c_int, -pub ifc_ifcu: ifconf__bindgen_ty_1, -} -#[repr(C)] -pub struct xt_entry_match { -pub u: xt_entry_match__bindgen_ty_1, -pub data: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_match__bindgen_ty_1__bindgen_ty_1 { -pub match_size: __u16, -pub name: [crate::ctypes::c_char; 29usize], -pub revision: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_match__bindgen_ty_1__bindgen_ty_2 { -pub match_size: __u16, -pub match_: *mut xt_match, -} -#[repr(C)] -pub struct xt_entry_target { -pub u: xt_entry_target__bindgen_ty_1, -pub data: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_target__bindgen_ty_1__bindgen_ty_1 { -pub target_size: __u16, -pub name: [crate::ctypes::c_char; 29usize], -pub revision: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_target__bindgen_ty_1__bindgen_ty_2 { -pub target_size: __u16, -pub target: *mut xt_target, -} -#[repr(C)] -pub struct xt_standard_target { -pub target: xt_entry_target, -pub verdict: crate::ctypes::c_int, -} -#[repr(C)] -pub struct xt_error_target { -pub target: xt_entry_target, -pub errorname: [crate::ctypes::c_char; 30usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_get_revision { -pub name: [crate::ctypes::c_char; 29usize], -pub revision: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct _xt_align { -pub u8_: __u8, -pub u16_: __u16, -pub u32_: __u32, -pub u64_: __u64, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_counters { -pub pcnt: __u64, -pub bcnt: __u64, -} -#[repr(C)] -#[derive(Debug)] -pub struct xt_counters_info { -pub name: [crate::ctypes::c_char; 32usize], -pub num_counters: crate::ctypes::c_uint, -pub counters: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_tcp { -pub spts: [__u16; 2usize], -pub dpts: [__u16; 2usize], -pub option: __u8, -pub flg_mask: __u8, -pub flg_cmp: __u8, -pub invflags: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_udp { -pub spts: [__u16; 2usize], -pub dpts: [__u16; 2usize], -pub invflags: __u8, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ip6t_ip6 { -pub src: in6_addr, -pub dst: in6_addr, -pub smsk: in6_addr, -pub dmsk: in6_addr, -pub iniface: [crate::ctypes::c_char; 16usize], -pub outiface: [crate::ctypes::c_char; 16usize], -pub iniface_mask: [crate::ctypes::c_uchar; 16usize], -pub outiface_mask: [crate::ctypes::c_uchar; 16usize], -pub proto: __u16, -pub tos: __u8, -pub flags: __u8, -pub invflags: __u8, -} -#[repr(C)] -pub struct ip6t_entry { -pub ipv6: ip6t_ip6, -pub nfcache: crate::ctypes::c_uint, -pub target_offset: __u16, -pub next_offset: __u16, -pub comefrom: crate::ctypes::c_uint, -pub counters: xt_counters, -pub elems: __IncompleteArrayField, -} -#[repr(C)] -pub struct ip6t_standard { -pub entry: ip6t_entry, -pub target: xt_standard_target, -} -#[repr(C)] -pub struct ip6t_error { -pub entry: ip6t_entry, -pub target: xt_error_target, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ip6t_icmp { -pub type_: __u8, -pub code: [__u8; 2usize], -pub invflags: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ip6t_getinfo { -pub name: [crate::ctypes::c_char; 32usize], -pub valid_hooks: crate::ctypes::c_uint, -pub hook_entry: [crate::ctypes::c_uint; 5usize], -pub underflow: [crate::ctypes::c_uint; 5usize], -pub num_entries: crate::ctypes::c_uint, -pub size: crate::ctypes::c_uint, -} -#[repr(C)] -pub struct ip6t_replace { -pub name: [crate::ctypes::c_char; 32usize], -pub valid_hooks: crate::ctypes::c_uint, -pub num_entries: crate::ctypes::c_uint, -pub size: crate::ctypes::c_uint, -pub hook_entry: [crate::ctypes::c_uint; 5usize], -pub underflow: [crate::ctypes::c_uint; 5usize], -pub num_counters: crate::ctypes::c_uint, -pub counters: *mut xt_counters, -pub entries: __IncompleteArrayField, -} -#[repr(C)] -pub struct ip6t_get_entries { -pub name: [crate::ctypes::c_char; 32usize], -pub size: crate::ctypes::c_uint, -pub entrytable: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] pub struct linger { pub l_onoff: crate::ctypes::c_int, pub l_linger: crate::ctypes::c_int, @@ -762,16 +513,6 @@ } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct xt_match { -pub _address: u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_target { -pub _address: u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] pub struct iovec { pub _address: u8, } @@ -846,6 +587,7 @@ pub const IP_MULTICAST_ALL: u32 = 49; pub const IP_UNICAST_IF: u32 = 50; pub const IP_LOCAL_PORT_RANGE: u32 = 51; +pub const IP_PROTOCOL: u32 = 52; pub const MCAST_EXCLUDE: u32 = 0; pub const MCAST_INCLUDE: u32 = 1; pub const IP_DEFAULT_MULTICAST_TTL: u32 = 1; @@ -1217,135 +959,6 @@ pub const TCP_MD5SIG_FLAG_IFINDEX: u32 = 2; pub const TCP_RECEIVE_ZEROCOPY_FLAG_TLB_CLEAN_HINT: u32 = 1; pub const UNIX_PATH_MAX: u32 = 108; -pub const IFNAMSIZ: u32 = 16; -pub const IFALIASZ: u32 = 256; -pub const ALTIFNAMSIZ: u32 = 128; -pub const GENERIC_HDLC_VERSION: u32 = 4; -pub const CLOCK_DEFAULT: u32 = 0; -pub const CLOCK_EXT: u32 = 1; -pub const CLOCK_INT: u32 = 2; -pub const CLOCK_TXINT: u32 = 3; -pub const CLOCK_TXFROMRX: u32 = 4; -pub const ENCODING_DEFAULT: u32 = 0; -pub const ENCODING_NRZ: u32 = 1; -pub const ENCODING_NRZI: u32 = 2; -pub const ENCODING_FM_MARK: u32 = 3; -pub const ENCODING_FM_SPACE: u32 = 4; -pub const ENCODING_MANCHESTER: u32 = 5; -pub const PARITY_DEFAULT: u32 = 0; -pub const PARITY_NONE: u32 = 1; -pub const PARITY_CRC16_PR0: u32 = 2; -pub const PARITY_CRC16_PR1: u32 = 3; -pub const PARITY_CRC16_PR0_CCITT: u32 = 4; -pub const PARITY_CRC16_PR1_CCITT: u32 = 5; -pub const PARITY_CRC32_PR0_CCITT: u32 = 6; -pub const PARITY_CRC32_PR1_CCITT: u32 = 7; -pub const LMI_DEFAULT: u32 = 0; -pub const LMI_NONE: u32 = 1; -pub const LMI_ANSI: u32 = 2; -pub const LMI_CCITT: u32 = 3; -pub const LMI_CISCO: u32 = 4; -pub const IF_GET_IFACE: u32 = 1; -pub const IF_GET_PROTO: u32 = 2; -pub const IF_IFACE_V35: u32 = 4096; -pub const IF_IFACE_V24: u32 = 4097; -pub const IF_IFACE_X21: u32 = 4098; -pub const IF_IFACE_T1: u32 = 4099; -pub const IF_IFACE_E1: u32 = 4100; -pub const IF_IFACE_SYNC_SERIAL: u32 = 4101; -pub const IF_IFACE_X21D: u32 = 4102; -pub const IF_PROTO_HDLC: u32 = 8192; -pub const IF_PROTO_PPP: u32 = 8193; -pub const IF_PROTO_CISCO: u32 = 8194; -pub const IF_PROTO_FR: u32 = 8195; -pub const IF_PROTO_FR_ADD_PVC: u32 = 8196; -pub const IF_PROTO_FR_DEL_PVC: u32 = 8197; -pub const IF_PROTO_X25: u32 = 8198; -pub const IF_PROTO_HDLC_ETH: u32 = 8199; -pub const IF_PROTO_FR_ADD_ETH_PVC: u32 = 8200; -pub const IF_PROTO_FR_DEL_ETH_PVC: u32 = 8201; -pub const IF_PROTO_FR_PVC: u32 = 8202; -pub const IF_PROTO_FR_ETH_PVC: u32 = 8203; -pub const IF_PROTO_RAW: u32 = 8204; -pub const IFHWADDRLEN: u32 = 6; -pub const NF_DROP: u32 = 0; -pub const NF_ACCEPT: u32 = 1; -pub const NF_STOLEN: u32 = 2; -pub const NF_QUEUE: u32 = 3; -pub const NF_REPEAT: u32 = 4; -pub const NF_STOP: u32 = 5; -pub const NF_MAX_VERDICT: u32 = 5; -pub const NF_VERDICT_MASK: u32 = 255; -pub const NF_VERDICT_FLAG_QUEUE_BYPASS: u32 = 32768; -pub const NF_VERDICT_QMASK: u32 = 4294901760; -pub const NF_VERDICT_QBITS: u32 = 16; -pub const NF_VERDICT_BITS: u32 = 16; -pub const NF_IP6_PRE_ROUTING: u32 = 0; -pub const NF_IP6_LOCAL_IN: u32 = 1; -pub const NF_IP6_FORWARD: u32 = 2; -pub const NF_IP6_LOCAL_OUT: u32 = 3; -pub const NF_IP6_POST_ROUTING: u32 = 4; -pub const NF_IP6_NUMHOOKS: u32 = 5; -pub const XT_FUNCTION_MAXNAMELEN: u32 = 30; -pub const XT_EXTENSION_MAXNAMELEN: u32 = 29; -pub const XT_TABLE_MAXNAMELEN: u32 = 32; -pub const XT_CONTINUE: u32 = 4294967295; -pub const XT_RETURN: i32 = -5; -pub const XT_STANDARD_TARGET: &[u8; 1] = b"\0"; -pub const XT_ERROR_TARGET: &[u8; 6] = b"ERROR\0"; -pub const XT_INV_PROTO: u32 = 64; -pub const IP6T_FUNCTION_MAXNAMELEN: u32 = 30; -pub const IP6T_TABLE_MAXNAMELEN: u32 = 32; -pub const IP6T_CONTINUE: u32 = 4294967295; -pub const IP6T_RETURN: i32 = -5; -pub const XT_TCP_INV_SRCPT: u32 = 1; -pub const XT_TCP_INV_DSTPT: u32 = 2; -pub const XT_TCP_INV_FLAGS: u32 = 4; -pub const XT_TCP_INV_OPTION: u32 = 8; -pub const XT_TCP_INV_MASK: u32 = 15; -pub const XT_UDP_INV_SRCPT: u32 = 1; -pub const XT_UDP_INV_DSTPT: u32 = 2; -pub const XT_UDP_INV_MASK: u32 = 3; -pub const IP6T_TCP_INV_SRCPT: u32 = 1; -pub const IP6T_TCP_INV_DSTPT: u32 = 2; -pub const IP6T_TCP_INV_FLAGS: u32 = 4; -pub const IP6T_TCP_INV_OPTION: u32 = 8; -pub const IP6T_TCP_INV_MASK: u32 = 15; -pub const IP6T_UDP_INV_SRCPT: u32 = 1; -pub const IP6T_UDP_INV_DSTPT: u32 = 2; -pub const IP6T_UDP_INV_MASK: u32 = 3; -pub const IP6T_STANDARD_TARGET: &[u8; 1] = b"\0"; -pub const IP6T_ERROR_TARGET: &[u8; 6] = b"ERROR\0"; -pub const IP6T_F_PROTO: u32 = 1; -pub const IP6T_F_TOS: u32 = 2; -pub const IP6T_F_GOTO: u32 = 4; -pub const IP6T_F_MASK: u32 = 7; -pub const IP6T_INV_VIA_IN: u32 = 1; -pub const IP6T_INV_VIA_OUT: u32 = 2; -pub const IP6T_INV_TOS: u32 = 4; -pub const IP6T_INV_SRCIP: u32 = 8; -pub const IP6T_INV_DSTIP: u32 = 16; -pub const IP6T_INV_FRAG: u32 = 32; -pub const IP6T_INV_PROTO: u32 = 64; -pub const IP6T_INV_MASK: u32 = 127; -pub const IP6T_BASE_CTL: u32 = 64; -pub const IP6T_SO_SET_REPLACE: u32 = 64; -pub const IP6T_SO_SET_ADD_COUNTERS: u32 = 65; -pub const IP6T_SO_SET_MAX: u32 = 65; -pub const IP6T_SO_GET_INFO: u32 = 64; -pub const IP6T_SO_GET_ENTRIES: u32 = 65; -pub const IP6T_SO_GET_REVISION_MATCH: u32 = 68; -pub const IP6T_SO_GET_REVISION_TARGET: u32 = 69; -pub const IP6T_SO_GET_MAX: u32 = 69; -pub const IP6T_SO_ORIGINAL_DST: u32 = 80; -pub const IP6T_ICMP_INV: u32 = 1; -pub const NF_IP_PRE_ROUTING: u32 = 0; -pub const NF_IP_LOCAL_IN: u32 = 1; -pub const NF_IP_FORWARD: u32 = 2; -pub const NF_IP_LOCAL_OUT: u32 = 3; -pub const NF_IP_POST_ROUTING: u32 = 4; -pub const NF_IP_NUMHOOKS: u32 = 5; -pub const SO_ORIGINAL_DST: u32 = 80; pub const SHUT_RD: u32 = 0; pub const SHUT_WR: u32 = 1; pub const SHUT_RDWR: u32 = 2; @@ -1574,25 +1187,6 @@ pub const TCP_NLA_EDT: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_EDT; pub const TCP_NLA_TTL: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_TTL; pub const TCP_NLA_REHASH: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_REHASH; -pub const IF_OPER_UNKNOWN: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_UNKNOWN; -pub const IF_OPER_NOTPRESENT: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_NOTPRESENT; -pub const IF_OPER_DOWN: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_DOWN; -pub const IF_OPER_LOWERLAYERDOWN: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_LOWERLAYERDOWN; -pub const IF_OPER_TESTING: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_TESTING; -pub const IF_OPER_DORMANT: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_DORMANT; -pub const IF_OPER_UP: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_UP; -pub const IF_LINK_MODE_DEFAULT: _bindgen_ty_8 = _bindgen_ty_8::IF_LINK_MODE_DEFAULT; -pub const IF_LINK_MODE_DORMANT: _bindgen_ty_8 = _bindgen_ty_8::IF_LINK_MODE_DORMANT; -pub const IF_LINK_MODE_TESTING: _bindgen_ty_8 = _bindgen_ty_8::IF_LINK_MODE_TESTING; -pub const NFPROTO_UNSPEC: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_UNSPEC; -pub const NFPROTO_INET: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_INET; -pub const NFPROTO_IPV4: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_IPV4; -pub const NFPROTO_ARP: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_ARP; -pub const NFPROTO_NETDEV: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_NETDEV; -pub const NFPROTO_BRIDGE: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_BRIDGE; -pub const NFPROTO_IPV6: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_IPV6; -pub const NFPROTO_DECNET: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_DECNET; -pub const NFPROTO_NUMPROTO: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_NUMPROTO; #[repr(u32)] #[non_exhaustive] #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] @@ -1816,121 +1410,6 @@ TCP_NLA_TTL = 26, TCP_NLA_REHASH = 27, } -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum net_device_flags { -IFF_UP = 1, -IFF_BROADCAST = 2, -IFF_DEBUG = 4, -IFF_LOOPBACK = 8, -IFF_POINTOPOINT = 16, -IFF_NOTRAILERS = 32, -IFF_RUNNING = 64, -IFF_NOARP = 128, -IFF_PROMISC = 256, -IFF_ALLMULTI = 512, -IFF_MASTER = 1024, -IFF_SLAVE = 2048, -IFF_MULTICAST = 4096, -IFF_PORTSEL = 8192, -IFF_AUTOMEDIA = 16384, -IFF_DYNAMIC = 32768, -IFF_LOWER_UP = 65536, -IFF_DORMANT = 131072, -IFF_ECHO = 262144, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_7 { -IF_OPER_UNKNOWN = 0, -IF_OPER_NOTPRESENT = 1, -IF_OPER_DOWN = 2, -IF_OPER_LOWERLAYERDOWN = 3, -IF_OPER_TESTING = 4, -IF_OPER_DORMANT = 5, -IF_OPER_UP = 6, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_8 { -IF_LINK_MODE_DEFAULT = 0, -IF_LINK_MODE_DORMANT = 1, -IF_LINK_MODE_TESTING = 2, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_inet_hooks { -NF_INET_PRE_ROUTING = 0, -NF_INET_LOCAL_IN = 1, -NF_INET_FORWARD = 2, -NF_INET_LOCAL_OUT = 3, -NF_INET_POST_ROUTING = 4, -NF_INET_NUMHOOKS = 5, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_dev_hooks { -NF_NETDEV_INGRESS = 0, -NF_NETDEV_EGRESS = 1, -NF_NETDEV_NUMHOOKS = 2, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_9 { -NFPROTO_UNSPEC = 0, -NFPROTO_INET = 1, -NFPROTO_IPV4 = 2, -NFPROTO_ARP = 3, -NFPROTO_NETDEV = 5, -NFPROTO_BRIDGE = 7, -NFPROTO_IPV6 = 10, -NFPROTO_DECNET = 12, -NFPROTO_NUMPROTO = 13, -} -#[repr(i32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_ip6_hook_priorities { -NF_IP6_PRI_FIRST = -2147483648, -NF_IP6_PRI_RAW_BEFORE_DEFRAG = -450, -NF_IP6_PRI_CONNTRACK_DEFRAG = -400, -NF_IP6_PRI_RAW = -300, -NF_IP6_PRI_SELINUX_FIRST = -225, -NF_IP6_PRI_CONNTRACK = -200, -NF_IP6_PRI_MANGLE = -150, -NF_IP6_PRI_NAT_DST = -100, -NF_IP6_PRI_FILTER = 0, -NF_IP6_PRI_SECURITY = 50, -NF_IP6_PRI_NAT_SRC = 100, -NF_IP6_PRI_SELINUX_LAST = 225, -NF_IP6_PRI_CONNTRACK_HELPER = 300, -NF_IP6_PRI_LAST = 2147483647, -} -#[repr(i32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_ip_hook_priorities { -NF_IP_PRI_FIRST = -2147483648, -NF_IP_PRI_RAW_BEFORE_DEFRAG = -450, -NF_IP_PRI_CONNTRACK_DEFRAG = -400, -NF_IP_PRI_RAW = -300, -NF_IP_PRI_SELINUX_FIRST = -225, -NF_IP_PRI_CONNTRACK = -200, -NF_IP_PRI_MANGLE = -150, -NF_IP_PRI_NAT_DST = -100, -NF_IP_PRI_FILTER = 0, -NF_IP_PRI_SECURITY = 50, -NF_IP_PRI_NAT_SRC = 100, -NF_IP_PRI_SELINUX_LAST = 225, -NF_IP_PRI_CONNTRACK_HELPER = 300, -NF_IP_PRI_CONNTRACK_CONFIRM = 2147483647, -} #[repr(C)] #[derive(Copy, Clone)] pub union __kernel_sockaddr_storage__bindgen_ty_1 { @@ -1962,69 +1441,6 @@ pub hdr: tcphdr, pub words: [__be32; 5usize], } -#[repr(C)] -#[derive(Copy, Clone)] -pub union if_settings__bindgen_ty_1 { -pub raw_hdlc: *mut raw_hdlc_proto, -pub cisco: *mut cisco_proto, -pub fr: *mut fr_proto, -pub fr_pvc: *mut fr_proto_pvc, -pub fr_pvc_info: *mut fr_proto_pvc_info, -pub x25: *mut x25_hdlc_proto, -pub sync: *mut sync_serial_settings, -pub te1: *mut te1_settings, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ifreq__bindgen_ty_1 { -pub ifrn_name: [crate::ctypes::c_char; 16usize], -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ifreq__bindgen_ty_2 { -pub ifru_addr: sockaddr, -pub ifru_dstaddr: sockaddr, -pub ifru_broadaddr: sockaddr, -pub ifru_netmask: sockaddr, -pub ifru_hwaddr: sockaddr, -pub ifru_flags: crate::ctypes::c_short, -pub ifru_ivalue: crate::ctypes::c_int, -pub ifru_mtu: crate::ctypes::c_int, -pub ifru_map: ifmap, -pub ifru_slave: [crate::ctypes::c_char; 16usize], -pub ifru_newname: [crate::ctypes::c_char; 16usize], -pub ifru_data: *mut crate::ctypes::c_void, -pub ifru_settings: if_settings, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ifconf__bindgen_ty_1 { -pub ifcu_buf: *mut crate::ctypes::c_char, -pub ifcu_req: *mut ifreq, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union nf_inet_addr { -pub all: [__u32; 4usize], -pub ip: __be32, -pub ip6: [__be32; 4usize], -pub in_: in_addr, -pub in6: in6_addr, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union xt_entry_match__bindgen_ty_1 { -pub user: xt_entry_match__bindgen_ty_1__bindgen_ty_1, -pub kernel: xt_entry_match__bindgen_ty_1__bindgen_ty_2, -pub match_size: __u16, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union xt_entry_target__bindgen_ty_1 { -pub user: xt_entry_target__bindgen_ty_1__bindgen_ty_1, -pub kernel: xt_entry_target__bindgen_ty_1__bindgen_ty_2, -pub target_size: __u16, -} impl __BindgenBitfieldUnit { #[inline] pub const fn new(storage: Storage) -> Self { @@ -2450,9 +1866,3 @@ __bindgen_bitfield_unit } } -impl nf_inet_hooks { -pub const NF_INET_INGRESS: nf_inet_hooks = nf_inet_hooks::NF_INET_NUMHOOKS; -} -impl nf_ip_hook_priorities { -pub const NF_IP_PRI_LAST: nf_ip_hook_priorities = nf_ip_hook_priorities::NF_IP_PRI_CONNTRACK_CONFIRM; -} diff -Nru temporalio-1.3.0/vendor/linux-raw-sys/src/mips32r6/prctl.rs temporalio-1.3.0/vendor/linux-raw-sys/src/mips32r6/prctl.rs --- temporalio-1.3.0/vendor/linux-raw-sys/src/mips32r6/prctl.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/linux-raw-sys/src/mips32r6/prctl.rs 2023-10-30 19:40:00.000000000 +0000 @@ -229,3 +229,6 @@ pub const PR_GET_MDWE: u32 = 66; pub const PR_SET_VMA: u32 = 1398164801; pub const PR_SET_VMA_ANON_NAME: u32 = 0; +pub const PR_GET_AUXV: u32 = 1096112214; +pub const PR_SET_MEMORY_MERGE: u32 = 67; +pub const PR_GET_MEMORY_MERGE: u32 = 68; diff -Nru temporalio-1.3.0/vendor/linux-raw-sys/src/mips64/general.rs temporalio-1.3.0/vendor/linux-raw-sys/src/mips64/general.rs --- temporalio-1.3.0/vendor/linux-raw-sys/src/mips64/general.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/linux-raw-sys/src/mips64/general.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1606,19 +1606,6 @@ pub const GRND_NONBLOCK: u32 = 1; pub const GRND_RANDOM: u32 = 2; pub const GRND_INSECURE: u32 = 4; -pub const LINUX_REBOOT_MAGIC1: u32 = 4276215469; -pub const LINUX_REBOOT_MAGIC2: u32 = 672274793; -pub const LINUX_REBOOT_MAGIC2A: u32 = 85072278; -pub const LINUX_REBOOT_MAGIC2B: u32 = 369367448; -pub const LINUX_REBOOT_MAGIC2C: u32 = 537993216; -pub const LINUX_REBOOT_CMD_RESTART: u32 = 19088743; -pub const LINUX_REBOOT_CMD_HALT: u32 = 3454992675; -pub const LINUX_REBOOT_CMD_CAD_ON: u32 = 2309737967; -pub const LINUX_REBOOT_CMD_CAD_OFF: u32 = 0; -pub const LINUX_REBOOT_CMD_POWER_OFF: u32 = 1126301404; -pub const LINUX_REBOOT_CMD_RESTART2: u32 = 2712847316; -pub const LINUX_REBOOT_CMD_SW_SUSPEND: u32 = 3489725666; -pub const LINUX_REBOOT_CMD_KEXEC: u32 = 1163412803; pub const ITIMER_REAL: u32 = 0; pub const ITIMER_VIRTUAL: u32 = 1; pub const ITIMER_PROF: u32 = 2; diff -Nru temporalio-1.3.0/vendor/linux-raw-sys/src/mips64/net.rs temporalio-1.3.0/vendor/linux-raw-sys/src/mips64/net.rs --- temporalio-1.3.0/vendor/linux-raw-sys/src/mips64/net.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/linux-raw-sys/src/mips64/net.rs 2023-10-30 19:40:00.000000000 +0000 @@ -476,255 +476,6 @@ } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct sync_serial_settings { -pub clock_rate: crate::ctypes::c_uint, -pub clock_type: crate::ctypes::c_uint, -pub loopback: crate::ctypes::c_ushort, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct te1_settings { -pub clock_rate: crate::ctypes::c_uint, -pub clock_type: crate::ctypes::c_uint, -pub loopback: crate::ctypes::c_ushort, -pub slot_map: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct raw_hdlc_proto { -pub encoding: crate::ctypes::c_ushort, -pub parity: crate::ctypes::c_ushort, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fr_proto { -pub t391: crate::ctypes::c_uint, -pub t392: crate::ctypes::c_uint, -pub n391: crate::ctypes::c_uint, -pub n392: crate::ctypes::c_uint, -pub n393: crate::ctypes::c_uint, -pub lmi: crate::ctypes::c_ushort, -pub dce: crate::ctypes::c_ushort, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fr_proto_pvc { -pub dlci: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fr_proto_pvc_info { -pub dlci: crate::ctypes::c_uint, -pub master: [crate::ctypes::c_char; 16usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct cisco_proto { -pub interval: crate::ctypes::c_uint, -pub timeout: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct x25_hdlc_proto { -pub dce: crate::ctypes::c_ushort, -pub modulo: crate::ctypes::c_uint, -pub window: crate::ctypes::c_uint, -pub t1: crate::ctypes::c_uint, -pub t2: crate::ctypes::c_uint, -pub n2: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ifmap { -pub mem_start: crate::ctypes::c_ulong, -pub mem_end: crate::ctypes::c_ulong, -pub base_addr: crate::ctypes::c_ushort, -pub irq: crate::ctypes::c_uchar, -pub dma: crate::ctypes::c_uchar, -pub port: crate::ctypes::c_uchar, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct if_settings { -pub type_: crate::ctypes::c_uint, -pub size: crate::ctypes::c_uint, -pub ifs_ifsu: if_settings__bindgen_ty_1, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ifreq { -pub ifr_ifrn: ifreq__bindgen_ty_1, -pub ifr_ifru: ifreq__bindgen_ty_2, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ifconf { -pub ifc_len: crate::ctypes::c_int, -pub ifc_ifcu: ifconf__bindgen_ty_1, -} -#[repr(C)] -pub struct xt_entry_match { -pub u: xt_entry_match__bindgen_ty_1, -pub data: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_match__bindgen_ty_1__bindgen_ty_1 { -pub match_size: __u16, -pub name: [crate::ctypes::c_char; 29usize], -pub revision: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_match__bindgen_ty_1__bindgen_ty_2 { -pub match_size: __u16, -pub match_: *mut xt_match, -} -#[repr(C)] -pub struct xt_entry_target { -pub u: xt_entry_target__bindgen_ty_1, -pub data: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_target__bindgen_ty_1__bindgen_ty_1 { -pub target_size: __u16, -pub name: [crate::ctypes::c_char; 29usize], -pub revision: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_target__bindgen_ty_1__bindgen_ty_2 { -pub target_size: __u16, -pub target: *mut xt_target, -} -#[repr(C)] -pub struct xt_standard_target { -pub target: xt_entry_target, -pub verdict: crate::ctypes::c_int, -} -#[repr(C)] -pub struct xt_error_target { -pub target: xt_entry_target, -pub errorname: [crate::ctypes::c_char; 30usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_get_revision { -pub name: [crate::ctypes::c_char; 29usize], -pub revision: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct _xt_align { -pub u8_: __u8, -pub u16_: __u16, -pub u32_: __u32, -pub u64_: __u64, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_counters { -pub pcnt: __u64, -pub bcnt: __u64, -} -#[repr(C)] -#[derive(Debug)] -pub struct xt_counters_info { -pub name: [crate::ctypes::c_char; 32usize], -pub num_counters: crate::ctypes::c_uint, -pub counters: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_tcp { -pub spts: [__u16; 2usize], -pub dpts: [__u16; 2usize], -pub option: __u8, -pub flg_mask: __u8, -pub flg_cmp: __u8, -pub invflags: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_udp { -pub spts: [__u16; 2usize], -pub dpts: [__u16; 2usize], -pub invflags: __u8, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ip6t_ip6 { -pub src: in6_addr, -pub dst: in6_addr, -pub smsk: in6_addr, -pub dmsk: in6_addr, -pub iniface: [crate::ctypes::c_char; 16usize], -pub outiface: [crate::ctypes::c_char; 16usize], -pub iniface_mask: [crate::ctypes::c_uchar; 16usize], -pub outiface_mask: [crate::ctypes::c_uchar; 16usize], -pub proto: __u16, -pub tos: __u8, -pub flags: __u8, -pub invflags: __u8, -} -#[repr(C)] -pub struct ip6t_entry { -pub ipv6: ip6t_ip6, -pub nfcache: crate::ctypes::c_uint, -pub target_offset: __u16, -pub next_offset: __u16, -pub comefrom: crate::ctypes::c_uint, -pub counters: xt_counters, -pub elems: __IncompleteArrayField, -} -#[repr(C)] -pub struct ip6t_standard { -pub entry: ip6t_entry, -pub target: xt_standard_target, -} -#[repr(C)] -pub struct ip6t_error { -pub entry: ip6t_entry, -pub target: xt_error_target, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ip6t_icmp { -pub type_: __u8, -pub code: [__u8; 2usize], -pub invflags: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ip6t_getinfo { -pub name: [crate::ctypes::c_char; 32usize], -pub valid_hooks: crate::ctypes::c_uint, -pub hook_entry: [crate::ctypes::c_uint; 5usize], -pub underflow: [crate::ctypes::c_uint; 5usize], -pub num_entries: crate::ctypes::c_uint, -pub size: crate::ctypes::c_uint, -} -#[repr(C)] -pub struct ip6t_replace { -pub name: [crate::ctypes::c_char; 32usize], -pub valid_hooks: crate::ctypes::c_uint, -pub num_entries: crate::ctypes::c_uint, -pub size: crate::ctypes::c_uint, -pub hook_entry: [crate::ctypes::c_uint; 5usize], -pub underflow: [crate::ctypes::c_uint; 5usize], -pub num_counters: crate::ctypes::c_uint, -pub counters: *mut xt_counters, -pub entries: __IncompleteArrayField, -} -#[repr(C)] -pub struct ip6t_get_entries { -pub name: [crate::ctypes::c_char; 32usize], -pub size: crate::ctypes::c_uint, -pub entrytable: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] pub struct linger { pub l_onoff: crate::ctypes::c_int, pub l_linger: crate::ctypes::c_int, @@ -762,16 +513,6 @@ } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct xt_match { -pub _address: u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_target { -pub _address: u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] pub struct iovec { pub _address: u8, } @@ -1225,135 +966,6 @@ pub const TCP_MD5SIG_FLAG_IFINDEX: u32 = 2; pub const TCP_RECEIVE_ZEROCOPY_FLAG_TLB_CLEAN_HINT: u32 = 1; pub const UNIX_PATH_MAX: u32 = 108; -pub const IFNAMSIZ: u32 = 16; -pub const IFALIASZ: u32 = 256; -pub const ALTIFNAMSIZ: u32 = 128; -pub const GENERIC_HDLC_VERSION: u32 = 4; -pub const CLOCK_DEFAULT: u32 = 0; -pub const CLOCK_EXT: u32 = 1; -pub const CLOCK_INT: u32 = 2; -pub const CLOCK_TXINT: u32 = 3; -pub const CLOCK_TXFROMRX: u32 = 4; -pub const ENCODING_DEFAULT: u32 = 0; -pub const ENCODING_NRZ: u32 = 1; -pub const ENCODING_NRZI: u32 = 2; -pub const ENCODING_FM_MARK: u32 = 3; -pub const ENCODING_FM_SPACE: u32 = 4; -pub const ENCODING_MANCHESTER: u32 = 5; -pub const PARITY_DEFAULT: u32 = 0; -pub const PARITY_NONE: u32 = 1; -pub const PARITY_CRC16_PR0: u32 = 2; -pub const PARITY_CRC16_PR1: u32 = 3; -pub const PARITY_CRC16_PR0_CCITT: u32 = 4; -pub const PARITY_CRC16_PR1_CCITT: u32 = 5; -pub const PARITY_CRC32_PR0_CCITT: u32 = 6; -pub const PARITY_CRC32_PR1_CCITT: u32 = 7; -pub const LMI_DEFAULT: u32 = 0; -pub const LMI_NONE: u32 = 1; -pub const LMI_ANSI: u32 = 2; -pub const LMI_CCITT: u32 = 3; -pub const LMI_CISCO: u32 = 4; -pub const IF_GET_IFACE: u32 = 1; -pub const IF_GET_PROTO: u32 = 2; -pub const IF_IFACE_V35: u32 = 4096; -pub const IF_IFACE_V24: u32 = 4097; -pub const IF_IFACE_X21: u32 = 4098; -pub const IF_IFACE_T1: u32 = 4099; -pub const IF_IFACE_E1: u32 = 4100; -pub const IF_IFACE_SYNC_SERIAL: u32 = 4101; -pub const IF_IFACE_X21D: u32 = 4102; -pub const IF_PROTO_HDLC: u32 = 8192; -pub const IF_PROTO_PPP: u32 = 8193; -pub const IF_PROTO_CISCO: u32 = 8194; -pub const IF_PROTO_FR: u32 = 8195; -pub const IF_PROTO_FR_ADD_PVC: u32 = 8196; -pub const IF_PROTO_FR_DEL_PVC: u32 = 8197; -pub const IF_PROTO_X25: u32 = 8198; -pub const IF_PROTO_HDLC_ETH: u32 = 8199; -pub const IF_PROTO_FR_ADD_ETH_PVC: u32 = 8200; -pub const IF_PROTO_FR_DEL_ETH_PVC: u32 = 8201; -pub const IF_PROTO_FR_PVC: u32 = 8202; -pub const IF_PROTO_FR_ETH_PVC: u32 = 8203; -pub const IF_PROTO_RAW: u32 = 8204; -pub const IFHWADDRLEN: u32 = 6; -pub const NF_DROP: u32 = 0; -pub const NF_ACCEPT: u32 = 1; -pub const NF_STOLEN: u32 = 2; -pub const NF_QUEUE: u32 = 3; -pub const NF_REPEAT: u32 = 4; -pub const NF_STOP: u32 = 5; -pub const NF_MAX_VERDICT: u32 = 5; -pub const NF_VERDICT_MASK: u32 = 255; -pub const NF_VERDICT_FLAG_QUEUE_BYPASS: u32 = 32768; -pub const NF_VERDICT_QMASK: u32 = 4294901760; -pub const NF_VERDICT_QBITS: u32 = 16; -pub const NF_VERDICT_BITS: u32 = 16; -pub const NF_IP6_PRE_ROUTING: u32 = 0; -pub const NF_IP6_LOCAL_IN: u32 = 1; -pub const NF_IP6_FORWARD: u32 = 2; -pub const NF_IP6_LOCAL_OUT: u32 = 3; -pub const NF_IP6_POST_ROUTING: u32 = 4; -pub const NF_IP6_NUMHOOKS: u32 = 5; -pub const XT_FUNCTION_MAXNAMELEN: u32 = 30; -pub const XT_EXTENSION_MAXNAMELEN: u32 = 29; -pub const XT_TABLE_MAXNAMELEN: u32 = 32; -pub const XT_CONTINUE: u32 = 4294967295; -pub const XT_RETURN: i32 = -5; -pub const XT_STANDARD_TARGET: &[u8; 1] = b"\0"; -pub const XT_ERROR_TARGET: &[u8; 6] = b"ERROR\0"; -pub const XT_INV_PROTO: u32 = 64; -pub const IP6T_FUNCTION_MAXNAMELEN: u32 = 30; -pub const IP6T_TABLE_MAXNAMELEN: u32 = 32; -pub const IP6T_CONTINUE: u32 = 4294967295; -pub const IP6T_RETURN: i32 = -5; -pub const XT_TCP_INV_SRCPT: u32 = 1; -pub const XT_TCP_INV_DSTPT: u32 = 2; -pub const XT_TCP_INV_FLAGS: u32 = 4; -pub const XT_TCP_INV_OPTION: u32 = 8; -pub const XT_TCP_INV_MASK: u32 = 15; -pub const XT_UDP_INV_SRCPT: u32 = 1; -pub const XT_UDP_INV_DSTPT: u32 = 2; -pub const XT_UDP_INV_MASK: u32 = 3; -pub const IP6T_TCP_INV_SRCPT: u32 = 1; -pub const IP6T_TCP_INV_DSTPT: u32 = 2; -pub const IP6T_TCP_INV_FLAGS: u32 = 4; -pub const IP6T_TCP_INV_OPTION: u32 = 8; -pub const IP6T_TCP_INV_MASK: u32 = 15; -pub const IP6T_UDP_INV_SRCPT: u32 = 1; -pub const IP6T_UDP_INV_DSTPT: u32 = 2; -pub const IP6T_UDP_INV_MASK: u32 = 3; -pub const IP6T_STANDARD_TARGET: &[u8; 1] = b"\0"; -pub const IP6T_ERROR_TARGET: &[u8; 6] = b"ERROR\0"; -pub const IP6T_F_PROTO: u32 = 1; -pub const IP6T_F_TOS: u32 = 2; -pub const IP6T_F_GOTO: u32 = 4; -pub const IP6T_F_MASK: u32 = 7; -pub const IP6T_INV_VIA_IN: u32 = 1; -pub const IP6T_INV_VIA_OUT: u32 = 2; -pub const IP6T_INV_TOS: u32 = 4; -pub const IP6T_INV_SRCIP: u32 = 8; -pub const IP6T_INV_DSTIP: u32 = 16; -pub const IP6T_INV_FRAG: u32 = 32; -pub const IP6T_INV_PROTO: u32 = 64; -pub const IP6T_INV_MASK: u32 = 127; -pub const IP6T_BASE_CTL: u32 = 64; -pub const IP6T_SO_SET_REPLACE: u32 = 64; -pub const IP6T_SO_SET_ADD_COUNTERS: u32 = 65; -pub const IP6T_SO_SET_MAX: u32 = 65; -pub const IP6T_SO_GET_INFO: u32 = 64; -pub const IP6T_SO_GET_ENTRIES: u32 = 65; -pub const IP6T_SO_GET_REVISION_MATCH: u32 = 68; -pub const IP6T_SO_GET_REVISION_TARGET: u32 = 69; -pub const IP6T_SO_GET_MAX: u32 = 69; -pub const IP6T_SO_ORIGINAL_DST: u32 = 80; -pub const IP6T_ICMP_INV: u32 = 1; -pub const NF_IP_PRE_ROUTING: u32 = 0; -pub const NF_IP_LOCAL_IN: u32 = 1; -pub const NF_IP_FORWARD: u32 = 2; -pub const NF_IP_LOCAL_OUT: u32 = 3; -pub const NF_IP_POST_ROUTING: u32 = 4; -pub const NF_IP_NUMHOOKS: u32 = 5; -pub const SO_ORIGINAL_DST: u32 = 80; pub const SHUT_RD: u32 = 0; pub const SHUT_WR: u32 = 1; pub const SHUT_RDWR: u32 = 2; @@ -1582,25 +1194,6 @@ pub const TCP_NLA_EDT: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_EDT; pub const TCP_NLA_TTL: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_TTL; pub const TCP_NLA_REHASH: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_REHASH; -pub const IF_OPER_UNKNOWN: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_UNKNOWN; -pub const IF_OPER_NOTPRESENT: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_NOTPRESENT; -pub const IF_OPER_DOWN: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_DOWN; -pub const IF_OPER_LOWERLAYERDOWN: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_LOWERLAYERDOWN; -pub const IF_OPER_TESTING: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_TESTING; -pub const IF_OPER_DORMANT: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_DORMANT; -pub const IF_OPER_UP: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_UP; -pub const IF_LINK_MODE_DEFAULT: _bindgen_ty_8 = _bindgen_ty_8::IF_LINK_MODE_DEFAULT; -pub const IF_LINK_MODE_DORMANT: _bindgen_ty_8 = _bindgen_ty_8::IF_LINK_MODE_DORMANT; -pub const IF_LINK_MODE_TESTING: _bindgen_ty_8 = _bindgen_ty_8::IF_LINK_MODE_TESTING; -pub const NFPROTO_UNSPEC: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_UNSPEC; -pub const NFPROTO_INET: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_INET; -pub const NFPROTO_IPV4: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_IPV4; -pub const NFPROTO_ARP: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_ARP; -pub const NFPROTO_NETDEV: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_NETDEV; -pub const NFPROTO_BRIDGE: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_BRIDGE; -pub const NFPROTO_IPV6: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_IPV6; -pub const NFPROTO_DECNET: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_DECNET; -pub const NFPROTO_NUMPROTO: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_NUMPROTO; #[repr(u32)] #[non_exhaustive] #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] @@ -1824,121 +1417,6 @@ TCP_NLA_TTL = 26, TCP_NLA_REHASH = 27, } -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum net_device_flags { -IFF_UP = 1, -IFF_BROADCAST = 2, -IFF_DEBUG = 4, -IFF_LOOPBACK = 8, -IFF_POINTOPOINT = 16, -IFF_NOTRAILERS = 32, -IFF_RUNNING = 64, -IFF_NOARP = 128, -IFF_PROMISC = 256, -IFF_ALLMULTI = 512, -IFF_MASTER = 1024, -IFF_SLAVE = 2048, -IFF_MULTICAST = 4096, -IFF_PORTSEL = 8192, -IFF_AUTOMEDIA = 16384, -IFF_DYNAMIC = 32768, -IFF_LOWER_UP = 65536, -IFF_DORMANT = 131072, -IFF_ECHO = 262144, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_7 { -IF_OPER_UNKNOWN = 0, -IF_OPER_NOTPRESENT = 1, -IF_OPER_DOWN = 2, -IF_OPER_LOWERLAYERDOWN = 3, -IF_OPER_TESTING = 4, -IF_OPER_DORMANT = 5, -IF_OPER_UP = 6, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_8 { -IF_LINK_MODE_DEFAULT = 0, -IF_LINK_MODE_DORMANT = 1, -IF_LINK_MODE_TESTING = 2, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_inet_hooks { -NF_INET_PRE_ROUTING = 0, -NF_INET_LOCAL_IN = 1, -NF_INET_FORWARD = 2, -NF_INET_LOCAL_OUT = 3, -NF_INET_POST_ROUTING = 4, -NF_INET_NUMHOOKS = 5, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_dev_hooks { -NF_NETDEV_INGRESS = 0, -NF_NETDEV_EGRESS = 1, -NF_NETDEV_NUMHOOKS = 2, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_9 { -NFPROTO_UNSPEC = 0, -NFPROTO_INET = 1, -NFPROTO_IPV4 = 2, -NFPROTO_ARP = 3, -NFPROTO_NETDEV = 5, -NFPROTO_BRIDGE = 7, -NFPROTO_IPV6 = 10, -NFPROTO_DECNET = 12, -NFPROTO_NUMPROTO = 13, -} -#[repr(i32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_ip6_hook_priorities { -NF_IP6_PRI_FIRST = -2147483648, -NF_IP6_PRI_RAW_BEFORE_DEFRAG = -450, -NF_IP6_PRI_CONNTRACK_DEFRAG = -400, -NF_IP6_PRI_RAW = -300, -NF_IP6_PRI_SELINUX_FIRST = -225, -NF_IP6_PRI_CONNTRACK = -200, -NF_IP6_PRI_MANGLE = -150, -NF_IP6_PRI_NAT_DST = -100, -NF_IP6_PRI_FILTER = 0, -NF_IP6_PRI_SECURITY = 50, -NF_IP6_PRI_NAT_SRC = 100, -NF_IP6_PRI_SELINUX_LAST = 225, -NF_IP6_PRI_CONNTRACK_HELPER = 300, -NF_IP6_PRI_LAST = 2147483647, -} -#[repr(i32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_ip_hook_priorities { -NF_IP_PRI_FIRST = -2147483648, -NF_IP_PRI_RAW_BEFORE_DEFRAG = -450, -NF_IP_PRI_CONNTRACK_DEFRAG = -400, -NF_IP_PRI_RAW = -300, -NF_IP_PRI_SELINUX_FIRST = -225, -NF_IP_PRI_CONNTRACK = -200, -NF_IP_PRI_MANGLE = -150, -NF_IP_PRI_NAT_DST = -100, -NF_IP_PRI_FILTER = 0, -NF_IP_PRI_SECURITY = 50, -NF_IP_PRI_NAT_SRC = 100, -NF_IP_PRI_SELINUX_LAST = 225, -NF_IP_PRI_CONNTRACK_HELPER = 300, -NF_IP_PRI_CONNTRACK_CONFIRM = 2147483647, -} #[repr(C)] #[derive(Copy, Clone)] pub union __kernel_sockaddr_storage__bindgen_ty_1 { @@ -1970,69 +1448,6 @@ pub hdr: tcphdr, pub words: [__be32; 5usize], } -#[repr(C)] -#[derive(Copy, Clone)] -pub union if_settings__bindgen_ty_1 { -pub raw_hdlc: *mut raw_hdlc_proto, -pub cisco: *mut cisco_proto, -pub fr: *mut fr_proto, -pub fr_pvc: *mut fr_proto_pvc, -pub fr_pvc_info: *mut fr_proto_pvc_info, -pub x25: *mut x25_hdlc_proto, -pub sync: *mut sync_serial_settings, -pub te1: *mut te1_settings, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ifreq__bindgen_ty_1 { -pub ifrn_name: [crate::ctypes::c_char; 16usize], -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ifreq__bindgen_ty_2 { -pub ifru_addr: sockaddr, -pub ifru_dstaddr: sockaddr, -pub ifru_broadaddr: sockaddr, -pub ifru_netmask: sockaddr, -pub ifru_hwaddr: sockaddr, -pub ifru_flags: crate::ctypes::c_short, -pub ifru_ivalue: crate::ctypes::c_int, -pub ifru_mtu: crate::ctypes::c_int, -pub ifru_map: ifmap, -pub ifru_slave: [crate::ctypes::c_char; 16usize], -pub ifru_newname: [crate::ctypes::c_char; 16usize], -pub ifru_data: *mut crate::ctypes::c_void, -pub ifru_settings: if_settings, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ifconf__bindgen_ty_1 { -pub ifcu_buf: *mut crate::ctypes::c_char, -pub ifcu_req: *mut ifreq, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union nf_inet_addr { -pub all: [__u32; 4usize], -pub ip: __be32, -pub ip6: [__be32; 4usize], -pub in_: in_addr, -pub in6: in6_addr, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union xt_entry_match__bindgen_ty_1 { -pub user: xt_entry_match__bindgen_ty_1__bindgen_ty_1, -pub kernel: xt_entry_match__bindgen_ty_1__bindgen_ty_2, -pub match_size: __u16, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union xt_entry_target__bindgen_ty_1 { -pub user: xt_entry_target__bindgen_ty_1__bindgen_ty_1, -pub kernel: xt_entry_target__bindgen_ty_1__bindgen_ty_2, -pub target_size: __u16, -} impl __BindgenBitfieldUnit { #[inline] pub const fn new(storage: Storage) -> Self { @@ -2458,9 +1873,3 @@ __bindgen_bitfield_unit } } -impl nf_inet_hooks { -pub const NF_INET_INGRESS: nf_inet_hooks = nf_inet_hooks::NF_INET_NUMHOOKS; -} -impl nf_ip_hook_priorities { -pub const NF_IP_PRI_LAST: nf_ip_hook_priorities = nf_ip_hook_priorities::NF_IP_PRI_CONNTRACK_CONFIRM; -} diff -Nru temporalio-1.3.0/vendor/linux-raw-sys/src/mips64r6/general.rs temporalio-1.3.0/vendor/linux-raw-sys/src/mips64r6/general.rs --- temporalio-1.3.0/vendor/linux-raw-sys/src/mips64r6/general.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/linux-raw-sys/src/mips64r6/general.rs 2023-10-30 19:40:00.000000000 +0000 @@ -882,9 +882,9 @@ pub sa_flags: crate::ctypes::c_ulong, pub sa_mask: kernel_sigset_t, } -pub const LINUX_VERSION_CODE: u32 = 393984; +pub const LINUX_VERSION_CODE: u32 = 394240; pub const LINUX_VERSION_MAJOR: u32 = 6; -pub const LINUX_VERSION_PATCHLEVEL: u32 = 3; +pub const LINUX_VERSION_PATCHLEVEL: u32 = 4; pub const LINUX_VERSION_SUBLEVEL: u32 = 0; pub const AT_SYSINFO_EHDR: u32 = 33; pub const AT_VECTOR_SIZE_ARCH: u32 = 1; @@ -1015,7 +1015,6 @@ pub const O_PATH: u32 = 2097152; pub const __O_TMPFILE: u32 = 4194304; pub const O_TMPFILE: u32 = 4259840; -pub const O_TMPFILE_MASK: u32 = 4260096; pub const O_NDELAY: u32 = 128; pub const F_DUPFD: u32 = 0; pub const F_GETFD: u32 = 1; @@ -1606,19 +1605,6 @@ pub const GRND_NONBLOCK: u32 = 1; pub const GRND_RANDOM: u32 = 2; pub const GRND_INSECURE: u32 = 4; -pub const LINUX_REBOOT_MAGIC1: u32 = 4276215469; -pub const LINUX_REBOOT_MAGIC2: u32 = 672274793; -pub const LINUX_REBOOT_MAGIC2A: u32 = 85072278; -pub const LINUX_REBOOT_MAGIC2B: u32 = 369367448; -pub const LINUX_REBOOT_MAGIC2C: u32 = 537993216; -pub const LINUX_REBOOT_CMD_RESTART: u32 = 19088743; -pub const LINUX_REBOOT_CMD_HALT: u32 = 3454992675; -pub const LINUX_REBOOT_CMD_CAD_ON: u32 = 2309737967; -pub const LINUX_REBOOT_CMD_CAD_OFF: u32 = 0; -pub const LINUX_REBOOT_CMD_POWER_OFF: u32 = 1126301404; -pub const LINUX_REBOOT_CMD_RESTART2: u32 = 2712847316; -pub const LINUX_REBOOT_CMD_SW_SUSPEND: u32 = 3489725666; -pub const LINUX_REBOOT_CMD_KEXEC: u32 = 1163412803; pub const ITIMER_REAL: u32 = 0; pub const ITIMER_VIRTUAL: u32 = 1; pub const ITIMER_PROF: u32 = 2; @@ -2674,6 +2660,7 @@ pub const UFFD_FEATURE_MINOR_SHMEM: u32 = 1024; pub const UFFD_FEATURE_EXACT_ADDRESS: u32 = 2048; pub const UFFD_FEATURE_WP_HUGETLBFS_SHMEM: u32 = 4096; +pub const UFFD_FEATURE_WP_UNPOPULATED: u32 = 8192; pub const UFFD_USER_MODE_ONLY: u32 = 1; pub const DT_UNKNOWN: u32 = 0; pub const DT_FIFO: u32 = 1; diff -Nru temporalio-1.3.0/vendor/linux-raw-sys/src/mips64r6/io_uring.rs temporalio-1.3.0/vendor/linux-raw-sys/src/mips64r6/io_uring.rs --- temporalio-1.3.0/vendor/linux-raw-sys/src/mips64r6/io_uring.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/linux-raw-sys/src/mips64r6/io_uring.rs 2023-10-30 19:40:00.000000000 +0000 @@ -350,21 +350,6 @@ } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct io_uring_notification_slot { -pub tag: __u64, -pub resv: [__u64; 3usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct io_uring_notification_register { -pub nr_slots: __u32, -pub resv: __u32, -pub resv2: __u64, -pub data: __u64, -pub resv3: __u64, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] pub struct io_uring_probe_op { pub op: __u8, pub resv: __u8, @@ -429,7 +414,7 @@ pub ring_addr: __u64, pub ring_entries: __u32, pub bgid: __u16, -pub pad: __u16, +pub flags: __u16, pub resv: [__u64; 3usize], } #[repr(C)] @@ -713,6 +698,7 @@ pub const IORING_TIMEOUT_REALTIME: u32 = 8; pub const IORING_LINK_TIMEOUT_UPDATE: u32 = 16; pub const IORING_TIMEOUT_ETIME_SUCCESS: u32 = 32; +pub const IORING_TIMEOUT_MULTISHOT: u32 = 64; pub const IORING_TIMEOUT_CLOCK_MASK: u32 = 12; pub const IORING_TIMEOUT_UPDATE_MASK: u32 = 18; pub const SPLICE_F_FD_IN_FIXED: u32 = 2147483648; @@ -739,6 +725,9 @@ pub const IORING_OFF_SQ_RING: u32 = 0; pub const IORING_OFF_CQ_RING: u32 = 134217728; pub const IORING_OFF_SQES: u32 = 268435456; +pub const IORING_OFF_PBUF_RING: u32 = 2147483648; +pub const IORING_OFF_PBUF_SHIFT: u32 = 16; +pub const IORING_OFF_MMAP_MASK: u32 = 4160749568; pub const IORING_SQ_NEED_WAKEUP: u32 = 1; pub const IORING_SQ_CQ_OVERFLOW: u32 = 2; pub const IORING_SQ_TASKRUN: u32 = 4; @@ -805,11 +794,12 @@ pub const IORING_REGISTER_USE_REGISTERED_RING: _bindgen_ty_4 = _bindgen_ty_4::IORING_REGISTER_USE_REGISTERED_RING; pub const IO_WQ_BOUND: _bindgen_ty_5 = _bindgen_ty_5::IO_WQ_BOUND; pub const IO_WQ_UNBOUND: _bindgen_ty_5 = _bindgen_ty_5::IO_WQ_UNBOUND; -pub const IORING_RESTRICTION_REGISTER_OP: _bindgen_ty_6 = _bindgen_ty_6::IORING_RESTRICTION_REGISTER_OP; -pub const IORING_RESTRICTION_SQE_OP: _bindgen_ty_6 = _bindgen_ty_6::IORING_RESTRICTION_SQE_OP; -pub const IORING_RESTRICTION_SQE_FLAGS_ALLOWED: _bindgen_ty_6 = _bindgen_ty_6::IORING_RESTRICTION_SQE_FLAGS_ALLOWED; -pub const IORING_RESTRICTION_SQE_FLAGS_REQUIRED: _bindgen_ty_6 = _bindgen_ty_6::IORING_RESTRICTION_SQE_FLAGS_REQUIRED; -pub const IORING_RESTRICTION_LAST: _bindgen_ty_6 = _bindgen_ty_6::IORING_RESTRICTION_LAST; +pub const IOU_PBUF_RING_MMAP: _bindgen_ty_6 = _bindgen_ty_6::IOU_PBUF_RING_MMAP; +pub const IORING_RESTRICTION_REGISTER_OP: _bindgen_ty_7 = _bindgen_ty_7::IORING_RESTRICTION_REGISTER_OP; +pub const IORING_RESTRICTION_SQE_OP: _bindgen_ty_7 = _bindgen_ty_7::IORING_RESTRICTION_SQE_OP; +pub const IORING_RESTRICTION_SQE_FLAGS_ALLOWED: _bindgen_ty_7 = _bindgen_ty_7::IORING_RESTRICTION_SQE_FLAGS_ALLOWED; +pub const IORING_RESTRICTION_SQE_FLAGS_REQUIRED: _bindgen_ty_7 = _bindgen_ty_7::IORING_RESTRICTION_SQE_FLAGS_REQUIRED; +pub const IORING_RESTRICTION_LAST: _bindgen_ty_7 = _bindgen_ty_7::IORING_RESTRICTION_LAST; #[repr(u32)] #[non_exhaustive] #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] @@ -947,6 +937,12 @@ #[non_exhaustive] #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] pub enum _bindgen_ty_6 { +IOU_PBUF_RING_MMAP = 1, +} +#[repr(u32)] +#[non_exhaustive] +#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] +pub enum _bindgen_ty_7 { IORING_RESTRICTION_REGISTER_OP = 0, IORING_RESTRICTION_SQE_OP = 1, IORING_RESTRICTION_SQE_FLAGS_ALLOWED = 2, diff -Nru temporalio-1.3.0/vendor/linux-raw-sys/src/mips64r6/netlink.rs temporalio-1.3.0/vendor/linux-raw-sys/src/mips64r6/netlink.rs --- temporalio-1.3.0/vendor/linux-raw-sys/src/mips64r6/netlink.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/linux-raw-sys/src/mips64r6/netlink.rs 2023-10-30 19:40:00.000000000 +0000 @@ -943,6 +943,7 @@ pub const IFLA_BRPORT_MAB: _bindgen_ty_8 = _bindgen_ty_8::IFLA_BRPORT_MAB; pub const IFLA_BRPORT_MCAST_N_GROUPS: _bindgen_ty_8 = _bindgen_ty_8::IFLA_BRPORT_MCAST_N_GROUPS; pub const IFLA_BRPORT_MCAST_MAX_GROUPS: _bindgen_ty_8 = _bindgen_ty_8::IFLA_BRPORT_MCAST_MAX_GROUPS; +pub const IFLA_BRPORT_NEIGH_VLAN_SUPPRESS: _bindgen_ty_8 = _bindgen_ty_8::IFLA_BRPORT_NEIGH_VLAN_SUPPRESS; pub const __IFLA_BRPORT_MAX: _bindgen_ty_8 = _bindgen_ty_8::__IFLA_BRPORT_MAX; pub const IFLA_INFO_UNSPEC: _bindgen_ty_9 = _bindgen_ty_9::IFLA_INFO_UNSPEC; pub const IFLA_INFO_KIND: _bindgen_ty_9 = _bindgen_ty_9::IFLA_INFO_KIND; @@ -970,6 +971,7 @@ pub const IFLA_MACVLAN_MACADDR_COUNT: _bindgen_ty_12 = _bindgen_ty_12::IFLA_MACVLAN_MACADDR_COUNT; pub const IFLA_MACVLAN_BC_QUEUE_LEN: _bindgen_ty_12 = _bindgen_ty_12::IFLA_MACVLAN_BC_QUEUE_LEN; pub const IFLA_MACVLAN_BC_QUEUE_LEN_USED: _bindgen_ty_12 = _bindgen_ty_12::IFLA_MACVLAN_BC_QUEUE_LEN_USED; +pub const IFLA_MACVLAN_BC_CUTOFF: _bindgen_ty_12 = _bindgen_ty_12::IFLA_MACVLAN_BC_CUTOFF; pub const __IFLA_MACVLAN_MAX: _bindgen_ty_12 = _bindgen_ty_12::__IFLA_MACVLAN_MAX; pub const IFLA_VRF_UNSPEC: _bindgen_ty_13 = _bindgen_ty_13::IFLA_VRF_UNSPEC; pub const IFLA_VRF_TABLE: _bindgen_ty_13 = _bindgen_ty_13::IFLA_VRF_TABLE; @@ -1788,7 +1790,8 @@ IFLA_BRPORT_MAB = 40, IFLA_BRPORT_MCAST_N_GROUPS = 41, IFLA_BRPORT_MCAST_MAX_GROUPS = 42, -__IFLA_BRPORT_MAX = 43, +IFLA_BRPORT_NEIGH_VLAN_SUPPRESS = 43, +__IFLA_BRPORT_MAX = 44, } #[repr(u32)] #[non_exhaustive] @@ -1835,7 +1838,8 @@ IFLA_MACVLAN_MACADDR_COUNT = 6, IFLA_MACVLAN_BC_QUEUE_LEN = 7, IFLA_MACVLAN_BC_QUEUE_LEN_USED = 8, -__IFLA_MACVLAN_MAX = 9, +IFLA_MACVLAN_BC_CUTOFF = 9, +__IFLA_MACVLAN_MAX = 10, } #[repr(u32)] #[non_exhaustive] diff -Nru temporalio-1.3.0/vendor/linux-raw-sys/src/mips64r6/net.rs temporalio-1.3.0/vendor/linux-raw-sys/src/mips64r6/net.rs --- temporalio-1.3.0/vendor/linux-raw-sys/src/mips64r6/net.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/linux-raw-sys/src/mips64r6/net.rs 2023-10-30 19:40:00.000000000 +0000 @@ -476,255 +476,6 @@ } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct sync_serial_settings { -pub clock_rate: crate::ctypes::c_uint, -pub clock_type: crate::ctypes::c_uint, -pub loopback: crate::ctypes::c_ushort, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct te1_settings { -pub clock_rate: crate::ctypes::c_uint, -pub clock_type: crate::ctypes::c_uint, -pub loopback: crate::ctypes::c_ushort, -pub slot_map: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct raw_hdlc_proto { -pub encoding: crate::ctypes::c_ushort, -pub parity: crate::ctypes::c_ushort, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fr_proto { -pub t391: crate::ctypes::c_uint, -pub t392: crate::ctypes::c_uint, -pub n391: crate::ctypes::c_uint, -pub n392: crate::ctypes::c_uint, -pub n393: crate::ctypes::c_uint, -pub lmi: crate::ctypes::c_ushort, -pub dce: crate::ctypes::c_ushort, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fr_proto_pvc { -pub dlci: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fr_proto_pvc_info { -pub dlci: crate::ctypes::c_uint, -pub master: [crate::ctypes::c_char; 16usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct cisco_proto { -pub interval: crate::ctypes::c_uint, -pub timeout: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct x25_hdlc_proto { -pub dce: crate::ctypes::c_ushort, -pub modulo: crate::ctypes::c_uint, -pub window: crate::ctypes::c_uint, -pub t1: crate::ctypes::c_uint, -pub t2: crate::ctypes::c_uint, -pub n2: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ifmap { -pub mem_start: crate::ctypes::c_ulong, -pub mem_end: crate::ctypes::c_ulong, -pub base_addr: crate::ctypes::c_ushort, -pub irq: crate::ctypes::c_uchar, -pub dma: crate::ctypes::c_uchar, -pub port: crate::ctypes::c_uchar, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct if_settings { -pub type_: crate::ctypes::c_uint, -pub size: crate::ctypes::c_uint, -pub ifs_ifsu: if_settings__bindgen_ty_1, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ifreq { -pub ifr_ifrn: ifreq__bindgen_ty_1, -pub ifr_ifru: ifreq__bindgen_ty_2, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ifconf { -pub ifc_len: crate::ctypes::c_int, -pub ifc_ifcu: ifconf__bindgen_ty_1, -} -#[repr(C)] -pub struct xt_entry_match { -pub u: xt_entry_match__bindgen_ty_1, -pub data: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_match__bindgen_ty_1__bindgen_ty_1 { -pub match_size: __u16, -pub name: [crate::ctypes::c_char; 29usize], -pub revision: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_match__bindgen_ty_1__bindgen_ty_2 { -pub match_size: __u16, -pub match_: *mut xt_match, -} -#[repr(C)] -pub struct xt_entry_target { -pub u: xt_entry_target__bindgen_ty_1, -pub data: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_target__bindgen_ty_1__bindgen_ty_1 { -pub target_size: __u16, -pub name: [crate::ctypes::c_char; 29usize], -pub revision: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_target__bindgen_ty_1__bindgen_ty_2 { -pub target_size: __u16, -pub target: *mut xt_target, -} -#[repr(C)] -pub struct xt_standard_target { -pub target: xt_entry_target, -pub verdict: crate::ctypes::c_int, -} -#[repr(C)] -pub struct xt_error_target { -pub target: xt_entry_target, -pub errorname: [crate::ctypes::c_char; 30usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_get_revision { -pub name: [crate::ctypes::c_char; 29usize], -pub revision: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct _xt_align { -pub u8_: __u8, -pub u16_: __u16, -pub u32_: __u32, -pub u64_: __u64, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_counters { -pub pcnt: __u64, -pub bcnt: __u64, -} -#[repr(C)] -#[derive(Debug)] -pub struct xt_counters_info { -pub name: [crate::ctypes::c_char; 32usize], -pub num_counters: crate::ctypes::c_uint, -pub counters: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_tcp { -pub spts: [__u16; 2usize], -pub dpts: [__u16; 2usize], -pub option: __u8, -pub flg_mask: __u8, -pub flg_cmp: __u8, -pub invflags: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_udp { -pub spts: [__u16; 2usize], -pub dpts: [__u16; 2usize], -pub invflags: __u8, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ip6t_ip6 { -pub src: in6_addr, -pub dst: in6_addr, -pub smsk: in6_addr, -pub dmsk: in6_addr, -pub iniface: [crate::ctypes::c_char; 16usize], -pub outiface: [crate::ctypes::c_char; 16usize], -pub iniface_mask: [crate::ctypes::c_uchar; 16usize], -pub outiface_mask: [crate::ctypes::c_uchar; 16usize], -pub proto: __u16, -pub tos: __u8, -pub flags: __u8, -pub invflags: __u8, -} -#[repr(C)] -pub struct ip6t_entry { -pub ipv6: ip6t_ip6, -pub nfcache: crate::ctypes::c_uint, -pub target_offset: __u16, -pub next_offset: __u16, -pub comefrom: crate::ctypes::c_uint, -pub counters: xt_counters, -pub elems: __IncompleteArrayField, -} -#[repr(C)] -pub struct ip6t_standard { -pub entry: ip6t_entry, -pub target: xt_standard_target, -} -#[repr(C)] -pub struct ip6t_error { -pub entry: ip6t_entry, -pub target: xt_error_target, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ip6t_icmp { -pub type_: __u8, -pub code: [__u8; 2usize], -pub invflags: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ip6t_getinfo { -pub name: [crate::ctypes::c_char; 32usize], -pub valid_hooks: crate::ctypes::c_uint, -pub hook_entry: [crate::ctypes::c_uint; 5usize], -pub underflow: [crate::ctypes::c_uint; 5usize], -pub num_entries: crate::ctypes::c_uint, -pub size: crate::ctypes::c_uint, -} -#[repr(C)] -pub struct ip6t_replace { -pub name: [crate::ctypes::c_char; 32usize], -pub valid_hooks: crate::ctypes::c_uint, -pub num_entries: crate::ctypes::c_uint, -pub size: crate::ctypes::c_uint, -pub hook_entry: [crate::ctypes::c_uint; 5usize], -pub underflow: [crate::ctypes::c_uint; 5usize], -pub num_counters: crate::ctypes::c_uint, -pub counters: *mut xt_counters, -pub entries: __IncompleteArrayField, -} -#[repr(C)] -pub struct ip6t_get_entries { -pub name: [crate::ctypes::c_char; 32usize], -pub size: crate::ctypes::c_uint, -pub entrytable: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] pub struct linger { pub l_onoff: crate::ctypes::c_int, pub l_linger: crate::ctypes::c_int, @@ -762,16 +513,6 @@ } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct xt_match { -pub _address: u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_target { -pub _address: u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] pub struct iovec { pub _address: u8, } @@ -846,6 +587,7 @@ pub const IP_MULTICAST_ALL: u32 = 49; pub const IP_UNICAST_IF: u32 = 50; pub const IP_LOCAL_PORT_RANGE: u32 = 51; +pub const IP_PROTOCOL: u32 = 52; pub const MCAST_EXCLUDE: u32 = 0; pub const MCAST_INCLUDE: u32 = 1; pub const IP_DEFAULT_MULTICAST_TTL: u32 = 1; @@ -1225,135 +967,6 @@ pub const TCP_MD5SIG_FLAG_IFINDEX: u32 = 2; pub const TCP_RECEIVE_ZEROCOPY_FLAG_TLB_CLEAN_HINT: u32 = 1; pub const UNIX_PATH_MAX: u32 = 108; -pub const IFNAMSIZ: u32 = 16; -pub const IFALIASZ: u32 = 256; -pub const ALTIFNAMSIZ: u32 = 128; -pub const GENERIC_HDLC_VERSION: u32 = 4; -pub const CLOCK_DEFAULT: u32 = 0; -pub const CLOCK_EXT: u32 = 1; -pub const CLOCK_INT: u32 = 2; -pub const CLOCK_TXINT: u32 = 3; -pub const CLOCK_TXFROMRX: u32 = 4; -pub const ENCODING_DEFAULT: u32 = 0; -pub const ENCODING_NRZ: u32 = 1; -pub const ENCODING_NRZI: u32 = 2; -pub const ENCODING_FM_MARK: u32 = 3; -pub const ENCODING_FM_SPACE: u32 = 4; -pub const ENCODING_MANCHESTER: u32 = 5; -pub const PARITY_DEFAULT: u32 = 0; -pub const PARITY_NONE: u32 = 1; -pub const PARITY_CRC16_PR0: u32 = 2; -pub const PARITY_CRC16_PR1: u32 = 3; -pub const PARITY_CRC16_PR0_CCITT: u32 = 4; -pub const PARITY_CRC16_PR1_CCITT: u32 = 5; -pub const PARITY_CRC32_PR0_CCITT: u32 = 6; -pub const PARITY_CRC32_PR1_CCITT: u32 = 7; -pub const LMI_DEFAULT: u32 = 0; -pub const LMI_NONE: u32 = 1; -pub const LMI_ANSI: u32 = 2; -pub const LMI_CCITT: u32 = 3; -pub const LMI_CISCO: u32 = 4; -pub const IF_GET_IFACE: u32 = 1; -pub const IF_GET_PROTO: u32 = 2; -pub const IF_IFACE_V35: u32 = 4096; -pub const IF_IFACE_V24: u32 = 4097; -pub const IF_IFACE_X21: u32 = 4098; -pub const IF_IFACE_T1: u32 = 4099; -pub const IF_IFACE_E1: u32 = 4100; -pub const IF_IFACE_SYNC_SERIAL: u32 = 4101; -pub const IF_IFACE_X21D: u32 = 4102; -pub const IF_PROTO_HDLC: u32 = 8192; -pub const IF_PROTO_PPP: u32 = 8193; -pub const IF_PROTO_CISCO: u32 = 8194; -pub const IF_PROTO_FR: u32 = 8195; -pub const IF_PROTO_FR_ADD_PVC: u32 = 8196; -pub const IF_PROTO_FR_DEL_PVC: u32 = 8197; -pub const IF_PROTO_X25: u32 = 8198; -pub const IF_PROTO_HDLC_ETH: u32 = 8199; -pub const IF_PROTO_FR_ADD_ETH_PVC: u32 = 8200; -pub const IF_PROTO_FR_DEL_ETH_PVC: u32 = 8201; -pub const IF_PROTO_FR_PVC: u32 = 8202; -pub const IF_PROTO_FR_ETH_PVC: u32 = 8203; -pub const IF_PROTO_RAW: u32 = 8204; -pub const IFHWADDRLEN: u32 = 6; -pub const NF_DROP: u32 = 0; -pub const NF_ACCEPT: u32 = 1; -pub const NF_STOLEN: u32 = 2; -pub const NF_QUEUE: u32 = 3; -pub const NF_REPEAT: u32 = 4; -pub const NF_STOP: u32 = 5; -pub const NF_MAX_VERDICT: u32 = 5; -pub const NF_VERDICT_MASK: u32 = 255; -pub const NF_VERDICT_FLAG_QUEUE_BYPASS: u32 = 32768; -pub const NF_VERDICT_QMASK: u32 = 4294901760; -pub const NF_VERDICT_QBITS: u32 = 16; -pub const NF_VERDICT_BITS: u32 = 16; -pub const NF_IP6_PRE_ROUTING: u32 = 0; -pub const NF_IP6_LOCAL_IN: u32 = 1; -pub const NF_IP6_FORWARD: u32 = 2; -pub const NF_IP6_LOCAL_OUT: u32 = 3; -pub const NF_IP6_POST_ROUTING: u32 = 4; -pub const NF_IP6_NUMHOOKS: u32 = 5; -pub const XT_FUNCTION_MAXNAMELEN: u32 = 30; -pub const XT_EXTENSION_MAXNAMELEN: u32 = 29; -pub const XT_TABLE_MAXNAMELEN: u32 = 32; -pub const XT_CONTINUE: u32 = 4294967295; -pub const XT_RETURN: i32 = -5; -pub const XT_STANDARD_TARGET: &[u8; 1] = b"\0"; -pub const XT_ERROR_TARGET: &[u8; 6] = b"ERROR\0"; -pub const XT_INV_PROTO: u32 = 64; -pub const IP6T_FUNCTION_MAXNAMELEN: u32 = 30; -pub const IP6T_TABLE_MAXNAMELEN: u32 = 32; -pub const IP6T_CONTINUE: u32 = 4294967295; -pub const IP6T_RETURN: i32 = -5; -pub const XT_TCP_INV_SRCPT: u32 = 1; -pub const XT_TCP_INV_DSTPT: u32 = 2; -pub const XT_TCP_INV_FLAGS: u32 = 4; -pub const XT_TCP_INV_OPTION: u32 = 8; -pub const XT_TCP_INV_MASK: u32 = 15; -pub const XT_UDP_INV_SRCPT: u32 = 1; -pub const XT_UDP_INV_DSTPT: u32 = 2; -pub const XT_UDP_INV_MASK: u32 = 3; -pub const IP6T_TCP_INV_SRCPT: u32 = 1; -pub const IP6T_TCP_INV_DSTPT: u32 = 2; -pub const IP6T_TCP_INV_FLAGS: u32 = 4; -pub const IP6T_TCP_INV_OPTION: u32 = 8; -pub const IP6T_TCP_INV_MASK: u32 = 15; -pub const IP6T_UDP_INV_SRCPT: u32 = 1; -pub const IP6T_UDP_INV_DSTPT: u32 = 2; -pub const IP6T_UDP_INV_MASK: u32 = 3; -pub const IP6T_STANDARD_TARGET: &[u8; 1] = b"\0"; -pub const IP6T_ERROR_TARGET: &[u8; 6] = b"ERROR\0"; -pub const IP6T_F_PROTO: u32 = 1; -pub const IP6T_F_TOS: u32 = 2; -pub const IP6T_F_GOTO: u32 = 4; -pub const IP6T_F_MASK: u32 = 7; -pub const IP6T_INV_VIA_IN: u32 = 1; -pub const IP6T_INV_VIA_OUT: u32 = 2; -pub const IP6T_INV_TOS: u32 = 4; -pub const IP6T_INV_SRCIP: u32 = 8; -pub const IP6T_INV_DSTIP: u32 = 16; -pub const IP6T_INV_FRAG: u32 = 32; -pub const IP6T_INV_PROTO: u32 = 64; -pub const IP6T_INV_MASK: u32 = 127; -pub const IP6T_BASE_CTL: u32 = 64; -pub const IP6T_SO_SET_REPLACE: u32 = 64; -pub const IP6T_SO_SET_ADD_COUNTERS: u32 = 65; -pub const IP6T_SO_SET_MAX: u32 = 65; -pub const IP6T_SO_GET_INFO: u32 = 64; -pub const IP6T_SO_GET_ENTRIES: u32 = 65; -pub const IP6T_SO_GET_REVISION_MATCH: u32 = 68; -pub const IP6T_SO_GET_REVISION_TARGET: u32 = 69; -pub const IP6T_SO_GET_MAX: u32 = 69; -pub const IP6T_SO_ORIGINAL_DST: u32 = 80; -pub const IP6T_ICMP_INV: u32 = 1; -pub const NF_IP_PRE_ROUTING: u32 = 0; -pub const NF_IP_LOCAL_IN: u32 = 1; -pub const NF_IP_FORWARD: u32 = 2; -pub const NF_IP_LOCAL_OUT: u32 = 3; -pub const NF_IP_POST_ROUTING: u32 = 4; -pub const NF_IP_NUMHOOKS: u32 = 5; -pub const SO_ORIGINAL_DST: u32 = 80; pub const SHUT_RD: u32 = 0; pub const SHUT_WR: u32 = 1; pub const SHUT_RDWR: u32 = 2; @@ -1582,25 +1195,6 @@ pub const TCP_NLA_EDT: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_EDT; pub const TCP_NLA_TTL: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_TTL; pub const TCP_NLA_REHASH: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_REHASH; -pub const IF_OPER_UNKNOWN: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_UNKNOWN; -pub const IF_OPER_NOTPRESENT: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_NOTPRESENT; -pub const IF_OPER_DOWN: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_DOWN; -pub const IF_OPER_LOWERLAYERDOWN: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_LOWERLAYERDOWN; -pub const IF_OPER_TESTING: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_TESTING; -pub const IF_OPER_DORMANT: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_DORMANT; -pub const IF_OPER_UP: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_UP; -pub const IF_LINK_MODE_DEFAULT: _bindgen_ty_8 = _bindgen_ty_8::IF_LINK_MODE_DEFAULT; -pub const IF_LINK_MODE_DORMANT: _bindgen_ty_8 = _bindgen_ty_8::IF_LINK_MODE_DORMANT; -pub const IF_LINK_MODE_TESTING: _bindgen_ty_8 = _bindgen_ty_8::IF_LINK_MODE_TESTING; -pub const NFPROTO_UNSPEC: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_UNSPEC; -pub const NFPROTO_INET: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_INET; -pub const NFPROTO_IPV4: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_IPV4; -pub const NFPROTO_ARP: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_ARP; -pub const NFPROTO_NETDEV: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_NETDEV; -pub const NFPROTO_BRIDGE: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_BRIDGE; -pub const NFPROTO_IPV6: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_IPV6; -pub const NFPROTO_DECNET: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_DECNET; -pub const NFPROTO_NUMPROTO: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_NUMPROTO; #[repr(u32)] #[non_exhaustive] #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] @@ -1824,121 +1418,6 @@ TCP_NLA_TTL = 26, TCP_NLA_REHASH = 27, } -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum net_device_flags { -IFF_UP = 1, -IFF_BROADCAST = 2, -IFF_DEBUG = 4, -IFF_LOOPBACK = 8, -IFF_POINTOPOINT = 16, -IFF_NOTRAILERS = 32, -IFF_RUNNING = 64, -IFF_NOARP = 128, -IFF_PROMISC = 256, -IFF_ALLMULTI = 512, -IFF_MASTER = 1024, -IFF_SLAVE = 2048, -IFF_MULTICAST = 4096, -IFF_PORTSEL = 8192, -IFF_AUTOMEDIA = 16384, -IFF_DYNAMIC = 32768, -IFF_LOWER_UP = 65536, -IFF_DORMANT = 131072, -IFF_ECHO = 262144, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_7 { -IF_OPER_UNKNOWN = 0, -IF_OPER_NOTPRESENT = 1, -IF_OPER_DOWN = 2, -IF_OPER_LOWERLAYERDOWN = 3, -IF_OPER_TESTING = 4, -IF_OPER_DORMANT = 5, -IF_OPER_UP = 6, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_8 { -IF_LINK_MODE_DEFAULT = 0, -IF_LINK_MODE_DORMANT = 1, -IF_LINK_MODE_TESTING = 2, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_inet_hooks { -NF_INET_PRE_ROUTING = 0, -NF_INET_LOCAL_IN = 1, -NF_INET_FORWARD = 2, -NF_INET_LOCAL_OUT = 3, -NF_INET_POST_ROUTING = 4, -NF_INET_NUMHOOKS = 5, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_dev_hooks { -NF_NETDEV_INGRESS = 0, -NF_NETDEV_EGRESS = 1, -NF_NETDEV_NUMHOOKS = 2, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_9 { -NFPROTO_UNSPEC = 0, -NFPROTO_INET = 1, -NFPROTO_IPV4 = 2, -NFPROTO_ARP = 3, -NFPROTO_NETDEV = 5, -NFPROTO_BRIDGE = 7, -NFPROTO_IPV6 = 10, -NFPROTO_DECNET = 12, -NFPROTO_NUMPROTO = 13, -} -#[repr(i32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_ip6_hook_priorities { -NF_IP6_PRI_FIRST = -2147483648, -NF_IP6_PRI_RAW_BEFORE_DEFRAG = -450, -NF_IP6_PRI_CONNTRACK_DEFRAG = -400, -NF_IP6_PRI_RAW = -300, -NF_IP6_PRI_SELINUX_FIRST = -225, -NF_IP6_PRI_CONNTRACK = -200, -NF_IP6_PRI_MANGLE = -150, -NF_IP6_PRI_NAT_DST = -100, -NF_IP6_PRI_FILTER = 0, -NF_IP6_PRI_SECURITY = 50, -NF_IP6_PRI_NAT_SRC = 100, -NF_IP6_PRI_SELINUX_LAST = 225, -NF_IP6_PRI_CONNTRACK_HELPER = 300, -NF_IP6_PRI_LAST = 2147483647, -} -#[repr(i32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_ip_hook_priorities { -NF_IP_PRI_FIRST = -2147483648, -NF_IP_PRI_RAW_BEFORE_DEFRAG = -450, -NF_IP_PRI_CONNTRACK_DEFRAG = -400, -NF_IP_PRI_RAW = -300, -NF_IP_PRI_SELINUX_FIRST = -225, -NF_IP_PRI_CONNTRACK = -200, -NF_IP_PRI_MANGLE = -150, -NF_IP_PRI_NAT_DST = -100, -NF_IP_PRI_FILTER = 0, -NF_IP_PRI_SECURITY = 50, -NF_IP_PRI_NAT_SRC = 100, -NF_IP_PRI_SELINUX_LAST = 225, -NF_IP_PRI_CONNTRACK_HELPER = 300, -NF_IP_PRI_CONNTRACK_CONFIRM = 2147483647, -} #[repr(C)] #[derive(Copy, Clone)] pub union __kernel_sockaddr_storage__bindgen_ty_1 { @@ -1970,69 +1449,6 @@ pub hdr: tcphdr, pub words: [__be32; 5usize], } -#[repr(C)] -#[derive(Copy, Clone)] -pub union if_settings__bindgen_ty_1 { -pub raw_hdlc: *mut raw_hdlc_proto, -pub cisco: *mut cisco_proto, -pub fr: *mut fr_proto, -pub fr_pvc: *mut fr_proto_pvc, -pub fr_pvc_info: *mut fr_proto_pvc_info, -pub x25: *mut x25_hdlc_proto, -pub sync: *mut sync_serial_settings, -pub te1: *mut te1_settings, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ifreq__bindgen_ty_1 { -pub ifrn_name: [crate::ctypes::c_char; 16usize], -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ifreq__bindgen_ty_2 { -pub ifru_addr: sockaddr, -pub ifru_dstaddr: sockaddr, -pub ifru_broadaddr: sockaddr, -pub ifru_netmask: sockaddr, -pub ifru_hwaddr: sockaddr, -pub ifru_flags: crate::ctypes::c_short, -pub ifru_ivalue: crate::ctypes::c_int, -pub ifru_mtu: crate::ctypes::c_int, -pub ifru_map: ifmap, -pub ifru_slave: [crate::ctypes::c_char; 16usize], -pub ifru_newname: [crate::ctypes::c_char; 16usize], -pub ifru_data: *mut crate::ctypes::c_void, -pub ifru_settings: if_settings, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ifconf__bindgen_ty_1 { -pub ifcu_buf: *mut crate::ctypes::c_char, -pub ifcu_req: *mut ifreq, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union nf_inet_addr { -pub all: [__u32; 4usize], -pub ip: __be32, -pub ip6: [__be32; 4usize], -pub in_: in_addr, -pub in6: in6_addr, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union xt_entry_match__bindgen_ty_1 { -pub user: xt_entry_match__bindgen_ty_1__bindgen_ty_1, -pub kernel: xt_entry_match__bindgen_ty_1__bindgen_ty_2, -pub match_size: __u16, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union xt_entry_target__bindgen_ty_1 { -pub user: xt_entry_target__bindgen_ty_1__bindgen_ty_1, -pub kernel: xt_entry_target__bindgen_ty_1__bindgen_ty_2, -pub target_size: __u16, -} impl __BindgenBitfieldUnit { #[inline] pub const fn new(storage: Storage) -> Self { @@ -2458,9 +1874,3 @@ __bindgen_bitfield_unit } } -impl nf_inet_hooks { -pub const NF_INET_INGRESS: nf_inet_hooks = nf_inet_hooks::NF_INET_NUMHOOKS; -} -impl nf_ip_hook_priorities { -pub const NF_IP_PRI_LAST: nf_ip_hook_priorities = nf_ip_hook_priorities::NF_IP_PRI_CONNTRACK_CONFIRM; -} diff -Nru temporalio-1.3.0/vendor/linux-raw-sys/src/mips64r6/prctl.rs temporalio-1.3.0/vendor/linux-raw-sys/src/mips64r6/prctl.rs --- temporalio-1.3.0/vendor/linux-raw-sys/src/mips64r6/prctl.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/linux-raw-sys/src/mips64r6/prctl.rs 2023-10-30 19:40:00.000000000 +0000 @@ -229,3 +229,6 @@ pub const PR_GET_MDWE: u32 = 66; pub const PR_SET_VMA: u32 = 1398164801; pub const PR_SET_VMA_ANON_NAME: u32 = 0; +pub const PR_GET_AUXV: u32 = 1096112214; +pub const PR_SET_MEMORY_MERGE: u32 = 67; +pub const PR_GET_MEMORY_MERGE: u32 = 68; diff -Nru temporalio-1.3.0/vendor/linux-raw-sys/src/powerpc/general.rs temporalio-1.3.0/vendor/linux-raw-sys/src/powerpc/general.rs --- temporalio-1.3.0/vendor/linux-raw-sys/src/powerpc/general.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/linux-raw-sys/src/powerpc/general.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1662,19 +1662,6 @@ pub const GRND_NONBLOCK: u32 = 1; pub const GRND_RANDOM: u32 = 2; pub const GRND_INSECURE: u32 = 4; -pub const LINUX_REBOOT_MAGIC1: u32 = 4276215469; -pub const LINUX_REBOOT_MAGIC2: u32 = 672274793; -pub const LINUX_REBOOT_MAGIC2A: u32 = 85072278; -pub const LINUX_REBOOT_MAGIC2B: u32 = 369367448; -pub const LINUX_REBOOT_MAGIC2C: u32 = 537993216; -pub const LINUX_REBOOT_CMD_RESTART: u32 = 19088743; -pub const LINUX_REBOOT_CMD_HALT: u32 = 3454992675; -pub const LINUX_REBOOT_CMD_CAD_ON: u32 = 2309737967; -pub const LINUX_REBOOT_CMD_CAD_OFF: u32 = 0; -pub const LINUX_REBOOT_CMD_POWER_OFF: u32 = 1126301404; -pub const LINUX_REBOOT_CMD_RESTART2: u32 = 2712847316; -pub const LINUX_REBOOT_CMD_SW_SUSPEND: u32 = 3489725666; -pub const LINUX_REBOOT_CMD_KEXEC: u32 = 1163412803; pub const ITIMER_REAL: u32 = 0; pub const ITIMER_VIRTUAL: u32 = 1; pub const ITIMER_PROF: u32 = 2; diff -Nru temporalio-1.3.0/vendor/linux-raw-sys/src/powerpc/net.rs temporalio-1.3.0/vendor/linux-raw-sys/src/powerpc/net.rs --- temporalio-1.3.0/vendor/linux-raw-sys/src/powerpc/net.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/linux-raw-sys/src/powerpc/net.rs 2023-10-30 19:40:00.000000000 +0000 @@ -482,255 +482,6 @@ } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct sync_serial_settings { -pub clock_rate: crate::ctypes::c_uint, -pub clock_type: crate::ctypes::c_uint, -pub loopback: crate::ctypes::c_ushort, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct te1_settings { -pub clock_rate: crate::ctypes::c_uint, -pub clock_type: crate::ctypes::c_uint, -pub loopback: crate::ctypes::c_ushort, -pub slot_map: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct raw_hdlc_proto { -pub encoding: crate::ctypes::c_ushort, -pub parity: crate::ctypes::c_ushort, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fr_proto { -pub t391: crate::ctypes::c_uint, -pub t392: crate::ctypes::c_uint, -pub n391: crate::ctypes::c_uint, -pub n392: crate::ctypes::c_uint, -pub n393: crate::ctypes::c_uint, -pub lmi: crate::ctypes::c_ushort, -pub dce: crate::ctypes::c_ushort, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fr_proto_pvc { -pub dlci: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fr_proto_pvc_info { -pub dlci: crate::ctypes::c_uint, -pub master: [crate::ctypes::c_char; 16usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct cisco_proto { -pub interval: crate::ctypes::c_uint, -pub timeout: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct x25_hdlc_proto { -pub dce: crate::ctypes::c_ushort, -pub modulo: crate::ctypes::c_uint, -pub window: crate::ctypes::c_uint, -pub t1: crate::ctypes::c_uint, -pub t2: crate::ctypes::c_uint, -pub n2: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ifmap { -pub mem_start: crate::ctypes::c_ulong, -pub mem_end: crate::ctypes::c_ulong, -pub base_addr: crate::ctypes::c_ushort, -pub irq: crate::ctypes::c_uchar, -pub dma: crate::ctypes::c_uchar, -pub port: crate::ctypes::c_uchar, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct if_settings { -pub type_: crate::ctypes::c_uint, -pub size: crate::ctypes::c_uint, -pub ifs_ifsu: if_settings__bindgen_ty_1, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ifreq { -pub ifr_ifrn: ifreq__bindgen_ty_1, -pub ifr_ifru: ifreq__bindgen_ty_2, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ifconf { -pub ifc_len: crate::ctypes::c_int, -pub ifc_ifcu: ifconf__bindgen_ty_1, -} -#[repr(C)] -pub struct xt_entry_match { -pub u: xt_entry_match__bindgen_ty_1, -pub data: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_match__bindgen_ty_1__bindgen_ty_1 { -pub match_size: __u16, -pub name: [crate::ctypes::c_char; 29usize], -pub revision: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_match__bindgen_ty_1__bindgen_ty_2 { -pub match_size: __u16, -pub match_: *mut xt_match, -} -#[repr(C)] -pub struct xt_entry_target { -pub u: xt_entry_target__bindgen_ty_1, -pub data: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_target__bindgen_ty_1__bindgen_ty_1 { -pub target_size: __u16, -pub name: [crate::ctypes::c_char; 29usize], -pub revision: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_target__bindgen_ty_1__bindgen_ty_2 { -pub target_size: __u16, -pub target: *mut xt_target, -} -#[repr(C)] -pub struct xt_standard_target { -pub target: xt_entry_target, -pub verdict: crate::ctypes::c_int, -} -#[repr(C)] -pub struct xt_error_target { -pub target: xt_entry_target, -pub errorname: [crate::ctypes::c_char; 30usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_get_revision { -pub name: [crate::ctypes::c_char; 29usize], -pub revision: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct _xt_align { -pub u8_: __u8, -pub u16_: __u16, -pub u32_: __u32, -pub u64_: __u64, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_counters { -pub pcnt: __u64, -pub bcnt: __u64, -} -#[repr(C)] -#[derive(Debug)] -pub struct xt_counters_info { -pub name: [crate::ctypes::c_char; 32usize], -pub num_counters: crate::ctypes::c_uint, -pub counters: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_tcp { -pub spts: [__u16; 2usize], -pub dpts: [__u16; 2usize], -pub option: __u8, -pub flg_mask: __u8, -pub flg_cmp: __u8, -pub invflags: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_udp { -pub spts: [__u16; 2usize], -pub dpts: [__u16; 2usize], -pub invflags: __u8, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ip6t_ip6 { -pub src: in6_addr, -pub dst: in6_addr, -pub smsk: in6_addr, -pub dmsk: in6_addr, -pub iniface: [crate::ctypes::c_char; 16usize], -pub outiface: [crate::ctypes::c_char; 16usize], -pub iniface_mask: [crate::ctypes::c_uchar; 16usize], -pub outiface_mask: [crate::ctypes::c_uchar; 16usize], -pub proto: __u16, -pub tos: __u8, -pub flags: __u8, -pub invflags: __u8, -} -#[repr(C)] -pub struct ip6t_entry { -pub ipv6: ip6t_ip6, -pub nfcache: crate::ctypes::c_uint, -pub target_offset: __u16, -pub next_offset: __u16, -pub comefrom: crate::ctypes::c_uint, -pub counters: xt_counters, -pub elems: __IncompleteArrayField, -} -#[repr(C)] -pub struct ip6t_standard { -pub entry: ip6t_entry, -pub target: xt_standard_target, -} -#[repr(C)] -pub struct ip6t_error { -pub entry: ip6t_entry, -pub target: xt_error_target, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ip6t_icmp { -pub type_: __u8, -pub code: [__u8; 2usize], -pub invflags: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ip6t_getinfo { -pub name: [crate::ctypes::c_char; 32usize], -pub valid_hooks: crate::ctypes::c_uint, -pub hook_entry: [crate::ctypes::c_uint; 5usize], -pub underflow: [crate::ctypes::c_uint; 5usize], -pub num_entries: crate::ctypes::c_uint, -pub size: crate::ctypes::c_uint, -} -#[repr(C)] -pub struct ip6t_replace { -pub name: [crate::ctypes::c_char; 32usize], -pub valid_hooks: crate::ctypes::c_uint, -pub num_entries: crate::ctypes::c_uint, -pub size: crate::ctypes::c_uint, -pub hook_entry: [crate::ctypes::c_uint; 5usize], -pub underflow: [crate::ctypes::c_uint; 5usize], -pub num_counters: crate::ctypes::c_uint, -pub counters: *mut xt_counters, -pub entries: __IncompleteArrayField, -} -#[repr(C)] -pub struct ip6t_get_entries { -pub name: [crate::ctypes::c_char; 32usize], -pub size: crate::ctypes::c_uint, -pub entrytable: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] pub struct linger { pub l_onoff: crate::ctypes::c_int, pub l_linger: crate::ctypes::c_int, @@ -768,16 +519,6 @@ } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct xt_match { -pub _address: u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_target { -pub _address: u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] pub struct iovec { pub _address: u8, } @@ -1192,135 +933,6 @@ pub const TCP_MD5SIG_FLAG_IFINDEX: u32 = 2; pub const TCP_RECEIVE_ZEROCOPY_FLAG_TLB_CLEAN_HINT: u32 = 1; pub const UNIX_PATH_MAX: u32 = 108; -pub const IFNAMSIZ: u32 = 16; -pub const IFALIASZ: u32 = 256; -pub const ALTIFNAMSIZ: u32 = 128; -pub const GENERIC_HDLC_VERSION: u32 = 4; -pub const CLOCK_DEFAULT: u32 = 0; -pub const CLOCK_EXT: u32 = 1; -pub const CLOCK_INT: u32 = 2; -pub const CLOCK_TXINT: u32 = 3; -pub const CLOCK_TXFROMRX: u32 = 4; -pub const ENCODING_DEFAULT: u32 = 0; -pub const ENCODING_NRZ: u32 = 1; -pub const ENCODING_NRZI: u32 = 2; -pub const ENCODING_FM_MARK: u32 = 3; -pub const ENCODING_FM_SPACE: u32 = 4; -pub const ENCODING_MANCHESTER: u32 = 5; -pub const PARITY_DEFAULT: u32 = 0; -pub const PARITY_NONE: u32 = 1; -pub const PARITY_CRC16_PR0: u32 = 2; -pub const PARITY_CRC16_PR1: u32 = 3; -pub const PARITY_CRC16_PR0_CCITT: u32 = 4; -pub const PARITY_CRC16_PR1_CCITT: u32 = 5; -pub const PARITY_CRC32_PR0_CCITT: u32 = 6; -pub const PARITY_CRC32_PR1_CCITT: u32 = 7; -pub const LMI_DEFAULT: u32 = 0; -pub const LMI_NONE: u32 = 1; -pub const LMI_ANSI: u32 = 2; -pub const LMI_CCITT: u32 = 3; -pub const LMI_CISCO: u32 = 4; -pub const IF_GET_IFACE: u32 = 1; -pub const IF_GET_PROTO: u32 = 2; -pub const IF_IFACE_V35: u32 = 4096; -pub const IF_IFACE_V24: u32 = 4097; -pub const IF_IFACE_X21: u32 = 4098; -pub const IF_IFACE_T1: u32 = 4099; -pub const IF_IFACE_E1: u32 = 4100; -pub const IF_IFACE_SYNC_SERIAL: u32 = 4101; -pub const IF_IFACE_X21D: u32 = 4102; -pub const IF_PROTO_HDLC: u32 = 8192; -pub const IF_PROTO_PPP: u32 = 8193; -pub const IF_PROTO_CISCO: u32 = 8194; -pub const IF_PROTO_FR: u32 = 8195; -pub const IF_PROTO_FR_ADD_PVC: u32 = 8196; -pub const IF_PROTO_FR_DEL_PVC: u32 = 8197; -pub const IF_PROTO_X25: u32 = 8198; -pub const IF_PROTO_HDLC_ETH: u32 = 8199; -pub const IF_PROTO_FR_ADD_ETH_PVC: u32 = 8200; -pub const IF_PROTO_FR_DEL_ETH_PVC: u32 = 8201; -pub const IF_PROTO_FR_PVC: u32 = 8202; -pub const IF_PROTO_FR_ETH_PVC: u32 = 8203; -pub const IF_PROTO_RAW: u32 = 8204; -pub const IFHWADDRLEN: u32 = 6; -pub const NF_DROP: u32 = 0; -pub const NF_ACCEPT: u32 = 1; -pub const NF_STOLEN: u32 = 2; -pub const NF_QUEUE: u32 = 3; -pub const NF_REPEAT: u32 = 4; -pub const NF_STOP: u32 = 5; -pub const NF_MAX_VERDICT: u32 = 5; -pub const NF_VERDICT_MASK: u32 = 255; -pub const NF_VERDICT_FLAG_QUEUE_BYPASS: u32 = 32768; -pub const NF_VERDICT_QMASK: u32 = 4294901760; -pub const NF_VERDICT_QBITS: u32 = 16; -pub const NF_VERDICT_BITS: u32 = 16; -pub const NF_IP6_PRE_ROUTING: u32 = 0; -pub const NF_IP6_LOCAL_IN: u32 = 1; -pub const NF_IP6_FORWARD: u32 = 2; -pub const NF_IP6_LOCAL_OUT: u32 = 3; -pub const NF_IP6_POST_ROUTING: u32 = 4; -pub const NF_IP6_NUMHOOKS: u32 = 5; -pub const XT_FUNCTION_MAXNAMELEN: u32 = 30; -pub const XT_EXTENSION_MAXNAMELEN: u32 = 29; -pub const XT_TABLE_MAXNAMELEN: u32 = 32; -pub const XT_CONTINUE: u32 = 4294967295; -pub const XT_RETURN: i32 = -5; -pub const XT_STANDARD_TARGET: &[u8; 1] = b"\0"; -pub const XT_ERROR_TARGET: &[u8; 6] = b"ERROR\0"; -pub const XT_INV_PROTO: u32 = 64; -pub const IP6T_FUNCTION_MAXNAMELEN: u32 = 30; -pub const IP6T_TABLE_MAXNAMELEN: u32 = 32; -pub const IP6T_CONTINUE: u32 = 4294967295; -pub const IP6T_RETURN: i32 = -5; -pub const XT_TCP_INV_SRCPT: u32 = 1; -pub const XT_TCP_INV_DSTPT: u32 = 2; -pub const XT_TCP_INV_FLAGS: u32 = 4; -pub const XT_TCP_INV_OPTION: u32 = 8; -pub const XT_TCP_INV_MASK: u32 = 15; -pub const XT_UDP_INV_SRCPT: u32 = 1; -pub const XT_UDP_INV_DSTPT: u32 = 2; -pub const XT_UDP_INV_MASK: u32 = 3; -pub const IP6T_TCP_INV_SRCPT: u32 = 1; -pub const IP6T_TCP_INV_DSTPT: u32 = 2; -pub const IP6T_TCP_INV_FLAGS: u32 = 4; -pub const IP6T_TCP_INV_OPTION: u32 = 8; -pub const IP6T_TCP_INV_MASK: u32 = 15; -pub const IP6T_UDP_INV_SRCPT: u32 = 1; -pub const IP6T_UDP_INV_DSTPT: u32 = 2; -pub const IP6T_UDP_INV_MASK: u32 = 3; -pub const IP6T_STANDARD_TARGET: &[u8; 1] = b"\0"; -pub const IP6T_ERROR_TARGET: &[u8; 6] = b"ERROR\0"; -pub const IP6T_F_PROTO: u32 = 1; -pub const IP6T_F_TOS: u32 = 2; -pub const IP6T_F_GOTO: u32 = 4; -pub const IP6T_F_MASK: u32 = 7; -pub const IP6T_INV_VIA_IN: u32 = 1; -pub const IP6T_INV_VIA_OUT: u32 = 2; -pub const IP6T_INV_TOS: u32 = 4; -pub const IP6T_INV_SRCIP: u32 = 8; -pub const IP6T_INV_DSTIP: u32 = 16; -pub const IP6T_INV_FRAG: u32 = 32; -pub const IP6T_INV_PROTO: u32 = 64; -pub const IP6T_INV_MASK: u32 = 127; -pub const IP6T_BASE_CTL: u32 = 64; -pub const IP6T_SO_SET_REPLACE: u32 = 64; -pub const IP6T_SO_SET_ADD_COUNTERS: u32 = 65; -pub const IP6T_SO_SET_MAX: u32 = 65; -pub const IP6T_SO_GET_INFO: u32 = 64; -pub const IP6T_SO_GET_ENTRIES: u32 = 65; -pub const IP6T_SO_GET_REVISION_MATCH: u32 = 68; -pub const IP6T_SO_GET_REVISION_TARGET: u32 = 69; -pub const IP6T_SO_GET_MAX: u32 = 69; -pub const IP6T_SO_ORIGINAL_DST: u32 = 80; -pub const IP6T_ICMP_INV: u32 = 1; -pub const NF_IP_PRE_ROUTING: u32 = 0; -pub const NF_IP_LOCAL_IN: u32 = 1; -pub const NF_IP_FORWARD: u32 = 2; -pub const NF_IP_LOCAL_OUT: u32 = 3; -pub const NF_IP_POST_ROUTING: u32 = 4; -pub const NF_IP_NUMHOOKS: u32 = 5; -pub const SO_ORIGINAL_DST: u32 = 80; pub const SHUT_RD: u32 = 0; pub const SHUT_WR: u32 = 1; pub const SHUT_RDWR: u32 = 2; @@ -1549,25 +1161,6 @@ pub const TCP_NLA_EDT: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_EDT; pub const TCP_NLA_TTL: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_TTL; pub const TCP_NLA_REHASH: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_REHASH; -pub const IF_OPER_UNKNOWN: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_UNKNOWN; -pub const IF_OPER_NOTPRESENT: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_NOTPRESENT; -pub const IF_OPER_DOWN: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_DOWN; -pub const IF_OPER_LOWERLAYERDOWN: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_LOWERLAYERDOWN; -pub const IF_OPER_TESTING: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_TESTING; -pub const IF_OPER_DORMANT: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_DORMANT; -pub const IF_OPER_UP: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_UP; -pub const IF_LINK_MODE_DEFAULT: _bindgen_ty_8 = _bindgen_ty_8::IF_LINK_MODE_DEFAULT; -pub const IF_LINK_MODE_DORMANT: _bindgen_ty_8 = _bindgen_ty_8::IF_LINK_MODE_DORMANT; -pub const IF_LINK_MODE_TESTING: _bindgen_ty_8 = _bindgen_ty_8::IF_LINK_MODE_TESTING; -pub const NFPROTO_UNSPEC: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_UNSPEC; -pub const NFPROTO_INET: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_INET; -pub const NFPROTO_IPV4: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_IPV4; -pub const NFPROTO_ARP: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_ARP; -pub const NFPROTO_NETDEV: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_NETDEV; -pub const NFPROTO_BRIDGE: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_BRIDGE; -pub const NFPROTO_IPV6: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_IPV6; -pub const NFPROTO_DECNET: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_DECNET; -pub const NFPROTO_NUMPROTO: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_NUMPROTO; #[repr(u32)] #[non_exhaustive] #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] @@ -1791,121 +1384,6 @@ TCP_NLA_TTL = 26, TCP_NLA_REHASH = 27, } -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum net_device_flags { -IFF_UP = 1, -IFF_BROADCAST = 2, -IFF_DEBUG = 4, -IFF_LOOPBACK = 8, -IFF_POINTOPOINT = 16, -IFF_NOTRAILERS = 32, -IFF_RUNNING = 64, -IFF_NOARP = 128, -IFF_PROMISC = 256, -IFF_ALLMULTI = 512, -IFF_MASTER = 1024, -IFF_SLAVE = 2048, -IFF_MULTICAST = 4096, -IFF_PORTSEL = 8192, -IFF_AUTOMEDIA = 16384, -IFF_DYNAMIC = 32768, -IFF_LOWER_UP = 65536, -IFF_DORMANT = 131072, -IFF_ECHO = 262144, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_7 { -IF_OPER_UNKNOWN = 0, -IF_OPER_NOTPRESENT = 1, -IF_OPER_DOWN = 2, -IF_OPER_LOWERLAYERDOWN = 3, -IF_OPER_TESTING = 4, -IF_OPER_DORMANT = 5, -IF_OPER_UP = 6, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_8 { -IF_LINK_MODE_DEFAULT = 0, -IF_LINK_MODE_DORMANT = 1, -IF_LINK_MODE_TESTING = 2, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_inet_hooks { -NF_INET_PRE_ROUTING = 0, -NF_INET_LOCAL_IN = 1, -NF_INET_FORWARD = 2, -NF_INET_LOCAL_OUT = 3, -NF_INET_POST_ROUTING = 4, -NF_INET_NUMHOOKS = 5, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_dev_hooks { -NF_NETDEV_INGRESS = 0, -NF_NETDEV_EGRESS = 1, -NF_NETDEV_NUMHOOKS = 2, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_9 { -NFPROTO_UNSPEC = 0, -NFPROTO_INET = 1, -NFPROTO_IPV4 = 2, -NFPROTO_ARP = 3, -NFPROTO_NETDEV = 5, -NFPROTO_BRIDGE = 7, -NFPROTO_IPV6 = 10, -NFPROTO_DECNET = 12, -NFPROTO_NUMPROTO = 13, -} -#[repr(i32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_ip6_hook_priorities { -NF_IP6_PRI_FIRST = -2147483648, -NF_IP6_PRI_RAW_BEFORE_DEFRAG = -450, -NF_IP6_PRI_CONNTRACK_DEFRAG = -400, -NF_IP6_PRI_RAW = -300, -NF_IP6_PRI_SELINUX_FIRST = -225, -NF_IP6_PRI_CONNTRACK = -200, -NF_IP6_PRI_MANGLE = -150, -NF_IP6_PRI_NAT_DST = -100, -NF_IP6_PRI_FILTER = 0, -NF_IP6_PRI_SECURITY = 50, -NF_IP6_PRI_NAT_SRC = 100, -NF_IP6_PRI_SELINUX_LAST = 225, -NF_IP6_PRI_CONNTRACK_HELPER = 300, -NF_IP6_PRI_LAST = 2147483647, -} -#[repr(i32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_ip_hook_priorities { -NF_IP_PRI_FIRST = -2147483648, -NF_IP_PRI_RAW_BEFORE_DEFRAG = -450, -NF_IP_PRI_CONNTRACK_DEFRAG = -400, -NF_IP_PRI_RAW = -300, -NF_IP_PRI_SELINUX_FIRST = -225, -NF_IP_PRI_CONNTRACK = -200, -NF_IP_PRI_MANGLE = -150, -NF_IP_PRI_NAT_DST = -100, -NF_IP_PRI_FILTER = 0, -NF_IP_PRI_SECURITY = 50, -NF_IP_PRI_NAT_SRC = 100, -NF_IP_PRI_SELINUX_LAST = 225, -NF_IP_PRI_CONNTRACK_HELPER = 300, -NF_IP_PRI_CONNTRACK_CONFIRM = 2147483647, -} #[repr(C)] #[derive(Copy, Clone)] pub union __kernel_sockaddr_storage__bindgen_ty_1 { @@ -1937,69 +1415,6 @@ pub hdr: tcphdr, pub words: [__be32; 5usize], } -#[repr(C)] -#[derive(Copy, Clone)] -pub union if_settings__bindgen_ty_1 { -pub raw_hdlc: *mut raw_hdlc_proto, -pub cisco: *mut cisco_proto, -pub fr: *mut fr_proto, -pub fr_pvc: *mut fr_proto_pvc, -pub fr_pvc_info: *mut fr_proto_pvc_info, -pub x25: *mut x25_hdlc_proto, -pub sync: *mut sync_serial_settings, -pub te1: *mut te1_settings, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ifreq__bindgen_ty_1 { -pub ifrn_name: [crate::ctypes::c_char; 16usize], -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ifreq__bindgen_ty_2 { -pub ifru_addr: sockaddr, -pub ifru_dstaddr: sockaddr, -pub ifru_broadaddr: sockaddr, -pub ifru_netmask: sockaddr, -pub ifru_hwaddr: sockaddr, -pub ifru_flags: crate::ctypes::c_short, -pub ifru_ivalue: crate::ctypes::c_int, -pub ifru_mtu: crate::ctypes::c_int, -pub ifru_map: ifmap, -pub ifru_slave: [crate::ctypes::c_char; 16usize], -pub ifru_newname: [crate::ctypes::c_char; 16usize], -pub ifru_data: *mut crate::ctypes::c_void, -pub ifru_settings: if_settings, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ifconf__bindgen_ty_1 { -pub ifcu_buf: *mut crate::ctypes::c_char, -pub ifcu_req: *mut ifreq, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union nf_inet_addr { -pub all: [__u32; 4usize], -pub ip: __be32, -pub ip6: [__be32; 4usize], -pub in_: in_addr, -pub in6: in6_addr, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union xt_entry_match__bindgen_ty_1 { -pub user: xt_entry_match__bindgen_ty_1__bindgen_ty_1, -pub kernel: xt_entry_match__bindgen_ty_1__bindgen_ty_2, -pub match_size: __u16, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union xt_entry_target__bindgen_ty_1 { -pub user: xt_entry_target__bindgen_ty_1__bindgen_ty_1, -pub kernel: xt_entry_target__bindgen_ty_1__bindgen_ty_2, -pub target_size: __u16, -} impl __BindgenBitfieldUnit { #[inline] pub const fn new(storage: Storage) -> Self { @@ -2425,9 +1840,3 @@ __bindgen_bitfield_unit } } -impl nf_inet_hooks { -pub const NF_INET_INGRESS: nf_inet_hooks = nf_inet_hooks::NF_INET_NUMHOOKS; -} -impl nf_ip_hook_priorities { -pub const NF_IP_PRI_LAST: nf_ip_hook_priorities = nf_ip_hook_priorities::NF_IP_PRI_CONNTRACK_CONFIRM; -} diff -Nru temporalio-1.3.0/vendor/linux-raw-sys/src/powerpc64/general.rs temporalio-1.3.0/vendor/linux-raw-sys/src/powerpc64/general.rs --- temporalio-1.3.0/vendor/linux-raw-sys/src/powerpc64/general.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/linux-raw-sys/src/powerpc64/general.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1639,19 +1639,6 @@ pub const GRND_NONBLOCK: u32 = 1; pub const GRND_RANDOM: u32 = 2; pub const GRND_INSECURE: u32 = 4; -pub const LINUX_REBOOT_MAGIC1: u32 = 4276215469; -pub const LINUX_REBOOT_MAGIC2: u32 = 672274793; -pub const LINUX_REBOOT_MAGIC2A: u32 = 85072278; -pub const LINUX_REBOOT_MAGIC2B: u32 = 369367448; -pub const LINUX_REBOOT_MAGIC2C: u32 = 537993216; -pub const LINUX_REBOOT_CMD_RESTART: u32 = 19088743; -pub const LINUX_REBOOT_CMD_HALT: u32 = 3454992675; -pub const LINUX_REBOOT_CMD_CAD_ON: u32 = 2309737967; -pub const LINUX_REBOOT_CMD_CAD_OFF: u32 = 0; -pub const LINUX_REBOOT_CMD_POWER_OFF: u32 = 1126301404; -pub const LINUX_REBOOT_CMD_RESTART2: u32 = 2712847316; -pub const LINUX_REBOOT_CMD_SW_SUSPEND: u32 = 3489725666; -pub const LINUX_REBOOT_CMD_KEXEC: u32 = 1163412803; pub const ITIMER_REAL: u32 = 0; pub const ITIMER_VIRTUAL: u32 = 1; pub const ITIMER_PROF: u32 = 2; diff -Nru temporalio-1.3.0/vendor/linux-raw-sys/src/powerpc64/net.rs temporalio-1.3.0/vendor/linux-raw-sys/src/powerpc64/net.rs --- temporalio-1.3.0/vendor/linux-raw-sys/src/powerpc64/net.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/linux-raw-sys/src/powerpc64/net.rs 2023-10-30 19:40:00.000000000 +0000 @@ -482,255 +482,6 @@ } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct sync_serial_settings { -pub clock_rate: crate::ctypes::c_uint, -pub clock_type: crate::ctypes::c_uint, -pub loopback: crate::ctypes::c_ushort, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct te1_settings { -pub clock_rate: crate::ctypes::c_uint, -pub clock_type: crate::ctypes::c_uint, -pub loopback: crate::ctypes::c_ushort, -pub slot_map: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct raw_hdlc_proto { -pub encoding: crate::ctypes::c_ushort, -pub parity: crate::ctypes::c_ushort, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fr_proto { -pub t391: crate::ctypes::c_uint, -pub t392: crate::ctypes::c_uint, -pub n391: crate::ctypes::c_uint, -pub n392: crate::ctypes::c_uint, -pub n393: crate::ctypes::c_uint, -pub lmi: crate::ctypes::c_ushort, -pub dce: crate::ctypes::c_ushort, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fr_proto_pvc { -pub dlci: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fr_proto_pvc_info { -pub dlci: crate::ctypes::c_uint, -pub master: [crate::ctypes::c_char; 16usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct cisco_proto { -pub interval: crate::ctypes::c_uint, -pub timeout: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct x25_hdlc_proto { -pub dce: crate::ctypes::c_ushort, -pub modulo: crate::ctypes::c_uint, -pub window: crate::ctypes::c_uint, -pub t1: crate::ctypes::c_uint, -pub t2: crate::ctypes::c_uint, -pub n2: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ifmap { -pub mem_start: crate::ctypes::c_ulong, -pub mem_end: crate::ctypes::c_ulong, -pub base_addr: crate::ctypes::c_ushort, -pub irq: crate::ctypes::c_uchar, -pub dma: crate::ctypes::c_uchar, -pub port: crate::ctypes::c_uchar, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct if_settings { -pub type_: crate::ctypes::c_uint, -pub size: crate::ctypes::c_uint, -pub ifs_ifsu: if_settings__bindgen_ty_1, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ifreq { -pub ifr_ifrn: ifreq__bindgen_ty_1, -pub ifr_ifru: ifreq__bindgen_ty_2, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ifconf { -pub ifc_len: crate::ctypes::c_int, -pub ifc_ifcu: ifconf__bindgen_ty_1, -} -#[repr(C)] -pub struct xt_entry_match { -pub u: xt_entry_match__bindgen_ty_1, -pub data: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_match__bindgen_ty_1__bindgen_ty_1 { -pub match_size: __u16, -pub name: [crate::ctypes::c_char; 29usize], -pub revision: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_match__bindgen_ty_1__bindgen_ty_2 { -pub match_size: __u16, -pub match_: *mut xt_match, -} -#[repr(C)] -pub struct xt_entry_target { -pub u: xt_entry_target__bindgen_ty_1, -pub data: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_target__bindgen_ty_1__bindgen_ty_1 { -pub target_size: __u16, -pub name: [crate::ctypes::c_char; 29usize], -pub revision: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_target__bindgen_ty_1__bindgen_ty_2 { -pub target_size: __u16, -pub target: *mut xt_target, -} -#[repr(C)] -pub struct xt_standard_target { -pub target: xt_entry_target, -pub verdict: crate::ctypes::c_int, -} -#[repr(C)] -pub struct xt_error_target { -pub target: xt_entry_target, -pub errorname: [crate::ctypes::c_char; 30usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_get_revision { -pub name: [crate::ctypes::c_char; 29usize], -pub revision: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct _xt_align { -pub u8_: __u8, -pub u16_: __u16, -pub u32_: __u32, -pub u64_: __u64, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_counters { -pub pcnt: __u64, -pub bcnt: __u64, -} -#[repr(C)] -#[derive(Debug)] -pub struct xt_counters_info { -pub name: [crate::ctypes::c_char; 32usize], -pub num_counters: crate::ctypes::c_uint, -pub counters: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_tcp { -pub spts: [__u16; 2usize], -pub dpts: [__u16; 2usize], -pub option: __u8, -pub flg_mask: __u8, -pub flg_cmp: __u8, -pub invflags: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_udp { -pub spts: [__u16; 2usize], -pub dpts: [__u16; 2usize], -pub invflags: __u8, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ip6t_ip6 { -pub src: in6_addr, -pub dst: in6_addr, -pub smsk: in6_addr, -pub dmsk: in6_addr, -pub iniface: [crate::ctypes::c_char; 16usize], -pub outiface: [crate::ctypes::c_char; 16usize], -pub iniface_mask: [crate::ctypes::c_uchar; 16usize], -pub outiface_mask: [crate::ctypes::c_uchar; 16usize], -pub proto: __u16, -pub tos: __u8, -pub flags: __u8, -pub invflags: __u8, -} -#[repr(C)] -pub struct ip6t_entry { -pub ipv6: ip6t_ip6, -pub nfcache: crate::ctypes::c_uint, -pub target_offset: __u16, -pub next_offset: __u16, -pub comefrom: crate::ctypes::c_uint, -pub counters: xt_counters, -pub elems: __IncompleteArrayField, -} -#[repr(C)] -pub struct ip6t_standard { -pub entry: ip6t_entry, -pub target: xt_standard_target, -} -#[repr(C)] -pub struct ip6t_error { -pub entry: ip6t_entry, -pub target: xt_error_target, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ip6t_icmp { -pub type_: __u8, -pub code: [__u8; 2usize], -pub invflags: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ip6t_getinfo { -pub name: [crate::ctypes::c_char; 32usize], -pub valid_hooks: crate::ctypes::c_uint, -pub hook_entry: [crate::ctypes::c_uint; 5usize], -pub underflow: [crate::ctypes::c_uint; 5usize], -pub num_entries: crate::ctypes::c_uint, -pub size: crate::ctypes::c_uint, -} -#[repr(C)] -pub struct ip6t_replace { -pub name: [crate::ctypes::c_char; 32usize], -pub valid_hooks: crate::ctypes::c_uint, -pub num_entries: crate::ctypes::c_uint, -pub size: crate::ctypes::c_uint, -pub hook_entry: [crate::ctypes::c_uint; 5usize], -pub underflow: [crate::ctypes::c_uint; 5usize], -pub num_counters: crate::ctypes::c_uint, -pub counters: *mut xt_counters, -pub entries: __IncompleteArrayField, -} -#[repr(C)] -pub struct ip6t_get_entries { -pub name: [crate::ctypes::c_char; 32usize], -pub size: crate::ctypes::c_uint, -pub entrytable: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] pub struct linger { pub l_onoff: crate::ctypes::c_int, pub l_linger: crate::ctypes::c_int, @@ -768,16 +519,6 @@ } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct xt_match { -pub _address: u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_target { -pub _address: u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] pub struct iovec { pub _address: u8, } @@ -1200,135 +941,6 @@ pub const TCP_MD5SIG_FLAG_IFINDEX: u32 = 2; pub const TCP_RECEIVE_ZEROCOPY_FLAG_TLB_CLEAN_HINT: u32 = 1; pub const UNIX_PATH_MAX: u32 = 108; -pub const IFNAMSIZ: u32 = 16; -pub const IFALIASZ: u32 = 256; -pub const ALTIFNAMSIZ: u32 = 128; -pub const GENERIC_HDLC_VERSION: u32 = 4; -pub const CLOCK_DEFAULT: u32 = 0; -pub const CLOCK_EXT: u32 = 1; -pub const CLOCK_INT: u32 = 2; -pub const CLOCK_TXINT: u32 = 3; -pub const CLOCK_TXFROMRX: u32 = 4; -pub const ENCODING_DEFAULT: u32 = 0; -pub const ENCODING_NRZ: u32 = 1; -pub const ENCODING_NRZI: u32 = 2; -pub const ENCODING_FM_MARK: u32 = 3; -pub const ENCODING_FM_SPACE: u32 = 4; -pub const ENCODING_MANCHESTER: u32 = 5; -pub const PARITY_DEFAULT: u32 = 0; -pub const PARITY_NONE: u32 = 1; -pub const PARITY_CRC16_PR0: u32 = 2; -pub const PARITY_CRC16_PR1: u32 = 3; -pub const PARITY_CRC16_PR0_CCITT: u32 = 4; -pub const PARITY_CRC16_PR1_CCITT: u32 = 5; -pub const PARITY_CRC32_PR0_CCITT: u32 = 6; -pub const PARITY_CRC32_PR1_CCITT: u32 = 7; -pub const LMI_DEFAULT: u32 = 0; -pub const LMI_NONE: u32 = 1; -pub const LMI_ANSI: u32 = 2; -pub const LMI_CCITT: u32 = 3; -pub const LMI_CISCO: u32 = 4; -pub const IF_GET_IFACE: u32 = 1; -pub const IF_GET_PROTO: u32 = 2; -pub const IF_IFACE_V35: u32 = 4096; -pub const IF_IFACE_V24: u32 = 4097; -pub const IF_IFACE_X21: u32 = 4098; -pub const IF_IFACE_T1: u32 = 4099; -pub const IF_IFACE_E1: u32 = 4100; -pub const IF_IFACE_SYNC_SERIAL: u32 = 4101; -pub const IF_IFACE_X21D: u32 = 4102; -pub const IF_PROTO_HDLC: u32 = 8192; -pub const IF_PROTO_PPP: u32 = 8193; -pub const IF_PROTO_CISCO: u32 = 8194; -pub const IF_PROTO_FR: u32 = 8195; -pub const IF_PROTO_FR_ADD_PVC: u32 = 8196; -pub const IF_PROTO_FR_DEL_PVC: u32 = 8197; -pub const IF_PROTO_X25: u32 = 8198; -pub const IF_PROTO_HDLC_ETH: u32 = 8199; -pub const IF_PROTO_FR_ADD_ETH_PVC: u32 = 8200; -pub const IF_PROTO_FR_DEL_ETH_PVC: u32 = 8201; -pub const IF_PROTO_FR_PVC: u32 = 8202; -pub const IF_PROTO_FR_ETH_PVC: u32 = 8203; -pub const IF_PROTO_RAW: u32 = 8204; -pub const IFHWADDRLEN: u32 = 6; -pub const NF_DROP: u32 = 0; -pub const NF_ACCEPT: u32 = 1; -pub const NF_STOLEN: u32 = 2; -pub const NF_QUEUE: u32 = 3; -pub const NF_REPEAT: u32 = 4; -pub const NF_STOP: u32 = 5; -pub const NF_MAX_VERDICT: u32 = 5; -pub const NF_VERDICT_MASK: u32 = 255; -pub const NF_VERDICT_FLAG_QUEUE_BYPASS: u32 = 32768; -pub const NF_VERDICT_QMASK: u32 = 4294901760; -pub const NF_VERDICT_QBITS: u32 = 16; -pub const NF_VERDICT_BITS: u32 = 16; -pub const NF_IP6_PRE_ROUTING: u32 = 0; -pub const NF_IP6_LOCAL_IN: u32 = 1; -pub const NF_IP6_FORWARD: u32 = 2; -pub const NF_IP6_LOCAL_OUT: u32 = 3; -pub const NF_IP6_POST_ROUTING: u32 = 4; -pub const NF_IP6_NUMHOOKS: u32 = 5; -pub const XT_FUNCTION_MAXNAMELEN: u32 = 30; -pub const XT_EXTENSION_MAXNAMELEN: u32 = 29; -pub const XT_TABLE_MAXNAMELEN: u32 = 32; -pub const XT_CONTINUE: u32 = 4294967295; -pub const XT_RETURN: i32 = -5; -pub const XT_STANDARD_TARGET: &[u8; 1] = b"\0"; -pub const XT_ERROR_TARGET: &[u8; 6] = b"ERROR\0"; -pub const XT_INV_PROTO: u32 = 64; -pub const IP6T_FUNCTION_MAXNAMELEN: u32 = 30; -pub const IP6T_TABLE_MAXNAMELEN: u32 = 32; -pub const IP6T_CONTINUE: u32 = 4294967295; -pub const IP6T_RETURN: i32 = -5; -pub const XT_TCP_INV_SRCPT: u32 = 1; -pub const XT_TCP_INV_DSTPT: u32 = 2; -pub const XT_TCP_INV_FLAGS: u32 = 4; -pub const XT_TCP_INV_OPTION: u32 = 8; -pub const XT_TCP_INV_MASK: u32 = 15; -pub const XT_UDP_INV_SRCPT: u32 = 1; -pub const XT_UDP_INV_DSTPT: u32 = 2; -pub const XT_UDP_INV_MASK: u32 = 3; -pub const IP6T_TCP_INV_SRCPT: u32 = 1; -pub const IP6T_TCP_INV_DSTPT: u32 = 2; -pub const IP6T_TCP_INV_FLAGS: u32 = 4; -pub const IP6T_TCP_INV_OPTION: u32 = 8; -pub const IP6T_TCP_INV_MASK: u32 = 15; -pub const IP6T_UDP_INV_SRCPT: u32 = 1; -pub const IP6T_UDP_INV_DSTPT: u32 = 2; -pub const IP6T_UDP_INV_MASK: u32 = 3; -pub const IP6T_STANDARD_TARGET: &[u8; 1] = b"\0"; -pub const IP6T_ERROR_TARGET: &[u8; 6] = b"ERROR\0"; -pub const IP6T_F_PROTO: u32 = 1; -pub const IP6T_F_TOS: u32 = 2; -pub const IP6T_F_GOTO: u32 = 4; -pub const IP6T_F_MASK: u32 = 7; -pub const IP6T_INV_VIA_IN: u32 = 1; -pub const IP6T_INV_VIA_OUT: u32 = 2; -pub const IP6T_INV_TOS: u32 = 4; -pub const IP6T_INV_SRCIP: u32 = 8; -pub const IP6T_INV_DSTIP: u32 = 16; -pub const IP6T_INV_FRAG: u32 = 32; -pub const IP6T_INV_PROTO: u32 = 64; -pub const IP6T_INV_MASK: u32 = 127; -pub const IP6T_BASE_CTL: u32 = 64; -pub const IP6T_SO_SET_REPLACE: u32 = 64; -pub const IP6T_SO_SET_ADD_COUNTERS: u32 = 65; -pub const IP6T_SO_SET_MAX: u32 = 65; -pub const IP6T_SO_GET_INFO: u32 = 64; -pub const IP6T_SO_GET_ENTRIES: u32 = 65; -pub const IP6T_SO_GET_REVISION_MATCH: u32 = 68; -pub const IP6T_SO_GET_REVISION_TARGET: u32 = 69; -pub const IP6T_SO_GET_MAX: u32 = 69; -pub const IP6T_SO_ORIGINAL_DST: u32 = 80; -pub const IP6T_ICMP_INV: u32 = 1; -pub const NF_IP_PRE_ROUTING: u32 = 0; -pub const NF_IP_LOCAL_IN: u32 = 1; -pub const NF_IP_FORWARD: u32 = 2; -pub const NF_IP_LOCAL_OUT: u32 = 3; -pub const NF_IP_POST_ROUTING: u32 = 4; -pub const NF_IP_NUMHOOKS: u32 = 5; -pub const SO_ORIGINAL_DST: u32 = 80; pub const SHUT_RD: u32 = 0; pub const SHUT_WR: u32 = 1; pub const SHUT_RDWR: u32 = 2; @@ -1557,25 +1169,6 @@ pub const TCP_NLA_EDT: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_EDT; pub const TCP_NLA_TTL: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_TTL; pub const TCP_NLA_REHASH: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_REHASH; -pub const IF_OPER_UNKNOWN: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_UNKNOWN; -pub const IF_OPER_NOTPRESENT: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_NOTPRESENT; -pub const IF_OPER_DOWN: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_DOWN; -pub const IF_OPER_LOWERLAYERDOWN: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_LOWERLAYERDOWN; -pub const IF_OPER_TESTING: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_TESTING; -pub const IF_OPER_DORMANT: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_DORMANT; -pub const IF_OPER_UP: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_UP; -pub const IF_LINK_MODE_DEFAULT: _bindgen_ty_8 = _bindgen_ty_8::IF_LINK_MODE_DEFAULT; -pub const IF_LINK_MODE_DORMANT: _bindgen_ty_8 = _bindgen_ty_8::IF_LINK_MODE_DORMANT; -pub const IF_LINK_MODE_TESTING: _bindgen_ty_8 = _bindgen_ty_8::IF_LINK_MODE_TESTING; -pub const NFPROTO_UNSPEC: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_UNSPEC; -pub const NFPROTO_INET: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_INET; -pub const NFPROTO_IPV4: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_IPV4; -pub const NFPROTO_ARP: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_ARP; -pub const NFPROTO_NETDEV: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_NETDEV; -pub const NFPROTO_BRIDGE: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_BRIDGE; -pub const NFPROTO_IPV6: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_IPV6; -pub const NFPROTO_DECNET: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_DECNET; -pub const NFPROTO_NUMPROTO: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_NUMPROTO; #[repr(u32)] #[non_exhaustive] #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] @@ -1799,121 +1392,6 @@ TCP_NLA_TTL = 26, TCP_NLA_REHASH = 27, } -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum net_device_flags { -IFF_UP = 1, -IFF_BROADCAST = 2, -IFF_DEBUG = 4, -IFF_LOOPBACK = 8, -IFF_POINTOPOINT = 16, -IFF_NOTRAILERS = 32, -IFF_RUNNING = 64, -IFF_NOARP = 128, -IFF_PROMISC = 256, -IFF_ALLMULTI = 512, -IFF_MASTER = 1024, -IFF_SLAVE = 2048, -IFF_MULTICAST = 4096, -IFF_PORTSEL = 8192, -IFF_AUTOMEDIA = 16384, -IFF_DYNAMIC = 32768, -IFF_LOWER_UP = 65536, -IFF_DORMANT = 131072, -IFF_ECHO = 262144, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_7 { -IF_OPER_UNKNOWN = 0, -IF_OPER_NOTPRESENT = 1, -IF_OPER_DOWN = 2, -IF_OPER_LOWERLAYERDOWN = 3, -IF_OPER_TESTING = 4, -IF_OPER_DORMANT = 5, -IF_OPER_UP = 6, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_8 { -IF_LINK_MODE_DEFAULT = 0, -IF_LINK_MODE_DORMANT = 1, -IF_LINK_MODE_TESTING = 2, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_inet_hooks { -NF_INET_PRE_ROUTING = 0, -NF_INET_LOCAL_IN = 1, -NF_INET_FORWARD = 2, -NF_INET_LOCAL_OUT = 3, -NF_INET_POST_ROUTING = 4, -NF_INET_NUMHOOKS = 5, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_dev_hooks { -NF_NETDEV_INGRESS = 0, -NF_NETDEV_EGRESS = 1, -NF_NETDEV_NUMHOOKS = 2, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_9 { -NFPROTO_UNSPEC = 0, -NFPROTO_INET = 1, -NFPROTO_IPV4 = 2, -NFPROTO_ARP = 3, -NFPROTO_NETDEV = 5, -NFPROTO_BRIDGE = 7, -NFPROTO_IPV6 = 10, -NFPROTO_DECNET = 12, -NFPROTO_NUMPROTO = 13, -} -#[repr(i32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_ip6_hook_priorities { -NF_IP6_PRI_FIRST = -2147483648, -NF_IP6_PRI_RAW_BEFORE_DEFRAG = -450, -NF_IP6_PRI_CONNTRACK_DEFRAG = -400, -NF_IP6_PRI_RAW = -300, -NF_IP6_PRI_SELINUX_FIRST = -225, -NF_IP6_PRI_CONNTRACK = -200, -NF_IP6_PRI_MANGLE = -150, -NF_IP6_PRI_NAT_DST = -100, -NF_IP6_PRI_FILTER = 0, -NF_IP6_PRI_SECURITY = 50, -NF_IP6_PRI_NAT_SRC = 100, -NF_IP6_PRI_SELINUX_LAST = 225, -NF_IP6_PRI_CONNTRACK_HELPER = 300, -NF_IP6_PRI_LAST = 2147483647, -} -#[repr(i32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_ip_hook_priorities { -NF_IP_PRI_FIRST = -2147483648, -NF_IP_PRI_RAW_BEFORE_DEFRAG = -450, -NF_IP_PRI_CONNTRACK_DEFRAG = -400, -NF_IP_PRI_RAW = -300, -NF_IP_PRI_SELINUX_FIRST = -225, -NF_IP_PRI_CONNTRACK = -200, -NF_IP_PRI_MANGLE = -150, -NF_IP_PRI_NAT_DST = -100, -NF_IP_PRI_FILTER = 0, -NF_IP_PRI_SECURITY = 50, -NF_IP_PRI_NAT_SRC = 100, -NF_IP_PRI_SELINUX_LAST = 225, -NF_IP_PRI_CONNTRACK_HELPER = 300, -NF_IP_PRI_CONNTRACK_CONFIRM = 2147483647, -} #[repr(C)] #[derive(Copy, Clone)] pub union __kernel_sockaddr_storage__bindgen_ty_1 { @@ -1945,69 +1423,6 @@ pub hdr: tcphdr, pub words: [__be32; 5usize], } -#[repr(C)] -#[derive(Copy, Clone)] -pub union if_settings__bindgen_ty_1 { -pub raw_hdlc: *mut raw_hdlc_proto, -pub cisco: *mut cisco_proto, -pub fr: *mut fr_proto, -pub fr_pvc: *mut fr_proto_pvc, -pub fr_pvc_info: *mut fr_proto_pvc_info, -pub x25: *mut x25_hdlc_proto, -pub sync: *mut sync_serial_settings, -pub te1: *mut te1_settings, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ifreq__bindgen_ty_1 { -pub ifrn_name: [crate::ctypes::c_char; 16usize], -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ifreq__bindgen_ty_2 { -pub ifru_addr: sockaddr, -pub ifru_dstaddr: sockaddr, -pub ifru_broadaddr: sockaddr, -pub ifru_netmask: sockaddr, -pub ifru_hwaddr: sockaddr, -pub ifru_flags: crate::ctypes::c_short, -pub ifru_ivalue: crate::ctypes::c_int, -pub ifru_mtu: crate::ctypes::c_int, -pub ifru_map: ifmap, -pub ifru_slave: [crate::ctypes::c_char; 16usize], -pub ifru_newname: [crate::ctypes::c_char; 16usize], -pub ifru_data: *mut crate::ctypes::c_void, -pub ifru_settings: if_settings, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ifconf__bindgen_ty_1 { -pub ifcu_buf: *mut crate::ctypes::c_char, -pub ifcu_req: *mut ifreq, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union nf_inet_addr { -pub all: [__u32; 4usize], -pub ip: __be32, -pub ip6: [__be32; 4usize], -pub in_: in_addr, -pub in6: in6_addr, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union xt_entry_match__bindgen_ty_1 { -pub user: xt_entry_match__bindgen_ty_1__bindgen_ty_1, -pub kernel: xt_entry_match__bindgen_ty_1__bindgen_ty_2, -pub match_size: __u16, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union xt_entry_target__bindgen_ty_1 { -pub user: xt_entry_target__bindgen_ty_1__bindgen_ty_1, -pub kernel: xt_entry_target__bindgen_ty_1__bindgen_ty_2, -pub target_size: __u16, -} impl __BindgenBitfieldUnit { #[inline] pub const fn new(storage: Storage) -> Self { @@ -2433,9 +1848,3 @@ __bindgen_bitfield_unit } } -impl nf_inet_hooks { -pub const NF_INET_INGRESS: nf_inet_hooks = nf_inet_hooks::NF_INET_NUMHOOKS; -} -impl nf_ip_hook_priorities { -pub const NF_IP_PRI_LAST: nf_ip_hook_priorities = nf_ip_hook_priorities::NF_IP_PRI_CONNTRACK_CONFIRM; -} diff -Nru temporalio-1.3.0/vendor/linux-raw-sys/src/riscv32/general.rs temporalio-1.3.0/vendor/linux-raw-sys/src/riscv32/general.rs --- temporalio-1.3.0/vendor/linux-raw-sys/src/riscv32/general.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/linux-raw-sys/src/riscv32/general.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1601,19 +1601,6 @@ pub const GRND_NONBLOCK: u32 = 1; pub const GRND_RANDOM: u32 = 2; pub const GRND_INSECURE: u32 = 4; -pub const LINUX_REBOOT_MAGIC1: u32 = 4276215469; -pub const LINUX_REBOOT_MAGIC2: u32 = 672274793; -pub const LINUX_REBOOT_MAGIC2A: u32 = 85072278; -pub const LINUX_REBOOT_MAGIC2B: u32 = 369367448; -pub const LINUX_REBOOT_MAGIC2C: u32 = 537993216; -pub const LINUX_REBOOT_CMD_RESTART: u32 = 19088743; -pub const LINUX_REBOOT_CMD_HALT: u32 = 3454992675; -pub const LINUX_REBOOT_CMD_CAD_ON: u32 = 2309737967; -pub const LINUX_REBOOT_CMD_CAD_OFF: u32 = 0; -pub const LINUX_REBOOT_CMD_POWER_OFF: u32 = 1126301404; -pub const LINUX_REBOOT_CMD_RESTART2: u32 = 2712847316; -pub const LINUX_REBOOT_CMD_SW_SUSPEND: u32 = 3489725666; -pub const LINUX_REBOOT_CMD_KEXEC: u32 = 1163412803; pub const ITIMER_REAL: u32 = 0; pub const ITIMER_VIRTUAL: u32 = 1; pub const ITIMER_PROF: u32 = 2; diff -Nru temporalio-1.3.0/vendor/linux-raw-sys/src/riscv32/net.rs temporalio-1.3.0/vendor/linux-raw-sys/src/riscv32/net.rs --- temporalio-1.3.0/vendor/linux-raw-sys/src/riscv32/net.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/linux-raw-sys/src/riscv32/net.rs 2023-10-30 19:40:00.000000000 +0000 @@ -476,255 +476,6 @@ } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct sync_serial_settings { -pub clock_rate: crate::ctypes::c_uint, -pub clock_type: crate::ctypes::c_uint, -pub loopback: crate::ctypes::c_ushort, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct te1_settings { -pub clock_rate: crate::ctypes::c_uint, -pub clock_type: crate::ctypes::c_uint, -pub loopback: crate::ctypes::c_ushort, -pub slot_map: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct raw_hdlc_proto { -pub encoding: crate::ctypes::c_ushort, -pub parity: crate::ctypes::c_ushort, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fr_proto { -pub t391: crate::ctypes::c_uint, -pub t392: crate::ctypes::c_uint, -pub n391: crate::ctypes::c_uint, -pub n392: crate::ctypes::c_uint, -pub n393: crate::ctypes::c_uint, -pub lmi: crate::ctypes::c_ushort, -pub dce: crate::ctypes::c_ushort, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fr_proto_pvc { -pub dlci: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fr_proto_pvc_info { -pub dlci: crate::ctypes::c_uint, -pub master: [crate::ctypes::c_char; 16usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct cisco_proto { -pub interval: crate::ctypes::c_uint, -pub timeout: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct x25_hdlc_proto { -pub dce: crate::ctypes::c_ushort, -pub modulo: crate::ctypes::c_uint, -pub window: crate::ctypes::c_uint, -pub t1: crate::ctypes::c_uint, -pub t2: crate::ctypes::c_uint, -pub n2: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ifmap { -pub mem_start: crate::ctypes::c_ulong, -pub mem_end: crate::ctypes::c_ulong, -pub base_addr: crate::ctypes::c_ushort, -pub irq: crate::ctypes::c_uchar, -pub dma: crate::ctypes::c_uchar, -pub port: crate::ctypes::c_uchar, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct if_settings { -pub type_: crate::ctypes::c_uint, -pub size: crate::ctypes::c_uint, -pub ifs_ifsu: if_settings__bindgen_ty_1, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ifreq { -pub ifr_ifrn: ifreq__bindgen_ty_1, -pub ifr_ifru: ifreq__bindgen_ty_2, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ifconf { -pub ifc_len: crate::ctypes::c_int, -pub ifc_ifcu: ifconf__bindgen_ty_1, -} -#[repr(C)] -pub struct xt_entry_match { -pub u: xt_entry_match__bindgen_ty_1, -pub data: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_match__bindgen_ty_1__bindgen_ty_1 { -pub match_size: __u16, -pub name: [crate::ctypes::c_char; 29usize], -pub revision: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_match__bindgen_ty_1__bindgen_ty_2 { -pub match_size: __u16, -pub match_: *mut xt_match, -} -#[repr(C)] -pub struct xt_entry_target { -pub u: xt_entry_target__bindgen_ty_1, -pub data: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_target__bindgen_ty_1__bindgen_ty_1 { -pub target_size: __u16, -pub name: [crate::ctypes::c_char; 29usize], -pub revision: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_target__bindgen_ty_1__bindgen_ty_2 { -pub target_size: __u16, -pub target: *mut xt_target, -} -#[repr(C)] -pub struct xt_standard_target { -pub target: xt_entry_target, -pub verdict: crate::ctypes::c_int, -} -#[repr(C)] -pub struct xt_error_target { -pub target: xt_entry_target, -pub errorname: [crate::ctypes::c_char; 30usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_get_revision { -pub name: [crate::ctypes::c_char; 29usize], -pub revision: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct _xt_align { -pub u8_: __u8, -pub u16_: __u16, -pub u32_: __u32, -pub u64_: __u64, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_counters { -pub pcnt: __u64, -pub bcnt: __u64, -} -#[repr(C)] -#[derive(Debug)] -pub struct xt_counters_info { -pub name: [crate::ctypes::c_char; 32usize], -pub num_counters: crate::ctypes::c_uint, -pub counters: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_tcp { -pub spts: [__u16; 2usize], -pub dpts: [__u16; 2usize], -pub option: __u8, -pub flg_mask: __u8, -pub flg_cmp: __u8, -pub invflags: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_udp { -pub spts: [__u16; 2usize], -pub dpts: [__u16; 2usize], -pub invflags: __u8, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ip6t_ip6 { -pub src: in6_addr, -pub dst: in6_addr, -pub smsk: in6_addr, -pub dmsk: in6_addr, -pub iniface: [crate::ctypes::c_char; 16usize], -pub outiface: [crate::ctypes::c_char; 16usize], -pub iniface_mask: [crate::ctypes::c_uchar; 16usize], -pub outiface_mask: [crate::ctypes::c_uchar; 16usize], -pub proto: __u16, -pub tos: __u8, -pub flags: __u8, -pub invflags: __u8, -} -#[repr(C)] -pub struct ip6t_entry { -pub ipv6: ip6t_ip6, -pub nfcache: crate::ctypes::c_uint, -pub target_offset: __u16, -pub next_offset: __u16, -pub comefrom: crate::ctypes::c_uint, -pub counters: xt_counters, -pub elems: __IncompleteArrayField, -} -#[repr(C)] -pub struct ip6t_standard { -pub entry: ip6t_entry, -pub target: xt_standard_target, -} -#[repr(C)] -pub struct ip6t_error { -pub entry: ip6t_entry, -pub target: xt_error_target, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ip6t_icmp { -pub type_: __u8, -pub code: [__u8; 2usize], -pub invflags: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ip6t_getinfo { -pub name: [crate::ctypes::c_char; 32usize], -pub valid_hooks: crate::ctypes::c_uint, -pub hook_entry: [crate::ctypes::c_uint; 5usize], -pub underflow: [crate::ctypes::c_uint; 5usize], -pub num_entries: crate::ctypes::c_uint, -pub size: crate::ctypes::c_uint, -} -#[repr(C)] -pub struct ip6t_replace { -pub name: [crate::ctypes::c_char; 32usize], -pub valid_hooks: crate::ctypes::c_uint, -pub num_entries: crate::ctypes::c_uint, -pub size: crate::ctypes::c_uint, -pub hook_entry: [crate::ctypes::c_uint; 5usize], -pub underflow: [crate::ctypes::c_uint; 5usize], -pub num_counters: crate::ctypes::c_uint, -pub counters: *mut xt_counters, -pub entries: __IncompleteArrayField, -} -#[repr(C)] -pub struct ip6t_get_entries { -pub name: [crate::ctypes::c_char; 32usize], -pub size: crate::ctypes::c_uint, -pub entrytable: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] pub struct linger { pub l_onoff: crate::ctypes::c_int, pub l_linger: crate::ctypes::c_int, @@ -762,16 +513,6 @@ } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct xt_match { -pub _address: u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_target { -pub _address: u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] pub struct iovec { pub _address: u8, } @@ -1186,135 +927,6 @@ pub const TCP_MD5SIG_FLAG_IFINDEX: u32 = 2; pub const TCP_RECEIVE_ZEROCOPY_FLAG_TLB_CLEAN_HINT: u32 = 1; pub const UNIX_PATH_MAX: u32 = 108; -pub const IFNAMSIZ: u32 = 16; -pub const IFALIASZ: u32 = 256; -pub const ALTIFNAMSIZ: u32 = 128; -pub const GENERIC_HDLC_VERSION: u32 = 4; -pub const CLOCK_DEFAULT: u32 = 0; -pub const CLOCK_EXT: u32 = 1; -pub const CLOCK_INT: u32 = 2; -pub const CLOCK_TXINT: u32 = 3; -pub const CLOCK_TXFROMRX: u32 = 4; -pub const ENCODING_DEFAULT: u32 = 0; -pub const ENCODING_NRZ: u32 = 1; -pub const ENCODING_NRZI: u32 = 2; -pub const ENCODING_FM_MARK: u32 = 3; -pub const ENCODING_FM_SPACE: u32 = 4; -pub const ENCODING_MANCHESTER: u32 = 5; -pub const PARITY_DEFAULT: u32 = 0; -pub const PARITY_NONE: u32 = 1; -pub const PARITY_CRC16_PR0: u32 = 2; -pub const PARITY_CRC16_PR1: u32 = 3; -pub const PARITY_CRC16_PR0_CCITT: u32 = 4; -pub const PARITY_CRC16_PR1_CCITT: u32 = 5; -pub const PARITY_CRC32_PR0_CCITT: u32 = 6; -pub const PARITY_CRC32_PR1_CCITT: u32 = 7; -pub const LMI_DEFAULT: u32 = 0; -pub const LMI_NONE: u32 = 1; -pub const LMI_ANSI: u32 = 2; -pub const LMI_CCITT: u32 = 3; -pub const LMI_CISCO: u32 = 4; -pub const IF_GET_IFACE: u32 = 1; -pub const IF_GET_PROTO: u32 = 2; -pub const IF_IFACE_V35: u32 = 4096; -pub const IF_IFACE_V24: u32 = 4097; -pub const IF_IFACE_X21: u32 = 4098; -pub const IF_IFACE_T1: u32 = 4099; -pub const IF_IFACE_E1: u32 = 4100; -pub const IF_IFACE_SYNC_SERIAL: u32 = 4101; -pub const IF_IFACE_X21D: u32 = 4102; -pub const IF_PROTO_HDLC: u32 = 8192; -pub const IF_PROTO_PPP: u32 = 8193; -pub const IF_PROTO_CISCO: u32 = 8194; -pub const IF_PROTO_FR: u32 = 8195; -pub const IF_PROTO_FR_ADD_PVC: u32 = 8196; -pub const IF_PROTO_FR_DEL_PVC: u32 = 8197; -pub const IF_PROTO_X25: u32 = 8198; -pub const IF_PROTO_HDLC_ETH: u32 = 8199; -pub const IF_PROTO_FR_ADD_ETH_PVC: u32 = 8200; -pub const IF_PROTO_FR_DEL_ETH_PVC: u32 = 8201; -pub const IF_PROTO_FR_PVC: u32 = 8202; -pub const IF_PROTO_FR_ETH_PVC: u32 = 8203; -pub const IF_PROTO_RAW: u32 = 8204; -pub const IFHWADDRLEN: u32 = 6; -pub const NF_DROP: u32 = 0; -pub const NF_ACCEPT: u32 = 1; -pub const NF_STOLEN: u32 = 2; -pub const NF_QUEUE: u32 = 3; -pub const NF_REPEAT: u32 = 4; -pub const NF_STOP: u32 = 5; -pub const NF_MAX_VERDICT: u32 = 5; -pub const NF_VERDICT_MASK: u32 = 255; -pub const NF_VERDICT_FLAG_QUEUE_BYPASS: u32 = 32768; -pub const NF_VERDICT_QMASK: u32 = 4294901760; -pub const NF_VERDICT_QBITS: u32 = 16; -pub const NF_VERDICT_BITS: u32 = 16; -pub const NF_IP6_PRE_ROUTING: u32 = 0; -pub const NF_IP6_LOCAL_IN: u32 = 1; -pub const NF_IP6_FORWARD: u32 = 2; -pub const NF_IP6_LOCAL_OUT: u32 = 3; -pub const NF_IP6_POST_ROUTING: u32 = 4; -pub const NF_IP6_NUMHOOKS: u32 = 5; -pub const XT_FUNCTION_MAXNAMELEN: u32 = 30; -pub const XT_EXTENSION_MAXNAMELEN: u32 = 29; -pub const XT_TABLE_MAXNAMELEN: u32 = 32; -pub const XT_CONTINUE: u32 = 4294967295; -pub const XT_RETURN: i32 = -5; -pub const XT_STANDARD_TARGET: &[u8; 1] = b"\0"; -pub const XT_ERROR_TARGET: &[u8; 6] = b"ERROR\0"; -pub const XT_INV_PROTO: u32 = 64; -pub const IP6T_FUNCTION_MAXNAMELEN: u32 = 30; -pub const IP6T_TABLE_MAXNAMELEN: u32 = 32; -pub const IP6T_CONTINUE: u32 = 4294967295; -pub const IP6T_RETURN: i32 = -5; -pub const XT_TCP_INV_SRCPT: u32 = 1; -pub const XT_TCP_INV_DSTPT: u32 = 2; -pub const XT_TCP_INV_FLAGS: u32 = 4; -pub const XT_TCP_INV_OPTION: u32 = 8; -pub const XT_TCP_INV_MASK: u32 = 15; -pub const XT_UDP_INV_SRCPT: u32 = 1; -pub const XT_UDP_INV_DSTPT: u32 = 2; -pub const XT_UDP_INV_MASK: u32 = 3; -pub const IP6T_TCP_INV_SRCPT: u32 = 1; -pub const IP6T_TCP_INV_DSTPT: u32 = 2; -pub const IP6T_TCP_INV_FLAGS: u32 = 4; -pub const IP6T_TCP_INV_OPTION: u32 = 8; -pub const IP6T_TCP_INV_MASK: u32 = 15; -pub const IP6T_UDP_INV_SRCPT: u32 = 1; -pub const IP6T_UDP_INV_DSTPT: u32 = 2; -pub const IP6T_UDP_INV_MASK: u32 = 3; -pub const IP6T_STANDARD_TARGET: &[u8; 1] = b"\0"; -pub const IP6T_ERROR_TARGET: &[u8; 6] = b"ERROR\0"; -pub const IP6T_F_PROTO: u32 = 1; -pub const IP6T_F_TOS: u32 = 2; -pub const IP6T_F_GOTO: u32 = 4; -pub const IP6T_F_MASK: u32 = 7; -pub const IP6T_INV_VIA_IN: u32 = 1; -pub const IP6T_INV_VIA_OUT: u32 = 2; -pub const IP6T_INV_TOS: u32 = 4; -pub const IP6T_INV_SRCIP: u32 = 8; -pub const IP6T_INV_DSTIP: u32 = 16; -pub const IP6T_INV_FRAG: u32 = 32; -pub const IP6T_INV_PROTO: u32 = 64; -pub const IP6T_INV_MASK: u32 = 127; -pub const IP6T_BASE_CTL: u32 = 64; -pub const IP6T_SO_SET_REPLACE: u32 = 64; -pub const IP6T_SO_SET_ADD_COUNTERS: u32 = 65; -pub const IP6T_SO_SET_MAX: u32 = 65; -pub const IP6T_SO_GET_INFO: u32 = 64; -pub const IP6T_SO_GET_ENTRIES: u32 = 65; -pub const IP6T_SO_GET_REVISION_MATCH: u32 = 68; -pub const IP6T_SO_GET_REVISION_TARGET: u32 = 69; -pub const IP6T_SO_GET_MAX: u32 = 69; -pub const IP6T_SO_ORIGINAL_DST: u32 = 80; -pub const IP6T_ICMP_INV: u32 = 1; -pub const NF_IP_PRE_ROUTING: u32 = 0; -pub const NF_IP_LOCAL_IN: u32 = 1; -pub const NF_IP_FORWARD: u32 = 2; -pub const NF_IP_LOCAL_OUT: u32 = 3; -pub const NF_IP_POST_ROUTING: u32 = 4; -pub const NF_IP_NUMHOOKS: u32 = 5; -pub const SO_ORIGINAL_DST: u32 = 80; pub const SHUT_RD: u32 = 0; pub const SHUT_WR: u32 = 1; pub const SHUT_RDWR: u32 = 2; @@ -1543,25 +1155,6 @@ pub const TCP_NLA_EDT: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_EDT; pub const TCP_NLA_TTL: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_TTL; pub const TCP_NLA_REHASH: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_REHASH; -pub const IF_OPER_UNKNOWN: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_UNKNOWN; -pub const IF_OPER_NOTPRESENT: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_NOTPRESENT; -pub const IF_OPER_DOWN: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_DOWN; -pub const IF_OPER_LOWERLAYERDOWN: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_LOWERLAYERDOWN; -pub const IF_OPER_TESTING: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_TESTING; -pub const IF_OPER_DORMANT: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_DORMANT; -pub const IF_OPER_UP: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_UP; -pub const IF_LINK_MODE_DEFAULT: _bindgen_ty_8 = _bindgen_ty_8::IF_LINK_MODE_DEFAULT; -pub const IF_LINK_MODE_DORMANT: _bindgen_ty_8 = _bindgen_ty_8::IF_LINK_MODE_DORMANT; -pub const IF_LINK_MODE_TESTING: _bindgen_ty_8 = _bindgen_ty_8::IF_LINK_MODE_TESTING; -pub const NFPROTO_UNSPEC: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_UNSPEC; -pub const NFPROTO_INET: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_INET; -pub const NFPROTO_IPV4: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_IPV4; -pub const NFPROTO_ARP: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_ARP; -pub const NFPROTO_NETDEV: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_NETDEV; -pub const NFPROTO_BRIDGE: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_BRIDGE; -pub const NFPROTO_IPV6: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_IPV6; -pub const NFPROTO_DECNET: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_DECNET; -pub const NFPROTO_NUMPROTO: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_NUMPROTO; #[repr(u32)] #[non_exhaustive] #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] @@ -1785,121 +1378,6 @@ TCP_NLA_TTL = 26, TCP_NLA_REHASH = 27, } -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum net_device_flags { -IFF_UP = 1, -IFF_BROADCAST = 2, -IFF_DEBUG = 4, -IFF_LOOPBACK = 8, -IFF_POINTOPOINT = 16, -IFF_NOTRAILERS = 32, -IFF_RUNNING = 64, -IFF_NOARP = 128, -IFF_PROMISC = 256, -IFF_ALLMULTI = 512, -IFF_MASTER = 1024, -IFF_SLAVE = 2048, -IFF_MULTICAST = 4096, -IFF_PORTSEL = 8192, -IFF_AUTOMEDIA = 16384, -IFF_DYNAMIC = 32768, -IFF_LOWER_UP = 65536, -IFF_DORMANT = 131072, -IFF_ECHO = 262144, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_7 { -IF_OPER_UNKNOWN = 0, -IF_OPER_NOTPRESENT = 1, -IF_OPER_DOWN = 2, -IF_OPER_LOWERLAYERDOWN = 3, -IF_OPER_TESTING = 4, -IF_OPER_DORMANT = 5, -IF_OPER_UP = 6, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_8 { -IF_LINK_MODE_DEFAULT = 0, -IF_LINK_MODE_DORMANT = 1, -IF_LINK_MODE_TESTING = 2, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_inet_hooks { -NF_INET_PRE_ROUTING = 0, -NF_INET_LOCAL_IN = 1, -NF_INET_FORWARD = 2, -NF_INET_LOCAL_OUT = 3, -NF_INET_POST_ROUTING = 4, -NF_INET_NUMHOOKS = 5, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_dev_hooks { -NF_NETDEV_INGRESS = 0, -NF_NETDEV_EGRESS = 1, -NF_NETDEV_NUMHOOKS = 2, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_9 { -NFPROTO_UNSPEC = 0, -NFPROTO_INET = 1, -NFPROTO_IPV4 = 2, -NFPROTO_ARP = 3, -NFPROTO_NETDEV = 5, -NFPROTO_BRIDGE = 7, -NFPROTO_IPV6 = 10, -NFPROTO_DECNET = 12, -NFPROTO_NUMPROTO = 13, -} -#[repr(i32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_ip6_hook_priorities { -NF_IP6_PRI_FIRST = -2147483648, -NF_IP6_PRI_RAW_BEFORE_DEFRAG = -450, -NF_IP6_PRI_CONNTRACK_DEFRAG = -400, -NF_IP6_PRI_RAW = -300, -NF_IP6_PRI_SELINUX_FIRST = -225, -NF_IP6_PRI_CONNTRACK = -200, -NF_IP6_PRI_MANGLE = -150, -NF_IP6_PRI_NAT_DST = -100, -NF_IP6_PRI_FILTER = 0, -NF_IP6_PRI_SECURITY = 50, -NF_IP6_PRI_NAT_SRC = 100, -NF_IP6_PRI_SELINUX_LAST = 225, -NF_IP6_PRI_CONNTRACK_HELPER = 300, -NF_IP6_PRI_LAST = 2147483647, -} -#[repr(i32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_ip_hook_priorities { -NF_IP_PRI_FIRST = -2147483648, -NF_IP_PRI_RAW_BEFORE_DEFRAG = -450, -NF_IP_PRI_CONNTRACK_DEFRAG = -400, -NF_IP_PRI_RAW = -300, -NF_IP_PRI_SELINUX_FIRST = -225, -NF_IP_PRI_CONNTRACK = -200, -NF_IP_PRI_MANGLE = -150, -NF_IP_PRI_NAT_DST = -100, -NF_IP_PRI_FILTER = 0, -NF_IP_PRI_SECURITY = 50, -NF_IP_PRI_NAT_SRC = 100, -NF_IP_PRI_SELINUX_LAST = 225, -NF_IP_PRI_CONNTRACK_HELPER = 300, -NF_IP_PRI_CONNTRACK_CONFIRM = 2147483647, -} #[repr(C)] #[derive(Copy, Clone)] pub union __kernel_sockaddr_storage__bindgen_ty_1 { @@ -1931,69 +1409,6 @@ pub hdr: tcphdr, pub words: [__be32; 5usize], } -#[repr(C)] -#[derive(Copy, Clone)] -pub union if_settings__bindgen_ty_1 { -pub raw_hdlc: *mut raw_hdlc_proto, -pub cisco: *mut cisco_proto, -pub fr: *mut fr_proto, -pub fr_pvc: *mut fr_proto_pvc, -pub fr_pvc_info: *mut fr_proto_pvc_info, -pub x25: *mut x25_hdlc_proto, -pub sync: *mut sync_serial_settings, -pub te1: *mut te1_settings, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ifreq__bindgen_ty_1 { -pub ifrn_name: [crate::ctypes::c_char; 16usize], -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ifreq__bindgen_ty_2 { -pub ifru_addr: sockaddr, -pub ifru_dstaddr: sockaddr, -pub ifru_broadaddr: sockaddr, -pub ifru_netmask: sockaddr, -pub ifru_hwaddr: sockaddr, -pub ifru_flags: crate::ctypes::c_short, -pub ifru_ivalue: crate::ctypes::c_int, -pub ifru_mtu: crate::ctypes::c_int, -pub ifru_map: ifmap, -pub ifru_slave: [crate::ctypes::c_char; 16usize], -pub ifru_newname: [crate::ctypes::c_char; 16usize], -pub ifru_data: *mut crate::ctypes::c_void, -pub ifru_settings: if_settings, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ifconf__bindgen_ty_1 { -pub ifcu_buf: *mut crate::ctypes::c_char, -pub ifcu_req: *mut ifreq, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union nf_inet_addr { -pub all: [__u32; 4usize], -pub ip: __be32, -pub ip6: [__be32; 4usize], -pub in_: in_addr, -pub in6: in6_addr, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union xt_entry_match__bindgen_ty_1 { -pub user: xt_entry_match__bindgen_ty_1__bindgen_ty_1, -pub kernel: xt_entry_match__bindgen_ty_1__bindgen_ty_2, -pub match_size: __u16, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union xt_entry_target__bindgen_ty_1 { -pub user: xt_entry_target__bindgen_ty_1__bindgen_ty_1, -pub kernel: xt_entry_target__bindgen_ty_1__bindgen_ty_2, -pub target_size: __u16, -} impl __BindgenBitfieldUnit { #[inline] pub const fn new(storage: Storage) -> Self { @@ -2419,9 +1834,3 @@ __bindgen_bitfield_unit } } -impl nf_inet_hooks { -pub const NF_INET_INGRESS: nf_inet_hooks = nf_inet_hooks::NF_INET_NUMHOOKS; -} -impl nf_ip_hook_priorities { -pub const NF_IP_PRI_LAST: nf_ip_hook_priorities = nf_ip_hook_priorities::NF_IP_PRI_CONNTRACK_CONFIRM; -} diff -Nru temporalio-1.3.0/vendor/linux-raw-sys/src/riscv64/general.rs temporalio-1.3.0/vendor/linux-raw-sys/src/riscv64/general.rs --- temporalio-1.3.0/vendor/linux-raw-sys/src/riscv64/general.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/linux-raw-sys/src/riscv64/general.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1574,19 +1574,6 @@ pub const GRND_NONBLOCK: u32 = 1; pub const GRND_RANDOM: u32 = 2; pub const GRND_INSECURE: u32 = 4; -pub const LINUX_REBOOT_MAGIC1: u32 = 4276215469; -pub const LINUX_REBOOT_MAGIC2: u32 = 672274793; -pub const LINUX_REBOOT_MAGIC2A: u32 = 85072278; -pub const LINUX_REBOOT_MAGIC2B: u32 = 369367448; -pub const LINUX_REBOOT_MAGIC2C: u32 = 537993216; -pub const LINUX_REBOOT_CMD_RESTART: u32 = 19088743; -pub const LINUX_REBOOT_CMD_HALT: u32 = 3454992675; -pub const LINUX_REBOOT_CMD_CAD_ON: u32 = 2309737967; -pub const LINUX_REBOOT_CMD_CAD_OFF: u32 = 0; -pub const LINUX_REBOOT_CMD_POWER_OFF: u32 = 1126301404; -pub const LINUX_REBOOT_CMD_RESTART2: u32 = 2712847316; -pub const LINUX_REBOOT_CMD_SW_SUSPEND: u32 = 3489725666; -pub const LINUX_REBOOT_CMD_KEXEC: u32 = 1163412803; pub const ITIMER_REAL: u32 = 0; pub const ITIMER_VIRTUAL: u32 = 1; pub const ITIMER_PROF: u32 = 2; diff -Nru temporalio-1.3.0/vendor/linux-raw-sys/src/riscv64/net.rs temporalio-1.3.0/vendor/linux-raw-sys/src/riscv64/net.rs --- temporalio-1.3.0/vendor/linux-raw-sys/src/riscv64/net.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/linux-raw-sys/src/riscv64/net.rs 2023-10-30 19:40:00.000000000 +0000 @@ -476,255 +476,6 @@ } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct sync_serial_settings { -pub clock_rate: crate::ctypes::c_uint, -pub clock_type: crate::ctypes::c_uint, -pub loopback: crate::ctypes::c_ushort, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct te1_settings { -pub clock_rate: crate::ctypes::c_uint, -pub clock_type: crate::ctypes::c_uint, -pub loopback: crate::ctypes::c_ushort, -pub slot_map: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct raw_hdlc_proto { -pub encoding: crate::ctypes::c_ushort, -pub parity: crate::ctypes::c_ushort, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fr_proto { -pub t391: crate::ctypes::c_uint, -pub t392: crate::ctypes::c_uint, -pub n391: crate::ctypes::c_uint, -pub n392: crate::ctypes::c_uint, -pub n393: crate::ctypes::c_uint, -pub lmi: crate::ctypes::c_ushort, -pub dce: crate::ctypes::c_ushort, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fr_proto_pvc { -pub dlci: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fr_proto_pvc_info { -pub dlci: crate::ctypes::c_uint, -pub master: [crate::ctypes::c_char; 16usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct cisco_proto { -pub interval: crate::ctypes::c_uint, -pub timeout: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct x25_hdlc_proto { -pub dce: crate::ctypes::c_ushort, -pub modulo: crate::ctypes::c_uint, -pub window: crate::ctypes::c_uint, -pub t1: crate::ctypes::c_uint, -pub t2: crate::ctypes::c_uint, -pub n2: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ifmap { -pub mem_start: crate::ctypes::c_ulong, -pub mem_end: crate::ctypes::c_ulong, -pub base_addr: crate::ctypes::c_ushort, -pub irq: crate::ctypes::c_uchar, -pub dma: crate::ctypes::c_uchar, -pub port: crate::ctypes::c_uchar, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct if_settings { -pub type_: crate::ctypes::c_uint, -pub size: crate::ctypes::c_uint, -pub ifs_ifsu: if_settings__bindgen_ty_1, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ifreq { -pub ifr_ifrn: ifreq__bindgen_ty_1, -pub ifr_ifru: ifreq__bindgen_ty_2, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ifconf { -pub ifc_len: crate::ctypes::c_int, -pub ifc_ifcu: ifconf__bindgen_ty_1, -} -#[repr(C)] -pub struct xt_entry_match { -pub u: xt_entry_match__bindgen_ty_1, -pub data: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_match__bindgen_ty_1__bindgen_ty_1 { -pub match_size: __u16, -pub name: [crate::ctypes::c_char; 29usize], -pub revision: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_match__bindgen_ty_1__bindgen_ty_2 { -pub match_size: __u16, -pub match_: *mut xt_match, -} -#[repr(C)] -pub struct xt_entry_target { -pub u: xt_entry_target__bindgen_ty_1, -pub data: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_target__bindgen_ty_1__bindgen_ty_1 { -pub target_size: __u16, -pub name: [crate::ctypes::c_char; 29usize], -pub revision: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_target__bindgen_ty_1__bindgen_ty_2 { -pub target_size: __u16, -pub target: *mut xt_target, -} -#[repr(C)] -pub struct xt_standard_target { -pub target: xt_entry_target, -pub verdict: crate::ctypes::c_int, -} -#[repr(C)] -pub struct xt_error_target { -pub target: xt_entry_target, -pub errorname: [crate::ctypes::c_char; 30usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_get_revision { -pub name: [crate::ctypes::c_char; 29usize], -pub revision: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct _xt_align { -pub u8_: __u8, -pub u16_: __u16, -pub u32_: __u32, -pub u64_: __u64, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_counters { -pub pcnt: __u64, -pub bcnt: __u64, -} -#[repr(C)] -#[derive(Debug)] -pub struct xt_counters_info { -pub name: [crate::ctypes::c_char; 32usize], -pub num_counters: crate::ctypes::c_uint, -pub counters: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_tcp { -pub spts: [__u16; 2usize], -pub dpts: [__u16; 2usize], -pub option: __u8, -pub flg_mask: __u8, -pub flg_cmp: __u8, -pub invflags: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_udp { -pub spts: [__u16; 2usize], -pub dpts: [__u16; 2usize], -pub invflags: __u8, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ip6t_ip6 { -pub src: in6_addr, -pub dst: in6_addr, -pub smsk: in6_addr, -pub dmsk: in6_addr, -pub iniface: [crate::ctypes::c_char; 16usize], -pub outiface: [crate::ctypes::c_char; 16usize], -pub iniface_mask: [crate::ctypes::c_uchar; 16usize], -pub outiface_mask: [crate::ctypes::c_uchar; 16usize], -pub proto: __u16, -pub tos: __u8, -pub flags: __u8, -pub invflags: __u8, -} -#[repr(C)] -pub struct ip6t_entry { -pub ipv6: ip6t_ip6, -pub nfcache: crate::ctypes::c_uint, -pub target_offset: __u16, -pub next_offset: __u16, -pub comefrom: crate::ctypes::c_uint, -pub counters: xt_counters, -pub elems: __IncompleteArrayField, -} -#[repr(C)] -pub struct ip6t_standard { -pub entry: ip6t_entry, -pub target: xt_standard_target, -} -#[repr(C)] -pub struct ip6t_error { -pub entry: ip6t_entry, -pub target: xt_error_target, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ip6t_icmp { -pub type_: __u8, -pub code: [__u8; 2usize], -pub invflags: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ip6t_getinfo { -pub name: [crate::ctypes::c_char; 32usize], -pub valid_hooks: crate::ctypes::c_uint, -pub hook_entry: [crate::ctypes::c_uint; 5usize], -pub underflow: [crate::ctypes::c_uint; 5usize], -pub num_entries: crate::ctypes::c_uint, -pub size: crate::ctypes::c_uint, -} -#[repr(C)] -pub struct ip6t_replace { -pub name: [crate::ctypes::c_char; 32usize], -pub valid_hooks: crate::ctypes::c_uint, -pub num_entries: crate::ctypes::c_uint, -pub size: crate::ctypes::c_uint, -pub hook_entry: [crate::ctypes::c_uint; 5usize], -pub underflow: [crate::ctypes::c_uint; 5usize], -pub num_counters: crate::ctypes::c_uint, -pub counters: *mut xt_counters, -pub entries: __IncompleteArrayField, -} -#[repr(C)] -pub struct ip6t_get_entries { -pub name: [crate::ctypes::c_char; 32usize], -pub size: crate::ctypes::c_uint, -pub entrytable: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] pub struct linger { pub l_onoff: crate::ctypes::c_int, pub l_linger: crate::ctypes::c_int, @@ -762,16 +513,6 @@ } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct xt_match { -pub _address: u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_target { -pub _address: u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] pub struct iovec { pub _address: u8, } @@ -1194,135 +935,6 @@ pub const TCP_MD5SIG_FLAG_IFINDEX: u32 = 2; pub const TCP_RECEIVE_ZEROCOPY_FLAG_TLB_CLEAN_HINT: u32 = 1; pub const UNIX_PATH_MAX: u32 = 108; -pub const IFNAMSIZ: u32 = 16; -pub const IFALIASZ: u32 = 256; -pub const ALTIFNAMSIZ: u32 = 128; -pub const GENERIC_HDLC_VERSION: u32 = 4; -pub const CLOCK_DEFAULT: u32 = 0; -pub const CLOCK_EXT: u32 = 1; -pub const CLOCK_INT: u32 = 2; -pub const CLOCK_TXINT: u32 = 3; -pub const CLOCK_TXFROMRX: u32 = 4; -pub const ENCODING_DEFAULT: u32 = 0; -pub const ENCODING_NRZ: u32 = 1; -pub const ENCODING_NRZI: u32 = 2; -pub const ENCODING_FM_MARK: u32 = 3; -pub const ENCODING_FM_SPACE: u32 = 4; -pub const ENCODING_MANCHESTER: u32 = 5; -pub const PARITY_DEFAULT: u32 = 0; -pub const PARITY_NONE: u32 = 1; -pub const PARITY_CRC16_PR0: u32 = 2; -pub const PARITY_CRC16_PR1: u32 = 3; -pub const PARITY_CRC16_PR0_CCITT: u32 = 4; -pub const PARITY_CRC16_PR1_CCITT: u32 = 5; -pub const PARITY_CRC32_PR0_CCITT: u32 = 6; -pub const PARITY_CRC32_PR1_CCITT: u32 = 7; -pub const LMI_DEFAULT: u32 = 0; -pub const LMI_NONE: u32 = 1; -pub const LMI_ANSI: u32 = 2; -pub const LMI_CCITT: u32 = 3; -pub const LMI_CISCO: u32 = 4; -pub const IF_GET_IFACE: u32 = 1; -pub const IF_GET_PROTO: u32 = 2; -pub const IF_IFACE_V35: u32 = 4096; -pub const IF_IFACE_V24: u32 = 4097; -pub const IF_IFACE_X21: u32 = 4098; -pub const IF_IFACE_T1: u32 = 4099; -pub const IF_IFACE_E1: u32 = 4100; -pub const IF_IFACE_SYNC_SERIAL: u32 = 4101; -pub const IF_IFACE_X21D: u32 = 4102; -pub const IF_PROTO_HDLC: u32 = 8192; -pub const IF_PROTO_PPP: u32 = 8193; -pub const IF_PROTO_CISCO: u32 = 8194; -pub const IF_PROTO_FR: u32 = 8195; -pub const IF_PROTO_FR_ADD_PVC: u32 = 8196; -pub const IF_PROTO_FR_DEL_PVC: u32 = 8197; -pub const IF_PROTO_X25: u32 = 8198; -pub const IF_PROTO_HDLC_ETH: u32 = 8199; -pub const IF_PROTO_FR_ADD_ETH_PVC: u32 = 8200; -pub const IF_PROTO_FR_DEL_ETH_PVC: u32 = 8201; -pub const IF_PROTO_FR_PVC: u32 = 8202; -pub const IF_PROTO_FR_ETH_PVC: u32 = 8203; -pub const IF_PROTO_RAW: u32 = 8204; -pub const IFHWADDRLEN: u32 = 6; -pub const NF_DROP: u32 = 0; -pub const NF_ACCEPT: u32 = 1; -pub const NF_STOLEN: u32 = 2; -pub const NF_QUEUE: u32 = 3; -pub const NF_REPEAT: u32 = 4; -pub const NF_STOP: u32 = 5; -pub const NF_MAX_VERDICT: u32 = 5; -pub const NF_VERDICT_MASK: u32 = 255; -pub const NF_VERDICT_FLAG_QUEUE_BYPASS: u32 = 32768; -pub const NF_VERDICT_QMASK: u32 = 4294901760; -pub const NF_VERDICT_QBITS: u32 = 16; -pub const NF_VERDICT_BITS: u32 = 16; -pub const NF_IP6_PRE_ROUTING: u32 = 0; -pub const NF_IP6_LOCAL_IN: u32 = 1; -pub const NF_IP6_FORWARD: u32 = 2; -pub const NF_IP6_LOCAL_OUT: u32 = 3; -pub const NF_IP6_POST_ROUTING: u32 = 4; -pub const NF_IP6_NUMHOOKS: u32 = 5; -pub const XT_FUNCTION_MAXNAMELEN: u32 = 30; -pub const XT_EXTENSION_MAXNAMELEN: u32 = 29; -pub const XT_TABLE_MAXNAMELEN: u32 = 32; -pub const XT_CONTINUE: u32 = 4294967295; -pub const XT_RETURN: i32 = -5; -pub const XT_STANDARD_TARGET: &[u8; 1] = b"\0"; -pub const XT_ERROR_TARGET: &[u8; 6] = b"ERROR\0"; -pub const XT_INV_PROTO: u32 = 64; -pub const IP6T_FUNCTION_MAXNAMELEN: u32 = 30; -pub const IP6T_TABLE_MAXNAMELEN: u32 = 32; -pub const IP6T_CONTINUE: u32 = 4294967295; -pub const IP6T_RETURN: i32 = -5; -pub const XT_TCP_INV_SRCPT: u32 = 1; -pub const XT_TCP_INV_DSTPT: u32 = 2; -pub const XT_TCP_INV_FLAGS: u32 = 4; -pub const XT_TCP_INV_OPTION: u32 = 8; -pub const XT_TCP_INV_MASK: u32 = 15; -pub const XT_UDP_INV_SRCPT: u32 = 1; -pub const XT_UDP_INV_DSTPT: u32 = 2; -pub const XT_UDP_INV_MASK: u32 = 3; -pub const IP6T_TCP_INV_SRCPT: u32 = 1; -pub const IP6T_TCP_INV_DSTPT: u32 = 2; -pub const IP6T_TCP_INV_FLAGS: u32 = 4; -pub const IP6T_TCP_INV_OPTION: u32 = 8; -pub const IP6T_TCP_INV_MASK: u32 = 15; -pub const IP6T_UDP_INV_SRCPT: u32 = 1; -pub const IP6T_UDP_INV_DSTPT: u32 = 2; -pub const IP6T_UDP_INV_MASK: u32 = 3; -pub const IP6T_STANDARD_TARGET: &[u8; 1] = b"\0"; -pub const IP6T_ERROR_TARGET: &[u8; 6] = b"ERROR\0"; -pub const IP6T_F_PROTO: u32 = 1; -pub const IP6T_F_TOS: u32 = 2; -pub const IP6T_F_GOTO: u32 = 4; -pub const IP6T_F_MASK: u32 = 7; -pub const IP6T_INV_VIA_IN: u32 = 1; -pub const IP6T_INV_VIA_OUT: u32 = 2; -pub const IP6T_INV_TOS: u32 = 4; -pub const IP6T_INV_SRCIP: u32 = 8; -pub const IP6T_INV_DSTIP: u32 = 16; -pub const IP6T_INV_FRAG: u32 = 32; -pub const IP6T_INV_PROTO: u32 = 64; -pub const IP6T_INV_MASK: u32 = 127; -pub const IP6T_BASE_CTL: u32 = 64; -pub const IP6T_SO_SET_REPLACE: u32 = 64; -pub const IP6T_SO_SET_ADD_COUNTERS: u32 = 65; -pub const IP6T_SO_SET_MAX: u32 = 65; -pub const IP6T_SO_GET_INFO: u32 = 64; -pub const IP6T_SO_GET_ENTRIES: u32 = 65; -pub const IP6T_SO_GET_REVISION_MATCH: u32 = 68; -pub const IP6T_SO_GET_REVISION_TARGET: u32 = 69; -pub const IP6T_SO_GET_MAX: u32 = 69; -pub const IP6T_SO_ORIGINAL_DST: u32 = 80; -pub const IP6T_ICMP_INV: u32 = 1; -pub const NF_IP_PRE_ROUTING: u32 = 0; -pub const NF_IP_LOCAL_IN: u32 = 1; -pub const NF_IP_FORWARD: u32 = 2; -pub const NF_IP_LOCAL_OUT: u32 = 3; -pub const NF_IP_POST_ROUTING: u32 = 4; -pub const NF_IP_NUMHOOKS: u32 = 5; -pub const SO_ORIGINAL_DST: u32 = 80; pub const SHUT_RD: u32 = 0; pub const SHUT_WR: u32 = 1; pub const SHUT_RDWR: u32 = 2; @@ -1551,25 +1163,6 @@ pub const TCP_NLA_EDT: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_EDT; pub const TCP_NLA_TTL: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_TTL; pub const TCP_NLA_REHASH: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_REHASH; -pub const IF_OPER_UNKNOWN: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_UNKNOWN; -pub const IF_OPER_NOTPRESENT: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_NOTPRESENT; -pub const IF_OPER_DOWN: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_DOWN; -pub const IF_OPER_LOWERLAYERDOWN: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_LOWERLAYERDOWN; -pub const IF_OPER_TESTING: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_TESTING; -pub const IF_OPER_DORMANT: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_DORMANT; -pub const IF_OPER_UP: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_UP; -pub const IF_LINK_MODE_DEFAULT: _bindgen_ty_8 = _bindgen_ty_8::IF_LINK_MODE_DEFAULT; -pub const IF_LINK_MODE_DORMANT: _bindgen_ty_8 = _bindgen_ty_8::IF_LINK_MODE_DORMANT; -pub const IF_LINK_MODE_TESTING: _bindgen_ty_8 = _bindgen_ty_8::IF_LINK_MODE_TESTING; -pub const NFPROTO_UNSPEC: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_UNSPEC; -pub const NFPROTO_INET: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_INET; -pub const NFPROTO_IPV4: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_IPV4; -pub const NFPROTO_ARP: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_ARP; -pub const NFPROTO_NETDEV: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_NETDEV; -pub const NFPROTO_BRIDGE: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_BRIDGE; -pub const NFPROTO_IPV6: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_IPV6; -pub const NFPROTO_DECNET: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_DECNET; -pub const NFPROTO_NUMPROTO: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_NUMPROTO; #[repr(u32)] #[non_exhaustive] #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] @@ -1793,121 +1386,6 @@ TCP_NLA_TTL = 26, TCP_NLA_REHASH = 27, } -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum net_device_flags { -IFF_UP = 1, -IFF_BROADCAST = 2, -IFF_DEBUG = 4, -IFF_LOOPBACK = 8, -IFF_POINTOPOINT = 16, -IFF_NOTRAILERS = 32, -IFF_RUNNING = 64, -IFF_NOARP = 128, -IFF_PROMISC = 256, -IFF_ALLMULTI = 512, -IFF_MASTER = 1024, -IFF_SLAVE = 2048, -IFF_MULTICAST = 4096, -IFF_PORTSEL = 8192, -IFF_AUTOMEDIA = 16384, -IFF_DYNAMIC = 32768, -IFF_LOWER_UP = 65536, -IFF_DORMANT = 131072, -IFF_ECHO = 262144, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_7 { -IF_OPER_UNKNOWN = 0, -IF_OPER_NOTPRESENT = 1, -IF_OPER_DOWN = 2, -IF_OPER_LOWERLAYERDOWN = 3, -IF_OPER_TESTING = 4, -IF_OPER_DORMANT = 5, -IF_OPER_UP = 6, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_8 { -IF_LINK_MODE_DEFAULT = 0, -IF_LINK_MODE_DORMANT = 1, -IF_LINK_MODE_TESTING = 2, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_inet_hooks { -NF_INET_PRE_ROUTING = 0, -NF_INET_LOCAL_IN = 1, -NF_INET_FORWARD = 2, -NF_INET_LOCAL_OUT = 3, -NF_INET_POST_ROUTING = 4, -NF_INET_NUMHOOKS = 5, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_dev_hooks { -NF_NETDEV_INGRESS = 0, -NF_NETDEV_EGRESS = 1, -NF_NETDEV_NUMHOOKS = 2, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_9 { -NFPROTO_UNSPEC = 0, -NFPROTO_INET = 1, -NFPROTO_IPV4 = 2, -NFPROTO_ARP = 3, -NFPROTO_NETDEV = 5, -NFPROTO_BRIDGE = 7, -NFPROTO_IPV6 = 10, -NFPROTO_DECNET = 12, -NFPROTO_NUMPROTO = 13, -} -#[repr(i32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_ip6_hook_priorities { -NF_IP6_PRI_FIRST = -2147483648, -NF_IP6_PRI_RAW_BEFORE_DEFRAG = -450, -NF_IP6_PRI_CONNTRACK_DEFRAG = -400, -NF_IP6_PRI_RAW = -300, -NF_IP6_PRI_SELINUX_FIRST = -225, -NF_IP6_PRI_CONNTRACK = -200, -NF_IP6_PRI_MANGLE = -150, -NF_IP6_PRI_NAT_DST = -100, -NF_IP6_PRI_FILTER = 0, -NF_IP6_PRI_SECURITY = 50, -NF_IP6_PRI_NAT_SRC = 100, -NF_IP6_PRI_SELINUX_LAST = 225, -NF_IP6_PRI_CONNTRACK_HELPER = 300, -NF_IP6_PRI_LAST = 2147483647, -} -#[repr(i32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_ip_hook_priorities { -NF_IP_PRI_FIRST = -2147483648, -NF_IP_PRI_RAW_BEFORE_DEFRAG = -450, -NF_IP_PRI_CONNTRACK_DEFRAG = -400, -NF_IP_PRI_RAW = -300, -NF_IP_PRI_SELINUX_FIRST = -225, -NF_IP_PRI_CONNTRACK = -200, -NF_IP_PRI_MANGLE = -150, -NF_IP_PRI_NAT_DST = -100, -NF_IP_PRI_FILTER = 0, -NF_IP_PRI_SECURITY = 50, -NF_IP_PRI_NAT_SRC = 100, -NF_IP_PRI_SELINUX_LAST = 225, -NF_IP_PRI_CONNTRACK_HELPER = 300, -NF_IP_PRI_CONNTRACK_CONFIRM = 2147483647, -} #[repr(C)] #[derive(Copy, Clone)] pub union __kernel_sockaddr_storage__bindgen_ty_1 { @@ -1939,69 +1417,6 @@ pub hdr: tcphdr, pub words: [__be32; 5usize], } -#[repr(C)] -#[derive(Copy, Clone)] -pub union if_settings__bindgen_ty_1 { -pub raw_hdlc: *mut raw_hdlc_proto, -pub cisco: *mut cisco_proto, -pub fr: *mut fr_proto, -pub fr_pvc: *mut fr_proto_pvc, -pub fr_pvc_info: *mut fr_proto_pvc_info, -pub x25: *mut x25_hdlc_proto, -pub sync: *mut sync_serial_settings, -pub te1: *mut te1_settings, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ifreq__bindgen_ty_1 { -pub ifrn_name: [crate::ctypes::c_char; 16usize], -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ifreq__bindgen_ty_2 { -pub ifru_addr: sockaddr, -pub ifru_dstaddr: sockaddr, -pub ifru_broadaddr: sockaddr, -pub ifru_netmask: sockaddr, -pub ifru_hwaddr: sockaddr, -pub ifru_flags: crate::ctypes::c_short, -pub ifru_ivalue: crate::ctypes::c_int, -pub ifru_mtu: crate::ctypes::c_int, -pub ifru_map: ifmap, -pub ifru_slave: [crate::ctypes::c_char; 16usize], -pub ifru_newname: [crate::ctypes::c_char; 16usize], -pub ifru_data: *mut crate::ctypes::c_void, -pub ifru_settings: if_settings, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ifconf__bindgen_ty_1 { -pub ifcu_buf: *mut crate::ctypes::c_char, -pub ifcu_req: *mut ifreq, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union nf_inet_addr { -pub all: [__u32; 4usize], -pub ip: __be32, -pub ip6: [__be32; 4usize], -pub in_: in_addr, -pub in6: in6_addr, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union xt_entry_match__bindgen_ty_1 { -pub user: xt_entry_match__bindgen_ty_1__bindgen_ty_1, -pub kernel: xt_entry_match__bindgen_ty_1__bindgen_ty_2, -pub match_size: __u16, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union xt_entry_target__bindgen_ty_1 { -pub user: xt_entry_target__bindgen_ty_1__bindgen_ty_1, -pub kernel: xt_entry_target__bindgen_ty_1__bindgen_ty_2, -pub target_size: __u16, -} impl __BindgenBitfieldUnit { #[inline] pub const fn new(storage: Storage) -> Self { @@ -2427,9 +1842,3 @@ __bindgen_bitfield_unit } } -impl nf_inet_hooks { -pub const NF_INET_INGRESS: nf_inet_hooks = nf_inet_hooks::NF_INET_NUMHOOKS; -} -impl nf_ip_hook_priorities { -pub const NF_IP_PRI_LAST: nf_ip_hook_priorities = nf_ip_hook_priorities::NF_IP_PRI_CONNTRACK_CONFIRM; -} diff -Nru temporalio-1.3.0/vendor/linux-raw-sys/src/s390x/general.rs temporalio-1.3.0/vendor/linux-raw-sys/src/s390x/general.rs --- temporalio-1.3.0/vendor/linux-raw-sys/src/s390x/general.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/linux-raw-sys/src/s390x/general.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1565,19 +1565,6 @@ pub const GRND_NONBLOCK: u32 = 1; pub const GRND_RANDOM: u32 = 2; pub const GRND_INSECURE: u32 = 4; -pub const LINUX_REBOOT_MAGIC1: u32 = 4276215469; -pub const LINUX_REBOOT_MAGIC2: u32 = 672274793; -pub const LINUX_REBOOT_MAGIC2A: u32 = 85072278; -pub const LINUX_REBOOT_MAGIC2B: u32 = 369367448; -pub const LINUX_REBOOT_MAGIC2C: u32 = 537993216; -pub const LINUX_REBOOT_CMD_RESTART: u32 = 19088743; -pub const LINUX_REBOOT_CMD_HALT: u32 = 3454992675; -pub const LINUX_REBOOT_CMD_CAD_ON: u32 = 2309737967; -pub const LINUX_REBOOT_CMD_CAD_OFF: u32 = 0; -pub const LINUX_REBOOT_CMD_POWER_OFF: u32 = 1126301404; -pub const LINUX_REBOOT_CMD_RESTART2: u32 = 2712847316; -pub const LINUX_REBOOT_CMD_SW_SUSPEND: u32 = 3489725666; -pub const LINUX_REBOOT_CMD_KEXEC: u32 = 1163412803; pub const ITIMER_REAL: u32 = 0; pub const ITIMER_VIRTUAL: u32 = 1; pub const ITIMER_PROF: u32 = 2; diff -Nru temporalio-1.3.0/vendor/linux-raw-sys/src/s390x/net.rs temporalio-1.3.0/vendor/linux-raw-sys/src/s390x/net.rs --- temporalio-1.3.0/vendor/linux-raw-sys/src/s390x/net.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/linux-raw-sys/src/s390x/net.rs 2023-10-30 19:40:00.000000000 +0000 @@ -490,255 +490,6 @@ } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct sync_serial_settings { -pub clock_rate: crate::ctypes::c_uint, -pub clock_type: crate::ctypes::c_uint, -pub loopback: crate::ctypes::c_ushort, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct te1_settings { -pub clock_rate: crate::ctypes::c_uint, -pub clock_type: crate::ctypes::c_uint, -pub loopback: crate::ctypes::c_ushort, -pub slot_map: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct raw_hdlc_proto { -pub encoding: crate::ctypes::c_ushort, -pub parity: crate::ctypes::c_ushort, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fr_proto { -pub t391: crate::ctypes::c_uint, -pub t392: crate::ctypes::c_uint, -pub n391: crate::ctypes::c_uint, -pub n392: crate::ctypes::c_uint, -pub n393: crate::ctypes::c_uint, -pub lmi: crate::ctypes::c_ushort, -pub dce: crate::ctypes::c_ushort, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fr_proto_pvc { -pub dlci: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fr_proto_pvc_info { -pub dlci: crate::ctypes::c_uint, -pub master: [crate::ctypes::c_char; 16usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct cisco_proto { -pub interval: crate::ctypes::c_uint, -pub timeout: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct x25_hdlc_proto { -pub dce: crate::ctypes::c_ushort, -pub modulo: crate::ctypes::c_uint, -pub window: crate::ctypes::c_uint, -pub t1: crate::ctypes::c_uint, -pub t2: crate::ctypes::c_uint, -pub n2: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ifmap { -pub mem_start: crate::ctypes::c_ulong, -pub mem_end: crate::ctypes::c_ulong, -pub base_addr: crate::ctypes::c_ushort, -pub irq: crate::ctypes::c_uchar, -pub dma: crate::ctypes::c_uchar, -pub port: crate::ctypes::c_uchar, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct if_settings { -pub type_: crate::ctypes::c_uint, -pub size: crate::ctypes::c_uint, -pub ifs_ifsu: if_settings__bindgen_ty_1, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ifreq { -pub ifr_ifrn: ifreq__bindgen_ty_1, -pub ifr_ifru: ifreq__bindgen_ty_2, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ifconf { -pub ifc_len: crate::ctypes::c_int, -pub ifc_ifcu: ifconf__bindgen_ty_1, -} -#[repr(C)] -pub struct xt_entry_match { -pub u: xt_entry_match__bindgen_ty_1, -pub data: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_match__bindgen_ty_1__bindgen_ty_1 { -pub match_size: __u16, -pub name: [crate::ctypes::c_char; 29usize], -pub revision: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_match__bindgen_ty_1__bindgen_ty_2 { -pub match_size: __u16, -pub match_: *mut xt_match, -} -#[repr(C)] -pub struct xt_entry_target { -pub u: xt_entry_target__bindgen_ty_1, -pub data: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_target__bindgen_ty_1__bindgen_ty_1 { -pub target_size: __u16, -pub name: [crate::ctypes::c_char; 29usize], -pub revision: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_target__bindgen_ty_1__bindgen_ty_2 { -pub target_size: __u16, -pub target: *mut xt_target, -} -#[repr(C)] -pub struct xt_standard_target { -pub target: xt_entry_target, -pub verdict: crate::ctypes::c_int, -} -#[repr(C)] -pub struct xt_error_target { -pub target: xt_entry_target, -pub errorname: [crate::ctypes::c_char; 30usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_get_revision { -pub name: [crate::ctypes::c_char; 29usize], -pub revision: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct _xt_align { -pub u8_: __u8, -pub u16_: __u16, -pub u32_: __u32, -pub u64_: __u64, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_counters { -pub pcnt: __u64, -pub bcnt: __u64, -} -#[repr(C)] -#[derive(Debug)] -pub struct xt_counters_info { -pub name: [crate::ctypes::c_char; 32usize], -pub num_counters: crate::ctypes::c_uint, -pub counters: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_tcp { -pub spts: [__u16; 2usize], -pub dpts: [__u16; 2usize], -pub option: __u8, -pub flg_mask: __u8, -pub flg_cmp: __u8, -pub invflags: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_udp { -pub spts: [__u16; 2usize], -pub dpts: [__u16; 2usize], -pub invflags: __u8, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ip6t_ip6 { -pub src: in6_addr, -pub dst: in6_addr, -pub smsk: in6_addr, -pub dmsk: in6_addr, -pub iniface: [crate::ctypes::c_char; 16usize], -pub outiface: [crate::ctypes::c_char; 16usize], -pub iniface_mask: [crate::ctypes::c_uchar; 16usize], -pub outiface_mask: [crate::ctypes::c_uchar; 16usize], -pub proto: __u16, -pub tos: __u8, -pub flags: __u8, -pub invflags: __u8, -} -#[repr(C)] -pub struct ip6t_entry { -pub ipv6: ip6t_ip6, -pub nfcache: crate::ctypes::c_uint, -pub target_offset: __u16, -pub next_offset: __u16, -pub comefrom: crate::ctypes::c_uint, -pub counters: xt_counters, -pub elems: __IncompleteArrayField, -} -#[repr(C)] -pub struct ip6t_standard { -pub entry: ip6t_entry, -pub target: xt_standard_target, -} -#[repr(C)] -pub struct ip6t_error { -pub entry: ip6t_entry, -pub target: xt_error_target, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ip6t_icmp { -pub type_: __u8, -pub code: [__u8; 2usize], -pub invflags: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ip6t_getinfo { -pub name: [crate::ctypes::c_char; 32usize], -pub valid_hooks: crate::ctypes::c_uint, -pub hook_entry: [crate::ctypes::c_uint; 5usize], -pub underflow: [crate::ctypes::c_uint; 5usize], -pub num_entries: crate::ctypes::c_uint, -pub size: crate::ctypes::c_uint, -} -#[repr(C)] -pub struct ip6t_replace { -pub name: [crate::ctypes::c_char; 32usize], -pub valid_hooks: crate::ctypes::c_uint, -pub num_entries: crate::ctypes::c_uint, -pub size: crate::ctypes::c_uint, -pub hook_entry: [crate::ctypes::c_uint; 5usize], -pub underflow: [crate::ctypes::c_uint; 5usize], -pub num_counters: crate::ctypes::c_uint, -pub counters: *mut xt_counters, -pub entries: __IncompleteArrayField, -} -#[repr(C)] -pub struct ip6t_get_entries { -pub name: [crate::ctypes::c_char; 32usize], -pub size: crate::ctypes::c_uint, -pub entrytable: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] pub struct linger { pub l_onoff: crate::ctypes::c_int, pub l_linger: crate::ctypes::c_int, @@ -776,16 +527,6 @@ } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct xt_match { -pub _address: u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_target { -pub _address: u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] pub struct iovec { pub _address: u8, } @@ -1208,135 +949,6 @@ pub const TCP_MD5SIG_FLAG_IFINDEX: u32 = 2; pub const TCP_RECEIVE_ZEROCOPY_FLAG_TLB_CLEAN_HINT: u32 = 1; pub const UNIX_PATH_MAX: u32 = 108; -pub const IFNAMSIZ: u32 = 16; -pub const IFALIASZ: u32 = 256; -pub const ALTIFNAMSIZ: u32 = 128; -pub const GENERIC_HDLC_VERSION: u32 = 4; -pub const CLOCK_DEFAULT: u32 = 0; -pub const CLOCK_EXT: u32 = 1; -pub const CLOCK_INT: u32 = 2; -pub const CLOCK_TXINT: u32 = 3; -pub const CLOCK_TXFROMRX: u32 = 4; -pub const ENCODING_DEFAULT: u32 = 0; -pub const ENCODING_NRZ: u32 = 1; -pub const ENCODING_NRZI: u32 = 2; -pub const ENCODING_FM_MARK: u32 = 3; -pub const ENCODING_FM_SPACE: u32 = 4; -pub const ENCODING_MANCHESTER: u32 = 5; -pub const PARITY_DEFAULT: u32 = 0; -pub const PARITY_NONE: u32 = 1; -pub const PARITY_CRC16_PR0: u32 = 2; -pub const PARITY_CRC16_PR1: u32 = 3; -pub const PARITY_CRC16_PR0_CCITT: u32 = 4; -pub const PARITY_CRC16_PR1_CCITT: u32 = 5; -pub const PARITY_CRC32_PR0_CCITT: u32 = 6; -pub const PARITY_CRC32_PR1_CCITT: u32 = 7; -pub const LMI_DEFAULT: u32 = 0; -pub const LMI_NONE: u32 = 1; -pub const LMI_ANSI: u32 = 2; -pub const LMI_CCITT: u32 = 3; -pub const LMI_CISCO: u32 = 4; -pub const IF_GET_IFACE: u32 = 1; -pub const IF_GET_PROTO: u32 = 2; -pub const IF_IFACE_V35: u32 = 4096; -pub const IF_IFACE_V24: u32 = 4097; -pub const IF_IFACE_X21: u32 = 4098; -pub const IF_IFACE_T1: u32 = 4099; -pub const IF_IFACE_E1: u32 = 4100; -pub const IF_IFACE_SYNC_SERIAL: u32 = 4101; -pub const IF_IFACE_X21D: u32 = 4102; -pub const IF_PROTO_HDLC: u32 = 8192; -pub const IF_PROTO_PPP: u32 = 8193; -pub const IF_PROTO_CISCO: u32 = 8194; -pub const IF_PROTO_FR: u32 = 8195; -pub const IF_PROTO_FR_ADD_PVC: u32 = 8196; -pub const IF_PROTO_FR_DEL_PVC: u32 = 8197; -pub const IF_PROTO_X25: u32 = 8198; -pub const IF_PROTO_HDLC_ETH: u32 = 8199; -pub const IF_PROTO_FR_ADD_ETH_PVC: u32 = 8200; -pub const IF_PROTO_FR_DEL_ETH_PVC: u32 = 8201; -pub const IF_PROTO_FR_PVC: u32 = 8202; -pub const IF_PROTO_FR_ETH_PVC: u32 = 8203; -pub const IF_PROTO_RAW: u32 = 8204; -pub const IFHWADDRLEN: u32 = 6; -pub const NF_DROP: u32 = 0; -pub const NF_ACCEPT: u32 = 1; -pub const NF_STOLEN: u32 = 2; -pub const NF_QUEUE: u32 = 3; -pub const NF_REPEAT: u32 = 4; -pub const NF_STOP: u32 = 5; -pub const NF_MAX_VERDICT: u32 = 5; -pub const NF_VERDICT_MASK: u32 = 255; -pub const NF_VERDICT_FLAG_QUEUE_BYPASS: u32 = 32768; -pub const NF_VERDICT_QMASK: u32 = 4294901760; -pub const NF_VERDICT_QBITS: u32 = 16; -pub const NF_VERDICT_BITS: u32 = 16; -pub const NF_IP6_PRE_ROUTING: u32 = 0; -pub const NF_IP6_LOCAL_IN: u32 = 1; -pub const NF_IP6_FORWARD: u32 = 2; -pub const NF_IP6_LOCAL_OUT: u32 = 3; -pub const NF_IP6_POST_ROUTING: u32 = 4; -pub const NF_IP6_NUMHOOKS: u32 = 5; -pub const XT_FUNCTION_MAXNAMELEN: u32 = 30; -pub const XT_EXTENSION_MAXNAMELEN: u32 = 29; -pub const XT_TABLE_MAXNAMELEN: u32 = 32; -pub const XT_CONTINUE: u32 = 4294967295; -pub const XT_RETURN: i32 = -5; -pub const XT_STANDARD_TARGET: &[u8; 1] = b"\0"; -pub const XT_ERROR_TARGET: &[u8; 6] = b"ERROR\0"; -pub const XT_INV_PROTO: u32 = 64; -pub const IP6T_FUNCTION_MAXNAMELEN: u32 = 30; -pub const IP6T_TABLE_MAXNAMELEN: u32 = 32; -pub const IP6T_CONTINUE: u32 = 4294967295; -pub const IP6T_RETURN: i32 = -5; -pub const XT_TCP_INV_SRCPT: u32 = 1; -pub const XT_TCP_INV_DSTPT: u32 = 2; -pub const XT_TCP_INV_FLAGS: u32 = 4; -pub const XT_TCP_INV_OPTION: u32 = 8; -pub const XT_TCP_INV_MASK: u32 = 15; -pub const XT_UDP_INV_SRCPT: u32 = 1; -pub const XT_UDP_INV_DSTPT: u32 = 2; -pub const XT_UDP_INV_MASK: u32 = 3; -pub const IP6T_TCP_INV_SRCPT: u32 = 1; -pub const IP6T_TCP_INV_DSTPT: u32 = 2; -pub const IP6T_TCP_INV_FLAGS: u32 = 4; -pub const IP6T_TCP_INV_OPTION: u32 = 8; -pub const IP6T_TCP_INV_MASK: u32 = 15; -pub const IP6T_UDP_INV_SRCPT: u32 = 1; -pub const IP6T_UDP_INV_DSTPT: u32 = 2; -pub const IP6T_UDP_INV_MASK: u32 = 3; -pub const IP6T_STANDARD_TARGET: &[u8; 1] = b"\0"; -pub const IP6T_ERROR_TARGET: &[u8; 6] = b"ERROR\0"; -pub const IP6T_F_PROTO: u32 = 1; -pub const IP6T_F_TOS: u32 = 2; -pub const IP6T_F_GOTO: u32 = 4; -pub const IP6T_F_MASK: u32 = 7; -pub const IP6T_INV_VIA_IN: u32 = 1; -pub const IP6T_INV_VIA_OUT: u32 = 2; -pub const IP6T_INV_TOS: u32 = 4; -pub const IP6T_INV_SRCIP: u32 = 8; -pub const IP6T_INV_DSTIP: u32 = 16; -pub const IP6T_INV_FRAG: u32 = 32; -pub const IP6T_INV_PROTO: u32 = 64; -pub const IP6T_INV_MASK: u32 = 127; -pub const IP6T_BASE_CTL: u32 = 64; -pub const IP6T_SO_SET_REPLACE: u32 = 64; -pub const IP6T_SO_SET_ADD_COUNTERS: u32 = 65; -pub const IP6T_SO_SET_MAX: u32 = 65; -pub const IP6T_SO_GET_INFO: u32 = 64; -pub const IP6T_SO_GET_ENTRIES: u32 = 65; -pub const IP6T_SO_GET_REVISION_MATCH: u32 = 68; -pub const IP6T_SO_GET_REVISION_TARGET: u32 = 69; -pub const IP6T_SO_GET_MAX: u32 = 69; -pub const IP6T_SO_ORIGINAL_DST: u32 = 80; -pub const IP6T_ICMP_INV: u32 = 1; -pub const NF_IP_PRE_ROUTING: u32 = 0; -pub const NF_IP_LOCAL_IN: u32 = 1; -pub const NF_IP_FORWARD: u32 = 2; -pub const NF_IP_LOCAL_OUT: u32 = 3; -pub const NF_IP_POST_ROUTING: u32 = 4; -pub const NF_IP_NUMHOOKS: u32 = 5; -pub const SO_ORIGINAL_DST: u32 = 80; pub const SHUT_RD: u32 = 0; pub const SHUT_WR: u32 = 1; pub const SHUT_RDWR: u32 = 2; @@ -1565,25 +1177,6 @@ pub const TCP_NLA_EDT: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_EDT; pub const TCP_NLA_TTL: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_TTL; pub const TCP_NLA_REHASH: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_REHASH; -pub const IF_OPER_UNKNOWN: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_UNKNOWN; -pub const IF_OPER_NOTPRESENT: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_NOTPRESENT; -pub const IF_OPER_DOWN: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_DOWN; -pub const IF_OPER_LOWERLAYERDOWN: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_LOWERLAYERDOWN; -pub const IF_OPER_TESTING: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_TESTING; -pub const IF_OPER_DORMANT: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_DORMANT; -pub const IF_OPER_UP: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_UP; -pub const IF_LINK_MODE_DEFAULT: _bindgen_ty_8 = _bindgen_ty_8::IF_LINK_MODE_DEFAULT; -pub const IF_LINK_MODE_DORMANT: _bindgen_ty_8 = _bindgen_ty_8::IF_LINK_MODE_DORMANT; -pub const IF_LINK_MODE_TESTING: _bindgen_ty_8 = _bindgen_ty_8::IF_LINK_MODE_TESTING; -pub const NFPROTO_UNSPEC: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_UNSPEC; -pub const NFPROTO_INET: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_INET; -pub const NFPROTO_IPV4: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_IPV4; -pub const NFPROTO_ARP: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_ARP; -pub const NFPROTO_NETDEV: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_NETDEV; -pub const NFPROTO_BRIDGE: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_BRIDGE; -pub const NFPROTO_IPV6: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_IPV6; -pub const NFPROTO_DECNET: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_DECNET; -pub const NFPROTO_NUMPROTO: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_NUMPROTO; #[repr(u32)] #[non_exhaustive] #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] @@ -1807,121 +1400,6 @@ TCP_NLA_TTL = 26, TCP_NLA_REHASH = 27, } -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum net_device_flags { -IFF_UP = 1, -IFF_BROADCAST = 2, -IFF_DEBUG = 4, -IFF_LOOPBACK = 8, -IFF_POINTOPOINT = 16, -IFF_NOTRAILERS = 32, -IFF_RUNNING = 64, -IFF_NOARP = 128, -IFF_PROMISC = 256, -IFF_ALLMULTI = 512, -IFF_MASTER = 1024, -IFF_SLAVE = 2048, -IFF_MULTICAST = 4096, -IFF_PORTSEL = 8192, -IFF_AUTOMEDIA = 16384, -IFF_DYNAMIC = 32768, -IFF_LOWER_UP = 65536, -IFF_DORMANT = 131072, -IFF_ECHO = 262144, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_7 { -IF_OPER_UNKNOWN = 0, -IF_OPER_NOTPRESENT = 1, -IF_OPER_DOWN = 2, -IF_OPER_LOWERLAYERDOWN = 3, -IF_OPER_TESTING = 4, -IF_OPER_DORMANT = 5, -IF_OPER_UP = 6, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_8 { -IF_LINK_MODE_DEFAULT = 0, -IF_LINK_MODE_DORMANT = 1, -IF_LINK_MODE_TESTING = 2, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_inet_hooks { -NF_INET_PRE_ROUTING = 0, -NF_INET_LOCAL_IN = 1, -NF_INET_FORWARD = 2, -NF_INET_LOCAL_OUT = 3, -NF_INET_POST_ROUTING = 4, -NF_INET_NUMHOOKS = 5, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_dev_hooks { -NF_NETDEV_INGRESS = 0, -NF_NETDEV_EGRESS = 1, -NF_NETDEV_NUMHOOKS = 2, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_9 { -NFPROTO_UNSPEC = 0, -NFPROTO_INET = 1, -NFPROTO_IPV4 = 2, -NFPROTO_ARP = 3, -NFPROTO_NETDEV = 5, -NFPROTO_BRIDGE = 7, -NFPROTO_IPV6 = 10, -NFPROTO_DECNET = 12, -NFPROTO_NUMPROTO = 13, -} -#[repr(i32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_ip6_hook_priorities { -NF_IP6_PRI_FIRST = -2147483648, -NF_IP6_PRI_RAW_BEFORE_DEFRAG = -450, -NF_IP6_PRI_CONNTRACK_DEFRAG = -400, -NF_IP6_PRI_RAW = -300, -NF_IP6_PRI_SELINUX_FIRST = -225, -NF_IP6_PRI_CONNTRACK = -200, -NF_IP6_PRI_MANGLE = -150, -NF_IP6_PRI_NAT_DST = -100, -NF_IP6_PRI_FILTER = 0, -NF_IP6_PRI_SECURITY = 50, -NF_IP6_PRI_NAT_SRC = 100, -NF_IP6_PRI_SELINUX_LAST = 225, -NF_IP6_PRI_CONNTRACK_HELPER = 300, -NF_IP6_PRI_LAST = 2147483647, -} -#[repr(i32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_ip_hook_priorities { -NF_IP_PRI_FIRST = -2147483648, -NF_IP_PRI_RAW_BEFORE_DEFRAG = -450, -NF_IP_PRI_CONNTRACK_DEFRAG = -400, -NF_IP_PRI_RAW = -300, -NF_IP_PRI_SELINUX_FIRST = -225, -NF_IP_PRI_CONNTRACK = -200, -NF_IP_PRI_MANGLE = -150, -NF_IP_PRI_NAT_DST = -100, -NF_IP_PRI_FILTER = 0, -NF_IP_PRI_SECURITY = 50, -NF_IP_PRI_NAT_SRC = 100, -NF_IP_PRI_SELINUX_LAST = 225, -NF_IP_PRI_CONNTRACK_HELPER = 300, -NF_IP_PRI_CONNTRACK_CONFIRM = 2147483647, -} #[repr(C)] #[derive(Copy, Clone)] pub union __vector128__bindgen_ty_1 { @@ -1959,69 +1437,6 @@ pub hdr: tcphdr, pub words: [__be32; 5usize], } -#[repr(C)] -#[derive(Copy, Clone)] -pub union if_settings__bindgen_ty_1 { -pub raw_hdlc: *mut raw_hdlc_proto, -pub cisco: *mut cisco_proto, -pub fr: *mut fr_proto, -pub fr_pvc: *mut fr_proto_pvc, -pub fr_pvc_info: *mut fr_proto_pvc_info, -pub x25: *mut x25_hdlc_proto, -pub sync: *mut sync_serial_settings, -pub te1: *mut te1_settings, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ifreq__bindgen_ty_1 { -pub ifrn_name: [crate::ctypes::c_char; 16usize], -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ifreq__bindgen_ty_2 { -pub ifru_addr: sockaddr, -pub ifru_dstaddr: sockaddr, -pub ifru_broadaddr: sockaddr, -pub ifru_netmask: sockaddr, -pub ifru_hwaddr: sockaddr, -pub ifru_flags: crate::ctypes::c_short, -pub ifru_ivalue: crate::ctypes::c_int, -pub ifru_mtu: crate::ctypes::c_int, -pub ifru_map: ifmap, -pub ifru_slave: [crate::ctypes::c_char; 16usize], -pub ifru_newname: [crate::ctypes::c_char; 16usize], -pub ifru_data: *mut crate::ctypes::c_void, -pub ifru_settings: if_settings, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ifconf__bindgen_ty_1 { -pub ifcu_buf: *mut crate::ctypes::c_char, -pub ifcu_req: *mut ifreq, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union nf_inet_addr { -pub all: [__u32; 4usize], -pub ip: __be32, -pub ip6: [__be32; 4usize], -pub in_: in_addr, -pub in6: in6_addr, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union xt_entry_match__bindgen_ty_1 { -pub user: xt_entry_match__bindgen_ty_1__bindgen_ty_1, -pub kernel: xt_entry_match__bindgen_ty_1__bindgen_ty_2, -pub match_size: __u16, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union xt_entry_target__bindgen_ty_1 { -pub user: xt_entry_target__bindgen_ty_1__bindgen_ty_1, -pub kernel: xt_entry_target__bindgen_ty_1__bindgen_ty_2, -pub target_size: __u16, -} impl __BindgenBitfieldUnit { #[inline] pub const fn new(storage: Storage) -> Self { @@ -2447,9 +1862,3 @@ __bindgen_bitfield_unit } } -impl nf_inet_hooks { -pub const NF_INET_INGRESS: nf_inet_hooks = nf_inet_hooks::NF_INET_NUMHOOKS; -} -impl nf_ip_hook_priorities { -pub const NF_IP_PRI_LAST: nf_ip_hook_priorities = nf_ip_hook_priorities::NF_IP_PRI_CONNTRACK_CONFIRM; -} diff -Nru temporalio-1.3.0/vendor/linux-raw-sys/src/sparc/general.rs temporalio-1.3.0/vendor/linux-raw-sys/src/sparc/general.rs --- temporalio-1.3.0/vendor/linux-raw-sys/src/sparc/general.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/linux-raw-sys/src/sparc/general.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1614,19 +1614,6 @@ pub const GRND_NONBLOCK: u32 = 1; pub const GRND_RANDOM: u32 = 2; pub const GRND_INSECURE: u32 = 4; -pub const LINUX_REBOOT_MAGIC1: u32 = 4276215469; -pub const LINUX_REBOOT_MAGIC2: u32 = 672274793; -pub const LINUX_REBOOT_MAGIC2A: u32 = 85072278; -pub const LINUX_REBOOT_MAGIC2B: u32 = 369367448; -pub const LINUX_REBOOT_MAGIC2C: u32 = 537993216; -pub const LINUX_REBOOT_CMD_RESTART: u32 = 19088743; -pub const LINUX_REBOOT_CMD_HALT: u32 = 3454992675; -pub const LINUX_REBOOT_CMD_CAD_ON: u32 = 2309737967; -pub const LINUX_REBOOT_CMD_CAD_OFF: u32 = 0; -pub const LINUX_REBOOT_CMD_POWER_OFF: u32 = 1126301404; -pub const LINUX_REBOOT_CMD_RESTART2: u32 = 2712847316; -pub const LINUX_REBOOT_CMD_SW_SUSPEND: u32 = 3489725666; -pub const LINUX_REBOOT_CMD_KEXEC: u32 = 1163412803; pub const ITIMER_REAL: u32 = 0; pub const ITIMER_VIRTUAL: u32 = 1; pub const ITIMER_PROF: u32 = 2; diff -Nru temporalio-1.3.0/vendor/linux-raw-sys/src/sparc/net.rs temporalio-1.3.0/vendor/linux-raw-sys/src/sparc/net.rs --- temporalio-1.3.0/vendor/linux-raw-sys/src/sparc/net.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/linux-raw-sys/src/sparc/net.rs 2023-10-30 19:40:00.000000000 +0000 @@ -476,255 +476,6 @@ } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct sync_serial_settings { -pub clock_rate: crate::ctypes::c_uint, -pub clock_type: crate::ctypes::c_uint, -pub loopback: crate::ctypes::c_ushort, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct te1_settings { -pub clock_rate: crate::ctypes::c_uint, -pub clock_type: crate::ctypes::c_uint, -pub loopback: crate::ctypes::c_ushort, -pub slot_map: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct raw_hdlc_proto { -pub encoding: crate::ctypes::c_ushort, -pub parity: crate::ctypes::c_ushort, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fr_proto { -pub t391: crate::ctypes::c_uint, -pub t392: crate::ctypes::c_uint, -pub n391: crate::ctypes::c_uint, -pub n392: crate::ctypes::c_uint, -pub n393: crate::ctypes::c_uint, -pub lmi: crate::ctypes::c_ushort, -pub dce: crate::ctypes::c_ushort, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fr_proto_pvc { -pub dlci: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fr_proto_pvc_info { -pub dlci: crate::ctypes::c_uint, -pub master: [crate::ctypes::c_char; 16usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct cisco_proto { -pub interval: crate::ctypes::c_uint, -pub timeout: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct x25_hdlc_proto { -pub dce: crate::ctypes::c_ushort, -pub modulo: crate::ctypes::c_uint, -pub window: crate::ctypes::c_uint, -pub t1: crate::ctypes::c_uint, -pub t2: crate::ctypes::c_uint, -pub n2: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ifmap { -pub mem_start: crate::ctypes::c_ulong, -pub mem_end: crate::ctypes::c_ulong, -pub base_addr: crate::ctypes::c_ushort, -pub irq: crate::ctypes::c_uchar, -pub dma: crate::ctypes::c_uchar, -pub port: crate::ctypes::c_uchar, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct if_settings { -pub type_: crate::ctypes::c_uint, -pub size: crate::ctypes::c_uint, -pub ifs_ifsu: if_settings__bindgen_ty_1, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ifreq { -pub ifr_ifrn: ifreq__bindgen_ty_1, -pub ifr_ifru: ifreq__bindgen_ty_2, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ifconf { -pub ifc_len: crate::ctypes::c_int, -pub ifc_ifcu: ifconf__bindgen_ty_1, -} -#[repr(C)] -pub struct xt_entry_match { -pub u: xt_entry_match__bindgen_ty_1, -pub data: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_match__bindgen_ty_1__bindgen_ty_1 { -pub match_size: __u16, -pub name: [crate::ctypes::c_char; 29usize], -pub revision: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_match__bindgen_ty_1__bindgen_ty_2 { -pub match_size: __u16, -pub match_: *mut xt_match, -} -#[repr(C)] -pub struct xt_entry_target { -pub u: xt_entry_target__bindgen_ty_1, -pub data: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_target__bindgen_ty_1__bindgen_ty_1 { -pub target_size: __u16, -pub name: [crate::ctypes::c_char; 29usize], -pub revision: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_target__bindgen_ty_1__bindgen_ty_2 { -pub target_size: __u16, -pub target: *mut xt_target, -} -#[repr(C)] -pub struct xt_standard_target { -pub target: xt_entry_target, -pub verdict: crate::ctypes::c_int, -} -#[repr(C)] -pub struct xt_error_target { -pub target: xt_entry_target, -pub errorname: [crate::ctypes::c_char; 30usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_get_revision { -pub name: [crate::ctypes::c_char; 29usize], -pub revision: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct _xt_align { -pub u8_: __u8, -pub u16_: __u16, -pub u32_: __u32, -pub u64_: __u64, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_counters { -pub pcnt: __u64, -pub bcnt: __u64, -} -#[repr(C)] -#[derive(Debug)] -pub struct xt_counters_info { -pub name: [crate::ctypes::c_char; 32usize], -pub num_counters: crate::ctypes::c_uint, -pub counters: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_tcp { -pub spts: [__u16; 2usize], -pub dpts: [__u16; 2usize], -pub option: __u8, -pub flg_mask: __u8, -pub flg_cmp: __u8, -pub invflags: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_udp { -pub spts: [__u16; 2usize], -pub dpts: [__u16; 2usize], -pub invflags: __u8, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ip6t_ip6 { -pub src: in6_addr, -pub dst: in6_addr, -pub smsk: in6_addr, -pub dmsk: in6_addr, -pub iniface: [crate::ctypes::c_char; 16usize], -pub outiface: [crate::ctypes::c_char; 16usize], -pub iniface_mask: [crate::ctypes::c_uchar; 16usize], -pub outiface_mask: [crate::ctypes::c_uchar; 16usize], -pub proto: __u16, -pub tos: __u8, -pub flags: __u8, -pub invflags: __u8, -} -#[repr(C)] -pub struct ip6t_entry { -pub ipv6: ip6t_ip6, -pub nfcache: crate::ctypes::c_uint, -pub target_offset: __u16, -pub next_offset: __u16, -pub comefrom: crate::ctypes::c_uint, -pub counters: xt_counters, -pub elems: __IncompleteArrayField, -} -#[repr(C)] -pub struct ip6t_standard { -pub entry: ip6t_entry, -pub target: xt_standard_target, -} -#[repr(C)] -pub struct ip6t_error { -pub entry: ip6t_entry, -pub target: xt_error_target, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ip6t_icmp { -pub type_: __u8, -pub code: [__u8; 2usize], -pub invflags: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ip6t_getinfo { -pub name: [crate::ctypes::c_char; 32usize], -pub valid_hooks: crate::ctypes::c_uint, -pub hook_entry: [crate::ctypes::c_uint; 5usize], -pub underflow: [crate::ctypes::c_uint; 5usize], -pub num_entries: crate::ctypes::c_uint, -pub size: crate::ctypes::c_uint, -} -#[repr(C)] -pub struct ip6t_replace { -pub name: [crate::ctypes::c_char; 32usize], -pub valid_hooks: crate::ctypes::c_uint, -pub num_entries: crate::ctypes::c_uint, -pub size: crate::ctypes::c_uint, -pub hook_entry: [crate::ctypes::c_uint; 5usize], -pub underflow: [crate::ctypes::c_uint; 5usize], -pub num_counters: crate::ctypes::c_uint, -pub counters: *mut xt_counters, -pub entries: __IncompleteArrayField, -} -#[repr(C)] -pub struct ip6t_get_entries { -pub name: [crate::ctypes::c_char; 32usize], -pub size: crate::ctypes::c_uint, -pub entrytable: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] pub struct linger { pub l_onoff: crate::ctypes::c_int, pub l_linger: crate::ctypes::c_int, @@ -762,16 +513,6 @@ } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct xt_match { -pub _address: u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_target { -pub _address: u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] pub struct iovec { pub _address: u8, } @@ -1402,135 +1143,6 @@ pub const TCP_MD5SIG_FLAG_IFINDEX: u32 = 2; pub const TCP_RECEIVE_ZEROCOPY_FLAG_TLB_CLEAN_HINT: u32 = 1; pub const UNIX_PATH_MAX: u32 = 108; -pub const IFNAMSIZ: u32 = 16; -pub const IFALIASZ: u32 = 256; -pub const ALTIFNAMSIZ: u32 = 128; -pub const GENERIC_HDLC_VERSION: u32 = 4; -pub const CLOCK_DEFAULT: u32 = 0; -pub const CLOCK_EXT: u32 = 1; -pub const CLOCK_INT: u32 = 2; -pub const CLOCK_TXINT: u32 = 3; -pub const CLOCK_TXFROMRX: u32 = 4; -pub const ENCODING_DEFAULT: u32 = 0; -pub const ENCODING_NRZ: u32 = 1; -pub const ENCODING_NRZI: u32 = 2; -pub const ENCODING_FM_MARK: u32 = 3; -pub const ENCODING_FM_SPACE: u32 = 4; -pub const ENCODING_MANCHESTER: u32 = 5; -pub const PARITY_DEFAULT: u32 = 0; -pub const PARITY_NONE: u32 = 1; -pub const PARITY_CRC16_PR0: u32 = 2; -pub const PARITY_CRC16_PR1: u32 = 3; -pub const PARITY_CRC16_PR0_CCITT: u32 = 4; -pub const PARITY_CRC16_PR1_CCITT: u32 = 5; -pub const PARITY_CRC32_PR0_CCITT: u32 = 6; -pub const PARITY_CRC32_PR1_CCITT: u32 = 7; -pub const LMI_DEFAULT: u32 = 0; -pub const LMI_NONE: u32 = 1; -pub const LMI_ANSI: u32 = 2; -pub const LMI_CCITT: u32 = 3; -pub const LMI_CISCO: u32 = 4; -pub const IF_GET_IFACE: u32 = 1; -pub const IF_GET_PROTO: u32 = 2; -pub const IF_IFACE_V35: u32 = 4096; -pub const IF_IFACE_V24: u32 = 4097; -pub const IF_IFACE_X21: u32 = 4098; -pub const IF_IFACE_T1: u32 = 4099; -pub const IF_IFACE_E1: u32 = 4100; -pub const IF_IFACE_SYNC_SERIAL: u32 = 4101; -pub const IF_IFACE_X21D: u32 = 4102; -pub const IF_PROTO_HDLC: u32 = 8192; -pub const IF_PROTO_PPP: u32 = 8193; -pub const IF_PROTO_CISCO: u32 = 8194; -pub const IF_PROTO_FR: u32 = 8195; -pub const IF_PROTO_FR_ADD_PVC: u32 = 8196; -pub const IF_PROTO_FR_DEL_PVC: u32 = 8197; -pub const IF_PROTO_X25: u32 = 8198; -pub const IF_PROTO_HDLC_ETH: u32 = 8199; -pub const IF_PROTO_FR_ADD_ETH_PVC: u32 = 8200; -pub const IF_PROTO_FR_DEL_ETH_PVC: u32 = 8201; -pub const IF_PROTO_FR_PVC: u32 = 8202; -pub const IF_PROTO_FR_ETH_PVC: u32 = 8203; -pub const IF_PROTO_RAW: u32 = 8204; -pub const IFHWADDRLEN: u32 = 6; -pub const NF_DROP: u32 = 0; -pub const NF_ACCEPT: u32 = 1; -pub const NF_STOLEN: u32 = 2; -pub const NF_QUEUE: u32 = 3; -pub const NF_REPEAT: u32 = 4; -pub const NF_STOP: u32 = 5; -pub const NF_MAX_VERDICT: u32 = 5; -pub const NF_VERDICT_MASK: u32 = 255; -pub const NF_VERDICT_FLAG_QUEUE_BYPASS: u32 = 32768; -pub const NF_VERDICT_QMASK: u32 = 4294901760; -pub const NF_VERDICT_QBITS: u32 = 16; -pub const NF_VERDICT_BITS: u32 = 16; -pub const NF_IP6_PRE_ROUTING: u32 = 0; -pub const NF_IP6_LOCAL_IN: u32 = 1; -pub const NF_IP6_FORWARD: u32 = 2; -pub const NF_IP6_LOCAL_OUT: u32 = 3; -pub const NF_IP6_POST_ROUTING: u32 = 4; -pub const NF_IP6_NUMHOOKS: u32 = 5; -pub const XT_FUNCTION_MAXNAMELEN: u32 = 30; -pub const XT_EXTENSION_MAXNAMELEN: u32 = 29; -pub const XT_TABLE_MAXNAMELEN: u32 = 32; -pub const XT_CONTINUE: u32 = 4294967295; -pub const XT_RETURN: i32 = -5; -pub const XT_STANDARD_TARGET: &[u8; 1] = b"\0"; -pub const XT_ERROR_TARGET: &[u8; 6] = b"ERROR\0"; -pub const XT_INV_PROTO: u32 = 64; -pub const IP6T_FUNCTION_MAXNAMELEN: u32 = 30; -pub const IP6T_TABLE_MAXNAMELEN: u32 = 32; -pub const IP6T_CONTINUE: u32 = 4294967295; -pub const IP6T_RETURN: i32 = -5; -pub const XT_TCP_INV_SRCPT: u32 = 1; -pub const XT_TCP_INV_DSTPT: u32 = 2; -pub const XT_TCP_INV_FLAGS: u32 = 4; -pub const XT_TCP_INV_OPTION: u32 = 8; -pub const XT_TCP_INV_MASK: u32 = 15; -pub const XT_UDP_INV_SRCPT: u32 = 1; -pub const XT_UDP_INV_DSTPT: u32 = 2; -pub const XT_UDP_INV_MASK: u32 = 3; -pub const IP6T_TCP_INV_SRCPT: u32 = 1; -pub const IP6T_TCP_INV_DSTPT: u32 = 2; -pub const IP6T_TCP_INV_FLAGS: u32 = 4; -pub const IP6T_TCP_INV_OPTION: u32 = 8; -pub const IP6T_TCP_INV_MASK: u32 = 15; -pub const IP6T_UDP_INV_SRCPT: u32 = 1; -pub const IP6T_UDP_INV_DSTPT: u32 = 2; -pub const IP6T_UDP_INV_MASK: u32 = 3; -pub const IP6T_STANDARD_TARGET: &[u8; 1] = b"\0"; -pub const IP6T_ERROR_TARGET: &[u8; 6] = b"ERROR\0"; -pub const IP6T_F_PROTO: u32 = 1; -pub const IP6T_F_TOS: u32 = 2; -pub const IP6T_F_GOTO: u32 = 4; -pub const IP6T_F_MASK: u32 = 7; -pub const IP6T_INV_VIA_IN: u32 = 1; -pub const IP6T_INV_VIA_OUT: u32 = 2; -pub const IP6T_INV_TOS: u32 = 4; -pub const IP6T_INV_SRCIP: u32 = 8; -pub const IP6T_INV_DSTIP: u32 = 16; -pub const IP6T_INV_FRAG: u32 = 32; -pub const IP6T_INV_PROTO: u32 = 64; -pub const IP6T_INV_MASK: u32 = 127; -pub const IP6T_BASE_CTL: u32 = 64; -pub const IP6T_SO_SET_REPLACE: u32 = 64; -pub const IP6T_SO_SET_ADD_COUNTERS: u32 = 65; -pub const IP6T_SO_SET_MAX: u32 = 65; -pub const IP6T_SO_GET_INFO: u32 = 64; -pub const IP6T_SO_GET_ENTRIES: u32 = 65; -pub const IP6T_SO_GET_REVISION_MATCH: u32 = 68; -pub const IP6T_SO_GET_REVISION_TARGET: u32 = 69; -pub const IP6T_SO_GET_MAX: u32 = 69; -pub const IP6T_SO_ORIGINAL_DST: u32 = 80; -pub const IP6T_ICMP_INV: u32 = 1; -pub const NF_IP_PRE_ROUTING: u32 = 0; -pub const NF_IP_LOCAL_IN: u32 = 1; -pub const NF_IP_FORWARD: u32 = 2; -pub const NF_IP_LOCAL_OUT: u32 = 3; -pub const NF_IP_POST_ROUTING: u32 = 4; -pub const NF_IP_NUMHOOKS: u32 = 5; -pub const SO_ORIGINAL_DST: u32 = 80; pub const SHUT_RD: u32 = 0; pub const SHUT_WR: u32 = 1; pub const SHUT_RDWR: u32 = 2; @@ -1759,25 +1371,6 @@ pub const TCP_NLA_EDT: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_EDT; pub const TCP_NLA_TTL: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_TTL; pub const TCP_NLA_REHASH: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_REHASH; -pub const IF_OPER_UNKNOWN: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_UNKNOWN; -pub const IF_OPER_NOTPRESENT: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_NOTPRESENT; -pub const IF_OPER_DOWN: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_DOWN; -pub const IF_OPER_LOWERLAYERDOWN: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_LOWERLAYERDOWN; -pub const IF_OPER_TESTING: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_TESTING; -pub const IF_OPER_DORMANT: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_DORMANT; -pub const IF_OPER_UP: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_UP; -pub const IF_LINK_MODE_DEFAULT: _bindgen_ty_8 = _bindgen_ty_8::IF_LINK_MODE_DEFAULT; -pub const IF_LINK_MODE_DORMANT: _bindgen_ty_8 = _bindgen_ty_8::IF_LINK_MODE_DORMANT; -pub const IF_LINK_MODE_TESTING: _bindgen_ty_8 = _bindgen_ty_8::IF_LINK_MODE_TESTING; -pub const NFPROTO_UNSPEC: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_UNSPEC; -pub const NFPROTO_INET: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_INET; -pub const NFPROTO_IPV4: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_IPV4; -pub const NFPROTO_ARP: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_ARP; -pub const NFPROTO_NETDEV: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_NETDEV; -pub const NFPROTO_BRIDGE: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_BRIDGE; -pub const NFPROTO_IPV6: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_IPV6; -pub const NFPROTO_DECNET: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_DECNET; -pub const NFPROTO_NUMPROTO: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_NUMPROTO; #[repr(u32)] #[non_exhaustive] #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] @@ -2001,121 +1594,6 @@ TCP_NLA_TTL = 26, TCP_NLA_REHASH = 27, } -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum net_device_flags { -IFF_UP = 1, -IFF_BROADCAST = 2, -IFF_DEBUG = 4, -IFF_LOOPBACK = 8, -IFF_POINTOPOINT = 16, -IFF_NOTRAILERS = 32, -IFF_RUNNING = 64, -IFF_NOARP = 128, -IFF_PROMISC = 256, -IFF_ALLMULTI = 512, -IFF_MASTER = 1024, -IFF_SLAVE = 2048, -IFF_MULTICAST = 4096, -IFF_PORTSEL = 8192, -IFF_AUTOMEDIA = 16384, -IFF_DYNAMIC = 32768, -IFF_LOWER_UP = 65536, -IFF_DORMANT = 131072, -IFF_ECHO = 262144, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_7 { -IF_OPER_UNKNOWN = 0, -IF_OPER_NOTPRESENT = 1, -IF_OPER_DOWN = 2, -IF_OPER_LOWERLAYERDOWN = 3, -IF_OPER_TESTING = 4, -IF_OPER_DORMANT = 5, -IF_OPER_UP = 6, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_8 { -IF_LINK_MODE_DEFAULT = 0, -IF_LINK_MODE_DORMANT = 1, -IF_LINK_MODE_TESTING = 2, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_inet_hooks { -NF_INET_PRE_ROUTING = 0, -NF_INET_LOCAL_IN = 1, -NF_INET_FORWARD = 2, -NF_INET_LOCAL_OUT = 3, -NF_INET_POST_ROUTING = 4, -NF_INET_NUMHOOKS = 5, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_dev_hooks { -NF_NETDEV_INGRESS = 0, -NF_NETDEV_EGRESS = 1, -NF_NETDEV_NUMHOOKS = 2, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_9 { -NFPROTO_UNSPEC = 0, -NFPROTO_INET = 1, -NFPROTO_IPV4 = 2, -NFPROTO_ARP = 3, -NFPROTO_NETDEV = 5, -NFPROTO_BRIDGE = 7, -NFPROTO_IPV6 = 10, -NFPROTO_DECNET = 12, -NFPROTO_NUMPROTO = 13, -} -#[repr(i32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_ip6_hook_priorities { -NF_IP6_PRI_FIRST = -2147483648, -NF_IP6_PRI_RAW_BEFORE_DEFRAG = -450, -NF_IP6_PRI_CONNTRACK_DEFRAG = -400, -NF_IP6_PRI_RAW = -300, -NF_IP6_PRI_SELINUX_FIRST = -225, -NF_IP6_PRI_CONNTRACK = -200, -NF_IP6_PRI_MANGLE = -150, -NF_IP6_PRI_NAT_DST = -100, -NF_IP6_PRI_FILTER = 0, -NF_IP6_PRI_SECURITY = 50, -NF_IP6_PRI_NAT_SRC = 100, -NF_IP6_PRI_SELINUX_LAST = 225, -NF_IP6_PRI_CONNTRACK_HELPER = 300, -NF_IP6_PRI_LAST = 2147483647, -} -#[repr(i32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_ip_hook_priorities { -NF_IP_PRI_FIRST = -2147483648, -NF_IP_PRI_RAW_BEFORE_DEFRAG = -450, -NF_IP_PRI_CONNTRACK_DEFRAG = -400, -NF_IP_PRI_RAW = -300, -NF_IP_PRI_SELINUX_FIRST = -225, -NF_IP_PRI_CONNTRACK = -200, -NF_IP_PRI_MANGLE = -150, -NF_IP_PRI_NAT_DST = -100, -NF_IP_PRI_FILTER = 0, -NF_IP_PRI_SECURITY = 50, -NF_IP_PRI_NAT_SRC = 100, -NF_IP_PRI_SELINUX_LAST = 225, -NF_IP_PRI_CONNTRACK_HELPER = 300, -NF_IP_PRI_CONNTRACK_CONFIRM = 2147483647, -} #[repr(C)] #[derive(Copy, Clone)] pub union __kernel_sockaddr_storage__bindgen_ty_1 { @@ -2147,69 +1625,6 @@ pub hdr: tcphdr, pub words: [__be32; 5usize], } -#[repr(C)] -#[derive(Copy, Clone)] -pub union if_settings__bindgen_ty_1 { -pub raw_hdlc: *mut raw_hdlc_proto, -pub cisco: *mut cisco_proto, -pub fr: *mut fr_proto, -pub fr_pvc: *mut fr_proto_pvc, -pub fr_pvc_info: *mut fr_proto_pvc_info, -pub x25: *mut x25_hdlc_proto, -pub sync: *mut sync_serial_settings, -pub te1: *mut te1_settings, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ifreq__bindgen_ty_1 { -pub ifrn_name: [crate::ctypes::c_char; 16usize], -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ifreq__bindgen_ty_2 { -pub ifru_addr: sockaddr, -pub ifru_dstaddr: sockaddr, -pub ifru_broadaddr: sockaddr, -pub ifru_netmask: sockaddr, -pub ifru_hwaddr: sockaddr, -pub ifru_flags: crate::ctypes::c_short, -pub ifru_ivalue: crate::ctypes::c_int, -pub ifru_mtu: crate::ctypes::c_int, -pub ifru_map: ifmap, -pub ifru_slave: [crate::ctypes::c_char; 16usize], -pub ifru_newname: [crate::ctypes::c_char; 16usize], -pub ifru_data: *mut crate::ctypes::c_void, -pub ifru_settings: if_settings, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ifconf__bindgen_ty_1 { -pub ifcu_buf: *mut crate::ctypes::c_char, -pub ifcu_req: *mut ifreq, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union nf_inet_addr { -pub all: [__u32; 4usize], -pub ip: __be32, -pub ip6: [__be32; 4usize], -pub in_: in_addr, -pub in6: in6_addr, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union xt_entry_match__bindgen_ty_1 { -pub user: xt_entry_match__bindgen_ty_1__bindgen_ty_1, -pub kernel: xt_entry_match__bindgen_ty_1__bindgen_ty_2, -pub match_size: __u16, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union xt_entry_target__bindgen_ty_1 { -pub user: xt_entry_target__bindgen_ty_1__bindgen_ty_1, -pub kernel: xt_entry_target__bindgen_ty_1__bindgen_ty_2, -pub target_size: __u16, -} impl __BindgenBitfieldUnit { #[inline] pub const fn new(storage: Storage) -> Self { @@ -2635,9 +2050,3 @@ __bindgen_bitfield_unit } } -impl nf_inet_hooks { -pub const NF_INET_INGRESS: nf_inet_hooks = nf_inet_hooks::NF_INET_NUMHOOKS; -} -impl nf_ip_hook_priorities { -pub const NF_IP_PRI_LAST: nf_ip_hook_priorities = nf_ip_hook_priorities::NF_IP_PRI_CONNTRACK_CONFIRM; -} diff -Nru temporalio-1.3.0/vendor/linux-raw-sys/src/sparc64/general.rs temporalio-1.3.0/vendor/linux-raw-sys/src/sparc64/general.rs --- temporalio-1.3.0/vendor/linux-raw-sys/src/sparc64/general.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/linux-raw-sys/src/sparc64/general.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1606,19 +1606,6 @@ pub const GRND_NONBLOCK: u32 = 1; pub const GRND_RANDOM: u32 = 2; pub const GRND_INSECURE: u32 = 4; -pub const LINUX_REBOOT_MAGIC1: u32 = 4276215469; -pub const LINUX_REBOOT_MAGIC2: u32 = 672274793; -pub const LINUX_REBOOT_MAGIC2A: u32 = 85072278; -pub const LINUX_REBOOT_MAGIC2B: u32 = 369367448; -pub const LINUX_REBOOT_MAGIC2C: u32 = 537993216; -pub const LINUX_REBOOT_CMD_RESTART: u32 = 19088743; -pub const LINUX_REBOOT_CMD_HALT: u32 = 3454992675; -pub const LINUX_REBOOT_CMD_CAD_ON: u32 = 2309737967; -pub const LINUX_REBOOT_CMD_CAD_OFF: u32 = 0; -pub const LINUX_REBOOT_CMD_POWER_OFF: u32 = 1126301404; -pub const LINUX_REBOOT_CMD_RESTART2: u32 = 2712847316; -pub const LINUX_REBOOT_CMD_SW_SUSPEND: u32 = 3489725666; -pub const LINUX_REBOOT_CMD_KEXEC: u32 = 1163412803; pub const ITIMER_REAL: u32 = 0; pub const ITIMER_VIRTUAL: u32 = 1; pub const ITIMER_PROF: u32 = 2; diff -Nru temporalio-1.3.0/vendor/linux-raw-sys/src/sparc64/net.rs temporalio-1.3.0/vendor/linux-raw-sys/src/sparc64/net.rs --- temporalio-1.3.0/vendor/linux-raw-sys/src/sparc64/net.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/linux-raw-sys/src/sparc64/net.rs 2023-10-30 19:40:00.000000000 +0000 @@ -482,255 +482,6 @@ } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct sync_serial_settings { -pub clock_rate: crate::ctypes::c_uint, -pub clock_type: crate::ctypes::c_uint, -pub loopback: crate::ctypes::c_ushort, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct te1_settings { -pub clock_rate: crate::ctypes::c_uint, -pub clock_type: crate::ctypes::c_uint, -pub loopback: crate::ctypes::c_ushort, -pub slot_map: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct raw_hdlc_proto { -pub encoding: crate::ctypes::c_ushort, -pub parity: crate::ctypes::c_ushort, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fr_proto { -pub t391: crate::ctypes::c_uint, -pub t392: crate::ctypes::c_uint, -pub n391: crate::ctypes::c_uint, -pub n392: crate::ctypes::c_uint, -pub n393: crate::ctypes::c_uint, -pub lmi: crate::ctypes::c_ushort, -pub dce: crate::ctypes::c_ushort, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fr_proto_pvc { -pub dlci: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fr_proto_pvc_info { -pub dlci: crate::ctypes::c_uint, -pub master: [crate::ctypes::c_char; 16usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct cisco_proto { -pub interval: crate::ctypes::c_uint, -pub timeout: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct x25_hdlc_proto { -pub dce: crate::ctypes::c_ushort, -pub modulo: crate::ctypes::c_uint, -pub window: crate::ctypes::c_uint, -pub t1: crate::ctypes::c_uint, -pub t2: crate::ctypes::c_uint, -pub n2: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ifmap { -pub mem_start: crate::ctypes::c_ulong, -pub mem_end: crate::ctypes::c_ulong, -pub base_addr: crate::ctypes::c_ushort, -pub irq: crate::ctypes::c_uchar, -pub dma: crate::ctypes::c_uchar, -pub port: crate::ctypes::c_uchar, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct if_settings { -pub type_: crate::ctypes::c_uint, -pub size: crate::ctypes::c_uint, -pub ifs_ifsu: if_settings__bindgen_ty_1, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ifreq { -pub ifr_ifrn: ifreq__bindgen_ty_1, -pub ifr_ifru: ifreq__bindgen_ty_2, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ifconf { -pub ifc_len: crate::ctypes::c_int, -pub ifc_ifcu: ifconf__bindgen_ty_1, -} -#[repr(C)] -pub struct xt_entry_match { -pub u: xt_entry_match__bindgen_ty_1, -pub data: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_match__bindgen_ty_1__bindgen_ty_1 { -pub match_size: __u16, -pub name: [crate::ctypes::c_char; 29usize], -pub revision: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_match__bindgen_ty_1__bindgen_ty_2 { -pub match_size: __u16, -pub match_: *mut xt_match, -} -#[repr(C)] -pub struct xt_entry_target { -pub u: xt_entry_target__bindgen_ty_1, -pub data: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_target__bindgen_ty_1__bindgen_ty_1 { -pub target_size: __u16, -pub name: [crate::ctypes::c_char; 29usize], -pub revision: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_target__bindgen_ty_1__bindgen_ty_2 { -pub target_size: __u16, -pub target: *mut xt_target, -} -#[repr(C)] -pub struct xt_standard_target { -pub target: xt_entry_target, -pub verdict: crate::ctypes::c_int, -} -#[repr(C)] -pub struct xt_error_target { -pub target: xt_entry_target, -pub errorname: [crate::ctypes::c_char; 30usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_get_revision { -pub name: [crate::ctypes::c_char; 29usize], -pub revision: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct _xt_align { -pub u8_: __u8, -pub u16_: __u16, -pub u32_: __u32, -pub u64_: __u64, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_counters { -pub pcnt: __u64, -pub bcnt: __u64, -} -#[repr(C)] -#[derive(Debug)] -pub struct xt_counters_info { -pub name: [crate::ctypes::c_char; 32usize], -pub num_counters: crate::ctypes::c_uint, -pub counters: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_tcp { -pub spts: [__u16; 2usize], -pub dpts: [__u16; 2usize], -pub option: __u8, -pub flg_mask: __u8, -pub flg_cmp: __u8, -pub invflags: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_udp { -pub spts: [__u16; 2usize], -pub dpts: [__u16; 2usize], -pub invflags: __u8, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ip6t_ip6 { -pub src: in6_addr, -pub dst: in6_addr, -pub smsk: in6_addr, -pub dmsk: in6_addr, -pub iniface: [crate::ctypes::c_char; 16usize], -pub outiface: [crate::ctypes::c_char; 16usize], -pub iniface_mask: [crate::ctypes::c_uchar; 16usize], -pub outiface_mask: [crate::ctypes::c_uchar; 16usize], -pub proto: __u16, -pub tos: __u8, -pub flags: __u8, -pub invflags: __u8, -} -#[repr(C)] -pub struct ip6t_entry { -pub ipv6: ip6t_ip6, -pub nfcache: crate::ctypes::c_uint, -pub target_offset: __u16, -pub next_offset: __u16, -pub comefrom: crate::ctypes::c_uint, -pub counters: xt_counters, -pub elems: __IncompleteArrayField, -} -#[repr(C)] -pub struct ip6t_standard { -pub entry: ip6t_entry, -pub target: xt_standard_target, -} -#[repr(C)] -pub struct ip6t_error { -pub entry: ip6t_entry, -pub target: xt_error_target, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ip6t_icmp { -pub type_: __u8, -pub code: [__u8; 2usize], -pub invflags: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ip6t_getinfo { -pub name: [crate::ctypes::c_char; 32usize], -pub valid_hooks: crate::ctypes::c_uint, -pub hook_entry: [crate::ctypes::c_uint; 5usize], -pub underflow: [crate::ctypes::c_uint; 5usize], -pub num_entries: crate::ctypes::c_uint, -pub size: crate::ctypes::c_uint, -} -#[repr(C)] -pub struct ip6t_replace { -pub name: [crate::ctypes::c_char; 32usize], -pub valid_hooks: crate::ctypes::c_uint, -pub num_entries: crate::ctypes::c_uint, -pub size: crate::ctypes::c_uint, -pub hook_entry: [crate::ctypes::c_uint; 5usize], -pub underflow: [crate::ctypes::c_uint; 5usize], -pub num_counters: crate::ctypes::c_uint, -pub counters: *mut xt_counters, -pub entries: __IncompleteArrayField, -} -#[repr(C)] -pub struct ip6t_get_entries { -pub name: [crate::ctypes::c_char; 32usize], -pub size: crate::ctypes::c_uint, -pub entrytable: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] pub struct linger { pub l_onoff: crate::ctypes::c_int, pub l_linger: crate::ctypes::c_int, @@ -768,16 +519,6 @@ } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct xt_match { -pub _address: u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_target { -pub _address: u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] pub struct iovec { pub _address: u8, } @@ -1416,135 +1157,6 @@ pub const TCP_MD5SIG_FLAG_IFINDEX: u32 = 2; pub const TCP_RECEIVE_ZEROCOPY_FLAG_TLB_CLEAN_HINT: u32 = 1; pub const UNIX_PATH_MAX: u32 = 108; -pub const IFNAMSIZ: u32 = 16; -pub const IFALIASZ: u32 = 256; -pub const ALTIFNAMSIZ: u32 = 128; -pub const GENERIC_HDLC_VERSION: u32 = 4; -pub const CLOCK_DEFAULT: u32 = 0; -pub const CLOCK_EXT: u32 = 1; -pub const CLOCK_INT: u32 = 2; -pub const CLOCK_TXINT: u32 = 3; -pub const CLOCK_TXFROMRX: u32 = 4; -pub const ENCODING_DEFAULT: u32 = 0; -pub const ENCODING_NRZ: u32 = 1; -pub const ENCODING_NRZI: u32 = 2; -pub const ENCODING_FM_MARK: u32 = 3; -pub const ENCODING_FM_SPACE: u32 = 4; -pub const ENCODING_MANCHESTER: u32 = 5; -pub const PARITY_DEFAULT: u32 = 0; -pub const PARITY_NONE: u32 = 1; -pub const PARITY_CRC16_PR0: u32 = 2; -pub const PARITY_CRC16_PR1: u32 = 3; -pub const PARITY_CRC16_PR0_CCITT: u32 = 4; -pub const PARITY_CRC16_PR1_CCITT: u32 = 5; -pub const PARITY_CRC32_PR0_CCITT: u32 = 6; -pub const PARITY_CRC32_PR1_CCITT: u32 = 7; -pub const LMI_DEFAULT: u32 = 0; -pub const LMI_NONE: u32 = 1; -pub const LMI_ANSI: u32 = 2; -pub const LMI_CCITT: u32 = 3; -pub const LMI_CISCO: u32 = 4; -pub const IF_GET_IFACE: u32 = 1; -pub const IF_GET_PROTO: u32 = 2; -pub const IF_IFACE_V35: u32 = 4096; -pub const IF_IFACE_V24: u32 = 4097; -pub const IF_IFACE_X21: u32 = 4098; -pub const IF_IFACE_T1: u32 = 4099; -pub const IF_IFACE_E1: u32 = 4100; -pub const IF_IFACE_SYNC_SERIAL: u32 = 4101; -pub const IF_IFACE_X21D: u32 = 4102; -pub const IF_PROTO_HDLC: u32 = 8192; -pub const IF_PROTO_PPP: u32 = 8193; -pub const IF_PROTO_CISCO: u32 = 8194; -pub const IF_PROTO_FR: u32 = 8195; -pub const IF_PROTO_FR_ADD_PVC: u32 = 8196; -pub const IF_PROTO_FR_DEL_PVC: u32 = 8197; -pub const IF_PROTO_X25: u32 = 8198; -pub const IF_PROTO_HDLC_ETH: u32 = 8199; -pub const IF_PROTO_FR_ADD_ETH_PVC: u32 = 8200; -pub const IF_PROTO_FR_DEL_ETH_PVC: u32 = 8201; -pub const IF_PROTO_FR_PVC: u32 = 8202; -pub const IF_PROTO_FR_ETH_PVC: u32 = 8203; -pub const IF_PROTO_RAW: u32 = 8204; -pub const IFHWADDRLEN: u32 = 6; -pub const NF_DROP: u32 = 0; -pub const NF_ACCEPT: u32 = 1; -pub const NF_STOLEN: u32 = 2; -pub const NF_QUEUE: u32 = 3; -pub const NF_REPEAT: u32 = 4; -pub const NF_STOP: u32 = 5; -pub const NF_MAX_VERDICT: u32 = 5; -pub const NF_VERDICT_MASK: u32 = 255; -pub const NF_VERDICT_FLAG_QUEUE_BYPASS: u32 = 32768; -pub const NF_VERDICT_QMASK: u32 = 4294901760; -pub const NF_VERDICT_QBITS: u32 = 16; -pub const NF_VERDICT_BITS: u32 = 16; -pub const NF_IP6_PRE_ROUTING: u32 = 0; -pub const NF_IP6_LOCAL_IN: u32 = 1; -pub const NF_IP6_FORWARD: u32 = 2; -pub const NF_IP6_LOCAL_OUT: u32 = 3; -pub const NF_IP6_POST_ROUTING: u32 = 4; -pub const NF_IP6_NUMHOOKS: u32 = 5; -pub const XT_FUNCTION_MAXNAMELEN: u32 = 30; -pub const XT_EXTENSION_MAXNAMELEN: u32 = 29; -pub const XT_TABLE_MAXNAMELEN: u32 = 32; -pub const XT_CONTINUE: u32 = 4294967295; -pub const XT_RETURN: i32 = -5; -pub const XT_STANDARD_TARGET: &[u8; 1] = b"\0"; -pub const XT_ERROR_TARGET: &[u8; 6] = b"ERROR\0"; -pub const XT_INV_PROTO: u32 = 64; -pub const IP6T_FUNCTION_MAXNAMELEN: u32 = 30; -pub const IP6T_TABLE_MAXNAMELEN: u32 = 32; -pub const IP6T_CONTINUE: u32 = 4294967295; -pub const IP6T_RETURN: i32 = -5; -pub const XT_TCP_INV_SRCPT: u32 = 1; -pub const XT_TCP_INV_DSTPT: u32 = 2; -pub const XT_TCP_INV_FLAGS: u32 = 4; -pub const XT_TCP_INV_OPTION: u32 = 8; -pub const XT_TCP_INV_MASK: u32 = 15; -pub const XT_UDP_INV_SRCPT: u32 = 1; -pub const XT_UDP_INV_DSTPT: u32 = 2; -pub const XT_UDP_INV_MASK: u32 = 3; -pub const IP6T_TCP_INV_SRCPT: u32 = 1; -pub const IP6T_TCP_INV_DSTPT: u32 = 2; -pub const IP6T_TCP_INV_FLAGS: u32 = 4; -pub const IP6T_TCP_INV_OPTION: u32 = 8; -pub const IP6T_TCP_INV_MASK: u32 = 15; -pub const IP6T_UDP_INV_SRCPT: u32 = 1; -pub const IP6T_UDP_INV_DSTPT: u32 = 2; -pub const IP6T_UDP_INV_MASK: u32 = 3; -pub const IP6T_STANDARD_TARGET: &[u8; 1] = b"\0"; -pub const IP6T_ERROR_TARGET: &[u8; 6] = b"ERROR\0"; -pub const IP6T_F_PROTO: u32 = 1; -pub const IP6T_F_TOS: u32 = 2; -pub const IP6T_F_GOTO: u32 = 4; -pub const IP6T_F_MASK: u32 = 7; -pub const IP6T_INV_VIA_IN: u32 = 1; -pub const IP6T_INV_VIA_OUT: u32 = 2; -pub const IP6T_INV_TOS: u32 = 4; -pub const IP6T_INV_SRCIP: u32 = 8; -pub const IP6T_INV_DSTIP: u32 = 16; -pub const IP6T_INV_FRAG: u32 = 32; -pub const IP6T_INV_PROTO: u32 = 64; -pub const IP6T_INV_MASK: u32 = 127; -pub const IP6T_BASE_CTL: u32 = 64; -pub const IP6T_SO_SET_REPLACE: u32 = 64; -pub const IP6T_SO_SET_ADD_COUNTERS: u32 = 65; -pub const IP6T_SO_SET_MAX: u32 = 65; -pub const IP6T_SO_GET_INFO: u32 = 64; -pub const IP6T_SO_GET_ENTRIES: u32 = 65; -pub const IP6T_SO_GET_REVISION_MATCH: u32 = 68; -pub const IP6T_SO_GET_REVISION_TARGET: u32 = 69; -pub const IP6T_SO_GET_MAX: u32 = 69; -pub const IP6T_SO_ORIGINAL_DST: u32 = 80; -pub const IP6T_ICMP_INV: u32 = 1; -pub const NF_IP_PRE_ROUTING: u32 = 0; -pub const NF_IP_LOCAL_IN: u32 = 1; -pub const NF_IP_FORWARD: u32 = 2; -pub const NF_IP_LOCAL_OUT: u32 = 3; -pub const NF_IP_POST_ROUTING: u32 = 4; -pub const NF_IP_NUMHOOKS: u32 = 5; -pub const SO_ORIGINAL_DST: u32 = 80; pub const SHUT_RD: u32 = 0; pub const SHUT_WR: u32 = 1; pub const SHUT_RDWR: u32 = 2; @@ -1773,25 +1385,6 @@ pub const TCP_NLA_EDT: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_EDT; pub const TCP_NLA_TTL: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_TTL; pub const TCP_NLA_REHASH: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_REHASH; -pub const IF_OPER_UNKNOWN: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_UNKNOWN; -pub const IF_OPER_NOTPRESENT: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_NOTPRESENT; -pub const IF_OPER_DOWN: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_DOWN; -pub const IF_OPER_LOWERLAYERDOWN: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_LOWERLAYERDOWN; -pub const IF_OPER_TESTING: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_TESTING; -pub const IF_OPER_DORMANT: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_DORMANT; -pub const IF_OPER_UP: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_UP; -pub const IF_LINK_MODE_DEFAULT: _bindgen_ty_8 = _bindgen_ty_8::IF_LINK_MODE_DEFAULT; -pub const IF_LINK_MODE_DORMANT: _bindgen_ty_8 = _bindgen_ty_8::IF_LINK_MODE_DORMANT; -pub const IF_LINK_MODE_TESTING: _bindgen_ty_8 = _bindgen_ty_8::IF_LINK_MODE_TESTING; -pub const NFPROTO_UNSPEC: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_UNSPEC; -pub const NFPROTO_INET: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_INET; -pub const NFPROTO_IPV4: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_IPV4; -pub const NFPROTO_ARP: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_ARP; -pub const NFPROTO_NETDEV: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_NETDEV; -pub const NFPROTO_BRIDGE: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_BRIDGE; -pub const NFPROTO_IPV6: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_IPV6; -pub const NFPROTO_DECNET: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_DECNET; -pub const NFPROTO_NUMPROTO: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_NUMPROTO; #[repr(u32)] #[non_exhaustive] #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] @@ -2015,121 +1608,6 @@ TCP_NLA_TTL = 26, TCP_NLA_REHASH = 27, } -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum net_device_flags { -IFF_UP = 1, -IFF_BROADCAST = 2, -IFF_DEBUG = 4, -IFF_LOOPBACK = 8, -IFF_POINTOPOINT = 16, -IFF_NOTRAILERS = 32, -IFF_RUNNING = 64, -IFF_NOARP = 128, -IFF_PROMISC = 256, -IFF_ALLMULTI = 512, -IFF_MASTER = 1024, -IFF_SLAVE = 2048, -IFF_MULTICAST = 4096, -IFF_PORTSEL = 8192, -IFF_AUTOMEDIA = 16384, -IFF_DYNAMIC = 32768, -IFF_LOWER_UP = 65536, -IFF_DORMANT = 131072, -IFF_ECHO = 262144, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_7 { -IF_OPER_UNKNOWN = 0, -IF_OPER_NOTPRESENT = 1, -IF_OPER_DOWN = 2, -IF_OPER_LOWERLAYERDOWN = 3, -IF_OPER_TESTING = 4, -IF_OPER_DORMANT = 5, -IF_OPER_UP = 6, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_8 { -IF_LINK_MODE_DEFAULT = 0, -IF_LINK_MODE_DORMANT = 1, -IF_LINK_MODE_TESTING = 2, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_inet_hooks { -NF_INET_PRE_ROUTING = 0, -NF_INET_LOCAL_IN = 1, -NF_INET_FORWARD = 2, -NF_INET_LOCAL_OUT = 3, -NF_INET_POST_ROUTING = 4, -NF_INET_NUMHOOKS = 5, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_dev_hooks { -NF_NETDEV_INGRESS = 0, -NF_NETDEV_EGRESS = 1, -NF_NETDEV_NUMHOOKS = 2, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_9 { -NFPROTO_UNSPEC = 0, -NFPROTO_INET = 1, -NFPROTO_IPV4 = 2, -NFPROTO_ARP = 3, -NFPROTO_NETDEV = 5, -NFPROTO_BRIDGE = 7, -NFPROTO_IPV6 = 10, -NFPROTO_DECNET = 12, -NFPROTO_NUMPROTO = 13, -} -#[repr(i32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_ip6_hook_priorities { -NF_IP6_PRI_FIRST = -2147483648, -NF_IP6_PRI_RAW_BEFORE_DEFRAG = -450, -NF_IP6_PRI_CONNTRACK_DEFRAG = -400, -NF_IP6_PRI_RAW = -300, -NF_IP6_PRI_SELINUX_FIRST = -225, -NF_IP6_PRI_CONNTRACK = -200, -NF_IP6_PRI_MANGLE = -150, -NF_IP6_PRI_NAT_DST = -100, -NF_IP6_PRI_FILTER = 0, -NF_IP6_PRI_SECURITY = 50, -NF_IP6_PRI_NAT_SRC = 100, -NF_IP6_PRI_SELINUX_LAST = 225, -NF_IP6_PRI_CONNTRACK_HELPER = 300, -NF_IP6_PRI_LAST = 2147483647, -} -#[repr(i32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_ip_hook_priorities { -NF_IP_PRI_FIRST = -2147483648, -NF_IP_PRI_RAW_BEFORE_DEFRAG = -450, -NF_IP_PRI_CONNTRACK_DEFRAG = -400, -NF_IP_PRI_RAW = -300, -NF_IP_PRI_SELINUX_FIRST = -225, -NF_IP_PRI_CONNTRACK = -200, -NF_IP_PRI_MANGLE = -150, -NF_IP_PRI_NAT_DST = -100, -NF_IP_PRI_FILTER = 0, -NF_IP_PRI_SECURITY = 50, -NF_IP_PRI_NAT_SRC = 100, -NF_IP_PRI_SELINUX_LAST = 225, -NF_IP_PRI_CONNTRACK_HELPER = 300, -NF_IP_PRI_CONNTRACK_CONFIRM = 2147483647, -} #[repr(C)] #[derive(Copy, Clone)] pub union __kernel_sockaddr_storage__bindgen_ty_1 { @@ -2161,69 +1639,6 @@ pub hdr: tcphdr, pub words: [__be32; 5usize], } -#[repr(C)] -#[derive(Copy, Clone)] -pub union if_settings__bindgen_ty_1 { -pub raw_hdlc: *mut raw_hdlc_proto, -pub cisco: *mut cisco_proto, -pub fr: *mut fr_proto, -pub fr_pvc: *mut fr_proto_pvc, -pub fr_pvc_info: *mut fr_proto_pvc_info, -pub x25: *mut x25_hdlc_proto, -pub sync: *mut sync_serial_settings, -pub te1: *mut te1_settings, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ifreq__bindgen_ty_1 { -pub ifrn_name: [crate::ctypes::c_char; 16usize], -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ifreq__bindgen_ty_2 { -pub ifru_addr: sockaddr, -pub ifru_dstaddr: sockaddr, -pub ifru_broadaddr: sockaddr, -pub ifru_netmask: sockaddr, -pub ifru_hwaddr: sockaddr, -pub ifru_flags: crate::ctypes::c_short, -pub ifru_ivalue: crate::ctypes::c_int, -pub ifru_mtu: crate::ctypes::c_int, -pub ifru_map: ifmap, -pub ifru_slave: [crate::ctypes::c_char; 16usize], -pub ifru_newname: [crate::ctypes::c_char; 16usize], -pub ifru_data: *mut crate::ctypes::c_void, -pub ifru_settings: if_settings, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ifconf__bindgen_ty_1 { -pub ifcu_buf: *mut crate::ctypes::c_char, -pub ifcu_req: *mut ifreq, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union nf_inet_addr { -pub all: [__u32; 4usize], -pub ip: __be32, -pub ip6: [__be32; 4usize], -pub in_: in_addr, -pub in6: in6_addr, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union xt_entry_match__bindgen_ty_1 { -pub user: xt_entry_match__bindgen_ty_1__bindgen_ty_1, -pub kernel: xt_entry_match__bindgen_ty_1__bindgen_ty_2, -pub match_size: __u16, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union xt_entry_target__bindgen_ty_1 { -pub user: xt_entry_target__bindgen_ty_1__bindgen_ty_1, -pub kernel: xt_entry_target__bindgen_ty_1__bindgen_ty_2, -pub target_size: __u16, -} impl __BindgenBitfieldUnit { #[inline] pub const fn new(storage: Storage) -> Self { @@ -2649,9 +2064,3 @@ __bindgen_bitfield_unit } } -impl nf_inet_hooks { -pub const NF_INET_INGRESS: nf_inet_hooks = nf_inet_hooks::NF_INET_NUMHOOKS; -} -impl nf_ip_hook_priorities { -pub const NF_IP_PRI_LAST: nf_ip_hook_priorities = nf_ip_hook_priorities::NF_IP_PRI_CONNTRACK_CONFIRM; -} diff -Nru temporalio-1.3.0/vendor/linux-raw-sys/src/x32/general.rs temporalio-1.3.0/vendor/linux-raw-sys/src/x32/general.rs --- temporalio-1.3.0/vendor/linux-raw-sys/src/x32/general.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/linux-raw-sys/src/x32/general.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1582,19 +1582,6 @@ pub const GRND_NONBLOCK: u32 = 1; pub const GRND_RANDOM: u32 = 2; pub const GRND_INSECURE: u32 = 4; -pub const LINUX_REBOOT_MAGIC1: u32 = 4276215469; -pub const LINUX_REBOOT_MAGIC2: u32 = 672274793; -pub const LINUX_REBOOT_MAGIC2A: u32 = 85072278; -pub const LINUX_REBOOT_MAGIC2B: u32 = 369367448; -pub const LINUX_REBOOT_MAGIC2C: u32 = 537993216; -pub const LINUX_REBOOT_CMD_RESTART: u32 = 19088743; -pub const LINUX_REBOOT_CMD_HALT: u32 = 3454992675; -pub const LINUX_REBOOT_CMD_CAD_ON: u32 = 2309737967; -pub const LINUX_REBOOT_CMD_CAD_OFF: u32 = 0; -pub const LINUX_REBOOT_CMD_POWER_OFF: u32 = 1126301404; -pub const LINUX_REBOOT_CMD_RESTART2: u32 = 2712847316; -pub const LINUX_REBOOT_CMD_SW_SUSPEND: u32 = 3489725666; -pub const LINUX_REBOOT_CMD_KEXEC: u32 = 1163412803; pub const ITIMER_REAL: u32 = 0; pub const ITIMER_VIRTUAL: u32 = 1; pub const ITIMER_PROF: u32 = 2; diff -Nru temporalio-1.3.0/vendor/linux-raw-sys/src/x32/net.rs temporalio-1.3.0/vendor/linux-raw-sys/src/x32/net.rs --- temporalio-1.3.0/vendor/linux-raw-sys/src/x32/net.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/linux-raw-sys/src/x32/net.rs 2023-10-30 19:40:00.000000000 +0000 @@ -476,255 +476,6 @@ } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct sync_serial_settings { -pub clock_rate: crate::ctypes::c_uint, -pub clock_type: crate::ctypes::c_uint, -pub loopback: crate::ctypes::c_ushort, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct te1_settings { -pub clock_rate: crate::ctypes::c_uint, -pub clock_type: crate::ctypes::c_uint, -pub loopback: crate::ctypes::c_ushort, -pub slot_map: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct raw_hdlc_proto { -pub encoding: crate::ctypes::c_ushort, -pub parity: crate::ctypes::c_ushort, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fr_proto { -pub t391: crate::ctypes::c_uint, -pub t392: crate::ctypes::c_uint, -pub n391: crate::ctypes::c_uint, -pub n392: crate::ctypes::c_uint, -pub n393: crate::ctypes::c_uint, -pub lmi: crate::ctypes::c_ushort, -pub dce: crate::ctypes::c_ushort, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fr_proto_pvc { -pub dlci: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fr_proto_pvc_info { -pub dlci: crate::ctypes::c_uint, -pub master: [crate::ctypes::c_char; 16usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct cisco_proto { -pub interval: crate::ctypes::c_uint, -pub timeout: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct x25_hdlc_proto { -pub dce: crate::ctypes::c_ushort, -pub modulo: crate::ctypes::c_uint, -pub window: crate::ctypes::c_uint, -pub t1: crate::ctypes::c_uint, -pub t2: crate::ctypes::c_uint, -pub n2: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ifmap { -pub mem_start: crate::ctypes::c_ulong, -pub mem_end: crate::ctypes::c_ulong, -pub base_addr: crate::ctypes::c_ushort, -pub irq: crate::ctypes::c_uchar, -pub dma: crate::ctypes::c_uchar, -pub port: crate::ctypes::c_uchar, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct if_settings { -pub type_: crate::ctypes::c_uint, -pub size: crate::ctypes::c_uint, -pub ifs_ifsu: if_settings__bindgen_ty_1, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ifreq { -pub ifr_ifrn: ifreq__bindgen_ty_1, -pub ifr_ifru: ifreq__bindgen_ty_2, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ifconf { -pub ifc_len: crate::ctypes::c_int, -pub ifc_ifcu: ifconf__bindgen_ty_1, -} -#[repr(C)] -pub struct xt_entry_match { -pub u: xt_entry_match__bindgen_ty_1, -pub data: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_match__bindgen_ty_1__bindgen_ty_1 { -pub match_size: __u16, -pub name: [crate::ctypes::c_char; 29usize], -pub revision: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_match__bindgen_ty_1__bindgen_ty_2 { -pub match_size: __u16, -pub match_: *mut xt_match, -} -#[repr(C)] -pub struct xt_entry_target { -pub u: xt_entry_target__bindgen_ty_1, -pub data: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_target__bindgen_ty_1__bindgen_ty_1 { -pub target_size: __u16, -pub name: [crate::ctypes::c_char; 29usize], -pub revision: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_target__bindgen_ty_1__bindgen_ty_2 { -pub target_size: __u16, -pub target: *mut xt_target, -} -#[repr(C)] -pub struct xt_standard_target { -pub target: xt_entry_target, -pub verdict: crate::ctypes::c_int, -} -#[repr(C)] -pub struct xt_error_target { -pub target: xt_entry_target, -pub errorname: [crate::ctypes::c_char; 30usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_get_revision { -pub name: [crate::ctypes::c_char; 29usize], -pub revision: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct _xt_align { -pub u8_: __u8, -pub u16_: __u16, -pub u32_: __u32, -pub u64_: __u64, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_counters { -pub pcnt: __u64, -pub bcnt: __u64, -} -#[repr(C)] -#[derive(Debug)] -pub struct xt_counters_info { -pub name: [crate::ctypes::c_char; 32usize], -pub num_counters: crate::ctypes::c_uint, -pub counters: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_tcp { -pub spts: [__u16; 2usize], -pub dpts: [__u16; 2usize], -pub option: __u8, -pub flg_mask: __u8, -pub flg_cmp: __u8, -pub invflags: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_udp { -pub spts: [__u16; 2usize], -pub dpts: [__u16; 2usize], -pub invflags: __u8, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ip6t_ip6 { -pub src: in6_addr, -pub dst: in6_addr, -pub smsk: in6_addr, -pub dmsk: in6_addr, -pub iniface: [crate::ctypes::c_char; 16usize], -pub outiface: [crate::ctypes::c_char; 16usize], -pub iniface_mask: [crate::ctypes::c_uchar; 16usize], -pub outiface_mask: [crate::ctypes::c_uchar; 16usize], -pub proto: __u16, -pub tos: __u8, -pub flags: __u8, -pub invflags: __u8, -} -#[repr(C)] -pub struct ip6t_entry { -pub ipv6: ip6t_ip6, -pub nfcache: crate::ctypes::c_uint, -pub target_offset: __u16, -pub next_offset: __u16, -pub comefrom: crate::ctypes::c_uint, -pub counters: xt_counters, -pub elems: __IncompleteArrayField, -} -#[repr(C)] -pub struct ip6t_standard { -pub entry: ip6t_entry, -pub target: xt_standard_target, -} -#[repr(C)] -pub struct ip6t_error { -pub entry: ip6t_entry, -pub target: xt_error_target, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ip6t_icmp { -pub type_: __u8, -pub code: [__u8; 2usize], -pub invflags: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ip6t_getinfo { -pub name: [crate::ctypes::c_char; 32usize], -pub valid_hooks: crate::ctypes::c_uint, -pub hook_entry: [crate::ctypes::c_uint; 5usize], -pub underflow: [crate::ctypes::c_uint; 5usize], -pub num_entries: crate::ctypes::c_uint, -pub size: crate::ctypes::c_uint, -} -#[repr(C)] -pub struct ip6t_replace { -pub name: [crate::ctypes::c_char; 32usize], -pub valid_hooks: crate::ctypes::c_uint, -pub num_entries: crate::ctypes::c_uint, -pub size: crate::ctypes::c_uint, -pub hook_entry: [crate::ctypes::c_uint; 5usize], -pub underflow: [crate::ctypes::c_uint; 5usize], -pub num_counters: crate::ctypes::c_uint, -pub counters: *mut xt_counters, -pub entries: __IncompleteArrayField, -} -#[repr(C)] -pub struct ip6t_get_entries { -pub name: [crate::ctypes::c_char; 32usize], -pub size: crate::ctypes::c_uint, -pub entrytable: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] pub struct linger { pub l_onoff: crate::ctypes::c_int, pub l_linger: crate::ctypes::c_int, @@ -762,16 +513,6 @@ } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct xt_match { -pub _address: u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_target { -pub _address: u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] pub struct iovec { pub _address: u8, } @@ -1194,135 +935,6 @@ pub const TCP_MD5SIG_FLAG_IFINDEX: u32 = 2; pub const TCP_RECEIVE_ZEROCOPY_FLAG_TLB_CLEAN_HINT: u32 = 1; pub const UNIX_PATH_MAX: u32 = 108; -pub const IFNAMSIZ: u32 = 16; -pub const IFALIASZ: u32 = 256; -pub const ALTIFNAMSIZ: u32 = 128; -pub const GENERIC_HDLC_VERSION: u32 = 4; -pub const CLOCK_DEFAULT: u32 = 0; -pub const CLOCK_EXT: u32 = 1; -pub const CLOCK_INT: u32 = 2; -pub const CLOCK_TXINT: u32 = 3; -pub const CLOCK_TXFROMRX: u32 = 4; -pub const ENCODING_DEFAULT: u32 = 0; -pub const ENCODING_NRZ: u32 = 1; -pub const ENCODING_NRZI: u32 = 2; -pub const ENCODING_FM_MARK: u32 = 3; -pub const ENCODING_FM_SPACE: u32 = 4; -pub const ENCODING_MANCHESTER: u32 = 5; -pub const PARITY_DEFAULT: u32 = 0; -pub const PARITY_NONE: u32 = 1; -pub const PARITY_CRC16_PR0: u32 = 2; -pub const PARITY_CRC16_PR1: u32 = 3; -pub const PARITY_CRC16_PR0_CCITT: u32 = 4; -pub const PARITY_CRC16_PR1_CCITT: u32 = 5; -pub const PARITY_CRC32_PR0_CCITT: u32 = 6; -pub const PARITY_CRC32_PR1_CCITT: u32 = 7; -pub const LMI_DEFAULT: u32 = 0; -pub const LMI_NONE: u32 = 1; -pub const LMI_ANSI: u32 = 2; -pub const LMI_CCITT: u32 = 3; -pub const LMI_CISCO: u32 = 4; -pub const IF_GET_IFACE: u32 = 1; -pub const IF_GET_PROTO: u32 = 2; -pub const IF_IFACE_V35: u32 = 4096; -pub const IF_IFACE_V24: u32 = 4097; -pub const IF_IFACE_X21: u32 = 4098; -pub const IF_IFACE_T1: u32 = 4099; -pub const IF_IFACE_E1: u32 = 4100; -pub const IF_IFACE_SYNC_SERIAL: u32 = 4101; -pub const IF_IFACE_X21D: u32 = 4102; -pub const IF_PROTO_HDLC: u32 = 8192; -pub const IF_PROTO_PPP: u32 = 8193; -pub const IF_PROTO_CISCO: u32 = 8194; -pub const IF_PROTO_FR: u32 = 8195; -pub const IF_PROTO_FR_ADD_PVC: u32 = 8196; -pub const IF_PROTO_FR_DEL_PVC: u32 = 8197; -pub const IF_PROTO_X25: u32 = 8198; -pub const IF_PROTO_HDLC_ETH: u32 = 8199; -pub const IF_PROTO_FR_ADD_ETH_PVC: u32 = 8200; -pub const IF_PROTO_FR_DEL_ETH_PVC: u32 = 8201; -pub const IF_PROTO_FR_PVC: u32 = 8202; -pub const IF_PROTO_FR_ETH_PVC: u32 = 8203; -pub const IF_PROTO_RAW: u32 = 8204; -pub const IFHWADDRLEN: u32 = 6; -pub const NF_DROP: u32 = 0; -pub const NF_ACCEPT: u32 = 1; -pub const NF_STOLEN: u32 = 2; -pub const NF_QUEUE: u32 = 3; -pub const NF_REPEAT: u32 = 4; -pub const NF_STOP: u32 = 5; -pub const NF_MAX_VERDICT: u32 = 5; -pub const NF_VERDICT_MASK: u32 = 255; -pub const NF_VERDICT_FLAG_QUEUE_BYPASS: u32 = 32768; -pub const NF_VERDICT_QMASK: u32 = 4294901760; -pub const NF_VERDICT_QBITS: u32 = 16; -pub const NF_VERDICT_BITS: u32 = 16; -pub const NF_IP6_PRE_ROUTING: u32 = 0; -pub const NF_IP6_LOCAL_IN: u32 = 1; -pub const NF_IP6_FORWARD: u32 = 2; -pub const NF_IP6_LOCAL_OUT: u32 = 3; -pub const NF_IP6_POST_ROUTING: u32 = 4; -pub const NF_IP6_NUMHOOKS: u32 = 5; -pub const XT_FUNCTION_MAXNAMELEN: u32 = 30; -pub const XT_EXTENSION_MAXNAMELEN: u32 = 29; -pub const XT_TABLE_MAXNAMELEN: u32 = 32; -pub const XT_CONTINUE: u32 = 4294967295; -pub const XT_RETURN: i32 = -5; -pub const XT_STANDARD_TARGET: &[u8; 1] = b"\0"; -pub const XT_ERROR_TARGET: &[u8; 6] = b"ERROR\0"; -pub const XT_INV_PROTO: u32 = 64; -pub const IP6T_FUNCTION_MAXNAMELEN: u32 = 30; -pub const IP6T_TABLE_MAXNAMELEN: u32 = 32; -pub const IP6T_CONTINUE: u32 = 4294967295; -pub const IP6T_RETURN: i32 = -5; -pub const XT_TCP_INV_SRCPT: u32 = 1; -pub const XT_TCP_INV_DSTPT: u32 = 2; -pub const XT_TCP_INV_FLAGS: u32 = 4; -pub const XT_TCP_INV_OPTION: u32 = 8; -pub const XT_TCP_INV_MASK: u32 = 15; -pub const XT_UDP_INV_SRCPT: u32 = 1; -pub const XT_UDP_INV_DSTPT: u32 = 2; -pub const XT_UDP_INV_MASK: u32 = 3; -pub const IP6T_TCP_INV_SRCPT: u32 = 1; -pub const IP6T_TCP_INV_DSTPT: u32 = 2; -pub const IP6T_TCP_INV_FLAGS: u32 = 4; -pub const IP6T_TCP_INV_OPTION: u32 = 8; -pub const IP6T_TCP_INV_MASK: u32 = 15; -pub const IP6T_UDP_INV_SRCPT: u32 = 1; -pub const IP6T_UDP_INV_DSTPT: u32 = 2; -pub const IP6T_UDP_INV_MASK: u32 = 3; -pub const IP6T_STANDARD_TARGET: &[u8; 1] = b"\0"; -pub const IP6T_ERROR_TARGET: &[u8; 6] = b"ERROR\0"; -pub const IP6T_F_PROTO: u32 = 1; -pub const IP6T_F_TOS: u32 = 2; -pub const IP6T_F_GOTO: u32 = 4; -pub const IP6T_F_MASK: u32 = 7; -pub const IP6T_INV_VIA_IN: u32 = 1; -pub const IP6T_INV_VIA_OUT: u32 = 2; -pub const IP6T_INV_TOS: u32 = 4; -pub const IP6T_INV_SRCIP: u32 = 8; -pub const IP6T_INV_DSTIP: u32 = 16; -pub const IP6T_INV_FRAG: u32 = 32; -pub const IP6T_INV_PROTO: u32 = 64; -pub const IP6T_INV_MASK: u32 = 127; -pub const IP6T_BASE_CTL: u32 = 64; -pub const IP6T_SO_SET_REPLACE: u32 = 64; -pub const IP6T_SO_SET_ADD_COUNTERS: u32 = 65; -pub const IP6T_SO_SET_MAX: u32 = 65; -pub const IP6T_SO_GET_INFO: u32 = 64; -pub const IP6T_SO_GET_ENTRIES: u32 = 65; -pub const IP6T_SO_GET_REVISION_MATCH: u32 = 68; -pub const IP6T_SO_GET_REVISION_TARGET: u32 = 69; -pub const IP6T_SO_GET_MAX: u32 = 69; -pub const IP6T_SO_ORIGINAL_DST: u32 = 80; -pub const IP6T_ICMP_INV: u32 = 1; -pub const NF_IP_PRE_ROUTING: u32 = 0; -pub const NF_IP_LOCAL_IN: u32 = 1; -pub const NF_IP_FORWARD: u32 = 2; -pub const NF_IP_LOCAL_OUT: u32 = 3; -pub const NF_IP_POST_ROUTING: u32 = 4; -pub const NF_IP_NUMHOOKS: u32 = 5; -pub const SO_ORIGINAL_DST: u32 = 80; pub const SHUT_RD: u32 = 0; pub const SHUT_WR: u32 = 1; pub const SHUT_RDWR: u32 = 2; @@ -1551,25 +1163,6 @@ pub const TCP_NLA_EDT: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_EDT; pub const TCP_NLA_TTL: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_TTL; pub const TCP_NLA_REHASH: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_REHASH; -pub const IF_OPER_UNKNOWN: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_UNKNOWN; -pub const IF_OPER_NOTPRESENT: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_NOTPRESENT; -pub const IF_OPER_DOWN: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_DOWN; -pub const IF_OPER_LOWERLAYERDOWN: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_LOWERLAYERDOWN; -pub const IF_OPER_TESTING: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_TESTING; -pub const IF_OPER_DORMANT: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_DORMANT; -pub const IF_OPER_UP: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_UP; -pub const IF_LINK_MODE_DEFAULT: _bindgen_ty_8 = _bindgen_ty_8::IF_LINK_MODE_DEFAULT; -pub const IF_LINK_MODE_DORMANT: _bindgen_ty_8 = _bindgen_ty_8::IF_LINK_MODE_DORMANT; -pub const IF_LINK_MODE_TESTING: _bindgen_ty_8 = _bindgen_ty_8::IF_LINK_MODE_TESTING; -pub const NFPROTO_UNSPEC: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_UNSPEC; -pub const NFPROTO_INET: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_INET; -pub const NFPROTO_IPV4: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_IPV4; -pub const NFPROTO_ARP: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_ARP; -pub const NFPROTO_NETDEV: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_NETDEV; -pub const NFPROTO_BRIDGE: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_BRIDGE; -pub const NFPROTO_IPV6: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_IPV6; -pub const NFPROTO_DECNET: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_DECNET; -pub const NFPROTO_NUMPROTO: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_NUMPROTO; #[repr(u32)] #[non_exhaustive] #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] @@ -1793,121 +1386,6 @@ TCP_NLA_TTL = 26, TCP_NLA_REHASH = 27, } -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum net_device_flags { -IFF_UP = 1, -IFF_BROADCAST = 2, -IFF_DEBUG = 4, -IFF_LOOPBACK = 8, -IFF_POINTOPOINT = 16, -IFF_NOTRAILERS = 32, -IFF_RUNNING = 64, -IFF_NOARP = 128, -IFF_PROMISC = 256, -IFF_ALLMULTI = 512, -IFF_MASTER = 1024, -IFF_SLAVE = 2048, -IFF_MULTICAST = 4096, -IFF_PORTSEL = 8192, -IFF_AUTOMEDIA = 16384, -IFF_DYNAMIC = 32768, -IFF_LOWER_UP = 65536, -IFF_DORMANT = 131072, -IFF_ECHO = 262144, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_7 { -IF_OPER_UNKNOWN = 0, -IF_OPER_NOTPRESENT = 1, -IF_OPER_DOWN = 2, -IF_OPER_LOWERLAYERDOWN = 3, -IF_OPER_TESTING = 4, -IF_OPER_DORMANT = 5, -IF_OPER_UP = 6, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_8 { -IF_LINK_MODE_DEFAULT = 0, -IF_LINK_MODE_DORMANT = 1, -IF_LINK_MODE_TESTING = 2, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_inet_hooks { -NF_INET_PRE_ROUTING = 0, -NF_INET_LOCAL_IN = 1, -NF_INET_FORWARD = 2, -NF_INET_LOCAL_OUT = 3, -NF_INET_POST_ROUTING = 4, -NF_INET_NUMHOOKS = 5, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_dev_hooks { -NF_NETDEV_INGRESS = 0, -NF_NETDEV_EGRESS = 1, -NF_NETDEV_NUMHOOKS = 2, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_9 { -NFPROTO_UNSPEC = 0, -NFPROTO_INET = 1, -NFPROTO_IPV4 = 2, -NFPROTO_ARP = 3, -NFPROTO_NETDEV = 5, -NFPROTO_BRIDGE = 7, -NFPROTO_IPV6 = 10, -NFPROTO_DECNET = 12, -NFPROTO_NUMPROTO = 13, -} -#[repr(i32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_ip6_hook_priorities { -NF_IP6_PRI_FIRST = -2147483648, -NF_IP6_PRI_RAW_BEFORE_DEFRAG = -450, -NF_IP6_PRI_CONNTRACK_DEFRAG = -400, -NF_IP6_PRI_RAW = -300, -NF_IP6_PRI_SELINUX_FIRST = -225, -NF_IP6_PRI_CONNTRACK = -200, -NF_IP6_PRI_MANGLE = -150, -NF_IP6_PRI_NAT_DST = -100, -NF_IP6_PRI_FILTER = 0, -NF_IP6_PRI_SECURITY = 50, -NF_IP6_PRI_NAT_SRC = 100, -NF_IP6_PRI_SELINUX_LAST = 225, -NF_IP6_PRI_CONNTRACK_HELPER = 300, -NF_IP6_PRI_LAST = 2147483647, -} -#[repr(i32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_ip_hook_priorities { -NF_IP_PRI_FIRST = -2147483648, -NF_IP_PRI_RAW_BEFORE_DEFRAG = -450, -NF_IP_PRI_CONNTRACK_DEFRAG = -400, -NF_IP_PRI_RAW = -300, -NF_IP_PRI_SELINUX_FIRST = -225, -NF_IP_PRI_CONNTRACK = -200, -NF_IP_PRI_MANGLE = -150, -NF_IP_PRI_NAT_DST = -100, -NF_IP_PRI_FILTER = 0, -NF_IP_PRI_SECURITY = 50, -NF_IP_PRI_NAT_SRC = 100, -NF_IP_PRI_SELINUX_LAST = 225, -NF_IP_PRI_CONNTRACK_HELPER = 300, -NF_IP_PRI_CONNTRACK_CONFIRM = 2147483647, -} #[repr(C)] #[derive(Copy, Clone)] pub union __kernel_sockaddr_storage__bindgen_ty_1 { @@ -1939,69 +1417,6 @@ pub hdr: tcphdr, pub words: [__be32; 5usize], } -#[repr(C)] -#[derive(Copy, Clone)] -pub union if_settings__bindgen_ty_1 { -pub raw_hdlc: *mut raw_hdlc_proto, -pub cisco: *mut cisco_proto, -pub fr: *mut fr_proto, -pub fr_pvc: *mut fr_proto_pvc, -pub fr_pvc_info: *mut fr_proto_pvc_info, -pub x25: *mut x25_hdlc_proto, -pub sync: *mut sync_serial_settings, -pub te1: *mut te1_settings, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ifreq__bindgen_ty_1 { -pub ifrn_name: [crate::ctypes::c_char; 16usize], -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ifreq__bindgen_ty_2 { -pub ifru_addr: sockaddr, -pub ifru_dstaddr: sockaddr, -pub ifru_broadaddr: sockaddr, -pub ifru_netmask: sockaddr, -pub ifru_hwaddr: sockaddr, -pub ifru_flags: crate::ctypes::c_short, -pub ifru_ivalue: crate::ctypes::c_int, -pub ifru_mtu: crate::ctypes::c_int, -pub ifru_map: ifmap, -pub ifru_slave: [crate::ctypes::c_char; 16usize], -pub ifru_newname: [crate::ctypes::c_char; 16usize], -pub ifru_data: *mut crate::ctypes::c_void, -pub ifru_settings: if_settings, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ifconf__bindgen_ty_1 { -pub ifcu_buf: *mut crate::ctypes::c_char, -pub ifcu_req: *mut ifreq, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union nf_inet_addr { -pub all: [__u32; 4usize], -pub ip: __be32, -pub ip6: [__be32; 4usize], -pub in_: in_addr, -pub in6: in6_addr, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union xt_entry_match__bindgen_ty_1 { -pub user: xt_entry_match__bindgen_ty_1__bindgen_ty_1, -pub kernel: xt_entry_match__bindgen_ty_1__bindgen_ty_2, -pub match_size: __u16, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union xt_entry_target__bindgen_ty_1 { -pub user: xt_entry_target__bindgen_ty_1__bindgen_ty_1, -pub kernel: xt_entry_target__bindgen_ty_1__bindgen_ty_2, -pub target_size: __u16, -} impl __BindgenBitfieldUnit { #[inline] pub const fn new(storage: Storage) -> Self { @@ -2427,9 +1842,3 @@ __bindgen_bitfield_unit } } -impl nf_inet_hooks { -pub const NF_INET_INGRESS: nf_inet_hooks = nf_inet_hooks::NF_INET_NUMHOOKS; -} -impl nf_ip_hook_priorities { -pub const NF_IP_PRI_LAST: nf_ip_hook_priorities = nf_ip_hook_priorities::NF_IP_PRI_CONNTRACK_CONFIRM; -} diff -Nru temporalio-1.3.0/vendor/linux-raw-sys/src/x86/general.rs temporalio-1.3.0/vendor/linux-raw-sys/src/x86/general.rs --- temporalio-1.3.0/vendor/linux-raw-sys/src/x86/general.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/linux-raw-sys/src/x86/general.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1605,19 +1605,6 @@ pub const GRND_NONBLOCK: u32 = 1; pub const GRND_RANDOM: u32 = 2; pub const GRND_INSECURE: u32 = 4; -pub const LINUX_REBOOT_MAGIC1: u32 = 4276215469; -pub const LINUX_REBOOT_MAGIC2: u32 = 672274793; -pub const LINUX_REBOOT_MAGIC2A: u32 = 85072278; -pub const LINUX_REBOOT_MAGIC2B: u32 = 369367448; -pub const LINUX_REBOOT_MAGIC2C: u32 = 537993216; -pub const LINUX_REBOOT_CMD_RESTART: u32 = 19088743; -pub const LINUX_REBOOT_CMD_HALT: u32 = 3454992675; -pub const LINUX_REBOOT_CMD_CAD_ON: u32 = 2309737967; -pub const LINUX_REBOOT_CMD_CAD_OFF: u32 = 0; -pub const LINUX_REBOOT_CMD_POWER_OFF: u32 = 1126301404; -pub const LINUX_REBOOT_CMD_RESTART2: u32 = 2712847316; -pub const LINUX_REBOOT_CMD_SW_SUSPEND: u32 = 3489725666; -pub const LINUX_REBOOT_CMD_KEXEC: u32 = 1163412803; pub const ITIMER_REAL: u32 = 0; pub const ITIMER_VIRTUAL: u32 = 1; pub const ITIMER_PROF: u32 = 2; diff -Nru temporalio-1.3.0/vendor/linux-raw-sys/src/x86/net.rs temporalio-1.3.0/vendor/linux-raw-sys/src/x86/net.rs --- temporalio-1.3.0/vendor/linux-raw-sys/src/x86/net.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/linux-raw-sys/src/x86/net.rs 2023-10-30 19:40:00.000000000 +0000 @@ -476,255 +476,6 @@ } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct sync_serial_settings { -pub clock_rate: crate::ctypes::c_uint, -pub clock_type: crate::ctypes::c_uint, -pub loopback: crate::ctypes::c_ushort, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct te1_settings { -pub clock_rate: crate::ctypes::c_uint, -pub clock_type: crate::ctypes::c_uint, -pub loopback: crate::ctypes::c_ushort, -pub slot_map: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct raw_hdlc_proto { -pub encoding: crate::ctypes::c_ushort, -pub parity: crate::ctypes::c_ushort, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fr_proto { -pub t391: crate::ctypes::c_uint, -pub t392: crate::ctypes::c_uint, -pub n391: crate::ctypes::c_uint, -pub n392: crate::ctypes::c_uint, -pub n393: crate::ctypes::c_uint, -pub lmi: crate::ctypes::c_ushort, -pub dce: crate::ctypes::c_ushort, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fr_proto_pvc { -pub dlci: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fr_proto_pvc_info { -pub dlci: crate::ctypes::c_uint, -pub master: [crate::ctypes::c_char; 16usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct cisco_proto { -pub interval: crate::ctypes::c_uint, -pub timeout: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct x25_hdlc_proto { -pub dce: crate::ctypes::c_ushort, -pub modulo: crate::ctypes::c_uint, -pub window: crate::ctypes::c_uint, -pub t1: crate::ctypes::c_uint, -pub t2: crate::ctypes::c_uint, -pub n2: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ifmap { -pub mem_start: crate::ctypes::c_ulong, -pub mem_end: crate::ctypes::c_ulong, -pub base_addr: crate::ctypes::c_ushort, -pub irq: crate::ctypes::c_uchar, -pub dma: crate::ctypes::c_uchar, -pub port: crate::ctypes::c_uchar, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct if_settings { -pub type_: crate::ctypes::c_uint, -pub size: crate::ctypes::c_uint, -pub ifs_ifsu: if_settings__bindgen_ty_1, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ifreq { -pub ifr_ifrn: ifreq__bindgen_ty_1, -pub ifr_ifru: ifreq__bindgen_ty_2, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ifconf { -pub ifc_len: crate::ctypes::c_int, -pub ifc_ifcu: ifconf__bindgen_ty_1, -} -#[repr(C)] -pub struct xt_entry_match { -pub u: xt_entry_match__bindgen_ty_1, -pub data: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_match__bindgen_ty_1__bindgen_ty_1 { -pub match_size: __u16, -pub name: [crate::ctypes::c_char; 29usize], -pub revision: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_match__bindgen_ty_1__bindgen_ty_2 { -pub match_size: __u16, -pub match_: *mut xt_match, -} -#[repr(C)] -pub struct xt_entry_target { -pub u: xt_entry_target__bindgen_ty_1, -pub data: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_target__bindgen_ty_1__bindgen_ty_1 { -pub target_size: __u16, -pub name: [crate::ctypes::c_char; 29usize], -pub revision: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_target__bindgen_ty_1__bindgen_ty_2 { -pub target_size: __u16, -pub target: *mut xt_target, -} -#[repr(C)] -pub struct xt_standard_target { -pub target: xt_entry_target, -pub verdict: crate::ctypes::c_int, -} -#[repr(C)] -pub struct xt_error_target { -pub target: xt_entry_target, -pub errorname: [crate::ctypes::c_char; 30usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_get_revision { -pub name: [crate::ctypes::c_char; 29usize], -pub revision: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct _xt_align { -pub u8_: __u8, -pub u16_: __u16, -pub u32_: __u32, -pub u64_: __u64, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_counters { -pub pcnt: __u64, -pub bcnt: __u64, -} -#[repr(C)] -#[derive(Debug)] -pub struct xt_counters_info { -pub name: [crate::ctypes::c_char; 32usize], -pub num_counters: crate::ctypes::c_uint, -pub counters: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_tcp { -pub spts: [__u16; 2usize], -pub dpts: [__u16; 2usize], -pub option: __u8, -pub flg_mask: __u8, -pub flg_cmp: __u8, -pub invflags: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_udp { -pub spts: [__u16; 2usize], -pub dpts: [__u16; 2usize], -pub invflags: __u8, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ip6t_ip6 { -pub src: in6_addr, -pub dst: in6_addr, -pub smsk: in6_addr, -pub dmsk: in6_addr, -pub iniface: [crate::ctypes::c_char; 16usize], -pub outiface: [crate::ctypes::c_char; 16usize], -pub iniface_mask: [crate::ctypes::c_uchar; 16usize], -pub outiface_mask: [crate::ctypes::c_uchar; 16usize], -pub proto: __u16, -pub tos: __u8, -pub flags: __u8, -pub invflags: __u8, -} -#[repr(C)] -pub struct ip6t_entry { -pub ipv6: ip6t_ip6, -pub nfcache: crate::ctypes::c_uint, -pub target_offset: __u16, -pub next_offset: __u16, -pub comefrom: crate::ctypes::c_uint, -pub counters: xt_counters, -pub elems: __IncompleteArrayField, -} -#[repr(C)] -pub struct ip6t_standard { -pub entry: ip6t_entry, -pub target: xt_standard_target, -} -#[repr(C)] -pub struct ip6t_error { -pub entry: ip6t_entry, -pub target: xt_error_target, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ip6t_icmp { -pub type_: __u8, -pub code: [__u8; 2usize], -pub invflags: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ip6t_getinfo { -pub name: [crate::ctypes::c_char; 32usize], -pub valid_hooks: crate::ctypes::c_uint, -pub hook_entry: [crate::ctypes::c_uint; 5usize], -pub underflow: [crate::ctypes::c_uint; 5usize], -pub num_entries: crate::ctypes::c_uint, -pub size: crate::ctypes::c_uint, -} -#[repr(C)] -pub struct ip6t_replace { -pub name: [crate::ctypes::c_char; 32usize], -pub valid_hooks: crate::ctypes::c_uint, -pub num_entries: crate::ctypes::c_uint, -pub size: crate::ctypes::c_uint, -pub hook_entry: [crate::ctypes::c_uint; 5usize], -pub underflow: [crate::ctypes::c_uint; 5usize], -pub num_counters: crate::ctypes::c_uint, -pub counters: *mut xt_counters, -pub entries: __IncompleteArrayField, -} -#[repr(C)] -pub struct ip6t_get_entries { -pub name: [crate::ctypes::c_char; 32usize], -pub size: crate::ctypes::c_uint, -pub entrytable: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] pub struct linger { pub l_onoff: crate::ctypes::c_int, pub l_linger: crate::ctypes::c_int, @@ -762,16 +513,6 @@ } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct xt_match { -pub _address: u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_target { -pub _address: u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] pub struct iovec { pub _address: u8, } @@ -1186,135 +927,6 @@ pub const TCP_MD5SIG_FLAG_IFINDEX: u32 = 2; pub const TCP_RECEIVE_ZEROCOPY_FLAG_TLB_CLEAN_HINT: u32 = 1; pub const UNIX_PATH_MAX: u32 = 108; -pub const IFNAMSIZ: u32 = 16; -pub const IFALIASZ: u32 = 256; -pub const ALTIFNAMSIZ: u32 = 128; -pub const GENERIC_HDLC_VERSION: u32 = 4; -pub const CLOCK_DEFAULT: u32 = 0; -pub const CLOCK_EXT: u32 = 1; -pub const CLOCK_INT: u32 = 2; -pub const CLOCK_TXINT: u32 = 3; -pub const CLOCK_TXFROMRX: u32 = 4; -pub const ENCODING_DEFAULT: u32 = 0; -pub const ENCODING_NRZ: u32 = 1; -pub const ENCODING_NRZI: u32 = 2; -pub const ENCODING_FM_MARK: u32 = 3; -pub const ENCODING_FM_SPACE: u32 = 4; -pub const ENCODING_MANCHESTER: u32 = 5; -pub const PARITY_DEFAULT: u32 = 0; -pub const PARITY_NONE: u32 = 1; -pub const PARITY_CRC16_PR0: u32 = 2; -pub const PARITY_CRC16_PR1: u32 = 3; -pub const PARITY_CRC16_PR0_CCITT: u32 = 4; -pub const PARITY_CRC16_PR1_CCITT: u32 = 5; -pub const PARITY_CRC32_PR0_CCITT: u32 = 6; -pub const PARITY_CRC32_PR1_CCITT: u32 = 7; -pub const LMI_DEFAULT: u32 = 0; -pub const LMI_NONE: u32 = 1; -pub const LMI_ANSI: u32 = 2; -pub const LMI_CCITT: u32 = 3; -pub const LMI_CISCO: u32 = 4; -pub const IF_GET_IFACE: u32 = 1; -pub const IF_GET_PROTO: u32 = 2; -pub const IF_IFACE_V35: u32 = 4096; -pub const IF_IFACE_V24: u32 = 4097; -pub const IF_IFACE_X21: u32 = 4098; -pub const IF_IFACE_T1: u32 = 4099; -pub const IF_IFACE_E1: u32 = 4100; -pub const IF_IFACE_SYNC_SERIAL: u32 = 4101; -pub const IF_IFACE_X21D: u32 = 4102; -pub const IF_PROTO_HDLC: u32 = 8192; -pub const IF_PROTO_PPP: u32 = 8193; -pub const IF_PROTO_CISCO: u32 = 8194; -pub const IF_PROTO_FR: u32 = 8195; -pub const IF_PROTO_FR_ADD_PVC: u32 = 8196; -pub const IF_PROTO_FR_DEL_PVC: u32 = 8197; -pub const IF_PROTO_X25: u32 = 8198; -pub const IF_PROTO_HDLC_ETH: u32 = 8199; -pub const IF_PROTO_FR_ADD_ETH_PVC: u32 = 8200; -pub const IF_PROTO_FR_DEL_ETH_PVC: u32 = 8201; -pub const IF_PROTO_FR_PVC: u32 = 8202; -pub const IF_PROTO_FR_ETH_PVC: u32 = 8203; -pub const IF_PROTO_RAW: u32 = 8204; -pub const IFHWADDRLEN: u32 = 6; -pub const NF_DROP: u32 = 0; -pub const NF_ACCEPT: u32 = 1; -pub const NF_STOLEN: u32 = 2; -pub const NF_QUEUE: u32 = 3; -pub const NF_REPEAT: u32 = 4; -pub const NF_STOP: u32 = 5; -pub const NF_MAX_VERDICT: u32 = 5; -pub const NF_VERDICT_MASK: u32 = 255; -pub const NF_VERDICT_FLAG_QUEUE_BYPASS: u32 = 32768; -pub const NF_VERDICT_QMASK: u32 = 4294901760; -pub const NF_VERDICT_QBITS: u32 = 16; -pub const NF_VERDICT_BITS: u32 = 16; -pub const NF_IP6_PRE_ROUTING: u32 = 0; -pub const NF_IP6_LOCAL_IN: u32 = 1; -pub const NF_IP6_FORWARD: u32 = 2; -pub const NF_IP6_LOCAL_OUT: u32 = 3; -pub const NF_IP6_POST_ROUTING: u32 = 4; -pub const NF_IP6_NUMHOOKS: u32 = 5; -pub const XT_FUNCTION_MAXNAMELEN: u32 = 30; -pub const XT_EXTENSION_MAXNAMELEN: u32 = 29; -pub const XT_TABLE_MAXNAMELEN: u32 = 32; -pub const XT_CONTINUE: u32 = 4294967295; -pub const XT_RETURN: i32 = -5; -pub const XT_STANDARD_TARGET: &[u8; 1] = b"\0"; -pub const XT_ERROR_TARGET: &[u8; 6] = b"ERROR\0"; -pub const XT_INV_PROTO: u32 = 64; -pub const IP6T_FUNCTION_MAXNAMELEN: u32 = 30; -pub const IP6T_TABLE_MAXNAMELEN: u32 = 32; -pub const IP6T_CONTINUE: u32 = 4294967295; -pub const IP6T_RETURN: i32 = -5; -pub const XT_TCP_INV_SRCPT: u32 = 1; -pub const XT_TCP_INV_DSTPT: u32 = 2; -pub const XT_TCP_INV_FLAGS: u32 = 4; -pub const XT_TCP_INV_OPTION: u32 = 8; -pub const XT_TCP_INV_MASK: u32 = 15; -pub const XT_UDP_INV_SRCPT: u32 = 1; -pub const XT_UDP_INV_DSTPT: u32 = 2; -pub const XT_UDP_INV_MASK: u32 = 3; -pub const IP6T_TCP_INV_SRCPT: u32 = 1; -pub const IP6T_TCP_INV_DSTPT: u32 = 2; -pub const IP6T_TCP_INV_FLAGS: u32 = 4; -pub const IP6T_TCP_INV_OPTION: u32 = 8; -pub const IP6T_TCP_INV_MASK: u32 = 15; -pub const IP6T_UDP_INV_SRCPT: u32 = 1; -pub const IP6T_UDP_INV_DSTPT: u32 = 2; -pub const IP6T_UDP_INV_MASK: u32 = 3; -pub const IP6T_STANDARD_TARGET: &[u8; 1] = b"\0"; -pub const IP6T_ERROR_TARGET: &[u8; 6] = b"ERROR\0"; -pub const IP6T_F_PROTO: u32 = 1; -pub const IP6T_F_TOS: u32 = 2; -pub const IP6T_F_GOTO: u32 = 4; -pub const IP6T_F_MASK: u32 = 7; -pub const IP6T_INV_VIA_IN: u32 = 1; -pub const IP6T_INV_VIA_OUT: u32 = 2; -pub const IP6T_INV_TOS: u32 = 4; -pub const IP6T_INV_SRCIP: u32 = 8; -pub const IP6T_INV_DSTIP: u32 = 16; -pub const IP6T_INV_FRAG: u32 = 32; -pub const IP6T_INV_PROTO: u32 = 64; -pub const IP6T_INV_MASK: u32 = 127; -pub const IP6T_BASE_CTL: u32 = 64; -pub const IP6T_SO_SET_REPLACE: u32 = 64; -pub const IP6T_SO_SET_ADD_COUNTERS: u32 = 65; -pub const IP6T_SO_SET_MAX: u32 = 65; -pub const IP6T_SO_GET_INFO: u32 = 64; -pub const IP6T_SO_GET_ENTRIES: u32 = 65; -pub const IP6T_SO_GET_REVISION_MATCH: u32 = 68; -pub const IP6T_SO_GET_REVISION_TARGET: u32 = 69; -pub const IP6T_SO_GET_MAX: u32 = 69; -pub const IP6T_SO_ORIGINAL_DST: u32 = 80; -pub const IP6T_ICMP_INV: u32 = 1; -pub const NF_IP_PRE_ROUTING: u32 = 0; -pub const NF_IP_LOCAL_IN: u32 = 1; -pub const NF_IP_FORWARD: u32 = 2; -pub const NF_IP_LOCAL_OUT: u32 = 3; -pub const NF_IP_POST_ROUTING: u32 = 4; -pub const NF_IP_NUMHOOKS: u32 = 5; -pub const SO_ORIGINAL_DST: u32 = 80; pub const SHUT_RD: u32 = 0; pub const SHUT_WR: u32 = 1; pub const SHUT_RDWR: u32 = 2; @@ -1543,25 +1155,6 @@ pub const TCP_NLA_EDT: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_EDT; pub const TCP_NLA_TTL: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_TTL; pub const TCP_NLA_REHASH: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_REHASH; -pub const IF_OPER_UNKNOWN: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_UNKNOWN; -pub const IF_OPER_NOTPRESENT: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_NOTPRESENT; -pub const IF_OPER_DOWN: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_DOWN; -pub const IF_OPER_LOWERLAYERDOWN: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_LOWERLAYERDOWN; -pub const IF_OPER_TESTING: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_TESTING; -pub const IF_OPER_DORMANT: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_DORMANT; -pub const IF_OPER_UP: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_UP; -pub const IF_LINK_MODE_DEFAULT: _bindgen_ty_8 = _bindgen_ty_8::IF_LINK_MODE_DEFAULT; -pub const IF_LINK_MODE_DORMANT: _bindgen_ty_8 = _bindgen_ty_8::IF_LINK_MODE_DORMANT; -pub const IF_LINK_MODE_TESTING: _bindgen_ty_8 = _bindgen_ty_8::IF_LINK_MODE_TESTING; -pub const NFPROTO_UNSPEC: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_UNSPEC; -pub const NFPROTO_INET: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_INET; -pub const NFPROTO_IPV4: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_IPV4; -pub const NFPROTO_ARP: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_ARP; -pub const NFPROTO_NETDEV: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_NETDEV; -pub const NFPROTO_BRIDGE: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_BRIDGE; -pub const NFPROTO_IPV6: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_IPV6; -pub const NFPROTO_DECNET: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_DECNET; -pub const NFPROTO_NUMPROTO: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_NUMPROTO; #[repr(u32)] #[non_exhaustive] #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] @@ -1785,121 +1378,6 @@ TCP_NLA_TTL = 26, TCP_NLA_REHASH = 27, } -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum net_device_flags { -IFF_UP = 1, -IFF_BROADCAST = 2, -IFF_DEBUG = 4, -IFF_LOOPBACK = 8, -IFF_POINTOPOINT = 16, -IFF_NOTRAILERS = 32, -IFF_RUNNING = 64, -IFF_NOARP = 128, -IFF_PROMISC = 256, -IFF_ALLMULTI = 512, -IFF_MASTER = 1024, -IFF_SLAVE = 2048, -IFF_MULTICAST = 4096, -IFF_PORTSEL = 8192, -IFF_AUTOMEDIA = 16384, -IFF_DYNAMIC = 32768, -IFF_LOWER_UP = 65536, -IFF_DORMANT = 131072, -IFF_ECHO = 262144, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_7 { -IF_OPER_UNKNOWN = 0, -IF_OPER_NOTPRESENT = 1, -IF_OPER_DOWN = 2, -IF_OPER_LOWERLAYERDOWN = 3, -IF_OPER_TESTING = 4, -IF_OPER_DORMANT = 5, -IF_OPER_UP = 6, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_8 { -IF_LINK_MODE_DEFAULT = 0, -IF_LINK_MODE_DORMANT = 1, -IF_LINK_MODE_TESTING = 2, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_inet_hooks { -NF_INET_PRE_ROUTING = 0, -NF_INET_LOCAL_IN = 1, -NF_INET_FORWARD = 2, -NF_INET_LOCAL_OUT = 3, -NF_INET_POST_ROUTING = 4, -NF_INET_NUMHOOKS = 5, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_dev_hooks { -NF_NETDEV_INGRESS = 0, -NF_NETDEV_EGRESS = 1, -NF_NETDEV_NUMHOOKS = 2, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_9 { -NFPROTO_UNSPEC = 0, -NFPROTO_INET = 1, -NFPROTO_IPV4 = 2, -NFPROTO_ARP = 3, -NFPROTO_NETDEV = 5, -NFPROTO_BRIDGE = 7, -NFPROTO_IPV6 = 10, -NFPROTO_DECNET = 12, -NFPROTO_NUMPROTO = 13, -} -#[repr(i32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_ip6_hook_priorities { -NF_IP6_PRI_FIRST = -2147483648, -NF_IP6_PRI_RAW_BEFORE_DEFRAG = -450, -NF_IP6_PRI_CONNTRACK_DEFRAG = -400, -NF_IP6_PRI_RAW = -300, -NF_IP6_PRI_SELINUX_FIRST = -225, -NF_IP6_PRI_CONNTRACK = -200, -NF_IP6_PRI_MANGLE = -150, -NF_IP6_PRI_NAT_DST = -100, -NF_IP6_PRI_FILTER = 0, -NF_IP6_PRI_SECURITY = 50, -NF_IP6_PRI_NAT_SRC = 100, -NF_IP6_PRI_SELINUX_LAST = 225, -NF_IP6_PRI_CONNTRACK_HELPER = 300, -NF_IP6_PRI_LAST = 2147483647, -} -#[repr(i32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_ip_hook_priorities { -NF_IP_PRI_FIRST = -2147483648, -NF_IP_PRI_RAW_BEFORE_DEFRAG = -450, -NF_IP_PRI_CONNTRACK_DEFRAG = -400, -NF_IP_PRI_RAW = -300, -NF_IP_PRI_SELINUX_FIRST = -225, -NF_IP_PRI_CONNTRACK = -200, -NF_IP_PRI_MANGLE = -150, -NF_IP_PRI_NAT_DST = -100, -NF_IP_PRI_FILTER = 0, -NF_IP_PRI_SECURITY = 50, -NF_IP_PRI_NAT_SRC = 100, -NF_IP_PRI_SELINUX_LAST = 225, -NF_IP_PRI_CONNTRACK_HELPER = 300, -NF_IP_PRI_CONNTRACK_CONFIRM = 2147483647, -} #[repr(C)] #[derive(Copy, Clone)] pub union __kernel_sockaddr_storage__bindgen_ty_1 { @@ -1931,69 +1409,6 @@ pub hdr: tcphdr, pub words: [__be32; 5usize], } -#[repr(C)] -#[derive(Copy, Clone)] -pub union if_settings__bindgen_ty_1 { -pub raw_hdlc: *mut raw_hdlc_proto, -pub cisco: *mut cisco_proto, -pub fr: *mut fr_proto, -pub fr_pvc: *mut fr_proto_pvc, -pub fr_pvc_info: *mut fr_proto_pvc_info, -pub x25: *mut x25_hdlc_proto, -pub sync: *mut sync_serial_settings, -pub te1: *mut te1_settings, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ifreq__bindgen_ty_1 { -pub ifrn_name: [crate::ctypes::c_char; 16usize], -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ifreq__bindgen_ty_2 { -pub ifru_addr: sockaddr, -pub ifru_dstaddr: sockaddr, -pub ifru_broadaddr: sockaddr, -pub ifru_netmask: sockaddr, -pub ifru_hwaddr: sockaddr, -pub ifru_flags: crate::ctypes::c_short, -pub ifru_ivalue: crate::ctypes::c_int, -pub ifru_mtu: crate::ctypes::c_int, -pub ifru_map: ifmap, -pub ifru_slave: [crate::ctypes::c_char; 16usize], -pub ifru_newname: [crate::ctypes::c_char; 16usize], -pub ifru_data: *mut crate::ctypes::c_void, -pub ifru_settings: if_settings, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ifconf__bindgen_ty_1 { -pub ifcu_buf: *mut crate::ctypes::c_char, -pub ifcu_req: *mut ifreq, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union nf_inet_addr { -pub all: [__u32; 4usize], -pub ip: __be32, -pub ip6: [__be32; 4usize], -pub in_: in_addr, -pub in6: in6_addr, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union xt_entry_match__bindgen_ty_1 { -pub user: xt_entry_match__bindgen_ty_1__bindgen_ty_1, -pub kernel: xt_entry_match__bindgen_ty_1__bindgen_ty_2, -pub match_size: __u16, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union xt_entry_target__bindgen_ty_1 { -pub user: xt_entry_target__bindgen_ty_1__bindgen_ty_1, -pub kernel: xt_entry_target__bindgen_ty_1__bindgen_ty_2, -pub target_size: __u16, -} impl __BindgenBitfieldUnit { #[inline] pub const fn new(storage: Storage) -> Self { @@ -2419,9 +1834,3 @@ __bindgen_bitfield_unit } } -impl nf_inet_hooks { -pub const NF_INET_INGRESS: nf_inet_hooks = nf_inet_hooks::NF_INET_NUMHOOKS; -} -impl nf_ip_hook_priorities { -pub const NF_IP_PRI_LAST: nf_ip_hook_priorities = nf_ip_hook_priorities::NF_IP_PRI_CONNTRACK_CONFIRM; -} diff -Nru temporalio-1.3.0/vendor/linux-raw-sys/src/x86_64/general.rs temporalio-1.3.0/vendor/linux-raw-sys/src/x86_64/general.rs --- temporalio-1.3.0/vendor/linux-raw-sys/src/x86_64/general.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/linux-raw-sys/src/x86_64/general.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1577,19 +1577,6 @@ pub const GRND_NONBLOCK: u32 = 1; pub const GRND_RANDOM: u32 = 2; pub const GRND_INSECURE: u32 = 4; -pub const LINUX_REBOOT_MAGIC1: u32 = 4276215469; -pub const LINUX_REBOOT_MAGIC2: u32 = 672274793; -pub const LINUX_REBOOT_MAGIC2A: u32 = 85072278; -pub const LINUX_REBOOT_MAGIC2B: u32 = 369367448; -pub const LINUX_REBOOT_MAGIC2C: u32 = 537993216; -pub const LINUX_REBOOT_CMD_RESTART: u32 = 19088743; -pub const LINUX_REBOOT_CMD_HALT: u32 = 3454992675; -pub const LINUX_REBOOT_CMD_CAD_ON: u32 = 2309737967; -pub const LINUX_REBOOT_CMD_CAD_OFF: u32 = 0; -pub const LINUX_REBOOT_CMD_POWER_OFF: u32 = 1126301404; -pub const LINUX_REBOOT_CMD_RESTART2: u32 = 2712847316; -pub const LINUX_REBOOT_CMD_SW_SUSPEND: u32 = 3489725666; -pub const LINUX_REBOOT_CMD_KEXEC: u32 = 1163412803; pub const ITIMER_REAL: u32 = 0; pub const ITIMER_VIRTUAL: u32 = 1; pub const ITIMER_PROF: u32 = 2; diff -Nru temporalio-1.3.0/vendor/linux-raw-sys/src/x86_64/net.rs temporalio-1.3.0/vendor/linux-raw-sys/src/x86_64/net.rs --- temporalio-1.3.0/vendor/linux-raw-sys/src/x86_64/net.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/linux-raw-sys/src/x86_64/net.rs 2023-10-30 19:40:00.000000000 +0000 @@ -476,255 +476,6 @@ } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct sync_serial_settings { -pub clock_rate: crate::ctypes::c_uint, -pub clock_type: crate::ctypes::c_uint, -pub loopback: crate::ctypes::c_ushort, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct te1_settings { -pub clock_rate: crate::ctypes::c_uint, -pub clock_type: crate::ctypes::c_uint, -pub loopback: crate::ctypes::c_ushort, -pub slot_map: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct raw_hdlc_proto { -pub encoding: crate::ctypes::c_ushort, -pub parity: crate::ctypes::c_ushort, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fr_proto { -pub t391: crate::ctypes::c_uint, -pub t392: crate::ctypes::c_uint, -pub n391: crate::ctypes::c_uint, -pub n392: crate::ctypes::c_uint, -pub n393: crate::ctypes::c_uint, -pub lmi: crate::ctypes::c_ushort, -pub dce: crate::ctypes::c_ushort, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fr_proto_pvc { -pub dlci: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct fr_proto_pvc_info { -pub dlci: crate::ctypes::c_uint, -pub master: [crate::ctypes::c_char; 16usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct cisco_proto { -pub interval: crate::ctypes::c_uint, -pub timeout: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct x25_hdlc_proto { -pub dce: crate::ctypes::c_ushort, -pub modulo: crate::ctypes::c_uint, -pub window: crate::ctypes::c_uint, -pub t1: crate::ctypes::c_uint, -pub t2: crate::ctypes::c_uint, -pub n2: crate::ctypes::c_uint, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ifmap { -pub mem_start: crate::ctypes::c_ulong, -pub mem_end: crate::ctypes::c_ulong, -pub base_addr: crate::ctypes::c_ushort, -pub irq: crate::ctypes::c_uchar, -pub dma: crate::ctypes::c_uchar, -pub port: crate::ctypes::c_uchar, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct if_settings { -pub type_: crate::ctypes::c_uint, -pub size: crate::ctypes::c_uint, -pub ifs_ifsu: if_settings__bindgen_ty_1, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ifreq { -pub ifr_ifrn: ifreq__bindgen_ty_1, -pub ifr_ifru: ifreq__bindgen_ty_2, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ifconf { -pub ifc_len: crate::ctypes::c_int, -pub ifc_ifcu: ifconf__bindgen_ty_1, -} -#[repr(C)] -pub struct xt_entry_match { -pub u: xt_entry_match__bindgen_ty_1, -pub data: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_match__bindgen_ty_1__bindgen_ty_1 { -pub match_size: __u16, -pub name: [crate::ctypes::c_char; 29usize], -pub revision: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_match__bindgen_ty_1__bindgen_ty_2 { -pub match_size: __u16, -pub match_: *mut xt_match, -} -#[repr(C)] -pub struct xt_entry_target { -pub u: xt_entry_target__bindgen_ty_1, -pub data: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_target__bindgen_ty_1__bindgen_ty_1 { -pub target_size: __u16, -pub name: [crate::ctypes::c_char; 29usize], -pub revision: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_entry_target__bindgen_ty_1__bindgen_ty_2 { -pub target_size: __u16, -pub target: *mut xt_target, -} -#[repr(C)] -pub struct xt_standard_target { -pub target: xt_entry_target, -pub verdict: crate::ctypes::c_int, -} -#[repr(C)] -pub struct xt_error_target { -pub target: xt_entry_target, -pub errorname: [crate::ctypes::c_char; 30usize], -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_get_revision { -pub name: [crate::ctypes::c_char; 29usize], -pub revision: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct _xt_align { -pub u8_: __u8, -pub u16_: __u16, -pub u32_: __u32, -pub u64_: __u64, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_counters { -pub pcnt: __u64, -pub bcnt: __u64, -} -#[repr(C)] -#[derive(Debug)] -pub struct xt_counters_info { -pub name: [crate::ctypes::c_char; 32usize], -pub num_counters: crate::ctypes::c_uint, -pub counters: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_tcp { -pub spts: [__u16; 2usize], -pub dpts: [__u16; 2usize], -pub option: __u8, -pub flg_mask: __u8, -pub flg_cmp: __u8, -pub invflags: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_udp { -pub spts: [__u16; 2usize], -pub dpts: [__u16; 2usize], -pub invflags: __u8, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct ip6t_ip6 { -pub src: in6_addr, -pub dst: in6_addr, -pub smsk: in6_addr, -pub dmsk: in6_addr, -pub iniface: [crate::ctypes::c_char; 16usize], -pub outiface: [crate::ctypes::c_char; 16usize], -pub iniface_mask: [crate::ctypes::c_uchar; 16usize], -pub outiface_mask: [crate::ctypes::c_uchar; 16usize], -pub proto: __u16, -pub tos: __u8, -pub flags: __u8, -pub invflags: __u8, -} -#[repr(C)] -pub struct ip6t_entry { -pub ipv6: ip6t_ip6, -pub nfcache: crate::ctypes::c_uint, -pub target_offset: __u16, -pub next_offset: __u16, -pub comefrom: crate::ctypes::c_uint, -pub counters: xt_counters, -pub elems: __IncompleteArrayField, -} -#[repr(C)] -pub struct ip6t_standard { -pub entry: ip6t_entry, -pub target: xt_standard_target, -} -#[repr(C)] -pub struct ip6t_error { -pub entry: ip6t_entry, -pub target: xt_error_target, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ip6t_icmp { -pub type_: __u8, -pub code: [__u8; 2usize], -pub invflags: __u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct ip6t_getinfo { -pub name: [crate::ctypes::c_char; 32usize], -pub valid_hooks: crate::ctypes::c_uint, -pub hook_entry: [crate::ctypes::c_uint; 5usize], -pub underflow: [crate::ctypes::c_uint; 5usize], -pub num_entries: crate::ctypes::c_uint, -pub size: crate::ctypes::c_uint, -} -#[repr(C)] -pub struct ip6t_replace { -pub name: [crate::ctypes::c_char; 32usize], -pub valid_hooks: crate::ctypes::c_uint, -pub num_entries: crate::ctypes::c_uint, -pub size: crate::ctypes::c_uint, -pub hook_entry: [crate::ctypes::c_uint; 5usize], -pub underflow: [crate::ctypes::c_uint; 5usize], -pub num_counters: crate::ctypes::c_uint, -pub counters: *mut xt_counters, -pub entries: __IncompleteArrayField, -} -#[repr(C)] -pub struct ip6t_get_entries { -pub name: [crate::ctypes::c_char; 32usize], -pub size: crate::ctypes::c_uint, -pub entrytable: __IncompleteArrayField, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] pub struct linger { pub l_onoff: crate::ctypes::c_int, pub l_linger: crate::ctypes::c_int, @@ -762,16 +513,6 @@ } #[repr(C)] #[derive(Debug, Copy, Clone)] -pub struct xt_match { -pub _address: u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] -pub struct xt_target { -pub _address: u8, -} -#[repr(C)] -#[derive(Debug, Copy, Clone)] pub struct iovec { pub _address: u8, } @@ -1194,135 +935,6 @@ pub const TCP_MD5SIG_FLAG_IFINDEX: u32 = 2; pub const TCP_RECEIVE_ZEROCOPY_FLAG_TLB_CLEAN_HINT: u32 = 1; pub const UNIX_PATH_MAX: u32 = 108; -pub const IFNAMSIZ: u32 = 16; -pub const IFALIASZ: u32 = 256; -pub const ALTIFNAMSIZ: u32 = 128; -pub const GENERIC_HDLC_VERSION: u32 = 4; -pub const CLOCK_DEFAULT: u32 = 0; -pub const CLOCK_EXT: u32 = 1; -pub const CLOCK_INT: u32 = 2; -pub const CLOCK_TXINT: u32 = 3; -pub const CLOCK_TXFROMRX: u32 = 4; -pub const ENCODING_DEFAULT: u32 = 0; -pub const ENCODING_NRZ: u32 = 1; -pub const ENCODING_NRZI: u32 = 2; -pub const ENCODING_FM_MARK: u32 = 3; -pub const ENCODING_FM_SPACE: u32 = 4; -pub const ENCODING_MANCHESTER: u32 = 5; -pub const PARITY_DEFAULT: u32 = 0; -pub const PARITY_NONE: u32 = 1; -pub const PARITY_CRC16_PR0: u32 = 2; -pub const PARITY_CRC16_PR1: u32 = 3; -pub const PARITY_CRC16_PR0_CCITT: u32 = 4; -pub const PARITY_CRC16_PR1_CCITT: u32 = 5; -pub const PARITY_CRC32_PR0_CCITT: u32 = 6; -pub const PARITY_CRC32_PR1_CCITT: u32 = 7; -pub const LMI_DEFAULT: u32 = 0; -pub const LMI_NONE: u32 = 1; -pub const LMI_ANSI: u32 = 2; -pub const LMI_CCITT: u32 = 3; -pub const LMI_CISCO: u32 = 4; -pub const IF_GET_IFACE: u32 = 1; -pub const IF_GET_PROTO: u32 = 2; -pub const IF_IFACE_V35: u32 = 4096; -pub const IF_IFACE_V24: u32 = 4097; -pub const IF_IFACE_X21: u32 = 4098; -pub const IF_IFACE_T1: u32 = 4099; -pub const IF_IFACE_E1: u32 = 4100; -pub const IF_IFACE_SYNC_SERIAL: u32 = 4101; -pub const IF_IFACE_X21D: u32 = 4102; -pub const IF_PROTO_HDLC: u32 = 8192; -pub const IF_PROTO_PPP: u32 = 8193; -pub const IF_PROTO_CISCO: u32 = 8194; -pub const IF_PROTO_FR: u32 = 8195; -pub const IF_PROTO_FR_ADD_PVC: u32 = 8196; -pub const IF_PROTO_FR_DEL_PVC: u32 = 8197; -pub const IF_PROTO_X25: u32 = 8198; -pub const IF_PROTO_HDLC_ETH: u32 = 8199; -pub const IF_PROTO_FR_ADD_ETH_PVC: u32 = 8200; -pub const IF_PROTO_FR_DEL_ETH_PVC: u32 = 8201; -pub const IF_PROTO_FR_PVC: u32 = 8202; -pub const IF_PROTO_FR_ETH_PVC: u32 = 8203; -pub const IF_PROTO_RAW: u32 = 8204; -pub const IFHWADDRLEN: u32 = 6; -pub const NF_DROP: u32 = 0; -pub const NF_ACCEPT: u32 = 1; -pub const NF_STOLEN: u32 = 2; -pub const NF_QUEUE: u32 = 3; -pub const NF_REPEAT: u32 = 4; -pub const NF_STOP: u32 = 5; -pub const NF_MAX_VERDICT: u32 = 5; -pub const NF_VERDICT_MASK: u32 = 255; -pub const NF_VERDICT_FLAG_QUEUE_BYPASS: u32 = 32768; -pub const NF_VERDICT_QMASK: u32 = 4294901760; -pub const NF_VERDICT_QBITS: u32 = 16; -pub const NF_VERDICT_BITS: u32 = 16; -pub const NF_IP6_PRE_ROUTING: u32 = 0; -pub const NF_IP6_LOCAL_IN: u32 = 1; -pub const NF_IP6_FORWARD: u32 = 2; -pub const NF_IP6_LOCAL_OUT: u32 = 3; -pub const NF_IP6_POST_ROUTING: u32 = 4; -pub const NF_IP6_NUMHOOKS: u32 = 5; -pub const XT_FUNCTION_MAXNAMELEN: u32 = 30; -pub const XT_EXTENSION_MAXNAMELEN: u32 = 29; -pub const XT_TABLE_MAXNAMELEN: u32 = 32; -pub const XT_CONTINUE: u32 = 4294967295; -pub const XT_RETURN: i32 = -5; -pub const XT_STANDARD_TARGET: &[u8; 1] = b"\0"; -pub const XT_ERROR_TARGET: &[u8; 6] = b"ERROR\0"; -pub const XT_INV_PROTO: u32 = 64; -pub const IP6T_FUNCTION_MAXNAMELEN: u32 = 30; -pub const IP6T_TABLE_MAXNAMELEN: u32 = 32; -pub const IP6T_CONTINUE: u32 = 4294967295; -pub const IP6T_RETURN: i32 = -5; -pub const XT_TCP_INV_SRCPT: u32 = 1; -pub const XT_TCP_INV_DSTPT: u32 = 2; -pub const XT_TCP_INV_FLAGS: u32 = 4; -pub const XT_TCP_INV_OPTION: u32 = 8; -pub const XT_TCP_INV_MASK: u32 = 15; -pub const XT_UDP_INV_SRCPT: u32 = 1; -pub const XT_UDP_INV_DSTPT: u32 = 2; -pub const XT_UDP_INV_MASK: u32 = 3; -pub const IP6T_TCP_INV_SRCPT: u32 = 1; -pub const IP6T_TCP_INV_DSTPT: u32 = 2; -pub const IP6T_TCP_INV_FLAGS: u32 = 4; -pub const IP6T_TCP_INV_OPTION: u32 = 8; -pub const IP6T_TCP_INV_MASK: u32 = 15; -pub const IP6T_UDP_INV_SRCPT: u32 = 1; -pub const IP6T_UDP_INV_DSTPT: u32 = 2; -pub const IP6T_UDP_INV_MASK: u32 = 3; -pub const IP6T_STANDARD_TARGET: &[u8; 1] = b"\0"; -pub const IP6T_ERROR_TARGET: &[u8; 6] = b"ERROR\0"; -pub const IP6T_F_PROTO: u32 = 1; -pub const IP6T_F_TOS: u32 = 2; -pub const IP6T_F_GOTO: u32 = 4; -pub const IP6T_F_MASK: u32 = 7; -pub const IP6T_INV_VIA_IN: u32 = 1; -pub const IP6T_INV_VIA_OUT: u32 = 2; -pub const IP6T_INV_TOS: u32 = 4; -pub const IP6T_INV_SRCIP: u32 = 8; -pub const IP6T_INV_DSTIP: u32 = 16; -pub const IP6T_INV_FRAG: u32 = 32; -pub const IP6T_INV_PROTO: u32 = 64; -pub const IP6T_INV_MASK: u32 = 127; -pub const IP6T_BASE_CTL: u32 = 64; -pub const IP6T_SO_SET_REPLACE: u32 = 64; -pub const IP6T_SO_SET_ADD_COUNTERS: u32 = 65; -pub const IP6T_SO_SET_MAX: u32 = 65; -pub const IP6T_SO_GET_INFO: u32 = 64; -pub const IP6T_SO_GET_ENTRIES: u32 = 65; -pub const IP6T_SO_GET_REVISION_MATCH: u32 = 68; -pub const IP6T_SO_GET_REVISION_TARGET: u32 = 69; -pub const IP6T_SO_GET_MAX: u32 = 69; -pub const IP6T_SO_ORIGINAL_DST: u32 = 80; -pub const IP6T_ICMP_INV: u32 = 1; -pub const NF_IP_PRE_ROUTING: u32 = 0; -pub const NF_IP_LOCAL_IN: u32 = 1; -pub const NF_IP_FORWARD: u32 = 2; -pub const NF_IP_LOCAL_OUT: u32 = 3; -pub const NF_IP_POST_ROUTING: u32 = 4; -pub const NF_IP_NUMHOOKS: u32 = 5; -pub const SO_ORIGINAL_DST: u32 = 80; pub const SHUT_RD: u32 = 0; pub const SHUT_WR: u32 = 1; pub const SHUT_RDWR: u32 = 2; @@ -1551,25 +1163,6 @@ pub const TCP_NLA_EDT: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_EDT; pub const TCP_NLA_TTL: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_TTL; pub const TCP_NLA_REHASH: _bindgen_ty_6 = _bindgen_ty_6::TCP_NLA_REHASH; -pub const IF_OPER_UNKNOWN: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_UNKNOWN; -pub const IF_OPER_NOTPRESENT: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_NOTPRESENT; -pub const IF_OPER_DOWN: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_DOWN; -pub const IF_OPER_LOWERLAYERDOWN: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_LOWERLAYERDOWN; -pub const IF_OPER_TESTING: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_TESTING; -pub const IF_OPER_DORMANT: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_DORMANT; -pub const IF_OPER_UP: _bindgen_ty_7 = _bindgen_ty_7::IF_OPER_UP; -pub const IF_LINK_MODE_DEFAULT: _bindgen_ty_8 = _bindgen_ty_8::IF_LINK_MODE_DEFAULT; -pub const IF_LINK_MODE_DORMANT: _bindgen_ty_8 = _bindgen_ty_8::IF_LINK_MODE_DORMANT; -pub const IF_LINK_MODE_TESTING: _bindgen_ty_8 = _bindgen_ty_8::IF_LINK_MODE_TESTING; -pub const NFPROTO_UNSPEC: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_UNSPEC; -pub const NFPROTO_INET: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_INET; -pub const NFPROTO_IPV4: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_IPV4; -pub const NFPROTO_ARP: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_ARP; -pub const NFPROTO_NETDEV: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_NETDEV; -pub const NFPROTO_BRIDGE: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_BRIDGE; -pub const NFPROTO_IPV6: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_IPV6; -pub const NFPROTO_DECNET: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_DECNET; -pub const NFPROTO_NUMPROTO: _bindgen_ty_9 = _bindgen_ty_9::NFPROTO_NUMPROTO; #[repr(u32)] #[non_exhaustive] #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] @@ -1793,121 +1386,6 @@ TCP_NLA_TTL = 26, TCP_NLA_REHASH = 27, } -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum net_device_flags { -IFF_UP = 1, -IFF_BROADCAST = 2, -IFF_DEBUG = 4, -IFF_LOOPBACK = 8, -IFF_POINTOPOINT = 16, -IFF_NOTRAILERS = 32, -IFF_RUNNING = 64, -IFF_NOARP = 128, -IFF_PROMISC = 256, -IFF_ALLMULTI = 512, -IFF_MASTER = 1024, -IFF_SLAVE = 2048, -IFF_MULTICAST = 4096, -IFF_PORTSEL = 8192, -IFF_AUTOMEDIA = 16384, -IFF_DYNAMIC = 32768, -IFF_LOWER_UP = 65536, -IFF_DORMANT = 131072, -IFF_ECHO = 262144, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_7 { -IF_OPER_UNKNOWN = 0, -IF_OPER_NOTPRESENT = 1, -IF_OPER_DOWN = 2, -IF_OPER_LOWERLAYERDOWN = 3, -IF_OPER_TESTING = 4, -IF_OPER_DORMANT = 5, -IF_OPER_UP = 6, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_8 { -IF_LINK_MODE_DEFAULT = 0, -IF_LINK_MODE_DORMANT = 1, -IF_LINK_MODE_TESTING = 2, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_inet_hooks { -NF_INET_PRE_ROUTING = 0, -NF_INET_LOCAL_IN = 1, -NF_INET_FORWARD = 2, -NF_INET_LOCAL_OUT = 3, -NF_INET_POST_ROUTING = 4, -NF_INET_NUMHOOKS = 5, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_dev_hooks { -NF_NETDEV_INGRESS = 0, -NF_NETDEV_EGRESS = 1, -NF_NETDEV_NUMHOOKS = 2, -} -#[repr(u32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum _bindgen_ty_9 { -NFPROTO_UNSPEC = 0, -NFPROTO_INET = 1, -NFPROTO_IPV4 = 2, -NFPROTO_ARP = 3, -NFPROTO_NETDEV = 5, -NFPROTO_BRIDGE = 7, -NFPROTO_IPV6 = 10, -NFPROTO_DECNET = 12, -NFPROTO_NUMPROTO = 13, -} -#[repr(i32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_ip6_hook_priorities { -NF_IP6_PRI_FIRST = -2147483648, -NF_IP6_PRI_RAW_BEFORE_DEFRAG = -450, -NF_IP6_PRI_CONNTRACK_DEFRAG = -400, -NF_IP6_PRI_RAW = -300, -NF_IP6_PRI_SELINUX_FIRST = -225, -NF_IP6_PRI_CONNTRACK = -200, -NF_IP6_PRI_MANGLE = -150, -NF_IP6_PRI_NAT_DST = -100, -NF_IP6_PRI_FILTER = 0, -NF_IP6_PRI_SECURITY = 50, -NF_IP6_PRI_NAT_SRC = 100, -NF_IP6_PRI_SELINUX_LAST = 225, -NF_IP6_PRI_CONNTRACK_HELPER = 300, -NF_IP6_PRI_LAST = 2147483647, -} -#[repr(i32)] -#[non_exhaustive] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum nf_ip_hook_priorities { -NF_IP_PRI_FIRST = -2147483648, -NF_IP_PRI_RAW_BEFORE_DEFRAG = -450, -NF_IP_PRI_CONNTRACK_DEFRAG = -400, -NF_IP_PRI_RAW = -300, -NF_IP_PRI_SELINUX_FIRST = -225, -NF_IP_PRI_CONNTRACK = -200, -NF_IP_PRI_MANGLE = -150, -NF_IP_PRI_NAT_DST = -100, -NF_IP_PRI_FILTER = 0, -NF_IP_PRI_SECURITY = 50, -NF_IP_PRI_NAT_SRC = 100, -NF_IP_PRI_SELINUX_LAST = 225, -NF_IP_PRI_CONNTRACK_HELPER = 300, -NF_IP_PRI_CONNTRACK_CONFIRM = 2147483647, -} #[repr(C)] #[derive(Copy, Clone)] pub union __kernel_sockaddr_storage__bindgen_ty_1 { @@ -1939,69 +1417,6 @@ pub hdr: tcphdr, pub words: [__be32; 5usize], } -#[repr(C)] -#[derive(Copy, Clone)] -pub union if_settings__bindgen_ty_1 { -pub raw_hdlc: *mut raw_hdlc_proto, -pub cisco: *mut cisco_proto, -pub fr: *mut fr_proto, -pub fr_pvc: *mut fr_proto_pvc, -pub fr_pvc_info: *mut fr_proto_pvc_info, -pub x25: *mut x25_hdlc_proto, -pub sync: *mut sync_serial_settings, -pub te1: *mut te1_settings, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ifreq__bindgen_ty_1 { -pub ifrn_name: [crate::ctypes::c_char; 16usize], -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ifreq__bindgen_ty_2 { -pub ifru_addr: sockaddr, -pub ifru_dstaddr: sockaddr, -pub ifru_broadaddr: sockaddr, -pub ifru_netmask: sockaddr, -pub ifru_hwaddr: sockaddr, -pub ifru_flags: crate::ctypes::c_short, -pub ifru_ivalue: crate::ctypes::c_int, -pub ifru_mtu: crate::ctypes::c_int, -pub ifru_map: ifmap, -pub ifru_slave: [crate::ctypes::c_char; 16usize], -pub ifru_newname: [crate::ctypes::c_char; 16usize], -pub ifru_data: *mut crate::ctypes::c_void, -pub ifru_settings: if_settings, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union ifconf__bindgen_ty_1 { -pub ifcu_buf: *mut crate::ctypes::c_char, -pub ifcu_req: *mut ifreq, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union nf_inet_addr { -pub all: [__u32; 4usize], -pub ip: __be32, -pub ip6: [__be32; 4usize], -pub in_: in_addr, -pub in6: in6_addr, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union xt_entry_match__bindgen_ty_1 { -pub user: xt_entry_match__bindgen_ty_1__bindgen_ty_1, -pub kernel: xt_entry_match__bindgen_ty_1__bindgen_ty_2, -pub match_size: __u16, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union xt_entry_target__bindgen_ty_1 { -pub user: xt_entry_target__bindgen_ty_1__bindgen_ty_1, -pub kernel: xt_entry_target__bindgen_ty_1__bindgen_ty_2, -pub target_size: __u16, -} impl __BindgenBitfieldUnit { #[inline] pub const fn new(storage: Storage) -> Self { @@ -2427,9 +1842,3 @@ __bindgen_bitfield_unit } } -impl nf_inet_hooks { -pub const NF_INET_INGRESS: nf_inet_hooks = nf_inet_hooks::NF_INET_NUMHOOKS; -} -impl nf_ip_hook_priorities { -pub const NF_IP_PRI_LAST: nf_ip_hook_priorities = nf_ip_hook_priorities::NF_IP_PRI_CONNTRACK_CONFIRM; -} diff -Nru temporalio-1.3.0/vendor/lock_api/.cargo-checksum.json temporalio-1.3.0/vendor/lock_api/.cargo-checksum.json --- temporalio-1.3.0/vendor/lock_api/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/lock_api/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"Cargo.toml":"33d5077741ae3052ec99816d7390a65220b898b87fb100589d5783352d4052f5","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"c9a75f18b9ab2927829a208fc6aa2cf4e63b8420887ba29cdb265d6619ae82d5","build.rs":"af84139c71d151adead0b4398c394a7dd16087bb2db44b14a0ed970ce868a6c6","src/lib.rs":"4d2f97a740d3bda0cf2ba0ccbaa44a294952a701fc5a8219a755b4187bab29d4","src/mutex.rs":"d24c765e7b371542992465027dba520e66a09e67a78324ab8396449aadad0d77","src/remutex.rs":"036fb60892d4b727257dbdf68a921738f048a94ed5ca0a1bb78ee0f68381cf9e","src/rwlock.rs":"4b85d7b42474ebe0ba91f6fd953232510164989ce5ef1511790de486d8960301"},"package":"3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45"} \ No newline at end of file +{"files":{"Cargo.toml":"12fd624e0a205bf395226b5ce7339f7d7060cd8be40c7603e517e0f0ff1ded84","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"c9a75f18b9ab2927829a208fc6aa2cf4e63b8420887ba29cdb265d6619ae82d5","build.rs":"af84139c71d151adead0b4398c394a7dd16087bb2db44b14a0ed970ce868a6c6","src/lib.rs":"4d2f97a740d3bda0cf2ba0ccbaa44a294952a701fc5a8219a755b4187bab29d4","src/mutex.rs":"eb6b92e848c3736fa463bec45eb7a8f2738cad2d4b36b3931ca30b1e70ab46c9","src/remutex.rs":"cf4d2fe406cd663155f39e6b85cb41e9e5c497f4e39c868a0d00675be5dc1115","src/rwlock.rs":"ce0ff32edc011ddfac22598acb12f6615ffa6d4609ed8d1b33e59caeb403c554"},"package":"c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/lock_api/Cargo.toml temporalio-1.3.0/vendor/lock_api/Cargo.toml --- temporalio-1.3.0/vendor/lock_api/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/lock_api/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -11,9 +11,8 @@ [package] edition = "2018" -rust-version = "1.49.0" name = "lock_api" -version = "0.4.11" +version = "0.4.10" authors = ["Amanieu d'Antras "] description = "Wrappers to create fully-featured Mutex and RwLock types. Compatible with no_std." keywords = [ @@ -34,7 +33,6 @@ rustdoc-args = [ "--cfg", "docsrs", - "--generate-link-to-definition", ] [dependencies.owning_ref] diff -Nru temporalio-1.3.0/vendor/lock_api/src/mutex.rs temporalio-1.3.0/vendor/lock_api/src/mutex.rs --- temporalio-1.3.0/vendor/lock_api/src/mutex.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/lock_api/src/mutex.rs 2023-10-30 19:40:00.000000000 +0000 @@ -189,16 +189,11 @@ } impl Mutex { - /// Creates a new `MutexGuard` without checking if the mutex is locked. - /// /// # Safety /// - /// This method must only be called if the thread logically holds the lock. - /// - /// Calling this function when a guard has already been produced is undefined behaviour unless - /// the guard was forgotten with `mem::forget`. + /// The lock must be held when calling this method. #[inline] - pub unsafe fn make_guard_unchecked(&self) -> MutexGuard<'_, R, T> { + unsafe fn guard(&self) -> MutexGuard<'_, R, T> { MutexGuard { mutex: self, marker: PhantomData, @@ -218,7 +213,7 @@ pub fn lock(&self) -> MutexGuard<'_, R, T> { self.raw.lock(); // SAFETY: The lock is held, as required. - unsafe { self.make_guard_unchecked() } + unsafe { self.guard() } } /// Attempts to acquire this lock. @@ -232,7 +227,7 @@ pub fn try_lock(&self) -> Option> { if self.raw.try_lock() { // SAFETY: The lock is held, as required. - Some(unsafe { self.make_guard_unchecked() }) + Some(unsafe { self.guard() }) } else { None } @@ -299,17 +294,12 @@ self.data.get() } - /// Creates a new `ArcMutexGuard` without checking if the mutex is locked. - /// /// # Safety /// - /// This method must only be called if the thread logically holds the lock. - /// - /// Calling this function when a guard has already been produced is undefined behaviour unless - /// the guard was forgotten with `mem::forget`. + /// The lock needs to be held for the behavior of this function to be defined. #[cfg(feature = "arc_lock")] #[inline] - unsafe fn make_arc_guard_unchecked(self: &Arc) -> ArcMutexGuard { + unsafe fn guard_arc(self: &Arc) -> ArcMutexGuard { ArcMutexGuard { mutex: self.clone(), marker: PhantomData, @@ -325,7 +315,7 @@ pub fn lock_arc(self: &Arc) -> ArcMutexGuard { self.raw.lock(); // SAFETY: the locking guarantee is upheld - unsafe { self.make_arc_guard_unchecked() } + unsafe { self.guard_arc() } } /// Attempts to acquire a lock through an `Arc`. @@ -337,7 +327,7 @@ pub fn try_lock_arc(self: &Arc) -> Option> { if self.raw.try_lock() { // SAFETY: locking guarantee is upheld - Some(unsafe { self.make_arc_guard_unchecked() }) + Some(unsafe { self.guard_arc() }) } else { None } @@ -372,7 +362,7 @@ pub fn try_lock_for(&self, timeout: R::Duration) -> Option> { if self.raw.try_lock_for(timeout) { // SAFETY: The lock is held, as required. - Some(unsafe { self.make_guard_unchecked() }) + Some(unsafe { self.guard() }) } else { None } @@ -387,7 +377,7 @@ pub fn try_lock_until(&self, timeout: R::Instant) -> Option> { if self.raw.try_lock_until(timeout) { // SAFETY: The lock is held, as required. - Some(unsafe { self.make_guard_unchecked() }) + Some(unsafe { self.guard() }) } else { None } @@ -402,7 +392,7 @@ pub fn try_lock_arc_for(self: &Arc, timeout: R::Duration) -> Option> { if self.raw.try_lock_for(timeout) { // SAFETY: locking guarantee is upheld - Some(unsafe { self.make_arc_guard_unchecked() }) + Some(unsafe { self.guard_arc() }) } else { None } @@ -420,7 +410,7 @@ ) -> Option> { if self.raw.try_lock_until(timeout) { // SAFETY: locking guarantee is upheld - Some(unsafe { self.make_arc_guard_unchecked() }) + Some(unsafe { self.guard_arc() }) } else { None } diff -Nru temporalio-1.3.0/vendor/lock_api/src/remutex.rs temporalio-1.3.0/vendor/lock_api/src/remutex.rs --- temporalio-1.3.0/vendor/lock_api/src/remutex.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/lock_api/src/remutex.rs 2023-10-30 19:40:00.000000000 +0000 @@ -183,10 +183,8 @@ if self.lock_count.get() == 1 { let id = self.owner.load(Ordering::Relaxed); self.owner.store(0, Ordering::Relaxed); - self.lock_count.set(0); self.mutex.bump(); self.owner.store(id, Ordering::Relaxed); - self.lock_count.set(1); } } } @@ -289,16 +287,11 @@ } impl ReentrantMutex { - /// Creates a new `ReentrantMutexGuard` without checking if the lock is held. - /// /// # Safety /// - /// This method must only be called if the thread logically holds the lock. - /// - /// Calling this function when a guard has already been produced is undefined behaviour unless - /// the guard was forgotten with `mem::forget`. + /// The lock must be held when calling this method. #[inline] - pub unsafe fn make_guard_unchecked(&self) -> ReentrantMutexGuard<'_, R, G, T> { + unsafe fn guard(&self) -> ReentrantMutexGuard<'_, R, G, T> { ReentrantMutexGuard { remutex: &self, marker: PhantomData, @@ -319,7 +312,7 @@ pub fn lock(&self) -> ReentrantMutexGuard<'_, R, G, T> { self.raw.lock(); // SAFETY: The lock is held, as required. - unsafe { self.make_guard_unchecked() } + unsafe { self.guard() } } /// Attempts to acquire this lock. @@ -333,7 +326,7 @@ pub fn try_lock(&self) -> Option> { if self.raw.try_lock() { // SAFETY: The lock is held, as required. - Some(unsafe { self.make_guard_unchecked() }) + Some(unsafe { self.guard() }) } else { None } @@ -407,17 +400,12 @@ self.data.get() } - /// Creates a new `ArcReentrantMutexGuard` without checking if the lock is held. - /// /// # Safety /// - /// This method must only be called if the thread logically holds the lock. - /// - /// Calling this function when a guard has already been produced is undefined behaviour unless - /// the guard was forgotten with `mem::forget`. + /// The lock must be held before calling this method. #[cfg(feature = "arc_lock")] #[inline] - pub unsafe fn make_arc_guard_unchecked(self: &Arc) -> ArcReentrantMutexGuard { + unsafe fn guard_arc(self: &Arc) -> ArcReentrantMutexGuard { ArcReentrantMutexGuard { remutex: self.clone(), marker: PhantomData, @@ -433,7 +421,7 @@ pub fn lock_arc(self: &Arc) -> ArcReentrantMutexGuard { self.raw.lock(); // SAFETY: locking guarantee is upheld - unsafe { self.make_arc_guard_unchecked() } + unsafe { self.guard_arc() } } /// Attempts to acquire a reentrant mutex through an `Arc`. @@ -445,7 +433,7 @@ pub fn try_lock_arc(self: &Arc) -> Option> { if self.raw.try_lock() { // SAFETY: locking guarantee is upheld - Some(unsafe { self.make_arc_guard_unchecked() }) + Some(unsafe { self.guard_arc() }) } else { None } @@ -480,7 +468,7 @@ pub fn try_lock_for(&self, timeout: R::Duration) -> Option> { if self.raw.try_lock_for(timeout) { // SAFETY: The lock is held, as required. - Some(unsafe { self.make_guard_unchecked() }) + Some(unsafe { self.guard() }) } else { None } @@ -495,7 +483,7 @@ pub fn try_lock_until(&self, timeout: R::Instant) -> Option> { if self.raw.try_lock_until(timeout) { // SAFETY: The lock is held, as required. - Some(unsafe { self.make_guard_unchecked() }) + Some(unsafe { self.guard() }) } else { None } @@ -513,7 +501,7 @@ ) -> Option> { if self.raw.try_lock_for(timeout) { // SAFETY: locking guarantee is upheld - Some(unsafe { self.make_arc_guard_unchecked() }) + Some(unsafe { self.guard_arc() }) } else { None } @@ -531,7 +519,7 @@ ) -> Option> { if self.raw.try_lock_until(timeout) { // SAFETY: locking guarantee is upheld - Some(unsafe { self.make_arc_guard_unchecked() }) + Some(unsafe { self.guard_arc() }) } else { None } diff -Nru temporalio-1.3.0/vendor/lock_api/src/rwlock.rs temporalio-1.3.0/vendor/lock_api/src/rwlock.rs --- temporalio-1.3.0/vendor/lock_api/src/rwlock.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/lock_api/src/rwlock.rs 2023-10-30 19:40:00.000000000 +0000 @@ -409,33 +409,22 @@ } impl RwLock { - /// Creates a new `RwLockReadGuard` without checking if the lock is held. - /// /// # Safety /// - /// This method must only be called if the thread logically holds a read lock. - /// - /// This function does not increment the read count of the lock. Calling this function when a - /// guard has already been produced is undefined behaviour unless the guard was forgotten - /// with `mem::forget`.` + /// The lock must be held when calling this method. #[inline] - pub unsafe fn make_read_guard_unchecked(&self) -> RwLockReadGuard<'_, R, T> { + unsafe fn read_guard(&self) -> RwLockReadGuard<'_, R, T> { RwLockReadGuard { rwlock: self, marker: PhantomData, } } - /// Creates a new `RwLockReadGuard` without checking if the lock is held. - /// /// # Safety /// - /// This method must only be called if the thread logically holds a write lock. - /// - /// Calling this function when a guard has already been produced is undefined behaviour unless - /// the guard was forgotten with `mem::forget`. + /// The lock must be held when calling this method. #[inline] - pub unsafe fn make_write_guard_unchecked(&self) -> RwLockWriteGuard<'_, R, T> { + unsafe fn write_guard(&self) -> RwLockWriteGuard<'_, R, T> { RwLockWriteGuard { rwlock: self, marker: PhantomData, @@ -458,7 +447,7 @@ pub fn read(&self) -> RwLockReadGuard<'_, R, T> { self.raw.lock_shared(); // SAFETY: The lock is held, as required. - unsafe { self.make_read_guard_unchecked() } + unsafe { self.read_guard() } } /// Attempts to acquire this `RwLock` with shared read access. @@ -472,7 +461,7 @@ pub fn try_read(&self) -> Option> { if self.raw.try_lock_shared() { // SAFETY: The lock is held, as required. - Some(unsafe { self.make_read_guard_unchecked() }) + Some(unsafe { self.read_guard() }) } else { None } @@ -490,7 +479,7 @@ pub fn write(&self) -> RwLockWriteGuard<'_, R, T> { self.raw.lock_exclusive(); // SAFETY: The lock is held, as required. - unsafe { self.make_write_guard_unchecked() } + unsafe { self.write_guard() } } /// Attempts to lock this `RwLock` with exclusive write access. @@ -504,7 +493,7 @@ pub fn try_write(&self) -> Option> { if self.raw.try_lock_exclusive() { // SAFETY: The lock is held, as required. - Some(unsafe { self.make_write_guard_unchecked() }) + Some(unsafe { self.write_guard() }) } else { None } @@ -594,35 +583,24 @@ self.data.get() } - /// Creates a new `RwLockReadGuard` without checking if the lock is held. - /// /// # Safety /// - /// This method must only be called if the thread logically holds a read lock. - /// - /// This function does not increment the read count of the lock. Calling this function when a - /// guard has already been produced is undefined behaviour unless the guard was forgotten - /// with `mem::forget`.` + /// The lock must be held when calling this method. #[cfg(feature = "arc_lock")] #[inline] - pub unsafe fn make_arc_read_guard_unchecked(self: &Arc) -> ArcRwLockReadGuard { + unsafe fn read_guard_arc(self: &Arc) -> ArcRwLockReadGuard { ArcRwLockReadGuard { rwlock: self.clone(), marker: PhantomData, } } - /// Creates a new `RwLockWriteGuard` without checking if the lock is held. - /// /// # Safety /// - /// This method must only be called if the thread logically holds a write lock. - /// - /// Calling this function when a guard has already been produced is undefined behaviour unless - /// the guard was forgotten with `mem::forget`. + /// The lock must be held when calling this method. #[cfg(feature = "arc_lock")] #[inline] - pub unsafe fn make_arc_write_guard_unchecked(self: &Arc) -> ArcRwLockWriteGuard { + unsafe fn write_guard_arc(self: &Arc) -> ArcRwLockWriteGuard { ArcRwLockWriteGuard { rwlock: self.clone(), marker: PhantomData, @@ -638,7 +616,7 @@ pub fn read_arc(self: &Arc) -> ArcRwLockReadGuard { self.raw.lock_shared(); // SAFETY: locking guarantee is upheld - unsafe { self.make_arc_read_guard_unchecked() } + unsafe { self.read_guard_arc() } } /// Attempts to lock this `RwLock` with read access, through an `Arc`. @@ -650,7 +628,7 @@ pub fn try_read_arc(self: &Arc) -> Option> { if self.raw.try_lock_shared() { // SAFETY: locking guarantee is upheld - Some(unsafe { self.make_arc_read_guard_unchecked() }) + Some(unsafe { self.read_guard_arc() }) } else { None } @@ -665,7 +643,7 @@ pub fn write_arc(self: &Arc) -> ArcRwLockWriteGuard { self.raw.lock_exclusive(); // SAFETY: locking guarantee is upheld - unsafe { self.make_arc_write_guard_unchecked() } + unsafe { self.write_guard_arc() } } /// Attempts to lock this `RwLock` with writ access, through an `Arc`. @@ -677,7 +655,7 @@ pub fn try_write_arc(self: &Arc) -> Option> { if self.raw.try_lock_exclusive() { // SAFETY: locking guarantee is upheld - Some(unsafe { self.make_arc_write_guard_unchecked() }) + Some(unsafe { self.write_guard_arc() }) } else { None } @@ -729,7 +707,7 @@ pub fn try_read_for(&self, timeout: R::Duration) -> Option> { if self.raw.try_lock_shared_for(timeout) { // SAFETY: The lock is held, as required. - Some(unsafe { self.make_read_guard_unchecked() }) + Some(unsafe { self.read_guard() }) } else { None } @@ -745,7 +723,7 @@ pub fn try_read_until(&self, timeout: R::Instant) -> Option> { if self.raw.try_lock_shared_until(timeout) { // SAFETY: The lock is held, as required. - Some(unsafe { self.make_read_guard_unchecked() }) + Some(unsafe { self.read_guard() }) } else { None } @@ -761,7 +739,7 @@ pub fn try_write_for(&self, timeout: R::Duration) -> Option> { if self.raw.try_lock_exclusive_for(timeout) { // SAFETY: The lock is held, as required. - Some(unsafe { self.make_write_guard_unchecked() }) + Some(unsafe { self.write_guard() }) } else { None } @@ -777,7 +755,7 @@ pub fn try_write_until(&self, timeout: R::Instant) -> Option> { if self.raw.try_lock_exclusive_until(timeout) { // SAFETY: The lock is held, as required. - Some(unsafe { self.make_write_guard_unchecked() }) + Some(unsafe { self.write_guard() }) } else { None } @@ -795,7 +773,7 @@ ) -> Option> { if self.raw.try_lock_shared_for(timeout) { // SAFETY: locking guarantee is upheld - Some(unsafe { self.make_arc_read_guard_unchecked() }) + Some(unsafe { self.read_guard_arc() }) } else { None } @@ -813,7 +791,7 @@ ) -> Option> { if self.raw.try_lock_shared_until(timeout) { // SAFETY: locking guarantee is upheld - Some(unsafe { self.make_arc_read_guard_unchecked() }) + Some(unsafe { self.read_guard_arc() }) } else { None } @@ -831,7 +809,7 @@ ) -> Option> { if self.raw.try_lock_exclusive_for(timeout) { // SAFETY: locking guarantee is upheld - Some(unsafe { self.make_arc_write_guard_unchecked() }) + Some(unsafe { self.write_guard_arc() }) } else { None } @@ -849,7 +827,7 @@ ) -> Option> { if self.raw.try_lock_exclusive_until(timeout) { // SAFETY: locking guarantee is upheld - Some(unsafe { self.make_arc_write_guard_unchecked() }) + Some(unsafe { self.write_guard_arc() }) } else { None } @@ -876,7 +854,7 @@ pub fn read_recursive(&self) -> RwLockReadGuard<'_, R, T> { self.raw.lock_shared_recursive(); // SAFETY: The lock is held, as required. - unsafe { self.make_read_guard_unchecked() } + unsafe { self.read_guard() } } /// Attempts to acquire this `RwLock` with shared read access. @@ -893,7 +871,7 @@ pub fn try_read_recursive(&self) -> Option> { if self.raw.try_lock_shared_recursive() { // SAFETY: The lock is held, as required. - Some(unsafe { self.make_read_guard_unchecked() }) + Some(unsafe { self.read_guard() }) } else { None } @@ -908,7 +886,7 @@ pub fn read_arc_recursive(self: &Arc) -> ArcRwLockReadGuard { self.raw.lock_shared_recursive(); // SAFETY: locking guarantee is upheld - unsafe { self.make_arc_read_guard_unchecked() } + unsafe { self.read_guard_arc() } } /// Attempts to lock this `RwLock` with shared read access, through an `Arc`. @@ -920,7 +898,7 @@ pub fn try_read_recursive_arc(self: &Arc) -> Option> { if self.raw.try_lock_shared_recursive() { // SAFETY: locking guarantee is upheld - Some(unsafe { self.make_arc_read_guard_unchecked() }) + Some(unsafe { self.read_guard_arc() }) } else { None } @@ -945,7 +923,7 @@ ) -> Option> { if self.raw.try_lock_shared_recursive_for(timeout) { // SAFETY: The lock is held, as required. - Some(unsafe { self.make_read_guard_unchecked() }) + Some(unsafe { self.read_guard() }) } else { None } @@ -964,7 +942,7 @@ ) -> Option> { if self.raw.try_lock_shared_recursive_until(timeout) { // SAFETY: The lock is held, as required. - Some(unsafe { self.make_read_guard_unchecked() }) + Some(unsafe { self.read_guard() }) } else { None } @@ -982,7 +960,7 @@ ) -> Option> { if self.raw.try_lock_shared_recursive_for(timeout) { // SAFETY: locking guarantee is upheld - Some(unsafe { self.make_arc_read_guard_unchecked() }) + Some(unsafe { self.read_guard_arc() }) } else { None } @@ -1000,7 +978,7 @@ ) -> Option> { if self.raw.try_lock_shared_recursive_until(timeout) { // SAFETY: locking guarantee is upheld - Some(unsafe { self.make_arc_read_guard_unchecked() }) + Some(unsafe { self.read_guard_arc() }) } else { None } @@ -1008,17 +986,11 @@ } impl RwLock { - /// Creates a new `RwLockUpgradableReadGuard` without checking if the lock is held. - /// /// # Safety /// - /// This method must only be called if the thread logically holds an upgradable read lock. - /// - /// This function does not increment the read count of the lock. Calling this function when a - /// guard has already been produced is undefined behaviour unless the guard was forgotten - /// with `mem::forget`.` + /// The lock must be held when calling this method. #[inline] - pub unsafe fn make_upgradable_guard_unchecked(&self) -> RwLockUpgradableReadGuard<'_, R, T> { + unsafe fn upgradable_guard(&self) -> RwLockUpgradableReadGuard<'_, R, T> { RwLockUpgradableReadGuard { rwlock: self, marker: PhantomData, @@ -1038,7 +1010,7 @@ pub fn upgradable_read(&self) -> RwLockUpgradableReadGuard<'_, R, T> { self.raw.lock_upgradable(); // SAFETY: The lock is held, as required. - unsafe { self.make_upgradable_guard_unchecked() } + unsafe { self.upgradable_guard() } } /// Attempts to acquire this `RwLock` with upgradable read access. @@ -1052,26 +1024,18 @@ pub fn try_upgradable_read(&self) -> Option> { if self.raw.try_lock_upgradable() { // SAFETY: The lock is held, as required. - Some(unsafe { self.make_upgradable_guard_unchecked() }) + Some(unsafe { self.upgradable_guard() }) } else { None } } - /// Creates a new `ArcRwLockUpgradableReadGuard` without checking if the lock is held. - /// /// # Safety /// - /// This method must only be called if the thread logically holds an upgradable read lock. - /// - /// This function does not increment the read count of the lock. Calling this function when a - /// guard has already been produced is undefined behaviour unless the guard was forgotten - /// with `mem::forget`.` + /// The lock must be held when calling this method. #[cfg(feature = "arc_lock")] #[inline] - pub unsafe fn make_upgradable_arc_guard_unchecked( - self: &Arc, - ) -> ArcRwLockUpgradableReadGuard { + unsafe fn upgradable_guard_arc(self: &Arc) -> ArcRwLockUpgradableReadGuard { ArcRwLockUpgradableReadGuard { rwlock: self.clone(), marker: PhantomData, @@ -1087,7 +1051,7 @@ pub fn upgradable_read_arc(self: &Arc) -> ArcRwLockUpgradableReadGuard { self.raw.lock_upgradable(); // SAFETY: locking guarantee is upheld - unsafe { self.make_upgradable_arc_guard_unchecked() } + unsafe { self.upgradable_guard_arc() } } /// Attempts to lock this `RwLock` with upgradable read access, through an `Arc`. @@ -1099,7 +1063,7 @@ pub fn try_upgradable_read_arc(self: &Arc) -> Option> { if self.raw.try_lock_upgradable() { // SAFETY: locking guarantee is upheld - Some(unsafe { self.make_upgradable_arc_guard_unchecked() }) + Some(unsafe { self.upgradable_guard_arc() }) } else { None } @@ -1120,7 +1084,7 @@ ) -> Option> { if self.raw.try_lock_upgradable_for(timeout) { // SAFETY: The lock is held, as required. - Some(unsafe { self.make_upgradable_guard_unchecked() }) + Some(unsafe { self.upgradable_guard() }) } else { None } @@ -1139,7 +1103,7 @@ ) -> Option> { if self.raw.try_lock_upgradable_until(timeout) { // SAFETY: The lock is held, as required. - Some(unsafe { self.make_upgradable_guard_unchecked() }) + Some(unsafe { self.upgradable_guard() }) } else { None } @@ -1157,7 +1121,7 @@ ) -> Option> { if self.raw.try_lock_upgradable_for(timeout) { // SAFETY: locking guarantee is upheld - Some(unsafe { self.make_upgradable_arc_guard_unchecked() }) + Some(unsafe { self.upgradable_guard_arc() }) } else { None } @@ -1175,7 +1139,7 @@ ) -> Option> { if self.raw.try_lock_upgradable_until(timeout) { // SAFETY: locking guarantee is upheld - Some(unsafe { self.make_upgradable_arc_guard_unchecked() }) + Some(unsafe { self.upgradable_guard_arc() }) } else { None } @@ -2061,7 +2025,7 @@ // Safety: We just upgraded the lock, so we have mutable access to the data. // This will restore the state the lock was in at the start of the function. - defer!(unsafe { self.rwlock.raw.downgrade_to_upgradable() }); + defer!(unsafe { self.rwlock.raw.downgrade_upgradable() }); // Safety: We upgraded the lock, so we have mutable access to the data. // When this function returns, whether by drop or panic, @@ -2083,7 +2047,7 @@ if unsafe { self.rwlock.raw.try_upgrade() } { // Safety: We just upgraded the lock, so we have mutable access to the data. // This will restore the state the lock was in at the start of the function. - defer!(unsafe { self.rwlock.raw.downgrade_to_upgradable() }); + defer!(unsafe { self.rwlock.raw.downgrade_upgradable() }); // Safety: We upgraded the lock, so we have mutable access to the data. // When this function returns, whether by drop or panic, diff -Nru temporalio-1.3.0/vendor/lru/.cargo-checksum.json temporalio-1.3.0/vendor/lru/.cargo-checksum.json --- temporalio-1.3.0/vendor/lru/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/lru/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"CHANGELOG.md":"17396fd79a84d7e3bd9c8308ddfdd6955694f0f51c277620ae860ce4be241bf5","Cargo.toml":"14d8b06ac4a1e786b3122462181d1bdbd001fa4895786879319307aaf8b500e4","LICENSE":"061dc50af2cd9340703daf61978af3200cf681b12ea67a323c33ba109a23a45e","README.md":"a869369c74321a06164538f0a3c1e1126ac331ed885d21d58f822c3f95482803","src/lib.rs":"cb5a9509e17b0f39a217037c5dd0e07f12898752ae05bfea36f2418b427ce893"},"package":"718e8fae447df0c7e1ba7f5189829e63fd536945c8988d61444c19039f16b670"} \ No newline at end of file +{"files":{"CHANGELOG.md":"2da0dcb306696b930bd1840d968e7f3394ff0a02bbf8cc9ab75171b82bbc72db","Cargo.toml":"63f483082b2b587d486ae64c39ea241f758e0d5ee7f0cdbf912685b5aae3ced8","LICENSE":"061dc50af2cd9340703daf61978af3200cf681b12ea67a323c33ba109a23a45e","README.md":"a9e0ca7a8ad3950a51cfa07f2c57e90856e4a86ce7812962a02d3bc93dfc40f3","src/lib.rs":"cb5a9509e17b0f39a217037c5dd0e07f12898752ae05bfea36f2418b427ce893"},"package":"eedb2bdbad7e0634f83989bf596f497b070130daaa398ab22d84c39e266deec5"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/lru/Cargo.toml temporalio-1.3.0/vendor/lru/Cargo.toml --- temporalio-1.3.0/vendor/lru/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/lru/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -11,7 +11,7 @@ [package] name = "lru" -version = "0.10.1" +version = "0.11.0" authors = ["Jerome Froelich "] description = "A LRU cache implementation" homepage = "https://github.com/jeromefroe/lru-rs" @@ -29,7 +29,7 @@ repository = "https://github.com/jeromefroe/lru-rs.git" [dependencies.hashbrown] -version = "0.13" +version = "0.14" optional = true [dev-dependencies.scoped_threadpool] diff -Nru temporalio-1.3.0/vendor/lru/CHANGELOG.md temporalio-1.3.0/vendor/lru/CHANGELOG.md --- temporalio-1.3.0/vendor/lru/CHANGELOG.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/lru/CHANGELOG.md 2023-10-30 19:40:00.000000000 +0000 @@ -1,6 +1,10 @@ # Changelog -## [v0.10.1](https://github.com/jeromefroe/lru-rs/tree/0.10.1) - 2023-07-29 +## [v0.11.0](https://github.com/jeromefroe/lru-rs/tree/0.11.0) - 2023-07-11 + +- Update dependency on hashbrown to 0.14 and update MSRV to 1.64.0. + +## [v0.10.1](https://github.com/jeromefroe/lru-rs/tree/0.10.1) - 2023-06-29 - Add `try_get_or_insert` method. diff -Nru temporalio-1.3.0/vendor/lru/README.md temporalio-1.3.0/vendor/lru/README.md --- temporalio-1.3.0/vendor/lru/README.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/lru/README.md 2023-10-30 19:40:00.000000000 +0000 @@ -12,7 +12,7 @@ all of which are O(1). This crate was heavily influenced by the [LRU Cache implementation in an earlier version of Rust's std::collections crate]. -The MSRV for this crate is 1.61.0. +The MSRV for this crate is 1.64.0. ## Example diff -Nru temporalio-1.3.0/vendor/mach/.cargo-checksum.json temporalio-1.3.0/vendor/mach/.cargo-checksum.json --- temporalio-1.3.0/vendor/mach/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach/.cargo-checksum.json 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -{"files":{"Cargo.toml":"6cf25dae1f0fd842fb63275ae47904879e66b36290f6fc7ed02090f3ac657b51","LICENSE.md":"399507a62fba271ddb3e24dc857e85b571fbb76435546f51b212cf04d8463f58","README.md":"8e5094a355def0f762dcc92fd68f475bb65016dd0fbeadc0d8a50303d6fb5381","ci/build_fail.sh":"6c2401edd356a43739ef6c27deccfc7703f883ff8d21f49395d8edb806542728","ci/deploy_and_run_on_ios_simulator.rs":"acde74c117544575b2e7ef7531759ec0a6e28bd65d69da16944c746f711ec27d","ci/run.sh":"2eef6140f5f53373f961c682d2b292f8d4b57b2124f1f0e53d5168db27f38d52","examples/dump_process_registers.rs":"e9d0d023cb2cc8272f239cd134152dfa0169017c2a454db1490d2f4548efe6c8","src/boolean.rs":"1d24ea9872748881cd7269a383a7c344e3a650df23f0e44e3b6c266fb8205d9a","src/bootstrap.rs":"a5ab69d74ad8bfb8fad1cb45c8c571977c0bf907a70e767309a437580cee184c","src/clock.rs":"a33c1bfb2f174abb695d164c469ee744be52fec4bc345656e6027d063e150d71","src/clock_priv.rs":"a8e6a96896a94eda67c9fb6e45c564581a711cc9fdcf7674251bb6c0c28b47c2","src/clock_reply.rs":"bac04b6602dcdd4daac8e3a0a1e56fa4b6de20cf2c3fe7bb583358166aca8a3b","src/clock_types.rs":"d55d1d2a953e477f9dd064bd684b118235aa7bd79de85cdeaf75e21510aaaefa","src/dyld_kernel.rs":"566a17f597aa29619a1ce15f6b22577fc70ac5356f96e00fddbcb28560a5c83c","src/exc.rs":"2246493bef2c596b92f115ab673a10d50c6003d11abb8e73d7707ebc19e8ae5a","src/exception_types.rs":"c7894831d73145adb1a4b5d2a5d0b346f2b2dc05382b97f2f3f0275d337f6dfc","src/kern_return.rs":"153339995674136ef05d9595bdcf831595db0d0714a737ecd1ccd45391c56657","src/lib.rs":"7570054fdec1fb73200cb1cf736c97bdeeb82f2aef78aec11e8498af769bba86","src/mach_init.rs":"df49bd287fd05fb74bc76254df7607fad0d6b90cb20da803e9f9a1dc2fcfe2fc","src/mach_port.rs":"07e300871eac4687ccc98d725e550482f136f9780f9f353a0f01f768bc58229b","src/mach_time.rs":"b9493e820acf21fee1f6e7e82a510d887925dc1117d6b71b681acc40cfa776af","src/mach_types.rs":"e2d17741ebcdcdff9686ec9ee5c90fb7a150ce990979507da01c351771fb3a19","src/memory_object_types.rs":"6fcb446c00ddd5ef4920efe618bd89df2e87f7ae3cf660a2bc1d25cf1f331dc2","src/message.rs":"501e743438342ea37cf7db81d6ebd17528da9d78e77d1f1643412e7dc569649f","src/port.rs":"36fc636e2cae2c1f69246b54eb3ca2b33d7e75846df50587fb14597d34b05594","src/structs.rs":"132e21e91313e6ec13e3ad5ed9c71852e8a55fbbaba449dbb1b3ca889bed4889","src/task.rs":"282ea602db2d08711785e0050a06b322a3fe4a4aac34b3c9116fe13e033898dd","src/task_info.rs":"cf87cffe567fee8871e0ce9762b7d8bbd5058dfbb309678d382149dedbe7f14a","src/thread_act.rs":"647198e0f9e3fe409a0610ee98560de3af4f152bcc4761f943e67723193b8a25","src/thread_status.rs":"3fe98fadd61ce01b4f9dc3bc0ef8c9496798f0147822a4ddffe5d0eaf2f32c0a","src/traps.rs":"a15d0dc206c53cf69cb9d11c6ed5477b7dd9937ea68b5a453011be9d004c44a9","src/vm.rs":"9edecf858dcd8e22efbc6ad1838cbfa6a0fc5b334bd21d87b3f05d24058b549e","src/vm_attributes.rs":"55fd9c1661a147a4e374051a6da1884f0c9629aabc514e01561f0e0c365aa18a","src/vm_behavior.rs":"a5d195a52602f5ebe2991774c2390a6f20f1bfa82168dd62e88f2804134da1f3","src/vm_inherit.rs":"dbc7432350869733d6e7cf1da8617d97aafbeb1afcb1bdc60ed7ab53e37abf61","src/vm_page_size.rs":"9e5333f750cd7380465cd34b4611c1f7b5251c11befca0d4482a323e0b1c20b2","src/vm_prot.rs":"15f8f82fbdd67ed31185abd5cc3418332f4371d39ecef6a7e47ddf17bdb5146c","src/vm_purgable.rs":"a39a9fcd85f0394cd169c888e2d7e461d56bf97cf9f81a384df06262e40c9f24","src/vm_region.rs":"d95de52828f28987fa95eb54327b2d278f31769091befb653d286b21d51efc73","src/vm_statistics.rs":"49b452bf56080200d6bf3c32ae8b6642b142fbb13560849ef6a2dc96b650ab4a","src/vm_sync.rs":"4897306cf6c57929830766253637c9adc475e472949a351efc8ada28c20e0d0f","src/vm_types.rs":"a47f71193172ce233018dfd40de2b9a56cdfcdfb18e04c1c0761cb6fc36f51b8"},"package":"b823e83b2affd8f40a9ee8c29dbc56404c1e34cd2710921f2801e2cf29527afa"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/mach/Cargo.toml temporalio-1.3.0/vendor/mach/Cargo.toml --- temporalio-1.3.0/vendor/mach/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach/Cargo.toml 1970-01-01 00:00:00.000000000 +0000 @@ -1,46 +0,0 @@ -# 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 believe there's an error in this file please file an -# issue against the rust-lang/cargo repository. If you're -# editing this file be aware that the upstream Cargo.toml -# will likely look very different (and much more reasonable) - -[package] -edition = "2015" -name = "mach" -version = "0.3.2" -authors = ["Nick Fitzgerald ", "David Cuddeback ", "Gonzalo Brito Gadeschi "] -description = "A Rust interface to the user-space API of the Mach 3.0 kernel that underlies OSX." -readme = "README.md" -keywords = ["kernel", "macos", "darwin"] -categories = ["api-bindings", "external-ffi-bindings", "no-std", "os"] -license = "BSD-2-Clause" -repository = "https://github.com/fitzgen/mach" - -[features] -default = [] -deprecated = [] -rustc-dep-of-std = ["rustc-std-workspace-core", "libc/rustc-dep-of-std"] -[target."cfg(any(target_os = \"macos\", target_os = \"ios\"))".dependencies.libc] -version = "0.2" -default-features = false - -[target."cfg(any(target_os = \"macos\", target_os = \"ios\"))".dependencies.rustc-std-workspace-core] -version = "1.0.0" -optional = true -[badges.is-it-maintained-issue-resolution] -repository = "fitzgen/mach" - -[badges.is-it-maintained-open-issues] -repository = "fitzgen/mach" - -[badges.maintenance] -status = "passively-maintained" - -[badges.travis-ci] -repository = "fitzgen/mach" diff -Nru temporalio-1.3.0/vendor/mach/ci/build_fail.sh temporalio-1.3.0/vendor/mach/ci/build_fail.sh --- temporalio-1.3.0/vendor/mach/ci/build_fail.sh 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach/ci/build_fail.sh 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ -#!/usr/bin/env bash - -set -ex - -: "${TARGET?The TARGET environment variable must be set.}" - -! cargo build --target "${TARGET}" diff -Nru temporalio-1.3.0/vendor/mach/ci/deploy_and_run_on_ios_simulator.rs temporalio-1.3.0/vendor/mach/ci/deploy_and_run_on_ios_simulator.rs --- temporalio-1.3.0/vendor/mach/ci/deploy_and_run_on_ios_simulator.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach/ci/deploy_and_run_on_ios_simulator.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,175 +0,0 @@ -// Copyright 2017 The Rust Project Developers. See the COPYRIGHT -// file at the top-level directory of this distribution and at -// http://rust-lang.org/COPYRIGHT. -// -// Licensed under the Apache License, Version 2.0 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -// This is a script to deploy and execute a binary on an iOS simulator. -// The primary use of this is to be able to run unit tests on the simulator and -// retrieve the results. -// -// To do this through Cargo instead, use Dinghy -// (https://github.com/snipsco/dinghy): cargo dinghy install, then cargo dinghy -// test. -// -// Source: this script is part of libc -// https://github.com/rust-lang/libc/blob/master/ci/ios/deploy_and_run_on_ios_simulator.rs -// and should be sync'ed with it when ci breaks (or periodically). - -use std::env; -use std::fs::{self, File}; -use std::io::Write; -use std::path::Path; -use std::process; -use std::process::Command; - -macro_rules! t { - ($e:expr) => (match $e { - Ok(e) => e, - Err(e) => panic!("{} failed with: {}", stringify!($e), e), - }) -} - -// Step one: Wrap as an app -fn package_as_simulator_app(crate_name: &str, test_binary_path: &Path) { - println!("Packaging simulator app"); - drop(fs::remove_dir_all("ios_simulator_app")); - t!(fs::create_dir("ios_simulator_app")); - t!(fs::copy(test_binary_path, - Path::new("ios_simulator_app").join(crate_name))); - - let mut f = t!(File::create("ios_simulator_app/Info.plist")); - t!(f.write_all(format!(r#" - - - - - CFBundleExecutable - {} - CFBundleIdentifier - com.rust.unittests - - - "#, crate_name).as_bytes())); -} - -// Step two: Start the iOS simulator -fn start_simulator() { - println!("Looking for iOS simulator"); - let output = t!(Command::new("xcrun").arg("simctl").arg("list").output()); - assert!(output.status.success()); - let mut simulator_exists = false; - let mut simulator_booted = false; - let mut found_rust_sim = false; - let stdout = t!(String::from_utf8(output.stdout)); - for line in stdout.lines() { - if line.contains("rust_ios") { - if found_rust_sim { - panic!("Duplicate rust_ios simulators found. Please \ - double-check xcrun simctl list."); - } - simulator_exists = true; - simulator_booted = line.contains("(Booted)"); - found_rust_sim = true; - } - } - - if simulator_exists == false { - println!("Creating iOS simulator"); - Command::new("xcrun") - .arg("simctl") - .arg("create") - .arg("rust_ios") - .arg("com.apple.CoreSimulator.SimDeviceType.iPhone-SE") - .arg("com.apple.CoreSimulator.SimRuntime.iOS-10-2") - .check_status(); - } else if simulator_booted == true { - println!("Shutting down already-booted simulator"); - Command::new("xcrun") - .arg("simctl") - .arg("shutdown") - .arg("rust_ios") - .check_status(); - } - - println!("Starting iOS simulator"); - // We can't uninstall the app (if present) as that will hang if the - // simulator isn't completely booted; just erase the simulator instead. - Command::new("xcrun").arg("simctl").arg("erase").arg("rust_ios").check_status(); - Command::new("xcrun").arg("simctl").arg("boot").arg("rust_ios").check_status(); -} - -// Step three: Install the app -fn install_app_to_simulator() { - println!("Installing app to simulator"); - Command::new("xcrun") - .arg("simctl") - .arg("install") - .arg("booted") - .arg("ios_simulator_app/") - .check_status(); -} - -// Step four: Run the app -fn run_app_on_simulator() { - println!("Running app"); - let output = t!(Command::new("xcrun") - .arg("simctl") - .arg("launch") - .arg("--console") - .arg("booted") - .arg("com.rust.unittests") - .output()); - - println!("stdout --\n{}\n", String::from_utf8_lossy(&output.stdout)); - println!("stderr --\n{}\n", String::from_utf8_lossy(&output.stderr)); - - let stdout = String::from_utf8_lossy(&output.stdout); - let passed = stdout.lines() - .find(|l| l.contains("PASSED")) - .map(|l| l.contains("tests")) - .unwrap_or(false); - - println!("Shutting down simulator"); - Command::new("xcrun") - .arg("simctl") - .arg("shutdown") - .arg("rust_ios") - .check_status(); - if !passed { - panic!("tests didn't pass"); - } -} - -trait CheckStatus { - fn check_status(&mut self); -} - -impl CheckStatus for Command { - fn check_status(&mut self) { - println!("\trunning: {:?}", self); - assert!(t!(self.status()).success()); - } -} - -fn main() { - let args: Vec = env::args().collect(); - if args.len() != 2 { - println!("Usage: {} ", args[0]); - process::exit(-1); - } - - let test_binary_path = Path::new(&args[1]); - let crate_name = test_binary_path.file_name().unwrap(); - - package_as_simulator_app(crate_name.to_str().unwrap(), test_binary_path); - start_simulator(); - install_app_to_simulator(); - run_app_on_simulator(); -} diff -Nru temporalio-1.3.0/vendor/mach/ci/run.sh temporalio-1.3.0/vendor/mach/ci/run.sh --- temporalio-1.3.0/vendor/mach/ci/run.sh 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach/ci/run.sh 1970-01-01 00:00:00.000000000 +0000 @@ -1,57 +0,0 @@ -#!/usr/bin/env sh - -set -ex - -: "${TARGET?The TARGET environment variable must be set.}" -: "${TRAVIS_RUST_VERSION?The TRAVIS_RUST_VERSION environment variable must be set.}" - -echo "Running tests for target: ${TARGET}" -export RUST_BACKTRACE=1 -export RUST_TEST_THREADS=1 -export RUST_TEST_NOCAPTURE=1 -export CARGO_INCREMENTAL=0 -export CARGO_CODEGEN_UNITS=1 -export RUSTFLAGS="-C codegen-units=1 " - -case "${TARGET}" in - *"ios"*) - export RUSTFLAGS="${RUSTFLAGS} -C link-args=-mios-simulator-version-min=7.0" - rustc ./ci/deploy_and_run_on_ios_simulator.rs -o ios_cargo_runner --verbose - if [ "${TARGET}" = "x86_64-apple-ios" ]; then - export CARGO_TARGET_X86_64_APPLE_IOS_RUNNER - CARGO_TARGET_X86_64_APPLE_IOS_RUNNER="$(pwd)/ios_cargo_runner" - fi - if [ "${TARGET}" = "i386-apple-ios" ]; then - export CARGO_TARGET_I386_APPLE_IOS_RUNNER - CARGO_TARGET_I386_APPLE_IOS_RUNNER="$(pwd)/ios_cargo_runner" - fi - ;; - *) - ;; -esac - -# Build w/o std -cargo clean -cargo build --no-default-features --target "${TARGET}" -vv 2>&1 | tee build_no_std.txt - -# Check that the no-std builds are not linked against a libc with default -# features or the std feature enabled: -! grep -q "default" build_no_std.txt -! grep -q "std" build_no_std.txt -# Make sure that the resulting build contains no std symbols -! find target/ -name "*.rlib" -exec nm {} \; | grep "std" - -# Runs mach's run-time tests: -if [ -z "$NORUN" ]; then - cargo test --target "${TARGET}" -vv - cargo test --target "${TARGET}" -vv --features deprecated - cargo test --no-default-features --target "${TARGET}" -vv -fi - -# Runs ctest to verify mach's ABI against the system libraries: -if [ -z "$NOCTEST" ]; then - if [ "${TRAVIS_RUST_VERSION}" = "nightly" ]; then - cargo test --manifest-path mach-test/Cargo.toml --target "${TARGET}" -vv - cargo test --no-default-features --manifest-path mach-test/Cargo.toml --target "${TARGET}" -vv - fi -fi diff -Nru temporalio-1.3.0/vendor/mach/examples/dump_process_registers.rs temporalio-1.3.0/vendor/mach/examples/dump_process_registers.rs --- temporalio-1.3.0/vendor/mach/examples/dump_process_registers.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach/examples/dump_process_registers.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,136 +0,0 @@ -//! A script to read and dump to stdout the current register values of a -//! process. - -extern crate libc; -extern crate mach; - -use std::io; -use std::mem; -use std::ptr; - -use mach::kern_return::KERN_SUCCESS; -use mach::mach_types::{task_t, thread_act_array_t}; -use mach::message::mach_msg_type_number_t; -use mach::port::mach_port_name_t; -use mach::structs::x86_thread_state64_t; -use mach::task::{task_resume, task_suspend, task_threads}; -use mach::thread_act::thread_get_state; -use mach::thread_status::x86_THREAD_STATE64; -use mach::traps::{mach_task_self, task_for_pid}; - -use std::io::prelude::*; - -fn read_int() -> Result<::libc::c_int, ()> { - let stdin = io::stdin(); - let mut line = String::new(); - - stdin.read_line(&mut line).ok().unwrap(); - let mut value: ::libc::c_int = 0; - - for c in line.chars().take_while(|&c| c != '\n') { - if let Some(d) = c.to_digit(10) { - value = value * 10 + (d as ::libc::c_int); - } else { - return Err(()); - } - } - return Ok(value); -} - -fn resume(task: task_t) { - unsafe { - let kret = task_resume(task); - if kret != KERN_SUCCESS { - println!("Did not succeed in resuming task."); - println!("kern_return_t error {}", kret); - panic!(); - } - } -} - -fn main() { - print!("Enter pid: "); - io::stdout().flush().ok(); - - let pid = match read_int() { - Ok(v) => v, - Err(_) => { - println!("Bad pid!"); - return; - } - }; - - println!("pid = {}", &pid); - - let task: mach_port_name_t = 0; - unsafe { - let kret = task_for_pid( - mach_task_self() as mach_port_name_t, - pid, - mem::transmute(&task), - ); - if kret != KERN_SUCCESS { - println!("Did not succeed in getting task for pid {}", pid); - println!("kern_return_t error {}", kret); - println!(""); - println!("Did you forget to run with 'sudo'? This script will"); - println!("probably fail without it."); - return; - } - } - - println!("task = 0x{:x}", &task); - - unsafe { - let kret = task_suspend(task as task_t); - if kret != KERN_SUCCESS { - println!("Did not succeed in suspending task."); - println!("kern_return_t error {}", kret); - return; - } - } - - let thread_list: thread_act_array_t = ptr::null_mut(); - let thread_count: mach_msg_type_number_t = 0; - unsafe { - let kret = task_threads( - task as task_t, - mem::transmute(&thread_list), - mem::transmute(&thread_count), - ); - if kret != KERN_SUCCESS { - println!("Did not succeed in getting task's threads"); - println!("kern_return_t error {}", kret); - resume(task as task_t); - return; - } - } - - println!("Task is running {} threads", &thread_count); - - unsafe { - let threads = - Vec::from_raw_parts(thread_list, thread_count as usize, thread_count as usize); - let state = x86_thread_state64_t::new(); - let state_count = x86_thread_state64_t::count(); - for (idx, &thread) in threads.iter().enumerate() { - println!("Thread {}:", idx); - let kret = thread_get_state( - thread, - x86_THREAD_STATE64, - mem::transmute(&state), - mem::transmute(&state_count), - ); - if kret != KERN_SUCCESS { - println!("Did not succeed in getting task's thread state"); - println!("kern_return_t error {}", kret); - continue; - } - - println!("{:?}", state); - } - } - - resume(task as task_t); - println!("Success!"); -} diff -Nru temporalio-1.3.0/vendor/mach/LICENSE.md temporalio-1.3.0/vendor/mach/LICENSE.md --- temporalio-1.3.0/vendor/mach/LICENSE.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach/LICENSE.md 1970-01-01 00:00:00.000000000 +0000 @@ -1,23 +0,0 @@ -Copyright (c) 2015, Nick Fitzgerald -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff -Nru temporalio-1.3.0/vendor/mach/README.md temporalio-1.3.0/vendor/mach/README.md --- temporalio-1.3.0/vendor/mach/README.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach/README.md 1970-01-01 00:00:00.000000000 +0000 @@ -1,55 +0,0 @@ -[![Build Status][travis_ci_badge]][travis_ci] [![Latest Version]][crates.io] [![docs]][docs.rs] - -A Rust interface to the **user-space** API of the Mach 3.0 kernel exposed in -`/usr/include/mach` that underlies macOS and is linked via `libSystem` (and -`libsystem_kernel`). - -This library does not expose the **kernel-space** API of the Mach 3.0 kernel -exposed in -`SDK/System/Library/Frameworks/Kernel.framework/Versions/A/Headers/mach`. - -That is, if you are writing a kernel-resident device drivers or some other -kernel extensions you have to use something else. The user-space kernel API is -often API-incompatible with the kernel space one, and even in the cases where -they match, they are sometimes ABI incompatible such that using this library -would have **undefined behavior**. - -# Usage - -Add the following to your `Cargo.toml` to conditionally include mach on those -platforms that support it. - -```toml -[target.'cfg(any(target_os = "macos", target_os = "ios"))'.dependencies.mach] -version = "0.3" -``` - -The following crate features are available: - -* **deprecated** (disabled by default): exposes deprecated APIs that have been - removed from the latest versions of the MacOS SDKs. The behavior of using - these APIs on MacOS versions that do not support them is undefined (hopefully - a linker error). - -# Platform support - -The following table describes the current CI set-up: - -| Target | Min. Rust | XCode | build | ctest | run | -|-----------------------|-----------|---------------|-------|-------|-----| -| `x86_64-apple-darwin` | 1.33.0 | 6.4 - 10.0 | ✓ | ✓ | ✓ | -| `i686-apple-darwin` | 1.33.0 | 6.4 - 10.0 | ✓ | ✓ | ✓ | -| `i386-apple-ios` | 1.33.0 | 6.4 - 9.4 [0] | ✓ | - | - | -| `x86_64-apple-ios` | 1.33.0 | 6.4 - 10.0 | ✓ | - | - | -| `armv7-apple-ios` | nightly | 6.4 - 10.0 | ✓ | - | - | -| `aarch64-apple-ios` | nightly | 6.4 - 10.0 | ✓ | - | - | - -[0] `i386-apple-ios` is deprecated in XCode 10.0. - -[travis_ci]: https://travis-ci.org/fitzgen/mach -[travis_ci_badge]: https://travis-ci.org/fitzgen/mach.png?branch=master -[crates.io]: https://crates.io/crates/mach -[Latest Version]: https://img.shields.io/crates/v/mach.svg -[docs]: https://docs.rs/mach/badge.svg -[docs.rs]: https://docs.rs/mach/ - diff -Nru temporalio-1.3.0/vendor/mach/src/boolean.rs temporalio-1.3.0/vendor/mach/src/boolean.rs --- temporalio-1.3.0/vendor/mach/src/boolean.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach/src/boolean.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ -//! This module corresponds to `mach/i386/boolean.h`. - -#[cfg(target_arch = "x86_64")] -pub type boolean_t = ::libc::c_uint; - -#[cfg(not(target_arch = "x86_64"))] -pub type boolean_t = ::libc::c_int; diff -Nru temporalio-1.3.0/vendor/mach/src/bootstrap.rs temporalio-1.3.0/vendor/mach/src/bootstrap.rs --- temporalio-1.3.0/vendor/mach/src/bootstrap.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach/src/bootstrap.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,76 +0,0 @@ -//! This module corresponds to `bootstrap.h` - -use boolean::boolean_t; -use kern_return::kern_return_t; -use port::mach_port_t; - -pub const BOOTSTRAP_MAX_NAME_LEN: ::libc::c_uint = 128; -pub const BOOTSTRAP_MAX_CMD_LEN: ::libc::c_uint = 512; - -pub const BOOTSTRAP_MAX_LOOKUP_COUNT: ::libc::c_uint = 20; - -pub const BOOTSTRAP_SUCCESS: ::libc::c_uint = 0; -pub const BOOTSTRAP_NOT_PRIVILEGED: ::libc::c_uint = 1100; -pub const BOOTSTRAP_NAME_IN_USE: ::libc::c_uint = 1101; -pub const BOOTSTRAP_UNKNOWN_SERVICE: ::libc::c_uint = 1102; -pub const BOOTSTRAP_SERVICE_ACTIVE: ::libc::c_uint = 1103; -pub const BOOTSTRAP_BAD_COUNT: ::libc::c_uint = 1104; -pub const BOOTSTRAP_NO_MEMORY: ::libc::c_uint = 1105; -pub const BOOTSTRAP_NO_CHILDREN: ::libc::c_uint = 1106; - -pub const BOOTSTRAP_STATUS_INACTIVE: ::libc::c_uint = 0; -pub const BOOTSTRAP_STATUS_ACTIVE: ::libc::c_uint = 1; -pub const BOOTSTRAP_STATUS_ON_DEMAND: ::libc::c_uint = 2; - -pub type name_t = [::libc::c_char; 128]; -pub type cmd_t = [::libc::c_char; 512]; -pub type name_array_t = *mut name_t; -pub type bootstrap_status_t = ::libc::c_int; -pub type bootstrap_status_array_t = *mut bootstrap_status_t; -pub type bootstrap_property_t = ::libc::c_uint; -pub type bootstrap_property_array_t = *mut bootstrap_property_t; -pub type bool_array_t = *mut boolean_t; - -extern "C" { - pub static bootstrap_port: mach_port_t; - pub fn bootstrap_create_server( - bp: mach_port_t, - server_cmd: *mut ::libc::c_char, - server_uid: ::libc::uid_t, - on_demand: boolean_t, - server_port: *mut mach_port_t, - ) -> kern_return_t; - pub fn bootstrap_subset( - bp: mach_port_t, - requestor_port: mach_port_t, - subset_port: *mut mach_port_t, - ) -> kern_return_t; - pub fn bootstrap_unprivileged(bp: mach_port_t, unpriv_port: *mut mach_port_t) -> kern_return_t; - pub fn bootstrap_parent(bp: mach_port_t, parent_port: *mut mach_port_t) -> kern_return_t; - pub fn bootstrap_register( - bp: mach_port_t, - service_name: *mut ::libc::c_char, - sp: mach_port_t, - ) -> kern_return_t; - pub fn bootstrap_create_service( - bp: mach_port_t, - service_name: *mut ::libc::c_char, - sp: *mut mach_port_t, - ) -> kern_return_t; - pub fn bootstrap_check_in( - bp: mach_port_t, - service_name: *const ::libc::c_char, - sp: *mut mach_port_t, - ) -> kern_return_t; - pub fn bootstrap_look_up( - bp: mach_port_t, - service_name: *const ::libc::c_char, - sp: *mut mach_port_t, - ) -> kern_return_t; - pub fn bootstrap_status( - bp: mach_port_t, - service_name: *mut ::libc::c_char, - service_active: *mut bootstrap_status_t, - ) -> kern_return_t; - pub fn bootstrap_strerror(r: kern_return_t) -> *const ::libc::c_char; -} diff -Nru temporalio-1.3.0/vendor/mach/src/clock_priv.rs temporalio-1.3.0/vendor/mach/src/clock_priv.rs --- temporalio-1.3.0/vendor/mach/src/clock_priv.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach/src/clock_priv.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,16 +0,0 @@ -//! This module roughly corresponds to `mach/clock_priv.h`. - -use clock_types::{clock_attr_t, clock_flavor_t, mach_timespec_t}; -use kern_return::kern_return_t; -use mach_types::clock_ctrl_t; -use message::mach_msg_type_number_t; - -extern "C" { - pub fn clock_set_time(clock_ctrl: clock_ctrl_t, new_time: mach_timespec_t) -> kern_return_t; - pub fn clock_set_attributes( - clock_ctrl: clock_ctrl_t, - flavor: clock_flavor_t, - clock_attr: clock_attr_t, - clock_attrCnt: mach_msg_type_number_t, - ) -> kern_return_t; -} diff -Nru temporalio-1.3.0/vendor/mach/src/clock_reply.rs temporalio-1.3.0/vendor/mach/src/clock_reply.rs --- temporalio-1.3.0/vendor/mach/src/clock_reply.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach/src/clock_reply.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,16 +0,0 @@ -//! This module roughly corresponds to `mach/clock_reply.h`. - -use clock_types::{alarm_type_t, mach_timespec_t}; -use kern_return::kern_return_t; -use mach_types::clock_reply_t; -use message::mach_msg_type_name_t; - -extern "C" { - pub fn clock_alarm_reply( - alarm_port: clock_reply_t, - alarm_portPoly: mach_msg_type_name_t, - alarm_code: kern_return_t, - alarm_type: alarm_type_t, - alarm_time: mach_timespec_t, - ) -> kern_return_t; -} diff -Nru temporalio-1.3.0/vendor/mach/src/clock.rs temporalio-1.3.0/vendor/mach/src/clock.rs --- temporalio-1.3.0/vendor/mach/src/clock.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach/src/clock.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,27 +0,0 @@ -//! This module roughly corresponds to `mach/clock.h`. - -pub const clock_MSG_COUNT: ::libc::c_uint = 3; - -use clock_types::{alarm_type_t, clock_attr_t, clock_flavor_t, mach_timespec_t}; -use kern_return::kern_return_t; -use mach_types::{clock_reply_t, clock_serv_t}; -use message::mach_msg_type_number_t; - -extern "C" { - pub fn clock_get_time( - clock_serv: clock_serv_t, - cur_time: *mut mach_timespec_t, - ) -> kern_return_t; - pub fn clock_get_attributes( - clock_serv: clock_serv_t, - flavor: clock_flavor_t, - clock_attr: clock_attr_t, - clock_attrCnt: *mut mach_msg_type_number_t, - ) -> kern_return_t; - pub fn clock_alarm( - clock_serv: clock_serv_t, - alarm_type: alarm_type_t, - alarm_time: mach_timespec_t, - alarm_port: clock_reply_t, - ) -> kern_return_t; -} diff -Nru temporalio-1.3.0/vendor/mach/src/clock_types.rs temporalio-1.3.0/vendor/mach/src/clock_types.rs --- temporalio-1.3.0/vendor/mach/src/clock_types.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach/src/clock_types.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,75 +0,0 @@ -//! This module roughly corresponds to `mach/clock_types.h`. - -pub type alarm_type_t = ::libc::c_int; -pub type sleep_type_t = ::libc::c_int; -pub type clock_id_t = ::libc::c_int; -pub type clock_flavor_t = ::libc::c_int; -pub type clock_attr_t = *mut ::libc::c_int; -pub type clock_res_t = ::libc::c_int; - -#[repr(C)] -#[derive(Copy, Clone, Debug, Default, Hash, PartialOrd, PartialEq, Eq, Ord)] -pub struct mach_timespec { - pub tv_sec: ::libc::c_uint, - pub tv_nsec: clock_res_t, -} -pub type mach_timespec_t = mach_timespec; - -pub const SYSTEM_CLOCK: ::libc::c_uint = 0; -pub const CALENDAR_CLOCK: ::libc::c_uint = 1; -pub const REALTIME_CLOCK: ::libc::c_uint = 0; - -pub const CLOCK_GET_TIME_RES: ::libc::c_uint = 1; -pub const CLOCK_ALARM_CURRES: ::libc::c_uint = 3; -pub const CLOCK_ALARM_MINRES: ::libc::c_uint = 4; -pub const CLOCK_ALARM_MAXRES: ::libc::c_uint = 5; - -pub const NSEC_PER_USEC: ::libc::c_ulonglong = 1000; -pub const USEC_PER_SEC: ::libc::c_ulonglong = 1_000_000; -pub const NSEC_PER_SEC: ::libc::c_ulonglong = 1_000_000_000; -pub const NSEC_PER_MSEC: ::libc::c_ulonglong = 1_000_000; - -#[allow(non_snake_case)] -pub fn BAD_MACH_TIMESPEC(t: mach_timespec) -> bool { - t.tv_nsec < 0 || (t.tv_nsec as ::libc::c_ulonglong) >= NSEC_PER_SEC -} - -#[allow(non_snake_case)] -pub fn CMP_MACH_TIMESPEC(t1: &mach_timespec, t2: &mach_timespec) -> ::libc::c_ulonglong { - if t1.tv_sec > t2.tv_sec { - return NSEC_PER_SEC; - } - if t1.tv_sec < t2.tv_sec { - return !NSEC_PER_SEC; - } - (t1.tv_nsec as ::libc::c_ulonglong) - (t2.tv_nsec as ::libc::c_ulonglong) -} - -#[allow(non_snake_case)] -pub fn ADD_MACH_TIMESPEC(t1: &mut mach_timespec, t2: &mach_timespec) { - t1.tv_nsec += t2.tv_nsec; - if (t1.tv_nsec as ::libc::c_ulonglong) >= NSEC_PER_SEC { - t1.tv_nsec = (t1.tv_nsec as ::libc::c_ulonglong - NSEC_PER_SEC) as clock_res_t; - t1.tv_sec += 1; - } - t1.tv_sec += t2.tv_sec; -} - -#[allow(non_snake_case)] -pub fn SUB_MACH_TIMESPEC(t1: &mut mach_timespec, t2: &mach_timespec) { - t1.tv_nsec -= t2.tv_nsec; - if t1.tv_nsec < 0 { - t1.tv_nsec = (t1.tv_nsec as ::libc::c_ulonglong + NSEC_PER_SEC) as clock_res_t; - t1.tv_sec -= 1; - } - t1.tv_sec -= t2.tv_sec; -} - -pub const ALRMTYPE: ::libc::c_uint = 0xff; -pub const TIME_ABSOLUTE: ::libc::c_uint = 0x00; -pub const TIME_RELATIVE: ::libc::c_uint = 0x01; - -#[allow(non_snake_case)] -pub fn BAD_ALRMTYPE(t: ::libc::c_uint) -> bool { - t & (!TIME_RELATIVE) != 0 -} diff -Nru temporalio-1.3.0/vendor/mach/src/dyld_kernel.rs temporalio-1.3.0/vendor/mach/src/dyld_kernel.rs --- temporalio-1.3.0/vendor/mach/src/dyld_kernel.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach/src/dyld_kernel.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,30 +0,0 @@ -//! This module roughly corresponds to `mach/dyld_kernel.h`. - -use boolean::boolean_t; -use mach_types::{fsid_t, fsobj_id_t, uuid_t}; - -#[repr(C)] -#[derive(Copy, Clone, Debug, Default, Hash, PartialOrd, PartialEq, Eq, Ord)] -pub struct dyld_kernel_image_info { - pub uuid: uuid_t, - pub fsobjid: fsobj_id_t, - pub fsid: fsid_t, - pub load_addr: u64, -} - -#[allow(non_snake_case)] -#[repr(C)] -#[derive(Copy, Clone, Debug, Default, Hash, PartialOrd, PartialEq, Eq, Ord)] -pub struct dyld_kernel_process_info { - pub cache_image_info: dyld_kernel_image_info, - pub timestamp: u64, - pub imageCount: u32, - pub initialImageCount: u32, - pub dyldState: u8, - pub no_cache: boolean_t, - pub private_cache: boolean_t, -} - -pub type dyld_kernel_image_info_t = dyld_kernel_image_info; -pub type dyld_kernel_process_info_t = dyld_kernel_process_info; -pub type dyld_kernel_image_info_array_t = *mut dyld_kernel_image_info_t; diff -Nru temporalio-1.3.0/vendor/mach/src/exception_types.rs temporalio-1.3.0/vendor/mach/src/exception_types.rs --- temporalio-1.3.0/vendor/mach/src/exception_types.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach/src/exception_types.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,56 +0,0 @@ -//! This module roughly corresponds to `mach/exception_types.h`. - -use port::mach_port_t; -use thread_status::thread_state_flavor_t; -use vm_types::integer_t; - -pub const EXC_BAD_ACCESS: ::libc::c_uint = 1; -pub const EXC_BAD_INSTRUCTION: ::libc::c_uint = 2; -pub const EXC_ARITHMETIC: ::libc::c_uint = 3; -pub const EXC_EMULATION: ::libc::c_uint = 4; -pub const EXC_SOFTWARE: ::libc::c_uint = 5; -pub const EXC_BREAKPOINT: ::libc::c_uint = 6; -pub const EXC_SYSCALL: ::libc::c_uint = 7; -pub const EXC_MACH_SYSCALL: ::libc::c_uint = 8; -pub const EXC_RPC_ALERT: ::libc::c_uint = 9; -pub const EXC_CRASH: ::libc::c_uint = 10; -pub const EXC_RESOURCE: ::libc::c_uint = 11; -pub const EXC_GUARD: ::libc::c_uint = 12; -pub const EXC_CORPSE_NOTIFY: ::libc::c_uint = 13; -pub const EXC_CORPSE_VARIANT_BIT: ::libc::c_uint = 256; -pub const EXCEPTION_DEFAULT: ::libc::c_uint = 1; -pub const EXCEPTION_STATE: ::libc::c_uint = 2; -pub const EXCEPTION_STATE_IDENTITY: ::libc::c_uint = 3; -pub const MACH_EXCEPTION_CODES: ::libc::c_uint = 2_147_483_648; -pub const EXC_MASK_BAD_ACCESS: ::libc::c_uint = 2; -pub const EXC_MASK_BAD_INSTRUCTION: ::libc::c_uint = 4; -pub const EXC_MASK_ARITHMETIC: ::libc::c_uint = 8; -pub const EXC_MASK_EMULATION: ::libc::c_uint = 16; -pub const EXC_MASK_SOFTWARE: ::libc::c_uint = 32; -pub const EXC_MASK_BREAKPOINT: ::libc::c_uint = 64; -pub const EXC_MASK_SYSCALL: ::libc::c_uint = 128; -pub const EXC_MASK_MACH_SYSCALL: ::libc::c_uint = 256; -pub const EXC_MASK_RPC_ALERT: ::libc::c_uint = 512; -pub const EXC_MASK_CRASH: ::libc::c_uint = 1024; -pub const EXC_MASK_RESOURCE: ::libc::c_uint = 2048; -pub const EXC_MASK_GUARD: ::libc::c_uint = 4096; -pub const EXC_MASK_CORPSE_NOTIFY: ::libc::c_uint = 8192; -pub const EXC_MASK_ALL: ::libc::c_uint = 7166; -pub const FIRST_EXCEPTION: ::libc::c_uint = 1; -pub const EXC_SOFT_SIGNAL: ::libc::c_uint = 65_539; -pub const EXC_MACF_MIN: ::libc::c_uint = 131_072; -pub const EXC_MACF_MAX: ::libc::c_uint = 196_607; - -pub type exception_type_t = ::libc::c_int; -pub type exception_data_type_t = integer_t; -pub type mach_exception_data_type_t = i64; -pub type exception_behavior_t = ::libc::c_int; -pub type exception_data_t = *mut exception_data_type_t; -pub type mach_exception_data_t = *mut mach_exception_data_type_t; -pub type exception_mask_t = ::libc::c_uint; -pub type exception_mask_array_t = *mut exception_mask_t; -pub type exception_behavior_array_t = *mut exception_behavior_t; -pub type exception_flavor_array_t = *mut thread_state_flavor_t; -pub type exception_port_array_t = *mut mach_port_t; -pub type mach_exception_code_t = mach_exception_data_type_t; -pub type mach_exception_subcode_t = mach_exception_data_type_t; diff -Nru temporalio-1.3.0/vendor/mach/src/exc.rs temporalio-1.3.0/vendor/mach/src/exc.rs --- temporalio-1.3.0/vendor/mach/src/exc.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach/src/exc.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,44 +0,0 @@ -//! This module roughly corresponds to `mach/exc.h`. - -use exception_types::{exception_data_t, exception_type_t}; -use kern_return::kern_return_t; -use message::mach_msg_type_number_t; -use port::mach_port_t; -use thread_status::thread_state_t; - -pub const exc_MSG_COUNT: ::libc::c_uint = 3; - -extern "C" { - pub fn exception_raise( - exception_port: mach_port_t, - thread: mach_port_t, - task: mach_port_t, - exception: exception_type_t, - code: exception_data_t, - codeCnt: mach_msg_type_number_t, - ) -> kern_return_t; - pub fn exception_raise_state( - exception_port: mach_port_t, - exception: exception_type_t, - code: exception_data_t, - codeCnt: mach_msg_type_number_t, - flavor: *mut ::libc::c_int, - old_state: thread_state_t, - old_stateCnt: mach_msg_type_number_t, - new_state: thread_state_t, - new_stateCnt: *mut mach_msg_type_number_t, - ) -> kern_return_t; - pub fn exception_raise_state_identity( - exception_port: mach_port_t, - thread: mach_port_t, - task: mach_port_t, - exception: exception_type_t, - code: exception_data_t, - codeCnt: mach_msg_type_number_t, - flavor: *mut ::libc::c_int, - old_state: thread_state_t, - old_stateCnt: mach_msg_type_number_t, - new_state: thread_state_t, - new_stateCnt: *mut mach_msg_type_number_t, - ) -> kern_return_t; -} diff -Nru temporalio-1.3.0/vendor/mach/src/kern_return.rs temporalio-1.3.0/vendor/mach/src/kern_return.rs --- temporalio-1.3.0/vendor/mach/src/kern_return.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach/src/kern_return.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,58 +0,0 @@ -//! This module corresponds to `mach/kern_return.h` and -//! `mach/i386/kern_return.h`. - -pub type kern_return_t = ::libc::c_int; - -pub const KERN_SUCCESS: kern_return_t = 0; -pub const KERN_INVALID_ADDRESS: kern_return_t = 1; -pub const KERN_PROTECTION_FAILURE: kern_return_t = 2; -pub const KERN_NO_SPACE: kern_return_t = 3; -pub const KERN_INVALID_ARGUMENT: kern_return_t = 4; -pub const KERN_FAILURE: kern_return_t = 5; -pub const KERN_RESOURCE_SHORTAGE: kern_return_t = 6; -pub const KERN_NOT_RECEIVER: kern_return_t = 7; -pub const KERN_NO_ACCESS: kern_return_t = 8; -pub const KERN_MEMORY_FAILURE: kern_return_t = 9; -pub const KERN_MEMORY_ERROR: kern_return_t = 10; -pub const KERN_ALREADY_IN_SET: kern_return_t = 11; -pub const KERN_NOT_IN_SET: kern_return_t = 12; -pub const KERN_NAME_EXISTS: kern_return_t = 13; -pub const KERN_ABORTED: kern_return_t = 14; -pub const KERN_INVALID_NAME: kern_return_t = 15; -pub const KERN_INVALID_TASK: kern_return_t = 16; -pub const KERN_INVALID_RIGHT: kern_return_t = 17; -pub const KERN_INVALID_VALUE: kern_return_t = 18; -pub const KERN_UREFS_OVERFLOW: kern_return_t = 19; -pub const KERN_INVALID_CAPABILITY: kern_return_t = 20; -pub const KERN_RIGHT_EXISTS: kern_return_t = 21; -pub const KERN_INVALID_HOST: kern_return_t = 22; -pub const KERN_MEMORY_PRESENT: kern_return_t = 23; -pub const KERN_MEMORY_DATA_MOVED: kern_return_t = 24; -pub const KERN_MEMORY_RESTART_COPY: kern_return_t = 25; -pub const KERN_INVALID_PROCESSOR_SET: kern_return_t = 26; -pub const KERN_POLICY_LIMIT: kern_return_t = 27; -pub const KERN_INVALID_POLICY: kern_return_t = 28; -pub const KERN_INVALID_OBJECT: kern_return_t = 29; -pub const KERN_ALREADY_WAITING: kern_return_t = 30; -pub const KERN_DEFAULT_SET: kern_return_t = 31; -pub const KERN_EXCEPTION_PROTECTED: kern_return_t = 32; -pub const KERN_INVALID_LEDGER: kern_return_t = 33; -pub const KERN_INVALID_MEMORY_CONTROL: kern_return_t = 34; -pub const KERN_INVALID_SECURITY: kern_return_t = 35; -pub const KERN_NOT_DEPRESSED: kern_return_t = 36; -pub const KERN_TERMINATED: kern_return_t = 37; -pub const KERN_LOCK_SET_DESTROYED: kern_return_t = 38; -pub const KERN_LOCK_UNSTABLE: kern_return_t = 39; -pub const KERN_LOCK_OWNED: kern_return_t = 40; -pub const KERN_LOCK_OWNED_SELF: kern_return_t = 41; -pub const KERN_SEMAPHORE_DESTROYED: kern_return_t = 42; -pub const KERN_RPC_SERVER_TERMINATED: kern_return_t = 43; -pub const KERN_RPC_TERMINATE_ORPHAN: kern_return_t = 44; -pub const KERN_RPC_CONTINUE_ORPHAN: kern_return_t = 45; -pub const KERN_NOT_SUPPORTED: kern_return_t = 46; -pub const KERN_NODE_DOWN: kern_return_t = 47; -pub const KERN_NOT_WAITING: kern_return_t = 48; -pub const KERN_OPERATION_TIMED_OUT: kern_return_t = 49; -pub const KERN_CODESIGN_ERROR: kern_return_t = 50; -pub const KERN_POLICY_STATIC: kern_return_t = 51; -pub const KERN_RETURN_MAX: kern_return_t = 0x100; diff -Nru temporalio-1.3.0/vendor/mach/src/lib.rs temporalio-1.3.0/vendor/mach/src/lib.rs --- temporalio-1.3.0/vendor/mach/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach/src/lib.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,60 +0,0 @@ -#![allow(non_camel_case_types)] -#![allow(non_upper_case_globals)] -#![deny(missing_debug_implementations)] -#![deny(missing_copy_implementations)] -#![cfg_attr(feature = "rustc-dep-of-std", feature(no_core))] -#![cfg_attr(feature = "rustc-dep-of-std", no_core)] -#![cfg_attr(not(feature = "rustc-dep-of-std"), no_std)] -#![allow( - clippy::module_name_repetitions, - clippy::cast_sign_loss, - clippy::cast_possible_truncation, - clippy::trivially_copy_pass_by_ref -)] - -#[cfg(not(any(target_os = "macos", target_os = "ios")))] -compile_error!("mach requires MacOSX or iOS"); - -#[cfg(feature = "rustc-dep-of-std")] -extern crate rustc_std_workspace_core as core; - -extern crate libc; - -#[allow(unused_imports)] -use core::{clone, cmp, default, fmt, hash, marker, mem, option}; - -pub mod boolean; -pub mod bootstrap; -pub mod clock; -pub mod clock_priv; -pub mod clock_reply; -pub mod clock_types; // TODO: test -pub mod dyld_kernel; -// pub mod error; // TODO -pub mod exc; -pub mod exception_types; -pub mod kern_return; -pub mod mach_init; -pub mod mach_port; -pub mod mach_time; -pub mod mach_types; -pub mod memory_object_types; -pub mod message; -pub mod port; -pub mod structs; -pub mod task; -pub mod task_info; -pub mod thread_act; -pub mod thread_status; -pub mod traps; -pub mod vm; -pub mod vm_attributes; -pub mod vm_behavior; -pub mod vm_inherit; -pub mod vm_page_size; -pub mod vm_prot; -pub mod vm_purgable; -pub mod vm_region; -pub mod vm_statistics; -pub mod vm_sync; -pub mod vm_types; diff -Nru temporalio-1.3.0/vendor/mach/src/mach_init.rs temporalio-1.3.0/vendor/mach/src/mach_init.rs --- temporalio-1.3.0/vendor/mach/src/mach_init.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach/src/mach_init.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,22 +0,0 @@ -//! This module corresponds to `mach/mach_init.h`. - -use mach_types::thread_port_t; - -extern "C" { - pub fn mach_thread_self() -> thread_port_t; -} - -#[cfg(test)] -mod tests { - use mach_init::*; - use port::*; - - #[test] - fn mach_thread_self_test() { - unsafe { - let this_thread = mach_thread_self(); - assert!(this_thread != MACH_PORT_NULL); - assert!(this_thread != MACH_PORT_DEAD); - } - } -} diff -Nru temporalio-1.3.0/vendor/mach/src/mach_port.rs temporalio-1.3.0/vendor/mach/src/mach_port.rs --- temporalio-1.3.0/vendor/mach/src/mach_port.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach/src/mach_port.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,29 +0,0 @@ -//! This module corresponds to `mach/mach_port.h` - -use kern_return::kern_return_t; -use mach_types::ipc_space_t; -use message::mach_msg_type_name_t; -use port::{mach_port_name_t, mach_port_right_t, mach_port_t}; - -extern "C" { - pub fn mach_port_allocate( - task: ipc_space_t, - right: mach_port_right_t, - name: *mut mach_port_name_t, - ) -> kern_return_t; - pub fn mach_port_destroy(task: ipc_space_t, name: mach_port_name_t) -> kern_return_t; - pub fn mach_port_deallocate(task: ipc_space_t, name: mach_port_name_t) -> kern_return_t; - pub fn mach_port_insert_right( - task: ipc_space_t, - name: mach_port_name_t, - poly: mach_port_t, - polyPoly: mach_msg_type_name_t, - ) -> kern_return_t; - pub fn mach_port_extract_right( - task: ipc_space_t, - name: mach_port_name_t, - msgt_name: mach_msg_type_name_t, - poly: *mut mach_port_t, - polyPoly: *mut mach_msg_type_name_t, - ) -> kern_return_t; -} diff -Nru temporalio-1.3.0/vendor/mach/src/mach_time.rs temporalio-1.3.0/vendor/mach/src/mach_time.rs --- temporalio-1.3.0/vendor/mach/src/mach_time.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach/src/mach_time.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,20 +0,0 @@ -//! This module corresponds to `mach/mach_time.h` -use kern_return::kern_return_t; -pub type mach_timebase_info_t = *mut mach_timebase_info; -pub type mach_timebase_info_data_t = mach_timebase_info; - -#[repr(C)] -#[derive(Copy, Clone, Debug, Default, Hash, PartialOrd, PartialEq, Eq, Ord)] -pub struct mach_timebase_info { - pub numer: u32, - pub denom: u32, -} - -extern "C" { - pub fn mach_timebase_info(info: mach_timebase_info_t) -> kern_return_t; - pub fn mach_wait_until(deadline: u64) -> kern_return_t; - pub fn mach_absolute_time() -> u64; - pub fn mach_approximate_time() -> u64; - pub fn mach_continuous_time() -> u64; - pub fn mach_continuous_approximate_time() -> u64; -} diff -Nru temporalio-1.3.0/vendor/mach/src/mach_types.rs temporalio-1.3.0/vendor/mach/src/mach_types.rs --- temporalio-1.3.0/vendor/mach/src/mach_types.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach/src/mach_types.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,106 +0,0 @@ -//! This module corresponds to `mach/mach_types.h` - -use port::mach_port_t; - -pub type task_t = mach_port_t; -pub type task_name_t = mach_port_t; -pub type task_suspension_token_t = mach_port_t; -pub type thread_t = mach_port_t; -pub type thread_act_t = mach_port_t; -pub type ipc_space_t = mach_port_t; -pub type coalition_t = mach_port_t; -pub type host_t = mach_port_t; -pub type host_priv_t = mach_port_t; -pub type host_security_t = mach_port_t; -pub type processor_t = mach_port_t; -pub type processor_set_t = mach_port_t; -pub type processor_set_control_t = mach_port_t; -pub type semaphore_t = mach_port_t; -pub type lock_set_t = mach_port_t; -pub type ledger_t = mach_port_t; -pub type alarm_t = mach_port_t; -pub type clock_serv_t = mach_port_t; -pub type clock_ctrl_t = mach_port_t; - -pub type processor_set_name_t = processor_set_t; - -pub type clock_reply_t = mach_port_t; -pub type bootstrap_t = mach_port_t; -pub type mem_entry_name_port_t = mach_port_t; -pub type exception_handler_t = mach_port_t; -pub type exception_handler_array_t = *mut exception_handler_t; -pub type vm_task_entry_t = mach_port_t; -pub type io_master_t = mach_port_t; -pub type UNDServerRef = mach_port_t; - -pub type task_array_t = *mut task_t; -pub type thread_array_t = *mut thread_t; -pub type processor_set_array_t = *mut processor_set_t; -pub type processor_set_name_array_t = *mut processor_set_t; -pub type processor_array_t = *mut processor_t; -pub type thread_act_array_t = *mut thread_act_t; -pub type ledger_array_t = *mut ledger_t; - -pub type task_port_t = task_t; -pub type task_port_array_t = task_array_t; -pub type thread_port_t = thread_t; -pub type thread_port_array_t = thread_array_t; -pub type ipc_space_port_t = ipc_space_t; -pub type host_name_t = host_t; -pub type host_name_port_t = host_t; -pub type processor_set_port_t = processor_set_t; -pub type processor_set_name_port_t = processor_set_t; -pub type processor_set_name_port_array_t = processor_set_array_t; -pub type processor_set_control_port_t = processor_set_t; -pub type processor_port_t = processor_t; -pub type processor_port_array_t = processor_array_t; -pub type thread_act_port_t = thread_act_t; -pub type thread_act_port_array_t = thread_act_array_t; -pub type semaphore_port_t = semaphore_t; -pub type lock_set_port_t = lock_set_t; -pub type ledger_port_t = ledger_t; -pub type ledger_port_array_t = ledger_array_t; -pub type alarm_port_t = alarm_t; -pub type clock_serv_port_t = clock_serv_t; -pub type clock_ctrl_port_t = clock_ctrl_t; -pub type exception_port_t = exception_handler_t; -pub type exception_port_arrary_t = exception_handler_array_t; - -pub const TASK_NULL: task_t = 0; -pub const TASK_NAME_NULL: task_name_t = 0; -pub const THREAD_NULL: thread_t = 0; -pub const TID_NULL: u64 = 0; -pub const THR_ACT_NULL: thread_act_t = 0; -pub const IPC_SPACE_NULL: ipc_space_t = 0; -pub const COALITION_NULL: coalition_t = 0; -pub const HOST_NULL: host_t = 0; -pub const HOST_PRIV_NULL: host_priv_t = 0; -pub const HOST_SECURITY_NULL: host_security_t = 0; -pub const PROCESSOR_SET_NULL: processor_set_t = 0; -pub const PROCESSOR_NULL: processor_t = 0; -pub const SEMAPHORE_NULL: semaphore_t = 0; -pub const LOCK_SET_NULL: lock_set_t = 0; -pub const LEDGER_NULL: ledger_t = 0; -pub const ALARM_NULL: alarm_t = 0; -pub const CLOCK_NULL: ::libc::clock_t = 0; -pub const UND_SERVER_NULL: UNDServerRef = 0; - -// : typedef unsigned char __darwin_uuid_t[16]; -pub type uuid_t = [::libc::c_uchar; 16]; - -// -#[repr(C)] -#[derive(Copy, Clone, Debug, Default, Hash, PartialOrd, PartialEq, Eq, Ord)] -pub struct fsid { - pub val: [i32; 2], -} -pub type fsid_t = fsid; - -// -#[repr(C)] -#[derive(Copy, Clone, Debug, Default, Hash, PartialOrd, PartialEq, Eq, Ord)] -pub struct fsobj_id { - pub fid_objno: u32, - pub fid_generation: u32, -} -pub type fsobj_id_t = fsobj_id; diff -Nru temporalio-1.3.0/vendor/mach/src/memory_object_types.rs temporalio-1.3.0/vendor/mach/src/memory_object_types.rs --- temporalio-1.3.0/vendor/mach/src/memory_object_types.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach/src/memory_object_types.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,9 +0,0 @@ -//! This module roughly corresponds to `mach/memory_object_types.h`. - -use vm_types::natural_t; - -pub type memory_object_offset_t = ::libc::c_ulonglong; -pub type memory_object_size_t = ::libc::c_ulonglong; -pub type memory_object_cluster_size_t = natural_t; -pub type memory_object_fault_info_t = *mut natural_t; -pub type vm_object_id_t = ::libc::c_ulonglong; diff -Nru temporalio-1.3.0/vendor/mach/src/message.rs temporalio-1.3.0/vendor/mach/src/message.rs --- temporalio-1.3.0/vendor/mach/src/message.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach/src/message.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,248 +0,0 @@ -//! This module corresponds to `mach/message.h`. - -use kern_return::kern_return_t; -use port::{mach_port_name_t, mach_port_t}; -use vm_types::{integer_t, natural_t}; - -pub type mach_msg_timeout_t = natural_t; - -pub type mach_msg_bits_t = ::libc::c_uint; -pub type mach_msg_id_t = integer_t; -pub type mach_msg_size_t = natural_t; - -pub type mach_msg_copy_options_t = ::libc::c_uint; -pub type mach_msg_descriptor_type_t = ::libc::c_uint; -pub type mach_msg_type_name_t = ::libc::c_uint; - -pub type mach_msg_trailer_type_t = ::libc::c_uint; -pub type mach_msg_trailer_size_t = ::libc::c_uint; - -pub type mach_msg_option_t = integer_t; - -pub type mach_msg_type_number_t = natural_t; -pub type mach_msg_type_size_t = natural_t; - -pub type mach_msg_return_t = kern_return_t; - -pub const MACH_MSG_TIMEOUT_NONE: mach_msg_timeout_t = 0; - -pub const MACH_MSGH_BITS_ZERO: mach_msg_bits_t = 0x0000_0000; - -pub const MACH_MSGH_BITS_REMOTE_MASK: mach_msg_bits_t = 0x0000_001f; -pub const MACH_MSGH_BITS_LOCAL_MASK: mach_msg_bits_t = 0x0000_1f00; -pub const MACH_MSGH_BITS_VOUCHER_MASK: mach_msg_bits_t = 0x001f_0000; - -pub const MACH_MSGH_BITS_PORTS_MASK: mach_msg_bits_t = - MACH_MSGH_BITS_REMOTE_MASK | MACH_MSGH_BITS_LOCAL_MASK | MACH_MSGH_BITS_VOUCHER_MASK; - -pub const MACH_MSGH_BITS_COMPLEX: mach_msg_bits_t = 0x8000_0000; - -pub const MACH_MSGH_BITS_USER: mach_msg_bits_t = 0x801f_1f1f; - -#[allow(non_snake_case)] -pub fn MACH_MSGH_BITS(remote: mach_msg_bits_t, local: mach_msg_bits_t) -> mach_msg_bits_t { - remote | (local << 8) -} - -pub const MACH_MSG_TYPE_MOVE_RECEIVE: mach_msg_type_name_t = 16; -pub const MACH_MSG_TYPE_MOVE_SEND: mach_msg_type_name_t = 17; -pub const MACH_MSG_TYPE_MOVE_SEND_ONCE: mach_msg_type_name_t = 18; -pub const MACH_MSG_TYPE_COPY_SEND: mach_msg_type_name_t = 19; -pub const MACH_MSG_TYPE_MAKE_SEND: mach_msg_type_name_t = 20; -pub const MACH_MSG_TYPE_MAKE_SEND_ONCE: mach_msg_type_name_t = 21; -pub const MACH_MSG_TYPE_COPY_RECEIVE: mach_msg_type_name_t = 22; -pub const MACH_MSG_TYPE_DISPOSE_RECEIVE: mach_msg_type_name_t = 24; -pub const MACH_MSG_TYPE_DISPOSE_SEND: mach_msg_type_name_t = 25; -pub const MACH_MSG_TYPE_DISPOSE_SEND_ONCE: mach_msg_type_name_t = 26; - -pub const MACH_MSG_PHYSICAL_COPY: mach_msg_copy_options_t = 0; -pub const MACH_MSG_VIRTUAL_COPY: mach_msg_copy_options_t = 1; -pub const MACH_MSG_ALLOCATE: mach_msg_copy_options_t = 2; - -pub const MACH_MSG_PORT_DESCRIPTOR: mach_msg_descriptor_type_t = 0; -pub const MACH_MSG_OOL_DESCRIPTOR: mach_msg_descriptor_type_t = 1; -pub const MACH_MSG_OOL_PORTS_DESCRIPTOR: mach_msg_descriptor_type_t = 2; -pub const MACH_MSG_OOL_VOLATILE_DESCRIPTOR: mach_msg_descriptor_type_t = 3; - -pub const MACH_MSG_OPTION_NONE: mach_msg_option_t = 0x0000_0000; - -pub const MACH_SEND_MSG: mach_msg_option_t = 0x0000_0001; -pub const MACH_RCV_MSG: mach_msg_option_t = 0x0000_0002; - -pub const MACH_RCV_LARGE: mach_msg_option_t = 0x0000_0004; -pub const MACH_RCV_LARGE_IDENTITY: mach_msg_option_t = 0x0000_0008; - -pub const MACH_SEND_TIMEOUT: mach_msg_option_t = 0x0000_0010; -pub const MACH_SEND_INTERRUPT: mach_msg_option_t = 0x0000_0040; -pub const MACH_SEND_NOTIFY: mach_msg_option_t = 0x0000_0080; -pub const MACH_SEND_ALWAYS: mach_msg_option_t = 0x0001_0000; -pub const MACH_SEND_TRAILER: mach_msg_option_t = 0x0002_0000; -pub const MACH_SEND_NOIMPORTANCE: mach_msg_option_t = 0x0004_0000; -pub const MACH_SEND_NODENAP: mach_msg_option_t = MACH_SEND_NOIMPORTANCE; -pub const MACH_SEND_IMPORTANCE: mach_msg_option_t = 0x0008_0000; - -pub const MACH_RCV_TIMEOUT: mach_msg_option_t = 0x0000_0100; -pub const MACH_RCV_NOTIFY: mach_msg_option_t = 0x0000_0200; -pub const MACH_RCV_INTERRUPT: mach_msg_option_t = 0x0000_0400; -pub const MACH_RCV_VOUCHER: mach_msg_option_t = 0x0000_0800; -pub const MACH_RCV_OVERWRITE: mach_msg_option_t = 0x0000_1000; - -pub const MACH_MSG_SUCCESS: mach_msg_return_t = 0x0000_0000; - -pub const MACH_MSG_MASK: mach_msg_return_t = 0x0000_3e00; -pub const MACH_MSG_IPC_SPACE: mach_msg_return_t = 0x0000_2000; -pub const MACH_MSG_VM_SPACE: mach_msg_return_t = 0x0000_1000; -pub const MACH_MSG_IPC_KERNEL: mach_msg_return_t = 0x0000_0800; -pub const MACH_MSG_VM_KERNEL: mach_msg_return_t = 0x0000_0400; - -pub const MACH_SEND_IN_PROGRESS: mach_msg_return_t = 0x1000_0001; -pub const MACH_SEND_INVALID_DATA: mach_msg_return_t = 0x1000_0002; -pub const MACH_SEND_INVALID_DEST: mach_msg_return_t = 0x1000_0003; -pub const MACH_SEND_TIMED_OUT: mach_msg_return_t = 0x1000_0004; -pub const MACH_SEND_INVALID_VOUCHER: mach_msg_return_t = 0x1000_0005; -pub const MACH_SEND_INTERRUPTED: mach_msg_return_t = 0x1000_0007; -pub const MACH_SEND_MSG_TOO_SMALL: mach_msg_return_t = 0x1000_0008; -pub const MACH_SEND_INVALID_REPLY: mach_msg_return_t = 0x1000_0009; -pub const MACH_SEND_INVALID_RIGHT: mach_msg_return_t = 0x1000_000a; -pub const MACH_SEND_INVALID_NOTIFY: mach_msg_return_t = 0x1000_000b; -pub const MACH_SEND_INVALID_MEMORY: mach_msg_return_t = 0x1000_000c; -pub const MACH_SEND_NO_BUFFER: mach_msg_return_t = 0x1000_000d; -pub const MACH_SEND_TOO_LARGE: mach_msg_return_t = 0x1000_000e; -pub const MACH_SEND_INVALID_TYPE: mach_msg_return_t = 0x1000_000f; -pub const MACH_SEND_INVALID_HEADER: mach_msg_return_t = 0x1000_0010; -pub const MACH_SEND_INVALID_TRAILER: mach_msg_return_t = 0x1000_0011; -pub const MACH_SEND_INVALID_RT_OOL_SIZE: mach_msg_return_t = 0x1000_0015; - -pub const MACH_RCV_IN_PROGRESS: mach_msg_return_t = 0x1000_4001; -pub const MACH_RCV_INVALID_NAME: mach_msg_return_t = 0x1000_4002; -pub const MACH_RCV_TIMED_OUT: mach_msg_return_t = 0x1000_4003; -pub const MACH_RCV_TOO_LARGE: mach_msg_return_t = 0x1000_4004; -pub const MACH_RCV_INTERRUPTED: mach_msg_return_t = 0x1000_4005; -pub const MACH_RCV_PORT_CHANGED: mach_msg_return_t = 0x1000_4006; -pub const MACH_RCV_INVALID_NOTIFY: mach_msg_return_t = 0x1000_4007; -pub const MACH_RCV_INVALID_DATA: mach_msg_return_t = 0x1000_4008; -pub const MACH_RCV_PORT_DIED: mach_msg_return_t = 0x1000_4009; -pub const MACH_RCV_IN_SET: mach_msg_return_t = 0x1000_400a; -pub const MACH_RCV_HEADER_ERROR: mach_msg_return_t = 0x1000_400b; -pub const MACH_RCV_BODY_ERROR: mach_msg_return_t = 0x1000_400c; -pub const MACH_RCV_INVALID_TYPE: mach_msg_return_t = 0x1000_400d; -pub const MACH_RCV_SCATTER_SMALL: mach_msg_return_t = 0x1000_400e; -pub const MACH_RCV_INVALID_TRAILER: mach_msg_return_t = 0x1000_400f; -pub const MACH_RCV_IN_PROGRESS_TIMED: mach_msg_return_t = 0x1000_4011; - -#[repr(C)] -#[derive(Copy, Clone, Debug, Default, Hash, PartialOrd, PartialEq, Eq, Ord)] -pub struct mach_msg_header_t { - pub msgh_bits: mach_msg_bits_t, - pub msgh_size: mach_msg_size_t, - pub msgh_remote_port: mach_port_t, - pub msgh_local_port: mach_port_t, - pub msgh_voucher_port: mach_port_name_t, - pub msgh_id: mach_msg_id_t, -} - -#[repr(C)] -#[derive(Copy, Clone, Debug, Default, Hash, PartialOrd, PartialEq, Eq, Ord)] -pub struct mach_msg_body_t { - pub msgh_descriptor_count: mach_msg_size_t, -} - -#[repr(C)] -#[derive(Copy, Clone, Debug, Default, Hash, PartialOrd, PartialEq, Eq, Ord)] -pub struct mach_msg_base_t { - pub header: mach_msg_header_t, - pub body: mach_msg_body_t, -} - -pub const MACH_MSG_TRAILER_FORMAT_0: mach_msg_trailer_type_t = 0; - -#[repr(C)] -#[derive(Copy, Clone, Debug, Default, Hash, PartialOrd, PartialEq, Eq, Ord)] -pub struct mach_msg_trailer_t { - pub msgh_trailer_type: mach_msg_trailer_type_t, - pub msgh_trailer_size: mach_msg_trailer_size_t, -} - -#[repr(C)] -#[derive(Copy, Clone, Debug, Default, Hash, PartialOrd, PartialEq, Eq, Ord)] -pub struct mach_msg_port_descriptor_t { - pub name: mach_port_t, - pub pad1: mach_msg_size_t, - pub pad2: u16, - pub disposition: u8, // mach_msg_type_name_t bitfield - pub type_: u8, // mach_msg_descriptor_type_t bitfield -} - -impl mach_msg_port_descriptor_t { - pub fn new(name: mach_port_t, disposition: mach_msg_type_name_t) -> Self { - Self { - name, - pad1: 0, - pad2: 0, - disposition: disposition as u8, - type_: MACH_MSG_PORT_DESCRIPTOR as u8, - } - } -} - -#[repr(C)] -#[derive(Copy, Clone, Debug, Hash, PartialOrd, PartialEq, Eq, Ord)] -pub struct mach_msg_ool_descriptor_t { - pub address: *mut ::libc::c_void, - #[cfg(not(target_pointer_width = "64"))] - pub size: mach_msg_size_t, - pub deallocate: u8, // boolean_t bitfield - pub copy: u8, // mach_msg_copy_options_t bitfield - pub pad1: u8, - pub type_: u8, // mach_msg_descriptor_type_t bitfield - #[cfg(target_pointer_width = "64")] - pub size: mach_msg_size_t, -} - -impl mach_msg_ool_descriptor_t { - pub fn new( - address: *mut ::libc::c_void, - deallocate: bool, - copy: mach_msg_copy_options_t, - size: u32, - ) -> Self { - Self { - address, - deallocate: if deallocate { 1 } else { 0 }, - copy: copy as u8, - pad1: 0, - type_: MACH_MSG_OOL_DESCRIPTOR as u8, - size, - } - } -} - -#[repr(C)] -#[derive(Copy, Clone, Debug, Hash, PartialOrd, PartialEq, Eq, Ord)] -pub struct mach_msg_ool_ports_descriptor_t { - pub address: *mut ::libc::c_void, - #[cfg(not(target_pointer_width = "64"))] - pub count: mach_msg_size_t, - pub deallocate: u8, // boolean_t bitfield - pub copy: u8, // mach_msg_copy_options_t bitfield - pub disposition: u8, // mach_msg_type_name_t bitfield - pub type_: u8, // mach_msg_descriptor_type_t bitfield - #[cfg(target_pointer_width = "64")] - pub count: mach_msg_size_t, -} - -extern "C" { - pub fn mach_msg( - msg: *mut mach_msg_header_t, - option: mach_msg_option_t, - send_size: mach_msg_size_t, - recv_size: mach_msg_size_t, - recv_name: mach_port_name_t, - timeout: mach_msg_timeout_t, - notify: mach_port_name_t, - ) -> mach_msg_return_t; - - // from mach/mach.h - pub fn mach_msg_send(msg: *mut mach_msg_header_t) -> mach_msg_return_t; - pub fn mach_msg_destroy(msg: *mut mach_msg_header_t); -} diff -Nru temporalio-1.3.0/vendor/mach/src/port.rs temporalio-1.3.0/vendor/mach/src/port.rs --- temporalio-1.3.0/vendor/mach/src/port.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach/src/port.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,26 +0,0 @@ -//! This module corresponds to `mach/port.h` - -use vm_types::natural_t; - -pub type mach_port_name_t = natural_t; - -#[repr(C)] -#[derive(Copy, Clone, Debug, Default, Hash, PartialOrd, PartialEq, Eq, Ord)] -pub struct ipc_port; - -pub type ipc_port_t = *mut ipc_port; - -pub type mach_port_t = ::libc::c_uint; - -pub const MACH_PORT_NULL: mach_port_t = 0; -pub const MACH_PORT_DEAD: mach_port_t = !0; - -pub type mach_port_right_t = natural_t; - -pub const MACH_PORT_RIGHT_SEND: mach_port_right_t = 0; -pub const MACH_PORT_RIGHT_RECEIVE: mach_port_right_t = 1; -pub const MACH_PORT_RIGHT_SEND_ONCE: mach_port_right_t = 2; -pub const MACH_PORT_RIGHT_PORT_SET: mach_port_right_t = 3; -pub const MACH_PORT_RIGHT_DEAD_NAME: mach_port_right_t = 4; -pub const MACH_PORT_RIGHT_LABELH: mach_port_right_t = 5; -pub const MACH_PORT_RIGHT_NUMBER: mach_port_right_t = 6; diff -Nru temporalio-1.3.0/vendor/mach/src/structs.rs temporalio-1.3.0/vendor/mach/src/structs.rs --- temporalio-1.3.0/vendor/mach/src/structs.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach/src/structs.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,62 +0,0 @@ -//! This module corresponds to `mach/_structs.h`. - -use mem; -use message::mach_msg_type_number_t; - -#[repr(C)] -#[derive(Copy, Clone, Debug, Default, Hash, PartialOrd, PartialEq, Eq, Ord)] -pub struct x86_thread_state64_t { - pub __rax: u64, - pub __rbx: u64, - pub __rcx: u64, - pub __rdx: u64, - pub __rdi: u64, - pub __rsi: u64, - pub __rbp: u64, - pub __rsp: u64, - pub __r8: u64, - pub __r9: u64, - pub __r10: u64, - pub __r11: u64, - pub __r12: u64, - pub __r13: u64, - pub __r14: u64, - pub __r15: u64, - pub __rip: u64, - pub __rflags: u64, - pub __cs: u64, - pub __fs: u64, - pub __gs: u64, -} - -impl x86_thread_state64_t { - pub fn new() -> Self { - Self { - __rax: 0, - __rbx: 0, - __rcx: 0, - __rdx: 0, - __rdi: 0, - __rsi: 0, - __rbp: 0, - __rsp: 0, - __r8: 0, - __r9: 0, - __r10: 0, - __r11: 0, - __r12: 0, - __r13: 0, - __r14: 0, - __r15: 0, - __rip: 0, - __rflags: 0, - __cs: 0, - __fs: 0, - __gs: 0, - } - } - - pub fn count() -> mach_msg_type_number_t { - (mem::size_of::() / mem::size_of::<::libc::c_int>()) as mach_msg_type_number_t - } -} diff -Nru temporalio-1.3.0/vendor/mach/src/task_info.rs temporalio-1.3.0/vendor/mach/src/task_info.rs --- temporalio-1.3.0/vendor/mach/src/task_info.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach/src/task_info.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,44 +0,0 @@ -//! This module roughly corresponds to `mach/task_info.h`. - -use vm_types::{integer_t, mach_vm_address_t, mach_vm_size_t, natural_t}; - -pub const TASK_INFO_MAX: ::libc::c_uint = 1024; -pub const TASK_BASIC_INFO_32: ::libc::c_uint = 4; -pub const TASK_BASIC2_INFO_32: ::libc::c_uint = 6; -pub const TASK_BASIC_INFO_64: ::libc::c_uint = 5; -#[cfg(target_arch = "x86_64")] -pub const TASK_BASIC_INFO: ::libc::c_uint = 5; -#[cfg(target_arch = "x86")] -pub const TASK_BASIC_INFO: ::libc::c_uint = 4; -pub const TASK_EVENTS_INFO: ::libc::c_uint = 2; -pub const TASK_THREAD_TIMES_INFO: ::libc::c_uint = 3; -pub const TASK_ABSOLUTETIME_INFO: ::libc::c_uint = 1; -pub const TASK_KERNELMEMORY_INFO: ::libc::c_uint = 7; -pub const TASK_SECURITY_TOKEN: ::libc::c_uint = 13; -pub const TASK_AUDIT_TOKEN: ::libc::c_uint = 15; -pub const TASK_AFFINITY_TAG_INFO: ::libc::c_uint = 16; -pub const TASK_DYLD_INFO: ::libc::c_uint = 17; -pub const TASK_DYLD_ALL_IMAGE_INFO_32: ::libc::c_uint = 0; -pub const TASK_DYLD_ALL_IMAGE_INFO_64: ::libc::c_uint = 1; -pub const TASK_EXTMOD_INFO: ::libc::c_uint = 19; -pub const MACH_TASK_BASIC_INFO: ::libc::c_uint = 20; -pub const TASK_POWER_INFO: ::libc::c_uint = 21; -pub const TASK_VM_INFO: ::libc::c_uint = 22; -pub const TASK_VM_INFO_PURGEABLE: ::libc::c_uint = 23; -pub const TASK_TRACE_MEMORY_INFO: ::libc::c_uint = 24; -pub const TASK_WAIT_STATE_INFO: ::libc::c_uint = 25; -pub const TASK_POWER_INFO_V2: ::libc::c_uint = 26; -pub const TASK_VM_INFO_PURGEABLE_ACCOUNT: ::libc::c_uint = 27; -pub const TASK_FLAGS_INFO: ::libc::c_uint = 28; -pub const TASK_DEBUG_INFO_INTERNAL: ::libc::c_uint = 29; - -pub type task_flavor_t = natural_t; -pub type task_info_t = *mut integer_t; - -#[repr(C, packed(4))] -#[derive(Copy, Clone, Debug, Default, Hash, PartialOrd, PartialEq, Eq, Ord)] -pub struct task_dyld_info { - pub all_image_info_addr: mach_vm_address_t, - pub all_image_info_size: mach_vm_size_t, - pub all_image_info_format: integer_t, -} diff -Nru temporalio-1.3.0/vendor/mach/src/task.rs temporalio-1.3.0/vendor/mach/src/task.rs --- temporalio-1.3.0/vendor/mach/src/task.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach/src/task.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,41 +0,0 @@ -//! This module corresponds to `mach/task.defs`. - -use kern_return::kern_return_t; -use mach_types::{task_name_t, task_t, thread_act_array_t}; -use message::mach_msg_type_number_t; -use port::mach_port_t; -use task_info::{task_flavor_t, task_info_t}; - -pub type task_special_port_t = ::libc::c_int; - -pub const TASK_KERNEL_PORT: task_special_port_t = 1; -pub const TASK_HOST_PORT: task_special_port_t = 2; -pub const TASK_NAME_PORT: task_special_port_t = 3; -pub const TASK_BOOTSTRAP_PORT: task_special_port_t = 4; - -extern "C" { - pub fn task_resume(target_task: task_t) -> kern_return_t; - pub fn task_suspend(target_task: task_t) -> kern_return_t; - pub fn task_get_special_port( - task: task_t, - which_port: task_special_port_t, - special_port: *mut mach_port_t, - ) -> kern_return_t; - pub fn task_threads( - target_task: task_t, - act_list: *mut thread_act_array_t, - act_list_cnt: *mut mach_msg_type_number_t, - ) -> kern_return_t; - pub fn task_info( - target_task: task_name_t, - flavor: task_flavor_t, - task_info_out: task_info_t, - task_info_outCnt: *mut mach_msg_type_number_t, - ) -> kern_return_t; - pub fn task_set_info( - target_task: task_t, - flavor: task_flavor_t, - task_info_in: task_info_t, - task_info_inCnt: mach_msg_type_number_t, - ) -> kern_return_t; -} diff -Nru temporalio-1.3.0/vendor/mach/src/thread_act.rs temporalio-1.3.0/vendor/mach/src/thread_act.rs --- temporalio-1.3.0/vendor/mach/src/thread_act.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach/src/thread_act.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,23 +0,0 @@ -//! This module corresponds to `mach/thread_act.defs`. - -use kern_return::kern_return_t; -use mach_types::thread_act_t; -use message::mach_msg_type_number_t; -use thread_status::{thread_state_flavor_t, thread_state_t}; - -extern "C" { - pub fn thread_get_state( - target_act: thread_act_t, - flavor: thread_state_flavor_t, - new_state: thread_state_t, - new_state_count: *mut mach_msg_type_number_t, - ) -> kern_return_t; -} - -extern "C" { - pub fn thread_suspend(target_act: thread_act_t) -> kern_return_t; -} - -extern "C" { - pub fn thread_resume(target_act: thread_act_t) -> kern_return_t; -} diff -Nru temporalio-1.3.0/vendor/mach/src/thread_status.rs temporalio-1.3.0/vendor/mach/src/thread_status.rs --- temporalio-1.3.0/vendor/mach/src/thread_status.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach/src/thread_status.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,23 +0,0 @@ -//! This module corresponds to `mach/thread_status.h`. - -use vm_types::natural_t; - -pub type thread_state_t = *mut natural_t; -pub type thread_state_flavor_t = ::libc::c_int; - -pub static x86_THREAD_STATE32: thread_state_flavor_t = 1; -pub static x86_FLOAT_STATE32: thread_state_flavor_t = 2; -pub static x86_EXCEPTION_STATE32: thread_state_flavor_t = 3; -pub static x86_THREAD_STATE64: thread_state_flavor_t = 4; -pub static x86_FLOAT_STATE64: thread_state_flavor_t = 5; -pub static x86_EXCEPTION_STATE64: thread_state_flavor_t = 6; -pub static x86_THREAD_STATE: thread_state_flavor_t = 7; -pub static x86_FLOAT_STATE: thread_state_flavor_t = 8; -pub static x86_EXCEPTION_STATE: thread_state_flavor_t = 9; -pub static x86_DEBUG_STATE32: thread_state_flavor_t = 10; -pub static x86_DEBUG_STATE64: thread_state_flavor_t = 11; -pub static x86_DEBUG_STATE: thread_state_flavor_t = 12; -pub static THREAD_STATE_NONE: thread_state_flavor_t = 13; -pub static x86_AVX_STATE32: thread_state_flavor_t = 16; -pub static x86_AVX_STATE64: thread_state_flavor_t = 17; -pub static x86_AVX_STATE: thread_state_flavor_t = 18; diff -Nru temporalio-1.3.0/vendor/mach/src/traps.rs temporalio-1.3.0/vendor/mach/src/traps.rs --- temporalio-1.3.0/vendor/mach/src/traps.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach/src/traps.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,35 +0,0 @@ -//! This module corresponds to `mach/mach_traps.h`. -use kern_return::kern_return_t; -use port::{mach_port_name_t, mach_port_t}; - -extern "C" { - static mach_task_self_: mach_port_t; - pub fn task_for_pid( - target_tport: mach_port_name_t, - pid: ::libc::c_int, - tn: *mut mach_port_name_t, - ) -> kern_return_t; -} - -pub unsafe fn mach_task_self() -> mach_port_t { - mach_task_self_ -} - -pub unsafe fn current_task() -> mach_port_t { - mach_task_self() -} - -#[cfg(test)] -mod tests { - use port::*; - use traps::*; - - #[test] - fn mach_task_self_sanity() { - unsafe { - let this_task = mach_task_self(); - assert!(this_task != MACH_PORT_NULL); - assert!(this_task != MACH_PORT_DEAD); - } - } -} diff -Nru temporalio-1.3.0/vendor/mach/src/vm_attributes.rs temporalio-1.3.0/vendor/mach/src/vm_attributes.rs --- temporalio-1.3.0/vendor/mach/src/vm_attributes.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach/src/vm_attributes.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -//! This module corresponds to `mach/vm_attributes.h`. - -pub type vm_machine_attribute_t = ::libc::c_uint; - -pub const MATTR_CACHE: vm_machine_attribute_t = 1; -pub const MATTR_MIGRATE: vm_machine_attribute_t = (1 << 1); -pub const MATTR_REPLICATE: vm_machine_attribute_t = (1 << 2); - -pub type vm_machine_attribute_val_t = ::libc::c_int; - -pub const MATTR_VAL_OFF: vm_machine_attribute_val_t = 0; -pub const MATTR_VAL_ON: vm_machine_attribute_val_t = 1; -pub const MATTR_VAL_GET: vm_machine_attribute_val_t = 2; -pub const MATTR_VAL_CACHE_FLUSH: vm_machine_attribute_val_t = 6; -pub const MATTR_VAL_DCACHE_FLUSH: vm_machine_attribute_val_t = 7; -pub const MATTR_VAL_ICACHE_FLUSH: vm_machine_attribute_val_t = 8; -pub const MATTR_VAL_CACHE_SYNC: vm_machine_attribute_val_t = 9; -pub const MATTR_VAL_GET_INFO: vm_machine_attribute_val_t = 10; diff -Nru temporalio-1.3.0/vendor/mach/src/vm_behavior.rs temporalio-1.3.0/vendor/mach/src/vm_behavior.rs --- temporalio-1.3.0/vendor/mach/src/vm_behavior.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach/src/vm_behavior.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ -//! This module corresponds to `mach/vm_behavior.h`. - -pub type vm_behavior_t = ::libc::c_int; - -pub const VM_BEHAVIOR_DEFAULT: vm_behavior_t = 0; -pub const VM_BEHAVIOR_RANDOM: vm_behavior_t = 1; -pub const VM_BEHAVIOR_SEQUENTIAL: vm_behavior_t = 2; -pub const VM_BEHAVIOR_RSEQNTL: vm_behavior_t = 3; -pub const VM_BEHAVIOR_WILLNEED: vm_behavior_t = 4; -pub const VM_BEHAVIOR_DONTNEED: vm_behavior_t = 5; -pub const VM_BEHAVIOR_FREE: vm_behavior_t = 6; -pub const VM_BEHAVIOR_ZERO_WIRED_PAGES: vm_behavior_t = 7; -pub const VM_BEHAVIOR_REUSABLE: vm_behavior_t = 8; -pub const VM_BEHAVIOR_REUSE: vm_behavior_t = 9; -pub const VM_BEHAVIOR_CAN_REUSE: vm_behavior_t = 10; diff -Nru temporalio-1.3.0/vendor/mach/src/vm_inherit.rs temporalio-1.3.0/vendor/mach/src/vm_inherit.rs --- temporalio-1.3.0/vendor/mach/src/vm_inherit.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach/src/vm_inherit.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,10 +0,0 @@ -//! This module corresponds to `mach/vm_inherit.h`. - -pub type vm_inherit_t = ::libc::c_uint; - -pub const VM_INHERIT_SHARE: vm_inherit_t = 0; -pub const VM_INHERIT_COPY: vm_inherit_t = 1; -pub const VM_INHERIT_NONE: vm_inherit_t = 2; -pub const VM_INHERIT_DONATE_COPY: vm_inherit_t = 3; -pub const VM_INHERIT_DEFAULT: vm_inherit_t = VM_INHERIT_COPY; -pub const VM_INHERIT_LAST_VALID: vm_inherit_t = VM_INHERIT_NONE; diff -Nru temporalio-1.3.0/vendor/mach/src/vm_page_size.rs temporalio-1.3.0/vendor/mach/src/vm_page_size.rs --- temporalio-1.3.0/vendor/mach/src/vm_page_size.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach/src/vm_page_size.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,33 +0,0 @@ -//! This module roughly corresponds to `mach/vm_page_size.h` - -use vm_types::{mach_vm_offset_t, mach_vm_size_t, vm_size_t}; - -extern "C" { - pub static vm_page_size: vm_size_t; - pub static vm_page_mask: vm_size_t; - pub static vm_page_shift: ::libc::c_int; -} - -pub unsafe fn mach_vm_trunc_page(x: mach_vm_offset_t) -> mach_vm_offset_t { - (x & !(vm_page_mask as mach_vm_size_t)) -} - -pub unsafe fn mach_vm_round_page(x: mach_vm_offset_t) -> mach_vm_offset_t { - ((x + vm_page_mask as mach_vm_size_t) & !(vm_page_mask as mach_vm_size_t)) -} - -#[cfg(test)] -mod tests { - use vm_page_size::*; - use vm_types::mach_vm_size_t; - - #[test] - fn page_size() { - unsafe { - assert!(vm_page_size > 0); - assert!(vm_page_size % 2 == 0); - assert_eq!(mach_vm_round_page(1), vm_page_size as mach_vm_size_t); - assert_eq!(vm_page_size, 4096); - } - } -} diff -Nru temporalio-1.3.0/vendor/mach/src/vm_prot.rs temporalio-1.3.0/vendor/mach/src/vm_prot.rs --- temporalio-1.3.0/vendor/mach/src/vm_prot.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach/src/vm_prot.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,14 +0,0 @@ -//! This module corresponds to `mach/vm_prot.h`. - -pub type vm_prot_t = ::libc::c_int; - -pub const VM_PROT_NONE: vm_prot_t = 0; -pub const VM_PROT_READ: vm_prot_t = 1; -pub const VM_PROT_WRITE: vm_prot_t = (1 << 1); -pub const VM_PROT_EXECUTE: vm_prot_t = (1 << 2); -pub const VM_PROT_NO_CHANGE: vm_prot_t = (1 << 3); -pub const VM_PROT_COPY: vm_prot_t = (1 << 4); -pub const VM_PROT_WANTS_COPY: vm_prot_t = (1 << 4); -pub const VM_PROT_TRUSTED: vm_prot_t = (1 << 5); -pub const VM_PROT_DEFAULT: vm_prot_t = VM_PROT_READ | VM_PROT_WRITE; -pub const VM_PROT_ALL: vm_prot_t = VM_PROT_READ | VM_PROT_WRITE | VM_PROT_EXECUTE; diff -Nru temporalio-1.3.0/vendor/mach/src/vm_purgable.rs temporalio-1.3.0/vendor/mach/src/vm_purgable.rs --- temporalio-1.3.0/vendor/mach/src/vm_purgable.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach/src/vm_purgable.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,42 +0,0 @@ -//! This module corresponds to `mach/vm_purgable.h`. - -pub type vm_purgable_t = ::libc::c_int; - -pub const VM_PURGABLE_SET_STATE: vm_purgable_t = 0; -pub const VM_PURGABLE_GET_STATE: vm_purgable_t = 1; - -pub const VM_VOLATILE_GROUP_SHIFT: ::libc::c_int = 8; -pub const VM_VOLATILE_GROUP_MASK: ::libc::c_int = (7 << VM_VOLATILE_GROUP_SHIFT); -pub const VM_VOLATILE_GROUP_DEFAULT: ::libc::c_int = VM_VOLATILE_GROUP_0; - -pub const VM_VOLATILE_GROUP_0: ::libc::c_int = (0 << VM_VOLATILE_GROUP_SHIFT); -pub const VM_VOLATILE_GROUP_1: ::libc::c_int = (1 << VM_VOLATILE_GROUP_SHIFT); -pub const VM_VOLATILE_GROUP_2: ::libc::c_int = (2 << VM_VOLATILE_GROUP_SHIFT); -pub const VM_VOLATILE_GROUP_3: ::libc::c_int = (3 << VM_VOLATILE_GROUP_SHIFT); -pub const VM_VOLATILE_GROUP_4: ::libc::c_int = (4 << VM_VOLATILE_GROUP_SHIFT); -pub const VM_VOLATILE_GROUP_5: ::libc::c_int = (5 << VM_VOLATILE_GROUP_SHIFT); -pub const VM_VOLATILE_GROUP_6: ::libc::c_int = (6 << VM_VOLATILE_GROUP_SHIFT); -pub const VM_VOLATILE_GROUP_7: ::libc::c_int = (7 << VM_VOLATILE_GROUP_SHIFT); - -pub const VM_PURGABLE_BEHAVIOR_SHIFT: ::libc::c_int = 6; -pub const VM_PURGABLE_BEHAVIOR_MASK: ::libc::c_int = (1 << VM_PURGABLE_BEHAVIOR_SHIFT); -pub const VM_PURGABLE_BEHAVIOR_FIFO: ::libc::c_int = (0 << VM_PURGABLE_BEHAVIOR_SHIFT); -pub const VM_PURGABLE_BEHAVIOR_LIFO: ::libc::c_int = (1 << VM_PURGABLE_BEHAVIOR_SHIFT); - -pub const VM_PURGABLE_ORDERING_SHIFT: ::libc::c_int = 5; -pub const VM_PURGABLE_ORDERING_MASK: ::libc::c_int = (1 << VM_PURGABLE_ORDERING_SHIFT); -pub const VM_PURGABLE_ORDERING_OBSOLETE: ::libc::c_int = (1 << VM_PURGABLE_ORDERING_SHIFT); -pub const VM_PURGABLE_ORDERING_NORMAL: ::libc::c_int = (0 << VM_PURGABLE_ORDERING_SHIFT); - -pub const VM_VOLATILE_ORDER_SHIFT: ::libc::c_int = 4; -pub const VM_VOLATILE_ORDER_MASK: ::libc::c_int = (1 << VM_VOLATILE_ORDER_SHIFT); -pub const VM_VOLATILE_MAKE_FIRST_IN_GROUP: ::libc::c_int = (1 << VM_VOLATILE_ORDER_SHIFT); -pub const VM_VOLATILE_MAKE_LAST_IN_GROUP: ::libc::c_int = (0 << VM_VOLATILE_ORDER_SHIFT); - -pub const VM_PURGABLE_STATE_MIN: ::libc::c_int = 0; -pub const VM_PURGABLE_STATE_MAX: ::libc::c_int = 3; -pub const VM_PURGABLE_STATE_MASK: ::libc::c_int = 3; -pub const VM_PURGABLE_NONVOLATILE: ::libc::c_int = 0; -pub const VM_PURGABLE_VOLATILE: ::libc::c_int = 1; -pub const VM_PURGABLE_EMPTY: ::libc::c_int = 2; -pub const VM_PURGABLE_DENY: ::libc::c_int = 3; diff -Nru temporalio-1.3.0/vendor/mach/src/vm_region.rs temporalio-1.3.0/vendor/mach/src/vm_region.rs --- temporalio-1.3.0/vendor/mach/src/vm_region.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach/src/vm_region.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,238 +0,0 @@ -//! This module roughly corresponds to `mach/vm_region.h`. - -use boolean::boolean_t; -use mem; -use memory_object_types::{memory_object_offset_t, vm_object_id_t}; -use message::mach_msg_type_number_t; -use vm_behavior::vm_behavior_t; -use vm_inherit::vm_inherit_t; -use vm_prot::vm_prot_t; -use vm_types::{mach_vm_address_t, mach_vm_size_t}; - -pub type vm32_object_id_t = u32; - -pub type vm_region_info_t = *mut ::libc::c_int; -pub type vm_region_info_64_t = *mut ::libc::c_int; -pub type vm_region_recurse_info_t = *mut ::libc::c_int; -pub type vm_region_recurse_info_64_t = *mut ::libc::c_int; -pub type vm_region_flavor_t = ::libc::c_int; -pub type vm_region_info_data_t = [::libc::c_int; VM_REGION_INFO_MAX as usize]; - -pub type vm_region_basic_info_64_t = *mut vm_region_basic_info_64; -pub type vm_region_basic_info_data_64_t = vm_region_basic_info_64; -pub type vm_region_basic_info_t = *mut vm_region_basic_info; -pub type vm_region_basic_info_data_t = vm_region_basic_info; -pub type vm_region_extended_info_t = *mut vm_region_extended_info; -pub type vm_region_extended_info_data_t = vm_region_extended_info; -pub type vm_region_top_info_t = *mut vm_region_top_info; -pub type vm_region_top_info_data_t = vm_region_top_info; -pub type vm_region_submap_info_t = *mut vm_region_submap_info; -pub type vm_region_submap_info_data_t = vm_region_submap_info; -pub type vm_region_submap_info_64_t = *mut vm_region_submap_info_64; -pub type vm_region_submap_info_data_64_t = vm_region_submap_info_64; -pub type vm_region_submap_short_info_64_t = *mut vm_region_submap_short_info_64; -pub type vm_region_submap_short_info_data_64_t = vm_region_submap_short_info_64; -pub type vm_page_info_t = *mut ::libc::c_int; -pub type vm_page_info_flavor_t = ::libc::c_int; -pub type vm_page_info_basic_t = *mut vm_page_info_basic; -pub type vm_page_info_basic_data_t = vm_page_info_basic; -pub type mach_vm_read_entry_t = [mach_vm_read_entry; VM_MAP_ENTRY_MAX as usize]; - -pub const VM_REGION_INFO_MAX: ::libc::c_int = (1 << 10); -pub const VM_MAP_ENTRY_MAX: ::libc::c_int = (1 << 8); - -pub const VM_PAGE_INFO_BASIC: vm_page_info_flavor_t = 1; - -pub const VM_REGION_BASIC_INFO_64: vm_region_flavor_t = 9; -pub const VM_REGION_BASIC_INFO: vm_region_flavor_t = 10; -pub const VM_REGION_EXTENDED_INFO: vm_region_flavor_t = 13; -pub const VM_REGION_TOP_INFO: vm_region_flavor_t = 12; - -pub const SM_COW: ::libc::c_uchar = 1; -pub const SM_PRIVATE: ::libc::c_uchar = 2; -pub const SM_EMPTY: ::libc::c_uchar = 3; -pub const SM_SHARED: ::libc::c_uchar = 4; -pub const SM_TRUESHARED: ::libc::c_uchar = 5; -pub const SM_PRIVATE_ALIASED: ::libc::c_uchar = 6; -pub const SM_SHARED_ALIASED: ::libc::c_uchar = 7; - -#[repr(C, packed(4))] -#[derive(Copy, Clone, Debug, Default, Hash, PartialOrd, PartialEq, Eq, Ord)] -pub struct vm_region_basic_info_64 { - pub protection: vm_prot_t, - pub max_protection: vm_prot_t, - pub inheritance: vm_inherit_t, - pub shared: boolean_t, - pub reserved: boolean_t, - pub offset: memory_object_offset_t, - pub behavior: vm_behavior_t, - pub user_wired_count: ::libc::c_ushort, -} - -impl vm_region_basic_info_64 { - pub fn count() -> mach_msg_type_number_t { - (mem::size_of::() / mem::size_of::<::libc::c_int>()) as mach_msg_type_number_t - } -} - -#[repr(C)] -#[derive(Copy, Clone, Debug, Default, Hash, PartialOrd, PartialEq, Eq, Ord)] -pub struct vm_region_basic_info { - pub protection: vm_prot_t, - pub max_protection: vm_prot_t, - pub inheritance: vm_inherit_t, - pub shared: boolean_t, - pub reserved: boolean_t, - pub offset: u32, - pub behavior: vm_behavior_t, - pub user_wired_count: ::libc::c_ushort, -} - -impl vm_region_basic_info { - pub fn count() -> mach_msg_type_number_t { - (mem::size_of::() / mem::size_of::<::libc::c_int>()) as mach_msg_type_number_t - } -} - -#[repr(C)] -#[derive(Copy, Clone, Debug, Default, Hash, PartialOrd, PartialEq, Eq, Ord)] -pub struct vm_region_extended_info { - pub protection: vm_prot_t, - pub user_tag: ::libc::c_uint, - pub pages_resident: ::libc::c_uint, - pub pages_shared_now_private: ::libc::c_uint, - pub pages_swapped_out: ::libc::c_uint, - pub pages_dirtied: ::libc::c_uint, - pub ref_count: ::libc::c_uint, - pub shadow_depth: ::libc::c_ushort, - pub external_pager: ::libc::c_uchar, - pub share_mode: ::libc::c_uchar, - pub pages_reusable: ::libc::c_uint, -} - -impl vm_region_extended_info { - pub fn count() -> mach_msg_type_number_t { - (mem::size_of::() / mem::size_of::<::libc::c_int>()) as mach_msg_type_number_t - } -} - -#[repr(C)] -#[derive(Copy, Clone, Debug, Default, Hash, PartialOrd, PartialEq, Eq, Ord)] -pub struct vm_region_top_info { - pub obj_id: ::libc::c_uint, - pub ref_count: ::libc::c_uint, - pub private_pages_resident: ::libc::c_uint, - pub shared_pages_resident: ::libc::c_uint, - pub share_mode: ::libc::c_uchar, -} - -impl vm_region_top_info { - pub fn count() -> mach_msg_type_number_t { - (mem::size_of::() / mem::size_of::<::libc::c_int>()) as mach_msg_type_number_t - } -} - -#[repr(C)] -#[derive(Copy, Clone, Debug, Default, Hash, PartialOrd, PartialEq, Eq, Ord)] -pub struct vm_region_submap_info { - pub protection: vm_prot_t, - pub max_protection: vm_prot_t, - pub inheritance: vm_inherit_t, - pub offset: u32, - pub user_tag: ::libc::c_uint, - pub pages_resident: ::libc::c_uint, - pub pages_shared_now_private: ::libc::c_uint, - pub pages_swapped_out: ::libc::c_uint, - pub pages_dirtied: ::libc::c_uint, - pub ref_count: ::libc::c_uint, - pub shadow_depth: ::libc::c_ushort, - pub external_pager: ::libc::c_uchar, - pub share_mode: ::libc::c_uchar, - pub is_submap: boolean_t, - pub behavior: vm_behavior_t, - pub object_id: vm32_object_id_t, - pub user_wired_count: ::libc::c_ushort, -} - -impl vm_region_submap_info { - pub fn count() -> mach_msg_type_number_t { - (mem::size_of::() / mem::size_of::<::libc::c_int>()) as mach_msg_type_number_t - } -} - -#[repr(C, packed(4))] -#[derive(Copy, Clone, Debug, Default, Hash, PartialOrd, PartialEq, Eq, Ord)] -pub struct vm_region_submap_info_64 { - pub protection: vm_prot_t, - pub max_protection: vm_prot_t, - pub inheritance: vm_inherit_t, - pub offset: memory_object_offset_t, - pub user_tag: ::libc::c_uint, - pub pages_resident: ::libc::c_uint, - pub pages_shared_now_private: ::libc::c_uint, - pub pages_swapped_out: ::libc::c_uint, - pub pages_dirtied: ::libc::c_uint, - pub ref_count: ::libc::c_uint, - pub shadow_depth: ::libc::c_ushort, - pub external_pager: ::libc::c_uchar, - pub share_mode: ::libc::c_uchar, - pub is_submap: boolean_t, - pub behavior: vm_behavior_t, - pub object_id: vm32_object_id_t, - pub user_wired_count: ::libc::c_ushort, - pub pages_reusable: ::libc::c_uint, -} - -impl vm_region_submap_info_64 { - pub fn count() -> mach_msg_type_number_t { - (mem::size_of::() / mem::size_of::<::libc::c_int>()) as mach_msg_type_number_t - } -} - -#[repr(C, packed(4))] -#[derive(Copy, Clone, Debug, Default, Hash, PartialOrd, PartialEq, Eq, Ord)] -pub struct vm_region_submap_short_info_64 { - pub protection: vm_prot_t, - pub max_protection: vm_prot_t, - pub inheritance: vm_inherit_t, - pub offset: memory_object_offset_t, - pub user_tag: ::libc::c_uint, - pub ref_count: ::libc::c_uint, - pub shadow_depth: ::libc::c_ushort, - pub external_pager: ::libc::c_uchar, - pub share_mode: ::libc::c_uchar, - pub is_submap: boolean_t, - pub behavior: vm_behavior_t, - pub object_id: vm32_object_id_t, - pub user_wired_count: ::libc::c_ushort, -} - -impl vm_region_submap_short_info_64 { - pub fn count() -> mach_msg_type_number_t { - (mem::size_of::() / mem::size_of::<::libc::c_int>()) as mach_msg_type_number_t - } -} - -#[repr(C)] -#[derive(Copy, Clone, Debug, Default, Hash, PartialOrd, PartialEq, Eq, Ord)] -pub struct vm_page_info_basic { - pub disposition: ::libc::c_int, - pub ref_count: ::libc::c_int, - pub object_id: vm_object_id_t, - pub offset: memory_object_offset_t, - pub depth: ::libc::c_int, - pub __pad: ::libc::c_int, -} - -impl vm_page_info_basic { - pub fn count() -> mach_msg_type_number_t { - (mem::size_of::() / mem::size_of::<::libc::c_int>()) as mach_msg_type_number_t - } -} - -#[repr(C, packed(4))] -#[derive(Copy, Clone, Debug, Default, Hash, PartialOrd, PartialEq, Eq, Ord)] -pub struct mach_vm_read_entry { - pub address: mach_vm_address_t, - pub size: mach_vm_size_t, -} diff -Nru temporalio-1.3.0/vendor/mach/src/vm.rs temporalio-1.3.0/vendor/mach/src/vm.rs --- temporalio-1.3.0/vendor/mach/src/vm.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach/src/vm.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,247 +0,0 @@ -//! This module roughly corresponds to `mach/mach_vm.defs`. - -use boolean::boolean_t; -use kern_return::kern_return_t; -use mach_types::{mem_entry_name_port_t, vm_task_entry_t}; -use memory_object_types::{memory_object_offset_t, memory_object_size_t}; -use message::mach_msg_type_number_t; -use port::mach_port_t; -use vm_attributes::{vm_machine_attribute_t, vm_machine_attribute_val_t}; -use vm_behavior::vm_behavior_t; -use vm_inherit::vm_inherit_t; -use vm_prot::vm_prot_t; -use vm_purgable::vm_purgable_t; -use vm_region::mach_vm_read_entry_t; -use vm_region::{ - vm_page_info_flavor_t, vm_page_info_t, vm_region_flavor_t, vm_region_info_t, - vm_region_recurse_info_t, -}; -use vm_sync::vm_sync_t; -use vm_types::{ - integer_t, mach_vm_address_t, mach_vm_offset_t, mach_vm_size_t, natural_t, vm_map_t, - vm_offset_t, vm_size_t, -}; - -extern "C" { - pub fn mach_vm_allocate( - target: vm_task_entry_t, - address: *mut mach_vm_address_t, - size: mach_vm_size_t, - flags: ::libc::c_int, - ) -> kern_return_t; - - pub fn mach_vm_deallocate( - target: vm_task_entry_t, - address: mach_vm_address_t, - size: mach_vm_size_t, - ) -> kern_return_t; - - pub fn mach_vm_protect( - target_task: vm_task_entry_t, - address: mach_vm_address_t, - size: mach_vm_size_t, - set_maximum: boolean_t, - new_protection: vm_prot_t, - ) -> kern_return_t; - - pub fn mach_vm_inherit( - target_task: vm_task_entry_t, - address: mach_vm_address_t, - size: mach_vm_size_t, - new_inheritance: vm_inherit_t, - ) -> kern_return_t; - - pub fn mach_vm_read( - target_task: vm_task_entry_t, - address: mach_vm_address_t, - size: mach_vm_size_t, - data: *mut vm_offset_t, - dataCnt: *mut mach_msg_type_number_t, - ) -> kern_return_t; - - pub fn mach_vm_read_list( - target_task: vm_task_entry_t, - data_list: mach_vm_read_entry_t, - count: natural_t, - ) -> kern_return_t; - - pub fn mach_vm_write( - target_task: vm_map_t, - address: mach_vm_address_t, - data: vm_offset_t, - dataCnt: mach_msg_type_number_t, - ) -> kern_return_t; - - pub fn mach_vm_copy( - target_task: vm_task_entry_t, - source_address: mach_vm_address_t, - size: mach_vm_size_t, - dest_address: mach_vm_address_t, - ) -> kern_return_t; - - pub fn mach_vm_read_overwrite( - target_task: vm_task_entry_t, - address: mach_vm_address_t, - size: mach_vm_size_t, - data: mach_vm_address_t, - outsize: *mut mach_vm_size_t, - ) -> kern_return_t; - - pub fn mach_vm_msync( - target_task: vm_task_entry_t, - address: mach_vm_address_t, - size: mach_vm_size_t, - sync_flags: vm_sync_t, - ) -> kern_return_t; - - pub fn mach_vm_behavior_set( - target_task: vm_task_entry_t, - address: mach_vm_address_t, - size: mach_vm_size_t, - new_behavior: vm_behavior_t, - ) -> kern_return_t; - - pub fn mach_vm_map( - target_task: vm_task_entry_t, - inout: *mut mach_vm_address_t, - size: mach_vm_size_t, - mask: mach_vm_offset_t, - flags: ::libc::c_int, - object: mem_entry_name_port_t, - offset: memory_object_offset_t, - copy: boolean_t, - cur_protection: vm_prot_t, - max_protection: vm_prot_t, - inheritance: vm_inherit_t, - ) -> kern_return_t; - - pub fn mach_vm_machine_attribute( - target_task: vm_task_entry_t, - address: mach_vm_address_t, - size: mach_vm_size_t, - attribute: vm_machine_attribute_t, - value: *mut vm_machine_attribute_val_t, - ) -> kern_return_t; - - pub fn mach_vm_remap( - target_task: vm_task_entry_t, - target_address: *mut mach_vm_address_t, - size: mach_vm_size_t, - mask: mach_vm_offset_t, - flags: ::libc::c_int, - src_task: vm_task_entry_t, - src_address: mach_vm_address_t, - copy: boolean_t, - cur_protection: *mut vm_prot_t, - out: *mut vm_prot_t, - inheritance: vm_inherit_t, - ) -> kern_return_t; - - pub fn mach_vm_page_query( - target_map: vm_map_t, - offset: mach_vm_offset_t, - disposition: *mut integer_t, - ref_count: *mut integer_t, - ) -> kern_return_t; - - pub fn mach_vm_region_recurse( - target_task: vm_task_entry_t, - address: *mut mach_vm_address_t, - size: *mut mach_vm_size_t, - nesting_depth: *mut natural_t, - info: vm_region_recurse_info_t, - infoCnt: *mut mach_msg_type_number_t, - ) -> kern_return_t; - - pub fn mach_vm_region( - target_task: vm_task_entry_t, - address: *mut mach_vm_address_t, - size: *mut mach_vm_size_t, - flavor: vm_region_flavor_t, - info: vm_region_info_t, - infoCnt: *mut mach_msg_type_number_t, - object_name: *mut mach_port_t, - ) -> kern_return_t; - - pub fn mach_make_memory_entry( - target_task: vm_map_t, - size: *mut vm_size_t, - offset: vm_offset_t, - permission: vm_prot_t, - object_handle: *mut mem_entry_name_port_t, - parent_handle: mem_entry_name_port_t, - ) -> kern_return_t; - - pub fn mach_make_memory_entry_64( - target_task: vm_map_t, - size: *mut memory_object_size_t, - offset: memory_object_offset_t, - permission: vm_prot_t, - object_handle: *mut mach_port_t, - parent_entry: mem_entry_name_port_t, - ) -> kern_return_t; - - pub fn mach_vm_purgable_control( - target_task: vm_task_entry_t, - address: mach_vm_address_t, - control: vm_purgable_t, - state: *mut ::libc::c_int, - ) -> kern_return_t; - - pub fn mach_vm_page_info( - target_task: vm_task_entry_t, - address: mach_vm_address_t, - flavor: vm_page_info_flavor_t, - info: vm_page_info_t, - infoCnt: *mut mach_msg_type_number_t, - ) -> kern_return_t; -} - -#[cfg(test)] -mod tests { - use super::*; - use kern_return::KERN_SUCCESS; - use traps::mach_task_self; - use vm_statistics::VM_FLAGS_ANYWHERE; - - #[test] - fn mach_vm_allocate_sanity() { - unsafe { - let size = 0x100; - let task = mach_task_self(); - - let mut address: mach_vm_address_t = 0; - assert_eq!( - mach_vm_allocate(task, &mut address, size, VM_FLAGS_ANYWHERE), - KERN_SUCCESS - ); - assert_eq!(mach_vm_deallocate(task, address, size), KERN_SUCCESS); - } - } - - #[test] - fn mach_vm_region_sanity() { - use mem; - use vm_prot::{VM_PROT_EXECUTE, VM_PROT_READ}; - use vm_region::{vm_region_basic_info_64, VM_REGION_BASIC_INFO_64}; - unsafe { - let mut size = 0x10; - let mut object_name = 0; - let mut address = mach_vm_region_sanity as mach_vm_address_t; - let mut info: vm_region_basic_info_64 = mem::zeroed(); - let mut info_size = vm_region_basic_info_64::count(); - - let result = mach_vm_region( - mach_task_self(), - &mut address, - &mut size, - VM_REGION_BASIC_INFO_64, - (&mut info as *mut _) as vm_region_info_t, - &mut info_size, - &mut object_name, - ); - assert_eq!(result, KERN_SUCCESS); - assert_eq!(info.protection, VM_PROT_READ | VM_PROT_EXECUTE); - } - } -} diff -Nru temporalio-1.3.0/vendor/mach/src/vm_statistics.rs temporalio-1.3.0/vendor/mach/src/vm_statistics.rs --- temporalio-1.3.0/vendor/mach/src/vm_statistics.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach/src/vm_statistics.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,78 +0,0 @@ -//! This module roughly corresponds to `mach/vm_statistics.h` - -use vm_types::{integer_t, natural_t}; - -pub type vm_statistics_t = *mut vm_statistics; -pub type vm_statistics_data_t = vm_statistics; -#[cfg(feature = "deprecated")] -#[deprecated( - since = "0.2.3", - note = "`pmap_statistics_t` was removed after MacOSX 10.3.9" -)] -#[allow(deprecated)] -pub type pmap_statistics_t = *mut pmap_statistics; - -pub const VM_PAGE_QUERY_PAGE_PRESENT: integer_t = 1; -pub const VM_PAGE_QUERY_PAGE_FICTITIOUS: integer_t = (1 << 1); -pub const VM_PAGE_QUERY_PAGE_REF: integer_t = (1 << 2); -pub const VM_PAGE_QUERY_PAGE_DIRTY: integer_t = (1 << 3); - -pub const VM_MEMORY_MALLOC: ::libc::c_uint = 1; -pub const VM_MEMORY_MALLOC_SMALL: ::libc::c_uint = 2; -pub const VM_MEMORY_MALLOC_LARGE: ::libc::c_uint = 3; -pub const VM_MEMORY_MALLOC_HUGE: ::libc::c_uint = 4; -pub const VM_MEMORY_SBRK: ::libc::c_uint = 5; -pub const VM_MEMORY_ANALYSIS_TOOL: ::libc::c_uint = 10; -pub const VM_MEMORY_MACH_MSG: ::libc::c_uint = 20; -pub const VM_MEMORY_IOKIT: ::libc::c_uint = 21; -pub const VM_MEMORY_STACK: ::libc::c_uint = 30; -pub const VM_MEMORY_GUARD: ::libc::c_uint = 31; -pub const VM_MEMORY_SHARED_PMAP: ::libc::c_uint = 32; -pub const VM_MEMORY_DYLIB: ::libc::c_uint = 33; -pub const VM_MEMORY_APPKIT: ::libc::c_uint = 40; -pub const VM_MEMORY_FOUNDATION: ::libc::c_uint = 41; -pub const VM_MEMORY_COREGRAPHICS: ::libc::c_uint = 42; -pub const VM_MEMORY_CARBON: ::libc::c_uint = 43; -pub const VM_MEMORY_JAVA: ::libc::c_uint = 44; -pub const VM_MEMORY_ATS: ::libc::c_uint = 50; -pub const VM_MEMORY_DYLD: ::libc::c_uint = 60; -pub const VM_MEMORY_DYLD_MALLOC: ::libc::c_uint = 61; -pub const VM_MEMORY_APPLICATION_SPECIFIC_1: ::libc::c_uint = 240; -pub const VM_MEMORY_APPLICATION_SPECIFIC_16: ::libc::c_uint = 255; - -pub const VM_FLAGS_FIXED: ::libc::c_int = 0x0; -pub const VM_FLAGS_ANYWHERE: ::libc::c_int = 0x1; -pub const VM_FLAGS_OVERWRITE: ::libc::c_int = 0x4000; - -#[repr(C)] -#[derive(Copy, Clone, Debug, Default, Hash, PartialOrd, PartialEq, Eq, Ord)] -pub struct vm_statistics { - pub free_count: natural_t, - pub active_count: natural_t, - pub inactive_count: natural_t, - pub wire_count: natural_t, - pub zero_fill_count: natural_t, - pub reactivations: natural_t, - pub pageins: natural_t, - pub pageouts: natural_t, - pub faults: natural_t, - pub cow_faults: natural_t, - pub lookups: natural_t, - pub hits: natural_t, - pub purgeable_count: natural_t, - pub purges: natural_t, - pub speculative_count: natural_t, -} - -#[cfg(feature = "deprecated")] -#[deprecated( - since = "0.2.3", - note = "`pmap_statistics` was removed after MacOSX 10.3.9" -)] -#[cfg_attr(feature = "deprecated", allow(deprecated))] -#[repr(C)] -#[derive(Copy, Clone, Debug, Default, Hash, PartialOrd, PartialEq, Eq, Ord)] -pub struct pmap_statistics { - pub resident_count: integer_t, - pub wired_count: integer_t, -} diff -Nru temporalio-1.3.0/vendor/mach/src/vm_sync.rs temporalio-1.3.0/vendor/mach/src/vm_sync.rs --- temporalio-1.3.0/vendor/mach/src/vm_sync.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach/src/vm_sync.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,11 +0,0 @@ -//! This module corresponds to `mach/vm_sync.h`. - -pub type vm_sync_t = ::libc::c_uint; - -pub const VM_SYNC_ASYNCHRONOUS: vm_sync_t = 1; -pub const VM_SYNC_SYNCHRONOUS: vm_sync_t = (1 << 1); -pub const VM_SYNC_INVALIDATE: vm_sync_t = (1 << 2); -pub const VM_SYNC_KILLPAGES: vm_sync_t = (1 << 3); -pub const VM_SYNC_DEACTIVATE: vm_sync_t = (1 << 4); -pub const VM_SYNC_CONTIGUOUS: vm_sync_t = (1 << 5); -pub const VM_SYNC_REUSABLEPAGES: vm_sync_t = (1 << 6); diff -Nru temporalio-1.3.0/vendor/mach/src/vm_types.rs temporalio-1.3.0/vendor/mach/src/vm_types.rs --- temporalio-1.3.0/vendor/mach/src/vm_types.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach/src/vm_types.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,19 +0,0 @@ -//! This module roughly corresponds to `mach/i386/vm_types.h`. - -pub type natural_t = ::libc::c_uint; -pub type integer_t = ::libc::c_int; - -pub type user_addr_t = u64; - -pub type mach_vm_address_t = u64; -pub type mach_vm_offset_t = u64; -pub type mach_vm_size_t = u64; -pub type vm_map_offset_t = u64; -pub type vm_map_address_t = u64; -pub type vm_map_size_t = u64; -pub type vm_map_t = ::port::mach_port_t; -pub type vm_offset_t = ::libc::uintptr_t; -pub type vm_size_t = ::libc::uintptr_t; -pub type vm_address_t = vm_offset_t; - -pub type mach_port_context_t = mach_vm_address_t; diff -Nru temporalio-1.3.0/vendor/mach2/.cargo-checksum.json temporalio-1.3.0/vendor/mach2/.cargo-checksum.json --- temporalio-1.3.0/vendor/mach2/.cargo-checksum.json 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach2/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1 @@ +{"files":{"Cargo.toml":"e6cb1c9aa2b65d61801e0f03de848525a9f7104234db25d0b1c9fa337b372626","LICENSE-APACHE":"62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a","LICENSE-BSD":"044983df14c97f2f9570766aaf977b3cdfc4a06cf1f36b776331c5ff89b4fb89","LICENSE-MIT":"3f9f0f7e5a5911a8042e32c83ff5d061ce1ffd02e8a207ec2135a44ad73b4191","README.md":"c2cb79f8e79e22b13e4c25e43829bf578ef25a3a338d5553081a1e5f39556fa8","src/boolean.rs":"1d24ea9872748881cd7269a383a7c344e3a650df23f0e44e3b6c266fb8205d9a","src/bootstrap.rs":"a5ab69d74ad8bfb8fad1cb45c8c571977c0bf907a70e767309a437580cee184c","src/clock.rs":"a33c1bfb2f174abb695d164c469ee744be52fec4bc345656e6027d063e150d71","src/clock_priv.rs":"a8e6a96896a94eda67c9fb6e45c564581a711cc9fdcf7674251bb6c0c28b47c2","src/clock_reply.rs":"bac04b6602dcdd4daac8e3a0a1e56fa4b6de20cf2c3fe7bb583358166aca8a3b","src/clock_types.rs":"d55d1d2a953e477f9dd064bd684b118235aa7bd79de85cdeaf75e21510aaaefa","src/dyld_kernel.rs":"566a17f597aa29619a1ce15f6b22577fc70ac5356f96e00fddbcb28560a5c83c","src/exc.rs":"2246493bef2c596b92f115ab673a10d50c6003d11abb8e73d7707ebc19e8ae5a","src/exception_types.rs":"c7894831d73145adb1a4b5d2a5d0b346f2b2dc05382b97f2f3f0275d337f6dfc","src/kern_return.rs":"153339995674136ef05d9595bdcf831595db0d0714a737ecd1ccd45391c56657","src/lib.rs":"4c8a9d906303a67246b32b6f96228bff6b045deb0a68073a7f8d1061c8d072bd","src/mach_init.rs":"df49bd287fd05fb74bc76254df7607fad0d6b90cb20da803e9f9a1dc2fcfe2fc","src/mach_port.rs":"d71ef4f4875824410d2d829474303926a56e3218a00fbe04024801a3245b67ad","src/mach_time.rs":"b9493e820acf21fee1f6e7e82a510d887925dc1117d6b71b681acc40cfa776af","src/mach_types.rs":"e2d17741ebcdcdff9686ec9ee5c90fb7a150ce990979507da01c351771fb3a19","src/memory_object_types.rs":"6fcb446c00ddd5ef4920efe618bd89df2e87f7ae3cf660a2bc1d25cf1f331dc2","src/message.rs":"126dfcdef0f690cd17f4403528403721b81f7e6a95821eff867d11dd6bfa9718","src/port.rs":"7ef8af905edd7d0de9c11813d6cf56ae82171e85efdde2c986622be0e7debf6f","src/structs.rs":"132e21e91313e6ec13e3ad5ed9c71852e8a55fbbaba449dbb1b3ca889bed4889","src/task.rs":"282ea602db2d08711785e0050a06b322a3fe4a4aac34b3c9116fe13e033898dd","src/task_info.rs":"cf87cffe567fee8871e0ce9762b7d8bbd5058dfbb309678d382149dedbe7f14a","src/thread_act.rs":"647198e0f9e3fe409a0610ee98560de3af4f152bcc4761f943e67723193b8a25","src/thread_policy.rs":"e8999b03a03d398a456056274ed8ebc4c38a1cbbbba2da931503885da0e9c2e3","src/thread_status.rs":"3fe98fadd61ce01b4f9dc3bc0ef8c9496798f0147822a4ddffe5d0eaf2f32c0a","src/traps.rs":"59a65e0cc3cf67d79180eabfe31248287afa7a2daa58ec367ebb6302ff39f4cb","src/vm.rs":"1e3fe55704dbbc0c287ad543f5642389a823539f72b337cbff726d6927566b23","src/vm_attributes.rs":"7f73f41572d1ca854b45199a17e9008197f3898cfe6a82dba6d14293d49269c6","src/vm_behavior.rs":"a5d195a52602f5ebe2991774c2390a6f20f1bfa82168dd62e88f2804134da1f3","src/vm_inherit.rs":"dbc7432350869733d6e7cf1da8617d97aafbeb1afcb1bdc60ed7ab53e37abf61","src/vm_page_size.rs":"1cd209f8f6fbc4d3b7a44b77f5a3c53c578f357199e3c616b2386a63e5bfe70a","src/vm_prot.rs":"65e5f7179e155c600cec1a1b3e030f2d0d6b446a6ec9ebad0d04f56ccd884a86","src/vm_purgable.rs":"e32963f20905c4edd1cfee364ad489ef646ad7d401967d0ed9e1e7ed6cd57e5d","src/vm_region.rs":"905daa12391c0c3bca9200ceaecbd02dd03550bbdc9c3342dceeeb6e4056184f","src/vm_statistics.rs":"abee2c810b13fa007a7e38dd2b3d6460005e9e78f5972e069d7fc3e0df80190e","src/vm_sync.rs":"e6006b66f0fa1a06c5e853d765a9366aab85009cc77a095b93f902330cf4ec81","src/vm_types.rs":"a47f71193172ce233018dfd40de2b9a56cdfcdfb18e04c1c0761cb6fc36f51b8"},"package":"6d0d1830bcd151a6fc4aea1369af235b36c1528fe976b8ff678683c9995eade8"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/mach2/Cargo.toml temporalio-1.3.0/vendor/mach2/Cargo.toml --- temporalio-1.3.0/vendor/mach2/Cargo.toml 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach2/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,49 @@ +# 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 = "2015" +name = "mach2" +version = "0.4.1" +include = [ + "src/**/*", + "LICENSE-*", + "README.md", +] +description = "A Rust interface to the user-space API of the Mach 3.0 kernel that underlies OSX." +readme = "README.md" +keywords = [ + "kernel", + "macos", + "darwin", +] +categories = [ + "api-bindings", + "external-ffi-bindings", + "no-std", + "os", +] +license = "BSD-2-Clause OR MIT OR Apache-2.0" +repository = "https://github.com/JohnTitor/mach2" + +[package.metadata.docs.rs] +default-target = "x86_64-apple-darwin" + +[features] +default = [] +unstable = [] + +[target."cfg(any(target_os = \"macos\", target_os = \"ios\"))".dependencies.libc] +version = "0.2" +default-features = false + +[badges.maintenance] +status = "passively-maintained" diff -Nru temporalio-1.3.0/vendor/mach2/LICENSE-APACHE temporalio-1.3.0/vendor/mach2/LICENSE-APACHE --- temporalio-1.3.0/vendor/mach2/LICENSE-APACHE 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach2/LICENSE-APACHE 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,176 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS diff -Nru temporalio-1.3.0/vendor/mach2/LICENSE-BSD temporalio-1.3.0/vendor/mach2/LICENSE-BSD --- temporalio-1.3.0/vendor/mach2/LICENSE-BSD 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach2/LICENSE-BSD 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,23 @@ +Copyright (c) 2019 Nick Fitzgerald, 2021 Yuki Okushi +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff -Nru temporalio-1.3.0/vendor/mach2/LICENSE-MIT temporalio-1.3.0/vendor/mach2/LICENSE-MIT --- temporalio-1.3.0/vendor/mach2/LICENSE-MIT 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach2/LICENSE-MIT 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,25 @@ +Copyright (c) 2019 Nick Fitzgerald, 2021 Yuki Okushi + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff -Nru temporalio-1.3.0/vendor/mach2/README.md temporalio-1.3.0/vendor/mach2/README.md --- temporalio-1.3.0/vendor/mach2/README.md 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach2/README.md 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,92 @@ +# mach2 + +[![Latest Version]][crates.io] [![docs]][docs.rs] + +A Rust interface to the **user-space** API of the Mach 3.0 kernel exposed in +`/usr/include/mach` that underlies macOS and is linked via `libSystem` (and +`libsystem_kernel`). + +This library does not expose the **kernel-space** API of the Mach 3.0 kernel +exposed in +`SDK/System/Library/Frameworks/Kernel.framework/Versions/A/Headers/mach`. + +That is, if you are writing a kernel-resident device drivers or some other +kernel extensions you have to use something else. The user-space kernel API is +often API-incompatible with the kernel space one, and even in the cases where +they match, they are sometimes ABI incompatible such that using this library +would have **undefined behavior**. + +## Usage + +Add the following to your `Cargo.toml` to conditionally include mach on those +platforms that support it. + +```toml +[target.'cfg(any(target_os = "macos", target_os = "ios"))'.dependencies.mach] +version = "0.4" +``` + +Available crate feature: + +* **unstable** (disabled by default): Exposes newly changed APIs. Enabling this may + bring breaking changes (see the breaking change policy). + + +### Breaking change policy + +We do the following steps when an item is changed/removed on latest toolchain: + +1. Deprecate an existing one +2. Declare a new one under the `unstable` feature +3. After a month or more since releasing a new version that contains that change, + remove/change an older one + +For instance, if const `FOO` value is changed from `3` to `4`, +we expose the newer one, i.e. `4`, under `unstable` first. +So the `unstable` users should notice the change on the first release since deprecating. +After a month or more, all the users should notice it. + +## Platform support + +The following table describes the current CI set-up: + +| Target | Min. Rust | XCode | build | ctest | run | +|-------------------------|-----------|-----------------|-------|-------|-----| +| `x86_64-apple-darwin` | 1.33.0 | 10.3.0 - 13.1.0 | ✓ | ✓ | ✓ | +| `aarch64-apple-darwin` | nightly | 13.1.0 | ✓ | - | - | +| `aarch64-apple-ios` | nightly | 13.1.0 | ✓ | - | - | +| `aarch64-apple-ios-sim` | nightly | 13.1.0 | ✓ | - | - | +| `x86_64-apple-ios` | nightly | 13.1.0 | ✓ | - | - | + +## License + +This project is licensed under either of + +* A 2-clause BSD License ([LICENSE-BSD](LICENSE-BSD)), or +* Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or + http://www.apache.org/licenses/LICENSE-2.0) +* MIT license ([LICENSE-MIT](LICENSE-MIT) or + http://opensource.org/licenses/MIT) + +at your option. + +## Contribution + +Unless you explicitly state otherwise, any contribution intentionally submitted +for inclusion in `mach` by you, as defined in the Apache-2.0 license, shall be +triple licensed as above, without any additional terms or conditions. + +To locally test the library, run: + +``` +TARGET=x86_64-apple-darwin RUST_VERSION=nightly ./ci/run.sh +``` + +where you can replace the `TARGET` and `RUST_VERSION` with the target you +want to test (e.g. `aarch64-apple-darwin`) and the Rust version you want to use for +the tests (e.g. `stable`, `1.33.0`, etc.). + +[crates.io]: https://crates.io/crates/mach2 +[Latest Version]: https://img.shields.io/crates/v/mach2.svg +[docs]: https://docs.rs/mach2/badge.svg +[docs.rs]: https://docs.rs/mach2 diff -Nru temporalio-1.3.0/vendor/mach2/src/boolean.rs temporalio-1.3.0/vendor/mach2/src/boolean.rs --- temporalio-1.3.0/vendor/mach2/src/boolean.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach2/src/boolean.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,7 @@ +//! This module corresponds to `mach/i386/boolean.h`. + +#[cfg(target_arch = "x86_64")] +pub type boolean_t = ::libc::c_uint; + +#[cfg(not(target_arch = "x86_64"))] +pub type boolean_t = ::libc::c_int; diff -Nru temporalio-1.3.0/vendor/mach2/src/bootstrap.rs temporalio-1.3.0/vendor/mach2/src/bootstrap.rs --- temporalio-1.3.0/vendor/mach2/src/bootstrap.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach2/src/bootstrap.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,76 @@ +//! This module corresponds to `bootstrap.h` + +use boolean::boolean_t; +use kern_return::kern_return_t; +use port::mach_port_t; + +pub const BOOTSTRAP_MAX_NAME_LEN: ::libc::c_uint = 128; +pub const BOOTSTRAP_MAX_CMD_LEN: ::libc::c_uint = 512; + +pub const BOOTSTRAP_MAX_LOOKUP_COUNT: ::libc::c_uint = 20; + +pub const BOOTSTRAP_SUCCESS: ::libc::c_uint = 0; +pub const BOOTSTRAP_NOT_PRIVILEGED: ::libc::c_uint = 1100; +pub const BOOTSTRAP_NAME_IN_USE: ::libc::c_uint = 1101; +pub const BOOTSTRAP_UNKNOWN_SERVICE: ::libc::c_uint = 1102; +pub const BOOTSTRAP_SERVICE_ACTIVE: ::libc::c_uint = 1103; +pub const BOOTSTRAP_BAD_COUNT: ::libc::c_uint = 1104; +pub const BOOTSTRAP_NO_MEMORY: ::libc::c_uint = 1105; +pub const BOOTSTRAP_NO_CHILDREN: ::libc::c_uint = 1106; + +pub const BOOTSTRAP_STATUS_INACTIVE: ::libc::c_uint = 0; +pub const BOOTSTRAP_STATUS_ACTIVE: ::libc::c_uint = 1; +pub const BOOTSTRAP_STATUS_ON_DEMAND: ::libc::c_uint = 2; + +pub type name_t = [::libc::c_char; 128]; +pub type cmd_t = [::libc::c_char; 512]; +pub type name_array_t = *mut name_t; +pub type bootstrap_status_t = ::libc::c_int; +pub type bootstrap_status_array_t = *mut bootstrap_status_t; +pub type bootstrap_property_t = ::libc::c_uint; +pub type bootstrap_property_array_t = *mut bootstrap_property_t; +pub type bool_array_t = *mut boolean_t; + +extern "C" { + pub static bootstrap_port: mach_port_t; + pub fn bootstrap_create_server( + bp: mach_port_t, + server_cmd: *mut ::libc::c_char, + server_uid: ::libc::uid_t, + on_demand: boolean_t, + server_port: *mut mach_port_t, + ) -> kern_return_t; + pub fn bootstrap_subset( + bp: mach_port_t, + requestor_port: mach_port_t, + subset_port: *mut mach_port_t, + ) -> kern_return_t; + pub fn bootstrap_unprivileged(bp: mach_port_t, unpriv_port: *mut mach_port_t) -> kern_return_t; + pub fn bootstrap_parent(bp: mach_port_t, parent_port: *mut mach_port_t) -> kern_return_t; + pub fn bootstrap_register( + bp: mach_port_t, + service_name: *mut ::libc::c_char, + sp: mach_port_t, + ) -> kern_return_t; + pub fn bootstrap_create_service( + bp: mach_port_t, + service_name: *mut ::libc::c_char, + sp: *mut mach_port_t, + ) -> kern_return_t; + pub fn bootstrap_check_in( + bp: mach_port_t, + service_name: *const ::libc::c_char, + sp: *mut mach_port_t, + ) -> kern_return_t; + pub fn bootstrap_look_up( + bp: mach_port_t, + service_name: *const ::libc::c_char, + sp: *mut mach_port_t, + ) -> kern_return_t; + pub fn bootstrap_status( + bp: mach_port_t, + service_name: *mut ::libc::c_char, + service_active: *mut bootstrap_status_t, + ) -> kern_return_t; + pub fn bootstrap_strerror(r: kern_return_t) -> *const ::libc::c_char; +} diff -Nru temporalio-1.3.0/vendor/mach2/src/clock_priv.rs temporalio-1.3.0/vendor/mach2/src/clock_priv.rs --- temporalio-1.3.0/vendor/mach2/src/clock_priv.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach2/src/clock_priv.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,16 @@ +//! This module roughly corresponds to `mach/clock_priv.h`. + +use clock_types::{clock_attr_t, clock_flavor_t, mach_timespec_t}; +use kern_return::kern_return_t; +use mach_types::clock_ctrl_t; +use message::mach_msg_type_number_t; + +extern "C" { + pub fn clock_set_time(clock_ctrl: clock_ctrl_t, new_time: mach_timespec_t) -> kern_return_t; + pub fn clock_set_attributes( + clock_ctrl: clock_ctrl_t, + flavor: clock_flavor_t, + clock_attr: clock_attr_t, + clock_attrCnt: mach_msg_type_number_t, + ) -> kern_return_t; +} diff -Nru temporalio-1.3.0/vendor/mach2/src/clock_reply.rs temporalio-1.3.0/vendor/mach2/src/clock_reply.rs --- temporalio-1.3.0/vendor/mach2/src/clock_reply.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach2/src/clock_reply.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,16 @@ +//! This module roughly corresponds to `mach/clock_reply.h`. + +use clock_types::{alarm_type_t, mach_timespec_t}; +use kern_return::kern_return_t; +use mach_types::clock_reply_t; +use message::mach_msg_type_name_t; + +extern "C" { + pub fn clock_alarm_reply( + alarm_port: clock_reply_t, + alarm_portPoly: mach_msg_type_name_t, + alarm_code: kern_return_t, + alarm_type: alarm_type_t, + alarm_time: mach_timespec_t, + ) -> kern_return_t; +} diff -Nru temporalio-1.3.0/vendor/mach2/src/clock.rs temporalio-1.3.0/vendor/mach2/src/clock.rs --- temporalio-1.3.0/vendor/mach2/src/clock.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach2/src/clock.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,27 @@ +//! This module roughly corresponds to `mach/clock.h`. + +pub const clock_MSG_COUNT: ::libc::c_uint = 3; + +use clock_types::{alarm_type_t, clock_attr_t, clock_flavor_t, mach_timespec_t}; +use kern_return::kern_return_t; +use mach_types::{clock_reply_t, clock_serv_t}; +use message::mach_msg_type_number_t; + +extern "C" { + pub fn clock_get_time( + clock_serv: clock_serv_t, + cur_time: *mut mach_timespec_t, + ) -> kern_return_t; + pub fn clock_get_attributes( + clock_serv: clock_serv_t, + flavor: clock_flavor_t, + clock_attr: clock_attr_t, + clock_attrCnt: *mut mach_msg_type_number_t, + ) -> kern_return_t; + pub fn clock_alarm( + clock_serv: clock_serv_t, + alarm_type: alarm_type_t, + alarm_time: mach_timespec_t, + alarm_port: clock_reply_t, + ) -> kern_return_t; +} diff -Nru temporalio-1.3.0/vendor/mach2/src/clock_types.rs temporalio-1.3.0/vendor/mach2/src/clock_types.rs --- temporalio-1.3.0/vendor/mach2/src/clock_types.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach2/src/clock_types.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,75 @@ +//! This module roughly corresponds to `mach/clock_types.h`. + +pub type alarm_type_t = ::libc::c_int; +pub type sleep_type_t = ::libc::c_int; +pub type clock_id_t = ::libc::c_int; +pub type clock_flavor_t = ::libc::c_int; +pub type clock_attr_t = *mut ::libc::c_int; +pub type clock_res_t = ::libc::c_int; + +#[repr(C)] +#[derive(Copy, Clone, Debug, Default, Hash, PartialOrd, PartialEq, Eq, Ord)] +pub struct mach_timespec { + pub tv_sec: ::libc::c_uint, + pub tv_nsec: clock_res_t, +} +pub type mach_timespec_t = mach_timespec; + +pub const SYSTEM_CLOCK: ::libc::c_uint = 0; +pub const CALENDAR_CLOCK: ::libc::c_uint = 1; +pub const REALTIME_CLOCK: ::libc::c_uint = 0; + +pub const CLOCK_GET_TIME_RES: ::libc::c_uint = 1; +pub const CLOCK_ALARM_CURRES: ::libc::c_uint = 3; +pub const CLOCK_ALARM_MINRES: ::libc::c_uint = 4; +pub const CLOCK_ALARM_MAXRES: ::libc::c_uint = 5; + +pub const NSEC_PER_USEC: ::libc::c_ulonglong = 1000; +pub const USEC_PER_SEC: ::libc::c_ulonglong = 1_000_000; +pub const NSEC_PER_SEC: ::libc::c_ulonglong = 1_000_000_000; +pub const NSEC_PER_MSEC: ::libc::c_ulonglong = 1_000_000; + +#[allow(non_snake_case)] +pub fn BAD_MACH_TIMESPEC(t: mach_timespec) -> bool { + t.tv_nsec < 0 || (t.tv_nsec as ::libc::c_ulonglong) >= NSEC_PER_SEC +} + +#[allow(non_snake_case)] +pub fn CMP_MACH_TIMESPEC(t1: &mach_timespec, t2: &mach_timespec) -> ::libc::c_ulonglong { + if t1.tv_sec > t2.tv_sec { + return NSEC_PER_SEC; + } + if t1.tv_sec < t2.tv_sec { + return !NSEC_PER_SEC; + } + (t1.tv_nsec as ::libc::c_ulonglong) - (t2.tv_nsec as ::libc::c_ulonglong) +} + +#[allow(non_snake_case)] +pub fn ADD_MACH_TIMESPEC(t1: &mut mach_timespec, t2: &mach_timespec) { + t1.tv_nsec += t2.tv_nsec; + if (t1.tv_nsec as ::libc::c_ulonglong) >= NSEC_PER_SEC { + t1.tv_nsec = (t1.tv_nsec as ::libc::c_ulonglong - NSEC_PER_SEC) as clock_res_t; + t1.tv_sec += 1; + } + t1.tv_sec += t2.tv_sec; +} + +#[allow(non_snake_case)] +pub fn SUB_MACH_TIMESPEC(t1: &mut mach_timespec, t2: &mach_timespec) { + t1.tv_nsec -= t2.tv_nsec; + if t1.tv_nsec < 0 { + t1.tv_nsec = (t1.tv_nsec as ::libc::c_ulonglong + NSEC_PER_SEC) as clock_res_t; + t1.tv_sec -= 1; + } + t1.tv_sec -= t2.tv_sec; +} + +pub const ALRMTYPE: ::libc::c_uint = 0xff; +pub const TIME_ABSOLUTE: ::libc::c_uint = 0x00; +pub const TIME_RELATIVE: ::libc::c_uint = 0x01; + +#[allow(non_snake_case)] +pub fn BAD_ALRMTYPE(t: ::libc::c_uint) -> bool { + t & (!TIME_RELATIVE) != 0 +} diff -Nru temporalio-1.3.0/vendor/mach2/src/dyld_kernel.rs temporalio-1.3.0/vendor/mach2/src/dyld_kernel.rs --- temporalio-1.3.0/vendor/mach2/src/dyld_kernel.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach2/src/dyld_kernel.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,30 @@ +//! This module roughly corresponds to `mach/dyld_kernel.h`. + +use boolean::boolean_t; +use mach_types::{fsid_t, fsobj_id_t, uuid_t}; + +#[repr(C)] +#[derive(Copy, Clone, Debug, Default, Hash, PartialOrd, PartialEq, Eq, Ord)] +pub struct dyld_kernel_image_info { + pub uuid: uuid_t, + pub fsobjid: fsobj_id_t, + pub fsid: fsid_t, + pub load_addr: u64, +} + +#[allow(non_snake_case)] +#[repr(C)] +#[derive(Copy, Clone, Debug, Default, Hash, PartialOrd, PartialEq, Eq, Ord)] +pub struct dyld_kernel_process_info { + pub cache_image_info: dyld_kernel_image_info, + pub timestamp: u64, + pub imageCount: u32, + pub initialImageCount: u32, + pub dyldState: u8, + pub no_cache: boolean_t, + pub private_cache: boolean_t, +} + +pub type dyld_kernel_image_info_t = dyld_kernel_image_info; +pub type dyld_kernel_process_info_t = dyld_kernel_process_info; +pub type dyld_kernel_image_info_array_t = *mut dyld_kernel_image_info_t; diff -Nru temporalio-1.3.0/vendor/mach2/src/exception_types.rs temporalio-1.3.0/vendor/mach2/src/exception_types.rs --- temporalio-1.3.0/vendor/mach2/src/exception_types.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach2/src/exception_types.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,56 @@ +//! This module roughly corresponds to `mach/exception_types.h`. + +use port::mach_port_t; +use thread_status::thread_state_flavor_t; +use vm_types::integer_t; + +pub const EXC_BAD_ACCESS: ::libc::c_uint = 1; +pub const EXC_BAD_INSTRUCTION: ::libc::c_uint = 2; +pub const EXC_ARITHMETIC: ::libc::c_uint = 3; +pub const EXC_EMULATION: ::libc::c_uint = 4; +pub const EXC_SOFTWARE: ::libc::c_uint = 5; +pub const EXC_BREAKPOINT: ::libc::c_uint = 6; +pub const EXC_SYSCALL: ::libc::c_uint = 7; +pub const EXC_MACH_SYSCALL: ::libc::c_uint = 8; +pub const EXC_RPC_ALERT: ::libc::c_uint = 9; +pub const EXC_CRASH: ::libc::c_uint = 10; +pub const EXC_RESOURCE: ::libc::c_uint = 11; +pub const EXC_GUARD: ::libc::c_uint = 12; +pub const EXC_CORPSE_NOTIFY: ::libc::c_uint = 13; +pub const EXC_CORPSE_VARIANT_BIT: ::libc::c_uint = 256; +pub const EXCEPTION_DEFAULT: ::libc::c_uint = 1; +pub const EXCEPTION_STATE: ::libc::c_uint = 2; +pub const EXCEPTION_STATE_IDENTITY: ::libc::c_uint = 3; +pub const MACH_EXCEPTION_CODES: ::libc::c_uint = 2_147_483_648; +pub const EXC_MASK_BAD_ACCESS: ::libc::c_uint = 2; +pub const EXC_MASK_BAD_INSTRUCTION: ::libc::c_uint = 4; +pub const EXC_MASK_ARITHMETIC: ::libc::c_uint = 8; +pub const EXC_MASK_EMULATION: ::libc::c_uint = 16; +pub const EXC_MASK_SOFTWARE: ::libc::c_uint = 32; +pub const EXC_MASK_BREAKPOINT: ::libc::c_uint = 64; +pub const EXC_MASK_SYSCALL: ::libc::c_uint = 128; +pub const EXC_MASK_MACH_SYSCALL: ::libc::c_uint = 256; +pub const EXC_MASK_RPC_ALERT: ::libc::c_uint = 512; +pub const EXC_MASK_CRASH: ::libc::c_uint = 1024; +pub const EXC_MASK_RESOURCE: ::libc::c_uint = 2048; +pub const EXC_MASK_GUARD: ::libc::c_uint = 4096; +pub const EXC_MASK_CORPSE_NOTIFY: ::libc::c_uint = 8192; +pub const EXC_MASK_ALL: ::libc::c_uint = 7166; +pub const FIRST_EXCEPTION: ::libc::c_uint = 1; +pub const EXC_SOFT_SIGNAL: ::libc::c_uint = 65_539; +pub const EXC_MACF_MIN: ::libc::c_uint = 131_072; +pub const EXC_MACF_MAX: ::libc::c_uint = 196_607; + +pub type exception_type_t = ::libc::c_int; +pub type exception_data_type_t = integer_t; +pub type mach_exception_data_type_t = i64; +pub type exception_behavior_t = ::libc::c_int; +pub type exception_data_t = *mut exception_data_type_t; +pub type mach_exception_data_t = *mut mach_exception_data_type_t; +pub type exception_mask_t = ::libc::c_uint; +pub type exception_mask_array_t = *mut exception_mask_t; +pub type exception_behavior_array_t = *mut exception_behavior_t; +pub type exception_flavor_array_t = *mut thread_state_flavor_t; +pub type exception_port_array_t = *mut mach_port_t; +pub type mach_exception_code_t = mach_exception_data_type_t; +pub type mach_exception_subcode_t = mach_exception_data_type_t; diff -Nru temporalio-1.3.0/vendor/mach2/src/exc.rs temporalio-1.3.0/vendor/mach2/src/exc.rs --- temporalio-1.3.0/vendor/mach2/src/exc.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach2/src/exc.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,44 @@ +//! This module roughly corresponds to `mach/exc.h`. + +use exception_types::{exception_data_t, exception_type_t}; +use kern_return::kern_return_t; +use message::mach_msg_type_number_t; +use port::mach_port_t; +use thread_status::thread_state_t; + +pub const exc_MSG_COUNT: ::libc::c_uint = 3; + +extern "C" { + pub fn exception_raise( + exception_port: mach_port_t, + thread: mach_port_t, + task: mach_port_t, + exception: exception_type_t, + code: exception_data_t, + codeCnt: mach_msg_type_number_t, + ) -> kern_return_t; + pub fn exception_raise_state( + exception_port: mach_port_t, + exception: exception_type_t, + code: exception_data_t, + codeCnt: mach_msg_type_number_t, + flavor: *mut ::libc::c_int, + old_state: thread_state_t, + old_stateCnt: mach_msg_type_number_t, + new_state: thread_state_t, + new_stateCnt: *mut mach_msg_type_number_t, + ) -> kern_return_t; + pub fn exception_raise_state_identity( + exception_port: mach_port_t, + thread: mach_port_t, + task: mach_port_t, + exception: exception_type_t, + code: exception_data_t, + codeCnt: mach_msg_type_number_t, + flavor: *mut ::libc::c_int, + old_state: thread_state_t, + old_stateCnt: mach_msg_type_number_t, + new_state: thread_state_t, + new_stateCnt: *mut mach_msg_type_number_t, + ) -> kern_return_t; +} diff -Nru temporalio-1.3.0/vendor/mach2/src/kern_return.rs temporalio-1.3.0/vendor/mach2/src/kern_return.rs --- temporalio-1.3.0/vendor/mach2/src/kern_return.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach2/src/kern_return.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,58 @@ +//! This module corresponds to `mach/kern_return.h` and +//! `mach/i386/kern_return.h`. + +pub type kern_return_t = ::libc::c_int; + +pub const KERN_SUCCESS: kern_return_t = 0; +pub const KERN_INVALID_ADDRESS: kern_return_t = 1; +pub const KERN_PROTECTION_FAILURE: kern_return_t = 2; +pub const KERN_NO_SPACE: kern_return_t = 3; +pub const KERN_INVALID_ARGUMENT: kern_return_t = 4; +pub const KERN_FAILURE: kern_return_t = 5; +pub const KERN_RESOURCE_SHORTAGE: kern_return_t = 6; +pub const KERN_NOT_RECEIVER: kern_return_t = 7; +pub const KERN_NO_ACCESS: kern_return_t = 8; +pub const KERN_MEMORY_FAILURE: kern_return_t = 9; +pub const KERN_MEMORY_ERROR: kern_return_t = 10; +pub const KERN_ALREADY_IN_SET: kern_return_t = 11; +pub const KERN_NOT_IN_SET: kern_return_t = 12; +pub const KERN_NAME_EXISTS: kern_return_t = 13; +pub const KERN_ABORTED: kern_return_t = 14; +pub const KERN_INVALID_NAME: kern_return_t = 15; +pub const KERN_INVALID_TASK: kern_return_t = 16; +pub const KERN_INVALID_RIGHT: kern_return_t = 17; +pub const KERN_INVALID_VALUE: kern_return_t = 18; +pub const KERN_UREFS_OVERFLOW: kern_return_t = 19; +pub const KERN_INVALID_CAPABILITY: kern_return_t = 20; +pub const KERN_RIGHT_EXISTS: kern_return_t = 21; +pub const KERN_INVALID_HOST: kern_return_t = 22; +pub const KERN_MEMORY_PRESENT: kern_return_t = 23; +pub const KERN_MEMORY_DATA_MOVED: kern_return_t = 24; +pub const KERN_MEMORY_RESTART_COPY: kern_return_t = 25; +pub const KERN_INVALID_PROCESSOR_SET: kern_return_t = 26; +pub const KERN_POLICY_LIMIT: kern_return_t = 27; +pub const KERN_INVALID_POLICY: kern_return_t = 28; +pub const KERN_INVALID_OBJECT: kern_return_t = 29; +pub const KERN_ALREADY_WAITING: kern_return_t = 30; +pub const KERN_DEFAULT_SET: kern_return_t = 31; +pub const KERN_EXCEPTION_PROTECTED: kern_return_t = 32; +pub const KERN_INVALID_LEDGER: kern_return_t = 33; +pub const KERN_INVALID_MEMORY_CONTROL: kern_return_t = 34; +pub const KERN_INVALID_SECURITY: kern_return_t = 35; +pub const KERN_NOT_DEPRESSED: kern_return_t = 36; +pub const KERN_TERMINATED: kern_return_t = 37; +pub const KERN_LOCK_SET_DESTROYED: kern_return_t = 38; +pub const KERN_LOCK_UNSTABLE: kern_return_t = 39; +pub const KERN_LOCK_OWNED: kern_return_t = 40; +pub const KERN_LOCK_OWNED_SELF: kern_return_t = 41; +pub const KERN_SEMAPHORE_DESTROYED: kern_return_t = 42; +pub const KERN_RPC_SERVER_TERMINATED: kern_return_t = 43; +pub const KERN_RPC_TERMINATE_ORPHAN: kern_return_t = 44; +pub const KERN_RPC_CONTINUE_ORPHAN: kern_return_t = 45; +pub const KERN_NOT_SUPPORTED: kern_return_t = 46; +pub const KERN_NODE_DOWN: kern_return_t = 47; +pub const KERN_NOT_WAITING: kern_return_t = 48; +pub const KERN_OPERATION_TIMED_OUT: kern_return_t = 49; +pub const KERN_CODESIGN_ERROR: kern_return_t = 50; +pub const KERN_POLICY_STATIC: kern_return_t = 51; +pub const KERN_RETURN_MAX: kern_return_t = 0x100; diff -Nru temporalio-1.3.0/vendor/mach2/src/lib.rs temporalio-1.3.0/vendor/mach2/src/lib.rs --- temporalio-1.3.0/vendor/mach2/src/lib.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach2/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,56 @@ +#![allow(non_camel_case_types)] +#![allow(non_upper_case_globals)] +#![deny(missing_debug_implementations)] +#![deny(missing_copy_implementations)] +#![allow( + clippy::module_name_repetitions, + clippy::cast_sign_loss, + clippy::cast_possible_truncation, + clippy::trivially_copy_pass_by_ref +)] +#![no_std] + +#[cfg(not(any(target_os = "macos", target_os = "ios")))] +compile_error!("mach requires macOS or iOS"); + +extern crate libc; + +#[allow(unused_imports)] +use core::{clone, cmp, default, fmt, hash, marker, mem, option}; + +pub mod boolean; +pub mod bootstrap; +pub mod clock; +pub mod clock_priv; +pub mod clock_reply; +pub mod clock_types; // TODO: test +pub mod dyld_kernel; +// pub mod error; // TODO +pub mod exc; +pub mod exception_types; +pub mod kern_return; +pub mod mach_init; +pub mod mach_port; +pub mod mach_time; +pub mod mach_types; +pub mod memory_object_types; +pub mod message; +pub mod port; +pub mod structs; +pub mod task; +pub mod task_info; +pub mod thread_act; +pub mod thread_policy; +pub mod thread_status; +pub mod traps; +pub mod vm; +pub mod vm_attributes; +pub mod vm_behavior; +pub mod vm_inherit; +pub mod vm_page_size; +pub mod vm_prot; +pub mod vm_purgable; +pub mod vm_region; +pub mod vm_statistics; +pub mod vm_sync; +pub mod vm_types; diff -Nru temporalio-1.3.0/vendor/mach2/src/mach_init.rs temporalio-1.3.0/vendor/mach2/src/mach_init.rs --- temporalio-1.3.0/vendor/mach2/src/mach_init.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach2/src/mach_init.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,22 @@ +//! This module corresponds to `mach/mach_init.h`. + +use mach_types::thread_port_t; + +extern "C" { + pub fn mach_thread_self() -> thread_port_t; +} + +#[cfg(test)] +mod tests { + use mach_init::*; + use port::*; + + #[test] + fn mach_thread_self_test() { + unsafe { + let this_thread = mach_thread_self(); + assert!(this_thread != MACH_PORT_NULL); + assert!(this_thread != MACH_PORT_DEAD); + } + } +} diff -Nru temporalio-1.3.0/vendor/mach2/src/mach_port.rs temporalio-1.3.0/vendor/mach2/src/mach_port.rs --- temporalio-1.3.0/vendor/mach2/src/mach_port.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach2/src/mach_port.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,35 @@ +//! This module corresponds to `mach/mach_port.h` + +use kern_return::kern_return_t; +use mach_types::ipc_space_t; +use message::mach_msg_type_name_t; +use port::{mach_port_delta_t, mach_port_name_t, mach_port_right_t, mach_port_t}; + +extern "C" { + pub fn mach_port_allocate( + task: ipc_space_t, + right: mach_port_right_t, + name: *mut mach_port_name_t, + ) -> kern_return_t; + pub fn mach_port_destroy(task: ipc_space_t, name: mach_port_name_t) -> kern_return_t; + pub fn mach_port_deallocate(task: ipc_space_t, name: mach_port_name_t) -> kern_return_t; + pub fn mach_port_insert_right( + task: ipc_space_t, + name: mach_port_name_t, + poly: mach_port_t, + polyPoly: mach_msg_type_name_t, + ) -> kern_return_t; + pub fn mach_port_extract_right( + task: ipc_space_t, + name: mach_port_name_t, + msgt_name: mach_msg_type_name_t, + poly: *mut mach_port_t, + polyPoly: *mut mach_msg_type_name_t, + ) -> kern_return_t; + pub fn mach_port_mod_refs( + task: ipc_space_t, + name: mach_port_name_t, + right: mach_port_right_t, + delta: mach_port_delta_t, + ) -> kern_return_t; +} diff -Nru temporalio-1.3.0/vendor/mach2/src/mach_time.rs temporalio-1.3.0/vendor/mach2/src/mach_time.rs --- temporalio-1.3.0/vendor/mach2/src/mach_time.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach2/src/mach_time.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,20 @@ +//! This module corresponds to `mach/mach_time.h` +use kern_return::kern_return_t; +pub type mach_timebase_info_t = *mut mach_timebase_info; +pub type mach_timebase_info_data_t = mach_timebase_info; + +#[repr(C)] +#[derive(Copy, Clone, Debug, Default, Hash, PartialOrd, PartialEq, Eq, Ord)] +pub struct mach_timebase_info { + pub numer: u32, + pub denom: u32, +} + +extern "C" { + pub fn mach_timebase_info(info: mach_timebase_info_t) -> kern_return_t; + pub fn mach_wait_until(deadline: u64) -> kern_return_t; + pub fn mach_absolute_time() -> u64; + pub fn mach_approximate_time() -> u64; + pub fn mach_continuous_time() -> u64; + pub fn mach_continuous_approximate_time() -> u64; +} diff -Nru temporalio-1.3.0/vendor/mach2/src/mach_types.rs temporalio-1.3.0/vendor/mach2/src/mach_types.rs --- temporalio-1.3.0/vendor/mach2/src/mach_types.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach2/src/mach_types.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,106 @@ +//! This module corresponds to `mach/mach_types.h` + +use port::mach_port_t; + +pub type task_t = mach_port_t; +pub type task_name_t = mach_port_t; +pub type task_suspension_token_t = mach_port_t; +pub type thread_t = mach_port_t; +pub type thread_act_t = mach_port_t; +pub type ipc_space_t = mach_port_t; +pub type coalition_t = mach_port_t; +pub type host_t = mach_port_t; +pub type host_priv_t = mach_port_t; +pub type host_security_t = mach_port_t; +pub type processor_t = mach_port_t; +pub type processor_set_t = mach_port_t; +pub type processor_set_control_t = mach_port_t; +pub type semaphore_t = mach_port_t; +pub type lock_set_t = mach_port_t; +pub type ledger_t = mach_port_t; +pub type alarm_t = mach_port_t; +pub type clock_serv_t = mach_port_t; +pub type clock_ctrl_t = mach_port_t; + +pub type processor_set_name_t = processor_set_t; + +pub type clock_reply_t = mach_port_t; +pub type bootstrap_t = mach_port_t; +pub type mem_entry_name_port_t = mach_port_t; +pub type exception_handler_t = mach_port_t; +pub type exception_handler_array_t = *mut exception_handler_t; +pub type vm_task_entry_t = mach_port_t; +pub type io_master_t = mach_port_t; +pub type UNDServerRef = mach_port_t; + +pub type task_array_t = *mut task_t; +pub type thread_array_t = *mut thread_t; +pub type processor_set_array_t = *mut processor_set_t; +pub type processor_set_name_array_t = *mut processor_set_t; +pub type processor_array_t = *mut processor_t; +pub type thread_act_array_t = *mut thread_act_t; +pub type ledger_array_t = *mut ledger_t; + +pub type task_port_t = task_t; +pub type task_port_array_t = task_array_t; +pub type thread_port_t = thread_t; +pub type thread_port_array_t = thread_array_t; +pub type ipc_space_port_t = ipc_space_t; +pub type host_name_t = host_t; +pub type host_name_port_t = host_t; +pub type processor_set_port_t = processor_set_t; +pub type processor_set_name_port_t = processor_set_t; +pub type processor_set_name_port_array_t = processor_set_array_t; +pub type processor_set_control_port_t = processor_set_t; +pub type processor_port_t = processor_t; +pub type processor_port_array_t = processor_array_t; +pub type thread_act_port_t = thread_act_t; +pub type thread_act_port_array_t = thread_act_array_t; +pub type semaphore_port_t = semaphore_t; +pub type lock_set_port_t = lock_set_t; +pub type ledger_port_t = ledger_t; +pub type ledger_port_array_t = ledger_array_t; +pub type alarm_port_t = alarm_t; +pub type clock_serv_port_t = clock_serv_t; +pub type clock_ctrl_port_t = clock_ctrl_t; +pub type exception_port_t = exception_handler_t; +pub type exception_port_arrary_t = exception_handler_array_t; + +pub const TASK_NULL: task_t = 0; +pub const TASK_NAME_NULL: task_name_t = 0; +pub const THREAD_NULL: thread_t = 0; +pub const TID_NULL: u64 = 0; +pub const THR_ACT_NULL: thread_act_t = 0; +pub const IPC_SPACE_NULL: ipc_space_t = 0; +pub const COALITION_NULL: coalition_t = 0; +pub const HOST_NULL: host_t = 0; +pub const HOST_PRIV_NULL: host_priv_t = 0; +pub const HOST_SECURITY_NULL: host_security_t = 0; +pub const PROCESSOR_SET_NULL: processor_set_t = 0; +pub const PROCESSOR_NULL: processor_t = 0; +pub const SEMAPHORE_NULL: semaphore_t = 0; +pub const LOCK_SET_NULL: lock_set_t = 0; +pub const LEDGER_NULL: ledger_t = 0; +pub const ALARM_NULL: alarm_t = 0; +pub const CLOCK_NULL: ::libc::clock_t = 0; +pub const UND_SERVER_NULL: UNDServerRef = 0; + +// : typedef unsigned char __darwin_uuid_t[16]; +pub type uuid_t = [::libc::c_uchar; 16]; + +// +#[repr(C)] +#[derive(Copy, Clone, Debug, Default, Hash, PartialOrd, PartialEq, Eq, Ord)] +pub struct fsid { + pub val: [i32; 2], +} +pub type fsid_t = fsid; + +// +#[repr(C)] +#[derive(Copy, Clone, Debug, Default, Hash, PartialOrd, PartialEq, Eq, Ord)] +pub struct fsobj_id { + pub fid_objno: u32, + pub fid_generation: u32, +} +pub type fsobj_id_t = fsobj_id; diff -Nru temporalio-1.3.0/vendor/mach2/src/memory_object_types.rs temporalio-1.3.0/vendor/mach2/src/memory_object_types.rs --- temporalio-1.3.0/vendor/mach2/src/memory_object_types.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach2/src/memory_object_types.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,9 @@ +//! This module roughly corresponds to `mach/memory_object_types.h`. + +use vm_types::natural_t; + +pub type memory_object_offset_t = ::libc::c_ulonglong; +pub type memory_object_size_t = ::libc::c_ulonglong; +pub type memory_object_cluster_size_t = natural_t; +pub type memory_object_fault_info_t = *mut natural_t; +pub type vm_object_id_t = ::libc::c_ulonglong; diff -Nru temporalio-1.3.0/vendor/mach2/src/message.rs temporalio-1.3.0/vendor/mach2/src/message.rs --- temporalio-1.3.0/vendor/mach2/src/message.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach2/src/message.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,248 @@ +//! This module corresponds to `mach/message.h`. + +use kern_return::kern_return_t; +use port::{mach_port_name_t, mach_port_t}; +use vm_types::{integer_t, natural_t}; + +pub type mach_msg_timeout_t = natural_t; + +pub type mach_msg_bits_t = ::libc::c_uint; +pub type mach_msg_id_t = integer_t; +pub type mach_msg_size_t = natural_t; + +pub type mach_msg_copy_options_t = ::libc::c_uint; +pub type mach_msg_descriptor_type_t = ::libc::c_uint; +pub type mach_msg_type_name_t = ::libc::c_uint; + +pub type mach_msg_trailer_type_t = ::libc::c_uint; +pub type mach_msg_trailer_size_t = ::libc::c_uint; + +pub type mach_msg_option_t = integer_t; + +pub type mach_msg_type_number_t = natural_t; +pub type mach_msg_type_size_t = natural_t; + +pub type mach_msg_return_t = kern_return_t; + +pub const MACH_MSG_TIMEOUT_NONE: mach_msg_timeout_t = 0; + +pub const MACH_MSGH_BITS_ZERO: mach_msg_bits_t = 0x0000_0000; + +pub const MACH_MSGH_BITS_REMOTE_MASK: mach_msg_bits_t = 0x0000_001f; +pub const MACH_MSGH_BITS_LOCAL_MASK: mach_msg_bits_t = 0x0000_1f00; +pub const MACH_MSGH_BITS_VOUCHER_MASK: mach_msg_bits_t = 0x001f_0000; + +pub const MACH_MSGH_BITS_PORTS_MASK: mach_msg_bits_t = + MACH_MSGH_BITS_REMOTE_MASK | MACH_MSGH_BITS_LOCAL_MASK | MACH_MSGH_BITS_VOUCHER_MASK; + +pub const MACH_MSGH_BITS_COMPLEX: mach_msg_bits_t = 0x8000_0000; + +pub const MACH_MSGH_BITS_USER: mach_msg_bits_t = 0x801f_1f1f; + +#[allow(non_snake_case)] +pub fn MACH_MSGH_BITS(remote: mach_msg_bits_t, local: mach_msg_bits_t) -> mach_msg_bits_t { + remote | (local << 8) +} + +pub const MACH_MSG_TYPE_MOVE_RECEIVE: mach_msg_type_name_t = 16; +pub const MACH_MSG_TYPE_MOVE_SEND: mach_msg_type_name_t = 17; +pub const MACH_MSG_TYPE_MOVE_SEND_ONCE: mach_msg_type_name_t = 18; +pub const MACH_MSG_TYPE_COPY_SEND: mach_msg_type_name_t = 19; +pub const MACH_MSG_TYPE_MAKE_SEND: mach_msg_type_name_t = 20; +pub const MACH_MSG_TYPE_MAKE_SEND_ONCE: mach_msg_type_name_t = 21; +pub const MACH_MSG_TYPE_COPY_RECEIVE: mach_msg_type_name_t = 22; +pub const MACH_MSG_TYPE_DISPOSE_RECEIVE: mach_msg_type_name_t = 24; +pub const MACH_MSG_TYPE_DISPOSE_SEND: mach_msg_type_name_t = 25; +pub const MACH_MSG_TYPE_DISPOSE_SEND_ONCE: mach_msg_type_name_t = 26; + +pub const MACH_MSG_PHYSICAL_COPY: mach_msg_copy_options_t = 0; +pub const MACH_MSG_VIRTUAL_COPY: mach_msg_copy_options_t = 1; +pub const MACH_MSG_ALLOCATE: mach_msg_copy_options_t = 2; + +pub const MACH_MSG_PORT_DESCRIPTOR: mach_msg_descriptor_type_t = 0; +pub const MACH_MSG_OOL_DESCRIPTOR: mach_msg_descriptor_type_t = 1; +pub const MACH_MSG_OOL_PORTS_DESCRIPTOR: mach_msg_descriptor_type_t = 2; +pub const MACH_MSG_OOL_VOLATILE_DESCRIPTOR: mach_msg_descriptor_type_t = 3; + +pub const MACH_MSG_OPTION_NONE: mach_msg_option_t = 0x0000_0000; + +pub const MACH_SEND_MSG: mach_msg_option_t = 0x0000_0001; +pub const MACH_RCV_MSG: mach_msg_option_t = 0x0000_0002; + +pub const MACH_RCV_LARGE: mach_msg_option_t = 0x0000_0004; +pub const MACH_RCV_LARGE_IDENTITY: mach_msg_option_t = 0x0000_0008; + +pub const MACH_SEND_TIMEOUT: mach_msg_option_t = 0x0000_0010; +pub const MACH_SEND_INTERRUPT: mach_msg_option_t = 0x0000_0040; +pub const MACH_SEND_NOTIFY: mach_msg_option_t = 0x0000_0080; +pub const MACH_SEND_ALWAYS: mach_msg_option_t = 0x0001_0000; +pub const MACH_SEND_TRAILER: mach_msg_option_t = 0x0002_0000; +pub const MACH_SEND_NOIMPORTANCE: mach_msg_option_t = 0x0004_0000; +pub const MACH_SEND_NODENAP: mach_msg_option_t = MACH_SEND_NOIMPORTANCE; +pub const MACH_SEND_IMPORTANCE: mach_msg_option_t = 0x0008_0000; + +pub const MACH_RCV_TIMEOUT: mach_msg_option_t = 0x0000_0100; +pub const MACH_RCV_NOTIFY: mach_msg_option_t = 0x0000_0000; +pub const MACH_RCV_INTERRUPT: mach_msg_option_t = 0x0000_0400; +pub const MACH_RCV_VOUCHER: mach_msg_option_t = 0x0000_0800; +pub const MACH_RCV_OVERWRITE: mach_msg_option_t = 0x0000_0000; + +pub const MACH_MSG_SUCCESS: mach_msg_return_t = 0x0000_0000; + +pub const MACH_MSG_MASK: mach_msg_return_t = 0x0000_3e00; +pub const MACH_MSG_IPC_SPACE: mach_msg_return_t = 0x0000_2000; +pub const MACH_MSG_VM_SPACE: mach_msg_return_t = 0x0000_1000; +pub const MACH_MSG_IPC_KERNEL: mach_msg_return_t = 0x0000_0800; +pub const MACH_MSG_VM_KERNEL: mach_msg_return_t = 0x0000_0400; + +pub const MACH_SEND_IN_PROGRESS: mach_msg_return_t = 0x1000_0001; +pub const MACH_SEND_INVALID_DATA: mach_msg_return_t = 0x1000_0002; +pub const MACH_SEND_INVALID_DEST: mach_msg_return_t = 0x1000_0003; +pub const MACH_SEND_TIMED_OUT: mach_msg_return_t = 0x1000_0004; +pub const MACH_SEND_INVALID_VOUCHER: mach_msg_return_t = 0x1000_0005; +pub const MACH_SEND_INTERRUPTED: mach_msg_return_t = 0x1000_0007; +pub const MACH_SEND_MSG_TOO_SMALL: mach_msg_return_t = 0x1000_0008; +pub const MACH_SEND_INVALID_REPLY: mach_msg_return_t = 0x1000_0009; +pub const MACH_SEND_INVALID_RIGHT: mach_msg_return_t = 0x1000_000a; +pub const MACH_SEND_INVALID_NOTIFY: mach_msg_return_t = 0x1000_000b; +pub const MACH_SEND_INVALID_MEMORY: mach_msg_return_t = 0x1000_000c; +pub const MACH_SEND_NO_BUFFER: mach_msg_return_t = 0x1000_000d; +pub const MACH_SEND_TOO_LARGE: mach_msg_return_t = 0x1000_000e; +pub const MACH_SEND_INVALID_TYPE: mach_msg_return_t = 0x1000_000f; +pub const MACH_SEND_INVALID_HEADER: mach_msg_return_t = 0x1000_0010; +pub const MACH_SEND_INVALID_TRAILER: mach_msg_return_t = 0x1000_0011; +pub const MACH_SEND_INVALID_RT_OOL_SIZE: mach_msg_return_t = 0x1000_0015; + +pub const MACH_RCV_IN_PROGRESS: mach_msg_return_t = 0x1000_4001; +pub const MACH_RCV_INVALID_NAME: mach_msg_return_t = 0x1000_4002; +pub const MACH_RCV_TIMED_OUT: mach_msg_return_t = 0x1000_4003; +pub const MACH_RCV_TOO_LARGE: mach_msg_return_t = 0x1000_4004; +pub const MACH_RCV_INTERRUPTED: mach_msg_return_t = 0x1000_4005; +pub const MACH_RCV_PORT_CHANGED: mach_msg_return_t = 0x1000_4006; +pub const MACH_RCV_INVALID_NOTIFY: mach_msg_return_t = 0x1000_4007; +pub const MACH_RCV_INVALID_DATA: mach_msg_return_t = 0x1000_4008; +pub const MACH_RCV_PORT_DIED: mach_msg_return_t = 0x1000_4009; +pub const MACH_RCV_IN_SET: mach_msg_return_t = 0x1000_400a; +pub const MACH_RCV_HEADER_ERROR: mach_msg_return_t = 0x1000_400b; +pub const MACH_RCV_BODY_ERROR: mach_msg_return_t = 0x1000_400c; +pub const MACH_RCV_INVALID_TYPE: mach_msg_return_t = 0x1000_400d; +pub const MACH_RCV_SCATTER_SMALL: mach_msg_return_t = 0x1000_400e; +pub const MACH_RCV_INVALID_TRAILER: mach_msg_return_t = 0x1000_400f; +pub const MACH_RCV_IN_PROGRESS_TIMED: mach_msg_return_t = 0x1000_4011; + +#[repr(C)] +#[derive(Copy, Clone, Debug, Default, Hash, PartialOrd, PartialEq, Eq, Ord)] +pub struct mach_msg_header_t { + pub msgh_bits: mach_msg_bits_t, + pub msgh_size: mach_msg_size_t, + pub msgh_remote_port: mach_port_t, + pub msgh_local_port: mach_port_t, + pub msgh_voucher_port: mach_port_name_t, + pub msgh_id: mach_msg_id_t, +} + +#[repr(C)] +#[derive(Copy, Clone, Debug, Default, Hash, PartialOrd, PartialEq, Eq, Ord)] +pub struct mach_msg_body_t { + pub msgh_descriptor_count: mach_msg_size_t, +} + +#[repr(C)] +#[derive(Copy, Clone, Debug, Default, Hash, PartialOrd, PartialEq, Eq, Ord)] +pub struct mach_msg_base_t { + pub header: mach_msg_header_t, + pub body: mach_msg_body_t, +} + +pub const MACH_MSG_TRAILER_FORMAT_0: mach_msg_trailer_type_t = 0; + +#[repr(C)] +#[derive(Copy, Clone, Debug, Default, Hash, PartialOrd, PartialEq, Eq, Ord)] +pub struct mach_msg_trailer_t { + pub msgh_trailer_type: mach_msg_trailer_type_t, + pub msgh_trailer_size: mach_msg_trailer_size_t, +} + +#[repr(C)] +#[derive(Copy, Clone, Debug, Default, Hash, PartialOrd, PartialEq, Eq, Ord)] +pub struct mach_msg_port_descriptor_t { + pub name: mach_port_t, + pub pad1: mach_msg_size_t, + pub pad2: u16, + pub disposition: u8, // mach_msg_type_name_t bitfield + pub type_: u8, // mach_msg_descriptor_type_t bitfield +} + +impl mach_msg_port_descriptor_t { + pub fn new(name: mach_port_t, disposition: mach_msg_type_name_t) -> Self { + Self { + name, + pad1: 0, + pad2: 0, + disposition: disposition as u8, + type_: MACH_MSG_PORT_DESCRIPTOR as u8, + } + } +} + +#[repr(C)] +#[derive(Copy, Clone, Debug, Hash, PartialOrd, PartialEq, Eq, Ord)] +pub struct mach_msg_ool_descriptor_t { + pub address: *mut ::libc::c_void, + #[cfg(not(target_pointer_width = "64"))] + pub size: mach_msg_size_t, + pub deallocate: u8, // boolean_t bitfield + pub copy: u8, // mach_msg_copy_options_t bitfield + pub pad1: u8, + pub type_: u8, // mach_msg_descriptor_type_t bitfield + #[cfg(target_pointer_width = "64")] + pub size: mach_msg_size_t, +} + +impl mach_msg_ool_descriptor_t { + pub fn new( + address: *mut ::libc::c_void, + deallocate: bool, + copy: mach_msg_copy_options_t, + size: u32, + ) -> Self { + Self { + address, + deallocate: if deallocate { 1 } else { 0 }, + copy: copy as u8, + pad1: 0, + type_: MACH_MSG_OOL_DESCRIPTOR as u8, + size, + } + } +} + +#[repr(C)] +#[derive(Copy, Clone, Debug, Hash, PartialOrd, PartialEq, Eq, Ord)] +pub struct mach_msg_ool_ports_descriptor_t { + pub address: *mut ::libc::c_void, + #[cfg(not(target_pointer_width = "64"))] + pub count: mach_msg_size_t, + pub deallocate: u8, // boolean_t bitfield + pub copy: u8, // mach_msg_copy_options_t bitfield + pub disposition: u8, // mach_msg_type_name_t bitfield + pub type_: u8, // mach_msg_descriptor_type_t bitfield + #[cfg(target_pointer_width = "64")] + pub count: mach_msg_size_t, +} + +extern "C" { + pub fn mach_msg( + msg: *mut mach_msg_header_t, + option: mach_msg_option_t, + send_size: mach_msg_size_t, + recv_size: mach_msg_size_t, + recv_name: mach_port_name_t, + timeout: mach_msg_timeout_t, + notify: mach_port_name_t, + ) -> mach_msg_return_t; + + // from mach/mach.h + pub fn mach_msg_send(msg: *mut mach_msg_header_t) -> mach_msg_return_t; + pub fn mach_msg_destroy(msg: *mut mach_msg_header_t); +} diff -Nru temporalio-1.3.0/vendor/mach2/src/port.rs temporalio-1.3.0/vendor/mach2/src/port.rs --- temporalio-1.3.0/vendor/mach2/src/port.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach2/src/port.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,28 @@ +//! This module corresponds to `mach/port.h` + +use vm_types::{integer_t, natural_t}; + +pub type mach_port_name_t = natural_t; + +#[repr(C)] +#[derive(Copy, Clone, Debug, Default, Hash, PartialOrd, PartialEq, Eq, Ord)] +pub struct ipc_port; + +pub type ipc_port_t = *mut ipc_port; + +pub type mach_port_t = ::libc::c_uint; + +pub const MACH_PORT_NULL: mach_port_t = 0; +pub const MACH_PORT_DEAD: mach_port_t = !0; + +pub type mach_port_right_t = natural_t; + +pub const MACH_PORT_RIGHT_SEND: mach_port_right_t = 0; +pub const MACH_PORT_RIGHT_RECEIVE: mach_port_right_t = 1; +pub const MACH_PORT_RIGHT_SEND_ONCE: mach_port_right_t = 2; +pub const MACH_PORT_RIGHT_PORT_SET: mach_port_right_t = 3; +pub const MACH_PORT_RIGHT_DEAD_NAME: mach_port_right_t = 4; +pub const MACH_PORT_RIGHT_LABELH: mach_port_right_t = 5; +pub const MACH_PORT_RIGHT_NUMBER: mach_port_right_t = 6; + +pub type mach_port_delta_t = integer_t; diff -Nru temporalio-1.3.0/vendor/mach2/src/structs.rs temporalio-1.3.0/vendor/mach2/src/structs.rs --- temporalio-1.3.0/vendor/mach2/src/structs.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach2/src/structs.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,62 @@ +//! This module corresponds to `mach/_structs.h`. + +use mem; +use message::mach_msg_type_number_t; + +#[repr(C)] +#[derive(Copy, Clone, Debug, Default, Hash, PartialOrd, PartialEq, Eq, Ord)] +pub struct x86_thread_state64_t { + pub __rax: u64, + pub __rbx: u64, + pub __rcx: u64, + pub __rdx: u64, + pub __rdi: u64, + pub __rsi: u64, + pub __rbp: u64, + pub __rsp: u64, + pub __r8: u64, + pub __r9: u64, + pub __r10: u64, + pub __r11: u64, + pub __r12: u64, + pub __r13: u64, + pub __r14: u64, + pub __r15: u64, + pub __rip: u64, + pub __rflags: u64, + pub __cs: u64, + pub __fs: u64, + pub __gs: u64, +} + +impl x86_thread_state64_t { + pub fn new() -> Self { + Self { + __rax: 0, + __rbx: 0, + __rcx: 0, + __rdx: 0, + __rdi: 0, + __rsi: 0, + __rbp: 0, + __rsp: 0, + __r8: 0, + __r9: 0, + __r10: 0, + __r11: 0, + __r12: 0, + __r13: 0, + __r14: 0, + __r15: 0, + __rip: 0, + __rflags: 0, + __cs: 0, + __fs: 0, + __gs: 0, + } + } + + pub fn count() -> mach_msg_type_number_t { + (mem::size_of::() / mem::size_of::<::libc::c_int>()) as mach_msg_type_number_t + } +} diff -Nru temporalio-1.3.0/vendor/mach2/src/task_info.rs temporalio-1.3.0/vendor/mach2/src/task_info.rs --- temporalio-1.3.0/vendor/mach2/src/task_info.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach2/src/task_info.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,44 @@ +//! This module roughly corresponds to `mach/task_info.h`. + +use vm_types::{integer_t, mach_vm_address_t, mach_vm_size_t, natural_t}; + +pub const TASK_INFO_MAX: ::libc::c_uint = 1024; +pub const TASK_BASIC_INFO_32: ::libc::c_uint = 4; +pub const TASK_BASIC2_INFO_32: ::libc::c_uint = 6; +pub const TASK_BASIC_INFO_64: ::libc::c_uint = 5; +#[cfg(target_arch = "x86_64")] +pub const TASK_BASIC_INFO: ::libc::c_uint = 5; +#[cfg(target_arch = "x86")] +pub const TASK_BASIC_INFO: ::libc::c_uint = 4; +pub const TASK_EVENTS_INFO: ::libc::c_uint = 2; +pub const TASK_THREAD_TIMES_INFO: ::libc::c_uint = 3; +pub const TASK_ABSOLUTETIME_INFO: ::libc::c_uint = 1; +pub const TASK_KERNELMEMORY_INFO: ::libc::c_uint = 7; +pub const TASK_SECURITY_TOKEN: ::libc::c_uint = 13; +pub const TASK_AUDIT_TOKEN: ::libc::c_uint = 15; +pub const TASK_AFFINITY_TAG_INFO: ::libc::c_uint = 16; +pub const TASK_DYLD_INFO: ::libc::c_uint = 17; +pub const TASK_DYLD_ALL_IMAGE_INFO_32: ::libc::c_uint = 0; +pub const TASK_DYLD_ALL_IMAGE_INFO_64: ::libc::c_uint = 1; +pub const TASK_EXTMOD_INFO: ::libc::c_uint = 19; +pub const MACH_TASK_BASIC_INFO: ::libc::c_uint = 20; +pub const TASK_POWER_INFO: ::libc::c_uint = 21; +pub const TASK_VM_INFO: ::libc::c_uint = 22; +pub const TASK_VM_INFO_PURGEABLE: ::libc::c_uint = 23; +pub const TASK_TRACE_MEMORY_INFO: ::libc::c_uint = 24; +pub const TASK_WAIT_STATE_INFO: ::libc::c_uint = 25; +pub const TASK_POWER_INFO_V2: ::libc::c_uint = 26; +pub const TASK_VM_INFO_PURGEABLE_ACCOUNT: ::libc::c_uint = 27; +pub const TASK_FLAGS_INFO: ::libc::c_uint = 28; +pub const TASK_DEBUG_INFO_INTERNAL: ::libc::c_uint = 29; + +pub type task_flavor_t = natural_t; +pub type task_info_t = *mut integer_t; + +#[repr(C, packed(4))] +#[derive(Copy, Clone, Debug, Default, Hash, PartialOrd, PartialEq, Eq, Ord)] +pub struct task_dyld_info { + pub all_image_info_addr: mach_vm_address_t, + pub all_image_info_size: mach_vm_size_t, + pub all_image_info_format: integer_t, +} diff -Nru temporalio-1.3.0/vendor/mach2/src/task.rs temporalio-1.3.0/vendor/mach2/src/task.rs --- temporalio-1.3.0/vendor/mach2/src/task.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach2/src/task.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,41 @@ +//! This module corresponds to `mach/task.defs`. + +use kern_return::kern_return_t; +use mach_types::{task_name_t, task_t, thread_act_array_t}; +use message::mach_msg_type_number_t; +use port::mach_port_t; +use task_info::{task_flavor_t, task_info_t}; + +pub type task_special_port_t = ::libc::c_int; + +pub const TASK_KERNEL_PORT: task_special_port_t = 1; +pub const TASK_HOST_PORT: task_special_port_t = 2; +pub const TASK_NAME_PORT: task_special_port_t = 3; +pub const TASK_BOOTSTRAP_PORT: task_special_port_t = 4; + +extern "C" { + pub fn task_resume(target_task: task_t) -> kern_return_t; + pub fn task_suspend(target_task: task_t) -> kern_return_t; + pub fn task_get_special_port( + task: task_t, + which_port: task_special_port_t, + special_port: *mut mach_port_t, + ) -> kern_return_t; + pub fn task_threads( + target_task: task_t, + act_list: *mut thread_act_array_t, + act_list_cnt: *mut mach_msg_type_number_t, + ) -> kern_return_t; + pub fn task_info( + target_task: task_name_t, + flavor: task_flavor_t, + task_info_out: task_info_t, + task_info_outCnt: *mut mach_msg_type_number_t, + ) -> kern_return_t; + pub fn task_set_info( + target_task: task_t, + flavor: task_flavor_t, + task_info_in: task_info_t, + task_info_inCnt: mach_msg_type_number_t, + ) -> kern_return_t; +} diff -Nru temporalio-1.3.0/vendor/mach2/src/thread_act.rs temporalio-1.3.0/vendor/mach2/src/thread_act.rs --- temporalio-1.3.0/vendor/mach2/src/thread_act.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach2/src/thread_act.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,23 @@ +//! This module corresponds to `mach/thread_act.defs`. + +use kern_return::kern_return_t; +use mach_types::thread_act_t; +use message::mach_msg_type_number_t; +use thread_status::{thread_state_flavor_t, thread_state_t}; + +extern "C" { + pub fn thread_get_state( + target_act: thread_act_t, + flavor: thread_state_flavor_t, + new_state: thread_state_t, + new_state_count: *mut mach_msg_type_number_t, + ) -> kern_return_t; +} + +extern "C" { + pub fn thread_suspend(target_act: thread_act_t) -> kern_return_t; +} + +extern "C" { + pub fn thread_resume(target_act: thread_act_t) -> kern_return_t; +} diff -Nru temporalio-1.3.0/vendor/mach2/src/thread_policy.rs temporalio-1.3.0/vendor/mach2/src/thread_policy.rs --- temporalio-1.3.0/vendor/mach2/src/thread_policy.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach2/src/thread_policy.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,121 @@ +//! This module corresponds to `mach/thread_policy.h`. + +use boolean::boolean_t; +use kern_return::kern_return_t; +use libc::thread_policy_t; +use mach_types::thread_t; +use message::mach_msg_type_number_t; +use vm_types::{integer_t, natural_t}; + +pub type thread_policy_flavor_t = natural_t; + +pub const THREAD_STANDARD_POLICY: thread_policy_flavor_t = 1; +pub const THREAD_EXTENDED_POLICY: thread_policy_flavor_t = 1; +pub const THREAD_TIME_CONSTRAINT_POLICY: thread_policy_flavor_t = 2; +pub const THREAD_PRECEDENCE_POLICY: thread_policy_flavor_t = 3; +pub const THREAD_AFFINITY_POLICY: thread_policy_flavor_t = 4; +pub const THREAD_BACKGROUND_POLICY: thread_policy_flavor_t = 5; +pub const THREAD_LATENCY_QOS_POLICY: thread_policy_flavor_t = 7; +pub const THREAD_THROUGHPUT_QOS_POLICY: thread_policy_flavor_t = 8; + +#[repr(C)] +#[derive(Clone, Copy, Debug)] +pub struct thread_standard_policy { + pub no_data: natural_t, +} + +#[repr(C)] +#[derive(Clone, Copy, Debug)] +pub struct thread_extended_policy { + pub timeshare: boolean_t, +} + +#[repr(C)] +#[derive(Clone, Copy, Debug)] +pub struct thread_time_constraint_policy { + pub period: u32, + pub computation: u32, + pub constraint: u32, + pub preemptible: boolean_t, +} + +#[repr(C)] +#[derive(Clone, Copy, Debug)] +pub struct thread_precedence_policy { + pub importance: integer_t, +} + +#[repr(C)] +#[derive(Clone, Copy, Debug)] +pub struct thread_affinity_policy { + pub affinity_tag: integer_t, +} + +pub const THREAD_AFFINITY_TAG_NULL: integer_t = 0; + +#[repr(C)] +#[derive(Clone, Copy, Debug)] +pub struct thread_background_policy { + pub priority: integer_t, +} + +pub type thread_latency_qos_t = integer_t; + +#[repr(C)] +#[derive(Clone, Copy, Debug)] +pub struct thread_latency_qos_policy { + thread_latency_qos_tier: thread_latency_qos_t, +} + +pub type thread_throughput_qos_t = integer_t; + +#[repr(C)] +#[derive(Clone, Copy, Debug)] +pub struct thread_throughput_qos_policy { + thread_throughput_qos_tier: thread_throughput_qos_t, +} + +pub type thread_standard_policy_data_t = thread_standard_policy; +pub type thread_extended_policy_data_t = thread_extended_policy; +pub type thread_time_constraint_policy_data_t = thread_time_constraint_policy; +pub type thread_precedence_policy_data_t = thread_precedence_policy; +pub type thread_affinity_policy_data_t = thread_affinity_policy; +pub type thread_background_policy_data_t = thread_background_policy; +pub type thread_latency_qos_policy_data_t = thread_latency_qos_policy; +pub type thread_throughput_qos_policy_data_t = thread_throughput_qos_policy; + +pub const THREAD_STANDARD_POLICY_COUNT: mach_msg_type_number_t = 0; +pub const THREAD_EXTENDED_POLICY_COUNT: mach_msg_type_number_t = + (core::mem::size_of::() / core::mem::size_of::()) as _; +pub const THREAD_TIME_CONSTRAINT_POLICY_COUNT: mach_msg_type_number_t = + (core::mem::size_of::() / core::mem::size_of::()) + as _; +pub const THREAD_PRECEDENCE_POLICY_COUNT: mach_msg_type_number_t = + (core::mem::size_of::() / core::mem::size_of::()) as _; +pub const THREAD_AFFINITY_POLICY_COUNT: mach_msg_type_number_t = + (core::mem::size_of::() / core::mem::size_of::()) as _; +pub const THREAD_BACKGROUND_POLICY_COUNT: mach_msg_type_number_t = + (core::mem::size_of::() / core::mem::size_of::()) as _; +pub const THREAD_LATENCY_QOS_POLICY_COUNT: mach_msg_type_number_t = + (core::mem::size_of::() / core::mem::size_of::()) as _; +pub const THREAD_THROUGHPUT_QOS_POLICY_COUNT: mach_msg_type_number_t = + (core::mem::size_of::() / core::mem::size_of::()) as _; + +extern "C" { + pub fn thread_policy_set( + thread: thread_t, + flavor: thread_policy_flavor_t, + policy_info: thread_policy_t, + count: mach_msg_type_number_t, + ) -> kern_return_t; +} + +extern "C" { + pub fn thread_policy_get( + thread: thread_t, + flavor: thread_policy_flavor_t, + policy_info: thread_policy_t, + count: *mut mach_msg_type_number_t, + get_default: *mut boolean_t, + ) -> kern_return_t; +} diff -Nru temporalio-1.3.0/vendor/mach2/src/thread_status.rs temporalio-1.3.0/vendor/mach2/src/thread_status.rs --- temporalio-1.3.0/vendor/mach2/src/thread_status.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach2/src/thread_status.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,23 @@ +//! This module corresponds to `mach/thread_status.h`. + +use vm_types::natural_t; + +pub type thread_state_t = *mut natural_t; +pub type thread_state_flavor_t = ::libc::c_int; + +pub static x86_THREAD_STATE32: thread_state_flavor_t = 1; +pub static x86_FLOAT_STATE32: thread_state_flavor_t = 2; +pub static x86_EXCEPTION_STATE32: thread_state_flavor_t = 3; +pub static x86_THREAD_STATE64: thread_state_flavor_t = 4; +pub static x86_FLOAT_STATE64: thread_state_flavor_t = 5; +pub static x86_EXCEPTION_STATE64: thread_state_flavor_t = 6; +pub static x86_THREAD_STATE: thread_state_flavor_t = 7; +pub static x86_FLOAT_STATE: thread_state_flavor_t = 8; +pub static x86_EXCEPTION_STATE: thread_state_flavor_t = 9; +pub static x86_DEBUG_STATE32: thread_state_flavor_t = 10; +pub static x86_DEBUG_STATE64: thread_state_flavor_t = 11; +pub static x86_DEBUG_STATE: thread_state_flavor_t = 12; +pub static THREAD_STATE_NONE: thread_state_flavor_t = 13; +pub static x86_AVX_STATE32: thread_state_flavor_t = 16; +pub static x86_AVX_STATE64: thread_state_flavor_t = 17; +pub static x86_AVX_STATE: thread_state_flavor_t = 18; diff -Nru temporalio-1.3.0/vendor/mach2/src/traps.rs temporalio-1.3.0/vendor/mach2/src/traps.rs --- temporalio-1.3.0/vendor/mach2/src/traps.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach2/src/traps.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,37 @@ +//! This module corresponds to `mach/mach_traps.h`. +use kern_return::kern_return_t; +use port::{mach_port_name_t, mach_port_t}; + +extern "C" { + static mach_task_self_: mach_port_t; + pub fn task_for_pid( + target_tport: mach_port_name_t, + pid: ::libc::c_int, + tn: *mut mach_port_name_t, + ) -> kern_return_t; +} + +#[allow(clippy::missing_safety_doc)] // FIXME +pub unsafe fn mach_task_self() -> mach_port_t { + mach_task_self_ +} + +#[allow(clippy::missing_safety_doc)] // FIXME +pub unsafe fn current_task() -> mach_port_t { + mach_task_self() +} + +#[cfg(test)] +mod tests { + use port::*; + use traps::*; + + #[test] + fn mach_task_self_sanity() { + unsafe { + let this_task = mach_task_self(); + assert!(this_task != MACH_PORT_NULL); + assert!(this_task != MACH_PORT_DEAD); + } + } +} diff -Nru temporalio-1.3.0/vendor/mach2/src/vm_attributes.rs temporalio-1.3.0/vendor/mach2/src/vm_attributes.rs --- temporalio-1.3.0/vendor/mach2/src/vm_attributes.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach2/src/vm_attributes.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,18 @@ +//! This module corresponds to `mach/vm_attributes.h`. + +pub type vm_machine_attribute_t = ::libc::c_uint; + +pub const MATTR_CACHE: vm_machine_attribute_t = 1; +pub const MATTR_MIGRATE: vm_machine_attribute_t = 1 << 1; +pub const MATTR_REPLICATE: vm_machine_attribute_t = 1 << 2; + +pub type vm_machine_attribute_val_t = ::libc::c_int; + +pub const MATTR_VAL_OFF: vm_machine_attribute_val_t = 0; +pub const MATTR_VAL_ON: vm_machine_attribute_val_t = 1; +pub const MATTR_VAL_GET: vm_machine_attribute_val_t = 2; +pub const MATTR_VAL_CACHE_FLUSH: vm_machine_attribute_val_t = 6; +pub const MATTR_VAL_DCACHE_FLUSH: vm_machine_attribute_val_t = 7; +pub const MATTR_VAL_ICACHE_FLUSH: vm_machine_attribute_val_t = 8; +pub const MATTR_VAL_CACHE_SYNC: vm_machine_attribute_val_t = 9; +pub const MATTR_VAL_GET_INFO: vm_machine_attribute_val_t = 10; diff -Nru temporalio-1.3.0/vendor/mach2/src/vm_behavior.rs temporalio-1.3.0/vendor/mach2/src/vm_behavior.rs --- temporalio-1.3.0/vendor/mach2/src/vm_behavior.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach2/src/vm_behavior.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,15 @@ +//! This module corresponds to `mach/vm_behavior.h`. + +pub type vm_behavior_t = ::libc::c_int; + +pub const VM_BEHAVIOR_DEFAULT: vm_behavior_t = 0; +pub const VM_BEHAVIOR_RANDOM: vm_behavior_t = 1; +pub const VM_BEHAVIOR_SEQUENTIAL: vm_behavior_t = 2; +pub const VM_BEHAVIOR_RSEQNTL: vm_behavior_t = 3; +pub const VM_BEHAVIOR_WILLNEED: vm_behavior_t = 4; +pub const VM_BEHAVIOR_DONTNEED: vm_behavior_t = 5; +pub const VM_BEHAVIOR_FREE: vm_behavior_t = 6; +pub const VM_BEHAVIOR_ZERO_WIRED_PAGES: vm_behavior_t = 7; +pub const VM_BEHAVIOR_REUSABLE: vm_behavior_t = 8; +pub const VM_BEHAVIOR_REUSE: vm_behavior_t = 9; +pub const VM_BEHAVIOR_CAN_REUSE: vm_behavior_t = 10; diff -Nru temporalio-1.3.0/vendor/mach2/src/vm_inherit.rs temporalio-1.3.0/vendor/mach2/src/vm_inherit.rs --- temporalio-1.3.0/vendor/mach2/src/vm_inherit.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach2/src/vm_inherit.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,10 @@ +//! This module corresponds to `mach/vm_inherit.h`. + +pub type vm_inherit_t = ::libc::c_uint; + +pub const VM_INHERIT_SHARE: vm_inherit_t = 0; +pub const VM_INHERIT_COPY: vm_inherit_t = 1; +pub const VM_INHERIT_NONE: vm_inherit_t = 2; +pub const VM_INHERIT_DONATE_COPY: vm_inherit_t = 3; +pub const VM_INHERIT_DEFAULT: vm_inherit_t = VM_INHERIT_COPY; +pub const VM_INHERIT_LAST_VALID: vm_inherit_t = VM_INHERIT_NONE; diff -Nru temporalio-1.3.0/vendor/mach2/src/vm_page_size.rs temporalio-1.3.0/vendor/mach2/src/vm_page_size.rs --- temporalio-1.3.0/vendor/mach2/src/vm_page_size.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach2/src/vm_page_size.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,40 @@ +//! This module roughly corresponds to `mach/vm_page_size.h` + +use vm_types::{mach_vm_offset_t, mach_vm_size_t, vm_size_t}; + +extern "C" { + pub static vm_page_size: vm_size_t; + pub static vm_page_mask: vm_size_t; + pub static vm_page_shift: ::libc::c_int; +} + +#[allow(clippy::missing_safety_doc)] // FIXME +pub unsafe fn mach_vm_trunc_page(x: mach_vm_offset_t) -> mach_vm_offset_t { + x & !(vm_page_mask as mach_vm_size_t) +} + +#[allow(clippy::missing_safety_doc)] // FIXME +pub unsafe fn mach_vm_round_page(x: mach_vm_offset_t) -> mach_vm_offset_t { + (x + vm_page_mask as mach_vm_size_t) & !(vm_page_mask as mach_vm_size_t) +} + +#[cfg(test)] +mod tests { + use vm_page_size::*; + use vm_types::mach_vm_size_t; + + #[test] + fn page_size() { + unsafe { + assert!(vm_page_size > 0); + assert!(vm_page_size % 2 == 0); + assert_eq!(mach_vm_round_page(1), vm_page_size as mach_vm_size_t); + + #[cfg(target_arch = "aarch64")] + assert_eq!(vm_page_size, 16384); + + #[cfg(not(target_arch = "aarch64"))] + assert_eq!(vm_page_size, 4096); + } + } +} diff -Nru temporalio-1.3.0/vendor/mach2/src/vm_prot.rs temporalio-1.3.0/vendor/mach2/src/vm_prot.rs --- temporalio-1.3.0/vendor/mach2/src/vm_prot.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach2/src/vm_prot.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,13 @@ +//! This module corresponds to `mach/vm_prot.h`. + +pub type vm_prot_t = ::libc::c_int; + +pub const VM_PROT_NONE: vm_prot_t = 0; +pub const VM_PROT_READ: vm_prot_t = 1; +pub const VM_PROT_WRITE: vm_prot_t = 1 << 1; +pub const VM_PROT_EXECUTE: vm_prot_t = 1 << 2; +pub const VM_PROT_NO_CHANGE: vm_prot_t = 1 << 3; +pub const VM_PROT_COPY: vm_prot_t = 1 << 4; +pub const VM_PROT_WANTS_COPY: vm_prot_t = 1 << 4; +pub const VM_PROT_DEFAULT: vm_prot_t = VM_PROT_READ | VM_PROT_WRITE; +pub const VM_PROT_ALL: vm_prot_t = VM_PROT_READ | VM_PROT_WRITE | VM_PROT_EXECUTE; diff -Nru temporalio-1.3.0/vendor/mach2/src/vm_purgable.rs temporalio-1.3.0/vendor/mach2/src/vm_purgable.rs --- temporalio-1.3.0/vendor/mach2/src/vm_purgable.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach2/src/vm_purgable.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,42 @@ +//! This module corresponds to `mach/vm_purgable.h`. + +pub type vm_purgable_t = ::libc::c_int; + +pub const VM_PURGABLE_SET_STATE: vm_purgable_t = 0; +pub const VM_PURGABLE_GET_STATE: vm_purgable_t = 1; + +pub const VM_VOLATILE_GROUP_SHIFT: ::libc::c_int = 8; +pub const VM_VOLATILE_GROUP_MASK: ::libc::c_int = 7 << VM_VOLATILE_GROUP_SHIFT; +pub const VM_VOLATILE_GROUP_DEFAULT: ::libc::c_int = VM_VOLATILE_GROUP_0; + +pub const VM_VOLATILE_GROUP_0: ::libc::c_int = 0 << VM_VOLATILE_GROUP_SHIFT; +pub const VM_VOLATILE_GROUP_1: ::libc::c_int = 1 << VM_VOLATILE_GROUP_SHIFT; +pub const VM_VOLATILE_GROUP_2: ::libc::c_int = 2 << VM_VOLATILE_GROUP_SHIFT; +pub const VM_VOLATILE_GROUP_3: ::libc::c_int = 3 << VM_VOLATILE_GROUP_SHIFT; +pub const VM_VOLATILE_GROUP_4: ::libc::c_int = 4 << VM_VOLATILE_GROUP_SHIFT; +pub const VM_VOLATILE_GROUP_5: ::libc::c_int = 5 << VM_VOLATILE_GROUP_SHIFT; +pub const VM_VOLATILE_GROUP_6: ::libc::c_int = 6 << VM_VOLATILE_GROUP_SHIFT; +pub const VM_VOLATILE_GROUP_7: ::libc::c_int = 7 << VM_VOLATILE_GROUP_SHIFT; + +pub const VM_PURGABLE_BEHAVIOR_SHIFT: ::libc::c_int = 6; +pub const VM_PURGABLE_BEHAVIOR_MASK: ::libc::c_int = 1 << VM_PURGABLE_BEHAVIOR_SHIFT; +pub const VM_PURGABLE_BEHAVIOR_FIFO: ::libc::c_int = 0 << VM_PURGABLE_BEHAVIOR_SHIFT; +pub const VM_PURGABLE_BEHAVIOR_LIFO: ::libc::c_int = 1 << VM_PURGABLE_BEHAVIOR_SHIFT; + +pub const VM_PURGABLE_ORDERING_SHIFT: ::libc::c_int = 5; +pub const VM_PURGABLE_ORDERING_MASK: ::libc::c_int = 1 << VM_PURGABLE_ORDERING_SHIFT; +pub const VM_PURGABLE_ORDERING_OBSOLETE: ::libc::c_int = 1 << VM_PURGABLE_ORDERING_SHIFT; +pub const VM_PURGABLE_ORDERING_NORMAL: ::libc::c_int = 0 << VM_PURGABLE_ORDERING_SHIFT; + +pub const VM_VOLATILE_ORDER_SHIFT: ::libc::c_int = 4; +pub const VM_VOLATILE_ORDER_MASK: ::libc::c_int = 1 << VM_VOLATILE_ORDER_SHIFT; +pub const VM_VOLATILE_MAKE_FIRST_IN_GROUP: ::libc::c_int = 1 << VM_VOLATILE_ORDER_SHIFT; +pub const VM_VOLATILE_MAKE_LAST_IN_GROUP: ::libc::c_int = 0 << VM_VOLATILE_ORDER_SHIFT; + +pub const VM_PURGABLE_STATE_MIN: ::libc::c_int = 0; +pub const VM_PURGABLE_STATE_MAX: ::libc::c_int = 3; +pub const VM_PURGABLE_STATE_MASK: ::libc::c_int = 3; +pub const VM_PURGABLE_NONVOLATILE: ::libc::c_int = 0; +pub const VM_PURGABLE_VOLATILE: ::libc::c_int = 1; +pub const VM_PURGABLE_EMPTY: ::libc::c_int = 2; +pub const VM_PURGABLE_DENY: ::libc::c_int = 3; diff -Nru temporalio-1.3.0/vendor/mach2/src/vm_region.rs temporalio-1.3.0/vendor/mach2/src/vm_region.rs --- temporalio-1.3.0/vendor/mach2/src/vm_region.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach2/src/vm_region.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,238 @@ +//! This module roughly corresponds to `mach/vm_region.h`. + +use boolean::boolean_t; +use mem; +use memory_object_types::{memory_object_offset_t, vm_object_id_t}; +use message::mach_msg_type_number_t; +use vm_behavior::vm_behavior_t; +use vm_inherit::vm_inherit_t; +use vm_prot::vm_prot_t; +use vm_types::{mach_vm_address_t, mach_vm_size_t}; + +pub type vm32_object_id_t = u32; + +pub type vm_region_info_t = *mut ::libc::c_int; +pub type vm_region_info_64_t = *mut ::libc::c_int; +pub type vm_region_recurse_info_t = *mut ::libc::c_int; +pub type vm_region_recurse_info_64_t = *mut ::libc::c_int; +pub type vm_region_flavor_t = ::libc::c_int; +pub type vm_region_info_data_t = [::libc::c_int; VM_REGION_INFO_MAX as usize]; + +pub type vm_region_basic_info_64_t = *mut vm_region_basic_info_64; +pub type vm_region_basic_info_data_64_t = vm_region_basic_info_64; +pub type vm_region_basic_info_t = *mut vm_region_basic_info; +pub type vm_region_basic_info_data_t = vm_region_basic_info; +pub type vm_region_extended_info_t = *mut vm_region_extended_info; +pub type vm_region_extended_info_data_t = vm_region_extended_info; +pub type vm_region_top_info_t = *mut vm_region_top_info; +pub type vm_region_top_info_data_t = vm_region_top_info; +pub type vm_region_submap_info_t = *mut vm_region_submap_info; +pub type vm_region_submap_info_data_t = vm_region_submap_info; +pub type vm_region_submap_info_64_t = *mut vm_region_submap_info_64; +pub type vm_region_submap_info_data_64_t = vm_region_submap_info_64; +pub type vm_region_submap_short_info_64_t = *mut vm_region_submap_short_info_64; +pub type vm_region_submap_short_info_data_64_t = vm_region_submap_short_info_64; +pub type vm_page_info_t = *mut ::libc::c_int; +pub type vm_page_info_flavor_t = ::libc::c_int; +pub type vm_page_info_basic_t = *mut vm_page_info_basic; +pub type vm_page_info_basic_data_t = vm_page_info_basic; +pub type mach_vm_read_entry_t = [mach_vm_read_entry; VM_MAP_ENTRY_MAX as usize]; + +pub const VM_REGION_INFO_MAX: ::libc::c_int = 1 << 10; +pub const VM_MAP_ENTRY_MAX: ::libc::c_int = 1 << 8; + +pub const VM_PAGE_INFO_BASIC: vm_page_info_flavor_t = 1; + +pub const VM_REGION_BASIC_INFO_64: vm_region_flavor_t = 9; +pub const VM_REGION_BASIC_INFO: vm_region_flavor_t = 10; +pub const VM_REGION_EXTENDED_INFO: vm_region_flavor_t = 13; +pub const VM_REGION_TOP_INFO: vm_region_flavor_t = 12; + +pub const SM_COW: ::libc::c_uchar = 1; +pub const SM_PRIVATE: ::libc::c_uchar = 2; +pub const SM_EMPTY: ::libc::c_uchar = 3; +pub const SM_SHARED: ::libc::c_uchar = 4; +pub const SM_TRUESHARED: ::libc::c_uchar = 5; +pub const SM_PRIVATE_ALIASED: ::libc::c_uchar = 6; +pub const SM_SHARED_ALIASED: ::libc::c_uchar = 7; + +#[repr(C, packed(4))] +#[derive(Copy, Clone, Debug, Default, Hash, PartialOrd, PartialEq, Eq, Ord)] +pub struct vm_region_basic_info_64 { + pub protection: vm_prot_t, + pub max_protection: vm_prot_t, + pub inheritance: vm_inherit_t, + pub shared: boolean_t, + pub reserved: boolean_t, + pub offset: memory_object_offset_t, + pub behavior: vm_behavior_t, + pub user_wired_count: ::libc::c_ushort, +} + +impl vm_region_basic_info_64 { + pub fn count() -> mach_msg_type_number_t { + (mem::size_of::() / mem::size_of::<::libc::c_int>()) as mach_msg_type_number_t + } +} + +#[repr(C)] +#[derive(Copy, Clone, Debug, Default, Hash, PartialOrd, PartialEq, Eq, Ord)] +pub struct vm_region_basic_info { + pub protection: vm_prot_t, + pub max_protection: vm_prot_t, + pub inheritance: vm_inherit_t, + pub shared: boolean_t, + pub reserved: boolean_t, + pub offset: u32, + pub behavior: vm_behavior_t, + pub user_wired_count: ::libc::c_ushort, +} + +impl vm_region_basic_info { + pub fn count() -> mach_msg_type_number_t { + (mem::size_of::() / mem::size_of::<::libc::c_int>()) as mach_msg_type_number_t + } +} + +#[repr(C)] +#[derive(Copy, Clone, Debug, Default, Hash, PartialOrd, PartialEq, Eq, Ord)] +pub struct vm_region_extended_info { + pub protection: vm_prot_t, + pub user_tag: ::libc::c_uint, + pub pages_resident: ::libc::c_uint, + pub pages_shared_now_private: ::libc::c_uint, + pub pages_swapped_out: ::libc::c_uint, + pub pages_dirtied: ::libc::c_uint, + pub ref_count: ::libc::c_uint, + pub shadow_depth: ::libc::c_ushort, + pub external_pager: ::libc::c_uchar, + pub share_mode: ::libc::c_uchar, + pub pages_reusable: ::libc::c_uint, +} + +impl vm_region_extended_info { + pub fn count() -> mach_msg_type_number_t { + (mem::size_of::() / mem::size_of::<::libc::c_int>()) as mach_msg_type_number_t + } +} + +#[repr(C)] +#[derive(Copy, Clone, Debug, Default, Hash, PartialOrd, PartialEq, Eq, Ord)] +pub struct vm_region_top_info { + pub obj_id: ::libc::c_uint, + pub ref_count: ::libc::c_uint, + pub private_pages_resident: ::libc::c_uint, + pub shared_pages_resident: ::libc::c_uint, + pub share_mode: ::libc::c_uchar, +} + +impl vm_region_top_info { + pub fn count() -> mach_msg_type_number_t { + (mem::size_of::() / mem::size_of::<::libc::c_int>()) as mach_msg_type_number_t + } +} + +#[repr(C)] +#[derive(Copy, Clone, Debug, Default, Hash, PartialOrd, PartialEq, Eq, Ord)] +pub struct vm_region_submap_info { + pub protection: vm_prot_t, + pub max_protection: vm_prot_t, + pub inheritance: vm_inherit_t, + pub offset: u32, + pub user_tag: ::libc::c_uint, + pub pages_resident: ::libc::c_uint, + pub pages_shared_now_private: ::libc::c_uint, + pub pages_swapped_out: ::libc::c_uint, + pub pages_dirtied: ::libc::c_uint, + pub ref_count: ::libc::c_uint, + pub shadow_depth: ::libc::c_ushort, + pub external_pager: ::libc::c_uchar, + pub share_mode: ::libc::c_uchar, + pub is_submap: boolean_t, + pub behavior: vm_behavior_t, + pub object_id: vm32_object_id_t, + pub user_wired_count: ::libc::c_ushort, +} + +impl vm_region_submap_info { + pub fn count() -> mach_msg_type_number_t { + (mem::size_of::() / mem::size_of::<::libc::c_int>()) as mach_msg_type_number_t + } +} + +#[repr(C, packed(4))] +#[derive(Copy, Clone, Debug, Default, Hash, PartialOrd, PartialEq, Eq, Ord)] +pub struct vm_region_submap_info_64 { + pub protection: vm_prot_t, + pub max_protection: vm_prot_t, + pub inheritance: vm_inherit_t, + pub offset: memory_object_offset_t, + pub user_tag: ::libc::c_uint, + pub pages_resident: ::libc::c_uint, + pub pages_shared_now_private: ::libc::c_uint, + pub pages_swapped_out: ::libc::c_uint, + pub pages_dirtied: ::libc::c_uint, + pub ref_count: ::libc::c_uint, + pub shadow_depth: ::libc::c_ushort, + pub external_pager: ::libc::c_uchar, + pub share_mode: ::libc::c_uchar, + pub is_submap: boolean_t, + pub behavior: vm_behavior_t, + pub object_id: vm32_object_id_t, + pub user_wired_count: ::libc::c_ushort, + pub pages_reusable: ::libc::c_uint, +} + +impl vm_region_submap_info_64 { + pub fn count() -> mach_msg_type_number_t { + (mem::size_of::() / mem::size_of::<::libc::c_int>()) as mach_msg_type_number_t + } +} + +#[repr(C, packed(4))] +#[derive(Copy, Clone, Debug, Default, Hash, PartialOrd, PartialEq, Eq, Ord)] +pub struct vm_region_submap_short_info_64 { + pub protection: vm_prot_t, + pub max_protection: vm_prot_t, + pub inheritance: vm_inherit_t, + pub offset: memory_object_offset_t, + pub user_tag: ::libc::c_uint, + pub ref_count: ::libc::c_uint, + pub shadow_depth: ::libc::c_ushort, + pub external_pager: ::libc::c_uchar, + pub share_mode: ::libc::c_uchar, + pub is_submap: boolean_t, + pub behavior: vm_behavior_t, + pub object_id: vm32_object_id_t, + pub user_wired_count: ::libc::c_ushort, +} + +impl vm_region_submap_short_info_64 { + pub fn count() -> mach_msg_type_number_t { + (mem::size_of::() / mem::size_of::<::libc::c_int>()) as mach_msg_type_number_t + } +} + +#[repr(C)] +#[derive(Copy, Clone, Debug, Default, Hash, PartialOrd, PartialEq, Eq, Ord)] +pub struct vm_page_info_basic { + pub disposition: ::libc::c_int, + pub ref_count: ::libc::c_int, + pub object_id: vm_object_id_t, + pub offset: memory_object_offset_t, + pub depth: ::libc::c_int, + pub __pad: ::libc::c_int, +} + +impl vm_page_info_basic { + pub fn count() -> mach_msg_type_number_t { + (mem::size_of::() / mem::size_of::<::libc::c_int>()) as mach_msg_type_number_t + } +} + +#[repr(C, packed(4))] +#[derive(Copy, Clone, Debug, Default, Hash, PartialOrd, PartialEq, Eq, Ord)] +pub struct mach_vm_read_entry { + pub address: mach_vm_address_t, + pub size: mach_vm_size_t, +} diff -Nru temporalio-1.3.0/vendor/mach2/src/vm.rs temporalio-1.3.0/vendor/mach2/src/vm.rs --- temporalio-1.3.0/vendor/mach2/src/vm.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach2/src/vm.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,248 @@ +//! This module roughly corresponds to `mach/mach_vm.defs`. + +use boolean::boolean_t; +use kern_return::kern_return_t; +use mach_types::{mem_entry_name_port_t, vm_task_entry_t}; +use memory_object_types::{memory_object_offset_t, memory_object_size_t}; +use message::mach_msg_type_number_t; +use port::mach_port_t; +use vm_attributes::{vm_machine_attribute_t, vm_machine_attribute_val_t}; +use vm_behavior::vm_behavior_t; +use vm_inherit::vm_inherit_t; +use vm_prot::vm_prot_t; +use vm_purgable::vm_purgable_t; +use vm_region::mach_vm_read_entry_t; +use vm_region::{ + vm_page_info_flavor_t, vm_page_info_t, vm_region_flavor_t, vm_region_info_t, + vm_region_recurse_info_t, +}; +use vm_sync::vm_sync_t; +use vm_types::{ + integer_t, mach_vm_address_t, mach_vm_offset_t, mach_vm_size_t, natural_t, vm_map_t, + vm_offset_t, vm_size_t, +}; + +extern "C" { + pub fn mach_vm_allocate( + target: vm_task_entry_t, + address: *mut mach_vm_address_t, + size: mach_vm_size_t, + flags: ::libc::c_int, + ) -> kern_return_t; + + pub fn mach_vm_deallocate( + target: vm_task_entry_t, + address: mach_vm_address_t, + size: mach_vm_size_t, + ) -> kern_return_t; + + pub fn mach_vm_protect( + target_task: vm_task_entry_t, + address: mach_vm_address_t, + size: mach_vm_size_t, + set_maximum: boolean_t, + new_protection: vm_prot_t, + ) -> kern_return_t; + + pub fn mach_vm_inherit( + target_task: vm_task_entry_t, + address: mach_vm_address_t, + size: mach_vm_size_t, + new_inheritance: vm_inherit_t, + ) -> kern_return_t; + + pub fn mach_vm_read( + target_task: vm_task_entry_t, + address: mach_vm_address_t, + size: mach_vm_size_t, + data: *mut vm_offset_t, + dataCnt: *mut mach_msg_type_number_t, + ) -> kern_return_t; + + #[allow(improper_ctypes)] + pub fn mach_vm_read_list( + target_task: vm_task_entry_t, + data_list: mach_vm_read_entry_t, + count: natural_t, + ) -> kern_return_t; + + pub fn mach_vm_write( + target_task: vm_map_t, + address: mach_vm_address_t, + data: vm_offset_t, + dataCnt: mach_msg_type_number_t, + ) -> kern_return_t; + + pub fn mach_vm_copy( + target_task: vm_task_entry_t, + source_address: mach_vm_address_t, + size: mach_vm_size_t, + dest_address: mach_vm_address_t, + ) -> kern_return_t; + + pub fn mach_vm_read_overwrite( + target_task: vm_task_entry_t, + address: mach_vm_address_t, + size: mach_vm_size_t, + data: mach_vm_address_t, + outsize: *mut mach_vm_size_t, + ) -> kern_return_t; + + pub fn mach_vm_msync( + target_task: vm_task_entry_t, + address: mach_vm_address_t, + size: mach_vm_size_t, + sync_flags: vm_sync_t, + ) -> kern_return_t; + + pub fn mach_vm_behavior_set( + target_task: vm_task_entry_t, + address: mach_vm_address_t, + size: mach_vm_size_t, + new_behavior: vm_behavior_t, + ) -> kern_return_t; + + pub fn mach_vm_map( + target_task: vm_task_entry_t, + inout: *mut mach_vm_address_t, + size: mach_vm_size_t, + mask: mach_vm_offset_t, + flags: ::libc::c_int, + object: mem_entry_name_port_t, + offset: memory_object_offset_t, + copy: boolean_t, + cur_protection: vm_prot_t, + max_protection: vm_prot_t, + inheritance: vm_inherit_t, + ) -> kern_return_t; + + pub fn mach_vm_machine_attribute( + target_task: vm_task_entry_t, + address: mach_vm_address_t, + size: mach_vm_size_t, + attribute: vm_machine_attribute_t, + value: *mut vm_machine_attribute_val_t, + ) -> kern_return_t; + + pub fn mach_vm_remap( + target_task: vm_task_entry_t, + target_address: *mut mach_vm_address_t, + size: mach_vm_size_t, + mask: mach_vm_offset_t, + flags: ::libc::c_int, + src_task: vm_task_entry_t, + src_address: mach_vm_address_t, + copy: boolean_t, + cur_protection: *mut vm_prot_t, + out: *mut vm_prot_t, + inheritance: vm_inherit_t, + ) -> kern_return_t; + + pub fn mach_vm_page_query( + target_map: vm_map_t, + offset: mach_vm_offset_t, + disposition: *mut integer_t, + ref_count: *mut integer_t, + ) -> kern_return_t; + + pub fn mach_vm_region_recurse( + target_task: vm_task_entry_t, + address: *mut mach_vm_address_t, + size: *mut mach_vm_size_t, + nesting_depth: *mut natural_t, + info: vm_region_recurse_info_t, + infoCnt: *mut mach_msg_type_number_t, + ) -> kern_return_t; + + pub fn mach_vm_region( + target_task: vm_task_entry_t, + address: *mut mach_vm_address_t, + size: *mut mach_vm_size_t, + flavor: vm_region_flavor_t, + info: vm_region_info_t, + infoCnt: *mut mach_msg_type_number_t, + object_name: *mut mach_port_t, + ) -> kern_return_t; + + pub fn mach_make_memory_entry( + target_task: vm_map_t, + size: *mut vm_size_t, + offset: vm_offset_t, + permission: vm_prot_t, + object_handle: *mut mem_entry_name_port_t, + parent_handle: mem_entry_name_port_t, + ) -> kern_return_t; + + pub fn mach_make_memory_entry_64( + target_task: vm_map_t, + size: *mut memory_object_size_t, + offset: memory_object_offset_t, + permission: vm_prot_t, + object_handle: *mut mach_port_t, + parent_entry: mem_entry_name_port_t, + ) -> kern_return_t; + + pub fn mach_vm_purgable_control( + target_task: vm_task_entry_t, + address: mach_vm_address_t, + control: vm_purgable_t, + state: *mut ::libc::c_int, + ) -> kern_return_t; + + pub fn mach_vm_page_info( + target_task: vm_task_entry_t, + address: mach_vm_address_t, + flavor: vm_page_info_flavor_t, + info: vm_page_info_t, + infoCnt: *mut mach_msg_type_number_t, + ) -> kern_return_t; +} + +#[cfg(test)] +mod tests { + use super::*; + use kern_return::KERN_SUCCESS; + use traps::mach_task_self; + use vm_statistics::VM_FLAGS_ANYWHERE; + + #[test] + fn mach_vm_allocate_sanity() { + unsafe { + let size = 0x100; + let task = mach_task_self(); + + let mut address: mach_vm_address_t = 0; + assert_eq!( + mach_vm_allocate(task, &mut address, size, VM_FLAGS_ANYWHERE), + KERN_SUCCESS + ); + assert_eq!(mach_vm_deallocate(task, address, size), KERN_SUCCESS); + } + } + + #[test] + fn mach_vm_region_sanity() { + use mem; + use vm_prot::{VM_PROT_EXECUTE, VM_PROT_READ}; + use vm_region::{vm_region_basic_info_64, VM_REGION_BASIC_INFO_64}; + unsafe { + let mut size = 0x10; + let mut object_name = 0; + let mut address = mach_vm_region_sanity as mach_vm_address_t; + let mut info: vm_region_basic_info_64 = mem::zeroed(); + let mut info_size = vm_region_basic_info_64::count(); + + let result = mach_vm_region( + mach_task_self(), + &mut address, + &mut size, + VM_REGION_BASIC_INFO_64, + (&mut info as *mut _) as vm_region_info_t, + &mut info_size, + &mut object_name, + ); + assert_eq!(result, KERN_SUCCESS); + assert_eq!(info.protection, VM_PROT_READ | VM_PROT_EXECUTE); + } + } +} diff -Nru temporalio-1.3.0/vendor/mach2/src/vm_statistics.rs temporalio-1.3.0/vendor/mach2/src/vm_statistics.rs --- temporalio-1.3.0/vendor/mach2/src/vm_statistics.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach2/src/vm_statistics.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,58 @@ +//! This module roughly corresponds to `mach/vm_statistics.h` + +use vm_types::{integer_t, natural_t}; + +pub type vm_statistics_t = *mut vm_statistics; +pub type vm_statistics_data_t = vm_statistics; + +pub const VM_PAGE_QUERY_PAGE_PRESENT: integer_t = 1; +pub const VM_PAGE_QUERY_PAGE_FICTITIOUS: integer_t = 1 << 1; +pub const VM_PAGE_QUERY_PAGE_REF: integer_t = 1 << 2; +pub const VM_PAGE_QUERY_PAGE_DIRTY: integer_t = 1 << 3; + +pub const VM_MEMORY_MALLOC: ::libc::c_uint = 1; +pub const VM_MEMORY_MALLOC_SMALL: ::libc::c_uint = 2; +pub const VM_MEMORY_MALLOC_LARGE: ::libc::c_uint = 3; +pub const VM_MEMORY_MALLOC_HUGE: ::libc::c_uint = 4; +pub const VM_MEMORY_SBRK: ::libc::c_uint = 5; +pub const VM_MEMORY_ANALYSIS_TOOL: ::libc::c_uint = 10; +pub const VM_MEMORY_MACH_MSG: ::libc::c_uint = 20; +pub const VM_MEMORY_IOKIT: ::libc::c_uint = 21; +pub const VM_MEMORY_STACK: ::libc::c_uint = 30; +pub const VM_MEMORY_GUARD: ::libc::c_uint = 31; +pub const VM_MEMORY_SHARED_PMAP: ::libc::c_uint = 32; +pub const VM_MEMORY_DYLIB: ::libc::c_uint = 33; +pub const VM_MEMORY_APPKIT: ::libc::c_uint = 40; +pub const VM_MEMORY_FOUNDATION: ::libc::c_uint = 41; +pub const VM_MEMORY_COREGRAPHICS: ::libc::c_uint = 42; +pub const VM_MEMORY_CARBON: ::libc::c_uint = 43; +pub const VM_MEMORY_JAVA: ::libc::c_uint = 44; +pub const VM_MEMORY_ATS: ::libc::c_uint = 50; +pub const VM_MEMORY_DYLD: ::libc::c_uint = 60; +pub const VM_MEMORY_DYLD_MALLOC: ::libc::c_uint = 61; +pub const VM_MEMORY_APPLICATION_SPECIFIC_1: ::libc::c_uint = 240; +pub const VM_MEMORY_APPLICATION_SPECIFIC_16: ::libc::c_uint = 255; + +pub const VM_FLAGS_FIXED: ::libc::c_int = 0x0; +pub const VM_FLAGS_ANYWHERE: ::libc::c_int = 0x1; +pub const VM_FLAGS_OVERWRITE: ::libc::c_int = 0x4000; + +#[repr(C)] +#[derive(Copy, Clone, Debug, Default, Hash, PartialOrd, PartialEq, Eq, Ord)] +pub struct vm_statistics { + pub free_count: natural_t, + pub active_count: natural_t, + pub inactive_count: natural_t, + pub wire_count: natural_t, + pub zero_fill_count: natural_t, + pub reactivations: natural_t, + pub pageins: natural_t, + pub pageouts: natural_t, + pub faults: natural_t, + pub cow_faults: natural_t, + pub lookups: natural_t, + pub hits: natural_t, + pub purgeable_count: natural_t, + pub purges: natural_t, + pub speculative_count: natural_t, +} diff -Nru temporalio-1.3.0/vendor/mach2/src/vm_sync.rs temporalio-1.3.0/vendor/mach2/src/vm_sync.rs --- temporalio-1.3.0/vendor/mach2/src/vm_sync.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach2/src/vm_sync.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,11 @@ +//! This module corresponds to `mach/vm_sync.h`. + +pub type vm_sync_t = ::libc::c_uint; + +pub const VM_SYNC_ASYNCHRONOUS: vm_sync_t = 1; +pub const VM_SYNC_SYNCHRONOUS: vm_sync_t = 1 << 1; +pub const VM_SYNC_INVALIDATE: vm_sync_t = 1 << 2; +pub const VM_SYNC_KILLPAGES: vm_sync_t = 1 << 3; +pub const VM_SYNC_DEACTIVATE: vm_sync_t = 1 << 4; +pub const VM_SYNC_CONTIGUOUS: vm_sync_t = 1 << 5; +pub const VM_SYNC_REUSABLEPAGES: vm_sync_t = 1 << 6; diff -Nru temporalio-1.3.0/vendor/mach2/src/vm_types.rs temporalio-1.3.0/vendor/mach2/src/vm_types.rs --- temporalio-1.3.0/vendor/mach2/src/vm_types.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mach2/src/vm_types.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,19 @@ +//! This module roughly corresponds to `mach/i386/vm_types.h`. + +pub type natural_t = ::libc::c_uint; +pub type integer_t = ::libc::c_int; + +pub type user_addr_t = u64; + +pub type mach_vm_address_t = u64; +pub type mach_vm_offset_t = u64; +pub type mach_vm_size_t = u64; +pub type vm_map_offset_t = u64; +pub type vm_map_address_t = u64; +pub type vm_map_size_t = u64; +pub type vm_map_t = ::port::mach_port_t; +pub type vm_offset_t = ::libc::uintptr_t; +pub type vm_size_t = ::libc::uintptr_t; +pub type vm_address_t = vm_offset_t; + +pub type mach_port_context_t = mach_vm_address_t; diff -Nru temporalio-1.3.0/vendor/matchit/.cargo-checksum.json temporalio-1.3.0/vendor/matchit/.cargo-checksum.json --- temporalio-1.3.0/vendor/matchit/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/matchit/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"Cargo.lock":"8b68663195989c2626c0a4838871be3180a9ee0af7abdeaa0a9a7faeba360de5","Cargo.toml":"fb280024141e903fabc581ff725f3ce87ff49d186db20a30cb30293f5b0f3d39","LICENSE":"de701d0618d694feb1af90f02181a1763d9b0bdeb70a3a592781e529077dba65","LICENSE.httprouter":"162ce11ad71338d0a0c6ebaf5c48af72c6ae237b468859d3656fe2d9ed3f3a85","README.md":"19bb33bd5f022d1332aedd95543fce4744f23d8f991194a684da8a745e740c7e","benches/bench.rs":"28fc25075553d4fed5b9030f5d694d9aee1347801f4f45d0131dae8c3d1d9a06","examples/hyper.rs":"bd51bb5a293a6fed5162d70f509061219c61c63b83da8248bde4d75a2f7ac025","src/error.rs":"81d5edc5c3a543cccae7fad19dd880c9beae8d9f7664b823eb1161bceefb27ae","src/lib.rs":"4fea26791d806ab41f5d3047ac2bd4d378fc20a8ead3a735452c30138859e866","src/params.rs":"005df25b4fa79b764eb36ad760568bfbf18121a2b012f720b3478c48aaa86978","src/router.rs":"9e6ea584af6f1579e118de2c07992e490307722f67cd1efc665f66b2ee98c480","src/tree.rs":"aedc65cba24ab1829cd0e555e25039d050c81e795187059af8b1875f0dd7ca6f","tests/tree.rs":"0fd3f525473d65c343f8b3984c810953788d5eff91b2775ec950f7591d4f623e"},"package":"0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94"} \ No newline at end of file +{"files":{"Cargo.lock":"aa7765c33f4415e2aa038b1f7cd1b3248177b0100a1a4e2f7f041af8ea39db5e","Cargo.toml":"56ed7c4d456e5db14108c6e5ccd6efa793669d6ce20c903490f1123bdc0cc689","LICENSE":"de701d0618d694feb1af90f02181a1763d9b0bdeb70a3a592781e529077dba65","LICENSE.httprouter":"162ce11ad71338d0a0c6ebaf5c48af72c6ae237b468859d3656fe2d9ed3f3a85","README.md":"e354f6278de17f32ae3a23f49c4a7aeb8c12e3568ad6518b4650ed0ebcc0190f","benches/bench.rs":"28fc25075553d4fed5b9030f5d694d9aee1347801f4f45d0131dae8c3d1d9a06","examples/hyper.rs":"bd51bb5a293a6fed5162d70f509061219c61c63b83da8248bde4d75a2f7ac025","src/error.rs":"5a58dbc08d5fe3a6af74260034ed11d16229c05397232f7bd64b293c6f6e55fd","src/lib.rs":"ae4606bce4ff5b71b7f439bc1bc3961de2b0512a03f039fa61feac011d058ae0","src/params.rs":"72795f04ac5804c0ab5786e714a2a92a1f053371f33e8be6dc8eaf9d3d0ef210","src/router.rs":"9e6ea584af6f1579e118de2c07992e490307722f67cd1efc665f66b2ee98c480","src/tree.rs":"a80cf12e14c3693f85c0128b7db2ce4e95a85617c1ea8fba244dd2fd31d63dc2","tests/tree.rs":"eefa9bb191783ed2d0cbac2dffb9366075ac2e721c859cf2c270e6cfe3c5c1c4"},"package":"ed1202b2a6f884ae56f04cff409ab315c5ce26b5e58d7412e484f01fd52f52ef"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/matchit/Cargo.lock temporalio-1.3.0/vendor/matchit/Cargo.lock --- temporalio-1.3.0/vendor/matchit/Cargo.lock 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/matchit/Cargo.lock 2023-10-30 19:40:00.000000000 +0000 @@ -16,21 +16,6 @@ ] [[package]] -name = "addr2line" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - -[[package]] name = "aho-corasick" version = "0.7.19" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -57,21 +42,6 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] -name = "backtrace" -version = "0.3.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" -dependencies = [ - "addr2line", - "cc", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", -] - -[[package]] name = "bitflags" version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -117,15 +87,6 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] -name = "cc" -version = "1.0.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" -dependencies = [ - "libc", -] - -[[package]] name = "cfg-if" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -257,36 +218,36 @@ [[package]] name = "futures-channel" -version = "0.3.28" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" +checksum = "52ba265a92256105f45b719605a571ffe2d1f0fea3807304b522c1d778f79eed" dependencies = [ "futures-core", ] [[package]] name = "futures-core" -version = "0.3.28" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" +checksum = "04909a7a7e4633ae6c4a9ab280aeb86da1236243a77b694a49eacd659a4bd3ac" [[package]] name = "futures-sink" -version = "0.3.28" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" +checksum = "39c15cf1a4aa79df40f1bb462fb39676d0ad9e366c2a33b590d7c66f4f81fcf9" [[package]] name = "futures-task" -version = "0.3.28" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" +checksum = "2ffb393ac5d9a6eaa9d3fdf37ae2776656b706e200c8e16b1bdb227f5198e6ea" [[package]] name = "futures-util" -version = "0.3.28" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" +checksum = "197676987abd2f9cadff84926f410af1c183608d36641465df73ae8211dc65d6" dependencies = [ "futures-core", "futures-task", @@ -295,12 +256,6 @@ ] [[package]] -name = "gimli" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" - -[[package]] name = "gonzales" version = "0.0.3-beta" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -311,9 +266,9 @@ [[package]] name = "h2" -version = "0.3.21" +version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91fc23aa11be92976ef4729127f1a74adf36d8436f7816b185d18df956790833" +checksum = "5f9f29bc9dda355256b2916cf526ab02ce0aeaaaf2bad60d65ef3f12f11dd0f4" dependencies = [ "bytes", "fnv", @@ -379,15 +334,15 @@ [[package]] name = "httpdate" -version = "1.0.3" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" +checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" [[package]] name = "hyper" -version = "0.14.27" +version = "0.14.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" +checksum = "034711faac9d2166cb1baf1a2fb0b60b1f277f8492fd72176c17f3515e1abd3c" dependencies = [ "bytes", "futures-channel", @@ -400,7 +355,7 @@ "httpdate", "itoa 1.0.4", "pin-project-lite", - "socket2 0.4.9", + "socket2", "tokio", "tower-service", "tracing", @@ -409,9 +364,9 @@ [[package]] name = "indexmap" -version = "1.9.3" +version = "1.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +checksum = "1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399" dependencies = [ "autocfg", "hashbrown", @@ -455,15 +410,15 @@ [[package]] name = "libc" -version = "0.2.148" +version = "0.2.137" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cdc71e17332e86d2e1d38c1f99edcb6288ee11b815fb1a4b049eaa2114d369b" +checksum = "fc7fcc620a3bff7cdd7a365be3376c97191aeaccc2a603e600951e452615bf89" [[package]] name = "lock_api" -version = "0.4.10" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" +checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" dependencies = [ "autocfg", "scopeguard", @@ -480,7 +435,7 @@ [[package]] name = "matchit" -version = "0.7.3" +version = "0.7.2" dependencies = [ "actix-router", "criterion", @@ -510,21 +465,13 @@ ] [[package]] -name = "miniz_oxide" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" -dependencies = [ - "adler", -] - -[[package]] name = "mio" -version = "0.8.8" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" +checksum = "e5d732bc30207a6423068df043e3d02e0735b155ad7ce1a6f76fe2baa5b158de" dependencies = [ "libc", + "log", "wasi", "windows-sys", ] @@ -549,15 +496,6 @@ ] [[package]] -name = "object" -version = "0.32.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" -dependencies = [ - "memchr", -] - -[[package]] name = "once_cell" version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -581,15 +519,15 @@ [[package]] name = "parking_lot_core" -version = "0.9.8" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" +checksum = "7ff9f3fef3968a3ec5945535ed654cb38ff72d7495a25619e2247fb15a2ed9ba" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-targets", + "windows-sys", ] [[package]] @@ -600,29 +538,29 @@ [[package]] name = "pin-project" -version = "1.1.3" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" +checksum = "ad29a609b6bcd67fee905812e544992d216af9d755757c05ed2d0e15a74c6ecc" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.3" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" +checksum = "069bdb1e05adc7a8990dce9cc75370895fbe4e3d58b9b73bf1aee56359344a55" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn", ] [[package]] name = "pin-project-lite" -version = "0.2.13" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" +checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" [[package]] name = "pin-utils" @@ -660,18 +598,18 @@ [[package]] name = "proc-macro2" -version = "1.0.67" +version = "1.0.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d433d9f1a3e8c1263d9456598b16fec66f4acc9a74dacffd35c7bb09b3a1328" +checksum = "5ea3d908b0e36316caf9e9e2c4625cdde190a7e6f440d794667ed17a1855e725" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.33" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179" dependencies = [ "proc-macro2", ] @@ -702,9 +640,9 @@ [[package]] name = "redox_syscall" -version = "0.3.5" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" dependencies = [ "bitflags", ] @@ -749,12 +687,6 @@ ] [[package]] -name = "rustc-demangle" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" - -[[package]] name = "ryu" version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -799,7 +731,7 @@ dependencies = [ "proc-macro2", "quote", - "syn 1.0.103", + "syn", ] [[package]] @@ -815,18 +747,18 @@ [[package]] name = "signal-hook-registry" -version = "1.4.1" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0" dependencies = [ "libc", ] [[package]] name = "slab" -version = "0.4.9" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +checksum = "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef" dependencies = [ "autocfg", ] @@ -859,25 +791,15 @@ [[package]] name = "socket2" -version = "0.4.9" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" +checksum = "02e2d2db9033d13a1567121ddd7a095ee144db4e1ca1b1bda3419bc0da294ebd" dependencies = [ "libc", "winapi", ] [[package]] -name = "socket2" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4031e820eb552adee9295814c0ced9e5cf38ddf1e8b7d566d6de8e2538ea989e" -dependencies = [ - "libc", - "windows-sys", -] - -[[package]] name = "static_assertions" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -895,17 +817,6 @@ ] [[package]] -name = "syn" -version = "2.0.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7303ef2c05cd654186cb250d29049a24840ca25d2747c25c0381c8d9e2f582e8" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] name = "textwrap" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -926,39 +837,40 @@ [[package]] name = "tokio" -version = "1.32.0" +version = "1.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17ed6077ed6cd6c74735e21f37eb16dc3935f96878b1fe961074089cc80893f9" +checksum = "1d9f76183f91ecfb55e1d7d5602bd1d979e38a3a522fe900241cf195624d67ae" dependencies = [ - "backtrace", + "autocfg", "bytes", "libc", + "memchr", "mio", "num_cpus", "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2 0.5.4", + "socket2", "tokio-macros", "windows-sys", ] [[package]] name = "tokio-macros" -version = "2.1.0" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" +checksum = "d266c00fde287f55d3f1c3e96c500c362a2b8c695076ec180f27918820bc6df8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.37", + "syn", ] [[package]] name = "tokio-util" -version = "0.7.9" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d68074620f57a0b21594d9735eb2e98ab38b17f80d3fcb189fca266771ca60d" +checksum = "0bb2e075f03b3d66d8d8785356224ba688d2906a371015e225beeb65ca92c740" dependencies = [ "bytes", "futures-core", @@ -1010,9 +922,9 @@ [[package]] name = "tracing-core" -version = "0.1.31" +version = "0.1.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" +checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" dependencies = [ "once_cell", ] @@ -1054,10 +966,11 @@ [[package]] name = "want" -version = "0.3.1" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" dependencies = [ + "log", "try-lock", ] @@ -1088,7 +1001,7 @@ "once_cell", "proc-macro2", "quote", - "syn 1.0.103", + "syn", "wasm-bindgen-shared", ] @@ -1110,7 +1023,7 @@ dependencies = [ "proc-macro2", "quote", - "syn 1.0.103", + "syn", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -1164,18 +1077,9 @@ [[package]] name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-targets" -version = "0.48.5" +version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" dependencies = [ "windows_aarch64_gnullvm", "windows_aarch64_msvc", @@ -1188,42 +1092,42 @@ [[package]] name = "windows_aarch64_gnullvm" -version = "0.48.5" +version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" +checksum = "41d2aa71f6f0cbe00ae5167d90ef3cfe66527d6f613ca78ac8024c3ccab9a19e" [[package]] name = "windows_aarch64_msvc" -version = "0.48.5" +version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" +checksum = "dd0f252f5a35cac83d6311b2e795981f5ee6e67eb1f9a7f64eb4500fbc4dcdb4" [[package]] name = "windows_i686_gnu" -version = "0.48.5" +version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" +checksum = "fbeae19f6716841636c28d695375df17562ca208b2b7d0dc47635a50ae6c5de7" [[package]] name = "windows_i686_msvc" -version = "0.48.5" +version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" +checksum = "84c12f65daa39dd2babe6e442988fc329d6243fdce47d7d2d155b8d874862246" [[package]] name = "windows_x86_64_gnu" -version = "0.48.5" +version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" +checksum = "bf7b1b21b5362cbc318f686150e5bcea75ecedc74dd157d874d754a2ca44b0ed" [[package]] name = "windows_x86_64_gnullvm" -version = "0.48.5" +version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" +checksum = "09d525d2ba30eeb3297665bd434a54297e4170c7f1a44cad4ef58095b4cd2028" [[package]] name = "windows_x86_64_msvc" -version = "0.48.5" +version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" +checksum = "f40009d85759725a34da6d89a94e63d7bdc50a862acf0dbc7c8e488f1edcb6f5" diff -Nru temporalio-1.3.0/vendor/matchit/Cargo.toml temporalio-1.3.0/vendor/matchit/Cargo.toml --- temporalio-1.3.0/vendor/matchit/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/matchit/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -12,9 +12,9 @@ [package] edition = "2021" name = "matchit" -version = "0.7.3" +version = "0.7.2" authors = ["Ibraheem Ahmed "] -description = "A high performance, zero-copy URL router." +description = "A blazing fast URL router." readme = "README.md" keywords = [ "router", diff -Nru temporalio-1.3.0/vendor/matchit/README.md temporalio-1.3.0/vendor/matchit/README.md --- temporalio-1.3.0/vendor/matchit/README.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/matchit/README.md 2023-10-30 19:40:00.000000000 +0000 @@ -1,6 +1,6 @@ # `matchit` -[![Documentation](https://img.shields.io/badge/docs-0.7.3-4d76ae?style=for-the-badge)](https://docs.rs/matchit) +[![Documentation](https://img.shields.io/badge/docs-0.7.2-4d76ae?style=for-the-badge)](https://docs.rs/matchit) [![Version](https://img.shields.io/crates/v/matchit?style=for-the-badge)](https://crates.io/crates/matchit) [![License](https://img.shields.io/crates/l/matchit?style=for-the-badge)](https://crates.io/crates/matchit) diff -Nru temporalio-1.3.0/vendor/matchit/src/error.rs temporalio-1.3.0/vendor/matchit/src/error.rs --- temporalio-1.3.0/vendor/matchit/src/error.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/matchit/src/error.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,4 +1,4 @@ -use crate::tree::{denormalize_params, Node}; +use crate::tree::Node; use std::fmt; @@ -49,19 +49,12 @@ route.extend_from_slice(¤t.prefix); } - let mut last = current; - while let Some(node) = last.children.first() { - last = node; - } - let mut current = current.children.first(); while let Some(node) = current { route.extend_from_slice(&node.prefix); current = node.children.first(); } - denormalize_params(&mut route, &last.param_remapping); - InsertError::Conflict { with: String::from_utf8(route).unwrap(), } diff -Nru temporalio-1.3.0/vendor/matchit/src/lib.rs temporalio-1.3.0/vendor/matchit/src/lib.rs --- temporalio-1.3.0/vendor/matchit/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/matchit/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,6 +1,6 @@ //! # `matchit` //! -//! [![Documentation](https://img.shields.io/badge/docs-0.7.3-4d76ae?style=for-the-badge)](https://docs.rs/matchit) +//! [![Documentation](https://img.shields.io/badge/docs-0.7.2-4d76ae?style=for-the-badge)](https://docs.rs/matchit) //! [![Version](https://img.shields.io/crates/v/matchit?style=for-the-badge)](https://crates.io/crates/matchit) //! [![License](https://img.shields.io/crates/l/matchit?style=for-the-badge)](https://crates.io/crates/matchit) //! diff -Nru temporalio-1.3.0/vendor/matchit/src/params.rs temporalio-1.3.0/vendor/matchit/src/params.rs --- temporalio-1.3.0/vendor/matchit/src/params.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/matchit/src/params.rs 2023-10-30 19:40:00.000000000 +0000 @@ -139,24 +139,6 @@ ParamsKind::Large(vec) => vec.push(param), } } - - // Transform each key. - pub(crate) fn for_each_key_mut(&mut self, f: impl Fn((usize, &mut &'k [u8]))) { - match &mut self.kind { - ParamsKind::None => {} - ParamsKind::Small(arr, len) => arr - .iter_mut() - .take(*len) - .map(|param| &mut param.key) - .enumerate() - .for_each(f), - ParamsKind::Large(vec) => vec - .iter_mut() - .map(|param| &mut param.key) - .enumerate() - .for_each(f), - } - } } /// An iterator over the keys and values of a route's [parameters](crate::Params). diff -Nru temporalio-1.3.0/vendor/matchit/src/tree.rs temporalio-1.3.0/vendor/matchit/src/tree.rs --- temporalio-1.3.0/vendor/matchit/src/tree.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/matchit/src/tree.rs 2023-10-30 19:40:00.000000000 +0000 @@ -5,8 +5,8 @@ use std::mem; /// The types of nodes the tree can hold -#[derive(PartialEq, Eq, PartialOrd, Ord, Debug, Clone)] -pub(crate) enum NodeType { +#[derive(PartialEq, Eq, PartialOrd, Ord, Debug, Clone, Copy)] +enum NodeType { /// The root path Root, /// A route parameter, ex: `/:id`. @@ -24,10 +24,9 @@ priority: u32, wild_child: bool, indices: Vec, - // see `at` for why an unsafe cell is needed + node_type: NodeType, + // see `at_inner` for why an unsafe cell is needed. value: Option>, - pub(crate) param_remapping: ParamRemapping, - pub(crate) node_type: NodeType, pub(crate) prefix: Vec, pub(crate) children: Vec, } @@ -39,15 +38,13 @@ impl Node { pub fn insert(&mut self, route: impl Into, val: T) -> Result<(), InsertError> { let route = route.into().into_bytes(); - let (route, param_remapping) = normalize_params(route)?; let mut prefix = route.as_ref(); self.priority += 1; // the tree is empty if self.prefix.is_empty() && self.children.is_empty() { - let last = self.insert_child(prefix, &route, val)?; - last.param_remapping = param_remapping; + self.insert_child(prefix, &route, val)?; self.node_type = NodeType::Root; return Ok(()); } @@ -69,7 +66,6 @@ wild_child: current.wild_child, indices: current.indices.clone(), value: current.value.take(), - param_remapping: mem::take(&mut current.param_remapping), priority: current.priority - 1, ..Node::default() }; @@ -115,9 +111,7 @@ child = current.update_child_priority(child); // insert into the new node - let last = current.children[child].insert_child(prefix, &route, val)?; - last.param_remapping = param_remapping; - return Ok(()); + return current.children[child].insert_child(prefix, &route, val); } // inserting a wildcard, and this node already has a wildcard child @@ -142,9 +136,7 @@ } // otherwise, create the wildcard node - let last = current.insert_child(prefix, &route, val)?; - last.param_remapping = param_remapping; - return Ok(()); + return current.insert_child(prefix, &route, val); } // exact match, this node should be empty @@ -154,7 +146,6 @@ // add the value to current node current.value = Some(UnsafeCell::new(val)); - current.param_remapping = param_remapping; return Ok(()); } @@ -203,26 +194,28 @@ } // insert a child node at this node - fn insert_child( - &mut self, - mut prefix: &[u8], - route: &[u8], - val: T, - ) -> Result<&mut Node, InsertError> { + fn insert_child(&mut self, mut prefix: &[u8], route: &[u8], val: T) -> Result<(), InsertError> { let mut current = self; loop { // search for a wildcard segment - let (wildcard, wildcard_index) = match find_wildcard(prefix)? { - Some((w, i)) => (w, i), + let (wildcard, wildcard_index) = match find_wildcard(prefix) { + (Some((w, i)), true) => (w, i), + // the wildcard name contains invalid characters (':' or '*') + (Some(..), false) => return Err(InsertError::TooManyParams), // no wildcard, simply use the current node - None => { + (None, _) => { current.value = Some(UnsafeCell::new(val)); current.prefix = prefix.to_owned(); - return Ok(current); + return Ok(()); } }; + // ensure the wildcard has a name + if wildcard.len() < 2 { + return Err(InsertError::UnnamedParam); + } + // regular route parameter if wildcard[0] == b':' { // insert prefix before the current wildcard @@ -258,7 +251,7 @@ // otherwise we're done. Insert the value in the new leaf current.value = Some(UnsafeCell::new(val)); - return Ok(current); + return Ok(()); // catch-all route } else if wildcard[0] == b'*' { @@ -293,11 +286,11 @@ ..Self::default() }; - let i = current.add_child(child); + current.add_child(child); current.wild_child = true; - - return Ok(&mut current.children[i]); } + + return Ok(()); } } } @@ -449,11 +442,6 @@ // found the matching value if let Some(ref value) = current.value { - // remap parameter keys - params.for_each_key_mut(|(i, key)| { - *key = ¤t.param_remapping[i][1..] - }); - return Ok((value, params)); } @@ -484,14 +472,7 @@ // either this node has the value or there is no match return match current.value { Some(ref value) => { - // remap parameter keys - params.for_each_key_mut(|(i, key)| { - *key = ¤t.param_remapping[i][1..] - }); - - // store the final catch-all parameter params.push(¤t.prefix[1..], path); - Ok((value, params)) } None => Err(MatchError::NotFound), @@ -505,8 +486,6 @@ // this is it, we should have reached the node containing the value if path == current.prefix { if let Some(ref value) = current.value { - // remap parameter keys - params.for_each_key_mut(|(i, key)| *key = ¤t.param_remapping[i][1..]); return Ok((value, params)); } @@ -567,106 +546,29 @@ } } -/// An ordered list of route parameters keys for a specific route, stored at leaf nodes. -type ParamRemapping = Vec>; - -/// Returns `path` with normalized route parameters, and a parameter remapping -/// to store at the leaf node for this route. -fn normalize_params(mut path: Vec) -> Result<(Vec, ParamRemapping), InsertError> { - let mut start = 0; - let mut original = ParamRemapping::new(); - - // parameter names are normalized alphabetically - let mut next = b'a'; - - loop { - let (wildcard, mut wildcard_index) = match find_wildcard(&path[start..])? { - Some((w, i)) => (w, i), - None => return Ok((path, original)), - }; - - // makes sure the param has a valid name - if wildcard.len() < 2 { - return Err(InsertError::UnnamedParam); - } - - // don't need to normalize catch-all parameters - if wildcard[0] == b'*' { - start += wildcard_index + wildcard.len(); - continue; - } - - wildcard_index += start; - - // normalize the parameter - let removed = path.splice( - (wildcard_index)..(wildcard_index + wildcard.len()), - vec![b':', next], - ); - - // remember the original name for remappings - original.push(removed.collect()); - - // get the next key - next += 1; - if next > b'z' { - panic!("too many route parameters"); - } - - start = wildcard_index + 2; - } -} - -/// Restores `route` to it's original, denormalized form. -pub(crate) fn denormalize_params(route: &mut Vec, params: &ParamRemapping) { - let mut start = 0; - let mut i = 0; - - loop { - // find the next wildcard - let (wildcard, mut wildcard_index) = match find_wildcard(&route[start..]).unwrap() { - Some((w, i)) => (w, i), - None => return, - }; - - wildcard_index += start; - - let next = match params.get(i) { - Some(param) => param.clone(), - None => return, - }; - - // denormalize this parameter - route.splice( - (wildcard_index)..(wildcard_index + wildcard.len()), - next.clone(), - ); - - i += 1; - start = wildcard_index + 2; - } -} - // Searches for a wildcard segment and checks the path for invalid characters. -fn find_wildcard(path: &[u8]) -> Result, InsertError> { +fn find_wildcard(path: &[u8]) -> (Option<(&[u8], usize)>, bool) { for (start, &c) in path.iter().enumerate() { // a wildcard starts with ':' (param) or '*' (catch-all) if c != b':' && c != b'*' { continue; } + // find end and check for invalid characters + let mut valid = true; + for (end, &c) in path[start + 1..].iter().enumerate() { match c { - b'/' => return Ok(Some((&path[start..start + 1 + end], start))), - b':' | b'*' => return Err(InsertError::TooManyParams), + b'/' => return (Some((&path[start..start + 1 + end], start)), valid), + b':' | b'*' => valid = false, _ => {} } } - return Ok(Some((&path[start..], start))); + return (Some((&path[start..], start)), valid); } - Ok(None) + (None, false) } impl Clone for Node @@ -674,20 +576,22 @@ T: Clone, { fn clone(&self) -> Self { - let value = self.value.as_ref().map(|value| { - // safety: we only expose &mut T through &mut self - let value = unsafe { &*value.get() }; - UnsafeCell::new(value.clone()) - }); + let value = match self.value { + Some(ref value) => { + // safety: we only expose &mut T through &mut self + let value = unsafe { &*value.get() }; + Some(UnsafeCell::new(value.clone())) + } + None => None, + }; Self { value, prefix: self.prefix.clone(), wild_child: self.wild_child, - node_type: self.node_type.clone(), + node_type: self.node_type, indices: self.indices.clone(), children: self.children.clone(), - param_remapping: self.param_remapping.clone(), priority: self.priority, } } @@ -696,7 +600,6 @@ impl Default for Node { fn default() -> Self { Self { - param_remapping: ParamRemapping::new(), prefix: Vec::new(), wild_child: false, node_type: NodeType::Static, @@ -708,11 +611,11 @@ } } +// visualize the tree structure when debugging #[cfg(test)] const _: () = { use std::fmt::{self, Debug, Formatter}; - // visualize the tree structure when debugging impl Debug for Node { fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { // safety: we only expose &mut T through &mut self @@ -724,18 +627,11 @@ .map(|&x| char::from_u32(x as _)) .collect::>(); - let param_names = self - .param_remapping - .iter() - .map(|x| std::str::from_utf8(x).unwrap()) - .collect::>(); - let mut fmt = f.debug_struct("Node"); fmt.field("value", &value); fmt.field("prefix", &std::str::from_utf8(&self.prefix)); fmt.field("node_type", &self.node_type); fmt.field("children", &self.children); - fmt.field("param_names", ¶m_names); fmt.field("indices", &indices); fmt.finish() } diff -Nru temporalio-1.3.0/vendor/matchit/tests/tree.rs temporalio-1.3.0/vendor/matchit/tests/tree.rs --- temporalio-1.3.0/vendor/matchit/tests/tree.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/matchit/tests/tree.rs 2023-10-30 19:40:00.000000000 +0000 @@ -76,7 +76,7 @@ routes = [ "/", "/cmd/:tool/", - "/cmd/:tool2/:sub", + "/cmd/:tool/:sub", "/cmd/whoami", "/cmd/whoami/root", "/cmd/whoami/root/", @@ -133,12 +133,12 @@ "/" :: "/" => {}, "/cmd/test" :: "/cmd/:tool/" => None, "/cmd/test/" :: "/cmd/:tool/" => { "tool" => "test" }, - "/cmd/test/3" :: "/cmd/:tool2/:sub" => { "tool2" => "test", "sub" => "3" }, + "/cmd/test/3" :: "/cmd/:tool/:sub" => { "tool" => "test", "sub" => "3" }, "/cmd/who" :: "/cmd/:tool/" => None, "/cmd/who/" :: "/cmd/:tool/" => { "tool" => "who" }, "/cmd/whoami" :: "/cmd/whoami" => {}, "/cmd/whoami/" :: "/cmd/whoami" => None, - "/cmd/whoami/r" :: "/cmd/:tool2/:sub" => { "tool2" => "whoami", "sub" => "r" }, + "/cmd/whoami/r" :: "/cmd/:tool/:sub" => { "tool" => "whoami", "sub" => "r" }, "/cmd/whoami/r/" :: "/cmd/:tool/:sub" => None, "/cmd/whoami/root" :: "/cmd/whoami/root" => {}, "/cmd/whoami/root/" :: "/cmd/whoami/root/" => {}, @@ -246,39 +246,6 @@ "/get/abc/123abf/testss" :: "/get/abc/123abf/:param" => { "param" => "testss" }, "/get/abc/123abfff/te" :: "/get/abc/123abfff/:param" => { "param" => "te" }, }, - normalized { - routes = [ - "/x/:foo/bar", - "/x/:bar/baz", - "/:foo/:baz/bax", - "/:foo/:bar/baz", - "/:fod/:baz/:bax/foo", - "/:fod/baz/bax/foo", - "/:foo/baz/bax", - "/:bar/:bay/bay", - "/s", - "/s/s", - "/s/s/s", - "/s/s/s/s", - "/s/s/:s/x", - "/s/s/:y/d", - ], - "/x/foo/bar" :: "/x/:foo/bar" => { "foo" => "foo" }, - "/x/foo/baz" :: "/x/:bar/baz" => { "bar" => "foo" }, - "/y/foo/baz" :: "/:foo/:bar/baz" => { "foo" => "y", "bar" => "foo" }, - "/y/foo/bax" :: "/:foo/:baz/bax" => { "foo" => "y", "baz" => "foo" }, - "/y/baz/baz" :: "/:foo/:bar/baz" => { "foo" => "y", "bar" => "baz" }, - "/y/baz/bax/foo" :: "/:fod/baz/bax/foo" => { "fod" => "y" }, - "/y/baz/b/foo" :: "/:fod/:baz/:bax/foo" => { "fod" => "y", "baz" => "baz", "bax" => "b" }, - "/y/baz/bax" :: "/:foo/baz/bax" => { "foo" => "y" }, - "/z/bar/bay" :: "/:bar/:bay/bay" => { "bar" => "z", "bay" => "bar" }, - "/s" :: "/s" => { }, - "/s/s" :: "/s/s" => { }, - "/s/s/s" :: "/s/s/s" => { }, - "/s/s/s/s" :: "/s/s/s/s" => { }, - "/s/s/s/x" :: "/s/s/:s/x" => { "s" => "s" }, - "/s/s/s/d" :: "/s/s/:y/d" => { "y" => "s" }, - }, blog { routes = [ "/:page", @@ -385,8 +352,9 @@ "/foo/:name" => Ok(()), "/foo/:names" => Err(InsertError::Conflict { with: "/foo/:name".into() }), "/cmd/*path" => Err(InsertError::Conflict { with: "/cmd/:tool/:sub".into() }), - "/cmd/:xxx/names" => Ok(()), - "/cmd/:tool/:xxx/foo" => Ok(()), + "/cmd/:badvar" => Err(InsertError::Conflict { with: "/cmd/:tool/:sub".into() }), + "/cmd/:tool/names" => Ok(()), + "/cmd/:tool/:bad/foo" => Err(InsertError::Conflict { with: "/cmd/:tool/:sub".into() }), "/src/*filepath" => Ok(()), "/src/:file" => Err(InsertError::Conflict { with: "/src/*filepath".into() }), "/src/static.json" => Ok(()), @@ -461,14 +429,6 @@ "/:foo:bar/" => Err(InsertError::TooManyParams), "/:foo*bar/" => Err(InsertError::TooManyParams), }, - normalized_conflict { - "/x/:foo/bar" => Ok(()), - "/x/:bar/bar" => Err(InsertError::Conflict { with: "/x/:foo/bar".into() }), - "/:y/bar/baz" => Ok(()), - "/:y/baz/baz" => Ok(()), - "/:z/bar/bat" => Ok(()), - "/:z/bar/baz" => Err(InsertError::Conflict { with: "/:y/bar/baz".into() }), - }, more_conflicts { "/con:tact" => Ok(()), "/who/are/*you" => Ok(()), diff -Nru temporalio-1.3.0/vendor/memchr/build.rs temporalio-1.3.0/vendor/memchr/build.rs --- temporalio-1.3.0/vendor/memchr/build.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/build.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,88 @@ +use std::env; + +fn main() { + enable_simd_optimizations(); + enable_libc(); +} + +// This adds various simd cfgs if this compiler and target support it. +// +// This can be disabled with RUSTFLAGS="--cfg memchr_disable_auto_simd", but +// this is generally only intended for testing. +// +// On targets which don't feature SSE2, this is disabled, as LLVM wouln't know +// how to work with SSE2 operands. Enabling SSE4.2 and AVX on SSE2-only targets +// is not a problem. In that case, the fastest option will be chosen at +// runtime. +fn enable_simd_optimizations() { + if is_env_set("CARGO_CFG_MEMCHR_DISABLE_AUTO_SIMD") { + return; + } + let arch = env::var("CARGO_CFG_TARGET_ARCH").unwrap(); + match &arch[..] { + "x86_64" => { + if !target_has_feature("sse2") { + return; + } + println!("cargo:rustc-cfg=memchr_runtime_simd"); + println!("cargo:rustc-cfg=memchr_runtime_sse2"); + println!("cargo:rustc-cfg=memchr_runtime_sse42"); + println!("cargo:rustc-cfg=memchr_runtime_avx"); + } + "wasm32" | "wasm64" => { + if !target_has_feature("simd128") { + return; + } + println!("cargo:rustc-cfg=memchr_runtime_simd"); + println!("cargo:rustc-cfg=memchr_runtime_wasm128"); + } + _ => {} + } +} + +// This adds a `memchr_libc` cfg if and only if libc can be used, if no other +// better option is available. +// +// This could be performed in the source code, but it's simpler to do it once +// here and consolidate it into one cfg knob. +// +// Basically, we use libc only if its enabled and if we aren't targeting a +// known bad platform. For example, wasm32 doesn't have a libc and the +// performance of memchr on Windows is seemingly worse than the fallback +// implementation. +fn enable_libc() { + const NO_ARCH: &'static [&'static str] = &["wasm32", "windows"]; + const NO_ENV: &'static [&'static str] = &["sgx"]; + + if !is_feature_set("LIBC") { + return; + } + + let arch = match env::var("CARGO_CFG_TARGET_ARCH") { + Err(_) => return, + Ok(arch) => arch, + }; + let env = match env::var("CARGO_CFG_TARGET_ENV") { + Err(_) => return, + Ok(env) => env, + }; + if NO_ARCH.contains(&&*arch) || NO_ENV.contains(&&*env) { + return; + } + + println!("cargo:rustc-cfg=memchr_libc"); +} + +fn is_feature_set(name: &str) -> bool { + is_env_set(&format!("CARGO_FEATURE_{}", name)) +} + +fn is_env_set(name: &str) -> bool { + env::var_os(name).is_some() +} + +fn target_has_feature(feature: &str) -> bool { + env::var("CARGO_CFG_TARGET_FEATURE") + .map(|features| features.contains(feature)) + .unwrap_or(false) +} diff -Nru temporalio-1.3.0/vendor/memchr/.cargo-checksum.json temporalio-1.3.0/vendor/memchr/.cargo-checksum.json --- temporalio-1.3.0/vendor/memchr/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"COPYING":"01c266bced4a434da0051174d6bee16a4c82cf634e2679b6155d40d75012390f","Cargo.toml":"a56f004ee16ebce155f8a2ebbde8f5bbc8045e3d46e73828e5db15a008cede12","LICENSE-MIT":"0f96a83840e146e43c0ec96a22ec1f392e0680e6c1226e6f3ba87e0740af850f","README.md":"898ebf0019a21a33fa869de1b40ba35041798f553d883f016e976658866e95bd","UNLICENSE":"7e12e5df4bae12cb21581ba157ced20e1986a0508dd10d0e8a4ab9a4cf94e85c","rustfmt.toml":"1ca600239a27401c4a43f363cf3f38183a212affc1f31bff3ae93234bbaec228","src/arch/aarch64/memchr.rs":"5bb70f915084e629d940dbc322f5b9096b2e658cf63fea8a2f6e7550412e73a0","src/arch/aarch64/mod.rs":"44cd1a614bd66f1e66fc86c541d3c3b8d3a14a644c13e8bf816df3f555eac2d4","src/arch/aarch64/neon/memchr.rs":"e8c00b8fb2c7e2711832ae3cedefe59f32ebedd7dfa4d0ec6de2a566c979daea","src/arch/aarch64/neon/mod.rs":"eab6d56c2b2354db4ee395f40282cd49f97e2ab853547be5de6e65fbe1b2f634","src/arch/aarch64/neon/packedpair.rs":"fbdfdbfaf7b76b234db261fbe55a55c4479d32cdc65a654d60417c2d1c237849","src/arch/all/memchr.rs":"f6c51e50309f80e749887572297aa5efc19a3c7e5434b4404a101b3e6b152be1","src/arch/all/mod.rs":"b3190c1c48b23efe4b5e320aebdf8f0260a2cb2f63c0deba95ad0ef8219695d7","src/arch/all/packedpair/default_rank.rs":"abffd1b5b8b7a3be95c03dd1105b905c246a379854dc56f1e846ea7c4408f2c7","src/arch/all/packedpair/mod.rs":"292b66042c5b5c78bba33db6526aeae6904db803d601fcdd29032b87b3eb3754","src/arch/all/rabinkarp.rs":"236f69c04b90c14c253ae6c8d9b78150b4a56df75bb50af6d63b15145668b7cc","src/arch/all/shiftor.rs":"0d79117f52a1e4795843603a3bb0b45397df4ad5e4184bbc923658dab9dc3b5f","src/arch/all/twoway.rs":"47c97a265bfbafde90a618946643d3e97dfd9a85f01aa4ac758cd4c1573a450d","src/arch/generic/memchr.rs":"88290761bab740878401e914d71866da6501cdcef53d1249ec6fda4c7f9c12ae","src/arch/generic/mod.rs":"1dd75f61e0ea2563b8205a08aaa7b55500130aa331d18b9e9f995724b66c7a39","src/arch/generic/packedpair.rs":"a4a6efb29877ced9cf4c4e5ae9f36a79f019a16b831f2b9424899a1513d458ad","src/arch/mod.rs":"6dbd9e0b1b89fecb9faac5df6edfc87e24607e9099136aa831f3f056b14e22db","src/arch/wasm32/memchr.rs":"bfaaeca702cc32e605a06d5078d26ac59263d3c4eb04f9756e6be5e2850c3d0d","src/arch/wasm32/mod.rs":"a20377aa8fe07d68594879101dc73061e4f51d9c8d812b593b1f376e3c8add79","src/arch/wasm32/simd128/memchr.rs":"bac2c4c43fe710c83a6f2b1118fede043be89dd821d4b532907f129f09fdb5cf","src/arch/wasm32/simd128/mod.rs":"c157b373faedbfd65323be432e25bc411d97aa1b7bc58e76048614c7b2bf3bf6","src/arch/wasm32/simd128/packedpair.rs":"47e7875f1a0b502f3f30ddfd9257ed7ad4568fb7d968b5e6c01ba9e2aab2a459","src/arch/x86_64/avx2/memchr.rs":"576ec0c30f49874f7fd9f6caeb490d56132c0fbbaa4d877b1aa532cafce19323","src/arch/x86_64/avx2/mod.rs":"0033d1b712d0b10f0f273ef9aa8caa53e05e49f4c56a64f39af0b9df97eec584","src/arch/x86_64/avx2/packedpair.rs":"87b69cb4301815906127db4f6370f572c7c5d5dad35c0946c00ad888dbcaec8c","src/arch/x86_64/memchr.rs":"99a1dbe4156d498e6f910d06d3d3b31e7f6d06dff7d13a4c51b33a02b7e2fba9","src/arch/x86_64/mod.rs":"61b2aa876942fd3e78714c2ae21e356c8634545c06995020f443fa50218df027","src/arch/x86_64/sse2/memchr.rs":"68fc3b8f9eddf82192979c3aa11e5141f085cbb993c49c340558719a904679dc","src/arch/x86_64/sse2/mod.rs":"38b70ae52a64ec974dbb91d04d6ca8013d9e06d1fe4af852206bbc2faf1c59aa","src/arch/x86_64/sse2/packedpair.rs":"241ea981d8eea6024769f1c9375f726a9bb9700160c5857781d4befd9f5ef55d","src/cow.rs":"34eddd02cb82cc2d5a2c640891d64efe332dabcc1eea5115764200d8f46b66f7","src/ext.rs":"c472bcc41a7ef48980d976e954e87ef9fdfdfd30ac0199b959cc7e5b9d563ab3","src/lib.rs":"4e56613894535a80d669dda77697fb8c23769ede5e3fcedc5d999617b5b1d094","src/macros.rs":"3e4b39252bfa471fad384160a43f113ebfec7bec46a85d16f006622881dd2081","src/memchr.rs":"36f1c03304261877cd7f75c7ed8f7daff7a5c570cedce375e38e9b1ca44467f7","src/memmem/mod.rs":"7297b60ac7d7cb50ba44bf58a7cde7d32819237f2ec45f311d20bfe9379d4c78","src/memmem/searcher.rs":"69c38fb33d8f1a2a26769a81e514428240c8f8f15cea5302873d90b80391dd89","src/tests/memchr/mod.rs":"269f8e4b4f7f5ea458f27a3c174eb1020ffb2484eeba9464170beb51747df69b","src/tests/memchr/naive.rs":"6a0bee033e5edfb5b1d5769a5fa1c78388f7e9ff7bb91cb67f0ad029289e00e7","src/tests/memchr/prop.rs":"7bf7435087fbf08c5014c216b76575349735590d6b1d0e448921a1dc17bc0ea7","src/tests/mod.rs":"7cec8f809e279310a465c6a7725087970f219a676cc76c83de30c695bb490740","src/tests/packedpair.rs":"b02ec4fbb61a8653cb5f2268c31bc9168b8043347f2abdcc74081acf83b98e15","src/tests/substring/mod.rs":"c7660d10749363ac4687e7da2b5fda60768230425df8ba416c0c28b8d56a5c74","src/tests/substring/naive.rs":"df6f55d165382b8a53762ba4c324926cac13ebc62cde1805f4ce08740b326483","src/tests/substring/prop.rs":"38c15992609b5681a95d838ae6f2933e00a1219f2c971bfba245f96e0729fcdc","src/tests/x86_64-soft_float.json":"c0e416487fe9b4809534edb7db2a9eff3453dc40d9f1e23362c37f45a77ec717","src/vector.rs":"ef823ae8c54053780a0e7aeaee14b6c6ac2aea4567bf701ae8be137806c6d293"},"package":"f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167"} \ No newline at end of file +{"files":{"COPYING":"01c266bced4a434da0051174d6bee16a4c82cf634e2679b6155d40d75012390f","Cargo.toml":"fdeda7d32fa12e4a1589d13c74ae5fd4f1065d0219ba73f8492e28248d84d146","LICENSE-MIT":"0f96a83840e146e43c0ec96a22ec1f392e0680e6c1226e6f3ba87e0740af850f","README.md":"51d941627e004588863b137918e908e34c4d599d12e03afd3e489e2bb61e3704","UNLICENSE":"7e12e5df4bae12cb21581ba157ced20e1986a0508dd10d0e8a4ab9a4cf94e85c","build.rs":"5638d9b60d40f44db96767ce32246de42158571364cce92531a85307ac7eda6c","rustfmt.toml":"1ca600239a27401c4a43f363cf3f38183a212affc1f31bff3ae93234bbaec228","scripts/make-byte-frequency-table":"21d1ded41fe5a780507bb88e1910d471b4081cc626a48891a408712e45b7b2bf","src/cow.rs":"a23c3b009e5215b5c3ac46627a5dd844235bef0136d76b3fc1eeeb744565c125","src/lib.rs":"9430cd37b13399df8f8c27a752ccdf6422a563e24171d1b4802424f9193a8f37","src/memchr/c.rs":"34f7caf79316f4b03908832fdbd4aff367f2bc30eae291478cc5a0a108ce6e76","src/memchr/fallback.rs":"48764f18b7ff1f00a9ac1c4ed8ec96ad11f7b09b2d062a8ed3fe81160add627d","src/memchr/iter.rs":"61463e7fa22ca8f212c2cbfb882af0c87b0fb1bc6b4676678a4822a581ec1037","src/memchr/mod.rs":"d5bfc881c7c089e1a0825209a4d21c3f792f38c6f16f3bc715d0d539477376b6","src/memchr/naive.rs":"c7453bc99cc4e58eb37cf5a50c88688833e50a270ee1849baefddb8acc0ccd94","src/memchr/x86/avx.rs":"3c2750174ce7ff033daa4096e7961bbee9a2da898068266b27dee22ef8cfddad","src/memchr/x86/mod.rs":"a642d5aefdb7452ead4ab7946b5c6cfb6cc6df636dcd0ebbd6f5e6e1ac8305c0","src/memchr/x86/sse2.rs":"79ede1aba71a655e86eb5873d682c5da26933bffa4fffd7042a2313f18cf4675","src/memchr/x86/sse42.rs":"de4c6f354dbfec170876cddb8d9157b35928f96ed2339a0c5d094cc953a2f52d","src/memmem/byte_frequencies.rs":"2fb85b381c038c1e44ce94294531cdcd339dca48b1e61f41455666e802cbbc9e","src/memmem/genericsimd.rs":"9ce7283db0994438eb6df2bea6ad984e80512b6f643ebae7ae7d82eb5d39fa11","src/memmem/mod.rs":"949fb8e11a23030d59b34fd8c7c196150f133e909a8448705c77a751c436907d","src/memmem/prefilter/fallback.rs":"d32248c41aa09701c2410c52f948bbe009dd1b13a01b444ce0fb8c4b4e404ede","src/memmem/prefilter/genericsimd.rs":"57d5523cf0299b37ef1dd1b351e3d387d5070f2f7ecffc9a9ca66528101ebd3f","src/memmem/prefilter/mod.rs":"ad8b4ac72c025f11d6b641c5fc0888468112758dcdc6bb72b43f932d2005ea4e","src/memmem/prefilter/wasm.rs":"14f684412fca35445a94760a6973d772dfd22d329ebae3b52b525d2a1f3acd63","src/memmem/prefilter/x86/avx.rs":"e344cae36a88b59c07a1c1d395edeb9c636a399e1528ce69b2bc7c94d8d8bb0b","src/memmem/prefilter/x86/mod.rs":"df2d84b23b22574383c281d33671a121b5faf7b1a48dd6f67c3085cd02cd4498","src/memmem/prefilter/x86/sse.rs":"daa648fc2a90d37299803a80d632e8a47a30ce8719d0ac2a2ea2cde3b30b6fef","src/memmem/rabinkarp.rs":"9b44eb092524a51792eba4deaca6c6d3cbc51db98cb548ea4fa7e5d8988cc71a","src/memmem/rarebytes.rs":"571082c71fc3dca5e4304171d41fb3c44e241df6dcd88bac4d7a15b52f9521e0","src/memmem/twoway.rs":"102f8bbb29696d5656cd2f5a1769a3af96d044fb09972881455cfb6424d6b50a","src/memmem/util.rs":"0194d40b912137e2352863af9cc1c0273baf97fdf6b27799628680846c06febd","src/memmem/vector.rs":"96e6f45f8ad11a822c4f18393839225d7f40f898ad657e109ba1b3288af0ef8f","src/memmem/wasm.rs":"87da03c964f054db30cc972d07a74e8902ec1248e2338ecd1dbac430f43fffc2","src/memmem/x86/avx.rs":"de85dbc415603c844baf94fbc92d676a738dd4b99246be468bd5f7be5921b25f","src/memmem/x86/mod.rs":"5012fca41b91caf229278aa221e8dd514ede497fe4938d64562d03fef2fc46e6","src/memmem/x86/sse.rs":"148a40c0952aca8b16d9eb3e724a5b9b60693bc7b2bcc5209bcc43c94faf560a","src/tests/memchr/iter.rs":"b68c7ecdb6222c5dbf61212e6863f78f98ad343868a74cb8612692fc790240b2","src/tests/memchr/memchr.rs":"09589c5899324c9b26ea4513c80389a2ffdf6ddc460031e2ca8da43bd493ae3f","src/tests/memchr/mod.rs":"29e0855f946c7babf603b3d610a29235a56a26a4c867fef0768542388eac4c95","src/tests/memchr/simple.rs":"b9997903ede972272c01c1750522a20692a28488cc7c5cf745ea83ff96d65fe3","src/tests/memchr/testdata.rs":"3e34377fe60eca3687d1ebc66127bd631af27ceaccc8f08806a293199b69a83f","src/tests/mod.rs":"9054a2a2f9af140f305ca29155d942fafbac9fb0874067611adc8a5990546be4","src/tests/x86_64-soft_float.json":"c0e416487fe9b4809534edb7db2a9eff3453dc40d9f1e23362c37f45a77ec717"},"package":"2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/memchr/Cargo.toml temporalio-1.3.0/vendor/memchr/Cargo.toml --- temporalio-1.3.0/vendor/memchr/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -10,51 +10,41 @@ # See Cargo.toml.orig for the original contents. [package] -edition = "2021" -rust-version = "1.61" +edition = "2018" name = "memchr" -version = "2.6.4" +version = "2.5.0" authors = [ "Andrew Gallant ", "bluss", ] exclude = [ "/bench", - "/benchmarks", "/.github", "/fuzz", - "/scripts", - "/tmp", ] -description = """ -Provides extremely fast (uses SIMD on x86_64, aarch64 and wasm32) routines for -1, 2 or 3 byte search and single substring search. -""" +description = "Safe interface to memchr." homepage = "https://github.com/BurntSushi/memchr" documentation = "https://docs.rs/memchr/" readme = "README.md" keywords = [ "memchr", - "memmem", - "substring", - "find", - "search", + "char", + "scan", + "strchr", + "string", ] -license = "Unlicense OR MIT" +license = "Unlicense/MIT" repository = "https://github.com/BurntSushi/memchr" -[package.metadata.docs.rs] -rustdoc-args = ["--generate-link-to-definition"] - [profile.bench] -debug = 2 +debug = true [profile.release] -debug = 2 +debug = true [profile.test] opt-level = 3 -debug = 2 +debug = true [lib] name = "memchr" @@ -69,22 +59,20 @@ optional = true package = "rustc-std-workspace-core" -[dependencies.log] -version = "0.4.20" +[dependencies.libc] +version = "0.2.18" optional = true +default-features = false [dev-dependencies.quickcheck] version = "1.0.3" default-features = false [features] -alloc = [] default = ["std"] -libc = [] -logging = ["dep:log"] rustc-dep-of-std = [ "core", "compiler_builtins", ] -std = ["alloc"] +std = [] use_std = ["std"] diff -Nru temporalio-1.3.0/vendor/memchr/README.md temporalio-1.3.0/vendor/memchr/README.md --- temporalio-1.3.0/vendor/memchr/README.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/README.md 2023-10-30 19:40:00.000000000 +0000 @@ -35,19 +35,30 @@ memchr = { version = "2", default-features = false } ``` -On `x86_64` platforms, when the `std` feature is disabled, the SSE2 accelerated -implementations will be used. When `std` is enabled, AVX2 accelerated +On x86 platforms, when the `std` feature is disabled, the SSE2 accelerated +implementations will be used. When `std` is enabled, AVX accelerated implementations will be used if the CPU is determined to support it at runtime. -SIMD accelerated routines are also available on the `wasm32` and `aarch64` -targets. The `std` feature is not required to use them. +### Using libc + +`memchr` is a routine that is part of libc, although this crate does not use +libc by default. Instead, it uses its own routines, which are either vectorized +or generic fallback routines. In general, these should be competitive with +what's in libc, although this has not been tested for all architectures. If +using `memchr` from libc is desirable and a vectorized routine is not otherwise +available in this crate, then enabling the `libc` feature will use libc's +version of `memchr`. + +The rest of the functions in this crate, e.g., `memchr2` or `memrchr3` and the +substring search routines, will always use the implementations in this crate. +One exception to this is `memrchr`, which is an extension in `libc` found on +Linux. On Linux, `memrchr` is used in precisely the same scenario as `memchr`, +as described above. -When a SIMD version is not available, then this crate falls back to -[SWAR](https://en.wikipedia.org/wiki/SWAR) techniques. ### Minimum Rust version policy -This crate's minimum supported `rustc` version is `1.61.0`. +This crate's minimum supported `rustc` version is `1.41.1`. The current policy is that the minimum Rust version required to use this crate can be increased in minor version updates. For example, if `crate 1.0` requires diff -Nru temporalio-1.3.0/vendor/memchr/scripts/make-byte-frequency-table temporalio-1.3.0/vendor/memchr/scripts/make-byte-frequency-table --- temporalio-1.3.0/vendor/memchr/scripts/make-byte-frequency-table 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/scripts/make-byte-frequency-table 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,74 @@ +#!/usr/bin/env python + +# This does simple normalized frequency analysis on UTF-8 encoded text. The +# result of the analysis is translated to a ranked list, where every byte is +# assigned a rank. This list is written to src/freqs.rs. +# +# Currently, the frequencies are generated from the following corpuses: +# +# * The CIA world fact book +# * The source code of rustc +# * Septuaginta + +from __future__ import absolute_import, division, print_function + +import argparse +from collections import Counter +import sys + +preamble = ''' +// NOTE: The following code was generated by "scripts/frequencies.py", do not +// edit directly +'''.lstrip() + + +def eprint(*args, **kwargs): + kwargs['file'] = sys.stderr + print(*args, **kwargs) + + +def main(): + p = argparse.ArgumentParser() + p.add_argument('corpus', metavar='FILE', nargs='+') + args = p.parse_args() + + # Get frequency counts of each byte. + freqs = Counter() + for i in range(0, 256): + freqs[i] = 0 + + eprint('reading entire corpus into memory') + corpus = [] + for fpath in args.corpus: + corpus.append(open(fpath, 'rb').read()) + + eprint('computing byte frequencies') + for c in corpus: + for byte in c: + freqs[byte] += 1.0 / float(len(c)) + + eprint('writing Rust code') + # Get the rank of each byte. A lower rank => lower relative frequency. + rank = [0] * 256 + for i, (byte, _) in enumerate(freqs.most_common()): + # print(byte) + rank[byte] = 255 - i + + # Forcefully set the highest rank possible for bytes that start multi-byte + # UTF-8 sequences. The idea here is that a continuation byte will be more + # discerning in a homogenous haystack. + for byte in range(0xC0, 0xFF + 1): + rank[byte] = 255 + + # Now write Rust. + olines = ['pub const BYTE_FREQUENCIES: [u8; 256] = ['] + for byte in range(256): + olines.append(' %3d, // %r' % (rank[byte], chr(byte))) + olines.append('];') + + print(preamble) + print('\n'.join(olines)) + + +if __name__ == '__main__': + main() diff -Nru temporalio-1.3.0/vendor/memchr/src/arch/aarch64/memchr.rs temporalio-1.3.0/vendor/memchr/src/arch/aarch64/memchr.rs --- temporalio-1.3.0/vendor/memchr/src/arch/aarch64/memchr.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/arch/aarch64/memchr.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,137 +0,0 @@ -/*! -Wrapper routines for `memchr` and friends. - -These routines choose the best implementation at compile time. (This is -different from `x86_64` because it is expected that `neon` is almost always -available for `aarch64` targets.) -*/ - -macro_rules! defraw { - ($ty:ident, $find:ident, $start:ident, $end:ident, $($needles:ident),+) => {{ - #[cfg(target_feature = "neon")] - { - use crate::arch::aarch64::neon::memchr::$ty; - - debug!("chose neon for {}", stringify!($ty)); - debug_assert!($ty::is_available()); - // SAFETY: We know that wasm memchr is always available whenever - // code is compiled for `aarch64` with the `neon` target feature - // enabled. - $ty::new_unchecked($($needles),+).$find($start, $end) - } - #[cfg(not(target_feature = "neon"))] - { - use crate::arch::all::memchr::$ty; - - debug!( - "no neon feature available, using fallback for {}", - stringify!($ty), - ); - $ty::new($($needles),+).$find($start, $end) - } - }} -} - -/// memchr, but using raw pointers to represent the haystack. -/// -/// # Safety -/// -/// Pointers must be valid. See `One::find_raw`. -#[inline(always)] -pub(crate) unsafe fn memchr_raw( - n1: u8, - start: *const u8, - end: *const u8, -) -> Option<*const u8> { - defraw!(One, find_raw, start, end, n1) -} - -/// memrchr, but using raw pointers to represent the haystack. -/// -/// # Safety -/// -/// Pointers must be valid. See `One::rfind_raw`. -#[inline(always)] -pub(crate) unsafe fn memrchr_raw( - n1: u8, - start: *const u8, - end: *const u8, -) -> Option<*const u8> { - defraw!(One, rfind_raw, start, end, n1) -} - -/// memchr2, but using raw pointers to represent the haystack. -/// -/// # Safety -/// -/// Pointers must be valid. See `Two::find_raw`. -#[inline(always)] -pub(crate) unsafe fn memchr2_raw( - n1: u8, - n2: u8, - start: *const u8, - end: *const u8, -) -> Option<*const u8> { - defraw!(Two, find_raw, start, end, n1, n2) -} - -/// memrchr2, but using raw pointers to represent the haystack. -/// -/// # Safety -/// -/// Pointers must be valid. See `Two::rfind_raw`. -#[inline(always)] -pub(crate) unsafe fn memrchr2_raw( - n1: u8, - n2: u8, - start: *const u8, - end: *const u8, -) -> Option<*const u8> { - defraw!(Two, rfind_raw, start, end, n1, n2) -} - -/// memchr3, but using raw pointers to represent the haystack. -/// -/// # Safety -/// -/// Pointers must be valid. See `Three::find_raw`. -#[inline(always)] -pub(crate) unsafe fn memchr3_raw( - n1: u8, - n2: u8, - n3: u8, - start: *const u8, - end: *const u8, -) -> Option<*const u8> { - defraw!(Three, find_raw, start, end, n1, n2, n3) -} - -/// memrchr3, but using raw pointers to represent the haystack. -/// -/// # Safety -/// -/// Pointers must be valid. See `Three::rfind_raw`. -#[inline(always)] -pub(crate) unsafe fn memrchr3_raw( - n1: u8, - n2: u8, - n3: u8, - start: *const u8, - end: *const u8, -) -> Option<*const u8> { - defraw!(Three, rfind_raw, start, end, n1, n2, n3) -} - -/// Count all matching bytes, but using raw pointers to represent the haystack. -/// -/// # Safety -/// -/// Pointers must be valid. See `One::count_raw`. -#[inline(always)] -pub(crate) unsafe fn count_raw( - n1: u8, - start: *const u8, - end: *const u8, -) -> usize { - defraw!(One, count_raw, start, end, n1) -} diff -Nru temporalio-1.3.0/vendor/memchr/src/arch/aarch64/mod.rs temporalio-1.3.0/vendor/memchr/src/arch/aarch64/mod.rs --- temporalio-1.3.0/vendor/memchr/src/arch/aarch64/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/arch/aarch64/mod.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ -/*! -Vector algorithms for the `aarch64` target. -*/ - -pub mod neon; - -pub(crate) mod memchr; diff -Nru temporalio-1.3.0/vendor/memchr/src/arch/aarch64/neon/memchr.rs temporalio-1.3.0/vendor/memchr/src/arch/aarch64/neon/memchr.rs --- temporalio-1.3.0/vendor/memchr/src/arch/aarch64/neon/memchr.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/arch/aarch64/neon/memchr.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,1031 +0,0 @@ -/*! -This module defines 128-bit vector implementations of `memchr` and friends. - -The main types in this module are [`One`], [`Two`] and [`Three`]. They are for -searching for one, two or three distinct bytes, respectively, in a haystack. -Each type also has corresponding double ended iterators. These searchers are -typically much faster than scalar routines accomplishing the same task. - -The `One` searcher also provides a [`One::count`] routine for efficiently -counting the number of times a single byte occurs in a haystack. This is -useful, for example, for counting the number of lines in a haystack. This -routine exists because it is usually faster, especially with a high match -count, then using [`One::find`] repeatedly. ([`OneIter`] specializes its -`Iterator::count` implementation to use this routine.) - -Only one, two and three bytes are supported because three bytes is about -the point where one sees diminishing returns. Beyond this point and it's -probably (but not necessarily) better to just use a simple `[bool; 256]` array -or similar. However, it depends mightily on the specific work-load and the -expected match frequency. -*/ - -use core::arch::aarch64::uint8x16_t; - -use crate::{arch::generic::memchr as generic, ext::Pointer, vector::Vector}; - -/// Finds all occurrences of a single byte in a haystack. -#[derive(Clone, Copy, Debug)] -pub struct One(generic::One); - -impl One { - /// Create a new searcher that finds occurrences of the needle byte given. - /// - /// This particular searcher is specialized to use neon vector instructions - /// that typically make it quite fast. - /// - /// If neon is unavailable in the current environment, then `None` is - /// returned. - #[inline] - pub fn new(needle: u8) -> Option { - if One::is_available() { - // SAFETY: we check that neon is available above. - unsafe { Some(One::new_unchecked(needle)) } - } else { - None - } - } - - /// Create a new finder specific to neon vectors and routines without - /// checking that neon is available. - /// - /// # Safety - /// - /// Callers must guarantee that it is safe to execute `neon` instructions - /// in the current environment. - /// - /// Note that it is a common misconception that if one compiles for an - /// `x86_64` target, then they therefore automatically have access to neon - /// instructions. While this is almost always the case, it isn't true in - /// 100% of cases. - #[target_feature(enable = "neon")] - #[inline] - pub unsafe fn new_unchecked(needle: u8) -> One { - One(generic::One::new(needle)) - } - - /// Returns true when this implementation is available in the current - /// environment. - /// - /// When this is true, it is guaranteed that [`One::new`] will return - /// a `Some` value. Similarly, when it is false, it is guaranteed that - /// `One::new` will return a `None` value. - /// - /// Note also that for the lifetime of a single program, if this returns - /// true then it will always return true. - #[inline] - pub fn is_available() -> bool { - #[cfg(target_feature = "neon")] - { - true - } - #[cfg(not(target_feature = "neon"))] - { - false - } - } - - /// Return the first occurrence of one of the needle bytes in the given - /// haystack. If no such occurrence exists, then `None` is returned. - /// - /// The occurrence is reported as an offset into `haystack`. Its maximum - /// value is `haystack.len() - 1`. - #[inline] - pub fn find(&self, haystack: &[u8]) -> Option { - // SAFETY: `find_raw` guarantees that if a pointer is returned, it - // falls within the bounds of the start and end pointers. - unsafe { - generic::search_slice_with_raw(haystack, |s, e| { - self.find_raw(s, e) - }) - } - } - - /// Return the last occurrence of one of the needle bytes in the given - /// haystack. If no such occurrence exists, then `None` is returned. - /// - /// The occurrence is reported as an offset into `haystack`. Its maximum - /// value is `haystack.len() - 1`. - #[inline] - pub fn rfind(&self, haystack: &[u8]) -> Option { - // SAFETY: `rfind_raw` guarantees that if a pointer is returned, it - // falls within the bounds of the start and end pointers. - unsafe { - generic::search_slice_with_raw(haystack, |s, e| { - self.rfind_raw(s, e) - }) - } - } - - /// Counts all occurrences of this byte in the given haystack. - #[inline] - pub fn count(&self, haystack: &[u8]) -> usize { - // SAFETY: All of our pointers are derived directly from a borrowed - // slice, which is guaranteed to be valid. - unsafe { - let start = haystack.as_ptr(); - let end = start.add(haystack.len()); - self.count_raw(start, end) - } - } - - /// Like `find`, but accepts and returns raw pointers. - /// - /// When a match is found, the pointer returned is guaranteed to be - /// `>= start` and `< end`. - /// - /// This routine is useful if you're already using raw pointers and would - /// like to avoid converting back to a slice before executing a search. - /// - /// # Safety - /// - /// * Both `start` and `end` must be valid for reads. - /// * Both `start` and `end` must point to an initialized value. - /// * Both `start` and `end` must point to the same allocated object and - /// must either be in bounds or at most one byte past the end of the - /// allocated object. - /// * Both `start` and `end` must be _derived from_ a pointer to the same - /// object. - /// * The distance between `start` and `end` must not overflow `isize`. - /// * The distance being in bounds must not rely on "wrapping around" the - /// address space. - /// - /// Note that callers may pass a pair of pointers such that `start >= end`. - /// In that case, `None` will always be returned. - #[inline] - pub unsafe fn find_raw( - &self, - start: *const u8, - end: *const u8, - ) -> Option<*const u8> { - if start >= end { - return None; - } - if end.distance(start) < uint8x16_t::BYTES { - // SAFETY: We require the caller to pass valid start/end pointers. - return generic::fwd_byte_by_byte(start, end, |b| { - b == self.0.needle1() - }); - } - // SAFETY: Building a `One` means it's safe to call 'neon' routines. - // Also, we've checked that our haystack is big enough to run on the - // vector routine. Pointer validity is caller's responsibility. - self.find_raw_impl(start, end) - } - - /// Like `rfind`, but accepts and returns raw pointers. - /// - /// When a match is found, the pointer returned is guaranteed to be - /// `>= start` and `< end`. - /// - /// This routine is useful if you're already using raw pointers and would - /// like to avoid converting back to a slice before executing a search. - /// - /// # Safety - /// - /// * Both `start` and `end` must be valid for reads. - /// * Both `start` and `end` must point to an initialized value. - /// * Both `start` and `end` must point to the same allocated object and - /// must either be in bounds or at most one byte past the end of the - /// allocated object. - /// * Both `start` and `end` must be _derived from_ a pointer to the same - /// object. - /// * The distance between `start` and `end` must not overflow `isize`. - /// * The distance being in bounds must not rely on "wrapping around" the - /// address space. - /// - /// Note that callers may pass a pair of pointers such that `start >= end`. - /// In that case, `None` will always be returned. - #[inline] - pub unsafe fn rfind_raw( - &self, - start: *const u8, - end: *const u8, - ) -> Option<*const u8> { - if start >= end { - return None; - } - if end.distance(start) < uint8x16_t::BYTES { - // SAFETY: We require the caller to pass valid start/end pointers. - return generic::rev_byte_by_byte(start, end, |b| { - b == self.0.needle1() - }); - } - // SAFETY: Building a `One` means it's safe to call 'neon' routines. - // Also, we've checked that our haystack is big enough to run on the - // vector routine. Pointer validity is caller's responsibility. - self.rfind_raw_impl(start, end) - } - - /// Like `count`, but accepts and returns raw pointers. - /// - /// This routine is useful if you're already using raw pointers and would - /// like to avoid converting back to a slice before executing a search. - /// - /// # Safety - /// - /// * Both `start` and `end` must be valid for reads. - /// * Both `start` and `end` must point to an initialized value. - /// * Both `start` and `end` must point to the same allocated object and - /// must either be in bounds or at most one byte past the end of the - /// allocated object. - /// * Both `start` and `end` must be _derived from_ a pointer to the same - /// object. - /// * The distance between `start` and `end` must not overflow `isize`. - /// * The distance being in bounds must not rely on "wrapping around" the - /// address space. - /// - /// Note that callers may pass a pair of pointers such that `start >= end`. - /// In that case, `None` will always be returned. - #[inline] - pub unsafe fn count_raw(&self, start: *const u8, end: *const u8) -> usize { - if start >= end { - return 0; - } - if end.distance(start) < uint8x16_t::BYTES { - // SAFETY: We require the caller to pass valid start/end pointers. - return generic::count_byte_by_byte(start, end, |b| { - b == self.0.needle1() - }); - } - // SAFETY: Building a `One` means it's safe to call 'neon' routines. - // Also, we've checked that our haystack is big enough to run on the - // vector routine. Pointer validity is caller's responsibility. - self.count_raw_impl(start, end) - } - - /// Execute a search using neon vectors and routines. - /// - /// # Safety - /// - /// Same as [`One::find_raw`], except the distance between `start` and - /// `end` must be at least the size of a neon vector (in bytes). - /// - /// (The target feature safety obligation is automatically fulfilled by - /// virtue of being a method on `One`, which can only be constructed - /// when it is safe to call `neon` routines.) - #[target_feature(enable = "neon")] - #[inline] - unsafe fn find_raw_impl( - &self, - start: *const u8, - end: *const u8, - ) -> Option<*const u8> { - self.0.find_raw(start, end) - } - - /// Execute a search using neon vectors and routines. - /// - /// # Safety - /// - /// Same as [`One::rfind_raw`], except the distance between `start` and - /// `end` must be at least the size of a neon vector (in bytes). - /// - /// (The target feature safety obligation is automatically fulfilled by - /// virtue of being a method on `One`, which can only be constructed - /// when it is safe to call `neon` routines.) - #[target_feature(enable = "neon")] - #[inline] - unsafe fn rfind_raw_impl( - &self, - start: *const u8, - end: *const u8, - ) -> Option<*const u8> { - self.0.rfind_raw(start, end) - } - - /// Execute a count using neon vectors and routines. - /// - /// # Safety - /// - /// Same as [`One::count_raw`], except the distance between `start` and - /// `end` must be at least the size of a neon vector (in bytes). - /// - /// (The target feature safety obligation is automatically fulfilled by - /// virtue of being a method on `One`, which can only be constructed - /// when it is safe to call `neon` routines.) - #[target_feature(enable = "neon")] - #[inline] - unsafe fn count_raw_impl( - &self, - start: *const u8, - end: *const u8, - ) -> usize { - self.0.count_raw(start, end) - } - - /// Returns an iterator over all occurrences of the needle byte in the - /// given haystack. - /// - /// The iterator returned implements `DoubleEndedIterator`. This means it - /// can also be used to find occurrences in reverse order. - #[inline] - pub fn iter<'a, 'h>(&'a self, haystack: &'h [u8]) -> OneIter<'a, 'h> { - OneIter { searcher: self, it: generic::Iter::new(haystack) } - } -} - -/// An iterator over all occurrences of a single byte in a haystack. -/// -/// This iterator implements `DoubleEndedIterator`, which means it can also be -/// used to find occurrences in reverse order. -/// -/// This iterator is created by the [`One::iter`] method. -/// -/// The lifetime parameters are as follows: -/// -/// * `'a` refers to the lifetime of the underlying [`One`] searcher. -/// * `'h` refers to the lifetime of the haystack being searched. -#[derive(Clone, Debug)] -pub struct OneIter<'a, 'h> { - searcher: &'a One, - it: generic::Iter<'h>, -} - -impl<'a, 'h> Iterator for OneIter<'a, 'h> { - type Item = usize; - - #[inline] - fn next(&mut self) -> Option { - // SAFETY: We rely on the generic iterator to provide valid start - // and end pointers, but we guarantee that any pointer returned by - // 'find_raw' falls within the bounds of the start and end pointer. - unsafe { self.it.next(|s, e| self.searcher.find_raw(s, e)) } - } - - #[inline] - fn count(self) -> usize { - self.it.count(|s, e| { - // SAFETY: We rely on our generic iterator to return valid start - // and end pointers. - unsafe { self.searcher.count_raw(s, e) } - }) - } - - #[inline] - fn size_hint(&self) -> (usize, Option) { - self.it.size_hint() - } -} - -impl<'a, 'h> DoubleEndedIterator for OneIter<'a, 'h> { - #[inline] - fn next_back(&mut self) -> Option { - // SAFETY: We rely on the generic iterator to provide valid start - // and end pointers, but we guarantee that any pointer returned by - // 'rfind_raw' falls within the bounds of the start and end pointer. - unsafe { self.it.next_back(|s, e| self.searcher.rfind_raw(s, e)) } - } -} - -impl<'a, 'h> core::iter::FusedIterator for OneIter<'a, 'h> {} - -/// Finds all occurrences of two bytes in a haystack. -/// -/// That is, this reports matches of one of two possible bytes. For example, -/// searching for `a` or `b` in `afoobar` would report matches at offsets `0`, -/// `4` and `5`. -#[derive(Clone, Copy, Debug)] -pub struct Two(generic::Two); - -impl Two { - /// Create a new searcher that finds occurrences of the needle bytes given. - /// - /// This particular searcher is specialized to use neon vector instructions - /// that typically make it quite fast. - /// - /// If neon is unavailable in the current environment, then `None` is - /// returned. - #[inline] - pub fn new(needle1: u8, needle2: u8) -> Option { - if Two::is_available() { - // SAFETY: we check that neon is available above. - unsafe { Some(Two::new_unchecked(needle1, needle2)) } - } else { - None - } - } - - /// Create a new finder specific to neon vectors and routines without - /// checking that neon is available. - /// - /// # Safety - /// - /// Callers must guarantee that it is safe to execute `neon` instructions - /// in the current environment. - /// - /// Note that it is a common misconception that if one compiles for an - /// `x86_64` target, then they therefore automatically have access to neon - /// instructions. While this is almost always the case, it isn't true in - /// 100% of cases. - #[target_feature(enable = "neon")] - #[inline] - pub unsafe fn new_unchecked(needle1: u8, needle2: u8) -> Two { - Two(generic::Two::new(needle1, needle2)) - } - - /// Returns true when this implementation is available in the current - /// environment. - /// - /// When this is true, it is guaranteed that [`Two::new`] will return - /// a `Some` value. Similarly, when it is false, it is guaranteed that - /// `Two::new` will return a `None` value. - /// - /// Note also that for the lifetime of a single program, if this returns - /// true then it will always return true. - #[inline] - pub fn is_available() -> bool { - #[cfg(target_feature = "neon")] - { - true - } - #[cfg(not(target_feature = "neon"))] - { - false - } - } - - /// Return the first occurrence of one of the needle bytes in the given - /// haystack. If no such occurrence exists, then `None` is returned. - /// - /// The occurrence is reported as an offset into `haystack`. Its maximum - /// value is `haystack.len() - 1`. - #[inline] - pub fn find(&self, haystack: &[u8]) -> Option { - // SAFETY: `find_raw` guarantees that if a pointer is returned, it - // falls within the bounds of the start and end pointers. - unsafe { - generic::search_slice_with_raw(haystack, |s, e| { - self.find_raw(s, e) - }) - } - } - - /// Return the last occurrence of one of the needle bytes in the given - /// haystack. If no such occurrence exists, then `None` is returned. - /// - /// The occurrence is reported as an offset into `haystack`. Its maximum - /// value is `haystack.len() - 1`. - #[inline] - pub fn rfind(&self, haystack: &[u8]) -> Option { - // SAFETY: `rfind_raw` guarantees that if a pointer is returned, it - // falls within the bounds of the start and end pointers. - unsafe { - generic::search_slice_with_raw(haystack, |s, e| { - self.rfind_raw(s, e) - }) - } - } - - /// Like `find`, but accepts and returns raw pointers. - /// - /// When a match is found, the pointer returned is guaranteed to be - /// `>= start` and `< end`. - /// - /// This routine is useful if you're already using raw pointers and would - /// like to avoid converting back to a slice before executing a search. - /// - /// # Safety - /// - /// * Both `start` and `end` must be valid for reads. - /// * Both `start` and `end` must point to an initialized value. - /// * Both `start` and `end` must point to the same allocated object and - /// must either be in bounds or at most one byte past the end of the - /// allocated object. - /// * Both `start` and `end` must be _derived from_ a pointer to the same - /// object. - /// * The distance between `start` and `end` must not overflow `isize`. - /// * The distance being in bounds must not rely on "wrapping around" the - /// address space. - /// - /// Note that callers may pass a pair of pointers such that `start >= end`. - /// In that case, `None` will always be returned. - #[inline] - pub unsafe fn find_raw( - &self, - start: *const u8, - end: *const u8, - ) -> Option<*const u8> { - if start >= end { - return None; - } - if end.distance(start) < uint8x16_t::BYTES { - // SAFETY: We require the caller to pass valid start/end pointers. - return generic::fwd_byte_by_byte(start, end, |b| { - b == self.0.needle1() || b == self.0.needle2() - }); - } - // SAFETY: Building a `Two` means it's safe to call 'neon' routines. - // Also, we've checked that our haystack is big enough to run on the - // vector routine. Pointer validity is caller's responsibility. - self.find_raw_impl(start, end) - } - - /// Like `rfind`, but accepts and returns raw pointers. - /// - /// When a match is found, the pointer returned is guaranteed to be - /// `>= start` and `< end`. - /// - /// This routine is useful if you're already using raw pointers and would - /// like to avoid converting back to a slice before executing a search. - /// - /// # Safety - /// - /// * Both `start` and `end` must be valid for reads. - /// * Both `start` and `end` must point to an initialized value. - /// * Both `start` and `end` must point to the same allocated object and - /// must either be in bounds or at most one byte past the end of the - /// allocated object. - /// * Both `start` and `end` must be _derived from_ a pointer to the same - /// object. - /// * The distance between `start` and `end` must not overflow `isize`. - /// * The distance being in bounds must not rely on "wrapping around" the - /// address space. - /// - /// Note that callers may pass a pair of pointers such that `start >= end`. - /// In that case, `None` will always be returned. - #[inline] - pub unsafe fn rfind_raw( - &self, - start: *const u8, - end: *const u8, - ) -> Option<*const u8> { - if start >= end { - return None; - } - if end.distance(start) < uint8x16_t::BYTES { - // SAFETY: We require the caller to pass valid start/end pointers. - return generic::rev_byte_by_byte(start, end, |b| { - b == self.0.needle1() || b == self.0.needle2() - }); - } - // SAFETY: Building a `Two` means it's safe to call 'neon' routines. - // Also, we've checked that our haystack is big enough to run on the - // vector routine. Pointer validity is caller's responsibility. - self.rfind_raw_impl(start, end) - } - - /// Execute a search using neon vectors and routines. - /// - /// # Safety - /// - /// Same as [`Two::find_raw`], except the distance between `start` and - /// `end` must be at least the size of a neon vector (in bytes). - /// - /// (The target feature safety obligation is automatically fulfilled by - /// virtue of being a method on `Two`, which can only be constructed - /// when it is safe to call `neon` routines.) - #[target_feature(enable = "neon")] - #[inline] - unsafe fn find_raw_impl( - &self, - start: *const u8, - end: *const u8, - ) -> Option<*const u8> { - self.0.find_raw(start, end) - } - - /// Execute a search using neon vectors and routines. - /// - /// # Safety - /// - /// Same as [`Two::rfind_raw`], except the distance between `start` and - /// `end` must be at least the size of a neon vector (in bytes). - /// - /// (The target feature safety obligation is automatically fulfilled by - /// virtue of being a method on `Two`, which can only be constructed - /// when it is safe to call `neon` routines.) - #[target_feature(enable = "neon")] - #[inline] - unsafe fn rfind_raw_impl( - &self, - start: *const u8, - end: *const u8, - ) -> Option<*const u8> { - self.0.rfind_raw(start, end) - } - - /// Returns an iterator over all occurrences of the needle bytes in the - /// given haystack. - /// - /// The iterator returned implements `DoubleEndedIterator`. This means it - /// can also be used to find occurrences in reverse order. - #[inline] - pub fn iter<'a, 'h>(&'a self, haystack: &'h [u8]) -> TwoIter<'a, 'h> { - TwoIter { searcher: self, it: generic::Iter::new(haystack) } - } -} - -/// An iterator over all occurrences of two possible bytes in a haystack. -/// -/// This iterator implements `DoubleEndedIterator`, which means it can also be -/// used to find occurrences in reverse order. -/// -/// This iterator is created by the [`Two::iter`] method. -/// -/// The lifetime parameters are as follows: -/// -/// * `'a` refers to the lifetime of the underlying [`Two`] searcher. -/// * `'h` refers to the lifetime of the haystack being searched. -#[derive(Clone, Debug)] -pub struct TwoIter<'a, 'h> { - searcher: &'a Two, - it: generic::Iter<'h>, -} - -impl<'a, 'h> Iterator for TwoIter<'a, 'h> { - type Item = usize; - - #[inline] - fn next(&mut self) -> Option { - // SAFETY: We rely on the generic iterator to provide valid start - // and end pointers, but we guarantee that any pointer returned by - // 'find_raw' falls within the bounds of the start and end pointer. - unsafe { self.it.next(|s, e| self.searcher.find_raw(s, e)) } - } - - #[inline] - fn size_hint(&self) -> (usize, Option) { - self.it.size_hint() - } -} - -impl<'a, 'h> DoubleEndedIterator for TwoIter<'a, 'h> { - #[inline] - fn next_back(&mut self) -> Option { - // SAFETY: We rely on the generic iterator to provide valid start - // and end pointers, but we guarantee that any pointer returned by - // 'rfind_raw' falls within the bounds of the start and end pointer. - unsafe { self.it.next_back(|s, e| self.searcher.rfind_raw(s, e)) } - } -} - -impl<'a, 'h> core::iter::FusedIterator for TwoIter<'a, 'h> {} - -/// Finds all occurrences of three bytes in a haystack. -/// -/// That is, this reports matches of one of three possible bytes. For example, -/// searching for `a`, `b` or `o` in `afoobar` would report matches at offsets -/// `0`, `2`, `3`, `4` and `5`. -#[derive(Clone, Copy, Debug)] -pub struct Three(generic::Three); - -impl Three { - /// Create a new searcher that finds occurrences of the needle bytes given. - /// - /// This particular searcher is specialized to use neon vector instructions - /// that typically make it quite fast. - /// - /// If neon is unavailable in the current environment, then `None` is - /// returned. - #[inline] - pub fn new(needle1: u8, needle2: u8, needle3: u8) -> Option { - if Three::is_available() { - // SAFETY: we check that neon is available above. - unsafe { Some(Three::new_unchecked(needle1, needle2, needle3)) } - } else { - None - } - } - - /// Create a new finder specific to neon vectors and routines without - /// checking that neon is available. - /// - /// # Safety - /// - /// Callers must guarantee that it is safe to execute `neon` instructions - /// in the current environment. - /// - /// Note that it is a common misconception that if one compiles for an - /// `x86_64` target, then they therefore automatically have access to neon - /// instructions. While this is almost always the case, it isn't true in - /// 100% of cases. - #[target_feature(enable = "neon")] - #[inline] - pub unsafe fn new_unchecked( - needle1: u8, - needle2: u8, - needle3: u8, - ) -> Three { - Three(generic::Three::new(needle1, needle2, needle3)) - } - - /// Returns true when this implementation is available in the current - /// environment. - /// - /// When this is true, it is guaranteed that [`Three::new`] will return - /// a `Some` value. Similarly, when it is false, it is guaranteed that - /// `Three::new` will return a `None` value. - /// - /// Note also that for the lifetime of a single program, if this returns - /// true then it will always return true. - #[inline] - pub fn is_available() -> bool { - #[cfg(target_feature = "neon")] - { - true - } - #[cfg(not(target_feature = "neon"))] - { - false - } - } - - /// Return the first occurrence of one of the needle bytes in the given - /// haystack. If no such occurrence exists, then `None` is returned. - /// - /// The occurrence is reported as an offset into `haystack`. Its maximum - /// value is `haystack.len() - 1`. - #[inline] - pub fn find(&self, haystack: &[u8]) -> Option { - // SAFETY: `find_raw` guarantees that if a pointer is returned, it - // falls within the bounds of the start and end pointers. - unsafe { - generic::search_slice_with_raw(haystack, |s, e| { - self.find_raw(s, e) - }) - } - } - - /// Return the last occurrence of one of the needle bytes in the given - /// haystack. If no such occurrence exists, then `None` is returned. - /// - /// The occurrence is reported as an offset into `haystack`. Its maximum - /// value is `haystack.len() - 1`. - #[inline] - pub fn rfind(&self, haystack: &[u8]) -> Option { - // SAFETY: `rfind_raw` guarantees that if a pointer is returned, it - // falls within the bounds of the start and end pointers. - unsafe { - generic::search_slice_with_raw(haystack, |s, e| { - self.rfind_raw(s, e) - }) - } - } - - /// Like `find`, but accepts and returns raw pointers. - /// - /// When a match is found, the pointer returned is guaranteed to be - /// `>= start` and `< end`. - /// - /// This routine is useful if you're already using raw pointers and would - /// like to avoid converting back to a slice before executing a search. - /// - /// # Safety - /// - /// * Both `start` and `end` must be valid for reads. - /// * Both `start` and `end` must point to an initialized value. - /// * Both `start` and `end` must point to the same allocated object and - /// must either be in bounds or at most one byte past the end of the - /// allocated object. - /// * Both `start` and `end` must be _derived from_ a pointer to the same - /// object. - /// * The distance between `start` and `end` must not overflow `isize`. - /// * The distance being in bounds must not rely on "wrapping around" the - /// address space. - /// - /// Note that callers may pass a pair of pointers such that `start >= end`. - /// In that case, `None` will always be returned. - #[inline] - pub unsafe fn find_raw( - &self, - start: *const u8, - end: *const u8, - ) -> Option<*const u8> { - if start >= end { - return None; - } - if end.distance(start) < uint8x16_t::BYTES { - // SAFETY: We require the caller to pass valid start/end pointers. - return generic::fwd_byte_by_byte(start, end, |b| { - b == self.0.needle1() - || b == self.0.needle2() - || b == self.0.needle3() - }); - } - // SAFETY: Building a `Three` means it's safe to call 'neon' routines. - // Also, we've checked that our haystack is big enough to run on the - // vector routine. Pointer validity is caller's responsibility. - self.find_raw_impl(start, end) - } - - /// Like `rfind`, but accepts and returns raw pointers. - /// - /// When a match is found, the pointer returned is guaranteed to be - /// `>= start` and `< end`. - /// - /// This routine is useful if you're already using raw pointers and would - /// like to avoid converting back to a slice before executing a search. - /// - /// # Safety - /// - /// * Both `start` and `end` must be valid for reads. - /// * Both `start` and `end` must point to an initialized value. - /// * Both `start` and `end` must point to the same allocated object and - /// must either be in bounds or at most one byte past the end of the - /// allocated object. - /// * Both `start` and `end` must be _derived from_ a pointer to the same - /// object. - /// * The distance between `start` and `end` must not overflow `isize`. - /// * The distance being in bounds must not rely on "wrapping around" the - /// address space. - /// - /// Note that callers may pass a pair of pointers such that `start >= end`. - /// In that case, `None` will always be returned. - #[inline] - pub unsafe fn rfind_raw( - &self, - start: *const u8, - end: *const u8, - ) -> Option<*const u8> { - if start >= end { - return None; - } - if end.distance(start) < uint8x16_t::BYTES { - // SAFETY: We require the caller to pass valid start/end pointers. - return generic::rev_byte_by_byte(start, end, |b| { - b == self.0.needle1() - || b == self.0.needle2() - || b == self.0.needle3() - }); - } - // SAFETY: Building a `Three` means it's safe to call 'neon' routines. - // Also, we've checked that our haystack is big enough to run on the - // vector routine. Pointer validity is caller's responsibility. - self.rfind_raw_impl(start, end) - } - - /// Execute a search using neon vectors and routines. - /// - /// # Safety - /// - /// Same as [`Three::find_raw`], except the distance between `start` and - /// `end` must be at least the size of a neon vector (in bytes). - /// - /// (The target feature safety obligation is automatically fulfilled by - /// virtue of being a method on `Three`, which can only be constructed - /// when it is safe to call `neon` routines.) - #[target_feature(enable = "neon")] - #[inline] - unsafe fn find_raw_impl( - &self, - start: *const u8, - end: *const u8, - ) -> Option<*const u8> { - self.0.find_raw(start, end) - } - - /// Execute a search using neon vectors and routines. - /// - /// # Safety - /// - /// Same as [`Three::rfind_raw`], except the distance between `start` and - /// `end` must be at least the size of a neon vector (in bytes). - /// - /// (The target feature safety obligation is automatically fulfilled by - /// virtue of being a method on `Three`, which can only be constructed - /// when it is safe to call `neon` routines.) - #[target_feature(enable = "neon")] - #[inline] - unsafe fn rfind_raw_impl( - &self, - start: *const u8, - end: *const u8, - ) -> Option<*const u8> { - self.0.rfind_raw(start, end) - } - - /// Returns an iterator over all occurrences of the needle byte in the - /// given haystack. - /// - /// The iterator returned implements `DoubleEndedIterator`. This means it - /// can also be used to find occurrences in reverse order. - #[inline] - pub fn iter<'a, 'h>(&'a self, haystack: &'h [u8]) -> ThreeIter<'a, 'h> { - ThreeIter { searcher: self, it: generic::Iter::new(haystack) } - } -} - -/// An iterator over all occurrences of three possible bytes in a haystack. -/// -/// This iterator implements `DoubleEndedIterator`, which means it can also be -/// used to find occurrences in reverse order. -/// -/// This iterator is created by the [`Three::iter`] method. -/// -/// The lifetime parameters are as follows: -/// -/// * `'a` refers to the lifetime of the underlying [`Three`] searcher. -/// * `'h` refers to the lifetime of the haystack being searched. -#[derive(Clone, Debug)] -pub struct ThreeIter<'a, 'h> { - searcher: &'a Three, - it: generic::Iter<'h>, -} - -impl<'a, 'h> Iterator for ThreeIter<'a, 'h> { - type Item = usize; - - #[inline] - fn next(&mut self) -> Option { - // SAFETY: We rely on the generic iterator to provide valid start - // and end pointers, but we guarantee that any pointer returned by - // 'find_raw' falls within the bounds of the start and end pointer. - unsafe { self.it.next(|s, e| self.searcher.find_raw(s, e)) } - } - - #[inline] - fn size_hint(&self) -> (usize, Option) { - self.it.size_hint() - } -} - -impl<'a, 'h> DoubleEndedIterator for ThreeIter<'a, 'h> { - #[inline] - fn next_back(&mut self) -> Option { - // SAFETY: We rely on the generic iterator to provide valid start - // and end pointers, but we guarantee that any pointer returned by - // 'rfind_raw' falls within the bounds of the start and end pointer. - unsafe { self.it.next_back(|s, e| self.searcher.rfind_raw(s, e)) } - } -} - -impl<'a, 'h> core::iter::FusedIterator for ThreeIter<'a, 'h> {} - -#[cfg(test)] -mod tests { - use super::*; - - define_memchr_quickcheck!(super); - - #[test] - fn forward_one() { - crate::tests::memchr::Runner::new(1).forward_iter( - |haystack, needles| { - Some(One::new(needles[0])?.iter(haystack).collect()) - }, - ) - } - - #[test] - fn reverse_one() { - crate::tests::memchr::Runner::new(1).reverse_iter( - |haystack, needles| { - Some(One::new(needles[0])?.iter(haystack).rev().collect()) - }, - ) - } - - #[test] - fn count_one() { - crate::tests::memchr::Runner::new(1).count_iter(|haystack, needles| { - Some(One::new(needles[0])?.iter(haystack).count()) - }) - } - - #[test] - fn forward_two() { - crate::tests::memchr::Runner::new(2).forward_iter( - |haystack, needles| { - let n1 = needles.get(0).copied()?; - let n2 = needles.get(1).copied()?; - Some(Two::new(n1, n2)?.iter(haystack).collect()) - }, - ) - } - - #[test] - fn reverse_two() { - crate::tests::memchr::Runner::new(2).reverse_iter( - |haystack, needles| { - let n1 = needles.get(0).copied()?; - let n2 = needles.get(1).copied()?; - Some(Two::new(n1, n2)?.iter(haystack).rev().collect()) - }, - ) - } - - #[test] - fn forward_three() { - crate::tests::memchr::Runner::new(3).forward_iter( - |haystack, needles| { - let n1 = needles.get(0).copied()?; - let n2 = needles.get(1).copied()?; - let n3 = needles.get(2).copied()?; - Some(Three::new(n1, n2, n3)?.iter(haystack).collect()) - }, - ) - } - - #[test] - fn reverse_three() { - crate::tests::memchr::Runner::new(3).reverse_iter( - |haystack, needles| { - let n1 = needles.get(0).copied()?; - let n2 = needles.get(1).copied()?; - let n3 = needles.get(2).copied()?; - Some(Three::new(n1, n2, n3)?.iter(haystack).rev().collect()) - }, - ) - } -} diff -Nru temporalio-1.3.0/vendor/memchr/src/arch/aarch64/neon/mod.rs temporalio-1.3.0/vendor/memchr/src/arch/aarch64/neon/mod.rs --- temporalio-1.3.0/vendor/memchr/src/arch/aarch64/neon/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/arch/aarch64/neon/mod.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,6 +0,0 @@ -/*! -Algorithms for the `aarch64` target using 128-bit vectors via NEON. -*/ - -pub mod memchr; -pub mod packedpair; diff -Nru temporalio-1.3.0/vendor/memchr/src/arch/aarch64/neon/packedpair.rs temporalio-1.3.0/vendor/memchr/src/arch/aarch64/neon/packedpair.rs --- temporalio-1.3.0/vendor/memchr/src/arch/aarch64/neon/packedpair.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/arch/aarch64/neon/packedpair.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,236 +0,0 @@ -/*! -A 128-bit vector implementation of the "packed pair" SIMD algorithm. - -The "packed pair" algorithm is based on the [generic SIMD] algorithm. The main -difference is that it (by default) uses a background distribution of byte -frequencies to heuristically select the pair of bytes to search for. - -[generic SIMD]: http://0x80.pl/articles/simd-strfind.html#first-and-last -*/ - -use core::arch::aarch64::uint8x16_t; - -use crate::arch::{all::packedpair::Pair, generic::packedpair}; - -/// A "packed pair" finder that uses 128-bit vector operations. -/// -/// This finder picks two bytes that it believes have high predictive power -/// for indicating an overall match of a needle. Depending on whether -/// `Finder::find` or `Finder::find_prefilter` is used, it reports offsets -/// where the needle matches or could match. In the prefilter case, candidates -/// are reported whenever the [`Pair`] of bytes given matches. -#[derive(Clone, Copy, Debug)] -pub struct Finder(packedpair::Finder); - -/// A "packed pair" finder that uses 128-bit vector operations. -/// -/// This finder picks two bytes that it believes have high predictive power -/// for indicating an overall match of a needle. Depending on whether -/// `Finder::find` or `Finder::find_prefilter` is used, it reports offsets -/// where the needle matches or could match. In the prefilter case, candidates -/// are reported whenever the [`Pair`] of bytes given matches. -impl Finder { - /// Create a new pair searcher. The searcher returned can either report - /// exact matches of `needle` or act as a prefilter and report candidate - /// positions of `needle`. - /// - /// If neon is unavailable in the current environment or if a [`Pair`] - /// could not be constructed from the needle given, then `None` is - /// returned. - #[inline] - pub fn new(needle: &[u8]) -> Option { - Finder::with_pair(needle, Pair::new(needle)?) - } - - /// Create a new "packed pair" finder using the pair of bytes given. - /// - /// This constructor permits callers to control precisely which pair of - /// bytes is used as a predicate. - /// - /// If neon is unavailable in the current environment, then `None` is - /// returned. - #[inline] - pub fn with_pair(needle: &[u8], pair: Pair) -> Option { - if Finder::is_available() { - // SAFETY: we check that sse2 is available above. We are also - // guaranteed to have needle.len() > 1 because we have a valid - // Pair. - unsafe { Some(Finder::with_pair_impl(needle, pair)) } - } else { - None - } - } - - /// Create a new `Finder` specific to neon vectors and routines. - /// - /// # Safety - /// - /// Same as the safety for `packedpair::Finder::new`, and callers must also - /// ensure that neon is available. - #[target_feature(enable = "neon")] - #[inline] - unsafe fn with_pair_impl(needle: &[u8], pair: Pair) -> Finder { - let finder = packedpair::Finder::::new(needle, pair); - Finder(finder) - } - - /// Returns true when this implementation is available in the current - /// environment. - /// - /// When this is true, it is guaranteed that [`Finder::with_pair`] will - /// return a `Some` value. Similarly, when it is false, it is guaranteed - /// that `Finder::with_pair` will return a `None` value. Notice that this - /// does not guarantee that [`Finder::new`] will return a `Finder`. Namely, - /// even when `Finder::is_available` is true, it is not guaranteed that a - /// valid [`Pair`] can be found from the needle given. - /// - /// Note also that for the lifetime of a single program, if this returns - /// true then it will always return true. - #[inline] - pub fn is_available() -> bool { - #[cfg(target_feature = "neon")] - { - true - } - #[cfg(not(target_feature = "neon"))] - { - false - } - } - - /// Execute a search using neon vectors and routines. - /// - /// # Panics - /// - /// When `haystack.len()` is less than [`Finder::min_haystack_len`]. - #[inline] - pub fn find(&self, haystack: &[u8], needle: &[u8]) -> Option { - // SAFETY: Building a `Finder` means it's safe to call 'neon' routines. - unsafe { self.find_impl(haystack, needle) } - } - - /// Execute a search using neon vectors and routines. - /// - /// # Panics - /// - /// When `haystack.len()` is less than [`Finder::min_haystack_len`]. - #[inline] - pub fn find_prefilter(&self, haystack: &[u8]) -> Option { - // SAFETY: Building a `Finder` means it's safe to call 'neon' routines. - unsafe { self.find_prefilter_impl(haystack) } - } - - /// Execute a search using neon vectors and routines. - /// - /// # Panics - /// - /// When `haystack.len()` is less than [`Finder::min_haystack_len`]. - /// - /// # Safety - /// - /// (The target feature safety obligation is automatically fulfilled by - /// virtue of being a method on `Finder`, which can only be constructed - /// when it is safe to call `neon` routines.) - #[target_feature(enable = "neon")] - #[inline] - unsafe fn find_impl( - &self, - haystack: &[u8], - needle: &[u8], - ) -> Option { - self.0.find(haystack, needle) - } - - /// Execute a prefilter search using neon vectors and routines. - /// - /// # Panics - /// - /// When `haystack.len()` is less than [`Finder::min_haystack_len`]. - /// - /// # Safety - /// - /// (The target feature safety obligation is automatically fulfilled by - /// virtue of being a method on `Finder`, which can only be constructed - /// when it is safe to call `neon` routines.) - #[target_feature(enable = "neon")] - #[inline] - unsafe fn find_prefilter_impl(&self, haystack: &[u8]) -> Option { - self.0.find_prefilter(haystack) - } - - /// Returns the pair of offsets (into the needle) used to check as a - /// predicate before confirming whether a needle exists at a particular - /// position. - #[inline] - pub fn pair(&self) -> &Pair { - self.0.pair() - } - - /// Returns the minimum haystack length that this `Finder` can search. - /// - /// Using a haystack with length smaller than this in a search will result - /// in a panic. The reason for this restriction is that this finder is - /// meant to be a low-level component that is part of a larger substring - /// strategy. In that sense, it avoids trying to handle all cases and - /// instead only handles the cases that it can handle very well. - #[inline] - pub fn min_haystack_len(&self) -> usize { - self.0.min_haystack_len() - } -} - -#[cfg(test)] -mod tests { - use super::*; - - fn find(haystack: &[u8], needle: &[u8]) -> Option> { - let f = Finder::new(needle)?; - if haystack.len() < f.min_haystack_len() { - return None; - } - Some(f.find(haystack, needle)) - } - - define_substring_forward_quickcheck!(find); - - #[test] - fn forward_substring() { - crate::tests::substring::Runner::new().fwd(find).run() - } - - #[test] - fn forward_packedpair() { - fn find( - haystack: &[u8], - needle: &[u8], - index1: u8, - index2: u8, - ) -> Option> { - let pair = Pair::with_indices(needle, index1, index2)?; - let f = Finder::with_pair(needle, pair)?; - if haystack.len() < f.min_haystack_len() { - return None; - } - Some(f.find(haystack, needle)) - } - crate::tests::packedpair::Runner::new().fwd(find).run() - } - - #[test] - fn forward_packedpair_prefilter() { - fn find( - haystack: &[u8], - needle: &[u8], - index1: u8, - index2: u8, - ) -> Option> { - let pair = Pair::with_indices(needle, index1, index2)?; - let f = Finder::with_pair(needle, pair)?; - if haystack.len() < f.min_haystack_len() { - return None; - } - Some(f.find_prefilter(haystack)) - } - crate::tests::packedpair::Runner::new().fwd(find).run() - } -} diff -Nru temporalio-1.3.0/vendor/memchr/src/arch/all/memchr.rs temporalio-1.3.0/vendor/memchr/src/arch/all/memchr.rs --- temporalio-1.3.0/vendor/memchr/src/arch/all/memchr.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/arch/all/memchr.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,996 +0,0 @@ -/*! -Provides architecture independent implementations of `memchr` and friends. - -The main types in this module are [`One`], [`Two`] and [`Three`]. They are for -searching for one, two or three distinct bytes, respectively, in a haystack. -Each type also has corresponding double ended iterators. These searchers -are typically slower than hand-coded vector routines accomplishing the same -task, but are also typically faster than naive scalar code. These routines -effectively work by treating a `usize` as a vector of 8-bit lanes, and thus -achieves some level of data parallelism even without explicit vector support. - -The `One` searcher also provides a [`One::count`] routine for efficiently -counting the number of times a single byte occurs in a haystack. This is -useful, for example, for counting the number of lines in a haystack. This -routine exists because it is usually faster, especially with a high match -count, then using [`One::find`] repeatedly. ([`OneIter`] specializes its -`Iterator::count` implementation to use this routine.) - -Only one, two and three bytes are supported because three bytes is about -the point where one sees diminishing returns. Beyond this point and it's -probably (but not necessarily) better to just use a simple `[bool; 256]` array -or similar. However, it depends mightily on the specific work-load and the -expected match frequency. -*/ - -use crate::{arch::generic::memchr as generic, ext::Pointer}; - -/// The number of bytes in a single `usize` value. -const USIZE_BYTES: usize = (usize::BITS / 8) as usize; -/// The bits that must be zero for a `*const usize` to be properly aligned. -const USIZE_ALIGN: usize = USIZE_BYTES - 1; - -/// Finds all occurrences of a single byte in a haystack. -#[derive(Clone, Copy, Debug)] -pub struct One { - s1: u8, - v1: usize, -} - -impl One { - /// The number of bytes we examine per each iteration of our search loop. - const LOOP_BYTES: usize = 2 * USIZE_BYTES; - - /// Create a new searcher that finds occurrences of the byte given. - #[inline] - pub fn new(needle: u8) -> One { - One { s1: needle, v1: splat(needle) } - } - - /// A test-only routine so that we can bundle a bunch of quickcheck - /// properties into a single macro. Basically, this provides a constructor - /// that makes it identical to most other memchr implementations, which - /// have fallible constructors. - #[cfg(test)] - pub(crate) fn try_new(needle: u8) -> Option { - Some(One::new(needle)) - } - - /// Return the first occurrence of the needle in the given haystack. If no - /// such occurrence exists, then `None` is returned. - /// - /// The occurrence is reported as an offset into `haystack`. Its maximum - /// value for a non-empty haystack is `haystack.len() - 1`. - #[inline] - pub fn find(&self, haystack: &[u8]) -> Option { - // SAFETY: `find_raw` guarantees that if a pointer is returned, it - // falls within the bounds of the start and end pointers. - unsafe { - generic::search_slice_with_raw(haystack, |s, e| { - self.find_raw(s, e) - }) - } - } - - /// Return the last occurrence of the needle in the given haystack. If no - /// such occurrence exists, then `None` is returned. - /// - /// The occurrence is reported as an offset into `haystack`. Its maximum - /// value for a non-empty haystack is `haystack.len() - 1`. - #[inline] - pub fn rfind(&self, haystack: &[u8]) -> Option { - // SAFETY: `find_raw` guarantees that if a pointer is returned, it - // falls within the bounds of the start and end pointers. - unsafe { - generic::search_slice_with_raw(haystack, |s, e| { - self.rfind_raw(s, e) - }) - } - } - - /// Counts all occurrences of this byte in the given haystack. - #[inline] - pub fn count(&self, haystack: &[u8]) -> usize { - // SAFETY: All of our pointers are derived directly from a borrowed - // slice, which is guaranteed to be valid. - unsafe { - let start = haystack.as_ptr(); - let end = start.add(haystack.len()); - self.count_raw(start, end) - } - } - - /// Like `find`, but accepts and returns raw pointers. - /// - /// When a match is found, the pointer returned is guaranteed to be - /// `>= start` and `< end`. - /// - /// This routine is useful if you're already using raw pointers and would - /// like to avoid converting back to a slice before executing a search. - /// - /// # Safety - /// - /// * Both `start` and `end` must be valid for reads. - /// * Both `start` and `end` must point to an initialized value. - /// * Both `start` and `end` must point to the same allocated object and - /// must either be in bounds or at most one byte past the end of the - /// allocated object. - /// * Both `start` and `end` must be _derived from_ a pointer to the same - /// object. - /// * The distance between `start` and `end` must not overflow `isize`. - /// * The distance being in bounds must not rely on "wrapping around" the - /// address space. - /// - /// Note that callers may pass a pair of pointers such that `start >= end`. - /// In that case, `None` will always be returned. - #[inline] - pub unsafe fn find_raw( - &self, - start: *const u8, - end: *const u8, - ) -> Option<*const u8> { - if start >= end { - return None; - } - let confirm = |b| self.confirm(b); - let len = end.distance(start); - if len < USIZE_BYTES { - return generic::fwd_byte_by_byte(start, end, confirm); - } - - // The start of the search may not be aligned to `*const usize`, - // so we do an unaligned load here. - let chunk = start.cast::().read_unaligned(); - if self.has_needle(chunk) { - return generic::fwd_byte_by_byte(start, end, confirm); - } - - // And now we start our search at a guaranteed aligned position. - // The first iteration of the loop below will overlap with the the - // unaligned chunk above in cases where the search starts at an - // unaligned offset, but that's okay as we're only here if that - // above didn't find a match. - let mut cur = - start.add(USIZE_BYTES - (start.as_usize() & USIZE_ALIGN)); - debug_assert!(cur > start); - if len <= One::LOOP_BYTES { - return generic::fwd_byte_by_byte(cur, end, confirm); - } - debug_assert!(end.sub(One::LOOP_BYTES) >= start); - while cur <= end.sub(One::LOOP_BYTES) { - debug_assert_eq!(0, cur.as_usize() % USIZE_BYTES); - - let a = cur.cast::().read(); - let b = cur.add(USIZE_BYTES).cast::().read(); - if self.has_needle(a) || self.has_needle(b) { - break; - } - cur = cur.add(One::LOOP_BYTES); - } - generic::fwd_byte_by_byte(cur, end, confirm) - } - - /// Like `rfind`, but accepts and returns raw pointers. - /// - /// When a match is found, the pointer returned is guaranteed to be - /// `>= start` and `< end`. - /// - /// This routine is useful if you're already using raw pointers and would - /// like to avoid converting back to a slice before executing a search. - /// - /// # Safety - /// - /// * Both `start` and `end` must be valid for reads. - /// * Both `start` and `end` must point to an initialized value. - /// * Both `start` and `end` must point to the same allocated object and - /// must either be in bounds or at most one byte past the end of the - /// allocated object. - /// * Both `start` and `end` must be _derived from_ a pointer to the same - /// object. - /// * The distance between `start` and `end` must not overflow `isize`. - /// * The distance being in bounds must not rely on "wrapping around" the - /// address space. - /// - /// Note that callers may pass a pair of pointers such that `start >= end`. - /// In that case, `None` will always be returned. - #[inline] - pub unsafe fn rfind_raw( - &self, - start: *const u8, - end: *const u8, - ) -> Option<*const u8> { - if start >= end { - return None; - } - let confirm = |b| self.confirm(b); - let len = end.distance(start); - if len < USIZE_BYTES { - return generic::rev_byte_by_byte(start, end, confirm); - } - - let chunk = end.sub(USIZE_BYTES).cast::().read_unaligned(); - if self.has_needle(chunk) { - return generic::rev_byte_by_byte(start, end, confirm); - } - - let mut cur = end.sub(end.as_usize() & USIZE_ALIGN); - debug_assert!(start <= cur && cur <= end); - if len <= One::LOOP_BYTES { - return generic::rev_byte_by_byte(start, cur, confirm); - } - while cur >= start.add(One::LOOP_BYTES) { - debug_assert_eq!(0, cur.as_usize() % USIZE_BYTES); - - let a = cur.sub(2 * USIZE_BYTES).cast::().read(); - let b = cur.sub(1 * USIZE_BYTES).cast::().read(); - if self.has_needle(a) || self.has_needle(b) { - break; - } - cur = cur.sub(One::LOOP_BYTES); - } - generic::rev_byte_by_byte(start, cur, confirm) - } - - /// Counts all occurrences of this byte in the given haystack represented - /// by raw pointers. - /// - /// This routine is useful if you're already using raw pointers and would - /// like to avoid converting back to a slice before executing a search. - /// - /// # Safety - /// - /// * Both `start` and `end` must be valid for reads. - /// * Both `start` and `end` must point to an initialized value. - /// * Both `start` and `end` must point to the same allocated object and - /// must either be in bounds or at most one byte past the end of the - /// allocated object. - /// * Both `start` and `end` must be _derived from_ a pointer to the same - /// object. - /// * The distance between `start` and `end` must not overflow `isize`. - /// * The distance being in bounds must not rely on "wrapping around" the - /// address space. - /// - /// Note that callers may pass a pair of pointers such that `start >= end`. - /// In that case, `0` will always be returned. - #[inline] - pub unsafe fn count_raw(&self, start: *const u8, end: *const u8) -> usize { - if start >= end { - return 0; - } - // Sadly I couldn't get the SWAR approach to work here, so we just do - // one byte at a time for now. PRs to improve this are welcome. - let mut ptr = start; - let mut count = 0; - while ptr < end { - count += (ptr.read() == self.s1) as usize; - ptr = ptr.offset(1); - } - count - } - - /// Returns an iterator over all occurrences of the needle byte in the - /// given haystack. - /// - /// The iterator returned implements `DoubleEndedIterator`. This means it - /// can also be used to find occurrences in reverse order. - pub fn iter<'a, 'h>(&'a self, haystack: &'h [u8]) -> OneIter<'a, 'h> { - OneIter { searcher: self, it: generic::Iter::new(haystack) } - } - - #[inline(always)] - fn has_needle(&self, chunk: usize) -> bool { - has_zero_byte(self.v1 ^ chunk) - } - - #[inline(always)] - fn confirm(&self, haystack_byte: u8) -> bool { - self.s1 == haystack_byte - } -} - -/// An iterator over all occurrences of a single byte in a haystack. -/// -/// This iterator implements `DoubleEndedIterator`, which means it can also be -/// used to find occurrences in reverse order. -/// -/// This iterator is created by the [`One::iter`] method. -/// -/// The lifetime parameters are as follows: -/// -/// * `'a` refers to the lifetime of the underlying [`One`] searcher. -/// * `'h` refers to the lifetime of the haystack being searched. -#[derive(Clone, Debug)] -pub struct OneIter<'a, 'h> { - /// The underlying memchr searcher. - searcher: &'a One, - /// Generic iterator implementation. - it: generic::Iter<'h>, -} - -impl<'a, 'h> Iterator for OneIter<'a, 'h> { - type Item = usize; - - #[inline] - fn next(&mut self) -> Option { - // SAFETY: We rely on the generic iterator to provide valid start - // and end pointers, but we guarantee that any pointer returned by - // 'find_raw' falls within the bounds of the start and end pointer. - unsafe { self.it.next(|s, e| self.searcher.find_raw(s, e)) } - } - - #[inline] - fn count(self) -> usize { - self.it.count(|s, e| { - // SAFETY: We rely on our generic iterator to return valid start - // and end pointers. - unsafe { self.searcher.count_raw(s, e) } - }) - } - - #[inline] - fn size_hint(&self) -> (usize, Option) { - self.it.size_hint() - } -} - -impl<'a, 'h> DoubleEndedIterator for OneIter<'a, 'h> { - #[inline] - fn next_back(&mut self) -> Option { - // SAFETY: We rely on the generic iterator to provide valid start - // and end pointers, but we guarantee that any pointer returned by - // 'rfind_raw' falls within the bounds of the start and end pointer. - unsafe { self.it.next_back(|s, e| self.searcher.rfind_raw(s, e)) } - } -} - -/// Finds all occurrences of two bytes in a haystack. -/// -/// That is, this reports matches of one of two possible bytes. For example, -/// searching for `a` or `b` in `afoobar` would report matches at offsets `0`, -/// `4` and `5`. -#[derive(Clone, Copy, Debug)] -pub struct Two { - s1: u8, - s2: u8, - v1: usize, - v2: usize, -} - -impl Two { - /// Create a new searcher that finds occurrences of the two needle bytes - /// given. - #[inline] - pub fn new(needle1: u8, needle2: u8) -> Two { - Two { - s1: needle1, - s2: needle2, - v1: splat(needle1), - v2: splat(needle2), - } - } - - /// A test-only routine so that we can bundle a bunch of quickcheck - /// properties into a single macro. Basically, this provides a constructor - /// that makes it identical to most other memchr implementations, which - /// have fallible constructors. - #[cfg(test)] - pub(crate) fn try_new(needle1: u8, needle2: u8) -> Option { - Some(Two::new(needle1, needle2)) - } - - /// Return the first occurrence of one of the needle bytes in the given - /// haystack. If no such occurrence exists, then `None` is returned. - /// - /// The occurrence is reported as an offset into `haystack`. Its maximum - /// value for a non-empty haystack is `haystack.len() - 1`. - #[inline] - pub fn find(&self, haystack: &[u8]) -> Option { - // SAFETY: `find_raw` guarantees that if a pointer is returned, it - // falls within the bounds of the start and end pointers. - unsafe { - generic::search_slice_with_raw(haystack, |s, e| { - self.find_raw(s, e) - }) - } - } - - /// Return the last occurrence of one of the needle bytes in the given - /// haystack. If no such occurrence exists, then `None` is returned. - /// - /// The occurrence is reported as an offset into `haystack`. Its maximum - /// value for a non-empty haystack is `haystack.len() - 1`. - #[inline] - pub fn rfind(&self, haystack: &[u8]) -> Option { - // SAFETY: `find_raw` guarantees that if a pointer is returned, it - // falls within the bounds of the start and end pointers. - unsafe { - generic::search_slice_with_raw(haystack, |s, e| { - self.rfind_raw(s, e) - }) - } - } - - /// Like `find`, but accepts and returns raw pointers. - /// - /// When a match is found, the pointer returned is guaranteed to be - /// `>= start` and `< end`. - /// - /// This routine is useful if you're already using raw pointers and would - /// like to avoid converting back to a slice before executing a search. - /// - /// # Safety - /// - /// * Both `start` and `end` must be valid for reads. - /// * Both `start` and `end` must point to an initialized value. - /// * Both `start` and `end` must point to the same allocated object and - /// must either be in bounds or at most one byte past the end of the - /// allocated object. - /// * Both `start` and `end` must be _derived from_ a pointer to the same - /// object. - /// * The distance between `start` and `end` must not overflow `isize`. - /// * The distance being in bounds must not rely on "wrapping around" the - /// address space. - /// - /// Note that callers may pass a pair of pointers such that `start >= end`. - /// In that case, `None` will always be returned. - #[inline] - pub unsafe fn find_raw( - &self, - start: *const u8, - end: *const u8, - ) -> Option<*const u8> { - if start >= end { - return None; - } - let confirm = |b| self.confirm(b); - let len = end.distance(start); - if len < USIZE_BYTES { - return generic::fwd_byte_by_byte(start, end, confirm); - } - - // The start of the search may not be aligned to `*const usize`, - // so we do an unaligned load here. - let chunk = start.cast::().read_unaligned(); - if self.has_needle(chunk) { - return generic::fwd_byte_by_byte(start, end, confirm); - } - - // And now we start our search at a guaranteed aligned position. - // The first iteration of the loop below will overlap with the the - // unaligned chunk above in cases where the search starts at an - // unaligned offset, but that's okay as we're only here if that - // above didn't find a match. - let mut cur = - start.add(USIZE_BYTES - (start.as_usize() & USIZE_ALIGN)); - debug_assert!(cur > start); - debug_assert!(end.sub(USIZE_BYTES) >= start); - while cur <= end.sub(USIZE_BYTES) { - debug_assert_eq!(0, cur.as_usize() % USIZE_BYTES); - - let chunk = cur.cast::().read(); - if self.has_needle(chunk) { - break; - } - cur = cur.add(USIZE_BYTES); - } - generic::fwd_byte_by_byte(cur, end, confirm) - } - - /// Like `rfind`, but accepts and returns raw pointers. - /// - /// When a match is found, the pointer returned is guaranteed to be - /// `>= start` and `< end`. - /// - /// This routine is useful if you're already using raw pointers and would - /// like to avoid converting back to a slice before executing a search. - /// - /// # Safety - /// - /// * Both `start` and `end` must be valid for reads. - /// * Both `start` and `end` must point to an initialized value. - /// * Both `start` and `end` must point to the same allocated object and - /// must either be in bounds or at most one byte past the end of the - /// allocated object. - /// * Both `start` and `end` must be _derived from_ a pointer to the same - /// object. - /// * The distance between `start` and `end` must not overflow `isize`. - /// * The distance being in bounds must not rely on "wrapping around" the - /// address space. - /// - /// Note that callers may pass a pair of pointers such that `start >= end`. - /// In that case, `None` will always be returned. - #[inline] - pub unsafe fn rfind_raw( - &self, - start: *const u8, - end: *const u8, - ) -> Option<*const u8> { - if start >= end { - return None; - } - let confirm = |b| self.confirm(b); - let len = end.distance(start); - if len < USIZE_BYTES { - return generic::rev_byte_by_byte(start, end, confirm); - } - - let chunk = end.sub(USIZE_BYTES).cast::().read_unaligned(); - if self.has_needle(chunk) { - return generic::rev_byte_by_byte(start, end, confirm); - } - - let mut cur = end.sub(end.as_usize() & USIZE_ALIGN); - debug_assert!(start <= cur && cur <= end); - while cur >= start.add(USIZE_BYTES) { - debug_assert_eq!(0, cur.as_usize() % USIZE_BYTES); - - let chunk = cur.sub(USIZE_BYTES).cast::().read(); - if self.has_needle(chunk) { - break; - } - cur = cur.sub(USIZE_BYTES); - } - generic::rev_byte_by_byte(start, cur, confirm) - } - - /// Returns an iterator over all occurrences of one of the needle bytes in - /// the given haystack. - /// - /// The iterator returned implements `DoubleEndedIterator`. This means it - /// can also be used to find occurrences in reverse order. - pub fn iter<'a, 'h>(&'a self, haystack: &'h [u8]) -> TwoIter<'a, 'h> { - TwoIter { searcher: self, it: generic::Iter::new(haystack) } - } - - #[inline(always)] - fn has_needle(&self, chunk: usize) -> bool { - has_zero_byte(self.v1 ^ chunk) || has_zero_byte(self.v2 ^ chunk) - } - - #[inline(always)] - fn confirm(&self, haystack_byte: u8) -> bool { - self.s1 == haystack_byte || self.s2 == haystack_byte - } -} - -/// An iterator over all occurrences of two possible bytes in a haystack. -/// -/// This iterator implements `DoubleEndedIterator`, which means it can also be -/// used to find occurrences in reverse order. -/// -/// This iterator is created by the [`Two::iter`] method. -/// -/// The lifetime parameters are as follows: -/// -/// * `'a` refers to the lifetime of the underlying [`Two`] searcher. -/// * `'h` refers to the lifetime of the haystack being searched. -#[derive(Clone, Debug)] -pub struct TwoIter<'a, 'h> { - /// The underlying memchr searcher. - searcher: &'a Two, - /// Generic iterator implementation. - it: generic::Iter<'h>, -} - -impl<'a, 'h> Iterator for TwoIter<'a, 'h> { - type Item = usize; - - #[inline] - fn next(&mut self) -> Option { - // SAFETY: We rely on the generic iterator to provide valid start - // and end pointers, but we guarantee that any pointer returned by - // 'find_raw' falls within the bounds of the start and end pointer. - unsafe { self.it.next(|s, e| self.searcher.find_raw(s, e)) } - } - - #[inline] - fn size_hint(&self) -> (usize, Option) { - self.it.size_hint() - } -} - -impl<'a, 'h> DoubleEndedIterator for TwoIter<'a, 'h> { - #[inline] - fn next_back(&mut self) -> Option { - // SAFETY: We rely on the generic iterator to provide valid start - // and end pointers, but we guarantee that any pointer returned by - // 'rfind_raw' falls within the bounds of the start and end pointer. - unsafe { self.it.next_back(|s, e| self.searcher.rfind_raw(s, e)) } - } -} - -/// Finds all occurrences of three bytes in a haystack. -/// -/// That is, this reports matches of one of three possible bytes. For example, -/// searching for `a`, `b` or `o` in `afoobar` would report matches at offsets -/// `0`, `2`, `3`, `4` and `5`. -#[derive(Clone, Copy, Debug)] -pub struct Three { - s1: u8, - s2: u8, - s3: u8, - v1: usize, - v2: usize, - v3: usize, -} - -impl Three { - /// Create a new searcher that finds occurrences of the three needle bytes - /// given. - #[inline] - pub fn new(needle1: u8, needle2: u8, needle3: u8) -> Three { - Three { - s1: needle1, - s2: needle2, - s3: needle3, - v1: splat(needle1), - v2: splat(needle2), - v3: splat(needle3), - } - } - - /// A test-only routine so that we can bundle a bunch of quickcheck - /// properties into a single macro. Basically, this provides a constructor - /// that makes it identical to most other memchr implementations, which - /// have fallible constructors. - #[cfg(test)] - pub(crate) fn try_new( - needle1: u8, - needle2: u8, - needle3: u8, - ) -> Option { - Some(Three::new(needle1, needle2, needle3)) - } - - /// Return the first occurrence of one of the needle bytes in the given - /// haystack. If no such occurrence exists, then `None` is returned. - /// - /// The occurrence is reported as an offset into `haystack`. Its maximum - /// value for a non-empty haystack is `haystack.len() - 1`. - #[inline] - pub fn find(&self, haystack: &[u8]) -> Option { - // SAFETY: `find_raw` guarantees that if a pointer is returned, it - // falls within the bounds of the start and end pointers. - unsafe { - generic::search_slice_with_raw(haystack, |s, e| { - self.find_raw(s, e) - }) - } - } - - /// Return the last occurrence of one of the needle bytes in the given - /// haystack. If no such occurrence exists, then `None` is returned. - /// - /// The occurrence is reported as an offset into `haystack`. Its maximum - /// value for a non-empty haystack is `haystack.len() - 1`. - #[inline] - pub fn rfind(&self, haystack: &[u8]) -> Option { - // SAFETY: `find_raw` guarantees that if a pointer is returned, it - // falls within the bounds of the start and end pointers. - unsafe { - generic::search_slice_with_raw(haystack, |s, e| { - self.rfind_raw(s, e) - }) - } - } - - /// Like `find`, but accepts and returns raw pointers. - /// - /// When a match is found, the pointer returned is guaranteed to be - /// `>= start` and `< end`. - /// - /// This routine is useful if you're already using raw pointers and would - /// like to avoid converting back to a slice before executing a search. - /// - /// # Safety - /// - /// * Both `start` and `end` must be valid for reads. - /// * Both `start` and `end` must point to an initialized value. - /// * Both `start` and `end` must point to the same allocated object and - /// must either be in bounds or at most one byte past the end of the - /// allocated object. - /// * Both `start` and `end` must be _derived from_ a pointer to the same - /// object. - /// * The distance between `start` and `end` must not overflow `isize`. - /// * The distance being in bounds must not rely on "wrapping around" the - /// address space. - /// - /// Note that callers may pass a pair of pointers such that `start >= end`. - /// In that case, `None` will always be returned. - #[inline] - pub unsafe fn find_raw( - &self, - start: *const u8, - end: *const u8, - ) -> Option<*const u8> { - if start >= end { - return None; - } - let confirm = |b| self.confirm(b); - let len = end.distance(start); - if len < USIZE_BYTES { - return generic::fwd_byte_by_byte(start, end, confirm); - } - - // The start of the search may not be aligned to `*const usize`, - // so we do an unaligned load here. - let chunk = start.cast::().read_unaligned(); - if self.has_needle(chunk) { - return generic::fwd_byte_by_byte(start, end, confirm); - } - - // And now we start our search at a guaranteed aligned position. - // The first iteration of the loop below will overlap with the the - // unaligned chunk above in cases where the search starts at an - // unaligned offset, but that's okay as we're only here if that - // above didn't find a match. - let mut cur = - start.add(USIZE_BYTES - (start.as_usize() & USIZE_ALIGN)); - debug_assert!(cur > start); - debug_assert!(end.sub(USIZE_BYTES) >= start); - while cur <= end.sub(USIZE_BYTES) { - debug_assert_eq!(0, cur.as_usize() % USIZE_BYTES); - - let chunk = cur.cast::().read(); - if self.has_needle(chunk) { - break; - } - cur = cur.add(USIZE_BYTES); - } - generic::fwd_byte_by_byte(cur, end, confirm) - } - - /// Like `rfind`, but accepts and returns raw pointers. - /// - /// When a match is found, the pointer returned is guaranteed to be - /// `>= start` and `< end`. - /// - /// This routine is useful if you're already using raw pointers and would - /// like to avoid converting back to a slice before executing a search. - /// - /// # Safety - /// - /// * Both `start` and `end` must be valid for reads. - /// * Both `start` and `end` must point to an initialized value. - /// * Both `start` and `end` must point to the same allocated object and - /// must either be in bounds or at most one byte past the end of the - /// allocated object. - /// * Both `start` and `end` must be _derived from_ a pointer to the same - /// object. - /// * The distance between `start` and `end` must not overflow `isize`. - /// * The distance being in bounds must not rely on "wrapping around" the - /// address space. - /// - /// Note that callers may pass a pair of pointers such that `start >= end`. - /// In that case, `None` will always be returned. - #[inline] - pub unsafe fn rfind_raw( - &self, - start: *const u8, - end: *const u8, - ) -> Option<*const u8> { - if start >= end { - return None; - } - let confirm = |b| self.confirm(b); - let len = end.distance(start); - if len < USIZE_BYTES { - return generic::rev_byte_by_byte(start, end, confirm); - } - - let chunk = end.sub(USIZE_BYTES).cast::().read_unaligned(); - if self.has_needle(chunk) { - return generic::rev_byte_by_byte(start, end, confirm); - } - - let mut cur = end.sub(end.as_usize() & USIZE_ALIGN); - debug_assert!(start <= cur && cur <= end); - while cur >= start.add(USIZE_BYTES) { - debug_assert_eq!(0, cur.as_usize() % USIZE_BYTES); - - let chunk = cur.sub(USIZE_BYTES).cast::().read(); - if self.has_needle(chunk) { - break; - } - cur = cur.sub(USIZE_BYTES); - } - generic::rev_byte_by_byte(start, cur, confirm) - } - - /// Returns an iterator over all occurrences of one of the needle bytes in - /// the given haystack. - /// - /// The iterator returned implements `DoubleEndedIterator`. This means it - /// can also be used to find occurrences in reverse order. - pub fn iter<'a, 'h>(&'a self, haystack: &'h [u8]) -> ThreeIter<'a, 'h> { - ThreeIter { searcher: self, it: generic::Iter::new(haystack) } - } - - #[inline(always)] - fn has_needle(&self, chunk: usize) -> bool { - has_zero_byte(self.v1 ^ chunk) - || has_zero_byte(self.v2 ^ chunk) - || has_zero_byte(self.v3 ^ chunk) - } - - #[inline(always)] - fn confirm(&self, haystack_byte: u8) -> bool { - self.s1 == haystack_byte - || self.s2 == haystack_byte - || self.s3 == haystack_byte - } -} - -/// An iterator over all occurrences of three possible bytes in a haystack. -/// -/// This iterator implements `DoubleEndedIterator`, which means it can also be -/// used to find occurrences in reverse order. -/// -/// This iterator is created by the [`Three::iter`] method. -/// -/// The lifetime parameters are as follows: -/// -/// * `'a` refers to the lifetime of the underlying [`Three`] searcher. -/// * `'h` refers to the lifetime of the haystack being searched. -#[derive(Clone, Debug)] -pub struct ThreeIter<'a, 'h> { - /// The underlying memchr searcher. - searcher: &'a Three, - /// Generic iterator implementation. - it: generic::Iter<'h>, -} - -impl<'a, 'h> Iterator for ThreeIter<'a, 'h> { - type Item = usize; - - #[inline] - fn next(&mut self) -> Option { - // SAFETY: We rely on the generic iterator to provide valid start - // and end pointers, but we guarantee that any pointer returned by - // 'find_raw' falls within the bounds of the start and end pointer. - unsafe { self.it.next(|s, e| self.searcher.find_raw(s, e)) } - } - - #[inline] - fn size_hint(&self) -> (usize, Option) { - self.it.size_hint() - } -} - -impl<'a, 'h> DoubleEndedIterator for ThreeIter<'a, 'h> { - #[inline] - fn next_back(&mut self) -> Option { - // SAFETY: We rely on the generic iterator to provide valid start - // and end pointers, but we guarantee that any pointer returned by - // 'rfind_raw' falls within the bounds of the start and end pointer. - unsafe { self.it.next_back(|s, e| self.searcher.rfind_raw(s, e)) } - } -} - -/// Return `true` if `x` contains any zero byte. -/// -/// That is, this routine treats `x` as a register of 8-bit lanes and returns -/// true when any of those lanes is `0`. -/// -/// From "Matters Computational" by J. Arndt. -#[inline(always)] -fn has_zero_byte(x: usize) -> bool { - // "The idea is to subtract one from each of the bytes and then look for - // bytes where the borrow propagated all the way to the most significant - // bit." - const LO: usize = splat(0x01); - const HI: usize = splat(0x80); - - (x.wrapping_sub(LO) & !x & HI) != 0 -} - -/// Repeat the given byte into a word size number. That is, every 8 bits -/// is equivalent to the given byte. For example, if `b` is `\x4E` or -/// `01001110` in binary, then the returned value on a 32-bit system would be: -/// `01001110_01001110_01001110_01001110`. -#[inline(always)] -const fn splat(b: u8) -> usize { - // TODO: use `usize::from` once it can be used in const context. - (b as usize) * (usize::MAX / 255) -} - -#[cfg(test)] -mod tests { - use super::*; - - define_memchr_quickcheck!(super, try_new); - - #[test] - fn forward_one() { - crate::tests::memchr::Runner::new(1).forward_iter( - |haystack, needles| { - Some(One::new(needles[0]).iter(haystack).collect()) - }, - ) - } - - #[test] - fn reverse_one() { - crate::tests::memchr::Runner::new(1).reverse_iter( - |haystack, needles| { - Some(One::new(needles[0]).iter(haystack).rev().collect()) - }, - ) - } - - #[test] - fn count_one() { - crate::tests::memchr::Runner::new(1).count_iter(|haystack, needles| { - Some(One::new(needles[0]).iter(haystack).count()) - }) - } - - #[test] - fn forward_two() { - crate::tests::memchr::Runner::new(2).forward_iter( - |haystack, needles| { - let n1 = needles.get(0).copied()?; - let n2 = needles.get(1).copied()?; - Some(Two::new(n1, n2).iter(haystack).collect()) - }, - ) - } - - #[test] - fn reverse_two() { - crate::tests::memchr::Runner::new(2).reverse_iter( - |haystack, needles| { - let n1 = needles.get(0).copied()?; - let n2 = needles.get(1).copied()?; - Some(Two::new(n1, n2).iter(haystack).rev().collect()) - }, - ) - } - - #[test] - fn forward_three() { - crate::tests::memchr::Runner::new(3).forward_iter( - |haystack, needles| { - let n1 = needles.get(0).copied()?; - let n2 = needles.get(1).copied()?; - let n3 = needles.get(2).copied()?; - Some(Three::new(n1, n2, n3).iter(haystack).collect()) - }, - ) - } - - #[test] - fn reverse_three() { - crate::tests::memchr::Runner::new(3).reverse_iter( - |haystack, needles| { - let n1 = needles.get(0).copied()?; - let n2 = needles.get(1).copied()?; - let n3 = needles.get(2).copied()?; - Some(Three::new(n1, n2, n3).iter(haystack).rev().collect()) - }, - ) - } - - // This was found by quickcheck in the course of refactoring this crate - // after memchr 2.5.0. - #[test] - fn regression_double_ended_iterator() { - let finder = One::new(b'a'); - let haystack = "a"; - let mut it = finder.iter(haystack.as_bytes()); - assert_eq!(Some(0), it.next()); - assert_eq!(None, it.next_back()); - } - - // This regression test was caught by ripgrep's test suite on i686 when - // upgrading to memchr 2.6. Namely, something about the \x0B bytes here - // screws with the SWAR counting approach I was using. This regression test - // prompted me to remove the SWAR counting approach and just replace it - // with a byte-at-a-time loop. - #[test] - fn regression_count_new_lines() { - let haystack = "01234567\x0b\n\x0b\n\x0b\n\x0b\nx"; - let count = One::new(b'\n').count(haystack.as_bytes()); - assert_eq!(4, count); - } -} diff -Nru temporalio-1.3.0/vendor/memchr/src/arch/all/mod.rs temporalio-1.3.0/vendor/memchr/src/arch/all/mod.rs --- temporalio-1.3.0/vendor/memchr/src/arch/all/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/arch/all/mod.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,236 +0,0 @@ -/*! -Contains architecture independent routines. - -These routines are often used as a "fallback" implementation when the more -specialized architecture dependent routines are unavailable. -*/ - -pub mod memchr; -pub mod packedpair; -pub mod rabinkarp; -#[cfg(feature = "alloc")] -pub mod shiftor; -pub mod twoway; - -/// Returns true if and only if `needle` is a prefix of `haystack`. -/// -/// This uses a latency optimized variant of `memcmp` internally which *might* -/// make this faster for very short strings. -/// -/// # Inlining -/// -/// This routine is marked `inline(always)`. If you want to call this function -/// in a way that is not always inlined, you'll need to wrap a call to it in -/// another function that is marked as `inline(never)` or just `inline`. -#[inline(always)] -pub fn is_prefix(haystack: &[u8], needle: &[u8]) -> bool { - needle.len() <= haystack.len() - && is_equal(&haystack[..needle.len()], needle) -} - -/// Returns true if and only if `needle` is a suffix of `haystack`. -/// -/// This uses a latency optimized variant of `memcmp` internally which *might* -/// make this faster for very short strings. -/// -/// # Inlining -/// -/// This routine is marked `inline(always)`. If you want to call this function -/// in a way that is not always inlined, you'll need to wrap a call to it in -/// another function that is marked as `inline(never)` or just `inline`. -#[inline(always)] -pub fn is_suffix(haystack: &[u8], needle: &[u8]) -> bool { - needle.len() <= haystack.len() - && is_equal(&haystack[haystack.len() - needle.len()..], needle) -} - -/// Compare corresponding bytes in `x` and `y` for equality. -/// -/// That is, this returns true if and only if `x.len() == y.len()` and -/// `x[i] == y[i]` for all `0 <= i < x.len()`. -/// -/// # Inlining -/// -/// This routine is marked `inline(always)`. If you want to call this function -/// in a way that is not always inlined, you'll need to wrap a call to it in -/// another function that is marked as `inline(never)` or just `inline`. -/// -/// # Motivation -/// -/// Why not use slice equality instead? Well, slice equality usually results in -/// a call out to the current platform's `libc` which might not be inlineable -/// or have other overhead. This routine isn't guaranteed to be a win, but it -/// might be in some cases. -#[inline(always)] -pub fn is_equal(x: &[u8], y: &[u8]) -> bool { - if x.len() != y.len() { - return false; - } - // SAFETY: Our pointers are derived directly from borrowed slices which - // uphold all of our safety guarantees except for length. We account for - // length with the check above. - unsafe { is_equal_raw(x.as_ptr(), y.as_ptr(), x.len()) } -} - -/// Compare `n` bytes at the given pointers for equality. -/// -/// This returns true if and only if `*x.add(i) == *y.add(i)` for all -/// `0 <= i < n`. -/// -/// # Inlining -/// -/// This routine is marked `inline(always)`. If you want to call this function -/// in a way that is not always inlined, you'll need to wrap a call to it in -/// another function that is marked as `inline(never)` or just `inline`. -/// -/// # Motivation -/// -/// Why not use slice equality instead? Well, slice equality usually results in -/// a call out to the current platform's `libc` which might not be inlineable -/// or have other overhead. This routine isn't guaranteed to be a win, but it -/// might be in some cases. -/// -/// # Safety -/// -/// * Both `x` and `y` must be valid for reads of up to `n` bytes. -/// * Both `x` and `y` must point to an initialized value. -/// * Both `x` and `y` must each point to an allocated object and -/// must either be in bounds or at most one byte past the end of the -/// allocated object. `x` and `y` do not need to point to the same allocated -/// object, but they may. -/// * Both `x` and `y` must be _derived from_ a pointer to their respective -/// allocated objects. -/// * The distance between `x` and `x+n` must not overflow `isize`. Similarly -/// for `y` and `y+n`. -/// * The distance being in bounds must not rely on "wrapping around" the -/// address space. -#[inline(always)] -pub unsafe fn is_equal_raw( - mut x: *const u8, - mut y: *const u8, - n: usize, -) -> bool { - // If we don't have enough bytes to do 4-byte at a time loads, then - // handle each possible length specially. Note that I used to have a - // byte-at-a-time loop here and that turned out to be quite a bit slower - // for the memmem/pathological/defeat-simple-vector-alphabet benchmark. - if n < 4 { - return match n { - 0 => true, - 1 => x.read() == y.read(), - 2 => { - x.cast::().read_unaligned() - == y.cast::().read_unaligned() - } - // I also tried copy_nonoverlapping here and it looks like the - // codegen is the same. - 3 => x.cast::<[u8; 3]>().read() == y.cast::<[u8; 3]>().read(), - _ => unreachable!(), - }; - } - // When we have 4 or more bytes to compare, then proceed in chunks of 4 at - // a time using unaligned loads. - // - // Also, why do 4 byte loads instead of, say, 8 byte loads? The reason is - // that this particular version of memcmp is likely to be called with tiny - // needles. That means that if we do 8 byte loads, then a higher proportion - // of memcmp calls will use the slower variant above. With that said, this - // is a hypothesis and is only loosely supported by benchmarks. There's - // likely some improvement that could be made here. The main thing here - // though is to optimize for latency, not throughput. - - // SAFETY: The caller is responsible for ensuring the pointers we get are - // valid and readable for at least `n` bytes. We also do unaligned loads, - // so there's no need to ensure we're aligned. (This is justified by this - // routine being specifically for short strings.) - let xend = x.add(n.wrapping_sub(4)); - let yend = y.add(n.wrapping_sub(4)); - while x < xend { - let vx = x.cast::().read_unaligned(); - let vy = y.cast::().read_unaligned(); - if vx != vy { - return false; - } - x = x.add(4); - y = y.add(4); - } - let vx = xend.cast::().read_unaligned(); - let vy = yend.cast::().read_unaligned(); - vx == vy -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn equals_different_lengths() { - assert!(!is_equal(b"", b"a")); - assert!(!is_equal(b"a", b"")); - assert!(!is_equal(b"ab", b"a")); - assert!(!is_equal(b"a", b"ab")); - } - - #[test] - fn equals_mismatch() { - let one_mismatch = [ - (&b"a"[..], &b"x"[..]), - (&b"ab"[..], &b"ax"[..]), - (&b"abc"[..], &b"abx"[..]), - (&b"abcd"[..], &b"abcx"[..]), - (&b"abcde"[..], &b"abcdx"[..]), - (&b"abcdef"[..], &b"abcdex"[..]), - (&b"abcdefg"[..], &b"abcdefx"[..]), - (&b"abcdefgh"[..], &b"abcdefgx"[..]), - (&b"abcdefghi"[..], &b"abcdefghx"[..]), - (&b"abcdefghij"[..], &b"abcdefghix"[..]), - (&b"abcdefghijk"[..], &b"abcdefghijx"[..]), - (&b"abcdefghijkl"[..], &b"abcdefghijkx"[..]), - (&b"abcdefghijklm"[..], &b"abcdefghijklx"[..]), - (&b"abcdefghijklmn"[..], &b"abcdefghijklmx"[..]), - ]; - for (x, y) in one_mismatch { - assert_eq!(x.len(), y.len(), "lengths should match"); - assert!(!is_equal(x, y)); - assert!(!is_equal(y, x)); - } - } - - #[test] - fn equals_yes() { - assert!(is_equal(b"", b"")); - assert!(is_equal(b"a", b"a")); - assert!(is_equal(b"ab", b"ab")); - assert!(is_equal(b"abc", b"abc")); - assert!(is_equal(b"abcd", b"abcd")); - assert!(is_equal(b"abcde", b"abcde")); - assert!(is_equal(b"abcdef", b"abcdef")); - assert!(is_equal(b"abcdefg", b"abcdefg")); - assert!(is_equal(b"abcdefgh", b"abcdefgh")); - assert!(is_equal(b"abcdefghi", b"abcdefghi")); - } - - #[test] - fn prefix() { - assert!(is_prefix(b"", b"")); - assert!(is_prefix(b"a", b"")); - assert!(is_prefix(b"ab", b"")); - assert!(is_prefix(b"foo", b"foo")); - assert!(is_prefix(b"foobar", b"foo")); - - assert!(!is_prefix(b"foo", b"fob")); - assert!(!is_prefix(b"foobar", b"fob")); - } - - #[test] - fn suffix() { - assert!(is_suffix(b"", b"")); - assert!(is_suffix(b"a", b"")); - assert!(is_suffix(b"ab", b"")); - assert!(is_suffix(b"foo", b"foo")); - assert!(is_suffix(b"foobar", b"bar")); - - assert!(!is_suffix(b"foo", b"goo")); - assert!(!is_suffix(b"foobar", b"gar")); - } -} diff -Nru temporalio-1.3.0/vendor/memchr/src/arch/all/packedpair/default_rank.rs temporalio-1.3.0/vendor/memchr/src/arch/all/packedpair/default_rank.rs --- temporalio-1.3.0/vendor/memchr/src/arch/all/packedpair/default_rank.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/arch/all/packedpair/default_rank.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,258 +0,0 @@ -pub(crate) const RANK: [u8; 256] = [ - 55, // '\x00' - 52, // '\x01' - 51, // '\x02' - 50, // '\x03' - 49, // '\x04' - 48, // '\x05' - 47, // '\x06' - 46, // '\x07' - 45, // '\x08' - 103, // '\t' - 242, // '\n' - 66, // '\x0b' - 67, // '\x0c' - 229, // '\r' - 44, // '\x0e' - 43, // '\x0f' - 42, // '\x10' - 41, // '\x11' - 40, // '\x12' - 39, // '\x13' - 38, // '\x14' - 37, // '\x15' - 36, // '\x16' - 35, // '\x17' - 34, // '\x18' - 33, // '\x19' - 56, // '\x1a' - 32, // '\x1b' - 31, // '\x1c' - 30, // '\x1d' - 29, // '\x1e' - 28, // '\x1f' - 255, // ' ' - 148, // '!' - 164, // '"' - 149, // '#' - 136, // '$' - 160, // '%' - 155, // '&' - 173, // "'" - 221, // '(' - 222, // ')' - 134, // '*' - 122, // '+' - 232, // ',' - 202, // '-' - 215, // '.' - 224, // '/' - 208, // '0' - 220, // '1' - 204, // '2' - 187, // '3' - 183, // '4' - 179, // '5' - 177, // '6' - 168, // '7' - 178, // '8' - 200, // '9' - 226, // ':' - 195, // ';' - 154, // '<' - 184, // '=' - 174, // '>' - 126, // '?' - 120, // '@' - 191, // 'A' - 157, // 'B' - 194, // 'C' - 170, // 'D' - 189, // 'E' - 162, // 'F' - 161, // 'G' - 150, // 'H' - 193, // 'I' - 142, // 'J' - 137, // 'K' - 171, // 'L' - 176, // 'M' - 185, // 'N' - 167, // 'O' - 186, // 'P' - 112, // 'Q' - 175, // 'R' - 192, // 'S' - 188, // 'T' - 156, // 'U' - 140, // 'V' - 143, // 'W' - 123, // 'X' - 133, // 'Y' - 128, // 'Z' - 147, // '[' - 138, // '\\' - 146, // ']' - 114, // '^' - 223, // '_' - 151, // '`' - 249, // 'a' - 216, // 'b' - 238, // 'c' - 236, // 'd' - 253, // 'e' - 227, // 'f' - 218, // 'g' - 230, // 'h' - 247, // 'i' - 135, // 'j' - 180, // 'k' - 241, // 'l' - 233, // 'm' - 246, // 'n' - 244, // 'o' - 231, // 'p' - 139, // 'q' - 245, // 'r' - 243, // 's' - 251, // 't' - 235, // 'u' - 201, // 'v' - 196, // 'w' - 240, // 'x' - 214, // 'y' - 152, // 'z' - 182, // '{' - 205, // '|' - 181, // '}' - 127, // '~' - 27, // '\x7f' - 212, // '\x80' - 211, // '\x81' - 210, // '\x82' - 213, // '\x83' - 228, // '\x84' - 197, // '\x85' - 169, // '\x86' - 159, // '\x87' - 131, // '\x88' - 172, // '\x89' - 105, // '\x8a' - 80, // '\x8b' - 98, // '\x8c' - 96, // '\x8d' - 97, // '\x8e' - 81, // '\x8f' - 207, // '\x90' - 145, // '\x91' - 116, // '\x92' - 115, // '\x93' - 144, // '\x94' - 130, // '\x95' - 153, // '\x96' - 121, // '\x97' - 107, // '\x98' - 132, // '\x99' - 109, // '\x9a' - 110, // '\x9b' - 124, // '\x9c' - 111, // '\x9d' - 82, // '\x9e' - 108, // '\x9f' - 118, // '\xa0' - 141, // '¡' - 113, // '¢' - 129, // '£' - 119, // '¤' - 125, // 'Â¥' - 165, // '¦' - 117, // '§' - 92, // '¨' - 106, // '©' - 83, // 'ª' - 72, // '«' - 99, // '¬' - 93, // '\xad' - 65, // '®' - 79, // '¯' - 166, // '°' - 237, // '±' - 163, // '²' - 199, // '³' - 190, // '´' - 225, // 'µ' - 209, // '¶' - 203, // '·' - 198, // '¸' - 217, // '¹' - 219, // 'º' - 206, // '»' - 234, // '¼' - 248, // '½' - 158, // '¾' - 239, // '¿' - 255, // 'À' - 255, // 'Ã' - 255, // 'Â' - 255, // 'Ã' - 255, // 'Ä' - 255, // 'Ã…' - 255, // 'Æ' - 255, // 'Ç' - 255, // 'È' - 255, // 'É' - 255, // 'Ê' - 255, // 'Ë' - 255, // 'ÃŒ' - 255, // 'Ã' - 255, // 'ÃŽ' - 255, // 'Ã' - 255, // 'Ã' - 255, // 'Ñ' - 255, // 'Ã’' - 255, // 'Ó' - 255, // 'Ô' - 255, // 'Õ' - 255, // 'Ö' - 255, // '×' - 255, // 'Ø' - 255, // 'Ù' - 255, // 'Ú' - 255, // 'Û' - 255, // 'Ãœ' - 255, // 'Ã' - 255, // 'Þ' - 255, // 'ß' - 255, // 'à' - 255, // 'á' - 255, // 'â' - 255, // 'ã' - 255, // 'ä' - 255, // 'Ã¥' - 255, // 'æ' - 255, // 'ç' - 255, // 'è' - 255, // 'é' - 255, // 'ê' - 255, // 'ë' - 255, // 'ì' - 255, // 'í' - 255, // 'î' - 255, // 'ï' - 255, // 'ð' - 255, // 'ñ' - 255, // 'ò' - 255, // 'ó' - 255, // 'ô' - 255, // 'õ' - 255, // 'ö' - 255, // '÷' - 255, // 'ø' - 255, // 'ù' - 255, // 'ú' - 255, // 'û' - 255, // 'ü' - 255, // 'ý' - 255, // 'þ' - 255, // 'ÿ' -]; diff -Nru temporalio-1.3.0/vendor/memchr/src/arch/all/packedpair/mod.rs temporalio-1.3.0/vendor/memchr/src/arch/all/packedpair/mod.rs --- temporalio-1.3.0/vendor/memchr/src/arch/all/packedpair/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/arch/all/packedpair/mod.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,359 +0,0 @@ -/*! -Provides an architecture independent implementation of the "packed pair" -algorithm. - -The "packed pair" algorithm is based on the [generic SIMD] algorithm. The main -difference is that it (by default) uses a background distribution of byte -frequencies to heuristically select the pair of bytes to search for. Note that -this module provides an architecture independent version that doesn't do as -good of a job keeping the search for candidates inside a SIMD hot path. It -however can be good enough in many circumstances. - -[generic SIMD]: http://0x80.pl/articles/simd-strfind.html#first-and-last -*/ - -use crate::memchr; - -mod default_rank; - -/// An architecture independent "packed pair" finder. -/// -/// This finder picks two bytes that it believes have high predictive power for -/// indicating an overall match of a needle. At search time, it reports offsets -/// where the needle could match based on whether the pair of bytes it chose -/// match. -/// -/// This is architecture independent because it utilizes `memchr` to find the -/// occurrence of one of the bytes in the pair, and then checks whether the -/// second byte matches. If it does, in the case of [`Finder::find_prefilter`], -/// the location at which the needle could match is returned. -/// -/// It is generally preferred to use architecture specific routines for a -/// "packed pair" prefilter, but this can be a useful fallback when the -/// architecture independent routines are unavailable. -#[derive(Clone, Copy, Debug)] -pub struct Finder { - pair: Pair, - byte1: u8, - byte2: u8, -} - -impl Finder { - /// Create a new prefilter that reports possible locations where the given - /// needle matches. - #[inline] - pub fn new(needle: &[u8]) -> Option { - Finder::with_pair(needle, Pair::new(needle)?) - } - - /// Create a new prefilter using the pair given. - /// - /// If the prefilter could not be constructed, then `None` is returned. - /// - /// This constructor permits callers to control precisely which pair of - /// bytes is used as a predicate. - #[inline] - pub fn with_pair(needle: &[u8], pair: Pair) -> Option { - let byte1 = needle[usize::from(pair.index1())]; - let byte2 = needle[usize::from(pair.index2())]; - // Currently this can never fail so we could just return a Finder, - // but it's conceivable this could change. - Some(Finder { pair, byte1, byte2 }) - } - - /// Run this finder on the given haystack as a prefilter. - /// - /// If a candidate match is found, then an offset where the needle *could* - /// begin in the haystack is returned. - #[inline] - pub fn find_prefilter(&self, haystack: &[u8]) -> Option { - let mut i = 0; - let index1 = usize::from(self.pair.index1()); - let index2 = usize::from(self.pair.index2()); - loop { - // Use a fast vectorized implementation to skip to the next - // occurrence of the rarest byte (heuristically chosen) in the - // needle. - i += memchr(self.byte1, &haystack[i..])?; - let found = i; - i += 1; - - // If we can't align our first byte match with the haystack, then a - // match is impossible. - let aligned1 = match found.checked_sub(index1) { - None => continue, - Some(aligned1) => aligned1, - }; - - // Now align the second byte match with the haystack. A mismatch - // means that a match is impossible. - let aligned2 = match aligned1.checked_add(index2) { - None => continue, - Some(aligned_index2) => aligned_index2, - }; - if haystack.get(aligned2).map_or(true, |&b| b != self.byte2) { - continue; - } - - // We've done what we can. There might be a match here. - return Some(aligned1); - } - } - - /// Returns the pair of offsets (into the needle) used to check as a - /// predicate before confirming whether a needle exists at a particular - /// position. - #[inline] - pub fn pair(&self) -> &Pair { - &self.pair - } -} - -/// A pair of byte offsets into a needle to use as a predicate. -/// -/// This pair is used as a predicate to quickly filter out positions in a -/// haystack in which a needle cannot match. In some cases, this pair can even -/// be used in vector algorithms such that the vector algorithm only switches -/// over to scalar code once this pair has been found. -/// -/// A pair of offsets can be used in both substring search implementations and -/// in prefilters. The former will report matches of a needle in a haystack -/// where as the latter will only report possible matches of a needle. -/// -/// The offsets are limited each to a maximum of 255 to keep memory usage low. -/// Moreover, it's rarely advantageous to create a predicate using offsets -/// greater than 255 anyway. -/// -/// The only guarantee enforced on the pair of offsets is that they are not -/// equivalent. It is not necessarily the case that `index1 < index2` for -/// example. By convention, `index1` corresponds to the byte in the needle -/// that is believed to be most the predictive. Note also that because of the -/// requirement that the indices be both valid for the needle used to build -/// the pair and not equal, it follows that a pair can only be constructed for -/// needles with length at least 2. -#[derive(Clone, Copy, Debug)] -pub struct Pair { - index1: u8, - index2: u8, -} - -impl Pair { - /// Create a new pair of offsets from the given needle. - /// - /// If a pair could not be created (for example, if the needle is too - /// short), then `None` is returned. - /// - /// This chooses the pair in the needle that is believed to be as - /// predictive of an overall match of the needle as possible. - #[inline] - pub fn new(needle: &[u8]) -> Option { - Pair::with_ranker(needle, DefaultFrequencyRank) - } - - /// Create a new pair of offsets from the given needle and ranker. - /// - /// This permits the caller to choose a background frequency distribution - /// with which bytes are selected. The idea is to select a pair of bytes - /// that is believed to strongly predict a match in the haystack. This - /// usually means selecting bytes that occur rarely in a haystack. - /// - /// If a pair could not be created (for example, if the needle is too - /// short), then `None` is returned. - #[inline] - pub fn with_ranker( - needle: &[u8], - ranker: R, - ) -> Option { - if needle.len() <= 1 { - return None; - } - // Find the rarest two bytes. We make them distinct indices by - // construction. (The actual byte value may be the same in degenerate - // cases, but that's OK.) - let (mut rare1, mut index1) = (needle[0], 0); - let (mut rare2, mut index2) = (needle[1], 1); - if ranker.rank(rare2) < ranker.rank(rare1) { - core::mem::swap(&mut rare1, &mut rare2); - core::mem::swap(&mut index1, &mut index2); - } - let max = usize::from(core::u8::MAX); - for (i, &b) in needle.iter().enumerate().take(max).skip(2) { - if ranker.rank(b) < ranker.rank(rare1) { - rare2 = rare1; - index2 = index1; - rare1 = b; - index1 = u8::try_from(i).unwrap(); - } else if b != rare1 && ranker.rank(b) < ranker.rank(rare2) { - rare2 = b; - index2 = u8::try_from(i).unwrap(); - } - } - // While not strictly required for how a Pair is normally used, we - // really don't want these to be equivalent. If they were, it would - // reduce the effectiveness of candidate searching using these rare - // bytes by increasing the rate of false positives. - assert_ne!(index1, index2); - Some(Pair { index1, index2 }) - } - - /// Create a new pair using the offsets given for the needle given. - /// - /// This bypasses any sort of heuristic process for choosing the offsets - /// and permits the caller to choose the offsets themselves. - /// - /// Indices are limited to valid `u8` values so that a `Pair` uses less - /// memory. It is not possible to create a `Pair` with offsets bigger than - /// `u8::MAX`. It's likely that such a thing is not needed, but if it is, - /// it's suggested to build your own bespoke algorithm because you're - /// likely working on a very niche case. (File an issue if this suggestion - /// does not make sense to you.) - /// - /// If a pair could not be created (for example, if the needle is too - /// short), then `None` is returned. - #[inline] - pub fn with_indices( - needle: &[u8], - index1: u8, - index2: u8, - ) -> Option { - // While not strictly required for how a Pair is normally used, we - // really don't want these to be equivalent. If they were, it would - // reduce the effectiveness of candidate searching using these rare - // bytes by increasing the rate of false positives. - if index1 == index2 { - return None; - } - // Similarly, invalid indices means the Pair is invalid too. - if usize::from(index1) >= needle.len() { - return None; - } - if usize::from(index2) >= needle.len() { - return None; - } - Some(Pair { index1, index2 }) - } - - /// Returns the first offset of the pair. - #[inline] - pub fn index1(&self) -> u8 { - self.index1 - } - - /// Returns the second offset of the pair. - #[inline] - pub fn index2(&self) -> u8 { - self.index2 - } -} - -/// This trait allows the user to customize the heuristic used to determine the -/// relative frequency of a given byte in the dataset being searched. -/// -/// The use of this trait can have a dramatic impact on performance depending -/// on the type of data being searched. The details of why are explained in the -/// docs of [`crate::memmem::Prefilter`]. To summarize, the core algorithm uses -/// a prefilter to quickly identify candidate matches that are later verified -/// more slowly. This prefilter is implemented in terms of trying to find -/// `rare` bytes at specific offsets that will occur less frequently in the -/// dataset. While the concept of a `rare` byte is similar for most datasets, -/// there are some specific datasets (like binary executables) that have -/// dramatically different byte distributions. For these datasets customizing -/// the byte frequency heuristic can have a massive impact on performance, and -/// might even need to be done at runtime. -/// -/// The default implementation of `HeuristicFrequencyRank` reads from the -/// static frequency table defined in `src/memmem/byte_frequencies.rs`. This -/// is optimal for most inputs, so if you are unsure of the impact of using a -/// custom `HeuristicFrequencyRank` you should probably just use the default. -/// -/// # Example -/// -/// ``` -/// use memchr::{ -/// arch::all::packedpair::HeuristicFrequencyRank, -/// memmem::FinderBuilder, -/// }; -/// -/// /// A byte-frequency table that is good for scanning binary executables. -/// struct Binary; -/// -/// impl HeuristicFrequencyRank for Binary { -/// fn rank(&self, byte: u8) -> u8 { -/// const TABLE: [u8; 256] = [ -/// 255, 128, 61, 43, 50, 41, 27, 28, 57, 15, 21, 13, 24, 17, 17, -/// 89, 58, 16, 11, 7, 14, 23, 7, 6, 24, 9, 6, 5, 9, 4, 7, 16, -/// 68, 11, 9, 6, 88, 7, 4, 4, 23, 9, 4, 8, 8, 5, 10, 4, 30, 11, -/// 9, 24, 11, 5, 5, 5, 19, 11, 6, 17, 9, 9, 6, 8, -/// 48, 58, 11, 14, 53, 40, 9, 9, 254, 35, 3, 6, 52, 23, 6, 6, 27, -/// 4, 7, 11, 14, 13, 10, 11, 11, 5, 2, 10, 16, 12, 6, 19, -/// 19, 20, 5, 14, 16, 31, 19, 7, 14, 20, 4, 4, 19, 8, 18, 20, 24, -/// 1, 25, 19, 58, 29, 10, 5, 15, 20, 2, 2, 9, 4, 3, 5, -/// 51, 11, 4, 53, 23, 39, 6, 4, 13, 81, 4, 186, 5, 67, 3, 2, 15, -/// 0, 0, 1, 3, 2, 0, 0, 5, 0, 0, 0, 2, 0, 0, 0, -/// 12, 2, 1, 1, 3, 1, 1, 1, 6, 1, 2, 1, 3, 1, 1, 2, 9, 1, 1, 0, -/// 2, 2, 4, 4, 11, 6, 7, 3, 6, 9, 4, 5, -/// 46, 18, 8, 18, 17, 3, 8, 20, 16, 10, 3, 7, 175, 4, 6, 7, 13, -/// 3, 7, 3, 3, 1, 3, 3, 10, 3, 1, 5, 2, 0, 1, 2, -/// 16, 3, 5, 1, 6, 1, 1, 2, 58, 20, 3, 14, 12, 2, 1, 3, 16, 3, 5, -/// 8, 3, 1, 8, 6, 17, 6, 5, 3, 8, 6, 13, 175, -/// ]; -/// TABLE[byte as usize] -/// } -/// } -/// // Create a new finder with the custom heuristic. -/// let finder = FinderBuilder::new() -/// .build_forward_with_ranker(Binary, b"\x00\x00\xdd\xdd"); -/// // Find needle with custom heuristic. -/// assert!(finder.find(b"\x00\x00\x00\xdd\xdd").is_some()); -/// ``` -pub trait HeuristicFrequencyRank { - /// Return the heuristic frequency rank of the given byte. A lower rank - /// means the byte is believed to occur less frequently in the haystack. - /// - /// Some uses of this heuristic may treat arbitrary absolute rank values as - /// significant. For example, an implementation detail in this crate may - /// determine that heuristic prefilters are inappropriate if every byte in - /// the needle has a "high" rank. - fn rank(&self, byte: u8) -> u8; -} - -/// The default byte frequency heuristic that is good for most haystacks. -pub(crate) struct DefaultFrequencyRank; - -impl HeuristicFrequencyRank for DefaultFrequencyRank { - fn rank(&self, byte: u8) -> u8 { - self::default_rank::RANK[usize::from(byte)] - } -} - -/// This permits passing any implementation of `HeuristicFrequencyRank` as a -/// borrowed version of itself. -impl<'a, R> HeuristicFrequencyRank for &'a R -where - R: HeuristicFrequencyRank, -{ - fn rank(&self, byte: u8) -> u8 { - (**self).rank(byte) - } -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn forward_packedpair() { - fn find( - haystack: &[u8], - needle: &[u8], - _index1: u8, - _index2: u8, - ) -> Option> { - // We ignore the index positions requested since it winds up making - // this test too slow overall. - let f = Finder::new(needle)?; - Some(f.find_prefilter(haystack)) - } - crate::tests::packedpair::Runner::new().fwd(find).run() - } -} diff -Nru temporalio-1.3.0/vendor/memchr/src/arch/all/rabinkarp.rs temporalio-1.3.0/vendor/memchr/src/arch/all/rabinkarp.rs --- temporalio-1.3.0/vendor/memchr/src/arch/all/rabinkarp.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/arch/all/rabinkarp.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,390 +0,0 @@ -/*! -An implementation of the [Rabin-Karp substring search algorithm][rabinkarp]. - -Rabin-Karp works by creating a hash of the needle provided and then computing -a rolling hash for each needle sized window in the haystack. When the rolling -hash matches the hash of the needle, a byte-wise comparison is done to check -if a match exists. The worst case time complexity of Rabin-Karp is `O(m * -n)` where `m ~ len(needle)` and `n ~ len(haystack)`. Its worst case space -complexity is constant. - -The main utility of Rabin-Karp is that the searcher can be constructed very -quickly with very little memory. This makes it especially useful when searching -for small needles in small haystacks, as it might finish its search before a -beefier algorithm (like Two-Way) even starts. - -[rabinkarp]: https://en.wikipedia.org/wiki/Rabin%E2%80%93Karp_algorithm -*/ - -/* -(This was the comment I wrote for this module originally when it was not -exposed. The comment still looks useful, but it's a bit in the weeds, so it's -not public itself.) - -This module implements the classical Rabin-Karp substring search algorithm, -with no extra frills. While its use would seem to break our time complexity -guarantee of O(m+n) (RK's time complexity is O(mn)), we are careful to only -ever use RK on a constant subset of haystacks. The main point here is that -RK has good latency properties for small needles/haystacks. It's very quick -to compute a needle hash and zip through the haystack when compared to -initializing Two-Way, for example. And this is especially useful for cases -where the haystack is just too short for vector instructions to do much good. - -The hashing function used here is the same one recommended by ESMAJ. - -Another choice instead of Rabin-Karp would be Shift-Or. But its latency -isn't quite as good since its preprocessing time is a bit more expensive -(both in practice and in theory). However, perhaps Shift-Or has a place -somewhere else for short patterns. I think the main problem is that it -requires space proportional to the alphabet and the needle. If we, for -example, supported needles up to length 16, then the total table size would be -len(alphabet)*size_of::()==512 bytes. Which isn't exactly small, and it's -probably bad to put that on the stack. So ideally, we'd throw it on the heap, -but we'd really like to write as much code without using alloc/std as possible. -But maybe it's worth the special casing. It's a TODO to benchmark. - -Wikipedia has a decent explanation, if a bit heavy on the theory: -https://en.wikipedia.org/wiki/Rabin%E2%80%93Karp_algorithm - -But ESMAJ provides something a bit more concrete: -http://www-igm.univ-mlv.fr/~lecroq/string/node5.html - -Finally, aho-corasick uses Rabin-Karp for multiple pattern match in some cases: -https://github.com/BurntSushi/aho-corasick/blob/3852632f10587db0ff72ef29e88d58bf305a0946/src/packed/rabinkarp.rs -*/ - -use crate::ext::Pointer; - -/// A forward substring searcher using the Rabin-Karp algorithm. -/// -/// Note that, as a lower level API, a `Finder` does not have access to the -/// needle it was constructed with. For this reason, executing a search -/// with a `Finder` requires passing both the needle and the haystack, -/// where the needle is exactly equivalent to the one given to the `Finder` -/// at construction time. This design was chosen so that callers can have -/// more precise control over where and how many times a needle is stored. -/// For example, in cases where Rabin-Karp is just one of several possible -/// substring search algorithms. -#[derive(Clone, Debug)] -pub struct Finder { - /// The actual hash. - hash: Hash, - /// The factor needed to multiply a byte by in order to subtract it from - /// the hash. It is defined to be 2^(n-1) (using wrapping exponentiation), - /// where n is the length of the needle. This is how we "remove" a byte - /// from the hash once the hash window rolls past it. - hash_2pow: u32, -} - -impl Finder { - /// Create a new Rabin-Karp forward searcher for the given `needle`. - /// - /// The needle may be empty. The empty needle matches at every byte offset. - /// - /// Note that callers must pass the same needle to all search calls using - /// this `Finder`. - #[inline] - pub fn new(needle: &[u8]) -> Finder { - let mut s = Finder { hash: Hash::new(), hash_2pow: 1 }; - let first_byte = match needle.get(0) { - None => return s, - Some(&first_byte) => first_byte, - }; - s.hash.add(first_byte); - for b in needle.iter().copied().skip(1) { - s.hash.add(b); - s.hash_2pow = s.hash_2pow.wrapping_shl(1); - } - s - } - - /// Return the first occurrence of the `needle` in the `haystack` - /// given. If no such occurrence exists, then `None` is returned. - /// - /// The `needle` provided must match the needle given to this finder at - /// construction time. - /// - /// The maximum value this can return is `haystack.len()`, which can only - /// occur when the needle and haystack both have length zero. Otherwise, - /// for non-empty haystacks, the maximum value is `haystack.len() - 1`. - #[inline] - pub fn find(&self, haystack: &[u8], needle: &[u8]) -> Option { - unsafe { - let hstart = haystack.as_ptr(); - let hend = hstart.add(haystack.len()); - let nstart = needle.as_ptr(); - let nend = nstart.add(needle.len()); - let found = self.find_raw(hstart, hend, nstart, nend)?; - Some(found.distance(hstart)) - } - } - - /// Like `find`, but accepts and returns raw pointers. - /// - /// When a match is found, the pointer returned is guaranteed to be - /// `>= start` and `<= end`. The pointer returned is only ever equivalent - /// to `end` when both the needle and haystack are empty. (That is, the - /// empty string matches the empty string.) - /// - /// This routine is useful if you're already using raw pointers and would - /// like to avoid converting back to a slice before executing a search. - /// - /// # Safety - /// - /// Note that `start` and `end` below refer to both pairs of pointers given - /// to this routine. That is, the conditions apply to both `hstart`/`hend` - /// and `nstart`/`nend`. - /// - /// * Both `start` and `end` must be valid for reads. - /// * Both `start` and `end` must point to an initialized value. - /// * Both `start` and `end` must point to the same allocated object and - /// must either be in bounds or at most one byte past the end of the - /// allocated object. - /// * Both `start` and `end` must be _derived from_ a pointer to the same - /// object. - /// * The distance between `start` and `end` must not overflow `isize`. - /// * The distance being in bounds must not rely on "wrapping around" the - /// address space. - /// * It must be the case that `start <= end`. - #[inline] - pub unsafe fn find_raw( - &self, - hstart: *const u8, - hend: *const u8, - nstart: *const u8, - nend: *const u8, - ) -> Option<*const u8> { - let hlen = hend.distance(hstart); - let nlen = nend.distance(nstart); - if nlen > hlen { - return None; - } - let mut cur = hstart; - let end = hend.sub(nlen); - let mut hash = Hash::forward(cur, cur.add(nlen)); - loop { - if self.hash == hash && is_equal_raw(cur, nstart, nlen) { - return Some(cur); - } - if cur >= end { - return None; - } - hash.roll(self, cur.read(), cur.add(nlen).read()); - cur = cur.add(1); - } - } -} - -/// A reverse substring searcher using the Rabin-Karp algorithm. -#[derive(Clone, Debug)] -pub struct FinderRev(Finder); - -impl FinderRev { - /// Create a new Rabin-Karp reverse searcher for the given `needle`. - #[inline] - pub fn new(needle: &[u8]) -> FinderRev { - let mut s = FinderRev(Finder { hash: Hash::new(), hash_2pow: 1 }); - let last_byte = match needle.last() { - None => return s, - Some(&last_byte) => last_byte, - }; - s.0.hash.add(last_byte); - for b in needle.iter().rev().copied().skip(1) { - s.0.hash.add(b); - s.0.hash_2pow = s.0.hash_2pow.wrapping_shl(1); - } - s - } - - /// Return the last occurrence of the `needle` in the `haystack` - /// given. If no such occurrence exists, then `None` is returned. - /// - /// The `needle` provided must match the needle given to this finder at - /// construction time. - /// - /// The maximum value this can return is `haystack.len()`, which can only - /// occur when the needle and haystack both have length zero. Otherwise, - /// for non-empty haystacks, the maximum value is `haystack.len() - 1`. - #[inline] - pub fn rfind(&self, haystack: &[u8], needle: &[u8]) -> Option { - unsafe { - let hstart = haystack.as_ptr(); - let hend = hstart.add(haystack.len()); - let nstart = needle.as_ptr(); - let nend = nstart.add(needle.len()); - let found = self.rfind_raw(hstart, hend, nstart, nend)?; - Some(found.distance(hstart)) - } - } - - /// Like `rfind`, but accepts and returns raw pointers. - /// - /// When a match is found, the pointer returned is guaranteed to be - /// `>= start` and `<= end`. The pointer returned is only ever equivalent - /// to `end` when both the needle and haystack are empty. (That is, the - /// empty string matches the empty string.) - /// - /// This routine is useful if you're already using raw pointers and would - /// like to avoid converting back to a slice before executing a search. - /// - /// # Safety - /// - /// Note that `start` and `end` below refer to both pairs of pointers given - /// to this routine. That is, the conditions apply to both `hstart`/`hend` - /// and `nstart`/`nend`. - /// - /// * Both `start` and `end` must be valid for reads. - /// * Both `start` and `end` must point to an initialized value. - /// * Both `start` and `end` must point to the same allocated object and - /// must either be in bounds or at most one byte past the end of the - /// allocated object. - /// * Both `start` and `end` must be _derived from_ a pointer to the same - /// object. - /// * The distance between `start` and `end` must not overflow `isize`. - /// * The distance being in bounds must not rely on "wrapping around" the - /// address space. - /// * It must be the case that `start <= end`. - #[inline] - pub unsafe fn rfind_raw( - &self, - hstart: *const u8, - hend: *const u8, - nstart: *const u8, - nend: *const u8, - ) -> Option<*const u8> { - let hlen = hend.distance(hstart); - let nlen = nend.distance(nstart); - if nlen > hlen { - return None; - } - let mut cur = hend.sub(nlen); - let start = hstart; - let mut hash = Hash::reverse(cur, cur.add(nlen)); - loop { - if self.0.hash == hash && is_equal_raw(cur, nstart, nlen) { - return Some(cur); - } - if cur <= start { - return None; - } - cur = cur.sub(1); - hash.roll(&self.0, cur.add(nlen).read(), cur.read()); - } - } -} - -/// Whether RK is believed to be very fast for the given needle/haystack. -#[inline] -pub(crate) fn is_fast(haystack: &[u8], _needle: &[u8]) -> bool { - haystack.len() < 16 -} - -/// A Rabin-Karp hash. This might represent the hash of a needle, or the hash -/// of a rolling window in the haystack. -#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)] -struct Hash(u32); - -impl Hash { - /// Create a new hash that represents the empty string. - #[inline(always)] - fn new() -> Hash { - Hash(0) - } - - /// Create a new hash from the bytes given for use in forward searches. - /// - /// # Safety - /// - /// The given pointers must be valid to read from within their range. - #[inline(always)] - unsafe fn forward(mut start: *const u8, end: *const u8) -> Hash { - let mut hash = Hash::new(); - while start < end { - hash.add(start.read()); - start = start.add(1); - } - hash - } - - /// Create a new hash from the bytes given for use in reverse searches. - /// - /// # Safety - /// - /// The given pointers must be valid to read from within their range. - #[inline(always)] - unsafe fn reverse(start: *const u8, mut end: *const u8) -> Hash { - let mut hash = Hash::new(); - while start < end { - end = end.sub(1); - hash.add(end.read()); - } - hash - } - - /// Add 'new' and remove 'old' from this hash. The given needle hash should - /// correspond to the hash computed for the needle being searched for. - /// - /// This is meant to be used when the rolling window of the haystack is - /// advanced. - #[inline(always)] - fn roll(&mut self, finder: &Finder, old: u8, new: u8) { - self.del(finder, old); - self.add(new); - } - - /// Add a byte to this hash. - #[inline(always)] - fn add(&mut self, byte: u8) { - self.0 = self.0.wrapping_shl(1).wrapping_add(u32::from(byte)); - } - - /// Remove a byte from this hash. The given needle hash should correspond - /// to the hash computed for the needle being searched for. - #[inline(always)] - fn del(&mut self, finder: &Finder, byte: u8) { - let factor = finder.hash_2pow; - self.0 = self.0.wrapping_sub(u32::from(byte).wrapping_mul(factor)); - } -} - -/// Returns true when `x[i] == y[i]` for all `0 <= i < n`. -/// -/// We forcefully don't inline this to hint at the compiler that it is unlikely -/// to be called. This causes the inner rabinkarp loop above to be a bit -/// tighter and leads to some performance improvement. See the -/// memmem/krate/prebuilt/sliceslice-words/words benchmark. -/// -/// # Safety -/// -/// Same as `crate::arch::all::is_equal_raw`. -#[cold] -#[inline(never)] -unsafe fn is_equal_raw(x: *const u8, y: *const u8, n: usize) -> bool { - crate::arch::all::is_equal_raw(x, y, n) -} - -#[cfg(test)] -mod tests { - use super::*; - - define_substring_forward_quickcheck!(|h, n| Some( - Finder::new(n).find(h, n) - )); - define_substring_reverse_quickcheck!(|h, n| Some( - FinderRev::new(n).rfind(h, n) - )); - - #[test] - fn forward() { - crate::tests::substring::Runner::new() - .fwd(|h, n| Some(Finder::new(n).find(h, n))) - .run(); - } - - #[test] - fn reverse() { - crate::tests::substring::Runner::new() - .rev(|h, n| Some(FinderRev::new(n).rfind(h, n))) - .run(); - } -} diff -Nru temporalio-1.3.0/vendor/memchr/src/arch/all/shiftor.rs temporalio-1.3.0/vendor/memchr/src/arch/all/shiftor.rs --- temporalio-1.3.0/vendor/memchr/src/arch/all/shiftor.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/arch/all/shiftor.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,89 +0,0 @@ -/*! -An implementation of the [Shift-Or substring search algorithm][shiftor]. - -[shiftor]: https://en.wikipedia.org/wiki/Bitap_algorithm -*/ - -use alloc::boxed::Box; - -/// The type of our mask. -/// -/// While we don't expose anyway to configure this in the public API, if one -/// really needs less memory usage or support for longer needles, then it is -/// suggested to copy the code from this module and modify it to fit your -/// needs. The code below is written to be correct regardless of whether Mask -/// is a u8, u16, u32, u64 or u128. -type Mask = u16; - -/// A forward substring searcher using the Shift-Or algorithm. -#[derive(Debug)] -pub struct Finder { - masks: Box<[Mask; 256]>, - needle_len: usize, -} - -impl Finder { - const MAX_NEEDLE_LEN: usize = (Mask::BITS - 1) as usize; - - /// Create a new Shift-Or forward searcher for the given `needle`. - /// - /// The needle may be empty. The empty needle matches at every byte offset. - #[inline] - pub fn new(needle: &[u8]) -> Option { - let needle_len = needle.len(); - if needle_len > Finder::MAX_NEEDLE_LEN { - // A match is found when bit 7 is set in 'result' in the search - // routine below. So our needle can't be bigger than 7. We could - // permit bigger needles by using u16, u32 or u64 for our mask - // entries. But this is all we need for this example. - return None; - } - let mut searcher = Finder { masks: Box::from([!0; 256]), needle_len }; - for (i, &byte) in needle.iter().enumerate() { - searcher.masks[usize::from(byte)] &= !(1 << i); - } - Some(searcher) - } - - /// Return the first occurrence of the needle given to `Finder::new` in - /// the `haystack` given. If no such occurrence exists, then `None` is - /// returned. - /// - /// Unlike most other substring search implementations in this crate, this - /// finder does not require passing the needle at search time. A match can - /// be determined without the needle at all since the required information - /// is already encoded into this finder at construction time. - /// - /// The maximum value this can return is `haystack.len()`, which can only - /// occur when the needle and haystack both have length zero. Otherwise, - /// for non-empty haystacks, the maximum value is `haystack.len() - 1`. - #[inline] - pub fn find(&self, haystack: &[u8]) -> Option { - if self.needle_len == 0 { - return Some(0); - } - let mut result = !1; - for (i, &byte) in haystack.iter().enumerate() { - result |= self.masks[usize::from(byte)]; - result <<= 1; - if result & (1 << self.needle_len) == 0 { - return Some(i + 1 - self.needle_len); - } - } - None - } -} - -#[cfg(test)] -mod tests { - use super::*; - - define_substring_forward_quickcheck!(|h, n| Some(Finder::new(n)?.find(h))); - - #[test] - fn forward() { - crate::tests::substring::Runner::new() - .fwd(|h, n| Some(Finder::new(n)?.find(h))) - .run(); - } -} diff -Nru temporalio-1.3.0/vendor/memchr/src/arch/all/twoway.rs temporalio-1.3.0/vendor/memchr/src/arch/all/twoway.rs --- temporalio-1.3.0/vendor/memchr/src/arch/all/twoway.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/arch/all/twoway.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,877 +0,0 @@ -/*! -An implementation of the [Two-Way substring search algorithm][two-way]. - -[`Finder`] can be built for forward searches, while [`FinderRev`] can be built -for reverse searches. - -Two-Way makes for a nice general purpose substring search algorithm because of -its time and space complexity properties. It also performs well in practice. -Namely, with `m = len(needle)` and `n = len(haystack)`, Two-Way takes `O(m)` -time to create a finder, `O(1)` space and `O(n)` search time. In other words, -the preprocessing step is quick, doesn't require any heap memory and the worst -case search time is guaranteed to be linear in the haystack regardless of the -size of the needle. - -While vector algorithms will usually beat Two-Way handedly, vector algorithms -also usually have pathological or edge cases that are better handled by Two-Way. -Moreover, not all targets support vector algorithms or implementations for them -simply may not exist yet. - -Two-Way can be found in the `memmem` implementations in at least [GNU libc] and -[musl]. - -[two-way]: https://en.wikipedia.org/wiki/Two-way_string-matching_algorithm -[GNU libc]: https://www.gnu.org/software/libc/ -[musl]: https://www.musl-libc.org/ -*/ - -use core::cmp; - -use crate::{ - arch::all::{is_prefix, is_suffix}, - memmem::Pre, -}; - -/// A forward substring searcher that uses the Two-Way algorithm. -#[derive(Clone, Copy, Debug)] -pub struct Finder(TwoWay); - -/// A reverse substring searcher that uses the Two-Way algorithm. -#[derive(Clone, Copy, Debug)] -pub struct FinderRev(TwoWay); - -/// An implementation of the TwoWay substring search algorithm. -/// -/// This searcher supports forward and reverse search, although not -/// simultaneously. It runs in `O(n + m)` time and `O(1)` space, where -/// `n ~ len(needle)` and `m ~ len(haystack)`. -/// -/// The implementation here roughly matches that which was developed by -/// Crochemore and Perrin in their 1991 paper "Two-way string-matching." The -/// changes in this implementation are 1) the use of zero-based indices, 2) a -/// heuristic skip table based on the last byte (borrowed from Rust's standard -/// library) and 3) the addition of heuristics for a fast skip loop. For (3), -/// callers can pass any kind of prefilter they want, but usually it's one -/// based on a heuristic that uses an approximate background frequency of bytes -/// to choose rare bytes to quickly look for candidate match positions. Note -/// though that currently, this prefilter functionality is not exposed directly -/// in the public API. (File an issue if you want it and provide a use case -/// please.) -/// -/// The heuristic for fast skipping is automatically shut off if it's -/// detected to be ineffective at search time. Generally, this only occurs in -/// pathological cases. But this is generally necessary in order to preserve -/// a `O(n + m)` time bound. -/// -/// The code below is fairly complex and not obviously correct at all. It's -/// likely necessary to read the Two-Way paper cited above in order to fully -/// grok this code. The essence of it is: -/// -/// 1. Do something to detect a "critical" position in the needle. -/// 2. For the current position in the haystack, look if `needle[critical..]` -/// matches at that position. -/// 3. If so, look if `needle[..critical]` matches. -/// 4. If a mismatch occurs, shift the search by some amount based on the -/// critical position and a pre-computed shift. -/// -/// This type is wrapped in the forward and reverse finders that expose -/// consistent forward or reverse APIs. -#[derive(Clone, Copy, Debug)] -struct TwoWay { - /// A small bitset used as a quick prefilter (in addition to any prefilter - /// given by the caller). Namely, a bit `i` is set if and only if `b%64==i` - /// for any `b == needle[i]`. - /// - /// When used as a prefilter, if the last byte at the current candidate - /// position is NOT in this set, then we can skip that entire candidate - /// position (the length of the needle). This is essentially the shift - /// trick found in Boyer-Moore, but only applied to bytes that don't appear - /// in the needle. - /// - /// N.B. This trick was inspired by something similar in std's - /// implementation of Two-Way. - byteset: ApproximateByteSet, - /// A critical position in needle. Specifically, this position corresponds - /// to beginning of either the minimal or maximal suffix in needle. (N.B. - /// See SuffixType below for why "minimal" isn't quite the correct word - /// here.) - /// - /// This is the position at which every search begins. Namely, search - /// starts by scanning text to the right of this position, and only if - /// there's a match does the text to the left of this position get scanned. - critical_pos: usize, - /// The amount we shift by in the Two-Way search algorithm. This - /// corresponds to the "small period" and "large period" cases. - shift: Shift, -} - -impl Finder { - /// Create a searcher that finds occurrences of the given `needle`. - /// - /// An empty `needle` results in a match at every position in a haystack, - /// including at `haystack.len()`. - #[inline] - pub fn new(needle: &[u8]) -> Finder { - let byteset = ApproximateByteSet::new(needle); - let min_suffix = Suffix::forward(needle, SuffixKind::Minimal); - let max_suffix = Suffix::forward(needle, SuffixKind::Maximal); - let (period_lower_bound, critical_pos) = - if min_suffix.pos > max_suffix.pos { - (min_suffix.period, min_suffix.pos) - } else { - (max_suffix.period, max_suffix.pos) - }; - let shift = Shift::forward(needle, period_lower_bound, critical_pos); - Finder(TwoWay { byteset, critical_pos, shift }) - } - - /// Returns the first occurrence of `needle` in the given `haystack`, or - /// `None` if no such occurrence could be found. - /// - /// The `needle` given must be the same as the `needle` provided to - /// [`Finder::new`]. - /// - /// An empty `needle` results in a match at every position in a haystack, - /// including at `haystack.len()`. - #[inline] - pub fn find(&self, haystack: &[u8], needle: &[u8]) -> Option { - self.find_with_prefilter(None, haystack, needle) - } - - /// This is like [`Finder::find`], but it accepts a prefilter for - /// accelerating searches. - /// - /// Currently this is not exposed in the public API because, at the time - /// of writing, I didn't want to spend time thinking about how to expose - /// the prefilter infrastructure (if at all). If you have a compelling use - /// case for exposing this routine, please create an issue. Do *not* open - /// a PR that just exposes `Pre` and friends. Exporting this routine will - /// require API design. - #[inline(always)] - pub(crate) fn find_with_prefilter( - &self, - pre: Option>, - haystack: &[u8], - needle: &[u8], - ) -> Option { - match self.0.shift { - Shift::Small { period } => { - self.find_small_imp(pre, haystack, needle, period) - } - Shift::Large { shift } => { - self.find_large_imp(pre, haystack, needle, shift) - } - } - } - - // Each of the two search implementations below can be accelerated by a - // prefilter, but it is not always enabled. To avoid its overhead when - // its disabled, we explicitly inline each search implementation based on - // whether a prefilter will be used or not. The decision on which to use - // is made in the parent meta searcher. - - #[inline(always)] - fn find_small_imp( - &self, - mut pre: Option>, - haystack: &[u8], - needle: &[u8], - period: usize, - ) -> Option { - let mut pos = 0; - let mut shift = 0; - let last_byte_pos = match needle.len().checked_sub(1) { - None => return Some(pos), - Some(last_byte) => last_byte, - }; - while pos + needle.len() <= haystack.len() { - let mut i = cmp::max(self.0.critical_pos, shift); - if let Some(pre) = pre.as_mut() { - if pre.is_effective() { - pos += pre.find(&haystack[pos..])?; - shift = 0; - i = self.0.critical_pos; - if pos + needle.len() > haystack.len() { - return None; - } - } - } - if !self.0.byteset.contains(haystack[pos + last_byte_pos]) { - pos += needle.len(); - shift = 0; - continue; - } - while i < needle.len() && needle[i] == haystack[pos + i] { - i += 1; - } - if i < needle.len() { - pos += i - self.0.critical_pos + 1; - shift = 0; - } else { - let mut j = self.0.critical_pos; - while j > shift && needle[j] == haystack[pos + j] { - j -= 1; - } - if j <= shift && needle[shift] == haystack[pos + shift] { - return Some(pos); - } - pos += period; - shift = needle.len() - period; - } - } - None - } - - #[inline(always)] - fn find_large_imp( - &self, - mut pre: Option>, - haystack: &[u8], - needle: &[u8], - shift: usize, - ) -> Option { - let mut pos = 0; - let last_byte_pos = match needle.len().checked_sub(1) { - None => return Some(pos), - Some(last_byte) => last_byte, - }; - 'outer: while pos + needle.len() <= haystack.len() { - if let Some(pre) = pre.as_mut() { - if pre.is_effective() { - pos += pre.find(&haystack[pos..])?; - if pos + needle.len() > haystack.len() { - return None; - } - } - } - - if !self.0.byteset.contains(haystack[pos + last_byte_pos]) { - pos += needle.len(); - continue; - } - let mut i = self.0.critical_pos; - while i < needle.len() && needle[i] == haystack[pos + i] { - i += 1; - } - if i < needle.len() { - pos += i - self.0.critical_pos + 1; - } else { - for j in (0..self.0.critical_pos).rev() { - if needle[j] != haystack[pos + j] { - pos += shift; - continue 'outer; - } - } - return Some(pos); - } - } - None - } -} - -impl FinderRev { - /// Create a searcher that finds occurrences of the given `needle`. - /// - /// An empty `needle` results in a match at every position in a haystack, - /// including at `haystack.len()`. - #[inline] - pub fn new(needle: &[u8]) -> FinderRev { - let byteset = ApproximateByteSet::new(needle); - let min_suffix = Suffix::reverse(needle, SuffixKind::Minimal); - let max_suffix = Suffix::reverse(needle, SuffixKind::Maximal); - let (period_lower_bound, critical_pos) = - if min_suffix.pos < max_suffix.pos { - (min_suffix.period, min_suffix.pos) - } else { - (max_suffix.period, max_suffix.pos) - }; - let shift = Shift::reverse(needle, period_lower_bound, critical_pos); - FinderRev(TwoWay { byteset, critical_pos, shift }) - } - - /// Returns the last occurrence of `needle` in the given `haystack`, or - /// `None` if no such occurrence could be found. - /// - /// The `needle` given must be the same as the `needle` provided to - /// [`FinderRev::new`]. - /// - /// An empty `needle` results in a match at every position in a haystack, - /// including at `haystack.len()`. - #[inline] - pub fn rfind(&self, haystack: &[u8], needle: &[u8]) -> Option { - // For the reverse case, we don't use a prefilter. It's plausible that - // perhaps we should, but it's a lot of additional code to do it, and - // it's not clear that it's actually worth it. If you have a really - // compelling use case for this, please file an issue. - match self.0.shift { - Shift::Small { period } => { - self.rfind_small_imp(haystack, needle, period) - } - Shift::Large { shift } => { - self.rfind_large_imp(haystack, needle, shift) - } - } - } - - #[inline(always)] - fn rfind_small_imp( - &self, - haystack: &[u8], - needle: &[u8], - period: usize, - ) -> Option { - let nlen = needle.len(); - let mut pos = haystack.len(); - let mut shift = nlen; - let first_byte = match needle.get(0) { - None => return Some(pos), - Some(&first_byte) => first_byte, - }; - while pos >= nlen { - if !self.0.byteset.contains(haystack[pos - nlen]) { - pos -= nlen; - shift = nlen; - continue; - } - let mut i = cmp::min(self.0.critical_pos, shift); - while i > 0 && needle[i - 1] == haystack[pos - nlen + i - 1] { - i -= 1; - } - if i > 0 || first_byte != haystack[pos - nlen] { - pos -= self.0.critical_pos - i + 1; - shift = nlen; - } else { - let mut j = self.0.critical_pos; - while j < shift && needle[j] == haystack[pos - nlen + j] { - j += 1; - } - if j >= shift { - return Some(pos - nlen); - } - pos -= period; - shift = period; - } - } - None - } - - #[inline(always)] - fn rfind_large_imp( - &self, - haystack: &[u8], - needle: &[u8], - shift: usize, - ) -> Option { - let nlen = needle.len(); - let mut pos = haystack.len(); - let first_byte = match needle.get(0) { - None => return Some(pos), - Some(&first_byte) => first_byte, - }; - while pos >= nlen { - if !self.0.byteset.contains(haystack[pos - nlen]) { - pos -= nlen; - continue; - } - let mut i = self.0.critical_pos; - while i > 0 && needle[i - 1] == haystack[pos - nlen + i - 1] { - i -= 1; - } - if i > 0 || first_byte != haystack[pos - nlen] { - pos -= self.0.critical_pos - i + 1; - } else { - let mut j = self.0.critical_pos; - while j < nlen && needle[j] == haystack[pos - nlen + j] { - j += 1; - } - if j == nlen { - return Some(pos - nlen); - } - pos -= shift; - } - } - None - } -} - -/// A representation of the amount we're allowed to shift by during Two-Way -/// search. -/// -/// When computing a critical factorization of the needle, we find the position -/// of the critical factorization by finding the needle's maximal (or minimal) -/// suffix, along with the period of that suffix. It turns out that the period -/// of that suffix is a lower bound on the period of the needle itself. -/// -/// This lower bound is equivalent to the actual period of the needle in -/// some cases. To describe that case, we denote the needle as `x` where -/// `x = uv` and `v` is the lexicographic maximal suffix of `v`. The lower -/// bound given here is always the period of `v`, which is `<= period(x)`. The -/// case where `period(v) == period(x)` occurs when `len(u) < (len(x) / 2)` and -/// where `u` is a suffix of `v[0..period(v)]`. -/// -/// This case is important because the search algorithm for when the -/// periods are equivalent is slightly different than the search algorithm -/// for when the periods are not equivalent. In particular, when they aren't -/// equivalent, we know that the period of the needle is no less than half its -/// length. In this case, we shift by an amount less than or equal to the -/// period of the needle (determined by the maximum length of the components -/// of the critical factorization of `x`, i.e., `max(len(u), len(v))`).. -/// -/// The above two cases are represented by the variants below. Each entails -/// a different instantiation of the Two-Way search algorithm. -/// -/// N.B. If we could find a way to compute the exact period in all cases, -/// then we could collapse this case analysis and simplify the algorithm. The -/// Two-Way paper suggests this is possible, but more reading is required to -/// grok why the authors didn't pursue that path. -#[derive(Clone, Copy, Debug)] -enum Shift { - Small { period: usize }, - Large { shift: usize }, -} - -impl Shift { - /// Compute the shift for a given needle in the forward direction. - /// - /// This requires a lower bound on the period and a critical position. - /// These can be computed by extracting both the minimal and maximal - /// lexicographic suffixes, and choosing the right-most starting position. - /// The lower bound on the period is then the period of the chosen suffix. - fn forward( - needle: &[u8], - period_lower_bound: usize, - critical_pos: usize, - ) -> Shift { - let large = cmp::max(critical_pos, needle.len() - critical_pos); - if critical_pos * 2 >= needle.len() { - return Shift::Large { shift: large }; - } - - let (u, v) = needle.split_at(critical_pos); - if !is_suffix(&v[..period_lower_bound], u) { - return Shift::Large { shift: large }; - } - Shift::Small { period: period_lower_bound } - } - - /// Compute the shift for a given needle in the reverse direction. - /// - /// This requires a lower bound on the period and a critical position. - /// These can be computed by extracting both the minimal and maximal - /// lexicographic suffixes, and choosing the left-most starting position. - /// The lower bound on the period is then the period of the chosen suffix. - fn reverse( - needle: &[u8], - period_lower_bound: usize, - critical_pos: usize, - ) -> Shift { - let large = cmp::max(critical_pos, needle.len() - critical_pos); - if (needle.len() - critical_pos) * 2 >= needle.len() { - return Shift::Large { shift: large }; - } - - let (v, u) = needle.split_at(critical_pos); - if !is_prefix(&v[v.len() - period_lower_bound..], u) { - return Shift::Large { shift: large }; - } - Shift::Small { period: period_lower_bound } - } -} - -/// A suffix extracted from a needle along with its period. -#[derive(Debug)] -struct Suffix { - /// The starting position of this suffix. - /// - /// If this is a forward suffix, then `&bytes[pos..]` can be used. If this - /// is a reverse suffix, then `&bytes[..pos]` can be used. That is, for - /// forward suffixes, this is an inclusive starting position, where as for - /// reverse suffixes, this is an exclusive ending position. - pos: usize, - /// The period of this suffix. - /// - /// Note that this is NOT necessarily the period of the string from which - /// this suffix comes from. (It is always less than or equal to the period - /// of the original string.) - period: usize, -} - -impl Suffix { - fn forward(needle: &[u8], kind: SuffixKind) -> Suffix { - // suffix represents our maximal (or minimal) suffix, along with - // its period. - let mut suffix = Suffix { pos: 0, period: 1 }; - // The start of a suffix in `needle` that we are considering as a - // more maximal (or minimal) suffix than what's in `suffix`. - let mut candidate_start = 1; - // The current offset of our suffixes that we're comparing. - // - // When the characters at this offset are the same, then we mush on - // to the next position since no decision is possible. When the - // candidate's character is greater (or lesser) than the corresponding - // character than our current maximal (or minimal) suffix, then the - // current suffix is changed over to the candidate and we restart our - // search. Otherwise, the candidate suffix is no good and we restart - // our search on the next candidate. - // - // The three cases above correspond to the three cases in the loop - // below. - let mut offset = 0; - - while candidate_start + offset < needle.len() { - let current = needle[suffix.pos + offset]; - let candidate = needle[candidate_start + offset]; - match kind.cmp(current, candidate) { - SuffixOrdering::Accept => { - suffix = Suffix { pos: candidate_start, period: 1 }; - candidate_start += 1; - offset = 0; - } - SuffixOrdering::Skip => { - candidate_start += offset + 1; - offset = 0; - suffix.period = candidate_start - suffix.pos; - } - SuffixOrdering::Push => { - if offset + 1 == suffix.period { - candidate_start += suffix.period; - offset = 0; - } else { - offset += 1; - } - } - } - } - suffix - } - - fn reverse(needle: &[u8], kind: SuffixKind) -> Suffix { - // See the comments in `forward` for how this works. - let mut suffix = Suffix { pos: needle.len(), period: 1 }; - if needle.len() == 1 { - return suffix; - } - let mut candidate_start = match needle.len().checked_sub(1) { - None => return suffix, - Some(candidate_start) => candidate_start, - }; - let mut offset = 0; - - while offset < candidate_start { - let current = needle[suffix.pos - offset - 1]; - let candidate = needle[candidate_start - offset - 1]; - match kind.cmp(current, candidate) { - SuffixOrdering::Accept => { - suffix = Suffix { pos: candidate_start, period: 1 }; - candidate_start -= 1; - offset = 0; - } - SuffixOrdering::Skip => { - candidate_start -= offset + 1; - offset = 0; - suffix.period = suffix.pos - candidate_start; - } - SuffixOrdering::Push => { - if offset + 1 == suffix.period { - candidate_start -= suffix.period; - offset = 0; - } else { - offset += 1; - } - } - } - } - suffix - } -} - -/// The kind of suffix to extract. -#[derive(Clone, Copy, Debug)] -enum SuffixKind { - /// Extract the smallest lexicographic suffix from a string. - /// - /// Technically, this doesn't actually pick the smallest lexicographic - /// suffix. e.g., Given the choice between `a` and `aa`, this will choose - /// the latter over the former, even though `a < aa`. The reasoning for - /// this isn't clear from the paper, but it still smells like a minimal - /// suffix. - Minimal, - /// Extract the largest lexicographic suffix from a string. - /// - /// Unlike `Minimal`, this really does pick the maximum suffix. e.g., Given - /// the choice between `z` and `zz`, this will choose the latter over the - /// former. - Maximal, -} - -/// The result of comparing corresponding bytes between two suffixes. -#[derive(Clone, Copy, Debug)] -enum SuffixOrdering { - /// This occurs when the given candidate byte indicates that the candidate - /// suffix is better than the current maximal (or minimal) suffix. That is, - /// the current candidate suffix should supplant the current maximal (or - /// minimal) suffix. - Accept, - /// This occurs when the given candidate byte excludes the candidate suffix - /// from being better than the current maximal (or minimal) suffix. That - /// is, the current candidate suffix should be dropped and the next one - /// should be considered. - Skip, - /// This occurs when no decision to accept or skip the candidate suffix - /// can be made, e.g., when corresponding bytes are equivalent. In this - /// case, the next corresponding bytes should be compared. - Push, -} - -impl SuffixKind { - /// Returns true if and only if the given candidate byte indicates that - /// it should replace the current suffix as the maximal (or minimal) - /// suffix. - fn cmp(self, current: u8, candidate: u8) -> SuffixOrdering { - use self::SuffixOrdering::*; - - match self { - SuffixKind::Minimal if candidate < current => Accept, - SuffixKind::Minimal if candidate > current => Skip, - SuffixKind::Minimal => Push, - SuffixKind::Maximal if candidate > current => Accept, - SuffixKind::Maximal if candidate < current => Skip, - SuffixKind::Maximal => Push, - } - } -} - -/// A bitset used to track whether a particular byte exists in a needle or not. -/// -/// Namely, bit 'i' is set if and only if byte%64==i for any byte in the -/// needle. If a particular byte in the haystack is NOT in this set, then one -/// can conclude that it is also not in the needle, and thus, one can advance -/// in the haystack by needle.len() bytes. -#[derive(Clone, Copy, Debug)] -struct ApproximateByteSet(u64); - -impl ApproximateByteSet { - /// Create a new set from the given needle. - fn new(needle: &[u8]) -> ApproximateByteSet { - let mut bits = 0; - for &b in needle { - bits |= 1 << (b % 64); - } - ApproximateByteSet(bits) - } - - /// Return true if and only if the given byte might be in this set. This - /// may return a false positive, but will never return a false negative. - #[inline(always)] - fn contains(&self, byte: u8) -> bool { - self.0 & (1 << (byte % 64)) != 0 - } -} - -#[cfg(test)] -mod tests { - use alloc::vec::Vec; - - use super::*; - - /// Convenience wrapper for computing the suffix as a byte string. - fn get_suffix_forward(needle: &[u8], kind: SuffixKind) -> (&[u8], usize) { - let s = Suffix::forward(needle, kind); - (&needle[s.pos..], s.period) - } - - /// Convenience wrapper for computing the reverse suffix as a byte string. - fn get_suffix_reverse(needle: &[u8], kind: SuffixKind) -> (&[u8], usize) { - let s = Suffix::reverse(needle, kind); - (&needle[..s.pos], s.period) - } - - /// Return all of the non-empty suffixes in the given byte string. - fn suffixes(bytes: &[u8]) -> Vec<&[u8]> { - (0..bytes.len()).map(|i| &bytes[i..]).collect() - } - - /// Return the lexicographically maximal suffix of the given byte string. - fn naive_maximal_suffix_forward(needle: &[u8]) -> &[u8] { - let mut sufs = suffixes(needle); - sufs.sort(); - sufs.pop().unwrap() - } - - /// Return the lexicographically maximal suffix of the reverse of the given - /// byte string. - fn naive_maximal_suffix_reverse(needle: &[u8]) -> Vec { - let mut reversed = needle.to_vec(); - reversed.reverse(); - let mut got = naive_maximal_suffix_forward(&reversed).to_vec(); - got.reverse(); - got - } - - define_substring_forward_quickcheck!(|h, n| Some( - Finder::new(n).find(h, n) - )); - define_substring_reverse_quickcheck!(|h, n| Some( - FinderRev::new(n).rfind(h, n) - )); - - #[test] - fn forward() { - crate::tests::substring::Runner::new() - .fwd(|h, n| Some(Finder::new(n).find(h, n))) - .run(); - } - - #[test] - fn reverse() { - crate::tests::substring::Runner::new() - .rev(|h, n| Some(FinderRev::new(n).rfind(h, n))) - .run(); - } - - #[test] - fn suffix_forward() { - macro_rules! assert_suffix_min { - ($given:expr, $expected:expr, $period:expr) => { - let (got_suffix, got_period) = - get_suffix_forward($given.as_bytes(), SuffixKind::Minimal); - let got_suffix = core::str::from_utf8(got_suffix).unwrap(); - assert_eq!(($expected, $period), (got_suffix, got_period)); - }; - } - - macro_rules! assert_suffix_max { - ($given:expr, $expected:expr, $period:expr) => { - let (got_suffix, got_period) = - get_suffix_forward($given.as_bytes(), SuffixKind::Maximal); - let got_suffix = core::str::from_utf8(got_suffix).unwrap(); - assert_eq!(($expected, $period), (got_suffix, got_period)); - }; - } - - assert_suffix_min!("a", "a", 1); - assert_suffix_max!("a", "a", 1); - - assert_suffix_min!("ab", "ab", 2); - assert_suffix_max!("ab", "b", 1); - - assert_suffix_min!("ba", "a", 1); - assert_suffix_max!("ba", "ba", 2); - - assert_suffix_min!("abc", "abc", 3); - assert_suffix_max!("abc", "c", 1); - - assert_suffix_min!("acb", "acb", 3); - assert_suffix_max!("acb", "cb", 2); - - assert_suffix_min!("cba", "a", 1); - assert_suffix_max!("cba", "cba", 3); - - assert_suffix_min!("abcabc", "abcabc", 3); - assert_suffix_max!("abcabc", "cabc", 3); - - assert_suffix_min!("abcabcabc", "abcabcabc", 3); - assert_suffix_max!("abcabcabc", "cabcabc", 3); - - assert_suffix_min!("abczz", "abczz", 5); - assert_suffix_max!("abczz", "zz", 1); - - assert_suffix_min!("zzabc", "abc", 3); - assert_suffix_max!("zzabc", "zzabc", 5); - - assert_suffix_min!("aaa", "aaa", 1); - assert_suffix_max!("aaa", "aaa", 1); - - assert_suffix_min!("foobar", "ar", 2); - assert_suffix_max!("foobar", "r", 1); - } - - #[test] - fn suffix_reverse() { - macro_rules! assert_suffix_min { - ($given:expr, $expected:expr, $period:expr) => { - let (got_suffix, got_period) = - get_suffix_reverse($given.as_bytes(), SuffixKind::Minimal); - let got_suffix = core::str::from_utf8(got_suffix).unwrap(); - assert_eq!(($expected, $period), (got_suffix, got_period)); - }; - } - - macro_rules! assert_suffix_max { - ($given:expr, $expected:expr, $period:expr) => { - let (got_suffix, got_period) = - get_suffix_reverse($given.as_bytes(), SuffixKind::Maximal); - let got_suffix = core::str::from_utf8(got_suffix).unwrap(); - assert_eq!(($expected, $period), (got_suffix, got_period)); - }; - } - - assert_suffix_min!("a", "a", 1); - assert_suffix_max!("a", "a", 1); - - assert_suffix_min!("ab", "a", 1); - assert_suffix_max!("ab", "ab", 2); - - assert_suffix_min!("ba", "ba", 2); - assert_suffix_max!("ba", "b", 1); - - assert_suffix_min!("abc", "a", 1); - assert_suffix_max!("abc", "abc", 3); - - assert_suffix_min!("acb", "a", 1); - assert_suffix_max!("acb", "ac", 2); - - assert_suffix_min!("cba", "cba", 3); - assert_suffix_max!("cba", "c", 1); - - assert_suffix_min!("abcabc", "abca", 3); - assert_suffix_max!("abcabc", "abcabc", 3); - - assert_suffix_min!("abcabcabc", "abcabca", 3); - assert_suffix_max!("abcabcabc", "abcabcabc", 3); - - assert_suffix_min!("abczz", "a", 1); - assert_suffix_max!("abczz", "abczz", 5); - - assert_suffix_min!("zzabc", "zza", 3); - assert_suffix_max!("zzabc", "zz", 1); - - assert_suffix_min!("aaa", "aaa", 1); - assert_suffix_max!("aaa", "aaa", 1); - } - - #[cfg(not(miri))] - quickcheck::quickcheck! { - fn qc_suffix_forward_maximal(bytes: Vec) -> bool { - if bytes.is_empty() { - return true; - } - - let (got, _) = get_suffix_forward(&bytes, SuffixKind::Maximal); - let expected = naive_maximal_suffix_forward(&bytes); - got == expected - } - - fn qc_suffix_reverse_maximal(bytes: Vec) -> bool { - if bytes.is_empty() { - return true; - } - - let (got, _) = get_suffix_reverse(&bytes, SuffixKind::Maximal); - let expected = naive_maximal_suffix_reverse(&bytes); - expected == got - } - } - - // This is a regression test caught by quickcheck that exercised a bug in - // the reverse small period handling. The bug was that we were using 'if j - // == shift' to determine if a match occurred, but the correct guard is 'if - // j >= shift', which matches the corresponding guard in the forward impl. - #[test] - fn regression_rev_small_period() { - let rfind = |h, n| FinderRev::new(n).rfind(h, n); - let haystack = "ababaz"; - let needle = "abab"; - assert_eq!(Some(0), rfind(haystack.as_bytes(), needle.as_bytes())); - } -} diff -Nru temporalio-1.3.0/vendor/memchr/src/arch/generic/memchr.rs temporalio-1.3.0/vendor/memchr/src/arch/generic/memchr.rs --- temporalio-1.3.0/vendor/memchr/src/arch/generic/memchr.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/arch/generic/memchr.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,1214 +0,0 @@ -/*! -Generic crate-internal routines for the `memchr` family of functions. -*/ - -// What follows is a vector algorithm generic over the specific vector -// type to detect the position of one, two or three needles in a haystack. -// From what I know, this is a "classic" algorithm, although I don't -// believe it has been published in any peer reviewed journal. I believe -// it can be found in places like glibc and Go's standard library. It -// appears to be well known and is elaborated on in more detail here: -// https://gms.tf/stdfind-and-memchr-optimizations.html -// -// While the routine below is fairly long and perhaps intimidating, the basic -// idea is actually very simple and can be expressed straight-forwardly in -// pseudo code. The psuedo code below is written for 128 bit vectors, but the -// actual code below works for anything that implements the Vector trait. -// -// needle = (n1 << 15) | (n1 << 14) | ... | (n1 << 1) | n1 -// // Note: shift amount is in bytes -// -// while i <= haystack.len() - 16: -// // A 16 byte vector. Each byte in chunk corresponds to a byte in -// // the haystack. -// chunk = haystack[i:i+16] -// // Compare bytes in needle with bytes in chunk. The result is a 16 -// // byte chunk where each byte is 0xFF if the corresponding bytes -// // in needle and chunk were equal, or 0x00 otherwise. -// eqs = cmpeq(needle, chunk) -// // Return a 32 bit integer where the most significant 16 bits -// // are always 0 and the lower 16 bits correspond to whether the -// // most significant bit in the correspond byte in `eqs` is set. -// // In other words, `mask as u16` has bit i set if and only if -// // needle[i] == chunk[i]. -// mask = movemask(eqs) -// -// // Mask is 0 if there is no match, and non-zero otherwise. -// if mask != 0: -// // trailing_zeros tells us the position of the least significant -// // bit that is set. -// return i + trailing_zeros(mask) -// -// // haystack length may not be a multiple of 16, so search the rest. -// while i < haystack.len(): -// if haystack[i] == n1: -// return i -// -// // No match found. -// return NULL -// -// In fact, we could loosely translate the above code to Rust line-for-line -// and it would be a pretty fast algorithm. But, we pull out all the stops -// to go as fast as possible: -// -// 1. We use aligned loads. That is, we do some finagling to make sure our -// primary loop not only proceeds in increments of 16 bytes, but that -// the address of haystack's pointer that we dereference is aligned to -// 16 bytes. 16 is a magic number here because it is the size of SSE2 -// 128-bit vector. (For the AVX2 algorithm, 32 is the magic number.) -// Therefore, to get aligned loads, our pointer's address must be evenly -// divisible by 16. -// 2. Our primary loop proceeds 64 bytes at a time instead of 16. It's -// kind of like loop unrolling, but we combine the equality comparisons -// using a vector OR such that we only need to extract a single mask to -// determine whether a match exists or not. If so, then we do some -// book-keeping to determine the precise location but otherwise mush on. -// 3. We use our "chunk" comparison routine in as many places as possible, -// even if it means using unaligned loads. In particular, if haystack -// starts with an unaligned address, then we do an unaligned load to -// search the first 16 bytes. We then start our primary loop at the -// smallest subsequent aligned address, which will actually overlap with -// previously searched bytes. But we're OK with that. We do a similar -// dance at the end of our primary loop. Finally, to avoid a -// byte-at-a-time loop at the end, we do a final 16 byte unaligned load -// that may overlap with a previous load. This is OK because it converts -// a loop into a small number of very fast vector instructions. The overlap -// is OK because we know the place where the overlap occurs does not -// contain a match. -// -// And that's pretty all there is to it. Note that since the below is -// generic and since it's meant to be inlined into routines with a -// `#[target_feature(enable = "...")]` annotation, we must mark all routines as -// both unsafe and `#[inline(always)]`. -// -// The fact that the code below is generic does somewhat inhibit us. For -// example, I've noticed that introducing an unlineable `#[cold]` function to -// handle the match case in the loop generates tighter assembly, but there is -// no way to do this in the generic code below because the generic code doesn't -// know what `target_feature` annotation to apply to the unlineable function. -// We could make such functions part of the `Vector` trait, but we instead live -// with the slightly sub-optimal codegen for now since it doesn't seem to have -// a noticeable perf difference. - -use crate::{ - ext::Pointer, - vector::{MoveMask, Vector}, -}; - -/// Finds all occurrences of a single byte in a haystack. -#[derive(Clone, Copy, Debug)] -pub(crate) struct One { - s1: u8, - v1: V, -} - -impl One { - /// The number of bytes we examine per each iteration of our search loop. - const LOOP_SIZE: usize = 4 * V::BYTES; - - /// Create a new searcher that finds occurrences of the byte given. - #[inline(always)] - pub(crate) unsafe fn new(needle: u8) -> One { - One { s1: needle, v1: V::splat(needle) } - } - - /// Returns the needle given to `One::new`. - #[inline(always)] - pub(crate) fn needle1(&self) -> u8 { - self.s1 - } - - /// Return a pointer to the first occurrence of the needle in the given - /// haystack. If no such occurrence exists, then `None` is returned. - /// - /// When a match is found, the pointer returned is guaranteed to be - /// `>= start` and `< end`. - /// - /// # Safety - /// - /// * It must be the case that `start < end` and that the distance between - /// them is at least equal to `V::BYTES`. That is, it must always be valid - /// to do at least an unaligned load of `V` at `start`. - /// * Both `start` and `end` must be valid for reads. - /// * Both `start` and `end` must point to an initialized value. - /// * Both `start` and `end` must point to the same allocated object and - /// must either be in bounds or at most one byte past the end of the - /// allocated object. - /// * Both `start` and `end` must be _derived from_ a pointer to the same - /// object. - /// * The distance between `start` and `end` must not overflow `isize`. - /// * The distance being in bounds must not rely on "wrapping around" the - /// address space. - #[inline(always)] - pub(crate) unsafe fn find_raw( - &self, - start: *const u8, - end: *const u8, - ) -> Option<*const u8> { - // If we want to support vectors bigger than 256 bits, we probably - // need to move up to using a u64 for the masks used below. Currently - // they are 32 bits, which means we're SOL for vectors that need masks - // bigger than 32 bits. Overall unclear until there's a use case. - debug_assert!(V::BYTES <= 32, "vector cannot be bigger than 32 bytes"); - - let topos = V::Mask::first_offset; - let len = end.distance(start); - debug_assert!( - len >= V::BYTES, - "haystack has length {}, but must be at least {}", - len, - V::BYTES - ); - - // Search a possibly unaligned chunk at `start`. This covers any part - // of the haystack prior to where aligned loads can start. - if let Some(cur) = self.search_chunk(start, topos) { - return Some(cur); - } - // Set `cur` to the first V-aligned pointer greater than `start`. - let mut cur = start.add(V::BYTES - (start.as_usize() & V::ALIGN)); - debug_assert!(cur > start && end.sub(V::BYTES) >= start); - if len >= Self::LOOP_SIZE { - while cur <= end.sub(Self::LOOP_SIZE) { - debug_assert_eq!(0, cur.as_usize() % V::BYTES); - - let a = V::load_aligned(cur); - let b = V::load_aligned(cur.add(1 * V::BYTES)); - let c = V::load_aligned(cur.add(2 * V::BYTES)); - let d = V::load_aligned(cur.add(3 * V::BYTES)); - let eqa = self.v1.cmpeq(a); - let eqb = self.v1.cmpeq(b); - let eqc = self.v1.cmpeq(c); - let eqd = self.v1.cmpeq(d); - let or1 = eqa.or(eqb); - let or2 = eqc.or(eqd); - let or3 = or1.or(or2); - if or3.movemask_will_have_non_zero() { - let mask = eqa.movemask(); - if mask.has_non_zero() { - return Some(cur.add(topos(mask))); - } - - let mask = eqb.movemask(); - if mask.has_non_zero() { - return Some(cur.add(1 * V::BYTES).add(topos(mask))); - } - - let mask = eqc.movemask(); - if mask.has_non_zero() { - return Some(cur.add(2 * V::BYTES).add(topos(mask))); - } - - let mask = eqd.movemask(); - debug_assert!(mask.has_non_zero()); - return Some(cur.add(3 * V::BYTES).add(topos(mask))); - } - cur = cur.add(Self::LOOP_SIZE); - } - } - // Handle any leftovers after the aligned loop above. We use unaligned - // loads here, but I believe we are guaranteed that they are aligned - // since `cur` is aligned. - while cur <= end.sub(V::BYTES) { - debug_assert!(end.distance(cur) >= V::BYTES); - if let Some(cur) = self.search_chunk(cur, topos) { - return Some(cur); - } - cur = cur.add(V::BYTES); - } - // Finally handle any remaining bytes less than the size of V. In this - // case, our pointer may indeed be unaligned and the load may overlap - // with the previous one. But that's okay since we know the previous - // load didn't lead to a match (otherwise we wouldn't be here). - if cur < end { - debug_assert!(end.distance(cur) < V::BYTES); - cur = cur.sub(V::BYTES - end.distance(cur)); - debug_assert_eq!(end.distance(cur), V::BYTES); - return self.search_chunk(cur, topos); - } - None - } - - /// Return a pointer to the last occurrence of the needle in the given - /// haystack. If no such occurrence exists, then `None` is returned. - /// - /// When a match is found, the pointer returned is guaranteed to be - /// `>= start` and `< end`. - /// - /// # Safety - /// - /// * It must be the case that `start < end` and that the distance between - /// them is at least equal to `V::BYTES`. That is, it must always be valid - /// to do at least an unaligned load of `V` at `start`. - /// * Both `start` and `end` must be valid for reads. - /// * Both `start` and `end` must point to an initialized value. - /// * Both `start` and `end` must point to the same allocated object and - /// must either be in bounds or at most one byte past the end of the - /// allocated object. - /// * Both `start` and `end` must be _derived from_ a pointer to the same - /// object. - /// * The distance between `start` and `end` must not overflow `isize`. - /// * The distance being in bounds must not rely on "wrapping around" the - /// address space. - #[inline(always)] - pub(crate) unsafe fn rfind_raw( - &self, - start: *const u8, - end: *const u8, - ) -> Option<*const u8> { - // If we want to support vectors bigger than 256 bits, we probably - // need to move up to using a u64 for the masks used below. Currently - // they are 32 bits, which means we're SOL for vectors that need masks - // bigger than 32 bits. Overall unclear until there's a use case. - debug_assert!(V::BYTES <= 32, "vector cannot be bigger than 32 bytes"); - - let topos = V::Mask::last_offset; - let len = end.distance(start); - debug_assert!( - len >= V::BYTES, - "haystack has length {}, but must be at least {}", - len, - V::BYTES - ); - - if let Some(cur) = self.search_chunk(end.sub(V::BYTES), topos) { - return Some(cur); - } - let mut cur = end.sub(end.as_usize() & V::ALIGN); - debug_assert!(start <= cur && cur <= end); - if len >= Self::LOOP_SIZE { - while cur >= start.add(Self::LOOP_SIZE) { - debug_assert_eq!(0, cur.as_usize() % V::BYTES); - - cur = cur.sub(Self::LOOP_SIZE); - let a = V::load_aligned(cur); - let b = V::load_aligned(cur.add(1 * V::BYTES)); - let c = V::load_aligned(cur.add(2 * V::BYTES)); - let d = V::load_aligned(cur.add(3 * V::BYTES)); - let eqa = self.v1.cmpeq(a); - let eqb = self.v1.cmpeq(b); - let eqc = self.v1.cmpeq(c); - let eqd = self.v1.cmpeq(d); - let or1 = eqa.or(eqb); - let or2 = eqc.or(eqd); - let or3 = or1.or(or2); - if or3.movemask_will_have_non_zero() { - let mask = eqd.movemask(); - if mask.has_non_zero() { - return Some(cur.add(3 * V::BYTES).add(topos(mask))); - } - - let mask = eqc.movemask(); - if mask.has_non_zero() { - return Some(cur.add(2 * V::BYTES).add(topos(mask))); - } - - let mask = eqb.movemask(); - if mask.has_non_zero() { - return Some(cur.add(1 * V::BYTES).add(topos(mask))); - } - - let mask = eqa.movemask(); - debug_assert!(mask.has_non_zero()); - return Some(cur.add(topos(mask))); - } - } - } - while cur >= start.add(V::BYTES) { - debug_assert!(cur.distance(start) >= V::BYTES); - cur = cur.sub(V::BYTES); - if let Some(cur) = self.search_chunk(cur, topos) { - return Some(cur); - } - } - if cur > start { - debug_assert!(cur.distance(start) < V::BYTES); - return self.search_chunk(start, topos); - } - None - } - - /// Return a count of all matching bytes in the given haystack. - /// - /// # Safety - /// - /// * It must be the case that `start < end` and that the distance between - /// them is at least equal to `V::BYTES`. That is, it must always be valid - /// to do at least an unaligned load of `V` at `start`. - /// * Both `start` and `end` must be valid for reads. - /// * Both `start` and `end` must point to an initialized value. - /// * Both `start` and `end` must point to the same allocated object and - /// must either be in bounds or at most one byte past the end of the - /// allocated object. - /// * Both `start` and `end` must be _derived from_ a pointer to the same - /// object. - /// * The distance between `start` and `end` must not overflow `isize`. - /// * The distance being in bounds must not rely on "wrapping around" the - /// address space. - #[inline(always)] - pub(crate) unsafe fn count_raw( - &self, - start: *const u8, - end: *const u8, - ) -> usize { - debug_assert!(V::BYTES <= 32, "vector cannot be bigger than 32 bytes"); - - let confirm = |b| b == self.needle1(); - let len = end.distance(start); - debug_assert!( - len >= V::BYTES, - "haystack has length {}, but must be at least {}", - len, - V::BYTES - ); - - // Set `cur` to the first V-aligned pointer greater than `start`. - let mut cur = start.add(V::BYTES - (start.as_usize() & V::ALIGN)); - // Count any matching bytes before we start our aligned loop. - let mut count = count_byte_by_byte(start, cur, confirm); - debug_assert!(cur > start && end.sub(V::BYTES) >= start); - if len >= Self::LOOP_SIZE { - while cur <= end.sub(Self::LOOP_SIZE) { - debug_assert_eq!(0, cur.as_usize() % V::BYTES); - - let a = V::load_aligned(cur); - let b = V::load_aligned(cur.add(1 * V::BYTES)); - let c = V::load_aligned(cur.add(2 * V::BYTES)); - let d = V::load_aligned(cur.add(3 * V::BYTES)); - let eqa = self.v1.cmpeq(a); - let eqb = self.v1.cmpeq(b); - let eqc = self.v1.cmpeq(c); - let eqd = self.v1.cmpeq(d); - count += eqa.movemask().count_ones(); - count += eqb.movemask().count_ones(); - count += eqc.movemask().count_ones(); - count += eqd.movemask().count_ones(); - cur = cur.add(Self::LOOP_SIZE); - } - } - // Handle any leftovers after the aligned loop above. We use unaligned - // loads here, but I believe we are guaranteed that they are aligned - // since `cur` is aligned. - while cur <= end.sub(V::BYTES) { - debug_assert!(end.distance(cur) >= V::BYTES); - let chunk = V::load_unaligned(cur); - count += self.v1.cmpeq(chunk).movemask().count_ones(); - cur = cur.add(V::BYTES); - } - // And finally count any leftovers that weren't caught above. - count += count_byte_by_byte(cur, end, confirm); - count - } - - /// Search `V::BYTES` starting at `cur` via an unaligned load. - /// - /// `mask_to_offset` should be a function that converts a `movemask` to - /// an offset such that `cur.add(offset)` corresponds to a pointer to the - /// match location if one is found. Generally it is expected to use either - /// `mask_to_first_offset` or `mask_to_last_offset`, depending on whether - /// one is implementing a forward or reverse search, respectively. - /// - /// # Safety - /// - /// `cur` must be a valid pointer and it must be valid to do an unaligned - /// load of size `V::BYTES` at `cur`. - #[inline(always)] - unsafe fn search_chunk( - &self, - cur: *const u8, - mask_to_offset: impl Fn(V::Mask) -> usize, - ) -> Option<*const u8> { - let chunk = V::load_unaligned(cur); - let mask = self.v1.cmpeq(chunk).movemask(); - if mask.has_non_zero() { - Some(cur.add(mask_to_offset(mask))) - } else { - None - } - } -} - -/// Finds all occurrences of two bytes in a haystack. -/// -/// That is, this reports matches of one of two possible bytes. For example, -/// searching for `a` or `b` in `afoobar` would report matches at offsets `0`, -/// `4` and `5`. -#[derive(Clone, Copy, Debug)] -pub(crate) struct Two { - s1: u8, - s2: u8, - v1: V, - v2: V, -} - -impl Two { - /// The number of bytes we examine per each iteration of our search loop. - const LOOP_SIZE: usize = 2 * V::BYTES; - - /// Create a new searcher that finds occurrences of the byte given. - #[inline(always)] - pub(crate) unsafe fn new(needle1: u8, needle2: u8) -> Two { - Two { - s1: needle1, - s2: needle2, - v1: V::splat(needle1), - v2: V::splat(needle2), - } - } - - /// Returns the first needle given to `Two::new`. - #[inline(always)] - pub(crate) fn needle1(&self) -> u8 { - self.s1 - } - - /// Returns the second needle given to `Two::new`. - #[inline(always)] - pub(crate) fn needle2(&self) -> u8 { - self.s2 - } - - /// Return a pointer to the first occurrence of one of the needles in the - /// given haystack. If no such occurrence exists, then `None` is returned. - /// - /// When a match is found, the pointer returned is guaranteed to be - /// `>= start` and `< end`. - /// - /// # Safety - /// - /// * It must be the case that `start < end` and that the distance between - /// them is at least equal to `V::BYTES`. That is, it must always be valid - /// to do at least an unaligned load of `V` at `start`. - /// * Both `start` and `end` must be valid for reads. - /// * Both `start` and `end` must point to an initialized value. - /// * Both `start` and `end` must point to the same allocated object and - /// must either be in bounds or at most one byte past the end of the - /// allocated object. - /// * Both `start` and `end` must be _derived from_ a pointer to the same - /// object. - /// * The distance between `start` and `end` must not overflow `isize`. - /// * The distance being in bounds must not rely on "wrapping around" the - /// address space. - #[inline(always)] - pub(crate) unsafe fn find_raw( - &self, - start: *const u8, - end: *const u8, - ) -> Option<*const u8> { - // If we want to support vectors bigger than 256 bits, we probably - // need to move up to using a u64 for the masks used below. Currently - // they are 32 bits, which means we're SOL for vectors that need masks - // bigger than 32 bits. Overall unclear until there's a use case. - debug_assert!(V::BYTES <= 32, "vector cannot be bigger than 32 bytes"); - - let topos = V::Mask::first_offset; - let len = end.distance(start); - debug_assert!( - len >= V::BYTES, - "haystack has length {}, but must be at least {}", - len, - V::BYTES - ); - - // Search a possibly unaligned chunk at `start`. This covers any part - // of the haystack prior to where aligned loads can start. - if let Some(cur) = self.search_chunk(start, topos) { - return Some(cur); - } - // Set `cur` to the first V-aligned pointer greater than `start`. - let mut cur = start.add(V::BYTES - (start.as_usize() & V::ALIGN)); - debug_assert!(cur > start && end.sub(V::BYTES) >= start); - if len >= Self::LOOP_SIZE { - while cur <= end.sub(Self::LOOP_SIZE) { - debug_assert_eq!(0, cur.as_usize() % V::BYTES); - - let a = V::load_aligned(cur); - let b = V::load_aligned(cur.add(V::BYTES)); - let eqa1 = self.v1.cmpeq(a); - let eqb1 = self.v1.cmpeq(b); - let eqa2 = self.v2.cmpeq(a); - let eqb2 = self.v2.cmpeq(b); - let or1 = eqa1.or(eqb1); - let or2 = eqa2.or(eqb2); - let or3 = or1.or(or2); - if or3.movemask_will_have_non_zero() { - let mask = eqa1.movemask().or(eqa2.movemask()); - if mask.has_non_zero() { - return Some(cur.add(topos(mask))); - } - - let mask = eqb1.movemask().or(eqb2.movemask()); - debug_assert!(mask.has_non_zero()); - return Some(cur.add(V::BYTES).add(topos(mask))); - } - cur = cur.add(Self::LOOP_SIZE); - } - } - // Handle any leftovers after the aligned loop above. We use unaligned - // loads here, but I believe we are guaranteed that they are aligned - // since `cur` is aligned. - while cur <= end.sub(V::BYTES) { - debug_assert!(end.distance(cur) >= V::BYTES); - if let Some(cur) = self.search_chunk(cur, topos) { - return Some(cur); - } - cur = cur.add(V::BYTES); - } - // Finally handle any remaining bytes less than the size of V. In this - // case, our pointer may indeed be unaligned and the load may overlap - // with the previous one. But that's okay since we know the previous - // load didn't lead to a match (otherwise we wouldn't be here). - if cur < end { - debug_assert!(end.distance(cur) < V::BYTES); - cur = cur.sub(V::BYTES - end.distance(cur)); - debug_assert_eq!(end.distance(cur), V::BYTES); - return self.search_chunk(cur, topos); - } - None - } - - /// Return a pointer to the last occurrence of the needle in the given - /// haystack. If no such occurrence exists, then `None` is returned. - /// - /// When a match is found, the pointer returned is guaranteed to be - /// `>= start` and `< end`. - /// - /// # Safety - /// - /// * It must be the case that `start < end` and that the distance between - /// them is at least equal to `V::BYTES`. That is, it must always be valid - /// to do at least an unaligned load of `V` at `start`. - /// * Both `start` and `end` must be valid for reads. - /// * Both `start` and `end` must point to an initialized value. - /// * Both `start` and `end` must point to the same allocated object and - /// must either be in bounds or at most one byte past the end of the - /// allocated object. - /// * Both `start` and `end` must be _derived from_ a pointer to the same - /// object. - /// * The distance between `start` and `end` must not overflow `isize`. - /// * The distance being in bounds must not rely on "wrapping around" the - /// address space. - #[inline(always)] - pub(crate) unsafe fn rfind_raw( - &self, - start: *const u8, - end: *const u8, - ) -> Option<*const u8> { - // If we want to support vectors bigger than 256 bits, we probably - // need to move up to using a u64 for the masks used below. Currently - // they are 32 bits, which means we're SOL for vectors that need masks - // bigger than 32 bits. Overall unclear until there's a use case. - debug_assert!(V::BYTES <= 32, "vector cannot be bigger than 32 bytes"); - - let topos = V::Mask::last_offset; - let len = end.distance(start); - debug_assert!( - len >= V::BYTES, - "haystack has length {}, but must be at least {}", - len, - V::BYTES - ); - - if let Some(cur) = self.search_chunk(end.sub(V::BYTES), topos) { - return Some(cur); - } - let mut cur = end.sub(end.as_usize() & V::ALIGN); - debug_assert!(start <= cur && cur <= end); - if len >= Self::LOOP_SIZE { - while cur >= start.add(Self::LOOP_SIZE) { - debug_assert_eq!(0, cur.as_usize() % V::BYTES); - - cur = cur.sub(Self::LOOP_SIZE); - let a = V::load_aligned(cur); - let b = V::load_aligned(cur.add(V::BYTES)); - let eqa1 = self.v1.cmpeq(a); - let eqb1 = self.v1.cmpeq(b); - let eqa2 = self.v2.cmpeq(a); - let eqb2 = self.v2.cmpeq(b); - let or1 = eqa1.or(eqb1); - let or2 = eqa2.or(eqb2); - let or3 = or1.or(or2); - if or3.movemask_will_have_non_zero() { - let mask = eqb1.movemask().or(eqb2.movemask()); - if mask.has_non_zero() { - return Some(cur.add(V::BYTES).add(topos(mask))); - } - - let mask = eqa1.movemask().or(eqa2.movemask()); - debug_assert!(mask.has_non_zero()); - return Some(cur.add(topos(mask))); - } - } - } - while cur >= start.add(V::BYTES) { - debug_assert!(cur.distance(start) >= V::BYTES); - cur = cur.sub(V::BYTES); - if let Some(cur) = self.search_chunk(cur, topos) { - return Some(cur); - } - } - if cur > start { - debug_assert!(cur.distance(start) < V::BYTES); - return self.search_chunk(start, topos); - } - None - } - - /// Search `V::BYTES` starting at `cur` via an unaligned load. - /// - /// `mask_to_offset` should be a function that converts a `movemask` to - /// an offset such that `cur.add(offset)` corresponds to a pointer to the - /// match location if one is found. Generally it is expected to use either - /// `mask_to_first_offset` or `mask_to_last_offset`, depending on whether - /// one is implementing a forward or reverse search, respectively. - /// - /// # Safety - /// - /// `cur` must be a valid pointer and it must be valid to do an unaligned - /// load of size `V::BYTES` at `cur`. - #[inline(always)] - unsafe fn search_chunk( - &self, - cur: *const u8, - mask_to_offset: impl Fn(V::Mask) -> usize, - ) -> Option<*const u8> { - let chunk = V::load_unaligned(cur); - let eq1 = self.v1.cmpeq(chunk); - let eq2 = self.v2.cmpeq(chunk); - let mask = eq1.or(eq2).movemask(); - if mask.has_non_zero() { - let mask1 = eq1.movemask(); - let mask2 = eq2.movemask(); - Some(cur.add(mask_to_offset(mask1.or(mask2)))) - } else { - None - } - } -} - -/// Finds all occurrences of two bytes in a haystack. -/// -/// That is, this reports matches of one of two possible bytes. For example, -/// searching for `a` or `b` in `afoobar` would report matches at offsets `0`, -/// `4` and `5`. -#[derive(Clone, Copy, Debug)] -pub(crate) struct Three { - s1: u8, - s2: u8, - s3: u8, - v1: V, - v2: V, - v3: V, -} - -impl Three { - /// The number of bytes we examine per each iteration of our search loop. - const LOOP_SIZE: usize = 2 * V::BYTES; - - /// Create a new searcher that finds occurrences of the byte given. - #[inline(always)] - pub(crate) unsafe fn new( - needle1: u8, - needle2: u8, - needle3: u8, - ) -> Three { - Three { - s1: needle1, - s2: needle2, - s3: needle3, - v1: V::splat(needle1), - v2: V::splat(needle2), - v3: V::splat(needle3), - } - } - - /// Returns the first needle given to `Three::new`. - #[inline(always)] - pub(crate) fn needle1(&self) -> u8 { - self.s1 - } - - /// Returns the second needle given to `Three::new`. - #[inline(always)] - pub(crate) fn needle2(&self) -> u8 { - self.s2 - } - - /// Returns the third needle given to `Three::new`. - #[inline(always)] - pub(crate) fn needle3(&self) -> u8 { - self.s3 - } - - /// Return a pointer to the first occurrence of one of the needles in the - /// given haystack. If no such occurrence exists, then `None` is returned. - /// - /// When a match is found, the pointer returned is guaranteed to be - /// `>= start` and `< end`. - /// - /// # Safety - /// - /// * It must be the case that `start < end` and that the distance between - /// them is at least equal to `V::BYTES`. That is, it must always be valid - /// to do at least an unaligned load of `V` at `start`. - /// * Both `start` and `end` must be valid for reads. - /// * Both `start` and `end` must point to an initialized value. - /// * Both `start` and `end` must point to the same allocated object and - /// must either be in bounds or at most one byte past the end of the - /// allocated object. - /// * Both `start` and `end` must be _derived from_ a pointer to the same - /// object. - /// * The distance between `start` and `end` must not overflow `isize`. - /// * The distance being in bounds must not rely on "wrapping around" the - /// address space. - #[inline(always)] - pub(crate) unsafe fn find_raw( - &self, - start: *const u8, - end: *const u8, - ) -> Option<*const u8> { - // If we want to support vectors bigger than 256 bits, we probably - // need to move up to using a u64 for the masks used below. Currently - // they are 32 bits, which means we're SOL for vectors that need masks - // bigger than 32 bits. Overall unclear until there's a use case. - debug_assert!(V::BYTES <= 32, "vector cannot be bigger than 32 bytes"); - - let topos = V::Mask::first_offset; - let len = end.distance(start); - debug_assert!( - len >= V::BYTES, - "haystack has length {}, but must be at least {}", - len, - V::BYTES - ); - - // Search a possibly unaligned chunk at `start`. This covers any part - // of the haystack prior to where aligned loads can start. - if let Some(cur) = self.search_chunk(start, topos) { - return Some(cur); - } - // Set `cur` to the first V-aligned pointer greater than `start`. - let mut cur = start.add(V::BYTES - (start.as_usize() & V::ALIGN)); - debug_assert!(cur > start && end.sub(V::BYTES) >= start); - if len >= Self::LOOP_SIZE { - while cur <= end.sub(Self::LOOP_SIZE) { - debug_assert_eq!(0, cur.as_usize() % V::BYTES); - - let a = V::load_aligned(cur); - let b = V::load_aligned(cur.add(V::BYTES)); - let eqa1 = self.v1.cmpeq(a); - let eqb1 = self.v1.cmpeq(b); - let eqa2 = self.v2.cmpeq(a); - let eqb2 = self.v2.cmpeq(b); - let eqa3 = self.v3.cmpeq(a); - let eqb3 = self.v3.cmpeq(b); - let or1 = eqa1.or(eqb1); - let or2 = eqa2.or(eqb2); - let or3 = eqa3.or(eqb3); - let or4 = or1.or(or2); - let or5 = or3.or(or4); - if or5.movemask_will_have_non_zero() { - let mask = eqa1 - .movemask() - .or(eqa2.movemask()) - .or(eqa3.movemask()); - if mask.has_non_zero() { - return Some(cur.add(topos(mask))); - } - - let mask = eqb1 - .movemask() - .or(eqb2.movemask()) - .or(eqb3.movemask()); - debug_assert!(mask.has_non_zero()); - return Some(cur.add(V::BYTES).add(topos(mask))); - } - cur = cur.add(Self::LOOP_SIZE); - } - } - // Handle any leftovers after the aligned loop above. We use unaligned - // loads here, but I believe we are guaranteed that they are aligned - // since `cur` is aligned. - while cur <= end.sub(V::BYTES) { - debug_assert!(end.distance(cur) >= V::BYTES); - if let Some(cur) = self.search_chunk(cur, topos) { - return Some(cur); - } - cur = cur.add(V::BYTES); - } - // Finally handle any remaining bytes less than the size of V. In this - // case, our pointer may indeed be unaligned and the load may overlap - // with the previous one. But that's okay since we know the previous - // load didn't lead to a match (otherwise we wouldn't be here). - if cur < end { - debug_assert!(end.distance(cur) < V::BYTES); - cur = cur.sub(V::BYTES - end.distance(cur)); - debug_assert_eq!(end.distance(cur), V::BYTES); - return self.search_chunk(cur, topos); - } - None - } - - /// Return a pointer to the last occurrence of the needle in the given - /// haystack. If no such occurrence exists, then `None` is returned. - /// - /// When a match is found, the pointer returned is guaranteed to be - /// `>= start` and `< end`. - /// - /// # Safety - /// - /// * It must be the case that `start < end` and that the distance between - /// them is at least equal to `V::BYTES`. That is, it must always be valid - /// to do at least an unaligned load of `V` at `start`. - /// * Both `start` and `end` must be valid for reads. - /// * Both `start` and `end` must point to an initialized value. - /// * Both `start` and `end` must point to the same allocated object and - /// must either be in bounds or at most one byte past the end of the - /// allocated object. - /// * Both `start` and `end` must be _derived from_ a pointer to the same - /// object. - /// * The distance between `start` and `end` must not overflow `isize`. - /// * The distance being in bounds must not rely on "wrapping around" the - /// address space. - #[inline(always)] - pub(crate) unsafe fn rfind_raw( - &self, - start: *const u8, - end: *const u8, - ) -> Option<*const u8> { - // If we want to support vectors bigger than 256 bits, we probably - // need to move up to using a u64 for the masks used below. Currently - // they are 32 bits, which means we're SOL for vectors that need masks - // bigger than 32 bits. Overall unclear until there's a use case. - debug_assert!(V::BYTES <= 32, "vector cannot be bigger than 32 bytes"); - - let topos = V::Mask::last_offset; - let len = end.distance(start); - debug_assert!( - len >= V::BYTES, - "haystack has length {}, but must be at least {}", - len, - V::BYTES - ); - - if let Some(cur) = self.search_chunk(end.sub(V::BYTES), topos) { - return Some(cur); - } - let mut cur = end.sub(end.as_usize() & V::ALIGN); - debug_assert!(start <= cur && cur <= end); - if len >= Self::LOOP_SIZE { - while cur >= start.add(Self::LOOP_SIZE) { - debug_assert_eq!(0, cur.as_usize() % V::BYTES); - - cur = cur.sub(Self::LOOP_SIZE); - let a = V::load_aligned(cur); - let b = V::load_aligned(cur.add(V::BYTES)); - let eqa1 = self.v1.cmpeq(a); - let eqb1 = self.v1.cmpeq(b); - let eqa2 = self.v2.cmpeq(a); - let eqb2 = self.v2.cmpeq(b); - let eqa3 = self.v3.cmpeq(a); - let eqb3 = self.v3.cmpeq(b); - let or1 = eqa1.or(eqb1); - let or2 = eqa2.or(eqb2); - let or3 = eqa3.or(eqb3); - let or4 = or1.or(or2); - let or5 = or3.or(or4); - if or5.movemask_will_have_non_zero() { - let mask = eqb1 - .movemask() - .or(eqb2.movemask()) - .or(eqb3.movemask()); - if mask.has_non_zero() { - return Some(cur.add(V::BYTES).add(topos(mask))); - } - - let mask = eqa1 - .movemask() - .or(eqa2.movemask()) - .or(eqa3.movemask()); - debug_assert!(mask.has_non_zero()); - return Some(cur.add(topos(mask))); - } - } - } - while cur >= start.add(V::BYTES) { - debug_assert!(cur.distance(start) >= V::BYTES); - cur = cur.sub(V::BYTES); - if let Some(cur) = self.search_chunk(cur, topos) { - return Some(cur); - } - } - if cur > start { - debug_assert!(cur.distance(start) < V::BYTES); - return self.search_chunk(start, topos); - } - None - } - - /// Search `V::BYTES` starting at `cur` via an unaligned load. - /// - /// `mask_to_offset` should be a function that converts a `movemask` to - /// an offset such that `cur.add(offset)` corresponds to a pointer to the - /// match location if one is found. Generally it is expected to use either - /// `mask_to_first_offset` or `mask_to_last_offset`, depending on whether - /// one is implementing a forward or reverse search, respectively. - /// - /// # Safety - /// - /// `cur` must be a valid pointer and it must be valid to do an unaligned - /// load of size `V::BYTES` at `cur`. - #[inline(always)] - unsafe fn search_chunk( - &self, - cur: *const u8, - mask_to_offset: impl Fn(V::Mask) -> usize, - ) -> Option<*const u8> { - let chunk = V::load_unaligned(cur); - let eq1 = self.v1.cmpeq(chunk); - let eq2 = self.v2.cmpeq(chunk); - let eq3 = self.v3.cmpeq(chunk); - let mask = eq1.or(eq2).or(eq3).movemask(); - if mask.has_non_zero() { - let mask1 = eq1.movemask(); - let mask2 = eq2.movemask(); - let mask3 = eq3.movemask(); - Some(cur.add(mask_to_offset(mask1.or(mask2).or(mask3)))) - } else { - None - } - } -} - -/// An iterator over all occurrences of a set of bytes in a haystack. -/// -/// This iterator implements the routines necessary to provide a -/// `DoubleEndedIterator` impl, which means it can also be used to find -/// occurrences in reverse order. -/// -/// The lifetime parameters are as follows: -/// -/// * `'h` refers to the lifetime of the haystack being searched. -/// -/// This type is intended to be used to implement all iterators for the -/// `memchr` family of functions. It handles a tiny bit of marginally tricky -/// raw pointer math, but otherwise expects the caller to provide `find_raw` -/// and `rfind_raw` routines for each call of `next` and `next_back`, -/// respectively. -#[derive(Clone, Debug)] -pub(crate) struct Iter<'h> { - /// The original starting point into the haystack. We use this to convert - /// pointers to offsets. - original_start: *const u8, - /// The current starting point into the haystack. That is, where the next - /// search will begin. - start: *const u8, - /// The current ending point into the haystack. That is, where the next - /// reverse search will begin. - end: *const u8, - /// A marker for tracking the lifetime of the start/cur_start/cur_end - /// pointers above, which all point into the haystack. - haystack: core::marker::PhantomData<&'h [u8]>, -} - -// SAFETY: Iter contains no shared references to anything that performs any -// interior mutations. Also, the lifetime guarantees that Iter will not outlive -// the haystack. -unsafe impl<'h> Send for Iter<'h> {} - -// SAFETY: Iter perform no interior mutations, therefore no explicit -// synchronization is necessary. Also, the lifetime guarantees that Iter will -// not outlive the haystack. -unsafe impl<'h> Sync for Iter<'h> {} - -impl<'h> Iter<'h> { - /// Create a new generic memchr iterator. - #[inline(always)] - pub(crate) fn new(haystack: &'h [u8]) -> Iter<'h> { - Iter { - original_start: haystack.as_ptr(), - start: haystack.as_ptr(), - end: haystack.as_ptr().wrapping_add(haystack.len()), - haystack: core::marker::PhantomData, - } - } - - /// Returns the next occurrence in the forward direction. - /// - /// # Safety - /// - /// Callers must ensure that if a pointer is returned from the closure - /// provided, then it must be greater than or equal to the start pointer - /// and less than the end pointer. - #[inline(always)] - pub(crate) unsafe fn next( - &mut self, - mut find_raw: impl FnMut(*const u8, *const u8) -> Option<*const u8>, - ) -> Option { - // SAFETY: Pointers are derived directly from the same &[u8] haystack. - // We only ever modify start/end corresponding to a matching offset - // found between start and end. Thus all changes to start/end maintain - // our safety requirements. - // - // The only other assumption we rely on is that the pointer returned - // by `find_raw` satisfies `self.start <= found < self.end`, and that - // safety contract is forwarded to the caller. - let found = find_raw(self.start, self.end)?; - let result = found.distance(self.original_start); - self.start = found.add(1); - Some(result) - } - - /// Returns the number of remaining elements in this iterator. - #[inline(always)] - pub(crate) fn count( - self, - mut count_raw: impl FnMut(*const u8, *const u8) -> usize, - ) -> usize { - // SAFETY: Pointers are derived directly from the same &[u8] haystack. - // We only ever modify start/end corresponding to a matching offset - // found between start and end. Thus all changes to start/end maintain - // our safety requirements. - count_raw(self.start, self.end) - } - - /// Returns the next occurrence in reverse. - /// - /// # Safety - /// - /// Callers must ensure that if a pointer is returned from the closure - /// provided, then it must be greater than or equal to the start pointer - /// and less than the end pointer. - #[inline(always)] - pub(crate) unsafe fn next_back( - &mut self, - mut rfind_raw: impl FnMut(*const u8, *const u8) -> Option<*const u8>, - ) -> Option { - // SAFETY: Pointers are derived directly from the same &[u8] haystack. - // We only ever modify start/end corresponding to a matching offset - // found between start and end. Thus all changes to start/end maintain - // our safety requirements. - // - // The only other assumption we rely on is that the pointer returned - // by `rfind_raw` satisfies `self.start <= found < self.end`, and that - // safety contract is forwarded to the caller. - let found = rfind_raw(self.start, self.end)?; - let result = found.distance(self.original_start); - self.end = found; - Some(result) - } - - /// Provides an implementation of `Iterator::size_hint`. - #[inline(always)] - pub(crate) fn size_hint(&self) -> (usize, Option) { - (0, Some(self.end.as_usize().saturating_sub(self.start.as_usize()))) - } -} - -/// Search a slice using a function that operates on raw pointers. -/// -/// Given a function to search a contiguous sequence of memory for the location -/// of a non-empty set of bytes, this will execute that search on a slice of -/// bytes. The pointer returned by the given function will be converted to an -/// offset relative to the starting point of the given slice. That is, if a -/// match is found, the offset returned by this routine is guaranteed to be a -/// valid index into `haystack`. -/// -/// Callers may use this for a forward or reverse search. -/// -/// # Safety -/// -/// Callers must ensure that if a pointer is returned by `find_raw`, then the -/// pointer must be greater than or equal to the starting pointer and less than -/// the end pointer. -#[inline(always)] -pub(crate) unsafe fn search_slice_with_raw( - haystack: &[u8], - mut find_raw: impl FnMut(*const u8, *const u8) -> Option<*const u8>, -) -> Option { - // SAFETY: We rely on `find_raw` to return a correct and valid pointer, but - // otherwise, `start` and `end` are valid due to the guarantees provided by - // a &[u8]. - let start = haystack.as_ptr(); - let end = start.add(haystack.len()); - let found = find_raw(start, end)?; - Some(found.distance(start)) -} - -/// Performs a forward byte-at-a-time loop until either `ptr >= end_ptr` or -/// until `confirm(*ptr)` returns `true`. If the former occurs, then `None` is -/// returned. If the latter occurs, then the pointer at which `confirm` returns -/// `true` is returned. -/// -/// # Safety -/// -/// Callers must provide valid pointers and they must satisfy `start_ptr <= -/// ptr` and `ptr <= end_ptr`. -#[inline(always)] -pub(crate) unsafe fn fwd_byte_by_byte bool>( - start: *const u8, - end: *const u8, - confirm: F, -) -> Option<*const u8> { - debug_assert!(start <= end); - let mut ptr = start; - while ptr < end { - if confirm(*ptr) { - return Some(ptr); - } - ptr = ptr.offset(1); - } - None -} - -/// Performs a reverse byte-at-a-time loop until either `ptr < start_ptr` or -/// until `confirm(*ptr)` returns `true`. If the former occurs, then `None` is -/// returned. If the latter occurs, then the pointer at which `confirm` returns -/// `true` is returned. -/// -/// # Safety -/// -/// Callers must provide valid pointers and they must satisfy `start_ptr <= -/// ptr` and `ptr <= end_ptr`. -#[inline(always)] -pub(crate) unsafe fn rev_byte_by_byte bool>( - start: *const u8, - end: *const u8, - confirm: F, -) -> Option<*const u8> { - debug_assert!(start <= end); - - let mut ptr = end; - while ptr > start { - ptr = ptr.offset(-1); - if confirm(*ptr) { - return Some(ptr); - } - } - None -} - -/// Performs a forward byte-at-a-time loop until `ptr >= end_ptr` and returns -/// the number of times `confirm(*ptr)` returns `true`. -/// -/// # Safety -/// -/// Callers must provide valid pointers and they must satisfy `start_ptr <= -/// ptr` and `ptr <= end_ptr`. -#[inline(always)] -pub(crate) unsafe fn count_byte_by_byte bool>( - start: *const u8, - end: *const u8, - confirm: F, -) -> usize { - debug_assert!(start <= end); - let mut ptr = start; - let mut count = 0; - while ptr < end { - if confirm(*ptr) { - count += 1; - } - ptr = ptr.offset(1); - } - count -} diff -Nru temporalio-1.3.0/vendor/memchr/src/arch/generic/mod.rs temporalio-1.3.0/vendor/memchr/src/arch/generic/mod.rs --- temporalio-1.3.0/vendor/memchr/src/arch/generic/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/arch/generic/mod.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,14 +0,0 @@ -/*! -This module defines "generic" routines that can be specialized to specific -architectures. - -We don't expose this module primarily because it would require exposing all -of the internal infrastructure required to write these generic routines. -That infrastructure should be treated as an implementation detail so that -it is allowed to evolve. Instead, what we expose are architecture specific -instantiations of these generic implementations. The generic code just lets us -write the code once (usually). -*/ - -pub(crate) mod memchr; -pub(crate) mod packedpair; diff -Nru temporalio-1.3.0/vendor/memchr/src/arch/generic/packedpair.rs temporalio-1.3.0/vendor/memchr/src/arch/generic/packedpair.rs --- temporalio-1.3.0/vendor/memchr/src/arch/generic/packedpair.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/arch/generic/packedpair.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,317 +0,0 @@ -/*! -Generic crate-internal routines for the "packed pair" SIMD algorithm. - -The "packed pair" algorithm is based on the [generic SIMD] algorithm. The main -difference is that it (by default) uses a background distribution of byte -frequencies to heuristically select the pair of bytes to search for. - -[generic SIMD]: http://0x80.pl/articles/simd-strfind.html#first-and-last -*/ - -use crate::{ - arch::all::{is_equal_raw, packedpair::Pair}, - ext::Pointer, - vector::{MoveMask, Vector}, -}; - -/// A generic architecture dependent "packed pair" finder. -/// -/// This finder picks two bytes that it believes have high predictive power -/// for indicating an overall match of a needle. Depending on whether -/// `Finder::find` or `Finder::find_prefilter` is used, it reports offsets -/// where the needle matches or could match. In the prefilter case, candidates -/// are reported whenever the [`Pair`] of bytes given matches. -/// -/// This is architecture dependent because it uses specific vector operations -/// to look for occurrences of the pair of bytes. -/// -/// This type is not meant to be exported and is instead meant to be used as -/// the implementation for architecture specific facades. Why? Because it's a -/// bit of a quirky API that requires `inline(always)` annotations. And pretty -/// much everything has safety obligations due (at least) to the caller needing -/// to inline calls into routines marked with -/// `#[target_feature(enable = "...")]`. -#[derive(Clone, Copy, Debug)] -pub(crate) struct Finder { - pair: Pair, - v1: V, - v2: V, - min_haystack_len: usize, -} - -impl Finder { - /// Create a new pair searcher. The searcher returned can either report - /// exact matches of `needle` or act as a prefilter and report candidate - /// positions of `needle`. - /// - /// # Safety - /// - /// Callers must ensure that whatever vector type this routine is called - /// with is supported by the current environment. - /// - /// Callers must also ensure that `needle.len() >= 2`. - #[inline(always)] - pub(crate) unsafe fn new(needle: &[u8], pair: Pair) -> Finder { - let max_index = pair.index1().max(pair.index2()); - let min_haystack_len = - core::cmp::max(needle.len(), usize::from(max_index) + V::BYTES); - let v1 = V::splat(needle[usize::from(pair.index1())]); - let v2 = V::splat(needle[usize::from(pair.index2())]); - Finder { pair, v1, v2, min_haystack_len } - } - - /// Searches the given haystack for the given needle. The needle given - /// should be the same as the needle that this finder was initialized - /// with. - /// - /// # Panics - /// - /// When `haystack.len()` is less than [`Finder::min_haystack_len`]. - /// - /// # Safety - /// - /// Since this is meant to be used with vector functions, callers need to - /// specialize this inside of a function with a `target_feature` attribute. - /// Therefore, callers must ensure that whatever target feature is being - /// used supports the vector functions that this function is specialized - /// for. (For the specific vector functions used, see the Vector trait - /// implementations.) - #[inline(always)] - pub(crate) unsafe fn find( - &self, - haystack: &[u8], - needle: &[u8], - ) -> Option { - assert!( - haystack.len() >= self.min_haystack_len, - "haystack too small, should be at least {} but got {}", - self.min_haystack_len, - haystack.len(), - ); - - let all = V::Mask::all_zeros_except_least_significant(0); - let start = haystack.as_ptr(); - let end = start.add(haystack.len()); - let max = end.sub(self.min_haystack_len); - let mut cur = start; - - // N.B. I did experiment with unrolling the loop to deal with size(V) - // bytes at a time and 2*size(V) bytes at a time. The double unroll - // was marginally faster while the quadruple unroll was unambiguously - // slower. In the end, I decided the complexity from unrolling wasn't - // worth it. I used the memmem/krate/prebuilt/huge-en/ benchmarks to - // compare. - while cur <= max { - if let Some(chunki) = self.find_in_chunk(needle, cur, end, all) { - return Some(matched(start, cur, chunki)); - } - cur = cur.add(V::BYTES); - } - if cur < end { - let remaining = end.distance(cur); - debug_assert!( - remaining < self.min_haystack_len, - "remaining bytes should be smaller than the minimum haystack \ - length of {}, but there are {} bytes remaining", - self.min_haystack_len, - remaining, - ); - if remaining < needle.len() { - return None; - } - debug_assert!( - max < cur, - "after main loop, cur should have exceeded max", - ); - let overlap = cur.distance(max); - debug_assert!( - overlap > 0, - "overlap ({}) must always be non-zero", - overlap, - ); - debug_assert!( - overlap < V::BYTES, - "overlap ({}) cannot possibly be >= than a vector ({})", - overlap, - V::BYTES, - ); - // The mask has all of its bits set except for the first N least - // significant bits, where N=overlap. This way, any matches that - // occur in find_in_chunk within the overlap are automatically - // ignored. - let mask = V::Mask::all_zeros_except_least_significant(overlap); - cur = max; - let m = self.find_in_chunk(needle, cur, end, mask); - if let Some(chunki) = m { - return Some(matched(start, cur, chunki)); - } - } - None - } - - /// Searches the given haystack for offsets that represent candidate - /// matches of the `needle` given to this finder's constructor. The offsets - /// returned, if they are a match, correspond to the starting offset of - /// `needle` in the given `haystack`. - /// - /// # Panics - /// - /// When `haystack.len()` is less than [`Finder::min_haystack_len`]. - /// - /// # Safety - /// - /// Since this is meant to be used with vector functions, callers need to - /// specialize this inside of a function with a `target_feature` attribute. - /// Therefore, callers must ensure that whatever target feature is being - /// used supports the vector functions that this function is specialized - /// for. (For the specific vector functions used, see the Vector trait - /// implementations.) - #[inline(always)] - pub(crate) unsafe fn find_prefilter( - &self, - haystack: &[u8], - ) -> Option { - assert!( - haystack.len() >= self.min_haystack_len, - "haystack too small, should be at least {} but got {}", - self.min_haystack_len, - haystack.len(), - ); - - let start = haystack.as_ptr(); - let end = start.add(haystack.len()); - let max = end.sub(self.min_haystack_len); - let mut cur = start; - - // N.B. I did experiment with unrolling the loop to deal with size(V) - // bytes at a time and 2*size(V) bytes at a time. The double unroll - // was marginally faster while the quadruple unroll was unambiguously - // slower. In the end, I decided the complexity from unrolling wasn't - // worth it. I used the memmem/krate/prebuilt/huge-en/ benchmarks to - // compare. - while cur <= max { - if let Some(chunki) = self.find_prefilter_in_chunk(cur) { - return Some(matched(start, cur, chunki)); - } - cur = cur.add(V::BYTES); - } - if cur < end { - // This routine immediately quits if a candidate match is found. - // That means that if we're here, no candidate matches have been - // found at or before 'ptr'. Thus, we don't need to mask anything - // out even though we might technically search part of the haystack - // that we've already searched (because we know it can't match). - cur = max; - if let Some(chunki) = self.find_prefilter_in_chunk(cur) { - return Some(matched(start, cur, chunki)); - } - } - None - } - - /// Search for an occurrence of our byte pair from the needle in the chunk - /// pointed to by cur, with the end of the haystack pointed to by end. - /// When an occurrence is found, memcmp is run to check if a match occurs - /// at the corresponding position. - /// - /// `mask` should have bits set corresponding the positions in the chunk - /// in which matches are considered. This is only used for the last vector - /// load where the beginning of the vector might have overlapped with the - /// last load in the main loop. The mask lets us avoid visiting positions - /// that have already been discarded as matches. - /// - /// # Safety - /// - /// It must be safe to do an unaligned read of size(V) bytes starting at - /// both (cur + self.index1) and (cur + self.index2). It must also be safe - /// to do unaligned loads on cur up to (end - needle.len()). - #[inline(always)] - unsafe fn find_in_chunk( - &self, - needle: &[u8], - cur: *const u8, - end: *const u8, - mask: V::Mask, - ) -> Option { - let index1 = usize::from(self.pair.index1()); - let index2 = usize::from(self.pair.index2()); - let chunk1 = V::load_unaligned(cur.add(index1)); - let chunk2 = V::load_unaligned(cur.add(index2)); - let eq1 = chunk1.cmpeq(self.v1); - let eq2 = chunk2.cmpeq(self.v2); - - let mut offsets = eq1.and(eq2).movemask().and(mask); - while offsets.has_non_zero() { - let offset = offsets.first_offset(); - let cur = cur.add(offset); - if end.sub(needle.len()) < cur { - return None; - } - if is_equal_raw(needle.as_ptr(), cur, needle.len()) { - return Some(offset); - } - offsets = offsets.clear_least_significant_bit(); - } - None - } - - /// Search for an occurrence of our byte pair from the needle in the chunk - /// pointed to by cur, with the end of the haystack pointed to by end. - /// When an occurrence is found, memcmp is run to check if a match occurs - /// at the corresponding position. - /// - /// # Safety - /// - /// It must be safe to do an unaligned read of size(V) bytes starting at - /// both (cur + self.index1) and (cur + self.index2). It must also be safe - /// to do unaligned reads on cur up to (end - needle.len()). - #[inline(always)] - unsafe fn find_prefilter_in_chunk(&self, cur: *const u8) -> Option { - let index1 = usize::from(self.pair.index1()); - let index2 = usize::from(self.pair.index2()); - let chunk1 = V::load_unaligned(cur.add(index1)); - let chunk2 = V::load_unaligned(cur.add(index2)); - let eq1 = chunk1.cmpeq(self.v1); - let eq2 = chunk2.cmpeq(self.v2); - - let offsets = eq1.and(eq2).movemask(); - if !offsets.has_non_zero() { - return None; - } - Some(offsets.first_offset()) - } - - /// Returns the pair of offsets (into the needle) used to check as a - /// predicate before confirming whether a needle exists at a particular - /// position. - #[inline] - pub(crate) fn pair(&self) -> &Pair { - &self.pair - } - - /// Returns the minimum haystack length that this `Finder` can search. - /// - /// Providing a haystack to this `Finder` shorter than this length is - /// guaranteed to result in a panic. - #[inline(always)] - pub(crate) fn min_haystack_len(&self) -> usize { - self.min_haystack_len - } -} - -/// Accepts a chunk-relative offset and returns a haystack relative offset. -/// -/// This used to be marked `#[cold]` and `#[inline(never)]`, but I couldn't -/// observe a consistent measureable difference between that and just inlining -/// it. So we go with inlining it. -/// -/// # Safety -/// -/// Same at `ptr::offset_from` in addition to `cur >= start`. -#[inline(always)] -unsafe fn matched(start: *const u8, cur: *const u8, chunki: usize) -> usize { - cur.distance(start) + chunki -} - -// If you're looking for tests, those are run for each instantiation of the -// above code. So for example, see arch::x86_64::sse2::packedpair. diff -Nru temporalio-1.3.0/vendor/memchr/src/arch/mod.rs temporalio-1.3.0/vendor/memchr/src/arch/mod.rs --- temporalio-1.3.0/vendor/memchr/src/arch/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/arch/mod.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,16 +0,0 @@ -/*! -A module with low-level architecture dependent routines. - -These routines are useful as primitives for tasks not covered by the higher -level crate API. -*/ - -pub mod all; -pub(crate) mod generic; - -#[cfg(target_arch = "aarch64")] -pub mod aarch64; -#[cfg(target_arch = "wasm32")] -pub mod wasm32; -#[cfg(target_arch = "x86_64")] -pub mod x86_64; diff -Nru temporalio-1.3.0/vendor/memchr/src/arch/wasm32/memchr.rs temporalio-1.3.0/vendor/memchr/src/arch/wasm32/memchr.rs --- temporalio-1.3.0/vendor/memchr/src/arch/wasm32/memchr.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/arch/wasm32/memchr.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,137 +0,0 @@ -/*! -Wrapper routines for `memchr` and friends. - -These routines choose the best implementation at compile time. (This is -different from `x86_64` because it is expected that `simd128` is almost always -available for `wasm32` targets.) -*/ - -macro_rules! defraw { - ($ty:ident, $find:ident, $start:ident, $end:ident, $($needles:ident),+) => {{ - #[cfg(target_feature = "simd128")] - { - use crate::arch::wasm32::simd128::memchr::$ty; - - debug!("chose simd128 for {}", stringify!($ty)); - debug_assert!($ty::is_available()); - // SAFETY: We know that wasm memchr is always available whenever - // code is compiled for `wasm32` with the `simd128` target feature - // enabled. - $ty::new_unchecked($($needles),+).$find($start, $end) - } - #[cfg(not(target_feature = "simd128"))] - { - use crate::arch::all::memchr::$ty; - - debug!( - "no simd128 feature available, using fallback for {}", - stringify!($ty), - ); - $ty::new($($needles),+).$find($start, $end) - } - }} -} - -/// memchr, but using raw pointers to represent the haystack. -/// -/// # Safety -/// -/// Pointers must be valid. See `One::find_raw`. -#[inline(always)] -pub(crate) unsafe fn memchr_raw( - n1: u8, - start: *const u8, - end: *const u8, -) -> Option<*const u8> { - defraw!(One, find_raw, start, end, n1) -} - -/// memrchr, but using raw pointers to represent the haystack. -/// -/// # Safety -/// -/// Pointers must be valid. See `One::rfind_raw`. -#[inline(always)] -pub(crate) unsafe fn memrchr_raw( - n1: u8, - start: *const u8, - end: *const u8, -) -> Option<*const u8> { - defraw!(One, rfind_raw, start, end, n1) -} - -/// memchr2, but using raw pointers to represent the haystack. -/// -/// # Safety -/// -/// Pointers must be valid. See `Two::find_raw`. -#[inline(always)] -pub(crate) unsafe fn memchr2_raw( - n1: u8, - n2: u8, - start: *const u8, - end: *const u8, -) -> Option<*const u8> { - defraw!(Two, find_raw, start, end, n1, n2) -} - -/// memrchr2, but using raw pointers to represent the haystack. -/// -/// # Safety -/// -/// Pointers must be valid. See `Two::rfind_raw`. -#[inline(always)] -pub(crate) unsafe fn memrchr2_raw( - n1: u8, - n2: u8, - start: *const u8, - end: *const u8, -) -> Option<*const u8> { - defraw!(Two, rfind_raw, start, end, n1, n2) -} - -/// memchr3, but using raw pointers to represent the haystack. -/// -/// # Safety -/// -/// Pointers must be valid. See `Three::find_raw`. -#[inline(always)] -pub(crate) unsafe fn memchr3_raw( - n1: u8, - n2: u8, - n3: u8, - start: *const u8, - end: *const u8, -) -> Option<*const u8> { - defraw!(Three, find_raw, start, end, n1, n2, n3) -} - -/// memrchr3, but using raw pointers to represent the haystack. -/// -/// # Safety -/// -/// Pointers must be valid. See `Three::rfind_raw`. -#[inline(always)] -pub(crate) unsafe fn memrchr3_raw( - n1: u8, - n2: u8, - n3: u8, - start: *const u8, - end: *const u8, -) -> Option<*const u8> { - defraw!(Three, rfind_raw, start, end, n1, n2, n3) -} - -/// Count all matching bytes, but using raw pointers to represent the haystack. -/// -/// # Safety -/// -/// Pointers must be valid. See `One::count_raw`. -#[inline(always)] -pub(crate) unsafe fn count_raw( - n1: u8, - start: *const u8, - end: *const u8, -) -> usize { - defraw!(One, count_raw, start, end, n1) -} diff -Nru temporalio-1.3.0/vendor/memchr/src/arch/wasm32/mod.rs temporalio-1.3.0/vendor/memchr/src/arch/wasm32/mod.rs --- temporalio-1.3.0/vendor/memchr/src/arch/wasm32/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/arch/wasm32/mod.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ -/*! -Vector algorithms for the `wasm32` target. -*/ - -pub mod simd128; - -pub(crate) mod memchr; diff -Nru temporalio-1.3.0/vendor/memchr/src/arch/wasm32/simd128/memchr.rs temporalio-1.3.0/vendor/memchr/src/arch/wasm32/simd128/memchr.rs --- temporalio-1.3.0/vendor/memchr/src/arch/wasm32/simd128/memchr.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/arch/wasm32/simd128/memchr.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,1020 +0,0 @@ -/*! -This module defines 128-bit vector implementations of `memchr` and friends. - -The main types in this module are [`One`], [`Two`] and [`Three`]. They are for -searching for one, two or three distinct bytes, respectively, in a haystack. -Each type also has corresponding double ended iterators. These searchers are -typically much faster than scalar routines accomplishing the same task. - -The `One` searcher also provides a [`One::count`] routine for efficiently -counting the number of times a single byte occurs in a haystack. This is -useful, for example, for counting the number of lines in a haystack. This -routine exists because it is usually faster, especially with a high match -count, then using [`One::find`] repeatedly. ([`OneIter`] specializes its -`Iterator::count` implementation to use this routine.) - -Only one, two and three bytes are supported because three bytes is about -the point where one sees diminishing returns. Beyond this point and it's -probably (but not necessarily) better to just use a simple `[bool; 256]` array -or similar. However, it depends mightily on the specific work-load and the -expected match frequency. -*/ - -use core::arch::wasm32::v128; - -use crate::{arch::generic::memchr as generic, ext::Pointer, vector::Vector}; - -/// Finds all occurrences of a single byte in a haystack. -#[derive(Clone, Copy, Debug)] -pub struct One(generic::One); - -impl One { - /// Create a new searcher that finds occurrences of the needle byte given. - /// - /// This particular searcher is specialized to use simd128 vector - /// instructions that typically make it quite fast. - /// - /// If simd128 is unavailable in the current environment, then `None` is - /// returned. - #[inline] - pub fn new(needle: u8) -> Option { - if One::is_available() { - // SAFETY: we check that simd128 is available above. - unsafe { Some(One::new_unchecked(needle)) } - } else { - None - } - } - - /// Create a new finder specific to simd128 vectors and routines without - /// checking that simd128 is available. - /// - /// # Safety - /// - /// Callers must guarantee that it is safe to execute `simd128` - /// instructions in the current environment. - #[target_feature(enable = "simd128")] - #[inline] - pub unsafe fn new_unchecked(needle: u8) -> One { - One(generic::One::new(needle)) - } - - /// Returns true when this implementation is available in the current - /// environment. - /// - /// When this is true, it is guaranteed that [`One::new`] will return - /// a `Some` value. Similarly, when it is false, it is guaranteed that - /// `One::new` will return a `None` value. - /// - /// Note also that for the lifetime of a single program, if this returns - /// true then it will always return true. - #[inline] - pub fn is_available() -> bool { - #[cfg(target_feature = "simd128")] - { - true - } - #[cfg(not(target_feature = "simd128"))] - { - false - } - } - - /// Return the first occurrence of one of the needle bytes in the given - /// haystack. If no such occurrence exists, then `None` is returned. - /// - /// The occurrence is reported as an offset into `haystack`. Its maximum - /// value is `haystack.len() - 1`. - #[inline] - pub fn find(&self, haystack: &[u8]) -> Option { - // SAFETY: `find_raw` guarantees that if a pointer is returned, it - // falls within the bounds of the start and end pointers. - unsafe { - generic::search_slice_with_raw(haystack, |s, e| { - self.find_raw(s, e) - }) - } - } - - /// Return the last occurrence of one of the needle bytes in the given - /// haystack. If no such occurrence exists, then `None` is returned. - /// - /// The occurrence is reported as an offset into `haystack`. Its maximum - /// value is `haystack.len() - 1`. - #[inline] - pub fn rfind(&self, haystack: &[u8]) -> Option { - // SAFETY: `rfind_raw` guarantees that if a pointer is returned, it - // falls within the bounds of the start and end pointers. - unsafe { - generic::search_slice_with_raw(haystack, |s, e| { - self.rfind_raw(s, e) - }) - } - } - - /// Counts all occurrences of this byte in the given haystack. - #[inline] - pub fn count(&self, haystack: &[u8]) -> usize { - // SAFETY: All of our pointers are derived directly from a borrowed - // slice, which is guaranteed to be valid. - unsafe { - let start = haystack.as_ptr(); - let end = start.add(haystack.len()); - self.count_raw(start, end) - } - } - - /// Like `find`, but accepts and returns raw pointers. - /// - /// When a match is found, the pointer returned is guaranteed to be - /// `>= start` and `< end`. - /// - /// This routine is useful if you're already using raw pointers and would - /// like to avoid converting back to a slice before executing a search. - /// - /// # Safety - /// - /// * Both `start` and `end` must be valid for reads. - /// * Both `start` and `end` must point to an initialized value. - /// * Both `start` and `end` must point to the same allocated object and - /// must either be in bounds or at most one byte past the end of the - /// allocated object. - /// * Both `start` and `end` must be _derived from_ a pointer to the same - /// object. - /// * The distance between `start` and `end` must not overflow `isize`. - /// * The distance being in bounds must not rely on "wrapping around" the - /// address space. - /// - /// Note that callers may pass a pair of pointers such that `start >= end`. - /// In that case, `None` will always be returned. - #[inline] - pub unsafe fn find_raw( - &self, - start: *const u8, - end: *const u8, - ) -> Option<*const u8> { - if start >= end { - return None; - } - if end.distance(start) < v128::BYTES { - // SAFETY: We require the caller to pass valid start/end pointers. - return generic::fwd_byte_by_byte(start, end, |b| { - b == self.0.needle1() - }); - } - // SAFETY: Building a `One` means it's safe to call 'simd128' routines. - // Also, we've checked that our haystack is big enough to run on the - // vector routine. Pointer validity is caller's responsibility. - self.find_raw_impl(start, end) - } - - /// Like `rfind`, but accepts and returns raw pointers. - /// - /// When a match is found, the pointer returned is guaranteed to be - /// `>= start` and `< end`. - /// - /// This routine is useful if you're already using raw pointers and would - /// like to avoid converting back to a slice before executing a search. - /// - /// # Safety - /// - /// * Both `start` and `end` must be valid for reads. - /// * Both `start` and `end` must point to an initialized value. - /// * Both `start` and `end` must point to the same allocated object and - /// must either be in bounds or at most one byte past the end of the - /// allocated object. - /// * Both `start` and `end` must be _derived from_ a pointer to the same - /// object. - /// * The distance between `start` and `end` must not overflow `isize`. - /// * The distance being in bounds must not rely on "wrapping around" the - /// address space. - /// - /// Note that callers may pass a pair of pointers such that `start >= end`. - /// In that case, `None` will always be returned. - #[inline] - pub unsafe fn rfind_raw( - &self, - start: *const u8, - end: *const u8, - ) -> Option<*const u8> { - if start >= end { - return None; - } - if end.distance(start) < v128::BYTES { - // SAFETY: We require the caller to pass valid start/end pointers. - return generic::rev_byte_by_byte(start, end, |b| { - b == self.0.needle1() - }); - } - // SAFETY: Building a `One` means it's safe to call 'simd128' routines. - // Also, we've checked that our haystack is big enough to run on the - // vector routine. Pointer validity is caller's responsibility. - self.rfind_raw_impl(start, end) - } - - /// Counts all occurrences of this byte in the given haystack represented - /// by raw pointers. - /// - /// When a match is found, the pointer returned is guaranteed to be - /// `>= start` and `< end`. - /// - /// This routine is useful if you're already using raw pointers and would - /// like to avoid converting back to a slice before executing a search. - /// - /// # Safety - /// - /// * Both `start` and `end` must be valid for reads. - /// * Both `start` and `end` must point to an initialized value. - /// * Both `start` and `end` must point to the same allocated object and - /// must either be in bounds or at most one byte past the end of the - /// allocated object. - /// * Both `start` and `end` must be _derived from_ a pointer to the same - /// object. - /// * The distance between `start` and `end` must not overflow `isize`. - /// * The distance being in bounds must not rely on "wrapping around" the - /// address space. - /// - /// Note that callers may pass a pair of pointers such that `start >= end`. - /// In that case, `None` will always be returned. - #[inline] - pub unsafe fn count_raw(&self, start: *const u8, end: *const u8) -> usize { - if start >= end { - return 0; - } - if end.distance(start) < v128::BYTES { - // SAFETY: We require the caller to pass valid start/end pointers. - return generic::count_byte_by_byte(start, end, |b| { - b == self.0.needle1() - }); - } - // SAFETY: Building a `One` means it's safe to call 'simd128' routines. - // Also, we've checked that our haystack is big enough to run on the - // vector routine. Pointer validity is caller's responsibility. - self.count_raw_impl(start, end) - } - - /// Execute a search using simd128 vectors and routines. - /// - /// # Safety - /// - /// Same as [`One::find_raw`], except the distance between `start` and - /// `end` must be at least the size of a simd128 vector (in bytes). - /// - /// (The target feature safety obligation is automatically fulfilled by - /// virtue of being a method on `One`, which can only be constructed - /// when it is safe to call `simd128` routines.) - #[target_feature(enable = "simd128")] - #[inline] - unsafe fn find_raw_impl( - &self, - start: *const u8, - end: *const u8, - ) -> Option<*const u8> { - self.0.find_raw(start, end) - } - - /// Execute a search using simd128 vectors and routines. - /// - /// # Safety - /// - /// Same as [`One::rfind_raw`], except the distance between `start` and - /// `end` must be at least the size of a simd128 vector (in bytes). - /// - /// (The target feature safety obligation is automatically fulfilled by - /// virtue of being a method on `One`, which can only be constructed - /// when it is safe to call `simd128` routines.) - #[target_feature(enable = "simd128")] - #[inline] - unsafe fn rfind_raw_impl( - &self, - start: *const u8, - end: *const u8, - ) -> Option<*const u8> { - self.0.rfind_raw(start, end) - } - - /// Execute a count using simd128 vectors and routines. - /// - /// # Safety - /// - /// Same as [`One::count_raw`], except the distance between `start` and - /// `end` must be at least the size of a simd128 vector (in bytes). - /// - /// (The target feature safety obligation is automatically fulfilled by - /// virtue of being a method on `One`, which can only be constructed - /// when it is safe to call `simd128` routines.) - #[target_feature(enable = "simd128")] - #[inline] - unsafe fn count_raw_impl( - &self, - start: *const u8, - end: *const u8, - ) -> usize { - self.0.count_raw(start, end) - } - - /// Returns an iterator over all occurrences of the needle byte in the - /// given haystack. - /// - /// The iterator returned implements `DoubleEndedIterator`. This means it - /// can also be used to find occurrences in reverse order. - #[inline] - pub fn iter<'a, 'h>(&'a self, haystack: &'h [u8]) -> OneIter<'a, 'h> { - OneIter { searcher: self, it: generic::Iter::new(haystack) } - } -} - -/// An iterator over all occurrences of a single byte in a haystack. -/// -/// This iterator implements `DoubleEndedIterator`, which means it can also be -/// used to find occurrences in reverse order. -/// -/// This iterator is created by the [`One::iter`] method. -/// -/// The lifetime parameters are as follows: -/// -/// * `'a` refers to the lifetime of the underlying [`One`] searcher. -/// * `'h` refers to the lifetime of the haystack being searched. -#[derive(Clone, Debug)] -pub struct OneIter<'a, 'h> { - searcher: &'a One, - it: generic::Iter<'h>, -} - -impl<'a, 'h> Iterator for OneIter<'a, 'h> { - type Item = usize; - - #[inline] - fn next(&mut self) -> Option { - // SAFETY: We rely on the generic iterator to provide valid start - // and end pointers, but we guarantee that any pointer returned by - // 'find_raw' falls within the bounds of the start and end pointer. - unsafe { self.it.next(|s, e| self.searcher.find_raw(s, e)) } - } - - #[inline] - fn count(self) -> usize { - self.it.count(|s, e| { - // SAFETY: We rely on our generic iterator to return valid start - // and end pointers. - unsafe { self.searcher.count_raw(s, e) } - }) - } - - #[inline] - fn size_hint(&self) -> (usize, Option) { - self.it.size_hint() - } -} - -impl<'a, 'h> DoubleEndedIterator for OneIter<'a, 'h> { - #[inline] - fn next_back(&mut self) -> Option { - // SAFETY: We rely on the generic iterator to provide valid start - // and end pointers, but we guarantee that any pointer returned by - // 'rfind_raw' falls within the bounds of the start and end pointer. - unsafe { self.it.next_back(|s, e| self.searcher.rfind_raw(s, e)) } - } -} - -impl<'a, 'h> core::iter::FusedIterator for OneIter<'a, 'h> {} - -/// Finds all occurrences of two bytes in a haystack. -/// -/// That is, this reports matches of one of two possible bytes. For example, -/// searching for `a` or `b` in `afoobar` would report matches at offsets `0`, -/// `4` and `5`. -#[derive(Clone, Copy, Debug)] -pub struct Two(generic::Two); - -impl Two { - /// Create a new searcher that finds occurrences of the needle bytes given. - /// - /// This particular searcher is specialized to use simd128 vector - /// instructions that typically make it quite fast. - /// - /// If simd128 is unavailable in the current environment, then `None` is - /// returned. - #[inline] - pub fn new(needle1: u8, needle2: u8) -> Option { - if Two::is_available() { - // SAFETY: we check that simd128 is available above. - unsafe { Some(Two::new_unchecked(needle1, needle2)) } - } else { - None - } - } - - /// Create a new finder specific to simd128 vectors and routines without - /// checking that simd128 is available. - /// - /// # Safety - /// - /// Callers must guarantee that it is safe to execute `simd128` - /// instructions in the current environment. - #[target_feature(enable = "simd128")] - #[inline] - pub unsafe fn new_unchecked(needle1: u8, needle2: u8) -> Two { - Two(generic::Two::new(needle1, needle2)) - } - - /// Returns true when this implementation is available in the current - /// environment. - /// - /// When this is true, it is guaranteed that [`Two::new`] will return - /// a `Some` value. Similarly, when it is false, it is guaranteed that - /// `Two::new` will return a `None` value. - /// - /// Note also that for the lifetime of a single program, if this returns - /// true then it will always return true. - #[inline] - pub fn is_available() -> bool { - #[cfg(target_feature = "simd128")] - { - true - } - #[cfg(not(target_feature = "simd128"))] - { - false - } - } - - /// Return the first occurrence of one of the needle bytes in the given - /// haystack. If no such occurrence exists, then `None` is returned. - /// - /// The occurrence is reported as an offset into `haystack`. Its maximum - /// value is `haystack.len() - 1`. - #[inline] - pub fn find(&self, haystack: &[u8]) -> Option { - // SAFETY: `find_raw` guarantees that if a pointer is returned, it - // falls within the bounds of the start and end pointers. - unsafe { - generic::search_slice_with_raw(haystack, |s, e| { - self.find_raw(s, e) - }) - } - } - - /// Return the last occurrence of one of the needle bytes in the given - /// haystack. If no such occurrence exists, then `None` is returned. - /// - /// The occurrence is reported as an offset into `haystack`. Its maximum - /// value is `haystack.len() - 1`. - #[inline] - pub fn rfind(&self, haystack: &[u8]) -> Option { - // SAFETY: `rfind_raw` guarantees that if a pointer is returned, it - // falls within the bounds of the start and end pointers. - unsafe { - generic::search_slice_with_raw(haystack, |s, e| { - self.rfind_raw(s, e) - }) - } - } - - /// Like `find`, but accepts and returns raw pointers. - /// - /// When a match is found, the pointer returned is guaranteed to be - /// `>= start` and `< end`. - /// - /// This routine is useful if you're already using raw pointers and would - /// like to avoid converting back to a slice before executing a search. - /// - /// # Safety - /// - /// * Both `start` and `end` must be valid for reads. - /// * Both `start` and `end` must point to an initialized value. - /// * Both `start` and `end` must point to the same allocated object and - /// must either be in bounds or at most one byte past the end of the - /// allocated object. - /// * Both `start` and `end` must be _derived from_ a pointer to the same - /// object. - /// * The distance between `start` and `end` must not overflow `isize`. - /// * The distance being in bounds must not rely on "wrapping around" the - /// address space. - /// - /// Note that callers may pass a pair of pointers such that `start >= end`. - /// In that case, `None` will always be returned. - #[inline] - pub unsafe fn find_raw( - &self, - start: *const u8, - end: *const u8, - ) -> Option<*const u8> { - if start >= end { - return None; - } - if end.distance(start) < v128::BYTES { - // SAFETY: We require the caller to pass valid start/end pointers. - return generic::fwd_byte_by_byte(start, end, |b| { - b == self.0.needle1() || b == self.0.needle2() - }); - } - // SAFETY: Building a `Two` means it's safe to call 'simd128' routines. - // Also, we've checked that our haystack is big enough to run on the - // vector routine. Pointer validity is caller's responsibility. - self.find_raw_impl(start, end) - } - - /// Like `rfind`, but accepts and returns raw pointers. - /// - /// When a match is found, the pointer returned is guaranteed to be - /// `>= start` and `< end`. - /// - /// This routine is useful if you're already using raw pointers and would - /// like to avoid converting back to a slice before executing a search. - /// - /// # Safety - /// - /// * Both `start` and `end` must be valid for reads. - /// * Both `start` and `end` must point to an initialized value. - /// * Both `start` and `end` must point to the same allocated object and - /// must either be in bounds or at most one byte past the end of the - /// allocated object. - /// * Both `start` and `end` must be _derived from_ a pointer to the same - /// object. - /// * The distance between `start` and `end` must not overflow `isize`. - /// * The distance being in bounds must not rely on "wrapping around" the - /// address space. - /// - /// Note that callers may pass a pair of pointers such that `start >= end`. - /// In that case, `None` will always be returned. - #[inline] - pub unsafe fn rfind_raw( - &self, - start: *const u8, - end: *const u8, - ) -> Option<*const u8> { - if start >= end { - return None; - } - if end.distance(start) < v128::BYTES { - // SAFETY: We require the caller to pass valid start/end pointers. - return generic::rev_byte_by_byte(start, end, |b| { - b == self.0.needle1() || b == self.0.needle2() - }); - } - // SAFETY: Building a `Two` means it's safe to call 'simd128' routines. - // Also, we've checked that our haystack is big enough to run on the - // vector routine. Pointer validity is caller's responsibility. - self.rfind_raw_impl(start, end) - } - - /// Execute a search using simd128 vectors and routines. - /// - /// # Safety - /// - /// Same as [`Two::find_raw`], except the distance between `start` and - /// `end` must be at least the size of a simd128 vector (in bytes). - /// - /// (The target feature safety obligation is automatically fulfilled by - /// virtue of being a method on `Two`, which can only be constructed - /// when it is safe to call `simd128` routines.) - #[target_feature(enable = "simd128")] - #[inline] - unsafe fn find_raw_impl( - &self, - start: *const u8, - end: *const u8, - ) -> Option<*const u8> { - self.0.find_raw(start, end) - } - - /// Execute a search using simd128 vectors and routines. - /// - /// # Safety - /// - /// Same as [`Two::rfind_raw`], except the distance between `start` and - /// `end` must be at least the size of a simd128 vector (in bytes). - /// - /// (The target feature safety obligation is automatically fulfilled by - /// virtue of being a method on `Two`, which can only be constructed - /// when it is safe to call `simd128` routines.) - #[target_feature(enable = "simd128")] - #[inline] - unsafe fn rfind_raw_impl( - &self, - start: *const u8, - end: *const u8, - ) -> Option<*const u8> { - self.0.rfind_raw(start, end) - } - - /// Returns an iterator over all occurrences of the needle bytes in the - /// given haystack. - /// - /// The iterator returned implements `DoubleEndedIterator`. This means it - /// can also be used to find occurrences in reverse order. - #[inline] - pub fn iter<'a, 'h>(&'a self, haystack: &'h [u8]) -> TwoIter<'a, 'h> { - TwoIter { searcher: self, it: generic::Iter::new(haystack) } - } -} - -/// An iterator over all occurrences of two possible bytes in a haystack. -/// -/// This iterator implements `DoubleEndedIterator`, which means it can also be -/// used to find occurrences in reverse order. -/// -/// This iterator is created by the [`Two::iter`] method. -/// -/// The lifetime parameters are as follows: -/// -/// * `'a` refers to the lifetime of the underlying [`Two`] searcher. -/// * `'h` refers to the lifetime of the haystack being searched. -#[derive(Clone, Debug)] -pub struct TwoIter<'a, 'h> { - searcher: &'a Two, - it: generic::Iter<'h>, -} - -impl<'a, 'h> Iterator for TwoIter<'a, 'h> { - type Item = usize; - - #[inline] - fn next(&mut self) -> Option { - // SAFETY: We rely on the generic iterator to provide valid start - // and end pointers, but we guarantee that any pointer returned by - // 'find_raw' falls within the bounds of the start and end pointer. - unsafe { self.it.next(|s, e| self.searcher.find_raw(s, e)) } - } - - #[inline] - fn size_hint(&self) -> (usize, Option) { - self.it.size_hint() - } -} - -impl<'a, 'h> DoubleEndedIterator for TwoIter<'a, 'h> { - #[inline] - fn next_back(&mut self) -> Option { - // SAFETY: We rely on the generic iterator to provide valid start - // and end pointers, but we guarantee that any pointer returned by - // 'rfind_raw' falls within the bounds of the start and end pointer. - unsafe { self.it.next_back(|s, e| self.searcher.rfind_raw(s, e)) } - } -} - -impl<'a, 'h> core::iter::FusedIterator for TwoIter<'a, 'h> {} - -/// Finds all occurrences of three bytes in a haystack. -/// -/// That is, this reports matches of one of three possible bytes. For example, -/// searching for `a`, `b` or `o` in `afoobar` would report matches at offsets -/// `0`, `2`, `3`, `4` and `5`. -#[derive(Clone, Copy, Debug)] -pub struct Three(generic::Three); - -impl Three { - /// Create a new searcher that finds occurrences of the needle bytes given. - /// - /// This particular searcher is specialized to use simd128 vector - /// instructions that typically make it quite fast. - /// - /// If simd128 is unavailable in the current environment, then `None` is - /// returned. - #[inline] - pub fn new(needle1: u8, needle2: u8, needle3: u8) -> Option { - if Three::is_available() { - // SAFETY: we check that simd128 is available above. - unsafe { Some(Three::new_unchecked(needle1, needle2, needle3)) } - } else { - None - } - } - - /// Create a new finder specific to simd128 vectors and routines without - /// checking that simd128 is available. - /// - /// # Safety - /// - /// Callers must guarantee that it is safe to execute `simd128` - /// instructions in the current environment. - #[target_feature(enable = "simd128")] - #[inline] - pub unsafe fn new_unchecked( - needle1: u8, - needle2: u8, - needle3: u8, - ) -> Three { - Three(generic::Three::new(needle1, needle2, needle3)) - } - - /// Returns true when this implementation is available in the current - /// environment. - /// - /// When this is true, it is guaranteed that [`Three::new`] will return - /// a `Some` value. Similarly, when it is false, it is guaranteed that - /// `Three::new` will return a `None` value. - /// - /// Note also that for the lifetime of a single program, if this returns - /// true then it will always return true. - #[inline] - pub fn is_available() -> bool { - #[cfg(target_feature = "simd128")] - { - true - } - #[cfg(not(target_feature = "simd128"))] - { - false - } - } - - /// Return the first occurrence of one of the needle bytes in the given - /// haystack. If no such occurrence exists, then `None` is returned. - /// - /// The occurrence is reported as an offset into `haystack`. Its maximum - /// value is `haystack.len() - 1`. - #[inline] - pub fn find(&self, haystack: &[u8]) -> Option { - // SAFETY: `find_raw` guarantees that if a pointer is returned, it - // falls within the bounds of the start and end pointers. - unsafe { - generic::search_slice_with_raw(haystack, |s, e| { - self.find_raw(s, e) - }) - } - } - - /// Return the last occurrence of one of the needle bytes in the given - /// haystack. If no such occurrence exists, then `None` is returned. - /// - /// The occurrence is reported as an offset into `haystack`. Its maximum - /// value is `haystack.len() - 1`. - #[inline] - pub fn rfind(&self, haystack: &[u8]) -> Option { - // SAFETY: `rfind_raw` guarantees that if a pointer is returned, it - // falls within the bounds of the start and end pointers. - unsafe { - generic::search_slice_with_raw(haystack, |s, e| { - self.rfind_raw(s, e) - }) - } - } - - /// Like `find`, but accepts and returns raw pointers. - /// - /// When a match is found, the pointer returned is guaranteed to be - /// `>= start` and `< end`. - /// - /// This routine is useful if you're already using raw pointers and would - /// like to avoid converting back to a slice before executing a search. - /// - /// # Safety - /// - /// * Both `start` and `end` must be valid for reads. - /// * Both `start` and `end` must point to an initialized value. - /// * Both `start` and `end` must point to the same allocated object and - /// must either be in bounds or at most one byte past the end of the - /// allocated object. - /// * Both `start` and `end` must be _derived from_ a pointer to the same - /// object. - /// * The distance between `start` and `end` must not overflow `isize`. - /// * The distance being in bounds must not rely on "wrapping around" the - /// address space. - /// - /// Note that callers may pass a pair of pointers such that `start >= end`. - /// In that case, `None` will always be returned. - #[inline] - pub unsafe fn find_raw( - &self, - start: *const u8, - end: *const u8, - ) -> Option<*const u8> { - if start >= end { - return None; - } - if end.distance(start) < v128::BYTES { - // SAFETY: We require the caller to pass valid start/end pointers. - return generic::fwd_byte_by_byte(start, end, |b| { - b == self.0.needle1() - || b == self.0.needle2() - || b == self.0.needle3() - }); - } - // SAFETY: Building a `Three` means it's safe to call 'simd128' - // routines. Also, we've checked that our haystack is big enough to run - // on the vector routine. Pointer validity is caller's responsibility. - self.find_raw_impl(start, end) - } - - /// Like `rfind`, but accepts and returns raw pointers. - /// - /// When a match is found, the pointer returned is guaranteed to be - /// `>= start` and `< end`. - /// - /// This routine is useful if you're already using raw pointers and would - /// like to avoid converting back to a slice before executing a search. - /// - /// # Safety - /// - /// * Both `start` and `end` must be valid for reads. - /// * Both `start` and `end` must point to an initialized value. - /// * Both `start` and `end` must point to the same allocated object and - /// must either be in bounds or at most one byte past the end of the - /// allocated object. - /// * Both `start` and `end` must be _derived from_ a pointer to the same - /// object. - /// * The distance between `start` and `end` must not overflow `isize`. - /// * The distance being in bounds must not rely on "wrapping around" the - /// address space. - /// - /// Note that callers may pass a pair of pointers such that `start >= end`. - /// In that case, `None` will always be returned. - #[inline] - pub unsafe fn rfind_raw( - &self, - start: *const u8, - end: *const u8, - ) -> Option<*const u8> { - if start >= end { - return None; - } - if end.distance(start) < v128::BYTES { - // SAFETY: We require the caller to pass valid start/end pointers. - return generic::rev_byte_by_byte(start, end, |b| { - b == self.0.needle1() - || b == self.0.needle2() - || b == self.0.needle3() - }); - } - // SAFETY: Building a `Three` means it's safe to call 'simd128' - // routines. Also, we've checked that our haystack is big enough to run - // on the vector routine. Pointer validity is caller's responsibility. - self.rfind_raw_impl(start, end) - } - - /// Execute a search using simd128 vectors and routines. - /// - /// # Safety - /// - /// Same as [`Three::find_raw`], except the distance between `start` and - /// `end` must be at least the size of a simd128 vector (in bytes). - /// - /// (The target feature safety obligation is automatically fulfilled by - /// virtue of being a method on `Three`, which can only be constructed - /// when it is safe to call `simd128` routines.) - #[target_feature(enable = "simd128")] - #[inline] - unsafe fn find_raw_impl( - &self, - start: *const u8, - end: *const u8, - ) -> Option<*const u8> { - self.0.find_raw(start, end) - } - - /// Execute a search using simd128 vectors and routines. - /// - /// # Safety - /// - /// Same as [`Three::rfind_raw`], except the distance between `start` and - /// `end` must be at least the size of a simd128 vector (in bytes). - /// - /// (The target feature safety obligation is automatically fulfilled by - /// virtue of being a method on `Three`, which can only be constructed - /// when it is safe to call `simd128` routines.) - #[target_feature(enable = "simd128")] - #[inline] - unsafe fn rfind_raw_impl( - &self, - start: *const u8, - end: *const u8, - ) -> Option<*const u8> { - self.0.rfind_raw(start, end) - } - - /// Returns an iterator over all occurrences of the needle byte in the - /// given haystack. - /// - /// The iterator returned implements `DoubleEndedIterator`. This means it - /// can also be used to find occurrences in reverse order. - #[inline] - pub fn iter<'a, 'h>(&'a self, haystack: &'h [u8]) -> ThreeIter<'a, 'h> { - ThreeIter { searcher: self, it: generic::Iter::new(haystack) } - } -} - -/// An iterator over all occurrences of three possible bytes in a haystack. -/// -/// This iterator implements `DoubleEndedIterator`, which means it can also be -/// used to find occurrences in reverse order. -/// -/// This iterator is created by the [`Three::iter`] method. -/// -/// The lifetime parameters are as follows: -/// -/// * `'a` refers to the lifetime of the underlying [`Three`] searcher. -/// * `'h` refers to the lifetime of the haystack being searched. -#[derive(Clone, Debug)] -pub struct ThreeIter<'a, 'h> { - searcher: &'a Three, - it: generic::Iter<'h>, -} - -impl<'a, 'h> Iterator for ThreeIter<'a, 'h> { - type Item = usize; - - #[inline] - fn next(&mut self) -> Option { - // SAFETY: We rely on the generic iterator to provide valid start - // and end pointers, but we guarantee that any pointer returned by - // 'find_raw' falls within the bounds of the start and end pointer. - unsafe { self.it.next(|s, e| self.searcher.find_raw(s, e)) } - } - - #[inline] - fn size_hint(&self) -> (usize, Option) { - self.it.size_hint() - } -} - -impl<'a, 'h> DoubleEndedIterator for ThreeIter<'a, 'h> { - #[inline] - fn next_back(&mut self) -> Option { - // SAFETY: We rely on the generic iterator to provide valid start - // and end pointers, but we guarantee that any pointer returned by - // 'rfind_raw' falls within the bounds of the start and end pointer. - unsafe { self.it.next_back(|s, e| self.searcher.rfind_raw(s, e)) } - } -} - -impl<'a, 'h> core::iter::FusedIterator for ThreeIter<'a, 'h> {} - -#[cfg(test)] -mod tests { - use super::*; - - define_memchr_quickcheck!(super); - - #[test] - fn forward_one() { - crate::tests::memchr::Runner::new(1).forward_iter( - |haystack, needles| { - Some(One::new(needles[0])?.iter(haystack).collect()) - }, - ) - } - - #[test] - fn reverse_one() { - crate::tests::memchr::Runner::new(1).reverse_iter( - |haystack, needles| { - Some(One::new(needles[0])?.iter(haystack).rev().collect()) - }, - ) - } - - #[test] - fn count_one() { - crate::tests::memchr::Runner::new(1).count_iter(|haystack, needles| { - Some(One::new(needles[0])?.iter(haystack).count()) - }) - } - - #[test] - fn forward_two() { - crate::tests::memchr::Runner::new(2).forward_iter( - |haystack, needles| { - let n1 = needles.get(0).copied()?; - let n2 = needles.get(1).copied()?; - Some(Two::new(n1, n2)?.iter(haystack).collect()) - }, - ) - } - - #[test] - fn reverse_two() { - crate::tests::memchr::Runner::new(2).reverse_iter( - |haystack, needles| { - let n1 = needles.get(0).copied()?; - let n2 = needles.get(1).copied()?; - Some(Two::new(n1, n2)?.iter(haystack).rev().collect()) - }, - ) - } - - #[test] - fn forward_three() { - crate::tests::memchr::Runner::new(3).forward_iter( - |haystack, needles| { - let n1 = needles.get(0).copied()?; - let n2 = needles.get(1).copied()?; - let n3 = needles.get(2).copied()?; - Some(Three::new(n1, n2, n3)?.iter(haystack).collect()) - }, - ) - } - - #[test] - fn reverse_three() { - crate::tests::memchr::Runner::new(3).reverse_iter( - |haystack, needles| { - let n1 = needles.get(0).copied()?; - let n2 = needles.get(1).copied()?; - let n3 = needles.get(2).copied()?; - Some(Three::new(n1, n2, n3)?.iter(haystack).rev().collect()) - }, - ) - } -} diff -Nru temporalio-1.3.0/vendor/memchr/src/arch/wasm32/simd128/mod.rs temporalio-1.3.0/vendor/memchr/src/arch/wasm32/simd128/mod.rs --- temporalio-1.3.0/vendor/memchr/src/arch/wasm32/simd128/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/arch/wasm32/simd128/mod.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,6 +0,0 @@ -/*! -Algorithms for the `wasm32` target using 128-bit vectors via simd128. -*/ - -pub mod memchr; -pub mod packedpair; diff -Nru temporalio-1.3.0/vendor/memchr/src/arch/wasm32/simd128/packedpair.rs temporalio-1.3.0/vendor/memchr/src/arch/wasm32/simd128/packedpair.rs --- temporalio-1.3.0/vendor/memchr/src/arch/wasm32/simd128/packedpair.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/arch/wasm32/simd128/packedpair.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,229 +0,0 @@ -/*! -A 128-bit vector implementation of the "packed pair" SIMD algorithm. - -The "packed pair" algorithm is based on the [generic SIMD] algorithm. The main -difference is that it (by default) uses a background distribution of byte -frequencies to heuristically select the pair of bytes to search for. - -[generic SIMD]: http://0x80.pl/articles/simd-strfind.html#first-and-last -*/ - -use core::arch::wasm32::v128; - -use crate::arch::{all::packedpair::Pair, generic::packedpair}; - -/// A "packed pair" finder that uses 128-bit vector operations. -/// -/// This finder picks two bytes that it believes have high predictive power -/// for indicating an overall match of a needle. Depending on whether -/// `Finder::find` or `Finder::find_prefilter` is used, it reports offsets -/// where the needle matches or could match. In the prefilter case, candidates -/// are reported whenever the [`Pair`] of bytes given matches. -#[derive(Clone, Copy, Debug)] -pub struct Finder(packedpair::Finder); - -impl Finder { - /// Create a new pair searcher. The searcher returned can either report - /// exact matches of `needle` or act as a prefilter and report candidate - /// positions of `needle`. - /// - /// If simd128 is unavailable in the current environment or if a [`Pair`] - /// could not be constructed from the needle given, then `None` is - /// returned. - #[inline] - pub fn new(needle: &[u8]) -> Option { - Finder::with_pair(needle, Pair::new(needle)?) - } - - /// Create a new "packed pair" finder using the pair of bytes given. - /// - /// This constructor permits callers to control precisely which pair of - /// bytes is used as a predicate. - /// - /// If simd128 is unavailable in the current environment, then `None` is - /// returned. - #[inline] - pub fn with_pair(needle: &[u8], pair: Pair) -> Option { - if Finder::is_available() { - // SAFETY: we check that simd128 is available above. We are also - // guaranteed to have needle.len() > 1 because we have a valid - // Pair. - unsafe { Some(Finder::with_pair_impl(needle, pair)) } - } else { - None - } - } - - /// Create a new `Finder` specific to simd128 vectors and routines. - /// - /// # Safety - /// - /// Same as the safety for `packedpair::Finder::new`, and callers must also - /// ensure that simd128 is available. - #[target_feature(enable = "simd128")] - #[inline] - unsafe fn with_pair_impl(needle: &[u8], pair: Pair) -> Finder { - let finder = packedpair::Finder::::new(needle, pair); - Finder(finder) - } - - /// Returns true when this implementation is available in the current - /// environment. - /// - /// When this is true, it is guaranteed that [`Finder::with_pair`] will - /// return a `Some` value. Similarly, when it is false, it is guaranteed - /// that `Finder::with_pair` will return a `None` value. Notice that this - /// does not guarantee that [`Finder::new`] will return a `Finder`. Namely, - /// even when `Finder::is_available` is true, it is not guaranteed that a - /// valid [`Pair`] can be found from the needle given. - /// - /// Note also that for the lifetime of a single program, if this returns - /// true then it will always return true. - #[inline] - pub fn is_available() -> bool { - #[cfg(target_feature = "simd128")] - { - true - } - #[cfg(not(target_feature = "simd128"))] - { - false - } - } - - /// Execute a search using wasm32 v128 vectors and routines. - /// - /// # Panics - /// - /// When `haystack.len()` is less than [`Finder::min_haystack_len`]. - #[inline] - pub fn find(&self, haystack: &[u8], needle: &[u8]) -> Option { - self.find_impl(haystack, needle) - } - - /// Execute a search using wasm32 v128 vectors and routines. - /// - /// # Panics - /// - /// When `haystack.len()` is less than [`Finder::min_haystack_len`]. - #[inline] - pub fn find_prefilter(&self, haystack: &[u8]) -> Option { - self.find_prefilter_impl(haystack) - } - - /// Execute a search using wasm32 v128 vectors and routines. - /// - /// # Panics - /// - /// When `haystack.len()` is less than [`Finder::min_haystack_len`]. - /// - /// # Safety - /// - /// (The target feature safety obligation is automatically fulfilled by - /// virtue of being a method on `Finder`, which can only be constructed - /// when it is safe to call `simd128` routines.) - #[target_feature(enable = "simd128")] - #[inline] - fn find_impl(&self, haystack: &[u8], needle: &[u8]) -> Option { - // SAFETY: The target feature safety obligation is automatically - // fulfilled by virtue of being a method on `Finder`, which can only be - // constructed when it is safe to call `simd128` routines. - unsafe { self.0.find(haystack, needle) } - } - - /// Execute a prefilter search using wasm32 v128 vectors and routines. - /// - /// # Panics - /// - /// When `haystack.len()` is less than [`Finder::min_haystack_len`]. - /// - /// # Safety - /// - /// (The target feature safety obligation is automatically fulfilled by - /// virtue of being a method on `Finder`, which can only be constructed - /// when it is safe to call `simd128` routines.) - #[target_feature(enable = "simd128")] - #[inline] - fn find_prefilter_impl(&self, haystack: &[u8]) -> Option { - // SAFETY: The target feature safety obligation is automatically - // fulfilled by virtue of being a method on `Finder`, which can only be - // constructed when it is safe to call `simd128` routines. - unsafe { self.0.find_prefilter(haystack) } - } - - /// Returns the pair of offsets (into the needle) used to check as a - /// predicate before confirming whether a needle exists at a particular - /// position. - #[inline] - pub fn pair(&self) -> &Pair { - self.0.pair() - } - - /// Returns the minimum haystack length that this `Finder` can search. - /// - /// Using a haystack with length smaller than this in a search will result - /// in a panic. The reason for this restriction is that this finder is - /// meant to be a low-level component that is part of a larger substring - /// strategy. In that sense, it avoids trying to handle all cases and - /// instead only handles the cases that it can handle very well. - #[inline] - pub fn min_haystack_len(&self) -> usize { - self.0.min_haystack_len() - } -} - -#[cfg(test)] -mod tests { - use super::*; - - fn find(haystack: &[u8], needle: &[u8]) -> Option> { - let f = Finder::new(needle)?; - if haystack.len() < f.min_haystack_len() { - return None; - } - Some(f.find(haystack, needle)) - } - - define_substring_forward_quickcheck!(find); - - #[test] - fn forward_substring() { - crate::tests::substring::Runner::new().fwd(find).run() - } - - #[test] - fn forward_packedpair() { - fn find( - haystack: &[u8], - needle: &[u8], - index1: u8, - index2: u8, - ) -> Option> { - let pair = Pair::with_indices(needle, index1, index2)?; - let f = Finder::with_pair(needle, pair)?; - if haystack.len() < f.min_haystack_len() { - return None; - } - Some(f.find(haystack, needle)) - } - crate::tests::packedpair::Runner::new().fwd(find).run() - } - - #[test] - fn forward_packedpair_prefilter() { - fn find( - haystack: &[u8], - needle: &[u8], - index1: u8, - index2: u8, - ) -> Option> { - let pair = Pair::with_indices(needle, index1, index2)?; - let f = Finder::with_pair(needle, pair)?; - if haystack.len() < f.min_haystack_len() { - return None; - } - Some(f.find_prefilter(haystack)) - } - crate::tests::packedpair::Runner::new().fwd(find).run() - } -} diff -Nru temporalio-1.3.0/vendor/memchr/src/arch/x86_64/avx2/memchr.rs temporalio-1.3.0/vendor/memchr/src/arch/x86_64/avx2/memchr.rs --- temporalio-1.3.0/vendor/memchr/src/arch/x86_64/avx2/memchr.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/arch/x86_64/avx2/memchr.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,1352 +0,0 @@ -/*! -This module defines 256-bit vector implementations of `memchr` and friends. - -The main types in this module are [`One`], [`Two`] and [`Three`]. They are for -searching for one, two or three distinct bytes, respectively, in a haystack. -Each type also has corresponding double ended iterators. These searchers are -typically much faster than scalar routines accomplishing the same task. - -The `One` searcher also provides a [`One::count`] routine for efficiently -counting the number of times a single byte occurs in a haystack. This is -useful, for example, for counting the number of lines in a haystack. This -routine exists because it is usually faster, especially with a high match -count, then using [`One::find`] repeatedly. ([`OneIter`] specializes its -`Iterator::count` implementation to use this routine.) - -Only one, two and three bytes are supported because three bytes is about -the point where one sees diminishing returns. Beyond this point and it's -probably (but not necessarily) better to just use a simple `[bool; 256]` array -or similar. However, it depends mightily on the specific work-load and the -expected match frequency. -*/ - -use core::arch::x86_64::{__m128i, __m256i}; - -use crate::{arch::generic::memchr as generic, ext::Pointer, vector::Vector}; - -/// Finds all occurrences of a single byte in a haystack. -#[derive(Clone, Copy, Debug)] -pub struct One { - /// Used for haystacks less than 32 bytes. - sse2: generic::One<__m128i>, - /// Used for haystacks bigger than 32 bytes. - avx2: generic::One<__m256i>, -} - -impl One { - /// Create a new searcher that finds occurrences of the needle byte given. - /// - /// This particular searcher is specialized to use AVX2 vector instructions - /// that typically make it quite fast. (SSE2 is used for haystacks that - /// are too short to accommodate an AVX2 vector.) - /// - /// If either SSE2 or AVX2 is unavailable in the current environment, then - /// `None` is returned. - #[inline] - pub fn new(needle: u8) -> Option { - if One::is_available() { - // SAFETY: we check that sse2 and avx2 are available above. - unsafe { Some(One::new_unchecked(needle)) } - } else { - None - } - } - - /// Create a new finder specific to AVX2 vectors and routines without - /// checking that either SSE2 or AVX2 is available. - /// - /// # Safety - /// - /// Callers must guarantee that it is safe to execute both `sse2` and - /// `avx2` instructions in the current environment. - /// - /// Note that it is a common misconception that if one compiles for an - /// `x86_64` target, then they therefore automatically have access to SSE2 - /// instructions. While this is almost always the case, it isn't true in - /// 100% of cases. - #[target_feature(enable = "sse2", enable = "avx2")] - #[inline] - pub unsafe fn new_unchecked(needle: u8) -> One { - One { - sse2: generic::One::new(needle), - avx2: generic::One::new(needle), - } - } - - /// Returns true when this implementation is available in the current - /// environment. - /// - /// When this is true, it is guaranteed that [`One::new`] will return - /// a `Some` value. Similarly, when it is false, it is guaranteed that - /// `One::new` will return a `None` value. - /// - /// Note also that for the lifetime of a single program, if this returns - /// true then it will always return true. - #[inline] - pub fn is_available() -> bool { - #[cfg(not(target_feature = "sse2"))] - { - false - } - #[cfg(target_feature = "sse2")] - { - #[cfg(target_feature = "avx2")] - { - true - } - #[cfg(not(target_feature = "avx2"))] - { - #[cfg(feature = "std")] - { - std::is_x86_feature_detected!("avx2") - } - #[cfg(not(feature = "std"))] - { - false - } - } - } - } - - /// Return the first occurrence of one of the needle bytes in the given - /// haystack. If no such occurrence exists, then `None` is returned. - /// - /// The occurrence is reported as an offset into `haystack`. Its maximum - /// value is `haystack.len() - 1`. - #[inline] - pub fn find(&self, haystack: &[u8]) -> Option { - // SAFETY: `find_raw` guarantees that if a pointer is returned, it - // falls within the bounds of the start and end pointers. - unsafe { - generic::search_slice_with_raw(haystack, |s, e| { - self.find_raw(s, e) - }) - } - } - - /// Return the last occurrence of one of the needle bytes in the given - /// haystack. If no such occurrence exists, then `None` is returned. - /// - /// The occurrence is reported as an offset into `haystack`. Its maximum - /// value is `haystack.len() - 1`. - #[inline] - pub fn rfind(&self, haystack: &[u8]) -> Option { - // SAFETY: `find_raw` guarantees that if a pointer is returned, it - // falls within the bounds of the start and end pointers. - unsafe { - generic::search_slice_with_raw(haystack, |s, e| { - self.rfind_raw(s, e) - }) - } - } - - /// Counts all occurrences of this byte in the given haystack. - #[inline] - pub fn count(&self, haystack: &[u8]) -> usize { - // SAFETY: All of our pointers are derived directly from a borrowed - // slice, which is guaranteed to be valid. - unsafe { - let start = haystack.as_ptr(); - let end = start.add(haystack.len()); - self.count_raw(start, end) - } - } - - /// Like `find`, but accepts and returns raw pointers. - /// - /// When a match is found, the pointer returned is guaranteed to be - /// `>= start` and `< end`. - /// - /// This routine is useful if you're already using raw pointers and would - /// like to avoid converting back to a slice before executing a search. - /// - /// # Safety - /// - /// * Both `start` and `end` must be valid for reads. - /// * Both `start` and `end` must point to an initialized value. - /// * Both `start` and `end` must point to the same allocated object and - /// must either be in bounds or at most one byte past the end of the - /// allocated object. - /// * Both `start` and `end` must be _derived from_ a pointer to the same - /// object. - /// * The distance between `start` and `end` must not overflow `isize`. - /// * The distance being in bounds must not rely on "wrapping around" the - /// address space. - /// - /// Note that callers may pass a pair of pointers such that `start >= end`. - /// In that case, `None` will always be returned. - #[inline] - pub unsafe fn find_raw( - &self, - start: *const u8, - end: *const u8, - ) -> Option<*const u8> { - if start >= end { - return None; - } - let len = end.distance(start); - if len < __m256i::BYTES { - return if len < __m128i::BYTES { - // SAFETY: We require the caller to pass valid start/end - // pointers. - generic::fwd_byte_by_byte(start, end, |b| { - b == self.sse2.needle1() - }) - } else { - // SAFETY: We require the caller to pass valid start/end - // pointers. - self.find_raw_sse2(start, end) - }; - } - // SAFETY: Building a `One` means it's safe to call both 'sse2' and - // 'avx2' routines. Also, we've checked that our haystack is big - // enough to run on the vector routine. Pointer validity is caller's - // responsibility. - // - // Note that we could call `self.avx2.find_raw` directly here. But that - // means we'd have to annotate this routine with `target_feature`. - // Which is fine, because this routine is `unsafe` anyway and the - // `target_feature` obligation is met by virtue of building a `One`. - // The real problem is that a routine with a `target_feature` - // annotation generally can't be inlined into caller code unless - // the caller code has the same target feature annotations. Namely, - // the common case (at time of writing) is for calling code to not - // have the `avx2` target feature enabled *at compile time*. Without - // `target_feature` on this routine, it can be inlined which will - // handle some of the short-haystack cases above without touching the - // architecture specific code. - self.find_raw_avx2(start, end) - } - - /// Like `rfind`, but accepts and returns raw pointers. - /// - /// When a match is found, the pointer returned is guaranteed to be - /// `>= start` and `< end`. - /// - /// This routine is useful if you're already using raw pointers and would - /// like to avoid converting back to a slice before executing a search. - /// - /// # Safety - /// - /// * Both `start` and `end` must be valid for reads. - /// * Both `start` and `end` must point to an initialized value. - /// * Both `start` and `end` must point to the same allocated object and - /// must either be in bounds or at most one byte past the end of the - /// allocated object. - /// * Both `start` and `end` must be _derived from_ a pointer to the same - /// object. - /// * The distance between `start` and `end` must not overflow `isize`. - /// * The distance being in bounds must not rely on "wrapping around" the - /// address space. - /// - /// Note that callers may pass a pair of pointers such that `start >= end`. - /// In that case, `None` will always be returned. - #[inline] - pub unsafe fn rfind_raw( - &self, - start: *const u8, - end: *const u8, - ) -> Option<*const u8> { - if start >= end { - return None; - } - let len = end.distance(start); - if len < __m256i::BYTES { - return if len < __m128i::BYTES { - // SAFETY: We require the caller to pass valid start/end - // pointers. - generic::rev_byte_by_byte(start, end, |b| { - b == self.sse2.needle1() - }) - } else { - // SAFETY: We require the caller to pass valid start/end - // pointers. - self.rfind_raw_sse2(start, end) - }; - } - // SAFETY: Building a `One` means it's safe to call both 'sse2' and - // 'avx2' routines. Also, we've checked that our haystack is big - // enough to run on the vector routine. Pointer validity is caller's - // responsibility. - // - // See note in forward routine above for why we don't just call - // `self.avx2.rfind_raw` directly here. - self.rfind_raw_avx2(start, end) - } - - /// Counts all occurrences of this byte in the given haystack represented - /// by raw pointers. - /// - /// This routine is useful if you're already using raw pointers and would - /// like to avoid converting back to a slice before executing a search. - /// - /// # Safety - /// - /// * Both `start` and `end` must be valid for reads. - /// * Both `start` and `end` must point to an initialized value. - /// * Both `start` and `end` must point to the same allocated object and - /// must either be in bounds or at most one byte past the end of the - /// allocated object. - /// * Both `start` and `end` must be _derived from_ a pointer to the same - /// object. - /// * The distance between `start` and `end` must not overflow `isize`. - /// * The distance being in bounds must not rely on "wrapping around" the - /// address space. - /// - /// Note that callers may pass a pair of pointers such that `start >= end`. - /// In that case, `0` will always be returned. - #[inline] - pub unsafe fn count_raw(&self, start: *const u8, end: *const u8) -> usize { - if start >= end { - return 0; - } - let len = end.distance(start); - if len < __m256i::BYTES { - return if len < __m128i::BYTES { - // SAFETY: We require the caller to pass valid start/end - // pointers. - generic::count_byte_by_byte(start, end, |b| { - b == self.sse2.needle1() - }) - } else { - // SAFETY: We require the caller to pass valid start/end - // pointers. - self.count_raw_sse2(start, end) - }; - } - // SAFETY: Building a `One` means it's safe to call both 'sse2' and - // 'avx2' routines. Also, we've checked that our haystack is big - // enough to run on the vector routine. Pointer validity is caller's - // responsibility. - self.count_raw_avx2(start, end) - } - - /// Execute a search using SSE2 vectors and routines. - /// - /// # Safety - /// - /// Same as [`One::find_raw`], except the distance between `start` and - /// `end` must be at least the size of an SSE2 vector (in bytes). - /// - /// (The target feature safety obligation is automatically fulfilled by - /// virtue of being a method on `One`, which can only be constructed - /// when it is safe to call `sse2`/`avx2` routines.) - #[target_feature(enable = "sse2")] - #[inline] - unsafe fn find_raw_sse2( - &self, - start: *const u8, - end: *const u8, - ) -> Option<*const u8> { - self.sse2.find_raw(start, end) - } - - /// Execute a search using SSE2 vectors and routines. - /// - /// # Safety - /// - /// Same as [`One::rfind_raw`], except the distance between `start` and - /// `end` must be at least the size of an SSE2 vector (in bytes). - /// - /// (The target feature safety obligation is automatically fulfilled by - /// virtue of being a method on `One`, which can only be constructed - /// when it is safe to call `sse2`/`avx2` routines.) - #[target_feature(enable = "sse2")] - #[inline] - unsafe fn rfind_raw_sse2( - &self, - start: *const u8, - end: *const u8, - ) -> Option<*const u8> { - self.sse2.rfind_raw(start, end) - } - - /// Execute a count using SSE2 vectors and routines. - /// - /// # Safety - /// - /// Same as [`One::count_raw`], except the distance between `start` and - /// `end` must be at least the size of an SSE2 vector (in bytes). - /// - /// (The target feature safety obligation is automatically fulfilled by - /// virtue of being a method on `One`, which can only be constructed - /// when it is safe to call `sse2`/`avx2` routines.) - #[target_feature(enable = "sse2")] - #[inline] - unsafe fn count_raw_sse2( - &self, - start: *const u8, - end: *const u8, - ) -> usize { - self.sse2.count_raw(start, end) - } - - /// Execute a search using AVX2 vectors and routines. - /// - /// # Safety - /// - /// Same as [`One::find_raw`], except the distance between `start` and - /// `end` must be at least the size of an AVX2 vector (in bytes). - /// - /// (The target feature safety obligation is automatically fulfilled by - /// virtue of being a method on `One`, which can only be constructed - /// when it is safe to call `sse2`/`avx2` routines.) - #[target_feature(enable = "avx2")] - #[inline] - unsafe fn find_raw_avx2( - &self, - start: *const u8, - end: *const u8, - ) -> Option<*const u8> { - self.avx2.find_raw(start, end) - } - - /// Execute a search using AVX2 vectors and routines. - /// - /// # Safety - /// - /// Same as [`One::rfind_raw`], except the distance between `start` and - /// `end` must be at least the size of an AVX2 vector (in bytes). - /// - /// (The target feature safety obligation is automatically fulfilled by - /// virtue of being a method on `One`, which can only be constructed - /// when it is safe to call `sse2`/`avx2` routines.) - #[target_feature(enable = "avx2")] - #[inline] - unsafe fn rfind_raw_avx2( - &self, - start: *const u8, - end: *const u8, - ) -> Option<*const u8> { - self.avx2.rfind_raw(start, end) - } - - /// Execute a count using AVX2 vectors and routines. - /// - /// # Safety - /// - /// Same as [`One::count_raw`], except the distance between `start` and - /// `end` must be at least the size of an AVX2 vector (in bytes). - /// - /// (The target feature safety obligation is automatically fulfilled by - /// virtue of being a method on `One`, which can only be constructed - /// when it is safe to call `sse2`/`avx2` routines.) - #[target_feature(enable = "avx2")] - #[inline] - unsafe fn count_raw_avx2( - &self, - start: *const u8, - end: *const u8, - ) -> usize { - self.avx2.count_raw(start, end) - } - - /// Returns an iterator over all occurrences of the needle byte in the - /// given haystack. - /// - /// The iterator returned implements `DoubleEndedIterator`. This means it - /// can also be used to find occurrences in reverse order. - #[inline] - pub fn iter<'a, 'h>(&'a self, haystack: &'h [u8]) -> OneIter<'a, 'h> { - OneIter { searcher: self, it: generic::Iter::new(haystack) } - } -} - -/// An iterator over all occurrences of a single byte in a haystack. -/// -/// This iterator implements `DoubleEndedIterator`, which means it can also be -/// used to find occurrences in reverse order. -/// -/// This iterator is created by the [`One::iter`] method. -/// -/// The lifetime parameters are as follows: -/// -/// * `'a` refers to the lifetime of the underlying [`One`] searcher. -/// * `'h` refers to the lifetime of the haystack being searched. -#[derive(Clone, Debug)] -pub struct OneIter<'a, 'h> { - searcher: &'a One, - it: generic::Iter<'h>, -} - -impl<'a, 'h> Iterator for OneIter<'a, 'h> { - type Item = usize; - - #[inline] - fn next(&mut self) -> Option { - // SAFETY: We rely on the generic iterator to provide valid start - // and end pointers, but we guarantee that any pointer returned by - // 'find_raw' falls within the bounds of the start and end pointer. - unsafe { self.it.next(|s, e| self.searcher.find_raw(s, e)) } - } - - #[inline] - fn count(self) -> usize { - self.it.count(|s, e| { - // SAFETY: We rely on our generic iterator to return valid start - // and end pointers. - unsafe { self.searcher.count_raw(s, e) } - }) - } - - #[inline] - fn size_hint(&self) -> (usize, Option) { - self.it.size_hint() - } -} - -impl<'a, 'h> DoubleEndedIterator for OneIter<'a, 'h> { - #[inline] - fn next_back(&mut self) -> Option { - // SAFETY: We rely on the generic iterator to provide valid start - // and end pointers, but we guarantee that any pointer returned by - // 'rfind_raw' falls within the bounds of the start and end pointer. - unsafe { self.it.next_back(|s, e| self.searcher.rfind_raw(s, e)) } - } -} - -impl<'a, 'h> core::iter::FusedIterator for OneIter<'a, 'h> {} - -/// Finds all occurrences of two bytes in a haystack. -/// -/// That is, this reports matches of one of two possible bytes. For example, -/// searching for `a` or `b` in `afoobar` would report matches at offsets `0`, -/// `4` and `5`. -#[derive(Clone, Copy, Debug)] -pub struct Two { - /// Used for haystacks less than 32 bytes. - sse2: generic::Two<__m128i>, - /// Used for haystacks bigger than 32 bytes. - avx2: generic::Two<__m256i>, -} - -impl Two { - /// Create a new searcher that finds occurrences of the needle bytes given. - /// - /// This particular searcher is specialized to use AVX2 vector instructions - /// that typically make it quite fast. (SSE2 is used for haystacks that - /// are too short to accommodate an AVX2 vector.) - /// - /// If either SSE2 or AVX2 is unavailable in the current environment, then - /// `None` is returned. - #[inline] - pub fn new(needle1: u8, needle2: u8) -> Option { - if Two::is_available() { - // SAFETY: we check that sse2 and avx2 are available above. - unsafe { Some(Two::new_unchecked(needle1, needle2)) } - } else { - None - } - } - - /// Create a new finder specific to AVX2 vectors and routines without - /// checking that either SSE2 or AVX2 is available. - /// - /// # Safety - /// - /// Callers must guarantee that it is safe to execute both `sse2` and - /// `avx2` instructions in the current environment. - /// - /// Note that it is a common misconception that if one compiles for an - /// `x86_64` target, then they therefore automatically have access to SSE2 - /// instructions. While this is almost always the case, it isn't true in - /// 100% of cases. - #[target_feature(enable = "sse2", enable = "avx2")] - #[inline] - pub unsafe fn new_unchecked(needle1: u8, needle2: u8) -> Two { - Two { - sse2: generic::Two::new(needle1, needle2), - avx2: generic::Two::new(needle1, needle2), - } - } - - /// Returns true when this implementation is available in the current - /// environment. - /// - /// When this is true, it is guaranteed that [`Two::new`] will return - /// a `Some` value. Similarly, when it is false, it is guaranteed that - /// `Two::new` will return a `None` value. - /// - /// Note also that for the lifetime of a single program, if this returns - /// true then it will always return true. - #[inline] - pub fn is_available() -> bool { - #[cfg(not(target_feature = "sse2"))] - { - false - } - #[cfg(target_feature = "sse2")] - { - #[cfg(target_feature = "avx2")] - { - true - } - #[cfg(not(target_feature = "avx2"))] - { - #[cfg(feature = "std")] - { - std::is_x86_feature_detected!("avx2") - } - #[cfg(not(feature = "std"))] - { - false - } - } - } - } - - /// Return the first occurrence of one of the needle bytes in the given - /// haystack. If no such occurrence exists, then `None` is returned. - /// - /// The occurrence is reported as an offset into `haystack`. Its maximum - /// value is `haystack.len() - 1`. - #[inline] - pub fn find(&self, haystack: &[u8]) -> Option { - // SAFETY: `find_raw` guarantees that if a pointer is returned, it - // falls within the bounds of the start and end pointers. - unsafe { - generic::search_slice_with_raw(haystack, |s, e| { - self.find_raw(s, e) - }) - } - } - - /// Return the last occurrence of one of the needle bytes in the given - /// haystack. If no such occurrence exists, then `None` is returned. - /// - /// The occurrence is reported as an offset into `haystack`. Its maximum - /// value is `haystack.len() - 1`. - #[inline] - pub fn rfind(&self, haystack: &[u8]) -> Option { - // SAFETY: `find_raw` guarantees that if a pointer is returned, it - // falls within the bounds of the start and end pointers. - unsafe { - generic::search_slice_with_raw(haystack, |s, e| { - self.rfind_raw(s, e) - }) - } - } - - /// Like `find`, but accepts and returns raw pointers. - /// - /// When a match is found, the pointer returned is guaranteed to be - /// `>= start` and `< end`. - /// - /// This routine is useful if you're already using raw pointers and would - /// like to avoid converting back to a slice before executing a search. - /// - /// # Safety - /// - /// * Both `start` and `end` must be valid for reads. - /// * Both `start` and `end` must point to an initialized value. - /// * Both `start` and `end` must point to the same allocated object and - /// must either be in bounds or at most one byte past the end of the - /// allocated object. - /// * Both `start` and `end` must be _derived from_ a pointer to the same - /// object. - /// * The distance between `start` and `end` must not overflow `isize`. - /// * The distance being in bounds must not rely on "wrapping around" the - /// address space. - /// - /// Note that callers may pass a pair of pointers such that `start >= end`. - /// In that case, `None` will always be returned. - #[inline] - pub unsafe fn find_raw( - &self, - start: *const u8, - end: *const u8, - ) -> Option<*const u8> { - if start >= end { - return None; - } - let len = end.distance(start); - if len < __m256i::BYTES { - return if len < __m128i::BYTES { - // SAFETY: We require the caller to pass valid start/end - // pointers. - generic::fwd_byte_by_byte(start, end, |b| { - b == self.sse2.needle1() || b == self.sse2.needle2() - }) - } else { - // SAFETY: We require the caller to pass valid start/end - // pointers. - self.find_raw_sse2(start, end) - }; - } - // SAFETY: Building a `Two` means it's safe to call both 'sse2' and - // 'avx2' routines. Also, we've checked that our haystack is big - // enough to run on the vector routine. Pointer validity is caller's - // responsibility. - // - // Note that we could call `self.avx2.find_raw` directly here. But that - // means we'd have to annotate this routine with `target_feature`. - // Which is fine, because this routine is `unsafe` anyway and the - // `target_feature` obligation is met by virtue of building a `Two`. - // The real problem is that a routine with a `target_feature` - // annotation generally can't be inlined into caller code unless - // the caller code has the same target feature annotations. Namely, - // the common case (at time of writing) is for calling code to not - // have the `avx2` target feature enabled *at compile time*. Without - // `target_feature` on this routine, it can be inlined which will - // handle some of the short-haystack cases above without touching the - // architecture specific code. - self.find_raw_avx2(start, end) - } - - /// Like `rfind`, but accepts and returns raw pointers. - /// - /// When a match is found, the pointer returned is guaranteed to be - /// `>= start` and `< end`. - /// - /// This routine is useful if you're already using raw pointers and would - /// like to avoid converting back to a slice before executing a search. - /// - /// # Safety - /// - /// * Both `start` and `end` must be valid for reads. - /// * Both `start` and `end` must point to an initialized value. - /// * Both `start` and `end` must point to the same allocated object and - /// must either be in bounds or at most one byte past the end of the - /// allocated object. - /// * Both `start` and `end` must be _derived from_ a pointer to the same - /// object. - /// * The distance between `start` and `end` must not overflow `isize`. - /// * The distance being in bounds must not rely on "wrapping around" the - /// address space. - /// - /// Note that callers may pass a pair of pointers such that `start >= end`. - /// In that case, `None` will always be returned. - #[inline] - pub unsafe fn rfind_raw( - &self, - start: *const u8, - end: *const u8, - ) -> Option<*const u8> { - if start >= end { - return None; - } - let len = end.distance(start); - if len < __m256i::BYTES { - return if len < __m128i::BYTES { - // SAFETY: We require the caller to pass valid start/end - // pointers. - generic::rev_byte_by_byte(start, end, |b| { - b == self.sse2.needle1() || b == self.sse2.needle2() - }) - } else { - // SAFETY: We require the caller to pass valid start/end - // pointers. - self.rfind_raw_sse2(start, end) - }; - } - // SAFETY: Building a `Two` means it's safe to call both 'sse2' and - // 'avx2' routines. Also, we've checked that our haystack is big - // enough to run on the vector routine. Pointer validity is caller's - // responsibility. - // - // See note in forward routine above for why we don't just call - // `self.avx2.rfind_raw` directly here. - self.rfind_raw_avx2(start, end) - } - - /// Execute a search using SSE2 vectors and routines. - /// - /// # Safety - /// - /// Same as [`Two::find_raw`], except the distance between `start` and - /// `end` must be at least the size of an SSE2 vector (in bytes). - /// - /// (The target feature safety obligation is automatically fulfilled by - /// virtue of being a method on `Two`, which can only be constructed - /// when it is safe to call `sse2`/`avx2` routines.) - #[target_feature(enable = "sse2")] - #[inline] - unsafe fn find_raw_sse2( - &self, - start: *const u8, - end: *const u8, - ) -> Option<*const u8> { - self.sse2.find_raw(start, end) - } - - /// Execute a search using SSE2 vectors and routines. - /// - /// # Safety - /// - /// Same as [`Two::rfind_raw`], except the distance between `start` and - /// `end` must be at least the size of an SSE2 vector (in bytes). - /// - /// (The target feature safety obligation is automatically fulfilled by - /// virtue of being a method on `Two`, which can only be constructed - /// when it is safe to call `sse2`/`avx2` routines.) - #[target_feature(enable = "sse2")] - #[inline] - unsafe fn rfind_raw_sse2( - &self, - start: *const u8, - end: *const u8, - ) -> Option<*const u8> { - self.sse2.rfind_raw(start, end) - } - - /// Execute a search using AVX2 vectors and routines. - /// - /// # Safety - /// - /// Same as [`Two::find_raw`], except the distance between `start` and - /// `end` must be at least the size of an AVX2 vector (in bytes). - /// - /// (The target feature safety obligation is automatically fulfilled by - /// virtue of being a method on `Two`, which can only be constructed - /// when it is safe to call `sse2`/`avx2` routines.) - #[target_feature(enable = "avx2")] - #[inline] - unsafe fn find_raw_avx2( - &self, - start: *const u8, - end: *const u8, - ) -> Option<*const u8> { - self.avx2.find_raw(start, end) - } - - /// Execute a search using AVX2 vectors and routines. - /// - /// # Safety - /// - /// Same as [`Two::rfind_raw`], except the distance between `start` and - /// `end` must be at least the size of an AVX2 vector (in bytes). - /// - /// (The target feature safety obligation is automatically fulfilled by - /// virtue of being a method on `Two`, which can only be constructed - /// when it is safe to call `sse2`/`avx2` routines.) - #[target_feature(enable = "avx2")] - #[inline] - unsafe fn rfind_raw_avx2( - &self, - start: *const u8, - end: *const u8, - ) -> Option<*const u8> { - self.avx2.rfind_raw(start, end) - } - - /// Returns an iterator over all occurrences of the needle bytes in the - /// given haystack. - /// - /// The iterator returned implements `DoubleEndedIterator`. This means it - /// can also be used to find occurrences in reverse order. - #[inline] - pub fn iter<'a, 'h>(&'a self, haystack: &'h [u8]) -> TwoIter<'a, 'h> { - TwoIter { searcher: self, it: generic::Iter::new(haystack) } - } -} - -/// An iterator over all occurrences of two possible bytes in a haystack. -/// -/// This iterator implements `DoubleEndedIterator`, which means it can also be -/// used to find occurrences in reverse order. -/// -/// This iterator is created by the [`Two::iter`] method. -/// -/// The lifetime parameters are as follows: -/// -/// * `'a` refers to the lifetime of the underlying [`Two`] searcher. -/// * `'h` refers to the lifetime of the haystack being searched. -#[derive(Clone, Debug)] -pub struct TwoIter<'a, 'h> { - searcher: &'a Two, - it: generic::Iter<'h>, -} - -impl<'a, 'h> Iterator for TwoIter<'a, 'h> { - type Item = usize; - - #[inline] - fn next(&mut self) -> Option { - // SAFETY: We rely on the generic iterator to provide valid start - // and end pointers, but we guarantee that any pointer returned by - // 'find_raw' falls within the bounds of the start and end pointer. - unsafe { self.it.next(|s, e| self.searcher.find_raw(s, e)) } - } - - #[inline] - fn size_hint(&self) -> (usize, Option) { - self.it.size_hint() - } -} - -impl<'a, 'h> DoubleEndedIterator for TwoIter<'a, 'h> { - #[inline] - fn next_back(&mut self) -> Option { - // SAFETY: We rely on the generic iterator to provide valid start - // and end pointers, but we guarantee that any pointer returned by - // 'rfind_raw' falls within the bounds of the start and end pointer. - unsafe { self.it.next_back(|s, e| self.searcher.rfind_raw(s, e)) } - } -} - -impl<'a, 'h> core::iter::FusedIterator for TwoIter<'a, 'h> {} - -/// Finds all occurrences of three bytes in a haystack. -/// -/// That is, this reports matches of one of three possible bytes. For example, -/// searching for `a`, `b` or `o` in `afoobar` would report matches at offsets -/// `0`, `2`, `3`, `4` and `5`. -#[derive(Clone, Copy, Debug)] -pub struct Three { - /// Used for haystacks less than 32 bytes. - sse2: generic::Three<__m128i>, - /// Used for haystacks bigger than 32 bytes. - avx2: generic::Three<__m256i>, -} - -impl Three { - /// Create a new searcher that finds occurrences of the needle bytes given. - /// - /// This particular searcher is specialized to use AVX2 vector instructions - /// that typically make it quite fast. (SSE2 is used for haystacks that - /// are too short to accommodate an AVX2 vector.) - /// - /// If either SSE2 or AVX2 is unavailable in the current environment, then - /// `None` is returned. - #[inline] - pub fn new(needle1: u8, needle2: u8, needle3: u8) -> Option { - if Three::is_available() { - // SAFETY: we check that sse2 and avx2 are available above. - unsafe { Some(Three::new_unchecked(needle1, needle2, needle3)) } - } else { - None - } - } - - /// Create a new finder specific to AVX2 vectors and routines without - /// checking that either SSE2 or AVX2 is available. - /// - /// # Safety - /// - /// Callers must guarantee that it is safe to execute both `sse2` and - /// `avx2` instructions in the current environment. - /// - /// Note that it is a common misconception that if one compiles for an - /// `x86_64` target, then they therefore automatically have access to SSE2 - /// instructions. While this is almost always the case, it isn't true in - /// 100% of cases. - #[target_feature(enable = "sse2", enable = "avx2")] - #[inline] - pub unsafe fn new_unchecked( - needle1: u8, - needle2: u8, - needle3: u8, - ) -> Three { - Three { - sse2: generic::Three::new(needle1, needle2, needle3), - avx2: generic::Three::new(needle1, needle2, needle3), - } - } - - /// Returns true when this implementation is available in the current - /// environment. - /// - /// When this is true, it is guaranteed that [`Three::new`] will return - /// a `Some` value. Similarly, when it is false, it is guaranteed that - /// `Three::new` will return a `None` value. - /// - /// Note also that for the lifetime of a single program, if this returns - /// true then it will always return true. - #[inline] - pub fn is_available() -> bool { - #[cfg(not(target_feature = "sse2"))] - { - false - } - #[cfg(target_feature = "sse2")] - { - #[cfg(target_feature = "avx2")] - { - true - } - #[cfg(not(target_feature = "avx2"))] - { - #[cfg(feature = "std")] - { - std::is_x86_feature_detected!("avx2") - } - #[cfg(not(feature = "std"))] - { - false - } - } - } - } - - /// Return the first occurrence of one of the needle bytes in the given - /// haystack. If no such occurrence exists, then `None` is returned. - /// - /// The occurrence is reported as an offset into `haystack`. Its maximum - /// value is `haystack.len() - 1`. - #[inline] - pub fn find(&self, haystack: &[u8]) -> Option { - // SAFETY: `find_raw` guarantees that if a pointer is returned, it - // falls within the bounds of the start and end pointers. - unsafe { - generic::search_slice_with_raw(haystack, |s, e| { - self.find_raw(s, e) - }) - } - } - - /// Return the last occurrence of one of the needle bytes in the given - /// haystack. If no such occurrence exists, then `None` is returned. - /// - /// The occurrence is reported as an offset into `haystack`. Its maximum - /// value is `haystack.len() - 1`. - #[inline] - pub fn rfind(&self, haystack: &[u8]) -> Option { - // SAFETY: `find_raw` guarantees that if a pointer is returned, it - // falls within the bounds of the start and end pointers. - unsafe { - generic::search_slice_with_raw(haystack, |s, e| { - self.rfind_raw(s, e) - }) - } - } - - /// Like `find`, but accepts and returns raw pointers. - /// - /// When a match is found, the pointer returned is guaranteed to be - /// `>= start` and `< end`. - /// - /// This routine is useful if you're already using raw pointers and would - /// like to avoid converting back to a slice before executing a search. - /// - /// # Safety - /// - /// * Both `start` and `end` must be valid for reads. - /// * Both `start` and `end` must point to an initialized value. - /// * Both `start` and `end` must point to the same allocated object and - /// must either be in bounds or at most one byte past the end of the - /// allocated object. - /// * Both `start` and `end` must be _derived from_ a pointer to the same - /// object. - /// * The distance between `start` and `end` must not overflow `isize`. - /// * The distance being in bounds must not rely on "wrapping around" the - /// address space. - /// - /// Note that callers may pass a pair of pointers such that `start >= end`. - /// In that case, `None` will always be returned. - #[inline] - pub unsafe fn find_raw( - &self, - start: *const u8, - end: *const u8, - ) -> Option<*const u8> { - if start >= end { - return None; - } - let len = end.distance(start); - if len < __m256i::BYTES { - return if len < __m128i::BYTES { - // SAFETY: We require the caller to pass valid start/end - // pointers. - generic::fwd_byte_by_byte(start, end, |b| { - b == self.sse2.needle1() - || b == self.sse2.needle2() - || b == self.sse2.needle3() - }) - } else { - // SAFETY: We require the caller to pass valid start/end - // pointers. - self.find_raw_sse2(start, end) - }; - } - // SAFETY: Building a `Three` means it's safe to call both 'sse2' and - // 'avx2' routines. Also, we've checked that our haystack is big - // enough to run on the vector routine. Pointer validity is caller's - // responsibility. - // - // Note that we could call `self.avx2.find_raw` directly here. But that - // means we'd have to annotate this routine with `target_feature`. - // Which is fine, because this routine is `unsafe` anyway and the - // `target_feature` obligation is met by virtue of building a `Three`. - // The real problem is that a routine with a `target_feature` - // annotation generally can't be inlined into caller code unless - // the caller code has the same target feature annotations. Namely, - // the common case (at time of writing) is for calling code to not - // have the `avx2` target feature enabled *at compile time*. Without - // `target_feature` on this routine, it can be inlined which will - // handle some of the short-haystack cases above without touching the - // architecture specific code. - self.find_raw_avx2(start, end) - } - - /// Like `rfind`, but accepts and returns raw pointers. - /// - /// When a match is found, the pointer returned is guaranteed to be - /// `>= start` and `< end`. - /// - /// This routine is useful if you're already using raw pointers and would - /// like to avoid converting back to a slice before executing a search. - /// - /// # Safety - /// - /// * Both `start` and `end` must be valid for reads. - /// * Both `start` and `end` must point to an initialized value. - /// * Both `start` and `end` must point to the same allocated object and - /// must either be in bounds or at most one byte past the end of the - /// allocated object. - /// * Both `start` and `end` must be _derived from_ a pointer to the same - /// object. - /// * The distance between `start` and `end` must not overflow `isize`. - /// * The distance being in bounds must not rely on "wrapping around" the - /// address space. - /// - /// Note that callers may pass a pair of pointers such that `start >= end`. - /// In that case, `None` will always be returned. - #[inline] - pub unsafe fn rfind_raw( - &self, - start: *const u8, - end: *const u8, - ) -> Option<*const u8> { - if start >= end { - return None; - } - let len = end.distance(start); - if len < __m256i::BYTES { - return if len < __m128i::BYTES { - // SAFETY: We require the caller to pass valid start/end - // pointers. - generic::rev_byte_by_byte(start, end, |b| { - b == self.sse2.needle1() - || b == self.sse2.needle2() - || b == self.sse2.needle3() - }) - } else { - // SAFETY: We require the caller to pass valid start/end - // pointers. - self.rfind_raw_sse2(start, end) - }; - } - // SAFETY: Building a `Three` means it's safe to call both 'sse2' and - // 'avx2' routines. Also, we've checked that our haystack is big - // enough to run on the vector routine. Pointer validity is caller's - // responsibility. - // - // See note in forward routine above for why we don't just call - // `self.avx2.rfind_raw` directly here. - self.rfind_raw_avx2(start, end) - } - - /// Execute a search using SSE2 vectors and routines. - /// - /// # Safety - /// - /// Same as [`Three::find_raw`], except the distance between `start` and - /// `end` must be at least the size of an SSE2 vector (in bytes). - /// - /// (The target feature safety obligation is automatically fulfilled by - /// virtue of being a method on `Three`, which can only be constructed - /// when it is safe to call `sse2`/`avx2` routines.) - #[target_feature(enable = "sse2")] - #[inline] - unsafe fn find_raw_sse2( - &self, - start: *const u8, - end: *const u8, - ) -> Option<*const u8> { - self.sse2.find_raw(start, end) - } - - /// Execute a search using SSE2 vectors and routines. - /// - /// # Safety - /// - /// Same as [`Three::rfind_raw`], except the distance between `start` and - /// `end` must be at least the size of an SSE2 vector (in bytes). - /// - /// (The target feature safety obligation is automatically fulfilled by - /// virtue of being a method on `Three`, which can only be constructed - /// when it is safe to call `sse2`/`avx2` routines.) - #[target_feature(enable = "sse2")] - #[inline] - unsafe fn rfind_raw_sse2( - &self, - start: *const u8, - end: *const u8, - ) -> Option<*const u8> { - self.sse2.rfind_raw(start, end) - } - - /// Execute a search using AVX2 vectors and routines. - /// - /// # Safety - /// - /// Same as [`Three::find_raw`], except the distance between `start` and - /// `end` must be at least the size of an AVX2 vector (in bytes). - /// - /// (The target feature safety obligation is automatically fulfilled by - /// virtue of being a method on `Three`, which can only be constructed - /// when it is safe to call `sse2`/`avx2` routines.) - #[target_feature(enable = "avx2")] - #[inline] - unsafe fn find_raw_avx2( - &self, - start: *const u8, - end: *const u8, - ) -> Option<*const u8> { - self.avx2.find_raw(start, end) - } - - /// Execute a search using AVX2 vectors and routines. - /// - /// # Safety - /// - /// Same as [`Three::rfind_raw`], except the distance between `start` and - /// `end` must be at least the size of an AVX2 vector (in bytes). - /// - /// (The target feature safety obligation is automatically fulfilled by - /// virtue of being a method on `Three`, which can only be constructed - /// when it is safe to call `sse2`/`avx2` routines.) - #[target_feature(enable = "avx2")] - #[inline] - unsafe fn rfind_raw_avx2( - &self, - start: *const u8, - end: *const u8, - ) -> Option<*const u8> { - self.avx2.rfind_raw(start, end) - } - - /// Returns an iterator over all occurrences of the needle bytes in the - /// given haystack. - /// - /// The iterator returned implements `DoubleEndedIterator`. This means it - /// can also be used to find occurrences in reverse order. - #[inline] - pub fn iter<'a, 'h>(&'a self, haystack: &'h [u8]) -> ThreeIter<'a, 'h> { - ThreeIter { searcher: self, it: generic::Iter::new(haystack) } - } -} - -/// An iterator over all occurrences of three possible bytes in a haystack. -/// -/// This iterator implements `DoubleEndedIterator`, which means it can also be -/// used to find occurrences in reverse order. -/// -/// This iterator is created by the [`Three::iter`] method. -/// -/// The lifetime parameters are as follows: -/// -/// * `'a` refers to the lifetime of the underlying [`Three`] searcher. -/// * `'h` refers to the lifetime of the haystack being searched. -#[derive(Clone, Debug)] -pub struct ThreeIter<'a, 'h> { - searcher: &'a Three, - it: generic::Iter<'h>, -} - -impl<'a, 'h> Iterator for ThreeIter<'a, 'h> { - type Item = usize; - - #[inline] - fn next(&mut self) -> Option { - // SAFETY: We rely on the generic iterator to provide valid start - // and end pointers, but we guarantee that any pointer returned by - // 'find_raw' falls within the bounds of the start and end pointer. - unsafe { self.it.next(|s, e| self.searcher.find_raw(s, e)) } - } - - #[inline] - fn size_hint(&self) -> (usize, Option) { - self.it.size_hint() - } -} - -impl<'a, 'h> DoubleEndedIterator for ThreeIter<'a, 'h> { - #[inline] - fn next_back(&mut self) -> Option { - // SAFETY: We rely on the generic iterator to provide valid start - // and end pointers, but we guarantee that any pointer returned by - // 'rfind_raw' falls within the bounds of the start and end pointer. - unsafe { self.it.next_back(|s, e| self.searcher.rfind_raw(s, e)) } - } -} - -impl<'a, 'h> core::iter::FusedIterator for ThreeIter<'a, 'h> {} - -#[cfg(test)] -mod tests { - use super::*; - - define_memchr_quickcheck!(super); - - #[test] - fn forward_one() { - crate::tests::memchr::Runner::new(1).forward_iter( - |haystack, needles| { - Some(One::new(needles[0])?.iter(haystack).collect()) - }, - ) - } - - #[test] - fn reverse_one() { - crate::tests::memchr::Runner::new(1).reverse_iter( - |haystack, needles| { - Some(One::new(needles[0])?.iter(haystack).rev().collect()) - }, - ) - } - - #[test] - fn count_one() { - crate::tests::memchr::Runner::new(1).count_iter(|haystack, needles| { - Some(One::new(needles[0])?.iter(haystack).count()) - }) - } - - #[test] - fn forward_two() { - crate::tests::memchr::Runner::new(2).forward_iter( - |haystack, needles| { - let n1 = needles.get(0).copied()?; - let n2 = needles.get(1).copied()?; - Some(Two::new(n1, n2)?.iter(haystack).collect()) - }, - ) - } - - #[test] - fn reverse_two() { - crate::tests::memchr::Runner::new(2).reverse_iter( - |haystack, needles| { - let n1 = needles.get(0).copied()?; - let n2 = needles.get(1).copied()?; - Some(Two::new(n1, n2)?.iter(haystack).rev().collect()) - }, - ) - } - - #[test] - fn forward_three() { - crate::tests::memchr::Runner::new(3).forward_iter( - |haystack, needles| { - let n1 = needles.get(0).copied()?; - let n2 = needles.get(1).copied()?; - let n3 = needles.get(2).copied()?; - Some(Three::new(n1, n2, n3)?.iter(haystack).collect()) - }, - ) - } - - #[test] - fn reverse_three() { - crate::tests::memchr::Runner::new(3).reverse_iter( - |haystack, needles| { - let n1 = needles.get(0).copied()?; - let n2 = needles.get(1).copied()?; - let n3 = needles.get(2).copied()?; - Some(Three::new(n1, n2, n3)?.iter(haystack).rev().collect()) - }, - ) - } -} diff -Nru temporalio-1.3.0/vendor/memchr/src/arch/x86_64/avx2/mod.rs temporalio-1.3.0/vendor/memchr/src/arch/x86_64/avx2/mod.rs --- temporalio-1.3.0/vendor/memchr/src/arch/x86_64/avx2/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/arch/x86_64/avx2/mod.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,6 +0,0 @@ -/*! -Algorithms for the `x86_64` target using 256-bit vectors via AVX2. -*/ - -pub mod memchr; -pub mod packedpair; diff -Nru temporalio-1.3.0/vendor/memchr/src/arch/x86_64/avx2/packedpair.rs temporalio-1.3.0/vendor/memchr/src/arch/x86_64/avx2/packedpair.rs --- temporalio-1.3.0/vendor/memchr/src/arch/x86_64/avx2/packedpair.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/arch/x86_64/avx2/packedpair.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,272 +0,0 @@ -/*! -A 256-bit vector implementation of the "packed pair" SIMD algorithm. - -The "packed pair" algorithm is based on the [generic SIMD] algorithm. The main -difference is that it (by default) uses a background distribution of byte -frequencies to heuristically select the pair of bytes to search for. - -[generic SIMD]: http://0x80.pl/articles/simd-strfind.html#first-and-last -*/ - -use core::arch::x86_64::{__m128i, __m256i}; - -use crate::arch::{all::packedpair::Pair, generic::packedpair}; - -/// A "packed pair" finder that uses 256-bit vector operations. -/// -/// This finder picks two bytes that it believes have high predictive power -/// for indicating an overall match of a needle. Depending on whether -/// `Finder::find` or `Finder::find_prefilter` is used, it reports offsets -/// where the needle matches or could match. In the prefilter case, candidates -/// are reported whenever the [`Pair`] of bytes given matches. -#[derive(Clone, Copy, Debug)] -pub struct Finder { - sse2: packedpair::Finder<__m128i>, - avx2: packedpair::Finder<__m256i>, -} - -impl Finder { - /// Create a new pair searcher. The searcher returned can either report - /// exact matches of `needle` or act as a prefilter and report candidate - /// positions of `needle`. - /// - /// If AVX2 is unavailable in the current environment or if a [`Pair`] - /// could not be constructed from the needle given, then `None` is - /// returned. - #[inline] - pub fn new(needle: &[u8]) -> Option { - Finder::with_pair(needle, Pair::new(needle)?) - } - - /// Create a new "packed pair" finder using the pair of bytes given. - /// - /// This constructor permits callers to control precisely which pair of - /// bytes is used as a predicate. - /// - /// If AVX2 is unavailable in the current environment, then `None` is - /// returned. - #[inline] - pub fn with_pair(needle: &[u8], pair: Pair) -> Option { - if Finder::is_available() { - // SAFETY: we check that sse2/avx2 is available above. We are also - // guaranteed to have needle.len() > 1 because we have a valid - // Pair. - unsafe { Some(Finder::with_pair_impl(needle, pair)) } - } else { - None - } - } - - /// Create a new `Finder` specific to SSE2 vectors and routines. - /// - /// # Safety - /// - /// Same as the safety for `packedpair::Finder::new`, and callers must also - /// ensure that both SSE2 and AVX2 are available. - #[target_feature(enable = "sse2", enable = "avx2")] - #[inline] - unsafe fn with_pair_impl(needle: &[u8], pair: Pair) -> Finder { - let sse2 = packedpair::Finder::<__m128i>::new(needle, pair); - let avx2 = packedpair::Finder::<__m256i>::new(needle, pair); - Finder { sse2, avx2 } - } - - /// Returns true when this implementation is available in the current - /// environment. - /// - /// When this is true, it is guaranteed that [`Finder::with_pair`] will - /// return a `Some` value. Similarly, when it is false, it is guaranteed - /// that `Finder::with_pair` will return a `None` value. Notice that this - /// does not guarantee that [`Finder::new`] will return a `Finder`. Namely, - /// even when `Finder::is_available` is true, it is not guaranteed that a - /// valid [`Pair`] can be found from the needle given. - /// - /// Note also that for the lifetime of a single program, if this returns - /// true then it will always return true. - #[inline] - pub fn is_available() -> bool { - #[cfg(not(target_feature = "sse2"))] - { - false - } - #[cfg(target_feature = "sse2")] - { - #[cfg(target_feature = "avx2")] - { - true - } - #[cfg(not(target_feature = "avx2"))] - { - #[cfg(feature = "std")] - { - std::is_x86_feature_detected!("avx2") - } - #[cfg(not(feature = "std"))] - { - false - } - } - } - } - - /// Execute a search using AVX2 vectors and routines. - /// - /// # Panics - /// - /// When `haystack.len()` is less than [`Finder::min_haystack_len`]. - #[inline] - pub fn find(&self, haystack: &[u8], needle: &[u8]) -> Option { - // SAFETY: Building a `Finder` means it's safe to call 'sse2' routines. - unsafe { self.find_impl(haystack, needle) } - } - - /// Run this finder on the given haystack as a prefilter. - /// - /// If a candidate match is found, then an offset where the needle *could* - /// begin in the haystack is returned. - /// - /// # Panics - /// - /// When `haystack.len()` is less than [`Finder::min_haystack_len`]. - #[inline] - pub fn find_prefilter(&self, haystack: &[u8]) -> Option { - // SAFETY: Building a `Finder` means it's safe to call 'sse2' routines. - unsafe { self.find_prefilter_impl(haystack) } - } - - /// Execute a search using AVX2 vectors and routines. - /// - /// # Panics - /// - /// When `haystack.len()` is less than [`Finder::min_haystack_len`]. - /// - /// # Safety - /// - /// (The target feature safety obligation is automatically fulfilled by - /// virtue of being a method on `Finder`, which can only be constructed - /// when it is safe to call `sse2` and `avx2` routines.) - #[target_feature(enable = "sse2", enable = "avx2")] - #[inline] - unsafe fn find_impl( - &self, - haystack: &[u8], - needle: &[u8], - ) -> Option { - if haystack.len() < self.avx2.min_haystack_len() { - self.sse2.find(haystack, needle) - } else { - self.avx2.find(haystack, needle) - } - } - - /// Execute a prefilter search using AVX2 vectors and routines. - /// - /// # Panics - /// - /// When `haystack.len()` is less than [`Finder::min_haystack_len`]. - /// - /// # Safety - /// - /// (The target feature safety obligation is automatically fulfilled by - /// virtue of being a method on `Finder`, which can only be constructed - /// when it is safe to call `sse2` and `avx2` routines.) - #[target_feature(enable = "sse2", enable = "avx2")] - #[inline] - unsafe fn find_prefilter_impl(&self, haystack: &[u8]) -> Option { - if haystack.len() < self.avx2.min_haystack_len() { - self.sse2.find_prefilter(haystack) - } else { - self.avx2.find_prefilter(haystack) - } - } - - /// Returns the pair of offsets (into the needle) used to check as a - /// predicate before confirming whether a needle exists at a particular - /// position. - #[inline] - pub fn pair(&self) -> &Pair { - self.avx2.pair() - } - - /// Returns the minimum haystack length that this `Finder` can search. - /// - /// Using a haystack with length smaller than this in a search will result - /// in a panic. The reason for this restriction is that this finder is - /// meant to be a low-level component that is part of a larger substring - /// strategy. In that sense, it avoids trying to handle all cases and - /// instead only handles the cases that it can handle very well. - #[inline] - pub fn min_haystack_len(&self) -> usize { - // The caller doesn't need to care about AVX2's min_haystack_len - // since this implementation will automatically switch to the SSE2 - // implementation if the haystack is too short for AVX2. Therefore, the - // caller only needs to care about SSE2's min_haystack_len. - // - // This does assume that SSE2's min_haystack_len is less than or - // equal to AVX2's min_haystack_len. In practice, this is true and - // there is no way it could be false based on how this Finder is - // implemented. Namely, both SSE2 and AVX2 use the same `Pair`. If - // they used different pairs, then it's possible (although perhaps - // pathological) for SSE2's min_haystack_len to be bigger than AVX2's. - self.sse2.min_haystack_len() - } -} - -#[cfg(test)] -mod tests { - use super::*; - - fn find(haystack: &[u8], needle: &[u8]) -> Option> { - let f = Finder::new(needle)?; - if haystack.len() < f.min_haystack_len() { - return None; - } - Some(f.find(haystack, needle)) - } - - define_substring_forward_quickcheck!(find); - - #[test] - fn forward_substring() { - crate::tests::substring::Runner::new().fwd(find).run() - } - - #[test] - fn forward_packedpair() { - fn find( - haystack: &[u8], - needle: &[u8], - index1: u8, - index2: u8, - ) -> Option> { - let pair = Pair::with_indices(needle, index1, index2)?; - let f = Finder::with_pair(needle, pair)?; - if haystack.len() < f.min_haystack_len() { - return None; - } - Some(f.find(haystack, needle)) - } - crate::tests::packedpair::Runner::new().fwd(find).run() - } - - #[test] - fn forward_packedpair_prefilter() { - fn find( - haystack: &[u8], - needle: &[u8], - index1: u8, - index2: u8, - ) -> Option> { - if !cfg!(target_feature = "sse2") { - return None; - } - let pair = Pair::with_indices(needle, index1, index2)?; - let f = Finder::with_pair(needle, pair)?; - if haystack.len() < f.min_haystack_len() { - return None; - } - Some(f.find_prefilter(haystack)) - } - crate::tests::packedpair::Runner::new().fwd(find).run() - } -} diff -Nru temporalio-1.3.0/vendor/memchr/src/arch/x86_64/memchr.rs temporalio-1.3.0/vendor/memchr/src/arch/x86_64/memchr.rs --- temporalio-1.3.0/vendor/memchr/src/arch/x86_64/memchr.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/arch/x86_64/memchr.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,335 +0,0 @@ -/*! -Wrapper routines for `memchr` and friends. - -These routines efficiently dispatch to the best implementation based on what -the CPU supports. -*/ - -/// Provides a way to run a memchr-like function while amortizing the cost of -/// runtime CPU feature detection. -/// -/// This works by loading a function pointer from an atomic global. Initially, -/// this global is set to a function that does CPU feature detection. For -/// example, if AVX2 is enabled, then the AVX2 implementation is used. -/// Otherwise, at least on x86_64, the SSE2 implementation is used. (And -/// in some niche cases, if SSE2 isn't available, then the architecture -/// independent fallback implementation is used.) -/// -/// After the first call to this function, the atomic global is replaced with -/// the specific AVX2, SSE2 or fallback routine chosen. Subsequent calls then -/// will directly call the chosen routine instead of needing to go through the -/// CPU feature detection branching again. -/// -/// This particular macro is specifically written to provide the implementation -/// of functions with the following signature: -/// -/// ```ignore -/// fn memchr(needle1: u8, start: *const u8, end: *const u8) -> Option; -/// ``` -/// -/// Where you can also have `memchr2` and `memchr3`, but with `needle2` and -/// `needle3`, respectively. The `start` and `end` parameters correspond to the -/// start and end of the haystack, respectively. -/// -/// We use raw pointers here instead of the more obvious `haystack: &[u8]` so -/// that the function is compatible with our lower level iterator logic that -/// operates on raw pointers. We use this macro to implement "raw" memchr -/// routines with the signature above, and then define memchr routines using -/// regular slices on top of them. -/// -/// Note that we use `#[cfg(target_feature = "sse2")]` below even though -/// it shouldn't be strictly necessary because without it, it seems to -/// cause the compiler to blow up. I guess it can't handle a function -/// pointer being created with a sse target feature? Dunno. See the -/// `build-for-x86-64-but-non-sse-target` CI job if you want to experiment with -/// this. -/// -/// # Safety -/// -/// Primarily callers must that `$fnty` is a correct function pointer type and -/// not something else. -/// -/// Callers must also ensure that `$memchrty::$memchrfind` corresponds to a -/// routine that returns a valid function pointer when a match is found. That -/// is, a pointer that is `>= start` and `< end`. -/// -/// Callers must also ensure that the `$hay_start` and `$hay_end` identifiers -/// correspond to valid pointers. -macro_rules! unsafe_ifunc { - ( - $memchrty:ident, - $memchrfind:ident, - $fnty:ty, - $retty:ty, - $hay_start:ident, - $hay_end:ident, - $($needle:ident),+ - ) => {{ - #![allow(unused_unsafe)] - - use core::sync::atomic::{AtomicPtr, Ordering}; - - type Fn = *mut (); - type RealFn = $fnty; - static FN: AtomicPtr<()> = AtomicPtr::new(detect as Fn); - - #[cfg(target_feature = "sse2")] - #[target_feature(enable = "sse2", enable = "avx2")] - unsafe fn find_avx2( - $($needle: u8),+, - $hay_start: *const u8, - $hay_end: *const u8, - ) -> $retty { - use crate::arch::x86_64::avx2::memchr::$memchrty; - $memchrty::new_unchecked($($needle),+) - .$memchrfind($hay_start, $hay_end) - } - - #[cfg(target_feature = "sse2")] - #[target_feature(enable = "sse2")] - unsafe fn find_sse2( - $($needle: u8),+, - $hay_start: *const u8, - $hay_end: *const u8, - ) -> $retty { - use crate::arch::x86_64::sse2::memchr::$memchrty; - $memchrty::new_unchecked($($needle),+) - .$memchrfind($hay_start, $hay_end) - } - - unsafe fn find_fallback( - $($needle: u8),+, - $hay_start: *const u8, - $hay_end: *const u8, - ) -> $retty { - use crate::arch::all::memchr::$memchrty; - $memchrty::new($($needle),+).$memchrfind($hay_start, $hay_end) - } - - unsafe fn detect( - $($needle: u8),+, - $hay_start: *const u8, - $hay_end: *const u8, - ) -> $retty { - let fun = { - #[cfg(not(target_feature = "sse2"))] - { - debug!( - "no sse2 feature available, using fallback for {}", - stringify!($memchrty), - ); - find_fallback as RealFn - } - #[cfg(target_feature = "sse2")] - { - use crate::arch::x86_64::{sse2, avx2}; - if avx2::memchr::$memchrty::is_available() { - debug!("chose AVX2 for {}", stringify!($memchrty)); - find_avx2 as RealFn - } else if sse2::memchr::$memchrty::is_available() { - debug!("chose SSE2 for {}", stringify!($memchrty)); - find_sse2 as RealFn - } else { - debug!("chose fallback for {}", stringify!($memchrty)); - find_fallback as RealFn - } - } - }; - FN.store(fun as Fn, Ordering::Relaxed); - // SAFETY: The only thing we need to uphold here is the - // `#[target_feature]` requirements. Since we check is_available - // above before using the corresponding implementation, we are - // guaranteed to only call code that is supported on the current - // CPU. - fun($($needle),+, $hay_start, $hay_end) - } - - // SAFETY: By virtue of the caller contract, RealFn is a function - // pointer, which is always safe to transmute with a *mut (). Also, - // since we use $memchrty::is_available, it is guaranteed to be safe - // to call $memchrty::$memchrfind. - unsafe { - let fun = FN.load(Ordering::Relaxed); - core::mem::transmute::(fun)( - $($needle),+, - $hay_start, - $hay_end, - ) - } - }}; -} - -// The routines below dispatch to AVX2, SSE2 or a fallback routine based on -// what's available in the current environment. The secret sauce here is that -// we only check for which one to use approximately once, and then "cache" that -// choice into a global function pointer. Subsequent invocations then just call -// the appropriate function directly. - -/// memchr, but using raw pointers to represent the haystack. -/// -/// # Safety -/// -/// Pointers must be valid. See `One::find_raw`. -#[inline(always)] -pub(crate) fn memchr_raw( - n1: u8, - start: *const u8, - end: *const u8, -) -> Option<*const u8> { - // SAFETY: We provide a valid function pointer type. - unsafe_ifunc!( - One, - find_raw, - unsafe fn(u8, *const u8, *const u8) -> Option<*const u8>, - Option<*const u8>, - start, - end, - n1 - ) -} - -/// memrchr, but using raw pointers to represent the haystack. -/// -/// # Safety -/// -/// Pointers must be valid. See `One::rfind_raw`. -#[inline(always)] -pub(crate) fn memrchr_raw( - n1: u8, - start: *const u8, - end: *const u8, -) -> Option<*const u8> { - // SAFETY: We provide a valid function pointer type. - unsafe_ifunc!( - One, - rfind_raw, - unsafe fn(u8, *const u8, *const u8) -> Option<*const u8>, - Option<*const u8>, - start, - end, - n1 - ) -} - -/// memchr2, but using raw pointers to represent the haystack. -/// -/// # Safety -/// -/// Pointers must be valid. See `Two::find_raw`. -#[inline(always)] -pub(crate) fn memchr2_raw( - n1: u8, - n2: u8, - start: *const u8, - end: *const u8, -) -> Option<*const u8> { - // SAFETY: We provide a valid function pointer type. - unsafe_ifunc!( - Two, - find_raw, - unsafe fn(u8, u8, *const u8, *const u8) -> Option<*const u8>, - Option<*const u8>, - start, - end, - n1, - n2 - ) -} - -/// memrchr2, but using raw pointers to represent the haystack. -/// -/// # Safety -/// -/// Pointers must be valid. See `Two::rfind_raw`. -#[inline(always)] -pub(crate) fn memrchr2_raw( - n1: u8, - n2: u8, - start: *const u8, - end: *const u8, -) -> Option<*const u8> { - // SAFETY: We provide a valid function pointer type. - unsafe_ifunc!( - Two, - rfind_raw, - unsafe fn(u8, u8, *const u8, *const u8) -> Option<*const u8>, - Option<*const u8>, - start, - end, - n1, - n2 - ) -} - -/// memchr3, but using raw pointers to represent the haystack. -/// -/// # Safety -/// -/// Pointers must be valid. See `Three::find_raw`. -#[inline(always)] -pub(crate) fn memchr3_raw( - n1: u8, - n2: u8, - n3: u8, - start: *const u8, - end: *const u8, -) -> Option<*const u8> { - // SAFETY: We provide a valid function pointer type. - unsafe_ifunc!( - Three, - find_raw, - unsafe fn(u8, u8, u8, *const u8, *const u8) -> Option<*const u8>, - Option<*const u8>, - start, - end, - n1, - n2, - n3 - ) -} - -/// memrchr3, but using raw pointers to represent the haystack. -/// -/// # Safety -/// -/// Pointers must be valid. See `Three::rfind_raw`. -#[inline(always)] -pub(crate) fn memrchr3_raw( - n1: u8, - n2: u8, - n3: u8, - start: *const u8, - end: *const u8, -) -> Option<*const u8> { - // SAFETY: We provide a valid function pointer type. - unsafe_ifunc!( - Three, - rfind_raw, - unsafe fn(u8, u8, u8, *const u8, *const u8) -> Option<*const u8>, - Option<*const u8>, - start, - end, - n1, - n2, - n3 - ) -} - -/// Count all matching bytes, but using raw pointers to represent the haystack. -/// -/// # Safety -/// -/// Pointers must be valid. See `One::count_raw`. -#[inline(always)] -pub(crate) fn count_raw(n1: u8, start: *const u8, end: *const u8) -> usize { - // SAFETY: We provide a valid function pointer type. - unsafe_ifunc!( - One, - count_raw, - unsafe fn(u8, *const u8, *const u8) -> usize, - usize, - start, - end, - n1 - ) -} diff -Nru temporalio-1.3.0/vendor/memchr/src/arch/x86_64/mod.rs temporalio-1.3.0/vendor/memchr/src/arch/x86_64/mod.rs --- temporalio-1.3.0/vendor/memchr/src/arch/x86_64/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/arch/x86_64/mod.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,8 +0,0 @@ -/*! -Vector algorithms for the `x86_64` target. -*/ - -pub mod avx2; -pub mod sse2; - -pub(crate) mod memchr; diff -Nru temporalio-1.3.0/vendor/memchr/src/arch/x86_64/sse2/memchr.rs temporalio-1.3.0/vendor/memchr/src/arch/x86_64/sse2/memchr.rs --- temporalio-1.3.0/vendor/memchr/src/arch/x86_64/sse2/memchr.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/arch/x86_64/sse2/memchr.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,1077 +0,0 @@ -/*! -This module defines 128-bit vector implementations of `memchr` and friends. - -The main types in this module are [`One`], [`Two`] and [`Three`]. They are for -searching for one, two or three distinct bytes, respectively, in a haystack. -Each type also has corresponding double ended iterators. These searchers are -typically much faster than scalar routines accomplishing the same task. - -The `One` searcher also provides a [`One::count`] routine for efficiently -counting the number of times a single byte occurs in a haystack. This is -useful, for example, for counting the number of lines in a haystack. This -routine exists because it is usually faster, especially with a high match -count, then using [`One::find`] repeatedly. ([`OneIter`] specializes its -`Iterator::count` implementation to use this routine.) - -Only one, two and three bytes are supported because three bytes is about -the point where one sees diminishing returns. Beyond this point and it's -probably (but not necessarily) better to just use a simple `[bool; 256]` array -or similar. However, it depends mightily on the specific work-load and the -expected match frequency. -*/ - -use core::arch::x86_64::__m128i; - -use crate::{arch::generic::memchr as generic, ext::Pointer, vector::Vector}; - -/// Finds all occurrences of a single byte in a haystack. -#[derive(Clone, Copy, Debug)] -pub struct One(generic::One<__m128i>); - -impl One { - /// Create a new searcher that finds occurrences of the needle byte given. - /// - /// This particular searcher is specialized to use SSE2 vector instructions - /// that typically make it quite fast. - /// - /// If SSE2 is unavailable in the current environment, then `None` is - /// returned. - #[inline] - pub fn new(needle: u8) -> Option { - if One::is_available() { - // SAFETY: we check that sse2 is available above. - unsafe { Some(One::new_unchecked(needle)) } - } else { - None - } - } - - /// Create a new finder specific to SSE2 vectors and routines without - /// checking that SSE2 is available. - /// - /// # Safety - /// - /// Callers must guarantee that it is safe to execute `sse2` instructions - /// in the current environment. - /// - /// Note that it is a common misconception that if one compiles for an - /// `x86_64` target, then they therefore automatically have access to SSE2 - /// instructions. While this is almost always the case, it isn't true in - /// 100% of cases. - #[target_feature(enable = "sse2")] - #[inline] - pub unsafe fn new_unchecked(needle: u8) -> One { - One(generic::One::new(needle)) - } - - /// Returns true when this implementation is available in the current - /// environment. - /// - /// When this is true, it is guaranteed that [`One::new`] will return - /// a `Some` value. Similarly, when it is false, it is guaranteed that - /// `One::new` will return a `None` value. - /// - /// Note also that for the lifetime of a single program, if this returns - /// true then it will always return true. - #[inline] - pub fn is_available() -> bool { - #[cfg(target_feature = "sse2")] - { - true - } - #[cfg(not(target_feature = "sse2"))] - { - false - } - } - - /// Return the first occurrence of one of the needle bytes in the given - /// haystack. If no such occurrence exists, then `None` is returned. - /// - /// The occurrence is reported as an offset into `haystack`. Its maximum - /// value is `haystack.len() - 1`. - #[inline] - pub fn find(&self, haystack: &[u8]) -> Option { - // SAFETY: `find_raw` guarantees that if a pointer is returned, it - // falls within the bounds of the start and end pointers. - unsafe { - generic::search_slice_with_raw(haystack, |s, e| { - self.find_raw(s, e) - }) - } - } - - /// Return the last occurrence of one of the needle bytes in the given - /// haystack. If no such occurrence exists, then `None` is returned. - /// - /// The occurrence is reported as an offset into `haystack`. Its maximum - /// value is `haystack.len() - 1`. - #[inline] - pub fn rfind(&self, haystack: &[u8]) -> Option { - // SAFETY: `rfind_raw` guarantees that if a pointer is returned, it - // falls within the bounds of the start and end pointers. - unsafe { - generic::search_slice_with_raw(haystack, |s, e| { - self.rfind_raw(s, e) - }) - } - } - - /// Counts all occurrences of this byte in the given haystack. - #[inline] - pub fn count(&self, haystack: &[u8]) -> usize { - // SAFETY: All of our pointers are derived directly from a borrowed - // slice, which is guaranteed to be valid. - unsafe { - let start = haystack.as_ptr(); - let end = start.add(haystack.len()); - self.count_raw(start, end) - } - } - - /// Like `find`, but accepts and returns raw pointers. - /// - /// When a match is found, the pointer returned is guaranteed to be - /// `>= start` and `< end`. - /// - /// This routine is useful if you're already using raw pointers and would - /// like to avoid converting back to a slice before executing a search. - /// - /// # Safety - /// - /// * Both `start` and `end` must be valid for reads. - /// * Both `start` and `end` must point to an initialized value. - /// * Both `start` and `end` must point to the same allocated object and - /// must either be in bounds or at most one byte past the end of the - /// allocated object. - /// * Both `start` and `end` must be _derived from_ a pointer to the same - /// object. - /// * The distance between `start` and `end` must not overflow `isize`. - /// * The distance being in bounds must not rely on "wrapping around" the - /// address space. - /// - /// Note that callers may pass a pair of pointers such that `start >= end`. - /// In that case, `None` will always be returned. - #[inline] - pub unsafe fn find_raw( - &self, - start: *const u8, - end: *const u8, - ) -> Option<*const u8> { - if start >= end { - return None; - } - if end.distance(start) < __m128i::BYTES { - // SAFETY: We require the caller to pass valid start/end pointers. - return generic::fwd_byte_by_byte(start, end, |b| { - b == self.0.needle1() - }); - } - // SAFETY: Building a `One` means it's safe to call 'sse2' routines. - // Also, we've checked that our haystack is big enough to run on the - // vector routine. Pointer validity is caller's responsibility. - // - // Note that we could call `self.0.find_raw` directly here. But that - // means we'd have to annotate this routine with `target_feature`. - // Which is fine, because this routine is `unsafe` anyway and the - // `target_feature` obligation is met by virtue of building a `One`. - // The real problem is that a routine with a `target_feature` - // annotation generally can't be inlined into caller code unless the - // caller code has the same target feature annotations. Which is maybe - // okay for SSE2, but we do the same thing for AVX2 where caller code - // probably usually doesn't have AVX2 enabled. That means that this - // routine can be inlined which will handle some of the short-haystack - // cases above without touching the architecture specific code. - self.find_raw_impl(start, end) - } - - /// Like `rfind`, but accepts and returns raw pointers. - /// - /// When a match is found, the pointer returned is guaranteed to be - /// `>= start` and `< end`. - /// - /// This routine is useful if you're already using raw pointers and would - /// like to avoid converting back to a slice before executing a search. - /// - /// # Safety - /// - /// * Both `start` and `end` must be valid for reads. - /// * Both `start` and `end` must point to an initialized value. - /// * Both `start` and `end` must point to the same allocated object and - /// must either be in bounds or at most one byte past the end of the - /// allocated object. - /// * Both `start` and `end` must be _derived from_ a pointer to the same - /// object. - /// * The distance between `start` and `end` must not overflow `isize`. - /// * The distance being in bounds must not rely on "wrapping around" the - /// address space. - /// - /// Note that callers may pass a pair of pointers such that `start >= end`. - /// In that case, `None` will always be returned. - #[inline] - pub unsafe fn rfind_raw( - &self, - start: *const u8, - end: *const u8, - ) -> Option<*const u8> { - if start >= end { - return None; - } - if end.distance(start) < __m128i::BYTES { - // SAFETY: We require the caller to pass valid start/end pointers. - return generic::rev_byte_by_byte(start, end, |b| { - b == self.0.needle1() - }); - } - // SAFETY: Building a `One` means it's safe to call 'sse2' routines. - // Also, we've checked that our haystack is big enough to run on the - // vector routine. Pointer validity is caller's responsibility. - // - // See note in forward routine above for why we don't just call - // `self.0.rfind_raw` directly here. - self.rfind_raw_impl(start, end) - } - - /// Counts all occurrences of this byte in the given haystack represented - /// by raw pointers. - /// - /// This routine is useful if you're already using raw pointers and would - /// like to avoid converting back to a slice before executing a search. - /// - /// # Safety - /// - /// * Both `start` and `end` must be valid for reads. - /// * Both `start` and `end` must point to an initialized value. - /// * Both `start` and `end` must point to the same allocated object and - /// must either be in bounds or at most one byte past the end of the - /// allocated object. - /// * Both `start` and `end` must be _derived from_ a pointer to the same - /// object. - /// * The distance between `start` and `end` must not overflow `isize`. - /// * The distance being in bounds must not rely on "wrapping around" the - /// address space. - /// - /// Note that callers may pass a pair of pointers such that `start >= end`. - /// In that case, `0` will always be returned. - #[inline] - pub unsafe fn count_raw(&self, start: *const u8, end: *const u8) -> usize { - if start >= end { - return 0; - } - if end.distance(start) < __m128i::BYTES { - // SAFETY: We require the caller to pass valid start/end pointers. - return generic::count_byte_by_byte(start, end, |b| { - b == self.0.needle1() - }); - } - // SAFETY: Building a `One` means it's safe to call 'sse2' routines. - // Also, we've checked that our haystack is big enough to run on the - // vector routine. Pointer validity is caller's responsibility. - self.count_raw_impl(start, end) - } - - /// Execute a search using SSE2 vectors and routines. - /// - /// # Safety - /// - /// Same as [`One::find_raw`], except the distance between `start` and - /// `end` must be at least the size of an SSE2 vector (in bytes). - /// - /// (The target feature safety obligation is automatically fulfilled by - /// virtue of being a method on `One`, which can only be constructed - /// when it is safe to call `sse2` routines.) - #[target_feature(enable = "sse2")] - #[inline] - unsafe fn find_raw_impl( - &self, - start: *const u8, - end: *const u8, - ) -> Option<*const u8> { - self.0.find_raw(start, end) - } - - /// Execute a search using SSE2 vectors and routines. - /// - /// # Safety - /// - /// Same as [`One::rfind_raw`], except the distance between `start` and - /// `end` must be at least the size of an SSE2 vector (in bytes). - /// - /// (The target feature safety obligation is automatically fulfilled by - /// virtue of being a method on `One`, which can only be constructed - /// when it is safe to call `sse2` routines.) - #[target_feature(enable = "sse2")] - #[inline] - unsafe fn rfind_raw_impl( - &self, - start: *const u8, - end: *const u8, - ) -> Option<*const u8> { - self.0.rfind_raw(start, end) - } - - /// Execute a count using SSE2 vectors and routines. - /// - /// # Safety - /// - /// Same as [`One::count_raw`], except the distance between `start` and - /// `end` must be at least the size of an SSE2 vector (in bytes). - /// - /// (The target feature safety obligation is automatically fulfilled by - /// virtue of being a method on `One`, which can only be constructed - /// when it is safe to call `sse2` routines.) - #[target_feature(enable = "sse2")] - #[inline] - unsafe fn count_raw_impl( - &self, - start: *const u8, - end: *const u8, - ) -> usize { - self.0.count_raw(start, end) - } - - /// Returns an iterator over all occurrences of the needle byte in the - /// given haystack. - /// - /// The iterator returned implements `DoubleEndedIterator`. This means it - /// can also be used to find occurrences in reverse order. - #[inline] - pub fn iter<'a, 'h>(&'a self, haystack: &'h [u8]) -> OneIter<'a, 'h> { - OneIter { searcher: self, it: generic::Iter::new(haystack) } - } -} - -/// An iterator over all occurrences of a single byte in a haystack. -/// -/// This iterator implements `DoubleEndedIterator`, which means it can also be -/// used to find occurrences in reverse order. -/// -/// This iterator is created by the [`One::iter`] method. -/// -/// The lifetime parameters are as follows: -/// -/// * `'a` refers to the lifetime of the underlying [`One`] searcher. -/// * `'h` refers to the lifetime of the haystack being searched. -#[derive(Clone, Debug)] -pub struct OneIter<'a, 'h> { - searcher: &'a One, - it: generic::Iter<'h>, -} - -impl<'a, 'h> Iterator for OneIter<'a, 'h> { - type Item = usize; - - #[inline] - fn next(&mut self) -> Option { - // SAFETY: We rely on the generic iterator to provide valid start - // and end pointers, but we guarantee that any pointer returned by - // 'find_raw' falls within the bounds of the start and end pointer. - unsafe { self.it.next(|s, e| self.searcher.find_raw(s, e)) } - } - - #[inline] - fn count(self) -> usize { - self.it.count(|s, e| { - // SAFETY: We rely on our generic iterator to return valid start - // and end pointers. - unsafe { self.searcher.count_raw(s, e) } - }) - } - - #[inline] - fn size_hint(&self) -> (usize, Option) { - self.it.size_hint() - } -} - -impl<'a, 'h> DoubleEndedIterator for OneIter<'a, 'h> { - #[inline] - fn next_back(&mut self) -> Option { - // SAFETY: We rely on the generic iterator to provide valid start - // and end pointers, but we guarantee that any pointer returned by - // 'rfind_raw' falls within the bounds of the start and end pointer. - unsafe { self.it.next_back(|s, e| self.searcher.rfind_raw(s, e)) } - } -} - -impl<'a, 'h> core::iter::FusedIterator for OneIter<'a, 'h> {} - -/// Finds all occurrences of two bytes in a haystack. -/// -/// That is, this reports matches of one of two possible bytes. For example, -/// searching for `a` or `b` in `afoobar` would report matches at offsets `0`, -/// `4` and `5`. -#[derive(Clone, Copy, Debug)] -pub struct Two(generic::Two<__m128i>); - -impl Two { - /// Create a new searcher that finds occurrences of the needle bytes given. - /// - /// This particular searcher is specialized to use SSE2 vector instructions - /// that typically make it quite fast. - /// - /// If SSE2 is unavailable in the current environment, then `None` is - /// returned. - #[inline] - pub fn new(needle1: u8, needle2: u8) -> Option { - if Two::is_available() { - // SAFETY: we check that sse2 is available above. - unsafe { Some(Two::new_unchecked(needle1, needle2)) } - } else { - None - } - } - - /// Create a new finder specific to SSE2 vectors and routines without - /// checking that SSE2 is available. - /// - /// # Safety - /// - /// Callers must guarantee that it is safe to execute `sse2` instructions - /// in the current environment. - /// - /// Note that it is a common misconception that if one compiles for an - /// `x86_64` target, then they therefore automatically have access to SSE2 - /// instructions. While this is almost always the case, it isn't true in - /// 100% of cases. - #[target_feature(enable = "sse2")] - #[inline] - pub unsafe fn new_unchecked(needle1: u8, needle2: u8) -> Two { - Two(generic::Two::new(needle1, needle2)) - } - - /// Returns true when this implementation is available in the current - /// environment. - /// - /// When this is true, it is guaranteed that [`Two::new`] will return - /// a `Some` value. Similarly, when it is false, it is guaranteed that - /// `Two::new` will return a `None` value. - /// - /// Note also that for the lifetime of a single program, if this returns - /// true then it will always return true. - #[inline] - pub fn is_available() -> bool { - #[cfg(target_feature = "sse2")] - { - true - } - #[cfg(not(target_feature = "sse2"))] - { - false - } - } - - /// Return the first occurrence of one of the needle bytes in the given - /// haystack. If no such occurrence exists, then `None` is returned. - /// - /// The occurrence is reported as an offset into `haystack`. Its maximum - /// value is `haystack.len() - 1`. - #[inline] - pub fn find(&self, haystack: &[u8]) -> Option { - // SAFETY: `find_raw` guarantees that if a pointer is returned, it - // falls within the bounds of the start and end pointers. - unsafe { - generic::search_slice_with_raw(haystack, |s, e| { - self.find_raw(s, e) - }) - } - } - - /// Return the last occurrence of one of the needle bytes in the given - /// haystack. If no such occurrence exists, then `None` is returned. - /// - /// The occurrence is reported as an offset into `haystack`. Its maximum - /// value is `haystack.len() - 1`. - #[inline] - pub fn rfind(&self, haystack: &[u8]) -> Option { - // SAFETY: `rfind_raw` guarantees that if a pointer is returned, it - // falls within the bounds of the start and end pointers. - unsafe { - generic::search_slice_with_raw(haystack, |s, e| { - self.rfind_raw(s, e) - }) - } - } - - /// Like `find`, but accepts and returns raw pointers. - /// - /// When a match is found, the pointer returned is guaranteed to be - /// `>= start` and `< end`. - /// - /// This routine is useful if you're already using raw pointers and would - /// like to avoid converting back to a slice before executing a search. - /// - /// # Safety - /// - /// * Both `start` and `end` must be valid for reads. - /// * Both `start` and `end` must point to an initialized value. - /// * Both `start` and `end` must point to the same allocated object and - /// must either be in bounds or at most one byte past the end of the - /// allocated object. - /// * Both `start` and `end` must be _derived from_ a pointer to the same - /// object. - /// * The distance between `start` and `end` must not overflow `isize`. - /// * The distance being in bounds must not rely on "wrapping around" the - /// address space. - /// - /// Note that callers may pass a pair of pointers such that `start >= end`. - /// In that case, `None` will always be returned. - #[inline] - pub unsafe fn find_raw( - &self, - start: *const u8, - end: *const u8, - ) -> Option<*const u8> { - if start >= end { - return None; - } - if end.distance(start) < __m128i::BYTES { - // SAFETY: We require the caller to pass valid start/end pointers. - return generic::fwd_byte_by_byte(start, end, |b| { - b == self.0.needle1() || b == self.0.needle2() - }); - } - // SAFETY: Building a `Two` means it's safe to call 'sse2' routines. - // Also, we've checked that our haystack is big enough to run on the - // vector routine. Pointer validity is caller's responsibility. - // - // Note that we could call `self.0.find_raw` directly here. But that - // means we'd have to annotate this routine with `target_feature`. - // Which is fine, because this routine is `unsafe` anyway and the - // `target_feature` obligation is met by virtue of building a `Two`. - // The real problem is that a routine with a `target_feature` - // annotation generally can't be inlined into caller code unless the - // caller code has the same target feature annotations. Which is maybe - // okay for SSE2, but we do the same thing for AVX2 where caller code - // probably usually doesn't have AVX2 enabled. That means that this - // routine can be inlined which will handle some of the short-haystack - // cases above without touching the architecture specific code. - self.find_raw_impl(start, end) - } - - /// Like `rfind`, but accepts and returns raw pointers. - /// - /// When a match is found, the pointer returned is guaranteed to be - /// `>= start` and `< end`. - /// - /// This routine is useful if you're already using raw pointers and would - /// like to avoid converting back to a slice before executing a search. - /// - /// # Safety - /// - /// * Both `start` and `end` must be valid for reads. - /// * Both `start` and `end` must point to an initialized value. - /// * Both `start` and `end` must point to the same allocated object and - /// must either be in bounds or at most one byte past the end of the - /// allocated object. - /// * Both `start` and `end` must be _derived from_ a pointer to the same - /// object. - /// * The distance between `start` and `end` must not overflow `isize`. - /// * The distance being in bounds must not rely on "wrapping around" the - /// address space. - /// - /// Note that callers may pass a pair of pointers such that `start >= end`. - /// In that case, `None` will always be returned. - #[inline] - pub unsafe fn rfind_raw( - &self, - start: *const u8, - end: *const u8, - ) -> Option<*const u8> { - if start >= end { - return None; - } - if end.distance(start) < __m128i::BYTES { - // SAFETY: We require the caller to pass valid start/end pointers. - return generic::rev_byte_by_byte(start, end, |b| { - b == self.0.needle1() || b == self.0.needle2() - }); - } - // SAFETY: Building a `Two` means it's safe to call 'sse2' routines. - // Also, we've checked that our haystack is big enough to run on the - // vector routine. Pointer validity is caller's responsibility. - // - // See note in forward routine above for why we don't just call - // `self.0.rfind_raw` directly here. - self.rfind_raw_impl(start, end) - } - - /// Execute a search using SSE2 vectors and routines. - /// - /// # Safety - /// - /// Same as [`Two::find_raw`], except the distance between `start` and - /// `end` must be at least the size of an SSE2 vector (in bytes). - /// - /// (The target feature safety obligation is automatically fulfilled by - /// virtue of being a method on `Two`, which can only be constructed - /// when it is safe to call `sse2` routines.) - #[target_feature(enable = "sse2")] - #[inline] - unsafe fn find_raw_impl( - &self, - start: *const u8, - end: *const u8, - ) -> Option<*const u8> { - self.0.find_raw(start, end) - } - - /// Execute a search using SSE2 vectors and routines. - /// - /// # Safety - /// - /// Same as [`Two::rfind_raw`], except the distance between `start` and - /// `end` must be at least the size of an SSE2 vector (in bytes). - /// - /// (The target feature safety obligation is automatically fulfilled by - /// virtue of being a method on `Two`, which can only be constructed - /// when it is safe to call `sse2` routines.) - #[target_feature(enable = "sse2")] - #[inline] - unsafe fn rfind_raw_impl( - &self, - start: *const u8, - end: *const u8, - ) -> Option<*const u8> { - self.0.rfind_raw(start, end) - } - - /// Returns an iterator over all occurrences of the needle bytes in the - /// given haystack. - /// - /// The iterator returned implements `DoubleEndedIterator`. This means it - /// can also be used to find occurrences in reverse order. - #[inline] - pub fn iter<'a, 'h>(&'a self, haystack: &'h [u8]) -> TwoIter<'a, 'h> { - TwoIter { searcher: self, it: generic::Iter::new(haystack) } - } -} - -/// An iterator over all occurrences of two possible bytes in a haystack. -/// -/// This iterator implements `DoubleEndedIterator`, which means it can also be -/// used to find occurrences in reverse order. -/// -/// This iterator is created by the [`Two::iter`] method. -/// -/// The lifetime parameters are as follows: -/// -/// * `'a` refers to the lifetime of the underlying [`Two`] searcher. -/// * `'h` refers to the lifetime of the haystack being searched. -#[derive(Clone, Debug)] -pub struct TwoIter<'a, 'h> { - searcher: &'a Two, - it: generic::Iter<'h>, -} - -impl<'a, 'h> Iterator for TwoIter<'a, 'h> { - type Item = usize; - - #[inline] - fn next(&mut self) -> Option { - // SAFETY: We rely on the generic iterator to provide valid start - // and end pointers, but we guarantee that any pointer returned by - // 'find_raw' falls within the bounds of the start and end pointer. - unsafe { self.it.next(|s, e| self.searcher.find_raw(s, e)) } - } - - #[inline] - fn size_hint(&self) -> (usize, Option) { - self.it.size_hint() - } -} - -impl<'a, 'h> DoubleEndedIterator for TwoIter<'a, 'h> { - #[inline] - fn next_back(&mut self) -> Option { - // SAFETY: We rely on the generic iterator to provide valid start - // and end pointers, but we guarantee that any pointer returned by - // 'rfind_raw' falls within the bounds of the start and end pointer. - unsafe { self.it.next_back(|s, e| self.searcher.rfind_raw(s, e)) } - } -} - -impl<'a, 'h> core::iter::FusedIterator for TwoIter<'a, 'h> {} - -/// Finds all occurrences of three bytes in a haystack. -/// -/// That is, this reports matches of one of three possible bytes. For example, -/// searching for `a`, `b` or `o` in `afoobar` would report matches at offsets -/// `0`, `2`, `3`, `4` and `5`. -#[derive(Clone, Copy, Debug)] -pub struct Three(generic::Three<__m128i>); - -impl Three { - /// Create a new searcher that finds occurrences of the needle bytes given. - /// - /// This particular searcher is specialized to use SSE2 vector instructions - /// that typically make it quite fast. - /// - /// If SSE2 is unavailable in the current environment, then `None` is - /// returned. - #[inline] - pub fn new(needle1: u8, needle2: u8, needle3: u8) -> Option { - if Three::is_available() { - // SAFETY: we check that sse2 is available above. - unsafe { Some(Three::new_unchecked(needle1, needle2, needle3)) } - } else { - None - } - } - - /// Create a new finder specific to SSE2 vectors and routines without - /// checking that SSE2 is available. - /// - /// # Safety - /// - /// Callers must guarantee that it is safe to execute `sse2` instructions - /// in the current environment. - /// - /// Note that it is a common misconception that if one compiles for an - /// `x86_64` target, then they therefore automatically have access to SSE2 - /// instructions. While this is almost always the case, it isn't true in - /// 100% of cases. - #[target_feature(enable = "sse2")] - #[inline] - pub unsafe fn new_unchecked( - needle1: u8, - needle2: u8, - needle3: u8, - ) -> Three { - Three(generic::Three::new(needle1, needle2, needle3)) - } - - /// Returns true when this implementation is available in the current - /// environment. - /// - /// When this is true, it is guaranteed that [`Three::new`] will return - /// a `Some` value. Similarly, when it is false, it is guaranteed that - /// `Three::new` will return a `None` value. - /// - /// Note also that for the lifetime of a single program, if this returns - /// true then it will always return true. - #[inline] - pub fn is_available() -> bool { - #[cfg(target_feature = "sse2")] - { - true - } - #[cfg(not(target_feature = "sse2"))] - { - false - } - } - - /// Return the first occurrence of one of the needle bytes in the given - /// haystack. If no such occurrence exists, then `None` is returned. - /// - /// The occurrence is reported as an offset into `haystack`. Its maximum - /// value is `haystack.len() - 1`. - #[inline] - pub fn find(&self, haystack: &[u8]) -> Option { - // SAFETY: `find_raw` guarantees that if a pointer is returned, it - // falls within the bounds of the start and end pointers. - unsafe { - generic::search_slice_with_raw(haystack, |s, e| { - self.find_raw(s, e) - }) - } - } - - /// Return the last occurrence of one of the needle bytes in the given - /// haystack. If no such occurrence exists, then `None` is returned. - /// - /// The occurrence is reported as an offset into `haystack`. Its maximum - /// value is `haystack.len() - 1`. - #[inline] - pub fn rfind(&self, haystack: &[u8]) -> Option { - // SAFETY: `rfind_raw` guarantees that if a pointer is returned, it - // falls within the bounds of the start and end pointers. - unsafe { - generic::search_slice_with_raw(haystack, |s, e| { - self.rfind_raw(s, e) - }) - } - } - - /// Like `find`, but accepts and returns raw pointers. - /// - /// When a match is found, the pointer returned is guaranteed to be - /// `>= start` and `< end`. - /// - /// This routine is useful if you're already using raw pointers and would - /// like to avoid converting back to a slice before executing a search. - /// - /// # Safety - /// - /// * Both `start` and `end` must be valid for reads. - /// * Both `start` and `end` must point to an initialized value. - /// * Both `start` and `end` must point to the same allocated object and - /// must either be in bounds or at most one byte past the end of the - /// allocated object. - /// * Both `start` and `end` must be _derived from_ a pointer to the same - /// object. - /// * The distance between `start` and `end` must not overflow `isize`. - /// * The distance being in bounds must not rely on "wrapping around" the - /// address space. - /// - /// Note that callers may pass a pair of pointers such that `start >= end`. - /// In that case, `None` will always be returned. - #[inline] - pub unsafe fn find_raw( - &self, - start: *const u8, - end: *const u8, - ) -> Option<*const u8> { - if start >= end { - return None; - } - if end.distance(start) < __m128i::BYTES { - // SAFETY: We require the caller to pass valid start/end pointers. - return generic::fwd_byte_by_byte(start, end, |b| { - b == self.0.needle1() - || b == self.0.needle2() - || b == self.0.needle3() - }); - } - // SAFETY: Building a `Three` means it's safe to call 'sse2' routines. - // Also, we've checked that our haystack is big enough to run on the - // vector routine. Pointer validity is caller's responsibility. - // - // Note that we could call `self.0.find_raw` directly here. But that - // means we'd have to annotate this routine with `target_feature`. - // Which is fine, because this routine is `unsafe` anyway and the - // `target_feature` obligation is met by virtue of building a `Three`. - // The real problem is that a routine with a `target_feature` - // annotation generally can't be inlined into caller code unless the - // caller code has the same target feature annotations. Which is maybe - // okay for SSE2, but we do the same thing for AVX2 where caller code - // probably usually doesn't have AVX2 enabled. That means that this - // routine can be inlined which will handle some of the short-haystack - // cases above without touching the architecture specific code. - self.find_raw_impl(start, end) - } - - /// Like `rfind`, but accepts and returns raw pointers. - /// - /// When a match is found, the pointer returned is guaranteed to be - /// `>= start` and `< end`. - /// - /// This routine is useful if you're already using raw pointers and would - /// like to avoid converting back to a slice before executing a search. - /// - /// # Safety - /// - /// * Both `start` and `end` must be valid for reads. - /// * Both `start` and `end` must point to an initialized value. - /// * Both `start` and `end` must point to the same allocated object and - /// must either be in bounds or at most one byte past the end of the - /// allocated object. - /// * Both `start` and `end` must be _derived from_ a pointer to the same - /// object. - /// * The distance between `start` and `end` must not overflow `isize`. - /// * The distance being in bounds must not rely on "wrapping around" the - /// address space. - /// - /// Note that callers may pass a pair of pointers such that `start >= end`. - /// In that case, `None` will always be returned. - #[inline] - pub unsafe fn rfind_raw( - &self, - start: *const u8, - end: *const u8, - ) -> Option<*const u8> { - if start >= end { - return None; - } - if end.distance(start) < __m128i::BYTES { - // SAFETY: We require the caller to pass valid start/end pointers. - return generic::rev_byte_by_byte(start, end, |b| { - b == self.0.needle1() - || b == self.0.needle2() - || b == self.0.needle3() - }); - } - // SAFETY: Building a `Three` means it's safe to call 'sse2' routines. - // Also, we've checked that our haystack is big enough to run on the - // vector routine. Pointer validity is caller's responsibility. - // - // See note in forward routine above for why we don't just call - // `self.0.rfind_raw` directly here. - self.rfind_raw_impl(start, end) - } - - /// Execute a search using SSE2 vectors and routines. - /// - /// # Safety - /// - /// Same as [`Three::find_raw`], except the distance between `start` and - /// `end` must be at least the size of an SSE2 vector (in bytes). - /// - /// (The target feature safety obligation is automatically fulfilled by - /// virtue of being a method on `Three`, which can only be constructed - /// when it is safe to call `sse2` routines.) - #[target_feature(enable = "sse2")] - #[inline] - unsafe fn find_raw_impl( - &self, - start: *const u8, - end: *const u8, - ) -> Option<*const u8> { - self.0.find_raw(start, end) - } - - /// Execute a search using SSE2 vectors and routines. - /// - /// # Safety - /// - /// Same as [`Three::rfind_raw`], except the distance between `start` and - /// `end` must be at least the size of an SSE2 vector (in bytes). - /// - /// (The target feature safety obligation is automatically fulfilled by - /// virtue of being a method on `Three`, which can only be constructed - /// when it is safe to call `sse2` routines.) - #[target_feature(enable = "sse2")] - #[inline] - unsafe fn rfind_raw_impl( - &self, - start: *const u8, - end: *const u8, - ) -> Option<*const u8> { - self.0.rfind_raw(start, end) - } - - /// Returns an iterator over all occurrences of the needle byte in the - /// given haystack. - /// - /// The iterator returned implements `DoubleEndedIterator`. This means it - /// can also be used to find occurrences in reverse order. - #[inline] - pub fn iter<'a, 'h>(&'a self, haystack: &'h [u8]) -> ThreeIter<'a, 'h> { - ThreeIter { searcher: self, it: generic::Iter::new(haystack) } - } -} - -/// An iterator over all occurrences of three possible bytes in a haystack. -/// -/// This iterator implements `DoubleEndedIterator`, which means it can also be -/// used to find occurrences in reverse order. -/// -/// This iterator is created by the [`Three::iter`] method. -/// -/// The lifetime parameters are as follows: -/// -/// * `'a` refers to the lifetime of the underlying [`Three`] searcher. -/// * `'h` refers to the lifetime of the haystack being searched. -#[derive(Clone, Debug)] -pub struct ThreeIter<'a, 'h> { - searcher: &'a Three, - it: generic::Iter<'h>, -} - -impl<'a, 'h> Iterator for ThreeIter<'a, 'h> { - type Item = usize; - - #[inline] - fn next(&mut self) -> Option { - // SAFETY: We rely on the generic iterator to provide valid start - // and end pointers, but we guarantee that any pointer returned by - // 'find_raw' falls within the bounds of the start and end pointer. - unsafe { self.it.next(|s, e| self.searcher.find_raw(s, e)) } - } - - #[inline] - fn size_hint(&self) -> (usize, Option) { - self.it.size_hint() - } -} - -impl<'a, 'h> DoubleEndedIterator for ThreeIter<'a, 'h> { - #[inline] - fn next_back(&mut self) -> Option { - // SAFETY: We rely on the generic iterator to provide valid start - // and end pointers, but we guarantee that any pointer returned by - // 'rfind_raw' falls within the bounds of the start and end pointer. - unsafe { self.it.next_back(|s, e| self.searcher.rfind_raw(s, e)) } - } -} - -impl<'a, 'h> core::iter::FusedIterator for ThreeIter<'a, 'h> {} - -#[cfg(test)] -mod tests { - use super::*; - - define_memchr_quickcheck!(super); - - #[test] - fn forward_one() { - crate::tests::memchr::Runner::new(1).forward_iter( - |haystack, needles| { - Some(One::new(needles[0])?.iter(haystack).collect()) - }, - ) - } - - #[test] - fn reverse_one() { - crate::tests::memchr::Runner::new(1).reverse_iter( - |haystack, needles| { - Some(One::new(needles[0])?.iter(haystack).rev().collect()) - }, - ) - } - - #[test] - fn count_one() { - crate::tests::memchr::Runner::new(1).count_iter(|haystack, needles| { - Some(One::new(needles[0])?.iter(haystack).count()) - }) - } - - #[test] - fn forward_two() { - crate::tests::memchr::Runner::new(2).forward_iter( - |haystack, needles| { - let n1 = needles.get(0).copied()?; - let n2 = needles.get(1).copied()?; - Some(Two::new(n1, n2)?.iter(haystack).collect()) - }, - ) - } - - #[test] - fn reverse_two() { - crate::tests::memchr::Runner::new(2).reverse_iter( - |haystack, needles| { - let n1 = needles.get(0).copied()?; - let n2 = needles.get(1).copied()?; - Some(Two::new(n1, n2)?.iter(haystack).rev().collect()) - }, - ) - } - - #[test] - fn forward_three() { - crate::tests::memchr::Runner::new(3).forward_iter( - |haystack, needles| { - let n1 = needles.get(0).copied()?; - let n2 = needles.get(1).copied()?; - let n3 = needles.get(2).copied()?; - Some(Three::new(n1, n2, n3)?.iter(haystack).collect()) - }, - ) - } - - #[test] - fn reverse_three() { - crate::tests::memchr::Runner::new(3).reverse_iter( - |haystack, needles| { - let n1 = needles.get(0).copied()?; - let n2 = needles.get(1).copied()?; - let n3 = needles.get(2).copied()?; - Some(Three::new(n1, n2, n3)?.iter(haystack).rev().collect()) - }, - ) - } -} diff -Nru temporalio-1.3.0/vendor/memchr/src/arch/x86_64/sse2/mod.rs temporalio-1.3.0/vendor/memchr/src/arch/x86_64/sse2/mod.rs --- temporalio-1.3.0/vendor/memchr/src/arch/x86_64/sse2/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/arch/x86_64/sse2/mod.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,6 +0,0 @@ -/*! -Algorithms for the `x86_64` target using 128-bit vectors via SSE2. -*/ - -pub mod memchr; -pub mod packedpair; diff -Nru temporalio-1.3.0/vendor/memchr/src/arch/x86_64/sse2/packedpair.rs temporalio-1.3.0/vendor/memchr/src/arch/x86_64/sse2/packedpair.rs --- temporalio-1.3.0/vendor/memchr/src/arch/x86_64/sse2/packedpair.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/arch/x86_64/sse2/packedpair.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,232 +0,0 @@ -/*! -A 128-bit vector implementation of the "packed pair" SIMD algorithm. - -The "packed pair" algorithm is based on the [generic SIMD] algorithm. The main -difference is that it (by default) uses a background distribution of byte -frequencies to heuristically select the pair of bytes to search for. - -[generic SIMD]: http://0x80.pl/articles/simd-strfind.html#first-and-last -*/ - -use core::arch::x86_64::__m128i; - -use crate::arch::{all::packedpair::Pair, generic::packedpair}; - -/// A "packed pair" finder that uses 128-bit vector operations. -/// -/// This finder picks two bytes that it believes have high predictive power -/// for indicating an overall match of a needle. Depending on whether -/// `Finder::find` or `Finder::find_prefilter` is used, it reports offsets -/// where the needle matches or could match. In the prefilter case, candidates -/// are reported whenever the [`Pair`] of bytes given matches. -#[derive(Clone, Copy, Debug)] -pub struct Finder(packedpair::Finder<__m128i>); - -impl Finder { - /// Create a new pair searcher. The searcher returned can either report - /// exact matches of `needle` or act as a prefilter and report candidate - /// positions of `needle`. - /// - /// If SSE2 is unavailable in the current environment or if a [`Pair`] - /// could not be constructed from the needle given, then `None` is - /// returned. - #[inline] - pub fn new(needle: &[u8]) -> Option { - Finder::with_pair(needle, Pair::new(needle)?) - } - - /// Create a new "packed pair" finder using the pair of bytes given. - /// - /// This constructor permits callers to control precisely which pair of - /// bytes is used as a predicate. - /// - /// If SSE2 is unavailable in the current environment, then `None` is - /// returned. - #[inline] - pub fn with_pair(needle: &[u8], pair: Pair) -> Option { - if Finder::is_available() { - // SAFETY: we check that sse2 is available above. We are also - // guaranteed to have needle.len() > 1 because we have a valid - // Pair. - unsafe { Some(Finder::with_pair_impl(needle, pair)) } - } else { - None - } - } - - /// Create a new `Finder` specific to SSE2 vectors and routines. - /// - /// # Safety - /// - /// Same as the safety for `packedpair::Finder::new`, and callers must also - /// ensure that SSE2 is available. - #[target_feature(enable = "sse2")] - #[inline] - unsafe fn with_pair_impl(needle: &[u8], pair: Pair) -> Finder { - let finder = packedpair::Finder::<__m128i>::new(needle, pair); - Finder(finder) - } - - /// Returns true when this implementation is available in the current - /// environment. - /// - /// When this is true, it is guaranteed that [`Finder::with_pair`] will - /// return a `Some` value. Similarly, when it is false, it is guaranteed - /// that `Finder::with_pair` will return a `None` value. Notice that this - /// does not guarantee that [`Finder::new`] will return a `Finder`. Namely, - /// even when `Finder::is_available` is true, it is not guaranteed that a - /// valid [`Pair`] can be found from the needle given. - /// - /// Note also that for the lifetime of a single program, if this returns - /// true then it will always return true. - #[inline] - pub fn is_available() -> bool { - #[cfg(not(target_feature = "sse2"))] - { - false - } - #[cfg(target_feature = "sse2")] - { - true - } - } - - /// Execute a search using SSE2 vectors and routines. - /// - /// # Panics - /// - /// When `haystack.len()` is less than [`Finder::min_haystack_len`]. - #[inline] - pub fn find(&self, haystack: &[u8], needle: &[u8]) -> Option { - // SAFETY: Building a `Finder` means it's safe to call 'sse2' routines. - unsafe { self.find_impl(haystack, needle) } - } - - /// Run this finder on the given haystack as a prefilter. - /// - /// If a candidate match is found, then an offset where the needle *could* - /// begin in the haystack is returned. - /// - /// # Panics - /// - /// When `haystack.len()` is less than [`Finder::min_haystack_len`]. - #[inline] - pub fn find_prefilter(&self, haystack: &[u8]) -> Option { - // SAFETY: Building a `Finder` means it's safe to call 'sse2' routines. - unsafe { self.find_prefilter_impl(haystack) } - } - - /// Execute a search using SSE2 vectors and routines. - /// - /// # Panics - /// - /// When `haystack.len()` is less than [`Finder::min_haystack_len`]. - /// - /// # Safety - /// - /// (The target feature safety obligation is automatically fulfilled by - /// virtue of being a method on `Finder`, which can only be constructed - /// when it is safe to call `sse2` routines.) - #[target_feature(enable = "sse2")] - #[inline] - unsafe fn find_impl( - &self, - haystack: &[u8], - needle: &[u8], - ) -> Option { - self.0.find(haystack, needle) - } - - /// Execute a prefilter search using SSE2 vectors and routines. - /// - /// # Panics - /// - /// When `haystack.len()` is less than [`Finder::min_haystack_len`]. - /// - /// # Safety - /// - /// (The target feature safety obligation is automatically fulfilled by - /// virtue of being a method on `Finder`, which can only be constructed - /// when it is safe to call `sse2` routines.) - #[target_feature(enable = "sse2")] - #[inline] - unsafe fn find_prefilter_impl(&self, haystack: &[u8]) -> Option { - self.0.find_prefilter(haystack) - } - - /// Returns the pair of offsets (into the needle) used to check as a - /// predicate before confirming whether a needle exists at a particular - /// position. - #[inline] - pub fn pair(&self) -> &Pair { - self.0.pair() - } - - /// Returns the minimum haystack length that this `Finder` can search. - /// - /// Using a haystack with length smaller than this in a search will result - /// in a panic. The reason for this restriction is that this finder is - /// meant to be a low-level component that is part of a larger substring - /// strategy. In that sense, it avoids trying to handle all cases and - /// instead only handles the cases that it can handle very well. - #[inline] - pub fn min_haystack_len(&self) -> usize { - self.0.min_haystack_len() - } -} - -#[cfg(test)] -mod tests { - use super::*; - - fn find(haystack: &[u8], needle: &[u8]) -> Option> { - let f = Finder::new(needle)?; - if haystack.len() < f.min_haystack_len() { - return None; - } - Some(f.find(haystack, needle)) - } - - define_substring_forward_quickcheck!(find); - - #[test] - fn forward_substring() { - crate::tests::substring::Runner::new().fwd(find).run() - } - - #[test] - fn forward_packedpair() { - fn find( - haystack: &[u8], - needle: &[u8], - index1: u8, - index2: u8, - ) -> Option> { - let pair = Pair::with_indices(needle, index1, index2)?; - let f = Finder::with_pair(needle, pair)?; - if haystack.len() < f.min_haystack_len() { - return None; - } - Some(f.find(haystack, needle)) - } - crate::tests::packedpair::Runner::new().fwd(find).run() - } - - #[test] - fn forward_packedpair_prefilter() { - fn find( - haystack: &[u8], - needle: &[u8], - index1: u8, - index2: u8, - ) -> Option> { - let pair = Pair::with_indices(needle, index1, index2)?; - let f = Finder::with_pair(needle, pair)?; - if haystack.len() < f.min_haystack_len() { - return None; - } - Some(f.find_prefilter(haystack)) - } - crate::tests::packedpair::Runner::new().fwd(find).run() - } -} diff -Nru temporalio-1.3.0/vendor/memchr/src/cow.rs temporalio-1.3.0/vendor/memchr/src/cow.rs --- temporalio-1.3.0/vendor/memchr/src/cow.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/cow.rs 2023-10-30 19:40:00.000000000 +0000 @@ -4,23 +4,22 @@ /// /// The purpose of this type is to permit usage of a "borrowed or owned /// byte string" in a way that keeps std/no-std compatibility. That is, in -/// no-std/alloc mode, this type devolves into a simple &[u8] with no owned -/// variant available. We can't just use a plain Cow because Cow is not in -/// core. +/// no-std mode, this type devolves into a simple &[u8] with no owned variant +/// available. We can't just use a plain Cow because Cow is not in core. #[derive(Clone, Debug)] pub struct CowBytes<'a>(Imp<'a>); -// N.B. We don't use alloc::borrow::Cow here since we can get away with a +// N.B. We don't use std::borrow::Cow here since we can get away with a // Box<[u8]> for our use case, which is 1/3 smaller than the Vec that // a Cow<[u8]> would use. -#[cfg(feature = "alloc")] +#[cfg(feature = "std")] #[derive(Clone, Debug)] enum Imp<'a> { Borrowed(&'a [u8]), - Owned(alloc::boxed::Box<[u8]>), + Owned(Box<[u8]>), } -#[cfg(not(feature = "alloc"))] +#[cfg(not(feature = "std"))] #[derive(Clone, Debug)] struct Imp<'a>(&'a [u8]); @@ -36,21 +35,21 @@ impl<'a> CowBytes<'a> { /// Create a new borrowed CowBytes. #[inline(always)] - pub(crate) fn new>(bytes: &'a B) -> CowBytes<'a> { + pub fn new>(bytes: &'a B) -> CowBytes<'a> { CowBytes(Imp::new(bytes.as_ref())) } /// Create a new owned CowBytes. - #[cfg(feature = "alloc")] + #[cfg(feature = "std")] #[inline(always)] - fn new_owned(bytes: alloc::boxed::Box<[u8]>) -> CowBytes<'static> { + pub fn new_owned(bytes: Box<[u8]>) -> CowBytes<'static> { CowBytes(Imp::Owned(bytes)) } /// Return a borrowed byte string, regardless of whether this is an owned /// or borrowed byte string internally. #[inline(always)] - pub(crate) fn as_slice(&self) -> &[u8] { + pub fn as_slice(&self) -> &[u8] { self.0.as_slice() } @@ -58,48 +57,39 @@ /// /// If this is already an owned byte string internally, then this is a /// no-op. Otherwise, the internal byte string is copied. - #[cfg(feature = "alloc")] + #[cfg(feature = "std")] #[inline(always)] - pub(crate) fn into_owned(self) -> CowBytes<'static> { + pub fn into_owned(self) -> CowBytes<'static> { match self.0 { - Imp::Borrowed(b) => { - CowBytes::new_owned(alloc::boxed::Box::from(b)) - } + Imp::Borrowed(b) => CowBytes::new_owned(Box::from(b)), Imp::Owned(b) => CowBytes::new_owned(b), } } } impl<'a> Imp<'a> { + #[cfg(feature = "std")] #[inline(always)] pub fn new(bytes: &'a [u8]) -> Imp<'a> { - #[cfg(feature = "alloc")] - { - Imp::Borrowed(bytes) - } - #[cfg(not(feature = "alloc"))] - { - Imp(bytes) - } + Imp::Borrowed(bytes) + } + + #[cfg(not(feature = "std"))] + #[inline(always)] + pub fn new(bytes: &'a [u8]) -> Imp<'a> { + Imp(bytes) } - #[cfg(feature = "alloc")] + #[cfg(feature = "std")] #[inline(always)] pub fn as_slice(&self) -> &[u8] { - #[cfg(feature = "alloc")] - { - match self { - Imp::Owned(ref x) => x, - Imp::Borrowed(x) => x, - } - } - #[cfg(not(feature = "alloc"))] - { - self.0 + match self { + Imp::Owned(ref x) => x, + Imp::Borrowed(x) => x, } } - #[cfg(not(feature = "alloc"))] + #[cfg(not(feature = "std"))] #[inline(always)] pub fn as_slice(&self) -> &[u8] { self.0 diff -Nru temporalio-1.3.0/vendor/memchr/src/ext.rs temporalio-1.3.0/vendor/memchr/src/ext.rs --- temporalio-1.3.0/vendor/memchr/src/ext.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/ext.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,52 +0,0 @@ -/// A trait for adding some helper routines to pointers. -pub(crate) trait Pointer { - /// Returns the distance, in units of `T`, between `self` and `origin`. - /// - /// # Safety - /// - /// Same as `ptr::offset_from` in addition to `self >= origin`. - unsafe fn distance(self, origin: Self) -> usize; - - /// Casts this pointer to `usize`. - /// - /// Callers should not convert the `usize` back to a pointer if at all - /// possible. (And if you believe it's necessary, open an issue to discuss - /// why. Otherwise, it has the potential to violate pointer provenance.) - /// The purpose of this function is just to be able to do arithmetic, i.e., - /// computing offsets or alignments. - fn as_usize(self) -> usize; -} - -impl Pointer for *const T { - unsafe fn distance(self, origin: *const T) -> usize { - // TODO: Replace with `ptr::sub_ptr` once stabilized. - usize::try_from(self.offset_from(origin)).unwrap_unchecked() - } - - fn as_usize(self) -> usize { - self as usize - } -} - -impl Pointer for *mut T { - unsafe fn distance(self, origin: *mut T) -> usize { - (self as *const T).distance(origin as *const T) - } - - fn as_usize(self) -> usize { - (self as *const T).as_usize() - } -} - -/// A trait for adding some helper routines to raw bytes. -pub(crate) trait Byte { - /// Converts this byte to a `char` if it's ASCII. Otherwise panics. - fn to_char(self) -> char; -} - -impl Byte for u8 { - fn to_char(self) -> char { - assert!(self.is_ascii()); - char::from(self) - } -} diff -Nru temporalio-1.3.0/vendor/memchr/src/lib.rs temporalio-1.3.0/vendor/memchr/src/lib.rs --- temporalio-1.3.0/vendor/memchr/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -113,9 +113,9 @@ order of magnitude faster. This is a good general purpose trade off to make. You rarely lose, but often gain big. -**NOTE:** The name `memchr` comes from the corresponding routine in `libc`. A -key advantage of using this library is that its performance is not tied to its -quality of implementation in the `libc` you happen to be using, which can vary +**NOTE:** The name `memchr` comes from the corresponding routine in libc. A key +advantage of using this library is that its performance is not tied to its +quality of implementation in the libc you happen to be using, which can vary greatly from platform to platform. But what about substring search? This one is a bit more complicated. The @@ -131,58 +131,32 @@ The reason is that the implementation details for using SIMD in the standard library haven't quite been worked out yet. -**NOTE:** Currently, only `x86_64`, `wasm32` and `aarch64` targets have vector -accelerated implementations of `memchr` (and friends) and `memmem`. +**NOTE:** Currently, only `x86_64` targets have highly accelerated +implementations of substring search. For `memchr`, all targets have +somewhat-accelerated implementations, while only `x86_64` targets have highly +accelerated implementations. This limitation is expected to be lifted once the +standard library exposes a platform independent SIMD API. # Crate features -* **std** - When enabled (the default), this will permit features specific to -the standard library. Currently, the only thing used from the standard library -is runtime SIMD CPU feature detection. This means that this feature must be -enabled to get AVX2 accelerated routines on `x86_64` targets without enabling -the `avx2` feature at compile time, for example. When `std` is not enabled, -this crate will still attempt to use SSE2 accelerated routines on `x86_64`. It -will also use AVX2 accelerated routines when the `avx2` feature is enabled at -compile time. In general, enable this feature if you can. -* **alloc** - When enabled (the default), APIs in this crate requiring some -kind of allocation will become available. For example, the -[`memmem::Finder::into_ownedd`](crate::memmem::Finder::into_owned) API and the -[`arch::all::shiftor`](crate::arch::all::shiftor) substring search -implementation. Otherwise, this crate is designed from the ground up to be -usable in core-only contexts, so the `alloc` feature doesn't add much -currently. Notably, disabling `std` but enabling `alloc` will **not** result -in the use of AVX2 on `x86_64` targets unless the `avx2` feature is enabled -at compile time. (With `std` enabled, AVX2 can be used even without the `avx2` -feature enabled at compile time by way of runtime CPU feature detection.) -* **logging** - When enabled (disabled by default), the `log` crate is used -to emit log messages about what kinds of `memchr` and `memmem` algorithms -are used. Namely, both `memchr` and `memmem` have a number of different -implementation choices depending on the target and CPU, and the log messages -can help show what specific implementations are being used. Generally, this is -useful for debugging performance issues. -* **libc** - **DEPRECATED**. Previously, this enabled the use of the target's -`memchr` function from whatever `libc` was linked into the program. This -feature is now a no-op because this crate's implementation of `memchr` should -now be sufficiently fast on a number of platforms that `libc` should no longer -be needed. (This feature is somewhat of a holdover from this crate's origins. -Originally, this crate was literally just a safe wrapper function around the -`memchr` function from `libc`.) +* **std** - When enabled (the default), this will permit this crate to use + features specific to the standard library. Currently, the only thing used + from the standard library is runtime SIMD CPU feature detection. This means + that this feature must be enabled to get AVX accelerated routines. When + `std` is not enabled, this crate will still attempt to use SSE2 accelerated + routines on `x86_64`. +* **libc** - When enabled (**not** the default), this library will use your + platform's libc implementation of `memchr` (and `memrchr` on Linux). This + can be useful on non-`x86_64` targets where the fallback implementation in + this crate is not as good as the one found in your libc. All other routines + (e.g., `memchr[23]` and substring search) unconditionally use the + implementation in this crate. */ #![deny(missing_docs)] -#![no_std] -// It's just not worth trying to squash all dead code warnings. Pretty -// unfortunate IMO. Not really sure how to fix this other than to either -// live with it or sprinkle a whole mess of `cfg` annotations everywhere. -#![cfg_attr( - not(any( - all(target_arch = "x86_64", target_feature = "sse2"), - target_arch = "wasm32", - target_arch = "aarch64", - )), - allow(dead_code) -)] -// Same deal for miri. +#![cfg_attr(not(feature = "std"), no_std)] +// It's not worth trying to gate all code on just miri, so turn off relevant +// dead code warnings. #![cfg_attr(miri, allow(dead_code, unused_macros))] // Supporting 8-bit (or others) would be fine. If you need it, please submit a @@ -194,28 +168,14 @@ )))] compile_error!("memchr currently not supported on non-{16,32,64}"); -#[cfg(any(test, feature = "std"))] -extern crate std; - -#[cfg(any(test, feature = "alloc"))] -extern crate alloc; - pub use crate::memchr::{ memchr, memchr2, memchr2_iter, memchr3, memchr3_iter, memchr_iter, memrchr, memrchr2, memrchr2_iter, memrchr3, memrchr3_iter, memrchr_iter, Memchr, Memchr2, Memchr3, }; -#[macro_use] -mod macros; - -#[cfg(test)] -#[macro_use] -mod tests; - -pub mod arch; mod cow; -mod ext; mod memchr; pub mod memmem; -mod vector; +#[cfg(test)] +mod tests; diff -Nru temporalio-1.3.0/vendor/memchr/src/macros.rs temporalio-1.3.0/vendor/memchr/src/macros.rs --- temporalio-1.3.0/vendor/memchr/src/macros.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/macros.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,20 +0,0 @@ -// Some feature combinations result in some of these macros never being used. -// Which is fine. Just squash the warnings. -#![allow(unused_macros)] - -macro_rules! log { - ($($tt:tt)*) => { - #[cfg(feature = "logging")] - { - $($tt)* - } - } -} - -macro_rules! debug { - ($($tt:tt)*) => { log!(log::debug!($($tt)*)) } -} - -macro_rules! trace { - ($($tt:tt)*) => { log!(log::trace!($($tt)*)) } -} diff -Nru temporalio-1.3.0/vendor/memchr/src/memchr/c.rs temporalio-1.3.0/vendor/memchr/src/memchr/c.rs --- temporalio-1.3.0/vendor/memchr/src/memchr/c.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/memchr/c.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,44 @@ +// This module defines safe wrappers around memchr (POSIX) and memrchr (GNU +// extension). + +#![allow(dead_code)] + +use libc::{c_int, c_void, size_t}; + +pub fn memchr(needle: u8, haystack: &[u8]) -> Option { + // SAFETY: This is safe to call since all pointers are valid. + let p = unsafe { + libc::memchr( + haystack.as_ptr() as *const c_void, + needle as c_int, + haystack.len() as size_t, + ) + }; + if p.is_null() { + None + } else { + Some(p as usize - (haystack.as_ptr() as usize)) + } +} + +// memrchr is a GNU extension. We know it's available on Linux at least. +#[cfg(target_os = "linux")] +pub fn memrchr(needle: u8, haystack: &[u8]) -> Option { + // GNU's memrchr() will - unlike memchr() - error if haystack is empty. + if haystack.is_empty() { + return None; + } + // SAFETY: This is safe to call since all pointers are valid. + let p = unsafe { + libc::memrchr( + haystack.as_ptr() as *const c_void, + needle as c_int, + haystack.len() as size_t, + ) + }; + if p.is_null() { + None + } else { + Some(p as usize - (haystack.as_ptr() as usize)) + } +} diff -Nru temporalio-1.3.0/vendor/memchr/src/memchr/fallback.rs temporalio-1.3.0/vendor/memchr/src/memchr/fallback.rs --- temporalio-1.3.0/vendor/memchr/src/memchr/fallback.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/memchr/fallback.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,329 @@ +// This module defines pure Rust platform independent implementations of all +// the memchr routines. We do our best to make them fast. Some of them may even +// get auto-vectorized. + +use core::{cmp, usize}; + +#[cfg(target_pointer_width = "16")] +const USIZE_BYTES: usize = 2; + +#[cfg(target_pointer_width = "32")] +const USIZE_BYTES: usize = 4; + +#[cfg(target_pointer_width = "64")] +const USIZE_BYTES: usize = 8; + +// The number of bytes to loop at in one iteration of memchr/memrchr. +const LOOP_SIZE: usize = 2 * USIZE_BYTES; + +/// Return `true` if `x` contains any zero byte. +/// +/// From *Matters Computational*, J. Arndt +/// +/// "The idea is to subtract one from each of the bytes and then look for +/// bytes where the borrow propagated all the way to the most significant +/// bit." +#[inline(always)] +fn contains_zero_byte(x: usize) -> bool { + const LO_U64: u64 = 0x0101010101010101; + const HI_U64: u64 = 0x8080808080808080; + + const LO_USIZE: usize = LO_U64 as usize; + const HI_USIZE: usize = HI_U64 as usize; + + x.wrapping_sub(LO_USIZE) & !x & HI_USIZE != 0 +} + +/// Repeat the given byte into a word size number. That is, every 8 bits +/// is equivalent to the given byte. For example, if `b` is `\x4E` or +/// `01001110` in binary, then the returned value on a 32-bit system would be: +/// `01001110_01001110_01001110_01001110`. +#[inline(always)] +fn repeat_byte(b: u8) -> usize { + (b as usize) * (usize::MAX / 255) +} + +pub fn memchr(n1: u8, haystack: &[u8]) -> Option { + let vn1 = repeat_byte(n1); + let confirm = |byte| byte == n1; + let loop_size = cmp::min(LOOP_SIZE, haystack.len()); + let align = USIZE_BYTES - 1; + let start_ptr = haystack.as_ptr(); + let mut ptr = start_ptr; + + unsafe { + let end_ptr = start_ptr.add(haystack.len()); + if haystack.len() < USIZE_BYTES { + return forward_search(start_ptr, end_ptr, ptr, confirm); + } + + let chunk = (ptr as *const usize).read_unaligned(); + if contains_zero_byte(chunk ^ vn1) { + return forward_search(start_ptr, end_ptr, ptr, confirm); + } + + ptr = ptr.add(USIZE_BYTES - (start_ptr as usize & align)); + debug_assert!(ptr > start_ptr); + debug_assert!(end_ptr.sub(USIZE_BYTES) >= start_ptr); + while loop_size == LOOP_SIZE && ptr <= end_ptr.sub(loop_size) { + debug_assert_eq!(0, (ptr as usize) % USIZE_BYTES); + + let a = *(ptr as *const usize); + let b = *(ptr.add(USIZE_BYTES) as *const usize); + let eqa = contains_zero_byte(a ^ vn1); + let eqb = contains_zero_byte(b ^ vn1); + if eqa || eqb { + break; + } + ptr = ptr.add(LOOP_SIZE); + } + forward_search(start_ptr, end_ptr, ptr, confirm) + } +} + +/// Like `memchr`, but searches for two bytes instead of one. +pub fn memchr2(n1: u8, n2: u8, haystack: &[u8]) -> Option { + let vn1 = repeat_byte(n1); + let vn2 = repeat_byte(n2); + let confirm = |byte| byte == n1 || byte == n2; + let align = USIZE_BYTES - 1; + let start_ptr = haystack.as_ptr(); + let mut ptr = start_ptr; + + unsafe { + let end_ptr = start_ptr.add(haystack.len()); + if haystack.len() < USIZE_BYTES { + return forward_search(start_ptr, end_ptr, ptr, confirm); + } + + let chunk = (ptr as *const usize).read_unaligned(); + let eq1 = contains_zero_byte(chunk ^ vn1); + let eq2 = contains_zero_byte(chunk ^ vn2); + if eq1 || eq2 { + return forward_search(start_ptr, end_ptr, ptr, confirm); + } + + ptr = ptr.add(USIZE_BYTES - (start_ptr as usize & align)); + debug_assert!(ptr > start_ptr); + debug_assert!(end_ptr.sub(USIZE_BYTES) >= start_ptr); + while ptr <= end_ptr.sub(USIZE_BYTES) { + debug_assert_eq!(0, (ptr as usize) % USIZE_BYTES); + + let chunk = *(ptr as *const usize); + let eq1 = contains_zero_byte(chunk ^ vn1); + let eq2 = contains_zero_byte(chunk ^ vn2); + if eq1 || eq2 { + break; + } + ptr = ptr.add(USIZE_BYTES); + } + forward_search(start_ptr, end_ptr, ptr, confirm) + } +} + +/// Like `memchr`, but searches for three bytes instead of one. +pub fn memchr3(n1: u8, n2: u8, n3: u8, haystack: &[u8]) -> Option { + let vn1 = repeat_byte(n1); + let vn2 = repeat_byte(n2); + let vn3 = repeat_byte(n3); + let confirm = |byte| byte == n1 || byte == n2 || byte == n3; + let align = USIZE_BYTES - 1; + let start_ptr = haystack.as_ptr(); + let mut ptr = start_ptr; + + unsafe { + let end_ptr = start_ptr.add(haystack.len()); + if haystack.len() < USIZE_BYTES { + return forward_search(start_ptr, end_ptr, ptr, confirm); + } + + let chunk = (ptr as *const usize).read_unaligned(); + let eq1 = contains_zero_byte(chunk ^ vn1); + let eq2 = contains_zero_byte(chunk ^ vn2); + let eq3 = contains_zero_byte(chunk ^ vn3); + if eq1 || eq2 || eq3 { + return forward_search(start_ptr, end_ptr, ptr, confirm); + } + + ptr = ptr.add(USIZE_BYTES - (start_ptr as usize & align)); + debug_assert!(ptr > start_ptr); + debug_assert!(end_ptr.sub(USIZE_BYTES) >= start_ptr); + while ptr <= end_ptr.sub(USIZE_BYTES) { + debug_assert_eq!(0, (ptr as usize) % USIZE_BYTES); + + let chunk = *(ptr as *const usize); + let eq1 = contains_zero_byte(chunk ^ vn1); + let eq2 = contains_zero_byte(chunk ^ vn2); + let eq3 = contains_zero_byte(chunk ^ vn3); + if eq1 || eq2 || eq3 { + break; + } + ptr = ptr.add(USIZE_BYTES); + } + forward_search(start_ptr, end_ptr, ptr, confirm) + } +} + +/// Return the last index matching the byte `x` in `text`. +pub fn memrchr(n1: u8, haystack: &[u8]) -> Option { + let vn1 = repeat_byte(n1); + let confirm = |byte| byte == n1; + let loop_size = cmp::min(LOOP_SIZE, haystack.len()); + let align = USIZE_BYTES - 1; + let start_ptr = haystack.as_ptr(); + + unsafe { + let end_ptr = start_ptr.add(haystack.len()); + let mut ptr = end_ptr; + if haystack.len() < USIZE_BYTES { + return reverse_search(start_ptr, end_ptr, ptr, confirm); + } + + let chunk = (ptr.sub(USIZE_BYTES) as *const usize).read_unaligned(); + if contains_zero_byte(chunk ^ vn1) { + return reverse_search(start_ptr, end_ptr, ptr, confirm); + } + + ptr = (end_ptr as usize & !align) as *const u8; + debug_assert!(start_ptr <= ptr && ptr <= end_ptr); + while loop_size == LOOP_SIZE && ptr >= start_ptr.add(loop_size) { + debug_assert_eq!(0, (ptr as usize) % USIZE_BYTES); + + let a = *(ptr.sub(2 * USIZE_BYTES) as *const usize); + let b = *(ptr.sub(1 * USIZE_BYTES) as *const usize); + let eqa = contains_zero_byte(a ^ vn1); + let eqb = contains_zero_byte(b ^ vn1); + if eqa || eqb { + break; + } + ptr = ptr.sub(loop_size); + } + reverse_search(start_ptr, end_ptr, ptr, confirm) + } +} + +/// Like `memrchr`, but searches for two bytes instead of one. +pub fn memrchr2(n1: u8, n2: u8, haystack: &[u8]) -> Option { + let vn1 = repeat_byte(n1); + let vn2 = repeat_byte(n2); + let confirm = |byte| byte == n1 || byte == n2; + let align = USIZE_BYTES - 1; + let start_ptr = haystack.as_ptr(); + + unsafe { + let end_ptr = start_ptr.add(haystack.len()); + let mut ptr = end_ptr; + if haystack.len() < USIZE_BYTES { + return reverse_search(start_ptr, end_ptr, ptr, confirm); + } + + let chunk = (ptr.sub(USIZE_BYTES) as *const usize).read_unaligned(); + let eq1 = contains_zero_byte(chunk ^ vn1); + let eq2 = contains_zero_byte(chunk ^ vn2); + if eq1 || eq2 { + return reverse_search(start_ptr, end_ptr, ptr, confirm); + } + + ptr = (end_ptr as usize & !align) as *const u8; + debug_assert!(start_ptr <= ptr && ptr <= end_ptr); + while ptr >= start_ptr.add(USIZE_BYTES) { + debug_assert_eq!(0, (ptr as usize) % USIZE_BYTES); + + let chunk = *(ptr.sub(USIZE_BYTES) as *const usize); + let eq1 = contains_zero_byte(chunk ^ vn1); + let eq2 = contains_zero_byte(chunk ^ vn2); + if eq1 || eq2 { + break; + } + ptr = ptr.sub(USIZE_BYTES); + } + reverse_search(start_ptr, end_ptr, ptr, confirm) + } +} + +/// Like `memrchr`, but searches for three bytes instead of one. +pub fn memrchr3(n1: u8, n2: u8, n3: u8, haystack: &[u8]) -> Option { + let vn1 = repeat_byte(n1); + let vn2 = repeat_byte(n2); + let vn3 = repeat_byte(n3); + let confirm = |byte| byte == n1 || byte == n2 || byte == n3; + let align = USIZE_BYTES - 1; + let start_ptr = haystack.as_ptr(); + + unsafe { + let end_ptr = start_ptr.add(haystack.len()); + let mut ptr = end_ptr; + if haystack.len() < USIZE_BYTES { + return reverse_search(start_ptr, end_ptr, ptr, confirm); + } + + let chunk = (ptr.sub(USIZE_BYTES) as *const usize).read_unaligned(); + let eq1 = contains_zero_byte(chunk ^ vn1); + let eq2 = contains_zero_byte(chunk ^ vn2); + let eq3 = contains_zero_byte(chunk ^ vn3); + if eq1 || eq2 || eq3 { + return reverse_search(start_ptr, end_ptr, ptr, confirm); + } + + ptr = (end_ptr as usize & !align) as *const u8; + debug_assert!(start_ptr <= ptr && ptr <= end_ptr); + while ptr >= start_ptr.add(USIZE_BYTES) { + debug_assert_eq!(0, (ptr as usize) % USIZE_BYTES); + + let chunk = *(ptr.sub(USIZE_BYTES) as *const usize); + let eq1 = contains_zero_byte(chunk ^ vn1); + let eq2 = contains_zero_byte(chunk ^ vn2); + let eq3 = contains_zero_byte(chunk ^ vn3); + if eq1 || eq2 || eq3 { + break; + } + ptr = ptr.sub(USIZE_BYTES); + } + reverse_search(start_ptr, end_ptr, ptr, confirm) + } +} + +#[inline(always)] +unsafe fn forward_search bool>( + start_ptr: *const u8, + end_ptr: *const u8, + mut ptr: *const u8, + confirm: F, +) -> Option { + debug_assert!(start_ptr <= ptr); + debug_assert!(ptr <= end_ptr); + + while ptr < end_ptr { + if confirm(*ptr) { + return Some(sub(ptr, start_ptr)); + } + ptr = ptr.offset(1); + } + None +} + +#[inline(always)] +unsafe fn reverse_search bool>( + start_ptr: *const u8, + end_ptr: *const u8, + mut ptr: *const u8, + confirm: F, +) -> Option { + debug_assert!(start_ptr <= ptr); + debug_assert!(ptr <= end_ptr); + + while ptr > start_ptr { + ptr = ptr.offset(-1); + if confirm(*ptr) { + return Some(sub(ptr, start_ptr)); + } + } + None +} + +/// Subtract `b` from `a` and return the difference. `a` should be greater than +/// or equal to `b`. +fn sub(a: *const u8, b: *const u8) -> usize { + debug_assert!(a >= b); + (a as usize) - (b as usize) +} diff -Nru temporalio-1.3.0/vendor/memchr/src/memchr/iter.rs temporalio-1.3.0/vendor/memchr/src/memchr/iter.rs --- temporalio-1.3.0/vendor/memchr/src/memchr/iter.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/memchr/iter.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,173 @@ +use crate::{memchr, memchr2, memchr3, memrchr, memrchr2, memrchr3}; + +macro_rules! iter_next { + // Common code for the memchr iterators: + // update haystack and position and produce the index + // + // self: &mut Self where Self is the iterator + // search_result: Option which is the result of the corresponding + // memchr function. + // + // Returns Option (the next iterator element) + ($self_:expr, $search_result:expr) => { + $search_result.map(move |index| { + // split and take the remaining back half + $self_.haystack = $self_.haystack.split_at(index + 1).1; + let found_position = $self_.position + index; + $self_.position = found_position + 1; + found_position + }) + }; +} + +macro_rules! iter_next_back { + ($self_:expr, $search_result:expr) => { + $search_result.map(move |index| { + // split and take the remaining front half + $self_.haystack = $self_.haystack.split_at(index).0; + $self_.position + index + }) + }; +} + +/// An iterator for `memchr`. +pub struct Memchr<'a> { + needle: u8, + // The haystack to iterate over + haystack: &'a [u8], + // The index + position: usize, +} + +impl<'a> Memchr<'a> { + /// Creates a new iterator that yields all positions of needle in haystack. + #[inline] + pub fn new(needle: u8, haystack: &[u8]) -> Memchr<'_> { + Memchr { needle: needle, haystack: haystack, position: 0 } + } +} + +impl<'a> Iterator for Memchr<'a> { + type Item = usize; + + #[inline] + fn next(&mut self) -> Option { + iter_next!(self, memchr(self.needle, self.haystack)) + } + + #[inline] + fn size_hint(&self) -> (usize, Option) { + (0, Some(self.haystack.len())) + } +} + +impl<'a> DoubleEndedIterator for Memchr<'a> { + #[inline] + fn next_back(&mut self) -> Option { + iter_next_back!(self, memrchr(self.needle, self.haystack)) + } +} + +/// An iterator for `memchr2`. +pub struct Memchr2<'a> { + needle1: u8, + needle2: u8, + // The haystack to iterate over + haystack: &'a [u8], + // The index + position: usize, +} + +impl<'a> Memchr2<'a> { + /// Creates a new iterator that yields all positions of needle in haystack. + #[inline] + pub fn new(needle1: u8, needle2: u8, haystack: &[u8]) -> Memchr2<'_> { + Memchr2 { + needle1: needle1, + needle2: needle2, + haystack: haystack, + position: 0, + } + } +} + +impl<'a> Iterator for Memchr2<'a> { + type Item = usize; + + #[inline] + fn next(&mut self) -> Option { + iter_next!(self, memchr2(self.needle1, self.needle2, self.haystack)) + } + + #[inline] + fn size_hint(&self) -> (usize, Option) { + (0, Some(self.haystack.len())) + } +} + +impl<'a> DoubleEndedIterator for Memchr2<'a> { + #[inline] + fn next_back(&mut self) -> Option { + iter_next_back!( + self, + memrchr2(self.needle1, self.needle2, self.haystack) + ) + } +} + +/// An iterator for `memchr3`. +pub struct Memchr3<'a> { + needle1: u8, + needle2: u8, + needle3: u8, + // The haystack to iterate over + haystack: &'a [u8], + // The index + position: usize, +} + +impl<'a> Memchr3<'a> { + /// Create a new `Memchr3` that's initialized to zero with a haystack + #[inline] + pub fn new( + needle1: u8, + needle2: u8, + needle3: u8, + haystack: &[u8], + ) -> Memchr3<'_> { + Memchr3 { + needle1: needle1, + needle2: needle2, + needle3: needle3, + haystack: haystack, + position: 0, + } + } +} + +impl<'a> Iterator for Memchr3<'a> { + type Item = usize; + + #[inline] + fn next(&mut self) -> Option { + iter_next!( + self, + memchr3(self.needle1, self.needle2, self.needle3, self.haystack) + ) + } + + #[inline] + fn size_hint(&self) -> (usize, Option) { + (0, Some(self.haystack.len())) + } +} + +impl<'a> DoubleEndedIterator for Memchr3<'a> { + #[inline] + fn next_back(&mut self) -> Option { + iter_next_back!( + self, + memrchr3(self.needle1, self.needle2, self.needle3, self.haystack) + ) + } +} diff -Nru temporalio-1.3.0/vendor/memchr/src/memchr/mod.rs temporalio-1.3.0/vendor/memchr/src/memchr/mod.rs --- temporalio-1.3.0/vendor/memchr/src/memchr/mod.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/memchr/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,410 @@ +use core::iter::Rev; + +pub use self::iter::{Memchr, Memchr2, Memchr3}; + +// N.B. If you're looking for the cfg knobs for libc, see build.rs. +#[cfg(memchr_libc)] +mod c; +#[allow(dead_code)] +pub mod fallback; +mod iter; +pub mod naive; +#[cfg(all(not(miri), target_arch = "x86_64", memchr_runtime_simd))] +mod x86; + +/// An iterator over all occurrences of the needle in a haystack. +#[inline] +pub fn memchr_iter(needle: u8, haystack: &[u8]) -> Memchr<'_> { + Memchr::new(needle, haystack) +} + +/// An iterator over all occurrences of the needles in a haystack. +#[inline] +pub fn memchr2_iter(needle1: u8, needle2: u8, haystack: &[u8]) -> Memchr2<'_> { + Memchr2::new(needle1, needle2, haystack) +} + +/// An iterator over all occurrences of the needles in a haystack. +#[inline] +pub fn memchr3_iter( + needle1: u8, + needle2: u8, + needle3: u8, + haystack: &[u8], +) -> Memchr3<'_> { + Memchr3::new(needle1, needle2, needle3, haystack) +} + +/// An iterator over all occurrences of the needle in a haystack, in reverse. +#[inline] +pub fn memrchr_iter(needle: u8, haystack: &[u8]) -> Rev> { + Memchr::new(needle, haystack).rev() +} + +/// An iterator over all occurrences of the needles in a haystack, in reverse. +#[inline] +pub fn memrchr2_iter( + needle1: u8, + needle2: u8, + haystack: &[u8], +) -> Rev> { + Memchr2::new(needle1, needle2, haystack).rev() +} + +/// An iterator over all occurrences of the needles in a haystack, in reverse. +#[inline] +pub fn memrchr3_iter( + needle1: u8, + needle2: u8, + needle3: u8, + haystack: &[u8], +) -> Rev> { + Memchr3::new(needle1, needle2, needle3, haystack).rev() +} + +/// Search for the first occurrence of a byte in a slice. +/// +/// This returns the index corresponding to the first occurrence of `needle` in +/// `haystack`, or `None` if one is not found. If an index is returned, it is +/// guaranteed to be less than `usize::MAX`. +/// +/// While this is operationally the same as something like +/// `haystack.iter().position(|&b| b == needle)`, `memchr` will use a highly +/// optimized routine that can be up to an order of magnitude faster in some +/// cases. +/// +/// # Example +/// +/// This shows how to find the first position of a byte in a byte string. +/// +/// ``` +/// use memchr::memchr; +/// +/// let haystack = b"the quick brown fox"; +/// assert_eq!(memchr(b'k', haystack), Some(8)); +/// ``` +#[inline] +pub fn memchr(needle: u8, haystack: &[u8]) -> Option { + #[cfg(miri)] + #[inline(always)] + fn imp(n1: u8, haystack: &[u8]) -> Option { + naive::memchr(n1, haystack) + } + + #[cfg(all(target_arch = "x86_64", memchr_runtime_simd, not(miri)))] + #[inline(always)] + fn imp(n1: u8, haystack: &[u8]) -> Option { + x86::memchr(n1, haystack) + } + + #[cfg(all( + memchr_libc, + not(all(target_arch = "x86_64", memchr_runtime_simd)), + not(miri), + ))] + #[inline(always)] + fn imp(n1: u8, haystack: &[u8]) -> Option { + c::memchr(n1, haystack) + } + + #[cfg(all( + not(memchr_libc), + not(all(target_arch = "x86_64", memchr_runtime_simd)), + not(miri), + ))] + #[inline(always)] + fn imp(n1: u8, haystack: &[u8]) -> Option { + fallback::memchr(n1, haystack) + } + + if haystack.is_empty() { + None + } else { + imp(needle, haystack) + } +} + +/// Like `memchr`, but searches for either of two bytes instead of just one. +/// +/// This returns the index corresponding to the first occurrence of `needle1` +/// or the first occurrence of `needle2` in `haystack` (whichever occurs +/// earlier), or `None` if neither one is found. If an index is returned, it is +/// guaranteed to be less than `usize::MAX`. +/// +/// While this is operationally the same as something like +/// `haystack.iter().position(|&b| b == needle1 || b == needle2)`, `memchr2` +/// will use a highly optimized routine that can be up to an order of magnitude +/// faster in some cases. +/// +/// # Example +/// +/// This shows how to find the first position of either of two bytes in a byte +/// string. +/// +/// ``` +/// use memchr::memchr2; +/// +/// let haystack = b"the quick brown fox"; +/// assert_eq!(memchr2(b'k', b'q', haystack), Some(4)); +/// ``` +#[inline] +pub fn memchr2(needle1: u8, needle2: u8, haystack: &[u8]) -> Option { + #[cfg(miri)] + #[inline(always)] + fn imp(n1: u8, n2: u8, haystack: &[u8]) -> Option { + naive::memchr2(n1, n2, haystack) + } + + #[cfg(all(target_arch = "x86_64", memchr_runtime_simd, not(miri)))] + #[inline(always)] + fn imp(n1: u8, n2: u8, haystack: &[u8]) -> Option { + x86::memchr2(n1, n2, haystack) + } + + #[cfg(all( + not(all(target_arch = "x86_64", memchr_runtime_simd)), + not(miri), + ))] + #[inline(always)] + fn imp(n1: u8, n2: u8, haystack: &[u8]) -> Option { + fallback::memchr2(n1, n2, haystack) + } + + if haystack.is_empty() { + None + } else { + imp(needle1, needle2, haystack) + } +} + +/// Like `memchr`, but searches for any of three bytes instead of just one. +/// +/// This returns the index corresponding to the first occurrence of `needle1`, +/// the first occurrence of `needle2`, or the first occurrence of `needle3` in +/// `haystack` (whichever occurs earliest), or `None` if none are found. If an +/// index is returned, it is guaranteed to be less than `usize::MAX`. +/// +/// While this is operationally the same as something like +/// `haystack.iter().position(|&b| b == needle1 || b == needle2 || +/// b == needle3)`, `memchr3` will use a highly optimized routine that can be +/// up to an order of magnitude faster in some cases. +/// +/// # Example +/// +/// This shows how to find the first position of any of three bytes in a byte +/// string. +/// +/// ``` +/// use memchr::memchr3; +/// +/// let haystack = b"the quick brown fox"; +/// assert_eq!(memchr3(b'k', b'q', b'e', haystack), Some(2)); +/// ``` +#[inline] +pub fn memchr3( + needle1: u8, + needle2: u8, + needle3: u8, + haystack: &[u8], +) -> Option { + #[cfg(miri)] + #[inline(always)] + fn imp(n1: u8, n2: u8, n3: u8, haystack: &[u8]) -> Option { + naive::memchr3(n1, n2, n3, haystack) + } + + #[cfg(all(target_arch = "x86_64", memchr_runtime_simd, not(miri)))] + #[inline(always)] + fn imp(n1: u8, n2: u8, n3: u8, haystack: &[u8]) -> Option { + x86::memchr3(n1, n2, n3, haystack) + } + + #[cfg(all( + not(all(target_arch = "x86_64", memchr_runtime_simd)), + not(miri), + ))] + #[inline(always)] + fn imp(n1: u8, n2: u8, n3: u8, haystack: &[u8]) -> Option { + fallback::memchr3(n1, n2, n3, haystack) + } + + if haystack.is_empty() { + None + } else { + imp(needle1, needle2, needle3, haystack) + } +} + +/// Search for the last occurrence of a byte in a slice. +/// +/// This returns the index corresponding to the last occurrence of `needle` in +/// `haystack`, or `None` if one is not found. If an index is returned, it is +/// guaranteed to be less than `usize::MAX`. +/// +/// While this is operationally the same as something like +/// `haystack.iter().rposition(|&b| b == needle)`, `memrchr` will use a highly +/// optimized routine that can be up to an order of magnitude faster in some +/// cases. +/// +/// # Example +/// +/// This shows how to find the last position of a byte in a byte string. +/// +/// ``` +/// use memchr::memrchr; +/// +/// let haystack = b"the quick brown fox"; +/// assert_eq!(memrchr(b'o', haystack), Some(17)); +/// ``` +#[inline] +pub fn memrchr(needle: u8, haystack: &[u8]) -> Option { + #[cfg(miri)] + #[inline(always)] + fn imp(n1: u8, haystack: &[u8]) -> Option { + naive::memrchr(n1, haystack) + } + + #[cfg(all(target_arch = "x86_64", memchr_runtime_simd, not(miri)))] + #[inline(always)] + fn imp(n1: u8, haystack: &[u8]) -> Option { + x86::memrchr(n1, haystack) + } + + #[cfg(all( + memchr_libc, + target_os = "linux", + not(all(target_arch = "x86_64", memchr_runtime_simd)), + not(miri) + ))] + #[inline(always)] + fn imp(n1: u8, haystack: &[u8]) -> Option { + c::memrchr(n1, haystack) + } + + #[cfg(all( + not(all(memchr_libc, target_os = "linux")), + not(all(target_arch = "x86_64", memchr_runtime_simd)), + not(miri), + ))] + #[inline(always)] + fn imp(n1: u8, haystack: &[u8]) -> Option { + fallback::memrchr(n1, haystack) + } + + if haystack.is_empty() { + None + } else { + imp(needle, haystack) + } +} + +/// Like `memrchr`, but searches for either of two bytes instead of just one. +/// +/// This returns the index corresponding to the last occurrence of `needle1` or +/// the last occurrence of `needle2` in `haystack` (whichever occurs later), or +/// `None` if neither one is found. If an index is returned, it is guaranteed +/// to be less than `usize::MAX`. +/// +/// While this is operationally the same as something like +/// `haystack.iter().rposition(|&b| b == needle1 || b == needle2)`, `memrchr2` +/// will use a highly optimized routine that can be up to an order of magnitude +/// faster in some cases. +/// +/// # Example +/// +/// This shows how to find the last position of either of two bytes in a byte +/// string. +/// +/// ``` +/// use memchr::memrchr2; +/// +/// let haystack = b"the quick brown fox"; +/// assert_eq!(memrchr2(b'k', b'q', haystack), Some(8)); +/// ``` +#[inline] +pub fn memrchr2(needle1: u8, needle2: u8, haystack: &[u8]) -> Option { + #[cfg(miri)] + #[inline(always)] + fn imp(n1: u8, n2: u8, haystack: &[u8]) -> Option { + naive::memrchr2(n1, n2, haystack) + } + + #[cfg(all(target_arch = "x86_64", memchr_runtime_simd, not(miri)))] + #[inline(always)] + fn imp(n1: u8, n2: u8, haystack: &[u8]) -> Option { + x86::memrchr2(n1, n2, haystack) + } + + #[cfg(all( + not(all(target_arch = "x86_64", memchr_runtime_simd)), + not(miri), + ))] + #[inline(always)] + fn imp(n1: u8, n2: u8, haystack: &[u8]) -> Option { + fallback::memrchr2(n1, n2, haystack) + } + + if haystack.is_empty() { + None + } else { + imp(needle1, needle2, haystack) + } +} + +/// Like `memrchr`, but searches for any of three bytes instead of just one. +/// +/// This returns the index corresponding to the last occurrence of `needle1`, +/// the last occurrence of `needle2`, or the last occurrence of `needle3` in +/// `haystack` (whichever occurs later), or `None` if none are found. If an +/// index is returned, it is guaranteed to be less than `usize::MAX`. +/// +/// While this is operationally the same as something like +/// `haystack.iter().rposition(|&b| b == needle1 || b == needle2 || +/// b == needle3)`, `memrchr3` will use a highly optimized routine that can be +/// up to an order of magnitude faster in some cases. +/// +/// # Example +/// +/// This shows how to find the last position of any of three bytes in a byte +/// string. +/// +/// ``` +/// use memchr::memrchr3; +/// +/// let haystack = b"the quick brown fox"; +/// assert_eq!(memrchr3(b'k', b'q', b'e', haystack), Some(8)); +/// ``` +#[inline] +pub fn memrchr3( + needle1: u8, + needle2: u8, + needle3: u8, + haystack: &[u8], +) -> Option { + #[cfg(miri)] + #[inline(always)] + fn imp(n1: u8, n2: u8, n3: u8, haystack: &[u8]) -> Option { + naive::memrchr3(n1, n2, n3, haystack) + } + + #[cfg(all(target_arch = "x86_64", memchr_runtime_simd, not(miri)))] + #[inline(always)] + fn imp(n1: u8, n2: u8, n3: u8, haystack: &[u8]) -> Option { + x86::memrchr3(n1, n2, n3, haystack) + } + + #[cfg(all( + not(all(target_arch = "x86_64", memchr_runtime_simd)), + not(miri), + ))] + #[inline(always)] + fn imp(n1: u8, n2: u8, n3: u8, haystack: &[u8]) -> Option { + fallback::memrchr3(n1, n2, n3, haystack) + } + + if haystack.is_empty() { + None + } else { + imp(needle1, needle2, needle3, haystack) + } +} diff -Nru temporalio-1.3.0/vendor/memchr/src/memchr/naive.rs temporalio-1.3.0/vendor/memchr/src/memchr/naive.rs --- temporalio-1.3.0/vendor/memchr/src/memchr/naive.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/memchr/naive.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,25 @@ +#![allow(dead_code)] + +pub fn memchr(n1: u8, haystack: &[u8]) -> Option { + haystack.iter().position(|&b| b == n1) +} + +pub fn memchr2(n1: u8, n2: u8, haystack: &[u8]) -> Option { + haystack.iter().position(|&b| b == n1 || b == n2) +} + +pub fn memchr3(n1: u8, n2: u8, n3: u8, haystack: &[u8]) -> Option { + haystack.iter().position(|&b| b == n1 || b == n2 || b == n3) +} + +pub fn memrchr(n1: u8, haystack: &[u8]) -> Option { + haystack.iter().rposition(|&b| b == n1) +} + +pub fn memrchr2(n1: u8, n2: u8, haystack: &[u8]) -> Option { + haystack.iter().rposition(|&b| b == n1 || b == n2) +} + +pub fn memrchr3(n1: u8, n2: u8, n3: u8, haystack: &[u8]) -> Option { + haystack.iter().rposition(|&b| b == n1 || b == n2 || b == n3) +} diff -Nru temporalio-1.3.0/vendor/memchr/src/memchr/x86/avx.rs temporalio-1.3.0/vendor/memchr/src/memchr/x86/avx.rs --- temporalio-1.3.0/vendor/memchr/src/memchr/x86/avx.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/memchr/x86/avx.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,755 @@ +use core::{arch::x86_64::*, cmp, mem::size_of}; + +use super::sse2; + +const VECTOR_SIZE: usize = size_of::<__m256i>(); +const VECTOR_ALIGN: usize = VECTOR_SIZE - 1; + +// The number of bytes to loop at in one iteration of memchr/memrchr. +const LOOP_SIZE: usize = 4 * VECTOR_SIZE; + +// The number of bytes to loop at in one iteration of memchr2/memrchr2 and +// memchr3/memrchr3. There was no observable difference between 128 and 64 +// bytes in benchmarks. memchr3 in particular only gets a very slight speed up +// from the loop unrolling. +const LOOP_SIZE2: usize = 2 * VECTOR_SIZE; + +#[target_feature(enable = "avx2")] +pub unsafe fn memchr(n1: u8, haystack: &[u8]) -> Option { + // For a high level explanation for how this algorithm works, see the + // sse2 implementation. The avx implementation here is the same, but with + // 256-bit vectors instead of 128-bit vectors. + + // This routine is called whenever a match is detected. It is specifically + // marked as unlineable because it improves the codegen of the unrolled + // loop below. Inlining this seems to cause codegen with some extra adds + // and a load that aren't necessary. This seems to result in about a 10% + // improvement for the memchr1/crate/huge/never benchmark. + // + // Interestingly, I couldn't observe a similar improvement for memrchr. + #[cold] + #[inline(never)] + #[target_feature(enable = "avx2")] + unsafe fn matched( + start_ptr: *const u8, + ptr: *const u8, + eqa: __m256i, + eqb: __m256i, + eqc: __m256i, + eqd: __m256i, + ) -> usize { + let mut at = sub(ptr, start_ptr); + let mask = _mm256_movemask_epi8(eqa); + if mask != 0 { + return at + forward_pos(mask); + } + + at += VECTOR_SIZE; + let mask = _mm256_movemask_epi8(eqb); + if mask != 0 { + return at + forward_pos(mask); + } + + at += VECTOR_SIZE; + let mask = _mm256_movemask_epi8(eqc); + if mask != 0 { + return at + forward_pos(mask); + } + + at += VECTOR_SIZE; + let mask = _mm256_movemask_epi8(eqd); + debug_assert!(mask != 0); + at + forward_pos(mask) + } + + let start_ptr = haystack.as_ptr(); + let end_ptr = start_ptr.add(haystack.len()); + let mut ptr = start_ptr; + + if haystack.len() < VECTOR_SIZE { + // For small haystacks, defer to the SSE2 implementation. Codegen + // suggests this completely avoids touching the AVX vectors. + return sse2::memchr(n1, haystack); + } + + let vn1 = _mm256_set1_epi8(n1 as i8); + let loop_size = cmp::min(LOOP_SIZE, haystack.len()); + if let Some(i) = forward_search1(start_ptr, end_ptr, ptr, vn1) { + return Some(i); + } + + ptr = ptr.add(VECTOR_SIZE - (start_ptr as usize & VECTOR_ALIGN)); + debug_assert!(ptr > start_ptr && end_ptr.sub(VECTOR_SIZE) >= start_ptr); + while loop_size == LOOP_SIZE && ptr <= end_ptr.sub(loop_size) { + debug_assert_eq!(0, (ptr as usize) % VECTOR_SIZE); + + let a = _mm256_load_si256(ptr as *const __m256i); + let b = _mm256_load_si256(ptr.add(VECTOR_SIZE) as *const __m256i); + let c = _mm256_load_si256(ptr.add(2 * VECTOR_SIZE) as *const __m256i); + let d = _mm256_load_si256(ptr.add(3 * VECTOR_SIZE) as *const __m256i); + let eqa = _mm256_cmpeq_epi8(vn1, a); + let eqb = _mm256_cmpeq_epi8(vn1, b); + let eqc = _mm256_cmpeq_epi8(vn1, c); + let eqd = _mm256_cmpeq_epi8(vn1, d); + let or1 = _mm256_or_si256(eqa, eqb); + let or2 = _mm256_or_si256(eqc, eqd); + let or3 = _mm256_or_si256(or1, or2); + + if _mm256_movemask_epi8(or3) != 0 { + return Some(matched(start_ptr, ptr, eqa, eqb, eqc, eqd)); + } + ptr = ptr.add(loop_size); + } + while ptr <= end_ptr.sub(VECTOR_SIZE) { + debug_assert!(sub(end_ptr, ptr) >= VECTOR_SIZE); + + if let Some(i) = forward_search1(start_ptr, end_ptr, ptr, vn1) { + return Some(i); + } + ptr = ptr.add(VECTOR_SIZE); + } + if ptr < end_ptr { + debug_assert!(sub(end_ptr, ptr) < VECTOR_SIZE); + ptr = ptr.sub(VECTOR_SIZE - sub(end_ptr, ptr)); + debug_assert_eq!(sub(end_ptr, ptr), VECTOR_SIZE); + + return forward_search1(start_ptr, end_ptr, ptr, vn1); + } + None +} + +#[target_feature(enable = "avx2")] +pub unsafe fn memchr2(n1: u8, n2: u8, haystack: &[u8]) -> Option { + #[cold] + #[inline(never)] + #[target_feature(enable = "avx2")] + unsafe fn matched( + start_ptr: *const u8, + ptr: *const u8, + eqa1: __m256i, + eqa2: __m256i, + eqb1: __m256i, + eqb2: __m256i, + ) -> usize { + let mut at = sub(ptr, start_ptr); + let mask1 = _mm256_movemask_epi8(eqa1); + let mask2 = _mm256_movemask_epi8(eqa2); + if mask1 != 0 || mask2 != 0 { + return at + forward_pos2(mask1, mask2); + } + + at += VECTOR_SIZE; + let mask1 = _mm256_movemask_epi8(eqb1); + let mask2 = _mm256_movemask_epi8(eqb2); + at + forward_pos2(mask1, mask2) + } + + let vn1 = _mm256_set1_epi8(n1 as i8); + let vn2 = _mm256_set1_epi8(n2 as i8); + let len = haystack.len(); + let loop_size = cmp::min(LOOP_SIZE2, len); + let start_ptr = haystack.as_ptr(); + let end_ptr = start_ptr.add(haystack.len()); + let mut ptr = start_ptr; + + if haystack.len() < VECTOR_SIZE { + while ptr < end_ptr { + if *ptr == n1 || *ptr == n2 { + return Some(sub(ptr, start_ptr)); + } + ptr = ptr.offset(1); + } + return None; + } + + if let Some(i) = forward_search2(start_ptr, end_ptr, ptr, vn1, vn2) { + return Some(i); + } + + ptr = ptr.add(VECTOR_SIZE - (start_ptr as usize & VECTOR_ALIGN)); + debug_assert!(ptr > start_ptr && end_ptr.sub(VECTOR_SIZE) >= start_ptr); + while loop_size == LOOP_SIZE2 && ptr <= end_ptr.sub(loop_size) { + debug_assert_eq!(0, (ptr as usize) % VECTOR_SIZE); + + let a = _mm256_load_si256(ptr as *const __m256i); + let b = _mm256_load_si256(ptr.add(VECTOR_SIZE) as *const __m256i); + let eqa1 = _mm256_cmpeq_epi8(vn1, a); + let eqb1 = _mm256_cmpeq_epi8(vn1, b); + let eqa2 = _mm256_cmpeq_epi8(vn2, a); + let eqb2 = _mm256_cmpeq_epi8(vn2, b); + let or1 = _mm256_or_si256(eqa1, eqb1); + let or2 = _mm256_or_si256(eqa2, eqb2); + let or3 = _mm256_or_si256(or1, or2); + if _mm256_movemask_epi8(or3) != 0 { + return Some(matched(start_ptr, ptr, eqa1, eqa2, eqb1, eqb2)); + } + ptr = ptr.add(loop_size); + } + while ptr <= end_ptr.sub(VECTOR_SIZE) { + if let Some(i) = forward_search2(start_ptr, end_ptr, ptr, vn1, vn2) { + return Some(i); + } + ptr = ptr.add(VECTOR_SIZE); + } + if ptr < end_ptr { + debug_assert!(sub(end_ptr, ptr) < VECTOR_SIZE); + ptr = ptr.sub(VECTOR_SIZE - sub(end_ptr, ptr)); + debug_assert_eq!(sub(end_ptr, ptr), VECTOR_SIZE); + + return forward_search2(start_ptr, end_ptr, ptr, vn1, vn2); + } + None +} + +#[target_feature(enable = "avx2")] +pub unsafe fn memchr3( + n1: u8, + n2: u8, + n3: u8, + haystack: &[u8], +) -> Option { + #[cold] + #[inline(never)] + #[target_feature(enable = "avx2")] + unsafe fn matched( + start_ptr: *const u8, + ptr: *const u8, + eqa1: __m256i, + eqa2: __m256i, + eqa3: __m256i, + eqb1: __m256i, + eqb2: __m256i, + eqb3: __m256i, + ) -> usize { + let mut at = sub(ptr, start_ptr); + let mask1 = _mm256_movemask_epi8(eqa1); + let mask2 = _mm256_movemask_epi8(eqa2); + let mask3 = _mm256_movemask_epi8(eqa3); + if mask1 != 0 || mask2 != 0 || mask3 != 0 { + return at + forward_pos3(mask1, mask2, mask3); + } + + at += VECTOR_SIZE; + let mask1 = _mm256_movemask_epi8(eqb1); + let mask2 = _mm256_movemask_epi8(eqb2); + let mask3 = _mm256_movemask_epi8(eqb3); + at + forward_pos3(mask1, mask2, mask3) + } + + let vn1 = _mm256_set1_epi8(n1 as i8); + let vn2 = _mm256_set1_epi8(n2 as i8); + let vn3 = _mm256_set1_epi8(n3 as i8); + let len = haystack.len(); + let loop_size = cmp::min(LOOP_SIZE2, len); + let start_ptr = haystack.as_ptr(); + let end_ptr = start_ptr.add(haystack.len()); + let mut ptr = start_ptr; + + if haystack.len() < VECTOR_SIZE { + while ptr < end_ptr { + if *ptr == n1 || *ptr == n2 || *ptr == n3 { + return Some(sub(ptr, start_ptr)); + } + ptr = ptr.offset(1); + } + return None; + } + + if let Some(i) = forward_search3(start_ptr, end_ptr, ptr, vn1, vn2, vn3) { + return Some(i); + } + + ptr = ptr.add(VECTOR_SIZE - (start_ptr as usize & VECTOR_ALIGN)); + debug_assert!(ptr > start_ptr && end_ptr.sub(VECTOR_SIZE) >= start_ptr); + while loop_size == LOOP_SIZE2 && ptr <= end_ptr.sub(loop_size) { + debug_assert_eq!(0, (ptr as usize) % VECTOR_SIZE); + + let a = _mm256_load_si256(ptr as *const __m256i); + let b = _mm256_load_si256(ptr.add(VECTOR_SIZE) as *const __m256i); + let eqa1 = _mm256_cmpeq_epi8(vn1, a); + let eqb1 = _mm256_cmpeq_epi8(vn1, b); + let eqa2 = _mm256_cmpeq_epi8(vn2, a); + let eqb2 = _mm256_cmpeq_epi8(vn2, b); + let eqa3 = _mm256_cmpeq_epi8(vn3, a); + let eqb3 = _mm256_cmpeq_epi8(vn3, b); + let or1 = _mm256_or_si256(eqa1, eqb1); + let or2 = _mm256_or_si256(eqa2, eqb2); + let or3 = _mm256_or_si256(eqa3, eqb3); + let or4 = _mm256_or_si256(or1, or2); + let or5 = _mm256_or_si256(or3, or4); + if _mm256_movemask_epi8(or5) != 0 { + return Some(matched( + start_ptr, ptr, eqa1, eqa2, eqa3, eqb1, eqb2, eqb3, + )); + } + ptr = ptr.add(loop_size); + } + while ptr <= end_ptr.sub(VECTOR_SIZE) { + if let Some(i) = + forward_search3(start_ptr, end_ptr, ptr, vn1, vn2, vn3) + { + return Some(i); + } + ptr = ptr.add(VECTOR_SIZE); + } + if ptr < end_ptr { + debug_assert!(sub(end_ptr, ptr) < VECTOR_SIZE); + ptr = ptr.sub(VECTOR_SIZE - sub(end_ptr, ptr)); + debug_assert_eq!(sub(end_ptr, ptr), VECTOR_SIZE); + + return forward_search3(start_ptr, end_ptr, ptr, vn1, vn2, vn3); + } + None +} + +#[target_feature(enable = "avx2")] +pub unsafe fn memrchr(n1: u8, haystack: &[u8]) -> Option { + let vn1 = _mm256_set1_epi8(n1 as i8); + let len = haystack.len(); + let loop_size = cmp::min(LOOP_SIZE, len); + let start_ptr = haystack.as_ptr(); + let end_ptr = start_ptr.add(haystack.len()); + let mut ptr = end_ptr; + + if haystack.len() < VECTOR_SIZE { + while ptr > start_ptr { + ptr = ptr.offset(-1); + if *ptr == n1 { + return Some(sub(ptr, start_ptr)); + } + } + return None; + } + + ptr = ptr.sub(VECTOR_SIZE); + if let Some(i) = reverse_search1(start_ptr, end_ptr, ptr, vn1) { + return Some(i); + } + + ptr = (end_ptr as usize & !VECTOR_ALIGN) as *const u8; + debug_assert!(start_ptr <= ptr && ptr <= end_ptr); + while loop_size == LOOP_SIZE && ptr >= start_ptr.add(loop_size) { + debug_assert_eq!(0, (ptr as usize) % VECTOR_SIZE); + + ptr = ptr.sub(loop_size); + let a = _mm256_load_si256(ptr as *const __m256i); + let b = _mm256_load_si256(ptr.add(VECTOR_SIZE) as *const __m256i); + let c = _mm256_load_si256(ptr.add(2 * VECTOR_SIZE) as *const __m256i); + let d = _mm256_load_si256(ptr.add(3 * VECTOR_SIZE) as *const __m256i); + let eqa = _mm256_cmpeq_epi8(vn1, a); + let eqb = _mm256_cmpeq_epi8(vn1, b); + let eqc = _mm256_cmpeq_epi8(vn1, c); + let eqd = _mm256_cmpeq_epi8(vn1, d); + let or1 = _mm256_or_si256(eqa, eqb); + let or2 = _mm256_or_si256(eqc, eqd); + let or3 = _mm256_or_si256(or1, or2); + if _mm256_movemask_epi8(or3) != 0 { + let mut at = sub(ptr.add(3 * VECTOR_SIZE), start_ptr); + let mask = _mm256_movemask_epi8(eqd); + if mask != 0 { + return Some(at + reverse_pos(mask)); + } + + at -= VECTOR_SIZE; + let mask = _mm256_movemask_epi8(eqc); + if mask != 0 { + return Some(at + reverse_pos(mask)); + } + + at -= VECTOR_SIZE; + let mask = _mm256_movemask_epi8(eqb); + if mask != 0 { + return Some(at + reverse_pos(mask)); + } + + at -= VECTOR_SIZE; + let mask = _mm256_movemask_epi8(eqa); + debug_assert!(mask != 0); + return Some(at + reverse_pos(mask)); + } + } + while ptr >= start_ptr.add(VECTOR_SIZE) { + ptr = ptr.sub(VECTOR_SIZE); + if let Some(i) = reverse_search1(start_ptr, end_ptr, ptr, vn1) { + return Some(i); + } + } + if ptr > start_ptr { + debug_assert!(sub(ptr, start_ptr) < VECTOR_SIZE); + return reverse_search1(start_ptr, end_ptr, start_ptr, vn1); + } + None +} + +#[target_feature(enable = "avx2")] +pub unsafe fn memrchr2(n1: u8, n2: u8, haystack: &[u8]) -> Option { + let vn1 = _mm256_set1_epi8(n1 as i8); + let vn2 = _mm256_set1_epi8(n2 as i8); + let len = haystack.len(); + let loop_size = cmp::min(LOOP_SIZE2, len); + let start_ptr = haystack.as_ptr(); + let end_ptr = start_ptr.add(haystack.len()); + let mut ptr = end_ptr; + + if haystack.len() < VECTOR_SIZE { + while ptr > start_ptr { + ptr = ptr.offset(-1); + if *ptr == n1 || *ptr == n2 { + return Some(sub(ptr, start_ptr)); + } + } + return None; + } + + ptr = ptr.sub(VECTOR_SIZE); + if let Some(i) = reverse_search2(start_ptr, end_ptr, ptr, vn1, vn2) { + return Some(i); + } + + ptr = (end_ptr as usize & !VECTOR_ALIGN) as *const u8; + debug_assert!(start_ptr <= ptr && ptr <= end_ptr); + while loop_size == LOOP_SIZE2 && ptr >= start_ptr.add(loop_size) { + debug_assert_eq!(0, (ptr as usize) % VECTOR_SIZE); + + ptr = ptr.sub(loop_size); + let a = _mm256_load_si256(ptr as *const __m256i); + let b = _mm256_load_si256(ptr.add(VECTOR_SIZE) as *const __m256i); + let eqa1 = _mm256_cmpeq_epi8(vn1, a); + let eqb1 = _mm256_cmpeq_epi8(vn1, b); + let eqa2 = _mm256_cmpeq_epi8(vn2, a); + let eqb2 = _mm256_cmpeq_epi8(vn2, b); + let or1 = _mm256_or_si256(eqa1, eqb1); + let or2 = _mm256_or_si256(eqa2, eqb2); + let or3 = _mm256_or_si256(or1, or2); + if _mm256_movemask_epi8(or3) != 0 { + let mut at = sub(ptr.add(VECTOR_SIZE), start_ptr); + let mask1 = _mm256_movemask_epi8(eqb1); + let mask2 = _mm256_movemask_epi8(eqb2); + if mask1 != 0 || mask2 != 0 { + return Some(at + reverse_pos2(mask1, mask2)); + } + + at -= VECTOR_SIZE; + let mask1 = _mm256_movemask_epi8(eqa1); + let mask2 = _mm256_movemask_epi8(eqa2); + return Some(at + reverse_pos2(mask1, mask2)); + } + } + while ptr >= start_ptr.add(VECTOR_SIZE) { + ptr = ptr.sub(VECTOR_SIZE); + if let Some(i) = reverse_search2(start_ptr, end_ptr, ptr, vn1, vn2) { + return Some(i); + } + } + if ptr > start_ptr { + debug_assert!(sub(ptr, start_ptr) < VECTOR_SIZE); + return reverse_search2(start_ptr, end_ptr, start_ptr, vn1, vn2); + } + None +} + +#[target_feature(enable = "avx2")] +pub unsafe fn memrchr3( + n1: u8, + n2: u8, + n3: u8, + haystack: &[u8], +) -> Option { + let vn1 = _mm256_set1_epi8(n1 as i8); + let vn2 = _mm256_set1_epi8(n2 as i8); + let vn3 = _mm256_set1_epi8(n3 as i8); + let len = haystack.len(); + let loop_size = cmp::min(LOOP_SIZE2, len); + let start_ptr = haystack.as_ptr(); + let end_ptr = start_ptr.add(haystack.len()); + let mut ptr = end_ptr; + + if haystack.len() < VECTOR_SIZE { + while ptr > start_ptr { + ptr = ptr.offset(-1); + if *ptr == n1 || *ptr == n2 || *ptr == n3 { + return Some(sub(ptr, start_ptr)); + } + } + return None; + } + + ptr = ptr.sub(VECTOR_SIZE); + if let Some(i) = reverse_search3(start_ptr, end_ptr, ptr, vn1, vn2, vn3) { + return Some(i); + } + + ptr = (end_ptr as usize & !VECTOR_ALIGN) as *const u8; + debug_assert!(start_ptr <= ptr && ptr <= end_ptr); + while loop_size == LOOP_SIZE2 && ptr >= start_ptr.add(loop_size) { + debug_assert_eq!(0, (ptr as usize) % VECTOR_SIZE); + + ptr = ptr.sub(loop_size); + let a = _mm256_load_si256(ptr as *const __m256i); + let b = _mm256_load_si256(ptr.add(VECTOR_SIZE) as *const __m256i); + let eqa1 = _mm256_cmpeq_epi8(vn1, a); + let eqb1 = _mm256_cmpeq_epi8(vn1, b); + let eqa2 = _mm256_cmpeq_epi8(vn2, a); + let eqb2 = _mm256_cmpeq_epi8(vn2, b); + let eqa3 = _mm256_cmpeq_epi8(vn3, a); + let eqb3 = _mm256_cmpeq_epi8(vn3, b); + let or1 = _mm256_or_si256(eqa1, eqb1); + let or2 = _mm256_or_si256(eqa2, eqb2); + let or3 = _mm256_or_si256(eqa3, eqb3); + let or4 = _mm256_or_si256(or1, or2); + let or5 = _mm256_or_si256(or3, or4); + if _mm256_movemask_epi8(or5) != 0 { + let mut at = sub(ptr.add(VECTOR_SIZE), start_ptr); + let mask1 = _mm256_movemask_epi8(eqb1); + let mask2 = _mm256_movemask_epi8(eqb2); + let mask3 = _mm256_movemask_epi8(eqb3); + if mask1 != 0 || mask2 != 0 || mask3 != 0 { + return Some(at + reverse_pos3(mask1, mask2, mask3)); + } + + at -= VECTOR_SIZE; + let mask1 = _mm256_movemask_epi8(eqa1); + let mask2 = _mm256_movemask_epi8(eqa2); + let mask3 = _mm256_movemask_epi8(eqa3); + return Some(at + reverse_pos3(mask1, mask2, mask3)); + } + } + while ptr >= start_ptr.add(VECTOR_SIZE) { + ptr = ptr.sub(VECTOR_SIZE); + if let Some(i) = + reverse_search3(start_ptr, end_ptr, ptr, vn1, vn2, vn3) + { + return Some(i); + } + } + if ptr > start_ptr { + debug_assert!(sub(ptr, start_ptr) < VECTOR_SIZE); + return reverse_search3(start_ptr, end_ptr, start_ptr, vn1, vn2, vn3); + } + None +} + +#[target_feature(enable = "avx2")] +unsafe fn forward_search1( + start_ptr: *const u8, + end_ptr: *const u8, + ptr: *const u8, + vn1: __m256i, +) -> Option { + debug_assert!(sub(end_ptr, start_ptr) >= VECTOR_SIZE); + debug_assert!(start_ptr <= ptr); + debug_assert!(ptr <= end_ptr.sub(VECTOR_SIZE)); + + let chunk = _mm256_loadu_si256(ptr as *const __m256i); + let mask = _mm256_movemask_epi8(_mm256_cmpeq_epi8(chunk, vn1)); + if mask != 0 { + Some(sub(ptr, start_ptr) + forward_pos(mask)) + } else { + None + } +} + +#[target_feature(enable = "avx2")] +unsafe fn forward_search2( + start_ptr: *const u8, + end_ptr: *const u8, + ptr: *const u8, + vn1: __m256i, + vn2: __m256i, +) -> Option { + debug_assert!(sub(end_ptr, start_ptr) >= VECTOR_SIZE); + debug_assert!(start_ptr <= ptr); + debug_assert!(ptr <= end_ptr.sub(VECTOR_SIZE)); + + let chunk = _mm256_loadu_si256(ptr as *const __m256i); + let eq1 = _mm256_cmpeq_epi8(chunk, vn1); + let eq2 = _mm256_cmpeq_epi8(chunk, vn2); + if _mm256_movemask_epi8(_mm256_or_si256(eq1, eq2)) != 0 { + let mask1 = _mm256_movemask_epi8(eq1); + let mask2 = _mm256_movemask_epi8(eq2); + Some(sub(ptr, start_ptr) + forward_pos2(mask1, mask2)) + } else { + None + } +} + +#[target_feature(enable = "avx2")] +unsafe fn forward_search3( + start_ptr: *const u8, + end_ptr: *const u8, + ptr: *const u8, + vn1: __m256i, + vn2: __m256i, + vn3: __m256i, +) -> Option { + debug_assert!(sub(end_ptr, start_ptr) >= VECTOR_SIZE); + debug_assert!(start_ptr <= ptr); + debug_assert!(ptr <= end_ptr.sub(VECTOR_SIZE)); + + let chunk = _mm256_loadu_si256(ptr as *const __m256i); + let eq1 = _mm256_cmpeq_epi8(chunk, vn1); + let eq2 = _mm256_cmpeq_epi8(chunk, vn2); + let eq3 = _mm256_cmpeq_epi8(chunk, vn3); + let or = _mm256_or_si256(eq1, eq2); + if _mm256_movemask_epi8(_mm256_or_si256(or, eq3)) != 0 { + let mask1 = _mm256_movemask_epi8(eq1); + let mask2 = _mm256_movemask_epi8(eq2); + let mask3 = _mm256_movemask_epi8(eq3); + Some(sub(ptr, start_ptr) + forward_pos3(mask1, mask2, mask3)) + } else { + None + } +} + +#[target_feature(enable = "avx2")] +unsafe fn reverse_search1( + start_ptr: *const u8, + end_ptr: *const u8, + ptr: *const u8, + vn1: __m256i, +) -> Option { + debug_assert!(sub(end_ptr, start_ptr) >= VECTOR_SIZE); + debug_assert!(start_ptr <= ptr); + debug_assert!(ptr <= end_ptr.sub(VECTOR_SIZE)); + + let chunk = _mm256_loadu_si256(ptr as *const __m256i); + let mask = _mm256_movemask_epi8(_mm256_cmpeq_epi8(vn1, chunk)); + if mask != 0 { + Some(sub(ptr, start_ptr) + reverse_pos(mask)) + } else { + None + } +} + +#[target_feature(enable = "avx2")] +unsafe fn reverse_search2( + start_ptr: *const u8, + end_ptr: *const u8, + ptr: *const u8, + vn1: __m256i, + vn2: __m256i, +) -> Option { + debug_assert!(sub(end_ptr, start_ptr) >= VECTOR_SIZE); + debug_assert!(start_ptr <= ptr); + debug_assert!(ptr <= end_ptr.sub(VECTOR_SIZE)); + + let chunk = _mm256_loadu_si256(ptr as *const __m256i); + let eq1 = _mm256_cmpeq_epi8(chunk, vn1); + let eq2 = _mm256_cmpeq_epi8(chunk, vn2); + if _mm256_movemask_epi8(_mm256_or_si256(eq1, eq2)) != 0 { + let mask1 = _mm256_movemask_epi8(eq1); + let mask2 = _mm256_movemask_epi8(eq2); + Some(sub(ptr, start_ptr) + reverse_pos2(mask1, mask2)) + } else { + None + } +} + +#[target_feature(enable = "avx2")] +unsafe fn reverse_search3( + start_ptr: *const u8, + end_ptr: *const u8, + ptr: *const u8, + vn1: __m256i, + vn2: __m256i, + vn3: __m256i, +) -> Option { + debug_assert!(sub(end_ptr, start_ptr) >= VECTOR_SIZE); + debug_assert!(start_ptr <= ptr); + debug_assert!(ptr <= end_ptr.sub(VECTOR_SIZE)); + + let chunk = _mm256_loadu_si256(ptr as *const __m256i); + let eq1 = _mm256_cmpeq_epi8(chunk, vn1); + let eq2 = _mm256_cmpeq_epi8(chunk, vn2); + let eq3 = _mm256_cmpeq_epi8(chunk, vn3); + let or = _mm256_or_si256(eq1, eq2); + if _mm256_movemask_epi8(_mm256_or_si256(or, eq3)) != 0 { + let mask1 = _mm256_movemask_epi8(eq1); + let mask2 = _mm256_movemask_epi8(eq2); + let mask3 = _mm256_movemask_epi8(eq3); + Some(sub(ptr, start_ptr) + reverse_pos3(mask1, mask2, mask3)) + } else { + None + } +} + +/// Compute the position of the first matching byte from the given mask. The +/// position returned is always in the range [0, 31]. +/// +/// The mask given is expected to be the result of _mm256_movemask_epi8. +fn forward_pos(mask: i32) -> usize { + // We are dealing with little endian here, where the most significant byte + // is at a higher address. That means the least significant bit that is set + // corresponds to the position of our first matching byte. That position + // corresponds to the number of zeros after the least significant bit. + mask.trailing_zeros() as usize +} + +/// Compute the position of the first matching byte from the given masks. The +/// position returned is always in the range [0, 31]. Each mask corresponds to +/// the equality comparison of a single byte. +/// +/// The masks given are expected to be the result of _mm256_movemask_epi8, +/// where at least one of the masks is non-zero (i.e., indicates a match). +fn forward_pos2(mask1: i32, mask2: i32) -> usize { + debug_assert!(mask1 != 0 || mask2 != 0); + + forward_pos(mask1 | mask2) +} + +/// Compute the position of the first matching byte from the given masks. The +/// position returned is always in the range [0, 31]. Each mask corresponds to +/// the equality comparison of a single byte. +/// +/// The masks given are expected to be the result of _mm256_movemask_epi8, +/// where at least one of the masks is non-zero (i.e., indicates a match). +fn forward_pos3(mask1: i32, mask2: i32, mask3: i32) -> usize { + debug_assert!(mask1 != 0 || mask2 != 0 || mask3 != 0); + + forward_pos(mask1 | mask2 | mask3) +} + +/// Compute the position of the last matching byte from the given mask. The +/// position returned is always in the range [0, 31]. +/// +/// The mask given is expected to be the result of _mm256_movemask_epi8. +fn reverse_pos(mask: i32) -> usize { + // We are dealing with little endian here, where the most significant byte + // is at a higher address. That means the most significant bit that is set + // corresponds to the position of our last matching byte. The position from + // the end of the mask is therefore the number of leading zeros in a 32 + // bit integer, and the position from the start of the mask is therefore + // 32 - (leading zeros) - 1. + VECTOR_SIZE - (mask as u32).leading_zeros() as usize - 1 +} + +/// Compute the position of the last matching byte from the given masks. The +/// position returned is always in the range [0, 31]. Each mask corresponds to +/// the equality comparison of a single byte. +/// +/// The masks given are expected to be the result of _mm256_movemask_epi8, +/// where at least one of the masks is non-zero (i.e., indicates a match). +fn reverse_pos2(mask1: i32, mask2: i32) -> usize { + debug_assert!(mask1 != 0 || mask2 != 0); + + reverse_pos(mask1 | mask2) +} + +/// Compute the position of the last matching byte from the given masks. The +/// position returned is always in the range [0, 31]. Each mask corresponds to +/// the equality comparison of a single byte. +/// +/// The masks given are expected to be the result of _mm256_movemask_epi8, +/// where at least one of the masks is non-zero (i.e., indicates a match). +fn reverse_pos3(mask1: i32, mask2: i32, mask3: i32) -> usize { + debug_assert!(mask1 != 0 || mask2 != 0 || mask3 != 0); + + reverse_pos(mask1 | mask2 | mask3) +} + +/// Subtract `b` from `a` and return the difference. `a` should be greater than +/// or equal to `b`. +fn sub(a: *const u8, b: *const u8) -> usize { + debug_assert!(a >= b); + (a as usize) - (b as usize) +} diff -Nru temporalio-1.3.0/vendor/memchr/src/memchr/x86/mod.rs temporalio-1.3.0/vendor/memchr/src/memchr/x86/mod.rs --- temporalio-1.3.0/vendor/memchr/src/memchr/x86/mod.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/memchr/x86/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,148 @@ +use super::fallback; + +// We only use AVX when we can detect at runtime whether it's available, which +// requires std. +#[cfg(feature = "std")] +mod avx; +mod sse2; + +/// This macro employs a gcc-like "ifunc" trick where by upon first calling +/// `memchr` (for example), CPU feature detection will be performed at runtime +/// to determine the best implementation to use. After CPU feature detection +/// is done, we replace `memchr`'s function pointer with the selection. Upon +/// subsequent invocations, the CPU-specific routine is invoked directly, which +/// skips the CPU feature detection and subsequent branch that's required. +/// +/// While this typically doesn't matter for rare occurrences or when used on +/// larger haystacks, `memchr` can be called in tight loops where the overhead +/// of this branch can actually add up *and is measurable*. This trick was +/// necessary to bring this implementation up to glibc's speeds for the 'tiny' +/// benchmarks, for example. +/// +/// At some point, I expect the Rust ecosystem will get a nice macro for doing +/// exactly this, at which point, we can replace our hand-jammed version of it. +/// +/// N.B. The ifunc strategy does prevent function inlining of course, but +/// on modern CPUs, you'll probably end up with the AVX2 implementation, +/// which probably can't be inlined anyway---unless you've compiled your +/// entire program with AVX2 enabled. However, even then, the various memchr +/// implementations aren't exactly small, so inlining might not help anyway! +/// +/// # Safety +/// +/// Callers must ensure that fnty is function pointer type. +#[cfg(feature = "std")] +macro_rules! unsafe_ifunc { + ($fnty:ty, $name:ident, $haystack:ident, $($needle:ident),+) => {{ + use std::{mem, sync::atomic::{AtomicPtr, Ordering}}; + + type FnRaw = *mut (); + + static FN: AtomicPtr<()> = AtomicPtr::new(detect as FnRaw); + + fn detect($($needle: u8),+, haystack: &[u8]) -> Option { + let fun = + if cfg!(memchr_runtime_avx) && is_x86_feature_detected!("avx2") { + avx::$name as FnRaw + } else if cfg!(memchr_runtime_sse2) { + sse2::$name as FnRaw + } else { + fallback::$name as FnRaw + }; + FN.store(fun as FnRaw, Ordering::Relaxed); + // SAFETY: By virtue of the caller contract, $fnty is a function + // pointer, which is always safe to transmute with a *mut (). + // Also, if 'fun is the AVX routine, then it is guaranteed to be + // supported since we checked the avx2 feature. + unsafe { + mem::transmute::(fun)($($needle),+, haystack) + } + } + + // SAFETY: By virtue of the caller contract, $fnty is a function + // pointer, which is always safe to transmute with a *mut (). Also, if + // 'fun is the AVX routine, then it is guaranteed to be supported since + // we checked the avx2 feature. + unsafe { + let fun = FN.load(Ordering::Relaxed); + mem::transmute::(fun)($($needle),+, $haystack) + } + }} +} + +/// When std isn't available to provide runtime CPU feature detection, or if +/// runtime CPU feature detection has been explicitly disabled, then just +/// call our optimized SSE2 routine directly. SSE2 is avalbale on all x86_64 +/// targets, so no CPU feature detection is necessary. +/// +/// # Safety +/// +/// There are no safety requirements for this definition of the macro. It is +/// safe for all inputs since it is restricted to either the fallback routine +/// or the SSE routine, which is always safe to call on x86_64. +#[cfg(not(feature = "std"))] +macro_rules! unsafe_ifunc { + ($fnty:ty, $name:ident, $haystack:ident, $($needle:ident),+) => {{ + if cfg!(memchr_runtime_sse2) { + unsafe { sse2::$name($($needle),+, $haystack) } + } else { + fallback::$name($($needle),+, $haystack) + } + }} +} + +#[inline(always)] +pub fn memchr(n1: u8, haystack: &[u8]) -> Option { + unsafe_ifunc!(fn(u8, &[u8]) -> Option, memchr, haystack, n1) +} + +#[inline(always)] +pub fn memchr2(n1: u8, n2: u8, haystack: &[u8]) -> Option { + unsafe_ifunc!( + fn(u8, u8, &[u8]) -> Option, + memchr2, + haystack, + n1, + n2 + ) +} + +#[inline(always)] +pub fn memchr3(n1: u8, n2: u8, n3: u8, haystack: &[u8]) -> Option { + unsafe_ifunc!( + fn(u8, u8, u8, &[u8]) -> Option, + memchr3, + haystack, + n1, + n2, + n3 + ) +} + +#[inline(always)] +pub fn memrchr(n1: u8, haystack: &[u8]) -> Option { + unsafe_ifunc!(fn(u8, &[u8]) -> Option, memrchr, haystack, n1) +} + +#[inline(always)] +pub fn memrchr2(n1: u8, n2: u8, haystack: &[u8]) -> Option { + unsafe_ifunc!( + fn(u8, u8, &[u8]) -> Option, + memrchr2, + haystack, + n1, + n2 + ) +} + +#[inline(always)] +pub fn memrchr3(n1: u8, n2: u8, n3: u8, haystack: &[u8]) -> Option { + unsafe_ifunc!( + fn(u8, u8, u8, &[u8]) -> Option, + memrchr3, + haystack, + n1, + n2, + n3 + ) +} diff -Nru temporalio-1.3.0/vendor/memchr/src/memchr/x86/sse2.rs temporalio-1.3.0/vendor/memchr/src/memchr/x86/sse2.rs --- temporalio-1.3.0/vendor/memchr/src/memchr/x86/sse2.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/memchr/x86/sse2.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,791 @@ +use core::{arch::x86_64::*, cmp, mem::size_of}; + +const VECTOR_SIZE: usize = size_of::<__m128i>(); +const VECTOR_ALIGN: usize = VECTOR_SIZE - 1; + +// The number of bytes to loop at in one iteration of memchr/memrchr. +const LOOP_SIZE: usize = 4 * VECTOR_SIZE; + +// The number of bytes to loop at in one iteration of memchr2/memrchr2 and +// memchr3/memrchr3. There was no observable difference between 64 and 32 bytes +// in benchmarks. memchr3 in particular only gets a very slight speed up from +// the loop unrolling. +const LOOP_SIZE2: usize = 2 * VECTOR_SIZE; + +#[target_feature(enable = "sse2")] +pub unsafe fn memchr(n1: u8, haystack: &[u8]) -> Option { + // What follows is a fast SSE2-only algorithm to detect the position of + // `n1` in `haystack` if it exists. From what I know, this is the "classic" + // algorithm. I believe it can be found in places like glibc and Go's + // standard library. It appears to be well known and is elaborated on in + // more detail here: https://gms.tf/stdfind-and-memchr-optimizations.html + // + // While this routine is very long, the basic idea is actually very simple + // and can be expressed straight-forwardly in pseudo code: + // + // needle = (n1 << 15) | (n1 << 14) | ... | (n1 << 1) | n1 + // // Note: shift amount in bytes + // + // while i <= haystack.len() - 16: + // // A 16 byte vector. Each byte in chunk corresponds to a byte in + // // the haystack. + // chunk = haystack[i:i+16] + // // Compare bytes in needle with bytes in chunk. The result is a 16 + // // byte chunk where each byte is 0xFF if the corresponding bytes + // // in needle and chunk were equal, or 0x00 otherwise. + // eqs = cmpeq(needle, chunk) + // // Return a 32 bit integer where the most significant 16 bits + // // are always 0 and the lower 16 bits correspond to whether the + // // most significant bit in the correspond byte in `eqs` is set. + // // In other words, `mask as u16` has bit i set if and only if + // // needle[i] == chunk[i]. + // mask = movemask(eqs) + // + // // Mask is 0 if there is no match, and non-zero otherwise. + // if mask != 0: + // // trailing_zeros tells us the position of the least significant + // // bit that is set. + // return i + trailing_zeros(mask) + // + // // haystack length may not be a multiple of 16, so search the rest. + // while i < haystack.len(): + // if haystack[i] == n1: + // return i + // + // // No match found. + // return NULL + // + // In fact, we could loosely translate the above code to Rust line-for-line + // and it would be a pretty fast algorithm. But, we pull out all the stops + // to go as fast as possible: + // + // 1. We use aligned loads. That is, we do some finagling to make sure our + // primary loop not only proceeds in increments of 16 bytes, but that + // the address of haystack's pointer that we dereference is aligned to + // 16 bytes. 16 is a magic number here because it is the size of SSE2 + // 128-bit vector. (For the AVX2 algorithm, 32 is the magic number.) + // Therefore, to get aligned loads, our pointer's address must be evenly + // divisible by 16. + // 2. Our primary loop proceeds 64 bytes at a time instead of 16. It's + // kind of like loop unrolling, but we combine the equality comparisons + // using a vector OR such that we only need to extract a single mask to + // determine whether a match exists or not. If so, then we do some + // book-keeping to determine the precise location but otherwise mush on. + // 3. We use our "chunk" comparison routine in as many places as possible, + // even if it means using unaligned loads. In particular, if haystack + // starts with an unaligned address, then we do an unaligned load to + // search the first 16 bytes. We then start our primary loop at the + // smallest subsequent aligned address, which will actually overlap with + // previously searched bytes. But we're OK with that. We do a similar + // dance at the end of our primary loop. Finally, to avoid a + // byte-at-a-time loop at the end, we do a final 16 byte unaligned load + // that may overlap with a previous load. This is OK because it converts + // a loop into a small number of very fast vector instructions. + // + // The primary downside of this algorithm is that it's effectively + // completely unsafe. Therefore, we have to be super careful to avoid + // undefined behavior: + // + // 1. We use raw pointers everywhere. Not only does dereferencing a pointer + // require the pointer to be valid, but we actually can't even store the + // address of an invalid pointer (unless it's 1 past the end of + // haystack) without sacrificing performance. + // 2. _mm_loadu_si128 is used when you don't care about alignment, and + // _mm_load_si128 is used when you do care. You cannot use the latter + // on unaligned pointers. + // 3. We make liberal use of debug_assert! to check assumptions. + // 4. We make a concerted effort to stick with pointers instead of indices. + // Indices are nicer because there's less to worry about with them (see + // above about pointer offsets), but I could not get the compiler to + // produce as good of code as what the below produces. In any case, + // pointers are what we really care about here, and alignment is + // expressed a bit more naturally with them. + // + // In general, most of the algorithms in this crate have a similar + // structure to what you see below, so this comment applies fairly well to + // all of them. + + let vn1 = _mm_set1_epi8(n1 as i8); + let len = haystack.len(); + let loop_size = cmp::min(LOOP_SIZE, len); + let start_ptr = haystack.as_ptr(); + let end_ptr = start_ptr.add(haystack.len()); + let mut ptr = start_ptr; + + if haystack.len() < VECTOR_SIZE { + while ptr < end_ptr { + if *ptr == n1 { + return Some(sub(ptr, start_ptr)); + } + ptr = ptr.offset(1); + } + return None; + } + + if let Some(i) = forward_search1(start_ptr, end_ptr, ptr, vn1) { + return Some(i); + } + + ptr = ptr.add(VECTOR_SIZE - (start_ptr as usize & VECTOR_ALIGN)); + debug_assert!(ptr > start_ptr && end_ptr.sub(VECTOR_SIZE) >= start_ptr); + while loop_size == LOOP_SIZE && ptr <= end_ptr.sub(loop_size) { + debug_assert_eq!(0, (ptr as usize) % VECTOR_SIZE); + + let a = _mm_load_si128(ptr as *const __m128i); + let b = _mm_load_si128(ptr.add(VECTOR_SIZE) as *const __m128i); + let c = _mm_load_si128(ptr.add(2 * VECTOR_SIZE) as *const __m128i); + let d = _mm_load_si128(ptr.add(3 * VECTOR_SIZE) as *const __m128i); + let eqa = _mm_cmpeq_epi8(vn1, a); + let eqb = _mm_cmpeq_epi8(vn1, b); + let eqc = _mm_cmpeq_epi8(vn1, c); + let eqd = _mm_cmpeq_epi8(vn1, d); + let or1 = _mm_or_si128(eqa, eqb); + let or2 = _mm_or_si128(eqc, eqd); + let or3 = _mm_or_si128(or1, or2); + if _mm_movemask_epi8(or3) != 0 { + let mut at = sub(ptr, start_ptr); + let mask = _mm_movemask_epi8(eqa); + if mask != 0 { + return Some(at + forward_pos(mask)); + } + + at += VECTOR_SIZE; + let mask = _mm_movemask_epi8(eqb); + if mask != 0 { + return Some(at + forward_pos(mask)); + } + + at += VECTOR_SIZE; + let mask = _mm_movemask_epi8(eqc); + if mask != 0 { + return Some(at + forward_pos(mask)); + } + + at += VECTOR_SIZE; + let mask = _mm_movemask_epi8(eqd); + debug_assert!(mask != 0); + return Some(at + forward_pos(mask)); + } + ptr = ptr.add(loop_size); + } + while ptr <= end_ptr.sub(VECTOR_SIZE) { + debug_assert!(sub(end_ptr, ptr) >= VECTOR_SIZE); + + if let Some(i) = forward_search1(start_ptr, end_ptr, ptr, vn1) { + return Some(i); + } + ptr = ptr.add(VECTOR_SIZE); + } + if ptr < end_ptr { + debug_assert!(sub(end_ptr, ptr) < VECTOR_SIZE); + ptr = ptr.sub(VECTOR_SIZE - sub(end_ptr, ptr)); + debug_assert_eq!(sub(end_ptr, ptr), VECTOR_SIZE); + + return forward_search1(start_ptr, end_ptr, ptr, vn1); + } + None +} + +#[target_feature(enable = "sse2")] +pub unsafe fn memchr2(n1: u8, n2: u8, haystack: &[u8]) -> Option { + let vn1 = _mm_set1_epi8(n1 as i8); + let vn2 = _mm_set1_epi8(n2 as i8); + let len = haystack.len(); + let loop_size = cmp::min(LOOP_SIZE2, len); + let start_ptr = haystack.as_ptr(); + let end_ptr = start_ptr.add(haystack.len()); + let mut ptr = start_ptr; + + if haystack.len() < VECTOR_SIZE { + while ptr < end_ptr { + if *ptr == n1 || *ptr == n2 { + return Some(sub(ptr, start_ptr)); + } + ptr = ptr.offset(1); + } + return None; + } + + if let Some(i) = forward_search2(start_ptr, end_ptr, ptr, vn1, vn2) { + return Some(i); + } + + ptr = ptr.add(VECTOR_SIZE - (start_ptr as usize & VECTOR_ALIGN)); + debug_assert!(ptr > start_ptr && end_ptr.sub(VECTOR_SIZE) >= start_ptr); + while loop_size == LOOP_SIZE2 && ptr <= end_ptr.sub(loop_size) { + debug_assert_eq!(0, (ptr as usize) % VECTOR_SIZE); + + let a = _mm_load_si128(ptr as *const __m128i); + let b = _mm_load_si128(ptr.add(VECTOR_SIZE) as *const __m128i); + let eqa1 = _mm_cmpeq_epi8(vn1, a); + let eqb1 = _mm_cmpeq_epi8(vn1, b); + let eqa2 = _mm_cmpeq_epi8(vn2, a); + let eqb2 = _mm_cmpeq_epi8(vn2, b); + let or1 = _mm_or_si128(eqa1, eqb1); + let or2 = _mm_or_si128(eqa2, eqb2); + let or3 = _mm_or_si128(or1, or2); + if _mm_movemask_epi8(or3) != 0 { + let mut at = sub(ptr, start_ptr); + let mask1 = _mm_movemask_epi8(eqa1); + let mask2 = _mm_movemask_epi8(eqa2); + if mask1 != 0 || mask2 != 0 { + return Some(at + forward_pos2(mask1, mask2)); + } + + at += VECTOR_SIZE; + let mask1 = _mm_movemask_epi8(eqb1); + let mask2 = _mm_movemask_epi8(eqb2); + return Some(at + forward_pos2(mask1, mask2)); + } + ptr = ptr.add(loop_size); + } + while ptr <= end_ptr.sub(VECTOR_SIZE) { + if let Some(i) = forward_search2(start_ptr, end_ptr, ptr, vn1, vn2) { + return Some(i); + } + ptr = ptr.add(VECTOR_SIZE); + } + if ptr < end_ptr { + debug_assert!(sub(end_ptr, ptr) < VECTOR_SIZE); + ptr = ptr.sub(VECTOR_SIZE - sub(end_ptr, ptr)); + debug_assert_eq!(sub(end_ptr, ptr), VECTOR_SIZE); + + return forward_search2(start_ptr, end_ptr, ptr, vn1, vn2); + } + None +} + +#[target_feature(enable = "sse2")] +pub unsafe fn memchr3( + n1: u8, + n2: u8, + n3: u8, + haystack: &[u8], +) -> Option { + let vn1 = _mm_set1_epi8(n1 as i8); + let vn2 = _mm_set1_epi8(n2 as i8); + let vn3 = _mm_set1_epi8(n3 as i8); + let len = haystack.len(); + let loop_size = cmp::min(LOOP_SIZE2, len); + let start_ptr = haystack.as_ptr(); + let end_ptr = start_ptr.add(haystack.len()); + let mut ptr = start_ptr; + + if haystack.len() < VECTOR_SIZE { + while ptr < end_ptr { + if *ptr == n1 || *ptr == n2 || *ptr == n3 { + return Some(sub(ptr, start_ptr)); + } + ptr = ptr.offset(1); + } + return None; + } + + if let Some(i) = forward_search3(start_ptr, end_ptr, ptr, vn1, vn2, vn3) { + return Some(i); + } + + ptr = ptr.add(VECTOR_SIZE - (start_ptr as usize & VECTOR_ALIGN)); + debug_assert!(ptr > start_ptr && end_ptr.sub(VECTOR_SIZE) >= start_ptr); + while loop_size == LOOP_SIZE2 && ptr <= end_ptr.sub(loop_size) { + debug_assert_eq!(0, (ptr as usize) % VECTOR_SIZE); + + let a = _mm_load_si128(ptr as *const __m128i); + let b = _mm_load_si128(ptr.add(VECTOR_SIZE) as *const __m128i); + let eqa1 = _mm_cmpeq_epi8(vn1, a); + let eqb1 = _mm_cmpeq_epi8(vn1, b); + let eqa2 = _mm_cmpeq_epi8(vn2, a); + let eqb2 = _mm_cmpeq_epi8(vn2, b); + let eqa3 = _mm_cmpeq_epi8(vn3, a); + let eqb3 = _mm_cmpeq_epi8(vn3, b); + let or1 = _mm_or_si128(eqa1, eqb1); + let or2 = _mm_or_si128(eqa2, eqb2); + let or3 = _mm_or_si128(eqa3, eqb3); + let or4 = _mm_or_si128(or1, or2); + let or5 = _mm_or_si128(or3, or4); + if _mm_movemask_epi8(or5) != 0 { + let mut at = sub(ptr, start_ptr); + let mask1 = _mm_movemask_epi8(eqa1); + let mask2 = _mm_movemask_epi8(eqa2); + let mask3 = _mm_movemask_epi8(eqa3); + if mask1 != 0 || mask2 != 0 || mask3 != 0 { + return Some(at + forward_pos3(mask1, mask2, mask3)); + } + + at += VECTOR_SIZE; + let mask1 = _mm_movemask_epi8(eqb1); + let mask2 = _mm_movemask_epi8(eqb2); + let mask3 = _mm_movemask_epi8(eqb3); + return Some(at + forward_pos3(mask1, mask2, mask3)); + } + ptr = ptr.add(loop_size); + } + while ptr <= end_ptr.sub(VECTOR_SIZE) { + if let Some(i) = + forward_search3(start_ptr, end_ptr, ptr, vn1, vn2, vn3) + { + return Some(i); + } + ptr = ptr.add(VECTOR_SIZE); + } + if ptr < end_ptr { + debug_assert!(sub(end_ptr, ptr) < VECTOR_SIZE); + ptr = ptr.sub(VECTOR_SIZE - sub(end_ptr, ptr)); + debug_assert_eq!(sub(end_ptr, ptr), VECTOR_SIZE); + + return forward_search3(start_ptr, end_ptr, ptr, vn1, vn2, vn3); + } + None +} + +#[target_feature(enable = "sse2")] +pub unsafe fn memrchr(n1: u8, haystack: &[u8]) -> Option { + let vn1 = _mm_set1_epi8(n1 as i8); + let len = haystack.len(); + let loop_size = cmp::min(LOOP_SIZE, len); + let start_ptr = haystack.as_ptr(); + let end_ptr = start_ptr.add(haystack.len()); + let mut ptr = end_ptr; + + if haystack.len() < VECTOR_SIZE { + while ptr > start_ptr { + ptr = ptr.offset(-1); + if *ptr == n1 { + return Some(sub(ptr, start_ptr)); + } + } + return None; + } + + ptr = ptr.sub(VECTOR_SIZE); + if let Some(i) = reverse_search1(start_ptr, end_ptr, ptr, vn1) { + return Some(i); + } + + ptr = (end_ptr as usize & !VECTOR_ALIGN) as *const u8; + debug_assert!(start_ptr <= ptr && ptr <= end_ptr); + while loop_size == LOOP_SIZE && ptr >= start_ptr.add(loop_size) { + debug_assert_eq!(0, (ptr as usize) % VECTOR_SIZE); + + ptr = ptr.sub(loop_size); + let a = _mm_load_si128(ptr as *const __m128i); + let b = _mm_load_si128(ptr.add(VECTOR_SIZE) as *const __m128i); + let c = _mm_load_si128(ptr.add(2 * VECTOR_SIZE) as *const __m128i); + let d = _mm_load_si128(ptr.add(3 * VECTOR_SIZE) as *const __m128i); + let eqa = _mm_cmpeq_epi8(vn1, a); + let eqb = _mm_cmpeq_epi8(vn1, b); + let eqc = _mm_cmpeq_epi8(vn1, c); + let eqd = _mm_cmpeq_epi8(vn1, d); + let or1 = _mm_or_si128(eqa, eqb); + let or2 = _mm_or_si128(eqc, eqd); + let or3 = _mm_or_si128(or1, or2); + if _mm_movemask_epi8(or3) != 0 { + let mut at = sub(ptr.add(3 * VECTOR_SIZE), start_ptr); + let mask = _mm_movemask_epi8(eqd); + if mask != 0 { + return Some(at + reverse_pos(mask)); + } + + at -= VECTOR_SIZE; + let mask = _mm_movemask_epi8(eqc); + if mask != 0 { + return Some(at + reverse_pos(mask)); + } + + at -= VECTOR_SIZE; + let mask = _mm_movemask_epi8(eqb); + if mask != 0 { + return Some(at + reverse_pos(mask)); + } + + at -= VECTOR_SIZE; + let mask = _mm_movemask_epi8(eqa); + debug_assert!(mask != 0); + return Some(at + reverse_pos(mask)); + } + } + while ptr >= start_ptr.add(VECTOR_SIZE) { + ptr = ptr.sub(VECTOR_SIZE); + if let Some(i) = reverse_search1(start_ptr, end_ptr, ptr, vn1) { + return Some(i); + } + } + if ptr > start_ptr { + debug_assert!(sub(ptr, start_ptr) < VECTOR_SIZE); + return reverse_search1(start_ptr, end_ptr, start_ptr, vn1); + } + None +} + +#[target_feature(enable = "sse2")] +pub unsafe fn memrchr2(n1: u8, n2: u8, haystack: &[u8]) -> Option { + let vn1 = _mm_set1_epi8(n1 as i8); + let vn2 = _mm_set1_epi8(n2 as i8); + let len = haystack.len(); + let loop_size = cmp::min(LOOP_SIZE2, len); + let start_ptr = haystack.as_ptr(); + let end_ptr = start_ptr.add(haystack.len()); + let mut ptr = end_ptr; + + if haystack.len() < VECTOR_SIZE { + while ptr > start_ptr { + ptr = ptr.offset(-1); + if *ptr == n1 || *ptr == n2 { + return Some(sub(ptr, start_ptr)); + } + } + return None; + } + + ptr = ptr.sub(VECTOR_SIZE); + if let Some(i) = reverse_search2(start_ptr, end_ptr, ptr, vn1, vn2) { + return Some(i); + } + + ptr = (end_ptr as usize & !VECTOR_ALIGN) as *const u8; + debug_assert!(start_ptr <= ptr && ptr <= end_ptr); + while loop_size == LOOP_SIZE2 && ptr >= start_ptr.add(loop_size) { + debug_assert_eq!(0, (ptr as usize) % VECTOR_SIZE); + + ptr = ptr.sub(loop_size); + let a = _mm_load_si128(ptr as *const __m128i); + let b = _mm_load_si128(ptr.add(VECTOR_SIZE) as *const __m128i); + let eqa1 = _mm_cmpeq_epi8(vn1, a); + let eqb1 = _mm_cmpeq_epi8(vn1, b); + let eqa2 = _mm_cmpeq_epi8(vn2, a); + let eqb2 = _mm_cmpeq_epi8(vn2, b); + let or1 = _mm_or_si128(eqa1, eqb1); + let or2 = _mm_or_si128(eqa2, eqb2); + let or3 = _mm_or_si128(or1, or2); + if _mm_movemask_epi8(or3) != 0 { + let mut at = sub(ptr.add(VECTOR_SIZE), start_ptr); + let mask1 = _mm_movemask_epi8(eqb1); + let mask2 = _mm_movemask_epi8(eqb2); + if mask1 != 0 || mask2 != 0 { + return Some(at + reverse_pos2(mask1, mask2)); + } + + at -= VECTOR_SIZE; + let mask1 = _mm_movemask_epi8(eqa1); + let mask2 = _mm_movemask_epi8(eqa2); + return Some(at + reverse_pos2(mask1, mask2)); + } + } + while ptr >= start_ptr.add(VECTOR_SIZE) { + ptr = ptr.sub(VECTOR_SIZE); + if let Some(i) = reverse_search2(start_ptr, end_ptr, ptr, vn1, vn2) { + return Some(i); + } + } + if ptr > start_ptr { + debug_assert!(sub(ptr, start_ptr) < VECTOR_SIZE); + return reverse_search2(start_ptr, end_ptr, start_ptr, vn1, vn2); + } + None +} + +#[target_feature(enable = "sse2")] +pub unsafe fn memrchr3( + n1: u8, + n2: u8, + n3: u8, + haystack: &[u8], +) -> Option { + let vn1 = _mm_set1_epi8(n1 as i8); + let vn2 = _mm_set1_epi8(n2 as i8); + let vn3 = _mm_set1_epi8(n3 as i8); + let len = haystack.len(); + let loop_size = cmp::min(LOOP_SIZE2, len); + let start_ptr = haystack.as_ptr(); + let end_ptr = start_ptr.add(haystack.len()); + let mut ptr = end_ptr; + + if haystack.len() < VECTOR_SIZE { + while ptr > start_ptr { + ptr = ptr.offset(-1); + if *ptr == n1 || *ptr == n2 || *ptr == n3 { + return Some(sub(ptr, start_ptr)); + } + } + return None; + } + + ptr = ptr.sub(VECTOR_SIZE); + if let Some(i) = reverse_search3(start_ptr, end_ptr, ptr, vn1, vn2, vn3) { + return Some(i); + } + + ptr = (end_ptr as usize & !VECTOR_ALIGN) as *const u8; + debug_assert!(start_ptr <= ptr && ptr <= end_ptr); + while loop_size == LOOP_SIZE2 && ptr >= start_ptr.add(loop_size) { + debug_assert_eq!(0, (ptr as usize) % VECTOR_SIZE); + + ptr = ptr.sub(loop_size); + let a = _mm_load_si128(ptr as *const __m128i); + let b = _mm_load_si128(ptr.add(VECTOR_SIZE) as *const __m128i); + let eqa1 = _mm_cmpeq_epi8(vn1, a); + let eqb1 = _mm_cmpeq_epi8(vn1, b); + let eqa2 = _mm_cmpeq_epi8(vn2, a); + let eqb2 = _mm_cmpeq_epi8(vn2, b); + let eqa3 = _mm_cmpeq_epi8(vn3, a); + let eqb3 = _mm_cmpeq_epi8(vn3, b); + let or1 = _mm_or_si128(eqa1, eqb1); + let or2 = _mm_or_si128(eqa2, eqb2); + let or3 = _mm_or_si128(eqa3, eqb3); + let or4 = _mm_or_si128(or1, or2); + let or5 = _mm_or_si128(or3, or4); + if _mm_movemask_epi8(or5) != 0 { + let mut at = sub(ptr.add(VECTOR_SIZE), start_ptr); + let mask1 = _mm_movemask_epi8(eqb1); + let mask2 = _mm_movemask_epi8(eqb2); + let mask3 = _mm_movemask_epi8(eqb3); + if mask1 != 0 || mask2 != 0 || mask3 != 0 { + return Some(at + reverse_pos3(mask1, mask2, mask3)); + } + + at -= VECTOR_SIZE; + let mask1 = _mm_movemask_epi8(eqa1); + let mask2 = _mm_movemask_epi8(eqa2); + let mask3 = _mm_movemask_epi8(eqa3); + return Some(at + reverse_pos3(mask1, mask2, mask3)); + } + } + while ptr >= start_ptr.add(VECTOR_SIZE) { + ptr = ptr.sub(VECTOR_SIZE); + if let Some(i) = + reverse_search3(start_ptr, end_ptr, ptr, vn1, vn2, vn3) + { + return Some(i); + } + } + if ptr > start_ptr { + debug_assert!(sub(ptr, start_ptr) < VECTOR_SIZE); + return reverse_search3(start_ptr, end_ptr, start_ptr, vn1, vn2, vn3); + } + None +} + +#[target_feature(enable = "sse2")] +pub unsafe fn forward_search1( + start_ptr: *const u8, + end_ptr: *const u8, + ptr: *const u8, + vn1: __m128i, +) -> Option { + debug_assert!(sub(end_ptr, start_ptr) >= VECTOR_SIZE); + debug_assert!(start_ptr <= ptr); + debug_assert!(ptr <= end_ptr.sub(VECTOR_SIZE)); + + let chunk = _mm_loadu_si128(ptr as *const __m128i); + let mask = _mm_movemask_epi8(_mm_cmpeq_epi8(chunk, vn1)); + if mask != 0 { + Some(sub(ptr, start_ptr) + forward_pos(mask)) + } else { + None + } +} + +#[target_feature(enable = "sse2")] +unsafe fn forward_search2( + start_ptr: *const u8, + end_ptr: *const u8, + ptr: *const u8, + vn1: __m128i, + vn2: __m128i, +) -> Option { + debug_assert!(sub(end_ptr, start_ptr) >= VECTOR_SIZE); + debug_assert!(start_ptr <= ptr); + debug_assert!(ptr <= end_ptr.sub(VECTOR_SIZE)); + + let chunk = _mm_loadu_si128(ptr as *const __m128i); + let eq1 = _mm_cmpeq_epi8(chunk, vn1); + let eq2 = _mm_cmpeq_epi8(chunk, vn2); + if _mm_movemask_epi8(_mm_or_si128(eq1, eq2)) != 0 { + let mask1 = _mm_movemask_epi8(eq1); + let mask2 = _mm_movemask_epi8(eq2); + Some(sub(ptr, start_ptr) + forward_pos2(mask1, mask2)) + } else { + None + } +} + +#[target_feature(enable = "sse2")] +pub unsafe fn forward_search3( + start_ptr: *const u8, + end_ptr: *const u8, + ptr: *const u8, + vn1: __m128i, + vn2: __m128i, + vn3: __m128i, +) -> Option { + debug_assert!(sub(end_ptr, start_ptr) >= VECTOR_SIZE); + debug_assert!(start_ptr <= ptr); + debug_assert!(ptr <= end_ptr.sub(VECTOR_SIZE)); + + let chunk = _mm_loadu_si128(ptr as *const __m128i); + let eq1 = _mm_cmpeq_epi8(chunk, vn1); + let eq2 = _mm_cmpeq_epi8(chunk, vn2); + let eq3 = _mm_cmpeq_epi8(chunk, vn3); + let or = _mm_or_si128(eq1, eq2); + if _mm_movemask_epi8(_mm_or_si128(or, eq3)) != 0 { + let mask1 = _mm_movemask_epi8(eq1); + let mask2 = _mm_movemask_epi8(eq2); + let mask3 = _mm_movemask_epi8(eq3); + Some(sub(ptr, start_ptr) + forward_pos3(mask1, mask2, mask3)) + } else { + None + } +} + +#[target_feature(enable = "sse2")] +unsafe fn reverse_search1( + start_ptr: *const u8, + end_ptr: *const u8, + ptr: *const u8, + vn1: __m128i, +) -> Option { + debug_assert!(sub(end_ptr, start_ptr) >= VECTOR_SIZE); + debug_assert!(start_ptr <= ptr); + debug_assert!(ptr <= end_ptr.sub(VECTOR_SIZE)); + + let chunk = _mm_loadu_si128(ptr as *const __m128i); + let mask = _mm_movemask_epi8(_mm_cmpeq_epi8(vn1, chunk)); + if mask != 0 { + Some(sub(ptr, start_ptr) + reverse_pos(mask)) + } else { + None + } +} + +#[target_feature(enable = "sse2")] +unsafe fn reverse_search2( + start_ptr: *const u8, + end_ptr: *const u8, + ptr: *const u8, + vn1: __m128i, + vn2: __m128i, +) -> Option { + debug_assert!(sub(end_ptr, start_ptr) >= VECTOR_SIZE); + debug_assert!(start_ptr <= ptr); + debug_assert!(ptr <= end_ptr.sub(VECTOR_SIZE)); + + let chunk = _mm_loadu_si128(ptr as *const __m128i); + let eq1 = _mm_cmpeq_epi8(chunk, vn1); + let eq2 = _mm_cmpeq_epi8(chunk, vn2); + if _mm_movemask_epi8(_mm_or_si128(eq1, eq2)) != 0 { + let mask1 = _mm_movemask_epi8(eq1); + let mask2 = _mm_movemask_epi8(eq2); + Some(sub(ptr, start_ptr) + reverse_pos2(mask1, mask2)) + } else { + None + } +} + +#[target_feature(enable = "sse2")] +unsafe fn reverse_search3( + start_ptr: *const u8, + end_ptr: *const u8, + ptr: *const u8, + vn1: __m128i, + vn2: __m128i, + vn3: __m128i, +) -> Option { + debug_assert!(sub(end_ptr, start_ptr) >= VECTOR_SIZE); + debug_assert!(start_ptr <= ptr); + debug_assert!(ptr <= end_ptr.sub(VECTOR_SIZE)); + + let chunk = _mm_loadu_si128(ptr as *const __m128i); + let eq1 = _mm_cmpeq_epi8(chunk, vn1); + let eq2 = _mm_cmpeq_epi8(chunk, vn2); + let eq3 = _mm_cmpeq_epi8(chunk, vn3); + let or = _mm_or_si128(eq1, eq2); + if _mm_movemask_epi8(_mm_or_si128(or, eq3)) != 0 { + let mask1 = _mm_movemask_epi8(eq1); + let mask2 = _mm_movemask_epi8(eq2); + let mask3 = _mm_movemask_epi8(eq3); + Some(sub(ptr, start_ptr) + reverse_pos3(mask1, mask2, mask3)) + } else { + None + } +} + +/// Compute the position of the first matching byte from the given mask. The +/// position returned is always in the range [0, 15]. +/// +/// The mask given is expected to be the result of _mm_movemask_epi8. +fn forward_pos(mask: i32) -> usize { + // We are dealing with little endian here, where the most significant byte + // is at a higher address. That means the least significant bit that is set + // corresponds to the position of our first matching byte. That position + // corresponds to the number of zeros after the least significant bit. + mask.trailing_zeros() as usize +} + +/// Compute the position of the first matching byte from the given masks. The +/// position returned is always in the range [0, 15]. Each mask corresponds to +/// the equality comparison of a single byte. +/// +/// The masks given are expected to be the result of _mm_movemask_epi8, where +/// at least one of the masks is non-zero (i.e., indicates a match). +fn forward_pos2(mask1: i32, mask2: i32) -> usize { + debug_assert!(mask1 != 0 || mask2 != 0); + + forward_pos(mask1 | mask2) +} + +/// Compute the position of the first matching byte from the given masks. The +/// position returned is always in the range [0, 15]. Each mask corresponds to +/// the equality comparison of a single byte. +/// +/// The masks given are expected to be the result of _mm_movemask_epi8, where +/// at least one of the masks is non-zero (i.e., indicates a match). +fn forward_pos3(mask1: i32, mask2: i32, mask3: i32) -> usize { + debug_assert!(mask1 != 0 || mask2 != 0 || mask3 != 0); + + forward_pos(mask1 | mask2 | mask3) +} + +/// Compute the position of the last matching byte from the given mask. The +/// position returned is always in the range [0, 15]. +/// +/// The mask given is expected to be the result of _mm_movemask_epi8. +fn reverse_pos(mask: i32) -> usize { + // We are dealing with little endian here, where the most significant byte + // is at a higher address. That means the most significant bit that is set + // corresponds to the position of our last matching byte. The position from + // the end of the mask is therefore the number of leading zeros in a 16 + // bit integer, and the position from the start of the mask is therefore + // 16 - (leading zeros) - 1. + VECTOR_SIZE - (mask as u16).leading_zeros() as usize - 1 +} + +/// Compute the position of the last matching byte from the given masks. The +/// position returned is always in the range [0, 15]. Each mask corresponds to +/// the equality comparison of a single byte. +/// +/// The masks given are expected to be the result of _mm_movemask_epi8, where +/// at least one of the masks is non-zero (i.e., indicates a match). +fn reverse_pos2(mask1: i32, mask2: i32) -> usize { + debug_assert!(mask1 != 0 || mask2 != 0); + + reverse_pos(mask1 | mask2) +} + +/// Compute the position of the last matching byte from the given masks. The +/// position returned is always in the range [0, 15]. Each mask corresponds to +/// the equality comparison of a single byte. +/// +/// The masks given are expected to be the result of _mm_movemask_epi8, where +/// at least one of the masks is non-zero (i.e., indicates a match). +fn reverse_pos3(mask1: i32, mask2: i32, mask3: i32) -> usize { + debug_assert!(mask1 != 0 || mask2 != 0 || mask3 != 0); + + reverse_pos(mask1 | mask2 | mask3) +} + +/// Subtract `b` from `a` and return the difference. `a` should be greater than +/// or equal to `b`. +fn sub(a: *const u8, b: *const u8) -> usize { + debug_assert!(a >= b); + (a as usize) - (b as usize) +} diff -Nru temporalio-1.3.0/vendor/memchr/src/memchr/x86/sse42.rs temporalio-1.3.0/vendor/memchr/src/memchr/x86/sse42.rs --- temporalio-1.3.0/vendor/memchr/src/memchr/x86/sse42.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/memchr/x86/sse42.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,72 @@ +// This code is unused. PCMPESTRI is gratuitously slow. I imagine it might +// start winning with a hypothetical memchr4 (or greater). This technique might +// also be good for exposing searches over ranges of bytes, but that departs +// from the standard memchr API, so it's not clear whether we actually want +// that or not. +// +// N.B. PCMPISTRI appears to be about twice as fast as PCMPESTRI, which is kind +// of neat. Unfortunately, UTF-8 strings can contain NUL bytes, which means +// I don't see a way of effectively using PCMPISTRI unless there's some fast +// way to replace zero bytes with a byte that is not not a needle byte. + +use core::{arch::x86_64::*, mem::size_of}; + +use x86::sse2; + +const VECTOR_SIZE: usize = size_of::<__m128i>(); +const CONTROL_ANY: i32 = _SIDD_UBYTE_OPS + | _SIDD_CMP_EQUAL_ANY + | _SIDD_POSITIVE_POLARITY + | _SIDD_LEAST_SIGNIFICANT; + +#[target_feature(enable = "sse4.2")] +pub unsafe fn memchr3( + n1: u8, + n2: u8, + n3: u8, + haystack: &[u8], +) -> Option { + let vn1 = _mm_set1_epi8(n1 as i8); + let vn2 = _mm_set1_epi8(n2 as i8); + let vn3 = _mm_set1_epi8(n3 as i8); + let vn = _mm_setr_epi8( + n1 as i8, n2 as i8, n3 as i8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ); + let len = haystack.len(); + let start_ptr = haystack.as_ptr(); + let end_ptr = haystack[haystack.len()..].as_ptr(); + let mut ptr = start_ptr; + + if haystack.len() < VECTOR_SIZE { + while ptr < end_ptr { + if *ptr == n1 || *ptr == n2 || *ptr == n3 { + return Some(sub(ptr, start_ptr)); + } + ptr = ptr.offset(1); + } + return None; + } + while ptr <= end_ptr.sub(VECTOR_SIZE) { + let chunk = _mm_loadu_si128(ptr as *const __m128i); + let res = _mm_cmpestri(vn, 3, chunk, 16, CONTROL_ANY); + if res < 16 { + return Some(sub(ptr, start_ptr) + res as usize); + } + ptr = ptr.add(VECTOR_SIZE); + } + if ptr < end_ptr { + debug_assert!(sub(end_ptr, ptr) < VECTOR_SIZE); + ptr = ptr.sub(VECTOR_SIZE - sub(end_ptr, ptr)); + debug_assert_eq!(sub(end_ptr, ptr), VECTOR_SIZE); + + return sse2::forward_search3(start_ptr, end_ptr, ptr, vn1, vn2, vn3); + } + None +} + +/// Subtract `b` from `a` and return the difference. `a` should be greater than +/// or equal to `b`. +fn sub(a: *const u8, b: *const u8) -> usize { + debug_assert!(a >= b); + (a as usize) - (b as usize) +} diff -Nru temporalio-1.3.0/vendor/memchr/src/memchr.rs temporalio-1.3.0/vendor/memchr/src/memchr.rs --- temporalio-1.3.0/vendor/memchr/src/memchr.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/memchr.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,903 +0,0 @@ -use core::iter::Rev; - -use crate::arch::generic::memchr as generic; - -/// Search for the first occurrence of a byte in a slice. -/// -/// This returns the index corresponding to the first occurrence of `needle` in -/// `haystack`, or `None` if one is not found. If an index is returned, it is -/// guaranteed to be less than `haystack.len()`. -/// -/// While this is semantically the same as something like -/// `haystack.iter().position(|&b| b == needle)`, this routine will attempt to -/// use highly optimized vector operations that can be an order of magnitude -/// faster (or more). -/// -/// # Example -/// -/// This shows how to find the first position of a byte in a byte string. -/// -/// ``` -/// use memchr::memchr; -/// -/// let haystack = b"the quick brown fox"; -/// assert_eq!(memchr(b'k', haystack), Some(8)); -/// ``` -#[inline] -pub fn memchr(needle: u8, haystack: &[u8]) -> Option { - // SAFETY: memchr_raw, when a match is found, always returns a valid - // pointer between start and end. - unsafe { - generic::search_slice_with_raw(haystack, |start, end| { - memchr_raw(needle, start, end) - }) - } -} - -/// Search for the last occurrence of a byte in a slice. -/// -/// This returns the index corresponding to the last occurrence of `needle` in -/// `haystack`, or `None` if one is not found. If an index is returned, it is -/// guaranteed to be less than `haystack.len()`. -/// -/// While this is semantically the same as something like -/// `haystack.iter().rposition(|&b| b == needle)`, this routine will attempt to -/// use highly optimized vector operations that can be an order of magnitude -/// faster (or more). -/// -/// # Example -/// -/// This shows how to find the last position of a byte in a byte string. -/// -/// ``` -/// use memchr::memrchr; -/// -/// let haystack = b"the quick brown fox"; -/// assert_eq!(memrchr(b'o', haystack), Some(17)); -/// ``` -#[inline] -pub fn memrchr(needle: u8, haystack: &[u8]) -> Option { - // SAFETY: memrchr_raw, when a match is found, always returns a valid - // pointer between start and end. - unsafe { - generic::search_slice_with_raw(haystack, |start, end| { - memrchr_raw(needle, start, end) - }) - } -} - -/// Search for the first occurrence of two possible bytes in a haystack. -/// -/// This returns the index corresponding to the first occurrence of one of the -/// needle bytes in `haystack`, or `None` if one is not found. If an index is -/// returned, it is guaranteed to be less than `haystack.len()`. -/// -/// While this is semantically the same as something like -/// `haystack.iter().position(|&b| b == needle1 || b == needle2)`, this routine -/// will attempt to use highly optimized vector operations that can be an order -/// of magnitude faster (or more). -/// -/// # Example -/// -/// This shows how to find the first position of one of two possible bytes in a -/// haystack. -/// -/// ``` -/// use memchr::memchr2; -/// -/// let haystack = b"the quick brown fox"; -/// assert_eq!(memchr2(b'k', b'q', haystack), Some(4)); -/// ``` -#[inline] -pub fn memchr2(needle1: u8, needle2: u8, haystack: &[u8]) -> Option { - // SAFETY: memchr2_raw, when a match is found, always returns a valid - // pointer between start and end. - unsafe { - generic::search_slice_with_raw(haystack, |start, end| { - memchr2_raw(needle1, needle2, start, end) - }) - } -} - -/// Search for the last occurrence of two possible bytes in a haystack. -/// -/// This returns the index corresponding to the last occurrence of one of the -/// needle bytes in `haystack`, or `None` if one is not found. If an index is -/// returned, it is guaranteed to be less than `haystack.len()`. -/// -/// While this is semantically the same as something like -/// `haystack.iter().rposition(|&b| b == needle1 || b == needle2)`, this -/// routine will attempt to use highly optimized vector operations that can be -/// an order of magnitude faster (or more). -/// -/// # Example -/// -/// This shows how to find the last position of one of two possible bytes in a -/// haystack. -/// -/// ``` -/// use memchr::memrchr2; -/// -/// let haystack = b"the quick brown fox"; -/// assert_eq!(memrchr2(b'k', b'o', haystack), Some(17)); -/// ``` -#[inline] -pub fn memrchr2(needle1: u8, needle2: u8, haystack: &[u8]) -> Option { - // SAFETY: memrchr2_raw, when a match is found, always returns a valid - // pointer between start and end. - unsafe { - generic::search_slice_with_raw(haystack, |start, end| { - memrchr2_raw(needle1, needle2, start, end) - }) - } -} - -/// Search for the first occurrence of three possible bytes in a haystack. -/// -/// This returns the index corresponding to the first occurrence of one of the -/// needle bytes in `haystack`, or `None` if one is not found. If an index is -/// returned, it is guaranteed to be less than `haystack.len()`. -/// -/// While this is semantically the same as something like -/// `haystack.iter().position(|&b| b == needle1 || b == needle2 || b == needle3)`, -/// this routine will attempt to use highly optimized vector operations that -/// can be an order of magnitude faster (or more). -/// -/// # Example -/// -/// This shows how to find the first position of one of three possible bytes in -/// a haystack. -/// -/// ``` -/// use memchr::memchr3; -/// -/// let haystack = b"the quick brown fox"; -/// assert_eq!(memchr3(b'k', b'q', b'u', haystack), Some(4)); -/// ``` -#[inline] -pub fn memchr3( - needle1: u8, - needle2: u8, - needle3: u8, - haystack: &[u8], -) -> Option { - // SAFETY: memchr3_raw, when a match is found, always returns a valid - // pointer between start and end. - unsafe { - generic::search_slice_with_raw(haystack, |start, end| { - memchr3_raw(needle1, needle2, needle3, start, end) - }) - } -} - -/// Search for the last occurrence of three possible bytes in a haystack. -/// -/// This returns the index corresponding to the last occurrence of one of the -/// needle bytes in `haystack`, or `None` if one is not found. If an index is -/// returned, it is guaranteed to be less than `haystack.len()`. -/// -/// While this is semantically the same as something like -/// `haystack.iter().rposition(|&b| b == needle1 || b == needle2 || b == needle3)`, -/// this routine will attempt to use highly optimized vector operations that -/// can be an order of magnitude faster (or more). -/// -/// # Example -/// -/// This shows how to find the last position of one of three possible bytes in -/// a haystack. -/// -/// ``` -/// use memchr::memrchr3; -/// -/// let haystack = b"the quick brown fox"; -/// assert_eq!(memrchr3(b'k', b'o', b'n', haystack), Some(17)); -/// ``` -#[inline] -pub fn memrchr3( - needle1: u8, - needle2: u8, - needle3: u8, - haystack: &[u8], -) -> Option { - // SAFETY: memrchr3_raw, when a match is found, always returns a valid - // pointer between start and end. - unsafe { - generic::search_slice_with_raw(haystack, |start, end| { - memrchr3_raw(needle1, needle2, needle3, start, end) - }) - } -} - -/// Returns an iterator over all occurrences of the needle in a haystack. -/// -/// The iterator returned implements `DoubleEndedIterator`. This means it -/// can also be used to find occurrences in reverse order. -#[inline] -pub fn memchr_iter<'h>(needle: u8, haystack: &'h [u8]) -> Memchr<'h> { - Memchr::new(needle, haystack) -} - -/// Returns an iterator over all occurrences of the needle in a haystack, in -/// reverse. -#[inline] -pub fn memrchr_iter(needle: u8, haystack: &[u8]) -> Rev> { - Memchr::new(needle, haystack).rev() -} - -/// Returns an iterator over all occurrences of the needles in a haystack. -/// -/// The iterator returned implements `DoubleEndedIterator`. This means it -/// can also be used to find occurrences in reverse order. -#[inline] -pub fn memchr2_iter<'h>( - needle1: u8, - needle2: u8, - haystack: &'h [u8], -) -> Memchr2<'h> { - Memchr2::new(needle1, needle2, haystack) -} - -/// Returns an iterator over all occurrences of the needles in a haystack, in -/// reverse. -#[inline] -pub fn memrchr2_iter( - needle1: u8, - needle2: u8, - haystack: &[u8], -) -> Rev> { - Memchr2::new(needle1, needle2, haystack).rev() -} - -/// Returns an iterator over all occurrences of the needles in a haystack. -/// -/// The iterator returned implements `DoubleEndedIterator`. This means it -/// can also be used to find occurrences in reverse order. -#[inline] -pub fn memchr3_iter<'h>( - needle1: u8, - needle2: u8, - needle3: u8, - haystack: &'h [u8], -) -> Memchr3<'h> { - Memchr3::new(needle1, needle2, needle3, haystack) -} - -/// Returns an iterator over all occurrences of the needles in a haystack, in -/// reverse. -#[inline] -pub fn memrchr3_iter( - needle1: u8, - needle2: u8, - needle3: u8, - haystack: &[u8], -) -> Rev> { - Memchr3::new(needle1, needle2, needle3, haystack).rev() -} - -/// An iterator over all occurrences of a single byte in a haystack. -/// -/// This iterator implements `DoubleEndedIterator`, which means it can also be -/// used to find occurrences in reverse order. -/// -/// This iterator is created by the [`memchr_iter`] or `[memrchr_iter`] -/// functions. It can also be created with the [`Memchr::new`] method. -/// -/// The lifetime parameter `'h` refers to the lifetime of the haystack being -/// searched. -#[derive(Clone, Debug)] -pub struct Memchr<'h> { - needle1: u8, - it: crate::arch::generic::memchr::Iter<'h>, -} - -impl<'h> Memchr<'h> { - /// Returns an iterator over all occurrences of the needle byte in the - /// given haystack. - /// - /// The iterator returned implements `DoubleEndedIterator`. This means it - /// can also be used to find occurrences in reverse order. - #[inline] - pub fn new(needle1: u8, haystack: &'h [u8]) -> Memchr<'h> { - Memchr { - needle1, - it: crate::arch::generic::memchr::Iter::new(haystack), - } - } -} - -impl<'h> Iterator for Memchr<'h> { - type Item = usize; - - #[inline] - fn next(&mut self) -> Option { - // SAFETY: All of our implementations of memchr ensure that any - // pointers returns will fall within the start and end bounds, and this - // upholds the safety contract of `self.it.next`. - unsafe { - // NOTE: I attempted to define an enum of previously created - // searchers and then switch on those here instead of just - // calling `memchr_raw` (or `One::new(..).find_raw(..)`). But - // that turned out to have a fair bit of extra overhead when - // searching very small haystacks. - self.it.next(|s, e| memchr_raw(self.needle1, s, e)) - } - } - - #[inline] - fn count(self) -> usize { - self.it.count(|s, e| { - // SAFETY: We rely on our generic iterator to return valid start - // and end pointers. - unsafe { count_raw(self.needle1, s, e) } - }) - } - - #[inline] - fn size_hint(&self) -> (usize, Option) { - self.it.size_hint() - } -} - -impl<'h> DoubleEndedIterator for Memchr<'h> { - #[inline] - fn next_back(&mut self) -> Option { - // SAFETY: All of our implementations of memchr ensure that any - // pointers returns will fall within the start and end bounds, and this - // upholds the safety contract of `self.it.next_back`. - unsafe { self.it.next_back(|s, e| memrchr_raw(self.needle1, s, e)) } - } -} - -impl<'h> core::iter::FusedIterator for Memchr<'h> {} - -/// An iterator over all occurrences of two possible bytes in a haystack. -/// -/// This iterator implements `DoubleEndedIterator`, which means it can also be -/// used to find occurrences in reverse order. -/// -/// This iterator is created by the [`memchr2_iter`] or `[memrchr2_iter`] -/// functions. It can also be created with the [`Memchr2::new`] method. -/// -/// The lifetime parameter `'h` refers to the lifetime of the haystack being -/// searched. -#[derive(Clone, Debug)] -pub struct Memchr2<'h> { - needle1: u8, - needle2: u8, - it: crate::arch::generic::memchr::Iter<'h>, -} - -impl<'h> Memchr2<'h> { - /// Returns an iterator over all occurrences of the needle bytes in the - /// given haystack. - /// - /// The iterator returned implements `DoubleEndedIterator`. This means it - /// can also be used to find occurrences in reverse order. - #[inline] - pub fn new(needle1: u8, needle2: u8, haystack: &'h [u8]) -> Memchr2<'h> { - Memchr2 { - needle1, - needle2, - it: crate::arch::generic::memchr::Iter::new(haystack), - } - } -} - -impl<'h> Iterator for Memchr2<'h> { - type Item = usize; - - #[inline] - fn next(&mut self) -> Option { - // SAFETY: All of our implementations of memchr ensure that any - // pointers returns will fall within the start and end bounds, and this - // upholds the safety contract of `self.it.next`. - unsafe { - self.it.next(|s, e| memchr2_raw(self.needle1, self.needle2, s, e)) - } - } - - #[inline] - fn size_hint(&self) -> (usize, Option) { - self.it.size_hint() - } -} - -impl<'h> DoubleEndedIterator for Memchr2<'h> { - #[inline] - fn next_back(&mut self) -> Option { - // SAFETY: All of our implementations of memchr ensure that any - // pointers returns will fall within the start and end bounds, and this - // upholds the safety contract of `self.it.next_back`. - unsafe { - self.it.next_back(|s, e| { - memrchr2_raw(self.needle1, self.needle2, s, e) - }) - } - } -} - -impl<'h> core::iter::FusedIterator for Memchr2<'h> {} - -/// An iterator over all occurrences of three possible bytes in a haystack. -/// -/// This iterator implements `DoubleEndedIterator`, which means it can also be -/// used to find occurrences in reverse order. -/// -/// This iterator is created by the [`memchr2_iter`] or `[memrchr2_iter`] -/// functions. It can also be created with the [`Memchr3::new`] method. -/// -/// The lifetime parameter `'h` refers to the lifetime of the haystack being -/// searched. -#[derive(Clone, Debug)] -pub struct Memchr3<'h> { - needle1: u8, - needle2: u8, - needle3: u8, - it: crate::arch::generic::memchr::Iter<'h>, -} - -impl<'h> Memchr3<'h> { - /// Returns an iterator over all occurrences of the needle bytes in the - /// given haystack. - /// - /// The iterator returned implements `DoubleEndedIterator`. This means it - /// can also be used to find occurrences in reverse order. - #[inline] - pub fn new( - needle1: u8, - needle2: u8, - needle3: u8, - haystack: &'h [u8], - ) -> Memchr3<'h> { - Memchr3 { - needle1, - needle2, - needle3, - it: crate::arch::generic::memchr::Iter::new(haystack), - } - } -} - -impl<'h> Iterator for Memchr3<'h> { - type Item = usize; - - #[inline] - fn next(&mut self) -> Option { - // SAFETY: All of our implementations of memchr ensure that any - // pointers returns will fall within the start and end bounds, and this - // upholds the safety contract of `self.it.next`. - unsafe { - self.it.next(|s, e| { - memchr3_raw(self.needle1, self.needle2, self.needle3, s, e) - }) - } - } - - #[inline] - fn size_hint(&self) -> (usize, Option) { - self.it.size_hint() - } -} - -impl<'h> DoubleEndedIterator for Memchr3<'h> { - #[inline] - fn next_back(&mut self) -> Option { - // SAFETY: All of our implementations of memchr ensure that any - // pointers returns will fall within the start and end bounds, and this - // upholds the safety contract of `self.it.next_back`. - unsafe { - self.it.next_back(|s, e| { - memrchr3_raw(self.needle1, self.needle2, self.needle3, s, e) - }) - } - } -} - -impl<'h> core::iter::FusedIterator for Memchr3<'h> {} - -/// memchr, but using raw pointers to represent the haystack. -/// -/// # Safety -/// -/// Pointers must be valid. See `One::find_raw`. -#[inline] -unsafe fn memchr_raw( - needle: u8, - start: *const u8, - end: *const u8, -) -> Option<*const u8> { - #[cfg(target_arch = "x86_64")] - { - // x86_64 does CPU feature detection at runtime in order to use AVX2 - // instructions even when the `avx2` feature isn't enabled at compile - // time. This function also handles using a fallback if neither AVX2 - // nor SSE2 (unusual) are available. - crate::arch::x86_64::memchr::memchr_raw(needle, start, end) - } - #[cfg(target_arch = "wasm32")] - { - crate::arch::wasm32::memchr::memchr_raw(needle, start, end) - } - #[cfg(target_arch = "aarch64")] - { - crate::arch::aarch64::memchr::memchr_raw(needle, start, end) - } - #[cfg(not(any( - target_arch = "x86_64", - target_arch = "wasm32", - target_arch = "aarch64" - )))] - { - crate::arch::all::memchr::One::new(needle).find_raw(start, end) - } -} - -/// memrchr, but using raw pointers to represent the haystack. -/// -/// # Safety -/// -/// Pointers must be valid. See `One::rfind_raw`. -#[inline] -unsafe fn memrchr_raw( - needle: u8, - start: *const u8, - end: *const u8, -) -> Option<*const u8> { - #[cfg(target_arch = "x86_64")] - { - crate::arch::x86_64::memchr::memrchr_raw(needle, start, end) - } - #[cfg(target_arch = "wasm32")] - { - crate::arch::wasm32::memchr::memrchr_raw(needle, start, end) - } - #[cfg(target_arch = "aarch64")] - { - crate::arch::aarch64::memchr::memrchr_raw(needle, start, end) - } - #[cfg(not(any( - target_arch = "x86_64", - target_arch = "wasm32", - target_arch = "aarch64" - )))] - { - crate::arch::all::memchr::One::new(needle).rfind_raw(start, end) - } -} - -/// memchr2, but using raw pointers to represent the haystack. -/// -/// # Safety -/// -/// Pointers must be valid. See `Two::find_raw`. -#[inline] -unsafe fn memchr2_raw( - needle1: u8, - needle2: u8, - start: *const u8, - end: *const u8, -) -> Option<*const u8> { - #[cfg(target_arch = "x86_64")] - { - crate::arch::x86_64::memchr::memchr2_raw(needle1, needle2, start, end) - } - #[cfg(target_arch = "wasm32")] - { - crate::arch::wasm32::memchr::memchr2_raw(needle1, needle2, start, end) - } - #[cfg(target_arch = "aarch64")] - { - crate::arch::aarch64::memchr::memchr2_raw(needle1, needle2, start, end) - } - #[cfg(not(any( - target_arch = "x86_64", - target_arch = "wasm32", - target_arch = "aarch64" - )))] - { - crate::arch::all::memchr::Two::new(needle1, needle2) - .find_raw(start, end) - } -} - -/// memrchr2, but using raw pointers to represent the haystack. -/// -/// # Safety -/// -/// Pointers must be valid. See `Two::rfind_raw`. -#[inline] -unsafe fn memrchr2_raw( - needle1: u8, - needle2: u8, - start: *const u8, - end: *const u8, -) -> Option<*const u8> { - #[cfg(target_arch = "x86_64")] - { - crate::arch::x86_64::memchr::memrchr2_raw(needle1, needle2, start, end) - } - #[cfg(target_arch = "wasm32")] - { - crate::arch::wasm32::memchr::memrchr2_raw(needle1, needle2, start, end) - } - #[cfg(target_arch = "aarch64")] - { - crate::arch::aarch64::memchr::memrchr2_raw( - needle1, needle2, start, end, - ) - } - #[cfg(not(any( - target_arch = "x86_64", - target_arch = "wasm32", - target_arch = "aarch64" - )))] - { - crate::arch::all::memchr::Two::new(needle1, needle2) - .rfind_raw(start, end) - } -} - -/// memchr3, but using raw pointers to represent the haystack. -/// -/// # Safety -/// -/// Pointers must be valid. See `Three::find_raw`. -#[inline] -unsafe fn memchr3_raw( - needle1: u8, - needle2: u8, - needle3: u8, - start: *const u8, - end: *const u8, -) -> Option<*const u8> { - #[cfg(target_arch = "x86_64")] - { - crate::arch::x86_64::memchr::memchr3_raw( - needle1, needle2, needle3, start, end, - ) - } - #[cfg(target_arch = "wasm32")] - { - crate::arch::wasm32::memchr::memchr3_raw( - needle1, needle2, needle3, start, end, - ) - } - #[cfg(target_arch = "aarch64")] - { - crate::arch::aarch64::memchr::memchr3_raw( - needle1, needle2, needle3, start, end, - ) - } - #[cfg(not(any( - target_arch = "x86_64", - target_arch = "wasm32", - target_arch = "aarch64" - )))] - { - crate::arch::all::memchr::Three::new(needle1, needle2, needle3) - .find_raw(start, end) - } -} - -/// memrchr3, but using raw pointers to represent the haystack. -/// -/// # Safety -/// -/// Pointers must be valid. See `Three::rfind_raw`. -#[inline] -unsafe fn memrchr3_raw( - needle1: u8, - needle2: u8, - needle3: u8, - start: *const u8, - end: *const u8, -) -> Option<*const u8> { - #[cfg(target_arch = "x86_64")] - { - crate::arch::x86_64::memchr::memrchr3_raw( - needle1, needle2, needle3, start, end, - ) - } - #[cfg(target_arch = "wasm32")] - { - crate::arch::wasm32::memchr::memrchr3_raw( - needle1, needle2, needle3, start, end, - ) - } - #[cfg(target_arch = "aarch64")] - { - crate::arch::aarch64::memchr::memrchr3_raw( - needle1, needle2, needle3, start, end, - ) - } - #[cfg(not(any( - target_arch = "x86_64", - target_arch = "wasm32", - target_arch = "aarch64" - )))] - { - crate::arch::all::memchr::Three::new(needle1, needle2, needle3) - .rfind_raw(start, end) - } -} - -/// Count all matching bytes, but using raw pointers to represent the haystack. -/// -/// # Safety -/// -/// Pointers must be valid. See `One::count_raw`. -#[inline] -unsafe fn count_raw(needle: u8, start: *const u8, end: *const u8) -> usize { - #[cfg(target_arch = "x86_64")] - { - crate::arch::x86_64::memchr::count_raw(needle, start, end) - } - #[cfg(target_arch = "wasm32")] - { - crate::arch::wasm32::memchr::count_raw(needle, start, end) - } - #[cfg(target_arch = "aarch64")] - { - crate::arch::aarch64::memchr::count_raw(needle, start, end) - } - #[cfg(not(any( - target_arch = "x86_64", - target_arch = "wasm32", - target_arch = "aarch64" - )))] - { - crate::arch::all::memchr::One::new(needle).count_raw(start, end) - } -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn forward1_iter() { - crate::tests::memchr::Runner::new(1).forward_iter( - |haystack, needles| { - Some(memchr_iter(needles[0], haystack).collect()) - }, - ) - } - - #[test] - fn forward1_oneshot() { - crate::tests::memchr::Runner::new(1).forward_oneshot( - |haystack, needles| Some(memchr(needles[0], haystack)), - ) - } - - #[test] - fn reverse1_iter() { - crate::tests::memchr::Runner::new(1).reverse_iter( - |haystack, needles| { - Some(memrchr_iter(needles[0], haystack).collect()) - }, - ) - } - - #[test] - fn reverse1_oneshot() { - crate::tests::memchr::Runner::new(1).reverse_oneshot( - |haystack, needles| Some(memrchr(needles[0], haystack)), - ) - } - - #[test] - fn count1_iter() { - crate::tests::memchr::Runner::new(1).count_iter(|haystack, needles| { - Some(memchr_iter(needles[0], haystack).count()) - }) - } - - #[test] - fn forward2_iter() { - crate::tests::memchr::Runner::new(2).forward_iter( - |haystack, needles| { - let n1 = needles.get(0).copied()?; - let n2 = needles.get(1).copied()?; - Some(memchr2_iter(n1, n2, haystack).collect()) - }, - ) - } - - #[test] - fn forward2_oneshot() { - crate::tests::memchr::Runner::new(2).forward_oneshot( - |haystack, needles| { - let n1 = needles.get(0).copied()?; - let n2 = needles.get(1).copied()?; - Some(memchr2(n1, n2, haystack)) - }, - ) - } - - #[test] - fn reverse2_iter() { - crate::tests::memchr::Runner::new(2).reverse_iter( - |haystack, needles| { - let n1 = needles.get(0).copied()?; - let n2 = needles.get(1).copied()?; - Some(memrchr2_iter(n1, n2, haystack).collect()) - }, - ) - } - - #[test] - fn reverse2_oneshot() { - crate::tests::memchr::Runner::new(2).reverse_oneshot( - |haystack, needles| { - let n1 = needles.get(0).copied()?; - let n2 = needles.get(1).copied()?; - Some(memrchr2(n1, n2, haystack)) - }, - ) - } - - #[test] - fn forward3_iter() { - crate::tests::memchr::Runner::new(3).forward_iter( - |haystack, needles| { - let n1 = needles.get(0).copied()?; - let n2 = needles.get(1).copied()?; - let n3 = needles.get(2).copied()?; - Some(memchr3_iter(n1, n2, n3, haystack).collect()) - }, - ) - } - - #[test] - fn forward3_oneshot() { - crate::tests::memchr::Runner::new(3).forward_oneshot( - |haystack, needles| { - let n1 = needles.get(0).copied()?; - let n2 = needles.get(1).copied()?; - let n3 = needles.get(2).copied()?; - Some(memchr3(n1, n2, n3, haystack)) - }, - ) - } - - #[test] - fn reverse3_iter() { - crate::tests::memchr::Runner::new(3).reverse_iter( - |haystack, needles| { - let n1 = needles.get(0).copied()?; - let n2 = needles.get(1).copied()?; - let n3 = needles.get(2).copied()?; - Some(memrchr3_iter(n1, n2, n3, haystack).collect()) - }, - ) - } - - #[test] - fn reverse3_oneshot() { - crate::tests::memchr::Runner::new(3).reverse_oneshot( - |haystack, needles| { - let n1 = needles.get(0).copied()?; - let n2 = needles.get(1).copied()?; - let n3 = needles.get(2).copied()?; - Some(memrchr3(n1, n2, n3, haystack)) - }, - ) - } - - // Prior to memchr 2.6, the memchr iterators both implemented Send and - // Sync. But in memchr 2.6, the iterator changed to use raw pointers - // internally and I didn't add explicit Send/Sync impls. This ended up - // regressing the API. This test ensures we don't do that again. - // - // See: https://github.com/BurntSushi/memchr/issues/133 - #[test] - fn sync_regression() { - use core::panic::{RefUnwindSafe, UnwindSafe}; - - fn assert_send_sync() {} - assert_send_sync::(); - assert_send_sync::(); - assert_send_sync::() - } -} diff -Nru temporalio-1.3.0/vendor/memchr/src/memmem/byte_frequencies.rs temporalio-1.3.0/vendor/memchr/src/memmem/byte_frequencies.rs --- temporalio-1.3.0/vendor/memchr/src/memmem/byte_frequencies.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/memmem/byte_frequencies.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,258 @@ +pub const BYTE_FREQUENCIES: [u8; 256] = [ + 55, // '\x00' + 52, // '\x01' + 51, // '\x02' + 50, // '\x03' + 49, // '\x04' + 48, // '\x05' + 47, // '\x06' + 46, // '\x07' + 45, // '\x08' + 103, // '\t' + 242, // '\n' + 66, // '\x0b' + 67, // '\x0c' + 229, // '\r' + 44, // '\x0e' + 43, // '\x0f' + 42, // '\x10' + 41, // '\x11' + 40, // '\x12' + 39, // '\x13' + 38, // '\x14' + 37, // '\x15' + 36, // '\x16' + 35, // '\x17' + 34, // '\x18' + 33, // '\x19' + 56, // '\x1a' + 32, // '\x1b' + 31, // '\x1c' + 30, // '\x1d' + 29, // '\x1e' + 28, // '\x1f' + 255, // ' ' + 148, // '!' + 164, // '"' + 149, // '#' + 136, // '$' + 160, // '%' + 155, // '&' + 173, // "'" + 221, // '(' + 222, // ')' + 134, // '*' + 122, // '+' + 232, // ',' + 202, // '-' + 215, // '.' + 224, // '/' + 208, // '0' + 220, // '1' + 204, // '2' + 187, // '3' + 183, // '4' + 179, // '5' + 177, // '6' + 168, // '7' + 178, // '8' + 200, // '9' + 226, // ':' + 195, // ';' + 154, // '<' + 184, // '=' + 174, // '>' + 126, // '?' + 120, // '@' + 191, // 'A' + 157, // 'B' + 194, // 'C' + 170, // 'D' + 189, // 'E' + 162, // 'F' + 161, // 'G' + 150, // 'H' + 193, // 'I' + 142, // 'J' + 137, // 'K' + 171, // 'L' + 176, // 'M' + 185, // 'N' + 167, // 'O' + 186, // 'P' + 112, // 'Q' + 175, // 'R' + 192, // 'S' + 188, // 'T' + 156, // 'U' + 140, // 'V' + 143, // 'W' + 123, // 'X' + 133, // 'Y' + 128, // 'Z' + 147, // '[' + 138, // '\\' + 146, // ']' + 114, // '^' + 223, // '_' + 151, // '`' + 249, // 'a' + 216, // 'b' + 238, // 'c' + 236, // 'd' + 253, // 'e' + 227, // 'f' + 218, // 'g' + 230, // 'h' + 247, // 'i' + 135, // 'j' + 180, // 'k' + 241, // 'l' + 233, // 'm' + 246, // 'n' + 244, // 'o' + 231, // 'p' + 139, // 'q' + 245, // 'r' + 243, // 's' + 251, // 't' + 235, // 'u' + 201, // 'v' + 196, // 'w' + 240, // 'x' + 214, // 'y' + 152, // 'z' + 182, // '{' + 205, // '|' + 181, // '}' + 127, // '~' + 27, // '\x7f' + 212, // '\x80' + 211, // '\x81' + 210, // '\x82' + 213, // '\x83' + 228, // '\x84' + 197, // '\x85' + 169, // '\x86' + 159, // '\x87' + 131, // '\x88' + 172, // '\x89' + 105, // '\x8a' + 80, // '\x8b' + 98, // '\x8c' + 96, // '\x8d' + 97, // '\x8e' + 81, // '\x8f' + 207, // '\x90' + 145, // '\x91' + 116, // '\x92' + 115, // '\x93' + 144, // '\x94' + 130, // '\x95' + 153, // '\x96' + 121, // '\x97' + 107, // '\x98' + 132, // '\x99' + 109, // '\x9a' + 110, // '\x9b' + 124, // '\x9c' + 111, // '\x9d' + 82, // '\x9e' + 108, // '\x9f' + 118, // '\xa0' + 141, // '¡' + 113, // '¢' + 129, // '£' + 119, // '¤' + 125, // 'Â¥' + 165, // '¦' + 117, // '§' + 92, // '¨' + 106, // '©' + 83, // 'ª' + 72, // '«' + 99, // '¬' + 93, // '\xad' + 65, // '®' + 79, // '¯' + 166, // '°' + 237, // '±' + 163, // '²' + 199, // '³' + 190, // '´' + 225, // 'µ' + 209, // '¶' + 203, // '·' + 198, // '¸' + 217, // '¹' + 219, // 'º' + 206, // '»' + 234, // '¼' + 248, // '½' + 158, // '¾' + 239, // '¿' + 255, // 'À' + 255, // 'Ã' + 255, // 'Â' + 255, // 'Ã' + 255, // 'Ä' + 255, // 'Ã…' + 255, // 'Æ' + 255, // 'Ç' + 255, // 'È' + 255, // 'É' + 255, // 'Ê' + 255, // 'Ë' + 255, // 'ÃŒ' + 255, // 'Ã' + 255, // 'ÃŽ' + 255, // 'Ã' + 255, // 'Ã' + 255, // 'Ñ' + 255, // 'Ã’' + 255, // 'Ó' + 255, // 'Ô' + 255, // 'Õ' + 255, // 'Ö' + 255, // '×' + 255, // 'Ø' + 255, // 'Ù' + 255, // 'Ú' + 255, // 'Û' + 255, // 'Ãœ' + 255, // 'Ã' + 255, // 'Þ' + 255, // 'ß' + 255, // 'à' + 255, // 'á' + 255, // 'â' + 255, // 'ã' + 255, // 'ä' + 255, // 'Ã¥' + 255, // 'æ' + 255, // 'ç' + 255, // 'è' + 255, // 'é' + 255, // 'ê' + 255, // 'ë' + 255, // 'ì' + 255, // 'í' + 255, // 'î' + 255, // 'ï' + 255, // 'ð' + 255, // 'ñ' + 255, // 'ò' + 255, // 'ó' + 255, // 'ô' + 255, // 'õ' + 255, // 'ö' + 255, // '÷' + 255, // 'ø' + 255, // 'ù' + 255, // 'ú' + 255, // 'û' + 255, // 'ü' + 255, // 'ý' + 255, // 'þ' + 255, // 'ÿ' +]; diff -Nru temporalio-1.3.0/vendor/memchr/src/memmem/genericsimd.rs temporalio-1.3.0/vendor/memchr/src/memmem/genericsimd.rs --- temporalio-1.3.0/vendor/memchr/src/memmem/genericsimd.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/memmem/genericsimd.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,266 @@ +use core::mem::size_of; + +use crate::memmem::{util::memcmp, vector::Vector, NeedleInfo}; + +/// The minimum length of a needle required for this algorithm. The minimum +/// is 2 since a length of 1 should just use memchr and a length of 0 isn't +/// a case handled by this searcher. +pub(crate) const MIN_NEEDLE_LEN: usize = 2; + +/// The maximum length of a needle required for this algorithm. +/// +/// In reality, there is no hard max here. The code below can handle any +/// length needle. (Perhaps that suggests there are missing optimizations.) +/// Instead, this is a heuristic and a bound guaranteeing our linear time +/// complexity. +/// +/// It is a heuristic because when a candidate match is found, memcmp is run. +/// For very large needles with lots of false positives, memcmp can make the +/// code run quite slow. +/// +/// It is a bound because the worst case behavior with memcmp is multiplicative +/// in the size of the needle and haystack, and we want to keep that additive. +/// This bound ensures we still meet that bound theoretically, since it's just +/// a constant. We aren't acting in bad faith here, memcmp on tiny needles +/// is so fast that even in pathological cases (see pathological vector +/// benchmarks), this is still just as fast or faster in practice. +/// +/// This specific number was chosen by tweaking a bit and running benchmarks. +/// The rare-medium-needle, for example, gets about 5% faster by using this +/// algorithm instead of a prefilter-accelerated Two-Way. There's also a +/// theoretical desire to keep this number reasonably low, to mitigate the +/// impact of pathological cases. I did try 64, and some benchmarks got a +/// little better, and others (particularly the pathological ones), got a lot +/// worse. So... 32 it is? +pub(crate) const MAX_NEEDLE_LEN: usize = 32; + +/// The implementation of the forward vector accelerated substring search. +/// +/// This is extremely similar to the prefilter vector module by the same name. +/// The key difference is that this is not a prefilter. Instead, it handles +/// confirming its own matches. The trade off is that this only works with +/// smaller needles. The speed up here is that an inlined memcmp on a tiny +/// needle is very quick, even on pathological inputs. This is much better than +/// combining a prefilter with Two-Way, where using Two-Way to confirm the +/// match has higher latency. +/// +/// So why not use this for all needles? We could, and it would probably work +/// really well on most inputs. But its worst case is multiplicative and we +/// want to guarantee worst case additive time. Some of the benchmarks try to +/// justify this (see the pathological ones). +/// +/// The prefilter variant of this has more comments. Also note that we only +/// implement this for forward searches for now. If you have a compelling use +/// case for accelerated reverse search, please file an issue. +#[derive(Clone, Copy, Debug)] +pub(crate) struct Forward { + rare1i: u8, + rare2i: u8, +} + +impl Forward { + /// Create a new "generic simd" forward searcher. If one could not be + /// created from the given inputs, then None is returned. + pub(crate) fn new(ninfo: &NeedleInfo, needle: &[u8]) -> Option { + let (rare1i, rare2i) = ninfo.rarebytes.as_rare_ordered_u8(); + // If the needle is too short or too long, give up. Also, give up + // if the rare bytes detected are at the same position. (It likely + // suggests a degenerate case, although it should technically not be + // possible.) + if needle.len() < MIN_NEEDLE_LEN + || needle.len() > MAX_NEEDLE_LEN + || rare1i == rare2i + { + return None; + } + Some(Forward { rare1i, rare2i }) + } + + /// Returns the minimum length of haystack that is needed for this searcher + /// to work for a particular vector. Passing a haystack with a length + /// smaller than this will cause `fwd_find` to panic. + #[inline(always)] + pub(crate) fn min_haystack_len(&self) -> usize { + self.rare2i as usize + size_of::() + } +} + +/// Searches the given haystack for the given needle. The needle given should +/// be the same as the needle that this searcher was initialized with. +/// +/// # Panics +/// +/// When the given haystack has a length smaller than `min_haystack_len`. +/// +/// # Safety +/// +/// Since this is meant to be used with vector functions, callers need to +/// specialize this inside of a function with a `target_feature` attribute. +/// Therefore, callers must ensure that whatever target feature is being used +/// supports the vector functions that this function is specialized for. (For +/// the specific vector functions used, see the Vector trait implementations.) +#[inline(always)] +pub(crate) unsafe fn fwd_find( + fwd: &Forward, + haystack: &[u8], + needle: &[u8], +) -> Option { + // It would be nice if we didn't have this check here, since the meta + // searcher should handle it for us. But without this, I don't think we + // guarantee that end_ptr.sub(needle.len()) won't result in UB. We could + // put it as part of the safety contract, but it makes it more complicated + // than necessary. + if haystack.len() < needle.len() { + return None; + } + let min_haystack_len = fwd.min_haystack_len::(); + assert!(haystack.len() >= min_haystack_len, "haystack too small"); + debug_assert!(needle.len() <= haystack.len()); + debug_assert!( + needle.len() >= MIN_NEEDLE_LEN, + "needle must be at least {} bytes", + MIN_NEEDLE_LEN, + ); + debug_assert!( + needle.len() <= MAX_NEEDLE_LEN, + "needle must be at most {} bytes", + MAX_NEEDLE_LEN, + ); + + let (rare1i, rare2i) = (fwd.rare1i as usize, fwd.rare2i as usize); + let rare1chunk = V::splat(needle[rare1i]); + let rare2chunk = V::splat(needle[rare2i]); + + let start_ptr = haystack.as_ptr(); + let end_ptr = start_ptr.add(haystack.len()); + let max_ptr = end_ptr.sub(min_haystack_len); + let mut ptr = start_ptr; + + // N.B. I did experiment with unrolling the loop to deal with size(V) + // bytes at a time and 2*size(V) bytes at a time. The double unroll was + // marginally faster while the quadruple unroll was unambiguously slower. + // In the end, I decided the complexity from unrolling wasn't worth it. I + // used the memmem/krate/prebuilt/huge-en/ benchmarks to compare. + while ptr <= max_ptr { + let m = fwd_find_in_chunk( + fwd, needle, ptr, end_ptr, rare1chunk, rare2chunk, !0, + ); + if let Some(chunki) = m { + return Some(matched(start_ptr, ptr, chunki)); + } + ptr = ptr.add(size_of::()); + } + if ptr < end_ptr { + let remaining = diff(end_ptr, ptr); + debug_assert!( + remaining < min_haystack_len, + "remaining bytes should be smaller than the minimum haystack \ + length of {}, but there are {} bytes remaining", + min_haystack_len, + remaining, + ); + if remaining < needle.len() { + return None; + } + debug_assert!( + max_ptr < ptr, + "after main loop, ptr should have exceeded max_ptr", + ); + let overlap = diff(ptr, max_ptr); + debug_assert!( + overlap > 0, + "overlap ({}) must always be non-zero", + overlap, + ); + debug_assert!( + overlap < size_of::(), + "overlap ({}) cannot possibly be >= than a vector ({})", + overlap, + size_of::(), + ); + // The mask has all of its bits set except for the first N least + // significant bits, where N=overlap. This way, any matches that + // occur in find_in_chunk within the overlap are automatically + // ignored. + let mask = !((1 << overlap) - 1); + ptr = max_ptr; + let m = fwd_find_in_chunk( + fwd, needle, ptr, end_ptr, rare1chunk, rare2chunk, mask, + ); + if let Some(chunki) = m { + return Some(matched(start_ptr, ptr, chunki)); + } + } + None +} + +/// Search for an occurrence of two rare bytes from the needle in the chunk +/// pointed to by ptr, with the end of the haystack pointed to by end_ptr. When +/// an occurrence is found, memcmp is run to check if a match occurs at the +/// corresponding position. +/// +/// rare1chunk and rare2chunk correspond to vectors with the rare1 and rare2 +/// bytes repeated in each 8-bit lane, respectively. +/// +/// mask should have bits set corresponding the positions in the chunk in which +/// matches are considered. This is only used for the last vector load where +/// the beginning of the vector might have overlapped with the last load in +/// the main loop. The mask lets us avoid visiting positions that have already +/// been discarded as matches. +/// +/// # Safety +/// +/// It must be safe to do an unaligned read of size(V) bytes starting at both +/// (ptr + rare1i) and (ptr + rare2i). It must also be safe to do unaligned +/// loads on ptr up to (end_ptr - needle.len()). +#[inline(always)] +unsafe fn fwd_find_in_chunk( + fwd: &Forward, + needle: &[u8], + ptr: *const u8, + end_ptr: *const u8, + rare1chunk: V, + rare2chunk: V, + mask: u32, +) -> Option { + let chunk0 = V::load_unaligned(ptr.add(fwd.rare1i as usize)); + let chunk1 = V::load_unaligned(ptr.add(fwd.rare2i as usize)); + + let eq0 = chunk0.cmpeq(rare1chunk); + let eq1 = chunk1.cmpeq(rare2chunk); + + let mut match_offsets = eq0.and(eq1).movemask() & mask; + while match_offsets != 0 { + let offset = match_offsets.trailing_zeros() as usize; + let ptr = ptr.add(offset); + if end_ptr.sub(needle.len()) < ptr { + return None; + } + let chunk = core::slice::from_raw_parts(ptr, needle.len()); + if memcmp(needle, chunk) { + return Some(offset); + } + match_offsets &= match_offsets - 1; + } + None +} + +/// Accepts a chunk-relative offset and returns a haystack relative offset +/// after updating the prefilter state. +/// +/// See the same function with the same name in the prefilter variant of this +/// algorithm to learned why it's tagged with inline(never). Even here, where +/// the function is simpler, inlining it leads to poorer codegen. (Although +/// it does improve some benchmarks, like prebuiltiter/huge-en/common-you.) +#[cold] +#[inline(never)] +fn matched(start_ptr: *const u8, ptr: *const u8, chunki: usize) -> usize { + diff(ptr, start_ptr) + chunki +} + +/// Subtract `b` from `a` and return the difference. `a` must be greater than +/// or equal to `b`. +fn diff(a: *const u8, b: *const u8) -> usize { + debug_assert!(a >= b); + (a as usize) - (b as usize) +} diff -Nru temporalio-1.3.0/vendor/memchr/src/memmem/mod.rs temporalio-1.3.0/vendor/memchr/src/memmem/mod.rs --- temporalio-1.3.0/vendor/memchr/src/memmem/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/memmem/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -66,25 +66,99 @@ ``` */ -pub use crate::memmem::searcher::PrefilterConfig as Prefilter; - -// This is exported here for use in the crate::arch::all::twoway -// implementation. This is essentially an abstraction breaker. Namely, the -// public API of twoway doesn't support providing a prefilter, but its crate -// internal API does. The main reason for this is that I didn't want to do the -// API design required to support it without a concrete use case. -pub(crate) use crate::memmem::searcher::Pre; +pub use self::prefilter::Prefilter; use crate::{ - arch::all::{ - packedpair::{DefaultFrequencyRank, HeuristicFrequencyRank}, - rabinkarp, - }, cow::CowBytes, - memmem::searcher::{PrefilterState, Searcher, SearcherRev}, + memmem::{ + prefilter::{Pre, PrefilterFn, PrefilterState}, + rabinkarp::NeedleHash, + rarebytes::RareNeedleBytes, + }, }; -mod searcher; +/// Defines a suite of quickcheck properties for forward and reverse +/// substring searching. +/// +/// This is defined in this specific spot so that it can be used freely among +/// the different substring search implementations. I couldn't be bothered to +/// fight with the macro-visibility rules enough to figure out how to stuff it +/// somewhere more convenient. +#[cfg(all(test, feature = "std"))] +macro_rules! define_memmem_quickcheck_tests { + ($fwd:expr, $rev:expr) => { + use crate::memmem::proptests; + + quickcheck::quickcheck! { + fn qc_fwd_prefix_is_substring(bs: Vec) -> bool { + proptests::prefix_is_substring(false, &bs, $fwd) + } + + fn qc_fwd_suffix_is_substring(bs: Vec) -> bool { + proptests::suffix_is_substring(false, &bs, $fwd) + } + + fn qc_fwd_matches_naive( + haystack: Vec, + needle: Vec + ) -> bool { + proptests::matches_naive(false, &haystack, &needle, $fwd) + } + + fn qc_rev_prefix_is_substring(bs: Vec) -> bool { + proptests::prefix_is_substring(true, &bs, $rev) + } + + fn qc_rev_suffix_is_substring(bs: Vec) -> bool { + proptests::suffix_is_substring(true, &bs, $rev) + } + + fn qc_rev_matches_naive( + haystack: Vec, + needle: Vec + ) -> bool { + proptests::matches_naive(true, &haystack, &needle, $rev) + } + } + }; +} + +/// Defines a suite of "simple" hand-written tests for a substring +/// implementation. +/// +/// This is defined here for the same reason that +/// define_memmem_quickcheck_tests is defined here. +#[cfg(test)] +macro_rules! define_memmem_simple_tests { + ($fwd:expr, $rev:expr) => { + use crate::memmem::testsimples; + + #[test] + fn simple_forward() { + testsimples::run_search_tests_fwd($fwd); + } + + #[test] + fn simple_reverse() { + testsimples::run_search_tests_rev($rev); + } + }; +} + +mod byte_frequencies; +#[cfg(memchr_runtime_simd)] +mod genericsimd; +mod prefilter; +mod rabinkarp; +mod rarebytes; +mod twoway; +mod util; +#[cfg(memchr_runtime_simd)] +mod vector; +#[cfg(all(memchr_runtime_wasm128))] +mod wasm; +#[cfg(all(not(miri), target_arch = "x86_64", memchr_runtime_simd))] +mod x86; /// Returns an iterator over all non-overlapping occurrences of a substring in /// a haystack. @@ -184,7 +258,7 @@ #[inline] pub fn find(haystack: &[u8], needle: &[u8]) -> Option { if haystack.len() < 64 { - rabinkarp::Finder::new(needle).find(haystack, needle) + rabinkarp::find(haystack, needle) } else { Finder::new(needle).find(haystack) } @@ -221,7 +295,7 @@ #[inline] pub fn rfind(haystack: &[u8], needle: &[u8]) -> Option { if haystack.len() < 64 { - rabinkarp::FinderRev::new(needle).rfind(haystack, needle) + rabinkarp::rfind(haystack, needle) } else { FinderRev::new(needle).rfind(haystack) } @@ -247,7 +321,7 @@ haystack: &'h [u8], finder: Finder<'n>, ) -> FindIter<'h, 'n> { - let prestate = PrefilterState::new(); + let prestate = finder.searcher.prefilter_state(); FindIter { haystack, prestate, finder, pos: 0 } } @@ -257,8 +331,8 @@ /// If this is already an owned iterator, then this is a no-op. Otherwise, /// this copies the needle. /// - /// This is only available when the `alloc` feature is enabled. - #[cfg(feature = "alloc")] + /// This is only available when the `std` feature is enabled. + #[cfg(feature = "std")] #[inline] pub fn into_owned(self) -> FindIter<'h, 'static> { FindIter { @@ -274,32 +348,20 @@ type Item = usize; fn next(&mut self) -> Option { - let needle = self.finder.needle(); - let haystack = self.haystack.get(self.pos..)?; - let idx = - self.finder.searcher.find(&mut self.prestate, haystack, needle)?; - - let pos = self.pos + idx; - self.pos = pos + needle.len().max(1); - - Some(pos) - } - - fn size_hint(&self) -> (usize, Option) { - // The largest possible number of non-overlapping matches is the - // quotient of the haystack and the needle (or the length of the - // haystack, if the needle is empty) - match self.haystack.len().checked_sub(self.pos) { - None => (0, Some(0)), - Some(haystack_len) => match self.finder.needle().len() { - // Empty needles always succeed and match at every point - // (including the very end) - 0 => ( - haystack_len.saturating_add(1), - haystack_len.checked_add(1), - ), - needle_len => (0, Some(haystack_len / needle_len)), - }, + if self.pos > self.haystack.len() { + return None; + } + let result = self + .finder + .searcher + .find(&mut self.prestate, &self.haystack[self.pos..]); + match result { + None => None, + Some(i) => { + let pos = self.pos + i; + self.pos = pos + core::cmp::max(1, self.finder.needle().len()); + Some(pos) + } } } } @@ -336,7 +398,7 @@ /// this copies the needle. /// /// This is only available when the `std` feature is enabled. - #[cfg(feature = "alloc")] + #[cfg(feature = "std")] #[inline] pub fn into_owned(self) -> FindRevIter<'h, 'static> { FindRevIter { @@ -385,8 +447,7 @@ /// the lifetime of its needle. #[derive(Clone, Debug)] pub struct Finder<'n> { - needle: CowBytes<'n>, - searcher: Searcher, + searcher: Searcher<'n>, } impl<'n> Finder<'n> { @@ -420,11 +481,8 @@ /// assert_eq!(Some(4), Finder::new("bar").find(haystack)); /// assert_eq!(None, Finder::new("quux").find(haystack)); /// ``` - #[inline] pub fn find(&self, haystack: &[u8]) -> Option { - let mut prestate = PrefilterState::new(); - let needle = self.needle.as_slice(); - self.searcher.find(&mut prestate, haystack, needle) + self.searcher.find(&mut self.searcher.prefilter_state(), haystack) } /// Returns an iterator over all occurrences of a substring in a haystack. @@ -467,14 +525,11 @@ /// If this is already an owned finder, then this is a no-op. Otherwise, /// this copies the needle. /// - /// This is only available when the `alloc` feature is enabled. - #[cfg(feature = "alloc")] + /// This is only available when the `std` feature is enabled. + #[cfg(feature = "std")] #[inline] pub fn into_owned(self) -> Finder<'static> { - Finder { - needle: self.needle.into_owned(), - searcher: self.searcher.clone(), - } + Finder { searcher: self.searcher.into_owned() } } /// Convert this finder into its borrowed variant. @@ -489,10 +544,7 @@ /// shorter of the two. #[inline] pub fn as_ref(&self) -> Finder<'_> { - Finder { - needle: CowBytes::new(self.needle()), - searcher: self.searcher.clone(), - } + Finder { searcher: self.searcher.as_ref() } } /// Returns the needle that this finder searches for. @@ -503,7 +555,7 @@ /// needle returned must necessarily be the shorter of the two. #[inline] pub fn needle(&self) -> &[u8] { - self.needle.as_slice() + self.searcher.needle() } } @@ -522,8 +574,7 @@ /// the lifetime of its needle. #[derive(Clone, Debug)] pub struct FinderRev<'n> { - needle: CowBytes<'n>, - searcher: SearcherRev, + searcher: SearcherRev<'n>, } impl<'n> FinderRev<'n> { @@ -561,7 +612,7 @@ /// assert_eq!(None, FinderRev::new("quux").rfind(haystack)); /// ``` pub fn rfind>(&self, haystack: B) -> Option { - self.searcher.rfind(haystack.as_ref(), self.needle.as_slice()) + self.searcher.rfind(haystack.as_ref()) } /// Returns a reverse iterator over all occurrences of a substring in a @@ -606,13 +657,10 @@ /// this copies the needle. /// /// This is only available when the `std` feature is enabled. - #[cfg(feature = "alloc")] + #[cfg(feature = "std")] #[inline] pub fn into_owned(self) -> FinderRev<'static> { - FinderRev { - needle: self.needle.into_owned(), - searcher: self.searcher.clone(), - } + FinderRev { searcher: self.searcher.into_owned() } } /// Convert this finder into its borrowed variant. @@ -627,10 +675,7 @@ /// shorter of the two. #[inline] pub fn as_ref(&self) -> FinderRev<'_> { - FinderRev { - needle: CowBytes::new(self.needle()), - searcher: self.searcher.clone(), - } + FinderRev { searcher: self.searcher.as_ref() } } /// Returns the needle that this finder searches for. @@ -641,7 +686,7 @@ /// needle returned must necessarily be the shorter of the two. #[inline] pub fn needle(&self) -> &[u8] { - self.needle.as_slice() + self.searcher.needle() } } @@ -652,7 +697,7 @@ /// heuristic prefilters used to speed up certain searches. #[derive(Clone, Debug, Default)] pub struct FinderBuilder { - prefilter: Prefilter, + config: SearcherConfig, } impl FinderBuilder { @@ -667,26 +712,7 @@ &self, needle: &'n B, ) -> Finder<'n> { - self.build_forward_with_ranker(DefaultFrequencyRank, needle) - } - - /// Build a forward finder using the given needle and a custom heuristic for - /// determining the frequency of a given byte in the dataset. - /// See [`HeuristicFrequencyRank`] for more details. - pub fn build_forward_with_ranker< - 'n, - R: HeuristicFrequencyRank, - B: ?Sized + AsRef<[u8]>, - >( - &self, - ranker: R, - needle: &'n B, - ) -> Finder<'n> { - let needle = needle.as_ref(); - Finder { - needle: CowBytes::new(needle), - searcher: Searcher::new(self.prefilter, ranker, needle), - } + Finder { searcher: Searcher::new(self.config, needle.as_ref()) } } /// Build a reverse finder using the given needle from the current @@ -695,11 +721,7 @@ &self, needle: &'n B, ) -> FinderRev<'n> { - let needle = needle.as_ref(); - FinderRev { - needle: CowBytes::new(needle), - searcher: SearcherRev::new(needle), - } + FinderRev { searcher: SearcherRev::new(needle.as_ref()) } } /// Configure the prefilter setting for the finder. @@ -707,31 +729,593 @@ /// See the documentation for [`Prefilter`] for more discussion on why /// you might want to configure this. pub fn prefilter(&mut self, prefilter: Prefilter) -> &mut FinderBuilder { - self.prefilter = prefilter; + self.config.prefilter = prefilter; self } } +/// The internal implementation of a forward substring searcher. +/// +/// The reality is that this is a "meta" searcher. Namely, depending on a +/// variety of parameters (CPU support, target, needle size, haystack size and +/// even dynamic properties such as prefilter effectiveness), the actual +/// algorithm employed to do substring search may change. +#[derive(Clone, Debug)] +struct Searcher<'n> { + /// The actual needle we're searching for. + /// + /// A CowBytes is like a Cow<[u8]>, except in no_std environments, it is + /// specialized to a single variant (the borrowed form). + needle: CowBytes<'n>, + /// A collection of facts computed on the needle that are useful for more + /// than one substring search algorithm. + ninfo: NeedleInfo, + /// A prefilter function, if it was deemed appropriate. + /// + /// Some substring search implementations (like Two-Way) benefit greatly + /// if we can quickly find candidate starting positions for a match. + prefn: Option, + /// The actual substring implementation in use. + kind: SearcherKind, +} + +/// A collection of facts computed about a search needle. +/// +/// We group these things together because it's useful to be able to hand them +/// to prefilters or substring algorithms that want them. +#[derive(Clone, Copy, Debug)] +pub(crate) struct NeedleInfo { + /// The offsets of "rare" bytes detected in the needle. + /// + /// This is meant to be a heuristic in order to maximize the effectiveness + /// of vectorized code. Namely, vectorized code tends to focus on only + /// one or two bytes. If we pick bytes from the needle that occur + /// infrequently, then more time will be spent in the vectorized code and + /// will likely make the overall search (much) faster. + /// + /// Of course, this is only a heuristic based on a background frequency + /// distribution of bytes. But it tends to work very well in practice. + pub(crate) rarebytes: RareNeedleBytes, + /// A Rabin-Karp hash of the needle. + /// + /// This is store here instead of in a more specific Rabin-Karp search + /// since Rabin-Karp may be used even if another SearchKind corresponds + /// to some other search implementation. e.g., If measurements suggest RK + /// is faster in some cases or if a search implementation can't handle + /// particularly small haystack. (Moreover, we cannot use RK *generally*, + /// since its worst case time is multiplicative. Instead, we only use it + /// some small haystacks, where "small" is a constant.) + pub(crate) nhash: NeedleHash, +} + +/// Configuration for substring search. +#[derive(Clone, Copy, Debug, Default)] +struct SearcherConfig { + /// This permits changing the behavior of the prefilter, since it can have + /// a variable impact on performance. + prefilter: Prefilter, +} + +#[derive(Clone, Debug)] +enum SearcherKind { + /// A special case for empty needles. An empty needle always matches, even + /// in an empty haystack. + Empty, + /// This is used whenever the needle is a single byte. In this case, we + /// always use memchr. + OneByte(u8), + /// Two-Way is the generic work horse and is what provides our additive + /// linear time guarantee. In general, it's used when the needle is bigger + /// than 8 bytes or so. + TwoWay(twoway::Forward), + #[cfg(all(not(miri), target_arch = "x86_64", memchr_runtime_simd))] + GenericSIMD128(x86::sse::Forward), + #[cfg(memchr_runtime_wasm128)] + GenericSIMD128(wasm::Forward), + #[cfg(all(not(miri), target_arch = "x86_64", memchr_runtime_simd))] + GenericSIMD256(x86::avx::Forward), +} + +impl<'n> Searcher<'n> { + fn new(config: SearcherConfig, needle: &'n [u8]) -> Searcher<'n> { + use self::SearcherKind::*; + + let ninfo = NeedleInfo::new(needle); + let mk = |kind: SearcherKind| { + let prefn = prefilter::forward( + &config.prefilter, + &ninfo.rarebytes, + needle, + ); + Searcher { needle: CowBytes::new(needle), ninfo, prefn, kind } + }; + if needle.len() == 0 { + return mk(Empty); + } + if needle.len() == 1 { + return mk(OneByte(needle[0])); + } + #[cfg(all(not(miri), target_arch = "x86_64", memchr_runtime_simd))] + { + if let Some(fwd) = x86::avx::Forward::new(&ninfo, needle) { + return mk(GenericSIMD256(fwd)); + } else if let Some(fwd) = x86::sse::Forward::new(&ninfo, needle) { + return mk(GenericSIMD128(fwd)); + } + } + #[cfg(all(target_arch = "wasm32", memchr_runtime_simd))] + { + if let Some(fwd) = wasm::Forward::new(&ninfo, needle) { + return mk(GenericSIMD128(fwd)); + } + } + + mk(TwoWay(twoway::Forward::new(needle))) + } + + /// Return a fresh prefilter state that can be used with this searcher. + /// A prefilter state is used to track the effectiveness of a searcher's + /// prefilter for speeding up searches. Therefore, the prefilter state + /// should generally be reused on subsequent searches (such as in an + /// iterator). For searches on a different haystack, then a new prefilter + /// state should be used. + /// + /// This always initializes a valid (but possibly inert) prefilter state + /// even if this searcher does not have a prefilter enabled. + fn prefilter_state(&self) -> PrefilterState { + if self.prefn.is_none() { + PrefilterState::inert() + } else { + PrefilterState::new() + } + } + + fn needle(&self) -> &[u8] { + self.needle.as_slice() + } + + fn as_ref(&self) -> Searcher<'_> { + use self::SearcherKind::*; + + let kind = match self.kind { + Empty => Empty, + OneByte(b) => OneByte(b), + TwoWay(tw) => TwoWay(tw), + #[cfg(all(not(miri), memchr_runtime_simd))] + GenericSIMD128(gs) => GenericSIMD128(gs), + #[cfg(all( + not(miri), + target_arch = "x86_64", + memchr_runtime_simd + ))] + GenericSIMD256(gs) => GenericSIMD256(gs), + }; + Searcher { + needle: CowBytes::new(self.needle()), + ninfo: self.ninfo, + prefn: self.prefn, + kind, + } + } + + #[cfg(feature = "std")] + fn into_owned(self) -> Searcher<'static> { + use self::SearcherKind::*; + + let kind = match self.kind { + Empty => Empty, + OneByte(b) => OneByte(b), + TwoWay(tw) => TwoWay(tw), + #[cfg(all(not(miri), memchr_runtime_simd))] + GenericSIMD128(gs) => GenericSIMD128(gs), + #[cfg(all( + not(miri), + target_arch = "x86_64", + memchr_runtime_simd + ))] + GenericSIMD256(gs) => GenericSIMD256(gs), + }; + Searcher { + needle: self.needle.into_owned(), + ninfo: self.ninfo, + prefn: self.prefn, + kind, + } + } + + /// Implements forward substring search by selecting the implementation + /// chosen at construction and executing it on the given haystack with the + /// prefilter's current state of effectiveness. + #[inline(always)] + fn find( + &self, + state: &mut PrefilterState, + haystack: &[u8], + ) -> Option { + use self::SearcherKind::*; + + let needle = self.needle(); + if haystack.len() < needle.len() { + return None; + } + match self.kind { + Empty => Some(0), + OneByte(b) => crate::memchr(b, haystack), + TwoWay(ref tw) => { + // For very short haystacks (e.g., where the prefilter probably + // can't run), it's faster to just run RK. + if rabinkarp::is_fast(haystack, needle) { + rabinkarp::find_with(&self.ninfo.nhash, haystack, needle) + } else { + self.find_tw(tw, state, haystack, needle) + } + } + #[cfg(all(not(miri), memchr_runtime_simd))] + GenericSIMD128(ref gs) => { + // The SIMD matcher can't handle particularly short haystacks, + // so we fall back to RK in these cases. + if haystack.len() < gs.min_haystack_len() { + rabinkarp::find_with(&self.ninfo.nhash, haystack, needle) + } else { + gs.find(haystack, needle) + } + } + #[cfg(all( + not(miri), + target_arch = "x86_64", + memchr_runtime_simd + ))] + GenericSIMD256(ref gs) => { + // The SIMD matcher can't handle particularly short haystacks, + // so we fall back to RK in these cases. + if haystack.len() < gs.min_haystack_len() { + rabinkarp::find_with(&self.ninfo.nhash, haystack, needle) + } else { + gs.find(haystack, needle) + } + } + } + } + + /// Calls Two-Way on the given haystack/needle. + /// + /// This is marked as unlineable since it seems to have a better overall + /// effect on benchmarks. However, this is one of those cases where + /// inlining it results an improvement in other benchmarks too, so I + /// suspect we just don't have enough data yet to make the right call here. + /// + /// I suspect the main problem is that this function contains two different + /// inlined copies of Two-Way: one with and one without prefilters enabled. + #[inline(never)] + fn find_tw( + &self, + tw: &twoway::Forward, + state: &mut PrefilterState, + haystack: &[u8], + needle: &[u8], + ) -> Option { + if let Some(prefn) = self.prefn { + // We used to look at the length of a haystack here. That is, if + // it was too small, then don't bother with the prefilter. But two + // things changed: the prefilter falls back to memchr for small + // haystacks, and, above, Rabin-Karp is employed for tiny haystacks + // anyway. + if state.is_effective() { + let mut pre = Pre { state, prefn, ninfo: &self.ninfo }; + return tw.find(Some(&mut pre), haystack, needle); + } + } + tw.find(None, haystack, needle) + } +} + +impl NeedleInfo { + pub(crate) fn new(needle: &[u8]) -> NeedleInfo { + NeedleInfo { + rarebytes: RareNeedleBytes::forward(needle), + nhash: NeedleHash::forward(needle), + } + } +} + +/// The internal implementation of a reverse substring searcher. +/// +/// See the forward searcher docs for more details. Currently, the reverse +/// searcher is considerably simpler since it lacks prefilter support. This +/// was done because it adds a lot of code, and more surface area to test. And +/// in particular, it's not clear whether a prefilter on reverse searching is +/// worth it. (If you have a compelling use case, please file an issue!) +#[derive(Clone, Debug)] +struct SearcherRev<'n> { + /// The actual needle we're searching for. + needle: CowBytes<'n>, + /// A Rabin-Karp hash of the needle. + nhash: NeedleHash, + /// The actual substring implementation in use. + kind: SearcherRevKind, +} + +#[derive(Clone, Debug)] +enum SearcherRevKind { + /// A special case for empty needles. An empty needle always matches, even + /// in an empty haystack. + Empty, + /// This is used whenever the needle is a single byte. In this case, we + /// always use memchr. + OneByte(u8), + /// Two-Way is the generic work horse and is what provides our additive + /// linear time guarantee. In general, it's used when the needle is bigger + /// than 8 bytes or so. + TwoWay(twoway::Reverse), +} + +impl<'n> SearcherRev<'n> { + fn new(needle: &'n [u8]) -> SearcherRev<'n> { + use self::SearcherRevKind::*; + + let kind = if needle.len() == 0 { + Empty + } else if needle.len() == 1 { + OneByte(needle[0]) + } else { + TwoWay(twoway::Reverse::new(needle)) + }; + SearcherRev { + needle: CowBytes::new(needle), + nhash: NeedleHash::reverse(needle), + kind, + } + } + + fn needle(&self) -> &[u8] { + self.needle.as_slice() + } + + fn as_ref(&self) -> SearcherRev<'_> { + use self::SearcherRevKind::*; + + let kind = match self.kind { + Empty => Empty, + OneByte(b) => OneByte(b), + TwoWay(tw) => TwoWay(tw), + }; + SearcherRev { + needle: CowBytes::new(self.needle()), + nhash: self.nhash, + kind, + } + } + + #[cfg(feature = "std")] + fn into_owned(self) -> SearcherRev<'static> { + use self::SearcherRevKind::*; + + let kind = match self.kind { + Empty => Empty, + OneByte(b) => OneByte(b), + TwoWay(tw) => TwoWay(tw), + }; + SearcherRev { + needle: self.needle.into_owned(), + nhash: self.nhash, + kind, + } + } + + /// Implements reverse substring search by selecting the implementation + /// chosen at construction and executing it on the given haystack with the + /// prefilter's current state of effectiveness. + #[inline(always)] + fn rfind(&self, haystack: &[u8]) -> Option { + use self::SearcherRevKind::*; + + let needle = self.needle(); + if haystack.len() < needle.len() { + return None; + } + match self.kind { + Empty => Some(haystack.len()), + OneByte(b) => crate::memrchr(b, haystack), + TwoWay(ref tw) => { + // For very short haystacks (e.g., where the prefilter probably + // can't run), it's faster to just run RK. + if rabinkarp::is_fast(haystack, needle) { + rabinkarp::rfind_with(&self.nhash, haystack, needle) + } else { + tw.rfind(haystack, needle) + } + } + } + } +} + +/// This module defines some generic quickcheck properties useful for testing +/// any substring search algorithm. It also runs those properties for the +/// top-level public API memmem routines. (The properties are also used to +/// test various substring search implementations more granularly elsewhere as +/// well.) +#[cfg(all(test, feature = "std", not(miri)))] +mod proptests { + // N.B. This defines the quickcheck tests using the properties defined + // below. Because of macro-visibility weirdness, the actual macro is + // defined at the top of this file. + define_memmem_quickcheck_tests!(super::find, super::rfind); + + /// Check that every prefix of the given byte string is a substring. + pub(crate) fn prefix_is_substring( + reverse: bool, + bs: &[u8], + mut search: impl FnMut(&[u8], &[u8]) -> Option, + ) -> bool { + if bs.is_empty() { + return true; + } + for i in 0..(bs.len() - 1) { + let prefix = &bs[..i]; + if reverse { + assert_eq!(naive_rfind(bs, prefix), search(bs, prefix)); + } else { + assert_eq!(naive_find(bs, prefix), search(bs, prefix)); + } + } + true + } + + /// Check that every suffix of the given byte string is a substring. + pub(crate) fn suffix_is_substring( + reverse: bool, + bs: &[u8], + mut search: impl FnMut(&[u8], &[u8]) -> Option, + ) -> bool { + if bs.is_empty() { + return true; + } + for i in 0..(bs.len() - 1) { + let suffix = &bs[i..]; + if reverse { + assert_eq!(naive_rfind(bs, suffix), search(bs, suffix)); + } else { + assert_eq!(naive_find(bs, suffix), search(bs, suffix)); + } + } + true + } + + /// Check that naive substring search matches the result of the given search + /// algorithm. + pub(crate) fn matches_naive( + reverse: bool, + haystack: &[u8], + needle: &[u8], + mut search: impl FnMut(&[u8], &[u8]) -> Option, + ) -> bool { + if reverse { + naive_rfind(haystack, needle) == search(haystack, needle) + } else { + naive_find(haystack, needle) == search(haystack, needle) + } + } + + /// Naively search forwards for the given needle in the given haystack. + fn naive_find(haystack: &[u8], needle: &[u8]) -> Option { + if needle.is_empty() { + return Some(0); + } else if haystack.len() < needle.len() { + return None; + } + for i in 0..(haystack.len() - needle.len() + 1) { + if needle == &haystack[i..i + needle.len()] { + return Some(i); + } + } + None + } + + /// Naively search in reverse for the given needle in the given haystack. + fn naive_rfind(haystack: &[u8], needle: &[u8]) -> Option { + if needle.is_empty() { + return Some(haystack.len()); + } else if haystack.len() < needle.len() { + return None; + } + for i in (0..(haystack.len() - needle.len() + 1)).rev() { + if needle == &haystack[i..i + needle.len()] { + return Some(i); + } + } + None + } +} + +/// This module defines some hand-written "simple" substring tests. It +/// also provides routines for easily running them on any substring search +/// implementation. #[cfg(test)] -mod tests { - use super::*; +mod testsimples { + define_memmem_simple_tests!(super::find, super::rfind); - define_substring_forward_quickcheck!(|h, n| Some(Finder::new(n).find(h))); - define_substring_reverse_quickcheck!(|h, n| Some( - FinderRev::new(n).rfind(h) - )); - - #[test] - fn forward() { - crate::tests::substring::Runner::new() - .fwd(|h, n| Some(Finder::new(n).find(h))) - .run(); - } - - #[test] - fn reverse() { - crate::tests::substring::Runner::new() - .rev(|h, n| Some(FinderRev::new(n).rfind(h))) - .run(); + /// Each test is a (needle, haystack, expected_fwd, expected_rev) tuple. + type SearchTest = + (&'static str, &'static str, Option, Option); + + const SEARCH_TESTS: &'static [SearchTest] = &[ + ("", "", Some(0), Some(0)), + ("", "a", Some(0), Some(1)), + ("", "ab", Some(0), Some(2)), + ("", "abc", Some(0), Some(3)), + ("a", "", None, None), + ("a", "a", Some(0), Some(0)), + ("a", "aa", Some(0), Some(1)), + ("a", "ba", Some(1), Some(1)), + ("a", "bba", Some(2), Some(2)), + ("a", "bbba", Some(3), Some(3)), + ("a", "bbbab", Some(3), Some(3)), + ("a", "bbbabb", Some(3), Some(3)), + ("a", "bbbabbb", Some(3), Some(3)), + ("a", "bbbbbb", None, None), + ("ab", "", None, None), + ("ab", "a", None, None), + ("ab", "b", None, None), + ("ab", "ab", Some(0), Some(0)), + ("ab", "aab", Some(1), Some(1)), + ("ab", "aaab", Some(2), Some(2)), + ("ab", "abaab", Some(0), Some(3)), + ("ab", "baaab", Some(3), Some(3)), + ("ab", "acb", None, None), + ("ab", "abba", Some(0), Some(0)), + ("abc", "ab", None, None), + ("abc", "abc", Some(0), Some(0)), + ("abc", "abcz", Some(0), Some(0)), + ("abc", "abczz", Some(0), Some(0)), + ("abc", "zabc", Some(1), Some(1)), + ("abc", "zzabc", Some(2), Some(2)), + ("abc", "azbc", None, None), + ("abc", "abzc", None, None), + ("abczdef", "abczdefzzzzzzzzzzzzzzzzzzzz", Some(0), Some(0)), + ("abczdef", "zzzzzzzzzzzzzzzzzzzzabczdef", Some(20), Some(20)), + ("xyz", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxyz", Some(32), Some(32)), + // Failures caught by quickcheck. + ("\u{0}\u{15}", "\u{0}\u{15}\u{15}\u{0}", Some(0), Some(0)), + ("\u{0}\u{1e}", "\u{1e}\u{0}", None, None), + ]; + + /// Run the substring search tests. `search` should be a closure that + /// accepts a haystack and a needle and returns the starting position + /// of the first occurrence of needle in the haystack, or `None` if one + /// doesn't exist. + pub(crate) fn run_search_tests_fwd( + mut search: impl FnMut(&[u8], &[u8]) -> Option, + ) { + for &(needle, haystack, expected_fwd, _) in SEARCH_TESTS { + let (n, h) = (needle.as_bytes(), haystack.as_bytes()); + assert_eq!( + expected_fwd, + search(h, n), + "needle: {:?}, haystack: {:?}, expected: {:?}", + n, + h, + expected_fwd + ); + } + } + + /// Run the substring search tests. `search` should be a closure that + /// accepts a haystack and a needle and returns the starting position of + /// the last occurrence of needle in the haystack, or `None` if one doesn't + /// exist. + pub(crate) fn run_search_tests_rev( + mut search: impl FnMut(&[u8], &[u8]) -> Option, + ) { + for &(needle, haystack, _, expected_rev) in SEARCH_TESTS { + let (n, h) = (needle.as_bytes(), haystack.as_bytes()); + assert_eq!( + expected_rev, + search(h, n), + "needle: {:?}, haystack: {:?}, expected: {:?}", + n, + h, + expected_rev + ); + } } } diff -Nru temporalio-1.3.0/vendor/memchr/src/memmem/prefilter/fallback.rs temporalio-1.3.0/vendor/memchr/src/memmem/prefilter/fallback.rs --- temporalio-1.3.0/vendor/memchr/src/memmem/prefilter/fallback.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/memmem/prefilter/fallback.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,122 @@ +/* +This module implements a "fallback" prefilter that only relies on memchr to +function. While memchr works best when it's explicitly vectorized, its +fallback implementations are fast enough to make a prefilter like this +worthwhile. + +The essence of this implementation is to identify two rare bytes in a needle +based on a background frequency distribution of bytes. We then run memchr on the +rarer byte. For each match, we use the second rare byte as a guard to quickly +check if a match is possible. If the position passes the guard test, then we do +a naive memcmp to confirm the match. + +In practice, this formulation works amazingly well, primarily because of the +heuristic use of a background frequency distribution. However, it does have a +number of weaknesses where it can get quite slow when its background frequency +distribution doesn't line up with the haystack being searched. This is why we +have specialized vector routines that essentially take this idea and move the +guard check into vectorized code. (Those specialized vector routines do still +make use of the background frequency distribution of bytes though.) + +This fallback implementation was originally formulated in regex many moons ago: +https://github.com/rust-lang/regex/blob/3db8722d0b204a85380fe2a65e13d7065d7dd968/src/literal/imp.rs#L370-L501 +Prior to that, I'm not aware of anyone using this technique in any prominent +substring search implementation. Although, I'm sure folks have had this same +insight long before me. + +Another version of this also appeared in bstr: +https://github.com/BurntSushi/bstr/blob/a444256ca7407fe180ee32534688549655b7a38e/src/search/prefilter.rs#L83-L340 +*/ + +use crate::memmem::{ + prefilter::{PrefilterFnTy, PrefilterState}, + NeedleInfo, +}; + +// Check that the functions below satisfy the Prefilter function type. +const _: PrefilterFnTy = find; + +/// Look for a possible occurrence of needle. The position returned +/// corresponds to the beginning of the occurrence, if one exists. +/// +/// Callers may assume that this never returns false negatives (i.e., it +/// never misses an actual occurrence), but must check that the returned +/// position corresponds to a match. That is, it can return false +/// positives. +/// +/// This should only be used when Freqy is constructed for forward +/// searching. +pub(crate) fn find( + prestate: &mut PrefilterState, + ninfo: &NeedleInfo, + haystack: &[u8], + needle: &[u8], +) -> Option { + let mut i = 0; + let (rare1i, rare2i) = ninfo.rarebytes.as_rare_usize(); + let (rare1, rare2) = ninfo.rarebytes.as_rare_bytes(needle); + while prestate.is_effective() { + // Use a fast vectorized implementation to skip to the next + // occurrence of the rarest byte (heuristically chosen) in the + // needle. + let found = crate::memchr(rare1, &haystack[i..])?; + prestate.update(found); + i += found; + + // If we can't align our first match with the haystack, then a + // match is impossible. + if i < rare1i { + i += 1; + continue; + } + + // Align our rare2 byte with the haystack. A mismatch means that + // a match is impossible. + let aligned_rare2i = i - rare1i + rare2i; + if haystack.get(aligned_rare2i) != Some(&rare2) { + i += 1; + continue; + } + + // We've done what we can. There might be a match here. + return Some(i - rare1i); + } + // The only way we get here is if we believe our skipping heuristic + // has become ineffective. We're allowed to return false positives, + // so return the position at which we advanced to, aligned to the + // haystack. + Some(i.saturating_sub(rare1i)) +} + +#[cfg(all(test, feature = "std"))] +mod tests { + use super::*; + + fn freqy_find(haystack: &[u8], needle: &[u8]) -> Option { + let ninfo = NeedleInfo::new(needle); + let mut prestate = PrefilterState::new(); + find(&mut prestate, &ninfo, haystack, needle) + } + + #[test] + fn freqy_forward() { + assert_eq!(Some(0), freqy_find(b"BARFOO", b"BAR")); + assert_eq!(Some(3), freqy_find(b"FOOBAR", b"BAR")); + assert_eq!(Some(0), freqy_find(b"zyzz", b"zyzy")); + assert_eq!(Some(2), freqy_find(b"zzzy", b"zyzy")); + assert_eq!(None, freqy_find(b"zazb", b"zyzy")); + assert_eq!(Some(0), freqy_find(b"yzyy", b"yzyz")); + assert_eq!(Some(2), freqy_find(b"yyyz", b"yzyz")); + assert_eq!(None, freqy_find(b"yayb", b"yzyz")); + } + + #[test] + #[cfg(not(miri))] + fn prefilter_permutations() { + use crate::memmem::prefilter::tests::PrefilterTest; + + // SAFETY: super::find is safe to call for all inputs and on all + // platforms. + unsafe { PrefilterTest::run_all_tests(super::find) }; + } +} diff -Nru temporalio-1.3.0/vendor/memchr/src/memmem/prefilter/genericsimd.rs temporalio-1.3.0/vendor/memchr/src/memmem/prefilter/genericsimd.rs --- temporalio-1.3.0/vendor/memchr/src/memmem/prefilter/genericsimd.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/memmem/prefilter/genericsimd.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,207 @@ +use core::mem::size_of; + +use crate::memmem::{ + prefilter::{PrefilterFnTy, PrefilterState}, + vector::Vector, + NeedleInfo, +}; + +/// The implementation of the forward vector accelerated candidate finder. +/// +/// This is inspired by the "generic SIMD" algorithm described here: +/// http://0x80.pl/articles/simd-strfind.html#algorithm-1-generic-simd +/// +/// The main difference is that this is just a prefilter. That is, it reports +/// candidates once they are seen and doesn't attempt to confirm them. Also, +/// the bytes this routine uses to check for candidates are selected based on +/// an a priori background frequency distribution. This means that on most +/// haystacks, this will on average spend more time in vectorized code than you +/// would if you just selected the first and last bytes of the needle. +/// +/// Note that a non-prefilter variant of this algorithm can be found in the +/// parent module, but it only works on smaller needles. +/// +/// `prestate`, `ninfo`, `haystack` and `needle` are the four prefilter +/// function parameters. `fallback` is a prefilter that is used if the haystack +/// is too small to be handled with the given vector size. +/// +/// This routine is not safe because it is intended for callers to specialize +/// this with a particular vector (e.g., __m256i) and then call it with the +/// relevant target feature (e.g., avx2) enabled. +/// +/// # Panics +/// +/// If `needle.len() <= 1`, then this panics. +/// +/// # Safety +/// +/// Since this is meant to be used with vector functions, callers need to +/// specialize this inside of a function with a `target_feature` attribute. +/// Therefore, callers must ensure that whatever target feature is being used +/// supports the vector functions that this function is specialized for. (For +/// the specific vector functions used, see the Vector trait implementations.) +#[inline(always)] +pub(crate) unsafe fn find( + prestate: &mut PrefilterState, + ninfo: &NeedleInfo, + haystack: &[u8], + needle: &[u8], + fallback: PrefilterFnTy, +) -> Option { + assert!(needle.len() >= 2, "needle must be at least 2 bytes"); + let (rare1i, rare2i) = ninfo.rarebytes.as_rare_ordered_usize(); + let min_haystack_len = rare2i + size_of::(); + if haystack.len() < min_haystack_len { + return fallback(prestate, ninfo, haystack, needle); + } + + let start_ptr = haystack.as_ptr(); + let end_ptr = start_ptr.add(haystack.len()); + let max_ptr = end_ptr.sub(min_haystack_len); + let mut ptr = start_ptr; + + let rare1chunk = V::splat(needle[rare1i]); + let rare2chunk = V::splat(needle[rare2i]); + + // N.B. I did experiment with unrolling the loop to deal with size(V) + // bytes at a time and 2*size(V) bytes at a time. The double unroll + // was marginally faster while the quadruple unroll was unambiguously + // slower. In the end, I decided the complexity from unrolling wasn't + // worth it. I used the memmem/krate/prebuilt/huge-en/ benchmarks to + // compare. + while ptr <= max_ptr { + let m = find_in_chunk2(ptr, rare1i, rare2i, rare1chunk, rare2chunk); + if let Some(chunki) = m { + return Some(matched(prestate, start_ptr, ptr, chunki)); + } + ptr = ptr.add(size_of::()); + } + if ptr < end_ptr { + // This routine immediately quits if a candidate match is found. + // That means that if we're here, no candidate matches have been + // found at or before 'ptr'. Thus, we don't need to mask anything + // out even though we might technically search part of the haystack + // that we've already searched (because we know it can't match). + ptr = max_ptr; + let m = find_in_chunk2(ptr, rare1i, rare2i, rare1chunk, rare2chunk); + if let Some(chunki) = m { + return Some(matched(prestate, start_ptr, ptr, chunki)); + } + } + prestate.update(haystack.len()); + None +} + +// Below are two different techniques for checking whether a candidate +// match exists in a given chunk or not. find_in_chunk2 checks two bytes +// where as find_in_chunk3 checks three bytes. The idea behind checking +// three bytes is that while we do a bit more work per iteration, we +// decrease the chances of a false positive match being reported and thus +// make the search faster overall. This actually works out for the +// memmem/krate/prebuilt/huge-en/never-all-common-bytes benchmark, where +// using find_in_chunk3 is about 25% faster than find_in_chunk2. However, +// it turns out that find_in_chunk2 is faster for all other benchmarks, so +// perhaps the extra check isn't worth it in practice. +// +// For now, we go with find_in_chunk2, but we leave find_in_chunk3 around +// to make it easy to switch to and benchmark when possible. + +/// Search for an occurrence of two rare bytes from the needle in the current +/// chunk pointed to by ptr. +/// +/// rare1chunk and rare2chunk correspond to vectors with the rare1 and rare2 +/// bytes repeated in each 8-bit lane, respectively. +/// +/// # Safety +/// +/// It must be safe to do an unaligned read of size(V) bytes starting at both +/// (ptr + rare1i) and (ptr + rare2i). +#[inline(always)] +unsafe fn find_in_chunk2( + ptr: *const u8, + rare1i: usize, + rare2i: usize, + rare1chunk: V, + rare2chunk: V, +) -> Option { + let chunk0 = V::load_unaligned(ptr.add(rare1i)); + let chunk1 = V::load_unaligned(ptr.add(rare2i)); + + let eq0 = chunk0.cmpeq(rare1chunk); + let eq1 = chunk1.cmpeq(rare2chunk); + + let match_offsets = eq0.and(eq1).movemask(); + if match_offsets == 0 { + return None; + } + Some(match_offsets.trailing_zeros() as usize) +} + +/// Search for an occurrence of two rare bytes and the first byte (even if one +/// of the rare bytes is equivalent to the first byte) from the needle in the +/// current chunk pointed to by ptr. +/// +/// firstchunk, rare1chunk and rare2chunk correspond to vectors with the first, +/// rare1 and rare2 bytes repeated in each 8-bit lane, respectively. +/// +/// # Safety +/// +/// It must be safe to do an unaligned read of size(V) bytes starting at ptr, +/// (ptr + rare1i) and (ptr + rare2i). +#[allow(dead_code)] +#[inline(always)] +unsafe fn find_in_chunk3( + ptr: *const u8, + rare1i: usize, + rare2i: usize, + firstchunk: V, + rare1chunk: V, + rare2chunk: V, +) -> Option { + let chunk0 = V::load_unaligned(ptr); + let chunk1 = V::load_unaligned(ptr.add(rare1i)); + let chunk2 = V::load_unaligned(ptr.add(rare2i)); + + let eq0 = chunk0.cmpeq(firstchunk); + let eq1 = chunk1.cmpeq(rare1chunk); + let eq2 = chunk2.cmpeq(rare2chunk); + + let match_offsets = eq0.and(eq1).and(eq2).movemask(); + if match_offsets == 0 { + return None; + } + Some(match_offsets.trailing_zeros() as usize) +} + +/// Accepts a chunk-relative offset and returns a haystack relative offset +/// after updating the prefilter state. +/// +/// Why do we use this unlineable function when a search completes? Well, +/// I don't know. Really. Obviously this function was not here initially. +/// When doing profiling, the codegen for the inner loop here looked bad and +/// I didn't know why. There were a couple extra 'add' instructions and an +/// extra 'lea' instruction that I couldn't explain. I hypothesized that the +/// optimizer was having trouble untangling the hot code in the loop from the +/// code that deals with a candidate match. By putting the latter into an +/// unlineable function, it kind of forces the issue and it had the intended +/// effect: codegen improved measurably. It's good for a ~10% improvement +/// across the board on the memmem/krate/prebuilt/huge-en/ benchmarks. +#[cold] +#[inline(never)] +fn matched( + prestate: &mut PrefilterState, + start_ptr: *const u8, + ptr: *const u8, + chunki: usize, +) -> usize { + let found = diff(ptr, start_ptr) + chunki; + prestate.update(found); + found +} + +/// Subtract `b` from `a` and return the difference. `a` must be greater than +/// or equal to `b`. +fn diff(a: *const u8, b: *const u8) -> usize { + debug_assert!(a >= b); + (a as usize) - (b as usize) +} diff -Nru temporalio-1.3.0/vendor/memchr/src/memmem/prefilter/mod.rs temporalio-1.3.0/vendor/memchr/src/memmem/prefilter/mod.rs --- temporalio-1.3.0/vendor/memchr/src/memmem/prefilter/mod.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/memmem/prefilter/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,570 @@ +use crate::memmem::{rarebytes::RareNeedleBytes, NeedleInfo}; + +mod fallback; +#[cfg(memchr_runtime_simd)] +mod genericsimd; +#[cfg(all(not(miri), target_arch = "wasm32", memchr_runtime_simd))] +mod wasm; +#[cfg(all(not(miri), target_arch = "x86_64", memchr_runtime_simd))] +mod x86; + +/// The maximum frequency rank permitted for the fallback prefilter. If the +/// rarest byte in the needle has a frequency rank above this value, then no +/// prefilter is used if the fallback prefilter would otherwise be selected. +const MAX_FALLBACK_RANK: usize = 250; + +/// A combination of prefilter effectiveness state, the prefilter function and +/// the needle info required to run a prefilter. +/// +/// For the most part, these are grouped into a single type for convenience, +/// instead of needing to pass around all three as distinct function +/// parameters. +pub(crate) struct Pre<'a> { + /// State that tracks the effectiveness of a prefilter. + pub(crate) state: &'a mut PrefilterState, + /// The actual prefilter function. + pub(crate) prefn: PrefilterFn, + /// Information about a needle, such as its RK hash and rare byte offsets. + pub(crate) ninfo: &'a NeedleInfo, +} + +impl<'a> Pre<'a> { + /// Call this prefilter on the given haystack with the given needle. + #[inline(always)] + pub(crate) fn call( + &mut self, + haystack: &[u8], + needle: &[u8], + ) -> Option { + self.prefn.call(self.state, self.ninfo, haystack, needle) + } + + /// Return true if and only if this prefilter should be used. + #[inline(always)] + pub(crate) fn should_call(&mut self) -> bool { + self.state.is_effective() + } +} + +/// A prefilter function. +/// +/// A prefilter function describes both forward and reverse searches. +/// (Although, we don't currently implement prefilters for reverse searching.) +/// In the case of a forward search, the position returned corresponds to +/// the starting offset of a match (confirmed or possible). Its minimum +/// value is `0`, and its maximum value is `haystack.len() - 1`. In the case +/// of a reverse search, the position returned corresponds to the position +/// immediately after a match (confirmed or possible). Its minimum value is `1` +/// and its maximum value is `haystack.len()`. +/// +/// In both cases, the position returned is the starting (or ending) point of a +/// _possible_ match. That is, returning a false positive is okay. A prefilter, +/// however, must never return any false negatives. That is, if a match exists +/// at a particular position `i`, then a prefilter _must_ return that position. +/// It cannot skip past it. +/// +/// # Safety +/// +/// A prefilter function is not safe to create, since not all prefilters are +/// safe to call in all contexts. (e.g., A prefilter that uses AVX instructions +/// may only be called on x86_64 CPUs with the relevant AVX feature enabled.) +/// Thus, callers must ensure that when a prefilter function is created that it +/// is safe to call for the current environment. +#[derive(Clone, Copy)] +pub(crate) struct PrefilterFn(PrefilterFnTy); + +/// The type of a prefilter function. All prefilters must satisfy this +/// signature. +/// +/// Using a function pointer like this does inhibit inlining, but it does +/// eliminate branching and the extra costs associated with copying a larger +/// enum. Note also, that using Box can't really work +/// here, since we want to work in contexts that don't have dynamic memory +/// allocation. Moreover, in the default configuration of this crate on x86_64 +/// CPUs released in the past ~decade, we will use an AVX2-optimized prefilter, +/// which generally won't be inlineable into the surrounding code anyway. +/// (Unless AVX2 is enabled at compile time, but this is typically rare, since +/// it produces a non-portable binary.) +pub(crate) type PrefilterFnTy = unsafe fn( + prestate: &mut PrefilterState, + ninfo: &NeedleInfo, + haystack: &[u8], + needle: &[u8], +) -> Option; + +// If the haystack is too small for SSE2, then just run memchr on the +// rarest byte and be done with it. (It is likely that this code path is +// rarely exercised, since a higher level routine will probably dispatch to +// Rabin-Karp for such a small haystack.) +#[cfg(memchr_runtime_simd)] +fn simple_memchr_fallback( + _prestate: &mut PrefilterState, + ninfo: &NeedleInfo, + haystack: &[u8], + needle: &[u8], +) -> Option { + let (rare, _) = ninfo.rarebytes.as_rare_ordered_usize(); + crate::memchr(needle[rare], haystack).map(|i| i.saturating_sub(rare)) +} + +impl PrefilterFn { + /// Create a new prefilter function from the function pointer given. + /// + /// # Safety + /// + /// Callers must ensure that the given prefilter function is safe to call + /// for all inputs in the current environment. For example, if the given + /// prefilter function uses AVX instructions, then the caller must ensure + /// that the appropriate AVX CPU features are enabled. + pub(crate) unsafe fn new(prefn: PrefilterFnTy) -> PrefilterFn { + PrefilterFn(prefn) + } + + /// Call the underlying prefilter function with the given arguments. + pub fn call( + self, + prestate: &mut PrefilterState, + ninfo: &NeedleInfo, + haystack: &[u8], + needle: &[u8], + ) -> Option { + // SAFETY: Callers have the burden of ensuring that a prefilter + // function is safe to call for all inputs in the current environment. + unsafe { (self.0)(prestate, ninfo, haystack, needle) } + } +} + +impl core::fmt::Debug for PrefilterFn { + fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result { + "".fmt(f) + } +} + +/// Prefilter controls whether heuristics are used to accelerate searching. +/// +/// A prefilter refers to the idea of detecting candidate matches very quickly, +/// and then confirming whether those candidates are full matches. This +/// idea can be quite effective since it's often the case that looking for +/// candidates can be a lot faster than running a complete substring search +/// over the entire input. Namely, looking for candidates can be done with +/// extremely fast vectorized code. +/// +/// The downside of a prefilter is that it assumes false positives (which are +/// candidates generated by a prefilter that aren't matches) are somewhat rare +/// relative to the frequency of full matches. That is, if a lot of false +/// positives are generated, then it's possible for search time to be worse +/// than if the prefilter wasn't enabled in the first place. +/// +/// Another downside of a prefilter is that it can result in highly variable +/// performance, where some cases are extraordinarily fast and others aren't. +/// Typically, variable performance isn't a problem, but it may be for your use +/// case. +/// +/// The use of prefilters in this implementation does use a heuristic to detect +/// when a prefilter might not be carrying its weight, and will dynamically +/// disable its use. Nevertheless, this configuration option gives callers +/// the ability to disable prefilters if you have knowledge that they won't be +/// useful. +#[derive(Clone, Copy, Debug)] +#[non_exhaustive] +pub enum Prefilter { + /// Never used a prefilter in substring search. + None, + /// Automatically detect whether a heuristic prefilter should be used. If + /// it is used, then heuristics will be used to dynamically disable the + /// prefilter if it is believed to not be carrying its weight. + Auto, +} + +impl Default for Prefilter { + fn default() -> Prefilter { + Prefilter::Auto + } +} + +impl Prefilter { + pub(crate) fn is_none(&self) -> bool { + match *self { + Prefilter::None => true, + _ => false, + } + } +} + +/// PrefilterState tracks state associated with the effectiveness of a +/// prefilter. It is used to track how many bytes, on average, are skipped by +/// the prefilter. If this average dips below a certain threshold over time, +/// then the state renders the prefilter inert and stops using it. +/// +/// A prefilter state should be created for each search. (Where creating an +/// iterator is treated as a single search.) A prefilter state should only be +/// created from a `Freqy`. e.g., An inert `Freqy` will produce an inert +/// `PrefilterState`. +#[derive(Clone, Debug)] +pub(crate) struct PrefilterState { + /// The number of skips that has been executed. This is always 1 greater + /// than the actual number of skips. The special sentinel value of 0 + /// indicates that the prefilter is inert. This is useful to avoid + /// additional checks to determine whether the prefilter is still + /// "effective." Once a prefilter becomes inert, it should no longer be + /// used (according to our heuristics). + skips: u32, + /// The total number of bytes that have been skipped. + skipped: u32, +} + +impl PrefilterState { + /// The minimum number of skip attempts to try before considering whether + /// a prefilter is effective or not. + const MIN_SKIPS: u32 = 50; + + /// The minimum amount of bytes that skipping must average. + /// + /// This value was chosen based on varying it and checking + /// the microbenchmarks. In particular, this can impact the + /// pathological/repeated-{huge,small} benchmarks quite a bit if it's set + /// too low. + const MIN_SKIP_BYTES: u32 = 8; + + /// Create a fresh prefilter state. + pub(crate) fn new() -> PrefilterState { + PrefilterState { skips: 1, skipped: 0 } + } + + /// Create a fresh prefilter state that is always inert. + pub(crate) fn inert() -> PrefilterState { + PrefilterState { skips: 0, skipped: 0 } + } + + /// Update this state with the number of bytes skipped on the last + /// invocation of the prefilter. + #[inline] + pub(crate) fn update(&mut self, skipped: usize) { + self.skips = self.skips.saturating_add(1); + // We need to do this dance since it's technically possible for + // `skipped` to overflow a `u32`. (And we use a `u32` to reduce the + // size of a prefilter state.) + if skipped > core::u32::MAX as usize { + self.skipped = core::u32::MAX; + } else { + self.skipped = self.skipped.saturating_add(skipped as u32); + } + } + + /// Return true if and only if this state indicates that a prefilter is + /// still effective. + #[inline] + pub(crate) fn is_effective(&mut self) -> bool { + if self.is_inert() { + return false; + } + if self.skips() < PrefilterState::MIN_SKIPS { + return true; + } + if self.skipped >= PrefilterState::MIN_SKIP_BYTES * self.skips() { + return true; + } + + // We're inert. + self.skips = 0; + false + } + + #[inline] + fn is_inert(&self) -> bool { + self.skips == 0 + } + + #[inline] + fn skips(&self) -> u32 { + self.skips.saturating_sub(1) + } +} + +/// Determine which prefilter function, if any, to use. +/// +/// This only applies to x86_64 when runtime SIMD detection is enabled (which +/// is the default). In general, we try to use an AVX prefilter, followed by +/// SSE and then followed by a generic one based on memchr. +#[inline(always)] +pub(crate) fn forward( + config: &Prefilter, + rare: &RareNeedleBytes, + needle: &[u8], +) -> Option { + if config.is_none() || needle.len() <= 1 { + return None; + } + + #[cfg(all(not(miri), target_arch = "x86_64", memchr_runtime_simd))] + { + #[cfg(feature = "std")] + { + if cfg!(memchr_runtime_avx) { + if is_x86_feature_detected!("avx2") { + // SAFETY: x86::avx::find only requires the avx2 feature, + // which we've just checked above. + return unsafe { Some(PrefilterFn::new(x86::avx::find)) }; + } + } + } + if cfg!(memchr_runtime_sse2) { + // SAFETY: x86::sse::find only requires the sse2 feature, which is + // guaranteed to be available on x86_64. + return unsafe { Some(PrefilterFn::new(x86::sse::find)) }; + } + } + #[cfg(all(not(miri), target_arch = "wasm32", memchr_runtime_simd))] + { + // SAFETY: `wasm::find` is actually a safe function + // + // Also note that the `if true` is here to prevent, on wasm with simd, + // rustc warning about the code below being dead code. + if true { + return unsafe { Some(PrefilterFn::new(wasm::find)) }; + } + } + // Check that our rarest byte has a reasonably low rank. The main issue + // here is that the fallback prefilter can perform pretty poorly if it's + // given common bytes. So we try to avoid the worst cases here. + let (rare1_rank, _) = rare.as_ranks(needle); + if rare1_rank <= MAX_FALLBACK_RANK { + // SAFETY: fallback::find is safe to call in all environments. + return unsafe { Some(PrefilterFn::new(fallback::find)) }; + } + None +} + +/// Return the minimum length of the haystack in which a prefilter should be +/// used. If the haystack is below this length, then it's probably not worth +/// the overhead of running the prefilter. +/// +/// We used to look at the length of a haystack here. That is, if it was too +/// small, then don't bother with the prefilter. But two things changed: +/// the prefilter falls back to memchr for small haystacks, and, at the +/// meta-searcher level, Rabin-Karp is employed for tiny haystacks anyway. +/// +/// We keep it around for now in case we want to bring it back. +#[allow(dead_code)] +pub(crate) fn minimum_len(_haystack: &[u8], needle: &[u8]) -> usize { + // If the haystack length isn't greater than needle.len() * FACTOR, then + // no prefilter will be used. The presumption here is that since there + // are so few bytes to check, it's not worth running the prefilter since + // there will need to be a validation step anyway. Thus, the prefilter is + // largely redundant work. + // + // Increase the factor noticeably hurts the + // memmem/krate/prebuilt/teeny-*/never-john-watson benchmarks. + const PREFILTER_LENGTH_FACTOR: usize = 2; + const VECTOR_MIN_LENGTH: usize = 16; + let min = core::cmp::max( + VECTOR_MIN_LENGTH, + PREFILTER_LENGTH_FACTOR * needle.len(), + ); + // For haystacks with length==min, we still want to avoid the prefilter, + // so add 1. + min + 1 +} + +#[cfg(all(test, feature = "std", not(miri)))] +pub(crate) mod tests { + use std::convert::{TryFrom, TryInto}; + + use super::*; + use crate::memmem::{ + prefilter::PrefilterFnTy, rabinkarp, rarebytes::RareNeedleBytes, + }; + + // Below is a small jig that generates prefilter tests. The main purpose + // of this jig is to generate tests of varying needle/haystack lengths + // in order to try and exercise all code paths in our prefilters. And in + // particular, this is especially important for vectorized prefilters where + // certain code paths might only be exercised at certain lengths. + + /// A test that represents the input and expected output to a prefilter + /// function. The test should be able to run with any prefilter function + /// and get the expected output. + pub(crate) struct PrefilterTest { + // These fields represent the inputs and expected output of a forwards + // prefilter function. + pub(crate) ninfo: NeedleInfo, + pub(crate) haystack: Vec, + pub(crate) needle: Vec, + pub(crate) output: Option, + } + + impl PrefilterTest { + /// Run all generated forward prefilter tests on the given prefn. + /// + /// # Safety + /// + /// Callers must ensure that the given prefilter function pointer is + /// safe to call for all inputs in the current environment. + pub(crate) unsafe fn run_all_tests(prefn: PrefilterFnTy) { + PrefilterTest::run_all_tests_filter(prefn, |_| true) + } + + /// Run all generated forward prefilter tests that pass the given + /// predicate on the given prefn. + /// + /// # Safety + /// + /// Callers must ensure that the given prefilter function pointer is + /// safe to call for all inputs in the current environment. + pub(crate) unsafe fn run_all_tests_filter( + prefn: PrefilterFnTy, + mut predicate: impl FnMut(&PrefilterTest) -> bool, + ) { + for seed in PREFILTER_TEST_SEEDS { + for test in seed.generate() { + if predicate(&test) { + test.run(prefn); + } + } + } + } + + /// Create a new prefilter test from a seed and some chose offsets to + /// rare bytes in the seed's needle. + /// + /// If a valid test could not be constructed, then None is returned. + /// (Currently, we take the approach of massaging tests to be valid + /// instead of rejecting them outright.) + fn new( + seed: PrefilterTestSeed, + rare1i: usize, + rare2i: usize, + haystack_len: usize, + needle_len: usize, + output: Option, + ) -> Option { + let mut rare1i: u8 = rare1i.try_into().unwrap(); + let mut rare2i: u8 = rare2i.try_into().unwrap(); + // The '#' byte is never used in a haystack (unless we're expecting + // a match), while the '@' byte is never used in a needle. + let mut haystack = vec![b'@'; haystack_len]; + let mut needle = vec![b'#'; needle_len]; + needle[0] = seed.first; + needle[rare1i as usize] = seed.rare1; + needle[rare2i as usize] = seed.rare2; + // If we're expecting a match, then make sure the needle occurs + // in the haystack at the expected position. + if let Some(i) = output { + haystack[i..i + needle.len()].copy_from_slice(&needle); + } + // If the operations above lead to rare offsets pointing to the + // non-first occurrence of a byte, then adjust it. This might lead + // to redundant tests, but it's simpler than trying to change the + // generation process I think. + if let Some(i) = crate::memchr(seed.rare1, &needle) { + rare1i = u8::try_from(i).unwrap(); + } + if let Some(i) = crate::memchr(seed.rare2, &needle) { + rare2i = u8::try_from(i).unwrap(); + } + let ninfo = NeedleInfo { + rarebytes: RareNeedleBytes::new(rare1i, rare2i), + nhash: rabinkarp::NeedleHash::forward(&needle), + }; + Some(PrefilterTest { ninfo, haystack, needle, output }) + } + + /// Run this specific test on the given prefilter function. If the + /// outputs do no match, then this routine panics with a failure + /// message. + /// + /// # Safety + /// + /// Callers must ensure that the given prefilter function pointer is + /// safe to call for all inputs in the current environment. + unsafe fn run(&self, prefn: PrefilterFnTy) { + let mut prestate = PrefilterState::new(); + assert_eq!( + self.output, + prefn( + &mut prestate, + &self.ninfo, + &self.haystack, + &self.needle + ), + "ninfo: {:?}, haystack(len={}): {:?}, needle(len={}): {:?}", + self.ninfo, + self.haystack.len(), + std::str::from_utf8(&self.haystack).unwrap(), + self.needle.len(), + std::str::from_utf8(&self.needle).unwrap(), + ); + } + } + + /// A set of prefilter test seeds. Each seed serves as the base for the + /// generation of many other tests. In essence, the seed captures the + /// "rare" and first bytes among our needle. The tests generated from each + /// seed essentially vary the length of the needle and haystack, while + /// using the rare/first byte configuration from the seed. + /// + /// The purpose of this is to test many different needle/haystack lengths. + /// In particular, some of the vector optimizations might only have bugs + /// in haystacks of a certain size. + const PREFILTER_TEST_SEEDS: &[PrefilterTestSeed] = &[ + PrefilterTestSeed { first: b'x', rare1: b'y', rare2: b'z' }, + PrefilterTestSeed { first: b'x', rare1: b'x', rare2: b'z' }, + PrefilterTestSeed { first: b'x', rare1: b'y', rare2: b'x' }, + PrefilterTestSeed { first: b'x', rare1: b'x', rare2: b'x' }, + PrefilterTestSeed { first: b'x', rare1: b'y', rare2: b'y' }, + ]; + + /// Data that describes a single prefilter test seed. + #[derive(Clone, Copy)] + struct PrefilterTestSeed { + first: u8, + rare1: u8, + rare2: u8, + } + + impl PrefilterTestSeed { + /// Generate a series of prefilter tests from this seed. + fn generate(self) -> impl Iterator { + let len_start = 2; + // The iterator below generates *a lot* of tests. The number of + // tests was chosen somewhat empirically to be "bearable" when + // running the test suite. + // + // We use an iterator here because the collective haystacks of all + // these test cases add up to enough memory to OOM a conservative + // sandbox or a small laptop. + (len_start..=40).flat_map(move |needle_len| { + let rare_start = len_start - 1; + (rare_start..needle_len).flat_map(move |rare1i| { + (rare1i..needle_len).flat_map(move |rare2i| { + (needle_len..=66).flat_map(move |haystack_len| { + PrefilterTest::new( + self, + rare1i, + rare2i, + haystack_len, + needle_len, + None, + ) + .into_iter() + .chain( + (0..=(haystack_len - needle_len)).flat_map( + move |output| { + PrefilterTest::new( + self, + rare1i, + rare2i, + haystack_len, + needle_len, + Some(output), + ) + }, + ), + ) + }) + }) + }) + }) + } + } +} diff -Nru temporalio-1.3.0/vendor/memchr/src/memmem/prefilter/wasm.rs temporalio-1.3.0/vendor/memchr/src/memmem/prefilter/wasm.rs --- temporalio-1.3.0/vendor/memchr/src/memmem/prefilter/wasm.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/memmem/prefilter/wasm.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,39 @@ +use core::arch::wasm32::v128; + +use crate::memmem::{ + prefilter::{PrefilterFnTy, PrefilterState}, + NeedleInfo, +}; + +// Check that the functions below satisfy the Prefilter function type. +const _: PrefilterFnTy = find; + +/// A `v128`-accelerated candidate finder for single-substring search. +#[target_feature(enable = "simd128")] +pub(crate) fn find( + prestate: &mut PrefilterState, + ninfo: &NeedleInfo, + haystack: &[u8], + needle: &[u8], +) -> Option { + unsafe { + super::genericsimd::find::( + prestate, + ninfo, + haystack, + needle, + super::simple_memchr_fallback, + ) + } +} + +#[cfg(all(test, feature = "std"))] +mod tests { + #[test] + #[cfg(not(miri))] + fn prefilter_permutations() { + use crate::memmem::prefilter::tests::PrefilterTest; + // SAFETY: super::find is safe to call for all inputs on x86. + unsafe { PrefilterTest::run_all_tests(super::find) }; + } +} diff -Nru temporalio-1.3.0/vendor/memchr/src/memmem/prefilter/x86/avx.rs temporalio-1.3.0/vendor/memchr/src/memmem/prefilter/x86/avx.rs --- temporalio-1.3.0/vendor/memchr/src/memmem/prefilter/x86/avx.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/memmem/prefilter/x86/avx.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,46 @@ +use core::arch::x86_64::__m256i; + +use crate::memmem::{ + prefilter::{PrefilterFnTy, PrefilterState}, + NeedleInfo, +}; + +// Check that the functions below satisfy the Prefilter function type. +const _: PrefilterFnTy = find; + +/// An AVX2 accelerated candidate finder for single-substring search. +/// +/// # Safety +/// +/// Callers must ensure that the avx2 CPU feature is enabled in the current +/// environment. +#[target_feature(enable = "avx2")] +pub(crate) unsafe fn find( + prestate: &mut PrefilterState, + ninfo: &NeedleInfo, + haystack: &[u8], + needle: &[u8], +) -> Option { + super::super::genericsimd::find::<__m256i>( + prestate, + ninfo, + haystack, + needle, + super::sse::find, + ) +} + +#[cfg(test)] +mod tests { + #[test] + #[cfg(not(miri))] + fn prefilter_permutations() { + use crate::memmem::prefilter::tests::PrefilterTest; + if !is_x86_feature_detected!("avx2") { + return; + } + // SAFETY: The safety of super::find only requires that the current + // CPU support AVX2, which we checked above. + unsafe { PrefilterTest::run_all_tests(super::find) }; + } +} diff -Nru temporalio-1.3.0/vendor/memchr/src/memmem/prefilter/x86/mod.rs temporalio-1.3.0/vendor/memchr/src/memmem/prefilter/x86/mod.rs --- temporalio-1.3.0/vendor/memchr/src/memmem/prefilter/x86/mod.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/memmem/prefilter/x86/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,5 @@ +// We only use AVX when we can detect at runtime whether it's available, which +// requires std. +#[cfg(feature = "std")] +pub(crate) mod avx; +pub(crate) mod sse; diff -Nru temporalio-1.3.0/vendor/memchr/src/memmem/prefilter/x86/sse.rs temporalio-1.3.0/vendor/memchr/src/memmem/prefilter/x86/sse.rs --- temporalio-1.3.0/vendor/memchr/src/memmem/prefilter/x86/sse.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/memmem/prefilter/x86/sse.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,42 @@ +use core::arch::x86_64::__m128i; + +use crate::memmem::{ + prefilter::{PrefilterFnTy, PrefilterState}, + NeedleInfo, +}; + +// Check that the functions below satisfy the Prefilter function type. +const _: PrefilterFnTy = find; + +/// An SSE2 accelerated candidate finder for single-substring search. +/// +/// # Safety +/// +/// Callers must ensure that the sse2 CPU feature is enabled in the current +/// environment. This feature should be enabled in all x86_64 targets. +#[target_feature(enable = "sse2")] +pub(crate) unsafe fn find( + prestate: &mut PrefilterState, + ninfo: &NeedleInfo, + haystack: &[u8], + needle: &[u8], +) -> Option { + super::super::genericsimd::find::<__m128i>( + prestate, + ninfo, + haystack, + needle, + super::super::simple_memchr_fallback, + ) +} + +#[cfg(all(test, feature = "std"))] +mod tests { + #[test] + #[cfg(not(miri))] + fn prefilter_permutations() { + use crate::memmem::prefilter::tests::PrefilterTest; + // SAFETY: super::find is safe to call for all inputs on x86. + unsafe { PrefilterTest::run_all_tests(super::find) }; + } +} diff -Nru temporalio-1.3.0/vendor/memchr/src/memmem/rabinkarp.rs temporalio-1.3.0/vendor/memchr/src/memmem/rabinkarp.rs --- temporalio-1.3.0/vendor/memchr/src/memmem/rabinkarp.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/memmem/rabinkarp.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,233 @@ +/* +This module implements the classical Rabin-Karp substring search algorithm, +with no extra frills. While its use would seem to break our time complexity +guarantee of O(m+n) (RK's time complexity is O(mn)), we are careful to only +ever use RK on a constant subset of haystacks. The main point here is that +RK has good latency properties for small needles/haystacks. It's very quick +to compute a needle hash and zip through the haystack when compared to +initializing Two-Way, for example. And this is especially useful for cases +where the haystack is just too short for vector instructions to do much good. + +The hashing function used here is the same one recommended by ESMAJ. + +Another choice instead of Rabin-Karp would be Shift-Or. But its latency +isn't quite as good since its preprocessing time is a bit more expensive +(both in practice and in theory). However, perhaps Shift-Or has a place +somewhere else for short patterns. I think the main problem is that it +requires space proportional to the alphabet and the needle. If we, for +example, supported needles up to length 16, then the total table size would be +len(alphabet)*size_of::()==512 bytes. Which isn't exactly small, and it's +probably bad to put that on the stack. So ideally, we'd throw it on the heap, +but we'd really like to write as much code without using alloc/std as possible. +But maybe it's worth the special casing. It's a TODO to benchmark. + +Wikipedia has a decent explanation, if a bit heavy on the theory: +https://en.wikipedia.org/wiki/Rabin%E2%80%93Karp_algorithm + +But ESMAJ provides something a bit more concrete: +http://www-igm.univ-mlv.fr/~lecroq/string/node5.html + +Finally, aho-corasick uses Rabin-Karp for multiple pattern match in some cases: +https://github.com/BurntSushi/aho-corasick/blob/3852632f10587db0ff72ef29e88d58bf305a0946/src/packed/rabinkarp.rs +*/ + +/// Whether RK is believed to be very fast for the given needle/haystack. +pub(crate) fn is_fast(haystack: &[u8], _needle: &[u8]) -> bool { + haystack.len() < 16 +} + +/// Search for the first occurrence of needle in haystack using Rabin-Karp. +pub(crate) fn find(haystack: &[u8], needle: &[u8]) -> Option { + find_with(&NeedleHash::forward(needle), haystack, needle) +} + +/// Search for the first occurrence of needle in haystack using Rabin-Karp with +/// a pre-computed needle hash. +pub(crate) fn find_with( + nhash: &NeedleHash, + mut haystack: &[u8], + needle: &[u8], +) -> Option { + if haystack.len() < needle.len() { + return None; + } + let start = haystack.as_ptr() as usize; + let mut hash = Hash::from_bytes_fwd(&haystack[..needle.len()]); + // N.B. I've experimented with unrolling this loop, but couldn't realize + // any obvious gains. + loop { + if nhash.eq(hash) && is_prefix(haystack, needle) { + return Some(haystack.as_ptr() as usize - start); + } + if needle.len() >= haystack.len() { + return None; + } + hash.roll(&nhash, haystack[0], haystack[needle.len()]); + haystack = &haystack[1..]; + } +} + +/// Search for the last occurrence of needle in haystack using Rabin-Karp. +pub(crate) fn rfind(haystack: &[u8], needle: &[u8]) -> Option { + rfind_with(&NeedleHash::reverse(needle), haystack, needle) +} + +/// Search for the last occurrence of needle in haystack using Rabin-Karp with +/// a pre-computed needle hash. +pub(crate) fn rfind_with( + nhash: &NeedleHash, + mut haystack: &[u8], + needle: &[u8], +) -> Option { + if haystack.len() < needle.len() { + return None; + } + let mut hash = + Hash::from_bytes_rev(&haystack[haystack.len() - needle.len()..]); + loop { + if nhash.eq(hash) && is_suffix(haystack, needle) { + return Some(haystack.len() - needle.len()); + } + if needle.len() >= haystack.len() { + return None; + } + hash.roll( + &nhash, + haystack[haystack.len() - 1], + haystack[haystack.len() - needle.len() - 1], + ); + haystack = &haystack[..haystack.len() - 1]; + } +} + +/// A hash derived from a needle. +#[derive(Clone, Copy, Debug, Default)] +pub(crate) struct NeedleHash { + /// The actual hash. + hash: Hash, + /// The factor needed to multiply a byte by in order to subtract it from + /// the hash. It is defined to be 2^(n-1) (using wrapping exponentiation), + /// where n is the length of the needle. This is how we "remove" a byte + /// from the hash once the hash window rolls past it. + hash_2pow: u32, +} + +impl NeedleHash { + /// Create a new Rabin-Karp hash for the given needle for use in forward + /// searching. + pub(crate) fn forward(needle: &[u8]) -> NeedleHash { + let mut nh = NeedleHash { hash: Hash::new(), hash_2pow: 1 }; + if needle.is_empty() { + return nh; + } + nh.hash.add(needle[0]); + for &b in needle.iter().skip(1) { + nh.hash.add(b); + nh.hash_2pow = nh.hash_2pow.wrapping_shl(1); + } + nh + } + + /// Create a new Rabin-Karp hash for the given needle for use in reverse + /// searching. + pub(crate) fn reverse(needle: &[u8]) -> NeedleHash { + let mut nh = NeedleHash { hash: Hash::new(), hash_2pow: 1 }; + if needle.is_empty() { + return nh; + } + nh.hash.add(needle[needle.len() - 1]); + for &b in needle.iter().rev().skip(1) { + nh.hash.add(b); + nh.hash_2pow = nh.hash_2pow.wrapping_shl(1); + } + nh + } + + /// Return true if the hashes are equivalent. + fn eq(&self, hash: Hash) -> bool { + self.hash == hash + } +} + +/// A Rabin-Karp hash. This might represent the hash of a needle, or the hash +/// of a rolling window in the haystack. +#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)] +pub(crate) struct Hash(u32); + +impl Hash { + /// Create a new hash that represents the empty string. + pub(crate) fn new() -> Hash { + Hash(0) + } + + /// Create a new hash from the bytes given for use in forward searches. + pub(crate) fn from_bytes_fwd(bytes: &[u8]) -> Hash { + let mut hash = Hash::new(); + for &b in bytes { + hash.add(b); + } + hash + } + + /// Create a new hash from the bytes given for use in reverse searches. + fn from_bytes_rev(bytes: &[u8]) -> Hash { + let mut hash = Hash::new(); + for &b in bytes.iter().rev() { + hash.add(b); + } + hash + } + + /// Add 'new' and remove 'old' from this hash. The given needle hash should + /// correspond to the hash computed for the needle being searched for. + /// + /// This is meant to be used when the rolling window of the haystack is + /// advanced. + fn roll(&mut self, nhash: &NeedleHash, old: u8, new: u8) { + self.del(nhash, old); + self.add(new); + } + + /// Add a byte to this hash. + fn add(&mut self, byte: u8) { + self.0 = self.0.wrapping_shl(1).wrapping_add(byte as u32); + } + + /// Remove a byte from this hash. The given needle hash should correspond + /// to the hash computed for the needle being searched for. + fn del(&mut self, nhash: &NeedleHash, byte: u8) { + let factor = nhash.hash_2pow; + self.0 = self.0.wrapping_sub((byte as u32).wrapping_mul(factor)); + } +} + +/// Returns true if the given needle is a prefix of the given haystack. +/// +/// We forcefully don't inline the is_prefix call and hint at the compiler that +/// it is unlikely to be called. This causes the inner rabinkarp loop above +/// to be a bit tighter and leads to some performance improvement. See the +/// memmem/krate/prebuilt/sliceslice-words/words benchmark. +#[cold] +#[inline(never)] +fn is_prefix(haystack: &[u8], needle: &[u8]) -> bool { + crate::memmem::util::is_prefix(haystack, needle) +} + +/// Returns true if the given needle is a suffix of the given haystack. +/// +/// See is_prefix for why this is forcefully not inlined. +#[cold] +#[inline(never)] +fn is_suffix(haystack: &[u8], needle: &[u8]) -> bool { + crate::memmem::util::is_suffix(haystack, needle) +} + +#[cfg(test)] +mod simpletests { + define_memmem_simple_tests!(super::find, super::rfind); +} + +#[cfg(all(test, feature = "std", not(miri)))] +mod proptests { + define_memmem_quickcheck_tests!(super::find, super::rfind); +} diff -Nru temporalio-1.3.0/vendor/memchr/src/memmem/rarebytes.rs temporalio-1.3.0/vendor/memchr/src/memmem/rarebytes.rs --- temporalio-1.3.0/vendor/memchr/src/memmem/rarebytes.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/memmem/rarebytes.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,136 @@ +/// A heuristic frequency based detection of rare bytes for substring search. +/// +/// This detector attempts to pick out two bytes in a needle that are predicted +/// to occur least frequently. The purpose is to use these bytes to implement +/// fast candidate search using vectorized code. +/// +/// A set of offsets is only computed for needles of length 2 or greater. +/// Smaller needles should be special cased by the substring search algorithm +/// in use. (e.g., Use memchr for single byte needles.) +/// +/// Note that we use `u8` to represent the offsets of the rare bytes in a +/// needle to reduce space usage. This means that rare byte occurring after the +/// first 255 bytes in a needle will never be used. +#[derive(Clone, Copy, Debug, Default)] +pub(crate) struct RareNeedleBytes { + /// The leftmost offset of the rarest byte in the needle, according to + /// pre-computed frequency analysis. The "leftmost offset" means that + /// rare1i <= i for all i where needle[i] == needle[rare1i]. + rare1i: u8, + /// The leftmost offset of the second rarest byte in the needle, according + /// to pre-computed frequency analysis. The "leftmost offset" means that + /// rare2i <= i for all i where needle[i] == needle[rare2i]. + /// + /// The second rarest byte is used as a type of guard for quickly detecting + /// a mismatch if the first byte matches. This is a hedge against + /// pathological cases where the pre-computed frequency analysis may be + /// off. (But of course, does not prevent *all* pathological cases.) + /// + /// In general, rare1i != rare2i by construction, although there is no hard + /// requirement that they be different. However, since the case of a single + /// byte needle is handled specially by memchr itself, rare2i generally + /// always should be different from rare1i since it would otherwise be + /// ineffective as a guard. + rare2i: u8, +} + +impl RareNeedleBytes { + /// Create a new pair of rare needle bytes with the given offsets. This is + /// only used in tests for generating input data. + #[cfg(all(test, feature = "std"))] + pub(crate) fn new(rare1i: u8, rare2i: u8) -> RareNeedleBytes { + RareNeedleBytes { rare1i, rare2i } + } + + /// Detect the leftmost offsets of the two rarest bytes in the given + /// needle. + pub(crate) fn forward(needle: &[u8]) -> RareNeedleBytes { + if needle.len() <= 1 || needle.len() > core::u8::MAX as usize { + // For needles bigger than u8::MAX, our offsets aren't big enough. + // (We make our offsets small to reduce stack copying.) + // If you have a use case for it, please file an issue. In that + // case, we should probably just adjust the routine below to pick + // some rare bytes from the first 255 bytes of the needle. + // + // Also note that for needles of size 0 or 1, they are special + // cased in Two-Way. + // + // TODO: Benchmar this. + return RareNeedleBytes { rare1i: 0, rare2i: 0 }; + } + + // Find the rarest two bytes. We make them distinct by construction. + let (mut rare1, mut rare1i) = (needle[0], 0); + let (mut rare2, mut rare2i) = (needle[1], 1); + if rank(rare2) < rank(rare1) { + core::mem::swap(&mut rare1, &mut rare2); + core::mem::swap(&mut rare1i, &mut rare2i); + } + for (i, &b) in needle.iter().enumerate().skip(2) { + if rank(b) < rank(rare1) { + rare2 = rare1; + rare2i = rare1i; + rare1 = b; + rare1i = i as u8; + } else if b != rare1 && rank(b) < rank(rare2) { + rare2 = b; + rare2i = i as u8; + } + } + // While not strictly required, we really don't want these to be + // equivalent. If they were, it would reduce the effectiveness of + // candidate searching using these rare bytes by increasing the rate of + // false positives. + assert_ne!(rare1i, rare2i); + RareNeedleBytes { rare1i, rare2i } + } + + /// Return the rare bytes in the given needle in the forward direction. + /// The needle given must be the same one given to the RareNeedleBytes + /// constructor. + pub(crate) fn as_rare_bytes(&self, needle: &[u8]) -> (u8, u8) { + (needle[self.rare1i as usize], needle[self.rare2i as usize]) + } + + /// Return the rare offsets such that the first offset is always <= to the + /// second offset. This is useful when the caller doesn't care whether + /// rare1 is rarer than rare2, but just wants to ensure that they are + /// ordered with respect to one another. + #[cfg(memchr_runtime_simd)] + pub(crate) fn as_rare_ordered_usize(&self) -> (usize, usize) { + let (rare1i, rare2i) = self.as_rare_ordered_u8(); + (rare1i as usize, rare2i as usize) + } + + /// Like as_rare_ordered_usize, but returns the offsets as their native + /// u8 values. + #[cfg(memchr_runtime_simd)] + pub(crate) fn as_rare_ordered_u8(&self) -> (u8, u8) { + if self.rare1i <= self.rare2i { + (self.rare1i, self.rare2i) + } else { + (self.rare2i, self.rare1i) + } + } + + /// Return the rare offsets as usize values in the order in which they were + /// constructed. rare1, for example, is constructed as the "rarer" byte, + /// and thus, callers may want to treat it differently from rare2. + pub(crate) fn as_rare_usize(&self) -> (usize, usize) { + (self.rare1i as usize, self.rare2i as usize) + } + + /// Return the byte frequency rank of each byte. The higher the rank, the + /// more frequency the byte is predicted to be. The needle given must be + /// the same one given to the RareNeedleBytes constructor. + pub(crate) fn as_ranks(&self, needle: &[u8]) -> (usize, usize) { + let (b1, b2) = self.as_rare_bytes(needle); + (rank(b1), rank(b2)) + } +} + +/// Return the heuristical frequency rank of the given byte. A lower rank +/// means the byte is believed to occur less frequently. +fn rank(b: u8) -> usize { + crate::memmem::byte_frequencies::BYTE_FREQUENCIES[b as usize] as usize +} diff -Nru temporalio-1.3.0/vendor/memchr/src/memmem/searcher.rs temporalio-1.3.0/vendor/memchr/src/memmem/searcher.rs --- temporalio-1.3.0/vendor/memchr/src/memmem/searcher.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/memmem/searcher.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,1030 +0,0 @@ -use crate::arch::all::{ - packedpair::{HeuristicFrequencyRank, Pair}, - rabinkarp, twoway, -}; - -#[cfg(target_arch = "aarch64")] -use crate::arch::aarch64::neon::packedpair as neon; -#[cfg(target_arch = "wasm32")] -use crate::arch::wasm32::simd128::packedpair as simd128; -#[cfg(all(target_arch = "x86_64", target_feature = "sse2"))] -use crate::arch::x86_64::{ - avx2::packedpair as avx2, sse2::packedpair as sse2, -}; - -/// A "meta" substring searcher. -/// -/// To a first approximation, this chooses what it believes to be the "best" -/// substring search implemnetation based on the needle at construction time. -/// Then, every call to `find` will execute that particular implementation. To -/// a second approximation, multiple substring search algorithms may be used, -/// depending on the haystack. For example, for supremely short haystacks, -/// Rabin-Karp is typically used. -/// -/// See the documentation on `Prefilter` for an explanation of the dispatching -/// mechanism. The quick summary is that an enum has too much overhead and -/// we can't use dynamic dispatch via traits because we need to work in a -/// core-only environment. (Dynamic dispatch works in core-only, but you -/// need `&dyn Trait` and we really need a `Box` here. The latter -/// requires `alloc`.) So instead, we use a union and an appropriately paired -/// free function to read from the correct field on the union and execute the -/// chosen substring search implementation. -#[derive(Clone)] -pub(crate) struct Searcher { - call: SearcherKindFn, - kind: SearcherKind, - rabinkarp: rabinkarp::Finder, -} - -impl Searcher { - /// Creates a new "meta" substring searcher that attempts to choose the - /// best algorithm based on the needle, heuristics and what the current - /// target supports. - #[inline] - pub(crate) fn new( - prefilter: PrefilterConfig, - ranker: R, - needle: &[u8], - ) -> Searcher { - let rabinkarp = rabinkarp::Finder::new(needle); - if needle.len() <= 1 { - return if needle.is_empty() { - trace!("building empty substring searcher"); - Searcher { - call: searcher_kind_empty, - kind: SearcherKind { empty: () }, - rabinkarp, - } - } else { - trace!("building one-byte substring searcher"); - debug_assert_eq!(1, needle.len()); - Searcher { - call: searcher_kind_one_byte, - kind: SearcherKind { one_byte: needle[0] }, - rabinkarp, - } - }; - } - let pair = match Pair::with_ranker(needle, &ranker) { - Some(pair) => pair, - None => return Searcher::twoway(needle, rabinkarp, None), - }; - debug_assert_ne!( - pair.index1(), - pair.index2(), - "pair offsets should not be equivalent" - ); - #[cfg(all(target_arch = "x86_64", target_feature = "sse2"))] - { - if let Some(pp) = avx2::Finder::with_pair(needle, pair) { - if do_packed_search(needle) { - trace!("building x86_64 AVX2 substring searcher"); - let kind = SearcherKind { avx2: pp }; - Searcher { call: searcher_kind_avx2, kind, rabinkarp } - } else if prefilter.is_none() { - Searcher::twoway(needle, rabinkarp, None) - } else { - let prestrat = Prefilter::avx2(pp, needle); - Searcher::twoway(needle, rabinkarp, Some(prestrat)) - } - } else if let Some(pp) = sse2::Finder::with_pair(needle, pair) { - if do_packed_search(needle) { - trace!("building x86_64 SSE2 substring searcher"); - let kind = SearcherKind { sse2: pp }; - Searcher { call: searcher_kind_sse2, kind, rabinkarp } - } else if prefilter.is_none() { - Searcher::twoway(needle, rabinkarp, None) - } else { - let prestrat = Prefilter::sse2(pp, needle); - Searcher::twoway(needle, rabinkarp, Some(prestrat)) - } - } else if prefilter.is_none() { - Searcher::twoway(needle, rabinkarp, None) - } else { - // We're pretty unlikely to get to this point, but it is - // possible to be running on x86_64 without SSE2. Namely, it's - // really up to the OS whether it wants to support vector - // registers or not. - let prestrat = Prefilter::fallback(ranker, pair, needle); - Searcher::twoway(needle, rabinkarp, prestrat) - } - } - #[cfg(target_arch = "wasm32")] - { - if let Some(pp) = simd128::Finder::with_pair(needle, pair) { - if do_packed_search(needle) { - trace!("building wasm32 simd128 substring searcher"); - let kind = SearcherKind { simd128: pp }; - Searcher { call: searcher_kind_simd128, kind, rabinkarp } - } else if prefilter.is_none() { - Searcher::twoway(needle, rabinkarp, None) - } else { - let prestrat = Prefilter::simd128(pp, needle); - Searcher::twoway(needle, rabinkarp, Some(prestrat)) - } - } else if prefilter.is_none() { - Searcher::twoway(needle, rabinkarp, None) - } else { - let prestrat = Prefilter::fallback(ranker, pair, needle); - Searcher::twoway(needle, rabinkarp, prestrat) - } - } - #[cfg(target_arch = "aarch64")] - { - if let Some(pp) = neon::Finder::with_pair(needle, pair) { - if do_packed_search(needle) { - trace!("building aarch64 neon substring searcher"); - let kind = SearcherKind { neon: pp }; - Searcher { call: searcher_kind_neon, kind, rabinkarp } - } else if prefilter.is_none() { - Searcher::twoway(needle, rabinkarp, None) - } else { - let prestrat = Prefilter::neon(pp, needle); - Searcher::twoway(needle, rabinkarp, Some(prestrat)) - } - } else if prefilter.is_none() { - Searcher::twoway(needle, rabinkarp, None) - } else { - let prestrat = Prefilter::fallback(ranker, pair, needle); - Searcher::twoway(needle, rabinkarp, prestrat) - } - } - #[cfg(not(any( - all(target_arch = "x86_64", target_feature = "sse2"), - target_arch = "wasm32", - target_arch = "aarch64" - )))] - { - if prefilter.is_none() { - Searcher::twoway(needle, rabinkarp, None) - } else { - let prestrat = Prefilter::fallback(ranker, pair, needle); - Searcher::twoway(needle, rabinkarp, prestrat) - } - } - } - - /// Creates a new searcher that always uses the Two-Way algorithm. This is - /// typically used when vector algorithms are unavailable or inappropriate. - /// (For example, when the needle is "too long.") - /// - /// If a prefilter is given, then the searcher returned will be accelerated - /// by the prefilter. - #[inline] - fn twoway( - needle: &[u8], - rabinkarp: rabinkarp::Finder, - prestrat: Option, - ) -> Searcher { - let finder = twoway::Finder::new(needle); - match prestrat { - None => { - trace!("building scalar two-way substring searcher"); - let kind = SearcherKind { two_way: finder }; - Searcher { call: searcher_kind_two_way, kind, rabinkarp } - } - Some(prestrat) => { - trace!( - "building scalar two-way \ - substring searcher with a prefilter" - ); - let two_way_with_prefilter = - TwoWayWithPrefilter { finder, prestrat }; - let kind = SearcherKind { two_way_with_prefilter }; - Searcher { - call: searcher_kind_two_way_with_prefilter, - kind, - rabinkarp, - } - } - } - } - - /// Searches the given haystack for the given needle. The needle given - /// should be the same as the needle that this finder was initialized - /// with. - /// - /// Inlining this can lead to big wins for latency, and #[inline] doesn't - /// seem to be enough in some cases. - #[inline(always)] - pub(crate) fn find( - &self, - prestate: &mut PrefilterState, - haystack: &[u8], - needle: &[u8], - ) -> Option { - if haystack.len() < needle.len() { - None - } else { - // SAFETY: By construction, we've ensured that the function - // in `self.call` is properly paired with the union used in - // `self.kind`. - unsafe { (self.call)(self, prestate, haystack, needle) } - } - } -} - -impl core::fmt::Debug for Searcher { - fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result { - f.debug_struct("Searcher") - .field("call", &"") - .field("kind", &"") - .field("rabinkarp", &self.rabinkarp) - .finish() - } -} - -/// A union indicating one of several possible substring search implementations -/// that are in active use. -/// -/// This union should only be read by one of the functions prefixed with -/// `searcher_kind_`. Namely, the correct function is meant to be paired with -/// the union by the caller, such that the function always reads from the -/// designated union field. -#[derive(Clone, Copy)] -union SearcherKind { - empty: (), - one_byte: u8, - two_way: twoway::Finder, - two_way_with_prefilter: TwoWayWithPrefilter, - #[cfg(all(target_arch = "x86_64", target_feature = "sse2"))] - sse2: crate::arch::x86_64::sse2::packedpair::Finder, - #[cfg(all(target_arch = "x86_64", target_feature = "sse2"))] - avx2: crate::arch::x86_64::avx2::packedpair::Finder, - #[cfg(target_arch = "wasm32")] - simd128: crate::arch::wasm32::simd128::packedpair::Finder, - #[cfg(target_arch = "aarch64")] - neon: crate::arch::aarch64::neon::packedpair::Finder, -} - -/// A two-way substring searcher with a prefilter. -#[derive(Copy, Clone, Debug)] -struct TwoWayWithPrefilter { - finder: twoway::Finder, - prestrat: Prefilter, -} - -/// The type of a substring search function. -/// -/// # Safety -/// -/// When using a function of this type, callers must ensure that the correct -/// function is paired with the value populated in `SearcherKind` union. -type SearcherKindFn = unsafe fn( - searcher: &Searcher, - prestate: &mut PrefilterState, - haystack: &[u8], - needle: &[u8], -) -> Option; - -/// Reads from the `empty` field of `SearcherKind` to handle the case of -/// searching for the empty needle. Works on all platforms. -/// -/// # Safety -/// -/// Callers must ensure that the `searcher.kind.empty` union field is set. -unsafe fn searcher_kind_empty( - _searcher: &Searcher, - _prestate: &mut PrefilterState, - _haystack: &[u8], - _needle: &[u8], -) -> Option { - Some(0) -} - -/// Reads from the `one_byte` field of `SearcherKind` to handle the case of -/// searching for a single byte needle. Works on all platforms. -/// -/// # Safety -/// -/// Callers must ensure that the `searcher.kind.one_byte` union field is set. -unsafe fn searcher_kind_one_byte( - searcher: &Searcher, - _prestate: &mut PrefilterState, - haystack: &[u8], - _needle: &[u8], -) -> Option { - let needle = searcher.kind.one_byte; - crate::memchr(needle, haystack) -} - -/// Reads from the `two_way` field of `SearcherKind` to handle the case of -/// searching for an arbitrary needle without prefilter acceleration. Works on -/// all platforms. -/// -/// # Safety -/// -/// Callers must ensure that the `searcher.kind.two_way` union field is set. -unsafe fn searcher_kind_two_way( - searcher: &Searcher, - _prestate: &mut PrefilterState, - haystack: &[u8], - needle: &[u8], -) -> Option { - if rabinkarp::is_fast(haystack, needle) { - searcher.rabinkarp.find(haystack, needle) - } else { - searcher.kind.two_way.find(haystack, needle) - } -} - -/// Reads from the `two_way_with_prefilter` field of `SearcherKind` to handle -/// the case of searching for an arbitrary needle with prefilter acceleration. -/// Works on all platforms. -/// -/// # Safety -/// -/// Callers must ensure that the `searcher.kind.two_way_with_prefilter` union -/// field is set. -unsafe fn searcher_kind_two_way_with_prefilter( - searcher: &Searcher, - prestate: &mut PrefilterState, - haystack: &[u8], - needle: &[u8], -) -> Option { - if rabinkarp::is_fast(haystack, needle) { - searcher.rabinkarp.find(haystack, needle) - } else { - let TwoWayWithPrefilter { ref finder, ref prestrat } = - searcher.kind.two_way_with_prefilter; - let pre = Pre { prestate, prestrat }; - finder.find_with_prefilter(Some(pre), haystack, needle) - } -} - -/// Reads from the `sse2` field of `SearcherKind` to execute the x86_64 SSE2 -/// vectorized substring search implementation. -/// -/// # Safety -/// -/// Callers must ensure that the `searcher.kind.sse2` union field is set. -#[cfg(all(target_arch = "x86_64", target_feature = "sse2"))] -unsafe fn searcher_kind_sse2( - searcher: &Searcher, - _prestate: &mut PrefilterState, - haystack: &[u8], - needle: &[u8], -) -> Option { - let finder = &searcher.kind.sse2; - if haystack.len() < finder.min_haystack_len() { - searcher.rabinkarp.find(haystack, needle) - } else { - finder.find(haystack, needle) - } -} - -/// Reads from the `avx2` field of `SearcherKind` to execute the x86_64 AVX2 -/// vectorized substring search implementation. -/// -/// # Safety -/// -/// Callers must ensure that the `searcher.kind.avx2` union field is set. -#[cfg(all(target_arch = "x86_64", target_feature = "sse2"))] -unsafe fn searcher_kind_avx2( - searcher: &Searcher, - _prestate: &mut PrefilterState, - haystack: &[u8], - needle: &[u8], -) -> Option { - let finder = &searcher.kind.avx2; - if haystack.len() < finder.min_haystack_len() { - searcher.rabinkarp.find(haystack, needle) - } else { - finder.find(haystack, needle) - } -} - -/// Reads from the `simd128` field of `SearcherKind` to execute the wasm32 -/// simd128 vectorized substring search implementation. -/// -/// # Safety -/// -/// Callers must ensure that the `searcher.kind.simd128` union field is set. -#[cfg(target_arch = "wasm32")] -unsafe fn searcher_kind_simd128( - searcher: &Searcher, - _prestate: &mut PrefilterState, - haystack: &[u8], - needle: &[u8], -) -> Option { - let finder = &searcher.kind.simd128; - if haystack.len() < finder.min_haystack_len() { - searcher.rabinkarp.find(haystack, needle) - } else { - finder.find(haystack, needle) - } -} - -/// Reads from the `neon` field of `SearcherKind` to execute the aarch64 neon -/// vectorized substring search implementation. -/// -/// # Safety -/// -/// Callers must ensure that the `searcher.kind.neon` union field is set. -#[cfg(target_arch = "aarch64")] -unsafe fn searcher_kind_neon( - searcher: &Searcher, - _prestate: &mut PrefilterState, - haystack: &[u8], - needle: &[u8], -) -> Option { - let finder = &searcher.kind.neon; - if haystack.len() < finder.min_haystack_len() { - searcher.rabinkarp.find(haystack, needle) - } else { - finder.find(haystack, needle) - } -} - -/// A reverse substring searcher. -#[derive(Clone, Debug)] -pub(crate) struct SearcherRev { - kind: SearcherRevKind, - rabinkarp: rabinkarp::FinderRev, -} - -/// The kind of the reverse searcher. -/// -/// For the reverse case, we don't do any SIMD acceleration or prefilters. -/// There is no specific technical reason why we don't, but rather don't do it -/// because it's not clear it's worth the extra code to do so. If you have a -/// use case for it, please file an issue. -/// -/// We also don't do the union trick as we do with the forward case and -/// prefilters. Basically for the same reason we don't have prefilters or -/// vector algorithms for reverse searching: it's not clear it's worth doing. -/// Please file an issue if you have a compelling use case for fast reverse -/// substring search. -#[derive(Clone, Debug)] -enum SearcherRevKind { - Empty, - OneByte { needle: u8 }, - TwoWay { finder: twoway::FinderRev }, -} - -impl SearcherRev { - /// Creates a new searcher for finding occurrences of the given needle in - /// reverse. That is, it reports the last (instead of the first) occurrence - /// of a needle in a haystack. - #[inline] - pub(crate) fn new(needle: &[u8]) -> SearcherRev { - let kind = if needle.len() <= 1 { - if needle.is_empty() { - trace!("building empty reverse substring searcher"); - SearcherRevKind::Empty - } else { - trace!("building one-byte reverse substring searcher"); - debug_assert_eq!(1, needle.len()); - SearcherRevKind::OneByte { needle: needle[0] } - } - } else { - trace!("building scalar two-way reverse substring searcher"); - let finder = twoway::FinderRev::new(needle); - SearcherRevKind::TwoWay { finder } - }; - let rabinkarp = rabinkarp::FinderRev::new(needle); - SearcherRev { kind, rabinkarp } - } - - /// Searches the given haystack for the last occurrence of the given - /// needle. The needle given should be the same as the needle that this - /// finder was initialized with. - #[inline] - pub(crate) fn rfind( - &self, - haystack: &[u8], - needle: &[u8], - ) -> Option { - if haystack.len() < needle.len() { - return None; - } - match self.kind { - SearcherRevKind::Empty => Some(haystack.len()), - SearcherRevKind::OneByte { needle } => { - crate::memrchr(needle, haystack) - } - SearcherRevKind::TwoWay { ref finder } => { - if rabinkarp::is_fast(haystack, needle) { - self.rabinkarp.rfind(haystack, needle) - } else { - finder.rfind(haystack, needle) - } - } - } - } -} - -/// Prefilter controls whether heuristics are used to accelerate searching. -/// -/// A prefilter refers to the idea of detecting candidate matches very quickly, -/// and then confirming whether those candidates are full matches. This -/// idea can be quite effective since it's often the case that looking for -/// candidates can be a lot faster than running a complete substring search -/// over the entire input. Namely, looking for candidates can be done with -/// extremely fast vectorized code. -/// -/// The downside of a prefilter is that it assumes false positives (which are -/// candidates generated by a prefilter that aren't matches) are somewhat rare -/// relative to the frequency of full matches. That is, if a lot of false -/// positives are generated, then it's possible for search time to be worse -/// than if the prefilter wasn't enabled in the first place. -/// -/// Another downside of a prefilter is that it can result in highly variable -/// performance, where some cases are extraordinarily fast and others aren't. -/// Typically, variable performance isn't a problem, but it may be for your use -/// case. -/// -/// The use of prefilters in this implementation does use a heuristic to detect -/// when a prefilter might not be carrying its weight, and will dynamically -/// disable its use. Nevertheless, this configuration option gives callers -/// the ability to disable prefilters if you have knowledge that they won't be -/// useful. -#[derive(Clone, Copy, Debug)] -#[non_exhaustive] -pub enum PrefilterConfig { - /// Never used a prefilter in substring search. - None, - /// Automatically detect whether a heuristic prefilter should be used. If - /// it is used, then heuristics will be used to dynamically disable the - /// prefilter if it is believed to not be carrying its weight. - Auto, -} - -impl Default for PrefilterConfig { - fn default() -> PrefilterConfig { - PrefilterConfig::Auto - } -} - -impl PrefilterConfig { - /// Returns true when this prefilter is set to the `None` variant. - fn is_none(&self) -> bool { - matches!(*self, PrefilterConfig::None) - } -} - -/// The implementation of a prefilter. -/// -/// This type encapsulates dispatch to one of several possible choices for a -/// prefilter. Generally speaking, all prefilters have the same approximate -/// algorithm: they choose a couple of bytes from the needle that are believed -/// to be rare, use a fast vector algorithm to look for those bytes and return -/// positions as candidates for some substring search algorithm (currently only -/// Two-Way) to confirm as a match or not. -/// -/// The differences between the algorithms are actually at the vector -/// implementation level. Namely, we need different routines based on both -/// which target architecture we're on and what CPU features are supported. -/// -/// The straight-forwardly obvious approach here is to use an enum, and make -/// `Prefilter::find` do case analysis to determine which algorithm was -/// selected and invoke it. However, I've observed that this leads to poor -/// codegen in some cases, especially in latency sensitive benchmarks. That is, -/// this approach comes with overhead that I wasn't able to eliminate. -/// -/// The second obvious approach is to use dynamic dispatch with traits. Doing -/// that in this context where `Prefilter` owns the selection generally -/// requires heap allocation, and this code is designed to run in core-only -/// environments. -/// -/// So we settle on using a union (that's `PrefilterKind`) and a function -/// pointer (that's `PrefilterKindFn`). We select the right function pointer -/// based on which field in the union we set, and that function in turn -/// knows which field of the union to access. The downside of this approach -/// is that it forces us to think about safety, but the upside is that -/// there are some nice latency improvements to benchmarks. (Especially the -/// `memmem/sliceslice/short` benchmark.) -/// -/// In cases where we've selected a vector algorithm and the haystack given -/// is too short, we fallback to the scalar version of `memchr` on the -/// `rarest_byte`. (The scalar version of `memchr` is still better than a naive -/// byte-at-a-time loop because it will read in `usize`-sized chunks at a -/// time.) -#[derive(Clone, Copy)] -struct Prefilter { - call: PrefilterKindFn, - kind: PrefilterKind, - rarest_byte: u8, - rarest_offset: u8, -} - -impl Prefilter { - /// Return a "fallback" prefilter, but only if it is believed to be - /// effective. - #[inline] - fn fallback( - ranker: R, - pair: Pair, - needle: &[u8], - ) -> Option { - /// The maximum frequency rank permitted for the fallback prefilter. - /// If the rarest byte in the needle has a frequency rank above this - /// value, then no prefilter is used if the fallback prefilter would - /// otherwise be selected. - const MAX_FALLBACK_RANK: u8 = 250; - - trace!("building fallback prefilter"); - let rarest_offset = pair.index1(); - let rarest_byte = needle[usize::from(rarest_offset)]; - let rarest_rank = ranker.rank(rarest_byte); - if rarest_rank > MAX_FALLBACK_RANK { - None - } else { - let finder = crate::arch::all::packedpair::Finder::with_pair( - needle, - pair.clone(), - )?; - let call = prefilter_kind_fallback; - let kind = PrefilterKind { fallback: finder }; - Some(Prefilter { call, kind, rarest_byte, rarest_offset }) - } - } - - /// Return a prefilter using a x86_64 SSE2 vector algorithm. - #[cfg(all(target_arch = "x86_64", target_feature = "sse2"))] - #[inline] - fn sse2(finder: sse2::Finder, needle: &[u8]) -> Prefilter { - trace!("building x86_64 SSE2 prefilter"); - let rarest_offset = finder.pair().index1(); - let rarest_byte = needle[usize::from(rarest_offset)]; - Prefilter { - call: prefilter_kind_sse2, - kind: PrefilterKind { sse2: finder }, - rarest_byte, - rarest_offset, - } - } - - /// Return a prefilter using a x86_64 AVX2 vector algorithm. - #[cfg(all(target_arch = "x86_64", target_feature = "sse2"))] - #[inline] - fn avx2(finder: avx2::Finder, needle: &[u8]) -> Prefilter { - trace!("building x86_64 AVX2 prefilter"); - let rarest_offset = finder.pair().index1(); - let rarest_byte = needle[usize::from(rarest_offset)]; - Prefilter { - call: prefilter_kind_avx2, - kind: PrefilterKind { avx2: finder }, - rarest_byte, - rarest_offset, - } - } - - /// Return a prefilter using a wasm32 simd128 vector algorithm. - #[cfg(target_arch = "wasm32")] - #[inline] - fn simd128(finder: simd128::Finder, needle: &[u8]) -> Prefilter { - trace!("building wasm32 simd128 prefilter"); - let rarest_offset = finder.pair().index1(); - let rarest_byte = needle[usize::from(rarest_offset)]; - Prefilter { - call: prefilter_kind_simd128, - kind: PrefilterKind { simd128: finder }, - rarest_byte, - rarest_offset, - } - } - - /// Return a prefilter using a aarch64 neon vector algorithm. - #[cfg(target_arch = "aarch64")] - #[inline] - fn neon(finder: neon::Finder, needle: &[u8]) -> Prefilter { - trace!("building aarch64 neon prefilter"); - let rarest_offset = finder.pair().index1(); - let rarest_byte = needle[usize::from(rarest_offset)]; - Prefilter { - call: prefilter_kind_neon, - kind: PrefilterKind { neon: finder }, - rarest_byte, - rarest_offset, - } - } - - /// Return a *candidate* position for a match. - /// - /// When this returns an offset, it implies that a match could begin at - /// that offset, but it may not. That is, it is possible for a false - /// positive to be returned. - /// - /// When `None` is returned, then it is guaranteed that there are no - /// matches for the needle in the given haystack. That is, it is impossible - /// for a false negative to be returned. - /// - /// The purpose of this routine is to look for candidate matching positions - /// as quickly as possible before running a (likely) slower confirmation - /// step. - #[inline] - fn find(&self, haystack: &[u8]) -> Option { - // SAFETY: By construction, we've ensured that the function in - // `self.call` is properly paired with the union used in `self.kind`. - unsafe { (self.call)(self, haystack) } - } - - /// A "simple" prefilter that just looks for the occurrence of the rarest - /// byte from the needle. This is generally only used for very small - /// haystacks. - #[inline] - fn find_simple(&self, haystack: &[u8]) -> Option { - // We don't use crate::memchr here because the haystack should be small - // enough that memchr won't be able to use vector routines anyway. So - // we just skip straight to the fallback implementation which is likely - // faster. (A byte-at-a-time loop is only used when the haystack is - // smaller than `size_of::()`.) - crate::arch::all::memchr::One::new(self.rarest_byte) - .find(haystack) - .map(|i| i.saturating_sub(usize::from(self.rarest_offset))) - } -} - -impl core::fmt::Debug for Prefilter { - fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result { - f.debug_struct("Prefilter") - .field("call", &"") - .field("kind", &"") - .field("rarest_byte", &self.rarest_byte) - .field("rarest_offset", &self.rarest_offset) - .finish() - } -} - -/// A union indicating one of several possible prefilters that are in active -/// use. -/// -/// This union should only be read by one of the functions prefixed with -/// `prefilter_kind_`. Namely, the correct function is meant to be paired with -/// the union by the caller, such that the function always reads from the -/// designated union field. -#[derive(Clone, Copy)] -union PrefilterKind { - fallback: crate::arch::all::packedpair::Finder, - #[cfg(all(target_arch = "x86_64", target_feature = "sse2"))] - sse2: crate::arch::x86_64::sse2::packedpair::Finder, - #[cfg(all(target_arch = "x86_64", target_feature = "sse2"))] - avx2: crate::arch::x86_64::avx2::packedpair::Finder, - #[cfg(target_arch = "wasm32")] - simd128: crate::arch::wasm32::simd128::packedpair::Finder, - #[cfg(target_arch = "aarch64")] - neon: crate::arch::aarch64::neon::packedpair::Finder, -} - -/// The type of a prefilter function. -/// -/// # Safety -/// -/// When using a function of this type, callers must ensure that the correct -/// function is paired with the value populated in `PrefilterKind` union. -type PrefilterKindFn = - unsafe fn(strat: &Prefilter, haystack: &[u8]) -> Option; - -/// Reads from the `fallback` field of `PrefilterKind` to execute the fallback -/// prefilter. Works on all platforms. -/// -/// # Safety -/// -/// Callers must ensure that the `strat.kind.fallback` union field is set. -unsafe fn prefilter_kind_fallback( - strat: &Prefilter, - haystack: &[u8], -) -> Option { - strat.kind.fallback.find_prefilter(haystack) -} - -/// Reads from the `sse2` field of `PrefilterKind` to execute the x86_64 SSE2 -/// prefilter. -/// -/// # Safety -/// -/// Callers must ensure that the `strat.kind.sse2` union field is set. -#[cfg(all(target_arch = "x86_64", target_feature = "sse2"))] -unsafe fn prefilter_kind_sse2( - strat: &Prefilter, - haystack: &[u8], -) -> Option { - let finder = &strat.kind.sse2; - if haystack.len() < finder.min_haystack_len() { - strat.find_simple(haystack) - } else { - finder.find_prefilter(haystack) - } -} - -/// Reads from the `avx2` field of `PrefilterKind` to execute the x86_64 AVX2 -/// prefilter. -/// -/// # Safety -/// -/// Callers must ensure that the `strat.kind.avx2` union field is set. -#[cfg(all(target_arch = "x86_64", target_feature = "sse2"))] -unsafe fn prefilter_kind_avx2( - strat: &Prefilter, - haystack: &[u8], -) -> Option { - let finder = &strat.kind.avx2; - if haystack.len() < finder.min_haystack_len() { - strat.find_simple(haystack) - } else { - finder.find_prefilter(haystack) - } -} - -/// Reads from the `simd128` field of `PrefilterKind` to execute the wasm32 -/// simd128 prefilter. -/// -/// # Safety -/// -/// Callers must ensure that the `strat.kind.simd128` union field is set. -#[cfg(target_arch = "wasm32")] -unsafe fn prefilter_kind_simd128( - strat: &Prefilter, - haystack: &[u8], -) -> Option { - let finder = &strat.kind.simd128; - if haystack.len() < finder.min_haystack_len() { - strat.find_simple(haystack) - } else { - finder.find_prefilter(haystack) - } -} - -/// Reads from the `neon` field of `PrefilterKind` to execute the aarch64 neon -/// prefilter. -/// -/// # Safety -/// -/// Callers must ensure that the `strat.kind.neon` union field is set. -#[cfg(target_arch = "aarch64")] -unsafe fn prefilter_kind_neon( - strat: &Prefilter, - haystack: &[u8], -) -> Option { - let finder = &strat.kind.neon; - if haystack.len() < finder.min_haystack_len() { - strat.find_simple(haystack) - } else { - finder.find_prefilter(haystack) - } -} - -/// PrefilterState tracks state associated with the effectiveness of a -/// prefilter. It is used to track how many bytes, on average, are skipped by -/// the prefilter. If this average dips below a certain threshold over time, -/// then the state renders the prefilter inert and stops using it. -/// -/// A prefilter state should be created for each search. (Where creating an -/// iterator is treated as a single search.) A prefilter state should only be -/// created from a `Freqy`. e.g., An inert `Freqy` will produce an inert -/// `PrefilterState`. -#[derive(Clone, Copy, Debug)] -pub(crate) struct PrefilterState { - /// The number of skips that has been executed. This is always 1 greater - /// than the actual number of skips. The special sentinel value of 0 - /// indicates that the prefilter is inert. This is useful to avoid - /// additional checks to determine whether the prefilter is still - /// "effective." Once a prefilter becomes inert, it should no longer be - /// used (according to our heuristics). - skips: u32, - /// The total number of bytes that have been skipped. - skipped: u32, -} - -impl PrefilterState { - /// The minimum number of skip attempts to try before considering whether - /// a prefilter is effective or not. - const MIN_SKIPS: u32 = 50; - - /// The minimum amount of bytes that skipping must average. - /// - /// This value was chosen based on varying it and checking - /// the microbenchmarks. In particular, this can impact the - /// pathological/repeated-{huge,small} benchmarks quite a bit if it's set - /// too low. - const MIN_SKIP_BYTES: u32 = 8; - - /// Create a fresh prefilter state. - #[inline] - pub(crate) fn new() -> PrefilterState { - PrefilterState { skips: 1, skipped: 0 } - } - - /// Update this state with the number of bytes skipped on the last - /// invocation of the prefilter. - #[inline] - fn update(&mut self, skipped: usize) { - self.skips = self.skips.saturating_add(1); - // We need to do this dance since it's technically possible for - // `skipped` to overflow a `u32`. (And we use a `u32` to reduce the - // size of a prefilter state.) - self.skipped = match u32::try_from(skipped) { - Err(_) => core::u32::MAX, - Ok(skipped) => self.skipped.saturating_add(skipped), - }; - } - - /// Return true if and only if this state indicates that a prefilter is - /// still effective. - #[inline] - fn is_effective(&mut self) -> bool { - if self.is_inert() { - return false; - } - if self.skips() < PrefilterState::MIN_SKIPS { - return true; - } - if self.skipped >= PrefilterState::MIN_SKIP_BYTES * self.skips() { - return true; - } - - // We're inert. - self.skips = 0; - false - } - - /// Returns true if the prefilter this state represents should no longer - /// be used. - #[inline] - fn is_inert(&self) -> bool { - self.skips == 0 - } - - /// Returns the total number of times the prefilter has been used. - #[inline] - fn skips(&self) -> u32 { - // Remember, `0` is a sentinel value indicating inertness, so we - // always need to subtract `1` to get our actual number of skips. - self.skips.saturating_sub(1) - } -} - -/// A combination of prefilter effectiveness state and the prefilter itself. -#[derive(Debug)] -pub(crate) struct Pre<'a> { - /// State that tracks the effectiveness of a prefilter. - prestate: &'a mut PrefilterState, - /// The actual prefilter. - prestrat: &'a Prefilter, -} - -impl<'a> Pre<'a> { - /// Call this prefilter on the given haystack with the given needle. - #[inline] - pub(crate) fn find(&mut self, haystack: &[u8]) -> Option { - let result = self.prestrat.find(haystack); - self.prestate.update(result.unwrap_or(haystack.len())); - result - } - - /// Return true if and only if this prefilter should be used. - #[inline] - pub(crate) fn is_effective(&mut self) -> bool { - self.prestate.is_effective() - } -} - -/// Returns true if the needle has the right characteristics for a vector -/// algorithm to handle the entirety of substring search. -/// -/// Vector algorithms can be used for prefilters for other substring search -/// algorithms (like Two-Way), but they can also be used for substring search -/// on their own. When used for substring search, vector algorithms will -/// quickly identify candidate match positions (just like in the prefilter -/// case), but instead of returning the candidate position they will try to -/// confirm the match themselves. Confirmation happens via `memcmp`. This -/// works well for short needles, but can break down when many false candidate -/// positions are generated for large needles. Thus, we only permit vector -/// algorithms to own substring search when the needle is of a certain length. -#[inline] -fn do_packed_search(needle: &[u8]) -> bool { - /// The minimum length of a needle required for this algorithm. The minimum - /// is 2 since a length of 1 should just use memchr and a length of 0 isn't - /// a case handled by this searcher. - const MIN_LEN: usize = 2; - - /// The maximum length of a needle required for this algorithm. - /// - /// In reality, there is no hard max here. The code below can handle any - /// length needle. (Perhaps that suggests there are missing optimizations.) - /// Instead, this is a heuristic and a bound guaranteeing our linear time - /// complexity. - /// - /// It is a heuristic because when a candidate match is found, memcmp is - /// run. For very large needles with lots of false positives, memcmp can - /// make the code run quite slow. - /// - /// It is a bound because the worst case behavior with memcmp is - /// multiplicative in the size of the needle and haystack, and we want - /// to keep that additive. This bound ensures we still meet that bound - /// theoretically, since it's just a constant. We aren't acting in bad - /// faith here, memcmp on tiny needles is so fast that even in pathological - /// cases (see pathological vector benchmarks), this is still just as fast - /// or faster in practice. - /// - /// This specific number was chosen by tweaking a bit and running - /// benchmarks. The rare-medium-needle, for example, gets about 5% faster - /// by using this algorithm instead of a prefilter-accelerated Two-Way. - /// There's also a theoretical desire to keep this number reasonably - /// low, to mitigate the impact of pathological cases. I did try 64, and - /// some benchmarks got a little better, and others (particularly the - /// pathological ones), got a lot worse. So... 32 it is? - const MAX_LEN: usize = 32; - MIN_LEN <= needle.len() && needle.len() <= MAX_LEN -} diff -Nru temporalio-1.3.0/vendor/memchr/src/memmem/twoway.rs temporalio-1.3.0/vendor/memchr/src/memmem/twoway.rs --- temporalio-1.3.0/vendor/memchr/src/memmem/twoway.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/memmem/twoway.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,878 @@ +use core::cmp; + +use crate::memmem::{prefilter::Pre, util}; + +/// Two-Way search in the forward direction. +#[derive(Clone, Copy, Debug)] +pub(crate) struct Forward(TwoWay); + +/// Two-Way search in the reverse direction. +#[derive(Clone, Copy, Debug)] +pub(crate) struct Reverse(TwoWay); + +/// An implementation of the TwoWay substring search algorithm, with heuristics +/// for accelerating search based on frequency analysis. +/// +/// This searcher supports forward and reverse search, although not +/// simultaneously. It runs in O(n + m) time and O(1) space, where +/// `n ~ len(needle)` and `m ~ len(haystack)`. +/// +/// The implementation here roughly matches that which was developed by +/// Crochemore and Perrin in their 1991 paper "Two-way string-matching." The +/// changes in this implementation are 1) the use of zero-based indices, 2) a +/// heuristic skip table based on the last byte (borrowed from Rust's standard +/// library) and 3) the addition of heuristics for a fast skip loop. That is, +/// (3) this will detect bytes that are believed to be rare in the needle and +/// use fast vectorized instructions to find their occurrences quickly. The +/// Two-Way algorithm is then used to confirm whether a match at that location +/// occurred. +/// +/// The heuristic for fast skipping is automatically shut off if it's +/// detected to be ineffective at search time. Generally, this only occurs in +/// pathological cases. But this is generally necessary in order to preserve +/// a `O(n + m)` time bound. +/// +/// The code below is fairly complex and not obviously correct at all. It's +/// likely necessary to read the Two-Way paper cited above in order to fully +/// grok this code. The essence of it is: +/// +/// 1) Do something to detect a "critical" position in the needle. +/// 2) For the current position in the haystack, look if needle[critical..] +/// matches at that position. +/// 3) If so, look if needle[..critical] matches. +/// 4) If a mismatch occurs, shift the search by some amount based on the +/// critical position and a pre-computed shift. +/// +/// This type is wrapped in Forward and Reverse types that expose consistent +/// forward or reverse APIs. +#[derive(Clone, Copy, Debug)] +struct TwoWay { + /// A small bitset used as a quick prefilter (in addition to the faster + /// SIMD based prefilter). Namely, a bit 'i' is set if and only if b%64==i + /// for any b in the needle. + /// + /// When used as a prefilter, if the last byte at the current candidate + /// position is NOT in this set, then we can skip that entire candidate + /// position (the length of the needle). This is essentially the shift + /// trick found in Boyer-Moore, but only applied to bytes that don't appear + /// in the needle. + /// + /// N.B. This trick was inspired by something similar in std's + /// implementation of Two-Way. + byteset: ApproximateByteSet, + /// A critical position in needle. Specifically, this position corresponds + /// to beginning of either the minimal or maximal suffix in needle. (N.B. + /// See SuffixType below for why "minimal" isn't quite the correct word + /// here.) + /// + /// This is the position at which every search begins. Namely, search + /// starts by scanning text to the right of this position, and only if + /// there's a match does the text to the left of this position get scanned. + critical_pos: usize, + /// The amount we shift by in the Two-Way search algorithm. This + /// corresponds to the "small period" and "large period" cases. + shift: Shift, +} + +impl Forward { + /// Create a searcher that uses the Two-Way algorithm by searching forwards + /// through any haystack. + pub(crate) fn new(needle: &[u8]) -> Forward { + if needle.is_empty() { + return Forward(TwoWay::empty()); + } + + let byteset = ApproximateByteSet::new(needle); + let min_suffix = Suffix::forward(needle, SuffixKind::Minimal); + let max_suffix = Suffix::forward(needle, SuffixKind::Maximal); + let (period_lower_bound, critical_pos) = + if min_suffix.pos > max_suffix.pos { + (min_suffix.period, min_suffix.pos) + } else { + (max_suffix.period, max_suffix.pos) + }; + let shift = Shift::forward(needle, period_lower_bound, critical_pos); + Forward(TwoWay { byteset, critical_pos, shift }) + } + + /// Find the position of the first occurrence of this searcher's needle in + /// the given haystack. If one does not exist, then return None. + /// + /// This accepts prefilter state that is useful when using the same + /// searcher multiple times, such as in an iterator. + /// + /// Callers must guarantee that the needle is non-empty and its length is + /// <= the haystack's length. + #[inline(always)] + pub(crate) fn find( + &self, + pre: Option<&mut Pre<'_>>, + haystack: &[u8], + needle: &[u8], + ) -> Option { + debug_assert!(!needle.is_empty(), "needle should not be empty"); + debug_assert!(needle.len() <= haystack.len(), "haystack too short"); + + match self.0.shift { + Shift::Small { period } => { + self.find_small_imp(pre, haystack, needle, period) + } + Shift::Large { shift } => { + self.find_large_imp(pre, haystack, needle, shift) + } + } + } + + /// Like find, but handles the degenerate substring test cases. This is + /// only useful for conveniently testing this substring implementation in + /// isolation. + #[cfg(test)] + fn find_general( + &self, + pre: Option<&mut Pre<'_>>, + haystack: &[u8], + needle: &[u8], + ) -> Option { + if needle.is_empty() { + Some(0) + } else if haystack.len() < needle.len() { + None + } else { + self.find(pre, haystack, needle) + } + } + + // Each of the two search implementations below can be accelerated by a + // prefilter, but it is not always enabled. To avoid its overhead when + // its disabled, we explicitly inline each search implementation based on + // whether a prefilter will be used or not. The decision on which to use + // is made in the parent meta searcher. + + #[inline(always)] + fn find_small_imp( + &self, + mut pre: Option<&mut Pre<'_>>, + haystack: &[u8], + needle: &[u8], + period: usize, + ) -> Option { + let last_byte = needle.len() - 1; + let mut pos = 0; + let mut shift = 0; + while pos + needle.len() <= haystack.len() { + let mut i = cmp::max(self.0.critical_pos, shift); + if let Some(pre) = pre.as_mut() { + if pre.should_call() { + pos += pre.call(&haystack[pos..], needle)?; + shift = 0; + i = self.0.critical_pos; + if pos + needle.len() > haystack.len() { + return None; + } + } + } + if !self.0.byteset.contains(haystack[pos + last_byte]) { + pos += needle.len(); + shift = 0; + continue; + } + while i < needle.len() && needle[i] == haystack[pos + i] { + i += 1; + } + if i < needle.len() { + pos += i - self.0.critical_pos + 1; + shift = 0; + } else { + let mut j = self.0.critical_pos; + while j > shift && needle[j] == haystack[pos + j] { + j -= 1; + } + if j <= shift && needle[shift] == haystack[pos + shift] { + return Some(pos); + } + pos += period; + shift = needle.len() - period; + } + } + None + } + + #[inline(always)] + fn find_large_imp( + &self, + mut pre: Option<&mut Pre<'_>>, + haystack: &[u8], + needle: &[u8], + shift: usize, + ) -> Option { + let last_byte = needle.len() - 1; + let mut pos = 0; + 'outer: while pos + needle.len() <= haystack.len() { + if let Some(pre) = pre.as_mut() { + if pre.should_call() { + pos += pre.call(&haystack[pos..], needle)?; + if pos + needle.len() > haystack.len() { + return None; + } + } + } + + if !self.0.byteset.contains(haystack[pos + last_byte]) { + pos += needle.len(); + continue; + } + let mut i = self.0.critical_pos; + while i < needle.len() && needle[i] == haystack[pos + i] { + i += 1; + } + if i < needle.len() { + pos += i - self.0.critical_pos + 1; + } else { + for j in (0..self.0.critical_pos).rev() { + if needle[j] != haystack[pos + j] { + pos += shift; + continue 'outer; + } + } + return Some(pos); + } + } + None + } +} + +impl Reverse { + /// Create a searcher that uses the Two-Way algorithm by searching in + /// reverse through any haystack. + pub(crate) fn new(needle: &[u8]) -> Reverse { + if needle.is_empty() { + return Reverse(TwoWay::empty()); + } + + let byteset = ApproximateByteSet::new(needle); + let min_suffix = Suffix::reverse(needle, SuffixKind::Minimal); + let max_suffix = Suffix::reverse(needle, SuffixKind::Maximal); + let (period_lower_bound, critical_pos) = + if min_suffix.pos < max_suffix.pos { + (min_suffix.period, min_suffix.pos) + } else { + (max_suffix.period, max_suffix.pos) + }; + // let critical_pos = needle.len() - critical_pos; + let shift = Shift::reverse(needle, period_lower_bound, critical_pos); + Reverse(TwoWay { byteset, critical_pos, shift }) + } + + /// Find the position of the last occurrence of this searcher's needle + /// in the given haystack. If one does not exist, then return None. + /// + /// This will automatically initialize prefilter state. This should only + /// be used for one-off searches. + /// + /// Callers must guarantee that the needle is non-empty and its length is + /// <= the haystack's length. + #[inline(always)] + pub(crate) fn rfind( + &self, + haystack: &[u8], + needle: &[u8], + ) -> Option { + debug_assert!(!needle.is_empty(), "needle should not be empty"); + debug_assert!(needle.len() <= haystack.len(), "haystack too short"); + // For the reverse case, we don't use a prefilter. It's plausible that + // perhaps we should, but it's a lot of additional code to do it, and + // it's not clear that it's actually worth it. If you have a really + // compelling use case for this, please file an issue. + match self.0.shift { + Shift::Small { period } => { + self.rfind_small_imp(haystack, needle, period) + } + Shift::Large { shift } => { + self.rfind_large_imp(haystack, needle, shift) + } + } + } + + /// Like rfind, but handles the degenerate substring test cases. This is + /// only useful for conveniently testing this substring implementation in + /// isolation. + #[cfg(test)] + fn rfind_general(&self, haystack: &[u8], needle: &[u8]) -> Option { + if needle.is_empty() { + Some(haystack.len()) + } else if haystack.len() < needle.len() { + None + } else { + self.rfind(haystack, needle) + } + } + + #[inline(always)] + fn rfind_small_imp( + &self, + haystack: &[u8], + needle: &[u8], + period: usize, + ) -> Option { + let nlen = needle.len(); + let mut pos = haystack.len(); + let mut shift = nlen; + while pos >= nlen { + if !self.0.byteset.contains(haystack[pos - nlen]) { + pos -= nlen; + shift = nlen; + continue; + } + let mut i = cmp::min(self.0.critical_pos, shift); + while i > 0 && needle[i - 1] == haystack[pos - nlen + i - 1] { + i -= 1; + } + if i > 0 || needle[0] != haystack[pos - nlen] { + pos -= self.0.critical_pos - i + 1; + shift = nlen; + } else { + let mut j = self.0.critical_pos; + while j < shift && needle[j] == haystack[pos - nlen + j] { + j += 1; + } + if j >= shift { + return Some(pos - nlen); + } + pos -= period; + shift = period; + } + } + None + } + + #[inline(always)] + fn rfind_large_imp( + &self, + haystack: &[u8], + needle: &[u8], + shift: usize, + ) -> Option { + let nlen = needle.len(); + let mut pos = haystack.len(); + while pos >= nlen { + if !self.0.byteset.contains(haystack[pos - nlen]) { + pos -= nlen; + continue; + } + let mut i = self.0.critical_pos; + while i > 0 && needle[i - 1] == haystack[pos - nlen + i - 1] { + i -= 1; + } + if i > 0 || needle[0] != haystack[pos - nlen] { + pos -= self.0.critical_pos - i + 1; + } else { + let mut j = self.0.critical_pos; + while j < nlen && needle[j] == haystack[pos - nlen + j] { + j += 1; + } + if j == nlen { + return Some(pos - nlen); + } + pos -= shift; + } + } + None + } +} + +impl TwoWay { + fn empty() -> TwoWay { + TwoWay { + byteset: ApproximateByteSet::new(b""), + critical_pos: 0, + shift: Shift::Large { shift: 0 }, + } + } +} + +/// A representation of the amount we're allowed to shift by during Two-Way +/// search. +/// +/// When computing a critical factorization of the needle, we find the position +/// of the critical factorization by finding the needle's maximal (or minimal) +/// suffix, along with the period of that suffix. It turns out that the period +/// of that suffix is a lower bound on the period of the needle itself. +/// +/// This lower bound is equivalent to the actual period of the needle in +/// some cases. To describe that case, we denote the needle as `x` where +/// `x = uv` and `v` is the lexicographic maximal suffix of `v`. The lower +/// bound given here is always the period of `v`, which is `<= period(x)`. The +/// case where `period(v) == period(x)` occurs when `len(u) < (len(x) / 2)` and +/// where `u` is a suffix of `v[0..period(v)]`. +/// +/// This case is important because the search algorithm for when the +/// periods are equivalent is slightly different than the search algorithm +/// for when the periods are not equivalent. In particular, when they aren't +/// equivalent, we know that the period of the needle is no less than half its +/// length. In this case, we shift by an amount less than or equal to the +/// period of the needle (determined by the maximum length of the components +/// of the critical factorization of `x`, i.e., `max(len(u), len(v))`).. +/// +/// The above two cases are represented by the variants below. Each entails +/// a different instantiation of the Two-Way search algorithm. +/// +/// N.B. If we could find a way to compute the exact period in all cases, +/// then we could collapse this case analysis and simplify the algorithm. The +/// Two-Way paper suggests this is possible, but more reading is required to +/// grok why the authors didn't pursue that path. +#[derive(Clone, Copy, Debug)] +enum Shift { + Small { period: usize }, + Large { shift: usize }, +} + +impl Shift { + /// Compute the shift for a given needle in the forward direction. + /// + /// This requires a lower bound on the period and a critical position. + /// These can be computed by extracting both the minimal and maximal + /// lexicographic suffixes, and choosing the right-most starting position. + /// The lower bound on the period is then the period of the chosen suffix. + fn forward( + needle: &[u8], + period_lower_bound: usize, + critical_pos: usize, + ) -> Shift { + let large = cmp::max(critical_pos, needle.len() - critical_pos); + if critical_pos * 2 >= needle.len() { + return Shift::Large { shift: large }; + } + + let (u, v) = needle.split_at(critical_pos); + if !util::is_suffix(&v[..period_lower_bound], u) { + return Shift::Large { shift: large }; + } + Shift::Small { period: period_lower_bound } + } + + /// Compute the shift for a given needle in the reverse direction. + /// + /// This requires a lower bound on the period and a critical position. + /// These can be computed by extracting both the minimal and maximal + /// lexicographic suffixes, and choosing the left-most starting position. + /// The lower bound on the period is then the period of the chosen suffix. + fn reverse( + needle: &[u8], + period_lower_bound: usize, + critical_pos: usize, + ) -> Shift { + let large = cmp::max(critical_pos, needle.len() - critical_pos); + if (needle.len() - critical_pos) * 2 >= needle.len() { + return Shift::Large { shift: large }; + } + + let (v, u) = needle.split_at(critical_pos); + if !util::is_prefix(&v[v.len() - period_lower_bound..], u) { + return Shift::Large { shift: large }; + } + Shift::Small { period: period_lower_bound } + } +} + +/// A suffix extracted from a needle along with its period. +#[derive(Debug)] +struct Suffix { + /// The starting position of this suffix. + /// + /// If this is a forward suffix, then `&bytes[pos..]` can be used. If this + /// is a reverse suffix, then `&bytes[..pos]` can be used. That is, for + /// forward suffixes, this is an inclusive starting position, where as for + /// reverse suffixes, this is an exclusive ending position. + pos: usize, + /// The period of this suffix. + /// + /// Note that this is NOT necessarily the period of the string from which + /// this suffix comes from. (It is always less than or equal to the period + /// of the original string.) + period: usize, +} + +impl Suffix { + fn forward(needle: &[u8], kind: SuffixKind) -> Suffix { + debug_assert!(!needle.is_empty()); + + // suffix represents our maximal (or minimal) suffix, along with + // its period. + let mut suffix = Suffix { pos: 0, period: 1 }; + // The start of a suffix in `needle` that we are considering as a + // more maximal (or minimal) suffix than what's in `suffix`. + let mut candidate_start = 1; + // The current offset of our suffixes that we're comparing. + // + // When the characters at this offset are the same, then we mush on + // to the next position since no decision is possible. When the + // candidate's character is greater (or lesser) than the corresponding + // character than our current maximal (or minimal) suffix, then the + // current suffix is changed over to the candidate and we restart our + // search. Otherwise, the candidate suffix is no good and we restart + // our search on the next candidate. + // + // The three cases above correspond to the three cases in the loop + // below. + let mut offset = 0; + + while candidate_start + offset < needle.len() { + let current = needle[suffix.pos + offset]; + let candidate = needle[candidate_start + offset]; + match kind.cmp(current, candidate) { + SuffixOrdering::Accept => { + suffix = Suffix { pos: candidate_start, period: 1 }; + candidate_start += 1; + offset = 0; + } + SuffixOrdering::Skip => { + candidate_start += offset + 1; + offset = 0; + suffix.period = candidate_start - suffix.pos; + } + SuffixOrdering::Push => { + if offset + 1 == suffix.period { + candidate_start += suffix.period; + offset = 0; + } else { + offset += 1; + } + } + } + } + suffix + } + + fn reverse(needle: &[u8], kind: SuffixKind) -> Suffix { + debug_assert!(!needle.is_empty()); + + // See the comments in `forward` for how this works. + let mut suffix = Suffix { pos: needle.len(), period: 1 }; + if needle.len() == 1 { + return suffix; + } + let mut candidate_start = needle.len() - 1; + let mut offset = 0; + + while offset < candidate_start { + let current = needle[suffix.pos - offset - 1]; + let candidate = needle[candidate_start - offset - 1]; + match kind.cmp(current, candidate) { + SuffixOrdering::Accept => { + suffix = Suffix { pos: candidate_start, period: 1 }; + candidate_start -= 1; + offset = 0; + } + SuffixOrdering::Skip => { + candidate_start -= offset + 1; + offset = 0; + suffix.period = suffix.pos - candidate_start; + } + SuffixOrdering::Push => { + if offset + 1 == suffix.period { + candidate_start -= suffix.period; + offset = 0; + } else { + offset += 1; + } + } + } + } + suffix + } +} + +/// The kind of suffix to extract. +#[derive(Clone, Copy, Debug)] +enum SuffixKind { + /// Extract the smallest lexicographic suffix from a string. + /// + /// Technically, this doesn't actually pick the smallest lexicographic + /// suffix. e.g., Given the choice between `a` and `aa`, this will choose + /// the latter over the former, even though `a < aa`. The reasoning for + /// this isn't clear from the paper, but it still smells like a minimal + /// suffix. + Minimal, + /// Extract the largest lexicographic suffix from a string. + /// + /// Unlike `Minimal`, this really does pick the maximum suffix. e.g., Given + /// the choice between `z` and `zz`, this will choose the latter over the + /// former. + Maximal, +} + +/// The result of comparing corresponding bytes between two suffixes. +#[derive(Clone, Copy, Debug)] +enum SuffixOrdering { + /// This occurs when the given candidate byte indicates that the candidate + /// suffix is better than the current maximal (or minimal) suffix. That is, + /// the current candidate suffix should supplant the current maximal (or + /// minimal) suffix. + Accept, + /// This occurs when the given candidate byte excludes the candidate suffix + /// from being better than the current maximal (or minimal) suffix. That + /// is, the current candidate suffix should be dropped and the next one + /// should be considered. + Skip, + /// This occurs when no decision to accept or skip the candidate suffix + /// can be made, e.g., when corresponding bytes are equivalent. In this + /// case, the next corresponding bytes should be compared. + Push, +} + +impl SuffixKind { + /// Returns true if and only if the given candidate byte indicates that + /// it should replace the current suffix as the maximal (or minimal) + /// suffix. + fn cmp(self, current: u8, candidate: u8) -> SuffixOrdering { + use self::SuffixOrdering::*; + + match self { + SuffixKind::Minimal if candidate < current => Accept, + SuffixKind::Minimal if candidate > current => Skip, + SuffixKind::Minimal => Push, + SuffixKind::Maximal if candidate > current => Accept, + SuffixKind::Maximal if candidate < current => Skip, + SuffixKind::Maximal => Push, + } + } +} + +/// A bitset used to track whether a particular byte exists in a needle or not. +/// +/// Namely, bit 'i' is set if and only if byte%64==i for any byte in the +/// needle. If a particular byte in the haystack is NOT in this set, then one +/// can conclude that it is also not in the needle, and thus, one can advance +/// in the haystack by needle.len() bytes. +#[derive(Clone, Copy, Debug)] +struct ApproximateByteSet(u64); + +impl ApproximateByteSet { + /// Create a new set from the given needle. + fn new(needle: &[u8]) -> ApproximateByteSet { + let mut bits = 0; + for &b in needle { + bits |= 1 << (b % 64); + } + ApproximateByteSet(bits) + } + + /// Return true if and only if the given byte might be in this set. This + /// may return a false positive, but will never return a false negative. + #[inline(always)] + fn contains(&self, byte: u8) -> bool { + self.0 & (1 << (byte % 64)) != 0 + } +} + +#[cfg(all(test, feature = "std", not(miri)))] +mod tests { + use quickcheck::quickcheck; + + use super::*; + + define_memmem_quickcheck_tests!( + super::simpletests::twoway_find, + super::simpletests::twoway_rfind + ); + + /// Convenience wrapper for computing the suffix as a byte string. + fn get_suffix_forward(needle: &[u8], kind: SuffixKind) -> (&[u8], usize) { + let s = Suffix::forward(needle, kind); + (&needle[s.pos..], s.period) + } + + /// Convenience wrapper for computing the reverse suffix as a byte string. + fn get_suffix_reverse(needle: &[u8], kind: SuffixKind) -> (&[u8], usize) { + let s = Suffix::reverse(needle, kind); + (&needle[..s.pos], s.period) + } + + /// Return all of the non-empty suffixes in the given byte string. + fn suffixes(bytes: &[u8]) -> Vec<&[u8]> { + (0..bytes.len()).map(|i| &bytes[i..]).collect() + } + + /// Return the lexicographically maximal suffix of the given byte string. + fn naive_maximal_suffix_forward(needle: &[u8]) -> &[u8] { + let mut sufs = suffixes(needle); + sufs.sort(); + sufs.pop().unwrap() + } + + /// Return the lexicographically maximal suffix of the reverse of the given + /// byte string. + fn naive_maximal_suffix_reverse(needle: &[u8]) -> Vec { + let mut reversed = needle.to_vec(); + reversed.reverse(); + let mut got = naive_maximal_suffix_forward(&reversed).to_vec(); + got.reverse(); + got + } + + #[test] + fn suffix_forward() { + macro_rules! assert_suffix_min { + ($given:expr, $expected:expr, $period:expr) => { + let (got_suffix, got_period) = + get_suffix_forward($given.as_bytes(), SuffixKind::Minimal); + let got_suffix = std::str::from_utf8(got_suffix).unwrap(); + assert_eq!(($expected, $period), (got_suffix, got_period)); + }; + } + + macro_rules! assert_suffix_max { + ($given:expr, $expected:expr, $period:expr) => { + let (got_suffix, got_period) = + get_suffix_forward($given.as_bytes(), SuffixKind::Maximal); + let got_suffix = std::str::from_utf8(got_suffix).unwrap(); + assert_eq!(($expected, $period), (got_suffix, got_period)); + }; + } + + assert_suffix_min!("a", "a", 1); + assert_suffix_max!("a", "a", 1); + + assert_suffix_min!("ab", "ab", 2); + assert_suffix_max!("ab", "b", 1); + + assert_suffix_min!("ba", "a", 1); + assert_suffix_max!("ba", "ba", 2); + + assert_suffix_min!("abc", "abc", 3); + assert_suffix_max!("abc", "c", 1); + + assert_suffix_min!("acb", "acb", 3); + assert_suffix_max!("acb", "cb", 2); + + assert_suffix_min!("cba", "a", 1); + assert_suffix_max!("cba", "cba", 3); + + assert_suffix_min!("abcabc", "abcabc", 3); + assert_suffix_max!("abcabc", "cabc", 3); + + assert_suffix_min!("abcabcabc", "abcabcabc", 3); + assert_suffix_max!("abcabcabc", "cabcabc", 3); + + assert_suffix_min!("abczz", "abczz", 5); + assert_suffix_max!("abczz", "zz", 1); + + assert_suffix_min!("zzabc", "abc", 3); + assert_suffix_max!("zzabc", "zzabc", 5); + + assert_suffix_min!("aaa", "aaa", 1); + assert_suffix_max!("aaa", "aaa", 1); + + assert_suffix_min!("foobar", "ar", 2); + assert_suffix_max!("foobar", "r", 1); + } + + #[test] + fn suffix_reverse() { + macro_rules! assert_suffix_min { + ($given:expr, $expected:expr, $period:expr) => { + let (got_suffix, got_period) = + get_suffix_reverse($given.as_bytes(), SuffixKind::Minimal); + let got_suffix = std::str::from_utf8(got_suffix).unwrap(); + assert_eq!(($expected, $period), (got_suffix, got_period)); + }; + } + + macro_rules! assert_suffix_max { + ($given:expr, $expected:expr, $period:expr) => { + let (got_suffix, got_period) = + get_suffix_reverse($given.as_bytes(), SuffixKind::Maximal); + let got_suffix = std::str::from_utf8(got_suffix).unwrap(); + assert_eq!(($expected, $period), (got_suffix, got_period)); + }; + } + + assert_suffix_min!("a", "a", 1); + assert_suffix_max!("a", "a", 1); + + assert_suffix_min!("ab", "a", 1); + assert_suffix_max!("ab", "ab", 2); + + assert_suffix_min!("ba", "ba", 2); + assert_suffix_max!("ba", "b", 1); + + assert_suffix_min!("abc", "a", 1); + assert_suffix_max!("abc", "abc", 3); + + assert_suffix_min!("acb", "a", 1); + assert_suffix_max!("acb", "ac", 2); + + assert_suffix_min!("cba", "cba", 3); + assert_suffix_max!("cba", "c", 1); + + assert_suffix_min!("abcabc", "abca", 3); + assert_suffix_max!("abcabc", "abcabc", 3); + + assert_suffix_min!("abcabcabc", "abcabca", 3); + assert_suffix_max!("abcabcabc", "abcabcabc", 3); + + assert_suffix_min!("abczz", "a", 1); + assert_suffix_max!("abczz", "abczz", 5); + + assert_suffix_min!("zzabc", "zza", 3); + assert_suffix_max!("zzabc", "zz", 1); + + assert_suffix_min!("aaa", "aaa", 1); + assert_suffix_max!("aaa", "aaa", 1); + } + + quickcheck! { + fn qc_suffix_forward_maximal(bytes: Vec) -> bool { + if bytes.is_empty() { + return true; + } + + let (got, _) = get_suffix_forward(&bytes, SuffixKind::Maximal); + let expected = naive_maximal_suffix_forward(&bytes); + got == expected + } + + fn qc_suffix_reverse_maximal(bytes: Vec) -> bool { + if bytes.is_empty() { + return true; + } + + let (got, _) = get_suffix_reverse(&bytes, SuffixKind::Maximal); + let expected = naive_maximal_suffix_reverse(&bytes); + expected == got + } + } +} + +#[cfg(test)] +mod simpletests { + use super::*; + + pub(crate) fn twoway_find( + haystack: &[u8], + needle: &[u8], + ) -> Option { + Forward::new(needle).find_general(None, haystack, needle) + } + + pub(crate) fn twoway_rfind( + haystack: &[u8], + needle: &[u8], + ) -> Option { + Reverse::new(needle).rfind_general(haystack, needle) + } + + define_memmem_simple_tests!(twoway_find, twoway_rfind); + + // This is a regression test caught by quickcheck that exercised a bug in + // the reverse small period handling. The bug was that we were using 'if j + // == shift' to determine if a match occurred, but the correct guard is 'if + // j >= shift', which matches the corresponding guard in the forward impl. + #[test] + fn regression_rev_small_period() { + let rfind = super::simpletests::twoway_rfind; + let haystack = "ababaz"; + let needle = "abab"; + assert_eq!(Some(0), rfind(haystack.as_bytes(), needle.as_bytes())); + } +} diff -Nru temporalio-1.3.0/vendor/memchr/src/memmem/util.rs temporalio-1.3.0/vendor/memchr/src/memmem/util.rs --- temporalio-1.3.0/vendor/memchr/src/memmem/util.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/memmem/util.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,88 @@ +// These routines are meant to be optimized specifically for low latency as +// compared to the equivalent routines offered by std. (Which may invoke the +// dynamic linker and call out to libc, which introduces a bit more latency +// than we'd like.) + +/// Returns true if and only if needle is a prefix of haystack. +#[inline(always)] +pub(crate) fn is_prefix(haystack: &[u8], needle: &[u8]) -> bool { + needle.len() <= haystack.len() && memcmp(&haystack[..needle.len()], needle) +} + +/// Returns true if and only if needle is a suffix of haystack. +#[inline(always)] +pub(crate) fn is_suffix(haystack: &[u8], needle: &[u8]) -> bool { + needle.len() <= haystack.len() + && memcmp(&haystack[haystack.len() - needle.len()..], needle) +} + +/// Return true if and only if x.len() == y.len() && x[i] == y[i] for all +/// 0 <= i < x.len(). +/// +/// Why not just use actual memcmp for this? Well, memcmp requires calling out +/// to libc, and this routine is called in fairly hot code paths. Other than +/// just calling out to libc, it also seems to result in worse codegen. By +/// rolling our own memcmp in pure Rust, it seems to appear more friendly to +/// the optimizer. +/// +/// We mark this as inline always, although, some callers may not want it +/// inlined for better codegen (like Rabin-Karp). In that case, callers are +/// advised to create a non-inlineable wrapper routine that calls memcmp. +#[inline(always)] +pub(crate) fn memcmp(x: &[u8], y: &[u8]) -> bool { + if x.len() != y.len() { + return false; + } + // If we don't have enough bytes to do 4-byte at a time loads, then + // fall back to the naive slow version. + // + // TODO: We could do a copy_nonoverlapping combined with a mask instead + // of a loop. Benchmark it. + if x.len() < 4 { + for (&b1, &b2) in x.iter().zip(y) { + if b1 != b2 { + return false; + } + } + return true; + } + // When we have 4 or more bytes to compare, then proceed in chunks of 4 at + // a time using unaligned loads. + // + // Also, why do 4 byte loads instead of, say, 8 byte loads? The reason is + // that this particular version of memcmp is likely to be called with tiny + // needles. That means that if we do 8 byte loads, then a higher proportion + // of memcmp calls will use the slower variant above. With that said, this + // is a hypothesis and is only loosely supported by benchmarks. There's + // likely some improvement that could be made here. The main thing here + // though is to optimize for latency, not throughput. + + // SAFETY: Via the conditional above, we know that both `px` and `py` + // have the same length, so `px < pxend` implies that `py < pyend`. + // Thus, derefencing both `px` and `py` in the loop below is safe. + // + // Moreover, we set `pxend` and `pyend` to be 4 bytes before the actual + // end of of `px` and `py`. Thus, the final dereference outside of the + // loop is guaranteed to be valid. (The final comparison will overlap with + // the last comparison done in the loop for lengths that aren't multiples + // of four.) + // + // Finally, we needn't worry about alignment here, since we do unaligned + // loads. + unsafe { + let (mut px, mut py) = (x.as_ptr(), y.as_ptr()); + let (pxend, pyend) = (px.add(x.len() - 4), py.add(y.len() - 4)); + while px < pxend { + let vx = (px as *const u32).read_unaligned(); + let vy = (py as *const u32).read_unaligned(); + if vx != vy { + return false; + } + px = px.add(4); + py = py.add(4); + } + let vx = (pxend as *const u32).read_unaligned(); + let vy = (pyend as *const u32).read_unaligned(); + vx == vy + } +} diff -Nru temporalio-1.3.0/vendor/memchr/src/memmem/vector.rs temporalio-1.3.0/vendor/memchr/src/memmem/vector.rs --- temporalio-1.3.0/vendor/memchr/src/memmem/vector.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/memmem/vector.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,131 @@ +/// A trait for describing vector operations used by vectorized searchers. +/// +/// The trait is highly constrained to low level vector operations needed. In +/// general, it was invented mostly to be generic over x86's __m128i and +/// __m256i types. It's likely that once std::simd becomes a thing, we can +/// migrate to that since the operations required are quite simple. +/// +/// TODO: Consider moving this trait up a level and using it to implement +/// memchr as well. The trait might need to grow one or two methods, but +/// otherwise should be close to sufficient already. +/// +/// # Safety +/// +/// All methods are not safe since they are intended to be implemented using +/// vendor intrinsics, which are also not safe. Callers must ensure that the +/// appropriate target features are enabled in the calling function, and that +/// the current CPU supports them. All implementations should avoid marking the +/// routines with #[target_feature] and instead mark them as #[inline(always)] +/// to ensure they get appropriately inlined. (inline(always) cannot be used +/// with target_feature.) +pub(crate) trait Vector: Copy + core::fmt::Debug { + /// _mm_set1_epi8 or _mm256_set1_epi8 + unsafe fn splat(byte: u8) -> Self; + /// _mm_loadu_si128 or _mm256_loadu_si256 + unsafe fn load_unaligned(data: *const u8) -> Self; + /// _mm_movemask_epi8 or _mm256_movemask_epi8 + unsafe fn movemask(self) -> u32; + /// _mm_cmpeq_epi8 or _mm256_cmpeq_epi8 + unsafe fn cmpeq(self, vector2: Self) -> Self; + /// _mm_and_si128 or _mm256_and_si256 + unsafe fn and(self, vector2: Self) -> Self; +} + +#[cfg(target_arch = "x86_64")] +mod x86sse { + use super::Vector; + use core::arch::x86_64::*; + + impl Vector for __m128i { + #[inline(always)] + unsafe fn splat(byte: u8) -> __m128i { + _mm_set1_epi8(byte as i8) + } + + #[inline(always)] + unsafe fn load_unaligned(data: *const u8) -> __m128i { + _mm_loadu_si128(data as *const __m128i) + } + + #[inline(always)] + unsafe fn movemask(self) -> u32 { + _mm_movemask_epi8(self) as u32 + } + + #[inline(always)] + unsafe fn cmpeq(self, vector2: Self) -> __m128i { + _mm_cmpeq_epi8(self, vector2) + } + + #[inline(always)] + unsafe fn and(self, vector2: Self) -> __m128i { + _mm_and_si128(self, vector2) + } + } +} + +#[cfg(all(feature = "std", target_arch = "x86_64"))] +mod x86avx { + use super::Vector; + use core::arch::x86_64::*; + + impl Vector for __m256i { + #[inline(always)] + unsafe fn splat(byte: u8) -> __m256i { + _mm256_set1_epi8(byte as i8) + } + + #[inline(always)] + unsafe fn load_unaligned(data: *const u8) -> __m256i { + _mm256_loadu_si256(data as *const __m256i) + } + + #[inline(always)] + unsafe fn movemask(self) -> u32 { + _mm256_movemask_epi8(self) as u32 + } + + #[inline(always)] + unsafe fn cmpeq(self, vector2: Self) -> __m256i { + _mm256_cmpeq_epi8(self, vector2) + } + + #[inline(always)] + unsafe fn and(self, vector2: Self) -> __m256i { + _mm256_and_si256(self, vector2) + } + } +} + +#[cfg(target_arch = "wasm32")] +mod wasm_simd128 { + use super::Vector; + use core::arch::wasm32::*; + + impl Vector for v128 { + #[inline(always)] + unsafe fn splat(byte: u8) -> v128 { + u8x16_splat(byte) + } + + #[inline(always)] + unsafe fn load_unaligned(data: *const u8) -> v128 { + v128_load(data.cast()) + } + + #[inline(always)] + unsafe fn movemask(self) -> u32 { + u8x16_bitmask(self).into() + } + + #[inline(always)] + unsafe fn cmpeq(self, vector2: Self) -> v128 { + u8x16_eq(self, vector2) + } + + #[inline(always)] + unsafe fn and(self, vector2: Self) -> v128 { + v128_and(self, vector2) + } + } +} diff -Nru temporalio-1.3.0/vendor/memchr/src/memmem/wasm.rs temporalio-1.3.0/vendor/memchr/src/memmem/wasm.rs --- temporalio-1.3.0/vendor/memchr/src/memmem/wasm.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/memmem/wasm.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,75 @@ +use core::arch::wasm32::v128; + +use crate::memmem::{genericsimd, NeedleInfo}; + +/// A `v128` accelerated vectorized substring search routine that only works on +/// small needles. +#[derive(Clone, Copy, Debug)] +pub(crate) struct Forward(genericsimd::Forward); + +impl Forward { + /// Create a new "generic simd" forward searcher. If one could not be + /// created from the given inputs, then None is returned. + pub(crate) fn new(ninfo: &NeedleInfo, needle: &[u8]) -> Option { + if !cfg!(memchr_runtime_simd) { + return None; + } + genericsimd::Forward::new(ninfo, needle).map(Forward) + } + + /// Returns the minimum length of haystack that is needed for this searcher + /// to work. Passing a haystack with a length smaller than this will cause + /// `find` to panic. + #[inline(always)] + pub(crate) fn min_haystack_len(&self) -> usize { + self.0.min_haystack_len::() + } + + #[inline(always)] + pub(crate) fn find( + &self, + haystack: &[u8], + needle: &[u8], + ) -> Option { + self.find_impl(haystack, needle) + } + + /// The implementation of find marked with the appropriate target feature. + #[target_feature(enable = "simd128")] + fn find_impl(&self, haystack: &[u8], needle: &[u8]) -> Option { + unsafe { genericsimd::fwd_find::(&self.0, haystack, needle) } + } +} + +#[cfg(all(test, feature = "std", not(miri)))] +mod tests { + use crate::memmem::{prefilter::PrefilterState, NeedleInfo}; + + fn find( + _: &mut PrefilterState, + ninfo: &NeedleInfo, + haystack: &[u8], + needle: &[u8], + ) -> Option { + super::Forward::new(ninfo, needle).unwrap().find(haystack, needle) + } + + #[test] + fn prefilter_permutations() { + use crate::memmem::prefilter::tests::PrefilterTest; + + unsafe { + PrefilterTest::run_all_tests_filter(find, |t| { + // This substring searcher only works on certain configs, so + // filter our tests such that Forward::new will be guaranteed + // to succeed. (And also remove tests with a haystack that is + // too small.) + let fwd = match super::Forward::new(&t.ninfo, &t.needle) { + None => return false, + Some(fwd) => fwd, + }; + t.haystack.len() >= fwd.min_haystack_len() + }) + } + } +} diff -Nru temporalio-1.3.0/vendor/memchr/src/memmem/x86/avx.rs temporalio-1.3.0/vendor/memchr/src/memmem/x86/avx.rs --- temporalio-1.3.0/vendor/memchr/src/memmem/x86/avx.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/memmem/x86/avx.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,139 @@ +#[cfg(not(feature = "std"))] +pub(crate) use self::nostd::Forward; +#[cfg(feature = "std")] +pub(crate) use self::std::Forward; + +#[cfg(feature = "std")] +mod std { + use core::arch::x86_64::{__m128i, __m256i}; + + use crate::memmem::{genericsimd, NeedleInfo}; + + /// An AVX accelerated vectorized substring search routine that only works + /// on small needles. + #[derive(Clone, Copy, Debug)] + pub(crate) struct Forward(genericsimd::Forward); + + impl Forward { + /// Create a new "generic simd" forward searcher. If one could not be + /// created from the given inputs, then None is returned. + pub(crate) fn new( + ninfo: &NeedleInfo, + needle: &[u8], + ) -> Option { + if !cfg!(memchr_runtime_avx) || !is_x86_feature_detected!("avx2") { + return None; + } + genericsimd::Forward::new(ninfo, needle).map(Forward) + } + + /// Returns the minimum length of haystack that is needed for this + /// searcher to work. Passing a haystack with a length smaller than + /// this will cause `find` to panic. + #[inline(always)] + pub(crate) fn min_haystack_len(&self) -> usize { + self.0.min_haystack_len::<__m128i>() + } + + #[inline(always)] + pub(crate) fn find( + &self, + haystack: &[u8], + needle: &[u8], + ) -> Option { + // SAFETY: The only way a Forward value can exist is if the avx2 + // target feature is enabled. This is the only safety requirement + // for calling the genericsimd searcher. + unsafe { self.find_impl(haystack, needle) } + } + + /// The implementation of find marked with the appropriate target + /// feature. + /// + /// # Safety + /// + /// Callers must ensure that the avx2 CPU feature is enabled in the + /// current environment. + #[target_feature(enable = "avx2")] + unsafe fn find_impl( + &self, + haystack: &[u8], + needle: &[u8], + ) -> Option { + if haystack.len() < self.0.min_haystack_len::<__m256i>() { + genericsimd::fwd_find::<__m128i>(&self.0, haystack, needle) + } else { + genericsimd::fwd_find::<__m256i>(&self.0, haystack, needle) + } + } + } +} + +// We still define the avx "forward" type on nostd to make caller code a bit +// simpler. This avoids needing a lot more conditional compilation. +#[cfg(not(feature = "std"))] +mod nostd { + use crate::memmem::NeedleInfo; + + #[derive(Clone, Copy, Debug)] + pub(crate) struct Forward(()); + + impl Forward { + pub(crate) fn new( + ninfo: &NeedleInfo, + needle: &[u8], + ) -> Option { + None + } + + pub(crate) fn min_haystack_len(&self) -> usize { + unreachable!() + } + + pub(crate) fn find( + &self, + haystack: &[u8], + needle: &[u8], + ) -> Option { + unreachable!() + } + } +} + +#[cfg(all(test, feature = "std", not(miri)))] +mod tests { + use crate::memmem::{prefilter::PrefilterState, NeedleInfo}; + + fn find( + _: &mut PrefilterState, + ninfo: &NeedleInfo, + haystack: &[u8], + needle: &[u8], + ) -> Option { + super::Forward::new(ninfo, needle).unwrap().find(haystack, needle) + } + + #[test] + fn prefilter_permutations() { + use crate::memmem::prefilter::tests::PrefilterTest; + + if !is_x86_feature_detected!("avx2") { + return; + } + // SAFETY: The safety of find only requires that the current CPU + // support AVX2, which we checked above. + unsafe { + PrefilterTest::run_all_tests_filter(find, |t| { + // This substring searcher only works on certain configs, so + // filter our tests such that Forward::new will be guaranteed + // to succeed. (And also remove tests with a haystack that is + // too small.) + let fwd = match super::Forward::new(&t.ninfo, &t.needle) { + None => return false, + Some(fwd) => fwd, + }; + t.haystack.len() >= fwd.min_haystack_len() + }) + } + } +} diff -Nru temporalio-1.3.0/vendor/memchr/src/memmem/x86/mod.rs temporalio-1.3.0/vendor/memchr/src/memmem/x86/mod.rs --- temporalio-1.3.0/vendor/memchr/src/memmem/x86/mod.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/memmem/x86/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,2 @@ +pub(crate) mod avx; +pub(crate) mod sse; diff -Nru temporalio-1.3.0/vendor/memchr/src/memmem/x86/sse.rs temporalio-1.3.0/vendor/memchr/src/memmem/x86/sse.rs --- temporalio-1.3.0/vendor/memchr/src/memmem/x86/sse.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/memmem/x86/sse.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,89 @@ +use core::arch::x86_64::__m128i; + +use crate::memmem::{genericsimd, NeedleInfo}; + +/// An SSE accelerated vectorized substring search routine that only works on +/// small needles. +#[derive(Clone, Copy, Debug)] +pub(crate) struct Forward(genericsimd::Forward); + +impl Forward { + /// Create a new "generic simd" forward searcher. If one could not be + /// created from the given inputs, then None is returned. + pub(crate) fn new(ninfo: &NeedleInfo, needle: &[u8]) -> Option { + if !cfg!(memchr_runtime_sse2) { + return None; + } + genericsimd::Forward::new(ninfo, needle).map(Forward) + } + + /// Returns the minimum length of haystack that is needed for this searcher + /// to work. Passing a haystack with a length smaller than this will cause + /// `find` to panic. + #[inline(always)] + pub(crate) fn min_haystack_len(&self) -> usize { + self.0.min_haystack_len::<__m128i>() + } + + #[inline(always)] + pub(crate) fn find( + &self, + haystack: &[u8], + needle: &[u8], + ) -> Option { + // SAFETY: sse2 is enabled on all x86_64 targets, so this is always + // safe to call. + unsafe { self.find_impl(haystack, needle) } + } + + /// The implementation of find marked with the appropriate target feature. + /// + /// # Safety + /// + /// This is safe to call in all cases since sse2 is guaranteed to be part + /// of x86_64. It is marked as unsafe because of the target feature + /// attribute. + #[target_feature(enable = "sse2")] + unsafe fn find_impl( + &self, + haystack: &[u8], + needle: &[u8], + ) -> Option { + genericsimd::fwd_find::<__m128i>(&self.0, haystack, needle) + } +} + +#[cfg(all(test, feature = "std", not(miri)))] +mod tests { + use crate::memmem::{prefilter::PrefilterState, NeedleInfo}; + + fn find( + _: &mut PrefilterState, + ninfo: &NeedleInfo, + haystack: &[u8], + needle: &[u8], + ) -> Option { + super::Forward::new(ninfo, needle).unwrap().find(haystack, needle) + } + + #[test] + fn prefilter_permutations() { + use crate::memmem::prefilter::tests::PrefilterTest; + + // SAFETY: sse2 is enabled on all x86_64 targets, so this is always + // safe to call. + unsafe { + PrefilterTest::run_all_tests_filter(find, |t| { + // This substring searcher only works on certain configs, so + // filter our tests such that Forward::new will be guaranteed + // to succeed. (And also remove tests with a haystack that is + // too small.) + let fwd = match super::Forward::new(&t.ninfo, &t.needle) { + None => return false, + Some(fwd) => fwd, + }; + t.haystack.len() >= fwd.min_haystack_len() + }) + } + } +} diff -Nru temporalio-1.3.0/vendor/memchr/src/tests/memchr/iter.rs temporalio-1.3.0/vendor/memchr/src/tests/memchr/iter.rs --- temporalio-1.3.0/vendor/memchr/src/tests/memchr/iter.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/tests/memchr/iter.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,230 @@ +use quickcheck::quickcheck; + +use crate::{tests::memchr::testdata::memchr_tests, Memchr, Memchr2, Memchr3}; + +#[test] +fn memchr1_iter() { + for test in memchr_tests() { + test.iter_one(false, Memchr::new); + } +} + +#[test] +fn memchr2_iter() { + for test in memchr_tests() { + test.iter_two(false, Memchr2::new); + } +} + +#[test] +fn memchr3_iter() { + for test in memchr_tests() { + test.iter_three(false, Memchr3::new); + } +} + +#[test] +fn memrchr1_iter() { + for test in memchr_tests() { + test.iter_one(true, |n1, corpus| Memchr::new(n1, corpus).rev()); + } +} + +#[test] +fn memrchr2_iter() { + for test in memchr_tests() { + test.iter_two(true, |n1, n2, corpus| { + Memchr2::new(n1, n2, corpus).rev() + }) + } +} + +#[test] +fn memrchr3_iter() { + for test in memchr_tests() { + test.iter_three(true, |n1, n2, n3, corpus| { + Memchr3::new(n1, n2, n3, corpus).rev() + }) + } +} + +quickcheck! { + fn qc_memchr_double_ended_iter( + needle: u8, data: Vec, take_side: Vec + ) -> bool { + // make nonempty + let mut take_side = take_side; + if take_side.is_empty() { take_side.push(true) }; + + let iter = Memchr::new(needle, &data); + let all_found = double_ended_take( + iter, take_side.iter().cycle().cloned()); + + all_found.iter().cloned().eq(positions1(needle, &data)) + } + + fn qc_memchr2_double_ended_iter( + needle1: u8, needle2: u8, data: Vec, take_side: Vec + ) -> bool { + // make nonempty + let mut take_side = take_side; + if take_side.is_empty() { take_side.push(true) }; + + let iter = Memchr2::new(needle1, needle2, &data); + let all_found = double_ended_take( + iter, take_side.iter().cycle().cloned()); + + all_found.iter().cloned().eq(positions2(needle1, needle2, &data)) + } + + fn qc_memchr3_double_ended_iter( + needle1: u8, needle2: u8, needle3: u8, + data: Vec, take_side: Vec + ) -> bool { + // make nonempty + let mut take_side = take_side; + if take_side.is_empty() { take_side.push(true) }; + + let iter = Memchr3::new(needle1, needle2, needle3, &data); + let all_found = double_ended_take( + iter, take_side.iter().cycle().cloned()); + + all_found + .iter() + .cloned() + .eq(positions3(needle1, needle2, needle3, &data)) + } + + fn qc_memchr1_iter(data: Vec) -> bool { + let needle = 0; + let answer = positions1(needle, &data); + answer.eq(Memchr::new(needle, &data)) + } + + fn qc_memchr1_rev_iter(data: Vec) -> bool { + let needle = 0; + let answer = positions1(needle, &data); + answer.rev().eq(Memchr::new(needle, &data).rev()) + } + + fn qc_memchr2_iter(data: Vec) -> bool { + let needle1 = 0; + let needle2 = 1; + let answer = positions2(needle1, needle2, &data); + answer.eq(Memchr2::new(needle1, needle2, &data)) + } + + fn qc_memchr2_rev_iter(data: Vec) -> bool { + let needle1 = 0; + let needle2 = 1; + let answer = positions2(needle1, needle2, &data); + answer.rev().eq(Memchr2::new(needle1, needle2, &data).rev()) + } + + fn qc_memchr3_iter(data: Vec) -> bool { + let needle1 = 0; + let needle2 = 1; + let needle3 = 2; + let answer = positions3(needle1, needle2, needle3, &data); + answer.eq(Memchr3::new(needle1, needle2, needle3, &data)) + } + + fn qc_memchr3_rev_iter(data: Vec) -> bool { + let needle1 = 0; + let needle2 = 1; + let needle3 = 2; + let answer = positions3(needle1, needle2, needle3, &data); + answer.rev().eq(Memchr3::new(needle1, needle2, needle3, &data).rev()) + } + + fn qc_memchr1_iter_size_hint(data: Vec) -> bool { + // test that the size hint is within reasonable bounds + let needle = 0; + let mut iter = Memchr::new(needle, &data); + let mut real_count = data + .iter() + .filter(|&&elt| elt == needle) + .count(); + + while let Some(index) = iter.next() { + real_count -= 1; + let (lower, upper) = iter.size_hint(); + assert!(lower <= real_count); + assert!(upper.unwrap() >= real_count); + assert!(upper.unwrap() <= data.len() - index); + } + true + } +} + +// take items from a DEI, taking front for each true and back for each false. +// Return a vector with the concatenation of the fronts and the reverse of the +// backs. +fn double_ended_take(mut iter: I, take_side: J) -> Vec +where + I: DoubleEndedIterator, + J: Iterator, +{ + let mut found_front = Vec::new(); + let mut found_back = Vec::new(); + + for take_front in take_side { + if take_front { + if let Some(pos) = iter.next() { + found_front.push(pos); + } else { + break; + } + } else { + if let Some(pos) = iter.next_back() { + found_back.push(pos); + } else { + break; + } + }; + } + + let mut all_found = found_front; + all_found.extend(found_back.into_iter().rev()); + all_found +} + +// return an iterator of the 0-based indices of haystack that match the needle +fn positions1<'a>( + n1: u8, + haystack: &'a [u8], +) -> Box + 'a> { + let it = haystack + .iter() + .enumerate() + .filter(move |&(_, &b)| b == n1) + .map(|t| t.0); + Box::new(it) +} + +fn positions2<'a>( + n1: u8, + n2: u8, + haystack: &'a [u8], +) -> Box + 'a> { + let it = haystack + .iter() + .enumerate() + .filter(move |&(_, &b)| b == n1 || b == n2) + .map(|t| t.0); + Box::new(it) +} + +fn positions3<'a>( + n1: u8, + n2: u8, + n3: u8, + haystack: &'a [u8], +) -> Box + 'a> { + let it = haystack + .iter() + .enumerate() + .filter(move |&(_, &b)| b == n1 || b == n2 || b == n3) + .map(|t| t.0); + Box::new(it) +} diff -Nru temporalio-1.3.0/vendor/memchr/src/tests/memchr/memchr.rs temporalio-1.3.0/vendor/memchr/src/tests/memchr/memchr.rs --- temporalio-1.3.0/vendor/memchr/src/tests/memchr/memchr.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/tests/memchr/memchr.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,134 @@ +use quickcheck::quickcheck; + +use crate::{ + memchr, + memchr::{fallback, naive}, + memchr2, memchr3, memrchr, memrchr2, memrchr3, + tests::memchr::testdata::memchr_tests, +}; + +#[test] +fn memchr1_find() { + for test in memchr_tests() { + test.one(false, memchr); + } +} + +#[test] +fn memchr1_fallback_find() { + for test in memchr_tests() { + test.one(false, fallback::memchr); + } +} + +#[test] +fn memchr2_find() { + for test in memchr_tests() { + test.two(false, memchr2); + } +} + +#[test] +fn memchr2_fallback_find() { + for test in memchr_tests() { + test.two(false, fallback::memchr2); + } +} + +#[test] +fn memchr3_find() { + for test in memchr_tests() { + test.three(false, memchr3); + } +} + +#[test] +fn memchr3_fallback_find() { + for test in memchr_tests() { + test.three(false, fallback::memchr3); + } +} + +#[test] +fn memrchr1_find() { + for test in memchr_tests() { + test.one(true, memrchr); + } +} + +#[test] +fn memrchr1_fallback_find() { + for test in memchr_tests() { + test.one(true, fallback::memrchr); + } +} + +#[test] +fn memrchr2_find() { + for test in memchr_tests() { + test.two(true, memrchr2); + } +} + +#[test] +fn memrchr2_fallback_find() { + for test in memchr_tests() { + test.two(true, fallback::memrchr2); + } +} + +#[test] +fn memrchr3_find() { + for test in memchr_tests() { + test.three(true, memrchr3); + } +} + +#[test] +fn memrchr3_fallback_find() { + for test in memchr_tests() { + test.three(true, fallback::memrchr3); + } +} + +quickcheck! { + fn qc_memchr1_matches_naive(n1: u8, corpus: Vec) -> bool { + memchr(n1, &corpus) == naive::memchr(n1, &corpus) + } +} + +quickcheck! { + fn qc_memchr2_matches_naive(n1: u8, n2: u8, corpus: Vec) -> bool { + memchr2(n1, n2, &corpus) == naive::memchr2(n1, n2, &corpus) + } +} + +quickcheck! { + fn qc_memchr3_matches_naive( + n1: u8, n2: u8, n3: u8, + corpus: Vec + ) -> bool { + memchr3(n1, n2, n3, &corpus) == naive::memchr3(n1, n2, n3, &corpus) + } +} + +quickcheck! { + fn qc_memrchr1_matches_naive(n1: u8, corpus: Vec) -> bool { + memrchr(n1, &corpus) == naive::memrchr(n1, &corpus) + } +} + +quickcheck! { + fn qc_memrchr2_matches_naive(n1: u8, n2: u8, corpus: Vec) -> bool { + memrchr2(n1, n2, &corpus) == naive::memrchr2(n1, n2, &corpus) + } +} + +quickcheck! { + fn qc_memrchr3_matches_naive( + n1: u8, n2: u8, n3: u8, + corpus: Vec + ) -> bool { + memrchr3(n1, n2, n3, &corpus) == naive::memrchr3(n1, n2, n3, &corpus) + } +} diff -Nru temporalio-1.3.0/vendor/memchr/src/tests/memchr/mod.rs temporalio-1.3.0/vendor/memchr/src/tests/memchr/mod.rs --- temporalio-1.3.0/vendor/memchr/src/tests/memchr/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/tests/memchr/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,307 +1,7 @@ -use alloc::{ - string::{String, ToString}, - vec, - vec::Vec, -}; - -use crate::ext::Byte; - -pub(crate) mod naive; -#[macro_use] -pub(crate) mod prop; - -const SEEDS: &'static [Seed] = &[ - Seed { haystack: "a", needles: &[b'a'], positions: &[0] }, - Seed { haystack: "aa", needles: &[b'a'], positions: &[0, 1] }, - Seed { haystack: "aaa", needles: &[b'a'], positions: &[0, 1, 2] }, - Seed { haystack: "", needles: &[b'a'], positions: &[] }, - Seed { haystack: "z", needles: &[b'a'], positions: &[] }, - Seed { haystack: "zz", needles: &[b'a'], positions: &[] }, - Seed { haystack: "zza", needles: &[b'a'], positions: &[2] }, - Seed { haystack: "zaza", needles: &[b'a'], positions: &[1, 3] }, - Seed { haystack: "zzza", needles: &[b'a'], positions: &[3] }, - Seed { haystack: "\x00a", needles: &[b'a'], positions: &[1] }, - Seed { haystack: "\x00", needles: &[b'\x00'], positions: &[0] }, - Seed { haystack: "\x00\x00", needles: &[b'\x00'], positions: &[0, 1] }, - Seed { haystack: "\x00a\x00", needles: &[b'\x00'], positions: &[0, 2] }, - Seed { haystack: "zzzzzzzzzzzzzzzza", needles: &[b'a'], positions: &[16] }, - Seed { - haystack: "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzza", - needles: &[b'a'], - positions: &[32], - }, - // two needles (applied to memchr2 + memchr3) - Seed { haystack: "az", needles: &[b'a', b'z'], positions: &[0, 1] }, - Seed { haystack: "az", needles: &[b'a', b'z'], positions: &[0, 1] }, - Seed { haystack: "az", needles: &[b'x', b'y'], positions: &[] }, - Seed { haystack: "az", needles: &[b'a', b'y'], positions: &[0] }, - Seed { haystack: "az", needles: &[b'x', b'z'], positions: &[1] }, - Seed { haystack: "yyyyaz", needles: &[b'a', b'z'], positions: &[4, 5] }, - Seed { haystack: "yyyyaz", needles: &[b'z', b'a'], positions: &[4, 5] }, - // three needles (applied to memchr3) - Seed { - haystack: "xyz", - needles: &[b'x', b'y', b'z'], - positions: &[0, 1, 2], - }, - Seed { - haystack: "zxy", - needles: &[b'x', b'y', b'z'], - positions: &[0, 1, 2], - }, - Seed { haystack: "zxy", needles: &[b'x', b'a', b'z'], positions: &[0, 1] }, - Seed { haystack: "zxy", needles: &[b't', b'a', b'z'], positions: &[0] }, - Seed { haystack: "yxz", needles: &[b't', b'a', b'z'], positions: &[2] }, -]; - -/// Runs a host of substring search tests. -/// -/// This has support for "partial" substring search implementations only work -/// for a subset of needles/haystacks. For example, the "packed pair" substring -/// search implementation only works for haystacks of some minimum length based -/// of the pair of bytes selected and the size of the vector used. -pub(crate) struct Runner { - needle_len: usize, -} - -impl Runner { - /// Create a new test runner for forward and reverse byte search - /// implementations. - /// - /// The `needle_len` given must be at most `3` and at least `1`. It - /// corresponds to the number of needle bytes to search for. - pub(crate) fn new(needle_len: usize) -> Runner { - assert!(needle_len >= 1, "needle_len must be at least 1"); - assert!(needle_len <= 3, "needle_len must be at most 3"); - Runner { needle_len } - } - - /// Run all tests. This panics on the first failure. - /// - /// If the implementation being tested returns `None` for a particular - /// haystack/needle combination, then that test is skipped. - pub(crate) fn forward_iter(self, mut test: F) - where - F: FnMut(&[u8], &[u8]) -> Option> + 'static, - { - for seed in SEEDS.iter() { - if seed.needles.len() > self.needle_len { - continue; - } - for t in seed.generate() { - let results = match test(t.haystack.as_bytes(), &t.needles) { - None => continue, - Some(results) => results, - }; - assert_eq!( - t.expected, - results, - "needles: {:?}, haystack: {:?}", - t.needles - .iter() - .map(|&b| b.to_char()) - .collect::>(), - t.haystack, - ); - } - } - } - - /// Run all tests in the reverse direction. This panics on the first - /// failure. - /// - /// If the implementation being tested returns `None` for a particular - /// haystack/needle combination, then that test is skipped. - pub(crate) fn reverse_iter(self, mut test: F) - where - F: FnMut(&[u8], &[u8]) -> Option> + 'static, - { - for seed in SEEDS.iter() { - if seed.needles.len() > self.needle_len { - continue; - } - for t in seed.generate() { - let mut results = match test(t.haystack.as_bytes(), &t.needles) - { - None => continue, - Some(results) => results, - }; - results.reverse(); - assert_eq!( - t.expected, - results, - "needles: {:?}, haystack: {:?}", - t.needles - .iter() - .map(|&b| b.to_char()) - .collect::>(), - t.haystack, - ); - } - } - } - - /// Run all tests as counting tests. This panics on the first failure. - /// - /// That is, this only checks that the number of matches is correct and - /// not whether the offsets of each match are. - pub(crate) fn count_iter(self, mut test: F) - where - F: FnMut(&[u8], &[u8]) -> Option + 'static, - { - for seed in SEEDS.iter() { - if seed.needles.len() > self.needle_len { - continue; - } - for t in seed.generate() { - let got = match test(t.haystack.as_bytes(), &t.needles) { - None => continue, - Some(got) => got, - }; - assert_eq!( - t.expected.len(), - got, - "needles: {:?}, haystack: {:?}", - t.needles - .iter() - .map(|&b| b.to_char()) - .collect::>(), - t.haystack, - ); - } - } - } - - /// Like `Runner::forward`, but for a function that returns only the next - /// match and not all matches. - /// - /// If the function returns `None`, then it is skipped. - pub(crate) fn forward_oneshot(self, mut test: F) - where - F: FnMut(&[u8], &[u8]) -> Option> + 'static, - { - self.forward_iter(move |haystack, needles| { - let mut start = 0; - let mut results = vec![]; - while let Some(i) = test(&haystack[start..], needles)? { - results.push(start + i); - start += i + 1; - } - Some(results) - }) - } - - /// Like `Runner::reverse`, but for a function that returns only the last - /// match and not all matches. - /// - /// If the function returns `None`, then it is skipped. - pub(crate) fn reverse_oneshot(self, mut test: F) - where - F: FnMut(&[u8], &[u8]) -> Option> + 'static, - { - self.reverse_iter(move |haystack, needles| { - let mut end = haystack.len(); - let mut results = vec![]; - while let Some(i) = test(&haystack[..end], needles)? { - results.push(i); - end = i; - } - Some(results) - }) - } -} - -/// A single test for memr?chr{,2,3}. -#[derive(Clone, Debug)] -struct Test { - /// The string to search in. - haystack: String, - /// The needles to look for. - needles: Vec, - /// The offsets that are expected to be found for all needles in the - /// forward direction. - expected: Vec, -} - -impl Test { - fn new(seed: &Seed) -> Test { - Test { - haystack: seed.haystack.to_string(), - needles: seed.needles.to_vec(), - expected: seed.positions.to_vec(), - } - } -} - -/// Data that can be expanded into many memchr tests by padding out the corpus. -#[derive(Clone, Debug)] -struct Seed { - /// The thing to search. We use `&str` instead of `&[u8]` because they - /// are nicer to write in tests, and we don't miss much since memchr - /// doesn't care about UTF-8. - /// - /// Corpora cannot contain either '%' or '#'. We use these bytes when - /// expanding test cases into many test cases, and we assume they are not - /// used. If they are used, `memchr_tests` will panic. - haystack: &'static str, - /// The needles to search for. This is intended to be an alternation of - /// needles. The number of needles may cause this test to be skipped for - /// some memchr variants. For example, a test with 2 needles cannot be used - /// to test `memchr`, but can be used to test `memchr2` and `memchr3`. - /// However, a test with only 1 needle can be used to test all of `memchr`, - /// `memchr2` and `memchr3`. We achieve this by filling in the needles with - /// bytes that we never used in the corpus (such as '#'). - needles: &'static [u8], - /// The positions expected to match for all of the needles. - positions: &'static [usize], -} - -impl Seed { - /// Controls how much we expand the haystack on either side for each test. - /// We lower this on Miri because otherwise running the tests would take - /// forever. - const EXPAND_LEN: usize = { - #[cfg(not(miri))] - { - 515 - } - #[cfg(miri)] - { - 6 - } - }; - - /// Expand this test into many variations of the same test. - /// - /// In particular, this will generate more tests with larger corpus sizes. - /// The expected positions are updated to maintain the integrity of the - /// test. - /// - /// This is important in testing a memchr implementation, because there are - /// often different cases depending on the length of the corpus. - /// - /// Note that we extend the corpus by adding `%` bytes, which we - /// don't otherwise use as a needle. - fn generate(&self) -> impl Iterator { - let mut more = vec![]; - - // Add bytes to the start of the corpus. - for i in 0..Seed::EXPAND_LEN { - let mut t = Test::new(self); - let mut new: String = core::iter::repeat('%').take(i).collect(); - new.push_str(&t.haystack); - t.haystack = new; - t.expected = t.expected.into_iter().map(|p| p + i).collect(); - more.push(t); - } - // Add bytes to the end of the corpus. - for i in 1..Seed::EXPAND_LEN { - let mut t = Test::new(self); - let padding: String = core::iter::repeat('%').take(i).collect(); - t.haystack.push_str(&padding); - more.push(t); - } - - more.into_iter() - } -} +#[cfg(all(feature = "std", not(miri)))] +mod iter; +#[cfg(all(feature = "std", not(miri)))] +mod memchr; +mod simple; +#[cfg(all(feature = "std", not(miri)))] +mod testdata; diff -Nru temporalio-1.3.0/vendor/memchr/src/tests/memchr/naive.rs temporalio-1.3.0/vendor/memchr/src/tests/memchr/naive.rs --- temporalio-1.3.0/vendor/memchr/src/tests/memchr/naive.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/tests/memchr/naive.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,33 +0,0 @@ -pub(crate) fn memchr(n1: u8, haystack: &[u8]) -> Option { - haystack.iter().position(|&b| b == n1) -} - -pub(crate) fn memchr2(n1: u8, n2: u8, haystack: &[u8]) -> Option { - haystack.iter().position(|&b| b == n1 || b == n2) -} - -pub(crate) fn memchr3( - n1: u8, - n2: u8, - n3: u8, - haystack: &[u8], -) -> Option { - haystack.iter().position(|&b| b == n1 || b == n2 || b == n3) -} - -pub(crate) fn memrchr(n1: u8, haystack: &[u8]) -> Option { - haystack.iter().rposition(|&b| b == n1) -} - -pub(crate) fn memrchr2(n1: u8, n2: u8, haystack: &[u8]) -> Option { - haystack.iter().rposition(|&b| b == n1 || b == n2) -} - -pub(crate) fn memrchr3( - n1: u8, - n2: u8, - n3: u8, - haystack: &[u8], -) -> Option { - haystack.iter().rposition(|&b| b == n1 || b == n2 || b == n3) -} diff -Nru temporalio-1.3.0/vendor/memchr/src/tests/memchr/prop.rs temporalio-1.3.0/vendor/memchr/src/tests/memchr/prop.rs --- temporalio-1.3.0/vendor/memchr/src/tests/memchr/prop.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/tests/memchr/prop.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,321 +0,0 @@ -#[cfg(miri)] -#[macro_export] -macro_rules! define_memchr_quickcheck { - ($($tt:tt)*) => {}; -} - -#[cfg(not(miri))] -#[macro_export] -macro_rules! define_memchr_quickcheck { - ($mod:ident) => { - define_memchr_quickcheck!($mod, new); - }; - ($mod:ident, $cons:ident) => { - use alloc::vec::Vec; - - use quickcheck::TestResult; - - use crate::tests::memchr::{ - naive, - prop::{double_ended_take, naive1_iter, naive2_iter, naive3_iter}, - }; - - quickcheck::quickcheck! { - fn qc_memchr_matches_naive(n1: u8, corpus: Vec) -> TestResult { - let expected = naive::memchr(n1, &corpus); - let got = match $mod::One::$cons(n1) { - None => return TestResult::discard(), - Some(f) => f.find(&corpus), - }; - TestResult::from_bool(expected == got) - } - - fn qc_memrchr_matches_naive(n1: u8, corpus: Vec) -> TestResult { - let expected = naive::memrchr(n1, &corpus); - let got = match $mod::One::$cons(n1) { - None => return TestResult::discard(), - Some(f) => f.rfind(&corpus), - }; - TestResult::from_bool(expected == got) - } - - fn qc_memchr2_matches_naive(n1: u8, n2: u8, corpus: Vec) -> TestResult { - let expected = naive::memchr2(n1, n2, &corpus); - let got = match $mod::Two::$cons(n1, n2) { - None => return TestResult::discard(), - Some(f) => f.find(&corpus), - }; - TestResult::from_bool(expected == got) - } - - fn qc_memrchr2_matches_naive(n1: u8, n2: u8, corpus: Vec) -> TestResult { - let expected = naive::memrchr2(n1, n2, &corpus); - let got = match $mod::Two::$cons(n1, n2) { - None => return TestResult::discard(), - Some(f) => f.rfind(&corpus), - }; - TestResult::from_bool(expected == got) - } - - fn qc_memchr3_matches_naive( - n1: u8, n2: u8, n3: u8, - corpus: Vec - ) -> TestResult { - let expected = naive::memchr3(n1, n2, n3, &corpus); - let got = match $mod::Three::$cons(n1, n2, n3) { - None => return TestResult::discard(), - Some(f) => f.find(&corpus), - }; - TestResult::from_bool(expected == got) - } - - fn qc_memrchr3_matches_naive( - n1: u8, n2: u8, n3: u8, - corpus: Vec - ) -> TestResult { - let expected = naive::memrchr3(n1, n2, n3, &corpus); - let got = match $mod::Three::$cons(n1, n2, n3) { - None => return TestResult::discard(), - Some(f) => f.rfind(&corpus), - }; - TestResult::from_bool(expected == got) - } - - fn qc_memchr_double_ended_iter( - needle: u8, data: Vec, take_side: Vec - ) -> TestResult { - // make nonempty - let mut take_side = take_side; - if take_side.is_empty() { take_side.push(true) }; - - let finder = match $mod::One::$cons(needle) { - None => return TestResult::discard(), - Some(finder) => finder, - }; - let iter = finder.iter(&data); - let got = double_ended_take( - iter, - take_side.iter().cycle().cloned(), - ); - let expected = naive1_iter(needle, &data); - - TestResult::from_bool(got.iter().cloned().eq(expected)) - } - - fn qc_memchr2_double_ended_iter( - needle1: u8, needle2: u8, data: Vec, take_side: Vec - ) -> TestResult { - // make nonempty - let mut take_side = take_side; - if take_side.is_empty() { take_side.push(true) }; - - let finder = match $mod::Two::$cons(needle1, needle2) { - None => return TestResult::discard(), - Some(finder) => finder, - }; - let iter = finder.iter(&data); - let got = double_ended_take( - iter, - take_side.iter().cycle().cloned(), - ); - let expected = naive2_iter(needle1, needle2, &data); - - TestResult::from_bool(got.iter().cloned().eq(expected)) - } - - fn qc_memchr3_double_ended_iter( - needle1: u8, needle2: u8, needle3: u8, - data: Vec, take_side: Vec - ) -> TestResult { - // make nonempty - let mut take_side = take_side; - if take_side.is_empty() { take_side.push(true) }; - - let finder = match $mod::Three::$cons(needle1, needle2, needle3) { - None => return TestResult::discard(), - Some(finder) => finder, - }; - let iter = finder.iter(&data); - let got = double_ended_take( - iter, - take_side.iter().cycle().cloned(), - ); - let expected = naive3_iter(needle1, needle2, needle3, &data); - - TestResult::from_bool(got.iter().cloned().eq(expected)) - } - - fn qc_memchr1_iter(data: Vec) -> TestResult { - let needle = 0; - let finder = match $mod::One::$cons(needle) { - None => return TestResult::discard(), - Some(finder) => finder, - }; - let got = finder.iter(&data); - let expected = naive1_iter(needle, &data); - TestResult::from_bool(got.eq(expected)) - } - - fn qc_memchr1_rev_iter(data: Vec) -> TestResult { - let needle = 0; - - let finder = match $mod::One::$cons(needle) { - None => return TestResult::discard(), - Some(finder) => finder, - }; - let got = finder.iter(&data).rev(); - let expected = naive1_iter(needle, &data).rev(); - TestResult::from_bool(got.eq(expected)) - } - - fn qc_memchr2_iter(data: Vec) -> TestResult { - let needle1 = 0; - let needle2 = 1; - - let finder = match $mod::Two::$cons(needle1, needle2) { - None => return TestResult::discard(), - Some(finder) => finder, - }; - let got = finder.iter(&data); - let expected = naive2_iter(needle1, needle2, &data); - TestResult::from_bool(got.eq(expected)) - } - - fn qc_memchr2_rev_iter(data: Vec) -> TestResult { - let needle1 = 0; - let needle2 = 1; - - let finder = match $mod::Two::$cons(needle1, needle2) { - None => return TestResult::discard(), - Some(finder) => finder, - }; - let got = finder.iter(&data).rev(); - let expected = naive2_iter(needle1, needle2, &data).rev(); - TestResult::from_bool(got.eq(expected)) - } - - fn qc_memchr3_iter(data: Vec) -> TestResult { - let needle1 = 0; - let needle2 = 1; - let needle3 = 2; - - let finder = match $mod::Three::$cons(needle1, needle2, needle3) { - None => return TestResult::discard(), - Some(finder) => finder, - }; - let got = finder.iter(&data); - let expected = naive3_iter(needle1, needle2, needle3, &data); - TestResult::from_bool(got.eq(expected)) - } - - fn qc_memchr3_rev_iter(data: Vec) -> TestResult { - let needle1 = 0; - let needle2 = 1; - let needle3 = 2; - - let finder = match $mod::Three::$cons(needle1, needle2, needle3) { - None => return TestResult::discard(), - Some(finder) => finder, - }; - let got = finder.iter(&data).rev(); - let expected = naive3_iter(needle1, needle2, needle3, &data).rev(); - TestResult::from_bool(got.eq(expected)) - } - - fn qc_memchr1_iter_size_hint(data: Vec) -> TestResult { - // test that the size hint is within reasonable bounds - let needle = 0; - let finder = match $mod::One::$cons(needle) { - None => return TestResult::discard(), - Some(finder) => finder, - }; - let mut iter = finder.iter(&data); - let mut real_count = data - .iter() - .filter(|&&elt| elt == needle) - .count(); - - while let Some(index) = iter.next() { - real_count -= 1; - let (lower, upper) = iter.size_hint(); - assert!(lower <= real_count); - assert!(upper.unwrap() >= real_count); - assert!(upper.unwrap() <= data.len() - index); - } - TestResult::passed() - } - } - }; -} - -// take items from a DEI, taking front for each true and back for each false. -// Return a vector with the concatenation of the fronts and the reverse of the -// backs. -#[cfg(not(miri))] -pub(crate) fn double_ended_take( - mut iter: I, - take_side: J, -) -> alloc::vec::Vec -where - I: DoubleEndedIterator, - J: Iterator, -{ - let mut found_front = alloc::vec![]; - let mut found_back = alloc::vec![]; - - for take_front in take_side { - if take_front { - if let Some(pos) = iter.next() { - found_front.push(pos); - } else { - break; - } - } else { - if let Some(pos) = iter.next_back() { - found_back.push(pos); - } else { - break; - } - }; - } - - let mut all_found = found_front; - all_found.extend(found_back.into_iter().rev()); - all_found -} - -// return an iterator of the 0-based indices of haystack that match the needle -#[cfg(not(miri))] -pub(crate) fn naive1_iter<'a>( - n1: u8, - haystack: &'a [u8], -) -> impl DoubleEndedIterator + 'a { - haystack.iter().enumerate().filter(move |&(_, &b)| b == n1).map(|t| t.0) -} - -#[cfg(not(miri))] -pub(crate) fn naive2_iter<'a>( - n1: u8, - n2: u8, - haystack: &'a [u8], -) -> impl DoubleEndedIterator + 'a { - haystack - .iter() - .enumerate() - .filter(move |&(_, &b)| b == n1 || b == n2) - .map(|t| t.0) -} - -#[cfg(not(miri))] -pub(crate) fn naive3_iter<'a>( - n1: u8, - n2: u8, - n3: u8, - haystack: &'a [u8], -) -> impl DoubleEndedIterator + 'a { - haystack - .iter() - .enumerate() - .filter(move |&(_, &b)| b == n1 || b == n2 || b == n3) - .map(|t| t.0) -} diff -Nru temporalio-1.3.0/vendor/memchr/src/tests/memchr/simple.rs temporalio-1.3.0/vendor/memchr/src/tests/memchr/simple.rs --- temporalio-1.3.0/vendor/memchr/src/tests/memchr/simple.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/tests/memchr/simple.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,23 @@ +// Simple tests using MIRI. These are intended only to be a simple exercise of +// memchr when tests are run under miri. These are mostly necessary because the +// other tests are far more extensive and take too long to run under miri. +// +// These tests are also run when the 'std' feature is not enabled. + +use crate::{memchr, memchr2, memchr3, memrchr, memrchr2, memrchr3}; + +#[test] +fn simple() { + assert_eq!(memchr(b'a', b"abcda"), Some(0)); + assert_eq!(memchr(b'z', b"abcda"), None); + assert_eq!(memchr2(b'a', b'z', b"abcda"), Some(0)); + assert_eq!(memchr2(b'z', b'y', b"abcda"), None); + assert_eq!(memchr3(b'a', b'z', b'b', b"abcda"), Some(0)); + assert_eq!(memchr3(b'z', b'y', b'x', b"abcda"), None); + assert_eq!(memrchr(b'a', b"abcda"), Some(4)); + assert_eq!(memrchr(b'z', b"abcda"), None); + assert_eq!(memrchr2(b'a', b'z', b"abcda"), Some(4)); + assert_eq!(memrchr2(b'z', b'y', b"abcda"), None); + assert_eq!(memrchr3(b'a', b'z', b'b', b"abcda"), Some(4)); + assert_eq!(memrchr3(b'z', b'y', b'x', b"abcda"), None); +} diff -Nru temporalio-1.3.0/vendor/memchr/src/tests/memchr/testdata.rs temporalio-1.3.0/vendor/memchr/src/tests/memchr/testdata.rs --- temporalio-1.3.0/vendor/memchr/src/tests/memchr/testdata.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/tests/memchr/testdata.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,351 @@ +use std::iter::repeat; + +/// Create a sequence of tests that should be run by memchr implementations. +pub fn memchr_tests() -> Vec { + let mut tests = Vec::new(); + for statict in MEMCHR_TESTS { + assert!(!statict.corpus.contains("%"), "% is not allowed in corpora"); + assert!(!statict.corpus.contains("#"), "# is not allowed in corpora"); + assert!(!statict.needles.contains(&b'%'), "% is an invalid needle"); + assert!(!statict.needles.contains(&b'#'), "# is an invalid needle"); + + let t = MemchrTest { + corpus: statict.corpus.to_string(), + needles: statict.needles.to_vec(), + positions: statict.positions.to_vec(), + }; + tests.push(t.clone()); + tests.extend(t.expand()); + } + tests +} + +/// A set of tests for memchr-like functions. +/// +/// These tests mostly try to cover the short string cases. We cover the longer +/// string cases via the benchmarks (which are tests themselves), via +/// quickcheck tests and via automatic expansion of each test case (by +/// increasing the corpus size). Finally, we cover different alignment cases +/// in the tests by varying the starting point of the slice. +const MEMCHR_TESTS: &[MemchrTestStatic] = &[ + // one needle (applied to memchr + memchr2 + memchr3) + MemchrTestStatic { corpus: "a", needles: &[b'a'], positions: &[0] }, + MemchrTestStatic { corpus: "aa", needles: &[b'a'], positions: &[0, 1] }, + MemchrTestStatic { + corpus: "aaa", + needles: &[b'a'], + positions: &[0, 1, 2], + }, + MemchrTestStatic { corpus: "", needles: &[b'a'], positions: &[] }, + MemchrTestStatic { corpus: "z", needles: &[b'a'], positions: &[] }, + MemchrTestStatic { corpus: "zz", needles: &[b'a'], positions: &[] }, + MemchrTestStatic { corpus: "zza", needles: &[b'a'], positions: &[2] }, + MemchrTestStatic { corpus: "zaza", needles: &[b'a'], positions: &[1, 3] }, + MemchrTestStatic { corpus: "zzza", needles: &[b'a'], positions: &[3] }, + MemchrTestStatic { corpus: "\x00a", needles: &[b'a'], positions: &[1] }, + MemchrTestStatic { corpus: "\x00", needles: &[b'\x00'], positions: &[0] }, + MemchrTestStatic { + corpus: "\x00\x00", + needles: &[b'\x00'], + positions: &[0, 1], + }, + MemchrTestStatic { + corpus: "\x00a\x00", + needles: &[b'\x00'], + positions: &[0, 2], + }, + MemchrTestStatic { + corpus: "zzzzzzzzzzzzzzzza", + needles: &[b'a'], + positions: &[16], + }, + MemchrTestStatic { + corpus: "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzza", + needles: &[b'a'], + positions: &[32], + }, + // two needles (applied to memchr2 + memchr3) + MemchrTestStatic { + corpus: "az", + needles: &[b'a', b'z'], + positions: &[0, 1], + }, + MemchrTestStatic { + corpus: "az", + needles: &[b'a', b'z'], + positions: &[0, 1], + }, + MemchrTestStatic { corpus: "az", needles: &[b'x', b'y'], positions: &[] }, + MemchrTestStatic { corpus: "az", needles: &[b'a', b'y'], positions: &[0] }, + MemchrTestStatic { corpus: "az", needles: &[b'x', b'z'], positions: &[1] }, + MemchrTestStatic { + corpus: "yyyyaz", + needles: &[b'a', b'z'], + positions: &[4, 5], + }, + MemchrTestStatic { + corpus: "yyyyaz", + needles: &[b'z', b'a'], + positions: &[4, 5], + }, + // three needles (applied to memchr3) + MemchrTestStatic { + corpus: "xyz", + needles: &[b'x', b'y', b'z'], + positions: &[0, 1, 2], + }, + MemchrTestStatic { + corpus: "zxy", + needles: &[b'x', b'y', b'z'], + positions: &[0, 1, 2], + }, + MemchrTestStatic { + corpus: "zxy", + needles: &[b'x', b'a', b'z'], + positions: &[0, 1], + }, + MemchrTestStatic { + corpus: "zxy", + needles: &[b't', b'a', b'z'], + positions: &[0], + }, + MemchrTestStatic { + corpus: "yxz", + needles: &[b't', b'a', b'z'], + positions: &[2], + }, +]; + +/// A description of a test on a memchr like function. +#[derive(Clone, Debug)] +pub struct MemchrTest { + /// The thing to search. We use `&str` instead of `&[u8]` because they + /// are nicer to write in tests, and we don't miss much since memchr + /// doesn't care about UTF-8. + /// + /// Corpora cannot contain either '%' or '#'. We use these bytes when + /// expanding test cases into many test cases, and we assume they are not + /// used. If they are used, `memchr_tests` will panic. + corpus: String, + /// The needles to search for. This is intended to be an "alternation" of + /// needles. The number of needles may cause this test to be skipped for + /// some memchr variants. For example, a test with 2 needles cannot be used + /// to test `memchr`, but can be used to test `memchr2` and `memchr3`. + /// However, a test with only 1 needle can be used to test all of `memchr`, + /// `memchr2` and `memchr3`. We achieve this by filling in the needles with + /// bytes that we never used in the corpus (such as '#'). + needles: Vec, + /// The positions expected to match for all of the needles. + positions: Vec, +} + +/// Like MemchrTest, but easier to define as a constant. +#[derive(Clone, Debug)] +pub struct MemchrTestStatic { + corpus: &'static str, + needles: &'static [u8], + positions: &'static [usize], +} + +impl MemchrTest { + pub fn one Option>(&self, reverse: bool, f: F) { + let needles = match self.needles(1) { + None => return, + Some(needles) => needles, + }; + // We test different alignments here. Since some implementations use + // AVX2, which can read 32 bytes at a time, we test at least that. + // Moreover, with loop unrolling, we sometimes process 64 (sse2) or 128 + // (avx) bytes at a time, so we include that in our offsets as well. + // + // You might think this would cause most needles to not be found, but + // we actually expand our tests to include corpus sizes all the way up + // to >500 bytes, so we should exercise most branches. + for align in 0..130 { + let corpus = self.corpus(align); + assert_eq!( + self.positions(align, reverse).get(0).cloned(), + f(needles[0], corpus.as_bytes()), + "search for {:?} failed in: {:?} (len: {}, alignment: {})", + needles[0] as char, + corpus, + corpus.len(), + align + ); + } + } + + pub fn two Option>( + &self, + reverse: bool, + f: F, + ) { + let needles = match self.needles(2) { + None => return, + Some(needles) => needles, + }; + for align in 0..130 { + let corpus = self.corpus(align); + assert_eq!( + self.positions(align, reverse).get(0).cloned(), + f(needles[0], needles[1], corpus.as_bytes()), + "search for {:?}|{:?} failed in: {:?} \ + (len: {}, alignment: {})", + needles[0] as char, + needles[1] as char, + corpus, + corpus.len(), + align + ); + } + } + + pub fn three Option>( + &self, + reverse: bool, + f: F, + ) { + let needles = match self.needles(3) { + None => return, + Some(needles) => needles, + }; + for align in 0..130 { + let corpus = self.corpus(align); + assert_eq!( + self.positions(align, reverse).get(0).cloned(), + f(needles[0], needles[1], needles[2], corpus.as_bytes()), + "search for {:?}|{:?}|{:?} failed in: {:?} \ + (len: {}, alignment: {})", + needles[0] as char, + needles[1] as char, + needles[2] as char, + corpus, + corpus.len(), + align + ); + } + } + + pub fn iter_one<'a, I, F>(&'a self, reverse: bool, f: F) + where + F: FnOnce(u8, &'a [u8]) -> I, + I: Iterator, + { + if let Some(ns) = self.needles(1) { + self.iter(reverse, f(ns[0], self.corpus.as_bytes())); + } + } + + pub fn iter_two<'a, I, F>(&'a self, reverse: bool, f: F) + where + F: FnOnce(u8, u8, &'a [u8]) -> I, + I: Iterator, + { + if let Some(ns) = self.needles(2) { + self.iter(reverse, f(ns[0], ns[1], self.corpus.as_bytes())); + } + } + + pub fn iter_three<'a, I, F>(&'a self, reverse: bool, f: F) + where + F: FnOnce(u8, u8, u8, &'a [u8]) -> I, + I: Iterator, + { + if let Some(ns) = self.needles(3) { + self.iter(reverse, f(ns[0], ns[1], ns[2], self.corpus.as_bytes())); + } + } + + /// Test that the positions yielded by the given iterator match the + /// positions in this test. If reverse is true, then reverse the positions + /// before comparing them. + fn iter>(&self, reverse: bool, it: I) { + assert_eq!( + self.positions(0, reverse), + it.collect::>(), + r"search for {:?} failed in: {:?}", + self.needles.iter().map(|&b| b as char).collect::>(), + self.corpus + ); + } + + /// Expand this test into many variations of the same test. + /// + /// In particular, this will generate more tests with larger corpus sizes. + /// The expected positions are updated to maintain the integrity of the + /// test. + /// + /// This is important in testing a memchr implementation, because there are + /// often different cases depending on the length of the corpus. + /// + /// Note that we extend the corpus by adding `%` bytes, which we + /// don't otherwise use as a needle. + fn expand(&self) -> Vec { + let mut more = Vec::new(); + + // Add bytes to the start of the corpus. + for i in 1..515 { + let mut t = self.clone(); + let mut new_corpus: String = repeat('%').take(i).collect(); + new_corpus.push_str(&t.corpus); + t.corpus = new_corpus; + t.positions = t.positions.into_iter().map(|p| p + i).collect(); + more.push(t); + } + // Add bytes to the end of the corpus. + for i in 1..515 { + let mut t = self.clone(); + let padding: String = repeat('%').take(i).collect(); + t.corpus.push_str(&padding); + more.push(t); + } + + more + } + + /// Return the corpus at the given alignment. + /// + /// If the alignment exceeds the length of the corpus, then this returns + /// an empty slice. + fn corpus(&self, align: usize) -> &str { + self.corpus.get(align..).unwrap_or("") + } + + /// Return exactly `count` needles from this test. If this test has less + /// than `count` needles, then add `#` until the number of needles + /// matches `count`. If this test has more than `count` needles, then + /// return `None` (because there is no way to use this test data for a + /// search using fewer needles). + fn needles(&self, count: usize) -> Option> { + if self.needles.len() > count { + return None; + } + + let mut needles = self.needles.to_vec(); + for _ in needles.len()..count { + // we assume # is never used in tests. + needles.push(b'#'); + } + Some(needles) + } + + /// Return the positions in this test, reversed if `reverse` is true. + /// + /// If alignment is given, then all positions greater than or equal to that + /// alignment are offset by the alignment. Positions less than the + /// alignment are dropped. + fn positions(&self, align: usize, reverse: bool) -> Vec { + let positions = if reverse { + let mut positions = self.positions.to_vec(); + positions.reverse(); + positions + } else { + self.positions.to_vec() + }; + positions + .into_iter() + .filter(|&p| p >= align) + .map(|p| p - align) + .collect() + } +} diff -Nru temporalio-1.3.0/vendor/memchr/src/tests/mod.rs temporalio-1.3.0/vendor/memchr/src/tests/mod.rs --- temporalio-1.3.0/vendor/memchr/src/tests/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/tests/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,15 +1,15 @@ -#[macro_use] -pub(crate) mod memchr; -pub(crate) mod packedpair; -#[macro_use] -pub(crate) mod substring; +mod memchr; // For debugging, particularly in CI, print out the byte order of the current // target. +#[cfg(all(feature = "std", target_endian = "little"))] #[test] fn byte_order() { - #[cfg(target_endian = "little")] - std::eprintln!("LITTLE ENDIAN"); - #[cfg(target_endian = "big")] - std::eprintln!("BIG ENDIAN"); + eprintln!("LITTLE ENDIAN"); +} + +#[cfg(all(feature = "std", target_endian = "big"))] +#[test] +fn byte_order() { + eprintln!("BIG ENDIAN"); } diff -Nru temporalio-1.3.0/vendor/memchr/src/tests/packedpair.rs temporalio-1.3.0/vendor/memchr/src/tests/packedpair.rs --- temporalio-1.3.0/vendor/memchr/src/tests/packedpair.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/tests/packedpair.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,216 +0,0 @@ -use alloc::{boxed::Box, vec, vec::Vec}; - -/// A set of "packed pair" test seeds. Each seed serves as the base for the -/// generation of many other tests. In essence, the seed captures the pair of -/// bytes we used for a predicate and first byte among our needle. The tests -/// generated from each seed essentially vary the length of the needle and -/// haystack, while using the rare/first byte configuration from the seed. -/// -/// The purpose of this is to test many different needle/haystack lengths. -/// In particular, some of the vector optimizations might only have bugs -/// in haystacks of a certain size. -const SEEDS: &[Seed] = &[ - // Why not use different 'first' bytes? It seemed like a good idea to be - // able to configure it, but when I wrote the test generator below, it - // didn't seem necessary to use for reasons that I forget. - Seed { first: b'x', index1: b'y', index2: b'z' }, - Seed { first: b'x', index1: b'x', index2: b'z' }, - Seed { first: b'x', index1: b'y', index2: b'x' }, - Seed { first: b'x', index1: b'x', index2: b'x' }, - Seed { first: b'x', index1: b'y', index2: b'y' }, -]; - -/// Runs a host of "packed pair" search tests. -/// -/// These tests specifically look for the occurrence of a possible substring -/// match based on a pair of bytes matching at the right offsets. -pub(crate) struct Runner { - fwd: Option< - Box< - dyn FnMut(&[u8], &[u8], u8, u8) -> Option> + 'static, - >, - >, -} - -impl Runner { - /// Create a new test runner for "packed pair" substring search. - pub(crate) fn new() -> Runner { - Runner { fwd: None } - } - - /// Run all tests. This panics on the first failure. - /// - /// If the implementation being tested returns `None` for a particular - /// haystack/needle combination, then that test is skipped. - /// - /// This runs tests on both the forward and reverse implementations given. - /// If either (or both) are missing, then tests for that implementation are - /// skipped. - pub(crate) fn run(self) { - if let Some(mut fwd) = self.fwd { - for seed in SEEDS.iter() { - for t in seed.generate() { - match fwd(&t.haystack, &t.needle, t.index1, t.index2) { - None => continue, - Some(result) => { - assert_eq!( - t.fwd, result, - "FORWARD, needle: {:?}, haystack: {:?}, \ - index1: {:?}, index2: {:?}", - t.needle, t.haystack, t.index1, t.index2, - ) - } - } - } - } - } - } - - /// Set the implementation for forward "packed pair" substring search. - /// - /// If the closure returns `None`, then it is assumed that the given - /// test cannot be applied to the particular implementation and it is - /// skipped. For example, if a particular implementation only supports - /// needles or haystacks for some minimum length. - /// - /// If this is not set, then forward "packed pair" search is not tested. - pub(crate) fn fwd( - mut self, - search: impl FnMut(&[u8], &[u8], u8, u8) -> Option> + 'static, - ) -> Runner { - self.fwd = Some(Box::new(search)); - self - } -} - -/// A test that represents the input and expected output to a "packed pair" -/// search function. The test should be able to run with any "packed pair" -/// implementation and get the expected output. -struct Test { - haystack: Vec, - needle: Vec, - index1: u8, - index2: u8, - fwd: Option, -} - -impl Test { - /// Create a new "packed pair" test from a seed and some given offsets to - /// the pair of bytes to use as a predicate in the seed's needle. - /// - /// If a valid test could not be constructed, then None is returned. - /// (Currently, we take the approach of massaging tests to be valid - /// instead of rejecting them outright.) - fn new( - seed: Seed, - index1: usize, - index2: usize, - haystack_len: usize, - needle_len: usize, - fwd: Option, - ) -> Option { - let mut index1: u8 = index1.try_into().unwrap(); - let mut index2: u8 = index2.try_into().unwrap(); - // The '#' byte is never used in a haystack (unless we're expecting - // a match), while the '@' byte is never used in a needle. - let mut haystack = vec![b'@'; haystack_len]; - let mut needle = vec![b'#'; needle_len]; - needle[0] = seed.first; - needle[index1 as usize] = seed.index1; - needle[index2 as usize] = seed.index2; - // If we're expecting a match, then make sure the needle occurs - // in the haystack at the expected position. - if let Some(i) = fwd { - haystack[i..i + needle.len()].copy_from_slice(&needle); - } - // If the operations above lead to rare offsets pointing to the - // non-first occurrence of a byte, then adjust it. This might lead - // to redundant tests, but it's simpler than trying to change the - // generation process I think. - if let Some(i) = crate::memchr(seed.index1, &needle) { - index1 = u8::try_from(i).unwrap(); - } - if let Some(i) = crate::memchr(seed.index2, &needle) { - index2 = u8::try_from(i).unwrap(); - } - Some(Test { haystack, needle, index1, index2, fwd }) - } -} - -/// Data that describes a single prefilter test seed. -#[derive(Clone, Copy)] -struct Seed { - first: u8, - index1: u8, - index2: u8, -} - -impl Seed { - const NEEDLE_LENGTH_LIMIT: usize = { - #[cfg(not(miri))] - { - 33 - } - #[cfg(miri)] - { - 5 - } - }; - - const HAYSTACK_LENGTH_LIMIT: usize = { - #[cfg(not(miri))] - { - 65 - } - #[cfg(miri)] - { - 8 - } - }; - - /// Generate a series of prefilter tests from this seed. - fn generate(self) -> impl Iterator { - let len_start = 2; - // The iterator below generates *a lot* of tests. The number of - // tests was chosen somewhat empirically to be "bearable" when - // running the test suite. - // - // We use an iterator here because the collective haystacks of all - // these test cases add up to enough memory to OOM a conservative - // sandbox or a small laptop. - (len_start..=Seed::NEEDLE_LENGTH_LIMIT).flat_map(move |needle_len| { - let index_start = len_start - 1; - (index_start..needle_len).flat_map(move |index1| { - (index1..needle_len).flat_map(move |index2| { - (needle_len..=Seed::HAYSTACK_LENGTH_LIMIT).flat_map( - move |haystack_len| { - Test::new( - self, - index1, - index2, - haystack_len, - needle_len, - None, - ) - .into_iter() - .chain( - (0..=(haystack_len - needle_len)).flat_map( - move |output| { - Test::new( - self, - index1, - index2, - haystack_len, - needle_len, - Some(output), - ) - }, - ), - ) - }, - ) - }) - }) - }) - } -} diff -Nru temporalio-1.3.0/vendor/memchr/src/tests/substring/mod.rs temporalio-1.3.0/vendor/memchr/src/tests/substring/mod.rs --- temporalio-1.3.0/vendor/memchr/src/tests/substring/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/tests/substring/mod.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,232 +0,0 @@ -/*! -This module defines tests and test helpers for substring implementations. -*/ - -use alloc::{ - boxed::Box, - format, - string::{String, ToString}, -}; - -pub(crate) mod naive; -#[macro_use] -pub(crate) mod prop; - -const SEEDS: &'static [Seed] = &[ - Seed::new("", "", Some(0), Some(0)), - Seed::new("", "a", Some(0), Some(1)), - Seed::new("", "ab", Some(0), Some(2)), - Seed::new("", "abc", Some(0), Some(3)), - Seed::new("a", "", None, None), - Seed::new("a", "a", Some(0), Some(0)), - Seed::new("a", "aa", Some(0), Some(1)), - Seed::new("a", "ba", Some(1), Some(1)), - Seed::new("a", "bba", Some(2), Some(2)), - Seed::new("a", "bbba", Some(3), Some(3)), - Seed::new("a", "bbbab", Some(3), Some(3)), - Seed::new("a", "bbbabb", Some(3), Some(3)), - Seed::new("a", "bbbabbb", Some(3), Some(3)), - Seed::new("a", "bbbbbb", None, None), - Seed::new("ab", "", None, None), - Seed::new("ab", "a", None, None), - Seed::new("ab", "b", None, None), - Seed::new("ab", "ab", Some(0), Some(0)), - Seed::new("ab", "aab", Some(1), Some(1)), - Seed::new("ab", "aaab", Some(2), Some(2)), - Seed::new("ab", "abaab", Some(0), Some(3)), - Seed::new("ab", "baaab", Some(3), Some(3)), - Seed::new("ab", "acb", None, None), - Seed::new("ab", "abba", Some(0), Some(0)), - Seed::new("abc", "ab", None, None), - Seed::new("abc", "abc", Some(0), Some(0)), - Seed::new("abc", "abcz", Some(0), Some(0)), - Seed::new("abc", "abczz", Some(0), Some(0)), - Seed::new("abc", "zabc", Some(1), Some(1)), - Seed::new("abc", "zzabc", Some(2), Some(2)), - Seed::new("abc", "azbc", None, None), - Seed::new("abc", "abzc", None, None), - Seed::new("abczdef", "abczdefzzzzzzzzzzzzzzzzzzzz", Some(0), Some(0)), - Seed::new("abczdef", "zzzzzzzzzzzzzzzzzzzzabczdef", Some(20), Some(20)), - Seed::new( - "xyz", - "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxyz", - Some(32), - Some(32), - ), - Seed::new("\u{0}\u{15}", "\u{0}\u{15}\u{15}\u{0}", Some(0), Some(0)), - Seed::new("\u{0}\u{1e}", "\u{1e}\u{0}", None, None), -]; - -/// Runs a host of substring search tests. -/// -/// This has support for "partial" substring search implementations only work -/// for a subset of needles/haystacks. For example, the "packed pair" substring -/// search implementation only works for haystacks of some minimum length based -/// of the pair of bytes selected and the size of the vector used. -pub(crate) struct Runner { - fwd: Option< - Box Option> + 'static>, - >, - rev: Option< - Box Option> + 'static>, - >, -} - -impl Runner { - /// Create a new test runner for forward and reverse substring search - /// implementations. - pub(crate) fn new() -> Runner { - Runner { fwd: None, rev: None } - } - - /// Run all tests. This panics on the first failure. - /// - /// If the implementation being tested returns `None` for a particular - /// haystack/needle combination, then that test is skipped. - /// - /// This runs tests on both the forward and reverse implementations given. - /// If either (or both) are missing, then tests for that implementation are - /// skipped. - pub(crate) fn run(self) { - if let Some(mut fwd) = self.fwd { - for seed in SEEDS.iter() { - for t in seed.generate() { - match fwd(t.haystack.as_bytes(), t.needle.as_bytes()) { - None => continue, - Some(result) => { - assert_eq!( - t.fwd, result, - "FORWARD, needle: {:?}, haystack: {:?}", - t.needle, t.haystack, - ); - } - } - } - } - } - if let Some(mut rev) = self.rev { - for seed in SEEDS.iter() { - for t in seed.generate() { - match rev(t.haystack.as_bytes(), t.needle.as_bytes()) { - None => continue, - Some(result) => { - assert_eq!( - t.rev, result, - "REVERSE, needle: {:?}, haystack: {:?}", - t.needle, t.haystack, - ); - } - } - } - } - } - } - - /// Set the implementation for forward substring search. - /// - /// If the closure returns `None`, then it is assumed that the given - /// test cannot be applied to the particular implementation and it is - /// skipped. For example, if a particular implementation only supports - /// needles or haystacks for some minimum length. - /// - /// If this is not set, then forward substring search is not tested. - pub(crate) fn fwd( - mut self, - search: impl FnMut(&[u8], &[u8]) -> Option> + 'static, - ) -> Runner { - self.fwd = Some(Box::new(search)); - self - } - - /// Set the implementation for reverse substring search. - /// - /// If the closure returns `None`, then it is assumed that the given - /// test cannot be applied to the particular implementation and it is - /// skipped. For example, if a particular implementation only supports - /// needles or haystacks for some minimum length. - /// - /// If this is not set, then reverse substring search is not tested. - pub(crate) fn rev( - mut self, - search: impl FnMut(&[u8], &[u8]) -> Option> + 'static, - ) -> Runner { - self.rev = Some(Box::new(search)); - self - } -} - -/// A single substring test for forward and reverse searches. -#[derive(Clone, Debug)] -struct Test { - needle: String, - haystack: String, - fwd: Option, - rev: Option, -} - -/// A single substring test for forward and reverse searches. -/// -/// Each seed is valid on its own, but it also serves as a starting point -/// to generate more tests. Namely, we pad out the haystacks with other -/// characters so that we get more complete coverage. This is especially useful -/// for testing vector algorithms that tend to have weird special cases for -/// alignment and loop unrolling. -/// -/// Padding works by assuming certain characters never otherwise appear in a -/// needle or a haystack. Neither should contain a `#` character. -#[derive(Clone, Copy, Debug)] -struct Seed { - needle: &'static str, - haystack: &'static str, - fwd: Option, - rev: Option, -} - -impl Seed { - const MAX_PAD: usize = 34; - - const fn new( - needle: &'static str, - haystack: &'static str, - fwd: Option, - rev: Option, - ) -> Seed { - Seed { needle, haystack, fwd, rev } - } - - fn generate(self) -> impl Iterator { - assert!(!self.needle.contains('#'), "needle must not contain '#'"); - assert!(!self.haystack.contains('#'), "haystack must not contain '#'"); - (0..=Seed::MAX_PAD) - // Generate tests for padding at the beginning of haystack. - .map(move |pad| { - let needle = self.needle.to_string(); - let prefix = "#".repeat(pad); - let haystack = format!("{}{}", prefix, self.haystack); - let fwd = if needle.is_empty() { - Some(0) - } else { - self.fwd.map(|i| pad + i) - }; - let rev = if needle.is_empty() { - Some(haystack.len()) - } else { - self.rev.map(|i| pad + i) - }; - Test { needle, haystack, fwd, rev } - }) - // Generate tests for padding at the end of haystack. - .chain((1..=Seed::MAX_PAD).map(move |pad| { - let needle = self.needle.to_string(); - let suffix = "#".repeat(pad); - let haystack = format!("{}{}", self.haystack, suffix); - let fwd = if needle.is_empty() { Some(0) } else { self.fwd }; - let rev = if needle.is_empty() { - Some(haystack.len()) - } else { - self.rev - }; - Test { needle, haystack, fwd, rev } - })) - } -} diff -Nru temporalio-1.3.0/vendor/memchr/src/tests/substring/naive.rs temporalio-1.3.0/vendor/memchr/src/tests/substring/naive.rs --- temporalio-1.3.0/vendor/memchr/src/tests/substring/naive.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/tests/substring/naive.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,45 +0,0 @@ -/*! -This module defines "naive" implementations of substring search. - -These are sometimes useful to compare with "real" substring implementations. -The idea is that they are so simple that they are unlikely to be incorrect. -*/ - -/// Naively search forwards for the given needle in the given haystack. -pub(crate) fn find(haystack: &[u8], needle: &[u8]) -> Option { - let end = haystack.len().checked_sub(needle.len()).map_or(0, |i| i + 1); - for i in 0..end { - if needle == &haystack[i..i + needle.len()] { - return Some(i); - } - } - None -} - -/// Naively search in reverse for the given needle in the given haystack. -pub(crate) fn rfind(haystack: &[u8], needle: &[u8]) -> Option { - let end = haystack.len().checked_sub(needle.len()).map_or(0, |i| i + 1); - for i in (0..end).rev() { - if needle == &haystack[i..i + needle.len()] { - return Some(i); - } - } - None -} - -#[cfg(test)] -mod tests { - use crate::tests::substring; - - use super::*; - - #[test] - fn forward() { - substring::Runner::new().fwd(|h, n| Some(find(h, n))).run() - } - - #[test] - fn reverse() { - substring::Runner::new().rev(|h, n| Some(rfind(h, n))).run() - } -} diff -Nru temporalio-1.3.0/vendor/memchr/src/tests/substring/prop.rs temporalio-1.3.0/vendor/memchr/src/tests/substring/prop.rs --- temporalio-1.3.0/vendor/memchr/src/tests/substring/prop.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/tests/substring/prop.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,126 +0,0 @@ -/*! -This module defines a few quickcheck properties for substring search. - -It also provides a forward and reverse macro for conveniently defining -quickcheck tests that run these properties over any substring search -implementation. -*/ - -use crate::tests::substring::naive; - -/// $fwd is a `impl FnMut(haystack, needle) -> Option>`. When the -/// routine returns `None`, then it's skipped, which is useful for substring -/// implementations that don't work for all inputs. -#[macro_export] -macro_rules! define_substring_forward_quickcheck { - ($fwd:expr) => { - #[cfg(not(miri))] - quickcheck::quickcheck! { - fn qc_fwd_prefix_is_substring(bs: alloc::vec::Vec) -> bool { - crate::tests::substring::prop::prefix_is_substring(&bs, $fwd) - } - - fn qc_fwd_suffix_is_substring(bs: alloc::vec::Vec) -> bool { - crate::tests::substring::prop::suffix_is_substring(&bs, $fwd) - } - - fn qc_fwd_matches_naive( - haystack: alloc::vec::Vec, - needle: alloc::vec::Vec - ) -> bool { - crate::tests::substring::prop::same_as_naive( - false, - &haystack, - &needle, - $fwd, - ) - } - } - }; -} - -/// $rev is a `impl FnMut(haystack, needle) -> Option>`. When the -/// routine returns `None`, then it's skipped, which is useful for substring -/// implementations that don't work for all inputs. -#[macro_export] -macro_rules! define_substring_reverse_quickcheck { - ($rev:expr) => { - #[cfg(not(miri))] - quickcheck::quickcheck! { - fn qc_rev_prefix_is_substring(bs: alloc::vec::Vec) -> bool { - crate::tests::substring::prop::prefix_is_substring(&bs, $rev) - } - - fn qc_rev_suffix_is_substring(bs: alloc::vec::Vec) -> bool { - crate::tests::substring::prop::suffix_is_substring(&bs, $rev) - } - - fn qc_rev_matches_naive( - haystack: alloc::vec::Vec, - needle: alloc::vec::Vec - ) -> bool { - crate::tests::substring::prop::same_as_naive( - true, - &haystack, - &needle, - $rev, - ) - } - } - }; -} - -/// Check that every prefix of the given byte string is a substring. -pub(crate) fn prefix_is_substring( - bs: &[u8], - mut search: impl FnMut(&[u8], &[u8]) -> Option>, -) -> bool { - for i in 0..bs.len().saturating_sub(1) { - let prefix = &bs[..i]; - let result = match search(bs, prefix) { - None => continue, - Some(result) => result, - }; - if !result.is_some() { - return false; - } - } - true -} - -/// Check that every suffix of the given byte string is a substring. -pub(crate) fn suffix_is_substring( - bs: &[u8], - mut search: impl FnMut(&[u8], &[u8]) -> Option>, -) -> bool { - for i in 0..bs.len().saturating_sub(1) { - let suffix = &bs[i..]; - let result = match search(bs, suffix) { - None => continue, - Some(result) => result, - }; - if !result.is_some() { - return false; - } - } - true -} - -/// Check that naive substring search matches the result of the given search -/// algorithm. -pub(crate) fn same_as_naive( - reverse: bool, - haystack: &[u8], - needle: &[u8], - mut search: impl FnMut(&[u8], &[u8]) -> Option>, -) -> bool { - let result = match search(haystack, needle) { - None => return true, - Some(result) => result, - }; - if reverse { - result == naive::rfind(haystack, needle) - } else { - result == naive::find(haystack, needle) - } -} diff -Nru temporalio-1.3.0/vendor/memchr/src/vector.rs temporalio-1.3.0/vendor/memchr/src/vector.rs --- temporalio-1.3.0/vendor/memchr/src/vector.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/memchr/src/vector.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,515 +0,0 @@ -/// A trait for describing vector operations used by vectorized searchers. -/// -/// The trait is highly constrained to low level vector operations needed. -/// In general, it was invented mostly to be generic over x86's __m128i and -/// __m256i types. At time of writing, it also supports wasm and aarch64 -/// 128-bit vector types as well. -/// -/// # Safety -/// -/// All methods are not safe since they are intended to be implemented using -/// vendor intrinsics, which are also not safe. Callers must ensure that the -/// appropriate target features are enabled in the calling function, and that -/// the current CPU supports them. All implementations should avoid marking the -/// routines with #[target_feature] and instead mark them as #[inline(always)] -/// to ensure they get appropriately inlined. (inline(always) cannot be used -/// with target_feature.) -pub(crate) trait Vector: Copy + core::fmt::Debug { - /// The number of bits in the vector. - const BITS: usize; - /// The number of bytes in the vector. That is, this is the size of the - /// vector in memory. - const BYTES: usize; - /// The bits that must be zero in order for a `*const u8` pointer to be - /// correctly aligned to read vector values. - const ALIGN: usize; - - /// The type of the value returned by `Vector::movemask`. - /// - /// This supports abstracting over the specific representation used in - /// order to accommodate different representations in different ISAs. - type Mask: MoveMask; - - /// Create a vector with 8-bit lanes with the given byte repeated into each - /// lane. - unsafe fn splat(byte: u8) -> Self; - - /// Read a vector-size number of bytes from the given pointer. The pointer - /// must be aligned to the size of the vector. - /// - /// # Safety - /// - /// Callers must guarantee that at least `BYTES` bytes are readable from - /// `data` and that `data` is aligned to a `BYTES` boundary. - unsafe fn load_aligned(data: *const u8) -> Self; - - /// Read a vector-size number of bytes from the given pointer. The pointer - /// does not need to be aligned. - /// - /// # Safety - /// - /// Callers must guarantee that at least `BYTES` bytes are readable from - /// `data`. - unsafe fn load_unaligned(data: *const u8) -> Self; - - /// _mm_movemask_epi8 or _mm256_movemask_epi8 - unsafe fn movemask(self) -> Self::Mask; - /// _mm_cmpeq_epi8 or _mm256_cmpeq_epi8 - unsafe fn cmpeq(self, vector2: Self) -> Self; - /// _mm_and_si128 or _mm256_and_si256 - unsafe fn and(self, vector2: Self) -> Self; - /// _mm_or or _mm256_or_si256 - unsafe fn or(self, vector2: Self) -> Self; - /// Returns true if and only if `Self::movemask` would return a mask that - /// contains at least one non-zero bit. - unsafe fn movemask_will_have_non_zero(self) -> bool { - self.movemask().has_non_zero() - } -} - -/// A trait that abstracts over a vector-to-scalar operation called -/// "move mask." -/// -/// On x86-64, this is `_mm_movemask_epi8` for SSE2 and `_mm256_movemask_epi8` -/// for AVX2. It takes a vector of `u8` lanes and returns a scalar where the -/// `i`th bit is set if and only if the most significant bit in the `i`th lane -/// of the vector is set. The simd128 ISA for wasm32 also supports this -/// exact same operation natively. -/// -/// ... But aarch64 doesn't. So we have to fake it with more instructions and -/// a slightly different representation. We could do extra work to unify the -/// representations, but then would require additional costs in the hot path -/// for `memchr` and `packedpair`. So instead, we abstraction over the specific -/// representation with this trait an ddefine the operations we actually need. -pub(crate) trait MoveMask: Copy + core::fmt::Debug { - /// Return a mask that is all zeros except for the least significant `n` - /// lanes in a corresponding vector. - fn all_zeros_except_least_significant(n: usize) -> Self; - - /// Returns true if and only if this mask has a a non-zero bit anywhere. - fn has_non_zero(self) -> bool; - - /// Returns the number of bits set to 1 in this mask. - fn count_ones(self) -> usize; - - /// Does a bitwise `and` operation between `self` and `other`. - fn and(self, other: Self) -> Self; - - /// Does a bitwise `or` operation between `self` and `other`. - fn or(self, other: Self) -> Self; - - /// Returns a mask that is equivalent to `self` but with the least - /// significant 1-bit set to 0. - fn clear_least_significant_bit(self) -> Self; - - /// Returns the offset of the first non-zero lane this mask represents. - fn first_offset(self) -> usize; - - /// Returns the offset of the last non-zero lane this mask represents. - fn last_offset(self) -> usize; -} - -/// This is a "sensible" movemask implementation where each bit represents -/// whether the most significant bit is set in each corresponding lane of a -/// vector. This is used on x86-64 and wasm, but such a mask is more expensive -/// to get on aarch64 so we use something a little different. -/// -/// We call this "sensible" because this is what we get using native sse/avx -/// movemask instructions. But neon has no such native equivalent. -#[derive(Clone, Copy, Debug)] -pub(crate) struct SensibleMoveMask(u32); - -impl SensibleMoveMask { - /// Get the mask in a form suitable for computing offsets. - /// - /// Basically, this normalizes to little endian. On big endian, this swaps - /// the bytes. - #[inline(always)] - fn get_for_offset(self) -> u32 { - #[cfg(target_endian = "big")] - { - self.0.swap_bytes() - } - #[cfg(target_endian = "little")] - { - self.0 - } - } -} - -impl MoveMask for SensibleMoveMask { - #[inline(always)] - fn all_zeros_except_least_significant(n: usize) -> SensibleMoveMask { - debug_assert!(n < 32); - SensibleMoveMask(!((1 << n) - 1)) - } - - #[inline(always)] - fn has_non_zero(self) -> bool { - self.0 != 0 - } - - #[inline(always)] - fn count_ones(self) -> usize { - self.0.count_ones() as usize - } - - #[inline(always)] - fn and(self, other: SensibleMoveMask) -> SensibleMoveMask { - SensibleMoveMask(self.0 & other.0) - } - - #[inline(always)] - fn or(self, other: SensibleMoveMask) -> SensibleMoveMask { - SensibleMoveMask(self.0 | other.0) - } - - #[inline(always)] - fn clear_least_significant_bit(self) -> SensibleMoveMask { - SensibleMoveMask(self.0 & (self.0 - 1)) - } - - #[inline(always)] - fn first_offset(self) -> usize { - // We are dealing with little endian here (and if we aren't, we swap - // the bytes so we are in practice), where the most significant byte - // is at a higher address. That means the least significant bit that - // is set corresponds to the position of our first matching byte. - // That position corresponds to the number of zeros after the least - // significant bit. - self.get_for_offset().trailing_zeros() as usize - } - - #[inline(always)] - fn last_offset(self) -> usize { - // We are dealing with little endian here (and if we aren't, we swap - // the bytes so we are in practice), where the most significant byte is - // at a higher address. That means the most significant bit that is set - // corresponds to the position of our last matching byte. The position - // from the end of the mask is therefore the number of leading zeros - // in a 32 bit integer, and the position from the start of the mask is - // therefore 32 - (leading zeros) - 1. - 32 - self.get_for_offset().leading_zeros() as usize - 1 - } -} - -#[cfg(target_arch = "x86_64")] -mod x86sse2 { - use core::arch::x86_64::*; - - use super::{SensibleMoveMask, Vector}; - - impl Vector for __m128i { - const BITS: usize = 128; - const BYTES: usize = 16; - const ALIGN: usize = Self::BYTES - 1; - - type Mask = SensibleMoveMask; - - #[inline(always)] - unsafe fn splat(byte: u8) -> __m128i { - _mm_set1_epi8(byte as i8) - } - - #[inline(always)] - unsafe fn load_aligned(data: *const u8) -> __m128i { - _mm_load_si128(data as *const __m128i) - } - - #[inline(always)] - unsafe fn load_unaligned(data: *const u8) -> __m128i { - _mm_loadu_si128(data as *const __m128i) - } - - #[inline(always)] - unsafe fn movemask(self) -> SensibleMoveMask { - SensibleMoveMask(_mm_movemask_epi8(self) as u32) - } - - #[inline(always)] - unsafe fn cmpeq(self, vector2: Self) -> __m128i { - _mm_cmpeq_epi8(self, vector2) - } - - #[inline(always)] - unsafe fn and(self, vector2: Self) -> __m128i { - _mm_and_si128(self, vector2) - } - - #[inline(always)] - unsafe fn or(self, vector2: Self) -> __m128i { - _mm_or_si128(self, vector2) - } - } -} - -#[cfg(target_arch = "x86_64")] -mod x86avx2 { - use core::arch::x86_64::*; - - use super::{SensibleMoveMask, Vector}; - - impl Vector for __m256i { - const BITS: usize = 256; - const BYTES: usize = 32; - const ALIGN: usize = Self::BYTES - 1; - - type Mask = SensibleMoveMask; - - #[inline(always)] - unsafe fn splat(byte: u8) -> __m256i { - _mm256_set1_epi8(byte as i8) - } - - #[inline(always)] - unsafe fn load_aligned(data: *const u8) -> __m256i { - _mm256_load_si256(data as *const __m256i) - } - - #[inline(always)] - unsafe fn load_unaligned(data: *const u8) -> __m256i { - _mm256_loadu_si256(data as *const __m256i) - } - - #[inline(always)] - unsafe fn movemask(self) -> SensibleMoveMask { - SensibleMoveMask(_mm256_movemask_epi8(self) as u32) - } - - #[inline(always)] - unsafe fn cmpeq(self, vector2: Self) -> __m256i { - _mm256_cmpeq_epi8(self, vector2) - } - - #[inline(always)] - unsafe fn and(self, vector2: Self) -> __m256i { - _mm256_and_si256(self, vector2) - } - - #[inline(always)] - unsafe fn or(self, vector2: Self) -> __m256i { - _mm256_or_si256(self, vector2) - } - } -} - -#[cfg(target_arch = "aarch64")] -mod aarch64neon { - use core::arch::aarch64::*; - - use super::{MoveMask, Vector}; - - impl Vector for uint8x16_t { - const BITS: usize = 128; - const BYTES: usize = 16; - const ALIGN: usize = Self::BYTES - 1; - - type Mask = NeonMoveMask; - - #[inline(always)] - unsafe fn splat(byte: u8) -> uint8x16_t { - vdupq_n_u8(byte) - } - - #[inline(always)] - unsafe fn load_aligned(data: *const u8) -> uint8x16_t { - // I've tried `data.cast::().read()` instead, but - // couldn't observe any benchmark differences. - Self::load_unaligned(data) - } - - #[inline(always)] - unsafe fn load_unaligned(data: *const u8) -> uint8x16_t { - vld1q_u8(data) - } - - #[inline(always)] - unsafe fn movemask(self) -> NeonMoveMask { - let asu16s = vreinterpretq_u16_u8(self); - let mask = vshrn_n_u16(asu16s, 4); - let asu64 = vreinterpret_u64_u8(mask); - let scalar64 = vget_lane_u64(asu64, 0); - NeonMoveMask(scalar64 & 0x8888888888888888) - } - - #[inline(always)] - unsafe fn cmpeq(self, vector2: Self) -> uint8x16_t { - vceqq_u8(self, vector2) - } - - #[inline(always)] - unsafe fn and(self, vector2: Self) -> uint8x16_t { - vandq_u8(self, vector2) - } - - #[inline(always)] - unsafe fn or(self, vector2: Self) -> uint8x16_t { - vorrq_u8(self, vector2) - } - - /// This is the only interesting implementation of this routine. - /// Basically, instead of doing the "shift right narrow" dance, we use - /// adajacent folding max to determine whether there are any non-zero - /// bytes in our mask. If there are, *then* we'll do the "shift right - /// narrow" dance. In benchmarks, this does lead to slightly better - /// throughput, but the win doesn't appear huge. - #[inline(always)] - unsafe fn movemask_will_have_non_zero(self) -> bool { - let low = vreinterpretq_u64_u8(vpmaxq_u8(self, self)); - vgetq_lane_u64(low, 0) != 0 - } - } - - /// Neon doesn't have a `movemask` that works like the one in x86-64, so we - /// wind up using a different method[1]. The different method also produces - /// a mask, but 4 bits are set in the neon case instead of a single bit set - /// in the x86-64 case. We do an extra step to zero out 3 of the 4 bits, - /// but we still wind up with at least 3 zeroes between each set bit. This - /// generally means that we need to do some division by 4 before extracting - /// offsets. - /// - /// In fact, the existence of this type is the entire reason that we have - /// the `MoveMask` trait in the first place. This basically lets us keep - /// the different representations of masks without being forced to unify - /// them into a single representation, which could result in extra and - /// unnecessary work. - /// - /// [1]: https://community.arm.com/arm-community-blogs/b/infrastructure-solutions-blog/posts/porting-x86-vector-bitmask-optimizations-to-arm-neon - #[derive(Clone, Copy, Debug)] - pub(crate) struct NeonMoveMask(u64); - - impl NeonMoveMask { - /// Get the mask in a form suitable for computing offsets. - /// - /// Basically, this normalizes to little endian. On big endian, this - /// swaps the bytes. - #[inline(always)] - fn get_for_offset(self) -> u64 { - #[cfg(target_endian = "big")] - { - self.0.swap_bytes() - } - #[cfg(target_endian = "little")] - { - self.0 - } - } - } - - impl MoveMask for NeonMoveMask { - #[inline(always)] - fn all_zeros_except_least_significant(n: usize) -> NeonMoveMask { - debug_assert!(n < 16); - NeonMoveMask(!(((1 << n) << 2) - 1)) - } - - #[inline(always)] - fn has_non_zero(self) -> bool { - self.0 != 0 - } - - #[inline(always)] - fn count_ones(self) -> usize { - self.0.count_ones() as usize - } - - #[inline(always)] - fn and(self, other: NeonMoveMask) -> NeonMoveMask { - NeonMoveMask(self.0 & other.0) - } - - #[inline(always)] - fn or(self, other: NeonMoveMask) -> NeonMoveMask { - NeonMoveMask(self.0 | other.0) - } - - #[inline(always)] - fn clear_least_significant_bit(self) -> NeonMoveMask { - NeonMoveMask(self.0 & (self.0 - 1)) - } - - #[inline(always)] - fn first_offset(self) -> usize { - // We are dealing with little endian here (and if we aren't, - // we swap the bytes so we are in practice), where the most - // significant byte is at a higher address. That means the least - // significant bit that is set corresponds to the position of our - // first matching byte. That position corresponds to the number of - // zeros after the least significant bit. - // - // Note that unlike `SensibleMoveMask`, this mask has its bits - // spread out over 64 bits instead of 16 bits (for a 128 bit - // vector). Namely, where as x86-64 will turn - // - // 0x00 0xFF 0x00 0x00 0xFF - // - // into 10010, our neon approach will turn it into - // - // 10000000000010000000 - // - // And this happens because neon doesn't have a native `movemask` - // instruction, so we kind of fake it[1]. Thus, we divide the - // number of trailing zeros by 4 to get the "real" offset. - // - // [1]: https://community.arm.com/arm-community-blogs/b/infrastructure-solutions-blog/posts/porting-x86-vector-bitmask-optimizations-to-arm-neon - (self.get_for_offset().trailing_zeros() >> 2) as usize - } - - #[inline(always)] - fn last_offset(self) -> usize { - // See comment in `first_offset` above. This is basically the same, - // but coming from the other direction. - 16 - (self.get_for_offset().leading_zeros() >> 2) as usize - 1 - } - } -} - -#[cfg(target_arch = "wasm32")] -mod wasm_simd128 { - use core::arch::wasm32::*; - - use super::{SensibleMoveMask, Vector}; - - impl Vector for v128 { - const BITS: usize = 128; - const BYTES: usize = 16; - const ALIGN: usize = Self::BYTES - 1; - - type Mask = SensibleMoveMask; - - #[inline(always)] - unsafe fn splat(byte: u8) -> v128 { - u8x16_splat(byte) - } - - #[inline(always)] - unsafe fn load_aligned(data: *const u8) -> v128 { - *data.cast() - } - - #[inline(always)] - unsafe fn load_unaligned(data: *const u8) -> v128 { - v128_load(data.cast()) - } - - #[inline(always)] - unsafe fn movemask(self) -> SensibleMoveMask { - SensibleMoveMask(u8x16_bitmask(self).into()) - } - - #[inline(always)] - unsafe fn cmpeq(self, vector2: Self) -> v128 { - u8x16_eq(self, vector2) - } - - #[inline(always)] - unsafe fn and(self, vector2: Self) -> v128 { - v128_and(self, vector2) - } - - #[inline(always)] - unsafe fn or(self, vector2: Self) -> v128 { - v128_or(self, vector2) - } - } -} diff -Nru temporalio-1.3.0/vendor/mio/.cargo-checksum.json temporalio-1.3.0/vendor/mio/.cargo-checksum.json --- temporalio-1.3.0/vendor/mio/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mio/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"CHANGELOG.md":"c9196a8655c6ea7c39f37bc43679a855f0a108e67fca8f6601fe7f40c699b19a","Cargo.lock":"e56bfd38558c24cc5f0b99e361d6a93d877d2ef765c597eb3d4a89c1d701b08f","Cargo.toml":"a28a3cecc8b10740192fed0edf90157b94a790957d2358516db79ffeb08c943b","LICENSE":"07919255c7e04793d8ea760d6c2ce32d19f9ff02bdbdde3ce90b1e1880929a9b","README.md":"e33863e6f79ed1f7e85b10b7108030b698460f280c8598b1fcb981e515e46edc","examples/tcp_listenfd_server.rs":"f05bbee8eb91a2e42fec29cbacbdd6dc5f9c95097b3ee12dfe944143e45f5996","examples/tcp_server.rs":"7309036fe2cd17530bcbc53b2b0ec12478caad39bcae5bda72cdd0263c647f4f","examples/udp_server.rs":"8e0795247be36b78a8cec02bd16af78083ac963d7d7fda3f422c673b17b62493","src/event/event.rs":"00ff34dd2e391784d5f7c4613029fb9aa8cc31a019306936960c27092486e5a9","src/event/events.rs":"5cad85e0d0c9e619b6017f868c681ed0dc023e7aae8c0c5c0c7337b2fa96a8a6","src/event/mod.rs":"c129c42114867e3e7337a6605952db8cef8a7ef0938f67a28fa68e73fc420c6a","src/event/source.rs":"d2d1aaff10fb31e7d2dfe8a4500d100a9b2d0a2ab1663503c0f275b35b0072b6","src/interest.rs":"983bb64b4e4443fbbf20461e7b198b128ca13cd1e853c1e9258ce401a8d046ea","src/io_source.rs":"166d4555f96cca194542361f7114a7e6456ce45b23097cb6afd26b7165e6ca1f","src/lib.rs":"230807008c9956195cd74d63a00879aa2ac67cede03723d336bb177c130f237f","src/macros.rs":"954a9c57fcdabc8625664880a41fedf2457ff87d5d5d6fee5e3c8c6112ac765b","src/net/mod.rs":"22b7f18555a06c1d5b074b67ed28ace5c59b1a3842232a9cd50f612cf0214cdc","src/net/tcp/listener.rs":"94e0277c84fc09041ef3f4c757ed0a935afa03edbdeadcb19a6a89938392a691","src/net/tcp/mod.rs":"f2c50c1d338a69d704e18727142d8495be2927b390d7bbb77cc0cf4e945ed83a","src/net/tcp/stream.rs":"aae550afe7dc458ad2b8860b7fc29c1feda345fe63a1e66e4de17610bead970e","src/net/udp.rs":"0d6245c99b1d4bedf6967ec138d0f4f9073a29e0d4404e3f96ff6830edb8250e","src/net/uds/datagram.rs":"a8d781620846997e5a89800d80e09a7b962c3f9ab14622a054b0b0d1b1b5c84e","src/net/uds/listener.rs":"0971d863f286333a6e7bcf5b031205a2f3a3160222160757a79a1e3d642e62c7","src/net/uds/mod.rs":"70d4368adae74652d46771b29e633396e5f1b70e9b7d1370cf5fec9a78605c04","src/net/uds/stream.rs":"93805ef2abc2ced64a3a0a095f60cd41db0349c49265a00b24b68444f32bba63","src/poll.rs":"e1e8a8cf0152fc231275ca9f211d0e3594daf93952a03a4e722d364a47c658c9","src/sys/mod.rs":"ad8eaa44a560caa8d01788b4e798705ef26ccdfc29b5de9eae2f23172a064aba","src/sys/shell/mod.rs":"140595b0c19c0c63640eb5e2913fd16e3f1f88c06f15867b526e7cb75a5c35f3","src/sys/shell/selector.rs":"32aaf1145def1659983e2f6041c41aab33fd25c88b8d55f707502ab164019dd1","src/sys/shell/tcp.rs":"81a5219507eea81895f4f984ceb157a9c0d3c046d50190b1c562f52d77f2b607","src/sys/shell/udp.rs":"0db637a4ce1ec3a5ccb410d1e94bcc525df8ad005c1d4235d7d50111d335dbde","src/sys/shell/uds.rs":"af4ff92fe38e1b58d5aa4ea49bfcc6b0a1f842f08f2335d54ef0c279b76de99e","src/sys/shell/waker.rs":"81bc18cf52345a8d17e8142291e43dd70a36dfd9f5eb486f3e787998ee4451dc","src/sys/unix/mod.rs":"682ce812cfc799782895d737b9ed9d67c3a885c25297eb64ba59c95e119c4f0d","src/sys/unix/net.rs":"e646a3c81097d952f8ee40c900bca3b075a71579ffbfb07328e7dd21dc5954f9","src/sys/unix/pipe.rs":"5e71959c5d5ab6316c41ee74185481117b2a3fb7b966f9818fdd624e2adb4f3f","src/sys/unix/selector/epoll.rs":"1c79b7a4dbc2e0bdd89562289cb6e5f84f5a5850e5438362290f9aee71cb6fff","src/sys/unix/selector/kqueue.rs":"e5cd64e9838b6af1a59a13d61bac384f4b823d1955817fc76dd75525c4abe34a","src/sys/unix/selector/mod.rs":"6336a77618a9037f02ad358281eccf64478550c247e390fc086fcb209be9b0d8","src/sys/unix/selector/poll.rs":"3a4d7749c919f795c0524cf20733710ad4478470880c87c0e2e68dbe2142cebd","src/sys/unix/sourcefd.rs":"18292d551d78a4ae6900ee31c969909a784d42b49184b7e0581c08f170dabf04","src/sys/unix/tcp.rs":"b4bf8e5c4dc246d61153bda94297df8941f2e7f4c3a81ecfbc4e4043a6290ad2","src/sys/unix/udp.rs":"ff8f15655e2cbb2ebec5153bda9bad021a418c2a42976af899392f63f5af9633","src/sys/unix/uds/datagram.rs":"01634c6b9e57ebaa96463850408410970259dc0a6d948494d16372a5f9f3ef6f","src/sys/unix/uds/listener.rs":"4d6f2d0d8a3e22415990056b0f229c19c9f07486a8fad243f5c73446739f037b","src/sys/unix/uds/mod.rs":"7d743fb1952cbb5cefd5b30b5c3918f8f5c27bed9203f05fa5ffa514f3d994eb","src/sys/unix/uds/socketaddr.rs":"394f81f4ac7c30716ad84d1f17e06a44a8d090e8e6535e4354c7d474e23e32fe","src/sys/unix/uds/stream.rs":"a762f933789c8f6e8d690adc1a71f1996aebb0ce17ee8781de27cf681edccec1","src/sys/unix/waker.rs":"29c4e6f3283b2be43dce9fc66c3a91006ae6aa30bac8605cd7ed76c8fb5ebcf3","src/sys/wasi/mod.rs":"dd4945e34b2169c4d3737fe7566269e2f7d1867664657b9b49bd097c88759699","src/sys/windows/afd.rs":"97caca7e7a15de2b16ad23d714f5b508b354bcaca01f26a769bb98fab4968b18","src/sys/windows/event.rs":"0b3f9c4ba4f10e8ede7c7c7163b8b4207c0d8155285dca7b4737cd055ec2c459","src/sys/windows/handle.rs":"f75276733a6f930f755a1bc5651cba8be52320a45709eec0b4ce5efe8779c5b6","src/sys/windows/io_status_block.rs":"74f51e68fc3b5bcf03a5d6d1c23ab3a0ac31a05c7314f329fdfa10d3d552828a","src/sys/windows/iocp.rs":"f82ee941190849e345174d6a20771984685411cc48716e3c79dede5ba925f33d","src/sys/windows/mod.rs":"2359bea017df508a5c47d5d8896d7b70b077e08647ce4f526e1d666072210621","src/sys/windows/named_pipe.rs":"10b3c46a9939093df780b01a683573155ec50920a802e69ae6ef2f4c9730d33e","src/sys/windows/net.rs":"67093e8c2c672bc7e7c809c83f400061abac0b9e01a748811e3b91e410df008b","src/sys/windows/overlapped.rs":"94fa619a7655228485c714ef5b5ed4b703a360e51130cdfc07d20c1aa38cb3c5","src/sys/windows/selector.rs":"f405fa81757e9505982d9b96fea3b2390d1bcbae4fb6833939abc04efc2d9d5a","src/sys/windows/tcp.rs":"1911960fd32657d31a53ed3ba4a374d1592bae2b2c7fca80213cdfbfa773a831","src/sys/windows/udp.rs":"45cbba2941287d89e089f168e29f65cea03b8b11aa8f5b7fee173d53a5c0e6b0","src/sys/windows/waker.rs":"cf27f75061b86dabe362d936c5945fd0e644aea833993de45d40b4be5fbbe56c","src/token.rs":"4e64c8e337fbee4e3a2f5e8661241b5261c9c5487e20fa73425d89e2e152e8de","src/waker.rs":"cd521418aede70369775607232d1162ff70f3993f4951ed113cc18fcd7af6539"},"package":"3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0"} \ No newline at end of file +{"files":{"CHANGELOG.md":"8314f990c14695d982bfd16740a1fd7330628e98563003abc3baf14e0bb1646c","Cargo.lock":"8c2b555331acea8d3ca27951b22f795a4b258aaab9c395da64c3afb26c20ded3","Cargo.toml":"92ce49e24176221a0bcbe2e9a5c9afe5219cece85ad001a67b2be16557e12a4d","LICENSE":"07919255c7e04793d8ea760d6c2ce32d19f9ff02bdbdde3ce90b1e1880929a9b","README.md":"1e5b9f5dcb0bdcea387fa03dff6183faa3694fc4be2e83704c4c92744b416ae9","examples/tcp_listenfd_server.rs":"f05bbee8eb91a2e42fec29cbacbdd6dc5f9c95097b3ee12dfe944143e45f5996","examples/tcp_server.rs":"fb256c761cc564de6f2e2550205aec41b9a9d59bc4185f2fd42f9b4b3bc8f17c","examples/udp_server.rs":"e2654b88f5f0d6eba9af32f62e99111078dc8bb1ad2ab8e65a2ce89670318daa","src/event/event.rs":"00ff34dd2e391784d5f7c4613029fb9aa8cc31a019306936960c27092486e5a9","src/event/events.rs":"5cad85e0d0c9e619b6017f868c681ed0dc023e7aae8c0c5c0c7337b2fa96a8a6","src/event/mod.rs":"c129c42114867e3e7337a6605952db8cef8a7ef0938f67a28fa68e73fc420c6a","src/event/source.rs":"d2d1aaff10fb31e7d2dfe8a4500d100a9b2d0a2ab1663503c0f275b35b0072b6","src/interest.rs":"c399965f8bb1c5a801573b5c69ad9df7ffb9ea66dd140edd1aea0fcd4a6c3852","src/io_source.rs":"371be50244362b8769f95b6f152f8f4905f04c95decc5f51c285a2ffdc2deec4","src/lib.rs":"230807008c9956195cd74d63a00879aa2ac67cede03723d336bb177c130f237f","src/macros.rs":"954a9c57fcdabc8625664880a41fedf2457ff87d5d5d6fee5e3c8c6112ac765b","src/net/mod.rs":"22b7f18555a06c1d5b074b67ed28ace5c59b1a3842232a9cd50f612cf0214cdc","src/net/tcp/listener.rs":"94e0277c84fc09041ef3f4c757ed0a935afa03edbdeadcb19a6a89938392a691","src/net/tcp/mod.rs":"f2c50c1d338a69d704e18727142d8495be2927b390d7bbb77cc0cf4e945ed83a","src/net/tcp/stream.rs":"aae550afe7dc458ad2b8860b7fc29c1feda345fe63a1e66e4de17610bead970e","src/net/udp.rs":"0d6245c99b1d4bedf6967ec138d0f4f9073a29e0d4404e3f96ff6830edb8250e","src/net/uds/datagram.rs":"a8d781620846997e5a89800d80e09a7b962c3f9ab14622a054b0b0d1b1b5c84e","src/net/uds/listener.rs":"714b1638a522cc95bb70b137441bc1282684fbcde4432b6872ad052f66670164","src/net/uds/mod.rs":"70d4368adae74652d46771b29e633396e5f1b70e9b7d1370cf5fec9a78605c04","src/net/uds/stream.rs":"ef37baaee8fc3158710aa15ec7f647030afcf86424ccc0dd84971270a3ad33c0","src/poll.rs":"0f7354c46099436d320f3a06adb9f58406668f3189ab08f6f3a7344db069a0d9","src/sys/mod.rs":"ad8eaa44a560caa8d01788b4e798705ef26ccdfc29b5de9eae2f23172a064aba","src/sys/shell/mod.rs":"7dfd5e62ba14639cff17f37f7d41366f765f461c9ad11230862b7ea18249d18b","src/sys/shell/selector.rs":"84b9f666e7aea8dc535c7f8d5d97bb016e3f558096f9fc6da3e496f30e7dc30d","src/sys/shell/tcp.rs":"81a5219507eea81895f4f984ceb157a9c0d3c046d50190b1c562f52d77f2b607","src/sys/shell/udp.rs":"0db637a4ce1ec3a5ccb410d1e94bcc525df8ad005c1d4235d7d50111d335dbde","src/sys/shell/uds.rs":"10c2933423e251fca678322ff9fc7501fcaacdfa769307399cb5dfc7bef63ec3","src/sys/shell/waker.rs":"81bc18cf52345a8d17e8142291e43dd70a36dfd9f5eb486f3e787998ee4451dc","src/sys/unix/mod.rs":"d2b03e3d166d174f1ad283e6a2aa1c3287b4d6e0affb3ed7ea7e033fbbfc5f1d","src/sys/unix/net.rs":"ce7e5e45a8e969eddaec77c23b5c6813b3675effa9018fddd16b46e73c2753f8","src/sys/unix/pipe.rs":"c849fddec5afd6ffec682fe27346c55d14945e7980fb41a132a1846bd9cb4eef","src/sys/unix/selector/epoll.rs":"6f4cf6e5bb540f4d549fd07c8110a73f3e82cfe1c699b4f8afae7a5274131585","src/sys/unix/selector/kqueue.rs":"9a79c425f239160d818bc746c72b0310e7a36af565a9e02eb2caf37670d6249b","src/sys/unix/selector/mod.rs":"81cf2b9d8dcb113e5a89f6248a662730876bb843c73ddf437e326a274b900d1b","src/sys/unix/sourcefd.rs":"18292d551d78a4ae6900ee31c969909a784d42b49184b7e0581c08f170dabf04","src/sys/unix/tcp.rs":"b2b1f6485403910be3124a0005190c7f2e25acfbd238e66dca1a8adcb8a46f47","src/sys/unix/udp.rs":"ff8f15655e2cbb2ebec5153bda9bad021a418c2a42976af899392f63f5af9633","src/sys/unix/uds/datagram.rs":"edbe7429112f802d73d9002f46efcbace28042a9fbbab3d8e34c6d1fdc6ea2b2","src/sys/unix/uds/listener.rs":"9c87a104ae0140bef910043cca5053814dadaf1dfaa5411eb036738c074ecbef","src/sys/unix/uds/mod.rs":"36bf5855c030cd777f3ee144a7e0e4a10f9f9f3e263599dabfa7a142001a8bea","src/sys/unix/uds/socketaddr.rs":"c6784b61c6705c222e41db8abddc9458c05c70de3bc53e9a7b4aec0ea371058e","src/sys/unix/uds/stream.rs":"1de3da2c1efeda107617548281bcd50e8e29fdd3da9540f8e245323048ca68f5","src/sys/unix/waker.rs":"5563aeeb5e3c9bd9452b01e1fdca9a002c6d52fecda92dc4d13e6e7671ca782e","src/sys/wasi/mod.rs":"dd4945e34b2169c4d3737fe7566269e2f7d1867664657b9b49bd097c88759699","src/sys/windows/afd.rs":"97caca7e7a15de2b16ad23d714f5b508b354bcaca01f26a769bb98fab4968b18","src/sys/windows/event.rs":"0b3f9c4ba4f10e8ede7c7c7163b8b4207c0d8155285dca7b4737cd055ec2c459","src/sys/windows/handle.rs":"f75276733a6f930f755a1bc5651cba8be52320a45709eec0b4ce5efe8779c5b6","src/sys/windows/io_status_block.rs":"74f51e68fc3b5bcf03a5d6d1c23ab3a0ac31a05c7314f329fdfa10d3d552828a","src/sys/windows/iocp.rs":"f82ee941190849e345174d6a20771984685411cc48716e3c79dede5ba925f33d","src/sys/windows/mod.rs":"2359bea017df508a5c47d5d8896d7b70b077e08647ce4f526e1d666072210621","src/sys/windows/named_pipe.rs":"10b3c46a9939093df780b01a683573155ec50920a802e69ae6ef2f4c9730d33e","src/sys/windows/net.rs":"67093e8c2c672bc7e7c809c83f400061abac0b9e01a748811e3b91e410df008b","src/sys/windows/overlapped.rs":"94fa619a7655228485c714ef5b5ed4b703a360e51130cdfc07d20c1aa38cb3c5","src/sys/windows/selector.rs":"d12743aba682b064d9913e8d755aae53350c0de436d7025b1af94113a6804e8f","src/sys/windows/tcp.rs":"1911960fd32657d31a53ed3ba4a374d1592bae2b2c7fca80213cdfbfa773a831","src/sys/windows/udp.rs":"45cbba2941287d89e089f168e29f65cea03b8b11aa8f5b7fee173d53a5c0e6b0","src/sys/windows/waker.rs":"cf27f75061b86dabe362d936c5945fd0e644aea833993de45d40b4be5fbbe56c","src/token.rs":"4e64c8e337fbee4e3a2f5e8661241b5261c9c5487e20fa73425d89e2e152e8de","src/waker.rs":"cd521418aede70369775607232d1162ff70f3993f4951ed113cc18fcd7af6539"},"package":"927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/mio/Cargo.lock temporalio-1.3.0/vendor/mio/Cargo.lock --- temporalio-1.3.0/vendor/mio/Cargo.lock 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mio/Cargo.lock 2023-10-30 19:40:00.000000000 +0000 @@ -1,7 +1,5 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 - [[package]] name = "cfg-if" version = "1.0.0" @@ -30,9 +28,9 @@ [[package]] name = "libc" -version = "0.2.149" +version = "0.2.139" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a08173bc88b7955d1b3145aa561539096c421ac8debde8cbc3612ec635fee29b" +checksum = "201de327520df007757c1f0adce6e827fe8562fbc28bfd9c15571c66ca1f5f79" [[package]] name = "log" @@ -45,7 +43,7 @@ [[package]] name = "mio" -version = "0.8.9" +version = "0.8.8" dependencies = [ "env_logger", "libc", diff -Nru temporalio-1.3.0/vendor/mio/Cargo.toml temporalio-1.3.0/vendor/mio/Cargo.toml --- temporalio-1.3.0/vendor/mio/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mio/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -12,7 +12,7 @@ [package] edition = "2018" name = "mio" -version = "0.8.9" +version = "0.8.8" authors = [ "Carl Lerche ", "Thomas de Zeeuw ", @@ -43,7 +43,6 @@ rustdoc-args = [ "--cfg", "docsrs", - "--generate-link-to-definition", ] targets = [ "aarch64-apple-ios", @@ -109,13 +108,13 @@ os-poll = [] [target."cfg(target_os = \"wasi\")".dependencies.libc] -version = "0.2.149" +version = "0.2.121" [target."cfg(target_os = \"wasi\")".dependencies.wasi] version = "0.11.0" [target."cfg(unix)".dependencies.libc] -version = "0.2.149" +version = "0.2.121" [target."cfg(windows)".dependencies.windows-sys] version = "0.48" diff -Nru temporalio-1.3.0/vendor/mio/CHANGELOG.md temporalio-1.3.0/vendor/mio/CHANGELOG.md --- temporalio-1.3.0/vendor/mio/CHANGELOG.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mio/CHANGELOG.md 2023-10-30 19:40:00.000000000 +0000 @@ -1,29 +1,3 @@ -# 0.8.9 - -## Added - -* ESP-IDF framework support - (https://github.com/tokio-rs/mio/pull/1692). -* AIX operating system support - (https://github.com/tokio-rs/mio/pull/1704). -* Vita support - (https://github.com/tokio-rs/mio/pull/1721). -* `{UnixListener,UnixStream}:bind_addr` - (https://github.com/tokio-rs/mio/pull/1630). -* `mio_unsupported_force_poll_poll` and `mio_unsupported_force_waker_pipe` - **unsupported** configuration flags to force a specific poll or waker - implementation - (https://github.com/tokio-rs/mio/pull/1684, - https://github.com/tokio-rs/mio/pull/1685, - https://github.com/tokio-rs/mio/pull/1692). - -## Fixed - -* The `pipe(2)` based waker (swapped file descriptors) - (https://github.com/tokio-rs/mio/pull/1722). -* The duplicate waker check to work correctly with cloned `Registry`s. - (https://github.com/tokio-rs/mio/pull/1706). - # 0.8.8 ## Fixed diff -Nru temporalio-1.3.0/vendor/mio/examples/tcp_server.rs temporalio-1.3.0/vendor/mio/examples/tcp_server.rs --- temporalio-1.3.0/vendor/mio/examples/tcp_server.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mio/examples/tcp_server.rs 2023-10-30 19:40:00.000000000 +0000 @@ -40,12 +40,7 @@ println!("You'll see our welcome message and anything you type will be printed here."); loop { - if let Err(err) = poll.poll(&mut events, None) { - if interrupted(&err) { - continue; - } - return Err(err); - } + poll.poll(&mut events, None)?; for event in events.iter() { match event.token() { diff -Nru temporalio-1.3.0/vendor/mio/examples/udp_server.rs temporalio-1.3.0/vendor/mio/examples/udp_server.rs --- temporalio-1.3.0/vendor/mio/examples/udp_server.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mio/examples/udp_server.rs 2023-10-30 19:40:00.000000000 +0000 @@ -40,12 +40,7 @@ // Our event loop. loop { // Poll to check if we have events waiting for us. - if let Err(err) = poll.poll(&mut events, None) { - if err.kind() == io::ErrorKind::Interrupted { - continue; - } - return Err(err); - } + poll.poll(&mut events, None)?; // Process each event. for event in events.iter() { diff -Nru temporalio-1.3.0/vendor/mio/README.md temporalio-1.3.0/vendor/mio/README.md --- temporalio-1.3.0/vendor/mio/README.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mio/README.md 2023-10-30 19:40:00.000000000 +0000 @@ -138,8 +138,8 @@ * iOS * macOS -There are potentially others. If you find that Mio works on another platform, -submit a PR to update the list! +There are potentially others. If you find that Mio works on another +platform, submit a PR to update the list! Mio can handle interfacing with each of the event systems of the aforementioned platforms. The details of their implementation are further discussed in the @@ -160,35 +160,12 @@ [issue #1152]: https://github.com/tokio-rs/mio/issues/1152 [issue #1444]: https://github.com/tokio-rs/mio/issues/1444 -## Unsupported flags - -Mio uses different implementations to support the same functionality depending -on the platform. Mio generally uses the "best" implementation possible, where -"best" usually means most efficient for Mio's use case. However this means that -the implementation is often specific to a limited number of platforms, meaning -we often have multiple implementations for the same functionality. In some cases -it might be required to not use the "best" implementation, but another -implementation Mio supports (on other platforms). **Mio does not officially -support secondary implementations on platforms**, however we do have various cfg -flags to force another implementation for these situations. - -Current flags: - * `mio_unsupported_force_poll_poll`, uses an implementation based on `poll(2)` - for `mio::Poll`. - * `mio_unsupported_force_waker_pipe`, uses an implementation based on `pipe(2)` - for `mio::Waker`. - -**Again, Mio does not officially supports this**. Furthermore these flags may -disappear in the future. - ## Community A group of Mio users hang out on [Discord], this can be a good place to go for -questions. It's also possible to open a [new issue on GitHub] to ask questions, -report bugs or suggest new features. +questions. [Discord]: https://discord.gg/tokio -[new issue on GitHub]: https://github.com/tokio-rs/mio/issues/new ## Contributing diff -Nru temporalio-1.3.0/vendor/mio/src/interest.rs temporalio-1.3.0/vendor/mio/src/interest.rs --- temporalio-1.3.0/vendor/mio/src/interest.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mio/src/interest.rs 2023-10-30 19:40:00.000000000 +0000 @@ -63,7 +63,6 @@ /// # silent_dead_code_warning(INTERESTS) /// ``` #[allow(clippy::should_implement_trait)] - #[must_use = "this returns the result of the operation, without modifying the original"] pub const fn add(self, other: Interest) -> Interest { Interest(unsafe { NonZeroU8::new_unchecked(self.0.get() | other.0.get()) }) } @@ -88,37 +87,31 @@ /// // Its also possible to remove multiple interests at once. /// assert_eq!(RW_INTERESTS.remove(RW_INTERESTS), None); /// ``` - #[must_use = "this returns the result of the operation, without modifying the original"] pub fn remove(self, other: Interest) -> Option { NonZeroU8::new(self.0.get() & !other.0.get()).map(Interest) } /// Returns true if the value includes readable readiness. - #[must_use] pub const fn is_readable(self) -> bool { (self.0.get() & READABLE) != 0 } /// Returns true if the value includes writable readiness. - #[must_use] pub const fn is_writable(self) -> bool { (self.0.get() & WRITABLE) != 0 } /// Returns true if `Interest` contains AIO readiness. - #[must_use] pub const fn is_aio(self) -> bool { (self.0.get() & AIO) != 0 } /// Returns true if `Interest` contains LIO readiness. - #[must_use] pub const fn is_lio(self) -> bool { (self.0.get() & LIO) != 0 } /// Returns true if `Interest` contains priority readiness. - #[must_use] pub const fn is_priority(self) -> bool { (self.0.get() & PRIORITY) != 0 } @@ -174,7 +167,7 @@ one = true } } - #[cfg(target_os = "freebsd")] + #[cfg(any(target_os = "freebsd"))] { if self.is_lio() { if one { diff -Nru temporalio-1.3.0/vendor/mio/src/io_source.rs temporalio-1.3.0/vendor/mio/src/io_source.rs --- temporalio-1.3.0/vendor/mio/src/io_source.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mio/src/io_source.rs 2023-10-30 19:40:00.000000000 +0000 @@ -142,8 +142,9 @@ ) -> io::Result<()> { #[cfg(debug_assertions)] self.selector_id.associate(registry)?; - self.state - .register(registry, token, interests, self.inner.as_raw_fd()) + registry + .selector() + .register(self.inner.as_raw_fd(), token, interests) } fn reregister( @@ -154,14 +155,15 @@ ) -> io::Result<()> { #[cfg(debug_assertions)] self.selector_id.check_association(registry)?; - self.state - .reregister(registry, token, interests, self.inner.as_raw_fd()) + registry + .selector() + .reregister(self.inner.as_raw_fd(), token, interests) } fn deregister(&mut self, registry: &Registry) -> io::Result<()> { #[cfg(debug_assertions)] self.selector_id.remove_association(registry)?; - self.state.deregister(registry, self.inner.as_raw_fd()) + registry.selector().deregister(self.inner.as_raw_fd()) } } diff -Nru temporalio-1.3.0/vendor/mio/src/net/uds/listener.rs temporalio-1.3.0/vendor/mio/src/net/uds/listener.rs --- temporalio-1.3.0/vendor/mio/src/net/uds/listener.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mio/src/net/uds/listener.rs 2023-10-30 19:40:00.000000000 +0000 @@ -13,16 +13,11 @@ } impl UnixListener { - /// Creates a new `UnixListener` bound to the specified socket `path`. + /// Creates a new `UnixListener` bound to the specified socket. pub fn bind>(path: P) -> io::Result { sys::uds::listener::bind(path.as_ref()).map(UnixListener::from_std) } - /// Creates a new `UnixListener` bound to the specified socket `address`. - pub fn bind_addr(address: &SocketAddr) -> io::Result { - sys::uds::listener::bind_addr(address).map(UnixListener::from_std) - } - /// Creates a new `UnixListener` from a standard `net::UnixListener`. /// /// This function is intended to be used to wrap a Unix listener from the diff -Nru temporalio-1.3.0/vendor/mio/src/net/uds/stream.rs temporalio-1.3.0/vendor/mio/src/net/uds/stream.rs --- temporalio-1.3.0/vendor/mio/src/net/uds/stream.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mio/src/net/uds/stream.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,5 +1,4 @@ use crate::io_source::IoSource; -use crate::net::SocketAddr; use crate::{event, sys, Interest, Registry, Token}; use std::fmt; @@ -23,14 +22,6 @@ sys::uds::stream::connect(path.as_ref()).map(UnixStream::from_std) } - /// Connects to the socket named by `address`. - /// - /// This may return a `WouldBlock` in which case the socket connection - /// cannot be completed immediately. Usually it means the backlog is full. - pub fn connect_addr(address: &SocketAddr) -> io::Result { - sys::uds::stream::connect_addr(address).map(UnixStream::from_std) - } - /// Creates a new `UnixStream` from a standard `net::UnixStream`. /// /// This function is intended to be used to wrap a Unix stream from the diff -Nru temporalio-1.3.0/vendor/mio/src/poll.rs temporalio-1.3.0/vendor/mio/src/poll.rs --- temporalio-1.3.0/vendor/mio/src/poll.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mio/src/poll.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,14 +1,9 @@ -#[cfg(all(unix, not(mio_unsupported_force_poll_poll), not(target_os = "vita")))] +use crate::{event, sys, Events, Interest, Token}; +#[cfg(unix)] use std::os::unix::io::{AsRawFd, RawFd}; -#[cfg(all(debug_assertions, not(target_os = "wasi")))] -use std::sync::atomic::{AtomicBool, Ordering}; -#[cfg(all(debug_assertions, not(target_os = "wasi")))] -use std::sync::Arc; use std::time::Duration; use std::{fmt, io}; -use crate::{event, sys, Events, Interest, Token}; - /// Polls for readiness events on all registered values. /// /// `Poll` allows a program to monitor a large number of [`event::Source`]s, @@ -257,9 +252,6 @@ /// Registers I/O resources. pub struct Registry { selector: sys::Selector, - /// Whether this selector currently has an associated waker. - #[cfg(all(debug_assertions, not(target_os = "wasi")))] - has_waker: Arc, } impl Poll { @@ -306,11 +298,7 @@ /// ``` pub fn new() -> io::Result { sys::Selector::new().map(|selector| Poll { - registry: Registry { - selector, - #[cfg(all(debug_assertions, not(target_os = "wasi")))] - has_waker: Arc::new(AtomicBool::new(false)), - }, + registry: Registry { selector }, }) } } @@ -423,7 +411,7 @@ } } -#[cfg(all(unix, not(mio_unsupported_force_poll_poll), not(target_os = "vita")))] +#[cfg(unix)] impl AsRawFd for Poll { fn as_raw_fd(&self) -> RawFd { self.registry.as_raw_fd() @@ -680,11 +668,9 @@ /// Event sources registered with this `Registry` will be registered with /// the original `Registry` and `Poll` instance. pub fn try_clone(&self) -> io::Result { - self.selector.try_clone().map(|selector| Registry { - selector, - #[cfg(all(debug_assertions, not(target_os = "wasi")))] - has_waker: Arc::clone(&self.has_waker), - }) + self.selector + .try_clone() + .map(|selector| Registry { selector }) } /// Internal check to ensure only a single `Waker` is active per [`Poll`] @@ -692,7 +678,7 @@ #[cfg(all(debug_assertions, not(target_os = "wasi")))] pub(crate) fn register_waker(&self) { assert!( - !self.has_waker.swap(true, Ordering::AcqRel), + !self.selector.register_waker(), "Only a single `Waker` can be active per `Poll` instance" ); } @@ -710,7 +696,7 @@ } } -#[cfg(all(unix, not(mio_unsupported_force_poll_poll), not(target_os = "vita")))] +#[cfg(unix)] impl AsRawFd for Registry { fn as_raw_fd(&self) -> RawFd { self.selector.as_raw_fd() @@ -718,11 +704,7 @@ } cfg_os_poll! { - #[cfg(all( - unix, - not(mio_unsupported_force_poll_poll), - not(target_os = "vita"), - ))] + #[cfg(unix)] #[test] pub fn as_raw_fd() { let poll = Poll::new().unwrap(); diff -Nru temporalio-1.3.0/vendor/mio/src/sys/shell/mod.rs temporalio-1.3.0/vendor/mio/src/sys/shell/mod.rs --- temporalio-1.3.0/vendor/mio/src/sys/shell/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mio/src/sys/shell/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -23,10 +23,8 @@ use std::io; #[cfg(windows)] use std::os::windows::io::RawSocket; - #[cfg(unix)] - use std::os::unix::io::RawFd; - #[cfg(any(windows, unix))] + #[cfg(windows)] use crate::{Registry, Token, Interest}; pub(crate) struct IoSourceState; @@ -46,33 +44,6 @@ } } - #[cfg(unix)] - impl IoSourceState { - pub fn register( - &mut self, - _: &Registry, - _: Token, - _: Interest, - _: RawFd, - ) -> io::Result<()> { - os_required!() - } - - pub fn reregister( - &mut self, - _: &Registry, - _: Token, - _: Interest, - _: RawFd, - ) -> io::Result<()> { - os_required!() - } - - pub fn deregister(&mut self, _: &Registry, _: RawFd) -> io::Result<()> { - os_required!() - } - } - #[cfg(windows)] impl IoSourceState { pub fn register( diff -Nru temporalio-1.3.0/vendor/mio/src/sys/shell/selector.rs temporalio-1.3.0/vendor/mio/src/sys/shell/selector.rs --- temporalio-1.3.0/vendor/mio/src/sys/shell/selector.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mio/src/sys/shell/selector.rs 2023-10-30 19:40:00.000000000 +0000 @@ -18,6 +18,11 @@ pub fn select(&self, _: &mut Events, _: Option) -> io::Result<()> { os_required!(); } + + #[cfg(all(debug_assertions, not(target_os = "wasi")))] + pub fn register_waker(&self) -> bool { + os_required!(); + } } #[cfg(unix)] diff -Nru temporalio-1.3.0/vendor/mio/src/sys/shell/uds.rs temporalio-1.3.0/vendor/mio/src/sys/shell/uds.rs --- temporalio-1.3.0/vendor/mio/src/sys/shell/uds.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mio/src/sys/shell/uds.rs 2023-10-30 19:40:00.000000000 +0000 @@ -42,10 +42,6 @@ os_required!() } - pub(crate) fn bind_addr(_: &SocketAddr) -> io::Result { - os_required!() - } - pub(crate) fn accept(_: &net::UnixListener) -> io::Result<(UnixStream, SocketAddr)> { os_required!() } @@ -65,10 +61,6 @@ os_required!() } - pub(crate) fn connect_addr(_: &SocketAddr) -> io::Result { - os_required!() - } - pub(crate) fn pair() -> io::Result<(net::UnixStream, net::UnixStream)> { os_required!() } diff -Nru temporalio-1.3.0/vendor/mio/src/sys/unix/mod.rs temporalio-1.3.0/vendor/mio/src/sys/unix/mod.rs --- temporalio-1.3.0/vendor/mio/src/sys/unix/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mio/src/sys/unix/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -33,81 +33,30 @@ } cfg_io_source! { + use std::io; + // Both `kqueue` and `epoll` don't need to hold any user space state. - #[cfg(not(any(mio_unsupported_force_poll_poll, target_os = "vita")))] - mod stateless_io_source { - use std::io; - use std::os::unix::io::RawFd; - use crate::Registry; - use crate::Token; - use crate::Interest; - - pub(crate) struct IoSourceState; - - impl IoSourceState { - pub fn new() -> IoSourceState { - IoSourceState - } - - pub fn do_io(&self, f: F, io: &T) -> io::Result - where - F: FnOnce(&T) -> io::Result, - { - // We don't hold state, so we can just call the function and - // return. - f(io) - } - - pub fn register( - &mut self, - registry: &Registry, - token: Token, - interests: Interest, - fd: RawFd, - ) -> io::Result<()> { - // Pass through, we don't have any state - registry.selector().register(fd, token, interests) - } - - pub fn reregister( - &mut self, - registry: &Registry, - token: Token, - interests: Interest, - fd: RawFd, - ) -> io::Result<()> { - // Pass through, we don't have any state - registry.selector().reregister(fd, token, interests) - } - - pub fn deregister(&mut self, registry: &Registry, fd: RawFd) -> io::Result<()> { - // Pass through, we don't have any state - registry.selector().deregister(fd) - } - } - } + pub(crate) struct IoSourceState; - #[cfg(not(any(mio_unsupported_force_poll_poll, target_os = "vita")))] - pub(crate) use self::stateless_io_source::IoSourceState; + impl IoSourceState { + pub fn new() -> IoSourceState { + IoSourceState + } - #[cfg(any(mio_unsupported_force_poll_poll, target_os = "vita"))] - pub(crate) use self::selector::IoSourceState; + pub fn do_io(&self, f: F, io: &T) -> io::Result + where + F: FnOnce(&T) -> io::Result, + { + // We don't hold state, so we can just call the function and + // return. + f(io) + } + } } - #[cfg(any( - // For the public `pipe` module, must match `cfg_os_ext` macro. - feature = "os-ext", - // For the `Waker` type based on a pipe. - mio_unsupported_force_waker_pipe, - target_os = "aix", - target_os = "dragonfly", - target_os = "illumos", - target_os = "netbsd", - target_os = "openbsd", - target_os = "redox", - target_os = "vita", - ))] - pub(crate) mod pipe; + cfg_os_ext! { + pub(crate) mod pipe; + } } cfg_not_os_poll! { diff -Nru temporalio-1.3.0/vendor/mio/src/sys/unix/net.rs temporalio-1.3.0/vendor/mio/src/sys/unix/net.rs --- temporalio-1.3.0/vendor/mio/src/sys/unix/net.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mio/src/sys/unix/net.rs 2023-10-30 19:40:00.000000000 +0000 @@ -44,21 +44,18 @@ return Err(err); } - // Darwin (and others) doesn't have SOCK_NONBLOCK or SOCK_CLOEXEC. + // Darwin doesn't have SOCK_NONBLOCK or SOCK_CLOEXEC. #[cfg(any( target_os = "ios", target_os = "macos", target_os = "tvos", target_os = "watchos", - target_os = "espidf", - target_os = "vita", ))] { if let Err(err) = syscall!(fcntl(socket, libc::F_SETFL, libc::O_NONBLOCK)) { let _ = syscall!(close(socket)); return Err(err); } - #[cfg(not(any(target_os = "espidf", target_os = "vita")))] if let Err(err) = syscall!(fcntl(socket, libc::F_SETFD, libc::FD_CLOEXEC)) { let _ = syscall!(close(socket)); return Err(err); @@ -98,12 +95,8 @@ sin_family: libc::AF_INET as libc::sa_family_t, sin_port: addr.port().to_be(), sin_addr, - #[cfg(not(target_os = "vita"))] sin_zero: [0; 8], - #[cfg(target_os = "vita")] - sin_zero: [0; 6], #[cfg(any( - target_os = "aix", target_os = "dragonfly", target_os = "freebsd", target_os = "ios", @@ -112,12 +105,8 @@ target_os = "openbsd", target_os = "tvos", target_os = "watchos", - target_os = "espidf", - target_os = "vita", ))] sin_len: 0, - #[cfg(target_os = "vita")] - sin_vport: addr.port().to_be(), }; let sockaddr = SocketAddrCRepr { v4: sockaddr_in }; @@ -134,7 +123,6 @@ sin6_flowinfo: addr.flowinfo(), sin6_scope_id: addr.scope_id(), #[cfg(any( - target_os = "aix", target_os = "dragonfly", target_os = "freebsd", target_os = "ios", @@ -143,12 +131,8 @@ target_os = "openbsd", target_os = "tvos", target_os = "watchos", - target_os = "espidf", - target_os = "vita", ))] sin6_len: 0, - #[cfg(target_os = "vita")] - sin6_vport: addr.port().to_be(), #[cfg(target_os = "illumos")] __sin6_src_id: 0, }; diff -Nru temporalio-1.3.0/vendor/mio/src/sys/unix/pipe.rs temporalio-1.3.0/vendor/mio/src/sys/unix/pipe.rs --- temporalio-1.3.0/vendor/mio/src/sys/unix/pipe.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mio/src/sys/unix/pipe.rs 2023-10-30 19:40:00.000000000 +0000 @@ -2,83 +2,9 @@ //! //! See the [`new`] function for documentation. -use std::io; -use std::os::unix::io::RawFd; - -pub(crate) fn new_raw() -> io::Result<[RawFd; 2]> { - let mut fds: [RawFd; 2] = [-1, -1]; - - #[cfg(any( - target_os = "android", - target_os = "dragonfly", - target_os = "freebsd", - target_os = "linux", - target_os = "netbsd", - target_os = "openbsd", - target_os = "illumos", - target_os = "redox", - target_os = "vita", - ))] - unsafe { - if libc::pipe2(fds.as_mut_ptr(), libc::O_CLOEXEC | libc::O_NONBLOCK) != 0 { - return Err(io::Error::last_os_error()); - } - } - - #[cfg(any( - target_os = "aix", - target_os = "ios", - target_os = "macos", - target_os = "tvos", - target_os = "watchos", - target_os = "espidf", - ))] - unsafe { - // For platforms that don't have `pipe2(2)` we need to manually set the - // correct flags on the file descriptor. - if libc::pipe(fds.as_mut_ptr()) != 0 { - return Err(io::Error::last_os_error()); - } - - for fd in &fds { - if libc::fcntl(*fd, libc::F_SETFL, libc::O_NONBLOCK) != 0 - || libc::fcntl(*fd, libc::F_SETFD, libc::FD_CLOEXEC) != 0 - { - let err = io::Error::last_os_error(); - // Don't leak file descriptors. Can't handle closing error though. - let _ = libc::close(fds[0]); - let _ = libc::close(fds[1]); - return Err(err); - } - } - } - - #[cfg(not(any( - target_os = "aix", - target_os = "android", - target_os = "dragonfly", - target_os = "freebsd", - target_os = "illumos", - target_os = "ios", - target_os = "linux", - target_os = "macos", - target_os = "netbsd", - target_os = "openbsd", - target_os = "redox", - target_os = "tvos", - target_os = "watchos", - target_os = "espidf", - target_os = "vita", - )))] - compile_error!("unsupported target for `mio::unix::pipe`"); - - Ok(fds) -} - -cfg_os_ext! { use std::fs::File; -use std::io::{IoSlice, IoSliceMut, Read, Write}; -use std::os::unix::io::{AsRawFd, FromRawFd, IntoRawFd}; +use std::io::{self, IoSlice, IoSliceMut, Read, Write}; +use std::os::unix::io::{AsRawFd, FromRawFd, IntoRawFd, RawFd}; use std::process::{ChildStderr, ChildStdin, ChildStdout}; use crate::io_source::IoSource; @@ -219,10 +145,70 @@ /// # } /// ``` pub fn new() -> io::Result<(Sender, Receiver)> { - let fds = new_raw()?; - // SAFETY: `new_raw` initialised the `fds` above. + let mut fds: [RawFd; 2] = [-1, -1]; + + #[cfg(any( + target_os = "android", + target_os = "dragonfly", + target_os = "freebsd", + target_os = "linux", + target_os = "netbsd", + target_os = "openbsd", + target_os = "illumos", + target_os = "redox", + ))] + unsafe { + if libc::pipe2(fds.as_mut_ptr(), libc::O_CLOEXEC | libc::O_NONBLOCK) != 0 { + return Err(io::Error::last_os_error()); + } + } + + #[cfg(any( + target_os = "ios", + target_os = "macos", + target_os = "tvos", + target_os = "watchos", + ))] + unsafe { + // For platforms that don't have `pipe2(2)` we need to manually set the + // correct flags on the file descriptor. + if libc::pipe(fds.as_mut_ptr()) != 0 { + return Err(io::Error::last_os_error()); + } + + for fd in &fds { + if libc::fcntl(*fd, libc::F_SETFL, libc::O_NONBLOCK) != 0 + || libc::fcntl(*fd, libc::F_SETFD, libc::FD_CLOEXEC) != 0 + { + let err = io::Error::last_os_error(); + // Don't leak file descriptors. Can't handle closing error though. + let _ = libc::close(fds[0]); + let _ = libc::close(fds[1]); + return Err(err); + } + } + } + + #[cfg(not(any( + target_os = "android", + target_os = "dragonfly", + target_os = "freebsd", + target_os = "illumos", + target_os = "ios", + target_os = "linux", + target_os = "macos", + target_os = "netbsd", + target_os = "openbsd", + target_os = "redox", + target_os = "tvos", + target_os = "watchos", + )))] + compile_error!("unsupported target for `mio::unix::pipe`"); + + // SAFETY: we just initialised the `fds` above. let r = unsafe { Receiver::from_raw_fd(fds[0]) }; let w = unsafe { Sender::from_raw_fd(fds[1]) }; + Ok((w, r)) } @@ -558,7 +544,7 @@ } } -#[cfg(not(any(target_os = "illumos", target_os = "vita")))] +#[cfg(not(target_os = "illumos"))] fn set_nonblocking(fd: RawFd, nonblocking: bool) -> io::Result<()> { let value = nonblocking as libc::c_int; if unsafe { libc::ioctl(fd, libc::FIONBIO, &value) } == -1 { @@ -568,7 +554,7 @@ } } -#[cfg(any(target_os = "illumos", target_os = "vita"))] +#[cfg(target_os = "illumos")] fn set_nonblocking(fd: RawFd, nonblocking: bool) -> io::Result<()> { let flags = unsafe { libc::fcntl(fd, libc::F_GETFL) }; if flags < 0 { @@ -589,4 +575,3 @@ Ok(()) } -} // `cfg_os_ext!`. diff -Nru temporalio-1.3.0/vendor/mio/src/sys/unix/selector/epoll.rs temporalio-1.3.0/vendor/mio/src/sys/unix/selector/epoll.rs --- temporalio-1.3.0/vendor/mio/src/sys/unix/selector/epoll.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mio/src/sys/unix/selector/epoll.rs 2023-10-30 19:40:00.000000000 +0000 @@ -3,7 +3,7 @@ use libc::{EPOLLET, EPOLLIN, EPOLLOUT, EPOLLPRI, EPOLLRDHUP}; use std::os::unix::io::{AsRawFd, RawFd}; #[cfg(debug_assertions)] -use std::sync::atomic::{AtomicUsize, Ordering}; +use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering}; use std::time::Duration; use std::{cmp, i32, io, ptr}; @@ -16,6 +16,8 @@ #[cfg(debug_assertions)] id: usize, ep: RawFd, + #[cfg(debug_assertions)] + has_waker: AtomicBool, } impl Selector { @@ -58,6 +60,8 @@ #[cfg(debug_assertions)] id: NEXT_ID.fetch_add(1, Ordering::Relaxed), ep, + #[cfg(debug_assertions)] + has_waker: AtomicBool::new(false), }) } @@ -67,6 +71,8 @@ #[cfg(debug_assertions)] id: self.id, ep, + #[cfg(debug_assertions)] + has_waker: AtomicBool::new(self.has_waker.load(Ordering::Acquire)), }) } @@ -132,6 +138,11 @@ pub fn deregister(&self, fd: RawFd) -> io::Result<()> { syscall!(epoll_ctl(self.ep, libc::EPOLL_CTL_DEL, fd, ptr::null_mut())).map(|_| ()) } + + #[cfg(debug_assertions)] + pub fn register_waker(&self) -> bool { + self.has_waker.swap(true, Ordering::AcqRel) + } } cfg_io_source! { diff -Nru temporalio-1.3.0/vendor/mio/src/sys/unix/selector/kqueue.rs temporalio-1.3.0/vendor/mio/src/sys/unix/selector/kqueue.rs --- temporalio-1.3.0/vendor/mio/src/sys/unix/selector/kqueue.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mio/src/sys/unix/selector/kqueue.rs 2023-10-30 19:40:00.000000000 +0000 @@ -3,7 +3,7 @@ use std::ops::{Deref, DerefMut}; use std::os::unix::io::{AsRawFd, RawFd}; #[cfg(debug_assertions)] -use std::sync::atomic::{AtomicUsize, Ordering}; +use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering}; use std::time::Duration; use std::{cmp, io, ptr, slice}; @@ -66,6 +66,8 @@ #[cfg(debug_assertions)] id: usize, kq: RawFd, + #[cfg(debug_assertions)] + has_waker: AtomicBool, } impl Selector { @@ -75,6 +77,8 @@ #[cfg(debug_assertions)] id: NEXT_ID.fetch_add(1, Ordering::Relaxed), kq, + #[cfg(debug_assertions)] + has_waker: AtomicBool::new(false), }; syscall!(fcntl(kq, libc::F_SETFD, libc::FD_CLOEXEC))?; @@ -87,6 +91,8 @@ #[cfg(debug_assertions)] id: self.id, kq, + #[cfg(debug_assertions)] + has_waker: AtomicBool::new(self.has_waker.load(Ordering::Acquire)), }) } @@ -207,6 +213,11 @@ kevent_register(self.kq, &mut changes, &[libc::ENOENT as i64]) } + #[cfg(debug_assertions)] + pub fn register_waker(&self) -> bool { + self.has_waker.swap(true, Ordering::AcqRel) + } + // Used by `Waker`. #[cfg(any( target_os = "freebsd", diff -Nru temporalio-1.3.0/vendor/mio/src/sys/unix/selector/mod.rs temporalio-1.3.0/vendor/mio/src/sys/unix/selector/mod.rs --- temporalio-1.3.0/vendor/mio/src/sys/unix/selector/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mio/src/sys/unix/selector/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,63 +1,40 @@ -#[cfg(all( - not(mio_unsupported_force_poll_poll), - any( - target_os = "android", - target_os = "illumos", - target_os = "linux", - target_os = "redox", - ) +#[cfg(any( + target_os = "android", + target_os = "illumos", + target_os = "linux", + target_os = "redox", ))] mod epoll; -#[cfg(all( - not(mio_unsupported_force_poll_poll), - any( - target_os = "android", - target_os = "illumos", - target_os = "linux", - target_os = "redox", - ) +#[cfg(any( + target_os = "android", + target_os = "illumos", + target_os = "linux", + target_os = "redox", ))] pub(crate) use self::epoll::{event, Event, Events, Selector}; -#[cfg(any(mio_unsupported_force_poll_poll, target_os = "vita"))] -mod poll; - -#[cfg(any(mio_unsupported_force_poll_poll, target_os = "vita"))] -pub(crate) use self::poll::{event, Event, Events, Selector}; - -cfg_io_source! { - #[cfg(any(mio_unsupported_force_poll_poll, target_os = "vita"))] - pub(crate) use self::poll::IoSourceState; -} - -#[cfg(all( - not(mio_unsupported_force_poll_poll), - any( - target_os = "dragonfly", - target_os = "freebsd", - target_os = "ios", - target_os = "macos", - target_os = "netbsd", - target_os = "openbsd", - target_os = "tvos", - target_os = "watchos", - ) +#[cfg(any( + target_os = "dragonfly", + target_os = "freebsd", + target_os = "ios", + target_os = "macos", + target_os = "netbsd", + target_os = "openbsd", + target_os = "tvos", + target_os = "watchos", ))] mod kqueue; -#[cfg(all( - not(mio_unsupported_force_poll_poll), - any( - target_os = "dragonfly", - target_os = "freebsd", - target_os = "ios", - target_os = "macos", - target_os = "netbsd", - target_os = "openbsd", - target_os = "tvos", - target_os = "watchos", - ), +#[cfg(any( + target_os = "dragonfly", + target_os = "freebsd", + target_os = "ios", + target_os = "macos", + target_os = "netbsd", + target_os = "openbsd", + target_os = "tvos", + target_os = "watchos", ))] pub(crate) use self::kqueue::{event, Event, Events, Selector}; diff -Nru temporalio-1.3.0/vendor/mio/src/sys/unix/selector/poll.rs temporalio-1.3.0/vendor/mio/src/sys/unix/selector/poll.rs --- temporalio-1.3.0/vendor/mio/src/sys/unix/selector/poll.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mio/src/sys/unix/selector/poll.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,726 +0,0 @@ -// This implementation is based on the one in the `polling` crate. -// Thanks to https://github.com/Kestrer for the original implementation! -// Permission to use this code has been granted by original author: -// https://github.com/tokio-rs/mio/pull/1602#issuecomment-1218441031 - -use crate::sys::unix::selector::LOWEST_FD; -use crate::sys::unix::waker::WakerInternal; -use crate::{Interest, Token}; -use std::collections::HashMap; -use std::fmt::{Debug, Formatter}; -use std::os::unix::io::{AsRawFd, RawFd}; -use std::sync::atomic::AtomicBool; -use std::sync::atomic::{AtomicUsize, Ordering}; -use std::sync::{Arc, Condvar, Mutex}; -use std::time::Duration; -use std::{cmp, fmt, io}; - -/// Unique id for use as `SelectorId`. -#[cfg(debug_assertions)] -static NEXT_ID: AtomicUsize = AtomicUsize::new(1); - -#[derive(Debug)] -pub struct Selector { - state: Arc, -} - -impl Selector { - pub fn new() -> io::Result { - let state = SelectorState::new()?; - - Ok(Selector { - state: Arc::new(state), - }) - } - - pub fn try_clone(&self) -> io::Result { - // Just to keep the compiler happy :) - let _ = LOWEST_FD; - - let state = self.state.clone(); - - Ok(Selector { state }) - } - - pub fn select(&self, events: &mut Events, timeout: Option) -> io::Result<()> { - self.state.select(events, timeout) - } - - pub fn register(&self, fd: RawFd, token: Token, interests: Interest) -> io::Result<()> { - self.state.register(fd, token, interests) - } - - #[allow(dead_code)] - pub(crate) fn register_internal( - &self, - fd: RawFd, - token: Token, - interests: Interest, - ) -> io::Result> { - self.state.register_internal(fd, token, interests) - } - - pub fn reregister(&self, fd: RawFd, token: Token, interests: Interest) -> io::Result<()> { - self.state.reregister(fd, token, interests) - } - - pub fn deregister(&self, fd: RawFd) -> io::Result<()> { - self.state.deregister(fd) - } - - pub fn wake(&self, token: Token) -> io::Result<()> { - self.state.wake(token) - } - cfg_io_source! { - #[cfg(debug_assertions)] - pub fn id(&self) -> usize { - self.state.id - } - } -} - -/// Interface to poll. -#[derive(Debug)] -struct SelectorState { - /// File descriptors to poll. - fds: Mutex, - - /// File descriptors which will be removed before the next poll call. - /// - /// When a file descriptor is deregistered while a poll is running, we need to filter - /// out all removed descriptors after that poll is finished running. - pending_removal: Mutex>, - - /// Token associated with Waker that have recently asked to wake. This will - /// cause a synthetic behaviour where on any wakeup we add all pending tokens - /// to the list of emitted events. - pending_wake_token: Mutex>, - - /// Data is written to this to wake up the current instance of `wait`, which can occur when the - /// user notifies it (in which case `notified` would have been set) or when an operation needs - /// to occur (in which case `waiting_operations` would have been incremented). - notify_waker: WakerInternal, - - /// The number of operations (`add`, `modify` or `delete`) that are currently waiting on the - /// mutex to become free. When this is nonzero, `wait` must be suspended until it reaches zero - /// again. - waiting_operations: AtomicUsize, - /// The condition variable that gets notified when `waiting_operations` reaches zero or - /// `notified` becomes true. - /// - /// This is used with the `fds` mutex. - operations_complete: Condvar, - - /// This selectors id. - #[cfg(debug_assertions)] - #[allow(dead_code)] - id: usize, -} - -/// The file descriptors to poll in a `Poller`. -#[derive(Debug, Clone)] -struct Fds { - /// The list of `pollfds` taken by poll. - /// - /// The first file descriptor is always present and is used to notify the poller. - poll_fds: Vec, - /// The map of each file descriptor to data associated with it. This does not include the file - /// descriptors created by the internal notify waker. - fd_data: HashMap, -} - -/// Transparent wrapper around `libc::pollfd`, used to support `Debug` derives without adding the -/// `extra_traits` feature of `libc`. -#[repr(transparent)] -#[derive(Clone)] -struct PollFd(libc::pollfd); - -impl Debug for PollFd { - fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { - f.debug_struct("pollfd") - .field("fd", &self.0.fd) - .field("events", &self.0.events) - .field("revents", &self.0.revents) - .finish() - } -} - -/// Data associated with a file descriptor in a poller. -#[derive(Debug, Clone)] -struct FdData { - /// The index into `poll_fds` this file descriptor is. - poll_fds_index: usize, - /// The key of the `Event` associated with this file descriptor. - token: Token, - /// Used to communicate with IoSourceState when we need to internally deregister - /// based on a closed fd. - shared_record: Arc, -} - -impl SelectorState { - pub fn new() -> io::Result { - let notify_waker = WakerInternal::new()?; - - Ok(Self { - fds: Mutex::new(Fds { - poll_fds: vec![PollFd(libc::pollfd { - fd: notify_waker.as_raw_fd(), - events: libc::POLLIN, - revents: 0, - })], - fd_data: HashMap::new(), - }), - pending_removal: Mutex::new(Vec::new()), - pending_wake_token: Mutex::new(None), - notify_waker, - waiting_operations: AtomicUsize::new(0), - operations_complete: Condvar::new(), - #[cfg(debug_assertions)] - id: NEXT_ID.fetch_add(1, Ordering::Relaxed), - }) - } - - pub fn select(&self, events: &mut Events, timeout: Option) -> io::Result<()> { - events.clear(); - - let mut fds = self.fds.lock().unwrap(); - - // Keep track of fds that receive POLLHUP or POLLERR (i.e. won't receive further - // events) and internally deregister them before they are externally deregister'd. See - // IoSourceState below to track how the external deregister call will be handled - // when this state occurs. - let mut closed_raw_fds = Vec::new(); - - loop { - // Complete all current operations. - loop { - if self.waiting_operations.load(Ordering::SeqCst) == 0 { - break; - } - - fds = self.operations_complete.wait(fds).unwrap(); - } - - // Perform the poll. - trace!("Polling on {:?}", &fds); - let num_events = poll(&mut fds.poll_fds, timeout)?; - trace!("Poll finished: {:?}", &fds); - - if num_events == 0 { - return Ok(()); - } - - let waker_events = fds.poll_fds[0].0.revents; - let notified = waker_events != 0; - let mut num_fd_events = if notified { num_events - 1 } else { num_events }; - - let pending_wake_token = self.pending_wake_token.lock().unwrap().take(); - - if notified { - self.notify_waker.ack_and_reset(); - if pending_wake_token.is_some() { - num_fd_events += 1; - } - } - - // We now check whether this poll was performed with descriptors which were pending - // for removal and filter out any matching. - let mut pending_removal_guard = self.pending_removal.lock().unwrap(); - let mut pending_removal = std::mem::replace(pending_removal_guard.as_mut(), Vec::new()); - drop(pending_removal_guard); - - // Store the events if there were any. - if num_fd_events > 0 { - let fds = &mut *fds; - - events.reserve(num_fd_events); - - // Add synthetic events we picked up from calls to wake() - if let Some(pending_wake_token) = pending_wake_token { - events.push(Event { - token: pending_wake_token, - events: waker_events, - }); - } - - for fd_data in fds.fd_data.values_mut() { - let PollFd(poll_fd) = &mut fds.poll_fds[fd_data.poll_fds_index]; - - if pending_removal.contains(&poll_fd.fd) { - // Fd was removed while poll was running - continue; - } - - if poll_fd.revents != 0 { - // Store event - events.push(Event { - token: fd_data.token, - events: poll_fd.revents, - }); - - if poll_fd.revents & (libc::POLLHUP | libc::POLLERR) != 0 { - pending_removal.push(poll_fd.fd); - closed_raw_fds.push(poll_fd.fd); - } - - // Remove the interest which just got triggered - // the IoSourceState/WakerRegistrar used with this selector will add back - // the interest using reregister. - poll_fd.events &= !poll_fd.revents; - - // Minor optimization to potentially avoid looping n times where n is the - // number of input fds (i.e. we might loop between m and n times where m is - // the number of fds with revents != 0). - if events.len() == num_fd_events { - break; - } - } - } - - break; // No more polling. - } - - // If we didn't break above it means we got woken up internally (for example for adding an fd), so we poll again. - } - - drop(fds); - let _ = self.deregister_all(&closed_raw_fds); - - Ok(()) - } - - pub fn register(&self, fd: RawFd, token: Token, interests: Interest) -> io::Result<()> { - self.register_internal(fd, token, interests).map(|_| ()) - } - - pub fn register_internal( - &self, - fd: RawFd, - token: Token, - interests: Interest, - ) -> io::Result> { - #[cfg(debug_assertions)] - if fd == self.notify_waker.as_raw_fd() { - return Err(io::Error::from(io::ErrorKind::InvalidInput)); - } - - // We must handle the unlikely case that the following order of operations happens: - // - // register(1 as RawFd) - // deregister(1 as RawFd) - // register(1 as RawFd) - // - // - // Fd's pending removal only get cleared when poll has been run. It is possible that - // between registering and deregistering and then _again_ registering the file descriptor - // poll never gets called, thus the fd stays stuck in the pending removal list. - // - // To avoid this scenario we remove an fd from pending removals when registering it. - let mut pending_removal = self.pending_removal.lock().unwrap(); - if let Some(idx) = pending_removal.iter().position(|&pending| pending == fd) { - pending_removal.swap_remove(idx); - } - drop(pending_removal); - - self.modify_fds(|fds| { - if fds.fd_data.contains_key(&fd) { - return Err(io::Error::new( - io::ErrorKind::AlreadyExists, - "I/O source already registered this `Registry` \ - (an old file descriptor might have been closed without deregistration)", - )); - } - - let poll_fds_index = fds.poll_fds.len(); - let record = Arc::new(RegistrationRecord::new()); - fds.fd_data.insert( - fd, - FdData { - poll_fds_index, - token, - shared_record: record.clone(), - }, - ); - - fds.poll_fds.push(PollFd(libc::pollfd { - fd, - events: interests_to_poll(interests), - revents: 0, - })); - - Ok(record) - }) - } - - pub fn reregister(&self, fd: RawFd, token: Token, interests: Interest) -> io::Result<()> { - self.modify_fds(|fds| { - let data = fds.fd_data.get_mut(&fd).ok_or(io::ErrorKind::NotFound)?; - data.token = token; - let poll_fds_index = data.poll_fds_index; - fds.poll_fds[poll_fds_index].0.events = interests_to_poll(interests); - - Ok(()) - }) - } - - pub fn deregister(&self, fd: RawFd) -> io::Result<()> { - self.deregister_all(&[fd]) - .map_err(|_| io::ErrorKind::NotFound)?; - Ok(()) - } - - /// Perform a modification on `fds`, interrupting the current caller of `wait` if it's running. - fn modify_fds(&self, f: impl FnOnce(&mut Fds) -> T) -> T { - self.waiting_operations.fetch_add(1, Ordering::SeqCst); - - // Wake up the current caller of `wait` if there is one. - let sent_notification = self.notify_waker.wake().is_ok(); - - let mut fds = self.fds.lock().unwrap(); - - // If there was no caller of `wait` our notification was not removed from the pipe. - if sent_notification { - self.notify_waker.ack_and_reset(); - } - - let res = f(&mut *fds); - - if self.waiting_operations.fetch_sub(1, Ordering::SeqCst) == 1 { - self.operations_complete.notify_one(); - } - - res - } - - /// Special optimized version of [Self::deregister] which handles multiple removals - /// at once. Ok result if all removals were performed, Err if any entries - /// were not found. - fn deregister_all(&self, targets: &[RawFd]) -> Result<(), ()> { - if targets.is_empty() { - return Ok(()); - } - - let mut pending_removal = self.pending_removal.lock().unwrap(); - pending_removal.extend(targets); - drop(pending_removal); - - self.modify_fds(|fds| { - let mut all_successful = true; - - for target in targets { - match fds.fd_data.remove(target).ok_or(()) { - Ok(data) => { - data.shared_record.mark_unregistered(); - fds.poll_fds.swap_remove(data.poll_fds_index); - if let Some(swapped_pollfd) = fds.poll_fds.get(data.poll_fds_index) { - fds.fd_data - .get_mut(&swapped_pollfd.0.fd) - .unwrap() - .poll_fds_index = data.poll_fds_index; - } - } - Err(_) => all_successful = false, - } - } - - if all_successful { - Ok(()) - } else { - Err(()) - } - }) - } - - pub fn wake(&self, token: Token) -> io::Result<()> { - self.pending_wake_token.lock().unwrap().replace(token); - self.notify_waker.wake() - } -} - -/// Shared record between IoSourceState and SelectorState that allows us to internally -/// deregister partially or fully closed fds (i.e. when we get POLLHUP or PULLERR) without -/// confusing IoSourceState and trying to deregister twice. This isn't strictly -/// required as technically deregister is idempotent but it is confusing -/// when trying to debug behaviour as we get imbalanced calls to register/deregister and -/// superfluous NotFound errors. -#[derive(Debug)] -pub(crate) struct RegistrationRecord { - is_unregistered: AtomicBool, -} - -impl RegistrationRecord { - pub fn new() -> Self { - Self { - is_unregistered: AtomicBool::new(false), - } - } - - pub fn mark_unregistered(&self) { - self.is_unregistered.store(true, Ordering::Relaxed); - } - - #[allow(dead_code)] - pub fn is_registered(&self) -> bool { - !self.is_unregistered.load(Ordering::Relaxed) - } -} - -#[cfg(target_os = "linux")] -const POLLRDHUP: libc::c_short = libc::POLLRDHUP; -#[cfg(not(target_os = "linux"))] -const POLLRDHUP: libc::c_short = 0; - -const READ_EVENTS: libc::c_short = libc::POLLIN | POLLRDHUP; - -const WRITE_EVENTS: libc::c_short = libc::POLLOUT; - -const PRIORITY_EVENTS: libc::c_short = libc::POLLPRI; - -/// Get the input poll events for the given event. -fn interests_to_poll(interest: Interest) -> libc::c_short { - let mut kind = 0; - - if interest.is_readable() { - kind |= READ_EVENTS; - } - - if interest.is_writable() { - kind |= WRITE_EVENTS; - } - - if interest.is_priority() { - kind |= PRIORITY_EVENTS; - } - - kind -} - -/// Helper function to call poll. -fn poll(fds: &mut [PollFd], timeout: Option) -> io::Result { - loop { - // A bug in kernels < 2.6.37 makes timeouts larger than LONG_MAX / CONFIG_HZ - // (approx. 30 minutes with CONFIG_HZ=1200) effectively infinite on 32 bits - // architectures. The magic number is the same constant used by libuv. - #[cfg(target_pointer_width = "32")] - const MAX_SAFE_TIMEOUT: u128 = 1789569; - #[cfg(not(target_pointer_width = "32"))] - const MAX_SAFE_TIMEOUT: u128 = libc::c_int::max_value() as u128; - - let timeout = timeout - .map(|to| { - // `Duration::as_millis` truncates, so round up. This avoids - // turning sub-millisecond timeouts into a zero timeout, unless - // the caller explicitly requests that by specifying a zero - // timeout. - let to_ms = to - .checked_add(Duration::from_nanos(999_999)) - .unwrap_or(to) - .as_millis(); - cmp::min(MAX_SAFE_TIMEOUT, to_ms) as libc::c_int - }) - .unwrap_or(-1); - - let res = syscall!(poll( - fds.as_mut_ptr() as *mut libc::pollfd, - fds.len() as libc::nfds_t, - timeout, - )); - - match res { - Ok(num_events) => break Ok(num_events as usize), - // poll returns EAGAIN if we can retry it. - Err(e) if e.raw_os_error() == Some(libc::EAGAIN) => continue, - Err(e) => return Err(e), - } - } -} - -#[derive(Debug, Clone)] -pub struct Event { - token: Token, - events: libc::c_short, -} - -pub type Events = Vec; - -pub mod event { - use crate::sys::unix::selector::poll::POLLRDHUP; - use crate::sys::Event; - use crate::Token; - use std::fmt; - - pub fn token(event: &Event) -> Token { - event.token - } - - pub fn is_readable(event: &Event) -> bool { - (event.events & libc::POLLIN) != 0 || (event.events & libc::POLLPRI) != 0 - } - - pub fn is_writable(event: &Event) -> bool { - (event.events & libc::POLLOUT) != 0 - } - - pub fn is_error(event: &Event) -> bool { - (event.events & libc::POLLERR) != 0 - } - - pub fn is_read_closed(event: &Event) -> bool { - // Both halves of the socket have closed - (event.events & libc::POLLHUP) != 0 - // Socket has received FIN or called shutdown(SHUT_RD) - || (event.events & POLLRDHUP) != 0 - } - - pub fn is_write_closed(event: &Event) -> bool { - // Both halves of the socket have closed - (event.events & libc::POLLHUP) != 0 - // Unix pipe write end has closed - || ((event.events & libc::POLLOUT) != 0 && (event.events & libc::POLLERR) != 0) - // The other side (read end) of a Unix pipe has closed. - || (event.events == libc::POLLERR) - } - - pub fn is_priority(event: &Event) -> bool { - (event.events & libc::POLLPRI) != 0 - } - - pub fn is_aio(_: &Event) -> bool { - // Not supported in the kernel, only in libc. - false - } - - pub fn is_lio(_: &Event) -> bool { - // Not supported. - false - } - - pub fn debug_details(f: &mut fmt::Formatter<'_>, event: &Event) -> fmt::Result { - #[allow(clippy::trivially_copy_pass_by_ref)] - fn check_events(got: &libc::c_short, want: &libc::c_short) -> bool { - (*got & want) != 0 - } - debug_detail!( - EventsDetails(libc::c_short), - check_events, - libc::POLLIN, - libc::POLLPRI, - libc::POLLOUT, - libc::POLLRDNORM, - libc::POLLRDBAND, - libc::POLLWRNORM, - libc::POLLWRBAND, - libc::POLLERR, - libc::POLLHUP, - ); - - f.debug_struct("poll_event") - .field("token", &event.token) - .field("events", &EventsDetails(event.events)) - .finish() - } -} - -cfg_io_source! { - use crate::Registry; - - struct InternalState { - selector: Selector, - token: Token, - interests: Interest, - fd: RawFd, - shared_record: Arc, - } - - impl Drop for InternalState { - fn drop(&mut self) { - if self.shared_record.is_registered() { - let _ = self.selector.deregister(self.fd); - } - } - } - - pub(crate) struct IoSourceState { - inner: Option>, - } - - impl IoSourceState { - pub fn new() -> IoSourceState { - IoSourceState { inner: None } - } - - pub fn do_io(&self, f: F, io: &T) -> io::Result - where - F: FnOnce(&T) -> io::Result, - { - let result = f(io); - - if let Err(err) = &result { - if err.kind() == io::ErrorKind::WouldBlock { - self.inner.as_ref().map_or(Ok(()), |state| { - state - .selector - .reregister(state.fd, state.token, state.interests) - })?; - } - } - - result - } - - pub fn register( - &mut self, - registry: &Registry, - token: Token, - interests: Interest, - fd: RawFd, - ) -> io::Result<()> { - if self.inner.is_some() { - Err(io::ErrorKind::AlreadyExists.into()) - } else { - let selector = registry.selector().try_clone()?; - - selector.register_internal(fd, token, interests).map(move |shared_record| { - let state = InternalState { - selector, - token, - interests, - fd, - shared_record, - }; - - self.inner = Some(Box::new(state)); - }) - } - } - - pub fn reregister( - &mut self, - registry: &Registry, - token: Token, - interests: Interest, - fd: RawFd, - ) -> io::Result<()> { - match self.inner.as_mut() { - Some(state) => registry - .selector() - .reregister(fd, token, interests) - .map(|()| { - state.token = token; - state.interests = interests; - }), - None => Err(io::ErrorKind::NotFound.into()), - } - } - - pub fn deregister(&mut self, registry: &Registry, fd: RawFd) -> io::Result<()> { - if let Some(state) = self.inner.take() { - // Marking unregistered will short circuit the drop behaviour of calling - // deregister so the call to deregister below is strictly required. - state.shared_record.mark_unregistered(); - } - - registry.selector().deregister(fd) - } - } -} diff -Nru temporalio-1.3.0/vendor/mio/src/sys/unix/tcp.rs temporalio-1.3.0/vendor/mio/src/sys/unix/tcp.rs --- temporalio-1.3.0/vendor/mio/src/sys/unix/tcp.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mio/src/sys/unix/tcp.rs 2023-10-30 19:40:00.000000000 +0000 @@ -82,14 +82,11 @@ // OSes inherit the non-blocking flag from the listener, so we just have to // set `CLOEXEC`. #[cfg(any( - target_os = "aix", target_os = "ios", target_os = "macos", target_os = "redox", target_os = "tvos", target_os = "watchos", - target_os = "espidf", - target_os = "vita", all(target_arch = "x86", target_os = "android"), ))] let stream = { @@ -100,15 +97,10 @@ )) .map(|socket| unsafe { net::TcpStream::from_raw_fd(socket) }) .and_then(|s| { - #[cfg(not(any(target_os = "espidf", target_os = "vita")))] syscall!(fcntl(s.as_raw_fd(), libc::F_SETFD, libc::FD_CLOEXEC))?; // See https://github.com/tokio-rs/mio/issues/1450 - #[cfg(any( - all(target_arch = "x86", target_os = "android"), - target_os = "espidf", - target_os = "vita", - ))] + #[cfg(all(target_arch = "x86", target_os = "android"))] syscall!(fcntl(s.as_raw_fd(), libc::F_SETFL, libc::O_NONBLOCK))?; Ok(s) diff -Nru temporalio-1.3.0/vendor/mio/src/sys/unix/uds/datagram.rs temporalio-1.3.0/vendor/mio/src/sys/unix/uds/datagram.rs --- temporalio-1.3.0/vendor/mio/src/sys/unix/uds/datagram.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mio/src/sys/unix/uds/datagram.rs 2023-10-30 19:40:00.000000000 +0000 @@ -2,13 +2,12 @@ use crate::sys::unix::net::new_socket; use std::io; -use std::os::unix::ffi::OsStrExt; use std::os::unix::io::{AsRawFd, FromRawFd}; use std::os::unix::net; use std::path::Path; pub(crate) fn bind(path: &Path) -> io::Result { - let (sockaddr, socklen) = socket_addr(path.as_os_str().as_bytes())?; + let (sockaddr, socklen) = socket_addr(path)?; let sockaddr = &sockaddr as *const libc::sockaddr_un as *const _; let socket = unbound()?; diff -Nru temporalio-1.3.0/vendor/mio/src/sys/unix/uds/listener.rs temporalio-1.3.0/vendor/mio/src/sys/unix/uds/listener.rs --- temporalio-1.3.0/vendor/mio/src/sys/unix/uds/listener.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mio/src/sys/unix/uds/listener.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,27 +1,18 @@ use super::socket_addr; use crate::net::{SocketAddr, UnixStream}; use crate::sys::unix::net::new_socket; -use std::os::unix::ffi::OsStrExt; use std::os::unix::io::{AsRawFd, FromRawFd}; use std::os::unix::net; use std::path::Path; use std::{io, mem}; pub(crate) fn bind(path: &Path) -> io::Result { - let socket_address = { - let (sockaddr, socklen) = socket_addr(path.as_os_str().as_bytes())?; - SocketAddr::from_parts(sockaddr, socklen) - }; - - bind_addr(&socket_address) -} + let (sockaddr, socklen) = socket_addr(path)?; + let sockaddr = &sockaddr as *const libc::sockaddr_un as *const libc::sockaddr; -pub(crate) fn bind_addr(address: &SocketAddr) -> io::Result { let fd = new_socket(libc::AF_UNIX, libc::SOCK_STREAM)?; let socket = unsafe { net::UnixListener::from_raw_fd(fd) }; - let sockaddr = address.raw_sockaddr() as *const libc::sockaddr_un as *const libc::sockaddr; - - syscall!(bind(fd, sockaddr, *address.raw_socklen()))?; + syscall!(bind(fd, sockaddr, socklen))?; syscall!(listen(fd, 1024))?; Ok(socket) @@ -44,15 +35,12 @@ let mut socklen = mem::size_of_val(&sockaddr) as libc::socklen_t; #[cfg(not(any( - target_os = "aix", target_os = "ios", target_os = "macos", target_os = "netbsd", target_os = "redox", target_os = "tvos", target_os = "watchos", - target_os = "espidf", - target_os = "vita", // Android x86's seccomp profile forbids calls to `accept4(2)` // See https://github.com/tokio-rs/mio/issues/1445 for details all(target_arch = "x86", target_os = "android"), @@ -69,15 +57,12 @@ }; #[cfg(any( - target_os = "aix", target_os = "ios", target_os = "macos", target_os = "netbsd", target_os = "redox", target_os = "tvos", target_os = "watchos", - target_os = "espidf", - target_os = "vita", all(target_arch = "x86", target_os = "android") ))] let socket = syscall!(accept( @@ -89,15 +74,10 @@ // Ensure the socket is closed if either of the `fcntl` calls // error below. let s = unsafe { net::UnixStream::from_raw_fd(socket) }; - #[cfg(not(any(target_os = "espidf", target_os = "vita")))] syscall!(fcntl(socket, libc::F_SETFD, libc::FD_CLOEXEC))?; // See https://github.com/tokio-rs/mio/issues/1450 - #[cfg(any( - all(target_arch = "x86", target_os = "android"), - target_os = "espidf", - target_os = "vita", - ))] + #[cfg(all(target_arch = "x86", target_os = "android"))] syscall!(fcntl(socket, libc::F_SETFL, libc::O_NONBLOCK))?; Ok(s) diff -Nru temporalio-1.3.0/vendor/mio/src/sys/unix/uds/mod.rs temporalio-1.3.0/vendor/mio/src/sys/unix/uds/mod.rs --- temporalio-1.3.0/vendor/mio/src/sys/unix/uds/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mio/src/sys/unix/uds/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -15,14 +15,16 @@ cfg_os_poll! { use std::cmp::Ordering; + use std::os::unix::ffi::OsStrExt; use std::os::unix::io::{RawFd, FromRawFd}; + use std::path::Path; use std::{io, mem}; pub(crate) mod datagram; pub(crate) mod listener; pub(crate) mod stream; - pub(in crate::sys) fn socket_addr(bytes: &[u8]) -> io::Result<(libc::sockaddr_un, libc::socklen_t)> { + pub(in crate::sys) fn socket_addr(path: &Path) -> io::Result<(libc::sockaddr_un, libc::socklen_t)> { let sockaddr = mem::MaybeUninit::::zeroed(); // This is safe to assume because a `libc::sockaddr_un` filled with `0` @@ -37,6 +39,7 @@ sockaddr.sun_family = libc::AF_UNIX as libc::sa_family_t; + let bytes = path.as_os_str().as_bytes(); match (bytes.first(), bytes.len().cmp(&sockaddr.sun_path.len())) { // Abstract paths don't need a null terminator (Some(&0), Ordering::Greater) => { @@ -75,13 +78,10 @@ where T: FromRawFd, { #[cfg(not(any( - target_os = "aix", target_os = "ios", target_os = "macos", target_os = "tvos", target_os = "watchos", - target_os = "espidf", - target_os = "vita", )))] let flags = flags | libc::SOCK_NONBLOCK | libc::SOCK_CLOEXEC; @@ -89,30 +89,24 @@ syscall!(socketpair(libc::AF_UNIX, flags, 0, fds.as_mut_ptr()))?; let pair = unsafe { (T::from_raw_fd(fds[0]), T::from_raw_fd(fds[1])) }; - // Darwin (and others) doesn't have SOCK_NONBLOCK or SOCK_CLOEXEC. + // Darwin doesn't have SOCK_NONBLOCK or SOCK_CLOEXEC. // // In order to set those flags, additional `fcntl` sys calls must be // performed. If a `fnctl` fails after the sockets have been created, // the file descriptors will leak. Creating `pair` above ensures that if // there is an error, the file descriptors are closed. #[cfg(any( - target_os = "aix", target_os = "ios", target_os = "macos", target_os = "tvos", target_os = "watchos", - target_os = "espidf", - target_os = "vita", ))] { syscall!(fcntl(fds[0], libc::F_SETFL, libc::O_NONBLOCK))?; - #[cfg(not(any(target_os = "espidf", target_os = "vita")))] syscall!(fcntl(fds[0], libc::F_SETFD, libc::FD_CLOEXEC))?; syscall!(fcntl(fds[1], libc::F_SETFL, libc::O_NONBLOCK))?; - #[cfg(not(any(target_os = "espidf", target_os = "vita")))] syscall!(fcntl(fds[1], libc::F_SETFD, libc::FD_CLOEXEC))?; } - Ok(pair) } @@ -130,7 +124,6 @@ #[cfg(test)] mod tests { use super::{path_offset, socket_addr}; - use std::os::unix::ffi::OsStrExt; use std::path::Path; use std::str; @@ -142,7 +135,7 @@ // Pathname addresses do have a null terminator, so `socklen` is // expected to be `PATH_LEN` + `offset` + 1. let path = Path::new(PATH); - let (sockaddr, actual) = socket_addr(path.as_os_str().as_bytes()).unwrap(); + let (sockaddr, actual) = socket_addr(path).unwrap(); let offset = path_offset(&sockaddr); let expected = PATH_LEN + offset + 1; assert_eq!(expected as libc::socklen_t, actual) @@ -155,7 +148,9 @@ // Abstract addresses do not have a null terminator, so `socklen` is // expected to be `PATH_LEN` + `offset`. - let (sockaddr, actual) = socket_addr(PATH).unwrap(); + let abstract_path = str::from_utf8(PATH).unwrap(); + let path = Path::new(abstract_path); + let (sockaddr, actual) = socket_addr(path).unwrap(); let offset = path_offset(&sockaddr); let expected = PATH_LEN + offset; assert_eq!(expected as libc::socklen_t, actual) diff -Nru temporalio-1.3.0/vendor/mio/src/sys/unix/uds/socketaddr.rs temporalio-1.3.0/vendor/mio/src/sys/unix/uds/socketaddr.rs --- temporalio-1.3.0/vendor/mio/src/sys/unix/uds/socketaddr.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mio/src/sys/unix/uds/socketaddr.rs 2023-10-30 19:40:00.000000000 +0000 @@ -73,14 +73,6 @@ SocketAddr { sockaddr, socklen } } - pub(crate) fn raw_sockaddr(&self) -> &libc::sockaddr_un { - &self.sockaddr - } - - pub(crate) fn raw_socklen(&self) -> &libc::socklen_t { - &self.socklen - } - /// Returns `true` if the address is unnamed. /// /// Documentation reflected in [`SocketAddr`] diff -Nru temporalio-1.3.0/vendor/mio/src/sys/unix/uds/stream.rs temporalio-1.3.0/vendor/mio/src/sys/unix/uds/stream.rs --- temporalio-1.3.0/vendor/mio/src/sys/unix/uds/stream.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mio/src/sys/unix/uds/stream.rs 2023-10-30 19:40:00.000000000 +0000 @@ -2,26 +2,17 @@ use crate::sys::unix::net::new_socket; use std::io; -use std::os::unix::ffi::OsStrExt; use std::os::unix::io::{AsRawFd, FromRawFd}; use std::os::unix::net; use std::path::Path; pub(crate) fn connect(path: &Path) -> io::Result { - let socket_address = { - let (sockaddr, socklen) = socket_addr(path.as_os_str().as_bytes())?; - SocketAddr::from_parts(sockaddr, socklen) - }; + let (sockaddr, socklen) = socket_addr(path)?; + let sockaddr = &sockaddr as *const libc::sockaddr_un as *const libc::sockaddr; - connect_addr(&socket_address) -} - -pub(crate) fn connect_addr(address: &SocketAddr) -> io::Result { let fd = new_socket(libc::AF_UNIX, libc::SOCK_STREAM)?; let socket = unsafe { net::UnixStream::from_raw_fd(fd) }; - let sockaddr = address.raw_sockaddr() as *const libc::sockaddr_un as *const libc::sockaddr; - - match syscall!(connect(fd, sockaddr, *address.raw_socklen())) { + match syscall!(connect(fd, sockaddr, socklen)) { Ok(_) => {} Err(ref err) if err.raw_os_error() == Some(libc::EINPROGRESS) => {} Err(e) => return Err(e), diff -Nru temporalio-1.3.0/vendor/mio/src/sys/unix/waker.rs temporalio-1.3.0/vendor/mio/src/sys/unix/waker.rs --- temporalio-1.3.0/vendor/mio/src/sys/unix/waker.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mio/src/sys/unix/waker.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,80 +1,11 @@ -#[cfg(all( - not(mio_unsupported_force_poll_poll), - not(all( - not(mio_unsupported_force_waker_pipe), - any( - target_os = "freebsd", - target_os = "ios", - target_os = "macos", - target_os = "tvos", - target_os = "watchos", - ) - )), - not(target_os = "vita"), -))] -mod fdbased { - #[cfg(all( - not(mio_unsupported_force_waker_pipe), - any(target_os = "linux", target_os = "android"), - ))] - use crate::sys::unix::waker::eventfd::WakerInternal; - #[cfg(any( - mio_unsupported_force_waker_pipe, - target_os = "aix", - target_os = "dragonfly", - target_os = "illumos", - target_os = "netbsd", - target_os = "openbsd", - target_os = "redox", - ))] - use crate::sys::unix::waker::pipe::WakerInternal; +#[cfg(any(target_os = "linux", target_os = "android"))] +mod eventfd { use crate::sys::Selector; use crate::{Interest, Token}; - use std::io; - use std::os::unix::io::AsRawFd; - - #[derive(Debug)] - pub struct Waker { - waker: WakerInternal, - } - - impl Waker { - pub fn new(selector: &Selector, token: Token) -> io::Result { - let waker = WakerInternal::new()?; - selector.register(waker.as_raw_fd(), token, Interest::READABLE)?; - Ok(Waker { waker }) - } - - pub fn wake(&self) -> io::Result<()> { - self.waker.wake() - } - } -} - -#[cfg(all( - not(mio_unsupported_force_poll_poll), - not(all( - not(mio_unsupported_force_waker_pipe), - any( - target_os = "freebsd", - target_os = "ios", - target_os = "macos", - target_os = "tvos", - target_os = "watchos", - ) - )), - not(target_os = "vita"), -))] -pub use self::fdbased::Waker; -#[cfg(all( - not(mio_unsupported_force_waker_pipe), - any(target_os = "linux", target_os = "android", target_os = "espidf") -))] -mod eventfd { use std::fs::File; use std::io::{self, Read, Write}; - use std::os::unix::io::{AsRawFd, FromRawFd, RawFd}; + use std::os::unix::io::FromRawFd; /// Waker backed by `eventfd`. /// @@ -83,21 +14,17 @@ /// unsigned integer and added to the count. Reads must also be 8 bytes and /// reset the count to 0, returning the count. #[derive(Debug)] - pub struct WakerInternal { + pub struct Waker { fd: File, } - impl WakerInternal { - pub fn new() -> io::Result { - #[cfg(not(target_os = "espidf"))] - let flags = libc::EFD_CLOEXEC | libc::EFD_NONBLOCK; - // ESP-IDF is EFD_NONBLOCK by default and errors if you try to pass this flag. - #[cfg(target_os = "espidf")] - let flags = 0; - let fd = syscall!(eventfd(0, flags))?; - + impl Waker { + pub fn new(selector: &Selector, token: Token) -> io::Result { + let fd = syscall!(eventfd(0, libc::EFD_CLOEXEC | libc::EFD_NONBLOCK))?; let file = unsafe { File::from_raw_fd(fd) }; - Ok(WakerInternal { fd: file }) + + selector.register(fd, token, Interest::READABLE)?; + Ok(Waker { fd: file }) } pub fn wake(&self) -> io::Result<()> { @@ -114,11 +41,6 @@ } } - #[cfg(mio_unsupported_force_poll_poll)] - pub fn ack_and_reset(&self) { - let _ = self.reset(); - } - /// Reset the eventfd object, only need to call this if `wake` fails. fn reset(&self) -> io::Result<()> { let mut buf: [u8; 8] = 0u64.to_ne_bytes(); @@ -131,30 +53,17 @@ } } } - - impl AsRawFd for WakerInternal { - fn as_raw_fd(&self) -> RawFd { - self.fd.as_raw_fd() - } - } } -#[cfg(all( - mio_unsupported_force_poll_poll, - not(mio_unsupported_force_waker_pipe), - any(target_os = "linux", target_os = "android", target_os = "espidf") -))] -pub(crate) use self::eventfd::WakerInternal; +#[cfg(any(target_os = "linux", target_os = "android"))] +pub use self::eventfd::Waker; -#[cfg(all( - not(mio_unsupported_force_waker_pipe), - any( - target_os = "freebsd", - target_os = "ios", - target_os = "macos", - target_os = "tvos", - target_os = "watchos", - ) +#[cfg(any( + target_os = "freebsd", + target_os = "ios", + target_os = "macos", + target_os = "tvos", + target_os = "watchos", ))] mod kqueue { use crate::sys::Selector; @@ -187,50 +96,49 @@ } } -#[cfg(all( - not(mio_unsupported_force_waker_pipe), - any( - target_os = "freebsd", - target_os = "ios", - target_os = "macos", - target_os = "tvos", - target_os = "watchos", - ) +#[cfg(any( + target_os = "freebsd", + target_os = "ios", + target_os = "macos", + target_os = "tvos", + target_os = "watchos", ))] pub use self::kqueue::Waker; #[cfg(any( - mio_unsupported_force_waker_pipe, - target_os = "aix", target_os = "dragonfly", target_os = "illumos", target_os = "netbsd", target_os = "openbsd", target_os = "redox", - target_os = "vita", ))] mod pipe { - use crate::sys::unix::pipe; + use crate::sys::unix::Selector; + use crate::{Interest, Token}; + use std::fs::File; use std::io::{self, Read, Write}; - use std::os::unix::io::{AsRawFd, FromRawFd, RawFd}; + use std::os::unix::io::FromRawFd; /// Waker backed by a unix pipe. /// /// Waker controls both the sending and receiving ends and empties the pipe /// if writing to it (waking) fails. #[derive(Debug)] - pub struct WakerInternal { + pub struct Waker { sender: File, receiver: File, } - impl WakerInternal { - pub fn new() -> io::Result { - let [receiver, sender] = pipe::new_raw()?; - let sender = unsafe { File::from_raw_fd(sender) }; - let receiver = unsafe { File::from_raw_fd(receiver) }; - Ok(WakerInternal { sender, receiver }) + impl Waker { + pub fn new(selector: &Selector, token: Token) -> io::Result { + let mut fds = [-1; 2]; + syscall!(pipe2(fds.as_mut_ptr(), libc::O_NONBLOCK | libc::O_CLOEXEC))?; + let sender = unsafe { File::from_raw_fd(fds[1]) }; + let receiver = unsafe { File::from_raw_fd(fds[0]) }; + + selector.register(fds[0], token, Interest::READABLE)?; + Ok(Waker { sender, receiver }) } pub fn wake(&self) -> io::Result<()> { @@ -253,11 +161,6 @@ } } - #[cfg(any(mio_unsupported_force_poll_poll, target_os = "vita"))] - pub fn ack_and_reset(&self) { - self.empty(); - } - /// Empty the pipe's buffer, only need to call this if `wake` fails. /// This ignores any errors. fn empty(&self) { @@ -270,56 +173,13 @@ } } } - - impl AsRawFd for WakerInternal { - fn as_raw_fd(&self) -> RawFd { - self.receiver.as_raw_fd() - } - } } #[cfg(any( - all( - mio_unsupported_force_poll_poll, - any( - mio_unsupported_force_waker_pipe, - target_os = "aix", - target_os = "dragonfly", - target_os = "illumos", - target_os = "netbsd", - target_os = "openbsd", - target_os = "redox", - ) - ), - target_os = "vita", + target_os = "dragonfly", + target_os = "illumos", + target_os = "netbsd", + target_os = "openbsd", + target_os = "redox", ))] -pub(crate) use self::pipe::WakerInternal; - -#[cfg(any(mio_unsupported_force_poll_poll, target_os = "vita"))] -mod poll { - use crate::sys::Selector; - use crate::Token; - use std::io; - - #[derive(Debug)] - pub struct Waker { - selector: Selector, - token: Token, - } - - impl Waker { - pub fn new(selector: &Selector, token: Token) -> io::Result { - Ok(Waker { - selector: selector.try_clone()?, - token, - }) - } - - pub fn wake(&self) -> io::Result<()> { - self.selector.wake(self.token) - } - } -} - -#[cfg(any(mio_unsupported_force_poll_poll, target_os = "vita"))] -pub use self::poll::Waker; +pub use self::pipe::Waker; diff -Nru temporalio-1.3.0/vendor/mio/src/sys/windows/selector.rs temporalio-1.3.0/vendor/mio/src/sys/windows/selector.rs --- temporalio-1.3.0/vendor/mio/src/sys/windows/selector.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/mio/src/sys/windows/selector.rs 2023-10-30 19:40:00.000000000 +0000 @@ -328,6 +328,8 @@ #[cfg(debug_assertions)] id: usize, pub(super) inner: Arc, + #[cfg(debug_assertions)] + has_waker: AtomicBool, } impl Selector { @@ -339,6 +341,8 @@ #[cfg(debug_assertions)] id, inner: Arc::new(inner), + #[cfg(debug_assertions)] + has_waker: AtomicBool::new(false), } }) } @@ -348,6 +352,8 @@ #[cfg(debug_assertions)] id: self.id, inner: Arc::clone(&self.inner), + #[cfg(debug_assertions)] + has_waker: AtomicBool::new(self.has_waker.load(Ordering::Acquire)), }) } @@ -359,6 +365,11 @@ self.inner.select(events, timeout) } + #[cfg(debug_assertions)] + pub fn register_waker(&self) -> bool { + self.has_waker.swap(true, Ordering::AcqRel) + } + pub(super) fn clone_port(&self) -> Arc { self.inner.cp.clone() } diff -Nru temporalio-1.3.0/vendor/nix/.cargo-checksum.json temporalio-1.3.0/vendor/nix/.cargo-checksum.json --- temporalio-1.3.0/vendor/nix/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/nix/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"CHANGELOG.md":"83e6a1be6fd80a5b6a2bf99dcc19e96741ac18192cf857550e85cd0bec954796","Cargo.toml":"68cf729f84ed289740a62455ead120c947a33d7c33156ee2f64a06d2522eb103","LICENSE":"66e3ee1fa7f909ad3c612d556f2a0cdabcd809ad6e66f3b0605015ac64841b70","README.md":"1ed9a0e26ae6e575b3262ae734dd02889455593b761ee62403ea5a64104f3c9c","src/dir.rs":"fa8d1de7e82409a40a70901294bb7875ea2b1f8054af2eb90b066650a67f4d0e","src/env.rs":"028bc5e20139ebba418a655a2978a53335dc7680bf1de43d2c8333dd72cfa5c4","src/errno.rs":"e55d075858e349d9afea9ce0480f7fb7ba4dccccf0694fd7b3280b918836203c","src/fcntl.rs":"243eb14eb31c692f872c7f8cde5d82f654b072384400bda9bd783e13a3820021","src/features.rs":"5b4a0831e5f4b79a6f0e42ed052fd66c875da18959750be51e41fb59ac19feed","src/ifaddrs.rs":"377865eb48040d28c392a1aec0221320108e3392ea285d23405ae2cfa5c54b20","src/kmod.rs":"c818ced08d55ae36fdf82fa914ba856b688e37234d574d3faa37128211d512fb","src/lib.rs":"f7fb6b983728b622ede62de2d2bc7f351adfee3991027203a5883e3b658929f0","src/macros.rs":"e23d7d8be22ef0bf9febaaf2739585453103607c0139bd3995a324e4a16d011e","src/mount/bsd.rs":"a0be56c5b0b75cad2367cb358030383a3a682abf7653b516485cb8542734518d","src/mount/linux.rs":"6e5d61788dedf1ca4416c6c6a3a9c6c747f9352c26d863f4a1d4142e288584d6","src/mount/mod.rs":"ba9f60eb831224ab73bdd87e00e15d13b9ce9efb70b18bf8f3fe60406d522b3e","src/mqueue.rs":"ed0a189036b2437b5f7f7f1312fa545540b06ca72171b451d8bce42cc3627534","src/net/if_.rs":"b32a8a1f952de60d95e549779a5c673fd72aa665e86bfdfc8ec6badf3016b9b1","src/net/mod.rs":"577f70170e53d4a6de1abb70bf8f1031ec3e65c0e63ef5fcf05c907125e7ac17","src/poll.rs":"2fc1d144fb40db51811c6357b520ab7993529702d8f0d8060c903118ff4f7259","src/pty.rs":"27b4f76c23acf02542674017067fee74cdcac907338458700a1aa4d6f6a62e27","src/sched.rs":"403aa5ebed81910263d42a94717612b737550bf053227b7d90f1c8949188d919","src/sys/aio.rs":"ae091de8540c97da374a39e7d154c1b3ce50f41e6fc20a45c6b06eb838e74366","src/sys/epoll.rs":"28e22debf474d1b047e8044a00b354c25dab2fa125960f9f2f14cc34289fd5c9","src/sys/event.rs":"5961981ae5f66a6cf860ba456d0bfe541ab7437f9a909158b1b7a307e940b727","src/sys/eventfd.rs":"c8db8f5874726fdad289ad5e2603a7d71a1ae5a899dcde3a35d3edff8b498b7e","src/sys/inotify.rs":"5b4da774313afa9c28c3f92f9d07dce9bf4c8d044fd6a16f19480e79a19e808b","src/sys/ioctl/bsd.rs":"bbd02e30b0a78c1cb22777d9b00cfcbba9c68505cffc06118ac68474cf6fea39","src/sys/ioctl/linux.rs":"028181834d119b834bf399f2b8a6176cc57e75144693f28f32059d087d8c8018","src/sys/ioctl/mod.rs":"80e683efac7d1e2bd88680f028370f7c778e6a5097cae7845566bc8f43f4ff4f","src/sys/memfd.rs":"f58d7fbe67c4b994832d72f5fbd59c136c8f1ae88ea8b0bc1c099db2d847ee6c","src/sys/mman.rs":"17df1bc34ba92bdd6bad1e11e4ef139998117f6c468c8f560421858f3cc899a5","src/sys/mod.rs":"baabf649f758ad4acce849ec1795dd4e4f9c6539e677bad5fa777300a4871dcb","src/sys/personality.rs":"8fbd8b522b8be4591a4cf25cba023884d3ad39b26666708d43eb79b81bf1c203","src/sys/pthread.rs":"258cdf7ff0b61a4afa6d228109e4cb4fb88d859bb8dfe6c959d95130fb010906","src/sys/ptrace/bsd.rs":"4c590d8f023ff52f396f8b6f2150c08e5c9486d3088d9c173db33a70d616b800","src/sys/ptrace/linux.rs":"c82db3fb18aa97755f9ccb440a957cd46d664968a94045830c5d74d2d53bc19f","src/sys/ptrace/mod.rs":"3b5e4cc9cf447e989f40c73cb1951a4705322852009023c5a3d7e39ec1e9c39b","src/sys/quota.rs":"02e698a25f0986fb43aa88689f3d3d8b9edc6ae48496ad02f7214fccaa493e00","src/sys/reboot.rs":"eacdf57694a6629fb05787e16450446102a62818274495f2ad4e445807d09221","src/sys/resource.rs":"d498d0c00fd30e35e1269a8902cb812014d813f63ec95364f8f59f1912ba5657","src/sys/select.rs":"65c39b129d3cc85b8ca026ff26dcf80c5639824f43715881c3c1bbb6bf0c8a60","src/sys/sendfile.rs":"7a62099f9771fecff49b9c11210341e3c1a4acf22f8dfb96d395e29421648676","src/sys/signal.rs":"c3e13a2edea54d190a4b051f62efc97953c00b5051a9fda0e39e3bc732a31939","src/sys/signalfd.rs":"583524434fd37143be3db37fa6f6cbd339f7946416f05b58a95e246947e5cc9d","src/sys/socket/addr.rs":"569b9f532211963851470ad31ccb3b4ce7a53ba7e509bfce02f62df41ada8863","src/sys/socket/mod.rs":"bd8e3f84041e8dda0f57ca949b93bdb953d37496e0b5ed0820cf39bd7a059376","src/sys/socket/sockopt.rs":"7770027dc55f64b9ff08e5113886bf09e7eb35ec655d8ebe3e0727a7453020de","src/sys/stat.rs":"337dea8d55d6177dc85b3235b40b8a3e81af7f4a6e2806a0b2f730bec5424350","src/sys/statfs.rs":"17103659a85279bac046c69cb3b22bf2c11c2492cffb0edfa4c3b233d161a2f2","src/sys/statvfs.rs":"f81e3900ef90d62e7eceaf1b6ff8dcfd965466714c033eb4717687f692171f48","src/sys/sysinfo.rs":"b4519b1ca091c9dbe94d2a6fd6304944bf3df5626973d2c6884022559706f0d9","src/sys/termios.rs":"7923f9846a8122096b6b1cd240d3618b876ce500a751ac434954d172e2e85745","src/sys/time.rs":"9026033b60a5ccc95b70424aef043c8c748722e2ea8c7c86366ecd4585b651a0","src/sys/timer.rs":"8c10f0e7cfac857ad00460be30bc68b957909cc9296e70718d3b5d4a0babafde","src/sys/timerfd.rs":"ef7c48aefdcfac13316eeddbef5da04cf12e9f574b8d9f43402c02b6b8db86b3","src/sys/uio.rs":"8958600c3137ef1ca4ad24ebe5542e15375fa5d3759373b5b865147b16d611a4","src/sys/utsname.rs":"0cdda0cc111caaa0e4ebe2d4588bdc825d878e5bcb7a9136073b15f87a20e11f","src/sys/wait.rs":"cc70d2d9b880ff6c48577a479c209af6127067bc013a90ee22538e4dfad7d2b4","src/time.rs":"d4e0872361a57810837f5bd790cbca3a2b9db1ac4694a3c52d1564ad3532d3be","src/ucontext.rs":"b8f2e04757a9c2bc38c3b1e259d3a013da8a730fe9bfbe5487637395681b43d3","src/unistd.rs":"e19be456124731c5b93aef92ed72a7c4c9092e28db0649814ba3fcc1f0d620fa","test/common/mod.rs":"1d7e28e3635754664cd056f3a1079232ff5c118df619e1d0551a9972eb0b3cd6","test/sys/mod.rs":"87b2891d83067ff21f72b8ff7fde3019dc45b6877282ac278b6da151de45c7a7","test/sys/test_aio.rs":"28396c1774ac17e59bf72d2dbc2407ab11eb2e98ce0c0de12659579c1f7cd4b2","test/sys/test_aio_drop.rs":"614070155fa16a979b7341d001639c5ce24a1d6f632c3abce45a5a6d49c4039b","test/sys/test_epoll.rs":"ffe95e36c79e37426ef8e8ca3b137b7f35ea0333ce666a20a4b7878db17680e9","test/sys/test_inotify.rs":"a141b9a995892547b51ceeb6761a70a6b86d37e8f38d13ea2c497b81b4b0f49f","test/sys/test_ioctl.rs":"00ccc5afb665e533a0a4b6d6a6be438bcaea19fce335390feef4e91d17b3036c","test/sys/test_mman.rs":"2b4161964c9204b74659028b0f89a88f4e3bcc9886137a3039737cd91d2698cb","test/sys/test_pthread.rs":"ace36a2f5587f1874854281b4fd84e4e4d892a1e3c5cc38ced57975739522ad6","test/sys/test_ptrace.rs":"0385eebc8b1b8c72f655b745769decd9143ad83018198375982da0896310456b","test/sys/test_select.rs":"54cea1c34ad28d5770a613c1c3cbc3b1064b22037ec2b9d3fcd422d3be9e60a7","test/sys/test_signal.rs":"acc9941227bd3e2afad323613c2b8c83902ed0486d3745fd72704f395924f1e4","test/sys/test_signalfd.rs":"0e1060143e2612c490bc3d0168d0bbb042ef55e3f1d91d2578b9e42e4310a14d","test/sys/test_socket.rs":"727b7658e4bed13d3e41653b33eeb1c0d848d4ddc9ceddb35a59fd86d88d9ac7","test/sys/test_sockopt.rs":"4465f22f718442f3f7b502e052dad02b93cebfa3b71fa55ff4f25fb02534acab","test/sys/test_stat.rs":"6630a28217fd708bb84cd4f7e7101836b74f2420f9888923fdab664ccc331c1d","test/sys/test_sysinfo.rs":"ffd49bc96375914a2c4a4a59730cae8072f85771e2c4a80d3403df38d967e272","test/sys/test_termios.rs":"e5bcef10c84bd7583d600d5601835bcb3cfc88781cb283ab0185bbef5faf4327","test/sys/test_timerfd.rs":"cfed3abf58118611d08f6985251a7739cff67108e11214222a1d2394a3a026ce","test/sys/test_uio.rs":"32656bd0a5699e4d019aa928edf104637937179782914a82d50d37226e84c421","test/sys/test_wait.rs":"6fd59fffeeb09ff620c359baefd062ba777598982b6cb001ccc07b6bc7605493","test/test.rs":"11f40b0718ddd1a150cb9e703d56d0b2a9462306505a2245ddf273a2011f48b5","test/test_clearenv.rs":"45ca548035b3c20ec87314715feaba2be973709a635d85b8cde46fd1d9f1ecd4","test/test_dir.rs":"ae3c11c58cb06da6557aa2a839c6653c54cd7724283fffe9df5a5d3feabdd89a","test/test_fcntl.rs":"6958f71f013937dde7ea24ac87e2ad39fa318fb094f143e18b6a47356f65558c","test/test_kmod/hello_mod/Makefile":"0219f7bce0603f97d997fb377ca071966c90333ecc665e78a54dfeb97a9c811b","test/test_kmod/hello_mod/hello.c":"bcac6b19c5bd807e1f3878c15e426acc85785a8ade9840c3bb4d068635c9188c","test/test_kmod/mod.rs":"b4ae25841c2f06f32de9f1acd8230eeccd7095721302ebe78ad454e4e4f9c783","test/test_mount.rs":"6dd242b6e23c9c39e1a75612bbea62573898818ab374c3c032c2cdb97033554d","test/test_mq.rs":"136071f24131aac0e65d5f29ac18e3806641dfae1164813f5570c0e3a6f70553","test/test_net.rs":"f2912327ebb2a3d37e6cff02a5ac3106cf889cc5c74404db4ef0034059ba26f1","test/test_nix_path.rs":"01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b","test/test_nmount.rs":"d6c112547bb80968170b5497cda4b6cbf69dabec6f51d494bd52298995ceff18","test/test_poll.rs":"3e0b8f0397ba080785c61a3bfc3d637bc87f324bc4e52b5f1bf3ca0d32dbc9fe","test/test_pty.rs":"b26238a0783746cb31880e11eebc1913149be999ce75fbc2d6677bdd1e2731b2","test/test_ptymaster_drop.rs":"ae63c815f5028ddc67d194e86559483018ab1816316bdb917f40cee9364fd8a5","test/test_resource.rs":"40aef790ab745cec31a4b333d2ca406b462aa9bdf4a6d3756371e498b8d51e9a","test/test_sched.rs":"c4579bd376fab8816e63b07fa9ace31dc08e63ebb7c855a2c450698090d1d1e8","test/test_sendfile.rs":"f1042dd5d59e869ea10a1ac7b80ed7f11f8a716e7992fad40e63ed114438e0d8","test/test_stat.rs":"c407ca47a5258750076d041afad2f6add4c3563be36628bde1c5b314f5d0765d","test/test_time.rs":"f7a21b1e279e60e84909d5dadda97ded66d3326b131fe317badf9af0a1b50335","test/test_timer.rs":"3ae20d364f075d2811f3ff94eda9886682cc21d8807656007d2464fe36d1e361","test/test_unistd.rs":"20a00be4fbe26302ea5fe50ce25b99265dc763db138663d6aa1d7ac729a1d292"},"package":"598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b"} \ No newline at end of file +{"files":{"CHANGELOG.md":"8ee4e556e53d1b39400a48675d3ecff0bf27e419accab7ca3be76ab934289548","Cargo.toml":"2e6eff9170182f107188b8bc9802efd044ef47178afc7f138950ecff1c1ceb96","LICENSE":"66e3ee1fa7f909ad3c612d556f2a0cdabcd809ad6e66f3b0605015ac64841b70","README.md":"1ed9a0e26ae6e575b3262ae734dd02889455593b761ee62403ea5a64104f3c9c","src/dir.rs":"0280a2dc480bd913f24ed84fbe26569fa2e8eefa660e5ad7c21e05fc34c14d16","src/env.rs":"028bc5e20139ebba418a655a2978a53335dc7680bf1de43d2c8333dd72cfa5c4","src/errno.rs":"e55d075858e349d9afea9ce0480f7fb7ba4dccccf0694fd7b3280b918836203c","src/fcntl.rs":"ea8f43d8fec0b6c3b7d903333e4c1ce85611684a4afd561c55cfe4b61a979e94","src/features.rs":"5b4a0831e5f4b79a6f0e42ed052fd66c875da18959750be51e41fb59ac19feed","src/ifaddrs.rs":"377865eb48040d28c392a1aec0221320108e3392ea285d23405ae2cfa5c54b20","src/kmod.rs":"c818ced08d55ae36fdf82fa914ba856b688e37234d574d3faa37128211d512fb","src/lib.rs":"a62fac2ba7111157c5b64251f67f8a189f04bd587d5c80703454a596ea7ae5d9","src/macros.rs":"e23d7d8be22ef0bf9febaaf2739585453103607c0139bd3995a324e4a16d011e","src/mount/bsd.rs":"4cf35606a63d7ca41caac3b38f01e2b70c63e71978c0529f19fc79182629dbe0","src/mount/linux.rs":"6e5d61788dedf1ca4416c6c6a3a9c6c747f9352c26d863f4a1d4142e288584d6","src/mount/mod.rs":"ba9f60eb831224ab73bdd87e00e15d13b9ce9efb70b18bf8f3fe60406d522b3e","src/mqueue.rs":"ed0a189036b2437b5f7f7f1312fa545540b06ca72171b451d8bce42cc3627534","src/net/if_.rs":"b32a8a1f952de60d95e549779a5c673fd72aa665e86bfdfc8ec6badf3016b9b1","src/net/mod.rs":"577f70170e53d4a6de1abb70bf8f1031ec3e65c0e63ef5fcf05c907125e7ac17","src/poll.rs":"2fc1d144fb40db51811c6357b520ab7993529702d8f0d8060c903118ff4f7259","src/pty.rs":"27b4f76c23acf02542674017067fee74cdcac907338458700a1aa4d6f6a62e27","src/sched.rs":"403aa5ebed81910263d42a94717612b737550bf053227b7d90f1c8949188d919","src/sys/aio.rs":"ae091de8540c97da374a39e7d154c1b3ce50f41e6fc20a45c6b06eb838e74366","src/sys/epoll.rs":"28e22debf474d1b047e8044a00b354c25dab2fa125960f9f2f14cc34289fd5c9","src/sys/event.rs":"dbd8e84bccb813839295b0a336485783ef19548d2317931f0ceb5ee62f839a40","src/sys/eventfd.rs":"c8db8f5874726fdad289ad5e2603a7d71a1ae5a899dcde3a35d3edff8b498b7e","src/sys/inotify.rs":"5b4da774313afa9c28c3f92f9d07dce9bf4c8d044fd6a16f19480e79a19e808b","src/sys/ioctl/bsd.rs":"bbd02e30b0a78c1cb22777d9b00cfcbba9c68505cffc06118ac68474cf6fea39","src/sys/ioctl/linux.rs":"028181834d119b834bf399f2b8a6176cc57e75144693f28f32059d087d8c8018","src/sys/ioctl/mod.rs":"89b20579476b2e0254e0ecb1b41830cccd7027a22cbdb816a9d4ec3924842ac1","src/sys/memfd.rs":"f58d7fbe67c4b994832d72f5fbd59c136c8f1ae88ea8b0bc1c099db2d847ee6c","src/sys/mman.rs":"17df1bc34ba92bdd6bad1e11e4ef139998117f6c468c8f560421858f3cc899a5","src/sys/mod.rs":"baabf649f758ad4acce849ec1795dd4e4f9c6539e677bad5fa777300a4871dcb","src/sys/personality.rs":"aa89760c023bfec3fca5d8636f9eac9d337f5547933793ce6df7a0de97ae6ee1","src/sys/pthread.rs":"258cdf7ff0b61a4afa6d228109e4cb4fb88d859bb8dfe6c959d95130fb010906","src/sys/ptrace/bsd.rs":"4c590d8f023ff52f396f8b6f2150c08e5c9486d3088d9c173db33a70d616b800","src/sys/ptrace/linux.rs":"c82db3fb18aa97755f9ccb440a957cd46d664968a94045830c5d74d2d53bc19f","src/sys/ptrace/mod.rs":"e9e5d970097f5eafffba900959d4fdbf233bff9ed7f599fc9896bb44d86a57a4","src/sys/quota.rs":"02e698a25f0986fb43aa88689f3d3d8b9edc6ae48496ad02f7214fccaa493e00","src/sys/reboot.rs":"eacdf57694a6629fb05787e16450446102a62818274495f2ad4e445807d09221","src/sys/resource.rs":"d498d0c00fd30e35e1269a8902cb812014d813f63ec95364f8f59f1912ba5657","src/sys/select.rs":"65c39b129d3cc85b8ca026ff26dcf80c5639824f43715881c3c1bbb6bf0c8a60","src/sys/sendfile.rs":"7a62099f9771fecff49b9c11210341e3c1a4acf22f8dfb96d395e29421648676","src/sys/signal.rs":"c3e13a2edea54d190a4b051f62efc97953c00b5051a9fda0e39e3bc732a31939","src/sys/signalfd.rs":"583524434fd37143be3db37fa6f6cbd339f7946416f05b58a95e246947e5cc9d","src/sys/socket/addr.rs":"84df895052f59ec84774b189ffb285d2a37a9703af6c8310ae5040cca1a2583e","src/sys/socket/mod.rs":"6deb55438cad3606385303f036b0efd842dfd759fba93611911f5a4f2613c9dc","src/sys/socket/sockopt.rs":"ed1f920364bfe88bbe6eaeeefb27a63bfcdd7d67604aca2f03e22f2b502df55a","src/sys/stat.rs":"337dea8d55d6177dc85b3235b40b8a3e81af7f4a6e2806a0b2f730bec5424350","src/sys/statfs.rs":"17103659a85279bac046c69cb3b22bf2c11c2492cffb0edfa4c3b233d161a2f2","src/sys/statvfs.rs":"f81e3900ef90d62e7eceaf1b6ff8dcfd965466714c033eb4717687f692171f48","src/sys/sysinfo.rs":"b4519b1ca091c9dbe94d2a6fd6304944bf3df5626973d2c6884022559706f0d9","src/sys/termios.rs":"7923f9846a8122096b6b1cd240d3618b876ce500a751ac434954d172e2e85745","src/sys/time.rs":"9026033b60a5ccc95b70424aef043c8c748722e2ea8c7c86366ecd4585b651a0","src/sys/timer.rs":"8c10f0e7cfac857ad00460be30bc68b957909cc9296e70718d3b5d4a0babafde","src/sys/timerfd.rs":"ef7c48aefdcfac13316eeddbef5da04cf12e9f574b8d9f43402c02b6b8db86b3","src/sys/uio.rs":"e1d59ccbee9d46c65d3aa8c36aa3a3222539beea0d20163a8b707d08fca14e09","src/sys/utsname.rs":"0cdda0cc111caaa0e4ebe2d4588bdc825d878e5bcb7a9136073b15f87a20e11f","src/sys/wait.rs":"cc70d2d9b880ff6c48577a479c209af6127067bc013a90ee22538e4dfad7d2b4","src/time.rs":"d4e0872361a57810837f5bd790cbca3a2b9db1ac4694a3c52d1564ad3532d3be","src/ucontext.rs":"b8f2e04757a9c2bc38c3b1e259d3a013da8a730fe9bfbe5487637395681b43d3","src/unistd.rs":"e19be456124731c5b93aef92ed72a7c4c9092e28db0649814ba3fcc1f0d620fa","test/common/mod.rs":"1d7e28e3635754664cd056f3a1079232ff5c118df619e1d0551a9972eb0b3cd6","test/sys/mod.rs":"87b2891d83067ff21f72b8ff7fde3019dc45b6877282ac278b6da151de45c7a7","test/sys/test_aio.rs":"4dac9f716f852f1f438f78d6e64bf041e6fd316bf15dcb27afffaf0894bdefa6","test/sys/test_aio_drop.rs":"614070155fa16a979b7341d001639c5ce24a1d6f632c3abce45a5a6d49c4039b","test/sys/test_epoll.rs":"ffe95e36c79e37426ef8e8ca3b137b7f35ea0333ce666a20a4b7878db17680e9","test/sys/test_inotify.rs":"a141b9a995892547b51ceeb6761a70a6b86d37e8f38d13ea2c497b81b4b0f49f","test/sys/test_ioctl.rs":"00ccc5afb665e533a0a4b6d6a6be438bcaea19fce335390feef4e91d17b3036c","test/sys/test_mman.rs":"2b4161964c9204b74659028b0f89a88f4e3bcc9886137a3039737cd91d2698cb","test/sys/test_pthread.rs":"ace36a2f5587f1874854281b4fd84e4e4d892a1e3c5cc38ced57975739522ad6","test/sys/test_ptrace.rs":"0385eebc8b1b8c72f655b745769decd9143ad83018198375982da0896310456b","test/sys/test_select.rs":"54cea1c34ad28d5770a613c1c3cbc3b1064b22037ec2b9d3fcd422d3be9e60a7","test/sys/test_signal.rs":"acc9941227bd3e2afad323613c2b8c83902ed0486d3745fd72704f395924f1e4","test/sys/test_signalfd.rs":"0e1060143e2612c490bc3d0168d0bbb042ef55e3f1d91d2578b9e42e4310a14d","test/sys/test_socket.rs":"d2df1001f9a0b2dac0b88051a67c3868bb216e72e4da4eecd11c4448b9fa4b40","test/sys/test_sockopt.rs":"4465f22f718442f3f7b502e052dad02b93cebfa3b71fa55ff4f25fb02534acab","test/sys/test_stat.rs":"6630a28217fd708bb84cd4f7e7101836b74f2420f9888923fdab664ccc331c1d","test/sys/test_sysinfo.rs":"ffd49bc96375914a2c4a4a59730cae8072f85771e2c4a80d3403df38d967e272","test/sys/test_termios.rs":"e5bcef10c84bd7583d600d5601835bcb3cfc88781cb283ab0185bbef5faf4327","test/sys/test_timerfd.rs":"cfed3abf58118611d08f6985251a7739cff67108e11214222a1d2394a3a026ce","test/sys/test_uio.rs":"32656bd0a5699e4d019aa928edf104637937179782914a82d50d37226e84c421","test/sys/test_wait.rs":"6fd59fffeeb09ff620c359baefd062ba777598982b6cb001ccc07b6bc7605493","test/test.rs":"11f40b0718ddd1a150cb9e703d56d0b2a9462306505a2245ddf273a2011f48b5","test/test_clearenv.rs":"45ca548035b3c20ec87314715feaba2be973709a635d85b8cde46fd1d9f1ecd4","test/test_dir.rs":"ae3c11c58cb06da6557aa2a839c6653c54cd7724283fffe9df5a5d3feabdd89a","test/test_fcntl.rs":"71dcb87f7b04d78fc62937ba46cb7f0f1f2dbb330b63a996ea2e8ec9056b98a9","test/test_kmod/hello_mod/Makefile":"0219f7bce0603f97d997fb377ca071966c90333ecc665e78a54dfeb97a9c811b","test/test_kmod/hello_mod/hello.c":"bcac6b19c5bd807e1f3878c15e426acc85785a8ade9840c3bb4d068635c9188c","test/test_kmod/mod.rs":"b4ae25841c2f06f32de9f1acd8230eeccd7095721302ebe78ad454e4e4f9c783","test/test_mount.rs":"6dd242b6e23c9c39e1a75612bbea62573898818ab374c3c032c2cdb97033554d","test/test_mq.rs":"136071f24131aac0e65d5f29ac18e3806641dfae1164813f5570c0e3a6f70553","test/test_net.rs":"f2912327ebb2a3d37e6cff02a5ac3106cf889cc5c74404db4ef0034059ba26f1","test/test_nix_path.rs":"01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b","test/test_nmount.rs":"d6c112547bb80968170b5497cda4b6cbf69dabec6f51d494bd52298995ceff18","test/test_poll.rs":"3e0b8f0397ba080785c61a3bfc3d637bc87f324bc4e52b5f1bf3ca0d32dbc9fe","test/test_pty.rs":"b26238a0783746cb31880e11eebc1913149be999ce75fbc2d6677bdd1e2731b2","test/test_ptymaster_drop.rs":"ae63c815f5028ddc67d194e86559483018ab1816316bdb917f40cee9364fd8a5","test/test_resource.rs":"40aef790ab745cec31a4b333d2ca406b462aa9bdf4a6d3756371e498b8d51e9a","test/test_sched.rs":"c4579bd376fab8816e63b07fa9ace31dc08e63ebb7c855a2c450698090d1d1e8","test/test_sendfile.rs":"bb41b4f3621b518e397d3a5b5ad3c5dcef3fe506afe516eab7572fbab92b77e3","test/test_stat.rs":"c407ca47a5258750076d041afad2f6add4c3563be36628bde1c5b314f5d0765d","test/test_time.rs":"f7a21b1e279e60e84909d5dadda97ded66d3326b131fe317badf9af0a1b50335","test/test_timer.rs":"3ae20d364f075d2811f3ff94eda9886682cc21d8807656007d2464fe36d1e361","test/test_unistd.rs":"20a00be4fbe26302ea5fe50ce25b99265dc763db138663d6aa1d7ac729a1d292"},"package":"bfdda3d196821d6af13126e40375cdf7da646a96114af134d5f417a9a1dc8e1a"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/nix/Cargo.toml temporalio-1.3.0/vendor/nix/Cargo.toml --- temporalio-1.3.0/vendor/nix/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/nix/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -13,7 +13,7 @@ edition = "2018" rust-version = "1.56" name = "nix" -version = "0.26.4" +version = "0.26.2" authors = ["The nix-rust Project Developers"] include = [ "src/**/*", @@ -82,6 +82,9 @@ version = "0.1.0" optional = true +[dependencies.static_assertions] +version = "1" + [dev-dependencies.assert-impl] version = "0.1" @@ -98,7 +101,7 @@ version = "1.0.7" [dev-dependencies.tempfile] -version = "3.3" +version = "3.3.0" [features] acct = [] diff -Nru temporalio-1.3.0/vendor/nix/CHANGELOG.md temporalio-1.3.0/vendor/nix/CHANGELOG.md --- temporalio-1.3.0/vendor/nix/CHANGELOG.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/nix/CHANGELOG.md 2023-10-30 19:40:00.000000000 +0000 @@ -3,29 +3,6 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](https://semver.org/). -## [0.26.4] - 2023-08-28 - -### Fixed - -- Fixed an unintended API change in release 0.26.3, due to the upgrade of the - bitflags dependency. - ([#2117](https://github.com/nix-rust/nix/pull/2117)) - -## [0.26.3] - 2023-08-27 - -### Fixed -- Fix: send `ETH_P_ALL` in htons format - ([#1925](https://github.com/nix-rust/nix/pull/1925)) -- Fix: `recvmsg` now sets the length of the received `sockaddr_un` field - correctly on Linux platforms. ([#2041](https://github.com/nix-rust/nix/pull/2041)) -- Fix potentially invalid conversions in - `SockaddrIn::from`, - `SockaddrIn6::from`, `IpMembershipRequest::new`, and - `Ipv6MembershipRequest::new` with future Rust versions. - ([#2061](https://github.com/nix-rust/nix/pull/2061)) -- Fixed an incorrect lifetime returned from `recvmsg`. - ([#2095](https://github.com/nix-rust/nix/pull/2095)) - ## [0.26.2] - 2023-01-18 ### Fixed - Fix `SockaddrIn6` bug that was swapping flowinfo and scope_id byte ordering. diff -Nru temporalio-1.3.0/vendor/nix/src/dir.rs temporalio-1.3.0/vendor/nix/src/dir.rs --- temporalio-1.3.0/vendor/nix/src/dir.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/nix/src/dir.rs 2023-10-30 19:40:00.000000000 +0000 @@ -101,9 +101,6 @@ } } -// The pass by mut is technically needless only because the inner NonNull is -// Copy. But philosophically we're mutating the Dir, so we pass by mut. -#[allow(clippy::needless_pass_by_ref_mut)] fn next(dir: &mut Dir) -> Option> { unsafe { // Note: POSIX specifies that portable applications should dynamically allocate a diff -Nru temporalio-1.3.0/vendor/nix/src/fcntl.rs temporalio-1.3.0/vendor/nix/src/fcntl.rs --- temporalio-1.3.0/vendor/nix/src/fcntl.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/nix/src/fcntl.rs 2023-10-30 19:40:00.000000000 +0000 @@ -638,7 +638,7 @@ } } -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux"))] #[cfg(feature = "fs")] libc_bitflags!( /// Mode argument flags for fallocate determining operation performed on a given range. @@ -678,7 +678,7 @@ /// /// Allows the caller to directly manipulate the allocated disk space for the /// file referred to by fd. -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux"))] #[cfg(feature = "fs")] pub fn fallocate( fd: RawFd, diff -Nru temporalio-1.3.0/vendor/nix/src/lib.rs temporalio-1.3.0/vendor/nix/src/lib.rs --- temporalio-1.3.0/vendor/nix/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/nix/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -54,7 +54,6 @@ #![warn(missing_docs)] #![cfg_attr(docsrs, feature(doc_cfg))] #![deny(clippy::cast_ptr_alignment)] -#![allow(clippy::bad_bit_mask)] // Re-exported external crates pub use libc; diff -Nru temporalio-1.3.0/vendor/nix/src/mount/bsd.rs temporalio-1.3.0/vendor/nix/src/mount/bsd.rs --- temporalio-1.3.0/vendor/nix/src/mount/bsd.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/nix/src/mount/bsd.rs 2023-10-30 19:40:00.000000000 +0000 @@ -391,7 +391,7 @@ }); let niov = self.iov.len() as c_uint; - let iovp = self.iov.as_mut_ptr(); + let iovp = self.iov.as_mut_ptr() as *mut libc::iovec; let res = unsafe { libc::nmount(iovp, niov, flags.bits) }; match Errno::result(res) { Ok(_) => Ok(()), diff -Nru temporalio-1.3.0/vendor/nix/src/sys/event.rs temporalio-1.3.0/vendor/nix/src/sys/event.rs --- temporalio-1.3.0/vendor/nix/src/sys/event.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/nix/src/sys/event.rs 2023-10-30 19:40:00.000000000 +0000 @@ -26,7 +26,7 @@ target_os = "openbsd" ))] type type_of_udata = *mut libc::c_void; -#[cfg(target_os = "netbsd")] +#[cfg(any(target_os = "netbsd"))] type type_of_udata = intptr_t; #[cfg(target_os = "netbsd")] @@ -87,7 +87,7 @@ target_os = "openbsd" ))] pub type type_of_event_flag = u16; -#[cfg(target_os = "netbsd")] +#[cfg(any(target_os = "netbsd"))] pub type type_of_event_flag = u32; libc_bitflags! { pub struct EventFlag: type_of_event_flag { diff -Nru temporalio-1.3.0/vendor/nix/src/sys/ioctl/mod.rs temporalio-1.3.0/vendor/nix/src/sys/ioctl/mod.rs --- temporalio-1.3.0/vendor/nix/src/sys/ioctl/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/nix/src/sys/ioctl/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -712,7 +712,7 @@ pub unsafe fn $name(fd: $crate::libc::c_int, data: &mut [$ty]) -> $crate::Result<$crate::libc::c_int> { - convert_ioctl_res!($crate::libc::ioctl(fd, request_code_read!($ioty, $nr, ::std::mem::size_of_val(data)) as $crate::sys::ioctl::ioctl_num_type, data)) + convert_ioctl_res!($crate::libc::ioctl(fd, request_code_read!($ioty, $nr, data.len() * ::std::mem::size_of::<$ty>()) as $crate::sys::ioctl::ioctl_num_type, data)) } ) } @@ -751,7 +751,7 @@ pub unsafe fn $name(fd: $crate::libc::c_int, data: &[$ty]) -> $crate::Result<$crate::libc::c_int> { - convert_ioctl_res!($crate::libc::ioctl(fd, request_code_write!($ioty, $nr, ::std::mem::size_of_val(data)) as $crate::sys::ioctl::ioctl_num_type, data)) + convert_ioctl_res!($crate::libc::ioctl(fd, request_code_write!($ioty, $nr, data.len() * ::std::mem::size_of::<$ty>()) as $crate::sys::ioctl::ioctl_num_type, data)) } ) } @@ -780,7 +780,7 @@ pub unsafe fn $name(fd: $crate::libc::c_int, data: &mut [$ty]) -> $crate::Result<$crate::libc::c_int> { - convert_ioctl_res!($crate::libc::ioctl(fd, request_code_readwrite!($ioty, $nr, ::std::mem::size_of_val(data)) as $crate::sys::ioctl::ioctl_num_type, data)) + convert_ioctl_res!($crate::libc::ioctl(fd, request_code_readwrite!($ioty, $nr, data.len() * ::std::mem::size_of::<$ty>()) as $crate::sys::ioctl::ioctl_num_type, data)) } ) } diff -Nru temporalio-1.3.0/vendor/nix/src/sys/personality.rs temporalio-1.3.0/vendor/nix/src/sys/personality.rs --- temporalio-1.3.0/vendor/nix/src/sys/personality.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/nix/src/sys/personality.rs 2023-10-30 19:40:00.000000000 +0000 @@ -80,10 +80,7 @@ /// /// Example: /// -// Disable test on aarch64 until we know why it fails. -// https://github.com/nix-rust/nix/issues/2060 -#[cfg_attr(target_arch = "aarch64", doc = " ```no_run")] -#[cfg_attr(not(target_arch = "aarch64"), doc = " ```")] +/// ``` /// # use nix::sys::personality::{self, Persona}; /// let mut pers = personality::get().unwrap(); /// assert!(!pers.contains(Persona::ADDR_NO_RANDOMIZE)); diff -Nru temporalio-1.3.0/vendor/nix/src/sys/ptrace/mod.rs temporalio-1.3.0/vendor/nix/src/sys/ptrace/mod.rs --- temporalio-1.3.0/vendor/nix/src/sys/ptrace/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/nix/src/sys/ptrace/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,4 +1,4 @@ -//! Provides helpers for making ptrace system calls +///! Provides helpers for making ptrace system calls #[cfg(any(target_os = "android", target_os = "linux"))] mod linux; diff -Nru temporalio-1.3.0/vendor/nix/src/sys/socket/addr.rs temporalio-1.3.0/vendor/nix/src/sys/socket/addr.rs --- temporalio-1.3.0/vendor/nix/src/sys/socket/addr.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/nix/src/sys/socket/addr.rs 2023-10-30 19:40:00.000000000 +0000 @@ -41,16 +41,21 @@ /// Convert a std::net::Ipv4Addr into the libc form. #[cfg(feature = "net")] pub(crate) const fn ipv4addr_to_libc(addr: net::Ipv4Addr) -> libc::in_addr { - libc::in_addr { - s_addr: u32::from_ne_bytes(addr.octets()) + static_assertions::assert_eq_size!(net::Ipv4Addr, libc::in_addr); + // Safe because both types have the same memory layout, and no fancy Drop + // impls. + unsafe { + mem::transmute(addr) } } /// Convert a std::net::Ipv6Addr into the libc form. #[cfg(feature = "net")] pub(crate) const fn ipv6addr_to_libc(addr: &net::Ipv6Addr) -> libc::in6_addr { - libc::in6_addr { - s6_addr: addr.octets() + static_assertions::assert_eq_size!(net::Ipv6Addr, libc::in6_addr); + // Safe because both are Newtype wrappers around the same libc type + unsafe { + mem::transmute(*addr) } } @@ -770,7 +775,6 @@ } impl<'a> UnixAddrKind<'a> { /// Safety: sun & sun_len must be valid - #[allow(clippy::unnecessary_cast)] // Not unnecessary on all platforms unsafe fn get(sun: &'a libc::sockaddr_un, sun_len: u8) -> Self { assert!(sun_len as usize >= offset_of!(libc::sockaddr_un, sun_path)); let path_len = @@ -807,7 +811,6 @@ impl UnixAddr { /// Create a new sockaddr_un representing a filesystem path. - #[allow(clippy::unnecessary_cast)] // Not unnecessary on all platforms pub fn new(path: &P) -> Result { path.with_nix_path(|cstr| unsafe { let mut ret = libc::sockaddr_un { @@ -855,7 +858,6 @@ /// processes to communicate with processes having a different filesystem view. #[cfg(any(target_os = "android", target_os = "linux"))] #[cfg_attr(docsrs, doc(cfg(all())))] - #[allow(clippy::unnecessary_cast)] // Not unnecessary on all platforms pub fn new_abstract(path: &[u8]) -> Result { unsafe { let mut ret = libc::sockaddr_un { @@ -1047,22 +1049,6 @@ { mem::size_of::() as libc::socklen_t } - - unsafe fn set_length(&mut self, new_length: usize) -> std::result::Result<(), SocketAddressLengthNotDynamic> { - // `new_length` is only used on some platforms, so it must be provided even when not used - #![allow(unused_variables)] - cfg_if! { - if #[cfg(any(target_os = "android", - target_os = "fuchsia", - target_os = "illumos", - target_os = "linux", - target_os = "redox", - ))] { - self.sun_len = new_length as u8; - } - }; - Ok(()) - } } impl AsRef for UnixAddr { @@ -1212,32 +1198,7 @@ { mem::size_of::() as libc::socklen_t } - - /// Set the length of this socket address - /// - /// This method may only be called on socket addresses whose lengths are dynamic, and it - /// returns an error if called on a type whose length is static. - /// - /// # Safety - /// - /// `new_length` must be a valid length for this type of address. Specifically, reads of that - /// length from `self` must be valid. - #[doc(hidden)] - unsafe fn set_length(&mut self, _new_length: usize) -> std::result::Result<(), SocketAddressLengthNotDynamic> { - Err(SocketAddressLengthNotDynamic) - } -} - -/// The error returned by [`SockaddrLike::set_length`] on an address whose length is statically -/// fixed. -#[derive(Copy, Clone, Debug)] -pub struct SocketAddressLengthNotDynamic; -impl fmt::Display for SocketAddressLengthNotDynamic { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.write_str("Attempted to set length on socket whose length is statically fixed") - } } -impl std::error::Error for SocketAddressLengthNotDynamic {} impl private::SockaddrLikePriv for () { fn as_mut_ptr(&mut self) -> *mut libc::sockaddr { @@ -1274,6 +1235,9 @@ } /// An IPv4 socket address +// This is identical to net::SocketAddrV4. But the standard library +// doesn't allow direct access to the libc fields, which we need. So we +// reimplement it here. #[cfg(feature = "net")] #[repr(transparent)] #[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)] @@ -1681,15 +1645,6 @@ None => mem::size_of_val(self) as libc::socklen_t } } - - unsafe fn set_length(&mut self, new_length: usize) -> std::result::Result<(), SocketAddressLengthNotDynamic> { - match self.as_unix_addr_mut() { - Some(addr) => { - addr.set_length(new_length) - }, - None => Err(SocketAddressLengthNotDynamic), - } - } } macro_rules! accessors { @@ -2006,7 +1961,7 @@ } } -pub(super) mod private { +mod private { pub trait SockaddrLikePriv { /// Returns a mutable raw pointer to the inner structure. /// @@ -2895,6 +2850,7 @@ &self.0 } } + } } diff -Nru temporalio-1.3.0/vendor/nix/src/sys/socket/mod.rs temporalio-1.3.0/vendor/nix/src/sys/socket/mod.rs --- temporalio-1.3.0/vendor/nix/src/sys/socket/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/nix/src/sys/socket/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -226,10 +226,10 @@ // The protocol number is fed into the socket syscall in network byte order. #[cfg(any(target_os = "android", target_os = "linux"))] #[cfg_attr(docsrs, doc(cfg(all())))] - EthAll = (libc::ETH_P_ALL as u16).to_be() as i32, + EthAll = libc::ETH_P_ALL.to_be(), } -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux"))] libc_bitflags! { /// Configuration flags for `SO_TIMESTAMPING` interface /// @@ -1535,7 +1535,7 @@ for (i, ((slice, addr), mmsghdr)) in slices.into_iter().zip(addrs.as_ref()).zip(data.items.iter_mut() ).enumerate() { - let p = &mut mmsghdr.msg_hdr; + let mut p = &mut mmsghdr.msg_hdr; p.msg_iov = slice.as_ref().as_ptr() as *mut libc::iovec; p.msg_iovlen = slice.as_ref().len() as _; @@ -1611,24 +1611,24 @@ { // we will be storing pointers to addresses inside mhdr - convert it into boxed // slice so it can'be changed later by pushing anything into self.addresses - let mut addresses = vec![std::mem::MaybeUninit::::uninit(); num_slices].into_boxed_slice(); + let mut addresses = vec![std::mem::MaybeUninit::uninit(); num_slices].into_boxed_slice(); let msg_controllen = cmsg_buffer.as_ref().map_or(0, |v| v.capacity()); // we'll need a cmsg_buffer for each slice, we preallocate a vector and split // it into "slices" parts - let mut cmsg_buffers = + let cmsg_buffers = cmsg_buffer.map(|v| vec![0u8; v.capacity() * num_slices].into_boxed_slice()); let items = addresses .iter_mut() .enumerate() .map(|(ix, address)| { - let (ptr, cap) = match &mut cmsg_buffers { - Some(v) => ((&mut v[ix * msg_controllen] as *mut u8), msg_controllen), - None => (std::ptr::null_mut(), 0), + let (ptr, cap) = match &cmsg_buffers { + Some(v) => ((&v[ix * msg_controllen] as *const u8), msg_controllen), + None => (std::ptr::null(), 0), }; - let msg_hdr = unsafe { pack_mhdr_to_receive(std::ptr::null_mut(), 0, ptr, cap, address.as_mut_ptr()) }; + let msg_hdr = unsafe { pack_mhdr_to_receive(std::ptr::null(), 0, ptr, cap, address.as_mut_ptr()) }; libc::mmsghdr { msg_hdr, msg_len: 0, @@ -1689,7 +1689,7 @@ { let mut count = 0; for (i, (slice, mmsghdr)) in slices.into_iter().zip(data.items.iter_mut()).enumerate() { - let p = &mut mmsghdr.msg_hdr; + let mut p = &mut mmsghdr.msg_hdr; p.msg_iov = slice.as_ref().as_ptr() as *mut libc::iovec; p.msg_iovlen = slice.as_ref().len() as _; count = i + 1; @@ -1916,7 +1916,7 @@ mhdr: msghdr, r: isize, msg_controllen: usize, - mut address: S, + address: S, ) -> RecvMsg<'a, 'i, S> where S: SockaddrLike { @@ -1932,11 +1932,6 @@ }.as_ref() }; - // Ignore errors if this socket address has statically-known length - // - // This is to ensure that unix socket addresses have their length set appropriately. - let _ = address.set_length(mhdr.msg_namelen as usize); - RecvMsg { bytes: r as usize, cmsghdr, @@ -1959,9 +1954,9 @@ /// /// Buffers must remain valid for the whole lifetime of msghdr unsafe fn pack_mhdr_to_receive( - iov_buffer: *mut IoSliceMut, + iov_buffer: *const IoSliceMut, iov_buffer_len: usize, - cmsg_buffer: *mut u8, + cmsg_buffer: *const u8, cmsg_capacity: usize, address: *mut S, ) -> msghdr @@ -1972,7 +1967,7 @@ // initialize it. let mut mhdr = mem::MaybeUninit::::zeroed(); let p = mhdr.as_mut_ptr(); - (*p).msg_name = address as *mut c_void; + (*p).msg_name = (*address).as_mut_ptr() as *mut c_void; (*p).msg_namelen = S::size(); (*p).msg_iov = iov_buffer as *mut iovec; (*p).msg_iovlen = iov_buffer_len as _; @@ -1997,7 +1992,7 @@ // The message header must be initialized before the individual cmsgs. let cmsg_ptr = if capacity > 0 { - cmsg_buffer.as_mut_ptr() as *mut c_void + cmsg_buffer.as_ptr() as *mut c_void } else { ptr::null_mut() }; @@ -2051,7 +2046,7 @@ /// [recvmsg(2)](https://pubs.opengroup.org/onlinepubs/9699919799/functions/recvmsg.html) pub fn recvmsg<'a, 'outer, 'inner, S>(fd: RawFd, iov: &'outer mut [IoSliceMut<'inner>], mut cmsg_buffer: Option<&'a mut Vec>, - flags: MsgFlags) -> Result> + flags: MsgFlags) -> Result> where S: SockaddrLike + 'a, 'inner: 'outer { @@ -2061,7 +2056,7 @@ .map(|v| (v.as_mut_ptr(), v.capacity())) .unwrap_or((ptr::null_mut(), 0)); let mut mhdr = unsafe { - pack_mhdr_to_receive(iov.as_mut().as_mut_ptr(), iov.len(), msg_control, msg_controllen, address.as_mut_ptr()) + pack_mhdr_to_receive(iov.as_ref().as_ptr(), iov.len(), msg_control, msg_controllen, address.as_mut_ptr()) }; let ret = unsafe { libc::recvmsg(fd, &mut mhdr, flags.bits()) }; @@ -2207,7 +2202,7 @@ unsafe { let ret = libc::recv( sockfd, - buf.as_mut_ptr() as *mut c_void, + buf.as_ptr() as *mut c_void, buf.len() as size_t, flags.bits(), ); @@ -2231,7 +2226,7 @@ let ret = Errno::result(libc::recvfrom( sockfd, - buf.as_mut_ptr() as *mut c_void, + buf.as_ptr() as *mut c_void, buf.len() as size_t, 0, addr.as_mut_ptr() as *mut libc::sockaddr, @@ -2241,7 +2236,7 @@ Ok(( ret, T::from_raw( - addr.assume_init().as_ptr(), + addr.assume_init().as_ptr() as *const libc::sockaddr, Some(len), ), )) diff -Nru temporalio-1.3.0/vendor/nix/src/sys/socket/sockopt.rs temporalio-1.3.0/vendor/nix/src/sys/socket/sockopt.rs --- temporalio-1.3.0/vendor/nix/src/sys/socket/sockopt.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/nix/src/sys/socket/sockopt.rs 2023-10-30 19:40:00.000000000 +0000 @@ -678,7 +678,7 @@ libc::IP6T_SO_ORIGINAL_DST, libc::sockaddr_in6 ); -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux"))] sockopt_impl!( /// Specifies exact type of timestamping information collected by the kernel /// [Further reading](https://www.kernel.org/doc/html/latest/networking/timestamping.html) @@ -697,7 +697,7 @@ libc::SO_TIMESTAMP, bool ); -#[cfg(target_os = "linux")] +#[cfg(all(target_os = "linux"))] sockopt_impl!( /// Enable or disable the receiving of the `SO_TIMESTAMPNS` control message. ReceiveTimestampns, diff -Nru temporalio-1.3.0/vendor/nix/src/sys/uio.rs temporalio-1.3.0/vendor/nix/src/sys/uio.rs --- temporalio-1.3.0/vendor/nix/src/sys/uio.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/nix/src/sys/uio.rs 2023-10-30 19:40:00.000000000 +0000 @@ -28,9 +28,6 @@ /// Low-level vectored read from a raw file descriptor /// /// See also [readv(2)](https://pubs.opengroup.org/onlinepubs/9699919799/functions/readv.html) -// Clippy doesn't know that we need to pass iov mutably only because the -// mutation happens after converting iov to a pointer -#[allow(clippy::needless_pass_by_ref_mut)] pub fn readv(fd: RawFd, iov: &mut [IoSliceMut<'_>]) -> Result { // SAFETY: same as in writev(), IoSliceMut is ABI-compatible with iovec let res = unsafe { @@ -74,9 +71,6 @@ /// See also: [`readv`](fn.readv.html) and [`pread`](fn.pread.html) #[cfg(not(any(target_os = "redox", target_os = "haiku")))] #[cfg_attr(docsrs, doc(cfg(all())))] -// Clippy doesn't know that we need to pass iov mutably only because the -// mutation happens after converting iov to a pointer -#[allow(clippy::needless_pass_by_ref_mut)] pub fn preadv( fd: RawFd, iov: &mut [IoSliceMut<'_>], @@ -207,7 +201,7 @@ pub fn from_mut_slice(buf: &'a mut [u8]) -> IoVec<&'a mut [u8]> { IoVec( libc::iovec { - iov_base: buf.as_mut_ptr() as *mut c_void, + iov_base: buf.as_ptr() as *mut c_void, iov_len: buf.len() as size_t, }, PhantomData, diff -Nru temporalio-1.3.0/vendor/nix/test/sys/test_aio.rs temporalio-1.3.0/vendor/nix/test/sys/test_aio.rs --- temporalio-1.3.0/vendor/nix/test/sys/test_aio.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/nix/test/sys/test_aio.rs 2023-10-30 19:40:00.000000000 +0000 @@ -200,7 +200,7 @@ assert_eq!(err, Ok(())); assert_eq!(aior.as_mut().aio_return().unwrap(), EXPECT.len()); } - assert_eq!(EXPECT, rbuf.deref()); + assert_eq!(EXPECT, rbuf.deref().deref()); } // Like ok, but allocates the structure on the stack. @@ -223,7 +223,7 @@ assert_eq!(err, Ok(())); assert_eq!(aior.as_mut().aio_return().unwrap(), EXPECT.len()); } - assert_eq!(EXPECT, rbuf.deref()); + assert_eq!(EXPECT, rbuf.deref().deref()); } } diff -Nru temporalio-1.3.0/vendor/nix/test/sys/test_socket.rs temporalio-1.3.0/vendor/nix/test/sys/test_socket.rs --- temporalio-1.3.0/vendor/nix/test/sys/test_socket.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/nix/test/sys/test_socket.rs 2023-10-30 19:40:00.000000000 +0000 @@ -68,7 +68,7 @@ assert_eq!(from_storage, sockaddr); } -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux"))] #[cfg_attr(qemu, ignore)] #[test] pub fn test_timestamping() { @@ -299,45 +299,6 @@ } #[test] -pub fn test_recvmsg_sockaddr_un() { - use nix::sys::socket::{ - self, bind, socket, AddressFamily, MsgFlags, SockFlag, SockType, - }; - - let tempdir = tempfile::tempdir().unwrap(); - let sockname = tempdir.path().join("sock"); - let sock = socket( - AddressFamily::Unix, - SockType::Datagram, - SockFlag::empty(), - None, - ) - .expect("socket failed"); - let sockaddr = UnixAddr::new(&sockname).unwrap(); - bind(sock, &sockaddr).expect("bind failed"); - - // Send a message - let send_buffer = "hello".as_bytes(); - if let Err(e) = socket::sendmsg( - sock, - &[std::io::IoSlice::new(send_buffer)], - &[], - MsgFlags::empty(), - Some(&sockaddr), - ) { - crate::skip!("Couldn't send ({:?}), so skipping test", e); - } - - // Receive the message - let mut recv_buffer = [0u8; 32]; - let mut iov = [std::io::IoSliceMut::new(&mut recv_buffer)]; - let received = - socket::recvmsg(sock, &mut iov, None, MsgFlags::empty()).unwrap(); - // Check the address in the received message - assert_eq!(sockaddr, received.address.unwrap()); -} - -#[test] pub fn test_std_conversions() { use nix::sys::socket::*; @@ -2175,50 +2136,63 @@ } #[cfg(any(target_os = "android", target_os = "linux"))] +#[cfg_attr(graviton, ignore = "Not supported by the CI environment")] #[test] pub fn test_vsock() { - use nix::sys::socket::SockaddrLike; - use nix::sys::socket::{AddressFamily, VsockAddr}; - use std::convert::TryInto; - use std::mem; + use nix::errno::Errno; + use nix::sys::socket::{ + bind, connect, listen, socket, AddressFamily, SockFlag, SockType, + VsockAddr, + }; + use nix::unistd::close; + use std::thread; let port: u32 = 3000; - let addr_local = VsockAddr::new(libc::VMADDR_CID_LOCAL, port); - assert_eq!(addr_local.cid(), libc::VMADDR_CID_LOCAL); - assert_eq!(addr_local.port(), port); - - let addr_any = VsockAddr::new(libc::VMADDR_CID_ANY, libc::VMADDR_PORT_ANY); - assert_eq!(addr_any.cid(), libc::VMADDR_CID_ANY); - assert_eq!(addr_any.port(), libc::VMADDR_PORT_ANY); + let s1 = socket( + AddressFamily::Vsock, + SockType::Stream, + SockFlag::empty(), + None, + ) + .expect("socket failed"); - assert_ne!(addr_local, addr_any); - assert_ne!(calculate_hash(&addr_local), calculate_hash(&addr_any)); + // VMADDR_CID_HYPERVISOR is reserved, so we expect an EADDRNOTAVAIL error. + let sockaddr_hv = VsockAddr::new(libc::VMADDR_CID_HYPERVISOR, port); + assert_eq!(bind(s1, &sockaddr_hv).err(), Some(Errno::EADDRNOTAVAIL)); - let addr1 = VsockAddr::new(libc::VMADDR_CID_HOST, port); - let addr2 = VsockAddr::new(libc::VMADDR_CID_HOST, port); - assert_eq!(addr1, addr2); - assert_eq!(calculate_hash(&addr1), calculate_hash(&addr2)); + let sockaddr_any = VsockAddr::new(libc::VMADDR_CID_ANY, port); + assert_eq!(bind(s1, &sockaddr_any), Ok(())); + listen(s1, 10).expect("listen failed"); + + let thr = thread::spawn(move || { + let cid: u32 = libc::VMADDR_CID_HOST; - let addr3 = unsafe { - VsockAddr::from_raw( - addr2.as_ref() as *const libc::sockaddr_vm as *const libc::sockaddr, - Some(mem::size_of::().try_into().unwrap()), + let s2 = socket( + AddressFamily::Vsock, + SockType::Stream, + SockFlag::empty(), + None, ) - } - .unwrap(); - assert_eq!( - addr3.as_ref().svm_family, - AddressFamily::Vsock as libc::sa_family_t - ); - assert_eq!(addr3.as_ref().svm_cid, addr1.cid()); - assert_eq!(addr3.as_ref().svm_port, addr1.port()); + .expect("socket failed"); + + let sockaddr_host = VsockAddr::new(cid, port); + + // The current implementation does not support loopback devices, so, + // for now, we expect a failure on the connect. + assert_ne!(connect(s2, &sockaddr_host), Ok(())); + + close(s2).unwrap(); + }); + + close(s1).unwrap(); + thr.join().unwrap(); } // Disable the test on emulated platforms because it fails in Cirrus-CI. Lack // of QEMU support is suspected. #[cfg_attr(qemu, ignore)] -#[cfg(target_os = "linux")] +#[cfg(all(target_os = "linux"))] #[test] fn test_recvmsg_timestampns() { use nix::sys::socket::*; @@ -2273,7 +2247,7 @@ // Disable the test on emulated platforms because it fails in Cirrus-CI. Lack // of QEMU support is suspected. #[cfg_attr(qemu, ignore)] -#[cfg(target_os = "linux")] +#[cfg(all(target_os = "linux"))] #[test] fn test_recvmmsg_timestampns() { use nix::sys::socket::*; diff -Nru temporalio-1.3.0/vendor/nix/test/test_fcntl.rs temporalio-1.3.0/vendor/nix/test/test_fcntl.rs --- temporalio-1.3.0/vendor/nix/test/test_fcntl.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/nix/test/test_fcntl.rs 2023-10-30 19:40:00.000000000 +0000 @@ -238,7 +238,7 @@ use nix::unistd::{close, pipe, read, write}; use tempfile::tempfile; - #[cfg(target_os = "linux")] + #[cfg(any(target_os = "linux"))] use tempfile::NamedTempFile; use crate::*; @@ -340,7 +340,7 @@ let buf1 = b"abcdef"; let buf2 = b"defghi"; - let iovecs = [IoSlice::new(&buf1[0..3]), IoSlice::new(&buf2[0..3])]; + let iovecs = vec![IoSlice::new(&buf1[0..3]), IoSlice::new(&buf2[0..3])]; let res = vmsplice(wr, &iovecs[..], SpliceFFlags::empty()).unwrap(); @@ -355,7 +355,7 @@ close(wr).unwrap(); } - #[cfg(target_os = "linux")] + #[cfg(any(target_os = "linux"))] #[test] fn test_fallocate() { let tmp = NamedTempFile::new().unwrap(); diff -Nru temporalio-1.3.0/vendor/nix/test/test_sendfile.rs temporalio-1.3.0/vendor/nix/test/test_sendfile.rs --- temporalio-1.3.0/vendor/nix/test/test_sendfile.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/nix/test/test_sendfile.rs 2023-10-30 19:40:00.000000000 +0000 @@ -63,10 +63,10 @@ fn test_sendfile_freebsd() { // Declare the content let header_strings = - ["HTTP/1.1 200 OK\n", "Content-Type: text/plain\n", "\n"]; + vec!["HTTP/1.1 200 OK\n", "Content-Type: text/plain\n", "\n"]; let body = "Xabcdef123456"; let body_offset = 1; - let trailer_strings = ["\n", "Served by Make Believe\n"]; + let trailer_strings = vec!["\n", "Served by Make Believe\n"]; // Write the body to a file let mut tmp = tempfile().unwrap(); @@ -114,10 +114,10 @@ fn test_sendfile_dragonfly() { // Declare the content let header_strings = - ["HTTP/1.1 200 OK\n", "Content-Type: text/plain\n", "\n"]; + vec!["HTTP/1.1 200 OK\n", "Content-Type: text/plain\n", "\n"]; let body = "Xabcdef123456"; let body_offset = 1; - let trailer_strings = ["\n", "Served by Make Believe\n"]; + let trailer_strings = vec!["\n", "Served by Make Believe\n"]; // Write the body to a file let mut tmp = tempfile().unwrap(); diff -Nru temporalio-1.3.0/vendor/num-traits/.cargo-checksum.json temporalio-1.3.0/vendor/num-traits/.cargo-checksum.json --- temporalio-1.3.0/vendor/num-traits/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/num-traits/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"Cargo.toml":"374f8137b42ea85e9e2510b28a1962956d81cd93deecb043c315f8522612df0f","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","README.md":"90b7360049619cd5581aa03a7c24f1ccf1373e419f35d0967170724b1ef3c1e1","RELEASES.md":"41b2b610d9185f55688c8e227c1396ca78860f61781597ccec5bbaf2219baddc","build.rs":"d1ad566e26756269ab06f8df62d4e11161efb7ebffb1b3b16c4e1e7bf4636856","src/bounds.rs":"a79325f6a92269ad7df3d11b9ff700d2d13fb1160e28f0c091a644efc4badc2b","src/cast.rs":"d652cce6e7ec4a5e5b6532df1cd65c56a63eb453bed33f5dff02b51c5abd3ca0","src/float.rs":"90b93cfd6dc9ca679b009c0d00fd0bddb03b9dbde164aaa5a4c136e091a39699","src/identities.rs":"e9f490c03a450f0fd9bf01293a922938544515f12d4447c29cf8e9aecf686d24","src/int.rs":"ada847767ef9808a2ab9703060d6001e427bc33b72c04dcd81a9776a407a5c16","src/lib.rs":"833828950fd58e567f0a4bd80264cb65e1b1594eb0ae5dc25e72af28a9f0e9e9","src/macros.rs":"ee96613a2c73a3bef10ec7ae4d359dbf5f0b41f83e8a87c3d62ccc18dd27e498","src/ops/bytes.rs":"303a648f2ebfa37e355a22495710ef1debf3715d422e2e00f52ae311255af1b7","src/ops/checked.rs":"01e6379bf1d8eeca9dcf8bb5397e419e898e4043b57b0e2470e225bc27e81e6a","src/ops/euclid.rs":"82734bc3bff9c1110aac9015129fba5bc9f24cc6bc3be9a946f71d8b0c19586f","src/ops/inv.rs":"dd80b9bd48d815f17855a25842287942317fa49d1fdcdd655b61bd20ef927cda","src/ops/mod.rs":"2b3c396af44cd240205ba8b560625fa00c07cf387139d2c49eeb7869545d976d","src/ops/mul_add.rs":"15bd64d9420c86300c5ea7f57aa736af2ef968e4e5eaaae03f62fd277f124569","src/ops/overflowing.rs":"01f4cd27f8b0e257687170cc537188029e08e5d13e0c552b01153be5d66d5716","src/ops/saturating.rs":"165993c829c10c4f60e32c8cf34434b669ef54284d7f73dc7ec58a22ba65e6fc","src/ops/wrapping.rs":"39d7bc7e074ba7590cd29b40206baed9cb30ae70dca2b7ceb460c6ca7eaad2a8","src/pow.rs":"92c12990d2396b2dabd4ba80e80ad706c0c8fd0f1b967ab3bdd9cb738b150702","src/real.rs":"d97dd6a73704828faf835c62f12ea02362997fa9de08a70cd9b7abdea7cb10ed","src/sign.rs":"7ca11eebee94b553a33a9e53b7663ba5173db297dee523d1a2600fbbc80ef850","tests/cast.rs":"6fcc0d6653253182e979e42542fe971829cd24ab2c3a21a668e935c23d39f7c0"},"package":"39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c"} \ No newline at end of file +{"files":{"Cargo.toml":"3897e5966a4ca16e590f2a08ab51ee93c4c29e09f3b396288b327fa50bf43af1","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","README.md":"90b7360049619cd5581aa03a7c24f1ccf1373e419f35d0967170724b1ef3c1e1","RELEASES.md":"bcbc7292bb53e17061245300ef70f997be06f31ebe842013f91319c38be5dcfc","build.rs":"d1ad566e26756269ab06f8df62d4e11161efb7ebffb1b3b16c4e1e7bf4636856","src/bounds.rs":"a79325f6a92269ad7df3d11b9ff700d2d13fb1160e28f0c091a644efc4badc2b","src/cast.rs":"d652cce6e7ec4a5e5b6532df1cd65c56a63eb453bed33f5dff02b51c5abd3ca0","src/float.rs":"90b93cfd6dc9ca679b009c0d00fd0bddb03b9dbde164aaa5a4c136e091a39699","src/identities.rs":"ba2d68bd45331874fa7e9e408894b99d27a594ceb2f48041b651254c54a591cf","src/int.rs":"ada847767ef9808a2ab9703060d6001e427bc33b72c04dcd81a9776a407a5c16","src/lib.rs":"833828950fd58e567f0a4bd80264cb65e1b1594eb0ae5dc25e72af28a9f0e9e9","src/macros.rs":"ee96613a2c73a3bef10ec7ae4d359dbf5f0b41f83e8a87c3d62ccc18dd27e498","src/ops/bytes.rs":"303a648f2ebfa37e355a22495710ef1debf3715d422e2e00f52ae311255af1b7","src/ops/checked.rs":"01e6379bf1d8eeca9dcf8bb5397e419e898e4043b57b0e2470e225bc27e81e6a","src/ops/euclid.rs":"82734bc3bff9c1110aac9015129fba5bc9f24cc6bc3be9a946f71d8b0c19586f","src/ops/inv.rs":"dd80b9bd48d815f17855a25842287942317fa49d1fdcdd655b61bd20ef927cda","src/ops/mod.rs":"2b3c396af44cd240205ba8b560625fa00c07cf387139d2c49eeb7869545d976d","src/ops/mul_add.rs":"15bd64d9420c86300c5ea7f57aa736af2ef968e4e5eaaae03f62fd277f124569","src/ops/overflowing.rs":"01f4cd27f8b0e257687170cc537188029e08e5d13e0c552b01153be5d66d5716","src/ops/saturating.rs":"165993c829c10c4f60e32c8cf34434b669ef54284d7f73dc7ec58a22ba65e6fc","src/ops/wrapping.rs":"39d7bc7e074ba7590cd29b40206baed9cb30ae70dca2b7ceb460c6ca7eaad2a8","src/pow.rs":"92c12990d2396b2dabd4ba80e80ad706c0c8fd0f1b967ab3bdd9cb738b150702","src/real.rs":"d97dd6a73704828faf835c62f12ea02362997fa9de08a70cd9b7abdea7cb10ed","src/sign.rs":"7ca11eebee94b553a33a9e53b7663ba5173db297dee523d1a2600fbbc80ef850","tests/cast.rs":"6fcc0d6653253182e979e42542fe971829cd24ab2c3a21a668e935c23d39f7c0"},"package":"f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/num-traits/Cargo.toml temporalio-1.3.0/vendor/num-traits/Cargo.toml --- temporalio-1.3.0/vendor/num-traits/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/num-traits/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -13,7 +13,7 @@ edition = "2018" rust-version = "1.31" name = "num-traits" -version = "0.2.17" +version = "0.2.16" authors = ["The Rust Project Developers"] build = "build.rs" exclude = [ diff -Nru temporalio-1.3.0/vendor/num-traits/RELEASES.md temporalio-1.3.0/vendor/num-traits/RELEASES.md --- temporalio-1.3.0/vendor/num-traits/RELEASES.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/num-traits/RELEASES.md 2023-10-30 19:40:00.000000000 +0000 @@ -1,11 +1,3 @@ -# Release 0.2.17 (2023-10-07) - -- [Fix a doc warning about custom classes with newer rustdoc.][286] - -**Contributors**: @robamu - -[286]: https://github.com/rust-num/num-traits/pull/286 - # Release 0.2.16 (2023-07-20) - [Upgrade to 2018 edition, **MSRV 1.31**][240] diff -Nru temporalio-1.3.0/vendor/num-traits/src/identities.rs temporalio-1.3.0/vendor/num-traits/src/identities.rs --- temporalio-1.3.0/vendor/num-traits/src/identities.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/num-traits/src/identities.rs 2023-10-30 19:40:00.000000000 +0000 @@ -5,7 +5,7 @@ /// /// # Laws /// -/// ```text +/// ```{.text} /// a + 0 = a ∀ a ∈ Self /// 0 + a = a ∀ a ∈ Self /// ``` @@ -81,7 +81,7 @@ /// /// # Laws /// -/// ```text +/// ```{.text} /// a * 1 = a ∀ a ∈ Self /// 1 * a = a ∀ a ∈ Self /// ``` diff -Nru temporalio-1.3.0/vendor/object/.cargo-checksum.json temporalio-1.3.0/vendor/object/.cargo-checksum.json --- temporalio-1.3.0/vendor/object/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/object/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"CHANGELOG.md":"867d01e5cb8d68526590eb3f1aea7dec68756d4bc11054a17949dae3ff6a33f6","Cargo.toml":"6b5aa628b5bcbe39c32e9e9cf743d678e3d06ffec89aab4951c8f7992148b374","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"0b74dfa0bcee5c420c6b7f67b4b2658f9ab8388c97b8e733975f2cecbdd668a6","README.md":"3772fdfd89e6321cc298413b8c0ba847bd125dfe64785e8faeaac05a87cbb2d3","clippy.toml":"e1e95839ba8e8bbf07f99ff49e2f151b9048c7981301a5480571842bbaf78ca2","src/archive.rs":"d6cead723242c26db2967b63385b79ed2008980a8c64b123a5eecffd7ed388fc","src/common.rs":"27a01eb0a1efcd10a988bc3922a2159e97fd133fbc07ff90faca4ff1722bd605","src/elf.rs":"79d638966c52f06262b8546d819660353fbe700a036a4454a7b961938403f3c6","src/endian.rs":"b4f63a85ccd3d5c11615baf5ba946c82046c221a1b8c74ee8c6fa4360782980c","src/lib.rs":"7f1261ebed84cd10169c1846a70dcafa7c8b25c06f32981335a9a676f45856a4","src/macho.rs":"e62808b0c84494b68e7e69b2f7fd9c0620b2ef61b6a2af3403de30284cf6b898","src/pe.rs":"8432e949a5bbf7ca28ba27f6a8ee926fe2e8632ffd88845714a6f64d6f7c0a40","src/pod.rs":"d2967732f0052e6cfa18a2dd62c57bc3b640a20eb9a6db9f39836000ceabb399","src/read/any.rs":"8ef08da67f083ee3f2758b5d64349d8032d5c63198d0c55815cd17054281a207","src/read/archive.rs":"479574cff125a74fc5512d75c1531da3bb006005fe544ffd2531a7d4f35a9bb4","src/read/coff/comdat.rs":"5204e6e44a33d1fe04ae551892d9dae2bd8ca4a0d9f1b46dd06a9e512b8ec6cc","src/read/coff/file.rs":"007c52c0a2d6f763a3c74e13f5cc15cf870a0701b87f01346ad550e52c5e5146","src/read/coff/import.rs":"1de0db515a0a6b1eee355d93a715f6d2ff152d1b815e1e859af0b0e5ded36efc","src/read/coff/mod.rs":"66bdcc772291cb53be378a66723e3c246e30df5aa4e4d4ce8e55bfeb156849a9","src/read/coff/relocation.rs":"57deb22ed0c9c31de0fe0bb483ded94459bcfd93b9f979191500d223a8517fe2","src/read/coff/section.rs":"de023dc46d4e1a37e77ab8e7080ff9fc9588633d790ae664e138d70e8fc8a39f","src/read/coff/symbol.rs":"e3b629112fe73e4627daa45093df1a1a2844ffe395d1c4de479f0f4c2bdac624","src/read/elf/attributes.rs":"1a5bc8dc081903d6b318761f50010ab08dee74b7f2d68ffbbd1aff7ed7b7c538","src/read/elf/comdat.rs":"253e00621d9a5249cfa20a2ebda76127113b42fc960235308333c9d35acdd628","src/read/elf/compression.rs":"097ff8bdc78d01a1532b11c1c0cae3b35905128c7d98b471de188d46da3ff970","src/read/elf/dynamic.rs":"8f59bd6d352f6810be6b6dc02c2f88229f15aa02a42f8fc09bcf3f284d4b1021","src/read/elf/file.rs":"860f6ed4e98e8672daef71065ea885f47d25593f6adeb7907545dadb9d398768","src/read/elf/hash.rs":"b330af7e2356512cfdf162986437c81a3b149a91e26bf82455a6976e2571a618","src/read/elf/mod.rs":"fceb322ac4e2cb182e0abd93f794622e58ae7c64e83c8703c9c888af5d93889d","src/read/elf/note.rs":"4b7e33582bff27918240d34d70f0099260dfd3122345c12ce10e6f7fcdf79e35","src/read/elf/relocation.rs":"7b95b7fbac280645f6d5900cc0158653bc8fb3adc9beeeae1b3f61eb77ada5d0","src/read/elf/section.rs":"c626a53afa196ba5b81a3d6278956f1d1ddf04ff2ac81f934425cfaef870aafd","src/read/elf/segment.rs":"ebcefba06c6f4a3e60403a1112c59f3390c39840aac011a8b040c77f8d29d655","src/read/elf/symbol.rs":"d50755b3acd34b9c77dd51f94d436265e79ed8f6f167b593e2a482543abde30b","src/read/elf/version.rs":"2c5f63e526cf26f83bdaaead4124949fc53b6198983e4681b6a3895794ad8754","src/read/macho/dyld_cache.rs":"c5247e9121a57fd411c86aea435b9c3d6d03d3cbb3fb7dfe6e75576013d71f14","src/read/macho/fat.rs":"d27a1052f2e47cd5b798a6359f33c3bfe7f7971b13259f6545118213ace7f5dd","src/read/macho/file.rs":"2531c245722202173ff762179af2c88af0108156457c848e7d756e348e72bc80","src/read/macho/load_command.rs":"d8c0ebc8f65dafa4fbb1f9a3c944fdeee96fddacfcc863650b94d9a62e8fe37a","src/read/macho/mod.rs":"23b353da3b7e076c68a067776e6a5b346a746116ac42c2c90bafd95ad54a90b3","src/read/macho/relocation.rs":"477d98b507550c29ceceba49308d14e1f086cb01a4ea9af691e995d1d29767a4","src/read/macho/section.rs":"9b21b3a02f509bb09983d116d7f0938cd61d5293e5e31907964611495b8a575e","src/read/macho/segment.rs":"0dee483eb9b6c731e69a9fe0bd9ef84b2a797a8203e5e870e15a6a2165326cc3","src/read/macho/symbol.rs":"3d3ad557c205d834ba305a9eaf3b97b2ed05f1906cd8430ad2fadabf81f14b9f","src/read/mod.rs":"b1224dc6654be52b8c2f6403503ffa662b576d05c0382146a386915d23c894dd","src/read/pe/data_directory.rs":"c08c095a4287c55bf7d7774bbade1d7610d8e82433b0de23af8c4c7ef23d75e3","src/read/pe/export.rs":"07ac5ec7b67d4a09037d8f11eb4426d96515687ee299df2a3d8cd4fd93eb2036","src/read/pe/file.rs":"507d800775adae687ca9ac7dca1a6f42463103af0731a5fe548d4745a9bee686","src/read/pe/import.rs":"ea20dfc0d462ba20e149bf9408f4ec1d0b202abf1f15536f6d091f0c0e756ac8","src/read/pe/mod.rs":"69832b7f4ccd93b59e08bafcbd0d3226c450d7801ad49ab554b38b660c8997fd","src/read/pe/relocation.rs":"0335c06b6d37df4939c8b88044313e88661ee45e5a57d2eec40143f2fe481838","src/read/pe/resource.rs":"0209eb96391bc367633b6d868505cb30947157702b0c85ef6677e5a1283d448f","src/read/pe/rich.rs":"ae9b2fc927bab2661e8d200a10128aebde37d26b50cb9069e9af9eb7bacee591","src/read/pe/section.rs":"bafde5a1584f6ce0456e32756e825c1b2b9dc0ec220ab29e668c2ff700600b87","src/read/read_cache.rs":"e9dbaa385435f5ef6ca5951c26ed1f6793ad3a8f3aee918257a5df6783d4b36d","src/read/read_ref.rs":"14966a1da9951633a7e73aedccfeadbbed4a977a8fb9d415d572250f6ebaf438","src/read/traits.rs":"8d094ba6ac06639bad448c70378d5154195d4ab36b13588b72105a869dfc053e","src/read/util.rs":"7ed8c5c88a52549734df67d2cbd3f0ea1a571728cae62152e57018f3140f9ebc","src/read/wasm.rs":"31c755ce17bba20ba287f53af7b7787bdbb5f8920333412fb11d81239102b423","src/read/xcoff/comdat.rs":"9a0a8a16682a28a54b51d28d382578e4b1e0212a34460eb93b50e8f97e4bf745","src/read/xcoff/file.rs":"17f751578d052cb8f74ee56a4e17b053b06e82e4efbe943907943bc561fb301e","src/read/xcoff/mod.rs":"d0179d3f95797464ca5919563454d1123ce8c35dfc5f40ecd6ca0d002a9824a8","src/read/xcoff/relocation.rs":"84993f477231cd1b8c79c385bc0e892640de89ddae268b845bc82c41999953b4","src/read/xcoff/section.rs":"c5ce72c214398125c7a4bc160fc5a7b27a6d92035dadcc84fd2852b73c75c123","src/read/xcoff/segment.rs":"627dabf3003aa1442bb4a2292cd68e1f572c3b95864a99e50a505b2894ffc804","src/read/xcoff/symbol.rs":"23be12b614937f8ea5de90d097fb8034f82bff798aa09636cd53a0670e39a984","src/write/coff.rs":"d26916ef57587534d2639d6d537aefff7583667b92ce3a91934913ea6c2c23a6","src/write/elf/mod.rs":"1bb945edad539b4f19dda5d46c9b86fa4ea3721eedda77ca2595b5519c3e30f2","src/write/elf/object.rs":"7cbf1dcb28e4228fa8417942f94ca1fedb1ba5fe21d1654a90c6b11e4f947d41","src/write/elf/writer.rs":"84336230a24413a41e342735c153c3421c70707ec92c2df02e7d3536e5d41b55","src/write/macho.rs":"c8b35d79f98a1db3f9bd5dcce9e46eab4f3559dc1ec14c69d3e410add55d07ae","src/write/mod.rs":"b429b9bdbe48f09bd6aeda9428657e4eb15ce8eab263e0bb5f4d9cd2f3786b26","src/write/pe.rs":"6c72185705a3e067c481f2b9f81c64a84e062e67781928e58fd1150314dad8f9","src/write/string.rs":"0033a6f5137b42988ac41dbaa2efb94a4d74d8b043c9a34c40125e8ee6912420","src/write/util.rs":"7a1083d305e9446767ce2d5f69be2c4c155495cf97e595f8fa53c4e153ccf186","src/write/xcoff.rs":"290e98f8c71baafc1f2111e1513f35a95a7f7914cc0f446bbc24547a17eb3af1","src/xcoff.rs":"fbd50fc4b61ccfdf218185ea4eafe8cf9793e8d034e7ce243fb54ecae12af5ce","tests/integration.rs":"0fa704827e4da1be38dac2e3820d92f6b20c4d415803b04f67c3516020b1de97","tests/parse_self.rs":"81b44b2dd1de9a5d8c18d9bd8926156e39fb83931837afa8ca344da0d309aeee","tests/read/coff.rs":"d3ec2079f00237640d01cb66eb24c55c85d7a775bb94f9f5c9f77e21cb7a785d","tests/read/mod.rs":"7833826f169ac3be2b4f274e5fc8cf4a51742bd0010803ff0dc20ea5643a7e61","tests/round_trip/bss.rs":"849d69b063fd757fed02219dd81e9d13b82068a2025d2cc5cfd40cf557e31bda","tests/round_trip/coff.rs":"8a25aab7164a5c8aa7a21279f8bae1f4d5f68a8d09c29a4ecd0d0c14564851cc","tests/round_trip/comdat.rs":"a8f729e218fee21e90b9f39b5cfcb4f80bc3ce26d3a297323667e6eb14f882cc","tests/round_trip/common.rs":"ced08ff559ca4d343ceef54bb4c581a3405cd96d6a1628ba43b7aab82070800b","tests/round_trip/elf.rs":"d7351d888ccad246a646ab3bea1afc3d445adeb28c5d3c8f157f7cde3717281c","tests/round_trip/macho.rs":"8cf6297f1b9e31153b15f2e409e68b561f135a233d32b601a47f5fd4dfa014cc","tests/round_trip/mod.rs":"14db36fae698b75fedc4dc832465394350049f54b01b1215022a44ebe920f7e9","tests/round_trip/section_flags.rs":"0e17639e5f86d576f039a294c274ce8db2e2a8add31a2fffc33a6e93a6d2791e","tests/round_trip/tls.rs":"23a49a1036b9173ece82a3080745930e5925e745280ab38866c9d3c29f463e63"},"package":"9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0"} \ No newline at end of file +{"files":{"CHANGELOG.md":"19f059b47fe070336813f4561b7da9be7f8dc1968daf3b1565b1a55900673469","Cargo.toml":"8075e73eb31b58aacb542434e0f21851895a335efc6cc23724411c478716c213","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"0b74dfa0bcee5c420c6b7f67b4b2658f9ab8388c97b8e733975f2cecbdd668a6","README.md":"3772fdfd89e6321cc298413b8c0ba847bd125dfe64785e8faeaac05a87cbb2d3","clippy.toml":"e1e95839ba8e8bbf07f99ff49e2f151b9048c7981301a5480571842bbaf78ca2","src/archive.rs":"d6cead723242c26db2967b63385b79ed2008980a8c64b123a5eecffd7ed388fc","src/common.rs":"27a01eb0a1efcd10a988bc3922a2159e97fd133fbc07ff90faca4ff1722bd605","src/elf.rs":"ceb4f748b65ea092cf057db45193b0b2c7f9204a1e677848aaf0463f9dd3ac6a","src/endian.rs":"b4f63a85ccd3d5c11615baf5ba946c82046c221a1b8c74ee8c6fa4360782980c","src/lib.rs":"7f1261ebed84cd10169c1846a70dcafa7c8b25c06f32981335a9a676f45856a4","src/macho.rs":"e62808b0c84494b68e7e69b2f7fd9c0620b2ef61b6a2af3403de30284cf6b898","src/pe.rs":"8432e949a5bbf7ca28ba27f6a8ee926fe2e8632ffd88845714a6f64d6f7c0a40","src/pod.rs":"d2967732f0052e6cfa18a2dd62c57bc3b640a20eb9a6db9f39836000ceabb399","src/read/any.rs":"8ef08da67f083ee3f2758b5d64349d8032d5c63198d0c55815cd17054281a207","src/read/archive.rs":"479574cff125a74fc5512d75c1531da3bb006005fe544ffd2531a7d4f35a9bb4","src/read/coff/comdat.rs":"5204e6e44a33d1fe04ae551892d9dae2bd8ca4a0d9f1b46dd06a9e512b8ec6cc","src/read/coff/file.rs":"007c52c0a2d6f763a3c74e13f5cc15cf870a0701b87f01346ad550e52c5e5146","src/read/coff/import.rs":"1de0db515a0a6b1eee355d93a715f6d2ff152d1b815e1e859af0b0e5ded36efc","src/read/coff/mod.rs":"66bdcc772291cb53be378a66723e3c246e30df5aa4e4d4ce8e55bfeb156849a9","src/read/coff/relocation.rs":"57deb22ed0c9c31de0fe0bb483ded94459bcfd93b9f979191500d223a8517fe2","src/read/coff/section.rs":"de023dc46d4e1a37e77ab8e7080ff9fc9588633d790ae664e138d70e8fc8a39f","src/read/coff/symbol.rs":"e3b629112fe73e4627daa45093df1a1a2844ffe395d1c4de479f0f4c2bdac624","src/read/elf/attributes.rs":"1a5bc8dc081903d6b318761f50010ab08dee74b7f2d68ffbbd1aff7ed7b7c538","src/read/elf/comdat.rs":"253e00621d9a5249cfa20a2ebda76127113b42fc960235308333c9d35acdd628","src/read/elf/compression.rs":"097ff8bdc78d01a1532b11c1c0cae3b35905128c7d98b471de188d46da3ff970","src/read/elf/dynamic.rs":"8f59bd6d352f6810be6b6dc02c2f88229f15aa02a42f8fc09bcf3f284d4b1021","src/read/elf/file.rs":"860f6ed4e98e8672daef71065ea885f47d25593f6adeb7907545dadb9d398768","src/read/elf/hash.rs":"b330af7e2356512cfdf162986437c81a3b149a91e26bf82455a6976e2571a618","src/read/elf/mod.rs":"fceb322ac4e2cb182e0abd93f794622e58ae7c64e83c8703c9c888af5d93889d","src/read/elf/note.rs":"4b7e33582bff27918240d34d70f0099260dfd3122345c12ce10e6f7fcdf79e35","src/read/elf/relocation.rs":"7b95b7fbac280645f6d5900cc0158653bc8fb3adc9beeeae1b3f61eb77ada5d0","src/read/elf/section.rs":"c626a53afa196ba5b81a3d6278956f1d1ddf04ff2ac81f934425cfaef870aafd","src/read/elf/segment.rs":"ebcefba06c6f4a3e60403a1112c59f3390c39840aac011a8b040c77f8d29d655","src/read/elf/symbol.rs":"d50755b3acd34b9c77dd51f94d436265e79ed8f6f167b593e2a482543abde30b","src/read/elf/version.rs":"2c5f63e526cf26f83bdaaead4124949fc53b6198983e4681b6a3895794ad8754","src/read/macho/dyld_cache.rs":"c5247e9121a57fd411c86aea435b9c3d6d03d3cbb3fb7dfe6e75576013d71f14","src/read/macho/fat.rs":"d27a1052f2e47cd5b798a6359f33c3bfe7f7971b13259f6545118213ace7f5dd","src/read/macho/file.rs":"2531c245722202173ff762179af2c88af0108156457c848e7d756e348e72bc80","src/read/macho/load_command.rs":"d8c0ebc8f65dafa4fbb1f9a3c944fdeee96fddacfcc863650b94d9a62e8fe37a","src/read/macho/mod.rs":"23b353da3b7e076c68a067776e6a5b346a746116ac42c2c90bafd95ad54a90b3","src/read/macho/relocation.rs":"477d98b507550c29ceceba49308d14e1f086cb01a4ea9af691e995d1d29767a4","src/read/macho/section.rs":"9b21b3a02f509bb09983d116d7f0938cd61d5293e5e31907964611495b8a575e","src/read/macho/segment.rs":"0dee483eb9b6c731e69a9fe0bd9ef84b2a797a8203e5e870e15a6a2165326cc3","src/read/macho/symbol.rs":"3d3ad557c205d834ba305a9eaf3b97b2ed05f1906cd8430ad2fadabf81f14b9f","src/read/mod.rs":"b1224dc6654be52b8c2f6403503ffa662b576d05c0382146a386915d23c894dd","src/read/pe/data_directory.rs":"c08c095a4287c55bf7d7774bbade1d7610d8e82433b0de23af8c4c7ef23d75e3","src/read/pe/export.rs":"07ac5ec7b67d4a09037d8f11eb4426d96515687ee299df2a3d8cd4fd93eb2036","src/read/pe/file.rs":"507d800775adae687ca9ac7dca1a6f42463103af0731a5fe548d4745a9bee686","src/read/pe/import.rs":"ea20dfc0d462ba20e149bf9408f4ec1d0b202abf1f15536f6d091f0c0e756ac8","src/read/pe/mod.rs":"69832b7f4ccd93b59e08bafcbd0d3226c450d7801ad49ab554b38b660c8997fd","src/read/pe/relocation.rs":"0335c06b6d37df4939c8b88044313e88661ee45e5a57d2eec40143f2fe481838","src/read/pe/resource.rs":"0209eb96391bc367633b6d868505cb30947157702b0c85ef6677e5a1283d448f","src/read/pe/rich.rs":"ae9b2fc927bab2661e8d200a10128aebde37d26b50cb9069e9af9eb7bacee591","src/read/pe/section.rs":"bafde5a1584f6ce0456e32756e825c1b2b9dc0ec220ab29e668c2ff700600b87","src/read/read_cache.rs":"e9dbaa385435f5ef6ca5951c26ed1f6793ad3a8f3aee918257a5df6783d4b36d","src/read/read_ref.rs":"14966a1da9951633a7e73aedccfeadbbed4a977a8fb9d415d572250f6ebaf438","src/read/traits.rs":"8d094ba6ac06639bad448c70378d5154195d4ab36b13588b72105a869dfc053e","src/read/util.rs":"7ed8c5c88a52549734df67d2cbd3f0ea1a571728cae62152e57018f3140f9ebc","src/read/wasm.rs":"31c755ce17bba20ba287f53af7b7787bdbb5f8920333412fb11d81239102b423","src/read/xcoff/comdat.rs":"9a0a8a16682a28a54b51d28d382578e4b1e0212a34460eb93b50e8f97e4bf745","src/read/xcoff/file.rs":"17f751578d052cb8f74ee56a4e17b053b06e82e4efbe943907943bc561fb301e","src/read/xcoff/mod.rs":"d0179d3f95797464ca5919563454d1123ce8c35dfc5f40ecd6ca0d002a9824a8","src/read/xcoff/relocation.rs":"84993f477231cd1b8c79c385bc0e892640de89ddae268b845bc82c41999953b4","src/read/xcoff/section.rs":"c5ce72c214398125c7a4bc160fc5a7b27a6d92035dadcc84fd2852b73c75c123","src/read/xcoff/segment.rs":"627dabf3003aa1442bb4a2292cd68e1f572c3b95864a99e50a505b2894ffc804","src/read/xcoff/symbol.rs":"23be12b614937f8ea5de90d097fb8034f82bff798aa09636cd53a0670e39a984","src/write/coff.rs":"1dcb1c6c939af192591d44e135e6d139b82563d8bca07249e93fa3d434b1f6c7","src/write/elf/mod.rs":"1bb945edad539b4f19dda5d46c9b86fa4ea3721eedda77ca2595b5519c3e30f2","src/write/elf/object.rs":"2176f0f640eed5a05be77208301a10667533b495551662186e6c708bd02c9c18","src/write/elf/writer.rs":"84336230a24413a41e342735c153c3421c70707ec92c2df02e7d3536e5d41b55","src/write/macho.rs":"bd6afba576273a162f6d2e9658c8258a664c38d0169864310dffbf1fd7582a43","src/write/mod.rs":"c6c9a54ef807a3bee0c3074be86b0aed90872e1e703f39f2fa5c06bc9ed89767","src/write/pe.rs":"6c72185705a3e067c481f2b9f81c64a84e062e67781928e58fd1150314dad8f9","src/write/string.rs":"0033a6f5137b42988ac41dbaa2efb94a4d74d8b043c9a34c40125e8ee6912420","src/write/util.rs":"7a1083d305e9446767ce2d5f69be2c4c155495cf97e595f8fa53c4e153ccf186","src/write/xcoff.rs":"f192dd34fb442cd53a004e50508f6a787c9e9cd9089a15f63fdf6054eb6bd63f","src/xcoff.rs":"fbd50fc4b61ccfdf218185ea4eafe8cf9793e8d034e7ce243fb54ecae12af5ce","tests/integration.rs":"0fa704827e4da1be38dac2e3820d92f6b20c4d415803b04f67c3516020b1de97","tests/parse_self.rs":"81b44b2dd1de9a5d8c18d9bd8926156e39fb83931837afa8ca344da0d309aeee","tests/read/coff.rs":"d3ec2079f00237640d01cb66eb24c55c85d7a775bb94f9f5c9f77e21cb7a785d","tests/read/mod.rs":"7833826f169ac3be2b4f274e5fc8cf4a51742bd0010803ff0dc20ea5643a7e61","tests/round_trip/bss.rs":"849d69b063fd757fed02219dd81e9d13b82068a2025d2cc5cfd40cf557e31bda","tests/round_trip/coff.rs":"8a25aab7164a5c8aa7a21279f8bae1f4d5f68a8d09c29a4ecd0d0c14564851cc","tests/round_trip/comdat.rs":"a8f729e218fee21e90b9f39b5cfcb4f80bc3ce26d3a297323667e6eb14f882cc","tests/round_trip/common.rs":"ced08ff559ca4d343ceef54bb4c581a3405cd96d6a1628ba43b7aab82070800b","tests/round_trip/elf.rs":"d7351d888ccad246a646ab3bea1afc3d445adeb28c5d3c8f157f7cde3717281c","tests/round_trip/macho.rs":"8cf6297f1b9e31153b15f2e409e68b561f135a233d32b601a47f5fd4dfa014cc","tests/round_trip/mod.rs":"14db36fae698b75fedc4dc832465394350049f54b01b1215022a44ebe920f7e9","tests/round_trip/section_flags.rs":"0e17639e5f86d576f039a294c274ce8db2e2a8add31a2fffc33a6e93a6d2791e","tests/round_trip/tls.rs":"23a49a1036b9173ece82a3080745930e5925e745280ab38866c9d3c29f463e63"},"package":"77ac5bbd07aea88c60a577a1ce218075ffd59208b2d7ca97adf9bfc5aeb21ebe"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/object/Cargo.toml temporalio-1.3.0/vendor/object/Cargo.toml --- temporalio-1.3.0/vendor/object/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/object/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -13,7 +13,7 @@ edition = "2018" rust-version = "1.60" name = "object" -version = "0.32.1" +version = "0.32.0" exclude = [ "/.github", "/testfiles", diff -Nru temporalio-1.3.0/vendor/object/CHANGELOG.md temporalio-1.3.0/vendor/object/CHANGELOG.md --- temporalio-1.3.0/vendor/object/CHANGELOG.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/object/CHANGELOG.md 2023-10-30 19:40:00.000000000 +0000 @@ -2,17 +2,6 @@ -------------------------------------------------------------------------------- -## 0.32.1 - -Released 2023/09/03. - -### Added - -* Added `write::Object::set_macho_cpu_subtype`. - [#574](https://github.com/gimli-rs/object/pull/574) - --------------------------------------------------------------------------------- - ## 0.32.0 Released 2023/08/12. diff -Nru temporalio-1.3.0/vendor/object/src/elf.rs temporalio-1.3.0/vendor/object/src/elf.rs --- temporalio-1.3.0/vendor/object/src/elf.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/object/src/elf.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1921,7 +1921,6 @@ /// AArch64 specific GNU properties. pub const GNU_PROPERTY_AARCH64_FEATURE_1_AND: u32 = 0xc0000000; -pub const GNU_PROPERTY_AARCH64_FEATURE_PAUTH: u32 = 0xc0000001; pub const GNU_PROPERTY_AARCH64_FEATURE_1_BTI: u32 = 1 << 0; pub const GNU_PROPERTY_AARCH64_FEATURE_1_PAC: u32 = 1 << 1; diff -Nru temporalio-1.3.0/vendor/object/src/write/coff.rs temporalio-1.3.0/vendor/object/src/write/coff.rs --- temporalio-1.3.0/vendor/object/src/write/coff.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/object/src/write/coff.rs 2023-10-30 19:40:00.000000000 +0000 @@ -83,7 +83,7 @@ name } - pub(crate) fn coff_fixup_relocation(&mut self, relocation: &mut Relocation) -> i64 { + pub(crate) fn coff_fixup_relocation(&mut self, mut relocation: &mut Relocation) -> i64 { if relocation.kind == RelocationKind::GotRelative { // Use a stub symbol for the relocation instead. // This isn't really a GOT, but it's a similar purpose. diff -Nru temporalio-1.3.0/vendor/object/src/write/elf/object.rs temporalio-1.3.0/vendor/object/src/write/elf/object.rs --- temporalio-1.3.0/vendor/object/src/write/elf/object.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/object/src/write/elf/object.rs 2023-10-30 19:40:00.000000000 +0000 @@ -152,7 +152,7 @@ }) } - pub(crate) fn elf_fixup_relocation(&mut self, relocation: &mut Relocation) -> Result { + pub(crate) fn elf_fixup_relocation(&mut self, mut relocation: &mut Relocation) -> Result { // Return true if we should use a section symbol to avoid preemption. fn want_section_symbol(relocation: &Relocation, symbol: &Symbol) -> bool { if symbol.scope != SymbolScope::Dynamic { diff -Nru temporalio-1.3.0/vendor/object/src/write/macho.rs temporalio-1.3.0/vendor/object/src/write/macho.rs --- temporalio-1.3.0/vendor/object/src/write/macho.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/object/src/write/macho.rs 2023-10-30 19:40:00.000000000 +0000 @@ -48,14 +48,6 @@ // Public methods. impl<'a> Object<'a> { - /// Specify the Mach-O CPU subtype. - /// - /// Requires `feature = "macho"`. - #[inline] - pub fn set_macho_cpu_subtype(&mut self, cpu_subtype: u32) { - self.macho_cpu_subtype = Some(cpu_subtype); - } - /// Specify information for a Mach-O `LC_BUILD_VERSION` command. /// /// Requires `feature = "macho"`. @@ -251,7 +243,7 @@ init_symbol_id } - pub(crate) fn macho_fixup_relocation(&mut self, relocation: &mut Relocation) -> i64 { + pub(crate) fn macho_fixup_relocation(&mut self, mut relocation: &mut Relocation) -> i64 { let constant = match relocation.kind { // AArch64Call relocations have special handling for the addend, so don't adjust it RelocationKind::Relative if relocation.encoding == RelocationEncoding::AArch64Call => 0, @@ -393,7 +385,7 @@ .map_err(|_| Error(String::from("Cannot allocate buffer")))?; // Write file header. - let (cputype, mut cpusubtype) = match self.architecture { + let (cputype, cpusubtype) = match self.architecture { Architecture::Arm => (macho::CPU_TYPE_ARM, macho::CPU_SUBTYPE_ARM_ALL), Architecture::Aarch64 => (macho::CPU_TYPE_ARM64, macho::CPU_SUBTYPE_ARM64_ALL), Architecture::Aarch64_Ilp32 => { @@ -411,10 +403,6 @@ } }; - if let Some(cpu_subtype) = self.macho_cpu_subtype { - cpusubtype = cpu_subtype; - } - let flags = match self.flags { FileFlags::MachO { flags } => flags, _ => 0, diff -Nru temporalio-1.3.0/vendor/object/src/write/mod.rs temporalio-1.3.0/vendor/object/src/write/mod.rs --- temporalio-1.3.0/vendor/object/src/write/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/object/src/write/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -75,9 +75,6 @@ pub mangling: Mangling, /// Mach-O "_tlv_bootstrap" symbol. tlv_bootstrap: Option, - /// Mach-O CPU subtype. - #[cfg(feature = "macho")] - macho_cpu_subtype: Option, #[cfg(feature = "macho")] macho_build_version: Option, } @@ -99,8 +96,6 @@ mangling: Mangling::default(format, architecture), tlv_bootstrap: None, #[cfg(feature = "macho")] - macho_cpu_subtype: None, - #[cfg(feature = "macho")] macho_build_version: None, } } diff -Nru temporalio-1.3.0/vendor/object/src/write/xcoff.rs temporalio-1.3.0/vendor/object/src/write/xcoff.rs --- temporalio-1.3.0/vendor/object/src/write/xcoff.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/object/src/write/xcoff.rs 2023-10-30 19:40:00.000000000 +0000 @@ -66,7 +66,7 @@ } } - pub(crate) fn xcoff_fixup_relocation(&mut self, relocation: &mut Relocation) -> i64 { + pub(crate) fn xcoff_fixup_relocation(&mut self, mut relocation: &mut Relocation) -> i64 { let constant = match relocation.kind { RelocationKind::Relative => relocation.addend + 4, _ => relocation.addend, diff -Nru temporalio-1.3.0/vendor/opentelemetry/.cargo-checksum.json temporalio-1.3.0/vendor/opentelemetry/.cargo-checksum.json --- temporalio-1.3.0/vendor/opentelemetry/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"CHANGELOG.md":"5c0db3e3f06bd27c8b3f7490a7947827abd66272929d177de8e04abd547df1a7","CODEOWNERS":"abc35dda6643aed84b16084b9dccfee77929c299d60d21b590bd5c8c3b54e508","Cargo.toml":"5b36042eb54b1e1d969fcd36c536d2c2f35da0c4058e60df8154601d6d950d2e","LICENSE":"c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4","README.md":"730f4a6048d182bd39df06e330424d58c5fc0c78d11963a57d68d1a4424efc6a","src/lib.rs":"8302b00dead26166c4e05c97dd5cddf907fbc072c594ec4d38e9606aa22f0277"},"package":"69d6c3d7288a106c0a363e4b0e8d308058d56902adefb16f4936f417ffef086e"} \ No newline at end of file +{"files":{"CHANGELOG.md":"758c9a1f9c4a16d929cd704cff982c02070c5eee66707367fc951a9c72e83d3a","CODEOWNERS":"abc35dda6643aed84b16084b9dccfee77929c299d60d21b590bd5c8c3b54e508","Cargo.toml":"905654a22ba13b1e98dd01c1c0e8eb6c7510f8ba3ca6aa5970ac7eb0bfc66258","LICENSE":"208a3f5bae3355bd4f3f45626d1ea4518b253d618ee2896983436075c4375098","README.md":"b695dd1ad761813cdef061c28683c739b7b7f0f813d967c2bc4048c4835139fa","src/lib.rs":"815dec295d1e1316b548800a12074532addb7cadfb32569eef2e2d52a3eefc94"},"package":"9591d937bc0e6d2feb6f71a559540ab300ea49955229c347a517a28d27784c54"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/opentelemetry/Cargo.toml temporalio-1.3.0/vendor/opentelemetry/Cargo.toml --- temporalio-1.3.0/vendor/opentelemetry/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -11,9 +11,9 @@ [package] edition = "2021" -rust-version = "1.56" +rust-version = "1.60" name = "opentelemetry" -version = "0.18.0" +version = "0.20.0" description = "A metrics collection and distributed tracing framework" homepage = "https://github.com/open-telemetry/opentelemetry-rust" readme = "README.md" @@ -32,6 +32,7 @@ ] license = "Apache-2.0" repository = "https://github.com/open-telemetry/opentelemetry-rust" +resolver = "1" [package.metadata.docs.rs] all-features = true @@ -41,13 +42,19 @@ ] [dependencies.opentelemetry_api] -version = "0.18.0" +version = "0.20" [dependencies.opentelemetry_sdk] -version = "0.18.0" +version = "0.20" + +[dev-dependencies.opentelemetry-stdout] +version = "0.1" +features = ["trace"] [features] default = ["trace"] +logs = ["opentelemetry_sdk/logs"] +logs_level_enabled = ["logs"] metrics = [ "opentelemetry_api/metrics", "opentelemetry_sdk/metrics", diff -Nru temporalio-1.3.0/vendor/opentelemetry/CHANGELOG.md temporalio-1.3.0/vendor/opentelemetry/CHANGELOG.md --- temporalio-1.3.0/vendor/opentelemetry/CHANGELOG.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry/CHANGELOG.md 2023-10-30 19:40:00.000000000 +0000 @@ -1,5 +1,11 @@ # Changelog +## [v0.20.0](https://github.com/open-telemetry/opentelemetry-rust/compare/v0.19.0...v0.20.0) +This release should been seen as 1.0-rc3 following 1.0-rc2 in v0.19.0. Refer to CHANGELOG.md in individual creates for details on changes made in different creates. + +## [v0.19.0](https://github.com/open-telemetry/opentelemetry-rust/compare/v0.18.0...v0.19.0) +This release should been seen as 1.0-rc2 following 1.0-rc1 in v0.18.0. Refer to CHANGELOG.md in individual creates for details on changes made in different creates. + ## [v0.18.0](https://github.com/open-telemetry/opentelemetry-rust/compare/v0.17.0...v0.18.0) This release is the first beta release of the `trace` API and SDK. If no other @@ -58,7 +64,7 @@ - Allow `String` data in instrumentation library. #670 - Remove `std::fmt::Debug` and `'static` requirements from `TracerProvider`, `Tracer`, and `Span` #664 -- Remove unused `Tracer::invalid` method #683 +- Remove unused `Tracer::invalid` method #683 - Split `TracerProvider::tracer` and `TracerProvider::versioned_tracer` methods #682 - Reduce dependency on `futures` crate #684 - Switch to parent context references #687 diff -Nru temporalio-1.3.0/vendor/opentelemetry/LICENSE temporalio-1.3.0/vendor/opentelemetry/LICENSE --- temporalio-1.3.0/vendor/opentelemetry/LICENSE 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry/LICENSE 2023-10-30 19:40:00.000000000 +0000 @@ -186,7 +186,7 @@ same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright [yyyy] [name of copyright owner] + Copyright 2023 The OpenTelemetry Authors Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff -Nru temporalio-1.3.0/vendor/opentelemetry/README.md temporalio-1.3.0/vendor/opentelemetry/README.md --- temporalio-1.3.0/vendor/opentelemetry/README.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry/README.md 2023-10-30 19:40:00.000000000 +0000 @@ -11,11 +11,7 @@ [![LICENSE](https://img.shields.io/crates/l/opentelemetry)](./LICENSE) [![GitHub Actions CI](https://github.com/open-telemetry/opentelemetry-rust/workflows/CI/badge.svg)](https://github.com/open-telemetry/opentelemetry-rust/actions?query=workflow%3ACI+branch%3Amain) [![codecov](https://codecov.io/gh/open-telemetry/opentelemetry-rust/branch/main/graph/badge.svg)](https://codecov.io/gh/open-telemetry/opentelemetry-rust) -[![Gitter chat](https://img.shields.io/badge/gitter-join%20chat%20%E2%86%92-brightgreen.svg)](https://gitter.im/open-telemetry/opentelemetry-rust) - -[Website](https://opentelemetry.io/) | -[Chat](https://gitter.im/open-telemetry/opentelemetry-rust) | -[Documentation](https://docs.rs/opentelemetry) +[![Slack](https://img.shields.io/badge/slack-@cncf/otel/rust-brightgreen.svg?logo=slack)](https://cloud-native.slack.com/archives/C03GDP0H023) ## Overview @@ -25,7 +21,7 @@ can export and analyze them using [Prometheus], [Jaeger], and other observability tools. -*Compiler support: [requires `rustc` 1.56+][msrv]* +*Compiler support: [requires `rustc` 1.60+][msrv]* [Prometheus]: https://prometheus.io [Jaeger]: https://www.jaegertracing.io @@ -34,11 +30,18 @@ ## Getting Started ```rust -use opentelemetry::{global, sdk::export::trace::stdout, trace::Tracer}; +use opentelemetry::{ + global, + sdk::trace::TracerProvider, + trace::{Tracer, TracerProvider as _}, +}; fn main() { // Create a new trace pipeline that prints to stdout - let tracer = stdout::new_pipeline().install_simple(); + let provider = TracerProvider::builder() + .with_simple_exporter(opentelemetry_stdout::SpanExporter::default()) + .build(); + let tracer = provider.tracer("readme_example"); tracer.in_span("doing_work", |cx| { // Traced app logic here... @@ -130,7 +133,7 @@ ## Supported Rust Versions OpenTelemetry is built against the latest stable release. The minimum supported -version is 1.56. The current OpenTelemetry version is not guaranteed to build +version is 1.60. The current OpenTelemetry version is not guaranteed to build on Rust versions earlier than the minimum supported version. The current stable Rust compiler and the three most recent minor versions diff -Nru temporalio-1.3.0/vendor/opentelemetry/src/lib.rs temporalio-1.3.0/vendor/opentelemetry/src/lib.rs --- temporalio-1.3.0/vendor/opentelemetry/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -2,7 +2,7 @@ //! services to capture distributed traces and metrics from your application. You //! can analyze them using [Prometheus], [Jaeger], and other observability tools. //! -//! *Compiler support: [requires `rustc` 1.56+][msrv]* +//! *Compiler support: [requires `rustc` 1.60+][msrv]* //! //! [Prometheus]: https://prometheus.io //! [Jaeger]: https://www.jaegertracing.io @@ -13,11 +13,18 @@ //! ```no_run //! # #[cfg(feature = "trace")] //! # { -//! use opentelemetry::{global, sdk::export::trace::stdout, trace::Tracer}; +//! use opentelemetry::{ +//! global, +//! sdk::trace::TracerProvider, +//! trace::{Tracer, TracerProvider as _}, +//! }; //! //! fn main() { //! // Create a new trace pipeline that prints to stdout -//! let tracer = stdout::new_pipeline().install_simple(); +//! let provider = TracerProvider::builder() +//! .with_simple_exporter(opentelemetry_stdout::SpanExporter::default()) +//! .build(); +//! let tracer = provider.tracer("readme_example"); //! //! tracer.in_span("doing_work", |cx| { //! // Traced app logic here... @@ -82,9 +89,7 @@ //! ``` //! # #[cfg(feature = "metrics")] //! # { -//! use opentelemetry::{global, Context, KeyValue}; -//! -//! let cx = Context::current(); +//! use opentelemetry::{global, KeyValue}; //! //! // get a meter from a provider //! let meter = global::meter("my_service"); @@ -93,7 +98,7 @@ //! let counter = meter.u64_counter("my_counter").init(); //! //! // record a measurement -//! counter.add(&cx, 1, &[KeyValue::new("http.client_ip", "83.164.160.102")]); +//! counter.add(1, &[KeyValue::new("http.client_ip", "83.164.160.102")]); //! # } //! ``` //! @@ -192,7 +197,7 @@ //! ## Supported Rust Versions //! //! OpenTelemetry is built against the latest stable release. The minimum -//! supported version is 1.56. The current OpenTelemetry version is not +//! supported version is 1.60. The current OpenTelemetry version is not //! guaranteed to build on Rust versions earlier than the minimum supported //! version. //! diff -Nru temporalio-1.3.0/vendor/opentelemetry_api/.cargo-checksum.json temporalio-1.3.0/vendor/opentelemetry_api/.cargo-checksum.json --- temporalio-1.3.0/vendor/opentelemetry_api/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_api/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"CHANGELOG.md":"ed13f0c0e18ada3ee7210e032243ab4fef8c3313d217e47fe175e37fa69e8dd6","CODEOWNERS":"abc35dda6643aed84b16084b9dccfee77929c299d60d21b590bd5c8c3b54e508","Cargo.toml":"b50889b677419a24681c8d2dbfa88e5c1435644abde140486ce3e62fff925cc0","LICENSE":"c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4","README.md":"e51ac03e63eca4b3a5e54521a81f5096973df6bb7e415007ee6d9727b116e986","src/attributes/encoder.rs":"70b1f5f2d647db08c0b70bdb9019ce731d75004e4ad942783d2b52ef0e23bb79","src/attributes/mod.rs":"86e0f28ea2a1e6a4d8799c5bfbae0f07cc3ba98e839e447389be63897551fac4","src/baggage.rs":"e7b00078adda0df356a3e7a23f5df080830dc3ac2256585561a3eaabbd260307","src/common.rs":"698084a597f6ee4eb706faebc555317a04c8b9616906ecf59b0dfad6579f3cf9","src/context.rs":"4834795c48a1ce015fad9c64371905f3f6e740e0dbed06608f559f060dd5b0ab","src/global/error_handler.rs":"09779d9f1b1bf9259451a05670d3057a8393963f93ce34c0145c2442f2fd28e0","src/global/metrics.rs":"3b9c4067cb72b877b26ed436049d150990bc4f877b5b0395394c836d178dda3f","src/global/mod.rs":"d347758453e1ad63aa62b43490469039058bc7d20e762bde6cd582efa29cfe8f","src/global/propagation.rs":"5e85e66143ea45752c2c03e5a113d2be88c19611118f9ddec543350d17cf492f","src/global/trace.rs":"b4a7f333d906f4f2c5bc18e25e58c88b3d8d6659d62dbb9aaf00c88ed9356c0c","src/lib.rs":"7d034250144bddb5896f3ed20d7678b3cd9bcd5440ae1584566a04f2c0ef8cbd","src/metrics/instruments/counter.rs":"691c0d3c5e5383ca4f16e7abcb2fbcd7ddb18a9fb60d72164b0cfb38c042402d","src/metrics/instruments/gauge.rs":"dc1307334523b8f35ee530194b761f07dab11158340e26128d04db911d9564d2","src/metrics/instruments/histogram.rs":"dab2782a30bfff189d8af227cebe101cdccf30a9d7d1aaf9730df66fc31aaad7","src/metrics/instruments/mod.rs":"b23e557acf69297f85badf90f271a57368248042b56d75ea755f175180d835fc","src/metrics/instruments/up_down_counter.rs":"739e6a829bce39ee94aa7b7f78ea5f2ab2047401d06ec99f3cc3f05632668f38","src/metrics/meter.rs":"bebae244c72f6bd6aa61e1cca2c9260d055370a2a696f80316d2df8b4a6b242f","src/metrics/mod.rs":"fdd9a9848136496380d7122bc1ea140da8d74595178a6311010308d6b6de172d","src/metrics/noop.rs":"bccc544eab0ce455107e8642c3dcd9465184dcf6abd1b28e717df9455c5b6431","src/propagation/mod.rs":"b09495984d31fec0dec4543f6e3f126d015e0bb36e6c606aab3ae769aab94650","src/propagation/text_map_propagator.rs":"a93dc92282eec8818ac5ecf7d83afe6ef52bb6d615c2e44188995df68be22ef4","src/testing/mod.rs":"db380e3251a04db72a486099e470df8a28ce5da531cabb634ed673860e8270a3","src/testing/trace.rs":"a82e97597db8d4a9cca5418eb0f0402c5e3f1bb4c87e662a7b9dc97dcc1dd20f","src/trace/context.rs":"7a131f56792ceba08468cc003b3a77415ec92c90ba94843ad94beb0e7a324edb","src/trace/mod.rs":"13f66bc9be52847852ecadc8f3333e7f17c341d7c3df6152df6b96a91b71a139","src/trace/noop.rs":"46c49f2d0941967c2e076f43d4618fb6643051fcba2c0740b2015f157e3d94d1","src/trace/order_map.rs":"f1333b5c8754d5385d874d6cd66b674a5745665aba3feff197d583bada66409c","src/trace/span.rs":"6950ef224d3bc80bdd8e004441b3a58a4f592cc80d345affd6b79717eb84cc40","src/trace/span_context.rs":"0925791b17806c55edf799e275d7727babaa8c93239bbcf0c47f956e44596c82","src/trace/tracer.rs":"92e431262c8b0504bcfdc56d0c82ea3a2b3719c85fe661151f21f7e95583a8ce","src/trace/tracer_provider.rs":"affa8dab4ed0351594a05eaf057f1ef341291bb8d44edd5f33129b829cc0f9b8"},"package":"c24f96e21e7acc813c7a8394ee94978929db2bcc46cf6b5014fc612bf7760c22"} \ No newline at end of file +{"files":{"CHANGELOG.md":"4fc0f9f2b8e9d5c0f7ee1b3ea26e805e95ccd429913402a06791fb950d042805","CODEOWNERS":"abc35dda6643aed84b16084b9dccfee77929c299d60d21b590bd5c8c3b54e508","Cargo.toml":"21dc7313446ad1eed395cc4a98659bfec0b2732f4677445247167c5f89ab63b9","LICENSE":"208a3f5bae3355bd4f3f45626d1ea4518b253d618ee2896983436075c4375098","README.md":"249b79dc7c95c2fabf01f8a66de4133a9cf0e6f53636de5c60f761885fe786c4","src/baggage.rs":"873a6ac642523455818e01eee33002aba86e2e96eb58d5d3db92e9c9a6be7860","src/common.rs":"0c257050087b656d73bbc1cac954a884f3a71d8dbbc1c2a60594eaa9c93b9527","src/context.rs":"94d62a0b57d7ac6dcac51a4b401cd2303fc42ac7f942208e4003fae094c87dce","src/global/error_handler.rs":"b832613e5f30359b194f85331373db4da57fb7a03ff7c29bc0b2f5fccda79de6","src/global/logs.rs":"279b388ba86cde0917750b79def3eedd5fd44d68eceffcb0d593f9d9f368001b","src/global/metrics.rs":"cd9de30ab581dcd69e05ed032846cde70d39886923fa9eaac92375e19b35ddab","src/global/mod.rs":"f3b860cc187cca9d1ed2f5ff2237e6010b1e5a2c51951e269967b5b40410e652","src/global/propagation.rs":"5e85e66143ea45752c2c03e5a113d2be88c19611118f9ddec543350d17cf492f","src/global/trace.rs":"03034785a2d69f9937ccd7ce38cb72fbb67aeddf4c63bd725e22297cfd336861","src/lib.rs":"bad30245ca5760095f7d96c2814f78d3f2f5f85727c2e36b1473c1612607a5f1","src/logs/logger.rs":"6d4a80ff5830bd8cd06c31066eac43a585801a4e052d875193b5a7f7e6196721","src/logs/mod.rs":"51cc837a7c90a5c6e7f2f5dfb5b6c03b5acb0f70718ad548691b0f0b3fb299d3","src/logs/noop.rs":"e262d9d7818ef3b65d0a8f44dbaaffab0e851577e964aac290e7d4454212c074","src/logs/record.rs":"68b94366ac32ea8e2c5c7e9fa4280c6f60a1b0fc972978767e55e187c2aed498","src/metrics/instruments/counter.rs":"0b94993f0c36a70cedd6df913aa88cde6096ac4f2f44dd84a2020a8c36b7025f","src/metrics/instruments/gauge.rs":"e7236048e26506c2b5ab9dc034f90451657c4cc43b551edf96489f3aabd97cfc","src/metrics/instruments/histogram.rs":"617694542a0ab316d8c0d6c31a743e7669155802653c2b5997552059eb8a2e91","src/metrics/instruments/mod.rs":"d4ca3901c08303dd542e07b5fac6bbabd19132b7336f2f9c5aa060f561dd0462","src/metrics/instruments/up_down_counter.rs":"de610e354a0da150cd1c3853b2d684f923153459f18ae517ab83413d5fb9de01","src/metrics/meter.rs":"9b2afe29811cb72ce97f49206c005aa564a820ff440ec16b372d40fd3d03aea2","src/metrics/mod.rs":"e33deae67c8ea75a2ba4d48b7e25710a81a1d77880417d3b4f9a58f5e9024973","src/metrics/noop.rs":"72eebd42c38979c3eb732fb96c80f6971f487f2a3c244a4fe9f0b2552d9ae923","src/order_map.rs":"f1333b5c8754d5385d874d6cd66b674a5745665aba3feff197d583bada66409c","src/propagation/mod.rs":"b09495984d31fec0dec4543f6e3f126d015e0bb36e6c606aab3ae769aab94650","src/propagation/text_map_propagator.rs":"4b6a90855fc17deacadcd13d223f59331f34aea13ac9c525ac3d99aaf526870f","src/testing/mod.rs":"db380e3251a04db72a486099e470df8a28ce5da531cabb634ed673860e8270a3","src/testing/trace.rs":"12abaac94692f1c1a9d71aadb41f718458960919c4e38e3e6613b3d01e8e830b","src/trace/context.rs":"1288bbad3d56e435c41d6a370ce03bae6d57fd8c5cea8778eb6a2b6b39d223f2","src/trace/mod.rs":"546b9fb4d1157532a1945c4c0cc3d860ff83c8bd2659d745809f7d031b5ab5d5","src/trace/noop.rs":"a8ad2f2d86c6caa8eacadc67a12b50b6b21e65da68302fdba91375cd5f4e1e57","src/trace/span.rs":"6950ef224d3bc80bdd8e004441b3a58a4f592cc80d345affd6b79717eb84cc40","src/trace/span_context.rs":"a14bdfda9f5a080fe765cb919bba38a19427e6cf37990a5e4e70cdf596f98ff2","src/trace/tracer.rs":"f80de2056215aecb4f53af3ef4d8563157ed5650132874ddcc0553e602db7ecf","src/trace/tracer_provider.rs":"143db10c85aaf905988c283f55281e509554294314961fc294516a5b8d266ab4"},"package":"8a81f725323db1b1206ca3da8bb19874bbd3f57c3bcd59471bfb04525b265b9b"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/opentelemetry_api/Cargo.toml temporalio-1.3.0/vendor/opentelemetry_api/Cargo.toml --- temporalio-1.3.0/vendor/opentelemetry_api/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_api/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -11,14 +11,15 @@ [package] edition = "2021" -rust-version = "1.56" +rust-version = "1.60" name = "opentelemetry_api" -version = "0.18.0" +version = "0.20.0" description = "OpenTelemetry is a metrics collection and distributed tracing framework" homepage = "https://github.com/open-telemetry/opentelemetry-rust" readme = "README.md" license = "Apache-2.0" repository = "https://github.com/open-telemetry/opentelemetry-rust" +resolver = "1" [package.metadata.docs.rs] all-features = true @@ -27,10 +28,6 @@ "docsrs", ] -[dependencies.fnv] -version = "1.0" -optional = true - [dependencies.futures-channel] version = "0.3" @@ -55,15 +52,16 @@ [dependencies.thiserror] version = "1" -[dependencies.tokio-stream] -version = "0.1" -optional = true +[dependencies.urlencoding] +version = "2.1.2" [features] default = ["trace"] -metrics = ["fnv"] +logs = [] +logs_level_enabled = ["logs"] +metrics = [] testing = ["trace"] trace = ["pin-project-lite"] -[target."cfg(target_arch = \"wasm32\")".dependencies.js-sys] -version = "0.3" +[target."cfg(all(target_arch = \"wasm32\", not(target_os = \"wasi\")))".dependencies.js-sys] +version = "0.3.63" diff -Nru temporalio-1.3.0/vendor/opentelemetry_api/CHANGELOG.md temporalio-1.3.0/vendor/opentelemetry_api/CHANGELOG.md --- temporalio-1.3.0/vendor/opentelemetry_api/CHANGELOG.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_api/CHANGELOG.md 2023-10-30 19:40:00.000000000 +0000 @@ -1,5 +1,40 @@ # Changelog +## v0.20.0 + +### Added + +- Add `new` method to `BoxedTracer` #1009 +- Add js-sys as dependency for api crate when building wasm targets #1078 +- Create tracer using a shared instrumentation library #1129 +- Add `Context::map_current` #1140 + +### Changed + +- `OtelString::Owned` carries `Box` instead of `String` #1096 + +### Removed + +- Drop include_trace_context parameter from Logs API/SDK. [#1133](https://github.com/open-telemetry/opentelemetry-rust/issues/1133) +- Synchronous instruments no longer accepts `Context` while reporting + measurements. [#1076](https://github.com/open-telemetry/opentelemetry-rust/pull/1076). + +### Fixed + +- Fix `SpanRef::set_attributes` mutability requirement. [#1038](https://github.com/open-telemetry/opentelemetry-rust/pull/1038) +- Move OrderMap module to root of otel-api crate. [#1061](https://github.com/open-telemetry/opentelemetry-rust/pull/1061) +- Use the browser-only js-sys workaround only when actually targeting a browser #1008 + +## v0.19.0 +### Added +- Add `WithContext` to public api [#893](https://github.com/open-telemetry/opentelemetry-rust/pull/893). +- Add support for instrumentation scope attributes [#1021](https://github.com/open-telemetry/opentelemetry-rust/pull/1021). + +### Changed +- Implement `Display` on `Baggage` [#921](https://github.com/open-telemetry/opentelemetry-rust/pull/921). +- Bump MSRV to 1.57 [#953](https://github.com/open-telemetry/opentelemetry-rust/pull/953). +- Update dependencies and bump MSRV to 1.60 [#969](https://github.com/open-telemetry/opentelemetry-rust/pull/969). + ## v0.18.0 - API split from `opentelemetry` crate diff -Nru temporalio-1.3.0/vendor/opentelemetry_api/LICENSE temporalio-1.3.0/vendor/opentelemetry_api/LICENSE --- temporalio-1.3.0/vendor/opentelemetry_api/LICENSE 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_api/LICENSE 2023-10-30 19:40:00.000000000 +0000 @@ -186,7 +186,7 @@ same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright [yyyy] [name of copyright owner] + Copyright 2023 The OpenTelemetry Authors Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff -Nru temporalio-1.3.0/vendor/opentelemetry_api/README.md temporalio-1.3.0/vendor/opentelemetry_api/README.md --- temporalio-1.3.0/vendor/opentelemetry_api/README.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_api/README.md 2023-10-30 19:40:00.000000000 +0000 @@ -11,11 +11,7 @@ [![LICENSE](https://img.shields.io/crates/l/opentelemetry_api)](./LICENSE) [![GitHub Actions CI](https://github.com/open-telemetry/opentelemetry-rust/workflows/CI/badge.svg)](https://github.com/open-telemetry/opentelemetry-rust/actions?query=workflow%3ACI+branch%3Amain) [![codecov](https://codecov.io/gh/open-telemetry/opentelemetry-rust/branch/main/graph/badge.svg)](https://codecov.io/gh/open-telemetry/opentelemetry-rust) -[![Gitter chat](https://img.shields.io/badge/gitter-join%20chat%20%E2%86%92-brightgreen.svg)](https://gitter.im/open-telemetry/opentelemetry-rust) - -[Website](https://opentelemetry.io/) | -[Chat](https://gitter.im/open-telemetry/opentelemetry-rust) | -[Documentation](https://docs.rs/opentelemetry) +[![Slack](https://img.shields.io/badge/slack-@cncf/otel/rust-brightgreen.svg?logo=slack)](https://cloud-native.slack.com/archives/C03GDP0H023) ## Overview @@ -25,7 +21,7 @@ can export and analyze them using [Prometheus], [Jaeger], and other observability tools. -*Compiler support: [requires `rustc` 1.56+][msrv]* +*Compiler support: [requires `rustc` 1.60+][msrv]* [Prometheus]: https://prometheus.io [Jaeger]: https://www.jaegertracing.io diff -Nru temporalio-1.3.0/vendor/opentelemetry_api/src/attributes/encoder.rs temporalio-1.3.0/vendor/opentelemetry_api/src/attributes/encoder.rs --- temporalio-1.3.0/vendor/opentelemetry_api/src/attributes/encoder.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_api/src/attributes/encoder.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,76 +0,0 @@ -use crate::{Key, Value}; -use std::fmt::{self, Write}; -use std::sync::atomic::{AtomicUsize, Ordering}; - -static ENCODER_ID_COUNTER: AtomicUsize = AtomicUsize::new(0); - -/// Encoder is a mechanism for serializing an attribute set into a specific string -/// representation that supports caching, to avoid repeated serialization. An -/// example could be an exporter encoding the attribute set into a wire -/// representation. -pub trait Encoder: fmt::Debug { - /// Encode returns the serialized encoding of the attribute - /// set using its Iterator. This result may be cached. - fn encode(&self, attributes: &mut dyn Iterator) -> String; - - /// A value that is unique for each class of attribute encoder. Attribute encoders - /// allocate these using `new_encoder_id`. - fn id(&self) -> EncoderId; -} - -/// EncoderID is used to identify distinct Encoder -/// implementations, for caching encoded results. -#[derive(Debug)] -pub struct EncoderId(usize); - -impl EncoderId { - /// Check if the id is valid - pub fn is_valid(&self) -> bool { - self.0 != 0 - } -} - -/// Default attribute encoding strategy -#[derive(Debug)] -pub struct DefaultAttributeEncoder; - -impl Encoder for DefaultAttributeEncoder { - fn encode(&self, attributes: &mut dyn Iterator) -> String { - attributes - .enumerate() - .fold(String::new(), |mut acc, (idx, (key, value))| { - let offset = acc.len(); - if idx > 0 { - acc.push(',') - } - - if write!(acc, "{}", key).is_err() { - acc.truncate(offset); - return acc; - } - - acc.push('='); - if write!(acc, "{}", value).is_err() { - acc.truncate(offset); - return acc; - } - - acc - }) - } - - fn id(&self) -> EncoderId { - new_encoder_id() - } -} - -/// Build a new default encoder -pub fn default_encoder() -> Box { - Box::new(DefaultAttributeEncoder) -} - -/// Build a new encoder id -pub fn new_encoder_id() -> EncoderId { - let old_encoder_id = ENCODER_ID_COUNTER.fetch_add(1, Ordering::AcqRel); - EncoderId(old_encoder_id + 1) -} diff -Nru temporalio-1.3.0/vendor/opentelemetry_api/src/attributes/mod.rs temporalio-1.3.0/vendor/opentelemetry_api/src/attributes/mod.rs --- temporalio-1.3.0/vendor/opentelemetry_api/src/attributes/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_api/src/attributes/mod.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,144 +0,0 @@ -//! OpenTelemetry Attributes -use crate::{Array, Key, KeyValue, Value}; -use std::cmp::Ordering; -use std::collections::{btree_map, BTreeMap}; -use std::hash::{Hash, Hasher}; -use std::iter::Peekable; - -mod encoder; -pub use encoder::{default_encoder, new_encoder_id, DefaultAttributeEncoder, Encoder, EncoderId}; - -/// An immutable set of distinct attributes. -#[derive(Clone, Debug, Default)] -pub struct AttributeSet { - attributes: BTreeMap, -} - -impl AttributeSet { - /// Construct a new attribute set form a distinct set of attributes - pub fn from_attributes>(attributes: T) -> Self { - AttributeSet { - attributes: attributes - .into_iter() - .map(|kv| (kv.key, kv.value)) - .collect(), - } - } - - /// The attribute set length. - pub fn len(&self) -> usize { - self.attributes.len() - } - - /// Check if the set of attributes are empty. - pub fn is_empty(&self) -> bool { - self.attributes.is_empty() - } - - /// Iterate over the attribute key value pairs. - pub fn iter(&self) -> Iter<'_> { - self.into_iter() - } - - /// Encode the attribute set with the given encoder and cache the result. - pub fn encoded(&self, encoder: Option<&dyn Encoder>) -> String { - encoder.map_or_else(String::new, |encoder| encoder.encode(&mut self.iter())) - } -} - -impl<'a> IntoIterator for &'a AttributeSet { - type Item = (&'a Key, &'a Value); - type IntoIter = Iter<'a>; - - fn into_iter(self) -> Self::IntoIter { - Iter(self.attributes.iter()) - } -} -/// An iterator over the entries of a `Set`. -#[derive(Debug)] -pub struct Iter<'a>(btree_map::Iter<'a, Key, Value>); -impl<'a> Iterator for Iter<'a> { - type Item = (&'a Key, &'a Value); - - fn next(&mut self) -> Option { - self.0.next() - } -} - -/// Impl of Hash for `KeyValue` -pub fn hash_attributes<'a, H: Hasher, I: IntoIterator>( - state: &mut H, - attributes: I, -) { - for (key, value) in attributes.into_iter() { - key.hash(state); - hash_value(state, value); - } -} - -fn hash_value(state: &mut H, value: &Value) { - match value { - Value::Bool(b) => b.hash(state), - Value::I64(i) => i.hash(state), - Value::F64(f) => { - // FIXME: f64 does not impl hash, this impl may have incorrect outcomes. - f.to_bits().hash(state) - } - Value::String(s) => s.hash(state), - Value::Array(arr) => match arr { - // recursively hash array values - Array::Bool(values) => values.iter().for_each(|v| v.hash(state)), - Array::I64(values) => values.iter().for_each(|v| v.hash(state)), - Array::F64(values) => values.iter().for_each(|v| v.to_bits().hash(state)), - Array::String(values) => values.iter().for_each(|v| v.hash(state)), - }, - } -} - -/// Merge two iterators, yielding sorted results -pub fn merge_iters< - 'a, - 'b, - A: Iterator, - B: Iterator, ->( - a: A, - b: B, -) -> MergeIter<'a, 'b, A, B> { - MergeIter { - a: a.peekable(), - b: b.peekable(), - } -} - -/// Merge two iterators, sorting by key -#[derive(Debug)] -pub struct MergeIter<'a, 'b, A, B> -where - A: Iterator, - B: Iterator, -{ - a: Peekable, - b: Peekable, -} - -impl<'a, A: Iterator, B: Iterator> - Iterator for MergeIter<'a, 'a, A, B> -{ - type Item = (&'a Key, &'a Value); - fn next(&mut self) -> Option { - let which = match (self.a.peek(), self.b.peek()) { - (Some(a), Some(b)) => Some(a.0.cmp(b.0)), - (Some(_), None) => Some(Ordering::Less), - (None, Some(_)) => Some(Ordering::Greater), - (None, None) => None, - }; - - match which { - Some(Ordering::Less) => self.a.next(), - Some(Ordering::Equal) => self.a.next(), - Some(Ordering::Greater) => self.b.next(), - None => None, - } - } -} diff -Nru temporalio-1.3.0/vendor/opentelemetry_api/src/baggage.rs temporalio-1.3.0/vendor/opentelemetry_api/src/baggage.rs --- temporalio-1.3.0/vendor/opentelemetry_api/src/baggage.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_api/src/baggage.rs 2023-10-30 19:40:00.000000000 +0000 @@ -17,7 +17,9 @@ use crate::{Context, Key, KeyValue, Value}; use once_cell::sync::Lazy; use std::collections::{hash_map, HashMap}; +use std::fmt; use std::iter::FromIterator; +use urlencoding::encode; static DEFAULT_BAGGAGE: Lazy = Lazy::new(Baggage::default); @@ -280,6 +282,23 @@ } } +impl fmt::Display for Baggage { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + for (i, (k, v)) in self.into_iter().enumerate() { + write!(f, "{}={}", k, encode(&v.0.as_str()))?; + if !v.1.as_str().is_empty() { + write!(f, ";{}", v.1)?; + } + + if i < self.len() - 1 { + write!(f, ",")?; + } + } + + Ok(()) + } +} + /// Methods for sorting and retrieving baggage data in a context. pub trait BaggageExt { /// Returns a clone of the given context with the included name/value pairs. @@ -289,8 +308,9 @@ /// ``` /// use opentelemetry_api::{baggage::BaggageExt, Context, KeyValue, Value}; /// - /// let some_context = Context::current(); - /// let cx = some_context.with_baggage(vec![KeyValue::new("my-name", "my-value")]); + /// let cx = Context::map_current(|cx| { + /// cx.with_baggage(vec![KeyValue::new("my-name", "my-value")]) + /// }); /// /// assert_eq!( /// cx.baggage().get("my-name"), @@ -320,14 +340,14 @@ baggage: T, ) -> Self; - /// Returns a clone of the given context with the included name/value pairs. + /// Returns a clone of the given context with no baggage. /// /// # Examples /// /// ``` /// use opentelemetry_api::{baggage::BaggageExt, Context, KeyValue, Value}; /// - /// let cx = Context::current().with_cleared_baggage(); + /// let cx = Context::map_current(|cx| cx.with_cleared_baggage()); /// /// assert_eq!(cx.baggage().len(), 0); /// ``` @@ -358,7 +378,7 @@ } fn current_with_baggage, I: Into>(kvs: T) -> Self { - Context::current().with_baggage(kvs) + Context::map_current(|cx| cx.with_baggage(kvs)) } fn with_cleared_baggage(&self) -> Self { @@ -397,6 +417,12 @@ } } +impl fmt::Display for BaggageMetadata { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + Ok(write!(f, "{}", self.as_str())?) + } +} + /// [`Baggage`] name/value pairs with their associated metadata. #[derive(Clone, Debug, PartialEq)] pub struct KeyValueMetadata { @@ -436,6 +462,8 @@ #[cfg(test)] mod tests { + use crate::StringValue; + use super::*; #[test] @@ -451,7 +479,7 @@ let over_limit = MAX_KEY_VALUE_PAIRS + 1; let mut data = Vec::with_capacity(over_limit); for i in 0..over_limit { - data.push(KeyValue::new(format!("key{}", i), format!("key{}", i))) + data.push(KeyValue::new(format!("key{i}"), format!("key{i}"))) } let baggage = data.into_iter().collect::(); assert_eq!(baggage.len(), MAX_KEY_VALUE_PAIRS) @@ -494,4 +522,47 @@ let baggage = data.into_iter().collect::(); assert_eq!(baggage.len(), 3) } + + #[test] + fn serialize_baggage_as_string() { + // Empty baggage + let b = Baggage::default(); + assert_eq!("", b.to_string()); + + // "single member empty value no properties" + let mut b = Baggage::default(); + b.insert("foo", StringValue::from("")); + assert_eq!("foo=", b.to_string()); + + // "single member no properties" + let mut b = Baggage::default(); + b.insert("foo", StringValue::from("1")); + assert_eq!("foo=1", b.to_string()); + + // "URL encoded value" + let mut b = Baggage::default(); + b.insert("foo", StringValue::from("1=1")); + assert_eq!("foo=1%3D1", b.to_string()); + + // "single member empty value with properties" + let mut b = Baggage::default(); + b.insert_with_metadata( + "foo", + StringValue::from(""), + BaggageMetadata::from("red;state=on"), + ); + assert_eq!("foo=;red;state=on", b.to_string()); + + // "single member with properties" + let mut b = Baggage::default(); + b.insert_with_metadata("foo", StringValue::from("1"), "red;state=on;z=z=z"); + assert_eq!("foo=1;red;state=on;z=z=z", b.to_string()); + + // "two members with properties" + let mut b = Baggage::default(); + b.insert_with_metadata("foo", StringValue::from("1"), "red;state=on"); + b.insert_with_metadata("bar", StringValue::from("2"), "yellow"); + assert!(b.to_string().contains("bar=2;yellow")); + assert!(b.to_string().contains("foo=1;red;state=on")); + } } diff -Nru temporalio-1.3.0/vendor/opentelemetry_api/src/common.rs temporalio-1.3.0/vendor/opentelemetry_api/src/common.rs --- temporalio-1.3.0/vendor/opentelemetry_api/src/common.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_api/src/common.rs 2023-10-30 19:40:00.000000000 +0000 @@ -88,7 +88,7 @@ impl From for Key { /// Convert a `String` to a `Key`. fn from(string: String) -> Self { - Key(OtelString::Owned(string)) + Key(OtelString::Owned(string.into_boxed_str())) } } @@ -99,6 +99,16 @@ } } +impl From> for Key { + /// Convert a `Cow<'static, str>` to a `Key` + fn from(string: Cow<'static, str>) -> Self { + match string { + Cow::Borrowed(s) => Key(OtelString::Static(s)), + Cow::Owned(s) => Key(OtelString::Owned(s.into_boxed_str())), + } + } +} + impl fmt::Debug for Key { fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { self.0.fmt(fmt) @@ -108,7 +118,7 @@ impl From for String { fn from(key: Key) -> Self { match key.0 { - OtelString::Owned(s) => s, + OtelString::Owned(s) => s.to_string(), OtelString::Static(s) => s.to_string(), OtelString::RefCounted(s) => s.to_string(), } @@ -127,8 +137,8 @@ #[derive(Clone, Debug, Eq)] enum OtelString { + Owned(Box), Static(&'static str), - Owned(String), RefCounted(Arc), } @@ -245,7 +255,7 @@ } /// Wrapper for string-like values -#[derive(Clone, PartialEq, Eq, Hash)] +#[derive(Clone, PartialEq, Eq, Hash, PartialOrd, Ord)] pub struct StringValue(OtelString); impl fmt::Debug for StringValue { @@ -280,7 +290,7 @@ impl From for String { fn from(s: StringValue) -> Self { match s.0 { - OtelString::Owned(s) => s, + OtelString::Owned(s) => s.to_string(), OtelString::Static(s) => s.to_string(), OtelString::RefCounted(s) => s.to_string(), } @@ -295,7 +305,7 @@ impl From for StringValue { fn from(s: String) -> Self { - StringValue(OtelString::Owned(s)) + StringValue(OtelString::Owned(s.into_boxed_str())) } } @@ -308,7 +318,7 @@ impl From> for StringValue { fn from(s: Cow<'static, str>) -> Self { match s { - Cow::Owned(s) => StringValue(OtelString::Owned(s)), + Cow::Owned(s) => StringValue(OtelString::Owned(s.into_boxed_str())), Cow::Borrowed(s) => StringValue(OtelString::Static(s)), } } @@ -426,7 +436,7 @@ /// See the [instrumentation libraries] spec for more information. /// /// [instrumentation libraries]: https://github.com/open-telemetry/opentelemetry-specification/blob/v1.9.0/specification/overview.md#instrumentation-libraries -#[derive(Debug, Default, Hash, Clone, PartialEq, Eq)] +#[derive(Debug, Default, Clone)] #[non_exhaustive] pub struct InstrumentationLibrary { /// The library name. @@ -442,6 +452,7 @@ /// let library = opentelemetry_api::InstrumentationLibrary::new( /// "my-crate", /// Some(env!("CARGO_PKG_VERSION")), + /// Some("https://opentelemetry.io/schemas/1.17.0"), /// None, /// ); /// ``` @@ -451,18 +462,43 @@ /// /// [Schema url]: https://github.com/open-telemetry/opentelemetry-specification/blob/v1.9.0/specification/schemas/overview.md#schema-url pub schema_url: Option>, + + /// Specifies the instrumentation scope attributes to associate with emitted telemetry. + pub attributes: Vec, +} + +// Uniqueness for InstrumentationLibrary/InstrumentationScope does not depend on attributes +impl Eq for InstrumentationLibrary {} + +impl PartialEq for InstrumentationLibrary { + fn eq(&self, other: &Self) -> bool { + self.name == other.name + && self.version == other.version + && self.schema_url == other.schema_url + } +} + +impl hash::Hash for InstrumentationLibrary { + fn hash(&self, state: &mut H) { + self.name.hash(state); + self.version.hash(state); + self.schema_url.hash(state); + } } impl InstrumentationLibrary { /// Create an new instrumentation library. - pub fn new(name: T, version: Option, schema_url: Option) -> InstrumentationLibrary - where - T: Into>, - { + pub fn new( + name: impl Into>, + version: Option>>, + schema_url: Option>>, + attributes: Option>, + ) -> InstrumentationLibrary { InstrumentationLibrary { name: name.into(), version: version.map(Into::into), schema_url: schema_url.map(Into::into), + attributes: attributes.unwrap_or_default(), } } } diff -Nru temporalio-1.3.0/vendor/opentelemetry_api/src/context.rs temporalio-1.3.0/vendor/opentelemetry_api/src/context.rs --- temporalio-1.3.0/vendor/opentelemetry_api/src/context.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_api/src/context.rs 2023-10-30 19:40:00.000000000 +0000 @@ -8,7 +8,6 @@ thread_local! { static CURRENT_CONTEXT: RefCell = RefCell::new(Context::default()); - static DEFAULT_CONTEXT: Context = Context::default(); } /// An execution-scoped collection of values. @@ -107,7 +106,19 @@ /// do_work() /// ``` pub fn current() -> Self { - get_current(|cx| cx.clone()) + Context::map_current(|cx| cx.clone()) + } + + /// Applys a function to the current context returning its value. + /// + /// This can be used to build higher performing algebraic expressions for + /// optionally creating a new context without the overhead of cloning the + /// current one and dropping it. + /// + /// Note: This function will panic if you attempt to attach another context + /// while the current one is still borrowed. + pub fn map_current(f: impl FnOnce(&Context) -> T) -> T { + CURRENT_CONTEXT.with(|cx| f(&cx.borrow())) } /// Returns a clone of the current thread's context with the given value. @@ -318,16 +329,6 @@ } } -/// Executes a closure with a reference to this thread's current context. -/// -/// Note: This function will panic if you attempt to attach another context -/// while the context is still borrowed. -fn get_current T, T>(mut f: F) -> T { - CURRENT_CONTEXT - .try_with(|cx| f(&cx.borrow())) - .unwrap_or_else(|_| DEFAULT_CONTEXT.with(|cx| f(cx))) -} - /// With TypeIds as keys, there's no need to hash them. They are already hashes /// themselves, coming from the compiler. The IdHasher holds the u64 of /// the TypeId, and then returns it, instead of doing any bit fiddling. @@ -373,11 +374,23 @@ let current = Context::current(); assert_eq!(current.get(), Some(&ValueA("a"))); assert_eq!(current.get(), Some(&ValueB(42))); + + assert!(Context::map_current(|cx| { + assert_eq!(cx.get(), Some(&ValueA("a"))); + assert_eq!(cx.get(), Some(&ValueB(42))); + true + })); } // Resets to only value `a` when inner guard is dropped let current = Context::current(); assert_eq!(current.get(), Some(&ValueA("a"))); assert_eq!(current.get::(), None); + + assert!(Context::map_current(|cx| { + assert_eq!(cx.get(), Some(&ValueA("a"))); + assert_eq!(cx.get::(), None); + true + })); } } diff -Nru temporalio-1.3.0/vendor/opentelemetry_api/src/global/error_handler.rs temporalio-1.3.0/vendor/opentelemetry_api/src/global/error_handler.rs --- temporalio-1.3.0/vendor/opentelemetry_api/src/global/error_handler.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_api/src/global/error_handler.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,6 +1,8 @@ use std::sync::PoisonError; use std::sync::RwLock; +#[cfg(feature = "logs")] +use crate::logs::LogError; #[cfg(feature = "metrics")] use crate::metrics::MetricsError; #[cfg(feature = "trace")] @@ -23,6 +25,13 @@ #[error(transparent)] /// An issue raised by the metrics module. Metric(#[from] MetricsError), + + #[cfg(feature = "logs")] + #[cfg_attr(docsrs, doc(cfg(feature = "logs")))] + #[error(transparent)] + /// Failed to export logs. + Log(#[from] LogError), + #[error("{0}")] /// Other types of failures not covered by the variants above. Other(String), @@ -49,6 +58,9 @@ #[cfg(feature = "trace")] #[cfg_attr(docsrs, doc(cfg(feature = "trace")))] Error::Trace(err) => eprintln!("OpenTelemetry trace error occurred. {}", err), + #[cfg(feature = "logs")] + #[cfg_attr(docsrs, doc(cfg(feature = "logs")))] + Error::Log(err) => eprintln!("OpenTelemetry log error occurred. {}", err), Error::Other(err_msg) => eprintln!("OpenTelemetry error occurred. {}", err_msg), }, } diff -Nru temporalio-1.3.0/vendor/opentelemetry_api/src/global/logs.rs temporalio-1.3.0/vendor/opentelemetry_api/src/global/logs.rs --- temporalio-1.3.0/vendor/opentelemetry_api/src/global/logs.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_api/src/global/logs.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,136 @@ +use std::{ + borrow::Cow, + fmt, mem, + sync::{Arc, RwLock}, +}; + +use once_cell::sync::Lazy; + +use crate::{ + logs::{Logger, LoggerProvider, NoopLoggerProvider}, + InstrumentationLibrary, +}; + +/// Allows a specific [`LoggerProvider`] to be used generically, by mirroring +/// the interface, and boxing the returned types. +/// +/// [`LoggerProvider`]: crate::logs::LoggerProvider. +pub trait ObjectSafeLoggerProvider { + /// Creates a versioned named [`Logger`] instance that is a trait object + /// through the underlying [`LoggerProvider`]. + /// + /// [`Logger`]: crate::logs::Logger + /// [`LoggerProvider`]: crate::logs::LoggerProvider + fn boxed_logger( + &self, + library: Arc, + ) -> Box; +} + +impl ObjectSafeLoggerProvider for P +where + L: Logger + Send + Sync + 'static, + P: LoggerProvider, +{ + fn boxed_logger( + &self, + library: Arc, + ) -> Box { + Box::new(self.library_logger(library)) + } +} + +pub struct BoxedLogger(Box); + +impl fmt::Debug for BoxedLogger { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.write_str("BoxedLogger") + } +} + +impl Logger for BoxedLogger { + fn emit(&self, record: crate::logs::LogRecord) { + self.0.emit(record) + } + + #[cfg(feature = "logs_level_enabled")] + fn event_enabled(&self, level: crate::logs::Severity, target: &str) -> bool { + self.0.event_enabled(level, target) + } +} + +#[derive(Clone)] +/// Represents the globally configured [`LoggerProvider`] instance. +pub struct GlobalLoggerProvider { + provider: Arc, +} + +impl fmt::Debug for GlobalLoggerProvider { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.write_str("GlobalLoggerProvider") + } +} + +impl GlobalLoggerProvider { + fn new< + L: Logger + Send + Sync + 'static, + P: LoggerProvider + Send + Sync + 'static, + >( + provider: P, + ) -> Self { + GlobalLoggerProvider { + provider: Arc::new(provider), + } + } +} + +impl LoggerProvider for GlobalLoggerProvider { + type Logger = BoxedLogger; + + fn library_logger(&self, library: Arc) -> Self::Logger { + BoxedLogger(self.provider.boxed_logger(library)) + } +} + +static GLOBAL_LOGGER_PROVIDER: Lazy> = + Lazy::new(|| RwLock::new(GlobalLoggerProvider::new(NoopLoggerProvider::new()))); + +/// Returns an instance of the currently configured global [`LoggerProvider`] +/// through [`GlobalLoggerProvider`]. +/// +/// [`LoggerProvider`]: crate::logs::LoggerProvider +pub fn logger_provider() -> GlobalLoggerProvider { + GLOBAL_LOGGER_PROVIDER + .read() + .expect("GLOBAL_LOGGER_PROVIDER RwLock poisoned") + .clone() +} + +/// Creates a named instance of [`Logger`] via the configured +/// [`GlobalLoggerProvider`]. +/// +/// If `name` is an empty string, the provider will use a default name. +/// +/// [`Logger`]: crate::logs::Logger +pub fn logger(name: Cow<'static, str>) -> BoxedLogger { + logger_provider().logger(name) +} + +/// Sets the given [`LoggerProvider`] instance as the current global provider, +/// returning the [`LoggerProvider`] instance that was previously set as global +/// provider. +pub fn set_logger_provider(new_provider: P) -> GlobalLoggerProvider +where + L: Logger + Send + Sync + 'static, + P: LoggerProvider + Send + Sync + 'static, +{ + let mut provider = GLOBAL_LOGGER_PROVIDER + .write() + .expect("GLOBAL_LOGGER_PROVIDER RwLock poisoned"); + mem::replace(&mut *provider, GlobalLoggerProvider::new(new_provider)) +} + +/// Shut down the current global [`LoggerProvider`]. +pub fn shutdown_logger_provider() { + let _ = set_logger_provider(NoopLoggerProvider::new()); +} diff -Nru temporalio-1.3.0/vendor/opentelemetry_api/src/global/metrics.rs temporalio-1.3.0/vendor/opentelemetry_api/src/global/metrics.rs --- temporalio-1.3.0/vendor/opentelemetry_api/src/global/metrics.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_api/src/global/metrics.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,7 +1,11 @@ use crate::metrics::{self, Meter, MeterProvider}; +use crate::KeyValue; use core::fmt; use once_cell::sync::Lazy; -use std::sync::{Arc, RwLock}; +use std::{ + borrow::Cow, + sync::{Arc, RwLock}, +}; /// The global `Meter` provider singleton. static GLOBAL_METER_PROVIDER: Lazy> = Lazy::new(|| { @@ -10,11 +14,41 @@ )) }); +/// Allows a specific [MeterProvider] to be used generically by the +/// [GlobalMeterProvider] by mirroring the interface and boxing the return types. +pub trait ObjectSafeMeterProvider { + /// Creates a versioned named meter instance that is a trait object through the underlying + /// [MeterProvider]. + fn versioned_meter_cow( + &self, + name: Cow<'static, str>, + version: Option>, + schema_url: Option>, + attributes: Option>, + ) -> Meter; +} + +impl

ObjectSafeMeterProvider for P +where + P: MeterProvider, +{ + /// Return a versioned boxed tracer + fn versioned_meter_cow( + &self, + name: Cow<'static, str>, + version: Option>, + schema_url: Option>, + attributes: Option>, + ) -> Meter { + self.versioned_meter(name, version, schema_url, attributes) + } +} + /// Represents the globally configured [`MeterProvider`] instance for this /// application. #[derive(Clone)] pub struct GlobalMeterProvider { - provider: Arc, + provider: Arc, } impl fmt::Debug for GlobalMeterProvider { @@ -26,11 +60,17 @@ impl MeterProvider for GlobalMeterProvider { fn versioned_meter( &self, - name: &'static str, - version: Option<&'static str>, - schema_url: Option<&'static str>, + name: impl Into>, + version: Option>>, + schema_url: Option>>, + attributes: Option>, ) -> Meter { - self.provider.versioned_meter(name, version, schema_url) + self.provider.versioned_meter_cow( + name.into(), + version.map(Into::into), + schema_url.map(Into::into), + attributes, + ) } } @@ -71,9 +111,9 @@ /// /// If the name is an empty string, the provider will use a default name. /// -/// This is a more convenient way of expressing `global::meter_provider().meter(name, None, None)`. -pub fn meter(name: &'static str) -> Meter { - meter_provider().versioned_meter(name, None, None) +/// This is a more convenient way of expressing `global::meter_provider().versioned_meter(name, None, None, None)`. +pub fn meter(name: impl Into>) -> Meter { + meter_provider().meter(name.into()) } /// Creates a [`Meter`] with the name, version and schema url. @@ -82,17 +122,31 @@ /// - version specifies the version of the instrumentation scope if the scope has a version /// - schema url specifies the Schema URL that should be recorded in the emitted telemetry. /// -/// This is a convenient way of `global::meter_provider().meter(...)` +/// This is a convenient way of `global::meter_provider().versioned_meter(...)` +/// /// # Example -/// ```rust -/// use opentelemetry_api::global::meter_with_version; -/// let meter = meter_with_version("io.opentelemetry", Some("0.17"), Some("https://opentelemetry.io/schemas/1.2.0")); +/// /// ``` +/// use opentelemetry_api::global::meter_with_version; +/// use opentelemetry_api::KeyValue; /// +/// let meter = meter_with_version( +/// "io.opentelemetry", +/// Some("0.17"), +/// Some("https://opentelemetry.io/schemas/1.2.0"), +/// Some(vec![KeyValue::new("key", "value")]), +/// ); +/// ``` pub fn meter_with_version( - name: &'static str, - version: Option<&'static str>, - schema_url: Option<&'static str>, + name: impl Into>, + version: Option>>, + schema_url: Option>>, + attributes: Option>, ) -> Meter { - meter_provider().versioned_meter(name, version, schema_url) + meter_provider().versioned_meter( + name.into(), + version.map(Into::into), + schema_url.map(Into::into), + attributes, + ) } diff -Nru temporalio-1.3.0/vendor/opentelemetry_api/src/global/mod.rs temporalio-1.3.0/vendor/opentelemetry_api/src/global/mod.rs --- temporalio-1.3.0/vendor/opentelemetry_api/src/global/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_api/src/global/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -59,6 +59,7 @@ //! let tracer = global::tracer_provider().versioned_tracer( //! "my-library-name", //! Some(env!("CARGO_PKG_VERSION")), +//! Some("https://opentelemetry.io/schemas/1.17.0"), //! None, //! ); //! @@ -91,7 +92,7 @@ //! # #[cfg(feature="metrics")] //! # { //! use opentelemetry_api::metrics::{Meter, noop::NoopMeterProvider}; -//! use opentelemetry_api::{global, Context, KeyValue}; +//! use opentelemetry_api::{global, KeyValue}; //! //! fn init_meter() { //! let provider = NoopMeterProvider::new(); @@ -105,10 +106,9 @@ //! // Then you can get a named tracer instance anywhere in your codebase. //! let meter = global::meter("my-component"); //! let counter = meter.u64_counter("my_counter").init(); -//! let cx = Context::current(); //! //! // record metrics -//! counter.add(&cx, 1, &[KeyValue::new("mykey", "myvalue")]); +//! counter.add(1, &[KeyValue::new("mykey", "myvalue")]); //! } //! //! // in main or other app start @@ -122,17 +122,16 @@ //! ``` //! # #[cfg(feature="metrics")] //! # { -//! use opentelemetry_api::{global, Context, KeyValue}; +//! use opentelemetry_api::{global, KeyValue}; //! //! pub fn my_traced_library_function() { //! // End users of your library will configure their global meter provider //! // so you can use the global meter without any setup //! let tracer = global::meter("my-library-name"); //! let counter = tracer.u64_counter("my_counter").init(); -//! let cx = Context::current(); //! //! // record metrics -//! counter.add(&cx, 1, &[KeyValue::new("mykey", "myvalue")]); +//! counter.add(1, &[KeyValue::new("mykey", "myvalue")]); //! } //! # } //! ``` @@ -141,6 +140,8 @@ //! [`set_meter_provider`]: crate::global::set_meter_provider mod error_handler; +#[cfg(feature = "logs")] +mod logs; #[cfg(feature = "metrics")] mod metrics; #[cfg(feature = "trace")] @@ -149,17 +150,18 @@ mod trace; pub use error_handler::{handle_error, set_error_handler, Error}; +#[cfg(feature = "logs")] +#[cfg_attr(docsrs, doc(cfg(feature = "logs")))] +pub use logs::{ + logger, logger_provider, set_logger_provider, shutdown_logger_provider, GlobalLoggerProvider, + ObjectSafeLoggerProvider, +}; #[cfg(feature = "metrics")] #[cfg_attr(docsrs, doc(cfg(feature = "metrics")))] -pub use metrics::{ - meter, meter_provider, meter_with_version, set_meter_provider, GlobalMeterProvider, -}; +pub use metrics::*; #[cfg(feature = "trace")] #[cfg_attr(docsrs, doc(cfg(feature = "trace")))] -pub use propagation::{get_text_map_propagator, set_text_map_propagator}; +pub use propagation::*; #[cfg(feature = "trace")] #[cfg_attr(docsrs, doc(cfg(feature = "trace")))] -pub use trace::{ - set_tracer_provider, shutdown_tracer_provider, tracer, tracer_provider, BoxedSpan, BoxedTracer, - GlobalTracerProvider, ObjectSafeTracer, ObjectSafeTracerProvider, -}; +pub use trace::*; diff -Nru temporalio-1.3.0/vendor/opentelemetry_api/src/global/trace.rs temporalio-1.3.0/vendor/opentelemetry_api/src/global/trace.rs --- temporalio-1.3.0/vendor/opentelemetry_api/src/global/trace.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_api/src/global/trace.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,4 +1,5 @@ use crate::trace::{noop::NoopTracerProvider, SpanContext, Status}; +use crate::InstrumentationLibrary; use crate::{trace, trace::TracerProvider, Context, KeyValue}; use once_cell::sync::Lazy; use std::borrow::Cow; @@ -7,6 +8,8 @@ use std::sync::{Arc, RwLock}; use std::time::SystemTime; +/// Allows a specific [`crate::trace::Span`] to be used generically by [`BoxedSpan`] +/// instances by mirroring the interface and boxing the return types. pub trait ObjectSafeSpan { /// An API to record events at a specific time in the context of a given `Span`. /// @@ -101,7 +104,7 @@ /// /// For more details, refer to [`Span::end`] /// - /// [`Span::end`]: Span::end() + /// [`Span::end`]: trace::Span::end fn end_with_timestamp(&mut self, timestamp: SystemTime); } @@ -226,6 +229,13 @@ /// [`GlobalTracerProvider`]: crate::global::GlobalTracerProvider pub struct BoxedTracer(Box); +impl BoxedTracer { + /// Create a `BoxedTracer` from an object-safe tracer. + pub fn new(tracer: Box) -> Self { + BoxedTracer(tracer) + } +} + impl fmt::Debug for BoxedTracer { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.write_str("BoxedTracer") @@ -281,11 +291,9 @@ pub trait ObjectSafeTracerProvider { /// Creates a versioned named tracer instance that is a trait object through the underlying /// `TracerProvider`. - fn versioned_tracer_boxed( + fn boxed_tracer( &self, - name: Cow<'static, str>, - version: Option<&'static str>, - schema_url: Option<&'static str>, + library: Arc, ) -> Box; } @@ -296,13 +304,11 @@ P: trace::TracerProvider, { /// Return a versioned boxed tracer - fn versioned_tracer_boxed( + fn boxed_tracer( &self, - name: Cow<'static, str>, - version: Option<&'static str>, - schema_url: Option<&'static str>, + library: Arc, ) -> Box { - Box::new(self.versioned_tracer(name, version, schema_url)) + Box::new(self.library_tracer(library)) } } @@ -339,17 +345,9 @@ impl trace::TracerProvider for GlobalTracerProvider { type Tracer = BoxedTracer; - /// Create a versioned tracer using the global provider. - fn versioned_tracer( - &self, - name: impl Into>, - version: Option<&'static str>, - schema_url: Option<&'static str>, - ) -> Self::Tracer { - BoxedTracer( - self.provider - .versioned_tracer_boxed(name.into(), version, schema_url), - ) + /// Create a tracer using the global provider. + fn library_tracer(&self, library: Arc) -> Self::Tracer { + BoxedTracer(self.provider.boxed_tracer(library)) } } diff -Nru temporalio-1.3.0/vendor/opentelemetry_api/src/lib.rs temporalio-1.3.0/vendor/opentelemetry_api/src/lib.rs --- temporalio-1.3.0/vendor/opentelemetry_api/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_api/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -2,7 +2,7 @@ //! services to capture distributed traces and metrics from your application. You //! can analyze them using [Prometheus], [Jaeger], and other observability tools. //! -//! *Compiler support: [requires `rustc` 1.56+][msrv]* +//! *Compiler support: [requires `rustc` 1.60+][msrv]* //! //! [Prometheus]: https://prometheus.io //! [Jaeger]: https://www.jaegertracing.io @@ -11,7 +11,7 @@ //! ## Supported Rust Versions //! //! OpenTelemetry is built against the latest stable release. The minimum -//! supported version is 1.56. The current OpenTelemetry version is not +//! supported version is 1.60. The current OpenTelemetry version is not //! guaranteed to build on Rust versions earlier than the minimum supported //! version. //! @@ -51,6 +51,10 @@ mod common; +mod order_map; + +pub use order_map::OrderMap; + #[cfg(any(feature = "testing", test))] #[doc(hidden)] pub mod testing; @@ -59,10 +63,6 @@ #[cfg(feature = "metrics")] #[cfg_attr(docsrs, doc(cfg(feature = "metrics")))] -pub mod attributes; - -#[cfg(feature = "metrics")] -#[cfg_attr(docsrs, doc(cfg(feature = "metrics")))] pub mod metrics; pub mod propagation; @@ -71,19 +71,26 @@ #[cfg_attr(docsrs, doc(cfg(feature = "trace")))] pub mod trace; +#[cfg(feature = "logs")] +#[cfg_attr(docsrs, doc(cfg(feature = "logs")))] +pub mod logs; + #[doc(hidden)] #[cfg(any(feature = "metrics", feature = "trace"))] pub mod time { use std::time::SystemTime; #[doc(hidden)] - #[cfg(not(target_arch = "wasm32"))] + #[cfg(any( + not(target_arch = "wasm32"), + all(target_arch = "wasm32", target_os = "wasi") + ))] pub fn now() -> SystemTime { SystemTime::now() } #[doc(hidden)] - #[cfg(target_arch = "wasm32")] + #[cfg(all(target_arch = "wasm32", not(target_os = "wasi")))] pub fn now() -> SystemTime { SystemTime::UNIX_EPOCH + std::time::Duration::from_millis(js_sys::Date::now() as u64) } diff -Nru temporalio-1.3.0/vendor/opentelemetry_api/src/logs/logger.rs temporalio-1.3.0/vendor/opentelemetry_api/src/logs/logger.rs --- temporalio-1.3.0/vendor/opentelemetry_api/src/logs/logger.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_api/src/logs/logger.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,75 @@ +use std::{borrow::Cow, sync::Arc}; + +use crate::{logs::LogRecord, InstrumentationLibrary, KeyValue}; + +#[cfg(feature = "logs_level_enabled")] +use super::Severity; + +/// The interface for emitting [`LogRecord`]s. + +pub trait Logger { + /// Emit a [`LogRecord`]. If there is active current thread's [`Context`], + /// the logger will set the record's [`TraceContext`] to the active trace context, + /// + /// [`Context`]: crate::Context + /// [`TraceContext`]: crate::logs::TraceContext + fn emit(&self, record: LogRecord); + + #[cfg(feature = "logs_level_enabled")] + /// Check if the given log level is enabled. + fn event_enabled(&self, level: Severity, target: &str) -> bool; +} + +/// Interfaces that can create [`Logger`] instances. +pub trait LoggerProvider { + /// The [`Logger`] type that this provider will return. + type Logger: Logger; + + /// Returns a new versioned logger with a given name. + /// + /// The `name` should be the application name or the name of the library + /// providing instrumentation. If the name is empty, then an + /// implementation-defined default name may be used instead. + fn versioned_logger( + &self, + name: impl Into>, + version: Option>, + schema_url: Option>, + attributes: Option>, + ) -> Self::Logger { + self.library_logger(Arc::new(InstrumentationLibrary::new( + name, version, schema_url, attributes, + ))) + } + + /// Returns a new versioned logger with the given instrumentation library. + /// + /// # Examples + /// + /// ``` + /// use opentelemetry_api::{global, InstrumentationLibrary, logs::LoggerProvider}; + /// + /// let provider = global::logger_provider(); + /// + /// // logger used in applications/binaries + /// let logger = provider.logger("my_app"); + /// // logger used in libraries/crates that optionally includes version and schema url + /// let library = std::sync::Arc::new(InstrumentationLibrary::new( + /// env!("CARGO_PKG_NAME"), + /// Some(env!("CARGO_PKG_VERSION")), + /// Some("https://opentelemetry.io/schema/1.0.0"), + /// None, + /// )); + /// let logger = provider.library_logger(library); + /// ``` + fn library_logger(&self, library: Arc) -> Self::Logger; + + /// Returns a new logger with the given name. + /// + /// The `name` should be the application name or the name of the library + /// providing instrumentation. If the name is empty, then an + /// implementation-defined default name may be used instead. + fn logger(&self, name: impl Into>) -> Self::Logger { + self.versioned_logger(name, None, None, None) + } +} diff -Nru temporalio-1.3.0/vendor/opentelemetry_api/src/logs/mod.rs temporalio-1.3.0/vendor/opentelemetry_api/src/logs/mod.rs --- temporalio-1.3.0/vendor/opentelemetry_api/src/logs/mod.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_api/src/logs/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,72 @@ +//! # OpenTelemetry Logs API + +use crate::ExportError; +use futures_channel::{mpsc::TrySendError, oneshot::Canceled}; +use std::time::Duration; +use thiserror::Error; + +mod logger; +mod noop; +mod record; + +pub use logger::{Logger, LoggerProvider}; +pub use noop::NoopLoggerProvider; +pub use record::{AnyValue, LogRecord, LogRecordBuilder, Severity, TraceContext}; + +/// Describe the result of operations in log SDK. +pub type LogResult = Result; + +#[derive(Error, Debug)] +#[non_exhaustive] +/// Errors returned by the log SDK. +pub enum LogError { + /// Export failed with the error returned by the exporter. + #[error("Exporter {} encountered the following errors: {0}", .0.exporter_name())] + ExportFailed(Box), + + /// Export failed to finish after certain period and processor stopped the export. + #[error("Exporter timed out after {} seconds", .0.as_secs())] + ExportTimedOut(Duration), + + /// Other errors propagated from log SDK that weren't covered above. + #[error(transparent)] + Other(#[from] Box), +} + +impl From for LogError +where + T: ExportError, +{ + fn from(err: T) -> Self { + LogError::ExportFailed(Box::new(err)) + } +} + +impl From> for LogError { + fn from(err: TrySendError) -> Self { + LogError::Other(Box::new(err.into_send_error())) + } +} + +impl From for LogError { + fn from(err: Canceled) -> Self { + LogError::Other(Box::new(err)) + } +} + +impl From for LogError { + fn from(err_msg: String) -> Self { + LogError::Other(Box::new(Custom(err_msg))) + } +} + +impl From<&'static str> for LogError { + fn from(err_msg: &'static str) -> Self { + LogError::Other(Box::new(Custom(err_msg.into()))) + } +} + +/// Wrap type for string +#[derive(Error, Debug)] +#[error("{0}")] +struct Custom(String); diff -Nru temporalio-1.3.0/vendor/opentelemetry_api/src/logs/noop.rs temporalio-1.3.0/vendor/opentelemetry_api/src/logs/noop.rs --- temporalio-1.3.0/vendor/opentelemetry_api/src/logs/noop.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_api/src/logs/noop.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,47 @@ +use std::{borrow::Cow, sync::Arc}; + +use crate::{ + logs::{LogRecord, Logger, LoggerProvider}, + InstrumentationLibrary, KeyValue, +}; + +/// A no-op implementation of a [`LoggerProvider`]. +#[derive(Clone, Debug, Default)] +pub struct NoopLoggerProvider(()); + +impl NoopLoggerProvider { + /// Create a new no-op logger provider. + pub fn new() -> Self { + NoopLoggerProvider(()) + } +} + +impl LoggerProvider for NoopLoggerProvider { + type Logger = NoopLogger; + + fn library_logger(&self, _library: Arc) -> Self::Logger { + NoopLogger(()) + } + + fn versioned_logger( + &self, + _name: impl Into>, + _version: Option>, + _schema_url: Option>, + _attributes: Option>, + ) -> Self::Logger { + NoopLogger(()) + } +} + +/// A no-op implementation of a [`Logger`] +#[derive(Clone, Debug)] +pub struct NoopLogger(()); + +impl Logger for NoopLogger { + fn emit(&self, _record: LogRecord) {} + #[cfg(feature = "logs_level_enabled")] + fn event_enabled(&self, _level: super::Severity, _target: &str) -> bool { + true + } +} diff -Nru temporalio-1.3.0/vendor/opentelemetry_api/src/logs/record.rs temporalio-1.3.0/vendor/opentelemetry_api/src/logs/record.rs --- temporalio-1.3.0/vendor/opentelemetry_api/src/logs/record.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_api/src/logs/record.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,367 @@ +use crate::{ + trace::{SpanContext, SpanId, TraceContextExt, TraceFlags, TraceId}, + Array, Key, OrderMap, StringValue, Value, +}; +use std::{borrow::Cow, time::SystemTime}; + +#[derive(Debug, Clone, Default)] +#[non_exhaustive] +/// LogRecord represents all data carried by a log record, and +/// is provided to `LogExporter`s as input. +pub struct LogRecord { + /// Record timestamp + pub timestamp: Option, + + /// Timestamp for when the record was observed by OpenTelemetry + pub observed_timestamp: Option, + + /// Trace context for logs associated with spans + pub trace_context: Option, + + /// The original severity string from the source + pub severity_text: Option>, + /// The corresponding severity value, normalized + pub severity_number: Option, + + /// Record body + pub body: Option, + + /// Additional attributes associated with this record + pub attributes: Option>, +} + +impl LogRecord { + /// Create a [`LogRecordBuilder`] to create a new Log Record + pub fn builder() -> LogRecordBuilder { + LogRecordBuilder::new() + } +} + +/// TraceContext stores the trace data for logs that have an associated +/// span. +#[derive(Debug, Clone)] +#[non_exhaustive] +pub struct TraceContext { + /// Trace id + pub trace_id: TraceId, + /// Span Id + pub span_id: SpanId, + /// Trace flags + pub trace_flags: Option, +} + +impl From<&SpanContext> for TraceContext { + fn from(span_context: &SpanContext) -> Self { + TraceContext { + trace_id: span_context.trace_id(), + span_id: span_context.span_id(), + trace_flags: Some(span_context.trace_flags()), + } + } +} + +/// Value types for representing arbitrary values in a log record. +#[derive(Debug, Clone)] +pub enum AnyValue { + /// An integer value + Int(i64), + /// A double value + Double(f64), + /// A string value + String(StringValue), + /// A boolean value + Boolean(bool), + /// A byte array + Bytes(Vec), + /// An array of `Any` values + ListAny(Vec), + /// A map of string keys to `Any` values, arbitrarily nested. + Map(OrderMap), +} + +macro_rules! impl_trivial_from { + ($t:ty, $variant:path) => { + impl From<$t> for AnyValue { + fn from(val: $t) -> AnyValue { + $variant(val.into()) + } + } + }; +} + +impl_trivial_from!(i8, AnyValue::Int); +impl_trivial_from!(i16, AnyValue::Int); +impl_trivial_from!(i32, AnyValue::Int); +impl_trivial_from!(i64, AnyValue::Int); + +impl_trivial_from!(u8, AnyValue::Int); +impl_trivial_from!(u16, AnyValue::Int); +impl_trivial_from!(u32, AnyValue::Int); + +impl_trivial_from!(f64, AnyValue::Double); +impl_trivial_from!(f32, AnyValue::Double); + +impl_trivial_from!(String, AnyValue::String); +impl_trivial_from!(Cow<'static, str>, AnyValue::String); +impl_trivial_from!(&'static str, AnyValue::String); +impl_trivial_from!(StringValue, AnyValue::String); + +impl_trivial_from!(bool, AnyValue::Boolean); + +impl> FromIterator for AnyValue { + /// Creates an [`AnyValue::ListAny`] value from a sequence of `Into` values. + fn from_iter>(iter: I) -> Self { + AnyValue::ListAny(iter.into_iter().map(Into::into).collect()) + } +} + +impl, V: Into> FromIterator<(K, V)> for AnyValue { + /// Creates an [`AnyValue::Map`] value from a sequence of key-value pairs + /// that can be converted into a `Key` and `AnyValue` respectively. + fn from_iter>(iter: I) -> Self { + AnyValue::Map(OrderMap::from_iter( + iter.into_iter().map(|(k, v)| (k.into(), v.into())), + )) + } +} + +impl From for AnyValue { + fn from(value: Value) -> Self { + match value { + Value::Bool(b) => b.into(), + Value::I64(i) => i.into(), + Value::F64(f) => f.into(), + Value::String(s) => s.into(), + Value::Array(a) => match a { + Array::Bool(b) => AnyValue::from_iter(b), + Array::F64(f) => AnyValue::from_iter(f), + Array::I64(i) => AnyValue::from_iter(i), + Array::String(s) => AnyValue::from_iter(s), + }, + } + } +} + +/// A normalized severity value. +#[derive(Debug, Copy, Clone, PartialEq, Eq, Ord, PartialOrd)] +pub enum Severity { + /// TRACE + Trace = 1, + /// TRACE2 + Trace2 = 2, + /// TRACE3 + Trace3 = 3, + /// TRACE4 + Trace4 = 4, + /// DEBUG + Debug = 5, + /// DEBUG2 + Debug2 = 6, + /// DEBUG3 + Debug3 = 7, + /// DEBUG4 + Debug4 = 8, + /// INFO + Info = 9, + /// INFO2 + Info2 = 10, + /// INFO3 + Info3 = 11, + /// INFO4 + Info4 = 12, + /// WARN + Warn = 13, + /// WARN2 + Warn2 = 14, + /// WARN3 + Warn3 = 15, + /// WARN4 + Warn4 = 16, + /// ERROR + Error = 17, + /// ERROR2 + Error2 = 18, + /// ERROR3 + Error3 = 19, + /// ERROR4 + Error4 = 20, + /// FATAL + Fatal = 21, + /// FATAL2 + Fatal2 = 22, + /// FATAL3 + Fatal3 = 23, + /// FATAL4 + Fatal4 = 24, +} + +impl Severity { + /// Return the string representing the short name for the `Severity` + /// value as specified by the OpenTelemetry logs data model. + pub const fn name(&self) -> &'static str { + match &self { + Severity::Trace => "TRACE", + Severity::Trace2 => "TRACE2", + Severity::Trace3 => "TRACE3", + Severity::Trace4 => "TRACE4", + + Severity::Debug => "DEBUG", + Severity::Debug2 => "DEBUG2", + Severity::Debug3 => "DEBUG3", + Severity::Debug4 => "DEBUG4", + + Severity::Info => "INFO", + Severity::Info2 => "INFO2", + Severity::Info3 => "INFO3", + Severity::Info4 => "INFO4", + + Severity::Warn => "WARN", + Severity::Warn2 => "WARN2", + Severity::Warn3 => "WARN3", + Severity::Warn4 => "WARN4", + + Severity::Error => "ERROR", + Severity::Error2 => "ERROR2", + Severity::Error3 => "ERROR3", + Severity::Error4 => "ERROR4", + + Severity::Fatal => "FATAL", + Severity::Fatal2 => "FATAL2", + Severity::Fatal3 => "FATAL3", + Severity::Fatal4 => "FATAL4", + } + } +} + +/// A builder for [`LogRecord`] values. +#[derive(Debug, Clone)] +pub struct LogRecordBuilder { + record: LogRecord, +} + +impl LogRecordBuilder { + /// Create a new LogRecordBuilder + pub fn new() -> Self { + Self { + record: Default::default(), + } + } + + /// Assign timestamp + pub fn with_timestamp(self, timestamp: SystemTime) -> Self { + Self { + record: LogRecord { + timestamp: Some(timestamp), + ..self.record + }, + } + } + + /// Assign observed timestamp + pub fn with_observed_timestamp(self, timestamp: SystemTime) -> Self { + Self { + record: LogRecord { + observed_timestamp: Some(timestamp), + ..self.record + }, + } + } + + /// Assign the record's [`TraceContext`] + pub fn with_span_context(self, span_context: &SpanContext) -> Self { + Self { + record: LogRecord { + trace_context: Some(TraceContext { + span_id: span_context.span_id(), + trace_id: span_context.trace_id(), + trace_flags: Some(span_context.trace_flags()), + }), + ..self.record + }, + } + } + + /// Assign the record's [`TraceContext`] from a `TraceContextExt` trait + pub fn with_context(self, context: &T) -> Self + where + T: TraceContextExt, + { + if context.has_active_span() { + self.with_span_context(context.span().span_context()) + } else { + self + } + } + + /// Assign severity text + pub fn with_severity_text(self, severity: T) -> Self + where + T: Into>, + { + Self { + record: LogRecord { + severity_text: Some(severity.into()), + ..self.record + }, + } + } + + /// Assign severity number + pub fn with_severity_number(self, severity: Severity) -> Self { + Self { + record: LogRecord { + severity_number: Some(severity), + ..self.record + }, + } + } + + /// Assign body + pub fn with_body(self, body: AnyValue) -> Self { + Self { + record: LogRecord { + body: Some(body), + ..self.record + }, + } + } + + /// Assign attributes. + /// The SDK doesn't carry on any deduplication on these attributes. + pub fn with_attributes(self, attributes: Vec<(Key, AnyValue)>) -> Self { + Self { + record: LogRecord { + attributes: Some(attributes), + ..self.record + }, + } + } + + /// Set a single attribute for this record. + /// The SDK doesn't carry on any deduplication on these attributes. + pub fn with_attribute(mut self, key: K, value: V) -> Self + where + K: Into, + V: Into, + { + if let Some(ref mut vec) = self.record.attributes { + vec.push((key.into(), value.into())); + } else { + let vec = vec![(key.into(), value.into())]; + self.record.attributes = Some(vec); + } + + self + } + + /// Build the record, consuming the Builder + pub fn build(self) -> LogRecord { + self.record + } +} + +impl Default for LogRecordBuilder { + fn default() -> Self { + Self::new() + } +} diff -Nru temporalio-1.3.0/vendor/opentelemetry_api/src/metrics/instruments/counter.rs temporalio-1.3.0/vendor/opentelemetry_api/src/metrics/instruments/counter.rs --- temporalio-1.3.0/vendor/opentelemetry_api/src/metrics/instruments/counter.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_api/src/metrics/instruments/counter.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,15 +1,15 @@ use crate::{ - metrics::{InstrumentBuilder, MetricsError}, - Context, KeyValue, + metrics::{AsyncInstrument, AsyncInstrumentBuilder, InstrumentBuilder, MetricsError}, + KeyValue, }; use core::fmt; -use std::convert::TryFrom; use std::sync::Arc; +use std::{any::Any, convert::TryFrom}; /// An SDK implemented instrument that records increasing values. pub trait SyncCounter { /// Records an increment to the counter. - fn add(&self, cx: &Context, value: T, attributes: &[KeyValue]); + fn add(&self, value: T, attributes: &[KeyValue]); } /// An instrument that records increasing values. @@ -32,8 +32,8 @@ } /// Records an increment to the counter. - pub fn add(&self, cx: &Context, value: T, attributes: &[KeyValue]) { - self.0.add(cx, value, attributes) + pub fn add(&self, value: T, attributes: &[KeyValue]) { + self.0.add(value, attributes) } } @@ -61,22 +61,13 @@ } } -/// An SDK implemented async instrument that records increasing values. -pub trait AsyncCounter { - /// Records an increment to the counter. - /// - /// It is only valid to call this within a callback. If called outside of the - /// registered callback it should have no effect on the instrument, and an - /// error will be reported via the error handler. - fn observe(&self, cx: &Context, value: T, attributes: &[KeyValue]); -} - /// An async instrument that records increasing values. -pub struct ObservableCounter(Arc + Send + Sync>); +#[derive(Clone)] +pub struct ObservableCounter(Arc>); impl ObservableCounter { /// Create a new observable counter. - pub fn new(inner: Arc + Send + Sync>) -> Self { + pub fn new(inner: Arc>) -> Self { ObservableCounter(inner) } } @@ -96,35 +87,52 @@ /// It is only valid to call this within a callback. If called outside of the /// registered callback it should have no effect on the instrument, and an /// error will be reported via the error handler. - pub fn observe(&self, cx: &Context, value: T, attributes: &[KeyValue]) { - self.0.observe(cx, value, attributes) + pub fn observe(&self, value: T, attributes: &[KeyValue]) { + self.0.observe(value, attributes) + } + + /// Used for SDKs to downcast instruments in callbacks. + pub fn as_any(&self) -> Arc { + self.0.as_any() + } +} + +impl AsyncInstrument for ObservableCounter { + fn observe(&self, measurement: T, attributes: &[KeyValue]) { + self.0.observe(measurement, attributes) + } + + fn as_any(&self) -> Arc { + self.0.as_any() } } -impl TryFrom>> for ObservableCounter { +impl TryFrom, u64>> for ObservableCounter { type Error = MetricsError; fn try_from( - builder: InstrumentBuilder<'_, ObservableCounter>, + builder: AsyncInstrumentBuilder<'_, ObservableCounter, u64>, ) -> Result { builder.meter.instrument_provider.u64_observable_counter( builder.name, builder.description, builder.unit, + builder.callbacks, ) } } -impl TryFrom>> for ObservableCounter { +impl TryFrom, f64>> for ObservableCounter { type Error = MetricsError; fn try_from( - builder: InstrumentBuilder<'_, ObservableCounter>, + builder: AsyncInstrumentBuilder<'_, ObservableCounter, f64>, ) -> Result { builder.meter.instrument_provider.f64_observable_counter( builder.name, builder.description, builder.unit, + builder.callbacks, ) } } diff -Nru temporalio-1.3.0/vendor/opentelemetry_api/src/metrics/instruments/gauge.rs temporalio-1.3.0/vendor/opentelemetry_api/src/metrics/instruments/gauge.rs --- temporalio-1.3.0/vendor/opentelemetry_api/src/metrics/instruments/gauge.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_api/src/metrics/instruments/gauge.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,24 +1,14 @@ use crate::{ - metrics::{InstrumentBuilder, MetricsError}, - Context, KeyValue, + metrics::{AsyncInstrument, AsyncInstrumentBuilder, MetricsError}, + KeyValue, }; use core::fmt; -use std::convert::TryFrom; use std::sync::Arc; - -/// An SDK implemented instrument that records independent readings. -pub trait AsyncGauge: Send + Sync { - /// Records the state of the instrument. - /// - /// It is only valid to call this within a callback. If called outside of the - /// registered callback it should have no effect on the instrument, and an - /// error will be reported via the error handler. - fn observe(&self, cx: &Context, value: T, attributes: &[KeyValue]); -} +use std::{any::Any, convert::TryFrom}; /// An instrument that records independent readings. #[derive(Clone)] -pub struct ObservableGauge(Arc>); +pub struct ObservableGauge(Arc>); impl fmt::Debug for ObservableGauge where @@ -38,50 +28,74 @@ /// It is only valid to call this within a callback. If called outside of the /// registered callback it should have no effect on the instrument, and an /// error will be reported via the error handler. - pub fn observe(&self, cx: &Context, value: T, attributes: &[KeyValue]) { - self.0.observe(cx, value, attributes) + pub fn observe(&self, measurement: T, attributes: &[KeyValue]) { + self.0.observe(measurement, attributes) + } + + /// Used by SDKs to downcast instruments in callbacks. + pub fn as_any(&self) -> Arc { + self.0.as_any() + } +} + +impl AsyncInstrument for ObservableGauge { + fn observe(&self, measurement: M, attributes: &[KeyValue]) { + self.observe(measurement, attributes) + } + + fn as_any(&self) -> Arc { + self.0.as_any() } } impl ObservableGauge { /// Create a new gauge - pub fn new(inner: Arc>) -> Self { + pub fn new(inner: Arc>) -> Self { ObservableGauge(inner) } } -impl TryFrom>> for ObservableGauge { +impl TryFrom, u64>> for ObservableGauge { type Error = MetricsError; - fn try_from(builder: InstrumentBuilder<'_, ObservableGauge>) -> Result { + fn try_from( + builder: AsyncInstrumentBuilder<'_, ObservableGauge, u64>, + ) -> Result { builder.meter.instrument_provider.u64_observable_gauge( builder.name, builder.description, builder.unit, + builder.callbacks, ) } } -impl TryFrom>> for ObservableGauge { +impl TryFrom, f64>> for ObservableGauge { type Error = MetricsError; - fn try_from(builder: InstrumentBuilder<'_, ObservableGauge>) -> Result { + fn try_from( + builder: AsyncInstrumentBuilder<'_, ObservableGauge, f64>, + ) -> Result { builder.meter.instrument_provider.f64_observable_gauge( builder.name, builder.description, builder.unit, + builder.callbacks, ) } } -impl TryFrom>> for ObservableGauge { +impl TryFrom, i64>> for ObservableGauge { type Error = MetricsError; - fn try_from(builder: InstrumentBuilder<'_, ObservableGauge>) -> Result { + fn try_from( + builder: AsyncInstrumentBuilder<'_, ObservableGauge, i64>, + ) -> Result { builder.meter.instrument_provider.i64_observable_gauge( builder.name, builder.description, builder.unit, + builder.callbacks, ) } } diff -Nru temporalio-1.3.0/vendor/opentelemetry_api/src/metrics/instruments/histogram.rs temporalio-1.3.0/vendor/opentelemetry_api/src/metrics/instruments/histogram.rs --- temporalio-1.3.0/vendor/opentelemetry_api/src/metrics/instruments/histogram.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_api/src/metrics/instruments/histogram.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,6 +1,6 @@ use crate::{ metrics::{InstrumentBuilder, MetricsError}, - Context, KeyValue, + KeyValue, }; use core::fmt; use std::convert::TryFrom; @@ -9,7 +9,7 @@ /// An SDK implemented instrument that records a distribution of values. pub trait SyncHistogram { /// Adds an additional value to the distribution. - fn record(&self, cx: &Context, value: T, attributes: &[KeyValue]); + fn record(&self, value: T, attributes: &[KeyValue]); } /// An instrument that records a distribution of values. @@ -32,8 +32,8 @@ } /// Adds an additional value to the distribution. - pub fn record(&self, cx: &Context, value: T, attributes: &[KeyValue]) { - self.0.record(cx, value, attributes) + pub fn record(&self, value: T, attributes: &[KeyValue]) { + self.0.record(value, attributes) } } diff -Nru temporalio-1.3.0/vendor/opentelemetry_api/src/metrics/instruments/mod.rs temporalio-1.3.0/vendor/opentelemetry_api/src/metrics/instruments/mod.rs --- temporalio-1.3.0/vendor/opentelemetry_api/src/metrics/instruments/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_api/src/metrics/instruments/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,18 +1,43 @@ use crate::metrics::{Meter, MetricsError, Result, Unit}; +use crate::{global, KeyValue}; use core::fmt; +use std::any::Any; +use std::borrow::Cow; use std::convert::TryFrom; use std::marker; +use std::sync::Arc; pub(super) mod counter; pub(super) mod gauge; pub(super) mod histogram; pub(super) mod up_down_counter; -/// Configuration for building an instrument. +// instrument validation error strings +const INSTRUMENT_NAME_EMPTY: &str = "instrument name must be non-empty"; +const INSTRUMENT_NAME_LENGTH: &str = "instrument name must be less than 64 characters"; +const INSTRUMENT_NAME_INVALID_CHAR: &str = + "characters in instrument name must be ASCII and belong to the alphanumeric characters, '_', '.', and '-'"; +const INSTRUMENT_NAME_FIRST_ALPHABETIC: &str = + "instrument name must start with an alphabetic character"; +const INSTRUMENT_UNIT_LENGTH: &str = "instrument unit must be less than 64 characters"; +const INSTRUMENT_UNIT_INVALID_CHAR: &str = "characters in instrument unit must be ASCII"; + +/// An SDK implemented instrument that records measurements via callback. +pub trait AsyncInstrument: Send + Sync { + /// Observes the state of the instrument. + /// + /// It is only valid to call this within a callback. + fn observe(&self, measurement: T, attributes: &[KeyValue]); + + /// Used for SDKs to downcast instruments in callbacks. + fn as_any(&self) -> Arc; +} + +/// Configuration for building a sync instrument. pub struct InstrumentBuilder<'a, T> { meter: &'a Meter, - name: String, - description: Option, + name: Cow<'static, str>, + description: Option>, unit: Option, _marker: marker::PhantomData, } @@ -21,8 +46,8 @@ where T: TryFrom, { - /// Create a new counter builder - pub(crate) fn new(meter: &'a Meter, name: String) -> Self { + /// Create a new instrument builder + pub(crate) fn new(meter: &'a Meter, name: Cow<'static, str>) -> Self { InstrumentBuilder { meter, name, @@ -32,31 +57,75 @@ } } - /// Set the description for this counter - pub fn with_description>(mut self, description: S) -> Self { + /// Set the description for this instrument + pub fn with_description>>(mut self, description: S) -> Self { self.description = Some(description.into()); self } - /// Set the unit for this counter. + /// Set the unit for this instrument. + /// + /// Unit is case sensitive(`kb` is not the same as `kB`). + /// + /// Unit must be: + /// - ASCII string + /// - No longer than 63 characters pub fn with_unit(mut self, unit: Unit) -> Self { self.unit = Some(unit); self } - /// Creates a new counter instrument. + /// Validate the instrument configuration and creates a new instrument. pub fn try_init(self) -> Result { + self.validate_instrument_config() + .map_err(MetricsError::InvalidInstrumentConfiguration)?; T::try_from(self) } - /// Creates a new counter instrument. + /// Creates a new instrument. + /// + /// This method reports configuration errors but still returns the instrument. /// /// # Panics /// - /// This function panics if the instrument cannot be created. Use try_init if you want to - /// handle errors. + /// Panics if the instrument cannot be created. Use + /// [`try_init`](InstrumentBuilder::try_init) if you want to handle errors. pub fn init(self) -> T { - self.try_init().unwrap() + if let Err(err) = self.validate_instrument_config() { + global::handle_error(MetricsError::InvalidInstrumentConfiguration(err)); + } + + T::try_from(self).unwrap() + } + + fn validate_instrument_config(&self) -> std::result::Result<(), &'static str> { + // validate instrument name + if self.name.is_empty() { + return Err(INSTRUMENT_NAME_EMPTY); + } + if self.name.len() > 63 { + return Err(INSTRUMENT_NAME_LENGTH); + } + if self.name.starts_with(|c: char| !c.is_ascii_alphabetic()) { + return Err(INSTRUMENT_NAME_FIRST_ALPHABETIC); + } + if self + .name + .contains(|c: char| !c.is_ascii_alphanumeric() && c != '_' && c != '.' && c != '-') + { + return Err(INSTRUMENT_NAME_INVALID_CHAR); + } + + // validate instrument unit + if let Some(unit) = &self.unit { + if unit.as_str().len() > 63 { + return Err(INSTRUMENT_UNIT_LENGTH); + } + if unit.as_str().contains(|c: char| !c.is_ascii()) { + return Err(INSTRUMENT_UNIT_INVALID_CHAR); + } + } + Ok(()) } } @@ -70,3 +139,204 @@ .finish() } } + +/// A function registered with a [Meter] that makes observations for the +/// instruments it is registered with. +/// +/// The async instrument parameter is used to record measurement observations +/// for these instruments. +/// +/// The function needs to complete in a finite amount of time. +pub type Callback = Box) + Send + Sync>; + +/// Configuration for building an async instrument. +pub struct AsyncInstrumentBuilder<'a, I, M> +where + I: AsyncInstrument, +{ + meter: &'a Meter, + name: Cow<'static, str>, + description: Option>, + unit: Option, + _inst: marker::PhantomData, + callbacks: Vec>, +} + +impl<'a, I, M> AsyncInstrumentBuilder<'a, I, M> +where + I: TryFrom, + I: AsyncInstrument, +{ + /// Create a new instrument builder + pub(crate) fn new(meter: &'a Meter, name: Cow<'static, str>) -> Self { + AsyncInstrumentBuilder { + meter, + name, + description: None, + unit: None, + _inst: marker::PhantomData, + callbacks: Vec::new(), + } + } + + /// Set the description for this instrument + pub fn with_description>>(mut self, description: S) -> Self { + self.description = Some(description.into()); + self + } + + /// Set the unit for this instrument. + /// + /// Unit is case sensitive(`kb` is not the same as `kB`). + /// + /// Unit must be: + /// - ASCII string + /// - No longer than 63 characters + pub fn with_unit(mut self, unit: Unit) -> Self { + self.unit = Some(unit); + self + } + + /// Set the callback to be called for this instrument. + pub fn with_callback(mut self, callback: F) -> Self + where + F: Fn(&dyn AsyncInstrument) + Send + Sync + 'static, + { + self.callbacks.push(Box::new(callback)); + self + } + + /// Validate the instrument configuration and creates a new instrument. + pub fn try_init(self) -> Result { + self.validate_instrument_config() + .map_err(MetricsError::InvalidInstrumentConfiguration)?; + I::try_from(self) + } + + /// Creates a new instrument. + /// + /// This method reports configuration errors but still returns the instrument. + /// + /// # Panics + /// + /// Panics if the instrument cannot be created. Use + /// [`try_init`](InstrumentBuilder::try_init) if you want to handle errors. + pub fn init(self) -> I { + if let Err(err) = self.validate_instrument_config() { + global::handle_error(MetricsError::InvalidInstrumentConfiguration(err)); + } + + I::try_from(self).unwrap() + } + + fn validate_instrument_config(&self) -> std::result::Result<(), &'static str> { + // validate instrument name + if self.name.is_empty() { + return Err(INSTRUMENT_NAME_EMPTY); + } + if self.name.len() > 63 { + return Err(INSTRUMENT_NAME_LENGTH); + } + if self.name.starts_with(|c: char| !c.is_ascii_alphabetic()) { + return Err(INSTRUMENT_NAME_FIRST_ALPHABETIC); + } + if self + .name + .contains(|c: char| !c.is_ascii_alphanumeric() && c != '_' && c != '.' && c != '-') + { + return Err(INSTRUMENT_NAME_INVALID_CHAR); + } + + // validate instrument unit + if let Some(unit) = &self.unit { + if unit.as_str().len() > 63 { + return Err(INSTRUMENT_UNIT_LENGTH); + } + if unit.as_str().contains(|c: char| !c.is_ascii()) { + return Err(INSTRUMENT_UNIT_INVALID_CHAR); + } + } + Ok(()) + } +} + +impl fmt::Debug for AsyncInstrumentBuilder<'_, I, M> +where + I: AsyncInstrument, +{ + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_struct("InstrumentBuilder") + .field("name", &self.name) + .field("description", &self.description) + .field("unit", &self.unit) + .field("kind", &std::any::type_name::()) + .field("callbacks_len", &self.callbacks.len()) + .finish() + } +} + +#[cfg(test)] +mod tests { + use crate::metrics::instruments::{ + INSTRUMENT_NAME_FIRST_ALPHABETIC, INSTRUMENT_NAME_INVALID_CHAR, INSTRUMENT_NAME_LENGTH, + INSTRUMENT_UNIT_INVALID_CHAR, INSTRUMENT_UNIT_LENGTH, + }; + use crate::metrics::noop::NoopMeterCore; + use crate::metrics::{Counter, InstrumentBuilder, Unit}; + use std::sync::Arc; + + #[test] + fn test_instrument_config_validation() { + let meter = crate::metrics::Meter::new(Arc::new(NoopMeterCore::new())); + // (name, expected error) + let instrument_name_test_cases = vec![ + ("validateName", ""), + ("_startWithNoneAlphabet", INSTRUMENT_NAME_FIRST_ALPHABETIC), + ("utf8char锈", INSTRUMENT_NAME_INVALID_CHAR), + ( + "a12345678901234567890123456789012345678901234567890123456789012", + "", + ), + ( + "a123456789012345678901234567890123456789012345678901234567890123", + INSTRUMENT_NAME_LENGTH, + ), + ("invalid name", INSTRUMENT_NAME_INVALID_CHAR), + ]; + for (name, expected_error) in instrument_name_test_cases { + let builder: InstrumentBuilder<'_, Counter> = + InstrumentBuilder::new(&meter, name.into()); + if expected_error.is_empty() { + assert!(builder.validate_instrument_config().is_ok()); + } else { + assert_eq!( + builder.validate_instrument_config().unwrap_err(), + expected_error + ); + } + } + + // (unit, expected error) + let instrument_unit_test_cases = vec![ + ( + "0123456789012345678901234567890123456789012345678901234567890123", + INSTRUMENT_UNIT_LENGTH, + ), + ("utf8char锈", INSTRUMENT_UNIT_INVALID_CHAR), + ("kb", ""), + ]; + + for (unit, expected_error) in instrument_unit_test_cases { + let builder: InstrumentBuilder<'_, Counter> = + InstrumentBuilder::new(&meter, "test".into()).with_unit(Unit::new(unit)); + if expected_error.is_empty() { + assert!(builder.validate_instrument_config().is_ok()); + } else { + assert_eq!( + builder.validate_instrument_config().unwrap_err(), + expected_error + ); + } + } + } +} diff -Nru temporalio-1.3.0/vendor/opentelemetry_api/src/metrics/instruments/up_down_counter.rs temporalio-1.3.0/vendor/opentelemetry_api/src/metrics/instruments/up_down_counter.rs --- temporalio-1.3.0/vendor/opentelemetry_api/src/metrics/instruments/up_down_counter.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_api/src/metrics/instruments/up_down_counter.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,15 +1,17 @@ use crate::{ metrics::{InstrumentBuilder, MetricsError}, - Context, KeyValue, + KeyValue, }; use core::fmt; -use std::convert::TryFrom; use std::sync::Arc; +use std::{any::Any, convert::TryFrom}; + +use super::{AsyncInstrument, AsyncInstrumentBuilder}; /// An SDK implemented instrument that records increasing or decreasing values. pub trait SyncUpDownCounter { /// Records an increment or decrement to the counter. - fn add(&self, cx: &Context, value: T, attributes: &[KeyValue]); + fn add(&self, value: T, attributes: &[KeyValue]); } /// An instrument that records increasing or decreasing values. @@ -35,8 +37,8 @@ } /// Records an increment or decrement to the counter. - pub fn add(&self, cx: &Context, value: T, attributes: &[KeyValue]) { - self.0.add(cx, value, attributes) + pub fn add(&self, value: T, attributes: &[KeyValue]) { + self.0.add(value, attributes) } } @@ -64,19 +66,9 @@ } } -/// An SDK implemented async instrument that records increasing or decreasing values. -pub trait AsyncUpDownCounter { - /// Records the increment or decrement to the counter. - /// - /// It is only valid to call this within a callback. If called outside of the - /// registered callback it should have no effect on the instrument, and an - /// error will be reported via the error handler. - fn observe(&self, cx: &Context, value: T, attributes: &[KeyValue]); -} - /// An async instrument that records increasing or decreasing values. #[derive(Clone)] -pub struct ObservableUpDownCounter(Arc + Send + Sync>); +pub struct ObservableUpDownCounter(Arc>); impl fmt::Debug for ObservableUpDownCounter where @@ -92,7 +84,7 @@ impl ObservableUpDownCounter { /// Create a new observable up down counter. - pub fn new(inner: Arc + Send + Sync>) -> Self { + pub fn new(inner: Arc>) -> Self { ObservableUpDownCounter(inner) } @@ -101,33 +93,62 @@ /// It is only valid to call this within a callback. If called outside of the /// registered callback it should have no effect on the instrument, and an /// error will be reported via the error handler. - pub fn observe(&self, cx: &Context, value: T, attributes: &[KeyValue]) { - self.0.observe(cx, value, attributes) + pub fn observe(&self, value: T, attributes: &[KeyValue]) { + self.0.observe(value, attributes) + } + + /// Used for SDKs to downcast instruments in callbacks. + pub fn as_any(&self) -> Arc { + self.0.as_any() + } +} + +impl AsyncInstrument for ObservableUpDownCounter { + fn observe(&self, measurement: T, attributes: &[KeyValue]) { + self.0.observe(measurement, attributes) + } + + fn as_any(&self) -> Arc { + self.0.as_any() } } -impl TryFrom>> for ObservableUpDownCounter { +impl TryFrom, i64>> + for ObservableUpDownCounter +{ type Error = MetricsError; fn try_from( - builder: InstrumentBuilder<'_, ObservableUpDownCounter>, + builder: AsyncInstrumentBuilder<'_, ObservableUpDownCounter, i64>, ) -> Result { builder .meter .instrument_provider - .i64_observable_up_down_counter(builder.name, builder.description, builder.unit) + .i64_observable_up_down_counter( + builder.name, + builder.description, + builder.unit, + builder.callbacks, + ) } } -impl TryFrom>> for ObservableUpDownCounter { +impl TryFrom, f64>> + for ObservableUpDownCounter +{ type Error = MetricsError; fn try_from( - builder: InstrumentBuilder<'_, ObservableUpDownCounter>, + builder: AsyncInstrumentBuilder<'_, ObservableUpDownCounter, f64>, ) -> Result { builder .meter .instrument_provider - .f64_observable_up_down_counter(builder.name, builder.description, builder.unit) + .f64_observable_up_down_counter( + builder.name, + builder.description, + builder.unit, + builder.callbacks, + ) } } diff -Nru temporalio-1.3.0/vendor/opentelemetry_api/src/metrics/meter.rs temporalio-1.3.0/vendor/opentelemetry_api/src/metrics/meter.rs --- temporalio-1.3.0/vendor/opentelemetry_api/src/metrics/meter.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_api/src/metrics/meter.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,17 +1,34 @@ use core::fmt; +use std::any::Any; +use std::borrow::Cow; use std::sync::Arc; use crate::metrics::{ - Counter, Histogram, InstrumentBuilder, InstrumentProvider, MetricsError, ObservableCounter, - ObservableGauge, ObservableUpDownCounter, UpDownCounter, + AsyncInstrumentBuilder, Counter, Histogram, InstrumentBuilder, InstrumentProvider, + ObservableCounter, ObservableGauge, ObservableUpDownCounter, Result, UpDownCounter, }; -use crate::{Context, InstrumentationLibrary}; +use crate::KeyValue; -/// Returns named meter instances +use super::AsyncInstrument; + +/// Provides access to named [Meter] instances, for instrumenting an application +/// or crate. pub trait MeterProvider { - /// Creates a named [`Meter`] instance. - fn meter(&self, name: &'static str) -> Meter { - self.versioned_meter(name, None, None) + /// Returns a new [Meter] with the provided name and default configuration. + /// + /// A [Meter] should be scoped at most to a single application or crate. The + /// name needs to be unique so it does not collide with other names used by + /// an application, nor other applications. + /// + /// If the name is empty, then an implementation defined default name will + /// be used instead. + fn meter(&self, name: impl Into>) -> Meter { + self.versioned_meter( + name, + None::>, + None::>, + None, + ) } /// Creates an implementation of the [`Meter`] interface. @@ -22,61 +39,64 @@ /// default name will be used instead. fn versioned_meter( &self, - name: &'static str, - version: Option<&'static str>, - schema_url: Option<&'static str>, + name: impl Into>, + version: Option>>, + schema_url: Option>>, + attributes: Option>, ) -> Meter; } /// Provides access to instrument instances for recording metrics. #[derive(Clone)] pub struct Meter { - pub(crate) instrumentation_library: InstrumentationLibrary, pub(crate) instrument_provider: Arc, } impl Meter { /// Create a new named meter from an instrumentation provider - pub fn new( - instrumentation_library: InstrumentationLibrary, - instrument_provider: Arc, - ) -> Self { + #[doc(hidden)] + pub fn new(instrument_provider: Arc) -> Self { Meter { - instrumentation_library, instrument_provider, } } /// creates an instrument builder for recording increasing values. - pub fn u64_counter(&self, name: impl Into) -> InstrumentBuilder<'_, Counter> { + pub fn u64_counter( + &self, + name: impl Into>, + ) -> InstrumentBuilder<'_, Counter> { InstrumentBuilder::new(self, name.into()) } /// creates an instrument builder for recording increasing values. - pub fn f64_counter(&self, name: impl Into) -> InstrumentBuilder<'_, Counter> { + pub fn f64_counter( + &self, + name: impl Into>, + ) -> InstrumentBuilder<'_, Counter> { InstrumentBuilder::new(self, name.into()) } /// creates an instrument builder for recording increasing values via callback. pub fn u64_observable_counter( &self, - name: impl Into, - ) -> InstrumentBuilder<'_, ObservableCounter> { - InstrumentBuilder::new(self, name.into()) + name: impl Into>, + ) -> AsyncInstrumentBuilder<'_, ObservableCounter, u64> { + AsyncInstrumentBuilder::new(self, name.into()) } /// creates an instrument builder for recording increasing values via callback. pub fn f64_observable_counter( &self, - name: impl Into, - ) -> InstrumentBuilder<'_, ObservableCounter> { - InstrumentBuilder::new(self, name.into()) + name: impl Into>, + ) -> AsyncInstrumentBuilder<'_, ObservableCounter, f64> { + AsyncInstrumentBuilder::new(self, name.into()) } /// creates an instrument builder for recording changes of a value. pub fn i64_up_down_counter( &self, - name: impl Into, + name: impl Into>, ) -> InstrumentBuilder<'_, UpDownCounter> { InstrumentBuilder::new(self, name.into()) } @@ -84,7 +104,7 @@ /// creates an instrument builder for recording changes of a value. pub fn f64_up_down_counter( &self, - name: impl Into, + name: impl Into>, ) -> InstrumentBuilder<'_, UpDownCounter> { InstrumentBuilder::new(self, name.into()) } @@ -92,74 +112,108 @@ /// creates an instrument builder for recording changes of a value via callback. pub fn i64_observable_up_down_counter( &self, - name: impl Into, - ) -> InstrumentBuilder<'_, ObservableUpDownCounter> { - InstrumentBuilder::new(self, name.into()) + name: impl Into>, + ) -> AsyncInstrumentBuilder<'_, ObservableUpDownCounter, i64> { + AsyncInstrumentBuilder::new(self, name.into()) } /// creates an instrument builder for recording changes of a value via callback. pub fn f64_observable_up_down_counter( &self, - name: impl Into, - ) -> InstrumentBuilder<'_, ObservableUpDownCounter> { - InstrumentBuilder::new(self, name.into()) + name: impl Into>, + ) -> AsyncInstrumentBuilder<'_, ObservableUpDownCounter, f64> { + AsyncInstrumentBuilder::new(self, name.into()) } /// creates an instrument builder for recording the current value via callback. pub fn u64_observable_gauge( &self, - name: impl Into, - ) -> InstrumentBuilder<'_, ObservableGauge> { - InstrumentBuilder::new(self, name.into()) + name: impl Into>, + ) -> AsyncInstrumentBuilder<'_, ObservableGauge, u64> { + AsyncInstrumentBuilder::new(self, name.into()) } /// creates an instrument builder for recording the current value via callback. pub fn i64_observable_gauge( &self, - name: impl Into, - ) -> InstrumentBuilder<'_, ObservableGauge> { - InstrumentBuilder::new(self, name.into()) + name: impl Into>, + ) -> AsyncInstrumentBuilder<'_, ObservableGauge, i64> { + AsyncInstrumentBuilder::new(self, name.into()) } /// creates an instrument builder for recording the current value via callback. pub fn f64_observable_gauge( &self, - name: impl Into, - ) -> InstrumentBuilder<'_, ObservableGauge> { - InstrumentBuilder::new(self, name.into()) + name: impl Into>, + ) -> AsyncInstrumentBuilder<'_, ObservableGauge, f64> { + AsyncInstrumentBuilder::new(self, name.into()) } /// creates an instrument builder for recording a distribution of values. - pub fn f64_histogram(&self, name: impl Into) -> InstrumentBuilder<'_, Histogram> { + pub fn f64_histogram( + &self, + name: impl Into>, + ) -> InstrumentBuilder<'_, Histogram> { InstrumentBuilder::new(self, name.into()) } /// creates an instrument builder for recording a distribution of values. - pub fn u64_histogram(&self, name: impl Into) -> InstrumentBuilder<'_, Histogram> { + pub fn u64_histogram( + &self, + name: impl Into>, + ) -> InstrumentBuilder<'_, Histogram> { InstrumentBuilder::new(self, name.into()) } /// creates an instrument builder for recording a distribution of values. - pub fn i64_histogram(&self, name: impl Into) -> InstrumentBuilder<'_, Histogram> { + pub fn i64_histogram( + &self, + name: impl Into>, + ) -> InstrumentBuilder<'_, Histogram> { InstrumentBuilder::new(self, name.into()) } - /// Captures the function that will be called during data collection. + /// Registers a callback to be called during the collection of a measurement + /// cycle. /// - /// It is only valid to call `observe` within the scope of the passed function. - pub fn register_callback(&self, callback: F) -> Result<(), MetricsError> + /// The instruments passed as arguments to be registered are the only + /// instruments that may observe values. + /// + /// If no instruments are passed, the callback will not be registered. + pub fn register_callback( + &self, + instruments: &[Arc], + callback: F, + ) -> Result> where - F: Fn(&Context) + Send + Sync + 'static, + F: Fn(&dyn Observer) + Send + Sync + 'static, { self.instrument_provider - .register_callback(Box::new(callback)) + .register_callback(instruments, Box::new(callback)) } } +/// A token representing the unique registration of a callback for a set of +/// instruments with a [Meter]. +pub trait CallbackRegistration: Send + Sync { + /// Removes the callback registration from its associated [Meter]. + fn unregister(&mut self) -> Result<()>; +} + +/// Records measurements for multiple instruments in a callback. +pub trait Observer { + /// Records the f64 value with attributes for the observable. + fn observe_f64(&self, inst: &dyn AsyncInstrument, measurement: f64, attrs: &[KeyValue]); + + /// Records the u64 value with attributes for the observable. + fn observe_u64(&self, inst: &dyn AsyncInstrument, measurement: u64, attrs: &[KeyValue]); + + /// Records the i64 value with attributes for the observable. + fn observe_i64(&self, inst: &dyn AsyncInstrument, measurement: i64, attrs: &[KeyValue]); +} + impl fmt::Debug for Meter { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("Meter") - .field("instrumentation_library", &self.instrumentation_library) - .finish() + f.write_str("Meter") } } diff -Nru temporalio-1.3.0/vendor/opentelemetry_api/src/metrics/mod.rs temporalio-1.3.0/vendor/opentelemetry_api/src/metrics/mod.rs --- temporalio-1.3.0/vendor/opentelemetry_api/src/metrics/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_api/src/metrics/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,5 +1,6 @@ //! # OpenTelemetry Metrics API +use std::any::Any; use std::result; use std::sync::PoisonError; use std::{borrow::Cow, sync::Arc}; @@ -9,17 +10,15 @@ mod meter; pub mod noop; -use crate::{Context, ExportError}; +use crate::ExportError; pub use instruments::{ - counter::{AsyncCounter, Counter, ObservableCounter, SyncCounter}, - gauge::{AsyncGauge, ObservableGauge}, + counter::{Counter, ObservableCounter, SyncCounter}, + gauge::ObservableGauge, histogram::{Histogram, SyncHistogram}, - up_down_counter::{ - AsyncUpDownCounter, ObservableUpDownCounter, SyncUpDownCounter, UpDownCounter, - }, - InstrumentBuilder, + up_down_counter::{ObservableUpDownCounter, SyncUpDownCounter, UpDownCounter}, + AsyncInstrument, AsyncInstrumentBuilder, Callback, InstrumentBuilder, }; -pub use meter::{Meter, MeterProvider}; +pub use meter::{CallbackRegistration, Meter, MeterProvider, Observer}; /// A specialized `Result` type for metric operations. pub type Result = result::Result; @@ -31,33 +30,17 @@ /// Other errors not covered by specific cases. #[error("Metrics error: {0}")] Other(String), - /// Errors when requesting quantiles out of the 0-1 range. - #[error("The requested quantile is out of range")] - InvalidQuantile, - /// Errors when recording nan values. - #[error("NaN value is an invalid input")] - NaNInput, - /// Errors when recording negative values in monotonic sums. - #[error("Negative value is out of range for this instrument")] - NegativeInput, - /// Errors when merging aggregators of incompatible types. - #[error("Inconsistent aggregator types: {0}")] - InconsistentAggregator(String), - /// Errors when requesting data when no data has been collected - #[error("No data collected by this aggregator")] - NoDataCollected, - /// Errors when registering to instruments with the same name and kind - #[error("A metric was already registered by this name with another kind or number type: {0}")] - MetricKindMismatch(String), - /// Errors when processor logic is incorrect - #[error("Inconsistent processor state")] - InconsistentState, - /// Errors when aggregator cannot subtract - #[error("Aggregator does not subtract")] - NoSubtraction, + /// Invalid configuration + #[error("Config error {0}")] + Config(String), /// Fail to export metrics #[error("Metrics exporter {} failed with {0}", .0.exporter_name())] ExportErr(Box), + /// Invalid instrument configuration such invalid instrument name, invalid instrument description, invalid instrument unit, etc. + /// See [spec](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/metrics/api.md#general-characteristics) + /// for full list of requirements. + #[error("Invalid instrument configuration: {0}")] + InvalidInstrumentConfiguration(&'static str), } impl From for MetricsError { @@ -103,8 +86,8 @@ /// creates an instrument for recording increasing values. fn u64_counter( &self, - _name: String, - _description: Option, + _name: Cow<'static, str>, + _description: Option>, _unit: Option, ) -> Result> { Ok(Counter::new(Arc::new(noop::NoopSyncInstrument::new()))) @@ -113,8 +96,8 @@ /// creates an instrument for recording increasing values. fn f64_counter( &self, - _name: String, - _description: Option, + _name: Cow<'static, str>, + _description: Option>, _unit: Option, ) -> Result> { Ok(Counter::new(Arc::new(noop::NoopSyncInstrument::new()))) @@ -123,9 +106,10 @@ /// creates an instrument for recording increasing values via callback. fn u64_observable_counter( &self, - _name: String, - _description: Option, + _name: Cow<'static, str>, + _description: Option>, _unit: Option, + _callback: Vec>, ) -> Result> { Ok(ObservableCounter::new(Arc::new( noop::NoopAsyncInstrument::new(), @@ -135,9 +119,10 @@ /// creates an instrument for recording increasing values via callback. fn f64_observable_counter( &self, - _name: String, - _description: Option, + _name: Cow<'static, str>, + _description: Option>, _unit: Option, + _callback: Vec>, ) -> Result> { Ok(ObservableCounter::new(Arc::new( noop::NoopAsyncInstrument::new(), @@ -147,8 +132,8 @@ /// creates an instrument for recording changes of a value. fn i64_up_down_counter( &self, - _name: String, - _description: Option, + _name: Cow<'static, str>, + _description: Option>, _unit: Option, ) -> Result> { Ok(UpDownCounter::new( @@ -159,8 +144,8 @@ /// creates an instrument for recording changes of a value. fn f64_up_down_counter( &self, - _name: String, - _description: Option, + _name: Cow<'static, str>, + _description: Option>, _unit: Option, ) -> Result> { Ok(UpDownCounter::new( @@ -171,9 +156,10 @@ /// creates an instrument for recording changes of a value. fn i64_observable_up_down_counter( &self, - _name: String, - _description: Option, + _name: Cow<'static, str>, + _description: Option>, _unit: Option, + _callback: Vec>, ) -> Result> { Ok(ObservableUpDownCounter::new(Arc::new( noop::NoopAsyncInstrument::new(), @@ -183,9 +169,10 @@ /// creates an instrument for recording changes of a value via callback. fn f64_observable_up_down_counter( &self, - _name: String, - _description: Option, + _name: Cow<'static, str>, + _description: Option>, _unit: Option, + _callback: Vec>, ) -> Result> { Ok(ObservableUpDownCounter::new(Arc::new( noop::NoopAsyncInstrument::new(), @@ -195,9 +182,10 @@ /// creates an instrument for recording the current value via callback. fn u64_observable_gauge( &self, - _name: String, - _description: Option, + _name: Cow<'static, str>, + _description: Option>, _unit: Option, + _callback: Vec>, ) -> Result> { Ok(ObservableGauge::new(Arc::new( noop::NoopAsyncInstrument::new(), @@ -207,9 +195,10 @@ /// creates an instrument for recording the current value via callback. fn i64_observable_gauge( &self, - _name: String, - _description: Option, + _name: Cow<'static, str>, + _description: Option>, _unit: Option, + _callback: Vec>, ) -> Result> { Ok(ObservableGauge::new(Arc::new( noop::NoopAsyncInstrument::new(), @@ -219,9 +208,10 @@ /// creates an instrument for recording the current value via callback. fn f64_observable_gauge( &self, - _name: String, - _description: Option, + _name: Cow<'static, str>, + _description: Option>, _unit: Option, + _callback: Vec>, ) -> Result> { Ok(ObservableGauge::new(Arc::new( noop::NoopAsyncInstrument::new(), @@ -231,8 +221,8 @@ /// creates an instrument for recording a distribution of values. fn f64_histogram( &self, - _name: String, - _description: Option, + _name: Cow<'static, str>, + _description: Option>, _unit: Option, ) -> Result> { Ok(Histogram::new(Arc::new(noop::NoopSyncInstrument::new()))) @@ -241,8 +231,8 @@ /// creates an instrument for recording a distribution of values. fn u64_histogram( &self, - _name: String, - _description: Option, + _name: Cow<'static, str>, + _description: Option>, _unit: Option, ) -> Result> { Ok(Histogram::new(Arc::new(noop::NoopSyncInstrument::new()))) @@ -251,8 +241,8 @@ /// creates an instrument for recording a distribution of values. fn i64_histogram( &self, - _name: String, - _description: Option, + _name: Cow<'static, str>, + _description: Option>, _unit: Option, ) -> Result> { Ok(Histogram::new(Arc::new(noop::NoopSyncInstrument::new()))) @@ -261,5 +251,11 @@ /// Captures the function that will be called during data collection. /// /// It is only valid to call `observe` within the scope of the passed function. - fn register_callback(&self, callback: Box) -> Result<()>; + fn register_callback( + &self, + instruments: &[Arc], + callbacks: Box, + ) -> Result>; } + +type MultiInstrumentCallback = dyn Fn(&dyn Observer) + Send + Sync; diff -Nru temporalio-1.3.0/vendor/opentelemetry_api/src/metrics/noop.rs temporalio-1.3.0/vendor/opentelemetry_api/src/metrics/noop.rs --- temporalio-1.3.0/vendor/opentelemetry_api/src/metrics/noop.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_api/src/metrics/noop.rs 2023-10-30 19:40:00.000000000 +0000 @@ -5,12 +5,13 @@ //! to have minimal resource utilization and runtime impact. use crate::{ metrics::{ - AsyncCounter, AsyncGauge, AsyncUpDownCounter, InstrumentProvider, Meter, MeterProvider, + AsyncInstrument, CallbackRegistration, InstrumentProvider, Meter, MeterProvider, Observer, Result, SyncCounter, SyncHistogram, SyncUpDownCounter, }, - Context, InstrumentationLibrary, KeyValue, + KeyValue, }; -use std::sync::Arc; +use std::{any::Any, borrow::Cow, sync::Arc}; + /// A no-op instance of a `MetricProvider` #[derive(Debug, Default)] pub struct NoopMeterProvider { @@ -27,12 +28,12 @@ impl MeterProvider for NoopMeterProvider { fn versioned_meter( &self, - name: &'static str, - version: Option<&'static str>, - schema_url: Option<&'static str>, + _name: impl Into>, + _version: Option>>, + _schema_url: Option>>, + _attributes: Option>, ) -> Meter { - let library = InstrumentationLibrary::new(name, version, schema_url); - Meter::new(library, Arc::new(NoopMeterCore::new())) + Meter::new(Arc::new(NoopMeterCore::new())) } } @@ -50,7 +51,30 @@ } impl InstrumentProvider for NoopMeterCore { - fn register_callback(&self, _callback: Box) -> Result<()> { + fn register_callback( + &self, + _instruments: &[Arc], + _callback: Box, + ) -> Result> { + Ok(Box::new(NoopRegistration::new())) + } +} + +/// A no-op instance of a callback [CallbackRegistration]. +#[derive(Debug, Default)] +pub struct NoopRegistration { + _private: (), +} + +impl NoopRegistration { + /// Create a new no-op registration. + pub fn new() -> Self { + NoopRegistration { _private: () } + } +} + +impl CallbackRegistration for NoopRegistration { + fn unregister(&mut self) -> Result<()> { Ok(()) } } @@ -69,19 +93,19 @@ } impl SyncCounter for NoopSyncInstrument { - fn add(&self, _cx: &Context, _value: T, _attributes: &[KeyValue]) { + fn add(&self, _value: T, _attributes: &[KeyValue]) { // Ignored } } impl SyncUpDownCounter for NoopSyncInstrument { - fn add(&self, _cx: &Context, _value: T, _attributes: &[KeyValue]) { + fn add(&self, _value: T, _attributes: &[KeyValue]) { // Ignored } } impl SyncHistogram for NoopSyncInstrument { - fn record(&self, _cx: &Context, _value: T, _attributes: &[KeyValue]) { + fn record(&self, _value: T, _attributes: &[KeyValue]) { // Ignored } } @@ -99,20 +123,12 @@ } } -impl AsyncGauge for NoopAsyncInstrument { - fn observe(&self, _cx: &Context, _value: T, _attributes: &[KeyValue]) { +impl AsyncInstrument for NoopAsyncInstrument { + fn observe(&self, _value: T, _attributes: &[KeyValue]) { // Ignored } -} -impl AsyncCounter for NoopAsyncInstrument { - fn observe(&self, _cx: &Context, _value: T, _attributes: &[KeyValue]) { - // Ignored - } -} - -impl AsyncUpDownCounter for NoopAsyncInstrument { - fn observe(&self, _cx: &Context, _value: T, _attributes: &[KeyValue]) { - // Ignored + fn as_any(&self) -> Arc { + Arc::new(()) } } diff -Nru temporalio-1.3.0/vendor/opentelemetry_api/src/order_map.rs temporalio-1.3.0/vendor/opentelemetry_api/src/order_map.rs --- temporalio-1.3.0/vendor/opentelemetry_api/src/order_map.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_api/src/order_map.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,670 @@ +use crate::{Key, KeyValue, Value}; +use indexmap::map::{ + Drain, Entry, IntoIter, IntoKeys, IntoValues, Iter, IterMut, Keys, Values, ValuesMut, +}; +use indexmap::{Equivalent, IndexMap}; +use std::collections::hash_map::RandomState; +use std::hash::{BuildHasher, Hash}; +use std::iter::FromIterator; +use std::ops::{Index, IndexMut, RangeBounds}; + +/// A hash table implementation that preserves insertion order across all operations. +/// +/// Entries will be returned according to their insertion order when iterating over the collection. +#[derive(Clone, Debug)] +pub struct OrderMap(IndexMap); + +impl OrderMap { + /// Create a new map. (Does not allocate) + #[inline] + pub fn new() -> Self { + Self(IndexMap::new()) + } + + /// Create a new map with capacity for `n` key-value pairs. (Does not + /// allocate if `n` is zero.) + /// + /// Computes in **O(n)** time. + #[inline] + pub fn with_capacity(n: usize) -> Self { + Self(IndexMap::with_capacity(n)) + } +} + +impl OrderMap { + /// Create a new map with capacity for `n` key-value pairs. (Does not + /// allocate if `n` is zero.) + /// + /// Computes in **O(n)** time. + #[inline] + pub fn with_capacity_and_hasher(n: usize, hash_builder: S) -> Self { + Self(IndexMap::with_capacity_and_hasher(n, hash_builder)) + } + + /// Create a new map with `hash_builder`. + /// + /// This function is `const`, so it + /// can be called in `static` contexts. + pub const fn with_hasher(hash_builder: S) -> Self { + Self(IndexMap::with_hasher(hash_builder)) + } + + /// Computes in **O(1)** time. + pub fn capacity(&self) -> usize { + self.0.capacity() + } + + /// Return a reference to the map's `BuildHasher`. + pub fn hasher(&self) -> &S { + self.0.hasher() + } + + /// Return the number of key-value pairs in the map. + /// + /// Computes in **O(1)** time. + #[inline] + pub fn len(&self) -> usize { + self.0.len() + } + + /// Returns true if the map contains no elements. + /// + /// Computes in **O(1)** time. + #[inline] + pub fn is_empty(&self) -> bool { + self.0.is_empty() + } + + /// Return an iterator over the key-value pairs of the map, in their order + pub fn iter(&self) -> Iter<'_, K, V> { + self.0.iter() + } + + /// Return an iterator over the key-value pairs of the map, in their order + pub fn iter_mut(&mut self) -> IterMut<'_, K, V> { + self.0.iter_mut() + } + + /// Return an iterator over the keys of the map, in their order + pub fn keys(&self) -> Keys<'_, K, V> { + self.0.keys() + } + + /// Return an owning iterator over the keys of the map, in their order + pub fn into_keys(self) -> IntoKeys { + self.0.into_keys() + } + + /// Return an iterator over the values of the map, in their order + pub fn values(&self) -> Values<'_, K, V> { + self.0.values() + } + + /// Return an iterator over mutable references to the values of the map, + /// in their order + pub fn values_mut(&mut self) -> ValuesMut<'_, K, V> { + self.0.values_mut() + } + + /// Return an owning iterator over the values of the map, in their order + pub fn into_values(self) -> IntoValues { + self.0.into_values() + } + + /// Remove all key-value pairs in the map, while preserving its capacity. + /// + /// Computes in **O(n)** time. + pub fn clear(&mut self) { + self.0.clear(); + } + + /// Shortens the map, keeping the first `len` elements and dropping the rest. + /// + /// If `len` is greater than the map's current length, this has no effect. + pub fn truncate(&mut self, len: usize) { + self.0.truncate(len); + } + + /// Clears the `IndexMap` in the given index range, returning those + /// key-value pairs as a drain iterator. + /// + /// The range may be any type that implements `RangeBounds`, + /// including all of the `std::ops::Range*` types, or even a tuple pair of + /// `Bound` start and end values. To drain the map entirely, use `RangeFull` + /// like `map.drain(..)`. + /// + /// This shifts down all entries following the drained range to fill the + /// gap, and keeps the allocated memory for reuse. + /// + /// ***Panics*** if the starting point is greater than the end point or if + /// the end point is greater than the length of the map. + pub fn drain(&mut self, range: R) -> Drain<'_, K, V> + where + R: RangeBounds, + { + self.0.drain(range) + } + + /// Splits the collection into two at the given index. + /// + /// Returns a newly allocated map containing the elements in the range + /// `[at, len)`. After the call, the original map will be left containing + /// the elements `[0, at)` with its previous capacity unchanged. + /// + /// ***Panics*** if `at > len`. + pub fn split_off(&mut self, at: usize) -> Self + where + S: Clone, + { + Self(self.0.split_off(at)) + } +} + +impl OrderMap +where + K: Hash + Eq, + S: BuildHasher, +{ + /// Reserve capacity for `additional` more key-value pairs. + /// + /// Computes in **O(n)** time. + pub fn reserve(&mut self, additional: usize) { + self.0.reserve(additional) + } + + /// Shrink the capacity of the map as much as possible. + /// + /// Computes in **O(n)** time. + pub fn shrink_to_fit(&mut self) { + self.0.shrink_to_fit() + } + + /// Insert a key-value pair in the map. + /// + /// If an equivalent key already exists in the map: the key remains and + /// retains in its place in the order, its corresponding value is updated + /// with `value` and the older value is returned inside `Some(_)`. + /// + /// If no equivalent key existed in the map: the new key-value pair is + /// inserted, last in order, and `None` is returned. + /// + /// Computes in **O(1)** time (amortized average). + /// + /// See also [`entry`](#method.entry) if you you want to insert *or* modify + /// or if you need to get the index of the corresponding key-value pair. + pub fn insert(&mut self, key: K, value: V) -> Option { + self.0.insert(key, value) + } + + /// Insert a key-value pair in the map, and get their index. + /// + /// If an equivalent key already exists in the map: the key remains and + /// retains in its place in the order, its corresponding value is updated + /// with `value` and the older value is returned inside `(index, Some(_))`. + /// + /// If no equivalent key existed in the map: the new key-value pair is + /// inserted, last in order, and `(index, None)` is returned. + /// + /// Computes in **O(1)** time (amortized average). + /// + /// See also [`entry`](#method.entry) if you you want to insert *or* modify + /// or if you need to get the index of the corresponding key-value pair. + pub fn insert_full(&mut self, key: K, value: V) -> (usize, Option) { + self.0.insert_full(key, value) + } + + /// Get the given key’s corresponding entry in the map for insertion and/or + /// in-place manipulation. + /// + /// Computes in **O(1)** time (amortized average). + pub fn entry(&mut self, key: K) -> Entry<'_, K, V> { + self.0.entry(key) + } + + /// Return `true` if an equivalent to `key` exists in the map. + /// + /// Computes in **O(1)** time (average). + pub fn contains_key(&self, key: &Q) -> bool + where + Q: Hash + Equivalent, + { + self.0.contains_key(key) + } + + /// Return a reference to the value stored for `key`, if it is present, + /// else `None`. + /// + /// Computes in **O(1)** time (average). + pub fn get(&self, key: &Q) -> Option<&V> + where + Q: Hash + Equivalent, + { + self.0.get(key) + } + + /// Return references to the key-value pair stored for `key`, + /// if it is present, else `None`. + /// + /// Computes in **O(1)** time (average). + pub fn get_key_value(&self, key: &Q) -> Option<(&K, &V)> + where + Q: Hash + Equivalent, + { + self.0.get_key_value(key) + } + + /// Return item index, key and value + pub fn get_full(&self, key: &Q) -> Option<(usize, &K, &V)> + where + Q: Hash + Equivalent, + { + self.0.get_full(key) + } + + /// Return item index, if it exists in the map + /// + /// Computes in **O(1)** time (average). + pub fn get_index_of(&self, key: &Q) -> Option + where + Q: Hash + Equivalent, + { + self.0.get_index_of(key) + } + + /// Return a mutable reference to the element pointed at by `key`, if it exists. + pub fn get_mut(&mut self, key: &Q) -> Option<&mut V> + where + Q: Hash + Equivalent, + { + self.0.get_mut(key) + } + + /// Return a mutable reference to the element pointed at by `key`, if it exists. + /// It also returns the element's index and its key. + pub fn get_full_mut(&mut self, key: &Q) -> Option<(usize, &K, &mut V)> + where + Q: Hash + Equivalent, + { + self.0.get_full_mut(key) + } + + /// Remove the key-value pair equivalent to `key` and return + /// its value. + /// + /// Like `Vec::remove`, the pair is removed by shifting all of the + /// elements that follow it, preserving their relative order. + /// **This perturbs the index of all of those elements!** + /// + /// Return `None` if `key` is not in map. + /// + /// Computes in **O(n)** time (average). + pub fn shift_remove(&mut self, key: &Q) -> Option + where + Q: Hash + Equivalent, + { + self.0.shift_remove(key) + } + + /// Remove and return the key-value pair equivalent to `key`. + /// + /// Like `Vec::remove`, the pair is removed by shifting all of the + /// elements that follow it, preserving their relative order. + /// **This perturbs the index of all of those elements!** + /// + /// Return `None` if `key` is not in map. + /// + /// Computes in **O(n)** time (average). + pub fn shift_remove_entry(&mut self, key: &Q) -> Option<(K, V)> + where + Q: Hash + Equivalent, + { + self.0.shift_remove_entry(key) + } + + /// Remove the key-value pair equivalent to `key` and return it and + /// the index it had. + /// + /// Like `Vec::remove`, the pair is removed by shifting all of the + /// elements that follow it, preserving their relative order. + /// **This perturbs the index of all of those elements!** + /// + /// Return `None` if `key` is not in map. + /// + /// Computes in **O(n)** time (average). + pub fn shift_remove_full(&mut self, key: &Q) -> Option<(usize, K, V)> + where + Q: Hash + Equivalent, + { + self.0.shift_remove_full(key) + } + + /// Remove the last key-value pair + /// + /// This preserves the order of the remaining elements. + /// + /// Computes in **O(1)** time (average). + pub fn pop(&mut self) -> Option<(K, V)> { + self.0.pop() + } + + /// Scan through each key-value pair in the map and keep those where the + /// closure `keep` returns `true`. + /// + /// The elements are visited in order, and remaining elements keep their + /// order. + /// + /// Computes in **O(n)** time (average). + pub fn retain(&mut self, keep: F) + where + F: FnMut(&K, &mut V) -> bool, + { + self.0.retain(keep); + } +} + +impl OrderMap { + /// Get a key-value pair by index + /// + /// Valid indices are *0 <= index < self.len()* + /// + /// Computes in **O(1)** time. + pub fn get_index(&self, index: usize) -> Option<(&K, &V)> { + self.0.get_index(index) + } + + /// Get a key-value pair by index + /// + /// Valid indices are *0 <= index < self.len()* + /// + /// Computes in **O(1)** time. + pub fn get_index_mut(&mut self, index: usize) -> Option<(&mut K, &mut V)> { + self.0.get_index_mut(index) + } + + /// Get the first key-value pair + /// + /// Computes in **O(1)** time. + pub fn first(&self) -> Option<(&K, &V)> { + self.0.first() + } + + /// Get the first key-value pair, with mutable access to the value + /// + /// Computes in **O(1)** time. + pub fn first_mut(&mut self) -> Option<(&K, &mut V)> { + self.0.first_mut() + } + + /// Get the last key-value pair + /// + /// Computes in **O(1)** time. + pub fn last(&self) -> Option<(&K, &V)> { + self.0.last() + } + + /// Get the last key-value pair, with mutable access to the value + /// + /// Computes in **O(1)** time. + pub fn last_mut(&mut self) -> Option<(&K, &mut V)> { + self.0.last_mut() + } + + /// Remove the key-value pair by index + /// + /// Valid indices are *0 <= index < self.len()* + /// + /// Like `Vec::remove`, the pair is removed by shifting all of the + /// elements that follow it, preserving their relative order. + /// **This perturbs the index of all of those elements!** + /// + /// Computes in **O(n)** time (average). + pub fn shift_remove_index(&mut self, index: usize) -> Option<(K, V)> { + self.0.shift_remove_index(index) + } +} + +impl<'a, K, V, S> IntoIterator for &'a OrderMap { + type Item = (&'a K, &'a V); + type IntoIter = Iter<'a, K, V>; + fn into_iter(self) -> Self::IntoIter { + self.0.iter() + } +} + +impl<'a, K, V, S> IntoIterator for &'a mut OrderMap { + type Item = (&'a K, &'a mut V); + type IntoIter = IterMut<'a, K, V>; + fn into_iter(self) -> Self::IntoIter { + self.0.iter_mut() + } +} + +impl IntoIterator for OrderMap { + type Item = (K, V); + type IntoIter = IntoIter; + fn into_iter(self) -> Self::IntoIter { + self.0.into_iter() + } +} + +/// Access `OrderMap` values corresponding to a key. +/// +/// Panics if the value is missing. +impl Index<&Q> for OrderMap +where + Q: Hash + Equivalent, + K: Hash + Eq, + S: BuildHasher, +{ + type Output = V; + + /// Returns a reference to the value corresponding to the supplied `key`. + /// + /// ***Panics*** if `key` is not present in the map. + fn index(&self, key: &Q) -> &V { + self.0.index(key) + } +} + +/// Access `Ordermap` values corresponding to a key. +/// +/// Mutable indexing allows changing / updating values of key-value +/// pairs that are already present. +/// +/// You can **not** insert new pairs with index syntax, use `.insert()`. +impl IndexMut<&Q> for OrderMap +where + Q: Hash + Equivalent, + K: Hash + Eq, + S: BuildHasher, +{ + /// Returns a mutable reference to the value corresponding to the supplied `key`. + /// + /// ***Panics*** if `key` is not present in the map. + fn index_mut(&mut self, key: &Q) -> &mut V { + self.0.index_mut(key) + } +} + +/// Access `IndexMap` values at indexed positions. +/// +/// It panics if the index is out of bounds. +impl Index for OrderMap { + type Output = V; + + /// Returns a reference to the value at the supplied `index`. + /// + /// ***Panics*** if `index` is out of bounds. + fn index(&self, index: usize) -> &V { + self.0.index(index) + } +} + +/// Access `IndexMap` values at indexed positions. +/// +/// Mutable indexing allows changing / updating indexed values +/// that are already present. +/// +/// You can **not** insert new values with index syntax, use `.insert()`. +/// +/// # Examples +/// +/// ``` +/// use indexmap::IndexMap; +/// +/// let mut map = IndexMap::new(); +/// for word in "Lorem ipsum dolor sit amet".split_whitespace() { +/// map.insert(word.to_lowercase(), word.to_string()); +/// } +/// let lorem = &mut map[0]; +/// assert_eq!(lorem, "Lorem"); +/// lorem.retain(char::is_lowercase); +/// assert_eq!(map["lorem"], "orem"); +/// ``` +/// +/// ```should_panic +/// use indexmap::IndexMap; +/// +/// let mut map = IndexMap::new(); +/// map.insert("foo", 1); +/// map[10] = 1; // panics! +/// ``` +impl IndexMut for OrderMap { + /// Returns a mutable reference to the value at the supplied `index`. + /// + /// ***Panics*** if `index` is out of bounds. + fn index_mut(&mut self, index: usize) -> &mut V { + self.0.index_mut(index) + } +} + +impl FromIterator<(K, V)> for OrderMap +where + K: Hash + Eq, + S: BuildHasher + Default, +{ + /// Create an `OrderMap` from the sequence of key-value pairs in the + /// iterable. + /// + /// `from_iter` uses the same logic as `extend`. See + /// [`extend`](#method.extend) for more details. + fn from_iter>(iterable: I) -> Self { + Self(IndexMap::from_iter(iterable)) + } +} + +// todo: uncomment when the MSRV bumps +// impl From<[(K, V); N]> for OrderMap +// where +// K: Hash + Eq, +// { +// fn from(arr: [(K, V); N]) -> Self { +// Self(IndexMap::from(arr)) +// } +// } + +impl Extend<(K, V)> for OrderMap +where + K: Hash + Eq, + S: BuildHasher, +{ + /// Extend the map with all key-value pairs in the iterable. + /// + /// This is equivalent to calling [`insert`](#method.insert) for each of + /// them in order, which means that for keys that already existed + /// in the map, their value is updated but it keeps the existing order. + /// + /// New keys are inserted in the order they appear in the sequence. If + /// equivalents of a key occur more than once, the last corresponding value + /// prevails. + fn extend>(&mut self, iterable: I) { + self.0.extend(iterable) + } +} + +impl<'a, K, V, S> Extend<(&'a K, &'a V)> for OrderMap +where + K: 'a + Hash + Eq + Copy, + V: 'a + Copy, + S: BuildHasher, +{ + /// Extend the map with all key-value pairs in the iterable. + /// + /// See the first extend method for more details. + fn extend>(&mut self, iterable: I) { + self.0.extend(iterable) + } +} + +impl Default for OrderMap +where + S: Default, +{ + /// Return an empty `OrderMap` + fn default() -> Self { + Self(IndexMap::default()) + } +} + +impl PartialEq> for OrderMap +where + K: Hash + Eq, + V1: PartialEq, + S1: BuildHasher, + S2: BuildHasher, +{ + fn eq(&self, other: &OrderMap) -> bool { + self.0.eq(&other.0) + } +} + +impl Eq for OrderMap +where + K: Eq + Hash, + V: Eq, + S: BuildHasher, +{ +} + +impl FromIterator for OrderMap +where + S: BuildHasher + Default, +{ + /// Create an `OrderMap` from the sequence of key-value pairs in the + /// iterable. + /// + /// `from_iter` uses the same logic as `extend`. See + /// [`extend`](#method.extend) for more details. + fn from_iter>(iterable: I) -> Self { + Self(IndexMap::from_iter( + iterable.into_iter().map(|kv| (kv.key, kv.value)), + )) + } +} + +// todo: uncomment below when bumping MSRV +// impl From<[KeyValue; N]> for OrderMap { +// fn from(arr: [KeyValue; N]) -> Self { +// let arr = arr.map(|kv| (kv.key, kv.value)); +// Self(IndexMap::from(arr)) +// } +// } + +impl Extend for OrderMap +where + S: BuildHasher, +{ + /// Extend the map with all key-value pairs in the iterable. + /// + /// This is equivalent to calling [`insert`](#method.insert) for each of + /// them in order, which means that for keys that already existed + /// in the map, their value is updated but it keeps the existing order. + /// + /// New keys are inserted in the order they appear in the sequence. If + /// equivalents of a key occur more than once, the last corresponding value + /// prevails. + fn extend>(&mut self, iterable: I) { + self.0 + .extend(iterable.into_iter().map(|kv| (kv.key, kv.value))) + } +} diff -Nru temporalio-1.3.0/vendor/opentelemetry_api/src/propagation/text_map_propagator.rs temporalio-1.3.0/vendor/opentelemetry_api/src/propagation/text_map_propagator.rs --- temporalio-1.3.0/vendor/opentelemetry_api/src/propagation/text_map_propagator.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_api/src/propagation/text_map_propagator.rs 2023-10-30 19:40:00.000000000 +0000 @@ -18,7 +18,7 @@ /// [`Context`]: crate::Context /// [`Injector`]: crate::propagation::Injector fn inject(&self, injector: &mut dyn Injector) { - self.inject_context(&Context::current(), injector) + Context::map_current(|cx| self.inject_context(cx, injector)) } /// Properly encodes the values of the [`Context`] and injects them into the @@ -35,7 +35,7 @@ /// [`Context`]: crate::Context /// [`Injector`]: crate::propagation::Extractor fn extract(&self, extractor: &dyn Extractor) -> Context { - self.extract_with_context(&Context::current(), extractor) + Context::map_current(|cx| self.extract_with_context(cx, extractor)) } /// Retrieves encoded data using the provided [`Extractor`]. If no data for this diff -Nru temporalio-1.3.0/vendor/opentelemetry_api/src/testing/trace.rs temporalio-1.3.0/vendor/opentelemetry_api/src/testing/trace.rs --- temporalio-1.3.0/vendor/opentelemetry_api/src/testing/trace.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_api/src/testing/trace.rs 2023-10-30 19:40:00.000000000 +0000 @@ -36,13 +36,13 @@ /// Helper to create trace ids for testing impl TraceId { pub fn from_u128(num: u128) -> Self { - TraceId(num) + TraceId::from_bytes(num.to_be_bytes()) } } /// Helper to create span ids for testing impl SpanId { pub fn from_u64(num: u64) -> Self { - SpanId(num) + SpanId::from_bytes(num.to_be_bytes()) } } diff -Nru temporalio-1.3.0/vendor/opentelemetry_api/src/trace/context.rs temporalio-1.3.0/vendor/opentelemetry_api/src/trace/context.rs --- temporalio-1.3.0/vendor/opentelemetry_api/src/trace/context.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_api/src/trace/context.rs 2023-10-30 19:40:00.000000000 +0000 @@ -139,7 +139,7 @@ /// /// [standard attributes]: https://github.com/open-telemetry/opentelemetry-specification/blob/v1.9.0/specification/trace/semantic_conventions/README.md /// [opentelemetry_semantic_conventions]: https://docs.rs/opentelemetry-semantic-conventions - pub fn set_attributes(&mut self, attributes: impl IntoIterator) { + pub fn set_attributes(&self, attributes: impl IntoIterator) { self.with_inner_mut(move |inner| inner.set_attributes(attributes)) } @@ -229,7 +229,7 @@ /// use opentelemetry_api::{trace::TraceContextExt, Context}; /// /// // Add an event to the currently active span - /// Context::current().span().add_event("An event!", vec![]); + /// Context::map_current(|cx| cx.span().add_event("An event!", vec![])); /// ``` fn span(&self) -> SpanRef<'_>; @@ -240,7 +240,7 @@ /// ``` /// use opentelemetry_api::{trace::TraceContextExt, Context}; /// - /// assert!(!Context::current().has_active_span()); + /// assert!(!Context::map_current(|cx| cx.has_active_span())); /// ``` fn has_active_span(&self) -> bool; @@ -348,7 +348,7 @@ where F: FnOnce(SpanRef<'_>) -> T, { - f(Context::current().span()) + Context::map_current(|cx| f(cx.span())) } pin_project! { diff -Nru temporalio-1.3.0/vendor/opentelemetry_api/src/trace/mod.rs temporalio-1.3.0/vendor/opentelemetry_api/src/trace/mod.rs --- temporalio-1.3.0/vendor/opentelemetry_api/src/trace/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_api/src/trace/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -54,6 +54,7 @@ //! let tracer = tracer_provider.versioned_tracer( //! "my_name", //! Some(env!("CARGO_PKG_VERSION")), +//! Some("https://opentelemetry.io/schemas/1.17.0"), //! None //! ); //! @@ -168,21 +169,25 @@ mod context; pub mod noop; -mod order_map; mod span; mod span_context; mod tracer; mod tracer_provider; pub use self::{ - context::{get_active_span, mark_span_as_active, FutureExt, SpanRef, TraceContextExt}, - order_map::OrderMap, + context::{ + get_active_span, mark_span_as_active, FutureExt, SpanRef, TraceContextExt, WithContext, + }, span::{Span, SpanKind, Status}, span_context::{SpanContext, SpanId, TraceFlags, TraceId, TraceState}, tracer::{SamplingDecision, SamplingResult, SpanBuilder, Tracer}, tracer_provider::TracerProvider, }; use crate::{ExportError, KeyValue}; +use std::collections::hash_map::RandomState; + +/// re-export OrderMap to mitigate breaking change +pub type OrderMap = crate::order_map::OrderMap; /// Describe the result of operations in tracing API. pub type TraceResult = Result; diff -Nru temporalio-1.3.0/vendor/opentelemetry_api/src/trace/noop.rs temporalio-1.3.0/vendor/opentelemetry_api/src/trace/noop.rs --- temporalio-1.3.0/vendor/opentelemetry_api/src/trace/noop.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_api/src/trace/noop.rs 2023-10-30 19:40:00.000000000 +0000 @@ -5,12 +5,10 @@ //! to have minimal resource utilization and runtime impact. use crate::{ propagation::{text_map_propagator::FieldIter, Extractor, Injector, TextMapPropagator}, - trace, - trace::{TraceContextExt, TraceFlags, TraceState}, - Context, KeyValue, + trace::{self, TraceContextExt, TraceFlags, TraceState}, + Context, InstrumentationLibrary, KeyValue, }; -use std::borrow::Cow; -use std::time::SystemTime; +use std::{borrow::Cow, sync::Arc, time::SystemTime}; /// A no-op instance of a `TracerProvider`. #[derive(Clone, Debug, Default)] @@ -29,12 +27,7 @@ type Tracer = NoopTracer; /// Returns a new `NoopTracer` instance. - fn versioned_tracer( - &self, - _name: impl Into>, - _version: Option<&'static str>, - _schema_url: Option<&'static str>, - ) -> Self::Tracer { + fn library_tracer(&self, _library: Arc) -> Self::Tracer { NoopTracer::new() } } diff -Nru temporalio-1.3.0/vendor/opentelemetry_api/src/trace/order_map.rs temporalio-1.3.0/vendor/opentelemetry_api/src/trace/order_map.rs --- temporalio-1.3.0/vendor/opentelemetry_api/src/trace/order_map.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_api/src/trace/order_map.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,670 +0,0 @@ -use crate::{Key, KeyValue, Value}; -use indexmap::map::{ - Drain, Entry, IntoIter, IntoKeys, IntoValues, Iter, IterMut, Keys, Values, ValuesMut, -}; -use indexmap::{Equivalent, IndexMap}; -use std::collections::hash_map::RandomState; -use std::hash::{BuildHasher, Hash}; -use std::iter::FromIterator; -use std::ops::{Index, IndexMut, RangeBounds}; - -/// A hash table implementation that preserves insertion order across all operations. -/// -/// Entries will be returned according to their insertion order when iterating over the collection. -#[derive(Clone, Debug)] -pub struct OrderMap(IndexMap); - -impl OrderMap { - /// Create a new map. (Does not allocate) - #[inline] - pub fn new() -> Self { - Self(IndexMap::new()) - } - - /// Create a new map with capacity for `n` key-value pairs. (Does not - /// allocate if `n` is zero.) - /// - /// Computes in **O(n)** time. - #[inline] - pub fn with_capacity(n: usize) -> Self { - Self(IndexMap::with_capacity(n)) - } -} - -impl OrderMap { - /// Create a new map with capacity for `n` key-value pairs. (Does not - /// allocate if `n` is zero.) - /// - /// Computes in **O(n)** time. - #[inline] - pub fn with_capacity_and_hasher(n: usize, hash_builder: S) -> Self { - Self(IndexMap::with_capacity_and_hasher(n, hash_builder)) - } - - /// Create a new map with `hash_builder`. - /// - /// This function is `const`, so it - /// can be called in `static` contexts. - pub const fn with_hasher(hash_builder: S) -> Self { - Self(IndexMap::with_hasher(hash_builder)) - } - - /// Computes in **O(1)** time. - pub fn capacity(&self) -> usize { - self.0.capacity() - } - - /// Return a reference to the map's `BuildHasher`. - pub fn hasher(&self) -> &S { - self.0.hasher() - } - - /// Return the number of key-value pairs in the map. - /// - /// Computes in **O(1)** time. - #[inline] - pub fn len(&self) -> usize { - self.0.len() - } - - /// Returns true if the map contains no elements. - /// - /// Computes in **O(1)** time. - #[inline] - pub fn is_empty(&self) -> bool { - self.0.is_empty() - } - - /// Return an iterator over the key-value pairs of the map, in their order - pub fn iter(&self) -> Iter<'_, K, V> { - self.0.iter() - } - - /// Return an iterator over the key-value pairs of the map, in their order - pub fn iter_mut(&mut self) -> IterMut<'_, K, V> { - self.0.iter_mut() - } - - /// Return an iterator over the keys of the map, in their order - pub fn keys(&self) -> Keys<'_, K, V> { - self.0.keys() - } - - /// Return an owning iterator over the keys of the map, in their order - pub fn into_keys(self) -> IntoKeys { - self.0.into_keys() - } - - /// Return an iterator over the values of the map, in their order - pub fn values(&self) -> Values<'_, K, V> { - self.0.values() - } - - /// Return an iterator over mutable references to the values of the map, - /// in their order - pub fn values_mut(&mut self) -> ValuesMut<'_, K, V> { - self.0.values_mut() - } - - /// Return an owning iterator over the values of the map, in their order - pub fn into_values(self) -> IntoValues { - self.0.into_values() - } - - /// Remove all key-value pairs in the map, while preserving its capacity. - /// - /// Computes in **O(n)** time. - pub fn clear(&mut self) { - self.0.clear(); - } - - /// Shortens the map, keeping the first `len` elements and dropping the rest. - /// - /// If `len` is greater than the map's current length, this has no effect. - pub fn truncate(&mut self, len: usize) { - self.0.truncate(len); - } - - /// Clears the `IndexMap` in the given index range, returning those - /// key-value pairs as a drain iterator. - /// - /// The range may be any type that implements `RangeBounds`, - /// including all of the `std::ops::Range*` types, or even a tuple pair of - /// `Bound` start and end values. To drain the map entirely, use `RangeFull` - /// like `map.drain(..)`. - /// - /// This shifts down all entries following the drained range to fill the - /// gap, and keeps the allocated memory for reuse. - /// - /// ***Panics*** if the starting point is greater than the end point or if - /// the end point is greater than the length of the map. - pub fn drain(&mut self, range: R) -> Drain<'_, K, V> - where - R: RangeBounds, - { - self.0.drain(range) - } - - /// Splits the collection into two at the given index. - /// - /// Returns a newly allocated map containing the elements in the range - /// `[at, len)`. After the call, the original map will be left containing - /// the elements `[0, at)` with its previous capacity unchanged. - /// - /// ***Panics*** if `at > len`. - pub fn split_off(&mut self, at: usize) -> Self - where - S: Clone, - { - Self(self.0.split_off(at)) - } -} - -impl OrderMap -where - K: Hash + Eq, - S: BuildHasher, -{ - /// Reserve capacity for `additional` more key-value pairs. - /// - /// Computes in **O(n)** time. - pub fn reserve(&mut self, additional: usize) { - self.0.reserve(additional) - } - - /// Shrink the capacity of the map as much as possible. - /// - /// Computes in **O(n)** time. - pub fn shrink_to_fit(&mut self) { - self.0.shrink_to_fit() - } - - /// Insert a key-value pair in the map. - /// - /// If an equivalent key already exists in the map: the key remains and - /// retains in its place in the order, its corresponding value is updated - /// with `value` and the older value is returned inside `Some(_)`. - /// - /// If no equivalent key existed in the map: the new key-value pair is - /// inserted, last in order, and `None` is returned. - /// - /// Computes in **O(1)** time (amortized average). - /// - /// See also [`entry`](#method.entry) if you you want to insert *or* modify - /// or if you need to get the index of the corresponding key-value pair. - pub fn insert(&mut self, key: K, value: V) -> Option { - self.0.insert(key, value) - } - - /// Insert a key-value pair in the map, and get their index. - /// - /// If an equivalent key already exists in the map: the key remains and - /// retains in its place in the order, its corresponding value is updated - /// with `value` and the older value is returned inside `(index, Some(_))`. - /// - /// If no equivalent key existed in the map: the new key-value pair is - /// inserted, last in order, and `(index, None)` is returned. - /// - /// Computes in **O(1)** time (amortized average). - /// - /// See also [`entry`](#method.entry) if you you want to insert *or* modify - /// or if you need to get the index of the corresponding key-value pair. - pub fn insert_full(&mut self, key: K, value: V) -> (usize, Option) { - self.0.insert_full(key, value) - } - - /// Get the given key’s corresponding entry in the map for insertion and/or - /// in-place manipulation. - /// - /// Computes in **O(1)** time (amortized average). - pub fn entry(&mut self, key: K) -> Entry<'_, K, V> { - self.0.entry(key) - } - - /// Return `true` if an equivalent to `key` exists in the map. - /// - /// Computes in **O(1)** time (average). - pub fn contains_key(&self, key: &Q) -> bool - where - Q: Hash + Equivalent, - { - self.0.contains_key(key) - } - - /// Return a reference to the value stored for `key`, if it is present, - /// else `None`. - /// - /// Computes in **O(1)** time (average). - pub fn get(&self, key: &Q) -> Option<&V> - where - Q: Hash + Equivalent, - { - self.0.get(key) - } - - /// Return references to the key-value pair stored for `key`, - /// if it is present, else `None`. - /// - /// Computes in **O(1)** time (average). - pub fn get_key_value(&self, key: &Q) -> Option<(&K, &V)> - where - Q: Hash + Equivalent, - { - self.0.get_key_value(key) - } - - /// Return item index, key and value - pub fn get_full(&self, key: &Q) -> Option<(usize, &K, &V)> - where - Q: Hash + Equivalent, - { - self.0.get_full(key) - } - - /// Return item index, if it exists in the map - /// - /// Computes in **O(1)** time (average). - pub fn get_index_of(&self, key: &Q) -> Option - where - Q: Hash + Equivalent, - { - self.0.get_index_of(key) - } - - /// Return a mutable reference to the element pointed at by `key`, if it exists. - pub fn get_mut(&mut self, key: &Q) -> Option<&mut V> - where - Q: Hash + Equivalent, - { - self.0.get_mut(key) - } - - /// Return a mutable reference to the element pointed at by `key`, if it exists. - /// It also returns the element's index and its key. - pub fn get_full_mut(&mut self, key: &Q) -> Option<(usize, &K, &mut V)> - where - Q: Hash + Equivalent, - { - self.0.get_full_mut(key) - } - - /// Remove the key-value pair equivalent to `key` and return - /// its value. - /// - /// Like `Vec::remove`, the pair is removed by shifting all of the - /// elements that follow it, preserving their relative order. - /// **This perturbs the index of all of those elements!** - /// - /// Return `None` if `key` is not in map. - /// - /// Computes in **O(n)** time (average). - pub fn shift_remove(&mut self, key: &Q) -> Option - where - Q: Hash + Equivalent, - { - self.0.shift_remove(key) - } - - /// Remove and return the key-value pair equivalent to `key`. - /// - /// Like `Vec::remove`, the pair is removed by shifting all of the - /// elements that follow it, preserving their relative order. - /// **This perturbs the index of all of those elements!** - /// - /// Return `None` if `key` is not in map. - /// - /// Computes in **O(n)** time (average). - pub fn shift_remove_entry(&mut self, key: &Q) -> Option<(K, V)> - where - Q: Hash + Equivalent, - { - self.0.shift_remove_entry(key) - } - - /// Remove the key-value pair equivalent to `key` and return it and - /// the index it had. - /// - /// Like `Vec::remove`, the pair is removed by shifting all of the - /// elements that follow it, preserving their relative order. - /// **This perturbs the index of all of those elements!** - /// - /// Return `None` if `key` is not in map. - /// - /// Computes in **O(n)** time (average). - pub fn shift_remove_full(&mut self, key: &Q) -> Option<(usize, K, V)> - where - Q: Hash + Equivalent, - { - self.0.shift_remove_full(key) - } - - /// Remove the last key-value pair - /// - /// This preserves the order of the remaining elements. - /// - /// Computes in **O(1)** time (average). - pub fn pop(&mut self) -> Option<(K, V)> { - self.0.pop() - } - - /// Scan through each key-value pair in the map and keep those where the - /// closure `keep` returns `true`. - /// - /// The elements are visited in order, and remaining elements keep their - /// order. - /// - /// Computes in **O(n)** time (average). - pub fn retain(&mut self, keep: F) - where - F: FnMut(&K, &mut V) -> bool, - { - self.0.retain(keep); - } -} - -impl OrderMap { - /// Get a key-value pair by index - /// - /// Valid indices are *0 <= index < self.len()* - /// - /// Computes in **O(1)** time. - pub fn get_index(&self, index: usize) -> Option<(&K, &V)> { - self.0.get_index(index) - } - - /// Get a key-value pair by index - /// - /// Valid indices are *0 <= index < self.len()* - /// - /// Computes in **O(1)** time. - pub fn get_index_mut(&mut self, index: usize) -> Option<(&mut K, &mut V)> { - self.0.get_index_mut(index) - } - - /// Get the first key-value pair - /// - /// Computes in **O(1)** time. - pub fn first(&self) -> Option<(&K, &V)> { - self.0.first() - } - - /// Get the first key-value pair, with mutable access to the value - /// - /// Computes in **O(1)** time. - pub fn first_mut(&mut self) -> Option<(&K, &mut V)> { - self.0.first_mut() - } - - /// Get the last key-value pair - /// - /// Computes in **O(1)** time. - pub fn last(&self) -> Option<(&K, &V)> { - self.0.last() - } - - /// Get the last key-value pair, with mutable access to the value - /// - /// Computes in **O(1)** time. - pub fn last_mut(&mut self) -> Option<(&K, &mut V)> { - self.0.last_mut() - } - - /// Remove the key-value pair by index - /// - /// Valid indices are *0 <= index < self.len()* - /// - /// Like `Vec::remove`, the pair is removed by shifting all of the - /// elements that follow it, preserving their relative order. - /// **This perturbs the index of all of those elements!** - /// - /// Computes in **O(n)** time (average). - pub fn shift_remove_index(&mut self, index: usize) -> Option<(K, V)> { - self.0.shift_remove_index(index) - } -} - -impl<'a, K, V, S> IntoIterator for &'a OrderMap { - type Item = (&'a K, &'a V); - type IntoIter = Iter<'a, K, V>; - fn into_iter(self) -> Self::IntoIter { - self.0.iter() - } -} - -impl<'a, K, V, S> IntoIterator for &'a mut OrderMap { - type Item = (&'a K, &'a mut V); - type IntoIter = IterMut<'a, K, V>; - fn into_iter(self) -> Self::IntoIter { - self.0.iter_mut() - } -} - -impl IntoIterator for OrderMap { - type Item = (K, V); - type IntoIter = IntoIter; - fn into_iter(self) -> Self::IntoIter { - self.0.into_iter() - } -} - -/// Access `OrderMap` values corresponding to a key. -/// -/// Panics if the value is missing. -impl Index<&Q> for OrderMap -where - Q: Hash + Equivalent, - K: Hash + Eq, - S: BuildHasher, -{ - type Output = V; - - /// Returns a reference to the value corresponding to the supplied `key`. - /// - /// ***Panics*** if `key` is not present in the map. - fn index(&self, key: &Q) -> &V { - self.0.index(key) - } -} - -/// Access `Ordermap` values corresponding to a key. -/// -/// Mutable indexing allows changing / updating values of key-value -/// pairs that are already present. -/// -/// You can **not** insert new pairs with index syntax, use `.insert()`. -impl IndexMut<&Q> for OrderMap -where - Q: Hash + Equivalent, - K: Hash + Eq, - S: BuildHasher, -{ - /// Returns a mutable reference to the value corresponding to the supplied `key`. - /// - /// ***Panics*** if `key` is not present in the map. - fn index_mut(&mut self, key: &Q) -> &mut V { - self.0.index_mut(key) - } -} - -/// Access `IndexMap` values at indexed positions. -/// -/// It panics if the index is out of bounds. -impl Index for OrderMap { - type Output = V; - - /// Returns a reference to the value at the supplied `index`. - /// - /// ***Panics*** if `index` is out of bounds. - fn index(&self, index: usize) -> &V { - self.0.index(index) - } -} - -/// Access `IndexMap` values at indexed positions. -/// -/// Mutable indexing allows changing / updating indexed values -/// that are already present. -/// -/// You can **not** insert new values with index syntax, use `.insert()`. -/// -/// # Examples -/// -/// ``` -/// use indexmap::IndexMap; -/// -/// let mut map = IndexMap::new(); -/// for word in "Lorem ipsum dolor sit amet".split_whitespace() { -/// map.insert(word.to_lowercase(), word.to_string()); -/// } -/// let lorem = &mut map[0]; -/// assert_eq!(lorem, "Lorem"); -/// lorem.retain(char::is_lowercase); -/// assert_eq!(map["lorem"], "orem"); -/// ``` -/// -/// ```should_panic -/// use indexmap::IndexMap; -/// -/// let mut map = IndexMap::new(); -/// map.insert("foo", 1); -/// map[10] = 1; // panics! -/// ``` -impl IndexMut for OrderMap { - /// Returns a mutable reference to the value at the supplied `index`. - /// - /// ***Panics*** if `index` is out of bounds. - fn index_mut(&mut self, index: usize) -> &mut V { - self.0.index_mut(index) - } -} - -impl FromIterator<(K, V)> for OrderMap -where - K: Hash + Eq, - S: BuildHasher + Default, -{ - /// Create an `OrderMap` from the sequence of key-value pairs in the - /// iterable. - /// - /// `from_iter` uses the same logic as `extend`. See - /// [`extend`](#method.extend) for more details. - fn from_iter>(iterable: I) -> Self { - Self(IndexMap::from_iter(iterable)) - } -} - -// todo: uncomment when the MSRV bumps -// impl From<[(K, V); N]> for OrderMap -// where -// K: Hash + Eq, -// { -// fn from(arr: [(K, V); N]) -> Self { -// Self(IndexMap::from(arr)) -// } -// } - -impl Extend<(K, V)> for OrderMap -where - K: Hash + Eq, - S: BuildHasher, -{ - /// Extend the map with all key-value pairs in the iterable. - /// - /// This is equivalent to calling [`insert`](#method.insert) for each of - /// them in order, which means that for keys that already existed - /// in the map, their value is updated but it keeps the existing order. - /// - /// New keys are inserted in the order they appear in the sequence. If - /// equivalents of a key occur more than once, the last corresponding value - /// prevails. - fn extend>(&mut self, iterable: I) { - self.0.extend(iterable) - } -} - -impl<'a, K, V, S> Extend<(&'a K, &'a V)> for OrderMap -where - K: 'a + Hash + Eq + Copy, - V: 'a + Copy, - S: BuildHasher, -{ - /// Extend the map with all key-value pairs in the iterable. - /// - /// See the first extend method for more details. - fn extend>(&mut self, iterable: I) { - self.0.extend(iterable) - } -} - -impl Default for OrderMap -where - S: Default, -{ - /// Return an empty `OrderMap` - fn default() -> Self { - Self(IndexMap::default()) - } -} - -impl PartialEq> for OrderMap -where - K: Hash + Eq, - V1: PartialEq, - S1: BuildHasher, - S2: BuildHasher, -{ - fn eq(&self, other: &OrderMap) -> bool { - self.0.eq(&other.0) - } -} - -impl Eq for OrderMap -where - K: Eq + Hash, - V: Eq, - S: BuildHasher, -{ -} - -impl FromIterator for OrderMap -where - S: BuildHasher + Default, -{ - /// Create an `OrderMap` from the sequence of key-value pairs in the - /// iterable. - /// - /// `from_iter` uses the same logic as `extend`. See - /// [`extend`](#method.extend) for more details. - fn from_iter>(iterable: I) -> Self { - Self(IndexMap::from_iter( - iterable.into_iter().map(|kv| (kv.key, kv.value)), - )) - } -} - -// todo: uncomment below when bumping MSRV -// impl From<[KeyValue; N]> for OrderMap { -// fn from(arr: [KeyValue; N]) -> Self { -// let arr = arr.map(|kv| (kv.key, kv.value)); -// Self(IndexMap::from(arr)) -// } -// } - -impl Extend for OrderMap -where - S: BuildHasher, -{ - /// Extend the map with all key-value pairs in the iterable. - /// - /// This is equivalent to calling [`insert`](#method.insert) for each of - /// them in order, which means that for keys that already existed - /// in the map, their value is updated but it keeps the existing order. - /// - /// New keys are inserted in the order they appear in the sequence. If - /// equivalents of a key occur more than once, the last corresponding value - /// prevails. - fn extend>(&mut self, iterable: I) { - self.0 - .extend(iterable.into_iter().map(|kv| (kv.key, kv.value))) - } -} diff -Nru temporalio-1.3.0/vendor/opentelemetry_api/src/trace/span_context.rs temporalio-1.3.0/vendor/opentelemetry_api/src/trace/span_context.rs --- temporalio-1.3.0/vendor/opentelemetry_api/src/trace/span_context.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_api/src/trace/span_context.rs 2023-10-30 19:40:00.000000000 +0000 @@ -87,7 +87,7 @@ /// /// The id is valid if it contains at least one non-zero byte. #[derive(Clone, PartialEq, Eq, Copy, Hash)] -pub struct TraceId(pub(crate) u128); +pub struct TraceId(u128); impl TraceId { /// Invalid trace id @@ -120,9 +120,9 @@ } } -impl From<[u8; 16]> for TraceId { - fn from(bytes: [u8; 16]) -> Self { - TraceId::from_bytes(bytes) +impl From for TraceId { + fn from(value: u128) -> Self { + TraceId(value) } } @@ -148,7 +148,7 @@ /// /// The id is valid if it contains at least one non-zero byte. #[derive(Clone, PartialEq, Eq, Copy, Hash)] -pub struct SpanId(pub(crate) u64); +pub struct SpanId(u64); impl SpanId { /// Invalid span id @@ -181,9 +181,9 @@ } } -impl From<[u8; 8]> for SpanId { - fn from(bytes: [u8; 8]) -> Self { - SpanId::from_bytes(bytes) +impl From for SpanId { + fn from(value: u64) -> Self { + SpanId(value) } } diff -Nru temporalio-1.3.0/vendor/opentelemetry_api/src/trace/tracer_provider.rs temporalio-1.3.0/vendor/opentelemetry_api/src/trace/tracer_provider.rs --- temporalio-1.3.0/vendor/opentelemetry_api/src/trace/tracer_provider.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_api/src/trace/tracer_provider.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,5 +1,5 @@ -use crate::trace::Tracer; -use std::borrow::Cow; +use crate::{trace::Tracer, InstrumentationLibrary, KeyValue}; +use std::{borrow::Cow, sync::Arc}; /// Types that can create instances of [`Tracer`]. /// @@ -21,6 +21,7 @@ /// /// ``` /// use opentelemetry_api::{global, trace::TracerProvider}; + /// use opentelemetry_api::KeyValue; /// /// let provider = global::tracer_provider(); /// @@ -31,11 +32,17 @@ /// let tracer = provider.versioned_tracer( /// "my_library", /// Some(env!("CARGO_PKG_VERSION")), - /// Some("https://opentelemetry.io/schema/1.0.0") + /// Some("https://opentelemetry.io/schema/1.0.0"), + /// Some(vec![KeyValue::new("key", "value")]), /// ); /// ``` fn tracer(&self, name: impl Into>) -> Self::Tracer { - self.versioned_tracer(name, None, None) + self.versioned_tracer( + name, + None::>, + None::>, + None, + ) } /// Returns a new versioned tracer with a given name. @@ -58,13 +65,42 @@ /// let tracer = provider.versioned_tracer( /// "my_library", /// Some(env!("CARGO_PKG_VERSION")), - /// Some("https://opentelemetry.io/schema/1.0.0") + /// Some("https://opentelemetry.io/schema/1.0.0"), + /// None, /// ); /// ``` fn versioned_tracer( &self, name: impl Into>, - version: Option<&'static str>, - schema_url: Option<&'static str>, - ) -> Self::Tracer; + version: Option>>, + schema_url: Option>>, + attributes: Option>, + ) -> Self::Tracer { + self.library_tracer(Arc::new(InstrumentationLibrary::new( + name, version, schema_url, attributes, + ))) + } + + /// Returns a new versioned tracer with the given instrumentation library. + /// + /// # Examples + /// + /// ``` + /// use opentelemetry_api::{global, InstrumentationLibrary, trace::TracerProvider}; + /// + /// let provider = global::tracer_provider(); + /// + /// // tracer used in applications/binaries + /// let tracer = provider.tracer("my_app"); + /// + /// // tracer used in libraries/crates that optionally includes version and schema url + /// let library = std::sync::Arc::new(InstrumentationLibrary::new( + /// env!("CARGO_PKG_NAME"), + /// Some(env!("CARGO_PKG_VERSION")), + /// Some("https://opentelemetry.io/schema/1.0.0"), + /// None, + /// )); + /// let tracer = provider.library_tracer(library); + /// ``` + fn library_tracer(&self, library: Arc) -> Self::Tracer; } diff -Nru temporalio-1.3.0/vendor/opentelemetry_api/src/trace/tracer.rs temporalio-1.3.0/vendor/opentelemetry_api/src/trace/tracer.rs --- temporalio-1.3.0/vendor/opentelemetry_api/src/trace/tracer.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_api/src/trace/tracer.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,7 +1,6 @@ -use crate::trace::OrderMap; use crate::{ trace::{Event, Link, Span, SpanId, SpanKind, Status, TraceContextExt, TraceId, TraceState}, - Context, Key, KeyValue, Value, + Context, Key, KeyValue, OrderMap, Value, }; use std::borrow::Cow; use std::iter::FromIterator; @@ -137,7 +136,7 @@ where T: Into>, { - self.build_with_context(SpanBuilder::from_name(name), &Context::current()) + Context::map_current(|cx| self.start_with_context(name, cx)) } /// Starts a new [`Span`] with a given context. @@ -170,7 +169,7 @@ /// Start a [`Span`] from a [`SpanBuilder`]. fn build(&self, builder: SpanBuilder) -> Self::Span { - self.build_with_context(builder, &Context::current()) + Context::map_current(|cx| self.build_with_context(builder, cx)) } /// Start a span from a [`SpanBuilder`] with a parent context. @@ -383,7 +382,7 @@ /// Builds a span with the given tracer from this configuration. pub fn start(self, tracer: &T) -> T::Span { - tracer.build_with_context(self, &Context::current()) + Context::map_current(|cx| tracer.build_with_context(self, cx)) } /// Builds a span with the given tracer from this configuration and parent. diff -Nru temporalio-1.3.0/vendor/opentelemetry-otlp/.cargo-checksum.json temporalio-1.3.0/vendor/opentelemetry-otlp/.cargo-checksum.json --- temporalio-1.3.0/vendor/opentelemetry-otlp/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-otlp/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"CHANGELOG.md":"e6202f2d554d9e88365779eaf37d678b682663bf47968b3a4b226bb052566acc","CODEOWNERS":"517b0ec97b47f714513c6a611f30830a9c5b95b530c2dda813870bf0100f6979","Cargo.toml":"0e903d1eecbe3aee55d22025c3af8a18ee073967c467d1ffc255e6c23430859b","LICENSE":"c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4","README.md":"676f90d8cf6f5bd6919b44ceb67c4775cceb9a78df684fb8603b4fb358ea1a25","src/exporter/grpcio.rs":"dbd407dcf1398cb44c533149b0a72acd0fa2e6da7b695244d379e987a9d279e5","src/exporter/http.rs":"75465446247e0c7ec5ef5f03f3eb32a215d7b2faf98774bf678cf116ba44727f","src/exporter/mod.rs":"02215923bc6c72ef2a958138f190fe2d3189700af921ed0e2e42440d9b3a58d8","src/exporter/tonic.rs":"00b4a7a9d75df2291b0ac10f7f69b8f2c75c62bfdf6d02db3bc46a684c4d65f2","src/lib.rs":"ac9de3a520a4f4c28ee3e29ffc8a83b711b779e633ff60a77fe4f28423d33969","src/metric.rs":"f9e6e55faffae1bf13ceac3723ad9ff93642722f92cb59d57d0ccc11ae597925","src/span.rs":"70b97126706ead59398936eea60d6179eccafc6439da541a469ad1ed40b2062b","src/transform/metrics.rs":"13ca0c07daf1f2c2b22614caf8bb986d8ec23e2d544976099a54b948601c4d03","src/transform/mod.rs":"5f6a244f821bc2a34011e614d7e0e3a54d560950dd1f66385efa9312f6f97afe","src/transform/resource.rs":"fb6721900f1f48e559f606fbbe1855cefbde235e411c25bec6060a4cd46ffd81","tests/smoke.rs":"dbcfd7daee082f3e1b54c1191a8d14d4e08e71060175e7d0b66d92a5ab6dfe1c"},"package":"d1c928609d087790fc936a1067bdc310ae702bdf3b090c3f281b713622c8bbde"} \ No newline at end of file +{"files":{"CHANGELOG.md":"a85eacec64c9af80d9bd37844b59c7f39f83a2feffab39e240737170bc1b5ad8","CODEOWNERS":"517b0ec97b47f714513c6a611f30830a9c5b95b530c2dda813870bf0100f6979","Cargo.toml":"27ff497a75a0843e697bedf6c0e3c502c76579565e5f8f8d21536dbcefeb8b77","LICENSE":"208a3f5bae3355bd4f3f45626d1ea4518b253d618ee2896983436075c4375098","README.md":"063107ef2901e5694f7ae840c38b8a985970d892818e4ff72a4797b7c68db061","src/exporter/grpcio.rs":"ae444030b3bb173026ae167461fe8deef12fa1f17e86c041f6495f24b5f1257c","src/exporter/http.rs":"f8bc14693b6a970665b1ead8c52a43860f974dbf3b74717a4e8a4931886524f8","src/exporter/mod.rs":"1fb443e0d5553ad693215e83d6687cce9bcbf58078f9d9fc4de3a6dba2b26b61","src/exporter/tonic.rs":"2df2fe6ddad67fd8394728ebcc8e80bc8954114ed18c046cf4fdd57dced4bc6b","src/lib.rs":"4ead8205c3df14cf8a935ad9019df521451c44525841236df977c6a91d78d4c7","src/logs.rs":"2e3330f2d2db55e94637b174626b4889383bd0f8f620aacc93e7228a9f344bbb","src/metric.rs":"8a5868d6a85ac75cb8e265b10f06b4f6abf5af975e05ab9d5a7e6c5a9e2fad91","src/span.rs":"aca6a8c8fca766d57a75f687f8ef59637ea93e09baf666247fb8889502068757","src/transform/metrics.rs":"4481524e74106dde06a8ef488db0500655966f3cb6f6c306a7df81b63eaeace1","src/transform/mod.rs":"1b7eacb75ba07e4a1f2139809a9087c74816153695dbb623fdba7005991f782f","src/transform/resource.rs":"6a19230fbda1575e31570b32e07508143d9d0f2c68a21cc9d2d190f373214c51","tests/smoke.rs":"eced4700f1d1c2a5e35ad8737ef07f7298bf4aa202dd0f064c5c1d87f49f7cf8"},"package":"7e5e5a5c4135864099f3faafbe939eb4d7f9b80ebf68a8448da961b32a7c1275"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/opentelemetry-otlp/Cargo.toml temporalio-1.3.0/vendor/opentelemetry-otlp/Cargo.toml --- temporalio-1.3.0/vendor/opentelemetry-otlp/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-otlp/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -11,9 +11,9 @@ [package] edition = "2021" -rust-version = "1.56" +rust-version = "1.60" name = "opentelemetry-otlp" -version = "0.11.0" +version = "0.13.0" autotests = false description = "Exporter for the OpenTelemetry Collector" homepage = "https://github.com/open-telemetry/opentelemetry-rust/tree/main/opentelemetry-otlp" @@ -32,6 +32,7 @@ ] license = "Apache-2.0" repository = "https://github.com/open-telemetry/opentelemetry-rust/tree/main/opentelemetry-otlp" +resolver = "1" [package.metadata.docs.rs] all-features = true @@ -51,35 +52,34 @@ [dependencies.async-trait] version = "0.1" -[dependencies.futures] +[dependencies.futures-core] version = "0.3" -features = ["std"] -default-features = false - -[dependencies.futures-util] -version = "0.3" -features = ["std"] -default-features = false [dependencies.grpcio] -version = "0.9" +version = "0.12" optional = true [dependencies.http] version = "0.2" optional = true -[dependencies.opentelemetry] -version = "0.18" -features = ["trace"] -default-features = false - [dependencies.opentelemetry-http] -version = "0.7" +version = "0.9" optional = true [dependencies.opentelemetry-proto] -version = "0.1" +version = "0.3" +default-features = false + +[dependencies.opentelemetry-semantic-conventions] +version = "0.12" + +[dependencies.opentelemetry_api] +version = "0.20" +default-features = false + +[dependencies.opentelemetry_sdk] +version = "0.20" default-features = false [dependencies.prost] @@ -117,9 +117,14 @@ optional = true [dependencies.tonic] -version = "0.8.0" +version = "0.9.0" optional = true +[dev-dependencies.futures] +version = "0.3" +features = ["std"] +default-features = false + [dev-dependencies.time] version = "0.3" features = ["macros"] @@ -151,24 +156,30 @@ "http", "tokio", "opentelemetry-proto/gen-tonic", - "opentelemetry-proto/build-client", ] +gzip-tonic = ["tonic/gzip"] http-proto = [ "prost", "opentelemetry-http", - "opentelemetry-proto/gen-tonic", + "opentelemetry-proto/gen-tonic-messages", "http", "trace", + "metrics", ] integration-testing = [ "tonic", "prost", "tokio/full", "trace", - "opentelemetry-proto/build-server", +] +logs = [ + "opentelemetry_api/logs", + "opentelemetry_sdk/logs", + "opentelemetry-proto/logs", ] metrics = [ - "opentelemetry/metrics", + "opentelemetry_api/metrics", + "opentelemetry_sdk/metrics", "opentelemetry-proto/metrics", "grpc-tonic", ] @@ -197,6 +208,7 @@ "tonic/tls-roots", ] trace = [ - "opentelemetry/trace", + "opentelemetry_api/trace", + "opentelemetry_sdk/trace", "opentelemetry-proto/traces", ] diff -Nru temporalio-1.3.0/vendor/opentelemetry-otlp/CHANGELOG.md temporalio-1.3.0/vendor/opentelemetry-otlp/CHANGELOG.md --- temporalio-1.3.0/vendor/opentelemetry-otlp/CHANGELOG.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-otlp/CHANGELOG.md 2023-10-30 19:40:00.000000000 +0000 @@ -1,5 +1,42 @@ # Changelog +## v0.13.0 + +### Added +- Add OTLP HTTP Metrics Exporter [#1020](https://github.com/open-telemetry/opentelemetry-rust/pull/1020). +- Add tonic compression support [#1165](https://github.com/open-telemetry/opentelemetry-rust/pull/1165). + +### Changed + +- make the tonic/transport feature optional #985 +- update to opentelemetry-api v0.20.0 + +### Fixed + +- Fix a missing import when http-proto is enabled without grpc-sys #1081 + +## v0.12.0 + +### Added +- Add batch config for otlp pipeline [#979](https://github.com/open-telemetry/opentelemetry-rust/pull/979). +- Add tonic interceptor [#901](https://github.com/open-telemetry/opentelemetry-rust/pull/901). + +### Changed + +- Update `opentelemetry` to 0.19. +- Update `opentelemetry-semantic-conventions` to 0.11. +- Update `opentelemetry-http` to 0.8. +- Bump MSRV to 1.57 [#953](https://github.com/open-telemetry/opentelemetry-rust/pull/953). +- Add `User-Agent` header on all exporters [#896](https://github.com/open-telemetry/opentelemetry-rust/pull/896). +- Improve OTLP exporter environment variable handling [#912](https://github.com/open-telemetry/opentelemetry-rust/pull/912). +- Fix the issue where tonic exporter builder ignored provided metadata [#937](https://github.com/open-telemetry/opentelemetry-rust/pull/937). +- Export `MetricsExporterBuilder` [#943](https://github.com/open-telemetry/opentelemetry-rust/pull/943). +- Report OTLP http export errors [#945](https://github.com/open-telemetry/opentelemetry-rust/pull/945). +- Bump MSRV to 1.57 [#953](https://github.com/open-telemetry/opentelemetry-rust/pull/953). +- Change to export using v0.19.0 protobuf definitions. [#989](https://github.com/open-telemetry/opentelemetry-rust/pull/989). +- Update dependencies and bump MSRV to 1.60 [#969](https://github.com/open-telemetry/opentelemetry-rust/pull/969). + + ## v0.11.0 ### Changed diff -Nru temporalio-1.3.0/vendor/opentelemetry-otlp/LICENSE temporalio-1.3.0/vendor/opentelemetry-otlp/LICENSE --- temporalio-1.3.0/vendor/opentelemetry-otlp/LICENSE 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-otlp/LICENSE 2023-10-30 19:40:00.000000000 +0000 @@ -186,7 +186,7 @@ same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright [yyyy] [name of copyright owner] + Copyright 2023 The OpenTelemetry Authors Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff -Nru temporalio-1.3.0/vendor/opentelemetry-otlp/README.md temporalio-1.3.0/vendor/opentelemetry-otlp/README.md --- temporalio-1.3.0/vendor/opentelemetry-otlp/README.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-otlp/README.md 2023-10-30 19:40:00.000000000 +0000 @@ -10,10 +10,7 @@ [![Documentation](https://docs.rs/opentelemetry-otlp/badge.svg)](https://docs.rs/opentelemetry-otlp) [![LICENSE](https://img.shields.io/crates/l/opentelemetry-otlp)](./LICENSE) [![GitHub Actions CI](https://github.com/open-telemetry/opentelemetry-rust/workflows/CI/badge.svg)](https://github.com/open-telemetry/opentelemetry-rust/actions?query=workflow%3ACI+branch%3Amain) -[![Gitter chat](https://img.shields.io/badge/gitter-join%20chat%20%E2%86%92-brightgreen.svg)](https://gitter.im/open-telemetry/opentelemetry-rust) - -[Documentation](https://docs.rs/opentelemetry-otlp) | -[Chat](https://gitter.im/open-telemetry/opentelemetry-rust) +[![Slack](https://img.shields.io/badge/slack-@cncf/otel/rust-brightgreen.svg?logo=slack)](https://cloud-native.slack.com/archives/C03GDP0H023) ## Overview diff -Nru temporalio-1.3.0/vendor/opentelemetry-otlp/src/exporter/grpcio.rs temporalio-1.3.0/vendor/opentelemetry-otlp/src/exporter/grpcio.rs --- temporalio-1.3.0/vendor/opentelemetry-otlp/src/exporter/grpcio.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-otlp/src/exporter/grpcio.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,10 +1,14 @@ +use crate::exporter::Compression; use crate::ExportConfig; #[cfg(feature = "serialize")] use serde::{Deserialize, Serialize}; use std::collections::HashMap; +use super::default_headers; + /// Configuration of grpcio #[derive(Debug)] +#[non_exhaustive] pub struct GrpcioConfig { /// The credentials to use when communicating with the collector. pub credentials: Option, @@ -26,7 +30,7 @@ fn default() -> Self { GrpcioConfig { credentials: None, - headers: None, + headers: Some(default_headers()), compression: None, use_tls: None, completion_queue_count: 2, @@ -44,14 +48,6 @@ pub key: String, } -/// The compression algorithm to use when sending data. -#[cfg_attr(feature = "serialize", derive(Deserialize, Serialize))] -#[derive(Clone, Copy, Debug)] -pub enum Compression { - /// Compresses data using gzip. - Gzip, -} - impl From for grpcio::CompressionAlgorithms { fn from(compression: Compression) -> Self { match compression { @@ -85,7 +81,9 @@ /// Set additional headers to send to the collector. pub fn with_headers(mut self, headers: HashMap) -> Self { - self.grpcio_config.headers = Some(headers); + let mut inst_headers = self.grpcio_config.headers.unwrap_or_default(); + inst_headers.extend(headers.into_iter()); + self.grpcio_config.headers = Some(inst_headers); self } @@ -107,3 +105,35 @@ self } } + +#[cfg(test)] +mod tests { + use crate::GrpcioExporterBuilder; + use std::collections::HashMap; + + #[test] + fn test_with_headers() { + // metadata should merge with the current one with priority instead of just replacing it + let mut headers = HashMap::new(); + headers.insert("key".to_string(), "value".to_string()); + let builder = GrpcioExporterBuilder::default().with_headers(headers); + let result = builder.grpcio_config.headers.unwrap(); + assert_eq!(result.get("key").unwrap(), "value"); + assert!(result.get("User-Agent").is_some()); + + // metadata should override entries with the same key in the default one + let mut headers = HashMap::new(); + headers.insert("User-Agent".to_string(), "baz".to_string()); + let builder = GrpcioExporterBuilder::default().with_headers(headers); + let result = builder.grpcio_config.headers.unwrap(); + assert_eq!(result.get("User-Agent").unwrap(), "baz"); + assert_eq!( + result.len(), + GrpcioExporterBuilder::default() + .grpcio_config + .headers + .unwrap() + .len() + ); + } +} diff -Nru temporalio-1.3.0/vendor/opentelemetry-otlp/src/exporter/http.rs temporalio-1.3.0/vendor/opentelemetry-otlp/src/exporter/http.rs --- temporalio-1.3.0/vendor/opentelemetry-otlp/src/exporter/http.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-otlp/src/exporter/http.rs 2023-10-30 19:40:00.000000000 +0000 @@ -3,6 +3,8 @@ use std::collections::HashMap; use std::sync::Arc; +use super::default_headers; + /// Configuration of the http transport #[cfg(feature = "http-proto")] #[derive(Debug)] @@ -71,7 +73,10 @@ protocol: Protocol::HttpBinary, ..ExportConfig::default() }, - http_config: HttpConfig::default(), + http_config: HttpConfig { + headers: Some(default_headers()), + ..HttpConfig::default() + }, } } } @@ -85,7 +90,10 @@ /// Set additional headers to send to the collector. pub fn with_headers(mut self, headers: HashMap) -> Self { - self.http_config.headers = Some(headers); + // headers will be wrapped, so we must do some logic to unwrap first. + let mut inst_headers = self.http_config.headers.unwrap_or_default(); + inst_headers.extend(headers.into_iter()); + self.http_config.headers = Some(inst_headers); self } } diff -Nru temporalio-1.3.0/vendor/opentelemetry-otlp/src/exporter/mod.rs temporalio-1.3.0/vendor/opentelemetry-otlp/src/exporter/mod.rs --- temporalio-1.3.0/vendor/opentelemetry-otlp/src/exporter/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-otlp/src/exporter/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -8,7 +8,11 @@ use crate::exporter::http::HttpExporterBuilder; #[cfg(feature = "grpc-tonic")] use crate::exporter::tonic::TonicExporterBuilder; -use crate::Protocol; +use crate::{Error, Protocol}; +#[cfg(feature = "serialize")] +use serde::{Deserialize, Serialize}; +use std::collections::HashMap; +use std::fmt::{Display, Formatter}; use std::str::FromStr; use std::time::Duration; @@ -17,12 +21,37 @@ /// pub const OTEL_EXPORTER_OTLP_ENDPOINT: &str = "OTEL_EXPORTER_OTLP_ENDPOINT"; /// Default target to which the exporter is going to send signals. -pub const OTEL_EXPORTER_OTLP_ENDPOINT_DEFAULT: &str = "https://localhost:4317"; +pub const OTEL_EXPORTER_OTLP_ENDPOINT_DEFAULT: &str = OTEL_EXPORTER_OTLP_HTTP_ENDPOINT_DEFAULT; +/// Protocol the exporter will use. Either `http/protobuf` or `grpc`. +pub const OTEL_EXPORTER_OTLP_PROTOCOL: &str = "OTEL_EXPORTER_OTLP_PROTOCOL"; +/// Compression algorithm to use, defaults to none. +pub const OTEL_EXPORTER_OTLP_COMPRESSION: &str = "OTEL_EXPORTER_OTLP_COMPRESSION"; + +#[cfg(feature = "http-proto")] +/// Default protocol, using http-proto. +pub const OTEL_EXPORTER_OTLP_PROTOCOL_DEFAULT: &str = OTEL_EXPORTER_OTLP_PROTOCOL_HTTP_PROTOBUF; +#[cfg(all( + any(feature = "grpc-tonic", feature = "grpcio"), + not(feature = "http-proto") +))] +/// Default protocol, using grpc as http-proto feature is not enabled. +pub const OTEL_EXPORTER_OTLP_PROTOCOL_DEFAULT: &str = OTEL_EXPORTER_OTLP_PROTOCOL_GRPC; +#[cfg(not(any(any(feature = "grpc-tonic", feature = "grpcio", feature = "http-proto"))))] +/// Default protocol if no features are enabled. +pub const OTEL_EXPORTER_OTLP_PROTOCOL_DEFAULT: &str = ""; + +const OTEL_EXPORTER_OTLP_PROTOCOL_HTTP_PROTOBUF: &str = "http/protobuf"; +const OTEL_EXPORTER_OTLP_PROTOCOL_GRPC: &str = "grpc"; + /// Max waiting time for the backend to process each signal batch, defaults to 10 seconds. pub const OTEL_EXPORTER_OTLP_TIMEOUT: &str = "OTEL_EXPORTER_OTLP_TIMEOUT"; /// Default max waiting time for the backend to process each signal batch. pub const OTEL_EXPORTER_OTLP_TIMEOUT_DEFAULT: u64 = 10; +// Endpoints per protocol https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/protocol/exporter.md +const OTEL_EXPORTER_OTLP_GRPC_ENDPOINT_DEFAULT: &str = "http://localhost:4317"; +const OTEL_EXPORTER_OTLP_HTTP_ENDPOINT_DEFAULT: &str = "http://localhost:4318"; + #[cfg(feature = "grpc-sys")] pub(crate) mod grpcio; #[cfg(feature = "http-proto")] @@ -45,14 +74,70 @@ impl Default for ExportConfig { fn default() -> Self { + let protocol = default_protocol(); + ExportConfig { - endpoint: OTEL_EXPORTER_OTLP_ENDPOINT_DEFAULT.to_string(), - protocol: Protocol::Grpc, + endpoint: default_endpoint(protocol), + protocol, timeout: Duration::from_secs(OTEL_EXPORTER_OTLP_TIMEOUT_DEFAULT), } } } +/// The compression algorithm to use when sending data. +#[cfg_attr(feature = "serialize", derive(Deserialize, Serialize))] +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub enum Compression { + /// Compresses data using gzip. + Gzip, +} + +impl Display for Compression { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + match self { + Compression::Gzip => write!(f, "gzip"), + } + } +} + +impl FromStr for Compression { + type Err = Error; + + fn from_str(s: &str) -> Result { + match s { + "gzip" => Ok(Compression::Gzip), + _ => Err(Error::UnsupportedCompressionAlgorithm(s.to_string())), + } + } +} + +/// default protocol based on enabled features +fn default_protocol() -> Protocol { + match OTEL_EXPORTER_OTLP_PROTOCOL_DEFAULT { + OTEL_EXPORTER_OTLP_PROTOCOL_HTTP_PROTOBUF => Protocol::HttpBinary, + OTEL_EXPORTER_OTLP_PROTOCOL_GRPC => Protocol::Grpc, + _ => Protocol::HttpBinary, + } +} + +/// default endpoint for protocol +fn default_endpoint(protocol: Protocol) -> String { + match protocol { + Protocol::Grpc => OTEL_EXPORTER_OTLP_GRPC_ENDPOINT_DEFAULT.to_string(), + Protocol::HttpBinary => OTEL_EXPORTER_OTLP_HTTP_ENDPOINT_DEFAULT.to_string(), + } +} + +/// default user-agent headers +fn default_headers() -> HashMap { + let mut headers = HashMap::new(); + headers.insert( + "User-Agent".to_string(), + format!("OTel OTLP Exporter Rust/{}", env!("CARGO_PKG_VERSION")), + ); + headers +} + /// Provide access to the export config field within the exporter builders. pub trait HasExportConfig { /// Return a mutable reference to the export config within the exporter builders. @@ -126,9 +211,20 @@ } fn with_env(mut self) -> Self { + let protocol = match std::env::var(OTEL_EXPORTER_OTLP_PROTOCOL) + .unwrap_or_else(|_| OTEL_EXPORTER_OTLP_PROTOCOL_DEFAULT.to_string()) + .as_str() + { + OTEL_EXPORTER_OTLP_PROTOCOL_HTTP_PROTOBUF => Protocol::HttpBinary, + OTEL_EXPORTER_OTLP_PROTOCOL_GRPC => Protocol::Grpc, + _ => default_protocol(), + }; + + self.export_config().protocol = protocol; + let endpoint = match std::env::var(OTEL_EXPORTER_OTLP_ENDPOINT) { Ok(val) => val, - Err(_) => OTEL_EXPORTER_OTLP_ENDPOINT_DEFAULT.to_string(), + Err(_) => default_endpoint(protocol), }; self.export_config().endpoint = endpoint; @@ -151,38 +247,147 @@ #[cfg(test)] #[cfg(feature = "grpc-tonic")] mod tests { + // If an env test fails then the mutex will be poisoned and the following error will be displayed. + const LOCK_POISONED_MESSAGE: &str = "one of the other pipeline builder from env tests failed"; + use crate::exporter::{ - WithExportConfig, OTEL_EXPORTER_OTLP_ENDPOINT, OTEL_EXPORTER_OTLP_TIMEOUT, - OTEL_EXPORTER_OTLP_TIMEOUT_DEFAULT, + default_endpoint, default_protocol, WithExportConfig, OTEL_EXPORTER_OTLP_ENDPOINT, + OTEL_EXPORTER_OTLP_GRPC_ENDPOINT_DEFAULT, OTEL_EXPORTER_OTLP_HTTP_ENDPOINT_DEFAULT, + OTEL_EXPORTER_OTLP_PROTOCOL_GRPC, OTEL_EXPORTER_OTLP_PROTOCOL_HTTP_PROTOBUF, + OTEL_EXPORTER_OTLP_TIMEOUT, OTEL_EXPORTER_OTLP_TIMEOUT_DEFAULT, }; - use crate::new_exporter; + use crate::{new_exporter, Compression, Protocol, OTEL_EXPORTER_OTLP_PROTOCOL}; + use std::str::FromStr; + use std::sync::Mutex; + + // Make sure env tests are not running concurrently + static ENV_LOCK: Mutex = Mutex::new(0); #[test] fn test_pipeline_builder_from_env_default_vars() { - let expected_endpoint = "https://otlp_endpoint:4317"; - std::env::set_var(OTEL_EXPORTER_OTLP_ENDPOINT, expected_endpoint); - std::env::set_var(OTEL_EXPORTER_OTLP_TIMEOUT, "bad_timeout"); - - let mut exporter_builder = new_exporter().tonic().with_env(); - assert_eq!(exporter_builder.exporter_config.endpoint, expected_endpoint); - - exporter_builder = new_exporter().tonic().with_env(); + let _env_lock = ENV_LOCK.lock().expect(LOCK_POISONED_MESSAGE); + let exporter_builder = new_exporter().tonic().with_env(); + assert_eq!( + exporter_builder.exporter_config.protocol, + default_protocol() + ); + assert_eq!( + exporter_builder.exporter_config.endpoint, + default_endpoint(default_protocol()) + ); assert_eq!( exporter_builder.exporter_config.timeout, std::time::Duration::from_secs(OTEL_EXPORTER_OTLP_TIMEOUT_DEFAULT) ); + } - std::env::set_var(OTEL_EXPORTER_OTLP_TIMEOUT, "60"); + #[test] + fn test_pipeline_builder_from_env_endpoint() { + let _env_lock = ENV_LOCK.lock().expect(LOCK_POISONED_MESSAGE); + std::env::set_var(OTEL_EXPORTER_OTLP_ENDPOINT, "http://example.com"); + let exporter_builder = new_exporter().tonic().with_env(); + assert_eq!( + exporter_builder.exporter_config.endpoint, + "http://example.com" + ); + std::env::remove_var(OTEL_EXPORTER_OTLP_ENDPOINT); + assert!(std::env::var(OTEL_EXPORTER_OTLP_ENDPOINT).is_err()); + } - exporter_builder = new_exporter().tonic().with_env(); + #[test] + fn test_pipeline_builder_from_env_protocol_http_protobuf() { + let _env_lock = ENV_LOCK.lock().expect(LOCK_POISONED_MESSAGE); + std::env::set_var( + OTEL_EXPORTER_OTLP_PROTOCOL, + OTEL_EXPORTER_OTLP_PROTOCOL_HTTP_PROTOBUF, + ); + let exporter_builder = new_exporter().tonic().with_env(); + assert_eq!( + exporter_builder.exporter_config.protocol, + Protocol::HttpBinary + ); + assert_eq!( + exporter_builder.exporter_config.endpoint, + OTEL_EXPORTER_OTLP_HTTP_ENDPOINT_DEFAULT + ); + + std::env::remove_var(OTEL_EXPORTER_OTLP_PROTOCOL); + assert!(std::env::var(OTEL_EXPORTER_OTLP_PROTOCOL).is_err()); + } + + #[test] + fn test_pipeline_builder_from_env_protocol_grpc() { + let _env_lock = ENV_LOCK.lock().expect(LOCK_POISONED_MESSAGE); + std::env::set_var( + OTEL_EXPORTER_OTLP_PROTOCOL, + OTEL_EXPORTER_OTLP_PROTOCOL_GRPC, + ); + let exporter_builder = new_exporter().tonic().with_env(); + assert_eq!(exporter_builder.exporter_config.protocol, Protocol::Grpc); + assert_eq!( + exporter_builder.exporter_config.endpoint, + OTEL_EXPORTER_OTLP_GRPC_ENDPOINT_DEFAULT + ); + + std::env::remove_var(OTEL_EXPORTER_OTLP_PROTOCOL); + assert!(std::env::var(OTEL_EXPORTER_OTLP_PROTOCOL).is_err()); + } + + #[test] + fn test_pipeline_builder_from_env_bad_protocol() { + let _env_lock = ENV_LOCK.lock().expect(LOCK_POISONED_MESSAGE); + std::env::set_var(OTEL_EXPORTER_OTLP_PROTOCOL, "bad_protocol"); + let exporter_builder = new_exporter().tonic().with_env(); + assert_eq!( + exporter_builder.exporter_config.protocol, + default_protocol() + ); + assert_eq!( + exporter_builder.exporter_config.endpoint, + default_endpoint(default_protocol()) + ); + + std::env::remove_var(OTEL_EXPORTER_OTLP_PROTOCOL); + assert!(std::env::var(OTEL_EXPORTER_OTLP_PROTOCOL).is_err()); + } + + #[test] + fn test_pipeline_builder_from_env_timeout() { + let _env_lock = ENV_LOCK.lock().expect(LOCK_POISONED_MESSAGE); + std::env::set_var(OTEL_EXPORTER_OTLP_TIMEOUT, "60"); + let exporter_builder = new_exporter().tonic().with_env(); assert_eq!( exporter_builder.exporter_config.timeout, std::time::Duration::from_secs(60) ); - std::env::remove_var(OTEL_EXPORTER_OTLP_ENDPOINT); std::env::remove_var(OTEL_EXPORTER_OTLP_TIMEOUT); - assert!(std::env::var(OTEL_EXPORTER_OTLP_ENDPOINT).is_err()); assert!(std::env::var(OTEL_EXPORTER_OTLP_TIMEOUT).is_err()); } + + #[test] + fn test_pipeline_builder_from_env_bad_timeout() { + let _env_lock = ENV_LOCK.lock().expect(LOCK_POISONED_MESSAGE); + std::env::set_var(OTEL_EXPORTER_OTLP_TIMEOUT, "bad_timeout"); + + let exporter_builder = new_exporter().tonic().with_env(); + assert_eq!( + exporter_builder.exporter_config.timeout, + std::time::Duration::from_secs(OTEL_EXPORTER_OTLP_TIMEOUT_DEFAULT) + ); + + std::env::remove_var(OTEL_EXPORTER_OTLP_TIMEOUT); + assert!(std::env::var(OTEL_EXPORTER_OTLP_TIMEOUT).is_err()); + } + + #[test] + fn test_compression_parse() { + assert_eq!(Compression::from_str("gzip").unwrap(), Compression::Gzip); + Compression::from_str("bad_compression").expect_err("bad compression"); + } + + #[test] + fn test_compression_to_str() { + assert_eq!(Compression::Gzip.to_string(), "gzip"); + } } diff -Nru temporalio-1.3.0/vendor/opentelemetry-otlp/src/exporter/tonic.rs temporalio-1.3.0/vendor/opentelemetry-otlp/src/exporter/tonic.rs --- temporalio-1.3.0/vendor/opentelemetry-otlp/src/exporter/tonic.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-otlp/src/exporter/tonic.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,12 +1,18 @@ -use crate::ExportConfig; +use crate::exporter::Compression; +use crate::{ExportConfig, OTEL_EXPORTER_OTLP_COMPRESSION}; +use std::fmt::{Debug, Formatter}; +use tonic::codec::CompressionEncoding; use tonic::metadata::MetadataMap; #[cfg(feature = "tls")] use tonic::transport::ClientTlsConfig; +use super::default_headers; + /// Configuration for [tonic] /// /// [tonic]: https://github.com/hyperium/tonic #[derive(Debug, Default)] +#[non_exhaustive] pub struct TonicConfig { /// Custom metadata entries to send to the collector. pub metadata: Option, @@ -14,6 +20,39 @@ /// TLS settings for the collector endpoint. #[cfg(feature = "tls")] pub tls_config: Option, + + /// The compression algorithm to use when communicating with the collector. + pub compression: Option, +} + +impl TryFrom for tonic::codec::CompressionEncoding { + type Error = crate::Error; + + fn try_from(value: Compression) -> Result { + match value { + #[cfg(feature = "gzip-tonic")] + Compression::Gzip => Ok(tonic::codec::CompressionEncoding::Gzip), + #[cfg(not(feature = "gzip-tonic"))] + Compression::Gzip => Err(crate::Error::UnsupportedCompressionAlgorithm( + value.to_string(), + )), + } + } +} + +pub(crate) fn resolve_compression( + tonic_config: &TonicConfig, + env_override: &'static str, +) -> Result, crate::Error> { + if let Some(compression) = tonic_config.compression { + Ok(Some(compression.try_into()?)) + } else if let Ok(compression) = std::env::var(env_override) { + Ok(Some(compression.parse::()?.try_into()?)) + } else if let Ok(compression) = std::env::var(OTEL_EXPORTER_OTLP_COMPRESSION) { + Ok(Some(compression.parse::()?.try_into()?)) + } else { + Ok(None) + } } /// Build a trace exporter that uses [tonic] as grpc layer and opentelemetry protocol. @@ -25,11 +64,47 @@ /// /// [tonic]: /// [channel]: tonic::transport::Channel -#[derive(Default, Debug)] +#[derive(Debug)] pub struct TonicExporterBuilder { pub(crate) exporter_config: ExportConfig, pub(crate) tonic_config: TonicConfig, pub(crate) channel: Option, + pub(crate) interceptor: Option, +} + +pub(crate) struct BoxInterceptor(Box); +impl tonic::service::Interceptor for BoxInterceptor { + fn call(&mut self, request: tonic::Request<()>) -> Result, tonic::Status> { + self.0.call(request) + } +} + +impl Debug for BoxInterceptor { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + write!(f, "BoxInterceptor(..)") + } +} + +impl Default for TonicExporterBuilder { + fn default() -> Self { + let tonic_config = TonicConfig { + metadata: Some(MetadataMap::from_headers( + (&default_headers()) + .try_into() + .expect("Invalid tonic headers"), + )), + #[cfg(feature = "tls")] + tls_config: None, + compression: None, + }; + + TonicExporterBuilder { + exporter_config: ExportConfig::default(), + tonic_config, + channel: Option::default(), + interceptor: Option::default(), + } + } } impl TonicExporterBuilder { @@ -42,7 +117,22 @@ /// Set custom metadata entries to send to the collector. pub fn with_metadata(mut self, metadata: MetadataMap) -> Self { - self.tonic_config.metadata = Some(metadata); + // extending metadata maps is harder than just casting back/forth + let incoming_headers = metadata.into_headers(); + let mut existing_headers = self + .tonic_config + .metadata + .unwrap_or_default() + .into_headers(); + existing_headers.extend(incoming_headers.into_iter()); + + self.tonic_config.metadata = Some(MetadataMap::from_headers(existing_headers)); + self + } + + /// Set the compression algorithm to use when communicating with the collector. + pub fn with_compression(mut self, compression: Compression) -> Self { + self.tonic_config.compression = Some(compression); self } @@ -56,4 +146,63 @@ self.channel = Some(channel); self } + + /// Use a custom `interceptor` to modify each outbound request. + /// this can be used to modify the grpc metadata, for example + /// to inject auth tokens. + pub fn with_interceptor(mut self, interceptor: I) -> Self + where + I: tonic::service::Interceptor + Send + 'static, + { + self.interceptor = Some(BoxInterceptor(Box::new(interceptor))); + self + } +} + +#[cfg(test)] +mod tests { + #[cfg(feature = "gzip-tonic")] + use crate::exporter::Compression; + use crate::TonicExporterBuilder; + use tonic::metadata::{MetadataMap, MetadataValue}; + + #[test] + fn test_with_metadata() { + // metadata should merge with the current one with priority instead of just replacing it + let mut metadata = MetadataMap::new(); + metadata.insert("foo", "bar".parse().unwrap()); + let builder = TonicExporterBuilder::default().with_metadata(metadata); + let result = builder.tonic_config.metadata.unwrap(); + let foo = result.get("foo").unwrap(); + assert_eq!(foo, &MetadataValue::try_from("bar").unwrap()); + assert!(result.get("User-Agent").is_some()); + + // metadata should override entries with the same key in the default one + let mut metadata = MetadataMap::new(); + metadata.insert("user-agent", "baz".parse().unwrap()); + let builder = TonicExporterBuilder::default().with_metadata(metadata); + let result = builder.tonic_config.metadata.unwrap(); + assert_eq!( + result.get("User-Agent").unwrap(), + &MetadataValue::try_from("baz").unwrap() + ); + assert_eq!( + result.len(), + TonicExporterBuilder::default() + .tonic_config + .metadata + .unwrap() + .len() + ); + } + + #[test] + #[cfg(feature = "gzip-tonic")] + fn test_with_compression() { + // metadata should merge with the current one with priority instead of just replacing it + let mut metadata = MetadataMap::new(); + metadata.insert("foo", "bar".parse().unwrap()); + let builder = TonicExporterBuilder::default().with_compression(Compression::Gzip); + assert_eq!(builder.tonic_config.compression.unwrap(), Compression::Gzip); + } } diff -Nru temporalio-1.3.0/vendor/opentelemetry-otlp/src/lib.rs temporalio-1.3.0/vendor/opentelemetry-otlp/src/lib.rs --- temporalio-1.3.0/vendor/opentelemetry-otlp/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-otlp/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -85,10 +85,10 @@ //! on the choice of exporters. //! //! ```no_run -//! use opentelemetry::{KeyValue, trace::Tracer}; -//! use opentelemetry::sdk::{trace::{self, RandomIdGenerator, Sampler}, Resource}; -//! use opentelemetry::sdk::metrics::{selectors, PushController}; -//! use opentelemetry::sdk::util::tokio_interval_stream; +//! use opentelemetry_api::{KeyValue, trace::Tracer}; +//! use opentelemetry_sdk::{trace::{self, RandomIdGenerator, Sampler}, Resource}; +//! use opentelemetry_sdk::metrics::{selectors, PushController}; +//! use opentelemetry_sdk::util::tokio_interval_stream; //! use opentelemetry_otlp::{Protocol, WithExportConfig, ExportConfig}; //! use std::time::Duration; //! use tonic::metadata::*; @@ -181,41 +181,51 @@ #![cfg_attr(test, deny(warnings))] mod exporter; +#[cfg(feature = "logs")] +mod logs; #[cfg(feature = "metrics")] mod metric; #[cfg(feature = "trace")] mod span; mod transform; +pub use crate::exporter::Compression; pub use crate::exporter::ExportConfig; #[cfg(feature = "trace")] pub use crate::span::{ - OtlpTracePipeline, SpanExporter, SpanExporterBuilder, OTEL_EXPORTER_OTLP_TRACES_ENDPOINT, - OTEL_EXPORTER_OTLP_TRACES_TIMEOUT, + OtlpTracePipeline, SpanExporter, SpanExporterBuilder, OTEL_EXPORTER_OTLP_TRACES_COMPRESSION, + OTEL_EXPORTER_OTLP_TRACES_ENDPOINT, OTEL_EXPORTER_OTLP_TRACES_TIMEOUT, }; #[cfg(feature = "metrics")] pub use crate::metric::{ - MetricsExporter, OtlpMetricPipeline, OTEL_EXPORTER_OTLP_METRICS_ENDPOINT, + MetricsExporter, MetricsExporterBuilder, OtlpMetricPipeline, + OTEL_EXPORTER_OTLP_METRICS_COMPRESSION, OTEL_EXPORTER_OTLP_METRICS_ENDPOINT, OTEL_EXPORTER_OTLP_METRICS_TIMEOUT, }; +#[cfg(feature = "logs")] +pub use crate::logs::{ + LogExporter, LogExporterBuilder, OtlpLogPipeline, OTEL_EXPORTER_OTLP_LOGS_COMPRESSION, +}; + pub use crate::exporter::{ - HasExportConfig, WithExportConfig, OTEL_EXPORTER_OTLP_ENDPOINT, - OTEL_EXPORTER_OTLP_ENDPOINT_DEFAULT, OTEL_EXPORTER_OTLP_TIMEOUT, + HasExportConfig, WithExportConfig, OTEL_EXPORTER_OTLP_COMPRESSION, OTEL_EXPORTER_OTLP_ENDPOINT, + OTEL_EXPORTER_OTLP_ENDPOINT_DEFAULT, OTEL_EXPORTER_OTLP_PROTOCOL, + OTEL_EXPORTER_OTLP_PROTOCOL_DEFAULT, OTEL_EXPORTER_OTLP_TIMEOUT, OTEL_EXPORTER_OTLP_TIMEOUT_DEFAULT, }; -use opentelemetry::sdk::export::ExportError; +use opentelemetry_sdk::export::ExportError; #[cfg(feature = "metrics")] use std::time::{Duration, SystemTime, UNIX_EPOCH}; #[cfg(feature = "grpc-sys")] -pub use crate::exporter::grpcio::{Compression, Credentials, GrpcioExporterBuilder}; +pub use crate::exporter::grpcio::{Credentials, GrpcioConfig, GrpcioExporterBuilder}; #[cfg(feature = "http-proto")] pub use crate::exporter::http::HttpExporterBuilder; #[cfg(feature = "grpc-tonic")] -pub use crate::exporter::tonic::TonicExporterBuilder; +pub use crate::exporter::tonic::{TonicConfig, TonicExporterBuilder}; #[cfg(feature = "serialize")] use serde::{Deserialize, Serialize}; @@ -250,8 +260,7 @@ /// Use HTTP as transport layer, return a `HttpExporterBuilder` to config the http transport /// and build the exporter. /// - /// This exporter can only be used in `tracing` pipeline. Support for `metrics` pipeline will be - /// added in the future. + /// This exporter can be used in both `tracing` and `metrics` pipeline. #[cfg(feature = "http-proto")] pub fn http(self) -> HttpExporterBuilder { HttpExporterBuilder::default() @@ -342,6 +351,10 @@ /// The pipeline will need a exporter to complete setup. Throw this error if none is provided. #[error("no exporter builder is provided, please provide one using with_exporter() method")] NoExporterBuilder, + + /// Unsupported compression algorithm. + #[error("unsupported compression algorithm '{0}'")] + UnsupportedCompressionAlgorithm(String), } #[cfg(feature = "grpc-tonic")] @@ -368,7 +381,7 @@ /// The communication protocol to use when exporting data. #[cfg_attr(feature = "serialize", derive(Deserialize, Serialize))] -#[derive(Clone, Copy, Debug)] +#[derive(Clone, Copy, Debug, Eq, PartialEq)] pub enum Protocol { /// GRPC protocol Grpc, diff -Nru temporalio-1.3.0/vendor/opentelemetry-otlp/src/logs.rs temporalio-1.3.0/vendor/opentelemetry-otlp/src/logs.rs --- temporalio-1.3.0/vendor/opentelemetry-otlp/src/logs.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-otlp/src/logs.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,507 @@ +//! OTLP - Log Exporter +//! +//! Defines a [LogExporter] to send logs via the OpenTelemetry Protocol (OTLP) + +#[cfg(feature = "grpc-tonic")] +use { + crate::exporter::tonic::{resolve_compression, TonicConfig, TonicExporterBuilder}, + opentelemetry_proto::tonic::collector::logs::v1::{ + logs_service_client::LogsServiceClient as TonicLogsServiceClient, + ExportLogsServiceRequest as TonicRequest, + }, + tonic::{ + metadata::{KeyAndValueRef, MetadataMap}, + transport::Channel as TonicChannel, + Request, + }, +}; + +#[cfg(feature = "grpc-sys")] +use { + crate::exporter::grpcio::{GrpcioConfig, GrpcioExporterBuilder}, + grpcio::{ + CallOption, Channel as GrpcChannel, ChannelBuilder, ChannelCredentialsBuilder, Environment, + MetadataBuilder, + }, + opentelemetry_proto::grpcio::{ + logs_service::ExportLogsServiceRequest as GrpcRequest, + logs_service_grpc::LogsServiceClient as GrpcioLogServiceClient, + }, +}; + +#[cfg(feature = "http-proto")] +use { + crate::exporter::http::{HttpConfig, HttpExporterBuilder}, + http::{ + header::{HeaderName, HeaderValue, CONTENT_TYPE}, + Method, Uri, + }, + opentelemetry_http::HttpClient, + opentelemetry_proto::tonic::collector::logs::v1::ExportLogsServiceRequest as ProstRequest, + prost::Message, + std::convert::TryFrom, +}; + +#[cfg(any(feature = "grpc-sys", feature = "http-proto"))] +use std::{collections::HashMap, sync::Arc}; + +use crate::exporter::ExportConfig; +use crate::OtlpPipeline; +use async_trait::async_trait; +use std::{ + borrow::Cow, + fmt::{self, Debug}, + time::Duration, +}; + +use opentelemetry_api::{ + global, + logs::{LogError, LoggerProvider}, +}; +use opentelemetry_sdk::{self, export::logs::LogData, logs::BatchMessage, runtime::RuntimeChannel}; + +/// Compression algorithm to use, defaults to none. +pub const OTEL_EXPORTER_OTLP_LOGS_COMPRESSION: &str = "OTEL_EXPORTER_OTLP_LOGS_COMPRESSION"; + +impl OtlpPipeline { + /// Create a OTLP logging pipeline. + pub fn logging(self) -> OtlpLogPipeline { + OtlpLogPipeline::default() + } +} + +/// OTLP log exporter builder +#[derive(Debug)] +#[allow(clippy::large_enum_variant)] +#[non_exhaustive] +pub enum LogExporterBuilder { + /// Tonic log exporter builder + #[cfg(feature = "grpc-tonic")] + Tonic(TonicExporterBuilder), + /// Grpc log exporter builder + #[cfg(feature = "grpc-sys")] + Grpcio(GrpcioExporterBuilder), + /// Http log exporter builder + #[cfg(feature = "http-proto")] + Http(HttpExporterBuilder), +} + +impl LogExporterBuilder { + /// Build a OTLP log exporter using the given configuration. + pub fn build_log_exporter(self) -> Result { + match self { + #[cfg(feature = "grpc-tonic")] + LogExporterBuilder::Tonic(builder) => Ok(match builder.channel { + Some(channel) => LogExporter::from_tonic_channel( + builder.exporter_config, + builder.tonic_config, + channel, + ), + None => LogExporter::new_tonic(builder.exporter_config, builder.tonic_config), + }?), + #[cfg(feature = "grpc-sys")] + LogExporterBuilder::Grpcio(builder) => Ok(LogExporter::new_grpcio( + builder.exporter_config, + builder.grpcio_config, + )), + #[cfg(feature = "http-proto")] + LogExporterBuilder::Http(builder) => Ok(LogExporter::new_http( + builder.exporter_config, + builder.http_config, + )?), + } + } +} + +#[cfg(feature = "grpc-tonic")] +impl From for LogExporterBuilder { + fn from(exporter: TonicExporterBuilder) -> Self { + LogExporterBuilder::Tonic(exporter) + } +} + +#[cfg(feature = "grpc-sys")] +impl From for LogExporterBuilder { + fn from(exporter: GrpcioExporterBuilder) -> Self { + LogExporterBuilder::Grpcio(exporter) + } +} + +#[cfg(feature = "http-proto")] +impl From for LogExporterBuilder { + fn from(exporter: HttpExporterBuilder) -> Self { + LogExporterBuilder::Http(exporter) + } +} + +/// OTLP exporter that sends log data +pub enum LogExporter { + #[cfg(feature = "grpc-tonic")] + /// Log Exporter using tonic as grpc layer. + Tonic { + /// Duration of timeout when sending logs to backend. + timeout: Duration, + /// Additional headers of the outbound requests. + metadata: Option, + /// The Grpc log exporter + log_exporter: TonicLogsServiceClient, + }, + #[cfg(feature = "grpc-sys")] + /// Log Exporter using grpcio as grpc layer + Grpcio { + /// Duration of timeout when sending logs to backend. + timeout: Duration, + /// Additional headers of the outbound requests. + headers: Option>, + /// The Grpc log exporter + log_exporter: GrpcioLogServiceClient, + }, + #[cfg(feature = "http-proto")] + /// Log Exporter using HTTP transport + Http { + /// Duration of timeout when sending logs to backend. + timeout: Duration, + /// Additional headers of the outbound requests. + headers: Option>, + /// The Collector URL + collector_endpoint: Uri, + /// The HTTP log exporter + log_exporter: Option>, + }, +} + +impl Debug for LogExporter { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + #[cfg(feature = "grpc-tonic")] + LogExporter::Tonic { + metadata, timeout, .. + } => f + .debug_struct("Exporter") + .field("metadata", &metadata) + .field("timeout", &timeout) + .field("log_exporter", &"LogServiceClient") + .finish(), + #[cfg(feature = "grpc-sys")] + LogExporter::Grpcio { + headers, timeout, .. + } => f + .debug_struct("Exporter") + .field("headers", &headers) + .field("timeout", &timeout) + .field("log_exporter", &"LogServiceClient") + .finish(), + #[cfg(feature = "http-proto")] + LogExporter::Http { + headers, timeout, .. + } => f + .debug_struct("Exporter") + .field("headers", &headers) + .field("timeout", &timeout) + .field("log_exporter", &"LogServiceClient") + .finish(), + } + } +} + +impl LogExporter { + /// Builds a new log exporter with the given configuration. + #[cfg(feature = "grpc-tonic")] + pub fn new_tonic( + config: ExportConfig, + tonic_config: TonicConfig, + ) -> Result { + let endpoint = TonicChannel::from_shared(config.endpoint.clone())?; + + #[cfg(feature = "tls")] + let channel = match tonic_config.tls_config.as_ref() { + Some(tls_config) => endpoint.tls_config(tls_config.clone())?, + None => endpoint, + } + .timeout(config.timeout) + .connect_lazy(); + + #[cfg(not(feature = "tls"))] + let channel = endpoint.timeout(config.timeout).connect_lazy(); + + LogExporter::from_tonic_channel(config, tonic_config, channel) + } + + /// Builds a new log exporter with given tonic channel. + /// + /// This allows users to bring their own custom channel like UDS. + /// However, users MUST make sure the [`ExportConfig::timeout`] is + /// the same as the channel's timeout. + #[cfg(feature = "grpc-tonic")] + pub fn from_tonic_channel( + config: ExportConfig, + tonic_config: TonicConfig, + channel: tonic::transport::Channel, + ) -> Result { + let mut log_exporter = TonicLogsServiceClient::new(channel); + if let Some(compression) = + resolve_compression(&tonic_config, OTEL_EXPORTER_OTLP_LOGS_COMPRESSION)? + { + log_exporter = log_exporter.send_compressed(compression); + } + Ok(LogExporter::Tonic { + timeout: config.timeout, + metadata: tonic_config.metadata, + log_exporter, + }) + } + + /// Builds a new log exporter with the given configuration + #[cfg(feature = "grpc-sys")] + pub fn new_grpcio(config: ExportConfig, grpcio_config: GrpcioConfig) -> Self { + let mut builder: ChannelBuilder = ChannelBuilder::new(Arc::new(Environment::new( + grpcio_config.completion_queue_count, + ))); + + if let Some(compression) = grpcio_config.compression { + builder = builder.default_compression_algorithm(compression.into()); + } + + let channel: GrpcChannel = match (grpcio_config.credentials, grpcio_config.use_tls) { + (None, Some(true)) => builder + .set_credentials(ChannelCredentialsBuilder::new().build()) + .connect(config.endpoint.as_str()), + (None, _) => builder.connect(config.endpoint.as_str()), + (Some(credentials), _) => builder + .set_credentials( + ChannelCredentialsBuilder::new() + .cert(credentials.cert.into(), credentials.key.into()) + .build(), + ) + .connect(config.endpoint.as_str()), + }; + + LogExporter::Grpcio { + log_exporter: GrpcioLogServiceClient::new(channel), + timeout: config.timeout, + headers: grpcio_config.headers, + } + } + + /// Builds a new log exporter with the given configuration + #[cfg(feature = "http-proto")] + pub fn new_http(config: ExportConfig, http_config: HttpConfig) -> Result { + let url: Uri = config + .endpoint + .parse() + .map_err::(Into::into)?; + + Ok(LogExporter::Http { + log_exporter: http_config.client, + timeout: config.timeout, + collector_endpoint: url, + headers: http_config.headers, + }) + } +} + +#[async_trait] +impl opentelemetry_sdk::export::logs::LogExporter for LogExporter { + async fn export(&mut self, batch: Vec) -> opentelemetry_api::logs::LogResult<()> { + match self { + #[cfg(feature = "grpc-sys")] + LogExporter::Grpcio { + timeout, + headers, + log_exporter, + } => { + let request = GrpcRequest { + resource_logs: protobuf::RepeatedField::from_vec( + batch.into_iter().map(Into::into).collect(), + ), + unknown_fields: Default::default(), + cached_size: Default::default(), + }; + + let mut call_options = CallOption::default().timeout(*timeout); + + if let Some(headers) = headers.clone() { + let mut metadata_builder: MetadataBuilder = MetadataBuilder::new(); + + for (key, value) in headers { + let _ = metadata_builder.add_str(key.as_str(), value.as_str()); + } + + call_options = call_options.headers(metadata_builder.build()); + } + + let receiver = log_exporter + .export_async_opt(&request, call_options) + .map_err::(Into::into)?; + receiver.await.map_err::(Into::into)?; + Ok(()) + } + #[cfg(feature = "grpc-tonic")] + LogExporter::Tonic { + log_exporter, + metadata, + .. + } => { + let mut request = Request::new(TonicRequest { + resource_logs: batch.into_iter().map(Into::into).collect(), + }); + + if let Some(metadata) = metadata { + for key_and_value in metadata.iter() { + match key_and_value { + KeyAndValueRef::Ascii(key, value) => { + request.metadata_mut().append(key, value.to_owned()) + } + KeyAndValueRef::Binary(key, value) => { + request.metadata_mut().append_bin(key, value.to_owned()) + } + }; + } + } + + log_exporter + .to_owned() + .export(request) + .await + .map_err::(Into::into)?; + + Ok(()) + } + + #[cfg(feature = "http-proto")] + LogExporter::Http { + log_exporter, + collector_endpoint, + headers, + .. + } => { + let req = ProstRequest { + resource_logs: batch.into_iter().map(Into::into).collect(), + }; + + let mut buf = vec![]; + req.encode(&mut buf) + .map_err::(Into::into)?; + + let mut request = http::Request::builder() + .method(Method::POST) + .uri(collector_endpoint.clone()) + .header(CONTENT_TYPE, "application/x-protobuf") + .body(buf) + .map_err::(Into::into)?; + + if let Some(headers) = headers.clone() { + for (k, val) in headers { + let value = HeaderValue::from_str(val.as_ref()) + .map_err::(Into::into)?; + let key = + HeaderName::try_from(&k).map_err::(Into::into)?; + request.headers_mut().insert(key, value); + } + } + + if let Some(client) = log_exporter { + client.send(request).await?; + Ok(()) + } else { + Err(crate::Error::NoHttpClient.into()) + } + } + } + } +} + +/// Recommended configuration for an OTLP exporter pipeline. +#[derive(Default, Debug)] +pub struct OtlpLogPipeline { + exporter_builder: Option, + log_config: Option, +} + +impl OtlpLogPipeline { + /// Set the OTLP log exporter builder. + pub fn with_exporter>(mut self, pipeline: B) -> Self { + self.exporter_builder = Some(pipeline.into()); + self + } + + /// Set the log provider configuration. + pub fn with_log_config(mut self, log_config: opentelemetry_sdk::logs::Config) -> Self { + self.log_config = Some(log_config); + self + } + + /// Install the configured log exporter. + /// + /// Returns a [`Logger`] with the name `opentelemetry-otlp` and the current crate version. + /// + /// [`Logger`]: opentelemetry_sdk::logs::Logger + pub fn install_simple(self) -> Result { + Ok(build_simple_with_exporter( + self.exporter_builder + .ok_or(crate::Error::NoExporterBuilder)? + .build_log_exporter()?, + self.log_config, + )) + } + + /// Install the configured log exporter and a batch span processor using the + /// specified runtime. + /// + /// Returns a [`Logger`] with the name `opentelemetry-otlp` and the current crate version. + /// + /// [`Logger`]: opentelemetry_sdk::logs::Logger + pub fn install_batch>( + self, + runtime: R, + ) -> Result { + Ok(build_batch_with_exporter( + self.exporter_builder + .ok_or(crate::Error::NoExporterBuilder)? + .build_log_exporter()?, + self.log_config, + runtime, + )) + } +} + +fn build_simple_with_exporter( + exporter: LogExporter, + log_config: Option, +) -> opentelemetry_sdk::logs::Logger { + let mut provider_builder = + opentelemetry_sdk::logs::LoggerProvider::builder().with_simple_exporter(exporter); + if let Some(config) = log_config { + provider_builder = provider_builder.with_config(config); + } + let provider = provider_builder.build(); + let logger = provider.versioned_logger( + Cow::Borrowed("opentelemetry-otlp"), + Some(Cow::Borrowed(env!("CARGO_PKG_VERSION"))), + None, + None, + ); + let _ = global::set_logger_provider(provider); + logger +} + +fn build_batch_with_exporter>( + exporter: LogExporter, + log_config: Option, + runtime: R, +) -> opentelemetry_sdk::logs::Logger { + let mut provider_builder = + opentelemetry_sdk::logs::LoggerProvider::builder().with_batch_exporter(exporter, runtime); + if let Some(config) = log_config { + provider_builder = provider_builder.with_config(config); + } + let provider = provider_builder.build(); + let logger = provider.versioned_logger( + Cow::Borrowed("opentelemetry-otlp"), + Some(Cow::Borrowed("CARGO_PKG_VERSION")), + None, + None, + ); + let _ = global::set_logger_provider(provider); + logger +} diff -Nru temporalio-1.3.0/vendor/opentelemetry-otlp/src/metric.rs temporalio-1.3.0/vendor/opentelemetry-otlp/src/metric.rs --- temporalio-1.3.0/vendor/opentelemetry-otlp/src/metric.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-otlp/src/metric.rs 2023-10-30 19:40:00.000000000 +0000 @@ -4,45 +4,59 @@ //! //! Currently, OTEL metrics exporter only support GRPC connection via tonic on tokio runtime. -use crate::exporter::{ - tonic::{TonicConfig, TonicExporterBuilder}, - ExportConfig, -}; -use crate::transform::{record_to_metric, sink, CheckpointedMetrics}; +use crate::transform::sink; use crate::{Error, OtlpPipeline}; +use async_trait::async_trait; use core::fmt; -use opentelemetry::{global, metrics::Result, runtime::Runtime}; -use opentelemetry::{ - sdk::{ - export::metrics::{ - self, - aggregation::{AggregationKind, Temporality, TemporalitySelector}, - AggregatorSelector, InstrumentationLibraryReader, - }, - metrics::{ - controllers::{self, BasicController}, - processors, - sdk_api::Descriptor, +use opentelemetry_api::{ + global, + metrics::{MetricsError, Result}, +}; + +use opentelemetry_sdk::{ + metrics::{ + data::{ResourceMetrics, Temporality}, + exporter::PushMetricsExporter, + reader::{ + AggregationSelector, DefaultAggregationSelector, DefaultTemporalitySelector, + TemporalitySelector, }, - Resource, + Aggregation, InstrumentKind, MeterProvider, PeriodicReader, }, - Context, -}; -#[cfg(feature = "grpc-tonic")] -use opentelemetry_proto::tonic::collector::metrics::v1::{ - metrics_service_client::MetricsServiceClient, ExportMetricsServiceRequest, + runtime::Runtime, + Resource, }; use std::fmt::{Debug, Formatter}; -#[cfg(feature = "grpc-tonic")] -use std::str::FromStr; use std::sync::Mutex; use std::time; use std::time::Duration; +use tonic::codegen::{Body, StdError}; use tonic::metadata::KeyAndValueRef; #[cfg(feature = "grpc-tonic")] -use tonic::transport::Channel; -#[cfg(feature = "grpc-tonic")] -use tonic::Request; +use { + crate::exporter::tonic::{resolve_compression, TonicExporterBuilder}, + opentelemetry_proto::tonic::collector::metrics::v1::{ + metrics_service_client::MetricsServiceClient, ExportMetricsServiceRequest, + }, + std::str::FromStr, + tonic::codegen::Bytes, + tonic::transport::Channel, + tonic::Request, +}; + +#[cfg(feature = "http-proto")] +use { + crate::exporter::http::HttpExporterBuilder, + http::{ + header::{HeaderName, HeaderValue, CONTENT_TYPE}, + Method, Uri, + }, + opentelemetry_http::HttpClient, + prost::Message, + std::collections::HashMap, + std::convert::TryFrom, + std::sync::Arc, +}; /// Target to which the exporter is going to send metrics, defaults to https://localhost:4317/v1/metrics. /// Learn about the relationship between this constant and default/spans/logs at @@ -50,24 +64,18 @@ pub const OTEL_EXPORTER_OTLP_METRICS_ENDPOINT: &str = "OTEL_EXPORTER_OTLP_METRICS_ENDPOINT"; /// Max waiting time for the backend to process each metrics batch, defaults to 10s. pub const OTEL_EXPORTER_OTLP_METRICS_TIMEOUT: &str = "OTEL_EXPORTER_OTLP_METRICS_TIMEOUT"; - +/// Compression algorithm to use, defaults to none. +pub const OTEL_EXPORTER_OTLP_METRICS_COMPRESSION: &str = "OTEL_EXPORTER_OTLP_METRICS_COMPRESSION"; impl OtlpPipeline { /// Create a OTLP metrics pipeline. - pub fn metrics( - self, - aggregator_selector: AS, - temporality_selector: TS, - rt: RT, - ) -> OtlpMetricPipeline + pub fn metrics(self, rt: RT) -> OtlpMetricPipeline where - AS: AggregatorSelector, - TS: TemporalitySelector + Clone, RT: Runtime, { OtlpMetricPipeline { rt, - aggregator_selector, - temporality_selector, + aggregator_selector: None, + temporality_selector: None, exporter_pipeline: None, resource: None, period: None, @@ -76,54 +84,72 @@ } } +/// OTLP metrics exporter builder. #[derive(Debug)] #[non_exhaustive] pub enum MetricsExporterBuilder { + /// Tonic metrics exporter builder #[cfg(feature = "grpc-tonic")] Tonic(TonicExporterBuilder), + /// Http metrics exporter builder + #[cfg(feature = "http-proto")] + Http(HttpExporterBuilder), } impl MetricsExporterBuilder { /// Build a OTLP metrics exporter with given configuration. - fn build_metrics_exporter( + pub fn build_metrics_exporter( self, - temporality_selector: Box, + temporality_selector: Box, + aggregation_selector: Box, ) -> Result { match self { #[cfg(feature = "grpc-tonic")] MetricsExporterBuilder::Tonic(builder) => Ok(MetricsExporter::new( - builder.exporter_config, - builder.tonic_config, + builder, + temporality_selector, + aggregation_selector, + )?), + #[cfg(feature = "http-proto")] + MetricsExporterBuilder::Http(builder) => Ok(MetricsExporter::new_http( + builder, temporality_selector, + aggregation_selector, )?), } } } +#[cfg(feature = "grpc-tonic")] impl From for MetricsExporterBuilder { fn from(exporter: TonicExporterBuilder) -> Self { MetricsExporterBuilder::Tonic(exporter) } } +#[cfg(feature = "http-proto")] +impl From for MetricsExporterBuilder { + fn from(exporter: HttpExporterBuilder) -> Self { + MetricsExporterBuilder::Http(exporter) + } +} + /// Pipeline to build OTLP metrics exporter /// /// Note that currently the OTLP metrics exporter only supports tonic as it's grpc layer and tokio as /// runtime. -pub struct OtlpMetricPipeline { +pub struct OtlpMetricPipeline { rt: RT, - aggregator_selector: AS, - temporality_selector: TS, + aggregator_selector: Option>, + temporality_selector: Option>, exporter_pipeline: Option, resource: Option, period: Option, timeout: Option, } -impl OtlpMetricPipeline +impl OtlpMetricPipeline where - AS: AggregatorSelector + Send + Sync + 'static, - TS: TemporalitySelector + Clone + Send + Sync + 'static, RT: Runtime, { /// Build with resource key value pairs. @@ -158,38 +184,60 @@ } } - /// Build push controller. - pub fn build(self) -> Result { + /// Build with the given temporality selector + pub fn with_temporality_selector(self, selector: T) -> Self { + OtlpMetricPipeline { + temporality_selector: Some(Box::new(selector)), + ..self + } + } + + /// Build with the given aggregation selector + pub fn with_aggregation_selector(self, selector: T) -> Self { + OtlpMetricPipeline { + aggregator_selector: Some(Box::new(selector)), + ..self + } + } + + /// Build MeterProvider + pub fn build(self) -> Result { let exporter = self .exporter_pipeline .ok_or(Error::NoExporterBuilder)? - .build_metrics_exporter(Box::new(self.temporality_selector.clone()))?; + .build_metrics_exporter( + self.temporality_selector + .unwrap_or_else(|| Box::new(DefaultTemporalitySelector::new())), + self.aggregator_selector + .unwrap_or_else(|| Box::new(DefaultAggregationSelector::new())), + )?; + + let mut builder = PeriodicReader::builder(exporter, self.rt); - let mut builder = controllers::basic(processors::factory( - self.aggregator_selector, - self.temporality_selector, - )) - .with_exporter(exporter); if let Some(period) = self.period { - builder = builder.with_collect_period(period); + builder = builder.with_interval(period); } if let Some(timeout) = self.timeout { - builder = builder.with_collect_timeout(timeout) + builder = builder.with_timeout(timeout) } + + let reader = builder.build(); + + let mut provider = MeterProvider::builder().with_reader(reader); + if let Some(resource) = self.resource { - builder = builder.with_resource(resource); + provider = provider.with_resource(resource); } - let controller = builder.build(); - controller.start(&Context::current(), self.rt)?; + let provider = provider.build(); - global::set_meter_provider(controller.clone()); + global::set_meter_provider(provider.clone()); - Ok(controller) + Ok(provider) } } -impl fmt::Debug for OtlpMetricPipeline { +impl fmt::Debug for OtlpMetricPipeline { fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { f.debug_struct("OtlpMetricPipeline") .field("exporter_pipeline", &self.exporter_pipeline) @@ -200,18 +248,49 @@ } } -enum ExportMsg { - #[cfg(feature = "grpc-tonic")] +#[cfg(feature = "grpc-tonic")] +pub enum ExportMsg { Export(tonic::Request), Shutdown, } +#[cfg(feature = "grpc-tonic")] +impl fmt::Debug for ExportMsg { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + f.write_str("ExportMsg") + } +} + /// Export metrics in OTEL format. -pub struct MetricsExporter { - #[cfg(feature = "tokio")] - sender: Mutex>, - temporality_selector: Box, - metadata: Option, +pub enum MetricsExporter { + #[cfg(feature = "grpc-tonic")] + /// metrics exporter using using tonic as grpc layer. + Tonic { + /// tokio mpsc sender + sender: Mutex>, + /// Additional headers of the outbound requests. + metadata: Option, + /// temporality selector + temporality_selector: Box, + /// aggregation selector + aggregation_selector: Box, + }, + #[cfg(feature = "http-proto")] + /// metrics exporter using HTTP transport + Http { + /// Duration of timeout when sending spans to backend + timeout: Duration, + /// Additional headers of the outbound requests. + headers: Option>, + /// The Collector URL + collector_endpoint: Uri, + /// metrics exporter + metrics_exporter: Option>, + /// temporality selector + temporality_selector: Box, + /// aggregation selector + aggregation_selector: Box, + }, } impl Debug for MetricsExporter { @@ -224,19 +303,51 @@ } impl TemporalitySelector for MetricsExporter { - fn temporality_for(&self, descriptor: &Descriptor, kind: &AggregationKind) -> Temporality { - self.temporality_selector.temporality_for(descriptor, kind) + fn temporality(&self, kind: InstrumentKind) -> Temporality { + match self { + #[cfg(feature = "grpc-tonic")] + MetricsExporter::Tonic { + temporality_selector, + .. + } => temporality_selector.temporality(kind), + #[cfg(feature = "http-proto")] + MetricsExporter::Http { + temporality_selector, + .. + } => temporality_selector.temporality(kind), + } + } +} + +impl AggregationSelector for MetricsExporter { + fn aggregation(&self, kind: InstrumentKind) -> Aggregation { + match self { + #[cfg(feature = "grpc-tonic")] + MetricsExporter::Tonic { + aggregation_selector, + .. + } => aggregation_selector.aggregation(kind), + + #[cfg(feature = "http-proto")] + MetricsExporter::Http { + aggregation_selector, + .. + } => aggregation_selector.aggregation(kind), + } } } impl MetricsExporter { - /// Create a new OTLP metrics exporter. + /// Create a new OTLP gRPC metrics exporter. #[cfg(feature = "grpc-tonic")] pub fn new( - config: ExportConfig, - mut tonic_config: TonicConfig, - temporality_selector: Box, + export_builder: TonicExporterBuilder, + temporality_selector: Box, + aggregation_selector: Box, ) -> Result { + let config = export_builder.exporter_config; + let mut tonic_config = export_builder.tonic_config; + let endpoint = match std::env::var(OTEL_EXPORTER_OTLP_METRICS_ENDPOINT) { Ok(val) => val, Err(_) => format!("{}{}", config.endpoint, "/v1/metrics"), @@ -249,10 +360,12 @@ }, Err(_) => config.timeout, }; + let compression = + resolve_compression(&tonic_config, OTEL_EXPORTER_OTLP_METRICS_COMPRESSION)?; let endpoint = Channel::from_shared(endpoint).map_err::(Into::into)?; - #[cfg(all(feature = "tls"))] + #[cfg(feature = "tls")] let channel = match tonic_config.tls_config { Some(tls_config) => endpoint .tls_config(tls_config) @@ -265,73 +378,191 @@ #[cfg(not(feature = "tls"))] let channel = endpoint.timeout(config.timeout).connect_lazy(); - let client = MetricsServiceClient::new(channel); - - let (sender, mut receiver) = tokio::sync::mpsc::channel::(2); - tokio::spawn(Box::pin(async move { - while let Some(msg) = receiver.recv().await { - match msg { - ExportMsg::Shutdown => { - break; + let (sender, receiver) = tokio::sync::mpsc::channel::(2); + tokio::spawn(async move { + match export_builder.interceptor { + Some(interceptor) => { + let mut client = MetricsServiceClient::with_interceptor(channel, interceptor); + if let Some(compression) = compression { + client = client.send_compressed(compression); } - ExportMsg::Export(req) => { - let _ = client.to_owned().export(req).await; + + export_sink(client, receiver).await + } + None => { + let mut client = MetricsServiceClient::new(channel); + if let Some(compression) = compression { + client = client.send_compressed(compression) } + export_sink(client, receiver).await } } - })); + }); - Ok(MetricsExporter { + Ok(MetricsExporter::Tonic { sender: Mutex::new(sender), temporality_selector, + aggregation_selector, metadata: tonic_config.metadata.take(), }) } + + /// Create a new OTLP HTTP metrics exporter. + #[cfg(feature = "http-proto")] + pub fn new_http( + export_builder: HttpExporterBuilder, + temporality_selector: Box, + aggregation_selector: Box, + ) -> Result { + let config = export_builder.exporter_config; + let http_config = export_builder.http_config; + let _endpoint = match std::env::var(OTEL_EXPORTER_OTLP_METRICS_ENDPOINT) { + Ok(val) => val, + Err(_) => format!("{}{}", config.endpoint, "/v1/metrics"), + }; + + let url: Uri = config + .endpoint + .parse() + .map_err::(Into::into)?; + + let _timeout = match std::env::var(OTEL_EXPORTER_OTLP_METRICS_TIMEOUT) { + Ok(val) => match u64::from_str(&val) { + Ok(seconds) => Duration::from_secs(seconds), + Err(_) => config.timeout, + }, + Err(_) => config.timeout, + }; + + Ok(MetricsExporter::Http { + metrics_exporter: http_config.client, + timeout: config.timeout, + collector_endpoint: url, + headers: http_config.headers, + temporality_selector, + aggregation_selector, + }) + } } -impl metrics::MetricsExporter for MetricsExporter { - fn export( - &self, - _cx: &Context, - res: &Resource, - reader: &dyn InstrumentationLibraryReader, - ) -> Result<()> { - let mut resource_metrics: Vec = Vec::default(); - // transform the metrics into proto. Append the resource and instrumentation library information into it. - reader.try_for_each(&mut |library, record| { - record.try_for_each(self, &mut |record| { - let metrics = record_to_metric(record, self.temporality_selector.as_ref())?; - resource_metrics.push((res.clone().into(), library.clone(), metrics)); - Ok(()) - }) - })?; - let mut request = Request::new(sink(resource_metrics)); - if let Some(metadata) = &self.metadata { - for key_and_value in metadata.iter() { - match key_and_value { - KeyAndValueRef::Ascii(key, value) => { - request.metadata_mut().append(key, value.to_owned()) - } - KeyAndValueRef::Binary(key, value) => { - request.metadata_mut().append_bin(key, value.to_owned()) +#[cfg(feature = "http-proto")] +async fn http_send_request( + metrics: &ResourceMetrics, + client: std::sync::Arc, + headers: Option>, + collector_endpoint: Uri, +) -> Result<()> { + let req = sink(metrics); + let mut buf = vec![]; + req.encode(&mut buf) + .map_err::(Into::into)?; + let mut request = http::Request::builder() + .method(Method::POST) + .uri(collector_endpoint) + .header(CONTENT_TYPE, "application/x-protobuf") + .body(buf) + .map_err::(Into::into)?; + + if let Some(headers) = headers { + for (k, val) in headers { + let value = + HeaderValue::from_str(val.as_ref()).map_err::(Into::into)?; + let key = HeaderName::try_from(&k).map_err::(Into::into)?; + request.headers_mut().insert(key, value); + } + } + client + .send(request) + .await + .map_err(|_| Error::PoisonedLock("Error sending to collector"))?; + Ok(()) +} + +#[cfg(feature = "grpc-tonic")] +async fn export_sink( + mut client: MetricsServiceClient, + mut receiver: tokio::sync::mpsc::Receiver, +) where + T: tonic::client::GrpcService, + T::Error: Into, + T::ResponseBody: Body + Send + 'static, + ::Error: Into + Send, +{ + while let Some(msg) = receiver.recv().await { + match msg { + ExportMsg::Shutdown => { + break; + } + ExportMsg::Export(req) => { + let _r = client.export(req).await; + } + } + } +} + +#[async_trait] +impl PushMetricsExporter for MetricsExporter { + async fn export(&self, metrics: &mut ResourceMetrics) -> Result<()> { + match self { + #[cfg(feature = "grpc-tonic")] + MetricsExporter::Tonic { + sender, metadata, .. + } => { + let mut request = Request::new(sink(metrics)); + if let Some(metadata) = metadata { + for key_and_value in metadata.iter() { + match key_and_value { + KeyAndValueRef::Ascii(key, value) => { + request.metadata_mut().append(key, value.to_owned()) + } + KeyAndValueRef::Binary(key, value) => { + request.metadata_mut().append_bin(key, value.to_owned()) + } + }; } - }; + } + sender + .lock() + .map(|sender| { + let _ = sender.try_send(ExportMsg::Export(request)); + }) + .map_err(|_| Error::PoisonedLock("otlp metric exporter's tonic sender"))?; + Ok(()) + } + #[cfg(feature = "http-proto")] + MetricsExporter::Http { + headers, + collector_endpoint, + metrics_exporter, + .. + } => { + if let Some(ref client) = metrics_exporter { + let client = Arc::clone(client); + http_send_request(metrics, client, headers.clone(), collector_endpoint.clone()) + .await?; + } else { + } + Ok(()) } } - self.sender - .lock() - .map(|sender| { - let _ = sender.try_send(ExportMsg::Export(request)); - }) - .map_err(|_| Error::PoisonedLock("otlp metric exporter's tonic sender"))?; + } + + async fn force_flush(&self) -> Result<()> { + // this component is stateless Ok(()) } -} -impl Drop for MetricsExporter { - fn drop(&mut self) { - let _sender_lock_guard = self.sender.lock().map(|sender| { - let _ = sender.try_send(ExportMsg::Shutdown); - }); + fn shutdown(&self) -> Result<()> { + match self { + #[cfg(feature = "grpc-tonic")] + MetricsExporter::Tonic { sender, .. } => { + let sender_lk = sender.lock()?; + sender_lk + .try_send(ExportMsg::Shutdown) + .map_err(|e| MetricsError::Other(format!("error shutting down otlp {e}"))) + } + #[cfg(feature = "http-proto")] + MetricsExporter::Http { .. } => Ok(()), + } } } diff -Nru temporalio-1.3.0/vendor/opentelemetry-otlp/src/span.rs temporalio-1.3.0/vendor/opentelemetry-otlp/src/span.rs --- temporalio-1.3.0/vendor/opentelemetry-otlp/src/span.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-otlp/src/span.rs 2023-10-30 19:40:00.000000000 +0000 @@ -9,7 +9,7 @@ use std::str::FromStr; #[cfg(feature = "grpc-tonic")] use { - crate::exporter::tonic::{TonicConfig, TonicExporterBuilder}, + crate::exporter::tonic::{resolve_compression, TonicConfig, TonicExporterBuilder}, opentelemetry_proto::tonic::collector::trace::v1::{ trace_service_client::TraceServiceClient as TonicTraceServiceClient, ExportTraceServiceRequest as TonicRequest, @@ -53,17 +53,20 @@ use crate::exporter::ExportConfig; use crate::OtlpPipeline; -use opentelemetry::{ +use opentelemetry_api::{ global, - sdk::{ - self, - export::trace::{ExportResult, SpanData}, - trace::TraceRuntime, - }, trace::{TraceError, TracerProvider}, }; +use opentelemetry_sdk::{ + self as sdk, + export::trace::{ExportResult, SpanData}, + trace::BatchMessage, +}; +use opentelemetry_semantic_conventions::SCHEMA_URL; use async_trait::async_trait; +use futures_core::future::BoxFuture; +use sdk::runtime::RuntimeChannel; /// Target to which the exporter is going to send spans, defaults to https://localhost:4317/v1/traces. /// Learn about the relationship between this constant and default/metrics/logs at @@ -71,6 +74,8 @@ pub const OTEL_EXPORTER_OTLP_TRACES_ENDPOINT: &str = "OTEL_EXPORTER_OTLP_TRACES_ENDPOINT"; /// Max waiting time for the backend to process each spans batch, defaults to 10s. pub const OTEL_EXPORTER_OTLP_TRACES_TIMEOUT: &str = "OTEL_EXPORTER_OTLP_TRACES_TIMEOUT"; +/// Compression algorithm to use, defaults to none. +pub const OTEL_EXPORTER_OTLP_TRACES_COMPRESSION: &str = "OTEL_EXPORTER_OTLP_TRACES_COMPRESSION"; impl OtlpPipeline { /// Create a OTLP tracing pipeline. @@ -90,6 +95,7 @@ pub struct OtlpTracePipeline { exporter_builder: Option, trace_config: Option, + batch_config: Option, } impl OtlpTracePipeline { @@ -99,6 +105,12 @@ self } + /// Set the batch span processor configuration, and it will override the env vars. + pub fn with_batch_config(mut self, batch_config: sdk::trace::BatchConfig) -> Self { + self.batch_config = Some(batch_config); + self + } + /// Set the OTLP span exporter builder. /// /// Note that the pipeline will not build the exporter until [`install_batch`] or [`install_simple`] @@ -115,7 +127,7 @@ /// /// Returns a [`Tracer`] with the name `opentelemetry-otlp` and current crate version. /// - /// [`Tracer`]: opentelemetry::trace::Tracer + /// [`Tracer`]: opentelemetry_api::trace::Tracer pub fn install_simple(self) -> Result { Ok(build_simple_with_exporter( self.exporter_builder @@ -132,8 +144,8 @@ /// /// `install_batch` will panic if not called within a tokio runtime /// - /// [`Tracer`]: opentelemetry::trace::Tracer - pub fn install_batch( + /// [`Tracer`]: opentelemetry_api::trace::Tracer + pub fn install_batch>( self, runtime: R, ) -> Result { @@ -143,6 +155,7 @@ .build_span_exporter()?, self.trace_config, runtime, + self.batch_config, )) } } @@ -156,25 +169,38 @@ provider_builder = provider_builder.with_config(config); } let provider = provider_builder.build(); - let tracer = - provider.versioned_tracer("opentelemetry-otlp", Some(env!("CARGO_PKG_VERSION")), None); + let tracer = provider.versioned_tracer( + "opentelemetry-otlp", + Some(env!("CARGO_PKG_VERSION")), + Some(SCHEMA_URL), + None, + ); let _ = global::set_tracer_provider(provider); tracer } -fn build_batch_with_exporter( +fn build_batch_with_exporter>( exporter: SpanExporter, trace_config: Option, runtime: R, + batch_config: Option, ) -> sdk::trace::Tracer { - let mut provider_builder = - sdk::trace::TracerProvider::builder().with_batch_exporter(exporter, runtime); + let mut provider_builder = sdk::trace::TracerProvider::builder(); + let batch_processor = sdk::trace::BatchSpanProcessor::builder(exporter, runtime) + .with_batch_config(batch_config.unwrap_or_default()) + .build(); + provider_builder = provider_builder.with_span_processor(batch_processor); + if let Some(config) = trace_config { provider_builder = provider_builder.with_config(config); } let provider = provider_builder.build(); - let tracer = - provider.versioned_tracer("opentelemetry-otlp", Some(env!("CARGO_PKG_VERSION")), None); + let tracer = provider.versioned_tracer( + "opentelemetry-otlp", + Some(env!("CARGO_PKG_VERSION")), + Some(SCHEMA_URL), + None, + ); let _ = global::set_tracer_provider(provider); tracer } @@ -362,10 +388,17 @@ tonic_config: TonicConfig, channel: tonic::transport::Channel, ) -> Result { + let mut trace_exporter = TonicTraceServiceClient::new(channel); + if let Some(compression) = + resolve_compression(&tonic_config, OTEL_EXPORTER_OTLP_TRACES_COMPRESSION)? + { + trace_exporter = trace_exporter.send_compressed(compression) + } + Ok(SpanExporter::Tonic { timeout: config.timeout, metadata: tonic_config.metadata, - trace_exporter: TonicTraceServiceClient::new(channel), + trace_exporter, }) } @@ -381,17 +414,17 @@ } let channel: GrpcChannel = match (grpcio_config.credentials, grpcio_config.use_tls) { - (None, Some(true)) => builder.secure_connect( - config.endpoint.as_str(), - ChannelCredentialsBuilder::new().build(), - ), + (None, Some(true)) => builder + .set_credentials(ChannelCredentialsBuilder::new().build()) + .connect(config.endpoint.as_str()), (None, _) => builder.connect(config.endpoint.as_str()), - (Some(credentials), _) => builder.secure_connect( - config.endpoint.as_str(), - ChannelCredentialsBuilder::new() - .cert(credentials.cert.into(), credentials.key.into()) - .build(), - ), + (Some(credentials), _) => builder + .set_credentials( + ChannelCredentialsBuilder::new() + .cert(credentials.cert.into(), credentials.key.into()) + .build(), + ) + .connect(config.endpoint.as_str()), }; SpanExporter::Grpcio { @@ -452,6 +485,8 @@ headers: Option>, collector_endpoint: Uri, ) -> ExportResult { + use opentelemetry_http::ResponseExt; + let req = ProstRequest { resource_spans: batch.into_iter().map(Into::into).collect(), }; @@ -476,16 +511,13 @@ } } - client.send(request).await?; + client.send(request).await?.error_for_status()?; Ok(()) } #[async_trait] -impl opentelemetry::sdk::export::trace::SpanExporter for SpanExporter { - fn export( - &mut self, - batch: Vec, - ) -> futures::future::BoxFuture<'static, ExportResult> { +impl opentelemetry_sdk::export::trace::SpanExporter for SpanExporter { + fn export(&mut self, batch: Vec) -> BoxFuture<'static, ExportResult> { match self { #[cfg(feature = "grpc-sys")] SpanExporter::Grpcio { diff -Nru temporalio-1.3.0/vendor/opentelemetry-otlp/src/transform/metrics.rs temporalio-1.3.0/vendor/opentelemetry-otlp/src/transform/metrics.rs --- temporalio-1.3.0/vendor/opentelemetry-otlp/src/transform/metrics.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-otlp/src/transform/metrics.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,739 +1,211 @@ -#[cfg(feature = "grpc-tonic")] -// The prost currently will generate a non optional deprecated field for labels. -// We cannot assign value to it otherwise clippy will complain. -// We cannot ignore it as it's not an optional field. -// We can remove this after we removed the labels field from proto. -#[allow(deprecated)] +#[cfg(any(feature = "grpc-tonic", feature = "http-proto"))] pub(crate) mod tonic { - use opentelemetry::metrics::MetricsError; - use opentelemetry::sdk::export::metrics::{ - aggregation::{ - Count, Histogram as SdkHistogram, LastValue, Sum as SdkSum, TemporalitySelector, - }, - Record, - }; - use opentelemetry::sdk::metrics::aggregators::{ - HistogramAggregator, LastValueAggregator, SumAggregator, - }; - use opentelemetry::sdk::InstrumentationLibrary; - use opentelemetry_proto::tonic::metrics::v1::DataPointFlags; - use opentelemetry_proto::tonic::FromNumber; + use std::any::Any; + use std::fmt; + + use opentelemetry_api::{global, metrics::MetricsError}; + use opentelemetry_proto::tonic::common::v1::InstrumentationScope as TonicInstrumentationScope; + use opentelemetry_proto::tonic::resource::v1::Resource as TonicResource; use opentelemetry_proto::tonic::{ collector::metrics::v1::ExportMetricsServiceRequest, - common::v1::KeyValue, metrics::v1::{ - metric::Data, number_data_point, AggregationTemporality, Gauge, Histogram, - HistogramDataPoint, InstrumentationLibraryMetrics, Metric, NumberDataPoint, - ResourceMetrics, Sum, + exemplar::Value as TonicExemplarValue, metric::Data as TonicMetricData, + number_data_point::Value as TonicDataPointValue, + AggregationTemporality as TonicTemporality, DataPointFlags as TonicDataPointFlags, + Exemplar as TonicExemplar, Gauge as TonicGauge, Histogram as TonicHistogram, + HistogramDataPoint as TonicHistogramDataPoint, Metric as TonicMetric, + NumberDataPoint as TonicNumberDataPoint, ResourceMetrics as TonicResourceMetrics, + ScopeMetrics as TonicScopeMetrics, Sum as TonicSum, }, }; + use opentelemetry_sdk::metrics::data::{ + self, Exemplar as SdkExemplar, Gauge as SdkGauge, Histogram as SdkHistogram, + Metric as SdkMetric, ScopeMetrics as SdkScopeMetrics, Sum as SdkSum, + }; + use opentelemetry_sdk::Resource as SdkResource; use crate::to_nanos; - use crate::transform::{CheckpointedMetrics, ResourceWrapper}; - use std::collections::{BTreeMap, HashMap}; - pub(crate) fn record_to_metric( - record: &Record, - temporality_selector: &dyn TemporalitySelector, - ) -> Result { - let descriptor = record.descriptor(); - let aggregator = record.aggregator().ok_or(MetricsError::NoDataCollected)?; - let attributes = record - .attributes() - .iter() - .map(|kv| kv.into()) - .collect::>(); - let temporality: AggregationTemporality = temporality_selector - .temporality_for(descriptor, aggregator.aggregation().kind()) - .into(); - let kind = descriptor.number_kind(); - Ok(Metric { - name: descriptor.name().to_string(), - description: descriptor.description().cloned().unwrap_or_default(), - unit: descriptor.unit().unwrap_or("").to_string(), - data: { - if let Some(last_value) = aggregator.as_any().downcast_ref::() - { - Some({ - let (val, sample_time) = last_value.last_value()?; - Data::Gauge(Gauge { - data_points: vec![NumberDataPoint { - flags: DataPointFlags::FlagNone as u32, - attributes, - start_time_unix_nano: to_nanos(*record.start_time()), - time_unix_nano: to_nanos(sample_time), - value: Some(number_data_point::Value::from_number(val, kind)), - exemplars: Vec::default(), - }], - }) - }) - } else if let Some(sum) = aggregator.as_any().downcast_ref::() { - Some({ - let val = sum.sum()?; - Data::Sum(Sum { - data_points: vec![NumberDataPoint { - flags: DataPointFlags::FlagNone as u32, - attributes, - start_time_unix_nano: to_nanos(*record.start_time()), - time_unix_nano: to_nanos(*record.end_time()), - value: Some(number_data_point::Value::from_number(val, kind)), - exemplars: Vec::default(), - }], - aggregation_temporality: temporality as i32, - is_monotonic: descriptor.instrument_kind().monotonic(), - }) - }) - } else if let Some(histogram) = - aggregator.as_any().downcast_ref::() - { - Some({ - let (sum, count, buckets) = - (histogram.sum()?, histogram.count()?, histogram.histogram()?); - Data::Histogram(Histogram { - data_points: vec![HistogramDataPoint { - flags: DataPointFlags::FlagNone as u32, - attributes, - start_time_unix_nano: to_nanos(*record.start_time()), - time_unix_nano: to_nanos(*record.end_time()), - count, - sum: sum.to_f64(kind), - bucket_counts: buckets - .counts() - .iter() - .cloned() - .map(|c| c as u64) - .collect(), - explicit_bounds: buckets.boundaries().clone(), - exemplars: Vec::default(), - }], - aggregation_temporality: temporality as i32, - }) - }) - } else { - None - } - }, - }) + pub(crate) fn sink(metrics: &data::ResourceMetrics) -> ExportMetricsServiceRequest { + ExportMetricsServiceRequest { + resource_metrics: vec![TonicResourceMetrics { + resource: transform_resource(&metrics.resource), + scope_metrics: transform_scope_metrics(&metrics.scope_metrics), + schema_url: metrics + .resource + .schema_url() + .map(Into::into) + .unwrap_or_default(), + }], + } } - // Group metrics with resources and instrumentation libraries with resources first, - // then instrumentation libraries. - #[allow(clippy::map_entry)] // caused by https://github.com/rust-lang/rust-clippy/issues/4674 - pub(crate) fn sink(metrics: Vec) -> ExportMetricsServiceRequest { - let mut sink_map = BTreeMap::< - ResourceWrapper, - HashMap>, - >::new(); - for (resource, instrumentation_library, metric) in metrics { - if sink_map.contains_key(&resource) { - // found resource, see if we can find instrumentation library - sink_map.entry(resource).and_modify(|map| { - if map.contains_key(&instrumentation_library) { - map.entry(instrumentation_library).and_modify(|map| { - if map.contains_key(&metric.name) { - map.entry(metric.name.clone()) - .and_modify(|base| merge(base, metric)); - } else { - map.insert(metric.name.clone(), metric); - } - }); - } else { - map.insert(instrumentation_library, { - let mut map = HashMap::new(); - map.insert(metric.name.clone(), metric); - map - }); - } - }); - } else { - // insert resource -> instrumentation library -> metrics - sink_map.insert(resource, { - let mut map = HashMap::new(); - map.insert(instrumentation_library, { - let mut map = HashMap::new(); - map.insert(metric.name.clone(), metric); - map - }); - map - }); - } + fn transform_resource(r: &SdkResource) -> Option { + if r.is_empty() { + return None; } - // convert resource -> instrumentation library -> [metrics] into proto struct ResourceMetric - ExportMetricsServiceRequest { - resource_metrics: sink_map - .into_iter() - .map(|(resource, metric_map)| ResourceMetrics { - schema_url: resource - .schema_url() - .map(|s| s.to_string()) - .unwrap_or_default(), - resource: Some(resource.into()), - instrumentation_library_metrics: metric_map - .into_iter() - .map( - |(instrumentation_library, metrics)| InstrumentationLibraryMetrics { - schema_url: instrumentation_library - .schema_url - .clone() - .unwrap_or_default() - .to_string(), - instrumentation_library: Some(instrumentation_library.into()), - metrics: metrics - .into_iter() - .map(|(_k, v)| v) - .collect::>(), // collect values - }, - ) - .collect::>(), - }) - .collect::>(), - } + Some(TonicResource { + attributes: r.iter().map(Into::into).collect(), + dropped_attributes_count: 0, + }) } - // if the data points are the compatible, merge, otherwise do nothing - macro_rules! merge_compatible_type { - ($base: ident, $other: ident, - $ ( - $t:path => $($other_t: path),* - ) ; *) => { - match &mut $base.data { - $( - Some($t(base_data)) => { - match $other.data { - $( - Some($other_t(other_data)) => { - if other_data.data_points.len() > 0 { - base_data.data_points.extend(other_data.data_points); - } - }, - )* - _ => {} - } - }, - )* - _ => {} - } - }; - } - - // Merge `other` metric proto struct into base by append its data point. - // If two metric proto don't have the same type or name, do nothing - pub(crate) fn merge(base: &mut Metric, other: Metric) { - if base.name != other.name { - return; - } - merge_compatible_type!(base, other, - Data::Sum => Data::Sum; - Data::Gauge => Data::Sum, Data::Gauge; - Data::Histogram => Data::Histogram; - Data::Summary => Data::Summary - ); + fn transform_scope_metrics(sms: &[SdkScopeMetrics]) -> Vec { + sms.iter() + .map(|sm| TonicScopeMetrics { + scope: Some(TonicInstrumentationScope::from(&sm.scope)), + metrics: transform_metrics(&sm.metrics), + schema_url: sm + .scope + .schema_url + .as_ref() + .map(ToString::to_string) + .unwrap_or_default(), + }) + .collect() } -} -#[cfg(test)] -#[allow(deprecated)] -mod tests { - #[cfg(feature = "grpc-tonic")] - mod tonic { - use crate::transform::metrics::tonic::merge; - use crate::transform::{record_to_metric, sink, ResourceWrapper}; - use opentelemetry::attributes::AttributeSet; - use opentelemetry::metrics::MetricsError; - use opentelemetry::sdk::export::metrics::aggregation::cumulative_temporality_selector; - use opentelemetry::sdk::export::metrics::record; - use opentelemetry::sdk::metrics::aggregators::{ - histogram, last_value, Aggregator, SumAggregator, - }; - use opentelemetry::sdk::metrics::sdk_api::{ - Descriptor, InstrumentKind, Number, NumberKind, - }; - use opentelemetry::sdk::{InstrumentationLibrary, Resource}; - use opentelemetry::Context; - use opentelemetry_proto::tonic::metrics::v1::DataPointFlags; - use opentelemetry_proto::tonic::{ - common::v1::{any_value, AnyValue, KeyValue}, - metrics::v1::{ - metric::Data, number_data_point, Gauge, Histogram, HistogramDataPoint, - InstrumentationLibraryMetrics, Metric, NumberDataPoint, ResourceMetrics, Sum, - }, - Attributes, FromNumber, - }; - use std::cmp::Ordering; - use std::sync::Arc; - use time::macros::datetime; - - fn key_value(key: &str, value: &str) -> KeyValue { - KeyValue { - key: key.to_string(), - value: Some(AnyValue { - value: Some(any_value::Value::StringValue(value.to_string())), - }), - } - } + fn transform_metrics(metrics: &[SdkMetric]) -> Vec { + metrics + .iter() + .map(|metric| TonicMetric { + name: metric.name.to_string(), + description: metric.description.to_string(), + unit: metric.unit.as_str().to_string(), + data: transform_data(metric.data.as_any()), + }) + .collect() + } - fn i64_to_value(val: i64) -> number_data_point::Value { - number_data_point::Value::AsInt(val) + fn transform_data(data: &dyn Any) -> Option { + if let Some(hist) = data.downcast_ref::>() { + Some(TonicMetricData::Histogram(transform_histogram(hist))) + } else if let Some(hist) = data.downcast_ref::>() { + Some(TonicMetricData::Histogram(transform_histogram(hist))) + } else if let Some(hist) = data.downcast_ref::>() { + Some(TonicMetricData::Histogram(transform_histogram(hist))) + } else if let Some(sum) = data.downcast_ref::>() { + Some(TonicMetricData::Sum(transform_sum(sum))) + } else if let Some(sum) = data.downcast_ref::>() { + Some(TonicMetricData::Sum(transform_sum(sum))) + } else if let Some(sum) = data.downcast_ref::>() { + Some(TonicMetricData::Sum(transform_sum(sum))) + } else if let Some(gauge) = data.downcast_ref::>() { + Some(TonicMetricData::Gauge(transform_gauge(gauge))) + } else if let Some(gauge) = data.downcast_ref::>() { + Some(TonicMetricData::Gauge(transform_gauge(gauge))) + } else if let Some(gauge) = data.downcast_ref::>() { + Some(TonicMetricData::Gauge(transform_gauge(gauge))) + } else { + global::handle_error(MetricsError::Other("unknown aggregator".into())); + None } + } - #[allow(clippy::type_complexity)] - fn get_metric_with_name( - name: &'static str, - data_points: Vec<(Vec<(&'static str, &'static str)>, u64, u64, i64)>, - ) -> Metric { - Metric { - name: name.to_string(), - description: "".to_string(), - unit: "".to_string(), - data: Some(Data::Gauge(Gauge { - data_points: data_points - .into_iter() - .map(|(attributes, start_time, end_time, value)| { - get_int_data_point(attributes, start_time, end_time, value) - }) - .collect::>(), - })), - } - } + trait Numeric: Into + Into + Copy { + // lossy at large values for u64 and i64 but otlp histograms only handle float values + fn into_f64(self) -> f64; + } - fn get_int_data_point( - attributes: Vec<(&'static str, &'static str)>, - start_time: u64, - end_time: u64, - value: i64, - ) -> NumberDataPoint { - NumberDataPoint { - flags: DataPointFlags::FlagNone as u32, - attributes: attributes - .into_iter() - .map(|(key, value)| key_value(key, value)) - .collect::>(), - start_time_unix_nano: start_time, - time_unix_nano: end_time, - value: Some(number_data_point::Value::from_number( - value.into(), - &NumberKind::I64, - )), - exemplars: vec![], - } + impl Numeric for u64 { + fn into_f64(self) -> f64 { + self as f64 } + } - type InstrumentationLibraryKv = (&'static str, Option<&'static str>); - type ResourceKv = Vec<(&'static str, &'static str)>; - type MetricRaw = (&'static str, Vec); - type DataPointRaw = (Vec<(&'static str, &'static str)>, u64, u64, i64); - - fn convert_to_resource_metrics( - data: (ResourceKv, Vec<(InstrumentationLibraryKv, Vec)>), - ) -> opentelemetry_proto::tonic::metrics::v1::ResourceMetrics { - // convert to proto resource - let attributes: Attributes = data - .0 - .into_iter() - .map(|(k, v)| opentelemetry::KeyValue::new(k.to_string(), v.to_string())) - .collect::>() - .into(); - let resource = opentelemetry_proto::tonic::resource::v1::Resource { - attributes: attributes.0, - dropped_attributes_count: 0, - }; - let mut instrumentation_library_metrics = vec![]; - for ((instrumentation_name, instrumentation_version), metrics) in data.1 { - instrumentation_library_metrics.push(InstrumentationLibraryMetrics { - instrumentation_library: Some( - opentelemetry_proto::tonic::common::v1::InstrumentationLibrary { - name: instrumentation_name.to_string(), - version: instrumentation_version.unwrap_or("").to_string(), - }, - ), - schema_url: "".to_string(), - metrics: metrics - .into_iter() - .map(|(name, data_points)| get_metric_with_name(name, data_points)) - .collect::>(), - }); - } - ResourceMetrics { - resource: Some(resource), - schema_url: "".to_string(), - instrumentation_library_metrics, - } + impl Numeric for i64 { + fn into_f64(self) -> f64 { + self as f64 } + } - // Assert two ResourceMetrics are equal. The challenge here is vectors in ResourceMetrics should - // be compared as unordered list/set. The currently method sort the input stably, and compare the - // instance one by one. - // - // Based on current implementation of sink function. There are two parts where the order is unknown. - // The first one is instrumentation_library_metrics in ResourceMetrics. - // The other is metrics in InstrumentationLibraryMetrics. - // - // If we changed the sink function to process the input in parallel, we will have to sort other vectors - // like data points in Metrics. - fn assert_resource_metrics(mut expect: ResourceMetrics, mut actual: ResourceMetrics) { - assert_eq!( - expect - .resource - .as_mut() - .map(|r| r.attributes.sort_by_key(|kv| kv.key.to_string())), - actual - .resource - .as_mut() - .map(|r| r.attributes.sort_by_key(|kv| kv.key.to_string())) - ); - assert_eq!( - expect.instrumentation_library_metrics.len(), - actual.instrumentation_library_metrics.len() - ); - let sort_instrumentation_library = - |metric: &InstrumentationLibraryMetrics, - other_metric: &InstrumentationLibraryMetrics| { - match ( - metric.instrumentation_library.as_ref(), - other_metric.instrumentation_library.as_ref(), - ) { - (Some(library), Some(other_library)) => library - .name - .cmp(&other_library.name) - .then(library.version.cmp(&other_library.version)), - _ => Ordering::Equal, - } - }; - let sort_metrics = |metric: &Metric, other_metric: &Metric| { - metric.name.cmp(&other_metric.name).then( - metric - .description - .cmp(&other_metric.description) - .then(metric.unit.cmp(&other_metric.unit)), - ) - }; - expect - .instrumentation_library_metrics - .sort_by(sort_instrumentation_library); - actual - .instrumentation_library_metrics - .sort_by(sort_instrumentation_library); - - for (mut expect, mut actual) in expect - .instrumentation_library_metrics - .into_iter() - .zip(actual.instrumentation_library_metrics.into_iter()) - { - assert_eq!(expect.metrics.len(), actual.metrics.len()); - - expect.metrics.sort_by(sort_metrics); - actual.metrics.sort_by(sort_metrics); - - assert_eq!(expect.metrics, actual.metrics) - } + impl Numeric for f64 { + fn into_f64(self) -> f64 { + self } + } - #[test] - fn test_record_to_metric() -> Result<(), MetricsError> { - let cx = Context::new(); - let attributes = vec![("test1", "value1"), ("test2", "value2")]; - let str_kv_attributes = attributes + fn transform_histogram(hist: &SdkHistogram) -> TonicHistogram { + TonicHistogram { + data_points: hist + .data_points .iter() - .cloned() - .map(|(key, value)| key_value(key, value)) - .collect::>(); - let attribute_set = AttributeSet::from_attributes( - attributes - .iter() - .cloned() - .map(|(k, v)| opentelemetry::KeyValue::new(k, v)), - ); - let start_time = datetime!(2020-12-25 10:10:0 UTC); // unit nano 1608891000000000000 - let end_time = datetime!(2020-12-25 10:10:30 UTC); // unix nano 1608891030000000000 - - // Sum - { - let descriptor = Descriptor::new( - "test".to_string(), - InstrumentKind::Counter, - NumberKind::I64, - None, - None, - ); - let aggregator = SumAggregator::default(); - let val = Number::from(12_i64); - aggregator.update(&cx, &val, &descriptor)?; - let wrapped_aggregator: Arc = Arc::new(aggregator); - let record = record( - &descriptor, - &attribute_set, - Some(&wrapped_aggregator), - start_time.into(), - end_time.into(), - ); - let metric = record_to_metric(&record, &cumulative_temporality_selector())?; - - let expect = Metric { - name: "test".to_string(), - description: "".to_string(), - unit: "".to_string(), - data: Some(Data::Sum(Sum { - data_points: vec![NumberDataPoint { - flags: DataPointFlags::FlagNone as u32, - attributes: str_kv_attributes.clone(), - start_time_unix_nano: 1608891000000000000, - time_unix_nano: 1608891030000000000, - value: Some(i64_to_value(12i64)), - exemplars: vec![], - }], - aggregation_temporality: 2, - is_monotonic: true, - })), - }; - - assert_eq!(expect, metric); - } - - // Last Value - { - let descriptor = Descriptor::new( - "test".to_string(), - InstrumentKind::GaugeObserver, - NumberKind::I64, - None, - None, - ); - let aggregator = last_value(); - let val1 = Number::from(12_i64); - let val2 = Number::from(14_i64); - aggregator.update(&cx, &val1, &descriptor)?; - aggregator.update(&cx, &val2, &descriptor)?; - let wrapped_aggregator: Arc = Arc::new(aggregator); - let record = record( - &descriptor, - &attribute_set, - Some(&wrapped_aggregator), - start_time.into(), - end_time.into(), - ); - let metric = record_to_metric(&record, &cumulative_temporality_selector())?; - - let expect = Metric { - name: "test".to_string(), - description: "".to_string(), - unit: "".to_string(), - data: Some(Data::Gauge(Gauge { - data_points: vec![NumberDataPoint { - flags: DataPointFlags::FlagNone as u32, - attributes: str_kv_attributes.clone(), - start_time_unix_nano: 1608891000000000000, - time_unix_nano: if let Data::Gauge(gauge) = metric.data.clone().unwrap() - { - // ignore this field as it is the time the value updated. - // It changes every time the test runs - gauge.data_points[0].time_unix_nano - } else { - 0 - }, - value: Some(i64_to_value(14i64)), - exemplars: vec![], - }], - })), - }; - - assert_eq!(expect, metric); - } - - // Histogram - { - let descriptor = Descriptor::new( - "test".to_string(), - InstrumentKind::Histogram, - NumberKind::I64, - None, - None, - ); - let bound = [0.1, 0.2, 0.3]; - let aggregator = histogram(&bound); - let vals = vec![1i64.into(), 2i64.into(), 3i64.into()]; - for val in vals.iter() { - aggregator.update(&cx, val, &descriptor)?; - } - let wrapped_aggregator: Arc = Arc::new(aggregator); - let record = record( - &descriptor, - &attribute_set, - Some(&wrapped_aggregator), - start_time.into(), - end_time.into(), - ); - let metric = record_to_metric(&record, &cumulative_temporality_selector())?; - - let expect = Metric { - name: "test".to_string(), - description: "".to_string(), - unit: "".to_string(), - data: Some(Data::Histogram(Histogram { - data_points: vec![HistogramDataPoint { - flags: DataPointFlags::FlagNone as u32, - attributes: str_kv_attributes, - start_time_unix_nano: 1608891000000000000, - time_unix_nano: 1608891030000000000, - count: 3, - sum: 6f64, - bucket_counts: vec![0, 0, 0, 3], - explicit_bounds: vec![0.1, 0.2, 0.3], - exemplars: vec![], - }], - aggregation_temporality: 2, - })), - }; - - assert_eq!(expect, metric); - } - - Ok(()) + .map(|dp| TonicHistogramDataPoint { + attributes: dp.attributes.iter().map(Into::into).collect(), + start_time_unix_nano: to_nanos(dp.start_time), + time_unix_nano: to_nanos(dp.time), + count: dp.count, + sum: Some(dp.sum.into_f64()), + bucket_counts: dp.bucket_counts.clone(), + explicit_bounds: dp.bounds.clone(), + exemplars: dp.exemplars.iter().map(transform_exemplar).collect(), + flags: TonicDataPointFlags::default() as u32, + min: dp.min.map(Numeric::into_f64), + max: dp.max.map(Numeric::into_f64), + }) + .collect(), + aggregation_temporality: TonicTemporality::from(hist.temporality).into(), } + } - #[test] - fn test_sink() { - let test_data: Vec<(ResourceWrapper, InstrumentationLibrary, Metric)> = vec![ - ( - vec![("runtime", "tokio")], - ("otlp", Some("0.1.1")), - "test", - (vec![("attribute1", "attribute2")], 12, 23, 2), - ), - ( - vec![("runtime", "tokio")], - ("otlp", Some("0.1.1")), - "test", - (vec![("attribute2", "attribute2")], 16, 19, 20), - ), - ( - vec![("runtime", "tokio"), ("rustc", "v48.0")], - ("otlp", Some("0.1.1")), - "test", - (vec![("attribute2", "attribute2")], 16, 19, 20), - ), - ( - vec![("runtime", "tokio")], - ("otlp", None), - "test", - (vec![("attribute1", "attribute2")], 15, 16, 88), - ), - ( - vec![("runtime", "tokio")], - ("otlp", None), - "another_test", - (vec![("attribute1", "attribute2")], 15, 16, 99), - ), - ] - .into_iter() - .map( - |(kvs, (name, version), metric_name, (attributes, start_time, end_time, value))| { - ( - ResourceWrapper::from(Resource::new(kvs.into_iter().map(|(k, v)| { - opentelemetry::KeyValue::new(k.to_string(), v.to_string()) - }))), - InstrumentationLibrary::new(name, version, None), - get_metric_with_name( - metric_name, - vec![(attributes, start_time, end_time, value)], - ), - ) - }, - ) - .collect::>(); - - let request = sink(test_data); - let actual = request.resource_metrics; - - let expect = vec![ - ( - vec![("runtime", "tokio")], - vec![ - ( - ("otlp", Some("0.1.1")), - vec![( - "test", - vec![ - (vec![("attribute1", "attribute2")], 12, 23, 2), - (vec![("attribute2", "attribute2")], 16, 19, 20), - ], - )], - ), - ( - ("otlp", None), - vec![ - ( - "test", - vec![(vec![("attribute1", "attribute2")], 15, 16, 88)], - ), - ( - "another_test", - vec![(vec![("attribute1", "attribute2")], 15, 16, 99)], - ), - ], - ), - ], - ), - ( - vec![("runtime", "tokio"), ("rustc", "v48.0")], - vec![( - ("otlp", Some("0.1.1")), - vec![( - "test", - vec![(vec![("attribute2", "attribute2")], 16, 19, 20)], - )], - )], - ), - ] - .into_iter() - .map(convert_to_resource_metrics); - - for (expect, actual) in expect.into_iter().zip(actual.into_iter()) { - assert_resource_metrics(expect, actual); - } + fn transform_sum< + T: fmt::Debug + Into + Into + Copy, + >( + sum: &SdkSum, + ) -> TonicSum { + TonicSum { + data_points: sum + .data_points + .iter() + .map(|dp| TonicNumberDataPoint { + attributes: dp.attributes.iter().map(Into::into).collect(), + start_time_unix_nano: dp.start_time.map(to_nanos).unwrap_or_default(), + time_unix_nano: dp.time.map(to_nanos).unwrap_or_default(), + exemplars: dp.exemplars.iter().map(transform_exemplar).collect(), + flags: TonicDataPointFlags::default() as u32, + value: Some(dp.value.into()), + }) + .collect(), + aggregation_temporality: TonicTemporality::from(sum.temporality).into(), + is_monotonic: sum.is_monotonic, } + } - #[test] - fn test_merge() { - let data_point_base = get_int_data_point(vec![("method", "POST")], 12, 12, 3); - let data_point_addon = get_int_data_point(vec![("method", "PUT")], 12, 12, 3); - - let mut metric1 = Metric { - name: "test".to_string(), - description: "".to_string(), - unit: "".to_string(), - data: Some(Data::Sum(Sum { - data_points: vec![data_point_base.clone()], - aggregation_temporality: 2, - is_monotonic: true, - })), - }; - - let metric2 = Metric { - name: "test".to_string(), - description: "".to_string(), - unit: "".to_string(), - data: Some(Data::Sum(Sum { - data_points: vec![data_point_addon.clone()], - aggregation_temporality: 2, - is_monotonic: true, - })), - }; - - let expect = Metric { - name: "test".to_string(), - description: "".to_string(), - unit: "".to_string(), - data: Some(Data::Sum(Sum { - data_points: vec![data_point_base, data_point_addon], - aggregation_temporality: 2, - is_monotonic: true, - })), - }; - - merge(&mut metric1, metric2); + fn transform_gauge< + T: fmt::Debug + Into + Into + Copy, + >( + gauge: &SdkGauge, + ) -> TonicGauge { + TonicGauge { + data_points: gauge + .data_points + .iter() + .map(|dp| TonicNumberDataPoint { + attributes: dp.attributes.iter().map(Into::into).collect(), + start_time_unix_nano: dp.start_time.map(to_nanos).unwrap_or_default(), + time_unix_nano: dp.time.map(to_nanos).unwrap_or_default(), + exemplars: dp.exemplars.iter().map(transform_exemplar).collect(), + flags: TonicDataPointFlags::default() as u32, + value: Some(dp.value.into()), + }) + .collect(), + } + } - assert_eq!(metric1, expect); + fn transform_exemplar + Copy>( + ex: &SdkExemplar, + ) -> TonicExemplar { + TonicExemplar { + filtered_attributes: ex + .filtered_attributes + .iter() + .map(|kv| (&kv.key, &kv.value).into()) + .collect(), + time_unix_nano: to_nanos(ex.time), + span_id: ex.span_id.into(), + trace_id: ex.trace_id.into(), + value: Some(ex.value.into()), } } } diff -Nru temporalio-1.3.0/vendor/opentelemetry-otlp/src/transform/mod.rs temporalio-1.3.0/vendor/opentelemetry-otlp/src/transform/mod.rs --- temporalio-1.3.0/vendor/opentelemetry-otlp/src/transform/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-otlp/src/transform/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,22 +1,5 @@ #[cfg(feature = "metrics")] mod metrics; -mod resource; #[cfg(all(feature = "grpc-tonic", feature = "metrics"))] -pub(crate) use metrics::tonic::record_to_metric; -#[cfg(all(feature = "grpc-tonic", feature = "metrics"))] pub(crate) use metrics::tonic::sink; -#[cfg(all(feature = "grpc-tonic", feature = "metrics"))] -pub(crate) use resource::ResourceWrapper; - -#[cfg(all(feature = "grpc-tonic", feature = "metrics"))] -use opentelemetry::sdk::InstrumentationLibrary; - -// Metrics in OTEL proto format checked from checkpoint with information of resource and instrumentation -// library. -#[cfg(all(feature = "grpc-tonic", feature = "metrics"))] -pub(crate) type CheckpointedMetrics = ( - ResourceWrapper, - InstrumentationLibrary, - opentelemetry_proto::tonic::metrics::v1::Metric, -); diff -Nru temporalio-1.3.0/vendor/opentelemetry-otlp/src/transform/resource.rs temporalio-1.3.0/vendor/opentelemetry-otlp/src/transform/resource.rs --- temporalio-1.3.0/vendor/opentelemetry-otlp/src/transform/resource.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-otlp/src/transform/resource.rs 2023-10-30 19:40:00.000000000 +0000 @@ -3,10 +3,10 @@ use std::cmp::Ordering; #[derive(PartialEq)] -pub(crate) struct ResourceWrapper(opentelemetry::sdk::Resource); +pub(crate) struct ResourceWrapper(opentelemetry_sdk::Resource); -impl From for ResourceWrapper { - fn from(r: opentelemetry::sdk::Resource) -> Self { +impl From for ResourceWrapper { + fn from(r: opentelemetry_sdk::Resource) -> Self { ResourceWrapper(r) } } diff -Nru temporalio-1.3.0/vendor/opentelemetry-otlp/tests/smoke.rs temporalio-1.3.0/vendor/opentelemetry-otlp/tests/smoke.rs --- temporalio-1.3.0/vendor/opentelemetry-otlp/tests/smoke.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-otlp/tests/smoke.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,6 +1,6 @@ use futures::StreamExt; -use opentelemetry::global::shutdown_tracer_provider; -use opentelemetry::trace::{Span, SpanKind, Tracer}; +use opentelemetry_api::global::shutdown_tracer_provider; +use opentelemetry_api::trace::{Span, SpanKind, Tracer}; use opentelemetry_otlp::WithExportConfig; use opentelemetry_proto::tonic::collector::trace::v1::{ trace_service_server::{TraceService, TraceServiceServer}, @@ -9,6 +9,8 @@ use std::{net::SocketAddr, sync::Mutex}; use tokio::sync::mpsc; use tokio_stream::wrappers::TcpListenerStream; +#[cfg(feature = "gzip-tonic")] +use tonic::codec::CompressionEncoding; struct MockServer { tx: Mutex>, @@ -37,7 +39,9 @@ .unwrap() .try_send(request.into_inner()) .expect("Channel full"); - Ok(tonic::Response::new(ExportTraceServiceResponse {})) + Ok(tonic::Response::new(ExportTraceServiceResponse { + partial_success: None, + })) } } @@ -55,6 +59,10 @@ }); let (req_tx, req_rx) = mpsc::channel(10); + #[cfg(feature = "gzip-tonic")] + let service = TraceServiceServer::new(MockServer::new(req_tx)) + .accept_compressed(CompressionEncoding::Gzip); + #[cfg(not(feature = "gzip-tonic"))] let service = TraceServiceServer::new(MockServer::new(req_tx)); tokio::task::spawn(async move { tonic::transport::Server::builder() @@ -78,12 +86,19 @@ let tracer = opentelemetry_otlp::new_pipeline() .tracing() .with_exporter( + #[cfg(feature = "gzip-tonic")] + opentelemetry_otlp::new_exporter() + .tonic() + .with_compression(opentelemetry_otlp::Compression::Gzip) + .with_endpoint(format!("http://{}", addr)) + .with_metadata(metadata), + #[cfg(not(feature = "gzip-tonic"))] opentelemetry_otlp::new_exporter() .tonic() .with_endpoint(format!("http://{}", addr)) .with_metadata(metadata), ) - .install_batch(opentelemetry::runtime::Tokio) + .install_batch(opentelemetry_sdk::runtime::Tokio) .expect("failed to install"); println!("Sending span..."); @@ -103,7 +118,7 @@ .resource_spans .get(0) .unwrap() - .instrumentation_library_spans + .scope_spans .get(0) .unwrap() .spans diff -Nru temporalio-1.3.0/vendor/opentelemetry-prometheus/.cargo-checksum.json temporalio-1.3.0/vendor/opentelemetry-prometheus/.cargo-checksum.json --- temporalio-1.3.0/vendor/opentelemetry-prometheus/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-prometheus/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"CHANGELOG.md":"ba570de507d4e29fa4e82254d4c243ca1a57b367d975f19c26d3c215e3edb7d6","CODEOWNERS":"abc35dda6643aed84b16084b9dccfee77929c299d60d21b590bd5c8c3b54e508","Cargo.toml":"d87a6f3626ae7c6911eafea7e1a8af97926371bad3dedf5ff170d53f427a6112","LICENSE":"c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4","README.md":"e6b22837f60dd8c04184cad2bbbf05d5c454a021cf14ac08dc9e77e326af0e89","src/lib.rs":"d19278eedbfcc20ef215ada61054858df4e36c4a930b44594d11cb634f2ed4fc","src/sanitize.rs":"eccbb5a77e2c2891aa62286d02234e767b497ad9ba991025abc40693686c1273","tests/integration_test.rs":"2e9dd49133b91554ba243c304d5641ffdc74b3f9bf7c00a71fb2cfea121776f0"},"package":"06c3d833835a53cf91331d2cfb27e9121f5a95261f31f08a1f79ab31688b8da8"} \ No newline at end of file +{"files":{"CHANGELOG.md":"ad862ad8d617a0063bb0fb58140670f96341335d83cdba853a6ddc1ba368578d","CODEOWNERS":"abc35dda6643aed84b16084b9dccfee77929c299d60d21b590bd5c8c3b54e508","Cargo.lock":"8c2f9959f46f6fafef476c618ea1ce83bb5afc528b501ad73b26a3544f237499","Cargo.toml":"0b4437dc9e538e031eb7ba64f42be7612ceb8ee982518461777fda15107c3b08","LICENSE":"208a3f5bae3355bd4f3f45626d1ea4518b253d618ee2896983436075c4375098","README.md":"c461512a79999d19583757e2e039b929f7ad3de905841358dc92446281d4e4c6","examples/hyper.rs":"b573ddcddf7420de6c7da714eab5f269a6702fd9ff95d36d8053d4e4a7884fed","src/config.rs":"94ae1892ac8f957fefe49622156f77de314b7a2454196aace99a93e20b67c5a0","src/lib.rs":"336b31d6997b940a0c2ba3b74708c3b79feda39582603967f237aeba5dbd58e2","src/utils.rs":"4aff77ef059606100fa6c578dc0b8892ec6156bf2ee7f5e4aca438bcec7cced2","tests/data/conflict_help_two_counters_1.txt":"1b94da75b978f855759779ad327c26024bb2ba4d084807cabe2844e188423623","tests/data/conflict_help_two_counters_2.txt":"84a1e98eeb7f4d44391f998d3e1c120560b96f8762a80992e37b48deec62a978","tests/data/conflict_help_two_histograms_1.txt":"7ae913f0ef8d9e419ebe80f22bc7938eb2bd76eba8084b29373d194bee0620fd","tests/data/conflict_help_two_histograms_2.txt":"6d3a715afb7848cb5c675b1246bbe5aaccca77c217038eff9c7596e6ce0d39a7","tests/data/conflict_help_two_updowncounters_1.txt":"ae1c601dcfee6ef04fa8291c20661ed6103de0d9d7f020cdedb8990708284e87","tests/data/conflict_help_two_updowncounters_2.txt":"873703d1b97d00e72d1c800353df3f02e458549326da3430cdca1cf0523c8012","tests/data/conflict_type_counter_and_updowncounter_1.txt":"dadb42a71849b46c86d527a8f9f2674f181a25141132bbf0f5e36c50201fa9e7","tests/data/conflict_type_counter_and_updowncounter_2.txt":"0eabf10c4ab38fa5d76a0d4798cd1afd13860160731bfb8015e910e35fa21d64","tests/data/conflict_type_histogram_and_updowncounter_1.txt":"e1b45933e2228185f30525e342f23739ab132523a17fd16a172b6ea8532ebd54","tests/data/conflict_type_histogram_and_updowncounter_2.txt":"a291baa5094b70251fe2c027d76fc9ffbe19c35666a96073bc64dd96aeef1813","tests/data/conflict_unit_two_counters.txt":"3ce6cdd626c7eb31fd95ea6c53bc64bd513ad0f574eeef9bbc0d8daff1afe96c","tests/data/conflict_unit_two_histograms.txt":"d0afa7ca22571f9657e818f5bfda847b79de752f813c351a19c2628eb3c12f3a","tests/data/conflict_unit_two_updowncounters.txt":"0e26438e7babcb540a36f0af0c4064817e12307d0790e346630a0f23c2f8ed28","tests/data/counter.txt":"6549511bd32063f314d11f3d874efc0799f650dbe1359450c616b27a94a38052","tests/data/counter_disabled_suffix.txt":"d80d58fdf0309bae4d8b587f6718b81ecdba79d44e20e46ed8bd2f89f163d969","tests/data/custom_resource.txt":"0f3b44da7d8c5360bed85d9b3afb924236e8d87592636dc911c8cdae5a7573d0","tests/data/empty_resource.txt":"1dc6da0559aec0f2e700449e4ac129c5e2a678e1b4cfe348d6649c7a6802d213","tests/data/gauge.txt":"e4c212a159fde7039c6917bb881b43c98dd07b95c5a80b340698d7f265691b1d","tests/data/histogram.txt":"6b4a5e7e924b9f03886b902e9ba052f311703ebe708746ceb5d32d09d77e917d","tests/data/multi_scopes.txt":"082a5b3421737d4115c9c4d610c4ecaaca7c3b09a137678a4378fe4b834885fc","tests/data/no_conflict_two_counters.txt":"a7cc1a4b47bcc729730725efffb083bc59594f004586d87064566368f0ad2773","tests/data/no_conflict_two_histograms.txt":"b860c5dfd6b6571a14ae285f96038006ad3d6588035063ac2445ef4b3493db57","tests/data/no_conflict_two_updowncounters.txt":"3ce35003bd31ebc0f46e6bfc06f5918520d14d47ac548fc5cc517873d063f8bd","tests/data/sanitized_labels.txt":"cb310835c7acba42589843da5d09c022da8eb0b801185427cd96ce02b99f5620","tests/data/sanitized_names.txt":"5a68990da96d3e642bbb25592bb0e364ed191b51a2808209303b518215d263b3","tests/data/with_namespace.txt":"917dea093865d7ea544e8676dff5bcfbe88337f85d35615ec8a11fd02d11dd94","tests/data/without_scope_and_target_info.txt":"e1d437e2465fb816baa5242bc400fb23276e81d5be52d5fcae9ba9d46ab5b27b","tests/data/without_scope_info.txt":"5ffe003fa762163a177c135dd8c4955df2da8e3b75052bfe9d6faee8db93b96b","tests/data/without_target_info.txt":"69607f1cf1b7e351845cdd11a122207985ed25f5d2f5e6633f00f3dabee255fb","tests/integration_test.rs":"f13172e7cc2a458576db15449c754125f9d7225c9ee72fdfc7e335e2ded5e902"},"package":"c7d81bc254e2d572120363a2b16cdb0d715d301b5789be0cfc26ad87e4e10e53"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/opentelemetry-prometheus/Cargo.lock temporalio-1.3.0/vendor/opentelemetry-prometheus/Cargo.lock --- temporalio-1.3.0/vendor/opentelemetry-prometheus/Cargo.lock 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-prometheus/Cargo.lock 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,930 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "addr2line" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a76fd60b23679b7d19bd066031410fb7e458ccc5e958eb5c325888ce4baedc97" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "aho-corasick" +version = "0.7.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" +dependencies = [ + "memchr", +] + +[[package]] +name = "async-trait" +version = "0.1.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9ccdd8f2a161be9bd5c023df56f1b2a0bd1d83872ae53b71a84a12c9bf6e842" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.13", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "backtrace" +version = "0.3.67" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233d376d6d185f2a3093e58f283f60f880315b6c60075b01f36b3b85154564ca" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bumpalo" +version = "3.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" + +[[package]] +name = "bytes" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" + +[[package]] +name = "cc" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "futures-channel" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" +dependencies = [ + "futures-core", +] + +[[package]] +name = "futures-core" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" + +[[package]] +name = "futures-executor" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-macro" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.13", +] + +[[package]] +name = "futures-sink" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" + +[[package]] +name = "futures-task" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" + +[[package]] +name = "futures-util" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" +dependencies = [ + "futures-core", + "futures-macro", + "futures-sink", + "futures-task", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "gimli" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad0a93d233ebf96623465aad4046a8d3aa4da22d4f4beba5388838c8a434bbb4" + +[[package]] +name = "h2" +version = "0.3.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5be7b54589b581f624f566bf5d8eb2bab1db736c51528720b6bd36b96b55924d" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hermit-abi" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" +dependencies = [ + "libc", +] + +[[package]] +name = "http" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" +dependencies = [ + "bytes", + "http", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" + +[[package]] +name = "httpdate" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" + +[[package]] +name = "hyper" +version = "0.14.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc5e554ff619822309ffd57d8734d77cd5ce6238bc956f037ea06c58238c9899" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "indexmap" +version = "1.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399" +dependencies = [ + "autocfg", + "hashbrown", +] + +[[package]] +name = "itoa" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" + +[[package]] +name = "js-sys" +version = "0.3.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" +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.147" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" + +[[package]] +name = "lock_api" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "memchr" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" + +[[package]] +name = "miniz_oxide" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa" +dependencies = [ + "adler", +] + +[[package]] +name = "mio" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b9d9a46eff5b4ff64b45a9e316a6d1e0bc719ef429cbec4dc630684212bfdf9" +dependencies = [ + "libc", + "log", + "wasi", + "windows-sys 0.45.0", +] + +[[package]] +name = "num-traits" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_cpus" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "object" +version = "0.30.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea86265d3d3dcb6a27fc51bd29a4bf387fae9d2986b823079d4986af253eb439" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" + +[[package]] +name = "opentelemetry-prometheus" +version = "0.13.0" +dependencies = [ + "hyper", + "once_cell", + "opentelemetry_api", + "opentelemetry_sdk", + "prometheus", + "protobuf", + "tokio", +] + +[[package]] +name = "opentelemetry_api" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a81f725323db1b1206ca3da8bb19874bbd3f57c3bcd59471bfb04525b265b9b" +dependencies = [ + "futures-channel", + "futures-util", + "indexmap", + "js-sys", + "once_cell", + "pin-project-lite", + "thiserror", + "urlencoding", +] + +[[package]] +name = "opentelemetry_sdk" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa8e705a0612d48139799fcbaba0d4a90f06277153e43dd2bdc16c6f0edd8026" +dependencies = [ + "async-trait", + "futures-channel", + "futures-executor", + "futures-util", + "once_cell", + "opentelemetry_api", + "ordered-float", + "regex", + "thiserror", +] + +[[package]] +name = "ordered-float" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d84eb1409416d254e4a9c8fa56cc24701755025b458f0fcd8e59e1f5f40c23bf" +dependencies = [ + "num-traits", +] + +[[package]] +name = "parking_lot" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-sys 0.45.0", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "proc-macro2" +version = "1.0.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d0dd4be24fcdcfeaa12a432d588dc59bbad6cad3510c67e74a2b6b2fc950564" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "prometheus" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "449811d15fbdf5ceb5c1144416066429cf82316e2ec8ce0c1f6f8a02e7bbcf8c" +dependencies = [ + "cfg-if", + "fnv", + "lazy_static", + "memchr", + "parking_lot", + "protobuf", + "thiserror", +] + +[[package]] +name = "protobuf" +version = "2.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "106dd99e98437432fed6519dedecfade6a06a73bb7b2a1e019fdd2bee5778d94" + +[[package]] +name = "quote" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "redox_syscall" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +dependencies = [ + "bitflags", +] + +[[package]] +name = "regex" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48aaa5748ba571fb95cd2c85c09f629215d3a6ece942baa100950af03a34f733" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.6.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848" + +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + +[[package]] +name = "signal-hook-registry" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +dependencies = [ + "libc", +] + +[[package]] +name = "slab" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" + +[[package]] +name = "socket2" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "syn" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f4064b5b16e03ae50984a5a8ed5d4f8803e6bc1fd170a3cda91a1be4b18e3f5" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c9da457c5285ac1f936ebd076af6dac17a61cfe7826f2076b4d015cf47bc8ec" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "thiserror" +version = "1.0.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a9cd18aa97d5c45c6603caea1da6628790b37f7a34b6ca89522331c5180fed0" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.107", +] + +[[package]] +name = "tokio" +version = "1.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "532826ff75199d5833b9d2c5fe410f29235e25704ee5f0ef599fb51c21f4a4da" +dependencies = [ + "autocfg", + "backtrace", + "bytes", + "libc", + "mio", + "num_cpus", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.48.0", +] + +[[package]] +name = "tokio-macros" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.13", +] + +[[package]] +name = "tokio-util" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5427d89453009325de0d8f342c9490009f76e999cb7672d77e46267448f7e6b2" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", + "tracing", +] + +[[package]] +name = "tower-service" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" + +[[package]] +name = "tracing" +version = "0.1.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" +dependencies = [ + "cfg-if", + "pin-project-lite", + "tracing-core", +] + +[[package]] +name = "tracing-core" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" +dependencies = [ + "once_cell", +] + +[[package]] +name = "try-lock" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" + +[[package]] +name = "unicode-ident" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc" + +[[package]] +name = "urlencoding" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8db7427f936968176eaa7cdf81b7f98b980b18495ec28f1b5791ac3bfe3eea9" + +[[package]] +name = "want" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" +dependencies = [ + "log", + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.13", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.13", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.1", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.0", +] + +[[package]] +name = "windows-targets" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e2522491fbfcd58cc84d47aeb2958948c4b8982e9a2d8a2a35bbaed431390e7" +dependencies = [ + "windows_aarch64_gnullvm 0.42.1", + "windows_aarch64_msvc 0.42.1", + "windows_i686_gnu 0.42.1", + "windows_i686_msvc 0.42.1", + "windows_x86_64_gnu 0.42.1", + "windows_x86_64_gnullvm 0.42.1", + "windows_x86_64_msvc 0.42.1", +] + +[[package]] +name = "windows-targets" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" +dependencies = [ + "windows_aarch64_gnullvm 0.48.0", + "windows_aarch64_msvc 0.48.0", + "windows_i686_gnu 0.48.0", + "windows_i686_msvc 0.48.0", + "windows_x86_64_gnu 0.48.0", + "windows_x86_64_gnullvm 0.48.0", + "windows_x86_64_msvc 0.48.0", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c9864e83243fdec7fc9c5444389dcbbfd258f745e7853198f365e3c4968a608" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c8b1b673ffc16c47a9ff48570a9d85e25d265735c503681332589af6253c6c7" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de3887528ad530ba7bdbb1faa8275ec7a1155a45ffa57c37993960277145d640" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf4d1122317eddd6ff351aa852118a2418ad4214e6613a50e0191f7004372605" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1040f221285e17ebccbc2591ffdc2d44ee1f9186324dd3e84e99ac68d699c45" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "628bfdf232daa22b0d64fdb62b09fcc36bb01f05a3939e20ab73aaf9470d0463" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "447660ad36a13288b1db4d4248e857b510e8c3a225c822ba4fb748c0aafecffd" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" diff -Nru temporalio-1.3.0/vendor/opentelemetry-prometheus/Cargo.toml temporalio-1.3.0/vendor/opentelemetry-prometheus/Cargo.toml --- temporalio-1.3.0/vendor/opentelemetry-prometheus/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-prometheus/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -11,9 +11,9 @@ [package] edition = "2021" -rust-version = "1.56" +rust-version = "1.60" name = "opentelemetry-prometheus" -version = "0.11.0" +version = "0.13.0" description = "Prometheus exporter for OpenTelemetry" homepage = "https://github.com/open-telemetry/opentelemetry-rust" readme = "README.md" @@ -30,6 +30,7 @@ ] license = "Apache-2.0" repository = "https://github.com/open-telemetry/opentelemetry-rust" +resolver = "1" [package.metadata.docs.rs] all-features = true @@ -38,8 +39,16 @@ "docsrs", ] -[dependencies.opentelemetry] -version = "0.18" +[dependencies.once_cell] +version = "1.17" + +[dependencies.opentelemetry_api] +version = "0.20" +features = ["metrics"] +default-features = false + +[dependencies.opentelemetry_sdk] +version = "0.20" features = ["metrics"] default-features = false @@ -49,8 +58,13 @@ [dependencies.protobuf] version = "2.14" -[dev-dependencies.lazy_static] -version = "1.4" +[dev-dependencies.hyper] +version = "0.14" +features = ["full"] + +[dev-dependencies.tokio] +version = "1" +features = ["full"] [features] prometheus-encoding = [] diff -Nru temporalio-1.3.0/vendor/opentelemetry-prometheus/CHANGELOG.md temporalio-1.3.0/vendor/opentelemetry-prometheus/CHANGELOG.md --- temporalio-1.3.0/vendor/opentelemetry-prometheus/CHANGELOG.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-prometheus/CHANGELOG.md 2023-10-30 19:40:00.000000000 +0000 @@ -1,5 +1,26 @@ # Changelog +## v0.13.0 + +### Added + +- Add `with_namespace` option to exporter config. +- Add more units conversions between OTEL metrics and prometheus metrics [#1157](https://github.com/open-telemetry/opentelemetry-rust/pull/1157). +- Add `without_counter_suffixes` option to exporter config. + +### Changed + +- Update to opentelemetry-api v0.20.0 + +## v0.12.0 + +### Changed +- [Breaking] Add `_total` suffix for all counters [#952](https://github.com/open-telemetry/opentelemetry-rust/pull/952). +- Update to `opentelemetry` v0.19. +- Bump MSRV to 1.57 [#953](https://github.com/open-telemetry/opentelemetry-rust/pull/953). +- Update dependencies and bump MSRV to 1.60 [#969](https://github.com/open-telemetry/opentelemetry-rust/pull/969). +- Add `otel_scope_info` and `scope` labels [#974](https://github.com/open-telemetry/opentelemetry-rust/pull/974). + ## v0.11.0 ### Changed diff -Nru temporalio-1.3.0/vendor/opentelemetry-prometheus/examples/hyper.rs temporalio-1.3.0/vendor/opentelemetry-prometheus/examples/hyper.rs --- temporalio-1.3.0/vendor/opentelemetry-prometheus/examples/hyper.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-prometheus/examples/hyper.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,114 @@ +use hyper::{ + header::CONTENT_TYPE, + service::{make_service_fn, service_fn}, + Body, Method, Request, Response, Server, +}; +use once_cell::sync::Lazy; +use opentelemetry_api::{ + metrics::{Counter, Histogram, MeterProvider as _, Unit}, + KeyValue, +}; +use opentelemetry_sdk::metrics::MeterProvider; +use prometheus::{Encoder, Registry, TextEncoder}; +use std::convert::Infallible; +use std::sync::Arc; +use std::time::SystemTime; + +static HANDLER_ALL: Lazy<[KeyValue; 1]> = Lazy::new(|| [KeyValue::new("handler", "all")]); + +async fn serve_req( + req: Request, + state: Arc, +) -> Result, hyper::Error> { + println!("Receiving request at path {}", req.uri()); + let request_start = SystemTime::now(); + + state.http_counter.add(1, HANDLER_ALL.as_ref()); + + let response = match (req.method(), req.uri().path()) { + (&Method::GET, "/metrics") => { + let mut buffer = vec![]; + let encoder = TextEncoder::new(); + let metric_families = state.registry.gather(); + encoder.encode(&metric_families, &mut buffer).unwrap(); + state + .http_body_gauge + .record(buffer.len() as u64, HANDLER_ALL.as_ref()); + + Response::builder() + .status(200) + .header(CONTENT_TYPE, encoder.format_type()) + .body(Body::from(buffer)) + .unwrap() + } + (&Method::GET, "/") => Response::builder() + .status(200) + .body(Body::from("Hello World")) + .unwrap(), + _ => Response::builder() + .status(404) + .body(Body::from("Missing Page")) + .unwrap(), + }; + + state.http_req_histogram.record( + request_start.elapsed().map_or(0.0, |d| d.as_secs_f64()), + &[], + ); + Ok(response) +} + +struct AppState { + registry: Registry, + http_counter: Counter, + http_body_gauge: Histogram, + http_req_histogram: Histogram, +} + +#[tokio::main] +pub async fn main() -> Result<(), Box> { + let registry = Registry::new(); + let exporter = opentelemetry_prometheus::exporter() + .with_registry(registry.clone()) + .build()?; + let provider = MeterProvider::builder().with_reader(exporter).build(); + + let meter = provider.meter("hyper-example"); + let state = Arc::new(AppState { + registry, + http_counter: meter + .u64_counter("http_requests_total") + .with_description("Total number of HTTP requests made.") + .init(), + http_body_gauge: meter + .u64_histogram("example.http_response_size") + .with_unit(Unit::new("By")) + .with_description("The metrics HTTP response sizes in bytes.") + .init(), + http_req_histogram: meter + .f64_histogram("example.http_request_duration") + .with_unit(Unit::new("ms")) + .with_description("The HTTP request latencies in milliseconds.") + .init(), + }); + + // For every connection, we must make a `Service` to handle all + // incoming HTTP requests on said connection. + let make_svc = make_service_fn(move |_conn| { + let state = state.clone(); + // This is the `Service` that will handle the connection. + // `service_fn` is a helper to convert a function that + // returns a Response into a `Service`. + async move { Ok::<_, Infallible>(service_fn(move |req| serve_req(req, state.clone()))) } + }); + + let addr = ([127, 0, 0, 1], 3000).into(); + + let server = Server::bind(&addr).serve(make_svc); + + println!("Listening on http://{addr}"); + + server.await?; + + Ok(()) +} diff -Nru temporalio-1.3.0/vendor/opentelemetry-prometheus/LICENSE temporalio-1.3.0/vendor/opentelemetry-prometheus/LICENSE --- temporalio-1.3.0/vendor/opentelemetry-prometheus/LICENSE 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-prometheus/LICENSE 2023-10-30 19:40:00.000000000 +0000 @@ -186,7 +186,7 @@ same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright [yyyy] [name of copyright owner] + Copyright 2023 The OpenTelemetry Authors Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff -Nru temporalio-1.3.0/vendor/opentelemetry-prometheus/README.md temporalio-1.3.0/vendor/opentelemetry-prometheus/README.md --- temporalio-1.3.0/vendor/opentelemetry-prometheus/README.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-prometheus/README.md 2023-10-30 19:40:00.000000000 +0000 @@ -10,10 +10,7 @@ [![Documentation](https://docs.rs/opentelemetry-prometheus/badge.svg)](https://docs.rs/opentelemetry-prometheus) [![LICENSE](https://img.shields.io/crates/l/opentelemetry-prometheus)](./LICENSE) [![GitHub Actions CI](https://github.com/open-telemetry/opentelemetry-rust/workflows/CI/badge.svg)](https://github.com/open-telemetry/opentelemetry-rust/actions?query=workflow%3ACI+branch%3Amain) -[![Gitter chat](https://img.shields.io/badge/gitter-join%20chat%20%E2%86%92-brightgreen.svg)](https://gitter.im/open-telemetry/opentelemetry-rust) - -[Documentation](https://docs.rs/opentelemetry-prometheus) | -[Chat](https://gitter.im/open-telemetry/opentelemetry-rust) +[![Slack](https://img.shields.io/badge/slack-@cncf/otel/rust-brightgreen.svg?logo=slack)](https://cloud-native.slack.com/archives/C03GDP0H023) ## Overview diff -Nru temporalio-1.3.0/vendor/opentelemetry-prometheus/src/config.rs temporalio-1.3.0/vendor/opentelemetry-prometheus/src/config.rs --- temporalio-1.3.0/vendor/opentelemetry-prometheus/src/config.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-prometheus/src/config.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,142 @@ +use core::fmt; +use std::sync::{Arc, Mutex}; + +use once_cell::sync::OnceCell; +use opentelemetry_api::metrics::{MetricsError, Result}; +use opentelemetry_sdk::metrics::{reader::AggregationSelector, ManualReaderBuilder}; + +use crate::{Collector, PrometheusExporter}; + +/// [PrometheusExporter] configuration options +#[derive(Default)] +pub struct ExporterBuilder { + registry: Option, + disable_target_info: bool, + without_units: bool, + without_counter_suffixes: bool, + namespace: Option, + aggregation: Option>, + disable_scope_info: bool, +} + +impl fmt::Debug for ExporterBuilder { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_struct("ExporterBuilder") + .field("registry", &self.registry) + .field("disable_target_info", &self.disable_target_info) + .field("without_units", &self.without_units) + .field("without_counter_suffixes", &self.without_counter_suffixes) + .field("namespace", &self.namespace) + .field("aggregation", &self.aggregation.is_some()) + .field("disable_scope_info", &self.disable_scope_info) + .finish() + } +} + +impl ExporterBuilder { + /// Disables exporter's addition of unit suffixes to metric names. + /// + /// By default, metric names include a unit suffix to follow Prometheus naming + /// conventions. For example, the counter metric `request.duration`, with unit + /// `ms` would become `request_duration_milliseconds_total`. + /// + /// With this option set, the name would instead be `request_duration_total`. + pub fn without_units(mut self) -> Self { + self.without_units = true; + self + } + + /// Disables exporter's addition `_total` suffixes on counters. + /// + /// By default, metric names include a `_total` suffix to follow Prometheus + /// naming conventions. For example, the counter metric `happy.people` would + /// become `happy_people_total`. With this option set, the name would instead be + /// `happy_people`. + pub fn without_counter_suffixes(mut self) -> Self { + self.without_counter_suffixes = true; + self + } + + /// Configures the exporter to not export the resource `target_info` metric. + /// + /// If not specified, the exporter will create a `target_info` metric containing + /// the metrics' [Resource] attributes. + /// + /// [Resource]: opentelemetry_sdk::Resource + pub fn without_target_info(mut self) -> Self { + self.disable_target_info = true; + self + } + + /// Configures the exporter to not export the `otel_scope_info` metric. + /// + /// If not specified, the exporter will create a `otel_scope_info` metric + /// containing the metrics' Instrumentation Scope, and also add labels about + /// Instrumentation Scope to all metric points. + pub fn without_scope_info(mut self) -> Self { + self.disable_scope_info = true; + self + } + + /// Configures the exporter to prefix metrics with the given namespace. + /// + /// Metrics such as `target_info` and `otel_scope_info` are not prefixed since + /// these have special behavior based on their name. + pub fn with_namespace(mut self, namespace: impl Into) -> Self { + let mut namespace = namespace.into(); + + // namespace and metric names should be separated with an underscore, + // adds a trailing underscore if there is not one already. + if !namespace.ends_with('_') { + namespace.push('_') + } + + self.namespace = Some(namespace); + self + } + + /// Configures which [prometheus::Registry] the exporter will use. + /// + /// If no registry is specified, the prometheus default is used. + pub fn with_registry(mut self, registry: prometheus::Registry) -> Self { + self.registry = Some(registry); + self + } + + /// Configure the [AggregationSelector] the exporter will use. + /// + /// If no selector is provided, the [DefaultAggregationSelector] is used. + /// + /// [DefaultAggregationSelector]: opentelemetry_sdk::metrics::reader::DefaultAggregationSelector + pub fn with_aggregation_selector(mut self, agg: impl AggregationSelector + 'static) -> Self { + self.aggregation = Some(Box::new(agg)); + self + } + + /// Creates a new [PrometheusExporter] from this configuration. + pub fn build(self) -> Result { + let mut reader = ManualReaderBuilder::new(); + if let Some(selector) = self.aggregation { + reader = reader.with_aggregation_selector(selector) + } + let reader = Arc::new(reader.build()); + + let collector = Collector { + reader: Arc::clone(&reader), + disable_target_info: self.disable_target_info, + without_units: self.without_units, + without_counter_suffixes: self.without_counter_suffixes, + disable_scope_info: self.disable_scope_info, + create_target_info_once: OnceCell::new(), + namespace: self.namespace, + inner: Mutex::new(Default::default()), + }; + + let registry = self.registry.unwrap_or_else(prometheus::Registry::new); + registry + .register(Box::new(collector)) + .map_err(|e| MetricsError::Other(e.to_string()))?; + + Ok(PrometheusExporter { reader }) + } +} diff -Nru temporalio-1.3.0/vendor/opentelemetry-prometheus/src/lib.rs temporalio-1.3.0/vendor/opentelemetry-prometheus/src/lib.rs --- temporalio-1.3.0/vendor/opentelemetry-prometheus/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-prometheus/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,63 +1,78 @@ -//! # OpenTelemetry Prometheus Exporter +//! An OpenTelemetry exporter for [Prometheus] metrics. //! -//! ### Prometheus Exporter Example +//! [Prometheus]: https://prometheus.io //! -//! ```rust -//! use opentelemetry::{global, Context, KeyValue, sdk::Resource}; -//! use opentelemetry::sdk::export::metrics::aggregation; -//! use opentelemetry::sdk::metrics::{controllers, processors, selectors}; -//! use opentelemetry_prometheus::PrometheusExporter; -//! use prometheus::{TextEncoder, Encoder}; +//! ``` +//! use opentelemetry_api::{metrics::MeterProvider as _, KeyValue}; +//! use opentelemetry_sdk::metrics::MeterProvider; +//! use prometheus::{Encoder, TextEncoder}; +//! +//! # fn main() -> Result<(), Box> { //! -//! fn init_meter() -> PrometheusExporter { -//! let controller = controllers::basic( -//! processors::factory( -//! selectors::simple::histogram([1.0, 2.0, 5.0, 10.0, 20.0, 50.0]), -//! aggregation::cumulative_temporality_selector(), -//! ) -//! .with_memory(true), -//! ) -//! .build(); +//! // create a new prometheus registry +//! let registry = prometheus::Registry::new(); //! -//! opentelemetry_prometheus::exporter(controller).init() -//! } +//! // configure OpenTelemetry to use this registry +//! let exporter = opentelemetry_prometheus::exporter() +//! .with_registry(registry.clone()) +//! .build()?; //! -//! let cx = Context::current(); -//! let exporter = init_meter(); -//! let meter = global::meter("my-app"); +//! // set up a meter meter to create instruments +//! let provider = MeterProvider::builder().with_reader(exporter).build(); +//! let meter = provider.meter("my-app"); //! //! // Use two instruments //! let counter = meter //! .u64_counter("a.counter") //! .with_description("Counts things") //! .init(); -//! let recorder = meter +//! let histogram = meter //! .i64_histogram("a.histogram") //! .with_description("Records values") //! .init(); //! -//! counter.add(&cx, 100, &[KeyValue::new("key", "value")]); -//! recorder.record(&cx, 100, &[KeyValue::new("key", "value")]); +//! counter.add(100, &[KeyValue::new("key", "value")]); +//! histogram.record(100, &[KeyValue::new("key", "value")]); //! //! // Encode data as text or protobuf //! let encoder = TextEncoder::new(); -//! let metric_families = exporter.registry().gather(); +//! let metric_families = registry.gather(); //! let mut result = Vec::new(); -//! encoder.encode(&metric_families, &mut result); +//! encoder.encode(&metric_families, &mut result)?; //! //! // result now contains encoded metrics: //! // -//! // # HELP a_counter Counts things -//! // # TYPE a_counter counter -//! // a_counter{R="V",key="value"} 100 +//! // # HELP a_counter_total Counts things +//! // # TYPE a_counter_total counter +//! // a_counter_total{key="value",otel_scope_name="my-app"} 100 //! // # HELP a_histogram Records values //! // # TYPE a_histogram histogram -//! // a_histogram_bucket{R="V",key="value",le="0.5"} 0 -//! // a_histogram_bucket{R="V",key="value",le="0.9"} 0 -//! // a_histogram_bucket{R="V",key="value",le="0.99"} 0 -//! // a_histogram_bucket{R="V",key="value",le="+Inf"} 1 -//! // a_histogram_sum{R="V",key="value"} 100 -//! // a_histogram_count{R="V",key="value"} 1 +//! // a_histogram_bucket{key="value",otel_scope_name="my-app",le="0"} 0 +//! // a_histogram_bucket{key="value",otel_scope_name="my-app",le="5"} 0 +//! // a_histogram_bucket{key="value",otel_scope_name="my-app",le="10"} 0 +//! // a_histogram_bucket{key="value",otel_scope_name="my-app",le="25"} 0 +//! // a_histogram_bucket{key="value",otel_scope_name="my-app",le="50"} 0 +//! // a_histogram_bucket{key="value",otel_scope_name="my-app",le="75"} 0 +//! // a_histogram_bucket{key="value",otel_scope_name="my-app",le="100"} 1 +//! // a_histogram_bucket{key="value",otel_scope_name="my-app",le="250"} 1 +//! // a_histogram_bucket{key="value",otel_scope_name="my-app",le="500"} 1 +//! // a_histogram_bucket{key="value",otel_scope_name="my-app",le="750"} 1 +//! // a_histogram_bucket{key="value",otel_scope_name="my-app",le="1000"} 1 +//! // a_histogram_bucket{key="value",otel_scope_name="my-app",le="2500"} 1 +//! // a_histogram_bucket{key="value",otel_scope_name="my-app",le="5000"} 1 +//! // a_histogram_bucket{key="value",otel_scope_name="my-app",le="7500"} 1 +//! // a_histogram_bucket{key="value",otel_scope_name="my-app",le="10000"} 1 +//! // a_histogram_bucket{key="value",otel_scope_name="my-app",le="+Inf"} 1 +//! // a_histogram_sum{key="value",otel_scope_name="my-app"} 100 +//! // a_histogram_count{key="value",otel_scope_name="my-app"} 1 +//! // # HELP otel_scope_info Instrumentation Scope metadata +//! // # TYPE otel_scope_info gauge +//! // otel_scope_info{otel_scope_name="my-app"} 1 +//! // # HELP target_info Target metadata +//! // # TYPE target_info gauge +//! // target_info{service_name="unknown_service"} 1 +//! # Ok(()) +//! # } //! ``` #![warn( future_incompatible, @@ -78,335 +93,522 @@ )] #![cfg_attr(test, deny(warnings))] -use opentelemetry::metrics::MeterProvider; -use opentelemetry::sdk::export::metrics::aggregation::{ - self, AggregationKind, Temporality, TemporalitySelector, +use once_cell::sync::{Lazy, OnceCell}; +use opentelemetry_api::{ + global, + metrics::{MetricsError, Result}, + Context, Key, Value, }; -use opentelemetry::sdk::export::metrics::InstrumentationLibraryReader; -use opentelemetry::sdk::metrics::sdk_api::Descriptor; -#[cfg(feature = "prometheus-encoding")] -pub use prometheus::{Encoder, TextEncoder}; - -use opentelemetry::global; -use opentelemetry::sdk::{ - export::metrics::{ - aggregation::{Histogram, LastValue, Sum}, - Record, - }, +use opentelemetry_sdk::{ metrics::{ - aggregators::{HistogramAggregator, LastValueAggregator, SumAggregator}, - controllers::BasicController, - sdk_api::NumberKind, + data::{self, ResourceMetrics, Temporality}, + reader::{AggregationSelector, MetricProducer, MetricReader, TemporalitySelector}, + Aggregation, InstrumentKind, ManualReader, Pipeline, }, - Resource, + Resource, Scope, +}; +use prometheus::{ + core::Desc, + proto::{LabelPair, MetricFamily, MetricType}, +}; +use std::{ + any::TypeId, + borrow::Cow, + collections::{BTreeMap, HashMap}, + sync::{Arc, Mutex}, }; -use opentelemetry::{attributes, metrics::MetricsError, Context, Key, Value}; -use std::sync::{Arc, Mutex}; +use std::{fmt, sync::Weak}; -mod sanitize; +const TARGET_INFO_NAME: &str = "target_info"; +const TARGET_INFO_DESCRIPTION: &str = "Target metadata"; -use sanitize::sanitize; +const SCOPE_INFO_METRIC_NAME: &str = "otel_scope_info"; +const SCOPE_INFO_DESCRIPTION: &str = "Instrumentation Scope metadata"; -/// Create a new prometheus exporter builder. -pub fn exporter(controller: BasicController) -> ExporterBuilder { - ExporterBuilder::new(controller) +const SCOPE_INFO_KEYS: [&str; 2] = ["otel_scope_name", "otel_scope_version"]; + +// prometheus counters MUST have a _total suffix by default: +// https://github.com/open-telemetry/opentelemetry-specification/blob/v1.20.0/specification/compatibility/prometheus_and_openmetrics.md +const COUNTER_SUFFIX: &str = "_total"; + +mod config; +mod utils; + +pub use config::ExporterBuilder; + +/// Creates a builder to configure a [PrometheusExporter] +pub fn exporter() -> ExporterBuilder { + ExporterBuilder::default() } -/// Configuration for the prometheus exporter. +/// Prometheus metrics exporter #[derive(Debug)] -pub struct ExporterBuilder { - /// The prometheus registry that will be used to register instruments. - /// - /// If not set a new empty `Registry` is created. - registry: Option, - - /// The metrics controller - controller: BasicController, -} - -impl ExporterBuilder { - /// Create a new exporter builder with a given controller - pub fn new(controller: BasicController) -> Self { - ExporterBuilder { - registry: None, - controller, - } +pub struct PrometheusExporter { + reader: Arc, +} + +impl TemporalitySelector for PrometheusExporter { + /// Note: Prometheus only supports cumulative temporality so this will always be + /// [Temporality::Cumulative]. + fn temporality(&self, kind: InstrumentKind) -> Temporality { + self.reader.temporality(kind) } +} - /// Set the prometheus registry to be used by this exporter - pub fn with_registry(self, registry: prometheus::Registry) -> Self { - ExporterBuilder { - registry: Some(registry), - ..self - } +impl AggregationSelector for PrometheusExporter { + fn aggregation(&self, kind: InstrumentKind) -> Aggregation { + self.reader.aggregation(kind) } +} - /// Sets up a complete export pipeline with the recommended setup, using the - /// recommended selector and standard processor. - pub fn try_init(self) -> Result { - let registry = self.registry.unwrap_or_else(prometheus::Registry::new); - - let controller = Arc::new(Mutex::new(self.controller)); - let collector = Collector::with_controller(controller.clone()); - registry - .register(Box::new(collector)) - .map_err(|e| MetricsError::Other(e.to_string()))?; - - let exporter = PrometheusExporter { - registry, - controller, - }; - global::set_meter_provider(exporter.meter_provider()?); +impl MetricReader for PrometheusExporter { + fn register_pipeline(&self, pipeline: Weak) { + self.reader.register_pipeline(pipeline) + } - Ok(exporter) + fn register_producer(&self, producer: Box) { + self.reader.register_producer(producer) } - /// Sets up a complete export pipeline with the recommended setup, using the - /// recommended selector and standard processor. - /// - /// # Panics - /// - /// This panics if the exporter cannot be registered in the prometheus registry. - pub fn init(self) -> PrometheusExporter { - self.try_init().unwrap() + fn collect(&self, rm: &mut ResourceMetrics) -> Result<()> { + self.reader.collect(rm) } -} -/// An implementation of `metrics::Exporter` that sends metrics to Prometheus. -/// -/// This exporter supports Prometheus pulls, as such it does not -/// implement the export.Exporter interface. -#[derive(Clone, Debug)] -pub struct PrometheusExporter { - registry: prometheus::Registry, - controller: Arc>, -} + fn force_flush(&self, cx: &Context) -> Result<()> { + self.reader.force_flush(cx) + } -impl PrometheusExporter { - /// Returns a reference to the current prometheus registry. - pub fn registry(&self) -> &prometheus::Registry { - &self.registry - } - - /// Get this exporter's provider. - pub fn meter_provider(&self) -> Result { - self.controller - .lock() - .map_err(Into::into) - .map(|locked| locked.clone()) + fn shutdown(&self) -> Result<()> { + self.reader.shutdown() } } -#[derive(Debug)] struct Collector { - controller: Arc>, -} + reader: Arc, + disable_target_info: bool, + without_units: bool, + without_counter_suffixes: bool, + disable_scope_info: bool, + create_target_info_once: OnceCell, + namespace: Option, + inner: Mutex, +} + +#[derive(Default)] +struct CollectorInner { + scope_infos: HashMap, + metric_families: HashMap, +} + +// TODO: Remove lazy and switch to pattern matching once `TypeId` is stable in +// const context: https://github.com/rust-lang/rust/issues/77125 +static HISTOGRAM_TYPES: Lazy<[TypeId; 3]> = Lazy::new(|| { + [ + TypeId::of::>(), + TypeId::of::>(), + TypeId::of::>(), + ] +}); +static SUM_TYPES: Lazy<[TypeId; 3]> = Lazy::new(|| { + [ + TypeId::of::>(), + TypeId::of::>(), + TypeId::of::>(), + ] +}); +static GAUGE_TYPES: Lazy<[TypeId; 3]> = Lazy::new(|| { + [ + TypeId::of::>(), + TypeId::of::>(), + TypeId::of::>(), + ] +}); -impl TemporalitySelector for Collector { - fn temporality_for(&self, descriptor: &Descriptor, kind: &AggregationKind) -> Temporality { - aggregation::cumulative_temporality_selector().temporality_for(descriptor, kind) +impl Collector { + fn metric_type_and_name(&self, m: &data::Metric) -> Option<(MetricType, Cow<'static, str>)> { + let mut name = self.get_name(m); + + let data = m.data.as_any(); + let type_id = data.type_id(); + + if HISTOGRAM_TYPES.contains(&type_id) { + Some((MetricType::HISTOGRAM, name)) + } else if GAUGE_TYPES.contains(&type_id) { + Some((MetricType::GAUGE, name)) + } else if SUM_TYPES.contains(&type_id) { + let is_monotonic = if let Some(v) = data.downcast_ref::>() { + v.is_monotonic + } else if let Some(v) = data.downcast_ref::>() { + v.is_monotonic + } else if let Some(v) = data.downcast_ref::>() { + v.is_monotonic + } else { + false + }; + + if is_monotonic { + if !self.without_counter_suffixes { + name = format!("{name}{COUNTER_SUFFIX}").into(); + } + Some((MetricType::COUNTER, name)) + } else { + Some((MetricType::GAUGE, name)) + } + } else { + None + } } -} -impl Collector { - fn with_controller(controller: Arc>) -> Self { - Collector { controller } + fn get_name(&self, m: &data::Metric) -> Cow<'static, str> { + let name = utils::sanitize_name(&m.name); + let unit_suffixes = if self.without_units { + None + } else { + utils::get_unit_suffixes(&m.unit) + }; + match (&self.namespace, unit_suffixes) { + (Some(namespace), Some(suffix)) => Cow::Owned(format!("{namespace}{name}_{suffix}")), + (Some(namespace), None) => Cow::Owned(format!("{namespace}{name}")), + (None, Some(suffix)) => Cow::Owned(format!("{name}_{suffix}")), + (None, None) => name, + } } } impl prometheus::core::Collector for Collector { - /// Unused as descriptors are dynamically registered. - fn desc(&self) -> Vec<&prometheus::core::Desc> { + fn desc(&self) -> Vec<&Desc> { Vec::new() } - /// Collect all otel metrics and convert to prometheus metrics. - fn collect(&self) -> Vec { - if let Ok(controller) = self.controller.lock() { - let mut metrics = Vec::new(); - - if let Err(err) = controller.collect(&Context::current()) { + fn collect(&self) -> Vec { + let mut inner = match self.inner.lock() { + Ok(guard) => guard, + Err(err) => { global::handle_error(err); - return metrics; + return Vec::new(); } + }; - if let Err(err) = controller.try_for_each(&mut |_library, reader| { - reader.try_for_each(self, &mut |record| { - let agg = record.aggregator().ok_or(MetricsError::NoDataCollected)?; - let number_kind = record.descriptor().number_kind(); - let instrument_kind = record.descriptor().instrument_kind(); - - let desc = get_metric_desc(record); - let labels = get_metric_labels(record, controller.resource()); - - if let Some(hist) = agg.as_any().downcast_ref::() { - metrics.push(build_histogram(hist, number_kind, desc, labels)?); - } else if let Some(sum) = agg.as_any().downcast_ref::() { - let counter = if instrument_kind.monotonic() { - build_monotonic_counter(sum, number_kind, desc, labels)? - } else { - build_non_monotonic_counter(sum, number_kind, desc, labels)? - }; - - metrics.push(counter); - } else if let Some(last) = agg.as_any().downcast_ref::() { - metrics.push(build_last_value(last, number_kind, desc, labels)?); - } - - Ok(()) - }) - }) { - global::handle_error(err); + let mut metrics = ResourceMetrics { + resource: Resource::empty(), + scope_metrics: vec![], + }; + if let Err(err) = self.reader.collect(&mut metrics) { + global::handle_error(err); + return vec![]; + } + let mut res = Vec::with_capacity(metrics.scope_metrics.len() + 1); + + let target_info = self.create_target_info_once.get_or_init(|| { + // Resource should be immutable, we don't need to compute again + create_info_metric(TARGET_INFO_NAME, TARGET_INFO_DESCRIPTION, &metrics.resource) + }); + if !self.disable_target_info { + res.push(target_info.clone()) + } + + for scope_metrics in metrics.scope_metrics { + let scope_labels = if !self.disable_scope_info { + let scope_info = inner + .scope_infos + .entry(scope_metrics.scope.clone()) + .or_insert_with_key(create_scope_info_metric); + res.push(scope_info.clone()); + + let mut labels = + Vec::with_capacity(1 + scope_metrics.scope.version.is_some() as usize); + let mut name = LabelPair::new(); + name.set_name(SCOPE_INFO_KEYS[0].into()); + name.set_value(scope_metrics.scope.name.to_string()); + labels.push(name); + if let Some(version) = &scope_metrics.scope.version { + let mut l_version = LabelPair::new(); + l_version.set_name(SCOPE_INFO_KEYS[1].into()); + l_version.set_value(version.to_string()); + labels.push(l_version); + } + + labels + } else { + Vec::new() + }; + + for metrics in scope_metrics.metrics { + let (metric_type, name) = match self.metric_type_and_name(&metrics) { + Some((metric_type, name)) => (metric_type, name), + _ => continue, + }; + + let mfs = &mut inner.metric_families; + let (drop, help) = validate_metrics(&name, &metrics.description, metric_type, mfs); + if drop { + continue; + } + + let description = help.unwrap_or_else(|| metrics.description.into()); + let data = metrics.data.as_any(); + + if let Some(hist) = data.downcast_ref::>() { + add_histogram_metric(&mut res, hist, description, &scope_labels, name); + } else if let Some(hist) = data.downcast_ref::>() { + add_histogram_metric(&mut res, hist, description, &scope_labels, name); + } else if let Some(hist) = data.downcast_ref::>() { + add_histogram_metric(&mut res, hist, description, &scope_labels, name); + } else if let Some(sum) = data.downcast_ref::>() { + add_sum_metric(&mut res, sum, description, &scope_labels, name); + } else if let Some(sum) = data.downcast_ref::>() { + add_sum_metric(&mut res, sum, description, &scope_labels, name); + } else if let Some(sum) = data.downcast_ref::>() { + add_sum_metric(&mut res, sum, description, &scope_labels, name); + } else if let Some(g) = data.downcast_ref::>() { + add_gauge_metric(&mut res, g, description, &scope_labels, name); + } else if let Some(g) = data.downcast_ref::>() { + add_gauge_metric(&mut res, g, description, &scope_labels, name); + } else if let Some(g) = data.downcast_ref::>() { + add_gauge_metric(&mut res, g, description, &scope_labels, name); + } } + } - metrics + res + } +} + +/// Maps attributes into Prometheus-style label pairs. +/// +/// It sanitizes invalid characters and handles duplicate keys (due to +/// sanitization) by sorting and concatenating the values following the spec. +fn get_attrs(kvs: &mut dyn Iterator, extra: &[LabelPair]) -> Vec { + let mut keys_map = BTreeMap::>::new(); + for (key, value) in kvs { + let key = utils::sanitize_prom_kv(key.as_str()); + keys_map + .entry(key) + .and_modify(|v| v.push(value.to_string())) + .or_insert_with(|| vec![value.to_string()]); + } + + let mut res = Vec::with_capacity(keys_map.len() + extra.len()); + + for (key, mut values) in keys_map.into_iter() { + values.sort_unstable(); + + let mut lp = LabelPair::new(); + lp.set_name(key); + lp.set_value(values.join(";")); + res.push(lp); + } + + if !extra.is_empty() { + res.extend(&mut extra.iter().cloned()); + } + + res +} + +fn validate_metrics( + name: &str, + description: &str, + metric_type: MetricType, + mfs: &mut HashMap, +) -> (bool, Option) { + if let Some(existing) = mfs.get(name) { + if existing.get_field_type() != metric_type { + global::handle_error(MetricsError::Other(format!("Instrument type conflict, using existing type definition. Instrument {name}, Existing: {:?}, dropped: {:?}", existing.get_field_type(), metric_type))); + return (true, None); + } + if existing.get_help() != description { + global::handle_error(MetricsError::Other(format!("Instrument description conflict, using existing. Instrument {name}, Existing: {:?}, dropped: {:?}", existing.get_help(), description))); + return (false, Some(existing.get_help().to_string())); + } + (false, None) + } else { + let mut mf = MetricFamily::default(); + mf.set_name(name.into()); + mf.set_help(description.to_string()); + mf.set_field_type(metric_type); + mfs.insert(name.to_string(), mf); + + (false, None) + } +} + +fn add_histogram_metric( + res: &mut Vec, + histogram: &data::Histogram, + description: String, + extra: &[LabelPair], + name: Cow<'static, str>, +) { + // Consider supporting exemplars when `prometheus` crate has the feature + // See: https://github.com/tikv/rust-prometheus/issues/393 + + for dp in &histogram.data_points { + let kvs = get_attrs(&mut dp.attributes.iter(), extra); + let bounds_len = dp.bounds.len(); + let (bucket, _) = dp.bounds.iter().enumerate().fold( + (Vec::with_capacity(bounds_len), 0), + |(mut acc, mut count), (i, bound)| { + count += dp.bucket_counts[i]; + + let mut b = prometheus::proto::Bucket::default(); + b.set_upper_bound(*bound); + b.set_cumulative_count(count); + acc.push(b); + (acc, count) + }, + ); + + let mut h = prometheus::proto::Histogram::default(); + h.set_sample_sum(dp.sum.as_f64()); + h.set_sample_count(dp.count); + h.set_bucket(protobuf::RepeatedField::from_vec(bucket)); + let mut pm = prometheus::proto::Metric::default(); + pm.set_label(protobuf::RepeatedField::from_vec(kvs)); + pm.set_histogram(h); + + let mut mf = prometheus::proto::MetricFamily::default(); + mf.set_name(name.to_string()); + mf.set_help(description.clone()); + mf.set_field_type(prometheus::proto::MetricType::HISTOGRAM); + mf.set_metric(protobuf::RepeatedField::from_vec(vec![pm])); + res.push(mf); + } +} + +fn add_sum_metric( + res: &mut Vec, + sum: &data::Sum, + description: String, + extra: &[LabelPair], + name: Cow<'static, str>, +) { + let metric_type = if sum.is_monotonic { + MetricType::COUNTER + } else { + MetricType::GAUGE + }; + + for dp in &sum.data_points { + let kvs = get_attrs(&mut dp.attributes.iter(), extra); + + let mut pm = prometheus::proto::Metric::default(); + pm.set_label(protobuf::RepeatedField::from_vec(kvs)); + + if sum.is_monotonic { + let mut c = prometheus::proto::Counter::default(); + c.set_value(dp.value.as_f64()); + pm.set_counter(c); } else { - Vec::new() + let mut g = prometheus::proto::Gauge::default(); + g.set_value(dp.value.as_f64()); + pm.set_gauge(g); } + + let mut mf = prometheus::proto::MetricFamily::default(); + mf.set_name(name.to_string()); + mf.set_help(description.clone()); + mf.set_field_type(metric_type); + mf.set_metric(protobuf::RepeatedField::from_vec(vec![pm])); + res.push(mf); } } -fn build_last_value( - lv: &LastValueAggregator, - kind: &NumberKind, - desc: PrometheusMetricDesc, - labels: Vec, -) -> Result { - let (last_value, _) = lv.last_value()?; +fn add_gauge_metric( + res: &mut Vec, + gauge: &data::Gauge, + description: String, + extra: &[LabelPair], + name: Cow<'static, str>, +) { + for dp in &gauge.data_points { + let kvs = get_attrs(&mut dp.attributes.iter(), extra); + + let mut g = prometheus::proto::Gauge::default(); + g.set_value(dp.value.as_f64()); + let mut pm = prometheus::proto::Metric::default(); + pm.set_label(protobuf::RepeatedField::from_vec(kvs)); + pm.set_gauge(g); + + let mut mf = prometheus::proto::MetricFamily::default(); + mf.set_name(name.to_string()); + mf.set_help(description.to_string()); + mf.set_field_type(MetricType::GAUGE); + mf.set_metric(protobuf::RepeatedField::from_vec(vec![pm])); + res.push(mf); + } +} +fn create_info_metric( + target_info_name: &str, + target_info_description: &str, + resource: &Resource, +) -> MetricFamily { let mut g = prometheus::proto::Gauge::default(); - g.set_value(last_value.to_f64(kind)); + g.set_value(1.0); let mut m = prometheus::proto::Metric::default(); - m.set_label(protobuf::RepeatedField::from_vec(labels)); + m.set_label(protobuf::RepeatedField::from_vec(get_attrs( + &mut resource.iter(), + &[], + ))); m.set_gauge(g); - let mut mf = prometheus::proto::MetricFamily::default(); - mf.set_name(desc.name); - mf.set_help(desc.help); - mf.set_field_type(prometheus::proto::MetricType::GAUGE); + let mut mf = MetricFamily::default(); + mf.set_name(target_info_name.into()); + mf.set_help(target_info_description.into()); + mf.set_field_type(MetricType::GAUGE); mf.set_metric(protobuf::RepeatedField::from_vec(vec![m])); - - Ok(mf) + mf } -fn build_non_monotonic_counter( - sum: &SumAggregator, - kind: &NumberKind, - desc: PrometheusMetricDesc, - labels: Vec, -) -> Result { - let sum = sum.sum()?; - +fn create_scope_info_metric(scope: &Scope) -> MetricFamily { let mut g = prometheus::proto::Gauge::default(); - g.set_value(sum.to_f64(kind)); + g.set_value(1.0); + + let mut labels = Vec::with_capacity(1 + scope.version.is_some() as usize); + let mut name = LabelPair::new(); + name.set_name(SCOPE_INFO_KEYS[0].into()); + name.set_value(scope.name.to_string()); + labels.push(name); + if let Some(version) = &scope.version { + let mut v_label = LabelPair::new(); + v_label.set_name(SCOPE_INFO_KEYS[1].into()); + v_label.set_value(version.to_string()); + labels.push(v_label); + } let mut m = prometheus::proto::Metric::default(); m.set_label(protobuf::RepeatedField::from_vec(labels)); m.set_gauge(g); - let mut mf = prometheus::proto::MetricFamily::default(); - mf.set_name(desc.name); - mf.set_help(desc.help); - mf.set_field_type(prometheus::proto::MetricType::GAUGE); + let mut mf = MetricFamily::default(); + mf.set_name(SCOPE_INFO_METRIC_NAME.into()); + mf.set_help(SCOPE_INFO_DESCRIPTION.into()); + mf.set_field_type(MetricType::GAUGE); mf.set_metric(protobuf::RepeatedField::from_vec(vec![m])); - - Ok(mf) + mf } -fn build_monotonic_counter( - sum: &SumAggregator, - kind: &NumberKind, - desc: PrometheusMetricDesc, - labels: Vec, -) -> Result { - let sum = sum.sum()?; - - let mut c = prometheus::proto::Counter::default(); - c.set_value(sum.to_f64(kind)); - - let mut m = prometheus::proto::Metric::default(); - m.set_label(protobuf::RepeatedField::from_vec(labels)); - m.set_counter(c); - - let mut mf = prometheus::proto::MetricFamily::default(); - mf.set_name(desc.name); - mf.set_help(desc.help); - mf.set_field_type(prometheus::proto::MetricType::COUNTER); - mf.set_metric(protobuf::RepeatedField::from_vec(vec![m])); - - Ok(mf) +trait Numeric: fmt::Debug { + // lossy at large values for u64 and i64 but prometheus only handles floats + fn as_f64(&self) -> f64; } -fn build_histogram( - hist: &HistogramAggregator, - kind: &NumberKind, - desc: PrometheusMetricDesc, - labels: Vec, -) -> Result { - let raw_buckets = hist.histogram()?; - let sum = hist.sum()?; - - let mut h = prometheus::proto::Histogram::default(); - h.set_sample_sum(sum.to_f64(kind)); - - let mut count = 0; - let mut buckets = Vec::with_capacity(raw_buckets.boundaries().len()); - for (i, upper_bound) in raw_buckets.boundaries().iter().enumerate() { - count += raw_buckets.counts()[i] as u64; - let mut b = prometheus::proto::Bucket::default(); - b.set_cumulative_count(count); - b.set_upper_bound(*upper_bound); - buckets.push(b); - } - // Include the +inf bucket in the total count. - count += raw_buckets.counts()[raw_buckets.counts().len() - 1] as u64; - h.set_bucket(protobuf::RepeatedField::from_vec(buckets)); - h.set_sample_count(count); - - let mut m = prometheus::proto::Metric::default(); - m.set_label(protobuf::RepeatedField::from_vec(labels)); - m.set_histogram(h); - - let mut mf = prometheus::proto::MetricFamily::default(); - mf.set_name(desc.name); - mf.set_help(desc.help); - mf.set_field_type(prometheus::proto::MetricType::HISTOGRAM); - mf.set_metric(protobuf::RepeatedField::from_vec(vec![m])); - - Ok(mf) +impl Numeric for u64 { + fn as_f64(&self) -> f64 { + *self as f64 + } } -fn build_label_pair(key: &Key, value: &Value) -> prometheus::proto::LabelPair { - let mut lp = prometheus::proto::LabelPair::new(); - lp.set_name(sanitize(key.as_str())); - lp.set_value(value.to_string()); - - lp +impl Numeric for i64 { + fn as_f64(&self) -> f64 { + *self as f64 + } } -fn get_metric_labels( - record: &Record<'_>, - resource: &Resource, -) -> Vec { - // Duplicate keys are resolved by taking the record label value over - // the resource value. - let iter = attributes::merge_iters(record.attributes().iter(), resource.iter()); - iter.map(|(key, value)| build_label_pair(key, value)) - .collect() -} - -struct PrometheusMetricDesc { - name: String, - help: String, -} - -fn get_metric_desc(record: &Record<'_>) -> PrometheusMetricDesc { - let desc = record.descriptor(); - let name = sanitize(desc.name()); - let help = desc - .description() - .cloned() - .unwrap_or_else(|| desc.name().to_string()); - PrometheusMetricDesc { name, help } +impl Numeric for f64 { + fn as_f64(&self) -> f64 { + *self + } } diff -Nru temporalio-1.3.0/vendor/opentelemetry-prometheus/src/sanitize.rs temporalio-1.3.0/vendor/opentelemetry-prometheus/src/sanitize.rs --- temporalio-1.3.0/vendor/opentelemetry-prometheus/src/sanitize.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-prometheus/src/sanitize.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,67 +0,0 @@ -/// sanitize returns a string that is truncated to 100 characters if it's too -/// long, and replaces non-alphanumeric characters to underscores. -pub(crate) fn sanitize>(raw: T) -> String { - let mut escaped = raw - .as_ref() - .chars() - .map(|c| if c.is_ascii_alphanumeric() { c } else { '_' }) - .peekable(); - - let prefix = if escaped.peek().map_or(false, |c| c.is_ascii_digit()) { - "key_" - } else if escaped.peek().map_or(false, |&c| c == '_') { - "key" - } else { - "" - }; - - prefix.chars().chain(escaped).take(100).collect() -} - -#[cfg(test)] -mod tests { - use super::*; - use std::borrow::Cow; - - fn key_data() -> Vec<(&'static str, Cow<'static, str>, Cow<'static, str>)> { - vec![ - ( - "replace character", - "test/key-1".into(), - "test_key_1".into(), - ), - ( - "add prefix if starting with digit", - "0123456789".into(), - "key_0123456789".into(), - ), - ( - "add prefix if starting with _", - "_0123456789".into(), - "key_0123456789".into(), - ), - ( - "starts with _ after sanitization", - "/0123456789".into(), - "key_0123456789".into(), - ), - ( - "limits to 100", - "a".repeat(101).into(), - "a".repeat(100).into(), - ), - ( - "valid input", - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_0123456789".into(), - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_0123456789".into(), - ), - ] - } - - #[test] - fn sanitize_key_names() { - for (name, raw, sanitized) in key_data() { - assert_eq!(sanitize(raw), sanitized, "{} doesn't match", name) - } - } -} diff -Nru temporalio-1.3.0/vendor/opentelemetry-prometheus/src/utils.rs temporalio-1.3.0/vendor/opentelemetry-prometheus/src/utils.rs --- temporalio-1.3.0/vendor/opentelemetry-prometheus/src/utils.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-prometheus/src/utils.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,196 @@ +use opentelemetry_api::metrics::Unit; +use std::borrow::Cow; + +const NON_APPLICABLE_ON_PER_UNIT: [&str; 8] = ["1", "d", "h", "min", "s", "ms", "us", "ns"]; + +pub(crate) fn get_unit_suffixes(unit: &Unit) -> Option> { + // no unit return early + if unit.as_str().is_empty() { + return None; + } + + // direct match with known units + if let Some(matched) = get_prom_units(unit.as_str()) { + return Some(Cow::Borrowed(matched)); + } + + // converting foo/bar to foo_per_bar + // split the string by the first '/' + // if the first part is empty, we just return the second part if it's a match with known per unit + // e.g + // "test/y" => "per_year" + // "km/s" => "kilometers_per_second" + if let Some((first, second)) = unit.as_str().split_once('/') { + return match ( + NON_APPLICABLE_ON_PER_UNIT.contains(&first), + get_prom_units(first), + get_prom_per_unit(second), + ) { + (true, _, Some(second_part)) | (false, None, Some(second_part)) => { + Some(Cow::Owned(format!("per_{}", second_part))) + } + (false, Some(first_part), Some(second_part)) => { + Some(Cow::Owned(format!("{}_per_{}", first_part, second_part))) + } + _ => None, + }; + } + + None +} + +fn get_prom_units(unit: &str) -> Option<&'static str> { + match unit { + // Time + "d" => Some("days"), + "h" => Some("hours"), + "min" => Some("minutes"), + "s" => Some("seconds"), + "ms" => Some("milliseconds"), + "us" => Some("microseconds"), + "ns" => Some("nanoseconds"), + "By" => Some("bytes"), + + // Bytes + "KiBy" => Some("kibibytes"), + "MiBy" => Some("mebibytes"), + "GiBy" => Some("gibibytes"), + "TiBy" => Some("tibibytes"), + "KBy" => Some("kilobytes"), + "MBy" => Some("megabytes"), + "GBy" => Some("gigabytes"), + "TBy" => Some("terabytes"), + "B" => Some("bytes"), + "KB" => Some("kilobytes"), + "MB" => Some("megabytes"), + "GB" => Some("gigabytes"), + "TB" => Some("terabytes"), + + // SI + "m" => Some("meters"), + "V" => Some("volts"), + "A" => Some("amperes"), + "J" => Some("joules"), + "W" => Some("watts"), + "g" => Some("grams"), + + // Misc + "Cel" => Some("celsius"), + "Hz" => Some("hertz"), + "1" => Some("ratio"), + "%" => Some("percent"), + "$" => Some("dollars"), + _ => None, + } +} + +fn get_prom_per_unit(unit: &str) -> Option<&'static str> { + match unit { + "s" => Some("second"), + "m" => Some("minute"), + "h" => Some("hour"), + "d" => Some("day"), + "w" => Some("week"), + "mo" => Some("month"), + "y" => Some("year"), + _ => None, + } +} + +#[allow(clippy::ptr_arg)] +pub(crate) fn sanitize_name(s: &Cow<'static, str>) -> Cow<'static, str> { + // prefix chars to add in case name starts with number + let mut prefix = ""; + + // Find first invalid char + if let Some((replace_idx, _)) = s.char_indices().find(|(i, c)| { + if *i == 0 && c.is_ascii_digit() { + // first char is number, add prefix and replace reset of chars + prefix = "_"; + true + } else { + // keep checking + !c.is_alphanumeric() && *c != '_' && *c != ':' + } + }) { + // up to `replace_idx` have been validated, convert the rest + let (valid, rest) = s.split_at(replace_idx); + Cow::Owned( + prefix + .chars() + .chain(valid.chars()) + .chain(rest.chars().map(|c| { + if c.is_ascii_alphanumeric() || c == '_' || c == ':' { + c + } else { + '_' + } + })) + .collect(), + ) + } else { + s.clone() // no invalid chars found, return existing + } +} + +pub(crate) fn sanitize_prom_kv(s: &str) -> String { + s.chars() + .map(|c| { + if c.is_ascii_alphanumeric() || c == ':' { + c + } else { + '_' + } + }) + .collect() +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn name_sanitization() { + let tests = vec![ + ("nam€_with_3_width_rune", "nam__with_3_width_rune"), + ("`", "_"), + ( + r##"! "#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWKYZ[]\^_abcdefghijklmnopqrstuvwkyz{|}~"##, + "________________0123456789:______ABCDEFGHIJKLMNOPQRSTUVWKYZ_____abcdefghijklmnopqrstuvwkyz____", + ), + + ("Avalid_23name", "Avalid_23name"), + ("_Avalid_23name", "_Avalid_23name"), + ("1valid_23name", "_1valid_23name"), + ("avalid_23name", "avalid_23name"), + ("Ava:lid_23name", "Ava:lid_23name"), + ("a lid_23name", "a_lid_23name"), + (":leading_colon", ":leading_colon"), + ("colon:in:the:middle", "colon:in:the:middle"), + ("", ""), + ]; + + for (input, want) in tests { + assert_eq!(want, sanitize_name(&input.into()), "input: {input}") + } + } + + #[test] + fn test_get_unit_suffixes() { + let test_cases = vec![ + // Direct match + ("g", Some(Cow::Borrowed("grams"))), + // Per unit + ("test/y", Some(Cow::Owned("per_year".to_owned()))), + ("1/y", Some(Cow::Owned("per_year".to_owned()))), + ("m/s", Some(Cow::Owned("meters_per_second".to_owned()))), + // No match + ("invalid", None), + ("", None), + ]; + for (unit_str, expected_suffix) in test_cases { + let unit = Unit::new(unit_str); + assert_eq!(get_unit_suffixes(&unit), expected_suffix); + } + } +} diff -Nru temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/conflict_help_two_counters_1.txt temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/conflict_help_two_counters_1.txt --- temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/conflict_help_two_counters_1.txt 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/conflict_help_two_counters_1.txt 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,11 @@ +# HELP bar_bytes_total meter a bar +# TYPE bar_bytes_total counter +bar_bytes_total{type="bar",otel_scope_name="ma",otel_scope_version="v0.1.0"} 100 +bar_bytes_total{type="bar",otel_scope_name="mb",otel_scope_version="v0.1.0"} 100 +# HELP otel_scope_info Instrumentation Scope metadata +# TYPE otel_scope_info gauge +otel_scope_info{otel_scope_name="ma",otel_scope_version="v0.1.0"} 1 +otel_scope_info{otel_scope_name="mb",otel_scope_version="v0.1.0"} 1 +# HELP target_info Target metadata +# TYPE target_info gauge +target_info{service_name="prometheus_test",telemetry_sdk_language="rust",telemetry_sdk_name="opentelemetry",telemetry_sdk_version="latest"} 1 diff -Nru temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/conflict_help_two_counters_2.txt temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/conflict_help_two_counters_2.txt --- temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/conflict_help_two_counters_2.txt 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/conflict_help_two_counters_2.txt 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,11 @@ +# HELP bar_bytes_total meter b bar +# TYPE bar_bytes_total counter +bar_bytes_total{type="bar",otel_scope_name="ma",otel_scope_version="v0.1.0"} 100 +bar_bytes_total{type="bar",otel_scope_name="mb",otel_scope_version="v0.1.0"} 100 +# HELP otel_scope_info Instrumentation Scope metadata +# TYPE otel_scope_info gauge +otel_scope_info{otel_scope_name="ma",otel_scope_version="v0.1.0"} 1 +otel_scope_info{otel_scope_name="mb",otel_scope_version="v0.1.0"} 1 +# HELP target_info Target metadata +# TYPE target_info gauge +target_info{service_name="prometheus_test",telemetry_sdk_language="rust",telemetry_sdk_name="opentelemetry",telemetry_sdk_version="latest"} 1 diff -Nru temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/conflict_help_two_histograms_1.txt temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/conflict_help_two_histograms_1.txt --- temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/conflict_help_two_histograms_1.txt 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/conflict_help_two_histograms_1.txt 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,45 @@ +# HELP bar_bytes meter a bar +# TYPE bar_bytes histogram +bar_bytes_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="0"} 0 +bar_bytes_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="5"} 0 +bar_bytes_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="10"} 0 +bar_bytes_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="25"} 0 +bar_bytes_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="50"} 0 +bar_bytes_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="75"} 0 +bar_bytes_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="100"} 1 +bar_bytes_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="250"} 1 +bar_bytes_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="500"} 1 +bar_bytes_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="750"} 1 +bar_bytes_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="1000"} 1 +bar_bytes_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="2500"} 1 +bar_bytes_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="5000"} 1 +bar_bytes_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="7500"} 1 +bar_bytes_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="10000"} 1 +bar_bytes_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="+Inf"} 1 +bar_bytes_sum{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0"} 100 +bar_bytes_count{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0"} 1 +bar_bytes_bucket{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0",le="0"} 0 +bar_bytes_bucket{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0",le="5"} 0 +bar_bytes_bucket{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0",le="10"} 0 +bar_bytes_bucket{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0",le="25"} 0 +bar_bytes_bucket{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0",le="50"} 0 +bar_bytes_bucket{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0",le="75"} 0 +bar_bytes_bucket{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0",le="100"} 1 +bar_bytes_bucket{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0",le="250"} 1 +bar_bytes_bucket{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0",le="500"} 1 +bar_bytes_bucket{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0",le="750"} 1 +bar_bytes_bucket{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0",le="1000"} 1 +bar_bytes_bucket{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0",le="2500"} 1 +bar_bytes_bucket{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0",le="5000"} 1 +bar_bytes_bucket{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0",le="7500"} 1 +bar_bytes_bucket{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0",le="10000"} 1 +bar_bytes_bucket{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0",le="+Inf"} 1 +bar_bytes_sum{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0"} 100 +bar_bytes_count{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0"} 1 +# HELP otel_scope_info Instrumentation Scope metadata +# TYPE otel_scope_info gauge +otel_scope_info{otel_scope_name="ma",otel_scope_version="v0.1.0"} 1 +otel_scope_info{otel_scope_name="mb",otel_scope_version="v0.1.0"} 1 +# HELP target_info Target metadata +# TYPE target_info gauge +target_info{service_name="prometheus_test",telemetry_sdk_language="rust",telemetry_sdk_name="opentelemetry",telemetry_sdk_version="latest"} 1 diff -Nru temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/conflict_help_two_histograms_2.txt temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/conflict_help_two_histograms_2.txt --- temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/conflict_help_two_histograms_2.txt 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/conflict_help_two_histograms_2.txt 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,45 @@ +# HELP bar_bytes meter b bar +# TYPE bar_bytes histogram +bar_bytes_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="0"} 0 +bar_bytes_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="5"} 0 +bar_bytes_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="10"} 0 +bar_bytes_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="25"} 0 +bar_bytes_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="50"} 0 +bar_bytes_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="75"} 0 +bar_bytes_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="100"} 1 +bar_bytes_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="250"} 1 +bar_bytes_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="500"} 1 +bar_bytes_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="750"} 1 +bar_bytes_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="1000"} 1 +bar_bytes_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="2500"} 1 +bar_bytes_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="5000"} 1 +bar_bytes_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="7500"} 1 +bar_bytes_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="10000"} 1 +bar_bytes_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="+Inf"} 1 +bar_bytes_sum{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0"} 100 +bar_bytes_count{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0"} 1 +bar_bytes_bucket{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0",le="0"} 0 +bar_bytes_bucket{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0",le="5"} 0 +bar_bytes_bucket{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0",le="10"} 0 +bar_bytes_bucket{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0",le="25"} 0 +bar_bytes_bucket{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0",le="50"} 0 +bar_bytes_bucket{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0",le="75"} 0 +bar_bytes_bucket{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0",le="100"} 1 +bar_bytes_bucket{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0",le="250"} 1 +bar_bytes_bucket{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0",le="500"} 1 +bar_bytes_bucket{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0",le="750"} 1 +bar_bytes_bucket{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0",le="1000"} 1 +bar_bytes_bucket{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0",le="2500"} 1 +bar_bytes_bucket{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0",le="5000"} 1 +bar_bytes_bucket{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0",le="7500"} 1 +bar_bytes_bucket{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0",le="10000"} 1 +bar_bytes_bucket{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0",le="+Inf"} 1 +bar_bytes_sum{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0"} 100 +bar_bytes_count{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0"} 1 +# HELP otel_scope_info Instrumentation Scope metadata +# TYPE otel_scope_info gauge +otel_scope_info{otel_scope_name="ma",otel_scope_version="v0.1.0"} 1 +otel_scope_info{otel_scope_name="mb",otel_scope_version="v0.1.0"} 1 +# HELP target_info Target metadata +# TYPE target_info gauge +target_info{service_name="prometheus_test",telemetry_sdk_language="rust",telemetry_sdk_name="opentelemetry",telemetry_sdk_version="latest"} 1 diff -Nru temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/conflict_help_two_updowncounters_1.txt temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/conflict_help_two_updowncounters_1.txt --- temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/conflict_help_two_updowncounters_1.txt 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/conflict_help_two_updowncounters_1.txt 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,11 @@ +# HELP bar_bytes meter a bar +# TYPE bar_bytes gauge +bar_bytes{type="bar",otel_scope_name="ma",otel_scope_version="v0.1.0"} 100 +bar_bytes{type="bar",otel_scope_name="mb",otel_scope_version="v0.1.0"} 100 +# HELP otel_scope_info Instrumentation Scope metadata +# TYPE otel_scope_info gauge +otel_scope_info{otel_scope_name="ma",otel_scope_version="v0.1.0"} 1 +otel_scope_info{otel_scope_name="mb",otel_scope_version="v0.1.0"} 1 +# HELP target_info Target metadata +# TYPE target_info gauge +target_info{service_name="prometheus_test",telemetry_sdk_language="rust",telemetry_sdk_name="opentelemetry",telemetry_sdk_version="latest"} 1 diff -Nru temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/conflict_help_two_updowncounters_2.txt temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/conflict_help_two_updowncounters_2.txt --- temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/conflict_help_two_updowncounters_2.txt 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/conflict_help_two_updowncounters_2.txt 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,11 @@ +# HELP bar_bytes meter b bar +# TYPE bar_bytes gauge +bar_bytes{type="bar",otel_scope_name="ma",otel_scope_version="v0.1.0"} 100 +bar_bytes{type="bar",otel_scope_name="mb",otel_scope_version="v0.1.0"} 100 +# HELP otel_scope_info Instrumentation Scope metadata +# TYPE otel_scope_info gauge +otel_scope_info{otel_scope_name="ma",otel_scope_version="v0.1.0"} 1 +otel_scope_info{otel_scope_name="mb",otel_scope_version="v0.1.0"} 1 +# HELP target_info Target metadata +# TYPE target_info gauge +target_info{service_name="prometheus_test",telemetry_sdk_language="rust",telemetry_sdk_name="opentelemetry",telemetry_sdk_version="latest"} 1 diff -Nru temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/conflict_type_counter_and_updowncounter_1.txt temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/conflict_type_counter_and_updowncounter_1.txt --- temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/conflict_type_counter_and_updowncounter_1.txt 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/conflict_type_counter_and_updowncounter_1.txt 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,9 @@ +# HELP foo_total meter foo +# TYPE foo_total counter +foo_total{type="foo",otel_scope_name="ma",otel_scope_version="v0.1.0"} 100 +# HELP otel_scope_info Instrumentation Scope metadata +# TYPE otel_scope_info gauge +otel_scope_info{otel_scope_name="ma",otel_scope_version="v0.1.0"} 1 +# HELP target_info Target metadata +# TYPE target_info gauge +target_info{service_name="prometheus_test",telemetry_sdk_language="rust",telemetry_sdk_name="opentelemetry",telemetry_sdk_version="latest"} 1 diff -Nru temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/conflict_type_counter_and_updowncounter_2.txt temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/conflict_type_counter_and_updowncounter_2.txt --- temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/conflict_type_counter_and_updowncounter_2.txt 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/conflict_type_counter_and_updowncounter_2.txt 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,9 @@ +# HELP foo_total meter foo +# TYPE foo_total gauge +foo_total{type="foo",otel_scope_name="ma",otel_scope_version="v0.1.0"} 100 +# HELP otel_scope_info Instrumentation Scope metadata +# TYPE otel_scope_info gauge +otel_scope_info{otel_scope_name="ma",otel_scope_version="v0.1.0"} 1 +# HELP target_info Target metadata +# TYPE target_info gauge +target_info{service_name="prometheus_test",telemetry_sdk_language="rust",telemetry_sdk_name="opentelemetry",telemetry_sdk_version="latest"} 1 diff -Nru temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/conflict_type_histogram_and_updowncounter_1.txt temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/conflict_type_histogram_and_updowncounter_1.txt --- temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/conflict_type_histogram_and_updowncounter_1.txt 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/conflict_type_histogram_and_updowncounter_1.txt 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,9 @@ +# HELP foo_bytes meter gauge foo +# TYPE foo_bytes gauge +foo_bytes{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0"} 100 +# HELP otel_scope_info Instrumentation Scope metadata +# TYPE otel_scope_info gauge +otel_scope_info{otel_scope_name="ma",otel_scope_version="v0.1.0"} 1 +# HELP target_info Target metadata +# TYPE target_info gauge +target_info{service_name="prometheus_test",telemetry_sdk_language="rust",telemetry_sdk_name="opentelemetry",telemetry_sdk_version="latest"} 1 diff -Nru temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/conflict_type_histogram_and_updowncounter_2.txt temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/conflict_type_histogram_and_updowncounter_2.txt --- temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/conflict_type_histogram_and_updowncounter_2.txt 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/conflict_type_histogram_and_updowncounter_2.txt 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,26 @@ +# HELP foo_bytes meter histogram foo +# TYPE foo_bytes histogram +foo_bytes_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="0"} 0 +foo_bytes_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="5"} 0 +foo_bytes_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="10"} 0 +foo_bytes_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="25"} 0 +foo_bytes_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="50"} 0 +foo_bytes_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="75"} 0 +foo_bytes_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="100"} 1 +foo_bytes_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="250"} 1 +foo_bytes_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="500"} 1 +foo_bytes_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="750"} 1 +foo_bytes_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="1000"} 1 +foo_bytes_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="2500"} 1 +foo_bytes_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="5000"} 1 +foo_bytes_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="7500"} 1 +foo_bytes_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="10000"} 1 +foo_bytes_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="+Inf"} 1 +foo_bytes_sum{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0"} 100 +foo_bytes_count{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0"} 1 +# HELP otel_scope_info Instrumentation Scope metadata +# TYPE otel_scope_info gauge +otel_scope_info{otel_scope_name="ma",otel_scope_version="v0.1.0"} 1 +# HELP target_info Target metadata +# TYPE target_info gauge +target_info{service_name="prometheus_test",telemetry_sdk_language="rust",telemetry_sdk_name="opentelemetry",telemetry_sdk_version="latest"} 1 diff -Nru temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/conflict_unit_two_counters.txt temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/conflict_unit_two_counters.txt --- temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/conflict_unit_two_counters.txt 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/conflict_unit_two_counters.txt 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,11 @@ +# HELP bar_total meter bar +# TYPE bar_total counter +bar_total{type="bar",otel_scope_name="ma",otel_scope_version="v0.1.0"} 100 +bar_total{type="bar",otel_scope_name="mb",otel_scope_version="v0.1.0"} 100 +# HELP otel_scope_info Instrumentation Scope metadata +# TYPE otel_scope_info gauge +otel_scope_info{otel_scope_name="ma",otel_scope_version="v0.1.0"} 1 +otel_scope_info{otel_scope_name="mb",otel_scope_version="v0.1.0"} 1 +# HELP target_info Target metadata +# TYPE target_info gauge +target_info{service_name="prometheus_test",telemetry_sdk_language="rust",telemetry_sdk_name="opentelemetry",telemetry_sdk_version="latest"} 1 diff -Nru temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/conflict_unit_two_histograms.txt temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/conflict_unit_two_histograms.txt --- temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/conflict_unit_two_histograms.txt 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/conflict_unit_two_histograms.txt 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,45 @@ +# HELP bar meter histogram bar +# TYPE bar histogram +bar_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="0"} 0 +bar_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="5"} 0 +bar_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="10"} 0 +bar_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="25"} 0 +bar_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="50"} 0 +bar_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="75"} 0 +bar_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="100"} 1 +bar_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="250"} 1 +bar_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="500"} 1 +bar_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="750"} 1 +bar_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="1000"} 1 +bar_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="2500"} 1 +bar_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="5000"} 1 +bar_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="7500"} 1 +bar_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="10000"} 1 +bar_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="+Inf"} 1 +bar_sum{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0"} 100 +bar_count{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0"} 1 +bar_bucket{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0",le="0"} 0 +bar_bucket{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0",le="5"} 0 +bar_bucket{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0",le="10"} 0 +bar_bucket{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0",le="25"} 0 +bar_bucket{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0",le="50"} 0 +bar_bucket{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0",le="75"} 0 +bar_bucket{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0",le="100"} 1 +bar_bucket{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0",le="250"} 1 +bar_bucket{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0",le="500"} 1 +bar_bucket{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0",le="750"} 1 +bar_bucket{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0",le="1000"} 1 +bar_bucket{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0",le="2500"} 1 +bar_bucket{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0",le="5000"} 1 +bar_bucket{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0",le="7500"} 1 +bar_bucket{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0",le="10000"} 1 +bar_bucket{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0",le="+Inf"} 1 +bar_sum{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0"} 100 +bar_count{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0"} 1 +# HELP otel_scope_info Instrumentation Scope metadata +# TYPE otel_scope_info gauge +otel_scope_info{otel_scope_name="ma",otel_scope_version="v0.1.0"} 1 +otel_scope_info{otel_scope_name="mb",otel_scope_version="v0.1.0"} 1 +# HELP target_info Target metadata +# TYPE target_info gauge +target_info{service_name="prometheus_test",telemetry_sdk_language="rust",telemetry_sdk_name="opentelemetry",telemetry_sdk_version="latest"} 1 diff -Nru temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/conflict_unit_two_updowncounters.txt temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/conflict_unit_two_updowncounters.txt --- temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/conflict_unit_two_updowncounters.txt 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/conflict_unit_two_updowncounters.txt 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,11 @@ +# HELP bar meter gauge bar +# TYPE bar gauge +bar{type="bar",otel_scope_name="ma",otel_scope_version="v0.1.0"} 100 +bar{type="bar",otel_scope_name="mb",otel_scope_version="v0.1.0"} 100 +# HELP otel_scope_info Instrumentation Scope metadata +# TYPE otel_scope_info gauge +otel_scope_info{otel_scope_name="ma",otel_scope_version="v0.1.0"} 1 +otel_scope_info{otel_scope_name="mb",otel_scope_version="v0.1.0"} 1 +# HELP target_info Target metadata +# TYPE target_info gauge +target_info{service_name="prometheus_test",telemetry_sdk_language="rust",telemetry_sdk_name="opentelemetry",telemetry_sdk_version="latest"} 1 diff -Nru temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/counter_disabled_suffix.txt temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/counter_disabled_suffix.txt --- temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/counter_disabled_suffix.txt 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/counter_disabled_suffix.txt 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,10 @@ +# HELP foo_milliseconds a simple counter without a total suffix +# TYPE foo_milliseconds counter +foo_milliseconds{A="B",C="D",E="true",F="42",otel_scope_name="testmeter",otel_scope_version="v0.1.0"} 24.3 +foo_milliseconds{A="D",C="B",E="true",F="42",otel_scope_name="testmeter",otel_scope_version="v0.1.0"} 5 +# HELP otel_scope_info Instrumentation Scope metadata +# TYPE otel_scope_info gauge +otel_scope_info{otel_scope_name="testmeter",otel_scope_version="v0.1.0"} 1 +# HELP target_info Target metadata +# TYPE target_info gauge +target_info{service_name="prometheus_test",telemetry_sdk_language="rust",telemetry_sdk_name="opentelemetry",telemetry_sdk_version="latest"} 1 diff -Nru temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/counter.txt temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/counter.txt --- temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/counter.txt 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/counter.txt 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,10 @@ +# HELP foo_milliseconds_total a simple counter +# TYPE foo_milliseconds_total counter +foo_milliseconds_total{A="B",C="D",E="true",F="42",otel_scope_name="testmeter",otel_scope_version="v0.1.0"} 24.3 +foo_milliseconds_total{A="D",C="B",E="true",F="42",otel_scope_name="testmeter",otel_scope_version="v0.1.0"} 5 +# HELP otel_scope_info Instrumentation Scope metadata +# TYPE otel_scope_info gauge +otel_scope_info{otel_scope_name="testmeter",otel_scope_version="v0.1.0"} 1 +# HELP target_info Target metadata +# TYPE target_info gauge +target_info{service_name="prometheus_test",telemetry_sdk_language="rust",telemetry_sdk_name="opentelemetry",telemetry_sdk_version="latest"} 1 diff -Nru temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/custom_resource.txt temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/custom_resource.txt --- temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/custom_resource.txt 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/custom_resource.txt 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,9 @@ +# HELP foo_total a simple counter +# TYPE foo_total counter +foo_total{A="B",C="D",E="true",F="42",otel_scope_name="testmeter",otel_scope_version="v0.1.0"} 24.3 +# HELP otel_scope_info Instrumentation Scope metadata +# TYPE otel_scope_info gauge +otel_scope_info{otel_scope_name="testmeter",otel_scope_version="v0.1.0"} 1 +# HELP target_info Target metadata +# TYPE target_info gauge +target_info{A="B",C="D",service_name="prometheus_test",telemetry_sdk_language="rust",telemetry_sdk_name="opentelemetry",telemetry_sdk_version="latest"} 1 diff -Nru temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/empty_resource.txt temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/empty_resource.txt --- temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/empty_resource.txt 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/empty_resource.txt 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,9 @@ +# HELP foo_total a simple counter +# TYPE foo_total counter +foo_total{A="B",C="D",E="true",F="42",otel_scope_name="testmeter",otel_scope_version="v0.1.0"} 24.3 +# HELP otel_scope_info Instrumentation Scope metadata +# TYPE otel_scope_info gauge +otel_scope_info{otel_scope_name="testmeter",otel_scope_version="v0.1.0"} 1 +# HELP target_info Target metadata +# TYPE target_info gauge +target_info 1 diff -Nru temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/gauge.txt temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/gauge.txt --- temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/gauge.txt 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/gauge.txt 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,9 @@ +# HELP bar_ratio a fun little gauge +# TYPE bar_ratio gauge +bar_ratio{A="B",C="D",otel_scope_name="testmeter",otel_scope_version="v0.1.0"} 0.75 +# HELP otel_scope_info Instrumentation Scope metadata +# TYPE otel_scope_info gauge +otel_scope_info{otel_scope_name="testmeter",otel_scope_version="v0.1.0"} 1 +# HELP target_info Target metadata +# TYPE target_info gauge +target_info{service_name="prometheus_test",telemetry_sdk_language="rust",telemetry_sdk_name="opentelemetry",telemetry_sdk_version="latest"} 1 diff -Nru temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/histogram.txt temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/histogram.txt --- temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/histogram.txt 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/histogram.txt 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,21 @@ +# HELP histogram_baz_bytes a very nice histogram +# TYPE histogram_baz_bytes histogram +histogram_baz_bytes_bucket{A="B",C="D",otel_scope_name="testmeter",otel_scope_version="v0.1.0",le="0"} 0 +histogram_baz_bytes_bucket{A="B",C="D",otel_scope_name="testmeter",otel_scope_version="v0.1.0",le="5"} 0 +histogram_baz_bytes_bucket{A="B",C="D",otel_scope_name="testmeter",otel_scope_version="v0.1.0",le="10"} 1 +histogram_baz_bytes_bucket{A="B",C="D",otel_scope_name="testmeter",otel_scope_version="v0.1.0",le="25"} 2 +histogram_baz_bytes_bucket{A="B",C="D",otel_scope_name="testmeter",otel_scope_version="v0.1.0",le="50"} 2 +histogram_baz_bytes_bucket{A="B",C="D",otel_scope_name="testmeter",otel_scope_version="v0.1.0",le="75"} 2 +histogram_baz_bytes_bucket{A="B",C="D",otel_scope_name="testmeter",otel_scope_version="v0.1.0",le="100"} 2 +histogram_baz_bytes_bucket{A="B",C="D",otel_scope_name="testmeter",otel_scope_version="v0.1.0",le="250"} 4 +histogram_baz_bytes_bucket{A="B",C="D",otel_scope_name="testmeter",otel_scope_version="v0.1.0",le="500"} 4 +histogram_baz_bytes_bucket{A="B",C="D",otel_scope_name="testmeter",otel_scope_version="v0.1.0",le="1000"} 4 +histogram_baz_bytes_bucket{A="B",C="D",otel_scope_name="testmeter",otel_scope_version="v0.1.0",le="+Inf"} 4 +histogram_baz_bytes_sum{A="B",C="D",otel_scope_name="testmeter",otel_scope_version="v0.1.0"} 236 +histogram_baz_bytes_count{A="B",C="D",otel_scope_name="testmeter",otel_scope_version="v0.1.0"} 4 +# HELP otel_scope_info Instrumentation Scope metadata +# TYPE otel_scope_info gauge +otel_scope_info{otel_scope_name="testmeter",otel_scope_version="v0.1.0"} 1 +# HELP target_info Target metadata +# TYPE target_info gauge +target_info{service_name="prometheus_test",telemetry_sdk_language="rust",telemetry_sdk_name="opentelemetry",telemetry_sdk_version="latest"} 1 diff -Nru temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/multi_scopes.txt temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/multi_scopes.txt --- temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/multi_scopes.txt 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/multi_scopes.txt 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,13 @@ +# HELP bar_milliseconds_total meter bar counter +# TYPE bar_milliseconds_total counter +bar_milliseconds_total{type="bar",otel_scope_name="meterbar",otel_scope_version="v0.1.0"} 200 +# HELP foo_milliseconds_total meter foo counter +# TYPE foo_milliseconds_total counter +foo_milliseconds_total{type="foo",otel_scope_name="meterfoo",otel_scope_version="v0.1.0"} 100 +# HELP otel_scope_info Instrumentation Scope metadata +# TYPE otel_scope_info gauge +otel_scope_info{otel_scope_name="meterbar",otel_scope_version="v0.1.0"} 1 +otel_scope_info{otel_scope_name="meterfoo",otel_scope_version="v0.1.0"} 1 +# HELP target_info Target metadata +# TYPE target_info gauge +target_info{service_name="prometheus_test",telemetry_sdk_language="rust",telemetry_sdk_name="opentelemetry",telemetry_sdk_version="latest"} 1 diff -Nru temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/no_conflict_two_counters.txt temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/no_conflict_two_counters.txt --- temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/no_conflict_two_counters.txt 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/no_conflict_two_counters.txt 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,11 @@ +# HELP foo_bytes_total meter counter foo +# TYPE foo_bytes_total counter +foo_bytes_total{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0"} 100 +foo_bytes_total{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0"} 100 +# HELP otel_scope_info Instrumentation Scope metadata +# TYPE otel_scope_info gauge +otel_scope_info{otel_scope_name="ma",otel_scope_version="v0.1.0"} 1 +otel_scope_info{otel_scope_name="mb",otel_scope_version="v0.1.0"} 1 +# HELP target_info Target metadata +# TYPE target_info gauge +target_info{service_name="prometheus_test",telemetry_sdk_language="rust",telemetry_sdk_name="opentelemetry",telemetry_sdk_version="latest"} 1 diff -Nru temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/no_conflict_two_histograms.txt temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/no_conflict_two_histograms.txt --- temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/no_conflict_two_histograms.txt 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/no_conflict_two_histograms.txt 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,45 @@ +# HELP foo_bytes meter histogram foo +# TYPE foo_bytes histogram +foo_bytes_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="0"} 0 +foo_bytes_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="5"} 0 +foo_bytes_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="10"} 0 +foo_bytes_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="25"} 0 +foo_bytes_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="50"} 0 +foo_bytes_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="75"} 0 +foo_bytes_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="100"} 1 +foo_bytes_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="250"} 1 +foo_bytes_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="500"} 1 +foo_bytes_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="750"} 1 +foo_bytes_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="1000"} 1 +foo_bytes_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="2500"} 1 +foo_bytes_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="5000"} 1 +foo_bytes_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="7500"} 1 +foo_bytes_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="10000"} 1 +foo_bytes_bucket{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0",le="+Inf"} 1 +foo_bytes_sum{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0"} 100 +foo_bytes_count{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0"} 1 +foo_bytes_bucket{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0",le="0"} 0 +foo_bytes_bucket{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0",le="5"} 0 +foo_bytes_bucket{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0",le="10"} 0 +foo_bytes_bucket{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0",le="25"} 0 +foo_bytes_bucket{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0",le="50"} 0 +foo_bytes_bucket{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0",le="75"} 0 +foo_bytes_bucket{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0",le="100"} 1 +foo_bytes_bucket{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0",le="250"} 1 +foo_bytes_bucket{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0",le="500"} 1 +foo_bytes_bucket{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0",le="750"} 1 +foo_bytes_bucket{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0",le="1000"} 1 +foo_bytes_bucket{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0",le="2500"} 1 +foo_bytes_bucket{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0",le="5000"} 1 +foo_bytes_bucket{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0",le="7500"} 1 +foo_bytes_bucket{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0",le="10000"} 1 +foo_bytes_bucket{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0",le="+Inf"} 1 +foo_bytes_sum{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0"} 100 +foo_bytes_count{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0"} 1 +# HELP otel_scope_info Instrumentation Scope metadata +# TYPE otel_scope_info gauge +otel_scope_info{otel_scope_name="ma",otel_scope_version="v0.1.0"} 1 +otel_scope_info{otel_scope_name="mb",otel_scope_version="v0.1.0"} 1 +# HELP target_info Target metadata +# TYPE target_info gauge +target_info{service_name="prometheus_test",telemetry_sdk_language="rust",telemetry_sdk_name="opentelemetry",telemetry_sdk_version="latest"} 1 diff -Nru temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/no_conflict_two_updowncounters.txt temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/no_conflict_two_updowncounters.txt --- temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/no_conflict_two_updowncounters.txt 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/no_conflict_two_updowncounters.txt 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,11 @@ +# HELP foo_bytes meter gauge foo +# TYPE foo_bytes gauge +foo_bytes{A="B",otel_scope_name="ma",otel_scope_version="v0.1.0"} 100 +foo_bytes{A="B",otel_scope_name="mb",otel_scope_version="v0.1.0"} 100 +# HELP otel_scope_info Instrumentation Scope metadata +# TYPE otel_scope_info gauge +otel_scope_info{otel_scope_name="ma",otel_scope_version="v0.1.0"} 1 +otel_scope_info{otel_scope_name="mb",otel_scope_version="v0.1.0"} 1 +# HELP target_info Target metadata +# TYPE target_info gauge +target_info{service_name="prometheus_test",telemetry_sdk_language="rust",telemetry_sdk_name="opentelemetry",telemetry_sdk_version="latest"} 1 diff -Nru temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/sanitized_labels.txt temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/sanitized_labels.txt --- temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/sanitized_labels.txt 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/sanitized_labels.txt 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,9 @@ +# HELP foo_total a sanitary counter +# TYPE foo_total counter +foo_total{A_B="Q",C_D="Y;Z",otel_scope_name="testmeter",otel_scope_version="v0.1.0"} 24.3 +# HELP otel_scope_info Instrumentation Scope metadata +# TYPE otel_scope_info gauge +otel_scope_info{otel_scope_name="testmeter",otel_scope_version="v0.1.0"} 1 +# HELP target_info Target metadata +# TYPE target_info gauge +target_info{service_name="prometheus_test",telemetry_sdk_language="rust",telemetry_sdk_name="opentelemetry",telemetry_sdk_version="latest"} 1 diff -Nru temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/sanitized_names.txt temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/sanitized_names.txt --- temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/sanitized_names.txt 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/sanitized_names.txt 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,35 @@ +# HELP _0invalid_counter_name_total a counter with an invalid name +# TYPE _0invalid_counter_name_total counter +_0invalid_counter_name_total{A="B",C="D",otel_scope_name="testmeter",otel_scope_version="v0.1.0"} 100 +# HELP bar a fun little gauge +# TYPE bar gauge +bar{A="B",C="D",otel_scope_name="testmeter",otel_scope_version="v0.1.0"} 75 +# HELP invalid_gauge_name a gauge with an invalid name +# TYPE invalid_gauge_name gauge +invalid_gauge_name{A="B",C="D",otel_scope_name="testmeter",otel_scope_version="v0.1.0"} 100 +# HELP invalid_hist_name a histogram with an invalid name +# TYPE invalid_hist_name histogram +invalid_hist_name_bucket{A="B",C="D",otel_scope_name="testmeter",otel_scope_version="v0.1.0",le="0"} 0 +invalid_hist_name_bucket{A="B",C="D",otel_scope_name="testmeter",otel_scope_version="v0.1.0",le="5"} 0 +invalid_hist_name_bucket{A="B",C="D",otel_scope_name="testmeter",otel_scope_version="v0.1.0",le="10"} 0 +invalid_hist_name_bucket{A="B",C="D",otel_scope_name="testmeter",otel_scope_version="v0.1.0",le="25"} 1 +invalid_hist_name_bucket{A="B",C="D",otel_scope_name="testmeter",otel_scope_version="v0.1.0",le="50"} 1 +invalid_hist_name_bucket{A="B",C="D",otel_scope_name="testmeter",otel_scope_version="v0.1.0",le="75"} 1 +invalid_hist_name_bucket{A="B",C="D",otel_scope_name="testmeter",otel_scope_version="v0.1.0",le="100"} 1 +invalid_hist_name_bucket{A="B",C="D",otel_scope_name="testmeter",otel_scope_version="v0.1.0",le="250"} 1 +invalid_hist_name_bucket{A="B",C="D",otel_scope_name="testmeter",otel_scope_version="v0.1.0",le="500"} 1 +invalid_hist_name_bucket{A="B",C="D",otel_scope_name="testmeter",otel_scope_version="v0.1.0",le="750"} 1 +invalid_hist_name_bucket{A="B",C="D",otel_scope_name="testmeter",otel_scope_version="v0.1.0",le="1000"} 1 +invalid_hist_name_bucket{A="B",C="D",otel_scope_name="testmeter",otel_scope_version="v0.1.0",le="2500"} 1 +invalid_hist_name_bucket{A="B",C="D",otel_scope_name="testmeter",otel_scope_version="v0.1.0",le="5000"} 1 +invalid_hist_name_bucket{A="B",C="D",otel_scope_name="testmeter",otel_scope_version="v0.1.0",le="7500"} 1 +invalid_hist_name_bucket{A="B",C="D",otel_scope_name="testmeter",otel_scope_version="v0.1.0",le="10000"} 1 +invalid_hist_name_bucket{A="B",C="D",otel_scope_name="testmeter",otel_scope_version="v0.1.0",le="+Inf"} 1 +invalid_hist_name_sum{A="B",C="D",otel_scope_name="testmeter",otel_scope_version="v0.1.0"} 23 +invalid_hist_name_count{A="B",C="D",otel_scope_name="testmeter",otel_scope_version="v0.1.0"} 1 +# HELP otel_scope_info Instrumentation Scope metadata +# TYPE otel_scope_info gauge +otel_scope_info{otel_scope_name="testmeter",otel_scope_version="v0.1.0"} 1 +# HELP target_info Target metadata +# TYPE target_info gauge +target_info{service_name="prometheus_test",telemetry_sdk_language="rust",telemetry_sdk_name="opentelemetry",telemetry_sdk_version="latest"} 1 diff -Nru temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/with_namespace.txt temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/with_namespace.txt --- temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/with_namespace.txt 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/with_namespace.txt 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,9 @@ +# HELP otel_scope_info Instrumentation Scope metadata +# TYPE otel_scope_info gauge +otel_scope_info{otel_scope_name="testmeter",otel_scope_version="v0.1.0"} 1 +# HELP target_info Target metadata +# TYPE target_info gauge +target_info{service_name="prometheus_test",telemetry_sdk_language="rust",telemetry_sdk_name="opentelemetry",telemetry_sdk_version="latest"} 1 +# HELP test_foo_total a simple counter +# TYPE test_foo_total counter +test_foo_total{A="B",C="D",E="true",F="42",otel_scope_name="testmeter",otel_scope_version="v0.1.0"} 24.3 diff -Nru temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/without_scope_and_target_info.txt temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/without_scope_and_target_info.txt --- temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/without_scope_and_target_info.txt 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/without_scope_and_target_info.txt 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,3 @@ +# HELP bar_bytes_total a fun little counter +# TYPE bar_bytes_total counter +bar_bytes_total{A="B",C="D"} 3 diff -Nru temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/without_scope_info.txt temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/without_scope_info.txt --- temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/without_scope_info.txt 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/without_scope_info.txt 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,6 @@ +# HELP bar_ratio a fun little gauge +# TYPE bar_ratio gauge +bar_ratio{A="B",C="D"} 1 +# HELP target_info Target metadata +# TYPE target_info gauge +target_info{service_name="prometheus_test",telemetry_sdk_language="rust",telemetry_sdk_name="opentelemetry",telemetry_sdk_version="latest"} 1 diff -Nru temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/without_target_info.txt temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/without_target_info.txt --- temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/without_target_info.txt 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/data/without_target_info.txt 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,6 @@ +# HELP foo_total a simple counter +# TYPE foo_total counter +foo_total{A="B",C="D",E="true",F="42",otel_scope_name="testmeter",otel_scope_version="v0.1.0"} 24.3 +# HELP otel_scope_info Instrumentation Scope metadata +# TYPE otel_scope_info gauge +otel_scope_info{otel_scope_name="testmeter",otel_scope_version="v0.1.0"} 1 diff -Nru temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/integration_test.rs temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/integration_test.rs --- temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/integration_test.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-prometheus/tests/integration_test.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,162 +1,770 @@ -use opentelemetry::sdk::export::metrics::aggregation; -use opentelemetry::sdk::metrics::{controllers, processors, selectors}; -use opentelemetry::sdk::Resource; -use opentelemetry::Context; -use opentelemetry::{metrics::MeterProvider, KeyValue}; -use opentelemetry_prometheus::PrometheusExporter; +use std::fs; +use std::path::Path; +use std::time::Duration; + +use opentelemetry_api::metrics::{Meter, MeterProvider as _, Unit}; +use opentelemetry_api::Key; +use opentelemetry_api::KeyValue; +use opentelemetry_prometheus::ExporterBuilder; +use opentelemetry_sdk::metrics::{new_view, Aggregation, Instrument, MeterProvider, Stream}; +use opentelemetry_sdk::resource::{ + EnvResourceDetector, SdkProvidedResourceDetector, TelemetryResourceDetector, +}; +use opentelemetry_sdk::Resource; +use opentelemetry_semantic_conventions::resource::{SERVICE_NAME, TELEMETRY_SDK_VERSION}; use prometheus::{Encoder, TextEncoder}; #[test] -fn free_unused_instruments() { - let cx = Context::new(); - let controller = controllers::basic( - processors::factory( - selectors::simple::histogram(vec![-0.5, 1.0]), - aggregation::cumulative_temporality_selector(), - ) - .with_memory(true), - ) - .with_resource(Resource::new(vec![KeyValue::new("R", "V")])) - .build(); - let exporter = opentelemetry_prometheus::exporter(controller).init(); - let mut expected = Vec::new(); - - { - let meter = exporter - .meter_provider() - .unwrap() - .versioned_meter("test", None, None); - let counter = meter.f64_counter("counter").init(); - - let attributes = vec![KeyValue::new("A", "B"), KeyValue::new("C", "D")]; - - counter.add(&cx, 10.0, &attributes); - counter.add(&cx, 5.3, &attributes); - - expected.push(r#"counter{A="B",C="D",R="V"} 15.3"#); - } - // Standard export - compare_export(&exporter, expected.clone()); - // Final export before instrument dropped - compare_export(&exporter, expected.clone()); - // Instrument dropped, but last value kept by prom exporter - compare_export(&exporter, expected); -} - -#[test] -fn test_add() { - let cx = Context::new(); - let controller = controllers::basic( - processors::factory( - selectors::simple::histogram(vec![-0.5, 1.0]), - aggregation::cumulative_temporality_selector(), - ) - .with_memory(true), - ) - .with_resource(Resource::new(vec![KeyValue::new("R", "V")])) - .build(); - let exporter = opentelemetry_prometheus::exporter(controller).init(); - - let meter = exporter - .meter_provider() - .unwrap() - .versioned_meter("test", None, None); +fn prometheus_exporter_integration() { + struct TestCase { + name: &'static str, + empty_resource: bool, + custom_resource_attrs: Vec, + #[allow(clippy::type_complexity)] + record_metrics: Box, + builder: ExporterBuilder, + expected_file: &'static str, + } - let up_down_counter = meter.f64_up_down_counter("updowncounter").init(); - let counter = meter.f64_counter("counter").init(); - let histogram = meter.f64_histogram("my.histogram").init(); + impl Default for TestCase { + fn default() -> Self { + TestCase { + name: "", + empty_resource: false, + custom_resource_attrs: Vec::new(), + record_metrics: Box::new(|_| {}), + builder: ExporterBuilder::default(), + expected_file: "", + } + } + } - let attributes = vec![KeyValue::new("A", "B"), KeyValue::new("C", "D")]; + let test_cases = vec![ + TestCase { + name: "counter", + expected_file: "counter.txt", + record_metrics: Box::new(|meter| { + let attrs = vec![ + Key::new("A").string("B"), + Key::new("C").string("D"), + Key::new("E").bool(true), + Key::new("F").i64(42), + ]; + let counter = meter + .f64_counter("foo") + .with_description("a simple counter") + .with_unit(Unit::new("ms")) + .init(); + counter.add(5.0, &attrs); + counter.add(10.3, &attrs); + counter.add(9.0, &attrs); + let attrs2 = vec![ + Key::new("A").string("D"), + Key::new("C").string("B"), + Key::new("E").bool(true), + Key::new("F").i64(42), + ]; + counter.add(5.0, &attrs2); + }), + ..Default::default() + }, + TestCase { + name: "counter with suffixes disabled", + expected_file: "counter_disabled_suffix.txt", + builder: ExporterBuilder::default().without_counter_suffixes(), + record_metrics: Box::new(|meter| { + let attrs = vec![ + Key::new("A").string("B"), + Key::new("C").string("D"), + Key::new("E").bool(true), + Key::new("F").i64(42), + ]; + let counter = meter + .f64_counter("foo") + .with_description("a simple counter without a total suffix") + .with_unit(Unit::new("ms")) + .init(); + counter.add(5.0, &attrs); + counter.add(10.3, &attrs); + counter.add(9.0, &attrs); + let attrs2 = vec![ + Key::new("A").string("D"), + Key::new("C").string("B"), + Key::new("E").bool(true), + Key::new("F").i64(42), + ]; + counter.add(5.0, &attrs2); + }), + ..Default::default() + }, + TestCase { + name: "gauge", + expected_file: "gauge.txt", + record_metrics: Box::new(|meter| { + let attrs = vec![Key::new("A").string("B"), Key::new("C").string("D")]; + let gauge = meter + .f64_up_down_counter("bar") + .with_description("a fun little gauge") + .with_unit(Unit::new("1")) + .init(); + gauge.add(1.0, &attrs); + gauge.add(-0.25, &attrs); + }), + ..Default::default() + }, + TestCase { + name: "histogram", + expected_file: "histogram.txt", + record_metrics: Box::new(|meter| { + let attrs = vec![Key::new("A").string("B"), Key::new("C").string("D")]; + let histogram = meter + .f64_histogram("histogram_baz") + .with_description("a very nice histogram") + .with_unit(Unit::new("By")) + .init(); + histogram.record(23.0, &attrs); + histogram.record(7.0, &attrs); + histogram.record(101.0, &attrs); + histogram.record(105.0, &attrs); + }), + ..Default::default() + }, + TestCase { + name: "sanitized attributes to labels", + expected_file: "sanitized_labels.txt", + builder: ExporterBuilder::default().without_units(), + record_metrics: Box::new(|meter| { + let attrs = vec![ + // exact match, value should be overwritten + Key::new("A.B").string("X"), + Key::new("A.B").string("Q"), + // unintended match due to sanitization, values should be concatenated + Key::new("C.D").string("Y"), + Key::new("C/D").string("Z"), + ]; + let counter = meter + .f64_counter("foo") + .with_description("a sanitary counter") + // This unit is not added to + .with_unit(Unit::new("By")) + .init(); + counter.add(5.0, &attrs); + counter.add(10.3, &attrs); + counter.add(9.0, &attrs); + }), + ..Default::default() + }, + TestCase { + name: "invalid instruments are renamed", + expected_file: "sanitized_names.txt", + record_metrics: Box::new(|meter| { + let attrs = vec![Key::new("A").string("B"), Key::new("C").string("D")]; + // Valid. + let mut gauge = meter + .f64_up_down_counter("bar") + .with_description("a fun little gauge") + .init(); + gauge.add(100., &attrs); + gauge.add(-25.0, &attrs); + + // Invalid, will be renamed. + gauge = meter + .f64_up_down_counter("invalid.gauge.name") + .with_description("a gauge with an invalid name") + .init(); + gauge.add(100.0, &attrs); + + let counter = meter + .f64_counter("0invalid.counter.name") + .with_description("a counter with an invalid name") + .init(); + counter.add(100.0, &attrs); + + let histogram = meter + .f64_histogram("invalid.hist.name") + .with_description("a histogram with an invalid name") + .init(); + histogram.record(23.0, &attrs); + }), + ..Default::default() + }, + TestCase { + name: "empty resource", + empty_resource: true, + expected_file: "empty_resource.txt", + record_metrics: Box::new(|meter| { + let attrs = vec![ + Key::new("A").string("B"), + Key::new("C").string("D"), + Key::new("E").bool(true), + Key::new("F").i64(42), + ]; + let counter = meter + .f64_counter("foo") + .with_description("a simple counter") + .init(); + counter.add(5.0, &attrs); + counter.add(10.3, &attrs); + counter.add(9.0, &attrs); + }), + ..Default::default() + }, + TestCase { + name: "custom resource", + custom_resource_attrs: vec![Key::new("A").string("B"), Key::new("C").string("D")], + expected_file: "custom_resource.txt", + record_metrics: Box::new(|meter| { + let attrs = vec![ + Key::new("A").string("B"), + Key::new("C").string("D"), + Key::new("E").bool(true), + Key::new("F").i64(42), + ]; + let counter = meter + .f64_counter("foo") + .with_description("a simple counter") + .init(); + counter.add(5., &attrs); + counter.add(10.3, &attrs); + counter.add(9.0, &attrs); + }), + ..Default::default() + }, + TestCase { + name: "without target_info", + builder: ExporterBuilder::default().without_target_info(), + expected_file: "without_target_info.txt", + record_metrics: Box::new(|meter| { + let attrs = vec![ + Key::new("A").string("B"), + Key::new("C").string("D"), + Key::new("E").bool(true), + Key::new("F").i64(42), + ]; + let counter = meter + .f64_counter("foo") + .with_description("a simple counter") + .init(); + counter.add(5.0, &attrs); + counter.add(10.3, &attrs); + counter.add(9.0, &attrs); + }), + ..Default::default() + }, + TestCase { + name: "without scope_info", + builder: ExporterBuilder::default().without_scope_info(), + expected_file: "without_scope_info.txt", + record_metrics: Box::new(|meter| { + let attrs = vec![Key::new("A").string("B"), Key::new("C").string("D")]; + let gauge = meter + .i64_up_down_counter("bar") + .with_description("a fun little gauge") + .with_unit(Unit::new("1")) + .init(); + gauge.add(2, &attrs); + gauge.add(-1, &attrs); + }), + ..Default::default() + }, + TestCase { + name: "without scope_info and target_info", + builder: ExporterBuilder::default() + .without_scope_info() + .without_target_info(), + expected_file: "without_scope_and_target_info.txt", + record_metrics: Box::new(|meter| { + let attrs = vec![Key::new("A").string("B"), Key::new("C").string("D")]; + let counter = meter + .u64_counter("bar") + .with_description("a fun little counter") + .with_unit(Unit::new("By")) + .init(); + counter.add(2, &attrs); + counter.add(1, &attrs); + }), + ..Default::default() + }, + TestCase { + name: "with namespace", + builder: ExporterBuilder::default().with_namespace("test"), + expected_file: "with_namespace.txt", + record_metrics: Box::new(|meter| { + let attrs = vec![ + Key::new("A").string("B"), + Key::new("C").string("D"), + Key::new("E").bool(true), + Key::new("F").i64(42), + ]; + let counter = meter + .f64_counter("foo") + .with_description("a simple counter") + .init(); + + counter.add(5.0, &attrs); + counter.add(10.3, &attrs); + counter.add(9.0, &attrs); + }), + ..Default::default() + }, + ]; - let mut expected = Vec::new(); + for tc in test_cases { + let registry = prometheus::Registry::new(); + let exporter = tc.builder.with_registry(registry.clone()).build().unwrap(); + + let res = if tc.empty_resource { + Resource::empty() + } else { + Resource::from_detectors( + Duration::from_secs(0), + vec![ + Box::new(SdkProvidedResourceDetector), + Box::new(EnvResourceDetector::new()), + Box::new(TelemetryResourceDetector), + ], + ) + .merge(&mut Resource::new( + vec![ + // always specify service.name because the default depends on the running OS + SERVICE_NAME.string("prometheus_test"), + // Overwrite the semconv.TelemetrySDKVersionKey value so we don't need to update every version + TELEMETRY_SDK_VERSION.string("latest"), + ] + .into_iter() + .chain(tc.custom_resource_attrs.into_iter()), + )) + }; + + let provider = MeterProvider::builder() + .with_resource(res) + .with_reader(exporter) + .with_view( + new_view( + Instrument::new().name("histogram_*"), + Stream::new().aggregation(Aggregation::ExplicitBucketHistogram { + boundaries: vec![ + 0.0, 5.0, 10.0, 25.0, 50.0, 75.0, 100.0, 250.0, 500.0, 1000.0, + ], + record_min_max: true, + }), + ) + .unwrap(), + ) + .build(); + let meter = + provider.versioned_meter("testmeter", Some("v0.1.0"), None::<&'static str>, None); + (tc.record_metrics)(meter); + + let content = fs::read_to_string(Path::new("./tests/data").join(tc.expected_file)) + .expect(tc.expected_file); + gather_and_compare(registry, content, tc.name); + } +} - counter.add(&cx, 10.0, &attributes); - counter.add(&cx, 5.3, &attributes); +fn gather_and_compare(registry: prometheus::Registry, expected: String, name: &'static str) { + let mut output = Vec::new(); + let encoder = TextEncoder::new(); + let metric_families = registry.gather(); + encoder.encode(&metric_families, &mut output).unwrap(); + let output_string = String::from_utf8(output).unwrap(); - expected.push(r#"counter{A="B",C="D",R="V"} 15.3"#); + assert_eq!(output_string, expected, "{name}"); +} - let cb_attributes = attributes.clone(); - let gauge = meter.i64_observable_gauge("intgauge").init(); - meter - .register_callback(move |cx| gauge.observe(cx, 1, cb_attributes.as_ref())) +#[test] +fn multiple_scopes() { + let registry = prometheus::Registry::new(); + let exporter = ExporterBuilder::default() + .with_registry(registry.clone()) + .build() .unwrap(); - expected.push(r#"intgauge{A="B",C="D",R="V"} 1"#); - - histogram.record(&cx, -0.6, &attributes); - histogram.record(&cx, -0.4, &attributes); - histogram.record(&cx, 0.6, &attributes); - histogram.record(&cx, 20.0, &attributes); + let resource = Resource::from_detectors( + Duration::from_secs(0), + vec![ + Box::new(SdkProvidedResourceDetector), + Box::new(EnvResourceDetector::new()), + Box::new(TelemetryResourceDetector), + ], + ) + .merge(&mut Resource::new( + vec![ + // always specify service.name because the default depends on the running OS + SERVICE_NAME.string("prometheus_test"), + // Overwrite the semconv.TelemetrySDKVersionKey value so we don't need to update every version + TELEMETRY_SDK_VERSION.string("latest"), + ] + .into_iter(), + )); + + let provider = MeterProvider::builder() + .with_reader(exporter) + .with_resource(resource) + .build(); + + let foo_counter = provider + .versioned_meter("meterfoo", Some("v0.1.0"), None::<&'static str>, None) + .u64_counter("foo") + .with_unit(Unit::new("ms")) + .with_description("meter foo counter") + .init(); + foo_counter.add(100, &[KeyValue::new("type", "foo")]); + + let bar_counter = provider + .versioned_meter("meterbar", Some("v0.1.0"), None::<&'static str>, None) + .u64_counter("bar") + .with_unit(Unit::new("ms")) + .with_description("meter bar counter") + .init(); + bar_counter.add(200, &[KeyValue::new("type", "bar")]); - expected.push(r#"my_histogram_bucket{A="B",C="D",R="V",le="+Inf"} 4"#); - expected.push(r#"my_histogram_bucket{A="B",C="D",R="V",le="-0.5"} 1"#); - expected.push(r#"my_histogram_bucket{A="B",C="D",R="V",le="1"} 3"#); - expected.push(r#"my_histogram_count{A="B",C="D",R="V"} 4"#); - expected.push(r#"my_histogram_sum{A="B",C="D",R="V"} 19.6"#); + let content = fs::read_to_string("./tests/data/multi_scopes.txt").unwrap(); + gather_and_compare(registry, content, "multi_scope"); +} - up_down_counter.add(&cx, 10.0, &attributes); - up_down_counter.add(&cx, -3.2, &attributes); +#[test] +fn duplicate_metrics() { + struct TestCase { + name: &'static str, + custom_resource_attrs: Vec, + #[allow(clippy::type_complexity)] + record_metrics: Box, + builder: ExporterBuilder, + expected_files: Vec<&'static str>, + } - expected.push(r#"updowncounter{A="B",C="D",R="V"} 6.8"#); + impl Default for TestCase { + fn default() -> Self { + TestCase { + name: "", + custom_resource_attrs: Vec::new(), + record_metrics: Box::new(|_, _| {}), + builder: ExporterBuilder::default(), + expected_files: Vec::new(), + } + } + } - compare_export(&exporter, expected) -} + let test_cases = vec![ + TestCase { + name: "no_conflict_two_counters", + record_metrics: Box::new(|meter_a, meter_b| { + let foo_a = meter_a + .u64_counter("foo") + .with_unit(Unit::new("By")) + .with_description("meter counter foo") + .init(); + + foo_a.add(100, &[KeyValue::new("A", "B")]); + + let foo_b = meter_b + .u64_counter("foo") + .with_unit(Unit::new("By")) + .with_description("meter counter foo") + .init(); + + foo_b.add(100, &[KeyValue::new("A", "B")]); + }), + expected_files: vec!["no_conflict_two_counters.txt"], + ..Default::default() + }, + TestCase { + name: "no_conflict_two_updowncounters", + record_metrics: Box::new(|meter_a, meter_b| { + let foo_a = meter_a + .i64_up_down_counter("foo") + .with_unit(Unit::new("By")) + .with_description("meter gauge foo") + .init(); + + foo_a.add(100, &[KeyValue::new("A", "B")]); + + let foo_b = meter_b + .i64_up_down_counter("foo") + .with_unit(Unit::new("By")) + .with_description("meter gauge foo") + .init(); + + foo_b.add(100, &[KeyValue::new("A", "B")]); + }), + expected_files: vec!["no_conflict_two_updowncounters.txt"], + ..Default::default() + }, + TestCase { + name: "no_conflict_two_histograms", + record_metrics: Box::new(|meter_a, meter_b| { + let foo_a = meter_a + .i64_histogram("foo") + .with_unit(Unit::new("By")) + .with_description("meter histogram foo") + .init(); + + foo_a.record(100, &[KeyValue::new("A", "B")]); + + let foo_b = meter_b + .i64_histogram("foo") + .with_unit(Unit::new("By")) + .with_description("meter histogram foo") + .init(); + + foo_b.record(100, &[KeyValue::new("A", "B")]); + }), + expected_files: vec!["no_conflict_two_histograms.txt"], + ..Default::default() + }, + TestCase { + name: "conflict_help_two_counters", + record_metrics: Box::new(|meter_a, meter_b| { + let bar_a = meter_a + .u64_counter("bar") + .with_unit(Unit::new("By")) + .with_description("meter a bar") + .init(); + + bar_a.add(100, &[KeyValue::new("type", "bar")]); + + let bar_b = meter_b + .u64_counter("bar") + .with_unit(Unit::new("By")) + .with_description("meter b bar") + .init(); + + bar_b.add(100, &[KeyValue::new("type", "bar")]); + }), + expected_files: vec![ + "conflict_help_two_counters_1.txt", + "conflict_help_two_counters_2.txt", + ], + ..Default::default() + }, + TestCase { + name: "conflict_help_two_updowncounters", + record_metrics: Box::new(|meter_a, meter_b| { + let bar_a = meter_a + .i64_up_down_counter("bar") + .with_unit(Unit::new("By")) + .with_description("meter a bar") + .init(); + + bar_a.add(100, &[KeyValue::new("type", "bar")]); + + let bar_b = meter_b + .i64_up_down_counter("bar") + .with_unit(Unit::new("By")) + .with_description("meter b bar") + .init(); + + bar_b.add(100, &[KeyValue::new("type", "bar")]); + }), + expected_files: vec![ + "conflict_help_two_updowncounters_1.txt", + "conflict_help_two_updowncounters_2.txt", + ], + ..Default::default() + }, + TestCase { + name: "conflict_help_two_histograms", + record_metrics: Box::new(|meter_a, meter_b| { + let bar_a = meter_a + .i64_histogram("bar") + .with_unit(Unit::new("By")) + .with_description("meter a bar") + .init(); + + bar_a.record(100, &[KeyValue::new("A", "B")]); + + let bar_b = meter_b + .i64_histogram("bar") + .with_unit(Unit::new("By")) + .with_description("meter b bar") + .init(); + + bar_b.record(100, &[KeyValue::new("A", "B")]); + }), + expected_files: vec![ + "conflict_help_two_histograms_1.txt", + "conflict_help_two_histograms_2.txt", + ], + ..Default::default() + }, + TestCase { + name: "conflict_unit_two_counters", + record_metrics: Box::new(|meter_a, meter_b| { + let baz_a = meter_a + .u64_counter("bar") + .with_unit(Unit::new("By")) + .with_description("meter bar") + .init(); + + baz_a.add(100, &[KeyValue::new("type", "bar")]); + + let baz_b = meter_b + .u64_counter("bar") + .with_unit(Unit::new("ms")) + .with_description("meter bar") + .init(); + + baz_b.add(100, &[KeyValue::new("type", "bar")]); + }), + builder: ExporterBuilder::default().without_units(), + expected_files: vec!["conflict_unit_two_counters.txt"], + ..Default::default() + }, + TestCase { + name: "conflict_unit_two_updowncounters", + record_metrics: Box::new(|meter_a, meter_b| { + let bar_a = meter_a + .i64_up_down_counter("bar") + .with_unit(Unit::new("By")) + .with_description("meter gauge bar") + .init(); + + bar_a.add(100, &[KeyValue::new("type", "bar")]); + + let bar_b = meter_b + .i64_up_down_counter("bar") + .with_unit(Unit::new("ms")) + .with_description("meter gauge bar") + .init(); + + bar_b.add(100, &[KeyValue::new("type", "bar")]); + }), + builder: ExporterBuilder::default().without_units(), + expected_files: vec!["conflict_unit_two_updowncounters.txt"], + ..Default::default() + }, + TestCase { + name: "conflict_unit_two_histograms", + record_metrics: Box::new(|meter_a, meter_b| { + let bar_a = meter_a + .i64_histogram("bar") + .with_unit(Unit::new("By")) + .with_description("meter histogram bar") + .init(); + + bar_a.record(100, &[KeyValue::new("A", "B")]); + + let bar_b = meter_b + .i64_histogram("bar") + .with_unit(Unit::new("ms")) + .with_description("meter histogram bar") + .init(); + + bar_b.record(100, &[KeyValue::new("A", "B")]); + }), + builder: ExporterBuilder::default().without_units(), + expected_files: vec!["conflict_unit_two_histograms.txt"], + ..Default::default() + }, + TestCase { + name: "conflict_type_counter_and_updowncounter", + record_metrics: Box::new(|meter_a, _meter_b| { + let counter = meter_a + .u64_counter("foo") + .with_unit(Unit::new("By")) + .with_description("meter foo") + .init(); + + counter.add(100, &[KeyValue::new("type", "foo")]); + + let gauge = meter_a + .i64_up_down_counter("foo_total") + .with_unit(Unit::new("By")) + .with_description("meter foo") + .init(); + + gauge.add(200, &[KeyValue::new("type", "foo")]); + }), + builder: ExporterBuilder::default().without_units(), + expected_files: vec![ + "conflict_type_counter_and_updowncounter_1.txt", + "conflict_type_counter_and_updowncounter_2.txt", + ], + ..Default::default() + }, + TestCase { + name: "conflict_type_histogram_and_updowncounter", + record_metrics: Box::new(|meter_a, _meter_b| { + let foo_a = meter_a + .i64_up_down_counter("foo") + .with_unit(Unit::new("By")) + .with_description("meter gauge foo") + .init(); + + foo_a.add(100, &[KeyValue::new("A", "B")]); + + let foo_histogram_a = meter_a + .i64_histogram("foo") + .with_unit(Unit::new("By")) + .with_description("meter histogram foo") + .init(); + + foo_histogram_a.record(100, &[KeyValue::new("A", "B")]); + }), + expected_files: vec![ + "conflict_type_histogram_and_updowncounter_1.txt", + "conflict_type_histogram_and_updowncounter_2.txt", + ], + ..Default::default() + }, + ]; -#[test] -fn test_sanitization() { - let cx = Context::new(); - let controller = controllers::basic( - processors::factory( - selectors::simple::histogram(vec![-0.5, 1.0]), - aggregation::cumulative_temporality_selector(), + for tc in test_cases { + let registry = prometheus::Registry::new(); + let exporter = tc.builder.with_registry(registry.clone()).build().unwrap(); + + let resource = Resource::from_detectors( + Duration::from_secs(0), + vec![ + Box::new(SdkProvidedResourceDetector), + Box::new(EnvResourceDetector::new()), + Box::new(TelemetryResourceDetector), + ], ) - .with_memory(true), - ) - .with_resource(Resource::new(vec![KeyValue::new( - "service.name", - "Test Service", - )])) - .build(); - let exporter = opentelemetry_prometheus::exporter(controller).init(); - let meter = exporter - .meter_provider() - .unwrap() - .versioned_meter("test", None, None); - - let histogram = meter.f64_histogram("http.server.duration").init(); - let attributes = vec![ - KeyValue::new("http.method", "GET"), - KeyValue::new("http.host", "server"), - ]; - histogram.record(&cx, -0.6, &attributes); - histogram.record(&cx, -0.4, &attributes); - histogram.record(&cx, 0.6, &attributes); - histogram.record(&cx, 20.0, &attributes); - - let expected = vec![ - r#"http_server_duration_bucket{http_host="server",http_method="GET",service_name="Test Service",le="+Inf"} 4"#, - r#"http_server_duration_bucket{http_host="server",http_method="GET",service_name="Test Service",le="-0.5"} 1"#, - r#"http_server_duration_bucket{http_host="server",http_method="GET",service_name="Test Service",le="1"} 3"#, - r#"http_server_duration_count{http_host="server",http_method="GET",service_name="Test Service"} 4"#, - r#"http_server_duration_sum{http_host="server",http_method="GET",service_name="Test Service"} 19.6"#, - ]; - compare_export(&exporter, expected) + .merge(&mut Resource::new( + vec![ + // always specify service.name because the default depends on the running OS + SERVICE_NAME.string("prometheus_test"), + // Overwrite the semconv.TelemetrySDKVersionKey value so we don't need to update every version + TELEMETRY_SDK_VERSION.string("latest"), + ] + .into_iter() + .chain(tc.custom_resource_attrs.into_iter()), + )); + + let provider = MeterProvider::builder() + .with_resource(resource) + .with_reader(exporter) + .build(); + + let meter_a = provider.versioned_meter("ma", Some("v0.1.0"), None::<&'static str>, None); + let meter_b = provider.versioned_meter("mb", Some("v0.1.0"), None::<&'static str>, None); + + (tc.record_metrics)(meter_a, meter_b); + + let possible_matches = tc + .expected_files + .into_iter() + .map(|f| fs::read_to_string(Path::new("./tests/data").join(f)).expect(f)) + .collect(); + gather_and_compare_multi(registry, possible_matches, tc.name); + } } -fn compare_export(exporter: &PrometheusExporter, mut expected: Vec<&'static str>) { +fn gather_and_compare_multi( + registry: prometheus::Registry, + expected: Vec, + name: &'static str, +) { let mut output = Vec::new(); let encoder = TextEncoder::new(); - let metric_families = exporter.registry().gather(); + let metric_families = registry.gather(); encoder.encode(&metric_families, &mut output).unwrap(); let output_string = String::from_utf8(output).unwrap(); - let mut metrics_only = output_string - .split_terminator('\n') - .filter(|line| !line.starts_with('#') && !line.is_empty()) - .collect::>(); - - metrics_only.sort_unstable(); - expected.sort_unstable(); - - assert_eq!(expected.join("\n"), metrics_only.join("\n")) + assert!( + expected.contains(&output_string), + "mismatched output in {name}" + ) } diff -Nru temporalio-1.3.0/vendor/opentelemetry-proto/build.rs temporalio-1.3.0/vendor/opentelemetry-proto/build.rs --- temporalio-1.3.0/vendor/opentelemetry-proto/build.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-proto/build.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,30 +0,0 @@ -use std::io::Error; - -// Grpc related files used by tonic are generated here. Those files re-generate for each build -// so it's up to date. -// -// Grpc related files used by grpcio are maintained at src/proto/grpcio. tests/grpc_build.rs makes -// sure they are up to date. - -fn main() -> Result<(), Error> { - #[cfg(feature = "gen-tonic")] - tonic_build::configure() - .build_server(cfg!(feature = "build-server")) - .build_client(cfg!(feature = "build-client")) - .compile( - &[ - "src/proto/opentelemetry-proto/opentelemetry/proto/common/v1/common.proto", - "src/proto/opentelemetry-proto/opentelemetry/proto/resource/v1/resource.proto", - "src/proto/opentelemetry-proto/opentelemetry/proto/trace/v1/trace.proto", - "src/proto/opentelemetry-proto/opentelemetry/proto/trace/v1/trace_config.proto", - "src/proto/opentelemetry-proto/opentelemetry/proto/collector/trace/v1/trace_service.proto", - "src/proto/opentelemetry-proto/opentelemetry/proto/metrics/v1/metrics.proto", - "src/proto/opentelemetry-proto/opentelemetry/proto/collector/metrics/v1/metrics_service.proto", - "src/proto/opentelemetry-proto/opentelemetry/proto/logs/v1/logs.proto", - "src/proto/opentelemetry-proto/opentelemetry/proto/collector/logs/v1/logs_service.proto", - ], - &["src/proto/opentelemetry-proto"], - )?; - - Ok(()) -} diff -Nru temporalio-1.3.0/vendor/opentelemetry-proto/.cargo-checksum.json temporalio-1.3.0/vendor/opentelemetry-proto/.cargo-checksum.json --- temporalio-1.3.0/vendor/opentelemetry-proto/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-proto/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"CHANGELOG.md":"26251715d75d477dfb4caddaf1d23c3448757740c68f8fed03ba83c3cde16023","CODEOWNERS":"517b0ec97b47f714513c6a611f30830a9c5b95b530c2dda813870bf0100f6979","Cargo.toml":"2d5a0408c162878b5fdce439a094ec6dbb39a998b065823f6e5d48689628d63b","LICENSE":"c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4","README.md":"7b490a030f56e1e4d2881abec52f3f91814de7c2130f3c88261cff33e552d511","build.rs":"4d1ef3a598a2dc6d99a9e6f9e374be9fe7b200e967cf6d25d2498ca74f2994a9","src/lib.rs":"33fa1f0d00269b2ae4a25e8245419c3e46b3839563f6aca19d37927768bef0d2","src/proto.rs":"f8318d5f2e9b809670f28ee71babcac9f8c92659fb273ed4da737cf5f998c98d","src/proto/grpcio/common.rs":"12abd99d23c2d1c5f61b5efec54c30083885e4fb3dbd1755781f0152eb7e7e21","src/proto/grpcio/metrics.rs":"3b2debedd68373cb97a71d7e9d2f08f70e59ed63bc0026c0627d74823276f8c5","src/proto/grpcio/metrics_service.rs":"4f26a8bab61498e3556a38fd57e03a8a5facfd56fd2bfd9621c479e69266c163","src/proto/grpcio/metrics_service_grpc.rs":"016df13b9e9c1743b48fe06d6dbbc0bdc235e96ae563165d66951fd4358692ea","src/proto/grpcio/resource.rs":"532f8552b5f160e87c0e10833f7f665912eefbb50b4bf660ad9793b24585a946","src/proto/grpcio/trace.rs":"4766e11518712e98df582fc0be185f3b5f09df9667ffaf3fd911e317ab52250c","src/proto/grpcio/trace_config.rs":"28be3321e131c7793112150f70895c3d063287981d9dad06b4ba33ea4976bd23","src/proto/grpcio/trace_service.rs":"8ce05baa8c1143cb2e77c9e4a03ab40a58128af53a3957847397e4d8bb984284","src/proto/grpcio/trace_service_grpc.rs":"7cb2163af82fdcd3ea4beacf7d977bd0d328f2fdbe8c77f5c60893bf40b13bf5","src/proto/grpcio/tracez.rs":"0d2b7656c6b22aa4206894feac391c15aaa8c2d51620d4875ae3b7ff540ab5e4","src/proto/opentelemetry-proto/CHANGELOG.md":"545b6e2da3895625f5377bab9c85b2134ecd8f8da9ce91e4b7fefb164f9892ac","src/proto/opentelemetry-proto/CONTRIBUTING.md":"0d01d6c26fa80ca14fc00062ba427bab2924f6a54c52beb03dedf485a3b20116","src/proto/opentelemetry-proto/LICENSE":"c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4","src/proto/opentelemetry-proto/Makefile":"4abac1b91c66d65537e8c6060f7fb8652b05c3133d15dbd56800703a7f79de05","src/proto/opentelemetry-proto/README.md":"f37f6aca94c7064524f77a5e37078f9a89f891f45fc47354f7c1a2855ed38a9b","src/proto/opentelemetry-proto/RELEASING.md":"e9da09470d009634df19acf1b24b41cb76269e70b4ca6704b273ba103dd16b68","src/proto/opentelemetry-proto/opentelemetry/proto/collector/README.md":"5acdcbbf7c66ec155a42d554d92c1abb975e4a59c13c6915cca9f797741940e0","src/proto/opentelemetry-proto/opentelemetry/proto/collector/logs/v1/logs_service.proto":"01c04ca24f8e19a421b88fc1207f74b1d1ad62c8718da97a0d1756065bcaba76","src/proto/opentelemetry-proto/opentelemetry/proto/collector/logs/v1/logs_service_http.yaml":"3603a173aedcba8311b55fe59f12af6b66f0b50a443ee8987f2a10868565ded9","src/proto/opentelemetry-proto/opentelemetry/proto/collector/metrics/v1/metrics_service.proto":"8848d5099126a101e7fe08e664281ec3fff48ab1d677e1fa7f78659dbfef66ca","src/proto/opentelemetry-proto/opentelemetry/proto/collector/metrics/v1/metrics_service_http.yaml":"9cc04d90ee9f767559e68bf2d91b9c3d79d9d9a238f61ad43516c1d645f24fe6","src/proto/opentelemetry-proto/opentelemetry/proto/collector/trace/v1/trace_service.proto":"93bf485272d0785e3c4f5de3fcea8c60898faac604497fa1dd062fadea14a448","src/proto/opentelemetry-proto/opentelemetry/proto/collector/trace/v1/trace_service_http.yaml":"e5bc99d549ec807e9a4a57ec41ace041dccc4dcfc7a7fc2d8c0973692f547abf","src/proto/opentelemetry-proto/opentelemetry/proto/common/v1/common.proto":"8eac29b7b1c7823b2a02200aa17f0a984e5454898e14509c789d6ec0b4287e81","src/proto/opentelemetry-proto/opentelemetry/proto/logs/v1/logs.proto":"b09c729b7f5624a35814538dca904e78a37769824076a680c52bfdde912dd6ba","src/proto/opentelemetry-proto/opentelemetry/proto/metrics/v1/metrics.proto":"76a766a4f5bb743d9eb21d6d3369290da0db1c22f9980978f74d7f6c8beff728","src/proto/opentelemetry-proto/opentelemetry/proto/resource/v1/resource.proto":"b8ea46501d3d4ba7057a1257e363eb8a335d17d7595c157802ffb0bb26c85796","src/proto/opentelemetry-proto/opentelemetry/proto/trace/v1/trace.proto":"f5e3f930b0bb8d7c6ba6dd7ea5f7aa49221c8c31f17453bb33c69dbf018c1956","src/proto/opentelemetry-proto/opentelemetry/proto/trace/v1/trace_config.proto":"7d4328edad6914128acd69e1ec19e62e6d6bca1a31636cd89b494c75c9b6eef5","src/proto/tracez.proto":"e59c2d002f696fdbb4849c18eab21b187264aa3de1f3389f0d33f01d80ad8f24","src/transform/common.rs":"f33bb258e606bc55f0c290b158fee0b728ae906c6de61b4f6f001051326d77ab","src/transform/metrics.rs":"b824b5d276e2ed88c0008badf31f52e21e3c1918bba19a3b3bdb4f09d64b06bd","src/transform/mod.rs":"5654c04251142d03f87cdc656f51c2681020df696acdd0b6c6dc0d1fe60f7324","src/transform/traces.rs":"9c051e63aa5f388647d97b56176a4b040629b1d51c1ba6d81bafec161feb9788","src/transform/tracez.rs":"d439d4d02849d266d3586885d02d16273010f8d61b0f93a186926887c30d5947","tests/grpc_build.rs":"cac0d90234eb900162295dc7102c08e6780a7b4b4ead3f6ef1303ab99c74ff40"},"package":"d61a2f56df5574508dd86aaca016c917489e589ece4141df1b5e349af8d66c28"} \ No newline at end of file +{"files":{"CHANGELOG.md":"8288336d8f4c042cd6c982a34f07f1e97f17bd2c2637d8fa01aa0dc1f7fdf111","CODEOWNERS":"517b0ec97b47f714513c6a611f30830a9c5b95b530c2dda813870bf0100f6979","Cargo.toml":"b9164feea6198a39ce01270ec2efcf5699a054ae391dd4ea3fdcdaae7945eb57","LICENSE":"208a3f5bae3355bd4f3f45626d1ea4518b253d618ee2896983436075c4375098","README.md":"7b490a030f56e1e4d2881abec52f3f91814de7c2130f3c88261cff33e552d511","src/lib.rs":"c61165d34625fa4f3ad0e127f0b4f64887478353a738f2f55aa31b34a30a391c","src/proto.rs":"ba3c6b45d5fc81df1bba35ec20001512aeb3b2d6ec951dce77ea0a64b89629a6","src/proto/grpcio/common.rs":"7c716427187d838a26946b8b18af5c0d012d33fcb05e1fe69c55eb435647aa79","src/proto/grpcio/logs.rs":"56a24f25d927eb1ae3d0bb0ef5a3705ce666049ba35e03e3550c50fd3fcd1c1b","src/proto/grpcio/logs_service.rs":"ccabd35b19e8fe8ce0cbe72a81c71476c4a391f34470265fcb9f1f984df931a4","src/proto/grpcio/logs_service_grpc.rs":"ec400effab132df0a5d07ade79445af8daf6053514dc579e57c78272551d1b8d","src/proto/grpcio/metrics.rs":"986a948cf184fbde5528aa69cb3955e92228c1716095bd4097a48bb1f3f78ee5","src/proto/grpcio/metrics_service.rs":"ba1d588419d737a2db0fd673ddd845e30aa9abf9a028234646e256521d382945","src/proto/grpcio/metrics_service_grpc.rs":"016df13b9e9c1743b48fe06d6dbbc0bdc235e96ae563165d66951fd4358692ea","src/proto/grpcio/resource.rs":"cb6ccc38eb3eb3620839dea3c03f38a5ef82513f9ec70df7bb9cecadb8b57503","src/proto/grpcio/trace.rs":"4cdc8cc2b581f61d96dfcb10e07e288448fe09de7cf47107028dbf97394fa028","src/proto/grpcio/trace_service.rs":"a43bbd2dbf621dcd2d711ae78e9eae7cf3f1c8ca57cf54db5aecf16d6f7b00cf","src/proto/grpcio/trace_service_grpc.rs":"7cb2163af82fdcd3ea4beacf7d977bd0d328f2fdbe8c77f5c60893bf40b13bf5","src/proto/grpcio/tracez.rs":"b16487cd1c2d83ce95deb763d17632fd1472335404f9aaf14b7d50d2d90f03b0","src/proto/opentelemetry-proto/CHANGELOG.md":"0f17bae225996c485331ba23a871b0e53cb468ebb3f89fc53619cffe59456e05","src/proto/opentelemetry-proto/CONTRIBUTING.md":"0d01d6c26fa80ca14fc00062ba427bab2924f6a54c52beb03dedf485a3b20116","src/proto/opentelemetry-proto/LICENSE":"c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4","src/proto/opentelemetry-proto/Makefile":"0f219088f10eb24061af514fe2e9bc77a7aae01960a154c4a6cf46ab2dc29d75","src/proto/opentelemetry-proto/README.md":"0d4d390729be77418b14e12d61252a46a1bc401ebf5b3af4527f5d1741620a60","src/proto/opentelemetry-proto/RELEASING.md":"ce9fc333601db6a6e02aeac8e80a1920a8ffb93f378492a4b1c91219d734a1f6","src/proto/opentelemetry-proto/buf.yaml":"555076d9ca363c6fbe91cb64bc21da30aeea2f1e3b30baca304595b6e1654c8d","src/proto/opentelemetry-proto/docs/README.md":"fcc0b5ef8dcccc6bd25415b59ff26740376a8c41c54269ce512b708b8aa12494","src/proto/opentelemetry-proto/docs/design-goals.md":"5a0899d88ba0dec8ff9e004bacb704d9afe42516fb5740674d38caefcf984b37","src/proto/opentelemetry-proto/docs/img/otlp-client-server.png":"27b8e50b1e7098f91640f4459efe30cfa138fb30fbf0e887c3efab2dd7d13ca0","src/proto/opentelemetry-proto/docs/img/otlp-concurrent.png":"cfe11f5da2d687f03449d7d12dc09d869065b6f7983c73fa9f8a923b55de1638","src/proto/opentelemetry-proto/docs/img/otlp-multi-destination.png":"d8cd5940cc9dafcbe91eb3795f9ae3ec0351d4c1848e5be2ff0e715246ce144c","src/proto/opentelemetry-proto/docs/img/otlp-request-response.png":"c7904b271217572bc40526e3a70f574b77a3b76fe13a8883638386ae43893589","src/proto/opentelemetry-proto/docs/img/otlp-sequential.png":"e403da3aada80b3393c8eebb6cee6a0fb9b0bce97cd0c03916471b9180e577cc","src/proto/opentelemetry-proto/docs/requirements.md":"0b1f7219ecaf41b9e4f4899b418b11b46995fe232088f4a0431fae0ed8d24ea8","src/proto/opentelemetry-proto/docs/specification.md":"e641316634daef7c42303e0eab77f8134ac7ab65151a317406b07a55ff6147b5","src/proto/opentelemetry-proto/examples/README.md":"594fa1ed5d1bc78904549533f5c783ac4e0c5f0de87a77ce97e7fb5a90fb4a0c","src/proto/opentelemetry-proto/examples/logs.json":"d7b2e147177df9be563ee57ce0c686b5c3327c93976048cd9420837c8d4280f8","src/proto/opentelemetry-proto/examples/metrics.json":"9f3fc3d0b12e666c068633167c0b6519d965b4da38d8198f77b7d4e243606bef","src/proto/opentelemetry-proto/examples/trace.json":"a3e97a92221adec01cc954bf8f538ccc10e47612e8c287bcd1d4dca406b520ef","src/proto/opentelemetry-proto/opentelemetry/proto/collector/README.md":"8fd9bb7a611ae64420cb7a8074001f710afc90605f6ee49c1e1afa3533b02cc1","src/proto/opentelemetry-proto/opentelemetry/proto/collector/logs/v1/logs_service.proto":"9f562fbabf00e0460bfe2004be9f9fd3ed02119bb92b82b5ec835ff983f86898","src/proto/opentelemetry-proto/opentelemetry/proto/collector/logs/v1/logs_service_http.yaml":"3603a173aedcba8311b55fe59f12af6b66f0b50a443ee8987f2a10868565ded9","src/proto/opentelemetry-proto/opentelemetry/proto/collector/metrics/v1/metrics_service.proto":"df560ad452c3c48c62c67590c4a0d968d4fddd0f404c3d9c189bafd1fc6bb724","src/proto/opentelemetry-proto/opentelemetry/proto/collector/metrics/v1/metrics_service_http.yaml":"9cc04d90ee9f767559e68bf2d91b9c3d79d9d9a238f61ad43516c1d645f24fe6","src/proto/opentelemetry-proto/opentelemetry/proto/collector/trace/v1/trace_service.proto":"8b76d311c75f6eaee985dac358dd50ea98f77ec06a8022e299dcdb5c8c517a7a","src/proto/opentelemetry-proto/opentelemetry/proto/collector/trace/v1/trace_service_http.yaml":"a0580f68f90a7086f211033f6374d5ba91eca900bc237721d350301e5308f9dd","src/proto/opentelemetry-proto/opentelemetry/proto/common/v1/common.proto":"6a75b9ff79bb37e502a16fd739294a29a4a6608eb07416f2187d05d7f3745e8e","src/proto/opentelemetry-proto/opentelemetry/proto/logs/v1/logs.proto":"8679b83136235942888819f3c0db3f726fc5bebc7811d3e359f88d00edb22c54","src/proto/opentelemetry-proto/opentelemetry/proto/metrics/v1/metrics.proto":"ca093f0ae5ec85b54656ce0070e67d405c6df5cfcb885d1ad7868a4888feb003","src/proto/opentelemetry-proto/opentelemetry/proto/resource/v1/resource.proto":"eaaed42d4912ead1405d6bc16314e2b20f031f401e7fec70199c52f9311a3d86","src/proto/opentelemetry-proto/opentelemetry/proto/trace/v1/trace.proto":"5bce2191ac173e8d09342a95aa3013604710256b1588e2883575224865f3eac8","src/proto/opentelemetry-proto/package-lock.json":"8f0bc83df2234bb766822bfab404c8e39f3c70dedad18deef8e159dc04f0400c","src/proto/opentelemetry-proto/package.json":"9e6b0b02cd142bd20362d6c622c19bce77eff6daf80f5435bf60e30bca9d0aee","src/proto/tonic/opentelemetry.proto.collector.logs.v1.rs":"921da1348d9d01a24231b215f743f7aed3d39588f6cabe2aa355ee53ff4e65ec","src/proto/tonic/opentelemetry.proto.collector.metrics.v1.rs":"fce13dcec7261e7a4f47a4fe60a6fdd615c679b69b86eac6b4e7f277e640cb44","src/proto/tonic/opentelemetry.proto.collector.trace.v1.rs":"fd748da45c04e67cbc8815494264a852af53268bcc5aad46c553ee724295a8f2","src/proto/tonic/opentelemetry.proto.common.v1.rs":"29fc6101e9d8fda6c7d7d9e5de4851401c569a417050126f8de561c3ebaeb833","src/proto/tonic/opentelemetry.proto.logs.v1.rs":"3f7de7a362b0ec262d798d5ddf1a4d5c727ac61b4e80df5388010bbd2c0b4e56","src/proto/tonic/opentelemetry.proto.metrics.v1.rs":"42625d1fa6db58a47277c9039fcb92bc9e46bcc5fe5ff4f095021f68dee64813","src/proto/tonic/opentelemetry.proto.resource.v1.rs":"df4910ecd7c03ecd7c1e83e0b8826eab4c5a404edecd7b15e2e970fe0a319b48","src/proto/tonic/opentelemetry.proto.trace.v1.rs":"b2f69e706254b1766e8663c7e96c92dfe9a1347aa3a7af84a5d35dee1bbfc6b3","src/proto/tracez.proto":"e83d3770312697627203c53d95300d92d698b93e7a180aaf94d75921f21c47e8","src/transform/common.rs":"34423c517d420abe269a333815c49cb81df3b2b0d737c857b882cebc2c659e00","src/transform/logs.rs":"c2978d3e8ad4168a22b33f2b57dc8769bafb57f7afddb9ec3b0e32c5d1d37604","src/transform/metrics.rs":"91b492bc35c7accf5aa43eaafcf3698e2bd54cf5e9168f9848b47f0255f57aff","src/transform/mod.rs":"462a2483ad67c4403f546d7f6809e91cf668c51c4bac0dd9d68a69949cf9f619","src/transform/traces.rs":"711dadb418ddb1dc124625c93ef3bd183f79022b0abc1275303b0a671ed47086","src/transform/tracez.rs":"13ad3a350f2cacba351f13a43c60869e6f08bee2deb7101b216fdee242b3ee7f","tests/grpc_build.rs":"3e74ca2ec3011fea42ed799b21e57bb5be19771d3d1f42204f25e6a8606ceb16"},"package":"b1e3f814aa9f8c905d0ee4bde026afd3b2577a97c10e1699912e3e44f0c4cbeb"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/opentelemetry-proto/Cargo.toml temporalio-1.3.0/vendor/opentelemetry-proto/Cargo.toml --- temporalio-1.3.0/vendor/opentelemetry-proto/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-proto/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -11,13 +11,11 @@ [package] edition = "2021" -rust-version = "1.56" +rust-version = "1.60" name = "opentelemetry-proto" -version = "0.1.0" -authors = ["OpenTelemetry Authors "] -build = "build.rs" +version = "0.3.0" autotests = false -description = "Protobuf generated files and transmationes" +description = "Protobuf generated files and transformations." homepage = "https://github.com/open-telemetry/opentelemetry-rust/tree/main/opentelemetry-proto" readme = "README.md" keywords = [ @@ -34,6 +32,7 @@ ] license = "Apache-2.0" repository = "https://github.com/open-telemetry/opentelemetry-rust/tree/main/opentelemetry-proto" +resolver = "1" [lib] doctest = false @@ -41,30 +40,32 @@ [[test]] name = "grpc_build" path = "tests/grpc_build.rs" -required-features = [ - "with-serde", - "gen-protoc", -] [dependencies.futures] version = "0.3" features = ["std"] -default-features = false - -[dependencies.futures-util] -version = "0.3" -features = ["std"] +optional = true default-features = false [dependencies.grpcio] -version = "0.9" +version = "0.12" optional = true -[dependencies.opentelemetry] -version = "0.18" +[dependencies.opentelemetry_api] +version = "0.20" features = [ "trace", "metrics", + "logs", +] +default-features = false + +[dependencies.opentelemetry_sdk] +version = "0.20" +features = [ + "trace", + "metrics", + "logs", ] default-features = false @@ -80,13 +81,17 @@ version = "1.0" optional = true -[dependencies.serde_json] -version = "1.0" -optional = true - [dependencies.tonic] -version = "0.8.0" +version = "0.9.0" +features = [ + "codegen", + "prost", +] optional = true +default-features = false + +[dev-dependencies.prost-build] +version = "0.11.1" [dev-dependencies.protobuf-codegen] version = "2.16" @@ -94,17 +99,13 @@ [dev-dependencies.protoc-grpcio] version = "3.0" -[build-dependencies.prost-build] -version = "0.11.1" -optional = true +[dev-dependencies.tempfile] +version = "3.3.0" -[build-dependencies.tonic-build] -version = "0.8.0" -optional = true +[dev-dependencies.tonic-build] +version = "0.9.0" [features] -build-client = [] -build-server = [] default = [] full = [ "gen-tonic", @@ -113,17 +114,19 @@ "logs", "metrics", "zpages", - "build-server", - "build-client", "with-serde", ] gen-protoc = [ "grpcio", "protobuf", + "futures", ] gen-tonic = [ + "gen-tonic-messages", + "tonic/transport", +] +gen-tonic-messages = [ "tonic", - "tonic-build", "prost", ] logs = [] @@ -132,6 +135,5 @@ with-serde = [ "protobuf/with-serde", "serde", - "serde_json", ] zpages = ["traces"] diff -Nru temporalio-1.3.0/vendor/opentelemetry-proto/CHANGELOG.md temporalio-1.3.0/vendor/opentelemetry-proto/CHANGELOG.md --- temporalio-1.3.0/vendor/opentelemetry-proto/CHANGELOG.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-proto/CHANGELOG.md 2023-10-30 19:40:00.000000000 +0000 @@ -1,5 +1,20 @@ # Changelog +## v0.3.0 + +### Updated + +- Update protobuf definitions to v1.0.0 #1154 +- Update to opentelemetry-api v0.20.0 + +## v0.2.0 +### Changed +- Update to opentelemetry v0.19.0. +- Remove build script and generate files using unit tests [#881](https://github.com/open-telemetry/opentelemetry-rust/pull/881). +- Bump MSRV to 1.57 [#953](https://github.com/open-telemetry/opentelemetry-rust/pull/953). +- Update dependencies and bump MSRV to 1.60 [#969](https://github.com/open-telemetry/opentelemetry-rust/pull/969). +- Bump to use the v0.19.0 protobuf definitions. [#989](https://github.com/open-telemetry/opentelemetry-rust/pull/989). + ## v0.1.0 Initial crate release. diff -Nru temporalio-1.3.0/vendor/opentelemetry-proto/LICENSE temporalio-1.3.0/vendor/opentelemetry-proto/LICENSE --- temporalio-1.3.0/vendor/opentelemetry-proto/LICENSE 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-proto/LICENSE 2023-10-30 19:40:00.000000000 +0000 @@ -186,7 +186,7 @@ same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright [yyyy] [name of copyright owner] + Copyright 2023 The OpenTelemetry Authors Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff -Nru temporalio-1.3.0/vendor/opentelemetry-proto/src/lib.rs temporalio-1.3.0/vendor/opentelemetry-proto/src/lib.rs --- temporalio-1.3.0/vendor/opentelemetry-proto/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-proto/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,4 +1,4 @@ -#![cfg_attr(doc, feature(doc_auto_cfg))] +#![cfg_attr(docsrs, feature(doc_auto_cfg))] //! This crate contains generated files from [opentelemetry-proto](https://github.com/open-telemetry/opentelemetry-proto) //! repository and transformation between types from generated files and types defined in [opentelemetry](https://github.com/open-telemetry/opentelemetry-rust/tree/main/opentelemetry) //! @@ -21,8 +21,6 @@ //! - `gen-protoc`: generate rs files using [grpcio](https://github.com/tikv/grpc-rs). //! //! ## Additional configurations -//! - `build-server`: build grpc service servers if enabled. Only applicable to `gen-tonic`. -//! - `build-client`: build grpc service clients if enabled. Only applicable to `gen-tonic`. //! - `with-serde`: add serde annotations to generated types. Only applicable to `gen-protoc`. //! //! ## Misc @@ -40,7 +38,7 @@ #[cfg(feature = "gen-protoc")] pub use proto::grpcio; -#[cfg(feature = "gen-tonic")] +#[cfg(feature = "gen-tonic-messages")] pub use proto::tonic; mod transform; diff -Nru temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/grpcio/common.rs temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/grpcio/common.rs --- temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/grpcio/common.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/grpcio/common.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,4 +1,4 @@ -// This file is generated by rust-protobuf 2.27.1. Do not edit +// This file is generated by rust-protobuf 2.28.0. Do not edit // @generated // https://github.com/rust-lang/rust-clippy/issues/702 @@ -21,7 +21,7 @@ /// Generated files are compatible only with the same version /// of protobuf runtime. -// const _PROTOBUF_VERSION_CHECK: () = ::protobuf::VERSION_2_27_1; +// const _PROTOBUF_VERSION_CHECK: () = ::protobuf::VERSION_2_28_0; #[derive(PartialEq,Clone,Default)] #[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))] @@ -1136,10 +1136,12 @@ #[derive(PartialEq,Clone,Default)] #[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))] -pub struct InstrumentationLibrary { +pub struct InstrumentationScope { // message fields pub name: ::std::string::String, pub version: ::std::string::String, + pub attributes: ::protobuf::RepeatedField, + pub dropped_attributes_count: u32, // special fields #[cfg_attr(feature = "with-serde", serde(skip))] pub unknown_fields: ::protobuf::UnknownFields, @@ -1147,14 +1149,14 @@ pub cached_size: ::protobuf::CachedSize, } -impl<'a> ::std::default::Default for &'a InstrumentationLibrary { - fn default() -> &'a InstrumentationLibrary { - ::default_instance() +impl<'a> ::std::default::Default for &'a InstrumentationScope { + fn default() -> &'a InstrumentationScope { + ::default_instance() } } -impl InstrumentationLibrary { - pub fn new() -> InstrumentationLibrary { +impl InstrumentationScope { + pub fn new() -> InstrumentationScope { ::std::default::Default::default() } @@ -1209,10 +1211,55 @@ pub fn take_version(&mut self) -> ::std::string::String { ::std::mem::replace(&mut self.version, ::std::string::String::new()) } + + // repeated .opentelemetry.proto.common.v1.KeyValue attributes = 3; + + + pub fn get_attributes(&self) -> &[KeyValue] { + &self.attributes + } + pub fn clear_attributes(&mut self) { + self.attributes.clear(); + } + + // Param is passed by value, moved + pub fn set_attributes(&mut self, v: ::protobuf::RepeatedField) { + self.attributes = v; + } + + // Mutable pointer to the field. + pub fn mut_attributes(&mut self) -> &mut ::protobuf::RepeatedField { + &mut self.attributes + } + + // Take field + pub fn take_attributes(&mut self) -> ::protobuf::RepeatedField { + ::std::mem::replace(&mut self.attributes, ::protobuf::RepeatedField::new()) + } + + // uint32 dropped_attributes_count = 4; + + + pub fn get_dropped_attributes_count(&self) -> u32 { + self.dropped_attributes_count + } + pub fn clear_dropped_attributes_count(&mut self) { + self.dropped_attributes_count = 0; + } + + // Param is passed by value, moved + pub fn set_dropped_attributes_count(&mut self, v: u32) { + self.dropped_attributes_count = v; + } } -impl ::protobuf::Message for InstrumentationLibrary { +impl ::protobuf::Message for InstrumentationScope { fn is_initialized(&self) -> bool { + for v in &self.attributes { + if !v.is_initialized() { + return false; + } + }; true } @@ -1226,6 +1273,16 @@ 2 => { ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.version)?; }, + 3 => { + ::protobuf::rt::read_repeated_message_into(wire_type, is, &mut self.attributes)?; + }, + 4 => { + if wire_type != ::protobuf::wire_format::WireTypeVarint { + return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type)); + } + let tmp = is.read_uint32()?; + self.dropped_attributes_count = tmp; + }, _ => { ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?; }, @@ -1244,6 +1301,13 @@ if !self.version.is_empty() { my_size += ::protobuf::rt::string_size(2, &self.version); } + for value in &self.attributes { + let len = value.compute_size(); + my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len; + }; + if self.dropped_attributes_count != 0 { + my_size += ::protobuf::rt::value_size(4, self.dropped_attributes_count, ::protobuf::wire_format::WireTypeVarint); + } my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields()); self.cached_size.set(my_size); my_size @@ -1256,6 +1320,14 @@ if !self.version.is_empty() { os.write_string(2, &self.version)?; } + for v in &self.attributes { + os.write_tag(3, ::protobuf::wire_format::WireTypeLengthDelimited)?; + os.write_raw_varint32(v.get_cached_size())?; + v.write_to_with_cached_sizes(os)?; + }; + if self.dropped_attributes_count != 0 { + os.write_uint32(4, self.dropped_attributes_count)?; + } os.write_unknown_fields(self.get_unknown_fields())?; ::std::result::Result::Ok(()) } @@ -1286,8 +1358,8 @@ Self::descriptor_static() } - fn new() -> InstrumentationLibrary { - InstrumentationLibrary::new() + fn new() -> InstrumentationScope { + InstrumentationScope::new() } fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { @@ -1296,43 +1368,55 @@ let mut fields = ::std::vec::Vec::new(); fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( "name", - |m: &InstrumentationLibrary| { &m.name }, - |m: &mut InstrumentationLibrary| { &mut m.name }, + |m: &InstrumentationScope| { &m.name }, + |m: &mut InstrumentationScope| { &mut m.name }, )); fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( "version", - |m: &InstrumentationLibrary| { &m.version }, - |m: &mut InstrumentationLibrary| { &mut m.version }, + |m: &InstrumentationScope| { &m.version }, + |m: &mut InstrumentationScope| { &mut m.version }, + )); + fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage>( + "attributes", + |m: &InstrumentationScope| { &m.attributes }, + |m: &mut InstrumentationScope| { &mut m.attributes }, + )); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeUint32>( + "dropped_attributes_count", + |m: &InstrumentationScope| { &m.dropped_attributes_count }, + |m: &mut InstrumentationScope| { &mut m.dropped_attributes_count }, )); - ::protobuf::reflect::MessageDescriptor::new_pb_name::( - "InstrumentationLibrary", + ::protobuf::reflect::MessageDescriptor::new_pb_name::( + "InstrumentationScope", fields, file_descriptor_proto() ) }) } - fn default_instance() -> &'static InstrumentationLibrary { - static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; - instance.get(InstrumentationLibrary::new) + fn default_instance() -> &'static InstrumentationScope { + static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; + instance.get(InstrumentationScope::new) } } -impl ::protobuf::Clear for InstrumentationLibrary { +impl ::protobuf::Clear for InstrumentationScope { fn clear(&mut self) { self.name.clear(); self.version.clear(); + self.attributes.clear(); + self.dropped_attributes_count = 0; self.unknown_fields.clear(); } } -impl ::std::fmt::Debug for InstrumentationLibrary { +impl ::std::fmt::Debug for InstrumentationScope { fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { ::protobuf::text_format::fmt(self, f) } } -impl ::protobuf::reflect::ProtobufValue for InstrumentationLibrary { +impl ::protobuf::reflect::ProtobufValue for InstrumentationScope { fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { ::protobuf::reflect::ReflectValueRef::Message(self) } @@ -1353,10 +1437,13 @@ \x20\x03(\x0b2'.opentelemetry.proto.common.v1.KeyValueR\x06values\"[\n\ \x08KeyValue\x12\x10\n\x03key\x18\x01\x20\x01(\tR\x03key\x12=\n\x05value\ \x18\x02\x20\x01(\x0b2'.opentelemetry.proto.common.v1.AnyValueR\x05value\ - \"F\n\x16InstrumentationLibrary\x12\x12\n\x04name\x18\x01\x20\x01(\tR\ - \x04name\x12\x18\n\x07version\x18\x02\x20\x01(\tR\x07versionB[\n\x20io.o\ - pentelemetry.proto.common.v1B\x0bCommonProtoP\x01Z(go.opentelemetry.io/p\ - roto/otlp/common/v1b\x06proto3\ + \"\xc7\x01\n\x14InstrumentationScope\x12\x12\n\x04name\x18\x01\x20\x01(\ + \tR\x04name\x12\x18\n\x07version\x18\x02\x20\x01(\tR\x07version\x12G\n\n\ + attributes\x18\x03\x20\x03(\x0b2'.opentelemetry.proto.common.v1.KeyValue\ + R\nattributes\x128\n\x18dropped_attributes_count\x18\x04\x20\x01(\rR\x16\ + droppedAttributesCountB{\n\x20io.opentelemetry.proto.common.v1B\x0bCommo\ + nProtoP\x01Z(go.opentelemetry.io/proto/otlp/common/v1\xaa\x02\x1dOpenTel\ + emetry.Proto.Common.V1b\x06proto3\ "; static file_descriptor_proto_lazy: ::protobuf::rt::LazyV2<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::LazyV2::INIT; diff -Nru temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/grpcio/logs.rs temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/grpcio/logs.rs --- temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/grpcio/logs.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/grpcio/logs.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,1481 @@ +// This file is generated by rust-protobuf 2.28.0. Do not edit +// @generated + +// https://github.com/rust-lang/rust-clippy/issues/702 +#![allow(unknown_lints)] +#![allow(clippy::all)] + +#![allow(unused_attributes)] +#![cfg_attr(rustfmt, rustfmt::skip)] + +#![allow(box_pointers)] +#![allow(dead_code)] +#![allow(missing_docs)] +#![allow(non_camel_case_types)] +#![allow(non_snake_case)] +#![allow(non_upper_case_globals)] +#![allow(trivial_casts)] +#![allow(unused_imports)] +#![allow(unused_results)] +//! Generated file from `opentelemetry/proto/logs/v1/logs.proto` + +/// Generated files are compatible only with the same version +/// of protobuf runtime. +// const _PROTOBUF_VERSION_CHECK: () = ::protobuf::VERSION_2_28_0; + +#[derive(PartialEq,Clone,Default)] +#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))] +pub struct LogsData { + // message fields + pub resource_logs: ::protobuf::RepeatedField, + // special fields + #[cfg_attr(feature = "with-serde", serde(skip))] + pub unknown_fields: ::protobuf::UnknownFields, + #[cfg_attr(feature = "with-serde", serde(skip))] + pub cached_size: ::protobuf::CachedSize, +} + +impl<'a> ::std::default::Default for &'a LogsData { + fn default() -> &'a LogsData { + ::default_instance() + } +} + +impl LogsData { + pub fn new() -> LogsData { + ::std::default::Default::default() + } + + // repeated .opentelemetry.proto.logs.v1.ResourceLogs resource_logs = 1; + + + pub fn get_resource_logs(&self) -> &[ResourceLogs] { + &self.resource_logs + } + pub fn clear_resource_logs(&mut self) { + self.resource_logs.clear(); + } + + // Param is passed by value, moved + pub fn set_resource_logs(&mut self, v: ::protobuf::RepeatedField) { + self.resource_logs = v; + } + + // Mutable pointer to the field. + pub fn mut_resource_logs(&mut self) -> &mut ::protobuf::RepeatedField { + &mut self.resource_logs + } + + // Take field + pub fn take_resource_logs(&mut self) -> ::protobuf::RepeatedField { + ::std::mem::replace(&mut self.resource_logs, ::protobuf::RepeatedField::new()) + } +} + +impl ::protobuf::Message for LogsData { + fn is_initialized(&self) -> bool { + for v in &self.resource_logs { + if !v.is_initialized() { + return false; + } + }; + true + } + + fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> { + while !is.eof()? { + let (field_number, wire_type) = is.read_tag_unpack()?; + match field_number { + 1 => { + ::protobuf::rt::read_repeated_message_into(wire_type, is, &mut self.resource_logs)?; + }, + _ => { + ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?; + }, + }; + } + ::std::result::Result::Ok(()) + } + + // Compute sizes of nested messages + #[allow(unused_variables)] + fn compute_size(&self) -> u32 { + let mut my_size = 0; + for value in &self.resource_logs { + let len = value.compute_size(); + my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len; + }; + my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields()); + self.cached_size.set(my_size); + my_size + } + + fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> { + for v in &self.resource_logs { + os.write_tag(1, ::protobuf::wire_format::WireTypeLengthDelimited)?; + os.write_raw_varint32(v.get_cached_size())?; + v.write_to_with_cached_sizes(os)?; + }; + os.write_unknown_fields(self.get_unknown_fields())?; + ::std::result::Result::Ok(()) + } + + fn get_cached_size(&self) -> u32 { + self.cached_size.get() + } + + fn get_unknown_fields(&self) -> &::protobuf::UnknownFields { + &self.unknown_fields + } + + fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields { + &mut self.unknown_fields + } + + fn as_any(&self) -> &dyn (::std::any::Any) { + self as &dyn (::std::any::Any) + } + fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) { + self as &mut dyn (::std::any::Any) + } + fn into_any(self: ::std::boxed::Box) -> ::std::boxed::Box { + self + } + + fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor { + Self::descriptor_static() + } + + fn new() -> LogsData { + LogsData::new() + } + + fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { + static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT; + descriptor.get(|| { + let mut fields = ::std::vec::Vec::new(); + fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage>( + "resource_logs", + |m: &LogsData| { &m.resource_logs }, + |m: &mut LogsData| { &mut m.resource_logs }, + )); + ::protobuf::reflect::MessageDescriptor::new_pb_name::( + "LogsData", + fields, + file_descriptor_proto() + ) + }) + } + + fn default_instance() -> &'static LogsData { + static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; + instance.get(LogsData::new) + } +} + +impl ::protobuf::Clear for LogsData { + fn clear(&mut self) { + self.resource_logs.clear(); + self.unknown_fields.clear(); + } +} + +impl ::std::fmt::Debug for LogsData { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for LogsData { + fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { + ::protobuf::reflect::ReflectValueRef::Message(self) + } +} + +#[derive(PartialEq,Clone,Default)] +#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))] +pub struct ResourceLogs { + // message fields + pub resource: ::protobuf::SingularPtrField, + pub scope_logs: ::protobuf::RepeatedField, + pub schema_url: ::std::string::String, + // special fields + #[cfg_attr(feature = "with-serde", serde(skip))] + pub unknown_fields: ::protobuf::UnknownFields, + #[cfg_attr(feature = "with-serde", serde(skip))] + pub cached_size: ::protobuf::CachedSize, +} + +impl<'a> ::std::default::Default for &'a ResourceLogs { + fn default() -> &'a ResourceLogs { + ::default_instance() + } +} + +impl ResourceLogs { + pub fn new() -> ResourceLogs { + ::std::default::Default::default() + } + + // .opentelemetry.proto.resource.v1.Resource resource = 1; + + + pub fn get_resource(&self) -> &super::resource::Resource { + self.resource.as_ref().unwrap_or_else(|| ::default_instance()) + } + pub fn clear_resource(&mut self) { + self.resource.clear(); + } + + pub fn has_resource(&self) -> bool { + self.resource.is_some() + } + + // Param is passed by value, moved + pub fn set_resource(&mut self, v: super::resource::Resource) { + self.resource = ::protobuf::SingularPtrField::some(v); + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_resource(&mut self) -> &mut super::resource::Resource { + if self.resource.is_none() { + self.resource.set_default(); + } + self.resource.as_mut().unwrap() + } + + // Take field + pub fn take_resource(&mut self) -> super::resource::Resource { + self.resource.take().unwrap_or_else(|| super::resource::Resource::new()) + } + + // repeated .opentelemetry.proto.logs.v1.ScopeLogs scope_logs = 2; + + + pub fn get_scope_logs(&self) -> &[ScopeLogs] { + &self.scope_logs + } + pub fn clear_scope_logs(&mut self) { + self.scope_logs.clear(); + } + + // Param is passed by value, moved + pub fn set_scope_logs(&mut self, v: ::protobuf::RepeatedField) { + self.scope_logs = v; + } + + // Mutable pointer to the field. + pub fn mut_scope_logs(&mut self) -> &mut ::protobuf::RepeatedField { + &mut self.scope_logs + } + + // Take field + pub fn take_scope_logs(&mut self) -> ::protobuf::RepeatedField { + ::std::mem::replace(&mut self.scope_logs, ::protobuf::RepeatedField::new()) + } + + // string schema_url = 3; + + + pub fn get_schema_url(&self) -> &str { + &self.schema_url + } + pub fn clear_schema_url(&mut self) { + self.schema_url.clear(); + } + + // Param is passed by value, moved + pub fn set_schema_url(&mut self, v: ::std::string::String) { + self.schema_url = v; + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_schema_url(&mut self) -> &mut ::std::string::String { + &mut self.schema_url + } + + // Take field + pub fn take_schema_url(&mut self) -> ::std::string::String { + ::std::mem::replace(&mut self.schema_url, ::std::string::String::new()) + } +} + +impl ::protobuf::Message for ResourceLogs { + fn is_initialized(&self) -> bool { + for v in &self.resource { + if !v.is_initialized() { + return false; + } + }; + for v in &self.scope_logs { + if !v.is_initialized() { + return false; + } + }; + true + } + + fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> { + while !is.eof()? { + let (field_number, wire_type) = is.read_tag_unpack()?; + match field_number { + 1 => { + ::protobuf::rt::read_singular_message_into(wire_type, is, &mut self.resource)?; + }, + 2 => { + ::protobuf::rt::read_repeated_message_into(wire_type, is, &mut self.scope_logs)?; + }, + 3 => { + ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.schema_url)?; + }, + _ => { + ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?; + }, + }; + } + ::std::result::Result::Ok(()) + } + + // Compute sizes of nested messages + #[allow(unused_variables)] + fn compute_size(&self) -> u32 { + let mut my_size = 0; + if let Some(ref v) = self.resource.as_ref() { + let len = v.compute_size(); + my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len; + } + for value in &self.scope_logs { + let len = value.compute_size(); + my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len; + }; + if !self.schema_url.is_empty() { + my_size += ::protobuf::rt::string_size(3, &self.schema_url); + } + my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields()); + self.cached_size.set(my_size); + my_size + } + + fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> { + if let Some(ref v) = self.resource.as_ref() { + os.write_tag(1, ::protobuf::wire_format::WireTypeLengthDelimited)?; + os.write_raw_varint32(v.get_cached_size())?; + v.write_to_with_cached_sizes(os)?; + } + for v in &self.scope_logs { + os.write_tag(2, ::protobuf::wire_format::WireTypeLengthDelimited)?; + os.write_raw_varint32(v.get_cached_size())?; + v.write_to_with_cached_sizes(os)?; + }; + if !self.schema_url.is_empty() { + os.write_string(3, &self.schema_url)?; + } + os.write_unknown_fields(self.get_unknown_fields())?; + ::std::result::Result::Ok(()) + } + + fn get_cached_size(&self) -> u32 { + self.cached_size.get() + } + + fn get_unknown_fields(&self) -> &::protobuf::UnknownFields { + &self.unknown_fields + } + + fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields { + &mut self.unknown_fields + } + + fn as_any(&self) -> &dyn (::std::any::Any) { + self as &dyn (::std::any::Any) + } + fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) { + self as &mut dyn (::std::any::Any) + } + fn into_any(self: ::std::boxed::Box) -> ::std::boxed::Box { + self + } + + fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor { + Self::descriptor_static() + } + + fn new() -> ResourceLogs { + ResourceLogs::new() + } + + fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { + static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT; + descriptor.get(|| { + let mut fields = ::std::vec::Vec::new(); + fields.push(::protobuf::reflect::accessor::make_singular_ptr_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage>( + "resource", + |m: &ResourceLogs| { &m.resource }, + |m: &mut ResourceLogs| { &mut m.resource }, + )); + fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage>( + "scope_logs", + |m: &ResourceLogs| { &m.scope_logs }, + |m: &mut ResourceLogs| { &mut m.scope_logs }, + )); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( + "schema_url", + |m: &ResourceLogs| { &m.schema_url }, + |m: &mut ResourceLogs| { &mut m.schema_url }, + )); + ::protobuf::reflect::MessageDescriptor::new_pb_name::( + "ResourceLogs", + fields, + file_descriptor_proto() + ) + }) + } + + fn default_instance() -> &'static ResourceLogs { + static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; + instance.get(ResourceLogs::new) + } +} + +impl ::protobuf::Clear for ResourceLogs { + fn clear(&mut self) { + self.resource.clear(); + self.scope_logs.clear(); + self.schema_url.clear(); + self.unknown_fields.clear(); + } +} + +impl ::std::fmt::Debug for ResourceLogs { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for ResourceLogs { + fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { + ::protobuf::reflect::ReflectValueRef::Message(self) + } +} + +#[derive(PartialEq,Clone,Default)] +#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))] +pub struct ScopeLogs { + // message fields + pub scope: ::protobuf::SingularPtrField, + pub log_records: ::protobuf::RepeatedField, + pub schema_url: ::std::string::String, + // special fields + #[cfg_attr(feature = "with-serde", serde(skip))] + pub unknown_fields: ::protobuf::UnknownFields, + #[cfg_attr(feature = "with-serde", serde(skip))] + pub cached_size: ::protobuf::CachedSize, +} + +impl<'a> ::std::default::Default for &'a ScopeLogs { + fn default() -> &'a ScopeLogs { + ::default_instance() + } +} + +impl ScopeLogs { + pub fn new() -> ScopeLogs { + ::std::default::Default::default() + } + + // .opentelemetry.proto.common.v1.InstrumentationScope scope = 1; + + + pub fn get_scope(&self) -> &super::common::InstrumentationScope { + self.scope.as_ref().unwrap_or_else(|| ::default_instance()) + } + pub fn clear_scope(&mut self) { + self.scope.clear(); + } + + pub fn has_scope(&self) -> bool { + self.scope.is_some() + } + + // Param is passed by value, moved + pub fn set_scope(&mut self, v: super::common::InstrumentationScope) { + self.scope = ::protobuf::SingularPtrField::some(v); + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_scope(&mut self) -> &mut super::common::InstrumentationScope { + if self.scope.is_none() { + self.scope.set_default(); + } + self.scope.as_mut().unwrap() + } + + // Take field + pub fn take_scope(&mut self) -> super::common::InstrumentationScope { + self.scope.take().unwrap_or_else(|| super::common::InstrumentationScope::new()) + } + + // repeated .opentelemetry.proto.logs.v1.LogRecord log_records = 2; + + + pub fn get_log_records(&self) -> &[LogRecord] { + &self.log_records + } + pub fn clear_log_records(&mut self) { + self.log_records.clear(); + } + + // Param is passed by value, moved + pub fn set_log_records(&mut self, v: ::protobuf::RepeatedField) { + self.log_records = v; + } + + // Mutable pointer to the field. + pub fn mut_log_records(&mut self) -> &mut ::protobuf::RepeatedField { + &mut self.log_records + } + + // Take field + pub fn take_log_records(&mut self) -> ::protobuf::RepeatedField { + ::std::mem::replace(&mut self.log_records, ::protobuf::RepeatedField::new()) + } + + // string schema_url = 3; + + + pub fn get_schema_url(&self) -> &str { + &self.schema_url + } + pub fn clear_schema_url(&mut self) { + self.schema_url.clear(); + } + + // Param is passed by value, moved + pub fn set_schema_url(&mut self, v: ::std::string::String) { + self.schema_url = v; + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_schema_url(&mut self) -> &mut ::std::string::String { + &mut self.schema_url + } + + // Take field + pub fn take_schema_url(&mut self) -> ::std::string::String { + ::std::mem::replace(&mut self.schema_url, ::std::string::String::new()) + } +} + +impl ::protobuf::Message for ScopeLogs { + fn is_initialized(&self) -> bool { + for v in &self.scope { + if !v.is_initialized() { + return false; + } + }; + for v in &self.log_records { + if !v.is_initialized() { + return false; + } + }; + true + } + + fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> { + while !is.eof()? { + let (field_number, wire_type) = is.read_tag_unpack()?; + match field_number { + 1 => { + ::protobuf::rt::read_singular_message_into(wire_type, is, &mut self.scope)?; + }, + 2 => { + ::protobuf::rt::read_repeated_message_into(wire_type, is, &mut self.log_records)?; + }, + 3 => { + ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.schema_url)?; + }, + _ => { + ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?; + }, + }; + } + ::std::result::Result::Ok(()) + } + + // Compute sizes of nested messages + #[allow(unused_variables)] + fn compute_size(&self) -> u32 { + let mut my_size = 0; + if let Some(ref v) = self.scope.as_ref() { + let len = v.compute_size(); + my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len; + } + for value in &self.log_records { + let len = value.compute_size(); + my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len; + }; + if !self.schema_url.is_empty() { + my_size += ::protobuf::rt::string_size(3, &self.schema_url); + } + my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields()); + self.cached_size.set(my_size); + my_size + } + + fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> { + if let Some(ref v) = self.scope.as_ref() { + os.write_tag(1, ::protobuf::wire_format::WireTypeLengthDelimited)?; + os.write_raw_varint32(v.get_cached_size())?; + v.write_to_with_cached_sizes(os)?; + } + for v in &self.log_records { + os.write_tag(2, ::protobuf::wire_format::WireTypeLengthDelimited)?; + os.write_raw_varint32(v.get_cached_size())?; + v.write_to_with_cached_sizes(os)?; + }; + if !self.schema_url.is_empty() { + os.write_string(3, &self.schema_url)?; + } + os.write_unknown_fields(self.get_unknown_fields())?; + ::std::result::Result::Ok(()) + } + + fn get_cached_size(&self) -> u32 { + self.cached_size.get() + } + + fn get_unknown_fields(&self) -> &::protobuf::UnknownFields { + &self.unknown_fields + } + + fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields { + &mut self.unknown_fields + } + + fn as_any(&self) -> &dyn (::std::any::Any) { + self as &dyn (::std::any::Any) + } + fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) { + self as &mut dyn (::std::any::Any) + } + fn into_any(self: ::std::boxed::Box) -> ::std::boxed::Box { + self + } + + fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor { + Self::descriptor_static() + } + + fn new() -> ScopeLogs { + ScopeLogs::new() + } + + fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { + static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT; + descriptor.get(|| { + let mut fields = ::std::vec::Vec::new(); + fields.push(::protobuf::reflect::accessor::make_singular_ptr_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage>( + "scope", + |m: &ScopeLogs| { &m.scope }, + |m: &mut ScopeLogs| { &mut m.scope }, + )); + fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage>( + "log_records", + |m: &ScopeLogs| { &m.log_records }, + |m: &mut ScopeLogs| { &mut m.log_records }, + )); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( + "schema_url", + |m: &ScopeLogs| { &m.schema_url }, + |m: &mut ScopeLogs| { &mut m.schema_url }, + )); + ::protobuf::reflect::MessageDescriptor::new_pb_name::( + "ScopeLogs", + fields, + file_descriptor_proto() + ) + }) + } + + fn default_instance() -> &'static ScopeLogs { + static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; + instance.get(ScopeLogs::new) + } +} + +impl ::protobuf::Clear for ScopeLogs { + fn clear(&mut self) { + self.scope.clear(); + self.log_records.clear(); + self.schema_url.clear(); + self.unknown_fields.clear(); + } +} + +impl ::std::fmt::Debug for ScopeLogs { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for ScopeLogs { + fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { + ::protobuf::reflect::ReflectValueRef::Message(self) + } +} + +#[derive(PartialEq,Clone,Default)] +#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))] +pub struct LogRecord { + // message fields + pub time_unix_nano: u64, + pub observed_time_unix_nano: u64, + pub severity_number: SeverityNumber, + pub severity_text: ::std::string::String, + pub body: ::protobuf::SingularPtrField, + pub attributes: ::protobuf::RepeatedField, + pub dropped_attributes_count: u32, + pub flags: u32, + pub trace_id: ::std::vec::Vec, + pub span_id: ::std::vec::Vec, + // special fields + #[cfg_attr(feature = "with-serde", serde(skip))] + pub unknown_fields: ::protobuf::UnknownFields, + #[cfg_attr(feature = "with-serde", serde(skip))] + pub cached_size: ::protobuf::CachedSize, +} + +impl<'a> ::std::default::Default for &'a LogRecord { + fn default() -> &'a LogRecord { + ::default_instance() + } +} + +impl LogRecord { + pub fn new() -> LogRecord { + ::std::default::Default::default() + } + + // fixed64 time_unix_nano = 1; + + + pub fn get_time_unix_nano(&self) -> u64 { + self.time_unix_nano + } + pub fn clear_time_unix_nano(&mut self) { + self.time_unix_nano = 0; + } + + // Param is passed by value, moved + pub fn set_time_unix_nano(&mut self, v: u64) { + self.time_unix_nano = v; + } + + // fixed64 observed_time_unix_nano = 11; + + + pub fn get_observed_time_unix_nano(&self) -> u64 { + self.observed_time_unix_nano + } + pub fn clear_observed_time_unix_nano(&mut self) { + self.observed_time_unix_nano = 0; + } + + // Param is passed by value, moved + pub fn set_observed_time_unix_nano(&mut self, v: u64) { + self.observed_time_unix_nano = v; + } + + // .opentelemetry.proto.logs.v1.SeverityNumber severity_number = 2; + + + pub fn get_severity_number(&self) -> SeverityNumber { + self.severity_number + } + pub fn clear_severity_number(&mut self) { + self.severity_number = SeverityNumber::SEVERITY_NUMBER_UNSPECIFIED; + } + + // Param is passed by value, moved + pub fn set_severity_number(&mut self, v: SeverityNumber) { + self.severity_number = v; + } + + // string severity_text = 3; + + + pub fn get_severity_text(&self) -> &str { + &self.severity_text + } + pub fn clear_severity_text(&mut self) { + self.severity_text.clear(); + } + + // Param is passed by value, moved + pub fn set_severity_text(&mut self, v: ::std::string::String) { + self.severity_text = v; + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_severity_text(&mut self) -> &mut ::std::string::String { + &mut self.severity_text + } + + // Take field + pub fn take_severity_text(&mut self) -> ::std::string::String { + ::std::mem::replace(&mut self.severity_text, ::std::string::String::new()) + } + + // .opentelemetry.proto.common.v1.AnyValue body = 5; + + + pub fn get_body(&self) -> &super::common::AnyValue { + self.body.as_ref().unwrap_or_else(|| ::default_instance()) + } + pub fn clear_body(&mut self) { + self.body.clear(); + } + + pub fn has_body(&self) -> bool { + self.body.is_some() + } + + // Param is passed by value, moved + pub fn set_body(&mut self, v: super::common::AnyValue) { + self.body = ::protobuf::SingularPtrField::some(v); + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_body(&mut self) -> &mut super::common::AnyValue { + if self.body.is_none() { + self.body.set_default(); + } + self.body.as_mut().unwrap() + } + + // Take field + pub fn take_body(&mut self) -> super::common::AnyValue { + self.body.take().unwrap_or_else(|| super::common::AnyValue::new()) + } + + // repeated .opentelemetry.proto.common.v1.KeyValue attributes = 6; + + + pub fn get_attributes(&self) -> &[super::common::KeyValue] { + &self.attributes + } + pub fn clear_attributes(&mut self) { + self.attributes.clear(); + } + + // Param is passed by value, moved + pub fn set_attributes(&mut self, v: ::protobuf::RepeatedField) { + self.attributes = v; + } + + // Mutable pointer to the field. + pub fn mut_attributes(&mut self) -> &mut ::protobuf::RepeatedField { + &mut self.attributes + } + + // Take field + pub fn take_attributes(&mut self) -> ::protobuf::RepeatedField { + ::std::mem::replace(&mut self.attributes, ::protobuf::RepeatedField::new()) + } + + // uint32 dropped_attributes_count = 7; + + + pub fn get_dropped_attributes_count(&self) -> u32 { + self.dropped_attributes_count + } + pub fn clear_dropped_attributes_count(&mut self) { + self.dropped_attributes_count = 0; + } + + // Param is passed by value, moved + pub fn set_dropped_attributes_count(&mut self, v: u32) { + self.dropped_attributes_count = v; + } + + // fixed32 flags = 8; + + + pub fn get_flags(&self) -> u32 { + self.flags + } + pub fn clear_flags(&mut self) { + self.flags = 0; + } + + // Param is passed by value, moved + pub fn set_flags(&mut self, v: u32) { + self.flags = v; + } + + // bytes trace_id = 9; + + + pub fn get_trace_id(&self) -> &[u8] { + &self.trace_id + } + pub fn clear_trace_id(&mut self) { + self.trace_id.clear(); + } + + // Param is passed by value, moved + pub fn set_trace_id(&mut self, v: ::std::vec::Vec) { + self.trace_id = v; + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_trace_id(&mut self) -> &mut ::std::vec::Vec { + &mut self.trace_id + } + + // Take field + pub fn take_trace_id(&mut self) -> ::std::vec::Vec { + ::std::mem::replace(&mut self.trace_id, ::std::vec::Vec::new()) + } + + // bytes span_id = 10; + + + pub fn get_span_id(&self) -> &[u8] { + &self.span_id + } + pub fn clear_span_id(&mut self) { + self.span_id.clear(); + } + + // Param is passed by value, moved + pub fn set_span_id(&mut self, v: ::std::vec::Vec) { + self.span_id = v; + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_span_id(&mut self) -> &mut ::std::vec::Vec { + &mut self.span_id + } + + // Take field + pub fn take_span_id(&mut self) -> ::std::vec::Vec { + ::std::mem::replace(&mut self.span_id, ::std::vec::Vec::new()) + } +} + +impl ::protobuf::Message for LogRecord { + fn is_initialized(&self) -> bool { + for v in &self.body { + if !v.is_initialized() { + return false; + } + }; + for v in &self.attributes { + if !v.is_initialized() { + return false; + } + }; + true + } + + fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> { + while !is.eof()? { + let (field_number, wire_type) = is.read_tag_unpack()?; + match field_number { + 1 => { + if wire_type != ::protobuf::wire_format::WireTypeFixed64 { + return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type)); + } + let tmp = is.read_fixed64()?; + self.time_unix_nano = tmp; + }, + 11 => { + if wire_type != ::protobuf::wire_format::WireTypeFixed64 { + return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type)); + } + let tmp = is.read_fixed64()?; + self.observed_time_unix_nano = tmp; + }, + 2 => { + ::protobuf::rt::read_proto3_enum_with_unknown_fields_into(wire_type, is, &mut self.severity_number, 2, &mut self.unknown_fields)? + }, + 3 => { + ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.severity_text)?; + }, + 5 => { + ::protobuf::rt::read_singular_message_into(wire_type, is, &mut self.body)?; + }, + 6 => { + ::protobuf::rt::read_repeated_message_into(wire_type, is, &mut self.attributes)?; + }, + 7 => { + if wire_type != ::protobuf::wire_format::WireTypeVarint { + return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type)); + } + let tmp = is.read_uint32()?; + self.dropped_attributes_count = tmp; + }, + 8 => { + if wire_type != ::protobuf::wire_format::WireTypeFixed32 { + return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type)); + } + let tmp = is.read_fixed32()?; + self.flags = tmp; + }, + 9 => { + ::protobuf::rt::read_singular_proto3_bytes_into(wire_type, is, &mut self.trace_id)?; + }, + 10 => { + ::protobuf::rt::read_singular_proto3_bytes_into(wire_type, is, &mut self.span_id)?; + }, + _ => { + ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?; + }, + }; + } + ::std::result::Result::Ok(()) + } + + // Compute sizes of nested messages + #[allow(unused_variables)] + fn compute_size(&self) -> u32 { + let mut my_size = 0; + if self.time_unix_nano != 0 { + my_size += 9; + } + if self.observed_time_unix_nano != 0 { + my_size += 9; + } + if self.severity_number != SeverityNumber::SEVERITY_NUMBER_UNSPECIFIED { + my_size += ::protobuf::rt::enum_size(2, self.severity_number); + } + if !self.severity_text.is_empty() { + my_size += ::protobuf::rt::string_size(3, &self.severity_text); + } + if let Some(ref v) = self.body.as_ref() { + let len = v.compute_size(); + my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len; + } + for value in &self.attributes { + let len = value.compute_size(); + my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len; + }; + if self.dropped_attributes_count != 0 { + my_size += ::protobuf::rt::value_size(7, self.dropped_attributes_count, ::protobuf::wire_format::WireTypeVarint); + } + if self.flags != 0 { + my_size += 5; + } + if !self.trace_id.is_empty() { + my_size += ::protobuf::rt::bytes_size(9, &self.trace_id); + } + if !self.span_id.is_empty() { + my_size += ::protobuf::rt::bytes_size(10, &self.span_id); + } + my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields()); + self.cached_size.set(my_size); + my_size + } + + fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> { + if self.time_unix_nano != 0 { + os.write_fixed64(1, self.time_unix_nano)?; + } + if self.observed_time_unix_nano != 0 { + os.write_fixed64(11, self.observed_time_unix_nano)?; + } + if self.severity_number != SeverityNumber::SEVERITY_NUMBER_UNSPECIFIED { + os.write_enum(2, ::protobuf::ProtobufEnum::value(&self.severity_number))?; + } + if !self.severity_text.is_empty() { + os.write_string(3, &self.severity_text)?; + } + if let Some(ref v) = self.body.as_ref() { + os.write_tag(5, ::protobuf::wire_format::WireTypeLengthDelimited)?; + os.write_raw_varint32(v.get_cached_size())?; + v.write_to_with_cached_sizes(os)?; + } + for v in &self.attributes { + os.write_tag(6, ::protobuf::wire_format::WireTypeLengthDelimited)?; + os.write_raw_varint32(v.get_cached_size())?; + v.write_to_with_cached_sizes(os)?; + }; + if self.dropped_attributes_count != 0 { + os.write_uint32(7, self.dropped_attributes_count)?; + } + if self.flags != 0 { + os.write_fixed32(8, self.flags)?; + } + if !self.trace_id.is_empty() { + os.write_bytes(9, &self.trace_id)?; + } + if !self.span_id.is_empty() { + os.write_bytes(10, &self.span_id)?; + } + os.write_unknown_fields(self.get_unknown_fields())?; + ::std::result::Result::Ok(()) + } + + fn get_cached_size(&self) -> u32 { + self.cached_size.get() + } + + fn get_unknown_fields(&self) -> &::protobuf::UnknownFields { + &self.unknown_fields + } + + fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields { + &mut self.unknown_fields + } + + fn as_any(&self) -> &dyn (::std::any::Any) { + self as &dyn (::std::any::Any) + } + fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) { + self as &mut dyn (::std::any::Any) + } + fn into_any(self: ::std::boxed::Box) -> ::std::boxed::Box { + self + } + + fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor { + Self::descriptor_static() + } + + fn new() -> LogRecord { + LogRecord::new() + } + + fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { + static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT; + descriptor.get(|| { + let mut fields = ::std::vec::Vec::new(); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeFixed64>( + "time_unix_nano", + |m: &LogRecord| { &m.time_unix_nano }, + |m: &mut LogRecord| { &mut m.time_unix_nano }, + )); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeFixed64>( + "observed_time_unix_nano", + |m: &LogRecord| { &m.observed_time_unix_nano }, + |m: &mut LogRecord| { &mut m.observed_time_unix_nano }, + )); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeEnum>( + "severity_number", + |m: &LogRecord| { &m.severity_number }, + |m: &mut LogRecord| { &mut m.severity_number }, + )); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( + "severity_text", + |m: &LogRecord| { &m.severity_text }, + |m: &mut LogRecord| { &mut m.severity_text }, + )); + fields.push(::protobuf::reflect::accessor::make_singular_ptr_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage>( + "body", + |m: &LogRecord| { &m.body }, + |m: &mut LogRecord| { &mut m.body }, + )); + fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage>( + "attributes", + |m: &LogRecord| { &m.attributes }, + |m: &mut LogRecord| { &mut m.attributes }, + )); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeUint32>( + "dropped_attributes_count", + |m: &LogRecord| { &m.dropped_attributes_count }, + |m: &mut LogRecord| { &mut m.dropped_attributes_count }, + )); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeFixed32>( + "flags", + |m: &LogRecord| { &m.flags }, + |m: &mut LogRecord| { &mut m.flags }, + )); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeBytes>( + "trace_id", + |m: &LogRecord| { &m.trace_id }, + |m: &mut LogRecord| { &mut m.trace_id }, + )); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeBytes>( + "span_id", + |m: &LogRecord| { &m.span_id }, + |m: &mut LogRecord| { &mut m.span_id }, + )); + ::protobuf::reflect::MessageDescriptor::new_pb_name::( + "LogRecord", + fields, + file_descriptor_proto() + ) + }) + } + + fn default_instance() -> &'static LogRecord { + static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; + instance.get(LogRecord::new) + } +} + +impl ::protobuf::Clear for LogRecord { + fn clear(&mut self) { + self.time_unix_nano = 0; + self.observed_time_unix_nano = 0; + self.severity_number = SeverityNumber::SEVERITY_NUMBER_UNSPECIFIED; + self.severity_text.clear(); + self.body.clear(); + self.attributes.clear(); + self.dropped_attributes_count = 0; + self.flags = 0; + self.trace_id.clear(); + self.span_id.clear(); + self.unknown_fields.clear(); + } +} + +impl ::std::fmt::Debug for LogRecord { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for LogRecord { + fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { + ::protobuf::reflect::ReflectValueRef::Message(self) + } +} + +#[derive(Clone,PartialEq,Eq,Debug,Hash)] +#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))] +pub enum SeverityNumber { + SEVERITY_NUMBER_UNSPECIFIED = 0, + SEVERITY_NUMBER_TRACE = 1, + SEVERITY_NUMBER_TRACE2 = 2, + SEVERITY_NUMBER_TRACE3 = 3, + SEVERITY_NUMBER_TRACE4 = 4, + SEVERITY_NUMBER_DEBUG = 5, + SEVERITY_NUMBER_DEBUG2 = 6, + SEVERITY_NUMBER_DEBUG3 = 7, + SEVERITY_NUMBER_DEBUG4 = 8, + SEVERITY_NUMBER_INFO = 9, + SEVERITY_NUMBER_INFO2 = 10, + SEVERITY_NUMBER_INFO3 = 11, + SEVERITY_NUMBER_INFO4 = 12, + SEVERITY_NUMBER_WARN = 13, + SEVERITY_NUMBER_WARN2 = 14, + SEVERITY_NUMBER_WARN3 = 15, + SEVERITY_NUMBER_WARN4 = 16, + SEVERITY_NUMBER_ERROR = 17, + SEVERITY_NUMBER_ERROR2 = 18, + SEVERITY_NUMBER_ERROR3 = 19, + SEVERITY_NUMBER_ERROR4 = 20, + SEVERITY_NUMBER_FATAL = 21, + SEVERITY_NUMBER_FATAL2 = 22, + SEVERITY_NUMBER_FATAL3 = 23, + SEVERITY_NUMBER_FATAL4 = 24, +} + +impl ::protobuf::ProtobufEnum for SeverityNumber { + fn value(&self) -> i32 { + *self as i32 + } + + fn from_i32(value: i32) -> ::std::option::Option { + match value { + 0 => ::std::option::Option::Some(SeverityNumber::SEVERITY_NUMBER_UNSPECIFIED), + 1 => ::std::option::Option::Some(SeverityNumber::SEVERITY_NUMBER_TRACE), + 2 => ::std::option::Option::Some(SeverityNumber::SEVERITY_NUMBER_TRACE2), + 3 => ::std::option::Option::Some(SeverityNumber::SEVERITY_NUMBER_TRACE3), + 4 => ::std::option::Option::Some(SeverityNumber::SEVERITY_NUMBER_TRACE4), + 5 => ::std::option::Option::Some(SeverityNumber::SEVERITY_NUMBER_DEBUG), + 6 => ::std::option::Option::Some(SeverityNumber::SEVERITY_NUMBER_DEBUG2), + 7 => ::std::option::Option::Some(SeverityNumber::SEVERITY_NUMBER_DEBUG3), + 8 => ::std::option::Option::Some(SeverityNumber::SEVERITY_NUMBER_DEBUG4), + 9 => ::std::option::Option::Some(SeverityNumber::SEVERITY_NUMBER_INFO), + 10 => ::std::option::Option::Some(SeverityNumber::SEVERITY_NUMBER_INFO2), + 11 => ::std::option::Option::Some(SeverityNumber::SEVERITY_NUMBER_INFO3), + 12 => ::std::option::Option::Some(SeverityNumber::SEVERITY_NUMBER_INFO4), + 13 => ::std::option::Option::Some(SeverityNumber::SEVERITY_NUMBER_WARN), + 14 => ::std::option::Option::Some(SeverityNumber::SEVERITY_NUMBER_WARN2), + 15 => ::std::option::Option::Some(SeverityNumber::SEVERITY_NUMBER_WARN3), + 16 => ::std::option::Option::Some(SeverityNumber::SEVERITY_NUMBER_WARN4), + 17 => ::std::option::Option::Some(SeverityNumber::SEVERITY_NUMBER_ERROR), + 18 => ::std::option::Option::Some(SeverityNumber::SEVERITY_NUMBER_ERROR2), + 19 => ::std::option::Option::Some(SeverityNumber::SEVERITY_NUMBER_ERROR3), + 20 => ::std::option::Option::Some(SeverityNumber::SEVERITY_NUMBER_ERROR4), + 21 => ::std::option::Option::Some(SeverityNumber::SEVERITY_NUMBER_FATAL), + 22 => ::std::option::Option::Some(SeverityNumber::SEVERITY_NUMBER_FATAL2), + 23 => ::std::option::Option::Some(SeverityNumber::SEVERITY_NUMBER_FATAL3), + 24 => ::std::option::Option::Some(SeverityNumber::SEVERITY_NUMBER_FATAL4), + _ => ::std::option::Option::None + } + } + + fn values() -> &'static [Self] { + static values: &'static [SeverityNumber] = &[ + SeverityNumber::SEVERITY_NUMBER_UNSPECIFIED, + SeverityNumber::SEVERITY_NUMBER_TRACE, + SeverityNumber::SEVERITY_NUMBER_TRACE2, + SeverityNumber::SEVERITY_NUMBER_TRACE3, + SeverityNumber::SEVERITY_NUMBER_TRACE4, + SeverityNumber::SEVERITY_NUMBER_DEBUG, + SeverityNumber::SEVERITY_NUMBER_DEBUG2, + SeverityNumber::SEVERITY_NUMBER_DEBUG3, + SeverityNumber::SEVERITY_NUMBER_DEBUG4, + SeverityNumber::SEVERITY_NUMBER_INFO, + SeverityNumber::SEVERITY_NUMBER_INFO2, + SeverityNumber::SEVERITY_NUMBER_INFO3, + SeverityNumber::SEVERITY_NUMBER_INFO4, + SeverityNumber::SEVERITY_NUMBER_WARN, + SeverityNumber::SEVERITY_NUMBER_WARN2, + SeverityNumber::SEVERITY_NUMBER_WARN3, + SeverityNumber::SEVERITY_NUMBER_WARN4, + SeverityNumber::SEVERITY_NUMBER_ERROR, + SeverityNumber::SEVERITY_NUMBER_ERROR2, + SeverityNumber::SEVERITY_NUMBER_ERROR3, + SeverityNumber::SEVERITY_NUMBER_ERROR4, + SeverityNumber::SEVERITY_NUMBER_FATAL, + SeverityNumber::SEVERITY_NUMBER_FATAL2, + SeverityNumber::SEVERITY_NUMBER_FATAL3, + SeverityNumber::SEVERITY_NUMBER_FATAL4, + ]; + values + } + + fn enum_descriptor_static() -> &'static ::protobuf::reflect::EnumDescriptor { + static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::EnumDescriptor> = ::protobuf::rt::LazyV2::INIT; + descriptor.get(|| { + ::protobuf::reflect::EnumDescriptor::new_pb_name::("SeverityNumber", file_descriptor_proto()) + }) + } +} + +impl ::std::marker::Copy for SeverityNumber { +} + +impl ::std::default::Default for SeverityNumber { + fn default() -> Self { + SeverityNumber::SEVERITY_NUMBER_UNSPECIFIED + } +} + +impl ::protobuf::reflect::ProtobufValue for SeverityNumber { + fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { + ::protobuf::reflect::ReflectValueRef::Enum(::protobuf::ProtobufEnum::descriptor(self)) + } +} + +#[derive(Clone,PartialEq,Eq,Debug,Hash)] +#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))] +pub enum LogRecordFlags { + LOG_RECORD_FLAGS_DO_NOT_USE = 0, + LOG_RECORD_FLAGS_TRACE_FLAGS_MASK = 255, +} + +impl ::protobuf::ProtobufEnum for LogRecordFlags { + fn value(&self) -> i32 { + *self as i32 + } + + fn from_i32(value: i32) -> ::std::option::Option { + match value { + 0 => ::std::option::Option::Some(LogRecordFlags::LOG_RECORD_FLAGS_DO_NOT_USE), + 255 => ::std::option::Option::Some(LogRecordFlags::LOG_RECORD_FLAGS_TRACE_FLAGS_MASK), + _ => ::std::option::Option::None + } + } + + fn values() -> &'static [Self] { + static values: &'static [LogRecordFlags] = &[ + LogRecordFlags::LOG_RECORD_FLAGS_DO_NOT_USE, + LogRecordFlags::LOG_RECORD_FLAGS_TRACE_FLAGS_MASK, + ]; + values + } + + fn enum_descriptor_static() -> &'static ::protobuf::reflect::EnumDescriptor { + static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::EnumDescriptor> = ::protobuf::rt::LazyV2::INIT; + descriptor.get(|| { + ::protobuf::reflect::EnumDescriptor::new_pb_name::("LogRecordFlags", file_descriptor_proto()) + }) + } +} + +impl ::std::marker::Copy for LogRecordFlags { +} + +impl ::std::default::Default for LogRecordFlags { + fn default() -> Self { + LogRecordFlags::LOG_RECORD_FLAGS_DO_NOT_USE + } +} + +impl ::protobuf::reflect::ProtobufValue for LogRecordFlags { + fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { + ::protobuf::reflect::ReflectValueRef::Enum(::protobuf::ProtobufEnum::descriptor(self)) + } +} + +static file_descriptor_proto_data: &'static [u8] = b"\ + \n&opentelemetry/proto/logs/v1/logs.proto\x12\x1bopentelemetry.proto.log\ + s.v1\x1a*opentelemetry/proto/common/v1/common.proto\x1a.opentelemetry/pr\ + oto/resource/v1/resource.proto\"Z\n\x08LogsData\x12N\n\rresource_logs\ + \x18\x01\x20\x03(\x0b2).opentelemetry.proto.logs.v1.ResourceLogsR\x0cres\ + ourceLogs\"\xc3\x01\n\x0cResourceLogs\x12E\n\x08resource\x18\x01\x20\x01\ + (\x0b2).opentelemetry.proto.resource.v1.ResourceR\x08resource\x12E\n\nsc\ + ope_logs\x18\x02\x20\x03(\x0b2&.opentelemetry.proto.logs.v1.ScopeLogsR\t\ + scopeLogs\x12\x1d\n\nschema_url\x18\x03\x20\x01(\tR\tschemaUrlJ\x06\x08\ + \xe8\x07\x10\xe9\x07\"\xbe\x01\n\tScopeLogs\x12I\n\x05scope\x18\x01\x20\ + \x01(\x0b23.opentelemetry.proto.common.v1.InstrumentationScopeR\x05scope\ + \x12G\n\x0blog_records\x18\x02\x20\x03(\x0b2&.opentelemetry.proto.logs.v\ + 1.LogRecordR\nlogRecords\x12\x1d\n\nschema_url\x18\x03\x20\x01(\tR\tsche\ + maUrl\"\xf3\x03\n\tLogRecord\x12$\n\x0etime_unix_nano\x18\x01\x20\x01(\ + \x06R\x0ctimeUnixNano\x125\n\x17observed_time_unix_nano\x18\x0b\x20\x01(\ + \x06R\x14observedTimeUnixNano\x12T\n\x0fseverity_number\x18\x02\x20\x01(\ + \x0e2+.opentelemetry.proto.logs.v1.SeverityNumberR\x0eseverityNumber\x12\ + #\n\rseverity_text\x18\x03\x20\x01(\tR\x0cseverityText\x12;\n\x04body\ + \x18\x05\x20\x01(\x0b2'.opentelemetry.proto.common.v1.AnyValueR\x04body\ + \x12G\n\nattributes\x18\x06\x20\x03(\x0b2'.opentelemetry.proto.common.v1\ + .KeyValueR\nattributes\x128\n\x18dropped_attributes_count\x18\x07\x20\ + \x01(\rR\x16droppedAttributesCount\x12\x14\n\x05flags\x18\x08\x20\x01(\ + \x07R\x05flags\x12\x19\n\x08trace_id\x18\t\x20\x01(\x0cR\x07traceId\x12\ + \x17\n\x07span_id\x18\n\x20\x01(\x0cR\x06spanIdJ\x04\x08\x04\x10\x05*\ + \xc3\x05\n\x0eSeverityNumber\x12\x1f\n\x1bSEVERITY_NUMBER_UNSPECIFIED\ + \x10\0\x12\x19\n\x15SEVERITY_NUMBER_TRACE\x10\x01\x12\x1a\n\x16SEVERITY_\ + NUMBER_TRACE2\x10\x02\x12\x1a\n\x16SEVERITY_NUMBER_TRACE3\x10\x03\x12\ + \x1a\n\x16SEVERITY_NUMBER_TRACE4\x10\x04\x12\x19\n\x15SEVERITY_NUMBER_DE\ + BUG\x10\x05\x12\x1a\n\x16SEVERITY_NUMBER_DEBUG2\x10\x06\x12\x1a\n\x16SEV\ + ERITY_NUMBER_DEBUG3\x10\x07\x12\x1a\n\x16SEVERITY_NUMBER_DEBUG4\x10\x08\ + \x12\x18\n\x14SEVERITY_NUMBER_INFO\x10\t\x12\x19\n\x15SEVERITY_NUMBER_IN\ + FO2\x10\n\x12\x19\n\x15SEVERITY_NUMBER_INFO3\x10\x0b\x12\x19\n\x15SEVERI\ + TY_NUMBER_INFO4\x10\x0c\x12\x18\n\x14SEVERITY_NUMBER_WARN\x10\r\x12\x19\ + \n\x15SEVERITY_NUMBER_WARN2\x10\x0e\x12\x19\n\x15SEVERITY_NUMBER_WARN3\ + \x10\x0f\x12\x19\n\x15SEVERITY_NUMBER_WARN4\x10\x10\x12\x19\n\x15SEVERIT\ + Y_NUMBER_ERROR\x10\x11\x12\x1a\n\x16SEVERITY_NUMBER_ERROR2\x10\x12\x12\ + \x1a\n\x16SEVERITY_NUMBER_ERROR3\x10\x13\x12\x1a\n\x16SEVERITY_NUMBER_ER\ + ROR4\x10\x14\x12\x19\n\x15SEVERITY_NUMBER_FATAL\x10\x15\x12\x1a\n\x16SEV\ + ERITY_NUMBER_FATAL2\x10\x16\x12\x1a\n\x16SEVERITY_NUMBER_FATAL3\x10\x17\ + \x12\x1a\n\x16SEVERITY_NUMBER_FATAL4\x10\x18*Y\n\x0eLogRecordFlags\x12\ + \x1f\n\x1bLOG_RECORD_FLAGS_DO_NOT_USE\x10\0\x12&\n!LOG_RECORD_FLAGS_TRAC\ + E_FLAGS_MASK\x10\xff\x01Bs\n\x1eio.opentelemetry.proto.logs.v1B\tLogsPro\ + toP\x01Z&go.opentelemetry.io/proto/otlp/logs/v1\xaa\x02\x1bOpenTelemetry\ + .Proto.Logs.V1b\x06proto3\ +"; + +static file_descriptor_proto_lazy: ::protobuf::rt::LazyV2<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::LazyV2::INIT; + +fn parse_descriptor_proto() -> ::protobuf::descriptor::FileDescriptorProto { + ::protobuf::Message::parse_from_bytes(file_descriptor_proto_data).unwrap() +} + +pub fn file_descriptor_proto() -> &'static ::protobuf::descriptor::FileDescriptorProto { + file_descriptor_proto_lazy.get(|| { + parse_descriptor_proto() + }) +} diff -Nru temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/grpcio/logs_service_grpc.rs temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/grpcio/logs_service_grpc.rs --- temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/grpcio/logs_service_grpc.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/grpcio/logs_service_grpc.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,69 @@ +// This file is generated. Do not edit +// @generated + +// https://github.com/Manishearth/rust-clippy/issues/702 +#![allow(unknown_lints)] +#![allow(clippy::all)] + +#![allow(box_pointers)] +#![allow(dead_code)] +#![allow(missing_docs)] +#![allow(non_camel_case_types)] +#![allow(non_snake_case)] +#![allow(non_upper_case_globals)] +#![allow(trivial_casts)] +#![allow(unsafe_code)] +#![allow(unused_imports)] +#![allow(unused_results)] + +const METHOD_LOGS_SERVICE_EXPORT: ::grpcio::Method = ::grpcio::Method { + ty: ::grpcio::MethodType::Unary, + name: "/opentelemetry.proto.collector.logs.v1.LogsService/Export", + req_mar: ::grpcio::Marshaller { ser: ::grpcio::pb_ser, de: ::grpcio::pb_de }, + resp_mar: ::grpcio::Marshaller { ser: ::grpcio::pb_ser, de: ::grpcio::pb_de }, +}; + +#[derive(Clone)] +pub struct LogsServiceClient { + client: ::grpcio::Client, +} + +impl LogsServiceClient { + pub fn new(channel: ::grpcio::Channel) -> Self { + LogsServiceClient { + client: ::grpcio::Client::new(channel), + } + } + + pub fn export_opt(&self, req: &super::logs_service::ExportLogsServiceRequest, opt: ::grpcio::CallOption) -> ::grpcio::Result { + self.client.unary_call(&METHOD_LOGS_SERVICE_EXPORT, req, opt) + } + + pub fn export(&self, req: &super::logs_service::ExportLogsServiceRequest) -> ::grpcio::Result { + self.export_opt(req, ::grpcio::CallOption::default()) + } + + pub fn export_async_opt(&self, req: &super::logs_service::ExportLogsServiceRequest, opt: ::grpcio::CallOption) -> ::grpcio::Result<::grpcio::ClientUnaryReceiver> { + self.client.unary_call_async(&METHOD_LOGS_SERVICE_EXPORT, req, opt) + } + + pub fn export_async(&self, req: &super::logs_service::ExportLogsServiceRequest) -> ::grpcio::Result<::grpcio::ClientUnaryReceiver> { + self.export_async_opt(req, ::grpcio::CallOption::default()) + } + pub fn spawn(&self, f: F) where F: ::futures::Future + Send + 'static { + self.client.spawn(f) + } +} + +pub trait LogsService { + fn export(&mut self, ctx: ::grpcio::RpcContext, req: super::logs_service::ExportLogsServiceRequest, sink: ::grpcio::UnarySink); +} + +pub fn create_logs_service(s: S) -> ::grpcio::Service { + let mut builder = ::grpcio::ServiceBuilder::new(); + let mut instance = s; + builder = builder.add_unary_handler(&METHOD_LOGS_SERVICE_EXPORT, move |ctx, req, resp| { + instance.export(ctx, req, resp) + }); + builder.build() +} diff -Nru temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/grpcio/logs_service.rs temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/grpcio/logs_service.rs --- temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/grpcio/logs_service.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/grpcio/logs_service.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,596 @@ +// This file is generated by rust-protobuf 2.28.0. Do not edit +// @generated + +// https://github.com/rust-lang/rust-clippy/issues/702 +#![allow(unknown_lints)] +#![allow(clippy::all)] + +#![allow(unused_attributes)] +#![cfg_attr(rustfmt, rustfmt::skip)] + +#![allow(box_pointers)] +#![allow(dead_code)] +#![allow(missing_docs)] +#![allow(non_camel_case_types)] +#![allow(non_snake_case)] +#![allow(non_upper_case_globals)] +#![allow(trivial_casts)] +#![allow(unused_imports)] +#![allow(unused_results)] +//! Generated file from `opentelemetry/proto/collector/logs/v1/logs_service.proto` + +/// Generated files are compatible only with the same version +/// of protobuf runtime. +// const _PROTOBUF_VERSION_CHECK: () = ::protobuf::VERSION_2_28_0; + +#[derive(PartialEq,Clone,Default)] +#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))] +pub struct ExportLogsServiceRequest { + // message fields + pub resource_logs: ::protobuf::RepeatedField, + // special fields + #[cfg_attr(feature = "with-serde", serde(skip))] + pub unknown_fields: ::protobuf::UnknownFields, + #[cfg_attr(feature = "with-serde", serde(skip))] + pub cached_size: ::protobuf::CachedSize, +} + +impl<'a> ::std::default::Default for &'a ExportLogsServiceRequest { + fn default() -> &'a ExportLogsServiceRequest { + ::default_instance() + } +} + +impl ExportLogsServiceRequest { + pub fn new() -> ExportLogsServiceRequest { + ::std::default::Default::default() + } + + // repeated .opentelemetry.proto.logs.v1.ResourceLogs resource_logs = 1; + + + pub fn get_resource_logs(&self) -> &[super::logs::ResourceLogs] { + &self.resource_logs + } + pub fn clear_resource_logs(&mut self) { + self.resource_logs.clear(); + } + + // Param is passed by value, moved + pub fn set_resource_logs(&mut self, v: ::protobuf::RepeatedField) { + self.resource_logs = v; + } + + // Mutable pointer to the field. + pub fn mut_resource_logs(&mut self) -> &mut ::protobuf::RepeatedField { + &mut self.resource_logs + } + + // Take field + pub fn take_resource_logs(&mut self) -> ::protobuf::RepeatedField { + ::std::mem::replace(&mut self.resource_logs, ::protobuf::RepeatedField::new()) + } +} + +impl ::protobuf::Message for ExportLogsServiceRequest { + fn is_initialized(&self) -> bool { + for v in &self.resource_logs { + if !v.is_initialized() { + return false; + } + }; + true + } + + fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> { + while !is.eof()? { + let (field_number, wire_type) = is.read_tag_unpack()?; + match field_number { + 1 => { + ::protobuf::rt::read_repeated_message_into(wire_type, is, &mut self.resource_logs)?; + }, + _ => { + ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?; + }, + }; + } + ::std::result::Result::Ok(()) + } + + // Compute sizes of nested messages + #[allow(unused_variables)] + fn compute_size(&self) -> u32 { + let mut my_size = 0; + for value in &self.resource_logs { + let len = value.compute_size(); + my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len; + }; + my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields()); + self.cached_size.set(my_size); + my_size + } + + fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> { + for v in &self.resource_logs { + os.write_tag(1, ::protobuf::wire_format::WireTypeLengthDelimited)?; + os.write_raw_varint32(v.get_cached_size())?; + v.write_to_with_cached_sizes(os)?; + }; + os.write_unknown_fields(self.get_unknown_fields())?; + ::std::result::Result::Ok(()) + } + + fn get_cached_size(&self) -> u32 { + self.cached_size.get() + } + + fn get_unknown_fields(&self) -> &::protobuf::UnknownFields { + &self.unknown_fields + } + + fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields { + &mut self.unknown_fields + } + + fn as_any(&self) -> &dyn (::std::any::Any) { + self as &dyn (::std::any::Any) + } + fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) { + self as &mut dyn (::std::any::Any) + } + fn into_any(self: ::std::boxed::Box) -> ::std::boxed::Box { + self + } + + fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor { + Self::descriptor_static() + } + + fn new() -> ExportLogsServiceRequest { + ExportLogsServiceRequest::new() + } + + fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { + static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT; + descriptor.get(|| { + let mut fields = ::std::vec::Vec::new(); + fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage>( + "resource_logs", + |m: &ExportLogsServiceRequest| { &m.resource_logs }, + |m: &mut ExportLogsServiceRequest| { &mut m.resource_logs }, + )); + ::protobuf::reflect::MessageDescriptor::new_pb_name::( + "ExportLogsServiceRequest", + fields, + file_descriptor_proto() + ) + }) + } + + fn default_instance() -> &'static ExportLogsServiceRequest { + static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; + instance.get(ExportLogsServiceRequest::new) + } +} + +impl ::protobuf::Clear for ExportLogsServiceRequest { + fn clear(&mut self) { + self.resource_logs.clear(); + self.unknown_fields.clear(); + } +} + +impl ::std::fmt::Debug for ExportLogsServiceRequest { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for ExportLogsServiceRequest { + fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { + ::protobuf::reflect::ReflectValueRef::Message(self) + } +} + +#[derive(PartialEq,Clone,Default)] +#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))] +pub struct ExportLogsServiceResponse { + // message fields + pub partial_success: ::protobuf::SingularPtrField, + // special fields + #[cfg_attr(feature = "with-serde", serde(skip))] + pub unknown_fields: ::protobuf::UnknownFields, + #[cfg_attr(feature = "with-serde", serde(skip))] + pub cached_size: ::protobuf::CachedSize, +} + +impl<'a> ::std::default::Default for &'a ExportLogsServiceResponse { + fn default() -> &'a ExportLogsServiceResponse { + ::default_instance() + } +} + +impl ExportLogsServiceResponse { + pub fn new() -> ExportLogsServiceResponse { + ::std::default::Default::default() + } + + // .opentelemetry.proto.collector.logs.v1.ExportLogsPartialSuccess partial_success = 1; + + + pub fn get_partial_success(&self) -> &ExportLogsPartialSuccess { + self.partial_success.as_ref().unwrap_or_else(|| ::default_instance()) + } + pub fn clear_partial_success(&mut self) { + self.partial_success.clear(); + } + + pub fn has_partial_success(&self) -> bool { + self.partial_success.is_some() + } + + // Param is passed by value, moved + pub fn set_partial_success(&mut self, v: ExportLogsPartialSuccess) { + self.partial_success = ::protobuf::SingularPtrField::some(v); + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_partial_success(&mut self) -> &mut ExportLogsPartialSuccess { + if self.partial_success.is_none() { + self.partial_success.set_default(); + } + self.partial_success.as_mut().unwrap() + } + + // Take field + pub fn take_partial_success(&mut self) -> ExportLogsPartialSuccess { + self.partial_success.take().unwrap_or_else(|| ExportLogsPartialSuccess::new()) + } +} + +impl ::protobuf::Message for ExportLogsServiceResponse { + fn is_initialized(&self) -> bool { + for v in &self.partial_success { + if !v.is_initialized() { + return false; + } + }; + true + } + + fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> { + while !is.eof()? { + let (field_number, wire_type) = is.read_tag_unpack()?; + match field_number { + 1 => { + ::protobuf::rt::read_singular_message_into(wire_type, is, &mut self.partial_success)?; + }, + _ => { + ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?; + }, + }; + } + ::std::result::Result::Ok(()) + } + + // Compute sizes of nested messages + #[allow(unused_variables)] + fn compute_size(&self) -> u32 { + let mut my_size = 0; + if let Some(ref v) = self.partial_success.as_ref() { + let len = v.compute_size(); + my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len; + } + my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields()); + self.cached_size.set(my_size); + my_size + } + + fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> { + if let Some(ref v) = self.partial_success.as_ref() { + os.write_tag(1, ::protobuf::wire_format::WireTypeLengthDelimited)?; + os.write_raw_varint32(v.get_cached_size())?; + v.write_to_with_cached_sizes(os)?; + } + os.write_unknown_fields(self.get_unknown_fields())?; + ::std::result::Result::Ok(()) + } + + fn get_cached_size(&self) -> u32 { + self.cached_size.get() + } + + fn get_unknown_fields(&self) -> &::protobuf::UnknownFields { + &self.unknown_fields + } + + fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields { + &mut self.unknown_fields + } + + fn as_any(&self) -> &dyn (::std::any::Any) { + self as &dyn (::std::any::Any) + } + fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) { + self as &mut dyn (::std::any::Any) + } + fn into_any(self: ::std::boxed::Box) -> ::std::boxed::Box { + self + } + + fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor { + Self::descriptor_static() + } + + fn new() -> ExportLogsServiceResponse { + ExportLogsServiceResponse::new() + } + + fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { + static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT; + descriptor.get(|| { + let mut fields = ::std::vec::Vec::new(); + fields.push(::protobuf::reflect::accessor::make_singular_ptr_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage>( + "partial_success", + |m: &ExportLogsServiceResponse| { &m.partial_success }, + |m: &mut ExportLogsServiceResponse| { &mut m.partial_success }, + )); + ::protobuf::reflect::MessageDescriptor::new_pb_name::( + "ExportLogsServiceResponse", + fields, + file_descriptor_proto() + ) + }) + } + + fn default_instance() -> &'static ExportLogsServiceResponse { + static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; + instance.get(ExportLogsServiceResponse::new) + } +} + +impl ::protobuf::Clear for ExportLogsServiceResponse { + fn clear(&mut self) { + self.partial_success.clear(); + self.unknown_fields.clear(); + } +} + +impl ::std::fmt::Debug for ExportLogsServiceResponse { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for ExportLogsServiceResponse { + fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { + ::protobuf::reflect::ReflectValueRef::Message(self) + } +} + +#[derive(PartialEq,Clone,Default)] +#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))] +pub struct ExportLogsPartialSuccess { + // message fields + pub rejected_log_records: i64, + pub error_message: ::std::string::String, + // special fields + #[cfg_attr(feature = "with-serde", serde(skip))] + pub unknown_fields: ::protobuf::UnknownFields, + #[cfg_attr(feature = "with-serde", serde(skip))] + pub cached_size: ::protobuf::CachedSize, +} + +impl<'a> ::std::default::Default for &'a ExportLogsPartialSuccess { + fn default() -> &'a ExportLogsPartialSuccess { + ::default_instance() + } +} + +impl ExportLogsPartialSuccess { + pub fn new() -> ExportLogsPartialSuccess { + ::std::default::Default::default() + } + + // int64 rejected_log_records = 1; + + + pub fn get_rejected_log_records(&self) -> i64 { + self.rejected_log_records + } + pub fn clear_rejected_log_records(&mut self) { + self.rejected_log_records = 0; + } + + // Param is passed by value, moved + pub fn set_rejected_log_records(&mut self, v: i64) { + self.rejected_log_records = v; + } + + // string error_message = 2; + + + pub fn get_error_message(&self) -> &str { + &self.error_message + } + pub fn clear_error_message(&mut self) { + self.error_message.clear(); + } + + // Param is passed by value, moved + pub fn set_error_message(&mut self, v: ::std::string::String) { + self.error_message = v; + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_error_message(&mut self) -> &mut ::std::string::String { + &mut self.error_message + } + + // Take field + pub fn take_error_message(&mut self) -> ::std::string::String { + ::std::mem::replace(&mut self.error_message, ::std::string::String::new()) + } +} + +impl ::protobuf::Message for ExportLogsPartialSuccess { + fn is_initialized(&self) -> bool { + true + } + + fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> { + while !is.eof()? { + let (field_number, wire_type) = is.read_tag_unpack()?; + match field_number { + 1 => { + if wire_type != ::protobuf::wire_format::WireTypeVarint { + return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type)); + } + let tmp = is.read_int64()?; + self.rejected_log_records = tmp; + }, + 2 => { + ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.error_message)?; + }, + _ => { + ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?; + }, + }; + } + ::std::result::Result::Ok(()) + } + + // Compute sizes of nested messages + #[allow(unused_variables)] + fn compute_size(&self) -> u32 { + let mut my_size = 0; + if self.rejected_log_records != 0 { + my_size += ::protobuf::rt::value_size(1, self.rejected_log_records, ::protobuf::wire_format::WireTypeVarint); + } + if !self.error_message.is_empty() { + my_size += ::protobuf::rt::string_size(2, &self.error_message); + } + my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields()); + self.cached_size.set(my_size); + my_size + } + + fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> { + if self.rejected_log_records != 0 { + os.write_int64(1, self.rejected_log_records)?; + } + if !self.error_message.is_empty() { + os.write_string(2, &self.error_message)?; + } + os.write_unknown_fields(self.get_unknown_fields())?; + ::std::result::Result::Ok(()) + } + + fn get_cached_size(&self) -> u32 { + self.cached_size.get() + } + + fn get_unknown_fields(&self) -> &::protobuf::UnknownFields { + &self.unknown_fields + } + + fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields { + &mut self.unknown_fields + } + + fn as_any(&self) -> &dyn (::std::any::Any) { + self as &dyn (::std::any::Any) + } + fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) { + self as &mut dyn (::std::any::Any) + } + fn into_any(self: ::std::boxed::Box) -> ::std::boxed::Box { + self + } + + fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor { + Self::descriptor_static() + } + + fn new() -> ExportLogsPartialSuccess { + ExportLogsPartialSuccess::new() + } + + fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { + static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT; + descriptor.get(|| { + let mut fields = ::std::vec::Vec::new(); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeInt64>( + "rejected_log_records", + |m: &ExportLogsPartialSuccess| { &m.rejected_log_records }, + |m: &mut ExportLogsPartialSuccess| { &mut m.rejected_log_records }, + )); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( + "error_message", + |m: &ExportLogsPartialSuccess| { &m.error_message }, + |m: &mut ExportLogsPartialSuccess| { &mut m.error_message }, + )); + ::protobuf::reflect::MessageDescriptor::new_pb_name::( + "ExportLogsPartialSuccess", + fields, + file_descriptor_proto() + ) + }) + } + + fn default_instance() -> &'static ExportLogsPartialSuccess { + static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; + instance.get(ExportLogsPartialSuccess::new) + } +} + +impl ::protobuf::Clear for ExportLogsPartialSuccess { + fn clear(&mut self) { + self.rejected_log_records = 0; + self.error_message.clear(); + self.unknown_fields.clear(); + } +} + +impl ::std::fmt::Debug for ExportLogsPartialSuccess { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for ExportLogsPartialSuccess { + fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { + ::protobuf::reflect::ReflectValueRef::Message(self) + } +} + +static file_descriptor_proto_data: &'static [u8] = b"\ + \n8opentelemetry/proto/collector/logs/v1/logs_service.proto\x12%opentele\ + metry.proto.collector.logs.v1\x1a&opentelemetry/proto/logs/v1/logs.proto\ + \"j\n\x18ExportLogsServiceRequest\x12N\n\rresource_logs\x18\x01\x20\x03(\ + \x0b2).opentelemetry.proto.logs.v1.ResourceLogsR\x0cresourceLogs\"\x85\ + \x01\n\x19ExportLogsServiceResponse\x12h\n\x0fpartial_success\x18\x01\ + \x20\x01(\x0b2?.opentelemetry.proto.collector.logs.v1.ExportLogsPartialS\ + uccessR\x0epartialSuccess\"q\n\x18ExportLogsPartialSuccess\x120\n\x14rej\ + ected_log_records\x18\x01\x20\x01(\x03R\x12rejectedLogRecords\x12#\n\rer\ + ror_message\x18\x02\x20\x01(\tR\x0cerrorMessage2\x9d\x01\n\x0bLogsServic\ + e\x12\x8d\x01\n\x06Export\x12?.opentelemetry.proto.collector.logs.v1.Exp\ + ortLogsServiceRequest\x1a@.opentelemetry.proto.collector.logs.v1.ExportL\ + ogsServiceResponse\"\0B\x98\x01\n(io.opentelemetry.proto.collector.logs.\ + v1B\x10LogsServiceProtoP\x01Z0go.opentelemetry.io/proto/otlp/collector/l\ + ogs/v1\xaa\x02%OpenTelemetry.Proto.Collector.Logs.V1b\x06proto3\ +"; + +static file_descriptor_proto_lazy: ::protobuf::rt::LazyV2<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::LazyV2::INIT; + +fn parse_descriptor_proto() -> ::protobuf::descriptor::FileDescriptorProto { + ::protobuf::Message::parse_from_bytes(file_descriptor_proto_data).unwrap() +} + +pub fn file_descriptor_proto() -> &'static ::protobuf::descriptor::FileDescriptorProto { + file_descriptor_proto_lazy.get(|| { + parse_descriptor_proto() + }) +} diff -Nru temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/grpcio/metrics.rs temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/grpcio/metrics.rs --- temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/grpcio/metrics.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/grpcio/metrics.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,4 +1,4 @@ -// This file is generated by rust-protobuf 2.27.1. Do not edit +// This file is generated by rust-protobuf 2.28.0. Do not edit // @generated // https://github.com/rust-lang/rust-clippy/issues/702 @@ -21,7 +21,7 @@ /// Generated files are compatible only with the same version /// of protobuf runtime. -// const _PROTOBUF_VERSION_CHECK: () = ::protobuf::VERSION_2_27_1; +// const _PROTOBUF_VERSION_CHECK: () = ::protobuf::VERSION_2_28_0; #[derive(PartialEq,Clone,Default)] #[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))] @@ -197,7 +197,7 @@ pub struct ResourceMetrics { // message fields pub resource: ::protobuf::SingularPtrField, - pub instrumentation_library_metrics: ::protobuf::RepeatedField, + pub scope_metrics: ::protobuf::RepeatedField, pub schema_url: ::std::string::String, // special fields #[cfg_attr(feature = "with-serde", serde(skip))] @@ -250,29 +250,29 @@ self.resource.take().unwrap_or_else(|| super::resource::Resource::new()) } - // repeated .opentelemetry.proto.metrics.v1.InstrumentationLibraryMetrics instrumentation_library_metrics = 2; + // repeated .opentelemetry.proto.metrics.v1.ScopeMetrics scope_metrics = 2; - pub fn get_instrumentation_library_metrics(&self) -> &[InstrumentationLibraryMetrics] { - &self.instrumentation_library_metrics + pub fn get_scope_metrics(&self) -> &[ScopeMetrics] { + &self.scope_metrics } - pub fn clear_instrumentation_library_metrics(&mut self) { - self.instrumentation_library_metrics.clear(); + pub fn clear_scope_metrics(&mut self) { + self.scope_metrics.clear(); } // Param is passed by value, moved - pub fn set_instrumentation_library_metrics(&mut self, v: ::protobuf::RepeatedField) { - self.instrumentation_library_metrics = v; + pub fn set_scope_metrics(&mut self, v: ::protobuf::RepeatedField) { + self.scope_metrics = v; } // Mutable pointer to the field. - pub fn mut_instrumentation_library_metrics(&mut self) -> &mut ::protobuf::RepeatedField { - &mut self.instrumentation_library_metrics + pub fn mut_scope_metrics(&mut self) -> &mut ::protobuf::RepeatedField { + &mut self.scope_metrics } // Take field - pub fn take_instrumentation_library_metrics(&mut self) -> ::protobuf::RepeatedField { - ::std::mem::replace(&mut self.instrumentation_library_metrics, ::protobuf::RepeatedField::new()) + pub fn take_scope_metrics(&mut self) -> ::protobuf::RepeatedField { + ::std::mem::replace(&mut self.scope_metrics, ::protobuf::RepeatedField::new()) } // string schema_url = 3; @@ -309,7 +309,7 @@ return false; } }; - for v in &self.instrumentation_library_metrics { + for v in &self.scope_metrics { if !v.is_initialized() { return false; } @@ -325,7 +325,7 @@ ::protobuf::rt::read_singular_message_into(wire_type, is, &mut self.resource)?; }, 2 => { - ::protobuf::rt::read_repeated_message_into(wire_type, is, &mut self.instrumentation_library_metrics)?; + ::protobuf::rt::read_repeated_message_into(wire_type, is, &mut self.scope_metrics)?; }, 3 => { ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.schema_url)?; @@ -346,7 +346,7 @@ let len = v.compute_size(); my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len; } - for value in &self.instrumentation_library_metrics { + for value in &self.scope_metrics { let len = value.compute_size(); my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len; }; @@ -364,7 +364,7 @@ os.write_raw_varint32(v.get_cached_size())?; v.write_to_with_cached_sizes(os)?; } - for v in &self.instrumentation_library_metrics { + for v in &self.scope_metrics { os.write_tag(2, ::protobuf::wire_format::WireTypeLengthDelimited)?; os.write_raw_varint32(v.get_cached_size())?; v.write_to_with_cached_sizes(os)?; @@ -415,10 +415,10 @@ |m: &ResourceMetrics| { &m.resource }, |m: &mut ResourceMetrics| { &mut m.resource }, )); - fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage>( - "instrumentation_library_metrics", - |m: &ResourceMetrics| { &m.instrumentation_library_metrics }, - |m: &mut ResourceMetrics| { &mut m.instrumentation_library_metrics }, + fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage>( + "scope_metrics", + |m: &ResourceMetrics| { &m.scope_metrics }, + |m: &mut ResourceMetrics| { &mut m.scope_metrics }, )); fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( "schema_url", @@ -442,7 +442,7 @@ impl ::protobuf::Clear for ResourceMetrics { fn clear(&mut self) { self.resource.clear(); - self.instrumentation_library_metrics.clear(); + self.scope_metrics.clear(); self.schema_url.clear(); self.unknown_fields.clear(); } @@ -462,9 +462,9 @@ #[derive(PartialEq,Clone,Default)] #[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))] -pub struct InstrumentationLibraryMetrics { +pub struct ScopeMetrics { // message fields - pub instrumentation_library: ::protobuf::SingularPtrField, + pub scope: ::protobuf::SingularPtrField, pub metrics: ::protobuf::RepeatedField, pub schema_url: ::std::string::String, // special fields @@ -474,48 +474,48 @@ pub cached_size: ::protobuf::CachedSize, } -impl<'a> ::std::default::Default for &'a InstrumentationLibraryMetrics { - fn default() -> &'a InstrumentationLibraryMetrics { - ::default_instance() +impl<'a> ::std::default::Default for &'a ScopeMetrics { + fn default() -> &'a ScopeMetrics { + ::default_instance() } } -impl InstrumentationLibraryMetrics { - pub fn new() -> InstrumentationLibraryMetrics { +impl ScopeMetrics { + pub fn new() -> ScopeMetrics { ::std::default::Default::default() } - // .opentelemetry.proto.common.v1.InstrumentationLibrary instrumentation_library = 1; + // .opentelemetry.proto.common.v1.InstrumentationScope scope = 1; - pub fn get_instrumentation_library(&self) -> &super::common::InstrumentationLibrary { - self.instrumentation_library.as_ref().unwrap_or_else(|| ::default_instance()) + pub fn get_scope(&self) -> &super::common::InstrumentationScope { + self.scope.as_ref().unwrap_or_else(|| ::default_instance()) } - pub fn clear_instrumentation_library(&mut self) { - self.instrumentation_library.clear(); + pub fn clear_scope(&mut self) { + self.scope.clear(); } - pub fn has_instrumentation_library(&self) -> bool { - self.instrumentation_library.is_some() + pub fn has_scope(&self) -> bool { + self.scope.is_some() } // Param is passed by value, moved - pub fn set_instrumentation_library(&mut self, v: super::common::InstrumentationLibrary) { - self.instrumentation_library = ::protobuf::SingularPtrField::some(v); + pub fn set_scope(&mut self, v: super::common::InstrumentationScope) { + self.scope = ::protobuf::SingularPtrField::some(v); } // Mutable pointer to the field. // If field is not initialized, it is initialized with default value first. - pub fn mut_instrumentation_library(&mut self) -> &mut super::common::InstrumentationLibrary { - if self.instrumentation_library.is_none() { - self.instrumentation_library.set_default(); + pub fn mut_scope(&mut self) -> &mut super::common::InstrumentationScope { + if self.scope.is_none() { + self.scope.set_default(); } - self.instrumentation_library.as_mut().unwrap() + self.scope.as_mut().unwrap() } // Take field - pub fn take_instrumentation_library(&mut self) -> super::common::InstrumentationLibrary { - self.instrumentation_library.take().unwrap_or_else(|| super::common::InstrumentationLibrary::new()) + pub fn take_scope(&mut self) -> super::common::InstrumentationScope { + self.scope.take().unwrap_or_else(|| super::common::InstrumentationScope::new()) } // repeated .opentelemetry.proto.metrics.v1.Metric metrics = 2; @@ -570,9 +570,9 @@ } } -impl ::protobuf::Message for InstrumentationLibraryMetrics { +impl ::protobuf::Message for ScopeMetrics { fn is_initialized(&self) -> bool { - for v in &self.instrumentation_library { + for v in &self.scope { if !v.is_initialized() { return false; } @@ -590,7 +590,7 @@ let (field_number, wire_type) = is.read_tag_unpack()?; match field_number { 1 => { - ::protobuf::rt::read_singular_message_into(wire_type, is, &mut self.instrumentation_library)?; + ::protobuf::rt::read_singular_message_into(wire_type, is, &mut self.scope)?; }, 2 => { ::protobuf::rt::read_repeated_message_into(wire_type, is, &mut self.metrics)?; @@ -610,7 +610,7 @@ #[allow(unused_variables)] fn compute_size(&self) -> u32 { let mut my_size = 0; - if let Some(ref v) = self.instrumentation_library.as_ref() { + if let Some(ref v) = self.scope.as_ref() { let len = v.compute_size(); my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len; } @@ -627,7 +627,7 @@ } fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> { - if let Some(ref v) = self.instrumentation_library.as_ref() { + if let Some(ref v) = self.scope.as_ref() { os.write_tag(1, ::protobuf::wire_format::WireTypeLengthDelimited)?; os.write_raw_varint32(v.get_cached_size())?; v.write_to_with_cached_sizes(os)?; @@ -670,59 +670,59 @@ Self::descriptor_static() } - fn new() -> InstrumentationLibraryMetrics { - InstrumentationLibraryMetrics::new() + fn new() -> ScopeMetrics { + ScopeMetrics::new() } fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT; descriptor.get(|| { let mut fields = ::std::vec::Vec::new(); - fields.push(::protobuf::reflect::accessor::make_singular_ptr_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage>( - "instrumentation_library", - |m: &InstrumentationLibraryMetrics| { &m.instrumentation_library }, - |m: &mut InstrumentationLibraryMetrics| { &mut m.instrumentation_library }, + fields.push(::protobuf::reflect::accessor::make_singular_ptr_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage>( + "scope", + |m: &ScopeMetrics| { &m.scope }, + |m: &mut ScopeMetrics| { &mut m.scope }, )); fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage>( "metrics", - |m: &InstrumentationLibraryMetrics| { &m.metrics }, - |m: &mut InstrumentationLibraryMetrics| { &mut m.metrics }, + |m: &ScopeMetrics| { &m.metrics }, + |m: &mut ScopeMetrics| { &mut m.metrics }, )); fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( "schema_url", - |m: &InstrumentationLibraryMetrics| { &m.schema_url }, - |m: &mut InstrumentationLibraryMetrics| { &mut m.schema_url }, + |m: &ScopeMetrics| { &m.schema_url }, + |m: &mut ScopeMetrics| { &mut m.schema_url }, )); - ::protobuf::reflect::MessageDescriptor::new_pb_name::( - "InstrumentationLibraryMetrics", + ::protobuf::reflect::MessageDescriptor::new_pb_name::( + "ScopeMetrics", fields, file_descriptor_proto() ) }) } - fn default_instance() -> &'static InstrumentationLibraryMetrics { - static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; - instance.get(InstrumentationLibraryMetrics::new) + fn default_instance() -> &'static ScopeMetrics { + static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; + instance.get(ScopeMetrics::new) } } -impl ::protobuf::Clear for InstrumentationLibraryMetrics { +impl ::protobuf::Clear for ScopeMetrics { fn clear(&mut self) { - self.instrumentation_library.clear(); + self.scope.clear(); self.metrics.clear(); self.schema_url.clear(); self.unknown_fields.clear(); } } -impl ::std::fmt::Debug for InstrumentationLibraryMetrics { +impl ::std::fmt::Debug for ScopeMetrics { fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { ::protobuf::text_format::fmt(self, f) } } -impl ::protobuf::reflect::ProtobufValue for InstrumentationLibraryMetrics { +impl ::protobuf::reflect::ProtobufValue for ScopeMetrics { fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { ::protobuf::reflect::ReflectValueRef::Message(self) } @@ -2776,11 +2776,14 @@ pub start_time_unix_nano: u64, pub time_unix_nano: u64, pub count: u64, - pub sum: f64, pub bucket_counts: ::std::vec::Vec, pub explicit_bounds: ::std::vec::Vec, pub exemplars: ::protobuf::RepeatedField, pub flags: u32, + // message oneof groups + pub _sum: ::std::option::Option, + pub _min: ::std::option::Option, + pub _max: ::std::option::Option, // special fields #[cfg_attr(feature = "with-serde", serde(skip))] pub unknown_fields: ::protobuf::UnknownFields, @@ -2794,6 +2797,24 @@ } } +#[derive(Clone,PartialEq,Debug)] +#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))] +pub enum HistogramDataPoint_oneof__sum { + sum(f64), +} + +#[derive(Clone,PartialEq,Debug)] +#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))] +pub enum HistogramDataPoint_oneof__min { + min(f64), +} + +#[derive(Clone,PartialEq,Debug)] +#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))] +pub enum HistogramDataPoint_oneof__max { + max(f64), +} + impl HistogramDataPoint { pub fn new() -> HistogramDataPoint { ::std::default::Default::default() @@ -2873,15 +2894,25 @@ pub fn get_sum(&self) -> f64 { - self.sum + match self._sum { + ::std::option::Option::Some(HistogramDataPoint_oneof__sum::sum(v)) => v, + _ => 0., + } } pub fn clear_sum(&mut self) { - self.sum = 0.; + self._sum = ::std::option::Option::None; + } + + pub fn has_sum(&self) -> bool { + match self._sum { + ::std::option::Option::Some(HistogramDataPoint_oneof__sum::sum(..)) => true, + _ => false, + } } // Param is passed by value, moved pub fn set_sum(&mut self, v: f64) { - self.sum = v; + self._sum = ::std::option::Option::Some(HistogramDataPoint_oneof__sum::sum(v)) } // repeated fixed64 bucket_counts = 6; @@ -2973,6 +3004,56 @@ pub fn set_flags(&mut self, v: u32) { self.flags = v; } + + // double min = 11; + + + pub fn get_min(&self) -> f64 { + match self._min { + ::std::option::Option::Some(HistogramDataPoint_oneof__min::min(v)) => v, + _ => 0., + } + } + pub fn clear_min(&mut self) { + self._min = ::std::option::Option::None; + } + + pub fn has_min(&self) -> bool { + match self._min { + ::std::option::Option::Some(HistogramDataPoint_oneof__min::min(..)) => true, + _ => false, + } + } + + // Param is passed by value, moved + pub fn set_min(&mut self, v: f64) { + self._min = ::std::option::Option::Some(HistogramDataPoint_oneof__min::min(v)) + } + + // double max = 12; + + + pub fn get_max(&self) -> f64 { + match self._max { + ::std::option::Option::Some(HistogramDataPoint_oneof__max::max(v)) => v, + _ => 0., + } + } + pub fn clear_max(&mut self) { + self._max = ::std::option::Option::None; + } + + pub fn has_max(&self) -> bool { + match self._max { + ::std::option::Option::Some(HistogramDataPoint_oneof__max::max(..)) => true, + _ => false, + } + } + + // Param is passed by value, moved + pub fn set_max(&mut self, v: f64) { + self._max = ::std::option::Option::Some(HistogramDataPoint_oneof__max::max(v)) + } } impl ::protobuf::Message for HistogramDataPoint { @@ -3022,8 +3103,7 @@ if wire_type != ::protobuf::wire_format::WireTypeFixed64 { return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type)); } - let tmp = is.read_double()?; - self.sum = tmp; + self._sum = ::std::option::Option::Some(HistogramDataPoint_oneof__sum::sum(is.read_double()?)); }, 6 => { ::protobuf::rt::read_repeated_fixed64_into(wire_type, is, &mut self.bucket_counts)?; @@ -3041,6 +3121,18 @@ let tmp = is.read_uint32()?; self.flags = tmp; }, + 11 => { + if wire_type != ::protobuf::wire_format::WireTypeFixed64 { + return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type)); + } + self._min = ::std::option::Option::Some(HistogramDataPoint_oneof__min::min(is.read_double()?)); + }, + 12 => { + if wire_type != ::protobuf::wire_format::WireTypeFixed64 { + return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type)); + } + self._max = ::std::option::Option::Some(HistogramDataPoint_oneof__max::max(is.read_double()?)); + }, _ => { ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?; }, @@ -3066,9 +3158,6 @@ if self.count != 0 { my_size += 9; } - if self.sum != 0. { - my_size += 9; - } my_size += 9 * self.bucket_counts.len() as u32; my_size += 9 * self.explicit_bounds.len() as u32; for value in &self.exemplars { @@ -3078,6 +3167,27 @@ if self.flags != 0 { my_size += ::protobuf::rt::value_size(10, self.flags, ::protobuf::wire_format::WireTypeVarint); } + if let ::std::option::Option::Some(ref v) = self._sum { + match v { + &HistogramDataPoint_oneof__sum::sum(v) => { + my_size += 9; + }, + }; + } + if let ::std::option::Option::Some(ref v) = self._min { + match v { + &HistogramDataPoint_oneof__min::min(v) => { + my_size += 9; + }, + }; + } + if let ::std::option::Option::Some(ref v) = self._max { + match v { + &HistogramDataPoint_oneof__max::max(v) => { + my_size += 9; + }, + }; + } my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields()); self.cached_size.set(my_size); my_size @@ -3098,9 +3208,6 @@ if self.count != 0 { os.write_fixed64(4, self.count)?; } - if self.sum != 0. { - os.write_double(5, self.sum)?; - } for v in &self.bucket_counts { os.write_fixed64(6, *v)?; }; @@ -3115,6 +3222,27 @@ if self.flags != 0 { os.write_uint32(10, self.flags)?; } + if let ::std::option::Option::Some(ref v) = self._sum { + match v { + &HistogramDataPoint_oneof__sum::sum(v) => { + os.write_double(5, v)?; + }, + }; + } + if let ::std::option::Option::Some(ref v) = self._min { + match v { + &HistogramDataPoint_oneof__min::min(v) => { + os.write_double(11, v)?; + }, + }; + } + if let ::std::option::Option::Some(ref v) = self._max { + match v { + &HistogramDataPoint_oneof__max::max(v) => { + os.write_double(12, v)?; + }, + }; + } os.write_unknown_fields(self.get_unknown_fields())?; ::std::result::Result::Ok(()) } @@ -3173,10 +3301,10 @@ |m: &HistogramDataPoint| { &m.count }, |m: &mut HistogramDataPoint| { &mut m.count }, )); - fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeDouble>( + fields.push(::protobuf::reflect::accessor::make_singular_f64_accessor::<_>( "sum", - |m: &HistogramDataPoint| { &m.sum }, - |m: &mut HistogramDataPoint| { &mut m.sum }, + HistogramDataPoint::has_sum, + HistogramDataPoint::get_sum, )); fields.push(::protobuf::reflect::accessor::make_vec_accessor::<_, ::protobuf::types::ProtobufTypeFixed64>( "bucket_counts", @@ -3198,6 +3326,16 @@ |m: &HistogramDataPoint| { &m.flags }, |m: &mut HistogramDataPoint| { &mut m.flags }, )); + fields.push(::protobuf::reflect::accessor::make_singular_f64_accessor::<_>( + "min", + HistogramDataPoint::has_min, + HistogramDataPoint::get_min, + )); + fields.push(::protobuf::reflect::accessor::make_singular_f64_accessor::<_>( + "max", + HistogramDataPoint::has_max, + HistogramDataPoint::get_max, + )); ::protobuf::reflect::MessageDescriptor::new_pb_name::( "HistogramDataPoint", fields, @@ -3218,11 +3356,13 @@ self.start_time_unix_nano = 0; self.time_unix_nano = 0; self.count = 0; - self.sum = 0.; + self._sum = ::std::option::Option::None; self.bucket_counts.clear(); self.explicit_bounds.clear(); self.exemplars.clear(); self.flags = 0; + self._min = ::std::option::Option::None; + self._max = ::std::option::Option::None; self.unknown_fields.clear(); } } @@ -3247,13 +3387,17 @@ pub start_time_unix_nano: u64, pub time_unix_nano: u64, pub count: u64, - pub sum: f64, pub scale: i32, pub zero_count: u64, pub positive: ::protobuf::SingularPtrField, pub negative: ::protobuf::SingularPtrField, pub flags: u32, pub exemplars: ::protobuf::RepeatedField, + pub zero_threshold: f64, + // message oneof groups + pub _sum: ::std::option::Option, + pub _min: ::std::option::Option, + pub _max: ::std::option::Option, // special fields #[cfg_attr(feature = "with-serde", serde(skip))] pub unknown_fields: ::protobuf::UnknownFields, @@ -3267,6 +3411,24 @@ } } +#[derive(Clone,PartialEq,Debug)] +#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))] +pub enum ExponentialHistogramDataPoint_oneof__sum { + sum(f64), +} + +#[derive(Clone,PartialEq,Debug)] +#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))] +pub enum ExponentialHistogramDataPoint_oneof__min { + min(f64), +} + +#[derive(Clone,PartialEq,Debug)] +#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))] +pub enum ExponentialHistogramDataPoint_oneof__max { + max(f64), +} + impl ExponentialHistogramDataPoint { pub fn new() -> ExponentialHistogramDataPoint { ::std::default::Default::default() @@ -3346,15 +3508,25 @@ pub fn get_sum(&self) -> f64 { - self.sum + match self._sum { + ::std::option::Option::Some(ExponentialHistogramDataPoint_oneof__sum::sum(v)) => v, + _ => 0., + } } pub fn clear_sum(&mut self) { - self.sum = 0.; + self._sum = ::std::option::Option::None; + } + + pub fn has_sum(&self) -> bool { + match self._sum { + ::std::option::Option::Some(ExponentialHistogramDataPoint_oneof__sum::sum(..)) => true, + _ => false, + } } // Param is passed by value, moved pub fn set_sum(&mut self, v: f64) { - self.sum = v; + self._sum = ::std::option::Option::Some(ExponentialHistogramDataPoint_oneof__sum::sum(v)) } // sint32 scale = 6; @@ -3492,6 +3664,71 @@ pub fn take_exemplars(&mut self) -> ::protobuf::RepeatedField { ::std::mem::replace(&mut self.exemplars, ::protobuf::RepeatedField::new()) } + + // double min = 12; + + + pub fn get_min(&self) -> f64 { + match self._min { + ::std::option::Option::Some(ExponentialHistogramDataPoint_oneof__min::min(v)) => v, + _ => 0., + } + } + pub fn clear_min(&mut self) { + self._min = ::std::option::Option::None; + } + + pub fn has_min(&self) -> bool { + match self._min { + ::std::option::Option::Some(ExponentialHistogramDataPoint_oneof__min::min(..)) => true, + _ => false, + } + } + + // Param is passed by value, moved + pub fn set_min(&mut self, v: f64) { + self._min = ::std::option::Option::Some(ExponentialHistogramDataPoint_oneof__min::min(v)) + } + + // double max = 13; + + + pub fn get_max(&self) -> f64 { + match self._max { + ::std::option::Option::Some(ExponentialHistogramDataPoint_oneof__max::max(v)) => v, + _ => 0., + } + } + pub fn clear_max(&mut self) { + self._max = ::std::option::Option::None; + } + + pub fn has_max(&self) -> bool { + match self._max { + ::std::option::Option::Some(ExponentialHistogramDataPoint_oneof__max::max(..)) => true, + _ => false, + } + } + + // Param is passed by value, moved + pub fn set_max(&mut self, v: f64) { + self._max = ::std::option::Option::Some(ExponentialHistogramDataPoint_oneof__max::max(v)) + } + + // double zero_threshold = 14; + + + pub fn get_zero_threshold(&self) -> f64 { + self.zero_threshold + } + pub fn clear_zero_threshold(&mut self) { + self.zero_threshold = 0.; + } + + // Param is passed by value, moved + pub fn set_zero_threshold(&mut self, v: f64) { + self.zero_threshold = v; + } } impl ::protobuf::Message for ExponentialHistogramDataPoint { @@ -3551,8 +3788,7 @@ if wire_type != ::protobuf::wire_format::WireTypeFixed64 { return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type)); } - let tmp = is.read_double()?; - self.sum = tmp; + self._sum = ::std::option::Option::Some(ExponentialHistogramDataPoint_oneof__sum::sum(is.read_double()?)); }, 6 => { if wire_type != ::protobuf::wire_format::WireTypeVarint { @@ -3584,6 +3820,25 @@ 11 => { ::protobuf::rt::read_repeated_message_into(wire_type, is, &mut self.exemplars)?; }, + 12 => { + if wire_type != ::protobuf::wire_format::WireTypeFixed64 { + return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type)); + } + self._min = ::std::option::Option::Some(ExponentialHistogramDataPoint_oneof__min::min(is.read_double()?)); + }, + 13 => { + if wire_type != ::protobuf::wire_format::WireTypeFixed64 { + return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type)); + } + self._max = ::std::option::Option::Some(ExponentialHistogramDataPoint_oneof__max::max(is.read_double()?)); + }, + 14 => { + if wire_type != ::protobuf::wire_format::WireTypeFixed64 { + return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type)); + } + let tmp = is.read_double()?; + self.zero_threshold = tmp; + }, _ => { ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?; }, @@ -3609,9 +3864,6 @@ if self.count != 0 { my_size += 9; } - if self.sum != 0. { - my_size += 9; - } if self.scale != 0 { my_size += ::protobuf::rt::value_varint_zigzag_size(6, self.scale); } @@ -3633,6 +3885,30 @@ let len = value.compute_size(); my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len; }; + if self.zero_threshold != 0. { + my_size += 9; + } + if let ::std::option::Option::Some(ref v) = self._sum { + match v { + &ExponentialHistogramDataPoint_oneof__sum::sum(v) => { + my_size += 9; + }, + }; + } + if let ::std::option::Option::Some(ref v) = self._min { + match v { + &ExponentialHistogramDataPoint_oneof__min::min(v) => { + my_size += 9; + }, + }; + } + if let ::std::option::Option::Some(ref v) = self._max { + match v { + &ExponentialHistogramDataPoint_oneof__max::max(v) => { + my_size += 9; + }, + }; + } my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields()); self.cached_size.set(my_size); my_size @@ -3653,9 +3929,6 @@ if self.count != 0 { os.write_fixed64(4, self.count)?; } - if self.sum != 0. { - os.write_double(5, self.sum)?; - } if self.scale != 0 { os.write_sint32(6, self.scale)?; } @@ -3680,6 +3953,30 @@ os.write_raw_varint32(v.get_cached_size())?; v.write_to_with_cached_sizes(os)?; }; + if self.zero_threshold != 0. { + os.write_double(14, self.zero_threshold)?; + } + if let ::std::option::Option::Some(ref v) = self._sum { + match v { + &ExponentialHistogramDataPoint_oneof__sum::sum(v) => { + os.write_double(5, v)?; + }, + }; + } + if let ::std::option::Option::Some(ref v) = self._min { + match v { + &ExponentialHistogramDataPoint_oneof__min::min(v) => { + os.write_double(12, v)?; + }, + }; + } + if let ::std::option::Option::Some(ref v) = self._max { + match v { + &ExponentialHistogramDataPoint_oneof__max::max(v) => { + os.write_double(13, v)?; + }, + }; + } os.write_unknown_fields(self.get_unknown_fields())?; ::std::result::Result::Ok(()) } @@ -3738,10 +4035,10 @@ |m: &ExponentialHistogramDataPoint| { &m.count }, |m: &mut ExponentialHistogramDataPoint| { &mut m.count }, )); - fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeDouble>( + fields.push(::protobuf::reflect::accessor::make_singular_f64_accessor::<_>( "sum", - |m: &ExponentialHistogramDataPoint| { &m.sum }, - |m: &mut ExponentialHistogramDataPoint| { &mut m.sum }, + ExponentialHistogramDataPoint::has_sum, + ExponentialHistogramDataPoint::get_sum, )); fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeSint32>( "scale", @@ -3773,6 +4070,21 @@ |m: &ExponentialHistogramDataPoint| { &m.exemplars }, |m: &mut ExponentialHistogramDataPoint| { &mut m.exemplars }, )); + fields.push(::protobuf::reflect::accessor::make_singular_f64_accessor::<_>( + "min", + ExponentialHistogramDataPoint::has_min, + ExponentialHistogramDataPoint::get_min, + )); + fields.push(::protobuf::reflect::accessor::make_singular_f64_accessor::<_>( + "max", + ExponentialHistogramDataPoint::has_max, + ExponentialHistogramDataPoint::get_max, + )); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeDouble>( + "zero_threshold", + |m: &ExponentialHistogramDataPoint| { &m.zero_threshold }, + |m: &mut ExponentialHistogramDataPoint| { &mut m.zero_threshold }, + )); ::protobuf::reflect::MessageDescriptor::new_pb_name::( "ExponentialHistogramDataPoint", fields, @@ -3793,13 +4105,16 @@ self.start_time_unix_nano = 0; self.time_unix_nano = 0; self.count = 0; - self.sum = 0.; + self._sum = ::std::option::Option::None; self.scale = 0; self.zero_count = 0; self.positive.clear(); self.negative.clear(); self.flags = 0; self.exemplars.clear(); + self._min = ::std::option::Option::None; + self._max = ::std::option::Option::None; + self.zero_threshold = 0.; self.unknown_fields.clear(); } } @@ -5043,8 +5358,8 @@ #[derive(Clone,PartialEq,Eq,Debug,Hash)] #[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))] pub enum DataPointFlags { - FLAG_NONE = 0, - FLAG_NO_RECORDED_VALUE = 1, + DATA_POINT_FLAGS_DO_NOT_USE = 0, + DATA_POINT_FLAGS_NO_RECORDED_VALUE_MASK = 1, } impl ::protobuf::ProtobufEnum for DataPointFlags { @@ -5054,16 +5369,16 @@ fn from_i32(value: i32) -> ::std::option::Option { match value { - 0 => ::std::option::Option::Some(DataPointFlags::FLAG_NONE), - 1 => ::std::option::Option::Some(DataPointFlags::FLAG_NO_RECORDED_VALUE), + 0 => ::std::option::Option::Some(DataPointFlags::DATA_POINT_FLAGS_DO_NOT_USE), + 1 => ::std::option::Option::Some(DataPointFlags::DATA_POINT_FLAGS_NO_RECORDED_VALUE_MASK), _ => ::std::option::Option::None } } fn values() -> &'static [Self] { static values: &'static [DataPointFlags] = &[ - DataPointFlags::FLAG_NONE, - DataPointFlags::FLAG_NO_RECORDED_VALUE, + DataPointFlags::DATA_POINT_FLAGS_DO_NOT_USE, + DataPointFlags::DATA_POINT_FLAGS_NO_RECORDED_VALUE_MASK, ]; values } @@ -5081,7 +5396,7 @@ impl ::std::default::Default for DataPointFlags { fn default() -> Self { - DataPointFlags::FLAG_NONE + DataPointFlags::DATA_POINT_FLAGS_DO_NOT_USE } } @@ -5096,77 +5411,82 @@ to.metrics.v1\x1a*opentelemetry/proto/common/v1/common.proto\x1a.opentel\ emetry/proto/resource/v1/resource.proto\"i\n\x0bMetricsData\x12Z\n\x10re\ source_metrics\x18\x01\x20\x03(\x0b2/.opentelemetry.proto.metrics.v1.Res\ - ourceMetricsR\x0fresourceMetrics\"\xff\x01\n\x0fResourceMetrics\x12E\n\ + ourceMetricsR\x0fresourceMetrics\"\xd2\x01\n\x0fResourceMetrics\x12E\n\ \x08resource\x18\x01\x20\x01(\x0b2).opentelemetry.proto.resource.v1.Reso\ - urceR\x08resource\x12\x85\x01\n\x1finstrumentation_library_metrics\x18\ - \x02\x20\x03(\x0b2=.opentelemetry.proto.metrics.v1.InstrumentationLibrar\ - yMetricsR\x1dinstrumentationLibraryMetrics\x12\x1d\n\nschema_url\x18\x03\ - \x20\x01(\tR\tschemaUrl\"\xf0\x01\n\x1dInstrumentationLibraryMetrics\x12\ - n\n\x17instrumentation_library\x18\x01\x20\x01(\x0b25.opentelemetry.prot\ - o.common.v1.InstrumentationLibraryR\x16instrumentationLibrary\x12@\n\x07\ - metrics\x18\x02\x20\x03(\x0b2&.opentelemetry.proto.metrics.v1.MetricR\ - \x07metrics\x12\x1d\n\nschema_url\x18\x03\x20\x01(\tR\tschemaUrl\"\xe1\ - \x03\n\x06Metric\x12\x12\n\x04name\x18\x01\x20\x01(\tR\x04name\x12\x20\n\ - \x0bdescription\x18\x02\x20\x01(\tR\x0bdescription\x12\x12\n\x04unit\x18\ - \x03\x20\x01(\tR\x04unit\x12=\n\x05gauge\x18\x05\x20\x01(\x0b2%.opentele\ - metry.proto.metrics.v1.GaugeH\0R\x05gauge\x127\n\x03sum\x18\x07\x20\x01(\ - \x0b2#.opentelemetry.proto.metrics.v1.SumH\0R\x03sum\x12I\n\thistogram\ - \x18\t\x20\x01(\x0b2).opentelemetry.proto.metrics.v1.HistogramH\0R\thist\ - ogram\x12k\n\x15exponential_histogram\x18\n\x20\x01(\x0b24.opentelemetry\ - .proto.metrics.v1.ExponentialHistogramH\0R\x14exponentialHistogram\x12C\ - \n\x07summary\x18\x0b\x20\x01(\x0b2'.opentelemetry.proto.metrics.v1.Summ\ - aryH\0R\x07summaryB\x06\n\x04dataJ\x04\x08\x04\x10\x05J\x04\x08\x06\x10\ - \x07J\x04\x08\x08\x10\t\"Y\n\x05Gauge\x12P\n\x0bdata_points\x18\x01\x20\ - \x03(\x0b2/.opentelemetry.proto.metrics.v1.NumberDataPointR\ndataPoints\ - \"\xeb\x01\n\x03Sum\x12P\n\x0bdata_points\x18\x01\x20\x03(\x0b2/.opentel\ - emetry.proto.metrics.v1.NumberDataPointR\ndataPoints\x12o\n\x17aggregati\ - on_temporality\x18\x02\x20\x01(\x0e26.opentelemetry.proto.metrics.v1.Agg\ - regationTemporalityR\x16aggregationTemporality\x12!\n\x0cis_monotonic\ - \x18\x03\x20\x01(\x08R\x0bisMonotonic\"\xd1\x01\n\tHistogram\x12S\n\x0bd\ - ata_points\x18\x01\x20\x03(\x0b22.opentelemetry.proto.metrics.v1.Histogr\ - amDataPointR\ndataPoints\x12o\n\x17aggregation_temporality\x18\x02\x20\ - \x01(\x0e26.opentelemetry.proto.metrics.v1.AggregationTemporalityR\x16ag\ - gregationTemporality\"\xe7\x01\n\x14ExponentialHistogram\x12^\n\x0bdata_\ - points\x18\x01\x20\x03(\x0b2=.opentelemetry.proto.metrics.v1.Exponential\ - HistogramDataPointR\ndataPoints\x12o\n\x17aggregation_temporality\x18\ - \x02\x20\x01(\x0e26.opentelemetry.proto.metrics.v1.AggregationTemporalit\ - yR\x16aggregationTemporality\"\\\n\x07Summary\x12Q\n\x0bdata_points\x18\ - \x01\x20\x03(\x0b20.opentelemetry.proto.metrics.v1.SummaryDataPointR\nda\ - taPoints\"\xd6\x02\n\x0fNumberDataPoint\x12G\n\nattributes\x18\x07\x20\ - \x03(\x0b2'.opentelemetry.proto.common.v1.KeyValueR\nattributes\x12/\n\ - \x14start_time_unix_nano\x18\x02\x20\x01(\x06R\x11startTimeUnixNano\x12$\ - \n\x0etime_unix_nano\x18\x03\x20\x01(\x06R\x0ctimeUnixNano\x12\x1d\n\tas\ - _double\x18\x04\x20\x01(\x01H\0R\x08asDouble\x12\x17\n\x06as_int\x18\x06\ - \x20\x01(\x10H\0R\x05asInt\x12F\n\texemplars\x18\x05\x20\x03(\x0b2(.open\ - telemetry.proto.metrics.v1.ExemplarR\texemplars\x12\x14\n\x05flags\x18\ - \x08\x20\x01(\rR\x05flagsB\x07\n\x05valueJ\x04\x08\x01\x10\x02\"\x8e\x03\ - \n\x12HistogramDataPoint\x12G\n\nattributes\x18\t\x20\x03(\x0b2'.opentel\ - emetry.proto.common.v1.KeyValueR\nattributes\x12/\n\x14start_time_unix_n\ - ano\x18\x02\x20\x01(\x06R\x11startTimeUnixNano\x12$\n\x0etime_unix_nano\ + urceR\x08resource\x12Q\n\rscope_metrics\x18\x02\x20\x03(\x0b2,.opentelem\ + etry.proto.metrics.v1.ScopeMetricsR\x0cscopeMetrics\x12\x1d\n\nschema_ur\ + l\x18\x03\x20\x01(\tR\tschemaUrlJ\x06\x08\xe8\x07\x10\xe9\x07\"\xba\x01\ + \n\x0cScopeMetrics\x12I\n\x05scope\x18\x01\x20\x01(\x0b23.opentelemetry.\ + proto.common.v1.InstrumentationScopeR\x05scope\x12@\n\x07metrics\x18\x02\ + \x20\x03(\x0b2&.opentelemetry.proto.metrics.v1.MetricR\x07metrics\x12\ + \x1d\n\nschema_url\x18\x03\x20\x01(\tR\tschemaUrl\"\xe1\x03\n\x06Metric\ + \x12\x12\n\x04name\x18\x01\x20\x01(\tR\x04name\x12\x20\n\x0bdescription\ + \x18\x02\x20\x01(\tR\x0bdescription\x12\x12\n\x04unit\x18\x03\x20\x01(\t\ + R\x04unit\x12=\n\x05gauge\x18\x05\x20\x01(\x0b2%.opentelemetry.proto.met\ + rics.v1.GaugeH\0R\x05gauge\x127\n\x03sum\x18\x07\x20\x01(\x0b2#.opentele\ + metry.proto.metrics.v1.SumH\0R\x03sum\x12I\n\thistogram\x18\t\x20\x01(\ + \x0b2).opentelemetry.proto.metrics.v1.HistogramH\0R\thistogram\x12k\n\ + \x15exponential_histogram\x18\n\x20\x01(\x0b24.opentelemetry.proto.metri\ + cs.v1.ExponentialHistogramH\0R\x14exponentialHistogram\x12C\n\x07summary\ + \x18\x0b\x20\x01(\x0b2'.opentelemetry.proto.metrics.v1.SummaryH\0R\x07su\ + mmaryB\x06\n\x04dataJ\x04\x08\x04\x10\x05J\x04\x08\x06\x10\x07J\x04\x08\ + \x08\x10\t\"Y\n\x05Gauge\x12P\n\x0bdata_points\x18\x01\x20\x03(\x0b2/.op\ + entelemetry.proto.metrics.v1.NumberDataPointR\ndataPoints\"\xeb\x01\n\ + \x03Sum\x12P\n\x0bdata_points\x18\x01\x20\x03(\x0b2/.opentelemetry.proto\ + .metrics.v1.NumberDataPointR\ndataPoints\x12o\n\x17aggregation_temporali\ + ty\x18\x02\x20\x01(\x0e26.opentelemetry.proto.metrics.v1.AggregationTemp\ + oralityR\x16aggregationTemporality\x12!\n\x0cis_monotonic\x18\x03\x20\ + \x01(\x08R\x0bisMonotonic\"\xd1\x01\n\tHistogram\x12S\n\x0bdata_points\ + \x18\x01\x20\x03(\x0b22.opentelemetry.proto.metrics.v1.HistogramDataPoin\ + tR\ndataPoints\x12o\n\x17aggregation_temporality\x18\x02\x20\x01(\x0e26.\ + opentelemetry.proto.metrics.v1.AggregationTemporalityR\x16aggregationTem\ + porality\"\xe7\x01\n\x14ExponentialHistogram\x12^\n\x0bdata_points\x18\ + \x01\x20\x03(\x0b2=.opentelemetry.proto.metrics.v1.ExponentialHistogramD\ + ataPointR\ndataPoints\x12o\n\x17aggregation_temporality\x18\x02\x20\x01(\ + \x0e26.opentelemetry.proto.metrics.v1.AggregationTemporalityR\x16aggrega\ + tionTemporality\"\\\n\x07Summary\x12Q\n\x0bdata_points\x18\x01\x20\x03(\ + \x0b20.opentelemetry.proto.metrics.v1.SummaryDataPointR\ndataPoints\"\ + \xd6\x02\n\x0fNumberDataPoint\x12G\n\nattributes\x18\x07\x20\x03(\x0b2'.\ + opentelemetry.proto.common.v1.KeyValueR\nattributes\x12/\n\x14start_time\ + _unix_nano\x18\x02\x20\x01(\x06R\x11startTimeUnixNano\x12$\n\x0etime_uni\ + x_nano\x18\x03\x20\x01(\x06R\x0ctimeUnixNano\x12\x1d\n\tas_double\x18\ + \x04\x20\x01(\x01H\0R\x08asDouble\x12\x17\n\x06as_int\x18\x06\x20\x01(\ + \x10H\0R\x05asInt\x12F\n\texemplars\x18\x05\x20\x03(\x0b2(.opentelemetry\ + .proto.metrics.v1.ExemplarR\texemplars\x12\x14\n\x05flags\x18\x08\x20\ + \x01(\rR\x05flagsB\x07\n\x05valueJ\x04\x08\x01\x10\x02\"\xd9\x03\n\x12Hi\ + stogramDataPoint\x12G\n\nattributes\x18\t\x20\x03(\x0b2'.opentelemetry.p\ + roto.common.v1.KeyValueR\nattributes\x12/\n\x14start_time_unix_nano\x18\ + \x02\x20\x01(\x06R\x11startTimeUnixNano\x12$\n\x0etime_unix_nano\x18\x03\ + \x20\x01(\x06R\x0ctimeUnixNano\x12\x14\n\x05count\x18\x04\x20\x01(\x06R\ + \x05count\x12\x15\n\x03sum\x18\x05\x20\x01(\x01H\0R\x03sum\x88\x01\x01\ + \x12#\n\rbucket_counts\x18\x06\x20\x03(\x06R\x0cbucketCounts\x12'\n\x0fe\ + xplicit_bounds\x18\x07\x20\x03(\x01R\x0eexplicitBounds\x12F\n\texemplars\ + \x18\x08\x20\x03(\x0b2(.opentelemetry.proto.metrics.v1.ExemplarR\texempl\ + ars\x12\x14\n\x05flags\x18\n\x20\x01(\rR\x05flags\x12\x15\n\x03min\x18\ + \x0b\x20\x01(\x01H\x01R\x03min\x88\x01\x01\x12\x15\n\x03max\x18\x0c\x20\ + \x01(\x01H\x02R\x03max\x88\x01\x01B\x06\n\x04_sumB\x06\n\x04_minB\x06\n\ + \x04_maxJ\x04\x08\x01\x10\x02\"\xfa\x05\n\x1dExponentialHistogramDataPoi\ + nt\x12G\n\nattributes\x18\x01\x20\x03(\x0b2'.opentelemetry.proto.common.\ + v1.KeyValueR\nattributes\x12/\n\x14start_time_unix_nano\x18\x02\x20\x01(\ + \x06R\x11startTimeUnixNano\x12$\n\x0etime_unix_nano\x18\x03\x20\x01(\x06\ + R\x0ctimeUnixNano\x12\x14\n\x05count\x18\x04\x20\x01(\x06R\x05count\x12\ + \x15\n\x03sum\x18\x05\x20\x01(\x01H\0R\x03sum\x88\x01\x01\x12\x14\n\x05s\ + cale\x18\x06\x20\x01(\x11R\x05scale\x12\x1d\n\nzero_count\x18\x07\x20\ + \x01(\x06R\tzeroCount\x12a\n\x08positive\x18\x08\x20\x01(\x0b2E.opentele\ + metry.proto.metrics.v1.ExponentialHistogramDataPoint.BucketsR\x08positiv\ + e\x12a\n\x08negative\x18\t\x20\x01(\x0b2E.opentelemetry.proto.metrics.v1\ + .ExponentialHistogramDataPoint.BucketsR\x08negative\x12\x14\n\x05flags\ + \x18\n\x20\x01(\rR\x05flags\x12F\n\texemplars\x18\x0b\x20\x03(\x0b2(.ope\ + ntelemetry.proto.metrics.v1.ExemplarR\texemplars\x12\x15\n\x03min\x18\ + \x0c\x20\x01(\x01H\x01R\x03min\x88\x01\x01\x12\x15\n\x03max\x18\r\x20\ + \x01(\x01H\x02R\x03max\x88\x01\x01\x12%\n\x0ezero_threshold\x18\x0e\x20\ + \x01(\x01R\rzeroThreshold\x1aF\n\x07Buckets\x12\x16\n\x06offset\x18\x01\ + \x20\x01(\x11R\x06offset\x12#\n\rbucket_counts\x18\x02\x20\x03(\x04R\x0c\ + bucketCountsB\x06\n\x04_sumB\x06\n\x04_minB\x06\n\x04_max\"\xa6\x03\n\ + \x10SummaryDataPoint\x12G\n\nattributes\x18\x07\x20\x03(\x0b2'.opentelem\ + etry.proto.common.v1.KeyValueR\nattributes\x12/\n\x14start_time_unix_nan\ + o\x18\x02\x20\x01(\x06R\x11startTimeUnixNano\x12$\n\x0etime_unix_nano\ \x18\x03\x20\x01(\x06R\x0ctimeUnixNano\x12\x14\n\x05count\x18\x04\x20\ - \x01(\x06R\x05count\x12\x10\n\x03sum\x18\x05\x20\x01(\x01R\x03sum\x12#\n\ - \rbucket_counts\x18\x06\x20\x03(\x06R\x0cbucketCounts\x12'\n\x0fexplicit\ - _bounds\x18\x07\x20\x03(\x01R\x0eexplicitBounds\x12F\n\texemplars\x18\ - \x08\x20\x03(\x0b2(.opentelemetry.proto.metrics.v1.ExemplarR\texemplars\ - \x12\x14\n\x05flags\x18\n\x20\x01(\rR\x05flagsJ\x04\x08\x01\x10\x02\"\ - \x88\x05\n\x1dExponentialHistogramDataPoint\x12G\n\nattributes\x18\x01\ - \x20\x03(\x0b2'.opentelemetry.proto.common.v1.KeyValueR\nattributes\x12/\ - \n\x14start_time_unix_nano\x18\x02\x20\x01(\x06R\x11startTimeUnixNano\ - \x12$\n\x0etime_unix_nano\x18\x03\x20\x01(\x06R\x0ctimeUnixNano\x12\x14\ - \n\x05count\x18\x04\x20\x01(\x06R\x05count\x12\x10\n\x03sum\x18\x05\x20\ - \x01(\x01R\x03sum\x12\x14\n\x05scale\x18\x06\x20\x01(\x11R\x05scale\x12\ - \x1d\n\nzero_count\x18\x07\x20\x01(\x06R\tzeroCount\x12a\n\x08positive\ - \x18\x08\x20\x01(\x0b2E.opentelemetry.proto.metrics.v1.ExponentialHistog\ - ramDataPoint.BucketsR\x08positive\x12a\n\x08negative\x18\t\x20\x01(\x0b2\ - E.opentelemetry.proto.metrics.v1.ExponentialHistogramDataPoint.BucketsR\ - \x08negative\x12\x14\n\x05flags\x18\n\x20\x01(\rR\x05flags\x12F\n\texemp\ - lars\x18\x0b\x20\x03(\x0b2(.opentelemetry.proto.metrics.v1.ExemplarR\tex\ - emplars\x1aF\n\x07Buckets\x12\x16\n\x06offset\x18\x01\x20\x01(\x11R\x06o\ - ffset\x12#\n\rbucket_counts\x18\x02\x20\x03(\x04R\x0cbucketCounts\"\xa6\ - \x03\n\x10SummaryDataPoint\x12G\n\nattributes\x18\x07\x20\x03(\x0b2'.ope\ - ntelemetry.proto.common.v1.KeyValueR\nattributes\x12/\n\x14start_time_un\ - ix_nano\x18\x02\x20\x01(\x06R\x11startTimeUnixNano\x12$\n\x0etime_unix_n\ - ano\x18\x03\x20\x01(\x06R\x0ctimeUnixNano\x12\x14\n\x05count\x18\x04\x20\ \x01(\x06R\x05count\x12\x10\n\x03sum\x18\x05\x20\x01(\x01R\x03sum\x12i\n\ \x0fquantile_values\x18\x06\x20\x03(\x0b2@.opentelemetry.proto.metrics.v\ 1.SummaryDataPoint.ValueAtQuantileR\x0equantileValues\x12\x14\n\x05flags\ @@ -5181,10 +5501,11 @@ _id\x18\x05\x20\x01(\x0cR\x07traceIdB\x07\n\x05valueJ\x04\x08\x01\x10\ \x02*\x8c\x01\n\x16AggregationTemporality\x12'\n#AGGREGATION_TEMPORALITY\ _UNSPECIFIED\x10\0\x12!\n\x1dAGGREGATION_TEMPORALITY_DELTA\x10\x01\x12&\ - \n\"AGGREGATION_TEMPORALITY_CUMULATIVE\x10\x02*;\n\x0eDataPointFlags\x12\ - \r\n\tFLAG_NONE\x10\0\x12\x1a\n\x16FLAG_NO_RECORDED_VALUE\x10\x01B^\n!io\ - .opentelemetry.proto.metrics.v1B\x0cMetricsProtoP\x01Z)go.opentelemetry.\ - io/proto/otlp/metrics/v1b\x06proto3\ + \n\"AGGREGATION_TEMPORALITY_CUMULATIVE\x10\x02*^\n\x0eDataPointFlags\x12\ + \x1f\n\x1bDATA_POINT_FLAGS_DO_NOT_USE\x10\0\x12+\n'DATA_POINT_FLAGS_NO_R\ + ECORDED_VALUE_MASK\x10\x01B\x7f\n!io.opentelemetry.proto.metrics.v1B\x0c\ + MetricsProtoP\x01Z)go.opentelemetry.io/proto/otlp/metrics/v1\xaa\x02\x1e\ + OpenTelemetry.Proto.Metrics.V1b\x06proto3\ "; static file_descriptor_proto_lazy: ::protobuf::rt::LazyV2<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::LazyV2::INIT; diff -Nru temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/grpcio/metrics_service.rs temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/grpcio/metrics_service.rs --- temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/grpcio/metrics_service.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/grpcio/metrics_service.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,4 +1,4 @@ -// This file is generated by rust-protobuf 2.27.1. Do not edit +// This file is generated by rust-protobuf 2.28.0. Do not edit // @generated // https://github.com/rust-lang/rust-clippy/issues/702 @@ -21,7 +21,7 @@ /// Generated files are compatible only with the same version /// of protobuf runtime. -// const _PROTOBUF_VERSION_CHECK: () = ::protobuf::VERSION_2_27_1; +// const _PROTOBUF_VERSION_CHECK: () = ::protobuf::VERSION_2_28_0; #[derive(PartialEq,Clone,Default)] #[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))] @@ -195,6 +195,8 @@ #[derive(PartialEq,Clone,Default)] #[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))] pub struct ExportMetricsServiceResponse { + // message fields + pub partial_success: ::protobuf::SingularPtrField, // special fields #[cfg_attr(feature = "with-serde", serde(skip))] pub unknown_fields: ::protobuf::UnknownFields, @@ -212,10 +214,48 @@ pub fn new() -> ExportMetricsServiceResponse { ::std::default::Default::default() } + + // .opentelemetry.proto.collector.metrics.v1.ExportMetricsPartialSuccess partial_success = 1; + + + pub fn get_partial_success(&self) -> &ExportMetricsPartialSuccess { + self.partial_success.as_ref().unwrap_or_else(|| ::default_instance()) + } + pub fn clear_partial_success(&mut self) { + self.partial_success.clear(); + } + + pub fn has_partial_success(&self) -> bool { + self.partial_success.is_some() + } + + // Param is passed by value, moved + pub fn set_partial_success(&mut self, v: ExportMetricsPartialSuccess) { + self.partial_success = ::protobuf::SingularPtrField::some(v); + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_partial_success(&mut self) -> &mut ExportMetricsPartialSuccess { + if self.partial_success.is_none() { + self.partial_success.set_default(); + } + self.partial_success.as_mut().unwrap() + } + + // Take field + pub fn take_partial_success(&mut self) -> ExportMetricsPartialSuccess { + self.partial_success.take().unwrap_or_else(|| ExportMetricsPartialSuccess::new()) + } } impl ::protobuf::Message for ExportMetricsServiceResponse { fn is_initialized(&self) -> bool { + for v in &self.partial_success { + if !v.is_initialized() { + return false; + } + }; true } @@ -223,6 +263,9 @@ while !is.eof()? { let (field_number, wire_type) = is.read_tag_unpack()?; match field_number { + 1 => { + ::protobuf::rt::read_singular_message_into(wire_type, is, &mut self.partial_success)?; + }, _ => { ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?; }, @@ -235,12 +278,21 @@ #[allow(unused_variables)] fn compute_size(&self) -> u32 { let mut my_size = 0; + if let Some(ref v) = self.partial_success.as_ref() { + let len = v.compute_size(); + my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len; + } my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields()); self.cached_size.set(my_size); my_size } fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> { + if let Some(ref v) = self.partial_success.as_ref() { + os.write_tag(1, ::protobuf::wire_format::WireTypeLengthDelimited)?; + os.write_raw_varint32(v.get_cached_size())?; + v.write_to_with_cached_sizes(os)?; + } os.write_unknown_fields(self.get_unknown_fields())?; ::std::result::Result::Ok(()) } @@ -278,7 +330,12 @@ fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT; descriptor.get(|| { - let fields = ::std::vec::Vec::new(); + let mut fields = ::std::vec::Vec::new(); + fields.push(::protobuf::reflect::accessor::make_singular_ptr_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage>( + "partial_success", + |m: &ExportMetricsServiceResponse| { &m.partial_success }, + |m: &mut ExportMetricsServiceResponse| { &mut m.partial_success }, + )); ::protobuf::reflect::MessageDescriptor::new_pb_name::( "ExportMetricsServiceResponse", fields, @@ -295,6 +352,7 @@ impl ::protobuf::Clear for ExportMetricsServiceResponse { fn clear(&mut self) { + self.partial_success.clear(); self.unknown_fields.clear(); } } @@ -311,17 +369,219 @@ } } +#[derive(PartialEq,Clone,Default)] +#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))] +pub struct ExportMetricsPartialSuccess { + // message fields + pub rejected_data_points: i64, + pub error_message: ::std::string::String, + // special fields + #[cfg_attr(feature = "with-serde", serde(skip))] + pub unknown_fields: ::protobuf::UnknownFields, + #[cfg_attr(feature = "with-serde", serde(skip))] + pub cached_size: ::protobuf::CachedSize, +} + +impl<'a> ::std::default::Default for &'a ExportMetricsPartialSuccess { + fn default() -> &'a ExportMetricsPartialSuccess { + ::default_instance() + } +} + +impl ExportMetricsPartialSuccess { + pub fn new() -> ExportMetricsPartialSuccess { + ::std::default::Default::default() + } + + // int64 rejected_data_points = 1; + + + pub fn get_rejected_data_points(&self) -> i64 { + self.rejected_data_points + } + pub fn clear_rejected_data_points(&mut self) { + self.rejected_data_points = 0; + } + + // Param is passed by value, moved + pub fn set_rejected_data_points(&mut self, v: i64) { + self.rejected_data_points = v; + } + + // string error_message = 2; + + + pub fn get_error_message(&self) -> &str { + &self.error_message + } + pub fn clear_error_message(&mut self) { + self.error_message.clear(); + } + + // Param is passed by value, moved + pub fn set_error_message(&mut self, v: ::std::string::String) { + self.error_message = v; + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_error_message(&mut self) -> &mut ::std::string::String { + &mut self.error_message + } + + // Take field + pub fn take_error_message(&mut self) -> ::std::string::String { + ::std::mem::replace(&mut self.error_message, ::std::string::String::new()) + } +} + +impl ::protobuf::Message for ExportMetricsPartialSuccess { + fn is_initialized(&self) -> bool { + true + } + + fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> { + while !is.eof()? { + let (field_number, wire_type) = is.read_tag_unpack()?; + match field_number { + 1 => { + if wire_type != ::protobuf::wire_format::WireTypeVarint { + return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type)); + } + let tmp = is.read_int64()?; + self.rejected_data_points = tmp; + }, + 2 => { + ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.error_message)?; + }, + _ => { + ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?; + }, + }; + } + ::std::result::Result::Ok(()) + } + + // Compute sizes of nested messages + #[allow(unused_variables)] + fn compute_size(&self) -> u32 { + let mut my_size = 0; + if self.rejected_data_points != 0 { + my_size += ::protobuf::rt::value_size(1, self.rejected_data_points, ::protobuf::wire_format::WireTypeVarint); + } + if !self.error_message.is_empty() { + my_size += ::protobuf::rt::string_size(2, &self.error_message); + } + my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields()); + self.cached_size.set(my_size); + my_size + } + + fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> { + if self.rejected_data_points != 0 { + os.write_int64(1, self.rejected_data_points)?; + } + if !self.error_message.is_empty() { + os.write_string(2, &self.error_message)?; + } + os.write_unknown_fields(self.get_unknown_fields())?; + ::std::result::Result::Ok(()) + } + + fn get_cached_size(&self) -> u32 { + self.cached_size.get() + } + + fn get_unknown_fields(&self) -> &::protobuf::UnknownFields { + &self.unknown_fields + } + + fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields { + &mut self.unknown_fields + } + + fn as_any(&self) -> &dyn (::std::any::Any) { + self as &dyn (::std::any::Any) + } + fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) { + self as &mut dyn (::std::any::Any) + } + fn into_any(self: ::std::boxed::Box) -> ::std::boxed::Box { + self + } + + fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor { + Self::descriptor_static() + } + + fn new() -> ExportMetricsPartialSuccess { + ExportMetricsPartialSuccess::new() + } + + fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { + static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT; + descriptor.get(|| { + let mut fields = ::std::vec::Vec::new(); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeInt64>( + "rejected_data_points", + |m: &ExportMetricsPartialSuccess| { &m.rejected_data_points }, + |m: &mut ExportMetricsPartialSuccess| { &mut m.rejected_data_points }, + )); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( + "error_message", + |m: &ExportMetricsPartialSuccess| { &m.error_message }, + |m: &mut ExportMetricsPartialSuccess| { &mut m.error_message }, + )); + ::protobuf::reflect::MessageDescriptor::new_pb_name::( + "ExportMetricsPartialSuccess", + fields, + file_descriptor_proto() + ) + }) + } + + fn default_instance() -> &'static ExportMetricsPartialSuccess { + static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; + instance.get(ExportMetricsPartialSuccess::new) + } +} + +impl ::protobuf::Clear for ExportMetricsPartialSuccess { + fn clear(&mut self) { + self.rejected_data_points = 0; + self.error_message.clear(); + self.unknown_fields.clear(); + } +} + +impl ::std::fmt::Debug for ExportMetricsPartialSuccess { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for ExportMetricsPartialSuccess { + fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { + ::protobuf::reflect::ReflectValueRef::Message(self) + } +} + static file_descriptor_proto_data: &'static [u8] = b"\ \n>opentelemetry/proto/collector/metrics/v1/metrics_service.proto\x12(op\ entelemetry.proto.collector.metrics.v1\x1a,opentelemetry/proto/metrics/v\ 1/metrics.proto\"y\n\x1bExportMetricsServiceRequest\x12Z\n\x10resource_m\ etrics\x18\x01\x20\x03(\x0b2/.opentelemetry.proto.metrics.v1.ResourceMet\ - ricsR\x0fresourceMetrics\"\x1e\n\x1cExportMetricsServiceResponse2\xac\ - \x01\n\x0eMetricsService\x12\x99\x01\n\x06Export\x12E.opentelemetry.prot\ - o.collector.metrics.v1.ExportMetricsServiceRequest\x1aF.opentelemetry.pr\ - oto.collector.metrics.v1.ExportMetricsServiceResponse\"\0By\n+io.opentel\ - emetry.proto.collector.metrics.v1B\x13MetricsServiceProtoP\x01Z3go.opent\ - elemetry.io/proto/otlp/collector/metrics/v1b\x06proto3\ + ricsR\x0fresourceMetrics\"\x8e\x01\n\x1cExportMetricsServiceResponse\x12\ + n\n\x0fpartial_success\x18\x01\x20\x01(\x0b2E.opentelemetry.proto.collec\ + tor.metrics.v1.ExportMetricsPartialSuccessR\x0epartialSuccess\"t\n\x1bEx\ + portMetricsPartialSuccess\x120\n\x14rejected_data_points\x18\x01\x20\x01\ + (\x03R\x12rejectedDataPoints\x12#\n\rerror_message\x18\x02\x20\x01(\tR\ + \x0cerrorMessage2\xac\x01\n\x0eMetricsService\x12\x99\x01\n\x06Export\ + \x12E.opentelemetry.proto.collector.metrics.v1.ExportMetricsServiceReque\ + st\x1aF.opentelemetry.proto.collector.metrics.v1.ExportMetricsServiceRes\ + ponse\"\0B\xa4\x01\n+io.opentelemetry.proto.collector.metrics.v1B\x13Met\ + ricsServiceProtoP\x01Z3go.opentelemetry.io/proto/otlp/collector/metrics/\ + v1\xaa\x02(OpenTelemetry.Proto.Collector.Metrics.V1b\x06proto3\ "; static file_descriptor_proto_lazy: ::protobuf::rt::LazyV2<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::LazyV2::INIT; diff -Nru temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/grpcio/resource.rs temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/grpcio/resource.rs --- temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/grpcio/resource.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/grpcio/resource.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,4 +1,4 @@ -// This file is generated by rust-protobuf 2.27.1. Do not edit +// This file is generated by rust-protobuf 2.28.0. Do not edit // @generated // https://github.com/rust-lang/rust-clippy/issues/702 @@ -21,7 +21,7 @@ /// Generated files are compatible only with the same version /// of protobuf runtime. -// const _PROTOBUF_VERSION_CHECK: () = ::protobuf::VERSION_2_27_1; +// const _PROTOBUF_VERSION_CHECK: () = ::protobuf::VERSION_2_28_0; #[derive(PartialEq,Clone,Default)] #[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))] @@ -232,9 +232,9 @@ roto.resource.v1\x1a*opentelemetry/proto/common/v1/common.proto\"\x8d\ \x01\n\x08Resource\x12G\n\nattributes\x18\x01\x20\x03(\x0b2'.opentelemet\ ry.proto.common.v1.KeyValueR\nattributes\x128\n\x18dropped_attributes_co\ - unt\x18\x02\x20\x01(\rR\x16droppedAttributesCountBa\n\"io.opentelemetry.\ - proto.resource.v1B\rResourceProtoP\x01Z*go.opentelemetry.io/proto/otlp/r\ - esource/v1b\x06proto3\ + unt\x18\x02\x20\x01(\rR\x16droppedAttributesCountB\x83\x01\n\"io.opentel\ + emetry.proto.resource.v1B\rResourceProtoP\x01Z*go.opentelemetry.io/proto\ + /otlp/resource/v1\xaa\x02\x1fOpenTelemetry.Proto.Resource.V1b\x06proto3\ "; static file_descriptor_proto_lazy: ::protobuf::rt::LazyV2<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::LazyV2::INIT; diff -Nru temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/grpcio/trace_config.rs temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/grpcio/trace_config.rs --- temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/grpcio/trace_config.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/grpcio/trace_config.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,1113 +0,0 @@ -// This file is generated by rust-protobuf 2.27.1. Do not edit -// @generated - -// https://github.com/rust-lang/rust-clippy/issues/702 -#![allow(unknown_lints)] -#![allow(clippy::all)] - -#![allow(unused_attributes)] -#![cfg_attr(rustfmt, rustfmt::skip)] - -#![allow(box_pointers)] -#![allow(dead_code)] -#![allow(missing_docs)] -#![allow(non_camel_case_types)] -#![allow(non_snake_case)] -#![allow(non_upper_case_globals)] -#![allow(trivial_casts)] -#![allow(unused_imports)] -#![allow(unused_results)] -//! Generated file from `opentelemetry/proto/trace/v1/trace_config.proto` - -/// Generated files are compatible only with the same version -/// of protobuf runtime. -// const _PROTOBUF_VERSION_CHECK: () = ::protobuf::VERSION_2_27_1; - -#[derive(PartialEq,Clone,Default)] -#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))] -pub struct TraceConfig { - // message fields - pub max_number_of_attributes: i64, - pub max_number_of_timed_events: i64, - pub max_number_of_attributes_per_timed_event: i64, - pub max_number_of_links: i64, - pub max_number_of_attributes_per_link: i64, - // message oneof groups - pub sampler: ::std::option::Option, - // special fields - #[cfg_attr(feature = "with-serde", serde(skip))] - pub unknown_fields: ::protobuf::UnknownFields, - #[cfg_attr(feature = "with-serde", serde(skip))] - pub cached_size: ::protobuf::CachedSize, -} - -impl<'a> ::std::default::Default for &'a TraceConfig { - fn default() -> &'a TraceConfig { - ::default_instance() - } -} - -#[derive(Clone,PartialEq,Debug)] -#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))] -pub enum TraceConfig_oneof_sampler { - constant_sampler(ConstantSampler), - trace_id_ratio_based(TraceIdRatioBased), - rate_limiting_sampler(RateLimitingSampler), -} - -impl TraceConfig { - pub fn new() -> TraceConfig { - ::std::default::Default::default() - } - - // .opentelemetry.proto.trace.v1.ConstantSampler constant_sampler = 1; - - - pub fn get_constant_sampler(&self) -> &ConstantSampler { - match self.sampler { - ::std::option::Option::Some(TraceConfig_oneof_sampler::constant_sampler(ref v)) => v, - _ => ::default_instance(), - } - } - pub fn clear_constant_sampler(&mut self) { - self.sampler = ::std::option::Option::None; - } - - pub fn has_constant_sampler(&self) -> bool { - match self.sampler { - ::std::option::Option::Some(TraceConfig_oneof_sampler::constant_sampler(..)) => true, - _ => false, - } - } - - // Param is passed by value, moved - pub fn set_constant_sampler(&mut self, v: ConstantSampler) { - self.sampler = ::std::option::Option::Some(TraceConfig_oneof_sampler::constant_sampler(v)) - } - - // Mutable pointer to the field. - pub fn mut_constant_sampler(&mut self) -> &mut ConstantSampler { - if let ::std::option::Option::Some(TraceConfig_oneof_sampler::constant_sampler(_)) = self.sampler { - } else { - self.sampler = ::std::option::Option::Some(TraceConfig_oneof_sampler::constant_sampler(ConstantSampler::new())); - } - match self.sampler { - ::std::option::Option::Some(TraceConfig_oneof_sampler::constant_sampler(ref mut v)) => v, - _ => panic!(), - } - } - - // Take field - pub fn take_constant_sampler(&mut self) -> ConstantSampler { - if self.has_constant_sampler() { - match self.sampler.take() { - ::std::option::Option::Some(TraceConfig_oneof_sampler::constant_sampler(v)) => v, - _ => panic!(), - } - } else { - ConstantSampler::new() - } - } - - // .opentelemetry.proto.trace.v1.TraceIdRatioBased trace_id_ratio_based = 2; - - - pub fn get_trace_id_ratio_based(&self) -> &TraceIdRatioBased { - match self.sampler { - ::std::option::Option::Some(TraceConfig_oneof_sampler::trace_id_ratio_based(ref v)) => v, - _ => ::default_instance(), - } - } - pub fn clear_trace_id_ratio_based(&mut self) { - self.sampler = ::std::option::Option::None; - } - - pub fn has_trace_id_ratio_based(&self) -> bool { - match self.sampler { - ::std::option::Option::Some(TraceConfig_oneof_sampler::trace_id_ratio_based(..)) => true, - _ => false, - } - } - - // Param is passed by value, moved - pub fn set_trace_id_ratio_based(&mut self, v: TraceIdRatioBased) { - self.sampler = ::std::option::Option::Some(TraceConfig_oneof_sampler::trace_id_ratio_based(v)) - } - - // Mutable pointer to the field. - pub fn mut_trace_id_ratio_based(&mut self) -> &mut TraceIdRatioBased { - if let ::std::option::Option::Some(TraceConfig_oneof_sampler::trace_id_ratio_based(_)) = self.sampler { - } else { - self.sampler = ::std::option::Option::Some(TraceConfig_oneof_sampler::trace_id_ratio_based(TraceIdRatioBased::new())); - } - match self.sampler { - ::std::option::Option::Some(TraceConfig_oneof_sampler::trace_id_ratio_based(ref mut v)) => v, - _ => panic!(), - } - } - - // Take field - pub fn take_trace_id_ratio_based(&mut self) -> TraceIdRatioBased { - if self.has_trace_id_ratio_based() { - match self.sampler.take() { - ::std::option::Option::Some(TraceConfig_oneof_sampler::trace_id_ratio_based(v)) => v, - _ => panic!(), - } - } else { - TraceIdRatioBased::new() - } - } - - // .opentelemetry.proto.trace.v1.RateLimitingSampler rate_limiting_sampler = 3; - - - pub fn get_rate_limiting_sampler(&self) -> &RateLimitingSampler { - match self.sampler { - ::std::option::Option::Some(TraceConfig_oneof_sampler::rate_limiting_sampler(ref v)) => v, - _ => ::default_instance(), - } - } - pub fn clear_rate_limiting_sampler(&mut self) { - self.sampler = ::std::option::Option::None; - } - - pub fn has_rate_limiting_sampler(&self) -> bool { - match self.sampler { - ::std::option::Option::Some(TraceConfig_oneof_sampler::rate_limiting_sampler(..)) => true, - _ => false, - } - } - - // Param is passed by value, moved - pub fn set_rate_limiting_sampler(&mut self, v: RateLimitingSampler) { - self.sampler = ::std::option::Option::Some(TraceConfig_oneof_sampler::rate_limiting_sampler(v)) - } - - // Mutable pointer to the field. - pub fn mut_rate_limiting_sampler(&mut self) -> &mut RateLimitingSampler { - if let ::std::option::Option::Some(TraceConfig_oneof_sampler::rate_limiting_sampler(_)) = self.sampler { - } else { - self.sampler = ::std::option::Option::Some(TraceConfig_oneof_sampler::rate_limiting_sampler(RateLimitingSampler::new())); - } - match self.sampler { - ::std::option::Option::Some(TraceConfig_oneof_sampler::rate_limiting_sampler(ref mut v)) => v, - _ => panic!(), - } - } - - // Take field - pub fn take_rate_limiting_sampler(&mut self) -> RateLimitingSampler { - if self.has_rate_limiting_sampler() { - match self.sampler.take() { - ::std::option::Option::Some(TraceConfig_oneof_sampler::rate_limiting_sampler(v)) => v, - _ => panic!(), - } - } else { - RateLimitingSampler::new() - } - } - - // int64 max_number_of_attributes = 4; - - - pub fn get_max_number_of_attributes(&self) -> i64 { - self.max_number_of_attributes - } - pub fn clear_max_number_of_attributes(&mut self) { - self.max_number_of_attributes = 0; - } - - // Param is passed by value, moved - pub fn set_max_number_of_attributes(&mut self, v: i64) { - self.max_number_of_attributes = v; - } - - // int64 max_number_of_timed_events = 5; - - - pub fn get_max_number_of_timed_events(&self) -> i64 { - self.max_number_of_timed_events - } - pub fn clear_max_number_of_timed_events(&mut self) { - self.max_number_of_timed_events = 0; - } - - // Param is passed by value, moved - pub fn set_max_number_of_timed_events(&mut self, v: i64) { - self.max_number_of_timed_events = v; - } - - // int64 max_number_of_attributes_per_timed_event = 6; - - - pub fn get_max_number_of_attributes_per_timed_event(&self) -> i64 { - self.max_number_of_attributes_per_timed_event - } - pub fn clear_max_number_of_attributes_per_timed_event(&mut self) { - self.max_number_of_attributes_per_timed_event = 0; - } - - // Param is passed by value, moved - pub fn set_max_number_of_attributes_per_timed_event(&mut self, v: i64) { - self.max_number_of_attributes_per_timed_event = v; - } - - // int64 max_number_of_links = 7; - - - pub fn get_max_number_of_links(&self) -> i64 { - self.max_number_of_links - } - pub fn clear_max_number_of_links(&mut self) { - self.max_number_of_links = 0; - } - - // Param is passed by value, moved - pub fn set_max_number_of_links(&mut self, v: i64) { - self.max_number_of_links = v; - } - - // int64 max_number_of_attributes_per_link = 8; - - - pub fn get_max_number_of_attributes_per_link(&self) -> i64 { - self.max_number_of_attributes_per_link - } - pub fn clear_max_number_of_attributes_per_link(&mut self) { - self.max_number_of_attributes_per_link = 0; - } - - // Param is passed by value, moved - pub fn set_max_number_of_attributes_per_link(&mut self, v: i64) { - self.max_number_of_attributes_per_link = v; - } -} - -impl ::protobuf::Message for TraceConfig { - fn is_initialized(&self) -> bool { - if let Some(TraceConfig_oneof_sampler::constant_sampler(ref v)) = self.sampler { - if !v.is_initialized() { - return false; - } - } - if let Some(TraceConfig_oneof_sampler::trace_id_ratio_based(ref v)) = self.sampler { - if !v.is_initialized() { - return false; - } - } - if let Some(TraceConfig_oneof_sampler::rate_limiting_sampler(ref v)) = self.sampler { - if !v.is_initialized() { - return false; - } - } - true - } - - fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> { - while !is.eof()? { - let (field_number, wire_type) = is.read_tag_unpack()?; - match field_number { - 1 => { - if wire_type != ::protobuf::wire_format::WireTypeLengthDelimited { - return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type)); - } - self.sampler = ::std::option::Option::Some(TraceConfig_oneof_sampler::constant_sampler(is.read_message()?)); - }, - 2 => { - if wire_type != ::protobuf::wire_format::WireTypeLengthDelimited { - return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type)); - } - self.sampler = ::std::option::Option::Some(TraceConfig_oneof_sampler::trace_id_ratio_based(is.read_message()?)); - }, - 3 => { - if wire_type != ::protobuf::wire_format::WireTypeLengthDelimited { - return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type)); - } - self.sampler = ::std::option::Option::Some(TraceConfig_oneof_sampler::rate_limiting_sampler(is.read_message()?)); - }, - 4 => { - if wire_type != ::protobuf::wire_format::WireTypeVarint { - return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type)); - } - let tmp = is.read_int64()?; - self.max_number_of_attributes = tmp; - }, - 5 => { - if wire_type != ::protobuf::wire_format::WireTypeVarint { - return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type)); - } - let tmp = is.read_int64()?; - self.max_number_of_timed_events = tmp; - }, - 6 => { - if wire_type != ::protobuf::wire_format::WireTypeVarint { - return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type)); - } - let tmp = is.read_int64()?; - self.max_number_of_attributes_per_timed_event = tmp; - }, - 7 => { - if wire_type != ::protobuf::wire_format::WireTypeVarint { - return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type)); - } - let tmp = is.read_int64()?; - self.max_number_of_links = tmp; - }, - 8 => { - if wire_type != ::protobuf::wire_format::WireTypeVarint { - return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type)); - } - let tmp = is.read_int64()?; - self.max_number_of_attributes_per_link = tmp; - }, - _ => { - ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?; - }, - }; - } - ::std::result::Result::Ok(()) - } - - // Compute sizes of nested messages - #[allow(unused_variables)] - fn compute_size(&self) -> u32 { - let mut my_size = 0; - if self.max_number_of_attributes != 0 { - my_size += ::protobuf::rt::value_size(4, self.max_number_of_attributes, ::protobuf::wire_format::WireTypeVarint); - } - if self.max_number_of_timed_events != 0 { - my_size += ::protobuf::rt::value_size(5, self.max_number_of_timed_events, ::protobuf::wire_format::WireTypeVarint); - } - if self.max_number_of_attributes_per_timed_event != 0 { - my_size += ::protobuf::rt::value_size(6, self.max_number_of_attributes_per_timed_event, ::protobuf::wire_format::WireTypeVarint); - } - if self.max_number_of_links != 0 { - my_size += ::protobuf::rt::value_size(7, self.max_number_of_links, ::protobuf::wire_format::WireTypeVarint); - } - if self.max_number_of_attributes_per_link != 0 { - my_size += ::protobuf::rt::value_size(8, self.max_number_of_attributes_per_link, ::protobuf::wire_format::WireTypeVarint); - } - if let ::std::option::Option::Some(ref v) = self.sampler { - match v { - &TraceConfig_oneof_sampler::constant_sampler(ref v) => { - let len = v.compute_size(); - my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len; - }, - &TraceConfig_oneof_sampler::trace_id_ratio_based(ref v) => { - let len = v.compute_size(); - my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len; - }, - &TraceConfig_oneof_sampler::rate_limiting_sampler(ref v) => { - let len = v.compute_size(); - my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len; - }, - }; - } - my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields()); - self.cached_size.set(my_size); - my_size - } - - fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> { - if self.max_number_of_attributes != 0 { - os.write_int64(4, self.max_number_of_attributes)?; - } - if self.max_number_of_timed_events != 0 { - os.write_int64(5, self.max_number_of_timed_events)?; - } - if self.max_number_of_attributes_per_timed_event != 0 { - os.write_int64(6, self.max_number_of_attributes_per_timed_event)?; - } - if self.max_number_of_links != 0 { - os.write_int64(7, self.max_number_of_links)?; - } - if self.max_number_of_attributes_per_link != 0 { - os.write_int64(8, self.max_number_of_attributes_per_link)?; - } - if let ::std::option::Option::Some(ref v) = self.sampler { - match v { - &TraceConfig_oneof_sampler::constant_sampler(ref v) => { - os.write_tag(1, ::protobuf::wire_format::WireTypeLengthDelimited)?; - os.write_raw_varint32(v.get_cached_size())?; - v.write_to_with_cached_sizes(os)?; - }, - &TraceConfig_oneof_sampler::trace_id_ratio_based(ref v) => { - os.write_tag(2, ::protobuf::wire_format::WireTypeLengthDelimited)?; - os.write_raw_varint32(v.get_cached_size())?; - v.write_to_with_cached_sizes(os)?; - }, - &TraceConfig_oneof_sampler::rate_limiting_sampler(ref v) => { - os.write_tag(3, ::protobuf::wire_format::WireTypeLengthDelimited)?; - os.write_raw_varint32(v.get_cached_size())?; - v.write_to_with_cached_sizes(os)?; - }, - }; - } - os.write_unknown_fields(self.get_unknown_fields())?; - ::std::result::Result::Ok(()) - } - - fn get_cached_size(&self) -> u32 { - self.cached_size.get() - } - - fn get_unknown_fields(&self) -> &::protobuf::UnknownFields { - &self.unknown_fields - } - - fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields { - &mut self.unknown_fields - } - - fn as_any(&self) -> &dyn (::std::any::Any) { - self as &dyn (::std::any::Any) - } - fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) { - self as &mut dyn (::std::any::Any) - } - fn into_any(self: ::std::boxed::Box) -> ::std::boxed::Box { - self - } - - fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor { - Self::descriptor_static() - } - - fn new() -> TraceConfig { - TraceConfig::new() - } - - fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { - static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT; - descriptor.get(|| { - let mut fields = ::std::vec::Vec::new(); - fields.push(::protobuf::reflect::accessor::make_singular_message_accessor::<_, ConstantSampler>( - "constant_sampler", - TraceConfig::has_constant_sampler, - TraceConfig::get_constant_sampler, - )); - fields.push(::protobuf::reflect::accessor::make_singular_message_accessor::<_, TraceIdRatioBased>( - "trace_id_ratio_based", - TraceConfig::has_trace_id_ratio_based, - TraceConfig::get_trace_id_ratio_based, - )); - fields.push(::protobuf::reflect::accessor::make_singular_message_accessor::<_, RateLimitingSampler>( - "rate_limiting_sampler", - TraceConfig::has_rate_limiting_sampler, - TraceConfig::get_rate_limiting_sampler, - )); - fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeInt64>( - "max_number_of_attributes", - |m: &TraceConfig| { &m.max_number_of_attributes }, - |m: &mut TraceConfig| { &mut m.max_number_of_attributes }, - )); - fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeInt64>( - "max_number_of_timed_events", - |m: &TraceConfig| { &m.max_number_of_timed_events }, - |m: &mut TraceConfig| { &mut m.max_number_of_timed_events }, - )); - fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeInt64>( - "max_number_of_attributes_per_timed_event", - |m: &TraceConfig| { &m.max_number_of_attributes_per_timed_event }, - |m: &mut TraceConfig| { &mut m.max_number_of_attributes_per_timed_event }, - )); - fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeInt64>( - "max_number_of_links", - |m: &TraceConfig| { &m.max_number_of_links }, - |m: &mut TraceConfig| { &mut m.max_number_of_links }, - )); - fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeInt64>( - "max_number_of_attributes_per_link", - |m: &TraceConfig| { &m.max_number_of_attributes_per_link }, - |m: &mut TraceConfig| { &mut m.max_number_of_attributes_per_link }, - )); - ::protobuf::reflect::MessageDescriptor::new_pb_name::( - "TraceConfig", - fields, - file_descriptor_proto() - ) - }) - } - - fn default_instance() -> &'static TraceConfig { - static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; - instance.get(TraceConfig::new) - } -} - -impl ::protobuf::Clear for TraceConfig { - fn clear(&mut self) { - self.sampler = ::std::option::Option::None; - self.sampler = ::std::option::Option::None; - self.sampler = ::std::option::Option::None; - self.max_number_of_attributes = 0; - self.max_number_of_timed_events = 0; - self.max_number_of_attributes_per_timed_event = 0; - self.max_number_of_links = 0; - self.max_number_of_attributes_per_link = 0; - self.unknown_fields.clear(); - } -} - -impl ::std::fmt::Debug for TraceConfig { - fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { - ::protobuf::text_format::fmt(self, f) - } -} - -impl ::protobuf::reflect::ProtobufValue for TraceConfig { - fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { - ::protobuf::reflect::ReflectValueRef::Message(self) - } -} - -#[derive(PartialEq,Clone,Default)] -#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))] -pub struct ConstantSampler { - // message fields - pub decision: ConstantSampler_ConstantDecision, - // special fields - #[cfg_attr(feature = "with-serde", serde(skip))] - pub unknown_fields: ::protobuf::UnknownFields, - #[cfg_attr(feature = "with-serde", serde(skip))] - pub cached_size: ::protobuf::CachedSize, -} - -impl<'a> ::std::default::Default for &'a ConstantSampler { - fn default() -> &'a ConstantSampler { - ::default_instance() - } -} - -impl ConstantSampler { - pub fn new() -> ConstantSampler { - ::std::default::Default::default() - } - - // .opentelemetry.proto.trace.v1.ConstantSampler.ConstantDecision decision = 1; - - - pub fn get_decision(&self) -> ConstantSampler_ConstantDecision { - self.decision - } - pub fn clear_decision(&mut self) { - self.decision = ConstantSampler_ConstantDecision::ALWAYS_OFF; - } - - // Param is passed by value, moved - pub fn set_decision(&mut self, v: ConstantSampler_ConstantDecision) { - self.decision = v; - } -} - -impl ::protobuf::Message for ConstantSampler { - fn is_initialized(&self) -> bool { - true - } - - fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> { - while !is.eof()? { - let (field_number, wire_type) = is.read_tag_unpack()?; - match field_number { - 1 => { - ::protobuf::rt::read_proto3_enum_with_unknown_fields_into(wire_type, is, &mut self.decision, 1, &mut self.unknown_fields)? - }, - _ => { - ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?; - }, - }; - } - ::std::result::Result::Ok(()) - } - - // Compute sizes of nested messages - #[allow(unused_variables)] - fn compute_size(&self) -> u32 { - let mut my_size = 0; - if self.decision != ConstantSampler_ConstantDecision::ALWAYS_OFF { - my_size += ::protobuf::rt::enum_size(1, self.decision); - } - my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields()); - self.cached_size.set(my_size); - my_size - } - - fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> { - if self.decision != ConstantSampler_ConstantDecision::ALWAYS_OFF { - os.write_enum(1, ::protobuf::ProtobufEnum::value(&self.decision))?; - } - os.write_unknown_fields(self.get_unknown_fields())?; - ::std::result::Result::Ok(()) - } - - fn get_cached_size(&self) -> u32 { - self.cached_size.get() - } - - fn get_unknown_fields(&self) -> &::protobuf::UnknownFields { - &self.unknown_fields - } - - fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields { - &mut self.unknown_fields - } - - fn as_any(&self) -> &dyn (::std::any::Any) { - self as &dyn (::std::any::Any) - } - fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) { - self as &mut dyn (::std::any::Any) - } - fn into_any(self: ::std::boxed::Box) -> ::std::boxed::Box { - self - } - - fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor { - Self::descriptor_static() - } - - fn new() -> ConstantSampler { - ConstantSampler::new() - } - - fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { - static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT; - descriptor.get(|| { - let mut fields = ::std::vec::Vec::new(); - fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeEnum>( - "decision", - |m: &ConstantSampler| { &m.decision }, - |m: &mut ConstantSampler| { &mut m.decision }, - )); - ::protobuf::reflect::MessageDescriptor::new_pb_name::( - "ConstantSampler", - fields, - file_descriptor_proto() - ) - }) - } - - fn default_instance() -> &'static ConstantSampler { - static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; - instance.get(ConstantSampler::new) - } -} - -impl ::protobuf::Clear for ConstantSampler { - fn clear(&mut self) { - self.decision = ConstantSampler_ConstantDecision::ALWAYS_OFF; - self.unknown_fields.clear(); - } -} - -impl ::std::fmt::Debug for ConstantSampler { - fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { - ::protobuf::text_format::fmt(self, f) - } -} - -impl ::protobuf::reflect::ProtobufValue for ConstantSampler { - fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { - ::protobuf::reflect::ReflectValueRef::Message(self) - } -} - -#[derive(Clone,PartialEq,Eq,Debug,Hash)] -#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))] -pub enum ConstantSampler_ConstantDecision { - ALWAYS_OFF = 0, - ALWAYS_ON = 1, - ALWAYS_PARENT = 2, -} - -impl ::protobuf::ProtobufEnum for ConstantSampler_ConstantDecision { - fn value(&self) -> i32 { - *self as i32 - } - - fn from_i32(value: i32) -> ::std::option::Option { - match value { - 0 => ::std::option::Option::Some(ConstantSampler_ConstantDecision::ALWAYS_OFF), - 1 => ::std::option::Option::Some(ConstantSampler_ConstantDecision::ALWAYS_ON), - 2 => ::std::option::Option::Some(ConstantSampler_ConstantDecision::ALWAYS_PARENT), - _ => ::std::option::Option::None - } - } - - fn values() -> &'static [Self] { - static values: &'static [ConstantSampler_ConstantDecision] = &[ - ConstantSampler_ConstantDecision::ALWAYS_OFF, - ConstantSampler_ConstantDecision::ALWAYS_ON, - ConstantSampler_ConstantDecision::ALWAYS_PARENT, - ]; - values - } - - fn enum_descriptor_static() -> &'static ::protobuf::reflect::EnumDescriptor { - static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::EnumDescriptor> = ::protobuf::rt::LazyV2::INIT; - descriptor.get(|| { - ::protobuf::reflect::EnumDescriptor::new_pb_name::("ConstantSampler.ConstantDecision", file_descriptor_proto()) - }) - } -} - -impl ::std::marker::Copy for ConstantSampler_ConstantDecision { -} - -impl ::std::default::Default for ConstantSampler_ConstantDecision { - fn default() -> Self { - ConstantSampler_ConstantDecision::ALWAYS_OFF - } -} - -impl ::protobuf::reflect::ProtobufValue for ConstantSampler_ConstantDecision { - fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { - ::protobuf::reflect::ReflectValueRef::Enum(::protobuf::ProtobufEnum::descriptor(self)) - } -} - -#[derive(PartialEq,Clone,Default)] -#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))] -pub struct TraceIdRatioBased { - // message fields - pub samplingRatio: f64, - // special fields - #[cfg_attr(feature = "with-serde", serde(skip))] - pub unknown_fields: ::protobuf::UnknownFields, - #[cfg_attr(feature = "with-serde", serde(skip))] - pub cached_size: ::protobuf::CachedSize, -} - -impl<'a> ::std::default::Default for &'a TraceIdRatioBased { - fn default() -> &'a TraceIdRatioBased { - ::default_instance() - } -} - -impl TraceIdRatioBased { - pub fn new() -> TraceIdRatioBased { - ::std::default::Default::default() - } - - // double samplingRatio = 1; - - - pub fn get_samplingRatio(&self) -> f64 { - self.samplingRatio - } - pub fn clear_samplingRatio(&mut self) { - self.samplingRatio = 0.; - } - - // Param is passed by value, moved - pub fn set_samplingRatio(&mut self, v: f64) { - self.samplingRatio = v; - } -} - -impl ::protobuf::Message for TraceIdRatioBased { - fn is_initialized(&self) -> bool { - true - } - - fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> { - while !is.eof()? { - let (field_number, wire_type) = is.read_tag_unpack()?; - match field_number { - 1 => { - if wire_type != ::protobuf::wire_format::WireTypeFixed64 { - return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type)); - } - let tmp = is.read_double()?; - self.samplingRatio = tmp; - }, - _ => { - ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?; - }, - }; - } - ::std::result::Result::Ok(()) - } - - // Compute sizes of nested messages - #[allow(unused_variables)] - fn compute_size(&self) -> u32 { - let mut my_size = 0; - if self.samplingRatio != 0. { - my_size += 9; - } - my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields()); - self.cached_size.set(my_size); - my_size - } - - fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> { - if self.samplingRatio != 0. { - os.write_double(1, self.samplingRatio)?; - } - os.write_unknown_fields(self.get_unknown_fields())?; - ::std::result::Result::Ok(()) - } - - fn get_cached_size(&self) -> u32 { - self.cached_size.get() - } - - fn get_unknown_fields(&self) -> &::protobuf::UnknownFields { - &self.unknown_fields - } - - fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields { - &mut self.unknown_fields - } - - fn as_any(&self) -> &dyn (::std::any::Any) { - self as &dyn (::std::any::Any) - } - fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) { - self as &mut dyn (::std::any::Any) - } - fn into_any(self: ::std::boxed::Box) -> ::std::boxed::Box { - self - } - - fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor { - Self::descriptor_static() - } - - fn new() -> TraceIdRatioBased { - TraceIdRatioBased::new() - } - - fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { - static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT; - descriptor.get(|| { - let mut fields = ::std::vec::Vec::new(); - fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeDouble>( - "samplingRatio", - |m: &TraceIdRatioBased| { &m.samplingRatio }, - |m: &mut TraceIdRatioBased| { &mut m.samplingRatio }, - )); - ::protobuf::reflect::MessageDescriptor::new_pb_name::( - "TraceIdRatioBased", - fields, - file_descriptor_proto() - ) - }) - } - - fn default_instance() -> &'static TraceIdRatioBased { - static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; - instance.get(TraceIdRatioBased::new) - } -} - -impl ::protobuf::Clear for TraceIdRatioBased { - fn clear(&mut self) { - self.samplingRatio = 0.; - self.unknown_fields.clear(); - } -} - -impl ::std::fmt::Debug for TraceIdRatioBased { - fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { - ::protobuf::text_format::fmt(self, f) - } -} - -impl ::protobuf::reflect::ProtobufValue for TraceIdRatioBased { - fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { - ::protobuf::reflect::ReflectValueRef::Message(self) - } -} - -#[derive(PartialEq,Clone,Default)] -#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))] -pub struct RateLimitingSampler { - // message fields - pub qps: i64, - // special fields - #[cfg_attr(feature = "with-serde", serde(skip))] - pub unknown_fields: ::protobuf::UnknownFields, - #[cfg_attr(feature = "with-serde", serde(skip))] - pub cached_size: ::protobuf::CachedSize, -} - -impl<'a> ::std::default::Default for &'a RateLimitingSampler { - fn default() -> &'a RateLimitingSampler { - ::default_instance() - } -} - -impl RateLimitingSampler { - pub fn new() -> RateLimitingSampler { - ::std::default::Default::default() - } - - // int64 qps = 1; - - - pub fn get_qps(&self) -> i64 { - self.qps - } - pub fn clear_qps(&mut self) { - self.qps = 0; - } - - // Param is passed by value, moved - pub fn set_qps(&mut self, v: i64) { - self.qps = v; - } -} - -impl ::protobuf::Message for RateLimitingSampler { - fn is_initialized(&self) -> bool { - true - } - - fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> { - while !is.eof()? { - let (field_number, wire_type) = is.read_tag_unpack()?; - match field_number { - 1 => { - if wire_type != ::protobuf::wire_format::WireTypeVarint { - return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type)); - } - let tmp = is.read_int64()?; - self.qps = tmp; - }, - _ => { - ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?; - }, - }; - } - ::std::result::Result::Ok(()) - } - - // Compute sizes of nested messages - #[allow(unused_variables)] - fn compute_size(&self) -> u32 { - let mut my_size = 0; - if self.qps != 0 { - my_size += ::protobuf::rt::value_size(1, self.qps, ::protobuf::wire_format::WireTypeVarint); - } - my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields()); - self.cached_size.set(my_size); - my_size - } - - fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> { - if self.qps != 0 { - os.write_int64(1, self.qps)?; - } - os.write_unknown_fields(self.get_unknown_fields())?; - ::std::result::Result::Ok(()) - } - - fn get_cached_size(&self) -> u32 { - self.cached_size.get() - } - - fn get_unknown_fields(&self) -> &::protobuf::UnknownFields { - &self.unknown_fields - } - - fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields { - &mut self.unknown_fields - } - - fn as_any(&self) -> &dyn (::std::any::Any) { - self as &dyn (::std::any::Any) - } - fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) { - self as &mut dyn (::std::any::Any) - } - fn into_any(self: ::std::boxed::Box) -> ::std::boxed::Box { - self - } - - fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor { - Self::descriptor_static() - } - - fn new() -> RateLimitingSampler { - RateLimitingSampler::new() - } - - fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { - static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT; - descriptor.get(|| { - let mut fields = ::std::vec::Vec::new(); - fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeInt64>( - "qps", - |m: &RateLimitingSampler| { &m.qps }, - |m: &mut RateLimitingSampler| { &mut m.qps }, - )); - ::protobuf::reflect::MessageDescriptor::new_pb_name::( - "RateLimitingSampler", - fields, - file_descriptor_proto() - ) - }) - } - - fn default_instance() -> &'static RateLimitingSampler { - static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; - instance.get(RateLimitingSampler::new) - } -} - -impl ::protobuf::Clear for RateLimitingSampler { - fn clear(&mut self) { - self.qps = 0; - self.unknown_fields.clear(); - } -} - -impl ::std::fmt::Debug for RateLimitingSampler { - fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { - ::protobuf::text_format::fmt(self, f) - } -} - -impl ::protobuf::reflect::ProtobufValue for RateLimitingSampler { - fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { - ::protobuf::reflect::ReflectValueRef::Message(self) - } -} - -static file_descriptor_proto_data: &'static [u8] = b"\ - \n/opentelemetry/proto/trace/v1/trace_config.proto\x12\x1copentelemetry.\ - proto.trace.v1\"\x84\x05\n\x0bTraceConfig\x12Z\n\x10constant_sampler\x18\ - \x01\x20\x01(\x0b2-.opentelemetry.proto.trace.v1.ConstantSamplerH\0R\x0f\ - constantSampler\x12b\n\x14trace_id_ratio_based\x18\x02\x20\x01(\x0b2/.op\ - entelemetry.proto.trace.v1.TraceIdRatioBasedH\0R\x11traceIdRatioBased\ - \x12g\n\x15rate_limiting_sampler\x18\x03\x20\x01(\x0b21.opentelemetry.pr\ - oto.trace.v1.RateLimitingSamplerH\0R\x13rateLimitingSampler\x127\n\x18ma\ - x_number_of_attributes\x18\x04\x20\x01(\x03R\x15maxNumberOfAttributes\ - \x12:\n\x1amax_number_of_timed_events\x18\x05\x20\x01(\x03R\x16maxNumber\ - OfTimedEvents\x12T\n(max_number_of_attributes_per_timed_event\x18\x06\ - \x20\x01(\x03R\"maxNumberOfAttributesPerTimedEvent\x12-\n\x13max_number_\ - of_links\x18\x07\x20\x01(\x03R\x10maxNumberOfLinks\x12G\n!max_number_of_\ - attributes_per_link\x18\x08\x20\x01(\x03R\x1cmaxNumberOfAttributesPerLin\ - kB\t\n\x07sampler\"\xb3\x01\n\x0fConstantSampler\x12Z\n\x08decision\x18\ - \x01\x20\x01(\x0e2>.opentelemetry.proto.trace.v1.ConstantSampler.Constan\ - tDecisionR\x08decision\"D\n\x10ConstantDecision\x12\x0e\n\nALWAYS_OFF\ - \x10\0\x12\r\n\tALWAYS_ON\x10\x01\x12\x11\n\rALWAYS_PARENT\x10\x02\"9\n\ - \x11TraceIdRatioBased\x12$\n\rsamplingRatio\x18\x01\x20\x01(\x01R\rsampl\ - ingRatio\"'\n\x13RateLimitingSampler\x12\x10\n\x03qps\x18\x01\x20\x01(\ - \x03R\x03qpsBh\n\x1fio.opentelemetry.proto.trace.v1B\x10TraceConfigProto\ - P\x01Z1go.opentelemetry.io/proto/otlp/collector/trace/v1b\x06proto3\ -"; - -static file_descriptor_proto_lazy: ::protobuf::rt::LazyV2<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::LazyV2::INIT; - -fn parse_descriptor_proto() -> ::protobuf::descriptor::FileDescriptorProto { - ::protobuf::Message::parse_from_bytes(file_descriptor_proto_data).unwrap() -} - -pub fn file_descriptor_proto() -> &'static ::protobuf::descriptor::FileDescriptorProto { - file_descriptor_proto_lazy.get(|| { - parse_descriptor_proto() - }) -} diff -Nru temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/grpcio/trace.rs temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/grpcio/trace.rs --- temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/grpcio/trace.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/grpcio/trace.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,4 +1,4 @@ -// This file is generated by rust-protobuf 2.27.1. Do not edit +// This file is generated by rust-protobuf 2.28.0. Do not edit // @generated // https://github.com/rust-lang/rust-clippy/issues/702 @@ -21,7 +21,7 @@ /// Generated files are compatible only with the same version /// of protobuf runtime. -// const _PROTOBUF_VERSION_CHECK: () = ::protobuf::VERSION_2_27_1; +// const _PROTOBUF_VERSION_CHECK: () = ::protobuf::VERSION_2_28_0; #[derive(PartialEq,Clone,Default)] #[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))] @@ -197,7 +197,7 @@ pub struct ResourceSpans { // message fields pub resource: ::protobuf::SingularPtrField, - pub instrumentation_library_spans: ::protobuf::RepeatedField, + pub scope_spans: ::protobuf::RepeatedField, pub schema_url: ::std::string::String, // special fields #[cfg_attr(feature = "with-serde", serde(skip))] @@ -250,29 +250,29 @@ self.resource.take().unwrap_or_else(|| super::resource::Resource::new()) } - // repeated .opentelemetry.proto.trace.v1.InstrumentationLibrarySpans instrumentation_library_spans = 2; + // repeated .opentelemetry.proto.trace.v1.ScopeSpans scope_spans = 2; - pub fn get_instrumentation_library_spans(&self) -> &[InstrumentationLibrarySpans] { - &self.instrumentation_library_spans + pub fn get_scope_spans(&self) -> &[ScopeSpans] { + &self.scope_spans } - pub fn clear_instrumentation_library_spans(&mut self) { - self.instrumentation_library_spans.clear(); + pub fn clear_scope_spans(&mut self) { + self.scope_spans.clear(); } // Param is passed by value, moved - pub fn set_instrumentation_library_spans(&mut self, v: ::protobuf::RepeatedField) { - self.instrumentation_library_spans = v; + pub fn set_scope_spans(&mut self, v: ::protobuf::RepeatedField) { + self.scope_spans = v; } // Mutable pointer to the field. - pub fn mut_instrumentation_library_spans(&mut self) -> &mut ::protobuf::RepeatedField { - &mut self.instrumentation_library_spans + pub fn mut_scope_spans(&mut self) -> &mut ::protobuf::RepeatedField { + &mut self.scope_spans } // Take field - pub fn take_instrumentation_library_spans(&mut self) -> ::protobuf::RepeatedField { - ::std::mem::replace(&mut self.instrumentation_library_spans, ::protobuf::RepeatedField::new()) + pub fn take_scope_spans(&mut self) -> ::protobuf::RepeatedField { + ::std::mem::replace(&mut self.scope_spans, ::protobuf::RepeatedField::new()) } // string schema_url = 3; @@ -309,7 +309,7 @@ return false; } }; - for v in &self.instrumentation_library_spans { + for v in &self.scope_spans { if !v.is_initialized() { return false; } @@ -325,7 +325,7 @@ ::protobuf::rt::read_singular_message_into(wire_type, is, &mut self.resource)?; }, 2 => { - ::protobuf::rt::read_repeated_message_into(wire_type, is, &mut self.instrumentation_library_spans)?; + ::protobuf::rt::read_repeated_message_into(wire_type, is, &mut self.scope_spans)?; }, 3 => { ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.schema_url)?; @@ -346,7 +346,7 @@ let len = v.compute_size(); my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len; } - for value in &self.instrumentation_library_spans { + for value in &self.scope_spans { let len = value.compute_size(); my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len; }; @@ -364,7 +364,7 @@ os.write_raw_varint32(v.get_cached_size())?; v.write_to_with_cached_sizes(os)?; } - for v in &self.instrumentation_library_spans { + for v in &self.scope_spans { os.write_tag(2, ::protobuf::wire_format::WireTypeLengthDelimited)?; os.write_raw_varint32(v.get_cached_size())?; v.write_to_with_cached_sizes(os)?; @@ -415,10 +415,10 @@ |m: &ResourceSpans| { &m.resource }, |m: &mut ResourceSpans| { &mut m.resource }, )); - fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage>( - "instrumentation_library_spans", - |m: &ResourceSpans| { &m.instrumentation_library_spans }, - |m: &mut ResourceSpans| { &mut m.instrumentation_library_spans }, + fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage>( + "scope_spans", + |m: &ResourceSpans| { &m.scope_spans }, + |m: &mut ResourceSpans| { &mut m.scope_spans }, )); fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( "schema_url", @@ -442,7 +442,7 @@ impl ::protobuf::Clear for ResourceSpans { fn clear(&mut self) { self.resource.clear(); - self.instrumentation_library_spans.clear(); + self.scope_spans.clear(); self.schema_url.clear(); self.unknown_fields.clear(); } @@ -462,9 +462,9 @@ #[derive(PartialEq,Clone,Default)] #[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))] -pub struct InstrumentationLibrarySpans { +pub struct ScopeSpans { // message fields - pub instrumentation_library: ::protobuf::SingularPtrField, + pub scope: ::protobuf::SingularPtrField, pub spans: ::protobuf::RepeatedField, pub schema_url: ::std::string::String, // special fields @@ -474,48 +474,48 @@ pub cached_size: ::protobuf::CachedSize, } -impl<'a> ::std::default::Default for &'a InstrumentationLibrarySpans { - fn default() -> &'a InstrumentationLibrarySpans { - ::default_instance() +impl<'a> ::std::default::Default for &'a ScopeSpans { + fn default() -> &'a ScopeSpans { + ::default_instance() } } -impl InstrumentationLibrarySpans { - pub fn new() -> InstrumentationLibrarySpans { +impl ScopeSpans { + pub fn new() -> ScopeSpans { ::std::default::Default::default() } - // .opentelemetry.proto.common.v1.InstrumentationLibrary instrumentation_library = 1; + // .opentelemetry.proto.common.v1.InstrumentationScope scope = 1; - pub fn get_instrumentation_library(&self) -> &super::common::InstrumentationLibrary { - self.instrumentation_library.as_ref().unwrap_or_else(|| ::default_instance()) + pub fn get_scope(&self) -> &super::common::InstrumentationScope { + self.scope.as_ref().unwrap_or_else(|| ::default_instance()) } - pub fn clear_instrumentation_library(&mut self) { - self.instrumentation_library.clear(); + pub fn clear_scope(&mut self) { + self.scope.clear(); } - pub fn has_instrumentation_library(&self) -> bool { - self.instrumentation_library.is_some() + pub fn has_scope(&self) -> bool { + self.scope.is_some() } // Param is passed by value, moved - pub fn set_instrumentation_library(&mut self, v: super::common::InstrumentationLibrary) { - self.instrumentation_library = ::protobuf::SingularPtrField::some(v); + pub fn set_scope(&mut self, v: super::common::InstrumentationScope) { + self.scope = ::protobuf::SingularPtrField::some(v); } // Mutable pointer to the field. // If field is not initialized, it is initialized with default value first. - pub fn mut_instrumentation_library(&mut self) -> &mut super::common::InstrumentationLibrary { - if self.instrumentation_library.is_none() { - self.instrumentation_library.set_default(); + pub fn mut_scope(&mut self) -> &mut super::common::InstrumentationScope { + if self.scope.is_none() { + self.scope.set_default(); } - self.instrumentation_library.as_mut().unwrap() + self.scope.as_mut().unwrap() } // Take field - pub fn take_instrumentation_library(&mut self) -> super::common::InstrumentationLibrary { - self.instrumentation_library.take().unwrap_or_else(|| super::common::InstrumentationLibrary::new()) + pub fn take_scope(&mut self) -> super::common::InstrumentationScope { + self.scope.take().unwrap_or_else(|| super::common::InstrumentationScope::new()) } // repeated .opentelemetry.proto.trace.v1.Span spans = 2; @@ -570,9 +570,9 @@ } } -impl ::protobuf::Message for InstrumentationLibrarySpans { +impl ::protobuf::Message for ScopeSpans { fn is_initialized(&self) -> bool { - for v in &self.instrumentation_library { + for v in &self.scope { if !v.is_initialized() { return false; } @@ -590,7 +590,7 @@ let (field_number, wire_type) = is.read_tag_unpack()?; match field_number { 1 => { - ::protobuf::rt::read_singular_message_into(wire_type, is, &mut self.instrumentation_library)?; + ::protobuf::rt::read_singular_message_into(wire_type, is, &mut self.scope)?; }, 2 => { ::protobuf::rt::read_repeated_message_into(wire_type, is, &mut self.spans)?; @@ -610,7 +610,7 @@ #[allow(unused_variables)] fn compute_size(&self) -> u32 { let mut my_size = 0; - if let Some(ref v) = self.instrumentation_library.as_ref() { + if let Some(ref v) = self.scope.as_ref() { let len = v.compute_size(); my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len; } @@ -627,7 +627,7 @@ } fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> { - if let Some(ref v) = self.instrumentation_library.as_ref() { + if let Some(ref v) = self.scope.as_ref() { os.write_tag(1, ::protobuf::wire_format::WireTypeLengthDelimited)?; os.write_raw_varint32(v.get_cached_size())?; v.write_to_with_cached_sizes(os)?; @@ -670,59 +670,59 @@ Self::descriptor_static() } - fn new() -> InstrumentationLibrarySpans { - InstrumentationLibrarySpans::new() + fn new() -> ScopeSpans { + ScopeSpans::new() } fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT; descriptor.get(|| { let mut fields = ::std::vec::Vec::new(); - fields.push(::protobuf::reflect::accessor::make_singular_ptr_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage>( - "instrumentation_library", - |m: &InstrumentationLibrarySpans| { &m.instrumentation_library }, - |m: &mut InstrumentationLibrarySpans| { &mut m.instrumentation_library }, + fields.push(::protobuf::reflect::accessor::make_singular_ptr_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage>( + "scope", + |m: &ScopeSpans| { &m.scope }, + |m: &mut ScopeSpans| { &mut m.scope }, )); fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage>( "spans", - |m: &InstrumentationLibrarySpans| { &m.spans }, - |m: &mut InstrumentationLibrarySpans| { &mut m.spans }, + |m: &ScopeSpans| { &m.spans }, + |m: &mut ScopeSpans| { &mut m.spans }, )); fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( "schema_url", - |m: &InstrumentationLibrarySpans| { &m.schema_url }, - |m: &mut InstrumentationLibrarySpans| { &mut m.schema_url }, + |m: &ScopeSpans| { &m.schema_url }, + |m: &mut ScopeSpans| { &mut m.schema_url }, )); - ::protobuf::reflect::MessageDescriptor::new_pb_name::( - "InstrumentationLibrarySpans", + ::protobuf::reflect::MessageDescriptor::new_pb_name::( + "ScopeSpans", fields, file_descriptor_proto() ) }) } - fn default_instance() -> &'static InstrumentationLibrarySpans { - static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; - instance.get(InstrumentationLibrarySpans::new) + fn default_instance() -> &'static ScopeSpans { + static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; + instance.get(ScopeSpans::new) } } -impl ::protobuf::Clear for InstrumentationLibrarySpans { +impl ::protobuf::Clear for ScopeSpans { fn clear(&mut self) { - self.instrumentation_library.clear(); + self.scope.clear(); self.spans.clear(); self.schema_url.clear(); self.unknown_fields.clear(); } } -impl ::std::fmt::Debug for InstrumentationLibrarySpans { +impl ::std::fmt::Debug for ScopeSpans { fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { ::protobuf::text_format::fmt(self, f) } } -impl ::protobuf::reflect::ProtobufValue for InstrumentationLibrarySpans { +impl ::protobuf::reflect::ProtobufValue for ScopeSpans { fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { ::protobuf::reflect::ReflectValueRef::Message(self) } @@ -2394,50 +2394,50 @@ race.v1\x1a*opentelemetry/proto/common/v1/common.proto\x1a.opentelemetry\ /proto/resource/v1/resource.proto\"`\n\nTracesData\x12R\n\x0eresource_sp\ ans\x18\x01\x20\x03(\x0b2+.opentelemetry.proto.trace.v1.ResourceSpansR\r\ - resourceSpans\"\xf4\x01\n\rResourceSpans\x12E\n\x08resource\x18\x01\x20\ - \x01(\x0b2).opentelemetry.proto.resource.v1.ResourceR\x08resource\x12}\n\ - \x1dinstrumentation_library_spans\x18\x02\x20\x03(\x0b29.opentelemetry.p\ - roto.trace.v1.InstrumentationLibrarySpansR\x1binstrumentationLibrarySpan\ - s\x12\x1d\n\nschema_url\x18\x03\x20\x01(\tR\tschemaUrl\"\xe6\x01\n\x1bIn\ - strumentationLibrarySpans\x12n\n\x17instrumentation_library\x18\x01\x20\ - \x01(\x0b25.opentelemetry.proto.common.v1.InstrumentationLibraryR\x16ins\ - trumentationLibrary\x128\n\x05spans\x18\x02\x20\x03(\x0b2\".opentelemetr\ - y.proto.trace.v1.SpanR\x05spans\x12\x1d\n\nschema_url\x18\x03\x20\x01(\t\ - R\tschemaUrl\"\x9c\n\n\x04Span\x12\x19\n\x08trace_id\x18\x01\x20\x01(\ - \x0cR\x07traceId\x12\x17\n\x07span_id\x18\x02\x20\x01(\x0cR\x06spanId\ - \x12\x1f\n\x0btrace_state\x18\x03\x20\x01(\tR\ntraceState\x12$\n\x0epare\ - nt_span_id\x18\x04\x20\x01(\x0cR\x0cparentSpanId\x12\x12\n\x04name\x18\ - \x05\x20\x01(\tR\x04name\x12?\n\x04kind\x18\x06\x20\x01(\x0e2+.opentelem\ - etry.proto.trace.v1.Span.SpanKindR\x04kind\x12/\n\x14start_time_unix_nan\ - o\x18\x07\x20\x01(\x06R\x11startTimeUnixNano\x12+\n\x12end_time_unix_nan\ - o\x18\x08\x20\x01(\x06R\x0fendTimeUnixNano\x12G\n\nattributes\x18\t\x20\ + resourceSpans\"\xc8\x01\n\rResourceSpans\x12E\n\x08resource\x18\x01\x20\ + \x01(\x0b2).opentelemetry.proto.resource.v1.ResourceR\x08resource\x12I\n\ + \x0bscope_spans\x18\x02\x20\x03(\x0b2(.opentelemetry.proto.trace.v1.Scop\ + eSpansR\nscopeSpans\x12\x1d\n\nschema_url\x18\x03\x20\x01(\tR\tschemaUrl\ + J\x06\x08\xe8\x07\x10\xe9\x07\"\xb0\x01\n\nScopeSpans\x12I\n\x05scope\ + \x18\x01\x20\x01(\x0b23.opentelemetry.proto.common.v1.InstrumentationSco\ + peR\x05scope\x128\n\x05spans\x18\x02\x20\x03(\x0b2\".opentelemetry.proto\ + .trace.v1.SpanR\x05spans\x12\x1d\n\nschema_url\x18\x03\x20\x01(\tR\tsche\ + maUrl\"\x9c\n\n\x04Span\x12\x19\n\x08trace_id\x18\x01\x20\x01(\x0cR\x07t\ + raceId\x12\x17\n\x07span_id\x18\x02\x20\x01(\x0cR\x06spanId\x12\x1f\n\ + \x0btrace_state\x18\x03\x20\x01(\tR\ntraceState\x12$\n\x0eparent_span_id\ + \x18\x04\x20\x01(\x0cR\x0cparentSpanId\x12\x12\n\x04name\x18\x05\x20\x01\ + (\tR\x04name\x12?\n\x04kind\x18\x06\x20\x01(\x0e2+.opentelemetry.proto.t\ + race.v1.Span.SpanKindR\x04kind\x12/\n\x14start_time_unix_nano\x18\x07\ + \x20\x01(\x06R\x11startTimeUnixNano\x12+\n\x12end_time_unix_nano\x18\x08\ + \x20\x01(\x06R\x0fendTimeUnixNano\x12G\n\nattributes\x18\t\x20\x03(\x0b2\ + '.opentelemetry.proto.common.v1.KeyValueR\nattributes\x128\n\x18dropped_\ + attributes_count\x18\n\x20\x01(\rR\x16droppedAttributesCount\x12@\n\x06e\ + vents\x18\x0b\x20\x03(\x0b2(.opentelemetry.proto.trace.v1.Span.EventR\ + \x06events\x120\n\x14dropped_events_count\x18\x0c\x20\x01(\rR\x12dropped\ + EventsCount\x12=\n\x05links\x18\r\x20\x03(\x0b2'.opentelemetry.proto.tra\ + ce.v1.Span.LinkR\x05links\x12.\n\x13dropped_links_count\x18\x0e\x20\x01(\ + \rR\x11droppedLinksCount\x12<\n\x06status\x18\x0f\x20\x01(\x0b2$.opentel\ + emetry.proto.trace.v1.StatusR\x06status\x1a\xc4\x01\n\x05Event\x12$\n\ + \x0etime_unix_nano\x18\x01\x20\x01(\x06R\x0ctimeUnixNano\x12\x12\n\x04na\ + me\x18\x02\x20\x01(\tR\x04name\x12G\n\nattributes\x18\x03\x20\x03(\x0b2'\ + .opentelemetry.proto.common.v1.KeyValueR\nattributes\x128\n\x18dropped_a\ + ttributes_count\x18\x04\x20\x01(\rR\x16droppedAttributesCount\x1a\xde\ + \x01\n\x04Link\x12\x19\n\x08trace_id\x18\x01\x20\x01(\x0cR\x07traceId\ + \x12\x17\n\x07span_id\x18\x02\x20\x01(\x0cR\x06spanId\x12\x1f\n\x0btrace\ + _state\x18\x03\x20\x01(\tR\ntraceState\x12G\n\nattributes\x18\x04\x20\ \x03(\x0b2'.opentelemetry.proto.common.v1.KeyValueR\nattributes\x128\n\ - \x18dropped_attributes_count\x18\n\x20\x01(\rR\x16droppedAttributesCount\ - \x12@\n\x06events\x18\x0b\x20\x03(\x0b2(.opentelemetry.proto.trace.v1.Sp\ - an.EventR\x06events\x120\n\x14dropped_events_count\x18\x0c\x20\x01(\rR\ - \x12droppedEventsCount\x12=\n\x05links\x18\r\x20\x03(\x0b2'.opentelemetr\ - y.proto.trace.v1.Span.LinkR\x05links\x12.\n\x13dropped_links_count\x18\ - \x0e\x20\x01(\rR\x11droppedLinksCount\x12<\n\x06status\x18\x0f\x20\x01(\ - \x0b2$.opentelemetry.proto.trace.v1.StatusR\x06status\x1a\xc4\x01\n\x05E\ - vent\x12$\n\x0etime_unix_nano\x18\x01\x20\x01(\x06R\x0ctimeUnixNano\x12\ - \x12\n\x04name\x18\x02\x20\x01(\tR\x04name\x12G\n\nattributes\x18\x03\ - \x20\x03(\x0b2'.opentelemetry.proto.common.v1.KeyValueR\nattributes\x128\ - \n\x18dropped_attributes_count\x18\x04\x20\x01(\rR\x16droppedAttributesC\ - ount\x1a\xde\x01\n\x04Link\x12\x19\n\x08trace_id\x18\x01\x20\x01(\x0cR\ - \x07traceId\x12\x17\n\x07span_id\x18\x02\x20\x01(\x0cR\x06spanId\x12\x1f\ - \n\x0btrace_state\x18\x03\x20\x01(\tR\ntraceState\x12G\n\nattributes\x18\ - \x04\x20\x03(\x0b2'.opentelemetry.proto.common.v1.KeyValueR\nattributes\ - \x128\n\x18dropped_attributes_count\x18\x05\x20\x01(\rR\x16droppedAttrib\ - utesCount\"\x99\x01\n\x08SpanKind\x12\x19\n\x15SPAN_KIND_UNSPECIFIED\x10\ - \0\x12\x16\n\x12SPAN_KIND_INTERNAL\x10\x01\x12\x14\n\x10SPAN_KIND_SERVER\ - \x10\x02\x12\x14\n\x10SPAN_KIND_CLIENT\x10\x03\x12\x16\n\x12SPAN_KIND_PR\ - ODUCER\x10\x04\x12\x16\n\x12SPAN_KIND_CONSUMER\x10\x05\"\xbd\x01\n\x06St\ - atus\x12\x18\n\x07message\x18\x02\x20\x01(\tR\x07message\x12C\n\x04code\ - \x18\x03\x20\x01(\x0e2/.opentelemetry.proto.trace.v1.Status.StatusCodeR\ - \x04code\"N\n\nStatusCode\x12\x15\n\x11STATUS_CODE_UNSET\x10\0\x12\x12\n\ - \x0eSTATUS_CODE_OK\x10\x01\x12\x15\n\x11STATUS_CODE_ERROR\x10\x02J\x04\ - \x08\x01\x10\x02BX\n\x1fio.opentelemetry.proto.trace.v1B\nTraceProtoP\ - \x01Z'go.opentelemetry.io/proto/otlp/trace/v1b\x06proto3\ + \x18dropped_attributes_count\x18\x05\x20\x01(\rR\x16droppedAttributesCou\ + nt\"\x99\x01\n\x08SpanKind\x12\x19\n\x15SPAN_KIND_UNSPECIFIED\x10\0\x12\ + \x16\n\x12SPAN_KIND_INTERNAL\x10\x01\x12\x14\n\x10SPAN_KIND_SERVER\x10\ + \x02\x12\x14\n\x10SPAN_KIND_CLIENT\x10\x03\x12\x16\n\x12SPAN_KIND_PRODUC\ + ER\x10\x04\x12\x16\n\x12SPAN_KIND_CONSUMER\x10\x05\"\xbd\x01\n\x06Status\ + \x12\x18\n\x07message\x18\x02\x20\x01(\tR\x07message\x12C\n\x04code\x18\ + \x03\x20\x01(\x0e2/.opentelemetry.proto.trace.v1.Status.StatusCodeR\x04c\ + ode\"N\n\nStatusCode\x12\x15\n\x11STATUS_CODE_UNSET\x10\0\x12\x12\n\x0eS\ + TATUS_CODE_OK\x10\x01\x12\x15\n\x11STATUS_CODE_ERROR\x10\x02J\x04\x08\ + \x01\x10\x02Bw\n\x1fio.opentelemetry.proto.trace.v1B\nTraceProtoP\x01Z'g\ + o.opentelemetry.io/proto/otlp/trace/v1\xaa\x02\x1cOpenTelemetry.Proto.Tr\ + ace.V1b\x06proto3\ "; static file_descriptor_proto_lazy: ::protobuf::rt::LazyV2<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::LazyV2::INIT; diff -Nru temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/grpcio/trace_service.rs temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/grpcio/trace_service.rs --- temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/grpcio/trace_service.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/grpcio/trace_service.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,4 +1,4 @@ -// This file is generated by rust-protobuf 2.27.1. Do not edit +// This file is generated by rust-protobuf 2.28.0. Do not edit // @generated // https://github.com/rust-lang/rust-clippy/issues/702 @@ -21,7 +21,7 @@ /// Generated files are compatible only with the same version /// of protobuf runtime. -// const _PROTOBUF_VERSION_CHECK: () = ::protobuf::VERSION_2_27_1; +// const _PROTOBUF_VERSION_CHECK: () = ::protobuf::VERSION_2_28_0; #[derive(PartialEq,Clone,Default)] #[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))] @@ -195,6 +195,8 @@ #[derive(PartialEq,Clone,Default)] #[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))] pub struct ExportTraceServiceResponse { + // message fields + pub partial_success: ::protobuf::SingularPtrField, // special fields #[cfg_attr(feature = "with-serde", serde(skip))] pub unknown_fields: ::protobuf::UnknownFields, @@ -212,10 +214,48 @@ pub fn new() -> ExportTraceServiceResponse { ::std::default::Default::default() } + + // .opentelemetry.proto.collector.trace.v1.ExportTracePartialSuccess partial_success = 1; + + + pub fn get_partial_success(&self) -> &ExportTracePartialSuccess { + self.partial_success.as_ref().unwrap_or_else(|| ::default_instance()) + } + pub fn clear_partial_success(&mut self) { + self.partial_success.clear(); + } + + pub fn has_partial_success(&self) -> bool { + self.partial_success.is_some() + } + + // Param is passed by value, moved + pub fn set_partial_success(&mut self, v: ExportTracePartialSuccess) { + self.partial_success = ::protobuf::SingularPtrField::some(v); + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_partial_success(&mut self) -> &mut ExportTracePartialSuccess { + if self.partial_success.is_none() { + self.partial_success.set_default(); + } + self.partial_success.as_mut().unwrap() + } + + // Take field + pub fn take_partial_success(&mut self) -> ExportTracePartialSuccess { + self.partial_success.take().unwrap_or_else(|| ExportTracePartialSuccess::new()) + } } impl ::protobuf::Message for ExportTraceServiceResponse { fn is_initialized(&self) -> bool { + for v in &self.partial_success { + if !v.is_initialized() { + return false; + } + }; true } @@ -223,6 +263,9 @@ while !is.eof()? { let (field_number, wire_type) = is.read_tag_unpack()?; match field_number { + 1 => { + ::protobuf::rt::read_singular_message_into(wire_type, is, &mut self.partial_success)?; + }, _ => { ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?; }, @@ -235,12 +278,21 @@ #[allow(unused_variables)] fn compute_size(&self) -> u32 { let mut my_size = 0; + if let Some(ref v) = self.partial_success.as_ref() { + let len = v.compute_size(); + my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len; + } my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields()); self.cached_size.set(my_size); my_size } fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> { + if let Some(ref v) = self.partial_success.as_ref() { + os.write_tag(1, ::protobuf::wire_format::WireTypeLengthDelimited)?; + os.write_raw_varint32(v.get_cached_size())?; + v.write_to_with_cached_sizes(os)?; + } os.write_unknown_fields(self.get_unknown_fields())?; ::std::result::Result::Ok(()) } @@ -278,7 +330,12 @@ fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT; descriptor.get(|| { - let fields = ::std::vec::Vec::new(); + let mut fields = ::std::vec::Vec::new(); + fields.push(::protobuf::reflect::accessor::make_singular_ptr_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage>( + "partial_success", + |m: &ExportTraceServiceResponse| { &m.partial_success }, + |m: &mut ExportTraceServiceResponse| { &mut m.partial_success }, + )); ::protobuf::reflect::MessageDescriptor::new_pb_name::( "ExportTraceServiceResponse", fields, @@ -295,6 +352,7 @@ impl ::protobuf::Clear for ExportTraceServiceResponse { fn clear(&mut self) { + self.partial_success.clear(); self.unknown_fields.clear(); } } @@ -311,17 +369,219 @@ } } +#[derive(PartialEq,Clone,Default)] +#[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))] +pub struct ExportTracePartialSuccess { + // message fields + pub rejected_spans: i64, + pub error_message: ::std::string::String, + // special fields + #[cfg_attr(feature = "with-serde", serde(skip))] + pub unknown_fields: ::protobuf::UnknownFields, + #[cfg_attr(feature = "with-serde", serde(skip))] + pub cached_size: ::protobuf::CachedSize, +} + +impl<'a> ::std::default::Default for &'a ExportTracePartialSuccess { + fn default() -> &'a ExportTracePartialSuccess { + ::default_instance() + } +} + +impl ExportTracePartialSuccess { + pub fn new() -> ExportTracePartialSuccess { + ::std::default::Default::default() + } + + // int64 rejected_spans = 1; + + + pub fn get_rejected_spans(&self) -> i64 { + self.rejected_spans + } + pub fn clear_rejected_spans(&mut self) { + self.rejected_spans = 0; + } + + // Param is passed by value, moved + pub fn set_rejected_spans(&mut self, v: i64) { + self.rejected_spans = v; + } + + // string error_message = 2; + + + pub fn get_error_message(&self) -> &str { + &self.error_message + } + pub fn clear_error_message(&mut self) { + self.error_message.clear(); + } + + // Param is passed by value, moved + pub fn set_error_message(&mut self, v: ::std::string::String) { + self.error_message = v; + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_error_message(&mut self) -> &mut ::std::string::String { + &mut self.error_message + } + + // Take field + pub fn take_error_message(&mut self) -> ::std::string::String { + ::std::mem::replace(&mut self.error_message, ::std::string::String::new()) + } +} + +impl ::protobuf::Message for ExportTracePartialSuccess { + fn is_initialized(&self) -> bool { + true + } + + fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> { + while !is.eof()? { + let (field_number, wire_type) = is.read_tag_unpack()?; + match field_number { + 1 => { + if wire_type != ::protobuf::wire_format::WireTypeVarint { + return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type)); + } + let tmp = is.read_int64()?; + self.rejected_spans = tmp; + }, + 2 => { + ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.error_message)?; + }, + _ => { + ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?; + }, + }; + } + ::std::result::Result::Ok(()) + } + + // Compute sizes of nested messages + #[allow(unused_variables)] + fn compute_size(&self) -> u32 { + let mut my_size = 0; + if self.rejected_spans != 0 { + my_size += ::protobuf::rt::value_size(1, self.rejected_spans, ::protobuf::wire_format::WireTypeVarint); + } + if !self.error_message.is_empty() { + my_size += ::protobuf::rt::string_size(2, &self.error_message); + } + my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields()); + self.cached_size.set(my_size); + my_size + } + + fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> { + if self.rejected_spans != 0 { + os.write_int64(1, self.rejected_spans)?; + } + if !self.error_message.is_empty() { + os.write_string(2, &self.error_message)?; + } + os.write_unknown_fields(self.get_unknown_fields())?; + ::std::result::Result::Ok(()) + } + + fn get_cached_size(&self) -> u32 { + self.cached_size.get() + } + + fn get_unknown_fields(&self) -> &::protobuf::UnknownFields { + &self.unknown_fields + } + + fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields { + &mut self.unknown_fields + } + + fn as_any(&self) -> &dyn (::std::any::Any) { + self as &dyn (::std::any::Any) + } + fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) { + self as &mut dyn (::std::any::Any) + } + fn into_any(self: ::std::boxed::Box) -> ::std::boxed::Box { + self + } + + fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor { + Self::descriptor_static() + } + + fn new() -> ExportTracePartialSuccess { + ExportTracePartialSuccess::new() + } + + fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { + static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT; + descriptor.get(|| { + let mut fields = ::std::vec::Vec::new(); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeInt64>( + "rejected_spans", + |m: &ExportTracePartialSuccess| { &m.rejected_spans }, + |m: &mut ExportTracePartialSuccess| { &mut m.rejected_spans }, + )); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( + "error_message", + |m: &ExportTracePartialSuccess| { &m.error_message }, + |m: &mut ExportTracePartialSuccess| { &mut m.error_message }, + )); + ::protobuf::reflect::MessageDescriptor::new_pb_name::( + "ExportTracePartialSuccess", + fields, + file_descriptor_proto() + ) + }) + } + + fn default_instance() -> &'static ExportTracePartialSuccess { + static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; + instance.get(ExportTracePartialSuccess::new) + } +} + +impl ::protobuf::Clear for ExportTracePartialSuccess { + fn clear(&mut self) { + self.rejected_spans = 0; + self.error_message.clear(); + self.unknown_fields.clear(); + } +} + +impl ::std::fmt::Debug for ExportTracePartialSuccess { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for ExportTracePartialSuccess { + fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { + ::protobuf::reflect::ReflectValueRef::Message(self) + } +} + static file_descriptor_proto_data: &'static [u8] = b"\ \n:opentelemetry/proto/collector/trace/v1/trace_service.proto\x12&opente\ lemetry.proto.collector.trace.v1\x1a(opentelemetry/proto/trace/v1/trace.\ proto\"o\n\x19ExportTraceServiceRequest\x12R\n\x0eresource_spans\x18\x01\ \x20\x03(\x0b2+.opentelemetry.proto.trace.v1.ResourceSpansR\rresourceSpa\ - ns\"\x1c\n\x1aExportTraceServiceResponse2\xa2\x01\n\x0cTraceService\x12\ - \x91\x01\n\x06Export\x12A.opentelemetry.proto.collector.trace.v1.ExportT\ - raceServiceRequest\x1aB.opentelemetry.proto.collector.trace.v1.ExportTra\ - ceServiceResponse\"\0Bs\n)io.opentelemetry.proto.collector.trace.v1B\x11\ - TraceServiceProtoP\x01Z1go.opentelemetry.io/proto/otlp/collector/trace/v\ - 1b\x06proto3\ + ns\"\x88\x01\n\x1aExportTraceServiceResponse\x12j\n\x0fpartial_success\ + \x18\x01\x20\x01(\x0b2A.opentelemetry.proto.collector.trace.v1.ExportTra\ + cePartialSuccessR\x0epartialSuccess\"g\n\x19ExportTracePartialSuccess\ + \x12%\n\x0erejected_spans\x18\x01\x20\x01(\x03R\rrejectedSpans\x12#\n\re\ + rror_message\x18\x02\x20\x01(\tR\x0cerrorMessage2\xa2\x01\n\x0cTraceServ\ + ice\x12\x91\x01\n\x06Export\x12A.opentelemetry.proto.collector.trace.v1.\ + ExportTraceServiceRequest\x1aB.opentelemetry.proto.collector.trace.v1.Ex\ + portTraceServiceResponse\"\0B\x9c\x01\n)io.opentelemetry.proto.collector\ + .trace.v1B\x11TraceServiceProtoP\x01Z1go.opentelemetry.io/proto/otlp/col\ + lector/trace/v1\xaa\x02&OpenTelemetry.Proto.Collector.Trace.V1b\x06proto\ + 3\ "; static file_descriptor_proto_lazy: ::protobuf::rt::LazyV2<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::LazyV2::INIT; diff -Nru temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/grpcio/tracez.rs temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/grpcio/tracez.rs --- temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/grpcio/tracez.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/grpcio/tracez.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,4 +1,4 @@ -// This file is generated by rust-protobuf 2.27.1. Do not edit +// This file is generated by rust-protobuf 2.28.0. Do not edit // @generated // https://github.com/rust-lang/rust-clippy/issues/702 @@ -21,7 +21,7 @@ /// Generated files are compatible only with the same version /// of protobuf runtime. -// const _PROTOBUF_VERSION_CHECK: () = ::protobuf::VERSION_2_27_1; +// const _PROTOBUF_VERSION_CHECK: () = ::protobuf::VERSION_2_28_0; #[derive(PartialEq,Clone,Default)] #[cfg_attr(feature = "with-serde", derive(::serde::Serialize, ::serde::Deserialize))] @@ -1673,36 +1673,35 @@ } static file_descriptor_proto_data: &'static [u8] = b"\ - \n\x0ctracez.proto\x1a*opentelemetry/proto/common/v1/common.proto\x1a.op\ - entelemetry/proto/resource/v1/resource.proto\x1a(opentelemetry/proto/tra\ - ce/v1/trace.proto\"t\n\x0cTracezCounts\x12\x1a\n\x08spanname\x18\x01\x20\ - \x01(\tR\x08spanname\x12\x18\n\x07latency\x18\x02\x20\x03(\rR\x07latency\ - \x12\x18\n\x07running\x18\x03\x20\x01(\rR\x07running\x12\x14\n\x05error\ - \x18\x04\x20\x01(\rR\x05error\"\xdd\x02\n\x0bLatencyData\x12\x18\n\x07tr\ - aceid\x18\x01\x20\x01(\x0cR\x07traceid\x12\x16\n\x06spanid\x18\x02\x20\ - \x01(\x0cR\x06spanid\x12\x1a\n\x08parentid\x18\x03\x20\x01(\x0cR\x08pare\ - ntid\x12\x1c\n\tstarttime\x18\x04\x20\x01(\x06R\tstarttime\x12\x18\n\x07\ - endtime\x18\x05\x20\x01(\x06R\x07endtime\x12G\n\nattributes\x18\x06\x20\ - \x03(\x0b2'.opentelemetry.proto.common.v1.KeyValueR\nattributes\x12@\n\ - \x06events\x18\x07\x20\x03(\x0b2(.opentelemetry.proto.trace.v1.Span.Even\ - tR\x06events\x12=\n\x05links\x18\x08\x20\x03(\x0b2'.opentelemetry.proto.\ - trace.v1.Span.LinkR\x05links\"\xc3\x02\n\x0bRunningData\x12\x18\n\x07tra\ - ceid\x18\x01\x20\x01(\x0cR\x07traceid\x12\x16\n\x06spanid\x18\x02\x20\ - \x01(\x0cR\x06spanid\x12\x1a\n\x08parentid\x18\x03\x20\x01(\x0cR\x08pare\ - ntid\x12\x1c\n\tstarttime\x18\x04\x20\x01(\x06R\tstarttime\x12G\n\nattri\ - butes\x18\x05\x20\x03(\x0b2'.opentelemetry.proto.common.v1.KeyValueR\nat\ - tributes\x12@\n\x06events\x18\x06\x20\x03(\x0b2(.opentelemetry.proto.tra\ - ce.v1.Span.EventR\x06events\x12=\n\x05links\x18\x07\x20\x03(\x0b2'.opent\ - elemetry.proto.trace.v1.Span.LinkR\x05links\"\xff\x02\n\tErrorData\x12\ - \x18\n\x07traceid\x18\x01\x20\x01(\x0cR\x07traceid\x12\x16\n\x06spanid\ - \x18\x02\x20\x01(\x0cR\x06spanid\x12\x1a\n\x08parentid\x18\x03\x20\x01(\ - \x0cR\x08parentid\x12\x1c\n\tstarttime\x18\x04\x20\x01(\x06R\tstarttime\ - \x12G\n\nattributes\x18\x05\x20\x03(\x0b2'.opentelemetry.proto.common.v1\ - .KeyValueR\nattributes\x12@\n\x06events\x18\x06\x20\x03(\x0b2(.opentelem\ - etry.proto.trace.v1.Span.EventR\x06events\x12=\n\x05links\x18\x07\x20\ - \x03(\x0b2'.opentelemetry.proto.trace.v1.Span.LinkR\x05links\x12<\n\x06s\ - tatus\x18\x08\x20\x01(\x0b2$.opentelemetry.proto.trace.v1.StatusR\x06sta\ - tusb\x06proto3\ + \n\x0ctracez.proto\x1a*opentelemetry/proto/common/v1/common.proto\x1a(op\ + entelemetry/proto/trace/v1/trace.proto\"t\n\x0cTracezCounts\x12\x1a\n\ + \x08spanname\x18\x01\x20\x01(\tR\x08spanname\x12\x18\n\x07latency\x18\ + \x02\x20\x03(\rR\x07latency\x12\x18\n\x07running\x18\x03\x20\x01(\rR\x07\ + running\x12\x14\n\x05error\x18\x04\x20\x01(\rR\x05error\"\xdd\x02\n\x0bL\ + atencyData\x12\x18\n\x07traceid\x18\x01\x20\x01(\x0cR\x07traceid\x12\x16\ + \n\x06spanid\x18\x02\x20\x01(\x0cR\x06spanid\x12\x1a\n\x08parentid\x18\ + \x03\x20\x01(\x0cR\x08parentid\x12\x1c\n\tstarttime\x18\x04\x20\x01(\x06\ + R\tstarttime\x12\x18\n\x07endtime\x18\x05\x20\x01(\x06R\x07endtime\x12G\ + \n\nattributes\x18\x06\x20\x03(\x0b2'.opentelemetry.proto.common.v1.KeyV\ + alueR\nattributes\x12@\n\x06events\x18\x07\x20\x03(\x0b2(.opentelemetry.\ + proto.trace.v1.Span.EventR\x06events\x12=\n\x05links\x18\x08\x20\x03(\ + \x0b2'.opentelemetry.proto.trace.v1.Span.LinkR\x05links\"\xc3\x02\n\x0bR\ + unningData\x12\x18\n\x07traceid\x18\x01\x20\x01(\x0cR\x07traceid\x12\x16\ + \n\x06spanid\x18\x02\x20\x01(\x0cR\x06spanid\x12\x1a\n\x08parentid\x18\ + \x03\x20\x01(\x0cR\x08parentid\x12\x1c\n\tstarttime\x18\x04\x20\x01(\x06\ + R\tstarttime\x12G\n\nattributes\x18\x05\x20\x03(\x0b2'.opentelemetry.pro\ + to.common.v1.KeyValueR\nattributes\x12@\n\x06events\x18\x06\x20\x03(\x0b\ + 2(.opentelemetry.proto.trace.v1.Span.EventR\x06events\x12=\n\x05links\ + \x18\x07\x20\x03(\x0b2'.opentelemetry.proto.trace.v1.Span.LinkR\x05links\ + \"\xff\x02\n\tErrorData\x12\x18\n\x07traceid\x18\x01\x20\x01(\x0cR\x07tr\ + aceid\x12\x16\n\x06spanid\x18\x02\x20\x01(\x0cR\x06spanid\x12\x1a\n\x08p\ + arentid\x18\x03\x20\x01(\x0cR\x08parentid\x12\x1c\n\tstarttime\x18\x04\ + \x20\x01(\x06R\tstarttime\x12G\n\nattributes\x18\x05\x20\x03(\x0b2'.open\ + telemetry.proto.common.v1.KeyValueR\nattributes\x12@\n\x06events\x18\x06\ + \x20\x03(\x0b2(.opentelemetry.proto.trace.v1.Span.EventR\x06events\x12=\ + \n\x05links\x18\x07\x20\x03(\x0b2'.opentelemetry.proto.trace.v1.Span.Lin\ + kR\x05links\x12<\n\x06status\x18\x08\x20\x01(\x0b2$.opentelemetry.proto.\ + trace.v1.StatusR\x06statusb\x06proto3\ "; static file_descriptor_proto_lazy: ::protobuf::rt::LazyV2<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::LazyV2::INIT; diff -Nru temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/buf.yaml temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/buf.yaml --- temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/buf.yaml 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/buf.yaml 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,6 @@ +version: v1 + +# See https://docs.buf.build/breaking/configuration +breaking: + use: + - WIRE diff -Nru temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/CHANGELOG.md temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/CHANGELOG.md --- temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/CHANGELOG.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/CHANGELOG.md 2023-10-30 19:40:00.000000000 +0000 @@ -2,27 +2,114 @@ ## Unreleased -Full list of differences found in [this compare](https://github.com/open-telemetry/opentelemetry-proto/compare/v0.13.0...main). +Full list of differences found in [this compare](https://github.com/open-telemetry/opentelemetry-proto/compare/v0.20.0...main). + +## 0.20.0 - 2023-06-06 + +Full list of differences found in [this compare](https://github.com/open-telemetry/opentelemetry-proto/compare/v0.19.0...v0.20.0). ### Maturity -* Remove if no changes for this section before release. +* Declare OTLP/JSON Stable. + [#436](https://github.com/open-telemetry/opentelemetry-proto/pull/436) + [#435](https://github.com/open-telemetry/opentelemetry-proto/pull/435) +* Provide stronger symbolic stability guarantees. + [#432](https://github.com/open-telemetry/opentelemetry-proto/pull/432) +* Clarify how additive changes are handled. + [#455](https://github.com/open-telemetry/opentelemetry-proto/pull/455) + +### Changed + +* Change the exponential histogram boundary condition. + [#409](https://github.com/open-telemetry/opentelemetry-proto/pull/409) +* Clarify behavior for empty/not present/invalid trace_id and span_id fields. + [#442](https://github.com/open-telemetry/opentelemetry-proto/pull/442) +* Change the collector trace endpoint to /v1/traces. + [#449](https://github.com/open-telemetry/opentelemetry-proto/pull/449) + +### Added + +* Introduce `zero_threshold` field to `ExponentialHistogramDataPoint`. + [#441](https://github.com/open-telemetry/opentelemetry-proto/pull/441) + [#453](https://github.com/open-telemetry/opentelemetry-proto/pull/453) + +### Removed + +* Delete requirement to generate new trace/span id if an invalid id is received. + [#444](https://github.com/open-telemetry/opentelemetry-proto/pull/444) + +## 0.19.0 - 2022-08-03 + +Full list of differences found in [this compare](https://github.com/open-telemetry/opentelemetry-proto/compare/v0.18.0...v0.19.0). + +### Changed + +* Add `csharp_namespace` option to protos. + ([#399](https://github.com/open-telemetry/opentelemetry-proto/pull/399)) +* Fix some out-of-date urls which link to [specification](https://github.com/open-telemetry/opentelemetry-specification). ([#402](https://github.com/open-telemetry/opentelemetry-proto/pull/402)) +* :stop_sign: [BREAKING] Delete deprecated InstrumentationLibrary, + InstrumentationLibraryLogs, InstrumentationLibrarySpans and + InstrumentationLibraryMetrics messages. Delete deprecated + instrumentation_library_logs, instrumentation_library_spans and + instrumentation_library_metrics fields. + +### Added + +* Introduce Scope Attributes. [#395](https://github.com/open-telemetry/opentelemetry-proto/pull/395) +* Introduce partial success fields in `ExportServiceResponse`. + [#414](https://github.com/open-telemetry/opentelemetry-proto/pull/414) + +## 0.18.0 - 2022-05-17 + +Full list of differences found in [this compare](https://github.com/open-telemetry/opentelemetry-proto/compare/v0.17.0...v0.18.0). + +### Changed + +* Declare logs Stable. + [(#376)](https://github.com/open-telemetry/opentelemetry-proto/pull/376) +* Metrics ExponentialHistogramDataPoint makes the `sum` optional + (follows the same change in HistogramDataPOint in 0.15). [#392](https://github.com/open-telemetry/opentelemetry-proto/pull/392) + +## 0.17.0 - 2022-05-06 + +Full list of differences found in [this compare](https://github.com/open-telemetry/opentelemetry-proto/compare/v0.16.0...v0.17.0). ### Changed -* Remove if no changes for this section before release. +* Introduce optional `min` and `max` fields to the Histogram and ExponentialHistogram data points. + [(#279)](https://github.com/open-telemetry/opentelemetry-proto/pull/279) + +## 0.16.0 - 2022-03-31 + +Full list of differences found in [this compare](https://github.com/open-telemetry/opentelemetry-proto/compare/v0.15.0...v0.16.0). + +### Removed + +* Remove deprecated LogRecord.Name field (#373). + +## 0.15.0 - 2022-03-19 + +Full list of differences found in [this compare](https://github.com/open-telemetry/opentelemetry-proto/compare/v0.14.0...v0.15.0). + +### Changed + +* Rename InstrumentationLibrary to InstrumentationScope (#362) ### Added -* Remove if no changes for this section before release. +* Use optional for `sum` field to mark presence (#366) + +## 0.14.0 - 2022-03-08 + +Full list of differences found in [this compare](https://github.com/open-telemetry/opentelemetry-proto/compare/v0.13.0...v0.14.0). ### Removed -* Deprecate LogRecord.Name field. (#357) +* Deprecate LogRecord.Name field (#357) ## 0.13.0 - 2022-02-10 -Full list of differences found in [this compare](https://github.com/open-telemetry/opentelemetry-proto/compare/v0.13.0...v0.12.0). +Full list of differences found in [this compare](https://github.com/open-telemetry/opentelemetry-proto/compare/v0.12.0...v0.13.0). ### Changed @@ -42,7 +129,7 @@ ## 0.12.0 - 2022-01-19 -Full list of differences found in [this compare](https://github.com/open-telemetry/opentelemetry-proto/compare/v0.12.0...v0.11.0). +Full list of differences found in [this compare](https://github.com/open-telemetry/opentelemetry-proto/compare/v0.11.0...v0.12.0). ### Changed diff -Nru temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/docs/design-goals.md temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/docs/design-goals.md --- temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/docs/design-goals.md 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/docs/design-goals.md 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,19 @@ +# Design Goals for OpenTelemetry Wire Protocol + +We want to design a telemetry data exchange protocol that has the following characteristics: + +- Be suitable for use between all of the following node types: instrumented applications, telemetry backends, local agents, stand-alone collectors/forwarders. + +- Have high reliability of data delivery and clear visibility when the data cannot be delivered. + +- Have low CPU usage for serialization and deserialization. + +- Impose minimal pressure on memory manager, including pass-through scenarios, where deserialized data is short-lived and must be serialized as-is shortly after and where such short-lived data is created and discarded at high frequency (think telemetry data forwarders). + +- Support ability to efficiently modify deserialized data and serialize again to pass further. This is related but slightly different from the previous requirement. + +- Ensure high throughput (within the available bandwidth) in high latency networks (e.g. scenarios where telemetry source and the backend are separated by high latency network). + +- Allow backpressure signalling. + +- Be load-balancer friendly (do not hinder re-balancing). Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/docs/img/otlp-client-server.png and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/docs/img/otlp-client-server.png differ Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/docs/img/otlp-concurrent.png and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/docs/img/otlp-concurrent.png differ Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/docs/img/otlp-multi-destination.png and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/docs/img/otlp-multi-destination.png differ Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/docs/img/otlp-request-response.png and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/docs/img/otlp-request-response.png differ Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/docs/img/otlp-sequential.png and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/docs/img/otlp-sequential.png differ diff -Nru temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/docs/README.md temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/docs/README.md --- temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/docs/README.md 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/docs/README.md 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,8 @@ +# OpenTelemetry Protocol (OTLP) + +This is the specification of the OpenTelemetry Protocol (OTLP). + +- [Design Goals](design-goals.md) +- [Requirements](requirements.md) +- [Specification](specification.md) +- [SDK Exporter](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/protocol/exporter.md) diff -Nru temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/docs/requirements.md temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/docs/requirements.md --- temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/docs/requirements.md 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/docs/requirements.md 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,99 @@ +# OpenTelemetry Protocol Requirements + +This document will drive OpenTelemetry Protocol design and RFC. + +## Goals + +See the goals of OpenTelemetry Protocol design [here](design-goals.md). + +## Vocabulary + +There are 2 parties involved in telemetry data exchange. In this document the party that is the source of telemetry data is called the Client, the party that is the destination of telemetry data is called the Server. + +Examples of a Client are instrumented applications or sending side of telemetry collectors, examples of Servers are telemetry backends or receiving side of telemetry collectors (so a Collector is typically both a Client and a Server depending on which side you look from). + +## Known Issues with Existing Protocols + +Our experience with OpenCensus and other protocols has been that many of them have one or more of the following drawbacks: + +- High CPU consumption for serialization and especially deserialization of received telemetry data. +- High and frequent CPU consumption by Garbage Collector. +- Lack of delivery guarantees for certain protocols (e.g. stream-based gRPC OpenCensus protocol) which makes troubleshooting of telemetry pipelines difficult. +- Not aware / not cooperating with load balancers resulting in potentially large imbalances in horizontally scaled backends. +- Support either traces or metrics but not both. + +Our goal is to avoid or mitigate these known issues in the new protocol. + +## Requirements + +The following are OpenTelemetry protocol requirements. + +### Supported Node Types + +The protocol must be suitable for use between all of the following node types: instrumented applications, telemetry backends, telemetry agents running as local daemons, stand-alone collector/forwarder services. + +### Supported Data Types + +The protocol must support traces and metrics as data types. + +### Reliability of Delivery + +The protocol must ensure reliable data delivery and clear visibility when the data cannot be delivered. This should be achieved by sending data acknowledgements from the Server to the Client. + +Note that acknowledgements alone are not sufficient to guarantee that: a) no data will be lost and b) no data will be duplicated. Acknowledgements can help to guarantee a) but not b). Guaranteeing both at the same is difficult. Because it is usually preferable for telemetry data to be duplicated than to lose it, we choose to guarantee that there are no data losses while potentially allowing duplicate data. + +Duplicates can typically happen in edge cases (e.g. on reconnections, network interruptions, etc) when the client has no way of knowing if last sent data was delivered. In these cases the client will usually choose to re-send the data to guarantee the delivery which in turn may result in duplicate data on the server side. + +_To avoid having duplicates the client and the server could track sent and delivered items using uniquely identifying ids. The exact mechanism for tracking the ids and performing data de-duplication may be defined at the layer above the protocol layer and is outside the scope of this document._ + +For this reason we have slightly relaxed requirements and consider duplicate data acceptable in rare cases. + +Note: this protocol is concerned with reliability of delivery between one pair of client/server nodes and aims to ensure that no data is lost in-transit between the client and the server. Many telemetry collection systems have multiple nodes that the data must travel across until reaching the final destination (e.g. application -> agent -> collector -> backend). End-to-end delivery guarantees in such systems is outside of the scope for this document. The acknowledgements described in this protocol happen between a single client/server pair and do not span multiple nodes in multi-hop delivery paths. + +### Throughput + +The protocol must ensure high throughput in high latency networks when the client and the server are not in the same data center. + +This requirement may rule out half-duplex protocols. The throughput of half-duplex protocols is highly dependent on network roundtrip time and request size. To achieve good throughput request sizes may be too large to be practical. + +### Compression + +The protocol must achieve high compression ratios for telemetry data. The protocol design must consider batching of telemetry data and grouping of similar data (both can help to achieve better compression using common compression algorithms). + +### Encryption + +Industry standard encryption (e.g. TLS/HTTPS) must be supported. + +### Backpressure Signalling and Throttling + +The protocol must allow backpressure signalling. + +If the server is unable to keep up with the pace of data it receives from the client then it must be able to signal that fact to the client. The client may then throttle itself to avoid overwhelming the server. + +If the underlying transport is a stream that has its own flow control mechanism then the backpressure could be applied by delaying the reading of data from the server’s endpoint which could then be signalled to the client via underlying flow-control. However this approach makes it difficult for the client to distinguish server overloading from network delays (due to e.g. network losses). Such distinction is important for [observability reasons](https://github.com/open-telemetry/opentelemetry-service/pull/188). Because of this it is required for the protocol to allow to explicitly and clearly signal backpressure from the server to the client without relying on implicit signalling using underlying flow-control mechanisms. + +The backpressure signal should include a hint to the client about desirable reduced rate of data. + +### Serialization Performance + +The protocol must have fast data serialization and deserialization characteristics. + +Ideally it must also support very fast pass-through mode (when no modifications to the data are needed), fast “augmenting†or “tagging†of data and partial inspection of data (e.g. check for presence of specific tag). These requirements help to create fast Agents and Collectors. + +### Memory Usage Profile + +The protocol must impose minimal pressure on memory manager, including pass-through scenarios, when deserialized data is short-lived and must be serialized as-is shortly after and when such short-lived data is created and discarded at high frequency (think telemetry data forwarders). + +The implementation of telemetry protocol must aim to minimize the number of memory allocations and dealocations performed during serialization and deserialization and aim to minimize the pressure on Garbage Collection (for GC languages). + +### Level 7 Load Balancer Friendly + +The protocol must allow Level 7 load balancers such as Envoy to re-balance the traffic for each batch of telemetry data. The traffic should not get pinned by a load balancer to one server for the entire duration of telemetry data sending, thus potentially leading to imbalanced load of servers located behind the load balancer. + +### Backwards Compatibility + +The protocol should be possible to evolve over time. It should be possible for nodes that implement different versions of OpenTelemetry protocol to interoperate (while possibly regressing to the lowest common denominator from functional perspective). + +### General Requirements + +The protocol must use well-known, mature encoding and transport mechanisms with ubiquitous availability of implementations in wide selection of languages that are supported by OpenTelemetry. diff -Nru temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/docs/specification.md temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/docs/specification.md --- temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/docs/specification.md 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/docs/specification.md 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,721 @@ + + +# OpenTelemetry Protocol Specification + +**Status**: [Stable](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/document-status.md) + +The OpenTelemetry Protocol (OTLP) specification describes the encoding, transport, +and delivery mechanism of telemetry data between telemetry sources, intermediate +nodes such as collectors and telemetry backends. + +

+Table of Contents + + + +- [Protocol Details](#protocol-details) + * [OTLP/gRPC](#otlpgrpc) + + [OTLP/gRPC Concurrent Requests](#otlpgrpc-concurrent-requests) + + [OTLP/gRPC Response](#otlpgrpc-response) + - [Full Success](#full-success) + - [Partial Success](#partial-success) + - [Failures](#failures) + + [OTLP/gRPC Throttling](#otlpgrpc-throttling) + + [OTLP/gRPC Service and Protobuf Definitions](#otlpgrpc-service-and-protobuf-definitions) + + [OTLP/gRPC Default Port](#otlpgrpc-default-port) + * [OTLP/HTTP](#otlphttp) + + [Binary Protobuf Encoding](#binary-protobuf-encoding) + + [JSON Protobuf Encoding](#json-protobuf-encoding) + + [OTLP/HTTP Request](#otlphttp-request) + + [OTLP/HTTP Response](#otlphttp-response) + - [Full Success](#full-success-1) + - [Partial Success](#partial-success-1) + - [Failures](#failures-1) + - [Bad Data](#bad-data) + - [OTLP/HTTP Throttling](#otlphttp-throttling) + - [All Other Responses](#all-other-responses) + + [OTLP/HTTP Connection](#otlphttp-connection) + + [OTLP/HTTP Concurrent Requests](#otlphttp-concurrent-requests) + + [OTLP/HTTP Default Port](#otlphttp-default-port) +- [Implementation Recommendations](#implementation-recommendations) + * [Multi-Destination Exporting](#multi-destination-exporting) +- [Known Limitations](#known-limitations) + * [Request Acknowledgements](#request-acknowledgements) + + [Duplicate Data](#duplicate-data) +- [Future Versions and Interoperability](#future-versions-and-interoperability) +- [Glossary](#glossary) +- [References](#references) + + + +
+ +OTLP is a general-purpose telemetry data delivery protocol designed in the scope +of the OpenTelemetry project. + +## Protocol Details + +OTLP defines the encoding of telemetry data and the protocol used to exchange +data between the client and the server. + +This specification defines how OTLP is implemented over +[gRPC](https://grpc.io/) and HTTP 1.1 transports and specifies +[Protocol Buffers schema](https://developers.google.com/protocol-buffers/docs/overview) +that is used for the payloads. + +OTLP is a request/response style protocol: the clients send requests, and the +server replies with corresponding responses. This document defines one request +and response type: `Export`. + +All server components MUST support the following transport compression options: + +* No compression, denoted by `none`. +* Gzip compression, denoted by `gzip`. + +### OTLP/gRPC + +After establishing the underlying gRPC transport, the client starts sending +telemetry data using unary requests using +[Export*ServiceRequest](https://github.com/open-telemetry/opentelemetry-proto) +messages ([ExportLogsServiceRequest](../opentelemetry/proto/collector/logs/v1/logs_service.proto) for logs, +[ExportMetricsServiceRequest](../opentelemetry/proto/collector/metrics/v1/metrics_service.proto) for metrics, +[ExportTraceServiceRequest](../opentelemetry/proto/collector/trace/v1/trace_service.proto) for traces). +The client continuously sends a sequence of requests to the server and expects +to receive a response to each request: + +![Request-Response](img/otlp-request-response.png) + +_Note: this protocol is concerned with the reliability of delivery between one +pair of client/server nodes and aims to ensure that no data is lost in transit +between the client and the server. Many telemetry collection systems have +intermediary nodes that the data must travel across until reaching the final +destination (e.g. application -> agent -> collector -> backend). End-to-end +delivery guarantees in such systems is outside of the scope of OTLP. The +acknowledgements described in this protocol happen between a single +client/server pair and do not span intermediary nodes in multi-hop delivery +paths._ + +#### OTLP/gRPC Concurrent Requests + +After sending the request the client MAY wait until the response is received +from the server. In that case there will be at most only one request in flight +that is not yet acknowledged by the server. + +![Unary](img/otlp-sequential.png) + +Sequential operation is recommended when simplicity of implementation is +desirable, and when the client and the server are connected via very low-latency +network, such as when the client is an instrumented application and +the server is an OpenTelemetry Collector running as a local daemon (agent). + +The implementations that need to achieve high throughput SHOULD support +concurrent Unary calls to achieve higher throughput. The client SHOULD send new +requests without waiting for the response to the earlier sent requests, +essentially creating a pipeline of requests that are currently in flight that +are not acknowledged. + +![Concurrent](img/otlp-concurrent.png) + +The number of concurrent requests SHOULD be configurable. + +The maximum achievable throughput is +`max_concurrent_requests * max_request_size / (network_latency + server_response_time)`. +For example, if the request can contain at most 100 spans, network roundtrip +latency is 200ms, and server response time is 300 ms, then the maximum achievable +throughput with one concurrent request is `100 spans / (200ms+300ms)` or 200 +spans per second. It is easy to see that in high latency networks or when the +server response time is high to achieve good throughput, the requests need to be +very big or a lot concurrent requests must be done. + +If the client is shutting down (e.g. when the containing process wants to exit) +the client will optionally wait until all pending acknowledgements are received +or until an implementation-specific timeout expires. This ensures the reliable +delivery of telemetry data. The client implementation SHOULD expose an option to +turn on and off the waiting during a shutdown. + +If the client is unable to deliver a certain request (e.g. a timer expired while +waiting for acknowledgements) the client SHOULD record the fact that the data +was not delivered. + +#### OTLP/gRPC Response + +The response MUST be the appropriate message (see below for +the specific message to use in the [Full Success](#full-success), +[Partial Success](#partial-success) and [Failure](#failures) cases). + +##### Full Success + +The success response indicates telemetry data is successfully accepted by the +server. + +If the server receives an empty request (a request that does not carry +any telemetry data) the server SHOULD respond with success. + +On success, the server response MUST be a +[Export\ServiceResponse](../opentelemetry/proto/collector) +message (`ExportTraceServiceResponse` for traces, +`ExportMetricsServiceResponse` for metrics and +`ExportLogsServiceResponse` for logs). + +The server MUST leave the `partial_success` field unset +in case of a successful response. + +##### Partial Success + +If the request is only partially accepted +(i.e. when the server accepts only parts of the data and rejects the rest), the +server response MUST be the same +[Export\ServiceResponse](../opentelemetry/proto/collector) +message as in the [Full Success](#full-success) case. + +Additionally, the server MUST initialize the `partial_success` field +(`ExportTracePartialSuccess` message for traces, +`ExportMetricsPartialSuccess` message for metrics and +`ExportLogsPartialSuccess` message for logs), and it MUST set the respective +`rejected_spans`, `rejected_data_points` or `rejected_log_records` field with +the number of spans/data points/log records it rejected. + +The server SHOULD populate the `error_message` field with a human-readable +error message in English. The message should explain why the +server rejected parts of the data and might offer guidance on how users +can address the issues. +The protocol does not attempt to define the structure of the error message. + +Servers MAY also use the `partial_success` field to convey +warnings/suggestions to clients even when the server fully accepts the request. +In such cases, the `rejected_` field MUST have a value of `0`, and +the `error_message` field MUST be non-empty. + +The client MUST NOT retry the request when it receives a partial success +response where the `partial_success` is populated. + +##### Failures + +When the server returns an error, it falls into 2 broad categories: +retryable and not-retryable: + +- Retryable errors indicate that telemetry data processing failed, and the + client SHOULD record the error and may retry exporting the same data. + For example, this can happen when the server is temporarily unable to + process the data. + +- Not-retryable errors indicate that telemetry data processing failed, and the + client MUST NOT retry sending the same telemetry data. The client MUST drop + the telemetry data. + For example, this can happen, when the request contains bad data + and cannot be deserialized or processed by the server. The client + SHOULD maintain a counter of such dropped data. + +The server MUST indicate retryable errors using code +[Unavailable](https://godoc.org/google.golang.org/grpc/codes) and MAY supply +additional +[details via status](https://godoc.org/google.golang.org/grpc/status#Status.WithDetails) +using +[RetryInfo](https://github.com/googleapis/googleapis/blob/6a8c7914d1b79bd832b5157a09a9332e8cbd16d4/google/rpc/error_details.proto#L40) +containing 0 value of RetryDelay. Here is a sample Go code to illustrate: + +```go + // Do this on server side. + st, err := status.New(codes.Unavailable, "Server is unavailable"). + WithDetails(&errdetails.RetryInfo{RetryDelay: &duration.Duration{Seconds: 0}}) + if err != nil { + log.Fatal(err) + } + + return st.Err() +``` + +To indicate not-retryable errors, the server is recommended to use code +[InvalidArgument](https://godoc.org/google.golang.org/grpc/codes) and MAY supply +additional +[details via status](https://godoc.org/google.golang.org/grpc/status#Status.WithDetails) +using +[BadRequest](https://github.com/googleapis/googleapis/blob/6a8c7914d1b79bd832b5157a09a9332e8cbd16d4/google/rpc/error_details.proto#L119). +If more appropriate, another gRPC status code may be used. Here is a +snippet of sample Go code to illustrate: + +```go + // Do this on the server side. + st, err := status.New(codes.InvalidArgument, "Invalid Argument"). + WithDetails(&errdetails.BadRequest{}) + if err != nil { + log.Fatal(err) + } + + return st.Err() +``` + +The server MAY use other gRPC codes to indicate retryable and not-retryable +errors if those other gRPC codes are more appropriate for a particular erroneous +situation. The client SHOULD interpret gRPC status codes as retryable or +not-retryable according to the following table: + +|gRPC Code|Retryable?| +|---------|----------| +|CANCELLED|Yes| +|UNKNOWN|No| +|INVALID_ARGUMENT|No| +|DEADLINE_EXCEEDED|Yes| +|NOT_FOUND|No| +|ALREADY_EXISTS|No| +|PERMISSION_DENIED|No| +|UNAUTHENTICATED|No| +|RESOURCE_EXHAUSTED|Only if the server can recover (see below)| +|FAILED_PRECONDITION|No| +|ABORTED|Yes| +|OUT_OF_RANGE|Yes| +|UNIMPLEMENTED|No| +|INTERNAL|No| +|UNAVAILABLE|Yes| +|DATA_LOSS|Yes| + +When retrying, the client SHOULD implement an exponential backoff strategy. An +exception to this is the Throttling case explained below, which provides +explicit instructions about retrying interval. + +The client SHOULD interpret `RESOURCE_EXHAUSTED` code as retryable only if the +server signals that the recovery from resource exhaustion is possible. +This is signaled by the server by returning +[a status](https://godoc.org/google.golang.org/grpc/status#Status.WithDetails) containing +[RetryInfo](https://github.com/googleapis/googleapis/blob/6a8c7914d1b79bd832b5157a09a9332e8cbd16d4/google/rpc/error_details.proto#L40). +In this case the behavior of the server and the client is exactly as described in +[OTLP/gRPC Throttling](#otlpgrpc-throttling) section. If no such status is returned, +then the `RESOURCE_EXHAUSTED` code SHOULD be treated as non-retryable. + +#### OTLP/gRPC Throttling + +OTLP allows backpressure signaling. + +If the server is unable to keep up with the pace of data it receives from the +client then it SHOULD signal that fact to the client. The client MUST then +throttle itself to avoid overwhelming the server. + +To signal backpressure when using gRPC transport, the server MUST return an +error with code [Unavailable](https://godoc.org/google.golang.org/grpc/codes) +and MAY supply additional +[details via status](https://godoc.org/google.golang.org/grpc/status#Status.WithDetails) +using +[RetryInfo](https://github.com/googleapis/googleapis/blob/6a8c7914d1b79bd832b5157a09a9332e8cbd16d4/google/rpc/error_details.proto#L40). +Here is a snippet of sample Go code to illustrate: + +```go + // Do this on the server side. + st, err := status.New(codes.Unavailable, "Server is unavailable"). + WithDetails(&errdetails.RetryInfo{RetryDelay: &duration.Duration{Seconds: 30}}) + if err != nil { + log.Fatal(err) + } + + return st.Err() + + ... + + // Do this on the client side. + st := status.Convert(err) + for _, detail := range st.Details() { + switch t := detail.(type) { + case *errdetails.RetryInfo: + if t.RetryDelay.Seconds > 0 || t.RetryDelay.Nanos > 0 { + // Wait before retrying. + } + } + } +``` + +When the client receives this signal, it SHOULD follow the recommendations +outlined in documentation for +[RetryInfo](https://github.com/googleapis/googleapis/blob/6a8c7914d1b79bd832b5157a09a9332e8cbd16d4/google/rpc/error_details.proto#L40): + +``` +// Describes when the clients can retry a failed request. Clients could ignore +// the recommendation here or retry when this information is missing from the error +// responses. +// +// It's always recommended that clients should use exponential backoff when +// retrying. +// +// Clients should wait until `retry_delay` amount of time has passed since +// receiving the error response before retrying. If retrying requests also +// fail, clients should use an exponential backoff scheme to increase gradually +// the delay between retries based on `retry_delay` until either a maximum +// number of retries has been reached, or a maximum retry delay cap has been +// reached. +``` + +The value of `retry_delay` is determined by the server and is implementation +dependant. The server SHOULD choose a `retry_delay` value that is big enough to +give the server time to recover yet is not too big to cause the client to drop +data while being throttled. + +#### OTLP/gRPC Service and Protobuf Definitions + +gRPC service definitions [are here](../opentelemetry/proto/collector). + +Protobuf definitions for requests and responses [are here](../opentelemetry/proto). + +Please make sure to check the proto version and [maturity level](../README.md#maturity-level). +Schemas for different signals may be at different maturity level - some stable, +some in beta. + +#### OTLP/gRPC Default Port + +The default network port for OTLP/gRPC is 4317. + +### OTLP/HTTP + +OTLP/HTTP uses Protobuf payloads encoded either in +[binary format](#binary-protobuf-encoding) or in [JSON format](#json-protobuf-encoding). +Regardless of the encoding the Protobuf schema of the messages is the same for +OTLP/HTTP and OTLP/gRPC as [defined here](../opentelemetry/proto). + +OTLP/HTTP uses HTTP POST requests to send telemetry data from clients to +servers. Implementations MAY use HTTP/1.1 or HTTP/2 transports. Implementations +that use HTTP/2 transport SHOULD fallback to HTTP/1.1 transport if HTTP/2 +connection cannot be established. + +#### Binary Protobuf Encoding + +Binary Protobuf encoded payloads use proto3 +[encoding standard](https://developers.google.com/protocol-buffers/docs/encoding). + +The client and the server MUST set "Content-Type: application/x-protobuf" +request and response headers when sending binary Protobuf encoded payload. + +#### JSON Protobuf Encoding + +JSON Protobuf encoded payloads use proto3 standard defined +[JSON Mapping](https://developers.google.com/protocol-buffers/docs/proto3#json) +for mapping between Protobuf and JSON, with the following deviations from that mapping: + +- The `traceId` and `spanId` byte arrays are represented as + [case-insensitive hex-encoded strings](https://tools.ietf.org/html/rfc4648#section-8); + they are not base64-encoded as is defined in the standard + [Protobuf JSON Mapping](https://developers.google.com/protocol-buffers/docs/proto3#json). + Hex encoding is used for `traceId` and `spanId` fields in all OTLP + Protobuf messages, e.g., the `Span`, `Link`, `LogRecord`, etc. messages. + For example, the `traceId` field in a Span can be represented like this: + { "traceId": "5B8EFFF798038103D269B633813FC60C", ... } + +- Values of enum fields MUST be encoded as integer values. Unlike the standard + [Protobuf JSON Mapping](https://developers.google.com/protocol-buffers/docs/proto3#json), + which allows values of enum fields to be encoded as either integer values or + as enum name strings, only integer enum values are allowed in OTLP JSON + Protobuf Encoding; the enum name strings MUST NOT be used. For example, the + `kind` field with a value of SPAN_KIND_SERVER in a Span can be represented + like this: { "kind": 2, ... } + +- OTLP/JSON receivers MUST ignore message fields with unknown names and MUST + unmarshal the message as if the unknown field was not present in the payload. + This aligns with the behavior of the Binary Protobuf unmarshaler and ensures + that adding new fields to OTLP messages does not break existing receivers. + +- The keys of JSON objects are field names converted to lowerCamelCase. Original + field names are not valid to use as keys for JSON objects. + For example, this is a valid JSON representation of a Resource: + `{ "attributes": {...}, "droppedAttributesCount": 123 }`, and this is NOT a valid + representation: + `{ "attributes": {...}, "dropped_attributes_count": 123 }`. + +Note that according to [Protobuf specs]( +https://developers.google.com/protocol-buffers/docs/proto3#json) 64-bit integer +numbers in JSON-encoded payloads are encoded as decimal strings, and either +numbers or strings are accepted when decoding. + +The client and the server MUST set "Content-Type: application/json" request and +response headers when sending JSON Protobuf encoded payload. + +For JSON payload examples see: [OTLP JSON request examples](../examples/README.md) + +#### OTLP/HTTP Request + +Telemetry data is sent via HTTP POST request. The body of the POST request is a +payload either in binary-encoded Protobuf format or in JSON-encoded Protobuf +format. + +The default URL path for requests that carry trace data is `/v1/traces` (for +example the full URL when connecting to "example.com" server will be +`https://example.com/v1/traces`). The request body is a Protobuf-encoded +`ExportTraceServiceRequest` message. + +The default URL path for requests that carry metric data is `/v1/metrics` and +the request body is a Protobuf-encoded `ExportMetricsServiceRequest` message. + +The default URL path for requests that carry log data is `/v1/logs` and the +request body is a Protobuf-encoded `ExportLogsServiceRequest` message. + +The client MAY gzip the content and in that case MUST include +"Content-Encoding: gzip" request header. The client MAY include +"Accept-Encoding: gzip" request header if it can receive gzip-encoded responses. + +Non-default URL paths for requests MAY be configured on the client and server +sides. + +#### OTLP/HTTP Response + +The response body MUST be the appropriate serialized Protobuf message (see +below for the specific message to use in the [Full Success](#full-success-1), +[Partial Success](#partial-success-1) and [Failure](#failures-1) cases). + +The server MUST set "Content-Type: application/x-protobuf" header if the +response body is binary-encoded Protobuf payload. The server MUST set +"Content-Type: application/json" if the response is JSON-encoded Protobuf +payload. The server MUST use the same "Content-Type" in the response as it +received in the request. + +If the request header "Accept-Encoding: gzip" is present in the request the +server MAY gzip-encode the response and set "Content-Encoding: gzip" response +header. + +##### Full Success + +The success response indicates telemetry data is successfully accepted by the +server. + +If the server receives an empty request (a request that does not carry +any telemetry data) the server SHOULD respond with success. + +On success, the server MUST respond with `HTTP 200 OK`. The response body MUST be +a Protobuf-encoded [Export\ServiceResponse](../opentelemetry/proto/collector) +message (`ExportTraceServiceResponse` for traces, +`ExportMetricsServiceResponse` for metrics and +`ExportLogsServiceResponse` for logs). + +The server MUST leave the `partial_success` field unset +in case of a successful response. + +##### Partial Success + +If the request is only partially accepted +(i.e. when the server accepts only parts of the data and rejects the rest), the +server MUST respond with `HTTP 200 OK`. The response body MUST be the same +[Export\ServiceResponse](../opentelemetry/proto/collector) +message as in the [Full Success](#full-success-1) case. + +Additionally, the server MUST initialize the `partial_success` field +(`ExportTracePartialSuccess` message for traces, +`ExportMetricsPartialSuccess` message for metrics and +`ExportLogsPartialSuccess` message for logs), and it MUST set the respective +`rejected_spans`, `rejected_data_points` or `rejected_log_records` field with +the number of spans/data points/log records it rejected. + +The server SHOULD populate the `error_message` field with a human-readable +error message in English. The message should explain why the +server rejected parts of the data and might offer guidance on how users +can address the issues. +The protocol does not attempt to define the structure of the error message. + +Servers MAY also use the `partial_success` field to convey +warnings/suggestions to clients even when it fully accepts the request. +In such cases, the `rejected_` field MUST have a value of `0`, and +the `error_message` field MUST be non-empty. + +The client MUST NOT retry the request when it receives a partial success +response where the `partial_success` is populated. + +##### Failures + +If the processing of the request fails, the server MUST respond with appropriate +`HTTP 4xx` or `HTTP 5xx` status code. See the sections below for more details about +specific failure cases and HTTP status codes that should be used. + +The response body for all `HTTP 4xx` and `HTTP 5xx` responses MUST be a +Protobuf-encoded +[Status](https://godoc.org/google.golang.org/genproto/googleapis/rpc/status#Status) +message that describes the problem. + +This specification does not use `Status.code` field and the server MAY omit +`Status.code` field. The clients are not expected to alter their behavior based +on `Status.code` field but MAY record it for troubleshooting purposes. + +The `Status.message` field SHOULD contain a developer-facing error message as +defined in `Status` message schema. + +The server MAY include `Status.details` field with additional details. Read +below about what this field can contain in each specific failure case. + +The server SHOULD use HTTP response status codes to indicate +retryable and not-retryable errors for a particular erroneous situation. The +client SHOULD honour HTTP response status codes as retryable or not-retryable. +The requests that receive a response status code listed in following table SHOULD +be retried. +All other `4xx` or `5xx` response status codes MUST NOT be retried. + +|HTTP response status code| +|---------| +|429 Too Many Requests| +|502 Bad Gateway| +|503 Service Unavailable| +|504 Gateway Timeout| + +##### Bad Data + +If the processing of the request fails because the request contains data that +cannot be decoded or is otherwise invalid and such failure is permanent, then the +server MUST respond with `HTTP 400 Bad Request`. The `Status.details` field in +the response SHOULD contain a +[BadRequest](https://github.com/googleapis/googleapis/blob/d14bf59a446c14ef16e9931ebfc8e63ab549bf07/google/rpc/error_details.proto#L166) +that describes the bad data. + +The client MUST NOT retry the request when it receives `HTTP 400 Bad Request` +response. + +##### OTLP/HTTP Throttling + +If the server receives more requests than the client is allowed or the server is +overloaded, the server SHOULD respond with `HTTP 429 Too Many Requests` or +`HTTP 503 Service Unavailable` and MAY include +["Retry-After"](https://tools.ietf.org/html/rfc7231#section-7.1.3) header with a +recommended time interval in seconds to wait before retrying. + +The client SHOULD honour the waiting interval specified in the "Retry-After" +header if it is present. If the client receives an `HTTP 429` or an `HTTP 503` +response and the "Retry-After" header is not present in the response, then the +client SHOULD implement an exponential backoff strategy between retries. + +##### All Other Responses + +All other HTTP responses that are not explicitly listed in this document should +be treated according to HTTP specifications. + +If the server disconnects without returning a response, the client SHOULD retry +and send the same request. The client SHOULD implement an exponential backoff +strategy between retries to avoid overwhelming the server. + +#### OTLP/HTTP Connection + +If the client cannot connect to the server, the client SHOULD retry the +connection using an exponential backoff strategy between retries. The interval +between retries must have a random jitter. + +The client SHOULD keep the connection alive between requests. + +Server implementations SHOULD accept OTLP/HTTP with binary-encoded Protobuf +payload and OTLP/HTTP with JSON-encoded Protobuf payload requests on the same +port and multiplex the requests to the corresponding payload decoder based on +the "Content-Type" request header. + +Server implementations MAY accept OTLP/gRPC and OTLP/HTTP requests on the same +port and multiplex the connections to the corresponding transport handler based +on the "Content-Type" request header. + +#### OTLP/HTTP Concurrent Requests + +To achieve higher total throughput, the client MAY send requests using several +parallel HTTP connections. In that case, the maximum number of parallel +connections SHOULD be configurable. + +#### OTLP/HTTP Default Port + +The default network port for OTLP/HTTP is 4318. + +## Implementation Recommendations + +### Multi-Destination Exporting + +An additional complication must be accounted for when one client must send +telemetry data to more than one destination server. When one of the servers +acknowledges the data and the other server does not (yet), the client needs +to decide how to move forward. + +In such a situation, the client SHOULD implement queuing, acknowledgment +handling, and retrying logic per destination. This ensures that servers do not +block each other. The queues SHOULD reference shared, immutable data to be sent, +thus minimizing the memory overhead caused by having multiple queues. + +![Multi-Destination Exporting](img/otlp-multi-destination.png) + +This ensures that all destination servers receive the data regardless of their +speed of reception (within the available limits imposed by the size of the +client-side queue). + +## Known Limitations + +### Request Acknowledgements + +#### Duplicate Data + +In edge cases (e.g. on reconnections, network interruptions, etc) the client has +no way of knowing if recently sent data was delivered if no acknowledgement was +received yet. The client will typically choose to re-send such data to guarantee +delivery, which may result in duplicate data on the server side. This is a +deliberate choice and is considered to be the right tradeoff for telemetry data. + +## Future Versions and Interoperability + +OTLP will evolve and change over time. Future versions of OTLP must be designed +and implemented in a way that ensures that clients and servers that implement +different versions of OTLP can interoperate and exchange telemetry data. Old +clients must be able to talk to new servers and vice versa. Suppose new versions +of OTLP introduce new functionality that cannot be understood and supported by +nodes implementing the old versions of OTLP. In that case, the protocol must +regress to the lowest common denominator from a functional perspective. + +When possible, the interoperability MUST be ensured between all versions of +OTLP that are not declared obsolete. + +OTLP does not use explicit protocol version numbering. OTLP's interoperability +of clients and servers of different versions is based on the following concepts: + +1. OTLP (current and future versions) defines a set of capabilities, some of + which are mandatory, while others are optional. Clients and servers must implement + mandatory capabilities and can choose to implement only a subset of optional + capabilities. + +2. For minor changes to the protocol, future versions and extensions of OTLP are + encouraged to use the Protobuf's ability to evolve the message schema in + a backward-compatible manner. Newer versions of OTLP may add new fields to + messages that will be ignored by clients and servers that do not understand + these fields. In many cases, careful design of such schema changes and correct + choice of default values for new fields is enough to ensure interoperability + of different versions without nodes explicitly detecting that their peer node + has different capabilities. + +3. More significant changes must be explicitly defined as new optional + capabilities in future OTEPs. Such capabilities SHOULD be discovered by + client and server implementations after establishing the underlying + transport. The exact discovery mechanism SHOULD be described in future OTEPs, + which define the new capabilities and typically can be implemented by making + a discovery request/response message exchange from the client to server. The + mandatory capabilities defined by this specification are implied and do not + require discovery. The implementation which supports a new, optional + capability MUST adjust its behavior to match the expectation of a peer that + does not support a particular capability. + +## Glossary + +There are 2 parties involved in telemetry data exchange. In this document the +party that is the source of telemetry data is called the `Client`, the party +that is the destination of telemetry data is called the `Server`. + +![Client-Server](img/otlp-client-server.png) + +Examples of a Client are instrumented applications or sending side of telemetry +collectors, examples of Servers are telemetry backends or receiving side of +telemetry collectors (so a Collector is typically both a Client and a Server +depending on which side you look from). + +Both the Client and the Server are also a `Node`. This term is used in the +document when referring to either one. + +## References + +- [OTEP 0035](https://github.com/open-telemetry/oteps/blob/main/text/0035-opentelemetry-protocol.md) OpenTelemetry Protocol Specification +- [OTEP 0099](https://github.com/open-telemetry/oteps/blob/main/text/0099-otlp-http.md) OTLP/HTTP: HTTP Transport Extension for OTLP +- [OTEP 0122](https://github.com/open-telemetry/oteps/blob/main/text/0122-otlp-http-json.md) OTLP: JSON Encoding for OTLP/HTTP diff -Nru temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/examples/logs.json temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/examples/logs.json --- temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/examples/logs.json 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/examples/logs.json 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,100 @@ +{ + "resourceLogs": [ + { + "resource": { + "attributes": [ + { + "key": "service.name", + "value": { + "stringValue": "my.service" + } + } + ] + }, + "scopeLogs": [ + { + "scope": { + "name": "my.library", + "version": "1.0.0", + "attributes": [ + { + "key": "my.scope.attribute", + "value": { + "stringValue": "some scope attribute" + } + } + ] + }, + "logRecords": [ + { + "timeUnixNano": 1544712660300000000, + "observedTimeUnixNano": 1544712660300000000, + "severityText": "Information", + "traceId": "5B8EFFF798038103D269B633813FC60C", + "spanId": "EEE19B7EC3C1B174", + "body": { + "stringValue": "Example log record" + }, + "attributes": [ + { + "key": "string.attribute", + "value": { + "stringValue": "some string" + } + }, + { + "key": "boolean.attribute", + "value": { + "boolValue": true + } + }, + { + "key": "int.attribute", + "value": { + "intValue": 10 + } + }, + { + "key": "double.attribute", + "value": { + "doubleValue": 637.704 + } + }, + { + "key": "array.attribute", + "value": { + "arrayValue": { + "values": [ + { + "stringValue": "many" + }, + { + "stringValue": "values" + } + ] + } + } + }, + { + "key": "map.attribute", + "value": { + "kvlistValue": { + "values": [ + { + "key": "some.map.key", + "value": { + "stringValue": "some value" + } + } + ] + } + } + } + ] + } + ] + } + ] + } + ] +} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/examples/metrics.json temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/examples/metrics.json --- temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/examples/metrics.json 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/examples/metrics.json 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,107 @@ +{ + "resourceMetrics": [ + { + "resource": { + "attributes": [ + { + "key": "service.name", + "value": { + "stringValue": "my.service" + } + } + ] + }, + "scopeMetrics": [ + { + "scope": { + "name": "my.library", + "version": "1.0.0", + "attributes": [ + { + "key": "my.scope.attribute", + "value": { + "stringValue": "some scope attribute" + } + } + ] + }, + "metrics": [ + { + "name": "my.counter", + "unit": "1", + "description": "I'm a Counter", + "sum": { + "aggregationTemporality": 1, + "isMonotonic": true, + "dataPoints": [ + { + "asDouble": 5, + "startTimeUnixNano": 1544712660300000000, + "timeUnixNano": 1544712660300000000, + "attributes": [ + { + "key": "my.counter.attr", + "value": { + "stringValue": "some value" + } + } + ] + } + ] + } + }, + { + "name": "my.gauge", + "unit": "1", + "description": "I'm a Gauge", + "gauge": { + "dataPoints": [ + { + "asDouble": 10, + "timeUnixNano": 1544712660300000000, + "attributes": [ + { + "key": "my.gauge.attr", + "value": { + "stringValue": "some value" + } + } + ] + } + ] + } + }, + { + "name": "my.histogram", + "unit": "1", + "description": "I'm a Histogram", + "histogram": { + "aggregationTemporality": 1, + "dataPoints": [ + { + "startTimeUnixNano": 1544712660300000000, + "timeUnixNano": 1544712660300000000, + "count": 3, + "sum": 3, + "bucketCounts": [1,1,1], + "explicitBounds": [1], + "min": 1, + "max": 1, + "attributes": [ + { + "key": "my.histogram.attr", + "value": { + "stringValue": "some value" + } + } + ] + } + ] + } + } + ] + } + ] + } + ] +} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/examples/README.md temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/examples/README.md --- temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/examples/README.md 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/examples/README.md 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,43 @@ +# OTLP JSON request examples + +This folder contains a collection of example OTLP JSON files for all signals +that can be used as request payloads. + +- Trace [trace.json](trace.json) +- Metrics [metrics.json](metrics.json) +- Logs [logs.json](logs.json) + +## Trying it out + +First run a OpenTelemetry collector with the following configuration: + +```yaml +receivers: + otlp: + protocols: + http: + +exporters: + logging: + verbosity: detailed + +service: + pipelines: + traces: + receivers: [otlp] + exporters: [logging] + metrics: + receivers: [otlp] + exporters: [logging] + logs: + receivers: [otlp] + exporters: [logging] +``` + +Then send a curl request to the collector (e.g. for Logs): + +```shell +curl -X POST -H "Content-Type: application/json" -d @logs.json -i localhost:4318/v1/logs +``` + +> Remember to change the URL path when sending other signals (traces/metrics). diff -Nru temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/examples/trace.json temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/examples/trace.json --- temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/examples/trace.json 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/examples/trace.json 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,51 @@ +{ + "resourceSpans": [ + { + "resource": { + "attributes": [ + { + "key": "service.name", + "value": { + "stringValue": "my.service" + } + } + ] + }, + "scopeSpans": [ + { + "scope": { + "name": "my.library", + "version": "1.0.0", + "attributes": [ + { + "key": "my.scope.attribute", + "value": { + "stringValue": "some scope attribute" + } + } + ] + }, + "spans": [ + { + "traceId": "5B8EFFF798038103D269B633813FC60C", + "spanId": "EEE19B7EC3C1B174", + "parentSpanId": "EEE19B7EC3C1B173", + "name": "I'm a server span", + "startTimeUnixNano": 1544712660000000000, + "endTimeUnixNano": 1544712661000000000, + "kind": 2, + "attributes": [ + { + "key": "my.span.attr", + "value": { + "stringValue": "some value" + } + } + ] + } + ] + } + ] + } + ] +} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/Makefile temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/Makefile --- temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/Makefile 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/Makefile 2023-10-30 19:40:00.000000000 +0000 @@ -13,13 +13,22 @@ endef +.PHONY: all +all: gen-all markdown-link-check + # Generate all implementations .PHONY: gen-all gen-all: gen-cpp gen-csharp gen-go gen-java gen-kotlin gen-objc gen-openapi gen-php gen-python gen-ruby OTEL_DOCKER_PROTOBUF ?= otel/build-protobuf:0.9.0 +BUF_DOCKER ?= bufbuild/buf:1.7.0 + PROTOC := docker run --rm -u ${shell id -u} -v${PWD}:${PWD} -w${PWD} ${OTEL_DOCKER_PROTOBUF} --proto_path=${PWD} -PROTO_INCLUDES := -I/usr/include/github.com/gogo/protobuf +BUF := docker run --rm -v "${PWD}:/workspace" -w /workspace ${BUF_DOCKER} +# When checking for protobuf breaking changes, check against the latest release tag +LAST_RELEASE_TAG := $(shell git tag --sort=committerdate | tail -1) +# Options are described in https://docs.buf.build/breaking/usage#git +BUF_AGAINST ?= "https://github.com/open-telemetry/opentelemetry-proto.git\#tag=$(LAST_RELEASE_TAG)" PROTO_GEN_CPP_DIR ?= $(GENDIR)/cpp PROTO_GEN_CSHARP_DIR ?= $(GENDIR)/csharp @@ -37,6 +46,7 @@ .PHONY: docker-pull docker-pull: docker pull $(OTEL_DOCKER_PROTOBUF) + docker pull $(BUF_DOCKER) # Generate gRPC/Protobuf implementation for C++. .PHONY: gen-cpp @@ -63,7 +73,7 @@ gen-go: rm -rf ./$(PROTO_GEN_GO_DIR) mkdir -p ./$(PROTO_GEN_GO_DIR) - $(foreach file,$(PROTO_FILES),$(call exec-command,$(PROTOC) $(PROTO_INCLUDES) --gogo_out=plugins=grpc:./$(PROTO_GEN_GO_DIR) $(file))) + $(foreach file,$(PROTO_FILES),$(call exec-command,$(PROTOC) --go_out=plugins=grpc:./$(PROTO_GEN_GO_DIR) $(file))) $(PROTOC) --grpc-gateway_out=logtostderr=true,grpc_api_configuration=opentelemetry/proto/collector/trace/v1/trace_service_http.yaml:./$(PROTO_GEN_GO_DIR) opentelemetry/proto/collector/trace/v1/trace_service.proto $(PROTOC) --grpc-gateway_out=logtostderr=true,grpc_api_configuration=opentelemetry/proto/collector/metrics/v1/metrics_service_http.yaml:./$(PROTO_GEN_GO_DIR) opentelemetry/proto/collector/metrics/v1/metrics_service.proto $(PROTOC) --grpc-gateway_out=logtostderr=true,grpc_api_configuration=opentelemetry/proto/collector/logs/v1/logs_service_http.yaml:./$(PROTO_GEN_GO_DIR) opentelemetry/proto/collector/logs/v1/logs_service.proto @@ -140,3 +150,18 @@ $(PROTOC) --ruby_out=./$(PROTO_GEN_RUBY_DIR) --grpc-ruby_out=./$(PROTO_GEN_RUBY_DIR) opentelemetry/proto/collector/trace/v1/trace_service.proto $(PROTOC) --ruby_out=./$(PROTO_GEN_RUBY_DIR) --grpc-ruby_out=./$(PROTO_GEN_RUBY_DIR) opentelemetry/proto/collector/metrics/v1/metrics_service.proto $(PROTOC) --ruby_out=./$(PROTO_GEN_RUBY_DIR) --grpc-ruby_out=./$(PROTO_GEN_RUBY_DIR) opentelemetry/proto/collector/logs/v1/logs_service.proto + +.PHONY: breaking-change +breaking-change: + $(BUF) breaking --against $(BUF_AGAINST) $(BUF_FLAGS) + + +ALL_DOCS := $(shell find . -type f -name '*.md' -not -path './.github/*' -not -path './node_modules/*' | sort) + +.PHONY: markdown-link-check +markdown-link-check: + @if ! npm ls markdown-link-check; then npm install; fi + @for f in $(ALL_DOCS); do \ + npx --no -- markdown-link-check --quiet --config .markdown_link_check_config.json $$f \ + || exit 1; \ + done diff -Nru temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/opentelemetry/proto/collector/logs/v1/logs_service.proto temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/opentelemetry/proto/collector/logs/v1/logs_service.proto --- temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/opentelemetry/proto/collector/logs/v1/logs_service.proto 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/opentelemetry/proto/collector/logs/v1/logs_service.proto 2023-10-30 19:40:00.000000000 +0000 @@ -14,13 +14,11 @@ syntax = "proto3"; -// NOTE: This proto is experimental and is subject to change at this point. -// Please do not use it at the moment. - package opentelemetry.proto.collector.logs.v1; import "opentelemetry/proto/logs/v1/logs.proto"; +option csharp_namespace = "OpenTelemetry.Proto.Collector.Logs.V1"; option java_multiple_files = true; option java_package = "io.opentelemetry.proto.collector.logs.v1"; option java_outer_classname = "LogsServiceProto"; @@ -45,4 +43,37 @@ } message ExportLogsServiceResponse { + // The details of a partially successful export request. + // + // If the request is only partially accepted + // (i.e. when the server accepts only parts of the data and rejects the rest) + // the server MUST initialize the `partial_success` field and MUST + // set the `rejected_` with the number of items it rejected. + // + // Servers MAY also make use of the `partial_success` field to convey + // warnings/suggestions to senders even when the request was fully accepted. + // In such cases, the `rejected_` MUST have a value of `0` and + // the `error_message` MUST be non-empty. + // + // A `partial_success` message with an empty value (rejected_ = 0 and + // `error_message` = "") is equivalent to it not being set/present. Senders + // SHOULD interpret it the same way as in the full success case. + ExportLogsPartialSuccess partial_success = 1; +} + +message ExportLogsPartialSuccess { + // The number of rejected log records. + // + // A `rejected_` field holding a `0` value indicates that the + // request was fully accepted. + int64 rejected_log_records = 1; + + // A developer-facing human-readable message in English. It should be used + // either to explain why the server rejected parts of the data during a partial + // success or to convey warnings/suggestions during a full success. The message + // should offer guidance on how users can address such issues. + // + // error_message is an optional field. An error_message with an empty value + // is equivalent to it not being set. + string error_message = 2; } diff -Nru temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/opentelemetry/proto/collector/metrics/v1/metrics_service.proto temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/opentelemetry/proto/collector/metrics/v1/metrics_service.proto --- temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/opentelemetry/proto/collector/metrics/v1/metrics_service.proto 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/opentelemetry/proto/collector/metrics/v1/metrics_service.proto 2023-10-30 19:40:00.000000000 +0000 @@ -18,6 +18,7 @@ import "opentelemetry/proto/metrics/v1/metrics.proto"; +option csharp_namespace = "OpenTelemetry.Proto.Collector.Metrics.V1"; option java_multiple_files = true; option java_package = "io.opentelemetry.proto.collector.metrics.v1"; option java_outer_classname = "MetricsServiceProto"; @@ -42,4 +43,37 @@ } message ExportMetricsServiceResponse { + // The details of a partially successful export request. + // + // If the request is only partially accepted + // (i.e. when the server accepts only parts of the data and rejects the rest) + // the server MUST initialize the `partial_success` field and MUST + // set the `rejected_` with the number of items it rejected. + // + // Servers MAY also make use of the `partial_success` field to convey + // warnings/suggestions to senders even when the request was fully accepted. + // In such cases, the `rejected_` MUST have a value of `0` and + // the `error_message` MUST be non-empty. + // + // A `partial_success` message with an empty value (rejected_ = 0 and + // `error_message` = "") is equivalent to it not being set/present. Senders + // SHOULD interpret it the same way as in the full success case. + ExportMetricsPartialSuccess partial_success = 1; +} + +message ExportMetricsPartialSuccess { + // The number of rejected data points. + // + // A `rejected_` field holding a `0` value indicates that the + // request was fully accepted. + int64 rejected_data_points = 1; + + // A developer-facing human-readable message in English. It should be used + // either to explain why the server rejected parts of the data during a partial + // success or to convey warnings/suggestions during a full success. The message + // should offer guidance on how users can address such issues. + // + // error_message is an optional field. An error_message with an empty value + // is equivalent to it not being set. + string error_message = 2; } diff -Nru temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/opentelemetry/proto/collector/README.md temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/opentelemetry/proto/collector/README.md --- temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/opentelemetry/proto/collector/README.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/opentelemetry/proto/collector/README.md 2023-10-30 19:40:00.000000000 +0000 @@ -7,3 +7,4 @@ 1. `common` package contains the common messages shared between different services. 2. `trace` package contains the Trace Service protos. 3. `metrics` package contains the Metrics Service protos. +4. `logs` package contains the Logs Service protos. diff -Nru temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/opentelemetry/proto/collector/trace/v1/trace_service_http.yaml temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/opentelemetry/proto/collector/trace/v1/trace_service_http.yaml --- temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/opentelemetry/proto/collector/trace/v1/trace_service_http.yaml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/opentelemetry/proto/collector/trace/v1/trace_service_http.yaml 2023-10-30 19:40:00.000000000 +0000 @@ -5,5 +5,5 @@ http: rules: - selector: opentelemetry.proto.collector.trace.v1.TraceService.Export - post: /v1/trace - body: "*" \ No newline at end of file + post: /v1/traces + body: "*" diff -Nru temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/opentelemetry/proto/collector/trace/v1/trace_service.proto temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/opentelemetry/proto/collector/trace/v1/trace_service.proto --- temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/opentelemetry/proto/collector/trace/v1/trace_service.proto 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/opentelemetry/proto/collector/trace/v1/trace_service.proto 2023-10-30 19:40:00.000000000 +0000 @@ -18,6 +18,7 @@ import "opentelemetry/proto/trace/v1/trace.proto"; +option csharp_namespace = "OpenTelemetry.Proto.Collector.Trace.V1"; option java_multiple_files = true; option java_package = "io.opentelemetry.proto.collector.trace.v1"; option java_outer_classname = "TraceServiceProto"; @@ -42,4 +43,37 @@ } message ExportTraceServiceResponse { + // The details of a partially successful export request. + // + // If the request is only partially accepted + // (i.e. when the server accepts only parts of the data and rejects the rest) + // the server MUST initialize the `partial_success` field and MUST + // set the `rejected_` with the number of items it rejected. + // + // Servers MAY also make use of the `partial_success` field to convey + // warnings/suggestions to senders even when the request was fully accepted. + // In such cases, the `rejected_` MUST have a value of `0` and + // the `error_message` MUST be non-empty. + // + // A `partial_success` message with an empty value (rejected_ = 0 and + // `error_message` = "") is equivalent to it not being set/present. Senders + // SHOULD interpret it the same way as in the full success case. + ExportTracePartialSuccess partial_success = 1; +} + +message ExportTracePartialSuccess { + // The number of rejected spans. + // + // A `rejected_` field holding a `0` value indicates that the + // request was fully accepted. + int64 rejected_spans = 1; + + // A developer-facing human-readable message in English. It should be used + // either to explain why the server rejected parts of the data during a partial + // success or to convey warnings/suggestions during a full success. The message + // should offer guidance on how users can address such issues. + // + // error_message is an optional field. An error_message with an empty value + // is equivalent to it not being set. + string error_message = 2; } diff -Nru temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/opentelemetry/proto/common/v1/common.proto temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/opentelemetry/proto/common/v1/common.proto --- temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/opentelemetry/proto/common/v1/common.proto 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/opentelemetry/proto/common/v1/common.proto 2023-10-30 19:40:00.000000000 +0000 @@ -16,6 +16,7 @@ package opentelemetry.proto.common.v1; +option csharp_namespace = "OpenTelemetry.Proto.Common.V1"; option java_multiple_files = true; option java_package = "io.opentelemetry.proto.common.v1"; option java_outer_classname = "CommonProto"; @@ -65,10 +66,16 @@ AnyValue value = 2; } -// InstrumentationLibrary is a message representing the instrumentation library information +// InstrumentationScope is a message representing the instrumentation scope information // such as the fully qualified name and version. -message InstrumentationLibrary { - // An empty instrumentation library name means the name is unknown. +message InstrumentationScope { + // An empty instrumentation scope name means the name is unknown. string name = 1; string version = 2; + + // Additional attributes that describe the scope. [Optional]. + // Attribute keys MUST be unique (it is not allowed to have more than one + // attribute with the same key). + repeated KeyValue attributes = 3; + uint32 dropped_attributes_count = 4; } diff -Nru temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/opentelemetry/proto/logs/v1/logs.proto temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/opentelemetry/proto/logs/v1/logs.proto --- temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/opentelemetry/proto/logs/v1/logs.proto 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/opentelemetry/proto/logs/v1/logs.proto 2023-10-30 19:40:00.000000000 +0000 @@ -19,6 +19,7 @@ import "opentelemetry/proto/common/v1/common.proto"; import "opentelemetry/proto/resource/v1/resource.proto"; +option csharp_namespace = "OpenTelemetry.Proto.Logs.V1"; option java_multiple_files = true; option java_package = "io.opentelemetry.proto.logs.v1"; option java_outer_classname = "LogsProto"; @@ -43,27 +44,28 @@ repeated ResourceLogs resource_logs = 1; } -// A collection of InstrumentationLibraryLogs from a Resource. +// A collection of ScopeLogs from a Resource. message ResourceLogs { + reserved 1000; + // The resource for the logs in this message. // If this field is not set then resource info is unknown. opentelemetry.proto.resource.v1.Resource resource = 1; - // A list of InstrumentationLibraryLogs that originate from a resource. - repeated InstrumentationLibraryLogs instrumentation_library_logs = 2; + // A list of ScopeLogs that originate from a resource. + repeated ScopeLogs scope_logs = 2; // This schema_url applies to the data in the "resource" field. It does not apply - // to the data in the "instrumentation_library_logs" field which have their own - // schema_url field. + // to the data in the "scope_logs" field which have their own schema_url field. string schema_url = 3; } -// A collection of Logs produced by an InstrumentationLibrary. -message InstrumentationLibraryLogs { - // The instrumentation library information for the logs in this message. - // Semantically when InstrumentationLibrary isn't set, it is equivalent with - // an empty instrumentation library name (unknown). - opentelemetry.proto.common.v1.InstrumentationLibrary instrumentation_library = 1; +// A collection of Logs produced by a Scope. +message ScopeLogs { + // The instrumentation scope information for the logs in this message. + // Semantically when InstrumentationScope isn't set, it is equivalent with + // an empty instrumentation scope name (unknown). + opentelemetry.proto.common.v1.InstrumentationScope scope = 1; // A list of log records. repeated LogRecord log_records = 2; @@ -102,15 +104,28 @@ SEVERITY_NUMBER_FATAL4 = 24; } -// Masks for LogRecord.flags field. +// LogRecordFlags is defined as a protobuf 'uint32' type and is to be used as +// bit-fields. Each non-zero value defined in this enum is a bit-mask. +// To extract the bit-field, for example, use an expression like: +// +// (logRecord.flags & LOG_RECORD_FLAGS_TRACE_FLAGS_MASK) +// enum LogRecordFlags { - LOG_RECORD_FLAG_UNSPECIFIED = 0; - LOG_RECORD_FLAG_TRACE_FLAGS_MASK = 0x000000FF; + // The zero value for the enum. Should not be used for comparisons. + // Instead use bitwise "and" with the appropriate mask as shown above. + LOG_RECORD_FLAGS_DO_NOT_USE = 0; + + // Bits 0-7 are used for trace flags. + LOG_RECORD_FLAGS_TRACE_FLAGS_MASK = 0x000000FF; + + // Bits 8-31 are reserved for future use. } // A log record according to OpenTelemetry Log Data Model: // https://github.com/open-telemetry/oteps/blob/main/text/logs/0097-log-data-model.md message LogRecord { + reserved 4; + // time_unix_nano is the time when the event occurred. // Value is UNIX Epoch time in nanoseconds since 00:00:00 UTC on 1 January 1970. // Value of 0 indicates unknown or missing timestamp. @@ -141,13 +156,6 @@ // it is known at the source. [Optional]. string severity_text = 3; - // Short event identifier that does not contain varying parts. Name describes - // what happened (e.g. "ProcessStarted"). Recommended to be no longer than 50 - // characters. Not guaranteed to be unique in any way. [Optional]. - // This deprecated field is planned to be removed March 15, 2022. Receivers can - // ignore this field. - string name = 4 [deprecated = true]; - // A value containing the body of the log record. Can be for example a human-readable // string message (including multi-line) describing the event in a free form or it can // be a structured data composed of arrays and maps of other values. [Optional]. @@ -163,18 +171,33 @@ // defined in W3C Trace Context specification. 24 most significant bits are reserved // and must be set to 0. Readers must not assume that 24 most significant bits // will be zero and must correctly mask the bits when reading 8-bit trace flag (use - // flags & TRACE_FLAGS_MASK). [Optional]. + // flags & LOG_RECORD_FLAGS_TRACE_FLAGS_MASK). [Optional]. fixed32 flags = 8; // A unique identifier for a trace. All logs from the same trace share - // the same `trace_id`. The ID is a 16-byte array. An ID with all zeroes - // is considered invalid. Can be set for logs that are part of request processing - // and have an assigned trace id. [Optional]. + // the same `trace_id`. The ID is a 16-byte array. An ID with all zeroes OR + // of length other than 16 bytes is considered invalid (empty string in OTLP/JSON + // is zero-length and thus is also invalid). + // + // This field is optional. + // + // The receivers SHOULD assume that the log record is not associated with a + // trace if any of the following is true: + // - the field is not present, + // - the field contains an invalid value. bytes trace_id = 9; // A unique identifier for a span within a trace, assigned when the span - // is created. The ID is an 8-byte array. An ID with all zeroes is considered - // invalid. Can be set for logs that are part of a particular processing span. - // If span_id is present trace_id SHOULD be also present. [Optional]. + // is created. The ID is an 8-byte array. An ID with all zeroes OR of length + // other than 8 bytes is considered invalid (empty string in OTLP/JSON + // is zero-length and thus is also invalid). + // + // This field is optional. If the sender specifies a valid span_id then it SHOULD also + // specify a valid trace_id. + // + // The receivers SHOULD assume that the log record is not associated with a + // span if any of the following is true: + // - the field is not present, + // - the field contains an invalid value. bytes span_id = 10; } diff -Nru temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/opentelemetry/proto/metrics/v1/metrics.proto temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/opentelemetry/proto/metrics/v1/metrics.proto --- temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/opentelemetry/proto/metrics/v1/metrics.proto 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/opentelemetry/proto/metrics/v1/metrics.proto 2023-10-30 19:40:00.000000000 +0000 @@ -19,6 +19,7 @@ import "opentelemetry/proto/common/v1/common.proto"; import "opentelemetry/proto/resource/v1/resource.proto"; +option csharp_namespace = "OpenTelemetry.Proto.Metrics.V1"; option java_multiple_files = true; option java_package = "io.opentelemetry.proto.metrics.v1"; option java_outer_classname = "MetricsProto"; @@ -43,27 +44,28 @@ repeated ResourceMetrics resource_metrics = 1; } -// A collection of InstrumentationLibraryMetrics from a Resource. +// A collection of ScopeMetrics from a Resource. message ResourceMetrics { + reserved 1000; + // The resource for the metrics in this message. // If this field is not set then no resource info is known. opentelemetry.proto.resource.v1.Resource resource = 1; // A list of metrics that originate from a resource. - repeated InstrumentationLibraryMetrics instrumentation_library_metrics = 2; + repeated ScopeMetrics scope_metrics = 2; // This schema_url applies to the data in the "resource" field. It does not apply - // to the data in the "instrumentation_library_metrics" field which have their own - // schema_url field. + // to the data in the "scope_metrics" field which have their own schema_url field. string schema_url = 3; } -// A collection of Metrics produced by an InstrumentationLibrary. -message InstrumentationLibraryMetrics { - // The instrumentation library information for the metrics in this message. - // Semantically when InstrumentationLibrary isn't set, it is equivalent with - // an empty instrumentation library name (unknown). - opentelemetry.proto.common.v1.InstrumentationLibrary instrumentation_library = 1; +// A collection of Metrics produced by an Scope. +message ScopeMetrics { + // The instrumentation scope information for the metrics in this message. + // Semantically when InstrumentationScope isn't set, it is equivalent with + // an empty instrumentation scope name (unknown). + opentelemetry.proto.common.v1.InstrumentationScope scope = 1; // A list of metrics that originate from an instrumentation library. repeated Metric metrics = 2; @@ -75,7 +77,7 @@ // Defines a Metric which has one or more timeseries. The following is a // brief summary of the Metric data model. For more details, see: // -// https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/metrics/datamodel.md +// https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/metrics/data-model.md // // // The data model and relation between entities is shown in the @@ -314,15 +316,17 @@ // enum is a bit-mask. To test the presence of a single flag in the flags of // a data point, for example, use an expression like: // -// (point.flags & FLAG_NO_RECORDED_VALUE) == FLAG_NO_RECORDED_VALUE +// (point.flags & DATA_POINT_FLAGS_NO_RECORDED_VALUE_MASK) == DATA_POINT_FLAGS_NO_RECORDED_VALUE_MASK // enum DataPointFlags { - FLAG_NONE = 0; + // The zero value for the enum. Should not be used for comparisons. + // Instead use bitwise "and" with the appropriate mask as shown above. + DATA_POINT_FLAGS_DO_NOT_USE = 0; // This DataPoint is valid but has no recorded value. This value // SHOULD be used to reflect explicitly missing data in a series, as // for an equivalent to the Prometheus "staleness marker". - FLAG_NO_RECORDED_VALUE = 1; + DATA_POINT_FLAGS_NO_RECORDED_VALUE_MASK = 1; // Bits 2-31 are reserved for future use. } @@ -412,7 +416,7 @@ // Negative events *can* be recorded, but sum should not be filled out when // doing so. This is specifically to enforce compatibility w/ OpenMetrics, // see: https://github.com/OpenObservability/OpenMetrics/blob/main/specification/OpenMetrics.md#histogram - double sum = 5; + optional double sum = 5; // bucket_counts is an optional field contains the count values of histogram // for each bucket. @@ -445,6 +449,12 @@ // Flags that apply to this specific data point. See DataPointFlags // for the available flags and their meaning. uint32 flags = 10; + + // min is the minimum value over (start_time, end_time]. + optional double min = 11; + + // max is the maximum value over (start_time, end_time]. + optional double max = 12; } // ExponentialHistogramDataPoint is a single data point in a timeseries that describes the @@ -485,7 +495,7 @@ // Negative events *can* be recorded, but sum should not be filled out when // doing so. This is specifically to enforce compatibility w/ OpenMetrics, // see: https://github.com/OpenObservability/OpenMetrics/blob/main/specification/OpenMetrics.md#histogram - double sum = 5; + optional double sum = 5; // scale describes the resolution of the histogram. Boundaries are // located at powers of the base, where: @@ -493,8 +503,8 @@ // base = (2^(2^-scale)) // // The histogram bucket identified by `index`, a signed integer, - // contains values that are greater than or equal to (base^index) and - // less than (base^(index+1)). + // contains values that are greater than (base^index) and + // less than or equal to (base^(index+1)). // // The positive and negative ranges of the histogram are expressed // separately. Negative values are mapped by their absolute value @@ -528,9 +538,9 @@ // Note: This uses a varint encoding as a simple form of compression. sint32 offset = 1; - // Count is an array of counts, where count[i] carries the count - // of the bucket at index (offset+i). count[i] is the count of - // values greater than or equal to base^(offset+i) and less than + // bucket_counts is an array of count values, where bucket_counts[i] carries + // the count of the bucket at index (offset+i). bucket_counts[i] is the count + // of values greater than base^(offset+i) and less than or equal to // base^(offset+i+1). // // Note: By contrast, the explicit HistogramDataPoint uses @@ -547,6 +557,20 @@ // (Optional) List of exemplars collected from // measurements that were used to form the data point repeated Exemplar exemplars = 11; + + // min is the minimum value over (start_time, end_time]. + optional double min = 12; + + // max is the maximum value over (start_time, end_time]. + optional double max = 13; + + // ZeroThreshold may be optionally set to convey the width of the zero + // region. Where the zero region is defined as the closed interval + // [-ZeroThreshold, ZeroThreshold]. + // When ZeroThreshold is 0, zero count bucket stores values that cannot be + // expressed using the standard exponential formula as well as values that + // have been rounded to zero. + double zero_threshold = 14; } // SummaryDataPoint is a single data point in a timeseries that describes the diff -Nru temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/opentelemetry/proto/resource/v1/resource.proto temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/opentelemetry/proto/resource/v1/resource.proto --- temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/opentelemetry/proto/resource/v1/resource.proto 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/opentelemetry/proto/resource/v1/resource.proto 2023-10-30 19:40:00.000000000 +0000 @@ -18,6 +18,7 @@ import "opentelemetry/proto/common/v1/common.proto"; +option csharp_namespace = "OpenTelemetry.Proto.Resource.V1"; option java_multiple_files = true; option java_package = "io.opentelemetry.proto.resource.v1"; option java_outer_classname = "ResourceProto"; diff -Nru temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/opentelemetry/proto/trace/v1/trace_config.proto temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/opentelemetry/proto/trace/v1/trace_config.proto --- temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/opentelemetry/proto/trace/v1/trace_config.proto 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/opentelemetry/proto/trace/v1/trace_config.proto 1970-01-01 00:00:00.000000000 +0000 @@ -1,78 +0,0 @@ -// Copyright 2019, OpenTelemetry Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -syntax = "proto3"; - -package opentelemetry.proto.trace.v1; - -option java_multiple_files = true; -option java_package = "io.opentelemetry.proto.trace.v1"; -option java_outer_classname = "TraceConfigProto"; -option go_package = "go.opentelemetry.io/proto/otlp/collector/trace/v1"; - -// Global configuration of the trace service. All fields must be specified, or -// the default (zero) values will be used for each type. -message TraceConfig { - - // The global default sampler used to make decisions on span sampling. - oneof sampler { - ConstantSampler constant_sampler = 1; - - TraceIdRatioBased trace_id_ratio_based = 2; - - RateLimitingSampler rate_limiting_sampler = 3; - } - - // The global default max number of attributes per span. - int64 max_number_of_attributes = 4; - - // The global default max number of annotation events per span. - int64 max_number_of_timed_events= 5; - - // The global default max number of attributes per timed event. - int64 max_number_of_attributes_per_timed_event = 6; - - // The global default max number of link entries per span. - int64 max_number_of_links = 7; - - // The global default max number of attributes per span. - int64 max_number_of_attributes_per_link = 8; -} - -// Sampler that always makes a constant decision on span sampling. -message ConstantSampler { - // How spans should be sampled: - // - Always off - // - Always on - // - Always follow the parent Span's decision (off if no parent). - enum ConstantDecision { - ALWAYS_OFF = 0; - ALWAYS_ON = 1; - ALWAYS_PARENT = 2; - } - ConstantDecision decision = 1; -} - -// Sampler that tries to uniformly sample traces with a given ratio. -// The ratio of sampling a trace is equal to that of the specified ratio. -message TraceIdRatioBased { - // The desired ratio of sampling. Must be within [0.0, 1.0]. - double samplingRatio = 1; -} - -// Sampler that tries to sample with a rate per time window. -message RateLimitingSampler { - // Rate per second. - int64 qps = 1; -} diff -Nru temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/opentelemetry/proto/trace/v1/trace.proto temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/opentelemetry/proto/trace/v1/trace.proto --- temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/opentelemetry/proto/trace/v1/trace.proto 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/opentelemetry/proto/trace/v1/trace.proto 2023-10-30 19:40:00.000000000 +0000 @@ -19,6 +19,7 @@ import "opentelemetry/proto/common/v1/common.proto"; import "opentelemetry/proto/resource/v1/resource.proto"; +option csharp_namespace = "OpenTelemetry.Proto.Trace.V1"; option java_multiple_files = true; option java_package = "io.opentelemetry.proto.trace.v1"; option java_outer_classname = "TraceProto"; @@ -43,61 +44,52 @@ repeated ResourceSpans resource_spans = 1; } -// A collection of InstrumentationLibrarySpans from a Resource. +// A collection of ScopeSpans from a Resource. message ResourceSpans { + reserved 1000; + // The resource for the spans in this message. // If this field is not set then no resource info is known. opentelemetry.proto.resource.v1.Resource resource = 1; - // A list of InstrumentationLibrarySpans that originate from a resource. - repeated InstrumentationLibrarySpans instrumentation_library_spans = 2; + // A list of ScopeSpans that originate from a resource. + repeated ScopeSpans scope_spans = 2; // This schema_url applies to the data in the "resource" field. It does not apply - // to the data in the "instrumentation_library_spans" field which have their own - // schema_url field. + // to the data in the "scope_spans" field which have their own schema_url field. string schema_url = 3; } -// A collection of Spans produced by an InstrumentationLibrary. -message InstrumentationLibrarySpans { - // The instrumentation library information for the spans in this message. - // Semantically when InstrumentationLibrary isn't set, it is equivalent with - // an empty instrumentation library name (unknown). - opentelemetry.proto.common.v1.InstrumentationLibrary instrumentation_library = 1; +// A collection of Spans produced by an InstrumentationScope. +message ScopeSpans { + // The instrumentation scope information for the spans in this message. + // Semantically when InstrumentationScope isn't set, it is equivalent with + // an empty instrumentation scope name (unknown). + opentelemetry.proto.common.v1.InstrumentationScope scope = 1; - // A list of Spans that originate from an instrumentation library. + // A list of Spans that originate from an instrumentation scope. repeated Span spans = 2; // This schema_url applies to all spans and span events in the "spans" field. string schema_url = 3; } -// Span represents a single operation within a trace. Spans can be -// nested to form a trace tree. Spans may also be linked to other spans -// from the same or different trace and form graphs. Often, a trace -// contains a root span that describes the end-to-end latency, and one -// or more subspans for its sub-operations. A trace can also contain -// multiple root spans, or none at all. Spans do not need to be -// contiguous - there may be gaps or overlaps between spans in a trace. +// A Span represents a single operation performed by a single component of the system. // // The next available field id is 17. message Span { // A unique identifier for a trace. All spans from the same trace share - // the same `trace_id`. The ID is a 16-byte array. An ID with all zeroes - // is considered invalid. - // - // This field is semantically required. Receiver should generate new - // random trace_id if empty or invalid trace_id was received. + // the same `trace_id`. The ID is a 16-byte array. An ID with all zeroes OR + // of length other than 16 bytes is considered invalid (empty string in OTLP/JSON + // is zero-length and thus is also invalid). // // This field is required. bytes trace_id = 1; // A unique identifier for a span within a trace, assigned when the span - // is created. The ID is an 8-byte array. An ID with all zeroes is considered - // invalid. - // - // This field is semantically required. Receiver should generate new - // random span_id if empty or invalid span_id was received. + // is created. The ID is an 8-byte array. An ID with all zeroes OR of length + // other than 8 bytes is considered invalid (empty string in OTLP/JSON + // is zero-length and thus is also invalid). // // This field is required. bytes span_id = 2; @@ -180,11 +172,11 @@ // // "/http/user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36" // "/http/server_latency": 300 - // "abc.com/myattribute": true - // "abc.com/score": 10.239 + // "example.com/myattribute": true + // "example.com/score": 10.239 // // The OpenTelemetry API specification further restricts the allowed value types: - // https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/common/common.md#attributes + // https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/common/README.md#attribute // Attribute keys MUST be unique (it is not allowed to have more than one // attribute with the same key). repeated opentelemetry.proto.common.v1.KeyValue attributes = 9; @@ -272,8 +264,8 @@ enum StatusCode { // The default status. STATUS_CODE_UNSET = 0; - // The Span has been validated by an Application developers or Operator to have - // completed successfully. + // The Span has been validated by an Application developer or Operator to + // have completed successfully. STATUS_CODE_OK = 1; // The Span contains an error. STATUS_CODE_ERROR = 2; diff -Nru temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/package.json temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/package.json --- temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/package.json 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/package.json 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,5 @@ +{ + "devDependencies": { + "markdown-link-check": "3.10.3" + } +} diff -Nru temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/package-lock.json temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/package-lock.json --- temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/package-lock.json 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/package-lock.json 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,815 @@ +{ + "name": "otlp", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "devDependencies": { + "markdown-link-check": "3.10.3" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "dev": true + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/cheerio": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "dev": true, + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" + }, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", + "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", + "dev": true, + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.1" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/html-link-extractor": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/html-link-extractor/-/html-link-extractor-1.0.5.tgz", + "integrity": "sha512-ADd49pudM157uWHwHQPUSX4ssMsvR/yHIswOR5CUfBdK9g9ZYGMhVSE6KZVHJ6kCkR0gH4htsfzU6zECDNVwyw==", + "dev": true, + "dependencies": { + "cheerio": "^1.0.0-rc.10" + } + }, + "node_modules/htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-absolute-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-4.0.1.tgz", + "integrity": "sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-relative-url": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-relative-url/-/is-relative-url-4.0.0.tgz", + "integrity": "sha512-PkzoL1qKAYXNFct5IKdKRH/iBQou/oCC85QhXj6WKtUQBliZ4Yfd3Zk27RHu9KQG8r6zgvAA2AQKC9p+rqTszg==", + "dev": true, + "dependencies": { + "is-absolute-url": "^4.0.1" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isemail": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/isemail/-/isemail-3.2.0.tgz", + "integrity": "sha512-zKqkK+O+dGqevc93KNsbZ/TqTUFd46MwWjYOoMrjIMZ51eU7DtQG3Wmd9SQQT7i7RVnuTPEiYEWHU3MSbxC1Tg==", + "dev": true, + "dependencies": { + "punycode": "2.x.x" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/link-check": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/link-check/-/link-check-5.2.0.tgz", + "integrity": "sha512-xRbhYLaGDw7eRDTibTAcl6fXtmUQ13vkezQiTqshHHdGueQeumgxxmQMIOmJYsh2p8BF08t8thhDQ++EAOOq3w==", + "dev": true, + "dependencies": { + "is-relative-url": "^4.0.0", + "isemail": "^3.2.0", + "ms": "^2.1.3", + "needle": "^3.1.0" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/markdown-link-check": { + "version": "3.10.3", + "resolved": "https://registry.npmjs.org/markdown-link-check/-/markdown-link-check-3.10.3.tgz", + "integrity": "sha512-uGdJiZOy1CVWlRe7CyBSJ0Gz80Xm4vt++xjX9sNFjB7qcAxLinaMmzFQ5xOwERaXC9mK770BhnqnsyJT1gTr9w==", + "dev": true, + "dependencies": { + "async": "^3.2.4", + "chalk": "^4.1.2", + "commander": "^6.2.0", + "link-check": "^5.2.0", + "lodash": "^4.17.21", + "markdown-link-extractor": "^3.1.0", + "needle": "^3.1.0", + "progress": "^2.0.3" + }, + "bin": { + "markdown-link-check": "markdown-link-check" + } + }, + "node_modules/markdown-link-extractor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/markdown-link-extractor/-/markdown-link-extractor-3.1.0.tgz", + "integrity": "sha512-r0NEbP1dsM+IqB62Ru9TXLP/HDaTdBNIeylYXumuBi6Xv4ufjE1/g3TnslYL8VNqNcGAGbMptQFHrrdfoZ/Sug==", + "dev": true, + "dependencies": { + "html-link-extractor": "^1.0.5", + "marked": "^4.1.0" + } + }, + "node_modules/marked": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", + "dev": true, + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/needle": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/needle/-/needle-3.2.0.tgz", + "integrity": "sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==", + "dev": true, + "dependencies": { + "debug": "^3.2.6", + "iconv-lite": "^0.6.3", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dev": true, + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", + "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", + "dev": true, + "dependencies": { + "domhandler": "^5.0.2", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + } + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "dev": true + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "cheerio": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "dev": true, + "requires": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" + } + }, + "cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "dev": true + }, + "css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + } + }, + "css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true + }, + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + } + }, + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true + }, + "domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "requires": { + "domelementtype": "^2.3.0" + } + }, + "domutils": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", + "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", + "dev": true, + "requires": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.1" + } + }, + "entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "html-link-extractor": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/html-link-extractor/-/html-link-extractor-1.0.5.tgz", + "integrity": "sha512-ADd49pudM157uWHwHQPUSX4ssMsvR/yHIswOR5CUfBdK9g9ZYGMhVSE6KZVHJ6kCkR0gH4htsfzU6zECDNVwyw==", + "dev": true, + "requires": { + "cheerio": "^1.0.0-rc.10" + } + }, + "htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "dev": true, + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "is-absolute-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-4.0.1.tgz", + "integrity": "sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==", + "dev": true + }, + "is-relative-url": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-relative-url/-/is-relative-url-4.0.0.tgz", + "integrity": "sha512-PkzoL1qKAYXNFct5IKdKRH/iBQou/oCC85QhXj6WKtUQBliZ4Yfd3Zk27RHu9KQG8r6zgvAA2AQKC9p+rqTszg==", + "dev": true, + "requires": { + "is-absolute-url": "^4.0.1" + } + }, + "isemail": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/isemail/-/isemail-3.2.0.tgz", + "integrity": "sha512-zKqkK+O+dGqevc93KNsbZ/TqTUFd46MwWjYOoMrjIMZ51eU7DtQG3Wmd9SQQT7i7RVnuTPEiYEWHU3MSbxC1Tg==", + "dev": true, + "requires": { + "punycode": "2.x.x" + } + }, + "link-check": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/link-check/-/link-check-5.2.0.tgz", + "integrity": "sha512-xRbhYLaGDw7eRDTibTAcl6fXtmUQ13vkezQiTqshHHdGueQeumgxxmQMIOmJYsh2p8BF08t8thhDQ++EAOOq3w==", + "dev": true, + "requires": { + "is-relative-url": "^4.0.0", + "isemail": "^3.2.0", + "ms": "^2.1.3", + "needle": "^3.1.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "markdown-link-check": { + "version": "3.10.3", + "resolved": "https://registry.npmjs.org/markdown-link-check/-/markdown-link-check-3.10.3.tgz", + "integrity": "sha512-uGdJiZOy1CVWlRe7CyBSJ0Gz80Xm4vt++xjX9sNFjB7qcAxLinaMmzFQ5xOwERaXC9mK770BhnqnsyJT1gTr9w==", + "dev": true, + "requires": { + "async": "^3.2.4", + "chalk": "^4.1.2", + "commander": "^6.2.0", + "link-check": "^5.2.0", + "lodash": "^4.17.21", + "markdown-link-extractor": "^3.1.0", + "needle": "^3.1.0", + "progress": "^2.0.3" + } + }, + "markdown-link-extractor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/markdown-link-extractor/-/markdown-link-extractor-3.1.0.tgz", + "integrity": "sha512-r0NEbP1dsM+IqB62Ru9TXLP/HDaTdBNIeylYXumuBi6Xv4ufjE1/g3TnslYL8VNqNcGAGbMptQFHrrdfoZ/Sug==", + "dev": true, + "requires": { + "html-link-extractor": "^1.0.5", + "marked": "^4.1.0" + } + }, + "marked": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", + "dev": true + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "needle": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/needle/-/needle-3.2.0.tgz", + "integrity": "sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==", + "dev": true, + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.6.3", + "sax": "^1.2.4" + } + }, + "nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "requires": { + "boolbase": "^1.0.0" + } + }, + "parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dev": true, + "requires": { + "entities": "^4.4.0" + } + }, + "parse5-htmlparser2-tree-adapter": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", + "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", + "dev": true, + "requires": { + "domhandler": "^5.0.2", + "parse5": "^7.0.0" + } + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } +} diff -Nru temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/README.md temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/README.md --- temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/README.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/README.md 2023-10-30 19:40:00.000000000 +0000 @@ -1,13 +1,22 @@ -# Language Independent Interface Types For OpenTelemetry +# OpenTelemetry Protocol (OTLP) Specification [![Build Check](https://github.com/open-telemetry/opentelemetry-proto/workflows/Build%20Check/badge.svg?branch=main)](https://github.com/open-telemetry/opentelemetry-proto/actions?query=workflow%3A%22Build+Check%22+branch%3Amain) +This repository contains the [OTLP protocol specification](docs/specification.md) +and the corresponding Language Independent Interface Types ([.proto files](opentelemetry/proto)). + +## Language Independent Interface Types + The proto files can be consumed as GIT submodules or copied and built directly in the consumer project. -The compiled files are published to central repositories (Maven, NPM...) from OpenTelemetry client libraries. +The compiled files are published to central repositories (Maven, ...) from OpenTelemetry client libraries. See [contribution guidelines](CONTRIBUTING.md) if you would like to make any changes. +## OTLP/JSON + +See additional requirements for [OTLP/JSON wire representation here](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/protocol/otlp.md#json-protobuf-encoding). + ## Generate gRPC Client Libraries To generate the raw gRPC client libraries, use `make gen-${LANGUAGE}`. Currently supported languages are: @@ -24,28 +33,57 @@ ## Maturity Level -Component | Maturity | --------------------------------------|----------| -**Binary Protobuf Encoding** | | -common/* | Stable | -metrics/\*
collector/metrics/* | Stable | -resource/* | Stable | -trace/trace.proto
collector/trace/* | Stable | -trace/trace_config.proto | Alpha | -logs/\*
collector/logs/* | Beta | -**JSON encoding** | | -All messages | Alpha | +1.0.0 and newer releases from this repository may contain unstable (alpha or beta) +components as indicated by the Maturity table below. + +| Component | Binary Protobuf Maturity | JSON Maturity | +| --------- |--------------- | ------------- | +| common/* | Stable | [Stable](docs/specification.md#json-protobuf-encoding) | +| resource/* | Stable | [Stable](docs/specification.md#json-protobuf-encoding) | +| metrics/\*
collector/metrics/* | Stable | [Stable](docs/specification.md#json-protobuf-encoding) | +| trace/\*
collector/trace/* | Stable | [Stable](docs/specification.md#json-protobuf-encoding) | +| logs/\*
collector/logs/* | Stable | [Stable](docs/specification.md#json-protobuf-encoding) | (See [maturity-matrix.yaml](https://github.com/open-telemetry/community/blob/47813530864b9fe5a5146f466a58bd2bb94edc72/maturity-matrix.yaml#L57) for definition of maturity levels). -Note that maturity guarantees apply only to wire-level compatibility for the binary -Protobuf serialization. Neither message, field, nor enum names of Protobuf messages -are visible on the wire and are not considered part of the guarantees. We are free -to make a change to the names. +## Stability Definition + +Components marked `Stable` provide the following guarantees: + +- Field types, numbers and names will not change. +- Service names and service package names will not change. +- Service method names will not change. [from 1.0.0] +- Service method parameter names will not change. [from 1.0.0] +- Service method parameter types and return types will not change. [from 1.0.0] +- Service method kind (unary vs streaming) will not change. +- Names of messages and enums will not change. [from 1.0.0] +- Numbers assigned to enum choices will not change. +- Names of enum choices will not change. [from 1.0.0] +- The location of messages and enums, i.e. whether they are declared at the top lexical + scope or nested inside another message will not change. [from 1.0.0] +- Package names and directory structure will not change. [from 1.0.0] +- `optional` and `repeated` declarators of existing fields will not change. [from 1.0.0] +- No existing symbol will be deleted. [from 1.0.0] + +Note: guarantees marked [from 1.0.0] will go into effect when this repository is tagged +with version number 1.0.0. + +The following additive changes are allowed: + +- Adding new fields to existing messages. +- Adding new messages or enums. +- Adding new choices to existing enums. +- Adding new choices to existing oneof fields. +- Adding new services. +- Adding new methods to existing services. + +All the additive changes above must be accompanied by an explanation about how +new and old senders and receivers that implement the version of the protocol +before and after the change interoperate. -In the future when OTLP/JSON is declared stable, field names will also become part of -the maturity guarantees, since field names are visible on the wire for JSON encoding. +No guarantees are provided whatsoever about the stability of the code that +is generated from the .proto files by any particular code generator. ## Experiments diff -Nru temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/RELEASING.md temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/RELEASING.md --- temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/RELEASING.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/opentelemetry-proto/RELEASING.md 2023-10-30 19:40:00.000000000 +0000 @@ -79,16 +79,11 @@ or the Github [compare tool](https://github.com/open-telemetry/opentelemetry-proto/compare/) to view a summary of all commits since last release as a reference. -In addition, you can refer to -[CHANGELOG.md](https://github.com/open-telemetry/opentelemetry-proto/blob/main/CHANGELOG.md) +In addition, you can refer to [CHANGELOG.md](CHANGELOG.md) for a list of major changes since last release. ## Update release versions in documentations and CHANGELOG files -After releasing is done, you need to update -[README.md](https://github.com/open-telemetry/opentelemetry-proto/blob/main/README.md) and -[CHANGELOG.md](https://github.com/open-telemetry/opentelemetry-proto/blob/main/CHANGELOG.md). +After releasing is done, you need to update [README.md](README.md) and [CHANGELOG.md](CHANGELOG.md). -Create a PR to mark the new release in -[CHANGELOG.md](https://github.com/open-telemetry/opentelemetry-proto/blob/main/CHANGELOG.md) -on main branch. +Create a PR to mark the new release in [CHANGELOG.md](CHANGELOG.md) on main branch. diff -Nru temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/tonic/opentelemetry.proto.collector.logs.v1.rs temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/tonic/opentelemetry.proto.collector.logs.v1.rs --- temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/tonic/opentelemetry.proto.collector.logs.v1.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/tonic/opentelemetry.proto.collector.logs.v1.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,361 @@ +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ExportLogsServiceRequest { + /// An array of ResourceLogs. + /// For data coming from a single resource this array will typically contain one + /// element. Intermediary nodes (such as OpenTelemetry Collector) that receive + /// data from multiple origins typically batch the data before forwarding further and + /// in that case this array will contain multiple elements. + #[prost(message, repeated, tag = "1")] + pub resource_logs: ::prost::alloc::vec::Vec< + super::super::super::logs::v1::ResourceLogs, + >, +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ExportLogsServiceResponse { + /// The details of a partially successful export request. + /// + /// If the request is only partially accepted + /// (i.e. when the server accepts only parts of the data and rejects the rest) + /// the server MUST initialize the `partial_success` field and MUST + /// set the `rejected_` with the number of items it rejected. + /// + /// Servers MAY also make use of the `partial_success` field to convey + /// warnings/suggestions to senders even when the request was fully accepted. + /// In such cases, the `rejected_` MUST have a value of `0` and + /// the `error_message` MUST be non-empty. + /// + /// A `partial_success` message with an empty value (rejected_ = 0 and + /// `error_message` = "") is equivalent to it not being set/present. Senders + /// SHOULD interpret it the same way as in the full success case. + #[prost(message, optional, tag = "1")] + pub partial_success: ::core::option::Option, +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ExportLogsPartialSuccess { + /// The number of rejected log records. + /// + /// A `rejected_` field holding a `0` value indicates that the + /// request was fully accepted. + #[prost(int64, tag = "1")] + pub rejected_log_records: i64, + /// A developer-facing human-readable message in English. It should be used + /// either to explain why the server rejected parts of the data during a partial + /// success or to convey warnings/suggestions during a full success. The message + /// should offer guidance on how users can address such issues. + /// + /// error_message is an optional field. An error_message with an empty value + /// is equivalent to it not being set. + #[prost(string, tag = "2")] + pub error_message: ::prost::alloc::string::String, +} +/// Generated client implementations. +#[cfg(feature = "gen-tonic")] +pub mod logs_service_client { + #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] + use tonic::codegen::*; + use tonic::codegen::http::Uri; + /// Service that can be used to push logs between one Application instrumented with + /// OpenTelemetry and an collector, or between an collector and a central collector (in this + /// case logs are sent/received to/from multiple Applications). + #[derive(Debug, Clone)] + pub struct LogsServiceClient { + inner: tonic::client::Grpc, + } + impl LogsServiceClient { + /// Attempt to create a new client by connecting to a given endpoint. + pub async fn connect(dst: D) -> Result + where + D: TryInto, + D::Error: Into, + { + let conn = tonic::transport::Endpoint::new(dst)?.connect().await?; + Ok(Self::new(conn)) + } + } + impl LogsServiceClient + where + T: tonic::client::GrpcService, + T::Error: Into, + T::ResponseBody: Body + Send + 'static, + ::Error: Into + Send, + { + pub fn new(inner: T) -> Self { + let inner = tonic::client::Grpc::new(inner); + Self { inner } + } + pub fn with_origin(inner: T, origin: Uri) -> Self { + let inner = tonic::client::Grpc::with_origin(inner, origin); + Self { inner } + } + pub fn with_interceptor( + inner: T, + interceptor: F, + ) -> LogsServiceClient> + where + F: tonic::service::Interceptor, + T::ResponseBody: Default, + T: tonic::codegen::Service< + http::Request, + Response = http::Response< + >::ResponseBody, + >, + >, + , + >>::Error: Into + Send + Sync, + { + LogsServiceClient::new(InterceptedService::new(inner, interceptor)) + } + /// Compress requests with the given encoding. + /// + /// This requires the server to support it otherwise it might respond with an + /// error. + #[must_use] + pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.inner = self.inner.send_compressed(encoding); + self + } + /// Enable decompressing responses. + #[must_use] + pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.inner = self.inner.accept_compressed(encoding); + self + } + /// Limits the maximum size of a decoded message. + /// + /// Default: `4MB` + #[must_use] + pub fn max_decoding_message_size(mut self, limit: usize) -> Self { + self.inner = self.inner.max_decoding_message_size(limit); + self + } + /// Limits the maximum size of an encoded message. + /// + /// Default: `usize::MAX` + #[must_use] + pub fn max_encoding_message_size(mut self, limit: usize) -> Self { + self.inner = self.inner.max_encoding_message_size(limit); + self + } + /// For performance reasons, it is recommended to keep this RPC + /// alive for the entire life of the application. + pub async fn export( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/opentelemetry.proto.collector.logs.v1.LogsService/Export", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "opentelemetry.proto.collector.logs.v1.LogsService", + "Export", + ), + ); + self.inner.unary(req, path, codec).await + } + } +} +/// Generated server implementations. +#[cfg(feature = "gen-tonic")] +pub mod logs_service_server { + #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] + use tonic::codegen::*; + /// Generated trait containing gRPC methods that should be implemented for use with LogsServiceServer. + #[async_trait] + pub trait LogsService: Send + Sync + 'static { + /// For performance reasons, it is recommended to keep this RPC + /// alive for the entire life of the application. + async fn export( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + } + /// Service that can be used to push logs between one Application instrumented with + /// OpenTelemetry and an collector, or between an collector and a central collector (in this + /// case logs are sent/received to/from multiple Applications). + #[derive(Debug)] + pub struct LogsServiceServer { + inner: _Inner, + accept_compression_encodings: EnabledCompressionEncodings, + send_compression_encodings: EnabledCompressionEncodings, + max_decoding_message_size: Option, + max_encoding_message_size: Option, + } + struct _Inner(Arc); + impl LogsServiceServer { + pub fn new(inner: T) -> Self { + Self::from_arc(Arc::new(inner)) + } + pub fn from_arc(inner: Arc) -> Self { + let inner = _Inner(inner); + Self { + inner, + accept_compression_encodings: Default::default(), + send_compression_encodings: Default::default(), + max_decoding_message_size: None, + max_encoding_message_size: None, + } + } + pub fn with_interceptor( + inner: T, + interceptor: F, + ) -> InterceptedService + where + F: tonic::service::Interceptor, + { + InterceptedService::new(Self::new(inner), interceptor) + } + /// Enable decompressing requests with the given encoding. + #[must_use] + pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.accept_compression_encodings.enable(encoding); + self + } + /// Compress responses with the given encoding, if the client supports it. + #[must_use] + pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.send_compression_encodings.enable(encoding); + self + } + /// Limits the maximum size of a decoded message. + /// + /// Default: `4MB` + #[must_use] + pub fn max_decoding_message_size(mut self, limit: usize) -> Self { + self.max_decoding_message_size = Some(limit); + self + } + /// Limits the maximum size of an encoded message. + /// + /// Default: `usize::MAX` + #[must_use] + pub fn max_encoding_message_size(mut self, limit: usize) -> Self { + self.max_encoding_message_size = Some(limit); + self + } + } + impl tonic::codegen::Service> for LogsServiceServer + where + T: LogsService, + B: Body + Send + 'static, + B::Error: Into + Send + 'static, + { + type Response = http::Response; + type Error = std::convert::Infallible; + type Future = BoxFuture; + fn poll_ready( + &mut self, + _cx: &mut Context<'_>, + ) -> Poll> { + Poll::Ready(Ok(())) + } + fn call(&mut self, req: http::Request) -> Self::Future { + let inner = self.inner.clone(); + match req.uri().path() { + "/opentelemetry.proto.collector.logs.v1.LogsService/Export" => { + #[allow(non_camel_case_types)] + struct ExportSvc(pub Arc); + impl< + T: LogsService, + > tonic::server::UnaryService + for ExportSvc { + type Response = super::ExportLogsServiceResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { (*inner).export(request).await }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = ExportSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + _ => { + Box::pin(async move { + Ok( + http::Response::builder() + .status(200) + .header("grpc-status", "12") + .header("content-type", "application/grpc") + .body(empty_body()) + .unwrap(), + ) + }) + } + } + } + } + impl Clone for LogsServiceServer { + fn clone(&self) -> Self { + let inner = self.inner.clone(); + Self { + inner, + accept_compression_encodings: self.accept_compression_encodings, + send_compression_encodings: self.send_compression_encodings, + max_decoding_message_size: self.max_decoding_message_size, + max_encoding_message_size: self.max_encoding_message_size, + } + } + } + impl Clone for _Inner { + fn clone(&self) -> Self { + Self(Arc::clone(&self.0)) + } + } + impl std::fmt::Debug for _Inner { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{:?}", self.0) + } + } + impl tonic::server::NamedService for LogsServiceServer { + const NAME: &'static str = "opentelemetry.proto.collector.logs.v1.LogsService"; + } +} diff -Nru temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/tonic/opentelemetry.proto.collector.metrics.v1.rs temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/tonic/opentelemetry.proto.collector.metrics.v1.rs --- temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/tonic/opentelemetry.proto.collector.metrics.v1.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/tonic/opentelemetry.proto.collector.metrics.v1.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,361 @@ +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ExportMetricsServiceRequest { + /// An array of ResourceMetrics. + /// For data coming from a single resource this array will typically contain one + /// element. Intermediary nodes (such as OpenTelemetry Collector) that receive + /// data from multiple origins typically batch the data before forwarding further and + /// in that case this array will contain multiple elements. + #[prost(message, repeated, tag = "1")] + pub resource_metrics: ::prost::alloc::vec::Vec< + super::super::super::metrics::v1::ResourceMetrics, + >, +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ExportMetricsServiceResponse { + /// The details of a partially successful export request. + /// + /// If the request is only partially accepted + /// (i.e. when the server accepts only parts of the data and rejects the rest) + /// the server MUST initialize the `partial_success` field and MUST + /// set the `rejected_` with the number of items it rejected. + /// + /// Servers MAY also make use of the `partial_success` field to convey + /// warnings/suggestions to senders even when the request was fully accepted. + /// In such cases, the `rejected_` MUST have a value of `0` and + /// the `error_message` MUST be non-empty. + /// + /// A `partial_success` message with an empty value (rejected_ = 0 and + /// `error_message` = "") is equivalent to it not being set/present. Senders + /// SHOULD interpret it the same way as in the full success case. + #[prost(message, optional, tag = "1")] + pub partial_success: ::core::option::Option, +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ExportMetricsPartialSuccess { + /// The number of rejected data points. + /// + /// A `rejected_` field holding a `0` value indicates that the + /// request was fully accepted. + #[prost(int64, tag = "1")] + pub rejected_data_points: i64, + /// A developer-facing human-readable message in English. It should be used + /// either to explain why the server rejected parts of the data during a partial + /// success or to convey warnings/suggestions during a full success. The message + /// should offer guidance on how users can address such issues. + /// + /// error_message is an optional field. An error_message with an empty value + /// is equivalent to it not being set. + #[prost(string, tag = "2")] + pub error_message: ::prost::alloc::string::String, +} +/// Generated client implementations. +#[cfg(feature = "gen-tonic")] +pub mod metrics_service_client { + #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] + use tonic::codegen::*; + use tonic::codegen::http::Uri; + /// Service that can be used to push metrics between one Application + /// instrumented with OpenTelemetry and a collector, or between a collector and a + /// central collector. + #[derive(Debug, Clone)] + pub struct MetricsServiceClient { + inner: tonic::client::Grpc, + } + impl MetricsServiceClient { + /// Attempt to create a new client by connecting to a given endpoint. + pub async fn connect(dst: D) -> Result + where + D: TryInto, + D::Error: Into, + { + let conn = tonic::transport::Endpoint::new(dst)?.connect().await?; + Ok(Self::new(conn)) + } + } + impl MetricsServiceClient + where + T: tonic::client::GrpcService, + T::Error: Into, + T::ResponseBody: Body + Send + 'static, + ::Error: Into + Send, + { + pub fn new(inner: T) -> Self { + let inner = tonic::client::Grpc::new(inner); + Self { inner } + } + pub fn with_origin(inner: T, origin: Uri) -> Self { + let inner = tonic::client::Grpc::with_origin(inner, origin); + Self { inner } + } + pub fn with_interceptor( + inner: T, + interceptor: F, + ) -> MetricsServiceClient> + where + F: tonic::service::Interceptor, + T::ResponseBody: Default, + T: tonic::codegen::Service< + http::Request, + Response = http::Response< + >::ResponseBody, + >, + >, + , + >>::Error: Into + Send + Sync, + { + MetricsServiceClient::new(InterceptedService::new(inner, interceptor)) + } + /// Compress requests with the given encoding. + /// + /// This requires the server to support it otherwise it might respond with an + /// error. + #[must_use] + pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.inner = self.inner.send_compressed(encoding); + self + } + /// Enable decompressing responses. + #[must_use] + pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.inner = self.inner.accept_compressed(encoding); + self + } + /// Limits the maximum size of a decoded message. + /// + /// Default: `4MB` + #[must_use] + pub fn max_decoding_message_size(mut self, limit: usize) -> Self { + self.inner = self.inner.max_decoding_message_size(limit); + self + } + /// Limits the maximum size of an encoded message. + /// + /// Default: `usize::MAX` + #[must_use] + pub fn max_encoding_message_size(mut self, limit: usize) -> Self { + self.inner = self.inner.max_encoding_message_size(limit); + self + } + /// For performance reasons, it is recommended to keep this RPC + /// alive for the entire life of the application. + pub async fn export( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/opentelemetry.proto.collector.metrics.v1.MetricsService/Export", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "opentelemetry.proto.collector.metrics.v1.MetricsService", + "Export", + ), + ); + self.inner.unary(req, path, codec).await + } + } +} +/// Generated server implementations. +#[cfg(feature = "gen-tonic")] +pub mod metrics_service_server { + #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] + use tonic::codegen::*; + /// Generated trait containing gRPC methods that should be implemented for use with MetricsServiceServer. + #[async_trait] + pub trait MetricsService: Send + Sync + 'static { + /// For performance reasons, it is recommended to keep this RPC + /// alive for the entire life of the application. + async fn export( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + } + /// Service that can be used to push metrics between one Application + /// instrumented with OpenTelemetry and a collector, or between a collector and a + /// central collector. + #[derive(Debug)] + pub struct MetricsServiceServer { + inner: _Inner, + accept_compression_encodings: EnabledCompressionEncodings, + send_compression_encodings: EnabledCompressionEncodings, + max_decoding_message_size: Option, + max_encoding_message_size: Option, + } + struct _Inner(Arc); + impl MetricsServiceServer { + pub fn new(inner: T) -> Self { + Self::from_arc(Arc::new(inner)) + } + pub fn from_arc(inner: Arc) -> Self { + let inner = _Inner(inner); + Self { + inner, + accept_compression_encodings: Default::default(), + send_compression_encodings: Default::default(), + max_decoding_message_size: None, + max_encoding_message_size: None, + } + } + pub fn with_interceptor( + inner: T, + interceptor: F, + ) -> InterceptedService + where + F: tonic::service::Interceptor, + { + InterceptedService::new(Self::new(inner), interceptor) + } + /// Enable decompressing requests with the given encoding. + #[must_use] + pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.accept_compression_encodings.enable(encoding); + self + } + /// Compress responses with the given encoding, if the client supports it. + #[must_use] + pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.send_compression_encodings.enable(encoding); + self + } + /// Limits the maximum size of a decoded message. + /// + /// Default: `4MB` + #[must_use] + pub fn max_decoding_message_size(mut self, limit: usize) -> Self { + self.max_decoding_message_size = Some(limit); + self + } + /// Limits the maximum size of an encoded message. + /// + /// Default: `usize::MAX` + #[must_use] + pub fn max_encoding_message_size(mut self, limit: usize) -> Self { + self.max_encoding_message_size = Some(limit); + self + } + } + impl tonic::codegen::Service> for MetricsServiceServer + where + T: MetricsService, + B: Body + Send + 'static, + B::Error: Into + Send + 'static, + { + type Response = http::Response; + type Error = std::convert::Infallible; + type Future = BoxFuture; + fn poll_ready( + &mut self, + _cx: &mut Context<'_>, + ) -> Poll> { + Poll::Ready(Ok(())) + } + fn call(&mut self, req: http::Request) -> Self::Future { + let inner = self.inner.clone(); + match req.uri().path() { + "/opentelemetry.proto.collector.metrics.v1.MetricsService/Export" => { + #[allow(non_camel_case_types)] + struct ExportSvc(pub Arc); + impl< + T: MetricsService, + > tonic::server::UnaryService + for ExportSvc { + type Response = super::ExportMetricsServiceResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { (*inner).export(request).await }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = ExportSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + _ => { + Box::pin(async move { + Ok( + http::Response::builder() + .status(200) + .header("grpc-status", "12") + .header("content-type", "application/grpc") + .body(empty_body()) + .unwrap(), + ) + }) + } + } + } + } + impl Clone for MetricsServiceServer { + fn clone(&self) -> Self { + let inner = self.inner.clone(); + Self { + inner, + accept_compression_encodings: self.accept_compression_encodings, + send_compression_encodings: self.send_compression_encodings, + max_decoding_message_size: self.max_decoding_message_size, + max_encoding_message_size: self.max_encoding_message_size, + } + } + } + impl Clone for _Inner { + fn clone(&self) -> Self { + Self(Arc::clone(&self.0)) + } + } + impl std::fmt::Debug for _Inner { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{:?}", self.0) + } + } + impl tonic::server::NamedService for MetricsServiceServer { + const NAME: &'static str = "opentelemetry.proto.collector.metrics.v1.MetricsService"; + } +} diff -Nru temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/tonic/opentelemetry.proto.collector.trace.v1.rs temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/tonic/opentelemetry.proto.collector.trace.v1.rs --- temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/tonic/opentelemetry.proto.collector.trace.v1.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/tonic/opentelemetry.proto.collector.trace.v1.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,361 @@ +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ExportTraceServiceRequest { + /// An array of ResourceSpans. + /// For data coming from a single resource this array will typically contain one + /// element. Intermediary nodes (such as OpenTelemetry Collector) that receive + /// data from multiple origins typically batch the data before forwarding further and + /// in that case this array will contain multiple elements. + #[prost(message, repeated, tag = "1")] + pub resource_spans: ::prost::alloc::vec::Vec< + super::super::super::trace::v1::ResourceSpans, + >, +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ExportTraceServiceResponse { + /// The details of a partially successful export request. + /// + /// If the request is only partially accepted + /// (i.e. when the server accepts only parts of the data and rejects the rest) + /// the server MUST initialize the `partial_success` field and MUST + /// set the `rejected_` with the number of items it rejected. + /// + /// Servers MAY also make use of the `partial_success` field to convey + /// warnings/suggestions to senders even when the request was fully accepted. + /// In such cases, the `rejected_` MUST have a value of `0` and + /// the `error_message` MUST be non-empty. + /// + /// A `partial_success` message with an empty value (rejected_ = 0 and + /// `error_message` = "") is equivalent to it not being set/present. Senders + /// SHOULD interpret it the same way as in the full success case. + #[prost(message, optional, tag = "1")] + pub partial_success: ::core::option::Option, +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ExportTracePartialSuccess { + /// The number of rejected spans. + /// + /// A `rejected_` field holding a `0` value indicates that the + /// request was fully accepted. + #[prost(int64, tag = "1")] + pub rejected_spans: i64, + /// A developer-facing human-readable message in English. It should be used + /// either to explain why the server rejected parts of the data during a partial + /// success or to convey warnings/suggestions during a full success. The message + /// should offer guidance on how users can address such issues. + /// + /// error_message is an optional field. An error_message with an empty value + /// is equivalent to it not being set. + #[prost(string, tag = "2")] + pub error_message: ::prost::alloc::string::String, +} +/// Generated client implementations. +#[cfg(feature = "gen-tonic")] +pub mod trace_service_client { + #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] + use tonic::codegen::*; + use tonic::codegen::http::Uri; + /// Service that can be used to push spans between one Application instrumented with + /// OpenTelemetry and a collector, or between a collector and a central collector (in this + /// case spans are sent/received to/from multiple Applications). + #[derive(Debug, Clone)] + pub struct TraceServiceClient { + inner: tonic::client::Grpc, + } + impl TraceServiceClient { + /// Attempt to create a new client by connecting to a given endpoint. + pub async fn connect(dst: D) -> Result + where + D: TryInto, + D::Error: Into, + { + let conn = tonic::transport::Endpoint::new(dst)?.connect().await?; + Ok(Self::new(conn)) + } + } + impl TraceServiceClient + where + T: tonic::client::GrpcService, + T::Error: Into, + T::ResponseBody: Body + Send + 'static, + ::Error: Into + Send, + { + pub fn new(inner: T) -> Self { + let inner = tonic::client::Grpc::new(inner); + Self { inner } + } + pub fn with_origin(inner: T, origin: Uri) -> Self { + let inner = tonic::client::Grpc::with_origin(inner, origin); + Self { inner } + } + pub fn with_interceptor( + inner: T, + interceptor: F, + ) -> TraceServiceClient> + where + F: tonic::service::Interceptor, + T::ResponseBody: Default, + T: tonic::codegen::Service< + http::Request, + Response = http::Response< + >::ResponseBody, + >, + >, + , + >>::Error: Into + Send + Sync, + { + TraceServiceClient::new(InterceptedService::new(inner, interceptor)) + } + /// Compress requests with the given encoding. + /// + /// This requires the server to support it otherwise it might respond with an + /// error. + #[must_use] + pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.inner = self.inner.send_compressed(encoding); + self + } + /// Enable decompressing responses. + #[must_use] + pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.inner = self.inner.accept_compressed(encoding); + self + } + /// Limits the maximum size of a decoded message. + /// + /// Default: `4MB` + #[must_use] + pub fn max_decoding_message_size(mut self, limit: usize) -> Self { + self.inner = self.inner.max_decoding_message_size(limit); + self + } + /// Limits the maximum size of an encoded message. + /// + /// Default: `usize::MAX` + #[must_use] + pub fn max_encoding_message_size(mut self, limit: usize) -> Self { + self.inner = self.inner.max_encoding_message_size(limit); + self + } + /// For performance reasons, it is recommended to keep this RPC + /// alive for the entire life of the application. + pub async fn export( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/opentelemetry.proto.collector.trace.v1.TraceService/Export", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "opentelemetry.proto.collector.trace.v1.TraceService", + "Export", + ), + ); + self.inner.unary(req, path, codec).await + } + } +} +/// Generated server implementations. +#[cfg(feature = "gen-tonic")] +pub mod trace_service_server { + #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] + use tonic::codegen::*; + /// Generated trait containing gRPC methods that should be implemented for use with TraceServiceServer. + #[async_trait] + pub trait TraceService: Send + Sync + 'static { + /// For performance reasons, it is recommended to keep this RPC + /// alive for the entire life of the application. + async fn export( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + } + /// Service that can be used to push spans between one Application instrumented with + /// OpenTelemetry and a collector, or between a collector and a central collector (in this + /// case spans are sent/received to/from multiple Applications). + #[derive(Debug)] + pub struct TraceServiceServer { + inner: _Inner, + accept_compression_encodings: EnabledCompressionEncodings, + send_compression_encodings: EnabledCompressionEncodings, + max_decoding_message_size: Option, + max_encoding_message_size: Option, + } + struct _Inner(Arc); + impl TraceServiceServer { + pub fn new(inner: T) -> Self { + Self::from_arc(Arc::new(inner)) + } + pub fn from_arc(inner: Arc) -> Self { + let inner = _Inner(inner); + Self { + inner, + accept_compression_encodings: Default::default(), + send_compression_encodings: Default::default(), + max_decoding_message_size: None, + max_encoding_message_size: None, + } + } + pub fn with_interceptor( + inner: T, + interceptor: F, + ) -> InterceptedService + where + F: tonic::service::Interceptor, + { + InterceptedService::new(Self::new(inner), interceptor) + } + /// Enable decompressing requests with the given encoding. + #[must_use] + pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.accept_compression_encodings.enable(encoding); + self + } + /// Compress responses with the given encoding, if the client supports it. + #[must_use] + pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.send_compression_encodings.enable(encoding); + self + } + /// Limits the maximum size of a decoded message. + /// + /// Default: `4MB` + #[must_use] + pub fn max_decoding_message_size(mut self, limit: usize) -> Self { + self.max_decoding_message_size = Some(limit); + self + } + /// Limits the maximum size of an encoded message. + /// + /// Default: `usize::MAX` + #[must_use] + pub fn max_encoding_message_size(mut self, limit: usize) -> Self { + self.max_encoding_message_size = Some(limit); + self + } + } + impl tonic::codegen::Service> for TraceServiceServer + where + T: TraceService, + B: Body + Send + 'static, + B::Error: Into + Send + 'static, + { + type Response = http::Response; + type Error = std::convert::Infallible; + type Future = BoxFuture; + fn poll_ready( + &mut self, + _cx: &mut Context<'_>, + ) -> Poll> { + Poll::Ready(Ok(())) + } + fn call(&mut self, req: http::Request) -> Self::Future { + let inner = self.inner.clone(); + match req.uri().path() { + "/opentelemetry.proto.collector.trace.v1.TraceService/Export" => { + #[allow(non_camel_case_types)] + struct ExportSvc(pub Arc); + impl< + T: TraceService, + > tonic::server::UnaryService + for ExportSvc { + type Response = super::ExportTraceServiceResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { (*inner).export(request).await }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = ExportSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + _ => { + Box::pin(async move { + Ok( + http::Response::builder() + .status(200) + .header("grpc-status", "12") + .header("content-type", "application/grpc") + .body(empty_body()) + .unwrap(), + ) + }) + } + } + } + } + impl Clone for TraceServiceServer { + fn clone(&self) -> Self { + let inner = self.inner.clone(); + Self { + inner, + accept_compression_encodings: self.accept_compression_encodings, + send_compression_encodings: self.send_compression_encodings, + max_decoding_message_size: self.max_decoding_message_size, + max_encoding_message_size: self.max_encoding_message_size, + } + } + } + impl Clone for _Inner { + fn clone(&self) -> Self { + Self(Arc::clone(&self.0)) + } + } + impl std::fmt::Debug for _Inner { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{:?}", self.0) + } + } + impl tonic::server::NamedService for TraceServiceServer { + const NAME: &'static str = "opentelemetry.proto.collector.trace.v1.TraceService"; + } +} diff -Nru temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/tonic/opentelemetry.proto.common.v1.rs temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/tonic/opentelemetry.proto.common.v1.rs --- temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/tonic/opentelemetry.proto.common.v1.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/tonic/opentelemetry.proto.common.v1.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,86 @@ +/// AnyValue is used to represent any type of attribute value. AnyValue may contain a +/// primitive value such as a string or integer or it may contain an arbitrary nested +/// object containing arrays, key-value lists and primitives. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct AnyValue { + /// The value is one of the listed fields. It is valid for all values to be unspecified + /// in which case this AnyValue is considered to be "empty". + #[prost(oneof = "any_value::Value", tags = "1, 2, 3, 4, 5, 6, 7")] + pub value: ::core::option::Option, +} +/// Nested message and enum types in `AnyValue`. +pub mod any_value { + /// The value is one of the listed fields. It is valid for all values to be unspecified + /// in which case this AnyValue is considered to be "empty". + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum Value { + #[prost(string, tag = "1")] + StringValue(::prost::alloc::string::String), + #[prost(bool, tag = "2")] + BoolValue(bool), + #[prost(int64, tag = "3")] + IntValue(i64), + #[prost(double, tag = "4")] + DoubleValue(f64), + #[prost(message, tag = "5")] + ArrayValue(super::ArrayValue), + #[prost(message, tag = "6")] + KvlistValue(super::KeyValueList), + #[prost(bytes, tag = "7")] + BytesValue(::prost::alloc::vec::Vec), + } +} +/// ArrayValue is a list of AnyValue messages. We need ArrayValue as a message +/// since oneof in AnyValue does not allow repeated fields. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ArrayValue { + /// Array of values. The array may be empty (contain 0 elements). + #[prost(message, repeated, tag = "1")] + pub values: ::prost::alloc::vec::Vec, +} +/// KeyValueList is a list of KeyValue messages. We need KeyValueList as a message +/// since `oneof` in AnyValue does not allow repeated fields. Everywhere else where we need +/// a list of KeyValue messages (e.g. in Span) we use `repeated KeyValue` directly to +/// avoid unnecessary extra wrapping (which slows down the protocol). The 2 approaches +/// are semantically equivalent. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct KeyValueList { + /// A collection of key/value pairs of key-value pairs. The list may be empty (may + /// contain 0 elements). + /// The keys MUST be unique (it is not allowed to have more than one + /// value with the same key). + #[prost(message, repeated, tag = "1")] + pub values: ::prost::alloc::vec::Vec, +} +/// KeyValue is a key-value pair that is used to store Span attributes, Link +/// attributes, etc. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct KeyValue { + #[prost(string, tag = "1")] + pub key: ::prost::alloc::string::String, + #[prost(message, optional, tag = "2")] + pub value: ::core::option::Option, +} +/// InstrumentationScope is a message representing the instrumentation scope information +/// such as the fully qualified name and version. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct InstrumentationScope { + /// An empty instrumentation scope name means the name is unknown. + #[prost(string, tag = "1")] + pub name: ::prost::alloc::string::String, + #[prost(string, tag = "2")] + pub version: ::prost::alloc::string::String, + /// Additional attributes that describe the scope. \[Optional\]. + /// Attribute keys MUST be unique (it is not allowed to have more than one + /// attribute with the same key). + #[prost(message, repeated, tag = "3")] + pub attributes: ::prost::alloc::vec::Vec, + #[prost(uint32, tag = "4")] + pub dropped_attributes_count: u32, +} diff -Nru temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/tonic/opentelemetry.proto.logs.v1.rs temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/tonic/opentelemetry.proto.logs.v1.rs --- temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/tonic/opentelemetry.proto.logs.v1.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/tonic/opentelemetry.proto.logs.v1.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,267 @@ +/// LogsData represents the logs data that can be stored in a persistent storage, +/// OR can be embedded by other protocols that transfer OTLP logs data but do not +/// implement the OTLP protocol. +/// +/// The main difference between this message and collector protocol is that +/// in this message there will not be any "control" or "metadata" specific to +/// OTLP protocol. +/// +/// When new fields are added into this message, the OTLP request MUST be updated +/// as well. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct LogsData { + /// An array of ResourceLogs. + /// For data coming from a single resource this array will typically contain + /// one element. Intermediary nodes that receive data from multiple origins + /// typically batch the data before forwarding further and in that case this + /// array will contain multiple elements. + #[prost(message, repeated, tag = "1")] + pub resource_logs: ::prost::alloc::vec::Vec, +} +/// A collection of ScopeLogs from a Resource. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ResourceLogs { + /// The resource for the logs in this message. + /// If this field is not set then resource info is unknown. + #[prost(message, optional, tag = "1")] + pub resource: ::core::option::Option, + /// A list of ScopeLogs that originate from a resource. + #[prost(message, repeated, tag = "2")] + pub scope_logs: ::prost::alloc::vec::Vec, + /// This schema_url applies to the data in the "resource" field. It does not apply + /// to the data in the "scope_logs" field which have their own schema_url field. + #[prost(string, tag = "3")] + pub schema_url: ::prost::alloc::string::String, +} +/// A collection of Logs produced by a Scope. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ScopeLogs { + /// The instrumentation scope information for the logs in this message. + /// Semantically when InstrumentationScope isn't set, it is equivalent with + /// an empty instrumentation scope name (unknown). + #[prost(message, optional, tag = "1")] + pub scope: ::core::option::Option, + /// A list of log records. + #[prost(message, repeated, tag = "2")] + pub log_records: ::prost::alloc::vec::Vec, + /// This schema_url applies to all logs in the "logs" field. + #[prost(string, tag = "3")] + pub schema_url: ::prost::alloc::string::String, +} +/// A log record according to OpenTelemetry Log Data Model: +/// +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct LogRecord { + /// time_unix_nano is the time when the event occurred. + /// Value is UNIX Epoch time in nanoseconds since 00:00:00 UTC on 1 January 1970. + /// Value of 0 indicates unknown or missing timestamp. + #[prost(fixed64, tag = "1")] + pub time_unix_nano: u64, + /// Time when the event was observed by the collection system. + /// For events that originate in OpenTelemetry (e.g. using OpenTelemetry Logging SDK) + /// this timestamp is typically set at the generation time and is equal to Timestamp. + /// For events originating externally and collected by OpenTelemetry (e.g. using + /// Collector) this is the time when OpenTelemetry's code observed the event measured + /// by the clock of the OpenTelemetry code. This field MUST be set once the event is + /// observed by OpenTelemetry. + /// + /// For converting OpenTelemetry log data to formats that support only one timestamp or + /// when receiving OpenTelemetry log data by recipients that support only one timestamp + /// internally the following logic is recommended: + /// - Use time_unix_nano if it is present, otherwise use observed_time_unix_nano. + /// + /// Value is UNIX Epoch time in nanoseconds since 00:00:00 UTC on 1 January 1970. + /// Value of 0 indicates unknown or missing timestamp. + #[prost(fixed64, tag = "11")] + pub observed_time_unix_nano: u64, + /// Numerical value of the severity, normalized to values described in Log Data Model. + /// \[Optional\]. + #[prost(enumeration = "SeverityNumber", tag = "2")] + pub severity_number: i32, + /// The severity text (also known as log level). The original string representation as + /// it is known at the source. \[Optional\]. + #[prost(string, tag = "3")] + pub severity_text: ::prost::alloc::string::String, + /// A value containing the body of the log record. Can be for example a human-readable + /// string message (including multi-line) describing the event in a free form or it can + /// be a structured data composed of arrays and maps of other values. \[Optional\]. + #[prost(message, optional, tag = "5")] + pub body: ::core::option::Option, + /// Additional attributes that describe the specific event occurrence. \[Optional\]. + /// Attribute keys MUST be unique (it is not allowed to have more than one + /// attribute with the same key). + #[prost(message, repeated, tag = "6")] + pub attributes: ::prost::alloc::vec::Vec, + #[prost(uint32, tag = "7")] + pub dropped_attributes_count: u32, + /// Flags, a bit field. 8 least significant bits are the trace flags as + /// defined in W3C Trace Context specification. 24 most significant bits are reserved + /// and must be set to 0. Readers must not assume that 24 most significant bits + /// will be zero and must correctly mask the bits when reading 8-bit trace flag (use + /// flags & LOG_RECORD_FLAGS_TRACE_FLAGS_MASK). \[Optional\]. + #[prost(fixed32, tag = "8")] + pub flags: u32, + /// A unique identifier for a trace. All logs from the same trace share + /// the same `trace_id`. The ID is a 16-byte array. An ID with all zeroes OR + /// of length other than 16 bytes is considered invalid (empty string in OTLP/JSON + /// is zero-length and thus is also invalid). + /// + /// This field is optional. + /// + /// The receivers SHOULD assume that the log record is not associated with a + /// trace if any of the following is true: + /// - the field is not present, + /// - the field contains an invalid value. + #[prost(bytes = "vec", tag = "9")] + pub trace_id: ::prost::alloc::vec::Vec, + /// A unique identifier for a span within a trace, assigned when the span + /// is created. The ID is an 8-byte array. An ID with all zeroes OR of length + /// other than 8 bytes is considered invalid (empty string in OTLP/JSON + /// is zero-length and thus is also invalid). + /// + /// This field is optional. If the sender specifies a valid span_id then it SHOULD also + /// specify a valid trace_id. + /// + /// The receivers SHOULD assume that the log record is not associated with a + /// span if any of the following is true: + /// - the field is not present, + /// - the field contains an invalid value. + #[prost(bytes = "vec", tag = "10")] + pub span_id: ::prost::alloc::vec::Vec, +} +/// Possible values for LogRecord.SeverityNumber. +#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)] +#[repr(i32)] +pub enum SeverityNumber { + /// UNSPECIFIED is the default SeverityNumber, it MUST NOT be used. + Unspecified = 0, + Trace = 1, + Trace2 = 2, + Trace3 = 3, + Trace4 = 4, + Debug = 5, + Debug2 = 6, + Debug3 = 7, + Debug4 = 8, + Info = 9, + Info2 = 10, + Info3 = 11, + Info4 = 12, + Warn = 13, + Warn2 = 14, + Warn3 = 15, + Warn4 = 16, + Error = 17, + Error2 = 18, + Error3 = 19, + Error4 = 20, + Fatal = 21, + Fatal2 = 22, + Fatal3 = 23, + Fatal4 = 24, +} +impl SeverityNumber { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + SeverityNumber::Unspecified => "SEVERITY_NUMBER_UNSPECIFIED", + SeverityNumber::Trace => "SEVERITY_NUMBER_TRACE", + SeverityNumber::Trace2 => "SEVERITY_NUMBER_TRACE2", + SeverityNumber::Trace3 => "SEVERITY_NUMBER_TRACE3", + SeverityNumber::Trace4 => "SEVERITY_NUMBER_TRACE4", + SeverityNumber::Debug => "SEVERITY_NUMBER_DEBUG", + SeverityNumber::Debug2 => "SEVERITY_NUMBER_DEBUG2", + SeverityNumber::Debug3 => "SEVERITY_NUMBER_DEBUG3", + SeverityNumber::Debug4 => "SEVERITY_NUMBER_DEBUG4", + SeverityNumber::Info => "SEVERITY_NUMBER_INFO", + SeverityNumber::Info2 => "SEVERITY_NUMBER_INFO2", + SeverityNumber::Info3 => "SEVERITY_NUMBER_INFO3", + SeverityNumber::Info4 => "SEVERITY_NUMBER_INFO4", + SeverityNumber::Warn => "SEVERITY_NUMBER_WARN", + SeverityNumber::Warn2 => "SEVERITY_NUMBER_WARN2", + SeverityNumber::Warn3 => "SEVERITY_NUMBER_WARN3", + SeverityNumber::Warn4 => "SEVERITY_NUMBER_WARN4", + SeverityNumber::Error => "SEVERITY_NUMBER_ERROR", + SeverityNumber::Error2 => "SEVERITY_NUMBER_ERROR2", + SeverityNumber::Error3 => "SEVERITY_NUMBER_ERROR3", + SeverityNumber::Error4 => "SEVERITY_NUMBER_ERROR4", + SeverityNumber::Fatal => "SEVERITY_NUMBER_FATAL", + SeverityNumber::Fatal2 => "SEVERITY_NUMBER_FATAL2", + SeverityNumber::Fatal3 => "SEVERITY_NUMBER_FATAL3", + SeverityNumber::Fatal4 => "SEVERITY_NUMBER_FATAL4", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "SEVERITY_NUMBER_UNSPECIFIED" => Some(Self::Unspecified), + "SEVERITY_NUMBER_TRACE" => Some(Self::Trace), + "SEVERITY_NUMBER_TRACE2" => Some(Self::Trace2), + "SEVERITY_NUMBER_TRACE3" => Some(Self::Trace3), + "SEVERITY_NUMBER_TRACE4" => Some(Self::Trace4), + "SEVERITY_NUMBER_DEBUG" => Some(Self::Debug), + "SEVERITY_NUMBER_DEBUG2" => Some(Self::Debug2), + "SEVERITY_NUMBER_DEBUG3" => Some(Self::Debug3), + "SEVERITY_NUMBER_DEBUG4" => Some(Self::Debug4), + "SEVERITY_NUMBER_INFO" => Some(Self::Info), + "SEVERITY_NUMBER_INFO2" => Some(Self::Info2), + "SEVERITY_NUMBER_INFO3" => Some(Self::Info3), + "SEVERITY_NUMBER_INFO4" => Some(Self::Info4), + "SEVERITY_NUMBER_WARN" => Some(Self::Warn), + "SEVERITY_NUMBER_WARN2" => Some(Self::Warn2), + "SEVERITY_NUMBER_WARN3" => Some(Self::Warn3), + "SEVERITY_NUMBER_WARN4" => Some(Self::Warn4), + "SEVERITY_NUMBER_ERROR" => Some(Self::Error), + "SEVERITY_NUMBER_ERROR2" => Some(Self::Error2), + "SEVERITY_NUMBER_ERROR3" => Some(Self::Error3), + "SEVERITY_NUMBER_ERROR4" => Some(Self::Error4), + "SEVERITY_NUMBER_FATAL" => Some(Self::Fatal), + "SEVERITY_NUMBER_FATAL2" => Some(Self::Fatal2), + "SEVERITY_NUMBER_FATAL3" => Some(Self::Fatal3), + "SEVERITY_NUMBER_FATAL4" => Some(Self::Fatal4), + _ => None, + } + } +} +/// LogRecordFlags is defined as a protobuf 'uint32' type and is to be used as +/// bit-fields. Each non-zero value defined in this enum is a bit-mask. +/// To extract the bit-field, for example, use an expression like: +/// +/// (logRecord.flags & LOG_RECORD_FLAGS_TRACE_FLAGS_MASK) +/// +#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)] +#[repr(i32)] +pub enum LogRecordFlags { + /// The zero value for the enum. Should not be used for comparisons. + /// Instead use bitwise "and" with the appropriate mask as shown above. + DoNotUse = 0, + /// Bits 0-7 are used for trace flags. + TraceFlagsMask = 255, +} +impl LogRecordFlags { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + LogRecordFlags::DoNotUse => "LOG_RECORD_FLAGS_DO_NOT_USE", + LogRecordFlags::TraceFlagsMask => "LOG_RECORD_FLAGS_TRACE_FLAGS_MASK", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "LOG_RECORD_FLAGS_DO_NOT_USE" => Some(Self::DoNotUse), + "LOG_RECORD_FLAGS_TRACE_FLAGS_MASK" => Some(Self::TraceFlagsMask), + _ => None, + } + } +} diff -Nru temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/tonic/opentelemetry.proto.metrics.v1.rs temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/tonic/opentelemetry.proto.metrics.v1.rs --- temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/tonic/opentelemetry.proto.metrics.v1.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/tonic/opentelemetry.proto.metrics.v1.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,754 @@ +/// MetricsData represents the metrics data that can be stored in a persistent +/// storage, OR can be embedded by other protocols that transfer OTLP metrics +/// data but do not implement the OTLP protocol. +/// +/// The main difference between this message and collector protocol is that +/// in this message there will not be any "control" or "metadata" specific to +/// OTLP protocol. +/// +/// When new fields are added into this message, the OTLP request MUST be updated +/// as well. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct MetricsData { + /// An array of ResourceMetrics. + /// For data coming from a single resource this array will typically contain + /// one element. Intermediary nodes that receive data from multiple origins + /// typically batch the data before forwarding further and in that case this + /// array will contain multiple elements. + #[prost(message, repeated, tag = "1")] + pub resource_metrics: ::prost::alloc::vec::Vec, +} +/// A collection of ScopeMetrics from a Resource. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ResourceMetrics { + /// The resource for the metrics in this message. + /// If this field is not set then no resource info is known. + #[prost(message, optional, tag = "1")] + pub resource: ::core::option::Option, + /// A list of metrics that originate from a resource. + #[prost(message, repeated, tag = "2")] + pub scope_metrics: ::prost::alloc::vec::Vec, + /// This schema_url applies to the data in the "resource" field. It does not apply + /// to the data in the "scope_metrics" field which have their own schema_url field. + #[prost(string, tag = "3")] + pub schema_url: ::prost::alloc::string::String, +} +/// A collection of Metrics produced by an Scope. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ScopeMetrics { + /// The instrumentation scope information for the metrics in this message. + /// Semantically when InstrumentationScope isn't set, it is equivalent with + /// an empty instrumentation scope name (unknown). + #[prost(message, optional, tag = "1")] + pub scope: ::core::option::Option, + /// A list of metrics that originate from an instrumentation library. + #[prost(message, repeated, tag = "2")] + pub metrics: ::prost::alloc::vec::Vec, + /// This schema_url applies to all metrics in the "metrics" field. + #[prost(string, tag = "3")] + pub schema_url: ::prost::alloc::string::String, +} +/// Defines a Metric which has one or more timeseries. The following is a +/// brief summary of the Metric data model. For more details, see: +/// +/// +/// +/// +/// The data model and relation between entities is shown in the +/// diagram below. Here, "DataPoint" is the term used to refer to any +/// one of the specific data point value types, and "points" is the term used +/// to refer to any one of the lists of points contained in the Metric. +/// +/// - Metric is composed of a metadata and data. +/// - Metadata part contains a name, description, unit. +/// - Data is one of the possible types (Sum, Gauge, Histogram, Summary). +/// - DataPoint contains timestamps, attributes, and one of the possible value type +/// fields. +/// +/// Metric +/// +------------+ +/// |name | +/// |description | +/// |unit | +------------------------------------+ +/// |data |---> |Gauge, Sum, Histogram, Summary, ... | +/// +------------+ +------------------------------------+ +/// +/// Data [One of Gauge, Sum, Histogram, Summary, ...] +/// +-----------+ +/// |... | // Metadata about the Data. +/// |points |--+ +/// +-----------+ | +/// | +---------------------------+ +/// | |DataPoint 1 | +/// v |+------+------+ +------+ | +/// +-----+ ||label |label |...|label | | +/// | 1 |-->||value1|value2|...|valueN| | +/// +-----+ |+------+------+ +------+ | +/// | . | |+-----+ | +/// | . | ||value| | +/// | . | |+-----+ | +/// | . | +---------------------------+ +/// | . | . +/// | . | . +/// | . | . +/// | . | +---------------------------+ +/// | . | |DataPoint M | +/// +-----+ |+------+------+ +------+ | +/// | M |-->||label |label |...|label | | +/// +-----+ ||value1|value2|...|valueN| | +/// |+------+------+ +------+ | +/// |+-----+ | +/// ||value| | +/// |+-----+ | +/// +---------------------------+ +/// +/// Each distinct type of DataPoint represents the output of a specific +/// aggregation function, the result of applying the DataPoint's +/// associated function of to one or more measurements. +/// +/// All DataPoint types have three common fields: +/// - Attributes includes key-value pairs associated with the data point +/// - TimeUnixNano is required, set to the end time of the aggregation +/// - StartTimeUnixNano is optional, but strongly encouraged for DataPoints +/// having an AggregationTemporality field, as discussed below. +/// +/// Both TimeUnixNano and StartTimeUnixNano values are expressed as +/// UNIX Epoch time in nanoseconds since 00:00:00 UTC on 1 January 1970. +/// +/// # TimeUnixNano +/// +/// This field is required, having consistent interpretation across +/// DataPoint types. TimeUnixNano is the moment corresponding to when +/// the data point's aggregate value was captured. +/// +/// Data points with the 0 value for TimeUnixNano SHOULD be rejected +/// by consumers. +/// +/// # StartTimeUnixNano +/// +/// StartTimeUnixNano in general allows detecting when a sequence of +/// observations is unbroken. This field indicates to consumers the +/// start time for points with cumulative and delta +/// AggregationTemporality, and it should be included whenever possible +/// to support correct rate calculation. Although it may be omitted +/// when the start time is truly unknown, setting StartTimeUnixNano is +/// strongly encouraged. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct Metric { + /// name of the metric, including its DNS name prefix. It must be unique. + #[prost(string, tag = "1")] + pub name: ::prost::alloc::string::String, + /// description of the metric, which can be used in documentation. + #[prost(string, tag = "2")] + pub description: ::prost::alloc::string::String, + /// unit in which the metric value is reported. Follows the format + /// described by + #[prost(string, tag = "3")] + pub unit: ::prost::alloc::string::String, + /// Data determines the aggregation type (if any) of the metric, what is the + /// reported value type for the data points, as well as the relatationship to + /// the time interval over which they are reported. + #[prost(oneof = "metric::Data", tags = "5, 7, 9, 10, 11")] + pub data: ::core::option::Option, +} +/// Nested message and enum types in `Metric`. +pub mod metric { + /// Data determines the aggregation type (if any) of the metric, what is the + /// reported value type for the data points, as well as the relatationship to + /// the time interval over which they are reported. + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum Data { + #[prost(message, tag = "5")] + Gauge(super::Gauge), + #[prost(message, tag = "7")] + Sum(super::Sum), + #[prost(message, tag = "9")] + Histogram(super::Histogram), + #[prost(message, tag = "10")] + ExponentialHistogram(super::ExponentialHistogram), + #[prost(message, tag = "11")] + Summary(super::Summary), + } +} +/// Gauge represents the type of a scalar metric that always exports the +/// "current value" for every data point. It should be used for an "unknown" +/// aggregation. +/// +/// A Gauge does not support different aggregation temporalities. Given the +/// aggregation is unknown, points cannot be combined using the same +/// aggregation, regardless of aggregation temporalities. Therefore, +/// AggregationTemporality is not included. Consequently, this also means +/// "StartTimeUnixNano" is ignored for all data points. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct Gauge { + #[prost(message, repeated, tag = "1")] + pub data_points: ::prost::alloc::vec::Vec, +} +/// Sum represents the type of a scalar metric that is calculated as a sum of all +/// reported measurements over a time interval. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct Sum { + #[prost(message, repeated, tag = "1")] + pub data_points: ::prost::alloc::vec::Vec, + /// aggregation_temporality describes if the aggregator reports delta changes + /// since last report time, or cumulative changes since a fixed start time. + #[prost(enumeration = "AggregationTemporality", tag = "2")] + pub aggregation_temporality: i32, + /// If "true" means that the sum is monotonic. + #[prost(bool, tag = "3")] + pub is_monotonic: bool, +} +/// Histogram represents the type of a metric that is calculated by aggregating +/// as a Histogram of all reported measurements over a time interval. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct Histogram { + #[prost(message, repeated, tag = "1")] + pub data_points: ::prost::alloc::vec::Vec, + /// aggregation_temporality describes if the aggregator reports delta changes + /// since last report time, or cumulative changes since a fixed start time. + #[prost(enumeration = "AggregationTemporality", tag = "2")] + pub aggregation_temporality: i32, +} +/// ExponentialHistogram represents the type of a metric that is calculated by aggregating +/// as a ExponentialHistogram of all reported double measurements over a time interval. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ExponentialHistogram { + #[prost(message, repeated, tag = "1")] + pub data_points: ::prost::alloc::vec::Vec, + /// aggregation_temporality describes if the aggregator reports delta changes + /// since last report time, or cumulative changes since a fixed start time. + #[prost(enumeration = "AggregationTemporality", tag = "2")] + pub aggregation_temporality: i32, +} +/// Summary metric data are used to convey quantile summaries, +/// a Prometheus (see: ) +/// and OpenMetrics (see: ) +/// data type. These data points cannot always be merged in a meaningful way. +/// While they can be useful in some applications, histogram data points are +/// recommended for new applications. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct Summary { + #[prost(message, repeated, tag = "1")] + pub data_points: ::prost::alloc::vec::Vec, +} +/// NumberDataPoint is a single data point in a timeseries that describes the +/// time-varying scalar value of a metric. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct NumberDataPoint { + /// The set of key/value pairs that uniquely identify the timeseries from + /// where this point belongs. The list may be empty (may contain 0 elements). + /// Attribute keys MUST be unique (it is not allowed to have more than one + /// attribute with the same key). + #[prost(message, repeated, tag = "7")] + pub attributes: ::prost::alloc::vec::Vec, + /// StartTimeUnixNano is optional but strongly encouraged, see the + /// the detailed comments above Metric. + /// + /// Value is UNIX Epoch time in nanoseconds since 00:00:00 UTC on 1 January + /// 1970. + #[prost(fixed64, tag = "2")] + pub start_time_unix_nano: u64, + /// TimeUnixNano is required, see the detailed comments above Metric. + /// + /// Value is UNIX Epoch time in nanoseconds since 00:00:00 UTC on 1 January + /// 1970. + #[prost(fixed64, tag = "3")] + pub time_unix_nano: u64, + /// (Optional) List of exemplars collected from + /// measurements that were used to form the data point + #[prost(message, repeated, tag = "5")] + pub exemplars: ::prost::alloc::vec::Vec, + /// Flags that apply to this specific data point. See DataPointFlags + /// for the available flags and their meaning. + #[prost(uint32, tag = "8")] + pub flags: u32, + /// The value itself. A point is considered invalid when one of the recognized + /// value fields is not present inside this oneof. + #[prost(oneof = "number_data_point::Value", tags = "4, 6")] + pub value: ::core::option::Option, +} +/// Nested message and enum types in `NumberDataPoint`. +pub mod number_data_point { + /// The value itself. A point is considered invalid when one of the recognized + /// value fields is not present inside this oneof. + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum Value { + #[prost(double, tag = "4")] + AsDouble(f64), + #[prost(sfixed64, tag = "6")] + AsInt(i64), + } +} +/// HistogramDataPoint is a single data point in a timeseries that describes the +/// time-varying values of a Histogram. A Histogram contains summary statistics +/// for a population of values, it may optionally contain the distribution of +/// those values across a set of buckets. +/// +/// If the histogram contains the distribution of values, then both +/// "explicit_bounds" and "bucket counts" fields must be defined. +/// If the histogram does not contain the distribution of values, then both +/// "explicit_bounds" and "bucket_counts" must be omitted and only "count" and +/// "sum" are known. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct HistogramDataPoint { + /// The set of key/value pairs that uniquely identify the timeseries from + /// where this point belongs. The list may be empty (may contain 0 elements). + /// Attribute keys MUST be unique (it is not allowed to have more than one + /// attribute with the same key). + #[prost(message, repeated, tag = "9")] + pub attributes: ::prost::alloc::vec::Vec, + /// StartTimeUnixNano is optional but strongly encouraged, see the + /// the detailed comments above Metric. + /// + /// Value is UNIX Epoch time in nanoseconds since 00:00:00 UTC on 1 January + /// 1970. + #[prost(fixed64, tag = "2")] + pub start_time_unix_nano: u64, + /// TimeUnixNano is required, see the detailed comments above Metric. + /// + /// Value is UNIX Epoch time in nanoseconds since 00:00:00 UTC on 1 January + /// 1970. + #[prost(fixed64, tag = "3")] + pub time_unix_nano: u64, + /// count is the number of values in the population. Must be non-negative. This + /// value must be equal to the sum of the "count" fields in buckets if a + /// histogram is provided. + #[prost(fixed64, tag = "4")] + pub count: u64, + /// sum of the values in the population. If count is zero then this field + /// must be zero. + /// + /// Note: Sum should only be filled out when measuring non-negative discrete + /// events, and is assumed to be monotonic over the values of these events. + /// Negative events *can* be recorded, but sum should not be filled out when + /// doing so. This is specifically to enforce compatibility w/ OpenMetrics, + /// see: + #[prost(double, optional, tag = "5")] + pub sum: ::core::option::Option, + /// bucket_counts is an optional field contains the count values of histogram + /// for each bucket. + /// + /// The sum of the bucket_counts must equal the value in the count field. + /// + /// The number of elements in bucket_counts array must be by one greater than + /// the number of elements in explicit_bounds array. + #[prost(fixed64, repeated, tag = "6")] + pub bucket_counts: ::prost::alloc::vec::Vec, + /// explicit_bounds specifies buckets with explicitly defined bounds for values. + /// + /// The boundaries for bucket at index i are: + /// + /// (-infinity, explicit_bounds\[i]\] for i == 0 + /// (explicit_bounds\[i-1\], explicit_bounds\[i]\] for 0 < i < size(explicit_bounds) + /// (explicit_bounds\[i-1\], +infinity) for i == size(explicit_bounds) + /// + /// The values in the explicit_bounds array must be strictly increasing. + /// + /// Histogram buckets are inclusive of their upper boundary, except the last + /// bucket where the boundary is at infinity. This format is intentionally + /// compatible with the OpenMetrics histogram definition. + #[prost(double, repeated, tag = "7")] + pub explicit_bounds: ::prost::alloc::vec::Vec, + /// (Optional) List of exemplars collected from + /// measurements that were used to form the data point + #[prost(message, repeated, tag = "8")] + pub exemplars: ::prost::alloc::vec::Vec, + /// Flags that apply to this specific data point. See DataPointFlags + /// for the available flags and their meaning. + #[prost(uint32, tag = "10")] + pub flags: u32, + /// min is the minimum value over (start_time, end_time]. + #[prost(double, optional, tag = "11")] + pub min: ::core::option::Option, + /// max is the maximum value over (start_time, end_time]. + #[prost(double, optional, tag = "12")] + pub max: ::core::option::Option, +} +/// ExponentialHistogramDataPoint is a single data point in a timeseries that describes the +/// time-varying values of a ExponentialHistogram of double values. A ExponentialHistogram contains +/// summary statistics for a population of values, it may optionally contain the +/// distribution of those values across a set of buckets. +/// +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ExponentialHistogramDataPoint { + /// The set of key/value pairs that uniquely identify the timeseries from + /// where this point belongs. The list may be empty (may contain 0 elements). + /// Attribute keys MUST be unique (it is not allowed to have more than one + /// attribute with the same key). + #[prost(message, repeated, tag = "1")] + pub attributes: ::prost::alloc::vec::Vec, + /// StartTimeUnixNano is optional but strongly encouraged, see the + /// the detailed comments above Metric. + /// + /// Value is UNIX Epoch time in nanoseconds since 00:00:00 UTC on 1 January + /// 1970. + #[prost(fixed64, tag = "2")] + pub start_time_unix_nano: u64, + /// TimeUnixNano is required, see the detailed comments above Metric. + /// + /// Value is UNIX Epoch time in nanoseconds since 00:00:00 UTC on 1 January + /// 1970. + #[prost(fixed64, tag = "3")] + pub time_unix_nano: u64, + /// count is the number of values in the population. Must be + /// non-negative. This value must be equal to the sum of the "bucket_counts" + /// values in the positive and negative Buckets plus the "zero_count" field. + #[prost(fixed64, tag = "4")] + pub count: u64, + /// sum of the values in the population. If count is zero then this field + /// must be zero. + /// + /// Note: Sum should only be filled out when measuring non-negative discrete + /// events, and is assumed to be monotonic over the values of these events. + /// Negative events *can* be recorded, but sum should not be filled out when + /// doing so. This is specifically to enforce compatibility w/ OpenMetrics, + /// see: + #[prost(double, optional, tag = "5")] + pub sum: ::core::option::Option, + /// scale describes the resolution of the histogram. Boundaries are + /// located at powers of the base, where: + /// + /// base = (2^(2^-scale)) + /// + /// The histogram bucket identified by `index`, a signed integer, + /// contains values that are greater than (base^index) and + /// less than or equal to (base^(index+1)). + /// + /// The positive and negative ranges of the histogram are expressed + /// separately. Negative values are mapped by their absolute value + /// into the negative range using the same scale as the positive range. + /// + /// scale is not restricted by the protocol, as the permissible + /// values depend on the range of the data. + #[prost(sint32, tag = "6")] + pub scale: i32, + /// zero_count is the count of values that are either exactly zero or + /// within the region considered zero by the instrumentation at the + /// tolerated degree of precision. This bucket stores values that + /// cannot be expressed using the standard exponential formula as + /// well as values that have been rounded to zero. + /// + /// Implementations MAY consider the zero bucket to have probability + /// mass equal to (zero_count / count). + #[prost(fixed64, tag = "7")] + pub zero_count: u64, + /// positive carries the positive range of exponential bucket counts. + #[prost(message, optional, tag = "8")] + pub positive: ::core::option::Option, + /// negative carries the negative range of exponential bucket counts. + #[prost(message, optional, tag = "9")] + pub negative: ::core::option::Option, + /// Flags that apply to this specific data point. See DataPointFlags + /// for the available flags and their meaning. + #[prost(uint32, tag = "10")] + pub flags: u32, + /// (Optional) List of exemplars collected from + /// measurements that were used to form the data point + #[prost(message, repeated, tag = "11")] + pub exemplars: ::prost::alloc::vec::Vec, + /// min is the minimum value over (start_time, end_time]. + #[prost(double, optional, tag = "12")] + pub min: ::core::option::Option, + /// max is the maximum value over (start_time, end_time]. + #[prost(double, optional, tag = "13")] + pub max: ::core::option::Option, + /// ZeroThreshold may be optionally set to convey the width of the zero + /// region. Where the zero region is defined as the closed interval + /// [-ZeroThreshold, ZeroThreshold]. + /// When ZeroThreshold is 0, zero count bucket stores values that cannot be + /// expressed using the standard exponential formula as well as values that + /// have been rounded to zero. + #[prost(double, tag = "14")] + pub zero_threshold: f64, +} +/// Nested message and enum types in `ExponentialHistogramDataPoint`. +pub mod exponential_histogram_data_point { + /// Buckets are a set of bucket counts, encoded in a contiguous array + /// of counts. + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct Buckets { + /// Offset is the bucket index of the first entry in the bucket_counts array. + /// + /// Note: This uses a varint encoding as a simple form of compression. + #[prost(sint32, tag = "1")] + pub offset: i32, + /// bucket_counts is an array of count values, where bucket_counts\[i\] carries + /// the count of the bucket at index (offset+i). bucket_counts\[i\] is the count + /// of values greater than base^(offset+i) and less than or equal to + /// base^(offset+i+1). + /// + /// Note: By contrast, the explicit HistogramDataPoint uses + /// fixed64. This field is expected to have many buckets, + /// especially zeros, so uint64 has been selected to ensure + /// varint encoding. + #[prost(uint64, repeated, tag = "2")] + pub bucket_counts: ::prost::alloc::vec::Vec, + } +} +/// SummaryDataPoint is a single data point in a timeseries that describes the +/// time-varying values of a Summary metric. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct SummaryDataPoint { + /// The set of key/value pairs that uniquely identify the timeseries from + /// where this point belongs. The list may be empty (may contain 0 elements). + /// Attribute keys MUST be unique (it is not allowed to have more than one + /// attribute with the same key). + #[prost(message, repeated, tag = "7")] + pub attributes: ::prost::alloc::vec::Vec, + /// StartTimeUnixNano is optional but strongly encouraged, see the + /// the detailed comments above Metric. + /// + /// Value is UNIX Epoch time in nanoseconds since 00:00:00 UTC on 1 January + /// 1970. + #[prost(fixed64, tag = "2")] + pub start_time_unix_nano: u64, + /// TimeUnixNano is required, see the detailed comments above Metric. + /// + /// Value is UNIX Epoch time in nanoseconds since 00:00:00 UTC on 1 January + /// 1970. + #[prost(fixed64, tag = "3")] + pub time_unix_nano: u64, + /// count is the number of values in the population. Must be non-negative. + #[prost(fixed64, tag = "4")] + pub count: u64, + /// sum of the values in the population. If count is zero then this field + /// must be zero. + /// + /// Note: Sum should only be filled out when measuring non-negative discrete + /// events, and is assumed to be monotonic over the values of these events. + /// Negative events *can* be recorded, but sum should not be filled out when + /// doing so. This is specifically to enforce compatibility w/ OpenMetrics, + /// see: + #[prost(double, tag = "5")] + pub sum: f64, + /// (Optional) list of values at different quantiles of the distribution calculated + /// from the current snapshot. The quantiles must be strictly increasing. + #[prost(message, repeated, tag = "6")] + pub quantile_values: ::prost::alloc::vec::Vec, + /// Flags that apply to this specific data point. See DataPointFlags + /// for the available flags and their meaning. + #[prost(uint32, tag = "8")] + pub flags: u32, +} +/// Nested message and enum types in `SummaryDataPoint`. +pub mod summary_data_point { + /// Represents the value at a given quantile of a distribution. + /// + /// To record Min and Max values following conventions are used: + /// - The 1.0 quantile is equivalent to the maximum value observed. + /// - The 0.0 quantile is equivalent to the minimum value observed. + /// + /// See the following issue for more context: + /// + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct ValueAtQuantile { + /// The quantile of a distribution. Must be in the interval + /// [0.0, 1.0]. + #[prost(double, tag = "1")] + pub quantile: f64, + /// The value at the given quantile of a distribution. + /// + /// Quantile values must NOT be negative. + #[prost(double, tag = "2")] + pub value: f64, + } +} +/// A representation of an exemplar, which is a sample input measurement. +/// Exemplars also hold information about the environment when the measurement +/// was recorded, for example the span and trace ID of the active span when the +/// exemplar was recorded. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct Exemplar { + /// The set of key/value pairs that were filtered out by the aggregator, but + /// recorded alongside the original measurement. Only key/value pairs that were + /// filtered out by the aggregator should be included + #[prost(message, repeated, tag = "7")] + pub filtered_attributes: ::prost::alloc::vec::Vec< + super::super::common::v1::KeyValue, + >, + /// time_unix_nano is the exact time when this exemplar was recorded + /// + /// Value is UNIX Epoch time in nanoseconds since 00:00:00 UTC on 1 January + /// 1970. + #[prost(fixed64, tag = "2")] + pub time_unix_nano: u64, + /// (Optional) Span ID of the exemplar trace. + /// span_id may be missing if the measurement is not recorded inside a trace + /// or if the trace is not sampled. + #[prost(bytes = "vec", tag = "4")] + pub span_id: ::prost::alloc::vec::Vec, + /// (Optional) Trace ID of the exemplar trace. + /// trace_id may be missing if the measurement is not recorded inside a trace + /// or if the trace is not sampled. + #[prost(bytes = "vec", tag = "5")] + pub trace_id: ::prost::alloc::vec::Vec, + /// The value of the measurement that was recorded. An exemplar is + /// considered invalid when one of the recognized value fields is not present + /// inside this oneof. + #[prost(oneof = "exemplar::Value", tags = "3, 6")] + pub value: ::core::option::Option, +} +/// Nested message and enum types in `Exemplar`. +pub mod exemplar { + /// The value of the measurement that was recorded. An exemplar is + /// considered invalid when one of the recognized value fields is not present + /// inside this oneof. + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum Value { + #[prost(double, tag = "3")] + AsDouble(f64), + #[prost(sfixed64, tag = "6")] + AsInt(i64), + } +} +/// AggregationTemporality defines how a metric aggregator reports aggregated +/// values. It describes how those values relate to the time interval over +/// which they are aggregated. +#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)] +#[repr(i32)] +pub enum AggregationTemporality { + /// UNSPECIFIED is the default AggregationTemporality, it MUST not be used. + Unspecified = 0, + /// DELTA is an AggregationTemporality for a metric aggregator which reports + /// changes since last report time. Successive metrics contain aggregation of + /// values from continuous and non-overlapping intervals. + /// + /// The values for a DELTA metric are based only on the time interval + /// associated with one measurement cycle. There is no dependency on + /// previous measurements like is the case for CUMULATIVE metrics. + /// + /// For example, consider a system measuring the number of requests that + /// it receives and reports the sum of these requests every second as a + /// DELTA metric: + /// + /// 1. The system starts receiving at time=t_0. + /// 2. A request is received, the system measures 1 request. + /// 3. A request is received, the system measures 1 request. + /// 4. A request is received, the system measures 1 request. + /// 5. The 1 second collection cycle ends. A metric is exported for the + /// number of requests received over the interval of time t_0 to + /// t_0+1 with a value of 3. + /// 6. A request is received, the system measures 1 request. + /// 7. A request is received, the system measures 1 request. + /// 8. The 1 second collection cycle ends. A metric is exported for the + /// number of requests received over the interval of time t_0+1 to + /// t_0+2 with a value of 2. + Delta = 1, + /// CUMULATIVE is an AggregationTemporality for a metric aggregator which + /// reports changes since a fixed start time. This means that current values + /// of a CUMULATIVE metric depend on all previous measurements since the + /// start time. Because of this, the sender is required to retain this state + /// in some form. If this state is lost or invalidated, the CUMULATIVE metric + /// values MUST be reset and a new fixed start time following the last + /// reported measurement time sent MUST be used. + /// + /// For example, consider a system measuring the number of requests that + /// it receives and reports the sum of these requests every second as a + /// CUMULATIVE metric: + /// + /// 1. The system starts receiving at time=t_0. + /// 2. A request is received, the system measures 1 request. + /// 3. A request is received, the system measures 1 request. + /// 4. A request is received, the system measures 1 request. + /// 5. The 1 second collection cycle ends. A metric is exported for the + /// number of requests received over the interval of time t_0 to + /// t_0+1 with a value of 3. + /// 6. A request is received, the system measures 1 request. + /// 7. A request is received, the system measures 1 request. + /// 8. The 1 second collection cycle ends. A metric is exported for the + /// number of requests received over the interval of time t_0 to + /// t_0+2 with a value of 5. + /// 9. The system experiences a fault and loses state. + /// 10. The system recovers and resumes receiving at time=t_1. + /// 11. A request is received, the system measures 1 request. + /// 12. The 1 second collection cycle ends. A metric is exported for the + /// number of requests received over the interval of time t_1 to + /// t_0+1 with a value of 1. + /// + /// Note: Even though, when reporting changes since last report time, using + /// CUMULATIVE is valid, it is not recommended. This may cause problems for + /// systems that do not use start_time to determine when the aggregation + /// value was reset (e.g. Prometheus). + Cumulative = 2, +} +impl AggregationTemporality { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + AggregationTemporality::Unspecified => "AGGREGATION_TEMPORALITY_UNSPECIFIED", + AggregationTemporality::Delta => "AGGREGATION_TEMPORALITY_DELTA", + AggregationTemporality::Cumulative => "AGGREGATION_TEMPORALITY_CUMULATIVE", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "AGGREGATION_TEMPORALITY_UNSPECIFIED" => Some(Self::Unspecified), + "AGGREGATION_TEMPORALITY_DELTA" => Some(Self::Delta), + "AGGREGATION_TEMPORALITY_CUMULATIVE" => Some(Self::Cumulative), + _ => None, + } + } +} +/// DataPointFlags is defined as a protobuf 'uint32' type and is to be used as a +/// bit-field representing 32 distinct boolean flags. Each flag defined in this +/// enum is a bit-mask. To test the presence of a single flag in the flags of +/// a data point, for example, use an expression like: +/// +/// (point.flags & DATA_POINT_FLAGS_NO_RECORDED_VALUE_MASK) == DATA_POINT_FLAGS_NO_RECORDED_VALUE_MASK +/// +#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)] +#[repr(i32)] +pub enum DataPointFlags { + /// The zero value for the enum. Should not be used for comparisons. + /// Instead use bitwise "and" with the appropriate mask as shown above. + DoNotUse = 0, + /// This DataPoint is valid but has no recorded value. This value + /// SHOULD be used to reflect explicitly missing data in a series, as + /// for an equivalent to the Prometheus "staleness marker". + NoRecordedValueMask = 1, +} +impl DataPointFlags { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + DataPointFlags::DoNotUse => "DATA_POINT_FLAGS_DO_NOT_USE", + DataPointFlags::NoRecordedValueMask => { + "DATA_POINT_FLAGS_NO_RECORDED_VALUE_MASK" + } + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "DATA_POINT_FLAGS_DO_NOT_USE" => Some(Self::DoNotUse), + "DATA_POINT_FLAGS_NO_RECORDED_VALUE_MASK" => Some(Self::NoRecordedValueMask), + _ => None, + } + } +} diff -Nru temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/tonic/opentelemetry.proto.resource.v1.rs temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/tonic/opentelemetry.proto.resource.v1.rs --- temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/tonic/opentelemetry.proto.resource.v1.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/tonic/opentelemetry.proto.resource.v1.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,14 @@ +/// Resource information. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct Resource { + /// Set of attributes that describe the resource. + /// Attribute keys MUST be unique (it is not allowed to have more than one + /// attribute with the same key). + #[prost(message, repeated, tag = "1")] + pub attributes: ::prost::alloc::vec::Vec, + /// dropped_attributes_count is the number of dropped attributes. If the value is 0, then + /// no attributes were dropped. + #[prost(uint32, tag = "2")] + pub dropped_attributes_count: u32, +} diff -Nru temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/tonic/opentelemetry.proto.trace.v1.rs temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/tonic/opentelemetry.proto.trace.v1.rs --- temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/tonic/opentelemetry.proto.trace.v1.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/tonic/opentelemetry.proto.trace.v1.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,337 @@ +/// TracesData represents the traces data that can be stored in a persistent storage, +/// OR can be embedded by other protocols that transfer OTLP traces data but do +/// not implement the OTLP protocol. +/// +/// The main difference between this message and collector protocol is that +/// in this message there will not be any "control" or "metadata" specific to +/// OTLP protocol. +/// +/// When new fields are added into this message, the OTLP request MUST be updated +/// as well. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct TracesData { + /// An array of ResourceSpans. + /// For data coming from a single resource this array will typically contain + /// one element. Intermediary nodes that receive data from multiple origins + /// typically batch the data before forwarding further and in that case this + /// array will contain multiple elements. + #[prost(message, repeated, tag = "1")] + pub resource_spans: ::prost::alloc::vec::Vec, +} +/// A collection of ScopeSpans from a Resource. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ResourceSpans { + /// The resource for the spans in this message. + /// If this field is not set then no resource info is known. + #[prost(message, optional, tag = "1")] + pub resource: ::core::option::Option, + /// A list of ScopeSpans that originate from a resource. + #[prost(message, repeated, tag = "2")] + pub scope_spans: ::prost::alloc::vec::Vec, + /// This schema_url applies to the data in the "resource" field. It does not apply + /// to the data in the "scope_spans" field which have their own schema_url field. + #[prost(string, tag = "3")] + pub schema_url: ::prost::alloc::string::String, +} +/// A collection of Spans produced by an InstrumentationScope. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ScopeSpans { + /// The instrumentation scope information for the spans in this message. + /// Semantically when InstrumentationScope isn't set, it is equivalent with + /// an empty instrumentation scope name (unknown). + #[prost(message, optional, tag = "1")] + pub scope: ::core::option::Option, + /// A list of Spans that originate from an instrumentation scope. + #[prost(message, repeated, tag = "2")] + pub spans: ::prost::alloc::vec::Vec, + /// This schema_url applies to all spans and span events in the "spans" field. + #[prost(string, tag = "3")] + pub schema_url: ::prost::alloc::string::String, +} +/// A Span represents a single operation performed by a single component of the system. +/// +/// The next available field id is 17. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct Span { + /// A unique identifier for a trace. All spans from the same trace share + /// the same `trace_id`. The ID is a 16-byte array. An ID with all zeroes OR + /// of length other than 16 bytes is considered invalid (empty string in OTLP/JSON + /// is zero-length and thus is also invalid). + /// + /// This field is required. + #[prost(bytes = "vec", tag = "1")] + pub trace_id: ::prost::alloc::vec::Vec, + /// A unique identifier for a span within a trace, assigned when the span + /// is created. The ID is an 8-byte array. An ID with all zeroes OR of length + /// other than 8 bytes is considered invalid (empty string in OTLP/JSON + /// is zero-length and thus is also invalid). + /// + /// This field is required. + #[prost(bytes = "vec", tag = "2")] + pub span_id: ::prost::alloc::vec::Vec, + /// trace_state conveys information about request position in multiple distributed tracing graphs. + /// It is a trace_state in w3c-trace-context format: + /// See also for more details about this field. + #[prost(string, tag = "3")] + pub trace_state: ::prost::alloc::string::String, + /// The `span_id` of this span's parent span. If this is a root span, then this + /// field must be empty. The ID is an 8-byte array. + #[prost(bytes = "vec", tag = "4")] + pub parent_span_id: ::prost::alloc::vec::Vec, + /// A description of the span's operation. + /// + /// For example, the name can be a qualified method name or a file name + /// and a line number where the operation is called. A best practice is to use + /// the same display name at the same call point in an application. + /// This makes it easier to correlate spans in different traces. + /// + /// This field is semantically required to be set to non-empty string. + /// Empty value is equivalent to an unknown span name. + /// + /// This field is required. + #[prost(string, tag = "5")] + pub name: ::prost::alloc::string::String, + /// Distinguishes between spans generated in a particular context. For example, + /// two spans with the same name may be distinguished using `CLIENT` (caller) + /// and `SERVER` (callee) to identify queueing latency associated with the span. + #[prost(enumeration = "span::SpanKind", tag = "6")] + pub kind: i32, + /// start_time_unix_nano is the start time of the span. On the client side, this is the time + /// kept by the local machine where the span execution starts. On the server side, this + /// is the time when the server's application handler starts running. + /// Value is UNIX Epoch time in nanoseconds since 00:00:00 UTC on 1 January 1970. + /// + /// This field is semantically required and it is expected that end_time >= start_time. + #[prost(fixed64, tag = "7")] + pub start_time_unix_nano: u64, + /// end_time_unix_nano is the end time of the span. On the client side, this is the time + /// kept by the local machine where the span execution ends. On the server side, this + /// is the time when the server application handler stops running. + /// Value is UNIX Epoch time in nanoseconds since 00:00:00 UTC on 1 January 1970. + /// + /// This field is semantically required and it is expected that end_time >= start_time. + #[prost(fixed64, tag = "8")] + pub end_time_unix_nano: u64, + /// attributes is a collection of key/value pairs. Note, global attributes + /// like server name can be set using the resource API. Examples of attributes: + /// + /// "/http/user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36" + /// "/http/server_latency": 300 + /// "example.com/myattribute": true + /// "example.com/score": 10.239 + /// + /// The OpenTelemetry API specification further restricts the allowed value types: + /// + /// Attribute keys MUST be unique (it is not allowed to have more than one + /// attribute with the same key). + #[prost(message, repeated, tag = "9")] + pub attributes: ::prost::alloc::vec::Vec, + /// dropped_attributes_count is the number of attributes that were discarded. Attributes + /// can be discarded because their keys are too long or because there are too many + /// attributes. If this value is 0, then no attributes were dropped. + #[prost(uint32, tag = "10")] + pub dropped_attributes_count: u32, + /// events is a collection of Event items. + #[prost(message, repeated, tag = "11")] + pub events: ::prost::alloc::vec::Vec, + /// dropped_events_count is the number of dropped events. If the value is 0, then no + /// events were dropped. + #[prost(uint32, tag = "12")] + pub dropped_events_count: u32, + /// links is a collection of Links, which are references from this span to a span + /// in the same or different trace. + #[prost(message, repeated, tag = "13")] + pub links: ::prost::alloc::vec::Vec, + /// dropped_links_count is the number of dropped links after the maximum size was + /// enforced. If this value is 0, then no links were dropped. + #[prost(uint32, tag = "14")] + pub dropped_links_count: u32, + /// An optional final status for this span. Semantically when Status isn't set, it means + /// span's status code is unset, i.e. assume STATUS_CODE_UNSET (code = 0). + #[prost(message, optional, tag = "15")] + pub status: ::core::option::Option, +} +/// Nested message and enum types in `Span`. +pub mod span { + /// Event is a time-stamped annotation of the span, consisting of user-supplied + /// text description and key-value pairs. + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct Event { + /// time_unix_nano is the time the event occurred. + #[prost(fixed64, tag = "1")] + pub time_unix_nano: u64, + /// name of the event. + /// This field is semantically required to be set to non-empty string. + #[prost(string, tag = "2")] + pub name: ::prost::alloc::string::String, + /// attributes is a collection of attribute key/value pairs on the event. + /// Attribute keys MUST be unique (it is not allowed to have more than one + /// attribute with the same key). + #[prost(message, repeated, tag = "3")] + pub attributes: ::prost::alloc::vec::Vec< + super::super::super::common::v1::KeyValue, + >, + /// dropped_attributes_count is the number of dropped attributes. If the value is 0, + /// then no attributes were dropped. + #[prost(uint32, tag = "4")] + pub dropped_attributes_count: u32, + } + /// A pointer from the current span to another span in the same trace or in a + /// different trace. For example, this can be used in batching operations, + /// where a single batch handler processes multiple requests from different + /// traces or when the handler receives a request from a different project. + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct Link { + /// A unique identifier of a trace that this linked span is part of. The ID is a + /// 16-byte array. + #[prost(bytes = "vec", tag = "1")] + pub trace_id: ::prost::alloc::vec::Vec, + /// A unique identifier for the linked span. The ID is an 8-byte array. + #[prost(bytes = "vec", tag = "2")] + pub span_id: ::prost::alloc::vec::Vec, + /// The trace_state associated with the link. + #[prost(string, tag = "3")] + pub trace_state: ::prost::alloc::string::String, + /// attributes is a collection of attribute key/value pairs on the link. + /// Attribute keys MUST be unique (it is not allowed to have more than one + /// attribute with the same key). + #[prost(message, repeated, tag = "4")] + pub attributes: ::prost::alloc::vec::Vec< + super::super::super::common::v1::KeyValue, + >, + /// dropped_attributes_count is the number of dropped attributes. If the value is 0, + /// then no attributes were dropped. + #[prost(uint32, tag = "5")] + pub dropped_attributes_count: u32, + } + /// SpanKind is the type of span. Can be used to specify additional relationships between spans + /// in addition to a parent/child relationship. + #[derive( + Clone, + Copy, + Debug, + PartialEq, + Eq, + Hash, + PartialOrd, + Ord, + ::prost::Enumeration + )] + #[repr(i32)] + pub enum SpanKind { + /// Unspecified. Do NOT use as default. + /// Implementations MAY assume SpanKind to be INTERNAL when receiving UNSPECIFIED. + Unspecified = 0, + /// Indicates that the span represents an internal operation within an application, + /// as opposed to an operation happening at the boundaries. Default value. + Internal = 1, + /// Indicates that the span covers server-side handling of an RPC or other + /// remote network request. + Server = 2, + /// Indicates that the span describes a request to some remote service. + Client = 3, + /// Indicates that the span describes a producer sending a message to a broker. + /// Unlike CLIENT and SERVER, there is often no direct critical path latency relationship + /// between producer and consumer spans. A PRODUCER span ends when the message was accepted + /// by the broker while the logical processing of the message might span a much longer time. + Producer = 4, + /// Indicates that the span describes consumer receiving a message from a broker. + /// Like the PRODUCER kind, there is often no direct critical path latency relationship + /// between producer and consumer spans. + Consumer = 5, + } + impl SpanKind { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + SpanKind::Unspecified => "SPAN_KIND_UNSPECIFIED", + SpanKind::Internal => "SPAN_KIND_INTERNAL", + SpanKind::Server => "SPAN_KIND_SERVER", + SpanKind::Client => "SPAN_KIND_CLIENT", + SpanKind::Producer => "SPAN_KIND_PRODUCER", + SpanKind::Consumer => "SPAN_KIND_CONSUMER", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "SPAN_KIND_UNSPECIFIED" => Some(Self::Unspecified), + "SPAN_KIND_INTERNAL" => Some(Self::Internal), + "SPAN_KIND_SERVER" => Some(Self::Server), + "SPAN_KIND_CLIENT" => Some(Self::Client), + "SPAN_KIND_PRODUCER" => Some(Self::Producer), + "SPAN_KIND_CONSUMER" => Some(Self::Consumer), + _ => None, + } + } + } +} +/// The Status type defines a logical error model that is suitable for different +/// programming environments, including REST APIs and RPC APIs. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct Status { + /// A developer-facing human readable error message. + #[prost(string, tag = "2")] + pub message: ::prost::alloc::string::String, + /// The status code. + #[prost(enumeration = "status::StatusCode", tag = "3")] + pub code: i32, +} +/// Nested message and enum types in `Status`. +pub mod status { + /// For the semantics of status codes see + /// + #[derive( + Clone, + Copy, + Debug, + PartialEq, + Eq, + Hash, + PartialOrd, + Ord, + ::prost::Enumeration + )] + #[repr(i32)] + pub enum StatusCode { + /// The default status. + Unset = 0, + /// The Span has been validated by an Application developer or Operator to + /// have completed successfully. + Ok = 1, + /// The Span contains an error. + Error = 2, + } + impl StatusCode { + /// String value of the enum field names used in the ProtoBuf definition. + /// + /// The values are not transformed in any way and thus are considered stable + /// (if the ProtoBuf definition does not change) and safe for programmatic use. + pub fn as_str_name(&self) -> &'static str { + match self { + StatusCode::Unset => "STATUS_CODE_UNSET", + StatusCode::Ok => "STATUS_CODE_OK", + StatusCode::Error => "STATUS_CODE_ERROR", + } + } + /// Creates an enum from field names used in the ProtoBuf definition. + pub fn from_str_name(value: &str) -> ::core::option::Option { + match value { + "STATUS_CODE_UNSET" => Some(Self::Unset), + "STATUS_CODE_OK" => Some(Self::Ok), + "STATUS_CODE_ERROR" => Some(Self::Error), + _ => None, + } + } + } +} diff -Nru temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/tracez.proto temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/tracez.proto --- temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/tracez.proto 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-proto/src/proto/tracez.proto 2023-10-30 19:40:00.000000000 +0000 @@ -14,7 +14,6 @@ syntax = "proto3"; import "opentelemetry/proto/common/v1/common.proto"; -import "opentelemetry/proto/resource/v1/resource.proto"; import "opentelemetry/proto/trace/v1/trace.proto"; message TracezCounts { diff -Nru temporalio-1.3.0/vendor/opentelemetry-proto/src/proto.rs temporalio-1.3.0/vendor/opentelemetry-proto/src/proto.rs --- temporalio-1.3.0/vendor/opentelemetry-proto/src/proto.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-proto/src/proto.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,78 +1,83 @@ -#[cfg(feature = "gen-tonic")] -/// Generated files using [`tonic`](https://docs.rs/crate/grpcio) and [`prost`](https://docs.rs/crate/protobuf/latest) +#[cfg(feature = "gen-tonic-messages")] +#[path = "proto/tonic"] +/// Generated files using [`tonic`](https://docs.rs/crate/tonic) and [`prost`](https://docs.rs/crate/prost) pub mod tonic { /// Service stub and clients + #[path = ""] pub mod collector { #[cfg(feature = "logs")] + #[path = ""] pub mod logs { - pub mod v1 { - tonic::include_proto!("opentelemetry.proto.collector.logs.v1"); - } + #[path = "opentelemetry.proto.collector.logs.v1.rs"] + pub mod v1; } #[cfg(feature = "metrics")] + #[path = ""] pub mod metrics { - pub mod v1 { - tonic::include_proto!("opentelemetry.proto.collector.metrics.v1"); - } + #[path = "opentelemetry.proto.collector.metrics.v1.rs"] + pub mod v1; } #[cfg(feature = "traces")] + #[path = ""] pub mod trace { - pub mod v1 { - tonic::include_proto!("opentelemetry.proto.collector.trace.v1"); - } + #[path = "opentelemetry.proto.collector.trace.v1.rs"] + pub mod v1; } } /// Common types used across all signals + #[path = ""] pub mod common { - pub mod v1 { - tonic::include_proto!("opentelemetry.proto.common.v1"); - } + #[path = "opentelemetry.proto.common.v1.rs"] + pub mod v1; } - #[cfg(feature = "logs")] /// Generated types used in logging. + #[cfg(feature = "logs")] + #[path = ""] pub mod logs { - pub mod v1 { - tonic::include_proto!("opentelemetry.proto.logs.v1"); - } + #[path = "opentelemetry.proto.logs.v1.rs"] + pub mod v1; } - #[cfg(feature = "metrics")] /// Generated types used in metrics. + #[cfg(feature = "metrics")] + #[path = ""] pub mod metrics { - pub mod v1 { - tonic::include_proto!("opentelemetry.proto.metrics.v1"); - } + #[path = "opentelemetry.proto.metrics.v1.rs"] + pub mod v1; } /// Generated types used in resources. + #[path = ""] pub mod resource { - pub mod v1 { - tonic::include_proto!("opentelemetry.proto.resource.v1"); - } + #[path = "opentelemetry.proto.resource.v1.rs"] + pub mod v1; } - #[cfg(feature = "traces")] /// Generated types used in traces. + #[cfg(feature = "traces")] + #[path = ""] pub mod trace { - pub mod v1 { - tonic::include_proto!("opentelemetry.proto.trace.v1"); - } + #[path = "opentelemetry.proto.trace.v1.rs"] + pub mod v1; } pub use crate::transform::common::tonic::Attributes; - - #[cfg(feature = "metrics")] - pub use crate::transform::metrics::tonic::FromNumber; } #[cfg(feature = "gen-protoc")] /// Generated files using [`grpcio`](https://docs.rs/crate/grpcio) and [`protobuf`](https://docs.rs/crate/protobuf/latest) pub mod grpcio { pub mod common; + #[cfg(feature = "logs")] + pub mod logs; + #[cfg(feature = "logs")] + pub mod logs_service; + #[cfg(feature = "logs")] + pub mod logs_service_grpc; #[cfg(feature = "metrics")] pub mod metrics; #[cfg(feature = "metrics")] @@ -83,8 +88,6 @@ #[cfg(feature = "traces")] pub mod trace; #[cfg(feature = "traces")] - pub mod trace_config; - #[cfg(feature = "traces")] pub mod trace_service; #[cfg(feature = "traces")] pub mod trace_service_grpc; diff -Nru temporalio-1.3.0/vendor/opentelemetry-proto/src/transform/common.rs temporalio-1.3.0/vendor/opentelemetry-proto/src/transform/common.rs --- temporalio-1.3.0/vendor/opentelemetry-proto/src/transform/common.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-proto/src/transform/common.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,31 +1,53 @@ -#[cfg(feature = "traces")] +#[cfg(any(feature = "traces", feature = "logs"))] use std::time::{Duration, SystemTime, UNIX_EPOCH}; -#[cfg(feature = "traces")] +#[cfg(any(feature = "traces", feature = "logs"))] pub(crate) fn to_nanos(time: SystemTime) -> u64 { time.duration_since(UNIX_EPOCH) .unwrap_or_else(|_| Duration::from_secs(0)) .as_nanos() as u64 } -#[cfg(feature = "gen-tonic")] +#[cfg(feature = "gen-tonic-messages")] pub mod tonic { use crate::proto::tonic::common::v1::{ - any_value, AnyValue, ArrayValue, InstrumentationLibrary, KeyValue, + any_value, AnyValue, ArrayValue, InstrumentationScope, KeyValue, }; - use opentelemetry::{sdk::trace::EvictedHashMap, Array, Value}; + use opentelemetry_api::{Array, Value}; + use opentelemetry_sdk::trace::EvictedHashMap; use std::borrow::Cow; - impl From for InstrumentationLibrary { - fn from(library: opentelemetry::sdk::InstrumentationLibrary) -> Self { - InstrumentationLibrary { - name: library.name.to_string(), + #[cfg(any(feature = "traces", feature = "logs"))] + use opentelemetry_sdk::Resource; + + impl From for InstrumentationScope { + fn from(library: opentelemetry_sdk::InstrumentationLibrary) -> Self { + InstrumentationScope { + name: library.name.into_owned(), + attributes: Vec::new(), version: library.version.unwrap_or(Cow::Borrowed("")).to_string(), + dropped_attributes_count: 0, + } + } + } + + impl From<&opentelemetry_sdk::InstrumentationLibrary> for InstrumentationScope { + fn from(library: &opentelemetry_sdk::InstrumentationLibrary) -> Self { + InstrumentationScope { + name: library.name.to_string(), + attributes: Vec::new(), + version: library + .version + .as_ref() + .map(ToString::to_string) + .unwrap_or_default(), + dropped_attributes_count: 0, } } } /// Wrapper type for Vec<[`KeyValue`](crate::proto::tonic::common::v1::KeyValue)> + #[derive(Default)] pub struct Attributes(pub ::std::vec::Vec); impl From for Attributes { @@ -42,8 +64,8 @@ } } - impl From> for Attributes { - fn from(kvs: Vec) -> Self { + impl From> for Attributes { + fn from(kvs: Vec) -> Self { Attributes( kvs.into_iter() .map(|api_kv| KeyValue { @@ -55,6 +77,20 @@ } } + #[cfg(feature = "logs")] + impl, V: Into> FromIterator<(K, V)> for Attributes { + fn from_iter>(iter: T) -> Self { + Attributes( + iter.into_iter() + .map(|(k, v)| KeyValue { + key: k.into(), + value: Some(v.into()), + }) + .collect(), + ) + } + } + impl From for AnyValue { fn from(value: Value) -> Self { AnyValue { @@ -85,18 +121,30 @@ ArrayValue { values } } + + #[cfg(any(feature = "traces", feature = "logs"))] + pub(crate) fn resource_attributes(resource: &Resource) -> Attributes { + resource + .iter() + .map(|(k, v)| opentelemetry_api::KeyValue::new(k.clone(), v.clone())) + .collect::>() + .into() + } } #[cfg(feature = "gen-protoc")] pub mod grpcio { - use crate::proto::grpcio::common::{AnyValue, ArrayValue, InstrumentationLibrary, KeyValue}; - use opentelemetry::{sdk::trace::EvictedHashMap, Array, Value}; + use crate::proto::grpcio::common::{AnyValue, ArrayValue, InstrumentationScope, KeyValue}; + use opentelemetry_api::{Array, Value}; + use opentelemetry_sdk::{trace::EvictedHashMap, Resource}; use protobuf::RepeatedField; + #[cfg(feature = "logs")] + use protobuf::SingularPtrField; use std::borrow::Cow; - impl From for InstrumentationLibrary { - fn from(library: opentelemetry::sdk::InstrumentationLibrary) -> Self { - InstrumentationLibrary { + impl From for InstrumentationScope { + fn from(library: opentelemetry_sdk::InstrumentationLibrary) -> Self { + InstrumentationScope { name: library.name.to_string(), version: library.version.unwrap_or(Cow::Borrowed("")).to_string(), ..Default::default() @@ -104,6 +152,7 @@ } } + #[derive(Default)] pub struct Attributes(pub ::protobuf::RepeatedField); impl From for Attributes { @@ -122,8 +171,8 @@ } } - impl From> for Attributes { - fn from(kvs: Vec) -> Self { + impl From> for Attributes { + fn from(kvs: Vec) -> Self { Attributes(RepeatedField::from_vec( kvs.into_iter() .map(|api_kv| { @@ -137,6 +186,21 @@ } } + #[cfg(feature = "logs")] + impl, V: Into> FromIterator<(K, V)> for Attributes { + fn from_iter>(iter: T) -> Self { + Attributes(RepeatedField::from_vec( + iter.into_iter() + .map(|(k, v)| KeyValue { + key: k.into(), + value: SingularPtrField::some(v.into()), + ..Default::default() + }) + .collect(), + )) + } + } + impl From for AnyValue { fn from(value: Value) -> Self { let mut any_value = AnyValue::new(); @@ -171,4 +235,13 @@ array_value.set_values(values); array_value } + + #[cfg(any(feature = "traces", feature = "logs"))] + pub(crate) fn resource_attributes(resource: &Resource) -> Attributes { + resource + .iter() + .map(|(k, v)| opentelemetry_api::KeyValue::new(k.clone(), v.clone())) + .collect::>() + .into() + } } diff -Nru temporalio-1.3.0/vendor/opentelemetry-proto/src/transform/logs.rs temporalio-1.3.0/vendor/opentelemetry-proto/src/transform/logs.rs --- temporalio-1.3.0/vendor/opentelemetry-proto/src/transform/logs.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-proto/src/transform/logs.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,290 @@ +use crate::transform::common::to_nanos; + +#[cfg(feature = "gen-tonic")] +pub mod tonic { + use crate::{ + tonic::{ + common::v1::{any_value::Value, AnyValue, ArrayValue, KeyValue, KeyValueList}, + logs::v1::{LogRecord, ResourceLogs, ScopeLogs, SeverityNumber}, + resource::v1::Resource, + Attributes, + }, + transform::common::tonic::resource_attributes, + }; + use opentelemetry_api::logs::{AnyValue as LogsAnyValue, Severity}; + + use super::*; + + impl From for AnyValue { + fn from(value: LogsAnyValue) -> Self { + AnyValue { + value: Some(value.into()), + } + } + } + + impl From for Value { + fn from(value: LogsAnyValue) -> Self { + match value { + LogsAnyValue::Double(f) => Value::DoubleValue(f), + LogsAnyValue::Int(i) => Value::IntValue(i), + LogsAnyValue::String(s) => Value::StringValue(s.into()), + LogsAnyValue::Boolean(b) => Value::BoolValue(b), + LogsAnyValue::ListAny(v) => Value::ArrayValue(ArrayValue { + values: v + .into_iter() + .map(|v| AnyValue { + value: Some(v.into()), + }) + .collect(), + }), + LogsAnyValue::Map(m) => Value::KvlistValue(KeyValueList { + values: m + .into_iter() + .map(|(key, value)| KeyValue { + key: key.into(), + value: Some(AnyValue { + value: Some(value.into()), + }), + }) + .collect(), + }), + LogsAnyValue::Bytes(v) => Value::BytesValue(v), + } + } + } + + impl From for LogRecord { + fn from(log_record: opentelemetry_api::logs::LogRecord) -> Self { + let trace_context = log_record.trace_context.as_ref(); + let severity_number = match log_record.severity_number { + Some(Severity::Trace) => SeverityNumber::Trace, + Some(Severity::Trace2) => SeverityNumber::Trace2, + Some(Severity::Trace3) => SeverityNumber::Trace3, + Some(Severity::Trace4) => SeverityNumber::Trace4, + Some(Severity::Debug) => SeverityNumber::Debug, + Some(Severity::Debug2) => SeverityNumber::Debug2, + Some(Severity::Debug3) => SeverityNumber::Debug3, + Some(Severity::Debug4) => SeverityNumber::Debug4, + Some(Severity::Info) => SeverityNumber::Info, + Some(Severity::Info2) => SeverityNumber::Info2, + Some(Severity::Info3) => SeverityNumber::Info3, + Some(Severity::Info4) => SeverityNumber::Info4, + Some(Severity::Warn) => SeverityNumber::Warn, + Some(Severity::Warn2) => SeverityNumber::Warn2, + Some(Severity::Warn3) => SeverityNumber::Warn3, + Some(Severity::Warn4) => SeverityNumber::Warn4, + Some(Severity::Error) => SeverityNumber::Error, + Some(Severity::Error2) => SeverityNumber::Error2, + Some(Severity::Error3) => SeverityNumber::Error3, + Some(Severity::Error4) => SeverityNumber::Error4, + Some(Severity::Fatal) => SeverityNumber::Fatal, + Some(Severity::Fatal2) => SeverityNumber::Fatal2, + Some(Severity::Fatal3) => SeverityNumber::Fatal3, + Some(Severity::Fatal4) => SeverityNumber::Fatal4, + None => SeverityNumber::Unspecified, + }; + + LogRecord { + time_unix_nano: log_record.timestamp.map(to_nanos).unwrap_or_default(), + observed_time_unix_nano: log_record + .observed_timestamp + .map(to_nanos) + .unwrap_or_default(), + severity_number: severity_number.into(), + severity_text: log_record.severity_text.map(Into::into).unwrap_or_default(), + body: log_record.body.map(Into::into), + attributes: log_record + .attributes + .map(|attrs| Attributes::from_iter(attrs.into_iter())) + .unwrap_or_default() + .0, + dropped_attributes_count: 0, + flags: trace_context + .map(|ctx| { + ctx.trace_flags + .map(|flags| flags.to_u8() as u32) + .unwrap_or_default() + }) + .unwrap_or_default(), + span_id: trace_context + .map(|ctx| ctx.span_id.to_bytes().to_vec()) + .unwrap_or_default(), + trace_id: trace_context + .map(|ctx| ctx.trace_id.to_bytes().to_vec()) + .unwrap_or_default(), + } + } + } + + impl From for ResourceLogs { + fn from(log_data: opentelemetry_sdk::export::logs::LogData) -> Self { + ResourceLogs { + resource: Some(Resource { + attributes: resource_attributes(&log_data.resource).0, + dropped_attributes_count: 0, + }), + schema_url: "".to_string(), + scope_logs: vec![ScopeLogs { + schema_url: log_data + .instrumentation + .schema_url + .clone() + .map(Into::into) + .unwrap_or_default(), + scope: Some(log_data.instrumentation.into()), + log_records: vec![log_data.record.into()], + }], + } + } + } +} + +#[cfg(feature = "gen-protoc")] +pub mod grpcio { + use crate::{ + grpcio::Attributes, + proto::grpcio::{ + common::{AnyValue, AnyValue_oneof_value, ArrayValue, KeyValue, KeyValueList}, + logs::{LogRecord, ResourceLogs, ScopeLogs, SeverityNumber}, + resource::Resource, + }, + transform::common::grpcio::resource_attributes, + }; + use opentelemetry_api::logs::{AnyValue as LogsAnyValue, Severity}; + use protobuf::{RepeatedField, SingularPtrField}; + + use super::*; + + impl From for AnyValue { + fn from(value: LogsAnyValue) -> Self { + AnyValue { + value: Some(value.into()), + ..Default::default() + } + } + } + + impl From for AnyValue_oneof_value { + fn from(value: LogsAnyValue) -> Self { + match value { + LogsAnyValue::Double(f) => AnyValue_oneof_value::double_value(f), + LogsAnyValue::Int(i) => AnyValue_oneof_value::int_value(i), + LogsAnyValue::String(s) => AnyValue_oneof_value::string_value(s.into()), + LogsAnyValue::Boolean(b) => AnyValue_oneof_value::bool_value(b), + LogsAnyValue::ListAny(v) => AnyValue_oneof_value::array_value(ArrayValue { + values: RepeatedField::from_vec( + v.into_iter() + .map(|v| AnyValue { + value: Some(v.into()), + ..Default::default() + }) + .collect(), + ), + ..Default::default() + }), + LogsAnyValue::Map(m) => AnyValue_oneof_value::kvlist_value(KeyValueList { + values: RepeatedField::from_vec( + m.into_iter() + .map(|(key, value)| KeyValue { + key: key.into(), + value: SingularPtrField::some(AnyValue { + value: Some(value.into()), + ..Default::default() + }), + ..Default::default() + }) + .collect(), + ), + ..Default::default() + }), + LogsAnyValue::Bytes(v) => AnyValue_oneof_value::bytes_value(v), + } + } + } + + impl From for LogRecord { + fn from(log_record: opentelemetry_api::logs::LogRecord) -> Self { + let trace_context = log_record.trace_context.as_ref(); + let severity_number = match log_record.severity_number { + Some(Severity::Trace) => SeverityNumber::SEVERITY_NUMBER_TRACE, + Some(Severity::Trace2) => SeverityNumber::SEVERITY_NUMBER_TRACE2, + Some(Severity::Trace3) => SeverityNumber::SEVERITY_NUMBER_TRACE3, + Some(Severity::Trace4) => SeverityNumber::SEVERITY_NUMBER_TRACE4, + Some(Severity::Debug) => SeverityNumber::SEVERITY_NUMBER_DEBUG, + Some(Severity::Debug2) => SeverityNumber::SEVERITY_NUMBER_DEBUG2, + Some(Severity::Debug3) => SeverityNumber::SEVERITY_NUMBER_DEBUG3, + Some(Severity::Debug4) => SeverityNumber::SEVERITY_NUMBER_DEBUG4, + Some(Severity::Info) => SeverityNumber::SEVERITY_NUMBER_INFO, + Some(Severity::Info2) => SeverityNumber::SEVERITY_NUMBER_INFO2, + Some(Severity::Info3) => SeverityNumber::SEVERITY_NUMBER_INFO3, + Some(Severity::Info4) => SeverityNumber::SEVERITY_NUMBER_INFO4, + Some(Severity::Warn) => SeverityNumber::SEVERITY_NUMBER_WARN, + Some(Severity::Warn2) => SeverityNumber::SEVERITY_NUMBER_WARN2, + Some(Severity::Warn3) => SeverityNumber::SEVERITY_NUMBER_WARN3, + Some(Severity::Warn4) => SeverityNumber::SEVERITY_NUMBER_WARN4, + Some(Severity::Error) => SeverityNumber::SEVERITY_NUMBER_ERROR, + Some(Severity::Error2) => SeverityNumber::SEVERITY_NUMBER_ERROR2, + Some(Severity::Error3) => SeverityNumber::SEVERITY_NUMBER_ERROR3, + Some(Severity::Error4) => SeverityNumber::SEVERITY_NUMBER_ERROR4, + Some(Severity::Fatal) => SeverityNumber::SEVERITY_NUMBER_FATAL, + Some(Severity::Fatal2) => SeverityNumber::SEVERITY_NUMBER_FATAL2, + Some(Severity::Fatal3) => SeverityNumber::SEVERITY_NUMBER_FATAL3, + Some(Severity::Fatal4) => SeverityNumber::SEVERITY_NUMBER_FATAL4, + None => SeverityNumber::SEVERITY_NUMBER_UNSPECIFIED, + }; + + LogRecord { + time_unix_nano: log_record.timestamp.map(to_nanos).unwrap_or(0), + severity_number, + severity_text: log_record.severity_text.map(Into::into).unwrap_or_default(), + body: log_record.body.map(Into::into).into(), + attributes: log_record + .attributes + .map(|attrs| Attributes::from_iter(attrs.into_iter())) + .unwrap_or_default() + .0, + dropped_attributes_count: 0, + flags: trace_context + .map(|ctx| { + ctx.trace_flags + .map(|flags| flags.to_u8() as u32) + .unwrap_or_default() + }) + .unwrap_or_default(), + span_id: trace_context + .map(|ctx| ctx.span_id.to_bytes().to_vec()) + .unwrap_or_default(), + trace_id: trace_context + .map(|ctx| ctx.trace_id.to_bytes().to_vec()) + .unwrap_or_default(), + ..Default::default() + } + } + } + + impl From for ResourceLogs { + fn from(log_data: opentelemetry_sdk::export::logs::LogData) -> Self { + ResourceLogs { + resource: SingularPtrField::some(Resource { + attributes: resource_attributes(&log_data.resource).0, + dropped_attributes_count: 0, + ..Default::default() + }), + schema_url: "".to_string(), + scope_logs: RepeatedField::from_vec(vec![ScopeLogs { + schema_url: log_data + .instrumentation + .schema_url + .clone() + .map(Into::into) + .unwrap_or_default(), + scope: SingularPtrField::some(log_data.instrumentation.into()), + log_records: RepeatedField::from_vec(vec![log_data.record.into()]), + ..Default::default() + }]), + ..Default::default() + } + } + } +} diff -Nru temporalio-1.3.0/vendor/opentelemetry-proto/src/transform/metrics.rs temporalio-1.3.0/vendor/opentelemetry-proto/src/transform/metrics.rs --- temporalio-1.3.0/vendor/opentelemetry-proto/src/transform/metrics.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-proto/src/transform/metrics.rs 2023-10-30 19:40:00.000000000 +0000 @@ -3,55 +3,75 @@ // We cannot ignore it as it's not an optional field. // We can remove this after we removed the labels field from proto. #[allow(deprecated)] -#[cfg(feature = "gen-tonic")] +#[cfg(feature = "gen-tonic-messages")] pub mod tonic { - use crate::proto::tonic::{ - common::v1::KeyValue, - metrics::v1::{number_data_point, AggregationTemporality}, - }; - use opentelemetry::{ - metrics::MetricsError, - sdk::{ - export::metrics::aggregation::Temporality, - metrics::sdk_api::{Number, NumberKind}, - }, - }; - - use opentelemetry::{Key, Value}; - - /// Convert [`Number`](opentelemetry::sdk::metrics::sdk_api::Number) to target type based - /// on it's [`NumberKind`](opentelemetry::sdk::metrics::sdk_api::NumberKind). - pub trait FromNumber { - fn from_number(number: Number, number_kind: &NumberKind) -> Self; - } - - impl FromNumber for number_data_point::Value { - fn from_number(number: Number, number_kind: &NumberKind) -> Self { - match &number_kind { - NumberKind::I64 | NumberKind::U64 => { - number_data_point::Value::AsInt(number.to_i64(number_kind)) - } - NumberKind::F64 => number_data_point::Value::AsDouble(number.to_f64(number_kind)), - } + use crate::proto::tonic::{common::v1::KeyValue, metrics::v1::AggregationTemporality}; + use crate::tonic::metrics::v1::{exemplar, number_data_point}; + use opentelemetry_api::metrics::MetricsError; + use opentelemetry_api::{Key, Value}; + use opentelemetry_sdk::metrics::data::Temporality; + + impl From for exemplar::Value { + fn from(value: u64) -> Self { + exemplar::Value::AsInt(i64::try_from(value).unwrap_or_default()) + } + } + + impl From for exemplar::Value { + fn from(value: i64) -> Self { + exemplar::Value::AsInt(value) + } + } + + impl From for exemplar::Value { + fn from(value: f64) -> Self { + exemplar::Value::AsDouble(value) + } + } + + impl From for number_data_point::Value { + fn from(value: u64) -> Self { + number_data_point::Value::AsInt(i64::try_from(value).unwrap_or_default()) + } + } + + impl From for number_data_point::Value { + fn from(value: i64) -> Self { + number_data_point::Value::AsInt(value) + } + } + + impl From for number_data_point::Value { + fn from(value: f64) -> Self { + number_data_point::Value::AsDouble(value) } } impl From<(&Key, &Value)> for KeyValue { fn from(kv: (&Key, &Value)) -> Self { KeyValue { - key: kv.0.clone().into(), + key: kv.0.to_string(), value: Some(kv.1.clone().into()), } } } + impl From<&opentelemetry_api::KeyValue> for KeyValue { + fn from(kv: &opentelemetry_api::KeyValue) -> Self { + KeyValue { + key: kv.key.to_string(), + value: Some(kv.value.clone().into()), + } + } + } + impl From for AggregationTemporality { fn from(temporality: Temporality) -> Self { match temporality { Temporality::Cumulative => AggregationTemporality::Cumulative, Temporality::Delta => AggregationTemporality::Delta, other => { - opentelemetry::global::handle_error(MetricsError::Other(format!( + opentelemetry_api::global::handle_error(MetricsError::Other(format!( "Unknown temporality {:?}, using default instead.", other ))); diff -Nru temporalio-1.3.0/vendor/opentelemetry-proto/src/transform/mod.rs temporalio-1.3.0/vendor/opentelemetry-proto/src/transform/mod.rs --- temporalio-1.3.0/vendor/opentelemetry-proto/src/transform/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-proto/src/transform/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -6,5 +6,8 @@ #[cfg(feature = "traces")] pub mod traces; +#[cfg(feature = "logs")] +pub mod logs; + #[cfg(feature = "zpages")] pub mod tracez; diff -Nru temporalio-1.3.0/vendor/opentelemetry-proto/src/transform/traces.rs temporalio-1.3.0/vendor/opentelemetry-proto/src/transform/traces.rs --- temporalio-1.3.0/vendor/opentelemetry-proto/src/transform/traces.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-proto/src/transform/traces.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,16 +1,14 @@ use crate::transform::common::to_nanos; -use opentelemetry::sdk::{self, export::trace::SpanData}; -use opentelemetry::trace::{Link, SpanId, SpanKind}; +use opentelemetry_api::trace::{Link, SpanId, SpanKind}; +use opentelemetry_sdk::export::trace::SpanData; -#[cfg(feature = "gen-tonic")] +#[cfg(feature = "gen-tonic-messages")] pub mod tonic { use super::*; use crate::proto::tonic::resource::v1::Resource; - use crate::proto::tonic::trace::v1::{ - span, status, InstrumentationLibrarySpans, ResourceSpans, Span, Status, - }; - use crate::transform::common::tonic::Attributes; - use opentelemetry::trace; + use crate::proto::tonic::trace::v1::{span, status, ResourceSpans, ScopeSpans, Span, Status}; + use crate::transform::common::tonic::{resource_attributes, Attributes}; + use opentelemetry_api::trace; impl From for span::SpanKind { fn from(span_kind: SpanKind) -> Self { @@ -59,14 +57,14 @@ .schema_url() .map(|url| url.to_string()) .unwrap_or_default(), - instrumentation_library_spans: vec![InstrumentationLibrarySpans { + scope_spans: vec![ScopeSpans { schema_url: source_span .instrumentation_lib .schema_url .as_ref() .map(ToString::to_string) .unwrap_or_default(), - instrumentation_library: Some(source_span.instrumentation_lib.into()), + scope: Some(source_span.instrumentation_lib.into()), spans: vec![Span { trace_id: source_span.span_context.trace_id().to_bytes().to_vec(), span_id: source_span.span_context.span_id().to_bytes().to_vec(), @@ -109,14 +107,6 @@ } } } - - fn resource_attributes(resource: &sdk::Resource) -> Attributes { - resource - .iter() - .map(|(k, v)| opentelemetry::KeyValue::new(k.clone(), v.clone())) - .collect::>() - .into() - } } #[cfg(feature = "gen-protoc")] @@ -124,11 +114,11 @@ use super::*; use crate::proto::grpcio::resource::Resource; use crate::proto::grpcio::trace::{ - InstrumentationLibrarySpans, ResourceSpans, Span, Span_Event, Span_Link, Span_SpanKind, - Status, Status_StatusCode, + ResourceSpans, ScopeSpans, Span, Span_Event, Span_Link, Span_SpanKind, Status, + Status_StatusCode, }; - use crate::transform::common::grpcio::Attributes; - use opentelemetry::trace; + use crate::transform::common::grpcio::{resource_attributes, Attributes}; + use opentelemetry_api::trace; use protobuf::{RepeatedField, SingularPtrField}; impl From for Span_SpanKind { @@ -174,75 +164,63 @@ dropped_attributes_count: 0, ..Default::default() })), - instrumentation_library_spans: RepeatedField::from_vec(vec![ - InstrumentationLibrarySpans { - schema_url: source_span - .instrumentation_lib - .schema_url - .as_ref() - .map(ToString::to_string) - .unwrap_or_default(), - instrumentation_library: protobuf::SingularPtrField::some( - source_span.instrumentation_lib.into(), + scope_spans: RepeatedField::from_vec(vec![ScopeSpans { + schema_url: source_span + .instrumentation_lib + .schema_url + .as_ref() + .map(ToString::to_string) + .unwrap_or_default(), + scope: protobuf::SingularPtrField::some(source_span.instrumentation_lib.into()), + spans: RepeatedField::from_vec(vec![Span { + trace_id: source_span.span_context.trace_id().to_bytes().to_vec(), + span_id: source_span.span_context.span_id().to_bytes().to_vec(), + trace_state: source_span.span_context.trace_state().header(), + parent_span_id: { + if source_span.parent_span_id != SpanId::INVALID { + source_span.parent_span_id.to_bytes().to_vec() + } else { + vec![] + } + }, + name: source_span.name.into_owned(), + kind: source_span.span_kind.into(), + start_time_unix_nano: to_nanos(source_span.start_time), + end_time_unix_nano: to_nanos(source_span.end_time), + dropped_attributes_count: source_span.attributes.dropped_count(), + attributes: Attributes::from(source_span.attributes).0, + dropped_events_count: source_span.events.dropped_count(), + events: RepeatedField::from_vec( + source_span + .events + .into_iter() + .map(|event| Span_Event { + time_unix_nano: to_nanos(event.timestamp), + name: event.name.into(), + attributes: Attributes::from(event.attributes).0, + dropped_attributes_count: event.dropped_attributes_count, + ..Default::default() + }) + .collect(), ), - spans: RepeatedField::from_vec(vec![Span { - trace_id: source_span.span_context.trace_id().to_bytes().to_vec(), - span_id: source_span.span_context.span_id().to_bytes().to_vec(), - trace_state: source_span.span_context.trace_state().header(), - parent_span_id: { - if source_span.parent_span_id != SpanId::INVALID { - source_span.parent_span_id.to_bytes().to_vec() - } else { - vec![] - } + dropped_links_count: source_span.links.dropped_count(), + links: RepeatedField::from_vec( + source_span.links.into_iter().map(Into::into).collect(), + ), + status: SingularPtrField::some(Status { + code: Status_StatusCode::from(&source_span.status), + message: match source_span.status { + trace::Status::Error { description } => description.to_string(), + _ => Default::default(), }, - name: source_span.name.into_owned(), - kind: source_span.span_kind.into(), - start_time_unix_nano: to_nanos(source_span.start_time), - end_time_unix_nano: to_nanos(source_span.end_time), - dropped_attributes_count: source_span.attributes.dropped_count(), - attributes: Attributes::from(source_span.attributes).0, - dropped_events_count: source_span.events.dropped_count(), - events: RepeatedField::from_vec( - source_span - .events - .into_iter() - .map(|event| Span_Event { - time_unix_nano: to_nanos(event.timestamp), - name: event.name.into(), - attributes: Attributes::from(event.attributes).0, - dropped_attributes_count: event.dropped_attributes_count, - ..Default::default() - }) - .collect(), - ), - dropped_links_count: source_span.links.dropped_count(), - links: RepeatedField::from_vec( - source_span.links.into_iter().map(Into::into).collect(), - ), - status: SingularPtrField::some(Status { - code: Status_StatusCode::from(&source_span.status), - message: match source_span.status { - trace::Status::Error { description } => description.to_string(), - _ => Default::default(), - }, - ..Default::default() - }), ..Default::default() - }]), + }), ..Default::default() - }, - ]), + }]), + ..Default::default() + }]), ..Default::default() } } } - - fn resource_attributes(resource: &sdk::Resource) -> Attributes { - resource - .iter() - .map(|(k, v)| opentelemetry::KeyValue::new(k.clone(), v.clone())) - .collect::>() - .into() - } } diff -Nru temporalio-1.3.0/vendor/opentelemetry-proto/src/transform/tracez.rs temporalio-1.3.0/vendor/opentelemetry-proto/src/transform/tracez.rs --- temporalio-1.3.0/vendor/opentelemetry-proto/src/transform/tracez.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-proto/src/transform/tracez.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,9 +1,7 @@ #[cfg(feature = "gen-protoc")] mod grpcio { - use opentelemetry::{ - sdk::export::trace::SpanData, - trace::{self, Event}, - }; + use opentelemetry_api::trace::{self, Event}; + use opentelemetry_sdk::export::trace::SpanData; use crate::transform::common::{grpcio::Attributes, to_nanos}; use crate::{ diff -Nru temporalio-1.3.0/vendor/opentelemetry-proto/tests/grpc_build.rs temporalio-1.3.0/vendor/opentelemetry-proto/tests/grpc_build.rs --- temporalio-1.3.0/vendor/opentelemetry-proto/tests/grpc_build.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-proto/tests/grpc_build.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,58 +1,115 @@ use protobuf_codegen::Customize; use protoc_grpcio::compile_grpc_protos; use std::collections::HashMap; -use std::path::PathBuf; +use std::path::Path; +use tempfile::TempDir; + +const GRPCIO_OUT_DIR: &str = "src/proto/grpcio"; +const GRPCIO_PROTO_FILES: &[&str] = &[ + "src/proto/opentelemetry-proto/opentelemetry/proto/common/v1/common.proto", + "src/proto/opentelemetry-proto/opentelemetry/proto/resource/v1/resource.proto", + "src/proto/opentelemetry-proto/opentelemetry/proto/trace/v1/trace.proto", + "src/proto/opentelemetry-proto/opentelemetry/proto/collector/trace/v1/trace_service.proto", + "src/proto/opentelemetry-proto/opentelemetry/proto/metrics/v1/metrics.proto", + "src/proto/opentelemetry-proto/opentelemetry/proto/collector/metrics/v1/metrics_service.proto", + "src/proto/opentelemetry-proto/opentelemetry/proto/logs/v1/logs.proto", + "src/proto/opentelemetry-proto/opentelemetry/proto/collector/logs/v1/logs_service.proto", + "src/proto/tracez.proto", +]; +const GRPCIO_INCLUDES: &[&str] = &["src/proto/opentelemetry-proto/", "src/proto"]; + +const TONIC_OUT_DIR: &str = "src/proto/tonic"; +const TONIC_PROTO_FILES: &[&str] = &[ + "src/proto/opentelemetry-proto/opentelemetry/proto/common/v1/common.proto", + "src/proto/opentelemetry-proto/opentelemetry/proto/resource/v1/resource.proto", + "src/proto/opentelemetry-proto/opentelemetry/proto/trace/v1/trace.proto", + "src/proto/opentelemetry-proto/opentelemetry/proto/collector/trace/v1/trace_service.proto", + "src/proto/opentelemetry-proto/opentelemetry/proto/metrics/v1/metrics.proto", + "src/proto/opentelemetry-proto/opentelemetry/proto/collector/metrics/v1/metrics_service.proto", + "src/proto/opentelemetry-proto/opentelemetry/proto/logs/v1/logs.proto", + "src/proto/opentelemetry-proto/opentelemetry/proto/collector/logs/v1/logs_service.proto", +]; +const TONIC_INCLUDES: &[&str] = &["src/proto/opentelemetry-proto"]; // This test helps to keep files generated and used by grpcio update to date. // If the test fails, it means the generated files has been changed. Please commit the change // and rerun test. It should pass at the second time. #[test] fn build_grpc() { - let before_build = build_content_map(); + let before_build = build_content_map(GRPCIO_OUT_DIR); + + let out_dir = TempDir::new().expect("failed to create temp dir to store the generated files"); + compile_grpc_protos( - &[ - "src/proto/opentelemetry-proto/opentelemetry/proto/common/v1/common.proto", - "src/proto/opentelemetry-proto/opentelemetry/proto/resource/v1/resource.proto", - "src/proto/opentelemetry-proto/opentelemetry/proto/trace/v1/trace.proto", - "src/proto/opentelemetry-proto/opentelemetry/proto/trace/v1/trace_config.proto", - "src/proto/opentelemetry-proto/opentelemetry/proto/collector/trace/v1/trace_service.proto", - "src/proto/opentelemetry-proto/opentelemetry/proto/metrics/v1/metrics.proto", - "src/proto/opentelemetry-proto/opentelemetry/proto/collector/metrics/v1/metrics_service.proto", - "src/proto/tracez.proto" - ], - &["src/proto/opentelemetry-proto/", "src/proto"], - "src/proto/grpcio", + GRPCIO_PROTO_FILES, + GRPCIO_INCLUDES, + out_dir.path(), Some(Customize { expose_fields: Some(true), serde_derive: Some(true), ..Default::default() }), ) - .expect("Error generating protobuf"); - let after_build = build_content_map(); - // we cannot use assert_eq! here because it will print both maps when they don't match, which - // makes the error message unreadable. - // If you find the test passed locally but not in CI pipeline. Try update the dependency. It may - // be a new version of protobuf or other dependencies - // DO NOT use assert_eq! here as it will print all generated file when proto changes. - assert!( - before_build == after_build, - "generated file has changed, please commit the change file and rerun the test" - ); + .expect("error generating protobuf"); + let after_build = build_content_map(out_dir.path()); + ensure_files_are_same(before_build, after_build, GRPCIO_OUT_DIR); } -fn build_content_map() -> HashMap { - std::fs::read_dir("src/proto/grpcio") - .expect("cannot open dict of generated grpc files") - .into_iter() +#[test] +fn build_tonic() { + let before_build = build_content_map(TONIC_OUT_DIR); + + let out_dir = TempDir::new().expect("failed to create temp dir to store the generated files"); + + // build the generated files into OUT_DIR for now so we don't have to touch the src unless we have to + tonic_build::configure() + .build_server(true) + .build_client(true) + .server_mod_attribute(".", "#[cfg(feature = \"gen-tonic\")]") + .client_mod_attribute(".", "#[cfg(feature = \"gen-tonic\")]") + .out_dir(out_dir.path()) + .compile(TONIC_PROTO_FILES, TONIC_INCLUDES) + .expect("cannot compile protobuf using tonic"); + + let after_build = build_content_map(out_dir.path()); + ensure_files_are_same(before_build, after_build, TONIC_OUT_DIR); +} + +fn build_content_map(path: impl AsRef) -> HashMap { + std::fs::read_dir(path) + .expect("cannot open dictionary of generated files") .flatten() .map(|entry| { + let path = entry.path(); + let file_name = path + .file_name() + .expect("file name should always exist for generated files"); ( - entry.path(), - std::fs::read_to_string(entry.path()).unwrap_or_else(|_| { - panic!("cannot read from file {}", entry.path().to_string_lossy()) - }), + file_name.to_string_lossy().to_string(), + std::fs::read_to_string(path).expect("cannot read from existing generated file"), ) }) .collect() } + +fn ensure_files_are_same( + before_build: HashMap, + after_build: HashMap, + target_dir: &'static str, +) { + if after_build == before_build { + return; + } + + if std::env::var("CI").is_ok() { + panic!("generated file has changed but it's a CI environment, please rerun this test locally and commit the changes"); + } + + // if there is at least one changes we will just copy the whole directory over + for (file_name, content) in after_build { + std::fs::write(Path::new(target_dir).join(file_name), content) + .expect("cannot write to the proto generate file. If it's happening in CI env, please return the test locally and commit the change"); + } + + panic!("generated file has changed, please commit the change file and rerun the test"); +} diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/benches/batch_span_processor.rs temporalio-1.3.0/vendor/opentelemetry_sdk/benches/batch_span_processor.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/benches/batch_span_processor.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/benches/batch_span_processor.rs 2023-10-30 19:40:00.000000000 +0000 @@ -14,7 +14,6 @@ fn get_span_data() -> Vec { (0..200) - .into_iter() .map(|_| SpanData { span_context: SpanContext::new( TraceId::from_u128(12), diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/benches/context.rs temporalio-1.3.0/vendor/opentelemetry_sdk/benches/context.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/benches/context.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/benches/context.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,94 @@ +use std::fmt::Display; + +use criterion::{black_box, criterion_group, criterion_main, BenchmarkId, Criterion}; +use futures_util::future::BoxFuture; +use opentelemetry_api::{ + trace::{TraceContextExt, Tracer, TracerProvider}, + Context, +}; +use opentelemetry_sdk::{ + export::trace::{ExportResult, SpanData, SpanExporter}, + trace as sdktrace, +}; +use pprof::criterion::{Output, PProfProfiler}; + +fn criterion_benchmark(c: &mut Criterion) { + benchmark_group(c, BenchmarkParameter::NoActiveSpan); + benchmark_group(c, BenchmarkParameter::WithActiveSpan); +} + +fn benchmark_group(c: &mut Criterion, p: BenchmarkParameter) { + let _guard = match p { + BenchmarkParameter::NoActiveSpan => None, + BenchmarkParameter::WithActiveSpan => { + let (provider, tracer) = tracer(); + let guard = Context::current_with_span(tracer.start("span")).attach(); + Some((guard, provider)) + } + }; + + let mut group = c.benchmark_group("context"); + + group.bench_function(BenchmarkId::new("baseline current()", p), |b| { + b.iter(|| { + black_box(Context::current()); + }) + }); + + group.bench_function(BenchmarkId::new("current().has_active_span()", p), |b| { + b.iter(|| { + black_box(Context::current().has_active_span()); + }) + }); + + group.bench_function( + BenchmarkId::new("map_current(|cx| cx.has_active_span())", p), + |b| { + b.iter(|| { + black_box(Context::map_current(|cx| cx.has_active_span())); + }) + }, + ); + + group.finish(); +} + +#[derive(Copy, Clone)] +enum BenchmarkParameter { + NoActiveSpan, + WithActiveSpan, +} + +impl Display for BenchmarkParameter { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match *self { + BenchmarkParameter::NoActiveSpan => write!(f, "no-active-span"), + BenchmarkParameter::WithActiveSpan => write!(f, "with-active-span"), + } + } +} + +fn tracer() -> (sdktrace::TracerProvider, sdktrace::Tracer) { + let provider = sdktrace::TracerProvider::builder() + .with_config(sdktrace::config().with_sampler(sdktrace::Sampler::AlwaysOn)) + .with_simple_exporter(NoopExporter) + .build(); + let tracer = provider.tracer(module_path!()); + (provider, tracer) +} + +#[derive(Debug)] +struct NoopExporter; + +impl SpanExporter for NoopExporter { + fn export(&mut self, _spans: Vec) -> BoxFuture<'static, ExportResult> { + Box::pin(futures_util::future::ready(Ok(()))) + } +} + +criterion_group! { + name = benches; + config = Criterion::default().with_profiler(PProfProfiler::new(100, Output::Flamegraph(None))); + targets = criterion_benchmark +} +criterion_main!(benches); diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/benches/key_value_map.rs temporalio-1.3.0/vendor/opentelemetry_sdk/benches/key_value_map.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/benches/key_value_map.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/benches/key_value_map.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,208 @@ +use criterion::{ + black_box, criterion_group, criterion_main, BatchSize::SmallInput, BenchmarkId, Criterion, +}; +use indexmap::IndexMap; +use opentelemetry_api::{Key, KeyValue, Value}; +use opentelemetry_sdk::trace::EvictedHashMap; +use pprof::criterion::{Output, PProfProfiler}; +use std::iter::Iterator; + +fn criterion_benchmark(c: &mut Criterion) { + let cap = 32; + let input = [(2, 32, cap), (8, 32, cap), (32, 32, cap)]; + populate_benchmark(c, &input); + lookup_benchmark(c, &input); + populate_and_lookup_benchmark(c, &input); +} + +fn populate_benchmark(c: &mut Criterion, input: &[(usize, u32, usize)]) { + let mut group = c.benchmark_group("populate"); + for &(n, max, capacity) in input { + let parameter_string = format!("{n:02}/{max:02}/{capacity:02}"); + + group.bench_function( + BenchmarkId::new("EvictedHashMap", parameter_string.clone()), + |b| { + b.iter(|| populate_evicted_hashmap(n, max, capacity)); + }, + ); + group.bench_function( + BenchmarkId::new("IndexMap", parameter_string.clone()), + |b| { + b.iter(|| populate_indexmap(n, max, capacity)); + }, + ); + group.bench_function(BenchmarkId::new("TwoVecs", parameter_string.clone()), |b| { + b.iter(|| populate_twovecs(n, max, capacity)); + }); + group.bench_function(BenchmarkId::new("OneVec", parameter_string.clone()), |b| { + b.iter(|| populate_onevec(n, max, capacity)); + }); + } + group.finish(); +} + +fn lookup_benchmark(c: &mut Criterion, input: &[(usize, u32, usize)]) { + let mut group = c.benchmark_group("lookup"); + for &(n, max, capacity) in input { + let lookup_keys = &MAP_KEYS[n - 2..n]; + let parameter_string = format!("{n:02}/{max:02}/{capacity:02}"); + group.bench_function( + BenchmarkId::new("EvictedHashMap", parameter_string.clone()), + |b| { + b.iter_batched( + || populate_evicted_hashmap(n, max, capacity), + |map| lookup_evicted_hashmap(&map, lookup_keys), + SmallInput, + ); + }, + ); + group.bench_function( + BenchmarkId::new("IndexMap", parameter_string.clone()), + |b| { + b.iter_batched( + || populate_indexmap(n, max, capacity), + |map| lookup_indexmap(&map, lookup_keys), + SmallInput, + ); + }, + ); + group.bench_function(BenchmarkId::new("OneVec", parameter_string.clone()), |b| { + b.iter_batched( + || populate_onevec(n, max, capacity), + |vec| lookup_onevec(&vec, lookup_keys), + SmallInput, + ); + }); + group.bench_function(BenchmarkId::new("TwoVecs", parameter_string.clone()), |b| { + b.iter_batched( + || populate_twovecs(n, max, capacity), + |(keys, vals)| lookup_twovec(&keys, &vals, lookup_keys), + SmallInput, + ); + }); + } + group.finish(); +} + +fn populate_and_lookup_benchmark(c: &mut Criterion, input: &[(usize, u32, usize)]) { + let mut group = c.benchmark_group("populate_and_lookup"); + for &(n, max, capacity) in input { + let lookup_keys = &MAP_KEYS[n - 2..n]; + let parameter_string = format!("{n:02}/{max:02}/{capacity:02}"); + group.bench_function( + BenchmarkId::new("EvictedHashMap", parameter_string.clone()), + |b| { + b.iter(|| { + let map = populate_evicted_hashmap(n, max, capacity); + lookup_evicted_hashmap(&map, lookup_keys); + }); + }, + ); + group.bench_function( + BenchmarkId::new("IndexMap", parameter_string.clone()), + |b| { + b.iter(|| { + let map = populate_indexmap(n, max, capacity); + lookup_indexmap(&map, lookup_keys); + }); + }, + ); + group.bench_function(BenchmarkId::new("OneVec", parameter_string.clone()), |b| { + b.iter(|| { + let vec = populate_onevec(n, max, capacity); + lookup_onevec(&vec, lookup_keys); + }); + }); + group.bench_function(BenchmarkId::new("TwoVecs", parameter_string.clone()), |b| { + b.iter(|| { + let (keys, vals) = populate_twovecs(n, max, capacity); + lookup_twovec(&keys, &vals, lookup_keys); + }); + }); + } + group.finish(); +} + +fn populate_evicted_hashmap(n: usize, max: u32, capacity: usize) -> EvictedHashMap { + let mut map = EvictedHashMap::new(max, capacity); + for (idx, key) in MAP_KEYS.iter().enumerate().take(n) { + map.insert(KeyValue::new(*key, idx as i64)); + } + map +} + +fn lookup_evicted_hashmap(map: &EvictedHashMap, keys: &[&'static str]) { + for key in keys { + black_box(map.get(&Key::new(*key))); + } +} + +fn populate_indexmap(n: usize, max: u32, _capacity: usize) -> IndexMap { + let mut map = IndexMap::with_capacity(max as usize); + for (idx, key) in MAP_KEYS.iter().enumerate().take(n) { + map.insert(Key::new(*key), Value::I64(idx as i64)); + } + map +} + +fn lookup_indexmap(map: &IndexMap, keys: &[&'static str]) { + for key in keys { + black_box(map.get(&Key::new(*key))); + } +} + +fn populate_onevec(n: usize, max: u32, _capacity: usize) -> Vec<(Key, Value)> { + let mut tuples = Vec::with_capacity(max as usize); + for (idx, key) in MAP_KEYS.iter().enumerate().take(n) { + tuples.push((Key::new(*key), Value::I64(idx as i64))); + } + tuples +} + +fn lookup_onevec(vec: &[(Key, Value)], keys: &[&'static str]) { + for key in keys { + black_box( + vec.iter() + .position(|(k, _v)| *k == Key::new(*key)) + .map(|idx| vec.get(idx)), + ); + } +} + +fn populate_twovecs(n: usize, max: u32, _capacity: usize) -> (Vec, Vec) { + let mut keys = Vec::with_capacity(max as usize); + let mut vals = Vec::with_capacity(max as usize); + for (idx, key) in MAP_KEYS.iter().enumerate().take(n) { + keys.push(Key::new(*key)); + vals.push(Value::I64(idx as i64)); + } + (keys, vals) +} + +fn lookup_twovec(keys: &[Key], vals: &[Value], lookup_keys: &[&'static str]) { + for key in lookup_keys { + black_box( + keys.iter() + .position(|k| *k == Key::new(*key)) + .map(|idx| vals.get(idx)), + ); + } +} + +const MAP_KEYS: [&str; 64] = [ + "key.1", "key.2", "key.3", "key.4", "key.5", "key.6", "key.7", "key.8", "key.9", "key.10", + "key.11", "key.12", "key.13", "key.14", "key.15", "key.16", "key.17", "key.18", "key.19", + "key.20", "key.21", "key.22", "key.23", "key.24", "key.25", "key.26", "key.27", "key.28", + "key.29", "key.30", "key.31", "key.32", "key.33", "key.34", "key.35", "key.36", "key.37", + "key.38", "key.39", "key.40", "key.41", "key.42", "key.43", "key.44", "key.45", "key.46", + "key.47", "key.48", "key.49", "key.50", "key.51", "key.52", "key.53", "key.54", "key.55", + "key.56", "key.57", "key.58", "key.59", "key.60", "key.61", "key.62", "key.63", "key.64", +]; + +criterion_group! { + name = benches; + config = Criterion::default().with_profiler(PProfProfiler::new(100, Output::Flamegraph(None))); + targets = criterion_benchmark +} +criterion_main!(benches); diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/benches/metric.rs temporalio-1.3.0/vendor/opentelemetry_sdk/benches/metric.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/benches/metric.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/benches/metric.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,109 +1,437 @@ -use criterion::{ - criterion_group, criterion_main, measurement::Measurement, BenchmarkGroup, BenchmarkId, - Criterion, +use rand::Rng; +use std::sync::{Arc, Weak}; + +use criterion::{criterion_group, criterion_main, Bencher, Criterion}; +use opentelemetry_api::{ + metrics::{Counter, Histogram, MeterProvider as _, Result}, + Context, Key, KeyValue, }; -use opentelemetry_api::{metrics::Meter, Context, InstrumentationLibrary, Key, KeyValue}; use opentelemetry_sdk::{ - export::metrics::{AggregatorSelector, Processor}, metrics::{ - accumulator, - aggregators::{self, Aggregator}, - sdk_api::{wrap_meter_core, Descriptor}, + data::{ResourceMetrics, Temporality}, + new_view, + reader::{AggregationSelector, MetricProducer, MetricReader, TemporalitySelector}, + Aggregation, Instrument, InstrumentKind, ManualReader, MeterProvider, Pipeline, Stream, + View, }, + Resource, }; -use rand::{rngs, Rng}; -use std::cell::RefCell; -use std::sync::Arc; - -pub fn counters(c: &mut Criterion) { - let meter = build_meter(); - - let mut g = c.benchmark_group("Counter"); - let cx = Context::new(); - - // unbound u64 - let counter = meter.u64_counter("u64.sum").init(); - benchmark_unbound_metric("u64", &mut g, |attributes| counter.add(&cx, 1, attributes)); - - // unbound f64 - let counter = meter.f64_counter("f64.sum").init(); - benchmark_unbound_metric("f64", &mut g, |attributes| { - counter.add(&cx, 1.0, attributes) - }); - - g.finish(); -} - -fn benchmark_unbound_metric( - name: &str, - g: &mut BenchmarkGroup, - f: F, -) { - for (num, kvs) in [ - ("1", build_kv(1)), - ("2", build_kv(2)), - ("4", build_kv(4)), - ("8", build_kv(8)), - ("16", build_kv(16)), - ] - .iter() - { - g.bench_with_input(BenchmarkId::new(name, num), kvs, |b, kvs| b.iter(|| f(kvs))); + +#[derive(Clone, Debug)] +struct SharedReader(Arc); + +impl TemporalitySelector for SharedReader { + fn temporality(&self, kind: InstrumentKind) -> Temporality { + self.0.temporality(kind) } } -fn build_kv(n: u8) -> Vec { - let mut res = Vec::new(); - - CURRENT_RNG.with(|rng| { - let mut rng = rng.borrow_mut(); - for _ in 0..n { - let k = Key::new(format!("k_{}", rng.gen::() * 1_000_000_000.0)); - res.push(k.string(format!("v_{}", rng.gen::() * 1_000_000_000.0))); - } - }); +impl AggregationSelector for SharedReader { + fn aggregation(&self, kind: InstrumentKind) -> Aggregation { + self.0.aggregation(kind) + } +} + +impl MetricReader for SharedReader { + fn register_pipeline(&self, pipeline: Weak) { + self.0.register_pipeline(pipeline) + } + + fn register_producer(&self, producer: Box) { + self.0.register_producer(producer) + } + + fn collect(&self, rm: &mut ResourceMetrics) -> Result<()> { + self.0.collect(rm) + } + + fn force_flush(&self, cx: &Context) -> Result<()> { + self.0.force_flush(cx) + } - res + fn shutdown(&self) -> Result<()> { + self.0.shutdown() + } } -thread_local! { - static CURRENT_RNG: RefCell = RefCell::new(rngs::ThreadRng::default()); + +/// Configure delta temporality for all [InstrumentKind] +/// +/// [Temporality::Delta] will be used for all instrument kinds if this +/// [TemporalitySelector] is used. +#[derive(Clone, Default, Debug)] +pub struct DeltaTemporalitySelector { + pub(crate) _private: (), } -#[derive(Debug, Default)] -struct BenchAggregatorSelector; +impl DeltaTemporalitySelector { + /// Create a new default temporality selector. + pub fn new() -> Self { + Self::default() + } +} -impl AggregatorSelector for BenchAggregatorSelector { - fn aggregator_for(&self, descriptor: &Descriptor) -> Option> { - match descriptor.name() { - name if name.ends_with(".disabled") => None, - name if name.ends_with(".sum") => Some(Arc::new(aggregators::sum())), - name if name.ends_with(".lastvalue") => Some(Arc::new(aggregators::last_value())), - name if name.ends_with(".histogram") => Some(Arc::new(aggregators::histogram(&[]))), - _ => panic!( - "Invalid instrument name for test AggregatorSelector: {}", - descriptor.name() - ), - } +impl TemporalitySelector for DeltaTemporalitySelector { + fn temporality(&self, _kind: InstrumentKind) -> Temporality { + Temporality::Delta } } -#[derive(Debug, Default)] -struct BenchProcessor { - aggregation_selector: BenchAggregatorSelector, +// * Summary * + +// rustc 1.68.0 (2c8cc3432 2023-03-06) +// cargo 1.68.0 (115f34552 2023-02-26), OS=Windows 11 Enterprise +// Intel(R) Core(TM) i7-8850H CPU @ 2.60GHz 2.59 GHz +// 12 logical and 6 physical cores + +// Counter/AddNoAttrs time: [65.406 ns 65.535 ns 65.675 ns] +// Counter/AddNoAttrsDelta time: [65.553 ns 65.761 ns 65.981 ns] +// Counter/AddOneAttr time: [341.55 ns 344.40 ns 347.58 ns] +// Counter/AddOneAttrDelta time: [340.11 ns 342.42 ns 344.89 ns] +// Counter/AddThreeAttr time: [619.01 ns 624.16 ns 630.16 ns] +// Counter/AddThreeAttrDelta +// time: [606.71 ns 611.45 ns 616.66 ns] +// Counter/AddFiveAttr time: [3.7551 µs 3.7813 µs 3.8094 µs] +// Counter/AddFiveAttrDelta +// time: [3.7550 µs 3.7870 µs 3.8266 µs] +// Counter/AddTenAttr time: [4.7684 µs 4.7909 µs 4.8146 µs] +// Counter/AddTenAttrDelta time: [4.7682 µs 4.8152 µs 4.8722 µs] +// Counter/AddInvalidAttr time: [469.31 ns 472.97 ns 476.92 ns] +// Counter/AddSingleUseAttrs +// time: [749.15 ns 805.09 ns 868.03 ns] +// Counter/AddSingleUseInvalid +// time: [693.75 ns 702.65 ns 713.20 ns] +// Counter/AddSingleUseFiltered +// time: [677.00 ns 681.63 ns 686.88 ns] +// Counter/CollectOneAttr time: [659.29 ns 681.20 ns 708.04 ns] +// Counter/CollectTenAttrs time: [3.5048 µs 3.5384 µs 3.5777 µs] +// Histogram/Record0Attrs10bounds +// time: [75.790 ns 77.235 ns 78.825 ns] +// Histogram/Record3Attrs10bounds +// time: [580.88 ns 603.84 ns 628.71 ns] +// Histogram/Record5Attrs10bounds +// time: [3.8539 µs 3.8988 µs 3.9519 µs] +// Histogram/Record7Attrs10bounds +// time: [699.46 ns 720.17 ns 742.24 ns] +// Histogram/Record10Attrs10bounds +// time: [844.95 ns 861.92 ns 880.23 ns] +// Histogram/Record0Attrs49bounds +// time: [75.198 ns 77.081 ns 79.449 ns] +// Histogram/Record3Attrs49bounds +// time: [533.82 ns 540.44 ns 547.30 ns] +// Histogram/Record5Attrs49bounds +// time: [583.01 ns 588.27 ns 593.98 ns] +// Histogram/Record7Attrs49bounds +// time: [645.67 ns 652.03 ns 658.35 ns] +// Histogram/Record10Attrs49bounds +// time: [747.24 ns 755.42 ns 764.37 ns] +// Histogram/Record0Attrs50bounds +// time: [72.023 ns 72.218 ns 72.426 ns] +// Histogram/Record3Attrs50bounds +// time: [530.21 ns 534.23 ns 538.63 ns] +// Histogram/Record5Attrs50bounds +// time: [3.2934 µs 3.3069 µs 3.3228 µs] +// Histogram/Record7Attrs50bounds +// time: [633.88 ns 638.87 ns 644.52 ns] +// Histogram/Record10Attrs50bounds +// time: [759.69 ns 768.42 ns 778.12 ns] +// Histogram/Record0Attrs1000bounds +// time: [75.495 ns 75.942 ns 76.529 ns] +// Histogram/Record3Attrs1000bounds +// time: [542.06 ns 548.37 ns 555.31 ns] +// Histogram/Record5Attrs1000bounds +// time: [3.2935 µs 3.3058 µs 3.3215 µs] +// Histogram/Record7Attrs1000bounds +// time: [643.75 ns 649.05 ns 655.14 ns] +// Histogram/Record10Attrs1000bounds +// time: [726.87 ns 736.52 ns 747.09 ns] +fn bench_counter(view: Option>, temporality: &str) -> (SharedReader, Counter) { + let rdr = if temporality == "cumulative" { + SharedReader(Arc::new(ManualReader::builder().build())) + } else { + SharedReader(Arc::new( + ManualReader::builder() + .with_temporality_selector(DeltaTemporalitySelector::new()) + .build(), + )) + }; + let mut builder = MeterProvider::builder().with_reader(rdr.clone()); + if let Some(view) = view { + builder = builder.with_view(view); + } + let provider = builder.build(); + let cntr = provider.meter("test").u64_counter("hello").init(); + + (rdr, cntr) } -impl Processor for BenchProcessor { - fn aggregator_selector(&self) -> &dyn AggregatorSelector { - &self.aggregation_selector +fn counters(c: &mut Criterion) { + let (_, cntr) = bench_counter(None, "cumulative"); + let (_, cntr2) = bench_counter(None, "delta"); + let (_, cntr3) = bench_counter(None, "cumulative"); + + let mut group = c.benchmark_group("Counter"); + group.bench_function("AddNoAttrs", |b| b.iter(|| cntr.add(1, &[]))); + group.bench_function("AddNoAttrsDelta", |b| b.iter(|| cntr2.add(1, &[]))); + + group.bench_function("AddOneAttr", |b| { + b.iter(|| cntr.add(1, &[KeyValue::new("K", "V")])) + }); + group.bench_function("AddOneAttrDelta", |b| { + b.iter(|| cntr2.add(1, &[KeyValue::new("K1", "V1")])) + }); + group.bench_function("AddThreeAttr", |b| { + b.iter(|| { + cntr.add( + 1, + &[ + KeyValue::new("K2", "V2"), + KeyValue::new("K3", "V3"), + KeyValue::new("K4", "V4"), + ], + ) + }) + }); + group.bench_function("AddThreeAttrDelta", |b| { + b.iter(|| { + cntr2.add( + 1, + &[ + KeyValue::new("K2", "V2"), + KeyValue::new("K3", "V3"), + KeyValue::new("K4", "V4"), + ], + ) + }) + }); + group.bench_function("AddFiveAttr", |b| { + b.iter(|| { + cntr.add( + 1, + &[ + KeyValue::new("K5", "V5"), + KeyValue::new("K6", "V6"), + KeyValue::new("K7", "V7"), + KeyValue::new("K8", "V8"), + KeyValue::new("K9", "V9"), + ], + ) + }) + }); + group.bench_function("AddFiveAttrDelta", |b| { + b.iter(|| { + cntr2.add( + 1, + &[ + KeyValue::new("K5", "V5"), + KeyValue::new("K6", "V6"), + KeyValue::new("K7", "V7"), + KeyValue::new("K8", "V8"), + KeyValue::new("K9", "V9"), + ], + ) + }) + }); + group.bench_function("AddTenAttr", |b| { + b.iter(|| { + cntr.add( + 1, + &[ + KeyValue::new("K10", "V10"), + KeyValue::new("K11", "V11"), + KeyValue::new("K12", "V12"), + KeyValue::new("K13", "V13"), + KeyValue::new("K14", "V14"), + KeyValue::new("K15", "V15"), + KeyValue::new("K16", "V16"), + KeyValue::new("K17", "V17"), + KeyValue::new("K18", "V18"), + KeyValue::new("K19", "V19"), + ], + ) + }) + }); + group.bench_function("AddTenAttrDelta", |b| { + b.iter(|| { + cntr2.add( + 1, + &[ + KeyValue::new("K10", "V10"), + KeyValue::new("K11", "V11"), + KeyValue::new("K12", "V12"), + KeyValue::new("K13", "V13"), + KeyValue::new("K14", "V14"), + KeyValue::new("K15", "V15"), + KeyValue::new("K16", "V16"), + KeyValue::new("K17", "V17"), + KeyValue::new("K18", "V18"), + KeyValue::new("K19", "V19"), + ], + ) + }) + }); + + const MAX_DATA_POINTS: i64 = 2000; + let mut max_attributes: Vec = Vec::new(); + + for i in 0..MAX_DATA_POINTS - 2 { + max_attributes.push(KeyValue::new(i.to_string(), i)) + } + + group.bench_function("AddOneTillMaxAttr", |b| { + b.iter(|| cntr3.add(1, &max_attributes)) + }); + + for i in MAX_DATA_POINTS..MAX_DATA_POINTS * 2 { + max_attributes.push(KeyValue::new(i.to_string(), i)) + } + + group.bench_function("AddMaxAttr", |b| b.iter(|| cntr3.add(1, &max_attributes))); + + group.bench_function("AddInvalidAttr", |b| { + b.iter(|| cntr.add(1, &[KeyValue::new("", "V"), KeyValue::new("K", "V")])) + }); + group.bench_function("AddSingleUseAttrs", |b| { + let mut v = 0; + b.iter(|| { + cntr.add(1, &[KeyValue::new("K", v)]); + v += 1; + }) + }); + group.bench_function("AddSingleUseInvalid", |b| { + let mut v = 0; + b.iter(|| { + cntr.add(1, &[KeyValue::new("", v), KeyValue::new("K", v)]); + v += 1; + }) + }); + + let (_, cntr) = bench_counter( + Some( + new_view( + Instrument::new().name("*"), + Stream::new().allowed_attribute_keys([Key::new("K")]), + ) + .unwrap(), + ), + "cumulative", + ); + + group.bench_function("AddSingleUseFiltered", |b| { + let mut v = 0; + b.iter(|| { + cntr.add(1, &[KeyValue::new("L", v), KeyValue::new("K", v)]); + v += 1; + }) + }); + + let (rdr, cntr) = bench_counter(None, "cumulative"); + let mut rm = ResourceMetrics { + resource: Resource::empty(), + scope_metrics: Vec::new(), + }; + + group.bench_function("CollectOneAttr", |b| { + let mut v = 0; + b.iter(|| { + cntr.add(1, &[KeyValue::new("K", v)]); + let _ = rdr.collect(&mut rm); + v += 1; + }) + }); + + group.bench_function("CollectTenAttrs", |b| { + let mut v = 0; + b.iter(|| { + for i in 0..10 { + cntr.add(1, &[KeyValue::new("K", i)]); + } + let _ = rdr.collect(&mut rm); + v += 1; + }) + }); +} + +const MAX_BOUND: usize = 100000; + +fn bench_histogram(bound_count: usize) -> (SharedReader, Histogram) { + let mut bounds = vec![0; bound_count]; + #[allow(clippy::needless_range_loop)] + for i in 0..bounds.len() { + bounds[i] = i * MAX_BOUND / bound_count + } + let view = Some( + new_view( + Instrument::new().name("histogram_*"), + Stream::new().aggregation(Aggregation::ExplicitBucketHistogram { + boundaries: bounds.iter().map(|&x| x as f64).collect(), + record_min_max: true, + }), + ) + .unwrap(), + ); + + let r = SharedReader(Arc::new(ManualReader::default())); + let mut builder = MeterProvider::builder().with_reader(r.clone()); + if let Some(view) = view { + builder = builder.with_view(view); } + let mtr = builder.build().meter("test_meter"); + let hist = mtr + .i64_histogram(format!("histogram_{}", bound_count)) + .init(); + + (r, hist) } -fn build_meter() -> Meter { - let processor = Arc::new(BenchProcessor::default()); - let core = accumulator(processor); - let library = InstrumentationLibrary::new("benches", None, None); - wrap_meter_core(Arc::new(core), library) +fn histograms(c: &mut Criterion) { + let mut group = c.benchmark_group("Histogram"); + let mut rng = rand::thread_rng(); + + for bound_size in [10, 49, 50, 1000].iter() { + let (_, hist) = bench_histogram(*bound_size); + for attr_size in [0, 3, 5, 7, 10].iter() { + let mut attributes: Vec = Vec::new(); + for i in 0..*attr_size { + attributes.push(KeyValue::new( + format!("K,{},{}", bound_size, attr_size), + format!("V,{},{},{}", bound_size, attr_size, i), + )) + } + let value: i64 = rng.gen_range(0..MAX_BOUND).try_into().unwrap(); + group.bench_function( + format!("Record{}Attrs{}bounds", attr_size, bound_size), + |b| b.iter(|| hist.record(value, &attributes)), + ); + } + } + group.bench_function("CollectOne", |b| benchmark_collect_histogram(b, 1)); + group.bench_function("CollectFive", |b| benchmark_collect_histogram(b, 5)); + group.bench_function("CollectTen", |b| benchmark_collect_histogram(b, 10)); + group.bench_function("CollectTwentyFive", |b| benchmark_collect_histogram(b, 25)); +} + +fn benchmark_collect_histogram(b: &mut Bencher, n: usize) { + let r = SharedReader(Arc::new(ManualReader::default())); + let mtr = MeterProvider::builder() + .with_reader(r.clone()) + .build() + .meter("sdk/metric/bench/histogram"); + + for i in 0..n { + let h = mtr.i64_histogram(format!("fake_data_{i}")).init(); + h.record(1, &[]); + } + + let mut rm = ResourceMetrics { + resource: Resource::empty(), + scope_metrics: Vec::new(), + }; + + b.iter(|| { + let _ = r.collect(&mut rm); + assert_eq!(rm.scope_metrics[0].metrics.len(), n); + }) } -criterion_group!(benches, counters); +criterion_group!(benches, counters, histograms); criterion_main!(benches); diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/benches/span_builder.rs temporalio-1.3.0/vendor/opentelemetry_sdk/benches/span_builder.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/benches/span_builder.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/benches/span_builder.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,107 @@ +use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion}; +use futures_util::future::BoxFuture; +use opentelemetry_api::{ + trace::{OrderMap, Span, Tracer, TracerProvider}, + KeyValue, +}; +use opentelemetry_sdk::{ + export::trace::{ExportResult, SpanData, SpanExporter}, + trace as sdktrace, +}; +use pprof::criterion::{Output, PProfProfiler}; + +fn criterion_benchmark(c: &mut Criterion) { + span_builder_benchmark_group(c) +} + +fn span_builder_benchmark_group(c: &mut Criterion) { + let mut group = c.benchmark_group("span_builder"); + group.bench_function("simplest", |b| { + let (_provider, tracer) = not_sampled_provider(); + b.iter(|| { + let mut span = tracer.span_builder("span").start(&tracer); + span.end(); + }) + }); + group.bench_function(BenchmarkId::new("with_attributes", "1"), |b| { + let (_provider, tracer) = not_sampled_provider(); + b.iter(|| { + let mut span = tracer + .span_builder("span") + .with_attributes([KeyValue::new(MAP_KEYS[0], "value")]) + .start(&tracer); + span.end(); + }) + }); + group.bench_function(BenchmarkId::new("with_attributes", "4"), |b| { + let (_provider, tracer) = not_sampled_provider(); + b.iter(|| { + let mut span = tracer + .span_builder("span") + .with_attributes([ + KeyValue::new(MAP_KEYS[0], "value"), + KeyValue::new(MAP_KEYS[1], "value"), + KeyValue::new(MAP_KEYS[2], "value"), + KeyValue::new(MAP_KEYS[3], "value"), + ]) + .start(&tracer); + span.end(); + }) + }); + group.bench_function(BenchmarkId::new("with_attributes_map", "1"), |b| { + let (_provider, tracer) = not_sampled_provider(); + b.iter(|| { + let mut span = tracer + .span_builder("span") + .with_attributes_map(OrderMap::from_iter([KeyValue::new(MAP_KEYS[0], "value")])) + .start(&tracer); + span.end(); + }) + }); + group.bench_function(BenchmarkId::new("with_attributes_map", "4"), |b| { + let (_provider, tracer) = not_sampled_provider(); + b.iter(|| { + let mut span = tracer + .span_builder("span") + .with_attributes_map(OrderMap::from_iter([KeyValue::new(MAP_KEYS[0], "value")])) + .start(&tracer); + span.end(); + }) + }); + group.finish(); +} + +fn not_sampled_provider() -> (sdktrace::TracerProvider, sdktrace::Tracer) { + let provider = sdktrace::TracerProvider::builder() + .with_config(sdktrace::config().with_sampler(sdktrace::Sampler::AlwaysOff)) + .with_simple_exporter(NoopExporter) + .build(); + let tracer = provider.tracer("not-sampled"); + (provider, tracer) +} + +#[derive(Debug)] +struct NoopExporter; + +impl SpanExporter for NoopExporter { + fn export(&mut self, _spans: Vec) -> BoxFuture<'static, ExportResult> { + Box::pin(futures_util::future::ready(Ok(()))) + } +} + +const MAP_KEYS: [&str; 64] = [ + "key.1", "key.2", "key.3", "key.4", "key.5", "key.6", "key.7", "key.8", "key.9", "key.10", + "key.11", "key.12", "key.13", "key.14", "key.15", "key.16", "key.17", "key.18", "key.19", + "key.20", "key.21", "key.22", "key.23", "key.24", "key.25", "key.26", "key.27", "key.28", + "key.29", "key.30", "key.31", "key.32", "key.33", "key.34", "key.35", "key.36", "key.37", + "key.38", "key.39", "key.40", "key.41", "key.42", "key.43", "key.44", "key.45", "key.46", + "key.47", "key.48", "key.49", "key.50", "key.51", "key.52", "key.53", "key.54", "key.55", + "key.56", "key.57", "key.58", "key.59", "key.60", "key.61", "key.62", "key.63", "key.64", +]; + +criterion_group! { + name = benches; + config = Criterion::default().with_profiler(PProfProfiler::new(100, Output::Flamegraph(None))); + targets = criterion_benchmark +} +criterion_main!(benches); diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/benches/trace.rs temporalio-1.3.0/vendor/opentelemetry_sdk/benches/trace.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/benches/trace.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/benches/trace.rs 2023-10-30 19:40:00.000000000 +0000 @@ -2,29 +2,15 @@ use futures_util::future::BoxFuture; use opentelemetry_api::{ trace::{Span, Tracer, TracerProvider}, - Key, KeyValue, + Key, }; use opentelemetry_sdk::{ export::trace::{ExportResult, SpanData, SpanExporter}, trace as sdktrace, }; +use pprof::criterion::{Output, PProfProfiler}; fn criterion_benchmark(c: &mut Criterion) { - let mut group = c.benchmark_group("EvictedHashMap"); - group.bench_function("insert 1", |b| { - b.iter(|| insert_keys(sdktrace::EvictedHashMap::new(32, 1), 1)) - }); - group.bench_function("insert 5", |b| { - b.iter(|| insert_keys(sdktrace::EvictedHashMap::new(32, 5), 5)) - }); - group.bench_function("insert 10", |b| { - b.iter(|| insert_keys(sdktrace::EvictedHashMap::new(32, 10), 10)) - }); - group.bench_function("insert 20", |b| { - b.iter(|| insert_keys(sdktrace::EvictedHashMap::new(32, 20), 20)) - }); - group.finish(); - trace_benchmark_group(c, "start-end-span", |tracer| tracer.start("foo").end()); trace_benchmark_group(c, "start-end-span-4-attrs", |tracer| { @@ -69,35 +55,6 @@ }); } -const MAP_KEYS: [Key; 20] = [ - Key::from_static_str("key1"), - Key::from_static_str("key2"), - Key::from_static_str("key3"), - Key::from_static_str("key4"), - Key::from_static_str("key5"), - Key::from_static_str("key6"), - Key::from_static_str("key7"), - Key::from_static_str("key8"), - Key::from_static_str("key9"), - Key::from_static_str("key10"), - Key::from_static_str("key11"), - Key::from_static_str("key12"), - Key::from_static_str("key13"), - Key::from_static_str("key14"), - Key::from_static_str("key15"), - Key::from_static_str("key16"), - Key::from_static_str("key17"), - Key::from_static_str("key18"), - Key::from_static_str("key19"), - Key::from_static_str("key20"), -]; - -fn insert_keys(mut map: sdktrace::EvictedHashMap, n: usize) { - for (idx, key) in MAP_KEYS.iter().enumerate().take(n) { - map.insert(KeyValue::new(key.clone(), idx as i64)); - } -} - #[derive(Debug)] struct VoidExporter; @@ -132,5 +89,9 @@ group.finish(); } -criterion_group!(benches, criterion_benchmark); +criterion_group! { + name = benches; + config = Criterion::default().with_profiler(PProfProfiler::new(100, Output::Flamegraph(None))); + targets = criterion_benchmark +} criterion_main!(benches); diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/.cargo-checksum.json temporalio-1.3.0/vendor/opentelemetry_sdk/.cargo-checksum.json --- temporalio-1.3.0/vendor/opentelemetry_sdk/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"CHANGELOG.md":"ae427b95b54f7f5c6a6fd4aae16baf8f035cf9a2ce336836d9bada7d52d7e220","CODEOWNERS":"abc35dda6643aed84b16084b9dccfee77929c299d60d21b590bd5c8c3b54e508","Cargo.toml":"7f9fa5eaa3ea534ac3e3117f68fc2a7267749cca7fa11b4abb2df00ee0a5dcd4","LICENSE":"c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4","README.md":"2e2a29bc5f884f3823f4dba035577d254634298ab95a2802c602d6986f1d9fd8","benches/batch_span_processor.rs":"f763cf674347956627a4152b93d599dd71f0f8ad97824a3fbf9bc0e830f9d5d6","benches/metric.rs":"feb303fff36d9700fc931daa6b4357d8ecc917126a9165ac123e56cba5226abd","benches/trace.rs":"8411e1b16a51280f1584e16169047434433212db5f13f84423708224fa4f62ba","src/export/metrics/aggregation/mod.rs":"66ad4757d2f241e9db952b718d97650ec3989ffcee676de3c23b3200788c9069","src/export/metrics/aggregation/temporality.rs":"575af63683848aa985eaa94f754ff8b5b9065f5595baacaf289af4ab3879cbf8","src/export/metrics/mod.rs":"871445dc65446542f089d1ec6485c078c4e75ac4af16391d8d391d9dbca597b1","src/export/metrics/stdout.rs":"b59021b3965dce393fe33cd49e8219e70c50b0f1cfb4d9e1e7c7458676806bf2","src/export/mod.rs":"4445c51c4890cbd35fe9e940767b0ad4e5062a044793c71b8783d4696371ba6c","src/export/trace/mod.rs":"46318f4adab300fef121e940aa77461acfde24f9ddbec0aabacb02f982df31ea","src/export/trace/stdout.rs":"092ba4fcff0828d814a8252ceb2e668ff0769fff2b5c385c8ae99aecae2c574f","src/instrumentation.rs":"2d2e1f299f847e654e56900a8b162a476f453b88636b222d79c9730ca1a4ea81","src/lib.rs":"bff59e0fb32772b72dcfb66c90912f3d68c71cb4395a2fde1dc3cf8acfd77253","src/metrics/aggregators/ddsketch.rs":"f67ac1ca40cec2ae05482a6069d061aea6077c277b6d876e71db09ff223d4975","src/metrics/aggregators/histogram.rs":"f61ea030d5c4c0fb971729d076c008c8300e37bd7930870c4a0039868c5eb92a","src/metrics/aggregators/last_value.rs":"7e89765a23c90f23ad060fac01b110fc878dc32220833f0ddc1629c3bb2acae1","src/metrics/aggregators/mod.rs":"97f0eac577e8768db5405493c5f8e34db5efab125c97a003d95f0c2021cec90a","src/metrics/aggregators/sum.rs":"b4a473545b801fc3034d165dc7fc078d745884ab839319a9e76fd9f5c1d64e3e","src/metrics/controllers/basic.rs":"581b9729df6b9d78c176560712263d1c9752925f5d3a3565f7db2ed14d59af4c","src/metrics/controllers/mod.rs":"52437be41bf39220354328becc2d2d97e36ec7b01125813af14b861b89166d09","src/metrics/controllers/push.rs":"7fafe8d18e2254ec6277de70c4518ade1cbb93662ae84ef0ffae865f8cc3dd2a","src/metrics/mod.rs":"26fccc7f21079d177dfe8075ef3d269b510627069cd18a7b00963a9c05db2fad","src/metrics/processors/basic.rs":"ea4ac4fbc53e7da1ce0aba9e2719e81adb2e144ec28a4f72098dd2a81f80fc23","src/metrics/processors/mod.rs":"0bc0b468dd3b9c45983d2dff872a3e68c8b927bc9f0a8810ab56e8c3470515a1","src/metrics/registry.rs":"6581e6efb2e228883583c0e302f2688a48b9280978431d9d97ea880cbeddd1fc","src/metrics/sdk_api/async_instrument.rs":"fa6dbcee3bc0d3372fbdfb0005696534074b2c20982d18a00a8f5c117f3ffcf8","src/metrics/sdk_api/descriptor.rs":"2aed27c38cd844b1c6dafed413c28a16808d65242a40a7c60e72d29dc9fe9f92","src/metrics/sdk_api/instrument_kind.rs":"2832b4d92e27d3384ebec215af9161491e914462219cae29a4aa4e8cab43dd51","src/metrics/sdk_api/mod.rs":"01070720a64cc5fec3041e11ddad9924510d4332e4b900a7ea96a0ecbb386961","src/metrics/sdk_api/number.rs":"e52a9748a159feee3aca965ae9639425b487e111070fb4436d1eb43578c9af38","src/metrics/sdk_api/sync_instrument.rs":"552af47a8c0f0533b4e843c19929c0cec34aae60bbe966dd0c94a07c27779ef0","src/metrics/sdk_api/wrap.rs":"a713ef5f893af6e921ee67980d67ee0e811118f983393eecef9559970cdb43f3","src/metrics/selectors/mod.rs":"7ba22659cd0a4cc8a64f277a7611b6db4c238cbd67e27b220f18605250dcb811","src/metrics/selectors/simple.rs":"b6213ab79dce2461634d6bc81a897a9b960fc9bfdc488f25d497fbff63032218","src/propagation/baggage.rs":"b4c70e70dfdb2f167c3d516a412fb4ff5535d1c7b22cfb749d8edfd8b4c9cdb8","src/propagation/composite.rs":"2a490160c1805ffb2a40005ca91129e8b1233aa800e94893a9141c117bc84604","src/propagation/mod.rs":"2b7ae5c0545d53216352d6ab27af47deae633608374d15ee7fc9fbededca7688","src/propagation/trace_context.rs":"5d03f8ddb8d824e448fcf39c1e8100bd6c9bfdbda8f7f4531f7110800b00e1d4","src/resource/env.rs":"5e6b9acb2f74f88e718a8bc896a8a6ec0b25f298bcec679024f1684f9b8999ba","src/resource/mod.rs":"67c88d4ce34c6c341fdd919c964134930ce415c353b16428646f8d9fb336f39f","src/resource/os.rs":"1feafedf205d0414f99433fda5e735ec6c40d98bef4bdfe2e7b9154818474255","src/resource/process.rs":"0c961699c8c2ea8e1f704fba1b7addf4e59e3113d4f3e464d48c88e26898858e","src/runtime.rs":"349d3c6afc35d802644f94738ba869fb8812c6a7df177aa3537c5e2d649823f4","src/testing/metric.rs":"840f60ba4c31bdc83b4764d1033eb41c23b134377a490025e254fb0f10f7d408","src/testing/mod.rs":"32a0ae5096880522e5802ae30cc18cd354a9f111ddab9aecfbaff175a55058d6","src/testing/trace.rs":"43c4f80e9ff0634e02829fdd093fafcb44ce3cdc2693a6c2311bc31856bb87b2","src/trace/config.rs":"156700ef70775132d23c3d7fde4fb98ac98545238b83d8d0355ba53b0d18890b","src/trace/evicted_hash_map.rs":"ad922b228135af375436c70f69c806eefc1917a9a7658479d73c9b5a803ef3d7","src/trace/evicted_queue.rs":"b5b887c46431bbe41eb35df2af32c8033ab51c2ebe86100be93622a82172933c","src/trace/id_generator/aws.rs":"483fb5a6987994ef80a6ffce697b912eeba791825872ef78597fbb56db666cce","src/trace/id_generator/mod.rs":"a894c93c5fdd1dd9e7ce4909889ed4e979cc5b64ee671ce5007cf74d35851aed","src/trace/mod.rs":"0149f7cd3391601c0f664fbb344cba87e5d0687acc4a83b17d51519ba603dbb7","src/trace/provider.rs":"3526bae5d868050c04958cb9f014627344d222f474936606ec265c35d9d6f0f3","src/trace/runtime.rs":"e9b9c0d38fa52be84e7f87236e96918f16855e6d0a1fc68bb459cd2325c0c707","src/trace/sampler.rs":"cd3674f1f603679cb1316696475b31ea77b3959c810714621f0004733120466c","src/trace/sampler/jaeger_remote/mod.rs":"1ce10ff2dc94b5f77b957e10d5cd236a9a2aca7cb9eae43357b1e7f6a939d087","src/trace/sampler/jaeger_remote/rate_limit.rs":"2d3f194212b59247d9e850d72ef77dcd93f3a868b48c4690e14f13a96da8fc77","src/trace/sampler/jaeger_remote/remote.rs":"48bffe52893439647d82689cab21a4e19244639ae63e7b958dafd22d348916f4","src/trace/sampler/jaeger_remote/sampler.rs":"448efea6a2d2c246af63a25415a6dab6b4b6fdd17f7c00adc9a1864d04b68414","src/trace/sampler/jaeger_remote/sampling_strategy.rs":"22b8ffd478d1ef3d5590802a30b0bcc8428d9d91d4e5f56d7c8e7bfdb6a351d1","src/trace/span.rs":"6ceb1247d46b31b05a6eeb3725886ac7f83960ab92db2a573862e079eb42fdd4","src/trace/span_limit.rs":"c02211f141f2518f223e4648695a31a6896d4ddaf408955de344ca7572ccadef","src/trace/span_processor.rs":"30f2510b406588bbf46e6b1d3f4c756c67871795bf2ad294df264dfb1ff6e9dd","src/trace/tracer.rs":"b87e6688aed18a0f5478c359790afcd49bf6b0906e4e46b28b20774e3f1cb991","src/util.rs":"63c41e142a24fb7c04b8a7a1ebc546a331ce3f7515e9dd78932c7c7edc8f00c7"},"package":"1ca41c4933371b61c2a2f214bf16931499af4ec90543604ec828f7a625c09113"} \ No newline at end of file +{"files":{"CHANGELOG.md":"15f07d42929dfcadce7f00931a3e93b7e13ec7ae4693c8c4aea48a15b5fe5f1f","CODEOWNERS":"abc35dda6643aed84b16084b9dccfee77929c299d60d21b590bd5c8c3b54e508","Cargo.toml":"b5b06633216fa087a0493d9b2bb456d7e73f63e789a9778b227cb504016cd714","LICENSE":"208a3f5bae3355bd4f3f45626d1ea4518b253d618ee2896983436075c4375098","README.md":"7e1b8a84968874d31c471b02724284aaf004e82ce57e50fd2e36d0279337b4a3","benches/batch_span_processor.rs":"4da537267d8412c4e6e72e0f8b5706b79aedabdcf174beeefeb5aa751043a2f5","benches/context.rs":"4c8fdd38939c020e14007dac5ab9fe720d9646a33ad311ee2984c50650c6a5f8","benches/key_value_map.rs":"8d8b17b37ec86de39950c1a915b3aa4a307deeceaccd7aa6f7399ac7f4c67c0f","benches/metric.rs":"dbe58bd0d54cca4f099d15a3f0293507607e75d50c30c6df57a1b4b8f327394e","benches/span_builder.rs":"96f6fa7d5e6ba2203b8ac6f9e5edb71254e52e0846b8117c9065ecdce753f91a","benches/trace.rs":"6748b13da2b78949d40fd89980180e8d95690be82e2ef72b649e6ca59b44cf53","src/attributes/mod.rs":"018cb10cbd2b9df0d3f03ac3397415bf76458e71c36b803788909835442ab3b7","src/attributes/set.rs":"70f6d1c4ccc5b2e496427ee1bcdb11af98a59a6fae8ee27b22e5ca7190e9523a","src/export/logs/mod.rs":"1f670484da3f0c16e9ba4bdb61b0b4c98937891a63e0948ef713ef9023bb8324","src/export/mod.rs":"585e009baa56c36517fb6b466d4faef2948e5554144c999ab522ce8554475831","src/export/trace.rs":"5d0ea31a3f3b670d6cbc8068c3d7823ea19b72b8e830520915bb69e2e8b4106d","src/instrumentation.rs":"e516d89347c0224834527490be0c159b5d6e8ed715dbd133ed21661f9c88d36a","src/lib.rs":"89de961209daf98c5d9fd382bde1291831b980ee23999f7e1b2e0a2328d83ef1","src/logs/config.rs":"09578dce9525187b45d02fbe1ed202c04417d93058ad66985de85b3fb6f7ee48","src/logs/log_emitter.rs":"357e5047cda30a20de9f37a6b685336132fe6ff41e3bb7c3dfd8d627a2e991f6","src/logs/log_processor.rs":"b6522b1a09cdfaf0a26958e210b0f12c8e9e4516c60956a72ae0a33ebf965e97","src/logs/mod.rs":"6ea0532942b91ad5de38ce2139e7e1ebd50ba8f3e7a4050159a93cd0ab9a0742","src/metrics/aggregation.rs":"1628ebffdd067c84e1f8812845421e2eb072ecdb4a2e2191cfa98f16172bce99","src/metrics/data/mod.rs":"badd3162c507accc322af3ddbd3ec5de4158b2a814ead0a93bde01f3fa3f4051","src/metrics/data/temporality.rs":"51f62b4df37f0b03c1e19130a649d6e5147decaa7123e8c282d53e67babdab45","src/metrics/exporter.rs":"895bf6d96e68de89f62174036baf1fec8949568a5268c12739def25c01b643e2","src/metrics/instrument.rs":"562a257b8d09ab86c51cda2f9307c285bb9c2a01cd805e66f0b65bbe0e2f660f","src/metrics/internal/aggregator.rs":"a05e94b799f4823b2a199c994e32c99b1183946beea6f8fd0585d71ba8255aad","src/metrics/internal/filter.rs":"b6c40a11f4198aef72d46d6697f10a6bc02c9fbbabe25dd227d20ce8e1d5cdcc","src/metrics/internal/histogram.rs":"c16726d0218a027ef9e5b66329e7866cec42a271e73c513726faaace6194a188","src/metrics/internal/last_value.rs":"c9571b502d3ca92b74f33421d556c32cfdbb665369e297fddce13a1f80d062be","src/metrics/internal/mod.rs":"c16e1511caa2b88c0f7198217bb28c12f2ae88773d4cdad1fd8000ca0d716414","src/metrics/internal/sum.rs":"5c9fb584b0ce50d259882244e53fa017603b24965f02058186f8f141a1d59996","src/metrics/manual_reader.rs":"c63b6d29639f0f3c3238eff1b92ce377b8ca9e1ec0a2f715275b88112fed9756","src/metrics/meter.rs":"dd2afe86e4d6264b1cfbb41f2dcad94700b5e108671d7803766d744b605556f1","src/metrics/meter_provider.rs":"e7dc69a7b6a40c3a3e27c7589ef992168df70e83823c2b18c24ae49ac3217149","src/metrics/mod.rs":"165dced90f18100587547b5878f8eb46db9d9d9072f82efe27bf2fc296fc901c","src/metrics/periodic_reader.rs":"1ed94a73c21ae82f80cb88beed5bd0e9c2fe39df4875c299fefa48bea8ccaedb","src/metrics/pipeline.rs":"41d6717b187fd2a5ffcc53c312dc6b313d2b59975395c51fb19e844299e24cd5","src/metrics/reader.rs":"6c4e867353451fc6f66878cc6dc9c47a05e6f98c7e2ed1412e7af96f4279b761","src/metrics/view.rs":"50bca5775b4a9a16048dc95d73f0db43e1675c9d9b371b2313b57945e1b5a442","src/propagation/baggage.rs":"b4c70e70dfdb2f167c3d516a412fb4ff5535d1c7b22cfb749d8edfd8b4c9cdb8","src/propagation/composite.rs":"2a490160c1805ffb2a40005ca91129e8b1233aa800e94893a9141c117bc84604","src/propagation/mod.rs":"2b7ae5c0545d53216352d6ab27af47deae633608374d15ee7fc9fbededca7688","src/propagation/trace_context.rs":"9ce35c38e8f3e86c9eb00423e99ef58ceaebb5a1d762dc052e092935dc181a60","src/resource/env.rs":"891bc07798eeefee9bccb9f25862b59445b1648a6780218edbc1969e86925777","src/resource/mod.rs":"0490e9a4e3783e04ce35e41809bc258bee3ab10f1cb25b3a1b9afc78dc2746ff","src/resource/os.rs":"1feafedf205d0414f99433fda5e735ec6c40d98bef4bdfe2e7b9154818474255","src/resource/process.rs":"0c961699c8c2ea8e1f704fba1b7addf4e59e3113d4f3e464d48c88e26898858e","src/resource/telemetry.rs":"35c74794be3f16877668f2048e40d6334baf6bbc416a4a045cef17c747442605","src/runtime.rs":"5d91457bcdbd37fb4bf501aa648bf660ede9c6a1ef23237f25b232f756dc3027","src/testing/metrics/in_memory_exporter.rs":"ffb5e7653b49391f67d74d4eb6b15199e8d5705c3c6425bbfc82d2f0bf4fcb9a","src/testing/metrics/mod.rs":"f48100ed5b70a8fc1ff5595be7f3d9c142d74fe2787861387628879cb74485e3","src/testing/mod.rs":"d7ae6baf1d266e1f74b7442839614828a73c8b060440978857b5d41ffc5b5e3f","src/testing/trace.rs":"df151c29ce4f5497971dc200d4a747724b879cfb5184456396959b6f671272d7","src/trace/config.rs":"d40d1d555ca3c592a4f5fa7fe3fb5b0d40155e8c2df119906b5b9aee0de57518","src/trace/evicted_hash_map.rs":"ad922b228135af375436c70f69c806eefc1917a9a7658479d73c9b5a803ef3d7","src/trace/evicted_queue.rs":"84041c667af2744ce51a2e6d500af2e394e558923cb1ac0d9e0b775af90535f6","src/trace/id_generator/aws.rs":"483fb5a6987994ef80a6ffce697b912eeba791825872ef78597fbb56db666cce","src/trace/id_generator/mod.rs":"0a51641eaee62a7cb1a46e508f28dd6c1b819072507df609f9128926f483bd6f","src/trace/mod.rs":"42d76e9638f65fc2d31b587d33cb653ec240193420982cdd01a6008f15dc5d2e","src/trace/provider.rs":"de0350d8ccffe8645c4e2b361444f55a2483aa04169a9aa6becc914758b9f48b","src/trace/runtime_tests.rs":"311a86d380ca402301179f203e41b314233cc0d8dca288d0a4289d80d0d6d98a","src/trace/sampler.rs":"c5eb0c7c35da401f61b15390a9857d42a5efde31005a14dbbd77d8bce2eb6d57","src/trace/sampler/jaeger_remote/mod.rs":"c02cb5a9f39b8d49643f6344f413d19e2feeba347675c5f02b659196466a144b","src/trace/sampler/jaeger_remote/rate_limit.rs":"2d3f194212b59247d9e850d72ef77dcd93f3a868b48c4690e14f13a96da8fc77","src/trace/sampler/jaeger_remote/remote.rs":"48bffe52893439647d82689cab21a4e19244639ae63e7b958dafd22d348916f4","src/trace/sampler/jaeger_remote/sampler.rs":"169c541fe51b0fc59a0b051ff1561280ca4517231f309346cde6d0ae291b2496","src/trace/sampler/jaeger_remote/sampling_strategy.rs":"7ca3c7d0296bdcc64ad277f5a00cb8abb77ae1141d96a7624f9863448d8975e2","src/trace/span.rs":"6ceb1247d46b31b05a6eeb3725886ac7f83960ab92db2a573862e079eb42fdd4","src/trace/span_limit.rs":"c02211f141f2518f223e4648695a31a6896d4ddaf408955de344ca7572ccadef","src/trace/span_processor.rs":"6838cdaeb65d5d3c6f1ed3c9fe54802ab892a015e4f12a1ec8b400530bc76c29","src/trace/tracer.rs":"7fc474ba18be162ba6a9ca43e5bd9280411a123689ed870017689d293a8ee3dd","src/util.rs":"63c41e142a24fb7c04b8a7a1ebc546a331ce3f7515e9dd78932c7c7edc8f00c7"},"package":"fa8e705a0612d48139799fcbaba0d4a90f06277153e43dd2bdc16c6f0edd8026"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/Cargo.toml temporalio-1.3.0/vendor/opentelemetry_sdk/Cargo.toml --- temporalio-1.3.0/vendor/opentelemetry_sdk/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -11,14 +11,15 @@ [package] edition = "2021" -rust-version = "1.56" +rust-version = "1.60" name = "opentelemetry_sdk" -version = "0.18.0" +version = "0.20.0" description = "The SDK for the OpenTelemetry metrics collection and distributed tracing framework" homepage = "https://github.com/open-telemetry/opentelemetry-rust" readme = "README.md" license = "Apache-2.0" repository = "https://github.com/open-telemetry/opentelemetry-rust" +resolver = "1" [package.metadata.docs.rs] all-features = true @@ -28,6 +29,18 @@ ] [[bench]] +name = "context" +harness = false + +[[bench]] +name = "key_value_map" +harness = false + +[[bench]] +name = "span_builder" +harness = false + +[[bench]] name = "trace" harness = false @@ -57,14 +70,6 @@ version = "0.5" optional = true -[dependencies.dashmap] -version = "5.1.0" -optional = true - -[dependencies.fnv] -version = "1.0" -optional = true - [dependencies.futures-channel] version = "0.3" @@ -88,11 +93,14 @@ version = "1.10" [dependencies.opentelemetry-http] -version = "0.7.0" +version = "0.9" optional = true [dependencies.opentelemetry_api] -version = "0.18" +version = "0.20" + +[dependencies.ordered-float] +version = "3.4.0" [dependencies.percent-encoding] version = "2.0" @@ -107,6 +115,10 @@ optional = true default-features = false +[dependencies.regex] +version = "1.0" +optional = true + [dependencies.serde] version = "1.0" features = [ @@ -139,14 +151,19 @@ version = "2.2" optional = true -[dev-dependencies.bincode] -version = "1.2" - [dev-dependencies.criterion] -version = "0.3.1" +version = "0.5" +features = ["html_reports"] -[dev-dependencies.rand_distr] -version = "0.4.0" +[dev-dependencies.indexmap] +version = "1.8" + +[dev-dependencies.pprof] +version = "0.12" +features = [ + "flamegraph", + "criterion", +] [features] default = ["trace"] @@ -158,10 +175,20 @@ "serde_json", "url", ] +logs = [ + "opentelemetry_api/logs", + "crossbeam-channel", + "async-trait", + "serde_json", +] +logs_level_enabled = [ + "logs", + "opentelemetry_api/logs_level_enabled", +] metrics = [ "opentelemetry_api/metrics", - "dashmap", - "fnv", + "regex", + "async-trait", ] rt-async-std = ["async-std"] rt-tokio = [ @@ -176,6 +203,7 @@ "opentelemetry_api/testing", "trace", "metrics", + "logs", "rt-async-std", "rt-tokio", "rt-tokio-current-thread", diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/CHANGELOG.md temporalio-1.3.0/vendor/opentelemetry_sdk/CHANGELOG.md --- temporalio-1.3.0/vendor/opentelemetry_sdk/CHANGELOG.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/CHANGELOG.md 2023-10-30 19:40:00.000000000 +0000 @@ -1,5 +1,65 @@ # Changelog +## v0.20.0 + +### Added + +- Implement cardinality limits for metric streams + [#1066](https://github.com/open-telemetry/opentelemetry-rust/pull/1066). +- Propagate shutdown calls from `PeriodicReader` to metrics exporter + [#1138](https://github.com/open-telemetry/opentelemetry-rust/pull/1138). +- Add in memory metrics exporter #1017 + +### Changed + +- New metrics SDK #1000 +- Use `Cow<'static, str>` instead of `&'static str` #1018 +- Unify trace and logs runtime extensions traits. #1067 + +### Changed + +- Fix EvictedQueue bug when capacity is set to 0 + [#1151](https://github.com/open-telemetry/opentelemetry-rust/pull/1151). + +### Removed + +- Samplers no longer has access to `InstrumentationLibrary` as one of parameters + to `should_sample`. + [#1041](https://github.com/open-telemetry/opentelemetry-rust/pull/1041). +- Synchronous instruments no longer accepts `Context` while reporting + measurements. [#1076](https://github.com/open-telemetry/opentelemetry-rust/pull/1076). +- Don't use CARGO_BIN_NAME for service name #1150 + +### Fixed + +- Wait for exports on the simple span processor's ForceFlush #1030 + +## v0.19.0 + +### Added +- Add instrument validation to `InstrumentBuilder` [#884](https://github.com/open-telemetry/opentelemetry-rust/pull/884). +- Add `TelemetryResourceDetector` [#899](https://github.com/open-telemetry/opentelemetry-rust/pull/899). +- Add support for instrumentation scope attributes [#1021](https://github.com/open-telemetry/opentelemetry-rust/pull/1021). + +### Changed +- Update to `opentelemetry_api` v0.19. +- Update to `opentelemetry_http` v0.8. +- Bump MSRV to 1.57 [#953](https://github.com/open-telemetry/opentelemetry-rust/pull/953). +- Fix doc in `ShouldSample` trait [#951](https://github.com/open-telemetry/opentelemetry-rust/pull/951) +- Only run `ParentBased` delegate sampler when there is no parent [#948](https://github.com/open-telemetry/opentelemetry-rust/pull/948). +- Improve `SdkProvidedResourceDetector`'s doc [#964](https://github.com/open-telemetry/opentelemetry-rust/pull/964). +- Update dependencies and bump MSRV to 1.60 [#969](https://github.com/open-telemetry/opentelemetry-rust/pull/969). +- Use CARGO_BIN_NAME as default service name [#991](https://github.com/open-telemetry/opentelemetry-rust/pull/991). + +### Removed +- Remove `in_memory` settings [#946](https://github.com/open-telemetry/opentelemetry-rust/pull/946). + +## main + +### Changed + +- Update the Number in the SDK API to support min and max. #989 + ## v0.18.0 ### Changed diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/LICENSE temporalio-1.3.0/vendor/opentelemetry_sdk/LICENSE --- temporalio-1.3.0/vendor/opentelemetry_sdk/LICENSE 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/LICENSE 2023-10-30 19:40:00.000000000 +0000 @@ -186,7 +186,7 @@ same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright [yyyy] [name of copyright owner] + Copyright 2023 The OpenTelemetry Authors Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/README.md temporalio-1.3.0/vendor/opentelemetry_sdk/README.md --- temporalio-1.3.0/vendor/opentelemetry_sdk/README.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/README.md 2023-10-30 19:40:00.000000000 +0000 @@ -11,11 +11,7 @@ [![LICENSE](https://img.shields.io/crates/l/opentelemetry_sdk)](./LICENSE) [![GitHub Actions CI](https://github.com/open-telemetry/opentelemetry-rust/workflows/CI/badge.svg)](https://github.com/open-telemetry/opentelemetry-rust/actions?query=workflow%3ACI+branch%3Amain) [![codecov](https://codecov.io/gh/open-telemetry/opentelemetry-rust/branch/main/graph/badge.svg)](https://codecov.io/gh/open-telemetry/opentelemetry-rust) -[![Gitter chat](https://img.shields.io/badge/gitter-join%20chat%20%E2%86%92-brightgreen.svg)](https://gitter.im/open-telemetry/opentelemetry-rust) - -[Website](https://opentelemetry.io/) | -[Chat](https://gitter.im/open-telemetry/opentelemetry-rust) | -[Documentation](https://docs.rs/opentelemetry-rust) +[![Slack](https://img.shields.io/badge/slack-@cncf/otel/rust-brightgreen.svg?logo=slack)](https://cloud-native.slack.com/archives/C03GDP0H023) ## Overview @@ -25,8 +21,16 @@ can export and analyze them using [Prometheus], [Jaeger], and other observability tools. -*Compiler support: [requires `rustc` 1.56+][msrv]* +*Compiler support: [requires `rustc` 1.60+][msrv]* [Prometheus]: https://prometheus.io [Jaeger]: https://www.jaegertracing.io [msrv]: #supported-rust-versions + +## OpenTelemetry Benchmarks + +From the root folder, run the following command: + +```sh +cargo bench +``` diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/attributes/mod.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/attributes/mod.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/attributes/mod.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/attributes/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,3 @@ +mod set; + +pub use set::AttributeSet; diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/attributes/set.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/attributes/set.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/attributes/set.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/attributes/set.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,164 @@ +use std::{ + cmp::Ordering, + collections::{BTreeSet, HashSet}, + hash::{Hash, Hasher}, +}; + +use opentelemetry_api::{Array, Key, KeyValue, Value}; +use ordered_float::OrderedFloat; + +use crate::Resource; + +#[derive(Clone, Debug)] +struct HashKeyValue(KeyValue); + +impl Hash for HashKeyValue { + fn hash(&self, state: &mut H) { + self.0.key.hash(state); + match &self.0.value { + Value::F64(f) => OrderedFloat(*f).hash(state), + Value::Array(a) => match a { + Array::Bool(b) => b.hash(state), + Array::I64(i) => i.hash(state), + Array::F64(f) => f.iter().for_each(|f| OrderedFloat(*f).hash(state)), + Array::String(s) => s.hash(state), + }, + Value::Bool(b) => b.hash(state), + Value::I64(i) => i.hash(state), + Value::String(s) => s.hash(state), + }; + } +} + +impl PartialOrd for HashKeyValue { + fn partial_cmp(&self, other: &Self) -> Option { + Some(self.cmp(other)) + } +} + +impl Ord for HashKeyValue { + fn cmp(&self, other: &Self) -> Ordering { + match self.0.key.cmp(&other.0.key) { + Ordering::Equal => match type_order(&self.0.value).cmp(&type_order(&other.0.value)) { + Ordering::Equal => match (&self.0.value, &other.0.value) { + (Value::F64(f), Value::F64(of)) => OrderedFloat(*f).cmp(&OrderedFloat(*of)), + (Value::Array(Array::Bool(b)), Value::Array(Array::Bool(ob))) => b.cmp(ob), + (Value::Array(Array::I64(i)), Value::Array(Array::I64(oi))) => i.cmp(oi), + (Value::Array(Array::String(s)), Value::Array(Array::String(os))) => s.cmp(os), + (Value::Array(Array::F64(f)), Value::Array(Array::F64(of))) => { + match f.len().cmp(&of.len()) { + Ordering::Equal => f + .iter() + .map(|x| OrderedFloat(*x)) + .collect::>() + .cmp(&of.iter().map(|x| OrderedFloat(*x)).collect()), + other => other, + } + } + (Value::Bool(b), Value::Bool(ob)) => b.cmp(ob), + (Value::I64(i), Value::I64(oi)) => i.cmp(oi), + (Value::String(s), Value::String(os)) => s.cmp(os), + _ => Ordering::Equal, + }, + other => other, // 2nd order by value types + }, + other => other, // 1st order by key + } + } +} + +fn type_order(v: &Value) -> u8 { + match v { + Value::Bool(_) => 1, + Value::I64(_) => 2, + Value::F64(_) => 3, + Value::String(_) => 4, + Value::Array(a) => match a { + Array::Bool(_) => 5, + Array::I64(_) => 6, + Array::F64(_) => 7, + Array::String(_) => 8, + }, + } +} + +impl PartialEq for HashKeyValue { + fn eq(&self, other: &Self) -> bool { + self.0.key == other.0.key + && match (&self.0.value, &other.0.value) { + (Value::F64(f), Value::F64(of)) => OrderedFloat(*f).eq(&OrderedFloat(*of)), + (Value::Array(Array::F64(f)), Value::Array(Array::F64(of))) => { + f.len() == of.len() + && f.iter() + .zip(of.iter()) + .all(|(f, of)| OrderedFloat(*f).eq(&OrderedFloat(*of))) + } + (non_float, other_non_float) => non_float.eq(other_non_float), + } + } +} + +impl Eq for HashKeyValue {} + +/// A unique set of attributes that can be used as instrument identifiers. +/// +/// This must implement [Hash], [PartialEq], and [Eq] so it may be used as +/// HashMap keys and other de-duplication methods. +#[derive(Clone, Debug, Hash, PartialEq, Eq)] +pub struct AttributeSet(BTreeSet); + +impl From<&[KeyValue]> for AttributeSet { + fn from(values: &[KeyValue]) -> Self { + let mut seen = HashSet::with_capacity(values.len()); + AttributeSet( + values + .iter() + .rev() + .filter_map(|kv| { + if seen.contains(&&kv.key) { + None + } else { + seen.insert(&kv.key); + Some(HashKeyValue(kv.clone())) + } + }) + .collect(), + ) + } +} + +impl From<&Resource> for AttributeSet { + fn from(values: &Resource) -> Self { + AttributeSet( + values + .iter() + .map(|(key, value)| HashKeyValue(KeyValue::new(key.clone(), value.clone()))) + .collect(), + ) + } +} + +impl AttributeSet { + /// Returns the number of elements in the set. + pub fn len(&self) -> usize { + self.0.len() + } + + /// Returns `true` if the set contains no elements. + pub fn is_empty(&self) -> bool { + self.0.is_empty() + } + + /// Retains only the attributes specified by the predicate. + pub fn retain(&mut self, f: F) + where + F: Fn(&KeyValue) -> bool, + { + self.0.retain(|kv| f(&kv.0)) + } + + /// Iterate over key value pairs in the set + pub fn iter(&self) -> impl Iterator { + self.0.iter().map(|kv| (&kv.0.key, &kv.0.value)) + } +} diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/export/logs/mod.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/export/logs/mod.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/export/logs/mod.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/export/logs/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,40 @@ +//! Log exporters +use crate::Resource; +use async_trait::async_trait; +#[cfg(feature = "logs_level_enabled")] +use opentelemetry_api::logs::Severity; +use opentelemetry_api::{ + logs::{LogError, LogRecord, LogResult}, + InstrumentationLibrary, +}; +use std::{borrow::Cow, fmt::Debug}; + +/// `LogExporter` defines the interface that log exporters should implement. +#[async_trait] +pub trait LogExporter: Send + Debug { + /// Exports a batch of `ResourceLogs`. + async fn export(&mut self, batch: Vec) -> LogResult<()>; + /// Shuts down the expoter. + fn shutdown(&mut self) {} + #[cfg(feature = "logs_level_enabled")] + /// Chek if logs are enabled. + fn event_enabled(&self, _level: Severity, _target: &str, _name: &str) -> bool { + true + } +} + +/// `LogData` associates a [`LogRecord`] with a [`Resource`] and +/// [`InstrumentationLibrary`]. +#[derive(Debug)] +#[non_exhaustive] +pub struct LogData { + /// Log record + pub record: LogRecord, + /// Resource for the emitter who produced this `LogData`. + pub resource: Cow<'static, Resource>, + /// Instrumentation details for the emitter who produced this `LogData`. + pub instrumentation: InstrumentationLibrary, +} + +/// Describes the result of an export. +pub type ExportResult = Result<(), LogError>; diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/export/metrics/aggregation/mod.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/export/metrics/aggregation/mod.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/export/metrics/aggregation/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/export/metrics/aggregation/mod.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,110 +0,0 @@ -//! Metrics aggregation -use std::time::SystemTime; - -use crate::metrics::sdk_api::Number; -use opentelemetry_api::metrics::Result; - -mod temporality; - -pub use temporality::*; - -/// An interface returned by an [`Aggregator`] containing an interval of metric -/// data. -/// -/// [`Aggregator`]: crate::metrics::aggregators::Aggregator -pub trait Aggregation { - /// A short identifying string to identify the [`Aggregator`] that was used to - /// produce the aggregation (e.g., [`AggregationKind::SUM`]). - /// - /// [`Aggregator`]: crate::metrics::aggregators::Aggregator - /// [`AggregationKind`]: crate::export::metrics::aggregation::AggregationKind - fn kind(&self) -> &AggregationKind; -} - -/// Sum returns an aggregated sum. -pub trait Sum: Aggregation { - /// The sum of the currently aggregated metrics - fn sum(&self) -> Result; -} - -/// Count returns the number of values that were aggregated. -pub trait Count: Aggregation { - /// The count of the currently aggregated metrics - fn count(&self) -> Result; -} - -/// LastValue returns the latest value that was aggregated. -pub trait LastValue: Aggregation { - /// The last value of the currently aggregated metrics - fn last_value(&self) -> Result<(Number, SystemTime)>; -} - -/// Buckets represent histogram buckets boundaries and counts. -/// -/// For a Histogram with N defined boundaries, e.g, [x, y, z]. There are N+1 -/// counts: [-inf, x), [x, y), [y, z), [z, +inf] -#[derive(Debug)] -pub struct Buckets { - /// Boundaries are floating point numbers, even when - /// aggregating integers. - boundaries: Vec, - - /// Counts are floating point numbers to account for - /// the possibility of sampling which allows for - /// non-integer count values. - counts: Vec, -} - -impl Buckets { - /// Create new buckets - pub fn new(boundaries: Vec, counts: Vec) -> Self { - Buckets { boundaries, counts } - } - - /// Boundaries of the histogram buckets - pub fn boundaries(&self) -> &Vec { - &self.boundaries - } - - /// Counts of the histogram buckets - pub fn counts(&self) -> &Vec { - &self.counts - } -} - -/// Histogram returns the count of events in pre-determined buckets. -pub trait Histogram: Sum + Count + Aggregation { - /// Buckets for this histogram. - fn histogram(&self) -> Result; -} - -/// A short name for the [`Aggregator`] that produces an [`Aggregation`]. -/// -/// Kind is a string to allow user-defined Aggregators. -/// -/// When deciding how to handle an Aggregation, Exporters are encouraged to -/// decide based on conversion to the above interfaces based on strength, not on -/// Kind value, when deciding how to expose metric data. This enables -/// user-supplied Aggregators to replace builtin Aggregators. -/// -/// For example, test for a Histogram before testing for a Sum, and so on. -/// -/// [`Aggregator`]: crate::metrics::aggregators::Aggregator -#[derive(Debug, Clone, PartialEq, Eq)] -pub struct AggregationKind(&'static str); - -impl AggregationKind { - /// Aggregations that return an aggregated sum. - pub const SUM: Self = AggregationKind("SUM"); - - /// Aggregations that return a distribution - pub const HISTOGRAM: Self = AggregationKind("HISTOGRAM"); - - /// Aggregations that return only the latest value. - pub const LAST_VALUE: AggregationKind = AggregationKind("LAST_VALUE"); - - /// Create a new custom aggregation kind - pub const fn new(name: &'static str) -> Self { - AggregationKind(name) - } -} diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/export/metrics/aggregation/temporality.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/export/metrics/aggregation/temporality.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/export/metrics/aggregation/temporality.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/export/metrics/aggregation/temporality.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,92 +0,0 @@ -use crate::export::metrics::aggregation::AggregationKind; -use crate::metrics::sdk_api::{Descriptor, InstrumentKind}; - -#[derive(Clone)] -struct ConstantTemporalitySelector(Temporality); - -impl TemporalitySelector for ConstantTemporalitySelector { - fn temporality_for(&self, _descriptor: &Descriptor, _kind: &AggregationKind) -> Temporality { - self.0 - } -} - -/// Returns an [`TemporalitySelector`] that returns a constant [`Temporality`]. -pub fn constant_temporality_selector(temporality: Temporality) -> impl TemporalitySelector + Clone { - ConstantTemporalitySelector(temporality) -} - -/// Returns an [`TemporalitySelector`] that always returns [`Temporality::Cumulative`]. -pub fn cumulative_temporality_selector() -> impl TemporalitySelector + Clone { - constant_temporality_selector(Temporality::Cumulative) -} - -/// Returns an [`TemporalitySelector`] that always returns [`Temporality::Delta`]. -pub fn delta_temporality_selector() -> impl TemporalitySelector + Clone { - constant_temporality_selector(Temporality::Delta) -} - -/// Returns a [`TemporalitySelector`] that always returns the cumulative [`Temporality`] to avoid -/// long-term memory requirements. -pub fn stateless_temporality_selector() -> impl TemporalitySelector + Clone { - constant_temporality_selector(Temporality::Cumulative) -} - -#[derive(Clone)] -struct StatelessTemporalitySelector; - -impl TemporalitySelector for StatelessTemporalitySelector { - fn temporality_for(&self, descriptor: &Descriptor, kind: &AggregationKind) -> Temporality { - if kind == &AggregationKind::SUM && descriptor.instrument_kind().precomputed_sum() { - Temporality::Cumulative - } else { - Temporality::Delta - } - } -} - -/// Temporality indicates the temporal aggregation exported by an exporter. -/// These bits may be OR-d together when multiple exporters are in use. -#[derive(Copy, Clone, Debug, PartialEq, Eq)] -#[non_exhaustive] -pub enum Temporality { - /// Indicates that an Exporter expects a Cumulative Aggregation. - Cumulative = 1, - - /// Indicates that an Exporter expects a Delta Aggregation. - Delta = 2, -} - -impl Temporality { - /// Tests whether `kind` includes a specific kind of exporter. - pub fn includes(&self, other: &Self) -> bool { - (*self as u32) & (*other as u32) != 0 - } - - /// Returns whether a temporality of this kind requires memory to export correctly. - pub fn memory_required(&self, kind: &InstrumentKind) -> bool { - match kind { - InstrumentKind::Histogram - | InstrumentKind::GaugeObserver - | InstrumentKind::Counter - | InstrumentKind::UpDownCounter => { - // Cumulative-oriented instruments: - self.includes(&Temporality::Cumulative) - } - - InstrumentKind::CounterObserver | InstrumentKind::UpDownCounterObserver => { - // Delta-oriented instruments: - self.includes(&Temporality::Delta) - } - } - } -} - -/// TemporalitySelector is a sub-interface of Exporter used to indicate -/// whether the Processor should compute Delta or Cumulative -/// Aggregations. -pub trait TemporalitySelector { - /// TemporalityFor should return the correct Temporality that - /// should be used when exporting data for the given metric - /// instrument and Aggregator kind. - fn temporality_for(&self, descriptor: &Descriptor, kind: &AggregationKind) -> Temporality; -} diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/export/metrics/mod.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/export/metrics/mod.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/export/metrics/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/export/metrics/mod.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,355 +0,0 @@ -//! Metrics Export - -use core::fmt; -use std::{sync::Arc, time::SystemTime}; - -use opentelemetry_api::{attributes, metrics::Result, Context, InstrumentationLibrary}; - -use crate::{ - metrics::{aggregators::Aggregator, sdk_api::Descriptor}, - Resource, -}; - -use self::aggregation::TemporalitySelector; - -pub mod aggregation; -mod stdout; - -pub use stdout::{stdout, ExportLine, ExportNumeric, StdoutExporter, StdoutExporterBuilder}; - -/// AggregatorSelector supports selecting the kind of `Aggregator` to use at -/// runtime for a specific metric instrument. -pub trait AggregatorSelector { - /// This allocates a variable number of aggregators of a kind suitable for - /// the requested export. - /// - /// When the call returns `None`, the metric instrument is explicitly disabled. - /// - /// This must return a consistent type to avoid confusion in later stages of - /// the metrics export process, e.g., when merging or checkpointing - /// aggregators for a specific instrument. - /// - /// This call should not block. - fn aggregator_for(&self, descriptor: &Descriptor) -> Option>; -} - -/// A container for the common elements for exported metric data that are shared -/// by the `Accumulator`->`Processor` and `Processor`->`Exporter` steps. -#[derive(Debug)] -pub struct Metadata<'a> { - descriptor: &'a Descriptor, - attributes: &'a attributes::AttributeSet, -} - -impl<'a> Metadata<'a> { - /// Create a new `Metadata` instance. - pub fn new(descriptor: &'a Descriptor, attributes: &'a attributes::AttributeSet) -> Self { - { - Metadata { - descriptor, - attributes, - } - } - } - - /// A description of the metric instrument being exported. - pub fn descriptor(&self) -> &Descriptor { - self.descriptor - } - - /// The attributes associated with the instrument and the aggregated data. - pub fn attributes(&self) -> &attributes::AttributeSet { - self.attributes - } -} - -/// Allows `Accumulator` implementations to construct new `Accumulation`s to -/// send to `Processor`s. The `Descriptor`, `Attributes`, `Resource`, and -/// `Aggregator` represent aggregate metric events received over a single -/// collection period. -pub fn accumulation<'a>( - descriptor: &'a Descriptor, - attributes: &'a attributes::AttributeSet, - aggregator: &'a Arc, -) -> Accumulation<'a> { - Accumulation::new(descriptor, attributes, aggregator) -} - -/// A container for the exported data for a single metric instrument and attribute -/// set, as prepared by an `Accumulator` for the `Processor`. -pub struct Accumulation<'a> { - metadata: Metadata<'a>, - aggregator: &'a Arc, -} - -impl<'a> Accumulation<'a> { - /// Create a new `Record` instance. - pub fn new( - descriptor: &'a Descriptor, - attributes: &'a attributes::AttributeSet, - aggregator: &'a Arc, - ) -> Self { - Accumulation { - metadata: Metadata::new(descriptor, attributes), - aggregator, - } - } - - /// A description of the metric instrument being exported. - pub fn descriptor(&self) -> &Descriptor { - self.metadata.descriptor - } - - /// The attributes associated with the instrument and the aggregated data. - pub fn attributes(&self) -> &attributes::AttributeSet { - self.metadata.attributes - } - - /// The checkpointed aggregator for this metric. - pub fn aggregator(&self) -> &Arc { - self.aggregator - } -} - -impl<'a> fmt::Debug for Accumulation<'a> { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("Accumulation") - .field("metadata", &self.metadata) - .finish() - } -} - -/// Metric data processor. -/// -/// Locked processors are responsible gathering exported results from the SDK during -/// collection, and deciding over which dimensions to group the exported data. -/// -/// The `process` method is called during collection in a single-threaded -/// context from the SDK, after the aggregator is checkpointed, allowing the -/// processor to build the set of metrics currently being exported. -pub trait LockedProcessor { - /// Process is called by the SDK once per internal record, passing the export - /// [`Accumulation`] (a Descriptor, the corresponding attributes, and the - /// checkpointed aggregator). - /// - /// This call has no [`Context`] argument because it is expected to perform only - /// computation. An SDK is not expected to call exporters from with Process, use - /// a controller for that. - fn process(&mut self, accumulation: Accumulation<'_>) -> Result<()>; -} - -/// A container for the exported data for a single metric instrument and attribute -/// set, as prepared by the `Processor` for the `Exporter`. This includes the -/// effective start and end time for the aggregation. -pub struct Record<'a> { - metadata: Metadata<'a>, - aggregator: Option<&'a Arc>, - start: SystemTime, - end: SystemTime, -} - -impl Record<'_> { - /// A description of the metric instrument being exported. - pub fn descriptor(&self) -> &Descriptor { - self.metadata.descriptor - } - - /// The attributes associated with the instrument and the aggregated data. - pub fn attributes(&self) -> &attributes::AttributeSet { - self.metadata.attributes - } - - /// The aggregator for this metric - pub fn aggregator(&self) -> Option<&Arc> { - self.aggregator - } - - /// The start time of the interval covered by this aggregation. - pub fn start_time(&self) -> &SystemTime { - &self.start - } - - /// The end time of the interval covered by this aggregation. - pub fn end_time(&self) -> &SystemTime { - &self.end - } -} - -/// Exporter handles presentation of the checkpoint of aggregate -/// metrics. This is the final stage of a metrics export pipeline, -/// where metric data are formatted for a specific system. -pub trait MetricsExporter: TemporalitySelector { - /// Export is called immediately after completing a collection - /// pass in the SDK. - /// - /// The Context comes from the controller that initiated - /// collection. - /// - /// The InstrumentationLibraryReader interface refers to the - /// Processor that just completed collection. - fn export( - &self, - cx: &Context, - res: &Resource, - reader: &dyn InstrumentationLibraryReader, - ) -> Result<()>; -} - -/// InstrumentationLibraryReader is an interface for exporters to iterate -/// over one instrumentation library of metric data at a time. -pub trait InstrumentationLibraryReader { - /// ForEach calls the passed function once per instrumentation library, - /// allowing the caller to emit metrics grouped by the library that - /// produced them. - fn try_for_each( - &self, - f: &mut dyn FnMut(&InstrumentationLibrary, &mut dyn Reader) -> Result<()>, - ) -> Result<()>; -} - -/// Reader allows a controller to access a complete checkpoint of -/// aggregated metrics from the Processor for a single library of -/// metric data. This is passed to the Exporter which may then use -/// ForEach to iterate over the collection of aggregated metrics. -pub trait Reader { - /// ForEach iterates over aggregated checkpoints for all - /// metrics that were updated during the last collection - /// period. Each aggregated checkpoint returned by the - /// function parameter may return an error. - /// - /// The TemporalitySelector argument is used to determine - /// whether the Record is computed using Delta or Cumulative - /// aggregation. - /// - /// ForEach tolerates ErrNoData silently, as this is - /// expected from the Meter implementation. Any other kind - /// of error will immediately halt ForEach and return - /// the error to the caller. - fn try_for_each( - &mut self, - temp_selector: &dyn TemporalitySelector, - f: &mut dyn FnMut(&Record<'_>) -> Result<()>, - ) -> Result<()>; -} - -impl fmt::Debug for Record<'_> { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("Record") - .field("metadata", &self.metadata) - .field("start", &self.start) - .field("end", &self.end) - .finish() - } -} - -/// The interface used to create checkpoints. -pub trait Checkpointer: Processor { - /// Synchronizes the checkpoint process and allows a single locked - /// checkpoint to be accessed at a time. - fn checkpoint( - &self, - f: &mut dyn FnMut(&mut dyn LockedCheckpointer) -> Result<()>, - ) -> Result<()>; -} - -/// The interface used by a controller to coordinate the processor with -/// accumulator(s) and exporter(s). -/// -/// The StartCollection() and FinishCollection() methods start and finish a -/// collection interval. Controllers call the Accumulator(s) during collection -/// to process Accumulations. -pub trait LockedCheckpointer { - /// Processes metric data for export. - /// - /// The `process` method is bracketed by `start_collection` and - /// `finish_collection` calls. - fn processor(&mut self) -> &mut dyn LockedProcessor; - - /// Reader returns the current data set. - /// - /// This may be called before and after collection. The implementation is - /// required to return the same value throughout its lifetime. - fn reader(&mut self) -> &mut dyn Reader; - - /// begins a collection interval. - fn start_collection(&mut self); - - /// ends a collection interval. - fn finish_collection(&mut self) -> Result<()>; -} - -/// An interface for producing configured [`Checkpointer`] instances. -pub trait CheckpointerFactory { - /// Creates a new configured checkpointer. - fn checkpointer(&self) -> Arc; -} - -/// Allows `Processor` implementations to construct export records. The -/// `Descriptor`, `Attributes`, and `Aggregator` represent aggregate metric events -/// received over a single collection period. -pub fn record<'a>( - descriptor: &'a Descriptor, - attributes: &'a attributes::AttributeSet, - aggregator: Option<&'a Arc>, - start: SystemTime, - end: SystemTime, -) -> Record<'a> { - Record { - metadata: Metadata::new(descriptor, attributes), - aggregator, - start, - end, - } -} - -/// A utility extension to allow upcasting. -/// -/// Can be removed once [trait_upcasting] is stablized. -/// -/// [trait_upcasting]: https://doc.rust-lang.org/unstable-book/language-features/trait-upcasting.html -pub trait AsDynProcessor { - /// Create an `Arc` from an impl of [`Processor`]. - fn as_dyn_processor<'a>(self: Arc) -> Arc - where - Self: 'a; -} - -impl AsDynProcessor for T { - fn as_dyn_processor<'a>(self: Arc) -> Arc - where - Self: 'a, - { - self - } -} - -/// Processor is responsible for deciding which kind of aggregation to use (via -/// `aggregation_selector`), gathering exported results from the SDK during -/// collection, and deciding over which dimensions to group the exported data. -/// -/// The SDK supports binding only one of these interfaces, as it has the sole -/// responsibility of determining which Aggregator to use for each record. -/// -/// The embedded AggregatorSelector interface is called (concurrently) in -/// instrumentation context to select the appropriate Aggregator for an -/// instrument. -pub trait Processor: AsDynProcessor { - /// AggregatorSelector is responsible for selecting the - /// concrete type of Aggregator used for a metric in the SDK. - /// - /// This may be a static decision based on fields of the - /// Descriptor, or it could use an external configuration - /// source to customize the treatment of each metric - /// instrument. - /// - /// The result from AggregatorSelector.AggregatorFor should be - /// the same type for a given Descriptor or else nil. The same - /// type should be returned for a given descriptor, because - /// Aggregators only know how to Merge with their own type. If - /// the result is nil, the metric instrument will be disabled. - /// - /// Note that the SDK only calls AggregatorFor when new records - /// require an Aggregator. This does not provide a way to - /// disable metrics with active records. - fn aggregator_selector(&self) -> &dyn AggregatorSelector; -} diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/export/metrics/stdout.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/export/metrics/stdout.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/export/metrics/stdout.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/export/metrics/stdout.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,259 +0,0 @@ -//! Stdout Metrics Exporter -use crate::{ - export::metrics::{ - aggregation::{stateless_temporality_selector, LastValue, Sum, TemporalitySelector}, - InstrumentationLibraryReader, MetricsExporter, - }, - metrics::aggregators::{LastValueAggregator, SumAggregator}, - Resource, -}; -use opentelemetry_api::{ - attributes::{default_encoder, AttributeSet, Encoder}, - metrics::{MetricsError, Result}, - Context, KeyValue, -}; -use std::fmt; -use std::io; -use std::sync::Mutex; -use std::time::SystemTime; - -/// Create a new stdout exporter builder with the configuration for a stdout exporter. -pub fn stdout() -> StdoutExporterBuilder { - StdoutExporterBuilder::::builder() -} - -/// An OpenTelemetry metric exporter that transmits telemetry to -/// the local STDOUT or via the registered implementation of `Write`. -#[derive(Debug)] -pub struct StdoutExporter { - /// Writer is the destination. If not set, `Stdout` is used. - writer: Mutex, - - /// Specifies if timestamps should be printed - timestamps: bool, - - /// Encodes the attributes. - attribute_encoder: Box, - - /// An optional user-defined function to format a given export batch. - formatter: Option, -} - -/// Individually exported metric -/// -/// Can be formatted using [`StdoutExporterBuilder::with_formatter`]. -#[derive(Default, Debug)] -pub struct ExportLine { - /// metric name - pub name: String, - - /// populated if using sum aggregator - pub sum: Option, - - /// populated if using last value aggregator - pub last_value: Option, - - /// metric timestamp - pub timestamp: Option, -} - -/// A number exported as debug for serialization -pub struct ExportNumeric(Box); - -impl fmt::Debug for ExportNumeric { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - self.0.fmt(f) - } -} - -impl StdoutExporter { - /// The temporality selector for this exporter - pub fn temporality_selector(&self) -> impl TemporalitySelector { - stateless_temporality_selector() - } -} - -impl TemporalitySelector for StdoutExporter { - fn temporality_for( - &self, - descriptor: &crate::metrics::sdk_api::Descriptor, - kind: &super::aggregation::AggregationKind, - ) -> super::aggregation::Temporality { - stateless_temporality_selector().temporality_for(descriptor, kind) - } -} - -impl MetricsExporter for StdoutExporter -where - W: fmt::Debug + io::Write, -{ - fn export( - &self, - _cx: &Context, - res: &Resource, - reader: &dyn InstrumentationLibraryReader, - ) -> Result<()> { - let mut batch = Vec::new(); - reader.try_for_each(&mut |library, reader| { - let mut attributes = Vec::new(); - if !library.name.is_empty() { - attributes.push(KeyValue::new("instrumentation.name", library.name.clone())); - } - if let Some(version) = &library.version { - attributes.push(KeyValue::new("instrumentation.version", version.clone())); - } - if let Some(schema) = &library.schema_url { - attributes.push(KeyValue::new("instrumentation.schema_url", schema.clone())); - } - let inst_attributes = AttributeSet::from_attributes(attributes.into_iter()); - let encoded_inst_attributes = - inst_attributes.encoded(Some(self.attribute_encoder.as_ref())); - - reader.try_for_each(self, &mut |record| { - let desc = record.descriptor(); - let agg = record.aggregator().ok_or(MetricsError::NoDataCollected)?; - let kind = desc.number_kind(); - - let encoded_resource = res.encoded(self.attribute_encoder.as_ref()); - - let mut expose = ExportLine::default(); - if let Some(sum) = agg.as_any().downcast_ref::() { - expose.sum = Some(ExportNumeric(sum.sum()?.to_debug(kind))); - } else if let Some(last_value) = agg.as_any().downcast_ref::() - { - let (value, timestamp) = last_value.last_value()?; - expose.last_value = Some(ExportNumeric(value.to_debug(kind))); - - if self.timestamps { - expose.timestamp = Some(timestamp); - } - } - - let mut encoded_attributes = String::new(); - let iter = record.attributes().iter(); - if let (0, _) = iter.size_hint() { - encoded_attributes = record - .attributes() - .encoded(Some(self.attribute_encoder.as_ref())); - } - - let mut sb = String::new(); - - sb.push_str(desc.name()); - - if !encoded_attributes.is_empty() - || !encoded_resource.is_empty() - || !encoded_inst_attributes.is_empty() - { - sb.push('{'); - sb.push_str(&encoded_resource); - if !encoded_inst_attributes.is_empty() && !encoded_resource.is_empty() { - sb.push(','); - } - sb.push_str(&encoded_inst_attributes); - if !encoded_attributes.is_empty() - && (!encoded_inst_attributes.is_empty() || !encoded_resource.is_empty()) - { - sb.push(','); - } - sb.push_str(&encoded_attributes); - sb.push('}'); - } - - expose.name = sb; - - batch.push(expose); - Ok(()) - }) - })?; - - self.writer.lock().map_err(From::from).and_then(|mut w| { - let formatted = match &self.formatter { - Some(formatter) => formatter.0(batch)?, - None => format!("{:?}\n", batch), - }; - w.write_all(formatted.as_bytes()) - .map_err(|e| MetricsError::Other(e.to_string())) - }) - } -} - -/// A formatter for user-defined batch serialization. -struct Formatter(Box) -> Result + Send + Sync>); -impl fmt::Debug for Formatter { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "Formatter(closure)") - } -} - -/// Configuration for a given stdout exporter. -#[derive(Debug)] -pub struct StdoutExporterBuilder { - writer: Mutex, - timestamps: bool, - attribute_encoder: Option>, - formatter: Option, -} - -impl StdoutExporterBuilder -where - W: io::Write + fmt::Debug + Send + Sync + 'static, -{ - fn builder() -> StdoutExporterBuilder { - StdoutExporterBuilder { - writer: Mutex::new(io::stdout()), - timestamps: true, - attribute_encoder: None, - formatter: None, - } - } - /// Set the writer that this exporter will use. - pub fn with_writer(self, writer: W2) -> StdoutExporterBuilder { - StdoutExporterBuilder { - writer: Mutex::new(writer), - timestamps: self.timestamps, - attribute_encoder: self.attribute_encoder, - formatter: self.formatter, - } - } - - /// Hide the timestamps from exported results - pub fn with_do_not_print_time(self, do_not_print_time: bool) -> Self { - StdoutExporterBuilder { - timestamps: do_not_print_time, - ..self - } - } - - /// Set the attribute encoder that this exporter will use. - pub fn with_attribute_encoder(self, attribute_encoder: E) -> Self - where - E: Encoder + Send + Sync + 'static, - { - StdoutExporterBuilder { - attribute_encoder: Some(Box::new(attribute_encoder)), - ..self - } - } - - /// Set a formatter for serializing export batch data - pub fn with_formatter(self, formatter: T) -> Self - where - T: Fn(Vec) -> Result + Send + Sync + 'static, - { - StdoutExporterBuilder { - formatter: Some(Formatter(Box::new(formatter))), - ..self - } - } - - /// Build a new push controller, returning errors if they arise. - pub fn build(self) -> Result> { - Ok(StdoutExporter { - writer: self.writer, - timestamps: self.timestamps, - attribute_encoder: self.attribute_encoder.unwrap_or_else(default_encoder), - formatter: self.formatter, - }) - } -} diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/export/mod.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/export/mod.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/export/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/export/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,8 +1,9 @@ -//! Metrics Export +//! Telemetry Export + +#[cfg(feature = "logs")] +#[cfg_attr(docsrs, doc(cfg(feature = "logs")))] +pub mod logs; -#[cfg(feature = "metrics")] -#[cfg_attr(docsrs, doc(cfg(feature = "metrics")))] -pub mod metrics; #[cfg(feature = "trace")] #[cfg_attr(docsrs, doc(cfg(feature = "trace")))] pub mod trace; diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/export/trace/mod.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/export/trace/mod.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/export/trace/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/export/trace/mod.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,97 +0,0 @@ -//! Trace exporters -use crate::Resource; -use futures_util::future::BoxFuture; -use opentelemetry_api::trace::{Event, Link, SpanContext, SpanId, SpanKind, Status, TraceError}; -use std::borrow::Cow; -use std::fmt::Debug; -use std::time::SystemTime; - -pub mod stdout; - -/// Describes the result of an export. -pub type ExportResult = Result<(), TraceError>; - -/// `SpanExporter` defines the interface that protocol-specific exporters must -/// implement so that they can be plugged into OpenTelemetry SDK and support -/// sending of telemetry data. -/// -/// The goal of the interface is to minimize burden of implementation for -/// protocol-dependent telemetry exporters. The protocol exporter is expected to -/// be primarily a simple telemetry data encoder and transmitter. -pub trait SpanExporter: Send + Debug { - /// Exports a batch of readable spans. Protocol exporters that will - /// implement this function are typically expected to serialize and transmit - /// the data to the destination. - /// - /// This function will never be called concurrently for the same exporter - /// instance. It can be called again only after the current call returns. - /// - /// This function must not block indefinitely, there must be a reasonable - /// upper limit after which the call must time out with an error result. - /// - /// Any retry logic that is required by the exporter is the responsibility - /// of the exporter. - fn export(&mut self, batch: Vec) -> BoxFuture<'static, ExportResult>; - - /// Shuts down the exporter. Called when SDK is shut down. This is an - /// opportunity for exporter to do any cleanup required. - /// - /// This function should be called only once for each `SpanExporter` - /// instance. After the call to `shutdown`, subsequent calls to `export` are - /// not allowed and should return an error. - /// - /// This function should not block indefinitely (e.g. if it attempts to - /// flush the data and the destination is unavailable). SDK authors - /// can decide if they want to make the shutdown timeout - /// configurable. - fn shutdown(&mut self) {} - - /// This is a hint to ensure that the export of any Spans the exporter - /// has received prior to the call to this function SHOULD be completed - /// as soon as possible, preferably before returning from this method. - /// - /// This function SHOULD provide a way to let the caller know - /// whether it succeeded, failed or timed out. - /// - /// This function SHOULD only be called in cases where it is absolutely necessary, - /// such as when using some FaaS providers that may suspend the process after - /// an invocation, but before the exporter exports the completed spans. - /// - /// This function SHOULD complete or abort within some timeout. This function can be - /// implemented as a blocking API or an asynchronous API which notifies the caller via - /// a callback or an event. OpenTelemetry client authors can decide if they want to - /// make the flush timeout configurable. - fn force_flush(&mut self) -> BoxFuture<'static, ExportResult> { - Box::pin(async { Ok(()) }) - } -} - -/// `SpanData` contains all the information collected by a `Span` and can be used -/// by exporters as a standard input. -#[derive(Clone, Debug, PartialEq)] -pub struct SpanData { - /// Exportable `SpanContext` - pub span_context: SpanContext, - /// Span parent id - pub parent_span_id: SpanId, - /// Span kind - pub span_kind: SpanKind, - /// Span name - pub name: Cow<'static, str>, - /// Span start time - pub start_time: SystemTime, - /// Span end time - pub end_time: SystemTime, - /// Span attributes - pub attributes: crate::trace::EvictedHashMap, - /// Span events - pub events: crate::trace::EvictedQueue, - /// Span Links - pub links: crate::trace::EvictedQueue, - /// Span status - pub status: Status, - /// Resource contains attributes representing an entity that produced this span. - pub resource: Cow<'static, Resource>, - /// Instrumentation library that produced this span - pub instrumentation_lib: crate::InstrumentationLibrary, -} diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/export/trace/stdout.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/export/trace/stdout.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/export/trace/stdout.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/export/trace/stdout.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,169 +0,0 @@ -//! # Stdout Span Exporter -//! -//! The stdout [`SpanExporter`] writes debug printed [`Span`]s to its configured -//! [`Write`] instance. By default it will write to [`Stdout`]. -//! -//! [`SpanExporter`]: super::SpanExporter -//! [`Span`]: crate::trace::Span -//! [`Write`]: std::io::Write -//! [`Stdout`]: std::io::Stdout -//! -//! # Examples -//! -//! ```no_run -//! use opentelemetry_api::global::shutdown_tracer_provider; -//! use opentelemetry_api::trace::Tracer; -//! use opentelemetry_sdk::export::trace::stdout; -//! -//! fn main() { -//! let tracer = stdout::new_pipeline() -//! .with_pretty_print(true) -//! .install_simple(); -//! -//! tracer.in_span("doing_work", |cx| { -//! // Traced app logic here... -//! }); -//! -//! shutdown_tracer_provider(); // sending remaining spans -//! } -//! ``` -use crate::export::{ - trace::{ExportResult, SpanData, SpanExporter, TraceError}, - ExportError, -}; -use async_trait::async_trait; -use futures_util::future::BoxFuture; -use opentelemetry_api::{global, trace::TracerProvider}; -use std::fmt::Debug; -use std::io::{stdout, Stdout, Write}; - -/// Pipeline builder -#[derive(Debug)] -pub struct PipelineBuilder { - pretty_print: bool, - trace_config: Option, - writer: W, -} - -/// Create a new stdout exporter pipeline builder. -pub fn new_pipeline() -> PipelineBuilder { - PipelineBuilder::default() -} - -impl Default for PipelineBuilder { - /// Return the default pipeline builder. - fn default() -> Self { - Self { - pretty_print: false, - trace_config: None, - writer: stdout(), - } - } -} - -impl PipelineBuilder { - /// Specify the pretty print setting. - pub fn with_pretty_print(mut self, pretty_print: bool) -> Self { - self.pretty_print = pretty_print; - self - } - - /// Assign the SDK trace configuration. - pub fn with_trace_config(mut self, config: crate::trace::Config) -> Self { - self.trace_config = Some(config); - self - } - - /// Specify the writer to use. - pub fn with_writer(self, writer: T) -> PipelineBuilder { - PipelineBuilder { - pretty_print: self.pretty_print, - trace_config: self.trace_config, - writer, - } - } -} - -impl PipelineBuilder -where - W: Write + Debug + Send + 'static, -{ - /// Install the stdout exporter pipeline with the recommended defaults. - pub fn install_simple(mut self) -> crate::trace::Tracer { - let exporter = Exporter::new(self.writer, self.pretty_print); - - let mut provider_builder = - crate::trace::TracerProvider::builder().with_simple_exporter(exporter); - if let Some(config) = self.trace_config.take() { - provider_builder = provider_builder.with_config(config); - } - let provider = provider_builder.build(); - - let tracer = - provider.versioned_tracer("opentelemetry", Some(env!("CARGO_PKG_VERSION")), None); - let _ = global::set_tracer_provider(provider); - - tracer - } -} - -/// A [`SpanExporter`] that writes to [`Stdout`] or other configured [`Write`]. -/// -/// [`SpanExporter`]: super::SpanExporter -/// [`Write`]: std::io::Write -/// [`Stdout`]: std::io::Stdout -#[derive(Debug)] -pub struct Exporter { - writer: W, - pretty_print: bool, -} - -impl Exporter { - /// Create a new stdout `Exporter`. - pub fn new(writer: W, pretty_print: bool) -> Self { - Self { - writer, - pretty_print, - } - } -} - -#[async_trait] -impl SpanExporter for Exporter -where - W: Write + Debug + Send + 'static, -{ - /// Export spans to stdout - fn export(&mut self, batch: Vec) -> BoxFuture<'static, ExportResult> { - for span in batch { - if self.pretty_print { - if let Err(err) = self - .writer - .write_all(format!("{:#?}\n", span).as_bytes()) - .map_err(|err| TraceError::ExportFailed(Box::new(Error::from(err)))) - { - return Box::pin(std::future::ready(Err(Into::into(err)))); - } - } else if let Err(err) = self - .writer - .write_all(format!("{:?}\n", span).as_bytes()) - .map_err(|err| TraceError::ExportFailed(Box::new(Error::from(err)))) - { - return Box::pin(std::future::ready(Err(Into::into(err)))); - } - } - - Box::pin(std::future::ready(Ok(()))) - } -} - -/// Stdout exporter's error -#[derive(thiserror::Error, Debug)] -#[error(transparent)] -struct Error(#[from] std::io::Error); - -impl ExportError for Error { - fn exporter_name(&self) -> &'static str { - "stdout" - } -} diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/export/trace.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/export/trace.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/export/trace.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/export/trace.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,95 @@ +//! Trace exporters +use crate::Resource; +use futures_util::future::BoxFuture; +use opentelemetry_api::trace::{Event, Link, SpanContext, SpanId, SpanKind, Status, TraceError}; +use std::borrow::Cow; +use std::fmt::Debug; +use std::time::SystemTime; + +/// Describes the result of an export. +pub type ExportResult = Result<(), TraceError>; + +/// `SpanExporter` defines the interface that protocol-specific exporters must +/// implement so that they can be plugged into OpenTelemetry SDK and support +/// sending of telemetry data. +/// +/// The goal of the interface is to minimize burden of implementation for +/// protocol-dependent telemetry exporters. The protocol exporter is expected to +/// be primarily a simple telemetry data encoder and transmitter. +pub trait SpanExporter: Send + Debug { + /// Exports a batch of readable spans. Protocol exporters that will + /// implement this function are typically expected to serialize and transmit + /// the data to the destination. + /// + /// This function will never be called concurrently for the same exporter + /// instance. It can be called again only after the current call returns. + /// + /// This function must not block indefinitely, there must be a reasonable + /// upper limit after which the call must time out with an error result. + /// + /// Any retry logic that is required by the exporter is the responsibility + /// of the exporter. + fn export(&mut self, batch: Vec) -> BoxFuture<'static, ExportResult>; + + /// Shuts down the exporter. Called when SDK is shut down. This is an + /// opportunity for exporter to do any cleanup required. + /// + /// This function should be called only once for each `SpanExporter` + /// instance. After the call to `shutdown`, subsequent calls to `export` are + /// not allowed and should return an error. + /// + /// This function should not block indefinitely (e.g. if it attempts to + /// flush the data and the destination is unavailable). SDK authors + /// can decide if they want to make the shutdown timeout + /// configurable. + fn shutdown(&mut self) {} + + /// This is a hint to ensure that the export of any Spans the exporter + /// has received prior to the call to this function SHOULD be completed + /// as soon as possible, preferably before returning from this method. + /// + /// This function SHOULD provide a way to let the caller know + /// whether it succeeded, failed or timed out. + /// + /// This function SHOULD only be called in cases where it is absolutely necessary, + /// such as when using some FaaS providers that may suspend the process after + /// an invocation, but before the exporter exports the completed spans. + /// + /// This function SHOULD complete or abort within some timeout. This function can be + /// implemented as a blocking API or an asynchronous API which notifies the caller via + /// a callback or an event. OpenTelemetry client authors can decide if they want to + /// make the flush timeout configurable. + fn force_flush(&mut self) -> BoxFuture<'static, ExportResult> { + Box::pin(async { Ok(()) }) + } +} + +/// `SpanData` contains all the information collected by a `Span` and can be used +/// by exporters as a standard input. +#[derive(Clone, Debug, PartialEq)] +pub struct SpanData { + /// Exportable `SpanContext` + pub span_context: SpanContext, + /// Span parent id + pub parent_span_id: SpanId, + /// Span kind + pub span_kind: SpanKind, + /// Span name + pub name: Cow<'static, str>, + /// Span start time + pub start_time: SystemTime, + /// Span end time + pub end_time: SystemTime, + /// Span attributes + pub attributes: crate::trace::EvictedHashMap, + /// Span events + pub events: crate::trace::EvictedQueue, + /// Span Links + pub links: crate::trace::EvictedQueue, + /// Span status + pub status: Status, + /// Resource contains attributes representing an entity that produced this span. + pub resource: Cow<'static, Resource>, + /// Instrumentation library that produced this span + pub instrumentation_lib: crate::InstrumentationLibrary, +} diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/instrumentation.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/instrumentation.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/instrumentation.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/instrumentation.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,6 +1,5 @@ -//! Provides instrumentation information for both tracing and metric. -//! See `OTEPS-0083` for details. -//! -//! [OTEPS-0083](https://github.com/open-telemetry/oteps/blob/master/text/0083-component.md) - pub use opentelemetry_api::InstrumentationLibrary; + +/// A logical unit of the application code with which the emitted telemetry can +/// be associated. +pub type Scope = InstrumentationLibrary; diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/lib.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/lib.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,11 +1,92 @@ -//! # OpenTelemetry SDK +//! OpenTelemetry is a collection of tools, APIs, and SDKs. Use it to +//! instrument, generate, collect, and export telemetry data (metrics, logs, and +//! traces) to help you analyze your software's performance and behavior. //! -//! This SDK provides an opinionated reference implementation of -//! the OpenTelemetry API. The SDK implements the specifics of -//! deciding which data to collect through `Sampler`s, and -//! facilitates the delivery of telemetry data to storage systems -//! through `Exporter`s. These can be configured on `Tracer` and -//! `Meter` creation. +//! # Getting Started +//! +//! ```no_run +//! # #[cfg(feature = "trace")] +//! # { +//! use opentelemetry_api::{global, trace::{Tracer, TracerProvider as _}}; +//! use opentelemetry_sdk::trace::TracerProvider; +//! +//! fn main() { +//! // Choose an exporter like `opentelemetry_stdout::SpanExporter` +//! # fn example(new_exporter: impl Fn() -> T) { +//! let exporter = new_exporter(); +//! +//! // Create a new trace pipeline that prints to stdout +//! let provider = TracerProvider::builder() +//! .with_simple_exporter(exporter) +//! .build(); +//! let tracer = provider.tracer("readme_example"); +//! +//! tracer.in_span("doing_work", |cx| { +//! // Traced app logic here... +//! }); +//! +//! // Shutdown trace pipeline +//! global::shutdown_tracer_provider(); +//! # } +//! } +//! # } +//! ``` +//! +//! See the [examples] directory for different integration patterns. +//! +//! See the API [`trace`] module docs for more information on creating and managing +//! spans. +//! +//! [examples]: https://github.com/open-telemetry/opentelemetry-rust/tree/main/examples +//! [`trace`]: https://docs.rs/opentelemetry_api/latest/opentelemetry_api/trace/index.html +//! +//! # Metrics (Beta) +//! +//! Note: the metrics implementation is **still in progress** and **subject to major +//! changes**. +//! +//! ### Creating instruments and recording measurements +//! +//! ``` +//! # #[cfg(feature = "metrics")] +//! # { +//! use opentelemetry_api::{global, KeyValue}; +//! +//! // get a meter from a provider +//! let meter = global::meter("my_service"); +//! +//! // create an instrument +//! let counter = meter.u64_counter("my_counter").init(); +//! +//! // record a measurement +//! counter.add(1, &[KeyValue::new("http.client_ip", "83.164.160.102")]); +//! # } +//! ``` +//! +//! See the [examples] directory for different integration patterns. +//! +//! See the API [`metrics`] module docs for more information on creating and +//! managing instruments. +//! +//! [examples]: https://github.com/open-telemetry/opentelemetry-rust/tree/main/examples +//! [`metrics`]: https://docs.rs/opentelemetry_api/latest/opentelemetry_api/metrics/index.html +//! +//! ## Crate Feature Flags +//! +//! The following core crate feature flags are available: +//! +//! * `trace`: Includes the trace SDK (enabled by default). +//! * `metrics`: Includes the unstable metrics SDK. +//! +//! Support for recording and exporting telemetry asynchronously can be added +//! via the following flags: +//! +//! * `rt-tokio`: Spawn telemetry tasks using [tokio]'s multi-thread runtime. +//! * `rt-tokio-current-thread`: Spawn telemetry tasks on a separate runtime so that the main runtime won't be blocked. +//! * `rt-async-std`: Spawn telemetry tasks using [async-std]'s runtime. +//! +//! [tokio]: https://crates.io/crates/tokio +//! [async-std]: https://crates.io/crates/async-std #![warn( future_incompatible, missing_debug_implementations, @@ -26,8 +107,12 @@ )] #![cfg_attr(test, deny(warnings))] +pub(crate) mod attributes; pub mod export; mod instrumentation; +#[cfg(feature = "logs")] +#[cfg_attr(docsrs, doc(cfg(feature = "logs")))] +pub mod logs; #[cfg(feature = "metrics")] #[cfg_attr(docsrs, doc(cfg(feature = "metrics")))] pub mod metrics; @@ -42,9 +127,11 @@ #[cfg(feature = "trace")] #[cfg_attr(docsrs, doc(cfg(feature = "trace")))] pub mod trace; + #[doc(hidden)] pub mod util; -pub use instrumentation::InstrumentationLibrary; +pub use attributes::*; +pub use instrumentation::{InstrumentationLibrary, Scope}; #[doc(inline)] pub use resource::Resource; diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/logs/config.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/logs/config.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/logs/config.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/logs/config.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,18 @@ +use std::borrow::Cow; + +use crate::Resource; + +/// Log emitter configuration. +#[derive(Debug, Default)] +pub struct Config { + /// Contains attributes representing an entity that produces telemetry. + pub resource: Cow<'static, crate::Resource>, +} + +impl Config { + /// Specify the attributes representing the entity that produces telemetry + pub fn with_resource(mut self, resource: Resource) -> Self { + self.resource = Cow::Owned(resource); + self + } +} diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/logs/log_emitter.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/logs/log_emitter.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/logs/log_emitter.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/logs/log_emitter.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,251 @@ +use super::{BatchLogProcessor, BatchMessage, Config, LogProcessor, SimpleLogProcessor}; +use crate::{ + export::logs::{LogData, LogExporter}, + runtime::RuntimeChannel, +}; +use opentelemetry_api::{ + global::{self}, + logs::{LogRecord, LogResult, TraceContext}, + trace::TraceContextExt, + Context, InstrumentationLibrary, +}; + +#[cfg(feature = "logs_level_enabled")] +use opentelemetry_api::logs::Severity; + +use std::{ + borrow::Cow, + sync::{Arc, Weak}, +}; + +#[derive(Debug, Clone)] +/// Creator for `Logger` instances. +pub struct LoggerProvider { + inner: Arc, +} + +/// Default logger name if empty string is provided. +const DEFAULT_COMPONENT_NAME: &str = "rust.opentelemetry.io/sdk/logger"; + +impl opentelemetry_api::logs::LoggerProvider for LoggerProvider { + type Logger = Logger; + + /// Create a new versioned `Logger` instance. + fn versioned_logger( + &self, + name: impl Into>, + version: Option>, + schema_url: Option>, + attributes: Option>, + ) -> Logger { + let name = name.into(); + + let component_name = if name.is_empty() { + Cow::Borrowed(DEFAULT_COMPONENT_NAME) + } else { + name + }; + + self.library_logger(Arc::new(InstrumentationLibrary::new( + component_name, + version, + schema_url, + attributes, + ))) + } + + fn library_logger(&self, library: Arc) -> Self::Logger { + Logger::new(library, Arc::downgrade(&self.inner)) + } +} + +impl LoggerProvider { + /// Build a new logger provider. + pub(crate) fn new(inner: Arc) -> Self { + LoggerProvider { inner } + } + + /// Create a new `LoggerProvider` builder. + pub fn builder() -> Builder { + Builder::default() + } + + /// Config associated with this provider. + pub fn config(&self) -> &Config { + &self.inner.config + } + + /// Log processors associated with this provider. + pub fn log_processors(&self) -> &Vec> { + &self.inner.processors + } + + /// Force flush all remaining logs in log processors and return results. + pub fn force_flush(&self) -> Vec> { + self.log_processors() + .iter() + .map(|processor| processor.force_flush()) + .collect() + } + + /// Shuts down this `LoggerProvider`, panicking on failure. + pub fn shutdown(&mut self) -> Vec> { + self.try_shutdown() + .expect("canont shutdown LoggerProvider when child Loggers are still active") + } + + /// Attempts to shutdown this `LoggerProvider`, succeeding only when + /// all cloned `LoggerProvider` values have been dropped. + pub fn try_shutdown(&mut self) -> Option>> { + Arc::get_mut(&mut self.inner).map(|inner| { + inner + .processors + .iter_mut() + .map(|processor| processor.shutdown()) + .collect() + }) + } +} + +#[derive(Debug)] +pub(crate) struct LoggerProviderInner { + processors: Vec>, + config: Config, +} + +impl Drop for LoggerProviderInner { + fn drop(&mut self) { + for processor in &mut self.processors { + if let Err(err) = processor.shutdown() { + global::handle_error(err); + } + } + } +} + +#[derive(Debug, Default)] +/// Builder for provider attributes. +pub struct Builder { + processors: Vec>, + config: Config, +} + +impl Builder { + /// The `LogExporter` that this provider should use. + pub fn with_simple_exporter(self, exporter: T) -> Self { + let mut processors = self.processors; + processors.push(Box::new(SimpleLogProcessor::new(Box::new(exporter)))); + + Builder { processors, ..self } + } + + /// The `LogExporter` setup using a default `BatchLogProcessor` that this provider should use. + pub fn with_batch_exporter>( + self, + exporter: T, + runtime: R, + ) -> Self { + let batch = BatchLogProcessor::builder(exporter, runtime).build(); + self.with_log_processor(batch) + } + + /// The `LogProcessor` that this provider should use. + pub fn with_log_processor(self, processor: T) -> Self { + let mut processors = self.processors; + processors.push(Box::new(processor)); + + Builder { processors, ..self } + } + + /// The `Config` that this provider should use. + pub fn with_config(self, config: Config) -> Self { + Builder { config, ..self } + } + + /// Create a new provider from this configuration. + pub fn build(self) -> LoggerProvider { + LoggerProvider { + inner: Arc::new(LoggerProviderInner { + processors: self.processors, + config: self.config, + }), + } + } +} + +#[derive(Debug)] +/// The object for emitting [`LogRecord`]s. +/// +/// [`LogRecord`]: opentelemetry_api::logs::LogRecord +pub struct Logger { + instrumentation_lib: Arc, + provider: Weak, +} + +impl Logger { + pub(crate) fn new( + instrumentation_lib: Arc, + provider: Weak, + ) -> Self { + Logger { + instrumentation_lib, + provider, + } + } + + /// LoggerProvider associated with this logger. + pub fn provider(&self) -> Option { + self.provider.upgrade().map(LoggerProvider::new) + } + + /// Instrumentation library information of this logger. + pub fn instrumentation_library(&self) -> &InstrumentationLibrary { + &self.instrumentation_lib + } +} + +impl opentelemetry_api::logs::Logger for Logger { + /// Emit a `LogRecord`. + fn emit(&self, record: LogRecord) { + let provider = match self.provider() { + Some(provider) => provider, + None => return, + }; + let trace_context = Context::map_current(|cx| { + cx.has_active_span() + .then(|| TraceContext::from(cx.span().span_context())) + }); + let config = provider.config(); + for processor in provider.log_processors() { + let mut record = record.clone(); + if let Some(ref trace_context) = trace_context { + record.trace_context = Some(trace_context.clone()) + } + let data = LogData { + record, + resource: config.resource.clone(), + instrumentation: self.instrumentation_library().clone(), + }; + processor.emit(data); + } + } + + #[cfg(feature = "logs_level_enabled")] + fn event_enabled(&self, level: Severity, target: &str) -> bool { + let provider = match self.provider() { + Some(provider) => provider, + None => return false, + }; + + let mut enabled = false; + for processor in provider.log_processors() { + enabled = enabled + || processor.event_enabled( + level, + target, + self.instrumentation_library().name.as_ref(), + ); + } + enabled + } +} diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/logs/log_processor.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/logs/log_processor.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/logs/log_processor.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/logs/log_processor.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,383 @@ +use crate::{ + export::logs::{ExportResult, LogData, LogExporter}, + runtime::{RuntimeChannel, TrySend}, +}; +use futures_channel::oneshot; +use futures_util::{ + future::{self, Either}, + {pin_mut, stream, StreamExt as _}, +}; +#[cfg(feature = "logs_level_enabled")] +use opentelemetry_api::logs::Severity; +use opentelemetry_api::{ + global, + logs::{LogError, LogResult}, +}; +use std::thread; +use std::{ + fmt::{self, Debug, Formatter}, + time::Duration, +}; + +/// The interface for plugging into a [`Logger`]. +/// +/// [`Logger`]: crate::logs::Logger +pub trait LogProcessor: Send + Sync + Debug { + /// Called when a log record is ready to processed and exported. + fn emit(&self, data: LogData); + /// Force the logs lying in the cache to be exported. + fn force_flush(&self) -> LogResult<()>; + /// Shuts down the processor. + fn shutdown(&mut self) -> LogResult<()>; + #[cfg(feature = "logs_level_enabled")] + /// Check if logging is enabled + fn event_enabled(&self, level: Severity, target: &str, name: &str) -> bool; +} + +/// A [`LogProcessor`] that exports synchronously when logs are emitted. +/// +/// # Examples +/// +/// Note that the simple processor exports synchronously every time a log is +/// emitted. If you find this limiting, consider the batch processor instead. +#[derive(Debug)] +pub struct SimpleLogProcessor { + sender: crossbeam_channel::Sender>, + shutdown: crossbeam_channel::Receiver<()>, +} + +impl SimpleLogProcessor { + pub(crate) fn new(mut exporter: Box) -> Self { + let (log_tx, log_rx) = crossbeam_channel::unbounded(); + let (shutdown_tx, shutdown_rx) = crossbeam_channel::bounded(0); + + let _ = thread::Builder::new() + .name("opentelemetry-log-exporter".to_string()) + .spawn(move || { + while let Ok(Some(log)) = log_rx.recv() { + if let Err(err) = futures_executor::block_on(exporter.export(vec![log])) { + global::handle_error(err); + } + } + + exporter.shutdown(); + + if let Err(err) = shutdown_tx.send(()) { + global::handle_error(LogError::from(format!( + "could not send shutdown: {:?}", + err + ))); + } + }); + + SimpleLogProcessor { + sender: log_tx, + shutdown: shutdown_rx, + } + } +} + +impl LogProcessor for SimpleLogProcessor { + fn emit(&self, data: LogData) { + if let Err(err) = self.sender.send(Some(data)) { + global::handle_error(LogError::from(format!("error processing log {:?}", err))); + } + } + + fn force_flush(&self) -> LogResult<()> { + // Ignored since all logs in Simple Processor will be exported as they ended. + Ok(()) + } + + fn shutdown(&mut self) -> LogResult<()> { + if self.sender.send(None).is_ok() { + if let Err(err) = self.shutdown.recv() { + global::handle_error(LogError::from(format!( + "error shutting down log processor: {:?}", + err + ))) + } + } + Ok(()) + } + + #[cfg(feature = "logs_level_enabled")] + fn event_enabled(&self, _level: Severity, _target: &str, _name: &str) -> bool { + true + } +} + +/// A [`LogProcessor`] that asynchronously buffers log records and reports +/// them at a preconfigured interval. +pub struct BatchLogProcessor> { + message_sender: R::Sender, +} + +impl> Debug for BatchLogProcessor { + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + f.debug_struct("BatchLogProcessor") + .field("message_sender", &self.message_sender) + .finish() + } +} + +impl> LogProcessor for BatchLogProcessor { + fn emit(&self, data: LogData) { + let result = self.message_sender.try_send(BatchMessage::ExportLog(data)); + + if let Err(err) = result { + global::handle_error(LogError::Other(err.into())); + } + } + + #[cfg(feature = "logs_level_enabled")] + fn event_enabled(&self, _level: Severity, _target: &str, _name: &str) -> bool { + true + } + + fn force_flush(&self) -> LogResult<()> { + let (res_sender, res_receiver) = oneshot::channel(); + self.message_sender + .try_send(BatchMessage::Flush(Some(res_sender))) + .map_err(|err| LogError::Other(err.into()))?; + + futures_executor::block_on(res_receiver) + .map_err(|err| LogError::Other(err.into())) + .and_then(std::convert::identity) + } + + fn shutdown(&mut self) -> LogResult<()> { + let (res_sender, res_receiver) = oneshot::channel(); + self.message_sender + .try_send(BatchMessage::Shutdown(res_sender)) + .map_err(|err| LogError::Other(err.into()))?; + + futures_executor::block_on(res_receiver) + .map_err(|err| LogError::Other(err.into())) + .and_then(std::convert::identity) + } +} + +impl> BatchLogProcessor { + pub(crate) fn new(mut exporter: Box, config: BatchConfig, runtime: R) -> Self { + let (message_sender, message_receiver) = + runtime.batch_message_channel(config.max_queue_size); + let ticker = runtime + .interval(config.scheduled_delay) + .map(|_| BatchMessage::Flush(None)); + let timeout_runtime = runtime.clone(); + + // Spawn worker process via user-defined spawn function. + runtime.spawn(Box::pin(async move { + let mut logs = Vec::new(); + let mut messages = Box::pin(stream::select(message_receiver, ticker)); + + while let Some(message) = messages.next().await { + match message { + // Log has finished, add to buffer of pending logs. + BatchMessage::ExportLog(log) => { + logs.push(log); + + if logs.len() == config.max_export_batch_size { + let result = export_with_timeout( + config.max_export_timeout, + exporter.as_mut(), + &timeout_runtime, + logs.split_off(0), + ) + .await; + + if let Err(err) = result { + global::handle_error(err); + } + } + } + // Log batch interval time reached or a force flush has been invoked, export current spans. + BatchMessage::Flush(res_channel) => { + let result = export_with_timeout( + config.max_export_timeout, + exporter.as_mut(), + &timeout_runtime, + logs.split_off(0), + ) + .await; + + if let Some(channel) = res_channel { + if let Err(result) = channel.send(result) { + global::handle_error(LogError::from(format!( + "failed to send flush result: {:?}", + result + ))); + } + } else if let Err(err) = result { + global::handle_error(err); + } + } + // Stream has terminated or processor is shutdown, return to finish execution. + BatchMessage::Shutdown(ch) => { + let result = export_with_timeout( + config.max_export_timeout, + exporter.as_mut(), + &timeout_runtime, + logs.split_off(0), + ) + .await; + + exporter.shutdown(); + + if let Err(result) = ch.send(result) { + global::handle_error(LogError::from(format!( + "failed to send batch processor shutdown result: {:?}", + result + ))); + } + + break; + } + } + } + })); + + // Return batch processor with link to worker + BatchLogProcessor { message_sender } + } + + /// Create a new batch processor builder + pub fn builder(exporter: E, runtime: R) -> BatchLogProcessorBuilder + where + E: LogExporter, + { + BatchLogProcessorBuilder { + exporter, + config: BatchConfig::default(), + runtime, + } + } +} + +async fn export_with_timeout( + time_out: Duration, + exporter: &mut E, + runtime: &R, + batch: Vec, +) -> ExportResult +where + R: RuntimeChannel, + E: LogExporter + ?Sized, +{ + if batch.is_empty() { + return Ok(()); + } + + let export = exporter.export(batch); + let timeout = runtime.delay(time_out); + pin_mut!(export); + pin_mut!(timeout); + match future::select(export, timeout).await { + Either::Left((export_res, _)) => export_res, + Either::Right((_, _)) => ExportResult::Err(LogError::ExportTimedOut(time_out)), + } +} + +/// Batch log processor configuration +#[derive(Debug)] +pub struct BatchConfig { + /// The maximum queue size to buffer logs for delayed processing. If the + /// queue gets full it drops the logs. The default value of is 2048. + max_queue_size: usize, + + /// The delay interval in milliseconds between two consecutive processing + /// of batches. The default value is 1 second. + scheduled_delay: Duration, + + /// The maximum number of logs to process in a single batch. If there are + /// more than one batch worth of logs then it processes multiple batches + /// of logs one batch after the other without any delay. The default value + /// is 512. + max_export_batch_size: usize, + + /// The maximum duration to export a batch of data. + max_export_timeout: Duration, +} + +impl Default for BatchConfig { + fn default() -> Self { + BatchConfig { + max_queue_size: 2_048, + scheduled_delay: Duration::from_millis(1_000), + max_export_batch_size: 512, + max_export_timeout: Duration::from_millis(30_000), + } + } +} + +/// A builder for creating [`BatchLogProcessor`] instances. +/// +#[derive(Debug)] +pub struct BatchLogProcessorBuilder { + exporter: E, + config: BatchConfig, + runtime: R, +} + +impl BatchLogProcessorBuilder +where + E: LogExporter + 'static, + R: RuntimeChannel, +{ + /// Set max queue size for batches + pub fn with_max_queue_size(self, size: usize) -> Self { + let mut config = self.config; + config.max_queue_size = size; + + BatchLogProcessorBuilder { config, ..self } + } + + /// Set scheduled delay for batches + pub fn with_scheduled_delay(self, delay: Duration) -> Self { + let mut config = self.config; + config.scheduled_delay = delay; + + BatchLogProcessorBuilder { config, ..self } + } + + /// Set max timeout for exporting. + pub fn with_max_timeout(self, timeout: Duration) -> Self { + let mut config = self.config; + config.max_export_timeout = timeout; + + BatchLogProcessorBuilder { config, ..self } + } + + /// Set max export size for batches, should always less than or equals to max queue size. + /// + /// If input is larger than max queue size, will lower it to be equal to max queue size + pub fn with_max_export_batch_size(self, size: usize) -> Self { + let mut config = self.config; + if size > config.max_queue_size { + config.max_export_batch_size = config.max_queue_size; + } else { + config.max_export_batch_size = size; + } + + BatchLogProcessorBuilder { config, ..self } + } + + /// Build a batch processor + pub fn build(self) -> BatchLogProcessor { + BatchLogProcessor::new(Box::new(self.exporter), self.config, self.runtime) + } +} + +/// Messages sent between application thread and batch log processor's work thread. +#[allow(clippy::large_enum_variant)] +#[derive(Debug)] +pub enum BatchMessage { + /// Export logs, usually called when the log is emitted. + ExportLog(LogData), + /// Flush the current buffer to the backend, it can be triggered by + /// pre configured interval or a call to `force_push` function. + Flush(Option>), + /// Shut down the worker thread, push all logs in buffer to the backend. + Shutdown(oneshot::Sender), +} diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/logs/mod.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/logs/mod.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/logs/mod.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/logs/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,12 @@ +//! # OpenTelemetry Log SDK + +mod config; +mod log_emitter; +mod log_processor; + +pub use config::Config; +pub use log_emitter::{Builder, Logger, LoggerProvider}; +pub use log_processor::{ + BatchConfig, BatchLogProcessor, BatchLogProcessorBuilder, BatchMessage, LogProcessor, + SimpleLogProcessor, +}; diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/aggregation.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/aggregation.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/aggregation.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/aggregation.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,101 @@ +use std::fmt; + +use opentelemetry_api::metrics::{MetricsError, Result}; + +/// The way recorded measurements are summarized. +#[derive(Clone, Debug, PartialEq)] +#[non_exhaustive] +pub enum Aggregation { + /// An aggregation that drops all recorded data. + Drop, + + /// An aggregation that uses the default instrument kind selection mapping to + /// select another aggregation. + /// + /// A metric reader can be configured to make an aggregation selection based on + /// instrument kind that differs from the default. This aggregation ensures the + /// default is used. + /// + /// See the [DefaultAggregationSelector] for information about the default + /// instrument kind selection mapping. + /// + /// [DefaultAggregationSelector]: crate::metrics::reader::DefaultAggregationSelector + Default, + + /// An aggregation that summarizes a set of measurements as their arithmetic + /// sum. + Sum, + + /// An aggregation that summarizes a set of measurements as the last one made. + LastValue, + + /// An aggregation that summarizes a set of measurements as an histogram with + /// explicitly defined buckets. + ExplicitBucketHistogram { + /// The increasing bucket boundary values. + /// + /// Boundary values define bucket upper bounds. Buckets are exclusive of their + /// lower boundary and inclusive of their upper bound (except at positive + /// infinity). A measurement is defined to fall into the greatest-numbered + /// bucket with a boundary that is greater than or equal to the measurement. As + /// an example, boundaries defined as: + /// + /// vec![0.0, 5.0, 10.0, 25.0, 50.0, 75.0, 100.0, 250.0, 500.0, 1000.0]; + /// + /// Will define these buckets: + /// + /// (-∞, 0], (0, 5.0], (5.0, 10.0], (10.0, 25.0], (25.0, 50.0], (50.0, 75.0], + /// (75.0, 100.0], (100.0, 250.0], (250.0, 500.0], (500.0, 1000.0], (1000.0, +∞) + boundaries: Vec, + + /// Indicates whether to not record the min and max of the distribution. + /// + /// By default, these values are recorded. + /// + /// Recording these values for cumulative data is expected to have little + /// value, they will represent the entire life of the instrument instead of + /// just the current collection cycle. It is recommended to set this to + /// `false` for that type of data to avoid computing the low-value + /// instances. + record_min_max: bool, + }, +} + +impl fmt::Display for Aggregation { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + // used for stream id comparisons + let name = match self { + Aggregation::Drop => "Drop", + Aggregation::Default => "Default", + Aggregation::Sum => "Sum", + Aggregation::LastValue => "LastValue", + Aggregation::ExplicitBucketHistogram { .. } => "ExplicitBucketHistogram", + }; + + f.write_str(name) + } +} + +impl Aggregation { + /// Validate that this aggregation has correct configuration + pub fn validate(&self) -> Result<()> { + match self { + Aggregation::Drop => Ok(()), + Aggregation::Default => Ok(()), + Aggregation::Sum => Ok(()), + Aggregation::LastValue => Ok(()), + Aggregation::ExplicitBucketHistogram { boundaries, .. } => { + for x in boundaries.windows(2) { + if x[0] >= x[1] { + return Err(MetricsError::Config(format!( + "aggregation: explicit bucket histogram: non-monotonic boundaries: {:?}", + boundaries, + ))); + } + } + + Ok(()) + } + } + } +} diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/aggregators/ddsketch.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/aggregators/ddsketch.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/aggregators/ddsketch.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/aggregators/ddsketch.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,877 +0,0 @@ -//! DDSketch quantile sketch with relative-error guarantees. -//! DDSketch is a fast and fully-mergeable quantile sketch with relative-error guarantees. -//! -//! The main difference between this approach and previous art is DDSKetch employ a new method to -//! compute the error. Traditionally, the error rate of one sketch is evaluated by rank accuracy, -//! which can still generate a relative large variance if the dataset has long tail. -//! -//! DDSKetch, on the contrary, employs relative error rate that could work well on long tail dataset. -//! -//! The detail of this algorithm can be found in - -use std::{ - any::Any, - cmp::Ordering, - mem, - ops::AddAssign, - sync::{Arc, RwLock}, -}; - -use crate::export::metrics::{Aggregator, Count, Max, Min, MinMaxSumCount, Sum}; -use opentelemetry_api::metrics::{Descriptor, MetricsError, Number, NumberKind, Result}; - -const INITIAL_NUM_BINS: usize = 128; -const GROW_LEFT_BY: i64 = 128; - -const DEFAULT_MAX_NUM_BINS: i64 = 2048; -const DEFAULT_ALPHA: f64 = 0.01; -const DEFAULT_MIN_BOUNDARY: f64 = 1.0e-9; - -/// An aggregator to calculate quantile -pub fn ddsketch(config: &DdSketchConfig, kind: NumberKind) -> DdSketchAggregator { - DdSketchAggregator::new(config, kind) -} - -/// DDSKetch quantile sketch algorithm -/// -/// It can give q-quantiles with α-accurate for any 0<=q<=1. -/// -/// Here the accurate is calculated based on relative-error rate. Thus, the error guarantee adapts the scale of the output data. With relative error guarantee, the histogram can be more accurate in the area of low data density. For example, the long tail of response time data. -/// -/// For example, if the actual percentile is 1 second, and relative-error guarantee -/// is 2%, then the value should within the range of 0.98 to 1.02 -/// second. But if the actual percentile is 1 millisecond, with the same relative-error -/// guarantee, the value returned should within the range of 0.98 to 1.02 millisecond. -/// -/// In order to support both negative and positive inputs, DDSketchAggregator has two DDSketch store within itself to store the negative and positive inputs. -#[derive(Debug)] -pub struct DdSketchAggregator { - inner: RwLock, -} - -impl DdSketchAggregator { - /// Create a new DDSKetchAggregator that would yield a quantile with relative error rate less - /// than `alpha` - /// - /// The input should have a granularity larger than `key_epsilon` - pub fn new(config: &DdSketchConfig, kind: NumberKind) -> DdSketchAggregator { - DdSketchAggregator { - inner: RwLock::new(Inner::new(config, kind)), - } - } -} - -impl Default for DdSketchAggregator { - fn default() -> Self { - DdSketchAggregator::new( - &DdSketchConfig::new(DEFAULT_ALPHA, DEFAULT_MAX_NUM_BINS, DEFAULT_MIN_BOUNDARY), - NumberKind::F64, - ) - } -} - -impl Sum for DdSketchAggregator { - fn sum(&self) -> Result { - self.inner - .read() - .map_err(From::from) - .map(|inner| inner.sum.clone()) - } -} - -impl Min for DdSketchAggregator { - fn min(&self) -> Result { - self.inner - .read() - .map_err(From::from) - .map(|inner| inner.min_value.clone()) - } -} - -impl Max for DdSketchAggregator { - fn max(&self) -> Result { - self.inner - .read() - .map_err(From::from) - .map(|inner| inner.max_value.clone()) - } -} - -impl Count for DdSketchAggregator { - fn count(&self) -> Result { - self.inner - .read() - .map_err(From::from) - .map(|inner| inner.count()) - } -} - -impl MinMaxSumCount for DdSketchAggregator {} - -impl Aggregator for DdSketchAggregator { - fn update(&self, number: &Number, descriptor: &Descriptor) -> Result<()> { - self.inner - .write() - .map_err(From::from) - .map(|mut inner| inner.add(number, descriptor.number_kind())) - } - - fn synchronized_move( - &self, - destination: &Arc<(dyn Aggregator + Send + Sync)>, - descriptor: &Descriptor, - ) -> Result<()> { - if let Some(other) = destination.as_any().downcast_ref::() { - other - .inner - .write() - .map_err(From::from) - .and_then(|mut other| { - self.inner.write().map_err(From::from).map(|mut inner| { - let kind = descriptor.number_kind(); - other.max_value = mem::replace(&mut inner.max_value, kind.zero()); - other.min_value = mem::replace(&mut inner.min_value, kind.zero()); - other.key_epsilon = mem::take(&mut inner.key_epsilon); - other.offset = mem::take(&mut inner.offset); - other.gamma = mem::take(&mut inner.gamma); - other.gamma_ln = mem::take(&mut inner.gamma_ln); - other.positive_store = mem::take(&mut inner.positive_store); - other.negative_store = mem::take(&mut inner.negative_store); - other.sum = mem::replace(&mut inner.sum, kind.zero()); - }) - }) - } else { - Err(MetricsError::InconsistentAggregator(format!( - "Expected {:?}, got: {:?}", - self, destination - ))) - } - } - - fn merge( - &self, - other: &(dyn Aggregator + Send + Sync), - _descriptor: &Descriptor, - ) -> Result<()> { - if let Some(other) = other.as_any().downcast_ref::() { - self.inner.write() - .map_err(From::from) - .and_then(|mut inner| { - other.inner.read() - .map_err(From::from) - .and_then(|other| { - // assert that it can merge - if inner.positive_store.max_num_bins != other.positive_store.max_num_bins { - return Err(MetricsError::InconsistentAggregator(format!( - "When merging two DDSKetchAggregators, their max number of bins must be the same. Expect max number of bins to be {:?}, but get {:?}", inner.positive_store.max_num_bins, other.positive_store.max_num_bins - ))); - } - if inner.negative_store.max_num_bins != other.negative_store.max_num_bins { - return Err(MetricsError::InconsistentAggregator(format!( - "When merging two DDSKetchAggregators, their max number of bins must be the same. Expect max number of bins to be {:?}, but get {:?}", inner.negative_store.max_num_bins, other.negative_store.max_num_bins - ))); - } - - - if (inner.gamma - other.gamma).abs() > std::f64::EPSILON { - return Err(MetricsError::InconsistentAggregator(format!( - "When merging two DDSKetchAggregators, their gamma must be the same. Expect max number of bins to be {:?}, but get {:?}", inner.gamma, other.gamma - ))); - } - - if other.count() == 0 { - return Ok(()); - } - - if inner.count() == 0 { - inner.positive_store.merge(&other.positive_store); - inner.negative_store.merge(&other.negative_store); - inner.sum = other.sum.clone(); - inner.min_value = other.min_value.clone(); - inner.max_value = other.max_value.clone(); - return Ok(()); - } - - inner.positive_store.merge(&other.positive_store); - inner.negative_store.merge(&other.negative_store); - - inner.sum = match inner.kind { - NumberKind::F64 => - Number::from(inner.sum.to_f64(&inner.kind) + other.sum.to_f64(&other.kind)), - NumberKind::U64 => Number::from(inner.sum.to_u64(&inner.kind) + other.sum.to_u64(&other.kind)), - NumberKind::I64 => Number::from(inner.sum.to_i64(&inner.kind) + other.sum.to_i64(&other.kind)) - }; - - if inner.min_value.partial_cmp(&inner.kind, &other.min_value) == Some(Ordering::Greater) { - inner.min_value = other.min_value.clone(); - }; - - if inner.max_value.partial_cmp(&inner.kind, &other.max_value) == Some(Ordering::Less) { - inner.max_value = other.max_value.clone(); - } - - Ok(()) - }) - }) - } else { - Err(MetricsError::InconsistentAggregator(format!( - "Expected {:?}, got: {:?}", - self, other - ))) - } - } - - fn as_any(&self) -> &dyn Any { - self - } -} - -/// DDSKetch Configuration. -#[derive(Debug)] -pub struct DdSketchConfig { - alpha: f64, - max_num_bins: i64, - key_epsilon: f64, -} - -impl DdSketchConfig { - /// Create a new DDSKetch config - pub fn new(alpha: f64, max_num_bins: i64, key_epsilon: f64) -> Self { - DdSketchConfig { - alpha, - max_num_bins, - key_epsilon, - } - } -} - -/// DDSKetch implementation. -/// -/// Note that Inner is not thread-safe. All operation should be protected by a lock or other -/// synchronization. -/// -/// Inner will also convert all Number into actual primitive type and back. -/// -/// According to the paper, the DDSKetch only support positive number. Inner support -/// either positive or negative number. But cannot yield actual result when input has -/// both positive and negative number. -#[derive(Debug)] -struct Inner { - positive_store: Store, - negative_store: Store, - kind: NumberKind, - // sum of all value within store - sum: Number, - // γ = (1 + α)/(1 - α) - gamma: f64, - // ln(γ) - gamma_ln: f64, - // The epsilon when map value to bin key. Any value between [-key_epsilon, key_epsilon] will - // be mapped to bin key 0. Must be a positive number. - key_epsilon: f64, - // offset is here to ensure that keys for positive numbers that are larger than min_value are - // greater than or equal to 1 while the keys for negative numbers are less than or equal to -1. - offset: i64, - - // minimum number that in store. - min_value: Number, - // maximum number that in store. - max_value: Number, -} - -impl Inner { - fn new(config: &DdSketchConfig, kind: NumberKind) -> Inner { - let gamma: f64 = 1.0 + 2.0 * config.alpha / (1.0 - config.alpha); - let mut inner = Inner { - positive_store: Store::new(config.max_num_bins / 2), - negative_store: Store::new(config.max_num_bins / 2), - min_value: kind.max(), - max_value: kind.min(), - sum: kind.zero(), - gamma, - gamma_ln: gamma.ln(), - key_epsilon: config.key_epsilon, - offset: 0, - kind, - }; - // reset offset based on key_epsilon - inner.offset = -(inner.log_gamma(inner.key_epsilon)).ceil() as i64 + 1i64; - inner - } - - fn add(&mut self, v: &Number, kind: &NumberKind) { - let key = self.key(v, kind); - match v.partial_cmp(kind, &Number::from(0.0)) { - Some(Ordering::Greater) | Some(Ordering::Equal) => { - self.positive_store.add(key); - } - Some(Ordering::Less) => { - self.negative_store.add(key); - } - _ => { - // if return none. Do nothing and return - return; - } - } - - // update min and max - if self.min_value.partial_cmp(&self.kind, v) == Some(Ordering::Greater) { - self.min_value = v.clone(); - } - - if self.max_value.partial_cmp(&self.kind, v) == Some(Ordering::Less) { - self.max_value = v.clone(); - } - - match &self.kind { - NumberKind::I64 => { - self.sum = Number::from(self.sum.to_i64(&self.kind) + v.to_i64(kind)); - } - NumberKind::U64 => { - self.sum = Number::from(self.sum.to_u64(&self.kind) + v.to_u64(kind)); - } - NumberKind::F64 => { - self.sum = Number::from(self.sum.to_f64(&self.kind) + v.to_f64(kind)); - } - } - } - - fn key(&self, num: &Number, kind: &NumberKind) -> i64 { - if num.to_f64(kind) < -self.key_epsilon { - let positive_num = match kind { - NumberKind::F64 => Number::from(-num.to_f64(kind)), - NumberKind::U64 => Number::from(num.to_u64(kind)), - NumberKind::I64 => Number::from(-num.to_i64(kind)), - }; - (-self.log_gamma(positive_num.to_f64(kind)).ceil()) as i64 - self.offset - } else if num.to_f64(kind) > self.key_epsilon { - self.log_gamma(num.to_f64(kind)).ceil() as i64 + self.offset - } else { - 0i64 - } - } - - /// get the index of the bucket based on num - fn log_gamma(&self, num: f64) -> f64 { - num.ln() / self.gamma_ln - } - - fn count(&self) -> u64 { - self.negative_store.count + self.positive_store.count - } -} - -#[derive(Debug)] -struct Store { - bins: Vec, - count: u64, - min_key: i64, - max_key: i64, - // maximum number of bins Store can have. - // In the worst case, the bucket can grow as large as the number of the elements inserted into. - // max_num_bins helps control the number of bins. - max_num_bins: i64, -} - -impl Default for Store { - fn default() -> Self { - Store { - bins: vec![0; INITIAL_NUM_BINS], - count: 0, - min_key: 0, - max_key: 0, - max_num_bins: DEFAULT_MAX_NUM_BINS, - } - } -} - -/// DDSKetchInner stores the data -impl Store { - fn new(max_num_bins: i64) -> Store { - Store { - bins: vec![ - 0; - if max_num_bins as usize > INITIAL_NUM_BINS { - INITIAL_NUM_BINS - } else { - max_num_bins as usize - } - ], - count: 0u64, - min_key: 0i64, - max_key: 0i64, - max_num_bins, - } - } - - /// Add count based on key. - /// - /// If key is not in [min_key, max_key], we will expand to left or right - /// - /// - /// The bins are essentially working in a round-robin fashion where we can use all space in bins - /// to represent any continuous space within length. That's why we need to offset the key - /// with `min_key` so that we get the actual bin index. - fn add(&mut self, key: i64) { - if self.count == 0 { - self.max_key = key; - self.min_key = key - self.bins.len() as i64 + 1 - } - - if key < self.min_key { - self.grow_left(key) - } else if key > self.max_key { - self.grow_right(key) - } - let idx = if key - self.min_key < 0 { - 0 - } else { - key - self.min_key - }; - // we unwrap here because grow_left or grow_right will make sure the idx is less than vector size - let bin_count = self.bins.get_mut(idx as usize).unwrap(); - *bin_count += 1; - self.count += 1; - } - - fn grow_left(&mut self, key: i64) { - if self.min_key < key || self.bins.len() >= self.max_num_bins as usize { - return; - } - - let min_key = if self.max_key - key >= self.max_num_bins { - self.max_key - self.max_num_bins + 1 - } else { - let mut min_key = self.min_key; - while min_key > key { - min_key -= GROW_LEFT_BY; - } - min_key - }; - - // The new vector will contain three parts. - // First part is all 0, which is the part expended - // Second part is from existing bins. - // Third part is what's left. - let expected_len = (self.max_key - min_key + 1) as usize; - let mut new_bins = vec![0u64; expected_len]; - let old_bin_slice = &mut new_bins[(self.min_key - min_key) as usize..]; - old_bin_slice.copy_from_slice(&self.bins); - - self.bins = new_bins; - self.min_key = min_key; - } - - fn grow_right(&mut self, key: i64) { - if self.max_key > key { - return; - } - - if key - self.max_key >= self.max_num_bins { - // if currently key minus currently max key is larger than maximum number of bins. - // Move all elements in current bins into the first bin - self.bins = vec![0; self.max_num_bins as usize]; - self.max_key = key; - self.min_key = key - self.max_num_bins + 1; - self.bins.get_mut(0).unwrap().add_assign(self.count); - } else if key - self.min_key >= self.max_num_bins { - let min_key = key - self.max_num_bins + 1; - let upper_bound = if min_key < self.max_key + 1 { - min_key - } else { - self.max_key + 1 - } - self.min_key; - let n = self.bins.iter().take(upper_bound as usize).sum::(); - - if self.bins.len() < self.max_num_bins as usize { - let mut new_bins = vec![0; self.max_num_bins as usize]; - new_bins[0..self.bins.len() - (min_key - self.min_key) as usize] - .as_mut() - .copy_from_slice(&self.bins[(min_key - self.min_key) as usize..]); - self.bins = new_bins; - } else { - // bins length is equal to max number of bins - self.bins.drain(0..(min_key - self.min_key) as usize); - if self.max_num_bins > self.max_key - min_key + 1 { - self.bins.resize( - self.bins.len() - + (self.max_num_bins - (self.max_key - min_key + 1)) as usize, - 0, - ) - } - } - self.max_key = key; - self.min_key = min_key; - self.bins.get_mut(0).unwrap().add_assign(n); - } else { - let mut new_bin = vec![0; (key - self.min_key + 1) as usize]; - new_bin[0..self.bins.len()] - .as_mut() - .copy_from_slice(&self.bins); - self.bins = new_bin; - self.max_key = key; - } - } - - /// Merge two stores - fn merge(&mut self, other: &Store) { - if self.count == 0 { - return; - } - if other.count == 0 { - self.bins = other.bins.clone(); - self.min_key = other.min_key; - self.max_key = other.max_key; - self.count = other.count; - } - - if self.max_key > other.max_key { - if other.min_key < self.min_key { - self.grow_left(other.min_key); - } - let start = if other.min_key > self.min_key { - other.min_key - } else { - self.min_key - } as usize; - for i in start..other.max_key as usize { - self.bins[i - self.min_key as usize] = other.bins[i - other.min_key as usize]; - } - let mut n = 0; - for i in other.min_key as usize..self.min_key as usize { - n += other.bins[i - other.min_key as usize] - } - self.bins[0] += n; - } else if other.min_key < self.min_key { - let mut tmp_bins = vec![0u64; other.bins.len()]; - tmp_bins.as_mut_slice().copy_from_slice(&other.bins); - - for i in self.min_key as usize..self.max_key as usize { - tmp_bins[i - other.min_key as usize] += self.bins[i - self.min_key as usize]; - } - - self.bins = tmp_bins; - self.max_key = other.max_key; - self.min_key = other.min_key; - } else { - self.grow_right(other.max_key); - for i in other.min_key as usize..(other.max_key + 1) as usize { - self.bins[i - self.min_key as usize] += other.bins[i - other.min_key as usize]; - } - } - - self.count += other.count; - } -} - -#[cfg(test)] -mod tests { - use super::*; - use crate::export::metrics::{Aggregator, Count, Max, Min, Sum}; - use opentelemetry_api::metrics::{Descriptor, InstrumentKind, Number, NumberKind}; - use rand_distr::{Distribution, Exp, LogNormal, Normal}; - use std::cmp::Ordering; - use std::sync::Arc; - - const TEST_MAX_BINS: i64 = 1024; - const TEST_ALPHA: f64 = 0.01; - const TEST_KEY_EPSILON: f64 = 1.0e-9; - - // Test utils - - struct Dataset { - data: Vec, - kind: NumberKind, - } - - impl Dataset { - fn from_f64_vec(data: Vec) -> Dataset { - Dataset { - data: data.into_iter().map(Number::from).collect::>(), - kind: NumberKind::F64, - } - } - - fn from_u64_vec(data: Vec) -> Dataset { - Dataset { - data: data.into_iter().map(Number::from).collect::>(), - kind: NumberKind::U64, - } - } - - fn from_i64_vec(data: Vec) -> Dataset { - Dataset { - data: data.into_iter().map(Number::from).collect::>(), - kind: NumberKind::I64, - } - } - - fn sum(&self) -> Number { - match self.kind { - NumberKind::F64 => { - Number::from(self.data.iter().map(|e| e.to_f64(&self.kind)).sum::()) - } - NumberKind::U64 => { - Number::from(self.data.iter().map(|e| e.to_u64(&self.kind)).sum::()) - } - NumberKind::I64 => { - Number::from(self.data.iter().map(|e| e.to_i64(&self.kind)).sum::()) - } - } - } - } - - fn generate_linear_dataset_f64(start: f64, step: f64, num: usize) -> Vec { - let mut vec = Vec::with_capacity(num); - for i in 0..num { - vec.push((start + i as f64 * step) as f64); - } - vec - } - - fn generate_linear_dataset_u64(start: u64, step: u64, num: usize) -> Vec { - let mut vec = Vec::with_capacity(num); - for i in 0..num { - vec.push(start + i as u64 * step); - } - vec - } - - fn generate_linear_dataset_i64(start: i64, step: i64, num: usize) -> Vec { - let mut vec = Vec::with_capacity(num); - for i in 0..num { - vec.push(start + i as i64 * step); - } - vec - } - - /// generate a dataset with normal distribution. Return sorted dataset. - fn generate_normal_dataset(mean: f64, stddev: f64, num: usize) -> Vec { - let normal = Normal::new(mean, stddev).unwrap(); - let mut data = Vec::with_capacity(num); - for _ in 0..num { - data.push(normal.sample(&mut rand::thread_rng())); - } - data.as_mut_slice() - .sort_by(|a, b| a.partial_cmp(b).unwrap()); - data - } - - /// generate a dataset with log normal distribution. Return sorted dataset. - fn generate_log_normal_dataset(mean: f64, stddev: f64, num: usize) -> Vec { - let normal = LogNormal::new(mean, stddev).unwrap(); - let mut data = Vec::with_capacity(num); - for _ in 0..num { - data.push(normal.sample(&mut rand::thread_rng())); - } - data.as_mut_slice() - .sort_by(|a, b| a.partial_cmp(b).unwrap()); - data - } - - fn generate_exponential_dataset(rate: f64, num: usize) -> Vec { - let exponential = Exp::new(rate).unwrap(); - let mut data = Vec::with_capacity(num); - for _ in 0..num { - data.push(exponential.sample(&mut rand::thread_rng())); - } - data.as_mut_slice() - .sort_by(|a, b| a.partial_cmp(b).unwrap()); - data - } - - /// Insert all element of data into ddsketch and assert the quantile result is within the error range. - /// Note that data must be sorted. - fn evaluate_sketch(dataset: Dataset) { - let kind = &dataset.kind; - let ddsketch = DdSketchAggregator::new( - &DdSketchConfig::new(TEST_ALPHA, TEST_MAX_BINS, TEST_KEY_EPSILON), - kind.clone(), - ); - let descriptor = Descriptor::new( - "test".to_string(), - "test", - None, - None, - InstrumentKind::Histogram, - kind.clone(), - ); - - for i in &dataset.data { - let _ = ddsketch.update(i, &descriptor); - } - - assert_eq!( - ddsketch - .min() - .unwrap() - .partial_cmp(kind, dataset.data.get(0).unwrap()), - Some(Ordering::Equal) - ); - assert_eq!( - ddsketch - .max() - .unwrap() - .partial_cmp(kind, dataset.data.last().unwrap()), - Some(Ordering::Equal) - ); - assert_eq!( - ddsketch.sum().unwrap().partial_cmp(kind, &dataset.sum()), - Some(Ordering::Equal) - ); - assert_eq!(ddsketch.count().unwrap(), dataset.data.len() as u64); - } - - // Test basic operation of Store - - /// First set max_num_bins < number of keys, test to see if the store will collapse to left - /// most bin instead of expending beyond the max_num_bins - #[test] - fn test_insert_into_store() { - let mut store = Store::new(200); - for i in -100..1300 { - store.add(i) - } - assert_eq!(store.count, 1400); - assert_eq!(store.bins.len(), 200); - } - - /// Test to see if copy_from_slice will panic because the range size is different in left and right - #[test] - fn test_grow_right() { - let mut store = Store::new(150); - for i in &[-100, -50, 150, -20, 10] { - store.add(*i) - } - assert_eq!(store.count, 5); - } - - /// Test to see if copy_from_slice will panic because the range size is different in left and right - #[test] - fn test_grow_left() { - let mut store = Store::new(150); - for i in &[500, 150, 10] { - store.add(*i) - } - assert_eq!(store.count, 3); - } - - /// Before merge, store1 should hold 300 bins that looks like [201,1,1,1,...], - /// store 2 should hold 200 bins looks like [301,1,1,...] - /// After merge, store 1 should still hold 300 bins with following distribution - /// - /// index [0,0] -> 201 - /// - /// index [1,99] -> 1 - /// - /// index [100, 100] -> 302 - /// - /// index [101, 299] -> 2 - #[test] - fn test_merge_stores() { - let mut store1 = Store::new(300); - let mut store2 = Store::new(200); - for i in 500..1000 { - store1.add(i); - store2.add(i); - } - store1.merge(&store2); - assert_eq!(store1.bins.get(0), Some(&201)); - assert_eq!(&store1.bins[1..100], vec![1u64; 99].as_slice()); - assert_eq!(store1.bins[100], 302); - assert_eq!(&store1.bins[101..], vec![2u64; 199].as_slice()); - assert_eq!(store1.count, 1000); - } - - // Test ddsketch with different distribution - - #[test] - fn test_linear_distribution() { - // test u64 - let mut dataset = Dataset::from_u64_vec(generate_linear_dataset_u64(12, 3, 5000)); - evaluate_sketch(dataset); - - // test i64 - dataset = Dataset::from_i64_vec(generate_linear_dataset_i64(-12, 3, 5000)); - evaluate_sketch(dataset); - - // test f64 - dataset = Dataset::from_f64_vec(generate_linear_dataset_f64(-12.0, 3.0, 5000)); - evaluate_sketch(dataset); - } - - #[test] - fn test_normal_distribution() { - let mut dataset = Dataset::from_f64_vec(generate_normal_dataset(150.0, 1.2, 100)); - evaluate_sketch(dataset); - - dataset = Dataset::from_f64_vec(generate_normal_dataset(-30.0, 4.4, 100)); - evaluate_sketch(dataset); - } - - #[test] - fn test_log_normal_distribution() { - let dataset = Dataset::from_f64_vec(generate_log_normal_dataset(120.0, 0.5, 100)); - evaluate_sketch(dataset); - } - - #[test] - fn test_exponential_distribution() { - let dataset = Dataset::from_f64_vec(generate_exponential_dataset(2.0, 500)); - evaluate_sketch(dataset); - } - - // Test Aggregator operation of DDSketch - #[test] - fn test_synchronized_move() { - let dataset = Dataset::from_f64_vec(generate_normal_dataset(1.0, 3.5, 100)); - let kind = &dataset.kind; - let ddsketch = DdSketchAggregator::new( - &DdSketchConfig::new(TEST_ALPHA, TEST_MAX_BINS, TEST_KEY_EPSILON), - kind.clone(), - ); - let descriptor = Descriptor::new( - "test".to_string(), - "test", - None, - None, - InstrumentKind::Histogram, - kind.clone(), - ); - for i in &dataset.data { - let _ = ddsketch.update(i, &descriptor); - } - let expected_sum = ddsketch.sum().unwrap().to_f64(&NumberKind::F64); - let expected_count = ddsketch.count().unwrap(); - let expected_min = ddsketch.min().unwrap().to_f64(&NumberKind::F64); - let expected_max = ddsketch.max().unwrap().to_f64(&NumberKind::F64); - - let moved_ddsketch: Arc<(dyn Aggregator + Send + Sync)> = - Arc::new(DdSketchAggregator::new( - &DdSketchConfig::new(TEST_ALPHA, TEST_MAX_BINS, TEST_KEY_EPSILON), - NumberKind::F64, - )); - ddsketch - .synchronized_move(&moved_ddsketch, &descriptor) - .expect("Fail to sync move"); - let moved_ddsketch = moved_ddsketch - .as_any() - .downcast_ref::() - .expect("Fail to cast dyn Aggregator down to DDSketchAggregator"); - - // assert sum, max, min and count - assert!( - (moved_ddsketch.max().unwrap().to_f64(&NumberKind::F64) - expected_max).abs() - < std::f64::EPSILON - ); - assert!( - (moved_ddsketch.min().unwrap().to_f64(&NumberKind::F64) - expected_min).abs() - < std::f64::EPSILON - ); - assert!( - (moved_ddsketch.sum().unwrap().to_f64(&NumberKind::F64) - expected_sum).abs() - < std::f64::EPSILON - ); - assert_eq!(moved_ddsketch.count().unwrap(), expected_count); - } -} diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/aggregators/histogram.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/aggregators/histogram.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/aggregators/histogram.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/aggregators/histogram.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,168 +0,0 @@ -use crate::export::metrics::aggregation::{ - Aggregation, AggregationKind, Buckets, Count, Histogram, Sum, -}; -use crate::metrics::{ - aggregators::Aggregator, - sdk_api::{AtomicNumber, Descriptor, Number, NumberKind}, -}; -use opentelemetry_api::metrics::{MetricsError, Result}; -use opentelemetry_api::Context; -use std::mem; -use std::sync::{Arc, RwLock}; - -/// Create a new histogram for the given descriptor with the given boundaries -pub fn histogram(boundaries: &[f64]) -> HistogramAggregator { - let mut sorted_boundaries = boundaries.to_owned(); - sorted_boundaries.sort_by(|a, b| a.partial_cmp(b).unwrap()); - let state = State::empty(&sorted_boundaries); - - HistogramAggregator { - inner: RwLock::new(Inner { - boundaries: sorted_boundaries, - state, - }), - } -} - -/// This aggregator observes events and counts them in pre-determined buckets. It -/// also calculates the sum and count of all events. -#[derive(Debug)] -pub struct HistogramAggregator { - inner: RwLock, -} - -#[derive(Debug)] -struct Inner { - boundaries: Vec, - state: State, -} - -#[derive(Debug)] -struct State { - bucket_counts: Vec, - count: AtomicNumber, - sum: AtomicNumber, -} - -impl State { - fn empty(boundaries: &[f64]) -> Self { - State { - bucket_counts: vec![0.0; boundaries.len() + 1], - count: NumberKind::U64.zero().to_atomic(), - sum: NumberKind::U64.zero().to_atomic(), - } - } -} - -impl Sum for HistogramAggregator { - fn sum(&self) -> Result { - self.inner - .read() - .map_err(From::from) - .map(|inner| inner.state.sum.load()) - } -} - -impl Count for HistogramAggregator { - fn count(&self) -> Result { - self.inner - .read() - .map_err(From::from) - .map(|inner| inner.state.count.load().to_u64(&NumberKind::U64)) - } -} - -impl Histogram for HistogramAggregator { - fn histogram(&self) -> Result { - self.inner - .read() - .map_err(From::from) - .map(|inner| Buckets::new(inner.boundaries.clone(), inner.state.bucket_counts.clone())) - } -} - -impl Aggregation for HistogramAggregator { - fn kind(&self) -> &AggregationKind { - &AggregationKind::HISTOGRAM - } -} - -impl Aggregator for HistogramAggregator { - fn aggregation(&self) -> &dyn Aggregation { - self - } - fn update(&self, _cx: &Context, number: &Number, descriptor: &Descriptor) -> Result<()> { - self.inner.write().map_err(From::from).map(|mut inner| { - let kind = descriptor.number_kind(); - let as_float = number.to_f64(kind); - - let mut bucket_id = inner.boundaries.len(); - for (idx, boundary) in inner.boundaries.iter().enumerate() { - if as_float < *boundary { - bucket_id = idx; - break; - } - } - - inner.state.count.fetch_add(&NumberKind::U64, &1u64.into()); - inner.state.sum.fetch_add(kind, number); - inner.state.bucket_counts[bucket_id] += 1.0; - }) - } - - fn synchronized_move( - &self, - other: &Arc, - _descriptor: &Descriptor, - ) -> Result<()> { - if let Some(other) = other.as_any().downcast_ref::() { - self.inner - .write() - .map_err(From::from) - .and_then(|mut inner| { - other.inner.write().map_err(From::from).map(|mut other| { - let empty = State::empty(&inner.boundaries); - other.state = mem::replace(&mut inner.state, empty) - }) - }) - } else { - Err(MetricsError::InconsistentAggregator(format!( - "Expected {:?}, got: {:?}", - self, other - ))) - } - } - - fn merge(&self, other: &(dyn Aggregator + Send + Sync), desc: &Descriptor) -> Result<()> { - if let Some(other) = other.as_any().downcast_ref::() { - self.inner - .write() - .map_err(From::from) - .and_then(|mut inner| { - other.inner.read().map_err(From::from).map(|other| { - inner - .state - .sum - .fetch_add(desc.number_kind(), &other.state.sum.load()); - inner - .state - .count - .fetch_add(&NumberKind::U64, &other.state.count.load()); - - for idx in 0..inner.state.bucket_counts.len() { - inner.state.bucket_counts[idx] += other.state.bucket_counts[idx]; - } - }) - }) - } else { - Err(MetricsError::InconsistentAggregator(format!( - "Expected {:?}, got: {:?}", - self, other - ))) - } - } - - fn as_any(&self) -> &dyn std::any::Any { - self - } -} diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/aggregators/last_value.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/aggregators/last_value.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/aggregators/last_value.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/aggregators/last_value.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,118 +0,0 @@ -use crate::export::metrics::aggregation::{Aggregation, AggregationKind, LastValue}; -use crate::metrics::{ - aggregators::Aggregator, - sdk_api::{Descriptor, Number}, -}; -use opentelemetry_api::metrics::{MetricsError, Result}; -use opentelemetry_api::Context; -use std::any::Any; -use std::sync::{Arc, Mutex}; -use std::time::SystemTime; - -/// Create a new `LastValueAggregator` -pub fn last_value() -> LastValueAggregator { - LastValueAggregator { - inner: Mutex::new(Inner::default()), - } -} - -/// Aggregates last value events. -#[derive(Debug)] -pub struct LastValueAggregator { - inner: Mutex, -} - -impl Aggregation for LastValueAggregator { - fn kind(&self) -> &AggregationKind { - &AggregationKind::LAST_VALUE - } -} - -impl Aggregator for LastValueAggregator { - fn aggregation(&self) -> &dyn Aggregation { - self - } - - fn update(&self, _cx: &Context, number: &Number, _descriptor: &Descriptor) -> Result<()> { - self.inner.lock().map_err(Into::into).map(|mut inner| { - inner.state = Some(LastValueData { - value: number.clone(), - timestamp: opentelemetry_api::time::now(), - }); - }) - } - - fn synchronized_move( - &self, - other: &Arc, - _descriptor: &Descriptor, - ) -> Result<()> { - if let Some(other) = other.as_any().downcast_ref::() { - self.inner.lock().map_err(From::from).and_then(|mut inner| { - other.inner.lock().map_err(From::from).map(|mut other| { - other.state = inner.state.take(); - }) - }) - } else { - Err(MetricsError::InconsistentAggregator(format!( - "Expected {:?}, got: {:?}", - self, other - ))) - } - } - fn merge( - &self, - other: &(dyn Aggregator + Send + Sync), - _descriptor: &Descriptor, - ) -> Result<()> { - if let Some(other) = other.as_any().downcast_ref::() { - self.inner.lock().map_err(From::from).and_then(|mut inner| { - other.inner.lock().map_err(From::from).map(|mut other| { - match (&inner.state, &other.state) { - // Take if other timestamp is greater - (Some(checkpoint), Some(other_checkpoint)) - if other_checkpoint.timestamp > checkpoint.timestamp => - { - inner.state = other.state.take() - } - // Take if no value exists currently - (None, Some(_)) => inner.state = other.state.take(), - // Otherwise done - _ => (), - } - }) - }) - } else { - Err(MetricsError::InconsistentAggregator(format!( - "Expected {:?}, got: {:?}", - self, other - ))) - } - } - fn as_any(&self) -> &dyn Any { - self - } -} - -impl LastValue for LastValueAggregator { - fn last_value(&self) -> Result<(Number, SystemTime)> { - self.inner.lock().map_err(Into::into).and_then(|inner| { - if let Some(checkpoint) = &inner.state { - Ok((checkpoint.value.clone(), checkpoint.timestamp)) - } else { - Err(MetricsError::NoDataCollected) - } - }) - } -} - -#[derive(Debug, Default)] -struct Inner { - state: Option, -} - -#[derive(Debug)] -struct LastValueData { - value: Number, - timestamp: SystemTime, -} diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/aggregators/mod.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/aggregators/mod.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/aggregators/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/aggregators/mod.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,97 +0,0 @@ -//! Metric Aggregators -use core::fmt; -use std::{any::Any, sync::Arc}; - -use crate::{ - export::metrics::aggregation::Aggregation, - metrics::sdk_api::{Descriptor, InstrumentKind, Number, NumberKind}, -}; -use opentelemetry_api::{ - metrics::{MetricsError, Result}, - Context, -}; - -mod histogram; -mod last_value; -mod sum; - -pub use histogram::{histogram, HistogramAggregator}; -pub use last_value::{last_value, LastValueAggregator}; -pub use sum::{sum, SumAggregator}; - -/// RangeTest is a common routine for testing for valid input values. This -/// rejects NaN values. This rejects negative values when the metric instrument -/// does not support negative values, including monotonic counter metrics and -/// absolute Histogram metrics. -pub fn range_test(number: &Number, descriptor: &Descriptor) -> Result<()> { - if descriptor.number_kind() == &NumberKind::F64 && number.is_nan() { - return Err(MetricsError::NaNInput); - } - - match descriptor.instrument_kind() { - InstrumentKind::Counter | InstrumentKind::CounterObserver - if descriptor.number_kind() == &NumberKind::F64 => - { - if number.is_negative(descriptor.number_kind()) { - return Err(MetricsError::NegativeInput); - } - } - _ => (), - }; - Ok(()) -} - -/// Aggregator implements a specific aggregation behavior, i.e., a behavior to -/// track a sequence of updates to an instrument. Sum-only instruments commonly -/// use a simple Sum aggregator, but for the distribution instruments -/// (Histogram, ValueObserver) there are a number of possible aggregators -/// with different cost and accuracy tradeoffs. -/// -/// Note that any Aggregator may be attached to any instrument--this is the -/// result of the OpenTelemetry API/SDK separation. It is possible to attach a -/// Sum aggregator to a Histogram instrument or a MinMaxSumCount aggregator -/// to a Counter instrument. -pub trait Aggregator: fmt::Debug { - /// The interface to access the current state of this Aggregator. - fn aggregation(&self) -> &dyn Aggregation; - - /// Update receives a new measured value and incorporates it into the - /// aggregation. Update calls may be called concurrently. - /// - /// `Descriptor::number_kind` should be consulted to determine whether the - /// provided number is an `i64`, `u64` or `f64`. - /// - /// The current Context could be inspected for a `Baggage` or - /// `SpanContext`. - fn update(&self, context: &Context, number: &Number, descriptor: &Descriptor) -> Result<()>; - - /// This method is called during collection to finish one period of aggregation - /// by atomically saving the currently-updating state into the argument - /// Aggregator. - /// - /// `synchronized_move` is called concurrently with `update`. These two methods - /// must be synchronized with respect to each other, for correctness. - /// - /// This method will return an `InconsistentAggregator` error if this - /// `Aggregator` cannot be copied into the destination due to an incompatible - /// type. - /// - /// This call has no `Context` argument because it is expected to perform only - /// computation. - fn synchronized_move( - &self, - destination: &Arc, - descriptor: &Descriptor, - ) -> Result<()>; - - /// This combines the checkpointed state from the argument `Aggregator` into this - /// `Aggregator`. `merge` is not synchronized with respect to `update` or - /// `synchronized_move`. - /// - /// The owner of an `Aggregator` being merged is responsible for synchronization - /// of both `Aggregator` states. - fn merge(&self, other: &(dyn Aggregator + Send + Sync), descriptor: &Descriptor) -> Result<()>; - - /// Returns the implementing aggregator as `Any` for downcasting. - fn as_any(&self) -> &dyn Any; -} diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/aggregators/sum.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/aggregators/sum.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/aggregators/sum.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/aggregators/sum.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,74 +0,0 @@ -use crate::export::metrics::aggregation::{Aggregation, AggregationKind, Sum}; -use crate::metrics::{ - aggregators::Aggregator, - sdk_api::{AtomicNumber, Descriptor, Number}, -}; -use opentelemetry_api::metrics::{MetricsError, Result}; -use opentelemetry_api::Context; -use std::any::Any; -use std::sync::Arc; - -/// Create a new sum aggregator. -pub fn sum() -> impl Aggregator { - SumAggregator::default() -} - -/// An aggregator for counter events. -#[derive(Debug, Default)] -pub struct SumAggregator { - value: AtomicNumber, -} - -impl Sum for SumAggregator { - fn sum(&self) -> Result { - Ok(self.value.load()) - } -} - -impl Aggregation for SumAggregator { - fn kind(&self) -> &AggregationKind { - &AggregationKind::SUM - } -} - -impl Aggregator for SumAggregator { - fn aggregation(&self) -> &dyn Aggregation { - self - } - - fn update(&self, _cx: &Context, number: &Number, descriptor: &Descriptor) -> Result<()> { - self.value.fetch_add(descriptor.number_kind(), number); - Ok(()) - } - - fn synchronized_move( - &self, - other: &Arc, - descriptor: &Descriptor, - ) -> Result<()> { - if let Some(other) = other.as_any().downcast_ref::() { - let kind = descriptor.number_kind(); - other.value.store(&self.value.load()); - self.value.store(&kind.zero()); - Ok(()) - } else { - Err(MetricsError::InconsistentAggregator(format!( - "Expected {:?}, got: {:?}", - self, other - ))) - } - } - - fn merge(&self, other: &(dyn Aggregator + Send + Sync), descriptor: &Descriptor) -> Result<()> { - if let Some(other_sum) = other.as_any().downcast_ref::() { - self.value - .fetch_add(descriptor.number_kind(), &other_sum.value.load()) - } - - Ok(()) - } - - fn as_any(&self) -> &dyn Any { - self - } -} diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/controllers/basic.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/controllers/basic.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/controllers/basic.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/controllers/basic.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,470 +0,0 @@ -use std::{ - collections::HashMap, - fmt, - sync::{Arc, Mutex}, - time::{Duration, SystemTime}, -}; - -use futures_channel::{mpsc, oneshot}; -use futures_util::{stream, StreamExt}; -use opentelemetry_api::{ - global, - metrics::{noop, Meter, MeterProvider, MetricsError, Result}, - Context, InstrumentationLibrary, -}; - -use crate::{ - export::metrics::{ - Checkpointer, CheckpointerFactory, InstrumentationLibraryReader, LockedCheckpointer, - MetricsExporter, Reader, - }, - metrics::{ - accumulator, - registry::{self, UniqueInstrumentMeterCore}, - sdk_api::{ - wrap_meter_core, AsyncInstrumentCore, Descriptor, MeterCore, SyncInstrumentCore, - }, - Accumulator, - }, - runtime::Runtime, - Resource, -}; - -/// DefaultPeriod is used for: -/// -/// - the minimum time between calls to `collect`. -/// - the timeout for `export`. -/// - the timeout for `collect`. -const DEFAULT_PERIOD: Duration = Duration::from_secs(10); - -/// Returns a new builder using the provided checkpointer factory. -/// -/// Use builder options (including optional exporter) to configure a metric -/// export pipeline. -pub fn basic(factory: T) -> BasicControllerBuilder -where - T: CheckpointerFactory + Send + Sync + 'static, -{ - BasicControllerBuilder { - checkpointer_factory: Box::new(factory), - resource: None, - exporter: None, - collect_period: None, - collect_timeout: None, - push_timeout: None, - } -} - -/// Organizes and synchronizes collection of metric data in both "pull" and -/// "push" configurations. -/// -/// This supports two distinct modes: -/// -/// - Push and Pull: `start` must be called to begin calling the exporter; -/// `collect` is called periodically after starting the controller. -/// - Pull-Only: `start` is optional in this case, to call `collect` -/// periodically. If `start` is not called, `collect` can be called manually to -/// initiate collection. -/// -/// The controller supports mixing push and pull access to metric data using the -/// `InstrumentationLibraryReader` interface. -#[derive(Clone)] -pub struct BasicController(Arc); - -struct ControllerInner { - meters: Mutex>>, - checkpointer_factory: Box, - resource: Resource, - exporter: Mutex>>, - worker_channel: Mutex>>, - collect_period: Duration, - collect_timeout: Duration, - push_timeout: Duration, - collected_time: Mutex>, -} - -enum WorkerMessage { - Tick, - Shutdown((Context, oneshot::Sender<()>)), -} - -impl BasicController { - /// This begins a ticker that periodically collects and exports metrics with the - /// configured interval. - /// - /// This is required for calling a configured [`MetricsExporter`] (see - /// [`BasicControllerBuilder::with_exporter`]) and is otherwise optional when - /// only pulling metric data. - /// - /// The passed in context is passed to `collect` and subsequently to - /// asynchronous instrument callbacks. Returns an error when the controller was - /// already started. - /// - /// Note that it is not necessary to start a controller when only pulling data; - /// use the `collect` and `try_for_each` methods directly in this case. - pub fn start(&self, cx: &Context, rt: T) -> Result<()> { - let (message_sender, message_receiver) = mpsc::channel(8); - let ticker = rt - .interval(self.0.collect_period) - .map(|_| WorkerMessage::Tick); - - let exporter = self - .0 - .exporter - .lock() - .map(|mut ex| ex.take()) - .unwrap_or_default(); - let resource = self.resource().clone(); - let reader = self.clone(); - let cx = cx.clone(); - // Spawn worker process via user-defined spawn function. - rt.spawn(Box::pin(async move { - let mut messages = Box::pin(stream::select(message_receiver, ticker)); - while let Some(message) = messages.next().await { - match message { - WorkerMessage::Tick => { - match reader.checkpoint(&cx) { - Ok(_) => { - if let Some(exporter) = &exporter { - // TODO timeout - if let Err(err) = exporter.export(&cx, &resource, &reader) { - global::handle_error(err); - } - } - } - Err(err) => global::handle_error(err), - }; - } - WorkerMessage::Shutdown((cx, channel)) => { - let _ = reader.checkpoint(&cx); - if let Some(exporter) = &exporter { - let _ = exporter.export(&cx, &resource, &reader); - } - let _ = channel.send(()); - break; - } - } - } - })); - - *self.0.worker_channel.lock()? = Some(message_sender); - - Ok(()) - } - - /// This waits for the background worker to return and then collects - /// and exports metrics one last time before returning. - /// - /// The passed context is passed to the final `collect` and subsequently to the - /// final asynchronous instruments. - /// - /// Note that `stop` will not cancel an ongoing collection or export. - pub fn stop(&self, cx: &Context) -> Result<()> { - self.0 - .worker_channel - .lock() - .map_err(Into::into) - .and_then(|mut worker| { - if let Some(mut worker) = worker.take() { - let (res_sender, res_receiver) = oneshot::channel(); - if worker - .try_send(WorkerMessage::Shutdown((cx.clone(), res_sender))) - .is_ok() - { - futures_executor::block_on(res_receiver) - .map_err(|err| MetricsError::Other(err.to_string())) - } else { - Ok(()) - } - } else { - Ok(()) - } - }) - } - - /// true if the controller was started via `start`, indicating that the - /// current `Reader` is being kept up-to-date. - pub fn is_running(&self) -> bool { - self.0 - .worker_channel - .lock() - .map(|wc| wc.is_some()) - .unwrap_or(false) - } - - /// `true` if the collector should collect now, based on the current time, the - /// last collection time, and the configured period. - fn should_collect(&self) -> bool { - self.0 - .collected_time - .lock() - .map(|mut collected_time| { - if self.0.collect_period.as_secs() == 0 && self.0.collect_period.as_nanos() == 0 { - return true; - } - let now = SystemTime::now(); - if let Some(collected_time) = *collected_time { - if now.duration_since(collected_time).unwrap_or_default() - < self.0.collect_period - { - return false; - } - } - - *collected_time = Some(now); - true - }) - .unwrap_or(false) - } - - /// Requests a collection. - /// - /// The collection will be skipped if the last collection is aged less than the - /// configured collection period. - pub fn collect(&self, cx: &Context) -> Result<()> { - if self.is_running() { - // When the ticker is `Some`, there's a component - // computing checkpoints with the collection period. - return Err(MetricsError::Other("controller already started".into())); - } - - if !self.should_collect() { - return Ok(()); - } - - self.checkpoint(cx) - } - - /// Get a reference to the current resource. - pub fn resource(&self) -> &Resource { - &self.0.resource - } - - /// Returns a snapshot of current accumulators registered to this controller. - /// - /// This briefly locks the controller. - fn with_accumulator_list(&self, mut f: F) -> Result - where - F: FnMut(&[&AccumulatorCheckpointer]) -> Result, - { - self.0.meters.lock().map_err(Into::into).and_then(|meters| { - let accs = meters - .values() - .filter_map(|unique| { - unique - .meter_core() - .downcast_ref::() - }) - .collect::>(); - f(&accs) - }) - } - - /// Calls the accumulator and checkpointer interfaces to - /// compute the reader. - fn checkpoint(&self, cx: &Context) -> Result<()> { - self.with_accumulator_list(|accs| { - for acc in accs { - self.checkpoint_single_accumulator(cx, acc)?; - } - - Ok(()) - }) - } - - fn checkpoint_single_accumulator( - &self, - cx: &Context, - ac: &AccumulatorCheckpointer, - ) -> Result<()> { - ac.checkpointer - .checkpoint(&mut |ckpt: &mut dyn LockedCheckpointer| { - ckpt.start_collection(); - - if self.0.collect_timeout.as_secs() != 0 && !self.0.collect_timeout.as_nanos() == 0 - { - // TODO timeouts - } - - ac.accumulator.collect(cx, ckpt.processor()); - - ckpt.finish_collection() - }) - } -} - -impl MeterProvider for BasicController { - fn versioned_meter( - &self, - name: &'static str, - version: Option<&'static str>, - schema_url: Option<&'static str>, - ) -> Meter { - self.0 - .meters - .lock() - .map(|mut meters| { - let library = InstrumentationLibrary::new(name, version, schema_url); - let meter_core = meters.entry(library.clone()).or_insert_with(|| { - let checkpointer = self.0.checkpointer_factory.checkpointer(); - Arc::new(registry::unique_instrument_meter_core( - AccumulatorCheckpointer { - accumulator: accumulator(checkpointer.clone().as_dyn_processor()), - checkpointer, - library: library.clone(), - }, - )) - }); - wrap_meter_core(meter_core.clone(), library) - }) - .unwrap_or_else(|_| { - noop::NoopMeterProvider::new().versioned_meter(name, version, schema_url) - }) - } -} - -struct AccumulatorCheckpointer { - accumulator: Accumulator, - checkpointer: Arc, - library: InstrumentationLibrary, -} - -impl MeterCore for AccumulatorCheckpointer { - fn new_sync_instrument( - &self, - descriptor: Descriptor, - ) -> Result> { - self.accumulator.new_sync_instrument(descriptor) - } - - fn new_async_instrument( - &self, - descriptor: Descriptor, - ) -> Result> { - self.accumulator.new_async_instrument(descriptor) - } - - fn register_callback(&self, f: Box) -> Result<()> { - self.accumulator.register_callback(f) - } -} - -impl InstrumentationLibraryReader for BasicController { - fn try_for_each( - &self, - f: &mut dyn FnMut(&InstrumentationLibrary, &mut dyn Reader) -> Result<()>, - ) -> Result<()> { - let mut res = Ok(()); - self.with_accumulator_list(|acs| { - for ac_pair in acs { - if res.is_err() { - continue; - } - - res = ac_pair - .checkpointer - .checkpoint(&mut |locked| f(&ac_pair.library, locked.reader())) - } - - Ok(()) - })?; - - res - } -} - -impl fmt::Debug for BasicController { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("BasicController") - .field("resource", &self.0.resource) - .field("collect_period", &self.0.collect_period) - .field("collect_timeout", &self.0.collect_timeout) - .field("push_timeout", &self.0.push_timeout) - .field("collected_time", &self.0.collect_timeout) - .finish() - } -} - -/// Options for configuring a [`BasicController`] -pub struct BasicControllerBuilder { - checkpointer_factory: Box, - resource: Option, - exporter: Option>, - collect_period: Option, - collect_timeout: Option, - push_timeout: Option, -} - -impl BasicControllerBuilder { - /// Sets the [`Resource`] used for this controller. - pub fn with_resource(mut self, resource: Resource) -> Self { - self.resource = Some(resource); - self - } - - /// Sets the exporter used for exporting metric data. - /// - /// Note: Exporters such as Prometheus that pull data do not implement - /// [`MetricsExporter`]. They will directly call `collect` and `try_for_each`. - pub fn with_exporter(mut self, exporter: impl MetricsExporter + Send + Sync + 'static) -> Self { - self.exporter = Some(Box::new(exporter)); - self - } - - /// Sets the interval between calls to `collect` a checkpoint. - /// - /// When pulling metrics and not exporting, this is the minimum time between - /// calls to `collect.In a pull-only configuration, collection is performed on - /// demand; set this to `0` to always recompute the export record set. - /// - /// When exporting metrics, this must be > 0. - /// - /// Default value is 10s. - pub fn with_collect_period(mut self, collect_period: Duration) -> Self { - self.collect_period = Some(collect_period); - self - } - - /// Sets the timeout of the `collect` and subsequent observer instrument - /// callbacks. - /// - /// Default value is 10s. If zero or none, no collect timeout is applied. - pub fn with_collect_timeout(mut self, collect_timeout: Duration) -> Self { - self.collect_timeout = Some(collect_timeout); - self - } - - /// Sets push controller timeout when a exporter is configured. - /// - /// Default value is 10s. If zero, no export timeout is applied. - pub fn with_push_timeout(mut self, push_timeout: Duration) -> Self { - self.push_timeout = Some(push_timeout); - self - } - - /// Creates a new basic controller. - pub fn build(self) -> BasicController { - BasicController(Arc::new(ControllerInner { - meters: Default::default(), - checkpointer_factory: self.checkpointer_factory, - resource: self.resource.unwrap_or_default(), - exporter: Mutex::new(self.exporter), - worker_channel: Mutex::new(None), - collect_period: self.collect_period.unwrap_or(DEFAULT_PERIOD), - collect_timeout: self.collect_timeout.unwrap_or(DEFAULT_PERIOD), - push_timeout: self.push_timeout.unwrap_or(DEFAULT_PERIOD), - collected_time: Default::default(), - })) - } -} - -impl fmt::Debug for BasicControllerBuilder { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("BasicControllerBuilder") - .field("resource", &self.resource) - .field("collect_period", &self.collect_period) - .field("collect_timeout", &self.collect_timeout) - .field("push_timeout", &self.push_timeout) - .finish() - } -} diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/controllers/mod.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/controllers/mod.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/controllers/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/controllers/mod.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,4 +0,0 @@ -//! SDK Metrics Controllers -mod basic; - -pub use basic::{basic, BasicController, BasicControllerBuilder}; diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/controllers/push.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/controllers/push.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/controllers/push.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/controllers/push.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,199 +0,0 @@ -use crate::{ - export::metrics::{AggregatorSelector, Checkpointer, ExportKindFor, Exporter}, - metrics::{ - self, - processors::{self, BasicProcessor}, - Accumulator, - }, - Resource, -}; -use futures_channel::mpsc; -use futures_util::{ - future::Future, - stream::{select, Stream, StreamExt as _}, - task, -}; -use opentelemetry_api::global; -use opentelemetry_api::metrics::registry; -use std::pin::Pin; -use std::sync::{Arc, Mutex}; -use std::time; - -const DEFAULT_PUSH_PERIOD: time::Duration = time::Duration::from_secs(10); - -/// Create a new `PushControllerBuilder`. -pub fn push( - aggregator_selector: AS, - export_selector: ES, - exporter: E, - spawn: SP, - interval: I, -) -> PushControllerBuilder -where - AS: AggregatorSelector + Send + Sync + 'static, - ES: ExportKindFor + Send + Sync + 'static, - E: Exporter + Send + Sync + 'static, - SP: Fn(PushControllerWorker) -> SO, - I: Fn(time::Duration) -> IO, -{ - PushControllerBuilder { - aggregator_selector: Box::new(aggregator_selector), - export_selector: Box::new(export_selector), - exporter: Box::new(exporter), - spawn, - interval, - resource: None, - period: None, - timeout: None, - } -} - -/// Organizes a periodic push of metric data. -#[derive(Debug)] -pub struct PushController { - message_sender: Mutex>, - provider: registry::RegistryMeterProvider, -} - -#[derive(Debug)] -enum PushMessage { - Tick, - Shutdown, -} - -/// The future which executes push controller work periodically. Can be run on a -/// passed in executor. -#[allow(missing_debug_implementations)] -pub struct PushControllerWorker { - messages: Pin + Send>>, - accumulator: Accumulator, - processor: Arc, - exporter: Box, - _timeout: time::Duration, -} - -impl PushControllerWorker { - fn on_tick(&mut self) { - // TODO handle timeout - if let Err(err) = self.processor.lock().and_then(|mut checkpointer| { - checkpointer.start_collection(); - self.accumulator.0.collect(&mut checkpointer); - checkpointer.finish_collection()?; - self.exporter.export(checkpointer.checkpoint_set()) - }) { - global::handle_error(err) - } - } -} - -impl Future for PushControllerWorker { - type Output = (); - fn poll(mut self: Pin<&mut Self>, cx: &mut task::Context<'_>) -> task::Poll { - loop { - match futures_util::ready!(self.messages.poll_next_unpin(cx)) { - // Span batch interval time reached, export current spans. - Some(PushMessage::Tick) => self.on_tick(), - // Stream has terminated or processor is shutdown, return to finish execution. - None | Some(PushMessage::Shutdown) => { - return task::Poll::Ready(()); - } - } - } - } -} - -impl Drop for PushControllerWorker { - fn drop(&mut self) { - // Try to push data one last time - self.on_tick() - } -} - -impl PushController { - /// The controller's meter provider. - pub fn provider(&self) -> registry::RegistryMeterProvider { - self.provider.clone() - } -} - -impl Drop for PushController { - fn drop(&mut self) { - if let Ok(mut sender) = self.message_sender.lock() { - let _ = sender.try_send(PushMessage::Shutdown); - } - } -} - -/// Configuration for building a new `PushController`. -#[derive(Debug)] -pub struct PushControllerBuilder { - aggregator_selector: Box, - export_selector: Box, - exporter: Box, - spawn: S, - interval: I, - resource: Option, - period: Option, - timeout: Option, -} - -impl PushControllerBuilder -where - S: Fn(PushControllerWorker) -> SO, - I: Fn(time::Duration) -> IS, - IS: Stream + Send + 'static, -{ - /// Configure the period of this controller - pub fn with_period(self, period: time::Duration) -> Self { - PushControllerBuilder { - period: Some(period), - ..self - } - } - - /// Configure the resource used by this controller - pub fn with_resource(self, resource: Resource) -> Self { - PushControllerBuilder { - resource: Some(resource), - ..self - } - } - - /// Config the timeout of one request. - pub fn with_timeout(self, duration: time::Duration) -> Self { - PushControllerBuilder { - timeout: Some(duration), - ..self - } - } - - /// Build a new `PushController` with this configuration. - pub fn build(self) -> PushController { - let processor = processors::basic(self.aggregator_selector, self.export_selector, false); - let processor = Arc::new(processor); - let mut accumulator = metrics::accumulator(processor.clone()); - - if let Some(resource) = self.resource { - accumulator = accumulator.with_resource(resource); - } - let accumulator = accumulator.build(); - let provider = registry::meter_provider(Arc::new(accumulator.clone())); - - let (message_sender, message_receiver) = mpsc::channel(256); - let ticker = - (self.interval)(self.period.unwrap_or(DEFAULT_PUSH_PERIOD)).map(|_| PushMessage::Tick); - - (self.spawn)(PushControllerWorker { - messages: Box::pin(select(message_receiver, ticker)), - accumulator, - processor, - exporter: self.exporter, - _timeout: self.timeout.unwrap_or(DEFAULT_PUSH_PERIOD), - }); - - PushController { - message_sender: Mutex::new(message_sender), - provider, - } - } -} diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/data/mod.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/data/mod.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/data/mod.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/data/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,208 @@ +//! Types for delivery of pre-aggregated metric time series data. + +use std::{any, borrow::Cow, fmt, time::SystemTime}; + +use opentelemetry_api::{metrics::Unit, KeyValue}; + +use crate::{attributes::AttributeSet, instrumentation::Scope, Resource}; + +pub use self::temporality::Temporality; + +mod temporality; + +/// A collection of [ScopeMetrics] and the associated [Resource] that created them. +#[derive(Debug)] +pub struct ResourceMetrics { + /// The entity that collected the metrics. + pub resource: Resource, + /// The collection of metrics with unique [Scope]s. + pub scope_metrics: Vec, +} + +/// A collection of metrics produced by a meter. +#[derive(Default, Debug)] +pub struct ScopeMetrics { + /// The [Scope] that the meter was created with. + pub scope: Scope, + /// The list of aggregations created by the meter. + pub metrics: Vec, +} + +/// A collection of one or more aggregated time series from an [Instrument]. +/// +/// [Instrument]: crate::metrics::Instrument +#[derive(Debug)] +pub struct Metric { + /// The name of the instrument that created this data. + pub name: Cow<'static, str>, + /// The description of the instrument, which can be used in documentation. + pub description: Cow<'static, str>, + /// The unit in which the instrument reports. + pub unit: Unit, + /// The aggregated data from an instrument. + pub data: Box, +} + +/// The store of data reported by an [Instrument]. +/// +/// It will be one of: [Gauge], [Sum], or [Histogram]. +/// +/// [Instrument]: crate::metrics::Instrument +pub trait Aggregation: fmt::Debug + any::Any + Send + Sync { + /// Support downcasting + fn as_any(&self) -> &dyn any::Any; +} + +/// A measurement of the current value of an instrument. +#[derive(Debug)] +pub struct Gauge { + /// Represents individual aggregated measurements with unique attributes. + pub data_points: Vec>, +} + +impl Aggregation for Gauge { + fn as_any(&self) -> &dyn any::Any { + self + } +} + +/// Represents the sum of all measurements of values from an instrument. +#[derive(Debug)] +pub struct Sum { + /// Represents individual aggregated measurements with unique attributes. + pub data_points: Vec>, + /// Describes if the aggregation is reported as the change from the last report + /// time, or the cumulative changes since a fixed start time. + pub temporality: Temporality, + /// Whether this aggregation only increases or decreases. + pub is_monotonic: bool, +} + +impl Aggregation for Sum { + fn as_any(&self) -> &dyn any::Any { + self + } +} + +/// DataPoint is a single data point in a time series. +#[derive(Debug)] +pub struct DataPoint { + /// Attributes is the set of key value pairs that uniquely identify the + /// time series. + pub attributes: AttributeSet, + /// The time when the time series was started. + pub start_time: Option, + /// The time when the time series was recorded. + pub time: Option, + /// The value of this data point. + pub value: T, + /// The sampled [Exemplar]s collected during the time series. + pub exemplars: Vec>, +} + +impl Clone for DataPoint { + fn clone(&self) -> Self { + Self { + attributes: self.attributes.clone(), + start_time: self.start_time, + time: self.time, + value: self.value, + exemplars: self.exemplars.clone(), + } + } +} + +/// Represents the histogram of all measurements of values from an instrument. +#[derive(Debug)] +pub struct Histogram { + /// Individual aggregated measurements with unique attributes. + pub data_points: Vec>, + /// Describes if the aggregation is reported as the change from the last report + /// time, or the cumulative changes since a fixed start time. + pub temporality: Temporality, +} + +impl Aggregation for Histogram { + fn as_any(&self) -> &dyn any::Any { + self + } +} + +/// A single histogram data point in a time series. +#[derive(Debug)] +pub struct HistogramDataPoint { + /// The set of key value pairs that uniquely identify the time series. + pub attributes: AttributeSet, + /// The time when the time series was started. + pub start_time: SystemTime, + /// The time when the time series was recorded. + pub time: SystemTime, + + /// The number of updates this histogram has been calculated with. + pub count: u64, + /// The upper bounds of the buckets of the histogram. + /// + /// Because the last boundary is +infinity this one is implied. + pub bounds: Vec, + /// The count of each of the buckets. + pub bucket_counts: Vec, + + /// The minimum value recorded. + pub min: Option, + /// The maximum value recorded. + pub max: Option, + /// The sum of the values recorded. + pub sum: T, + + /// The sampled [Exemplar]s collected during the time series. + pub exemplars: Vec>, +} + +impl Clone for HistogramDataPoint { + fn clone(&self) -> Self { + Self { + attributes: self.attributes.clone(), + start_time: self.start_time, + time: self.time, + count: self.count, + bounds: self.bounds.clone(), + bucket_counts: self.bucket_counts.clone(), + min: self.min, + max: self.max, + sum: self.sum, + exemplars: self.exemplars.clone(), + } + } +} + +/// A measurement sampled from a time series providing a typical example. +#[derive(Debug)] +pub struct Exemplar { + /// The attributes recorded with the measurement but filtered out of the + /// time series' aggregated data. + pub filtered_attributes: Vec, + /// The time when the measurement was recorded. + pub time: SystemTime, + /// The measured value. + pub value: T, + /// The ID of the span that was active during the measurement. + /// + /// If no span was active or the span was not sampled this will be empty. + pub span_id: [u8; 8], + /// The ID of the trace the active span belonged to during the measurement. + /// + /// If no span was active or the span was not sampled this will be empty. + pub trace_id: [u8; 16], +} + +impl Clone for Exemplar { + fn clone(&self) -> Self { + Self { + filtered_attributes: self.filtered_attributes.clone(), + time: self.time, + value: self.value, + span_id: self.span_id, + trace_id: self.trace_id, + } + } +} diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/data/temporality.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/data/temporality.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/data/temporality.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/data/temporality.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,16 @@ +/// Defines the window that an aggregation was calculated over. +#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] +#[non_exhaustive] +pub enum Temporality { + /// A measurement interval that continues to expand forward in time from a + /// starting point. + /// + /// New measurements are added to all previous measurements since a start time. + Cumulative, + + /// A measurement interval that resets each cycle. + /// + /// Measurements from one cycle are recorded independently, measurements from + /// other cycles do not affect them. + Delta, +} diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/exporter.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/exporter.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/exporter.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/exporter.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,34 @@ +//! Interfaces for exporting metrics +use async_trait::async_trait; + +use opentelemetry_api::metrics::Result; + +use crate::metrics::{ + data::ResourceMetrics, + reader::{AggregationSelector, TemporalitySelector}, +}; + +/// Exporter handles the delivery of metric data to external receivers. +/// +/// This is the final component in the metric push pipeline. +#[async_trait] +pub trait PushMetricsExporter: + AggregationSelector + TemporalitySelector + Send + Sync + 'static +{ + /// Export serializes and transmits metric data to a receiver. + /// + /// All retry logic must be contained in this function. The SDK does not + /// implement any retry logic. All errors returned by this function are + /// considered unrecoverable and will be reported to a configured error + /// Handler. + async fn export(&self, metrics: &mut ResourceMetrics) -> Result<()>; + + /// Flushes any metric data held by an exporter. + async fn force_flush(&self) -> Result<()>; + + /// Releases any held computational resources. + /// + /// After Shutdown is called, calls to Export will perform no operation and + /// instead will return an error indicating the shutdown state. + fn shutdown(&self) -> Result<()>; +} diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/instrument.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/instrument.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/instrument.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/instrument.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,367 @@ +use std::{any::Any, borrow::Cow, collections::HashSet, hash::Hash, marker, sync::Arc}; + +use opentelemetry_api::{ + metrics::{ + AsyncInstrument, MetricsError, Result, SyncCounter, SyncHistogram, SyncUpDownCounter, Unit, + }, + Key, KeyValue, +}; + +use crate::{ + attributes::AttributeSet, + instrumentation::Scope, + metrics::data::Temporality, + metrics::{aggregation::Aggregation, internal::Aggregator}, +}; + +pub(crate) const EMPTY_AGG_MSG: &str = "no aggregators for observable instrument"; + +/// The identifier of a group of instruments that all perform the same function. +#[derive(Clone, Copy, Debug, Hash, PartialEq, Eq)] +pub enum InstrumentKind { + /// Identifies a group of instruments that record increasing values synchronously + /// with the code path they are measuring. + Counter, + /// A group of instruments that record increasing and decreasing values + /// synchronously with the code path they are measuring. + UpDownCounter, + /// A group of instruments that record a distribution of values synchronously with + /// the code path they are measuring. + Histogram, + /// A group of instruments that record increasing values in an asynchronous + /// callback. + ObservableCounter, + /// A group of instruments that record increasing and decreasing values in an + /// asynchronous callback. + ObservableUpDownCounter, + /// a group of instruments that record current values in an asynchronous callback. + ObservableGauge, +} + +/// Describes properties an instrument is created with, also used for filtering +/// in [View](crate::metrics::View)s. +/// +/// # Example +/// +/// Instruments can be used as criteria for views. +/// +/// ``` +/// use opentelemetry_sdk::metrics::{new_view, Aggregation, Instrument, Stream}; +/// +/// let criteria = Instrument::new().name("counter_*"); +/// let mask = Stream::new().aggregation(Aggregation::Sum); +/// +/// let view = new_view(criteria, mask); +/// # drop(view); +/// ``` +#[derive(Clone, Default, Debug, PartialEq)] +#[non_exhaustive] +pub struct Instrument { + /// The human-readable identifier of the instrument. + pub name: Cow<'static, str>, + /// describes the purpose of the instrument. + pub description: Cow<'static, str>, + /// The functional group of the instrument. + pub kind: Option, + /// Unit is the unit of measurement recorded by the instrument. + pub unit: Unit, + /// The instrumentation that created the instrument. + pub scope: Scope, +} + +impl Instrument { + /// Create a new instrument with default values + pub fn new() -> Self { + Instrument::default() + } + + /// Set the instrument name. + pub fn name(mut self, name: impl Into>) -> Self { + self.name = name.into(); + self + } + + /// Set the instrument description. + pub fn description(mut self, description: impl Into>) -> Self { + self.description = description.into(); + self + } + + /// Set the instrument unit. + pub fn unit(mut self, unit: Unit) -> Self { + self.unit = unit; + self + } + + /// Set the instrument scope. + pub fn scope(mut self, scope: Scope) -> Self { + self.scope = scope; + self + } + + /// empty returns if all fields of i are their default-value. + pub(crate) fn is_empty(&self) -> bool { + self.name == "" + && self.description == "" + && self.kind.is_none() + && self.unit.as_str() == "" + && self.scope == Scope::default() + } + + pub(crate) fn matches(&self, other: &Instrument) -> bool { + self.matches_name(other) + && self.matches_description(other) + && self.matches_kind(other) + && self.matches_unit(other) + && self.matches_scope(other) + } + + pub(crate) fn matches_name(&self, other: &Instrument) -> bool { + self.name.is_empty() || self.name.as_ref() == other.name.as_ref() + } + + pub(crate) fn matches_description(&self, other: &Instrument) -> bool { + self.description.is_empty() || self.description.as_ref() == other.description.as_ref() + } + + pub(crate) fn matches_kind(&self, other: &Instrument) -> bool { + self.kind.is_none() || self.kind == other.kind + } + + pub(crate) fn matches_unit(&self, other: &Instrument) -> bool { + self.unit.as_str() == "" || self.unit == other.unit + } + + pub(crate) fn matches_scope(&self, other: &Instrument) -> bool { + (self.scope.name.is_empty() || self.scope.name.as_ref() == other.scope.name.as_ref()) + && (self.scope.version.is_none() + || self.scope.version.as_ref().map(AsRef::as_ref) + == other.scope.version.as_ref().map(AsRef::as_ref)) + && (self.scope.schema_url.is_none() + || self.scope.schema_url.as_ref().map(AsRef::as_ref) + == other.scope.schema_url.as_ref().map(AsRef::as_ref)) + } +} + +/// Describes the stream of data an instrument produces. +/// +/// # Example +/// +/// Streams can be used as masks in views. +/// +/// ``` +/// use opentelemetry_sdk::metrics::{new_view, Aggregation, Instrument, Stream}; +/// +/// let criteria = Instrument::new().name("counter_*"); +/// let mask = Stream::new().aggregation(Aggregation::Sum); +/// +/// let view = new_view(criteria, mask); +/// # drop(view); +/// ``` +#[derive(Default, Debug)] +#[non_exhaustive] +pub struct Stream { + /// The human-readable identifier of the stream. + pub name: Cow<'static, str>, + /// Describes the purpose of the data. + pub description: Cow<'static, str>, + /// the unit of measurement recorded. + pub unit: Unit, + /// Aggregation the stream uses for an instrument. + pub aggregation: Option, + /// An allow-list of attribute keys that will be preserved for the stream. + /// + /// Any attribute recorded for the stream with a key not in this set will be + /// dropped. If the set is empty, all attributes will be dropped, if `None` all + /// attributes will be kept. + pub allowed_attribute_keys: Option>>, +} + +impl Stream { + /// Create a new stream with empty values. + pub fn new() -> Self { + Stream::default() + } + + /// Set the stream name. + pub fn name(mut self, name: impl Into>) -> Self { + self.name = name.into(); + self + } + + /// Set the stream description. + pub fn description(mut self, description: impl Into>) -> Self { + self.description = description.into(); + self + } + + /// Set the stream unit. + pub fn unit(mut self, unit: Unit) -> Self { + self.unit = unit; + self + } + + /// Set the stream aggregation. + pub fn aggregation(mut self, aggregation: Aggregation) -> Self { + self.aggregation = Some(aggregation); + self + } + + /// Set the stream allowed attribute keys. + /// + /// Any attribute recorded for the stream with a key not in this set will be + /// dropped. If this set is empty all attributes will be dropped. + pub fn allowed_attribute_keys(mut self, attribute_keys: impl IntoIterator) -> Self { + self.allowed_attribute_keys = Some(Arc::new(attribute_keys.into_iter().collect())); + + self + } +} + +/// the identifying properties of a stream. +#[derive(Debug, PartialEq, Eq, Hash)] +pub(crate) struct StreamId { + /// The human-readable identifier of the stream. + pub(crate) name: Cow<'static, str>, + /// Describes the purpose of the data. + pub(crate) description: Cow<'static, str>, + /// the unit of measurement recorded. + pub(crate) unit: Unit, + /// The stream uses for an instrument. + pub(crate) aggregation: String, + /// Monotonic is the monotonicity of an instruments data type. This field is + /// not used for all data types, so a zero value needs to be understood in the + /// context of Aggregation. + pub(crate) monotonic: bool, + /// Temporality is the temporality of a stream's data type. This field is + /// not used by some data types. + pub(crate) temporality: Option, + /// Number is the number type of the stream. + pub(crate) number: Cow<'static, str>, +} + +pub(crate) struct InstrumentImpl { + pub(crate) aggregators: Vec>>, +} + +impl SyncCounter for InstrumentImpl { + fn add(&self, val: T, attrs: &[KeyValue]) { + for agg in &self.aggregators { + agg.aggregate(val, AttributeSet::from(attrs)) + } + } +} + +impl SyncUpDownCounter for InstrumentImpl { + fn add(&self, val: T, attrs: &[KeyValue]) { + for agg in &self.aggregators { + agg.aggregate(val, AttributeSet::from(attrs)) + } + } +} + +impl SyncHistogram for InstrumentImpl { + fn record(&self, val: T, attrs: &[KeyValue]) { + for agg in &self.aggregators { + agg.aggregate(val, AttributeSet::from(attrs)) + } + } +} + +/// A comparable unique identifier of an observable. +#[derive(Clone, Debug)] +pub(crate) struct ObservableId { + pub(crate) inner: IdInner, + _marker: marker::PhantomData, +} + +#[derive(Clone, Debug, Hash, PartialEq, Eq)] +pub(crate) struct IdInner { + /// The human-readable identifier of the instrument. + pub(crate) name: Cow<'static, str>, + /// describes the purpose of the instrument. + pub(crate) description: Cow<'static, str>, + /// The functional group of the instrument. + kind: InstrumentKind, + /// The unit of measurement recorded by the instrument. + pub(crate) unit: Unit, + /// The instrumentation that created the instrument. + scope: Scope, +} + +impl Hash for ObservableId { + fn hash(&self, state: &mut H) { + self.inner.hash(state) + } +} + +impl PartialEq for ObservableId { + fn eq(&self, other: &Self) -> bool { + self.inner == other.inner + } +} + +impl Eq for ObservableId {} + +#[derive(Clone)] +pub(crate) struct Observable { + pub(crate) id: ObservableId, + aggregators: Vec>>, +} + +impl Observable { + pub(crate) fn new( + scope: Scope, + kind: InstrumentKind, + name: Cow<'static, str>, + description: Cow<'static, str>, + unit: Unit, + aggregators: Vec>>, + ) -> Self { + Self { + id: ObservableId { + inner: IdInner { + name, + description, + kind, + unit, + scope, + }, + _marker: marker::PhantomData, + }, + aggregators, + } + } + + /// Returns `Err` if the observable should not be registered, and `Ok` if it + /// should. + /// + /// An error is returned if this observable is effectively a no-op because it does not have + /// any aggregators. Also, an error is returned if scope defines a Meter other + /// than the observable it was created by. + pub(crate) fn registerable(&self, scope: &Scope) -> Result<()> { + if self.aggregators.is_empty() { + return Err(MetricsError::Other(EMPTY_AGG_MSG.into())); + } + if &self.id.inner.scope != scope { + return Err(MetricsError::Other(format!( + "invalid registration: observable {} from Meter {:?}, registered with Meter {}", + self.id.inner.name, self.id.inner.scope, scope.name, + ))); + } + + Ok(()) + } +} + +impl AsyncInstrument for Observable { + fn observe(&self, measurement: T, attrs: &[KeyValue]) { + for agg in &self.aggregators { + agg.aggregate(measurement, AttributeSet::from(attrs)) + } + } + + fn as_any(&self) -> Arc { + Arc::new(self.clone()) + } +} diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/internal/aggregator.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/internal/aggregator.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/internal/aggregator.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/internal/aggregator.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,42 @@ +use crate::{attributes::AttributeSet, metrics::data::Aggregation}; +use once_cell::sync::Lazy; +use opentelemetry_api::KeyValue; +use std::sync::Arc; + +const STREAM_CARDINALITY_LIMIT: u32 = 2000; +pub(crate) static STREAM_OVERFLOW_ATTRIBUTE_SET: Lazy = Lazy::new(|| { + let key_values: [KeyValue; 1] = [KeyValue::new("otel.metric.overflow", "true")]; + AttributeSet::from(&key_values[..]) +}); + +/// Forms an aggregation from a collection of recorded measurements. +pub(crate) trait Aggregator: Send + Sync { + /// Records the measurement, scoped by attr, and aggregates it into an aggregation. + fn aggregate(&self, measurement: T, attrs: AttributeSet); + + /// Returns an Aggregation, for all the aggregated measurements made and ends an aggregation + /// cycle. + fn aggregation(&self) -> Option>; + + /// Used when filtering aggregators + fn as_precompute_aggregator(&self) -> Option>> { + None + } + + /// Checks whether aggregator has hit cardinality limit for metric streams + fn is_under_cardinality_limit(&self, size: usize) -> bool { + size < STREAM_CARDINALITY_LIMIT as usize - 1 + } +} + +/// An `Aggregator` that receives values to aggregate that have been pre-computed by the caller. +pub(crate) trait PrecomputeAggregator: Aggregator { + /// Records measurements scoped by attributes that have been filtered by an + /// attribute filter. + /// + /// Pre-computed measurements of filtered attributes need to be recorded separate + /// from those that haven't been filtered so they can be added to the non-filtered + /// pre-computed measurements in a collection cycle and then resets after the + /// cycle (the non-filtered pre-computed measurements are not reset). + fn aggregate_filtered(&self, measurement: T, attrs: AttributeSet); +} diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/internal/filter.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/internal/filter.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/internal/filter.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/internal/filter.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,74 @@ +use std::sync::Arc; + +use opentelemetry_api::KeyValue; + +use crate::{attributes::AttributeSet, metrics::data::Aggregation}; + +use super::{aggregator::PrecomputeAggregator, Aggregator, Number}; + +/// Returns an [Aggregator] that wraps the passed in aggregator with an +/// attribute filtering function. +/// +/// Both pre-computed non-pre-computed [Aggregator]s can be passed in. An +/// appropriate [Aggregator] will be returned for the detected type. +pub(crate) fn new_filter>( + agg: Arc>, + filter: Arc bool + Send + Sync>, +) -> Arc> { + if let Some(agg) = agg.as_precompute_aggregator() { + Arc::new(PrecomputeFilter { agg, filter }) + } else { + Arc::new(Filter { agg, filter }) + } +} + +/// Wraps an aggregator with an attribute filter. +/// +/// All recorded measurements will have their attributes filtered before they +/// are passed to the underlying aggregator's aggregate method. +/// +/// This should not be used to wrap a pre-computed aggregator. Use a +/// [PrecomputedFilter] instead. +struct Filter { + filter: Arc bool + Send + Sync>, + agg: Arc>, +} + +impl> Aggregator for Filter { + fn aggregate(&self, measurement: T, mut attrs: AttributeSet) { + attrs.retain(self.filter.as_ref()); + self.agg.aggregate(measurement, attrs) + } + + fn aggregation(&self) -> Option> { + self.agg.aggregation() + } +} + +/// An aggregator that applies attribute filter when aggregating for +/// pre-computed aggregations. +/// +/// The pre-computed aggregations need to operate normally when no attribute +/// filtering is done (for sums this means setting the value), but when +/// attribute filtering is done it needs to be added to any set value. +struct PrecomputeFilter> { + filter: Arc bool + Send + Sync>, + agg: Arc>, +} + +impl> Aggregator for PrecomputeFilter { + fn aggregate(&self, measurement: T, mut attrs: AttributeSet) { + let pre_len = attrs.len(); + attrs.retain(self.filter.as_ref()); + if pre_len == attrs.len() { + // No filtering done. + self.agg.aggregate(measurement, attrs) + } else { + self.agg.aggregate_filtered(measurement, attrs) + } + } + + fn aggregation(&self) -> Option> { + self.agg.aggregation() + } +} diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/internal/histogram.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/internal/histogram.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/internal/histogram.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/internal/histogram.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,296 @@ +use std::{ + collections::{hash_map::Entry, HashMap}, + sync::{Arc, Mutex}, + time::SystemTime, +}; + +use crate::attributes::AttributeSet; +use crate::metrics::{ + aggregation, + data::{self, Aggregation}, +}; +use opentelemetry_api::{global, metrics::MetricsError}; + +use super::{aggregator::STREAM_OVERFLOW_ATTRIBUTE_SET, Aggregator, Number}; + +#[derive(Default)] +struct Buckets { + counts: Vec, + count: u64, + sum: T, + min: T, + max: T, +} + +impl> Buckets { + /// returns buckets with `n` bins. + fn new(n: usize) -> Buckets { + Buckets { + counts: vec![0; n], + ..Default::default() + } + } + + fn bin(&mut self, idx: usize, value: T) { + self.counts[idx] += 1; + self.count += 1; + self.sum += value; + if value < self.min { + self.min = value; + } else if value > self.max { + self.max = value + } + } +} + +/// Summarizes a set of measurements as an histValues with explicitly defined buckets. +struct HistValues { + bounds: Vec, + values: Mutex>>, +} + +impl> HistValues { + fn new(mut bounds: Vec) -> Self { + bounds.retain(|v| !v.is_nan()); + bounds.sort_by(|a, b| a.partial_cmp(b).expect("NaNs filtered out")); + + HistValues { + bounds, + values: Mutex::new(Default::default()), + } + } +} + +impl Aggregator for HistValues +where + T: Number, +{ + fn aggregate(&self, measurement: T, attrs: AttributeSet) { + let f = measurement.into_float(); + + // This search will return an index in the range `[0, bounds.len()]`, where + // it will return `bounds.len()` if value is greater than the last element + // of `bounds`. This aligns with the buckets in that the length of buckets + // is `bounds.len()+1`, with the last bucket representing: + // `(bounds[bounds.len()-1], +∞)`. + let idx = self.bounds.partition_point(|&x| x < f); + + let mut values = match self.values.lock() { + Ok(guard) => guard, + Err(_) => return, + }; + let size = values.len(); + + match values.entry(attrs) { + Entry::Occupied(mut occupied_entry) => occupied_entry.get_mut().bin(idx, measurement), + Entry::Vacant(vacant_entry) => { + if self.is_under_cardinality_limit(size) { + // N+1 buckets. For example: + // + // bounds = [0, 5, 10] + // + // Then, + // + // buckets = (-∞, 0], (0, 5.0], (5.0, 10.0], (10.0, +∞) + let mut b = Buckets::new(self.bounds.len() + 1); + // Ensure min and max are recorded values (not zero), for new buckets. + (b.min, b.max) = (measurement, measurement); + b.bin(idx, measurement); + vacant_entry.insert(b); + } else { + values + .entry(STREAM_OVERFLOW_ATTRIBUTE_SET.clone()) + .and_modify(|val| val.bin(idx, measurement)) + .or_insert_with(|| { + let mut b = Buckets::new(self.bounds.len() + 1); + (b.min, b.max) = (measurement, measurement); + b.bin(idx, measurement); + b + }); + global::handle_error(MetricsError::Other("Warning: Maximum data points for metric stream exceeded. Entry added to overflow.".into())); + } + } + } + } + + fn aggregation(&self) -> Option> { + None // Never used + } +} + +/// Returns an Aggregator that summarizes a set of +/// measurements as an histogram. Each histogram is scoped by attributes and +/// the aggregation cycle the measurements were made in. +/// +/// Each aggregation cycle is treated independently. When the returned +/// Aggregator's Aggregations method is called it will reset all histogram +/// counts to zero. +pub(crate) fn new_delta_histogram(cfg: &aggregation::Aggregation) -> Arc> +where + T: Number, +{ + let (boundaries, record_min_max) = match cfg { + aggregation::Aggregation::ExplicitBucketHistogram { + boundaries, + record_min_max, + } => (boundaries.clone(), *record_min_max), + _ => (Vec::new(), true), + }; + + Arc::new(DeltaHistogram { + hist_values: HistValues::new(boundaries), + record_min_max, + start: Mutex::new(SystemTime::now()), + }) +} + +/// Summarizes a set of measurements made in a single aggregation cycle as an +/// histogram with explicitly defined buckets. +struct DeltaHistogram { + hist_values: HistValues, + record_min_max: bool, + start: Mutex, +} + +impl> Aggregator for DeltaHistogram { + fn aggregate(&self, measurement: T, attrs: AttributeSet) { + self.hist_values.aggregate(measurement, attrs) + } + + fn aggregation(&self) -> Option> { + let mut values = match self.hist_values.values.lock() { + Ok(guard) if !guard.is_empty() => guard, + _ => return None, + }; + let mut start = match self.start.lock() { + Ok(guard) => guard, + Err(_) => return None, + }; + + let t = SystemTime::now(); + + let data_points = values + .drain() + .map(|(a, b)| { + let mut hdp = data::HistogramDataPoint { + attributes: a, + start_time: *start, + time: t, + count: b.count, + bounds: self.hist_values.bounds.clone(), + bucket_counts: b.counts, + sum: b.sum, + min: None, + max: None, + exemplars: vec![], + }; + + if self.record_min_max { + hdp.min = Some(b.min); + hdp.max = Some(b.max); + } + + hdp + }) + .collect::>>(); + + // The delta collection cycle resets. + *start = t; + drop(start); + + Some(Box::new(data::Histogram { + temporality: data::Temporality::Delta, + data_points, + })) + } +} + +/// An [Aggregator] that summarizes a set of measurements as an histogram. +/// +/// Each histogram is scoped by attributes. +/// +/// Each aggregation cycle builds from the previous, the histogram counts are +/// the bucketed counts of all values aggregated since the returned Aggregator +/// was created. +pub(crate) fn new_cumulative_histogram(cfg: &aggregation::Aggregation) -> Arc> +where + T: Number, +{ + let (boundaries, record_min_max) = match cfg { + aggregation::Aggregation::ExplicitBucketHistogram { + boundaries, + record_min_max, + } => (boundaries.clone(), *record_min_max), + _ => (Vec::new(), true), + }; + + Arc::new(CumulativeHistogram { + hist_values: HistValues::new(boundaries), + record_min_max, + start: Mutex::new(SystemTime::now()), + }) +} + +/// Summarizes a set of measurements made over all aggregation cycles as an +/// histogram with explicitly defined buckets. +struct CumulativeHistogram { + hist_values: HistValues, + + record_min_max: bool, + start: Mutex, +} + +impl Aggregator for CumulativeHistogram +where + T: Number, +{ + fn aggregate(&self, measurement: T, attrs: AttributeSet) { + self.hist_values.aggregate(measurement, attrs) + } + + fn aggregation(&self) -> Option> { + let mut values = match self.hist_values.values.lock() { + Ok(guard) if !guard.is_empty() => guard, + _ => return None, + }; + let t = SystemTime::now(); + let start = self + .start + .lock() + .map(|s| *s) + .unwrap_or_else(|_| SystemTime::now()); + + // TODO: This will use an unbounded amount of memory if there are unbounded + // number of attribute sets being aggregated. Attribute sets that become + // "stale" need to be forgotten so this will not overload the system. + let data_points = values + .iter_mut() + .map(|(a, b)| { + let mut hdp = data::HistogramDataPoint { + attributes: a.clone(), + start_time: start, + time: t, + count: b.count, + bounds: self.hist_values.bounds.clone(), + bucket_counts: b.counts.clone(), + sum: b.sum, + min: None, + max: None, + exemplars: vec![], + }; + + if self.record_min_max { + hdp.min = Some(b.min); + hdp.max = Some(b.max); + } + + hdp + }) + .collect::>>(); + + Some(Box::new(data::Histogram { + temporality: data::Temporality::Cumulative, + data_points, + })) + } +} diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/internal/last_value.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/internal/last_value.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/internal/last_value.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/internal/last_value.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,73 @@ +use std::{ + collections::{hash_map::Entry, HashMap}, + sync::{Arc, Mutex}, + time::SystemTime, +}; + +use crate::attributes::AttributeSet; +use crate::metrics::data::{self, Gauge}; +use opentelemetry_api::{global, metrics::MetricsError}; + +use super::{aggregator::STREAM_OVERFLOW_ATTRIBUTE_SET, Aggregator, Number}; + +/// Timestamped measurement data. +struct DataPointValue { + timestamp: SystemTime, + value: T, +} + +/// An Aggregator that summarizes a set of measurements as the last one made. +pub(crate) fn new_last_value>() -> Arc> { + Arc::new(LastValue::default()) +} + +/// Summarizes a set of measurements as the last one made. +#[derive(Default)] +struct LastValue { + values: Mutex>>, +} + +impl> Aggregator for LastValue { + fn aggregate(&self, measurement: T, attrs: AttributeSet) { + let d: DataPointValue = DataPointValue { + timestamp: SystemTime::now(), + value: measurement, + }; + if let Ok(mut values) = self.values.lock() { + let size = values.len(); + match values.entry(attrs) { + Entry::Occupied(mut occupied_entry) => { + occupied_entry.insert(d); + } + Entry::Vacant(vacant_entry) => { + if self.is_under_cardinality_limit(size) { + vacant_entry.insert(d); + } else { + values.insert(STREAM_OVERFLOW_ATTRIBUTE_SET.clone(), d); + global::handle_error(MetricsError::Other("Warning: Maximum data points for metric stream exceeded. Entry added to overflow.".into())); + } + } + } + } + } + + fn aggregation(&self) -> Option> { + let mut values = match self.values.lock() { + Ok(guard) if !guard.is_empty() => guard, + _ => return None, + }; + + let data_points = values + .drain() + .map(|(attrs, value)| data::DataPoint { + attributes: attrs, + time: Some(value.timestamp), + value: value.value, + start_time: None, + exemplars: vec![], + }) + .collect(); + + Some(Box::new(Gauge { data_points })) + } +} diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/internal/mod.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/internal/mod.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/internal/mod.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/internal/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,51 @@ +mod aggregator; +mod filter; +mod histogram; +mod last_value; +mod sum; + +use core::fmt; +use std::ops::{Add, AddAssign, Sub}; + +pub(crate) use aggregator::Aggregator; +pub(crate) use filter::new_filter; +pub(crate) use histogram::{new_cumulative_histogram, new_delta_histogram}; +pub(crate) use last_value::new_last_value; +pub(crate) use sum::{ + new_cumulative_sum, new_delta_sum, new_precomputed_cumulative_sum, new_precomputed_delta_sum, +}; + +pub(crate) trait Number: + Add + + AddAssign + + Sub + + PartialOrd + + fmt::Debug + + Clone + + Copy + + PartialEq + + Default + + Send + + Sync + + 'static +{ + fn into_float(self) -> f64; +} + +impl Number for i64 { + fn into_float(self) -> f64 { + // May have precision loss at high values + self as f64 + } +} +impl Number for u64 { + fn into_float(self) -> f64 { + // May have precision loss at high values + self as f64 + } +} +impl Number for f64 { + fn into_float(self) -> f64 { + self + } +} diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/internal/sum.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/internal/sum.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/internal/sum.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/internal/sum.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,473 @@ +use std::{ + collections::{hash_map::Entry, HashMap}, + sync::{Arc, Mutex}, + time::SystemTime, +}; + +use crate::attributes::AttributeSet; +use crate::metrics::data::{self, Aggregation, DataPoint, Temporality}; +use opentelemetry_api::{global, metrics::MetricsError}; + +use super::{ + aggregator::{PrecomputeAggregator, STREAM_OVERFLOW_ATTRIBUTE_SET}, + Aggregator, Number, +}; + +/// The storage for sums. +#[derive(Default)] +struct ValueMap> { + values: Mutex>, +} + +impl> ValueMap { + pub(crate) fn new() -> Self { + ValueMap { + values: Mutex::new(HashMap::new()), + } + } +} + +impl> Aggregator for ValueMap { + fn aggregate(&self, measurement: T, attrs: AttributeSet) { + if let Ok(mut values) = self.values.lock() { + let size = values.len(); + match values.entry(attrs) { + Entry::Occupied(mut occupied_entry) => { + let sum = occupied_entry.get_mut(); + *sum += measurement; + } + Entry::Vacant(vacant_entry) => { + if self.is_under_cardinality_limit(size) { + vacant_entry.insert(measurement); + } else { + values + .entry(STREAM_OVERFLOW_ATTRIBUTE_SET.clone()) + .and_modify(|val| *val += measurement) + .or_insert(measurement); + global::handle_error(MetricsError::Other("Warning: Maximum data points for metric stream exceeded. Entry added to overflow.".into())); + } + } + } + } + } + + fn aggregation(&self) -> Option> { + None // Never called directly + } +} + +/// Returns an [Aggregator] that summarizes a set of measurements as their +/// arithmetic sum. +/// +/// Each sum is scoped by attributes and the aggregation cycle the measurements +/// were made in. +/// +/// The `monotonic` value is used to specify if the produced [Aggregation] is +/// monotonic or not. The returned [Aggregator] does not make any guarantees this +/// value is accurate. It is up to the caller to ensure it. +/// +/// Each aggregation cycle is treated independently. When the returned +/// [Aggregator::aggregation] method is called it will reset all sums to zero. +pub(crate) fn new_delta_sum(monotonic: bool) -> Arc> +where + T: Number, +{ + Arc::new(DeltaSum { + value_map: ValueMap::new(), + monotonic, + start: Mutex::new(SystemTime::now()), + }) +} + +/// Summarizes a set of measurements made in a single aggregation cycle as their +/// arithmetic sum. +struct DeltaSum> { + value_map: ValueMap, + monotonic: bool, + start: Mutex, +} + +impl Aggregator for DeltaSum +where + T: Number, +{ + fn aggregate(&self, measurement: T, attrs: AttributeSet) { + self.value_map.aggregate(measurement, attrs) + } + + fn aggregation(&self) -> Option> { + let mut values = match self.value_map.values.lock() { + Ok(guard) => guard, + Err(_) => return None, + }; + + if values.is_empty() { + return None; + } + + let t = SystemTime::now(); + let prev_start = self.start.lock().map(|start| *start).unwrap_or(t); + let data_points = values + .drain() + .map(|(attrs, value)| DataPoint { + attributes: attrs, + start_time: Some(prev_start), + time: Some(t), + value, + exemplars: vec![], + }) + .collect(); + let out = data::Sum { + temporality: Temporality::Delta, + is_monotonic: self.monotonic, + data_points, + }; + + // The delta collection cycle resets. + if let Ok(mut start) = self.start.lock() { + *start = t; + } + + Some(Box::new(out)) + } +} + +/// Returns an [Aggregator] that summarizes a set of measurements as their +/// arithmetic sum. +/// +/// Each sum is scoped by attributes and the aggregation cycle the measurements +/// were made in. +/// +/// The monotonic value is used to communicate the produced [Aggregation] is +/// monotonic or not. The returned [Aggregator] does not make any guarantees this +/// value is accurate. It is up to the caller to ensure it. +/// +/// Each aggregation cycle is treated independently. When the returned +/// Aggregator's Aggregation method is called it will reset all sums to zero. +pub(crate) fn new_cumulative_sum>(monotonic: bool) -> Arc> { + Arc::new(CumulativeSum { + value_map: ValueMap::new(), + monotonic, + start: Mutex::new(SystemTime::now()), + }) +} + +/// Summarizes a set of measurements made over all aggregation cycles as their +/// arithmetic sum. +struct CumulativeSum> { + value_map: ValueMap, + monotonic: bool, + start: Mutex, +} + +impl> Aggregator for CumulativeSum { + fn aggregate(&self, measurement: T, attrs: AttributeSet) { + self.value_map.aggregate(measurement, attrs) + } + + fn aggregation(&self) -> Option> { + let values = match self.value_map.values.lock() { + Ok(guard) => guard, + Err(_) => return None, + }; + + if values.is_empty() { + return None; + } + + let t = SystemTime::now(); + let prev_start = self.start.lock().map(|start| *start).unwrap_or(t); + // TODO: This will use an unbounded amount of memory if there + // are unbounded number of attribute sets being aggregated. Attribute + // sets that become "stale" need to be forgotten so this will not + // overload the system. + let data_points = values + .iter() + .map(|(attrs, value)| DataPoint { + attributes: attrs.clone(), + start_time: Some(prev_start), + time: Some(t), + value: *value, + exemplars: vec![], + }) + .collect(); + + let out: data::Sum = data::Sum { + temporality: Temporality::Cumulative, + is_monotonic: self.monotonic, + data_points, + }; + + Some(Box::new(out)) + } +} + +/// The recorded measurement value for a set of attributes. +#[derive(Default)] +struct PrecomputedValue> { + /// The last value measured for a set of attributes that were not filtered. + measured: T, + /// The sum of values from measurements that had their attributes filtered. + filtered: T, +} + +/// The storage for precomputed sums. +#[derive(Default)] +struct PrecomputedMap> { + values: Mutex>>, +} + +impl> PrecomputedMap { + pub(crate) fn new() -> Self { + Default::default() + } +} + +impl> Aggregator for PrecomputedMap { + fn aggregate(&self, measurement: T, attrs: AttributeSet) { + let mut values = match self.values.lock() { + Ok(guard) => guard, + Err(_) => return, + }; + let size = values.len(); + match values.entry(attrs) { + Entry::Occupied(mut occupied_entry) => { + let v = occupied_entry.get_mut(); + v.measured = measurement; + } + Entry::Vacant(vacant_entry) => { + if self.is_under_cardinality_limit(size) { + vacant_entry.insert(PrecomputedValue { + measured: measurement, + ..Default::default() + }); + } else { + values.insert( + STREAM_OVERFLOW_ATTRIBUTE_SET.clone(), + PrecomputedValue { + measured: measurement, + ..Default::default() + }, + ); + global::handle_error(MetricsError::Other("Warning: Maximum data points for metric stream exceeded. Entry added to overflow.".into())); + } + } + } + } + + fn aggregation(&self) -> Option> { + None // Never called + } +} + +impl> PrecomputeAggregator for PrecomputedMap { + fn aggregate_filtered(&self, measurement: T, attrs: AttributeSet) { + let mut values = match self.values.lock() { + Ok(guard) => guard, + Err(_) => return, + }; + + values + .entry(attrs) + .and_modify(|v| v.filtered = measurement) + .or_insert(PrecomputedValue { + filtered: measurement, + ..Default::default() + }); + } +} + +/// An [Aggregator] that summarizes a set of pre-computed sums. +/// +/// Each sum is scoped by attributes and the aggregation cycle the measurements +/// were made in. +/// +/// The `monotonic` value is used to specify if the produced [Aggregation] is +/// monotonic or not. The returned [Aggregator] does not make any guarantees this +/// value is accurate. It is up to the caller to ensure it. +/// +/// The output [Aggregation] will report recorded values as delta temporality. +pub(crate) fn new_precomputed_delta_sum(monotonic: bool) -> Arc> +where + T: Number, +{ + Arc::new(PrecomputedDeltaSum { + precomputed_map: PrecomputedMap::new(), + reported: Default::default(), + monotonic, + start: Mutex::new(SystemTime::now()), + }) +} + +/// Summarizes a set of pre-computed sums recorded over all aggregation cycles +/// as the delta of these sums. +pub(crate) struct PrecomputedDeltaSum> { + precomputed_map: PrecomputedMap, + reported: Mutex>, + monotonic: bool, + start: Mutex, +} + +impl Aggregator for PrecomputedDeltaSum +where + T: Number, +{ + fn aggregate(&self, measurement: T, attrs: AttributeSet) { + self.precomputed_map.aggregate(measurement, attrs) + } + + /// Returns the recorded pre-computed sums as an [Aggregation]. + /// + /// The sum values are expressed as the delta between what was measured this + /// collection cycle and the previous. + /// + /// All pre-computed sums that were recorded for attributes sets reduced by an + /// attribute filter (filtered-sums) are summed together and added to any + /// pre-computed sum value recorded directly for the resulting attribute set + /// (unfiltered-sum). The filtered-sums are reset to zero for the next + /// collection cycle, and the unfiltered-sum is kept for the next collection + /// cycle. + fn aggregation(&self) -> Option> { + let mut values = match self.precomputed_map.values.lock() { + Ok(guard) => guard, + Err(_) => return None, + }; + let mut reported = match self.reported.lock() { + Ok(guard) => guard, + Err(_) => return None, + }; + + if values.is_empty() { + return None; + } + + let t = SystemTime::now(); + let prev_start = self.start.lock().map(|start| *start).unwrap_or(t); + // TODO: This will use an unbounded amount of memory if there + // are unbounded number of attribute sets being aggregated. Attribute + // sets that become "stale" need to be forgotten so this will not + // overload the system. + let data_points = values + .iter_mut() + .map(|(attrs, value)| { + let v: T = value.measured.sub(value.filtered); + let default = T::default(); + let delta = v - *reported.get(attrs).unwrap_or(&default); + if delta != default { + reported.insert(attrs.clone(), v); + } + value.filtered = T::default(); + DataPoint { + attributes: attrs.clone(), + start_time: Some(prev_start), + time: Some(t), + value: delta, + exemplars: vec![], + } + }) + .collect(); + let out = data::Sum { + temporality: Temporality::Delta, + is_monotonic: self.monotonic, + data_points, + }; + + // The delta collection cycle resets. + let _ = self.start.lock().map(|mut start| *start = t); + + drop(reported); // drop before values guard is dropped + + Some(Box::new(out)) + } +} + +/// An [Aggregator] that summarizes a set of pre-computed sums. +/// +/// Each sum is scoped by attributes and the aggregation cycle the measurements +/// were made in. +/// +/// The `monotonic` value is used to specify if the produced [Aggregation] is +/// monotonic or not. The returned [Aggregator] does not make any guarantees this +/// value is accurate. It is up to the caller to ensure it. +/// +/// The output [Aggregation] will report recorded values as cumulative +/// temporality. +pub(crate) fn new_precomputed_cumulative_sum(monotonic: bool) -> Arc> +where + T: Number, +{ + Arc::new(PrecomputedCumulativeSum { + precomputed_map: PrecomputedMap::default(), + monotonic, + start: Mutex::new(SystemTime::now()), + }) +} + +/// Directly records and reports a set of pre-computed sums. +pub(crate) struct PrecomputedCumulativeSum> { + precomputed_map: PrecomputedMap, + monotonic: bool, + start: Mutex, +} + +impl Aggregator for PrecomputedCumulativeSum +where + T: Number, +{ + fn aggregate(&self, measurement: T, attrs: AttributeSet) { + self.precomputed_map.aggregate(measurement, attrs) + } + + /// Returns the recorded pre-computed sums as an [Aggregation]. + /// + /// The sum values are expressed directly as they are assumed to be recorded as + /// the cumulative sum of a some measured phenomena. + /// + /// All pre-computed sums that were recorded for attributes sets reduced by an + /// attribute filter (filtered-sums) are summed together and added to any + /// pre-computed sum value recorded directly for the resulting attribute set + /// (unfiltered-sum). The filtered-sums are reset to zero for the next + /// collection cycle, and the unfiltered-sum is kept for the next collection + /// cycle. + fn aggregation(&self) -> Option> { + let mut values = match self.precomputed_map.values.lock() { + Ok(guard) => guard, + Err(_) => return None, + }; + + if values.is_empty() { + return None; + } + + let t = SystemTime::now(); + let prev_start = self.start.lock().map(|start| *start).unwrap_or(t); + // TODO: This will use an unbounded amount of memory if there + // are unbounded number of attribute sets being aggregated. Attribute + // sets that become "stale" need to be forgotten so this will not + // overload the system. + let data_points = values + .iter_mut() + .map(|(attrs, value)| { + let v = value.measured + value.filtered; + value.filtered = T::default(); + DataPoint { + attributes: attrs.clone(), + start_time: Some(prev_start), + time: Some(t), + value: v, + exemplars: vec![], + } + }) + .collect(); + let out = data::Sum { + temporality: Temporality::Cumulative, + is_monotonic: self.monotonic, + data_points, + }; + + // The delta collection cycle resets. + let _ = self.start.lock().map(|mut start| *start = t); + + Some(Box::new(out)) + } +} diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/manual_reader.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/manual_reader.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/manual_reader.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/manual_reader.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,221 @@ +use std::{ + fmt, + sync::{Mutex, Weak}, +}; + +use opentelemetry_api::{ + global, + metrics::{MetricsError, Result}, + Context, +}; + +use super::{ + data::{ResourceMetrics, Temporality}, + instrument::InstrumentKind, + pipeline::Pipeline, + reader::{ + AggregationSelector, DefaultAggregationSelector, DefaultTemporalitySelector, + MetricProducer, MetricReader, SdkProducer, TemporalitySelector, + }, +}; + +/// A simple [MetricReader] that allows an application to read metrics on demand. +/// +/// See [ManualReaderBuilder] for configuration options. +/// +/// # Example +/// +/// ``` +/// use opentelemetry_sdk::metrics::ManualReader; +/// +/// // can specify additional reader configuration +/// let reader = ManualReader::builder().build(); +/// # drop(reader) +/// ``` +pub struct ManualReader { + inner: Box>, + temporality_selector: Box, + aggregation_selector: Box, +} + +impl Default for ManualReader { + fn default() -> Self { + ManualReader::builder().build() + } +} + +impl fmt::Debug for ManualReader { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.write_str("ManualReader") + } +} + +#[derive(Debug, Default)] +struct ManualReaderInner { + sdk_producer: Option>, + is_shutdown: bool, + external_producers: Vec>, +} + +impl ManualReader { + /// Configuration for this reader + pub fn builder() -> ManualReaderBuilder { + ManualReaderBuilder::default() + } + + /// A [MetricReader] which is directly called to collect metrics. + pub(crate) fn new( + temporality_selector: Box, + aggregation_selector: Box, + ) -> Self { + ManualReader { + inner: Box::new(Mutex::new(ManualReaderInner::default())), + temporality_selector, + aggregation_selector, + } + } +} + +impl TemporalitySelector for ManualReader { + fn temporality(&self, kind: InstrumentKind) -> Temporality { + self.temporality_selector.temporality(kind) + } +} + +impl AggregationSelector for ManualReader { + fn aggregation(&self, kind: InstrumentKind) -> super::aggregation::Aggregation { + self.aggregation_selector.aggregation(kind) + } +} + +impl MetricReader for ManualReader { + /// Register a pipeline which enables the caller to read metrics from the SDK + /// on demand. + fn register_pipeline(&self, pipeline: Weak) { + let _ = self.inner.lock().map(|mut inner| { + // Only register once. If producer is already set, do nothing. + if inner.sdk_producer.is_none() { + inner.sdk_producer = Some(pipeline); + } else { + global::handle_error(MetricsError::Config( + "duplicate reader registration, did not register manual reader".into(), + )) + } + }); + } + + /// Stores the external [MetricProducer] which enables the caller to read + /// metrics on demand. + fn register_producer(&self, producer: Box) { + let _ = self.inner.lock().map(|mut inner| { + if !inner.is_shutdown { + inner.external_producers.push(producer); + } + }); + } + + /// Gathers all metrics from the SDK and other [MetricProducer]s, calling any + /// callbacks necessary and returning the results. + /// + /// Returns an error if called after shutdown. + fn collect(&self, rm: &mut ResourceMetrics) -> Result<()> { + let inner = self.inner.lock()?; + match &inner.sdk_producer.as_ref().and_then(|w| w.upgrade()) { + Some(producer) => producer.produce(rm)?, + None => { + return Err(MetricsError::Other( + "reader is shut down or not registered".into(), + )) + } + }; + + let mut errs = vec![]; + for producer in &inner.external_producers { + match producer.produce() { + Ok(metrics) => rm.scope_metrics.push(metrics), + Err(err) => errs.push(err), + } + } + + if errs.is_empty() { + Ok(()) + } else { + Err(MetricsError::Other(format!("{:?}", errs))) + } + } + + /// ForceFlush is a no-op, it always returns nil. + fn force_flush(&self, _cx: &Context) -> Result<()> { + Ok(()) + } + + /// Closes any connections and frees any resources used by the reader. + fn shutdown(&self) -> Result<()> { + let mut inner = self.inner.lock()?; + + // Any future call to collect will now return an error. + inner.sdk_producer = None; + inner.is_shutdown = true; + inner.external_producers = Vec::new(); + + Ok(()) + } +} + +/// Configuration for a [ManualReader] +pub struct ManualReaderBuilder { + temporality_selector: Box, + aggregation_selector: Box, +} + +impl fmt::Debug for ManualReaderBuilder { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.write_str("ManualReaderBuilder") + } +} + +impl Default for ManualReaderBuilder { + fn default() -> Self { + ManualReaderBuilder { + temporality_selector: Box::new(DefaultTemporalitySelector { _private: () }), + aggregation_selector: Box::new(DefaultAggregationSelector { _private: () }), + } + } +} + +impl ManualReaderBuilder { + /// New manual builder configuration + pub fn new() -> Self { + Default::default() + } + + /// Sets the [TemporalitySelector] a reader will use to determine the [Temporality] of + /// an instrument based on its kind. If this option is not used, the reader will use + /// the default temporality selector. + pub fn with_temporality_selector( + mut self, + temporality_selector: impl TemporalitySelector + 'static, + ) -> Self { + self.temporality_selector = Box::new(temporality_selector); + self + } + + /// Sets the [AggregationSelector] a reader will use to determine the + /// aggregation to use for an instrument based on its kind. + /// + /// If this option is not used, the reader will use the default aggregation + /// selector or the aggregation explicitly passed for a view matching an + /// instrument. + pub fn with_aggregation_selector( + mut self, + aggregation_selector: Box, + ) -> Self { + self.aggregation_selector = aggregation_selector; + self + } + + /// Create a new [ManualReader] from this configuration. + pub fn build(self) -> ManualReader { + ManualReader::new(self.temporality_selector, self.aggregation_selector) + } +} diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/meter_provider.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/meter_provider.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/meter_provider.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/meter_provider.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,160 @@ +use core::fmt; +use std::{ + borrow::Cow, + sync::{ + atomic::{AtomicBool, Ordering}, + Arc, + }, +}; + +use opentelemetry_api::{ + metrics::{noop::NoopMeterCore, InstrumentProvider, Meter as ApiMeter, MetricsError, Result}, + Context, KeyValue, +}; + +use crate::{instrumentation::Scope, Resource}; + +use super::{meter::Meter as SdkMeter, pipeline::Pipelines, reader::MetricReader, view::View}; + +/// Handles the creation and coordination of [Meter]s. +/// +/// All `Meter`s created by a `MeterProvider` will be associated with the same +/// [Resource], have the same [View]s applied to them, and have their produced +/// metric telemetry passed to the configured [MetricReader]s. +/// +/// [Meter]: crate::metrics::Meter +#[derive(Clone, Debug)] +pub struct MeterProvider { + pipes: Arc, + is_shutdown: Arc, +} + +impl MeterProvider { + /// Flushes all pending telemetry. + /// + /// There is no guaranteed that all telemetry be flushed or all resources have + /// been released on error. + pub fn builder() -> MeterProviderBuilder { + MeterProviderBuilder::default() + } + + /// Flushes all pending telemetry. + /// + /// There is no guaranteed that all telemetry be flushed or all resources have + /// been released on error. + pub fn force_flush(&self, cx: &Context) -> Result<()> { + self.pipes.force_flush(cx) + } + + /// Shuts down the meter provider flushing all pending telemetry and releasing + /// any held computational resources. + /// + /// This call is idempotent. The first call will perform all flush and releasing + /// operations. Subsequent calls will perform no action and will return an error + /// stating this. + /// + /// Measurements made by instruments from meters this MeterProvider created will + /// not be exported after Shutdown is called. + /// + /// There is no guaranteed that all telemetry be flushed or all resources have + /// been released on error. + pub fn shutdown(&self) -> Result<()> { + if self + .is_shutdown + .compare_exchange(false, true, Ordering::SeqCst, Ordering::SeqCst) + .is_ok() + { + self.pipes.shutdown() + } else { + Err(MetricsError::Other( + "metrics provider already shut down".into(), + )) + } + } +} + +impl opentelemetry_api::metrics::MeterProvider for MeterProvider { + fn versioned_meter( + &self, + name: impl Into>, + version: Option>>, + schema_url: Option>>, + attributes: Option>, + ) -> ApiMeter { + let inst_provider: Arc = + if !self.is_shutdown.load(Ordering::Relaxed) { + let scope = Scope::new(name, version, schema_url, attributes); + Arc::new(SdkMeter::new(scope, self.pipes.clone())) + } else { + Arc::new(NoopMeterCore::new()) + }; + + ApiMeter::new(inst_provider) + } +} + +/// Configuration options for a [MeterProvider]. +#[derive(Default)] +pub struct MeterProviderBuilder { + resource: Option, + readers: Vec>, + views: Vec>, +} + +impl MeterProviderBuilder { + /// Associates a [Resource] with a [MeterProvider]. + /// + /// This [Resource] represents the entity producing telemetry and is associated + /// with all [Meter]s the [MeterProvider] will create. + /// + /// By default, if this option is not used, the default [Resource] will be used. + /// + /// [Meter]: crate::metrics::Meter + pub fn with_resource(mut self, resource: Resource) -> Self { + self.resource = Some(resource); + self + } + + /// Associates a [MetricReader] with a [MeterProvider]. + /// + /// By default, if this option is not used, the [MeterProvider] will perform no + /// operations; no data will be exported without a [MetricReader]. + pub fn with_reader(mut self, reader: T) -> Self { + self.readers.push(Box::new(reader)); + self + } + + /// Associates a [View] with a [MeterProvider]. + /// + /// [View]s are appended to existing ones in a [MeterProvider] if this option is + /// used multiple times. + /// + /// By default, if this option is not used, the [MeterProvider] will use the + /// default view. + pub fn with_view(mut self, view: T) -> Self { + self.views.push(Arc::new(view)); + self + } + + /// Construct a new [MeterProvider] with this configuration. + pub fn build(self) -> MeterProvider { + MeterProvider { + pipes: Arc::new(Pipelines::new( + self.resource.unwrap_or_default(), + self.readers, + self.views, + )), + is_shutdown: Arc::new(AtomicBool::new(false)), + } + } +} + +impl fmt::Debug for MeterProviderBuilder { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_struct("MeterProviderBuilder") + .field("resource", &self.resource) + .field("readers", &self.readers) + .field("views", &self.views.len()) + .finish() + } +} diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/meter.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/meter.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/meter.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/meter.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,628 @@ +use core::fmt; +use std::{ + any::Any, + borrow::Cow, + collections::{HashMap, HashSet}, + sync::{Arc, Mutex}, +}; + +use opentelemetry_api::{ + global, + metrics::{ + noop::{NoopAsyncInstrument, NoopRegistration}, + AsyncInstrument, Callback, CallbackRegistration, Counter, Histogram, InstrumentProvider, + MetricsError, ObservableCounter, ObservableGauge, ObservableUpDownCounter, + Observer as ApiObserver, Result, Unit, UpDownCounter, + }, + KeyValue, +}; + +use crate::instrumentation::Scope; +use crate::metrics::{ + instrument::{ + Instrument, InstrumentImpl, InstrumentKind, Observable, ObservableId, StreamId, + EMPTY_AGG_MSG, + }, + internal::{self, Number}, + pipeline::{Pipelines, Resolver}, +}; + +/// Handles the creation and coordination of all metric instruments. +/// +/// A meter represents a single instrumentation scope; all metric telemetry +/// produced by an instrumentation scope will use metric instruments from a +/// single meter. +/// +/// See the [Meter API] docs for usage. +/// +/// [Meter API]: opentelemetry_api::metrics::Meter +pub struct Meter { + scope: Scope, + pipes: Arc, + u64_inst_provider: InstProvider, + i64_inst_provider: InstProvider, + f64_inst_provider: InstProvider, +} + +impl Meter { + pub(crate) fn new(scope: Scope, pipes: Arc) -> Self { + let view_cache = Default::default(); + + Meter { + scope: scope.clone(), + pipes: Arc::clone(&pipes), + u64_inst_provider: InstProvider::new( + scope.clone(), + Arc::clone(&pipes), + Arc::clone(&view_cache), + ), + i64_inst_provider: InstProvider::new( + scope.clone(), + Arc::clone(&pipes), + Arc::clone(&view_cache), + ), + f64_inst_provider: InstProvider::new(scope, pipes, view_cache), + } + } +} + +#[doc(hidden)] +impl InstrumentProvider for Meter { + fn u64_counter( + &self, + name: Cow<'static, str>, + description: Option>, + unit: Option, + ) -> Result> { + self.u64_inst_provider + .lookup( + InstrumentKind::Counter, + name, + description, + unit.unwrap_or_default(), + ) + .map(|i| Counter::new(Arc::new(i))) + } + + fn f64_counter( + &self, + name: Cow<'static, str>, + description: Option>, + unit: Option, + ) -> Result> { + self.f64_inst_provider + .lookup( + InstrumentKind::Counter, + name, + description, + unit.unwrap_or_default(), + ) + .map(|i| Counter::new(Arc::new(i))) + } + + fn u64_observable_counter( + &self, + name: Cow<'static, str>, + description: Option>, + unit: Option, + callbacks: Vec>, + ) -> Result> { + let aggs = self.u64_inst_provider.aggregators( + InstrumentKind::ObservableCounter, + name.clone(), + description.clone(), + unit.clone().unwrap_or_default(), + )?; + if aggs.is_empty() { + return Ok(ObservableCounter::new(Arc::new(NoopAsyncInstrument::new()))); + } + + let observable = Arc::new(Observable::new( + self.scope.clone(), + InstrumentKind::ObservableCounter, + name, + description.unwrap_or_default(), + unit.unwrap_or_default(), + aggs, + )); + + for callback in callbacks { + let cb_inst = Arc::clone(&observable); + self.pipes + .register_callback(move || callback(cb_inst.as_ref())); + } + + Ok(ObservableCounter::new(observable)) + } + + fn f64_observable_counter( + &self, + name: Cow<'static, str>, + description: Option>, + unit: Option, + callbacks: Vec>, + ) -> Result> { + let aggs = self.f64_inst_provider.aggregators( + InstrumentKind::ObservableCounter, + name.clone(), + description.clone(), + unit.clone().unwrap_or_default(), + )?; + if aggs.is_empty() { + return Ok(ObservableCounter::new(Arc::new(NoopAsyncInstrument::new()))); + } + let observable = Arc::new(Observable::new( + self.scope.clone(), + InstrumentKind::ObservableCounter, + name, + description.unwrap_or_default(), + unit.unwrap_or_default(), + aggs, + )); + + for callback in callbacks { + let cb_inst = Arc::clone(&observable); + self.pipes + .register_callback(move || callback(cb_inst.as_ref())); + } + + Ok(ObservableCounter::new(observable)) + } + + fn i64_up_down_counter( + &self, + name: Cow<'static, str>, + description: Option>, + unit: Option, + ) -> Result> { + self.i64_inst_provider + .lookup( + InstrumentKind::UpDownCounter, + name, + description, + unit.unwrap_or_default(), + ) + .map(|i| UpDownCounter::new(Arc::new(i))) + } + + fn f64_up_down_counter( + &self, + name: Cow<'static, str>, + description: Option>, + unit: Option, + ) -> Result> { + self.f64_inst_provider + .lookup( + InstrumentKind::UpDownCounter, + name, + description, + unit.unwrap_or_default(), + ) + .map(|i| UpDownCounter::new(Arc::new(i))) + } + + fn i64_observable_up_down_counter( + &self, + name: Cow<'static, str>, + description: Option>, + unit: Option, + callbacks: Vec>, + ) -> Result> { + let aggs = self.i64_inst_provider.aggregators( + InstrumentKind::ObservableUpDownCounter, + name.clone(), + description.clone(), + unit.clone().unwrap_or_default(), + )?; + if aggs.is_empty() { + return Ok(ObservableUpDownCounter::new(Arc::new( + NoopAsyncInstrument::new(), + ))); + } + + let observable = Arc::new(Observable::new( + self.scope.clone(), + InstrumentKind::ObservableUpDownCounter, + name, + description.unwrap_or_default(), + unit.unwrap_or_default(), + aggs, + )); + + for callback in callbacks { + let cb_inst = Arc::clone(&observable); + self.pipes + .register_callback(move || callback(cb_inst.as_ref())); + } + + Ok(ObservableUpDownCounter::new(observable)) + } + + fn f64_observable_up_down_counter( + &self, + name: Cow<'static, str>, + description: Option>, + unit: Option, + callbacks: Vec>, + ) -> Result> { + let aggs = self.f64_inst_provider.aggregators( + InstrumentKind::ObservableUpDownCounter, + name.clone(), + description.clone(), + unit.clone().unwrap_or_default(), + )?; + if aggs.is_empty() { + return Ok(ObservableUpDownCounter::new(Arc::new( + NoopAsyncInstrument::new(), + ))); + } + + let observable = Arc::new(Observable::new( + self.scope.clone(), + InstrumentKind::ObservableUpDownCounter, + name, + description.unwrap_or_default(), + unit.unwrap_or_default(), + aggs, + )); + + for callback in callbacks { + let cb_inst = Arc::clone(&observable); + self.pipes + .register_callback(move || callback(cb_inst.as_ref())); + } + + Ok(ObservableUpDownCounter::new(observable)) + } + + fn u64_observable_gauge( + &self, + name: Cow<'static, str>, + description: Option>, + unit: Option, + callbacks: Vec>, + ) -> Result> { + let aggs = self.u64_inst_provider.aggregators( + InstrumentKind::ObservableGauge, + name.clone(), + description.clone(), + unit.clone().unwrap_or_default(), + )?; + if aggs.is_empty() { + return Ok(ObservableGauge::new(Arc::new(NoopAsyncInstrument::new()))); + } + + let observable = Arc::new(Observable::new( + self.scope.clone(), + InstrumentKind::ObservableGauge, + name, + description.unwrap_or_default(), + unit.unwrap_or_default(), + aggs, + )); + + for callback in callbacks { + let cb_inst = Arc::clone(&observable); + self.pipes + .register_callback(move || callback(cb_inst.as_ref())); + } + + Ok(ObservableGauge::new(observable)) + } + + fn i64_observable_gauge( + &self, + name: Cow<'static, str>, + description: Option>, + unit: Option, + callbacks: Vec>, + ) -> Result> { + let aggs = self.i64_inst_provider.aggregators( + InstrumentKind::ObservableGauge, + name.clone(), + description.clone(), + unit.clone().unwrap_or_default(), + )?; + if aggs.is_empty() { + return Ok(ObservableGauge::new(Arc::new(NoopAsyncInstrument::new()))); + } + + let observable = Arc::new(Observable::new( + self.scope.clone(), + InstrumentKind::ObservableGauge, + name, + description.unwrap_or_default(), + unit.unwrap_or_default(), + aggs, + )); + + for callback in callbacks { + let cb_inst = Arc::clone(&observable); + self.pipes + .register_callback(move || callback(cb_inst.as_ref())); + } + + Ok(ObservableGauge::new(observable)) + } + + fn f64_observable_gauge( + &self, + name: Cow<'static, str>, + description: Option>, + unit: Option, + callbacks: Vec>, + ) -> Result> { + let aggs = self.f64_inst_provider.aggregators( + InstrumentKind::ObservableGauge, + name.clone(), + description.clone(), + unit.clone().unwrap_or_default(), + )?; + if aggs.is_empty() { + return Ok(ObservableGauge::new(Arc::new(NoopAsyncInstrument::new()))); + } + + let observable = Arc::new(Observable::new( + self.scope.clone(), + InstrumentKind::ObservableGauge, + name, + description.unwrap_or_default(), + unit.unwrap_or_default(), + aggs, + )); + + for callback in callbacks { + let cb_inst = Arc::clone(&observable); + self.pipes + .register_callback(move || callback(cb_inst.as_ref())); + } + + Ok(ObservableGauge::new(observable)) + } + + fn f64_histogram( + &self, + name: Cow<'static, str>, + description: Option>, + unit: Option, + ) -> Result> { + self.f64_inst_provider + .lookup( + InstrumentKind::Histogram, + name, + description, + unit.unwrap_or_default(), + ) + .map(|i| Histogram::new(Arc::new(i))) + } + + fn u64_histogram( + &self, + name: Cow<'static, str>, + description: Option>, + unit: Option, + ) -> Result> { + self.u64_inst_provider + .lookup( + InstrumentKind::Histogram, + name, + description, + unit.unwrap_or_default(), + ) + .map(|i| Histogram::new(Arc::new(i))) + } + + fn i64_histogram( + &self, + name: Cow<'static, str>, + description: Option>, + unit: Option, + ) -> Result> { + self.i64_inst_provider + .lookup( + InstrumentKind::Histogram, + name, + description, + unit.unwrap_or_default(), + ) + .map(|i| Histogram::new(Arc::new(i))) + } + + fn register_callback( + &self, + insts: &[Arc], + callback: Box, + ) -> Result> { + if insts.is_empty() { + return Ok(Box::new(NoopRegistration::new())); + } + + let mut reg = Observer::default(); + let mut errs = vec![]; + for inst in insts { + if let Some(i64_obs) = inst.downcast_ref::>() { + if let Err(err) = i64_obs.registerable(&self.scope) { + if !err.to_string().contains(EMPTY_AGG_MSG) { + errs.push(err); + } + continue; + } + reg.register_i64(i64_obs.id.clone()); + } else if let Some(u64_obs) = inst.downcast_ref::>() { + if let Err(err) = u64_obs.registerable(&self.scope) { + if !err.to_string().contains(EMPTY_AGG_MSG) { + errs.push(err); + } + continue; + } + reg.register_u64(u64_obs.id.clone()); + } else if let Some(f64_obs) = inst.downcast_ref::>() { + if let Err(err) = f64_obs.registerable(&self.scope) { + if !err.to_string().contains(EMPTY_AGG_MSG) { + errs.push(err); + } + continue; + } + reg.register_f64(f64_obs.id.clone()); + } else { + // Instrument external to the SDK. + return Err(MetricsError::Other( + "invalid observable: from different implementation".into(), + )); + } + } + + if !errs.is_empty() { + return Err(MetricsError::Other(format!("{errs:?}"))); + } + + if reg.is_empty() { + // All instruments use drop aggregation. + return Ok(Box::new(NoopRegistration::new())); + } + + self.pipes.register_multi_callback(move || callback(®)) + } +} + +#[derive(Default)] +struct Observer { + f64s: HashSet>, + i64s: HashSet>, + u64s: HashSet>, +} + +impl Observer { + fn is_empty(&self) -> bool { + self.f64s.is_empty() && self.i64s.is_empty() && self.u64s.is_empty() + } + + pub(crate) fn register_i64(&mut self, id: ObservableId) { + self.i64s.insert(id); + } + + pub(crate) fn register_f64(&mut self, id: ObservableId) { + self.f64s.insert(id); + } + + pub(crate) fn register_u64(&mut self, id: ObservableId) { + self.u64s.insert(id); + } +} + +impl ApiObserver for Observer { + fn observe_f64(&self, inst: &dyn AsyncInstrument, measurement: f64, attrs: &[KeyValue]) { + if let Some(f64_obs) = inst.as_any().downcast_ref::>() { + if self.f64s.contains(&f64_obs.id) { + f64_obs.observe(measurement, attrs) + } else { + global::handle_error( + MetricsError::Other(format!("observable instrument not registered for callback, failed to record. name: {}, description: {}, unit: {:?}, number: f64", + f64_obs.id.inner.name, + f64_obs.id.inner.description, + f64_obs.id.inner.unit, + ))) + } + } else { + global::handle_error(MetricsError::Other( + "unknown observable instrument, failed to record.".into(), + )) + } + } + + fn observe_u64(&self, inst: &dyn AsyncInstrument, measurement: u64, attrs: &[KeyValue]) { + if let Some(u64_obs) = inst.as_any().downcast_ref::>() { + if self.u64s.contains(&u64_obs.id) { + u64_obs.observe(measurement, attrs) + } else { + global::handle_error( + MetricsError::Other(format!("observable instrument not registered for callback, failed to record. name: {}, description: {}, unit: {:?}, number: f64", + u64_obs.id.inner.name, + u64_obs.id.inner.description, + u64_obs.id.inner.unit, + ))) + } + } else { + global::handle_error(MetricsError::Other( + "unknown observable instrument, failed to record.".into(), + )) + } + } + + fn observe_i64(&self, inst: &dyn AsyncInstrument, measurement: i64, attrs: &[KeyValue]) { + if let Some(i64_obs) = inst.as_any().downcast_ref::>() { + if self.i64s.contains(&i64_obs.id) { + i64_obs.observe(measurement, attrs) + } else { + global::handle_error( + MetricsError::Other(format!("observable instrument not registered for callback, failed to record. name: {}, description: {}, unit: {:?}, number: f64", + i64_obs.id.inner.name, + i64_obs.id.inner.description, + i64_obs.id.inner.unit, + ))) + } + } else { + global::handle_error(MetricsError::Other( + "unknown observable instrument, failed to record.".into(), + )) + } + } +} + +impl fmt::Debug for Meter { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_struct("Meter").field("scope", &self.scope).finish() + } +} + +/// Provides all OpenTelemetry instruments. +struct InstProvider { + scope: Scope, + resolve: Resolver, +} + +impl InstProvider +where + T: Number, +{ + fn new( + scope: Scope, + pipes: Arc, + cache: Arc, StreamId>>>, + ) -> Self { + InstProvider { + scope, + resolve: Resolver::new(pipes, cache), + } + } + + /// lookup returns the resolved InstrumentImpl. + fn lookup( + &self, + kind: InstrumentKind, + name: Cow<'static, str>, + description: Option>, + unit: Unit, + ) -> Result> { + let aggregators = self.aggregators(kind, name, description, unit)?; + Ok(InstrumentImpl { aggregators }) + } + + fn aggregators( + &self, + kind: InstrumentKind, + name: Cow<'static, str>, + description: Option>, + unit: Unit, + ) -> Result>>> { + let inst = Instrument { + name, + description: description.unwrap_or_default(), + unit, + kind: Some(kind), + scope: self.scope.clone(), + }; + + self.resolve.aggregators(inst) + } +} diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/mod.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/mod.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,403 +1,59 @@ -//! # OpenTelemetry Metrics SDK -use crate::export; -use crate::export::metrics::{LockedProcessor, Processor}; -use crate::metrics::{ - aggregators::Aggregator, - sdk_api::{ - AsyncInstrumentCore, AtomicNumber, Descriptor, InstrumentCore, MeterCore, Number, - NumberKind, SyncInstrumentCore, - }, -}; -use fnv::FnvHasher; -use opentelemetry_api::{ - attributes::{hash_attributes, AttributeSet}, - global, - metrics::Result, - Context, KeyValue, -}; -use std::{ - any::Any, - cmp::Ordering, - fmt, - hash::{Hash, Hasher}, - sync::{Arc, Mutex}, -}; -pub mod aggregators; -pub mod controllers; -pub mod processors; -pub mod registry; -pub mod sdk_api; -pub mod selectors; - -/// Creates a new accumulator builder -pub fn accumulator(processor: Arc) -> Accumulator { - Accumulator(Arc::new(AccumulatorCore::new(processor))) -} - -/// Accumulator implements the OpenTelemetry Meter API. The Accumulator is bound -/// to a single `Processor`. -/// -/// The Accumulator supports a collect API to gather and export current data. -/// `Collect` should be arranged according to the processor model. Push-based -/// processors will setup a timer to call `collect` periodically. Pull-based -/// processors will call `collect` when a pull request arrives. -#[derive(Debug, Clone)] -pub struct Accumulator(Arc); - -impl Accumulator { - /// Traverses the list of active records and observers and - /// exports data for each active instrument. - /// - /// During the collection pass, the [`LockedProcessor`] will receive - /// one `export` call per current aggregation. - /// - /// Returns the number of records that were checkpointed. - pub fn collect(&self, cx: &Context, locked_processor: &mut dyn LockedProcessor) -> usize { - self.0.collect(cx, locked_processor) - } -} - -impl MeterCore for Accumulator { - fn new_sync_instrument( - &self, - descriptor: Descriptor, - ) -> Result> { - Ok(Arc::new(SyncInstrument { - instrument: Arc::new(BaseInstrument { - meter: self.clone(), - descriptor, - }), - })) - } - - fn new_async_instrument( - &self, - descriptor: Descriptor, - ) -> Result> { - Ok(Arc::new(AsyncInstrument { - instrument: Arc::new(BaseInstrument { - meter: self.clone(), - descriptor, - }), - })) - } - - fn register_callback(&self, f: Box) -> Result<()> { - self.0 - .callbacks - .lock() - .map_err(Into::into) - .map(|mut callbacks| callbacks.push(f)) - } -} - -#[derive(Clone, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)] -struct MapKey { - instrument_hash: u64, -} - -#[derive(Debug)] -struct AsyncContextKey; - -type Callback = Box; - -struct AccumulatorCore { - /// A concurrent map of current sync instrument state. - current: dashmap::DashMap>, - - /// Async instrument callbacks - callbacks: Mutex>, - - /// The current epoch number. It is incremented in `collect`. - current_epoch: AtomicNumber, - - /// The configured processor. - processor: Arc, -} - -impl AccumulatorCore { - fn new(processor: Arc) -> Self { - AccumulatorCore { - current: dashmap::DashMap::new(), - current_epoch: NumberKind::U64.zero().to_atomic(), - processor, - callbacks: Default::default(), - } - } - - fn collect(&self, cx: &Context, locked_processor: &mut dyn LockedProcessor) -> usize { - self.run_async_callbacks(cx); - let checkpointed = self.collect_instruments(locked_processor); - self.current_epoch.fetch_add(&NumberKind::U64, &1u64.into()); - - checkpointed - } - - fn run_async_callbacks(&self, cx: &Context) { - match self.callbacks.lock() { - Ok(callbacks) => { - let cx = cx.with_value(AsyncContextKey); - for f in callbacks.iter() { - f(&cx) - } - } - Err(err) => global::handle_error(err), - } - } - - fn collect_instruments(&self, locked_processor: &mut dyn LockedProcessor) -> usize { - let mut checkpointed = 0; - - self.current.retain(|_key, value| { - let mods = &value.update_count.load(); - let coll = &value.collected_count.load(); - - if mods.partial_cmp(&NumberKind::U64, coll) != Some(Ordering::Equal) { - // Updates happened in this interval, - // checkpoint and continue. - checkpointed += self.checkpoint_record(value, locked_processor); - value.collected_count.store(mods); - } else { - // Having no updates since last collection, try to remove if - // there are no bound handles - if Arc::strong_count(value) == 1 { - // There's a potential race between loading collected count and - // loading the strong count in this function. Since this is the - // last we'll see of this record, checkpoint. - if mods.partial_cmp(&NumberKind::U64, coll) != Some(Ordering::Equal) { - checkpointed += self.checkpoint_record(value, locked_processor); - } - return false; - } - }; - true - }); - - checkpointed - } - - fn checkpoint_record( - &self, - record: &Record, - locked_processor: &mut dyn LockedProcessor, - ) -> usize { - if let (Some(current), Some(checkpoint)) = (&record.current, &record.checkpoint) { - if let Err(err) = current.synchronized_move(checkpoint, record.instrument.descriptor()) - { - global::handle_error(err); - - return 0; - } - - let accumulation = export::metrics::accumulation( - record.instrument.descriptor(), - &record.attributes, - checkpoint, - ); - if let Err(err) = locked_processor.process(accumulation) { - global::handle_error(err); - } - - 1 - } else { - 0 - } - } - - // fn checkpoint_async( - // &self, - // instrument: &AsyncInstrument, - // locked_processor: &mut dyn LockedProcessor, - // ) -> usize { - // instrument.recorders.lock().map_or(0, |mut recorders| { - // let mut checkpointed = 0; - // match recorders.as_mut() { - // None => return checkpointed, - // Some(recorders) => { - // recorders.retain(|_key, attribute_recorder| { - // let epoch_diff = self.current_epoch.load().partial_cmp( - // &NumberKind::U64, - // &attribute_recorder.observed_epoch.into(), - // ); - // if epoch_diff == Some(Ordering::Equal) { - // if let Some(observed) = &attribute_recorder.observed { - // let accumulation = export::metrics::accumulation( - // instrument.descriptor(), - // &attribute_recorder.attributes, - // &self.resource, - // observed, - // ); - // - // if let Err(err) = locked_processor.process(accumulation) { - // global::handle_error(err); - // } - // checkpointed += 1; - // } - // } - // - // // Retain if this is not second collection cycle with no - // // observations for this AttributeSet. - // epoch_diff == Some(Ordering::Greater) - // }); - // } - // } - // if recorders.as_ref().map_or(false, |map| map.is_empty()) { - // *recorders = None; - // } - // - // checkpointed - // }) - // } -} - -impl fmt::Debug for AccumulatorCore { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("AccumulatorCore").finish() - } -} - -#[derive(Debug, Clone)] -struct SyncInstrument { - instrument: Arc, -} - -impl SyncInstrumentCore for SyncInstrument { - fn record_one(&self, cx: &Context, number: sdk_api::Number, kvs: &'_ [KeyValue]) { - self.instrument.acquire_handle(kvs).capture_one(cx, number) - } -} - -impl sdk_api::InstrumentCore for SyncInstrument { - fn descriptor(&self) -> &Descriptor { - self.instrument.descriptor() - } - - fn as_any(&self) -> &dyn Any { - self - } -} - -#[derive(Debug, Clone)] -struct AsyncInstrument { - instrument: Arc, -} - -impl AsyncInstrumentCore for AsyncInstrument { - fn observe_one(&self, cx: &Context, number: Number, kvs: &'_ [KeyValue]) { - self.instrument.acquire_handle(kvs).capture_one(cx, number) - } -} - -impl sdk_api::InstrumentCore for AsyncInstrument { - fn descriptor(&self) -> &Descriptor { - self.instrument.descriptor() - } - - fn as_any(&self) -> &dyn Any { - self - } -} - -#[derive(Debug, Clone)] -struct BaseInstrument { - meter: Accumulator, - descriptor: Descriptor, -} - -impl BaseInstrument { - // acquireHandle gets or creates a `*record` corresponding to `kvs`, - // the input attributes. - fn acquire_handle(&self, kvs: &[KeyValue]) -> Arc { - let mut hasher = FnvHasher::default(); - self.descriptor.attribute_hash().hash(&mut hasher); - - hash_attributes(&mut hasher, kvs.iter().map(|kv| (&kv.key, &kv.value))); - - let map_key = MapKey { - instrument_hash: hasher.finish(), - }; - let current = &self.meter.0.current; - if let Some(existing_record) = current.get(&map_key) { - return existing_record.value().clone(); - } - - let record = Arc::new(Record { - update_count: NumberKind::U64.zero().to_atomic(), - collected_count: NumberKind::U64.zero().to_atomic(), - attributes: AttributeSet::from_attributes(kvs.iter().cloned()), - instrument: self.clone(), - current: self - .meter - .0 - .processor - .aggregator_selector() - .aggregator_for(&self.descriptor), - checkpoint: self - .meter - .0 - .processor - .aggregator_selector() - .aggregator_for(&self.descriptor), - }); - current.insert(map_key, record.clone()); - - record - } -} - -impl InstrumentCore for BaseInstrument { - fn descriptor(&self) -> &Descriptor { - &self.descriptor - } - - fn as_any(&self) -> &dyn Any { - self - } -} - -/// record maintains the state of one metric instrument. Due -/// the use of lock-free algorithms, there may be more than one -/// `record` in existence at a time, although at most one can -/// be referenced from the `Accumulator.current` map. -#[derive(Debug)] -struct Record { - /// Incremented on every call to `update`. - update_count: AtomicNumber, - - /// Set to `update_count` on collection, supports checking for no updates during - /// a round. - collected_count: AtomicNumber, - - /// The processed attribute set for this record. - /// - /// TODO: look at perf here. - attributes: AttributeSet, - - /// The corresponding instrument. - instrument: BaseInstrument, - - /// current implements the actual `record_one` API, depending on the type of - /// aggregation. If `None`, the metric was disabled by the exporter. - current: Option>, - checkpoint: Option>, -} - -impl Record { - fn capture_one(&self, cx: &Context, number: Number) { - let current = match &self.current { - Some(current) => current, - // The instrument is disabled according to the AggregatorSelector. - None => return, - }; - if let Err(err) = aggregators::range_test(&number, &self.instrument.descriptor) - .and_then(|_| current.update(cx, &number, &self.instrument.descriptor)) - { - global::handle_error(err); - return; - } - - // Record was modified, inform the collect() that things need - // to be collected while the record is still mapped. - self.update_count.fetch_add(&NumberKind::U64, &1u64.into()); - } -} +//! The rust of the OpenTelemetry metrics SDK. +//! +//! ## Configuration +//! +//! The metrics SDK configuration is stored with each [MeterProvider]. +//! Configuration for [Resource]s, [View]s, and [ManualReader] or +//! [PeriodicReader] instances can be specified. +//! +//! ### Example +//! +//! ``` +//! use opentelemetry_api::{ +//! metrics::{MeterProvider as _, Unit}, +//! KeyValue, +//! }; +//! use opentelemetry_sdk::{metrics::MeterProvider, Resource}; +//! +//! // Generate SDK configuration, resource, views, etc +//! let resource = Resource::default(); // default attributes about the current process +//! +//! // Create a meter provider with the desired config +//! let provider = MeterProvider::builder().with_resource(resource).build(); +//! +//! // Use the meter provider to create meter instances +//! let meter = provider.meter("my_app"); +//! +//! // Create instruments scoped to the meter +//! let counter = meter +//! .u64_counter("power_consumption") +//! .with_unit(Unit::new("kWh")) +//! .init(); +//! +//! // use instruments to record measurements +//! counter.add(10, &[KeyValue::new("rate", "standard")]); +//! ``` +//! +//! [Resource]: crate::Resource + +pub(crate) mod aggregation; +pub mod data; +pub mod exporter; +pub(crate) mod instrument; +pub(crate) mod internal; +pub(crate) mod manual_reader; +pub(crate) mod meter; +mod meter_provider; +pub(crate) mod periodic_reader; +pub(crate) mod pipeline; +pub mod reader; +pub(crate) mod view; + +pub use aggregation::*; +pub use instrument::*; +pub use manual_reader::*; +pub use meter::*; +pub use meter_provider::*; +pub use periodic_reader::*; +pub use pipeline::Pipeline; +pub use view::*; diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/periodic_reader.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/periodic_reader.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/periodic_reader.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/periodic_reader.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,377 @@ +use std::{ + env, fmt, + sync::{Arc, Mutex, Weak}, + time::Duration, +}; + +use futures_channel::{mpsc, oneshot}; +use futures_util::{ + future::{self, Either}, + pin_mut, + stream::{self, FusedStream}, + Stream, StreamExt, +}; +use opentelemetry_api::{ + global, + metrics::{MetricsError, Result}, + Context, +}; + +use crate::runtime::Runtime; +use crate::{ + metrics::{ + exporter::PushMetricsExporter, + reader::{MetricProducer, SdkProducer}, + }, + Resource, +}; + +use super::{ + aggregation::Aggregation, + data::{ResourceMetrics, Temporality}, + instrument::InstrumentKind, + reader::{AggregationSelector, MetricReader, TemporalitySelector}, + Pipeline, +}; + +const DEFAULT_TIMEOUT: Duration = Duration::from_secs(30); +const DEFAULT_INTERVAL: Duration = Duration::from_secs(60); + +const METRIC_EXPORT_INTERVAL_NAME: &str = "OTEL_METRIC_EXPORT_INTERVAL"; +const METRIC_EXPORT_TIMEOUT_NAME: &str = "OTEL_METRIC_EXPORT_TIMEOUT"; + +/// Configuration options for [PeriodicReader]. +/// +/// A periodic reader is a [MetricReader] that collects and exports metric data +/// to the exporter at a defined interval. +/// +/// By default, the returned [MetricReader] will collect and export data every +/// 60 seconds, and will cancel export attempts that exceed 30 seconds. The +/// export time is not counted towards the interval between attempts. +/// +/// The [collect] method of the returned [MetricReader] continues to gather and +/// return metric data to the user. It will not automatically send that data to +/// the exporter outside of the predefined interval. +/// +/// [collect]: MetricReader::collect +#[derive(Debug)] +pub struct PeriodicReaderBuilder { + interval: Duration, + timeout: Duration, + exporter: E, + runtime: RT, +} + +impl PeriodicReaderBuilder +where + E: PushMetricsExporter, + RT: Runtime, +{ + fn new(exporter: E, runtime: RT) -> Self { + let interval = env::var(METRIC_EXPORT_INTERVAL_NAME) + .ok() + .and_then(|v| v.parse().map(Duration::from_millis).ok()) + .unwrap_or(DEFAULT_INTERVAL); + let timeout = env::var(METRIC_EXPORT_TIMEOUT_NAME) + .ok() + .and_then(|v| v.parse().map(Duration::from_millis).ok()) + .unwrap_or(DEFAULT_TIMEOUT); + + PeriodicReaderBuilder { + interval, + timeout, + exporter, + runtime, + } + } + + /// Configures the intervening time between exports for a [PeriodicReader]. + /// + /// This option overrides any value set for the `OTEL_METRIC_EXPORT_INTERVAL` + /// environment variable. + /// + /// If this option is not used or `interval` is equal to zero, 60 seconds is + /// used as the default. + pub fn with_interval(mut self, interval: Duration) -> Self { + if !interval.is_zero() { + self.interval = interval; + } + self + } + + /// Configures the time a [PeriodicReader] waits for an export to complete + /// before canceling it. + /// + /// This option overrides any value set for the `OTEL_METRIC_EXPORT_TIMEOUT` + /// environment variable. + /// + /// If this option is not used or `timeout` is equal to zero, 30 seconds is used + /// as the default. + pub fn with_timeout(mut self, timeout: Duration) -> Self { + if !timeout.is_zero() { + self.timeout = timeout; + } + self + } + + /// Create a [PeriodicReader] with the given config. + pub fn build(self) -> PeriodicReader { + let (message_sender, message_receiver) = mpsc::channel(256); + let ticker = self + .runtime + .interval(self.interval) + .map(|_| Message::Export); + + let messages = Box::pin(stream::select(message_receiver, ticker)); + let reader = PeriodicReader { + exporter: Arc::new(self.exporter), + inner: Arc::new(Mutex::new(PeriodicReaderInner { + message_sender, + sdk_producer: None, + is_shutdown: false, + external_producers: vec![], + })), + }; + + let runtime = self.runtime.clone(); + self.runtime.spawn(Box::pin( + PeriodicReaderWorker { + reader: reader.clone(), + timeout: self.timeout, + runtime, + rm: ResourceMetrics { + resource: Resource::empty(), + scope_metrics: Vec::new(), + }, + } + .run(messages), + )); + + reader + } +} + +/// A [MetricReader] that continuously collects and exports metric data at a set +/// interval. +/// +/// By default it will collect and export data every 60 seconds, and will cancel +/// export attempts that exceed 30 seconds. The export time is not counted +/// towards the interval between attempts. +/// +/// The [collect] method of the returned continues to gather and +/// return metric data to the user. It will not automatically send that data to +/// the exporter outside of the predefined interval. +/// +/// The [runtime] can be selected based on feature flags set for this crate. +/// +/// The exporter can be any exporter that implements [PushMetricsExporter] such +/// as [opentelemetry-otlp]. +/// +/// [collect]: MetricReader::collect +/// [runtime]: crate::runtime +/// [opentelemetry-otlp]: https://docs.rs/opentelemetry-otlp/latest/opentelemetry_otlp/ +/// +/// # Example +/// +/// ```no_run +/// use opentelemetry_sdk::metrics::PeriodicReader; +/// # fn example(get_exporter: impl Fn() -> E, get_runtime: impl Fn() -> R) +/// # where +/// # E: opentelemetry_sdk::metrics::exporter::PushMetricsExporter, +/// # R: opentelemetry_sdk::runtime::Runtime, +/// # { +/// +/// let exporter = get_exporter(); // set up a push exporter like OTLP +/// let runtime = get_runtime(); // select runtime: e.g. opentelemetry_sdk:runtime::Tokio +/// +/// let reader = PeriodicReader::builder(exporter, runtime).build(); +/// # drop(reader); +/// # } +/// ``` +#[derive(Clone)] +pub struct PeriodicReader { + exporter: Arc, + inner: Arc>, +} + +impl PeriodicReader { + /// Configuration options for a periodic reader + pub fn builder(exporter: E, runtime: RT) -> PeriodicReaderBuilder + where + E: PushMetricsExporter, + RT: Runtime, + { + PeriodicReaderBuilder::new(exporter, runtime) + } +} + +impl fmt::Debug for PeriodicReader { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_struct("PeriodicReader").finish() + } +} + +struct PeriodicReaderInner { + message_sender: mpsc::Sender, + sdk_producer: Option>, + is_shutdown: bool, + external_producers: Vec>, +} + +#[derive(Debug)] +enum Message { + Export, + Flush(oneshot::Sender>), + Shutdown(oneshot::Sender>), +} + +struct PeriodicReaderWorker { + reader: PeriodicReader, + timeout: Duration, + runtime: RT, + rm: ResourceMetrics, +} + +impl PeriodicReaderWorker { + async fn collect_and_export(&mut self) -> Result<()> { + self.reader.collect(&mut self.rm)?; + + let export = self.reader.exporter.export(&mut self.rm); + let timeout = self.runtime.delay(self.timeout); + pin_mut!(export); + pin_mut!(timeout); + + match future::select(export, timeout).await { + Either::Left(_) => Ok(()), + Either::Right(_) => Err(MetricsError::Other("export timed out".into())), + } + } + + async fn process_message(&mut self, message: Message) -> bool { + match message { + Message::Export => { + if let Err(err) = self.collect_and_export().await { + global::handle_error(err) + } + } + Message::Flush(ch) => { + let res = self.collect_and_export().await; + if ch.send(res).is_err() { + global::handle_error(MetricsError::Other("flush channel closed".into())) + } + } + Message::Shutdown(ch) => { + let res = self.collect_and_export().await; + let _ = self.reader.exporter.shutdown(); + if ch.send(res).is_err() { + global::handle_error(MetricsError::Other("shutdown channel closed".into())) + } + return false; + } + } + + true + } + + async fn run(mut self, mut messages: impl Stream + Unpin + FusedStream) { + while let Some(message) = messages.next().await { + if !self.process_message(message).await { + break; + } + } + } +} + +impl AggregationSelector for PeriodicReader { + fn aggregation(&self, kind: InstrumentKind) -> Aggregation { + self.exporter.aggregation(kind) + } +} + +impl TemporalitySelector for PeriodicReader { + fn temporality(&self, kind: InstrumentKind) -> Temporality { + self.exporter.temporality(kind) + } +} + +impl MetricReader for PeriodicReader { + fn register_pipeline(&self, pipeline: Weak) { + let mut inner = match self.inner.lock() { + Ok(guard) => guard, + Err(_) => return, + }; + + // Only register once. If producer is already set, do nothing. + if inner.sdk_producer.is_none() { + inner.sdk_producer = Some(pipeline); + } else { + global::handle_error(MetricsError::Other( + "duplicate meter registration, did not register manual reader".into(), + )) + } + } + + fn register_producer(&self, producer: Box) { + let _ = self.inner.lock().map(|mut inner| { + if !inner.is_shutdown { + inner.external_producers.push(producer); + } + }); + } + + fn collect(&self, rm: &mut ResourceMetrics) -> Result<()> { + let inner = self.inner.lock()?; + match &inner.sdk_producer.as_ref().and_then(|w| w.upgrade()) { + Some(producer) => producer.produce(rm)?, + None => { + return Err(MetricsError::Other( + "reader is shut down or not registered".into(), + )) + } + }; + + let mut errs = vec![]; + for producer in &inner.external_producers { + match producer.produce() { + Ok(metrics) => rm.scope_metrics.push(metrics), + Err(err) => errs.push(err), + } + } + + if errs.is_empty() { + Ok(()) + } else { + Err(MetricsError::Other(format!("{:?}", errs))) + } + } + + fn force_flush(&self, _cx: &Context) -> Result<()> { + let mut inner = self.inner.lock()?; + let (sender, receiver) = oneshot::channel(); + inner + .message_sender + .try_send(Message::Flush(sender)) + .map_err(|e| MetricsError::Other(e.to_string()))?; + + drop(inner); // don't hold lock when blocking on future + + futures_executor::block_on(receiver) + .map_err(|err| MetricsError::Other(err.to_string())) + .and_then(|res| res) + } + + fn shutdown(&self) -> Result<()> { + let mut inner = self.inner.lock()?; + let (sender, receiver) = oneshot::channel(); + inner + .message_sender + .try_send(Message::Shutdown(sender)) + .map_err(|e| MetricsError::Other(e.to_string()))?; + + drop(inner); // don't hold lock when blocking on future + + futures_executor::block_on(receiver) + .map_err(|err| MetricsError::Other(err.to_string())) + .and_then(|res| res) + } +} diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/pipeline.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/pipeline.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/pipeline.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/pipeline.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,711 @@ +use core::fmt; +use std::{ + borrow::Cow, + collections::{HashMap, HashSet}, + sync::{Arc, Mutex}, +}; + +use opentelemetry_api::{ + global, + metrics::{CallbackRegistration, MetricsError, Result, Unit}, + Context, +}; + +use crate::{ + instrumentation::Scope, + metrics::{aggregation, data, internal, view::View}, + Resource, +}; + +use super::{ + data::{Metric, ResourceMetrics, ScopeMetrics, Temporality}, + instrument::{Instrument, InstrumentKind, Stream, StreamId}, + internal::Number, + reader::{MetricReader, SdkProducer}, +}; + +/// Connects all of the instruments created by a meter provider to a [MetricReader]. +/// +/// This is the object that will be registered when a meter provider is +/// created. +/// +/// As instruments are created the instrument should be checked if it exists in +/// the views of a the Reader, and if so each aggregator should be added to the +/// pipeline. +#[doc(hidden)] +pub struct Pipeline { + resource: Resource, + reader: Box, + views: Vec>, + inner: Box>, +} + +impl fmt::Debug for Pipeline { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.write_str("Pipeline") + } +} + +/// Single or multi-instrument callbacks +type GenericCallback = Arc; + +#[derive(Default)] +struct PipelineInner { + aggregations: HashMap>, + callbacks: Vec, + multi_callbacks: Vec>, +} + +impl fmt::Debug for PipelineInner { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_struct("PipelineInner") + .field("aggregations", &self.aggregations) + .field("callbacks", &self.callbacks.len()) + .finish() + } +} + +impl Pipeline { + /// Adds the [InstrumentSync] to pipeline with scope. + /// + /// This method is not idempotent. Duplicate calls will result in duplicate + /// additions, it is the callers responsibility to ensure this is called with + /// unique values. + fn add_sync(&self, scope: Scope, i_sync: InstrumentSync) { + let _ = self.inner.lock().map(|mut inner| { + inner.aggregations.entry(scope).or_default().push(i_sync); + }); + } + + /// Registers a single instrument callback to be run when `produce` is called. + fn add_callback(&self, callback: GenericCallback) { + let _ = self + .inner + .lock() + .map(|mut inner| inner.callbacks.push(callback)); + } + + /// Registers a multi-instrument callback to be run when `produce` is called. + fn add_multi_callback( + &self, + callback: GenericCallback, + ) -> Result Result<()>> { + let mut inner = self.inner.lock()?; + inner.multi_callbacks.push(Some(callback)); + let idx = inner.multi_callbacks.len() - 1; + + Ok(move |this: &Pipeline| { + let mut inner = this.inner.lock()?; + // can't compare trait objects so use index + toumbstones to drop + inner.multi_callbacks[idx] = None; + Ok(()) + }) + } + + /// Send accumulated telemetry + fn force_flush(&self, cx: &Context) -> Result<()> { + self.reader.force_flush(cx) + } + + /// Shut down pipeline + fn shutdown(&self) -> Result<()> { + self.reader.shutdown() + } +} + +impl SdkProducer for Pipeline { + /// Returns aggregated metrics from a single collection. + fn produce(&self, rm: &mut ResourceMetrics) -> Result<()> { + let inner = self.inner.lock()?; + for cb in &inner.callbacks { + // TODO consider parallel callbacks. + cb(); + } + + for mcb in inner.multi_callbacks.iter().flatten() { + // TODO consider parallel multi callbacks. + mcb(); + } + + rm.resource = self.resource.clone(); + rm.scope_metrics.reserve(inner.aggregations.len()); + + let mut i = 0; + for (scope, instruments) in inner.aggregations.iter() { + let sm = match rm.scope_metrics.get_mut(i) { + Some(sm) => sm, + None => { + rm.scope_metrics.push(ScopeMetrics::default()); + rm.scope_metrics.last_mut().unwrap() + } + }; + sm.metrics.reserve(instruments.len()); + + let mut j = 0; + for inst in instruments { + if let Some(data) = inst.aggregator.aggregation() { + let m = Metric { + name: inst.name.clone(), + description: inst.description.clone(), + unit: inst.unit.clone(), + data, + }; + match sm.metrics.get_mut(j) { + Some(old) => *old = m, + None => sm.metrics.push(m), + }; + j += 1; + } + } + + sm.metrics.truncate(j); + if !sm.metrics.is_empty() { + sm.scope = scope.clone(); + i += 1; + } + } + + rm.scope_metrics.truncate(i); + + Ok(()) + } +} + +trait Aggregator: Send + Sync { + fn aggregation(&self) -> Option>; +} + +impl Aggregator for Arc> { + fn aggregation(&self) -> Option> { + self.as_ref().aggregation() + } +} + +/// A synchronization point between a [Pipeline] and an instrument's aggregators. +struct InstrumentSync { + name: Cow<'static, str>, + description: Cow<'static, str>, + unit: Unit, + aggregator: Box, +} + +impl fmt::Debug for InstrumentSync { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_struct("InstrumentSync") + .field("name", &self.name) + .field("description", &self.description) + .field("unit", &self.unit) + .finish() + } +} + +type Cache = Mutex>>>>>; + +/// Facilitates inserting of new instruments from a single scope into a pipeline. +struct Inserter { + /// A cache that holds [Aggregator]s inserted into the underlying reader pipeline. + /// + /// This cache ensures no duplicate `Aggregator`s are inserted into the reader + /// pipeline and if a new request during an instrument creation asks for the same + /// `Aggregator` the same instance is returned. + aggregators: Cache, + + /// A cache that holds instrument identifiers for all the instruments a [Meter] has + /// created. + /// + /// It is provided from the `Meter` that owns this inserter. This cache ensures + /// that during the creation of instruments with the same name but different + /// options (e.g. description, unit) a warning message is logged. + views: Arc, StreamId>>>, + + pipeline: Arc, +} + +impl Inserter +where + T: Number, +{ + fn new(p: Arc, vc: Arc, StreamId>>>) -> Self { + Inserter { + aggregators: Default::default(), + views: vc, + pipeline: Arc::clone(&p), + } + } + + /// Inserts the provided instrument into a pipeline. + /// + /// All views the pipeline contains are matched against, and any matching view + /// that creates a unique [Aggregator] will be inserted into the pipeline and + /// included in the returned list. + /// + /// The returned `Aggregator`s are ensured to be deduplicated and unique. If + /// another view in another pipeline that is cached by this inserter's cache has + /// already inserted the same `Aggregator` for the same instrument, that + /// `Aggregator` instance is returned. + /// + /// If another instrument has already been inserted by this inserter, or any + /// other using the same cache, and it conflicts with the instrument being + /// inserted in this call, an `Aggregator` matching the arguments will still be + /// returned but a log message will also be logged to the OTel global logger. + /// + /// If the passed instrument would result in an incompatible `Aggregator`, an + /// error is returned and that `Aggregator` is not inserted or returned. + /// + /// If an instrument is determined to use a [aggregation::Aggregation::Drop], that instrument is + /// not inserted nor returned. + fn instrument(&self, inst: Instrument) -> Result>>> { + let mut matched = false; + let mut aggs = vec![]; + let mut errs = vec![]; + let kind = match inst.kind { + Some(kind) => kind, + None => return Err(MetricsError::Other("instrument must have a kind".into())), + }; + + // The cache will return the same Aggregator instance. Use stream ids to de duplicate. + let mut seen = HashSet::new(); + for v in &self.pipeline.views { + let stream = match v.match_inst(&inst) { + Some(stream) => stream, + None => continue, + }; + matched = true; + + let id = self.stream_id(kind, &stream); + if seen.contains(&id) { + continue; // This aggregator has already been added + } + + let agg = match self.cached_aggregator(&inst.scope, kind, stream) { + Ok(Some(agg)) => agg, + Ok(None) => continue, // Drop aggregator. + Err(err) => { + errs.push(err); + continue; + } + }; + seen.insert(id); + aggs.push(agg); + } + + if matched { + if errs.is_empty() { + return Ok(aggs); + } else { + return Err(MetricsError::Other(format!("{errs:?}"))); + } + } + + // Apply implicit default view if no explicit matched. + let stream = Stream { + name: inst.name, + description: inst.description, + unit: inst.unit, + aggregation: None, + allowed_attribute_keys: None, + }; + + match self.cached_aggregator(&inst.scope, kind, stream) { + Ok(agg) => { + if errs.is_empty() { + if let Some(agg) = agg { + aggs.push(agg); + } + Ok(aggs) + } else { + Err(MetricsError::Other(format!("{errs:?}"))) + } + } + Err(err) => { + errs.push(err); + Err(MetricsError::Other(format!("{errs:?}"))) + } + } + } + + /// Returns the appropriate Aggregator for an instrument + /// configuration. If the exact instrument has been created within the + /// inst.Scope, that Aggregator instance will be returned. Otherwise, a new + /// computed Aggregator will be cached and returned. + /// + /// If the instrument configuration conflicts with an instrument that has + /// already been created (e.g. description, unit, data type) a warning will be + /// logged at the "Info" level with the global OTel logger. A valid new + /// Aggregator for the instrument configuration will still be returned without + /// an error. + /// + /// If the instrument defines an unknown or incompatible aggregation, an error + /// is returned. + fn cached_aggregator( + &self, + scope: &Scope, + kind: InstrumentKind, + mut stream: Stream, + ) -> Result>>> { + let agg = if let Some(agg) = stream.aggregation.as_ref() { + agg + } else { + stream.aggregation = Some(self.pipeline.reader.aggregation(kind)); + stream.aggregation.as_ref().unwrap() + }; + + if let Err(err) = is_aggregator_compatible(&kind, agg) { + return Err(MetricsError::Other(format!( + "creating aggregator with instrumentKind: {:?}, aggregation {:?}: {:?}", + kind, stream.aggregation, err, + ))); + } + + let id = self.stream_id(kind, &stream); + // If there is a conflict, the specification says the view should + // still be applied and a warning should be logged. + self.log_conflict(&id); + let (id_temporality, id_monotonic) = (id.temporality, id.monotonic); + let mut cache = self.aggregators.lock()?; + let cached = cache.entry(id).or_insert_with(|| { + let mut agg = match self.aggregator(agg, kind, id_temporality, id_monotonic) { + Ok(Some(agg)) => agg, + other => return other, // Drop aggregator or error + }; + + if let Some(allowed) = stream.allowed_attribute_keys.as_ref().map(Arc::clone) { + agg = internal::new_filter(agg, Arc::new(move |kv| allowed.contains(&kv.key))); + } + + self.pipeline.add_sync( + scope.clone(), + InstrumentSync { + name: stream.name, + description: stream.description, + unit: stream.unit, + aggregator: Box::new(Arc::clone(&agg)), + }, + ); + + Ok(Some(agg)) + }); + + cached + .as_ref() + .map(|o| o.as_ref().map(Arc::clone)) + .map_err(|e| MetricsError::Other(e.to_string())) + } + + /// Validates if an instrument with the same name as id has already been created. + /// + /// If that instrument conflicts with id, a warning is logged. + fn log_conflict(&self, id: &StreamId) { + let _ = self.views.lock().map(|views| { + if let Some(existing) = views.get(&id.name) { + if existing == id { return; } + global::handle_error(MetricsError::Other(format!( + "duplicate metric stream definitions, names: ({} and {}), descriptions: ({} and {}), units: ({:?} and {:?}), numbers: ({} and {}), aggregations: ({:?} and {:?}), monotonics: ({} and {}), temporalities: ({:?} and {:?})", + existing.name, id.name, + existing.description, id.description, + existing.unit, id.unit, + existing.number, id.number, + existing.aggregation, id.aggregation, + existing.monotonic, id.monotonic, + existing.temporality, id.temporality))) + } + }); + } + + fn stream_id(&self, kind: InstrumentKind, stream: &Stream) -> StreamId { + let aggregation = stream + .aggregation + .as_ref() + .map(ToString::to_string) + .unwrap_or_default(); + + StreamId { + name: stream.name.clone(), + description: stream.description.clone(), + unit: stream.unit.clone(), + aggregation, + temporality: Some(self.pipeline.reader.temporality(kind)), + number: Cow::Borrowed(std::any::type_name::()), + monotonic: matches!( + kind, + InstrumentKind::ObservableCounter + | InstrumentKind::Counter + | InstrumentKind::Histogram + ), + } + } + + /// Returns a new [Aggregator] for the given params. + /// + /// If the aggregation is unknown or temporality is invalid, an error is returned. + fn aggregator( + &self, + agg: &aggregation::Aggregation, + kind: InstrumentKind, + temporality: Option, + monotonic: bool, + ) -> Result>>> { + use aggregation::Aggregation; + match agg { + Aggregation::Drop => Ok(None), + Aggregation::LastValue => Ok(Some(internal::new_last_value())), + Aggregation::Sum => { + match kind { + InstrumentKind::ObservableCounter | InstrumentKind::ObservableUpDownCounter => { + // Asynchronous counters and up-down-counters are defined to record + // the absolute value of the count: + // https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/metrics/api.md#asynchronous-counter-creation + match temporality { + Some(Temporality::Cumulative) => { + return Ok(Some(internal::new_precomputed_cumulative_sum( + monotonic, + ))) + } + Some(Temporality::Delta) => { + return Ok(Some(internal::new_precomputed_delta_sum(monotonic))) + } + _ => { + return Err(MetricsError::Other(format!( + "unrecognized temporality: {:?}", + temporality + ))) + } + } + } + _ => {} + }; + + match temporality { + Some(Temporality::Cumulative) => { + Ok(Some(internal::new_cumulative_sum(monotonic))) + } + Some(Temporality::Delta) => Ok(Some(internal::new_delta_sum(monotonic))), + _ => Err(MetricsError::Other(format!( + "unrecognized temporality: {:?}", + temporality + ))), + } + } + a @ Aggregation::ExplicitBucketHistogram { .. } => match temporality { + Some(Temporality::Cumulative) => Ok(Some(internal::new_cumulative_histogram(a))), + Some(Temporality::Delta) => Ok(Some(internal::new_delta_histogram(a))), + _ => Err(MetricsError::Other(format!( + "unrecognized temporality: {:?}", + temporality + ))), + }, + _ => Err(MetricsError::Other("unknown aggregation".into())), + } + } +} + +/// Checks if the aggregation can be used by the instrument. +/// +/// Current compatibility: +/// +/// | Instrument Kind | Drop | LastValue | Sum | Histogram | Exponential Histogram | +/// |--------------------------|------|-----------|-----|-----------|-----------------------| +/// | Counter | X | | X | X | X | +/// | UpDownCounter | X | | X | | | +/// | Histogram | X | | X | X | X | +/// | Observable Counter | X | | X | | | +/// | Observable UpDownCounter | X | | X | | | +/// | Observable Gauge | X | X | | | |. +fn is_aggregator_compatible(kind: &InstrumentKind, agg: &aggregation::Aggregation) -> Result<()> { + use aggregation::Aggregation; + match agg { + Aggregation::ExplicitBucketHistogram { .. } => { + if kind == &InstrumentKind::Counter || kind == &InstrumentKind::Histogram { + return Ok(()); + } + // TODO: review need for aggregation check after + // https://github.com/open-telemetry/opentelemetry-specification/issues/2710 + Err(MetricsError::Other("incompatible aggregation".into())) + } + Aggregation::Sum => { + match kind { + InstrumentKind::ObservableCounter + | InstrumentKind::ObservableUpDownCounter + | InstrumentKind::Counter + | InstrumentKind::Histogram + | InstrumentKind::UpDownCounter => Ok(()), + _ => { + // TODO: review need for aggregation check after + // https://github.com/open-telemetry/opentelemetry-specification/issues/2710 + Err(MetricsError::Other("incompatible aggregation".into())) + } + } + } + Aggregation::LastValue => { + if kind == &InstrumentKind::ObservableGauge { + return Ok(()); + } + // TODO: review need for aggregation check after + // https://github.com/open-telemetry/opentelemetry-specification/issues/2710 + Err(MetricsError::Other("incompatible aggregation".into())) + } + Aggregation::Drop => Ok(()), + _ => { + // This is used passed checking for default, it should be an error at this point. + Err(MetricsError::Other(format!( + "unknown aggregation {:?}", + agg + ))) + } + } +} + +/// The group of pipelines connecting Readers with instrument measurement. +#[derive(Clone, Debug)] +pub(crate) struct Pipelines(Vec>); + +impl Pipelines { + pub(crate) fn new( + res: Resource, + readers: Vec>, + views: Vec>, + ) -> Self { + let mut pipes = Vec::with_capacity(readers.len()); + for r in readers { + let p = Arc::new(Pipeline { + resource: res.clone(), + reader: r, + views: views.clone(), + inner: Default::default(), + }); + p.reader.register_pipeline(Arc::downgrade(&p)); + pipes.push(p); + } + + Pipelines(pipes) + } + + pub(crate) fn register_callback(&self, callback: F) + where + F: Fn() + Send + Sync + 'static, + { + let cb = Arc::new(callback); + for pipe in &self.0 { + pipe.add_callback(cb.clone()) + } + } + + /// Registers a multi-instrument callback to be run when `produce` is called. + pub(crate) fn register_multi_callback(&self, f: F) -> Result> + where + F: Fn() + Send + Sync + 'static, + { + let cb = Arc::new(f); + + let fns = self + .0 + .iter() + .map(|pipe| { + let pipe = Arc::clone(pipe); + let unreg = pipe.add_multi_callback(cb.clone())?; + Ok(Box::new(move || unreg(pipe.as_ref())) as _) + }) + .collect::>()?; + + Ok(Box::new(Unregister(fns))) + } + + /// Force flush all pipelines + pub(crate) fn force_flush(&self, cx: &Context) -> Result<()> { + let mut errs = vec![]; + for pipeline in &self.0 { + if let Err(err) = pipeline.force_flush(cx) { + errs.push(err); + } + } + + if errs.is_empty() { + Ok(()) + } else { + Err(MetricsError::Other(format!("{errs:?}"))) + } + } + + /// Shut down all pipelines + pub(crate) fn shutdown(&self) -> Result<()> { + let mut errs = vec![]; + for pipeline in &self.0 { + if let Err(err) = pipeline.shutdown() { + errs.push(err); + } + } + + if errs.is_empty() { + Ok(()) + } else { + Err(MetricsError::Other(format!("{errs:?}"))) + } + } +} + +struct Unregister(Vec Result<()> + Send + Sync>>); + +impl CallbackRegistration for Unregister { + fn unregister(&mut self) -> Result<()> { + let mut errs = vec![]; + while let Some(unreg) = self.0.pop() { + if let Err(err) = unreg() { + errs.push(err); + } + } + + if errs.is_empty() { + Ok(()) + } else { + Err(MetricsError::Other(format!("{errs:?}"))) + } + } +} + +/// resolver facilitates resolving Aggregators an instrument needs to aggregate +/// measurements with while updating all pipelines that need to pull from those +/// aggregations. +pub(crate) struct Resolver { + inserters: Vec>, +} + +impl Resolver +where + T: Number, +{ + pub(crate) fn new( + pipelines: Arc, + view_cache: Arc, StreamId>>>, + ) -> Self { + let inserters = pipelines.0.iter().fold(Vec::new(), |mut acc, pipe| { + acc.push(Inserter::new(Arc::clone(pipe), Arc::clone(&view_cache))); + acc + }); + + Resolver { inserters } + } + + /// Aggregators returns the Aggregators that must be updated by the instrument + /// defined by key. + pub(crate) fn aggregators( + &self, + id: Instrument, + ) -> Result>>> { + let (aggs, errs) = + self.inserters + .iter() + .fold((vec![], vec![]), |(mut aggs, mut errs), inserter| { + match inserter.instrument(id.clone()) { + Ok(agg) => aggs.extend(agg), + Err(err) => errs.push(err), + }; + (aggs, errs) + }); + + if errs.is_empty() { + Ok(aggs) + } else { + Err(MetricsError::Other(format!("{errs:?}"))) + } + } +} diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/processors/basic.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/processors/basic.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/processors/basic.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/processors/basic.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,432 +0,0 @@ -use crate::{ - export::metrics::{ - self, - aggregation::{Temporality, TemporalitySelector}, - Accumulation, AggregatorSelector, Checkpointer, CheckpointerFactory, LockedCheckpointer, - LockedProcessor, Processor, Reader, Record, - }, - metrics::{aggregators::Aggregator, sdk_api::Descriptor}, -}; -use core::fmt; -use fnv::FnvHasher; -use opentelemetry_api::{ - attributes::{hash_attributes, AttributeSet}, - metrics::{MetricsError, Result}, -}; -use std::collections::HashMap; -use std::hash::{Hash, Hasher}; -use std::sync::{Arc, Mutex, MutexGuard}; -use std::time::SystemTime; - -/// Create a new basic processor -pub fn factory(aggregator_selector: A, temporality_selector: T) -> BasicProcessorBuilder -where - A: AggregatorSelector + Send + Sync + 'static, - T: TemporalitySelector + Send + Sync + 'static, -{ - BasicProcessorBuilder { - aggregator_selector: Arc::new(aggregator_selector), - temporality_selector: Arc::new(temporality_selector), - memory: false, - } -} - -pub struct BasicProcessorBuilder { - aggregator_selector: Arc, - temporality_selector: Arc, - memory: bool, -} - -impl BasicProcessorBuilder { - /// Memory controls whether the processor remembers metric instruments and - /// attribute sets that were previously reported. - /// - /// When Memory is `true`, [`Reader::try_for_each`] will visit metrics that were - /// not updated in the most recent interval. - pub fn with_memory(mut self, memory: bool) -> Self { - self.memory = memory; - self - } -} - -impl fmt::Debug for BasicProcessorBuilder { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("BasicProcessorBuilder") - .field("memory", &self.memory) - .finish() - } -} - -impl CheckpointerFactory for BasicProcessorBuilder { - fn checkpointer(&self) -> Arc { - Arc::new(BasicProcessor { - aggregator_selector: Arc::clone(&self.aggregator_selector), - temporality_selector: Arc::clone(&self.temporality_selector), - state: Mutex::new(BasicProcessorState::with_memory(self.memory)), - }) - } -} - -/// Basic metric integration strategy -pub struct BasicProcessor { - aggregator_selector: Arc, - temporality_selector: Arc, - state: Mutex, -} - -impl Processor for BasicProcessor { - fn aggregator_selector(&self) -> &dyn AggregatorSelector { - self.aggregator_selector.as_ref() - } -} - -impl Checkpointer for BasicProcessor { - fn checkpoint( - &self, - f: &mut dyn FnMut(&mut dyn LockedCheckpointer) -> Result<()>, - ) -> Result<()> { - self.state.lock().map_err(From::from).and_then(|locked| { - f(&mut BasicLockedProcessor { - parent: self, - state: locked, - }) - }) - } -} - -impl fmt::Debug for BasicProcessor { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("BasicProcessor") - .field("state", &self.state) - .finish() - } -} - -/// A locked representation of the processor used where mutable references are necessary. -#[derive(Debug)] -struct BasicLockedProcessor<'a> { - parent: &'a BasicProcessor, - state: MutexGuard<'a, BasicProcessorState>, -} - -impl<'a> LockedProcessor for BasicLockedProcessor<'a> { - fn process(&mut self, accumulation: Accumulation<'_>) -> Result<()> { - if self.state.started_collection != self.state.finished_collection.wrapping_add(1) { - return Err(MetricsError::InconsistentState); - } - - let desc = accumulation.descriptor(); - let mut hasher = FnvHasher::default(); - desc.attribute_hash().hash(&mut hasher); - hash_attributes(&mut hasher, accumulation.attributes().into_iter()); - let key = StateKey(hasher.finish()); - let agg = accumulation.aggregator(); - let finished_collection = self.state.finished_collection; - if let Some(value) = self.state.values.get_mut(&key) { - // Advance the update sequence number. - let same_collection = finished_collection == value.updated; - value.updated = finished_collection; - - // At this point in the code, we have located an existing - // value for some stateKey. This can be because: - // - // (a) stateful aggregation is being used, the entry was - // entered during a prior collection, and this is the first - // time processing an accumulation for this stateKey in the - // current collection. Since this is the first time - // processing an accumulation for this stateKey during this - // collection, we don't know yet whether there are multiple - // accumulators at work. If there are multiple accumulators, - // they'll hit case (b) the second time through. - // - // (b) multiple accumulators are being used, whether stateful - // or not. - // - // Case (a) occurs when the instrument and the exporter - // require memory to work correctly, either because the - // instrument reports a PrecomputedSum to a DeltaExporter or - // the reverse, a non-PrecomputedSum instrument with a - // CumulativeExporter. This logic is encapsulated in - // ExportKind.MemoryRequired(MetricKind). - // - // Case (b) occurs when the variable `sameCollection` is true, - // indicating that the stateKey for Accumulation has already - // been seen in the same collection. When this happens, it - // implies that multiple Accumulators are being used, or that - // a single Accumulator has been configured with an attribute key - // filter. - - if !same_collection { - if !value.current_owned { - // This is the first Accumulation we've seen for this - // stateKey during this collection. Just keep a - // reference to the Accumulator's Aggregator. All the other cases - // copy Aggregator state. - value.current = agg.clone(); - return Ok(()); - } - return agg.synchronized_move(&value.current, desc); - } - - // If the current is not owned, take ownership of a copy - // before merging below. - if !value.current_owned { - let tmp = value.current.clone(); - if let Some(current) = self.parent.aggregator_selector.aggregator_for(desc) { - value.current = current; - value.current_owned = true; - tmp.synchronized_move(&value.current, desc)?; - } - } - - // Combine this `Accumulation` with the prior `Accumulation`. - return value.current.merge(agg.as_ref(), desc); - } - - let stateful = self - .parent - .temporality_selector - .temporality_for(desc, agg.aggregation().kind()) - .memory_required(desc.instrument_kind()); - - let cumulative = if stateful { - if desc.instrument_kind().precomputed_sum() { - // If we know we need to compute deltas, allocate one. - return Err(MetricsError::Other("No cumulative to sum support".into())); - } - // Always allocate a cumulative aggregator if stateful - self.parent.aggregator_selector.aggregator_for(desc) - } else { - None - }; - - self.state.values.insert( - key, - StateValue { - descriptor: desc.clone(), - attributes: accumulation.attributes().clone(), - current_owned: false, - current: agg.clone(), - cumulative, - stateful, - updated: finished_collection, - }, - ); - - Ok(()) - } -} - -impl LockedCheckpointer for BasicLockedProcessor<'_> { - fn processor(&mut self) -> &mut dyn LockedProcessor { - self - } - - fn reader(&mut self) -> &mut dyn Reader { - &mut *self.state - } - - fn start_collection(&mut self) { - if self.state.started_collection != 0 { - self.state.interval_start = self.state.interval_end; - } - self.state.started_collection = self.state.started_collection.wrapping_add(1); - } - - fn finish_collection(&mut self) -> Result<()> { - self.state.interval_end = opentelemetry_api::time::now(); - if self.state.started_collection != self.state.finished_collection.wrapping_add(1) { - return Err(MetricsError::InconsistentState); - } - let finished_collection = self.state.finished_collection; - self.state.finished_collection = self.state.finished_collection.wrapping_add(1); - let has_memory = self.state.config.memory; - - let mut result = Ok(()); - - self.state.values.retain(|_key, value| { - // Return early if previous error - if result.is_err() { - return true; - } - - let mkind = value.descriptor.instrument_kind(); - - let stale = value.updated != finished_collection; - let stateless = !value.stateful; - - // The following branch updates stateful aggregators. Skip these updates - // if the aggregator is not stateful or if the aggregator is stale. - if stale || stateless { - // If this processor does not require memory, stale, stateless - // entries can be removed. This implies that they were not updated - // over the previous full collection interval. - if stale && stateless && !has_memory { - return false; - } - return true; - } - - // The only kind of aggregators that are not stateless - // are the ones needing delta to cumulative - // conversion. Merge aggregator state in this case. - if !mkind.precomputed_sum() { - // This line is equivalent to: - // value.cumulative = value.cumulative + value.delta - if let Some(cumulative) = value.cumulative.as_ref() { - result = cumulative.merge(value.current.as_ref(), &value.descriptor) - } - } - - true - }); - - result - } -} - -#[derive(Debug, Default)] -struct BasicProcessorConfig { - /// Memory controls whether the processor remembers metric instruments and attribute - /// sets that were previously reported. When Memory is true, - /// `CheckpointSet::try_for_each` will visit metrics that were not updated in - /// the most recent interval. - memory: bool, -} - -#[derive(Debug)] -struct BasicProcessorState { - config: BasicProcessorConfig, - values: HashMap, - // Note: the timestamp logic currently assumes all exports are deltas. - process_start: SystemTime, - interval_start: SystemTime, - interval_end: SystemTime, - started_collection: u64, - finished_collection: u64, -} - -impl BasicProcessorState { - fn with_memory(memory: bool) -> Self { - let mut state = BasicProcessorState::default(); - state.config.memory = memory; - state - } -} - -impl Default for BasicProcessorState { - fn default() -> Self { - BasicProcessorState { - config: BasicProcessorConfig::default(), - values: HashMap::default(), - process_start: opentelemetry_api::time::now(), - interval_start: opentelemetry_api::time::now(), - interval_end: opentelemetry_api::time::now(), - started_collection: 0, - finished_collection: 0, - } - } -} - -impl Reader for BasicProcessorState { - fn try_for_each( - &mut self, - temporality_selector: &dyn TemporalitySelector, - f: &mut dyn FnMut(&Record<'_>) -> Result<()>, - ) -> Result<()> { - if self.started_collection != self.finished_collection { - return Err(MetricsError::InconsistentState); - } - - self.values.iter().try_for_each(|(_key, value)| { - let instrument_kind = value.descriptor.instrument_kind(); - - let agg; - let start; - - // If the processor does not have memory and it was not updated in the - // prior round, do not visit this value. - if !self.config.memory && value.updated != self.finished_collection.wrapping_sub(1) { - return Ok(()); - } - - match temporality_selector - .temporality_for(&value.descriptor, value.current.aggregation().kind()) - { - Temporality::Cumulative => { - // If stateful, the sum has been computed. If stateless, the - // input was already cumulative. Either way, use the - // checkpointed value: - if value.stateful { - agg = value.cumulative.as_ref(); - } else { - agg = Some(&value.current); - } - - start = self.process_start; - } - Temporality::Delta => { - // Precomputed sums are a special case. - if instrument_kind.precomputed_sum() { - return Err(MetricsError::Other("No cumulative to delta".into())); - } - - agg = Some(&value.current); - start = self.interval_start; - } - } - - let res = f(&metrics::record( - &value.descriptor, - &value.attributes, - agg, - start, - self.interval_end, - )); - - if let Err(MetricsError::NoDataCollected) = res { - Ok(()) - } else { - res - } - }) - } -} - -#[derive(Debug, PartialEq, Eq, Hash)] -struct StateKey(u64); - -#[derive(Debug)] -struct StateValue { - /// Instrument descriptor - descriptor: Descriptor, - - /// Instrument attributes - attributes: AttributeSet, - - /// Indicates the last sequence number when this value had process called by an - /// accumulator. - updated: u64, - - /// Indicates that a cumulative aggregation is being maintained, taken from the - /// process start time. - stateful: bool, - - /// Indicates that "current" was allocated - /// by the processor in order to merge results from - /// multiple `Accumulator`s during a single collection - /// round, which may happen either because: - /// - /// (1) multiple `Accumulator`s output the same `Accumulation. - /// (2) one `Accumulator` is configured with dimensionality reduction. - current_owned: bool, - - /// The output from a single `Accumulator` (if !current_owned) or an - /// `Aggregator` owned by the processor used to accumulate multiple values in a - /// single collection round. - current: Arc, - - /// If `Some`, refers to an `Aggregator` owned by the processor used to store - /// the last cumulative value. - cumulative: Option>, -} diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/processors/mod.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/processors/mod.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/processors/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/processors/mod.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,4 +0,0 @@ -//! Metric Processors -mod basic; - -pub use basic::{factory, BasicProcessor}; diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/reader.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/reader.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/reader.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/reader.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,163 @@ +//! Interfaces for reading and producing metrics +use std::{fmt, sync::Weak}; + +use opentelemetry_api::{metrics::Result, Context}; + +use super::{ + aggregation::Aggregation, + data::{ResourceMetrics, ScopeMetrics, Temporality}, + instrument::InstrumentKind, + pipeline::Pipeline, +}; + +/// The interface used between the SDK and an exporter. +/// +/// Control flow is bi-directional through the `MetricReader`, since the SDK +/// initiates `force_flush` and `shutdown` while the reader initiates +/// collection. The `register_pipeline` method here informs the metric reader +/// that it can begin reading, signaling the start of bi-directional control +/// flow. +/// +/// Typically, push-based exporters that are periodic will implement +/// `MetricExporter` themselves and construct a `PeriodicReader` to satisfy this +/// interface. +/// +/// Pull-based exporters will typically implement `MetricReader` themselves, +/// since they read on demand. +pub trait MetricReader: + AggregationSelector + TemporalitySelector + fmt::Debug + Send + Sync + 'static +{ + /// Registers a [MetricReader] with a [Pipeline]. + /// + /// The pipeline argument allows the `MetricReader` to signal the sdk to collect + /// and send aggregated metric measurements. + fn register_pipeline(&self, pipeline: Weak); + + /// Registers a an external Producer with this [MetricReader]. + /// + /// The [MetricProducer] is used as a source of aggregated metric data which is + /// incorporated into metrics collected from the SDK. + fn register_producer(&self, producer: Box); + + /// Gathers and returns all metric data related to the [MetricReader] from the + /// SDK and stores it in the provided [ResourceMetrics] reference. + /// + /// An error is returned if this is called after shutdown. + fn collect(&self, rm: &mut ResourceMetrics) -> Result<()>; + + /// Flushes all metric measurements held in an export pipeline. + /// + /// There is no guaranteed that all telemetry be flushed or all resources have + /// been released on error. + fn force_flush(&self, cx: &Context) -> Result<()>; + + /// Flushes all metric measurements held in an export pipeline and releases any + /// held computational resources. + /// + /// There is no guaranteed that all telemetry be flushed or all resources have + /// been released on error. + /// + /// After `shutdown` is called, calls to `collect` will perform no operation and + /// instead will return an error indicating the shutdown state. + fn shutdown(&self) -> Result<()>; +} + +/// Produces metrics for a [MetricReader]. +pub(crate) trait SdkProducer: fmt::Debug + Send + Sync { + /// Returns aggregated metrics from a single collection. + fn produce(&self, rm: &mut ResourceMetrics) -> Result<()>; +} + +/// Produces metrics for a [MetricReader] from an external source. +pub trait MetricProducer: fmt::Debug + Send + Sync { + /// Returns aggregated metrics from an external source. + fn produce(&self) -> Result; +} + +/// An interface for selecting the temporality for an [InstrumentKind]. +pub trait TemporalitySelector: Send + Sync { + /// Selects the temporality to use based on the [InstrumentKind]. + fn temporality(&self, kind: InstrumentKind) -> Temporality; +} + +/// The default temporality used if not specified for a given [InstrumentKind]. +/// +/// [Temporality::Cumulative] will be used for all instrument kinds if this +/// [TemporalitySelector] is used. +#[derive(Clone, Default, Debug)] +pub struct DefaultTemporalitySelector { + pub(crate) _private: (), +} + +impl DefaultTemporalitySelector { + /// Create a new default temporality selector. + pub fn new() -> Self { + Self::default() + } +} + +impl TemporalitySelector for DefaultTemporalitySelector { + fn temporality(&self, _kind: InstrumentKind) -> Temporality { + Temporality::Cumulative + } +} + +/// An interface for selecting the aggregation and the parameters for an +/// [InstrumentKind]. +pub trait AggregationSelector: Send + Sync { + /// Selects the aggregation and the parameters to use for that aggregation based on + /// the [InstrumentKind]. + fn aggregation(&self, kind: InstrumentKind) -> Aggregation; +} + +impl AggregationSelector for T +where + T: Fn(InstrumentKind) -> Aggregation + Send + Sync, +{ + fn aggregation(&self, kind: InstrumentKind) -> Aggregation { + self(kind) + } +} + +/// The default aggregation and parameters for an instrument of [InstrumentKind]. +/// +/// This [AggregationSelector] uses the following selection mapping per [the spec]: +/// +/// * Counter ⇨ Sum +/// * Observable Counter ⇨ Sum +/// * UpDownCounter ⇨ Sum +/// * Observable UpDownCounter ⇨ Sum +/// * Observable Gauge ⇨ LastValue +/// * Histogram ⇨ ExplicitBucketHistogram +/// +/// [the spec]: https://github.com/open-telemetry/opentelemetry-specification/blob/v1.19.0/specification/metrics/sdk.md#default-aggregation +#[derive(Clone, Default, Debug)] +pub struct DefaultAggregationSelector { + pub(crate) _private: (), +} + +impl DefaultAggregationSelector { + /// Create a new default aggregation selector. + pub fn new() -> Self { + Self::default() + } +} + +impl AggregationSelector for DefaultAggregationSelector { + fn aggregation(&self, kind: InstrumentKind) -> Aggregation { + match kind { + InstrumentKind::Counter + | InstrumentKind::UpDownCounter + | InstrumentKind::ObservableCounter + | InstrumentKind::ObservableUpDownCounter => Aggregation::Sum, + InstrumentKind::ObservableGauge => Aggregation::LastValue, + InstrumentKind::Histogram => Aggregation::ExplicitBucketHistogram { + boundaries: vec![ + 0.0, 5.0, 10.0, 25.0, 50.0, 75.0, 100.0, 250.0, 500.0, 750.0, 1000.0, 2500.0, + 5000.0, 7500.0, 10000.0, + ], + record_min_max: true, + }, + } + } +} diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/registry.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/registry.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/registry.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/registry.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,129 +0,0 @@ -//! Metrics Registry API -use crate::metrics::sdk_api::{Descriptor, SyncInstrumentCore}; -use core::fmt; -use opentelemetry_api::{ - metrics::{MetricsError, Result}, - Context, -}; -use std::sync::{Arc, Mutex}; -use std::{any::Any, collections::HashMap}; - -use super::sdk_api::{AsyncInstrumentCore, InstrumentCore, MeterCore}; - -/// Create a new `UniqueInstrumentMeterCore` from a `InstrumentProvider`. -pub fn unique_instrument_meter_core(core: T) -> UniqueInstrumentMeterCore -where - T: AnyMeterCore + Send + Sync + 'static, -{ - UniqueInstrumentMeterCore::wrap(core) -} - -/// An extension trait that allows meters to be downcast -pub trait AnyMeterCore: MeterCore { - /// Returns the current type as [`Any`] - fn as_any(&self) -> &dyn Any; -} - -impl AnyMeterCore for T { - fn as_any(&self) -> &dyn Any { - self - } -} - -/// Implements the [`MeterCore`] interface, adding uniqueness checking for -/// instrument descriptors. -pub struct UniqueInstrumentMeterCore { - inner: Box, - state: Mutex>>, -} - -impl fmt::Debug for UniqueInstrumentMeterCore { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.write_str("UniqueInstrumentMeterCore") - } -} - -impl UniqueInstrumentMeterCore { - fn wrap(inner: T) -> Self - where - T: AnyMeterCore + Send + Sync + 'static, - { - UniqueInstrumentMeterCore { - inner: Box::new(inner), - state: Mutex::new(HashMap::default()), - } - } - - pub(crate) fn meter_core(&self) -> &dyn Any { - self.inner.as_any() - } -} - -impl MeterCore for UniqueInstrumentMeterCore { - fn new_sync_instrument( - &self, - descriptor: Descriptor, - ) -> Result> { - self.state.lock().map_err(Into::into).and_then(|mut state| { - let instrument = check_uniqueness(&state, &descriptor)?; - match instrument { - Some(instrument) => Ok(instrument), - None => { - let instrument = self.inner.new_sync_instrument(descriptor.clone())?; - state.insert(descriptor.name().into(), instrument.clone().as_dyn_core()); - - Ok(instrument) - } - } - }) - } - - fn new_async_instrument( - &self, - descriptor: Descriptor, - ) -> Result> { - self.state.lock().map_err(Into::into).and_then(|mut state| { - let instrument = check_uniqueness(&state, &descriptor)?; - match instrument { - Some(instrument) => Ok(instrument), - None => { - let instrument = self.inner.new_async_instrument(descriptor)?; - state.insert( - instrument.descriptor().name().into(), - instrument.clone().as_dyn_core(), - ); - - Ok(instrument) - } - } - }) - } - - fn register_callback(&self, f: Box) -> Result<()> { - self.inner.register_callback(f) - } -} - -fn check_uniqueness( - instruments: &HashMap>, - descriptor: &Descriptor, -) -> Result> { - if let Some(instrument) = instruments.get(descriptor.name()) { - if is_equal(instrument.descriptor(), descriptor) { - Ok(instrument.as_any().downcast_ref::().cloned()) - } else { - Err(MetricsError::MetricKindMismatch(format!( - "metric {} registered as a {:?} {:?}", - descriptor.name(), - descriptor.number_kind(), - descriptor.instrument_kind() - ))) - } - } else { - Ok(None) - } -} - -fn is_equal(a: &Descriptor, b: &Descriptor) -> bool { - a.instrument_kind() == b.instrument_kind() && a.number_kind() == b.number_kind() -} diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/sdk_api/async_instrument.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/sdk_api/async_instrument.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/sdk_api/async_instrument.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/sdk_api/async_instrument.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,122 +0,0 @@ -//! Async metrics -use crate::{ - global, - metrics::{sdk_api, MetricsError, Number}, - KeyValue, -}; -use std::fmt; -use std::marker; -use std::sync::Arc; - -/// Observation is used for reporting an asynchronous batch of metric values. -/// Instances of this type should be created by asynchronous instruments (e.g., -/// [ValueObserver::observation]). -/// -/// [ValueObserver::observation]: crate::metrics::ValueObserver::observation() -#[derive(Debug)] -pub struct Observation { - number: Number, - instrument: Arc, -} - -impl Observation { - /// Create a new observation for an instrument - pub(crate) fn new(number: Number, instrument: Arc) -> Self { - Observation { number, instrument } - } - - /// The value of this observation - pub fn number(&self) -> &Number { - &self.number - } - /// The instrument used to record this observation - pub fn instrument(&self) -> &Arc { - &self.instrument - } -} - -/// A type of callback that `f64` observers run. -type F64ObserverCallback = Box) + Send + Sync>; - -/// A type of callback that `u64` observers run. -type U64ObserverCallback = Box) + Send + Sync>; - -/// A type of callback that `u64` observers run. -type I64ObserverCallback = Box) + Send + Sync>; - -/// A callback argument for use with any Observer instrument that will be -/// reported as a batch of observations. -type BatchObserverCallback = Box; - -/// Data passed to an observer callback to capture observations for one -/// asynchronous metric instrument. -pub struct ObserverResult { - instrument: Arc, - f: fn(&[KeyValue], &[Observation]), - _marker: marker::PhantomData, -} - -impl ObserverResult -where - T: Into, -{ - /// New observer result for a given metric instrument - fn new( - instrument: Arc, - f: fn(&[KeyValue], &[Observation]), - ) -> Self { - ObserverResult { - instrument, - f, - _marker: marker::PhantomData, - } - } - - /// Observe captures a single value from the associated instrument callback, - /// with the given attributes. - pub fn observe(&self, value: T, attributes: &[KeyValue]) { - (self.f)( - attributes, - &[Observation { - number: value.into(), - instrument: self.instrument.clone(), - }], - ) - } -} - -impl fmt::Debug for ObserverResult { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("ObserverResult") - .field("instrument", &self.instrument) - .field("f", &"fn(&[KeyValue], &[Observation])") - .finish() - } -} - -/// Passed to a batch observer callback to capture observations for multiple -/// asynchronous instruments. -pub struct BatchObserverResult { - f: fn(&[KeyValue], &[Observation]), -} - -impl fmt::Debug for BatchObserverResult { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("BatchObserverResult") - .field("f", &"fn(&[KeyValue], &[Observation])") - .finish() - } -} - -impl BatchObserverResult { - /// New observer result for a given metric instrument - fn new(f: fn(&[KeyValue], &[Observation])) -> Self { - BatchObserverResult { f } - } - - /// Captures multiple observations from the associated batch instrument - /// callback, with the given attributes. - pub fn observe(&self, attributes: &[KeyValue], observations: &[Observation]) { - (self.f)(attributes, observations) - } -} diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/sdk_api/descriptor.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/sdk_api/descriptor.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/sdk_api/descriptor.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/sdk_api/descriptor.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,83 +0,0 @@ -use crate::metrics::sdk_api::{InstrumentKind, NumberKind}; -use fnv::FnvHasher; -use opentelemetry_api::metrics::Unit; -use std::hash::{Hash, Hasher}; - -/// Descriptor contains all the settings that describe an instrument, including -/// its name, metric kind, number kind, and the configurable options. -#[derive(Clone, Debug, PartialEq, Eq)] -pub struct Descriptor { - name: String, - instrument_kind: InstrumentKind, - number_kind: NumberKind, - description: Option, - unit: Option, - attribute_hash: u64, -} - -impl Descriptor { - /// Create a new descriptor - pub fn new( - name: String, - instrument_kind: InstrumentKind, - number_kind: NumberKind, - description: Option, - unit: Option, - ) -> Self { - let mut hasher = FnvHasher::default(); - name.hash(&mut hasher); - instrument_kind.hash(&mut hasher); - number_kind.hash(&mut hasher); - if let Some(description) = &description { - description.hash(&mut hasher); - } - if let Some(unit) = &unit { - unit.hash(&mut hasher); - } - - Descriptor { - name, - instrument_kind, - number_kind, - description, - unit, - attribute_hash: hasher.finish(), - } - } - - /// The metric instrument's name. - pub fn name(&self) -> &str { - self.name.as_str() - } - - /// The specific kind of instrument. - pub fn instrument_kind(&self) -> &InstrumentKind { - &self.instrument_kind - } - - /// NumberKind returns whether this instrument is declared over int64, float64, or uint64 - /// values. - pub fn number_kind(&self) -> &NumberKind { - &self.number_kind - } - - /// A human-readable description of the metric instrument. - pub fn description(&self) -> Option<&String> { - self.description.as_ref() - } - - /// Assign a new description - pub fn set_description(&mut self, description: String) { - self.description = Some(description); - } - - /// Unit describes the units of the metric instrument. - pub fn unit(&self) -> Option<&str> { - self.unit.as_ref().map(|unit| unit.as_ref()) - } - - /// The pre-computed hash of the descriptor data - pub fn attribute_hash(&self) -> u64 { - self.attribute_hash - } -} diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/sdk_api/instrument_kind.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/sdk_api/instrument_kind.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/sdk_api/instrument_kind.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/sdk_api/instrument_kind.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,60 +0,0 @@ -/// Kinds of OpenTelemetry metric instruments -#[derive(Clone, Debug, PartialEq, Eq, Hash)] -pub enum InstrumentKind { - /// A histogram instrument - Histogram, - /// A gauge observer instrument - GaugeObserver, - /// A synchronous per-request part of a monotonic sum. - Counter, - /// A synchronous per-request part of a non-monotonic sum. - UpDownCounter, - /// An asynchronous per-interval recorder of a monotonic sum. - CounterObserver, - /// An asynchronous per-interval recorder of a non-monotonic sum. - UpDownCounterObserver, -} - -impl InstrumentKind { - /// Whether this is a synchronous kind of instrument. - pub fn synchronous(&self) -> bool { - matches!( - self, - InstrumentKind::Counter | InstrumentKind::UpDownCounter | InstrumentKind::Histogram - ) - } - - /// Whether this is a synchronous kind of instrument. - pub fn asynchronous(&self) -> bool { - !self.synchronous() - } - - /// Whether this kind of instrument adds its inputs (as opposed to grouping). - pub fn adding(&self) -> bool { - matches!( - self, - InstrumentKind::Counter - | InstrumentKind::UpDownCounter - | InstrumentKind::CounterObserver - | InstrumentKind::UpDownCounterObserver - ) - } - - /// Whether this kind of instrument groups its inputs (as opposed to adding). - pub fn grouping(&self) -> bool { - !self.adding() - } - - /// Whether this kind of instrument exposes a non-decreasing sum. - pub fn monotonic(&self) -> bool { - matches!( - self, - InstrumentKind::Counter | InstrumentKind::CounterObserver - ) - } - - /// Whether this kind of instrument receives precomputed sums. - pub fn precomputed_sum(&self) -> bool { - self.adding() && self.asynchronous() - } -} diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/sdk_api/mod.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/sdk_api/mod.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/sdk_api/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/sdk_api/mod.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,81 +0,0 @@ -//! SDK API - -// mod async_instrument; -mod descriptor; -mod instrument_kind; -mod number; -mod wrap; -// mod sync_instrument; - -use std::any::Any; -use std::sync::Arc; - -pub use descriptor::*; -pub use instrument_kind::*; -pub use number::*; -use opentelemetry_api::{metrics::Result, Context, KeyValue}; -pub use wrap::wrap_meter_core; - -/// The interface an SDK must implement to supply a Meter implementation. -pub trait MeterCore { - /// Create a new synchronous instrument implementation. - fn new_sync_instrument( - &self, - descriptor: Descriptor, - ) -> Result>; - - /// Create a new asynchronous instrument implementation. - /// - /// Runner is `None` if used in batch as the batch runner is registered separately. - fn new_async_instrument( - &self, - descriptor: Descriptor, - ) -> Result>; - - /// Register a batch observer - fn register_callback(&self, f: Box) -> Result<()>; -} - -/// A utility extension to allow upcasting. -/// -/// Can be removed once [trait_upcasting] is stablized. -/// -/// [trait_upcasting]: https://doc.rust-lang.org/unstable-book/language-features/trait-upcasting.html -pub trait AsDynInstrumentCore { - /// Create an `Arc` from an impl of `InstrumentCore`. - fn as_dyn_core<'a>(self: Arc) -> Arc - where - Self: 'a; -} - -impl AsDynInstrumentCore for T { - fn as_dyn_core<'a>(self: Arc) -> Arc - where - Self: 'a, - { - self - } -} - -/// A common interface for synchronous and asynchronous instruments. -pub trait InstrumentCore: AsDynInstrumentCore { - /// Description of the instrument's descriptor - fn descriptor(&self) -> &Descriptor; - - /// Returns self as any - fn as_any(&self) -> &dyn Any; -} - -/// The implementation-level interface to a generic synchronous instrument -/// (e.g., Histogram and Counter instruments). -pub trait SyncInstrumentCore: InstrumentCore { - /// Capture a single synchronous metric event. - fn record_one(&self, cx: &Context, number: Number, attributes: &'_ [KeyValue]); -} - -/// An implementation-level interface to an asynchronous instrument (e.g., -/// Observable instruments). -pub trait AsyncInstrumentCore: InstrumentCore { - /// Captures a single asynchronous metric event. - fn observe_one(&self, cx: &Context, number: Number, attributes: &'_ [KeyValue]); -} diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/sdk_api/number.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/sdk_api/number.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/sdk_api/number.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/sdk_api/number.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,251 +0,0 @@ -use std::cmp; -use std::fmt; -use std::sync::atomic::{AtomicU64, Ordering}; - -/// Number represents either an integral or a floating point value. It -/// needs to be accompanied with a source of NumberKind that describes -/// the actual type of the value stored within Number. -#[derive(Clone, Debug, Default)] -pub struct Number(u64); - -impl Number { - /// Create an atomic version of the current number - pub fn to_atomic(&self) -> AtomicNumber { - AtomicNumber(AtomicU64::new(self.0)) - } - - /// Compares this number to the given other number. Both should be of the same kind. - pub fn partial_cmp(&self, number_kind: &NumberKind, other: &Number) -> Option { - match number_kind { - NumberKind::I64 => (self.0 as i64).partial_cmp(&(other.0 as i64)), - NumberKind::F64 => { - let current = u64_to_f64(self.0); - let other = u64_to_f64(other.0); - current.partial_cmp(&other) - } - NumberKind::U64 => self.0.partial_cmp(&other.0), - } - } - - /// Casts the number to `i64`. May result in data/precision loss. - pub fn to_i64(&self, number_kind: &NumberKind) -> i64 { - match number_kind { - NumberKind::F64 => u64_to_f64(self.0) as i64, - NumberKind::U64 | NumberKind::I64 => self.0 as i64, - } - } - - /// Casts the number to `f64`. May result in data/precision loss. - pub fn to_f64(&self, number_kind: &NumberKind) -> f64 { - match number_kind { - NumberKind::I64 => (self.0 as i64) as f64, - NumberKind::F64 => u64_to_f64(self.0), - NumberKind::U64 => self.0 as f64, - } - } - - /// Casts the number to `u64`. May result in data/precision loss. - pub fn to_u64(&self, number_kind: &NumberKind) -> u64 { - match number_kind { - NumberKind::F64 => u64_to_f64(self.0) as u64, - NumberKind::U64 | NumberKind::I64 => self.0, - } - } - - /// Checks if this value ia an f64 nan value. Do not use on non-f64 values. - pub fn is_nan(&self) -> bool { - u64_to_f64(self.0).is_nan() - } - - /// `true` if the actual value is less than zero. - pub fn is_negative(&self, number_kind: &NumberKind) -> bool { - match number_kind { - NumberKind::I64 => (self.0 as i64).is_negative(), - NumberKind::F64 => u64_to_f64(self.0).is_sign_negative(), - NumberKind::U64 => false, - } - } - - /// Return loaded data for debugging purposes - pub fn to_debug(&self, kind: &NumberKind) -> Box { - match kind { - NumberKind::I64 => Box::new(self.0 as i64), - NumberKind::F64 => Box::new(u64_to_f64(self.0)), - NumberKind::U64 => Box::new(self.0), - } - } -} - -/// An atomic version of `Number` -#[derive(Debug, Default)] -pub struct AtomicNumber(AtomicU64); - -impl AtomicNumber { - /// Stores a `Number` into the atomic number. - pub fn store(&self, val: &Number) { - self.0.store(val.0, Ordering::Relaxed) - } - - /// Adds to the current number. Both numbers must be of the same kind. - /// - /// This operation wraps around on overflow for `u64` and `i64` types and is - /// `inf` for `f64`. - pub fn fetch_add(&self, number_kind: &NumberKind, val: &Number) { - match number_kind { - NumberKind::I64 => { - let mut old = self.0.load(Ordering::Acquire); - loop { - let new = (old as i64).wrapping_add(val.0 as i64) as u64; - match self.0.compare_exchange_weak( - old, - new, - Ordering::AcqRel, - Ordering::Acquire, - ) { - Ok(_) => break, - Err(x) => old = x, - }; - } - } - NumberKind::F64 => { - let mut old = self.0.load(Ordering::Acquire); - loop { - let new = u64_to_f64(old) + u64_to_f64(val.0); - match self.0.compare_exchange_weak( - old, - f64_to_u64(new), - Ordering::AcqRel, - Ordering::Acquire, - ) { - Ok(_) => break, - Err(x) => old = x, - }; - } - } - NumberKind::U64 => { - self.0.fetch_add(val.0, Ordering::AcqRel); - } - } - } - - /// Subtracts from the current number. Both numbers must be of the same kind. - /// - /// This operation wraps around on overflow for `u64` and `i64` types and is - /// `-inf` for `f64`. - pub fn fetch_sub(&self, number_kind: &NumberKind, val: &Number) { - match number_kind { - NumberKind::I64 => { - let mut old = self.0.load(Ordering::Acquire); - loop { - let new = (old as i64).wrapping_sub(val.0 as i64) as u64; - match self.0.compare_exchange_weak( - old, - new, - Ordering::AcqRel, - Ordering::Relaxed, - ) { - Ok(_) => break, - Err(x) => old = x, - }; - } - } - NumberKind::F64 => { - let mut old = self.0.load(Ordering::Acquire); - loop { - let new = u64_to_f64(old) - u64_to_f64(val.0); - match self.0.compare_exchange_weak( - old, - f64_to_u64(new), - Ordering::AcqRel, - Ordering::Acquire, - ) { - Ok(_) => break, - Err(x) => old = x, - }; - } - } - NumberKind::U64 => { - self.0.fetch_sub(val.0, Ordering::AcqRel); - } - } - } - - /// Loads the current `Number`. - pub fn load(&self) -> Number { - Number(self.0.load(Ordering::Relaxed)) - } -} - -impl Clone for AtomicNumber { - fn clone(&self) -> Self { - AtomicNumber(AtomicU64::new(self.0.load(Ordering::Relaxed))) - } -} - -impl From for Number { - fn from(f: f64) -> Self { - Number(f64_to_u64(f)) - } -} - -impl From for Number { - fn from(i: i64) -> Self { - Number(i as u64) - } -} - -impl From for Number { - fn from(u: u64) -> Self { - Number(u) - } -} - -/// A descriptor for the encoded data type of a `Number` -#[derive(Clone, Debug, PartialEq, Eq, Hash)] -pub enum NumberKind { - /// A Number that stores `i64` values. - I64, - /// A Number that stores `f64` values. - F64, - /// A Number that stores `u64` values. - U64, -} - -impl NumberKind { - /// Returns the zero value for each kind - pub fn zero(&self) -> Number { - match self { - NumberKind::I64 => 0i64.into(), - NumberKind::F64 => 0f64.into(), - NumberKind::U64 => 0u64.into(), - } - } - - /// Returns the max value for each kind - pub fn max(&self) -> Number { - match self { - NumberKind::I64 => std::i64::MAX.into(), - NumberKind::F64 => std::f64::MAX.into(), - NumberKind::U64 => std::u64::MAX.into(), - } - } - - /// Returns the min value for each kind - pub fn min(&self) -> Number { - match self { - NumberKind::I64 => std::i64::MIN.into(), - NumberKind::F64 => std::f64::MIN.into(), - NumberKind::U64 => std::u64::MIN.into(), - } - } -} - -#[inline] -fn u64_to_f64(val: u64) -> f64 { - f64::from_bits(val) -} - -#[inline] -fn f64_to_u64(val: f64) -> u64 { - f64::to_bits(val) -} diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/sdk_api/sync_instrument.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/sdk_api/sync_instrument.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/sdk_api/sync_instrument.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/sdk_api/sync_instrument.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,87 +0,0 @@ -use crate::{ - metrics::{sdk_api, Number}, - KeyValue, -}; -use std::marker; -use std::sync::Arc; - -/// Measurement is used for reporting a synchronous batch of metric values. -/// Instances of this type should be created by synchronous instruments (e.g., -/// `Counter::measurement`). -#[derive(Debug)] -pub struct Measurement { - number: Number, - instrument: Arc, -} - -impl Measurement { - /// Create a new measurement for an instrument - pub(crate) fn new(number: Number, instrument: Arc) -> Self { - Measurement { number, instrument } - } - - /// The number recorded by this measurement - pub fn number(&self) -> &Number { - &self.number - } - - /// Convert this measurement into the underlying number - pub fn into_number(self) -> Number { - self.number - } - - /// The instrument that recorded this measurement - pub fn instrument(&self) -> &Arc { - &self.instrument - } -} - -/// Wrapper around a sdk-implemented sync instrument for a given type -#[derive(Clone, Debug)] -pub(crate) struct SyncInstrument { - instrument: Arc, - _marker: marker::PhantomData, -} - -impl SyncInstrument { - /// Create a new sync instrument from an sdk-implemented sync instrument - pub(crate) fn new(instrument: Arc) -> Self { - SyncInstrument { - instrument, - _marker: marker::PhantomData, - } - } - - /// Create a new bound sync instrument - pub(crate) fn bind(&self, attributes: &[KeyValue]) -> SyncBoundInstrument { - let bound_instrument = self.instrument.bind(attributes); - SyncBoundInstrument { - bound_instrument, - _marker: marker::PhantomData, - } - } - - /// Record a value directly to the underlying instrument - pub(crate) fn direct_record(&self, number: Number, attributes: &[KeyValue]) { - self.instrument.record_one(number, attributes) - } - - /// Reference to the underlying sdk-implemented instrument - pub(crate) fn instrument(&self) -> &Arc { - &self.instrument - } -} - -/// Wrapper around a sdk-implemented sync bound instrument -#[derive(Clone, Debug)] -pub(crate) struct SyncBoundInstrument { - bound_instrument: Arc, - _marker: marker::PhantomData, -} - -impl SyncBoundInstrument { - /// Record a value directly to the underlying instrument - pub(crate) fn direct_record(&self, number: Number) { - self.bound_instrument.record_one(number) - } -} diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/sdk_api/wrap.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/sdk_api/wrap.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/sdk_api/wrap.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/sdk_api/wrap.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,319 +0,0 @@ -use crate::metrics::sdk_api::MeterCore; -use crate::metrics::sdk_api::{ - AsyncInstrumentCore, Descriptor, InstrumentKind, Number, NumberKind, SyncInstrumentCore, -}; -use opentelemetry_api::metrics::{ - AsyncCounter, AsyncUpDownCounter, ObservableUpDownCounter, SyncCounter, SyncHistogram, - SyncUpDownCounter, UpDownCounter, -}; -use opentelemetry_api::KeyValue; -use opentelemetry_api::{ - metrics::{ - AsyncGauge, Counter, Histogram, InstrumentProvider, Meter, ObservableCounter, - ObservableGauge, Result, Unit, - }, - Context, InstrumentationLibrary, -}; -use std::sync::Arc; - -/// wraps impl to be a full implementation of a Meter. -pub fn wrap_meter_core( - core: Arc, - library: InstrumentationLibrary, -) -> Meter { - Meter::new(library, Arc::new(MeterImpl(core))) -} - -struct MeterImpl(Arc); - -struct SyncInstrument(Arc); - -impl> SyncCounter for SyncInstrument { - fn add(&self, cx: &Context, value: T, attributes: &[KeyValue]) { - self.0.record_one(cx, value.into(), attributes) - } -} - -impl> SyncUpDownCounter for SyncInstrument { - fn add(&self, cx: &Context, value: T, attributes: &[KeyValue]) { - self.0.record_one(cx, value.into(), attributes) - } -} - -impl> SyncHistogram for SyncInstrument { - fn record(&self, cx: &Context, value: T, attributes: &[KeyValue]) { - self.0.record_one(cx, value.into(), attributes) - } -} - -struct AsyncInstrument(Arc); - -impl> AsyncCounter for AsyncInstrument { - fn observe(&self, cx: &Context, value: T, attributes: &[KeyValue]) { - self.0.observe_one(cx, value.into(), attributes) - } -} - -impl> AsyncUpDownCounter for AsyncInstrument { - fn observe(&self, cx: &Context, value: T, attributes: &[KeyValue]) { - self.0.observe_one(cx, value.into(), attributes) - } -} - -impl> AsyncGauge for AsyncInstrument { - fn observe(&self, cx: &Context, value: T, attributes: &[KeyValue]) { - self.0.observe_one(cx, value.into(), attributes) - } -} - -impl InstrumentProvider for MeterImpl { - fn u64_counter( - &self, - name: String, - description: Option, - unit: Option, - ) -> Result> { - let instrument = self.0.new_sync_instrument(Descriptor::new( - name, - InstrumentKind::Counter, - NumberKind::U64, - description, - unit, - ))?; - - Ok(Counter::new(Arc::new(SyncInstrument(instrument)))) - } - - fn f64_counter( - &self, - name: String, - description: Option, - unit: Option, - ) -> Result> { - let instrument = self.0.new_sync_instrument(Descriptor::new( - name, - InstrumentKind::Counter, - NumberKind::F64, - description, - unit, - ))?; - - Ok(Counter::new(Arc::new(SyncInstrument(instrument)))) - } - - fn u64_observable_counter( - &self, - name: String, - description: Option, - unit: Option, - ) -> Result> { - let instrument = self.0.new_async_instrument(Descriptor::new( - name, - InstrumentKind::Counter, - NumberKind::U64, - description, - unit, - ))?; - - Ok(ObservableCounter::new(Arc::new(AsyncInstrument( - instrument, - )))) - } - - fn f64_observable_counter( - &self, - name: String, - description: Option, - unit: Option, - ) -> Result> { - let instrument = self.0.new_async_instrument(Descriptor::new( - name, - InstrumentKind::Counter, - NumberKind::F64, - description, - unit, - ))?; - - Ok(ObservableCounter::new(Arc::new(AsyncInstrument( - instrument, - )))) - } - - fn i64_up_down_counter( - &self, - name: String, - description: Option, - unit: Option, - ) -> Result> { - let instrument = self.0.new_sync_instrument(Descriptor::new( - name, - InstrumentKind::UpDownCounter, - NumberKind::I64, - description, - unit, - ))?; - - Ok(UpDownCounter::new(Arc::new(SyncInstrument(instrument)))) - } - - fn f64_up_down_counter( - &self, - name: String, - description: Option, - unit: Option, - ) -> Result> { - let instrument = self.0.new_sync_instrument(Descriptor::new( - name, - InstrumentKind::UpDownCounter, - NumberKind::F64, - description, - unit, - ))?; - - Ok(UpDownCounter::new(Arc::new(SyncInstrument(instrument)))) - } - - fn i64_observable_up_down_counter( - &self, - name: String, - description: Option, - unit: Option, - ) -> Result> { - let instrument = self.0.new_async_instrument(Descriptor::new( - name, - InstrumentKind::UpDownCounterObserver, - NumberKind::I64, - description, - unit, - ))?; - - Ok(ObservableUpDownCounter::new(Arc::new(AsyncInstrument( - instrument, - )))) - } - - fn f64_observable_up_down_counter( - &self, - name: String, - description: Option, - unit: Option, - ) -> Result> { - let instrument = self.0.new_async_instrument(Descriptor::new( - name, - InstrumentKind::UpDownCounterObserver, - NumberKind::F64, - description, - unit, - ))?; - - Ok(ObservableUpDownCounter::new(Arc::new(AsyncInstrument( - instrument, - )))) - } - - fn u64_observable_gauge( - &self, - name: String, - description: Option, - unit: Option, - ) -> Result> { - let instrument = self.0.new_async_instrument(Descriptor::new( - name, - InstrumentKind::GaugeObserver, - NumberKind::U64, - description, - unit, - ))?; - - Ok(ObservableGauge::new(Arc::new(AsyncInstrument(instrument)))) - } - - fn i64_observable_gauge( - &self, - name: String, - description: Option, - unit: Option, - ) -> Result> { - let instrument = self.0.new_async_instrument(Descriptor::new( - name, - InstrumentKind::GaugeObserver, - NumberKind::I64, - description, - unit, - ))?; - - Ok(ObservableGauge::new(Arc::new(AsyncInstrument(instrument)))) - } - - fn f64_observable_gauge( - &self, - name: String, - description: Option, - unit: Option, - ) -> Result> { - let instrument = self.0.new_async_instrument(Descriptor::new( - name, - InstrumentKind::GaugeObserver, - NumberKind::F64, - description, - unit, - ))?; - - Ok(ObservableGauge::new(Arc::new(AsyncInstrument(instrument)))) - } - - fn f64_histogram( - &self, - name: String, - description: Option, - unit: Option, - ) -> Result> { - let instrument = self.0.new_sync_instrument(Descriptor::new( - name, - InstrumentKind::Histogram, - NumberKind::F64, - description, - unit, - ))?; - - Ok(Histogram::new(Arc::new(SyncInstrument(instrument)))) - } - - fn u64_histogram( - &self, - name: String, - description: Option, - unit: Option, - ) -> Result> { - let instrument = self.0.new_sync_instrument(Descriptor::new( - name, - InstrumentKind::Histogram, - NumberKind::U64, - description, - unit, - ))?; - - Ok(Histogram::new(Arc::new(SyncInstrument(instrument)))) - } - - fn i64_histogram( - &self, - name: String, - description: Option, - unit: Option, - ) -> Result> { - let instrument = self.0.new_sync_instrument(Descriptor::new( - name, - InstrumentKind::Histogram, - NumberKind::I64, - description, - unit, - ))?; - - Ok(Histogram::new(Arc::new(SyncInstrument(instrument)))) - } - - fn register_callback(&self, callback: Box) -> Result<()> { - self.0.register_callback(callback) - } -} diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/selectors/mod.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/selectors/mod.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/selectors/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/selectors/mod.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,2 +0,0 @@ -//! Aggregator Selectors -pub mod simple; diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/selectors/simple.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/selectors/simple.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/selectors/simple.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/selectors/simple.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,43 +0,0 @@ -//! Simple Metric Selectors -use crate::export::metrics::AggregatorSelector; -use crate::metrics::aggregators::{self, Aggregator}; -use crate::metrics::sdk_api::{Descriptor, InstrumentKind}; -use std::sync::Arc; - -/// This selector is faster and uses less memory than the others in this package. -pub fn inexpensive() -> impl AggregatorSelector { - InexpensiveSelector -} - -#[derive(Debug, Clone)] -struct InexpensiveSelector; - -impl AggregatorSelector for InexpensiveSelector { - fn aggregator_for(&self, descriptor: &Descriptor) -> Option> { - match descriptor.instrument_kind() { - InstrumentKind::GaugeObserver => Some(Arc::new(aggregators::last_value())), - _ => Some(Arc::new(aggregators::sum())), - } - } -} - -/// A simple aggregator selector that uses histogram aggregators for `Histogram` -/// instruments. -/// -/// This selector is a good default choice for most metric exporters. -pub fn histogram(boundaries: impl Into>) -> impl AggregatorSelector { - HistogramSelector(boundaries.into()) -} - -#[derive(Debug, Clone)] -struct HistogramSelector(Vec); - -impl AggregatorSelector for HistogramSelector { - fn aggregator_for(&self, descriptor: &Descriptor) -> Option> { - match descriptor.instrument_kind() { - InstrumentKind::GaugeObserver => Some(Arc::new(aggregators::last_value())), - InstrumentKind::Histogram => Some(Arc::new(aggregators::histogram(&self.0))), - _ => Some(Arc::new(aggregators::sum())), - } - } -} diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/view.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/view.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/view.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/metrics/view.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,176 @@ +use opentelemetry_api::{ + global, + metrics::{MetricsError, Result}, +}; +use regex::Regex; + +use super::instrument::{Instrument, Stream}; + +fn empty_view(_inst: &Instrument) -> Option { + None +} + +/// Used to customize the metrics that are output by the SDK. +/// +/// Here are some examples when a [View] might be needed: +/// +/// * Customize which Instruments are to be processed/ignored. For example, an +/// instrumented library can provide both temperature and humidity, but the +/// application developer might only want temperature. +/// * Customize the aggregation - if the default aggregation associated with the +/// [Instrument] does not meet the needs of the user. For example, an HTTP client +/// library might expose HTTP client request duration as Histogram by default, +/// but the application developer might only want the total count of outgoing +/// requests. +/// * Customize which attribute(s) are to be reported on metrics. For example, +/// an HTTP server library might expose HTTP verb (e.g. GET, POST) and HTTP +/// status code (e.g. 200, 301, 404). The application developer might only care +/// about HTTP status code (e.g. reporting the total count of HTTP requests for +/// each HTTP status code). There could also be extreme scenarios in which the +/// application developer does not need any attributes (e.g. just get the total +/// count of all incoming requests). +/// +/// # Example Custom View +/// +/// View is implemented for all `Fn(&Instrument) -> Option`. +/// +/// ``` +/// use opentelemetry_sdk::metrics::{Instrument, MeterProvider, Stream}; +/// +/// // return streams for the given instrument +/// let my_view = |i: &Instrument| { +/// // return Some(Stream) or +/// None +/// }; +/// +/// let provider = MeterProvider::builder().with_view(my_view).build(); +/// # drop(provider) +/// ``` +pub trait View: Send + Sync + 'static { + /// Defines how data should be collected for certain instruments. + /// + /// Return [Stream] to use for matching [Instrument]s, + /// otherwise if there is no match, return `None`. + fn match_inst(&self, inst: &Instrument) -> Option; +} + +impl View for T +where + T: Fn(&Instrument) -> Option + Send + Sync + 'static, +{ + fn match_inst(&self, inst: &Instrument) -> Option { + self(inst) + } +} + +impl View for Box { + fn match_inst(&self, inst: &Instrument) -> Option { + (**self).match_inst(inst) + } +} + +/// Creates a [View] that applies the [Stream] mask for all instruments that +/// match criteria. +/// +/// The returned [View] will only apply the mask if all non-empty fields of +/// criteria match the corresponding [Instrument] passed to the view. If all +/// fields of the criteria are their default values, a view that matches no +/// instruments is returned. If you need to match an empty-value field, create a +/// [View] directly. +/// +/// The [Instrument::name] field of criteria supports wildcard pattern matching. +/// The wildcard `*` is recognized as matching zero or more characters, and `?` +/// is recognized as matching exactly one character. For example, a pattern of +/// `*` will match all instrument names. +/// +/// The [Stream] mask only applies updates for non-empty fields. By default, the +/// [Instrument] the [View] matches against will be use for the name, +/// description, and unit of the returned [Stream] and no `aggregation` or +/// `allowed_attribute_keys` are set. All non-empty fields of mask are used +/// instead of the default. If you need to set a an empty value in the returned +/// stream, create a custom [View] directly. +/// +/// # Example +/// +/// ``` +/// use opentelemetry_sdk::metrics::{new_view, Aggregation, Instrument, Stream}; +/// +/// let criteria = Instrument::new().name("counter_*"); +/// let mask = Stream::new().aggregation(Aggregation::Sum); +/// +/// let view = new_view(criteria, mask); +/// # drop(view); +/// ``` +pub fn new_view(criteria: Instrument, mask: Stream) -> Result> { + if criteria.is_empty() { + return Ok(Box::new(empty_view)); + } + let contains_wildcard = criteria.name.contains(|c| c == '*' || c == '?'); + let err_msg_criteria = criteria.clone(); + + let match_fn: Box bool + Send + Sync> = if contains_wildcard { + if mask.name != "" { + global::handle_error(MetricsError::Config(format!( + "name replacement for multiple instruments, dropping view, criteria: {criteria:?}, mask: {mask:?}" + ))); + return Ok(Box::new(empty_view)); + } + + let pattern = criteria + .name + .trim_start_matches('^') + .trim_end_matches('$') + .replace('?', ".") + .replace('*', ".*"); + let re = + Regex::new(&format!("^{pattern}$")).map_err(|e| MetricsError::Config(e.to_string()))?; + Box::new(move |i| { + re.is_match(&i.name) + && criteria.matches_description(i) + && criteria.matches_kind(i) + && criteria.matches_unit(i) + && criteria.matches_scope(i) + }) + } else { + Box::new(move |i| criteria.matches(i)) + }; + + let mut agg = None; + if let Some(ma) = &mask.aggregation { + match ma.validate() { + Ok(_) => agg = Some(ma.clone()), + Err(err) => { + global::handle_error(MetricsError::Other(format!( + "{}, not using aggregation with view. criteria: {:?}, mask: {:?}", + err, err_msg_criteria, mask + ))); + } + } + } + + Ok(Box::new(move |i: &Instrument| -> Option { + if match_fn(i) { + Some(Stream { + name: if !mask.name.is_empty() { + mask.name.clone() + } else { + i.name.clone() + }, + description: if !mask.description.is_empty() { + mask.description.clone() + } else { + i.description.clone() + }, + unit: if !mask.unit.as_str().is_empty() { + mask.unit.clone() + } else { + i.unit.clone() + }, + aggregation: agg.clone(), + allowed_attribute_keys: mask.allowed_attribute_keys.clone(), + }) + } else { + None + } + })) +} diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/propagation/trace_context.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/propagation/trace_context.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/propagation/trace_context.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/propagation/trace_context.rs 2023-10-30 19:40:00.000000000 +0000 @@ -282,7 +282,7 @@ let mut injector: HashMap = HashMap::new(); injector.set(TRACESTATE_HEADER, state.to_string()); - propagator.inject_context(&Context::current(), &mut injector); + Context::map_current(|cx| propagator.inject_context(cx, &mut injector)); assert_eq!(Extractor::get(&injector, TRACESTATE_HEADER), Some(state)) } diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/resource/env.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/resource/env.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/resource/env.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/resource/env.rs 2023-10-30 19:40:00.000000000 +0000 @@ -3,7 +3,7 @@ //! Implementation of `ResourceDetector` to extract a `Resource` from environment //! variables. use crate::resource::{Resource, ResourceDetector}; -use opentelemetry_api::{Key, KeyValue}; +use opentelemetry_api::{Key, KeyValue, Value}; use std::env; use std::time::Duration; @@ -58,17 +58,15 @@ })) } -/// There are the attributes which MUST be provided by the SDK as specified in -/// [the Resource SDK specification]. This detector detect those attributes and -/// if the attribute cannot be detected, use the default value. +/// There are attributes which MUST be provided by the SDK as specified in +/// [the Resource SDK specification]. This detector detects those attributes and +/// if the attribute cannot be detected, it uses the default value. /// -/// This detector will first try `OTEL_SERVICE_NAME` env. If it's not available. -/// Then it will check the `OTEL_RESOURCE_ATTRIBUTES` env and see if it contains -/// `service.name` resource. If it's also not available. Then it will use -/// `unknown_service`. +/// This detector will first try `OTEL_SERVICE_NAME` env. If it's not available, +/// then it will check the `OTEL_RESOURCE_ATTRIBUTES` env and see if it contains +/// `service.name` resource. If it's also not available, it will use `unknown_service`. /// -/// Note that if `service.name` is empty. It will be ignore and the service name will -/// be `unknown_service`. If users want to set an empty service name. They can provide +/// If users want to set an empty service name, they can provide /// a resource with empty value and `service.name` key. /// /// [the Resource SDK specification]:https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/resource/sdk.md#sdk-provided-resource-attributes @@ -82,14 +80,13 @@ env::var(OTEL_SERVICE_NAME) .ok() .filter(|s| !s.is_empty()) - .unwrap_or_else(|| { + .map(Value::from) + .or_else(|| { EnvResourceDetector::new() .detect(Duration::from_secs(0)) .get(Key::new("service.name")) - .map(|v| v.to_string()) - .filter(|s| !s.is_empty()) - .unwrap_or_else(|| "unknown_service".to_string()) - }), + }) + .unwrap_or_else(|| "unknown_service".into()), )]) } } diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/resource/mod.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/resource/mod.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/resource/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/resource/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -18,17 +18,18 @@ //! - [`EnvResourceDetector`] - detect resource from environmental variables. //! - [`OsResourceDetector`] - detect OS from runtime. //! - [`ProcessResourceDetector`] - detect process information. +//! - [`TelemetryResourceDetector`] - detect telemetry SDK's information. mod env; mod os; mod process; +mod telemetry; pub use env::EnvResourceDetector; pub use env::SdkProvidedResourceDetector; pub use os::OsResourceDetector; pub use process::ProcessResourceDetector; +pub use telemetry::TelemetryResourceDetector; -#[cfg(feature = "metrics")] -use opentelemetry_api::attributes; use opentelemetry_api::{Key, KeyValue, Value}; use std::borrow::Cow; use std::collections::{hash_map, HashMap}; @@ -188,13 +189,6 @@ pub fn get(&self, key: Key) -> Option { self.attrs.get(&key).cloned() } - - /// Encoded attributes - #[cfg(feature = "metrics")] - #[cfg_attr(docsrs, doc(cfg(feature = "metrics")))] - pub fn encoded(&self, encoder: &dyn attributes::Encoder) -> String { - encoder.encode(&mut self.into_iter()) - } } /// An owned iterator over the entries of a `Resource`. @@ -242,7 +236,7 @@ /// ResourceDetector detects OpenTelemetry resource information /// /// Implementations of this trait can be passed to -/// the `Resource::from_detectors` function to generate a Resource from the merged information. +/// the [`Resource::from_detectors`] function to generate a Resource from the merged information. pub trait ResourceDetector { /// detect returns an initialized Resource based on gathered information. /// diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/resource/telemetry.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/resource/telemetry.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/resource/telemetry.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/resource/telemetry.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,27 @@ +use crate::resource::ResourceDetector; +use crate::Resource; +use opentelemetry_api::KeyValue; +use std::time::Duration; + +/// Detect the telemetry SDK information used to capture data recorded by the instrumentation libraries. +/// +/// It provides: +/// - The name of the telemetry SDK(`telemetry.sdk.name`). It will be `opentelemetry` for SDK provided by opentelemetry project. +/// - The language of the telemetry SDK(`telemetry.sdk.language`). It will be `rust` for this SDK. +/// - The version of the telemetry SDK(`telemetry.sdk.version`). It will be current `opentelemetry_sdk` crate version. +/// +/// Note that the `telemetry.auto.version` is not provided as of now. +/// +/// See [semantic conventions](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/resource/semantic_conventions/README.md#telemetry-sdk) for details. +#[derive(Debug)] +pub struct TelemetryResourceDetector; + +impl ResourceDetector for TelemetryResourceDetector { + fn detect(&self, _timeout: Duration) -> Resource { + Resource::new(vec![ + KeyValue::new("telemetry.sdk.name", "opentelemetry"), + KeyValue::new("telemetry.sdk.language", "rust"), + KeyValue::new("telemetry.sdk.version", env!("CARGO_PKG_VERSION")), + ]) + } +} diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/runtime.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/runtime.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/runtime.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/runtime.rs 2023-10-30 19:40:00.000000000 +0000 @@ -7,7 +7,8 @@ //! [async-std]: https://crates.io/crates/async-std use futures_util::{future::BoxFuture, stream::Stream}; -use std::{future::Future, time::Duration}; +use std::{fmt::Debug, future::Future, time::Duration}; +use thiserror::Error; /// A runtime is an abstraction of an async runtime like [Tokio] or [async-std]. It allows /// OpenTelemetry to work with any current and hopefully future runtime implementation. @@ -59,6 +60,8 @@ } fn spawn(&self, future: BoxFuture<'static, ()>) { + #[allow(clippy::let_underscore_future)] + // we don't have to await on the returned future to execute let _ = tokio::spawn(future); } @@ -121,6 +124,7 @@ } fn spawn(&self, future: BoxFuture<'static, ()>) { + #[allow(clippy::let_underscore_future)] let _ = async_std::task::spawn(future); } @@ -128,3 +132,108 @@ Box::pin(async_std::task::sleep(duration)) } } + +/// `MessageRuntime` is an extension to [`Runtime`]. Currently, it provides a +/// channel that is used by the [log] and [span] batch processors. +/// +/// [log]: crate::logs::BatchLogProcessor +/// [span]: crate::trace::BatchSpanProcessor +pub trait RuntimeChannel: Runtime { + /// A future stream to receive batch messages from channels. + type Receiver: Stream + Send; + /// A batch messages sender that can be sent across threads safely. + type Sender: TrySend + Debug; + + /// Return the sender and receiver used to send batch messages. + fn batch_message_channel(&self, capacity: usize) -> (Self::Sender, Self::Receiver); +} + +/// Error returned by a [`TrySend`] implementation. +#[derive(Debug, Error)] +pub enum TrySendError { + /// Send failed due to the channel being full. + #[error("cannot send message to batch processor as the channel is full")] + ChannelFull, + /// Send failed due to the channel being closed. + #[error("cannot send message to batch processor as the channel is closed")] + ChannelClosed, + /// Any other send error that isnt covered above. + #[error(transparent)] + Other(#[from] Box), +} + +/// TrySend is an abstraction of `Sender` that is capable of sending messages through a reference. +pub trait TrySend: Sync + Send { + /// The message that will be sent. + type Message; + + /// Try to send a message batch to a worker thread. + /// + /// A failure can be due to either a closed receiver, or a depleted buffer. + fn try_send(&self, item: Self::Message) -> Result<(), TrySendError>; +} + +#[cfg(any(feature = "rt-tokio", feature = "rt-tokio-current-thread"))] +impl TrySend for tokio::sync::mpsc::Sender { + type Message = T; + + fn try_send(&self, item: Self::Message) -> Result<(), TrySendError> { + self.try_send(item).map_err(|err| match err { + tokio::sync::mpsc::error::TrySendError::Full(_) => TrySendError::ChannelFull, + tokio::sync::mpsc::error::TrySendError::Closed(_) => TrySendError::ChannelClosed, + }) + } +} + +#[cfg(feature = "rt-tokio")] +#[cfg_attr(docsrs, doc(cfg(feature = "rt-tokio")))] +impl RuntimeChannel for Tokio { + type Receiver = tokio_stream::wrappers::ReceiverStream; + type Sender = tokio::sync::mpsc::Sender; + + fn batch_message_channel(&self, capacity: usize) -> (Self::Sender, Self::Receiver) { + let (sender, receiver) = tokio::sync::mpsc::channel(capacity); + ( + sender, + tokio_stream::wrappers::ReceiverStream::new(receiver), + ) + } +} + +#[cfg(feature = "rt-tokio-current-thread")] +#[cfg_attr(docsrs, doc(cfg(feature = "rt-tokio-current-thread")))] +impl RuntimeChannel for TokioCurrentThread { + type Receiver = tokio_stream::wrappers::ReceiverStream; + type Sender = tokio::sync::mpsc::Sender; + + fn batch_message_channel(&self, capacity: usize) -> (Self::Sender, Self::Receiver) { + let (sender, receiver) = tokio::sync::mpsc::channel(capacity); + ( + sender, + tokio_stream::wrappers::ReceiverStream::new(receiver), + ) + } +} + +#[cfg(feature = "rt-async-std")] +impl TrySend for async_std::channel::Sender { + type Message = T; + + fn try_send(&self, item: Self::Message) -> Result<(), TrySendError> { + self.try_send(item).map_err(|err| match err { + async_std::channel::TrySendError::Full(_) => TrySendError::ChannelFull, + async_std::channel::TrySendError::Closed(_) => TrySendError::ChannelClosed, + }) + } +} + +#[cfg(feature = "rt-async-std")] +#[cfg_attr(docsrs, doc(cfg(feature = "rt-async-std")))] +impl RuntimeChannel for AsyncStd { + type Receiver = async_std::channel::Receiver; + type Sender = async_std::channel::Sender; + + fn batch_message_channel(&self, capacity: usize) -> (Self::Sender, Self::Receiver) { + async_std::channel::bounded(capacity) + } +} diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/testing/metric.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/testing/metric.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/testing/metric.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/testing/metric.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,38 +0,0 @@ -use std::sync::Arc; - -use opentelemetry_api::metrics::Result; - -use crate::{ - export::metrics::{AggregatorSelector, Checkpointer, LockedCheckpointer, Processor}, - metrics::{aggregators::Aggregator, sdk_api::Descriptor}, -}; - -#[derive(Debug)] -struct NoopAggregatorSelector; - -impl AggregatorSelector for NoopAggregatorSelector { - fn aggregator_for( - &self, - _descriptor: &Descriptor, - ) -> Option> { - None - } -} - -#[derive(Debug)] -pub struct NoopCheckpointer; - -impl Processor for NoopCheckpointer { - fn aggregator_selector(&self) -> &dyn AggregatorSelector { - &NoopAggregatorSelector - } -} - -impl Checkpointer for NoopCheckpointer { - fn checkpoint( - &self, - _f: &mut dyn FnMut(&mut dyn LockedCheckpointer) -> Result<()>, - ) -> Result<()> { - Ok(()) - } -} diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/testing/metrics/in_memory_exporter.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/testing/metrics/in_memory_exporter.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/testing/metrics/in_memory_exporter.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/testing/metrics/in_memory_exporter.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,309 @@ +use crate::metrics::data::{Histogram, Metric, ResourceMetrics, ScopeMetrics, Temporality}; +use crate::metrics::exporter::PushMetricsExporter; +use crate::metrics::reader::{ + AggregationSelector, DefaultAggregationSelector, DefaultTemporalitySelector, + TemporalitySelector, +}; +use crate::metrics::{data, Aggregation, InstrumentKind}; +use async_trait::async_trait; +use opentelemetry_api::metrics::MetricsError; +use opentelemetry_api::metrics::Result; +use std::collections::VecDeque; +use std::fmt; +use std::sync::{Arc, Mutex}; + +/// An in-memory metrics exporter that stores metrics data in memory. +/// +/// This exporter is useful for testing and debugging purposes. It stores +/// metric data in a `VecDeque`. Metrics can be retrieved +/// using the `get_finished_metrics` method. +/// +/// # Panics +/// +/// This exporter may panic +/// - if there's an issue with locking the `metrics` Mutex, such as if the Mutex is poisoned. +/// - the data point recorded is not one of [i64, u64, f64]. This shouldn't happen if used with OpenTelemetry API. +/// +/// # Example +/// +/// ``` +///# use opentelemetry_sdk::{metrics, runtime}; +///# use opentelemetry_api::{Context, KeyValue}; +///# use opentelemetry_api::metrics::MeterProvider; +///# use opentelemetry_sdk::testing::metrics::InMemoryMetricsExporter; +///# use opentelemetry_sdk::metrics::PeriodicReader; +/// +///# #[tokio::main] +///# async fn main() { +/// // Create an InMemoryMetricsExporter +/// let exporter = InMemoryMetricsExporter::default(); +/// +/// // Create a MeterProvider and register the exporter +/// let meter_provider = metrics::MeterProvider::builder() +/// .with_reader(PeriodicReader::builder(exporter.clone(), runtime::Tokio).build()) +/// .build(); +/// +/// // Create and record metrics using the MeterProvider +/// let meter = meter_provider.meter(std::borrow::Cow::Borrowed("example")); +/// let cx = Context::new(); +/// let counter = meter.u64_counter("my_counter").init(); +/// counter.add(1, &[KeyValue::new("key", "value")]); +/// +/// meter_provider.force_flush(&cx).unwrap(); +/// +/// // Retrieve the finished metrics from the exporter +/// let finished_metrics = exporter.get_finished_metrics().unwrap(); +/// +/// // Print the finished metrics +/// for resource_metrics in finished_metrics { +/// println!("{:?}", resource_metrics); +/// } +///# } +/// ``` +pub struct InMemoryMetricsExporter { + metrics: Arc>>, + aggregation_selector: Arc, + temporality_selector: Arc, +} + +impl Clone for InMemoryMetricsExporter { + fn clone(&self) -> Self { + InMemoryMetricsExporter { + metrics: self.metrics.clone(), + aggregation_selector: self.aggregation_selector.clone(), + temporality_selector: self.temporality_selector.clone(), + } + } +} + +impl fmt::Debug for InMemoryMetricsExporter { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_struct("InMemoryMetricsExporter").finish() + } +} + +impl Default for InMemoryMetricsExporter { + fn default() -> Self { + InMemoryMetricsExporterBuilder::new().build() + } +} + +/// Builder for [`InMemoryMetricsExporter`]. +/// # Example +/// +/// ``` +/// # use opentelemetry_sdk::testing::metrics::{InMemoryMetricsExporter, InMemoryMetricsExporterBuilder}; +/// +/// let exporter = InMemoryMetricsExporterBuilder::new().build(); +/// ``` +pub struct InMemoryMetricsExporterBuilder { + aggregation_selector: Option>, + temporality_selector: Option>, +} + +impl fmt::Debug for InMemoryMetricsExporterBuilder { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_struct("InMemoryMetricsExporterBuilder").finish() + } +} + +impl Default for InMemoryMetricsExporterBuilder { + fn default() -> Self { + Self::new() + } +} + +impl InMemoryMetricsExporterBuilder { + /// Creates a new instance of the `InMemoryMetricsExporterBuilder`. + pub fn new() -> Self { + Self { + aggregation_selector: None, + temporality_selector: None, + } + } + + /// Sets the aggregation selector for the exporter. + pub fn with_aggregation_selector(mut self, aggregation_selector: T) -> Self + where + T: AggregationSelector + Send + Sync + 'static, + { + self.aggregation_selector = Some(Arc::new(aggregation_selector)); + self + } + + /// Sets the temporality selector for the exporter. + pub fn with_temporality_selector(mut self, temporality_selector: T) -> Self + where + T: TemporalitySelector + Send + Sync + 'static, + { + self.temporality_selector = Some(Arc::new(temporality_selector)); + self + } + + /// Creates a new instance of the `InMemoryMetricsExporter`. + /// + pub fn build(self) -> InMemoryMetricsExporter { + InMemoryMetricsExporter { + metrics: Arc::new(Mutex::new(VecDeque::new())), + aggregation_selector: self + .aggregation_selector + .unwrap_or_else(|| Arc::new(DefaultAggregationSelector::default())), + temporality_selector: self + .temporality_selector + .unwrap_or_else(|| Arc::new(DefaultTemporalitySelector::default())), + } + } +} + +impl InMemoryMetricsExporter { + /// Returns the finished metrics as a vector of `ResourceMetrics`. + /// + /// # Errors + /// + /// Returns a `MetricsError` if the internal lock cannot be acquired. + /// + /// # Example + /// + /// ``` + /// # use opentelemetry_sdk::testing::metrics::InMemoryMetricsExporter; + /// + /// let exporter = InMemoryMetricsExporter::default(); + /// let finished_metrics = exporter.get_finished_metrics().unwrap(); + /// ``` + pub fn get_finished_metrics(&self) -> Result> { + self.metrics + .lock() + .map(|metrics_guard| metrics_guard.iter().map(Self::clone_metrics).collect()) + .map_err(MetricsError::from) + } + + /// Clears the internal storage of finished metrics. + /// + /// # Example + /// + /// ``` + /// # use opentelemetry_sdk::testing::metrics::InMemoryMetricsExporter; + /// + /// let exporter = InMemoryMetricsExporter::default(); + /// exporter.reset(); + /// ``` + pub fn reset(&self) { + let _ = self + .metrics + .lock() + .map(|mut metrics_guard| metrics_guard.clear()); + } + + fn clone_metrics(metric: &ResourceMetrics) -> ResourceMetrics { + ResourceMetrics { + resource: metric.resource.clone(), + scope_metrics: metric + .scope_metrics + .iter() + .map(|scope_metric| ScopeMetrics { + scope: scope_metric.scope.clone(), + metrics: scope_metric + .metrics + .iter() + .map(|metric| Metric { + name: metric.name.clone(), + description: metric.description.clone(), + unit: metric.unit.clone(), + // we don't expect any unknown data type here + data: Self::clone_data(metric.data.as_ref()).unwrap(), + }) + .collect(), + }) + .collect(), + } + } + + fn clone_data(data: &dyn data::Aggregation) -> Option> { + if let Some(hist) = data.as_any().downcast_ref::>() { + Some(Box::new(Histogram { + data_points: hist.data_points.clone(), + temporality: hist.temporality, + })) + } else if let Some(hist) = data.as_any().downcast_ref::>() { + Some(Box::new(Histogram { + data_points: hist.data_points.clone(), + temporality: hist.temporality, + })) + } else if let Some(hist) = data.as_any().downcast_ref::>() { + Some(Box::new(Histogram { + data_points: hist.data_points.clone(), + temporality: hist.temporality, + })) + } else if let Some(sum) = data.as_any().downcast_ref::>() { + Some(Box::new(data::Sum { + data_points: sum.data_points.clone(), + temporality: sum.temporality, + is_monotonic: sum.is_monotonic, + })) + } else if let Some(sum) = data.as_any().downcast_ref::>() { + Some(Box::new(data::Sum { + data_points: sum.data_points.clone(), + temporality: sum.temporality, + is_monotonic: sum.is_monotonic, + })) + } else if let Some(sum) = data.as_any().downcast_ref::>() { + Some(Box::new(data::Sum { + data_points: sum.data_points.clone(), + temporality: sum.temporality, + is_monotonic: sum.is_monotonic, + })) + } else if let Some(gauge) = data.as_any().downcast_ref::>() { + Some(Box::new(data::Gauge { + data_points: gauge.data_points.clone(), + })) + } else if let Some(gauge) = data.as_any().downcast_ref::>() { + Some(Box::new(data::Gauge { + data_points: gauge.data_points.clone(), + })) + } else if let Some(gauge) = data.as_any().downcast_ref::>() { + Some(Box::new(data::Gauge { + data_points: gauge.data_points.clone(), + })) + } else { + // unknown data type + None + } + } +} + +impl AggregationSelector for InMemoryMetricsExporter { + fn aggregation(&self, kind: InstrumentKind) -> Aggregation { + self.aggregation_selector.aggregation(kind) + } +} + +impl TemporalitySelector for InMemoryMetricsExporter { + fn temporality(&self, kind: InstrumentKind) -> Temporality { + self.temporality_selector.temporality(kind) + } +} + +#[async_trait] +impl PushMetricsExporter for InMemoryMetricsExporter { + async fn export(&self, metrics: &mut ResourceMetrics) -> Result<()> { + self.metrics + .lock() + .map(|mut metrics_guard| { + metrics_guard.push_back(InMemoryMetricsExporter::clone_metrics(metrics)) + }) + .map_err(MetricsError::from) + } + + async fn force_flush(&self) -> Result<()> { + Ok(()) // In this implementation, flush does nothing + } + + fn shutdown(&self) -> Result<()> { + self.metrics + .lock() + .map(|mut metrics_guard| metrics_guard.clear()) + .map_err(MetricsError::from)?; + + Ok(()) + } +} diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/testing/metrics/mod.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/testing/metrics/mod.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/testing/metrics/mod.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/testing/metrics/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,3 @@ +pub use in_memory_exporter::{InMemoryMetricsExporter, InMemoryMetricsExporterBuilder}; + +mod in_memory_exporter; diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/testing/mod.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/testing/mod.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/testing/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/testing/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,2 +1,5 @@ -pub mod metric; +#[cfg(all(feature = "testing", feature = "trace"))] pub mod trace; + +#[cfg(all(feature = "testing", feature = "metrics"))] +pub mod metrics; diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/testing/trace.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/testing/trace.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/testing/trace.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/testing/trace.rs 2023-10-30 19:40:00.000000000 +0000 @@ -61,7 +61,7 @@ } fn shutdown(&mut self) { - self.tx_shutdown.send(()).unwrap(); + let _ = self.tx_shutdown.send(()); // ignore error } } @@ -131,6 +131,7 @@ } } +#[cfg(any(feature = "rt-tokio", feature = "rt-tokio-current-thread"))] impl From> for TestExportError { fn from(err: tokio::sync::mpsc::error::SendError) -> Self { TestExportError(err.to_string()) diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/trace/config.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/trace/config.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/trace/config.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/trace/config.rs 2023-10-30 19:40:00.000000000 +0000 @@ -91,7 +91,7 @@ fn default() -> Self { let mut config = Config { sampler: Box::new(Sampler::ParentBased(Box::new(Sampler::AlwaysOn))), - id_generator: Box::new(RandomIdGenerator::default()), + id_generator: Box::::default(), span_limits: SpanLimits::default(), resource: Cow::Owned(Resource::default()), }; diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/trace/evicted_queue.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/trace/evicted_queue.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/trace/evicted_queue.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/trace/evicted_queue.rs 2023-10-30 19:40:00.000000000 +0000 @@ -26,11 +26,12 @@ /// recording dropped count if over capacity. pub(crate) fn push_back(&mut self, value: T) { let queue = self.queue.get_or_insert_with(Default::default); - if queue.len() as u32 == self.max_len { + queue.push_back(value); + + if queue.len() as u32 > self.max_len { queue.pop_front(); self.dropped_count += 1; } - queue.push_back(value); } /// Moves all the elements of other into self, leaving other empty. @@ -114,6 +115,21 @@ assert_eq!(queue.dropped_count, 1); assert_eq!(queue.len(), capacity as usize); + assert_eq!( + queue.queue.unwrap(), + (1..=capacity).collect::>() + ); + } + + #[test] + fn zero_capacity_test() { + let capacity = 0; + let mut queue = EvictedQueue::new(capacity); + + queue.push_back(1); + + assert_eq!(queue.dropped_count, 1); + assert_eq!(queue.len(), capacity as usize); assert_eq!( queue.queue.unwrap(), (1..=capacity).collect::>() diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/trace/id_generator/mod.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/trace/id_generator/mod.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/trace/id_generator/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/trace/id_generator/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -25,11 +25,11 @@ impl IdGenerator for RandomIdGenerator { fn new_trace_id(&self) -> TraceId { - CURRENT_RNG.with(|rng| TraceId::from(rng.borrow_mut().gen::<[u8; 16]>())) + CURRENT_RNG.with(|rng| TraceId::from(rng.borrow_mut().gen::())) } fn new_span_id(&self) -> SpanId { - CURRENT_RNG.with(|rng| SpanId::from(rng.borrow_mut().gen::<[u8; 8]>())) + CURRENT_RNG.with(|rng| SpanId::from(rng.borrow_mut().gen::())) } } diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/trace/mod.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/trace/mod.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/trace/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/trace/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -11,7 +11,6 @@ mod evicted_queue; mod id_generator; mod provider; -mod runtime; mod sampler; mod span; mod span_limit; @@ -23,7 +22,6 @@ pub use evicted_queue::EvictedQueue; pub use id_generator::{aws::XrayIdGenerator, IdGenerator, RandomIdGenerator}; pub use provider::{Builder, TracerProvider}; -pub use runtime::{TraceRuntime, TrySend}; pub use sampler::{Sampler, ShouldSample}; pub use span::Span; pub use span_limit::SpanLimits; @@ -34,4 +32,7 @@ pub use tracer::Tracer; #[cfg(feature = "jaeger_remote_sampler")] -pub use sampler::JaegerRemoteSamplerBuilder; +pub use sampler::{JaegerRemoteSampler, JaegerRemoteSamplerBuilder}; + +#[cfg(test)] +mod runtime_tests; diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/trace/provider.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/trace/provider.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/trace/provider.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/trace/provider.rs 2023-10-30 19:40:00.000000000 +0000 @@ -8,7 +8,8 @@ //! propagators) are provided by the [`TracerProvider`]. [`Tracer`] instances do //! not duplicate this data to avoid that different [`Tracer`] instances //! of the [`TracerProvider`] have different versions of these data. -use crate::trace::{runtime::TraceRuntime, BatchSpanProcessor, SimpleSpanProcessor, Tracer}; +use crate::runtime::RuntimeChannel; +use crate::trace::{BatchMessage, BatchSpanProcessor, SimpleSpanProcessor, Tracer}; use crate::{export::trace::SpanExporter, trace::SpanProcessor}; use crate::{InstrumentationLibrary, Resource}; use once_cell::sync::OnceCell; @@ -123,23 +124,28 @@ fn versioned_tracer( &self, name: impl Into>, - version: Option<&'static str>, - schema_url: Option<&'static str>, + version: Option>>, + schema_url: Option>>, + attributes: Option>, ) -> Self::Tracer { - let name = name.into(); // Use default value if name is invalid empty string + let name = name.into(); let component_name = if name.is_empty() { Cow::Borrowed(DEFAULT_COMPONENT_NAME) } else { name }; - let instrumentation_lib = InstrumentationLibrary::new( + + self.library_tracer(Arc::new(InstrumentationLibrary::new( component_name, - version.map(Into::into), - schema_url.map(Into::into), - ); + version, + schema_url, + attributes, + ))) + } - Tracer::new(instrumentation_lib, Arc::downgrade(&self.inner)) + fn library_tracer(&self, library: Arc) -> Self::Tracer { + Tracer::new(library, Arc::downgrade(&self.inner)) } } @@ -160,7 +166,7 @@ } /// The [`SpanExporter`] setup using a default [`BatchSpanProcessor`] that this provider should use. - pub fn with_batch_exporter( + pub fn with_batch_exporter>( self, exporter: T, runtime: R, diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/trace/runtime.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/trace/runtime.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/trace/runtime.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/trace/runtime.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,285 +0,0 @@ -//! # Trace Runtime -//! Trace runtime is an extension to [`Runtime`]. Currently it provides a channel that used -//! by [`BatchSpanProcessor`]. -//! -//! [`BatchSpanProcessor`]: crate::trace::BatchSpanProcessor -//! [`Runtime`]: crate::runtime::Runtime -#[cfg(feature = "rt-async-std")] -use crate::runtime::AsyncStd; -use crate::runtime::Runtime; -#[cfg(feature = "rt-tokio")] -use crate::runtime::Tokio; -#[cfg(feature = "rt-tokio-current-thread")] -use crate::runtime::TokioCurrentThread; -use crate::trace::BatchMessage; -use futures_util::stream::Stream; -use opentelemetry_api::trace::TraceError; -use std::fmt::Debug; - -#[cfg(any( - feature = "rt-tokio", - feature = "rt-tokio-current-thread", - feature = "rt-async-std" -))] -const CHANNEL_FULL_ERROR: &str = - "cannot send span to the batch span processor because the channel is full"; -#[cfg(any( - feature = "rt-tokio", - feature = "rt-tokio-current-thread", - feature = "rt-async-std" -))] -const CHANNEL_CLOSED_ERROR: &str = - "cannot send span to the batch span processor because the channel is closed"; - -/// Trace runtime is an extension to [`Runtime`]. Currently it provides a channel that used -/// by [`BatchSpanProcessor`]. -/// -/// [`BatchSpanProcessor`]: crate::trace::BatchSpanProcessor -/// [`Runtime`]: crate::runtime::Runtime -pub trait TraceRuntime: Runtime { - /// A future stream to receive the batch messages from channels. - type Receiver: Stream + Send; - - /// A batch messages sender that could be sent across thread safely. - type Sender: TrySend + Debug; - - /// Return the sender and receiver used to send batch message between tasks. - fn batch_message_channel(&self, capacity: usize) -> (Self::Sender, Self::Receiver); -} - -/// TrySend is an abstraction of sender that is capable to send BatchMessage with reference. -pub trait TrySend: Sync + Send { - /// Try to send one batch message to worker thread. - /// - /// It can fail because either the receiver has closed or the buffer is full. - fn try_send(&self, item: BatchMessage) -> Result<(), TraceError>; -} - -#[cfg(any(feature = "rt-tokio", feature = "rt-tokio-current-thread"))] -impl TrySend for tokio::sync::mpsc::Sender { - fn try_send(&self, item: BatchMessage) -> Result<(), TraceError> { - self.try_send(item).map_err(|err| match err { - tokio::sync::mpsc::error::TrySendError::Full(_) => TraceError::from(CHANNEL_FULL_ERROR), - tokio::sync::mpsc::error::TrySendError::Closed(_) => { - TraceError::from(CHANNEL_CLOSED_ERROR) - } - }) - } -} - -#[cfg(feature = "rt-tokio")] -#[cfg_attr(docsrs, doc(cfg(feature = "rt-tokio")))] -impl TraceRuntime for Tokio { - type Receiver = tokio_stream::wrappers::ReceiverStream; - type Sender = tokio::sync::mpsc::Sender; - - fn batch_message_channel(&self, capacity: usize) -> (Self::Sender, Self::Receiver) { - let (sender, receiver) = tokio::sync::mpsc::channel(capacity); - ( - sender, - tokio_stream::wrappers::ReceiverStream::new(receiver), - ) - } -} - -#[cfg(feature = "rt-tokio-current-thread")] -#[cfg_attr(docsrs, doc(cfg(feature = "rt-tokio-current-thread")))] -impl TraceRuntime for TokioCurrentThread { - type Receiver = tokio_stream::wrappers::ReceiverStream; - type Sender = tokio::sync::mpsc::Sender; - - fn batch_message_channel(&self, capacity: usize) -> (Self::Sender, Self::Receiver) { - let (sender, receiver) = tokio::sync::mpsc::channel(capacity); - ( - sender, - tokio_stream::wrappers::ReceiverStream::new(receiver), - ) - } -} - -#[cfg(feature = "rt-async-std")] -impl TrySend for async_std::channel::Sender { - fn try_send(&self, item: BatchMessage) -> Result<(), TraceError> { - self.try_send(item).map_err(|err| match err { - async_std::channel::TrySendError::Full(_) => TraceError::from(CHANNEL_FULL_ERROR), - async_std::channel::TrySendError::Closed(_) => TraceError::from(CHANNEL_CLOSED_ERROR), - }) - } -} - -#[cfg(feature = "rt-async-std")] -#[cfg_attr(docsrs, doc(cfg(feature = "rt-async-std")))] -impl TraceRuntime for AsyncStd { - type Receiver = async_std::channel::Receiver; - type Sender = async_std::channel::Sender; - - fn batch_message_channel(&self, capacity: usize) -> (Self::Sender, Self::Receiver) { - async_std::channel::bounded(capacity) - } -} - -#[cfg(test)] -// Note that all tests here should be marked as ignore so that it won't be picked up by default We -// need to run those tests one by one as the GlobalTracerProvider is a shared object between -// threads Use cargo test -- --ignored --test-threads=1 to run those tests. -mod tests { - #[cfg(any(feature = "rt-tokio", feature = "rt-tokio-current-thread"))] - use crate::runtime; - #[cfg(any(feature = "rt-tokio", feature = "rt-tokio-current-thread"))] - use crate::trace::TraceRuntime; - #[cfg(any(feature = "rt-tokio", feature = "rt-tokio-current-thread"))] - use opentelemetry_api::global::*; - #[cfg(any(feature = "rt-tokio", feature = "rt-tokio-current-thread"))] - use opentelemetry_api::trace::Tracer; - use std::sync::Arc; - use std::{fmt::Debug, io::Write, sync::Mutex}; - - #[derive(Debug)] - struct AssertWriter { - buf: Arc>>, - } - - #[cfg(any(feature = "rt-tokio", feature = "rt-tokio-current-thread"))] - impl AssertWriter { - fn new() -> AssertWriter { - AssertWriter { - buf: Arc::new(Mutex::new(Vec::new())), - } - } - - fn len(&self) -> usize { - self.buf - .lock() - .expect("cannot acquire the lock of assert writer") - .len() - } - } - - impl Write for AssertWriter { - fn write(&mut self, buf: &[u8]) -> std::io::Result { - let mut buffer = self - .buf - .lock() - .expect("cannot acquire the lock of assert writer"); - buffer.write(buf) - } - - fn flush(&mut self) -> std::io::Result<()> { - let mut buffer = self - .buf - .lock() - .expect("cannot acquire the lock of assert writer"); - buffer.flush() - } - } - - impl Clone for AssertWriter { - fn clone(&self) -> Self { - AssertWriter { - buf: self.buf.clone(), - } - } - } - - #[cfg(any(feature = "rt-tokio", feature = "rt-tokio-current-thread"))] - fn build_batch_tracer_provider( - assert_writer: AssertWriter, - runtime: R, - ) -> crate::trace::TracerProvider { - use crate::trace::TracerProvider; - let exporter = crate::export::trace::stdout::Exporter::new(assert_writer, true); - TracerProvider::builder() - .with_batch_exporter(exporter, runtime) - .build() - } - - #[cfg(any(feature = "rt-tokio", feature = "rt-tokio-current-thread"))] - fn build_simple_tracer_provider(assert_writer: AssertWriter) -> crate::trace::TracerProvider { - use crate::trace::TracerProvider; - let exporter = crate::export::trace::stdout::Exporter::new(assert_writer, true); - TracerProvider::builder() - .with_simple_exporter(exporter) - .build() - } - - #[cfg(any(feature = "rt-tokio", feature = "rt-tokio-current-thread"))] - async fn test_set_provider_in_tokio(runtime: R) -> AssertWriter { - let buffer = AssertWriter::new(); - let _ = set_tracer_provider(build_batch_tracer_provider(buffer.clone(), runtime)); - let tracer = tracer("opentelemetery"); - - tracer.in_span("test", |_cx| {}); - - buffer - } - - // When using `tokio::spawn` to spawn the worker task in batch processor - // - // multiple -> no shut down -> not export - // multiple -> shut down -> export - // single -> no shutdown -> not export - // single -> shutdown -> hang forever - - // When using |fut| tokio::task::spawn_blocking(|| futures::executor::block_on(fut)) - // to spawn the worker task in batch processor - // - // multiple -> no shutdown -> hang forever - // multiple -> shut down -> export - // single -> shut down -> export - // single -> no shutdown -> hang forever - - // Test if the multiple thread tokio runtime could exit successfully when not force flushing spans - #[tokio::test(flavor = "multi_thread", worker_threads = 2)] - #[ignore = "requires --test-threads=1"] - #[cfg(feature = "rt-tokio")] - async fn test_set_provider_multiple_thread_tokio() { - let assert_writer = test_set_provider_in_tokio(runtime::Tokio).await; - assert_eq!(assert_writer.len(), 0); - } - - // Test if the multiple thread tokio runtime could exit successfully when force flushing spans - #[tokio::test(flavor = "multi_thread", worker_threads = 2)] - #[ignore = "requires --test-threads=1"] - #[cfg(feature = "rt-tokio")] - async fn test_set_provider_multiple_thread_tokio_shutdown() { - let assert_writer = test_set_provider_in_tokio(runtime::Tokio).await; - shutdown_tracer_provider(); - assert!(assert_writer.len() > 0); - } - - // Test use simple processor in single thread tokio runtime. - // Expected to see the spans being exported to buffer - #[tokio::test] - #[ignore = "requires --test-threads=1"] - #[cfg(feature = "rt-tokio")] - async fn test_set_provider_single_thread_tokio_with_simple_processor() { - let assert_writer = AssertWriter::new(); - let _ = set_tracer_provider(build_simple_tracer_provider(assert_writer.clone())); - let tracer = tracer("opentelemetry"); - - tracer.in_span("test", |_cx| {}); - - shutdown_tracer_provider(); - - assert!(assert_writer.len() > 0); - } - - // Test if the single thread tokio runtime could exit successfully when not force flushing spans - #[tokio::test] - #[ignore = "requires --test-threads=1"] - #[cfg(feature = "rt-tokio-current-thread")] - async fn test_set_provider_single_thread_tokio() { - let assert_writer = test_set_provider_in_tokio(runtime::TokioCurrentThread).await; - assert_eq!(assert_writer.len(), 0) - } - - // Test if the single thread tokio runtime could exit successfully when force flushing spans. - #[tokio::test] - #[ignore = "requires --test-threads=1"] - #[cfg(feature = "rt-tokio-current-thread")] - async fn test_set_provider_single_thread_tokio_shutdown() { - let assert_writer = test_set_provider_in_tokio(runtime::TokioCurrentThread).await; - shutdown_tracer_provider(); - assert!(assert_writer.len() > 0); - } -} diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/trace/runtime_tests.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/trace/runtime_tests.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/trace/runtime_tests.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/trace/runtime_tests.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,146 @@ +// Note that all tests here should be marked as ignore so that it won't be picked up by default We +// need to run those tests one by one as the GlobalTracerProvider is a shared object between +// threads Use cargo test -- --ignored --test-threads=1 to run those tests. +use crate::export::trace::{ExportResult, SpanExporter}; +#[cfg(any(feature = "rt-tokio", feature = "rt-tokio-current-thread"))] +use crate::runtime; +#[cfg(any(feature = "rt-tokio", feature = "rt-tokio-current-thread"))] +use crate::runtime::RuntimeChannel; +#[cfg(any(feature = "rt-tokio", feature = "rt-tokio-current-thread"))] +use crate::trace::BatchMessage; +use futures_util::future::BoxFuture; +#[cfg(any(feature = "rt-tokio", feature = "rt-tokio-current-thread"))] +use opentelemetry_api::global::*; +#[cfg(any(feature = "rt-tokio", feature = "rt-tokio-current-thread"))] +use opentelemetry_api::trace::Tracer; +use std::fmt::Debug; +use std::sync::atomic::{AtomicUsize, Ordering}; +use std::sync::Arc; + +#[derive(Debug)] +struct SpanCountExporter { + span_count: Arc, +} + +impl SpanExporter for SpanCountExporter { + fn export( + &mut self, + batch: Vec, + ) -> BoxFuture<'static, ExportResult> { + self.span_count.fetch_add(batch.len(), Ordering::SeqCst); + Box::pin(async { Ok(()) }) + } +} + +#[cfg(any(feature = "rt-tokio", feature = "rt-tokio-current-thread"))] +impl SpanCountExporter { + fn new() -> SpanCountExporter { + SpanCountExporter { + span_count: Arc::new(AtomicUsize::new(0)), + } + } +} + +#[cfg(any(feature = "rt-tokio", feature = "rt-tokio-current-thread"))] +fn build_batch_tracer_provider>( + exporter: SpanCountExporter, + runtime: R, +) -> crate::trace::TracerProvider { + use crate::trace::TracerProvider; + TracerProvider::builder() + .with_batch_exporter(exporter, runtime) + .build() +} + +#[cfg(any(feature = "rt-tokio", feature = "rt-tokio-current-thread"))] +fn build_simple_tracer_provider(exporter: SpanCountExporter) -> crate::trace::TracerProvider { + use crate::trace::TracerProvider; + TracerProvider::builder() + .with_simple_exporter(exporter) + .build() +} + +#[cfg(any(feature = "rt-tokio", feature = "rt-tokio-current-thread"))] +async fn test_set_provider_in_tokio>( + runtime: R, +) -> Arc { + let exporter = SpanCountExporter::new(); + let span_count = exporter.span_count.clone(); + let _ = set_tracer_provider(build_batch_tracer_provider(exporter, runtime)); + let tracer = tracer("opentelemetery"); + + tracer.in_span("test", |_cx| {}); + + span_count +} + +// When using `tokio::spawn` to spawn the worker task in batch processor +// +// multiple -> no shut down -> not export +// multiple -> shut down -> export +// single -> no shutdown -> not export +// single -> shutdown -> hang forever + +// When using |fut| tokio::task::spawn_blocking(|| futures::executor::block_on(fut)) +// to spawn the worker task in batch processor +// +// multiple -> no shutdown -> hang forever +// multiple -> shut down -> export +// single -> shut down -> export +// single -> no shutdown -> hang forever + +// Test if the multiple thread tokio runtime could exit successfully when not force flushing spans +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] +#[ignore = "requires --test-threads=1"] +#[cfg(feature = "rt-tokio")] +async fn test_set_provider_multiple_thread_tokio() { + let span_count = test_set_provider_in_tokio(runtime::Tokio).await; + assert_eq!(span_count.load(Ordering::SeqCst), 0); +} + +// Test if the multiple thread tokio runtime could exit successfully when force flushing spans +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] +#[ignore = "requires --test-threads=1"] +#[cfg(feature = "rt-tokio")] +async fn test_set_provider_multiple_thread_tokio_shutdown() { + let span_count = test_set_provider_in_tokio(runtime::Tokio).await; + shutdown_tracer_provider(); + assert!(span_count.load(Ordering::SeqCst) > 0); +} + +// Test use simple processor in single thread tokio runtime. +// Expected to see the spans being exported to buffer +#[tokio::test] +#[ignore = "requires --test-threads=1"] +#[cfg(feature = "rt-tokio")] +async fn test_set_provider_single_thread_tokio_with_simple_processor() { + let exporter = SpanCountExporter::new(); + let span_count = exporter.span_count.clone(); + let _ = set_tracer_provider(build_simple_tracer_provider(exporter)); + let tracer = tracer("opentelemetry"); + + tracer.in_span("test", |_cx| {}); + + shutdown_tracer_provider(); + + assert!(span_count.load(Ordering::SeqCst) > 0); +} + +// Test if the single thread tokio runtime could exit successfully when not force flushing spans +#[tokio::test] +#[ignore = "requires --test-threads=1"] +#[cfg(feature = "rt-tokio-current-thread")] +async fn test_set_provider_single_thread_tokio() { + let span_count = test_set_provider_in_tokio(runtime::TokioCurrentThread).await; + assert_eq!(span_count.load(Ordering::SeqCst), 0) +} + +// Test if the single thread tokio runtime could exit successfully when force flushing spans. +#[tokio::test] +#[ignore = "requires --test-threads=1"] +#[cfg(feature = "rt-tokio-current-thread")] +async fn test_set_provider_single_thread_tokio_shutdown() { + let span_count = test_set_provider_in_tokio(runtime::TokioCurrentThread).await; + shutdown_tracer_provider(); + assert!(span_count.load(Ordering::SeqCst) > 0) +} diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/trace/sampler/jaeger_remote/mod.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/trace/sampler/jaeger_remote/mod.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/trace/sampler/jaeger_remote/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/trace/sampler/jaeger_remote/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -3,8 +3,7 @@ mod sampler; mod sampling_strategy; -pub(crate) use sampler::JaegerRemoteSampler; -pub use sampler::JaegerRemoteSamplerBuilder; +pub use sampler::{JaegerRemoteSampler, JaegerRemoteSamplerBuilder}; #[cfg(test)] mod tests {} diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/trace/sampler/jaeger_remote/sampler.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/trace/sampler/jaeger_remote/sampler.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/trace/sampler/jaeger_remote/sampler.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/trace/sampler/jaeger_remote/sampler.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,10 +1,11 @@ +use crate::runtime::RuntimeChannel; use crate::trace::sampler::jaeger_remote::remote::SamplingStrategyResponse; use crate::trace::sampler::jaeger_remote::sampling_strategy::Inner; -use crate::trace::{Sampler, ShouldSample, TraceRuntime}; +use crate::trace::{BatchMessage, Sampler, ShouldSample}; use futures_util::{stream, StreamExt as _}; use http::Uri; -use opentelemetry_api::trace::{Link, OrderMap, SamplingResult, SpanKind, TraceError, TraceId}; -use opentelemetry_api::{global, Context, InstrumentationLibrary, Key, Value}; +use opentelemetry_api::trace::{Link, SamplingResult, SpanKind, TraceError, TraceId}; +use opentelemetry_api::{global, Context, Key, OrderMap, Value}; use opentelemetry_http::HttpClient; use std::str::FromStr; use std::sync::Arc; @@ -12,12 +13,12 @@ const DEFAULT_REMOTE_SAMPLER_ENDPOINT: &str = "http://localhost:5778/sampling"; -/// builder of JaegerRemoteSampler. +/// Builder for [`JaegerRemoteSampler`]. /// See [Sampler::jaeger_remote] for details. #[derive(Debug)] pub struct JaegerRemoteSamplerBuilder where - R: TraceRuntime, + R: RuntimeChannel, C: HttpClient + 'static, S: ShouldSample + 'static, { @@ -34,7 +35,7 @@ where C: HttpClient + 'static, S: ShouldSample + 'static, - R: TraceRuntime, + R: RuntimeChannel, { pub(crate) fn new( runtime: R, @@ -72,7 +73,7 @@ /// /// By default it's `http://localhost:5778/sampling`. /// - /// If the service name is provided as part of the + /// If service name is provided as part of the endpoint, it will be ignored. pub fn with_endpoint>(self, endpoint: Str) -> Self { Self { endpoint: endpoint.into(), @@ -82,6 +83,8 @@ /// The size of the leaky bucket. /// + /// By default the size is 100. + /// /// It's used when sampling strategy is rate limiting. pub fn with_leaky_bucket_size(self, size: f64) -> Self { Self { @@ -90,9 +93,12 @@ } } - /// Build a jaeger remote sampler. + /// Build a [JaegerRemoteSampler] using provided configuration. + /// + /// Return errors if: /// - /// Return errors when the endpoint provided is invalid(e.g, service name is empty) + /// - the endpoint provided is empty. + /// - the service name provided is empty. pub fn build(self) -> Result { let endpoint = Self::get_endpoint(&self.endpoint, &self.service_name) .map_err(|err_str| TraceError::Other(err_str.into()))?; @@ -113,6 +119,7 @@ } let mut endpoint = url::Url::parse(endpoint) .unwrap_or_else(|_| url::Url::parse(DEFAULT_REMOTE_SAMPLER_ENDPOINT).unwrap()); + endpoint .query_pairs_mut() .append_pair("service", service_name); @@ -123,6 +130,13 @@ /// Sampler that fetches the sampling configuration from remotes. /// +/// It offers the following sampling strategies: +/// - **Probabilistic**, fetch a probability between [0.0, 1.0] from remotes and use it to sample traces. If the probability is 0.0, it will never sample traces. If the probability is 1.0, it will always sample traces. +/// - **Rate limiting**, ses a leaky bucket rate limiter to ensure that traces are sampled with a certain constant rate. +/// - **Per Operations**, instead of sampling all traces, it samples traces based on the span name. Only probabilistic sampling is supported at the moment. +/// +/// User can build a [`JaegerRemoteSampler`] by getting a [`JaegerRemoteSamplerBuilder`] from [`Sampler::jaeger_remote`]. +/// /// Note that the backend doesn't need to be Jaeger so long as it supports jaeger remote sampling /// protocol. #[derive(Clone, Debug)] @@ -141,7 +155,7 @@ leaky_bucket_size: f64, ) -> Self where - R: TraceRuntime, + R: RuntimeChannel, C: HttpClient + 'static, S: ShouldSample + 'static, { @@ -171,7 +185,7 @@ shutdown: futures_channel::mpsc::Receiver<()>, endpoint: Uri, ) where - R: TraceRuntime, + R: RuntimeChannel, C: HttpClient + 'static, { // todo: review if we need 'static here @@ -239,7 +253,6 @@ span_kind: &SpanKind, attributes: &OrderMap, links: &[Link], - instrumentation_library: &InstrumentationLibrary, ) -> SamplingResult { self.inner .should_sample(parent_context, trace_id, name) @@ -251,8 +264,35 @@ span_kind, attributes, links, - instrumentation_library, ) }) } } + +#[cfg(test)] +mod tests { + use crate::trace::sampler::jaeger_remote::remote::SamplingStrategyType; + use std::fmt::{Debug, Formatter}; + + impl Debug for SamplingStrategyType { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + match &self { + SamplingStrategyType::Probabilistic => f.write_str("Probabilistic"), + SamplingStrategyType::RateLimiting => f.write_str("RateLimiting"), + } + } + } + + #[test] + fn deserialize_sampling_strategy_response() { + let json = r#"{ + "strategyType": "PROBABILISTIC", + "probabilisticSampling": { + "samplingRate": 0.5 + } + }"#; + let resp: super::SamplingStrategyResponse = serde_json::from_str(json).unwrap(); + assert_eq!(resp.strategy_type, SamplingStrategyType::Probabilistic); + assert_eq!(resp.probabilistic_sampling.unwrap().sampling_rate, 0.5); + } +} diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/trace/sampler/jaeger_remote/sampling_strategy.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/trace/sampler/jaeger_remote/sampling_strategy.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/trace/sampler/jaeger_remote/sampling_strategy.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/trace/sampler/jaeger_remote/sampling_strategy.rs 2023-10-30 19:40:00.000000000 +0000 @@ -196,11 +196,11 @@ impl PerOperationStrategies { pub(crate) fn update(&mut self, remote_strategies: PerOperationSamplingStrategies) { - self.default_prob = remote_strategies.default_sampling_probability as f64; + self.default_prob = remote_strategies.default_sampling_probability; self.default_lower_bound_traces_per_second = - remote_strategies.default_lower_bound_traces_per_second as f64; + remote_strategies.default_lower_bound_traces_per_second; self.default_upper_bound_traces_per_second = - remote_strategies.default_upper_bound_traces_per_second as f64; + remote_strategies.default_upper_bound_traces_per_second; self.operation_prob = remote_strategies .per_operation_strategies diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/trace/sampler.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/trace/sampler.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/trace/sampler.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/trace/sampler.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,10 +1,8 @@ -use crate::InstrumentationLibrary; -use opentelemetry_api::trace::OrderMap; use opentelemetry_api::{ trace::{ Link, SamplingDecision, SamplingResult, SpanKind, TraceContextExt, TraceId, TraceState, }, - Context, Key, Value, + Context, Key, OrderMap, Value, }; use std::convert::TryInto; @@ -12,9 +10,7 @@ mod jaeger_remote; #[cfg(feature = "jaeger_remote_sampler")] -use jaeger_remote::JaegerRemoteSampler; -#[cfg(feature = "jaeger_remote_sampler")] -pub use jaeger_remote::JaegerRemoteSamplerBuilder; +pub use jaeger_remote::{JaegerRemoteSampler, JaegerRemoteSamplerBuilder}; #[cfg(feature = "jaeger_remote_sampler")] use opentelemetry_http::HttpClient; @@ -51,7 +47,7 @@ /// and [`SpanExporter`]s will receive spans with the `Sampled` flag set for /// processing. /// -/// The flag combination `Sampled == false` and `is_recording` == true` means +/// The flag combination `Sampled == false` and `is_recording == true` means /// that the current `Span` does record information, but most likely the child /// `Span` will not. /// @@ -84,7 +80,6 @@ span_kind: &SpanKind, attributes: &OrderMap, links: &[Link], - instrumentation_library: &InstrumentationLibrary, ) -> SamplingResult; } @@ -142,13 +137,13 @@ } impl Sampler { - /// Create a jaeger remote sampler. + /// Create a jaeger remote sampler builder. /// - /// user needs to provide - /// - a `runtime` to run the http client - /// - a http client to query the sampling endpoint - /// - a default sampler to make sampling decision when the remote is unavailable or before the SDK receive the first response, - /// - the service name. This is a required parameter to query the sampling endpoint. + /// ### Arguments + /// * `runtime` - A runtime to run the HTTP client. + /// * `http_client` - An HTTP client to query the sampling endpoint. + /// * `default_sampler` - A default sampler to make a sampling decision when the remote is unavailable or before the SDK receives the first response from remote. + /// * `service_name` - The name of the service. This is a required parameter to query the sampling endpoint. /// /// See [here](https://github.com/open-telemetry/opentelemetry-rust/blob/main/examples/jaeger-remote-sampler/src/main.rs) for an example. #[cfg(feature = "jaeger_remote_sampler")] @@ -161,7 +156,7 @@ where C: HttpClient + 'static, Sampler: ShouldSample, - R: crate::trace::TraceRuntime, + R: crate::runtime::RuntimeChannel, Svc: Into, { JaegerRemoteSamplerBuilder::new(runtime, http_client, default_sampler, service_name) @@ -177,7 +172,6 @@ span_kind: &SpanKind, attributes: &OrderMap, links: &[Link], - instrumentation_library: &InstrumentationLibrary, ) -> SamplingResult { let decision = match self { // Always sample the trace @@ -185,19 +179,21 @@ // Never sample the trace Sampler::AlwaysOff => SamplingDecision::Drop, // The parent decision if sampled; otherwise the decision of delegate_sampler - Sampler::ParentBased(delegate_sampler) => { - parent_context.filter(|cx| cx.has_active_span()).map_or( - delegate_sampler - .should_sample( - parent_context, - trace_id, - name, - span_kind, - attributes, - links, - instrumentation_library, - ) - .decision, + Sampler::ParentBased(delegate_sampler) => parent_context + .filter(|cx| cx.has_active_span()) + .map_or_else( + || { + delegate_sampler + .should_sample( + parent_context, + trace_id, + name, + span_kind, + attributes, + links, + ) + .decision + }, |ctx| { let span = ctx.span(); let parent_span_context = span.span_context(); @@ -207,22 +203,13 @@ SamplingDecision::Drop } }, - ) - } + ), // Probabilistically sample the trace. Sampler::TraceIdRatioBased(prob) => sample_based_on_probability(prob, trace_id), #[cfg(feature = "jaeger_remote_sampler")] Sampler::JaegerRemote(remote_sampler) => { remote_sampler - .should_sample( - parent_context, - trace_id, - name, - span_kind, - attributes, - links, - instrumentation_library, - ) + .should_sample(parent_context, trace_id, name, span_kind, attributes, links) .decision } }; @@ -339,7 +326,7 @@ None }; - let trace_id = TraceId::from(rng.gen::<[u8; 16]>()); + let trace_id = TraceId::from(rng.gen::()); if sampler .should_sample( parent_context.as_ref(), @@ -348,7 +335,6 @@ &SpanKind::Internal, &Default::default(), &[], - &InstrumentationLibrary::default(), ) .decision == SamplingDecision::RecordAndSample @@ -381,10 +367,10 @@ #[test] fn clone_a_parent_sampler() { let sampler = Sampler::ParentBased(Box::new(Sampler::AlwaysOn)); + #[allow(clippy::redundant_clone)] let cloned_sampler = sampler.clone(); let cx = Context::current_with_value("some_value"); - let instrumentation_library = InstrumentationLibrary::default(); let result = sampler.should_sample( Some(&cx), @@ -393,7 +379,6 @@ &SpanKind::Internal, &Default::default(), &[], - &instrumentation_library, ); let cloned_result = cloned_sampler.should_sample( @@ -403,27 +388,59 @@ &SpanKind::Internal, &Default::default(), &[], - &instrumentation_library, ); assert_eq!(result, cloned_result); } #[test] - fn filter_parent_sampler_for_active_spans() { - let sampler = Sampler::ParentBased(Box::new(Sampler::AlwaysOn)); - let cx = Context::current_with_value("some_value"); - let instrumentation_library = InstrumentationLibrary::default(); - let result = sampler.should_sample( - Some(&cx), - TraceId::from_u128(1), - "should sample", - &SpanKind::Internal, - &Default::default(), - &[], - &instrumentation_library, - ); + fn parent_sampler() { + // name, delegate, context(with or without parent), expected decision + let test_cases = vec![ + ( + "should using delegate sampler", + Sampler::AlwaysOn, + Context::new(), + SamplingDecision::RecordAndSample, + ), + ( + "should use parent result, always off", + Sampler::AlwaysOn, + Context::current_with_span(TestSpan(SpanContext::new( + TraceId::from_u128(1), + SpanId::from_u64(1), + TraceFlags::default(), // not sampling + false, + TraceState::default(), + ))), + SamplingDecision::Drop, + ), + ( + "should use parent result, always on", + Sampler::AlwaysOff, + Context::current_with_span(TestSpan(SpanContext::new( + TraceId::from_u128(1), + SpanId::from_u64(1), + TraceFlags::SAMPLED, // not sampling + false, + TraceState::default(), + ))), + SamplingDecision::RecordAndSample, + ), + ]; + + for (name, delegate, parent_cx, expected) in test_cases { + let sampler = Sampler::ParentBased(Box::new(delegate)); + let result = sampler.should_sample( + Some(&parent_cx), + TraceId::from_u128(1), + name, + &SpanKind::Internal, + &Default::default(), + &[], + ); - assert_eq!(result.decision, SamplingDecision::RecordAndSample); + assert_eq!(result.decision, expected); + } } } diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/trace/span_processor.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/trace/span_processor.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/trace/span_processor.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/trace/span_processor.rs 2023-10-30 19:40:00.000000000 +0000 @@ -35,7 +35,7 @@ //! [`TracerProvider`]: opentelemetry_api::trace::TracerProvider use crate::export::trace::{ExportResult, SpanData, SpanExporter}; -use crate::trace::runtime::{TraceRuntime, TrySend}; +use crate::runtime::{RuntimeChannel, TrySend}; use crate::trace::Span; use futures_channel::oneshot; use futures_util::{ @@ -92,45 +92,65 @@ fn shutdown(&mut self) -> TraceResult<()>; } -/// A [`SpanProcessor`] that exports synchronously when spans are finished. -/// -/// # Examples -/// -/// Note that the simple processor exports synchronously every time a span is -/// ended. If you find this limiting, consider the batch processor instead. +/// A [SpanProcessor] that passes finished spans to the configured `SpanExporter`, as +/// soon as they are finished, without any batching. #[derive(Debug)] pub struct SimpleSpanProcessor { - sender: crossbeam_channel::Sender>, - shutdown: crossbeam_channel::Receiver<()>, + message_sender: crossbeam_channel::Sender, } impl SimpleSpanProcessor { pub(crate) fn new(mut exporter: Box) -> Self { - let (span_tx, span_rx) = crossbeam_channel::unbounded(); - let (shutdown_tx, shutdown_rx) = crossbeam_channel::bounded(0); + let (message_sender, rx) = crossbeam_channel::unbounded(); let _ = thread::Builder::new() .name("opentelemetry-exporter".to_string()) .spawn(move || { - while let Ok(Some(span)) = span_rx.recv() { - if let Err(err) = futures_executor::block_on(exporter.export(vec![span])) { - global::handle_error(err); + while let Ok(msg) = rx.recv() { + match msg { + Message::ExportSpan(span) => { + if let Err(err) = + futures_executor::block_on(exporter.export(vec![span])) + { + global::handle_error(err); + } + } + Message::Flush(sender) => { + Self::respond(&sender, "sync"); + } + Message::Shutdown(sender) => { + exporter.shutdown(); + + Self::respond(&sender, "shutdown"); + + return; + } } } exporter.shutdown(); - - if let Err(err) = shutdown_tx.send(()) { - global::handle_error(TraceError::from(format!( - "could not send shutdown: {:?}", - err - ))); - } }); - SimpleSpanProcessor { - sender: span_tx, - shutdown: shutdown_rx, + Self { message_sender } + } + + fn signal(&self, msg: fn(crossbeam_channel::Sender<()>) -> Message, description: &str) { + let (tx, rx) = crossbeam_channel::bounded(0); + + if self.message_sender.send(msg(tx)).is_ok() { + if let Err(err) = rx.recv() { + global::handle_error(TraceError::from(format!( + "error {description} span processor: {err:?}" + ))); + } + } + } + + fn respond(sender: &crossbeam_channel::Sender<()>, description: &str) { + if let Err(err) = sender.send(()) { + global::handle_error(TraceError::from(format!( + "could not send {description}: {err:?}" + ))); } } } @@ -145,30 +165,31 @@ return; } - if let Err(err) = self.sender.send(Some(span)) { + if let Err(err) = self.message_sender.send(Message::ExportSpan(span)) { global::handle_error(TraceError::from(format!("error processing span {:?}", err))); } } fn force_flush(&self) -> TraceResult<()> { - // Ignored since all spans in Simple Processor will be exported as they ended. + self.signal(Message::Flush, "flushing"); + Ok(()) } fn shutdown(&mut self) -> TraceResult<()> { - if self.sender.send(None).is_ok() { - if let Err(err) = self.shutdown.recv() { - global::handle_error(TraceError::from(format!( - "error shutting down span processor: {:?}", - err - ))) - } - } + self.signal(Message::Shutdown, "shutting down"); Ok(()) } } +#[derive(Debug)] +enum Message { + ExportSpan(SpanData), + Flush(crossbeam_channel::Sender<()>), + Shutdown(crossbeam_channel::Sender<()>), +} + /// A [`SpanProcessor`] that asynchronously buffers finished spans and reports /// them at a preconfigured interval. /// @@ -228,11 +249,11 @@ /// [`executor`]: https://docs.rs/futures/0.3/futures/executor/index.html /// [`tokio`]: https://tokio.rs /// [`async-std`]: https://async.rs -pub struct BatchSpanProcessor { +pub struct BatchSpanProcessor> { message_sender: R::Sender, } -impl fmt::Debug for BatchSpanProcessor { +impl> fmt::Debug for BatchSpanProcessor { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_struct("BatchSpanProcessor") .field("message_sender", &self.message_sender) @@ -240,7 +261,7 @@ } } -impl SpanProcessor for BatchSpanProcessor { +impl> SpanProcessor for BatchSpanProcessor { fn on_start(&self, _span: &mut Span, _cx: &Context) { // Ignored } @@ -253,14 +274,15 @@ let result = self.message_sender.try_send(BatchMessage::ExportSpan(span)); if let Err(err) = result { - global::handle_error(err); + global::handle_error(TraceError::Other(err.into())); } } fn force_flush(&self) -> TraceResult<()> { let (res_sender, res_receiver) = oneshot::channel(); self.message_sender - .try_send(BatchMessage::Flush(Some(res_sender)))?; + .try_send(BatchMessage::Flush(Some(res_sender))) + .map_err(|err| TraceError::Other(err.into()))?; futures_executor::block_on(res_receiver) .map_err(|err| TraceError::Other(err.into())) @@ -270,7 +292,8 @@ fn shutdown(&mut self) -> TraceResult<()> { let (res_sender, res_receiver) = oneshot::channel(); self.message_sender - .try_send(BatchMessage::Shutdown(res_sender))?; + .try_send(BatchMessage::Shutdown(res_sender)) + .map_err(|err| TraceError::Other(err.into()))?; futures_executor::block_on(res_receiver) .map_err(|err| TraceError::Other(err.into())) @@ -302,7 +325,7 @@ config: BatchConfig, } -impl BatchSpanProcessorInternal { +impl> BatchSpanProcessorInternal { async fn flush(&mut self, res_channel: Option>) { let export_task = self.export(); let task = Box::pin(async move { @@ -439,7 +462,7 @@ } } -impl BatchSpanProcessor { +impl> BatchSpanProcessor { pub(crate) fn new(exporter: Box, config: BatchConfig, runtime: R) -> Self { let (message_sender, message_receiver) = runtime.batch_message_channel(config.max_queue_size); @@ -622,7 +645,7 @@ impl BatchSpanProcessorBuilder where E: SpanExporter + 'static, - R: TraceRuntime, + R: RuntimeChannel, { /// Set max queue size for batches pub fn with_max_queue_size(self, size: usize) -> Self { @@ -690,7 +713,7 @@ OTEL_BSP_MAX_EXPORT_BATCH_SIZE, OTEL_BSP_MAX_QUEUE_SIZE, OTEL_BSP_MAX_QUEUE_SIZE_DEFAULT, OTEL_BSP_SCHEDULE_DELAY, OTEL_BSP_SCHEDULE_DELAY_DEFAULT, }; - use crate::export::trace::{stdout, ExportResult, SpanData, SpanExporter}; + use crate::export::trace::{ExportResult, SpanData, SpanExporter}; use crate::runtime; use crate::testing::trace::{ new_test_export_span_data, new_test_exporter, new_tokio_test_exporter, @@ -762,10 +785,7 @@ std::env::set_var(OTEL_BSP_EXPORT_TIMEOUT, "2046"); std::env::set_var(OTEL_BSP_SCHEDULE_DELAY, "I am not number"); - let mut builder = BatchSpanProcessor::builder( - stdout::Exporter::new(std::io::stdout(), true), - runtime::Tokio, - ); + let mut builder = BatchSpanProcessor::builder(new_test_exporter().0, runtime::Tokio); // export batch size cannot exceed max queue size assert_eq!(builder.config.max_export_batch_size, 500); assert_eq!( @@ -782,10 +802,7 @@ ); std::env::set_var(OTEL_BSP_MAX_QUEUE_SIZE, "120"); - builder = BatchSpanProcessor::builder( - stdout::Exporter::new(std::io::stdout(), true), - runtime::Tokio, - ); + builder = BatchSpanProcessor::builder(new_test_exporter().0, runtime::Tokio); assert_eq!(builder.config.max_export_batch_size, 120); assert_eq!(builder.config.max_queue_size, 120); diff -Nru temporalio-1.3.0/vendor/opentelemetry_sdk/src/trace/tracer.rs temporalio-1.3.0/vendor/opentelemetry_sdk/src/trace/tracer.rs --- temporalio-1.3.0/vendor/opentelemetry_sdk/src/trace/tracer.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry_sdk/src/trace/tracer.rs 2023-10-30 19:40:00.000000000 +0000 @@ -7,27 +7,29 @@ //! and exposes methods for creating and activating new `Spans`. //! //! Docs: -use crate::trace::SpanLimits; use crate::{ trace::{ provider::{TracerProvider, TracerProviderInner}, span::{Span, SpanData}, - Config, EvictedHashMap, EvictedQueue, + Config, EvictedHashMap, EvictedQueue, SpanLimits, }, InstrumentationLibrary, }; -use opentelemetry_api::trace::{ - Link, OrderMap, SamplingDecision, SamplingResult, SpanBuilder, SpanContext, SpanId, SpanKind, - TraceContextExt, TraceFlags, TraceId, TraceState, +use once_cell::sync::Lazy; +use opentelemetry_api::{ + trace::{ + Link, SamplingDecision, SamplingResult, SpanBuilder, SpanContext, SpanId, SpanKind, + TraceContextExt, TraceFlags, TraceId, TraceState, + }, + Context, Key, KeyValue, OrderMap, Value, }; -use opentelemetry_api::{Context, Key, KeyValue, Value}; use std::fmt; -use std::sync::Weak; +use std::sync::{Arc, Weak}; /// `Tracer` implementation to create and manage spans #[derive(Clone)] pub struct Tracer { - instrumentation_lib: InstrumentationLibrary, + instrumentation_lib: Arc, provider: Weak, } @@ -45,7 +47,7 @@ impl Tracer { /// Create a new tracer (used internally by `TracerProvider`s). pub(crate) fn new( - instrumentation_lib: InstrumentationLibrary, + instrumentation_lib: Arc, provider: Weak, ) -> Self { Tracer { @@ -75,7 +77,6 @@ attributes: &OrderMap, links: &[Link], config: &Config, - instrumentation_library: &InstrumentationLibrary, ) -> Option<(TraceFlags, Vec, TraceState)> { let sampling_result = config.sampler.should_sample( Some(parent_cx), @@ -84,7 +85,6 @@ span_kind, attributes, links, - instrumentation_library, ); self.process_sampling_result(sampling_result, parent_cx) @@ -120,6 +120,8 @@ } } +static EMPTY_ATTRIBUTES: Lazy> = Lazy::new(Default::default); + impl opentelemetry_api::trace::Tracer for Tracer { /// This implementation of `Tracer` produces `sdk::Span` instances. type Span = Span; @@ -150,8 +152,6 @@ .take() .unwrap_or_else(|| config.id_generator.new_span_id()); let span_kind = builder.span_kind.take().unwrap_or(SpanKind::Internal); - let mut attribute_options = builder.attributes.take().unwrap_or_default(); - let mut link_options = builder.links.take(); let mut parent_span_id = SpanId::INVALID; let trace_id; @@ -181,10 +181,9 @@ trace_id, &builder.name, &span_kind, - &attribute_options, - link_options.as_deref().unwrap_or(&[]), + builder.attributes.as_ref().unwrap_or(&EMPTY_ATTRIBUTES), + builder.links.as_deref().unwrap_or(&[]), provider.config(), - &self.instrumentation_lib, ) }; @@ -199,6 +198,7 @@ // Build optional inner context, `None` if not recording. let mut span = if let Some((flags, extra_attrs, trace_state)) = sampling_decision { + let mut attribute_options = builder.attributes.take().unwrap_or_default(); for extra_attr in extra_attrs { attribute_options.insert(extra_attr.key, extra_attr.value); } @@ -207,6 +207,8 @@ for (key, value) in attribute_options { attributes.insert(KeyValue::new(key, value)); } + + let mut link_options = builder.links.take(); let mut links = EvictedQueue::new(span_limits.max_links_per_span); if let Some(link_options) = &mut link_options { let link_attributes_limit = span_limits.max_attributes_per_link as usize; @@ -276,14 +278,13 @@ use crate::{ testing::trace::TestSpan, trace::{Config, Sampler, ShouldSample}, - InstrumentationLibrary, }; use opentelemetry_api::{ trace::{ - Link, OrderMap, SamplingDecision, SamplingResult, Span, SpanContext, SpanId, SpanKind, + Link, SamplingDecision, SamplingResult, Span, SpanContext, SpanId, SpanKind, TraceContextExt, TraceFlags, TraceId, TraceState, Tracer, TracerProvider, }, - Context, Key, Value, + Context, Key, OrderMap, Value, }; #[derive(Clone, Debug)] @@ -298,7 +299,6 @@ _span_kind: &SpanKind, _attributes: &OrderMap, _links: &[Link], - _instrumentation_library: &InstrumentationLibrary, ) -> SamplingResult { let trace_state = parent_context .unwrap() @@ -368,15 +368,16 @@ let span = tracer.span_builder("must_not_be_sampled").start(&tracer); assert!(!span.span_context().is_sampled()); - let _attached = Context::current() - .with_remote_span_context(SpanContext::new( + let context = Context::map_current(|cx| { + cx.with_remote_span_context(SpanContext::new( TraceId::from_u128(1), SpanId::from_u64(1), TraceFlags::default(), true, Default::default(), )) - .attach(); + }); + let _attached = context.attach(); let span = tracer.span_builder("must_not_be_sampled").start(&tracer); assert!(!span.span_context().is_sampled()); diff -Nru temporalio-1.3.0/vendor/opentelemetry-semantic-conventions/.cargo-checksum.json temporalio-1.3.0/vendor/opentelemetry-semantic-conventions/.cargo-checksum.json --- temporalio-1.3.0/vendor/opentelemetry-semantic-conventions/.cargo-checksum.json 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-semantic-conventions/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1 @@ +{"files":{"CHANGELOG.md":"f0d261ab34aedbb0d82e9a257a2830b1687159555f92ecb0d29dc128a10084d5","CODEOWNERS":"abc35dda6643aed84b16084b9dccfee77929c299d60d21b590bd5c8c3b54e508","Cargo.toml":"41df5859e3dff2af86236b7b790efb44b4a26e10ac7faa7e98b5ef18b0ead361","LICENSE":"208a3f5bae3355bd4f3f45626d1ea4518b253d618ee2896983436075c4375098","README.md":"d6943e0b98c86e33639b795a30db877305935c927fb22d9e7afde3ee2b46571a","scripts/generate-consts-from-spec.sh":"18b66b5841430129df9bda93430617f0220320e1d2805ea7be2f678ab0958855","scripts/templates/header_resource.rs":"15551d379218ab5b615d1b3a5a3eccca10f7cd199486f3d4a737fbdfc750c4b6","scripts/templates/header_trace.rs":"e32fff42976b80e4a2c14489f87a223432bbf265165e7ec20aa2551d1f51ec16","scripts/templates/semantic_attributes.rs.j2":"dfec365069e510a4124d61b0f9232fdef2d92626071d44e75cd5e1ace88c7627","src/lib.rs":"80de22474a2712bbe00dba954918c1730fea4fe7d44bb0e12f9dd579b882fcc5","src/resource.rs":"71df8338d57d9aa7701f7165c65891105074b48568859c6997be4656dc2e076c","src/trace.rs":"8b0b1405987bc2b0950c0f979a3661600262459df49ca8dd70688b28df6bd4c3"},"package":"73c9f9340ad135068800e7f1b24e9e09ed9e7143f5bf8518ded3d3ec69789269"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/opentelemetry-semantic-conventions/Cargo.toml temporalio-1.3.0/vendor/opentelemetry-semantic-conventions/Cargo.toml --- temporalio-1.3.0/vendor/opentelemetry-semantic-conventions/Cargo.toml 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-semantic-conventions/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,45 @@ +# 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 = "2021" +rust-version = "1.60" +name = "opentelemetry-semantic-conventions" +version = "0.12.0" +description = "Semantic conventions for OpenTelemetry" +homepage = "https://github.com/open-telemetry/opentelemetry-rust/tree/main/opentelemetry-semantic-conventions" +readme = "README.md" +keywords = [ + "opentelemetry", + "tracing", + "async", +] +categories = [ + "development-tools::debugging", + "development-tools::profiling", + "asynchronous", +] +license = "Apache-2.0" +repository = "https://github.com/open-telemetry/opentelemetry-rust/tree/main/opentelemetry-semantic-conventions" +resolver = "1" + +[package.metadata.docs.rs] +all-features = true +rustdoc-args = [ + "--cfg", + "docsrs", +] + +[dependencies.opentelemetry] +version = "0.20" +default-features = false + +[dev-dependencies] diff -Nru temporalio-1.3.0/vendor/opentelemetry-semantic-conventions/CHANGELOG.md temporalio-1.3.0/vendor/opentelemetry-semantic-conventions/CHANGELOG.md --- temporalio-1.3.0/vendor/opentelemetry-semantic-conventions/CHANGELOG.md 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-semantic-conventions/CHANGELOG.md 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,80 @@ +# Changelog + +## v0.12.0 + +### Changed + +- Update to v1.21.0 spec +- Update to opentelemetry-api v0.20.0 + +## v0.11.0 +### Changed +- Update to `opentelemetry` v0.19. +- Update to `opentelemetry_http` v0.8. +- Bump MSRV to 1.57 [#953](https://github.com/open-telemetry/opentelemetry-rust/pull/953). +- Update to v1.17.0 spec [#960](https://github.com/open-telemetry/opentelemetry-rust/pull/960). +- Update dependencies and bump MSRV to 1.60 [#969](https://github.com/open-telemetry/opentelemetry-rust/pull/969). + +## v0.10.0 + +### Changed + +- update to v1.9 spec #754 +- Update to opentelemetry v0.18.0 + +## v0.9.0 + +### Changed + +- Update to opentelemetry v0.17.0 + +## v0.8.0 + +### Changed + +- Update to opentelemetry v0.16.0 + +## v0.7.0 + +### Changed + +- Update to spec version 1.4.0 #570 +- Update to opentelemetry v0.15.0 + +## v0.6.0 + +### Changed + +- Update to spec version 1.3.0 #547 +- Update to opentelemetry v0.14.0 + +## v0.5.0 + +### Changed +- Update to opentelemetry v0.13.0 + +### Removed +- Removed `from_env` and use environment variables to initialize the configurations by default #459 + +## v0.4.0 + +### Changed +- Update to opentelemetry v0.12.0 + +## v0.3.0 + +### Changed + +- Update to opentelemetry v0.11.0 + +## v0.2.0 + +### Changed + +- Update to opentelemetry v0.10.0 + +## v0.1.0 + +### Added + +- Semantic conventions for [trace](https://github.com/open-telemetry/opentelemetry-specification/tree/master/specification/trace/semantic_conventions) and [resource](https://github.com/open-telemetry/opentelemetry-specification/tree/master/specification/resource/semantic_conventions). diff -Nru temporalio-1.3.0/vendor/opentelemetry-semantic-conventions/CODEOWNERS temporalio-1.3.0/vendor/opentelemetry-semantic-conventions/CODEOWNERS --- temporalio-1.3.0/vendor/opentelemetry-semantic-conventions/CODEOWNERS 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-semantic-conventions/CODEOWNERS 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,5 @@ +# Code owners file. +# This file controls who is tagged for review for any given pull request. + +# For anything not explicitly taken by someone else: +* @open-telemetry/rust-approvers diff -Nru temporalio-1.3.0/vendor/opentelemetry-semantic-conventions/LICENSE temporalio-1.3.0/vendor/opentelemetry-semantic-conventions/LICENSE --- temporalio-1.3.0/vendor/opentelemetry-semantic-conventions/LICENSE 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-semantic-conventions/LICENSE 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2023 The OpenTelemetry Authors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff -Nru temporalio-1.3.0/vendor/opentelemetry-semantic-conventions/README.md temporalio-1.3.0/vendor/opentelemetry-semantic-conventions/README.md --- temporalio-1.3.0/vendor/opentelemetry-semantic-conventions/README.md 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-semantic-conventions/README.md 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,24 @@ +![OpenTelemetry — An observability framework for cloud-native software.][splash] + +[splash]: https://raw.githubusercontent.com/open-telemetry/opentelemetry-rust/main/assets/logo-text.png + +# OpenTelemetry Semantic Conventions + +Semantic conventions for applications instrumented with [`OpenTelemetry`]. + +[![Crates.io: opentelemetry-semantic-conventions](https://img.shields.io/crates/v/opentelemetry-semantic-conventions.svg)](https://crates.io/crates/opentelemetry-semantic-conventions) +[![Documentation](https://docs.rs/opentelemetry-semantic-conventions/badge.svg)](https://docs.rs/opentelemetry-semantic-conventions) +[![LICENSE](https://img.shields.io/crates/l/opentelemetry-semantic-conventions)](./LICENSE) +[![GitHub Actions CI](https://github.com/open-telemetry/opentelemetry-rust/workflows/CI/badge.svg)](https://github.com/open-telemetry/opentelemetry-rust/actions?query=workflow%3ACI+branch%3Amain) +[![Slack](https://img.shields.io/badge/slack-@cncf/otel/rust-brightgreen.svg?logo=slack)](https://cloud-native.slack.com/archives/C03GDP0H023) + +## Overview + +[`OpenTelemetry`] is a collection of tools, APIs, and SDKs used to instrument, +generate, collect, and export telemetry data (metrics, logs, and traces) for +analysis in order to understand your software's performance and behavior. This +crate provides standardized naming patterns for attributes, and +resources to help facilitate interoperability and compatibility with processing +and visualization tools. + +[`opentelemetry`]: https://crates.io/crates/opentelemetry diff -Nru temporalio-1.3.0/vendor/opentelemetry-semantic-conventions/scripts/generate-consts-from-spec.sh temporalio-1.3.0/vendor/opentelemetry-semantic-conventions/scripts/generate-consts-from-spec.sh --- temporalio-1.3.0/vendor/opentelemetry-semantic-conventions/scripts/generate-consts-from-spec.sh 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-semantic-conventions/scripts/generate-consts-from-spec.sh 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,48 @@ +#!/bin/bash +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +CRATE_DIR="${SCRIPT_DIR}/../" + +# freeze the spec version and generator version to make generation reproducible +SPEC_VERSION=1.21.0 +SEMCOVGEN_VERSION=0.19.0 + +cd "$CRATE_DIR" + +rm -rf semantic-conventions || true +mkdir semantic-conventions +cd semantic-conventions + +git init +git remote add origin https://github.com/open-telemetry/semantic-conventions.git +git fetch origin "v$SPEC_VERSION" +git reset --hard FETCH_HEAD +cd "$CRATE_DIR" + +docker run --rm \ + -v "${CRATE_DIR}/semantic-conventions/model:/source" \ + -v "${CRATE_DIR}/scripts/templates:/templates" \ + -v "${CRATE_DIR}/src:/output" \ + otel/semconvgen:$SEMCOVGEN_VERSION \ + --only span,event,attribute_group,scope \ + -f /source code \ + --template /templates/semantic_attributes.rs.j2 \ + --output /output/trace.rs \ + --parameters conventions=trace + +docker run --rm \ + -v "${CRATE_DIR}/semantic-conventions/model:/source" \ + -v "${CRATE_DIR}/scripts/templates:/templates" \ + -v "${CRATE_DIR}/src:/output" \ + otel/semconvgen:$SEMCOVGEN_VERSION \ + --only resource \ + -f /source code \ + --template /templates/semantic_attributes.rs.j2 \ + --output /output/resource.rs \ + --parameters conventions=resource + +# Keep `SCHEMA_URL` key in sync with spec version +sed -i '' "s/\(opentelemetry.io\/schemas\/\)[^\"]*\"/\1$SPEC_VERSION\"/" src/lib.rs + +cargo fmt diff -Nru temporalio-1.3.0/vendor/opentelemetry-semantic-conventions/scripts/templates/header_resource.rs temporalio-1.3.0/vendor/opentelemetry-semantic-conventions/scripts/templates/header_resource.rs --- temporalio-1.3.0/vendor/opentelemetry-semantic-conventions/scripts/templates/header_resource.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-semantic-conventions/scripts/templates/header_resource.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,20 @@ +//! # Resource Semantic Conventions +//! +//! The [resource semantic conventions] define a set of standardized attributes +//! to be used in `Resource`s. +//! +//! [resource semantic conventions]: https://github.com/open-telemetry/opentelemetry-specification/tree/master/specification/resource/semantic_conventions +//! +//! ## Usage +//! +//! ``` +//! use opentelemetry::sdk; +//! use opentelemetry_semantic_conventions as semconv; +//! +//! let _tracer = sdk::trace::TracerProvider::builder() +//! .with_config(sdk::trace::config().with_resource(sdk::Resource::new(vec![ +//! semconv::resource::SERVICE_NAME.string("my-service"), +//! semconv::resource::SERVICE_NAMESPACE.string("my-namespace"), +//! ]))) +//! .build(); +//! ``` diff -Nru temporalio-1.3.0/vendor/opentelemetry-semantic-conventions/scripts/templates/header_trace.rs temporalio-1.3.0/vendor/opentelemetry-semantic-conventions/scripts/templates/header_trace.rs --- temporalio-1.3.0/vendor/opentelemetry-semantic-conventions/scripts/templates/header_trace.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-semantic-conventions/scripts/templates/header_trace.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,22 @@ +//! # Trace Semantic Conventions +//! +//! The [trace semantic conventions] define a set of standardized attributes to +//! be used in `Span`s. +//! +//! [trace semantic conventions]: https://github.com/open-telemetry/opentelemetry-specification/tree/master/specification/trace/semantic_conventions +//! +//! ## Usage +//! +//! ``` +//! use opentelemetry::{global, trace::Tracer as _}; +//! use opentelemetry_semantic_conventions as semcov; +//! +//! let tracer = global::tracer("my-component"); +//! let _span = tracer +//! .span_builder("span-name") +//! .with_attributes(vec![ +//! semcov::trace::NET_PEER_NAME.string("example.org"), +//! semcov::trace::NET_PEER_PORT.i64(80), +//! ]) +//! .start(&tracer); +//! ``` diff -Nru temporalio-1.3.0/vendor/opentelemetry-semantic-conventions/scripts/templates/semantic_attributes.rs.j2 temporalio-1.3.0/vendor/opentelemetry-semantic-conventions/scripts/templates/semantic_attributes.rs.j2 --- temporalio-1.3.0/vendor/opentelemetry-semantic-conventions/scripts/templates/semantic_attributes.rs.j2 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-semantic-conventions/scripts/templates/semantic_attributes.rs.j2 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,32 @@ +// DO NOT EDIT, this is an auto-generated file +// +// If you want to update the file: +// - Edit the template at scripts{{template}} +// - Run the script at scripts/generate-consts-from-spec.sh + +{% include 'header_' + conventions + '.rs' %} + +use opentelemetry::Key; + +{%- for attribute in attributes if attribute.is_local and not attribute.ref %} + +/// {% filter escape %}{{attribute.brief | to_doc_brief}}.{% endfilter %} +{%- if attribute.note %} +/// +{%- for line in attribute.note.split('\n') %} +/// {% filter escape %}{{line}}{% endfilter %} +{%- endfor %} +{%- endif %} +{%- if attribute.examples %} +/// +/// # Examples +/// +{%- for example in attribute.examples %} +/// - `{{example}}` +{%- endfor %} +{%- endif %} +{%- if (attribute.stability | string()) == "StabilityLevel.DEPRECATED" %} +#[deprecated] +{%- endif %} +pub const {{attribute.fqn | to_const_name}}: Key = Key::from_static_str("{{attribute.fqn}}"); +{%- endfor %} diff -Nru temporalio-1.3.0/vendor/opentelemetry-semantic-conventions/src/lib.rs temporalio-1.3.0/vendor/opentelemetry-semantic-conventions/src/lib.rs --- temporalio-1.3.0/vendor/opentelemetry-semantic-conventions/src/lib.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-semantic-conventions/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,23 @@ +//! OpenTelemetry semantic conventions are agreed standardized naming patterns +//! for OpenTelemetry things. This crate aims to be the centralized place to +//! interact with these conventions. +#![warn( + future_incompatible, + missing_debug_implementations, + missing_docs, + nonstandard_style, + rust_2018_idioms, + unreachable_pub, + unused +)] +#![cfg_attr(test, deny(warnings))] +#![doc( + html_logo_url = "https://raw.githubusercontent.com/open-telemetry/opentelemetry-rust/main/assets/logo.svg" +)] + +pub mod resource; +pub mod trace; + +/// The schema URL that matches the version of the semantic conventions that +/// this crate defines. +pub const SCHEMA_URL: &str = "https://opentelemetry.io/schemas/1.21.0"; diff -Nru temporalio-1.3.0/vendor/opentelemetry-semantic-conventions/src/resource.rs temporalio-1.3.0/vendor/opentelemetry-semantic-conventions/src/resource.rs --- temporalio-1.3.0/vendor/opentelemetry-semantic-conventions/src/resource.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-semantic-conventions/src/resource.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,885 @@ +// DO NOT EDIT, this is an auto-generated file +// +// If you want to update the file: +// - Edit the template at scripts/templates/semantic_attributes.rs.j2 +// - Run the script at scripts/generate-consts-from-spec.sh + +//! # Resource Semantic Conventions +//! +//! The [resource semantic conventions] define a set of standardized attributes +//! to be used in `Resource`s. +//! +//! [resource semantic conventions]: https://github.com/open-telemetry/opentelemetry-specification/tree/master/specification/resource/semantic_conventions +//! +//! ## Usage +//! +//! ``` +//! use opentelemetry::sdk; +//! use opentelemetry_semantic_conventions as semconv; +//! +//! let _tracer = sdk::trace::TracerProvider::builder() +//! .with_config(sdk::trace::config().with_resource(sdk::Resource::new(vec![ +//! semconv::resource::SERVICE_NAME.string("my-service"), +//! semconv::resource::SERVICE_NAMESPACE.string("my-namespace"), +//! ]))) +//! .build(); +//! ``` + +use opentelemetry::Key; + +/// Array of brand name and version separated by a space. +/// +/// This value is intended to be taken from the [UA client hints API](https://wicg.github.io/ua-client-hints/#interface) (`navigator.userAgentData.brands`). +/// +/// # Examples +/// +/// - ` Not A;Brand 99` +/// - `Chromium 99` +/// - `Chrome 99` +pub const BROWSER_BRANDS: Key = Key::from_static_str("browser.brands"); + +/// The platform on which the browser is running. +/// +/// This value is intended to be taken from the [UA client hints API](https://wicg.github.io/ua-client-hints/#interface) (`navigator.userAgentData.platform`). If unavailable, the legacy `navigator.platform` API SHOULD NOT be used instead and this attribute SHOULD be left unset in order for the values to be consistent. +/// The list of possible values is defined in the [W3C User-Agent Client Hints specification](https://wicg.github.io/ua-client-hints/#sec-ch-ua-platform). Note that some (but not all) of these values can overlap with values in the [`os.type` and `os.name` attributes](./os.md). However, for consistency, the values in the `browser.platform` attribute should capture the exact value that the user agent provides. +/// +/// # Examples +/// +/// - `Windows` +/// - `macOS` +/// - `Android` +pub const BROWSER_PLATFORM: Key = Key::from_static_str("browser.platform"); + +/// A boolean that is true if the browser is running on a mobile device. +/// +/// This value is intended to be taken from the [UA client hints API](https://wicg.github.io/ua-client-hints/#interface) (`navigator.userAgentData.mobile`). If unavailable, this attribute SHOULD be left unset. +pub const BROWSER_MOBILE: Key = Key::from_static_str("browser.mobile"); + +/// Preferred language of the user using the browser. +/// +/// This value is intended to be taken from the Navigator API `navigator.language`. +/// +/// # Examples +/// +/// - `en` +/// - `en-US` +/// - `fr` +/// - `fr-FR` +pub const BROWSER_LANGUAGE: Key = Key::from_static_str("browser.language"); + +/// Name of the cloud provider. +pub const CLOUD_PROVIDER: Key = Key::from_static_str("cloud.provider"); + +/// The cloud account ID the resource is assigned to. +/// +/// # Examples +/// +/// - `111111111111` +/// - `opentelemetry` +pub const CLOUD_ACCOUNT_ID: Key = Key::from_static_str("cloud.account.id"); + +/// The geographical region the resource is running. +/// +/// Refer to your provider's docs to see the available regions, for example [Alibaba Cloud regions](https://www.alibabacloud.com/help/doc-detail/40654.htm), [AWS regions](https://aws.amazon.com/about-aws/global-infrastructure/regions_az/), [Azure regions](https://azure.microsoft.com/en-us/global-infrastructure/geographies/), [Google Cloud regions](https://cloud.google.com/about/locations), or [Tencent Cloud regions](https://www.tencentcloud.com/document/product/213/6091). +/// +/// # Examples +/// +/// - `us-central1` +/// - `us-east-1` +pub const CLOUD_REGION: Key = Key::from_static_str("cloud.region"); + +/// Cloud provider-specific native identifier of the monitored cloud resource (e.g. an [ARN](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html) on AWS, a [fully qualified resource ID](https://learn.microsoft.com/en-us/rest/api/resources/resources/get-by-id) on Azure, a [full resource name](https://cloud.google.com/apis/design/resource_names#full_resource_name) on GCP). +/// +/// On some cloud providers, it may not be possible to determine the full ID at startup, +/// so it may be necessary to set `cloud.resource_id` as a span attribute instead. +/// +/// The exact value to use for `cloud.resource_id` depends on the cloud provider. +/// The following well-known definitions MUST be used if you set this attribute and they apply: +/// +/// * **AWS Lambda:** The function [ARN](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html). +/// Take care not to use the "invoked ARN" directly but replace any +/// [alias suffix](https://docs.aws.amazon.com/lambda/latest/dg/configuration-aliases.html) +/// with the resolved function version, as the same runtime instance may be invokable with +/// multiple different aliases. +/// * **GCP:** The [URI of the resource](https://cloud.google.com/iam/docs/full-resource-names) +/// * **Azure:** The [Fully Qualified Resource ID](https://docs.microsoft.com/en-us/rest/api/resources/resources/get-by-id) of the invoked function, +/// *not* the function app, having the form +/// `/subscriptions/<SUBSCIPTION_GUID>/resourceGroups/<RG>/providers/Microsoft.Web/sites/<FUNCAPP>/functions/<FUNC>`. +/// This means that a span attribute MUST be used, as an Azure function app can host multiple functions that would usually share +/// a TracerProvider. +/// +/// # Examples +/// +/// - `arn:aws:lambda:REGION:ACCOUNT_ID:function:my-function` +/// - `//run.googleapis.com/projects/PROJECT_ID/locations/LOCATION_ID/services/SERVICE_ID` +/// - `/subscriptions//resourceGroups//providers/Microsoft.Web/sites//functions/` +pub const CLOUD_RESOURCE_ID: Key = Key::from_static_str("cloud.resource_id"); + +/// Cloud regions often have multiple, isolated locations known as zones to increase availability. Availability zone represents the zone where the resource is running. +/// +/// Availability zones are called "zones" on Alibaba Cloud and Google Cloud. +/// +/// # Examples +/// +/// - `us-east-1c` +pub const CLOUD_AVAILABILITY_ZONE: Key = Key::from_static_str("cloud.availability_zone"); + +/// The cloud platform in use. +/// +/// The prefix of the service SHOULD match the one specified in `cloud.provider`. +pub const CLOUD_PLATFORM: Key = Key::from_static_str("cloud.platform"); + +/// The Amazon Resource Name (ARN) of an [ECS container instance](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ECS_instances.html). +/// +/// # Examples +/// +/// - `arn:aws:ecs:us-west-1:123456789123:container/32624152-9086-4f0e-acae-1a75b14fe4d9` +pub const AWS_ECS_CONTAINER_ARN: Key = Key::from_static_str("aws.ecs.container.arn"); + +/// The ARN of an [ECS cluster](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/clusters.html). +/// +/// # Examples +/// +/// - `arn:aws:ecs:us-west-2:123456789123:cluster/my-cluster` +pub const AWS_ECS_CLUSTER_ARN: Key = Key::from_static_str("aws.ecs.cluster.arn"); + +/// The [launch type](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/launch_types.html) for an ECS task. +pub const AWS_ECS_LAUNCHTYPE: Key = Key::from_static_str("aws.ecs.launchtype"); + +/// The ARN of an [ECS task definition](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definitions.html). +/// +/// # Examples +/// +/// - `arn:aws:ecs:us-west-1:123456789123:task/10838bed-421f-43ef-870a-f43feacbbb5b` +pub const AWS_ECS_TASK_ARN: Key = Key::from_static_str("aws.ecs.task.arn"); + +/// The task definition family this task definition is a member of. +/// +/// # Examples +/// +/// - `opentelemetry-family` +pub const AWS_ECS_TASK_FAMILY: Key = Key::from_static_str("aws.ecs.task.family"); + +/// The revision for this task definition. +/// +/// # Examples +/// +/// - `8` +/// - `26` +pub const AWS_ECS_TASK_REVISION: Key = Key::from_static_str("aws.ecs.task.revision"); + +/// The ARN of an EKS cluster. +/// +/// # Examples +/// +/// - `arn:aws:ecs:us-west-2:123456789123:cluster/my-cluster` +pub const AWS_EKS_CLUSTER_ARN: Key = Key::from_static_str("aws.eks.cluster.arn"); + +/// The name(s) of the AWS log group(s) an application is writing to. +/// +/// Multiple log groups must be supported for cases like multi-container applications, where a single application has sidecar containers, and each write to their own log group. +/// +/// # Examples +/// +/// - `/aws/lambda/my-function` +/// - `opentelemetry-service` +pub const AWS_LOG_GROUP_NAMES: Key = Key::from_static_str("aws.log.group.names"); + +/// The Amazon Resource Name(s) (ARN) of the AWS log group(s). +/// +/// See the [log group ARN format documentation](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/iam-access-control-overview-cwl.html#CWL_ARN_Format). +/// +/// # Examples +/// +/// - `arn:aws:logs:us-west-1:123456789012:log-group:/aws/my/group:*` +pub const AWS_LOG_GROUP_ARNS: Key = Key::from_static_str("aws.log.group.arns"); + +/// The name(s) of the AWS log stream(s) an application is writing to. +/// +/// # Examples +/// +/// - `logs/main/10838bed-421f-43ef-870a-f43feacbbb5b` +pub const AWS_LOG_STREAM_NAMES: Key = Key::from_static_str("aws.log.stream.names"); + +/// The ARN(s) of the AWS log stream(s). +/// +/// See the [log stream ARN format documentation](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/iam-access-control-overview-cwl.html#CWL_ARN_Format). One log group can contain several log streams, so these ARNs necessarily identify both a log group and a log stream. +/// +/// # Examples +/// +/// - `arn:aws:logs:us-west-1:123456789012:log-group:/aws/my/group:log-stream:logs/main/10838bed-421f-43ef-870a-f43feacbbb5b` +pub const AWS_LOG_STREAM_ARNS: Key = Key::from_static_str("aws.log.stream.arns"); + +/// The name of the Cloud Run [execution](https://cloud.google.com/run/docs/managing/job-executions) being run for the Job, as set by the [`CLOUD_RUN_EXECUTION`](https://cloud.google.com/run/docs/container-contract#jobs-env-vars) environment variable. +/// +/// # Examples +/// +/// - `job-name-xxxx` +/// - `sample-job-mdw84` +pub const GCP_CLOUD_RUN_JOB_EXECUTION: Key = Key::from_static_str("gcp.cloud_run.job.execution"); + +/// The index for a task within an execution as provided by the [`CLOUD_RUN_TASK_INDEX`](https://cloud.google.com/run/docs/container-contract#jobs-env-vars) environment variable. +/// +/// # Examples +/// +/// - `0` +/// - `1` +pub const GCP_CLOUD_RUN_JOB_TASK_INDEX: Key = Key::from_static_str("gcp.cloud_run.job.task_index"); + +/// The instance name of a GCE instance. This is the value provided by `host.name`, the visible name of the instance in the Cloud Console UI, and the prefix for the default hostname of the instance as defined by the [default internal DNS name](https://cloud.google.com/compute/docs/internal-dns#instance-fully-qualified-domain-names). +/// +/// # Examples +/// +/// - `instance-1` +/// - `my-vm-name` +pub const GCP_GCE_INSTANCE_NAME: Key = Key::from_static_str("gcp.gce.instance.name"); + +/// The hostname of a GCE instance. This is the full value of the default or [custom hostname](https://cloud.google.com/compute/docs/instances/custom-hostname-vm). +/// +/// # Examples +/// +/// - `my-host1234.example.com` +/// - `sample-vm.us-west1-b.c.my-project.internal` +pub const GCP_GCE_INSTANCE_HOSTNAME: Key = Key::from_static_str("gcp.gce.instance.hostname"); + +/// Time and date the release was created. +/// +/// # Examples +/// +/// - `2022-10-23T18:00:42Z` +pub const HEROKU_RELEASE_CREATION_TIMESTAMP: Key = + Key::from_static_str("heroku.release.creation_timestamp"); + +/// Commit hash for the current release. +/// +/// # Examples +/// +/// - `e6134959463efd8966b20e75b913cafe3f5ec` +pub const HEROKU_RELEASE_COMMIT: Key = Key::from_static_str("heroku.release.commit"); + +/// Unique identifier for the application. +/// +/// # Examples +/// +/// - `2daa2797-e42b-4624-9322-ec3f968df4da` +pub const HEROKU_APP_ID: Key = Key::from_static_str("heroku.app.id"); + +/// Container name used by container runtime. +/// +/// # Examples +/// +/// - `opentelemetry-autoconf` +pub const CONTAINER_NAME: Key = Key::from_static_str("container.name"); + +/// Container ID. Usually a UUID, as for example used to [identify Docker containers](https://docs.docker.com/engine/reference/run/#container-identification). The UUID might be abbreviated. +/// +/// # Examples +/// +/// - `a3bf90e006b2` +pub const CONTAINER_ID: Key = Key::from_static_str("container.id"); + +/// The container runtime managing this container. +/// +/// # Examples +/// +/// - `docker` +/// - `containerd` +/// - `rkt` +pub const CONTAINER_RUNTIME: Key = Key::from_static_str("container.runtime"); + +/// Name of the image the container was built on. +/// +/// # Examples +/// +/// - `gcr.io/opentelemetry/operator` +pub const CONTAINER_IMAGE_NAME: Key = Key::from_static_str("container.image.name"); + +/// Container image tag. +/// +/// # Examples +/// +/// - `0.1` +pub const CONTAINER_IMAGE_TAG: Key = Key::from_static_str("container.image.tag"); + +/// Runtime specific image identifier. Usually a hash algorithm followed by a UUID. +/// +/// Docker defines a sha256 of the image id; `container.image.id` corresponds to the `Image` field from the Docker container inspect [API](https://docs.docker.com/engine/api/v1.43/#tag/Container/operation/ContainerInspect) endpoint. +/// K8s defines a link to the container registry repository with digest `"imageID": "registry.azurecr.io /namespace/service/dockerfile@sha256:bdeabd40c3a8a492eaf9e8e44d0ebbb84bac7ee25ac0cf8a7159d25f62555625"`. +/// OCI defines a digest of manifest. +/// +/// # Examples +/// +/// - `sha256:19c92d0a00d1b66d897bceaa7319bee0dd38a10a851c60bcec9474aa3f01e50f` +pub const CONTAINER_IMAGE_ID: Key = Key::from_static_str("container.image.id"); + +/// The command used to run the container (i.e. the command name). +/// +/// If using embedded credentials or sensitive data, it is recommended to remove them to prevent potential leakage. +/// +/// # Examples +/// +/// - `otelcontribcol` +pub const CONTAINER_COMMAND: Key = Key::from_static_str("container.command"); + +/// The full command run by the container as a single string representing the full command. +/// +/// # Examples +/// +/// - `otelcontribcol --config config.yaml` +pub const CONTAINER_COMMAND_LINE: Key = Key::from_static_str("container.command_line"); + +/// All the command arguments (including the command/executable itself) run by the container. +/// +/// # Examples +/// +/// - `otelcontribcol, --config, config.yaml` +pub const CONTAINER_COMMAND_ARGS: Key = Key::from_static_str("container.command_args"); + +/// Name of the [deployment environment](https://en.wikipedia.org/wiki/Deployment_environment) (aka deployment tier). +/// +/// # Examples +/// +/// - `staging` +/// - `production` +pub const DEPLOYMENT_ENVIRONMENT: Key = Key::from_static_str("deployment.environment"); + +/// A unique identifier representing the device. +/// +/// The device identifier MUST only be defined using the values outlined below. This value is not an advertising identifier and MUST NOT be used as such. On iOS (Swift or Objective-C), this value MUST be equal to the [vendor identifier](https://developer.apple.com/documentation/uikit/uidevice/1620059-identifierforvendor). On Android (Java or Kotlin), this value MUST be equal to the Firebase Installation ID or a globally unique UUID which is persisted across sessions in your application. More information can be found [here](https://developer.android.com/training/articles/user-data-ids) on best practices and exact implementation details. Caution should be taken when storing personal data or anything which can identify a user. GDPR and data protection laws may apply, ensure you do your own due diligence. +/// +/// # Examples +/// +/// - `2ab2916d-a51f-4ac8-80ee-45ac31a28092` +pub const DEVICE_ID: Key = Key::from_static_str("device.id"); + +/// The model identifier for the device. +/// +/// It's recommended this value represents a machine readable version of the model identifier rather than the market or consumer-friendly name of the device. +/// +/// # Examples +/// +/// - `iPhone3,4` +/// - `SM-G920F` +pub const DEVICE_MODEL_IDENTIFIER: Key = Key::from_static_str("device.model.identifier"); + +/// The marketing name for the device model. +/// +/// It's recommended this value represents a human readable version of the device model rather than a machine readable alternative. +/// +/// # Examples +/// +/// - `iPhone 6s Plus` +/// - `Samsung Galaxy S6` +pub const DEVICE_MODEL_NAME: Key = Key::from_static_str("device.model.name"); + +/// The name of the device manufacturer. +/// +/// The Android OS provides this field via [Build](https://developer.android.com/reference/android/os/Build#MANUFACTURER). iOS apps SHOULD hardcode the value `Apple`. +/// +/// # Examples +/// +/// - `Apple` +/// - `Samsung` +pub const DEVICE_MANUFACTURER: Key = Key::from_static_str("device.manufacturer"); + +/// The name of the single function that this runtime instance executes. +/// +/// This is the name of the function as configured/deployed on the FaaS +/// platform and is usually different from the name of the callback +/// function (which may be stored in the +/// [`code.namespace`/`code.function`](/docs/general/general-attributes.md#source-code-attributes) +/// span attributes). +/// +/// For some cloud providers, the above definition is ambiguous. The following +/// definition of function name MUST be used for this attribute +/// (and consequently the span name) for the listed cloud providers/products: +/// +/// * **Azure:** The full name `<FUNCAPP>/<FUNC>`, i.e., function app name +/// followed by a forward slash followed by the function name (this form +/// can also be seen in the resource JSON for the function). +/// This means that a span attribute MUST be used, as an Azure function +/// app can host multiple functions that would usually share +/// a TracerProvider (see also the `cloud.resource_id` attribute). +/// +/// # Examples +/// +/// - `my-function` +/// - `myazurefunctionapp/some-function-name` +pub const FAAS_NAME: Key = Key::from_static_str("faas.name"); + +/// The immutable version of the function being executed. +/// +/// Depending on the cloud provider and platform, use: +/// +/// * **AWS Lambda:** The [function version](https://docs.aws.amazon.com/lambda/latest/dg/configuration-versions.html) +/// (an integer represented as a decimal string). +/// * **Google Cloud Run (Services):** The [revision](https://cloud.google.com/run/docs/managing/revisions) +/// (i.e., the function name plus the revision suffix). +/// * **Google Cloud Functions:** The value of the +/// [`K_REVISION` environment variable](https://cloud.google.com/functions/docs/env-var#runtime_environment_variables_set_automatically). +/// * **Azure Functions:** Not applicable. Do not set this attribute. +/// +/// # Examples +/// +/// - `26` +/// - `pinkfroid-00002` +pub const FAAS_VERSION: Key = Key::from_static_str("faas.version"); + +/// The execution environment ID as a string, that will be potentially reused for other invocations to the same function/function version. +/// +/// * **AWS Lambda:** Use the (full) log stream name. +/// +/// # Examples +/// +/// - `2021/06/28/[$LATEST]2f399eb14537447da05ab2a2e39309de` +pub const FAAS_INSTANCE: Key = Key::from_static_str("faas.instance"); + +/// The amount of memory available to the serverless function converted to Bytes. +/// +/// It's recommended to set this attribute since e.g. too little memory can easily stop a Java AWS Lambda function from working correctly. On AWS Lambda, the environment variable `AWS_LAMBDA_FUNCTION_MEMORY_SIZE` provides this information (which must be multiplied by 1,048,576). +/// +/// # Examples +/// +/// - `134217728` +pub const FAAS_MAX_MEMORY: Key = Key::from_static_str("faas.max_memory"); + +/// Unique host ID. For Cloud, this must be the instance_id assigned by the cloud provider. For non-containerized systems, this should be the `machine-id`. See the table below for the sources to use to determine the `machine-id` based on operating system. +/// +/// # Examples +/// +/// - `fdbf79e8af94cb7f9e8df36789187052` +pub const HOST_ID: Key = Key::from_static_str("host.id"); + +/// Name of the host. On Unix systems, it may contain what the hostname command returns, or the fully qualified hostname, or another name specified by the user. +/// +/// # Examples +/// +/// - `opentelemetry-test` +pub const HOST_NAME: Key = Key::from_static_str("host.name"); + +/// Type of host. For Cloud, this must be the machine type. +/// +/// # Examples +/// +/// - `n1-standard-1` +pub const HOST_TYPE: Key = Key::from_static_str("host.type"); + +/// The CPU architecture the host system is running on. +pub const HOST_ARCH: Key = Key::from_static_str("host.arch"); + +/// Name of the VM image or OS install the host was instantiated from. +/// +/// # Examples +/// +/// - `infra-ami-eks-worker-node-7d4ec78312` +/// - `CentOS-8-x86_64-1905` +pub const HOST_IMAGE_NAME: Key = Key::from_static_str("host.image.name"); + +/// VM image ID or host OS image ID. For Cloud, this value is from the provider. +/// +/// # Examples +/// +/// - `ami-07b06b442921831e5` +pub const HOST_IMAGE_ID: Key = Key::from_static_str("host.image.id"); + +/// The version string of the VM image or host OS as defined in [Version Attributes](README.md#version-attributes). +/// +/// # Examples +/// +/// - `0.1` +pub const HOST_IMAGE_VERSION: Key = Key::from_static_str("host.image.version"); + +/// The name of the cluster. +/// +/// # Examples +/// +/// - `opentelemetry-cluster` +pub const K8S_CLUSTER_NAME: Key = Key::from_static_str("k8s.cluster.name"); + +/// A pseudo-ID for the cluster, set to the UID of the `kube-system` namespace. +/// +/// K8s does not have support for obtaining a cluster ID. If this is ever +/// added, we will recommend collecting the `k8s.cluster.uid` through the +/// official APIs. In the meantime, we are able to use the `uid` of the +/// `kube-system` namespace as a proxy for cluster ID. Read on for the +/// rationale. +/// +/// Every object created in a K8s cluster is assigned a distinct UID. The +/// `kube-system` namespace is used by Kubernetes itself and will exist +/// for the lifetime of the cluster. Using the `uid` of the `kube-system` +/// namespace is a reasonable proxy for the K8s ClusterID as it will only +/// change if the cluster is rebuilt. Furthermore, Kubernetes UIDs are +/// UUIDs as standardized by +/// [ISO/IEC 9834-8 and ITU-T X.667](https://www.itu.int/ITU-T/studygroups/com17/oid.html). +/// Which states: +/// +/// > If generated according to one of the mechanisms defined in Rec. +/// ITU-T X.667 | ISO/IEC 9834-8, a UUID is either guaranteed to be +/// different from all other UUIDs generated before 3603 A.D., or is +/// extremely likely to be different (depending on the mechanism chosen). +/// +/// Therefore, UIDs between clusters should be extremely unlikely to +/// conflict. +/// +/// # Examples +/// +/// - `218fc5a9-a5f1-4b54-aa05-46717d0ab26d` +pub const K8S_CLUSTER_UID: Key = Key::from_static_str("k8s.cluster.uid"); + +/// The name of the Node. +/// +/// # Examples +/// +/// - `node-1` +pub const K8S_NODE_NAME: Key = Key::from_static_str("k8s.node.name"); + +/// The UID of the Node. +/// +/// # Examples +/// +/// - `1eb3a0c6-0477-4080-a9cb-0cb7db65c6a2` +pub const K8S_NODE_UID: Key = Key::from_static_str("k8s.node.uid"); + +/// The name of the namespace that the pod is running in. +/// +/// # Examples +/// +/// - `default` +pub const K8S_NAMESPACE_NAME: Key = Key::from_static_str("k8s.namespace.name"); + +/// The UID of the Pod. +/// +/// # Examples +/// +/// - `275ecb36-5aa8-4c2a-9c47-d8bb681b9aff` +pub const K8S_POD_UID: Key = Key::from_static_str("k8s.pod.uid"); + +/// The name of the Pod. +/// +/// # Examples +/// +/// - `opentelemetry-pod-autoconf` +pub const K8S_POD_NAME: Key = Key::from_static_str("k8s.pod.name"); + +/// The name of the Container from Pod specification, must be unique within a Pod. Container runtime usually uses different globally unique name (`container.name`). +/// +/// # Examples +/// +/// - `redis` +pub const K8S_CONTAINER_NAME: Key = Key::from_static_str("k8s.container.name"); + +/// Number of times the container was restarted. This attribute can be used to identify a particular container (running or stopped) within a container spec. +/// +/// # Examples +/// +/// - `0` +/// - `2` +pub const K8S_CONTAINER_RESTART_COUNT: Key = Key::from_static_str("k8s.container.restart_count"); + +/// The UID of the ReplicaSet. +/// +/// # Examples +/// +/// - `275ecb36-5aa8-4c2a-9c47-d8bb681b9aff` +pub const K8S_REPLICASET_UID: Key = Key::from_static_str("k8s.replicaset.uid"); + +/// The name of the ReplicaSet. +/// +/// # Examples +/// +/// - `opentelemetry` +pub const K8S_REPLICASET_NAME: Key = Key::from_static_str("k8s.replicaset.name"); + +/// The UID of the Deployment. +/// +/// # Examples +/// +/// - `275ecb36-5aa8-4c2a-9c47-d8bb681b9aff` +pub const K8S_DEPLOYMENT_UID: Key = Key::from_static_str("k8s.deployment.uid"); + +/// The name of the Deployment. +/// +/// # Examples +/// +/// - `opentelemetry` +pub const K8S_DEPLOYMENT_NAME: Key = Key::from_static_str("k8s.deployment.name"); + +/// The UID of the StatefulSet. +/// +/// # Examples +/// +/// - `275ecb36-5aa8-4c2a-9c47-d8bb681b9aff` +pub const K8S_STATEFULSET_UID: Key = Key::from_static_str("k8s.statefulset.uid"); + +/// The name of the StatefulSet. +/// +/// # Examples +/// +/// - `opentelemetry` +pub const K8S_STATEFULSET_NAME: Key = Key::from_static_str("k8s.statefulset.name"); + +/// The UID of the DaemonSet. +/// +/// # Examples +/// +/// - `275ecb36-5aa8-4c2a-9c47-d8bb681b9aff` +pub const K8S_DAEMONSET_UID: Key = Key::from_static_str("k8s.daemonset.uid"); + +/// The name of the DaemonSet. +/// +/// # Examples +/// +/// - `opentelemetry` +pub const K8S_DAEMONSET_NAME: Key = Key::from_static_str("k8s.daemonset.name"); + +/// The UID of the Job. +/// +/// # Examples +/// +/// - `275ecb36-5aa8-4c2a-9c47-d8bb681b9aff` +pub const K8S_JOB_UID: Key = Key::from_static_str("k8s.job.uid"); + +/// The name of the Job. +/// +/// # Examples +/// +/// - `opentelemetry` +pub const K8S_JOB_NAME: Key = Key::from_static_str("k8s.job.name"); + +/// The UID of the CronJob. +/// +/// # Examples +/// +/// - `275ecb36-5aa8-4c2a-9c47-d8bb681b9aff` +pub const K8S_CRONJOB_UID: Key = Key::from_static_str("k8s.cronjob.uid"); + +/// The name of the CronJob. +/// +/// # Examples +/// +/// - `opentelemetry` +pub const K8S_CRONJOB_NAME: Key = Key::from_static_str("k8s.cronjob.name"); + +/// The operating system type. +pub const OS_TYPE: Key = Key::from_static_str("os.type"); + +/// Human readable (not intended to be parsed) OS version information, like e.g. reported by `ver` or `lsb_release -a` commands. +/// +/// # Examples +/// +/// - `Microsoft Windows [Version 10.0.18363.778]` +/// - `Ubuntu 18.04.1 LTS` +pub const OS_DESCRIPTION: Key = Key::from_static_str("os.description"); + +/// Human readable operating system name. +/// +/// # Examples +/// +/// - `iOS` +/// - `Android` +/// - `Ubuntu` +pub const OS_NAME: Key = Key::from_static_str("os.name"); + +/// The version string of the operating system as defined in [Version Attributes](/docs/resource/README.md#version-attributes). +/// +/// # Examples +/// +/// - `14.2.1` +/// - `18.04.1` +pub const OS_VERSION: Key = Key::from_static_str("os.version"); + +/// Process identifier (PID). +/// +/// # Examples +/// +/// - `1234` +pub const PROCESS_PID: Key = Key::from_static_str("process.pid"); + +/// Parent Process identifier (PID). +/// +/// # Examples +/// +/// - `111` +pub const PROCESS_PARENT_PID: Key = Key::from_static_str("process.parent_pid"); + +/// The name of the process executable. On Linux based systems, can be set to the `Name` in `proc/[pid]/status`. On Windows, can be set to the base name of `GetProcessImageFileNameW`. +/// +/// # Examples +/// +/// - `otelcol` +pub const PROCESS_EXECUTABLE_NAME: Key = Key::from_static_str("process.executable.name"); + +/// The full path to the process executable. On Linux based systems, can be set to the target of `proc/[pid]/exe`. On Windows, can be set to the result of `GetProcessImageFileNameW`. +/// +/// # Examples +/// +/// - `/usr/bin/cmd/otelcol` +pub const PROCESS_EXECUTABLE_PATH: Key = Key::from_static_str("process.executable.path"); + +/// The command used to launch the process (i.e. the command name). On Linux based systems, can be set to the zeroth string in `proc/[pid]/cmdline`. On Windows, can be set to the first parameter extracted from `GetCommandLineW`. +/// +/// # Examples +/// +/// - `cmd/otelcol` +pub const PROCESS_COMMAND: Key = Key::from_static_str("process.command"); + +/// The full command used to launch the process as a single string representing the full command. On Windows, can be set to the result of `GetCommandLineW`. Do not set this if you have to assemble it just for monitoring; use `process.command_args` instead. +/// +/// # Examples +/// +/// - `C:\cmd\otecol --config="my directory\config.yaml"` +pub const PROCESS_COMMAND_LINE: Key = Key::from_static_str("process.command_line"); + +/// All the command arguments (including the command/executable itself) as received by the process. On Linux-based systems (and some other Unixoid systems supporting procfs), can be set according to the list of null-delimited strings extracted from `proc/[pid]/cmdline`. For libc-based executables, this would be the full argv vector passed to `main`. +/// +/// # Examples +/// +/// - `cmd/otecol` +/// - `--config=config.yaml` +pub const PROCESS_COMMAND_ARGS: Key = Key::from_static_str("process.command_args"); + +/// The username of the user that owns the process. +/// +/// # Examples +/// +/// - `root` +pub const PROCESS_OWNER: Key = Key::from_static_str("process.owner"); + +/// The name of the runtime of this process. For compiled native binaries, this SHOULD be the name of the compiler. +/// +/// # Examples +/// +/// - `OpenJDK Runtime Environment` +pub const PROCESS_RUNTIME_NAME: Key = Key::from_static_str("process.runtime.name"); + +/// The version of the runtime of this process, as returned by the runtime without modification. +/// +/// # Examples +/// +/// - `14.0.2` +pub const PROCESS_RUNTIME_VERSION: Key = Key::from_static_str("process.runtime.version"); + +/// An additional description about the runtime of the process, for example a specific vendor customization of the runtime environment. +/// +/// # Examples +/// +/// - `Eclipse OpenJ9 Eclipse OpenJ9 VM openj9-0.21.0` +pub const PROCESS_RUNTIME_DESCRIPTION: Key = Key::from_static_str("process.runtime.description"); + +/// Logical name of the service. +/// +/// MUST be the same for all instances of horizontally scaled services. If the value was not specified, SDKs MUST fallback to `unknown_service:` concatenated with [`process.executable.name`](process.md#process), e.g. `unknown_service:bash`. If `process.executable.name` is not available, the value MUST be set to `unknown_service`. +/// +/// # Examples +/// +/// - `shoppingcart` +pub const SERVICE_NAME: Key = Key::from_static_str("service.name"); + +/// The version string of the service API or implementation. The format is not defined by these conventions. +/// +/// # Examples +/// +/// - `2.0.0` +/// - `a01dbef8a` +pub const SERVICE_VERSION: Key = Key::from_static_str("service.version"); + +/// A namespace for `service.name`. +/// +/// A string value having a meaning that helps to distinguish a group of services, for example the team name that owns a group of services. `service.name` is expected to be unique within the same namespace. If `service.namespace` is not specified in the Resource then `service.name` is expected to be unique for all services that have no explicit namespace defined (so the empty/unspecified namespace is simply one more valid namespace). Zero-length namespace string is assumed equal to unspecified namespace. +/// +/// # Examples +/// +/// - `Shop` +pub const SERVICE_NAMESPACE: Key = Key::from_static_str("service.namespace"); + +/// The string ID of the service instance. +/// +/// MUST be unique for each instance of the same `service.namespace,service.name` pair (in other words `service.namespace,service.name,service.instance.id` triplet MUST be globally unique). The ID helps to distinguish instances of the same service that exist at the same time (e.g. instances of a horizontally scaled service). It is preferable for the ID to be persistent and stay the same for the lifetime of the service instance, however it is acceptable that the ID is ephemeral and changes during important lifetime events for the service (e.g. service restarts). If the service has no inherent unique ID that can be used as the value of this attribute it is recommended to generate a random Version 1 or Version 4 RFC 4122 UUID (services aiming for reproducible UUIDs may also use Version 5, see RFC 4122 for more recommendations). +/// +/// # Examples +/// +/// - `my-k8s-pod-deployment-1` +/// - `627cc493-f310-47de-96bd-71410b7dec09` +pub const SERVICE_INSTANCE_ID: Key = Key::from_static_str("service.instance.id"); + +/// The name of the telemetry SDK as defined above. +/// +/// The OpenTelemetry SDK MUST set the `telemetry.sdk.name` attribute to `opentelemetry`. +/// If another SDK, like a fork or a vendor-provided implementation, is used, this SDK MUST set the +/// `telemetry.sdk.name` attribute to the fully-qualified class or module name of this SDK's main entry point +/// or another suitable identifier depending on the language. +/// The identifier `opentelemetry` is reserved and MUST NOT be used in this case. +/// All custom identifiers SHOULD be stable across different versions of an implementation. +/// +/// # Examples +/// +/// - `opentelemetry` +pub const TELEMETRY_SDK_NAME: Key = Key::from_static_str("telemetry.sdk.name"); + +/// The language of the telemetry SDK. +pub const TELEMETRY_SDK_LANGUAGE: Key = Key::from_static_str("telemetry.sdk.language"); + +/// The version string of the telemetry SDK. +/// +/// # Examples +/// +/// - `1.2.3` +pub const TELEMETRY_SDK_VERSION: Key = Key::from_static_str("telemetry.sdk.version"); + +/// The version string of the auto instrumentation agent, if used. +/// +/// # Examples +/// +/// - `1.2.3` +pub const TELEMETRY_AUTO_VERSION: Key = Key::from_static_str("telemetry.auto.version"); + +/// The name of the web engine. +/// +/// # Examples +/// +/// - `WildFly` +pub const WEBENGINE_NAME: Key = Key::from_static_str("webengine.name"); + +/// The version of the web engine. +/// +/// # Examples +/// +/// - `21.0.0` +pub const WEBENGINE_VERSION: Key = Key::from_static_str("webengine.version"); + +/// Additional description of the web engine (e.g. detailed version and edition information). +/// +/// # Examples +/// +/// - `WildFly Full 21.0.0.Final (WildFly Core 13.0.1.Final) - 2.2.2.Final` +pub const WEBENGINE_DESCRIPTION: Key = Key::from_static_str("webengine.description"); + +/// The name of the instrumentation scope - (`InstrumentationScope.Name` in OTLP). +/// +/// # Examples +/// +/// - `io.opentelemetry.contrib.mongodb` +pub const OTEL_SCOPE_NAME: Key = Key::from_static_str("otel.scope.name"); + +/// The version of the instrumentation scope - (`InstrumentationScope.Version` in OTLP). +/// +/// # Examples +/// +/// - `1.0.0` +pub const OTEL_SCOPE_VERSION: Key = Key::from_static_str("otel.scope.version"); + +/// Deprecated, use the `otel.scope.name` attribute. +/// +/// # Examples +/// +/// - `io.opentelemetry.contrib.mongodb` +#[deprecated] +pub const OTEL_LIBRARY_NAME: Key = Key::from_static_str("otel.library.name"); + +/// Deprecated, use the `otel.scope.version` attribute. +/// +/// # Examples +/// +/// - `1.0.0` +#[deprecated] +pub const OTEL_LIBRARY_VERSION: Key = Key::from_static_str("otel.library.version"); diff -Nru temporalio-1.3.0/vendor/opentelemetry-semantic-conventions/src/trace.rs temporalio-1.3.0/vendor/opentelemetry-semantic-conventions/src/trace.rs --- temporalio-1.3.0/vendor/opentelemetry-semantic-conventions/src/trace.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/opentelemetry-semantic-conventions/src/trace.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,1637 @@ +// DO NOT EDIT, this is an auto-generated file +// +// If you want to update the file: +// - Edit the template at scripts/templates/semantic_attributes.rs.j2 +// - Run the script at scripts/generate-consts-from-spec.sh + +//! # Trace Semantic Conventions +//! +//! The [trace semantic conventions] define a set of standardized attributes to +//! be used in `Span`s. +//! +//! [trace semantic conventions]: https://github.com/open-telemetry/opentelemetry-specification/tree/master/specification/trace/semantic_conventions +//! +//! ## Usage +//! +//! ``` +//! use opentelemetry::{global, trace::Tracer as _}; +//! use opentelemetry_semantic_conventions as semcov; +//! +//! let tracer = global::tracer("my-component"); +//! let _span = tracer +//! .span_builder("span-name") +//! .with_attributes(vec![ +//! semcov::trace::NET_PEER_NAME.string("example.org"), +//! semcov::trace::NET_PEER_PORT.i64(80), +//! ]) +//! .start(&tracer); +//! ``` + +use opentelemetry::Key; + +/// Client address - unix domain socket name, IPv4 or IPv6 address. +/// +/// When observed from the server side, and when communicating through an intermediary, `client.address` SHOULD represent client address behind any intermediaries (e.g. proxies) if it's available. +/// +/// # Examples +/// +/// - `/tmp/my.sock` +/// - `10.1.2.80` +pub const CLIENT_ADDRESS: Key = Key::from_static_str("client.address"); + +/// Client port number. +/// +/// When observed from the server side, and when communicating through an intermediary, `client.port` SHOULD represent client port behind any intermediaries (e.g. proxies) if it's available. +/// +/// # Examples +/// +/// - `65123` +pub const CLIENT_PORT: Key = Key::from_static_str("client.port"); + +/// Immediate client peer address - unix domain socket name, IPv4 or IPv6 address. +/// +/// # Examples +/// +/// - `/tmp/my.sock` +/// - `127.0.0.1` +pub const CLIENT_SOCKET_ADDRESS: Key = Key::from_static_str("client.socket.address"); + +/// Immediate client peer port number. +/// +/// # Examples +/// +/// - `35555` +pub const CLIENT_SOCKET_PORT: Key = Key::from_static_str("client.socket.port"); + +/// Deprecated, use `http.request.method` instead. +/// +/// # Examples +/// +/// - `GET` +/// - `POST` +/// - `HEAD` +#[deprecated] +pub const HTTP_METHOD: Key = Key::from_static_str("http.method"); + +/// Deprecated, use `http.response.status_code` instead. +/// +/// # Examples +/// +/// - `200` +#[deprecated] +pub const HTTP_STATUS_CODE: Key = Key::from_static_str("http.status_code"); + +/// Deprecated, use `url.scheme` instead. +/// +/// # Examples +/// +/// - `http` +/// - `https` +#[deprecated] +pub const HTTP_SCHEME: Key = Key::from_static_str("http.scheme"); + +/// Deprecated, use `url.full` instead. +/// +/// # Examples +/// +/// - `https://www.foo.bar/search?q=OpenTelemetry#SemConv` +#[deprecated] +pub const HTTP_URL: Key = Key::from_static_str("http.url"); + +/// Deprecated, use `url.path` and `url.query` instead. +/// +/// # Examples +/// +/// - `/search?q=OpenTelemetry#SemConv` +#[deprecated] +pub const HTTP_TARGET: Key = Key::from_static_str("http.target"); + +/// Deprecated, use `http.request.body.size` instead. +/// +/// # Examples +/// +/// - `3495` +#[deprecated] +pub const HTTP_REQUEST_CONTENT_LENGTH: Key = Key::from_static_str("http.request_content_length"); + +/// Deprecated, use `http.response.body.size` instead. +/// +/// # Examples +/// +/// - `3495` +#[deprecated] +pub const HTTP_RESPONSE_CONTENT_LENGTH: Key = Key::from_static_str("http.response_content_length"); + +/// Deprecated, use `server.socket.domain` on client spans. +/// +/// # Examples +/// +/// - `/var/my.sock` +#[deprecated] +pub const NET_SOCK_PEER_NAME: Key = Key::from_static_str("net.sock.peer.name"); + +/// Deprecated, use `server.socket.address` on client spans and `client.socket.address` on server spans. +/// +/// # Examples +/// +/// - `192.168.0.1` +#[deprecated] +pub const NET_SOCK_PEER_ADDR: Key = Key::from_static_str("net.sock.peer.addr"); + +/// Deprecated, use `server.socket.port` on client spans and `client.socket.port` on server spans. +/// +/// # Examples +/// +/// - `65531` +#[deprecated] +pub const NET_SOCK_PEER_PORT: Key = Key::from_static_str("net.sock.peer.port"); + +/// Deprecated, use `server.address` on client spans and `client.address` on server spans. +/// +/// # Examples +/// +/// - `example.com` +#[deprecated] +pub const NET_PEER_NAME: Key = Key::from_static_str("net.peer.name"); + +/// Deprecated, use `server.port` on client spans and `client.port` on server spans. +/// +/// # Examples +/// +/// - `8080` +#[deprecated] +pub const NET_PEER_PORT: Key = Key::from_static_str("net.peer.port"); + +/// Deprecated, use `server.address`. +/// +/// # Examples +/// +/// - `example.com` +#[deprecated] +pub const NET_HOST_NAME: Key = Key::from_static_str("net.host.name"); + +/// Deprecated, use `server.port`. +/// +/// # Examples +/// +/// - `8080` +#[deprecated] +pub const NET_HOST_PORT: Key = Key::from_static_str("net.host.port"); + +/// Deprecated, use `server.socket.address`. +/// +/// # Examples +/// +/// - `/var/my.sock` +#[deprecated] +pub const NET_SOCK_HOST_ADDR: Key = Key::from_static_str("net.sock.host.addr"); + +/// Deprecated, use `server.socket.port`. +/// +/// # Examples +/// +/// - `8080` +#[deprecated] +pub const NET_SOCK_HOST_PORT: Key = Key::from_static_str("net.sock.host.port"); + +/// Deprecated, use `network.transport`. +#[deprecated] +pub const NET_TRANSPORT: Key = Key::from_static_str("net.transport"); + +/// Deprecated, use `network.protocol.name`. +/// +/// # Examples +/// +/// - `amqp` +/// - `http` +/// - `mqtt` +#[deprecated] +pub const NET_PROTOCOL_NAME: Key = Key::from_static_str("net.protocol.name"); + +/// Deprecated, use `network.protocol.version`. +/// +/// # Examples +/// +/// - `3.1.1` +#[deprecated] +pub const NET_PROTOCOL_VERSION: Key = Key::from_static_str("net.protocol.version"); + +/// Deprecated, use `network.transport` and `network.type`. +#[deprecated] +pub const NET_SOCK_FAMILY: Key = Key::from_static_str("net.sock.family"); + +/// The domain name of the destination system. +/// +/// This value may be a host name, a fully qualified domain name, or another host naming format. +/// +/// # Examples +/// +/// - `foo.example.com` +pub const DESTINATION_DOMAIN: Key = Key::from_static_str("destination.domain"); + +/// Peer address, for example IP address or UNIX socket name. +/// +/// # Examples +/// +/// - `10.5.3.2` +pub const DESTINATION_ADDRESS: Key = Key::from_static_str("destination.address"); + +/// Peer port number. +/// +/// # Examples +/// +/// - `3389` +/// - `2888` +pub const DESTINATION_PORT: Key = Key::from_static_str("destination.port"); + +/// The type of the exception (its fully-qualified class name, if applicable). The dynamic type of the exception should be preferred over the static type in languages that support it. +/// +/// # Examples +/// +/// - `java.net.ConnectException` +/// - `OSError` +pub const EXCEPTION_TYPE: Key = Key::from_static_str("exception.type"); + +/// The exception message. +/// +/// # Examples +/// +/// - `Division by zero` +/// - `Can't convert 'int' object to str implicitly` +pub const EXCEPTION_MESSAGE: Key = Key::from_static_str("exception.message"); + +/// A stacktrace as a string in the natural representation for the language runtime. The representation is to be determined and documented by each language SIG. +/// +/// # Examples +/// +/// - `Exception in thread "main" java.lang.RuntimeException: Test exception\n at com.example.GenerateTrace.methodB(GenerateTrace.java:13)\n at com.example.GenerateTrace.methodA(GenerateTrace.java:9)\n at com.example.GenerateTrace.main(GenerateTrace.java:5)` +pub const EXCEPTION_STACKTRACE: Key = Key::from_static_str("exception.stacktrace"); + +/// HTTP request method. +/// +/// HTTP request method value SHOULD be "known" to the instrumentation. +/// By default, this convention defines "known" methods as the ones listed in [RFC9110](https://www.rfc-editor.org/rfc/rfc9110.html#name-methods) +/// and the PATCH method defined in [RFC5789](https://www.rfc-editor.org/rfc/rfc5789.html). +/// +/// If the HTTP request method is not known to instrumentation, it MUST set the `http.request.method` attribute to `_OTHER` and, except if reporting a metric, MUST +/// set the exact method received in the request line as value of the `http.request.method_original` attribute. +/// +/// If the HTTP instrumentation could end up converting valid HTTP request methods to `_OTHER`, then it MUST provide a way to override +/// the list of known HTTP methods. If this override is done via environment variable, then the environment variable MUST be named +/// OTEL_INSTRUMENTATION_HTTP_KNOWN_METHODS and support a comma-separated list of case-sensitive known HTTP methods +/// (this list MUST be a full override of the default known method, it is not a list of known methods in addition to the defaults). +/// +/// HTTP method names are case-sensitive and `http.request.method` attribute value MUST match a known HTTP method name exactly. +/// Instrumentations for specific web frameworks that consider HTTP methods to be case insensitive, SHOULD populate a canonical equivalent. +/// Tracing instrumentations that do so, MUST also set `http.request.method_original` to the original value. +/// +/// # Examples +/// +/// - `GET` +/// - `POST` +/// - `HEAD` +pub const HTTP_REQUEST_METHOD: Key = Key::from_static_str("http.request.method"); + +/// [HTTP response status code](https://tools.ietf.org/html/rfc7231#section-6). +/// +/// # Examples +/// +/// - `200` +pub const HTTP_RESPONSE_STATUS_CODE: Key = Key::from_static_str("http.response.status_code"); + +/// The matched route (path template in the format used by the respective server framework). See note below. +/// +/// MUST NOT be populated when this is not supported by the HTTP server framework as the route attribute should have low-cardinality and the URI path can NOT substitute it. +/// SHOULD include the [application root](/docs/http/http-spans.md#http-server-definitions) if there is one. +/// +/// # Examples +/// +/// - `/users/:userID?` +/// - `{controller}/{action}/{id?}` +pub const HTTP_ROUTE: Key = Key::from_static_str("http.route"); + +/// The name identifies the event. +/// +/// # Examples +/// +/// - `click` +/// - `exception` +pub const EVENT_NAME: Key = Key::from_static_str("event.name"); + +/// The domain identifies the business context for the events. +/// +/// Events across different domains may have same `event.name`, yet be +/// unrelated events. +pub const EVENT_DOMAIN: Key = Key::from_static_str("event.domain"); + +/// A unique identifier for the Log Record. +/// +/// If an id is provided, other log records with the same id will be considered duplicates and can be removed safely. This means, that two distinguishable log records MUST have different values. +/// The id MAY be an [Universally Unique Lexicographically Sortable Identifier (ULID)](https://github.com/ulid/spec), but other identifiers (e.g. UUID) may be used as needed. +/// +/// # Examples +/// +/// - `01ARZ3NDEKTSV4RRFFQ69G5FAV` +pub const LOG_RECORD_UID: Key = Key::from_static_str("log.record.uid"); + +/// The stream associated with the log. See below for a list of well-known values. +pub const LOG_IOSTREAM: Key = Key::from_static_str("log.iostream"); + +/// The basename of the file. +/// +/// # Examples +/// +/// - `audit.log` +pub const LOG_FILE_NAME: Key = Key::from_static_str("log.file.name"); + +/// The full path to the file. +/// +/// # Examples +/// +/// - `/var/log/mysql/audit.log` +pub const LOG_FILE_PATH: Key = Key::from_static_str("log.file.path"); + +/// The basename of the file, with symlinks resolved. +/// +/// # Examples +/// +/// - `uuid.log` +pub const LOG_FILE_NAME_RESOLVED: Key = Key::from_static_str("log.file.name_resolved"); + +/// The full path to the file, with symlinks resolved. +/// +/// # Examples +/// +/// - `/var/lib/docker/uuid.log` +pub const LOG_FILE_PATH_RESOLVED: Key = Key::from_static_str("log.file.path_resolved"); + +/// The type of memory. +/// +/// # Examples +/// +/// - `heap` +/// - `non_heap` +pub const TYPE: Key = Key::from_static_str("type"); + +/// Name of the memory pool. +/// +/// Pool names are generally obtained via [MemoryPoolMXBean#getName()](https://docs.oracle.com/en/java/javase/11/docs/api/java.management/java/lang/management/MemoryPoolMXBean.html#getName()). +/// +/// # Examples +/// +/// - `G1 Old Gen` +/// - `G1 Eden space` +/// - `G1 Survivor Space` +pub const POOL: Key = Key::from_static_str("pool"); + +/// Logical server hostname, matches server FQDN if available, and IP or socket address if FQDN is not known. +/// +/// # Examples +/// +/// - `example.com` +pub const SERVER_ADDRESS: Key = Key::from_static_str("server.address"); + +/// Logical server port number. +/// +/// # Examples +/// +/// - `80` +/// - `8080` +/// - `443` +pub const SERVER_PORT: Key = Key::from_static_str("server.port"); + +/// The domain name of an immediate peer. +/// +/// Typically observed from the client side, and represents a proxy or other intermediary domain name. +/// +/// # Examples +/// +/// - `proxy.example.com` +pub const SERVER_SOCKET_DOMAIN: Key = Key::from_static_str("server.socket.domain"); + +/// Physical server IP address or Unix socket address. If set from the client, should simply use the socket's peer address, and not attempt to find any actual server IP (i.e., if set from client, this may represent some proxy server instead of the logical server). +/// +/// # Examples +/// +/// - `10.5.3.2` +pub const SERVER_SOCKET_ADDRESS: Key = Key::from_static_str("server.socket.address"); + +/// Physical server port. +/// +/// # Examples +/// +/// - `16456` +pub const SERVER_SOCKET_PORT: Key = Key::from_static_str("server.socket.port"); + +/// The domain name of the source system. +/// +/// This value may be a host name, a fully qualified domain name, or another host naming format. +/// +/// # Examples +/// +/// - `foo.example.com` +pub const SOURCE_DOMAIN: Key = Key::from_static_str("source.domain"); + +/// Source address, for example IP address or Unix socket name. +/// +/// # Examples +/// +/// - `10.5.3.2` +pub const SOURCE_ADDRESS: Key = Key::from_static_str("source.address"); + +/// Source port number. +/// +/// # Examples +/// +/// - `3389` +/// - `2888` +pub const SOURCE_PORT: Key = Key::from_static_str("source.port"); + +/// The full invoked ARN as provided on the `Context` passed to the function (`Lambda-Runtime-Invoked-Function-Arn` header on the `/runtime/invocation/next` applicable). +/// +/// This may be different from `cloud.resource_id` if an alias is involved. +/// +/// # Examples +/// +/// - `arn:aws:lambda:us-east-1:123456:function:myfunction:myalias` +pub const AWS_LAMBDA_INVOKED_ARN: Key = Key::from_static_str("aws.lambda.invoked_arn"); + +/// The [event_id](https://github.com/cloudevents/spec/blob/v1.0.2/cloudevents/spec.md#id) uniquely identifies the event. +/// +/// # Examples +/// +/// - `123e4567-e89b-12d3-a456-426614174000` +/// - `0001` +pub const CLOUDEVENTS_EVENT_ID: Key = Key::from_static_str("cloudevents.event_id"); + +/// The [source](https://github.com/cloudevents/spec/blob/v1.0.2/cloudevents/spec.md#source-1) identifies the context in which an event happened. +/// +/// # Examples +/// +/// - `https://github.com/cloudevents` +/// - `/cloudevents/spec/pull/123` +/// - `my-service` +pub const CLOUDEVENTS_EVENT_SOURCE: Key = Key::from_static_str("cloudevents.event_source"); + +/// The [version of the CloudEvents specification](https://github.com/cloudevents/spec/blob/v1.0.2/cloudevents/spec.md#specversion) which the event uses. +/// +/// # Examples +/// +/// - `1.0` +pub const CLOUDEVENTS_EVENT_SPEC_VERSION: Key = + Key::from_static_str("cloudevents.event_spec_version"); + +/// The [event_type](https://github.com/cloudevents/spec/blob/v1.0.2/cloudevents/spec.md#type) contains a value describing the type of event related to the originating occurrence. +/// +/// # Examples +/// +/// - `com.github.pull_request.opened` +/// - `com.example.object.deleted.v2` +pub const CLOUDEVENTS_EVENT_TYPE: Key = Key::from_static_str("cloudevents.event_type"); + +/// The [subject](https://github.com/cloudevents/spec/blob/v1.0.2/cloudevents/spec.md#subject) of the event in the context of the event producer (identified by source). +/// +/// # Examples +/// +/// - `mynewfile.jpg` +pub const CLOUDEVENTS_EVENT_SUBJECT: Key = Key::from_static_str("cloudevents.event_subject"); + +/// Parent-child Reference type. +/// +/// The causal relationship between a child Span and a parent Span. +pub const OPENTRACING_REF_TYPE: Key = Key::from_static_str("opentracing.ref_type"); + +/// An identifier for the database management system (DBMS) product being used. See below for a list of well-known identifiers. +pub const DB_SYSTEM: Key = Key::from_static_str("db.system"); + +/// The connection string used to connect to the database. It is recommended to remove embedded credentials. +/// +/// # Examples +/// +/// - `Server=(localdb)\v11.0;Integrated Security=true;` +pub const DB_CONNECTION_STRING: Key = Key::from_static_str("db.connection_string"); + +/// Username for accessing the database. +/// +/// # Examples +/// +/// - `readonly_user` +/// - `reporting_user` +pub const DB_USER: Key = Key::from_static_str("db.user"); + +/// The fully-qualified class name of the [Java Database Connectivity (JDBC)](https://docs.oracle.com/javase/8/docs/technotes/guides/jdbc/) driver used to connect. +/// +/// # Examples +/// +/// - `org.postgresql.Driver` +/// - `com.microsoft.sqlserver.jdbc.SQLServerDriver` +pub const DB_JDBC_DRIVER_CLASSNAME: Key = Key::from_static_str("db.jdbc.driver_classname"); + +/// This attribute is used to report the name of the database being accessed. For commands that switch the database, this should be set to the target database (even if the command fails). +/// +/// In some SQL databases, the database name to be used is called "schema name". In case there are multiple layers that could be considered for database name (e.g. Oracle instance name and schema name), the database name to be used is the more specific layer (e.g. Oracle schema name). +/// +/// # Examples +/// +/// - `customers` +/// - `main` +pub const DB_NAME: Key = Key::from_static_str("db.name"); + +/// The database statement being executed. +/// +/// # Examples +/// +/// - `SELECT * FROM wuser_table` +/// - `SET mykey "WuValue"` +pub const DB_STATEMENT: Key = Key::from_static_str("db.statement"); + +/// The name of the operation being executed, e.g. the [MongoDB command name](https://docs.mongodb.com/manual/reference/command/#database-operations) such as `findAndModify`, or the SQL keyword. +/// +/// When setting this to an SQL keyword, it is not recommended to attempt any client-side parsing of `db.statement` just to get this property, but it should be set if the operation name is provided by the library being instrumented. If the SQL statement has an ambiguous operation, or performs more than one operation, this value may be omitted. +/// +/// # Examples +/// +/// - `findAndModify` +/// - `HMSET` +/// - `SELECT` +pub const DB_OPERATION: Key = Key::from_static_str("db.operation"); + +/// The Microsoft SQL Server [instance name](https://docs.microsoft.com/en-us/sql/connect/jdbc/building-the-connection-url?view=sql-server-ver15) connecting to. This name is used to determine the port of a named instance. +/// +/// If setting a `db.mssql.instance_name`, `server.port` is no longer required (but still recommended if non-standard). +/// +/// # Examples +/// +/// - `MSSQLSERVER` +pub const DB_MSSQL_INSTANCE_NAME: Key = Key::from_static_str("db.mssql.instance_name"); + +/// The fetch size used for paging, i.e. how many rows will be returned at once. +/// +/// # Examples +/// +/// - `5000` +pub const DB_CASSANDRA_PAGE_SIZE: Key = Key::from_static_str("db.cassandra.page_size"); + +/// The consistency level of the query. Based on consistency values from [CQL](https://docs.datastax.com/en/cassandra-oss/3.0/cassandra/dml/dmlConfigConsistency.html). +pub const DB_CASSANDRA_CONSISTENCY_LEVEL: Key = + Key::from_static_str("db.cassandra.consistency_level"); + +/// The name of the primary table that the operation is acting upon, including the keyspace name (if applicable). +/// +/// This mirrors the db.sql.table attribute but references cassandra rather than sql. It is not recommended to attempt any client-side parsing of `db.statement` just to get this property, but it should be set if it is provided by the library being instrumented. If the operation is acting upon an anonymous table, or more than one table, this value MUST NOT be set. +/// +/// # Examples +/// +/// - `mytable` +pub const DB_CASSANDRA_TABLE: Key = Key::from_static_str("db.cassandra.table"); + +/// Whether or not the query is idempotent. +pub const DB_CASSANDRA_IDEMPOTENCE: Key = Key::from_static_str("db.cassandra.idempotence"); + +/// The number of times a query was speculatively executed. Not set or `0` if the query was not executed speculatively. +/// +/// # Examples +/// +/// - `0` +/// - `2` +pub const DB_CASSANDRA_SPECULATIVE_EXECUTION_COUNT: Key = + Key::from_static_str("db.cassandra.speculative_execution_count"); + +/// The ID of the coordinating node for a query. +/// +/// # Examples +/// +/// - `be13faa2-8574-4d71-926d-27f16cf8a7af` +pub const DB_CASSANDRA_COORDINATOR_ID: Key = Key::from_static_str("db.cassandra.coordinator.id"); + +/// The data center of the coordinating node for a query. +/// +/// # Examples +/// +/// - `us-west-2` +pub const DB_CASSANDRA_COORDINATOR_DC: Key = Key::from_static_str("db.cassandra.coordinator.dc"); + +/// The index of the database being accessed as used in the [`SELECT` command](https://redis.io/commands/select), provided as an integer. To be used instead of the generic `db.name` attribute. +/// +/// # Examples +/// +/// - `0` +/// - `1` +/// - `15` +pub const DB_REDIS_DATABASE_INDEX: Key = Key::from_static_str("db.redis.database_index"); + +/// The collection being accessed within the database stated in `db.name`. +/// +/// # Examples +/// +/// - `customers` +/// - `products` +pub const DB_MONGODB_COLLECTION: Key = Key::from_static_str("db.mongodb.collection"); + +/// The name of the primary table that the operation is acting upon, including the database name (if applicable). +/// +/// It is not recommended to attempt any client-side parsing of `db.statement` just to get this property, but it should be set if it is provided by the library being instrumented. If the operation is acting upon an anonymous table, or more than one table, this value MUST NOT be set. +/// +/// # Examples +/// +/// - `public.users` +/// - `customers` +pub const DB_SQL_TABLE: Key = Key::from_static_str("db.sql.table"); + +/// Unique Cosmos client instance id. +/// +/// # Examples +/// +/// - `3ba4827d-4422-483f-b59f-85b74211c11d` +pub const DB_COSMOSDB_CLIENT_ID: Key = Key::from_static_str("db.cosmosdb.client_id"); + +/// CosmosDB Operation Type. +pub const DB_COSMOSDB_OPERATION_TYPE: Key = Key::from_static_str("db.cosmosdb.operation_type"); + +/// Cosmos client connection mode. +pub const DB_COSMOSDB_CONNECTION_MODE: Key = Key::from_static_str("db.cosmosdb.connection_mode"); + +/// Cosmos DB container name. +/// +/// # Examples +/// +/// - `anystring` +pub const DB_COSMOSDB_CONTAINER: Key = Key::from_static_str("db.cosmosdb.container"); + +/// Request payload size in bytes. +pub const DB_COSMOSDB_REQUEST_CONTENT_LENGTH: Key = + Key::from_static_str("db.cosmosdb.request_content_length"); + +/// Cosmos DB status code. +/// +/// # Examples +/// +/// - `200` +/// - `201` +pub const DB_COSMOSDB_STATUS_CODE: Key = Key::from_static_str("db.cosmosdb.status_code"); + +/// Cosmos DB sub status code. +/// +/// # Examples +/// +/// - `1000` +/// - `1002` +pub const DB_COSMOSDB_SUB_STATUS_CODE: Key = Key::from_static_str("db.cosmosdb.sub_status_code"); + +/// RU consumed for that operation. +/// +/// # Examples +/// +/// - `46.18` +/// - `1.0` +pub const DB_COSMOSDB_REQUEST_CHARGE: Key = Key::from_static_str("db.cosmosdb.request_charge"); + +/// Name of the code, either "OK" or "ERROR". MUST NOT be set if the status code is UNSET. +pub const OTEL_STATUS_CODE: Key = Key::from_static_str("otel.status_code"); + +/// Description of the Status if it has a value, otherwise not set. +/// +/// # Examples +/// +/// - `resource not found` +pub const OTEL_STATUS_DESCRIPTION: Key = Key::from_static_str("otel.status_description"); + +/// Type of the trigger which caused this function invocation. +/// +/// For the server/consumer span on the incoming side, +/// `faas.trigger` MUST be set. +/// +/// Clients invoking FaaS instances usually cannot set `faas.trigger`, +/// since they would typically need to look in the payload to determine +/// the event type. If clients set it, it should be the same as the +/// trigger that corresponding incoming would have (i.e., this has +/// nothing to do with the underlying transport used to make the API +/// call to invoke the lambda, which is often HTTP). +pub const FAAS_TRIGGER: Key = Key::from_static_str("faas.trigger"); + +/// The invocation ID of the current function invocation. +/// +/// # Examples +/// +/// - `af9d5aa4-a685-4c5f-a22b-444f80b3cc28` +pub const FAAS_INVOCATION_ID: Key = Key::from_static_str("faas.invocation_id"); + +/// The name of the source on which the triggering operation was performed. For example, in Cloud Storage or S3 corresponds to the bucket name, and in Cosmos DB to the database name. +/// +/// # Examples +/// +/// - `myBucketName` +/// - `myDbName` +pub const FAAS_DOCUMENT_COLLECTION: Key = Key::from_static_str("faas.document.collection"); + +/// Describes the type of the operation that was performed on the data. +pub const FAAS_DOCUMENT_OPERATION: Key = Key::from_static_str("faas.document.operation"); + +/// A string containing the time when the data was accessed in the [ISO 8601](https://www.iso.org/iso-8601-date-and-time-format.html) format expressed in [UTC](https://www.w3.org/TR/NOTE-datetime). +/// +/// # Examples +/// +/// - `2020-01-23T13:47:06Z` +pub const FAAS_DOCUMENT_TIME: Key = Key::from_static_str("faas.document.time"); + +/// The document name/table subjected to the operation. For example, in Cloud Storage or S3 is the name of the file, and in Cosmos DB the table name. +/// +/// # Examples +/// +/// - `myFile.txt` +/// - `myTableName` +pub const FAAS_DOCUMENT_NAME: Key = Key::from_static_str("faas.document.name"); + +/// A string containing the function invocation time in the [ISO 8601](https://www.iso.org/iso-8601-date-and-time-format.html) format expressed in [UTC](https://www.w3.org/TR/NOTE-datetime). +/// +/// # Examples +/// +/// - `2020-01-23T13:47:06Z` +pub const FAAS_TIME: Key = Key::from_static_str("faas.time"); + +/// A string containing the schedule period as [Cron Expression](https://docs.oracle.com/cd/E12058_01/doc/doc.1014/e12030/cron_expressions.htm). +/// +/// # Examples +/// +/// - `0/5 * * * ? *` +pub const FAAS_CRON: Key = Key::from_static_str("faas.cron"); + +/// A boolean that is true if the serverless function is executed for the first time (aka cold-start). +pub const FAAS_COLDSTART: Key = Key::from_static_str("faas.coldstart"); + +/// The name of the invoked function. +/// +/// SHOULD be equal to the `faas.name` resource attribute of the invoked function. +/// +/// # Examples +/// +/// - `my-function` +pub const FAAS_INVOKED_NAME: Key = Key::from_static_str("faas.invoked_name"); + +/// The cloud provider of the invoked function. +/// +/// SHOULD be equal to the `cloud.provider` resource attribute of the invoked function. +pub const FAAS_INVOKED_PROVIDER: Key = Key::from_static_str("faas.invoked_provider"); + +/// The cloud region of the invoked function. +/// +/// SHOULD be equal to the `cloud.region` resource attribute of the invoked function. +/// +/// # Examples +/// +/// - `eu-central-1` +pub const FAAS_INVOKED_REGION: Key = Key::from_static_str("faas.invoked_region"); + +/// The unique identifier of the feature flag. +/// +/// # Examples +/// +/// - `logo-color` +pub const FEATURE_FLAG_KEY: Key = Key::from_static_str("feature_flag.key"); + +/// The name of the service provider that performs the flag evaluation. +/// +/// # Examples +/// +/// - `Flag Manager` +pub const FEATURE_FLAG_PROVIDER_NAME: Key = Key::from_static_str("feature_flag.provider_name"); + +/// SHOULD be a semantic identifier for a value. If one is unavailable, a stringified version of the value can be used. +/// +/// A semantic identifier, commonly referred to as a variant, provides a means +/// for referring to a value without including the value itself. This can +/// provide additional context for understanding the meaning behind a value. +/// For example, the variant `red` maybe be used for the value `#c05543`. +/// +/// A stringified version of the value can be used in situations where a +/// semantic identifier is unavailable. String representation of the value +/// should be determined by the implementer. +/// +/// # Examples +/// +/// - `red` +/// - `true` +/// - `on` +pub const FEATURE_FLAG_VARIANT: Key = Key::from_static_str("feature_flag.variant"); + +/// [OSI Transport Layer](https://osi-model.com/transport-layer/) or [Inter-process Communication method](https://en.wikipedia.org/wiki/Inter-process_communication). The value SHOULD be normalized to lowercase. +/// +/// # Examples +/// +/// - `tcp` +/// - `udp` +pub const NETWORK_TRANSPORT: Key = Key::from_static_str("network.transport"); + +/// [OSI Network Layer](https://osi-model.com/network-layer/) or non-OSI equivalent. The value SHOULD be normalized to lowercase. +/// +/// # Examples +/// +/// - `ipv4` +/// - `ipv6` +pub const NETWORK_TYPE: Key = Key::from_static_str("network.type"); + +/// [OSI Application Layer](https://osi-model.com/application-layer/) or non-OSI equivalent. The value SHOULD be normalized to lowercase. +/// +/// # Examples +/// +/// - `amqp` +/// - `http` +/// - `mqtt` +pub const NETWORK_PROTOCOL_NAME: Key = Key::from_static_str("network.protocol.name"); + +/// Version of the application layer protocol used. See note below. +/// +/// `network.protocol.version` refers to the version of the protocol used and might be different from the protocol client's version. If the HTTP client used has a version of `0.27.2`, but sends HTTP version `1.1`, this attribute should be set to `1.1`. +/// +/// # Examples +/// +/// - `3.1.1` +pub const NETWORK_PROTOCOL_VERSION: Key = Key::from_static_str("network.protocol.version"); + +/// The internet connection type. +/// +/// # Examples +/// +/// - `wifi` +pub const NETWORK_CONNECTION_TYPE: Key = Key::from_static_str("network.connection.type"); + +/// This describes more details regarding the connection.type. It may be the type of cell technology connection, but it could be used for describing details about a wifi connection. +/// +/// # Examples +/// +/// - `LTE` +pub const NETWORK_CONNECTION_SUBTYPE: Key = Key::from_static_str("network.connection.subtype"); + +/// The name of the mobile carrier. +/// +/// # Examples +/// +/// - `sprint` +pub const NETWORK_CARRIER_NAME: Key = Key::from_static_str("network.carrier.name"); + +/// The mobile carrier country code. +/// +/// # Examples +/// +/// - `310` +pub const NETWORK_CARRIER_MCC: Key = Key::from_static_str("network.carrier.mcc"); + +/// The mobile carrier network code. +/// +/// # Examples +/// +/// - `001` +pub const NETWORK_CARRIER_MNC: Key = Key::from_static_str("network.carrier.mnc"); + +/// The ISO 3166-1 alpha-2 2-character country code associated with the mobile carrier network. +/// +/// # Examples +/// +/// - `DE` +pub const NETWORK_CARRIER_ICC: Key = Key::from_static_str("network.carrier.icc"); + +/// The [`service.name`](/docs/resource/README.md#service) of the remote service. SHOULD be equal to the actual `service.name` resource attribute of the remote service if any. +/// +/// # Examples +/// +/// - `AuthTokenCache` +pub const PEER_SERVICE: Key = Key::from_static_str("peer.service"); + +/// Username or client_id extracted from the access token or [Authorization](https://tools.ietf.org/html/rfc7235#section-4.2) header in the inbound request from outside the system. +/// +/// # Examples +/// +/// - `username` +pub const ENDUSER_ID: Key = Key::from_static_str("enduser.id"); + +/// Actual/assumed role the client is making the request under extracted from token or application security context. +/// +/// # Examples +/// +/// - `admin` +pub const ENDUSER_ROLE: Key = Key::from_static_str("enduser.role"); + +/// Scopes or granted authorities the client currently possesses extracted from token or application security context. The value would come from the scope associated with an [OAuth 2.0 Access Token](https://tools.ietf.org/html/rfc6749#section-3.3) or an attribute value in a [SAML 2.0 Assertion](http://docs.oasis-open.org/security/saml/Post2.0/sstc-saml-tech-overview-2.0.html). +/// +/// # Examples +/// +/// - `read:message, write:files` +pub const ENDUSER_SCOPE: Key = Key::from_static_str("enduser.scope"); + +/// Current "managed" thread ID (as opposed to OS thread ID). +/// +/// # Examples +/// +/// - `42` +pub const THREAD_ID: Key = Key::from_static_str("thread.id"); + +/// Current thread name. +/// +/// # Examples +/// +/// - `main` +pub const THREAD_NAME: Key = Key::from_static_str("thread.name"); + +/// The method or function name, or equivalent (usually rightmost part of the code unit's name). +/// +/// # Examples +/// +/// - `serveRequest` +pub const CODE_FUNCTION: Key = Key::from_static_str("code.function"); + +/// The "namespace" within which `code.function` is defined. Usually the qualified class or module name, such that `code.namespace` + some separator + `code.function` form a unique identifier for the code unit. +/// +/// # Examples +/// +/// - `com.example.MyHttpService` +pub const CODE_NAMESPACE: Key = Key::from_static_str("code.namespace"); + +/// The source code file name that identifies the code unit as uniquely as possible (preferably an absolute file path). +/// +/// # Examples +/// +/// - `/usr/local/MyApplication/content_root/app/index.php` +pub const CODE_FILEPATH: Key = Key::from_static_str("code.filepath"); + +/// The line number in `code.filepath` best representing the operation. It SHOULD point within the code unit named in `code.function`. +/// +/// # Examples +/// +/// - `42` +pub const CODE_LINENO: Key = Key::from_static_str("code.lineno"); + +/// The column number in `code.filepath` best representing the operation. It SHOULD point within the code unit named in `code.function`. +/// +/// # Examples +/// +/// - `16` +pub const CODE_COLUMN: Key = Key::from_static_str("code.column"); + +/// Original HTTP method sent by the client in the request line. +/// +/// # Examples +/// +/// - `GeT` +/// - `ACL` +/// - `foo` +pub const HTTP_REQUEST_METHOD_ORIGINAL: Key = Key::from_static_str("http.request.method_original"); + +/// The size of the request payload body in bytes. This is the number of bytes transferred excluding headers and is often, but not always, present as the [Content-Length](https://www.rfc-editor.org/rfc/rfc9110.html#field.content-length) header. For requests using transport encoding, this should be the compressed size. +/// +/// # Examples +/// +/// - `3495` +pub const HTTP_REQUEST_BODY_SIZE: Key = Key::from_static_str("http.request.body.size"); + +/// The size of the response payload body in bytes. This is the number of bytes transferred excluding headers and is often, but not always, present as the [Content-Length](https://www.rfc-editor.org/rfc/rfc9110.html#field.content-length) header. For requests using transport encoding, this should be the compressed size. +/// +/// # Examples +/// +/// - `3495` +pub const HTTP_RESPONSE_BODY_SIZE: Key = Key::from_static_str("http.response.body.size"); + +/// The ordinal number of request resending attempt (for any reason, including redirects). +/// +/// The resend count SHOULD be updated each time an HTTP request gets resent by the client, regardless of what was the cause of the resending (e.g. redirection, authorization failure, 503 Server Unavailable, network issues, or any other). +/// +/// # Examples +/// +/// - `3` +pub const HTTP_RESEND_COUNT: Key = Key::from_static_str("http.resend_count"); + +/// The AWS request ID as returned in the response headers `x-amz-request-id` or `x-amz-requestid`. +/// +/// # Examples +/// +/// - `79b9da39-b7ae-508a-a6bc-864b2829c622` +/// - `C9ER4AJX75574TDJ` +pub const AWS_REQUEST_ID: Key = Key::from_static_str("aws.request_id"); + +/// The keys in the `RequestItems` object field. +/// +/// # Examples +/// +/// - `Users` +/// - `Cats` +pub const AWS_DYNAMODB_TABLE_NAMES: Key = Key::from_static_str("aws.dynamodb.table_names"); + +/// The JSON-serialized value of each item in the `ConsumedCapacity` response field. +/// +/// # Examples +/// +/// - `{ "CapacityUnits": number, "GlobalSecondaryIndexes": { "string" : { "CapacityUnits": number, "ReadCapacityUnits": number, "WriteCapacityUnits": number } }, "LocalSecondaryIndexes": { "string" : { "CapacityUnits": number, "ReadCapacityUnits": number, "WriteCapacityUnits": number } }, "ReadCapacityUnits": number, "Table": { "CapacityUnits": number, "ReadCapacityUnits": number, "WriteCapacityUnits": number }, "TableName": "string", "WriteCapacityUnits": number }` +pub const AWS_DYNAMODB_CONSUMED_CAPACITY: Key = + Key::from_static_str("aws.dynamodb.consumed_capacity"); + +/// The JSON-serialized value of the `ItemCollectionMetrics` response field. +/// +/// # Examples +/// +/// - `{ "string" : [ { "ItemCollectionKey": { "string" : { "B": blob, "BOOL": boolean, "BS": [ blob ], "L": [ "AttributeValue" ], "M": { "string" : "AttributeValue" }, "N": "string", "NS": [ "string" ], "NULL": boolean, "S": "string", "SS": [ "string" ] } }, "SizeEstimateRangeGB": [ number ] } ] }` +pub const AWS_DYNAMODB_ITEM_COLLECTION_METRICS: Key = + Key::from_static_str("aws.dynamodb.item_collection_metrics"); + +/// The value of the `ProvisionedThroughput.ReadCapacityUnits` request parameter. +/// +/// # Examples +/// +/// - `1.0` +/// - `2.0` +pub const AWS_DYNAMODB_PROVISIONED_READ_CAPACITY: Key = + Key::from_static_str("aws.dynamodb.provisioned_read_capacity"); + +/// The value of the `ProvisionedThroughput.WriteCapacityUnits` request parameter. +/// +/// # Examples +/// +/// - `1.0` +/// - `2.0` +pub const AWS_DYNAMODB_PROVISIONED_WRITE_CAPACITY: Key = + Key::from_static_str("aws.dynamodb.provisioned_write_capacity"); + +/// The value of the `ConsistentRead` request parameter. +pub const AWS_DYNAMODB_CONSISTENT_READ: Key = Key::from_static_str("aws.dynamodb.consistent_read"); + +/// The value of the `ProjectionExpression` request parameter. +/// +/// # Examples +/// +/// - `Title` +/// - `Title, Price, Color` +/// - `Title, Description, RelatedItems, ProductReviews` +pub const AWS_DYNAMODB_PROJECTION: Key = Key::from_static_str("aws.dynamodb.projection"); + +/// The value of the `Limit` request parameter. +/// +/// # Examples +/// +/// - `10` +pub const AWS_DYNAMODB_LIMIT: Key = Key::from_static_str("aws.dynamodb.limit"); + +/// The value of the `AttributesToGet` request parameter. +/// +/// # Examples +/// +/// - `lives` +/// - `id` +pub const AWS_DYNAMODB_ATTRIBUTES_TO_GET: Key = + Key::from_static_str("aws.dynamodb.attributes_to_get"); + +/// The value of the `IndexName` request parameter. +/// +/// # Examples +/// +/// - `name_to_group` +pub const AWS_DYNAMODB_INDEX_NAME: Key = Key::from_static_str("aws.dynamodb.index_name"); + +/// The value of the `Select` request parameter. +/// +/// # Examples +/// +/// - `ALL_ATTRIBUTES` +/// - `COUNT` +pub const AWS_DYNAMODB_SELECT: Key = Key::from_static_str("aws.dynamodb.select"); + +/// The JSON-serialized value of each item of the `GlobalSecondaryIndexes` request field. +/// +/// # Examples +/// +/// - `{ "IndexName": "string", "KeySchema": [ { "AttributeName": "string", "KeyType": "string" } ], "Projection": { "NonKeyAttributes": [ "string" ], "ProjectionType": "string" }, "ProvisionedThroughput": { "ReadCapacityUnits": number, "WriteCapacityUnits": number } }` +pub const AWS_DYNAMODB_GLOBAL_SECONDARY_INDEXES: Key = + Key::from_static_str("aws.dynamodb.global_secondary_indexes"); + +/// The JSON-serialized value of each item of the `LocalSecondaryIndexes` request field. +/// +/// # Examples +/// +/// - `{ "IndexArn": "string", "IndexName": "string", "IndexSizeBytes": number, "ItemCount": number, "KeySchema": [ { "AttributeName": "string", "KeyType": "string" } ], "Projection": { "NonKeyAttributes": [ "string" ], "ProjectionType": "string" } }` +pub const AWS_DYNAMODB_LOCAL_SECONDARY_INDEXES: Key = + Key::from_static_str("aws.dynamodb.local_secondary_indexes"); + +/// The value of the `ExclusiveStartTableName` request parameter. +/// +/// # Examples +/// +/// - `Users` +/// - `CatsTable` +pub const AWS_DYNAMODB_EXCLUSIVE_START_TABLE: Key = + Key::from_static_str("aws.dynamodb.exclusive_start_table"); + +/// The the number of items in the `TableNames` response parameter. +/// +/// # Examples +/// +/// - `20` +pub const AWS_DYNAMODB_TABLE_COUNT: Key = Key::from_static_str("aws.dynamodb.table_count"); + +/// The value of the `ScanIndexForward` request parameter. +pub const AWS_DYNAMODB_SCAN_FORWARD: Key = Key::from_static_str("aws.dynamodb.scan_forward"); + +/// The value of the `Segment` request parameter. +/// +/// # Examples +/// +/// - `10` +pub const AWS_DYNAMODB_SEGMENT: Key = Key::from_static_str("aws.dynamodb.segment"); + +/// The value of the `TotalSegments` request parameter. +/// +/// # Examples +/// +/// - `100` +pub const AWS_DYNAMODB_TOTAL_SEGMENTS: Key = Key::from_static_str("aws.dynamodb.total_segments"); + +/// The value of the `Count` response parameter. +/// +/// # Examples +/// +/// - `10` +pub const AWS_DYNAMODB_COUNT: Key = Key::from_static_str("aws.dynamodb.count"); + +/// The value of the `ScannedCount` response parameter. +/// +/// # Examples +/// +/// - `50` +pub const AWS_DYNAMODB_SCANNED_COUNT: Key = Key::from_static_str("aws.dynamodb.scanned_count"); + +/// The JSON-serialized value of each item in the `AttributeDefinitions` request field. +/// +/// # Examples +/// +/// - `{ "AttributeName": "string", "AttributeType": "string" }` +pub const AWS_DYNAMODB_ATTRIBUTE_DEFINITIONS: Key = + Key::from_static_str("aws.dynamodb.attribute_definitions"); + +/// The JSON-serialized value of each item in the the `GlobalSecondaryIndexUpdates` request field. +/// +/// # Examples +/// +/// - `{ "Create": { "IndexName": "string", "KeySchema": [ { "AttributeName": "string", "KeyType": "string" } ], "Projection": { "NonKeyAttributes": [ "string" ], "ProjectionType": "string" }, "ProvisionedThroughput": { "ReadCapacityUnits": number, "WriteCapacityUnits": number } }` +pub const AWS_DYNAMODB_GLOBAL_SECONDARY_INDEX_UPDATES: Key = + Key::from_static_str("aws.dynamodb.global_secondary_index_updates"); + +/// The S3 bucket name the request refers to. Corresponds to the `--bucket` parameter of the [S3 API](https://docs.aws.amazon.com/cli/latest/reference/s3api/index.html) operations. +/// +/// The `bucket` attribute is applicable to all S3 operations that reference a bucket, i.e. that require the bucket name as a mandatory parameter. +/// This applies to almost all S3 operations except `list-buckets`. +/// +/// # Examples +/// +/// - `some-bucket-name` +pub const AWS_S3_BUCKET: Key = Key::from_static_str("aws.s3.bucket"); + +/// The S3 object key the request refers to. Corresponds to the `--key` parameter of the [S3 API](https://docs.aws.amazon.com/cli/latest/reference/s3api/index.html) operations. +/// +/// The `key` attribute is applicable to all object-related S3 operations, i.e. that require the object key as a mandatory parameter. +/// This applies in particular to the following operations: +/// +/// - [copy-object](https://docs.aws.amazon.com/cli/latest/reference/s3api/copy-object.html) +/// - [delete-object](https://docs.aws.amazon.com/cli/latest/reference/s3api/delete-object.html) +/// - [get-object](https://docs.aws.amazon.com/cli/latest/reference/s3api/get-object.html) +/// - [head-object](https://docs.aws.amazon.com/cli/latest/reference/s3api/head-object.html) +/// - [put-object](https://docs.aws.amazon.com/cli/latest/reference/s3api/put-object.html) +/// - [restore-object](https://docs.aws.amazon.com/cli/latest/reference/s3api/restore-object.html) +/// - [select-object-content](https://docs.aws.amazon.com/cli/latest/reference/s3api/select-object-content.html) +/// - [abort-multipart-upload](https://docs.aws.amazon.com/cli/latest/reference/s3api/abort-multipart-upload.html) +/// - [complete-multipart-upload](https://docs.aws.amazon.com/cli/latest/reference/s3api/complete-multipart-upload.html) +/// - [create-multipart-upload](https://docs.aws.amazon.com/cli/latest/reference/s3api/create-multipart-upload.html) +/// - [list-parts](https://docs.aws.amazon.com/cli/latest/reference/s3api/list-parts.html) +/// - [upload-part](https://docs.aws.amazon.com/cli/latest/reference/s3api/upload-part.html) +/// - [upload-part-copy](https://docs.aws.amazon.com/cli/latest/reference/s3api/upload-part-copy.html) +/// +/// # Examples +/// +/// - `someFile.yml` +pub const AWS_S3_KEY: Key = Key::from_static_str("aws.s3.key"); + +/// The source object (in the form `bucket`/`key`) for the copy operation. +/// +/// The `copy_source` attribute applies to S3 copy operations and corresponds to the `--copy-source` parameter +/// of the [copy-object operation within the S3 API](https://docs.aws.amazon.com/cli/latest/reference/s3api/copy-object.html). +/// This applies in particular to the following operations: +/// +/// - [copy-object](https://docs.aws.amazon.com/cli/latest/reference/s3api/copy-object.html) +/// - [upload-part-copy](https://docs.aws.amazon.com/cli/latest/reference/s3api/upload-part-copy.html) +/// +/// # Examples +/// +/// - `someFile.yml` +pub const AWS_S3_COPY_SOURCE: Key = Key::from_static_str("aws.s3.copy_source"); + +/// Upload ID that identifies the multipart upload. +/// +/// The `upload_id` attribute applies to S3 multipart-upload operations and corresponds to the `--upload-id` parameter +/// of the [S3 API](https://docs.aws.amazon.com/cli/latest/reference/s3api/index.html) multipart operations. +/// This applies in particular to the following operations: +/// +/// - [abort-multipart-upload](https://docs.aws.amazon.com/cli/latest/reference/s3api/abort-multipart-upload.html) +/// - [complete-multipart-upload](https://docs.aws.amazon.com/cli/latest/reference/s3api/complete-multipart-upload.html) +/// - [list-parts](https://docs.aws.amazon.com/cli/latest/reference/s3api/list-parts.html) +/// - [upload-part](https://docs.aws.amazon.com/cli/latest/reference/s3api/upload-part.html) +/// - [upload-part-copy](https://docs.aws.amazon.com/cli/latest/reference/s3api/upload-part-copy.html) +/// +/// # Examples +/// +/// - `dfRtDYWFbkRONycy.Yxwh66Yjlx.cph0gtNBtJ` +pub const AWS_S3_UPLOAD_ID: Key = Key::from_static_str("aws.s3.upload_id"); + +/// The delete request container that specifies the objects to be deleted. +/// +/// The `delete` attribute is only applicable to the [delete-object](https://docs.aws.amazon.com/cli/latest/reference/s3api/delete-object.html) operation. +/// The `delete` attribute corresponds to the `--delete` parameter of the +/// [delete-objects operation within the S3 API](https://docs.aws.amazon.com/cli/latest/reference/s3api/delete-objects.html). +/// +/// # Examples +/// +/// - `Objects=[{Key=string,VersionId=string},{Key=string,VersionId=string}],Quiet=boolean` +pub const AWS_S3_DELETE: Key = Key::from_static_str("aws.s3.delete"); + +/// The part number of the part being uploaded in a multipart-upload operation. This is a positive integer between 1 and 10,000. +/// +/// The `part_number` attribute is only applicable to the [upload-part](https://docs.aws.amazon.com/cli/latest/reference/s3api/upload-part.html) +/// and [upload-part-copy](https://docs.aws.amazon.com/cli/latest/reference/s3api/upload-part-copy.html) operations. +/// The `part_number` attribute corresponds to the `--part-number` parameter of the +/// [upload-part operation within the S3 API](https://docs.aws.amazon.com/cli/latest/reference/s3api/upload-part.html). +/// +/// # Examples +/// +/// - `3456` +pub const AWS_S3_PART_NUMBER: Key = Key::from_static_str("aws.s3.part_number"); + +/// The name of the operation being executed. +/// +/// # Examples +/// +/// - `findBookById` +pub const GRAPHQL_OPERATION_NAME: Key = Key::from_static_str("graphql.operation.name"); + +/// The type of the operation being executed. +/// +/// # Examples +/// +/// - `query` +/// - `mutation` +/// - `subscription` +pub const GRAPHQL_OPERATION_TYPE: Key = Key::from_static_str("graphql.operation.type"); + +/// The GraphQL document being executed. +/// +/// The value may be sanitized to exclude sensitive information. +/// +/// # Examples +/// +/// - `query findBookById { bookById(id: ?) { name } }` +pub const GRAPHQL_DOCUMENT: Key = Key::from_static_str("graphql.document"); + +/// A value used by the messaging system as an identifier for the message, represented as a string. +/// +/// # Examples +/// +/// - `452a7c7c7c7048c2f887f61572b18fc2` +pub const MESSAGING_MESSAGE_ID: Key = Key::from_static_str("messaging.message.id"); + +/// The [conversation ID](#conversations) identifying the conversation to which the message belongs, represented as a string. Sometimes called "Correlation ID". +/// +/// # Examples +/// +/// - `MyConversationId` +pub const MESSAGING_MESSAGE_CONVERSATION_ID: Key = + Key::from_static_str("messaging.message.conversation_id"); + +/// The (uncompressed) size of the message payload in bytes. Also use this attribute if it is unknown whether the compressed or uncompressed payload size is reported. +/// +/// # Examples +/// +/// - `2738` +pub const MESSAGING_MESSAGE_PAYLOAD_SIZE_BYTES: Key = + Key::from_static_str("messaging.message.payload_size_bytes"); + +/// The compressed size of the message payload in bytes. +/// +/// # Examples +/// +/// - `2048` +pub const MESSAGING_MESSAGE_PAYLOAD_COMPRESSED_SIZE_BYTES: Key = + Key::from_static_str("messaging.message.payload_compressed_size_bytes"); + +/// The message destination name. +/// +/// Destination name SHOULD uniquely identify a specific queue, topic or other entity within the broker. If +/// the broker does not have such notion, the destination name SHOULD uniquely identify the broker. +/// +/// # Examples +/// +/// - `MyQueue` +/// - `MyTopic` +pub const MESSAGING_DESTINATION_NAME: Key = Key::from_static_str("messaging.destination.name"); + +/// Low cardinality representation of the messaging destination name. +/// +/// Destination names could be constructed from templates. An example would be a destination name involving a user name or product id. Although the destination name in this case is of high cardinality, the underlying template is of low cardinality and can be effectively used for grouping and aggregation. +/// +/// # Examples +/// +/// - `/customers/{customerId}` +pub const MESSAGING_DESTINATION_TEMPLATE: Key = + Key::from_static_str("messaging.destination.template"); + +/// A boolean that is true if the message destination is temporary and might not exist anymore after messages are processed. +pub const MESSAGING_DESTINATION_TEMPORARY: Key = + Key::from_static_str("messaging.destination.temporary"); + +/// A boolean that is true if the message destination is anonymous (could be unnamed or have auto-generated name). +pub const MESSAGING_DESTINATION_ANONYMOUS: Key = + Key::from_static_str("messaging.destination.anonymous"); + +/// A string identifying the messaging system. +/// +/// # Examples +/// +/// - `kafka` +/// - `rabbitmq` +/// - `rocketmq` +/// - `activemq` +/// - `AmazonSQS` +pub const MESSAGING_SYSTEM: Key = Key::from_static_str("messaging.system"); + +/// A string identifying the kind of messaging operation as defined in the [Operation names](#operation-names) section above. +/// +/// If a custom value is used, it MUST be of low cardinality. +pub const MESSAGING_OPERATION: Key = Key::from_static_str("messaging.operation"); + +/// The number of messages sent, received, or processed in the scope of the batching operation. +/// +/// Instrumentations SHOULD NOT set `messaging.batch.message_count` on spans that operate with a single message. When a messaging client library supports both batch and single-message API for the same operation, instrumentations SHOULD use `messaging.batch.message_count` for batching APIs and SHOULD NOT use it for single-message APIs. +/// +/// # Examples +/// +/// - `0` +/// - `1` +/// - `2` +pub const MESSAGING_BATCH_MESSAGE_COUNT: Key = + Key::from_static_str("messaging.batch.message_count"); + +/// A unique identifier for the client that consumes or produces a message. +/// +/// # Examples +/// +/// - `client-5` +/// - `myhost@8742@s8083jm` +pub const MESSAGING_CLIENT_ID: Key = Key::from_static_str("messaging.client_id"); + +/// RabbitMQ message routing key. +/// +/// # Examples +/// +/// - `myKey` +pub const MESSAGING_RABBITMQ_DESTINATION_ROUTING_KEY: Key = + Key::from_static_str("messaging.rabbitmq.destination.routing_key"); + +/// Message keys in Kafka are used for grouping alike messages to ensure they're processed on the same partition. They differ from `messaging.message.id` in that they're not unique. If the key is `null`, the attribute MUST NOT be set. +/// +/// If the key type is not string, it's string representation has to be supplied for the attribute. If the key has no unambiguous, canonical string form, don't include its value. +/// +/// # Examples +/// +/// - `myKey` +pub const MESSAGING_KAFKA_MESSAGE_KEY: Key = Key::from_static_str("messaging.kafka.message.key"); + +/// Name of the Kafka Consumer Group that is handling the message. Only applies to consumers, not producers. +/// +/// # Examples +/// +/// - `my-group` +pub const MESSAGING_KAFKA_CONSUMER_GROUP: Key = + Key::from_static_str("messaging.kafka.consumer.group"); + +/// Partition the message is sent to. +/// +/// # Examples +/// +/// - `2` +pub const MESSAGING_KAFKA_DESTINATION_PARTITION: Key = + Key::from_static_str("messaging.kafka.destination.partition"); + +/// The offset of a record in the corresponding Kafka partition. +/// +/// # Examples +/// +/// - `42` +pub const MESSAGING_KAFKA_MESSAGE_OFFSET: Key = + Key::from_static_str("messaging.kafka.message.offset"); + +/// A boolean that is true if the message is a tombstone. +pub const MESSAGING_KAFKA_MESSAGE_TOMBSTONE: Key = + Key::from_static_str("messaging.kafka.message.tombstone"); + +/// Namespace of RocketMQ resources, resources in different namespaces are individual. +/// +/// # Examples +/// +/// - `myNamespace` +pub const MESSAGING_ROCKETMQ_NAMESPACE: Key = Key::from_static_str("messaging.rocketmq.namespace"); + +/// Name of the RocketMQ producer/consumer group that is handling the message. The client type is identified by the SpanKind. +/// +/// # Examples +/// +/// - `myConsumerGroup` +pub const MESSAGING_ROCKETMQ_CLIENT_GROUP: Key = + Key::from_static_str("messaging.rocketmq.client_group"); + +/// The timestamp in milliseconds that the delay message is expected to be delivered to consumer. +/// +/// # Examples +/// +/// - `1665987217045` +pub const MESSAGING_ROCKETMQ_MESSAGE_DELIVERY_TIMESTAMP: Key = + Key::from_static_str("messaging.rocketmq.message.delivery_timestamp"); + +/// The delay time level for delay message, which determines the message delay time. +/// +/// # Examples +/// +/// - `3` +pub const MESSAGING_ROCKETMQ_MESSAGE_DELAY_TIME_LEVEL: Key = + Key::from_static_str("messaging.rocketmq.message.delay_time_level"); + +/// It is essential for FIFO message. Messages that belong to the same message group are always processed one by one within the same consumer group. +/// +/// # Examples +/// +/// - `myMessageGroup` +pub const MESSAGING_ROCKETMQ_MESSAGE_GROUP: Key = + Key::from_static_str("messaging.rocketmq.message.group"); + +/// Type of message. +pub const MESSAGING_ROCKETMQ_MESSAGE_TYPE: Key = + Key::from_static_str("messaging.rocketmq.message.type"); + +/// The secondary classifier of message besides topic. +/// +/// # Examples +/// +/// - `tagA` +pub const MESSAGING_ROCKETMQ_MESSAGE_TAG: Key = + Key::from_static_str("messaging.rocketmq.message.tag"); + +/// Key(s) of message, another way to mark message besides message id. +/// +/// # Examples +/// +/// - `keyA` +/// - `keyB` +pub const MESSAGING_ROCKETMQ_MESSAGE_KEYS: Key = + Key::from_static_str("messaging.rocketmq.message.keys"); + +/// Model of message consumption. This only applies to consumer spans. +pub const MESSAGING_ROCKETMQ_CONSUMPTION_MODEL: Key = + Key::from_static_str("messaging.rocketmq.consumption_model"); + +/// A string identifying the remoting system. See below for a list of well-known identifiers. +pub const RPC_SYSTEM: Key = Key::from_static_str("rpc.system"); + +/// The full (logical) name of the service being called, including its package name, if applicable. +/// +/// This is the logical name of the service from the RPC interface perspective, which can be different from the name of any implementing class. The `code.namespace` attribute may be used to store the latter (despite the attribute name, it may include a class name; e.g., class with method actually executing the call on the server side, RPC client stub class on the client side). +/// +/// # Examples +/// +/// - `myservice.EchoService` +pub const RPC_SERVICE: Key = Key::from_static_str("rpc.service"); + +/// The name of the (logical) method being called, must be equal to the $method part in the span name. +/// +/// This is the logical name of the method from the RPC interface perspective, which can be different from the name of any implementing method/function. The `code.function` attribute may be used to store the latter (e.g., method actually executing the call on the server side, RPC client stub method on the client side). +/// +/// # Examples +/// +/// - `exampleMethod` +pub const RPC_METHOD: Key = Key::from_static_str("rpc.method"); + +/// The [numeric status code](https://github.com/grpc/grpc/blob/v1.33.2/doc/statuscodes.md) of the gRPC request. +pub const RPC_GRPC_STATUS_CODE: Key = Key::from_static_str("rpc.grpc.status_code"); + +/// Protocol version as in `jsonrpc` property of request/response. Since JSON-RPC 1.0 does not specify this, the value can be omitted. +/// +/// # Examples +/// +/// - `2.0` +/// - `1.0` +pub const RPC_JSONRPC_VERSION: Key = Key::from_static_str("rpc.jsonrpc.version"); + +/// `id` property of request or response. Since protocol allows id to be int, string, `null` or missing (for notifications), value is expected to be cast to string for simplicity. Use empty string in case of `null` value. Omit entirely if this is a notification. +/// +/// # Examples +/// +/// - `10` +/// - `request-7` +/// - `` +pub const RPC_JSONRPC_REQUEST_ID: Key = Key::from_static_str("rpc.jsonrpc.request_id"); + +/// `error.code` property of response if it is an error response. +/// +/// # Examples +/// +/// - `-32700` +/// - `100` +pub const RPC_JSONRPC_ERROR_CODE: Key = Key::from_static_str("rpc.jsonrpc.error_code"); + +/// `error.message` property of response if it is an error response. +/// +/// # Examples +/// +/// - `Parse error` +/// - `User already exists` +pub const RPC_JSONRPC_ERROR_MESSAGE: Key = Key::from_static_str("rpc.jsonrpc.error_message"); + +/// Whether this is a received or sent message. +pub const MESSAGE_TYPE: Key = Key::from_static_str("message.type"); + +/// MUST be calculated as two different counters starting from `1` one for sent messages and one for received message. +/// +/// This way we guarantee that the values will be consistent between different implementations. +pub const MESSAGE_ID: Key = Key::from_static_str("message.id"); + +/// Compressed size of the message in bytes. +pub const MESSAGE_COMPRESSED_SIZE: Key = Key::from_static_str("message.compressed_size"); + +/// Uncompressed size of the message in bytes. +pub const MESSAGE_UNCOMPRESSED_SIZE: Key = Key::from_static_str("message.uncompressed_size"); + +/// The [error codes](https://connect.build/docs/protocol/#error-codes) of the Connect request. Error codes are always string values. +pub const RPC_CONNECT_RPC_ERROR_CODE: Key = Key::from_static_str("rpc.connect_rpc.error_code"); + +/// SHOULD be set to true if the exception event is recorded at a point where it is known that the exception is escaping the scope of the span. +/// +/// An exception is considered to have escaped (or left) the scope of a span, +/// if that span is ended while the exception is still logically "in flight". +/// This may be actually "in flight" in some languages (e.g. if the exception +/// is passed to a Context manager's `__exit__` method in Python) but will +/// usually be caught at the point of recording the exception in most languages. +/// +/// It is usually not possible to determine at the point where an exception is thrown +/// whether it will escape the scope of a span. +/// However, it is trivial to know that an exception +/// will escape, if one checks for an active exception just before ending the span, +/// as done in the [example above](#recording-an-exception). +/// +/// It follows that an exception may still escape the scope of the span +/// even if the `exception.escaped` attribute was not set or set to false, +/// since the event might have been recorded at a time where it was not +/// clear whether the exception will escape. +pub const EXCEPTION_ESCAPED: Key = Key::from_static_str("exception.escaped"); + +/// The [URI scheme](https://www.rfc-editor.org/rfc/rfc3986#section-3.1) component identifying the used protocol. +/// +/// # Examples +/// +/// - `https` +/// - `ftp` +/// - `telnet` +pub const URL_SCHEME: Key = Key::from_static_str("url.scheme"); + +/// Absolute URL describing a network resource according to [RFC3986](https://www.rfc-editor.org/rfc/rfc3986). +/// +/// For network calls, URL usually has `scheme://host[:port][path][?query][#fragment]` format, where the fragment is not transmitted over HTTP, but if it is known, it should be included nevertheless. +/// `url.full` MUST NOT contain credentials passed via URL in form of `https://username:password@www.example.com/`. In such case username and password should be redacted and attribute's value should be `https://REDACTED:REDACTED@www.example.com/`. +/// `url.full` SHOULD capture the absolute URL when it is available (or can be reconstructed) and SHOULD NOT be validated or modified except for sanitizing purposes. +/// +/// # Examples +/// +/// - `https://www.foo.bar/search?q=OpenTelemetry#SemConv` +/// - `//localhost` +pub const URL_FULL: Key = Key::from_static_str("url.full"); + +/// The [URI path](https://www.rfc-editor.org/rfc/rfc3986#section-3.3) component. +/// +/// When missing, the value is assumed to be `/` +/// +/// # Examples +/// +/// - `/search` +pub const URL_PATH: Key = Key::from_static_str("url.path"); + +/// The [URI query](https://www.rfc-editor.org/rfc/rfc3986#section-3.4) component. +/// +/// Sensitive content provided in query string SHOULD be scrubbed when instrumentations can identify it. +/// +/// # Examples +/// +/// - `q=OpenTelemetry` +pub const URL_QUERY: Key = Key::from_static_str("url.query"); + +/// The [URI fragment](https://www.rfc-editor.org/rfc/rfc3986#section-3.5) component. +/// +/// # Examples +/// +/// - `SemConv` +pub const URL_FRAGMENT: Key = Key::from_static_str("url.fragment"); + +/// Value of the [HTTP User-Agent](https://www.rfc-editor.org/rfc/rfc9110.html#field.user-agent) header sent by the client. +/// +/// # Examples +/// +/// - `CERN-LineMode/2.15 libwww/2.17b3` +pub const USER_AGENT_ORIGINAL: Key = Key::from_static_str("user_agent.original"); diff -Nru temporalio-1.3.0/vendor/ordered-float/.cargo-checksum.json temporalio-1.3.0/vendor/ordered-float/.cargo-checksum.json --- temporalio-1.3.0/vendor/ordered-float/.cargo-checksum.json 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ordered-float/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1 @@ +{"files":{"Cargo.toml":"c90c1eb36ad3b24d3437275a2cfbbb10e20b2d38555f9f6791c580311eefe3c1","LICENSE-MIT":"f7715d38a3fa1b4ac97c5729740752505a39cb92ee83ab5b102aeb5eaa7cdea4","README.md":"ded338028d49080cc1a036a5e62974425c78cdcb904289777a6a71e8430e69a8","rustfmt.toml":"d72fafaea8c9695f74c40bc666ada205b935bec3f02488bb33e5994e2831bffb","src/lib.rs":"9b4c4f83bc154e83856604e91c36bc03e1b3473df4cb4a6a1519e72df224a3c4","tests/test.rs":"95919c716b1956d77b0068fa859ffd857e69c292c60e758f2b2ead95b7abfe97"},"package":"2a54938017eacd63036332b4ae5c8a49fc8c0c1d6d629893057e4f13609edd06"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/ordered-float/Cargo.toml temporalio-1.3.0/vendor/ordered-float/Cargo.toml --- temporalio-1.3.0/vendor/ordered-float/Cargo.toml 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ordered-float/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,106 @@ +# 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 = "2021" +name = "ordered-float" +version = "3.9.1" +authors = [ + "Jonathan Reem ", + "Matt Brubeck ", +] +description = "Wrappers for total ordering on floats" +readme = "README.md" +keywords = [ + "no_std", + "ord", + "f64", + "f32", + "sort", +] +categories = [ + "science", + "rust-patterns", + "no-std", +] +license = "MIT" +repository = "https://github.com/reem/rust-ordered-float" + +[dependencies.arbitrary] +version = "1.0.0" +optional = true + +[dependencies.bytemuck] +version = "1.12.2" +optional = true +default-features = false + +[dependencies.num-traits] +version = "0.2.1" +default-features = false + +[dependencies.proptest] +version = "1.0.0" +optional = true + +[dependencies.rand] +version = "0.8.3" +optional = true +default-features = false + +[dependencies.rkyv] +version = "0.7.41" +features = ["rend"] +optional = true +default-features = false + +[dependencies.schemars] +version = "0.8.8" +optional = true + +[dependencies.serde] +version = "1.0" +optional = true +default-features = false + +[dependencies.speedy] +version = "0.8.3" +optional = true +default-features = false + +[dev-dependencies.serde_test] +version = "1.0" + +[features] +default = ["std"] +randtest = [ + "rand/std", + "rand/std_rng", +] +rkyv = ["rkyv_32"] +rkyv_16 = [ + "dep:rkyv", + "rkyv?/size_16", +] +rkyv_32 = [ + "dep:rkyv", + "rkyv?/size_32", +] +rkyv_64 = [ + "dep:rkyv", + "rkyv?/size_64", +] +rkyv_ck = ["rkyv?/validation"] +serde = [ + "dep:serde", + "rand?/serde1", +] +std = ["num-traits/std"] diff -Nru temporalio-1.3.0/vendor/ordered-float/LICENSE-MIT temporalio-1.3.0/vendor/ordered-float/LICENSE-MIT --- temporalio-1.3.0/vendor/ordered-float/LICENSE-MIT 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ordered-float/LICENSE-MIT 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,25 @@ +Copyright (c) 2015 Jonathan Reem + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff -Nru temporalio-1.3.0/vendor/ordered-float/README.md temporalio-1.3.0/vendor/ordered-float/README.md --- temporalio-1.3.0/vendor/ordered-float/README.md 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ordered-float/README.md 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,34 @@ +# Ordered Floats + +Provides several wrapper types for Ord and Eq implementations on f64 and friends. + +See the [API documentation](https://docs.rs/ordered-float) for further details. + +## no_std + +To use `ordered_float` without requiring the Rust standard library, disable +the default `std` feature: + +```toml +[dependencies] +ordered-float = { version = "3.0", default-features = false } +``` + +## Optional features + +The following optional features can be enabled in `Cargo.toml`: + +* `bytemuck`: Adds implementations for traits provided by the `bytemuck` crate. +* `rand`: Adds implementations for various distribution types provided by the `rand` crate. +* `serde`: Implements the `serde::Serialize` and `serde::Deserialize` traits. +* `schemars`: Implements the `schemars::JsonSchema` trait. +* `proptest`: Implements the `proptest::Arbitrary` trait. +* `rkyv_16`: Implements `rkyv`'s `Archive`, `Serialize` and `Deserialize` traits with `size_16`. +* `rkyv_32`: Implements `rkyv`'s `Archive`, `Serialize` and `Deserialize` traits with `size_32`. +* `rkyv_64`: Implements `rkyv`'s `Archive`, `Serialize` and `Deserialize` traits with `size_64`. +* `rkyv_ck`: Implements the `bytecheck::CheckBytes` trait. +* `speedy`: Implements `speedy`'s `Readable` and `Writable` traits. + +## License + +MIT diff -Nru temporalio-1.3.0/vendor/ordered-float/rustfmt.toml temporalio-1.3.0/vendor/ordered-float/rustfmt.toml --- temporalio-1.3.0/vendor/ordered-float/rustfmt.toml 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ordered-float/rustfmt.toml 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,3 @@ +# These two unstable options might improve the layout of the code: +#fn_single_line = true +#where_single_line = true diff -Nru temporalio-1.3.0/vendor/ordered-float/src/lib.rs temporalio-1.3.0/vendor/ordered-float/src/lib.rs --- temporalio-1.3.0/vendor/ordered-float/src/lib.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ordered-float/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,2593 @@ +#![no_std] +#![cfg_attr(test, deny(warnings))] +#![deny(missing_docs)] +#![allow(clippy::derive_partial_eq_without_eq)] + +//! Wrappers for total order on Floats. See the [`OrderedFloat`] and [`NotNan`] docs for details. + +#[cfg(feature = "std")] +extern crate std; +#[cfg(feature = "std")] +use std::error::Error; + +use core::borrow::Borrow; +use core::cmp::Ordering; +use core::convert::TryFrom; +use core::fmt; +use core::hash::{Hash, Hasher}; +use core::hint::unreachable_unchecked; +use core::iter::{Product, Sum}; +use core::num::FpCategory; +use core::ops::{ + Add, AddAssign, Deref, DerefMut, Div, DivAssign, Mul, MulAssign, Neg, Rem, RemAssign, Sub, + SubAssign, +}; +use core::str::FromStr; + +#[cfg(not(feature = "std"))] +use num_traits::float::FloatCore as Float; +use num_traits::{ + AsPrimitive, Bounded, FloatConst, FromPrimitive, Num, NumCast, One, Signed, ToPrimitive, Zero, +}; +#[cfg(feature = "std")] +pub use num_traits::{Float, Pow}; + +#[cfg(feature = "rand")] +pub use impl_rand::{UniformNotNan, UniformOrdered}; + +// masks for the parts of the IEEE 754 float +const SIGN_MASK: u64 = 0x8000000000000000u64; +const EXP_MASK: u64 = 0x7ff0000000000000u64; +const MAN_MASK: u64 = 0x000fffffffffffffu64; + +// canonical raw bit patterns (for hashing) +const CANONICAL_NAN_BITS: u64 = 0x7ff8000000000000u64; +const CANONICAL_ZERO_BITS: u64 = 0x0u64; + +/// A wrapper around floats providing implementations of `Eq`, `Ord`, and `Hash`. +/// +/// NaN is sorted as *greater* than all other values and *equal* +/// to itself, in contradiction with the IEEE standard. +/// +/// ``` +/// use ordered_float::OrderedFloat; +/// use std::f32::NAN; +/// +/// let mut v = [OrderedFloat(NAN), OrderedFloat(2.0), OrderedFloat(1.0)]; +/// v.sort(); +/// assert_eq!(v, [OrderedFloat(1.0), OrderedFloat(2.0), OrderedFloat(NAN)]); +/// ``` +/// +/// Because `OrderedFloat` implements `Ord` and `Eq`, it can be used as a key in a `HashSet`, +/// `HashMap`, `BTreeMap`, or `BTreeSet` (unlike the primitive `f32` or `f64` types): +/// +/// ``` +/// # use ordered_float::OrderedFloat; +/// # use std::collections::HashSet; +/// # use std::f32::NAN; +/// +/// let mut s: HashSet> = HashSet::new(); +/// s.insert(OrderedFloat(NAN)); +/// assert!(s.contains(&OrderedFloat(NAN))); +/// ``` +#[derive(Debug, Default, Clone, Copy)] +#[repr(transparent)] +pub struct OrderedFloat(pub T); + +impl OrderedFloat { + /// Get the value out. + #[inline] + pub fn into_inner(self) -> T { + self.0 + } +} + +impl AsRef for OrderedFloat { + #[inline] + fn as_ref(&self) -> &T { + &self.0 + } +} + +impl AsMut for OrderedFloat { + #[inline] + fn as_mut(&mut self) -> &mut T { + &mut self.0 + } +} + +impl<'a, T: Float> From<&'a T> for &'a OrderedFloat { + #[inline] + fn from(t: &'a T) -> &'a OrderedFloat { + // Safety: OrderedFloat is #[repr(transparent)] and has no invalid values. + unsafe { &*(t as *const T as *const OrderedFloat) } + } +} + +impl<'a, T: Float> From<&'a mut T> for &'a mut OrderedFloat { + #[inline] + fn from(t: &'a mut T) -> &'a mut OrderedFloat { + // Safety: OrderedFloat is #[repr(transparent)] and has no invalid values. + unsafe { &mut *(t as *mut T as *mut OrderedFloat) } + } +} + +impl PartialOrd for OrderedFloat { + #[inline] + fn partial_cmp(&self, other: &Self) -> Option { + Some(self.cmp(other)) + } +} + +impl Ord for OrderedFloat { + fn cmp(&self, other: &Self) -> Ordering { + let lhs = &self.0; + let rhs = &other.0; + match lhs.partial_cmp(rhs) { + Some(ordering) => ordering, + None => { + if lhs.is_nan() { + if rhs.is_nan() { + Ordering::Equal + } else { + Ordering::Greater + } + } else { + Ordering::Less + } + } + } + } +} + +impl PartialEq for OrderedFloat { + #[inline] + fn eq(&self, other: &OrderedFloat) -> bool { + if self.0.is_nan() { + other.0.is_nan() + } else { + self.0 == other.0 + } + } +} + +impl PartialEq for OrderedFloat { + #[inline] + fn eq(&self, other: &T) -> bool { + self.0 == *other + } +} + +impl Hash for OrderedFloat { + fn hash(&self, state: &mut H) { + let bits = if self.is_nan() { + CANONICAL_NAN_BITS + } else if self.is_zero() { + CANONICAL_ZERO_BITS + } else { + raw_double_bits(&self.0) + }; + + bits.hash(state) + } +} + +impl fmt::Display for OrderedFloat { + #[inline] + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + self.0.fmt(f) + } +} + +impl fmt::LowerExp for OrderedFloat { + #[inline] + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + self.0.fmt(f) + } +} + +impl fmt::UpperExp for OrderedFloat { + #[inline] + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + self.0.fmt(f) + } +} + +impl From> for f32 { + #[inline] + fn from(f: OrderedFloat) -> f32 { + f.0 + } +} + +impl From> for f64 { + #[inline] + fn from(f: OrderedFloat) -> f64 { + f.0 + } +} + +impl From for OrderedFloat { + #[inline] + fn from(val: T) -> Self { + OrderedFloat(val) + } +} + +impl From for OrderedFloat { + fn from(val: bool) -> Self { + OrderedFloat(val as u8 as f32) + } +} + +impl From for OrderedFloat { + fn from(val: bool) -> Self { + OrderedFloat(val as u8 as f64) + } +} + +macro_rules! impl_ordered_float_from { + ($dst:ty, $src:ty) => { + impl From<$src> for OrderedFloat<$dst> { + fn from(val: $src) -> Self { + OrderedFloat(val.into()) + } + } + }; +} +impl_ordered_float_from! {f64, i8} +impl_ordered_float_from! {f64, i16} +impl_ordered_float_from! {f64, i32} +impl_ordered_float_from! {f64, u8} +impl_ordered_float_from! {f64, u16} +impl_ordered_float_from! {f64, u32} +impl_ordered_float_from! {f32, i8} +impl_ordered_float_from! {f32, i16} +impl_ordered_float_from! {f32, u8} +impl_ordered_float_from! {f32, u16} + +impl Deref for OrderedFloat { + type Target = T; + + #[inline] + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +impl DerefMut for OrderedFloat { + #[inline] + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.0 + } +} + +impl Eq for OrderedFloat {} + +macro_rules! impl_ordered_float_binop { + ($imp:ident, $method:ident, $assign_imp:ident, $assign_method:ident) => { + impl $imp for OrderedFloat { + type Output = OrderedFloat; + + #[inline] + fn $method(self, other: Self) -> Self::Output { + OrderedFloat((self.0).$method(other.0)) + } + } + + impl $imp for OrderedFloat { + type Output = OrderedFloat; + + #[inline] + fn $method(self, other: T) -> Self::Output { + OrderedFloat((self.0).$method(other)) + } + } + + impl<'a, T> $imp<&'a T> for OrderedFloat + where + T: $imp<&'a T>, + { + type Output = OrderedFloat<>::Output>; + + #[inline] + fn $method(self, other: &'a T) -> Self::Output { + OrderedFloat((self.0).$method(other)) + } + } + + impl<'a, T> $imp<&'a Self> for OrderedFloat + where + T: $imp<&'a T>, + { + type Output = OrderedFloat<>::Output>; + + #[inline] + fn $method(self, other: &'a Self) -> Self::Output { + OrderedFloat((self.0).$method(&other.0)) + } + } + + impl<'a, T> $imp> for &'a OrderedFloat + where + &'a T: $imp, + { + type Output = OrderedFloat<<&'a T as $imp>::Output>; + + #[inline] + fn $method(self, other: OrderedFloat) -> Self::Output { + OrderedFloat((self.0).$method(other.0)) + } + } + + impl<'a, T> $imp for &'a OrderedFloat + where + &'a T: $imp, + { + type Output = OrderedFloat<<&'a T as $imp>::Output>; + + #[inline] + fn $method(self, other: T) -> Self::Output { + OrderedFloat((self.0).$method(other)) + } + } + + impl<'a, T> $imp<&'a T> for &'a OrderedFloat + where + &'a T: $imp, + { + type Output = OrderedFloat<<&'a T as $imp>::Output>; + + #[inline] + fn $method(self, other: &'a T) -> Self::Output { + OrderedFloat((self.0).$method(other)) + } + } + + impl $assign_imp for OrderedFloat { + #[inline] + fn $assign_method(&mut self, other: T) { + (self.0).$assign_method(other); + } + } + + impl<'a, T: $assign_imp<&'a T>> $assign_imp<&'a T> for OrderedFloat { + #[inline] + fn $assign_method(&mut self, other: &'a T) { + (self.0).$assign_method(other); + } + } + + impl $assign_imp for OrderedFloat { + #[inline] + fn $assign_method(&mut self, other: Self) { + (self.0).$assign_method(other.0); + } + } + + impl<'a, T: $assign_imp<&'a T>> $assign_imp<&'a Self> for OrderedFloat { + #[inline] + fn $assign_method(&mut self, other: &'a Self) { + (self.0).$assign_method(&other.0); + } + } + }; +} + +impl_ordered_float_binop! {Add, add, AddAssign, add_assign} +impl_ordered_float_binop! {Sub, sub, SubAssign, sub_assign} +impl_ordered_float_binop! {Mul, mul, MulAssign, mul_assign} +impl_ordered_float_binop! {Div, div, DivAssign, div_assign} +impl_ordered_float_binop! {Rem, rem, RemAssign, rem_assign} + +macro_rules! impl_ordered_float_pow { + ($inner:ty, $rhs:ty) => { + #[cfg(feature = "std")] + impl Pow<$rhs> for OrderedFloat<$inner> { + type Output = OrderedFloat<$inner>; + #[inline] + fn pow(self, rhs: $rhs) -> OrderedFloat<$inner> { + OrderedFloat(<$inner>::pow(self.0, rhs)) + } + } + + #[cfg(feature = "std")] + impl<'a> Pow<&'a $rhs> for OrderedFloat<$inner> { + type Output = OrderedFloat<$inner>; + #[inline] + fn pow(self, rhs: &'a $rhs) -> OrderedFloat<$inner> { + OrderedFloat(<$inner>::pow(self.0, *rhs)) + } + } + + #[cfg(feature = "std")] + impl<'a> Pow<$rhs> for &'a OrderedFloat<$inner> { + type Output = OrderedFloat<$inner>; + #[inline] + fn pow(self, rhs: $rhs) -> OrderedFloat<$inner> { + OrderedFloat(<$inner>::pow(self.0, rhs)) + } + } + + #[cfg(feature = "std")] + impl<'a, 'b> Pow<&'a $rhs> for &'b OrderedFloat<$inner> { + type Output = OrderedFloat<$inner>; + #[inline] + fn pow(self, rhs: &'a $rhs) -> OrderedFloat<$inner> { + OrderedFloat(<$inner>::pow(self.0, *rhs)) + } + } + }; +} + +impl_ordered_float_pow! {f32, i8} +impl_ordered_float_pow! {f32, i16} +impl_ordered_float_pow! {f32, u8} +impl_ordered_float_pow! {f32, u16} +impl_ordered_float_pow! {f32, i32} +impl_ordered_float_pow! {f64, i8} +impl_ordered_float_pow! {f64, i16} +impl_ordered_float_pow! {f64, u8} +impl_ordered_float_pow! {f64, u16} +impl_ordered_float_pow! {f64, i32} +impl_ordered_float_pow! {f32, f32} +impl_ordered_float_pow! {f64, f32} +impl_ordered_float_pow! {f64, f64} + +macro_rules! impl_ordered_float_self_pow { + ($base:ty, $exp:ty) => { + #[cfg(feature = "std")] + impl Pow> for OrderedFloat<$base> { + type Output = OrderedFloat<$base>; + #[inline] + fn pow(self, rhs: OrderedFloat<$exp>) -> OrderedFloat<$base> { + OrderedFloat(<$base>::pow(self.0, rhs.0)) + } + } + + #[cfg(feature = "std")] + impl<'a> Pow<&'a OrderedFloat<$exp>> for OrderedFloat<$base> { + type Output = OrderedFloat<$base>; + #[inline] + fn pow(self, rhs: &'a OrderedFloat<$exp>) -> OrderedFloat<$base> { + OrderedFloat(<$base>::pow(self.0, rhs.0)) + } + } + + #[cfg(feature = "std")] + impl<'a> Pow> for &'a OrderedFloat<$base> { + type Output = OrderedFloat<$base>; + #[inline] + fn pow(self, rhs: OrderedFloat<$exp>) -> OrderedFloat<$base> { + OrderedFloat(<$base>::pow(self.0, rhs.0)) + } + } + + #[cfg(feature = "std")] + impl<'a, 'b> Pow<&'a OrderedFloat<$exp>> for &'b OrderedFloat<$base> { + type Output = OrderedFloat<$base>; + #[inline] + fn pow(self, rhs: &'a OrderedFloat<$exp>) -> OrderedFloat<$base> { + OrderedFloat(<$base>::pow(self.0, rhs.0)) + } + } + }; +} + +impl_ordered_float_self_pow! {f32, f32} +impl_ordered_float_self_pow! {f64, f32} +impl_ordered_float_self_pow! {f64, f64} + +/// Adds a float directly. +impl Sum for OrderedFloat { + fn sum>>(iter: I) -> Self { + OrderedFloat(iter.map(|v| v.0).sum()) + } +} + +impl<'a, T: Float + Sum + 'a> Sum<&'a OrderedFloat> for OrderedFloat { + #[inline] + fn sum>>(iter: I) -> Self { + iter.cloned().sum() + } +} + +impl Product for OrderedFloat { + fn product>>(iter: I) -> Self { + OrderedFloat(iter.map(|v| v.0).product()) + } +} + +impl<'a, T: Float + Product + 'a> Product<&'a OrderedFloat> for OrderedFloat { + #[inline] + fn product>>(iter: I) -> Self { + iter.cloned().product() + } +} + +impl Signed for OrderedFloat { + #[inline] + fn abs(&self) -> Self { + OrderedFloat(self.0.abs()) + } + + fn abs_sub(&self, other: &Self) -> Self { + OrderedFloat(Signed::abs_sub(&self.0, &other.0)) + } + + #[inline] + fn signum(&self) -> Self { + OrderedFloat(self.0.signum()) + } + #[inline] + fn is_positive(&self) -> bool { + self.0.is_positive() + } + #[inline] + fn is_negative(&self) -> bool { + self.0.is_negative() + } +} + +impl Bounded for OrderedFloat { + #[inline] + fn min_value() -> Self { + OrderedFloat(T::min_value()) + } + + #[inline] + fn max_value() -> Self { + OrderedFloat(T::max_value()) + } +} + +impl FromStr for OrderedFloat { + type Err = T::Err; + + /// Convert a &str to `OrderedFloat`. Returns an error if the string fails to parse. + /// + /// ``` + /// use ordered_float::OrderedFloat; + /// + /// assert!("-10".parse::>().is_ok()); + /// assert!("abc".parse::>().is_err()); + /// assert!("NaN".parse::>().is_ok()); + /// ``` + fn from_str(s: &str) -> Result { + T::from_str(s).map(OrderedFloat) + } +} + +impl Neg for OrderedFloat { + type Output = OrderedFloat; + + #[inline] + fn neg(self) -> Self::Output { + OrderedFloat(-self.0) + } +} + +impl<'a, T> Neg for &'a OrderedFloat +where + &'a T: Neg, +{ + type Output = OrderedFloat<<&'a T as Neg>::Output>; + + #[inline] + fn neg(self) -> Self::Output { + OrderedFloat(-(&self.0)) + } +} + +impl Zero for OrderedFloat { + #[inline] + fn zero() -> Self { + OrderedFloat(T::zero()) + } + + #[inline] + fn is_zero(&self) -> bool { + self.0.is_zero() + } +} + +impl One for OrderedFloat { + #[inline] + fn one() -> Self { + OrderedFloat(T::one()) + } +} + +impl NumCast for OrderedFloat { + #[inline] + fn from(n: F) -> Option { + T::from(n).map(OrderedFloat) + } +} + +macro_rules! impl_as_primitive { + (@ (NotNan<$T: ty>) => $(#[$cfg:meta])* impl (NotNan<$U: ty>) ) => { + $(#[$cfg])* + impl AsPrimitive> for NotNan<$T> { + #[inline] fn as_(self) -> NotNan<$U> { + // Safety: `NotNan` guarantees that the value is not NaN. + unsafe {NotNan::new_unchecked(self.0 as $U) } + } + } + }; + (@ ($T: ty) => $(#[$cfg:meta])* impl (NotNan<$U: ty>) ) => { + $(#[$cfg])* + impl AsPrimitive> for $T { + #[inline] fn as_(self) -> NotNan<$U> { NotNan(self as $U) } + } + }; + (@ (NotNan<$T: ty>) => $(#[$cfg:meta])* impl ($U: ty) ) => { + $(#[$cfg])* + impl AsPrimitive<$U> for NotNan<$T> { + #[inline] fn as_(self) -> $U { self.0 as $U } + } + }; + (@ (OrderedFloat<$T: ty>) => $(#[$cfg:meta])* impl (OrderedFloat<$U: ty>) ) => { + $(#[$cfg])* + impl AsPrimitive> for OrderedFloat<$T> { + #[inline] fn as_(self) -> OrderedFloat<$U> { OrderedFloat(self.0 as $U) } + } + }; + (@ ($T: ty) => $(#[$cfg:meta])* impl (OrderedFloat<$U: ty>) ) => { + $(#[$cfg])* + impl AsPrimitive> for $T { + #[inline] fn as_(self) -> OrderedFloat<$U> { OrderedFloat(self as $U) } + } + }; + (@ (OrderedFloat<$T: ty>) => $(#[$cfg:meta])* impl ($U: ty) ) => { + $(#[$cfg])* + impl AsPrimitive<$U> for OrderedFloat<$T> { + #[inline] fn as_(self) -> $U { self.0 as $U } + } + }; + ($T: tt => { $( $U: tt ),* } ) => {$( + impl_as_primitive!(@ $T => impl $U); + )*}; +} + +impl_as_primitive!((OrderedFloat) => { (OrderedFloat), (OrderedFloat) }); +impl_as_primitive!((OrderedFloat) => { (OrderedFloat), (OrderedFloat) }); + +impl_as_primitive!((NotNan) => { (NotNan), (NotNan) }); +impl_as_primitive!((NotNan) => { (NotNan), (NotNan) }); + +impl_as_primitive!((u8) => { (OrderedFloat), (OrderedFloat) }); +impl_as_primitive!((i8) => { (OrderedFloat), (OrderedFloat) }); +impl_as_primitive!((u16) => { (OrderedFloat), (OrderedFloat) }); +impl_as_primitive!((i16) => { (OrderedFloat), (OrderedFloat) }); +impl_as_primitive!((u32) => { (OrderedFloat), (OrderedFloat) }); +impl_as_primitive!((i32) => { (OrderedFloat), (OrderedFloat) }); +impl_as_primitive!((u64) => { (OrderedFloat), (OrderedFloat) }); +impl_as_primitive!((i64) => { (OrderedFloat), (OrderedFloat) }); +impl_as_primitive!((usize) => { (OrderedFloat), (OrderedFloat) }); +impl_as_primitive!((isize) => { (OrderedFloat), (OrderedFloat) }); +impl_as_primitive!((f32) => { (OrderedFloat), (OrderedFloat) }); +impl_as_primitive!((f64) => { (OrderedFloat), (OrderedFloat) }); + +impl_as_primitive!((u8) => { (NotNan), (NotNan) }); +impl_as_primitive!((i8) => { (NotNan), (NotNan) }); +impl_as_primitive!((u16) => { (NotNan), (NotNan) }); +impl_as_primitive!((i16) => { (NotNan), (NotNan) }); +impl_as_primitive!((u32) => { (NotNan), (NotNan) }); +impl_as_primitive!((i32) => { (NotNan), (NotNan) }); +impl_as_primitive!((u64) => { (NotNan), (NotNan) }); +impl_as_primitive!((i64) => { (NotNan), (NotNan) }); +impl_as_primitive!((usize) => { (NotNan), (NotNan) }); +impl_as_primitive!((isize) => { (NotNan), (NotNan) }); + +impl_as_primitive!((OrderedFloat) => { (u8), (u16), (u32), (u64), (usize), (i8), (i16), (i32), (i64), (isize), (f32), (f64) }); +impl_as_primitive!((OrderedFloat) => { (u8), (u16), (u32), (u64), (usize), (i8), (i16), (i32), (i64), (isize), (f32), (f64) }); + +impl_as_primitive!((NotNan) => { (u8), (u16), (u32), (u64), (usize), (i8), (i16), (i32), (i64), (isize), (f32), (f64) }); +impl_as_primitive!((NotNan) => { (u8), (u16), (u32), (u64), (usize), (i8), (i16), (i32), (i64), (isize), (f32), (f64) }); + +impl FromPrimitive for OrderedFloat { + fn from_i64(n: i64) -> Option { + T::from_i64(n).map(OrderedFloat) + } + fn from_u64(n: u64) -> Option { + T::from_u64(n).map(OrderedFloat) + } + fn from_isize(n: isize) -> Option { + T::from_isize(n).map(OrderedFloat) + } + fn from_i8(n: i8) -> Option { + T::from_i8(n).map(OrderedFloat) + } + fn from_i16(n: i16) -> Option { + T::from_i16(n).map(OrderedFloat) + } + fn from_i32(n: i32) -> Option { + T::from_i32(n).map(OrderedFloat) + } + fn from_usize(n: usize) -> Option { + T::from_usize(n).map(OrderedFloat) + } + fn from_u8(n: u8) -> Option { + T::from_u8(n).map(OrderedFloat) + } + fn from_u16(n: u16) -> Option { + T::from_u16(n).map(OrderedFloat) + } + fn from_u32(n: u32) -> Option { + T::from_u32(n).map(OrderedFloat) + } + fn from_f32(n: f32) -> Option { + T::from_f32(n).map(OrderedFloat) + } + fn from_f64(n: f64) -> Option { + T::from_f64(n).map(OrderedFloat) + } +} + +impl ToPrimitive for OrderedFloat { + fn to_i64(&self) -> Option { + self.0.to_i64() + } + fn to_u64(&self) -> Option { + self.0.to_u64() + } + fn to_isize(&self) -> Option { + self.0.to_isize() + } + fn to_i8(&self) -> Option { + self.0.to_i8() + } + fn to_i16(&self) -> Option { + self.0.to_i16() + } + fn to_i32(&self) -> Option { + self.0.to_i32() + } + fn to_usize(&self) -> Option { + self.0.to_usize() + } + fn to_u8(&self) -> Option { + self.0.to_u8() + } + fn to_u16(&self) -> Option { + self.0.to_u16() + } + fn to_u32(&self) -> Option { + self.0.to_u32() + } + fn to_f32(&self) -> Option { + self.0.to_f32() + } + fn to_f64(&self) -> Option { + self.0.to_f64() + } +} + +impl num_traits::float::FloatCore for OrderedFloat { + fn nan() -> Self { + OrderedFloat(T::nan()) + } + fn infinity() -> Self { + OrderedFloat(T::infinity()) + } + fn neg_infinity() -> Self { + OrderedFloat(T::neg_infinity()) + } + fn neg_zero() -> Self { + OrderedFloat(T::neg_zero()) + } + fn min_value() -> Self { + OrderedFloat(T::min_value()) + } + fn min_positive_value() -> Self { + OrderedFloat(T::min_positive_value()) + } + fn max_value() -> Self { + OrderedFloat(T::max_value()) + } + fn is_nan(self) -> bool { + self.0.is_nan() + } + fn is_infinite(self) -> bool { + self.0.is_infinite() + } + fn is_finite(self) -> bool { + self.0.is_finite() + } + fn is_normal(self) -> bool { + self.0.is_normal() + } + fn classify(self) -> FpCategory { + self.0.classify() + } + fn floor(self) -> Self { + OrderedFloat(self.0.floor()) + } + fn ceil(self) -> Self { + OrderedFloat(self.0.ceil()) + } + fn round(self) -> Self { + OrderedFloat(self.0.round()) + } + fn trunc(self) -> Self { + OrderedFloat(self.0.trunc()) + } + fn fract(self) -> Self { + OrderedFloat(self.0.fract()) + } + fn abs(self) -> Self { + OrderedFloat(self.0.abs()) + } + fn signum(self) -> Self { + OrderedFloat(self.0.signum()) + } + fn is_sign_positive(self) -> bool { + self.0.is_sign_positive() + } + fn is_sign_negative(self) -> bool { + self.0.is_sign_negative() + } + fn recip(self) -> Self { + OrderedFloat(self.0.recip()) + } + fn powi(self, n: i32) -> Self { + OrderedFloat(self.0.powi(n)) + } + fn integer_decode(self) -> (u64, i16, i8) { + self.0.integer_decode() + } + fn epsilon() -> Self { + OrderedFloat(T::epsilon()) + } + fn to_degrees(self) -> Self { + OrderedFloat(self.0.to_degrees()) + } + fn to_radians(self) -> Self { + OrderedFloat(self.0.to_radians()) + } +} + +#[cfg(feature = "std")] +impl Float for OrderedFloat { + fn nan() -> Self { + OrderedFloat(T::nan()) + } + fn infinity() -> Self { + OrderedFloat(T::infinity()) + } + fn neg_infinity() -> Self { + OrderedFloat(T::neg_infinity()) + } + fn neg_zero() -> Self { + OrderedFloat(T::neg_zero()) + } + fn min_value() -> Self { + OrderedFloat(T::min_value()) + } + fn min_positive_value() -> Self { + OrderedFloat(T::min_positive_value()) + } + fn max_value() -> Self { + OrderedFloat(T::max_value()) + } + fn is_nan(self) -> bool { + self.0.is_nan() + } + fn is_infinite(self) -> bool { + self.0.is_infinite() + } + fn is_finite(self) -> bool { + self.0.is_finite() + } + fn is_normal(self) -> bool { + self.0.is_normal() + } + fn classify(self) -> FpCategory { + self.0.classify() + } + fn floor(self) -> Self { + OrderedFloat(self.0.floor()) + } + fn ceil(self) -> Self { + OrderedFloat(self.0.ceil()) + } + fn round(self) -> Self { + OrderedFloat(self.0.round()) + } + fn trunc(self) -> Self { + OrderedFloat(self.0.trunc()) + } + fn fract(self) -> Self { + OrderedFloat(self.0.fract()) + } + fn abs(self) -> Self { + OrderedFloat(self.0.abs()) + } + fn signum(self) -> Self { + OrderedFloat(self.0.signum()) + } + fn is_sign_positive(self) -> bool { + self.0.is_sign_positive() + } + fn is_sign_negative(self) -> bool { + self.0.is_sign_negative() + } + fn mul_add(self, a: Self, b: Self) -> Self { + OrderedFloat(self.0.mul_add(a.0, b.0)) + } + fn recip(self) -> Self { + OrderedFloat(self.0.recip()) + } + fn powi(self, n: i32) -> Self { + OrderedFloat(self.0.powi(n)) + } + fn powf(self, n: Self) -> Self { + OrderedFloat(self.0.powf(n.0)) + } + fn sqrt(self) -> Self { + OrderedFloat(self.0.sqrt()) + } + fn exp(self) -> Self { + OrderedFloat(self.0.exp()) + } + fn exp2(self) -> Self { + OrderedFloat(self.0.exp2()) + } + fn ln(self) -> Self { + OrderedFloat(self.0.ln()) + } + fn log(self, base: Self) -> Self { + OrderedFloat(self.0.log(base.0)) + } + fn log2(self) -> Self { + OrderedFloat(self.0.log2()) + } + fn log10(self) -> Self { + OrderedFloat(self.0.log10()) + } + fn max(self, other: Self) -> Self { + OrderedFloat(self.0.max(other.0)) + } + fn min(self, other: Self) -> Self { + OrderedFloat(self.0.min(other.0)) + } + fn abs_sub(self, other: Self) -> Self { + OrderedFloat(self.0.abs_sub(other.0)) + } + fn cbrt(self) -> Self { + OrderedFloat(self.0.cbrt()) + } + fn hypot(self, other: Self) -> Self { + OrderedFloat(self.0.hypot(other.0)) + } + fn sin(self) -> Self { + OrderedFloat(self.0.sin()) + } + fn cos(self) -> Self { + OrderedFloat(self.0.cos()) + } + fn tan(self) -> Self { + OrderedFloat(self.0.tan()) + } + fn asin(self) -> Self { + OrderedFloat(self.0.asin()) + } + fn acos(self) -> Self { + OrderedFloat(self.0.acos()) + } + fn atan(self) -> Self { + OrderedFloat(self.0.atan()) + } + fn atan2(self, other: Self) -> Self { + OrderedFloat(self.0.atan2(other.0)) + } + fn sin_cos(self) -> (Self, Self) { + let (a, b) = self.0.sin_cos(); + (OrderedFloat(a), OrderedFloat(b)) + } + fn exp_m1(self) -> Self { + OrderedFloat(self.0.exp_m1()) + } + fn ln_1p(self) -> Self { + OrderedFloat(self.0.ln_1p()) + } + fn sinh(self) -> Self { + OrderedFloat(self.0.sinh()) + } + fn cosh(self) -> Self { + OrderedFloat(self.0.cosh()) + } + fn tanh(self) -> Self { + OrderedFloat(self.0.tanh()) + } + fn asinh(self) -> Self { + OrderedFloat(self.0.asinh()) + } + fn acosh(self) -> Self { + OrderedFloat(self.0.acosh()) + } + fn atanh(self) -> Self { + OrderedFloat(self.0.atanh()) + } + fn integer_decode(self) -> (u64, i16, i8) { + self.0.integer_decode() + } + fn epsilon() -> Self { + OrderedFloat(T::epsilon()) + } + fn to_degrees(self) -> Self { + OrderedFloat(self.0.to_degrees()) + } + fn to_radians(self) -> Self { + OrderedFloat(self.0.to_radians()) + } +} + +impl Num for OrderedFloat { + type FromStrRadixErr = T::FromStrRadixErr; + fn from_str_radix(str: &str, radix: u32) -> Result { + T::from_str_radix(str, radix).map(OrderedFloat) + } +} + +/// A wrapper around floats providing an implementation of `Eq`, `Ord` and `Hash`. +/// +/// A NaN value cannot be stored in this type. +/// +/// ``` +/// use ordered_float::NotNan; +/// +/// let mut v = [ +/// NotNan::new(2.0).unwrap(), +/// NotNan::new(1.0).unwrap(), +/// ]; +/// v.sort(); +/// assert_eq!(v, [1.0, 2.0]); +/// ``` +/// +/// Because `NotNan` implements `Ord` and `Eq`, it can be used as a key in a `HashSet`, +/// `HashMap`, `BTreeMap`, or `BTreeSet` (unlike the primitive `f32` or `f64` types): +/// +/// ``` +/// # use ordered_float::NotNan; +/// # use std::collections::HashSet; +/// +/// let mut s: HashSet> = HashSet::new(); +/// let key = NotNan::new(1.0).unwrap(); +/// s.insert(key); +/// assert!(s.contains(&key)); +/// ``` +/// +/// Arithmetic on NotNan values will panic if it produces a NaN value: +/// +/// ```should_panic +/// # use ordered_float::NotNan; +/// let a = NotNan::new(std::f32::INFINITY).unwrap(); +/// let b = NotNan::new(std::f32::NEG_INFINITY).unwrap(); +/// +/// // This will panic: +/// let c = a + b; +/// ``` +#[derive(PartialOrd, PartialEq, Debug, Default, Clone, Copy)] +#[repr(transparent)] +pub struct NotNan(T); + +impl NotNan { + /// Create a `NotNan` value. + /// + /// Returns `Err` if `val` is NaN + pub fn new(val: T) -> Result { + match val { + ref val if val.is_nan() => Err(FloatIsNan), + val => Ok(NotNan(val)), + } + } +} + +impl NotNan { + /// Get the value out. + #[inline] + pub fn into_inner(self) -> T { + self.0 + } + + /// Create a `NotNan` value from a value that is guaranteed to not be NaN + /// + /// # Safety + /// + /// Behaviour is undefined if `val` is NaN + #[inline] + pub const unsafe fn new_unchecked(val: T) -> Self { + NotNan(val) + } + + /// Create a `NotNan` value from a value that is guaranteed to not be NaN + /// + /// # Safety + /// + /// Behaviour is undefined if `val` is NaN + #[deprecated( + since = "2.5.0", + note = "Please use the new_unchecked function instead." + )] + #[inline] + pub const unsafe fn unchecked_new(val: T) -> Self { + Self::new_unchecked(val) + } +} + +impl AsRef for NotNan { + #[inline] + fn as_ref(&self) -> &T { + &self.0 + } +} + +impl Borrow for NotNan { + #[inline] + fn borrow(&self) -> &f32 { + &self.0 + } +} + +impl Borrow for NotNan { + #[inline] + fn borrow(&self) -> &f64 { + &self.0 + } +} + +#[allow(clippy::derive_ord_xor_partial_ord)] +impl Ord for NotNan { + fn cmp(&self, other: &NotNan) -> Ordering { + match self.partial_cmp(other) { + Some(ord) => ord, + None => unsafe { unreachable_unchecked() }, + } + } +} + +impl Hash for NotNan { + #[inline] + fn hash(&self, state: &mut H) { + let bits = if self.is_zero() { + CANONICAL_ZERO_BITS + } else { + raw_double_bits(&self.0) + }; + + bits.hash(state) + } +} + +impl fmt::Display for NotNan { + #[inline] + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + self.0.fmt(f) + } +} + +impl NotNan { + /// Converts this [`NotNan`]`<`[`f64`]`>` to a [`NotNan`]`<`[`f32`]`>` while giving up on + /// precision, [using `roundTiesToEven` as rounding mode, yielding `Infinity` on + /// overflow](https://doc.rust-lang.org/reference/expressions/operator-expr.html#semantics). + pub fn as_f32(self) -> NotNan { + // This is not destroying invariants, as it is a pure rounding operation. The only two special + // cases are where f32 would be overflowing, then the operation yields Infinity, or where + // the input is already NaN, in which case the invariant is already broken elsewhere. + NotNan(self.0 as f32) + } +} + +impl From> for f32 { + #[inline] + fn from(value: NotNan) -> Self { + value.0 + } +} + +impl From> for f64 { + #[inline] + fn from(value: NotNan) -> Self { + value.0 + } +} + +impl TryFrom for NotNan { + type Error = FloatIsNan; + #[inline] + fn try_from(v: f32) -> Result { + NotNan::new(v) + } +} + +impl TryFrom for NotNan { + type Error = FloatIsNan; + #[inline] + fn try_from(v: f64) -> Result { + NotNan::new(v) + } +} + +macro_rules! impl_from_int_primitive { + ($primitive:ty, $inner:ty) => { + impl From<$primitive> for NotNan<$inner> { + fn from(source: $primitive) -> Self { + // the primitives with which this macro will be called cannot hold a value that + // f64::from would convert to NaN, so this does not hurt invariants + NotNan(<$inner as From<$primitive>>::from(source)) + } + } + }; +} + +impl_from_int_primitive!(i8, f64); +impl_from_int_primitive!(i16, f64); +impl_from_int_primitive!(i32, f64); +impl_from_int_primitive!(u8, f64); +impl_from_int_primitive!(u16, f64); +impl_from_int_primitive!(u32, f64); + +impl_from_int_primitive!(i8, f32); +impl_from_int_primitive!(i16, f32); +impl_from_int_primitive!(u8, f32); +impl_from_int_primitive!(u16, f32); + +impl From> for NotNan { + #[inline] + fn from(v: NotNan) -> NotNan { + unsafe { NotNan::new_unchecked(v.0 as f64) } + } +} + +impl Deref for NotNan { + type Target = T; + + #[inline] + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +impl Eq for NotNan {} + +impl PartialEq for NotNan { + #[inline] + fn eq(&self, other: &T) -> bool { + self.0 == *other + } +} + +/// Adds a float directly. +/// +/// Panics if the provided value is NaN or the computation results in NaN +impl Add for NotNan { + type Output = Self; + + #[inline] + fn add(self, other: T) -> Self { + NotNan::new(self.0 + other).expect("Addition resulted in NaN") + } +} + +/// Adds a float directly. +/// +/// Panics if the provided value is NaN. +impl Sum for NotNan { + fn sum>>(iter: I) -> Self { + NotNan::new(iter.map(|v| v.0).sum()).expect("Sum resulted in NaN") + } +} + +impl<'a, T: Float + Sum + 'a> Sum<&'a NotNan> for NotNan { + #[inline] + fn sum>>(iter: I) -> Self { + iter.cloned().sum() + } +} + +/// Subtracts a float directly. +/// +/// Panics if the provided value is NaN or the computation results in NaN +impl Sub for NotNan { + type Output = Self; + + #[inline] + fn sub(self, other: T) -> Self { + NotNan::new(self.0 - other).expect("Subtraction resulted in NaN") + } +} + +/// Multiplies a float directly. +/// +/// Panics if the provided value is NaN or the computation results in NaN +impl Mul for NotNan { + type Output = Self; + + #[inline] + fn mul(self, other: T) -> Self { + NotNan::new(self.0 * other).expect("Multiplication resulted in NaN") + } +} + +impl Product for NotNan { + fn product>>(iter: I) -> Self { + NotNan::new(iter.map(|v| v.0).product()).expect("Product resulted in NaN") + } +} + +impl<'a, T: Float + Product + 'a> Product<&'a NotNan> for NotNan { + #[inline] + fn product>>(iter: I) -> Self { + iter.cloned().product() + } +} + +/// Divides a float directly. +/// +/// Panics if the provided value is NaN or the computation results in NaN +impl Div for NotNan { + type Output = Self; + + #[inline] + fn div(self, other: T) -> Self { + NotNan::new(self.0 / other).expect("Division resulted in NaN") + } +} + +/// Calculates `%` with a float directly. +/// +/// Panics if the provided value is NaN or the computation results in NaN +impl Rem for NotNan { + type Output = Self; + + #[inline] + fn rem(self, other: T) -> Self { + NotNan::new(self.0 % other).expect("Rem resulted in NaN") + } +} + +macro_rules! impl_not_nan_binop { + ($imp:ident, $method:ident, $assign_imp:ident, $assign_method:ident) => { + impl $imp for NotNan { + type Output = Self; + + #[inline] + fn $method(self, other: Self) -> Self { + self.$method(other.0) + } + } + + impl $imp<&T> for NotNan { + type Output = NotNan; + + #[inline] + fn $method(self, other: &T) -> Self::Output { + self.$method(*other) + } + } + + impl $imp<&Self> for NotNan { + type Output = NotNan; + + #[inline] + fn $method(self, other: &Self) -> Self::Output { + self.$method(other.0) + } + } + + impl $imp for &NotNan { + type Output = NotNan; + + #[inline] + fn $method(self, other: Self) -> Self::Output { + (*self).$method(other.0) + } + } + + impl $imp> for &NotNan { + type Output = NotNan; + + #[inline] + fn $method(self, other: NotNan) -> Self::Output { + (*self).$method(other.0) + } + } + + impl $imp for &NotNan { + type Output = NotNan; + + #[inline] + fn $method(self, other: T) -> Self::Output { + (*self).$method(other) + } + } + + impl $imp<&T> for &NotNan { + type Output = NotNan; + + #[inline] + fn $method(self, other: &T) -> Self::Output { + (*self).$method(*other) + } + } + + impl $assign_imp for NotNan { + #[inline] + fn $assign_method(&mut self, other: T) { + *self = (*self).$method(other); + } + } + + impl $assign_imp<&T> for NotNan { + #[inline] + fn $assign_method(&mut self, other: &T) { + *self = (*self).$method(*other); + } + } + + impl $assign_imp for NotNan { + #[inline] + fn $assign_method(&mut self, other: Self) { + (*self).$assign_method(other.0); + } + } + + impl $assign_imp<&Self> for NotNan { + #[inline] + fn $assign_method(&mut self, other: &Self) { + (*self).$assign_method(other.0); + } + } + }; +} + +impl_not_nan_binop! {Add, add, AddAssign, add_assign} +impl_not_nan_binop! {Sub, sub, SubAssign, sub_assign} +impl_not_nan_binop! {Mul, mul, MulAssign, mul_assign} +impl_not_nan_binop! {Div, div, DivAssign, div_assign} +impl_not_nan_binop! {Rem, rem, RemAssign, rem_assign} + +// Will panic if NaN value is return from the operation +macro_rules! impl_not_nan_pow { + ($inner:ty, $rhs:ty) => { + #[cfg(feature = "std")] + impl Pow<$rhs> for NotNan<$inner> { + type Output = NotNan<$inner>; + #[inline] + fn pow(self, rhs: $rhs) -> NotNan<$inner> { + NotNan::new(<$inner>::pow(self.0, rhs)).expect("Pow resulted in NaN") + } + } + + #[cfg(feature = "std")] + impl<'a> Pow<&'a $rhs> for NotNan<$inner> { + type Output = NotNan<$inner>; + #[inline] + fn pow(self, rhs: &'a $rhs) -> NotNan<$inner> { + NotNan::new(<$inner>::pow(self.0, *rhs)).expect("Pow resulted in NaN") + } + } + + #[cfg(feature = "std")] + impl<'a> Pow<$rhs> for &'a NotNan<$inner> { + type Output = NotNan<$inner>; + #[inline] + fn pow(self, rhs: $rhs) -> NotNan<$inner> { + NotNan::new(<$inner>::pow(self.0, rhs)).expect("Pow resulted in NaN") + } + } + + #[cfg(feature = "std")] + impl<'a, 'b> Pow<&'a $rhs> for &'b NotNan<$inner> { + type Output = NotNan<$inner>; + #[inline] + fn pow(self, rhs: &'a $rhs) -> NotNan<$inner> { + NotNan::new(<$inner>::pow(self.0, *rhs)).expect("Pow resulted in NaN") + } + } + }; +} + +impl_not_nan_pow! {f32, i8} +impl_not_nan_pow! {f32, i16} +impl_not_nan_pow! {f32, u8} +impl_not_nan_pow! {f32, u16} +impl_not_nan_pow! {f32, i32} +impl_not_nan_pow! {f64, i8} +impl_not_nan_pow! {f64, i16} +impl_not_nan_pow! {f64, u8} +impl_not_nan_pow! {f64, u16} +impl_not_nan_pow! {f64, i32} +impl_not_nan_pow! {f32, f32} +impl_not_nan_pow! {f64, f32} +impl_not_nan_pow! {f64, f64} + +// This also should panic on NaN +macro_rules! impl_not_nan_self_pow { + ($base:ty, $exp:ty) => { + #[cfg(feature = "std")] + impl Pow> for NotNan<$base> { + type Output = NotNan<$base>; + #[inline] + fn pow(self, rhs: NotNan<$exp>) -> NotNan<$base> { + NotNan::new(self.0.pow(rhs.0)).expect("Pow resulted in NaN") + } + } + + #[cfg(feature = "std")] + impl<'a> Pow<&'a NotNan<$exp>> for NotNan<$base> { + type Output = NotNan<$base>; + #[inline] + fn pow(self, rhs: &'a NotNan<$exp>) -> NotNan<$base> { + NotNan::new(self.0.pow(rhs.0)).expect("Pow resulted in NaN") + } + } + + #[cfg(feature = "std")] + impl<'a> Pow> for &'a NotNan<$base> { + type Output = NotNan<$base>; + #[inline] + fn pow(self, rhs: NotNan<$exp>) -> NotNan<$base> { + NotNan::new(self.0.pow(rhs.0)).expect("Pow resulted in NaN") + } + } + + #[cfg(feature = "std")] + impl<'a, 'b> Pow<&'a NotNan<$exp>> for &'b NotNan<$base> { + type Output = NotNan<$base>; + #[inline] + fn pow(self, rhs: &'a NotNan<$exp>) -> NotNan<$base> { + NotNan::new(self.0.pow(rhs.0)).expect("Pow resulted in NaN") + } + } + }; +} + +impl_not_nan_self_pow! {f32, f32} +impl_not_nan_self_pow! {f64, f32} +impl_not_nan_self_pow! {f64, f64} + +impl Neg for NotNan { + type Output = Self; + + #[inline] + fn neg(self) -> Self { + NotNan(-self.0) + } +} + +impl Neg for &NotNan { + type Output = NotNan; + + #[inline] + fn neg(self) -> Self::Output { + NotNan(-self.0) + } +} + +/// An error indicating an attempt to construct NotNan from a NaN +#[derive(Copy, Clone, PartialEq, Eq, Debug)] +pub struct FloatIsNan; + +#[cfg(feature = "std")] +impl Error for FloatIsNan { + fn description(&self) -> &str { + "NotNan constructed with NaN" + } +} + +impl fmt::Display for FloatIsNan { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "NotNan constructed with NaN") + } +} + +#[cfg(feature = "std")] +impl From for std::io::Error { + #[inline] + fn from(e: FloatIsNan) -> std::io::Error { + std::io::Error::new(std::io::ErrorKind::InvalidInput, e) + } +} + +#[inline] +/// Used for hashing. Input must not be zero or NaN. +fn raw_double_bits(f: &F) -> u64 { + let (man, exp, sign) = f.integer_decode(); + let exp_u64 = exp as u16 as u64; + let sign_u64 = (sign > 0) as u64; + (man & MAN_MASK) | ((exp_u64 << 52) & EXP_MASK) | ((sign_u64 << 63) & SIGN_MASK) +} + +impl Zero for NotNan { + #[inline] + fn zero() -> Self { + NotNan(T::zero()) + } + + #[inline] + fn is_zero(&self) -> bool { + self.0.is_zero() + } +} + +impl One for NotNan { + #[inline] + fn one() -> Self { + NotNan(T::one()) + } +} + +impl Bounded for NotNan { + #[inline] + fn min_value() -> Self { + NotNan(T::min_value()) + } + + #[inline] + fn max_value() -> Self { + NotNan(T::max_value()) + } +} + +impl FromStr for NotNan { + type Err = ParseNotNanError; + + /// Convert a &str to `NotNan`. Returns an error if the string fails to parse, + /// or if the resulting value is NaN + /// + /// ``` + /// use ordered_float::NotNan; + /// + /// assert!("-10".parse::>().is_ok()); + /// assert!("abc".parse::>().is_err()); + /// assert!("NaN".parse::>().is_err()); + /// ``` + fn from_str(src: &str) -> Result { + src.parse() + .map_err(ParseNotNanError::ParseFloatError) + .and_then(|f| NotNan::new(f).map_err(|_| ParseNotNanError::IsNaN)) + } +} + +impl FromPrimitive for NotNan { + fn from_i64(n: i64) -> Option { + T::from_i64(n).and_then(|n| NotNan::new(n).ok()) + } + fn from_u64(n: u64) -> Option { + T::from_u64(n).and_then(|n| NotNan::new(n).ok()) + } + + fn from_isize(n: isize) -> Option { + T::from_isize(n).and_then(|n| NotNan::new(n).ok()) + } + fn from_i8(n: i8) -> Option { + T::from_i8(n).and_then(|n| NotNan::new(n).ok()) + } + fn from_i16(n: i16) -> Option { + T::from_i16(n).and_then(|n| NotNan::new(n).ok()) + } + fn from_i32(n: i32) -> Option { + T::from_i32(n).and_then(|n| NotNan::new(n).ok()) + } + fn from_usize(n: usize) -> Option { + T::from_usize(n).and_then(|n| NotNan::new(n).ok()) + } + fn from_u8(n: u8) -> Option { + T::from_u8(n).and_then(|n| NotNan::new(n).ok()) + } + fn from_u16(n: u16) -> Option { + T::from_u16(n).and_then(|n| NotNan::new(n).ok()) + } + fn from_u32(n: u32) -> Option { + T::from_u32(n).and_then(|n| NotNan::new(n).ok()) + } + fn from_f32(n: f32) -> Option { + T::from_f32(n).and_then(|n| NotNan::new(n).ok()) + } + fn from_f64(n: f64) -> Option { + T::from_f64(n).and_then(|n| NotNan::new(n).ok()) + } +} + +impl ToPrimitive for NotNan { + fn to_i64(&self) -> Option { + self.0.to_i64() + } + fn to_u64(&self) -> Option { + self.0.to_u64() + } + + fn to_isize(&self) -> Option { + self.0.to_isize() + } + fn to_i8(&self) -> Option { + self.0.to_i8() + } + fn to_i16(&self) -> Option { + self.0.to_i16() + } + fn to_i32(&self) -> Option { + self.0.to_i32() + } + fn to_usize(&self) -> Option { + self.0.to_usize() + } + fn to_u8(&self) -> Option { + self.0.to_u8() + } + fn to_u16(&self) -> Option { + self.0.to_u16() + } + fn to_u32(&self) -> Option { + self.0.to_u32() + } + fn to_f32(&self) -> Option { + self.0.to_f32() + } + fn to_f64(&self) -> Option { + self.0.to_f64() + } +} + +/// An error indicating a parse error from a string for `NotNan`. +#[derive(Copy, Clone, PartialEq, Eq, Debug)] +pub enum ParseNotNanError { + /// A plain parse error from the underlying float type. + ParseFloatError(E), + /// The parsed float value resulted in a NaN. + IsNaN, +} + +#[cfg(feature = "std")] +impl Error for ParseNotNanError { + fn description(&self) -> &str { + "Error parsing a not-NaN floating point value" + } + + fn source(&self) -> Option<&(dyn Error + 'static)> { + match self { + ParseNotNanError::ParseFloatError(e) => Some(e), + ParseNotNanError::IsNaN => None, + } + } +} + +impl fmt::Display for ParseNotNanError { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match self { + ParseNotNanError::ParseFloatError(e) => write!(f, "Parse error: {}", e), + ParseNotNanError::IsNaN => write!(f, "NotNan parser encounter a NaN"), + } + } +} + +impl Num for NotNan { + type FromStrRadixErr = ParseNotNanError; + + fn from_str_radix(src: &str, radix: u32) -> Result { + T::from_str_radix(src, radix) + .map_err(ParseNotNanError::ParseFloatError) + .and_then(|n| NotNan::new(n).map_err(|_| ParseNotNanError::IsNaN)) + } +} + +impl Signed for NotNan { + #[inline] + fn abs(&self) -> Self { + NotNan(self.0.abs()) + } + + fn abs_sub(&self, other: &Self) -> Self { + NotNan::new(Signed::abs_sub(&self.0, &other.0)).expect("Subtraction resulted in NaN") + } + + #[inline] + fn signum(&self) -> Self { + NotNan(self.0.signum()) + } + #[inline] + fn is_positive(&self) -> bool { + self.0.is_positive() + } + #[inline] + fn is_negative(&self) -> bool { + self.0.is_negative() + } +} + +impl NumCast for NotNan { + fn from(n: F) -> Option { + T::from(n).and_then(|n| NotNan::new(n).ok()) + } +} + +macro_rules! impl_float_const_method { + ($wrapper:expr, $method:ident) => { + #[allow(non_snake_case)] + fn $method() -> Self { + $wrapper(T::$method()) + } + }; +} + +macro_rules! impl_float_const { + ($type:ident, $wrapper:expr) => { + impl FloatConst for $type { + impl_float_const_method!($wrapper, E); + impl_float_const_method!($wrapper, FRAC_1_PI); + impl_float_const_method!($wrapper, FRAC_1_SQRT_2); + impl_float_const_method!($wrapper, FRAC_2_PI); + impl_float_const_method!($wrapper, FRAC_2_SQRT_PI); + impl_float_const_method!($wrapper, FRAC_PI_2); + impl_float_const_method!($wrapper, FRAC_PI_3); + impl_float_const_method!($wrapper, FRAC_PI_4); + impl_float_const_method!($wrapper, FRAC_PI_6); + impl_float_const_method!($wrapper, FRAC_PI_8); + impl_float_const_method!($wrapper, LN_10); + impl_float_const_method!($wrapper, LN_2); + impl_float_const_method!($wrapper, LOG10_E); + impl_float_const_method!($wrapper, LOG2_E); + impl_float_const_method!($wrapper, PI); + impl_float_const_method!($wrapper, SQRT_2); + } + }; +} + +impl_float_const!(OrderedFloat, OrderedFloat); +// Float constants are not NaN. +impl_float_const!(NotNan, |x| unsafe { NotNan::new_unchecked(x) }); + +#[cfg(feature = "serde")] +mod impl_serde { + extern crate serde; + use self::serde::de::{Error, Unexpected}; + use self::serde::{Deserialize, Deserializer, Serialize, Serializer}; + use super::{NotNan, OrderedFloat}; + use core::f64; + #[cfg(not(feature = "std"))] + use num_traits::float::FloatCore as Float; + #[cfg(feature = "std")] + use num_traits::Float; + + #[cfg(test)] + extern crate serde_test; + #[cfg(test)] + use self::serde_test::{assert_de_tokens_error, assert_tokens, Token}; + + impl Serialize for OrderedFloat { + #[inline] + fn serialize(&self, s: S) -> Result { + self.0.serialize(s) + } + } + + impl<'de, T: Float + Deserialize<'de>> Deserialize<'de> for OrderedFloat { + #[inline] + fn deserialize>(d: D) -> Result { + T::deserialize(d).map(OrderedFloat) + } + } + + impl Serialize for NotNan { + #[inline] + fn serialize(&self, s: S) -> Result { + self.0.serialize(s) + } + } + + impl<'de, T: Float + Deserialize<'de>> Deserialize<'de> for NotNan { + fn deserialize>(d: D) -> Result { + let float = T::deserialize(d)?; + NotNan::new(float).map_err(|_| { + Error::invalid_value(Unexpected::Float(f64::NAN), &"float (but not NaN)") + }) + } + } + + #[test] + fn test_ordered_float() { + let float = OrderedFloat(1.0f64); + assert_tokens(&float, &[Token::F64(1.0)]); + } + + #[test] + fn test_not_nan() { + let float = NotNan(1.0f64); + assert_tokens(&float, &[Token::F64(1.0)]); + } + + #[test] + fn test_fail_on_nan() { + assert_de_tokens_error::>( + &[Token::F64(f64::NAN)], + "invalid value: floating point `NaN`, expected float (but not NaN)", + ); + } +} + +#[cfg(any(feature = "rkyv_16", feature = "rkyv_32", feature = "rkyv_64"))] +mod impl_rkyv { + use super::{NotNan, OrderedFloat}; + #[cfg(not(feature = "std"))] + use num_traits::float::FloatCore as Float; + #[cfg(feature = "std")] + use num_traits::Float; + #[cfg(test)] + use rkyv::{archived_root, ser::Serializer}; + use rkyv::{Archive, Deserialize, Fallible, Serialize}; + + #[cfg(test)] + type DefaultSerializer = rkyv::ser::serializers::CoreSerializer<16, 16>; + #[cfg(test)] + type DefaultDeserializer = rkyv::Infallible; + + impl Archive for OrderedFloat { + type Archived = OrderedFloat; + + type Resolver = T::Resolver; + + unsafe fn resolve(&self, pos: usize, resolver: Self::Resolver, out: *mut Self::Archived) { + self.0.resolve(pos, resolver, out.cast()) + } + } + + impl, S: Fallible + ?Sized> Serialize for OrderedFloat { + fn serialize(&self, s: &mut S) -> Result { + self.0.serialize(s) + } + } + + impl, D: Fallible + ?Sized> Deserialize, D> + for OrderedFloat + { + fn deserialize(&self, d: &mut D) -> Result, D::Error> { + self.0.deserialize(d).map(OrderedFloat) + } + } + + impl Archive for NotNan { + type Archived = NotNan; + + type Resolver = T::Resolver; + + unsafe fn resolve(&self, pos: usize, resolver: Self::Resolver, out: *mut Self::Archived) { + self.0.resolve(pos, resolver, out.cast()) + } + } + + impl, S: Fallible + ?Sized> Serialize for NotNan { + fn serialize(&self, s: &mut S) -> Result { + self.0.serialize(s) + } + } + + impl, D: Fallible + ?Sized> Deserialize, D> + for NotNan + { + fn deserialize(&self, d: &mut D) -> Result, D::Error> { + self.0.deserialize(d).map(NotNan) + } + } + + macro_rules! rkyv_eq_ord { + ($main:ident, $float:ty, $rend:ty) => { + impl PartialEq<$main<$float>> for $main<$rend> { + fn eq(&self, other: &$main<$float>) -> bool { + other.eq(&self.0.value()) + } + } + impl PartialEq<$main<$rend>> for $main<$float> { + fn eq(&self, other: &$main<$rend>) -> bool { + self.eq(&other.0.value()) + } + } + + impl PartialOrd<$main<$float>> for $main<$rend> { + fn partial_cmp(&self, other: &$main<$float>) -> Option { + self.0.value().partial_cmp(other) + } + } + + impl PartialOrd<$main<$rend>> for $main<$float> { + fn partial_cmp(&self, other: &$main<$rend>) -> Option { + other + .0 + .value() + .partial_cmp(self) + .map(core::cmp::Ordering::reverse) + } + } + }; + } + + rkyv_eq_ord! { OrderedFloat, f32, rkyv::rend::f32_le } + rkyv_eq_ord! { OrderedFloat, f32, rkyv::rend::f32_be } + rkyv_eq_ord! { OrderedFloat, f64, rkyv::rend::f64_le } + rkyv_eq_ord! { OrderedFloat, f64, rkyv::rend::f64_be } + rkyv_eq_ord! { NotNan, f32, rkyv::rend::f32_le } + rkyv_eq_ord! { NotNan, f32, rkyv::rend::f32_be } + rkyv_eq_ord! { NotNan, f64, rkyv::rend::f64_le } + rkyv_eq_ord! { NotNan, f64, rkyv::rend::f64_be } + + #[cfg(feature = "rkyv_ck")] + use super::FloatIsNan; + #[cfg(feature = "rkyv_ck")] + use core::convert::Infallible; + #[cfg(feature = "rkyv_ck")] + use rkyv::bytecheck::CheckBytes; + + #[cfg(feature = "rkyv_ck")] + impl> CheckBytes for OrderedFloat { + type Error = Infallible; + + #[inline] + unsafe fn check_bytes<'a>(value: *const Self, _: &mut C) -> Result<&'a Self, Self::Error> { + Ok(&*value) + } + } + + #[cfg(feature = "rkyv_ck")] + impl> CheckBytes for NotNan { + type Error = FloatIsNan; + + #[inline] + unsafe fn check_bytes<'a>(value: *const Self, _: &mut C) -> Result<&'a Self, Self::Error> { + Self::new(*(value as *const T)).map(|_| &*value) + } + } + + #[test] + fn test_ordered_float() { + let float = OrderedFloat(1.0f64); + let mut serializer = DefaultSerializer::default(); + serializer + .serialize_value(&float) + .expect("failed to archive value"); + let len = serializer.pos(); + let buffer = serializer.into_serializer().into_inner(); + + let archived_value = unsafe { archived_root::>(&buffer[0..len]) }; + assert_eq!(archived_value, &float); + let mut deserializer = DefaultDeserializer::default(); + let deser_float: OrderedFloat = archived_value.deserialize(&mut deserializer).unwrap(); + assert_eq!(deser_float, float); + } + + #[test] + fn test_not_nan() { + let float = NotNan(1.0f64); + let mut serializer = DefaultSerializer::default(); + serializer + .serialize_value(&float) + .expect("failed to archive value"); + let len = serializer.pos(); + let buffer = serializer.into_serializer().into_inner(); + + let archived_value = unsafe { archived_root::>(&buffer[0..len]) }; + assert_eq!(archived_value, &float); + let mut deserializer = DefaultDeserializer::default(); + let deser_float: NotNan = archived_value.deserialize(&mut deserializer).unwrap(); + assert_eq!(deser_float, float); + } +} + +#[cfg(feature = "speedy")] +mod impl_speedy { + use super::{NotNan, OrderedFloat}; + use num_traits::Float; + use speedy::{Context, Readable, Reader, Writable, Writer}; + + impl Writable for OrderedFloat + where + C: Context, + T: Writable, + { + fn write_to>(&self, writer: &mut W) -> Result<(), C::Error> { + self.0.write_to(writer) + } + + fn bytes_needed(&self) -> Result { + self.0.bytes_needed() + } + } + + impl Writable for NotNan + where + C: Context, + T: Writable, + { + fn write_to>(&self, writer: &mut W) -> Result<(), C::Error> { + self.0.write_to(writer) + } + + fn bytes_needed(&self) -> Result { + self.0.bytes_needed() + } + } + + impl<'a, T, C: Context> Readable<'a, C> for OrderedFloat + where + T: Readable<'a, C>, + { + fn read_from>(reader: &mut R) -> Result { + T::read_from(reader).map(OrderedFloat) + } + + fn minimum_bytes_needed() -> usize { + T::minimum_bytes_needed() + } + } + + impl<'a, T: Float, C: Context> Readable<'a, C> for NotNan + where + T: Readable<'a, C>, + { + fn read_from>(reader: &mut R) -> Result { + let value: T = reader.read_value()?; + Self::new(value).map_err(|error| { + speedy::Error::custom(std::format!("failed to read NotNan: {}", error)).into() + }) + } + + fn minimum_bytes_needed() -> usize { + T::minimum_bytes_needed() + } + } + + #[test] + fn test_ordered_float() { + let float = OrderedFloat(1.0f64); + let buffer = float.write_to_vec().unwrap(); + let deser_float: OrderedFloat = OrderedFloat::read_from_buffer(&buffer).unwrap(); + assert_eq!(deser_float, float); + } + + #[test] + fn test_not_nan() { + let float = NotNan(1.0f64); + let buffer = float.write_to_vec().unwrap(); + let deser_float: NotNan = NotNan::read_from_buffer(&buffer).unwrap(); + assert_eq!(deser_float, float); + } + + #[test] + fn test_not_nan_with_nan() { + let nan_buf = f64::nan().write_to_vec().unwrap(); + let nan_err: Result, _> = NotNan::read_from_buffer(&nan_buf); + assert!(nan_err.is_err()); + } +} + +#[cfg(all(feature = "std", feature = "schemars"))] +mod impl_schemars { + extern crate schemars; + use self::schemars::gen::SchemaGenerator; + use self::schemars::schema::{InstanceType, Schema, SchemaObject}; + use super::{NotNan, OrderedFloat}; + + macro_rules! primitive_float_impl { + ($type:ty, $schema_name:literal) => { + impl schemars::JsonSchema for $type { + fn is_referenceable() -> bool { + false + } + + fn schema_name() -> std::string::String { + std::string::String::from($schema_name) + } + + fn json_schema(_: &mut SchemaGenerator) -> Schema { + SchemaObject { + instance_type: Some(InstanceType::Number.into()), + format: Some(std::string::String::from($schema_name)), + ..Default::default() + } + .into() + } + } + }; + } + + primitive_float_impl!(OrderedFloat, "float"); + primitive_float_impl!(OrderedFloat, "double"); + primitive_float_impl!(NotNan, "float"); + primitive_float_impl!(NotNan, "double"); + + #[test] + fn schema_generation_does_not_panic_for_common_floats() { + { + let schema = schemars::gen::SchemaGenerator::default() + .into_root_schema_for::>(); + assert_eq!( + schema.schema.instance_type, + Some(schemars::schema::SingleOrVec::Single(std::boxed::Box::new( + schemars::schema::InstanceType::Number + ))) + ); + assert_eq!( + schema.schema.metadata.unwrap().title.unwrap(), + std::string::String::from("float") + ); + } + { + let schema = schemars::gen::SchemaGenerator::default() + .into_root_schema_for::>(); + assert_eq!( + schema.schema.instance_type, + Some(schemars::schema::SingleOrVec::Single(std::boxed::Box::new( + schemars::schema::InstanceType::Number + ))) + ); + assert_eq!( + schema.schema.metadata.unwrap().title.unwrap(), + std::string::String::from("double") + ); + } + { + let schema = + schemars::gen::SchemaGenerator::default().into_root_schema_for::>(); + assert_eq!( + schema.schema.instance_type, + Some(schemars::schema::SingleOrVec::Single(std::boxed::Box::new( + schemars::schema::InstanceType::Number + ))) + ); + assert_eq!( + schema.schema.metadata.unwrap().title.unwrap(), + std::string::String::from("float") + ); + } + { + let schema = + schemars::gen::SchemaGenerator::default().into_root_schema_for::>(); + assert_eq!( + schema.schema.instance_type, + Some(schemars::schema::SingleOrVec::Single(std::boxed::Box::new( + schemars::schema::InstanceType::Number + ))) + ); + assert_eq!( + schema.schema.metadata.unwrap().title.unwrap(), + std::string::String::from("double") + ); + } + } + #[test] + fn ordered_float_schema_match_primitive_schema() { + { + let of_schema = schemars::gen::SchemaGenerator::default() + .into_root_schema_for::>(); + let prim_schema = + schemars::gen::SchemaGenerator::default().into_root_schema_for::(); + assert_eq!(of_schema, prim_schema); + } + { + let of_schema = schemars::gen::SchemaGenerator::default() + .into_root_schema_for::>(); + let prim_schema = + schemars::gen::SchemaGenerator::default().into_root_schema_for::(); + assert_eq!(of_schema, prim_schema); + } + { + let of_schema = + schemars::gen::SchemaGenerator::default().into_root_schema_for::>(); + let prim_schema = + schemars::gen::SchemaGenerator::default().into_root_schema_for::(); + assert_eq!(of_schema, prim_schema); + } + { + let of_schema = + schemars::gen::SchemaGenerator::default().into_root_schema_for::>(); + let prim_schema = + schemars::gen::SchemaGenerator::default().into_root_schema_for::(); + assert_eq!(of_schema, prim_schema); + } + } +} + +#[cfg(feature = "rand")] +mod impl_rand { + use super::{NotNan, OrderedFloat}; + use rand::distributions::uniform::*; + use rand::distributions::{Distribution, Open01, OpenClosed01, Standard}; + use rand::Rng; + + macro_rules! impl_distribution { + ($dist:ident, $($f:ty),+) => { + $( + impl Distribution> for $dist { + fn sample(&self, rng: &mut R) -> NotNan<$f> { + // 'rand' never generates NaN values in the Standard, Open01, or + // OpenClosed01 distributions. Using 'new_unchecked' is therefore + // safe. + unsafe { NotNan::new_unchecked(self.sample(rng)) } + } + } + + impl Distribution> for $dist { + fn sample(&self, rng: &mut R) -> OrderedFloat<$f> { + OrderedFloat(self.sample(rng)) + } + } + )* + } + } + + impl_distribution! { Standard, f32, f64 } + impl_distribution! { Open01, f32, f64 } + impl_distribution! { OpenClosed01, f32, f64 } + + /// A sampler for a uniform distribution + #[derive(Clone, Copy, Debug, PartialEq)] + #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] + pub struct UniformNotNan(UniformFloat); + impl SampleUniform for NotNan { + type Sampler = UniformNotNan; + } + impl SampleUniform for NotNan { + type Sampler = UniformNotNan; + } + + /// A sampler for a uniform distribution + #[derive(Clone, Copy, Debug, PartialEq)] + #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] + pub struct UniformOrdered(UniformFloat); + impl SampleUniform for OrderedFloat { + type Sampler = UniformOrdered; + } + impl SampleUniform for OrderedFloat { + type Sampler = UniformOrdered; + } + + macro_rules! impl_uniform_sampler { + ($f:ty) => { + impl UniformSampler for UniformNotNan<$f> { + type X = NotNan<$f>; + fn new(low: B1, high: B2) -> Self + where + B1: SampleBorrow + Sized, + B2: SampleBorrow + Sized, + { + UniformNotNan(UniformFloat::<$f>::new(low.borrow().0, high.borrow().0)) + } + fn new_inclusive(low: B1, high: B2) -> Self + where + B1: SampleBorrow + Sized, + B2: SampleBorrow + Sized, + { + UniformSampler::new(low, high) + } + fn sample(&self, rng: &mut R) -> Self::X { + // UniformFloat.sample() will never return NaN. + unsafe { NotNan::new_unchecked(self.0.sample(rng)) } + } + } + + impl UniformSampler for UniformOrdered<$f> { + type X = OrderedFloat<$f>; + fn new(low: B1, high: B2) -> Self + where + B1: SampleBorrow + Sized, + B2: SampleBorrow + Sized, + { + UniformOrdered(UniformFloat::<$f>::new(low.borrow().0, high.borrow().0)) + } + fn new_inclusive(low: B1, high: B2) -> Self + where + B1: SampleBorrow + Sized, + B2: SampleBorrow + Sized, + { + UniformSampler::new(low, high) + } + fn sample(&self, rng: &mut R) -> Self::X { + OrderedFloat(self.0.sample(rng)) + } + } + }; + } + + impl_uniform_sampler! { f32 } + impl_uniform_sampler! { f64 } + + #[cfg(all(test, feature = "randtest"))] + mod tests { + use super::*; + + fn sample_fuzz() + where + Standard: Distribution>, + Open01: Distribution>, + OpenClosed01: Distribution>, + Standard: Distribution>, + Open01: Distribution>, + OpenClosed01: Distribution>, + T: crate::Float, + { + let mut rng = rand::thread_rng(); + let f1: NotNan = rng.sample(Standard); + let f2: NotNan = rng.sample(Open01); + let f3: NotNan = rng.sample(OpenClosed01); + let _: OrderedFloat = rng.sample(Standard); + let _: OrderedFloat = rng.sample(Open01); + let _: OrderedFloat = rng.sample(OpenClosed01); + assert!(!f1.into_inner().is_nan()); + assert!(!f2.into_inner().is_nan()); + assert!(!f3.into_inner().is_nan()); + } + + #[test] + fn sampling_f32_does_not_panic() { + sample_fuzz::(); + } + + #[test] + fn sampling_f64_does_not_panic() { + sample_fuzz::(); + } + + #[test] + #[should_panic] + fn uniform_sampling_panic_on_infinity_notnan() { + let (low, high) = ( + NotNan::new(0f64).unwrap(), + NotNan::new(core::f64::INFINITY).unwrap(), + ); + let uniform = Uniform::new(low, high); + let _ = uniform.sample(&mut rand::thread_rng()); + } + + #[test] + #[should_panic] + fn uniform_sampling_panic_on_infinity_ordered() { + let (low, high) = (OrderedFloat(0f64), OrderedFloat(core::f64::INFINITY)); + let uniform = Uniform::new(low, high); + let _ = uniform.sample(&mut rand::thread_rng()); + } + + #[test] + #[should_panic] + fn uniform_sampling_panic_on_nan_ordered() { + let (low, high) = (OrderedFloat(0f64), OrderedFloat(core::f64::NAN)); + let uniform = Uniform::new(low, high); + let _ = uniform.sample(&mut rand::thread_rng()); + } + } +} + +#[cfg(feature = "proptest")] +mod impl_proptest { + use super::{NotNan, OrderedFloat}; + use proptest::arbitrary::{Arbitrary, StrategyFor}; + use proptest::num::{f32, f64}; + use proptest::strategy::{FilterMap, Map, Strategy}; + use std::convert::TryFrom; + + macro_rules! impl_arbitrary { + ($($f:ident),+) => { + $( + impl Arbitrary for NotNan<$f> { + type Strategy = FilterMap, fn(_: $f) -> Option>>; + type Parameters = <$f as Arbitrary>::Parameters; + fn arbitrary_with(params: Self::Parameters) -> Self::Strategy { + <$f>::arbitrary_with(params) + .prop_filter_map("filter nan values", |f| NotNan::try_from(f).ok()) + } + } + + impl Arbitrary for OrderedFloat<$f> { + type Strategy = Map, fn(_: $f) -> OrderedFloat<$f>>; + type Parameters = <$f as Arbitrary>::Parameters; + fn arbitrary_with(params: Self::Parameters) -> Self::Strategy { + <$f>::arbitrary_with(params).prop_map(|f| OrderedFloat::from(f)) + } + } + )* + } + } + impl_arbitrary! { f32, f64 } +} + +#[cfg(feature = "arbitrary")] +mod impl_arbitrary { + use super::{FloatIsNan, NotNan, OrderedFloat}; + use arbitrary::{Arbitrary, Unstructured}; + use num_traits::FromPrimitive; + + macro_rules! impl_arbitrary { + ($($f:ident),+) => { + $( + impl<'a> Arbitrary<'a> for NotNan<$f> { + fn arbitrary(u: &mut Unstructured<'a>) -> arbitrary::Result { + let float: $f = u.arbitrary()?; + match NotNan::new(float) { + Ok(notnan_value) => Ok(notnan_value), + Err(FloatIsNan) => { + // If our arbitrary float input was a NaN (encoded by exponent = max + // value), then replace it with a finite float, reusing the mantissa + // bits. + // + // This means the output is not uniformly distributed among all + // possible float values, but Arbitrary makes no promise that that + // is true. + // + // An alternative implementation would be to return an + // `arbitrary::Error`, but that is not as useful since it forces the + // caller to retry with new random/fuzzed data; and the precendent of + // `arbitrary`'s built-in implementations is to prefer the approach of + // mangling the input bits to fit. + + let (mantissa, _exponent, sign) = + num_traits::Float::integer_decode(float); + let revised_float = <$f>::from_i64( + i64::from(sign) * mantissa as i64 + ).unwrap(); + + // If this unwrap() fails, then there is a bug in the above code. + Ok(NotNan::new(revised_float).unwrap()) + } + } + } + + fn size_hint(depth: usize) -> (usize, Option) { + <$f as Arbitrary>::size_hint(depth) + } + } + + impl<'a> Arbitrary<'a> for OrderedFloat<$f> { + fn arbitrary(u: &mut Unstructured<'a>) -> arbitrary::Result { + let float: $f = u.arbitrary()?; + Ok(OrderedFloat::from(float)) + } + + fn size_hint(depth: usize) -> (usize, Option) { + <$f as Arbitrary>::size_hint(depth) + } + } + )* + } + } + impl_arbitrary! { f32, f64 } +} + +#[cfg(feature = "bytemuck")] +mod impl_bytemuck { + use super::{Float, NotNan, OrderedFloat}; + use bytemuck::{AnyBitPattern, CheckedBitPattern, NoUninit, Pod, Zeroable}; + + unsafe impl Zeroable for OrderedFloat {} + + // The zero bit pattern is indeed not a NaN bit pattern. + unsafe impl Zeroable for NotNan {} + + unsafe impl Pod for OrderedFloat {} + + // `NotNan` can only implement `NoUninit` and not `Pod`, since not every bit pattern is + // valid (NaN bit patterns are invalid). `NoUninit` guarantees that we can read any bit pattern + // from the value, which is fine in this case. + unsafe impl NoUninit for NotNan {} + + unsafe impl CheckedBitPattern for NotNan { + type Bits = T; + + fn is_valid_bit_pattern(bits: &Self::Bits) -> bool { + !bits.is_nan() + } + } + + #[test] + fn test_not_nan_bit_pattern() { + use bytemuck::checked::{try_cast, CheckedCastError}; + + let nan = f64::NAN; + assert_eq!( + try_cast::>(nan), + Err(CheckedCastError::InvalidBitPattern), + ); + + let pi = core::f64::consts::PI; + assert!(try_cast::>(pi).is_ok()); + } +} diff -Nru temporalio-1.3.0/vendor/ordered-float/tests/test.rs temporalio-1.3.0/vendor/ordered-float/tests/test.rs --- temporalio-1.3.0/vendor/ordered-float/tests/test.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ordered-float/tests/test.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,862 @@ +#![allow(clippy::float_cmp, clippy::eq_op, clippy::op_ref)] + +extern crate num_traits; +extern crate ordered_float; + +#[cfg(not(feature = "std"))] +pub use num_traits::float::FloatCore as Float; +pub use num_traits::{Bounded, FloatConst, FromPrimitive, Num, One, Signed, ToPrimitive, Zero}; +#[cfg(feature = "std")] +pub use num_traits::{Float, Pow}; +pub use ordered_float::*; + +pub use std::cmp::Ordering::*; +pub use std::convert::TryFrom; +pub use std::{f32, f64, panic}; + +pub use std::collections::hash_map::RandomState; +pub use std::collections::HashSet; +pub use std::hash::*; + +fn not_nan(x: T) -> NotNan { + NotNan::new(x).unwrap() +} + +#[test] +fn ordered_f32_compare_regular_floats() { + assert_eq!(OrderedFloat(7.0f32).cmp(&OrderedFloat(7.0)), Equal); + assert_eq!(OrderedFloat(8.0f32).cmp(&OrderedFloat(7.0)), Greater); + assert_eq!(OrderedFloat(4.0f32).cmp(&OrderedFloat(7.0)), Less); +} + +#[test] +fn ordered_f32_compare_regular_floats_op() { + assert!(OrderedFloat(7.0f32) == OrderedFloat(7.0)); + assert!(OrderedFloat(7.0f32) <= OrderedFloat(7.0)); + assert!(OrderedFloat(7.0f32) >= OrderedFloat(7.0)); + assert!(OrderedFloat(8.0f32) > OrderedFloat(7.0)); + assert!(OrderedFloat(8.0f32) >= OrderedFloat(7.0)); + assert!(OrderedFloat(4.0f32) < OrderedFloat(7.0)); + assert!(OrderedFloat(4.0f32) <= OrderedFloat(7.0)); +} + +#[test] +fn ordered_f32_compare_nan() { + let f32_nan: f32 = Float::nan(); + assert_eq!( + OrderedFloat(f32_nan).cmp(&OrderedFloat(Float::nan())), + Equal + ); + assert_eq!( + OrderedFloat(f32_nan).cmp(&OrderedFloat(-100000.0f32)), + Greater + ); + assert_eq!( + OrderedFloat(-100.0f32).cmp(&OrderedFloat(Float::nan())), + Less + ); +} + +#[test] +fn ordered_f32_compare_nan_op() { + let f32_nan: OrderedFloat = OrderedFloat(Float::nan()); + assert!(f32_nan == f32_nan); + assert!(f32_nan <= f32_nan); + assert!(f32_nan >= f32_nan); + assert!(f32_nan > OrderedFloat(-100000.0f32)); + assert!(f32_nan >= OrderedFloat(-100000.0f32)); + assert!(OrderedFloat(-100.0f32) < f32_nan); + assert!(OrderedFloat(-100.0f32) <= f32_nan); + assert!(f32_nan > OrderedFloat(f32::infinity())); + assert!(f32_nan >= OrderedFloat(f32::infinity())); + assert!(f32_nan > OrderedFloat(f32::neg_infinity())); + assert!(f32_nan >= OrderedFloat(f32::neg_infinity())); +} + +#[test] +fn ordered_f64_compare_regular_floats() { + assert_eq!(OrderedFloat(7.0f64).cmp(&OrderedFloat(7.0)), Equal); + assert_eq!(OrderedFloat(8.0f64).cmp(&OrderedFloat(7.0)), Greater); + assert_eq!(OrderedFloat(4.0f64).cmp(&OrderedFloat(7.0)), Less); +} + +#[test] +fn not_nan32_zero() { + assert_eq!(NotNan::::zero(), 0.0f32); + assert!(NotNan::::zero().is_zero()); +} + +#[test] +fn not_nan32_one() { + assert_eq!(NotNan::::one(), 1.0f32) +} + +#[test] +fn not_nan32_bounded() { + assert_eq!(NotNan::::min_value(), ::min_value()); + assert_eq!(NotNan::::max_value(), ::max_value()); +} + +#[test] +fn not_nan32_from_primitive() { + assert_eq!(NotNan::::from_i8(42i8), Some(not_nan(42.0))); + assert_eq!(NotNan::::from_u8(42u8), Some(not_nan(42.0))); + assert_eq!(NotNan::::from_i16(42i16), Some(not_nan(42.0))); + assert_eq!(NotNan::::from_u16(42u16), Some(not_nan(42.0))); + assert_eq!(NotNan::::from_i32(42i32), Some(not_nan(42.0))); + assert_eq!(NotNan::::from_u32(42u32), Some(not_nan(42.0))); + assert_eq!(NotNan::::from_i64(42i64), Some(not_nan(42.0))); + assert_eq!(NotNan::::from_u64(42u64), Some(not_nan(42.0))); + assert_eq!(NotNan::::from_isize(42isize), Some(not_nan(42.0))); + assert_eq!(NotNan::::from_usize(42usize), Some(not_nan(42.0))); + assert_eq!(NotNan::::from_f32(42f32), Some(not_nan(42.0))); + assert_eq!(NotNan::::from_f32(42f32), Some(not_nan(42.0))); + assert_eq!(NotNan::::from_f64(42f64), Some(not_nan(42.0))); + assert_eq!(NotNan::::from_f64(42f64), Some(not_nan(42.0))); + assert_eq!(NotNan::::from_f32(Float::nan()), None); + assert_eq!(NotNan::::from_f64(Float::nan()), None); +} + +#[test] +fn not_nan32_to_primitive() { + let x = not_nan(42.0f32); + assert_eq!(x.to_u8(), Some(42u8)); + assert_eq!(x.to_i8(), Some(42i8)); + assert_eq!(x.to_u16(), Some(42u16)); + assert_eq!(x.to_i16(), Some(42i16)); + assert_eq!(x.to_u32(), Some(42u32)); + assert_eq!(x.to_i32(), Some(42i32)); + assert_eq!(x.to_u64(), Some(42u64)); + assert_eq!(x.to_i64(), Some(42i64)); + assert_eq!(x.to_usize(), Some(42usize)); + assert_eq!(x.to_isize(), Some(42isize)); + assert_eq!(x.to_f32(), Some(42f32)); + assert_eq!(x.to_f32(), Some(42f32)); + assert_eq!(x.to_f64(), Some(42f64)); + assert_eq!(x.to_f64(), Some(42f64)); +} + +#[test] +fn not_nan32_num() { + assert_eq!(NotNan::::from_str_radix("42.0", 10).unwrap(), 42.0f32); + assert!(NotNan::::from_str_radix("NaN", 10).is_err()); +} + +#[test] +fn not_nan32_signed() { + assert_eq!(not_nan(42f32).abs(), 42f32); + assert_eq!(not_nan(-42f32).abs(), 42f32); + + assert_eq!(not_nan(50f32).abs_sub(¬_nan(8f32)), 42f32); + assert_eq!(not_nan(8f32).abs_sub(¬_nan(50f32)), 0f32); +} + +#[test] +fn not_nan32_num_cast() { + assert_eq!( + as num_traits::NumCast>::from(42).unwrap(), + 42f32 + ); + assert_eq!( as num_traits::NumCast>::from(f32::nan()), None); +} + +#[test] +fn ordered_f64_compare_nan() { + let f64_nan: f64 = Float::nan(); + assert_eq!( + OrderedFloat(f64_nan).cmp(&OrderedFloat(Float::nan())), + Equal + ); + assert_eq!( + OrderedFloat(f64_nan).cmp(&OrderedFloat(-100000.0f64)), + Greater + ); + assert_eq!( + OrderedFloat(-100.0f64).cmp(&OrderedFloat(Float::nan())), + Less + ); +} + +#[test] +fn ordered_f64_compare_regular_floats_op() { + assert!(OrderedFloat(7.0) == OrderedFloat(7.0)); + assert!(OrderedFloat(7.0) <= OrderedFloat(7.0)); + assert!(OrderedFloat(7.0) >= OrderedFloat(7.0)); + assert!(OrderedFloat(8.0) > OrderedFloat(7.0)); + assert!(OrderedFloat(8.0) >= OrderedFloat(7.0)); + assert!(OrderedFloat(4.0) < OrderedFloat(7.0)); + assert!(OrderedFloat(4.0) <= OrderedFloat(7.0)); +} + +#[test] +fn ordered_f64_compare_nan_op() { + let f64_nan: OrderedFloat = OrderedFloat(Float::nan()); + assert!(f64_nan == f64_nan); + assert!(f64_nan <= f64_nan); + assert!(f64_nan >= f64_nan); + assert!(f64_nan > OrderedFloat(-100000.0)); + assert!(f64_nan >= OrderedFloat(-100000.0)); + assert!(OrderedFloat(-100.0) < f64_nan); + assert!(OrderedFloat(-100.0) <= f64_nan); + assert!(f64_nan > OrderedFloat(f64::infinity())); + assert!(f64_nan >= OrderedFloat(f64::infinity())); + assert!(f64_nan > OrderedFloat(f64::neg_infinity())); + assert!(f64_nan >= OrderedFloat(f64::neg_infinity())); +} + +#[test] +fn not_nan32_compare_regular_floats() { + assert_eq!(not_nan(7.0f32).cmp(¬_nan(7.0)), Equal); + assert_eq!(not_nan(8.0f32).cmp(¬_nan(7.0)), Greater); + assert_eq!(not_nan(4.0f32).cmp(¬_nan(7.0)), Less); +} + +#[test] +fn not_nan32_fail_when_constructing_with_nan() { + let f32_nan: f32 = Float::nan(); + assert!(NotNan::new(f32_nan).is_err()); +} + +#[test] +fn not_nan32_calculate_correctly() { + assert_eq!(*(not_nan(5.0f32) + not_nan(4.0f32)), 5.0f32 + 4.0f32); + assert_eq!(*(not_nan(5.0f32) + 4.0f32), 5.0f32 + 4.0f32); + assert_eq!(*(not_nan(5.0f32) - not_nan(4.0f32)), 5.0f32 - 4.0f32); + assert_eq!(*(not_nan(5.0f32) - 4.0f32), 5.0f32 - 4.0f32); + assert_eq!(*(not_nan(5.0f32) * not_nan(4.0f32)), 5.0f32 * 4.0f32); + assert_eq!(*(not_nan(5.0f32) * 4.0f32), 5.0f32 * 4.0f32); + assert_eq!(*(not_nan(8.0f32) / not_nan(4.0f32)), 8.0f32 / 4.0f32); + assert_eq!(*(not_nan(8.0f32) / 4.0f32), 8.0f32 / 4.0f32); + assert_eq!(*(not_nan(8.0f32) % not_nan(4.0f32)), 8.0f32 % 4.0f32); + assert_eq!(*(not_nan(8.0f32) % 4.0f32), 8.0f32 % 4.0f32); + assert_eq!(*(-not_nan(1.0f32)), -1.0f32); + + assert!(panic::catch_unwind(|| not_nan(0.0f32) + f32::NAN).is_err()); + assert!(panic::catch_unwind(|| not_nan(0.0f32) - f32::NAN).is_err()); + assert!(panic::catch_unwind(|| not_nan(0.0f32) * f32::NAN).is_err()); + assert!(panic::catch_unwind(|| not_nan(0.0f32) / f32::NAN).is_err()); + assert!(panic::catch_unwind(|| not_nan(0.0f32) % f32::NAN).is_err()); + + let mut number = not_nan(5.0f32); + number += not_nan(4.0f32); + assert_eq!(*number, 9.0f32); + number -= not_nan(4.0f32); + assert_eq!(*number, 5.0f32); + number *= not_nan(4.0f32); + assert_eq!(*number, 20.0f32); + number /= not_nan(4.0f32); + assert_eq!(*number, 5.0f32); + number %= not_nan(4.0f32); + assert_eq!(*number, 1.0f32); + + number = not_nan(5.0f32); + number += 4.0f32; + assert_eq!(*number, 9.0f32); + number -= 4.0f32; + assert_eq!(*number, 5.0f32); + number *= 4.0f32; + assert_eq!(*number, 20.0f32); + number /= 4.0f32; + assert_eq!(*number, 5.0f32); + number %= 4.0f32; + assert_eq!(*number, 1.0f32); + + assert!(panic::catch_unwind(|| { + let mut tmp = not_nan(0.0f32); + tmp += f32::NAN; + }) + .is_err()); + assert!(panic::catch_unwind(|| { + let mut tmp = not_nan(0.0f32); + tmp -= f32::NAN; + }) + .is_err()); + assert!(panic::catch_unwind(|| { + let mut tmp = not_nan(0.0f32); + tmp *= f32::NAN; + }) + .is_err()); + assert!(panic::catch_unwind(|| { + let mut tmp = not_nan(0.0f32); + tmp /= f32::NAN; + }) + .is_err()); + assert!(panic::catch_unwind(|| { + let mut tmp = not_nan(0.0f32); + tmp %= f32::NAN; + }) + .is_err()); +} + +#[test] +fn not_nan64_compare_regular_floats() { + assert_eq!(not_nan(7.0f64).cmp(¬_nan(7.0)), Equal); + assert_eq!(not_nan(8.0f64).cmp(¬_nan(7.0)), Greater); + assert_eq!(not_nan(4.0f64).cmp(¬_nan(7.0)), Less); +} + +#[test] +fn not_nan64_fail_when_constructing_with_nan() { + let f64_nan: f64 = Float::nan(); + assert!(NotNan::new(f64_nan).is_err()); +} + +#[test] +fn not_nan64_calculate_correctly() { + assert_eq!(*(not_nan(5.0f64) + not_nan(4.0f64)), 5.0f64 + 4.0f64); + assert_eq!(*(not_nan(5.0f64) + 4.0f64), 5.0f64 + 4.0f64); + assert_eq!(*(not_nan(5.0f64) - not_nan(4.0f64)), 5.0f64 - 4.0f64); + assert_eq!(*(not_nan(5.0f64) - 4.0f64), 5.0f64 - 4.0f64); + assert_eq!(*(not_nan(5.0f64) * not_nan(4.0f64)), 5.0f64 * 4.0f64); + assert_eq!(*(not_nan(5.0f64) * 4.0f64), 5.0f64 * 4.0f64); + assert_eq!(*(not_nan(8.0f64) / not_nan(4.0f64)), 8.0f64 / 4.0f64); + assert_eq!(*(not_nan(8.0f64) / 4.0f64), 8.0f64 / 4.0f64); + assert_eq!(*(not_nan(8.0f64) % not_nan(4.0f64)), 8.0f64 % 4.0f64); + assert_eq!(*(not_nan(8.0f64) % 4.0f64), 8.0f64 % 4.0f64); + assert_eq!(*(-not_nan(1.0f64)), -1.0f64); + + assert!(panic::catch_unwind(|| not_nan(0.0f64) + f64::NAN).is_err()); + assert!(panic::catch_unwind(|| not_nan(0.0f64) - f64::NAN).is_err()); + assert!(panic::catch_unwind(|| not_nan(0.0f64) * f64::NAN).is_err()); + assert!(panic::catch_unwind(|| not_nan(0.0f64) / f64::NAN).is_err()); + assert!(panic::catch_unwind(|| not_nan(0.0f64) % f64::NAN).is_err()); + + let mut number = not_nan(5.0f64); + number += not_nan(4.0f64); + assert_eq!(*number, 9.0f64); + number -= not_nan(4.0f64); + assert_eq!(*number, 5.0f64); + number *= not_nan(4.0f64); + assert_eq!(*number, 20.0f64); + number /= not_nan(4.0f64); + assert_eq!(*number, 5.0f64); + number %= not_nan(4.0f64); + assert_eq!(*number, 1.0f64); + + number = not_nan(5.0f64); + number += 4.0f64; + assert_eq!(*number, 9.0f64); + number -= 4.0f64; + assert_eq!(*number, 5.0f64); + number *= 4.0f64; + assert_eq!(*number, 20.0f64); + number /= 4.0f64; + assert_eq!(*number, 5.0f64); + number %= 4.0f64; + assert_eq!(*number, 1.0f64); + + assert!(panic::catch_unwind(|| { + let mut tmp = not_nan(0.0f64); + tmp += f64::NAN; + }) + .is_err()); + assert!(panic::catch_unwind(|| { + let mut tmp = not_nan(0.0f64); + tmp -= f64::NAN; + }) + .is_err()); + assert!(panic::catch_unwind(|| { + let mut tmp = not_nan(0.0f64); + tmp *= f64::NAN; + }) + .is_err()); + assert!(panic::catch_unwind(|| { + let mut tmp = not_nan(0.0f64); + tmp /= f64::NAN; + }) + .is_err()); + assert!(panic::catch_unwind(|| { + let mut tmp = not_nan(0.0f64); + tmp %= f64::NAN; + }) + .is_err()); +} + +#[test] +fn not_nan64_zero() { + assert_eq!(NotNan::::zero(), not_nan(0.0f64)); + assert!(NotNan::::zero().is_zero()); +} + +#[test] +fn not_nan64_one() { + assert_eq!(NotNan::::one(), not_nan(1.0f64)) +} + +#[test] +fn not_nan64_bounded() { + assert_eq!(NotNan::::min_value(), ::min_value()); + assert_eq!(NotNan::::max_value(), ::max_value()); +} + +#[test] +fn not_nan64_from_primitive() { + assert_eq!(NotNan::::from_i8(42i8), Some(not_nan(42.0))); + assert_eq!(NotNan::::from_u8(42u8), Some(not_nan(42.0))); + assert_eq!(NotNan::::from_i16(42i16), Some(not_nan(42.0))); + assert_eq!(NotNan::::from_u16(42u16), Some(not_nan(42.0))); + assert_eq!(NotNan::::from_i32(42i32), Some(not_nan(42.0))); + assert_eq!(NotNan::::from_u32(42u32), Some(not_nan(42.0))); + assert_eq!(NotNan::::from_i64(42i64), Some(not_nan(42.0))); + assert_eq!(NotNan::::from_u64(42u64), Some(not_nan(42.0))); + assert_eq!(NotNan::::from_isize(42isize), Some(not_nan(42.0))); + assert_eq!(NotNan::::from_usize(42usize), Some(not_nan(42.0))); + assert_eq!(NotNan::::from_f64(42f64), Some(not_nan(42.0))); + assert_eq!(NotNan::::from_f64(42f64), Some(not_nan(42.0))); + assert_eq!(NotNan::::from_f64(42f64), Some(not_nan(42.0))); + assert_eq!(NotNan::::from_f64(42f64), Some(not_nan(42.0))); + assert_eq!(NotNan::::from_f64(Float::nan()), None); + assert_eq!(NotNan::::from_f64(Float::nan()), None); +} + +#[test] +fn not_nan64_to_primitive() { + let x = not_nan(42.0f64); + assert_eq!(x.to_u8(), Some(42u8)); + assert_eq!(x.to_i8(), Some(42i8)); + assert_eq!(x.to_u16(), Some(42u16)); + assert_eq!(x.to_i16(), Some(42i16)); + assert_eq!(x.to_u32(), Some(42u32)); + assert_eq!(x.to_i32(), Some(42i32)); + assert_eq!(x.to_u64(), Some(42u64)); + assert_eq!(x.to_i64(), Some(42i64)); + assert_eq!(x.to_usize(), Some(42usize)); + assert_eq!(x.to_isize(), Some(42isize)); + assert_eq!(x.to_f64(), Some(42f64)); + assert_eq!(x.to_f64(), Some(42f64)); + assert_eq!(x.to_f64(), Some(42f64)); + assert_eq!(x.to_f64(), Some(42f64)); +} + +#[test] +fn not_nan64_num() { + assert_eq!( + NotNan::::from_str_radix("42.0", 10).unwrap(), + not_nan(42.0f64) + ); + assert!(NotNan::::from_str_radix("NaN", 10).is_err()); +} + +#[test] +fn not_nan64_signed() { + assert_eq!(not_nan(42f64).abs(), not_nan(42f64)); + assert_eq!(not_nan(-42f64).abs(), not_nan(42f64)); + + assert_eq!(not_nan(50f64).abs_sub(¬_nan(8f64)), not_nan(42f64)); + assert_eq!(not_nan(8f64).abs_sub(¬_nan(50f64)), not_nan(0f64)); +} + +#[test] +fn not_nan64_num_cast() { + assert_eq!( + as num_traits::NumCast>::from(42), + Some(not_nan(42f64)) + ); + assert_eq!( as num_traits::NumCast>::from(f64::nan()), None); +} + +#[test] +fn hash_zero_and_neg_zero_to_the_same_hc_ordered_float64() { + let state = RandomState::new(); + let mut h1 = state.build_hasher(); + let mut h2 = state.build_hasher(); + OrderedFloat::from(0f64).hash(&mut h1); + OrderedFloat::from(-0f64).hash(&mut h2); + assert_eq!(h1.finish(), h2.finish()); +} + +#[test] +fn hash_zero_and_neg_zero_to_the_same_hc_not_nan32() { + let state = RandomState::new(); + let mut h1 = state.build_hasher(); + let mut h2 = state.build_hasher(); + NotNan::try_from(0f32).unwrap().hash(&mut h1); + NotNan::try_from(-0f32).unwrap().hash(&mut h2); + assert_eq!(h1.finish(), h2.finish()); +} + +#[test] +fn hash_different_nans_to_the_same_hc() { + let state = RandomState::new(); + let mut h1 = state.build_hasher(); + let mut h2 = state.build_hasher(); + OrderedFloat::from(f64::nan()).hash(&mut h1); + OrderedFloat::from(-f64::nan()).hash(&mut h2); + assert_eq!(h1.finish(), h2.finish()); +} + +#[test] +fn hash_inf_and_neg_inf_to_different_hcs() { + let state = RandomState::new(); + let mut h1 = state.build_hasher(); + let mut h2 = state.build_hasher(); + OrderedFloat::from(f64::INFINITY).hash(&mut h1); + OrderedFloat::from(f64::NEG_INFINITY).hash(&mut h2); + assert!(h1.finish() != h2.finish()); +} + +#[test] +fn hash_is_good_for_whole_numbers() { + let state = RandomState::new(); + let limit = 10000; + + let mut set = ::std::collections::HashSet::with_capacity(limit); + for i in 0..limit { + let mut h = state.build_hasher(); + OrderedFloat::from(i as f64).hash(&mut h); + set.insert(h.finish()); + } + + // This allows 100 collisions, which is far too + // many, but should guard against transient issues + // that will result from using RandomState + let pct_unique = set.len() as f64 / limit as f64; + assert!(0.99f64 < pct_unique, "percent-unique={}", pct_unique); +} + +#[test] +fn hash_is_good_for_fractional_numbers() { + let state = RandomState::new(); + let limit = 10000; + + let mut set = ::std::collections::HashSet::with_capacity(limit); + for i in 0..limit { + let mut h = state.build_hasher(); + OrderedFloat::from(i as f64 * (1f64 / limit as f64)).hash(&mut h); + set.insert(h.finish()); + } + + // This allows 100 collisions, which is far too + // many, but should guard against transient issues + // that will result from using RandomState + let pct_unique = set.len() as f64 / limit as f64; + assert!(0.99f64 < pct_unique, "percent-unique={}", pct_unique); +} + +#[test] +#[should_panic] +fn test_add_fails_on_nan() { + let a = not_nan(std::f32::INFINITY); + let b = not_nan(std::f32::NEG_INFINITY); + let _c = a + b; +} + +#[test] +#[should_panic] +fn test_add_fails_on_nan_ref() { + let a = not_nan(std::f32::INFINITY); + let b = not_nan(std::f32::NEG_INFINITY); + let _c = a + &b; +} + +#[test] +#[should_panic] +fn test_add_fails_on_nan_ref_ref() { + let a = not_nan(std::f32::INFINITY); + let b = not_nan(std::f32::NEG_INFINITY); + let _c = &a + &b; +} + +#[test] +#[should_panic] +fn test_add_fails_on_nan_t_ref() { + let a = not_nan(std::f32::INFINITY); + let b = std::f32::NEG_INFINITY; + let _c = a + &b; +} + +#[test] +#[should_panic] +fn test_add_fails_on_nan_ref_t_ref() { + let a = not_nan(std::f32::INFINITY); + let b = std::f32::NEG_INFINITY; + let _c = &a + &b; +} + +#[test] +#[should_panic] +fn test_add_fails_on_nan_ref_t() { + let a = not_nan(std::f32::INFINITY); + let b = std::f32::NEG_INFINITY; + let _c = &a + b; +} + +#[test] +#[should_panic] +fn test_add_assign_fails_on_nan_ref() { + let mut a = not_nan(std::f32::INFINITY); + let b = not_nan(std::f32::NEG_INFINITY); + a += &b; +} + +#[test] +#[should_panic] +fn test_add_assign_fails_on_nan_t_ref() { + let mut a = not_nan(std::f32::INFINITY); + let b = std::f32::NEG_INFINITY; + a += &b; +} + +#[test] +#[should_panic] +fn test_add_assign_fails_on_nan_t() { + let mut a = not_nan(std::f32::INFINITY); + let b = std::f32::NEG_INFINITY; + a += b; +} + +#[test] +fn add() { + assert_eq!(not_nan(0.0) + not_nan(0.0), 0.0); + assert_eq!(not_nan(0.0) + ¬_nan(0.0), 0.0); + assert_eq!(¬_nan(0.0) + not_nan(0.0), 0.0); + assert_eq!(¬_nan(0.0) + ¬_nan(0.0), 0.0); + assert_eq!(not_nan(0.0) + 0.0, 0.0); + assert_eq!(not_nan(0.0) + &0.0, 0.0); + assert_eq!(¬_nan(0.0) + 0.0, 0.0); + assert_eq!(¬_nan(0.0) + &0.0, 0.0); + + assert_eq!(OrderedFloat(0.0) + OrderedFloat(0.0), 0.0); + assert_eq!(OrderedFloat(0.0) + &OrderedFloat(0.0), 0.0); + assert_eq!(&OrderedFloat(0.0) + OrderedFloat(0.0), 0.0); + assert_eq!(OrderedFloat(0.0) + 0.0, 0.0); + assert_eq!(OrderedFloat(0.0) + &0.0, 0.0); + assert_eq!(&OrderedFloat(0.0) + 0.0, 0.0); + assert_eq!(&OrderedFloat(0.0) + &0.0, 0.0); +} + +#[test] +fn ordered_f32_neg() { + assert_eq!(OrderedFloat(-7.0f32), -OrderedFloat(7.0f32)); +} + +#[test] +fn ordered_f64_neg() { + assert_eq!(OrderedFloat(-7.0f64), -OrderedFloat(7.0f64)); +} + +#[test] +#[should_panic] +fn test_sum_fails_on_nan() { + let a = not_nan(std::f32::INFINITY); + let b = not_nan(std::f32::NEG_INFINITY); + let _c: NotNan<_> = [a, b].iter().sum(); +} + +#[test] +#[should_panic] +fn test_product_fails_on_nan() { + let a = not_nan(std::f32::INFINITY); + let b = not_nan(0f32); + let _c: NotNan<_> = [a, b].iter().product(); +} + +#[test] +fn not_nan64_sum_product() { + let a = not_nan(2138.1237); + let b = not_nan(132f64); + let c = not_nan(5.1); + + assert_eq!( + std::iter::empty::>().sum::>(), + NotNan::new(0f64).unwrap() + ); + assert_eq!([a].iter().sum::>(), a); + assert_eq!([a, b].iter().sum::>(), a + b); + assert_eq!([a, b, c].iter().sum::>(), a + b + c); + + assert_eq!( + std::iter::empty::>().product::>(), + NotNan::new(1f64).unwrap() + ); + assert_eq!([a].iter().product::>(), a); + assert_eq!([a, b].iter().product::>(), a * b); + assert_eq!([a, b, c].iter().product::>(), a * b * c); +} + +#[test] +fn not_nan_usage_in_const_context() { + const A: NotNan = unsafe { NotNan::new_unchecked(111f32) }; + assert_eq!(A, NotNan::new(111f32).unwrap()); +} + +#[test] +fn not_nan_panic_safety() { + let catch_op = |mut num, op: fn(&mut NotNan<_>)| { + let mut num_ref = panic::AssertUnwindSafe(&mut num); + let _ = panic::catch_unwind(move || op(&mut num_ref)); + num + }; + + assert!(!catch_op(not_nan(f32::INFINITY), |a| *a += f32::NEG_INFINITY).is_nan()); + assert!(!catch_op(not_nan(f32::INFINITY), |a| *a -= f32::INFINITY).is_nan()); + assert!(!catch_op(not_nan(0.0), |a| *a *= f32::INFINITY).is_nan()); + assert!(!catch_op(not_nan(0.0), |a| *a /= 0.0).is_nan()); + assert!(!catch_op(not_nan(0.0), |a| *a %= 0.0).is_nan()); +} + +#[test] +fn from_ref() { + let f = 1.0f32; + let o: &OrderedFloat = (&f).into(); + assert_eq!(*o, 1.0f32); + + let mut f = 1.0f64; + let o: &OrderedFloat = (&f).into(); + assert_eq!(*o, 1.0f64); + + let o: &mut OrderedFloat = (&mut f).into(); + assert_eq!(*o, 1.0f64); + *o = OrderedFloat(2.0); + assert_eq!(*o, 2.0f64); + assert_eq!(f, 2.0f64); +} + +macro_rules! test_float_const_method { + ($type:ident < $inner:ident >, $method:ident) => { + assert_eq!($type::<$inner>::$method().into_inner(), $inner::$method()) + }; +} + +macro_rules! test_float_const_methods { + ($type:ident < $inner:ident >) => { + test_float_const_method!($type<$inner>, E); + test_float_const_method!($type<$inner>, FRAC_1_PI); + test_float_const_method!($type<$inner>, FRAC_1_SQRT_2); + test_float_const_method!($type<$inner>, FRAC_2_PI); + test_float_const_method!($type<$inner>, FRAC_2_SQRT_PI); + test_float_const_method!($type<$inner>, FRAC_PI_2); + test_float_const_method!($type<$inner>, FRAC_PI_3); + test_float_const_method!($type<$inner>, FRAC_PI_4); + test_float_const_method!($type<$inner>, FRAC_PI_6); + test_float_const_method!($type<$inner>, FRAC_PI_8); + test_float_const_method!($type<$inner>, LN_10); + test_float_const_method!($type<$inner>, LN_2); + test_float_const_method!($type<$inner>, LOG10_E); + test_float_const_method!($type<$inner>, LOG2_E); + test_float_const_method!($type<$inner>, PI); + test_float_const_method!($type<$inner>, SQRT_2); + }; +} + +#[test] +fn float_consts_equal_inner() { + test_float_const_methods!(OrderedFloat); + test_float_const_methods!(OrderedFloat); + test_float_const_methods!(NotNan); + test_float_const_methods!(NotNan); +} + +#[cfg(feature = "std")] +macro_rules! test_pow_ord { + ($type:ident < $inner:ident >) => { + assert_eq!($type::<$inner>::from(3.0).pow(2i8), OrderedFloat(9.0)); + assert_eq!($type::<$inner>::from(3.0).pow(2i16), OrderedFloat(9.0)); + assert_eq!($type::<$inner>::from(3.0).pow(2i32), OrderedFloat(9.0)); + assert_eq!($type::<$inner>::from(3.0).pow(2u8), OrderedFloat(9.0)); + assert_eq!($type::<$inner>::from(3.0).pow(2u16), OrderedFloat(9.0)); + assert_eq!($type::<$inner>::from(3.0).pow(2f32), OrderedFloat(9.0)); + }; +} + +#[cfg(feature = "std")] +macro_rules! test_pow_nn { + ($type:ident < $inner:ident >) => { + assert_eq!( + $type::<$inner>::new(3.0).unwrap().pow(2i8), + NotNan::new(9.0).unwrap() + ); + assert_eq!( + $type::<$inner>::new(3.0).unwrap().pow(2u8), + NotNan::new(9.0).unwrap() + ); + assert_eq!( + $type::<$inner>::new(3.0).unwrap().pow(2i16), + NotNan::new(9.0).unwrap() + ); + assert_eq!( + $type::<$inner>::new(3.0).unwrap().pow(2u16), + NotNan::new(9.0).unwrap() + ); + assert_eq!( + $type::<$inner>::new(3.0).unwrap().pow(2i32), + NotNan::new(9.0).unwrap() + ); + assert_eq!( + $type::<$inner>::new(3.0).unwrap().pow(2f32), + NotNan::new(9.0).unwrap() + ); + }; +} + +#[cfg(feature = "std")] +#[test] +fn test_pow_works() { + assert_eq!(OrderedFloat(3.0).pow(OrderedFloat(2.0)), OrderedFloat(9.0)); + test_pow_ord!(OrderedFloat); + test_pow_ord!(OrderedFloat); + assert_eq!( + NotNan::new(3.0).unwrap().pow(NotNan::new(2.0).unwrap()), + NotNan::new(9.0).unwrap() + ); + test_pow_nn!(NotNan); + test_pow_nn!(NotNan); + // Only f64 have Pow impl by default, so checking those seperate from macro + assert_eq!(OrderedFloat::::from(3.0).pow(2f64), OrderedFloat(9.0)); + assert_eq!( + NotNan::::new(3.0).unwrap().pow(2f64), + NotNan::new(9.0).unwrap() + ); +} + +#[cfg(feature = "std")] +#[test] +#[should_panic] +fn test_pow_fails_on_nan() { + let a = not_nan(-1.0); + let b = f32::NAN; + a.pow(b); +} + +#[cfg(feature = "arbitrary")] +mod arbitrary_test { + use super::{NotNan, OrderedFloat}; + use arbitrary::{Arbitrary, Unstructured}; + + #[test] + fn exhaustive() { + // Exhaustively search all patterns of sign and exponent bits plus a few mantissa bits. + for high_bytes in 0..=u16::MAX { + let [h1, h2] = high_bytes.to_be_bytes(); + + // Each of these should not + // * panic, + // * return an error, or + // * need more bytes than given. + let n32: NotNan = Unstructured::new(&[h1, h2, h1, h2]) + .arbitrary() + .expect("NotNan failure"); + let n64: NotNan = Unstructured::new(&[h1, h2, h1, h2, h1, h2, h1, h2]) + .arbitrary() + .expect("NotNan failure"); + let _: OrderedFloat = Unstructured::new(&[h1, h2, h1, h2]) + .arbitrary() + .expect("OrderedFloat failure"); + let _: OrderedFloat = Unstructured::new(&[h1, h2, h1, h2, h1, h2, h1, h2]) + .arbitrary() + .expect("OrderedFloat failure"); + + // Check for violation of NotNan's property of never containing a NaN. + assert!(!n32.into_inner().is_nan()); + assert!(!n64.into_inner().is_nan()); + } + } + + #[test] + fn size_hints() { + assert_eq!(NotNan::::size_hint(0), (4, Some(4))); + assert_eq!(NotNan::::size_hint(0), (8, Some(8))); + assert_eq!(OrderedFloat::::size_hint(0), (4, Some(4))); + assert_eq!(OrderedFloat::::size_hint(0), (8, Some(8))); + } +} diff -Nru temporalio-1.3.0/vendor/parking_lot_core/.cargo-checksum.json temporalio-1.3.0/vendor/parking_lot_core/.cargo-checksum.json --- temporalio-1.3.0/vendor/parking_lot_core/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/parking_lot_core/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"Cargo.toml":"771414b831b5789b1c0eb6dcb215008226b0998a242e530c4881e94e49231744","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"c9a75f18b9ab2927829a208fc6aa2cf4e63b8420887ba29cdb265d6619ae82d5","build.rs":"29e629057144d1238dcd8ea70ad6cbb6ec14ca742797af3fa9335710ff5cbaaa","src/lib.rs":"def53c1ff1d4a05e6261aa9b75ac089a51ecc15642e1320202e5c6836e2bb732","src/parking_lot.rs":"212165669beacb6299c959a2965516cda6b444467aed877889d9545c01e4bc3a","src/spinwait.rs":"0d73980c72e84fd75c73693f0b351e097353b46f4b8aaa67b3dde7c721817bf7","src/thread_parker/generic.rs":"414bd3114b40f7665efe59fa4c5033d2401eafc58b57a9ba5803949d26cc0454","src/thread_parker/linux.rs":"70bfe6c168fc431965374d921e33b3e04536cb68fde3e807a837aa38a65772b0","src/thread_parker/mod.rs":"afaf652e242d5235d38f5749f3b12dc6def793dee40cd6c820e1dd45a70a5ac8","src/thread_parker/redox.rs":"38fbede41817b6606a5612ee9456940eaf627540a4aa39de8452e355ca1df306","src/thread_parker/sgx.rs":"3b6190eb90fd88d5eee5370213a1de408cce24ded04bfb0f374c3bbf10752187","src/thread_parker/unix.rs":"0cc4ab7761fb1ce5d4dd4e41f3d8dcaa01933602505e6c55edfb58e4d4a4e1f2","src/thread_parker/wasm.rs":"86e954d009d57d2dfdbca71e5c0f116a99a182af83b7e51ed5b14fc55b2f7b01","src/thread_parker/wasm_atomic.rs":"6fbc09accc9df9d42444cec6f55d3eed2c7078a474485fa269a9f503da2ee1c5","src/thread_parker/windows/bindings.rs":"a33ce84b9e046d1984bed2270382049b7fc8e9163e034a6caa9c7ba72acd342a","src/thread_parker/windows/keyed_event.rs":"12b72b70ad9d58d943b51246621ac73223debb0b37abff990fa0f895c575f7c7","src/thread_parker/windows/mod.rs":"9cd50a3cad6afb68272dbff0f2e83b24353f8b1d35cce6ac2834216a26840d36","src/thread_parker/windows/waitaddress.rs":"9ab190cd9aaaf89bed4535f8a0ccb81102b7abb64d4f94b31aa98f8a2acaf8de","src/util.rs":"285e6133150645525f2ca1ece41f6d35bad4e7c5e08b42b20c99d2a97e04a974","src/word_lock.rs":"9ba49082359c35ad5b4e8d219fede1ffca75225f9ccb971cbba01f20e2ed2738"},"package":"4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e"} \ No newline at end of file +{"files":{"Cargo.toml":"6b3102e89bed16a15c62c651c96180eb3809eb09e627567fa7a64c8cfc0d1a6a","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"c9a75f18b9ab2927829a208fc6aa2cf4e63b8420887ba29cdb265d6619ae82d5","build.rs":"29e629057144d1238dcd8ea70ad6cbb6ec14ca742797af3fa9335710ff5cbaaa","src/lib.rs":"def53c1ff1d4a05e6261aa9b75ac089a51ecc15642e1320202e5c6836e2bb732","src/parking_lot.rs":"8e7cbaf800614c56c6b6104621cd6a157563a3d0db7fa86d021cd2534d5fafbf","src/spinwait.rs":"0d73980c72e84fd75c73693f0b351e097353b46f4b8aaa67b3dde7c721817bf7","src/thread_parker/generic.rs":"414bd3114b40f7665efe59fa4c5033d2401eafc58b57a9ba5803949d26cc0454","src/thread_parker/linux.rs":"70bfe6c168fc431965374d921e33b3e04536cb68fde3e807a837aa38a65772b0","src/thread_parker/mod.rs":"afaf652e242d5235d38f5749f3b12dc6def793dee40cd6c820e1dd45a70a5ac8","src/thread_parker/redox.rs":"38fbede41817b6606a5612ee9456940eaf627540a4aa39de8452e355ca1df306","src/thread_parker/sgx.rs":"3b6190eb90fd88d5eee5370213a1de408cce24ded04bfb0f374c3bbf10752187","src/thread_parker/unix.rs":"f1425cf5876d1f9be98979343fb3bcb2a25982bcff80e7399c86ce835d450143","src/thread_parker/wasm.rs":"86e954d009d57d2dfdbca71e5c0f116a99a182af83b7e51ed5b14fc55b2f7b01","src/thread_parker/wasm_atomic.rs":"6fbc09accc9df9d42444cec6f55d3eed2c7078a474485fa269a9f503da2ee1c5","src/thread_parker/windows/bindings.rs":"a33ce84b9e046d1984bed2270382049b7fc8e9163e034a6caa9c7ba72acd342a","src/thread_parker/windows/keyed_event.rs":"12b72b70ad9d58d943b51246621ac73223debb0b37abff990fa0f895c575f7c7","src/thread_parker/windows/mod.rs":"22df43efd4dc6d91942a6fac7afbddc91b1cc0b10a630bc6d4d00eff5fd131d6","src/thread_parker/windows/waitaddress.rs":"9ab190cd9aaaf89bed4535f8a0ccb81102b7abb64d4f94b31aa98f8a2acaf8de","src/util.rs":"285e6133150645525f2ca1ece41f6d35bad4e7c5e08b42b20c99d2a97e04a974","src/word_lock.rs":"9ba49082359c35ad5b4e8d219fede1ffca75225f9ccb971cbba01f20e2ed2738"},"package":"93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/parking_lot_core/Cargo.toml temporalio-1.3.0/vendor/parking_lot_core/Cargo.toml --- temporalio-1.3.0/vendor/parking_lot_core/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/parking_lot_core/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -11,9 +11,8 @@ [package] edition = "2018" -rust-version = "1.49.0" name = "parking_lot_core" -version = "0.9.9" +version = "0.9.8" authors = ["Amanieu d'Antras "] description = "An advanced API for creating custom synchronization primitives." keywords = [ @@ -27,9 +26,6 @@ license = "MIT OR Apache-2.0" repository = "https://github.com/Amanieu/parking_lot" -[package.metadata.docs.rs] -rustdoc-args = ["--generate-link-to-definition"] - [dependencies.backtrace] version = "0.3.60" optional = true @@ -57,7 +53,7 @@ nightly = [] [target."cfg(target_os = \"redox\")".dependencies.redox_syscall] -version = "0.4" +version = "0.3" [target."cfg(unix)".dependencies.libc] version = "0.2.95" diff -Nru temporalio-1.3.0/vendor/parking_lot_core/src/parking_lot.rs temporalio-1.3.0/vendor/parking_lot_core/src/parking_lot.rs --- temporalio-1.3.0/vendor/parking_lot_core/src/parking_lot.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/parking_lot_core/src/parking_lot.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1476,7 +1476,7 @@ test! { unpark_all_one_fast( - repeats: 1000, latches: 1, delay: 0, threads: 1, single_unparks: 0 + repeats: 10000, latches: 1, delay: 0, threads: 1, single_unparks: 0 ); unpark_all_hundred_fast( repeats: 100, latches: 1, delay: 0, threads: 100, single_unparks: 0 diff -Nru temporalio-1.3.0/vendor/parking_lot_core/src/thread_parker/unix.rs temporalio-1.3.0/vendor/parking_lot_core/src/thread_parker/unix.rs --- temporalio-1.3.0/vendor/parking_lot_core/src/thread_parker/unix.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/parking_lot_core/src/thread_parker/unix.rs 2023-10-30 19:40:00.000000000 +0000 @@ -5,7 +5,7 @@ // http://opensource.org/licenses/MIT>, at your option. This file may not be // copied, modified, or distributed except according to those terms. -#[cfg(any(target_os = "macos", target_os = "tvos", target_os = "ios", target_os = "watchos"))] +#[cfg(any(target_os = "macos", target_os = "ios", target_os = "watchos"))] use core::ptr; use core::{ cell::{Cell, UnsafeCell}, @@ -130,7 +130,6 @@ #[cfg(any( target_os = "macos", target_os = "ios", - target_os = "tvos", target_os = "watchos", target_os = "android", target_os = "espidf" @@ -142,7 +141,6 @@ #[cfg(not(any( target_os = "macos", target_os = "ios", - target_os = "tvos", target_os = "watchos", target_os = "android", target_os = "espidf" @@ -197,7 +195,7 @@ } // Returns the current time on the clock used by pthread_cond_t as a timespec. -#[cfg(any(target_os = "macos", target_os = "ios", target_os = "tvos", target_os = "watchos"))] +#[cfg(any(target_os = "macos", target_os = "ios", target_os = "watchos"))] #[inline] fn timespec_now() -> libc::timespec { let mut now = MaybeUninit::::uninit(); @@ -210,7 +208,7 @@ tv_nsec: now.tv_usec as tv_nsec_t * 1000, } } -#[cfg(not(any(target_os = "macos", target_os = "ios", target_os = "tvos", target_os = "watchos")))] +#[cfg(not(any(target_os = "macos", target_os = "ios", target_os = "watchos")))] #[inline] fn timespec_now() -> libc::timespec { let mut now = MaybeUninit::::uninit(); diff -Nru temporalio-1.3.0/vendor/parking_lot_core/src/thread_parker/windows/mod.rs temporalio-1.3.0/vendor/parking_lot_core/src/thread_parker/windows/mod.rs --- temporalio-1.3.0/vendor/parking_lot_core/src/thread_parker/windows/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/parking_lot_core/src/thread_parker/windows/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -75,13 +75,11 @@ backend: &'static Backend, } -impl super::ThreadParkerT for ThreadParker { - type UnparkHandle = UnparkHandle; - - const IS_CHEAP_TO_CONSTRUCT: bool = true; +impl ThreadParker { + pub const IS_CHEAP_TO_CONSTRUCT: bool = true; #[inline] - fn new() -> ThreadParker { + pub fn new() -> ThreadParker { // Initialize the backend here to ensure we don't get any panics // later on, which could leave synchronization primitives in a broken // state. @@ -93,7 +91,7 @@ // Prepares the parker. This should be called before adding it to the queue. #[inline] - unsafe fn prepare_park(&self) { + pub fn prepare_park(&self) { match *self.backend { Backend::KeyedEvent(ref x) => x.prepare_park(&self.key), Backend::WaitAddress(ref x) => x.prepare_park(&self.key), @@ -103,7 +101,7 @@ // Checks if the park timed out. This should be called while holding the // queue lock after park_until has returned false. #[inline] - unsafe fn timed_out(&self) -> bool { + pub fn timed_out(&self) -> bool { match *self.backend { Backend::KeyedEvent(ref x) => x.timed_out(&self.key), Backend::WaitAddress(ref x) => x.timed_out(&self.key), @@ -113,7 +111,7 @@ // Parks the thread until it is unparked. This should be called after it has // been added to the queue, after unlocking the queue. #[inline] - unsafe fn park(&self) { + pub unsafe fn park(&self) { match *self.backend { Backend::KeyedEvent(ref x) => x.park(&self.key), Backend::WaitAddress(ref x) => x.park(&self.key), @@ -124,7 +122,7 @@ // should be called after it has been added to the queue, after unlocking // the queue. Returns true if we were unparked and false if we timed out. #[inline] - unsafe fn park_until(&self, timeout: Instant) -> bool { + pub unsafe fn park_until(&self, timeout: Instant) -> bool { match *self.backend { Backend::KeyedEvent(ref x) => x.park_until(&self.key, timeout), Backend::WaitAddress(ref x) => x.park_until(&self.key, timeout), @@ -135,7 +133,7 @@ // necessary to ensure that thread-local ThreadData objects remain valid. // This should be called while holding the queue lock. #[inline] - unsafe fn unpark_lock(&self) -> UnparkHandle { + pub unsafe fn unpark_lock(&self) -> UnparkHandle { match *self.backend { Backend::KeyedEvent(ref x) => UnparkHandle::KeyedEvent(x.unpark_lock(&self.key)), Backend::WaitAddress(ref x) => UnparkHandle::WaitAddress(x.unpark_lock(&self.key)), @@ -151,11 +149,11 @@ WaitAddress(waitaddress::UnparkHandle), } -impl super::UnparkHandleT for UnparkHandle { +impl UnparkHandle { // Wakes up the parked thread. This should be called after the queue lock is // released to avoid blocking the queue for too long. #[inline] - unsafe fn unpark(self) { + pub unsafe fn unpark(self) { match self { UnparkHandle::KeyedEvent(x) => x.unpark(), UnparkHandle::WaitAddress(x) => x.unpark(), diff -Nru temporalio-1.3.0/vendor/pin-project-lite/.cargo-checksum.json temporalio-1.3.0/vendor/pin-project-lite/.cargo-checksum.json --- temporalio-1.3.0/vendor/pin-project-lite/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/pin-project-lite/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"CHANGELOG.md":"8746b4b5d094fb8998c411987f4145ece4b11107d1eab24fce3f8075f1d3dbb5","Cargo.toml":"39e8ac3108dc0099ea98f012927dba1eb4b93220f23e3366896bb2fa2f66870d","LICENSE-APACHE":"0d542e0c8804e39aa7f37eb00da5a762149dc682d7829451287e11b938e94594","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","README.md":"84c64307110253c7348fb56e22ff36460b4b0c797fc931dbb748bef6921a8009","src/lib.rs":"94c2eb6f58fea1ecba2ada4c8e6d7a62f9ee54e0844200c5d6609549c896e8b5","tests/auxiliary/mod.rs":"7e263e987e09b77e384f734384a00a71c5b70230bb1b5376446ef003a8da9372","tests/compiletest.rs":"af34ced23541134e26259a52cae588520c7111e98bff59e0c2e2d73faf43ca3f","tests/drop_order.rs":"2cb31a8cd5cf4d9a4ba9faf25f99f0e85f9bd7b4778649f843d9c617c6af43fc","tests/expand/default/enum.expanded.rs":"7944e0ff3a49ef1bccff5681a32a0b306c5eaa7a5f4838132eca8e9a62d40722","tests/expand/default/enum.rs":"493d5752c4baa87ed4c48bd41b8e5e263fd5e3f43c4f9195818ef6d26951f63e","tests/expand/default/struct.expanded.rs":"c0a2a411462f2570340e095963c277da229f7b7dcbe661512ac5f051478d5905","tests/expand/default/struct.rs":"5a6e57d9b6d00cfd4e1e69f37ce0c9d5165a21230d0363f0791665b1015870ce","tests/expand/multifields/enum.expanded.rs":"fc3a86d536060cbd1aa58a2e565d00033f677c0e02f1dd1ee6e30e8379b152fe","tests/expand/multifields/enum.rs":"9c79270a7d6d1d42cf8194b579d79e7d44a3fd003243742f0a568ecf0a4f3be3","tests/expand/multifields/struct.expanded.rs":"cf2dd15e6a0a66afcb8c5d7fef235964a4326c91732de65597f880285fdffe2a","tests/expand/multifields/struct.rs":"17f0447d522d48f14d516808bd66baacebdf3ac38188df72f649702a893cda68","tests/expand/naming/enum-all.expanded.rs":"7944e0ff3a49ef1bccff5681a32a0b306c5eaa7a5f4838132eca8e9a62d40722","tests/expand/naming/enum-all.rs":"493d5752c4baa87ed4c48bd41b8e5e263fd5e3f43c4f9195818ef6d26951f63e","tests/expand/naming/enum-mut.expanded.rs":"49bd8b7e0a469823e1e7d4dbfcb7108ef5db16844ef7d4686cb6600768123877","tests/expand/naming/enum-mut.rs":"c1ff4ade049ebbceb2acb99dbc1af5db14de3ba9710ea1ff1b64348766a9e080","tests/expand/naming/enum-none.expanded.rs":"dbac25a5370153bad9165346c49f831d051b22f0c40bc4d81aa1dd44346d04cc","tests/expand/naming/enum-none.rs":"ff22be4ecf4168e2bc68ab249a0ed809a37e3b8e840ef8977d24209ef28ac839","tests/expand/naming/enum-ref.expanded.rs":"ec4dedf4618e6b9dc4e98a2846b769dc5c9ad9eb51cb645ebfcca09c9ec9458f","tests/expand/naming/enum-ref.rs":"394cbd5d872449e9226cd0834ce7117c395a582567584218dabbef4eb2c1fbac","tests/expand/naming/struct-all.expanded.rs":"1573eb22f4f68b2d2621a5b3d4bda0edfd38ef16efc7f29d9697fc5564a9f615","tests/expand/naming/struct-all.rs":"c13c0aacee85b8fca58f85d2d75d2e3907b3e7642f8710ed8c8e54d6015881cc","tests/expand/naming/struct-mut.expanded.rs":"6e52a2d4c9fe105307d2cf07882897027713ebcac94249aab7ba0a1ffc2f2f77","tests/expand/naming/struct-mut.rs":"9a7752a6d30e0b7033f3577a72676676900a642cdaf59f942179d1f2a8ba2bb0","tests/expand/naming/struct-none.expanded.rs":"c0a2a411462f2570340e095963c277da229f7b7dcbe661512ac5f051478d5905","tests/expand/naming/struct-none.rs":"5a6e57d9b6d00cfd4e1e69f37ce0c9d5165a21230d0363f0791665b1015870ce","tests/expand/naming/struct-ref.expanded.rs":"b8744cb83e6764c4c9718c4ad6898ce2c80420730456579ce250e1839bad6027","tests/expand/naming/struct-ref.rs":"33c4fd344b65650dee44087ada31d4b5acd9d122123360fb7d41718c46699574","tests/expand/not_unpin/enum.expanded.rs":"c71d04b6c6ed0c334724b395e44679111703adaf19f3d697f5bfce58f8313cfc","tests/expand/not_unpin/enum.rs":"b626f3390a6afa36ec3505bdb61457e8eb2a6eee58dc8ab5a85c9e1a10699b20","tests/expand/not_unpin/struct.expanded.rs":"e3bb42319076fa8ecfec3e47356bb5afc95da5454467a2b0b471f76ced0f284f","tests/expand/not_unpin/struct.rs":"84af744f600ef0c0276a64a07d427b28e0b649fb634fa9880a9fd8cd475517c9","tests/expand/pinned_drop/enum.expanded.rs":"9b7d9d0c16045400c93de9a47f39aae3859d922f81432f76f96e7dd81f27cdb8","tests/expand/pinned_drop/enum.rs":"3178d479b9b42dc74c5a2207f70c9959070672c03009021e335c34290ef620ba","tests/expand/pinned_drop/struct.expanded.rs":"e802ab01b59f09d6397f9235eab51e07859b2582465a39f5621fa4d33e270fd3","tests/expand/pinned_drop/struct.rs":"cf6a7b04451c59ce697c3ef15855c7740b0e72a6005b1f47db326bd93b1849c3","tests/expand/pub/enum.expanded.rs":"ddc80984cc8cfd30a27c385c3e53ae7c178d774a717040d0e791e81adc7004fe","tests/expand/pub/enum.rs":"5b60dd354a489b0326f5c4f1026b89d1471ddbb45906bc3046a65425c4e5e160","tests/expand/pub/struct.expanded.rs":"435a2322ab580327bfecd40b309b3f2079667ed627bc25bdb41ee03dae0596bb","tests/expand/pub/struct.rs":"15b7940ce0ad1d5d133dde1870319f2f96a000bfcf29508b8cce1a62876cbd80","tests/expandtest.rs":"66bd80992a1696994ec2d14c3edc36350a0cb896d8081f1c0f8893ebeed72d03","tests/include/basic.rs":"9e399b682bc74c899d26924c2cab52a911f7392e29300defb6521e561fafafe4","tests/lint.rs":"36005c64524a2ed4f738d22d5310539e063e75833e8ab1b81afa6c9d1ba14bf6","tests/proper_unpin.rs":"35894ab482a5409aa32b261ff729c0ce23230232ecf43b3227a401fd218828e1","tests/test.rs":"b5c1bde0fa45513b6a0f0f2126e70aa41a8f5aba2bdf55bfb2b8b6b415c0e98b","tests/ui/pin_project/conflict-drop.rs":"55e6809b5f59dd81e32c2c89b742c0c76db6b099a1d2621e5b882c0d20f92837","tests/ui/pin_project/conflict-drop.stderr":"7cadbfe2b8e9659c69e8d61d45128d3589444f563e1f179d6d4c9bd1d98e96e1","tests/ui/pin_project/conflict-unpin.rs":"eae4f6b2084e32001a5a965b4a9ebf76a3a628830ca5f93bf4799eea96accbf9","tests/ui/pin_project/conflict-unpin.stderr":"c5bc8f97a5917548eb66e6099adf9371416a02ffc4feb2e20432c60782cd6ba2","tests/ui/pin_project/invalid-bounds.rs":"f86f23d377df015182f2f5dae6464a4f98c37f2198e0646f721fedc4017cb82c","tests/ui/pin_project/invalid-bounds.stderr":"200e6fab99f8ebd75116294ba9c43ae9487563239f2d57462157f5cc47c37cc3","tests/ui/pin_project/invalid.rs":"7304bd4a5bac1419382742432cfa8af83535d7be8cfad52c661410e0e9e8207a","tests/ui/pin_project/invalid.stderr":"6e8693c3341972e329e7c7a1836f308c433e0ba677fc99808d75a53e695654b1","tests/ui/pin_project/overlapping_lifetime_names.rs":"36c849a4570c8c0c32ca6c01aa75afbe1136ef73d45f17eb66175e1936678722","tests/ui/pin_project/overlapping_lifetime_names.stderr":"6958a5c0c983f3ed782203d8f221e80e154b71cb4fe2a9fb633058ec636c4cbc","tests/ui/pin_project/overlapping_unpin_struct.rs":"9a126182d1fe15a30ac60bb223b376aad747d11293d3cf512ad2dce546e3725c","tests/ui/pin_project/overlapping_unpin_struct.stderr":"406feb5169cd79293853b76a5cc599e692d2af3b5169fca32cb5cf1cb2ad0fc0","tests/ui/pin_project/packed.rs":"1f1a34aafbff9a59b94cdf3a53df03e9fc661d9e27e0f9962bad7f9bdad03b14","tests/ui/pin_project/packed.stderr":"5c5f08d339d4e5e2596f1f8a64158d8c2df2ea7116c04a578004f30f48ca7b0a","tests/ui/pin_project/unpin_sneaky.rs":"12e97a387ce1af6ee6a567687674aab70e96962a48f2433c39976d0b3e2c3341","tests/ui/pin_project/unpin_sneaky.stderr":"7a540e26a0e9c66794bcc10cbc337b3459a9208d32b0012f0b55fb84cfc15cf1","tests/ui/pin_project/unsupported.rs":"14defa90e736f314bbbc219973929b77bdd22e5f7e4c4c88403db764f4d167d6","tests/ui/pin_project/unsupported.stderr":"7b161bda371caeb26df426fde4dadcff61a807ffd476b2344c6b77072d6c0cc0","tests/ui/pinned_drop/call-drop-inner.rs":"032260da1fc0e649d97167a8a4ac47eea915000efebdfdc490f050b6f9351027","tests/ui/pinned_drop/call-drop-inner.stderr":"abec9d82aeb49c860e313db0a3ad0d2024d7500750d4f9a0f8b0ce00478dbcbf","tests/ui/pinned_drop/conditional-drop-impl.rs":"0b28c74213cee83e7b27223d7d37f903f79abd3dddcc0f969e14047674908085","tests/ui/pinned_drop/conditional-drop-impl.stderr":"a845afaa89054f7c516029090a201f3beecf59d6e9e4fca18ca3678d27666a92"},"package":"8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58"} \ No newline at end of file +{"files":{"CHANGELOG.md":"66c1dfe95542a7229aac93f4ff2b0d45d7becfd2152d366b1b381905246a4cdb","Cargo.toml":"8e1f0452f2ac0fc8376595bdf02439253b79316c21c9be37820b10764a94df76","LICENSE-APACHE":"0d542e0c8804e39aa7f37eb00da5a762149dc682d7829451287e11b938e94594","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","README.md":"84c64307110253c7348fb56e22ff36460b4b0c797fc931dbb748bef6921a8009","src/lib.rs":"6feb92297ed551465be24274651c06744fbdae194c0bd69eb0a4bc9c746d6dda","tests/auxiliary/mod.rs":"7e263e987e09b77e384f734384a00a71c5b70230bb1b5376446ef003a8da9372","tests/compiletest.rs":"af34ced23541134e26259a52cae588520c7111e98bff59e0c2e2d73faf43ca3f","tests/drop_order.rs":"2cb31a8cd5cf4d9a4ba9faf25f99f0e85f9bd7b4778649f843d9c617c6af43fc","tests/expand/default/enum.expanded.rs":"7944e0ff3a49ef1bccff5681a32a0b306c5eaa7a5f4838132eca8e9a62d40722","tests/expand/default/enum.rs":"493d5752c4baa87ed4c48bd41b8e5e263fd5e3f43c4f9195818ef6d26951f63e","tests/expand/default/struct.expanded.rs":"c0a2a411462f2570340e095963c277da229f7b7dcbe661512ac5f051478d5905","tests/expand/default/struct.rs":"5a6e57d9b6d00cfd4e1e69f37ce0c9d5165a21230d0363f0791665b1015870ce","tests/expand/multifields/enum.expanded.rs":"fc3a86d536060cbd1aa58a2e565d00033f677c0e02f1dd1ee6e30e8379b152fe","tests/expand/multifields/enum.rs":"9c79270a7d6d1d42cf8194b579d79e7d44a3fd003243742f0a568ecf0a4f3be3","tests/expand/multifields/struct.expanded.rs":"cf2dd15e6a0a66afcb8c5d7fef235964a4326c91732de65597f880285fdffe2a","tests/expand/multifields/struct.rs":"17f0447d522d48f14d516808bd66baacebdf3ac38188df72f649702a893cda68","tests/expand/naming/enum-all.expanded.rs":"7944e0ff3a49ef1bccff5681a32a0b306c5eaa7a5f4838132eca8e9a62d40722","tests/expand/naming/enum-all.rs":"493d5752c4baa87ed4c48bd41b8e5e263fd5e3f43c4f9195818ef6d26951f63e","tests/expand/naming/enum-mut.expanded.rs":"49bd8b7e0a469823e1e7d4dbfcb7108ef5db16844ef7d4686cb6600768123877","tests/expand/naming/enum-mut.rs":"c1ff4ade049ebbceb2acb99dbc1af5db14de3ba9710ea1ff1b64348766a9e080","tests/expand/naming/enum-none.expanded.rs":"dbac25a5370153bad9165346c49f831d051b22f0c40bc4d81aa1dd44346d04cc","tests/expand/naming/enum-none.rs":"ff22be4ecf4168e2bc68ab249a0ed809a37e3b8e840ef8977d24209ef28ac839","tests/expand/naming/enum-ref.expanded.rs":"ec4dedf4618e6b9dc4e98a2846b769dc5c9ad9eb51cb645ebfcca09c9ec9458f","tests/expand/naming/enum-ref.rs":"394cbd5d872449e9226cd0834ce7117c395a582567584218dabbef4eb2c1fbac","tests/expand/naming/struct-all.expanded.rs":"1573eb22f4f68b2d2621a5b3d4bda0edfd38ef16efc7f29d9697fc5564a9f615","tests/expand/naming/struct-all.rs":"c13c0aacee85b8fca58f85d2d75d2e3907b3e7642f8710ed8c8e54d6015881cc","tests/expand/naming/struct-mut.expanded.rs":"6e52a2d4c9fe105307d2cf07882897027713ebcac94249aab7ba0a1ffc2f2f77","tests/expand/naming/struct-mut.rs":"9a7752a6d30e0b7033f3577a72676676900a642cdaf59f942179d1f2a8ba2bb0","tests/expand/naming/struct-none.expanded.rs":"c0a2a411462f2570340e095963c277da229f7b7dcbe661512ac5f051478d5905","tests/expand/naming/struct-none.rs":"5a6e57d9b6d00cfd4e1e69f37ce0c9d5165a21230d0363f0791665b1015870ce","tests/expand/naming/struct-ref.expanded.rs":"b8744cb83e6764c4c9718c4ad6898ce2c80420730456579ce250e1839bad6027","tests/expand/naming/struct-ref.rs":"33c4fd344b65650dee44087ada31d4b5acd9d122123360fb7d41718c46699574","tests/expand/not_unpin/enum.expanded.rs":"c71d04b6c6ed0c334724b395e44679111703adaf19f3d697f5bfce58f8313cfc","tests/expand/not_unpin/enum.rs":"b626f3390a6afa36ec3505bdb61457e8eb2a6eee58dc8ab5a85c9e1a10699b20","tests/expand/not_unpin/struct.expanded.rs":"e3bb42319076fa8ecfec3e47356bb5afc95da5454467a2b0b471f76ced0f284f","tests/expand/not_unpin/struct.rs":"84af744f600ef0c0276a64a07d427b28e0b649fb634fa9880a9fd8cd475517c9","tests/expand/pinned_drop/enum.expanded.rs":"9b7d9d0c16045400c93de9a47f39aae3859d922f81432f76f96e7dd81f27cdb8","tests/expand/pinned_drop/enum.rs":"3178d479b9b42dc74c5a2207f70c9959070672c03009021e335c34290ef620ba","tests/expand/pinned_drop/struct.expanded.rs":"e802ab01b59f09d6397f9235eab51e07859b2582465a39f5621fa4d33e270fd3","tests/expand/pinned_drop/struct.rs":"cf6a7b04451c59ce697c3ef15855c7740b0e72a6005b1f47db326bd93b1849c3","tests/expand/pub/enum.expanded.rs":"ddc80984cc8cfd30a27c385c3e53ae7c178d774a717040d0e791e81adc7004fe","tests/expand/pub/enum.rs":"5b60dd354a489b0326f5c4f1026b89d1471ddbb45906bc3046a65425c4e5e160","tests/expand/pub/struct.expanded.rs":"435a2322ab580327bfecd40b309b3f2079667ed627bc25bdb41ee03dae0596bb","tests/expand/pub/struct.rs":"15b7940ce0ad1d5d133dde1870319f2f96a000bfcf29508b8cce1a62876cbd80","tests/expandtest.rs":"66bd80992a1696994ec2d14c3edc36350a0cb896d8081f1c0f8893ebeed72d03","tests/include/basic.rs":"9e399b682bc74c899d26924c2cab52a911f7392e29300defb6521e561fafafe4","tests/lint.rs":"36005c64524a2ed4f738d22d5310539e063e75833e8ab1b81afa6c9d1ba14bf6","tests/proper_unpin.rs":"35894ab482a5409aa32b261ff729c0ce23230232ecf43b3227a401fd218828e1","tests/test.rs":"c80bf3277f6e478fed3e7e72e478775ae9213733fd232a2e8d36fa916448d581","tests/ui/pin_project/conflict-drop.rs":"55e6809b5f59dd81e32c2c89b742c0c76db6b099a1d2621e5b882c0d20f92837","tests/ui/pin_project/conflict-drop.stderr":"7cadbfe2b8e9659c69e8d61d45128d3589444f563e1f179d6d4c9bd1d98e96e1","tests/ui/pin_project/conflict-unpin.rs":"eae4f6b2084e32001a5a965b4a9ebf76a3a628830ca5f93bf4799eea96accbf9","tests/ui/pin_project/conflict-unpin.stderr":"c5bc8f97a5917548eb66e6099adf9371416a02ffc4feb2e20432c60782cd6ba2","tests/ui/pin_project/invalid-bounds.rs":"f86f23d377df015182f2f5dae6464a4f98c37f2198e0646f721fedc4017cb82c","tests/ui/pin_project/invalid-bounds.stderr":"200e6fab99f8ebd75116294ba9c43ae9487563239f2d57462157f5cc47c37cc3","tests/ui/pin_project/invalid.rs":"7304bd4a5bac1419382742432cfa8af83535d7be8cfad52c661410e0e9e8207a","tests/ui/pin_project/invalid.stderr":"6e8693c3341972e329e7c7a1836f308c433e0ba677fc99808d75a53e695654b1","tests/ui/pin_project/overlapping_lifetime_names.rs":"36c849a4570c8c0c32ca6c01aa75afbe1136ef73d45f17eb66175e1936678722","tests/ui/pin_project/overlapping_lifetime_names.stderr":"6958a5c0c983f3ed782203d8f221e80e154b71cb4fe2a9fb633058ec636c4cbc","tests/ui/pin_project/overlapping_unpin_struct.rs":"9a126182d1fe15a30ac60bb223b376aad747d11293d3cf512ad2dce546e3725c","tests/ui/pin_project/overlapping_unpin_struct.stderr":"406feb5169cd79293853b76a5cc599e692d2af3b5169fca32cb5cf1cb2ad0fc0","tests/ui/pin_project/packed.rs":"1f1a34aafbff9a59b94cdf3a53df03e9fc661d9e27e0f9962bad7f9bdad03b14","tests/ui/pin_project/packed.stderr":"5c5f08d339d4e5e2596f1f8a64158d8c2df2ea7116c04a578004f30f48ca7b0a","tests/ui/pin_project/unpin_sneaky.rs":"12e97a387ce1af6ee6a567687674aab70e96962a48f2433c39976d0b3e2c3341","tests/ui/pin_project/unpin_sneaky.stderr":"7a540e26a0e9c66794bcc10cbc337b3459a9208d32b0012f0b55fb84cfc15cf1","tests/ui/pin_project/unsupported.rs":"14defa90e736f314bbbc219973929b77bdd22e5f7e4c4c88403db764f4d167d6","tests/ui/pin_project/unsupported.stderr":"7b161bda371caeb26df426fde4dadcff61a807ffd476b2344c6b77072d6c0cc0","tests/ui/pinned_drop/call-drop-inner.rs":"032260da1fc0e649d97167a8a4ac47eea915000efebdfdc490f050b6f9351027","tests/ui/pinned_drop/call-drop-inner.stderr":"abec9d82aeb49c860e313db0a3ad0d2024d7500750d4f9a0f8b0ce00478dbcbf","tests/ui/pinned_drop/conditional-drop-impl.rs":"0b28c74213cee83e7b27223d7d37f903f79abd3dddcc0f969e14047674908085","tests/ui/pinned_drop/conditional-drop-impl.stderr":"a845afaa89054f7c516029090a201f3beecf59d6e9e4fca18ca3678d27666a92"},"package":"12cc1b0bf1727a77a54b6654e7b5f1af8604923edc8b81885f8ec92f9e3f0a05"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/pin-project-lite/Cargo.toml temporalio-1.3.0/vendor/pin-project-lite/Cargo.toml --- temporalio-1.3.0/vendor/pin-project-lite/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/pin-project-lite/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -13,7 +13,7 @@ edition = "2018" rust-version = "1.37" name = "pin-project-lite" -version = "0.2.13" +version = "0.2.12" exclude = [ "/.*", "/tools", diff -Nru temporalio-1.3.0/vendor/pin-project-lite/CHANGELOG.md temporalio-1.3.0/vendor/pin-project-lite/CHANGELOG.md --- temporalio-1.3.0/vendor/pin-project-lite/CHANGELOG.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/pin-project-lite/CHANGELOG.md 2023-10-30 19:40:00.000000000 +0000 @@ -10,10 +10,6 @@ ## [Unreleased] -## [0.2.13] - 2023-08-25 - -- Allow attributes in impl and method of `PinnedDrop` implementation. - ## [0.2.12] - 2023-08-09 - Work around an issue where the projected types/methods appear in the documentation as if they were part of the public API if the visibility is not correctly parsed due to the rustc bug. See [#77](https://github.com/taiki-e/pin-project-lite/issues/77#issuecomment-1671540180) for details. @@ -212,8 +208,7 @@ Initial release -[Unreleased]: https://github.com/taiki-e/pin-project-lite/compare/v0.2.13...HEAD -[0.2.13]: https://github.com/taiki-e/pin-project-lite/compare/v0.2.12...v0.2.13 +[Unreleased]: https://github.com/taiki-e/pin-project-lite/compare/v0.2.12...HEAD [0.2.12]: https://github.com/taiki-e/pin-project-lite/compare/v0.2.11...v0.2.12 [0.2.11]: https://github.com/taiki-e/pin-project-lite/compare/v0.2.10...v0.2.11 [0.2.10]: https://github.com/taiki-e/pin-project-lite/compare/v0.2.9...v0.2.10 diff -Nru temporalio-1.3.0/vendor/pin-project-lite/src/lib.rs temporalio-1.3.0/vendor/pin-project-lite/src/lib.rs --- temporalio-1.3.0/vendor/pin-project-lite/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/pin-project-lite/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -368,7 +368,7 @@ { $($body_data:tt)* } - $($(#[$drop_impl_attrs:meta])* impl $($pinned_drop:tt)*)? + $(impl $($pinned_drop:tt)*)? ) => { $crate::__pin_project_reconstruct! { [$(#[$attrs])* $vis $struct_ty_ident $ident] @@ -417,7 +417,7 @@ { $($body_data)* } - $($(#[$drop_impl_attrs])* impl $($pinned_drop)*)? + $(impl $($pinned_drop)*)? } }; } @@ -438,7 +438,7 @@ $field_vis:vis $field:ident: $field_ty:ty ),+ $(,)? } - $($(#[$drop_impl_attrs:meta])* impl $($pinned_drop:tt)*)? + $(impl $($pinned_drop:tt)*)? ) => { #[allow(explicit_outlives_requirements)] // https://github.com/rust-lang/rust/issues/60993 #[allow(single_use_lifetimes)] // https://github.com/rust-lang/rust/issues/55058 @@ -529,7 +529,7 @@ $crate::__pin_project_make_drop_impl! { [$ident] [$($impl_generics)*] [$($ty_generics)*] [$(where $($where_clause)*)?] - $($(#[$drop_impl_attrs])* impl $($pinned_drop)*)? + $(impl $($pinned_drop)*)? } // Ensure that it's impossible to use pin projections on a #[repr(packed)] struct. @@ -581,7 +581,7 @@ })? ),+ $(,)? } - $($(#[$drop_impl_attrs:meta])* impl $($pinned_drop:tt)*)? + $(impl $($pinned_drop:tt)*)? ) => { #[allow(single_use_lifetimes)] // https://github.com/rust-lang/rust/issues/55058 // This lint warns of `clippy::*` generated by external macros. @@ -660,7 +660,7 @@ $crate::__pin_project_make_drop_impl! { [$ident] [$($impl_generics)*] [$($ty_generics)*] [$(where $($where_clause)*)?] - $($(#[$drop_impl_attrs])* impl $($pinned_drop)*)? + $(impl $($pinned_drop)*)? } // We don't need to check for '#[repr(packed)]', @@ -1216,7 +1216,6 @@ ( [$_ident:ident] [$($_impl_generics:tt)*] [$($_ty_generics:tt)*] [$(where $($_where_clause:tt)*)?] - $(#[$drop_impl_attrs:meta])* impl $(< $( $lifetime:lifetime $(: $lifetime_bound:lifetime)? ),* $(,)? $( $generics:ident @@ -1233,13 +1232,11 @@ ),* $(,)? )? { - $(#[$drop_fn_attrs:meta])* fn drop($($arg:ident)+: Pin<&mut Self>) { $($tt:tt)* } } ) => { - $(#[$drop_impl_attrs])* impl $(< $( $lifetime $(: $lifetime_bound)? ,)* $( $generics @@ -1256,7 +1253,6 @@ ),* )? { - $(#[$drop_fn_attrs])* fn drop(&mut self) { // Implementing `__DropInner::__drop_inner` is safe, but calling it is not safe. // This is because destructors can be called multiple times in safe code and @@ -1577,7 +1573,7 @@ { $($body_data:tt)* } - $($(#[$drop_impl_attrs:meta])* impl $($pinned_drop:tt)*)? + $(impl $($pinned_drop:tt)*)? ) => { $crate::__pin_project_expand! { [$($proj_mut_ident)?] @@ -1612,7 +1608,7 @@ { $($body_data)* } - $($(#[$drop_impl_attrs])* impl $($pinned_drop)*)? + $(impl $($pinned_drop)*)? } }; } diff -Nru temporalio-1.3.0/vendor/pin-project-lite/tests/test.rs temporalio-1.3.0/vendor/pin-project-lite/tests/test.rs --- temporalio-1.3.0/vendor/pin-project-lite/tests/test.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/pin-project-lite/tests/test.rs 2023-10-30 19:40:00.000000000 +0000 @@ -683,13 +683,11 @@ req: Request, } - /// dox1 impl PinnedDrop for Struct3<'_, T, Request> where T: Service, T::Error: std::error::Error, { - /// dox2 fn drop(mut this: Pin<&mut Self>) { **this.as_mut().project().was_dropped = true; } diff -Nru temporalio-1.3.0/vendor/proc-macro2/.cargo-checksum.json temporalio-1.3.0/vendor/proc-macro2/.cargo-checksum.json --- temporalio-1.3.0/vendor/proc-macro2/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/proc-macro2/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"Cargo.toml":"01a9ffc0f14fe891a6a75927a22429879d06ea732b24ab1229838e6c827d9630","LICENSE-APACHE":"62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","README.md":"c609b6865476d6c35879784e9155367a97a0da496aa5c3c61488440a20f59883","build.rs":"6b0b19a3af5248513b186b9c28c133f5af34a1d11122c0268c68e89724aa40fa","rust-toolchain.toml":"6bbb61302978c736b2da03e4fb40e3beab908f85d533ab46fd541e637b5f3e0f","src/detection.rs":"ed9a5f9a979ab01247d7a68eeb1afa3c13209334c5bfff0f9289cb07e5bb4e8b","src/extra.rs":"d378a9e799e5c49933b067cd38f5364d16a152ef337eef86ce42fdc86005ddf3","src/fallback.rs":"11b005c95258ad50362bcaa9b778aab15a8d49a0c434cd2b42afff98416ae1fe","src/lib.rs":"99a6acbddbe01cd906ac243a3db52a28b9fbb2bdc5f238f992d15fb0cebdbcdc","src/location.rs":"f55d2e61f1bb1af65e14ed04c9e91eb1ddbf8430e8c05f2048d1cd538d27368e","src/marker.rs":"43f5a18f5059f1a16507c047b3b7387afee7f25ac45ba4eb1621ca7fa733eb01","src/parse.rs":"6ceaad0a6375af9a202cf8df6ebe72e1bce9543b1f0db71ea03929ac02c3a8b8","src/rcvec.rs":"1c3c48c4f819927cc445ae15ca3bb06775feff2fd1cb21901ae4c40c7e6b4e82","src/wrapper.rs":"06624150b94f4fd9ada30b2c9ad6936ea695d05c2138ceb14f2304e757133d52","tests/comments.rs":"31115b3a56c83d93eef2fb4c9566bf4543e302560732986161b98aef504785ed","tests/features.rs":"a86deb8644992a4eb64d9fd493eff16f9cf9c5cb6ade3a634ce0c990cf87d559","tests/marker.rs":"3190ee07dae510251f360db701ce257030f94a479b6689c3a9ef804bd5d8d099","tests/test.rs":"7511be57e097b15403cf36feb858b4aabdc832fac7024571059a559a7e2ed2a0","tests/test_fmt.rs":"b7743b612af65f2c88cbe109d50a093db7aa7e87f9e37bf45b7bbaeb240aa020","tests/test_size.rs":"acf05963c1e62052d769d237b50844a2c59b4182b491231b099a4f74e5456ab0"},"package":"134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da"} \ No newline at end of file +{"files":{"Cargo.toml":"a60eadb453036fc5f0313f0a7bf0c973609209b3c9de07a166581cd3615302fe","LICENSE-APACHE":"62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","README.md":"690809ae2c2aa28e479bc38a7c296924b9a4c8b6a689c7b62a4f33ae834ffca9","build.rs":"6b0b19a3af5248513b186b9c28c133f5af34a1d11122c0268c68e89724aa40fa","rust-toolchain.toml":"6bbb61302978c736b2da03e4fb40e3beab908f85d533ab46fd541e637b5f3e0f","src/detection.rs":"ed9a5f9a979ab01247d7a68eeb1afa3c13209334c5bfff0f9289cb07e5bb4e8b","src/extra.rs":"d378a9e799e5c49933b067cd38f5364d16a152ef337eef86ce42fdc86005ddf3","src/fallback.rs":"2d3be80c4df730c2400f9b4fa953640c78b7701ac09823c0a007bfe0343dbc1e","src/lib.rs":"fb19025556ba827c8cc5dc4fe4840137e1ffe51476ead385e2b99d7939a1d733","src/location.rs":"f55d2e61f1bb1af65e14ed04c9e91eb1ddbf8430e8c05f2048d1cd538d27368e","src/marker.rs":"43f5a18f5059f1a16507c047b3b7387afee7f25ac45ba4eb1621ca7fa733eb01","src/parse.rs":"08af3478a0d9e5252c2e7a4968cb2837d3b8d23606cf67c662eb9e008c9e1cee","src/rcvec.rs":"1c3c48c4f819927cc445ae15ca3bb06775feff2fd1cb21901ae4c40c7e6b4e82","src/wrapper.rs":"06624150b94f4fd9ada30b2c9ad6936ea695d05c2138ceb14f2304e757133d52","tests/comments.rs":"31115b3a56c83d93eef2fb4c9566bf4543e302560732986161b98aef504785ed","tests/features.rs":"a86deb8644992a4eb64d9fd493eff16f9cf9c5cb6ade3a634ce0c990cf87d559","tests/marker.rs":"3190ee07dae510251f360db701ce257030f94a479b6689c3a9ef804bd5d8d099","tests/test.rs":"b6190b112f4fc15916d6ee6c9b51bbeff825e5fc807b37fd21cc1b119dd76a24","tests/test_fmt.rs":"b7743b612af65f2c88cbe109d50a093db7aa7e87f9e37bf45b7bbaeb240aa020","tests/test_size.rs":"acf05963c1e62052d769d237b50844a2c59b4182b491231b099a4f74e5456ab0"},"package":"18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/proc-macro2/Cargo.toml temporalio-1.3.0/vendor/proc-macro2/Cargo.toml --- temporalio-1.3.0/vendor/proc-macro2/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/proc-macro2/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -13,7 +13,7 @@ edition = "2021" rust-version = "1.56" name = "proc-macro2" -version = "1.0.69" +version = "1.0.66" authors = [ "David Tolnay ", "Alex Crichton ", diff -Nru temporalio-1.3.0/vendor/proc-macro2/README.md temporalio-1.3.0/vendor/proc-macro2/README.md --- temporalio-1.3.0/vendor/proc-macro2/README.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/proc-macro2/README.md 2023-10-30 19:40:00.000000000 +0000 @@ -52,7 +52,7 @@ If parsing with [Syn], you'll use [`parse_macro_input!`] instead to propagate parse errors correctly back to the compiler when parsing fails. -[`parse_macro_input!`]: https://docs.rs/syn/2.0/syn/macro.parse_macro_input.html +[`parse_macro_input!`]: https://docs.rs/syn/1.0/syn/macro.parse_macro_input.html ## Unstable features diff -Nru temporalio-1.3.0/vendor/proc-macro2/src/fallback.rs temporalio-1.3.0/vendor/proc-macro2/src/fallback.rs --- temporalio-1.3.0/vendor/proc-macro2/src/fallback.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/proc-macro2/src/fallback.rs 2023-10-30 19:40:00.000000000 +0000 @@ -4,8 +4,6 @@ use crate::rcvec::{RcVec, RcVecBuilder, RcVecIntoIter, RcVecMut}; use crate::{Delimiter, Spacing, TokenTree}; #[cfg(all(span_locations, not(fuzzing)))] -use alloc::collections::BTreeMap; -#[cfg(all(span_locations, not(fuzzing)))] use core::cell::RefCell; #[cfg(span_locations)] use core::cmp; @@ -307,6 +305,7 @@ } pub fn is_real(&self) -> bool { + // XXX(nika): Support real files in the future? false } } @@ -323,13 +322,12 @@ #[cfg(all(span_locations, not(fuzzing)))] thread_local! { static SOURCE_MAP: RefCell = RefCell::new(SourceMap { - // Start with a single dummy file which all call_site() and def_site() - // spans reference. + // NOTE: We start with a single dummy file which all call_site() and + // def_site() spans reference. files: vec![FileInfo { source_text: String::new(), span: Span { lo: 0, hi: 0 }, lines: vec![0], - char_index_to_byte_offset: BTreeMap::new(), }], }); } @@ -339,7 +337,6 @@ source_text: String, span: Span, lines: Vec, - char_index_to_byte_offset: BTreeMap, } #[cfg(all(span_locations, not(fuzzing)))] @@ -366,40 +363,10 @@ span.lo >= self.span.lo && span.hi <= self.span.hi } - fn source_text(&mut self, span: Span) -> String { - let lo_char = (span.lo - self.span.lo) as usize; - - // Look up offset of the largest already-computed char index that is - // less than or equal to the current requested one. We resume counting - // chars from that point. - let (&last_char_index, &last_byte_offset) = self - .char_index_to_byte_offset - .range(..=lo_char) - .next_back() - .unwrap_or((&0, &0)); - - let lo_byte = if last_char_index == lo_char { - last_byte_offset - } else { - let total_byte_offset = match self.source_text[last_byte_offset..] - .char_indices() - .nth(lo_char - last_char_index) - { - Some((additional_offset, _ch)) => last_byte_offset + additional_offset, - None => self.source_text.len(), - }; - self.char_index_to_byte_offset - .insert(lo_char, total_byte_offset); - total_byte_offset - }; - - let trunc_lo = &self.source_text[lo_byte..]; - let char_len = (span.hi - span.lo) as usize; - let source_text = match trunc_lo.char_indices().nth(char_len) { - Some((offset, _ch)) => &trunc_lo[..offset], - None => trunc_lo, - }; - source_text.to_owned() + fn source_text(&self, span: Span) -> String { + let lo = (span.lo - self.span.lo) as usize; + let hi = (span.hi - self.span.lo) as usize; + self.source_text[lo..hi].to_owned() } } @@ -438,6 +405,7 @@ fn add_file(&mut self, src: &str) -> Span { let (len, lines) = lines_offsets(src); let lo = self.next_start_pos(); + // XXX(nika): Should we bother doing a checked cast or checked add here? let span = Span { lo, hi: lo + (len as u32), @@ -447,8 +415,6 @@ source_text: src.to_owned(), span, lines, - // Populated lazily by source_text(). - char_index_to_byte_offset: BTreeMap::new(), }); span @@ -476,15 +442,6 @@ } unreachable!("Invalid span with no related FileInfo!"); } - - fn fileinfo_mut(&mut self, span: Span) -> &mut FileInfo { - for file in &mut self.files { - if file.span_within(span) { - return file; - } - } - unreachable!("Invalid span with no related FileInfo!"); - } } #[derive(Clone, Copy, PartialEq, Eq)] @@ -609,7 +566,7 @@ if self.is_call_site() { None } else { - Some(SOURCE_MAP.with(|cm| cm.borrow_mut().fileinfo_mut(*self).source_text(*self))) + Some(SOURCE_MAP.with(|cm| cm.borrow().fileinfo(*self).source_text(*self))) } } } diff -Nru temporalio-1.3.0/vendor/proc-macro2/src/lib.rs temporalio-1.3.0/vendor/proc-macro2/src/lib.rs --- temporalio-1.3.0/vendor/proc-macro2/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/proc-macro2/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -55,7 +55,7 @@ //! If parsing with [Syn], you'll use [`parse_macro_input!`] instead to //! propagate parse errors correctly back to the compiler when parsing fails. //! -//! [`parse_macro_input!`]: https://docs.rs/syn/2.0/syn/macro.parse_macro_input.html +//! [`parse_macro_input!`]: https://docs.rs/syn/1.0/syn/macro.parse_macro_input.html //! //! # Unstable features //! @@ -86,7 +86,7 @@ //! a different thread. // Proc-macro2 types in rustdoc of other crates get linked to here. -#![doc(html_root_url = "https://docs.rs/proc-macro2/1.0.69")] +#![doc(html_root_url = "https://docs.rs/proc-macro2/1.0.66")] #![cfg_attr(any(proc_macro_span, super_unstable), feature(proc_macro_span))] #![cfg_attr(super_unstable, feature(proc_macro_def_site))] #![cfg_attr(doc_cfg, feature(doc_cfg))] @@ -95,11 +95,9 @@ clippy::cast_possible_truncation, clippy::doc_markdown, clippy::items_after_statements, - clippy::iter_without_into_iter, clippy::let_underscore_untyped, clippy::manual_assert, clippy::manual_range_contains, - clippy::missing_safety_doc, clippy::must_use_candidate, clippy::needless_doctest_main, clippy::new_without_default, @@ -854,7 +852,7 @@ /// Rust keywords. Use `input.call(Ident::parse_any)` when parsing to match the /// behaviour of `Ident::new`. /// -/// [`Parse`]: https://docs.rs/syn/2.0/syn/parse/trait.Parse.html +/// [`Parse`]: https://docs.rs/syn/1.0/syn/parse/trait.Parse.html /// /// # Examples /// @@ -945,7 +943,7 @@ /// Panics if the input string is neither a keyword nor a legal variable /// name. If you are not sure whether the string contains an identifier and /// need to handle an error case, use - ///
syn::parse_str::<Ident> /// rather than `Ident::new`. diff -Nru temporalio-1.3.0/vendor/proc-macro2/src/parse.rs temporalio-1.3.0/vendor/proc-macro2/src/parse.rs --- temporalio-1.3.0/vendor/proc-macro2/src/parse.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/proc-macro2/src/parse.rs 2023-10-30 19:40:00.000000000 +0000 @@ -161,10 +161,6 @@ } } -// Rustc's representation of a macro expansion error in expression position or -// type position. -const ERROR: &str = "(/*ERROR*/)"; - pub(crate) fn token_stream(mut input: Cursor) -> Result { let mut trees = TokenStreamBuilder::new(); let mut stack = Vec::new(); @@ -196,7 +192,7 @@ }; if let Some(open_delimiter) = match first { - b'(' if !input.starts_with(ERROR) => Some(Delimiter::Parenthesis), + b'(' => Some(Delimiter::Parenthesis), b'[' => Some(Delimiter::Bracket), b'{' => Some(Delimiter::Brace), _ => None, @@ -271,10 +267,6 @@ Ok((input, TokenTree::Punct(p))) } else if let Ok((input, i)) = ident(input) { Ok((input, TokenTree::Ident(i))) - } else if input.starts_with(ERROR) { - let rest = input.advance(ERROR.len()); - let repr = crate::Literal::_new_fallback(Literal::_new(ERROR.to_owned())); - Ok((rest, TokenTree::Literal(repr))) } else { Err(Reject) } diff -Nru temporalio-1.3.0/vendor/proc-macro2/tests/test.rs temporalio-1.3.0/vendor/proc-macro2/tests/test.rs --- temporalio-1.3.0/vendor/proc-macro2/tests/test.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/proc-macro2/tests/test.rs 2023-10-30 19:40:00.000000000 +0000 @@ -325,24 +325,6 @@ assert!(positive.subspan(1..4).is_none()); } -#[cfg(span_locations)] -#[test] -fn source_text() { - let input = " 𓀕 a z "; - let mut tokens = input - .parse::() - .unwrap() - .into_iter(); - - let first = tokens.next().unwrap(); - assert_eq!("𓀕", first.span().source_text().unwrap()); - - let second = tokens.next().unwrap(); - let third = tokens.next().unwrap(); - assert_eq!("z", third.span().source_text().unwrap()); - assert_eq!("a", second.span().source_text().unwrap()); -} - #[test] fn roundtrip() { fn roundtrip(p: &str) { diff -Nru temporalio-1.3.0/vendor/quanta/benches/contention.rs temporalio-1.3.0/vendor/quanta/benches/contention.rs --- temporalio-1.3.0/vendor/quanta/benches/contention.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/quanta/benches/contention.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,61 @@ +use criterion::{black_box, criterion_group, criterion_main, BenchmarkId, Criterion}; +use quanta::Instant as QuantaInstant; +use std::{ + sync::Mutex, + thread, + time::{Duration, Instant as StdInstant}, +}; + +const MAX_THREAD_COUNT: u32 = 12; + +fn run(thread_count: u32, iter_count: u64, now: impl Fn() -> I + Sync) -> Duration { + let max_duration = Mutex::new(Duration::new(0, 0)); + + thread::scope(|s| { + for _ in 0..thread_count { + s.spawn(|| { + let start = StdInstant::now(); + + for _ in 0..iter_count { + black_box(now()); + } + + let duration = start.elapsed(); + let mut max_duration = max_duration.lock().unwrap(); + *max_duration = max_duration.max(duration); + }); + } + }); + + let max = *max_duration.lock().unwrap(); + max +} + +fn benchmark(c: &mut Criterion) { + let mut std_group = c.benchmark_group("stdlib"); + for thread_count in 1..=MAX_THREAD_COUNT { + std_group.bench_with_input( + BenchmarkId::new("now", thread_count), + &thread_count, + |b, &thread_count| { + b.iter_custom(|iter_count| run(thread_count, iter_count, StdInstant::now)); + }, + ); + } + std_group.finish(); + + let mut q_group = c.benchmark_group("quanta"); + for thread_count in 1..=MAX_THREAD_COUNT { + q_group.bench_with_input( + BenchmarkId::new("now", thread_count), + &thread_count, + |b, &thread_count| { + b.iter_custom(|iter_count| run(thread_count, iter_count, QuantaInstant::now)); + }, + ); + } + q_group.finish(); +} + +criterion_group!(benches, benchmark); +criterion_main!(benches); diff -Nru temporalio-1.3.0/vendor/quanta/benches/README.md temporalio-1.3.0/vendor/quanta/benches/README.md --- temporalio-1.3.0/vendor/quanta/benches/README.md 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/quanta/benches/README.md 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,50 @@ +# Benchmarks + +Benchmarks were performed on an [AMD Ryzen 7 4800HS CPU](https://en.wikichip.org/wiki/amd/ryzen_9/3900). + +```sh +$ cargo bench --bench +$ critcmp new | tail +3 | sort | sed 's# ? ?/sec##' +``` + +## timing +``` +quanta/quanta_instant_now 1.00 9.7±0.01ns +quanta/quanta_instant_recent 1.00 1.5±0.10ns +quanta/quanta_now 1.00 9.1±0.65ns +quanta/quanta_now_delta 1.00 18.4±0.04ns +quanta/quanta_raw 1.00 8.9±0.00ns +quanta/quanta_raw_delta 1.00 18.2±0.03ns +quanta/quanta_raw_scaled 1.00 9.0±0.07ns +quanta/quanta_recent 1.00 1.7±0.00ns +stdlib/instant_delta 1.00 2.2±0.09µs +stdlib/instant_now 1.00 1110.8±48.42ns +``` + +## contention +``` +quanta/now/10 1.00 25.4±9.78ns +quanta/now/1 1.00 10.6±3.50ns +quanta/now/11 1.00 25.5±9.57ns +quanta/now/12 1.00 22.7±4.48ns +quanta/now/2 1.00 16.0±6.11ns +quanta/now/3 1.00 17.4±6.34ns +quanta/now/4 1.00 17.6±5.65ns +quanta/now/5 1.00 16.2±4.96ns +quanta/now/6 1.00 17.9±7.19ns +quanta/now/7 1.00 16.5±5.65ns +quanta/now/8 1.00 17.7±6.06ns +quanta/now/9 1.00 24.4±9.00ns +stdlib/now/10 1.00 1399.3±84.62ns +stdlib/now/1 1.00 1187.1±138.65ns +stdlib/now/11 1.00 1388.3±64.43ns +stdlib/now/12 1.00 1395.2±60.53ns +stdlib/now/2 1.00 1433.9±158.59ns +stdlib/now/3 1.00 1384.1±71.93ns +stdlib/now/4 1.00 1407.1±159.88ns +stdlib/now/5 1.00 1367.0±62.41ns +stdlib/now/6 1.00 1411.6±167.61ns +stdlib/now/7 1.00 1396.0±83.37ns +stdlib/now/8 1.00 1390.6±81.05ns +stdlib/now/9 1.00 1436.7±113.11ns +``` diff -Nru temporalio-1.3.0/vendor/quanta/benches/timing.rs temporalio-1.3.0/vendor/quanta/benches/timing.rs --- temporalio-1.3.0/vendor/quanta/benches/timing.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/quanta/benches/timing.rs 2023-10-30 19:40:00.000000000 +0000 @@ -3,7 +3,7 @@ use std::time::Instant as StdInstant; fn time_instant_now(b: &mut Bencher) { - b.iter(|| StdInstant::now()) + b.iter(StdInstant::now) } fn time_quanta_now(b: &mut Bencher) { @@ -13,7 +13,7 @@ fn time_quanta_instant_now(b: &mut Bencher) { let _ = QuantaInstant::now(); - b.iter(|| QuantaInstant::now()); + b.iter(QuantaInstant::now); } fn time_quanta_raw(b: &mut Bencher) { @@ -26,26 +26,6 @@ b.iter(|| clock.scaled(clock.raw())) } -fn time_quanta_start(b: &mut Bencher) { - let clock = Clock::new(); - b.iter(|| clock.start()) -} - -fn time_quanta_start_scaled(b: &mut Bencher) { - let clock = Clock::new(); - b.iter(|| clock.scaled(clock.start())) -} - -fn time_quanta_end(b: &mut Bencher) { - let clock = Clock::new(); - b.iter(|| clock.end()) -} - -fn time_quanta_end_scaled(b: &mut Bencher) { - let clock = Clock::new(); - b.iter(|| clock.scaled(clock.end())) -} - fn time_instant_delta(b: &mut Bencher) { b.iter(|| { let start = StdInstant::now(); @@ -63,21 +43,21 @@ }) } -fn time_quanta_now_delta(b: &mut Bencher) { +fn time_quanta_raw_delta_as_nanos(b: &mut Bencher) { let clock = Clock::new(); b.iter(|| { - let start = clock.now(); - let end = clock.now(); - end - start + let start = clock.raw(); + let end = clock.raw(); + clock.delta_as_nanos(start, end) }) } -fn time_quanta_start_end_delta(b: &mut Bencher) { +fn time_quanta_now_delta(b: &mut Bencher) { let clock = Clock::new(); b.iter(|| { - let start = clock.start(); - let end = clock.end(); - clock.delta(start, end) + let start = clock.now(); + let end = clock.now(); + end - start }) } @@ -104,11 +84,7 @@ q_group.bench_function("quanta_raw", time_quanta_raw); q_group.bench_function("quanta_raw_scaled", time_quanta_raw_scaled); q_group.bench_function("quanta_raw_delta", time_quanta_raw_delta); - q_group.bench_function("quanta_start", time_quanta_start); - q_group.bench_function("quanta_start_scaled", time_quanta_start_scaled); - q_group.bench_function("quanta_end", time_quanta_end); - q_group.bench_function("quanta_end_scaled", time_quanta_end_scaled); - q_group.bench_function("quanta_start/end_delta", time_quanta_start_end_delta); + q_group.bench_function("quanta_raw_delta_as_nanos", time_quanta_raw_delta_as_nanos); q_group.bench_function("quanta_recent", time_quanta_recent); q_group.bench_function("quanta_instant_recent", time_quanta_instant_recent); q_group.finish(); diff -Nru temporalio-1.3.0/vendor/quanta/.cargo-checksum.json temporalio-1.3.0/vendor/quanta/.cargo-checksum.json --- temporalio-1.3.0/vendor/quanta/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/quanta/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"CHANGELOG.md":"b8fdb52d947292fcef0de22f33922e4f6262f6551c4517c727a66f6cbb2129c3","CODE_OF_CONDUCT.md":"55a5389e814d4a899404c00f4e77bd734d7c41af6b85bf5e76b3288c56b2ebe5","Cargo.toml":"137e2257fa2aab5c4be4c2a57a2c43d37d8e9eb218ef4c010d7cd68e0c124f8c","LICENSE":"7bdd587c9ff64c56323455bad7ec590698fbf56c02291c8e515b2afc85306282","README.md":"0e73248245e0afb4f18d37ca7d6b8f0c5a81ce37caf1c7cb431d3658e5970409","benches/timing.rs":"af5711bc560cb0bf0a85e928959e01e4a1e856d16dadcc8fd8b525248521b027","release.toml":"081445c2ff4fe8e3ba2c040290eedd29fe88baff4ef8b563353262b39a2421d3","src/counter.rs":"e614ad08cf92c73e122022b3bbf5de031480bc1c41fe72474a3b5ae5c054b22d","src/instant.rs":"1ab876a69b3b156099575745252be161515de76f4ceb678ac16153eb36c76e86","src/lib.rs":"8ba73501a03b4bc32241d0fcb431d63ffeffd22638d90e497ea6c30b3a641071","src/mock.rs":"a4053eecfc57bb3a63d5e470590ea730c2aeda90bcc8c4685925be6f7b4e6ab9","src/monotonic.rs":"f4190eb6adc2494288b0a3d3f60777d60ef630b05cbfd1a73813f314e7ea735b","src/stats.rs":"dddfad72a9eef1385e89db2e55d88c3657b06d671bf8aa9a09859d506aa61d86","src/upkeep.rs":"3fc35743a68435256e6b3c96fecf35fbda702a727795b8c8a83cf57c1df36221"},"package":"20afe714292d5e879d8b12740aa223c6a88f118af41870e8b6196e39a02238a8"} \ No newline at end of file +{"files":{"CHANGELOG.md":"1767e5478469dc4d4ae36364237666397cf875de69c4bffe7d37170e8a1c27db","CODE_OF_CONDUCT.md":"55a5389e814d4a899404c00f4e77bd734d7c41af6b85bf5e76b3288c56b2ebe5","Cargo.toml":"9828b82200a1d5502eaf04be0a0c46e56eeb6d45d5f8b76953ce4f129c450492","LICENSE":"7bdd587c9ff64c56323455bad7ec590698fbf56c02291c8e515b2afc85306282","README.md":"0e73248245e0afb4f18d37ca7d6b8f0c5a81ce37caf1c7cb431d3658e5970409","benches/README.md":"8a90b51749047ad2a87801e5151149cf2b6318536037c66ee990cf54d1161b00","benches/contention.rs":"8c0ecfb1a7b37b7c0c2f0c31513d54a11d0607f787be7d1b1ad2ccb3f04671a1","benches/timing.rs":"7939b6565b7aaf5bda9e6877971055001e376d5dd5a3e6156491799a638b15d1","release.toml":"27e1704eb66df4c4dc0ac14a3d732ad06b8c87b1aca8747443dba573ad5eb639","rust-toolchain.toml":"e5cc0545f232bde807bd9394c2433322d1cd2cf42b060ceab2ac7329bc9cdaa2","src/clocks/counter.rs":"81920c98d85fd7ee57caa5038905c5177960830d4afebe7589be85a2f7c9156e","src/clocks/mod.rs":"6da94f7b5187caca77dfc0c1e11636a1ec80729be36bd9f0be399a2ba0b07d81","src/clocks/monotonic/macos.rs":"827e112b5c1e796a1755ca8db587763b137ba6da8caf93b06ca9a4a5ed78b6ba","src/clocks/monotonic/mod.rs":"4d261187b5fde9cf08dd6a597f0647729dcad3efc02bc189c8525927c2c36341","src/clocks/monotonic/unix.rs":"ab854fd3093ef4b4c0ba82cfcbdd6cafa8f325e68976b32d0bf49bcaf780a177","src/clocks/monotonic/wasm.rs":"3798e3fe972ce768fd523988f91df2959ecd6d7d993ad8df6cc2db872a2d352a","src/clocks/monotonic/windows.rs":"af6a3bd91d699250cb86391853266d67278c48eb53c6ae2372f14876d5e41a8d","src/instant.rs":"7dafb373287160f8f4cb2c0bffc831b481f7b5010194d18ae4ad8999fba31a50","src/lib.rs":"594df9a8477333d62d2f62defd42f1481b2e9db2a5bbfc5fb2ff7e9501772554","src/mock.rs":"7223ce27a1de5fbaae7dc4e900485eb9bc306dd80faf3bef03a5eac2165a6924","src/stats.rs":"591971ca567e3192049e028a45460c77a4b34a0bc1d0cec7ac6730bf6811e7db","src/upkeep.rs":"765269925343f646b17292f388d63f113f516f647bde8e4585d1d86f5d5e58a8"},"package":"a17e662a7a8291a865152364c20c7abc5e60486ab2001e8ec10b24862de0b9ab"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/quanta/Cargo.toml temporalio-1.3.0/vendor/quanta/Cargo.toml --- temporalio-1.3.0/vendor/quanta/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/quanta/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -10,17 +10,23 @@ # See Cargo.toml.orig for the original contents. [package] -edition = "2018" +edition = "2021" +rust-version = "1.60" name = "quanta" -version = "0.9.3" +version = "0.11.1" authors = ["Toby Lawrence "] description = "high-speed timing library" homepage = "https://github.com/metrics-rs/quanta" documentation = "https://docs.rs/quanta" readme = "README.md" -keywords = ["rdtsc", "timing", "nanosecond"] +keywords = [ + "rdtsc", + "timing", + "nanosecond", +] license = "MIT" repository = "https://github.com/metrics-rs/quanta" + [package.metadata.docs.rs] all-features = true @@ -30,6 +36,11 @@ [[bench]] name = "timing" harness = false + +[[bench]] +name = "contention" +harness = false + [dependencies.crossbeam-utils] version = "0.8.5" @@ -37,35 +48,49 @@ version = "1.4" [dependencies.prost-types] -version = "0.8" +version = "0.11" optional = true +default-features = false + [dev-dependencies.average] version = "0.13" [dev-dependencies.criterion] -version = "0.3" +version = "=0.3.3" [features] default = ["flaky_tests"] flaky_tests = [] prost = ["prost-types"] -[target."cfg(all(not(target_os = \"macos\"), not(target_os = \"ios\"), not(target_os = \"windows\"), not(target_arch = \"wasm32\")))".dependencies.libc] -version = "0.2" + [target."cfg(all(target_arch = \"wasm32\", target_os = \"unknown\"))".dependencies.web-sys] version = "0.3" -features = ["Window", "Performance"] +features = [ + "Window", + "Performance", +] + [target."cfg(all(target_arch = \"wasm32\", target_os = \"unknown\"))".dev-dependencies.wasm-bindgen-test] version = "0.3" + [target."cfg(all(target_arch = \"wasm32\", target_os = \"wasi\"))".dependencies.wasi] -version = "0.10" +version = "0.11" + +[target."cfg(not(any(target_os = \"macos\", target_os = \"ios\", target_os = \"windows\", target_arch = \"wasm32\")))".dependencies.libc] +version = "0.2" + [target."cfg(target_arch = \"x86\")".dependencies.raw-cpuid] version = "10.2" + [target."cfg(target_arch = \"x86_64\")".dependencies.raw-cpuid] version = "10.2" -[target."cfg(target_os = \"ios\")".dependencies.mach] -version = "0.3" -[target."cfg(target_os = \"macos\")".dependencies.mach] -version = "0.3" + +[target."cfg(target_os = \"ios\")".dependencies.mach2] +version = "0.4" + +[target."cfg(target_os = \"macos\")".dependencies.mach2] +version = "0.4" + [target."cfg(target_os = \"windows\")".dependencies.winapi] version = "0.3" features = ["profileapi"] diff -Nru temporalio-1.3.0/vendor/quanta/CHANGELOG.md temporalio-1.3.0/vendor/quanta/CHANGELOG.md --- temporalio-1.3.0/vendor/quanta/CHANGELOG.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/quanta/CHANGELOG.md 2023-10-30 19:40:00.000000000 +0000 @@ -8,57 +8,123 @@ ## [Unreleased] - ReleaseDate -## [0.9.3] - 2021-09-16 +## [0.11.1] - 2023-05-28 ### Added + +- Added a new method, `Clock::delta_as_nanos`, for getting the delta between two raw measurements as + the whole number of nanoseconds instead of the initial conversion to `Duration`. ([#86]) + +[#86]: https://github.com/metrics-rs/quanta/pull/86 + +## [0.11.0] - 2023-03-24 + +### Added + +- `Instant::elapsed()` has been added. ([#82]) + +### Changed + +- `Instant::duration_since` and `Instant::sub` now saturates to zero. ([#82]) +- Performance of `Instant::now` under high contention has been improved. ([#82]) + +[#82]: https://github.com/metrics-rs/quanta/pull/82 + +## [0.10.1] - 2022-07-20 + +### Added + +- Implement `std::error::Error` for `quanta::Error`. ([#68]) + +### Changed + +- Fixed build issue on x86/x86_64 platforms that did not have SSE. +- Fix scaling factor for `window.performance.now()` in WASM. ([#72]) + +[#72]: https://github.com/metrics-rs/quanta/pull/72 +[#68]: https://github.com/metrics-rs/quanta/pull/68 + +## [0.10.0] - 2022-05-18 + +### Changed + +- Documentation has been updated to reflect that `quanta` does not track time across system + suspends. +- Fixed a panic in the calibration loop if a certain edge case with TSC measurements is encountered. +- Updated a unit test that was frequently flaky to be more precise. + +### Removed + +- `Instant::as_u64` has been removed. As it provided direct access to an value that could + fundamentally change from version-to-version, it felt like time to remove that footgun and push + users more towards the API that mimics `std::time`. +- `Clock::upkeep` has been removed. It doesn't need to exist on `Clock` directly, as we have had + the `quanta::set_recent` free function for a while now, and was just duplicating that. +- `Clock::start` and `Clock::end` have been removed. They saw limited usage and overall just added somewhat needless API + clutter given that users who are looking to do ultra-precise timing will either want more control or use another + technique such as instruction counting. + +## 0.9.3 - 2021-09-16 + +### Added + - CI tests for MIPS/ARM. ([#55](https://github.com/metrics-rs/quanta/pull/55)) ### Changed + - Fixed compilation issue with `Mock` on MIPS/ARM. ([#55](https://github.com/metrics-rs/quanta/pull/55)) - Simplified how TSC/RDTSC suppoort is detected, which should avoid some situations where it was assumed to be present, but actually was not. ([#57](https://github.com/metrics-rs/quanta/pull/57)) -## [0.9.2] - 2021-08-25 +## 0.9.2 - 2021-08-25 ### Changed + - Pinned `crossbeam-utils` to `v0.8.5` where `AtomicCell::fetch_update` was introduced to fix, which fixes broken builds where Cargo chooses a version between `0.8.0` and `0.8.5`. - Update `raw-cpuid` to `10.2` and `average` to `0.13`. -## [0.9.1] - 2021-08-12 +## 0.9.1 - 2021-08-12 ### Changed + - Switched from `atomic-shim` to `crossbeam-utils` for better cross-platform atomic support. ([#52](https://github.com/metrics-rs/quanta/pull/52)) -## [0.9.0] - 2021-06-17 +## 0.9.0 - 2021-06-17 ### Added + - Support for WASM/WASI targets. ([#45](https://github.com/metrics-rs/quanta/pull/45)) -## [0.8.0] - 2021-06-07 +## 0.8.0 - 2021-06-07 ### Removed + - `Instant::as_unix_duration` as it was added in error. - `metrics` feature flag as `metrics-core` is no longer a relevant crate. -## [0.7.2] - 2021-01-25 +## 0.7.2 - 2021-01-25 ### Changed + - Bumped dependency on `raw-cpuid` to `9.0` in order to deal with a [RustSec advisory](https://rustsec.org/advisories/RUSTSEC-2021-0013). -## [0.7.1] - 2021-01-24 +## 0.7.1 - 2021-01-24 ### Fixed + - Incorrect method visibility for non-SSE2 implementation of `Counter`. ([#38](https://github.com/metrics-rs/quanta/issues/38)) -## [0.7.0] - 2021-01-03 +## 0.7.0 - 2021-01-03 ### Changed + - MSRV bumped to 1.45.0. - `Clock::now` takes `&self` instead of `&mut self`. - Fixed a bug where a failure to spawn the upkeep thread would not allow subsequent attempts to spawn the upkeep thread to proceed. ### Added + - New methods --`Instant::now` and `Instant::recent` for getting the current and recent time, respectively. - New free function `quanta::with_clock` for setting an override on the current thread that affects @@ -66,38 +132,45 @@ - New free function `quanta::set_recent` to allow customization of how global recent time is updated. -## [0.6.5] - 2020-09-16 +## 0.6.5 - 2020-09-16 ### Changed + - Fixed a bug with not being able to start the upkeep thread at all. ([#29](https://github.com/metrics-rs/quanta/issues/29)) -## [0.6.4] - 2020-08-27 +## 0.6.4 - 2020-08-27 ### Added + - Add `Instant::as_unix_duration` to get the duration of time since the Unix epoch from an `Instant`. ### Changed - Remove `clocksource` from dependencies and tests as it no longer compiles on stable or nightly. -## [0.6.3] - 2020-08-03 +## 0.6.3 - 2020-08-03 ### Changed + - Publicly expose `Clock::upkeep` for advanced use cases. - Relax constraints around checking for multiple sockets. ([#25](https://github.com/metrics-rs/quanta/issues/25)) -## [0.6.2] - 2020-07-20 +## 0.6.2 - 2020-07-20 ### Added + - Add support for MIPS/PowerPC. ([#23](https://github.com/metrics-rs/quanta/pull/23)) -## [0.6.1] - 2020-07-13 +## 0.6.1 - 2020-07-13 ### Added + - Publicly expose the `Error` type returned by `Upkeep::start`. -## [0.6.0] - 2020-07-06 +## 0.6.0 - 2020-07-06 + This version of `quanta` was a massive overhaul of man areas of the API and internals, which was done in a single PR: ([#19](https://github.com/metrics-rs/quanta/pull/19)). You can read the PR description for the finer details. All changes below are part of the aforementioned PR. ### Changed + - `Clock::now` now returns a monotonic value in all cases. - No longer possible to get a negative value from `Clock::delta`. - Calibration is no longer a fixed one second loop, and will complete when it detects it has a @@ -106,34 +179,47 @@ - Calibration is now shared amongst all `Clock` instances, running only once when the first `Clock` is created. -## [0.5.2] - 2020-05-01 +## 0.5.2 - 2020-05-01 ### Changed + - Fix the logic to figure out when calibration is required. ([#14](https://github.com/metrics-rs/quanta/pull/14)) -## [0.5.1] - 2020-04-11 +## 0.5.1 - 2020-04-11 ### Changed + - Small tweak to the docs. -## [0.5.0] - 2020-04-11 +## 0.5.0 - 2020-04-11 ### Changed + - Switch to `mach` for macOS/iOS as it was deprecated in `libc`. ([#12](https://github.com/metrics-rs/quanta/pull/12)) - Switch to `core::arch` for instrinics, and drop the feature flagged configuration to use it. ([#12](https://github.com/metrics-rs/quanta/pull/12)) - Switch to `criterion` for benchmarking. ([#12](https://github.com/metrics-rs/quanta/pull/12)) -## [0.4.0] - 2020-02-20 +## 0.4.0 - 2020-02-20 ### Changed + - Differentiate between raw and scaled time by adding a new `Instant` type. ([#10](https://github.com/metrics-rs/quanta/pull/10)) -## [0.2.0] - 2019-03-10 +## 0.2.0 - 2019-03-10 ### Changed + - Fixed support for Windows. It was in a bad way, but actually works correctly now! - Switched to Azure Pipelines CI + Cirrus CI, including formatting, tests, and benchmarks, for Linux, macOS, Windows, and FreeBSD. -## [0.1.0] - 2019-01-14 +## 0.1.0 - 2019-01-14 ### Added + - Initial commit. + + +[Unreleased]: https://github.com/metrics-rs/quanta/compare/v0.11.1...HEAD +[0.11.1]: https://github.com/metrics-rs/quanta/compare/v0.11.0...v0.11.1 +[0.11.0]: https://github.com/metrics-rs/quanta/compare/v0.10.1...v0.11.0 +[0.10.1]: https://github.com/metrics-rs/quanta/compare/v0.10.0...v0.10.1 +[0.10.0]: https://github.com/metrics-rs/quanta/releases/tag/v0.10.0 diff -Nru temporalio-1.3.0/vendor/quanta/release.toml temporalio-1.3.0/vendor/quanta/release.toml --- temporalio-1.3.0/vendor/quanta/release.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/quanta/release.toml 2023-10-30 19:40:00.000000000 +0000 @@ -2,7 +2,9 @@ sign-commit = true sign-tag = true pre-release-replacements = [ - {file="CHANGELOG.md", search="Unreleased", replace="{{version}}"}, - {file="CHANGELOG.md", search="ReleaseDate", replace="{{date}}"}, - {file="CHANGELOG.md", search="", replace="\n\n## [Unreleased] - ReleaseDate"}, -] \ No newline at end of file + {file="CHANGELOG.md", search="Unreleased", replace="{{version}}"}, + {file="CHANGELOG.md", search="\\.\\.\\.HEAD", replace="...{{tag_name}}", exactly=1}, + {file="CHANGELOG.md", search="ReleaseDate", replace="{{date}}"}, + {file="CHANGELOG.md", search="", replace="\n\n## [Unreleased] - ReleaseDate", exactly=1}, + {file="CHANGELOG.md", search="", replace="\n[Unreleased]: https://github.com/metrics-rs/quanta/compare/{{tag_name}}...HEAD", exactly=1}, +] diff -Nru temporalio-1.3.0/vendor/quanta/rust-toolchain.toml temporalio-1.3.0/vendor/quanta/rust-toolchain.toml --- temporalio-1.3.0/vendor/quanta/rust-toolchain.toml 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/quanta/rust-toolchain.toml 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,2 @@ +[toolchain] +channel = "stable" diff -Nru temporalio-1.3.0/vendor/quanta/src/clocks/counter.rs temporalio-1.3.0/vendor/quanta/src/clocks/counter.rs --- temporalio-1.3.0/vendor/quanta/src/clocks/counter.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/quanta/src/clocks/counter.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,19 @@ +#[cfg(all(target_arch = "x86_64", target_feature = "sse2"))] +use core::arch::x86_64::_rdtsc; + +#[derive(Clone, Debug, Default)] +pub struct Counter; + +#[cfg(all(target_arch = "x86_64", target_feature = "sse2"))] +impl Counter { + pub fn now(&self) -> u64 { + unsafe { _rdtsc() } + } +} + +#[cfg(not(all(target_arch = "x86_64", target_feature = "sse2")))] +impl Counter { + pub fn now(&self) -> u64 { + panic!("can't use counter without TSC support"); + } +} diff -Nru temporalio-1.3.0/vendor/quanta/src/clocks/mod.rs temporalio-1.3.0/vendor/quanta/src/clocks/mod.rs --- temporalio-1.3.0/vendor/quanta/src/clocks/mod.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/quanta/src/clocks/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,5 @@ +mod counter; +pub use self::counter::Counter; + +mod monotonic; +pub use self::monotonic::Monotonic; diff -Nru temporalio-1.3.0/vendor/quanta/src/clocks/monotonic/macos.rs temporalio-1.3.0/vendor/quanta/src/clocks/monotonic/macos.rs --- temporalio-1.3.0/vendor/quanta/src/clocks/monotonic/macos.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/quanta/src/clocks/monotonic/macos.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,24 @@ +use mach2::mach_time::{mach_absolute_time, mach_timebase_info}; + +#[derive(Clone, Copy, Debug)] +pub struct Monotonic { + factor: u64, +} +impl Monotonic { + pub fn now(&self) -> u64 { + let raw = unsafe { mach_absolute_time() }; + raw * self.factor + } +} + +impl Default for Monotonic { + fn default() -> Self { + let mut info = mach_timebase_info { numer: 0, denom: 0 }; + unsafe { + mach_timebase_info(&mut info); + } + + let factor = u64::from(info.numer) / u64::from(info.denom); + Self { factor } + } +} diff -Nru temporalio-1.3.0/vendor/quanta/src/clocks/monotonic/mod.rs temporalio-1.3.0/vendor/quanta/src/clocks/monotonic/mod.rs --- temporalio-1.3.0/vendor/quanta/src/clocks/monotonic/mod.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/quanta/src/clocks/monotonic/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,29 @@ +#[cfg(any(target_os = "macos", target_os = "ios"))] +mod macos; +#[cfg(any(target_os = "macos", target_os = "ios"))] +pub use self::macos::Monotonic; + +#[cfg(target_os = "windows")] +mod windows; +#[cfg(target_os = "windows")] +pub use self::windows::Monotonic; + +#[cfg(target_arch = "wasm32")] +mod wasm; +#[cfg(target_arch = "wasm32")] +pub use self::wasm::Monotonic; + +#[cfg(not(any( + target_os = "macos", + target_os = "ios", + target_os = "windows", + target_arch = "wasm32" +)))] +mod unix; +#[cfg(not(any( + target_os = "macos", + target_os = "ios", + target_os = "windows", + target_arch = "wasm32" +)))] +pub use self::unix::Monotonic; diff -Nru temporalio-1.3.0/vendor/quanta/src/clocks/monotonic/unix.rs temporalio-1.3.0/vendor/quanta/src/clocks/monotonic/unix.rs --- temporalio-1.3.0/vendor/quanta/src/clocks/monotonic/unix.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/quanta/src/clocks/monotonic/unix.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,36 @@ +#[derive(Clone, Copy, Debug, Default)] +pub struct Monotonic; + +impl Monotonic { + #[allow(clippy::cast_sign_loss)] + pub fn now(self) -> u64 { + let mut ts = libc::timespec { + tv_sec: 0, + tv_nsec: 0, + }; + unsafe { + libc::clock_gettime(libc::CLOCK_MONOTONIC, &mut ts); + } + + // LINT JUSTIFICATION: + // + // We really don't ever expect to actually _get_ negative values from `clock_gettime`, but + // given the types, it's technically possible. This is due to the fact that `tv_sec` is + // supposed to be `time_t`, which Unix/POSIX-compliant systems implement as a signed number. + // Accordingly, `tv_nsec` follows suit using a signed number. + // + // Given the adjustments made by NTP to clocks like CLOCK_MONOTONIC, and that + // CLOCK_MONOTONIC can be anchored to an arbitrary point, and a whole skew of other + // scenarios where it could be modified... it's technicaly possible to get back valid + // negative values. If we did math between `timespec` objects, the delta should be valid, + // even with negative numbers. + // + // We're returning a u64 here, though, so it is what it is. In practice, I've _never_ seen + // negative values under normal operation. If someone discovers a valid scenario where this + // is violated and that we need to account for, I'll be colored impressed, but also, file an + // issue and we'll do what we have to do to rework the code to try and support it better. + // + // Until then, though, we're just gonna ignore the lint. + ts.tv_sec as u64 * 1_000_000_000 + ts.tv_nsec as u64 + } +} diff -Nru temporalio-1.3.0/vendor/quanta/src/clocks/monotonic/wasm.rs temporalio-1.3.0/vendor/quanta/src/clocks/monotonic/wasm.rs --- temporalio-1.3.0/vendor/quanta/src/clocks/monotonic/wasm.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/quanta/src/clocks/monotonic/wasm.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,25 @@ +const WASM_WRONG_ENV: &str = "failed to find the global `window` object: the `wasm32-unknown-unknown` implementation only supports running in web browsers; wse `wasm32-wasi` to run elsewhere"; +const WASM_MISSING_WINDOW_PERF: &str = "failed to find `window.performance`"; + +#[derive(Clone, Copy, Debug, Default)] +pub struct Monotonic; + +#[cfg(all(target_arch = "wasm32", target_os = "unknown"))] +impl Monotonic { + pub fn now(&self) -> u64 { + let now = web_sys::window() + .expect(WASM_WRONG_ENV) + .performance() + .expect(WASM_MISSING_WINDOW_PERF) + .now(); + // `window.performance.now()` returns the time in milliseconds. + return f64::trunc(now * 1_000_000.0) as u64; + } +} + +#[cfg(all(target_arch = "wasm32", target_os = "wasi"))] +impl Monotonic { + pub fn now(&self) -> u64 { + unsafe { wasi::clock_time_get(wasi::CLOCKID_MONOTONIC, 1).expect("failed to get time") } + } +} diff -Nru temporalio-1.3.0/vendor/quanta/src/clocks/monotonic/windows.rs temporalio-1.3.0/vendor/quanta/src/clocks/monotonic/windows.rs --- temporalio-1.3.0/vendor/quanta/src/clocks/monotonic/windows.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/quanta/src/clocks/monotonic/windows.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,42 @@ +use std::mem; +use winapi::um::profileapi; + +#[derive(Clone, Copy, Debug)] +pub struct Monotonic { + factor: u64, +} + +impl Monotonic { + pub fn now(&self) -> u64 { + let raw = unsafe { + // TODO: Can we do any better than the `mem::zeroed` call here? + let mut count = mem::zeroed(); + if profileapi::QueryPerformanceCounter(&mut count) == 0 { + unreachable!( + "QueryPerformanceCounter on Windows XP or later should never return zero!" + ); + } + *count.QuadPart() as u64 + }; + raw * self.factor + } +} + +impl Default for Monotonic { + fn default() -> Self { + let denom = unsafe { + // TODO: Can we do any better than the `mem::zeroed` call here? + let mut freq = mem::zeroed(); + if profileapi::QueryPerformanceFrequency(&mut freq) == 0 { + unreachable!( + "QueryPerformanceFrequency on Windows XP or later should never return zero!" + ); + } + *freq.QuadPart() as u64 + }; + + Self { + factor: 1_000_000_000 / denom, + } + } +} diff -Nru temporalio-1.3.0/vendor/quanta/src/counter.rs temporalio-1.3.0/vendor/quanta/src/counter.rs --- temporalio-1.3.0/vendor/quanta/src/counter.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/quanta/src/counter.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,55 +0,0 @@ -#[cfg(all(target_arch = "x86_64", target_feature = "sse2"))] -use core::arch::x86_64::{__rdtscp, _mm_lfence, _rdtsc}; - -#[derive(Debug, Clone, Default)] -pub struct Counter; - -impl Counter { - #[allow(dead_code)] - pub fn new() -> Self { - Counter {} - } -} - -#[cfg(all(target_arch = "x86_64", target_feature = "sse2"))] -impl Counter { - pub fn now(&self) -> u64 { - unsafe { - _mm_lfence(); - _rdtsc() - } - } - - pub fn start(&self) -> u64 { - unsafe { - _mm_lfence(); - let result = _rdtsc(); - _mm_lfence(); - result - } - } - - pub fn end(&self) -> u64 { - let mut _aux: u32 = 0; - unsafe { - let result = __rdtscp(&mut _aux as *mut _); - _mm_lfence(); - result - } - } -} - -#[cfg(not(all(target_arch = "x86_64", target_feature = "sse2")))] -impl Counter { - pub fn now(&self) -> u64 { - panic!("can't use counter without TSC support"); - } - - pub fn start(&self) -> u64 { - panic!("can't use counter without TSC support"); - } - - pub fn end(&self) -> u64 { - panic!("can't use counter without TSC support"); - } -} diff -Nru temporalio-1.3.0/vendor/quanta/src/instant.rs temporalio-1.3.0/vendor/quanta/src/instant.rs --- temporalio-1.3.0/vendor/quanta/src/instant.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/quanta/src/instant.rs 2023-10-30 19:40:00.000000000 +0000 @@ -5,11 +5,26 @@ /// A point-in-time wall-clock measurement. /// -/// Unlike the stdlib `Instant`, this type has a meaningful difference: it is intended to be opaque, -/// but the internal value _can_ be accessed. There are no guarantees here and depending on this -/// value directly is proceeding at your own risk. âš ï¸ +/// Mimics most of the functionality of [`std::time::Instant`] but provides an additional method for +/// using the "recent time" feature of `quanta`. /// -/// An `Instant` is 8 bytes. +/// ## Monotonicity +/// +/// On all platforms, `Instant` will try to use an OS API that guarantees monotonic behavior if +/// available, which is the case for all supported platforms. In practice such guarantees are – +/// under rare circumstances – broken by hardware, virtualization or operating system bugs. To work +/// around these bugs and platforms not offering monotonic clocks [`duration_since`], [`elapsed`] +/// and [`sub`] saturate to zero. In older `quanta` versions this lead to a panic instead. +/// [`checked_duration_since`] can be used to detect and handle situations where monotonicity is +/// violated, or `Instant`s are subtracted in the wrong order. +/// +/// This workaround obscures programming errors where earlier and later instants are accidentally +/// swapped. For this reason future `quanta` versions may reintroduce panics. +/// +/// [`duration_since`]: Instant::duration_since +/// [`elapsed`]: Instant::elapsed +/// [`sub`]: Instant::sub +/// [`checked_duration_since`]: Instant::checked_duration_since #[derive(Clone, Copy, PartialEq, Eq)] pub struct Instant(pub(crate) u64); @@ -19,8 +34,10 @@ /// This method depends on a lazily initialized global clock, which can take up to 200ms to /// initialize and calibrate itself. /// - /// This method is the spiritual equivalent of [`std::time::Instant::now`]. It is guaranteed to + /// This method is the spiritual equivalent of [`Instant::now`][instant_now]. It is guaranteed to /// return a monotonically increasing value. + /// + /// [instant_now]: std::time::Instant::now pub fn now() -> Instant { crate::get_now() } @@ -31,12 +48,15 @@ /// time. Instead of querying the underlying source clock directly, a shared, global value is /// read directly without the need to scale to reference time. /// - /// The value is updated by running an "upkeep" thread or by calling [`quanta::set_recent`]. An - /// upkeep thread can be configured and spawned via [`Builder`]. + /// The value is updated by running an "upkeep" thread or by calling [`set_recent`][set_recent]. An + /// upkeep thread can be configured and spawned via [`Upkeep`][upkeep]. /// /// If the upkeep thread has not been started, or no value has been set manually, a lazily /// initialized global clock will be used to get the current time. This clock can take up to /// 200ms to initialize and calibrate itself. + /// + /// [set_recent]: crate::set_recent + /// [upkeep]: crate::Upkeep pub fn recent() -> Instant { crate::get_recent() } @@ -45,7 +65,11 @@ /// /// # Panics /// - /// This function will panic if `earlier` is later than `self`. + /// Previous versions of this method panicked when earlier was later than `self`. Currently, + /// this method saturates to zero. Future versions may reintroduce the panic in some + /// circumstances. See [Monotonicity]. + /// + /// [Monotonicity]: Instant#monotonicity /// /// # Examples /// @@ -61,15 +85,17 @@ /// println!("{:?}", new_now.duration_since(now)); /// ``` pub fn duration_since(&self, earlier: Instant) -> Duration { - self.0 - .checked_sub(earlier.0) - .map(Duration::from_nanos) - .expect("supplied instant is later than self") + self.checked_duration_since(earlier).unwrap_or_default() } /// Returns the amount of time elapsed from another instant to this one, or `None` if that /// instant is earlier than this one. /// + /// Due to [monotonicity bugs], even under correct logical ordering of the passed `Instant`s, + /// this method can return `None`. + /// + /// [monotonicity bugs]: Instant#monotonicity + /// /// # Examples /// /// ```no_run @@ -91,6 +117,11 @@ /// Returns the amount of time elapsed from another instant to this one, or zero duration if /// that instant is earlier than this one. /// + /// Due to [monotonicity bugs], even under correct logical ordering of the passed `Instant`s, + /// this method can return `None`. + /// + /// [monotonicity bugs]: Instant#monotonicity + /// /// # Examples /// /// ```no_run @@ -106,8 +137,34 @@ /// println!("{:?}", now.saturating_duration_since(new_now)); // 0ns /// ``` pub fn saturating_duration_since(&self, earlier: Instant) -> Duration { - self.checked_duration_since(earlier) - .unwrap_or_else(|| Duration::new(0, 0)) + self.checked_duration_since(earlier).unwrap_or_default() + } + + /// Returns the amount of time elapsed since this instant was created. + /// + /// # Panics + /// + /// Previous `quanta` versions panicked when the current time was earlier than self. Currently + /// this method returns a Duration of zero in that case. Future versions may reintroduce the + /// panic. See [Monotonicity]. + /// + /// [Monotonicity]: Instant#monotonicity + /// + /// # Examples + /// + /// ```no_run + /// use quanta::Clock; + /// use std::time::Duration; + /// use std::thread::sleep; + /// + /// let mut clock = Clock::new(); + /// let now = clock.now(); + /// sleep(Duration::new(1, 0)); + /// let elapsed = now.elapsed(); + /// println!("{:?}", elapsed); // ≥ 1s + /// ``` + pub fn elapsed(&self) -> Duration { + Instant::now() - *self } /// Returns `Some(t)` where `t` is the time `self + duration` if `t` can be represented as @@ -123,11 +180,6 @@ pub fn checked_sub(&self, duration: Duration) -> Option { self.0.checked_sub(duration.as_nanos() as u64).map(Instant) } - - /// Gets the inner value of this `Instant`. - pub fn as_u64(&self) -> u64 { - self.0 - } } impl Add for Instant { @@ -169,6 +221,16 @@ impl Sub for Instant { type Output = Duration; + /// Returns the amount of time elapsed from another instant to this one, + /// or zero duration if that instant is later than this one. + /// + /// # Panics + /// + /// Previous `quanta` versions panicked when `other` was later than `self`. Currently this + /// method saturates. Future versions may reintroduce the panic in some circumstances. + /// See [Monotonicity]. + /// + /// [Monotonicity]: Instant#monotonicity fn sub(self, other: Instant) -> Duration { self.duration_since(other) } @@ -215,10 +277,14 @@ #[cfg(test)] mod tests { + use once_cell::sync::Lazy; + use super::Instant; use crate::{with_clock, Clock}; - use std::thread; use std::time::Duration; + use std::{sync::Mutex, thread}; + + static RECENT_LOCK: Lazy> = Lazy::new(|| Mutex::new(())); #[test] #[cfg_attr( @@ -226,12 +292,14 @@ ignore = "WASM thread cannot sleep" )] fn test_now() { + let _guard = RECENT_LOCK.lock().unwrap(); + let t0 = Instant::now(); thread::sleep(Duration::from_millis(15)); let t1 = Instant::now(); - assert!(t0.as_u64() > 0); - assert!(t1.as_u64() > 0); + assert!(t0.0 > 0); + assert!(t1.0 > 0); let result = t1 - t0; let threshold = Duration::from_millis(14); @@ -244,6 +312,8 @@ ignore = "WASM thread cannot sleep" )] fn test_recent() { + let _guard = RECENT_LOCK.lock().unwrap(); + // Ensures that the recent global value is zero so that the fallback logic can kick in. crate::set_recent(Instant(0)); @@ -251,12 +321,18 @@ thread::sleep(Duration::from_millis(15)); let t1 = Instant::recent(); - assert!(t0.as_u64() > 0); - assert!(t1.as_u64() > 0); + assert!(t0.0 > 0); + assert!(t1.0 > 0); let result = t1 - t0; let threshold = Duration::from_millis(14); - assert!(result > threshold); + assert!( + result > threshold, + "t1 should be greater than t0 by at least 14ms, was only {}ms (t0: {}, t1: {})", + result.as_millis(), + t0.0, + t1.0 + ); crate::set_recent(Instant(1)); let t2 = Instant::recent(); @@ -271,25 +347,30 @@ wasm_bindgen_test::wasm_bindgen_test )] fn test_mocking() { + let _guard = RECENT_LOCK.lock().unwrap(); + + // Ensures that the recent global value is zero so that the fallback logic can kick in. + crate::set_recent(Instant(0)); + let (clock, mock) = Clock::mock(); with_clock(&clock, move || { let t0 = Instant::now(); mock.increment(42); let t1 = Instant::now(); - assert_eq!(t0.as_u64(), 0); - assert_eq!(t1.as_u64(), 42); + assert_eq!(t0.0, 0); + assert_eq!(t1.0, 42); let t2 = Instant::recent(); mock.increment(420); let t3 = Instant::recent(); - assert_eq!(t2.as_u64(), 42); - assert_eq!(t3.as_u64(), 462); + assert_eq!(t2.0, 42); + assert_eq!(t3.0, 462); crate::set_recent(Instant(1440)); let t4 = Instant::recent(); - assert_eq!(t4.as_u64(), 1440); + assert_eq!(t4.0, 1440); }) } } diff -Nru temporalio-1.3.0/vendor/quanta/src/lib.rs temporalio-1.3.0/vendor/quanta/src/lib.rs --- temporalio-1.3.0/vendor/quanta/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/quanta/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -5,17 +5,18 @@ //! available, using the Time Stamp Counter feature found on modern CPUs. //! //! # Design +//! //! Internally, `quanta` maintains the concept of two potential clock sources: a reference clock and //! a source clock. //! //! The reference clock is provided by the OS, and always available. It is equivalent to what is -//! provided by the standard library in terms of the underlying system calls being made. As it -//! uses the native timing facilities provided by the operating system, we ultimately depend on the -//! OS itself to give us a stable and correct value. -//! -//! The source clock is a potential clock source based on the Time Stamp Counter feature found on -//! modern CPUs. If the TSC feature is not present or is not reliable enough, `quanta` will -//! transparently utilize the reference clock instead. +//! provided by the standard library in terms of the underlying system calls being made. As it uses +//! the native timing facilities provided by the operating system, we ultimately depend on the OS +//! itself to give us a stable and correct value. +//! +//! The source clock is a potential clock source based on the [Time Stamp Counter][tsc] feature +//! found on modern CPUs. If the TSC feature is not present or is not reliable enough, `quanta` +//! will transparently utilize the reference clock instead. //! //! Depending on the underlying processor(s) in the system, `quanta` will figure out the most //! accurate/efficient way to calibrate the source clock to the reference clock in order to provide @@ -24,45 +25,62 @@ //! Details on TSC support, and calibration, are detailed below. //! //! # Features -//! Beyond simply taking measurements of the current time, `quanta` provides features for more easily -//! working with clocks, as well as being able to enhance performance further: +//! +//! Beyond simply taking measurements of the current time, `quanta` provides features for more +//! easily working with clocks, as well as being able to enhance performance further: //! - `Clock` can be mocked for testing //! - globally accessible "recent" time with amortized overhead //! +//! ## Mocked time +//! //! For any code that uses a `Clock`, a mocked version can be substituted. This allows for //! application authors to control the time in tests, which allows simulating not only the normal //! passage of time but provides the ability to warp time forwards and backwards in order to test //! corner cases in logic, etc. Creating a mocked clock can be acheived with [`Clock::mock`], and //! [`Mock`] contains more details on mock usage. //! +//! ## Coarsely-updated, or recent, time +//! //! `quanta` also provides a "recent" time feature, which allows a slightly-delayed version of time //! to be provided to callers, trading accuracy for speed of access. An upkeep thread is spawned, //! which is responsible for taking measurements and updating the global recent time. Callers then -//! can access the cached value by calling `Clock::recent`. This interface can be 4-10x faster -//! than directly calling `Clock::now`, even when TSC support is available. As the upkeep thread -//! is the only code updating the recent time, the accuracy of the value given to callers is -//! limited by how often the upkeep thread updates the time, thus the trade off between accuracy -//! and speed of access. +//! can access the cached value by calling `Clock::recent`. This interface can be 4-10x faster than +//! directly calling `Clock::now`, even when TSC support is available. As the upkeep thread is the +//! only code updating the recent time, the accuracy of the value given to callers is limited by how +//! often the upkeep thread updates the time, thus the trade off between accuracy and speed of +//! access. //! //! # Feature Flags -//! `quanta` comes with feature flags that enable convenient conversions to time types in -//! other popular crates, such as: +//! +//! `quanta` comes with feature flags that enable convenient conversions to time types in other +//! popular crates, such as: //! - `prost` - provides an implementation into [`Timestamp`][prost_types_timestamp] from -//! `prost_types` +//! `prost_types` //! //! # Platform Support +//! //! At a high level, `quanta` carries support for most major operating systems out of the box: -//! - Windows ([QueryPerformanceCounter]) -//! - macOS/OS X/iOS ([mach_continuous_time]) -//! - Linux/*BSD/Solaris ([clock_gettime]) +//! - Windows ([`QueryPerformanceCounter`][QueryPerformanceCounter]) +//! - macOS/OS X/iOS ([`mach_absolute_time`][mach_absolute_time]) +//! - Linux/*BSD/Solaris ([`clock_gettime`][clock_gettime]) //! //! These platforms are supported in the "reference" clock sense, and support for using the Time //! Stamp Counter as a clocksource is more subtle, and explained below. //! -//! # Time Stamp Counter support -//! Accessing the TSC requires being on the x86_64 architecture, with access to SSE2. Additionally, -//! the processor must support either constant or nonstop/invariant TSC. This ensures that the TSC -//! ticks at a constant rate which can be easily scaled. +//! ## WASM support +//! +//! This library can be built for WASM targets, but in this case the resolution and accuracy of +//! measurements can be limited by the WASM environment. In particular, when running on the +//! `wasm32-unknown-unknown` target in browsers, `quanta` will use [windows.performance.now] as a +//! clock. This mean the accuracy is limited to milliseconds instead of the usual nanoseconds on +//! other targets. When running within a WASI environment (target `wasm32-wasi`), the accuracy of +//! the clock depends on the VM implementation. +//! +//! # TSC Support +//! +//! Accessing the TSC requires being on the `x86_64` architecture, with access to SSE2. +//! Additionally, the processor must support either constant or nonstop/invariant TSC. This ensures +//! that the TSC ticks at a constant rate which can be easily scaled. //! //! A caveat is that "constant" TSC doesn't account for all possible power states (levels of power //! down or sleep that a CPU can enter to save power under light load, etc) and so a constant TSC @@ -73,68 +91,63 @@ //! recalibration. Nonstop/invariant TSC does not have this limitation and is stable over long //! periods of time. //! -//! Roughly speaking, the following list contains the beginning model/generation of processors -//! where you should be able to expect having invariant TSC support: +//! Roughly speaking, the following list contains the beginning model/generation of processors where +//! you should be able to expect having invariant TSC support: //! - Intel Nehalem and newer for server-grade //! - Intel Skylake and newer for desktop-grade //! - VIA Centaur Nano and newer (circumstantial evidence here) //! - AMD Phenom and newer //! -//! Ultimately, `quanta` will query CPUID information to determine if the processor has the -//! required features to use the TSC. +//! Ultimately, `quanta` will query CPUID information to determine if the processor has the required +//! features to use the TSC. //! //! # Calibration +//! //! As the TSC doesn't necessarily tick at reference scale -- i.e. one tick isn't always one //! nanosecond -- we have to apply a scaling factor when converting from source to reference time -//! scale. We acquire this scaling factor by querying the processor or calibrating our source -//! clock to the reference clock. -//! -//! In some cases, on newer processors, the frequency of the TSC can be queried directly, providing -//! a fixed scaling factor with no further calibration necessary. In other cases, `quanta` will -//! have to run its own calibration before the clock is ready to be used: repeatedly taking -//! measurements from both the reference and source clocks until a stable scaling factor has been -//! established. +//! scale to provide this. We acquire this scaling factor by repeatedly taking measurements from +//! both the reference and source clocks, until we have a statistically-relevant measure of the +//! average scaling factor. We do some additional work to convert this scaling factor into a +//! power-of-two number that allows us to optimize the code, and thus reduce the generated +//! instructions required to scale a TSC value. //! //! This calibration is stored globally and reused. However, the first `Clock` that is created in -//! an application will block for a small period of time as it runs this calibration loop. The -//! time spent in the calibration loop is limited to 200ms overall. In practice, `quanta` will -//! reach a stable calibration quickly (usually 10-20ms, if not less) and so this deadline is -//! unlikely to be reached. +//! an application will block for a small period of time as it runs this calibration loop. The time +//! spent in the calibration loop is limited to 200ms overall. In practice, `quanta` will reach a +//! stable calibration quickly (usually 10-20ms, if not less) and so this deadline is unlikely to be +//! reached. //! //! # Caveats +//! //! Utilizing the TSC can be a tricky affair, and so here is a list of caveats that may or may not //! apply, and is in no way exhaustive: //! - CPU hotplug behavior is undefined //! - raw values may time warp //! - measurements from the TSC may drift past or behind the comparable reference clock //! -//! # WASM support -//! -//! This library can be built for WASM targets, but in this case the resolution -//! and accuracy of measurements can be limited by the WASM environment. In -//! particular, when running on the `wasm32-unknown-unknown` target in browsers, -//! `quanta` will use [windows.performance.now] as a clock. This mean the -//! accuracy is limited to milliseconds instead of the usual nanoseconds on -//! other targets. When running within a WASI environment (target -//! `wasm32-wasi`), the accuracy of the clock depends on the VM implementation. +//! Another important caveat is that `quanta` does not track time across system suspends. Simply +//! put, if a time measurement (such as using [`Instant::now`][crate::Instant::now]) is taken, and +//! then the system is suspended, and then another measurement is taken, the difference between +//! those the two would not include the time the system was in suspend. //! +//! [tsc]: https://en.wikipedia.org/wiki/Time_Stamp_Counter //! [QueryPerformanceCounter]: https://msdn.microsoft.com/en-us/library/ms644904(v=VS.85).aspx -//! [mach_continuous_time]: https://developer.apple.com/documentation/kernel/1646199-mach_continuous_time +//! [mach_absolute_time]: https://developer.apple.com/documentation/kernel/1462446-mach_absolute_time //! [clock_gettime]: https://linux.die.net/man/3/clock_gettime //! [prost_types_timestamp]: https://docs.rs/prost-types/0.7.0/prost_types/struct.Timestamp.html //! [windows.performance.now]: https://developer.mozilla.org/en-US/docs/Web/API/Performance/now +#![deny(missing_docs)] +#![deny(clippy::all)] +#![allow(clippy::must_use_candidate)] + use crossbeam_utils::atomic::AtomicCell; use std::time::Duration; use std::{cell::RefCell, sync::Arc}; use once_cell::sync::OnceCell; -#[cfg(any(target_arch = "x86", target_arch = "x86_64"))] -use raw_cpuid::CpuId; -mod monotonic; -use self::monotonic::Monotonic; -mod counter; -use self::counter::Counter; +mod clocks; +use self::clocks::{Counter, Monotonic}; mod mock; pub use self::mock::{IntoNanoseconds, Mock}; mod instant; @@ -144,12 +157,16 @@ mod stats; use self::stats::Variance; +// Global clock, used by `Instant::now`. static GLOBAL_CLOCK: OnceCell = OnceCell::new(); +// Global recent measurement, used by `Clock::recent` and `Instant::recent`. static GLOBAL_RECENT: AtomicCell = AtomicCell::new(0); +// Global calibration, shared by all clocks. static GLOBAL_CALIBRATION: OnceCell = OnceCell::new(); +// Per-thread clock override, used by `quanta::with_clock`, `Instant::now`, and sometimes `Instant::recent`. thread_local! { static CLOCK_OVERRIDE: RefCell> = RefCell::new(None); } @@ -161,13 +178,12 @@ const MAXIMUM_CAL_ERROR_NS: u64 = 10; // Don't run the calibration loop for longer than 200ms of wall time. -const MAXIMUM_CAL_TIME: Duration = Duration::from_millis(200); +const MAXIMUM_CAL_TIME_NS: u64 = 200 * 1000 * 1000; -#[allow(dead_code)] #[derive(Debug)] enum ClockType { Monotonic(Monotonic), - Counter(AtomicCell, Monotonic, Counter, Calibration), + Counter(Monotonic, Counter, Calibration), Mock(Arc), } @@ -180,7 +196,7 @@ } impl Calibration { - pub fn new() -> Calibration { + fn new() -> Calibration { Calibration { ref_time: 0, src_time: 0, @@ -189,22 +205,24 @@ } } + fn reset_timebases(&mut self, reference: Monotonic, source: &Counter) { + self.ref_time = reference.now(); + self.src_time = source.now(); + } + fn scale_src_to_ref(&self, src_raw: u64) -> u64 { let delta = src_raw.saturating_sub(self.src_time); let scaled = mul_div_po2_u64(delta, self.scale_factor, self.scale_shift); scaled + self.ref_time } - fn calibrate(&mut self, reference: &Monotonic, source: &Counter) { - // future improvement: read the TSC frequency directly with something like the - // code in this PR: https://github.com/hermitcore/uhyve/pull/24 - + fn calibrate(&mut self, reference: Monotonic, source: &Counter) { let mut variance = Variance::default(); - let deadline = reference.now() + MAXIMUM_CAL_TIME.as_nanos() as u64; + let deadline = reference.now() + MAXIMUM_CAL_TIME_NS; - self.ref_time = reference.now(); - self.src_time = source.now(); + self.reset_timebases(reference, source); + // Each busy loop should spin for 1 microsecond. (1000 nanoseconds) let loop_delta = 1000; loop { // Busy loop to burn some time. @@ -239,7 +257,7 @@ let samples = variance.samples(); if samples > MINIMUM_CAL_ROUNDS - && mwe < MAXIMUM_CAL_ERROR_NS + && mwe < MAXIMUM_CAL_ERROR_NS as f64 && mean_error / mean <= 1.0 { break; @@ -248,7 +266,7 @@ } } - fn adjust_cal_ratio(&mut self, reference: &Monotonic, source: &Counter) { + fn adjust_cal_ratio(&mut self, reference: Monotonic, source: &Counter) { // Overall algorithm: measure the delta between our ref/src_time values and "now" versions // of them, calculate the ratio between the deltas, and then find a numerator and // denominator to express that ratio such that the denominator is always a power of two. @@ -261,18 +279,14 @@ // Then, conversion from a raw value simply becomes a multiply and a bit shift instead of a // multiply and full-blown divide. let ref_end = reference.now(); - let src_end = source.end(); + let src_end = source.now(); let ref_d = ref_end.wrapping_sub(self.ref_time); let src_d = src_end.wrapping_sub(self.src_time); - // TODO: we should almost never get a zero here because that would mean denom was greater - // than 2^63 which is already a red flag.. but i'm not 100% sure if we can prove it well - // enough to simply keep the panic around? gotta think on this - let src_d_po2 = src_d.next_power_of_two(); - if src_d_po2 == 0 { - panic!("po2_denom was zero!"); - } + let src_d_po2 = src_d + .checked_next_power_of_two() + .unwrap_or_else(|| 2_u64.pow(63)); // TODO: lossy conversion back and forth just to get an approximate value, can we do better // with integer math? not sure @@ -299,15 +313,15 @@ /// /// Support for TSC, etc, are checked at the time of creation, not compile-time. pub fn new() -> Clock { - let reference = Monotonic::new(); + let reference = Monotonic::default(); let inner = if has_tsc_support() { - let source = Counter::new(); + let source = Counter::default(); let calibration = GLOBAL_CALIBRATION.get_or_init(|| { let mut calibration = Calibration::new(); - calibration.calibrate(&reference, &source); + calibration.calibrate(reference, &source); calibration }); - ClockType::Counter(AtomicCell::new(0), reference, source, *calibration) + ClockType::Counter(reference, source, *calibration) } else { ClockType::Monotonic(reference) }; @@ -337,17 +351,7 @@ pub fn now(&self) -> Instant { match &self.inner { ClockType::Monotonic(monotonic) => Instant(monotonic.now()), - ClockType::Counter(last, _, counter, _) => { - let now = counter.now(); - // Update the last timestamp with `now`, if `now` is greater - // than the current value. - // TODO: replace with `AtomicCell::fetch_max` once `crossbeam-utils` implements it. - let last = last.fetch_update(|current| Some(current.max(now))).unwrap(); - // `fetch_max` always returns the previous value, so we need to - // see which is *actually* the max. - let actual = std::cmp::max(now, last); - self.scaled(actual) - } + ClockType::Counter(_, counter, _) => self.scaled(counter.now()), ClockType::Mock(mock) => Instant(mock.value()), } } @@ -358,54 +362,12 @@ /// or to be monotonic. Value can be scaled to reference time by calling either [`scaled`] /// or [`delta`]. /// - /// If you need maximum accuracy in your measurements, consider using [`start`] and [`end`]. - /// /// [`scaled`]: Clock::scaled /// [`delta`]: Clock::delta - /// [`start`]: Clock::start - /// [`end`]: Clock::end pub fn raw(&self) -> u64 { match &self.inner { ClockType::Monotonic(monotonic) => monotonic.now(), - ClockType::Counter(_, _, counter, _) => counter.now(), - ClockType::Mock(mock) => mock.value(), - } - } - - /// Gets the underlying time from the source clock, specific to starting an operation. - /// - /// Value is not guaranteed to be in nanoseconds. - /// - /// Provides the same functionality as [`raw`], but tries to ensure that no extra CPU - /// instructions end up executing after the measurement is taken. Since normal processors are - /// typically out-of-order, other operations that logically come before a call to this method - /// could be reordered to come after the measurement, thereby skewing the overall time - /// measured. - /// - /// [`raw`]: Clock::raw - pub fn start(&self) -> u64 { - match &self.inner { - ClockType::Monotonic(monotonic) => monotonic.now(), - ClockType::Counter(_, _, counter, _) => counter.start(), - ClockType::Mock(mock) => mock.value(), - } - } - - /// Gets the underlying time from the source clock, specific to ending an operation. - /// - /// Value is not guaranteed to be in nanoseconds. - /// - /// Provides the same functionality as [`raw`], but tries to ensure that no extra CPU - /// instructions end up executing before the measurement is taken. Since normal processors are - /// typically out-of-order, other operations that logically come after a call to this method - /// could be reordered to come before the measurement, thereby skewing the overall time - /// measured. - /// - /// [`raw`]: Clock::raw - pub fn end(&self) -> u64 { - match &self.inner { - ClockType::Monotonic(monotonic) => monotonic.now(), - ClockType::Counter(_, _, counter, _) => counter.end(), + ClockType::Counter(_, counter, _) => counter.now(), ClockType::Mock(mock) => mock.value(), } } @@ -419,36 +381,53 @@ /// Returns an [`Instant`]. pub fn scaled(&self, value: u64) -> Instant { let scaled = match &self.inner { - ClockType::Counter(_, _, _, calibration) => scale_src_to_ref(value, calibration), + ClockType::Counter(_, _, calibration) => calibration.scale_src_to_ref(value), _ => value, }; Instant(scaled) } - /// Calculates the delta between two measurements, and scales to reference time. + /// Calculates the delta, in nanoseconds, between two raw measurements. /// - /// This method is slightly faster when you know you need the delta between two raw - /// measurements, or a start/end measurement, than using [`scaled`] for both conversions. + /// This method is very similar to [`delta`] but reduces overhead + /// for high-frequency measurements that work with nanosecond + /// counts internally, as it avoids the conversion of the delta + /// into [`Duration`]. /// - /// [`scaled`]: Clock::scaled - pub fn delta(&self, start: u64, end: u64) -> Duration { + /// [`delta`]: Clock::delta + pub fn delta_as_nanos(&self, start: u64, end: u64) -> u64 { // Safety: we want wrapping_sub on the end/start delta calculation so that two measurements // split across a rollover boundary still return the right result. However, we also know // the TSC could potentially give us different values between cores/sockets, so we're just // doing our due diligence here to make sure we're not about to create some wacky duration. if end <= start { - return Duration::new(0, 0); + return 0; } let delta = end.wrapping_sub(start); - let scaled = match &self.inner { - ClockType::Counter(_, _, _, calibration) => { + match &self.inner { + ClockType::Counter(_, _, calibration) => { mul_div_po2_u64(delta, calibration.scale_factor, calibration.scale_shift) } _ => delta, - }; - Duration::from_nanos(scaled) + } + } + + /// Calculates the delta between two raw measurements. + /// + /// This method is slightly faster when you know you need the delta between two raw + /// measurements, or a start/end measurement, than using [`scaled`] for both conversions. + /// + /// In code that simply needs access to the whole number of nanoseconds + /// between the two measurements, consider [`Clock::delta_as_nanos`] + /// instead, which is slightly faster than having to call both this method + /// and [`Duration::as_nanos`]. + /// + /// [`scaled`]: Clock::scaled + /// [`delta_as_nanos`]: Clock::delta_as_nanos + pub fn delta(&self, start: u64, end: u64) -> Duration { + Duration::from_nanos(self.delta_as_nanos(start, end)) } /// Gets the most recent current time, scaled to reference time. @@ -458,12 +437,14 @@ /// read directly without the need to scale to reference time. /// /// The upkeep thread must be started in order to update the time. You can read the - /// documentation for [`Builder`] for more information on starting the upkeep thread, as well - /// as the details of the "current time" mechanism. + /// documentation for [`Upkeep`][upkeep] for more information on starting the upkeep thread, as + /// well as the details of the "current time" mechanism. /// /// If the upkeep thread has not been started, the return value will be `0`. /// /// Returns an [`Instant`]. + /// + /// [upkeep]: crate::Upkeep pub fn recent(&self) -> Instant { match &self.inner { ClockType::Mock(mock) => Instant(mock.value()), @@ -471,12 +452,15 @@ } } - /// Updates the recent current time. - /// - /// Most callers should use the existing [`Builder`] machinery for spawning a background thread - /// to handle upkeep, rather than calling [`upkeep`] directly. - pub fn upkeep(value: Instant) { - GLOBAL_RECENT.store(value.0); + #[cfg(test)] + fn reset_timebase(&mut self) -> bool { + match &mut self.inner { + ClockType::Counter(reference, source, calibration) => { + calibration.reset_timebases(*reference, source); + true + } + _ => false, + } } } @@ -491,13 +475,10 @@ fn clone(&self) -> Self { match self { ClockType::Mock(mock) => ClockType::Mock(mock.clone()), - ClockType::Monotonic(monotonic) => ClockType::Monotonic(monotonic.clone()), - ClockType::Counter(last, monotonic, counter, calibration) => ClockType::Counter( - AtomicCell::new(last.load()), - monotonic.clone(), - counter.clone(), - *calibration, - ), + ClockType::Monotonic(monotonic) => ClockType::Monotonic(*monotonic), + ClockType::Counter(monotonic, counter, calibration) => { + ClockType::Counter(*monotonic, counter.clone(), *calibration) + } } } } @@ -509,7 +490,7 @@ CLOCK_OVERRIDE.with(|current| { let old = current.replace(Some(clock.clone())); let result = f(); - let _ = current.replace(old); + current.replace(old); result }) } @@ -521,12 +502,12 @@ /// recent time is updated. For example, programs using an asynchronous runtime may prefer to /// schedule a task that does the updating, avoiding an extra thread. pub fn set_recent(instant: Instant) { - GLOBAL_RECENT.store(instant.as_u64()); + GLOBAL_RECENT.store(instant.0); } #[inline] pub(crate) fn get_now() -> Instant { - if let Some(instant) = CLOCK_OVERRIDE.with(|clock| clock.borrow().as_ref().map(|c| c.now())) { + if let Some(instant) = CLOCK_OVERRIDE.with(|clock| clock.borrow().as_ref().map(Clock::now)) { instant } else { GLOBAL_CLOCK.get_or_init(Clock::new).now() @@ -542,26 +523,19 @@ // Given that global recent time shouldn't ever be getting _actually_ updated in tests, this // should be a reasonable trade-off. let recent = GLOBAL_RECENT.load(); - if recent != 0 { - Instant(recent) - } else { + if recent == 0 { get_now() + } else { + Instant(recent) } } #[inline] -fn scale_src_to_ref(src_raw: u64, cal: &Calibration) -> u64 { - let delta = src_raw.saturating_sub(cal.src_time); - let scaled = mul_div_po2_u64(delta, cal.scale_factor, cal.scale_shift); - scaled + cal.ref_time -} - -#[inline] fn mul_div_po2_u64(value: u64, numer: u64, denom: u32) -> u64 { // Modified muldiv routine where the denominator has to be a power of two. `denom` is expected // to be the number of bits to shift, not the actual decimal value. - let mut v: u128 = value as u128; - v *= numer as u128; + let mut v = u128::from(value); + v *= u128::from(numer); v >>= denom; v as u64 } @@ -569,7 +543,15 @@ #[allow(dead_code)] #[cfg(all(target_arch = "x86_64", target_feature = "sse2"))] fn has_tsc_support() -> bool { - read_cpuid_nonstop_tsc() && read_cpuid_rdtscp_support() + let cpuid = raw_cpuid::CpuId::new(); + let has_invariant_tsc = cpuid + .get_advanced_power_mgmt_info() + .map_or(false, |apm| apm.has_invariant_tsc()); + let has_rdtscp = cpuid + .get_extended_processor_and_feature_identifiers() + .map_or(false, |epf| epf.has_rdtscp()); + + has_invariant_tsc && has_rdtscp } #[allow(dead_code)] @@ -578,31 +560,15 @@ false } -#[cfg(any(target_arch = "x86", target_arch = "x86_64"))] -fn read_cpuid_nonstop_tsc() -> bool { - let cpuid = CpuId::new(); - cpuid - .get_advanced_power_mgmt_info() - .map_or(false, |efi| efi.has_invariant_tsc()) -} - -#[cfg(any(target_arch = "x86", target_arch = "x86_64"))] -fn read_cpuid_rdtscp_support() -> bool { - let cpuid = CpuId::new(); - cpuid - .get_extended_processor_and_feature_identifiers() - .map_or(false, |efi| efi.has_rdtscp()) -} - #[cfg(test)] pub mod tests { - use super::{Clock, Monotonic}; + use super::{Clock, Counter, Monotonic}; use average::{Merge, Variance}; + use std::time::{Duration, Instant}; #[cfg(all(target_arch = "wasm32", target_os = "unknown"))] mod configure_wasm_tests { - // until https://github.com/rustwasm/wasm-bindgen/issues/2571 is resolved - // these tests will only run in browsers + // Until https://github.com/rustwasm/wasm-bindgen/issues/2571 is resolved, these tests will only run in browsers. wasm_bindgen_test::wasm_bindgen_test_configure!(run_in_browser); } @@ -613,9 +579,9 @@ )] fn test_mock() { let (clock, mock) = Clock::mock(); - assert_eq!(clock.now().as_u64(), 0); + assert_eq!(clock.now().0, 0); mock.increment(42); - assert_eq!(clock.now().as_u64(), 42); + assert_eq!(clock.now().0, 42); } #[test] @@ -625,7 +591,7 @@ )] fn test_now() { let clock = Clock::new(); - assert!(clock.now().as_u64() > 0); + assert!(clock.now().0 > 0); } #[test] @@ -643,31 +609,11 @@ all(target_arch = "wasm32", target_os = "unknown"), wasm_bindgen_test::wasm_bindgen_test )] - fn test_start() { - let clock = Clock::new(); - assert!(clock.start() > 0); - } - - #[test] - #[cfg_attr( - all(target_arch = "wasm32", target_os = "unknown"), - wasm_bindgen_test::wasm_bindgen_test - )] - fn test_end() { - let clock = Clock::new(); - assert!(clock.end() > 0); - } - - #[test] - #[cfg_attr( - all(target_arch = "wasm32", target_os = "unknown"), - wasm_bindgen_test::wasm_bindgen_test - )] fn test_scaled() { let clock = Clock::new(); let raw = clock.raw(); let scaled = clock.scaled(raw); - assert!(scaled.as_u64() > 0); + assert!(scaled.0 > 0); } #[test] @@ -676,9 +622,10 @@ all(target_arch = "wasm32", target_os = "unknown"), wasm_bindgen_test::wasm_bindgen_test )] + fn test_reference_source_calibration() { - let clock = Clock::new(); - let reference = Monotonic::new(); + let mut clock = Clock::new(); + let reference = Monotonic::default(); let loops = 10000; @@ -687,50 +634,58 @@ let mut ref_samples = [0u64; 1024]; for _ in 0..loops { + // We have to reset the "timebase" of the clock/calibration when testing in this way. + // + // Since `quanta` is designed around mimicing `Instant`, we care about measuring the _passage_ of time, but + // not matching our calculation of wall-clock time to the system's calculation of wall-clock time, in terms + // of their absolute values. + // + // As the system adjusts its clocks over time, whether due to NTP skew, or delays in updating the derived monotonic + // time, and so on, our original measurement base from the reference source -- which we use to anchor how we + // convert our scaled source measurement into the same reference timebase -- can skew further away from the + // current reference time in terms of the rate at which it ticks forward. + // + // Essentially, what we're saying here is that we want to test the scaling ratio that we generated in + // calibration, but not necessarily that the resulting value -- which is meant to be in the same timebase as + // the reference -- is locked to the reference itself. For example, if the reference is in nanoseconds, we + // want our source to be scaled to nanoseconds, too. We don't care if the system shoves the reference back + // and forth via NTP skew, etc... we just need to do enough source-to-reference calibration loops to figure + // out what the right amount is to scale the TSC -- since we require an invariant/nonstop TSC -- to get it + // to nanoseconds. + // + // At the risk of saying _too much_, while the delta between `Clock::now` and `Monotonic::now` may grow over + // time if the timebases are not reset, we can readily observe in this test that the delta between the + // first/last measurement loop for both source/reference are independently close i.e. the ratio by which we + // scale the source measurements gets it close, and stays close, to the reference measurements in terms of + // the _passage_ of time. + clock.reset_timebase(); + for i in 0..1024 { - src_samples[i] = clock.now().as_u64(); + src_samples[i] = clock.now().0; ref_samples[i] = reference.now(); } - let mut last = None; - let is_src_monotonic = src_samples.iter().all(|n| match last { - None => { - last = Some(n); - true - } - Some(on) => { - if n >= on { - last = Some(n); - true - } else { - false - } - } - }); - assert!(is_src_monotonic); + let is_src_monotonic = src_samples + .iter() + .map(Some) + .reduce(|last, current| last.and_then(|lv| current.filter(|cv| *cv >= lv))) + .flatten() + .copied(); + assert_eq!(is_src_monotonic, Some(src_samples[1023])); - let mut last = None; - let is_ref_monotonic = ref_samples.iter().all(|n| match last { - None => { - last = Some(n); - true - } - Some(on) => { - if n >= on { - last = Some(n); - true - } else { - false - } - } - }); - assert!(is_ref_monotonic); + let is_ref_monotonic = ref_samples + .iter() + .map(Some) + .reduce(|last, current| last.and_then(|lv| current.filter(|cv| *cv >= lv))) + .flatten() + .copied(); + assert_eq!(is_ref_monotonic, Some(ref_samples[1023])); let local = src_samples .iter() .zip(ref_samples.iter()) - .map(|(s, r)| (*s as f64, *r as f64)) - .map(|(s, r)| (r - s).abs()) + .map(|(s, r)| *s as f64 - *r as f64) + .map(|f| f.abs()) .collect::(); overall.merge(&local); @@ -754,38 +709,45 @@ all(target_arch = "wasm32", target_os = "unknown"), wasm_bindgen_test::wasm_bindgen_test )] - fn test_reference_self_calibration() { - let reference = Monotonic::new(); + fn measure_source_reference_self_timing() { + let source = Counter::default(); + let reference = Monotonic::default(); let loops = 10000; - let samples = 1024; - let mut overall = Variance::new(); - let mut deltas = Vec::with_capacity(samples); - deltas.reserve(samples); + let mut src_deltas = Vec::new(); + let mut src_samples = [0u64; 100]; for _ in 0..loops { - deltas.clear(); - for _ in 0..samples { - let rstart = reference.now(); - let rend = reference.now(); + let start = Instant::now(); + for i in 0..100 { + src_samples[i] = source.now(); + } - deltas.push(rend - rstart); + src_deltas.push(start.elapsed().as_secs_f64()); + } + + let mut ref_deltas = Vec::new(); + let mut ref_samples = [0u64; 100]; + + for _ in 0..loops { + let start = Instant::now(); + for i in 0..100 { + ref_samples[i] = reference.now(); } - let local = deltas.iter().map(|i| *i as f64).collect::(); - overall.merge(&local); + ref_deltas.push(start.elapsed().as_secs_f64()); } + let src_variance = src_deltas.into_iter().collect::(); + let ref_variance = ref_deltas.into_iter().collect::(); + + let src_variance_ns = Duration::from_secs_f64(src_variance.mean() / 100.0); + let ref_variance_ns = Duration::from_secs_f64(ref_variance.mean() / 100.0); + println!( - "reference/reference inter-call delta: mean={} error={} mean-var={}", - overall.mean(), - overall.error(), - overall.variance_of_mean() + "source call average: {:?}, reference call average: {:?}", + src_variance_ns, ref_variance_ns ); - - // We should be able to call the reference clock, back-to-back, within 2000 nanoseconds. If - // it's slower than that, something is probably amiss on the system the test is running under. - assert!(overall.mean() < 2000.0); } } diff -Nru temporalio-1.3.0/vendor/quanta/src/mock.rs temporalio-1.3.0/vendor/quanta/src/mock.rs --- temporalio-1.3.0/vendor/quanta/src/mock.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/quanta/src/mock.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,4 +1,3 @@ -#![allow(dead_code)] use crossbeam_utils::atomic::AtomicCell; use std::{sync::Arc, time::Duration}; @@ -7,6 +6,7 @@ /// This allows users of [`Mock`] to increment/decrement the time both with raw /// integer values and the more convenient [`Duration`] type. pub trait IntoNanoseconds { + /// Consumes this value, converting it to a nanosecond representation. fn into_nanos(self) -> u64; } @@ -48,7 +48,7 @@ let amount = amount.into_nanos(); self.offset .fetch_update(|current| Some(current + amount)) - .unwrap(); + .expect("should never return an error"); } /// Decrements the time by the given amount. @@ -56,7 +56,7 @@ let amount = amount.into_nanos(); self.offset .fetch_update(|current| Some(current - amount)) - .unwrap(); + .expect("should never return an error"); } /// Gets the current value of this `Mock`. diff -Nru temporalio-1.3.0/vendor/quanta/src/monotonic.rs temporalio-1.3.0/vendor/quanta/src/monotonic.rs --- temporalio-1.3.0/vendor/quanta/src/monotonic.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/quanta/src/monotonic.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,130 +0,0 @@ -#[cfg(any(target_os = "macos", target_os = "ios"))] -use mach::mach_time::{mach_continuous_time, mach_timebase_info}; - -#[derive(Debug, Clone)] -pub struct Monotonic { - factor: u64, -} - -#[cfg(all( - not(target_os = "macos"), - not(target_os = "ios"), - not(target_os = "windows") -))] -impl Monotonic { - pub fn new() -> Monotonic { - Monotonic { factor: 0 } - } -} - -#[cfg(all( - not(target_os = "macos"), - not(target_os = "ios"), - not(target_os = "windows"), - not(target_arch = "wasm32") -))] -impl Monotonic { - pub fn now(&self) -> u64 { - let mut ts = libc::timespec { - tv_sec: 0, - tv_nsec: 0, - }; - unsafe { - libc::clock_gettime(libc::CLOCK_MONOTONIC, &mut ts); - } - (ts.tv_sec as u64) * 1_000_000_000 + (ts.tv_nsec as u64) - } -} - -#[cfg(target_os = "windows")] -impl Monotonic { - pub fn new() -> Monotonic { - use std::mem; - use winapi::um::profileapi; - - let denom = unsafe { - let mut freq = mem::zeroed(); - if profileapi::QueryPerformanceFrequency(&mut freq) == 0 { - unreachable!( - "QueryPerformanceFrequency on Windows XP or later should never return zero!" - ); - } - *freq.QuadPart() as u64 - }; - - Monotonic { - factor: 1_000_000_000 / denom, - } - } -} - -#[cfg(target_os = "windows")] -impl Monotonic { - pub fn now(&self) -> u64 { - use std::mem; - use winapi::um::profileapi; - - let raw = unsafe { - let mut count = mem::zeroed(); - if profileapi::QueryPerformanceCounter(&mut count) == 0 { - unreachable!( - "QueryPerformanceCounter on Windows XP or later should never return zero!" - ); - } - *count.QuadPart() as u64 - }; - raw * self.factor - } -} - -#[cfg(all(target_arch = "wasm32", target_os = "unknown"))] -impl Monotonic { - pub fn now(&self) -> u64 { - let now = web_sys::window() - .expect( - "failed to find the global Window object, the \ - wasm32-unknown-unknown implementation only support \ - running in web browsers. Use wasm32-wasi to run \ - elsewhere", - ) - .performance() - .expect("window.performance is not available") - .now(); - // window.performance.now returns the time in milliseconds - return f64::trunc(now * 1000.0) as u64; - } -} - -#[cfg(all(target_arch = "wasm32", target_os = "wasi"))] -impl Monotonic { - pub fn now(&self) -> u64 { - unsafe { wasi::clock_time_get(wasi::CLOCKID_MONOTONIC, 1).expect("failed to get time") } - } -} - -#[cfg(any(target_os = "macos", target_os = "ios"))] -impl Monotonic { - pub fn new() -> Monotonic { - let mut info = mach_timebase_info { numer: 0, denom: 0 }; - unsafe { - mach_timebase_info(&mut info); - } - - let factor = u64::from(info.numer) / u64::from(info.denom); - Monotonic { factor } - } -} - -#[cfg(any(target_os = "macos", target_os = "ios"))] -impl Monotonic { - pub fn now(&self) -> u64 { - let raw = unsafe { mach_continuous_time() }; - raw * self.factor - } -} - -impl Default for Monotonic { - fn default() -> Self { - Self::new() - } -} diff -Nru temporalio-1.3.0/vendor/quanta/src/stats.rs temporalio-1.3.0/vendor/quanta/src/stats.rs --- temporalio-1.3.0/vendor/quanta/src/stats.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/quanta/src/stats.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,18 +1,18 @@ /// Estimates the arithmetic mean (and the error) for a set of samples. /// -/// This type is written and maintained internally as it is trivial to implement and doesn't -/// warrant a separate dependency. As well, we add some features like exposing the sample count, +/// This type is written and maintained internally as it is trivial to implement and doesn't warrant +/// a separate dependency. As well, we add some features like exposing the sample count, /// calculating the mean + error value, etc, that existing crates don't do. /// -/// Based on Welford's algorithm: computes the mean incrementally, with constant time and -/// space complexity. +/// Based on [Welford's algorithm][welfords] which computes the mean incrementally, with constant +/// time and space complexity. /// -/// https://en.wikipedia.org/wiki/Algorithms_for_calculating_variance#Welford's_online_algorithm +/// [welfords]: https://en.wikipedia.org/wiki/Algorithms_for_calculating_variance#Welford%27s_online_algorithm #[derive(Default)] pub(crate) struct Variance { mean: f64, + mean2: f64, n: u64, - sum_sq: f64, } impl Variance { @@ -20,9 +20,9 @@ pub fn add(&mut self, sample: f64) { self.n += 1; let n_f = self.n as f64; - let delta = (sample - self.mean) / self.n as f64; - self.mean += delta; - self.sum_sq += delta * delta * n_f * (n_f - 1.0); + let delta_sq = (sample - self.mean).powi(2); + self.mean2 += ((n_f - 1.0) * delta_sq) / n_f; + self.mean += (sample - self.mean) / n_f; } #[inline] @@ -37,14 +37,14 @@ } let n_f = self.n as f64; - ((self.sum_sq / (n_f - 1.0)) / n_f).sqrt() + let sd = (self.mean2 / (n_f - 1.0)).sqrt(); + sd / n_f.sqrt() } #[inline] - pub fn mean_with_error(&self) -> u64 { + pub fn mean_with_error(&self) -> f64 { let mean = self.mean.abs(); - let total = mean + self.mean_error().abs(); - total as u64 + mean + self.mean_error().abs() } #[inline] @@ -57,3 +57,22 @@ self.n } } + +#[cfg(test)] +mod tests { + use super::Variance; + + #[test] + fn basic() { + let inputs = &[5.0, 10.0, 12.0, 15.0, 20.0]; + let mut variance = Variance::default(); + for input in inputs { + variance.add(*input); + } + + assert_eq!(variance.mean(), 12.4); + + let expected_mean_error = 2.5019; + assert!((variance.mean_error() - expected_mean_error).abs() < 0.001); + } +} diff -Nru temporalio-1.3.0/vendor/quanta/src/upkeep.rs temporalio-1.3.0/vendor/quanta/src/upkeep.rs --- temporalio-1.3.0/vendor/quanta/src/upkeep.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/quanta/src/upkeep.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,4 +1,4 @@ -use crate::Clock; +use crate::{set_recent, Clock}; use std::{ fmt, io, sync::{ @@ -77,6 +77,15 @@ } } +impl std::error::Error for Error { + fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { + match self { + Self::UpkeepRunning => None, + Self::FailedToSpawnUpkeepThread(e) => Some(e), + } + } +} + impl Upkeep { /// Creates a new [`Upkeep`]. /// @@ -94,9 +103,14 @@ /// Start the upkeep thread, periodically updating the global coarse time. /// - /// If the return value is [`Ok(handle)`], then the thread was spawned successfully and can be - /// stopped by dropping the returned handle. Otherwise, [`Err`] contains the error that was - /// returned when trying to spawn the thread. + /// [`Handle`] represents a drop guard for the upkeep thread if it is successfully spawned. + /// Dropping the handle will also instruct the upkeep thread to stop and exist, so the handle + /// must be held while the upkeep thread should continue to run. + /// + /// # Errors + /// + /// If either an existing upkeep thread is running, or there was an issue when attempting to + /// spawn the upkeep thread, an error variant will be returned describing the error. pub fn start(self) -> Result { // If another upkeep thread is running, inform the caller. let _ = GLOBAL_UPKEEP_RUNNING @@ -113,8 +127,7 @@ .name("quanta-upkeep".to_string()) .spawn(move || { while !their_done.load(Ordering::Acquire) { - let now = clock.now(); - Clock::upkeep(now); + set_recent(clock.now()); thread::sleep(interval); } @@ -142,7 +155,7 @@ self.done.store(true, Ordering::Release); if let Some(handle) = self.handle.take() { - let _ = handle + let _result = handle .join() .map_err(|_| io::Error::new(io::ErrorKind::Other, "failed to stop upkeep thread")); } diff -Nru temporalio-1.3.0/vendor/redox_syscall/.cargo-checksum.json temporalio-1.3.0/vendor/redox_syscall/.cargo-checksum.json --- temporalio-1.3.0/vendor/redox_syscall/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/redox_syscall/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"Cargo.toml":"91d2cdde6f3eaad21dc8f0d8879b0572d92b0eca34fd2dcac26ccc00c50b6839","LICENSE":"efcfee7981ff72431fffb06925cad00a23dce079ed4354f61030ad5abdb78829","README.md":"9161f18ba7f69b4ca51e844aee8ffb8237513a468c5c3b1f3a5f989044f895ac","src/arch/aarch64.rs":"9b4cf7da1f001ce54bfd01b7a001dbc8043c1ef89823781a2a1070e2c096a9ce","src/arch/nonredox.rs":"1055cd441f4b95c9ec428222a7796c7fac953a8a500ca08173743ea95220aab3","src/arch/riscv64.rs":"20bf9a8db779059773b113643d0cb3737fbb5d57f45ee39b8ae9d3396b6ef636","src/arch/x86.rs":"cf01f4d798e8861ad5b9429714c947e2d7c53a3cb9a13d53dc7a38e4bdad4101","src/arch/x86_64.rs":"fd80c9a412d07c85f2b942f36de364edfff7cd49f6c00c043e69becb7c76119f","src/call.rs":"1630ef687b0de538e19e7408d79c55177e61a7a7c8a2693da9bd01e5358a9a8e","src/data.rs":"cff635f60875977935e1b243aff638ef2193aa05a73fc1399964e55225eb3934","src/error.rs":"c8cacebca86e388e2ef12ac504818d7c1bc16df5d89fcabc1dfc9839e7c3aecf","src/flag.rs":"0505c4ed82970109d83ef01100c40d0fee344919d10f5a78957fc20706f8e228","src/io/dma.rs":"85577342547afaac0dc46740dfeb9d2e4239d8809b86748c3fcaa12f922b1c9d","src/io/io.rs":"e1d454ff47efac70fdaa709251a5a9c1c5637f931994ba3bf6a38c6db9145822","src/io/mmio.rs":"ab64f0bee9d13ebcfc21d0125f6c973f460f582cbc3d566d00491fe1ac714127","src/io/mod.rs":"79c2fce4fd6d75f3b9169df64b7a605feff31fab2e5ed81984ae085a1d07c0c4","src/io/pio.rs":"9ee6f2229b700d1c45b4c8c6242bd99fe69634e16dcd5843d9e8d1c958047406","src/lib.rs":"25c9f35cf709e7e50336ae12f0390f968cc11515f93b6d757825a7b7725eeadb","src/number.rs":"c0463c7f8eb3f3d16062efb0e65472b22f81821329af2ed8271fdddfa70f3e8b","src/scheme/generate.sh":"2eed5d6a382cd3daa31ccaa7c80b1995258f9126462228191b41f32e7af958a2","src/scheme/mod.rs":"acdd7526d6477288c47efc2a4c310d9a9fef8795cad4358c54aba0763ae2fcd2","src/scheme/scheme.rs":"860526f02cb8cab0d1a996079c9ef5d9440b45796429c4376e00d253b4d3ba51","src/scheme/scheme_block.rs":"6afebd8f3d6dd2716236e63bfd3943f5d6725e29aac392ce0e21101fd4578a82","src/scheme/scheme_block_mut.rs":"ed2d27e7519f437a42d32cbd80e33c4b9446cd90d3e6dbd82e3509a41e92acb7","src/scheme/scheme_mut.rs":"1d2e2ad31da6622ef80493c3670909fe8179306081bbc7f450b24528e6ef23d8","src/scheme/seek.rs":"94e044de47b0f00eb0c2aea3fb21001ac2b9aa1e4b20d73fd54163fe92fa63f7","src/tests.rs":"0fb2355fe625188a348fbae8c23fa622d4a08c6378a56ff40d3ef54ed78884b9"},"package":"4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa"} \ No newline at end of file +{"files":{"Cargo.toml":"80db3d7e545f9b8a04804e634948c6e80c712f051680b2e7a39ddb848c200151","LICENSE":"efcfee7981ff72431fffb06925cad00a23dce079ed4354f61030ad5abdb78829","README.md":"9161f18ba7f69b4ca51e844aee8ffb8237513a468c5c3b1f3a5f989044f895ac","src/arch/aarch64.rs":"9b4cf7da1f001ce54bfd01b7a001dbc8043c1ef89823781a2a1070e2c096a9ce","src/arch/nonredox.rs":"1055cd441f4b95c9ec428222a7796c7fac953a8a500ca08173743ea95220aab3","src/arch/riscv64.rs":"20bf9a8db779059773b113643d0cb3737fbb5d57f45ee39b8ae9d3396b6ef636","src/arch/x86.rs":"cf01f4d798e8861ad5b9429714c947e2d7c53a3cb9a13d53dc7a38e4bdad4101","src/arch/x86_64.rs":"fd80c9a412d07c85f2b942f36de364edfff7cd49f6c00c043e69becb7c76119f","src/call.rs":"141bdb2cb64dc118beadf40fc8180cd32e41841c8d7db71aed646a5a8ab9fac3","src/data.rs":"bd4545d4c2fcc59ff26ae52ad7f773a697d5ccf639a2ffc253cece6b31e94d51","src/error.rs":"ef20f3817f997a1aeb7114628407f19cb8bc13c555d4e093918f38a5d098f798","src/flag.rs":"aad91126a0bb3413cd103fc38b457aa4d1f6b949605e3ae249aea0dfec8504ff","src/io/dma.rs":"85577342547afaac0dc46740dfeb9d2e4239d8809b86748c3fcaa12f922b1c9d","src/io/io.rs":"e1d454ff47efac70fdaa709251a5a9c1c5637f931994ba3bf6a38c6db9145822","src/io/mmio.rs":"12d0fb4d4f45097bf2c14f73cb1ce21325eae193b537e9f18af73ed5281b5e63","src/io/mod.rs":"79c2fce4fd6d75f3b9169df64b7a605feff31fab2e5ed81984ae085a1d07c0c4","src/io/pio.rs":"9ee6f2229b700d1c45b4c8c6242bd99fe69634e16dcd5843d9e8d1c958047406","src/lib.rs":"25c9f35cf709e7e50336ae12f0390f968cc11515f93b6d757825a7b7725eeadb","src/number.rs":"773d9f55a98c6ae5b4cb08b396568f05f8d9b187a7609b7a1c5dd940f6ee674a","src/scheme/generate.sh":"dde4e30f4e0223fb1a24ed486a6c36e624c854dbf890862cb6866f4fa3c7a6eb","src/scheme/mod.rs":"cb622405deb0aef4ab04499ea1adfd338c9c5dd9c31a1fe9989786dbf69b49d8","src/scheme/scheme.rs":"2e27e08e3b9005a5705fadd10a6160a570322c873d1b6477f269e0beae35f046","src/scheme/scheme_block.rs":"a8d0137e106dcb605367bfc6a22b83317142996b7e410c832de0f63a423d5305","src/scheme/scheme_block_mut.rs":"b6cea44a3e79dd6c30b4280b6913a215628918978451efe11f31b0d7eddd44a5","src/scheme/scheme_mut.rs":"e77da9d5208de101c126eca9fa685f2b78a5ddc4890ad5f5f4d79ded3bbd8fbd","src/scheme/seek.rs":"94e044de47b0f00eb0c2aea3fb21001ac2b9aa1e4b20d73fd54163fe92fa63f7","src/tests.rs":"b44de69251d6bcc1cb796147a1212fffd3ac7d5796d9a0d2265db0aac8a909df"},"package":"567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/redox_syscall/Cargo.toml temporalio-1.3.0/vendor/redox_syscall/Cargo.toml --- temporalio-1.3.0/vendor/redox_syscall/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/redox_syscall/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -12,7 +12,7 @@ [package] edition = "2018" name = "redox_syscall" -version = "0.4.1" +version = "0.3.5" authors = ["Jeremy Soller "] description = "A Rust library to access raw Redox system calls" documentation = "https://docs.rs/redox_syscall" diff -Nru temporalio-1.3.0/vendor/redox_syscall/src/call.rs temporalio-1.3.0/vendor/redox_syscall/src/call.rs --- temporalio-1.3.0/vendor/redox_syscall/src/call.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/redox_syscall/src/call.rs 2023-10-30 19:40:00.000000000 +0000 @@ -264,6 +264,21 @@ syscall3(SYS_PHYSMAP, physical_address, size, flags.bits()) } +/// Unmap previously mapped physical memory +/// +/// # Errors +/// +/// * `EPERM` - `uid != 0` +/// * `EFAULT` - `virtual_address` has not been mapped +pub unsafe fn physunmap(virtual_address: usize) -> Result { + syscall1(SYS_PHYSUNMAP, virtual_address) +} + +/// Create a pair of file descriptors referencing the read and write ends of a pipe +pub fn pipe2(fds: &mut [usize; 2], flags: usize) -> Result { + unsafe { syscall2(SYS_PIPE2, fds.as_ptr() as usize, flags) } +} + /// Read from a file descriptor into a buffer pub fn read(fd: usize, buf: &mut [u8]) -> Result { unsafe { syscall3(SYS_READ, fd, buf.as_mut_ptr() as usize, buf.len()) } diff -Nru temporalio-1.3.0/vendor/redox_syscall/src/data.rs temporalio-1.3.0/vendor/redox_syscall/src/data.rs --- temporalio-1.3.0/vendor/redox_syscall/src/data.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/redox_syscall/src/data.rs 2023-10-30 19:40:00.000000000 +0000 @@ -149,24 +149,6 @@ pub sa_mask: [u64; 2], pub sa_flags: SigActionFlags, } -impl Deref for SigAction { - type Target = [u8]; - fn deref(&self) -> &[u8] { - unsafe { - slice::from_raw_parts(self as *const SigAction as *const u8, - mem::size_of::()) - } - } -} - -impl DerefMut for SigAction { - fn deref_mut(&mut self) -> &mut [u8] { - unsafe { - slice::from_raw_parts_mut(self as *mut SigAction as *mut u8, - mem::size_of::()) - } - } -} #[allow(dead_code)] unsafe fn _assert_size_of_function_is_sane() { @@ -313,44 +295,3 @@ } } } - -bitflags::bitflags! { - #[derive(Default)] - pub struct GrantFlags: usize { - const GRANT_READ = 0x0000_0001; - const GRANT_WRITE = 0x0000_0002; - const GRANT_EXEC = 0x0000_0004; - - const GRANT_SHARED = 0x0000_0008; - const GRANT_LAZY = 0x0000_0010; - const GRANT_SCHEME = 0x0000_0020; - const GRANT_PHYS = 0x0000_0040; - const GRANT_PINNED = 0x0000_0080; - } -} - -#[derive(Clone, Copy, Debug, Default)] -#[repr(C)] -pub struct GrantDesc { - pub base: usize, - pub size: usize, - pub flags: GrantFlags, - pub offset: u64, -} - -impl Deref for GrantDesc { - type Target = [u8]; - fn deref(&self) -> &[u8] { - unsafe { - slice::from_raw_parts(self as *const GrantDesc as *const u8, mem::size_of::()) - } - } -} - -impl DerefMut for GrantDesc { - fn deref_mut(&mut self) -> &mut [u8] { - unsafe { - slice::from_raw_parts_mut(self as *mut GrantDesc as *mut u8, mem::size_of::()) - } - } -} diff -Nru temporalio-1.3.0/vendor/redox_syscall/src/error.rs temporalio-1.3.0/vendor/redox_syscall/src/error.rs --- temporalio-1.3.0/vendor/redox_syscall/src/error.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/redox_syscall/src/error.rs 2023-10-30 19:40:00.000000000 +0000 @@ -176,9 +176,8 @@ pub const EKEYREJECTED: i32 = 129; /* Key was rejected by service */ pub const EOWNERDEAD: i32 = 130; /* Owner died */ pub const ENOTRECOVERABLE: i32 = 131; /* State not recoverable */ -pub const ESKMSG: i32 = 132; /* Scheme-kernel message code */ -pub static STR_ERROR: [&'static str; 133] = ["Success", +pub static STR_ERROR: [&'static str; 132] = ["Success", "Operation not permitted", "No such file or directory", "No such process", @@ -309,5 +308,4 @@ "Key has been revoked", "Key was rejected by service", "Owner died", - "State not recoverable", - "Scheme-kernel message code"]; + "State not recoverable"]; diff -Nru temporalio-1.3.0/vendor/redox_syscall/src/flag.rs temporalio-1.3.0/vendor/redox_syscall/src/flag.rs --- temporalio-1.3.0/vendor/redox_syscall/src/flag.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/redox_syscall/src/flag.rs 2023-10-30 19:40:00.000000000 +0000 @@ -54,18 +54,9 @@ pub const FUTEX_REQUEUE: usize = 2; pub const FUTEX_WAIT64: usize = 3; -// packet.c = fd -pub const SKMSG_FRETURNFD: usize = 0; - -// packet.uid:packet.gid = offset, packet.c = base address, packet.d = page count -pub const SKMSG_PROVIDE_MMAP: usize = 1; - bitflags! { pub struct MapFlags: usize { - // TODO: Downgrade PROT_NONE to global constant? (bitflags specifically states zero flags - // can cause buggy behavior). const PROT_NONE = 0x0000_0000; - const PROT_EXEC = 0x0001_0000; const PROT_WRITE = 0x0002_0000; const PROT_READ = 0x0004_0000; @@ -73,30 +64,9 @@ const MAP_SHARED = 0x0001; const MAP_PRIVATE = 0x0002; + /// Only accepted for mmap2(2). const MAP_FIXED = 0x0004; const MAP_FIXED_NOREPLACE = 0x000C; - - /// For *userspace-backed mmaps*, return from the mmap call before all pages have been - /// provided by the scheme. This requires the scheme to be trusted, as the current context - /// can block indefinitely, if the scheme does not respond to the page fault handler's - /// request, as it tries to map the page by requesting it from the scheme. - /// - /// In some cases however, such as the program loader, the data needs to be trusted as much - /// with or without MAP_LAZY, and if so, mapping lazily will not cause insecureness by - /// itself. - /// - /// For kernel-backed mmaps, this flag has no effect at all. It is unspecified whether - /// kernel mmaps are lazy or not. - const MAP_LAZY = 0x0010; - } -} -bitflags! { - pub struct MunmapFlags: usize { - /// Indicates whether the funmap call must implicitly do an msync, for the changes to - /// become visible later. - /// - /// This flag will currently be set if and only if MAP_SHARED | PROT_WRITE are set. - const NEEDS_SYNC = 1; } } @@ -364,11 +334,3 @@ pub fn wcoredump(status: usize) -> bool { (status & 0x80) != 0 } - -bitflags! { - pub struct MremapFlags: usize { - const FIXED = 1; - const FIXED_REPLACE = 3; - // TODO: MAYMOVE, DONTUNMAP - } -} diff -Nru temporalio-1.3.0/vendor/redox_syscall/src/io/mmio.rs temporalio-1.3.0/vendor/redox_syscall/src/io/mmio.rs --- temporalio-1.3.0/vendor/redox_syscall/src/io/mmio.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/redox_syscall/src/io/mmio.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,6 +1,5 @@ +use core::ptr::{read_volatile, write_volatile, addr_of, addr_of_mut}; use core::mem::MaybeUninit; -use core::ptr; -#[cfg(not(any(target_arch = "x86", target_arch = "x86_64")))] use core::ops::{BitAnd, BitOr, Not}; use super::io::Io; @@ -33,136 +32,14 @@ } } -// Generic implementation (WARNING: requires aligned pointers!) -#[cfg(not(any(target_arch = "x86", target_arch = "x86_64")))] impl Io for Mmio where T: Copy + PartialEq + BitAnd + BitOr + Not { type Value = T; fn read(&self) -> T { - unsafe { ptr::read_volatile(ptr::addr_of!(self.value).cast::()) } + unsafe { read_volatile(addr_of!(self.value).cast::()) } } fn write(&mut self, value: T) { - unsafe { ptr::write_volatile(ptr::addr_of_mut!(self.value).cast::(), value) }; - } -} - -// x86 u8 implementation -#[cfg(any(target_arch = "x86", target_arch = "x86_64"))] -impl Io for Mmio { - type Value = u8; - - fn read(&self) -> Self::Value { - unsafe { - let value: Self::Value; - let ptr: *const Self::Value = ptr::addr_of!(self.value).cast::(); - core::arch::asm!( - "mov {}, [{}]", - out(reg_byte) value, - in(reg) ptr - ); - value - } - } - - fn write(&mut self, value: Self::Value) { - unsafe { - let ptr: *mut Self::Value = ptr::addr_of_mut!(self.value).cast::(); - core::arch::asm!( - "mov [{}], {}", - in(reg) ptr, - in(reg_byte) value, - ); - } - } -} - -// x86 u16 implementation -#[cfg(any(target_arch = "x86", target_arch = "x86_64"))] -impl Io for Mmio { - type Value = u16; - - fn read(&self) -> Self::Value { - unsafe { - let value: Self::Value; - let ptr: *const Self::Value = ptr::addr_of!(self.value).cast::(); - core::arch::asm!( - "mov {:x}, [{}]", - out(reg) value, - in(reg) ptr - ); - value - } - } - - fn write(&mut self, value: Self::Value) { - unsafe { - let ptr: *mut Self::Value = ptr::addr_of_mut!(self.value).cast::(); - core::arch::asm!( - "mov [{}], {:x}", - in(reg) ptr, - in(reg) value, - ); - } - } -} - -// x86 u32 implementation -#[cfg(any(target_arch = "x86", target_arch = "x86_64"))] -impl Io for Mmio { - type Value = u32; - - fn read(&self) -> Self::Value { - unsafe { - let value: Self::Value; - let ptr: *const Self::Value = ptr::addr_of!(self.value).cast::(); - core::arch::asm!( - "mov {:e}, [{}]", - out(reg) value, - in(reg) ptr - ); - value - } - } - - fn write(&mut self, value: Self::Value) { - unsafe { - let ptr: *mut Self::Value = ptr::addr_of_mut!(self.value).cast::(); - core::arch::asm!( - "mov [{}], {:e}", - in(reg) ptr, - in(reg) value, - ); - } - } -} - -// x86 u64 implementation (x86_64 only) -#[cfg(target_arch = "x86_64")] -impl Io for Mmio { - type Value = u64; - - fn read(&self) -> Self::Value { - unsafe { - let value: Self::Value; - let ptr: *const Self::Value = ptr::addr_of!(self.value).cast::(); - core::arch::asm!( - "mov {:r}, [{}]", - out(reg) value, - in(reg) ptr - ); - value - } - } - - fn write(&mut self, value: Self::Value) { - unsafe { - let ptr: *mut Self::Value = ptr::addr_of_mut!(self.value).cast::(); - core::arch::asm!( - "mov [{}], {:r}", - in(reg) ptr, - in(reg) value, - ); - } + unsafe { write_volatile(addr_of_mut!(self.value).cast::(), value) }; } } diff -Nru temporalio-1.3.0/vendor/redox_syscall/src/number.rs temporalio-1.3.0/vendor/redox_syscall/src/number.rs --- temporalio-1.3.0/vendor/redox_syscall/src/number.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/redox_syscall/src/number.rs 2023-10-30 19:40:00.000000000 +0000 @@ -25,16 +25,10 @@ pub const SYS_FCHOWN: usize = SYS_CLASS_FILE | 207; pub const SYS_FCNTL: usize = SYS_CLASS_FILE | 55; pub const SYS_FEVENT: usize = SYS_CLASS_FILE | 927; - -// TODO: Rename FMAP/FUNMAP to MMAP/MUNMAP pub const SYS_FMAP_OLD: usize = SYS_CLASS_FILE | SYS_ARG_SLICE | 90; pub const SYS_FMAP: usize = SYS_CLASS_FILE | SYS_ARG_SLICE | 900; -// TODO: SYS_FUNMAP should be SYS_CLASS_FILE -// TODO: Remove FMAP/FMAP_OLD pub const SYS_FUNMAP_OLD: usize = SYS_CLASS_FILE | 91; pub const SYS_FUNMAP: usize = SYS_CLASS_FILE | 92; -pub const SYS_MREMAP: usize = 155; - pub const SYS_FPATH: usize = SYS_CLASS_FILE | SYS_ARG_MSLICE | 928; pub const SYS_FRENAME: usize = SYS_CLASS_FILE | SYS_ARG_PATH | 38; pub const SYS_FSTAT: usize = SYS_CLASS_FILE | SYS_ARG_MSLICE | 28; @@ -43,18 +37,6 @@ pub const SYS_FTRUNCATE: usize = SYS_CLASS_FILE | 93; pub const SYS_FUTIMENS: usize = SYS_CLASS_FILE | SYS_ARG_SLICE | 320; -// b = file, c = flags, d = required_page_count, uid:gid = offset -pub const KSMSG_MMAP: usize = SYS_CLASS_FILE | 72; - -// b = file, c = flags, d = page_count, uid:gid = offset -pub const KSMSG_MSYNC: usize = SYS_CLASS_FILE | 73; - -// b = file, c = page_count, uid:gid = offset -pub const KSMSG_MUNMAP: usize = SYS_CLASS_FILE | 74; - -// b = file, c = flags, d = page_count, uid:gid = offset -pub const KSMSG_MMAP_PREP: usize = SYS_CLASS_FILE | 75; - pub const SYS_CLOCK_GETTIME: usize = 265; pub const SYS_EXIT: usize = 1; pub const SYS_FUTEX: usize = 240; @@ -76,7 +58,9 @@ pub const SYS_PHYSALLOC3: usize=9453; pub const SYS_PHYSFREE: usize = 946; pub const SYS_PHYSMAP: usize = 947; +pub const SYS_PHYSUNMAP: usize =948; pub const SYS_VIRTTOPHYS: usize=949; +pub const SYS_PIPE2: usize = 331; pub const SYS_SETPGID: usize = 57; pub const SYS_SETREGID: usize = 204; pub const SYS_SETRENS: usize = 952; diff -Nru temporalio-1.3.0/vendor/redox_syscall/src/scheme/generate.sh temporalio-1.3.0/vendor/redox_syscall/src/scheme/generate.sh --- temporalio-1.3.0/vendor/redox_syscall/src/scheme/generate.sh 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/redox_syscall/src/scheme/generate.sh 2023-10-30 19:40:00.000000000 +0000 @@ -15,8 +15,6 @@ | sed 's/\.map(|o| o as usize)/.map(|o| o.map(|o| o as usize))/' \ | sed 's/Ok(0)/Ok(Some(0))/g' \ | sed 's/Result<\([^>]\+\)>/Result>/g' \ -| sed 's/convert_to_this_scheme/convert_to_this_scheme_block/g' \ -| sed 's/convert_in_scheme_handle/convert_in_scheme_handle_block/g' \ > scheme_block.rs echo "Generating SchemeBlockMut from SchemeBlock" diff -Nru temporalio-1.3.0/vendor/redox_syscall/src/scheme/mod.rs temporalio-1.3.0/vendor/redox_syscall/src/scheme/mod.rs --- temporalio-1.3.0/vendor/redox_syscall/src/scheme/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/redox_syscall/src/scheme/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,7 +1,5 @@ use core::{slice, str}; -use crate::{Error, Result, EOPNOTSUPP, ESKMSG, Packet, SKMSG_FRETURNFD}; - pub use self::scheme::Scheme; pub use self::scheme_mut::SchemeMut; pub use self::scheme_block::SchemeBlock; @@ -18,51 +16,3 @@ mod scheme_block; mod scheme_block_mut; mod seek; - -pub struct CallerCtx { - pub pid: usize, - pub uid: u32, - pub gid: u32, -} - -pub enum OpenResult { - ThisScheme { number: usize }, - OtherScheme { fd: usize }, -} - -// TODO: Find a better solution than generate.sh -pub(crate) fn convert_to_this_scheme(r: Result) -> Result { - r.map(|number| OpenResult::ThisScheme { number }) -} -pub(crate) fn convert_to_this_scheme_block(r: Result>) -> Result> { - r.map(|o| o.map(|number| OpenResult::ThisScheme { number })) -} -pub(crate) fn convert_in_scheme_handle_block(_: &Packet, result: Result>) -> Result> { - match result { - Ok(Some(OpenResult::ThisScheme { number })) => Ok(Some(number)), - Ok(Some(OpenResult::OtherScheme { .. })) => Err(Error::new(EOPNOTSUPP)), - Ok(None) => Ok(None), - Err(err) => Err(err), - } -} -pub(crate) fn convert_in_scheme_handle(packet: &mut Packet, result: Result) -> Result { - match result { - Ok(OpenResult::ThisScheme { number }) => Ok(number), - Ok(OpenResult::OtherScheme { fd }) => { - packet.b = SKMSG_FRETURNFD; - packet.c = fd; - Err(Error::new(ESKMSG)) - } - Err(err) => Err(err), - } -} - -impl CallerCtx { - pub fn from_packet(packet: &Packet) -> Self { - Self { - pid: packet.pid, - uid: packet.uid, - gid: packet.gid, - } - } -} diff -Nru temporalio-1.3.0/vendor/redox_syscall/src/scheme/scheme_block_mut.rs temporalio-1.3.0/vendor/redox_syscall/src/scheme/scheme_block_mut.rs --- temporalio-1.3.0/vendor/redox_syscall/src/scheme/scheme_block_mut.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/redox_syscall/src/scheme/scheme_block_mut.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,20 +1,17 @@ use core::{mem, slice}; -use crate::CallerCtx; -use crate::OpenResult; use crate::data::*; use crate::error::*; use crate::flag::*; use crate::number::*; -use crate::scheme::*; +use crate::scheme::str_from_raw_parts; pub trait SchemeBlockMut { fn handle(&mut self, packet: &Packet) -> Option { let res = match packet.a { SYS_OPEN => if let Some(path) = unsafe { str_from_raw_parts(packet.b as *const u8, packet.c) } { - convert_in_scheme_handle_block(packet, self.xopen(path, packet.d, &CallerCtx::from_packet(&packet))) - } - else { + self.open(path, packet.d, packet.uid, packet.gid) + } else { Err(Error::new(EINVAL)) }, SYS_RMDIR => if let Some(path) = unsafe { str_from_raw_parts(packet.b as *const u8, packet.c) } { @@ -28,7 +25,7 @@ Err(Error::new(EINVAL)) }, - SYS_DUP => convert_in_scheme_handle_block(packet, self.xdup(packet.b, unsafe { slice::from_raw_parts(packet.c as *const u8, packet.d) }, &CallerCtx::from_packet(&packet))), + SYS_DUP => self.dup(packet.b, unsafe { slice::from_raw_parts(packet.c as *const u8, packet.d) }), SYS_READ => self.read(packet.b, unsafe { slice::from_raw_parts_mut(packet.c as *mut u8, packet.d) }), SYS_WRITE => self.write(packet.b, unsafe { slice::from_raw_parts(packet.c as *const u8, packet.d) }), SYS_LSEEK => self.seek(packet.b, packet.c as isize, packet.d).map(|o| o.map(|o| o as usize)), @@ -36,6 +33,18 @@ SYS_FCHOWN => self.fchown(packet.b, packet.c as u32, packet.d as u32), SYS_FCNTL => self.fcntl(packet.b, packet.c, packet.d), SYS_FEVENT => self.fevent(packet.b, EventFlags::from_bits_truncate(packet.c)).map(|f| f.map(|f| f.bits())), + SYS_FMAP_OLD => if packet.d >= mem::size_of::() { + self.fmap_old(packet.b, unsafe { &*(packet.c as *const OldMap) }) + } else { + Err(Error::new(EFAULT)) + }, + SYS_FMAP => if packet.d >= mem::size_of::() { + self.fmap(packet.b, unsafe { &*(packet.c as *const Map) }) + } else { + Err(Error::new(EFAULT)) + }, + SYS_FUNMAP_OLD => self.funmap_old(packet.b), + SYS_FUNMAP => self.funmap(packet.b, packet.c), SYS_FPATH => self.fpath(packet.b, unsafe { slice::from_raw_parts_mut(packet.c as *mut u8, packet.d) }), SYS_FRENAME => if let Some(path) = unsafe { str_from_raw_parts(packet.c as *const u8, packet.d) } { self.frename(packet.b, path, packet.uid, packet.gid) @@ -60,10 +69,6 @@ Err(Error::new(EFAULT)) }, SYS_CLOSE => self.close(packet.b), - - KSMSG_MMAP_PREP => self.mmap_prep(packet.b, u64::from(packet.uid) | (u64::from(packet.gid) << 32), packet.c, MapFlags::from_bits_truncate(packet.d)), - KSMSG_MUNMAP => self.munmap(packet.b, u64::from(packet.uid) | (u64::from(packet.gid) << 32), packet.c, MunmapFlags::from_bits_truncate(packet.d)), - _ => Err(Error::new(ENOSYS)) }; @@ -76,10 +81,6 @@ fn open(&mut self, path: &str, flags: usize, uid: u32, gid: u32) -> Result> { Err(Error::new(ENOENT)) } - #[allow(unused_variables)] - fn xopen(&mut self, path: &str, flags: usize, ctx: &CallerCtx) -> Result> { - convert_to_this_scheme_block(self.open(path, flags, ctx.uid, ctx.gid)) - } #[allow(unused_variables)] fn chmod(&mut self, path: &str, mode: u16, uid: u32, gid: u32) -> Result> { @@ -103,11 +104,6 @@ } #[allow(unused_variables)] - fn xdup(&mut self, old_id: usize, buf: &[u8], ctx: &CallerCtx) -> Result> { - convert_to_this_scheme_block(self.dup(old_id, buf)) - } - - #[allow(unused_variables)] fn read(&mut self, id: usize, buf: &mut [u8]) -> Result> { Err(Error::new(EBADF)) } @@ -143,6 +139,32 @@ } #[allow(unused_variables)] + fn fmap_old(&mut self, id: usize, map: &OldMap) -> Result> { + Err(Error::new(EBADF)) + } + #[allow(unused_variables)] + fn fmap(&mut self, id: usize, map: &Map) -> Result> { + if map.flags.contains(MapFlags::MAP_FIXED) { + return Err(Error::new(EINVAL)); + } + self.fmap_old(id, &OldMap { + offset: map.offset, + size: map.size, + flags: map.flags, + }) + } + + #[allow(unused_variables)] + fn funmap_old(&mut self, address: usize) -> Result> { + Ok(Some(0)) + } + + #[allow(unused_variables)] + fn funmap(&mut self, address: usize, length: usize) -> Result> { + Ok(Some(0)) + } + + #[allow(unused_variables)] fn fpath(&mut self, id: usize, buf: &mut [u8]) -> Result> { Err(Error::new(EBADF)) } @@ -181,14 +203,4 @@ fn close(&mut self, id: usize) -> Result> { Err(Error::new(EBADF)) } - - #[allow(unused_variables)] - fn mmap_prep(&mut self, id: usize, offset: u64, size: usize, flags: MapFlags) -> Result> { - Err(Error::new(EOPNOTSUPP)) - } - - #[allow(unused_variables)] - fn munmap(&mut self, id: usize, offset: u64, size: usize, flags: MunmapFlags) -> Result> { - Err(Error::new(EOPNOTSUPP)) - } } diff -Nru temporalio-1.3.0/vendor/redox_syscall/src/scheme/scheme_block.rs temporalio-1.3.0/vendor/redox_syscall/src/scheme/scheme_block.rs --- temporalio-1.3.0/vendor/redox_syscall/src/scheme/scheme_block.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/redox_syscall/src/scheme/scheme_block.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,20 +1,17 @@ use core::{mem, slice}; -use crate::CallerCtx; -use crate::OpenResult; use crate::data::*; use crate::error::*; use crate::flag::*; use crate::number::*; -use crate::scheme::*; +use crate::scheme::str_from_raw_parts; pub trait SchemeBlock { fn handle(&self, packet: &Packet) -> Option { let res = match packet.a { SYS_OPEN => if let Some(path) = unsafe { str_from_raw_parts(packet.b as *const u8, packet.c) } { - convert_in_scheme_handle_block(packet, self.xopen(path, packet.d, &CallerCtx::from_packet(&packet))) - } - else { + self.open(path, packet.d, packet.uid, packet.gid) + } else { Err(Error::new(EINVAL)) }, SYS_RMDIR => if let Some(path) = unsafe { str_from_raw_parts(packet.b as *const u8, packet.c) } { @@ -28,7 +25,7 @@ Err(Error::new(EINVAL)) }, - SYS_DUP => convert_in_scheme_handle_block(packet, self.xdup(packet.b, unsafe { slice::from_raw_parts(packet.c as *const u8, packet.d) }, &CallerCtx::from_packet(&packet))), + SYS_DUP => self.dup(packet.b, unsafe { slice::from_raw_parts(packet.c as *const u8, packet.d) }), SYS_READ => self.read(packet.b, unsafe { slice::from_raw_parts_mut(packet.c as *mut u8, packet.d) }), SYS_WRITE => self.write(packet.b, unsafe { slice::from_raw_parts(packet.c as *const u8, packet.d) }), SYS_LSEEK => self.seek(packet.b, packet.c as isize, packet.d).map(|o| o.map(|o| o as usize)), @@ -36,6 +33,18 @@ SYS_FCHOWN => self.fchown(packet.b, packet.c as u32, packet.d as u32), SYS_FCNTL => self.fcntl(packet.b, packet.c, packet.d), SYS_FEVENT => self.fevent(packet.b, EventFlags::from_bits_truncate(packet.c)).map(|f| f.map(|f| f.bits())), + SYS_FMAP_OLD => if packet.d >= mem::size_of::() { + self.fmap_old(packet.b, unsafe { &*(packet.c as *const OldMap) }) + } else { + Err(Error::new(EFAULT)) + }, + SYS_FMAP => if packet.d >= mem::size_of::() { + self.fmap(packet.b, unsafe { &*(packet.c as *const Map) }) + } else { + Err(Error::new(EFAULT)) + }, + SYS_FUNMAP_OLD => self.funmap_old(packet.b), + SYS_FUNMAP => self.funmap(packet.b, packet.c), SYS_FPATH => self.fpath(packet.b, unsafe { slice::from_raw_parts_mut(packet.c as *mut u8, packet.d) }), SYS_FRENAME => if let Some(path) = unsafe { str_from_raw_parts(packet.c as *const u8, packet.d) } { self.frename(packet.b, path, packet.uid, packet.gid) @@ -60,10 +69,6 @@ Err(Error::new(EFAULT)) }, SYS_CLOSE => self.close(packet.b), - - KSMSG_MMAP_PREP => self.mmap_prep(packet.b, u64::from(packet.uid) | (u64::from(packet.gid) << 32), packet.c, MapFlags::from_bits_truncate(packet.d)), - KSMSG_MUNMAP => self.munmap(packet.b, u64::from(packet.uid) | (u64::from(packet.gid) << 32), packet.c, MunmapFlags::from_bits_truncate(packet.d)), - _ => Err(Error::new(ENOSYS)) }; @@ -76,10 +81,6 @@ fn open(&self, path: &str, flags: usize, uid: u32, gid: u32) -> Result> { Err(Error::new(ENOENT)) } - #[allow(unused_variables)] - fn xopen(&self, path: &str, flags: usize, ctx: &CallerCtx) -> Result> { - convert_to_this_scheme_block(self.open(path, flags, ctx.uid, ctx.gid)) - } #[allow(unused_variables)] fn chmod(&self, path: &str, mode: u16, uid: u32, gid: u32) -> Result> { @@ -103,11 +104,6 @@ } #[allow(unused_variables)] - fn xdup(&self, old_id: usize, buf: &[u8], ctx: &CallerCtx) -> Result> { - convert_to_this_scheme_block(self.dup(old_id, buf)) - } - - #[allow(unused_variables)] fn read(&self, id: usize, buf: &mut [u8]) -> Result> { Err(Error::new(EBADF)) } @@ -143,6 +139,32 @@ } #[allow(unused_variables)] + fn fmap_old(&self, id: usize, map: &OldMap) -> Result> { + Err(Error::new(EBADF)) + } + #[allow(unused_variables)] + fn fmap(&self, id: usize, map: &Map) -> Result> { + if map.flags.contains(MapFlags::MAP_FIXED) { + return Err(Error::new(EINVAL)); + } + self.fmap_old(id, &OldMap { + offset: map.offset, + size: map.size, + flags: map.flags, + }) + } + + #[allow(unused_variables)] + fn funmap_old(&self, address: usize) -> Result> { + Ok(Some(0)) + } + + #[allow(unused_variables)] + fn funmap(&self, address: usize, length: usize) -> Result> { + Ok(Some(0)) + } + + #[allow(unused_variables)] fn fpath(&self, id: usize, buf: &mut [u8]) -> Result> { Err(Error::new(EBADF)) } @@ -181,14 +203,4 @@ fn close(&self, id: usize) -> Result> { Err(Error::new(EBADF)) } - - #[allow(unused_variables)] - fn mmap_prep(&self, id: usize, offset: u64, size: usize, flags: MapFlags) -> Result> { - Err(Error::new(EOPNOTSUPP)) - } - - #[allow(unused_variables)] - fn munmap(&self, id: usize, offset: u64, size: usize, flags: MunmapFlags) -> Result> { - Err(Error::new(EOPNOTSUPP)) - } } diff -Nru temporalio-1.3.0/vendor/redox_syscall/src/scheme/scheme_mut.rs temporalio-1.3.0/vendor/redox_syscall/src/scheme/scheme_mut.rs --- temporalio-1.3.0/vendor/redox_syscall/src/scheme/scheme_mut.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/redox_syscall/src/scheme/scheme_mut.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,20 +1,17 @@ use core::{mem, slice}; -use crate::CallerCtx; -use crate::OpenResult; use crate::data::*; use crate::error::*; use crate::flag::*; use crate::number::*; -use crate::scheme::*; +use crate::scheme::str_from_raw_parts; pub trait SchemeMut { fn handle(&mut self, packet: &mut Packet) { let res = match packet.a { SYS_OPEN => if let Some(path) = unsafe { str_from_raw_parts(packet.b as *const u8, packet.c) } { - convert_in_scheme_handle(packet, self.xopen(path, packet.d, &CallerCtx::from_packet(&packet))) - } - else { + self.open(path, packet.d, packet.uid, packet.gid) + } else { Err(Error::new(EINVAL)) }, SYS_RMDIR => if let Some(path) = unsafe { str_from_raw_parts(packet.b as *const u8, packet.c) } { @@ -28,7 +25,7 @@ Err(Error::new(EINVAL)) }, - SYS_DUP => convert_in_scheme_handle(packet, self.xdup(packet.b, unsafe { slice::from_raw_parts(packet.c as *const u8, packet.d) }, &CallerCtx::from_packet(&packet))), + SYS_DUP => self.dup(packet.b, unsafe { slice::from_raw_parts(packet.c as *const u8, packet.d) }), SYS_READ => self.read(packet.b, unsafe { slice::from_raw_parts_mut(packet.c as *mut u8, packet.d) }), SYS_WRITE => self.write(packet.b, unsafe { slice::from_raw_parts(packet.c as *const u8, packet.d) }), SYS_LSEEK => self.seek(packet.b, packet.c as isize, packet.d).map(|o| o as usize), @@ -36,6 +33,18 @@ SYS_FCHOWN => self.fchown(packet.b, packet.c as u32, packet.d as u32), SYS_FCNTL => self.fcntl(packet.b, packet.c, packet.d), SYS_FEVENT => self.fevent(packet.b, EventFlags::from_bits_truncate(packet.c)).map(|f| f.bits()), + SYS_FMAP_OLD => if packet.d >= mem::size_of::() { + self.fmap_old(packet.b, unsafe { &*(packet.c as *const OldMap) }) + } else { + Err(Error::new(EFAULT)) + }, + SYS_FMAP => if packet.d >= mem::size_of::() { + self.fmap(packet.b, unsafe { &*(packet.c as *const Map) }) + } else { + Err(Error::new(EFAULT)) + }, + SYS_FUNMAP_OLD => self.funmap_old(packet.b), + SYS_FUNMAP => self.funmap(packet.b, packet.c), SYS_FPATH => self.fpath(packet.b, unsafe { slice::from_raw_parts_mut(packet.c as *mut u8, packet.d) }), SYS_FRENAME => if let Some(path) = unsafe { str_from_raw_parts(packet.c as *const u8, packet.d) } { self.frename(packet.b, path, packet.uid, packet.gid) @@ -60,10 +69,6 @@ Err(Error::new(EFAULT)) }, SYS_CLOSE => self.close(packet.b), - - KSMSG_MMAP_PREP => self.mmap_prep(packet.b, u64::from(packet.uid) | (u64::from(packet.gid) << 32), packet.c, MapFlags::from_bits_truncate(packet.d)), - KSMSG_MUNMAP => self.munmap(packet.b, u64::from(packet.uid) | (u64::from(packet.gid) << 32), packet.c, MunmapFlags::from_bits_truncate(packet.d)), - _ => Err(Error::new(ENOSYS)) }; @@ -76,10 +81,6 @@ fn open(&mut self, path: &str, flags: usize, uid: u32, gid: u32) -> Result { Err(Error::new(ENOENT)) } - #[allow(unused_variables)] - fn xopen(&mut self, path: &str, flags: usize, ctx: &CallerCtx) -> Result { - convert_to_this_scheme(self.open(path, flags, ctx.uid, ctx.gid)) - } #[allow(unused_variables)] fn chmod(&mut self, path: &str, mode: u16, uid: u32, gid: u32) -> Result { @@ -103,11 +104,6 @@ } #[allow(unused_variables)] - fn xdup(&mut self, old_id: usize, buf: &[u8], ctx: &CallerCtx) -> Result { - convert_to_this_scheme(self.dup(old_id, buf)) - } - - #[allow(unused_variables)] fn read(&mut self, id: usize, buf: &mut [u8]) -> Result { Err(Error::new(EBADF)) } @@ -143,6 +139,32 @@ } #[allow(unused_variables)] + fn fmap_old(&mut self, id: usize, map: &OldMap) -> Result { + Err(Error::new(EBADF)) + } + #[allow(unused_variables)] + fn fmap(&mut self, id: usize, map: &Map) -> Result { + if map.flags.contains(MapFlags::MAP_FIXED) { + return Err(Error::new(EINVAL)); + } + self.fmap_old(id, &OldMap { + offset: map.offset, + size: map.size, + flags: map.flags, + }) + } + + #[allow(unused_variables)] + fn funmap_old(&mut self, address: usize) -> Result { + Ok(0) + } + + #[allow(unused_variables)] + fn funmap(&mut self, address: usize, length: usize) -> Result { + Ok(0) + } + + #[allow(unused_variables)] fn fpath(&mut self, id: usize, buf: &mut [u8]) -> Result { Err(Error::new(EBADF)) } @@ -181,14 +203,4 @@ fn close(&mut self, id: usize) -> Result { Err(Error::new(EBADF)) } - - #[allow(unused_variables)] - fn mmap_prep(&mut self, id: usize, offset: u64, size: usize, flags: MapFlags) -> Result { - Err(Error::new(EOPNOTSUPP)) - } - - #[allow(unused_variables)] - fn munmap(&mut self, id: usize, offset: u64, size: usize, flags: MunmapFlags) -> Result { - Err(Error::new(EOPNOTSUPP)) - } } diff -Nru temporalio-1.3.0/vendor/redox_syscall/src/scheme/scheme.rs temporalio-1.3.0/vendor/redox_syscall/src/scheme/scheme.rs --- temporalio-1.3.0/vendor/redox_syscall/src/scheme/scheme.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/redox_syscall/src/scheme/scheme.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,20 +1,17 @@ use core::{mem, slice}; -use crate::CallerCtx; -use crate::OpenResult; use crate::data::*; use crate::error::*; use crate::flag::*; use crate::number::*; -use crate::scheme::*; +use crate::scheme::str_from_raw_parts; pub trait Scheme { fn handle(&self, packet: &mut Packet) { let res = match packet.a { SYS_OPEN => if let Some(path) = unsafe { str_from_raw_parts(packet.b as *const u8, packet.c) } { - convert_in_scheme_handle(packet, self.xopen(path, packet.d, &CallerCtx::from_packet(&packet))) - } - else { + self.open(path, packet.d, packet.uid, packet.gid) + } else { Err(Error::new(EINVAL)) }, SYS_RMDIR => if let Some(path) = unsafe { str_from_raw_parts(packet.b as *const u8, packet.c) } { @@ -28,7 +25,7 @@ Err(Error::new(EINVAL)) }, - SYS_DUP => convert_in_scheme_handle(packet, self.xdup(packet.b, unsafe { slice::from_raw_parts(packet.c as *const u8, packet.d) }, &CallerCtx::from_packet(&packet))), + SYS_DUP => self.dup(packet.b, unsafe { slice::from_raw_parts(packet.c as *const u8, packet.d) }), SYS_READ => self.read(packet.b, unsafe { slice::from_raw_parts_mut(packet.c as *mut u8, packet.d) }), SYS_WRITE => self.write(packet.b, unsafe { slice::from_raw_parts(packet.c as *const u8, packet.d) }), SYS_LSEEK => self.seek(packet.b, packet.c as isize, packet.d).map(|o| o as usize), @@ -36,6 +33,18 @@ SYS_FCHOWN => self.fchown(packet.b, packet.c as u32, packet.d as u32), SYS_FCNTL => self.fcntl(packet.b, packet.c, packet.d), SYS_FEVENT => self.fevent(packet.b, EventFlags::from_bits_truncate(packet.c)).map(|f| f.bits()), + SYS_FMAP_OLD => if packet.d >= mem::size_of::() { + self.fmap_old(packet.b, unsafe { &*(packet.c as *const OldMap) }) + } else { + Err(Error::new(EFAULT)) + }, + SYS_FMAP => if packet.d >= mem::size_of::() { + self.fmap(packet.b, unsafe { &*(packet.c as *const Map) }) + } else { + Err(Error::new(EFAULT)) + }, + SYS_FUNMAP_OLD => self.funmap_old(packet.b), + SYS_FUNMAP => self.funmap(packet.b, packet.c), SYS_FPATH => self.fpath(packet.b, unsafe { slice::from_raw_parts_mut(packet.c as *mut u8, packet.d) }), SYS_FRENAME => if let Some(path) = unsafe { str_from_raw_parts(packet.c as *const u8, packet.d) } { self.frename(packet.b, path, packet.uid, packet.gid) @@ -60,10 +69,6 @@ Err(Error::new(EFAULT)) }, SYS_CLOSE => self.close(packet.b), - - KSMSG_MMAP_PREP => self.mmap_prep(packet.b, u64::from(packet.uid) | (u64::from(packet.gid) << 32), packet.c, MapFlags::from_bits_truncate(packet.d)), - KSMSG_MUNMAP => self.munmap(packet.b, u64::from(packet.uid) | (u64::from(packet.gid) << 32), packet.c, MunmapFlags::from_bits_truncate(packet.d)), - _ => Err(Error::new(ENOSYS)) }; @@ -76,10 +81,6 @@ fn open(&self, path: &str, flags: usize, uid: u32, gid: u32) -> Result { Err(Error::new(ENOENT)) } - #[allow(unused_variables)] - fn xopen(&self, path: &str, flags: usize, ctx: &CallerCtx) -> Result { - convert_to_this_scheme(self.open(path, flags, ctx.uid, ctx.gid)) - } #[allow(unused_variables)] fn chmod(&self, path: &str, mode: u16, uid: u32, gid: u32) -> Result { @@ -103,11 +104,6 @@ } #[allow(unused_variables)] - fn xdup(&self, old_id: usize, buf: &[u8], ctx: &CallerCtx) -> Result { - convert_to_this_scheme(self.dup(old_id, buf)) - } - - #[allow(unused_variables)] fn read(&self, id: usize, buf: &mut [u8]) -> Result { Err(Error::new(EBADF)) } @@ -143,6 +139,32 @@ } #[allow(unused_variables)] + fn fmap_old(&self, id: usize, map: &OldMap) -> Result { + Err(Error::new(EBADF)) + } + #[allow(unused_variables)] + fn fmap(&self, id: usize, map: &Map) -> Result { + if map.flags.contains(MapFlags::MAP_FIXED) { + return Err(Error::new(EINVAL)); + } + self.fmap_old(id, &OldMap { + offset: map.offset, + size: map.size, + flags: map.flags, + }) + } + + #[allow(unused_variables)] + fn funmap_old(&self, address: usize) -> Result { + Ok(0) + } + + #[allow(unused_variables)] + fn funmap(&self, address: usize, length: usize) -> Result { + Ok(0) + } + + #[allow(unused_variables)] fn fpath(&self, id: usize, buf: &mut [u8]) -> Result { Err(Error::new(EBADF)) } @@ -181,14 +203,4 @@ fn close(&self, id: usize) -> Result { Err(Error::new(EBADF)) } - - #[allow(unused_variables)] - fn mmap_prep(&self, id: usize, offset: u64, size: usize, flags: MapFlags) -> Result { - Err(Error::new(EOPNOTSUPP)) - } - - #[allow(unused_variables)] - fn munmap(&self, id: usize, offset: u64, size: usize, flags: MunmapFlags) -> Result { - Err(Error::new(EOPNOTSUPP)) - } } diff -Nru temporalio-1.3.0/vendor/redox_syscall/src/tests.rs temporalio-1.3.0/vendor/redox_syscall/src/tests.rs --- temporalio-1.3.0/vendor/redox_syscall/src/tests.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/redox_syscall/src/tests.rs 2023-10-30 19:40:00.000000000 +0000 @@ -287,6 +287,32 @@ //TODO: physunmap +#[test] +fn pipe2() { + let mut fds = [0, 0]; + assert_eq!(dbg!(crate::pipe2(&mut fds, crate::O_CLOEXEC)), Ok(0)); + assert_ne!(dbg!(fds), [0, 0]); + + { + let mut buf = [0; 256]; + for i in 0..buf.len() { + buf[i] = i as u8; + } + assert_eq!(dbg!(crate::write(fds[1], &buf)), Ok(buf.len())); + } + + { + let mut buf = [0; 256]; + assert_eq!(dbg!(crate::read(fds[0], &mut buf)), Ok(buf.len())); + for i in 0..buf.len() { + assert_eq!(buf[i], i as u8); + } + } + + assert_eq!(dbg!(crate::close(fds[0])), Ok(0)); + assert_eq!(dbg!(crate::close(fds[1])), Ok(0)); +} + //TODO: read #[test] diff -Nru temporalio-1.3.0/vendor/redox_syscall-0.3.5/.cargo-checksum.json temporalio-1.3.0/vendor/redox_syscall-0.3.5/.cargo-checksum.json --- temporalio-1.3.0/vendor/redox_syscall-0.3.5/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/redox_syscall-0.3.5/.cargo-checksum.json 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -{"files":{"Cargo.toml":"80db3d7e545f9b8a04804e634948c6e80c712f051680b2e7a39ddb848c200151","LICENSE":"efcfee7981ff72431fffb06925cad00a23dce079ed4354f61030ad5abdb78829","README.md":"9161f18ba7f69b4ca51e844aee8ffb8237513a468c5c3b1f3a5f989044f895ac","src/arch/aarch64.rs":"9b4cf7da1f001ce54bfd01b7a001dbc8043c1ef89823781a2a1070e2c096a9ce","src/arch/nonredox.rs":"1055cd441f4b95c9ec428222a7796c7fac953a8a500ca08173743ea95220aab3","src/arch/riscv64.rs":"20bf9a8db779059773b113643d0cb3737fbb5d57f45ee39b8ae9d3396b6ef636","src/arch/x86.rs":"cf01f4d798e8861ad5b9429714c947e2d7c53a3cb9a13d53dc7a38e4bdad4101","src/arch/x86_64.rs":"fd80c9a412d07c85f2b942f36de364edfff7cd49f6c00c043e69becb7c76119f","src/call.rs":"141bdb2cb64dc118beadf40fc8180cd32e41841c8d7db71aed646a5a8ab9fac3","src/data.rs":"bd4545d4c2fcc59ff26ae52ad7f773a697d5ccf639a2ffc253cece6b31e94d51","src/error.rs":"ef20f3817f997a1aeb7114628407f19cb8bc13c555d4e093918f38a5d098f798","src/flag.rs":"aad91126a0bb3413cd103fc38b457aa4d1f6b949605e3ae249aea0dfec8504ff","src/io/dma.rs":"85577342547afaac0dc46740dfeb9d2e4239d8809b86748c3fcaa12f922b1c9d","src/io/io.rs":"e1d454ff47efac70fdaa709251a5a9c1c5637f931994ba3bf6a38c6db9145822","src/io/mmio.rs":"12d0fb4d4f45097bf2c14f73cb1ce21325eae193b537e9f18af73ed5281b5e63","src/io/mod.rs":"79c2fce4fd6d75f3b9169df64b7a605feff31fab2e5ed81984ae085a1d07c0c4","src/io/pio.rs":"9ee6f2229b700d1c45b4c8c6242bd99fe69634e16dcd5843d9e8d1c958047406","src/lib.rs":"25c9f35cf709e7e50336ae12f0390f968cc11515f93b6d757825a7b7725eeadb","src/number.rs":"773d9f55a98c6ae5b4cb08b396568f05f8d9b187a7609b7a1c5dd940f6ee674a","src/scheme/generate.sh":"dde4e30f4e0223fb1a24ed486a6c36e624c854dbf890862cb6866f4fa3c7a6eb","src/scheme/mod.rs":"cb622405deb0aef4ab04499ea1adfd338c9c5dd9c31a1fe9989786dbf69b49d8","src/scheme/scheme.rs":"2e27e08e3b9005a5705fadd10a6160a570322c873d1b6477f269e0beae35f046","src/scheme/scheme_block.rs":"a8d0137e106dcb605367bfc6a22b83317142996b7e410c832de0f63a423d5305","src/scheme/scheme_block_mut.rs":"b6cea44a3e79dd6c30b4280b6913a215628918978451efe11f31b0d7eddd44a5","src/scheme/scheme_mut.rs":"e77da9d5208de101c126eca9fa685f2b78a5ddc4890ad5f5f4d79ded3bbd8fbd","src/scheme/seek.rs":"94e044de47b0f00eb0c2aea3fb21001ac2b9aa1e4b20d73fd54163fe92fa63f7","src/tests.rs":"b44de69251d6bcc1cb796147a1212fffd3ac7d5796d9a0d2265db0aac8a909df"},"package":"567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/redox_syscall-0.3.5/Cargo.toml temporalio-1.3.0/vendor/redox_syscall-0.3.5/Cargo.toml --- temporalio-1.3.0/vendor/redox_syscall-0.3.5/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/redox_syscall-0.3.5/Cargo.toml 1970-01-01 00:00:00.000000000 +0000 @@ -1,38 +0,0 @@ -# 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 = "redox_syscall" -version = "0.3.5" -authors = ["Jeremy Soller "] -description = "A Rust library to access raw Redox system calls" -documentation = "https://docs.rs/redox_syscall" -readme = "README.md" -license = "MIT" -repository = "https://gitlab.redox-os.org/redox-os/syscall" - -[lib] -name = "syscall" - -[dependencies.bitflags] -version = "1.1.0" - -[dependencies.core] -version = "1.0.0" -optional = true -package = "rustc-std-workspace-core" - -[features] -rustc-dep-of-std = [ - "core", - "bitflags/rustc-dep-of-std", -] diff -Nru temporalio-1.3.0/vendor/redox_syscall-0.3.5/LICENSE temporalio-1.3.0/vendor/redox_syscall-0.3.5/LICENSE --- temporalio-1.3.0/vendor/redox_syscall-0.3.5/LICENSE 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/redox_syscall-0.3.5/LICENSE 1970-01-01 00:00:00.000000000 +0000 @@ -1,22 +0,0 @@ -Copyright (c) 2017 Redox OS Developers - -MIT License - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff -Nru temporalio-1.3.0/vendor/redox_syscall-0.3.5/README.md temporalio-1.3.0/vendor/redox_syscall-0.3.5/README.md --- temporalio-1.3.0/vendor/redox_syscall-0.3.5/README.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/redox_syscall-0.3.5/README.md 1970-01-01 00:00:00.000000000 +0000 @@ -1,6 +0,0 @@ -# syscall -[Redox OS](https://gitlab.redox-os.org/redox-os/redox)'s syscall API - -[![MIT licensed](https://img.shields.io/badge/license-MIT-blue.svg)](./LICENSE) -[![crates.io](http://meritbadge.herokuapp.com/redox_syscall)](https://crates.io/crates/redox_syscall) -[![docs.rs](https://docs.rs/redox_syscall/badge.svg)](https://docs.rs/redox_syscall) diff -Nru temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/arch/aarch64.rs temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/arch/aarch64.rs --- temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/arch/aarch64.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/arch/aarch64.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,150 +0,0 @@ -use core::{mem, slice}; -use core::ops::{Deref, DerefMut}; - -use super::error::{Error, Result}; - -pub const PAGE_SIZE: usize = 4096; - -macro_rules! syscall { - ($($name:ident($a:ident, $($b:ident, $($c:ident, $($d:ident, $($e:ident, $($f:ident, )?)?)?)?)?);)+) => { - $( - pub unsafe fn $name($a: usize, $($b: usize, $($c: usize, $($d: usize, $($e: usize, $($f: usize)?)?)?)?)?) -> Result { - let ret: usize; - - core::arch::asm!( - "svc 0", - in("x8") $a, - $( - in("x0") $b, - $( - in("x1") $c, - $( - in("x2") $d, - $( - in("x3") $e, - $( - in("x4") $f, - )? - )? - )? - )? - )? - lateout("x0") ret, - options(nostack), - ); - - Error::demux(ret) - } - )+ - }; -} - -syscall! { - syscall0(a,); - syscall1(a, b,); - syscall2(a, b, c,); - syscall3(a, b, c, d,); - syscall4(a, b, c, d, e,); - syscall5(a, b, c, d, e, f,); -} - -#[derive(Copy, Clone, Debug, Default)] -#[repr(C)] -pub struct IntRegisters { - pub x30: usize, - pub x29: usize, - pub x28: usize, - pub x27: usize, - pub x26: usize, - pub x25: usize, - pub x24: usize, - pub x23: usize, - pub x22: usize, - pub x21: usize, - pub x20: usize, - pub x19: usize, - pub x18: usize, - pub x17: usize, - pub x16: usize, - pub x15: usize, - pub x14: usize, - pub x13: usize, - pub x12: usize, - pub x11: usize, - pub x10: usize, - pub x9: usize, - pub x8: usize, - pub x7: usize, - pub x6: usize, - pub x5: usize, - pub x4: usize, - pub x3: usize, - pub x2: usize, - pub x1: usize, - pub x0: usize -} - -impl Deref for IntRegisters { - type Target = [u8]; - fn deref(&self) -> &[u8] { - unsafe { - slice::from_raw_parts(self as *const IntRegisters as *const u8, mem::size_of::()) - } - } -} - -impl DerefMut for IntRegisters { - fn deref_mut(&mut self) -> &mut [u8] { - unsafe { - slice::from_raw_parts_mut(self as *mut IntRegisters as *mut u8, mem::size_of::()) - } - } -} - -#[derive(Clone, Copy, Debug, Default)] -#[repr(packed)] -pub struct FloatRegisters { - pub fp_simd_regs: [u128; 32], - pub fpsr: u32, - pub fpcr: u32 -} - -impl Deref for FloatRegisters { - type Target = [u8]; - fn deref(&self) -> &[u8] { - unsafe { - slice::from_raw_parts(self as *const FloatRegisters as *const u8, mem::size_of::()) - } - } -} - -impl DerefMut for FloatRegisters { - fn deref_mut(&mut self) -> &mut [u8] { - unsafe { - slice::from_raw_parts_mut(self as *mut FloatRegisters as *mut u8, mem::size_of::()) - } - } -} - -#[derive(Clone, Copy, Debug, Default)] -#[repr(packed)] -pub struct EnvRegisters { - pub tpidr_el0: usize, - pub tpidrro_el0: usize, -} -impl Deref for EnvRegisters { - type Target = [u8]; - fn deref(&self) -> &[u8] { - unsafe { - slice::from_raw_parts(self as *const EnvRegisters as *const u8, mem::size_of::()) - } - } -} - -impl DerefMut for EnvRegisters { - fn deref_mut(&mut self) -> &mut [u8] { - unsafe { - slice::from_raw_parts_mut(self as *mut EnvRegisters as *mut u8, mem::size_of::()) - } - } -} diff -Nru temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/arch/nonredox.rs temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/arch/nonredox.rs --- temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/arch/nonredox.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/arch/nonredox.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,29 +0,0 @@ -use super::error::{Error, Result, ENOSYS}; - -// Doesn't really matter, but since we will most likely run on an x86_64 host, why not 4096? -pub const PAGE_SIZE: usize = 4096; - -pub unsafe fn syscall0(_a: usize) -> Result { - Err(Error::new(ENOSYS)) -} - -pub unsafe fn syscall1(_a: usize, _b: usize) -> Result { - Err(Error::new(ENOSYS)) -} - -pub unsafe fn syscall2(_a: usize, _b: usize, _c: usize) -> Result { - Err(Error::new(ENOSYS)) -} - -pub unsafe fn syscall3(_a: usize, _b: usize, _c: usize, _d: usize) -> Result { - Err(Error::new(ENOSYS)) -} - -pub unsafe fn syscall4(_a: usize, _b: usize, _c: usize, _d: usize, _e: usize) -> Result { - Err(Error::new(ENOSYS)) -} - -pub unsafe fn syscall5(_a: usize, _b: usize, _c: usize, _d: usize, _e: usize, _f: usize) - -> Result { - Err(Error::new(ENOSYS)) -} diff -Nru temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/arch/riscv64.rs temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/arch/riscv64.rs --- temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/arch/riscv64.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/arch/riscv64.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,93 +0,0 @@ -use core::{mem, slice}; -use core::ops::{Deref, DerefMut}; - -use super::error::{Error, Result}; - -macro_rules! syscall { - ($($name:ident($a:ident, $($b:ident, $($c:ident, $($d:ident, $($e:ident, $($f:ident, )?)?)?)?)?);)+) => { - $( - pub unsafe fn $name($a: usize, $($b: usize, $($c: usize, $($d: usize, $($e: usize, $($f: usize)?)?)?)?)?) -> Result { - let ret: usize; - - asm!( - "ecall", - in("a7") $a, - $( - in("a0") $b, - $( - in("a1") $c, - $( - in("a2") $d, - $( - in("a3") $e, - $( - in("a4") $f, - )? - )? - )? - )? - )? - lateout("a0") ret, - options(nostack), - ); - - Error::demux(ret) - } - )+ - }; -} - -syscall! { - syscall0(a,); - syscall1(a, b,); - syscall2(a, b, c,); - syscall3(a, b, c, d,); - syscall4(a, b, c, d, e,); - syscall5(a, b, c, d, e, f,); -} - -#[derive(Copy, Clone, Debug, Default)] -#[repr(C)] -pub struct IntRegisters { - //TODO -} - -impl Deref for IntRegisters { - type Target = [u8]; - fn deref(&self) -> &[u8] { - unsafe { - slice::from_raw_parts(self as *const IntRegisters as *const u8, mem::size_of::()) - } - } -} - -impl DerefMut for IntRegisters { - fn deref_mut(&mut self) -> &mut [u8] { - unsafe { - slice::from_raw_parts_mut(self as *mut IntRegisters as *mut u8, mem::size_of::()) - } - } -} - -#[derive(Clone, Copy, Debug, Default)] -#[repr(packed)] -pub struct FloatRegisters { - //TODO -} - -impl Deref for FloatRegisters { - type Target = [u8]; - fn deref(&self) -> &[u8] { - unsafe { - slice::from_raw_parts(self as *const FloatRegisters as *const u8, mem::size_of::()) - } - } -} - -impl DerefMut for FloatRegisters { - fn deref_mut(&mut self) -> &mut [u8] { - unsafe { - slice::from_raw_parts_mut(self as *mut FloatRegisters as *mut u8, mem::size_of::()) - } - } -} diff -Nru temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/arch/x86_64.rs temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/arch/x86_64.rs --- temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/arch/x86_64.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/arch/x86_64.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,157 +0,0 @@ -use core::{mem, slice}; -use core::arch::asm; -use core::ops::{Deref, DerefMut}; - -use super::error::{Error, Result}; - -pub const PAGE_SIZE: usize = 4096; - -macro_rules! syscall { - ($($name:ident($a:ident, $($b:ident, $($c:ident, $($d:ident, $($e:ident, $($f:ident, )?)?)?)?)?);)+) => { - $( - pub unsafe fn $name(mut $a: usize, $($b: usize, $($c: usize, $($d: usize, $($e: usize, $($f: usize)?)?)?)?)?) -> Result { - asm!( - "syscall", - inout("rax") $a, - $( - in("rdi") $b, - $( - in("rsi") $c, - $( - in("rdx") $d, - $( - in("r10") $e, - $( - in("r8") $f, - )? - )? - )? - )? - )? - out("rcx") _, - out("r11") _, - options(nostack), - ); - - Error::demux($a) - } - )+ - }; -} - -syscall! { - syscall0(a,); - syscall1(a, b,); - syscall2(a, b, c,); - syscall3(a, b, c, d,); - syscall4(a, b, c, d, e,); - syscall5(a, b, c, d, e, f,); -} - -#[derive(Copy, Clone, Debug, Default)] -#[repr(C)] -pub struct IntRegisters { - // TODO: Some of these don't get set by Redox yet. Should they? - - pub r15: usize, - pub r14: usize, - pub r13: usize, - pub r12: usize, - pub rbp: usize, - pub rbx: usize, - pub r11: usize, - pub r10: usize, - pub r9: usize, - pub r8: usize, - pub rax: usize, - pub rcx: usize, - pub rdx: usize, - pub rsi: usize, - pub rdi: usize, - // pub orig_rax: usize, - pub rip: usize, - pub cs: usize, - pub rflags: usize, - pub rsp: usize, - pub ss: usize, - // pub fs_base: usize, - // pub gs_base: usize, - // pub ds: usize, - // pub es: usize, - pub fs: usize, - // pub gs: usize -} - -impl Deref for IntRegisters { - type Target = [u8]; - fn deref(&self) -> &[u8] { - unsafe { - slice::from_raw_parts(self as *const IntRegisters as *const u8, mem::size_of::()) - } - } -} - -impl DerefMut for IntRegisters { - fn deref_mut(&mut self) -> &mut [u8] { - unsafe { - slice::from_raw_parts_mut(self as *mut IntRegisters as *mut u8, mem::size_of::()) - } - } -} - -#[derive(Clone, Copy, Debug, Default)] -#[repr(packed)] -pub struct FloatRegisters { - pub fcw: u16, - pub fsw: u16, - pub ftw: u8, - pub _reserved: u8, - pub fop: u16, - pub fip: u64, - pub fdp: u64, - pub mxcsr: u32, - pub mxcsr_mask: u32, - pub st_space: [u128; 8], - pub xmm_space: [u128; 16], - // TODO: YMM/ZMM -} - -impl Deref for FloatRegisters { - type Target = [u8]; - fn deref(&self) -> &[u8] { - unsafe { - slice::from_raw_parts(self as *const FloatRegisters as *const u8, mem::size_of::()) - } - } -} - -impl DerefMut for FloatRegisters { - fn deref_mut(&mut self) -> &mut [u8] { - unsafe { - slice::from_raw_parts_mut(self as *mut FloatRegisters as *mut u8, mem::size_of::()) - } - } -} -#[derive(Clone, Copy, Debug, Default)] -#[repr(packed)] -pub struct EnvRegisters { - pub fsbase: u64, - pub gsbase: u64, - // TODO: PKRU? -} -impl Deref for EnvRegisters { - type Target = [u8]; - fn deref(&self) -> &[u8] { - unsafe { - slice::from_raw_parts(self as *const EnvRegisters as *const u8, mem::size_of::()) - } - } -} - -impl DerefMut for EnvRegisters { - fn deref_mut(&mut self) -> &mut [u8] { - unsafe { - slice::from_raw_parts_mut(self as *mut EnvRegisters as *mut u8, mem::size_of::()) - } - } -} diff -Nru temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/arch/x86.rs temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/arch/x86.rs --- temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/arch/x86.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/arch/x86.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,184 +0,0 @@ -use core::{mem, slice}; -use core::arch::asm; -use core::ops::{Deref, DerefMut}; - -use super::error::{Error, Result}; - -pub const PAGE_SIZE: usize = 4096; - -macro_rules! syscall { - ($($name:ident($a:ident, $($b:ident, $($c:ident, $($d:ident, $($e:ident, $($f:ident, )?)?)?)?)?);)+) => { - $( - pub unsafe fn $name(mut $a: usize, $($b: usize, $($c: usize, $($d: usize, $($e: usize, $($f: usize)?)?)?)?)?) -> Result { - asm!( - "int 0x80", - inout("eax") $a, - $( - in("ebx") $b, - $( - in("ecx") $c, - $( - in("edx") $d, - $( - in("esi") $e, - $( - in("edi") $f, - )? - )? - )? - )? - )? - options(nostack), - ); - - Error::demux($a) - } - )+ - }; -} - -syscall! { - syscall0(a,); - syscall1(a, b,); - syscall2(a, b, c,); - syscall3(a, b, c, d,); - // Must be done custom because LLVM reserves ESI - //syscall4(a, b, c, d, e,); - //syscall5(a, b, c, d, e, f,); -} - -pub unsafe fn syscall4(mut a: usize, b: usize, c: usize, d: usize, e: usize) - -> Result { - asm!( - "xchg esi, {e} - int 0x80 - xchg esi, {e}", - e = in(reg) e, - inout("eax") a, - in("ebx") b, - in("ecx") c, - in("edx") d, - options(nostack), - ); - - Error::demux(a) -} - -pub unsafe fn syscall5(mut a: usize, b: usize, c: usize, d: usize, e: usize, f: usize) - -> Result { - asm!( - "xchg esi, {e} - int 0x80 - xchg esi, {e}", - e = in(reg) e, - inout("eax") a, - in("ebx") b, - in("ecx") c, - in("edx") d, - in("edi") f, - options(nostack), - ); - - Error::demux(a) -} - -#[derive(Copy, Clone, Debug, Default)] -#[repr(C)] -pub struct IntRegisters { - // TODO: Some of these don't get set by Redox yet. Should they? - - pub ebp: usize, - pub esi: usize, - pub edi: usize, - pub ebx: usize, - pub eax: usize, - pub ecx: usize, - pub edx: usize, - // pub orig_rax: usize, - pub eip: usize, - pub cs: usize, - pub eflags: usize, - pub esp: usize, - pub ss: usize, - // pub fs_base: usize, - // pub gs_base: usize, - // pub ds: usize, - // pub es: usize, - pub fs: usize, - // pub gs: usize -} - -impl Deref for IntRegisters { - type Target = [u8]; - fn deref(&self) -> &[u8] { - unsafe { - slice::from_raw_parts(self as *const IntRegisters as *const u8, mem::size_of::()) - } - } -} - -impl DerefMut for IntRegisters { - fn deref_mut(&mut self) -> &mut [u8] { - unsafe { - slice::from_raw_parts_mut(self as *mut IntRegisters as *mut u8, mem::size_of::()) - } - } -} - -#[derive(Clone, Copy, Debug, Default)] -#[repr(packed)] -pub struct FloatRegisters { - pub fcw: u16, - pub fsw: u16, - pub ftw: u8, - pub _reserved: u8, - pub fop: u16, - pub fip: u64, - pub fdp: u64, - pub mxcsr: u32, - pub mxcsr_mask: u32, - pub st_space: [u128; 8], - pub xmm_space: [u128; 16], - // TODO: YMM/ZMM -} - -impl Deref for FloatRegisters { - type Target = [u8]; - fn deref(&self) -> &[u8] { - unsafe { - slice::from_raw_parts(self as *const FloatRegisters as *const u8, mem::size_of::()) - } - } -} - -impl DerefMut for FloatRegisters { - fn deref_mut(&mut self) -> &mut [u8] { - unsafe { - slice::from_raw_parts_mut(self as *mut FloatRegisters as *mut u8, mem::size_of::()) - } - } -} - -#[derive(Clone, Copy, Debug, Default)] -#[repr(packed)] -pub struct EnvRegisters { - pub fsbase: u32, - pub gsbase: u32, -} - -impl Deref for EnvRegisters { - type Target = [u8]; - fn deref(&self) -> &[u8] { - unsafe { - slice::from_raw_parts(self as *const EnvRegisters as *const u8, mem::size_of::()) - } - } -} - -impl DerefMut for EnvRegisters { - fn deref_mut(&mut self) -> &mut [u8] { - unsafe { - slice::from_raw_parts_mut(self as *mut EnvRegisters as *mut u8, mem::size_of::()) - } - } -} diff -Nru temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/call.rs temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/call.rs --- temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/call.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/call.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,379 +0,0 @@ -use super::arch::*; -use super::data::{Map, SigAction, Stat, StatVfs, TimeSpec}; -use super::error::Result; -use super::flag::*; -use super::number::*; - -use core::{mem, ptr}; - -// Signal restorer -extern "C" fn restorer() -> ! { - sigreturn().unwrap(); - unreachable!(); -} - -/// Close a file -pub fn close(fd: usize) -> Result { - unsafe { syscall1(SYS_CLOSE, fd) } -} - -/// Get the current system time -pub fn clock_gettime(clock: usize, tp: &mut TimeSpec) -> Result { - unsafe { syscall2(SYS_CLOCK_GETTIME, clock, tp as *mut TimeSpec as usize) } -} - -/// Copy and transform a file descriptor -pub fn dup(fd: usize, buf: &[u8]) -> Result { - unsafe { syscall3(SYS_DUP, fd, buf.as_ptr() as usize, buf.len()) } -} - -/// Copy and transform a file descriptor -pub fn dup2(fd: usize, newfd: usize, buf: &[u8]) -> Result { - unsafe { syscall4(SYS_DUP2, fd, newfd, buf.as_ptr() as usize, buf.len()) } -} - -/// Exit the current process -pub fn exit(status: usize) -> Result { - unsafe { syscall1(SYS_EXIT, status) } -} - -/// Change file permissions -pub fn fchmod(fd: usize, mode: u16) -> Result { - unsafe { syscall2(SYS_FCHMOD, fd, mode as usize) } - -} - -/// Change file ownership -pub fn fchown(fd: usize, uid: u32, gid: u32) -> Result { - unsafe { syscall3(SYS_FCHOWN, fd, uid as usize, gid as usize) } - -} - -/// Change file descriptor flags -pub fn fcntl(fd: usize, cmd: usize, arg: usize) -> Result { - unsafe { syscall3(SYS_FCNTL, fd, cmd, arg) } -} - -/// Map a file into memory, but with the ability to set the address to map into, either as a hint -/// or as a requirement of the map. -/// -/// # Errors -/// `EACCES` - the file descriptor was not open for reading -/// `EBADF` - if the file descriptor was invalid -/// `ENODEV` - mmapping was not supported -/// `EINVAL` - invalid combination of flags -/// `EEXIST` - if [`MapFlags::MAP_FIXED`] was set, and the address specified was already in use. -/// -pub unsafe fn fmap(fd: usize, map: &Map) -> Result { - syscall3(SYS_FMAP, fd, map as *const Map as usize, mem::size_of::()) -} - -/// Unmap whole (or partial) continous memory-mapped files -pub unsafe fn funmap(addr: usize, len: usize) -> Result { - syscall2(SYS_FUNMAP, addr, len) -} - -/// Retrieve the canonical path of a file -pub fn fpath(fd: usize, buf: &mut [u8]) -> Result { - unsafe { syscall3(SYS_FPATH, fd, buf.as_mut_ptr() as usize, buf.len()) } -} - -/// Rename a file -pub fn frename>(fd: usize, path: T) -> Result { - unsafe { syscall3(SYS_FRENAME, fd, path.as_ref().as_ptr() as usize, path.as_ref().len()) } -} - -/// Get metadata about a file -pub fn fstat(fd: usize, stat: &mut Stat) -> Result { - unsafe { syscall3(SYS_FSTAT, fd, stat as *mut Stat as usize, mem::size_of::()) } -} - -/// Get metadata about a filesystem -pub fn fstatvfs(fd: usize, stat: &mut StatVfs) -> Result { - unsafe { syscall3(SYS_FSTATVFS, fd, stat as *mut StatVfs as usize, mem::size_of::()) } -} - -/// Sync a file descriptor to its underlying medium -pub fn fsync(fd: usize) -> Result { - unsafe { syscall1(SYS_FSYNC, fd) } -} - -/// Truncate or extend a file to a specified length -pub fn ftruncate(fd: usize, len: usize) -> Result { - unsafe { syscall2(SYS_FTRUNCATE, fd, len) } -} - -// Change modify and/or access times -pub fn futimens(fd: usize, times: &[TimeSpec]) -> Result { - unsafe { syscall3(SYS_FUTIMENS, fd, times.as_ptr() as usize, times.len() * mem::size_of::()) } -} - -/// Fast userspace mutex -pub unsafe fn futex(addr: *mut i32, op: usize, val: i32, val2: usize, addr2: *mut i32) - -> Result { - syscall5(SYS_FUTEX, addr as usize, op, (val as isize) as usize, val2, addr2 as usize) -} - -/// Get the effective group ID -pub fn getegid() -> Result { - unsafe { syscall0(SYS_GETEGID) } -} - -/// Get the effective namespace -pub fn getens() -> Result { - unsafe { syscall0(SYS_GETENS) } -} - -/// Get the effective user ID -pub fn geteuid() -> Result { - unsafe { syscall0(SYS_GETEUID) } -} - -/// Get the current group ID -pub fn getgid() -> Result { - unsafe { syscall0(SYS_GETGID) } -} - -/// Get the current namespace -pub fn getns() -> Result { - unsafe { syscall0(SYS_GETNS) } -} - -/// Get the current process ID -pub fn getpid() -> Result { - unsafe { syscall0(SYS_GETPID) } -} - -/// Get the process group ID -pub fn getpgid(pid: usize) -> Result { - unsafe { syscall1(SYS_GETPGID, pid) } -} - -/// Get the parent process ID -pub fn getppid() -> Result { - unsafe { syscall0(SYS_GETPPID) } -} - -/// Get the current user ID -pub fn getuid() -> Result { - unsafe { syscall0(SYS_GETUID) } -} - -/// Set the I/O privilege level -/// -/// # Errors -/// -/// * `EPERM` - `uid != 0` -/// * `EINVAL` - `level > 3` -pub unsafe fn iopl(level: usize) -> Result { - syscall1(SYS_IOPL, level) -} - -/// Send a signal `sig` to the process identified by `pid` -pub fn kill(pid: usize, sig: usize) -> Result { - unsafe { syscall2(SYS_KILL, pid, sig) } -} - -/// Create a link to a file -pub unsafe fn link(old: *const u8, new: *const u8) -> Result { - syscall2(SYS_LINK, old as usize, new as usize) -} - -/// Seek to `offset` bytes in a file descriptor -pub fn lseek(fd: usize, offset: isize, whence: usize) -> Result { - unsafe { syscall3(SYS_LSEEK, fd, offset as usize, whence) } -} - -/// Make a new scheme namespace -pub fn mkns(schemes: &[[usize; 2]]) -> Result { - unsafe { syscall2(SYS_MKNS, schemes.as_ptr() as usize, schemes.len()) } -} - -/// Change mapping flags -pub unsafe fn mprotect(addr: usize, size: usize, flags: MapFlags) -> Result { - syscall3(SYS_MPROTECT, addr, size, flags.bits()) -} - -/// Sleep for the time specified in `req` -pub fn nanosleep(req: &TimeSpec, rem: &mut TimeSpec) -> Result { - unsafe { syscall2(SYS_NANOSLEEP, req as *const TimeSpec as usize, - rem as *mut TimeSpec as usize) } -} - -/// Open a file -pub fn open>(path: T, flags: usize) -> Result { - unsafe { syscall3(SYS_OPEN, path.as_ref().as_ptr() as usize, path.as_ref().len(), flags) } -} - -/// Allocate frames, linearly in physical memory. -/// -/// # Errors -/// -/// * `EPERM` - `uid != 0` -/// * `ENOMEM` - the system has run out of available memory -pub unsafe fn physalloc(size: usize) -> Result { - syscall1(SYS_PHYSALLOC, size) -} - -/// Allocate frames, linearly in physical memory, with an extra set of flags. If the flags contain -/// [`PARTIAL_ALLOC`], this will result in `physalloc3` with `min = 1`. -/// -/// Refer to the simpler [`physalloc`] and the more complex [`physalloc3`], that this convenience -/// function is based on. -/// -/// # Errors -/// -/// * `EPERM` - `uid != 0` -/// * `ENOMEM` - the system has run out of available memory -pub unsafe fn physalloc2(size: usize, flags: usize) -> Result { - let mut ret = 1usize; - physalloc3(size, flags, &mut ret) -} - -/// Allocate frames, linearly in physical memory, with an extra set of flags. If the flags contain -/// [`PARTIAL_ALLOC`], the `min` parameter specifies the number of frames that have to be allocated -/// for this operation to succeed. The return value is the offset of the first frame, and `min` is -/// overwritten with the number of frames actually allocated. -/// -/// Refer to the simpler [`physalloc`] and the simpler library function [`physalloc2`]. -/// -/// # Errors -/// -/// * `EPERM` - `uid != 0` -/// * `ENOMEM` - the system has run out of available memory -/// * `EINVAL` - `min = 0` -pub unsafe fn physalloc3(size: usize, flags: usize, min: &mut usize) -> Result { - syscall3(SYS_PHYSALLOC3, size, flags, min as *mut usize as usize) -} - -/// Free physically allocated pages -/// -/// # Errors -/// -/// * `EPERM` - `uid != 0` -pub unsafe fn physfree(physical_address: usize, size: usize) -> Result { - syscall2(SYS_PHYSFREE, physical_address, size) -} - -/// Map physical memory to virtual memory -/// -/// # Errors -/// -/// * `EPERM` - `uid != 0` -pub unsafe fn physmap(physical_address: usize, size: usize, flags: PhysmapFlags) -> Result { - syscall3(SYS_PHYSMAP, physical_address, size, flags.bits()) -} - -/// Unmap previously mapped physical memory -/// -/// # Errors -/// -/// * `EPERM` - `uid != 0` -/// * `EFAULT` - `virtual_address` has not been mapped -pub unsafe fn physunmap(virtual_address: usize) -> Result { - syscall1(SYS_PHYSUNMAP, virtual_address) -} - -/// Create a pair of file descriptors referencing the read and write ends of a pipe -pub fn pipe2(fds: &mut [usize; 2], flags: usize) -> Result { - unsafe { syscall2(SYS_PIPE2, fds.as_ptr() as usize, flags) } -} - -/// Read from a file descriptor into a buffer -pub fn read(fd: usize, buf: &mut [u8]) -> Result { - unsafe { syscall3(SYS_READ, fd, buf.as_mut_ptr() as usize, buf.len()) } -} - -/// Remove a directory -pub fn rmdir>(path: T) -> Result { - unsafe { syscall2(SYS_RMDIR, path.as_ref().as_ptr() as usize, path.as_ref().len()) } -} - -/// Set the process group ID -pub fn setpgid(pid: usize, pgid: usize) -> Result { - unsafe { syscall2(SYS_SETPGID, pid, pgid) } -} - -/// Set the current process group IDs -pub fn setregid(rgid: usize, egid: usize) -> Result { - unsafe { syscall2(SYS_SETREGID, rgid, egid) } -} - -/// Make a new scheme namespace -pub fn setrens(rns: usize, ens: usize) -> Result { - unsafe { syscall2(SYS_SETRENS, rns, ens) } -} - -/// Set the current process user IDs -pub fn setreuid(ruid: usize, euid: usize) -> Result { - unsafe { syscall2(SYS_SETREUID, ruid, euid) } -} - -/// Set up a signal handler -pub fn sigaction(sig: usize, act: Option<&SigAction>, oldact: Option<&mut SigAction>) -> Result { - unsafe { syscall4(SYS_SIGACTION, sig, - act.map(|x| x as *const _).unwrap_or_else(ptr::null) as usize, - oldact.map(|x| x as *mut _).unwrap_or_else(ptr::null_mut) as usize, - restorer as usize) } -} - -/// Get and/or set signal masks -pub fn sigprocmask(how: usize, set: Option<&[u64; 2]>, oldset: Option<&mut [u64; 2]>) -> Result { - unsafe { syscall3(SYS_SIGPROCMASK, how, - set.map(|x| x as *const _).unwrap_or_else(ptr::null) as usize, - oldset.map(|x| x as *mut _).unwrap_or_else(ptr::null_mut) as usize) } -} - -// Return from signal handler -pub fn sigreturn() -> Result { - unsafe { syscall0(SYS_SIGRETURN) } -} - -/// Set the file mode creation mask -pub fn umask(mask: usize) -> Result { - unsafe { syscall1(SYS_UMASK, mask) } -} - -/// Remove a file -pub fn unlink>(path: T) -> Result { - unsafe { syscall2(SYS_UNLINK, path.as_ref().as_ptr() as usize, path.as_ref().len()) } -} - -/// Convert a virtual address to a physical one -/// -/// # Errors -/// -/// * `EPERM` - `uid != 0` -pub unsafe fn virttophys(virtual_address: usize) -> Result { - syscall1(SYS_VIRTTOPHYS, virtual_address) -} - -/// Check if a child process has exited or received a signal -pub fn waitpid(pid: usize, status: &mut usize, options: WaitFlags) -> Result { - unsafe { syscall3(SYS_WAITPID, pid, status as *mut usize as usize, options.bits()) } -} - -/// Write a buffer to a file descriptor -/// -/// The kernel will attempt to write the bytes in `buf` to the file descriptor `fd`, returning -/// either an `Err`, explained below, or `Ok(count)` where `count` is the number of bytes which -/// were written. -/// -/// # Errors -/// -/// * `EAGAIN` - the file descriptor was opened with `O_NONBLOCK` and writing would block -/// * `EBADF` - the file descriptor is not valid or is not open for writing -/// * `EFAULT` - `buf` does not point to the process's addressible memory -/// * `EIO` - an I/O error occurred -/// * `ENOSPC` - the device containing the file descriptor has no room for data -/// * `EPIPE` - the file descriptor refers to a pipe or socket whose reading end is closed -pub fn write(fd: usize, buf: &[u8]) -> Result { - unsafe { syscall3(SYS_WRITE, fd, buf.as_ptr() as usize, buf.len()) } -} - -/// Yield the process's time slice to the kernel -/// -/// This function will return Ok(0) on success -pub fn sched_yield() -> Result { - unsafe { syscall0(SYS_YIELD) } -} diff -Nru temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/data.rs temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/data.rs --- temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/data.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/data.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,297 +0,0 @@ -use core::ops::{Deref, DerefMut}; -use core::{mem, slice}; -use crate::flag::{EventFlags, MapFlags, PtraceFlags, SigActionFlags}; - -#[derive(Copy, Clone, Debug, Default)] -#[repr(C)] -pub struct Event { - pub id: usize, - pub flags: EventFlags, - pub data: usize -} - -impl Deref for Event { - type Target = [u8]; - fn deref(&self) -> &[u8] { - unsafe { - slice::from_raw_parts(self as *const Event as *const u8, mem::size_of::()) - } - } -} - -impl DerefMut for Event { - fn deref_mut(&mut self) -> &mut [u8] { - unsafe { - slice::from_raw_parts_mut(self as *mut Event as *mut u8, mem::size_of::()) - } - } -} - -#[derive(Copy, Clone, Debug, Default)] -#[repr(C)] -pub struct ITimerSpec { - pub it_interval: TimeSpec, - pub it_value: TimeSpec, -} - -impl Deref for ITimerSpec { - type Target = [u8]; - fn deref(&self) -> &[u8] { - unsafe { - slice::from_raw_parts(self as *const ITimerSpec as *const u8, - mem::size_of::()) - } - } -} - -impl DerefMut for ITimerSpec { - fn deref_mut(&mut self) -> &mut [u8] { - unsafe { - slice::from_raw_parts_mut(self as *mut ITimerSpec as *mut u8, - mem::size_of::()) - } - } -} - -#[derive(Copy, Clone, Debug, Default)] -#[repr(C)] -pub struct OldMap { - pub offset: usize, - pub size: usize, - pub flags: MapFlags, -} - -impl Deref for OldMap { - type Target = [u8]; - fn deref(&self) -> &[u8] { - unsafe { - slice::from_raw_parts(self as *const OldMap as *const u8, mem::size_of::()) - } - } -} - -impl DerefMut for OldMap { - fn deref_mut(&mut self) -> &mut [u8] { - unsafe { - slice::from_raw_parts_mut(self as *mut OldMap as *mut u8, mem::size_of::()) - } - } -} -#[derive(Copy, Clone, Debug, Default)] -#[repr(C)] -pub struct Map { - /// The offset inside the file that is being mapped. - pub offset: usize, - - /// The size of the memory map. - pub size: usize, - - /// Contains both prot and map flags. - pub flags: MapFlags, - - /// Functions as a hint to where in the virtual address space of the running process, to place - /// the memory map. If [`MapFlags::MAP_FIXED`] is set, then this address must be the address to - /// map to. - pub address: usize, -} - -impl Deref for Map { - type Target = [u8]; - fn deref(&self) -> &[u8] { - unsafe { - slice::from_raw_parts(self as *const Map as *const u8, mem::size_of::()) - } - } -} - -impl DerefMut for Map { - fn deref_mut(&mut self) -> &mut [u8] { - unsafe { - slice::from_raw_parts_mut(self as *mut Map as *mut u8, mem::size_of::()) - } - } -} - -#[derive(Copy, Clone, Debug, Default)] -#[repr(C)] -pub struct Packet { - pub id: u64, - pub pid: usize, - pub uid: u32, - pub gid: u32, - pub a: usize, - pub b: usize, - pub c: usize, - pub d: usize -} - -impl Deref for Packet { - type Target = [u8]; - fn deref(&self) -> &[u8] { - unsafe { - slice::from_raw_parts(self as *const Packet as *const u8, mem::size_of::()) - } - } -} - -impl DerefMut for Packet { - fn deref_mut(&mut self) -> &mut [u8] { - unsafe { - slice::from_raw_parts_mut(self as *mut Packet as *mut u8, mem::size_of::()) - } - } -} - -#[derive(Copy, Clone, Debug, Default, PartialEq)] -#[repr(C)] -pub struct SigAction { - pub sa_handler: Option, - pub sa_mask: [u64; 2], - pub sa_flags: SigActionFlags, -} - -#[allow(dead_code)] -unsafe fn _assert_size_of_function_is_sane() { - // Transmuting will complain *at compile time* if sizes differ. - // Rust forbids a fn-pointer from being 0 so to allow SIG_DFL to - // exist, we use Option which will mean 0 - // becomes None - let _ = mem::transmute::, usize>(None); -} - -#[derive(Copy, Clone, Debug, Default, PartialEq)] -#[repr(C)] -pub struct Stat { - pub st_dev: u64, - pub st_ino: u64, - pub st_mode: u16, - pub st_nlink: u32, - pub st_uid: u32, - pub st_gid: u32, - pub st_size: u64, - pub st_blksize: u32, - pub st_blocks: u64, - pub st_mtime: u64, - pub st_mtime_nsec: u32, - pub st_atime: u64, - pub st_atime_nsec: u32, - pub st_ctime: u64, - pub st_ctime_nsec: u32, -} - -impl Deref for Stat { - type Target = [u8]; - fn deref(&self) -> &[u8] { - unsafe { - slice::from_raw_parts(self as *const Stat as *const u8, - mem::size_of::()) - } - } -} - -impl DerefMut for Stat { - fn deref_mut(&mut self) -> &mut [u8] { - unsafe { - slice::from_raw_parts_mut(self as *mut Stat as *mut u8, - mem::size_of::()) - } - } -} - -#[derive(Copy, Clone, Debug, Default, PartialEq)] -#[repr(C)] -pub struct StatVfs { - pub f_bsize: u32, - pub f_blocks: u64, - pub f_bfree: u64, - pub f_bavail: u64, -} - -impl Deref for StatVfs { - type Target = [u8]; - fn deref(&self) -> &[u8] { - unsafe { - slice::from_raw_parts(self as *const StatVfs as *const u8, - mem::size_of::()) - } - } -} - -impl DerefMut for StatVfs { - fn deref_mut(&mut self) -> &mut [u8] { - unsafe { - slice::from_raw_parts_mut(self as *mut StatVfs as *mut u8, - mem::size_of::()) - } - } -} - -#[derive(Copy, Clone, Debug, Default, PartialEq)] -#[repr(C)] -pub struct TimeSpec { - pub tv_sec: i64, - pub tv_nsec: i32, -} - -impl Deref for TimeSpec { - type Target = [u8]; - fn deref(&self) -> &[u8] { - unsafe { - slice::from_raw_parts(self as *const TimeSpec as *const u8, - mem::size_of::()) - } - } -} - -impl DerefMut for TimeSpec { - fn deref_mut(&mut self) -> &mut [u8] { - unsafe { - slice::from_raw_parts_mut(self as *mut TimeSpec as *mut u8, - mem::size_of::()) - } - } -} - -#[derive(Clone, Copy, Debug, Default)] -#[repr(C)] -pub struct PtraceEvent { - pub cause: PtraceFlags, - pub a: usize, - pub b: usize, - pub c: usize, - pub d: usize, - pub e: usize, - pub f: usize -} - -impl Deref for PtraceEvent { - type Target = [u8]; - fn deref(&self) -> &[u8] { - unsafe { - slice::from_raw_parts(self as *const PtraceEvent as *const u8, mem::size_of::()) - } - } -} - -impl DerefMut for PtraceEvent { - fn deref_mut(&mut self) -> &mut [u8] { - unsafe { - slice::from_raw_parts_mut(self as *mut PtraceEvent as *mut u8, mem::size_of::()) - } - } -} - -#[macro_export] -macro_rules! ptrace_event { - ($cause:expr $(, $a:expr $(, $b:expr $(, $c:expr)?)?)?) => { - $crate::data::PtraceEvent { - cause: $cause, - $(a: $a, - $(b: $b, - $(c: $c,)? - )? - )? - ..Default::default() - } - } -} diff -Nru temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/error.rs temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/error.rs --- temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/error.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/error.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,311 +0,0 @@ -use core::{fmt, result}; - -#[derive(Eq, PartialEq)] -pub struct Error { - pub errno: i32, -} - -pub type Result = result::Result; - -impl Error { - pub fn new(errno: i32) -> Error { - Error { errno: errno } - } - - pub fn mux(result: Result) -> usize { - match result { - Ok(value) => value, - Err(error) => -error.errno as usize, - } - } - - pub fn demux(value: usize) -> Result { - let errno = -(value as i32); - if errno >= 1 && errno < STR_ERROR.len() as i32 { - Err(Error::new(errno)) - } else { - Ok(value) - } - } - - pub fn text(&self) -> &'static str { - STR_ERROR.get(self.errno as usize).map(|&x| x).unwrap_or("Unknown Error") - } -} - -impl fmt::Debug for Error { - fn fmt(&self, f: &mut fmt::Formatter) -> result::Result<(), fmt::Error> { - f.write_str(self.text()) - } -} - -impl fmt::Display for Error { - fn fmt(&self, f: &mut fmt::Formatter) -> result::Result<(), fmt::Error> { - f.write_str(self.text()) - } -} - -pub const EPERM: i32 = 1; /* Operation not permitted */ -pub const ENOENT: i32 = 2; /* No such file or directory */ -pub const ESRCH: i32 = 3; /* No such process */ -pub const EINTR: i32 = 4; /* Interrupted system call */ -pub const EIO: i32 = 5; /* I/O error */ -pub const ENXIO: i32 = 6; /* No such device or address */ -pub const E2BIG: i32 = 7; /* Argument list too long */ -pub const ENOEXEC: i32 = 8; /* Exec format error */ -pub const EBADF: i32 = 9; /* Bad file number */ -pub const ECHILD: i32 = 10; /* No child processes */ -pub const EAGAIN: i32 = 11; /* Try again */ -pub const ENOMEM: i32 = 12; /* Out of memory */ -pub const EACCES: i32 = 13; /* Permission denied */ -pub const EFAULT: i32 = 14; /* Bad address */ -pub const ENOTBLK: i32 = 15; /* Block device required */ -pub const EBUSY: i32 = 16; /* Device or resource busy */ -pub const EEXIST: i32 = 17; /* File exists */ -pub const EXDEV: i32 = 18; /* Cross-device link */ -pub const ENODEV: i32 = 19; /* No such device */ -pub const ENOTDIR: i32 = 20; /* Not a directory */ -pub const EISDIR: i32 = 21; /* Is a directory */ -pub const EINVAL: i32 = 22; /* Invalid argument */ -pub const ENFILE: i32 = 23; /* File table overflow */ -pub const EMFILE: i32 = 24; /* Too many open files */ -pub const ENOTTY: i32 = 25; /* Not a typewriter */ -pub const ETXTBSY: i32 = 26; /* Text file busy */ -pub const EFBIG: i32 = 27; /* File too large */ -pub const ENOSPC: i32 = 28; /* No space left on device */ -pub const ESPIPE: i32 = 29; /* Illegal seek */ -pub const EROFS: i32 = 30; /* Read-only file system */ -pub const EMLINK: i32 = 31; /* Too many links */ -pub const EPIPE: i32 = 32; /* Broken pipe */ -pub const EDOM: i32 = 33; /* Math argument out of domain of func */ -pub const ERANGE: i32 = 34; /* Math result not representable */ -pub const EDEADLK: i32 = 35; /* Resource deadlock would occur */ -pub const ENAMETOOLONG: i32 = 36; /* File name too long */ -pub const ENOLCK: i32 = 37; /* No record locks available */ -pub const ENOSYS: i32 = 38; /* Function not implemented */ -pub const ENOTEMPTY: i32 = 39; /* Directory not empty */ -pub const ELOOP: i32 = 40; /* Too many symbolic links encountered */ -pub const EWOULDBLOCK: i32 = 41; /* Operation would block */ -pub const ENOMSG: i32 = 42; /* No message of desired type */ -pub const EIDRM: i32 = 43; /* Identifier removed */ -pub const ECHRNG: i32 = 44; /* Channel number out of range */ -pub const EL2NSYNC: i32 = 45; /* Level 2 not synchronized */ -pub const EL3HLT: i32 = 46; /* Level 3 halted */ -pub const EL3RST: i32 = 47; /* Level 3 reset */ -pub const ELNRNG: i32 = 48; /* Link number out of range */ -pub const EUNATCH: i32 = 49; /* Protocol driver not attached */ -pub const ENOCSI: i32 = 50; /* No CSI structure available */ -pub const EL2HLT: i32 = 51; /* Level 2 halted */ -pub const EBADE: i32 = 52; /* Invalid exchange */ -pub const EBADR: i32 = 53; /* Invalid request descriptor */ -pub const EXFULL: i32 = 54; /* Exchange full */ -pub const ENOANO: i32 = 55; /* No anode */ -pub const EBADRQC: i32 = 56; /* Invalid request code */ -pub const EBADSLT: i32 = 57; /* Invalid slot */ -pub const EDEADLOCK: i32 = 58; /* Resource deadlock would occur */ -pub const EBFONT: i32 = 59; /* Bad font file format */ -pub const ENOSTR: i32 = 60; /* Device not a stream */ -pub const ENODATA: i32 = 61; /* No data available */ -pub const ETIME: i32 = 62; /* Timer expired */ -pub const ENOSR: i32 = 63; /* Out of streams resources */ -pub const ENONET: i32 = 64; /* Machine is not on the network */ -pub const ENOPKG: i32 = 65; /* Package not installed */ -pub const EREMOTE: i32 = 66; /* Object is remote */ -pub const ENOLINK: i32 = 67; /* Link has been severed */ -pub const EADV: i32 = 68; /* Advertise error */ -pub const ESRMNT: i32 = 69; /* Srmount error */ -pub const ECOMM: i32 = 70; /* Communication error on send */ -pub const EPROTO: i32 = 71; /* Protocol error */ -pub const EMULTIHOP: i32 = 72; /* Multihop attempted */ -pub const EDOTDOT: i32 = 73; /* RFS specific error */ -pub const EBADMSG: i32 = 74; /* Not a data message */ -pub const EOVERFLOW: i32 = 75; /* Value too large for defined data type */ -pub const ENOTUNIQ: i32 = 76; /* Name not unique on network */ -pub const EBADFD: i32 = 77; /* File descriptor in bad state */ -pub const EREMCHG: i32 = 78; /* Remote address changed */ -pub const ELIBACC: i32 = 79; /* Can not access a needed shared library */ -pub const ELIBBAD: i32 = 80; /* Accessing a corrupted shared library */ -pub const ELIBSCN: i32 = 81; /* .lib section in a.out corrupted */ -pub const ELIBMAX: i32 = 82; /* Attempting to link in too many shared libraries */ -pub const ELIBEXEC: i32 = 83; /* Cannot exec a shared library directly */ -pub const EILSEQ: i32 = 84; /* Illegal byte sequence */ -pub const ERESTART: i32 = 85; /* Interrupted system call should be restarted */ -pub const ESTRPIPE: i32 = 86; /* Streams pipe error */ -pub const EUSERS: i32 = 87; /* Too many users */ -pub const ENOTSOCK: i32 = 88; /* Socket operation on non-socket */ -pub const EDESTADDRREQ: i32 = 89; /* Destination address required */ -pub const EMSGSIZE: i32 = 90; /* Message too long */ -pub const EPROTOTYPE: i32 = 91; /* Protocol wrong type for socket */ -pub const ENOPROTOOPT: i32 = 92; /* Protocol not available */ -pub const EPROTONOSUPPORT: i32 = 93; /* Protocol not supported */ -pub const ESOCKTNOSUPPORT: i32 = 94; /* Socket type not supported */ -pub const EOPNOTSUPP: i32 = 95; /* Operation not supported on transport endpoint */ -pub const EPFNOSUPPORT: i32 = 96; /* Protocol family not supported */ -pub const EAFNOSUPPORT: i32 = 97; /* Address family not supported by protocol */ -pub const EADDRINUSE: i32 = 98; /* Address already in use */ -pub const EADDRNOTAVAIL: i32 = 99; /* Cannot assign requested address */ -pub const ENETDOWN: i32 = 100; /* Network is down */ -pub const ENETUNREACH: i32 = 101; /* Network is unreachable */ -pub const ENETRESET: i32 = 102; /* Network dropped connection because of reset */ -pub const ECONNABORTED: i32 = 103; /* Software caused connection abort */ -pub const ECONNRESET: i32 = 104; /* Connection reset by peer */ -pub const ENOBUFS: i32 = 105; /* No buffer space available */ -pub const EISCONN: i32 = 106; /* Transport endpoint is already connected */ -pub const ENOTCONN: i32 = 107; /* Transport endpoint is not connected */ -pub const ESHUTDOWN: i32 = 108; /* Cannot send after transport endpoint shutdown */ -pub const ETOOMANYREFS: i32 = 109; /* Too many references: cannot splice */ -pub const ETIMEDOUT: i32 = 110; /* Connection timed out */ -pub const ECONNREFUSED: i32 = 111; /* Connection refused */ -pub const EHOSTDOWN: i32 = 112; /* Host is down */ -pub const EHOSTUNREACH: i32 = 113; /* No route to host */ -pub const EALREADY: i32 = 114; /* Operation already in progress */ -pub const EINPROGRESS: i32 = 115; /* Operation now in progress */ -pub const ESTALE: i32 = 116; /* Stale NFS file handle */ -pub const EUCLEAN: i32 = 117; /* Structure needs cleaning */ -pub const ENOTNAM: i32 = 118; /* Not a XENIX named type file */ -pub const ENAVAIL: i32 = 119; /* No XENIX semaphores available */ -pub const EISNAM: i32 = 120; /* Is a named type file */ -pub const EREMOTEIO: i32 = 121; /* Remote I/O error */ -pub const EDQUOT: i32 = 122; /* Quota exceeded */ -pub const ENOMEDIUM: i32 = 123; /* No medium found */ -pub const EMEDIUMTYPE: i32 = 124; /* Wrong medium type */ -pub const ECANCELED: i32 = 125; /* Operation Canceled */ -pub const ENOKEY: i32 = 126; /* Required key not available */ -pub const EKEYEXPIRED: i32 = 127; /* Key has expired */ -pub const EKEYREVOKED: i32 = 128; /* Key has been revoked */ -pub const EKEYREJECTED: i32 = 129; /* Key was rejected by service */ -pub const EOWNERDEAD: i32 = 130; /* Owner died */ -pub const ENOTRECOVERABLE: i32 = 131; /* State not recoverable */ - -pub static STR_ERROR: [&'static str; 132] = ["Success", - "Operation not permitted", - "No such file or directory", - "No such process", - "Interrupted system call", - "I/O error", - "No such device or address", - "Argument list too long", - "Exec format error", - "Bad file number", - "No child processes", - "Try again", - "Out of memory", - "Permission denied", - "Bad address", - "Block device required", - "Device or resource busy", - "File exists", - "Cross-device link", - "No such device", - "Not a directory", - "Is a directory", - "Invalid argument", - "File table overflow", - "Too many open files", - "Not a typewriter", - "Text file busy", - "File too large", - "No space left on device", - "Illegal seek", - "Read-only file system", - "Too many links", - "Broken pipe", - "Math argument out of domain of func", - "Math result not representable", - "Resource deadlock would occur", - "File name too long", - "No record locks available", - "Function not implemented", - "Directory not empty", - "Too many symbolic links encountered", - "Operation would block", - "No message of desired type", - "Identifier removed", - "Channel number out of range", - "Level 2 not synchronized", - "Level 3 halted", - "Level 3 reset", - "Link number out of range", - "Protocol driver not attached", - "No CSI structure available", - "Level 2 halted", - "Invalid exchange", - "Invalid request descriptor", - "Exchange full", - "No anode", - "Invalid request code", - "Invalid slot", - "Resource deadlock would occur", - "Bad font file format", - "Device not a stream", - "No data available", - "Timer expired", - "Out of streams resources", - "Machine is not on the network", - "Package not installed", - "Object is remote", - "Link has been severed", - "Advertise error", - "Srmount error", - "Communication error on send", - "Protocol error", - "Multihop attempted", - "RFS specific error", - "Not a data message", - "Value too large for defined data type", - "Name not unique on network", - "File descriptor in bad state", - "Remote address changed", - "Can not access a needed shared library", - "Accessing a corrupted shared library", - ".lib section in a.out corrupted", - "Attempting to link in too many shared libraries", - "Cannot exec a shared library directly", - "Illegal byte sequence", - "Interrupted system call should be restarted", - "Streams pipe error", - "Too many users", - "Socket operation on non-socket", - "Destination address required", - "Message too long", - "Protocol wrong type for socket", - "Protocol not available", - "Protocol not supported", - "Socket type not supported", - "Operation not supported on transport endpoint", - "Protocol family not supported", - "Address family not supported by protocol", - "Address already in use", - "Cannot assign requested address", - "Network is down", - "Network is unreachable", - "Network dropped connection because of reset", - "Software caused connection abort", - "Connection reset by peer", - "No buffer space available", - "Transport endpoint is already connected", - "Transport endpoint is not connected", - "Cannot send after transport endpoint shutdown", - "Too many references: cannot splice", - "Connection timed out", - "Connection refused", - "Host is down", - "No route to host", - "Operation already in progress", - "Operation now in progress", - "Stale NFS file handle", - "Structure needs cleaning", - "Not a XENIX named type file", - "No XENIX semaphores available", - "Is a named type file", - "Remote I/O error", - "Quota exceeded", - "No medium found", - "Wrong medium type", - "Operation Canceled", - "Required key not available", - "Key has expired", - "Key has been revoked", - "Key was rejected by service", - "Owner died", - "State not recoverable"]; diff -Nru temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/flag.rs temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/flag.rs --- temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/flag.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/flag.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,336 +0,0 @@ -use bitflags::bitflags as inner_bitflags; -use core::{mem, ops::Deref, slice}; - -macro_rules! bitflags { - ( - $(#[$outer:meta])* - pub struct $BitFlags:ident: $T:ty { - $( - $(#[$inner:ident $($args:tt)*])* - const $Flag:ident = $value:expr; - )+ - } - ) => { - // First, use the inner bitflags - inner_bitflags! { - #[derive(Default)] - $(#[$outer])* - pub struct $BitFlags: $T { - $( - $(#[$inner $($args)*])* - const $Flag = $value; - )+ - } - } - - // Secondly, re-export all inner constants - // (`pub use self::Struct::*` doesn't work) - $( - $(#[$inner $($args)*])* - pub const $Flag: $BitFlags = $BitFlags::$Flag; - )+ - } -} - -pub const CLOCK_REALTIME: usize = 1; -pub const CLOCK_MONOTONIC: usize = 4; - -bitflags! { - pub struct EventFlags: usize { - const EVENT_NONE = 0; - const EVENT_READ = 1; - const EVENT_WRITE = 2; - } -} - -pub const F_DUPFD: usize = 0; -pub const F_GETFD: usize = 1; -pub const F_SETFD: usize = 2; -pub const F_GETFL: usize = 3; -pub const F_SETFL: usize = 4; - -pub const FUTEX_WAIT: usize = 0; -pub const FUTEX_WAKE: usize = 1; -pub const FUTEX_REQUEUE: usize = 2; -pub const FUTEX_WAIT64: usize = 3; - -bitflags! { - pub struct MapFlags: usize { - const PROT_NONE = 0x0000_0000; - const PROT_EXEC = 0x0001_0000; - const PROT_WRITE = 0x0002_0000; - const PROT_READ = 0x0004_0000; - - const MAP_SHARED = 0x0001; - const MAP_PRIVATE = 0x0002; - - /// Only accepted for mmap2(2). - const MAP_FIXED = 0x0004; - const MAP_FIXED_NOREPLACE = 0x000C; - } -} - -pub const MODE_TYPE: u16 = 0xF000; -pub const MODE_DIR: u16 = 0x4000; -pub const MODE_FILE: u16 = 0x8000; -pub const MODE_SYMLINK: u16 = 0xA000; -pub const MODE_FIFO: u16 = 0x1000; -pub const MODE_CHR: u16 = 0x2000; - -pub const MODE_PERM: u16 = 0x0FFF; -pub const MODE_SETUID: u16 = 0o4000; -pub const MODE_SETGID: u16 = 0o2000; - -pub const O_RDONLY: usize = 0x0001_0000; -pub const O_WRONLY: usize = 0x0002_0000; -pub const O_RDWR: usize = 0x0003_0000; -pub const O_NONBLOCK: usize = 0x0004_0000; -pub const O_APPEND: usize = 0x0008_0000; -pub const O_SHLOCK: usize = 0x0010_0000; -pub const O_EXLOCK: usize = 0x0020_0000; -pub const O_ASYNC: usize = 0x0040_0000; -pub const O_FSYNC: usize = 0x0080_0000; -pub const O_CLOEXEC: usize = 0x0100_0000; -pub const O_CREAT: usize = 0x0200_0000; -pub const O_TRUNC: usize = 0x0400_0000; -pub const O_EXCL: usize = 0x0800_0000; -pub const O_DIRECTORY: usize = 0x1000_0000; -pub const O_STAT: usize = 0x2000_0000; -pub const O_SYMLINK: usize = 0x4000_0000; -pub const O_NOFOLLOW: usize = 0x8000_0000; -pub const O_ACCMODE: usize = O_RDONLY | O_WRONLY | O_RDWR; - -bitflags! { - pub struct PhysmapFlags: usize { - const PHYSMAP_WRITE = 0x0000_0001; - const PHYSMAP_WRITE_COMBINE = 0x0000_0002; - const PHYSMAP_NO_CACHE = 0x0000_0004; - } -} -bitflags! { - /// Extra flags for [`physalloc2`] or [`physalloc3`]. - /// - /// [`physalloc2`]: ../call/fn.physalloc2.html - /// [`physalloc3`]: ../call/fn.physalloc3.html - pub struct PhysallocFlags: usize { - /// Only allocate memory within the 32-bit physical memory space. This is necessary for - /// some devices may not support 64-bit memory. - const SPACE_32 = 0x0000_0001; - - /// The frame that will be allocated, is going to reside anywhere in 64-bit space. This - /// flag is redundant for the most part, except when overriding some other default. - const SPACE_64 = 0x0000_0002; - - /// Do a "partial allocation", which means that not all of the frames specified in the - /// frame count `size` actually have to be allocated. This means that if the allocator was - /// unable to find a physical memory range large enough, it can instead return whatever - /// range it decides is optimal. Thus, instead of letting one driver get an expensive - /// 128MiB physical memory range when the physical memory has become fragmented, and - /// failing, it can instead be given a more optimal range. If the device supports - /// scatter-gather lists, then the driver only has to allocate more ranges, and the device - /// will do vectored I/O. - /// - /// PARTIAL_ALLOC supports different allocation strategies, refer to - /// [`Optimal`], [`GreatestRange`]. - /// - /// [`Optimal`]: ./enum.PartialAllocStrategy.html - /// [`GreatestRange`]: ./enum.PartialAllocStrategy.html - const PARTIAL_ALLOC = 0x0000_0004; - } -} - -/// The bitmask of the partial allocation strategy. Currently four different strategies are -/// supported. If [`PARTIAL_ALLOC`] is not set, this bitmask is no longer reserved. -pub const PARTIAL_ALLOC_STRATEGY_MASK: usize = 0x0003_0000; - -#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)] -#[repr(usize)] -pub enum PartialAllocStrategy { - /// The allocator decides itself the size of the memory range, based on e.g. free memory ranges - /// and other processes which require large physical memory chunks. - Optimal = 0x0001_0000, - - /// The allocator returns the absolute greatest range it can find. - GreatestRange = 0x0002_0000, - - /// The allocator returns the first range that fits the minimum count, without searching extra. - Greedy = 0x0003_0000, -} -impl Default for PartialAllocStrategy { - fn default() -> Self { - Self::Optimal - } -} - -impl PartialAllocStrategy { - pub fn from_raw(raw: usize) -> Option { - match raw { - 0x0001_0000 => Some(Self::Optimal), - 0x0002_0000 => Some(Self::GreatestRange), - 0x0003_0000 => Some(Self::Greedy), - _ => None, - } - } -} - -// The top 48 bits of PTRACE_* are reserved, for now - -bitflags! { - pub struct PtraceFlags: u64 { - /// Stop before a syscall is handled. Send PTRACE_FLAG_IGNORE to not - /// handle the syscall. - const PTRACE_STOP_PRE_SYSCALL = 0x0000_0000_0000_0001; - /// Stop after a syscall is handled. - const PTRACE_STOP_POST_SYSCALL = 0x0000_0000_0000_0002; - /// Stop after exactly one instruction. TODO: This may not handle - /// fexec/signal boundaries. Should it? - const PTRACE_STOP_SINGLESTEP = 0x0000_0000_0000_0004; - /// Stop before a signal is handled. Send PTRACE_FLAG_IGNORE to not - /// handle signal. - const PTRACE_STOP_SIGNAL = 0x0000_0000_0000_0008; - /// Stop on a software breakpoint, such as the int3 instruction for - /// x86_64. - const PTRACE_STOP_BREAKPOINT = 0x0000_0000_0000_0010; - /// Stop just before exiting for good. - const PTRACE_STOP_EXIT = 0x0000_0000_0000_0020; - - const PTRACE_STOP_MASK = 0x0000_0000_0000_00FF; - - - /// Sent when a child is cloned, giving you the opportunity to trace it. - /// If you don't catch this, the child is started as normal. - const PTRACE_EVENT_CLONE = 0x0000_0000_0000_0100; - - /// Sent when current-addrspace is changed, allowing the tracer to reopen the memory file. - const PTRACE_EVENT_ADDRSPACE_SWITCH = 0x0000_0000_0000_0200; - - const PTRACE_EVENT_MASK = 0x0000_0000_0000_0F00; - - /// Special meaning, depending on the event. Usually, when fired before - /// an action, it will skip performing that action. - const PTRACE_FLAG_IGNORE = 0x0000_0000_0000_1000; - - const PTRACE_FLAG_MASK = 0x0000_0000_0000_F000; - } -} -impl Deref for PtraceFlags { - type Target = [u8]; - fn deref(&self) -> &Self::Target { - // Same as to_ne_bytes but in-place - unsafe { - slice::from_raw_parts( - &self.bits as *const _ as *const u8, - mem::size_of::() - ) - } - } -} - -pub const SEEK_SET: usize = 0; -pub const SEEK_CUR: usize = 1; -pub const SEEK_END: usize = 2; - -pub const SIGHUP: usize = 1; -pub const SIGINT: usize = 2; -pub const SIGQUIT: usize = 3; -pub const SIGILL: usize = 4; -pub const SIGTRAP: usize = 5; -pub const SIGABRT: usize = 6; -pub const SIGBUS: usize = 7; -pub const SIGFPE: usize = 8; -pub const SIGKILL: usize = 9; -pub const SIGUSR1: usize = 10; -pub const SIGSEGV: usize = 11; -pub const SIGUSR2: usize = 12; -pub const SIGPIPE: usize = 13; -pub const SIGALRM: usize = 14; -pub const SIGTERM: usize = 15; -pub const SIGSTKFLT: usize= 16; -pub const SIGCHLD: usize = 17; -pub const SIGCONT: usize = 18; -pub const SIGSTOP: usize = 19; -pub const SIGTSTP: usize = 20; -pub const SIGTTIN: usize = 21; -pub const SIGTTOU: usize = 22; -pub const SIGURG: usize = 23; -pub const SIGXCPU: usize = 24; -pub const SIGXFSZ: usize = 25; -pub const SIGVTALRM: usize= 26; -pub const SIGPROF: usize = 27; -pub const SIGWINCH: usize = 28; -pub const SIGIO: usize = 29; -pub const SIGPWR: usize = 30; -pub const SIGSYS: usize = 31; - -pub const SIG_DFL: usize = 0; -pub const SIG_IGN: usize = 1; - -pub const SIG_BLOCK: usize = 0; -pub const SIG_UNBLOCK: usize = 1; -pub const SIG_SETMASK: usize = 2; - -bitflags! { - pub struct SigActionFlags: usize { - const SA_NOCLDSTOP = 0x00000001; - const SA_NOCLDWAIT = 0x00000002; - const SA_SIGINFO = 0x00000004; - const SA_RESTORER = 0x04000000; - const SA_ONSTACK = 0x08000000; - const SA_RESTART = 0x10000000; - const SA_NODEFER = 0x40000000; - const SA_RESETHAND = 0x80000000; - } -} - -bitflags! { - pub struct WaitFlags: usize { - const WNOHANG = 0x01; - const WUNTRACED = 0x02; - const WCONTINUED = 0x08; - } -} - -pub const ADDRSPACE_OP_MMAP: usize = 0; -pub const ADDRSPACE_OP_MUNMAP: usize = 1; -pub const ADDRSPACE_OP_MPROTECT: usize = 2; -pub const ADDRSPACE_OP_TRANSFER: usize = 3; - -/// True if status indicates the child is stopped. -pub fn wifstopped(status: usize) -> bool { - (status & 0xff) == 0x7f -} - -/// If wifstopped(status), the signal that stopped the child. -pub fn wstopsig(status: usize) -> usize { - (status >> 8) & 0xff -} - -/// True if status indicates the child continued after a stop. -pub fn wifcontinued(status: usize) -> bool { - status == 0xffff -} - -/// True if STATUS indicates termination by a signal. -pub fn wifsignaled(status: usize) -> bool { - ((status & 0x7f) + 1) as i8 >= 2 -} - -/// If wifsignaled(status), the terminating signal. -pub fn wtermsig(status: usize) -> usize { - status & 0x7f -} - -/// True if status indicates normal termination. -pub fn wifexited(status: usize) -> bool { - wtermsig(status) == 0 -} - -/// If wifexited(status), the exit status. -pub fn wexitstatus(status: usize) -> usize { - (status >> 8) & 0xff -} - -/// True if status indicates a core dump was created. -pub fn wcoredump(status: usize) -> bool { - (status & 0x80) != 0 -} diff -Nru temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/io/dma.rs temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/io/dma.rs --- temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/io/dma.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/io/dma.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,219 +0,0 @@ -use core::mem::{self, MaybeUninit}; -use core::ops::{Deref, DerefMut}; -use core::{ptr, slice}; - -use crate::Result; -use crate::{PartialAllocStrategy, PhysallocFlags, PhysmapFlags}; -use crate::arch::PAGE_SIZE; - -/// An RAII guard of a physical memory allocation. Currently all physically allocated memory are -/// page-aligned and take up at least 4k of space (on x86_64). -#[derive(Debug)] -pub struct PhysBox { - address: usize, - size: usize -} - -const fn round_up(x: usize) -> usize { - (x + PAGE_SIZE - 1) / PAGE_SIZE * PAGE_SIZE -} -fn assert_aligned(x: usize) { - assert_eq!(x % PAGE_SIZE, 0); -} - -#[cfg(target_arch = "aarch64")] -fn physmap_flags() -> PhysmapFlags { - // aarch64 currently must map DMA memory without caching to ensure coherence - crate::PHYSMAP_NO_CACHE | crate::PHYSMAP_WRITE -} - -#[cfg(any(target_arch = "x86", target_arch = "x86_64"))] -fn physmap_flags() -> PhysmapFlags { - // x86 ensures cache coherence with DMA memory - crate::PHYSMAP_WRITE -} - -impl PhysBox { - /// Construct a PhysBox from an address and a size. The address must be page-aligned, and the - /// size must similarly be a multiple of the page size. - /// - /// # Safety - /// This function is unsafe because when dropping, Self has to a valid allocation. - pub unsafe fn from_raw_parts(address: usize, size: usize) -> Self { - assert_aligned(address); - assert_aligned(size); - - Self { - address, - size, - } - } - - /// Retrieve the byte address in physical memory, of this allocation. - pub fn address(&self) -> usize { - self.address - } - - /// Retrieve the size in bytes of the alloc. - pub fn size(&self) -> usize { - self.size - } - - /// Allocate physical memory that must reside in 32-bit space. - pub fn new_in_32bit_space(size: usize) -> Result { - Self::new_with_flags(size, PhysallocFlags::SPACE_32) - } - - pub fn new_with_flags(size: usize, flags: PhysallocFlags) -> Result { - assert!(!flags.contains(PhysallocFlags::PARTIAL_ALLOC)); - assert_aligned(size); - - let address = unsafe { crate::physalloc2(size, flags.bits())? }; - Ok(unsafe { Self::from_raw_parts(address, size) }) - } - - /// "Partially" allocate physical memory, in the sense that the allocation may be smaller than - /// expected, but still with a minimum limit. This is particularly useful when the physical - /// memory space is fragmented, and a device supports scatter-gather I/O. In that case, the - /// driver can optimistically request e.g. 1 alloc of 1 MiB, with the minimum of 512 KiB. If - /// that first allocation only returns half the size, the driver can do another allocation - /// and then let the device use both buffers. - pub fn new_partial_allocation(size: usize, flags: PhysallocFlags, strategy: Option, mut min: usize) -> Result { - assert_aligned(size); - debug_assert!(!(flags.contains(PhysallocFlags::PARTIAL_ALLOC) && strategy.is_none())); - - let address = unsafe { crate::physalloc3(size, flags.bits() | strategy.map_or(0, |s| s as usize), &mut min)? }; - Ok(unsafe { Self::from_raw_parts(address, size) }) - } - - pub fn new(size: usize) -> Result { - assert_aligned(size); - - let address = unsafe { crate::physalloc(size)? }; - Ok(unsafe { Self::from_raw_parts(address, size) }) - } -} - -impl Drop for PhysBox { - fn drop(&mut self) { - let _ = unsafe { crate::physfree(self.address, self.size) }; - } -} - -pub struct Dma { - phys: PhysBox, - virt: *mut T, -} - -impl Dma { - pub fn from_physbox_uninit(phys: PhysBox) -> Result>> { - let virt = unsafe { crate::physmap(phys.address, phys.size, physmap_flags())? } as *mut MaybeUninit; - - Ok(Dma { - phys, - virt, - }) - } - pub fn from_physbox_zeroed(phys: PhysBox) -> Result>> { - let this = Self::from_physbox_uninit(phys)?; - unsafe { ptr::write_bytes(this.virt as *mut MaybeUninit, 0, this.phys.size) } - Ok(this) - } - - pub fn from_physbox(phys: PhysBox, value: T) -> Result { - let this = Self::from_physbox_uninit(phys)?; - - Ok(unsafe { - ptr::write(this.virt, MaybeUninit::new(value)); - this.assume_init() - }) - } - - pub fn new(value: T) -> Result { - let phys = PhysBox::new(round_up(mem::size_of::()))?; - Self::from_physbox(phys, value) - } - pub fn zeroed() -> Result>> { - let phys = PhysBox::new(round_up(mem::size_of::()))?; - Self::from_physbox_zeroed(phys) - } -} - -impl Dma> { - pub unsafe fn assume_init(self) -> Dma { - let &Dma { phys: PhysBox { address, size }, virt } = &self; - mem::forget(self); - - Dma { - phys: PhysBox { address, size }, - virt: virt as *mut T, - } - } -} -impl Dma { - pub fn physical(&self) -> usize { - self.phys.address() - } - pub fn size(&self) -> usize { - self.phys.size() - } - pub fn phys(&self) -> &PhysBox { - &self.phys - } -} - -impl Dma<[T]> { - pub fn from_physbox_uninit_unsized(phys: PhysBox, len: usize) -> Result]>> { - let max_len = phys.size() / mem::size_of::(); - assert!(len <= max_len); - - Ok(Dma { - virt: unsafe { slice::from_raw_parts_mut(crate::physmap(phys.address, phys.size, physmap_flags())? as *mut MaybeUninit, len) } as *mut [MaybeUninit], - phys, - }) - } - pub fn from_physbox_zeroed_unsized(phys: PhysBox, len: usize) -> Result]>> { - let this = Self::from_physbox_uninit_unsized(phys, len)?; - unsafe { ptr::write_bytes(this.virt as *mut MaybeUninit, 0, this.phys.size()) } - Ok(this) - } - /// Creates a new DMA buffer with a size only known at runtime. - /// ## Safety - /// * `T` must be properly aligned. - /// * `T` must be valid as zeroed (i.e. no NonNull pointers). - pub unsafe fn zeroed_unsized(count: usize) -> Result { - let phys = PhysBox::new(round_up(mem::size_of::() * count))?; - Ok(Self::from_physbox_zeroed_unsized(phys, count)?.assume_init()) - } -} -impl Dma<[MaybeUninit]> { - pub unsafe fn assume_init(self) -> Dma<[T]> { - let &Dma { phys: PhysBox { address, size }, virt } = &self; - mem::forget(self); - - Dma { - phys: PhysBox { address, size }, - virt: virt as *mut [T], - } - } -} - -impl Deref for Dma { - type Target = T; - fn deref(&self) -> &T { - unsafe { &*self.virt } - } -} - -impl DerefMut for Dma { - fn deref_mut(&mut self) -> &mut T { - unsafe { &mut *self.virt } - } -} - -impl Drop for Dma { - fn drop(&mut self) { - unsafe { ptr::drop_in_place(self.virt) } - let _ = unsafe { crate::funmap(self.virt as *mut u8 as usize, self.phys.size) }; - } -} diff -Nru temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/io/io.rs temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/io/io.rs --- temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/io/io.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/io/io.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,71 +0,0 @@ -use core::cmp::PartialEq; -use core::ops::{BitAnd, BitOr, Not}; - -pub trait Io { - type Value: Copy + PartialEq + BitAnd + BitOr + Not; - - fn read(&self) -> Self::Value; - fn write(&mut self, value: Self::Value); - - #[inline(always)] - fn readf(&self, flags: Self::Value) -> bool { - (self.read() & flags) as Self::Value == flags - } - - #[inline(always)] - fn writef(&mut self, flags: Self::Value, value: bool) { - let tmp: Self::Value = match value { - true => self.read() | flags, - false => self.read() & !flags, - }; - self.write(tmp); - } -} - -pub struct ReadOnly { - inner: I -} - -impl ReadOnly { - pub const fn new(inner: I) -> ReadOnly { - ReadOnly { - inner: inner - } - } -} - -impl ReadOnly { - #[inline(always)] - pub fn read(&self) -> I::Value { - self.inner.read() - } - - #[inline(always)] - pub fn readf(&self, flags: I::Value) -> bool { - self.inner.readf(flags) - } -} - -pub struct WriteOnly { - inner: I -} - -impl WriteOnly { - pub const fn new(inner: I) -> WriteOnly { - WriteOnly { - inner: inner - } - } -} - -impl WriteOnly { - #[inline(always)] - pub fn write(&mut self, value: I::Value) { - self.inner.write(value) - } - - #[inline(always)] - pub fn writef(&mut self, flags: I::Value, value: bool) { - self.inner.writef(flags, value) - } -} diff -Nru temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/io/mmio.rs temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/io/mmio.rs --- temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/io/mmio.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/io/mmio.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,45 +0,0 @@ -use core::ptr::{read_volatile, write_volatile, addr_of, addr_of_mut}; -use core::mem::MaybeUninit; -use core::ops::{BitAnd, BitOr, Not}; - -use super::io::Io; - -#[repr(packed)] -pub struct Mmio { - value: MaybeUninit, -} - -impl Mmio { - /// Create a new Mmio without initializing - #[deprecated = "unsound because it's possible to read even though it's uninitialized"] - pub fn new() -> Self { - unsafe { Self::uninit() } - } - pub unsafe fn zeroed() -> Self { - Self { - value: MaybeUninit::zeroed(), - } - } - pub unsafe fn uninit() -> Self { - Self { - value: MaybeUninit::uninit(), - } - } - pub const fn from(value: T) -> Self { - Self { - value: MaybeUninit::new(value), - } - } -} - -impl Io for Mmio where T: Copy + PartialEq + BitAnd + BitOr + Not { - type Value = T; - - fn read(&self) -> T { - unsafe { read_volatile(addr_of!(self.value).cast::()) } - } - - fn write(&mut self, value: T) { - unsafe { write_volatile(addr_of_mut!(self.value).cast::(), value) }; - } -} diff -Nru temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/io/mod.rs temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/io/mod.rs --- temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/io/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/io/mod.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ -//! I/O functions - -pub use self::dma::*; -pub use self::io::*; -pub use self::mmio::*; - -#[cfg(any(target_arch = "x86", target_arch = "x86_64"))] -pub use self::pio::*; - -mod dma; -mod io; -mod mmio; - -#[cfg(any(target_arch = "x86", target_arch = "x86_64"))] -mod pio; diff -Nru temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/io/pio.rs temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/io/pio.rs --- temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/io/pio.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/io/pio.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,90 +0,0 @@ -use core::arch::asm; -use core::marker::PhantomData; - -use super::io::Io; - -/// Generic PIO -#[derive(Copy, Clone)] -pub struct Pio { - port: u16, - value: PhantomData, -} - -impl Pio { - /// Create a PIO from a given port - pub const fn new(port: u16) -> Self { - Pio:: { - port, - value: PhantomData, - } - } -} - -/// Read/Write for byte PIO -impl Io for Pio { - type Value = u8; - - /// Read - #[inline(always)] - fn read(&self) -> u8 { - let value: u8; - unsafe { - asm!("in al, dx", in("dx") self.port, out("al") value, options(nostack, nomem, preserves_flags)); - } - value - } - - /// Write - #[inline(always)] - fn write(&mut self, value: u8) { - unsafe { - asm!("out dx, al", in("dx") self.port, in("al") value, options(nostack, nomem, preserves_flags)); - } - } -} - -/// Read/Write for word PIO -impl Io for Pio { - type Value = u16; - - /// Read - #[inline(always)] - fn read(&self) -> u16 { - let value: u16; - unsafe { - asm!("in ax, dx", in("dx") self.port, out("ax") value, options(nostack, nomem, preserves_flags)); - } - value - } - - /// Write - #[inline(always)] - fn write(&mut self, value: u16) { - unsafe { - asm!("out dx, ax", in("dx") self.port, in("ax") value, options(nostack, nomem, preserves_flags)); - } - } -} - -/// Read/Write for doubleword PIO -impl Io for Pio { - type Value = u32; - - /// Read - #[inline(always)] - fn read(&self) -> u32 { - let value: u32; - unsafe { - asm!("in eax, dx", in("dx") self.port, out("eax") value, options(nostack, nomem, preserves_flags)); - } - value - } - - /// Write - #[inline(always)] - fn write(&mut self, value: u32) { - unsafe { - asm!("out dx, eax", in("dx") self.port, in("eax") value, options(nostack, nomem, preserves_flags)); - } - } -} diff -Nru temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/lib.rs temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/lib.rs --- temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/lib.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,61 +0,0 @@ -#![cfg_attr(not(test), no_std)] - -#[cfg(test)] -extern crate core; - -pub use self::arch::*; -pub use self::call::*; -pub use self::data::*; -pub use self::error::*; -pub use self::flag::*; -pub use self::io::*; -pub use self::number::*; -pub use self::scheme::*; - -#[cfg(all(any(target_os = "none", target_os = "redox"), target_arch = "arm"))] -#[path="arch/nonredox.rs"] -mod arch; - -#[cfg(all(any(target_os = "none", target_os = "redox"), target_arch = "aarch64"))] -#[path="arch/aarch64.rs"] -mod arch; - -#[cfg(all(any(target_os = "none", target_os = "redox"), target_arch = "riscv64"))] -#[path="arch/riscv64.rs"] -mod arch; - -#[cfg(all(any(target_os = "none", target_os = "redox"), target_arch = "x86"))] -#[path="arch/x86.rs"] -mod arch; - -#[cfg(all(any(target_os = "none", target_os = "redox"), target_arch = "x86_64"))] -#[path="arch/x86_64.rs"] -mod arch; - -#[cfg(not(any(target_os = "none", target_os = "redox")))] -#[path="arch/nonredox.rs"] -mod arch; - -/// Function definitions -pub mod call; - -/// Complex structures that are used for some system calls -pub mod data; - -/// All errors that can be generated by a system call -pub mod error; - -/// Flags used as an argument to many system calls -pub mod flag; - -/// Functions for low level hardware control -pub mod io; - -/// Call numbers used by each system call -pub mod number; - -/// A trait useful for scheme handlers -pub mod scheme; - -#[cfg(test)] -mod tests; diff -Nru temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/number.rs temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/number.rs --- temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/number.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/number.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,73 +0,0 @@ -pub const SYS_CLASS: usize = 0xF000_0000; -pub const SYS_CLASS_PATH: usize=0x1000_0000; -pub const SYS_CLASS_FILE: usize=0x2000_0000; - -pub const SYS_ARG: usize = 0x0F00_0000; -pub const SYS_ARG_SLICE: usize =0x0100_0000; -pub const SYS_ARG_MSLICE: usize=0x0200_0000; -pub const SYS_ARG_PATH: usize = 0x0300_0000; - -pub const SYS_RET: usize = 0x00F0_0000; -pub const SYS_RET_FILE: usize = 0x0010_0000; - -pub const SYS_LINK: usize = SYS_CLASS_PATH | SYS_ARG_PATH | 9; -pub const SYS_OPEN: usize = SYS_CLASS_PATH | SYS_RET_FILE | 5; -pub const SYS_RMDIR: usize = SYS_CLASS_PATH | 84; -pub const SYS_UNLINK: usize = SYS_CLASS_PATH | 10; - -pub const SYS_CLOSE: usize = SYS_CLASS_FILE | 6; -pub const SYS_DUP: usize = SYS_CLASS_FILE | SYS_RET_FILE | 41; -pub const SYS_DUP2: usize = SYS_CLASS_FILE | SYS_RET_FILE | 63; -pub const SYS_READ: usize = SYS_CLASS_FILE | SYS_ARG_MSLICE | 3; -pub const SYS_WRITE: usize = SYS_CLASS_FILE | SYS_ARG_SLICE | 4; -pub const SYS_LSEEK: usize = SYS_CLASS_FILE | 19; -pub const SYS_FCHMOD: usize = SYS_CLASS_FILE | 94; -pub const SYS_FCHOWN: usize = SYS_CLASS_FILE | 207; -pub const SYS_FCNTL: usize = SYS_CLASS_FILE | 55; -pub const SYS_FEVENT: usize = SYS_CLASS_FILE | 927; -pub const SYS_FMAP_OLD: usize = SYS_CLASS_FILE | SYS_ARG_SLICE | 90; -pub const SYS_FMAP: usize = SYS_CLASS_FILE | SYS_ARG_SLICE | 900; -pub const SYS_FUNMAP_OLD: usize = SYS_CLASS_FILE | 91; -pub const SYS_FUNMAP: usize = SYS_CLASS_FILE | 92; -pub const SYS_FPATH: usize = SYS_CLASS_FILE | SYS_ARG_MSLICE | 928; -pub const SYS_FRENAME: usize = SYS_CLASS_FILE | SYS_ARG_PATH | 38; -pub const SYS_FSTAT: usize = SYS_CLASS_FILE | SYS_ARG_MSLICE | 28; -pub const SYS_FSTATVFS: usize = SYS_CLASS_FILE | SYS_ARG_MSLICE | 100; -pub const SYS_FSYNC: usize = SYS_CLASS_FILE | 118; -pub const SYS_FTRUNCATE: usize = SYS_CLASS_FILE | 93; -pub const SYS_FUTIMENS: usize = SYS_CLASS_FILE | SYS_ARG_SLICE | 320; - -pub const SYS_CLOCK_GETTIME: usize = 265; -pub const SYS_EXIT: usize = 1; -pub const SYS_FUTEX: usize = 240; -pub const SYS_GETEGID: usize = 202; -pub const SYS_GETENS: usize = 951; -pub const SYS_GETEUID: usize = 201; -pub const SYS_GETGID: usize = 200; -pub const SYS_GETNS: usize = 950; -pub const SYS_GETPID: usize = 20; -pub const SYS_GETPGID: usize = 132; -pub const SYS_GETPPID: usize = 64; -pub const SYS_GETUID: usize = 199; -pub const SYS_IOPL: usize = 110; -pub const SYS_KILL: usize = 37; -pub const SYS_MPROTECT: usize = 125; -pub const SYS_MKNS: usize = 984; -pub const SYS_NANOSLEEP: usize =162; -pub const SYS_PHYSALLOC: usize =945; -pub const SYS_PHYSALLOC3: usize=9453; -pub const SYS_PHYSFREE: usize = 946; -pub const SYS_PHYSMAP: usize = 947; -pub const SYS_PHYSUNMAP: usize =948; -pub const SYS_VIRTTOPHYS: usize=949; -pub const SYS_PIPE2: usize = 331; -pub const SYS_SETPGID: usize = 57; -pub const SYS_SETREGID: usize = 204; -pub const SYS_SETRENS: usize = 952; -pub const SYS_SETREUID: usize = 203; -pub const SYS_SIGACTION: usize =67; -pub const SYS_SIGPROCMASK:usize=126; -pub const SYS_SIGRETURN: usize =119; -pub const SYS_UMASK: usize = 60; -pub const SYS_WAITPID: usize = 7; -pub const SYS_YIELD: usize = 158; diff -Nru temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/scheme/generate.sh temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/scheme/generate.sh --- temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/scheme/generate.sh 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/scheme/generate.sh 1970-01-01 00:00:00.000000000 +0000 @@ -1,23 +0,0 @@ -#!/usr/bin/env bash - -set -e - -echo "Generating SchemeMut from Scheme" -sed 's/trait Scheme/trait SchemeMut/' scheme.rs \ -| sed 's/\&self/\&mut self/g' \ -> scheme_mut.rs - -echo "Generating SchemeBlock from Scheme" -sed 's/trait Scheme/trait SchemeBlock/' scheme.rs \ -| sed 's/fn handle(\&self, packet: \&mut Packet)/fn handle(\&self, packet: \&Packet) -> Option/' \ -| sed 's/packet.a = Error::mux(res);/res.transpose().map(Error::mux)/' \ -| sed 's/\.map(|f| f\.bits())/\.map(|f| f.map(|f| f.bits()))/' \ -| sed 's/\.map(|o| o as usize)/.map(|o| o.map(|o| o as usize))/' \ -| sed 's/Ok(0)/Ok(Some(0))/g' \ -| sed 's/Result<\([^>]\+\)>/Result>/g' \ -> scheme_block.rs - -echo "Generating SchemeBlockMut from SchemeBlock" -sed 's/trait SchemeBlock/trait SchemeBlockMut/' scheme_block.rs \ -| sed 's/\&self/\&mut self/g' \ -> scheme_block_mut.rs diff -Nru temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/scheme/mod.rs temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/scheme/mod.rs --- temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/scheme/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/scheme/mod.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -use core::{slice, str}; - -pub use self::scheme::Scheme; -pub use self::scheme_mut::SchemeMut; -pub use self::scheme_block::SchemeBlock; -pub use self::scheme_block_mut::SchemeBlockMut; -pub use self::seek::*; - -unsafe fn str_from_raw_parts(ptr: *const u8, len: usize) -> Option<&'static str> { - let slice = slice::from_raw_parts(ptr, len); - str::from_utf8(slice).ok() -} - -mod scheme; -mod scheme_mut; -mod scheme_block; -mod scheme_block_mut; -mod seek; diff -Nru temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/scheme/scheme_block_mut.rs temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/scheme/scheme_block_mut.rs --- temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/scheme/scheme_block_mut.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/scheme/scheme_block_mut.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,206 +0,0 @@ -use core::{mem, slice}; - -use crate::data::*; -use crate::error::*; -use crate::flag::*; -use crate::number::*; -use crate::scheme::str_from_raw_parts; - -pub trait SchemeBlockMut { - fn handle(&mut self, packet: &Packet) -> Option { - let res = match packet.a { - SYS_OPEN => if let Some(path) = unsafe { str_from_raw_parts(packet.b as *const u8, packet.c) } { - self.open(path, packet.d, packet.uid, packet.gid) - } else { - Err(Error::new(EINVAL)) - }, - SYS_RMDIR => if let Some(path) = unsafe { str_from_raw_parts(packet.b as *const u8, packet.c) } { - self.rmdir(path, packet.uid, packet.gid) - } else { - Err(Error::new(EINVAL)) - }, - SYS_UNLINK => if let Some(path) = unsafe { str_from_raw_parts(packet.b as *const u8, packet.c) } { - self.unlink(path, packet.uid, packet.gid) - } else { - Err(Error::new(EINVAL)) - }, - - SYS_DUP => self.dup(packet.b, unsafe { slice::from_raw_parts(packet.c as *const u8, packet.d) }), - SYS_READ => self.read(packet.b, unsafe { slice::from_raw_parts_mut(packet.c as *mut u8, packet.d) }), - SYS_WRITE => self.write(packet.b, unsafe { slice::from_raw_parts(packet.c as *const u8, packet.d) }), - SYS_LSEEK => self.seek(packet.b, packet.c as isize, packet.d).map(|o| o.map(|o| o as usize)), - SYS_FCHMOD => self.fchmod(packet.b, packet.c as u16), - SYS_FCHOWN => self.fchown(packet.b, packet.c as u32, packet.d as u32), - SYS_FCNTL => self.fcntl(packet.b, packet.c, packet.d), - SYS_FEVENT => self.fevent(packet.b, EventFlags::from_bits_truncate(packet.c)).map(|f| f.map(|f| f.bits())), - SYS_FMAP_OLD => if packet.d >= mem::size_of::() { - self.fmap_old(packet.b, unsafe { &*(packet.c as *const OldMap) }) - } else { - Err(Error::new(EFAULT)) - }, - SYS_FMAP => if packet.d >= mem::size_of::() { - self.fmap(packet.b, unsafe { &*(packet.c as *const Map) }) - } else { - Err(Error::new(EFAULT)) - }, - SYS_FUNMAP_OLD => self.funmap_old(packet.b), - SYS_FUNMAP => self.funmap(packet.b, packet.c), - SYS_FPATH => self.fpath(packet.b, unsafe { slice::from_raw_parts_mut(packet.c as *mut u8, packet.d) }), - SYS_FRENAME => if let Some(path) = unsafe { str_from_raw_parts(packet.c as *const u8, packet.d) } { - self.frename(packet.b, path, packet.uid, packet.gid) - } else { - Err(Error::new(EINVAL)) - }, - SYS_FSTAT => if packet.d >= mem::size_of::() { - self.fstat(packet.b, unsafe { &mut *(packet.c as *mut Stat) }) - } else { - Err(Error::new(EFAULT)) - }, - SYS_FSTATVFS => if packet.d >= mem::size_of::() { - self.fstatvfs(packet.b, unsafe { &mut *(packet.c as *mut StatVfs) }) - } else { - Err(Error::new(EFAULT)) - }, - SYS_FSYNC => self.fsync(packet.b), - SYS_FTRUNCATE => self.ftruncate(packet.b, packet.c), - SYS_FUTIMENS => if packet.d >= mem::size_of::() { - self.futimens(packet.b, unsafe { slice::from_raw_parts(packet.c as *const TimeSpec, packet.d / mem::size_of::()) }) - } else { - Err(Error::new(EFAULT)) - }, - SYS_CLOSE => self.close(packet.b), - _ => Err(Error::new(ENOSYS)) - }; - - res.transpose().map(Error::mux) - } - - /* Scheme operations */ - - #[allow(unused_variables)] - fn open(&mut self, path: &str, flags: usize, uid: u32, gid: u32) -> Result> { - Err(Error::new(ENOENT)) - } - - #[allow(unused_variables)] - fn chmod(&mut self, path: &str, mode: u16, uid: u32, gid: u32) -> Result> { - Err(Error::new(ENOENT)) - } - - #[allow(unused_variables)] - fn rmdir(&mut self, path: &str, uid: u32, gid: u32) -> Result> { - Err(Error::new(ENOENT)) - } - - #[allow(unused_variables)] - fn unlink(&mut self, path: &str, uid: u32, gid: u32) -> Result> { - Err(Error::new(ENOENT)) - } - - /* Resource operations */ - #[allow(unused_variables)] - fn dup(&mut self, old_id: usize, buf: &[u8]) -> Result> { - Err(Error::new(EBADF)) - } - - #[allow(unused_variables)] - fn read(&mut self, id: usize, buf: &mut [u8]) -> Result> { - Err(Error::new(EBADF)) - } - - #[allow(unused_variables)] - fn write(&mut self, id: usize, buf: &[u8]) -> Result> { - Err(Error::new(EBADF)) - } - - #[allow(unused_variables)] - fn seek(&mut self, id: usize, pos: isize, whence: usize) -> Result> { - Err(Error::new(EBADF)) - } - - #[allow(unused_variables)] - fn fchmod(&mut self, id: usize, mode: u16) -> Result> { - Err(Error::new(EBADF)) - } - - #[allow(unused_variables)] - fn fchown(&mut self, id: usize, uid: u32, gid: u32) -> Result> { - Err(Error::new(EBADF)) - } - - #[allow(unused_variables)] - fn fcntl(&mut self, id: usize, cmd: usize, arg: usize) -> Result> { - Err(Error::new(EBADF)) - } - - #[allow(unused_variables)] - fn fevent(&mut self, id: usize, flags: EventFlags) -> Result> { - Err(Error::new(EBADF)) - } - - #[allow(unused_variables)] - fn fmap_old(&mut self, id: usize, map: &OldMap) -> Result> { - Err(Error::new(EBADF)) - } - #[allow(unused_variables)] - fn fmap(&mut self, id: usize, map: &Map) -> Result> { - if map.flags.contains(MapFlags::MAP_FIXED) { - return Err(Error::new(EINVAL)); - } - self.fmap_old(id, &OldMap { - offset: map.offset, - size: map.size, - flags: map.flags, - }) - } - - #[allow(unused_variables)] - fn funmap_old(&mut self, address: usize) -> Result> { - Ok(Some(0)) - } - - #[allow(unused_variables)] - fn funmap(&mut self, address: usize, length: usize) -> Result> { - Ok(Some(0)) - } - - #[allow(unused_variables)] - fn fpath(&mut self, id: usize, buf: &mut [u8]) -> Result> { - Err(Error::new(EBADF)) - } - - #[allow(unused_variables)] - fn frename(&mut self, id: usize, path: &str, uid: u32, gid: u32) -> Result> { - Err(Error::new(EBADF)) - } - - #[allow(unused_variables)] - fn fstat(&mut self, id: usize, stat: &mut Stat) -> Result> { - Err(Error::new(EBADF)) - } - - #[allow(unused_variables)] - fn fstatvfs(&mut self, id: usize, stat: &mut StatVfs) -> Result> { - Err(Error::new(EBADF)) - } - - #[allow(unused_variables)] - fn fsync(&mut self, id: usize) -> Result> { - Err(Error::new(EBADF)) - } - - #[allow(unused_variables)] - fn ftruncate(&mut self, id: usize, len: usize) -> Result> { - Err(Error::new(EBADF)) - } - - #[allow(unused_variables)] - fn futimens(&mut self, id: usize, times: &[TimeSpec]) -> Result> { - Err(Error::new(EBADF)) - } - - #[allow(unused_variables)] - fn close(&mut self, id: usize) -> Result> { - Err(Error::new(EBADF)) - } -} diff -Nru temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/scheme/scheme_block.rs temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/scheme/scheme_block.rs --- temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/scheme/scheme_block.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/scheme/scheme_block.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,206 +0,0 @@ -use core::{mem, slice}; - -use crate::data::*; -use crate::error::*; -use crate::flag::*; -use crate::number::*; -use crate::scheme::str_from_raw_parts; - -pub trait SchemeBlock { - fn handle(&self, packet: &Packet) -> Option { - let res = match packet.a { - SYS_OPEN => if let Some(path) = unsafe { str_from_raw_parts(packet.b as *const u8, packet.c) } { - self.open(path, packet.d, packet.uid, packet.gid) - } else { - Err(Error::new(EINVAL)) - }, - SYS_RMDIR => if let Some(path) = unsafe { str_from_raw_parts(packet.b as *const u8, packet.c) } { - self.rmdir(path, packet.uid, packet.gid) - } else { - Err(Error::new(EINVAL)) - }, - SYS_UNLINK => if let Some(path) = unsafe { str_from_raw_parts(packet.b as *const u8, packet.c) } { - self.unlink(path, packet.uid, packet.gid) - } else { - Err(Error::new(EINVAL)) - }, - - SYS_DUP => self.dup(packet.b, unsafe { slice::from_raw_parts(packet.c as *const u8, packet.d) }), - SYS_READ => self.read(packet.b, unsafe { slice::from_raw_parts_mut(packet.c as *mut u8, packet.d) }), - SYS_WRITE => self.write(packet.b, unsafe { slice::from_raw_parts(packet.c as *const u8, packet.d) }), - SYS_LSEEK => self.seek(packet.b, packet.c as isize, packet.d).map(|o| o.map(|o| o as usize)), - SYS_FCHMOD => self.fchmod(packet.b, packet.c as u16), - SYS_FCHOWN => self.fchown(packet.b, packet.c as u32, packet.d as u32), - SYS_FCNTL => self.fcntl(packet.b, packet.c, packet.d), - SYS_FEVENT => self.fevent(packet.b, EventFlags::from_bits_truncate(packet.c)).map(|f| f.map(|f| f.bits())), - SYS_FMAP_OLD => if packet.d >= mem::size_of::() { - self.fmap_old(packet.b, unsafe { &*(packet.c as *const OldMap) }) - } else { - Err(Error::new(EFAULT)) - }, - SYS_FMAP => if packet.d >= mem::size_of::() { - self.fmap(packet.b, unsafe { &*(packet.c as *const Map) }) - } else { - Err(Error::new(EFAULT)) - }, - SYS_FUNMAP_OLD => self.funmap_old(packet.b), - SYS_FUNMAP => self.funmap(packet.b, packet.c), - SYS_FPATH => self.fpath(packet.b, unsafe { slice::from_raw_parts_mut(packet.c as *mut u8, packet.d) }), - SYS_FRENAME => if let Some(path) = unsafe { str_from_raw_parts(packet.c as *const u8, packet.d) } { - self.frename(packet.b, path, packet.uid, packet.gid) - } else { - Err(Error::new(EINVAL)) - }, - SYS_FSTAT => if packet.d >= mem::size_of::() { - self.fstat(packet.b, unsafe { &mut *(packet.c as *mut Stat) }) - } else { - Err(Error::new(EFAULT)) - }, - SYS_FSTATVFS => if packet.d >= mem::size_of::() { - self.fstatvfs(packet.b, unsafe { &mut *(packet.c as *mut StatVfs) }) - } else { - Err(Error::new(EFAULT)) - }, - SYS_FSYNC => self.fsync(packet.b), - SYS_FTRUNCATE => self.ftruncate(packet.b, packet.c), - SYS_FUTIMENS => if packet.d >= mem::size_of::() { - self.futimens(packet.b, unsafe { slice::from_raw_parts(packet.c as *const TimeSpec, packet.d / mem::size_of::()) }) - } else { - Err(Error::new(EFAULT)) - }, - SYS_CLOSE => self.close(packet.b), - _ => Err(Error::new(ENOSYS)) - }; - - res.transpose().map(Error::mux) - } - - /* Scheme operations */ - - #[allow(unused_variables)] - fn open(&self, path: &str, flags: usize, uid: u32, gid: u32) -> Result> { - Err(Error::new(ENOENT)) - } - - #[allow(unused_variables)] - fn chmod(&self, path: &str, mode: u16, uid: u32, gid: u32) -> Result> { - Err(Error::new(ENOENT)) - } - - #[allow(unused_variables)] - fn rmdir(&self, path: &str, uid: u32, gid: u32) -> Result> { - Err(Error::new(ENOENT)) - } - - #[allow(unused_variables)] - fn unlink(&self, path: &str, uid: u32, gid: u32) -> Result> { - Err(Error::new(ENOENT)) - } - - /* Resource operations */ - #[allow(unused_variables)] - fn dup(&self, old_id: usize, buf: &[u8]) -> Result> { - Err(Error::new(EBADF)) - } - - #[allow(unused_variables)] - fn read(&self, id: usize, buf: &mut [u8]) -> Result> { - Err(Error::new(EBADF)) - } - - #[allow(unused_variables)] - fn write(&self, id: usize, buf: &[u8]) -> Result> { - Err(Error::new(EBADF)) - } - - #[allow(unused_variables)] - fn seek(&self, id: usize, pos: isize, whence: usize) -> Result> { - Err(Error::new(EBADF)) - } - - #[allow(unused_variables)] - fn fchmod(&self, id: usize, mode: u16) -> Result> { - Err(Error::new(EBADF)) - } - - #[allow(unused_variables)] - fn fchown(&self, id: usize, uid: u32, gid: u32) -> Result> { - Err(Error::new(EBADF)) - } - - #[allow(unused_variables)] - fn fcntl(&self, id: usize, cmd: usize, arg: usize) -> Result> { - Err(Error::new(EBADF)) - } - - #[allow(unused_variables)] - fn fevent(&self, id: usize, flags: EventFlags) -> Result> { - Err(Error::new(EBADF)) - } - - #[allow(unused_variables)] - fn fmap_old(&self, id: usize, map: &OldMap) -> Result> { - Err(Error::new(EBADF)) - } - #[allow(unused_variables)] - fn fmap(&self, id: usize, map: &Map) -> Result> { - if map.flags.contains(MapFlags::MAP_FIXED) { - return Err(Error::new(EINVAL)); - } - self.fmap_old(id, &OldMap { - offset: map.offset, - size: map.size, - flags: map.flags, - }) - } - - #[allow(unused_variables)] - fn funmap_old(&self, address: usize) -> Result> { - Ok(Some(0)) - } - - #[allow(unused_variables)] - fn funmap(&self, address: usize, length: usize) -> Result> { - Ok(Some(0)) - } - - #[allow(unused_variables)] - fn fpath(&self, id: usize, buf: &mut [u8]) -> Result> { - Err(Error::new(EBADF)) - } - - #[allow(unused_variables)] - fn frename(&self, id: usize, path: &str, uid: u32, gid: u32) -> Result> { - Err(Error::new(EBADF)) - } - - #[allow(unused_variables)] - fn fstat(&self, id: usize, stat: &mut Stat) -> Result> { - Err(Error::new(EBADF)) - } - - #[allow(unused_variables)] - fn fstatvfs(&self, id: usize, stat: &mut StatVfs) -> Result> { - Err(Error::new(EBADF)) - } - - #[allow(unused_variables)] - fn fsync(&self, id: usize) -> Result> { - Err(Error::new(EBADF)) - } - - #[allow(unused_variables)] - fn ftruncate(&self, id: usize, len: usize) -> Result> { - Err(Error::new(EBADF)) - } - - #[allow(unused_variables)] - fn futimens(&self, id: usize, times: &[TimeSpec]) -> Result> { - Err(Error::new(EBADF)) - } - - #[allow(unused_variables)] - fn close(&self, id: usize) -> Result> { - Err(Error::new(EBADF)) - } -} diff -Nru temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/scheme/scheme_mut.rs temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/scheme/scheme_mut.rs --- temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/scheme/scheme_mut.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/scheme/scheme_mut.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,206 +0,0 @@ -use core::{mem, slice}; - -use crate::data::*; -use crate::error::*; -use crate::flag::*; -use crate::number::*; -use crate::scheme::str_from_raw_parts; - -pub trait SchemeMut { - fn handle(&mut self, packet: &mut Packet) { - let res = match packet.a { - SYS_OPEN => if let Some(path) = unsafe { str_from_raw_parts(packet.b as *const u8, packet.c) } { - self.open(path, packet.d, packet.uid, packet.gid) - } else { - Err(Error::new(EINVAL)) - }, - SYS_RMDIR => if let Some(path) = unsafe { str_from_raw_parts(packet.b as *const u8, packet.c) } { - self.rmdir(path, packet.uid, packet.gid) - } else { - Err(Error::new(EINVAL)) - }, - SYS_UNLINK => if let Some(path) = unsafe { str_from_raw_parts(packet.b as *const u8, packet.c) } { - self.unlink(path, packet.uid, packet.gid) - } else { - Err(Error::new(EINVAL)) - }, - - SYS_DUP => self.dup(packet.b, unsafe { slice::from_raw_parts(packet.c as *const u8, packet.d) }), - SYS_READ => self.read(packet.b, unsafe { slice::from_raw_parts_mut(packet.c as *mut u8, packet.d) }), - SYS_WRITE => self.write(packet.b, unsafe { slice::from_raw_parts(packet.c as *const u8, packet.d) }), - SYS_LSEEK => self.seek(packet.b, packet.c as isize, packet.d).map(|o| o as usize), - SYS_FCHMOD => self.fchmod(packet.b, packet.c as u16), - SYS_FCHOWN => self.fchown(packet.b, packet.c as u32, packet.d as u32), - SYS_FCNTL => self.fcntl(packet.b, packet.c, packet.d), - SYS_FEVENT => self.fevent(packet.b, EventFlags::from_bits_truncate(packet.c)).map(|f| f.bits()), - SYS_FMAP_OLD => if packet.d >= mem::size_of::() { - self.fmap_old(packet.b, unsafe { &*(packet.c as *const OldMap) }) - } else { - Err(Error::new(EFAULT)) - }, - SYS_FMAP => if packet.d >= mem::size_of::() { - self.fmap(packet.b, unsafe { &*(packet.c as *const Map) }) - } else { - Err(Error::new(EFAULT)) - }, - SYS_FUNMAP_OLD => self.funmap_old(packet.b), - SYS_FUNMAP => self.funmap(packet.b, packet.c), - SYS_FPATH => self.fpath(packet.b, unsafe { slice::from_raw_parts_mut(packet.c as *mut u8, packet.d) }), - SYS_FRENAME => if let Some(path) = unsafe { str_from_raw_parts(packet.c as *const u8, packet.d) } { - self.frename(packet.b, path, packet.uid, packet.gid) - } else { - Err(Error::new(EINVAL)) - }, - SYS_FSTAT => if packet.d >= mem::size_of::() { - self.fstat(packet.b, unsafe { &mut *(packet.c as *mut Stat) }) - } else { - Err(Error::new(EFAULT)) - }, - SYS_FSTATVFS => if packet.d >= mem::size_of::() { - self.fstatvfs(packet.b, unsafe { &mut *(packet.c as *mut StatVfs) }) - } else { - Err(Error::new(EFAULT)) - }, - SYS_FSYNC => self.fsync(packet.b), - SYS_FTRUNCATE => self.ftruncate(packet.b, packet.c), - SYS_FUTIMENS => if packet.d >= mem::size_of::() { - self.futimens(packet.b, unsafe { slice::from_raw_parts(packet.c as *const TimeSpec, packet.d / mem::size_of::()) }) - } else { - Err(Error::new(EFAULT)) - }, - SYS_CLOSE => self.close(packet.b), - _ => Err(Error::new(ENOSYS)) - }; - - packet.a = Error::mux(res); - } - - /* Scheme operations */ - - #[allow(unused_variables)] - fn open(&mut self, path: &str, flags: usize, uid: u32, gid: u32) -> Result { - Err(Error::new(ENOENT)) - } - - #[allow(unused_variables)] - fn chmod(&mut self, path: &str, mode: u16, uid: u32, gid: u32) -> Result { - Err(Error::new(ENOENT)) - } - - #[allow(unused_variables)] - fn rmdir(&mut self, path: &str, uid: u32, gid: u32) -> Result { - Err(Error::new(ENOENT)) - } - - #[allow(unused_variables)] - fn unlink(&mut self, path: &str, uid: u32, gid: u32) -> Result { - Err(Error::new(ENOENT)) - } - - /* Resource operations */ - #[allow(unused_variables)] - fn dup(&mut self, old_id: usize, buf: &[u8]) -> Result { - Err(Error::new(EBADF)) - } - - #[allow(unused_variables)] - fn read(&mut self, id: usize, buf: &mut [u8]) -> Result { - Err(Error::new(EBADF)) - } - - #[allow(unused_variables)] - fn write(&mut self, id: usize, buf: &[u8]) -> Result { - Err(Error::new(EBADF)) - } - - #[allow(unused_variables)] - fn seek(&mut self, id: usize, pos: isize, whence: usize) -> Result { - Err(Error::new(EBADF)) - } - - #[allow(unused_variables)] - fn fchmod(&mut self, id: usize, mode: u16) -> Result { - Err(Error::new(EBADF)) - } - - #[allow(unused_variables)] - fn fchown(&mut self, id: usize, uid: u32, gid: u32) -> Result { - Err(Error::new(EBADF)) - } - - #[allow(unused_variables)] - fn fcntl(&mut self, id: usize, cmd: usize, arg: usize) -> Result { - Err(Error::new(EBADF)) - } - - #[allow(unused_variables)] - fn fevent(&mut self, id: usize, flags: EventFlags) -> Result { - Err(Error::new(EBADF)) - } - - #[allow(unused_variables)] - fn fmap_old(&mut self, id: usize, map: &OldMap) -> Result { - Err(Error::new(EBADF)) - } - #[allow(unused_variables)] - fn fmap(&mut self, id: usize, map: &Map) -> Result { - if map.flags.contains(MapFlags::MAP_FIXED) { - return Err(Error::new(EINVAL)); - } - self.fmap_old(id, &OldMap { - offset: map.offset, - size: map.size, - flags: map.flags, - }) - } - - #[allow(unused_variables)] - fn funmap_old(&mut self, address: usize) -> Result { - Ok(0) - } - - #[allow(unused_variables)] - fn funmap(&mut self, address: usize, length: usize) -> Result { - Ok(0) - } - - #[allow(unused_variables)] - fn fpath(&mut self, id: usize, buf: &mut [u8]) -> Result { - Err(Error::new(EBADF)) - } - - #[allow(unused_variables)] - fn frename(&mut self, id: usize, path: &str, uid: u32, gid: u32) -> Result { - Err(Error::new(EBADF)) - } - - #[allow(unused_variables)] - fn fstat(&mut self, id: usize, stat: &mut Stat) -> Result { - Err(Error::new(EBADF)) - } - - #[allow(unused_variables)] - fn fstatvfs(&mut self, id: usize, stat: &mut StatVfs) -> Result { - Err(Error::new(EBADF)) - } - - #[allow(unused_variables)] - fn fsync(&mut self, id: usize) -> Result { - Err(Error::new(EBADF)) - } - - #[allow(unused_variables)] - fn ftruncate(&mut self, id: usize, len: usize) -> Result { - Err(Error::new(EBADF)) - } - - #[allow(unused_variables)] - fn futimens(&mut self, id: usize, times: &[TimeSpec]) -> Result { - Err(Error::new(EBADF)) - } - - #[allow(unused_variables)] - fn close(&mut self, id: usize) -> Result { - Err(Error::new(EBADF)) - } -} diff -Nru temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/scheme/scheme.rs temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/scheme/scheme.rs --- temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/scheme/scheme.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/scheme/scheme.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,206 +0,0 @@ -use core::{mem, slice}; - -use crate::data::*; -use crate::error::*; -use crate::flag::*; -use crate::number::*; -use crate::scheme::str_from_raw_parts; - -pub trait Scheme { - fn handle(&self, packet: &mut Packet) { - let res = match packet.a { - SYS_OPEN => if let Some(path) = unsafe { str_from_raw_parts(packet.b as *const u8, packet.c) } { - self.open(path, packet.d, packet.uid, packet.gid) - } else { - Err(Error::new(EINVAL)) - }, - SYS_RMDIR => if let Some(path) = unsafe { str_from_raw_parts(packet.b as *const u8, packet.c) } { - self.rmdir(path, packet.uid, packet.gid) - } else { - Err(Error::new(EINVAL)) - }, - SYS_UNLINK => if let Some(path) = unsafe { str_from_raw_parts(packet.b as *const u8, packet.c) } { - self.unlink(path, packet.uid, packet.gid) - } else { - Err(Error::new(EINVAL)) - }, - - SYS_DUP => self.dup(packet.b, unsafe { slice::from_raw_parts(packet.c as *const u8, packet.d) }), - SYS_READ => self.read(packet.b, unsafe { slice::from_raw_parts_mut(packet.c as *mut u8, packet.d) }), - SYS_WRITE => self.write(packet.b, unsafe { slice::from_raw_parts(packet.c as *const u8, packet.d) }), - SYS_LSEEK => self.seek(packet.b, packet.c as isize, packet.d).map(|o| o as usize), - SYS_FCHMOD => self.fchmod(packet.b, packet.c as u16), - SYS_FCHOWN => self.fchown(packet.b, packet.c as u32, packet.d as u32), - SYS_FCNTL => self.fcntl(packet.b, packet.c, packet.d), - SYS_FEVENT => self.fevent(packet.b, EventFlags::from_bits_truncate(packet.c)).map(|f| f.bits()), - SYS_FMAP_OLD => if packet.d >= mem::size_of::() { - self.fmap_old(packet.b, unsafe { &*(packet.c as *const OldMap) }) - } else { - Err(Error::new(EFAULT)) - }, - SYS_FMAP => if packet.d >= mem::size_of::() { - self.fmap(packet.b, unsafe { &*(packet.c as *const Map) }) - } else { - Err(Error::new(EFAULT)) - }, - SYS_FUNMAP_OLD => self.funmap_old(packet.b), - SYS_FUNMAP => self.funmap(packet.b, packet.c), - SYS_FPATH => self.fpath(packet.b, unsafe { slice::from_raw_parts_mut(packet.c as *mut u8, packet.d) }), - SYS_FRENAME => if let Some(path) = unsafe { str_from_raw_parts(packet.c as *const u8, packet.d) } { - self.frename(packet.b, path, packet.uid, packet.gid) - } else { - Err(Error::new(EINVAL)) - }, - SYS_FSTAT => if packet.d >= mem::size_of::() { - self.fstat(packet.b, unsafe { &mut *(packet.c as *mut Stat) }) - } else { - Err(Error::new(EFAULT)) - }, - SYS_FSTATVFS => if packet.d >= mem::size_of::() { - self.fstatvfs(packet.b, unsafe { &mut *(packet.c as *mut StatVfs) }) - } else { - Err(Error::new(EFAULT)) - }, - SYS_FSYNC => self.fsync(packet.b), - SYS_FTRUNCATE => self.ftruncate(packet.b, packet.c), - SYS_FUTIMENS => if packet.d >= mem::size_of::() { - self.futimens(packet.b, unsafe { slice::from_raw_parts(packet.c as *const TimeSpec, packet.d / mem::size_of::()) }) - } else { - Err(Error::new(EFAULT)) - }, - SYS_CLOSE => self.close(packet.b), - _ => Err(Error::new(ENOSYS)) - }; - - packet.a = Error::mux(res); - } - - /* Scheme operations */ - - #[allow(unused_variables)] - fn open(&self, path: &str, flags: usize, uid: u32, gid: u32) -> Result { - Err(Error::new(ENOENT)) - } - - #[allow(unused_variables)] - fn chmod(&self, path: &str, mode: u16, uid: u32, gid: u32) -> Result { - Err(Error::new(ENOENT)) - } - - #[allow(unused_variables)] - fn rmdir(&self, path: &str, uid: u32, gid: u32) -> Result { - Err(Error::new(ENOENT)) - } - - #[allow(unused_variables)] - fn unlink(&self, path: &str, uid: u32, gid: u32) -> Result { - Err(Error::new(ENOENT)) - } - - /* Resource operations */ - #[allow(unused_variables)] - fn dup(&self, old_id: usize, buf: &[u8]) -> Result { - Err(Error::new(EBADF)) - } - - #[allow(unused_variables)] - fn read(&self, id: usize, buf: &mut [u8]) -> Result { - Err(Error::new(EBADF)) - } - - #[allow(unused_variables)] - fn write(&self, id: usize, buf: &[u8]) -> Result { - Err(Error::new(EBADF)) - } - - #[allow(unused_variables)] - fn seek(&self, id: usize, pos: isize, whence: usize) -> Result { - Err(Error::new(EBADF)) - } - - #[allow(unused_variables)] - fn fchmod(&self, id: usize, mode: u16) -> Result { - Err(Error::new(EBADF)) - } - - #[allow(unused_variables)] - fn fchown(&self, id: usize, uid: u32, gid: u32) -> Result { - Err(Error::new(EBADF)) - } - - #[allow(unused_variables)] - fn fcntl(&self, id: usize, cmd: usize, arg: usize) -> Result { - Err(Error::new(EBADF)) - } - - #[allow(unused_variables)] - fn fevent(&self, id: usize, flags: EventFlags) -> Result { - Err(Error::new(EBADF)) - } - - #[allow(unused_variables)] - fn fmap_old(&self, id: usize, map: &OldMap) -> Result { - Err(Error::new(EBADF)) - } - #[allow(unused_variables)] - fn fmap(&self, id: usize, map: &Map) -> Result { - if map.flags.contains(MapFlags::MAP_FIXED) { - return Err(Error::new(EINVAL)); - } - self.fmap_old(id, &OldMap { - offset: map.offset, - size: map.size, - flags: map.flags, - }) - } - - #[allow(unused_variables)] - fn funmap_old(&self, address: usize) -> Result { - Ok(0) - } - - #[allow(unused_variables)] - fn funmap(&self, address: usize, length: usize) -> Result { - Ok(0) - } - - #[allow(unused_variables)] - fn fpath(&self, id: usize, buf: &mut [u8]) -> Result { - Err(Error::new(EBADF)) - } - - #[allow(unused_variables)] - fn frename(&self, id: usize, path: &str, uid: u32, gid: u32) -> Result { - Err(Error::new(EBADF)) - } - - #[allow(unused_variables)] - fn fstat(&self, id: usize, stat: &mut Stat) -> Result { - Err(Error::new(EBADF)) - } - - #[allow(unused_variables)] - fn fstatvfs(&self, id: usize, stat: &mut StatVfs) -> Result { - Err(Error::new(EBADF)) - } - - #[allow(unused_variables)] - fn fsync(&self, id: usize) -> Result { - Err(Error::new(EBADF)) - } - - #[allow(unused_variables)] - fn ftruncate(&self, id: usize, len: usize) -> Result { - Err(Error::new(EBADF)) - } - - #[allow(unused_variables)] - fn futimens(&self, id: usize, times: &[TimeSpec]) -> Result { - Err(Error::new(EBADF)) - } - - #[allow(unused_variables)] - fn close(&self, id: usize) -> Result { - Err(Error::new(EBADF)) - } -} diff -Nru temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/scheme/seek.rs temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/scheme/seek.rs --- temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/scheme/seek.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/scheme/seek.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,33 +0,0 @@ -use core::cmp; -use core::convert::TryFrom; -use crate::error::*; -use crate::flag::*; - -/// Helper for seek calls -/// In most cases it's easier to use a usize to track the offset and buffer size internally, -/// but the seek interface uses isize. This wrapper ensures EOVERFLOW errors are returned -/// as appropriate if the value in the usize can't fit in the isize. -pub fn calc_seek_offset_usize(cur_offset: usize, pos: isize, whence: usize, buf_len: usize) -> Result { - let cur_offset = isize::try_from(cur_offset).or_else(|_| Err(Error::new(EOVERFLOW)))?; - let buf_len = isize::try_from(buf_len).or_else(|_| Err(Error::new(EOVERFLOW)))?; - calc_seek_offset_isize(cur_offset, pos, whence, buf_len) -} - -/// Helper for seek calls -/// Result is guaranteed to be positive. -/// EOVERFLOW returned if the arguments would cause an overflow. -/// EINVAL returned if the new offset is out of bounds. -pub fn calc_seek_offset_isize(cur_offset: isize, pos: isize, whence: usize, buf_len: isize) -> Result { - let new_offset = match whence { - SEEK_CUR => pos.checked_add(cur_offset), - SEEK_END => pos.checked_add(buf_len), - SEEK_SET => Some(pos), - _ => None, - }; - - match new_offset { - Some(new_offset) if new_offset < 0 => Err(Error::new(EINVAL)), - Some(new_offset) => Ok(cmp::min(new_offset, buf_len)), - None => Err(Error::new(EOVERFLOW)) - } -} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/tests.rs temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/tests.rs --- temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/tests.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/redox_syscall-0.3.5/src/tests.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,442 +0,0 @@ -#[test] -fn clone() { - let expected_status = 42; - let pid_res = unsafe { crate::clone(crate::CloneFlags::empty()) }; - if pid_res == Ok(0) { - crate::exit(expected_status).unwrap(); - panic!("failed to exit"); - } else { - let pid = dbg!(pid_res).unwrap(); - let mut status = 0; - assert_eq!(dbg!(crate::waitpid(pid, &mut status, crate::WaitFlags::empty())), Ok(pid)); - assert_eq!(dbg!(crate::wifexited(status)), true); - assert_eq!(dbg!(crate::wexitstatus(status)), expected_status); - } -} - -//TODO: close - -#[test] -fn clock_gettime() { - let mut tp = crate::TimeSpec::default(); - assert_eq!(dbg!( - crate::clock_gettime(crate::CLOCK_MONOTONIC, &mut tp) - ), Ok(0)); - assert_ne!(dbg!(tp), crate::TimeSpec::default()); - - tp = crate::TimeSpec::default(); - assert_eq!(dbg!( - crate::clock_gettime(crate::CLOCK_REALTIME, &mut tp) - ), Ok(0)); - assert_ne!(dbg!(tp), crate::TimeSpec::default()); -} - -//TODO: dup - -//TODO: dup2 - -//TODO: exit (handled by clone?) - -//TODO: fchmod - -//TODO: fcntl - -#[test] -fn fexec() { - let name = "file:/bin/ls"; - - let fd = dbg!( - crate::open(name, crate::O_RDONLY | crate::O_CLOEXEC) - ).unwrap(); - - let args = &[ - [name.as_ptr() as usize, name.len()] - ]; - - let vars = &[]; - - let pid_res = unsafe { crate::clone(crate::CloneFlags::empty()) }; - if pid_res == Ok(0) { - crate::fexec(fd, args, vars).unwrap(); - panic!("failed to fexec"); - } else { - assert_eq!(dbg!(crate::close(fd)), Ok(0)); - - let pid = dbg!(pid_res).unwrap(); - let mut status = 0; - assert_eq!(dbg!(crate::waitpid(pid, &mut status, crate::WaitFlags::empty())), Ok(pid)); - assert_eq!(dbg!(crate::wifexited(status)), true); - assert_eq!(dbg!(crate::wexitstatus(status)), 0); - } -} - -#[test] -fn fmap() { - use std::slice; - - let fd = dbg!( - crate::open( - "file:/tmp/syscall-tests-fmap", - crate::O_CREAT | crate::O_RDWR | crate::O_CLOEXEC - ) - ).unwrap(); - - let size = 128; - - let map = unsafe { - slice::from_raw_parts_mut( - dbg!( - crate::fmap(fd, &crate::Map { - address: 0, - offset: 0, - size, - flags: crate::PROT_READ | crate::PROT_WRITE - }) - ).unwrap() as *mut u8, - 128 - ) - }; - - // Maps should be available after closing - assert_eq!(dbg!(crate::close(fd)), Ok(0)); - - for i in 0..128 { - map[i as usize] = i; - assert_eq!(map[i as usize], i); - } - - //TODO: add msync - unsafe { - assert_eq!(dbg!( - crate::funmap(map.as_mut_ptr() as usize, size) - ), Ok(0)); - } -} - -// funmap tested by fmap - -#[test] -fn fpath() { - use std::str; - - let path = "file:/tmp/syscall-tests-fpath"; - let fd = dbg!( - crate::open( - dbg!(path), - crate::O_CREAT | crate::O_RDWR | crate::O_CLOEXEC - ) - ).unwrap(); - - let mut buf = [0; 4096]; - let count = dbg!( - crate::fpath(fd, &mut buf) - ).unwrap(); - - assert_eq!(dbg!(str::from_utf8(&buf[..count])), Ok(path)); - - assert_eq!(dbg!(crate::close(fd)), Ok(0)); -} - -//TODO: frename - -#[test] -fn fstat() { - let path = "file:/tmp/syscall-tests-fstat"; - let fd = dbg!( - crate::open( - dbg!(path), - crate::O_CREAT | crate::O_RDWR | crate::O_CLOEXEC - ) - ).unwrap(); - - let mut stat = crate::Stat::default(); - assert_eq!(dbg!(crate::fstat(fd, &mut stat)), Ok(0)); - assert_ne!(dbg!(stat), crate::Stat::default()); - - assert_eq!(dbg!(crate::close(fd)), Ok(0)); -} - -#[test] -fn fstatvfs() { - let path = "file:/tmp/syscall-tests-fstatvfs"; - let fd = dbg!( - crate::open( - dbg!(path), - crate::O_CREAT | crate::O_RDWR | crate::O_CLOEXEC - ) - ).unwrap(); - - let mut statvfs = crate::StatVfs::default(); - assert_eq!(dbg!(crate::fstatvfs(fd, &mut statvfs)), Ok(0)); - assert_ne!(dbg!(statvfs), crate::StatVfs::default()); - - assert_eq!(dbg!(crate::close(fd)), Ok(0)); -} - -//TODO: fsync - -//TODO: ftruncate - -//TODO: futimens - -//TODO: futex - -#[test] -fn getegid() { - assert_eq!(crate::getegid(), Ok(0)); -} - -#[test] -fn getens() { - assert_eq!(crate::getens(), Ok(1)); -} - -#[test] -fn geteuid() { - assert_eq!(crate::geteuid(), Ok(0)); -} - -#[test] -fn getgid() { - assert_eq!(crate::getgid(), Ok(0)); -} - -#[test] -fn getns() { - assert_eq!(crate::getns(), Ok(1)); -} - -//TODO: getpid - -//TODO: getpgid - -//TODO: getppid - -#[test] -fn getuid() { - assert_eq!(crate::getuid(), Ok(0)); -} - -//TODO: iopl - -//TODO: kill - -//TODO: link (probably will not work) - -#[test] -fn lseek() { - let path = "file:/tmp/syscall-tests-lseek"; - let fd = dbg!( - crate::open( - dbg!(path), - crate::O_CREAT | crate::O_RDWR | crate::O_CLOEXEC - ) - ).unwrap(); - - { - let mut buf = [0; 256]; - for i in 0..buf.len() { - buf[i] = i as u8; - } - assert_eq!(dbg!(crate::write(fd, &buf)), Ok(buf.len())); - - assert_eq!(dbg!(crate::lseek(fd, 0, crate::SEEK_CUR)), Ok(buf.len())); - assert_eq!(dbg!(crate::lseek(fd, 0, crate::SEEK_SET)), Ok(0)); - assert_eq!(dbg!(crate::lseek(fd, 0, crate::SEEK_END)), Ok(buf.len())); - assert_eq!(dbg!(crate::lseek(fd, 0, crate::SEEK_SET)), Ok(0)); - } - - { - let mut buf = [0; 256]; - assert_eq!(dbg!(crate::read(fd, &mut buf)), Ok(buf.len())); - for i in 0..buf.len() { - assert_eq!(buf[i], i as u8); - } - - assert_eq!(dbg!(crate::lseek(fd, 0, crate::SEEK_CUR)), Ok(buf.len())); - assert_eq!(dbg!(crate::lseek(fd, 0, crate::SEEK_SET)), Ok(0)); - assert_eq!(dbg!(crate::lseek(fd, 0, crate::SEEK_END)), Ok(buf.len())); - assert_eq!(dbg!(crate::lseek(fd, 0, crate::SEEK_SET)), Ok(0)); - } - - assert_eq!(dbg!(crate::close(fd)), Ok(0)); -} - -//TODO: mkns - -//TODO: mprotect - -#[test] -fn nanosleep() { - let req = crate::TimeSpec { - tv_sec: 0, - tv_nsec: 0, - }; - let mut rem = crate::TimeSpec::default(); - assert_eq!(crate::nanosleep(&req, &mut rem), Ok(0)); - assert_eq!(rem, crate::TimeSpec::default()); -} - -//TODO: open - -//TODO: physalloc - -//TODO: physfree - -//TODO: physmap - -//TODO: physunmap - -#[test] -fn pipe2() { - let mut fds = [0, 0]; - assert_eq!(dbg!(crate::pipe2(&mut fds, crate::O_CLOEXEC)), Ok(0)); - assert_ne!(dbg!(fds), [0, 0]); - - { - let mut buf = [0; 256]; - for i in 0..buf.len() { - buf[i] = i as u8; - } - assert_eq!(dbg!(crate::write(fds[1], &buf)), Ok(buf.len())); - } - - { - let mut buf = [0; 256]; - assert_eq!(dbg!(crate::read(fds[0], &mut buf)), Ok(buf.len())); - for i in 0..buf.len() { - assert_eq!(buf[i], i as u8); - } - } - - assert_eq!(dbg!(crate::close(fds[0])), Ok(0)); - assert_eq!(dbg!(crate::close(fds[1])), Ok(0)); -} - -//TODO: read - -#[test] -fn rmdir() { - let path = "file:/tmp/syscall-tests-rmdir"; - let fd = dbg!( - crate::open( - dbg!(path), - crate::O_CREAT | crate::O_DIRECTORY | crate::O_CLOEXEC - ) - ).unwrap(); - - assert_eq!(dbg!(crate::close(fd)), Ok(0)); - - assert_eq!(dbg!(crate::rmdir(path)), Ok(0)); -} - -//TODO: setpgid - -//TODO: setregid - -//TODO: setrens - -//TODO: setreuid - -//TODO: sigaction - -//TODO: sigprocmask - -//TODO: sigreturn - -#[test] -fn umask() { - let old = dbg!(crate::umask(0o244)).unwrap(); - assert_eq!(dbg!(crate::umask(old)), Ok(0o244)); -} - -#[test] -fn unlink() { - let path = "file:/tmp/syscall-tests-unlink"; - let fd = dbg!( - crate::open( - dbg!(path), - crate::O_CREAT | crate::O_RDWR | crate::O_CLOEXEC - ) - ).unwrap(); - - assert_eq!(dbg!(crate::close(fd)), Ok(0)); - - assert_eq!(dbg!(crate::unlink(path)), Ok(0)); -} - -//TODO: virttophys - -// waitpid tested by clone - -//TODO: write - -#[test] -fn sched_yield() { - assert_eq!(dbg!(crate::sched_yield()), Ok(0)); -} - -#[test] -fn sigaction() { - use std::{ - mem, - sync::atomic::{AtomicBool, Ordering} - }; - - static SA_HANDLER_WAS_RAN: AtomicBool = AtomicBool::new(false); - static SA_HANDLER_2_WAS_IGNORED: AtomicBool = AtomicBool::new(false); - - let child = unsafe { crate::clone(crate::CLONE_VM).unwrap() }; - - if child == 0 { - let pid = crate::getpid().unwrap(); - - extern "C" fn hello_im_a_signal_handler(signal: usize) { - assert_eq!(signal, crate::SIGUSR1); - SA_HANDLER_WAS_RAN.store(true, Ordering::SeqCst); - } - - let my_signal_handler = crate::SigAction { - sa_handler: Some(hello_im_a_signal_handler), - ..Default::default() - }; - crate::sigaction(crate::SIGUSR1, Some(&my_signal_handler), None).unwrap(); - - crate::kill(pid, crate::SIGUSR1).unwrap(); // calls handler - - let mut old_signal_handler = crate::SigAction::default(); - crate::sigaction( - crate::SIGUSR1, - Some(&crate::SigAction { - sa_handler: unsafe { mem::transmute::>(crate::SIG_IGN) }, - ..Default::default() - }), - Some(&mut old_signal_handler) - ).unwrap(); - assert_eq!(my_signal_handler, old_signal_handler); - - crate::kill(pid, crate::SIGUSR1).unwrap(); // does nothing - - SA_HANDLER_2_WAS_IGNORED.store(true, Ordering::SeqCst); - - crate::sigaction( - crate::SIGUSR1, - Some(&crate::SigAction { - sa_handler: unsafe { mem::transmute::>(crate::SIG_DFL) }, - ..Default::default() - }), - Some(&mut old_signal_handler) - ).unwrap(); - - crate::kill(pid, crate::SIGUSR1).unwrap(); // actually exits - } else { - let mut status = 0; - dbg!(crate::waitpid(child, &mut status, crate::WaitFlags::empty())).unwrap(); - - assert!(crate::wifsignaled(status)); - assert_eq!(crate::wtermsig(status), crate::SIGUSR1); - - assert!(SA_HANDLER_WAS_RAN.load(Ordering::SeqCst)); - assert!(SA_HANDLER_2_WAS_IGNORED.load(Ordering::SeqCst)); - } -} diff -Nru temporalio-1.3.0/vendor/regex/bench/README.md temporalio-1.3.0/vendor/regex/bench/README.md --- temporalio-1.3.0/vendor/regex/bench/README.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/regex/bench/README.md 1970-01-01 00:00:00.000000000 +0000 @@ -1,2 +0,0 @@ -Benchmarks for this crate have been moved into the rebar project: -https://github.com/BurntSushi/rebar diff -Nru temporalio-1.3.0/vendor/regex/.cargo-checksum.json temporalio-1.3.0/vendor/regex/.cargo-checksum.json --- temporalio-1.3.0/vendor/regex/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/regex/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"CHANGELOG.md":"e77650ae39a200cd7cb7aea153e5fbe03e68179af0d192416a395f0cf7e573e7","Cargo.toml":"a8d510f250e770370e021f8f5a4af09504b308ceb72311f32558b17a80958e22","Cross.toml":"4a11d6c63ecc919016b59fa0fe23674eb05682fb91ffbe677a4a7077e9e684ff","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","README.md":"984b116bf94decdcb0fcdeb14641b332c9fe40da63e5a256dd39eb91a2e13387","UNICODE.md":"845fca1982e82e190109a784952579fce54faea120b702b7efd61164a12f601f","bench/README.md":"0aee42206b0e5edcb400a11faa2c536f512bcc6086e5ffdda001b9bfe4d19808","record/README.md":"02e6f85f8a43f18540e4a52a75d1001494df7aceac3873e9a13e3ceba190206d","record/compile-test/2023-04-19_1.7.3.csv":"460059ba2f10456175ff92bd75d4a365b14a1843e2b46e7b285d58da59e6d3ca","record/compile-test/2023-04-20_master.csv":"6b94df278e4ed82a3fd0d4bfe92a4614714e00435e983c7649ee9f54925f906e","record/compile-test/2023-07-05.csv":"cf00b4981b8c12980113810dba40e2063a8400354ad4dab16f7c212ff0b5db74","record/compile-test/README.md":"ba2b606993edd8d705ad1677ec954862614e52b028407e1908bb5dfb07767f2d","record/old-bench-log/01-lazy-dfa/dynamic":"dec9f74b8835403c71edc0c2d93bbdde0f5a0e37d46585e416c80496d5b14497","record/old-bench-log/01-lazy-dfa/dynamic-no-lazy-dfa":"c0ce02bef9ada8cd55672f0a9c3c5fc64f71e08bfb2b45978082a140b4fc111f","record/old-bench-log/01-lazy-dfa/native":"9de61ff787e36f5c6f1eaec68b8bb0583e57b0aad23712afe8c0048988c761b8","record/old-bench-log/01-lazy-dfa/nfa":"38c0be44a00b2caef17101bc425410fec2958e4df6da25d2ba5b6664f8bccad9","record/old-bench-log/01-lazy-dfa/pcre":"3b38026c24e4ca487ff62de83cc093ccb46b918f4875663249ff84ce27636942","record/old-bench-log/02-set/dynamic":"8ef5c00f0ac42e5f008e4b6337669527b48fba38df94c50d3e683c6aac66a48c","record/old-bench-log/03-bytes/onig":"f32347a6e0f25f46ad1b0aa736c29eca47c25f90d32c8823ea0d14204859a35b","record/old-bench-log/03-bytes/pcre":"b90982575c0ad55617b2ce50c2e9853d090502bf07e1eb19edf9009d3c9f2987","record/old-bench-log/03-bytes/rust":"b1e70e5ae48a9c726d8cd8a98019c0efe5a1095563c61cf0ac75e24de32461b4","record/old-bench-log/03-bytes/rust-bytes":"fbf0e6cb8102c7ca8e59bd459bb0ae7f1feaf8103def70b8d4793c59e68e8736","record/old-bench-log/04/onig":"4e34e2ede0a806b8ee540e63e4babee38049e5a8ab3be99c4f5d8b02bbc653fd","record/old-bench-log/04/pcre1-jit":"736c4941e991ef94f76379cf2187d0ea2a41b052cf80c94d0dd0c9ea758a6491","record/old-bench-log/04/pcre2-jit":"00e7bbf7749904fca8dff9b441d15bbe670f37b427e385ddf740f7a49de3b1fb","record/old-bench-log/04/re2":"b8b8595f6b68da127b56dc7c61a9fd15548251fda1be9d2c50c2d48382e887b6","record/old-bench-log/04/rust":"c5a6b918e815294f0c4e3d37267c444d49692ff131c5a08f7462c24d0721fcec","record/old-bench-log/04/tcl":"c4d8d12b8cf48ff2017549e95e49dc95a90ea15483834cd70d2d7d7c237bbd32","record/old-bench-log/05/onig":"70a4da9aafaefa6493cd09d3a529dd5d2d9eacf390bb093681bc7be28a1f926c","record/old-bench-log/05/onig-vs-rust":"b942a79735b7330241437776c15b18f4db3eff01d3e6c35494f4a8732e74a23a","record/old-bench-log/05/pcre1":"b29b7efbe79b55ce0aaf24bbbecc376a865fa219a68d96124e3d95951cdb47f4","record/old-bench-log/05/pcre1-vs-rust":"a458e5c62f0500898e08757753c10981551649656432ec096f0c82b414ef8d82","record/old-bench-log/05/pcre2":"faa93937c3490cfdff88c32dc04e57f2ae881923b87781e5fe876535fd690770","record/old-bench-log/05/pcre2-vs-rust":"bf9faa6a679dd98e9452e52c0941d2eb84dcf0b6632c15507f8334ed7bc309da","record/old-bench-log/05/re2":"692866b28e1bc368c7a59f519b8dfe1da50a135946ce153298a0ab228a5ee59d","record/old-bench-log/05/re2-vs-rust":"55e4cb14c397574751aebe38068c429a4580a5e309857b2715047944903dca58","record/old-bench-log/05/rust":"aac6acda9f63e51613712d0a33bb7fb46dfc7adc425f76b9b71195be8c8a42e7","record/old-bench-log/05/tcl":"f03e39eccd3252162cc6099bb0426014df669d299ba0ef79e89b8401886a5172","record/old-bench-log/05/tcl-vs-rust":"ae6ac4668573bf5488cc235c5da16ad9358d07b7644207d9bcea88ba6f5514a6","record/old-bench-log/06/dphobos-dmd":"473328306be335a0320c690d9c2dbefdf7f2f5a80e4ca69443c7ed2e81bb093f","record/old-bench-log/06/dphobos-dmd-ct":"60341c736382a6db21d9889369ea4617c521acbf30d4b3bf38bcd17f4f85b9b1","record/old-bench-log/06/dphobos-ldc":"ae60c2bed84afb89ae43615f26de4cc5d0042e179089b639507378518eed3252","record/old-bench-log/06/dphobos-ldc-ct":"a157ef450793b73de3a816fab1d93a6d11e90a817082bae5e3da02a66fcc833f","record/old-bench-log/06/pcre1":"ad10fd7db732e8670dd3d4eedb05f48f547b4782495aaadff8ec25a6ea1992a0","record/old-bench-log/06/pcre2":"f789a73bd41a0bc401bdebe7f10a03a8aa587de48643d88507d16181a8fa39d3","record/old-bench-log/06/re2":"203c273a110d71f5edf722630202a6142c39d6b7a9951686adf8b9c20c5db278","record/old-bench-log/06/rust":"6a642a16cd279c99ef5a580a25fb3a63ac6239cd73df9261c02912fa08145753","record/old-bench-log/07/boost":"255bc652c4d9e9d20aa9b22d8d86e952e7ec6c8b9fcde0c3d6e38c967e04d40e","record/old-bench-log/07/dphobos-dmd":"fb3ac60037050858611145ca3e71412164688dcdec52c022787d33304e022260","record/old-bench-log/07/dphobos-dmd-ct":"40a5088441f8ffe3dae0abaf31c105cedfbe3b56c06772f075947d504976d2ed","record/old-bench-log/07/oniguruma":"ae0cd60adb15845eb9ef706111d4ee0e6ad5a58f0276b787d68bd7d637f8f7c6","record/old-bench-log/07/pcre1":"a812d065ec248249f9bb3d6d970f15c18d342f6b443265ad4b07fa91b73575cc","record/old-bench-log/07/pcre2":"88230663eccd0b382cf5be81ce1ae6cfa3fa835a65a31c1eba4369d2e8de5d27","record/old-bench-log/07/re2":"e330ef21ce44351afc3c43821d862e9c625877606569f3af0ddbadcd7b21c602","record/old-bench-log/07/rust":"d8c6bd5c46f5df9d0ac222f7be7793527a8137d273c8826b3715c67e16209aac","record/old-bench-log/07/rust-bytes":"e21d02fa2ef1e5ed7204920b33ed24c9fb620e068ed47ed6879b72e76369a27e","record/old-bench-log/07/stdcpp":"9df02d89dc8232c700b8cf8bc6f1ece3ca7af84ab52e67a660039d6c9168aed4","record/old-bench-log/07/stdcpp-libcxx":"f90849a0b5dc11dc0280ad97886e92e1d91c080403ad7a4ecd638a26fe5e8c5e","record/old-bench-log/07/tcl":"7f6e347bb507f9c00ff664d3e627c0a9cf842b416eeb2af9f3b6cccd041c58e4","record/old-bench-log/08-new-memmem/rust-after-01":"646c7d50aea9c560a35eb60116f301f4fb8d4b03fd5814d8b24adffd070332e3","record/old-bench-log/08-new-memmem/rust-after-02":"14e7fb6c6faa85a8f90617528cef79ae382aeba07c2e5c253c68445902b060ba","record/old-bench-log/08-new-memmem/rust-before-01":"7e3b58de0f502c1a1bf6d27e0e85c654b1189716f7374cec4ed4dd365b13101f","record/old-bench-log/08-new-memmem/rust-before-02":"ab6d09529eeeca7ff0da945d59701dbbcfdec5e05581bb9bf154779d12a35e53","record/old-bench-log/09-new-baseline/pcre2":"28df8e2762f267d1ea628906a6e4bbc21f99e6a445bd322c86d0ca483b21b5b3","record/old-bench-log/09-new-baseline/re2":"421437193cc3f159c178479f98bde8dbe27883ec7757b1ddd8d745862f5899ff","record/old-bench-log/09-new-baseline/rust":"6f932a769171b6cdb717c9d01e44a70762ef660c4045b9d2bb3797a9bdf65405","record/old-bench-log/09-new-baseline/rust-bytes":"9c5acd5c1eeac9acfe76d03588041f9b6d65b4351085c3510888ceeb83e8a7b5","record/old-bench-log/10-last-frontier/rust-after-literal.log":"02baef9b3b49acbbff43e81f48ea5a9287e30ff4fc298a3f3b48991d8374aabf","record/old-bench-log/10-last-frontier/rust-before-literal.log":"e5a3bcc2b9e93cf3cb27bc9e6305b3bc03215751bbeef2a70fb25577d6b42874","record/old-bench-log/10-last-frontier/rust-bytes-after-literal.log":"29834c7a5396ac61acedd07c0b7ca60716865ec3e70f35fbaa7826a2309a79d9","record/old-bench-log/10-last-frontier/rust-bytes-before-literal.log":"4e7468a3e8629814bd4af91e2a8eb42d0899d352b5dff3058b801aa637046be2","record/old-bench-log/11-regex-1.7.3/rust":"d7cc18a62070ea7a999e1ba2458f26cf94595f1af276c2b3e96cee638eccf3f0","record/old-bench-log/11-regex-1.7.3/rust-bytes":"64c7458020139bd7a03d1cb0927b741e6972377b686626563acb86fbc66414ca","record/old-bench-log/12-regex-1.8.1/rust":"a538c42e77e20956e81fb5a4e2e1e7d3fdf60da019d7e3df52d93f57367a3fbd","record/old-bench-log/12-regex-1.8.1/rust-bytes":"fbb00fdf8f039ce312f5346a67dddaa5e129280a93a90d7aaf6b5a9a71d2f212","record/old-bench-log/13-regex-1.9.0/rust":"0ef62700ba3fc24887af74b7942490c90b4cd2814b8fda200f7376e43391bfce","record/old-bench-log/13-regex-1.9.0/rust-bytes":"676d501d4667f0a945c88ebb56839176dd3a5a6b45af7708b1e870bf26d12603","record/old-bench-log/README.md":"d359f536fb4b8c1af9af3465a027c3522f62c3871aad44645a955b650d7deec0","record/old-bench-log/old/01-before":"c2ea2750fca8ac1742003fe2106e9422d49e92967d3fe0267f24b7ec830b07e3","record/old-bench-log/old/02-new-syntax-crate":"27fd8b3d35cf08d434035ff7d9f2e9e3c94a167e45ba655567c73ae96830f1d8","record/old-bench-log/old/03-new-syntax-crate":"d942a2b95c3a2d8f85f3f17934f258bdc84baa33e91986e8a6810ca8d6e9cc50","record/old-bench-log/old/04-fixed-benchmark":"0da29ef39ac07ece411c151ab479a76944946aba992547b15d90ec2d5484e85c","record/old-bench-log/old/05-thread-caching":"e364d87131e43187d6757426839789d1b6b47b3f3af21280daa9193d5ab19f64","record/old-bench-log/old/06-major-dynamic":"3bc2b8fd2714ae9f19b2e4f4219654982522daf01b5d3055b4aec0458afeaf13","record/old-bench-log/old/06-major-macro":"d5617ed23e71d5298ed4d629eee257e401c352fd1c91a2048dfeb1677527d4e7","record/old-bench-log/old/07-prefix-improvements":"9277d1392c85a38db215a9b69e3b0cd4a9901f8f1c72c706ca262e5f099b8819","record/old-bench-log/old/08-case-fixes":"f97cd3675cf5c967e4ca8841f2368e9eadf538b542bfe3035d31492afc5934bf","record/old-bench-log/old/09-before-compiler-rewrite":"b928686819dbd9aeaa6639b01b63a48428653f2f676a4e15d61cddec421e0389","record/old-bench-log/old/10-compiler-rewrite":"697b295ee377a5cb287d403593bfb8c078270b4e19e8d61d0b95b06ee7c903ab","record/old-bench-log/old/11-compiler-rewrite":"3f0ba494a0d82e7419285a9686474dc7763d4da0dd3faaa3bec3f624bbede481","record/old-bench-log/old/12-executor":"962e182f9a1cfddb8c0cd2d8c4681febef1430082c9a38e5373c9117b853e65e","record/old-bench-log/old/12-executor-bytes":"e01a1e878b44c80724e9bf09bb11210eeb8f01518ac7f0e3e7f2ee241281e500","record/old-bench-log/old/13-cache-byte-range-suffixes":"1d67d58a39f9177a79c26f3c6c2a1caaf51f085ce137711ab9ba74071c14680c","rustfmt.toml":"1ca600239a27401c4a43f363cf3f38183a212affc1f31bff3ae93234bbaec228","src/builders.rs":"6dbff8c7ff7febe031dbef3eafe1f02a15112ff1ffd889761a21c10b0dd84f03","src/bytes.rs":"cce2b7012f5896cf82fc3086bf8128dc9efe2b69bf6917d041c1a171eabacdc0","src/error.rs":"4ac8361e900627a87a2ac78e5d475be17c455fe6850d1515bf5b874837c4ae25","src/find_byte.rs":"e17cd3b765467685946707840b92ea4e37d3c11081fbf316174a15858cd4bd99","src/lib.rs":"1be6ce04d4fce06a7e46bc006bbf536f5a7f82d97dc71e7f7489a6d2610f790b","src/pattern.rs":"5f37755a7c16902d861377645f57a20314961f86298d4b35ae6e1058ca4e9801","src/regex/bytes.rs":"0d5ae71d9963bc7492f8687508dcfdf05f9e5e01b2c10c350a281ec3ddefb062","src/regex/mod.rs":"c220b6dd7a5e1945f8e743d1dcd796c5f782c91b0c34eb9915c588174a517fe8","src/regex/string.rs":"e1f76e5f21597da6c76514b579a1fff8c061ecd134ac4ce16ab4cddc052b270d","src/regexset/bytes.rs":"6290dd81f47fb6cdbaa358be2340398a2a640320373d334e4c977bf30b5a9220","src/regexset/mod.rs":"c220b6dd7a5e1945f8e743d1dcd796c5f782c91b0c34eb9915c588174a517fe8","src/regexset/string.rs":"977bc167c48c7c99187599c5071ca197e61a56359d32a26b9dbc1b58a5ef1c4d","test":"c0122c20a2c9b7ba6e9a8aaeb2b7d9910315ef31063539949f28d9501ef3193c","testdata/README.md":"c0514501526560d7f6171eb6d982ad61b4527760cb38a4bfbe8e28036ff37b95","testdata/anchored.toml":"7a1b5cd81deed2099796a451bf764a3f9bd21f0d60c0fa46accd3a35666866f2","testdata/bytes.toml":"1d84179165fd25f3b94bd2bfbeb43fc8a162041f7bf98b717e0f85cef7fb652b","testdata/crazy.toml":"a146e2d2e23f1a57168979d9b1fc193c2ba38dca66294b61140d6d2a2958ec86","testdata/crlf.toml":"d19cf22756434d145dd20946c00af01c102a556a252070405c3c8294129d9ece","testdata/earliest.toml":"d561e643623ee1889b5b049fdcf3c7cb71b0c746d7eb822ddbd09d0acda2620b","testdata/empty.toml":"738dbe92fbd8971385a1cf3affb0e956e5b692c858b9b48439d718f10801c08e","testdata/expensive.toml":"5ce2f60209c99cdd2cdcb9d3069d1d5ca13d5e08a85e913efe57267b2f5f0e9d","testdata/flags.toml":"9a7e001808195c84f2a7d3e18bc0a82c7386e60f03a616e99af00c3f7f2c3fd4","testdata/fowler/basic.toml":"a82c7e233451cd7cfe0c3d817f3a1ab44478bb81ae62432efdd515fa8370275e","testdata/fowler/dat/README":"e53d6c37b5931cb26dc9ae4c40358eea63f7a469c4db6ca816c072a8ced6a61a","testdata/fowler/dat/basic.dat":"b1126dda59075c08f574987090273c9977790115f1e1941d0708c0b82b256905","testdata/fowler/dat/nullsubexpr.dat":"e5cd4145dffa8bc66f2d39079950b2bb7bae21a521514b83b557b92f4a871a9e","testdata/fowler/dat/repetition.dat":"2b8b2b191229a804fba49e6b888d8194bf488f7744057b550da9d95a2aa6617a","testdata/fowler/nullsubexpr.toml":"cd812e7e8fa0469253b34f0db93b5883c9d8b9740fc4f7825a38e7df880a4eed","testdata/fowler/repetition.toml":"8c09164f064b3db81309c53483863bdcec493781644de162416e9f485e772615","testdata/iter.toml":"6875460302974a5b3073a7304a865c45aba9653c54afea2c4d26e1ea248a81f7","testdata/leftmost-all.toml":"903bfbeff888b7664296f4d5aa367ce53d1dafe249ab0a3359223ae94d596396","testdata/line-terminator.toml":"02148068137b69d95587966917bdf0697bf7eb41ad6d47387f2eb30f67d04fd9","testdata/misc.toml":"32c9591655c6fb118dfefcb4de49a04820a63cb960533dfc2538cdaabf4f4047","testdata/multiline.toml":"eb07cf5427e6ddbcf61f4cc64c2d74ff41b5ef75ef857959651b20196f3cd157","testdata/no-unicode.toml":"d209da04506900fd5f69e48170cddaad0702355ac6176c3a75ab3ff96974457c","testdata/overlapping.toml":"5d96497a7233566d40b05ba22047e483fa8662e45515a9be86da45cf6c28703a","testdata/regex-lite.toml":"fecca7cc8c9cea2e1f84f846a89fd9b3ca7011c83698211a2eeda8924deb900c","testdata/regression.toml":"6006ef4fcfbfd7155ce5ce8b8427904f7261c5549396f20cb065c0294733686d","testdata/set.toml":"dfd265dc1aee80026e881616840df0236ae9abf12467d7ec0e141a52c236128c","testdata/substring.toml":"48122d9f3477ed81f95e3ad42c06e9bb25f849b66994601a75ceae0693b81866","testdata/unicode.toml":"7e4b013039b0cdd85fa73f32d15d096182fe901643d4e40c0910087a736cd46d","testdata/utf8.toml":"2eabce0582bcacb2073e08bbe7ca413f096d14d06e917b107949691e24f84b20","testdata/word-boundary-special.toml":"7d0ea2f796478d1ca2a6954430cb1cfbd04031a182f8611cb50a7c73e443ce33","testdata/word-boundary.toml":"51bc1c498ab825420340a2dd3e6623de4054937ba6d5020ff8cd14b1c1e45271","tests/fuzz/mod.rs":"7b01a803e1c0b5a45c062d493723553f263c57e269eade1475eb789694635d5c","tests/fuzz/testdata/crash-7eb3351f0965e5d6c1cb98aa8585949ef96531ff":"be4f42497ac9358eb020bf17cd8fdb9743691824e01d744504613ea2bfb2f663","tests/fuzz/testdata/crash-8760b19b25d74e3603d4c643e9c7404fdd3631f9":"19df9a1e1b5a3c0f31cc038b9f2991b161d8577b4a0c8b2fc391cdfecdb6dd85","tests/fuzz/testdata/crash-cd33b13df59ea9d74503986f9d32a270dd43cc04":"2fde1668e9e3e60943c28d97c01c90dd3d3882f48475f060ccaf961c228069e8","tests/fuzz/testdata/minimized-from-8760b19b25d74e3603d4c643e9c7404fdd3631f9":"c9e00f7a31453708560900aa51e358dd5551df494439860594be97bb1fb933ba","tests/fuzz/testdata/slow-unit-3ab758ea520027fefd3f00e1384d9aeef155739e":"4433011f7af46e855e843635cf24a49713bd5705f67176ed928f04d24eda1857","tests/fuzz/testdata/slow-unit-5345fccadf3812c53c3ccc7af5aa2741b7b2106c":"95782a847fc64e9cccdf76e9540b0d16ce80db5d05157a88b958b763f9b8479b","tests/fuzz/testdata/slow-unit-6bd643eec330166e4ada91da2d3f284268481085":"8ddff12288f6f20cc9d65db76bd8187834f64f844aad48a340d082555ad5cb56","tests/fuzz/testdata/slow-unit-93c73a43581f205f9aaffd9c17e52b34b17becd0":"eea6919a75fde163634b890e2253a0918cf0ba092357fa617f368bbfa131ba30","tests/fuzz/testdata/slow-unit-9ca9cc9929fee1fcbb847a78384effb8b98ea18a":"a806f73b900046977267acceb83b105bac7ee21ede2edc2927afe1e1f0149f00","tests/fuzz/testdata/slow-unit-b8a052f4254802edbe5f569b6ce6e9b6c927e9d6":"9540cf58241cde3bc0db8364e0ccff67ff1ff9721c85b0d2ca27354c0cbf2650","tests/lib.rs":"9bffc95568c09ac95b6a3e7ca64b6e858a0552d0c0b0fca2c447da3b9c0a45a2","tests/misc.rs":"5ac5858325451e1d70f308ca0bcead5a354d095a7473800c11065231c319c456","tests/regression.rs":"3490aac99fdbf3f0949ba1f338d5184a84b505ebd96d0b6d6145c610587aa60b","tests/regression_fuzz.rs":"57e0bcba0fdfa7797865e35ae547cd7fe1c6132b80a7bfdfb06eb053a568b00d","tests/replace.rs":"78ff9bf7f78783ad83a78041bb7ee0705c7efc85b4d12301581d0ce5b2a59325","tests/searcher.rs":"04152e5c86431deec0c196d2564a11bc4ec36f14c77e8c16a2f9d1cbc9fc574e","tests/suite_bytes.rs":"7697b04e5b181aa78b3654bd2dbe1c792d9626197573ed8c649f1da8b481817d","tests/suite_bytes_set.rs":"d970168fab57a9edc60ff26a2bb7d0cc714d4298e4ee9eadba9da44a6569f2bb","tests/suite_string.rs":"1be0cf8922171f8323f99e8ecedbbf1846d339620d0dc2fd490901cbbbd2622e","tests/suite_string_set.rs":"22743107206d913521f9adb728482aed3a9625ff7b15a83df057bbf1f7050e03"},"package":"380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343"} \ No newline at end of file +{"files":{"CHANGELOG.md":"d5b7c269894164ecff4920d7c48eb8d1ce84ffd6e7f804caa4043d66e206a86a","Cargo.toml":"7aad5ec2fbf88d35f58a39dc5dc566e6351b96cddaad8ac1c7c627abd0b0d320","Cross.toml":"4a11d6c63ecc919016b59fa0fe23674eb05682fb91ffbe677a4a7077e9e684ff","HACKING.md":"17818f7a17723608f6bdbe6388ad0a913d4f96f76a16649aaf4e274b1fa0ea97","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","README.md":"932f36c0fc3ac869fcca51018e6c87c75278665d42e51d22834fa52ceec2c95c","UNICODE.md":"845fca1982e82e190109a784952579fce54faea120b702b7efd61164a12f601f","record/README.md":"02e6f85f8a43f18540e4a52a75d1001494df7aceac3873e9a13e3ceba190206d","record/compile-test/2023-04-19_1.7.3.csv":"460059ba2f10456175ff92bd75d4a365b14a1843e2b46e7b285d58da59e6d3ca","record/compile-test/2023-04-20_master.csv":"6b94df278e4ed82a3fd0d4bfe92a4614714e00435e983c7649ee9f54925f906e","record/compile-test/2023-07-05.csv":"cf00b4981b8c12980113810dba40e2063a8400354ad4dab16f7c212ff0b5db74","record/compile-test/README.md":"ba2b606993edd8d705ad1677ec954862614e52b028407e1908bb5dfb07767f2d","record/old-bench-log/01-lazy-dfa/dynamic":"dec9f74b8835403c71edc0c2d93bbdde0f5a0e37d46585e416c80496d5b14497","record/old-bench-log/01-lazy-dfa/dynamic-no-lazy-dfa":"c0ce02bef9ada8cd55672f0a9c3c5fc64f71e08bfb2b45978082a140b4fc111f","record/old-bench-log/01-lazy-dfa/native":"9de61ff787e36f5c6f1eaec68b8bb0583e57b0aad23712afe8c0048988c761b8","record/old-bench-log/01-lazy-dfa/nfa":"38c0be44a00b2caef17101bc425410fec2958e4df6da25d2ba5b6664f8bccad9","record/old-bench-log/01-lazy-dfa/pcre":"3b38026c24e4ca487ff62de83cc093ccb46b918f4875663249ff84ce27636942","record/old-bench-log/02-set/dynamic":"8ef5c00f0ac42e5f008e4b6337669527b48fba38df94c50d3e683c6aac66a48c","record/old-bench-log/03-bytes/onig":"f32347a6e0f25f46ad1b0aa736c29eca47c25f90d32c8823ea0d14204859a35b","record/old-bench-log/03-bytes/pcre":"b90982575c0ad55617b2ce50c2e9853d090502bf07e1eb19edf9009d3c9f2987","record/old-bench-log/03-bytes/rust":"b1e70e5ae48a9c726d8cd8a98019c0efe5a1095563c61cf0ac75e24de32461b4","record/old-bench-log/03-bytes/rust-bytes":"fbf0e6cb8102c7ca8e59bd459bb0ae7f1feaf8103def70b8d4793c59e68e8736","record/old-bench-log/04/onig":"4e34e2ede0a806b8ee540e63e4babee38049e5a8ab3be99c4f5d8b02bbc653fd","record/old-bench-log/04/pcre1-jit":"736c4941e991ef94f76379cf2187d0ea2a41b052cf80c94d0dd0c9ea758a6491","record/old-bench-log/04/pcre2-jit":"00e7bbf7749904fca8dff9b441d15bbe670f37b427e385ddf740f7a49de3b1fb","record/old-bench-log/04/re2":"b8b8595f6b68da127b56dc7c61a9fd15548251fda1be9d2c50c2d48382e887b6","record/old-bench-log/04/rust":"c5a6b918e815294f0c4e3d37267c444d49692ff131c5a08f7462c24d0721fcec","record/old-bench-log/04/tcl":"c4d8d12b8cf48ff2017549e95e49dc95a90ea15483834cd70d2d7d7c237bbd32","record/old-bench-log/05/onig":"70a4da9aafaefa6493cd09d3a529dd5d2d9eacf390bb093681bc7be28a1f926c","record/old-bench-log/05/onig-vs-rust":"b942a79735b7330241437776c15b18f4db3eff01d3e6c35494f4a8732e74a23a","record/old-bench-log/05/pcre1":"b29b7efbe79b55ce0aaf24bbbecc376a865fa219a68d96124e3d95951cdb47f4","record/old-bench-log/05/pcre1-vs-rust":"a458e5c62f0500898e08757753c10981551649656432ec096f0c82b414ef8d82","record/old-bench-log/05/pcre2":"faa93937c3490cfdff88c32dc04e57f2ae881923b87781e5fe876535fd690770","record/old-bench-log/05/pcre2-vs-rust":"bf9faa6a679dd98e9452e52c0941d2eb84dcf0b6632c15507f8334ed7bc309da","record/old-bench-log/05/re2":"692866b28e1bc368c7a59f519b8dfe1da50a135946ce153298a0ab228a5ee59d","record/old-bench-log/05/re2-vs-rust":"55e4cb14c397574751aebe38068c429a4580a5e309857b2715047944903dca58","record/old-bench-log/05/rust":"aac6acda9f63e51613712d0a33bb7fb46dfc7adc425f76b9b71195be8c8a42e7","record/old-bench-log/05/tcl":"f03e39eccd3252162cc6099bb0426014df669d299ba0ef79e89b8401886a5172","record/old-bench-log/05/tcl-vs-rust":"ae6ac4668573bf5488cc235c5da16ad9358d07b7644207d9bcea88ba6f5514a6","record/old-bench-log/06/dphobos-dmd":"473328306be335a0320c690d9c2dbefdf7f2f5a80e4ca69443c7ed2e81bb093f","record/old-bench-log/06/dphobos-dmd-ct":"60341c736382a6db21d9889369ea4617c521acbf30d4b3bf38bcd17f4f85b9b1","record/old-bench-log/06/dphobos-ldc":"ae60c2bed84afb89ae43615f26de4cc5d0042e179089b639507378518eed3252","record/old-bench-log/06/dphobos-ldc-ct":"a157ef450793b73de3a816fab1d93a6d11e90a817082bae5e3da02a66fcc833f","record/old-bench-log/06/pcre1":"ad10fd7db732e8670dd3d4eedb05f48f547b4782495aaadff8ec25a6ea1992a0","record/old-bench-log/06/pcre2":"f789a73bd41a0bc401bdebe7f10a03a8aa587de48643d88507d16181a8fa39d3","record/old-bench-log/06/re2":"203c273a110d71f5edf722630202a6142c39d6b7a9951686adf8b9c20c5db278","record/old-bench-log/06/rust":"6a642a16cd279c99ef5a580a25fb3a63ac6239cd73df9261c02912fa08145753","record/old-bench-log/07/boost":"255bc652c4d9e9d20aa9b22d8d86e952e7ec6c8b9fcde0c3d6e38c967e04d40e","record/old-bench-log/07/dphobos-dmd":"fb3ac60037050858611145ca3e71412164688dcdec52c022787d33304e022260","record/old-bench-log/07/dphobos-dmd-ct":"40a5088441f8ffe3dae0abaf31c105cedfbe3b56c06772f075947d504976d2ed","record/old-bench-log/07/oniguruma":"ae0cd60adb15845eb9ef706111d4ee0e6ad5a58f0276b787d68bd7d637f8f7c6","record/old-bench-log/07/pcre1":"a812d065ec248249f9bb3d6d970f15c18d342f6b443265ad4b07fa91b73575cc","record/old-bench-log/07/pcre2":"88230663eccd0b382cf5be81ce1ae6cfa3fa835a65a31c1eba4369d2e8de5d27","record/old-bench-log/07/re2":"e330ef21ce44351afc3c43821d862e9c625877606569f3af0ddbadcd7b21c602","record/old-bench-log/07/rust":"d8c6bd5c46f5df9d0ac222f7be7793527a8137d273c8826b3715c67e16209aac","record/old-bench-log/07/rust-bytes":"e21d02fa2ef1e5ed7204920b33ed24c9fb620e068ed47ed6879b72e76369a27e","record/old-bench-log/07/stdcpp":"9df02d89dc8232c700b8cf8bc6f1ece3ca7af84ab52e67a660039d6c9168aed4","record/old-bench-log/07/stdcpp-libcxx":"f90849a0b5dc11dc0280ad97886e92e1d91c080403ad7a4ecd638a26fe5e8c5e","record/old-bench-log/07/tcl":"7f6e347bb507f9c00ff664d3e627c0a9cf842b416eeb2af9f3b6cccd041c58e4","record/old-bench-log/08-new-memmem/rust-after-01":"646c7d50aea9c560a35eb60116f301f4fb8d4b03fd5814d8b24adffd070332e3","record/old-bench-log/08-new-memmem/rust-after-02":"14e7fb6c6faa85a8f90617528cef79ae382aeba07c2e5c253c68445902b060ba","record/old-bench-log/08-new-memmem/rust-before-01":"7e3b58de0f502c1a1bf6d27e0e85c654b1189716f7374cec4ed4dd365b13101f","record/old-bench-log/08-new-memmem/rust-before-02":"ab6d09529eeeca7ff0da945d59701dbbcfdec5e05581bb9bf154779d12a35e53","record/old-bench-log/09-new-baseline/pcre2":"28df8e2762f267d1ea628906a6e4bbc21f99e6a445bd322c86d0ca483b21b5b3","record/old-bench-log/09-new-baseline/re2":"421437193cc3f159c178479f98bde8dbe27883ec7757b1ddd8d745862f5899ff","record/old-bench-log/09-new-baseline/rust":"6f932a769171b6cdb717c9d01e44a70762ef660c4045b9d2bb3797a9bdf65405","record/old-bench-log/09-new-baseline/rust-bytes":"9c5acd5c1eeac9acfe76d03588041f9b6d65b4351085c3510888ceeb83e8a7b5","record/old-bench-log/10-last-frontier/rust-after-literal.log":"02baef9b3b49acbbff43e81f48ea5a9287e30ff4fc298a3f3b48991d8374aabf","record/old-bench-log/10-last-frontier/rust-before-literal.log":"e5a3bcc2b9e93cf3cb27bc9e6305b3bc03215751bbeef2a70fb25577d6b42874","record/old-bench-log/10-last-frontier/rust-bytes-after-literal.log":"29834c7a5396ac61acedd07c0b7ca60716865ec3e70f35fbaa7826a2309a79d9","record/old-bench-log/10-last-frontier/rust-bytes-before-literal.log":"4e7468a3e8629814bd4af91e2a8eb42d0899d352b5dff3058b801aa637046be2","record/old-bench-log/11-regex-1.7.3/rust":"d7cc18a62070ea7a999e1ba2458f26cf94595f1af276c2b3e96cee638eccf3f0","record/old-bench-log/11-regex-1.7.3/rust-bytes":"64c7458020139bd7a03d1cb0927b741e6972377b686626563acb86fbc66414ca","record/old-bench-log/12-regex-1.8.1/rust":"a538c42e77e20956e81fb5a4e2e1e7d3fdf60da019d7e3df52d93f57367a3fbd","record/old-bench-log/12-regex-1.8.1/rust-bytes":"fbb00fdf8f039ce312f5346a67dddaa5e129280a93a90d7aaf6b5a9a71d2f212","record/old-bench-log/13-regex-1.9.0/rust":"0ef62700ba3fc24887af74b7942490c90b4cd2814b8fda200f7376e43391bfce","record/old-bench-log/13-regex-1.9.0/rust-bytes":"676d501d4667f0a945c88ebb56839176dd3a5a6b45af7708b1e870bf26d12603","record/old-bench-log/README.md":"d359f536fb4b8c1af9af3465a027c3522f62c3871aad44645a955b650d7deec0","record/old-bench-log/old/01-before":"c2ea2750fca8ac1742003fe2106e9422d49e92967d3fe0267f24b7ec830b07e3","record/old-bench-log/old/02-new-syntax-crate":"27fd8b3d35cf08d434035ff7d9f2e9e3c94a167e45ba655567c73ae96830f1d8","record/old-bench-log/old/03-new-syntax-crate":"d942a2b95c3a2d8f85f3f17934f258bdc84baa33e91986e8a6810ca8d6e9cc50","record/old-bench-log/old/04-fixed-benchmark":"0da29ef39ac07ece411c151ab479a76944946aba992547b15d90ec2d5484e85c","record/old-bench-log/old/05-thread-caching":"e364d87131e43187d6757426839789d1b6b47b3f3af21280daa9193d5ab19f64","record/old-bench-log/old/06-major-dynamic":"3bc2b8fd2714ae9f19b2e4f4219654982522daf01b5d3055b4aec0458afeaf13","record/old-bench-log/old/06-major-macro":"d5617ed23e71d5298ed4d629eee257e401c352fd1c91a2048dfeb1677527d4e7","record/old-bench-log/old/07-prefix-improvements":"9277d1392c85a38db215a9b69e3b0cd4a9901f8f1c72c706ca262e5f099b8819","record/old-bench-log/old/08-case-fixes":"f97cd3675cf5c967e4ca8841f2368e9eadf538b542bfe3035d31492afc5934bf","record/old-bench-log/old/09-before-compiler-rewrite":"b928686819dbd9aeaa6639b01b63a48428653f2f676a4e15d61cddec421e0389","record/old-bench-log/old/10-compiler-rewrite":"697b295ee377a5cb287d403593bfb8c078270b4e19e8d61d0b95b06ee7c903ab","record/old-bench-log/old/11-compiler-rewrite":"3f0ba494a0d82e7419285a9686474dc7763d4da0dd3faaa3bec3f624bbede481","record/old-bench-log/old/12-executor":"962e182f9a1cfddb8c0cd2d8c4681febef1430082c9a38e5373c9117b853e65e","record/old-bench-log/old/12-executor-bytes":"e01a1e878b44c80724e9bf09bb11210eeb8f01518ac7f0e3e7f2ee241281e500","record/old-bench-log/old/13-cache-byte-range-suffixes":"1d67d58a39f9177a79c26f3c6c2a1caaf51f085ce137711ab9ba74071c14680c","rustfmt.toml":"1ca600239a27401c4a43f363cf3f38183a212affc1f31bff3ae93234bbaec228","src/builders.rs":"67b4f07ba91794c1e076d092a55f9377301ef5fa8f0dcef13699842583c14865","src/bytes.rs":"6a576b7cec3bc120b9a444f9d12378ac3f4c4f6443e44e4befce6c9c356d8d78","src/error.rs":"4ac8361e900627a87a2ac78e5d475be17c455fe6850d1515bf5b874837c4ae25","src/find_byte.rs":"e17cd3b765467685946707840b92ea4e37d3c11081fbf316174a15858cd4bd99","src/lib.rs":"63e4c129402482c7d10d3c01f1ae0ea7267c479318ac97385d8d1c89429febb4","src/pattern.rs":"5f37755a7c16902d861377645f57a20314961f86298d4b35ae6e1058ca4e9801","src/regex/bytes.rs":"a950e32314214ba2256b854cbfa042c7c9cf7329479b10570c4201ab244d63c6","src/regex/mod.rs":"c220b6dd7a5e1945f8e743d1dcd796c5f782c91b0c34eb9915c588174a517fe8","src/regex/string.rs":"354712245a12bb3cbfbb89d3908a47824780beb4c4f2e6b0e7f52ea1be35b7fe","src/regexset/bytes.rs":"6290dd81f47fb6cdbaa358be2340398a2a640320373d334e4c977bf30b5a9220","src/regexset/mod.rs":"c220b6dd7a5e1945f8e743d1dcd796c5f782c91b0c34eb9915c588174a517fe8","src/regexset/string.rs":"977bc167c48c7c99187599c5071ca197e61a56359d32a26b9dbc1b58a5ef1c4d","test":"c0122c20a2c9b7ba6e9a8aaeb2b7d9910315ef31063539949f28d9501ef3193c","testdata/README.md":"c0514501526560d7f6171eb6d982ad61b4527760cb38a4bfbe8e28036ff37b95","testdata/anchored.toml":"7a1b5cd81deed2099796a451bf764a3f9bd21f0d60c0fa46accd3a35666866f2","testdata/bytes.toml":"1d84179165fd25f3b94bd2bfbeb43fc8a162041f7bf98b717e0f85cef7fb652b","testdata/crazy.toml":"a146e2d2e23f1a57168979d9b1fc193c2ba38dca66294b61140d6d2a2958ec86","testdata/crlf.toml":"d19cf22756434d145dd20946c00af01c102a556a252070405c3c8294129d9ece","testdata/earliest.toml":"d561e643623ee1889b5b049fdcf3c7cb71b0c746d7eb822ddbd09d0acda2620b","testdata/empty.toml":"738dbe92fbd8971385a1cf3affb0e956e5b692c858b9b48439d718f10801c08e","testdata/expensive.toml":"5ce2f60209c99cdd2cdcb9d3069d1d5ca13d5e08a85e913efe57267b2f5f0e9d","testdata/flags.toml":"9a7e001808195c84f2a7d3e18bc0a82c7386e60f03a616e99af00c3f7f2c3fd4","testdata/fowler/basic.toml":"a82c7e233451cd7cfe0c3d817f3a1ab44478bb81ae62432efdd515fa8370275e","testdata/fowler/dat/README":"e53d6c37b5931cb26dc9ae4c40358eea63f7a469c4db6ca816c072a8ced6a61a","testdata/fowler/dat/basic.dat":"b1126dda59075c08f574987090273c9977790115f1e1941d0708c0b82b256905","testdata/fowler/dat/nullsubexpr.dat":"e5cd4145dffa8bc66f2d39079950b2bb7bae21a521514b83b557b92f4a871a9e","testdata/fowler/dat/repetition.dat":"2b8b2b191229a804fba49e6b888d8194bf488f7744057b550da9d95a2aa6617a","testdata/fowler/nullsubexpr.toml":"cd812e7e8fa0469253b34f0db93b5883c9d8b9740fc4f7825a38e7df880a4eed","testdata/fowler/repetition.toml":"8c09164f064b3db81309c53483863bdcec493781644de162416e9f485e772615","testdata/iter.toml":"6875460302974a5b3073a7304a865c45aba9653c54afea2c4d26e1ea248a81f7","testdata/leftmost-all.toml":"903bfbeff888b7664296f4d5aa367ce53d1dafe249ab0a3359223ae94d596396","testdata/line-terminator.toml":"3255c305687eaa8b39939855ce8e0379bdc0e70d7b0cd818856f65fb44a48c0f","testdata/misc.toml":"32c9591655c6fb118dfefcb4de49a04820a63cb960533dfc2538cdaabf4f4047","testdata/multiline.toml":"eb07cf5427e6ddbcf61f4cc64c2d74ff41b5ef75ef857959651b20196f3cd157","testdata/no-unicode.toml":"d209da04506900fd5f69e48170cddaad0702355ac6176c3a75ab3ff96974457c","testdata/overlapping.toml":"5d96497a7233566d40b05ba22047e483fa8662e45515a9be86da45cf6c28703a","testdata/regex-lite.toml":"fecca7cc8c9cea2e1f84f846a89fd9b3ca7011c83698211a2eeda8924deb900c","testdata/regression.toml":"2979101e9c0ea707ed4071cbd38628791dadaafad1c1b0d90cf61193755be6be","testdata/set.toml":"dfd265dc1aee80026e881616840df0236ae9abf12467d7ec0e141a52c236128c","testdata/substring.toml":"48122d9f3477ed81f95e3ad42c06e9bb25f849b66994601a75ceae0693b81866","testdata/unicode.toml":"7e4b013039b0cdd85fa73f32d15d096182fe901643d4e40c0910087a736cd46d","testdata/utf8.toml":"2eabce0582bcacb2073e08bbe7ca413f096d14d06e917b107949691e24f84b20","testdata/word-boundary.toml":"51bc1c498ab825420340a2dd3e6623de4054937ba6d5020ff8cd14b1c1e45271","tests/fuzz/mod.rs":"7b01a803e1c0b5a45c062d493723553f263c57e269eade1475eb789694635d5c","tests/fuzz/testdata/crash-7eb3351f0965e5d6c1cb98aa8585949ef96531ff":"be4f42497ac9358eb020bf17cd8fdb9743691824e01d744504613ea2bfb2f663","tests/fuzz/testdata/crash-8760b19b25d74e3603d4c643e9c7404fdd3631f9":"19df9a1e1b5a3c0f31cc038b9f2991b161d8577b4a0c8b2fc391cdfecdb6dd85","tests/fuzz/testdata/crash-cd33b13df59ea9d74503986f9d32a270dd43cc04":"2fde1668e9e3e60943c28d97c01c90dd3d3882f48475f060ccaf961c228069e8","tests/fuzz/testdata/minimized-from-8760b19b25d74e3603d4c643e9c7404fdd3631f9":"c9e00f7a31453708560900aa51e358dd5551df494439860594be97bb1fb933ba","tests/fuzz/testdata/slow-unit-3ab758ea520027fefd3f00e1384d9aeef155739e":"4433011f7af46e855e843635cf24a49713bd5705f67176ed928f04d24eda1857","tests/fuzz/testdata/slow-unit-5345fccadf3812c53c3ccc7af5aa2741b7b2106c":"95782a847fc64e9cccdf76e9540b0d16ce80db5d05157a88b958b763f9b8479b","tests/fuzz/testdata/slow-unit-6bd643eec330166e4ada91da2d3f284268481085":"8ddff12288f6f20cc9d65db76bd8187834f64f844aad48a340d082555ad5cb56","tests/fuzz/testdata/slow-unit-93c73a43581f205f9aaffd9c17e52b34b17becd0":"eea6919a75fde163634b890e2253a0918cf0ba092357fa617f368bbfa131ba30","tests/fuzz/testdata/slow-unit-9ca9cc9929fee1fcbb847a78384effb8b98ea18a":"a806f73b900046977267acceb83b105bac7ee21ede2edc2927afe1e1f0149f00","tests/fuzz/testdata/slow-unit-b8a052f4254802edbe5f569b6ce6e9b6c927e9d6":"9540cf58241cde3bc0db8364e0ccff67ff1ff9721c85b0d2ca27354c0cbf2650","tests/lib.rs":"33a37711d8677994f87b19be40b24a323d41de18fb161c850b4ccea9fe4c4156","tests/misc.rs":"5ac5858325451e1d70f308ca0bcead5a354d095a7473800c11065231c319c456","tests/regression.rs":"3490aac99fdbf3f0949ba1f338d5184a84b505ebd96d0b6d6145c610587aa60b","tests/regression_fuzz.rs":"57e0bcba0fdfa7797865e35ae547cd7fe1c6132b80a7bfdfb06eb053a568b00d","tests/replace.rs":"78ff9bf7f78783ad83a78041bb7ee0705c7efc85b4d12301581d0ce5b2a59325","tests/searcher.rs":"04152e5c86431deec0c196d2564a11bc4ec36f14c77e8c16a2f9d1cbc9fc574e","tests/suite_bytes.rs":"7697b04e5b181aa78b3654bd2dbe1c792d9626197573ed8c649f1da8b481817d","tests/suite_bytes_set.rs":"d970168fab57a9edc60ff26a2bb7d0cc714d4298e4ee9eadba9da44a6569f2bb","tests/suite_string.rs":"1be0cf8922171f8323f99e8ecedbbf1846d339620d0dc2fd490901cbbbd2622e","tests/suite_string_set.rs":"22743107206d913521f9adb728482aed3a9625ff7b15a83df057bbf1f7050e03"},"package":"81bc1d4caf89fac26a70747fe603c130093b53c773888797a6329091246d651a"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/regex/Cargo.toml temporalio-1.3.0/vendor/regex/Cargo.toml --- temporalio-1.3.0/vendor/regex/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/regex/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -11,9 +11,9 @@ [package] edition = "2021" -rust-version = "1.65" +rust-version = "1.60.0" name = "regex" -version = "1.10.2" +version = "1.9.3" authors = [ "The Rust Project Developers", "Andrew Gallant ", @@ -64,11 +64,11 @@ optional = true [dependencies.memchr] -version = "2.6.0" +version = "2.5.0" optional = true [dependencies.regex-automata] -version = "0.4.3" +version = "0.3.6" features = [ "alloc", "syntax", @@ -78,7 +78,7 @@ default-features = false [dependencies.regex-syntax] -version = "0.8.2" +version = "0.7.3" default-features = false [dev-dependencies.anyhow] @@ -115,7 +115,6 @@ ] logging = [ "aho-corasick?/logging", - "memchr?/logging", "regex-automata/logging", ] pattern = [] diff -Nru temporalio-1.3.0/vendor/regex/CHANGELOG.md temporalio-1.3.0/vendor/regex/CHANGELOG.md --- temporalio-1.3.0/vendor/regex/CHANGELOG.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/regex/CHANGELOG.md 2023-10-30 19:40:00.000000000 +0000 @@ -1,170 +1,3 @@ -1.10.2 (2023-10-16) -=================== -This is a new patch release that fixes a search regression where incorrect -matches could be reported. - -Bug fixes: - -* [BUG #1110](https://github.com/rust-lang/regex/issues/1110): -Revert broadening of reverse suffix literal optimization introduced in 1.10.1. - - -1.10.1 (2023-10-14) -=================== -This is a new patch release with a minor increase in the number of valid -patterns and a broadening of some literal optimizations. - -New features: - -* [FEATURE 04f5d7be](https://github.com/rust-lang/regex/commit/04f5d7be4efc542864cc400f5d43fbea4eb9bab6): -Loosen ASCII-compatible rules such that regexes like `(?-u:☃)` are now allowed. - -Performance improvements: - -* [PERF 8a8d599f](https://github.com/rust-lang/regex/commit/8a8d599f9d2f2d78e9ad84e4084788c2d563afa5): -Broader the reverse suffix optimization to apply in more cases. - - -1.10.0 (2023-10-09) -=================== -This is a new minor release of `regex` that adds support for start and end -word boundary assertions. That is, `\<` and `\>`. The minimum supported Rust -version has also been raised to 1.65, which was released about one year ago. - -The new word boundary assertions are: - -* `\<` or `\b{start}`: a Unicode start-of-word boundary (`\W|\A` on the left, -`\w` on the right). -* `\>` or `\b{end}`: a Unicode end-of-word boundary (`\w` on the left, `\W|\z` -on the right)). -* `\b{start-half}`: half of a Unicode start-of-word boundary (`\W|\A` on the -left). -* `\b{end-half}`: half of a Unicode end-of-word boundary (`\W|\z` on the -right). - -The `\<` and `\>` are GNU extensions to POSIX regexes. They have been added -to the `regex` crate because they enjoy somewhat broad support in other regex -engines as well (for example, vim). The `\b{start}` and `\b{end}` assertions -are aliases for `\<` and `\>`, respectively. - -The `\b{start-half}` and `\b{end-half}` assertions are not found in any -other regex engine (although regex engines with general look-around support -can certainly express them). They were added principally to support the -implementation of word matching in grep programs, where one generally wants to -be a bit more flexible in what is considered a word boundary. - -New features: - -* [FEATURE #469](https://github.com/rust-lang/regex/issues/469): -Add support for `\<` and `\>` word boundary assertions. -* [FEATURE(regex-automata) #1031](https://github.com/rust-lang/regex/pull/1031): -DFAs now have a `start_state` method that doesn't use an `Input`. - -Performance improvements: - -* [PERF #1051](https://github.com/rust-lang/regex/pull/1051): -Unicode character class operations have been optimized in `regex-syntax`. -* [PERF #1090](https://github.com/rust-lang/regex/issues/1090): -Make patterns containing lots of literal characters use less memory. - -Bug fixes: - -* [BUG #1046](https://github.com/rust-lang/regex/issues/1046): -Fix a bug that could result in incorrect match spans when using a Unicode word -boundary and searching non-ASCII strings. -* [BUG(regex-syntax) #1047](https://github.com/rust-lang/regex/issues/1047): -Fix panics that can occur in `Ast->Hir` translation (not reachable from `regex` -crate). -* [BUG(regex-syntax) #1088](https://github.com/rust-lang/regex/issues/1088): -Remove guarantees in the API that connect the `u` flag with a specific HIR -representation. - -`regex-automata` breaking change release: - -This release includes a `regex-automata 0.4.0` breaking change release, which -was necessary in order to support the new word boundary assertions. For -example, the `Look` enum has new variants and the `LookSet` type now uses `u32` -instead of `u16` to represent a bitset of look-around assertions. These are -overall very minor changes, and most users of `regex-automata` should be able -to move to `0.4` from `0.3` without any changes at all. - -`regex-syntax` breaking change release: - -This release also includes a `regex-syntax 0.8.0` breaking change release, -which, like `regex-automata`, was necessary in order to support the new word -boundary assertions. This release also includes some changes to the `Ast` -type to reduce heap usage in some cases. If you are using the `Ast` type -directly, your code may require some minor modifications. Otherwise, users of -`regex-syntax 0.7` should be able to migrate to `0.8` without any code changes. - -`regex-lite` release: - -The `regex-lite 0.1.1` release contains support for the new word boundary -assertions. There are no breaking changes. - - -1.9.6 (2023-09-30) -================== -This is a patch release that fixes a panic that can occur when the default -regex size limit is increased to a large number. - -* [BUG aa4e4c71](https://github.com/rust-lang/regex/commit/aa4e4c7120b0090ce0624e3c42a2ed06dd8b918a): -Fix a bug where computing the maximum haystack length for the bounded -backtracker could result underflow and thus provoke a panic later in a search -due to a broken invariant. - - -1.9.5 (2023-09-02) -================== -This is a patch release that hopefully mostly fixes a performance bug that -occurs when sharing a regex across multiple threads. - -Issue [#934](https://github.com/rust-lang/regex/issues/934) -explains this in more detail. It is [also noted in the crate -documentation](https://docs.rs/regex/latest/regex/#sharing-a-regex-across-threads-can-result-in-contention). -The bug can appear when sharing a regex across multiple threads simultaneously, -as might be the case when using a regex from a `OnceLock`, `lazy_static` or -similar primitive. Usually high contention only results when using many threads -to execute searches on small haystacks. - -One can avoid the contention problem entirely through one of two methods. -The first is to use lower level APIs from `regex-automata` that require passing -state explicitly, such as [`meta::Regex::search_with`](https://docs.rs/regex-automata/latest/regex_automata/meta/struct.Regex.html#method.search_with). -The second is to clone a regex and send it to other threads explicitly. This -will not use any additional memory usage compared to sharing the regex. The -only downside of this approach is that it may be less convenient, for example, -it won't work with things like `OnceLock` or `lazy_static` or `once_cell`. - -With that said, as of this release, the contention performance problems have -been greatly reduced. This was achieved by changing the free-list so that it -was sharded across threads, and that ensuring each sharded mutex occupies a -single cache line to mitigate false sharing. So while contention may still -impact performance in some cases, it should be a lot better now. - -Because of the changes to how the free-list works, please report any issues you -find with this release. That not only includes search time regressions but also -significant regressions in memory usage. Reporting improvements is also welcome -as well! If possible, provide a reproduction. - -Bug fixes: - -* [BUG #934](https://github.com/rust-lang/regex/issues/934): -Fix a performance bug where high contention on a single regex led to massive -slow downs. - - -1.9.4 (2023-08-26) -================== -This is a patch release that fixes a bug where `RegexSet::is_match(..)` could -incorrectly return false (even when `RegexSet::matches(..).matched_any()` -returns true). - -Bug fixes: - -* [BUG #1070](https://github.com/rust-lang/regex/issues/1070): -Fix a bug where a prefilter was incorrectly configured for a `RegexSet`. - - 1.9.3 (2023-08-05) ================== This is a patch release that fixes a bug where some searches could result in diff -Nru temporalio-1.3.0/vendor/regex/HACKING.md temporalio-1.3.0/vendor/regex/HACKING.md --- temporalio-1.3.0/vendor/regex/HACKING.md 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/regex/HACKING.md 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,341 @@ +Your friendly guide to hacking and navigating the regex library. + +This guide assumes familiarity with Rust and Cargo, and at least a perusal of +the user facing documentation for this crate. + +If you're looking for background on the implementation in this library, then +you can do no better than Russ Cox's article series on implementing regular +expressions using finite automata: https://swtch.com/~rsc/regexp/ + + +## Architecture overview + +As you probably already know, this library executes regular expressions using +finite automata. In particular, a design goal is to make searching linear +with respect to both the regular expression and the text being searched. +Meeting that design goal on its own is not so hard and can be done with an +implementation of the Pike VM (similar to Thompson's construction, but supports +capturing groups), as described in: https://swtch.com/~rsc/regexp/regexp2.html +--- This library contains such an implementation in src/pikevm.rs. + +Making it fast is harder. One of the key problems with the Pike VM is that it +can be in more than one state at any point in time, and must shuffle capture +positions between them. The Pike VM also spends a lot of time following the +same epsilon transitions over and over again. We can employ one trick to +speed up the Pike VM: extract one or more literal prefixes from the regular +expression and execute specialized code to quickly find matches of those +prefixes in the search text. The Pike VM can then be avoided for most the +search, and instead only executed when a prefix is found. The code to find +prefixes is in the regex-syntax crate (in this repository). The code to search +for literals is in src/literals.rs. When more than one literal prefix is found, +we fall back to an Aho-Corasick DFA using the aho-corasick crate. For one +literal, we use a variant of the Boyer-Moore algorithm. Both Aho-Corasick and +Boyer-Moore use `memchr` when appropriate. The Boyer-Moore variant in this +library also uses elementary frequency analysis to choose the right byte to run +`memchr` with. + +Of course, detecting prefix literals can only take us so far. Not all regular +expressions have literal prefixes. To remedy this, we try another approach +to executing the Pike VM: backtracking, whose implementation can be found in +src/backtrack.rs. One reason why backtracking can be faster is that it avoids +excessive shuffling of capture groups. Of course, backtracking is susceptible +to exponential runtimes, so we keep track of every state we've visited to make +sure we never visit it again. This guarantees linear time execution, but we +pay for it with the memory required to track visited states. Because of the +memory requirement, we only use this engine on small search strings *and* small +regular expressions. + +Lastly, the real workhorse of this library is the "lazy" DFA in src/dfa.rs. +It is distinct from the Pike VM in that the DFA is explicitly represented in +memory and is only ever in one state at a time. It is said to be "lazy" because +the DFA is computed as text is searched, where each byte in the search text +results in at most one new DFA state. It is made fast by caching states. DFAs +are susceptible to exponential state blow up (where the worst case is computing +a new state for every input byte, regardless of what's in the state cache). To +avoid using a lot of memory, the lazy DFA uses a bounded cache. Once the cache +is full, it is wiped and state computation starts over again. If the cache is +wiped too frequently, then the DFA gives up and searching falls back to one of +the aforementioned algorithms. + +All of the above matching engines expose precisely the same matching semantics. +This is indeed tested. (See the section below about testing.) + +The following sub-sections describe the rest of the library and how each of the +matching engines are actually used. + +### Parsing + +Regular expressions are parsed using the regex-syntax crate, which is +maintained in this repository. The regex-syntax crate defines an abstract +syntax and provides very detailed error messages when a parse error is +encountered. Parsing is done in a separate crate so that others may benefit +from its existence, and because it is relatively divorced from the rest of the +regex library. + +The regex-syntax crate also provides sophisticated support for extracting +prefix and suffix literals from regular expressions. + +### Compilation + +The compiler is in src/compile.rs. The input to the compiler is some abstract +syntax for a regular expression and the output is a sequence of opcodes that +matching engines use to execute a search. (One can think of matching engines as +mini virtual machines.) The sequence of opcodes is a particular encoding of a +non-deterministic finite automaton. In particular, the opcodes explicitly rely +on epsilon transitions. + +Consider a simple regular expression like `a|b`. Its compiled form looks like +this: + + 000 Save(0) + 001 Split(2, 3) + 002 'a' (goto: 4) + 003 'b' + 004 Save(1) + 005 Match + +The first column is the instruction pointer and the second column is the +instruction. Save instructions indicate that the current position in the input +should be stored in a captured location. Split instructions represent a binary +branch in the program (i.e., epsilon transitions). The instructions `'a'` and +`'b'` indicate that the literal bytes `'a'` or `'b'` should match. + +In older versions of this library, the compilation looked like this: + + 000 Save(0) + 001 Split(2, 3) + 002 'a' + 003 Jump(5) + 004 'b' + 005 Save(1) + 006 Match + +In particular, empty instructions that merely served to move execution from one +point in the program to another were removed. Instead, every instruction has a +`goto` pointer embedded into it. This resulted in a small performance boost for +the Pike VM, because it was one fewer epsilon transition that it had to follow. + +There exist more instructions and they are defined and documented in +src/prog.rs. + +Compilation has several knobs and a few unfortunately complicated invariants. +Namely, the output of compilation can be one of two types of programs: a +program that executes on Unicode scalar values or a program that executes +on raw bytes. In the former case, the matching engine is responsible for +performing UTF-8 decoding and executing instructions using Unicode codepoints. +In the latter case, the program handles UTF-8 decoding implicitly, so that the +matching engine can execute on raw bytes. All matching engines can execute +either Unicode or byte based programs except for the lazy DFA, which requires +byte based programs. In general, both representations were kept because (1) the +lazy DFA requires byte based programs so that states can be encoded in a memory +efficient manner and (2) the Pike VM benefits greatly from inlining Unicode +character classes into fewer instructions as it results in fewer epsilon +transitions. + +N.B. UTF-8 decoding is built into the compiled program by making use of the +utf8-ranges crate. The compiler in this library factors out common suffixes to +reduce the size of huge character classes (e.g., `\pL`). + +A regrettable consequence of this split in instruction sets is we generally +need to compile two programs; one for NFA execution and one for the lazy DFA. + +In fact, it is worse than that: the lazy DFA is not capable of finding the +starting location of a match in a single scan, and must instead execute a +backwards search after finding the end location. To execute a backwards search, +we must have compiled the regular expression *in reverse*. + +This means that every compilation of a regular expression generally results in +three distinct programs. It would be possible to lazily compile the Unicode +program, since it is never needed if (1) the regular expression uses no word +boundary assertions and (2) the caller never asks for sub-capture locations. + +### Execution + +At the time of writing, there are four matching engines in this library: + +1. The Pike VM (supports captures). +2. Bounded backtracking (supports captures). +3. Literal substring or multi-substring search. +4. Lazy DFA (no support for Unicode word boundary assertions). + +Only the first two matching engines are capable of executing every regular +expression program. They also happen to be the slowest, which means we need +some logic that (1) knows various facts about the regular expression and (2) +knows what the caller wants. Using this information, we can determine which +engine (or engines) to use. + +The logic for choosing which engine to execute is in src/exec.rs and is +documented on the Exec type. Exec values contain regular expression Programs +(defined in src/prog.rs), which contain all the necessary tidbits for actually +executing a regular expression on search text. + +For the most part, the execution logic is straight-forward and follows the +limitations of each engine described above pretty faithfully. The hairiest +part of src/exec.rs by far is the execution of the lazy DFA, since it requires +a forwards and backwards search, and then falls back to either the Pike VM or +backtracking if the caller requested capture locations. + +The Exec type also contains mutable scratch space for each type of matching +engine. This scratch space is used during search (for example, for the lazy +DFA, it contains compiled states that are reused on subsequent searches). + +### Programs + +A regular expression program is essentially a sequence of opcodes produced by +the compiler plus various facts about the regular expression (such as whether +it is anchored, its capture names, etc.). + +### The regex! macro + +The `regex!` macro no longer exists. It was developed in a bygone era as a +compiler plugin during the infancy of the regex crate. Back then, then only +matching engine in the crate was the Pike VM. The `regex!` macro was, itself, +also a Pike VM. The only advantages it offered over the dynamic Pike VM that +was built at runtime were the following: + + 1. Syntax checking was done at compile time. Your Rust program wouldn't + compile if your regex didn't compile. + 2. Reduction of overhead that was proportional to the size of the regex. + For the most part, this overhead consisted of heap allocation, which + was nearly eliminated in the compiler plugin. + +The main takeaway here is that the compiler plugin was a marginally faster +version of a slow regex engine. As the regex crate evolved, it grew other regex +engines (DFA, bounded backtracker) and sophisticated literal optimizations. +The regex macro didn't keep pace, and it therefore became (dramatically) slower +than the dynamic engines. The only reason left to use it was for the compile +time guarantee that your regex is correct. Fortunately, Clippy (the Rust lint +tool) has a lint that checks your regular expression validity, which mostly +replaces that use case. + +Additionally, the regex compiler plugin stopped receiving maintenance. Nobody +complained. At that point, it seemed prudent to just remove it. + +Will a compiler plugin be brought back? The future is murky, but there is +definitely an opportunity there to build something that is faster than the +dynamic engines in some cases. But it will be challenging! As of now, there +are no plans to work on this. + + +## Testing + +A key aspect of any mature regex library is its test suite. A subset of the +tests in this library come from Glenn Fowler's AT&T test suite (its online +presence seems gone at the time of writing). The source of the test suite is +located in src/testdata. The scripts/regex-match-tests.py takes the test suite +in src/testdata and generates tests/matches.rs. + +There are also many other manually crafted tests and regression tests in +tests/tests.rs. Some of these tests were taken from RE2. + +The biggest source of complexity in the tests is related to answering this +question: how can we reuse the tests to check all of our matching engines? One +approach would have been to encode every test into some kind of format (like +the AT&T test suite) and code generate tests for each matching engine. The +approach we use in this library is to create a Cargo.toml entry point for each +matching engine we want to test. The entry points are: + +* `tests/test_default.rs` - tests `Regex::new` +* `tests/test_default_bytes.rs` - tests `bytes::Regex::new` +* `tests/test_nfa.rs` - tests `Regex::new`, forced to use the NFA + algorithm on every regex. +* `tests/test_nfa_bytes.rs` - tests `Regex::new`, forced to use the NFA + algorithm on every regex and use *arbitrary* byte based programs. +* `tests/test_nfa_utf8bytes.rs` - tests `Regex::new`, forced to use the NFA + algorithm on every regex and use *UTF-8* byte based programs. +* `tests/test_backtrack.rs` - tests `Regex::new`, forced to use + backtracking on every regex. +* `tests/test_backtrack_bytes.rs` - tests `Regex::new`, forced to use + backtracking on every regex and use *arbitrary* byte based programs. +* `tests/test_backtrack_utf8bytes.rs` - tests `Regex::new`, forced to use + backtracking on every regex and use *UTF-8* byte based programs. +* `tests/test_crates_regex.rs` - tests to make sure that all of the + backends behave in the same way against a number of quickcheck + generated random inputs. These tests need to be enabled through + the `RUST_REGEX_RANDOM_TEST` environment variable (see + below). + +The lazy DFA and pure literal engines are absent from this list because +they cannot be used on every regular expression. Instead, we rely on +`tests/test_dynamic.rs` to test the lazy DFA and literal engines when possible. + +Since the tests are repeated several times, and because `cargo test` runs all +entry points, it can take a while to compile everything. To reduce compile +times slightly, try using `cargo test --test default`, which will only use the +`tests/test_default.rs` entry point. + +The random testing takes quite a while, so it is not enabled by default. +In order to run the random testing you can set the +`RUST_REGEX_RANDOM_TEST` environment variable to anything before +invoking `cargo test`. Note that this variable is inspected at compile +time, so if the tests don't seem to be running, you may need to run +`cargo clean`. + +## Benchmarking + +The benchmarking in this crate is made up of many micro-benchmarks. Currently, +there are two primary sets of benchmarks: the benchmarks that were adopted +at this library's inception (in `bench/src/misc.rs`) and a newer set of +benchmarks meant to test various optimizations. Specifically, the latter set +contain some analysis and are in `bench/src/sherlock.rs`. Also, the latter +set are all executed on the same lengthy input whereas the former benchmarks +are executed on strings of varying length. + +There is also a smattering of benchmarks for parsing and compilation. + +Benchmarks are in a separate crate so that its dependencies can be managed +separately from the main regex crate. + +Benchmarking follows a similarly wonky setup as tests. There are multiple entry +points: + +* `bench_rust.rs` - benchmarks `Regex::new` +* `bench_rust_bytes.rs` benchmarks `bytes::Regex::new` +* `bench_pcre.rs` - benchmarks PCRE +* `bench_onig.rs` - benchmarks Oniguruma + +The PCRE and Oniguruma benchmarks exist as a comparison point to a mature +regular expression library. In general, this regex library compares favorably +(there are even a few benchmarks that PCRE simply runs too slowly on or +outright can't execute at all). I would love to add other regular expression +library benchmarks (especially RE2). + +If you're hacking on one of the matching engines and just want to see +benchmarks, then all you need to run is: + + $ (cd bench && ./run rust) + +If you want to compare your results with older benchmarks, then try: + + $ (cd bench && ./run rust | tee old) + $ ... make it faster + $ (cd bench && ./run rust | tee new) + $ cargo benchcmp old new --improvements + +The `cargo-benchcmp` utility is available here: +https://github.com/BurntSushi/cargo-benchcmp + +The `./bench/run` utility can run benchmarks for PCRE and Oniguruma too. See +`./bench/bench --help`. + +## Dev Docs + +When digging your teeth into the codebase for the first time, the +crate documentation can be a great resource. By default `rustdoc` +will strip out all documentation of private crate members in an +effort to help consumers of the crate focus on the *interface* +without having to concern themselves with the *implementation*. +Normally this is a great thing, but if you want to start hacking +on regex internals it is not what you want. Many of the private members +of this crate are well documented with rustdoc style comments, and +it would be a shame to miss out on the opportunity that presents. +You can generate the private docs with: + +``` +$ rustdoc --crate-name docs src/lib.rs -o target/doc -L target/debug/deps --no-defaults --passes collapse-docs --passes unindent-comments +``` + +Then just point your browser at `target/doc/regex/index.html`. + +See https://github.com/rust-lang/rust/issues/15347 for more info +about generating developer docs for internal use. diff -Nru temporalio-1.3.0/vendor/regex/README.md temporalio-1.3.0/vendor/regex/README.md --- temporalio-1.3.0/vendor/regex/README.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/regex/README.md 2023-10-30 19:40:00.000000000 +0000 @@ -219,95 +219,9 @@ [in the "Crate features" section of the documentation](https://docs.rs/regex/1.*/#crate-features). -### Performance - -One of the goals of this crate is for the regex engine to be "fast." What that -is a somewhat nebulous goal, it is usually interpreted in one of two ways. -First, it means that all searches take worst case `O(m * n)` time, where -`m` is proportional to `len(regex)` and `n` is proportional to `len(haystack)`. -Second, it means that even aside from the time complexity constraint, regex -searches are "fast" in practice. - -While the first interpretation is pretty unambiguous, the second one remains -nebulous. While nebulous, it guides this crate's architecture and the sorts of -the trade offs it makes. For example, here are some general architectural -statements that follow as a result of the goal to be "fast": - -* When given the choice between faster regex searches and faster _Rust compile -times_, this crate will generally choose faster regex searches. -* When given the choice between faster regex searches and faster _regex compile -times_, this crate will generally choose faster regex searches. That is, it is -generally acceptable for `Regex::new` to get a little slower if it means that -searches get faster. (This is a somewhat delicate balance to strike, because -the speed of `Regex::new` needs to remain somewhat reasonable. But this is why -one should avoid re-compiling the same regex over and over again.) -* When given the choice between faster regex searches and simpler API -design, this crate will generally choose faster regex searches. For example, -if one didn't care about performance, we could like get rid of both of -the `Regex::is_match` and `Regex::find` APIs and instead just rely on -`Regex::captures`. - -There are perhaps more ways that being "fast" influences things. - -While this repository used to provide its own benchmark suite, it has since -been moved to [rebar](https://github.com/BurntSushi/rebar). The benchmarks are -quite extensive, and there are many more than what is shown in rebar's README -(which is just limited to a "curated" set meant to compare performance between -regex engines). To run all of this crate's benchmarks, first start by cloning -and installing `rebar`: - -```text -$ git clone https://github.com/BurntSushi/rebar -$ cd rebar -$ cargo install --path ./ -``` - -Then build the benchmark harness for just this crate: - -```text -$ rebar build -e '^rust/regex$' -``` - -Run all benchmarks for this crate as tests (each benchmark is executed once to -ensure it works): - -```text -$ rebar measure -e '^rust/regex$' -t -``` - -Record measurements for all benchmarks and save them to a CSV file: - -```text -$ rebar measure -e '^rust/regex$' | tee results.csv -``` - -Explore benchmark timings: - -```text -$ rebar cmp results.csv -``` - -See the `rebar` documentation for more details on how it works and how to -compare results with other regex engines. - - -### Hacking - -The `regex` crate is, for the most part, a pretty thin wrapper around the -[`meta::Regex`](https://docs.rs/regex-automata/latest/regex_automata/meta/struct.Regex.html) -from the -[`regex-automata` crate](https://docs.rs/regex-automata/latest/regex_automata/). -Therefore, if you're looking to work on the internals of this crate, you'll -likely either want to look in `regex-syntax` (for parsing) or `regex-automata` -(for construction of finite automata and the search routines). - -My [blog on regex internals](https://blog.burntsushi.net/regex-internals/) -goes into more depth. - - ### Minimum Rust version policy -This crate's minimum supported `rustc` version is `1.65.0`. +This crate's minimum supported `rustc` version is `1.60.0`. The policy is that the minimum Rust version required to use this crate can be increased in minor version updates. For example, if regex 1.0 requires Rust diff -Nru temporalio-1.3.0/vendor/regex/src/builders.rs temporalio-1.3.0/vendor/regex/src/builders.rs --- temporalio-1.3.0/vendor/regex/src/builders.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/regex/src/builders.rs 2023-10-30 19:40:00.000000000 +0000 @@ -679,7 +679,6 @@ /// # Example /// /// ``` - /// # if !cfg!(target_pointer_width = "64") { return; } // see #1041 /// use regex::RegexBuilder; /// /// // It may surprise you how big some seemingly small patterns can @@ -1247,7 +1246,6 @@ /// # Example /// /// ``` - /// # if !cfg!(target_pointer_width = "64") { return; } // see #1041 /// use regex::RegexSetBuilder; /// /// // It may surprise you how big some seemingly small patterns can @@ -1858,7 +1856,6 @@ /// # Example /// /// ``` - /// # if !cfg!(target_pointer_width = "64") { return; } // see #1041 /// use regex::bytes::RegexBuilder; /// /// // It may surprise you how big some seemingly small patterns can @@ -2431,7 +2428,6 @@ /// # Example /// /// ``` - /// # if !cfg!(target_pointer_width = "64") { return; } // see #1041 /// use regex::bytes::RegexSetBuilder; /// /// // It may surprise you how big some seemingly small patterns can diff -Nru temporalio-1.3.0/vendor/regex/src/bytes.rs temporalio-1.3.0/vendor/regex/src/bytes.rs --- temporalio-1.3.0/vendor/regex/src/bytes.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/regex/src/bytes.rs 2023-10-30 19:40:00.000000000 +0000 @@ -68,8 +68,8 @@ 1. The `u` flag can be disabled even when disabling it might cause the regex to match invalid UTF-8. When the `u` flag is disabled, the regex is said to be in "ASCII compatible" mode. -2. In ASCII compatible mode, Unicode character classes are not allowed. Literal -Unicode scalar values outside of character classes are allowed. +2. In ASCII compatible mode, neither Unicode scalar values nor Unicode +character classes are allowed. 3. In ASCII compatible mode, Perl character classes (`\w`, `\d` and `\s`) revert to their typical ASCII definition. `\w` maps to `[[:word:]]`, `\d` maps to `[[:digit:]]` and `\s` maps to `[[:space:]]`. diff -Nru temporalio-1.3.0/vendor/regex/src/lib.rs temporalio-1.3.0/vendor/regex/src/lib.rs --- temporalio-1.3.0/vendor/regex/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/regex/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -109,7 +109,7 @@ } ``` -Fourth, run it with `cargo run`: +Foruth, run it with `cargo run`: ```text $ cargo run @@ -543,10 +543,8 @@ is disabled (e.g., `(?-u:.)`), then `.` will match a single byte in all cases. * The character classes `\w`, `\d` and `\s` are all Unicode-aware by default. Use `(?-u:\w)`, `(?-u:\d)` and `(?-u:\s)` to get their ASCII-only definitions. -* Similarly, `\b` and `\B` use a Unicode definition of a "word" character. -To get ASCII-only word boundaries, use `(?-u:\b)` and `(?-u:\B)`. This also -applies to the special word boundary assertions. (That is, `\b{start}`, -`\b{end}`, `\b{start-half}`, `\b{end-half}`.) +* Similarly, `\b` and `\B` use a Unicode definition of a "word" character. To +get ASCII-only word boundaries, use `(?-u:\b)` and `(?-u:\B)`. * `^` and `$` are **not** Unicode-aware in multi-line mode. Namely, they only recognize `\n` (assuming CRLF mode is not enabled) and not any of the other forms of line terminators defined by Unicode. @@ -725,16 +723,12 @@ ### Empty matches
-^               the beginning of a haystack (or start-of-line with multi-line mode)
-$               the end of a haystack (or end-of-line with multi-line mode)
-\A              only the beginning of a haystack (even with multi-line mode enabled)
-\z              only the end of a haystack (even with multi-line mode enabled)
-\b              a Unicode word boundary (\w on one side and \W, \A, or \z on other)
-\B              not a Unicode word boundary
-\b{start}, \<   a Unicode start-of-word boundary (\W|\A on the left, \w on the right)
-\b{end}, \>     a Unicode end-of-word boundary (\w on the left, \W|\z on the right))
-\b{start-half}  half of a Unicode start-of-word boundary (\W|\A on the left)
-\b{end-half}    half of a Unicode end-of-word boundary (\W|\z on the right)
+^     the beginning of a haystack (or start-of-line with multi-line mode)
+$     the end of a haystack (or end-of-line with multi-line mode)
+\A    only the beginning of a haystack (even with multi-line mode enabled)
+\z    only the end of a haystack (even with multi-line mode enabled)
+\b    a Unicode word boundary (\w on one side and \W, \A, or \z on other)
+\B    not a Unicode word boundary
 
The empty regex is valid and matches the empty string. For example, the @@ -862,32 +856,28 @@ documented elsewhere.
-\*              literal *, applies to all ASCII except [0-9A-Za-z<>]
-\a              bell (\x07)
-\f              form feed (\x0C)
-\t              horizontal tab
-\n              new line
-\r              carriage return
-\v              vertical tab (\x0B)
-\A              matches at the beginning of a haystack
-\z              matches at the end of a haystack
-\b              word boundary assertion
-\B              negated word boundary assertion
-\b{start}, \<   start-of-word boundary assertion
-\b{end}, \>     end-of-word boundary assertion
-\b{start-half}  half of a start-of-word boundary assertion
-\b{end-half}    half of a end-of-word boundary assertion
-\123            octal character code, up to three digits (when enabled)
-\x7F            hex character code (exactly two digits)
-\x{10FFFF}      any hex character code corresponding to a Unicode code point
-\u007F          hex character code (exactly four digits)
-\u{7F}          any hex character code corresponding to a Unicode code point
-\U0000007F      hex character code (exactly eight digits)
-\U{7F}          any hex character code corresponding to a Unicode code point
-\p{Letter}      Unicode character class
-\P{Letter}      negated Unicode character class
-\d, \s, \w      Perl character class
-\D, \S, \W      negated Perl character class
+\*          literal *, applies to all ASCII except [0-9A-Za-z<>]
+\a          bell (\x07)
+\f          form feed (\x0C)
+\t          horizontal tab
+\n          new line
+\r          carriage return
+\v          vertical tab (\x0B)
+\A          matches at the beginning of a haystack
+\z          matches at the end of a haystack
+\b          word boundary assertion
+\B          negated word boundary assertion
+\123        octal character code, up to three digits (when enabled)
+\x7F        hex character code (exactly two digits)
+\x{10FFFF}  any hex character code corresponding to a Unicode code point
+\u007F      hex character code (exactly four digits)
+\u{7F}      any hex character code corresponding to a Unicode code point
+\U0000007F  hex character code (exactly eight digits)
+\U{7F}      any hex character code corresponding to a Unicode code point
+\p{Letter}  Unicode character class
+\P{Letter}  negated Unicode character class
+\d, \s, \w  Perl character class
+\D, \S, \W  negated Perl character class
 
### Perl character classes (Unicode friendly) diff -Nru temporalio-1.3.0/vendor/regex/src/regex/bytes.rs temporalio-1.3.0/vendor/regex/src/regex/bytes.rs --- temporalio-1.3.0/vendor/regex/src/regex/bytes.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/regex/src/regex/bytes.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1154,7 +1154,7 @@ /// /// A [`CaptureLocations`] stores the same byte offsets as a [`Captures`], /// but does *not* store a reference to the haystack. This makes its API - /// a bit lower level and less convenient. But in exchange, callers + /// a bit lower level and less convenience. But in exchange, callers /// may allocate their own `CaptureLocations` and reuse it for multiple /// searches. This may be helpful if allocating a `Captures` shows up in a /// profile as too costly. @@ -1162,8 +1162,8 @@ /// To create a `CaptureLocations` value, use the /// [`Regex::capture_locations`] method. /// - /// This also returns the overall match if one was found. When a match is - /// found, its offsets are also always stored in `locs` at index `0`. + /// This also the overall match if one was found. When a match is found, + /// its offsets are also always stored in `locs` at index `0`. /// /// # Example /// @@ -2037,10 +2037,7 @@ /// /// // Asking for an invalid capture group always returns None. /// assert_eq!(None, locs.get(3)); -/// # // literals are too big for 32-bit usize: #1041 -/// # #[cfg(target_pointer_width = "64")] /// assert_eq!(None, locs.get(34973498648)); -/// # #[cfg(target_pointer_width = "64")] /// assert_eq!(None, locs.get(9944060567225171988)); /// ``` #[derive(Clone, Debug)] diff -Nru temporalio-1.3.0/vendor/regex/src/regex/string.rs temporalio-1.3.0/vendor/regex/src/regex/string.rs --- temporalio-1.3.0/vendor/regex/src/regex/string.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/regex/src/regex/string.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1145,7 +1145,7 @@ /// /// A [`CaptureLocations`] stores the same byte offsets as a [`Captures`], /// but does *not* store a reference to the haystack. This makes its API - /// a bit lower level and less convenient. But in exchange, callers + /// a bit lower level and less convenience. But in exchange, callers /// may allocate their own `CaptureLocations` and reuse it for multiple /// searches. This may be helpful if allocating a `Captures` shows up in a /// profile as too costly. @@ -1153,8 +1153,8 @@ /// To create a `CaptureLocations` value, use the /// [`Regex::capture_locations`] method. /// - /// This also returns the overall match if one was found. When a match is - /// found, its offsets are also always stored in `locs` at index `0`. + /// This also the overall match if one was found. When a match is found, + /// its offsets are also always stored in `locs` at index `0`. /// /// # Panics /// @@ -2040,10 +2040,7 @@ /// /// // Asking for an invalid capture group always returns None. /// assert_eq!(None, locs.get(3)); -/// # // literals are too big for 32-bit usize: #1041 -/// # #[cfg(target_pointer_width = "64")] /// assert_eq!(None, locs.get(34973498648)); -/// # #[cfg(target_pointer_width = "64")] /// assert_eq!(None, locs.get(9944060567225171988)); /// ``` #[derive(Clone, Debug)] diff -Nru temporalio-1.3.0/vendor/regex/testdata/line-terminator.toml temporalio-1.3.0/vendor/regex/testdata/line-terminator.toml --- temporalio-1.3.0/vendor/regex/testdata/line-terminator.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/regex/testdata/line-terminator.toml 2023-10-30 19:40:00.000000000 +0000 @@ -38,18 +38,6 @@ line-terminator = '\xFF' utf8 = false -# This tests a tricky case where the line terminator is set to \r. This ensures -# that the StartLF look-behind assertion is tracked when computing the start -# state. -[[test]] -name = "carriage" -regex = '(?m)^[a-z]+' -haystack = 'ABC\rabc' -matches = [[4, 7]] -bounds = [4, 7] -unescape = true -line-terminator = '\r' - # This tests that we can set the line terminator to a byte corresponding to a # word character, and things work as expected. [[test]] diff -Nru temporalio-1.3.0/vendor/regex/testdata/regression.toml temporalio-1.3.0/vendor/regex/testdata/regression.toml --- temporalio-1.3.0/vendor/regex/testdata/regression.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/regex/testdata/regression.toml 2023-10-30 19:40:00.000000000 +0000 @@ -756,75 +756,3 @@ regex = '(?:([0-9][0-9][0-9]):)?([0-9][0-9]):([0-9][0-9])' haystack = '102:12:39' matches = [[[0, 9], [0, 3], [4, 6], [7, 9]]] - -# This regression test was found via the RegexSet APIs. It triggered a -# particular code path where a regex was compiled with 'All' match semantics -# (to support overlapping search), but got funneled down into a standard -# leftmost search when calling 'is_match'. This is fine on its own, but the -# leftmost search will use a prefilter and that's where this went awry. -# -# Namely, since 'All' semantics were used, the aho-corasick prefilter was -# incorrectly compiled with 'Standard' semantics. This was wrong because -# 'Standard' immediately attempts to report a match at every position, even if -# that would mean reporting a match past the leftmost match before reporting -# the leftmost match. This breaks the prefilter contract of never having false -# negatives and leads overall to the engine not finding a match. -# -# See: https://github.com/rust-lang/regex/issues/1070 -[[test]] -name = "prefilter-with-aho-corasick-standard-semantics" -regex = '(?m)^ *v [0-9]' -haystack = 'v 0' -matches = [ - { id = 0, spans = [[0, 3]] }, -] -match-kind = "all" -search-kind = "overlapping" -unicode = true -utf8 = true - -# This tests that the PikeVM and the meta regex agree on a particular regex. -# This test previously failed when the ad hoc engines inside the meta engine -# did not handle quit states correctly. Namely, the Unicode word boundary here -# combined with a non-ASCII codepoint provokes the quit state. The ad hoc -# engines were previously returning a match even after entering the quit state -# if a match had been previously detected, but this is incorrect. The reason -# is that if a quit state is found, then the search must give up *immediately* -# because it prevents the search from finding the "proper" leftmost-first -# match. If it instead returns a match that has been found, it risks reporting -# an improper match, as it did in this case. -# -# See: https://github.com/rust-lang/regex/issues/1046 -[[test]] -name = "non-prefix-literal-quit-state" -regex = '.+\b\n' -haystack = "β77\n" -matches = [[0, 5]] - -# This is a regression test for some errant HIR interval set operations that -# were made in the regex-syntax 0.8.0 release and then reverted in 0.8.1. The -# issue here is that the HIR produced from the regex had out-of-order ranges. -# -# See: https://github.com/rust-lang/regex/issues/1103 -# Ref: https://github.com/rust-lang/regex/pull/1051 -# Ref: https://github.com/rust-lang/regex/pull/1102 -[[test]] -name = "hir-optimization-out-of-order-class" -regex = '^[[:alnum:]./-]+$' -haystack = "a-b" -matches = [[0, 3]] - -# This is a regression test for an improper reverse suffix optimization. This -# occurred when I "broadened" the applicability of the optimization to include -# multiple possible literal suffixes instead of only sticking to a non-empty -# longest common suffix. It turns out that, at least given how the reverse -# suffix optimization works, we need to stick to the longest common suffix for -# now. -# -# See: https://github.com/rust-lang/regex/issues/1110 -# See also: https://github.com/astral-sh/ruff/pull/7980 -[[test]] -name = 'improper-reverse-suffix-optimization' -regex = '(\\N\{[^}]+})|([{}])' -haystack = 'hiya \N{snowman} bye' -matches = [[[5, 16], [5, 16], []]] diff -Nru temporalio-1.3.0/vendor/regex/testdata/word-boundary-special.toml temporalio-1.3.0/vendor/regex/testdata/word-boundary-special.toml --- temporalio-1.3.0/vendor/regex/testdata/word-boundary-special.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/regex/testdata/word-boundary-special.toml 1970-01-01 00:00:00.000000000 +0000 @@ -1,687 +0,0 @@ -# These tests are for the "special" word boundary assertions. That is, -# \b{start}, \b{end}, \b{start-half}, \b{end-half}. These are specialty -# assertions for more niche use cases, but hitting those cases without these -# assertions is difficult. For example, \b{start-half} and \b{end-half} are -# used to implement the -w/--word-regexp flag in a grep program. - -# Tests for (?-u:\b{start}) - -[[test]] -name = "word-start-ascii-010" -regex = '\b{start}' -haystack = "a" -matches = [[0, 0]] -unicode = false - -[[test]] -name = "word-start-ascii-020" -regex = '\b{start}' -haystack = "a " -matches = [[0, 0]] -unicode = false - -[[test]] -name = "word-start-ascii-030" -regex = '\b{start}' -haystack = " a " -matches = [[1, 1]] -unicode = false - -[[test]] -name = "word-start-ascii-040" -regex = '\b{start}' -haystack = "" -matches = [] -unicode = false - -[[test]] -name = "word-start-ascii-050" -regex = '\b{start}' -haystack = "ab" -matches = [[0, 0]] -unicode = false - -[[test]] -name = "word-start-ascii-060" -regex = '\b{start}' -haystack = "ð›ƒ" -matches = [] -unicode = false - -[[test]] -name = "word-start-ascii-060-bounds" -regex = '\b{start}' -haystack = "ð›ƒ" -bounds = [2, 3] -matches = [] -unicode = false - -[[test]] -name = "word-start-ascii-070" -regex = '\b{start}' -haystack = " 𛃠" -matches = [] -unicode = false - -[[test]] -name = "word-start-ascii-080" -regex = '\b{start}' -haystack = "ð›ƒð†€" -matches = [] -unicode = false - -[[test]] -name = "word-start-ascii-090" -regex = '\b{start}' -haystack = "ð›ƒb" -matches = [[4, 4]] -unicode = false - -[[test]] -name = "word-start-ascii-110" -regex = '\b{start}' -haystack = "bð›ƒ" -matches = [[0, 0]] -unicode = false - -# Tests for (?-u:\b{end}) - -[[test]] -name = "word-end-ascii-010" -regex = '\b{end}' -haystack = "a" -matches = [[1, 1]] -unicode = false - -[[test]] -name = "word-end-ascii-020" -regex = '\b{end}' -haystack = "a " -matches = [[1, 1]] -unicode = false - -[[test]] -name = "word-end-ascii-030" -regex = '\b{end}' -haystack = " a " -matches = [[2, 2]] -unicode = false - -[[test]] -name = "word-end-ascii-040" -regex = '\b{end}' -haystack = "" -matches = [] -unicode = false - -[[test]] -name = "word-end-ascii-050" -regex = '\b{end}' -haystack = "ab" -matches = [[2, 2]] -unicode = false - -[[test]] -name = "word-end-ascii-060" -regex = '\b{end}' -haystack = "ð›ƒ" -matches = [] -unicode = false - -[[test]] -name = "word-end-ascii-060-bounds" -regex = '\b{end}' -haystack = "ð›ƒ" -bounds = [2, 3] -matches = [] -unicode = false - -[[test]] -name = "word-end-ascii-070" -regex = '\b{end}' -haystack = " 𛃠" -matches = [] -unicode = false - -[[test]] -name = "word-end-ascii-080" -regex = '\b{end}' -haystack = "ð›ƒð†€" -matches = [] -unicode = false - -[[test]] -name = "word-end-ascii-090" -regex = '\b{end}' -haystack = "ð›ƒb" -matches = [[5, 5]] -unicode = false - -[[test]] -name = "word-end-ascii-110" -regex = '\b{end}' -haystack = "bð›ƒ" -matches = [[1, 1]] -unicode = false - -# Tests for \b{start} - -[[test]] -name = "word-start-unicode-010" -regex = '\b{start}' -haystack = "a" -matches = [[0, 0]] -unicode = true - -[[test]] -name = "word-start-unicode-020" -regex = '\b{start}' -haystack = "a " -matches = [[0, 0]] -unicode = true - -[[test]] -name = "word-start-unicode-030" -regex = '\b{start}' -haystack = " a " -matches = [[1, 1]] -unicode = true - -[[test]] -name = "word-start-unicode-040" -regex = '\b{start}' -haystack = "" -matches = [] -unicode = true - -[[test]] -name = "word-start-unicode-050" -regex = '\b{start}' -haystack = "ab" -matches = [[0, 0]] -unicode = true - -[[test]] -name = "word-start-unicode-060" -regex = '\b{start}' -haystack = "ð›ƒ" -matches = [[0, 0]] -unicode = true - -[[test]] -name = "word-start-unicode-060-bounds" -regex = '\b{start}' -haystack = "ð›ƒ" -bounds = [2, 3] -matches = [] -unicode = true - -[[test]] -name = "word-start-unicode-070" -regex = '\b{start}' -haystack = " 𛃠" -matches = [[1, 1]] -unicode = true - -[[test]] -name = "word-start-unicode-080" -regex = '\b{start}' -haystack = "ð›ƒð†€" -matches = [[0, 0]] -unicode = true - -[[test]] -name = "word-start-unicode-090" -regex = '\b{start}' -haystack = "ð›ƒb" -matches = [[0, 0]] -unicode = true - -[[test]] -name = "word-start-unicode-110" -regex = '\b{start}' -haystack = "bð›ƒ" -matches = [[0, 0]] -unicode = true - -# Tests for \b{end} - -[[test]] -name = "word-end-unicode-010" -regex = '\b{end}' -haystack = "a" -matches = [[1, 1]] -unicode = true - -[[test]] -name = "word-end-unicode-020" -regex = '\b{end}' -haystack = "a " -matches = [[1, 1]] -unicode = true - -[[test]] -name = "word-end-unicode-030" -regex = '\b{end}' -haystack = " a " -matches = [[2, 2]] -unicode = true - -[[test]] -name = "word-end-unicode-040" -regex = '\b{end}' -haystack = "" -matches = [] -unicode = true - -[[test]] -name = "word-end-unicode-050" -regex = '\b{end}' -haystack = "ab" -matches = [[2, 2]] -unicode = true - -[[test]] -name = "word-end-unicode-060" -regex = '\b{end}' -haystack = "ð›ƒ" -matches = [[4, 4]] -unicode = true - -[[test]] -name = "word-end-unicode-060-bounds" -regex = '\b{end}' -haystack = "ð›ƒ" -bounds = [2, 3] -matches = [] -unicode = true - -[[test]] -name = "word-end-unicode-070" -regex = '\b{end}' -haystack = " 𛃠" -matches = [[5, 5]] -unicode = true - -[[test]] -name = "word-end-unicode-080" -regex = '\b{end}' -haystack = "ð›ƒð†€" -matches = [[4, 4]] -unicode = true - -[[test]] -name = "word-end-unicode-090" -regex = '\b{end}' -haystack = "ð›ƒb" -matches = [[5, 5]] -unicode = true - -[[test]] -name = "word-end-unicode-110" -regex = '\b{end}' -haystack = "bð›ƒ" -matches = [[5, 5]] -unicode = true - -# Tests for (?-u:\b{start-half}) - -[[test]] -name = "word-start-half-ascii-010" -regex = '\b{start-half}' -haystack = "a" -matches = [[0, 0]] -unicode = false - -[[test]] -name = "word-start-half-ascii-020" -regex = '\b{start-half}' -haystack = "a " -matches = [[0, 0], [2, 2]] -unicode = false - -[[test]] -name = "word-start-half-ascii-030" -regex = '\b{start-half}' -haystack = " a " -matches = [[0, 0], [1, 1], [3, 3]] -unicode = false - -[[test]] -name = "word-start-half-ascii-040" -regex = '\b{start-half}' -haystack = "" -matches = [[0, 0]] -unicode = false - -[[test]] -name = "word-start-half-ascii-050" -regex = '\b{start-half}' -haystack = "ab" -matches = [[0, 0]] -unicode = false - -[[test]] -name = "word-start-half-ascii-060" -regex = '\b{start-half}' -haystack = "ð›ƒ" -matches = [[0, 0], [4, 4]] -unicode = false - -[[test]] -name = "word-start-half-ascii-060-noutf8" -regex = '\b{start-half}' -haystack = "ð›ƒ" -matches = [[0, 0], [1, 1], [2, 2], [3, 3], [4, 4]] -unicode = false -utf8 = false - -[[test]] -name = "word-start-half-ascii-060-bounds" -regex = '\b{start-half}' -haystack = "ð›ƒ" -bounds = [2, 3] -matches = [] -unicode = false - -[[test]] -name = "word-start-half-ascii-070" -regex = '\b{start-half}' -haystack = " 𛃠" -matches = [[0, 0], [1, 1], [5, 5], [6, 6]] -unicode = false - -[[test]] -name = "word-start-half-ascii-080" -regex = '\b{start-half}' -haystack = "ð›ƒð†€" -matches = [[0, 0], [4, 4], [8, 8]] -unicode = false - -[[test]] -name = "word-start-half-ascii-090" -regex = '\b{start-half}' -haystack = "ð›ƒb" -matches = [[0, 0], [4, 4]] -unicode = false - -[[test]] -name = "word-start-half-ascii-110" -regex = '\b{start-half}' -haystack = "bð›ƒ" -matches = [[0, 0], [5, 5]] -unicode = false - -# Tests for (?-u:\b{end-half}) - -[[test]] -name = "word-end-half-ascii-010" -regex = '\b{end-half}' -haystack = "a" -matches = [[1, 1]] -unicode = false - -[[test]] -name = "word-end-half-ascii-020" -regex = '\b{end-half}' -haystack = "a " -matches = [[1, 1], [2, 2]] -unicode = false - -[[test]] -name = "word-end-half-ascii-030" -regex = '\b{end-half}' -haystack = " a " -matches = [[0, 0], [2, 2], [3, 3]] -unicode = false - -[[test]] -name = "word-end-half-ascii-040" -regex = '\b{end-half}' -haystack = "" -matches = [[0, 0]] -unicode = false - -[[test]] -name = "word-end-half-ascii-050" -regex = '\b{end-half}' -haystack = "ab" -matches = [[2, 2]] -unicode = false - -[[test]] -name = "word-end-half-ascii-060" -regex = '\b{end-half}' -haystack = "ð›ƒ" -matches = [[0, 0], [4, 4]] -unicode = false - -[[test]] -name = "word-end-half-ascii-060-bounds" -regex = '\b{end-half}' -haystack = "ð›ƒ" -bounds = [2, 3] -matches = [] -unicode = false - -[[test]] -name = "word-end-half-ascii-070" -regex = '\b{end-half}' -haystack = " 𛃠" -matches = [[0, 0], [1, 1], [5, 5], [6, 6]] -unicode = false - -[[test]] -name = "word-end-half-ascii-080" -regex = '\b{end-half}' -haystack = "ð›ƒð†€" -matches = [[0, 0], [4, 4], [8, 8]] -unicode = false - -[[test]] -name = "word-end-half-ascii-090" -regex = '\b{end-half}' -haystack = "ð›ƒb" -matches = [[0, 0], [5, 5]] -unicode = false - -[[test]] -name = "word-end-half-ascii-110" -regex = '\b{end-half}' -haystack = "bð›ƒ" -matches = [[1, 1], [5, 5]] -unicode = false - -# Tests for \b{start-half} - -[[test]] -name = "word-start-half-unicode-010" -regex = '\b{start-half}' -haystack = "a" -matches = [[0, 0]] -unicode = true - -[[test]] -name = "word-start-half-unicode-020" -regex = '\b{start-half}' -haystack = "a " -matches = [[0, 0], [2, 2]] -unicode = true - -[[test]] -name = "word-start-half-unicode-030" -regex = '\b{start-half}' -haystack = " a " -matches = [[0, 0], [1, 1], [3, 3]] -unicode = true - -[[test]] -name = "word-start-half-unicode-040" -regex = '\b{start-half}' -haystack = "" -matches = [[0, 0]] -unicode = true - -[[test]] -name = "word-start-half-unicode-050" -regex = '\b{start-half}' -haystack = "ab" -matches = [[0, 0]] -unicode = true - -[[test]] -name = "word-start-half-unicode-060" -regex = '\b{start-half}' -haystack = "ð›ƒ" -matches = [[0, 0]] -unicode = true - -[[test]] -name = "word-start-half-unicode-060-bounds" -regex = '\b{start-half}' -haystack = "ð›ƒ" -bounds = [2, 3] -matches = [] -unicode = true - -[[test]] -name = "word-start-half-unicode-070" -regex = '\b{start-half}' -haystack = " 𛃠" -matches = [[0, 0], [1, 1], [6, 6]] -unicode = true - -[[test]] -name = "word-start-half-unicode-080" -regex = '\b{start-half}' -haystack = "ð›ƒð†€" -matches = [[0, 0], [8, 8]] -unicode = true - -[[test]] -name = "word-start-half-unicode-090" -regex = '\b{start-half}' -haystack = "ð›ƒb" -matches = [[0, 0]] -unicode = true - -[[test]] -name = "word-start-half-unicode-110" -regex = '\b{start-half}' -haystack = "bð›ƒ" -matches = [[0, 0]] -unicode = true - -# Tests for \b{end-half} - -[[test]] -name = "word-end-half-unicode-010" -regex = '\b{end-half}' -haystack = "a" -matches = [[1, 1]] -unicode = true - -[[test]] -name = "word-end-half-unicode-020" -regex = '\b{end-half}' -haystack = "a " -matches = [[1, 1], [2, 2]] -unicode = true - -[[test]] -name = "word-end-half-unicode-030" -regex = '\b{end-half}' -haystack = " a " -matches = [[0, 0], [2, 2], [3, 3]] -unicode = true - -[[test]] -name = "word-end-half-unicode-040" -regex = '\b{end-half}' -haystack = "" -matches = [[0, 0]] -unicode = true - -[[test]] -name = "word-end-half-unicode-050" -regex = '\b{end-half}' -haystack = "ab" -matches = [[2, 2]] -unicode = true - -[[test]] -name = "word-end-half-unicode-060" -regex = '\b{end-half}' -haystack = "ð›ƒ" -matches = [[4, 4]] -unicode = true - -[[test]] -name = "word-end-half-unicode-060-bounds" -regex = '\b{end-half}' -haystack = "ð›ƒ" -bounds = [2, 3] -matches = [] -unicode = true - -[[test]] -name = "word-end-half-unicode-070" -regex = '\b{end-half}' -haystack = " 𛃠" -matches = [[0, 0], [5, 5], [6, 6]] -unicode = true - -[[test]] -name = "word-end-half-unicode-080" -regex = '\b{end-half}' -haystack = "ð›ƒð†€" -matches = [[4, 4], [8, 8]] -unicode = true - -[[test]] -name = "word-end-half-unicode-090" -regex = '\b{end-half}' -haystack = "ð›ƒb" -matches = [[5, 5]] -unicode = true - -[[test]] -name = "word-end-half-unicode-110" -regex = '\b{end-half}' -haystack = "bð›ƒ" -matches = [[5, 5]] -unicode = true - -# Specialty tests. - -# Since \r is special cased in the start state computation (to deal with CRLF -# mode), this test ensures that the correct start state is computed when the -# pattern starts with a half word boundary assertion. -[[test]] -name = "word-start-half-ascii-carriage" -regex = '\b{start-half}[a-z]+' -haystack = 'ABC\rabc' -matches = [[4, 7]] -bounds = [4, 7] -unescape = true - -# Since \n is also special cased in the start state computation, this test -# ensures that the correct start state is computed when the pattern starts with -# a half word boundary assertion. -[[test]] -name = "word-start-half-ascii-linefeed" -regex = '\b{start-half}[a-z]+' -haystack = 'ABC\nabc' -matches = [[4, 7]] -bounds = [4, 7] -unescape = true - -# Like the carriage return test above, but with a custom line terminator. -[[test]] -name = "word-start-half-ascii-customlineterm" -regex = '\b{start-half}[a-z]+' -haystack = 'ABC!abc' -matches = [[4, 7]] -bounds = [4, 7] -unescape = true -line-terminator = '!' diff -Nru temporalio-1.3.0/vendor/regex/tests/lib.rs temporalio-1.3.0/vendor/regex/tests/lib.rs --- temporalio-1.3.0/vendor/regex/tests/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/regex/tests/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -49,7 +49,6 @@ load!("unicode"); load!("utf8"); load!("word-boundary"); - load!("word-boundary-special"); load!("fowler/basic"); load!("fowler/nullsubexpr"); load!("fowler/repetition"); diff -Nru temporalio-1.3.0/vendor/regex-automata/.cargo-checksum.json temporalio-1.3.0/vendor/regex-automata/.cargo-checksum.json --- temporalio-1.3.0/vendor/regex-automata/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/regex-automata/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"Cargo.toml":"68de160610af9bb545a752c5da0d82b581e98e0f2631e2253c8a992fc51e322b","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","README.md":"61db25dbf26092fc80e8db89165692e55f9fb86b14e8451ebb28303f45932254","src/dfa/accel.rs":"2a045b0f6715e913d18d2212a7804fabaadfc3bcffad9382e35574d32eb0c492","src/dfa/automaton.rs":"c14707007bbb915fd5607424b0a4c8e53fa7daf6c7c1f4e3045d51ef15f9b202","src/dfa/dense.rs":"1de3a93f33525b419e3f47ab98d364234ccd68fc30273fd362fe8161a9a37ea3","src/dfa/determinize.rs":"91b9f69d28bdd064aa86716fe0772e4145050fd458bb7869a28660b4f7b64872","src/dfa/minimize.rs":"b5cadb462b9f24cd4aa7a665e75fb813cd06858a92b8986c9c5ae7fd9a60dfab","src/dfa/mod.rs":"ab1ac378d81bb5ea40a23cf903928adae4758e30f54646afde71869234965723","src/dfa/onepass.rs":"013f09b795955aefd07936994f08df4bc5b39698797f586b85171f778162aeab","src/dfa/regex.rs":"d16f0434a0b0f1341d6d5e0a162e6afa29411a786fb37b0e98bbcc0c6ba3cfec","src/dfa/remapper.rs":"ca096abc0f8e45c43a2adf3a7743b8857714ae7411a623edea41cc3ce906a169","src/dfa/search.rs":"79b9ab2b0636177bc26d1ad6f0059ca033decf74824cb5a36f1ac19f020d2713","src/dfa/sparse.rs":"c863d92a4d919fa880dfca3d59a8b5b672c6ffa8423578b34fc0af2ae62e1d7a","src/dfa/special.rs":"c2e60de5b98e68c9c45aaffbc67a08f049831a764a1ed29d1d1db0fb68efdce5","src/dfa/start.rs":"46b1dbaf8e4518ddddda6bbe596621aae36f8ba694390483a22355d9d799be8e","src/hybrid/dfa.rs":"a6ed6d3268e4008f88c1469029a84391edfee7851df2912640763e4ba2188635","src/hybrid/error.rs":"37db2a9759721de4ca2c49e21ab74dd3d998b67c5ab0e65a62085b57ec1d7ba3","src/hybrid/id.rs":"6168aad5c81c627494ba0575a24d61fd0ae7efabaaceeadb8ff28472275e2813","src/hybrid/mod.rs":"ca21e89062bdb5a0998d5cd1bc78609af1f6b795533e5982be969c383ac0463a","src/hybrid/regex.rs":"47815d025526330291f4cd749b4dd79b1122ef208fe6f0a49715c70fc1ea47c8","src/hybrid/search.rs":"76067f3f8675013dcdf7e9c9cc4d9d33d1107fb2cbcd7adcc05cfd42177d90cc","src/lib.rs":"4e831d41057760c5f2f1274a206fa5a42f59dbca8f98ad3e782fe0fba0d6c37f","src/macros.rs":"3e4b39252bfa471fad384160a43f113ebfec7bec46a85d16f006622881dd2081","src/meta/error.rs":"710a6813314b1b11ace1b016a827067fff8b2624d47e15c7f52043bff5ab57da","src/meta/limited.rs":"98b6b2d19f67d4ce3ddb110e06045f22a040590262fde33614ab900bdd06b25b","src/meta/literal.rs":"52da98bb30995dedd22786e4728cb84e84c6093a284168bd91196b999dd0f6ec","src/meta/mod.rs":"f3b10b96fa08efaba3e4c9b81883cf40aac6e4c1f6ae55a497a534cf5805b46d","src/meta/regex.rs":"b0fab107d3f972db89568e14fec0199ba4cd8076cc5fd61c2582db42885f196e","src/meta/reverse_inner.rs":"945d6c2d4c7538e1609dbd430a096784d22abd33db58b1ba65c9c9af45a7d3c0","src/meta/stopat.rs":"acb6122e17d10a9b1b5e72d6030e6d95748227975bad0ff5cbbcc2587edfa6df","src/meta/strategy.rs":"c882c5c261de5fe58bc65251d2d407e4cb483b9b80c2bec5eba958ef90e0072d","src/meta/wrappers.rs":"3cb0717f87b7082cc75cb02148b8cde30cffbee689bdb6275abcf1416747ceb4","src/nfa/mod.rs":"1a731e217ed4053714500e84e58cc127f402e4e075f7d0e5b9aea715cd52405a","src/nfa/thompson/backtrack.rs":"041015ea153c1e485e9cf39ec60d1e51c7ab9e400ecd77cad2078af45775339b","src/nfa/thompson/builder.rs":"7adf6aba69171f6acd47fea0fec85ba589154fead83f2042a1c6fe9486aa4dbd","src/nfa/thompson/compiler.rs":"a8bb24f7f125a294cb75af9d8332821142738278d8eff354647ae08f66a597af","src/nfa/thompson/error.rs":"78488c2fdb85f819f53cc30bb11c7f96169112da5dd14c351e5cc3bcccf0e10e","src/nfa/thompson/literal_trie.rs":"c2d1d09b44da4648db797386c2410cbf63337afef8cb62e6e78cf34786892a11","src/nfa/thompson/map.rs":"4dcfc0a43bbd91ff69cc8a47486b5f7cac048f7d5cf269b63933d7f2e177a533","src/nfa/thompson/mod.rs":"0651520debd6f023ae1a2c422806aab37f8491e5bb092e20dfdc4fe4179d695c","src/nfa/thompson/nfa.rs":"410c3745c159eb17bea18256ec03ee92e1fccca630f01a24618a75fffcf86866","src/nfa/thompson/pikevm.rs":"aaf792832d1bf15fad8a8f0b2e6597170361eb3cbcb9343eb5bd242ff346d750","src/nfa/thompson/range_trie.rs":"f081e74e8c08e2268f1ce410608fefa4b14d7d1c0487dbc27d27d51ea6265e30","src/util/alphabet.rs":"94cd73ce2f4e34e0ae0a146d3efdc85478263afdfefd6dc105e0abf0ec79d82b","src/util/captures.rs":"d2a118ba509b70e9922a10ea9f78771b14a521abb0ed4029be3ef6aeea44d032","src/util/determinize/mod.rs":"5e9e1f7dd060d69521b743afc2b900b21ad7942e17397084ac6563ea5dcf2fd9","src/util/determinize/state.rs":"c30eac89137df0f0128143eeb2e0c8d7ea4bd659825fa6721b5315141a326e3a","src/util/empty.rs":"13ec7d6cbd1520db5b4c1dae294f4419fa88d39d2bfc16f4ef258473d609f91c","src/util/escape.rs":"5b2731b41a55cb50ab688132bb5640dbd51f14f141adaa864b9db7f0aa092c74","src/util/int.rs":"b7eec0a6cab0798ba66707988fce3ecfc841b93418028a7b1408c5d0f6271351","src/util/interpolate.rs":"5e4e6b6fb6e5a7603e393bf05c609735d86a7d1f54c2436e42111b4e1409b6dd","src/util/iter.rs":"58ae97b4156d7160a46b909f4635d88d10354d9d892d2fcb4c5e18e24cf38f14","src/util/lazy.rs":"e16b3ed139210ca546fc302c463ce52a5dcfa77382f07c9097400ed8cddf78c8","src/util/look.rs":"fbfcaace79d0c6ad3698c9d6c025cb952f2e00cf88a48cf690d087fa73466689","src/util/memchr.rs":"573109ce4983907083ae0b29a084a324b9b53da369b4d96f7f3a21fd5c8eb5c9","src/util/mod.rs":"6c828a493f0f88c8b515aee4f8faf91ba653eb07e8fc3c23c0524553410803f9","src/util/pool.rs":"da1fad31f2fdf15cf3a6a605ece8d6162d8f6c42770c160af4c0fbf4ef148aa5","src/util/prefilter/aho_corasick.rs":"c54fa95f4d9e7ab53e2c6463a43f8953df6a440997fc9cd528f225db0dd32582","src/util/prefilter/byteset.rs":"1c80fa432acc23223a75a5181e37c40034764dffe42410e4b77af6f24f48bd5c","src/util/prefilter/memchr.rs":"36c6fe6354b2e729db6830166dd4862e439bc48c9e59258d88e4b6c5654e20ef","src/util/prefilter/memmem.rs":"6f6ed9450b14abf3e4a33d395337e51fbaa9743a0a16aac0009f7680aa60c500","src/util/prefilter/mod.rs":"2818e2e92632aee1c46b0dc01b654e544bfbf460236be86d28a2d836e9fc189a","src/util/prefilter/teddy.rs":"ed54d26858b56e1c8c87e44afae5f63d81ab930787d79e671f3a3513f576e9cd","src/util/primitives.rs":"8a9cc19ef2e1ab183943cdc2d2f095b02252476e32b7e9fff4a06a251749b068","src/util/search.rs":"66bf320ebbe403c119a966f3dfbd53178de0ceebd2ca1922f1ddbb79aed36837","src/util/sparse_set.rs":"3d4aa30b6aa9fc875d36506487a5095dbe8ed528b89e4146a65c7e7497520a4d","src/util/start.rs":"73ebcf2550cea56f67b9048fa3dc91f3a8db9897fbd2400dd9941efb0cb4827e","src/util/syntax.rs":"720ac0d6600fad33f5967b5afe4e3de2096b857e4cda6fa16ba93b10a8230cab","src/util/unicode_data/mod.rs":"54c3e10bbc393e9881bfac3295815b160f59e69e2056bc29ee7cf0addd8e3cf7","src/util/unicode_data/perl_word.rs":"2e1a5d889598bd4e73af17d3a9f7d6b4cf2f6ab24920a5336e496bb255281e56","src/util/utf8.rs":"7a068009fdf07e693e521b1f0264725c0e6118dbe1eab55da9d0eab21785fcc1","src/util/wire.rs":"bfdf52615c516b6c07db3ce9c333ea61fdc535bd0b79560bbd7f6864ab83946e","test":"39d79ce3532c31a51c0be89a2939816fad0e4868d2b03992c202cbe64dce9f6c","tests/dfa/api.rs":"cc28e366b6bcbfcf379265acd492a92c62743c3f20e7a2b273019679aa9e1291","tests/dfa/mod.rs":"924d8fff500b9b7b140082623023e78007058a87323151cd8e361462945e4f16","tests/dfa/onepass/mod.rs":"d08f4ecb8ec243be584944c9602af1ed3a48a8732dd11cd573b0d1d182171303","tests/dfa/onepass/suite.rs":"6d63ec5469e6876656ae607cdbe07e6a4e17ace7836b67435763c9b1d233438a","tests/dfa/regression.rs":"ebcf2645290286aa7531eb2b7951385e5ed8167532437aeca2ad2049768fd796","tests/dfa/suite.rs":"2812aa0167ee5e93eff3f7d45096a78c5f3a2440197a513b3cf0310286640f51","tests/fuzz/dense.rs":"3e1099a0cce61e85abc0ad81bc592e85f497f159ef0e5d1d32bac1936aa6f20c","tests/fuzz/mod.rs":"043773510e02f51def43ee0c2b8b867c53ecc8638c8a9233b2ac098de9c3ac1e","tests/fuzz/sparse.rs":"ba61db4927ab28953037a4b20317399c86d01b4d774e46c020ade19029215e25","tests/fuzz/testdata/deserialize_dense_crash-9486fb7c8a93b12c12a62166b43d31640c0208a9":"8961279a8237c3e318452024dd971b1d5a26b058260c297382a74daca1b7f0d1","tests/fuzz/testdata/deserialize_dense_minimized-from-9486fb7c8a93b12c12a62166b43d31640c0208a9":"c2d52e3dea78d3f159b5b521d433358a7fee45ce20ed1545067d461f45ef66b8","tests/fuzz/testdata/deserialize_sparse_crash-0da59c0434eaf35e5a6b470fa9244bb79c72b000":"5b2d273023de3fb04037eaf2e6b4f51cced4c5a08d2e6b44e4be540774f939b9","tests/fuzz/testdata/deserialize_sparse_crash-18cfc246f2ddfc3dfc92b0c7893178c7cf65efa9":"e2e22e2f46a9a75b5c876476442276cf675fe244c5cf918789e4f6b14078fbd9","tests/fuzz/testdata/deserialize_sparse_crash-61fd8e3003bf9d99f6c1e5a8488727eefd234b98":"24a12712e1f2ba0a40b5782707908a74dd19941dc372ef525d65a7134f91988c","tests/fuzz/testdata/deserialize_sparse_crash-a1b839d899ced76d5d7d0f78f9edb7a421505838":"a97f39b2febf9c73535681f7a86201e4b06d5a1ffcf135299c96c1cabfa9f6c4","tests/fuzz/testdata/deserialize_sparse_crash-c383ae07ec5e191422eadc492117439011816570":"44fe3ef878d35e2d51c2c17ff89bbbe3a4650e09d0cbbd48625c0f5e4dd0848b","tests/fuzz/testdata/deserialize_sparse_crash-d07703ceb94b10dcd9e4acb809f2051420449e2b":"d5534be36653b4af6cb94a7c63be58869bb8c204c5c63d67a4d6c986b44bb2e1","tests/fuzz/testdata/deserialize_sparse_crash-dbb8172d3984e7e7d03f4b5f8bb86ecd1460eff9":"77b844898610560afa09f2b8de73a85a0ba9a3b8cee4ff1bbf26b8c97ad4e8a2","tests/gen/README.md":"c3bfdf2f9ced501dd5bd75d01509a34e503efb2dff2f5f7b260580dde5519ed4","tests/gen/dense/mod.rs":"5ae1cfb46212a674118ada2f66f37b25188e84643d406b95eb4665d722344262","tests/gen/dense/multi_pattern_v2.rs":"29b1e9a799adecbdbe7cd05e9748f664c2b915b10b1d2f5d36cfb6453826d1d2","tests/gen/dense/multi_pattern_v2_fwd.bigendian.dfa":"8421d5a1bfc0b6c3bdc8fc90dff591a046b0aaf8e06ef7de7cc293004a35d061","tests/gen/dense/multi_pattern_v2_fwd.littleendian.dfa":"dcf2fd5fd49f5f53cf1ec66f61623402f39401cb3aea30d6677b98bb1e9541bf","tests/gen/dense/multi_pattern_v2_rev.bigendian.dfa":"73c4f20d984e544dfa4cf05f3009d0a9b52fa84bc97b501ea0ccd179e2def4bc","tests/gen/dense/multi_pattern_v2_rev.littleendian.dfa":"74471209f05754e8e20c8a0222a5877b1b15b8b8f33cd8cac89ea65f708b4aff","tests/gen/mod.rs":"043773510e02f51def43ee0c2b8b867c53ecc8638c8a9233b2ac098de9c3ac1e","tests/gen/sparse/mod.rs":"5ae1cfb46212a674118ada2f66f37b25188e84643d406b95eb4665d722344262","tests/gen/sparse/multi_pattern_v2.rs":"e00fb2a510a215460aab84573196b1f51bb65884ff494c2382534c04f6fdbfe9","tests/gen/sparse/multi_pattern_v2_fwd.bigendian.dfa":"3287956bd2003cd69653b125f82aade95d99adbb20229bfdbb4958b8877c0a0b","tests/gen/sparse/multi_pattern_v2_fwd.littleendian.dfa":"bdf285901eaaac4596380115c5bbb20ab2f42f593d8d9e9238a00ed69863f9c9","tests/gen/sparse/multi_pattern_v2_rev.bigendian.dfa":"e466dc085dd68b2d2220932a0e4d28759edd161c1fdad652240aa3825fd85268","tests/gen/sparse/multi_pattern_v2_rev.littleendian.dfa":"80358d0c26c1cc7284065b0075f5b8804d83e673a8a8c8327f93a1c1ff455399","tests/hybrid/api.rs":"bd4862275c52f94c6f6737bf174c97e3de30f8075ca23f43c129c72a0d0afed7","tests/hybrid/mod.rs":"4856a49a4d9b5e9e079c2719a5e75c32408b37e9b76cbdea057b388a3537af6d","tests/hybrid/suite.rs":"688972275c5ef38cdc5112a1e6e54ccd2bf8290008ae2b17344c6c81e17e3a5a","tests/lib.rs":"9775b3c62fb338ea5c1bd3513a6589eff4b5c8d35c599439d9363dbf98c6f8d4","tests/meta/mod.rs":"d08f4ecb8ec243be584944c9602af1ed3a48a8732dd11cd573b0d1d182171303","tests/meta/suite.rs":"4c441f9df82508a5e60dd08f266183f772fc9b2b236fbf69cab87650ecf3b424","tests/nfa/mod.rs":"49055c358e38d97e42acb1602c671f97dddf24cafe089490f0e79ed208d74d9b","tests/nfa/thompson/backtrack/mod.rs":"d08f4ecb8ec243be584944c9602af1ed3a48a8732dd11cd573b0d1d182171303","tests/nfa/thompson/backtrack/suite.rs":"4e7baff70fc98b98b8297c6fd6d5818beb20343379e16cdb95bee46207ac4bd6","tests/nfa/thompson/mod.rs":"de9f5bcea1a8d1f03c85c55ad8c0747877d69e344fcd6c6886b0a402f0661291","tests/nfa/thompson/pikevm/mod.rs":"d08f4ecb8ec243be584944c9602af1ed3a48a8732dd11cd573b0d1d182171303","tests/nfa/thompson/pikevm/suite.rs":"263837ebf5b2e1906a06237982ea875386d83567e399b4ec1f669f10b1422599"},"package":"5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f"} \ No newline at end of file +{"files":{"Cargo.toml":"809aed6770b32e5a1d0b363409293750a28e1f34731f70d94181e865e1868f9c","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","README.md":"61db25dbf26092fc80e8db89165692e55f9fb86b14e8451ebb28303f45932254","src/dfa/accel.rs":"800dada38f7a1d0fa443821dc04a8611c6cf06ef431e517f16867a27cbb4f27d","src/dfa/automaton.rs":"565ebf211769b4710091c4a15b5733296e9fbbc2a137d6eeb1c521b7b69463a0","src/dfa/dense.rs":"73c9c7662c0b4b7901eb17632187aac10bb24e16a89a4dfe78a7bf17bc98f9f1","src/dfa/determinize.rs":"91b9f69d28bdd064aa86716fe0772e4145050fd458bb7869a28660b4f7b64872","src/dfa/minimize.rs":"b5cadb462b9f24cd4aa7a665e75fb813cd06858a92b8986c9c5ae7fd9a60dfab","src/dfa/mod.rs":"e7210af01805f2f390374cd5b40ee502f9dc7633d6a57d988dcb17dfd93864cb","src/dfa/onepass.rs":"d1b29d531545ce30167d58eb24ac15ba10bce158e73483c09f219d5971c8e83c","src/dfa/regex.rs":"f970028c874e2a156db1591bbdc3915027ffa7f47d66d5bd6e97dace5a6a3d5b","src/dfa/remapper.rs":"ca096abc0f8e45c43a2adf3a7743b8857714ae7411a623edea41cc3ce906a169","src/dfa/search.rs":"237cdb8c6239ece5fe8279c4b6209c8094502cdecc9a4e3f977e469e60fd32ec","src/dfa/sparse.rs":"c3a05451a0019850b538dfd640fb12c92ac127b8a69c55f23489bd42c1c1f289","src/dfa/special.rs":"c2e60de5b98e68c9c45aaffbc67a08f049831a764a1ed29d1d1db0fb68efdce5","src/dfa/start.rs":"46b1dbaf8e4518ddddda6bbe596621aae36f8ba694390483a22355d9d799be8e","src/hybrid/dfa.rs":"861b3602bb9ac8b10abe0eae18a2641b2145fcfc7fb22b250ed2e3a345762f4c","src/hybrid/error.rs":"ffc6e65fd9e4694a67902f3516970e3e6cd6e33a7f59a5ab2ac16f740a049d9c","src/hybrid/id.rs":"6168aad5c81c627494ba0575a24d61fd0ae7efabaaceeadb8ff28472275e2813","src/hybrid/mod.rs":"49abcf332f19d2fe87c0a729b1b7715a87794e64f411f4d2bab9d8a4331d6ace","src/hybrid/regex.rs":"9f40aa2cfa89d7a97f9c9e32cb2ae591f4b6f3d51ddec41308d99ce924e130cf","src/hybrid/search.rs":"2aae7ab24c7e6b8d1a1aa81a2f6081f949e9fa42e960fd3fea29f57db8db9f68","src/lib.rs":"4e831d41057760c5f2f1274a206fa5a42f59dbca8f98ad3e782fe0fba0d6c37f","src/macros.rs":"3e4b39252bfa471fad384160a43f113ebfec7bec46a85d16f006622881dd2081","src/meta/error.rs":"710a6813314b1b11ace1b016a827067fff8b2624d47e15c7f52043bff5ab57da","src/meta/limited.rs":"cf629b08d64cb2e1c17d196a1ad6084f733a41e1c947715d9c0ea99ba7f7657d","src/meta/literal.rs":"52da98bb30995dedd22786e4728cb84e84c6093a284168bd91196b999dd0f6ec","src/meta/mod.rs":"f3b10b96fa08efaba3e4c9b81883cf40aac6e4c1f6ae55a497a534cf5805b46d","src/meta/regex.rs":"12ec35a66b889172439c4abebde5f9fb41e85765d6613f4bf622429e83d47b3c","src/meta/reverse_inner.rs":"945d6c2d4c7538e1609dbd430a096784d22abd33db58b1ba65c9c9af45a7d3c0","src/meta/stopat.rs":"b786cd0bd21f66c6f63df2d4bc2e544cd041d548d8001b4a818be1e0f84b6747","src/meta/strategy.rs":"4ee8d21def7323105e5b1101bdb1e152c5befa870a11f2bf0fa85ffbac5a6609","src/meta/wrappers.rs":"6998ff14226905eded36697f885a8ca7508b50ffb05c4b78348ff0e9463857d5","src/nfa/mod.rs":"1a731e217ed4053714500e84e58cc127f402e4e075f7d0e5b9aea715cd52405a","src/nfa/thompson/backtrack.rs":"e9a986d71aa9b0145d9f871c92f466e1b992592d8ac87f7fde36ede2e8016324","src/nfa/thompson/builder.rs":"77bdd42a7fbdedb8d6756f0161d278e677ab1fbe622ca77115c8b506a2a6db21","src/nfa/thompson/compiler.rs":"9cc351398c2d9ce10ac11a1c285f675bc351ecb816d3f33321513dd6bfcdc335","src/nfa/thompson/error.rs":"78488c2fdb85f819f53cc30bb11c7f96169112da5dd14c351e5cc3bcccf0e10e","src/nfa/thompson/literal_trie.rs":"c2d1d09b44da4648db797386c2410cbf63337afef8cb62e6e78cf34786892a11","src/nfa/thompson/map.rs":"96cdf3195f7efb374bcb1791ef5cc12a1cde189ab90402bf01d9b46fb7796b60","src/nfa/thompson/mod.rs":"0651520debd6f023ae1a2c422806aab37f8491e5bb092e20dfdc4fe4179d695c","src/nfa/thompson/nfa.rs":"9782d44b05986370b7f948067977fb20120562e2eca0e4366e35d7d18e81a679","src/nfa/thompson/pikevm.rs":"aaf792832d1bf15fad8a8f0b2e6597170361eb3cbcb9343eb5bd242ff346d750","src/nfa/thompson/range_trie.rs":"c9614074628bb56c9d0a137c1db7e13259a6500e4a46cdc7ddc84bee8f7e928f","src/util/alphabet.rs":"94cd73ce2f4e34e0ae0a146d3efdc85478263afdfefd6dc105e0abf0ec79d82b","src/util/captures.rs":"7aee3aae2836a397c1ad6e4535e0e0d177faf2d99e61476e8fb2710f69763668","src/util/determinize/mod.rs":"32fea73cf4a7a04238c3d3b09ea7afc7fd7c85e87dc115c6152f464ab88bddb2","src/util/determinize/state.rs":"2a0082d5cd2bd47ab75c3f04488655a3c47f1f75075b5d6f9b6e4eeb8980823e","src/util/empty.rs":"13ec7d6cbd1520db5b4c1dae294f4419fa88d39d2bfc16f4ef258473d609f91c","src/util/escape.rs":"5b2731b41a55cb50ab688132bb5640dbd51f14f141adaa864b9db7f0aa092c74","src/util/int.rs":"b7eec0a6cab0798ba66707988fce3ecfc841b93418028a7b1408c5d0f6271351","src/util/interpolate.rs":"5e4e6b6fb6e5a7603e393bf05c609735d86a7d1f54c2436e42111b4e1409b6dd","src/util/iter.rs":"58ae97b4156d7160a46b909f4635d88d10354d9d892d2fcb4c5e18e24cf38f14","src/util/lazy.rs":"e489a96fce952e9d196fd3f5564cf8ea3374eb4aef630ff8f12d82f194ed4336","src/util/look.rs":"e7a5a51f8ed70c2f97edaf3dfbe8859de37b570341447634c6028cb89ff412d7","src/util/memchr.rs":"573109ce4983907083ae0b29a084a324b9b53da369b4d96f7f3a21fd5c8eb5c9","src/util/mod.rs":"16c5fd72263d3a4df994111b81aca36da17f591f4853f21a6a906ac725843f97","src/util/pool.rs":"5e231307962d0918888f98fd1a2bf51c2fc08bf910fa472762136f24cd040cf2","src/util/prefilter/aho_corasick.rs":"7960075f547ee4145420cdc4a8043dc988136e1dd4c34618baae2d641e7f655a","src/util/prefilter/byteset.rs":"1c80fa432acc23223a75a5181e37c40034764dffe42410e4b77af6f24f48bd5c","src/util/prefilter/memchr.rs":"36c6fe6354b2e729db6830166dd4862e439bc48c9e59258d88e4b6c5654e20ef","src/util/prefilter/memmem.rs":"6f6ed9450b14abf3e4a33d395337e51fbaa9743a0a16aac0009f7680aa60c500","src/util/prefilter/mod.rs":"68def6a1f5bd60814904f9f5ab46df9bccfa5da11c1ed60daa826ca7679c33cc","src/util/prefilter/teddy.rs":"6b3ea55b3bf1ed9b07020d635e67f9c7ff34f7859ce1e5ef5922d56fe1e921e3","src/util/primitives.rs":"8a9cc19ef2e1ab183943cdc2d2f095b02252476e32b7e9fff4a06a251749b068","src/util/search.rs":"66bf320ebbe403c119a966f3dfbd53178de0ceebd2ca1922f1ddbb79aed36837","src/util/sparse_set.rs":"3d4aa30b6aa9fc875d36506487a5095dbe8ed528b89e4146a65c7e7497520a4d","src/util/start.rs":"8d2fe005698c0bd3680a0dbfc4a34eebfe2f51081ec1584968383ac4c86fd5fe","src/util/syntax.rs":"720ac0d6600fad33f5967b5afe4e3de2096b857e4cda6fa16ba93b10a8230cab","src/util/unicode_data/mod.rs":"54c3e10bbc393e9881bfac3295815b160f59e69e2056bc29ee7cf0addd8e3cf7","src/util/unicode_data/perl_word.rs":"2e1a5d889598bd4e73af17d3a9f7d6b4cf2f6ab24920a5336e496bb255281e56","src/util/utf8.rs":"7a068009fdf07e693e521b1f0264725c0e6118dbe1eab55da9d0eab21785fcc1","src/util/wire.rs":"bfdf52615c516b6c07db3ce9c333ea61fdc535bd0b79560bbd7f6864ab83946e","test":"39d79ce3532c31a51c0be89a2939816fad0e4868d2b03992c202cbe64dce9f6c","tests/dfa/api.rs":"cc28e366b6bcbfcf379265acd492a92c62743c3f20e7a2b273019679aa9e1291","tests/dfa/mod.rs":"924d8fff500b9b7b140082623023e78007058a87323151cd8e361462945e4f16","tests/dfa/onepass/mod.rs":"d08f4ecb8ec243be584944c9602af1ed3a48a8732dd11cd573b0d1d182171303","tests/dfa/onepass/suite.rs":"6d63ec5469e6876656ae607cdbe07e6a4e17ace7836b67435763c9b1d233438a","tests/dfa/regression.rs":"ebcf2645290286aa7531eb2b7951385e5ed8167532437aeca2ad2049768fd796","tests/dfa/suite.rs":"cf08499bc8838d2ff16ea9b20b07ad03c9b89d6efe093f081e2982a21ea6d666","tests/fuzz/dense.rs":"3e1099a0cce61e85abc0ad81bc592e85f497f159ef0e5d1d32bac1936aa6f20c","tests/fuzz/mod.rs":"043773510e02f51def43ee0c2b8b867c53ecc8638c8a9233b2ac098de9c3ac1e","tests/fuzz/sparse.rs":"ba61db4927ab28953037a4b20317399c86d01b4d774e46c020ade19029215e25","tests/fuzz/testdata/deserialize_dense_crash-9486fb7c8a93b12c12a62166b43d31640c0208a9":"8961279a8237c3e318452024dd971b1d5a26b058260c297382a74daca1b7f0d1","tests/fuzz/testdata/deserialize_dense_minimized-from-9486fb7c8a93b12c12a62166b43d31640c0208a9":"c2d52e3dea78d3f159b5b521d433358a7fee45ce20ed1545067d461f45ef66b8","tests/fuzz/testdata/deserialize_sparse_crash-0da59c0434eaf35e5a6b470fa9244bb79c72b000":"5b2d273023de3fb04037eaf2e6b4f51cced4c5a08d2e6b44e4be540774f939b9","tests/fuzz/testdata/deserialize_sparse_crash-18cfc246f2ddfc3dfc92b0c7893178c7cf65efa9":"e2e22e2f46a9a75b5c876476442276cf675fe244c5cf918789e4f6b14078fbd9","tests/fuzz/testdata/deserialize_sparse_crash-61fd8e3003bf9d99f6c1e5a8488727eefd234b98":"24a12712e1f2ba0a40b5782707908a74dd19941dc372ef525d65a7134f91988c","tests/fuzz/testdata/deserialize_sparse_crash-a1b839d899ced76d5d7d0f78f9edb7a421505838":"a97f39b2febf9c73535681f7a86201e4b06d5a1ffcf135299c96c1cabfa9f6c4","tests/fuzz/testdata/deserialize_sparse_crash-c383ae07ec5e191422eadc492117439011816570":"44fe3ef878d35e2d51c2c17ff89bbbe3a4650e09d0cbbd48625c0f5e4dd0848b","tests/fuzz/testdata/deserialize_sparse_crash-d07703ceb94b10dcd9e4acb809f2051420449e2b":"d5534be36653b4af6cb94a7c63be58869bb8c204c5c63d67a4d6c986b44bb2e1","tests/fuzz/testdata/deserialize_sparse_crash-dbb8172d3984e7e7d03f4b5f8bb86ecd1460eff9":"77b844898610560afa09f2b8de73a85a0ba9a3b8cee4ff1bbf26b8c97ad4e8a2","tests/gen/README.md":"c3bfdf2f9ced501dd5bd75d01509a34e503efb2dff2f5f7b260580dde5519ed4","tests/gen/dense/mod.rs":"5ae1cfb46212a674118ada2f66f37b25188e84643d406b95eb4665d722344262","tests/gen/dense/multi_pattern_v2.rs":"29b1e9a799adecbdbe7cd05e9748f664c2b915b10b1d2f5d36cfb6453826d1d2","tests/gen/dense/multi_pattern_v2_fwd.bigendian.dfa":"8421d5a1bfc0b6c3bdc8fc90dff591a046b0aaf8e06ef7de7cc293004a35d061","tests/gen/dense/multi_pattern_v2_fwd.littleendian.dfa":"dcf2fd5fd49f5f53cf1ec66f61623402f39401cb3aea30d6677b98bb1e9541bf","tests/gen/dense/multi_pattern_v2_rev.bigendian.dfa":"73c4f20d984e544dfa4cf05f3009d0a9b52fa84bc97b501ea0ccd179e2def4bc","tests/gen/dense/multi_pattern_v2_rev.littleendian.dfa":"74471209f05754e8e20c8a0222a5877b1b15b8b8f33cd8cac89ea65f708b4aff","tests/gen/mod.rs":"043773510e02f51def43ee0c2b8b867c53ecc8638c8a9233b2ac098de9c3ac1e","tests/gen/sparse/mod.rs":"5ae1cfb46212a674118ada2f66f37b25188e84643d406b95eb4665d722344262","tests/gen/sparse/multi_pattern_v2.rs":"e00fb2a510a215460aab84573196b1f51bb65884ff494c2382534c04f6fdbfe9","tests/gen/sparse/multi_pattern_v2_fwd.bigendian.dfa":"3287956bd2003cd69653b125f82aade95d99adbb20229bfdbb4958b8877c0a0b","tests/gen/sparse/multi_pattern_v2_fwd.littleendian.dfa":"bdf285901eaaac4596380115c5bbb20ab2f42f593d8d9e9238a00ed69863f9c9","tests/gen/sparse/multi_pattern_v2_rev.bigendian.dfa":"e466dc085dd68b2d2220932a0e4d28759edd161c1fdad652240aa3825fd85268","tests/gen/sparse/multi_pattern_v2_rev.littleendian.dfa":"80358d0c26c1cc7284065b0075f5b8804d83e673a8a8c8327f93a1c1ff455399","tests/hybrid/api.rs":"4b8592c412e6ad0ce4a27ed1c1496acc92366ccb1c7ec23c6fd0596fc6ebbdfb","tests/hybrid/mod.rs":"4856a49a4d9b5e9e079c2719a5e75c32408b37e9b76cbdea057b388a3537af6d","tests/hybrid/suite.rs":"688972275c5ef38cdc5112a1e6e54ccd2bf8290008ae2b17344c6c81e17e3a5a","tests/lib.rs":"5e8a014d53097dba1f865e5e35c35a69cd12f54fad74b5c49a387f8768c30847","tests/meta/mod.rs":"d08f4ecb8ec243be584944c9602af1ed3a48a8732dd11cd573b0d1d182171303","tests/meta/suite.rs":"4c441f9df82508a5e60dd08f266183f772fc9b2b236fbf69cab87650ecf3b424","tests/nfa/mod.rs":"49055c358e38d97e42acb1602c671f97dddf24cafe089490f0e79ed208d74d9b","tests/nfa/thompson/backtrack/mod.rs":"d08f4ecb8ec243be584944c9602af1ed3a48a8732dd11cd573b0d1d182171303","tests/nfa/thompson/backtrack/suite.rs":"4e7baff70fc98b98b8297c6fd6d5818beb20343379e16cdb95bee46207ac4bd6","tests/nfa/thompson/mod.rs":"de9f5bcea1a8d1f03c85c55ad8c0747877d69e344fcd6c6886b0a402f0661291","tests/nfa/thompson/pikevm/mod.rs":"d08f4ecb8ec243be584944c9602af1ed3a48a8732dd11cd573b0d1d182171303","tests/nfa/thompson/pikevm/suite.rs":"263837ebf5b2e1906a06237982ea875386d83567e399b4ec1f669f10b1422599"},"package":"fed1ceff11a1dddaee50c9dc8e4938bd106e9d89ae372f192311e7da498e3b69"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/regex-automata/Cargo.toml temporalio-1.3.0/vendor/regex-automata/Cargo.toml --- temporalio-1.3.0/vendor/regex-automata/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/regex-automata/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -11,9 +11,8 @@ [package] edition = "2021" -rust-version = "1.65" name = "regex-automata" -version = "0.4.3" +version = "0.3.6" authors = [ "The Rust Project Developers", "Andrew Gallant ", @@ -50,12 +49,12 @@ optional = true [dependencies.memchr] -version = "2.6.0" +version = "2.5.0" optional = true default-features = false [dependencies.regex-syntax] -version = "0.8.2" +version = "0.7.4" optional = true default-features = false @@ -121,7 +120,6 @@ logging = [ "dep:log", "aho-corasick?/logging", - "memchr?/logging", ] meta = [ "syntax", diff -Nru temporalio-1.3.0/vendor/regex-automata/src/dfa/accel.rs temporalio-1.3.0/vendor/regex-automata/src/dfa/accel.rs --- temporalio-1.3.0/vendor/regex-automata/src/dfa/accel.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/regex-automata/src/dfa/accel.rs 2023-10-30 19:40:00.000000000 +0000 @@ -6,16 +6,15 @@ // non-Unicode regexes. For example, consider '(?-u)[^a]+a'. We can look at its // DFA with regex-cli: // -// $ regex-cli debug dense dfa -p '(?-u)[^a]+a' -BbC --no-table +// $ regex-cli debug dfa dense '(?-u)[^a]+a' -BbC +// dense::DFA( // D 000000: // Q 000001: // *000002: -// A 000003: \x00-` => 3, a => 8, b-\xFF => 3 -// A 000004: \x00-` => 4, a => 7, b-\xFF => 4 -// 000005: \x00-` => 4, b-\xFF => 4 -// 000006: \x00-` => 3, a => 6, b-\xFF => 3 -// 000007: \x00-\xFF => 2, EOI => 2 -// 000008: \x00-\xFF => 2, EOI => 2 +// A 000003: \x00-` => 3, a => 5, b-\xFF => 3 +// >000004: \x00-` => 3, a => 4, b-\xFF => 3 +// 000005: \x00-\xFF => 2, EOI => 2 +// ) // // In particular, state 3 is accelerated (shown via the 'A' indicator) since // the only way to leave that state once entered is to see an 'a' byte. If diff -Nru temporalio-1.3.0/vendor/regex-automata/src/dfa/automaton.rs temporalio-1.3.0/vendor/regex-automata/src/dfa/automaton.rs --- temporalio-1.3.0/vendor/regex-automata/src/dfa/automaton.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/regex-automata/src/dfa/automaton.rs 2023-10-30 19:40:00.000000000 +0000 @@ -7,7 +7,6 @@ prefilter::Prefilter, primitives::{PatternID, StateID}, search::{Anchored, HalfMatch, Input, MatchError}, - start, }, }; @@ -227,8 +226,8 @@ /// ``` fn next_eoi_state(&self, current: StateID) -> StateID; - /// Return the ID of the start state for this DFA for the given starting - /// configuration. + /// Return the ID of the start state for this lazy DFA when executing a + /// forward search. /// /// Unlike typical DFA implementations, the start state for DFAs in this /// crate is dependent on a few different factors: @@ -236,41 +235,12 @@ /// * The [`Anchored`] mode of the search. Unanchored, anchored and /// anchored searches for a specific [`PatternID`] all use different start /// states. - /// * Whether a "look-behind" byte exists. For example, the `^` anchor - /// matches if and only if there is no look-behind byte. - /// * The specific value of that look-behind byte. For example, a `(?m:^)` - /// assertion only matches when there is either no look-behind byte, or - /// when the look-behind byte is a line terminator. - /// - /// The [starting configuration](start::Config) provides the above - /// information. - /// - /// This routine can be used for either forward or reverse searches. - /// Although, as a convenience, if you have an [`Input`], then it may - /// be more succinct to use [`Automaton::start_state_forward`] or - /// [`Automaton::start_state_reverse`]. Note, for example, that the - /// convenience routines return a [`MatchError`] on failure where as this - /// routine returns a [`StartError`]. - /// - /// # Errors - /// - /// This may return a [`StartError`] if the search needs to give up when - /// determining the start state (for example, if it sees a "quit" byte). - /// This can also return an error if the given configuration contains an - /// unsupported [`Anchored`] configuration. - fn start_state( - &self, - config: &start::Config, - ) -> Result; - - /// Return the ID of the start state for this DFA when executing a forward - /// search. - /// - /// This is a convenience routine for calling [`Automaton::start_state`] - /// that converts the given [`Input`] to a [start - /// configuration](start::Config). Additionally, if an error occurs, it is - /// converted from a [`StartError`] to a [`MatchError`] using the offset - /// information in the given [`Input`]. + /// * The position at which the search begins, via [`Input::start`]. This + /// and the byte immediately preceding the start of the search (if one + /// exists) influence which look-behind assertions are true at the start + /// of the search. This in turn influences which start state is selected. + /// * Whether the search is a forward or reverse search. This routine can + /// only be used for forward searches. /// /// # Errors /// @@ -281,30 +251,23 @@ fn start_state_forward( &self, input: &Input<'_>, - ) -> Result { - let config = start::Config::from_input_forward(input); - self.start_state(&config).map_err(|err| match err { - StartError::Quit { byte } => { - let offset = input - .start() - .checked_sub(1) - .expect("no quit in start without look-behind"); - MatchError::quit(byte, offset) - } - StartError::UnsupportedAnchored { mode } => { - MatchError::unsupported_anchored(mode) - } - }) - } + ) -> Result; - /// Return the ID of the start state for this DFA when executing a reverse - /// search. + /// Return the ID of the start state for this lazy DFA when executing a + /// reverse search. /// - /// This is a convenience routine for calling [`Automaton::start_state`] - /// that converts the given [`Input`] to a [start - /// configuration](start::Config). Additionally, if an error occurs, it is - /// converted from a [`StartError`] to a [`MatchError`] using the offset - /// information in the given [`Input`]. + /// Unlike typical DFA implementations, the start state for DFAs in this + /// crate is dependent on a few different factors: + /// + /// * The [`Anchored`] mode of the search. Unanchored, anchored and + /// anchored searches for a specific [`PatternID`] all use different start + /// states. + /// * The position at which the search begins, via [`Input::start`]. This + /// and the byte immediately preceding the start of the search (if one + /// exists) influence which look-behind assertions are true at the start + /// of the search. This in turn influences which start state is selected. + /// * Whether the search is a forward or reverse search. This routine can + /// only be used for reverse searches. /// /// # Errors /// @@ -315,18 +278,7 @@ fn start_state_reverse( &self, input: &Input<'_>, - ) -> Result { - let config = start::Config::from_input_reverse(input); - self.start_state(&config).map_err(|err| match err { - StartError::Quit { byte } => { - let offset = input.end(); - MatchError::quit(byte, offset) - } - StartError::UnsupportedAnchored { mode } => { - MatchError::unsupported_anchored(mode) - } - }) - } + ) -> Result; /// If this DFA has a universal starting state for the given anchor mode /// and the DFA supports universal starting states, then this returns that @@ -1132,7 +1084,7 @@ /// // implementation defined. /// // /// // N.B. We get '3' by inspecting the state machine using 'regex-cli'. - /// // e.g., try `regex-cli debug dense dfa -p '[^abc]+a' -BbUC`. + /// // e.g., try `regex-cli debug dfa dense '[^abc]+a' -BbUC`. /// let id = StateID::new(3 * dfa.stride()).unwrap(); /// let accelerator = dfa.accelerator(id); /// // The `[^abc]+` sub-expression permits [a, b, c] to be accelerated. @@ -1847,14 +1799,6 @@ } #[inline] - fn start_state( - &self, - config: &start::Config, - ) -> Result { - (**self).start_state(config) - } - - #[inline] fn start_state_forward( &self, input: &Input<'_>, @@ -2071,90 +2015,6 @@ } } -/// An error that can occur when computing the start state for a search. -/// -/// Computing a start state can fail for a few reasons, either based on -/// incorrect configuration or even based on whether the look-behind byte -/// triggers a quit state. Typically one does not need to handle this error -/// if you're using [`Automaton::start_state_forward`] (or its reverse -/// counterpart), as that routine automatically converts `StartError` to a -/// [`MatchError`] for you. -/// -/// This error may be returned by the [`Automaton::start_state`] routine. -/// -/// This error implements the `std::error::Error` trait when the `std` feature -/// is enabled. -/// -/// This error is marked as non-exhaustive. New variants may be added in a -/// semver compatible release. -#[non_exhaustive] -#[derive(Clone, Debug)] -pub enum StartError { - /// An error that occurs when a starting configuration's look-behind byte - /// is in this DFA's quit set. - Quit { - /// The quit byte that was found. - byte: u8, - }, - /// An error that occurs when the caller requests an anchored mode that - /// isn't supported by the DFA. - UnsupportedAnchored { - /// The anchored mode given that is unsupported. - mode: Anchored, - }, -} - -impl StartError { - pub(crate) fn quit(byte: u8) -> StartError { - StartError::Quit { byte } - } - - pub(crate) fn unsupported_anchored(mode: Anchored) -> StartError { - StartError::UnsupportedAnchored { mode } - } -} - -#[cfg(feature = "std")] -impl std::error::Error for StartError {} - -impl core::fmt::Display for StartError { - fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { - match *self { - StartError::Quit { byte } => write!( - f, - "error computing start state because the look-behind byte \ - {:?} triggered a quit state", - crate::util::escape::DebugByte(byte), - ), - StartError::UnsupportedAnchored { mode: Anchored::Yes } => { - write!( - f, - "error computing start state because \ - anchored searches are not supported or enabled" - ) - } - StartError::UnsupportedAnchored { mode: Anchored::No } => { - write!( - f, - "error computing start state because \ - unanchored searches are not supported or enabled" - ) - } - StartError::UnsupportedAnchored { - mode: Anchored::Pattern(pid), - } => { - write!( - f, - "error computing start state because \ - anchored searches for a specific pattern ({}) \ - are not supported or enabled", - pid.as_usize(), - ) - } - } - } -} - /// Runs the given overlapping `search` function (forwards or backwards) until /// a match is found whose offset does not split a codepoint. /// diff -Nru temporalio-1.3.0/vendor/regex-automata/src/dfa/dense.rs temporalio-1.3.0/vendor/regex-automata/src/dfa/dense.rs --- temporalio-1.3.0/vendor/regex-automata/src/dfa/dense.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/regex-automata/src/dfa/dense.rs 2023-10-30 19:40:00.000000000 +0000 @@ -30,7 +30,7 @@ use crate::{ dfa::{ accel::Accels, - automaton::{fmt_state_indicator, Automaton, StartError}, + automaton::{fmt_state_indicator, Automaton}, special::Special, start::StartKind, DEAD, @@ -40,8 +40,8 @@ int::{Pointer, Usize}, prefilter::Prefilter, primitives::{PatternID, StateID}, - search::Anchored, - start::{self, Start, StartByteMap}, + search::{Anchored, Input, MatchError}, + start::{Start, StartByteMap}, wire::{self, DeserializeError, Endian, SerializeError}, }, }; @@ -66,9 +66,8 @@ /// /// The default configuration guarantees that a search will never return /// a "quit" error, although it is possible for a search to fail if -/// [`Config::starts_for_each_pattern`] wasn't enabled (which it is -/// not by default) and an [`Anchored::Pattern`] mode is requested via -/// [`Input`](crate::Input). +/// [`Config::starts_for_each_pattern`] wasn't enabled (which it is not by +/// default) and an [`Anchored::Pattern`] mode is requested via [`Input`]. #[cfg(feature = "dfa-build")] #[derive(Clone, Debug, Default)] pub struct Config { @@ -114,7 +113,8 @@ /// make searching slower than it otherwise would be if the transitions /// that leave accelerated states are traversed frequently. /// - /// See [`Automaton::accelerator`] for an example. + /// See [`Automaton::accelerator`](crate::dfa::Automaton::accelerator) for + /// an example. /// /// This is enabled by default. pub fn accelerate(mut self, yes: bool) -> Config { @@ -882,20 +882,20 @@ /// # if !cfg!(target_pointer_width = "64") { return Ok(()); } // see #1039 /// use regex_automata::{dfa::{dense, Automaton}, Input}; /// - /// // 700KB isn't enough! + /// // 600KB isn't enough! /// dense::Builder::new() /// .configure(dense::Config::new() - /// .determinize_size_limit(Some(700_000)) + /// .determinize_size_limit(Some(600_000)) /// ) /// .build(r"\w{20}") /// .unwrap_err(); /// - /// // ... but 800KB probably is! + /// // ... but 700KB probably is! /// // (Note that auxiliary storage sizes aren't necessarily stable between /// // releases.) /// let dfa = dense::Builder::new() /// .configure(dense::Config::new() - /// .determinize_size_limit(Some(800_000)) + /// .determinize_size_limit(Some(700_000)) /// ) /// .build(r"\w{20}")?; /// let haystack = "A".repeat(20).into_bytes(); @@ -1228,14 +1228,13 @@ } else { let mut set = nfa.byte_class_set().clone(); // It is important to distinguish any "quit" bytes from all other - // bytes. Otherwise, a non-quit byte may end up in the same - // class as a quit byte, and thus cause the DFA to stop when it - // shouldn't. + // bytes. Otherwise, a non-quit byte may end up in the same class + // as a quit byte, and thus cause the DFA stop when it shouldn't. // // Test case: // - // regex-cli find match dense --unicode-word-boundary \ - // -p '^#' -p '\b10\.55\.182\.100\b' -y @conn.json.1000x.log + // regex-cli find hybrid regex -w @conn.json.1000x.log \ + // '^#' '\b10\.55\.182\.100\b' if !quitset.is_empty() { set.add_set(&quitset); } @@ -2346,24 +2345,6 @@ dfa.accels.validate()?; // N.B. dfa.special doesn't have a way to do unchecked deserialization, // so it has already been validated. - for state in dfa.states() { - // If the state is an accel state, then it must have a non-empty - // accelerator. - if dfa.is_accel_state(state.id()) { - let index = dfa.accelerator_index(state.id()); - if index >= dfa.accels.len() { - return Err(DeserializeError::generic( - "found DFA state with invalid accelerator index", - )); - } - let needles = dfa.accels.needles(index); - if !(1 <= needles.len() && needles.len() <= 3) { - return Err(DeserializeError::generic( - "accelerator needles has invalid length", - )); - } - } - } Ok((dfa, nread)) } @@ -2904,33 +2885,31 @@ fn set_universal_starts(&mut self) { assert_eq!(6, Start::len(), "expected 6 start configurations"); - let start_id = |dfa: &mut OwnedDFA, - anchored: Anchored, - start: Start| { + let start_id = |dfa: &mut OwnedDFA, inp: &Input<'_>, start: Start| { // This OK because we only call 'start' under conditions // in which we know it will succeed. - dfa.st.start(anchored, start).expect("valid Input configuration") + dfa.st.start(inp, start).expect("valid Input configuration") }; if self.start_kind().has_unanchored() { - let anchor = Anchored::No; - let sid = start_id(self, anchor, Start::NonWordByte); - if sid == start_id(self, anchor, Start::WordByte) - && sid == start_id(self, anchor, Start::Text) - && sid == start_id(self, anchor, Start::LineLF) - && sid == start_id(self, anchor, Start::LineCR) - && sid == start_id(self, anchor, Start::CustomLineTerminator) + let inp = Input::new("").anchored(Anchored::No); + let sid = start_id(self, &inp, Start::NonWordByte); + if sid == start_id(self, &inp, Start::WordByte) + && sid == start_id(self, &inp, Start::Text) + && sid == start_id(self, &inp, Start::LineLF) + && sid == start_id(self, &inp, Start::LineCR) + && sid == start_id(self, &inp, Start::CustomLineTerminator) { self.st.universal_start_unanchored = Some(sid); } } if self.start_kind().has_anchored() { - let anchor = Anchored::Yes; - let sid = start_id(self, anchor, Start::NonWordByte); - if sid == start_id(self, anchor, Start::WordByte) - && sid == start_id(self, anchor, Start::Text) - && sid == start_id(self, anchor, Start::LineLF) - && sid == start_id(self, anchor, Start::LineCR) - && sid == start_id(self, anchor, Start::CustomLineTerminator) + let inp = Input::new("").anchored(Anchored::Yes); + let sid = start_id(self, &inp, Start::NonWordByte); + if sid == start_id(self, &inp, Start::WordByte) + && sid == start_id(self, &inp, Start::Text) + && sid == start_id(self, &inp, Start::LineLF) + && sid == start_id(self, &inp, Start::LineCR) + && sid == start_id(self, &inp, Start::CustomLineTerminator) { self.st.universal_start_anchored = Some(sid); } @@ -3237,21 +3216,35 @@ } #[cfg_attr(feature = "perf-inline", inline(always))] - fn start_state( + fn start_state_forward( &self, - config: &start::Config, - ) -> Result { - let anchored = config.get_anchored(); - let start = match config.get_look_behind() { - None => Start::Text, - Some(byte) => { - if !self.quitset.is_empty() && self.quitset.contains(byte) { - return Err(StartError::quit(byte)); - } - self.st.start_map.get(byte) + input: &Input<'_>, + ) -> Result { + if !self.quitset.is_empty() && input.start() > 0 { + let offset = input.start() - 1; + let byte = input.haystack()[offset]; + if self.quitset.contains(byte) { + return Err(MatchError::quit(byte, offset)); } - }; - self.st.start(anchored, start) + } + let start = self.st.start_map.fwd(&input); + self.st.start(input, start) + } + + #[cfg_attr(feature = "perf-inline", inline(always))] + fn start_state_reverse( + &self, + input: &Input<'_>, + ) -> Result { + if !self.quitset.is_empty() && input.end() < input.haystack().len() { + let offset = input.end(); + let byte = input.haystack()[offset]; + if self.quitset.contains(byte) { + return Err(MatchError::quit(byte, offset)); + } + } + let start = self.st.start_map.rev(&input); + self.st.start(input, start) } #[cfg_attr(feature = "perf-inline", inline(always))] @@ -4187,27 +4180,28 @@ #[cfg_attr(feature = "perf-inline", inline(always))] fn start( &self, - anchored: Anchored, + input: &Input<'_>, start: Start, - ) -> Result { + ) -> Result { let start_index = start.as_usize(); - let index = match anchored { + let mode = input.get_anchored(); + let index = match mode { Anchored::No => { if !self.kind.has_unanchored() { - return Err(StartError::unsupported_anchored(anchored)); + return Err(MatchError::unsupported_anchored(mode)); } start_index } Anchored::Yes => { if !self.kind.has_anchored() { - return Err(StartError::unsupported_anchored(anchored)); + return Err(MatchError::unsupported_anchored(mode)); } self.stride + start_index } Anchored::Pattern(pid) => { let len = match self.pattern_len { None => { - return Err(StartError::unsupported_anchored(anchored)) + return Err(MatchError::unsupported_anchored(mode)) } Some(len) => len, }; @@ -5092,8 +5086,6 @@ #[cfg(all(test, feature = "syntax", feature = "dfa-build"))] mod tests { - use crate::{Input, MatchError}; - use super::*; #[test] diff -Nru temporalio-1.3.0/vendor/regex-automata/src/dfa/mod.rs temporalio-1.3.0/vendor/regex-automata/src/dfa/mod.rs --- temporalio-1.3.0/vendor/regex-automata/src/dfa/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/regex-automata/src/dfa/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -320,7 +320,7 @@ #[cfg(feature = "dfa-search")] pub use crate::dfa::{ - automaton::{Automaton, OverlappingState, StartError}, + automaton::{Automaton, OverlappingState}, start::StartKind, }; diff -Nru temporalio-1.3.0/vendor/regex-automata/src/dfa/onepass.rs temporalio-1.3.0/vendor/regex-automata/src/dfa/onepass.rs --- temporalio-1.3.0/vendor/regex-automata/src/dfa/onepass.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/regex-automata/src/dfa/onepass.rs 2023-10-30 19:40:00.000000000 +0000 @@ -2581,11 +2581,10 @@ /// Represents a single transition in a one-pass DFA. /// -/// The high 21 bits corresponds to the state ID. The bit following corresponds -/// to the special "match wins" flag. The remaining low 42 bits corresponds to -/// the transition epsilons, which contains the slots that should be saved when -/// this transition is followed and the conditional epsilon transitions that -/// must be satisfied in order to follow this transition. +/// The high 24 bits corresponds to the state ID. The low 48 bits corresponds +/// to the transition epsilons, which contains the slots that should be saved +/// when this transition is followed and the conditional epsilon transitions +/// that must be satisfied in order to follow this transition. #[derive(Clone, Copy, Eq, PartialEq)] struct Transition(u64); @@ -2742,7 +2741,7 @@ fn set_epsilons(self, epsilons: Epsilons) -> PatternEpsilons { PatternEpsilons( (self.0 & PatternEpsilons::PATTERN_ID_MASK) - | (u64::from(epsilons.0) & PatternEpsilons::EPSILONS_MASK), + | u64::from(epsilons.0), ) } } @@ -2815,15 +2814,12 @@ /// Return the set of look-around assertions in these epsilon transitions. fn looks(self) -> LookSet { - LookSet { bits: (self.0 & Epsilons::LOOK_MASK).low_u32() } + LookSet { bits: (self.0 & Epsilons::LOOK_MASK).low_u16() } } /// Set the look-around assertions on these epsilon transitions. fn set_looks(self, look_set: LookSet) -> Epsilons { - Epsilons( - (self.0 & Epsilons::SLOT_MASK) - | (u64::from(look_set.bits) & Epsilons::LOOK_MASK), - ) + Epsilons((self.0 & Epsilons::SLOT_MASK) | u64::from(look_set.bits)) } } diff -Nru temporalio-1.3.0/vendor/regex-automata/src/dfa/regex.rs temporalio-1.3.0/vendor/regex-automata/src/dfa/regex.rs --- temporalio-1.3.0/vendor/regex-automata/src/dfa/regex.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/regex-automata/src/dfa/regex.rs 2023-10-30 19:40:00.000000000 +0000 @@ -853,7 +853,7 @@ } /// Set the dense DFA compilation configuration for this builder using - /// [`dense::Config`]. + /// [`dense::Config`](dense::Config). /// /// This permits setting things like whether the underlying DFAs should /// be minimized. diff -Nru temporalio-1.3.0/vendor/regex-automata/src/dfa/search.rs temporalio-1.3.0/vendor/regex-automata/src/dfa/search.rs --- temporalio-1.3.0/vendor/regex-automata/src/dfa/search.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/regex-automata/src/dfa/search.rs 2023-10-30 19:40:00.000000000 +0000 @@ -176,6 +176,7 @@ // It's important that this is a debug_assert, since this can // actually be tripped even if DFA::from_bytes succeeds and // returns a supposedly valid DFA. + debug_assert!(dfa.is_quit_state(sid)); return Err(MatchError::quit(input.haystack()[at], at)); } } @@ -296,6 +297,7 @@ } else if dfa.is_dead_state(sid) { return Ok(mat); } else { + debug_assert!(dfa.is_quit_state(sid)); return Err(MatchError::quit(input.haystack()[at], at)); } } @@ -420,6 +422,7 @@ } else if dfa.is_dead_state(sid) { return Ok(()); } else { + debug_assert!(dfa.is_quit_state(sid)); return Err(MatchError::quit( input.haystack()[state.at], state.at, @@ -523,6 +526,7 @@ } else if dfa.is_dead_state(sid) { return Ok(()); } else { + debug_assert!(dfa.is_quit_state(sid)); return Err(MatchError::quit( input.haystack()[state.at], state.at, @@ -596,6 +600,9 @@ let pattern = dfa.match_pattern(*sid, 0); *mat = Some(HalfMatch::new(pattern, input.haystack().len())); } + // N.B. We don't have to check 'is_quit' here because the EOI + // transition can never lead to a quit state. + debug_assert!(!dfa.is_quit_state(*sid)); } } Ok(()) @@ -624,6 +631,9 @@ let pattern = dfa.match_pattern(*sid, 0); *mat = Some(HalfMatch::new(pattern, 0)); } + // N.B. We don't have to check 'is_quit' here because the EOI + // transition can never lead to a quit state. + debug_assert!(!dfa.is_quit_state(*sid)); } Ok(()) } diff -Nru temporalio-1.3.0/vendor/regex-automata/src/dfa/sparse.rs temporalio-1.3.0/vendor/regex-automata/src/dfa/sparse.rs --- temporalio-1.3.0/vendor/regex-automata/src/dfa/sparse.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/regex-automata/src/dfa/sparse.rs 2023-10-30 19:40:00.000000000 +0000 @@ -3,12 +3,13 @@ This module is the home of [`sparse::DFA`](DFA). -Unlike the [`dense`] module, this module does not contain a builder or -configuration specific for sparse DFAs. Instead, the intended way to build a -sparse DFA is either by using a default configuration with its constructor -[`sparse::DFA::new`](DFA::new), or by first configuring the construction of a -dense DFA with [`dense::Builder`] and then calling [`dense::DFA::to_sparse`]. -For example, this configures a sparse DFA to do an overlapping search: +Unlike the [`dense`](super::dense) module, this module does not contain a +builder or configuration specific for sparse DFAs. Instead, the intended +way to build a sparse DFA is either by using a default configuration with +its constructor [`sparse::DFA::new`](DFA::new), or by first configuring the +construction of a dense DFA with [`dense::Builder`](super::dense::Builder) +and then calling [`dense::DFA::to_sparse`](super::dense::DFA::to_sparse). For +example, this configures a sparse DFA to do an overlapping search: ``` use regex_automata::{ @@ -51,7 +52,7 @@ use crate::dfa::dense::{self, BuildError}; use crate::{ dfa::{ - automaton::{fmt_state_indicator, Automaton, StartError}, + automaton::{fmt_state_indicator, Automaton}, dense::Flags, special::Special, StartKind, DEAD, @@ -62,8 +63,8 @@ int::{Pointer, Usize, U16, U32}, prefilter::Prefilter, primitives::{PatternID, StateID}, - search::Anchored, - start::{self, Start, StartByteMap}, + search::{Anchored, Input, MatchError}, + start::{Start, StartByteMap}, wire::{self, DeserializeError, Endian, SerializeError}, }, }; @@ -73,17 +74,18 @@ /// A sparse deterministic finite automaton (DFA) with variable sized states. /// -/// In contrast to a [dense::DFA], a sparse DFA uses a more space efficient -/// representation for its transitions. Consequently, sparse DFAs may use much -/// less memory than dense DFAs, but this comes at a price. In particular, -/// reading the more space efficient transitions takes more work, and -/// consequently, searching using a sparse DFA is typically slower than a dense -/// DFA. +/// In contrast to a [dense::DFA](crate::dfa::dense::DFA), a sparse DFA uses +/// a more space efficient representation for its transitions. Consequently, +/// sparse DFAs may use much less memory than dense DFAs, but this comes at a +/// price. In particular, reading the more space efficient transitions takes +/// more work, and consequently, searching using a sparse DFA is typically +/// slower than a dense DFA. /// /// A sparse DFA can be built using the default configuration via the -/// [`DFA::new`] constructor. Otherwise, one can configure various aspects of a -/// dense DFA via [`dense::Builder`], and then convert a dense DFA to a sparse -/// DFA using [`dense::DFA::to_sparse`]. +/// [`DFA::new`] constructor. Otherwise, one can configure various aspects +/// of a dense DFA via [`dense::Builder`](crate::dfa::dense::Builder), +/// and then convert a dense DFA to a sparse DFA using +/// [`dense::DFA::to_sparse`](crate::dfa::dense::DFA::to_sparse). /// /// In general, a sparse DFA supports all the same search operations as a dense /// DFA. @@ -138,9 +140,11 @@ /// Parse the given regular expression using a default configuration and /// return the corresponding sparse DFA. /// - /// If you want a non-default configuration, then use the - /// [`dense::Builder`] to set your own configuration, and then call - /// [`dense::DFA::to_sparse`] to create a sparse DFA. + /// If you want a non-default configuration, then use + /// the [`dense::Builder`](crate::dfa::dense::Builder) + /// to set your own configuration, and then call + /// [`dense::DFA::to_sparse`](crate::dfa::dense::DFA::to_sparse) to create + /// a sparse DFA. /// /// # Example /// @@ -163,9 +167,11 @@ /// Parse the given regular expressions using a default configuration and /// return the corresponding multi-DFA. /// - /// If you want a non-default configuration, then use the - /// [`dense::Builder`] to set your own configuration, and then call - /// [`dense::DFA::to_sparse`] to create a sparse DFA. + /// If you want a non-default configuration, then use + /// the [`dense::Builder`](crate::dfa::dense::Builder) + /// to set your own configuration, and then call + /// [`dense::DFA::to_sparse`](crate::dfa::dense::DFA::to_sparse) to create + /// a sparse DFA. /// /// # Example /// @@ -505,9 +511,10 @@ /// * [`DFA::from_bytes`] /// * [`DFA::from_bytes_unchecked`] /// - /// Note that unlike a [`dense::DFA`]'s serialization methods, this does - /// not add any initial padding to the returned bytes. Padding isn't - /// required for sparse DFAs since they have no alignment requirements. + /// Note that unlike a [`dense::DFA`](crate::dfa::dense::DFA)'s + /// serialization methods, this does not add any initial padding to the + /// returned bytes. Padding isn't required for sparse DFAs since they have + /// no alignment requirements. /// /// # Example /// @@ -546,9 +553,10 @@ /// * [`DFA::from_bytes`] /// * [`DFA::from_bytes_unchecked`] /// - /// Note that unlike a [`dense::DFA`]'s serialization methods, this does - /// not add any initial padding to the returned bytes. Padding isn't - /// required for sparse DFAs since they have no alignment requirements. + /// Note that unlike a [`dense::DFA`](crate::dfa::dense::DFA)'s + /// serialization methods, this does not add any initial padding to the + /// returned bytes. Padding isn't required for sparse DFAs since they have + /// no alignment requirements. /// /// # Example /// @@ -587,9 +595,10 @@ /// * [`DFA::from_bytes`] /// * [`DFA::from_bytes_unchecked`] /// - /// Note that unlike a [`dense::DFA`]'s serialization methods, this does - /// not add any initial padding to the returned bytes. Padding isn't - /// required for sparse DFAs since they have no alignment requirements. + /// Note that unlike a [`dense::DFA`](crate::dfa::dense::DFA)'s + /// serialization methods, this does not add any initial padding to the + /// returned bytes. Padding isn't required for sparse DFAs since they have + /// no alignment requirements. /// /// Generally speaking, native endian format should only be used when /// you know that the target you're compiling the DFA for matches the @@ -894,9 +903,9 @@ /// /// If any of the above are not true, then an error will be returned. /// - /// Note that unlike deserializing a [`dense::DFA`], deserializing a sparse - /// DFA has no alignment requirements. That is, an alignment of `1` is - /// valid. + /// Note that unlike deserializing a + /// [`dense::DFA`](crate::dfa::dense::DFA), deserializing a sparse DFA has + /// no alignment requirements. That is, an alignment of `1` is valid. /// /// # Panics /// @@ -992,8 +1001,8 @@ // (by trying to decode every state) and start state ID list below. If // either validation fails, then we return an error. let (dfa, nread) = unsafe { DFA::from_bytes_unchecked(slice)? }; - let seen = dfa.tt.validate(&dfa.special)?; - dfa.st.validate(&dfa.special, &seen)?; + dfa.tt.validate(&dfa.special)?; + dfa.st.validate(&dfa.special, &dfa.tt)?; // N.B. dfa.special doesn't have a way to do unchecked deserialization, // so it has already been validated. Ok((dfa, nread)) @@ -1198,21 +1207,35 @@ } #[inline] - fn start_state( + fn start_state_forward( &self, - config: &start::Config, - ) -> Result { - let anchored = config.get_anchored(); - let start = match config.get_look_behind() { - None => Start::Text, - Some(byte) => { - if !self.quitset.is_empty() && self.quitset.contains(byte) { - return Err(StartError::quit(byte)); - } - self.st.start_map.get(byte) + input: &Input<'_>, + ) -> Result { + if !self.quitset.is_empty() && input.start() > 0 { + let offset = input.start() - 1; + let byte = input.haystack()[offset]; + if self.quitset.contains(byte) { + return Err(MatchError::quit(byte, offset)); } - }; - self.st.start(anchored, start) + } + let start = self.st.start_map.fwd(&input); + self.st.start(input, start) + } + + #[inline] + fn start_state_reverse( + &self, + input: &Input<'_>, + ) -> Result { + if !self.quitset.is_empty() && input.end() < input.haystack().len() { + let offset = input.end(); + let byte = input.haystack()[offset]; + if self.quitset.contains(byte) { + return Err(MatchError::quit(byte, offset)); + } + } + let start = self.st.start_map.rev(&input); + self.st.start(input, start) } #[inline] @@ -1388,8 +1411,63 @@ /// /// That is, every state ID can be used to correctly index a state in this /// table. - fn validate(&self, sp: &Special) -> Result { - let mut verified = Seen::new(); + fn validate(&self, sp: &Special) -> Result<(), DeserializeError> { + // In order to validate everything, we not only need to make sure we + // can decode every state, but that every transition in every state + // points to a valid state. There are many duplicative transitions, so + // we record state IDs that we've verified so that we don't redo the + // decoding work. + // + // Except, when in no_std mode, we don't have dynamic memory allocation + // available to us, so we skip this optimization. It's not clear + // whether doing something more clever is worth it just yet. If you're + // profiling this code and need it to run faster, please file an issue. + // + // OK, so we also use this to record the set of valid state IDs. Since + // it is possible for a transition to point to an invalid state ID that + // still (somehow) deserializes to a valid state. So we need to make + // sure our transitions are limited to actually correct state IDs. + // The problem is, I'm not sure how to do this verification step in + // no-std no-alloc mode. I think we'd *have* to store the set of valid + // state IDs in the DFA itself. For now, we don't do this verification + // in no-std no-alloc mode. The worst thing that can happen is an + // incorrect result. But no panics or memory safety problems should + // result. Because we still do validate that the state itself is + // "valid" in the sense that everything it points to actually exists. + // + // ---AG + struct Seen { + #[cfg(feature = "alloc")] + set: alloc::collections::BTreeSet, + #[cfg(not(feature = "alloc"))] + set: core::marker::PhantomData, + } + + #[cfg(feature = "alloc")] + impl Seen { + fn new() -> Seen { + Seen { set: alloc::collections::BTreeSet::new() } + } + fn insert(&mut self, id: StateID) { + self.set.insert(id); + } + fn contains(&self, id: &StateID) -> bool { + self.set.contains(id) + } + } + + #[cfg(not(feature = "alloc"))] + impl Seen { + fn new() -> Seen { + Seen { set: core::marker::PhantomData } + } + fn insert(&mut self, _id: StateID) {} + fn contains(&self, _id: &StateID) -> bool { + false + } + } + + let mut verified: Seen = Seen::new(); // We need to make sure that we decode the correct number of states. // Otherwise, an empty set of transitions would validate even if the // recorded state length is non-empty. @@ -1466,7 +1544,7 @@ "mismatching sparse state length", )); } - Ok(verified) + Ok(()) } /// Converts these transitions to a borrowed value. @@ -1604,7 +1682,7 @@ let state = &state[nr..]; if npats == 0 { return Err(DeserializeError::generic( - "state marked as a match, but pattern length is zero", + "state marked as a match, but has no pattern IDs", )); } @@ -1626,21 +1704,6 @@ } else { (&[][..], state) }; - if is_match && pattern_ids.is_empty() { - return Err(DeserializeError::generic( - "state marked as a match, but has no pattern IDs", - )); - } - if sp.is_match_state(id) && pattern_ids.is_empty() { - return Err(DeserializeError::generic( - "state marked special as a match, but has no pattern IDs", - )); - } - if sp.is_match_state(id) != is_match { - return Err(DeserializeError::generic( - "whether state is a match or not is inconsistent", - )); - } // Now read this state's accelerator info. The first byte is the length // of the accelerator, which is typically 0 (for no acceleration) but @@ -2021,19 +2084,28 @@ fn validate( &self, sp: &Special, - seen: &Seen, + trans: &Transitions, ) -> Result<(), DeserializeError> { for (id, _, _) in self.iter() { - if !seen.contains(&id) { - return Err(DeserializeError::generic( - "found invalid start state ID", - )); - } if sp.is_match_state(id) { return Err(DeserializeError::generic( "start states cannot be match states", )); } + // Confirm that the start state points to a valid state. + let state = trans.try_state(sp, id)?; + // And like for the transition table, confirm that the transitions + // on all start states themselves point to a valid state. + // + // It'd probably be better to integrate this validation with the + // transition table, or otherwise store a sorted sequence of all + // valid state IDs in the sparse DFA itself. That way, we could + // check that every pointer to a state corresponds precisely to a + // correct and valid state. + for i in 0..state.ntrans { + let to = state.next_at(i); + let _ = trans.try_state(sp, to)?; + } } Ok(()) } @@ -2073,27 +2145,28 @@ /// panics. fn start( &self, - anchored: Anchored, + input: &Input<'_>, start: Start, - ) -> Result { + ) -> Result { let start_index = start.as_usize(); - let index = match anchored { + let mode = input.get_anchored(); + let index = match mode { Anchored::No => { if !self.kind.has_unanchored() { - return Err(StartError::unsupported_anchored(anchored)); + return Err(MatchError::unsupported_anchored(mode)); } start_index } Anchored::Yes => { if !self.kind.has_anchored() { - return Err(StartError::unsupported_anchored(anchored)); + return Err(MatchError::unsupported_anchored(mode)); } self.stride + start_index } Anchored::Pattern(pid) => { let len = match self.pattern_len { None => { - return Err(StartError::unsupported_anchored(anchored)) + return Err(MatchError::unsupported_anchored(mode)) } Some(len) => len, }; @@ -2488,62 +2561,6 @@ } } -// In order to validate everything, we not only need to make sure we -// can decode every state, but that every transition in every state -// points to a valid state. There are many duplicative transitions, so -// we record state IDs that we've verified so that we don't redo the -// decoding work. -// -// Except, when in no_std mode, we don't have dynamic memory allocation -// available to us, so we skip this optimization. It's not clear -// whether doing something more clever is worth it just yet. If you're -// profiling this code and need it to run faster, please file an issue. -// -// OK, so we also use this to record the set of valid state IDs. Since -// it is possible for a transition to point to an invalid state ID that -// still (somehow) deserializes to a valid state. So we need to make -// sure our transitions are limited to actually correct state IDs. -// The problem is, I'm not sure how to do this verification step in -// no-std no-alloc mode. I think we'd *have* to store the set of valid -// state IDs in the DFA itself. For now, we don't do this verification -// in no-std no-alloc mode. The worst thing that can happen is an -// incorrect result. But no panics or memory safety problems should -// result. Because we still do validate that the state itself is -// "valid" in the sense that everything it points to actually exists. -// -// ---AG -#[derive(Debug)] -struct Seen { - #[cfg(feature = "alloc")] - set: alloc::collections::BTreeSet, - #[cfg(not(feature = "alloc"))] - set: core::marker::PhantomData, -} - -#[cfg(feature = "alloc")] -impl Seen { - fn new() -> Seen { - Seen { set: alloc::collections::BTreeSet::new() } - } - fn insert(&mut self, id: StateID) { - self.set.insert(id); - } - fn contains(&self, id: &StateID) -> bool { - self.set.contains(id) - } -} - -#[cfg(not(feature = "alloc"))] -impl Seen { - fn new() -> Seen { - Seen { set: core::marker::PhantomData } - } - fn insert(&mut self, _id: StateID) {} - fn contains(&self, _id: &StateID) -> bool { - true - } -} - /* /// A binary search routine specialized specifically to a sparse DFA state's /// transitions. Specifically, the transitions are defined as a set of pairs diff -Nru temporalio-1.3.0/vendor/regex-automata/src/hybrid/dfa.rs temporalio-1.3.0/vendor/regex-automata/src/hybrid/dfa.rs --- temporalio-1.3.0/vendor/regex-automata/src/hybrid/dfa.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/regex-automata/src/hybrid/dfa.rs 2023-10-30 19:40:00.000000000 +0000 @@ -13,7 +13,7 @@ use crate::{ hybrid::{ - error::{BuildError, CacheError, StartError}, + error::{BuildError, CacheError}, id::{LazyStateID, LazyStateIDError}, search, }, @@ -28,7 +28,7 @@ Anchored, HalfMatch, Input, MatchError, MatchKind, PatternSet, }, sparse_set::SparseSets, - start::{self, Start, StartByteMap}, + start::{Start, StartByteMap}, }, }; @@ -1518,8 +1518,8 @@ Lazy::new(self, cache).cache_next_state(current, unit) } - /// Return the ID of the start state for this lazy DFA for the given - /// starting configuration. + /// Return the ID of the start state for this lazy DFA when executing a + /// forward search. /// /// Unlike typical DFA implementations, the start state for DFAs in this /// crate is dependent on a few different factors: @@ -1527,122 +1527,85 @@ /// * The [`Anchored`] mode of the search. Unanchored, anchored and /// anchored searches for a specific [`PatternID`] all use different start /// states. - /// * Whether a "look-behind" byte exists. For example, the `^` anchor - /// matches if and only if there is no look-behind byte. - /// * The specific value of that look-behind byte. For example, a `(?m:^)` - /// assertion only matches when there is either no look-behind byte, or - /// when the look-behind byte is a line terminator. - /// - /// The [starting configuration](start::Config) provides the above - /// information. - /// - /// This routine can be used for either forward or reverse searches. - /// Although, as a convenience, if you have an [`Input`], then it - /// may be more succinct to use [`DFA::start_state_forward`] or - /// [`DFA::start_state_reverse`]. Note, for example, that the convenience - /// routines return a [`MatchError`] on failure where as this routine - /// returns a [`StartError`]. + /// * The position at which the search begins, via [`Input::start`]. This + /// and the byte immediately preceding the start of the search (if one + /// exists) influence which look-behind assertions are true at the start + /// of the search. This in turn influences which start state is selected. + /// * Whether the search is a forward or reverse search. This routine can + /// only be used for forward searches. /// /// # Errors /// - /// This may return a [`StartError`] if the search needs to give up when - /// determining the start state (for example, if it sees a "quit" byte - /// or if the cache has become inefficient). This can also return an - /// error if the given configuration contains an unsupported [`Anchored`] - /// configuration. - #[cfg_attr(feature = "perf-inline", inline(always))] - pub fn start_state( - &self, - cache: &mut Cache, - config: &start::Config, - ) -> Result { - let lazy = LazyRef::new(self, cache); - let anchored = config.get_anchored(); - let start = match config.get_look_behind() { - None => Start::Text, - Some(byte) => { - if !self.quitset.is_empty() && self.quitset.contains(byte) { - return Err(StartError::quit(byte)); - } - self.start_map.get(byte) - } - }; - let start_id = lazy.get_cached_start_id(anchored, start)?; - if !start_id.is_unknown() { - return Ok(start_id); - } - Lazy::new(self, cache).cache_start_group(anchored, start) - } - - /// Return the ID of the start state for this lazy DFA when executing a - /// forward search. - /// - /// This is a convenience routine for calling [`DFA::start_state`] that - /// converts the given [`Input`] to a [start configuration](start::Config). - /// Additionally, if an error occurs, it is converted from a [`StartError`] - /// to a [`MatchError`] using the offset information in the given - /// [`Input`]. - /// - /// # Errors - /// - /// This may return a [`MatchError`] if the search needs to give up when - /// determining the start state (for example, if it sees a "quit" byte or - /// if the cache has become inefficient). This can also return an error if - /// the given `Input` contains an unsupported [`Anchored`] configuration. + /// This may return a [`MatchError`] (not a [`CacheError`]!) if the search + /// needs to give up when determining the start state (for example, if + /// it sees a "quit" byte or if the cache has been cleared too many + /// times). This can also return an error if the given `Input` contains an + /// unsupported [`Anchored`] configuration. #[cfg_attr(feature = "perf-inline", inline(always))] pub fn start_state_forward( &self, cache: &mut Cache, input: &Input<'_>, ) -> Result { - let config = start::Config::from_input_forward(input); - self.start_state(cache, &config).map_err(|err| match err { - StartError::Cache { .. } => MatchError::gave_up(input.start()), - StartError::Quit { byte } => { - let offset = input - .start() - .checked_sub(1) - .expect("no quit in start without look-behind"); - MatchError::quit(byte, offset) + if !self.quitset.is_empty() && input.start() > 0 { + let offset = input.start() - 1; + let byte = input.haystack()[offset]; + if self.quitset.contains(byte) { + return Err(MatchError::quit(byte, offset)); } - StartError::UnsupportedAnchored { mode } => { - MatchError::unsupported_anchored(mode) - } - }) + } + let start_type = self.start_map.fwd(input); + let start = LazyRef::new(self, cache) + .get_cached_start_id(input, start_type)?; + if !start.is_unknown() { + return Ok(start); + } + Lazy::new(self, cache).cache_start_group(input, start_type) } /// Return the ID of the start state for this lazy DFA when executing a /// reverse search. /// - /// This is a convenience routine for calling [`DFA::start_state`] that - /// converts the given [`Input`] to a [start configuration](start::Config). - /// Additionally, if an error occurs, it is converted from a [`StartError`] - /// to a [`MatchError`] using the offset information in the given - /// [`Input`]. + /// Unlike typical DFA implementations, the start state for DFAs in this + /// crate is dependent on a few different factors: + /// + /// * The [`Anchored`] mode of the search. Unanchored, anchored and + /// anchored searches for a specific [`PatternID`] all use different start + /// states. + /// * The position at which the search begins, via [`Input::start`]. This + /// and the byte immediately preceding the start of the search (if one + /// exists) influence which look-behind assertions are true at the start + /// of the search. This in turn influences which start state is selected. + /// * Whether the search is a forward or reverse search. This routine can + /// only be used for reverse searches. /// /// # Errors /// - /// This may return a [`MatchError`] if the search needs to give up when - /// determining the start state (for example, if it sees a "quit" byte or - /// if the cache has become inefficient). This can also return an error if - /// the given `Input` contains an unsupported [`Anchored`] configuration. + /// This may return a [`MatchError`] (not a [`CacheError`]!) if the search + /// needs to give up when determining the start state (for example, if + /// it sees a "quit" byte or if the cache has been cleared too many + /// times). This can also return an error if the given `Input` contains an + /// unsupported [`Anchored`] configuration. #[cfg_attr(feature = "perf-inline", inline(always))] pub fn start_state_reverse( &self, cache: &mut Cache, input: &Input<'_>, ) -> Result { - let config = start::Config::from_input_reverse(input); - self.start_state(cache, &config).map_err(|err| match err { - StartError::Cache { .. } => MatchError::gave_up(input.end()), - StartError::Quit { byte } => { - let offset = input.end(); - MatchError::quit(byte, offset) - } - StartError::UnsupportedAnchored { mode } => { - MatchError::unsupported_anchored(mode) + if !self.quitset.is_empty() && input.end() < input.haystack().len() { + let offset = input.end(); + let byte = input.haystack()[offset]; + if self.quitset.contains(byte) { + return Err(MatchError::quit(byte, offset)); } - }) + } + let start_type = self.start_map.rev(input); + let start = LazyRef::new(self, cache) + .get_cached_start_id(input, start_type)?; + if !start.is_unknown() { + return Ok(start); + } + Lazy::new(self, cache).cache_start_group(input, start_type) } /// Returns the total number of patterns that match in this state. @@ -2103,10 +2066,8 @@ /// Here's an example that justifies 'inline(never)' /// /// ```ignore - /// regex-cli find match hybrid \ - /// --cache-capacity 100000000 \ - /// -p '\pL{100}' - /// all-codepoints-utf8-100x + /// regex-cli find hybrid dfa \ + /// @all-codepoints-utf8-100x '\pL{100}' --cache-capacity 10000000 /// ``` /// /// Where 'all-codepoints-utf8-100x' is the UTF-8 encoding of every @@ -2161,15 +2122,16 @@ #[inline(never)] fn cache_start_group( &mut self, - anchored: Anchored, + input: &Input<'_>, start: Start, - ) -> Result { - let nfa_start_id = match anchored { + ) -> Result { + let mode = input.get_anchored(); + let nfa_start_id = match mode { Anchored::No => self.dfa.get_nfa().start_unanchored(), Anchored::Yes => self.dfa.get_nfa().start_anchored(), Anchored::Pattern(pid) => { if !self.dfa.get_config().get_starts_for_each_pattern() { - return Err(StartError::unsupported_anchored(anchored)); + return Err(MatchError::unsupported_anchored(mode)); } match self.dfa.get_nfa().start_pattern(pid) { None => return Ok(self.as_ref().dead_id()), @@ -2180,8 +2142,8 @@ let id = self .cache_start_one(nfa_start_id, start) - .map_err(StartError::cache)?; - self.set_start_state(anchored, start, id); + .map_err(|_| MatchError::gave_up(input.start()))?; + self.set_start_state(input, start, id); Ok(id) } @@ -2612,13 +2574,13 @@ /// 'starts_for_each_pattern' is not enabled. fn set_start_state( &mut self, - anchored: Anchored, + input: &Input<'_>, start: Start, id: LazyStateID, ) { assert!(self.as_ref().is_valid(id)); let start_index = start.as_usize(); - let index = match anchored { + let index = match input.get_anchored() { Anchored::No => start_index, Anchored::Yes => Start::len() + start_index, Anchored::Pattern(pid) => { @@ -2680,16 +2642,17 @@ #[cfg_attr(feature = "perf-inline", inline(always))] fn get_cached_start_id( &self, - anchored: Anchored, + input: &Input<'_>, start: Start, - ) -> Result { + ) -> Result { let start_index = start.as_usize(); - let index = match anchored { + let mode = input.get_anchored(); + let index = match mode { Anchored::No => start_index, Anchored::Yes => Start::len() + start_index, Anchored::Pattern(pid) => { if !self.dfa.get_config().get_starts_for_each_pattern() { - return Err(StartError::unsupported_anchored(anchored)); + return Err(MatchError::unsupported_anchored(mode)); } if pid.as_usize() >= self.dfa.pattern_len() { return Ok(self.dead_id()); @@ -3215,12 +3178,12 @@ /// be quit bytes _only_ when a Unicode word boundary is present in the /// pattern. /// - /// When enabling this option, callers _must_ be prepared to - /// handle a [`MatchError`] error during search. When using a - /// [`Regex`](crate::hybrid::regex::Regex), this corresponds to using the - /// `try_` suite of methods. Alternatively, if callers can guarantee that - /// their input is ASCII only, then a [`MatchError::quit`] error will never - /// be returned while searching. + /// When enabling this option, callers _must_ be prepared to handle + /// a [`MatchError`](crate::MatchError) error during search. + /// When using a [`Regex`](crate::hybrid::regex::Regex), this + /// corresponds to using the `try_` suite of methods. Alternatively, + /// if callers can guarantee that their input is ASCII only, then a + /// [`MatchError::quit`] error will never be returned while searching. /// /// This is disabled by default. /// @@ -3306,8 +3269,8 @@ /// (The advantage being that non-ASCII quit bytes will only be added if a /// Unicode word boundary is in the pattern.) /// - /// When enabling this option, callers _must_ be prepared to - /// handle a [`MatchError`] error during search. When using a + /// When enabling this option, callers _must_ be prepared to handle a + /// [`MatchError`](crate::MatchError) error during search. When using a /// [`Regex`](crate::hybrid::regex::Regex), this corresponds to using the /// `try_` suite of methods. /// @@ -3832,8 +3795,8 @@ // // Test case: // - // regex-cli find match hybrid --unicode-word-boundary \ - // -p '^#' -p '\b10\.55\.182\.100\b' -y @conn.json.1000x.log + // regex-cli find hybrid regex -w @conn.json.1000x.log \ + // '^#' '\b10\.55\.182\.100\b' if !quit.is_empty() { set.add_set(&quit); } diff -Nru temporalio-1.3.0/vendor/regex-automata/src/hybrid/error.rs temporalio-1.3.0/vendor/regex-automata/src/hybrid/error.rs --- temporalio-1.3.0/vendor/regex-automata/src/hybrid/error.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/regex-automata/src/hybrid/error.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,4 +1,4 @@ -use crate::{hybrid::id::LazyStateIDError, nfa, util::search::Anchored}; +use crate::{hybrid::id::LazyStateIDError, nfa}; /// An error that occurs when initial construction of a lazy DFA fails. /// @@ -95,113 +95,6 @@ } } -/// An error that can occur when computing the start state for a search. -/// -/// Computing a start state can fail for a few reasons, either -/// based on incorrect configuration or even based on whether -/// the look-behind byte triggers a quit state. Typically -/// one does not need to handle this error if you're using -/// [`DFA::start_state_forward`](crate::hybrid::dfa::DFA::start_state_forward) -/// (or its reverse counterpart), as that routine automatically converts -/// `StartError` to a [`MatchError`](crate::MatchError) for you. -/// -/// This error may be returned by the -/// [`DFA::start_state`](crate::hybrid::dfa::DFA::start_state) routine. -/// -/// This error implements the `std::error::Error` trait when the `std` feature -/// is enabled. -/// -/// This error is marked as non-exhaustive. New variants may be added in a -/// semver compatible release. -#[non_exhaustive] -#[derive(Clone, Debug)] -pub enum StartError { - /// An error that occurs when cache inefficiency has dropped below the - /// configured heuristic thresholds. - Cache { - /// The underlying cache error that occurred. - err: CacheError, - }, - /// An error that occurs when a starting configuration's look-behind byte - /// is in this DFA's quit set. - Quit { - /// The quit byte that was found. - byte: u8, - }, - /// An error that occurs when the caller requests an anchored mode that - /// isn't supported by the DFA. - UnsupportedAnchored { - /// The anchored mode given that is unsupported. - mode: Anchored, - }, -} - -impl StartError { - pub(crate) fn cache(err: CacheError) -> StartError { - StartError::Cache { err } - } - - pub(crate) fn quit(byte: u8) -> StartError { - StartError::Quit { byte } - } - - pub(crate) fn unsupported_anchored(mode: Anchored) -> StartError { - StartError::UnsupportedAnchored { mode } - } -} - -#[cfg(feature = "std")] -impl std::error::Error for StartError { - fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { - match *self { - StartError::Cache { ref err } => Some(err), - _ => None, - } - } -} - -impl core::fmt::Display for StartError { - fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { - match *self { - StartError::Cache { .. } => write!( - f, - "error computing start state because of cache inefficiency" - ), - StartError::Quit { byte } => write!( - f, - "error computing start state because the look-behind byte \ - {:?} triggered a quit state", - crate::util::escape::DebugByte(byte), - ), - StartError::UnsupportedAnchored { mode: Anchored::Yes } => { - write!( - f, - "error computing start state because \ - anchored searches are not supported or enabled" - ) - } - StartError::UnsupportedAnchored { mode: Anchored::No } => { - write!( - f, - "error computing start state because \ - unanchored searches are not supported or enabled" - ) - } - StartError::UnsupportedAnchored { - mode: Anchored::Pattern(pid), - } => { - write!( - f, - "error computing start state because \ - anchored searches for a specific pattern ({}) \ - are not supported or enabled", - pid.as_usize(), - ) - } - } - } -} - /// An error that occurs when cache usage has become inefficient. /// /// One of the weaknesses of a lazy DFA is that it may need to clear its @@ -233,7 +126,11 @@ } #[cfg(feature = "std")] -impl std::error::Error for CacheError {} +impl std::error::Error for CacheError { + fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { + None + } +} impl core::fmt::Display for CacheError { fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { diff -Nru temporalio-1.3.0/vendor/regex-automata/src/hybrid/mod.rs temporalio-1.3.0/vendor/regex-automata/src/hybrid/mod.rs --- temporalio-1.3.0/vendor/regex-automata/src/hybrid/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/regex-automata/src/hybrid/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -133,7 +133,7 @@ */ pub use self::{ - error::{BuildError, CacheError, StartError}, + error::{BuildError, CacheError}, id::LazyStateID, }; diff -Nru temporalio-1.3.0/vendor/regex-automata/src/hybrid/regex.rs temporalio-1.3.0/vendor/regex-automata/src/hybrid/regex.rs --- temporalio-1.3.0/vendor/regex-automata/src/hybrid/regex.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/regex-automata/src/hybrid/regex.rs 2023-10-30 19:40:00.000000000 +0000 @@ -878,7 +878,7 @@ } /// Set the lazy DFA compilation configuration for this builder using - /// [`dfa::Config`]. + /// [`dfa::Config`](dfa::Config). /// /// This permits setting things like whether Unicode word boundaries should /// be heuristically supported or settings how the behavior of the cache. diff -Nru temporalio-1.3.0/vendor/regex-automata/src/hybrid/search.rs temporalio-1.3.0/vendor/regex-automata/src/hybrid/search.rs --- temporalio-1.3.0/vendor/regex-automata/src/hybrid/search.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/regex-automata/src/hybrid/search.rs 2023-10-30 19:40:00.000000000 +0000 @@ -105,14 +105,14 @@ // PERF: For justification of omitting bounds checks, it gives us a // ~10% bump in search time. This was used for a benchmark: // - // regex-cli find half hybrid -p '(?m)^.+$' -UBb bigfile + // regex-cli find hybrid dfa @bigfile '(?m)^.+$' -UBb // // PERF: For justification for the loop unrolling, we use a few // different tests: // - // regex-cli find half hybrid -p '\w{50}' -UBb bigfile - // regex-cli find half hybrid -p '(?m)^.+$' -UBb bigfile - // regex-cli find half hybrid -p 'ZQZQZQZQ' -UBb bigfile + // regex-cli find hybrid dfa @$bigfile '\w{50}' -UBb + // regex-cli find hybrid dfa @$bigfile '(?m)^.+$' -UBb + // regex-cli find hybrid dfa @$bigfile 'ZQZQZQZQ' -UBb // // And there are three different configurations: // @@ -353,7 +353,7 @@ // anchored and on shorter haystacks. However, this still makes a // difference. Take this command for example: // - // regex-cli find match hybrid -p '(?m)^.+$' -UBb bigfile + // regex-cli find hybrid regex @$bigfile '(?m)^.+$' -UBb // // (Notice that we use 'find hybrid regex', not 'find hybrid dfa' // like in the justification for the forward direction. The 'regex' diff -Nru temporalio-1.3.0/vendor/regex-automata/src/meta/limited.rs temporalio-1.3.0/vendor/regex-automata/src/meta/limited.rs --- temporalio-1.3.0/vendor/regex-automata/src/meta/limited.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/regex-automata/src/meta/limited.rs 2023-10-30 19:40:00.000000000 +0000 @@ -69,6 +69,9 @@ } else if dfa.is_dead_state(sid) { return Ok(mat); } else if dfa.is_quit_state(sid) { + if mat.is_some() { + return Ok(mat); + } return Err(MatchError::quit(input.haystack()[at], at).into()); } } @@ -152,6 +155,9 @@ } else if sid.is_dead() { return Ok(mat); } else if sid.is_quit() { + if mat.is_some() { + return Ok(mat); + } return Err(MatchError::quit(input.haystack()[at], at).into()); } } @@ -203,6 +209,9 @@ let pattern = dfa.match_pattern(*sid, 0); *mat = Some(HalfMatch::new(pattern, sp.start)); } else if dfa.is_quit_state(*sid) { + if mat.is_some() { + return Ok(()); + } return Err(MatchError::quit(byte, sp.start - 1)); } } else { @@ -237,6 +246,9 @@ let pattern = dfa.match_pattern(cache, *sid, 0); *mat = Some(HalfMatch::new(pattern, sp.start)); } else if sid.is_quit() { + if mat.is_some() { + return Ok(()); + } return Err(MatchError::quit(byte, sp.start - 1)); } } else { diff -Nru temporalio-1.3.0/vendor/regex-automata/src/meta/regex.rs temporalio-1.3.0/vendor/regex-automata/src/meta/regex.rs --- temporalio-1.3.0/vendor/regex-automata/src/meta/regex.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/regex-automata/src/meta/regex.rs 2023-10-30 19:40:00.000000000 +0000 @@ -2706,7 +2706,7 @@ /// you're compiling untrusted patterns. /// /// Note that this limit is applied to _each_ NFA built, and if any of - /// them exceed the limit, then construction will fail. This limit does + /// them excceed the limit, then construction will fail. This limit does /// _not_ correspond to the total memory used by all NFAs in the meta regex /// engine. /// @@ -3640,8 +3640,8 @@ // I found this in the course of building out the benchmark suite for // rebar. #[test] - fn regression_suffix_literal_count() { - let _ = env_logger::try_init(); + fn regression() { + env_logger::init(); let re = Regex::new(r"[a-zA-Z]+ing").unwrap(); assert_eq!(1, re.find_iter("tingling").count()); diff -Nru temporalio-1.3.0/vendor/regex-automata/src/meta/stopat.rs temporalio-1.3.0/vendor/regex-automata/src/meta/stopat.rs --- temporalio-1.3.0/vendor/regex-automata/src/meta/stopat.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/regex-automata/src/meta/stopat.rs 2023-10-30 19:40:00.000000000 +0000 @@ -81,6 +81,9 @@ } else if dfa.is_dead_state(sid) { return Ok(mat.ok_or(at)); } else if dfa.is_quit_state(sid) { + if mat.is_some() { + return Ok(mat.ok_or(at)); + } return Err(MatchError::quit(input.haystack()[at], at).into()); } else { // Ideally we wouldn't use a DFA that specialized start states @@ -119,6 +122,9 @@ } else if sid.is_dead() { return Ok(mat.ok_or(at)); } else if sid.is_quit() { + if mat.is_some() { + return Ok(mat.ok_or(at)); + } return Err(MatchError::quit(input.haystack()[at], at).into()); } else { // We should NEVER get an unknown state ID back from @@ -156,6 +162,9 @@ let pattern = dfa.match_pattern(*sid, 0); *mat = Some(HalfMatch::new(pattern, sp.end)); } else if dfa.is_quit_state(*sid) { + if mat.is_some() { + return Ok(()); + } return Err(MatchError::quit(b, sp.end)); } } @@ -192,6 +201,9 @@ let pattern = dfa.match_pattern(cache, *sid, 0); *mat = Some(HalfMatch::new(pattern, sp.end)); } else if sid.is_quit() { + if mat.is_some() { + return Ok(()); + } return Err(MatchError::quit(b, sp.end)); } } diff -Nru temporalio-1.3.0/vendor/regex-automata/src/meta/strategy.rs temporalio-1.3.0/vendor/regex-automata/src/meta/strategy.rs --- temporalio-1.3.0/vendor/regex-automata/src/meta/strategy.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/regex-automata/src/meta/strategy.rs 2023-10-30 19:40:00.000000000 +0000 @@ -353,7 +353,6 @@ // strategy when len(patterns)==1 if the number of literals is large. In that // case, literal extraction gives up and will return an infinite set.) impl Strategy for Pre

{ - #[cfg_attr(feature = "perf-inline", inline(always))] fn group_info(&self) -> &GroupInfo { &self.group_info } @@ -379,7 +378,6 @@ self.pre.memory_usage() } - #[cfg_attr(feature = "perf-inline", inline(always))] fn search(&self, _cache: &mut Cache, input: &Input<'_>) -> Option { if input.is_done() { return None; @@ -395,7 +393,6 @@ .map(|sp| Match::new(PatternID::ZERO, sp)) } - #[cfg_attr(feature = "perf-inline", inline(always))] fn search_half( &self, cache: &mut Cache, @@ -404,12 +401,10 @@ self.search(cache, input).map(|m| HalfMatch::new(m.pattern(), m.end())) } - #[cfg_attr(feature = "perf-inline", inline(always))] fn is_match(&self, cache: &mut Cache, input: &Input<'_>) -> bool { self.search(cache, input).is_some() } - #[cfg_attr(feature = "perf-inline", inline(always))] fn search_slots( &self, cache: &mut Cache, @@ -426,7 +421,6 @@ Some(m.pattern()) } - #[cfg_attr(feature = "perf-inline", inline(always))] fn which_overlapping_matches( &self, cache: &mut Cache, @@ -1281,7 +1275,7 @@ e.try_search_half_rev_limited(&input, min_start) } else if let Some(e) = self.core.hybrid.get(&input) { trace!( - "using lazy DFA for reverse suffix search at {:?}, \ + "using lazy DFA for reverse inner search at {:?}, \ but will be stopped at {} to avoid quadratic behavior", input.get_span(), min_start, diff -Nru temporalio-1.3.0/vendor/regex-automata/src/meta/wrappers.rs temporalio-1.3.0/vendor/regex-automata/src/meta/wrappers.rs --- temporalio-1.3.0/vendor/regex-automata/src/meta/wrappers.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/regex-automata/src/meta/wrappers.rs 2023-10-30 19:40:00.000000000 +0000 @@ -212,10 +212,7 @@ .configure(backtrack_config) .build_from_nfa(nfa.clone()) .map_err(BuildError::nfa)?; - debug!( - "BoundedBacktracker built (max haystack length: {:?})", - engine.max_haystack_len() - ); + debug!("BoundedBacktracker built"); Ok(Some(BoundedBacktrackerEngine(engine))) } #[cfg(not(feature = "nfa-backtrack"))] diff -Nru temporalio-1.3.0/vendor/regex-automata/src/nfa/thompson/backtrack.rs temporalio-1.3.0/vendor/regex-automata/src/nfa/thompson/backtrack.rs --- temporalio-1.3.0/vendor/regex-automata/src/nfa/thompson/backtrack.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/regex-automata/src/nfa/thompson/backtrack.rs 2023-10-30 19:40:00.000000000 +0000 @@ -820,11 +820,8 @@ // bytes to the capacity in bits. let capacity = 8 * self.get_config().get_visited_capacity(); let blocks = div_ceil(capacity, Visited::BLOCK_SIZE); - let real_capacity = blocks.saturating_mul(Visited::BLOCK_SIZE); - // It's possible for `real_capacity` to be smaller than the number of - // NFA states for particularly large regexes, so we saturate towards - // zero. - (real_capacity / self.nfa.states().len()).saturating_sub(1) + let real_capacity = blocks * Visited::BLOCK_SIZE; + (real_capacity / self.nfa.states().len()) - 1 } } @@ -1885,24 +1882,3 @@ (lhs / rhs) + 1 } } - -#[cfg(test)] -mod tests { - use super::*; - - // This is a regression test for the maximum haystack length computation. - // Previously, it assumed that the total capacity of the backtracker's - // bitset would always be greater than the number of NFA states. But there - // is of course no guarantee that this is true. This regression test - // ensures that not only does `max_haystack_len` not panic, but that it - // should return `0`. - #[cfg(feature = "syntax")] - #[test] - fn max_haystack_len_overflow() { - let re = BoundedBacktracker::builder() - .configure(BoundedBacktracker::config().visited_capacity(10)) - .build(r"[0-9A-Za-z]{100}") - .unwrap(); - assert_eq!(0, re.max_haystack_len()); - } -} diff -Nru temporalio-1.3.0/vendor/regex-automata/src/nfa/thompson/builder.rs temporalio-1.3.0/vendor/regex-automata/src/nfa/thompson/builder.rs --- temporalio-1.3.0/vendor/regex-automata/src/nfa/thompson/builder.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/regex-automata/src/nfa/thompson/builder.rs 2023-10-30 19:40:00.000000000 +0000 @@ -61,7 +61,7 @@ Look { look: Look, next: StateID }, /// An empty state that records the start of a capture location. This is an /// unconditional epsilon transition like `Empty`, except it can be used to - /// record position information for a capture group when using the NFA for + /// record position information for a captue group when using the NFA for /// search. CaptureStart { /// The ID of the pattern that this capture was defined. @@ -77,7 +77,7 @@ }, /// An empty state that records the end of a capture location. This is an /// unconditional epsilon transition like `Empty`, except it can be used to - /// record position information for a capture group when using the NFA for + /// record position information for a captue group when using the NFA for /// search. CaptureEnd { /// The ID of the pattern that this capture was defined. @@ -128,7 +128,7 @@ } impl State { - /// If this state is an unconditional epsilon transition, then this returns + /// If this state is an unconditional espilon transition, then this returns /// the target of the transition. fn goto(&self) -> Option { match *self { diff -Nru temporalio-1.3.0/vendor/regex-automata/src/nfa/thompson/compiler.rs temporalio-1.3.0/vendor/regex-automata/src/nfa/thompson/compiler.rs --- temporalio-1.3.0/vendor/regex-automata/src/nfa/thompson/compiler.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/regex-automata/src/nfa/thompson/compiler.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1466,7 +1466,7 @@ // compare and contrast performance of the Pike VM when the code below // is active vs the code above. Here's an example to try: // - // regex-cli find match pikevm -b -p '(?m)^\w{20}' non-ascii-file + // regex-cli find match pikevm -b -p '(?m)^\w{20}' -y '@$smallishru' // // With Unicode classes generated below, this search takes about 45s on // my machine. But with the compressed version above, the search takes @@ -1557,14 +1557,6 @@ hir::Look::WordAsciiNegate => Look::WordAsciiNegate, hir::Look::WordUnicode => Look::WordUnicode, hir::Look::WordUnicodeNegate => Look::WordUnicodeNegate, - hir::Look::WordStartAscii => Look::WordStartAscii, - hir::Look::WordEndAscii => Look::WordEndAscii, - hir::Look::WordStartUnicode => Look::WordStartUnicode, - hir::Look::WordEndUnicode => Look::WordEndUnicode, - hir::Look::WordStartHalfAscii => Look::WordStartHalfAscii, - hir::Look::WordEndHalfAscii => Look::WordEndHalfAscii, - hir::Look::WordStartHalfUnicode => Look::WordStartHalfUnicode, - hir::Look::WordEndHalfUnicode => Look::WordEndHalfUnicode, }; let id = self.add_look(look)?; Ok(ThompsonRef { start: id, end: id }) diff -Nru temporalio-1.3.0/vendor/regex-automata/src/nfa/thompson/map.rs temporalio-1.3.0/vendor/regex-automata/src/nfa/thompson/map.rs --- temporalio-1.3.0/vendor/regex-automata/src/nfa/thompson/map.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/regex-automata/src/nfa/thompson/map.rs 2023-10-30 19:40:00.000000000 +0000 @@ -65,7 +65,7 @@ /// Specifically, one could observe the difference with std's hashmap via /// something like the following benchmark: /// -/// hyperfine "regex-cli debug thompson -qr --no-captures '\w{90} ecurB'" +/// hyperfine "regex-cli debug nfa thompson --quiet --reverse '\w{90} ecurB'" /// /// But to observe that difference, you'd have to modify the code to use /// std's hashmap. diff -Nru temporalio-1.3.0/vendor/regex-automata/src/nfa/thompson/nfa.rs temporalio-1.3.0/vendor/regex-automata/src/nfa/thompson/nfa.rs --- temporalio-1.3.0/vendor/regex-automata/src/nfa/thompson/nfa.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/regex-automata/src/nfa/thompson/nfa.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1841,12 +1841,14 @@ // This is an alternative implementation that uses binary search. In // some ad hoc experiments, like // - // regex-cli find match pikevm -b -p '\b\w+\b' non-ascii-file + // smallishru=OpenSubtitles2018.raw.sample.smallish.ru + // regex-cli find nfa thompson pikevm -b "@$smallishru" '\b\w+\b' // // I could not observe any improvement, and in fact, things seemed to // be a bit slower. I can see an improvement in at least one benchmark: // - // regex-cli find match pikevm -b -p '\pL{100}' all-codepoints-utf8 + // allcpssmall=all-codepoints-utf8-10x + // regex-cli find nfa thompson pikevm @$allcpssmall '\pL{100}' // // Where total search time goes from 3.2s to 2.4s when using binary // search. diff -Nru temporalio-1.3.0/vendor/regex-automata/src/nfa/thompson/range_trie.rs temporalio-1.3.0/vendor/regex-automata/src/nfa/thompson/range_trie.rs --- temporalio-1.3.0/vendor/regex-automata/src/nfa/thompson/range_trie.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/regex-automata/src/nfa/thompson/range_trie.rs 2023-10-30 19:40:00.000000000 +0000 @@ -594,7 +594,7 @@ // Benchmarks suggest that binary search is just a bit faster than // straight linear search. Specifically when using the debug tool: // - // hyperfine "regex-cli debug thompson -qr --no-captures '\w{90} ecurB'" + // hyperfine "regex-cli debug nfa thompson --quiet --reverse '\w{90} ecurB'" binary_search(&self.transitions, |t| range.start <= t.range.end) } diff -Nru temporalio-1.3.0/vendor/regex-automata/src/util/captures.rs temporalio-1.3.0/vendor/regex-automata/src/util/captures.rs --- temporalio-1.3.0/vendor/regex-automata/src/util/captures.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/regex-automata/src/util/captures.rs 2023-10-30 19:40:00.000000000 +0000 @@ -433,6 +433,7 @@ /// /// ``` /// # if cfg!(miri) { return Ok(()); } // miri takes too long + /// # if !cfg!(target_pointer_width = "64") { return Ok(()); } // see #1039 /// use regex_automata::{nfa::thompson::pikevm::PikeVM, Span, Match}; /// /// let re = PikeVM::new(r"^(?P\pL+)\s+(?P\pL+)$")?; @@ -444,8 +445,6 @@ /// assert_eq!(Some(Span::from(6..17)), caps.get_group(2)); /// // Looking for a non-existent capturing group will return None: /// assert_eq!(None, caps.get_group(3)); - /// # // literals are too big for 32-bit usize: #1039 - /// # #[cfg(target_pointer_width = "64")] /// assert_eq!(None, caps.get_group(9944060567225171988)); /// /// # Ok::<(), Box>(()) diff -Nru temporalio-1.3.0/vendor/regex-automata/src/util/determinize/mod.rs temporalio-1.3.0/vendor/regex-automata/src/util/determinize/mod.rs --- temporalio-1.3.0/vendor/regex-automata/src/util/determinize/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/regex-automata/src/util/determinize/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -145,10 +145,9 @@ } Some(_) => {} None => { - look_have = look_have - .insert(Look::End) - .insert(Look::EndLF) - .insert(Look::EndCRLF); + look_have = look_have.insert(Look::End); + look_have = look_have.insert(Look::EndLF); + look_have = look_have.insert(Look::EndCRLF); } } if unit.is_byte(lookm.get_line_terminator()) { @@ -161,26 +160,11 @@ look_have = look_have.insert(Look::StartCRLF); } if state.is_from_word() == unit.is_word_byte() { - look_have = look_have - .insert(Look::WordAsciiNegate) - .insert(Look::WordUnicodeNegate); + look_have = look_have.insert(Look::WordUnicodeNegate); + look_have = look_have.insert(Look::WordAsciiNegate); } else { - look_have = - look_have.insert(Look::WordAscii).insert(Look::WordUnicode); - } - if !unit.is_word_byte() { - look_have = look_have - .insert(Look::WordEndHalfAscii) - .insert(Look::WordEndHalfUnicode); - } - if state.is_from_word() && !unit.is_word_byte() { - look_have = look_have - .insert(Look::WordEndAscii) - .insert(Look::WordEndUnicode); - } else if !state.is_from_word() && unit.is_word_byte() { - look_have = look_have - .insert(Look::WordStartAscii) - .insert(Look::WordStartUnicode); + look_have = look_have.insert(Look::WordUnicode); + look_have = look_have.insert(Look::WordAscii); } // If we have new assertions satisfied that are among the set of // assertions that exist in this state (that is, just because we added @@ -236,14 +220,6 @@ { builder.set_look_have(|have| have.insert(Look::StartCRLF)); } - // And also for the start-half word boundary assertions. As long as the - // look-behind byte is not a word char, then the assertions are satisfied. - if nfa.look_set_any().contains_word() && !unit.is_word_byte() { - builder.set_look_have(|have| { - have.insert(Look::WordStartHalfAscii) - .insert(Look::WordStartHalfUnicode) - }); - } for nfa_id in sparses.set1.iter() { match *nfa.state(nfa_id) { thompson::State::Union { .. } @@ -587,95 +563,47 @@ ) { let rev = nfa.is_reverse(); let lineterm = nfa.look_matcher().get_line_terminator(); - let lookset = nfa.look_set_any(); match *start { - Start::NonWordByte => { - if lookset.contains_word() { - builder.set_look_have(|have| { - have.insert(Look::WordStartHalfAscii) - .insert(Look::WordStartHalfUnicode) - }); - } - } + Start::NonWordByte => {} Start::WordByte => { - if lookset.contains_word() { - builder.set_is_from_word(); - } + builder.set_is_from_word(); } Start::Text => { - if lookset.contains_anchor_haystack() { - builder.set_look_have(|have| have.insert(Look::Start)); - } - if lookset.contains_anchor_line() { - builder.set_look_have(|have| { - have.insert(Look::StartLF).insert(Look::StartCRLF) - }); - } - if lookset.contains_word() { - builder.set_look_have(|have| { - have.insert(Look::WordStartHalfAscii) - .insert(Look::WordStartHalfUnicode) - }); - } + builder.set_look_have(|have| { + have.insert(Look::Start) + .insert(Look::StartLF) + .insert(Look::StartCRLF) + }); } Start::LineLF => { if rev { - if lookset.contains_anchor_crlf() { - builder.set_is_half_crlf(); - } - if lookset.contains_anchor_line() { - builder.set_look_have(|have| have.insert(Look::StartLF)); - } + builder.set_is_half_crlf(); + builder.set_look_have(|have| have.insert(Look::StartLF)); } else { - if lookset.contains_anchor_line() { - builder.set_look_have(|have| have.insert(Look::StartCRLF)); - } + builder.set_look_have(|have| have.insert(Look::StartCRLF)); } - if lookset.contains_anchor_line() && lineterm == b'\n' { + if lineterm == b'\n' { builder.set_look_have(|have| have.insert(Look::StartLF)); } - if lookset.contains_word() { - builder.set_look_have(|have| { - have.insert(Look::WordStartHalfAscii) - .insert(Look::WordStartHalfUnicode) - }); - } } Start::LineCR => { - if lookset.contains_anchor_crlf() { - if rev { - builder.set_look_have(|have| have.insert(Look::StartCRLF)); - } else { - builder.set_is_half_crlf(); - } + if rev { + builder.set_look_have(|have| have.insert(Look::StartCRLF)); + } else { + builder.set_is_half_crlf(); } - if lookset.contains_anchor_line() && lineterm == b'\r' { + if lineterm == b'\r' { builder.set_look_have(|have| have.insert(Look::StartLF)); } - if lookset.contains_word() { - builder.set_look_have(|have| { - have.insert(Look::WordStartHalfAscii) - .insert(Look::WordStartHalfUnicode) - }); - } } Start::CustomLineTerminator => { - if lookset.contains_anchor_line() { - builder.set_look_have(|have| have.insert(Look::StartLF)); - } + builder.set_look_have(|have| have.insert(Look::StartLF)); // This is a bit of a tricky case, but if the line terminator was // set to a word byte, then we also need to behave as if the start // configuration is Start::WordByte. That is, we need to mark our // state as having come from a word byte. - if lookset.contains_word() { - if utf8::is_word_byte(lineterm) { - builder.set_is_from_word(); - } else { - builder.set_look_have(|have| { - have.insert(Look::WordStartHalfAscii) - .insert(Look::WordStartHalfUnicode) - }); - } + if utf8::is_word_byte(lineterm) { + builder.set_is_from_word(); } } } diff -Nru temporalio-1.3.0/vendor/regex-automata/src/util/determinize/state.rs temporalio-1.3.0/vendor/regex-automata/src/util/determinize/state.rs --- temporalio-1.3.0/vendor/regex-automata/src/util/determinize/state.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/regex-automata/src/util/determinize/state.rs 2023-10-30 19:40:00.000000000 +0000 @@ -197,7 +197,7 @@ } pub(crate) fn into_matches(mut self) -> StateBuilderMatches { - self.0.extend_from_slice(&[0, 0, 0, 0, 0, 0, 0, 0, 0]); + self.0.extend_from_slice(&[0, 0, 0, 0, 0]); StateBuilderMatches(self.0) } @@ -348,17 +348,16 @@ /// generated by a transition over a "word" byte. (Callers may not always set /// this. For example, if the NFA has no word boundary assertion, then needing /// to track whether a state came from a word byte or not is superfluous and -/// wasteful.) Bit 3 is set to 1 if the state was generated by a transition -/// from a `\r` (forward search) or a `\n` (reverse search) when CRLF mode is -/// enabled. -/// -/// Bytes 1..5 correspond to the look-behind assertions that were satisfied -/// by the transition that created this state. (Look-ahead assertions are not -/// tracked as part of states. Instead, these are applied by re-computing the -/// epsilon closure of a state when computing the transition function. See -/// `next` in the parent module.) +/// wasteful.) /// -/// Bytes 5..9 correspond to the set of look-around assertions (including both +/// Byte 1 corresponds to the look-behind assertions that were satisfied by +/// the transition that created this state. This generally only includes the +/// StartLF and Start assertions. (Look-ahead assertions are not tracked as +/// part of states. Instead, these are applied by re-computing the epsilon +/// closure of a state when computing the transition function. See `next` in +/// the parent module.) +/// +/// Byte 2 corresponds to the set of look-around assertions (including both /// look-behind and look-ahead) that appear somewhere in this state's set of /// NFA state IDs. This is used to determine whether this state's epsilon /// closure should be re-computed when computing the transition function. @@ -367,7 +366,7 @@ /// function, we should only re-compute the epsilon closure if those new /// assertions are relevant to this particular state. /// -/// Bytes 9..13 correspond to a 32-bit native-endian encoded integer +/// Bytes 3..7 correspond to a 32-bit native-endian encoded integer /// corresponding to the number of patterns encoded in this state. If the state /// is not a match state (byte 0 bit 0 is 0) or if it's only pattern ID is /// PatternID::ZERO, then no integer is encoded at this position. Instead, byte @@ -453,7 +452,7 @@ /// state has no conditional epsilon transitions, then there is no need /// to re-compute the epsilon closure. fn look_need(&self) -> LookSet { - LookSet::read_repr(&self.0[5..]) + LookSet::read_repr(&self.0[3..]) } /// Returns the total number of match pattern IDs in this state. @@ -477,7 +476,7 @@ if !self.has_pattern_ids() { PatternID::ZERO } else { - let offset = 13 + index * PatternID::SIZE; + let offset = 9 + index * PatternID::SIZE; // This is OK since we only ever serialize valid PatternIDs to // states. wire::read_pattern_id_unchecked(&self.0[offset..]).0 @@ -508,7 +507,7 @@ f(PatternID::ZERO); return; } - let mut pids = &self.0[13..self.pattern_offset_end()]; + let mut pids = &self.0[9..self.pattern_offset_end()]; while !pids.is_empty() { let pid = wire::read_u32(pids); pids = &pids[PatternID::SIZE..]; @@ -540,11 +539,11 @@ fn pattern_offset_end(&self) -> usize { let encoded = self.encoded_pattern_len(); if encoded == 0 { - return 9; + return 5; } // This arithmetic is OK since we were able to address this many bytes // when writing to the state, thus, it must fit into a usize. - encoded.checked_mul(4).unwrap().checked_add(13).unwrap() + encoded.checked_mul(4).unwrap().checked_add(9).unwrap() } /// Returns the total number of *encoded* pattern IDs in this state. @@ -558,7 +557,7 @@ } // This unwrap is OK since the total number of patterns is always // guaranteed to fit into a usize. - usize::try_from(wire::read_u32(&self.0[9..13])).unwrap() + usize::try_from(wire::read_u32(&self.0[5..9])).unwrap() } } @@ -644,7 +643,7 @@ /// Mutate the set of look-around (both behind and ahead) assertions that /// appear at least once in this state's set of NFA states. fn set_look_need(&mut self, mut set: impl FnMut(LookSet) -> LookSet) { - set(self.look_need()).write_repr(&mut self.0[5..]); + set(self.look_need()).write_repr(&mut self.0[3..]); } /// Add a pattern ID to this state. All match states must have at least @@ -704,14 +703,14 @@ return; } let patsize = PatternID::SIZE; - let pattern_bytes = self.0.len() - 13; + let pattern_bytes = self.0.len() - 9; // Every pattern ID uses 4 bytes, so number of bytes should be // divisible by 4. assert_eq!(pattern_bytes % patsize, 0); // This unwrap is OK since we are guaranteed that the maximum number // of possible patterns fits into a u32. let count32 = u32::try_from(pattern_bytes / patsize).unwrap(); - wire::NE::write_u32(count32, &mut self.0[9..13]); + wire::NE::write_u32(count32, &mut self.0[5..9]); } /// Add an NFA state ID to this state. The order in which NFA states are diff -Nru temporalio-1.3.0/vendor/regex-automata/src/util/lazy.rs temporalio-1.3.0/vendor/regex-automata/src/util/lazy.rs --- temporalio-1.3.0/vendor/regex-automata/src/util/lazy.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/regex-automata/src/util/lazy.rs 2023-10-30 19:40:00.000000000 +0000 @@ -384,7 +384,11 @@ // SAFETY: state is DONE if and only if data has been fully // initialized. At which point, it is safe to drop. unsafe { - self.data.get_mut().assume_init_drop(); + // MSRV(1.60): Use assume_init_drop. The below is how + // assume_init_drop is implemented. + core::ptr::drop_in_place( + (*self.data.as_ptr()).as_mut_ptr(), + ) } } } diff -Nru temporalio-1.3.0/vendor/regex-automata/src/util/look.rs temporalio-1.3.0/vendor/regex-automata/src/util/look.rs --- temporalio-1.3.0/vendor/regex-automata/src/util/look.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/regex-automata/src/util/look.rs 2023-10-30 19:40:00.000000000 +0000 @@ -96,42 +96,6 @@ WordUnicode = 1 << 8, /// Match a Unicode-aware negation of a word boundary. WordUnicodeNegate = 1 << 9, - /// Match the start of an ASCII-only word boundary. That is, this matches a - /// position at either the beginning of the haystack or where the previous - /// character is not a word character and the following character is a word - /// character. - WordStartAscii = 1 << 10, - /// Match the end of an ASCII-only word boundary. That is, this matches - /// a position at either the end of the haystack or where the previous - /// character is a word character and the following character is not a word - /// character. - WordEndAscii = 1 << 11, - /// Match the start of a Unicode word boundary. That is, this matches a - /// position at either the beginning of the haystack or where the previous - /// character is not a word character and the following character is a word - /// character. - WordStartUnicode = 1 << 12, - /// Match the end of a Unicode word boundary. That is, this matches a - /// position at either the end of the haystack or where the previous - /// character is a word character and the following character is not a word - /// character. - WordEndUnicode = 1 << 13, - /// Match the start half of an ASCII-only word boundary. That is, this - /// matches a position at either the beginning of the haystack or where the - /// previous character is not a word character. - WordStartHalfAscii = 1 << 14, - /// Match the end half of an ASCII-only word boundary. That is, this - /// matches a position at either the end of the haystack or where the - /// following character is not a word character. - WordEndHalfAscii = 1 << 15, - /// Match the start half of a Unicode word boundary. That is, this matches - /// a position at either the beginning of the haystack or where the - /// previous character is not a word character. - WordStartHalfUnicode = 1 << 16, - /// Match the end half of a Unicode word boundary. That is, this matches - /// a position at either the end of the haystack or where the following - /// character is not a word character. - WordEndHalfUnicode = 1 << 17, } impl Look { @@ -153,14 +117,6 @@ Look::WordAsciiNegate => Look::WordAsciiNegate, Look::WordUnicode => Look::WordUnicode, Look::WordUnicodeNegate => Look::WordUnicodeNegate, - Look::WordStartAscii => Look::WordEndAscii, - Look::WordEndAscii => Look::WordStartAscii, - Look::WordStartUnicode => Look::WordEndUnicode, - Look::WordEndUnicode => Look::WordStartUnicode, - Look::WordStartHalfAscii => Look::WordEndHalfAscii, - Look::WordEndHalfAscii => Look::WordStartHalfAscii, - Look::WordStartHalfUnicode => Look::WordEndHalfUnicode, - Look::WordEndHalfUnicode => Look::WordStartHalfUnicode, } } @@ -169,36 +125,28 @@ /// constructor is guaranteed to return the same look-around variant that /// one started with within a semver compatible release of this crate. #[inline] - pub const fn as_repr(self) -> u32 { + pub const fn as_repr(self) -> u16 { // AFAIK, 'as' is the only way to zero-cost convert an int enum to an // actual int. - self as u32 + self as u16 } /// Given the underlying representation of a `Look` value, return the /// corresponding `Look` value if the representation is valid. Otherwise /// `None` is returned. #[inline] - pub const fn from_repr(repr: u32) -> Option { + pub const fn from_repr(repr: u16) -> Option { match repr { - 0b00_0000_0000_0000_0001 => Some(Look::Start), - 0b00_0000_0000_0000_0010 => Some(Look::End), - 0b00_0000_0000_0000_0100 => Some(Look::StartLF), - 0b00_0000_0000_0000_1000 => Some(Look::EndLF), - 0b00_0000_0000_0001_0000 => Some(Look::StartCRLF), - 0b00_0000_0000_0010_0000 => Some(Look::EndCRLF), - 0b00_0000_0000_0100_0000 => Some(Look::WordAscii), - 0b00_0000_0000_1000_0000 => Some(Look::WordAsciiNegate), - 0b00_0000_0001_0000_0000 => Some(Look::WordUnicode), - 0b00_0000_0010_0000_0000 => Some(Look::WordUnicodeNegate), - 0b00_0000_0100_0000_0000 => Some(Look::WordStartAscii), - 0b00_0000_1000_0000_0000 => Some(Look::WordEndAscii), - 0b00_0001_0000_0000_0000 => Some(Look::WordStartUnicode), - 0b00_0010_0000_0000_0000 => Some(Look::WordEndUnicode), - 0b00_0100_0000_0000_0000 => Some(Look::WordStartHalfAscii), - 0b00_1000_0000_0000_0000 => Some(Look::WordEndHalfAscii), - 0b01_0000_0000_0000_0000 => Some(Look::WordStartHalfUnicode), - 0b10_0000_0000_0000_0000 => Some(Look::WordEndHalfUnicode), + 0b00_0000_0001 => Some(Look::Start), + 0b00_0000_0010 => Some(Look::End), + 0b00_0000_0100 => Some(Look::StartLF), + 0b00_0000_1000 => Some(Look::EndLF), + 0b00_0001_0000 => Some(Look::StartCRLF), + 0b00_0010_0000 => Some(Look::EndCRLF), + 0b00_0100_0000 => Some(Look::WordAscii), + 0b00_1000_0000 => Some(Look::WordAsciiNegate), + 0b01_0000_0000 => Some(Look::WordUnicode), + 0b10_0000_0000 => Some(Look::WordUnicodeNegate), _ => None, } } @@ -223,14 +171,6 @@ Look::WordAsciiNegate => 'B', Look::WordUnicode => 'ð›ƒ', Look::WordUnicodeNegate => 'ðš©', - Look::WordStartAscii => '<', - Look::WordEndAscii => '>', - Look::WordStartUnicode => '〈', - Look::WordEndUnicode => '〉', - Look::WordStartHalfAscii => 'â—', - Look::WordEndHalfAscii => 'â–·', - Look::WordStartHalfUnicode => 'â—€', - Look::WordEndHalfUnicode => 'â–¶', } } } @@ -244,14 +184,14 @@ pub struct LookSet { /// The underlying representation this set is exposed to make it possible /// to store it somewhere efficiently. The representation is that - /// of a bitset, where each assertion occupies bit `i` where - /// `i = Look::as_repr()`. + /// of a bitset, where each assertion occupies bit `i` where `i = + /// Look::as_repr()`. /// /// Note that users of this internal representation must permit the full /// range of `u16` values to be represented. For example, even if the /// current implementation only makes use of the 10 least significant bits, /// it may use more bits in a future semver compatible release. - pub bits: u32, + pub bits: u16, } impl LookSet { @@ -354,22 +294,13 @@ pub fn contains_word_unicode(self) -> bool { self.contains(Look::WordUnicode) || self.contains(Look::WordUnicodeNegate) - || self.contains(Look::WordStartUnicode) - || self.contains(Look::WordEndUnicode) - || self.contains(Look::WordStartHalfUnicode) - || self.contains(Look::WordEndHalfUnicode) } /// Returns true if and only if this set contains any ASCII word boundary /// or negated ASCII word boundary assertions. #[inline] pub fn contains_word_ascii(self) -> bool { - self.contains(Look::WordAscii) - || self.contains(Look::WordAsciiNegate) - || self.contains(Look::WordStartAscii) - || self.contains(Look::WordEndAscii) - || self.contains(Look::WordStartHalfAscii) - || self.contains(Look::WordEndHalfAscii) + self.contains(Look::WordAscii) || self.contains(Look::WordAsciiNegate) } /// Returns an iterator over all of the look-around assertions in this set. @@ -448,31 +379,29 @@ *self = self.intersect(other); } - /// Return a `LookSet` from the slice given as a native endian 32-bit + /// Return a `LookSet` from the slice given as a native endian 16-bit /// integer. /// /// # Panics /// - /// This panics if `slice.len() < 4`. + /// This panics if `slice.len() < 2`. #[inline] pub fn read_repr(slice: &[u8]) -> LookSet { - let bits = u32::from_ne_bytes(slice[..4].try_into().unwrap()); + let bits = u16::from_ne_bytes(slice[..2].try_into().unwrap()); LookSet { bits } } - /// Write a `LookSet` as a native endian 32-bit integer to the beginning + /// Write a `LookSet` as a native endian 16-bit integer to the beginning /// of the slice given. /// /// # Panics /// - /// This panics if `slice.len() < 4`. + /// This panics if `slice.len() < 2`. #[inline] pub fn write_repr(self, slice: &mut [u8]) { let raw = self.bits.to_ne_bytes(); slice[0] = raw[0]; slice[1] = raw[1]; - slice[2] = raw[2]; - slice[3] = raw[3]; } /// Checks that all assertions in this set can be matched. @@ -527,9 +456,9 @@ return None; } // We'll never have more than u8::MAX distinct look-around assertions, - // so 'bit' will always fit into a u16. - let bit = u16::try_from(self.set.bits.trailing_zeros()).unwrap(); - let look = Look::from_repr(1 << bit)?; + // so 'repr' will always fit into a u16. + let repr = u16::try_from(self.set.bits.trailing_zeros()).unwrap(); + let look = Look::from_repr(1 << repr)?; self.set = self.set.remove(look); Some(look) } @@ -637,23 +566,6 @@ } /// Like `matches`, but forcefully inlined. - /// - /// # Panics - /// - /// This panics when testing any Unicode word boundary assertion in this - /// set and when the Unicode word data is not available. Specifically, this - /// only occurs when the `unicode-word-boundary` feature is not enabled. - /// - /// Since it's generally expected that this routine is called inside of - /// a matching engine, callers should check the error condition when - /// building the matching engine. If there is a Unicode word boundary - /// in the matcher and the data isn't available, then the matcher should - /// fail to build. - /// - /// Callers can check the error condition with [`LookSet::available`]. - /// - /// This also may panic when `at > haystack.len()`. Note that `at == - /// haystack.len()` is legal and guaranteed not to panic. #[cfg_attr(feature = "perf-inline", inline(always))] pub(crate) fn matches_inline( &self, @@ -674,26 +586,6 @@ Look::WordUnicodeNegate => { self.is_word_unicode_negate(haystack, at).unwrap() } - Look::WordStartAscii => self.is_word_start_ascii(haystack, at), - Look::WordEndAscii => self.is_word_end_ascii(haystack, at), - Look::WordStartUnicode => { - self.is_word_start_unicode(haystack, at).unwrap() - } - Look::WordEndUnicode => { - self.is_word_end_unicode(haystack, at).unwrap() - } - Look::WordStartHalfAscii => { - self.is_word_start_half_ascii(haystack, at) - } - Look::WordEndHalfAscii => { - self.is_word_end_half_ascii(haystack, at) - } - Look::WordStartHalfUnicode => { - self.is_word_start_half_unicode(haystack, at).unwrap() - } - Look::WordEndHalfUnicode => { - self.is_word_end_half_unicode(haystack, at).unwrap() - } } } @@ -788,46 +680,6 @@ return false; } } - if set.contains(Look::WordStartAscii) { - if !self.is_word_start_ascii(haystack, at) { - return false; - } - } - if set.contains(Look::WordEndAscii) { - if !self.is_word_end_ascii(haystack, at) { - return false; - } - } - if set.contains(Look::WordStartUnicode) { - if !self.is_word_start_unicode(haystack, at).unwrap() { - return false; - } - } - if set.contains(Look::WordEndUnicode) { - if !self.is_word_end_unicode(haystack, at).unwrap() { - return false; - } - } - if set.contains(Look::WordStartHalfAscii) { - if !self.is_word_start_half_ascii(haystack, at) { - return false; - } - } - if set.contains(Look::WordEndHalfAscii) { - if !self.is_word_end_half_ascii(haystack, at) { - return false; - } - } - if set.contains(Look::WordStartHalfUnicode) { - if !self.is_word_start_half_unicode(haystack, at).unwrap() { - return false; - } - } - if set.contains(Look::WordEndHalfUnicode) { - if !self.is_word_end_half_unicode(haystack, at).unwrap() { - return false; - } - } true } @@ -851,15 +703,7 @@ Look::WordAscii | Look::WordAsciiNegate | Look::WordUnicode - | Look::WordUnicodeNegate - | Look::WordStartAscii - | Look::WordEndAscii - | Look::WordStartUnicode - | Look::WordEndUnicode - | Look::WordStartHalfAscii - | Look::WordEndHalfAscii - | Look::WordStartHalfUnicode - | Look::WordEndHalfUnicode => { + | Look::WordUnicodeNegate => { // We need to mark all ranges of bytes whose pairs result in // evaluating \b differently. This isn't technically correct // for Unicode word boundaries, but DFAs can't handle those @@ -1087,177 +931,6 @@ }; Ok(word_before == word_after) } - - /// Returns true when [`Look::WordStartAscii`] is satisfied `at` the given - /// position in `haystack`. - /// - /// # Panics - /// - /// This may panic when `at > haystack.len()`. Note that `at == - /// haystack.len()` is legal and guaranteed not to panic. - #[inline] - pub fn is_word_start_ascii(&self, haystack: &[u8], at: usize) -> bool { - let word_before = at > 0 && utf8::is_word_byte(haystack[at - 1]); - let word_after = - at < haystack.len() && utf8::is_word_byte(haystack[at]); - !word_before && word_after - } - - /// Returns true when [`Look::WordEndAscii`] is satisfied `at` the given - /// position in `haystack`. - /// - /// # Panics - /// - /// This may panic when `at > haystack.len()`. Note that `at == - /// haystack.len()` is legal and guaranteed not to panic. - #[inline] - pub fn is_word_end_ascii(&self, haystack: &[u8], at: usize) -> bool { - let word_before = at > 0 && utf8::is_word_byte(haystack[at - 1]); - let word_after = - at < haystack.len() && utf8::is_word_byte(haystack[at]); - word_before && !word_after - } - - /// Returns true when [`Look::WordStartUnicode`] is satisfied `at` the - /// given position in `haystack`. - /// - /// # Panics - /// - /// This may panic when `at > haystack.len()`. Note that `at == - /// haystack.len()` is legal and guaranteed not to panic. - /// - /// # Errors - /// - /// This returns an error when Unicode word boundary tables - /// are not available. Specifically, this only occurs when the - /// `unicode-word-boundary` feature is not enabled. - #[inline] - pub fn is_word_start_unicode( - &self, - haystack: &[u8], - at: usize, - ) -> Result { - let word_before = is_word_char::rev(haystack, at)?; - let word_after = is_word_char::fwd(haystack, at)?; - Ok(!word_before && word_after) - } - - /// Returns true when [`Look::WordEndUnicode`] is satisfied `at` the - /// given position in `haystack`. - /// - /// # Panics - /// - /// This may panic when `at > haystack.len()`. Note that `at == - /// haystack.len()` is legal and guaranteed not to panic. - /// - /// # Errors - /// - /// This returns an error when Unicode word boundary tables - /// are not available. Specifically, this only occurs when the - /// `unicode-word-boundary` feature is not enabled. - #[inline] - pub fn is_word_end_unicode( - &self, - haystack: &[u8], - at: usize, - ) -> Result { - let word_before = is_word_char::rev(haystack, at)?; - let word_after = is_word_char::fwd(haystack, at)?; - Ok(word_before && !word_after) - } - - /// Returns true when [`Look::WordStartHalfAscii`] is satisfied `at` the - /// given position in `haystack`. - /// - /// # Panics - /// - /// This may panic when `at > haystack.len()`. Note that `at == - /// haystack.len()` is legal and guaranteed not to panic. - #[inline] - pub fn is_word_start_half_ascii( - &self, - haystack: &[u8], - at: usize, - ) -> bool { - let word_before = at > 0 && utf8::is_word_byte(haystack[at - 1]); - !word_before - } - - /// Returns true when [`Look::WordEndHalfAscii`] is satisfied `at` the - /// given position in `haystack`. - /// - /// # Panics - /// - /// This may panic when `at > haystack.len()`. Note that `at == - /// haystack.len()` is legal and guaranteed not to panic. - #[inline] - pub fn is_word_end_half_ascii(&self, haystack: &[u8], at: usize) -> bool { - let word_after = - at < haystack.len() && utf8::is_word_byte(haystack[at]); - !word_after - } - - /// Returns true when [`Look::WordStartHalfUnicode`] is satisfied `at` the - /// given position in `haystack`. - /// - /// # Panics - /// - /// This may panic when `at > haystack.len()`. Note that `at == - /// haystack.len()` is legal and guaranteed not to panic. - /// - /// # Errors - /// - /// This returns an error when Unicode word boundary tables - /// are not available. Specifically, this only occurs when the - /// `unicode-word-boundary` feature is not enabled. - #[inline] - pub fn is_word_start_half_unicode( - &self, - haystack: &[u8], - at: usize, - ) -> Result { - // See `is_word_unicode_negate` for why we need to do this. We don't - // need to do it for `is_word_start_unicode` because that guarantees - // that the position matched falls on a valid UTF-8 boundary given - // that the right side must be in \w. - let word_before = at > 0 - && match utf8::decode_last(&haystack[..at]) { - None | Some(Err(_)) => return Ok(false), - Some(Ok(_)) => is_word_char::rev(haystack, at)?, - }; - Ok(!word_before) - } - - /// Returns true when [`Look::WordEndHalfUnicode`] is satisfied `at` the - /// given position in `haystack`. - /// - /// # Panics - /// - /// This may panic when `at > haystack.len()`. Note that `at == - /// haystack.len()` is legal and guaranteed not to panic. - /// - /// # Errors - /// - /// This returns an error when Unicode word boundary tables - /// are not available. Specifically, this only occurs when the - /// `unicode-word-boundary` feature is not enabled. - #[inline] - pub fn is_word_end_half_unicode( - &self, - haystack: &[u8], - at: usize, - ) -> Result { - // See `is_word_unicode_negate` for why we need to do this. We don't - // need to do it for `is_word_end_unicode` because that guarantees - // that the position matched falls on a valid UTF-8 boundary given - // that the left side must be in \w. - let word_after = at < haystack.len() - && match utf8::decode(&haystack[at..]) { - None | Some(Err(_)) => return Ok(false), - Some(Ok(_)) => is_word_char::fwd(haystack, at)?, - }; - Ok(!word_after) - } } impl Default for LookMatcher { @@ -1351,9 +1024,7 @@ // There are perhaps other choices as well. Why did I stop at these 4? Because // I wanted to preserve my sanity. I suspect I'll wind up adding the lazy DFA // approach eventually, as the benefits of the DFA approach are somewhat -// compelling. The 'boundary-words-holmes' benchmark tests this. (Note that -// the commands below no longer work. If necessary, we should re-capitulate -// the benchmark from whole cloth in rebar.) +// compelling. The 'boundary-words-holmes' benchmark tests this: // // $ regex-cli bench measure -f boundary-words-holmes -e pikevm > dfa.csv // @@ -1651,7 +1322,8 @@ fn is_word_character(c: char) -> bool { use crate::util::{unicode_data::perl_word::PERL_WORD, utf8}; - if u8::try_from(c).map_or(false, utf8::is_word_byte) { + // MSRV(1.59): Use 'u8::try_from(c)' instead. + if u8::try_from(u32::from(c)).map_or(false, utf8::is_word_byte) { return true; } PERL_WORD @@ -1984,474 +1656,46 @@ } #[test] - fn look_matches_word_start_ascii() { - let look = Look::WordStartAscii; + fn look_set() { + let mut f = LookSet::default(); + assert!(!f.contains(Look::Start)); + assert!(!f.contains(Look::End)); + assert!(!f.contains(Look::StartLF)); + assert!(!f.contains(Look::EndLF)); + assert!(!f.contains(Look::WordUnicode)); + assert!(!f.contains(Look::WordUnicodeNegate)); + assert!(!f.contains(Look::WordAscii)); + assert!(!f.contains(Look::WordAsciiNegate)); - // \xF0\x9D\x9B\x83 = 𛃠(in \w) - // \xF0\x90\x86\x80 = ð†€ (not in \w) + f = f.insert(Look::Start); + assert!(f.contains(Look::Start)); + f = f.remove(Look::Start); + assert!(!f.contains(Look::Start)); - // Simple ASCII word boundaries. - assert!(testlook!(look, "a", 0)); - assert!(!testlook!(look, "a", 1)); - assert!(!testlook!(look, "a ", 1)); - assert!(testlook!(look, " a ", 1)); - assert!(!testlook!(look, " a ", 2)); + f = f.insert(Look::End); + assert!(f.contains(Look::End)); + f = f.remove(Look::End); + assert!(!f.contains(Look::End)); - // Unicode word boundaries with a non-ASCII codepoint. Since this is - // an ASCII word boundary, none of these match. - assert!(!testlook!(look, "ð›ƒ", 0)); - assert!(!testlook!(look, "ð›ƒ", 4)); - assert!(!testlook!(look, "𛃠", 4)); - assert!(!testlook!(look, " 𛃠", 1)); - assert!(!testlook!(look, " 𛃠", 5)); + f = f.insert(Look::StartLF); + assert!(f.contains(Look::StartLF)); + f = f.remove(Look::StartLF); + assert!(!f.contains(Look::StartLF)); - // Unicode word boundaries between non-ASCII codepoints. Again, since - // this is an ASCII word boundary, none of these match. - assert!(!testlook!(look, "ð›ƒð†€", 0)); - assert!(!testlook!(look, "ð›ƒð†€", 4)); + f = f.insert(Look::EndLF); + assert!(f.contains(Look::EndLF)); + f = f.remove(Look::EndLF); + assert!(!f.contains(Look::EndLF)); - // Non word boundaries for ASCII. - assert!(!testlook!(look, "", 0)); - assert!(!testlook!(look, "ab", 1)); - assert!(!testlook!(look, "a ", 2)); - assert!(!testlook!(look, " a ", 0)); - assert!(!testlook!(look, " a ", 3)); + f = f.insert(Look::StartCRLF); + assert!(f.contains(Look::StartCRLF)); + f = f.remove(Look::StartCRLF); + assert!(!f.contains(Look::StartCRLF)); - // Non word boundaries with a non-ASCII codepoint. - assert!(testlook!(look, "ð›ƒb", 4)); - assert!(!testlook!(look, "bð›ƒ", 1)); - assert!(!testlook!(look, "𛃠", 5)); - assert!(!testlook!(look, " 𛃠", 0)); - assert!(!testlook!(look, " 𛃠", 6)); - assert!(!testlook!(look, "ð›ƒ", 1)); - assert!(!testlook!(look, "ð›ƒ", 2)); - assert!(!testlook!(look, "ð›ƒ", 3)); - - // Non word boundaries with non-ASCII codepoints. - assert!(!testlook!(look, "ð›ƒð†€", 1)); - assert!(!testlook!(look, "ð›ƒð†€", 2)); - assert!(!testlook!(look, "ð›ƒð†€", 3)); - assert!(!testlook!(look, "ð›ƒð†€", 5)); - assert!(!testlook!(look, "ð›ƒð†€", 6)); - assert!(!testlook!(look, "ð›ƒð†€", 7)); - assert!(!testlook!(look, "ð›ƒð†€", 8)); - } - - #[test] - fn look_matches_word_end_ascii() { - let look = Look::WordEndAscii; - - // \xF0\x9D\x9B\x83 = 𛃠(in \w) - // \xF0\x90\x86\x80 = ð†€ (not in \w) - - // Simple ASCII word boundaries. - assert!(!testlook!(look, "a", 0)); - assert!(testlook!(look, "a", 1)); - assert!(testlook!(look, "a ", 1)); - assert!(!testlook!(look, " a ", 1)); - assert!(testlook!(look, " a ", 2)); - - // Unicode word boundaries with a non-ASCII codepoint. Since this is - // an ASCII word boundary, none of these match. - assert!(!testlook!(look, "ð›ƒ", 0)); - assert!(!testlook!(look, "ð›ƒ", 4)); - assert!(!testlook!(look, "𛃠", 4)); - assert!(!testlook!(look, " 𛃠", 1)); - assert!(!testlook!(look, " 𛃠", 5)); - - // Unicode word boundaries between non-ASCII codepoints. Again, since - // this is an ASCII word boundary, none of these match. - assert!(!testlook!(look, "ð›ƒð†€", 0)); - assert!(!testlook!(look, "ð›ƒð†€", 4)); - - // Non word boundaries for ASCII. - assert!(!testlook!(look, "", 0)); - assert!(!testlook!(look, "ab", 1)); - assert!(!testlook!(look, "a ", 2)); - assert!(!testlook!(look, " a ", 0)); - assert!(!testlook!(look, " a ", 3)); - - // Non word boundaries with a non-ASCII codepoint. - assert!(!testlook!(look, "ð›ƒb", 4)); - assert!(testlook!(look, "bð›ƒ", 1)); - assert!(!testlook!(look, "𛃠", 5)); - assert!(!testlook!(look, " 𛃠", 0)); - assert!(!testlook!(look, " 𛃠", 6)); - assert!(!testlook!(look, "ð›ƒ", 1)); - assert!(!testlook!(look, "ð›ƒ", 2)); - assert!(!testlook!(look, "ð›ƒ", 3)); - - // Non word boundaries with non-ASCII codepoints. - assert!(!testlook!(look, "ð›ƒð†€", 1)); - assert!(!testlook!(look, "ð›ƒð†€", 2)); - assert!(!testlook!(look, "ð›ƒð†€", 3)); - assert!(!testlook!(look, "ð›ƒð†€", 5)); - assert!(!testlook!(look, "ð›ƒð†€", 6)); - assert!(!testlook!(look, "ð›ƒð†€", 7)); - assert!(!testlook!(look, "ð›ƒð†€", 8)); - } - - #[test] - #[cfg(all(not(miri), feature = "unicode-word-boundary"))] - fn look_matches_word_start_unicode() { - let look = Look::WordStartUnicode; - - // \xF0\x9D\x9B\x83 = 𛃠(in \w) - // \xF0\x90\x86\x80 = ð†€ (not in \w) - - // Simple ASCII word boundaries. - assert!(testlook!(look, "a", 0)); - assert!(!testlook!(look, "a", 1)); - assert!(!testlook!(look, "a ", 1)); - assert!(testlook!(look, " a ", 1)); - assert!(!testlook!(look, " a ", 2)); - - // Unicode word boundaries with a non-ASCII codepoint. - assert!(testlook!(look, "ð›ƒ", 0)); - assert!(!testlook!(look, "ð›ƒ", 4)); - assert!(!testlook!(look, "𛃠", 4)); - assert!(testlook!(look, " 𛃠", 1)); - assert!(!testlook!(look, " 𛃠", 5)); - - // Unicode word boundaries between non-ASCII codepoints. - assert!(testlook!(look, "ð›ƒð†€", 0)); - assert!(!testlook!(look, "ð›ƒð†€", 4)); - - // Non word boundaries for ASCII. - assert!(!testlook!(look, "", 0)); - assert!(!testlook!(look, "ab", 1)); - assert!(!testlook!(look, "a ", 2)); - assert!(!testlook!(look, " a ", 0)); - assert!(!testlook!(look, " a ", 3)); - - // Non word boundaries with a non-ASCII codepoint. - assert!(!testlook!(look, "ð›ƒb", 4)); - assert!(!testlook!(look, "bð›ƒ", 1)); - assert!(!testlook!(look, "𛃠", 5)); - assert!(!testlook!(look, " 𛃠", 0)); - assert!(!testlook!(look, " 𛃠", 6)); - assert!(!testlook!(look, "ð›ƒ", 1)); - assert!(!testlook!(look, "ð›ƒ", 2)); - assert!(!testlook!(look, "ð›ƒ", 3)); - - // Non word boundaries with non-ASCII codepoints. - assert!(!testlook!(look, "ð›ƒð†€", 1)); - assert!(!testlook!(look, "ð›ƒð†€", 2)); - assert!(!testlook!(look, "ð›ƒð†€", 3)); - assert!(!testlook!(look, "ð›ƒð†€", 5)); - assert!(!testlook!(look, "ð›ƒð†€", 6)); - assert!(!testlook!(look, "ð›ƒð†€", 7)); - assert!(!testlook!(look, "ð›ƒð†€", 8)); - } - - #[test] - #[cfg(all(not(miri), feature = "unicode-word-boundary"))] - fn look_matches_word_end_unicode() { - let look = Look::WordEndUnicode; - - // \xF0\x9D\x9B\x83 = 𛃠(in \w) - // \xF0\x90\x86\x80 = ð†€ (not in \w) - - // Simple ASCII word boundaries. - assert!(!testlook!(look, "a", 0)); - assert!(testlook!(look, "a", 1)); - assert!(testlook!(look, "a ", 1)); - assert!(!testlook!(look, " a ", 1)); - assert!(testlook!(look, " a ", 2)); - - // Unicode word boundaries with a non-ASCII codepoint. - assert!(!testlook!(look, "ð›ƒ", 0)); - assert!(testlook!(look, "ð›ƒ", 4)); - assert!(testlook!(look, "𛃠", 4)); - assert!(!testlook!(look, " 𛃠", 1)); - assert!(testlook!(look, " 𛃠", 5)); - - // Unicode word boundaries between non-ASCII codepoints. - assert!(!testlook!(look, "ð›ƒð†€", 0)); - assert!(testlook!(look, "ð›ƒð†€", 4)); - - // Non word boundaries for ASCII. - assert!(!testlook!(look, "", 0)); - assert!(!testlook!(look, "ab", 1)); - assert!(!testlook!(look, "a ", 2)); - assert!(!testlook!(look, " a ", 0)); - assert!(!testlook!(look, " a ", 3)); - - // Non word boundaries with a non-ASCII codepoint. - assert!(!testlook!(look, "ð›ƒb", 4)); - assert!(!testlook!(look, "bð›ƒ", 1)); - assert!(!testlook!(look, "𛃠", 5)); - assert!(!testlook!(look, " 𛃠", 0)); - assert!(!testlook!(look, " 𛃠", 6)); - assert!(!testlook!(look, "ð›ƒ", 1)); - assert!(!testlook!(look, "ð›ƒ", 2)); - assert!(!testlook!(look, "ð›ƒ", 3)); - - // Non word boundaries with non-ASCII codepoints. - assert!(!testlook!(look, "ð›ƒð†€", 1)); - assert!(!testlook!(look, "ð›ƒð†€", 2)); - assert!(!testlook!(look, "ð›ƒð†€", 3)); - assert!(!testlook!(look, "ð›ƒð†€", 5)); - assert!(!testlook!(look, "ð›ƒð†€", 6)); - assert!(!testlook!(look, "ð›ƒð†€", 7)); - assert!(!testlook!(look, "ð›ƒð†€", 8)); - } - - #[test] - fn look_matches_word_start_half_ascii() { - let look = Look::WordStartHalfAscii; - - // \xF0\x9D\x9B\x83 = 𛃠(in \w) - // \xF0\x90\x86\x80 = ð†€ (not in \w) - - // Simple ASCII word boundaries. - assert!(testlook!(look, "a", 0)); - assert!(!testlook!(look, "a", 1)); - assert!(!testlook!(look, "a ", 1)); - assert!(testlook!(look, " a ", 1)); - assert!(!testlook!(look, " a ", 2)); - - // Unicode word boundaries with a non-ASCII codepoint. Since this is - // an ASCII word boundary, none of these match. - assert!(testlook!(look, "ð›ƒ", 0)); - assert!(testlook!(look, "ð›ƒ", 4)); - assert!(testlook!(look, "𛃠", 4)); - assert!(testlook!(look, " 𛃠", 1)); - assert!(testlook!(look, " 𛃠", 5)); - - // Unicode word boundaries between non-ASCII codepoints. Again, since - // this is an ASCII word boundary, none of these match. - assert!(testlook!(look, "ð›ƒð†€", 0)); - assert!(testlook!(look, "ð›ƒð†€", 4)); - - // Non word boundaries for ASCII. - assert!(testlook!(look, "", 0)); - assert!(!testlook!(look, "ab", 1)); - assert!(testlook!(look, "a ", 2)); - assert!(testlook!(look, " a ", 0)); - assert!(testlook!(look, " a ", 3)); - - // Non word boundaries with a non-ASCII codepoint. - assert!(testlook!(look, "ð›ƒb", 4)); - assert!(!testlook!(look, "bð›ƒ", 1)); - assert!(testlook!(look, "𛃠", 5)); - assert!(testlook!(look, " 𛃠", 0)); - assert!(testlook!(look, " 𛃠", 6)); - assert!(testlook!(look, "ð›ƒ", 1)); - assert!(testlook!(look, "ð›ƒ", 2)); - assert!(testlook!(look, "ð›ƒ", 3)); - - // Non word boundaries with non-ASCII codepoints. - assert!(testlook!(look, "ð›ƒð†€", 1)); - assert!(testlook!(look, "ð›ƒð†€", 2)); - assert!(testlook!(look, "ð›ƒð†€", 3)); - assert!(testlook!(look, "ð›ƒð†€", 5)); - assert!(testlook!(look, "ð›ƒð†€", 6)); - assert!(testlook!(look, "ð›ƒð†€", 7)); - assert!(testlook!(look, "ð›ƒð†€", 8)); - } - - #[test] - fn look_matches_word_end_half_ascii() { - let look = Look::WordEndHalfAscii; - - // \xF0\x9D\x9B\x83 = 𛃠(in \w) - // \xF0\x90\x86\x80 = ð†€ (not in \w) - - // Simple ASCII word boundaries. - assert!(!testlook!(look, "a", 0)); - assert!(testlook!(look, "a", 1)); - assert!(testlook!(look, "a ", 1)); - assert!(!testlook!(look, " a ", 1)); - assert!(testlook!(look, " a ", 2)); - - // Unicode word boundaries with a non-ASCII codepoint. Since this is - // an ASCII word boundary, none of these match. - assert!(testlook!(look, "ð›ƒ", 0)); - assert!(testlook!(look, "ð›ƒ", 4)); - assert!(testlook!(look, "𛃠", 4)); - assert!(testlook!(look, " 𛃠", 1)); - assert!(testlook!(look, " 𛃠", 5)); - - // Unicode word boundaries between non-ASCII codepoints. Again, since - // this is an ASCII word boundary, none of these match. - assert!(testlook!(look, "ð›ƒð†€", 0)); - assert!(testlook!(look, "ð›ƒð†€", 4)); - - // Non word boundaries for ASCII. - assert!(testlook!(look, "", 0)); - assert!(!testlook!(look, "ab", 1)); - assert!(testlook!(look, "a ", 2)); - assert!(testlook!(look, " a ", 0)); - assert!(testlook!(look, " a ", 3)); - - // Non word boundaries with a non-ASCII codepoint. - assert!(!testlook!(look, "ð›ƒb", 4)); - assert!(testlook!(look, "bð›ƒ", 1)); - assert!(testlook!(look, "𛃠", 5)); - assert!(testlook!(look, " 𛃠", 0)); - assert!(testlook!(look, " 𛃠", 6)); - assert!(testlook!(look, "ð›ƒ", 1)); - assert!(testlook!(look, "ð›ƒ", 2)); - assert!(testlook!(look, "ð›ƒ", 3)); - - // Non word boundaries with non-ASCII codepoints. - assert!(testlook!(look, "ð›ƒð†€", 1)); - assert!(testlook!(look, "ð›ƒð†€", 2)); - assert!(testlook!(look, "ð›ƒð†€", 3)); - assert!(testlook!(look, "ð›ƒð†€", 5)); - assert!(testlook!(look, "ð›ƒð†€", 6)); - assert!(testlook!(look, "ð›ƒð†€", 7)); - assert!(testlook!(look, "ð›ƒð†€", 8)); - } - - #[test] - #[cfg(all(not(miri), feature = "unicode-word-boundary"))] - fn look_matches_word_start_half_unicode() { - let look = Look::WordStartHalfUnicode; - - // \xF0\x9D\x9B\x83 = 𛃠(in \w) - // \xF0\x90\x86\x80 = ð†€ (not in \w) - - // Simple ASCII word boundaries. - assert!(testlook!(look, "a", 0)); - assert!(!testlook!(look, "a", 1)); - assert!(!testlook!(look, "a ", 1)); - assert!(testlook!(look, " a ", 1)); - assert!(!testlook!(look, " a ", 2)); - - // Unicode word boundaries with a non-ASCII codepoint. - assert!(testlook!(look, "ð›ƒ", 0)); - assert!(!testlook!(look, "ð›ƒ", 4)); - assert!(!testlook!(look, "𛃠", 4)); - assert!(testlook!(look, " 𛃠", 1)); - assert!(!testlook!(look, " 𛃠", 5)); - - // Unicode word boundaries between non-ASCII codepoints. - assert!(testlook!(look, "ð›ƒð†€", 0)); - assert!(!testlook!(look, "ð›ƒð†€", 4)); - - // Non word boundaries for ASCII. - assert!(testlook!(look, "", 0)); - assert!(!testlook!(look, "ab", 1)); - assert!(testlook!(look, "a ", 2)); - assert!(testlook!(look, " a ", 0)); - assert!(testlook!(look, " a ", 3)); - - // Non word boundaries with a non-ASCII codepoint. - assert!(!testlook!(look, "ð›ƒb", 4)); - assert!(!testlook!(look, "bð›ƒ", 1)); - assert!(testlook!(look, "𛃠", 5)); - assert!(testlook!(look, " 𛃠", 0)); - assert!(testlook!(look, " 𛃠", 6)); - assert!(!testlook!(look, "ð›ƒ", 1)); - assert!(!testlook!(look, "ð›ƒ", 2)); - assert!(!testlook!(look, "ð›ƒ", 3)); - - // Non word boundaries with non-ASCII codepoints. - assert!(!testlook!(look, "ð›ƒð†€", 1)); - assert!(!testlook!(look, "ð›ƒð†€", 2)); - assert!(!testlook!(look, "ð›ƒð†€", 3)); - assert!(!testlook!(look, "ð›ƒð†€", 5)); - assert!(!testlook!(look, "ð›ƒð†€", 6)); - assert!(!testlook!(look, "ð›ƒð†€", 7)); - assert!(testlook!(look, "ð›ƒð†€", 8)); - } - - #[test] - #[cfg(all(not(miri), feature = "unicode-word-boundary"))] - fn look_matches_word_end_half_unicode() { - let look = Look::WordEndHalfUnicode; - - // \xF0\x9D\x9B\x83 = 𛃠(in \w) - // \xF0\x90\x86\x80 = ð†€ (not in \w) - - // Simple ASCII word boundaries. - assert!(!testlook!(look, "a", 0)); - assert!(testlook!(look, "a", 1)); - assert!(testlook!(look, "a ", 1)); - assert!(!testlook!(look, " a ", 1)); - assert!(testlook!(look, " a ", 2)); - - // Unicode word boundaries with a non-ASCII codepoint. - assert!(!testlook!(look, "ð›ƒ", 0)); - assert!(testlook!(look, "ð›ƒ", 4)); - assert!(testlook!(look, "𛃠", 4)); - assert!(!testlook!(look, " 𛃠", 1)); - assert!(testlook!(look, " 𛃠", 5)); - - // Unicode word boundaries between non-ASCII codepoints. - assert!(!testlook!(look, "ð›ƒð†€", 0)); - assert!(testlook!(look, "ð›ƒð†€", 4)); - - // Non word boundaries for ASCII. - assert!(testlook!(look, "", 0)); - assert!(!testlook!(look, "ab", 1)); - assert!(testlook!(look, "a ", 2)); - assert!(testlook!(look, " a ", 0)); - assert!(testlook!(look, " a ", 3)); - - // Non word boundaries with a non-ASCII codepoint. - assert!(!testlook!(look, "ð›ƒb", 4)); - assert!(!testlook!(look, "bð›ƒ", 1)); - assert!(testlook!(look, "𛃠", 5)); - assert!(testlook!(look, " 𛃠", 0)); - assert!(testlook!(look, " 𛃠", 6)); - assert!(!testlook!(look, "ð›ƒ", 1)); - assert!(!testlook!(look, "ð›ƒ", 2)); - assert!(!testlook!(look, "ð›ƒ", 3)); - - // Non word boundaries with non-ASCII codepoints. - assert!(!testlook!(look, "ð›ƒð†€", 1)); - assert!(!testlook!(look, "ð›ƒð†€", 2)); - assert!(!testlook!(look, "ð›ƒð†€", 3)); - assert!(!testlook!(look, "ð›ƒð†€", 5)); - assert!(!testlook!(look, "ð›ƒð†€", 6)); - assert!(!testlook!(look, "ð›ƒð†€", 7)); - assert!(testlook!(look, "ð›ƒð†€", 8)); - } - - #[test] - fn look_set() { - let mut f = LookSet::default(); - assert!(!f.contains(Look::Start)); - assert!(!f.contains(Look::End)); - assert!(!f.contains(Look::StartLF)); - assert!(!f.contains(Look::EndLF)); - assert!(!f.contains(Look::WordUnicode)); - assert!(!f.contains(Look::WordUnicodeNegate)); - assert!(!f.contains(Look::WordAscii)); - assert!(!f.contains(Look::WordAsciiNegate)); - - f = f.insert(Look::Start); - assert!(f.contains(Look::Start)); - f = f.remove(Look::Start); - assert!(!f.contains(Look::Start)); - - f = f.insert(Look::End); - assert!(f.contains(Look::End)); - f = f.remove(Look::End); - assert!(!f.contains(Look::End)); - - f = f.insert(Look::StartLF); - assert!(f.contains(Look::StartLF)); - f = f.remove(Look::StartLF); - assert!(!f.contains(Look::StartLF)); - - f = f.insert(Look::EndLF); - assert!(f.contains(Look::EndLF)); - f = f.remove(Look::EndLF); - assert!(!f.contains(Look::EndLF)); - - f = f.insert(Look::StartCRLF); - assert!(f.contains(Look::StartCRLF)); - f = f.remove(Look::StartCRLF); - assert!(!f.contains(Look::StartCRLF)); - - f = f.insert(Look::EndCRLF); - assert!(f.contains(Look::EndCRLF)); - f = f.remove(Look::EndCRLF); - assert!(!f.contains(Look::EndCRLF)); + f = f.insert(Look::EndCRLF); + assert!(f.contains(Look::EndCRLF)); + f = f.remove(Look::EndCRLF); + assert!(!f.contains(Look::EndCRLF)); f = f.insert(Look::WordUnicode); assert!(f.contains(Look::WordUnicode)); @@ -2472,46 +1716,6 @@ assert!(f.contains(Look::WordAsciiNegate)); f = f.remove(Look::WordAsciiNegate); assert!(!f.contains(Look::WordAsciiNegate)); - - f = f.insert(Look::WordStartAscii); - assert!(f.contains(Look::WordStartAscii)); - f = f.remove(Look::WordStartAscii); - assert!(!f.contains(Look::WordStartAscii)); - - f = f.insert(Look::WordEndAscii); - assert!(f.contains(Look::WordEndAscii)); - f = f.remove(Look::WordEndAscii); - assert!(!f.contains(Look::WordEndAscii)); - - f = f.insert(Look::WordStartUnicode); - assert!(f.contains(Look::WordStartUnicode)); - f = f.remove(Look::WordStartUnicode); - assert!(!f.contains(Look::WordStartUnicode)); - - f = f.insert(Look::WordEndUnicode); - assert!(f.contains(Look::WordEndUnicode)); - f = f.remove(Look::WordEndUnicode); - assert!(!f.contains(Look::WordEndUnicode)); - - f = f.insert(Look::WordStartHalfAscii); - assert!(f.contains(Look::WordStartHalfAscii)); - f = f.remove(Look::WordStartHalfAscii); - assert!(!f.contains(Look::WordStartHalfAscii)); - - f = f.insert(Look::WordEndHalfAscii); - assert!(f.contains(Look::WordEndHalfAscii)); - f = f.remove(Look::WordEndHalfAscii); - assert!(!f.contains(Look::WordEndHalfAscii)); - - f = f.insert(Look::WordStartHalfUnicode); - assert!(f.contains(Look::WordStartHalfUnicode)); - f = f.remove(Look::WordStartHalfUnicode); - assert!(!f.contains(Look::WordStartHalfUnicode)); - - f = f.insert(Look::WordEndHalfUnicode); - assert!(f.contains(Look::WordEndHalfUnicode)); - f = f.remove(Look::WordEndHalfUnicode); - assert!(!f.contains(Look::WordEndHalfUnicode)); } #[test] @@ -2520,7 +1724,7 @@ assert_eq!(0, set.iter().count()); let set = LookSet::full(); - assert_eq!(18, set.iter().count()); + assert_eq!(10, set.iter().count()); let set = LookSet::empty().insert(Look::StartLF).insert(Look::WordUnicode); @@ -2531,9 +1735,6 @@ let set = LookSet::empty().insert(Look::WordAsciiNegate); assert_eq!(1, set.iter().count()); - - let set = LookSet::empty().insert(Look::WordEndHalfUnicode); - assert_eq!(1, set.iter().count()); } #[test] @@ -2542,6 +1743,6 @@ let res = alloc::format!("{:?}", LookSet::empty()); assert_eq!("∅", res); let res = alloc::format!("{:?}", LookSet::full()); - assert_eq!("Az^$rRbBð›ƒðš©<>〈〉â—▷◀▶", res); + assert_eq!("Az^$rRbBð›ƒðš©", res); } } diff -Nru temporalio-1.3.0/vendor/regex-automata/src/util/mod.rs temporalio-1.3.0/vendor/regex-automata/src/util/mod.rs --- temporalio-1.3.0/vendor/regex-automata/src/util/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/regex-automata/src/util/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -40,7 +40,6 @@ pub mod pool; pub mod prefilter; pub mod primitives; -pub mod start; #[cfg(feature = "syntax")] pub mod syntax; pub mod wire; @@ -53,5 +52,6 @@ pub(crate) mod search; #[cfg(feature = "alloc")] pub(crate) mod sparse_set; +pub(crate) mod start; pub(crate) mod unicode_data; pub(crate) mod utf8; diff -Nru temporalio-1.3.0/vendor/regex-automata/src/util/pool.rs temporalio-1.3.0/vendor/regex-automata/src/util/pool.rs --- temporalio-1.3.0/vendor/regex-automata/src/util/pool.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/regex-automata/src/util/pool.rs 2023-10-30 19:40:00.000000000 +0000 @@ -177,7 +177,6 @@ /// the value to go back into the pool) and then calling get again is /// *not* guaranteed to return the same value received in the first `get` /// call. - #[inline] pub fn get(&self) -> PoolGuard<'_, T, F> { PoolGuard(self.0.get()) } @@ -201,7 +200,6 @@ /// This circumvents the guard's `Drop` implementation. This can be useful /// in circumstances where the automatic `Drop` results in poorer codegen, /// such as calling non-inlined functions. - #[inline] pub fn put(this: PoolGuard<'_, T, F>) { inner::PoolGuard::put(this.0); } @@ -210,14 +208,12 @@ impl<'a, T: Send, F: Fn() -> T> core::ops::Deref for PoolGuard<'a, T, F> { type Target = T; - #[inline] fn deref(&self) -> &T { self.0.value() } } impl<'a, T: Send, F: Fn() -> T> core::ops::DerefMut for PoolGuard<'a, T, F> { - #[inline] fn deref_mut(&mut self) -> &mut T { self.0.value_mut() } @@ -272,64 +268,6 @@ /// do. static THREAD_ID_DROPPED: usize = 2; - /// The number of stacks we use inside of the pool. These are only used for - /// non-owners. That is, these represent the "slow" path. - /// - /// In the original implementation of this pool, we only used a single - /// stack. While this might be okay for a couple threads, the prevalence of - /// 32, 64 and even 128 core CPUs has made it untenable. The contention - /// such an environment introduces when threads are doing a lot of searches - /// on short haystacks (a not uncommon use case) is palpable and leads to - /// huge slowdowns. - /// - /// This constant reflects a change from using one stack to the number of - /// stacks that this constant is set to. The stack for a particular thread - /// is simply chosen by `thread_id % MAX_POOL_STACKS`. The idea behind - /// this setup is that there should be a good chance that accesses to the - /// pool will be distributed over several stacks instead of all of them - /// converging to one. - /// - /// This is not a particularly smart or dynamic strategy. Fixing this to a - /// specific number has at least two downsides. First is that it will help, - /// say, an 8 core CPU more than it will a 128 core CPU. (But, crucially, - /// it will still help the 128 core case.) Second is that this may wind - /// up being a little wasteful with respect to memory usage. Namely, if a - /// regex is used on one thread and then moved to another thread, then it - /// could result in creating a new copy of the data in the pool even though - /// only one is actually needed. - /// - /// And that memory usage bit is why this is set to 8 and not, say, 64. - /// Keeping it at 8 limits, to an extent, how much unnecessary memory can - /// be allocated. - /// - /// In an ideal world, we'd be able to have something like this: - /// - /// * Grow the number of stacks as the number of concurrent callers - /// increases. I spent a little time trying this, but even just adding an - /// atomic addition/subtraction for each pop/push for tracking concurrent - /// callers led to a big perf hit. Since even more work would seemingly be - /// required than just an addition/subtraction, I abandoned this approach. - /// * The maximum amount of memory used should scale with respect to the - /// number of concurrent callers and *not* the total number of existing - /// threads. This is primarily why the `thread_local` crate isn't used, as - /// as some environments spin up a lot of threads. This led to multiple - /// reports of extremely high memory usage (often described as memory - /// leaks). - /// * Even more ideally, the pool should contract in size. That is, it - /// should grow with bursts and then shrink. But this is a pretty thorny - /// issue to tackle and it might be better to just not. - /// * It would be nice to explore the use of, say, a lock-free stack - /// instead of using a mutex to guard a `Vec` that is ultimately just - /// treated as a stack. The main thing preventing me from exploring this - /// is the ABA problem. The `crossbeam` crate has tools for dealing with - /// this sort of problem (via its epoch based memory reclamation strategy), - /// but I can't justify bringing in all of `crossbeam` as a dependency of - /// `regex` for this. - /// - /// See this issue for more context and discussion: - /// https://github.com/rust-lang/regex/issues/934 - const MAX_POOL_STACKS: usize = 8; - thread_local!( /// A thread local used to assign an ID to a thread. static THREAD_ID: usize = { @@ -353,17 +291,6 @@ }; ); - /// This puts each stack in the pool below into its own cache line. This is - /// an absolutely critical optimization that tends to have the most impact - /// in high contention workloads. Without forcing each mutex protected - /// into its own cache line, high contention exacerbates the performance - /// problem by causing "false sharing." By putting each mutex in its own - /// cache-line, we avoid the false sharing problem and the affects of - /// contention are greatly reduced. - #[derive(Debug)] - #[repr(C, align(64))] - struct CacheLine(T); - /// A thread safe pool utilizing std-only features. /// /// The main difference between this and the simplistic alloc-only pool is @@ -372,16 +299,12 @@ /// This makes the common case of running a regex within a single thread /// faster by avoiding mutex unlocking. pub(super) struct Pool { + /// A stack of T values to hand out. These are used when a Pool is + /// accessed by a thread that didn't create it. + stack: Mutex>>, /// A function to create more T values when stack is empty and a caller /// has requested a T. create: F, - /// Multiple stacks of T values to hand out. These are used when a Pool - /// is accessed by a thread that didn't create it. - /// - /// Conceptually this is `Mutex>>`, but sharded out to make - /// it scale better under high contention work-loads. We index into - /// this sequence via `thread_id % stacks.len()`. - stacks: Vec>>>>, /// The ID of the thread that owns this pool. The owner is the thread /// that makes the first call to 'get'. When the owner calls 'get', it /// gets 'owner_val' directly instead of returning a T from 'stack'. @@ -431,17 +354,9 @@ unsafe impl Sync for Pool {} // If T is UnwindSafe, then since we provide exclusive access to any - // particular value in the pool, the pool should therefore also be - // considered UnwindSafe. - // - // We require `F: UnwindSafe + RefUnwindSafe` because we call `F` at any - // point on demand, so it needs to be unwind safe on both dimensions for - // the entire Pool to be unwind safe. - impl UnwindSafe for Pool {} - - // If T is UnwindSafe, then since we provide exclusive access to any - // particular value in the pool, the pool should therefore also be - // considered RefUnwindSafe. + // particular value in the pool, it should therefore also be considered + // RefUnwindSafe. Also, since we use std::sync::Mutex, we get poisoning + // from it if another thread panics while the lock is held. // // We require `F: UnwindSafe + RefUnwindSafe` because we call `F` at any // point on demand, so it needs to be unwind safe on both dimensions for @@ -455,58 +370,20 @@ /// Create a new pool. The given closure is used to create values in /// the pool when necessary. pub(super) fn new(create: F) -> Pool { - // FIXME: Now that we require 1.65+, Mutex::new is available as - // const... So we can almost mark this function as const. But of - // course, we're creating a Vec of stacks below (we didn't when I - // originally wrote this code). It seems like the best way to work - // around this would be to use a `[Stack; MAX_POOL_STACKS]` instead - // of a `Vec`. I refrained from making this change at time - // of writing (2023/10/08) because I was making a lot of other - // changes at the same time and wanted to do this more carefully. - // Namely, because of the cache line optimization, that `[Stack; - // MAX_POOL_STACKS]` would be quite big. It's unclear how bad (if - // at all) that would be. - // - // Another choice would be to lazily allocate the stacks, but... - // I'm not so sure about that. Seems like a fair bit of complexity? - // - // Maybe there's a simple solution I'm missing. - // - // ... OK, I tried to fix this. First, I did it by putting `stacks` - // in an `UnsafeCell` and using a `Once` to lazily initialize it. - // I benchmarked it and everything looked okay. I then made this - // function `const` and thought I was just about done. But the - // public pool type wraps its inner pool in a `Box` to keep its - // size down. Blech. - // - // So then I thought that I could push the box down into this - // type (and leave the non-std version unboxed) and use the same - // `UnsafeCell` technique to lazily initialize it. This has the - // downside of the `Once` now needing to get hit in the owner fast - // path, but maybe that's OK? However, I then realized that we can - // only lazily initialize `stacks`, `owner` and `owner_val`. The - // `create` function needs to be put somewhere outside of the box. - // So now the pool is a `Box`, `Once` and a function. Now we're - // starting to defeat the point of boxing in the first place. So I - // backed out that change too. - // - // Back to square one. I maybe we just don't make a pool's - // constructor const and live with it. It's probably not a huge - // deal. - let mut stacks = Vec::with_capacity(MAX_POOL_STACKS); - for _ in 0..stacks.capacity() { - stacks.push(CacheLine(Mutex::new(vec![]))); - } + // MSRV(1.63): Mark this function as 'const'. I've arranged the + // code such that it should "just work." Then mark the public + // 'Pool::new' method as 'const' too. (The alloc-only Pool::new + // is already 'const', so that should "just work" too.) The only + // thing we're waiting for is Mutex::new to be const. let owner = AtomicUsize::new(THREAD_ID_UNOWNED); let owner_val = UnsafeCell::new(None); // init'd on first access - Pool { create, stacks, owner, owner_val } + Pool { stack: Mutex::new(vec![]), create, owner, owner_val } } } impl T> Pool { /// Get a value from the pool. This may block if another thread is also /// attempting to retrieve a value from the pool. - #[inline] pub(super) fn get(&self) -> PoolGuard<'_, T, F> { // Our fast path checks if the caller is the thread that "owns" // this pool. Or stated differently, whether it is the first thread @@ -524,9 +401,6 @@ let caller = THREAD_ID.with(|id| *id); let owner = self.owner.load(Ordering::Acquire); if caller == owner { - // N.B. We could also do a CAS here instead of a load/store, - // but ad hoc benchmarking suggests it is slower. And a lot - // slower in the case where `get_slow` is common. self.owner.store(THREAD_ID_INUSE, Ordering::Release); return self.guard_owned(caller); } @@ -570,86 +444,37 @@ return self.guard_owned(caller); } } - let stack_id = caller % self.stacks.len(); - // We try to acquire exclusive access to this thread's stack, and - // if so, grab a value from it if we can. We put this in a loop so - // that it's easy to tweak and experiment with a different number - // of tries. In the end, I couldn't see anything obviously better - // than one attempt in ad hoc testing. - for _ in 0..1 { - let mut stack = match self.stacks[stack_id].0.try_lock() { - Err(_) => continue, - Ok(stack) => stack, - }; - if let Some(value) = stack.pop() { - return self.guard_stack(value); - } - // Unlock the mutex guarding the stack before creating a fresh - // value since we no longer need the stack. - drop(stack); - let value = Box::new((self.create)()); - return self.guard_stack(value); - } - // We're only here if we could get access to our stack, so just - // create a new value. This seems like it could be wasteful, but - // waiting for exclusive access to a stack when there's high - // contention is brutal for perf. - self.guard_stack_transient(Box::new((self.create)())) + let mut stack = self.stack.lock().unwrap(); + let value = match stack.pop() { + None => Box::new((self.create)()), + Some(value) => value, + }; + self.guard_stack(value) } /// Puts a value back into the pool. Callers don't need to call this. /// Once the guard that's returned by 'get' is dropped, it is put back /// into the pool automatically. - #[inline] fn put_value(&self, value: Box) { - let caller = THREAD_ID.with(|id| *id); - let stack_id = caller % self.stacks.len(); - // As with trying to pop a value from this thread's stack, we - // merely attempt to get access to push this value back on the - // stack. If there's too much contention, we just give up and throw - // the value away. - // - // Interestingly, in ad hoc benchmarking, it is beneficial to - // attempt to push the value back more than once, unlike when - // popping the value. I don't have a good theory for why this is. - // I guess if we drop too many values then that winds up forcing - // the pop operation to create new fresh values and thus leads to - // less reuse. There's definitely a balancing act here. - for _ in 0..10 { - let mut stack = match self.stacks[stack_id].0.try_lock() { - Err(_) => continue, - Ok(stack) => stack, - }; - stack.push(value); - return; - } + let mut stack = self.stack.lock().unwrap(); + stack.push(value); } /// Create a guard that represents the special owned T. - #[inline] fn guard_owned(&self, caller: usize) -> PoolGuard<'_, T, F> { - PoolGuard { pool: self, value: Err(caller), discard: false } + PoolGuard { pool: self, value: Err(caller) } } /// Create a guard that contains a value from the pool's stack. - #[inline] fn guard_stack(&self, value: Box) -> PoolGuard<'_, T, F> { - PoolGuard { pool: self, value: Ok(value), discard: false } - } - - /// Create a guard that contains a value from the pool's stack with an - /// instruction to throw away the value instead of putting it back - /// into the pool. - #[inline] - fn guard_stack_transient(&self, value: Box) -> PoolGuard<'_, T, F> { - PoolGuard { pool: self, value: Ok(value), discard: true } + PoolGuard { pool: self, value: Ok(value) } } } impl core::fmt::Debug for Pool { fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { f.debug_struct("Pool") - .field("stacks", &self.stacks) + .field("stack", &self.stack) .field("owner", &self.owner) .field("owner_val", &self.owner_val) .finish() @@ -665,17 +490,10 @@ /// in the special case of `Err(THREAD_ID_DROPPED)`, it means the /// guard has been put back into the pool and should no longer be used. value: Result, usize>, - /// When true, the value should be discarded instead of being pushed - /// back into the pool. We tend to use this under high contention, and - /// this allows us to avoid inflating the size of the pool. (Because - /// under contention, we tend to create more values instead of waiting - /// for access to a stack of existing values.) - discard: bool, } impl<'a, T: Send, F: Fn() -> T> PoolGuard<'a, T, F> { /// Return the underlying value. - #[inline] pub(super) fn value(&self) -> &T { match self.value { Ok(ref v) => &**v, @@ -700,7 +518,6 @@ } /// Return the underlying value as a mutable borrow. - #[inline] pub(super) fn value_mut(&mut self) -> &mut T { match self.value { Ok(ref mut v) => &mut **v, @@ -725,7 +542,6 @@ } /// Consumes this guard and puts it back into the pool. - #[inline] pub(super) fn put(this: PoolGuard<'_, T, F>) { // Since this is effectively consuming the guard and putting the // value back into the pool, there's no reason to run its Drop @@ -741,17 +557,7 @@ #[inline(always)] fn put_imp(&mut self) { match core::mem::replace(&mut self.value, Err(THREAD_ID_DROPPED)) { - Ok(value) => { - // If we were told to discard this value then don't bother - // trying to put it back into the pool. This occurs when - // the pop operation failed to acquire a lock and we - // decided to create a new value in lieu of contending for - // the lock. - if self.discard { - return; - } - self.pool.put_value(value); - } + Ok(value) => self.pool.put_value(value), // If this guard has a value "owned" by the thread, then // the Pool guarantees that this is the ONLY such guard. // Therefore, in order to place it back into the pool and make @@ -774,7 +580,6 @@ } impl<'a, T: Send, F: Fn() -> T> Drop for PoolGuard<'a, T, F> { - #[inline] fn drop(&mut self) { self.put_imp(); } @@ -852,7 +657,6 @@ impl T> Pool { /// Get a value from the pool. This may block if another thread is also /// attempting to retrieve a value from the pool. - #[inline] pub(super) fn get(&self) -> PoolGuard<'_, T, F> { let mut stack = self.stack.lock(); let value = match stack.pop() { @@ -862,7 +666,6 @@ PoolGuard { pool: self, value: Some(value) } } - #[inline] fn put(&self, guard: PoolGuard<'_, T, F>) { let mut guard = core::mem::ManuallyDrop::new(guard); if let Some(value) = guard.value.take() { @@ -873,7 +676,6 @@ /// Puts a value back into the pool. Callers don't need to call this. /// Once the guard that's returned by 'get' is dropped, it is put back /// into the pool automatically. - #[inline] fn put_value(&self, value: Box) { let mut stack = self.stack.lock(); stack.push(value); @@ -896,19 +698,16 @@ impl<'a, T: Send, F: Fn() -> T> PoolGuard<'a, T, F> { /// Return the underlying value. - #[inline] pub(super) fn value(&self) -> &T { self.value.as_deref().unwrap() } /// Return the underlying value as a mutable borrow. - #[inline] pub(super) fn value_mut(&mut self) -> &mut T { self.value.as_deref_mut().unwrap() } /// Consumes this guard and puts it back into the pool. - #[inline] pub(super) fn put(this: PoolGuard<'_, T, F>) { // Since this is effectively consuming the guard and putting the // value back into the pool, there's no reason to run its Drop @@ -930,7 +729,6 @@ } impl<'a, T: Send, F: Fn() -> T> Drop for PoolGuard<'a, T, F> { - #[inline] fn drop(&mut self) { self.put_imp(); } @@ -984,7 +782,6 @@ /// Lock this mutex and return a guard providing exclusive access to /// `T`. This blocks if some other thread has already locked this /// mutex. - #[inline] fn lock(&self) -> MutexGuard<'_, T> { while self .locked @@ -1017,21 +814,18 @@ impl<'a, T> core::ops::Deref for MutexGuard<'a, T> { type Target = T; - #[inline] fn deref(&self) -> &T { self.data } } impl<'a, T> core::ops::DerefMut for MutexGuard<'a, T> { - #[inline] fn deref_mut(&mut self) -> &mut T { self.data } } impl<'a, T> Drop for MutexGuard<'a, T> { - #[inline] fn drop(&mut self) { // Drop means 'data' is no longer accessible, so we can unlock // the mutex. diff -Nru temporalio-1.3.0/vendor/regex-automata/src/util/prefilter/aho_corasick.rs temporalio-1.3.0/vendor/regex-automata/src/util/prefilter/aho_corasick.rs --- temporalio-1.3.0/vendor/regex-automata/src/util/prefilter/aho_corasick.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/regex-automata/src/util/prefilter/aho_corasick.rs 2023-10-30 19:40:00.000000000 +0000 @@ -22,20 +22,11 @@ } #[cfg(feature = "perf-literal-multisubstring")] { - // We used to use `aho_corasick::MatchKind::Standard` here when - // `kind` was `MatchKind::All`, but this is not correct. The - // "standard" Aho-Corasick match semantics are to report a match - // immediately as soon as it is seen, but `All` isn't like that. - // In particular, with "standard" semantics, given the needles - // "abc" and "b" and the haystack "abc," it would report a match - // at offset 1 before a match at offset 0. This is never what we - // want in the context of the regex engine, regardless of whether - // we have leftmost-first or 'all' semantics. Namely, we always - // want the leftmost match. let ac_match_kind = match kind { - MatchKind::LeftmostFirst | MatchKind::All => { + MatchKind::LeftmostFirst => { aho_corasick::MatchKind::LeftmostFirst } + MatchKind::All => aho_corasick::MatchKind::Standard, }; // This is kind of just an arbitrary number, but basically, if we // have a small enough set of literals, then we try to use the VERY diff -Nru temporalio-1.3.0/vendor/regex-automata/src/util/prefilter/mod.rs temporalio-1.3.0/vendor/regex-automata/src/util/prefilter/mod.rs --- temporalio-1.3.0/vendor/regex-automata/src/util/prefilter/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/regex-automata/src/util/prefilter/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -195,6 +195,15 @@ /// Some(Span::from(6..9)), /// pre.find(hay.as_bytes(), Span::from(0..hay.len())), /// ); + /// // Now we put 'samwise' back before 'sam', but change the match + /// // semantics to 'All'. In this case, there is no preference + /// // order semantics and the first match detected is returned. + /// let pre = Prefilter::new(MatchKind::All, &["samwise", "sam"]) + /// .expect("a prefilter"); + /// assert_eq!( + /// Some(Span::from(6..9)), + /// pre.find(hay.as_bytes(), Span::from(0..hay.len())), + /// ); /// /// # Ok::<(), Box>(()) /// ``` diff -Nru temporalio-1.3.0/vendor/regex-automata/src/util/prefilter/teddy.rs temporalio-1.3.0/vendor/regex-automata/src/util/prefilter/teddy.rs --- temporalio-1.3.0/vendor/regex-automata/src/util/prefilter/teddy.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/regex-automata/src/util/prefilter/teddy.rs 2023-10-30 19:40:00.000000000 +0000 @@ -50,17 +50,12 @@ // theory we could at least support leftmost-longest, as the // aho-corasick crate does, but regex-automata doesn't know about // leftmost-longest currently. - // - // And like the aho-corasick prefilter, if we're using `All` - // semantics, then we can still use leftmost semantics for a - // prefilter. (This might be a suspicious choice for the literal - // engine, which uses a prefilter as a regex engine directly, but - // that only happens when using leftmost-first semantics.) let (packed_match_kind, ac_match_kind) = match kind { - MatchKind::LeftmostFirst | MatchKind::All => ( + MatchKind::LeftmostFirst => ( aho_corasick::packed::MatchKind::LeftmostFirst, aho_corasick::MatchKind::LeftmostFirst, ), + _ => return None, }; let minimum_len = needles.iter().map(|n| n.as_ref().len()).min().unwrap_or(0); diff -Nru temporalio-1.3.0/vendor/regex-automata/src/util/start.rs temporalio-1.3.0/vendor/regex-automata/src/util/start.rs --- temporalio-1.3.0/vendor/regex-automata/src/util/start.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/regex-automata/src/util/start.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,195 +1,17 @@ /*! -Provides helpers for dealing with start state configurations in DFAs. +Provides some helpers for dealing with start state configurations in DFAs. + +[`Start`] represents the possible starting configurations, while +[`StartByteMap`] represents a way to retrieve the `Start` configuration for a +given position in a haystack. */ use crate::util::{ look::LookMatcher, - search::{Anchored, Input}, + search::Input, wire::{self, DeserializeError, SerializeError}, }; -/// The configuration used to determine a DFA's start state for a search. -/// -/// A DFA has a single starting state in the typical textbook description. That -/// is, it corresponds to the set of all starting states for the NFA that built -/// it, along with their espsilon closures. In this crate, however, DFAs have -/// many possible start states due to a few factors: -/// -/// * DFAs support the ability to run either anchored or unanchored searches. -/// Each type of search needs its own start state. For example, an unanchored -/// search requires starting at a state corresponding to a regex with a -/// `(?s-u:.)*?` prefix, which will match through anything. -/// * DFAs also optionally support starting an anchored search for any one -/// specific pattern. Each such pattern requires its own start state. -/// * If a look-behind assertion like `^` or `\b` is used in the regex, then -/// the DFA will need to inspect a single byte immediately before the start of -/// the search to choose the correct start state. -/// -/// Indeed, this configuration precisely encapsulates all of the above factors. -/// The [`Config::anchored`] method sets which kind of anchored search to -/// perform while the [`Config::look_behind`] method provides a way to set -/// the byte that occurs immediately before the start of the search. -/// -/// Generally speaking, this type is only useful when you want to run searches -/// without using an [`Input`]. In particular, an `Input` wants a haystack -/// slice, but callers may not have a contiguous sequence of bytes as a -/// haystack in all cases. This type provides a lower level of control such -/// that callers can provide their own anchored configuration and look-behind -/// byte explicitly. -/// -/// # Example -/// -/// This shows basic usage that permits running a search with a DFA without -/// using the `Input` abstraction. -/// -/// ``` -/// use regex_automata::{ -/// dfa::{Automaton, dense}, -/// util::start, -/// Anchored, -/// }; -/// -/// let dfa = dense::DFA::new(r"(?-u)\b\w+\b")?; -/// let haystack = "quartz"; -/// -/// let config = start::Config::new().anchored(Anchored::Yes); -/// let mut state = dfa.start_state(&config)?; -/// for &b in haystack.as_bytes().iter() { -/// state = dfa.next_state(state, b); -/// } -/// state = dfa.next_eoi_state(state); -/// assert!(dfa.is_match_state(state)); -/// -/// # Ok::<(), Box>(()) -/// ``` -/// -/// This example shows how to correctly run a search that doesn't begin at -/// the start of a haystack. Notice how we set the look-behind byte, and as -/// a result, the `\b` assertion does not match. -/// -/// ``` -/// use regex_automata::{ -/// dfa::{Automaton, dense}, -/// util::start, -/// Anchored, -/// }; -/// -/// let dfa = dense::DFA::new(r"(?-u)\b\w+\b")?; -/// let haystack = "quartz"; -/// -/// let config = start::Config::new() -/// .anchored(Anchored::Yes) -/// .look_behind(Some(b'q')); -/// let mut state = dfa.start_state(&config)?; -/// for &b in haystack.as_bytes().iter().skip(1) { -/// state = dfa.next_state(state, b); -/// } -/// state = dfa.next_eoi_state(state); -/// // No match! -/// assert!(!dfa.is_match_state(state)); -/// -/// # Ok::<(), Box>(()) -/// ``` -/// -/// If we had instead not set a look-behind byte, then the DFA would assume -/// that it was starting at the beginning of the haystack, and thus `\b` should -/// match. This in turn would result in erroneously reporting a match: -/// -/// ``` -/// use regex_automata::{ -/// dfa::{Automaton, dense}, -/// util::start, -/// Anchored, -/// }; -/// -/// let dfa = dense::DFA::new(r"(?-u)\b\w+\b")?; -/// let haystack = "quartz"; -/// -/// // Whoops, forgot the look-behind byte... -/// let config = start::Config::new().anchored(Anchored::Yes); -/// let mut state = dfa.start_state(&config)?; -/// for &b in haystack.as_bytes().iter().skip(1) { -/// state = dfa.next_state(state, b); -/// } -/// state = dfa.next_eoi_state(state); -/// // And now we get a match unexpectedly. -/// assert!(dfa.is_match_state(state)); -/// -/// # Ok::<(), Box>(()) -/// ``` -#[derive(Clone, Debug)] -pub struct Config { - look_behind: Option, - anchored: Anchored, -} - -impl Config { - /// Create a new default start configuration. - /// - /// The default is an unanchored search that starts at the beginning of the - /// haystack. - pub fn new() -> Config { - Config { anchored: Anchored::No, look_behind: None } - } - - /// A convenience routine for building a start configuration from an - /// [`Input`] for a forward search. - /// - /// This automatically sets the look-behind byte to the byte immediately - /// preceding the start of the search. If the start of the search is at - /// offset `0`, then no look-behind byte is set. - pub fn from_input_forward(input: &Input<'_>) -> Config { - let look_behind = input - .start() - .checked_sub(1) - .and_then(|i| input.haystack().get(i).copied()); - Config { look_behind, anchored: input.get_anchored() } - } - - /// A convenience routine for building a start configuration from an - /// [`Input`] for a reverse search. - /// - /// This automatically sets the look-behind byte to the byte immediately - /// following the end of the search. If the end of the search is at - /// offset `haystack.len()`, then no look-behind byte is set. - pub fn from_input_reverse(input: &Input<'_>) -> Config { - let look_behind = input.haystack().get(input.end()).copied(); - Config { look_behind, anchored: input.get_anchored() } - } - - /// Set the look-behind byte at the start of a search. - /// - /// Unless the search is intended to logically start at the beginning of a - /// haystack, this should _always_ be set to the byte immediately preceding - /// the start of the search. If no look-behind byte is set, then the start - /// configuration will assume it is at the beginning of the haystack. For - /// example, the anchor `^` will match. - /// - /// The default is that no look-behind byte is set. - pub fn look_behind(mut self, byte: Option) -> Config { - self.look_behind = byte; - self - } - - /// Set the anchored mode of a search. - /// - /// The default is an unanchored search. - pub fn anchored(mut self, mode: Anchored) -> Config { - self.anchored = mode; - self - } - - /// Return the look-behind byte in this configuration, if one exists. - pub fn get_look_behind(&self) -> Option { - self.look_behind - } - - /// Return the anchored mode in this configuration. - pub fn get_anchored(&self) -> Anchored { - self.anchored - } -} - /// A map from every possible byte value to its corresponding starting /// configuration. /// @@ -249,11 +71,30 @@ StartByteMap { map } } - /// Return the starting configuration for the given look-behind byte. - /// - /// If no look-behind exists, callers should use `Start::Text`. + /// Return the forward starting configuration for the given `input`. + #[cfg_attr(feature = "perf-inline", inline(always))] + pub(crate) fn fwd(&self, input: &Input) -> Start { + match input + .start() + .checked_sub(1) + .and_then(|i| input.haystack().get(i)) + { + None => Start::Text, + Some(&byte) => self.get(byte), + } + } + + /// Return the reverse starting configuration for the given `input`. + #[cfg_attr(feature = "perf-inline", inline(always))] + pub(crate) fn rev(&self, input: &Input) -> Start { + match input.haystack().get(input.end()) { + None => Start::Text, + Some(&byte) => self.get(byte), + } + } + #[cfg_attr(feature = "perf-inline", inline(always))] - pub(crate) fn get(&self, byte: u8) -> Start { + fn get(&self, byte: u8) -> Start { self.map[usize::from(byte)] } @@ -412,32 +253,21 @@ #[test] fn start_fwd_done_range() { let smap = StartByteMap::new(&LookMatcher::default()); - let input = Input::new("").range(1..0); - let config = Config::from_input_forward(&input); - let start = - config.get_look_behind().map_or(Start::Text, |b| smap.get(b)); - assert_eq!(Start::Text, start); + assert_eq!(Start::Text, smap.fwd(&Input::new("").range(1..0))); } #[test] fn start_rev_done_range() { let smap = StartByteMap::new(&LookMatcher::default()); - let input = Input::new("").range(1..0); - let config = Config::from_input_reverse(&input); - let start = - config.get_look_behind().map_or(Start::Text, |b| smap.get(b)); - assert_eq!(Start::Text, start); + assert_eq!(Start::Text, smap.rev(&Input::new("").range(1..0))); } #[test] fn start_fwd() { let f = |haystack, start, end| { let smap = StartByteMap::new(&LookMatcher::default()); - let input = Input::new(haystack).range(start..end); - let config = Config::from_input_forward(&input); - let start = - config.get_look_behind().map_or(Start::Text, |b| smap.get(b)); - start + let input = &Input::new(haystack).range(start..end); + smap.fwd(input) }; assert_eq!(Start::Text, f("", 0, 0)); @@ -457,11 +287,8 @@ fn start_rev() { let f = |haystack, start, end| { let smap = StartByteMap::new(&LookMatcher::default()); - let input = Input::new(haystack).range(start..end); - let config = Config::from_input_reverse(&input); - let start = - config.get_look_behind().map_or(Start::Text, |b| smap.get(b)); - start + let input = &Input::new(haystack).range(start..end); + smap.rev(input) }; assert_eq!(Start::Text, f("", 0, 0)); diff -Nru temporalio-1.3.0/vendor/regex-automata/tests/dfa/suite.rs temporalio-1.3.0/vendor/regex-automata/tests/dfa/suite.rs --- temporalio-1.3.0/vendor/regex-automata/tests/dfa/suite.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/regex-automata/tests/dfa/suite.rs 2023-10-30 19:40:00.000000000 +0000 @@ -9,6 +9,7 @@ util::{prefilter::Prefilter, syntax}, Anchored, Input, PatternSet, }, + regex_syntax::hir, regex_test::{ CompiledRegex, Match, RegexTest, SearchKind, Span, TestResult, TestRunner, @@ -284,7 +285,10 @@ // That is, Unicode word boundaries when searching non-ASCII text. if !test.haystack().is_ascii() { for hir in hirs.iter() { - if hir.properties().look_set().contains_word_unicode() { + let looks = hir.properties().look_set(); + if looks.contains(hir::Look::WordUnicode) + || looks.contains(hir::Look::WordUnicodeNegate) + { return Ok(CompiledRegex::skip()); } } diff -Nru temporalio-1.3.0/vendor/regex-automata/tests/hybrid/api.rs temporalio-1.3.0/vendor/regex-automata/tests/hybrid/api.rs --- temporalio-1.3.0/vendor/regex-automata/tests/hybrid/api.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/regex-automata/tests/hybrid/api.rs 2023-10-30 19:40:00.000000000 +0000 @@ -55,7 +55,7 @@ let mut cache = dfa.create_cache(); let haystack = "a".repeat(101).into_bytes(); - let err = MatchError::gave_up(24); + let err = MatchError::gave_up(25); // Notice that we make the same amount of progress in each search! That's // because the cache is reused and already has states to handle the first // N bytes. @@ -83,7 +83,7 @@ // OK, if we reset the cache, then we should be able to create more states // and make more progress with searching for betas. cache.reset(&dfa); - let err = MatchError::gave_up(26); + let err = MatchError::gave_up(27); assert_eq!( Err(err), dfa.try_search_fwd(&mut cache, &Input::new(&haystack)) diff -Nru temporalio-1.3.0/vendor/regex-automata/tests/lib.rs temporalio-1.3.0/vendor/regex-automata/tests/lib.rs --- temporalio-1.3.0/vendor/regex-automata/tests/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/regex-automata/tests/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -61,7 +61,6 @@ load!("unicode"); load!("utf8"); load!("word-boundary"); - load!("word-boundary-special"); load!("fowler/basic"); load!("fowler/nullsubexpr"); load!("fowler/repetition"); diff -Nru temporalio-1.3.0/vendor/regex-syntax/.cargo-checksum.json temporalio-1.3.0/vendor/regex-syntax/.cargo-checksum.json --- temporalio-1.3.0/vendor/regex-syntax/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/regex-syntax/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"Cargo.toml":"33c96af38ed9f42d1ccbf85ecfeea1d46202943d01c595b8ee4dddef760e6bd5","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","README.md":"b2484aa7e66fb92d1378e9a7ce7605af18f77cb12c179866eaf92ba28cfec1d9","benches/bench.rs":"d2b6ae5b939abd6093064f144b981b7739d7f474ec0698a1268052fc92406635","src/ast/mod.rs":"700c2f779fccb529db7b444819d53c38f916b065d3d05a74282f929af581e8b1","src/ast/parse.rs":"fcd45146eaf747d15a2a519d34754638d451ab83e88b5962841cf7a0dd32e988","src/ast/print.rs":"99cb69ece252ef31e0be177fb3364797eb30b785f936532b8dcd8106e7be0738","src/ast/visitor.rs":"f0fdf758801fe70e6b299b73ab63196e814af95ef6eccad7ef4f72075743fcf6","src/debug.rs":"7a16cca02be9715fdc8c26a32279465774623cd12fab1ec59ac25a6e3047817f","src/either.rs":"1758e3edd056884eccadd995708d1e374ba9aa65846bd0e13b1aae852607c560","src/error.rs":"01a67e3407b0d0d869119363e47a94d92158834bfe5936366c2e3f6f4ed13f36","src/hir/interval.rs":"2358e74b4d4aabfa62f79df855fd5d183779b86c4e14aae4ee42d8695bb3d010","src/hir/literal.rs":"6a8108b8919fbfd9ab93072846124c51d2998489810fcd6e7a89fdccc45833e0","src/hir/mod.rs":"eca183b8e173f486c1a11a5fa10895c96067162c8ec936871f937ca7fca5f710","src/hir/print.rs":"ad51c515c933bfd67d307ba3d7e6ac59c9c5903b4f393a9f9a4785c92b88348d","src/hir/translate.rs":"5fbff527c53f217ba2bac9b0948d7de74164625d08674b91a479ced271159ebd","src/hir/visitor.rs":"71ca9c93aa48a5ed445399659fa6455093a1bbd9ef44b66bc7095c1b08b2ec1f","src/lib.rs":"5ae457d402e49443bdb23b71353693dd3b0d263b57a6eeb9eb5b5dae5c901bdd","src/parser.rs":"6b2f4f27e3331a01a25b87c89368dd2e54396bd425dac57941f9c1ebfd238ac8","src/rank.rs":"ff3d58b0cc5ffa69e2e8c56fc7d9ef41dd399d59a639a253a51551b858cb5bbd","src/unicode.rs":"9829458ef321b3bc22c21eae4b22805b33f8b5e67022928ffd9a9e0287bc7c31","src/unicode_tables/LICENSE-UNICODE":"74db5baf44a41b1000312c673544b3374e4198af5605c7f9080a402cec42cfa3","src/unicode_tables/age.rs":"2a2599a4e406fbbd0efd16aa6ce385c3f97b87c34820d6686a9f9113a5231c67","src/unicode_tables/case_folding_simple.rs":"9583803d4a10486da372b76979dbd26349b40766229467238eff972c1d78e47b","src/unicode_tables/general_category.rs":"36a93ba1cdeed96a00ff29a5ab5afd2c578a89541bf4dd8b18478146cebda0aa","src/unicode_tables/grapheme_cluster_break.rs":"39c388e9805a8391d3d3e69d74d831ce4fb99aa7e13e52c64dd2bd16d4765301","src/unicode_tables/mod.rs":"26c837099cd934c8062e24bc9a0aaecf15fe1de03f9c6da3f3e1e5ac3ca24bee","src/unicode_tables/perl_decimal.rs":"a98ea4afe71c2947023ae12bd25c46bf4c7de48eeb40979eca5c96ba62cee02e","src/unicode_tables/perl_space.rs":"ea2b3b84b4a48334082dadc6c37d9fcc9c9ded84b40e8f5c9c9314898638967e","src/unicode_tables/perl_word.rs":"6f1156bd6af32151ecffea4abe07a38fa04b1fc1b227ec1a8dac5d5f08d9d74b","src/unicode_tables/property_bool.rs":"0bd64f6e3228eaecf47824e238bdf1f8a9eef113ace6e790a57f045a8106701c","src/unicode_tables/property_names.rs":"5ca25437927eb70c62adf7d038e99a601cfb8a718677fd6de832589664d3c481","src/unicode_tables/property_values.rs":"5b4cc02392d382cf7af60455fc87b9980e97409b62a4b8d6c5843190d2e2d21d","src/unicode_tables/script.rs":"ea1d771b6d0a4b12d143f9bad2ea9342a0887878cbbe3c11262b6eabedaf2dd4","src/unicode_tables/script_extension.rs":"beeb8349703d903ff861beb8401bfd2599e457dc25df872e69d6ad1615f8b5e9","src/unicode_tables/sentence_break.rs":"2befe2a27cc4e8aecb624e310ef9f371462470dd3b2f572cec1f5873a5e30aa9","src/unicode_tables/word_break.rs":"94679177731b515f0c360eff394286a1f99b59527bdbc826cbf51d32f9666187","src/utf8.rs":"e9a13623a94295b81969c5483de17219ff74bb20768be13c527010351245acbd","test":"c7de5fbc0010d9b5b758cd49956375a64b88601c068167fd366808950257f108"},"package":"c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f"} \ No newline at end of file +{"files":{"Cargo.toml":"8b97ad7949a5191aa3dcd215c59e25602a417ba7296f8a722a738390775ff208","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","README.md":"b2484aa7e66fb92d1378e9a7ce7605af18f77cb12c179866eaf92ba28cfec1d9","benches/bench.rs":"d2b6ae5b939abd6093064f144b981b7739d7f474ec0698a1268052fc92406635","src/ast/mod.rs":"f3412bf62ca9976079fffbb42784491dd69215e6fa0e14340e8ad2c7bef18184","src/ast/parse.rs":"49478a4ae5b557dc46aa7071c91c7a6905a0ce62910f8c8fefce464e5779e934","src/ast/print.rs":"62d319cd0b7e6f437dc8dcaf798046a44afa03e9aeb6a384d5cffa448383af53","src/ast/visitor.rs":"e97ca0a38aaa145dd928261e8e13d1ec7a6ae37534e92a24c93ea007b0c16a7d","src/debug.rs":"7a16cca02be9715fdc8c26a32279465774623cd12fab1ec59ac25a6e3047817f","src/either.rs":"1758e3edd056884eccadd995708d1e374ba9aa65846bd0e13b1aae852607c560","src/error.rs":"01a67e3407b0d0d869119363e47a94d92158834bfe5936366c2e3f6f4ed13f36","src/hir/interval.rs":"2358e74b4d4aabfa62f79df855fd5d183779b86c4e14aae4ee42d8695bb3d010","src/hir/literal.rs":"2c8066c18ee1783343bb06ced01ca32f6b8a581ac020378965a57375c4832e88","src/hir/mod.rs":"bf2bd12c4ab6d5420e131aee193c5885d465a15f1d91d67fcf773e6c9c2a23d8","src/hir/print.rs":"c24eab0e29db7547d3d7f86b8bf19239265d6b114244f5e71a9904e7ae9e9c67","src/hir/translate.rs":"c84d930e156883c5dbad3a0c4500e6659c1f3c55dd6e4caa28b157da681ddb7c","src/hir/visitor.rs":"71ca9c93aa48a5ed445399659fa6455093a1bbd9ef44b66bc7095c1b08b2ec1f","src/lib.rs":"d2891213d00edb99b26ab93bd53749a85f0a6b2a71a1addbed9d2c4969a7515f","src/parser.rs":"6b2f4f27e3331a01a25b87c89368dd2e54396bd425dac57941f9c1ebfd238ac8","src/rank.rs":"ff3d58b0cc5ffa69e2e8c56fc7d9ef41dd399d59a639a253a51551b858cb5bbd","src/unicode.rs":"9829458ef321b3bc22c21eae4b22805b33f8b5e67022928ffd9a9e0287bc7c31","src/unicode_tables/LICENSE-UNICODE":"74db5baf44a41b1000312c673544b3374e4198af5605c7f9080a402cec42cfa3","src/unicode_tables/age.rs":"2a2599a4e406fbbd0efd16aa6ce385c3f97b87c34820d6686a9f9113a5231c67","src/unicode_tables/case_folding_simple.rs":"9583803d4a10486da372b76979dbd26349b40766229467238eff972c1d78e47b","src/unicode_tables/general_category.rs":"36a93ba1cdeed96a00ff29a5ab5afd2c578a89541bf4dd8b18478146cebda0aa","src/unicode_tables/grapheme_cluster_break.rs":"39c388e9805a8391d3d3e69d74d831ce4fb99aa7e13e52c64dd2bd16d4765301","src/unicode_tables/mod.rs":"26c837099cd934c8062e24bc9a0aaecf15fe1de03f9c6da3f3e1e5ac3ca24bee","src/unicode_tables/perl_decimal.rs":"a98ea4afe71c2947023ae12bd25c46bf4c7de48eeb40979eca5c96ba62cee02e","src/unicode_tables/perl_space.rs":"ea2b3b84b4a48334082dadc6c37d9fcc9c9ded84b40e8f5c9c9314898638967e","src/unicode_tables/perl_word.rs":"6f1156bd6af32151ecffea4abe07a38fa04b1fc1b227ec1a8dac5d5f08d9d74b","src/unicode_tables/property_bool.rs":"0bd64f6e3228eaecf47824e238bdf1f8a9eef113ace6e790a57f045a8106701c","src/unicode_tables/property_names.rs":"5ca25437927eb70c62adf7d038e99a601cfb8a718677fd6de832589664d3c481","src/unicode_tables/property_values.rs":"5b4cc02392d382cf7af60455fc87b9980e97409b62a4b8d6c5843190d2e2d21d","src/unicode_tables/script.rs":"ea1d771b6d0a4b12d143f9bad2ea9342a0887878cbbe3c11262b6eabedaf2dd4","src/unicode_tables/script_extension.rs":"beeb8349703d903ff861beb8401bfd2599e457dc25df872e69d6ad1615f8b5e9","src/unicode_tables/sentence_break.rs":"2befe2a27cc4e8aecb624e310ef9f371462470dd3b2f572cec1f5873a5e30aa9","src/unicode_tables/word_break.rs":"94679177731b515f0c360eff394286a1f99b59527bdbc826cbf51d32f9666187","src/utf8.rs":"e9a13623a94295b81969c5483de17219ff74bb20768be13c527010351245acbd","test":"c7de5fbc0010d9b5b758cd49956375a64b88601c068167fd366808950257f108"},"package":"e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/regex-syntax/Cargo.toml temporalio-1.3.0/vendor/regex-syntax/Cargo.toml --- temporalio-1.3.0/vendor/regex-syntax/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/regex-syntax/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -11,9 +11,9 @@ [package] edition = "2021" -rust-version = "1.65" +rust-version = "1.60.0" name = "regex-syntax" -version = "0.8.2" +version = "0.7.4" authors = [ "The Rust Project Developers", "Andrew Gallant ", diff -Nru temporalio-1.3.0/vendor/regex-syntax/src/ast/mod.rs temporalio-1.3.0/vendor/regex-syntax/src/ast/mod.rs --- temporalio-1.3.0/vendor/regex-syntax/src/ast/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/regex-syntax/src/ast/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -162,18 +162,6 @@ /// `(?i)*`. It is, however, possible to create a repetition operating on /// an empty sub-expression. For example, `()*` is still considered valid. RepetitionMissing, - /// The special word boundary syntax, `\b{something}`, was used, but - /// either EOF without `}` was seen, or an invalid character in the - /// braces was seen. - SpecialWordBoundaryUnclosed, - /// The special word boundary syntax, `\b{something}`, was used, but - /// `something` was not recognized as a valid word boundary kind. - SpecialWordBoundaryUnrecognized, - /// The syntax `\b{` was observed, but afterwards the end of the pattern - /// was observed without being able to tell whether it was meant to be a - /// bounded repetition on the `\b` or the beginning of a special word - /// boundary assertion. - SpecialWordOrRepetitionUnexpectedEof, /// The Unicode class is not valid. This typically occurs when a `\p` is /// followed by something other than a `{`. UnicodeClassInvalid, @@ -272,29 +260,6 @@ RepetitionMissing => { write!(f, "repetition operator missing expression") } - SpecialWordBoundaryUnclosed => { - write!( - f, - "special word boundary assertion is either \ - unclosed or contains an invalid character", - ) - } - SpecialWordBoundaryUnrecognized => { - write!( - f, - "unrecognized special word boundary assertion, \ - valid choices are: start, end, start-half \ - or end-half", - ) - } - SpecialWordOrRepetitionUnexpectedEof => { - write!( - f, - "found either the beginning of a special word \ - boundary or a bounded repetition on a \\b with \ - an opening brace, but no closing brace", - ) - } UnicodeClassInvalid => { write!(f, "invalid Unicode character class") } @@ -468,94 +433,29 @@ #[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))] pub enum Ast { /// An empty regex that matches everything. - Empty(Box), + Empty(Span), /// A set of flags, e.g., `(?is)`. - Flags(Box), + Flags(SetFlags), /// A single character literal, which includes escape sequences. - Literal(Box), + Literal(Literal), /// The "any character" class. - Dot(Box), + Dot(Span), /// A single zero-width assertion. - Assertion(Box), - /// A single Unicode character class, e.g., `\pL` or `\p{Greek}`. - ClassUnicode(Box), - /// A single perl character class, e.g., `\d` or `\W`. - ClassPerl(Box), - /// A single bracketed character class set, which may contain zero or more - /// character ranges and/or zero or more nested classes. e.g., - /// `[a-zA-Z\pL]`. - ClassBracketed(Box), + Assertion(Assertion), + /// A single character class. This includes all forms of character classes + /// except for `.`. e.g., `\d`, `\pN`, `[a-z]` and `[[:alpha:]]`. + Class(Class), /// A repetition operator applied to an arbitrary regular expression. - Repetition(Box), + Repetition(Repetition), /// A grouped regular expression. - Group(Box), + Group(Group), /// An alternation of regular expressions. - Alternation(Box), + Alternation(Alternation), /// A concatenation of regular expressions. - Concat(Box), + Concat(Concat), } impl Ast { - /// Create an "empty" AST item. - pub fn empty(span: Span) -> Ast { - Ast::Empty(Box::new(span)) - } - - /// Create a "flags" AST item. - pub fn flags(e: SetFlags) -> Ast { - Ast::Flags(Box::new(e)) - } - - /// Create a "literal" AST item. - pub fn literal(e: Literal) -> Ast { - Ast::Literal(Box::new(e)) - } - - /// Create a "dot" AST item. - pub fn dot(span: Span) -> Ast { - Ast::Dot(Box::new(span)) - } - - /// Create a "assertion" AST item. - pub fn assertion(e: Assertion) -> Ast { - Ast::Assertion(Box::new(e)) - } - - /// Create a "Unicode class" AST item. - pub fn class_unicode(e: ClassUnicode) -> Ast { - Ast::ClassUnicode(Box::new(e)) - } - - /// Create a "Perl class" AST item. - pub fn class_perl(e: ClassPerl) -> Ast { - Ast::ClassPerl(Box::new(e)) - } - - /// Create a "bracketed class" AST item. - pub fn class_bracketed(e: ClassBracketed) -> Ast { - Ast::ClassBracketed(Box::new(e)) - } - - /// Create a "repetition" AST item. - pub fn repetition(e: Repetition) -> Ast { - Ast::Repetition(Box::new(e)) - } - - /// Create a "group" AST item. - pub fn group(e: Group) -> Ast { - Ast::Group(Box::new(e)) - } - - /// Create a "alternation" AST item. - pub fn alternation(e: Alternation) -> Ast { - Ast::Alternation(Box::new(e)) - } - - /// Create a "concat" AST item. - pub fn concat(e: Concat) -> Ast { - Ast::Concat(Box::new(e)) - } - /// Return the span of this abstract syntax tree. pub fn span(&self) -> &Span { match *self { @@ -564,9 +464,7 @@ Ast::Literal(ref x) => &x.span, Ast::Dot(ref span) => span, Ast::Assertion(ref x) => &x.span, - Ast::ClassUnicode(ref x) => &x.span, - Ast::ClassPerl(ref x) => &x.span, - Ast::ClassBracketed(ref x) => &x.span, + Ast::Class(ref x) => x.span(), Ast::Repetition(ref x) => &x.span, Ast::Group(ref x) => &x.span, Ast::Alternation(ref x) => &x.span, @@ -590,10 +488,8 @@ | Ast::Flags(_) | Ast::Literal(_) | Ast::Dot(_) - | Ast::Assertion(_) - | Ast::ClassUnicode(_) - | Ast::ClassPerl(_) => false, - Ast::ClassBracketed(_) + | Ast::Assertion(_) => false, + Ast::Class(_) | Ast::Repetition(_) | Ast::Group(_) | Ast::Alternation(_) @@ -630,14 +526,14 @@ impl Alternation { /// Return this alternation as an AST. /// - /// If this alternation contains zero ASTs, then `Ast::empty` is returned. - /// If this alternation contains exactly 1 AST, then the corresponding AST - /// is returned. Otherwise, `Ast::alternation` is returned. + /// If this alternation contains zero ASTs, then Ast::Empty is + /// returned. If this alternation contains exactly 1 AST, then the + /// corresponding AST is returned. Otherwise, Ast::Alternation is returned. pub fn into_ast(mut self) -> Ast { match self.asts.len() { - 0 => Ast::empty(self.span), + 0 => Ast::Empty(self.span), 1 => self.asts.pop().unwrap(), - _ => Ast::alternation(self), + _ => Ast::Alternation(self), } } } @@ -655,14 +551,14 @@ impl Concat { /// Return this concatenation as an AST. /// - /// If this alternation contains zero ASTs, then `Ast::empty` is returned. - /// If this alternation contains exactly 1 AST, then the corresponding AST - /// is returned. Otherwise, `Ast::concat` is returned. + /// If this concatenation contains zero ASTs, then Ast::Empty is + /// returned. If this concatenation contains exactly 1 AST, then the + /// corresponding AST is returned. Otherwise, Ast::Concat is returned. pub fn into_ast(mut self) -> Ast { match self.asts.len() { - 0 => Ast::empty(self.span), + 0 => Ast::Empty(self.span), 1 => self.asts.pop().unwrap(), - _ => Ast::concat(self), + _ => Ast::Concat(self), } } } @@ -779,6 +675,31 @@ } } +/// A single character class expression. +#[derive(Clone, Debug, Eq, PartialEq)] +#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))] +pub enum Class { + /// A Unicode character class, e.g., `\pL` or `\p{Greek}`. + Unicode(ClassUnicode), + /// A perl character class, e.g., `\d` or `\W`. + Perl(ClassPerl), + /// A bracketed character class set, which may contain zero or more + /// character ranges and/or zero or more nested classes. e.g., + /// `[a-zA-Z\pL]`. + Bracketed(ClassBracketed), +} + +impl Class { + /// Return the span of this character class. + pub fn span(&self) -> &Span { + match *self { + Class::Perl(ref x) => &x.span, + Class::Unicode(ref x) => &x.span, + Class::Bracketed(ref x) => &x.span, + } + } +} + /// A Perl character class. #[derive(Clone, Debug, Eq, PartialEq)] #[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))] @@ -1328,18 +1249,6 @@ WordBoundary, /// `\B` NotWordBoundary, - /// `\b{start}` - WordBoundaryStart, - /// `\b{end}` - WordBoundaryEnd, - /// `\<` (alias for `\b{start}`) - WordBoundaryStartAngle, - /// `\>` (alias for `\b{end}`) - WordBoundaryEndAngle, - /// `\b{start-half}` - WordBoundaryStartHalf, - /// `\b{end-half}` - WordBoundaryEndHalf, } /// A repetition operation applied to a regular expression. @@ -1641,10 +1550,8 @@ | Ast::Literal(_) | Ast::Dot(_) | Ast::Assertion(_) - | Ast::ClassUnicode(_) - | Ast::ClassPerl(_) - // Bracketed classes are recursive, they get their own Drop impl. - | Ast::ClassBracketed(_) => return, + // Classes are recursive, so they get their own Drop impl. + | Ast::Class(_) => return, Ast::Repetition(ref x) if !x.ast.has_subexprs() => return, Ast::Group(ref x) if !x.ast.has_subexprs() => return, Ast::Alternation(ref x) if x.asts.is_empty() => return, @@ -1653,7 +1560,7 @@ } let empty_span = || Span::splat(Position::new(0, 0, 0)); - let empty_ast = || Ast::empty(empty_span()); + let empty_ast = || Ast::Empty(empty_span()); let mut stack = vec![mem::replace(self, empty_ast())]; while let Some(mut ast) = stack.pop() { match ast { @@ -1662,11 +1569,8 @@ | Ast::Literal(_) | Ast::Dot(_) | Ast::Assertion(_) - | Ast::ClassUnicode(_) - | Ast::ClassPerl(_) - // Bracketed classes are recursive, so they get their own Drop - // impl. - | Ast::ClassBracketed(_) => {} + // Classes are recursive, so they get their own Drop impl. + | Ast::Class(_) => {} Ast::Repetition(ref mut x) => { stack.push(mem::replace(&mut x.ast, empty_ast())); } @@ -1759,9 +1663,9 @@ let run = || { let span = || Span::splat(Position::new(0, 0, 0)); - let mut ast = Ast::empty(span()); + let mut ast = Ast::Empty(span()); for i in 0..200 { - ast = Ast::group(Group { + ast = Ast::Group(Group { span: span(), kind: GroupKind::CaptureIndex(i), ast: Box::new(ast), @@ -1790,20 +1694,4 @@ .join() .unwrap(); } - - // This tests that our `Ast` has a reasonable size. This isn't a hard rule - // and it can be increased if given a good enough reason. But this test - // exists because the size of `Ast` was at one point over 200 bytes on a - // 64-bit target. Wow. - #[test] - fn ast_size() { - let max = 2 * core::mem::size_of::(); - let size = core::mem::size_of::(); - assert!( - size <= max, - "Ast size of {} bytes is bigger than suggested max {}", - size, - max - ); - } } diff -Nru temporalio-1.3.0/vendor/regex-syntax/src/ast/parse.rs temporalio-1.3.0/vendor/regex-syntax/src/ast/parse.rs --- temporalio-1.3.0/vendor/regex-syntax/src/ast/parse.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/regex-syntax/src/ast/parse.rs 2023-10-30 19:40:00.000000000 +0000 @@ -53,11 +53,11 @@ /// Convert this primitive into a proper AST. fn into_ast(self) -> Ast { match self { - Primitive::Literal(lit) => Ast::literal(lit), - Primitive::Assertion(assert) => Ast::assertion(assert), - Primitive::Dot(span) => Ast::dot(span), - Primitive::Perl(cls) => Ast::class_perl(cls), - Primitive::Unicode(cls) => Ast::class_unicode(cls), + Primitive::Literal(lit) => Ast::Literal(lit), + Primitive::Assertion(assert) => Ast::Assertion(assert), + Primitive::Dot(span) => Ast::Dot(span), + Primitive::Perl(cls) => Ast::Class(ast::Class::Perl(cls)), + Primitive::Unicode(cls) => Ast::Class(ast::Class::Unicode(cls)), } } @@ -383,7 +383,7 @@ /// Return a reference to the pattern being parsed. fn pattern(&self) -> &str { - self.pattern + self.pattern.borrow() } /// Create a new error with the given span and error type. @@ -691,7 +691,7 @@ self.parser().ignore_whitespace.set(v); } - concat.asts.push(Ast::flags(set)); + concat.asts.push(Ast::Flags(set)); Ok(concat) } Either::Right(group) => { @@ -764,7 +764,7 @@ group.ast = Box::new(group_concat.into_ast()); } } - prior_concat.asts.push(Ast::group(group)); + prior_concat.asts.push(Ast::Group(group)); Ok(prior_concat) } @@ -783,7 +783,7 @@ Some(GroupState::Alternation(mut alt)) => { alt.span.end = self.pos(); alt.asts.push(concat.into_ast()); - Ok(Ast::alternation(alt)) + Ok(Ast::Alternation(alt)) } Some(GroupState::Group { group, .. }) => { return Err( @@ -850,7 +850,7 @@ fn pop_class( &self, nested_union: ast::ClassSetUnion, - ) -> Result> { + ) -> Result> { assert_eq!(self.char(), ']'); let item = ast::ClassSet::Item(nested_union.into_item()); @@ -882,7 +882,7 @@ set.span.end = self.pos(); set.kind = prevset; if stack.is_empty() { - Ok(Either::Right(set)) + Ok(Either::Right(ast::Class::Bracketed(set))) } else { union.push(ast::ClassSetItem::Bracketed(Box::new(set))); Ok(Either::Left(union)) @@ -976,7 +976,7 @@ '|' => concat = self.push_alternate(concat)?, '[' => { let class = self.parse_set_class()?; - concat.asts.push(Ast::class_bracketed(class)); + concat.asts.push(Ast::Class(class)); } '?' => { concat = self.parse_uncounted_repetition( @@ -1057,7 +1057,7 @@ greedy = false; self.bump(); } - concat.asts.push(Ast::repetition(ast::Repetition { + concat.asts.push(Ast::Repetition(ast::Repetition { span: ast.span().with_end(self.pos()), op: ast::RepetitionOp { span: Span::new(op_start, self.pos()), @@ -1159,7 +1159,7 @@ self.error(op_span, ast::ErrorKind::RepetitionCountInvalid) ); } - concat.asts.push(Ast::repetition(ast::Repetition { + concat.asts.push(Ast::Repetition(ast::Repetition { span: ast.span().with_end(self.pos()), op: ast::RepetitionOp { span: op_span, @@ -1212,7 +1212,7 @@ Ok(Either::Right(ast::Group { span: open_span, kind: ast::GroupKind::CaptureName { starts_with_p, name }, - ast: Box::new(Ast::empty(self.span())), + ast: Box::new(Ast::Empty(self.span())), })) } else if self.bump_if("?") { if self.is_eof() { @@ -1241,7 +1241,7 @@ Ok(Either::Right(ast::Group { span: open_span, kind: ast::GroupKind::NonCapturing(flags), - ast: Box::new(Ast::empty(self.span())), + ast: Box::new(Ast::Empty(self.span())), })) } } else { @@ -1249,7 +1249,7 @@ Ok(Either::Right(ast::Group { span: open_span, kind: ast::GroupKind::CaptureIndex(capture_index), - ast: Box::new(Ast::empty(self.span())), + ast: Box::new(Ast::Empty(self.span())), })) } } @@ -1528,115 +1528,18 @@ span, kind: ast::AssertionKind::EndText, })), - 'b' => { - let mut wb = ast::Assertion { - span, - kind: ast::AssertionKind::WordBoundary, - }; - // After a \b, we "try" to parse things like \b{start} for - // special word boundary assertions. - if !self.is_eof() && self.char() == '{' { - if let Some(kind) = - self.maybe_parse_special_word_boundary(start)? - { - wb.kind = kind; - wb.span.end = self.pos(); - } - } - Ok(Primitive::Assertion(wb)) - } - 'B' => Ok(Primitive::Assertion(ast::Assertion { + 'b' => Ok(Primitive::Assertion(ast::Assertion { span, - kind: ast::AssertionKind::NotWordBoundary, - })), - '<' => Ok(Primitive::Assertion(ast::Assertion { - span, - kind: ast::AssertionKind::WordBoundaryStartAngle, + kind: ast::AssertionKind::WordBoundary, })), - '>' => Ok(Primitive::Assertion(ast::Assertion { + 'B' => Ok(Primitive::Assertion(ast::Assertion { span, - kind: ast::AssertionKind::WordBoundaryEndAngle, + kind: ast::AssertionKind::NotWordBoundary, })), _ => Err(self.error(span, ast::ErrorKind::EscapeUnrecognized)), } } - /// Attempt to parse a specialty word boundary. That is, `\b{start}`, - /// `\b{end}`, `\b{start-half}` or `\b{end-half}`. - /// - /// This is similar to `maybe_parse_ascii_class` in that, in most cases, - /// if it fails it will just return `None` with no error. This is done - /// because `\b{5}` is a valid expression and we want to let that be parsed - /// by the existing counted repetition parsing code. (I thought about just - /// invoking the counted repetition code from here, but it seemed a little - /// ham-fisted.) - /// - /// Unlike `maybe_parse_ascii_class` though, this can return an error. - /// Namely, if we definitely know it isn't a counted repetition, then we - /// return an error specific to the specialty word boundaries. - /// - /// This assumes the parser is positioned at a `{` immediately following - /// a `\b`. When `None` is returned, the parser is returned to the position - /// at which it started: pointing at a `{`. - /// - /// The position given should correspond to the start of the `\b`. - fn maybe_parse_special_word_boundary( - &self, - wb_start: Position, - ) -> Result> { - assert_eq!(self.char(), '{'); - - let is_valid_char = |c| match c { - 'A'..='Z' | 'a'..='z' | '-' => true, - _ => false, - }; - let start = self.pos(); - if !self.bump_and_bump_space() { - return Err(self.error( - Span::new(wb_start, self.pos()), - ast::ErrorKind::SpecialWordOrRepetitionUnexpectedEof, - )); - } - let start_contents = self.pos(); - // This is one of the critical bits: if the first non-whitespace - // character isn't in [-A-Za-z] (i.e., this can't be a special word - // boundary), then we bail and let the counted repetition parser deal - // with this. - if !is_valid_char(self.char()) { - self.parser().pos.set(start); - return Ok(None); - } - - // Now collect up our chars until we see a '}'. - let mut scratch = self.parser().scratch.borrow_mut(); - scratch.clear(); - while !self.is_eof() && is_valid_char(self.char()) { - scratch.push(self.char()); - self.bump_and_bump_space(); - } - if self.is_eof() || self.char() != '}' { - return Err(self.error( - Span::new(start, self.pos()), - ast::ErrorKind::SpecialWordBoundaryUnclosed, - )); - } - let end = self.pos(); - self.bump(); - let kind = match scratch.as_str() { - "start" => ast::AssertionKind::WordBoundaryStart, - "end" => ast::AssertionKind::WordBoundaryEnd, - "start-half" => ast::AssertionKind::WordBoundaryStartHalf, - "end-half" => ast::AssertionKind::WordBoundaryEndHalf, - _ => { - return Err(self.error( - Span::new(start_contents, end), - ast::ErrorKind::SpecialWordBoundaryUnrecognized, - )) - } - }; - Ok(Some(kind)) - } - /// Parse an octal representation of a Unicode codepoint up to 3 digits /// long. This expects the parser to be positioned at the first octal /// digit and advances the parser to the first character immediately @@ -1840,7 +1743,7 @@ /// is successful, then the parser is advanced to the position immediately /// following the closing `]`. #[inline(never)] - fn parse_set_class(&self) -> Result { + fn parse_set_class(&self) -> Result { assert_eq!(self.char(), '['); let mut union = @@ -2064,9 +1967,9 @@ // because parsing cannot fail with any interesting error. For example, // in order to use an ASCII character class, it must be enclosed in // double brackets, e.g., `[[:alnum:]]`. Alternatively, you might think - // of it as "ASCII character classes have the syntax `[:NAME:]` which - // can only appear within character brackets." This means that things - // like `[[:lower:]A]` are legal constructs. + // of it as "ASCII character characters have the syntax `[:NAME:]` + // which can only appear within character brackets." This means that + // things like `[[:lower:]A]` are legal constructs. // // However, if one types an incorrect ASCII character class, e.g., // `[[:loower:]]`, then we treat that as a normal nested character @@ -2286,12 +2189,12 @@ | Ast::Literal(_) | Ast::Dot(_) | Ast::Assertion(_) - | Ast::ClassUnicode(_) - | Ast::ClassPerl(_) => { + | Ast::Class(ast::Class::Unicode(_)) + | Ast::Class(ast::Class::Perl(_)) => { // These are all base cases, so we don't increment depth. return Ok(()); } - Ast::ClassBracketed(ref x) => &x.span, + Ast::Class(ast::Class::Bracketed(ref x)) => &x.span, Ast::Repetition(ref x) => &x.span, Ast::Group(ref x) => &x.span, Ast::Alternation(ref x) => &x.span, @@ -2307,12 +2210,12 @@ | Ast::Literal(_) | Ast::Dot(_) | Ast::Assertion(_) - | Ast::ClassUnicode(_) - | Ast::ClassPerl(_) => { + | Ast::Class(ast::Class::Unicode(_)) + | Ast::Class(ast::Class::Perl(_)) => { // These are all base cases, so we don't decrement depth. Ok(()) } - Ast::ClassBracketed(_) + Ast::Class(ast::Class::Bracketed(_)) | Ast::Repetition(_) | Ast::Group(_) | Ast::Alternation(_) @@ -2523,12 +2426,12 @@ /// Create a meta literal starting at the given position. fn meta_lit(c: char, span: Span) -> Ast { - Ast::literal(ast::Literal { span, kind: ast::LiteralKind::Meta, c }) + Ast::Literal(ast::Literal { span, kind: ast::LiteralKind::Meta, c }) } /// Create a verbatim literal with the given span. fn lit_with(c: char, span: Span) -> Ast { - Ast::literal(ast::Literal { + Ast::Literal(ast::Literal { span, kind: ast::LiteralKind::Verbatim, c, @@ -2542,17 +2445,17 @@ /// Create a concatenation with the given span. fn concat_with(span: Span, asts: Vec) -> Ast { - Ast::concat(ast::Concat { span, asts }) + Ast::Concat(ast::Concat { span, asts }) } /// Create an alternation with the given span. fn alt(range: Range, asts: Vec) -> Ast { - Ast::alternation(ast::Alternation { span: span(range), asts }) + Ast::Alternation(ast::Alternation { span: span(range), asts }) } /// Create a capturing group with the given span. fn group(range: Range, index: u32, ast: Ast) -> Ast { - Ast::group(ast::Group { + Ast::Group(ast::Group { span: span(range), kind: ast::GroupKind::CaptureIndex(index), ast: Box::new(ast), @@ -2585,7 +2488,7 @@ }, ); } - Ast::flags(ast::SetFlags { + Ast::Flags(ast::SetFlags { span: span_range(pat, range.clone()), flags: ast::Flags { span: span_range(pat, (range.start + 2)..(range.end - 1)), @@ -2599,7 +2502,7 @@ // A nest limit of 0 still allows some types of regexes. assert_eq!( parser_nest_limit("", 0).parse(), - Ok(Ast::empty(span(0..0))) + Ok(Ast::Empty(span(0..0))) ); assert_eq!(parser_nest_limit("a", 0).parse(), Ok(lit('a', 0))); @@ -2613,7 +2516,7 @@ ); assert_eq!( parser_nest_limit("a+", 1).parse(), - Ok(Ast::repetition(ast::Repetition { + Ok(Ast::Repetition(ast::Repetition { span: span(0..2), op: ast::RepetitionOp { span: span(1..2), @@ -2639,14 +2542,14 @@ ); assert_eq!( parser_nest_limit("a+*", 2).parse(), - Ok(Ast::repetition(ast::Repetition { + Ok(Ast::Repetition(ast::Repetition { span: span(0..3), op: ast::RepetitionOp { span: span(2..3), kind: ast::RepetitionKind::ZeroOrMore, }, greedy: true, - ast: Box::new(Ast::repetition(ast::Repetition { + ast: Box::new(Ast::Repetition(ast::Repetition { span: span(0..2), op: ast::RepetitionOp { span: span(1..2), @@ -2703,7 +2606,7 @@ ); assert_eq!( parser_nest_limit("[a]", 1).parse(), - Ok(Ast::class_bracketed(ast::ClassBracketed { + Ok(Ast::Class(ast::Class::Bracketed(ast::ClassBracketed { span: span(0..3), negated: false, kind: ast::ClassSet::Item(ast::ClassSetItem::Literal( @@ -2713,7 +2616,7 @@ c: 'a', } )), - })) + }))) ); assert_eq!( parser_nest_limit("[ab]", 1).parse().unwrap_err(), @@ -2873,7 +2776,7 @@ vec![ lit_with('a', span_range(pat, 0..1)), lit_with(' ', span_range(pat, 1..2)), - Ast::group(ast::Group { + Ast::Group(ast::Group { span: span_range(pat, 2..9), kind: ast::GroupKind::NonCapturing(ast::Flags { span: span_range(pat, 4..5), @@ -2900,7 +2803,7 @@ span_range(pat, 0..pat.len()), vec![ flag_set(pat, 0..4, ast::Flag::IgnoreWhitespace, false), - Ast::group(ast::Group { + Ast::Group(ast::Group { span: span_range(pat, 4..pat.len()), kind: ast::GroupKind::CaptureName { starts_with_p: true, @@ -2922,7 +2825,7 @@ span_range(pat, 0..pat.len()), vec![ flag_set(pat, 0..4, ast::Flag::IgnoreWhitespace, false), - Ast::group(ast::Group { + Ast::Group(ast::Group { span: span_range(pat, 4..pat.len()), kind: ast::GroupKind::CaptureIndex(1), ast: Box::new(lit_with('a', span_range(pat, 7..8))), @@ -2937,7 +2840,7 @@ span_range(pat, 0..pat.len()), vec![ flag_set(pat, 0..4, ast::Flag::IgnoreWhitespace, false), - Ast::group(ast::Group { + Ast::Group(ast::Group { span: span_range(pat, 4..pat.len()), kind: ast::GroupKind::NonCapturing(ast::Flags { span: span_range(pat, 8..8), @@ -2955,7 +2858,7 @@ span_range(pat, 0..pat.len()), vec![ flag_set(pat, 0..4, ast::Flag::IgnoreWhitespace, false), - Ast::literal(ast::Literal { + Ast::Literal(ast::Literal { span: span(4..13), kind: ast::LiteralKind::HexBrace( ast::HexLiteralKind::X @@ -2974,7 +2877,7 @@ span_range(pat, 0..pat.len()), vec![ flag_set(pat, 0..4, ast::Flag::IgnoreWhitespace, false), - Ast::literal(ast::Literal { + Ast::Literal(ast::Literal { span: span_range(pat, 4..6), kind: ast::LiteralKind::Superfluous, c: ' ', @@ -2992,9 +2895,9 @@ Ok(concat_with( span_range(pat, 0..3), vec![ - Ast::dot(span_range(pat, 0..1)), + Ast::Dot(span_range(pat, 0..1)), lit_with('\n', span_range(pat, 1..2)), - Ast::dot(span_range(pat, 2..3)), + Ast::Dot(span_range(pat, 2..3)), ] )) ); @@ -3030,7 +2933,7 @@ fn parse_uncounted_repetition() { assert_eq!( parser(r"a*").parse(), - Ok(Ast::repetition(ast::Repetition { + Ok(Ast::Repetition(ast::Repetition { span: span(0..2), op: ast::RepetitionOp { span: span(1..2), @@ -3042,7 +2945,7 @@ ); assert_eq!( parser(r"a+").parse(), - Ok(Ast::repetition(ast::Repetition { + Ok(Ast::Repetition(ast::Repetition { span: span(0..2), op: ast::RepetitionOp { span: span(1..2), @@ -3055,7 +2958,7 @@ assert_eq!( parser(r"a?").parse(), - Ok(Ast::repetition(ast::Repetition { + Ok(Ast::Repetition(ast::Repetition { span: span(0..2), op: ast::RepetitionOp { span: span(1..2), @@ -3067,7 +2970,7 @@ ); assert_eq!( parser(r"a??").parse(), - Ok(Ast::repetition(ast::Repetition { + Ok(Ast::Repetition(ast::Repetition { span: span(0..3), op: ast::RepetitionOp { span: span(1..3), @@ -3079,7 +2982,7 @@ ); assert_eq!( parser(r"a?").parse(), - Ok(Ast::repetition(ast::Repetition { + Ok(Ast::Repetition(ast::Repetition { span: span(0..2), op: ast::RepetitionOp { span: span(1..2), @@ -3094,7 +2997,7 @@ Ok(concat( 0..3, vec![ - Ast::repetition(ast::Repetition { + Ast::Repetition(ast::Repetition { span: span(0..2), op: ast::RepetitionOp { span: span(1..2), @@ -3112,7 +3015,7 @@ Ok(concat( 0..4, vec![ - Ast::repetition(ast::Repetition { + Ast::Repetition(ast::Repetition { span: span(0..3), op: ast::RepetitionOp { span: span(1..3), @@ -3131,7 +3034,7 @@ 0..3, vec![ lit('a', 0), - Ast::repetition(ast::Repetition { + Ast::Repetition(ast::Repetition { span: span(1..3), op: ast::RepetitionOp { span: span(2..3), @@ -3145,7 +3048,7 @@ ); assert_eq!( parser(r"(ab)?").parse(), - Ok(Ast::repetition(ast::Repetition { + Ok(Ast::Repetition(ast::Repetition { span: span(0..5), op: ast::RepetitionOp { span: span(4..5), @@ -3164,8 +3067,8 @@ Ok(alt( 0..3, vec![ - Ast::empty(span(0..0)), - Ast::repetition(ast::Repetition { + Ast::Empty(span(0..0)), + Ast::Repetition(ast::Repetition { span: span(1..3), op: ast::RepetitionOp { span: span(2..3), @@ -3254,7 +3157,7 @@ fn parse_counted_repetition() { assert_eq!( parser(r"a{5}").parse(), - Ok(Ast::repetition(ast::Repetition { + Ok(Ast::Repetition(ast::Repetition { span: span(0..4), op: ast::RepetitionOp { span: span(1..4), @@ -3268,7 +3171,7 @@ ); assert_eq!( parser(r"a{5,}").parse(), - Ok(Ast::repetition(ast::Repetition { + Ok(Ast::Repetition(ast::Repetition { span: span(0..5), op: ast::RepetitionOp { span: span(1..5), @@ -3282,7 +3185,7 @@ ); assert_eq!( parser(r"a{5,9}").parse(), - Ok(Ast::repetition(ast::Repetition { + Ok(Ast::Repetition(ast::Repetition { span: span(0..6), op: ast::RepetitionOp { span: span(1..6), @@ -3296,7 +3199,7 @@ ); assert_eq!( parser(r"a{5}?").parse(), - Ok(Ast::repetition(ast::Repetition { + Ok(Ast::Repetition(ast::Repetition { span: span(0..5), op: ast::RepetitionOp { span: span(1..5), @@ -3314,7 +3217,7 @@ 0..5, vec![ lit('a', 0), - Ast::repetition(ast::Repetition { + Ast::Repetition(ast::Repetition { span: span(1..5), op: ast::RepetitionOp { span: span(2..5), @@ -3334,7 +3237,7 @@ 0..6, vec![ lit('a', 0), - Ast::repetition(ast::Repetition { + Ast::Repetition(ast::Repetition { span: span(1..5), op: ast::RepetitionOp { span: span(2..5), @@ -3352,7 +3255,7 @@ assert_eq!( parser(r"a{ 5 }").parse(), - Ok(Ast::repetition(ast::Repetition { + Ok(Ast::Repetition(ast::Repetition { span: span(0..6), op: ast::RepetitionOp { span: span(1..6), @@ -3366,7 +3269,7 @@ ); assert_eq!( parser(r"a{ 5 , 9 }").parse(), - Ok(Ast::repetition(ast::Repetition { + Ok(Ast::Repetition(ast::Repetition { span: span(0..10), op: ast::RepetitionOp { span: span(1..10), @@ -3380,7 +3283,7 @@ ); assert_eq!( parser_ignore_whitespace(r"a{5,9} ?").parse(), - Ok(Ast::repetition(ast::Repetition { + Ok(Ast::Repetition(ast::Repetition { span: span(0..8), op: ast::RepetitionOp { span: span(1..8), @@ -3392,23 +3295,6 @@ ast: Box::new(lit('a', 0)), })) ); - assert_eq!( - parser(r"\b{5,9}").parse(), - Ok(Ast::repetition(ast::Repetition { - span: span(0..7), - op: ast::RepetitionOp { - span: span(2..7), - kind: ast::RepetitionKind::Range( - ast::RepetitionRange::Bounded(5, 9) - ), - }, - greedy: true, - ast: Box::new(Ast::assertion(ast::Assertion { - span: span(0..2), - kind: ast::AssertionKind::WordBoundary, - })), - })) - ); assert_eq!( parser(r"(?i){0}").parse().unwrap_err(), @@ -3528,7 +3414,7 @@ fn parse_alternate() { assert_eq!( parser(r"a|b").parse(), - Ok(Ast::alternation(ast::Alternation { + Ok(Ast::Alternation(ast::Alternation { span: span(0..3), asts: vec![lit('a', 0), lit('b', 2)], })) @@ -3538,7 +3424,7 @@ Ok(group( 0..5, 1, - Ast::alternation(ast::Alternation { + Ast::Alternation(ast::Alternation { span: span(1..4), asts: vec![lit('a', 1), lit('b', 3)], }) @@ -3547,14 +3433,14 @@ assert_eq!( parser(r"a|b|c").parse(), - Ok(Ast::alternation(ast::Alternation { + Ok(Ast::Alternation(ast::Alternation { span: span(0..5), asts: vec![lit('a', 0), lit('b', 2), lit('c', 4)], })) ); assert_eq!( parser(r"ax|by|cz").parse(), - Ok(Ast::alternation(ast::Alternation { + Ok(Ast::Alternation(ast::Alternation { span: span(0..8), asts: vec![ concat(0..2, vec![lit('a', 0), lit('x', 1)]), @@ -3568,7 +3454,7 @@ Ok(group( 0..10, 1, - Ast::alternation(ast::Alternation { + Ast::Alternation(ast::Alternation { span: span(1..9), asts: vec![ concat(1..3, vec![lit('a', 1), lit('x', 2)]), @@ -3617,7 +3503,7 @@ parser(r"|").parse(), Ok(alt( 0..1, - vec![Ast::empty(span(0..0)), Ast::empty(span(1..1)),] + vec![Ast::Empty(span(0..0)), Ast::Empty(span(1..1)),] )) ); assert_eq!( @@ -3625,19 +3511,19 @@ Ok(alt( 0..2, vec![ - Ast::empty(span(0..0)), - Ast::empty(span(1..1)), - Ast::empty(span(2..2)), + Ast::Empty(span(0..0)), + Ast::Empty(span(1..1)), + Ast::Empty(span(2..2)), ] )) ); assert_eq!( parser(r"a|").parse(), - Ok(alt(0..2, vec![lit('a', 0), Ast::empty(span(2..2)),])) + Ok(alt(0..2, vec![lit('a', 0), Ast::Empty(span(2..2)),])) ); assert_eq!( parser(r"|a").parse(), - Ok(alt(0..2, vec![Ast::empty(span(0..0)), lit('a', 1),])) + Ok(alt(0..2, vec![Ast::Empty(span(0..0)), lit('a', 1),])) ); assert_eq!( @@ -3647,7 +3533,7 @@ 1, alt( 1..2, - vec![Ast::empty(span(1..1)), Ast::empty(span(2..2)),] + vec![Ast::Empty(span(1..1)), Ast::Empty(span(2..2)),] ) )) ); @@ -3656,7 +3542,7 @@ Ok(group( 0..4, 1, - alt(1..3, vec![lit('a', 1), Ast::empty(span(3..3)),]) + alt(1..3, vec![lit('a', 1), Ast::Empty(span(3..3)),]) )) ); assert_eq!( @@ -3664,7 +3550,7 @@ Ok(group( 0..4, 1, - alt(1..3, vec![Ast::empty(span(1..1)), lit('a', 2),]) + alt(1..3, vec![Ast::Empty(span(1..1)), lit('a', 2),]) )) ); @@ -3720,7 +3606,7 @@ fn parse_group() { assert_eq!( parser("(?i)").parse(), - Ok(Ast::flags(ast::SetFlags { + Ok(Ast::Flags(ast::SetFlags { span: span(0..4), flags: ast::Flags { span: span(2..3), @@ -3735,7 +3621,7 @@ ); assert_eq!( parser("(?iU)").parse(), - Ok(Ast::flags(ast::SetFlags { + Ok(Ast::Flags(ast::SetFlags { span: span(0..5), flags: ast::Flags { span: span(2..4), @@ -3758,7 +3644,7 @@ ); assert_eq!( parser("(?i-U)").parse(), - Ok(Ast::flags(ast::SetFlags { + Ok(Ast::Flags(ast::SetFlags { span: span(0..6), flags: ast::Flags { span: span(2..5), @@ -3786,15 +3672,15 @@ assert_eq!( parser("()").parse(), - Ok(Ast::group(ast::Group { + Ok(Ast::Group(ast::Group { span: span(0..2), kind: ast::GroupKind::CaptureIndex(1), - ast: Box::new(Ast::empty(span(1..1))), + ast: Box::new(Ast::Empty(span(1..1))), })) ); assert_eq!( parser("(a)").parse(), - Ok(Ast::group(ast::Group { + Ok(Ast::Group(ast::Group { span: span(0..3), kind: ast::GroupKind::CaptureIndex(1), ast: Box::new(lit('a', 1)), @@ -3802,20 +3688,20 @@ ); assert_eq!( parser("(())").parse(), - Ok(Ast::group(ast::Group { + Ok(Ast::Group(ast::Group { span: span(0..4), kind: ast::GroupKind::CaptureIndex(1), - ast: Box::new(Ast::group(ast::Group { + ast: Box::new(Ast::Group(ast::Group { span: span(1..3), kind: ast::GroupKind::CaptureIndex(2), - ast: Box::new(Ast::empty(span(2..2))), + ast: Box::new(Ast::Empty(span(2..2))), })), })) ); assert_eq!( parser("(?:a)").parse(), - Ok(Ast::group(ast::Group { + Ok(Ast::Group(ast::Group { span: span(0..5), kind: ast::GroupKind::NonCapturing(ast::Flags { span: span(2..2), @@ -3827,7 +3713,7 @@ assert_eq!( parser("(?i:a)").parse(), - Ok(Ast::group(ast::Group { + Ok(Ast::Group(ast::Group { span: span(0..6), kind: ast::GroupKind::NonCapturing(ast::Flags { span: span(2..3), @@ -3843,7 +3729,7 @@ ); assert_eq!( parser("(?i-U:a)").parse(), - Ok(Ast::group(ast::Group { + Ok(Ast::Group(ast::Group { span: span(0..8), kind: ast::GroupKind::NonCapturing(ast::Flags { span: span(2..5), @@ -3932,7 +3818,7 @@ fn parse_capture_name() { assert_eq!( parser("(?z)").parse(), - Ok(Ast::group(ast::Group { + Ok(Ast::Group(ast::Group { span: span(0..7), kind: ast::GroupKind::CaptureName { starts_with_p: false, @@ -3947,7 +3833,7 @@ ); assert_eq!( parser("(?Pz)").parse(), - Ok(Ast::group(ast::Group { + Ok(Ast::Group(ast::Group { span: span(0..8), kind: ast::GroupKind::CaptureName { starts_with_p: true, @@ -3962,7 +3848,7 @@ ); assert_eq!( parser("(?Pz)").parse(), - Ok(Ast::group(ast::Group { + Ok(Ast::Group(ast::Group { span: span(0..10), kind: ast::GroupKind::CaptureName { starts_with_p: true, @@ -3978,7 +3864,7 @@ assert_eq!( parser("(?Pz)").parse(), - Ok(Ast::group(ast::Group { + Ok(Ast::Group(ast::Group { span: span(0..10), kind: ast::GroupKind::CaptureName { starts_with_p: true, @@ -3994,7 +3880,7 @@ assert_eq!( parser("(?Pz)").parse(), - Ok(Ast::group(ast::Group { + Ok(Ast::Group(ast::Group { span: span(0..10), kind: ast::GroupKind::CaptureName { starts_with_p: true, @@ -4010,7 +3896,7 @@ assert_eq!( parser("(?Pz)").parse(), - Ok(Ast::group(ast::Group { + Ok(Ast::Group(ast::Group { span: span(0..11), kind: ast::GroupKind::CaptureName { starts_with_p: true, @@ -4026,7 +3912,7 @@ assert_eq!( parser("(?P)").parse(), - Ok(Ast::group(ast::Group { + Ok(Ast::Group(ast::Group { span: Span::new( Position::new(0, 1, 1), Position::new(9, 1, 9), @@ -4042,7 +3928,7 @@ index: 1, } }, - ast: Box::new(Ast::empty(Span::new( + ast: Box::new(Ast::Empty(Span::new( Position::new(8, 1, 8), Position::new(8, 1, 8), ))), @@ -4050,7 +3936,7 @@ ); assert_eq!( parser("(?P<åå­—>)").parse(), - Ok(Ast::group(ast::Group { + Ok(Ast::Group(ast::Group { span: Span::new( Position::new(0, 1, 1), Position::new(12, 1, 9), @@ -4066,7 +3952,7 @@ index: 1, } }, - ast: Box::new(Ast::empty(Span::new( + ast: Box::new(Ast::Empty(Span::new( Position::new(11, 1, 8), Position::new(11, 1, 8), ))), @@ -4496,48 +4382,6 @@ })) ); assert_eq!( - parser(r"\b{start}").parse_primitive(), - Ok(Primitive::Assertion(ast::Assertion { - span: span(0..9), - kind: ast::AssertionKind::WordBoundaryStart, - })) - ); - assert_eq!( - parser(r"\b{end}").parse_primitive(), - Ok(Primitive::Assertion(ast::Assertion { - span: span(0..7), - kind: ast::AssertionKind::WordBoundaryEnd, - })) - ); - assert_eq!( - parser(r"\b{start-half}").parse_primitive(), - Ok(Primitive::Assertion(ast::Assertion { - span: span(0..14), - kind: ast::AssertionKind::WordBoundaryStartHalf, - })) - ); - assert_eq!( - parser(r"\b{end-half}").parse_primitive(), - Ok(Primitive::Assertion(ast::Assertion { - span: span(0..12), - kind: ast::AssertionKind::WordBoundaryEndHalf, - })) - ); - assert_eq!( - parser(r"\<").parse_primitive(), - Ok(Primitive::Assertion(ast::Assertion { - span: span(0..2), - kind: ast::AssertionKind::WordBoundaryStartAngle, - })) - ); - assert_eq!( - parser(r"\>").parse_primitive(), - Ok(Primitive::Assertion(ast::Assertion { - span: span(0..2), - kind: ast::AssertionKind::WordBoundaryEndAngle, - })) - ); - assert_eq!( parser(r"\B").parse_primitive(), Ok(Primitive::Assertion(ast::Assertion { span: span(0..2), @@ -4574,60 +4418,20 @@ kind: ast::ErrorKind::EscapeUnrecognized, } ); - - // Starting a special word boundary without any non-whitespace chars - // after the brace makes it ambiguous whether the user meant to write - // a counted repetition (probably not?) or an actual special word - // boundary assertion. - assert_eq!( - parser(r"\b{").parse_escape().unwrap_err(), - TestError { - span: span(0..3), - kind: ast::ErrorKind::SpecialWordOrRepetitionUnexpectedEof, - } - ); - assert_eq!( - parser_ignore_whitespace(r"\b{ ").parse_escape().unwrap_err(), - TestError { - span: span(0..4), - kind: ast::ErrorKind::SpecialWordOrRepetitionUnexpectedEof, - } - ); - // When 'x' is not enabled, the space is seen as a non-[-A-Za-z] char, - // and thus causes the parser to treat it as a counted repetition. - assert_eq!( - parser(r"\b{ ").parse().unwrap_err(), - TestError { - span: span(4..4), - kind: ast::ErrorKind::RepetitionCountDecimalEmpty, - } - ); - // In this case, we got some valid chars that makes it look like the - // user is writing one of the special word boundary assertions, but - // we forget to close the brace. + // But also, < and > are banned, so that we may evolve them into + // start/end word boundary assertions. (Not sure if we will...) assert_eq!( - parser(r"\b{foo").parse_escape().unwrap_err(), + parser(r"\<").parse_escape().unwrap_err(), TestError { - span: span(2..6), - kind: ast::ErrorKind::SpecialWordBoundaryUnclosed, - } - ); - // We get the same error as above, except it is provoked by seeing a - // char that we know is invalid before seeing a closing brace. - assert_eq!( - parser(r"\b{foo!}").parse_escape().unwrap_err(), - TestError { - span: span(2..6), - kind: ast::ErrorKind::SpecialWordBoundaryUnclosed, + span: span(0..2), + kind: ast::ErrorKind::EscapeUnrecognized, } ); - // And this one occurs when, syntactically, everything looks okay, but - // we don't use a valid spelling of a word boundary assertion. assert_eq!( - parser(r"\b{foo}").parse_escape().unwrap_err(), + parser(r"\>").parse_escape().unwrap_err(), TestError { - span: span(3..6), - kind: ast::ErrorKind::SpecialWordBoundaryUnrecognized, + span: span(0..2), + kind: ast::ErrorKind::EscapeUnrecognized, } ); @@ -4690,15 +4494,15 @@ ); assert_eq!( parser_octal(r"\778").parse(), - Ok(Ast::concat(ast::Concat { + Ok(Ast::Concat(ast::Concat { span: span(0..4), asts: vec![ - Ast::literal(ast::Literal { + Ast::Literal(ast::Literal { span: span(0..3), kind: ast::LiteralKind::Octal, c: '?', }), - Ast::literal(ast::Literal { + Ast::Literal(ast::Literal { span: span(3..4), kind: ast::LiteralKind::Verbatim, c: '8', @@ -4708,15 +4512,15 @@ ); assert_eq!( parser_octal(r"\7777").parse(), - Ok(Ast::concat(ast::Concat { + Ok(Ast::Concat(ast::Concat { span: span(0..5), asts: vec![ - Ast::literal(ast::Literal { + Ast::Literal(ast::Literal { span: span(0..4), kind: ast::LiteralKind::Octal, c: '\u{01FF}', }), - Ast::literal(ast::Literal { + Ast::Literal(ast::Literal { span: span(4..5), kind: ast::LiteralKind::Verbatim, c: '7', @@ -5161,15 +4965,15 @@ assert_eq!( parser("[[:alnum:]]").parse(), - Ok(Ast::class_bracketed(ast::ClassBracketed { + Ok(Ast::Class(ast::Class::Bracketed(ast::ClassBracketed { span: span(0..11), negated: false, kind: itemset(item_ascii(alnum(span(1..10), false))), - })) + }))) ); assert_eq!( parser("[[[:alnum:]]]").parse(), - Ok(Ast::class_bracketed(ast::ClassBracketed { + Ok(Ast::Class(ast::Class::Bracketed(ast::ClassBracketed { span: span(0..13), negated: false, kind: itemset(item_bracket(ast::ClassBracketed { @@ -5177,11 +4981,11 @@ negated: false, kind: itemset(item_ascii(alnum(span(2..11), false))), })), - })) + }))) ); assert_eq!( parser("[[:alnum:]&&[:lower:]]").parse(), - Ok(Ast::class_bracketed(ast::ClassBracketed { + Ok(Ast::Class(ast::Class::Bracketed(ast::ClassBracketed { span: span(0..22), negated: false, kind: intersection( @@ -5189,11 +4993,11 @@ itemset(item_ascii(alnum(span(1..10), false))), itemset(item_ascii(lower(span(12..21), false))), ), - })) + }))) ); assert_eq!( parser("[[:alnum:]--[:lower:]]").parse(), - Ok(Ast::class_bracketed(ast::ClassBracketed { + Ok(Ast::Class(ast::Class::Bracketed(ast::ClassBracketed { span: span(0..22), negated: false, kind: difference( @@ -5201,11 +5005,11 @@ itemset(item_ascii(alnum(span(1..10), false))), itemset(item_ascii(lower(span(12..21), false))), ), - })) + }))) ); assert_eq!( parser("[[:alnum:]~~[:lower:]]").parse(), - Ok(Ast::class_bracketed(ast::ClassBracketed { + Ok(Ast::Class(ast::Class::Bracketed(ast::ClassBracketed { span: span(0..22), negated: false, kind: symdifference( @@ -5213,20 +5017,20 @@ itemset(item_ascii(alnum(span(1..10), false))), itemset(item_ascii(lower(span(12..21), false))), ), - })) + }))) ); assert_eq!( parser("[a]").parse(), - Ok(Ast::class_bracketed(ast::ClassBracketed { + Ok(Ast::Class(ast::Class::Bracketed(ast::ClassBracketed { span: span(0..3), negated: false, kind: itemset(lit(span(1..2), 'a')), - })) + }))) ); assert_eq!( parser(r"[a\]]").parse(), - Ok(Ast::class_bracketed(ast::ClassBracketed { + Ok(Ast::Class(ast::Class::Bracketed(ast::ClassBracketed { span: span(0..5), negated: false, kind: union( @@ -5240,11 +5044,11 @@ }), ] ), - })) + }))) ); assert_eq!( parser(r"[a\-z]").parse(), - Ok(Ast::class_bracketed(ast::ClassBracketed { + Ok(Ast::Class(ast::Class::Bracketed(ast::ClassBracketed { span: span(0..6), negated: false, kind: union( @@ -5259,44 +5063,44 @@ lit(span(4..5), 'z'), ] ), - })) + }))) ); assert_eq!( parser("[ab]").parse(), - Ok(Ast::class_bracketed(ast::ClassBracketed { + Ok(Ast::Class(ast::Class::Bracketed(ast::ClassBracketed { span: span(0..4), negated: false, kind: union( span(1..3), vec![lit(span(1..2), 'a'), lit(span(2..3), 'b'),] ), - })) + }))) ); assert_eq!( parser("[a-]").parse(), - Ok(Ast::class_bracketed(ast::ClassBracketed { + Ok(Ast::Class(ast::Class::Bracketed(ast::ClassBracketed { span: span(0..4), negated: false, kind: union( span(1..3), vec![lit(span(1..2), 'a'), lit(span(2..3), '-'),] ), - })) + }))) ); assert_eq!( parser("[-a]").parse(), - Ok(Ast::class_bracketed(ast::ClassBracketed { + Ok(Ast::Class(ast::Class::Bracketed(ast::ClassBracketed { span: span(0..4), negated: false, kind: union( span(1..3), vec![lit(span(1..2), '-'), lit(span(2..3), 'a'),] ), - })) + }))) ); assert_eq!( parser(r"[\pL]").parse(), - Ok(Ast::class_bracketed(ast::ClassBracketed { + Ok(Ast::Class(ast::Class::Bracketed(ast::ClassBracketed { span: span(0..5), negated: false, kind: itemset(item_unicode(ast::ClassUnicode { @@ -5304,11 +5108,11 @@ negated: false, kind: ast::ClassUnicodeKind::OneLetter('L'), })), - })) + }))) ); assert_eq!( parser(r"[\w]").parse(), - Ok(Ast::class_bracketed(ast::ClassBracketed { + Ok(Ast::Class(ast::Class::Bracketed(ast::ClassBracketed { span: span(0..4), negated: false, kind: itemset(item_perl(ast::ClassPerl { @@ -5316,11 +5120,11 @@ kind: ast::ClassPerlKind::Word, negated: false, })), - })) + }))) ); assert_eq!( parser(r"[a\wz]").parse(), - Ok(Ast::class_bracketed(ast::ClassBracketed { + Ok(Ast::Class(ast::Class::Bracketed(ast::ClassBracketed { span: span(0..6), negated: false, kind: union( @@ -5335,20 +5139,20 @@ lit(span(4..5), 'z'), ] ), - })) + }))) ); assert_eq!( parser("[a-z]").parse(), - Ok(Ast::class_bracketed(ast::ClassBracketed { + Ok(Ast::Class(ast::Class::Bracketed(ast::ClassBracketed { span: span(0..5), negated: false, kind: itemset(range(span(1..4), 'a', 'z')), - })) + }))) ); assert_eq!( parser("[a-cx-z]").parse(), - Ok(Ast::class_bracketed(ast::ClassBracketed { + Ok(Ast::Class(ast::Class::Bracketed(ast::ClassBracketed { span: span(0..8), negated: false, kind: union( @@ -5358,11 +5162,11 @@ range(span(4..7), 'x', 'z'), ] ), - })) + }))) ); assert_eq!( parser(r"[\w&&a-cx-z]").parse(), - Ok(Ast::class_bracketed(ast::ClassBracketed { + Ok(Ast::Class(ast::Class::Bracketed(ast::ClassBracketed { span: span(0..12), negated: false, kind: intersection( @@ -5380,11 +5184,11 @@ ] ), ), - })) + }))) ); assert_eq!( parser(r"[a-cx-z&&\w]").parse(), - Ok(Ast::class_bracketed(ast::ClassBracketed { + Ok(Ast::Class(ast::Class::Bracketed(ast::ClassBracketed { span: span(0..12), negated: false, kind: intersection( @@ -5402,11 +5206,11 @@ negated: false, })), ), - })) + }))) ); assert_eq!( parser(r"[a--b--c]").parse(), - Ok(Ast::class_bracketed(ast::ClassBracketed { + Ok(Ast::Class(ast::Class::Bracketed(ast::ClassBracketed { span: span(0..9), negated: false, kind: difference( @@ -5418,11 +5222,11 @@ ), itemset(lit(span(7..8), 'c')), ), - })) + }))) ); assert_eq!( parser(r"[a~~b~~c]").parse(), - Ok(Ast::class_bracketed(ast::ClassBracketed { + Ok(Ast::Class(ast::Class::Bracketed(ast::ClassBracketed { span: span(0..9), negated: false, kind: symdifference( @@ -5434,11 +5238,11 @@ ), itemset(lit(span(7..8), 'c')), ), - })) + }))) ); assert_eq!( parser(r"[\^&&^]").parse(), - Ok(Ast::class_bracketed(ast::ClassBracketed { + Ok(Ast::Class(ast::Class::Bracketed(ast::ClassBracketed { span: span(0..7), negated: false, kind: intersection( @@ -5450,11 +5254,11 @@ })), itemset(lit(span(5..6), '^')), ), - })) + }))) ); assert_eq!( parser(r"[\&&&&]").parse(), - Ok(Ast::class_bracketed(ast::ClassBracketed { + Ok(Ast::Class(ast::Class::Bracketed(ast::ClassBracketed { span: span(0..7), negated: false, kind: intersection( @@ -5466,11 +5270,11 @@ })), itemset(lit(span(5..6), '&')), ), - })) + }))) ); assert_eq!( parser(r"[&&&&]").parse(), - Ok(Ast::class_bracketed(ast::ClassBracketed { + Ok(Ast::Class(ast::Class::Bracketed(ast::ClassBracketed { span: span(0..6), negated: false, kind: intersection( @@ -5482,13 +5286,13 @@ ), itemset(empty(span(5..5))), ), - })) + }))) ); let pat = "[☃-⛄]"; assert_eq!( parser(pat).parse(), - Ok(Ast::class_bracketed(ast::ClassBracketed { + Ok(Ast::Class(ast::Class::Bracketed(ast::ClassBracketed { span: span_range(pat, 0..9), negated: false, kind: itemset(ast::ClassSetItem::Range(ast::ClassSetRange { @@ -5504,20 +5308,20 @@ c: '⛄', }, })), - })) + }))) ); assert_eq!( parser(r"[]]").parse(), - Ok(Ast::class_bracketed(ast::ClassBracketed { + Ok(Ast::Class(ast::Class::Bracketed(ast::ClassBracketed { span: span(0..3), negated: false, kind: itemset(lit(span(1..2), ']')), - })) + }))) ); assert_eq!( parser(r"[]\[]").parse(), - Ok(Ast::class_bracketed(ast::ClassBracketed { + Ok(Ast::Class(ast::Class::Bracketed(ast::ClassBracketed { span: span(0..5), negated: false, kind: union( @@ -5531,14 +5335,14 @@ }), ] ), - })) + }))) ); assert_eq!( parser(r"[\[]]").parse(), Ok(concat( 0..5, vec![ - Ast::class_bracketed(ast::ClassBracketed { + Ast::Class(ast::Class::Bracketed(ast::ClassBracketed { span: span(0..4), negated: false, kind: itemset(ast::ClassSetItem::Literal( @@ -5548,8 +5352,8 @@ c: '[', } )), - }), - Ast::literal(ast::Literal { + })), + Ast::Literal(ast::Literal { span: span(4..5), kind: ast::LiteralKind::Verbatim, c: ']', @@ -6110,15 +5914,15 @@ assert_eq!( parser(r"\pNz").parse(), - Ok(Ast::concat(ast::Concat { + Ok(Ast::Concat(ast::Concat { span: span(0..4), asts: vec![ - Ast::class_unicode(ast::ClassUnicode { + Ast::Class(ast::Class::Unicode(ast::ClassUnicode { span: span(0..3), negated: false, kind: ast::ClassUnicodeKind::OneLetter('N'), - }), - Ast::literal(ast::Literal { + })), + Ast::Literal(ast::Literal { span: span(3..4), kind: ast::LiteralKind::Verbatim, c: 'z', @@ -6128,15 +5932,15 @@ ); assert_eq!( parser(r"\p{Greek}z").parse(), - Ok(Ast::concat(ast::Concat { + Ok(Ast::Concat(ast::Concat { span: span(0..10), asts: vec![ - Ast::class_unicode(ast::ClassUnicode { + Ast::Class(ast::Class::Unicode(ast::ClassUnicode { span: span(0..9), negated: false, kind: ast::ClassUnicodeKind::Named(s("Greek")), - }), - Ast::literal(ast::Literal { + })), + Ast::Literal(ast::Literal { span: span(9..10), kind: ast::LiteralKind::Verbatim, c: 'z', @@ -6213,23 +6017,23 @@ assert_eq!( parser(r"\d").parse(), - Ok(Ast::class_perl(ast::ClassPerl { + Ok(Ast::Class(ast::Class::Perl(ast::ClassPerl { span: span(0..2), kind: ast::ClassPerlKind::Digit, negated: false, - })) + }))) ); assert_eq!( parser(r"\dz").parse(), - Ok(Ast::concat(ast::Concat { + Ok(Ast::Concat(ast::Concat { span: span(0..3), asts: vec![ - Ast::class_perl(ast::ClassPerl { + Ast::Class(ast::Class::Perl(ast::ClassPerl { span: span(0..2), kind: ast::ClassPerlKind::Digit, negated: false, - }), - Ast::literal(ast::Literal { + })), + Ast::Literal(ast::Literal { span: span(2..3), kind: ast::LiteralKind::Verbatim, c: 'z', diff -Nru temporalio-1.3.0/vendor/regex-syntax/src/ast/print.rs temporalio-1.3.0/vendor/regex-syntax/src/ast/print.rs --- temporalio-1.3.0/vendor/regex-syntax/src/ast/print.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/regex-syntax/src/ast/print.rs 2023-10-30 19:40:00.000000000 +0000 @@ -80,21 +80,27 @@ fn visit_pre(&mut self, ast: &Ast) -> fmt::Result { match *ast { Ast::Group(ref x) => self.fmt_group_pre(x), - Ast::ClassBracketed(ref x) => self.fmt_class_bracketed_pre(x), + Ast::Class(ast::Class::Bracketed(ref x)) => { + self.fmt_class_bracketed_pre(x) + } _ => Ok(()), } } fn visit_post(&mut self, ast: &Ast) -> fmt::Result { + use crate::ast::Class; + match *ast { Ast::Empty(_) => Ok(()), Ast::Flags(ref x) => self.fmt_set_flags(x), Ast::Literal(ref x) => self.fmt_literal(x), Ast::Dot(_) => self.wtr.write_str("."), Ast::Assertion(ref x) => self.fmt_assertion(x), - Ast::ClassPerl(ref x) => self.fmt_class_perl(x), - Ast::ClassUnicode(ref x) => self.fmt_class_unicode(x), - Ast::ClassBracketed(ref x) => self.fmt_class_bracketed_post(x), + Ast::Class(Class::Perl(ref x)) => self.fmt_class_perl(x), + Ast::Class(Class::Unicode(ref x)) => self.fmt_class_unicode(x), + Ast::Class(Class::Bracketed(ref x)) => { + self.fmt_class_bracketed_post(x) + } Ast::Repetition(ref x) => self.fmt_repetition(x), Ast::Group(ref x) => self.fmt_group_post(x), Ast::Alternation(_) => Ok(()), @@ -261,12 +267,6 @@ EndText => self.wtr.write_str(r"\z"), WordBoundary => self.wtr.write_str(r"\b"), NotWordBoundary => self.wtr.write_str(r"\B"), - WordBoundaryStart => self.wtr.write_str(r"\b{start}"), - WordBoundaryEnd => self.wtr.write_str(r"\b{end}"), - WordBoundaryStartAngle => self.wtr.write_str(r"\<"), - WordBoundaryEndAngle => self.wtr.write_str(r"\>"), - WordBoundaryStartHalf => self.wtr.write_str(r"\b{start-half}"), - WordBoundaryEndHalf => self.wtr.write_str(r"\b{end-half}"), } } diff -Nru temporalio-1.3.0/vendor/regex-syntax/src/ast/visitor.rs temporalio-1.3.0/vendor/regex-syntax/src/ast/visitor.rs --- temporalio-1.3.0/vendor/regex-syntax/src/ast/visitor.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/regex-syntax/src/ast/visitor.rs 2023-10-30 19:40:00.000000000 +0000 @@ -264,7 +264,7 @@ visitor: &mut V, ) -> Result>, V::Err> { Ok(match *ast { - Ast::ClassBracketed(ref x) => { + Ast::Class(ast::Class::Bracketed(ref x)) => { self.visit_class(x, visitor)?; None } diff -Nru temporalio-1.3.0/vendor/regex-syntax/src/hir/literal.rs temporalio-1.3.0/vendor/regex-syntax/src/hir/literal.rs --- temporalio-1.3.0/vendor/regex-syntax/src/hir/literal.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/regex-syntax/src/hir/literal.rs 2023-10-30 19:40:00.000000000 +0000 @@ -2235,19 +2235,24 @@ /// after them and because any removed literals are guaranteed to never /// match. fn minimize(literals: &mut Vec, keep_exact: bool) { - let mut trie = PreferenceTrie { + use core::cell::RefCell; + + // MSRV(1.61): Use retain_mut here to avoid interior mutability. + let trie = RefCell::new(PreferenceTrie { states: vec![], matches: vec![], next_literal_index: 1, - }; + }); let mut make_inexact = vec![]; - literals.retain_mut(|lit| match trie.insert(lit.as_bytes()) { - Ok(_) => true, - Err(i) => { - if !keep_exact { - make_inexact.push(i.checked_sub(1).unwrap()); + literals.retain(|lit| { + match trie.borrow_mut().insert(lit.as_bytes()) { + Ok(_) => true, + Err(i) => { + if !keep_exact { + make_inexact.push(i.checked_sub(1).unwrap()); + } + false } - false } }); for i in make_inexact { diff -Nru temporalio-1.3.0/vendor/regex-syntax/src/hir/mod.rs temporalio-1.3.0/vendor/regex-syntax/src/hir/mod.rs --- temporalio-1.3.0/vendor/regex-syntax/src/hir/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/regex-syntax/src/hir/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -797,18 +797,13 @@ /// The high-level intermediate representation of a character class. /// /// A character class corresponds to a set of characters. A character is either -/// defined by a Unicode scalar value or a byte. +/// defined by a Unicode scalar value or a byte. Unicode characters are used +/// by default, while bytes are used when Unicode mode (via the `u` flag) is +/// disabled. /// /// A character class, regardless of its character type, is represented by a /// sequence of non-overlapping non-adjacent ranges of characters. /// -/// There are no guarantees about which class variant is used. Generally -/// speaking, the Unicode variat is used whenever a class needs to contain -/// non-ASCII Unicode scalar values. But the Unicode variant can be used even -/// when Unicode mode is disabled. For example, at the time of writing, the -/// regex `(?-u:a|\xc2\xa0)` will compile down to HIR for the Unicode class -/// `[a\u00A0]` due to optimizations. -/// /// Note that `Bytes` variant may be produced even when it exclusively matches /// valid UTF-8. This is because a `Bytes` variant represents an intention by /// the author of the regular expression to disable Unicode mode, which in turn @@ -1331,9 +1326,8 @@ } } -/// A set of characters represented by arbitrary bytes. -/// -/// Each byte corresponds to one character. +/// A set of characters represented by arbitrary bytes (where one byte +/// corresponds to one character). #[derive(Clone, Debug, Eq, PartialEq)] pub struct ClassBytes { set: IntervalSet, @@ -1635,42 +1629,6 @@ WordUnicode = 1 << 8, /// Match a Unicode-aware negation of a word boundary. WordUnicodeNegate = 1 << 9, - /// Match the start of an ASCII-only word boundary. That is, this matches a - /// position at either the beginning of the haystack or where the previous - /// character is not a word character and the following character is a word - /// character. - WordStartAscii = 1 << 10, - /// Match the end of an ASCII-only word boundary. That is, this matches - /// a position at either the end of the haystack or where the previous - /// character is a word character and the following character is not a word - /// character. - WordEndAscii = 1 << 11, - /// Match the start of a Unicode word boundary. That is, this matches a - /// position at either the beginning of the haystack or where the previous - /// character is not a word character and the following character is a word - /// character. - WordStartUnicode = 1 << 12, - /// Match the end of a Unicode word boundary. That is, this matches a - /// position at either the end of the haystack or where the previous - /// character is a word character and the following character is not a word - /// character. - WordEndUnicode = 1 << 13, - /// Match the start half of an ASCII-only word boundary. That is, this - /// matches a position at either the beginning of the haystack or where the - /// previous character is not a word character. - WordStartHalfAscii = 1 << 14, - /// Match the end half of an ASCII-only word boundary. That is, this - /// matches a position at either the end of the haystack or where the - /// following character is not a word character. - WordEndHalfAscii = 1 << 15, - /// Match the start half of a Unicode word boundary. That is, this matches - /// a position at either the beginning of the haystack or where the - /// previous character is not a word character. - WordStartHalfUnicode = 1 << 16, - /// Match the end half of a Unicode word boundary. That is, this matches - /// a position at either the end of the haystack or where the following - /// character is not a word character. - WordEndHalfUnicode = 1 << 17, } impl Look { @@ -1692,14 +1650,6 @@ Look::WordAsciiNegate => Look::WordAsciiNegate, Look::WordUnicode => Look::WordUnicode, Look::WordUnicodeNegate => Look::WordUnicodeNegate, - Look::WordStartAscii => Look::WordEndAscii, - Look::WordEndAscii => Look::WordStartAscii, - Look::WordStartUnicode => Look::WordEndUnicode, - Look::WordEndUnicode => Look::WordStartUnicode, - Look::WordStartHalfAscii => Look::WordEndHalfAscii, - Look::WordEndHalfAscii => Look::WordStartHalfAscii, - Look::WordStartHalfUnicode => Look::WordEndHalfUnicode, - Look::WordEndHalfUnicode => Look::WordStartHalfUnicode, } } @@ -1708,36 +1658,28 @@ /// constructor is guaranteed to return the same look-around variant that /// one started with within a semver compatible release of this crate. #[inline] - pub const fn as_repr(self) -> u32 { + pub const fn as_repr(self) -> u16 { // AFAIK, 'as' is the only way to zero-cost convert an int enum to an // actual int. - self as u32 + self as u16 } /// Given the underlying representation of a `Look` value, return the /// corresponding `Look` value if the representation is valid. Otherwise /// `None` is returned. #[inline] - pub const fn from_repr(repr: u32) -> Option { + pub const fn from_repr(repr: u16) -> Option { match repr { - 0b00_0000_0000_0000_0001 => Some(Look::Start), - 0b00_0000_0000_0000_0010 => Some(Look::End), - 0b00_0000_0000_0000_0100 => Some(Look::StartLF), - 0b00_0000_0000_0000_1000 => Some(Look::EndLF), - 0b00_0000_0000_0001_0000 => Some(Look::StartCRLF), - 0b00_0000_0000_0010_0000 => Some(Look::EndCRLF), - 0b00_0000_0000_0100_0000 => Some(Look::WordAscii), - 0b00_0000_0000_1000_0000 => Some(Look::WordAsciiNegate), - 0b00_0000_0001_0000_0000 => Some(Look::WordUnicode), - 0b00_0000_0010_0000_0000 => Some(Look::WordUnicodeNegate), - 0b00_0000_0100_0000_0000 => Some(Look::WordStartAscii), - 0b00_0000_1000_0000_0000 => Some(Look::WordEndAscii), - 0b00_0001_0000_0000_0000 => Some(Look::WordStartUnicode), - 0b00_0010_0000_0000_0000 => Some(Look::WordEndUnicode), - 0b00_0100_0000_0000_0000 => Some(Look::WordStartHalfAscii), - 0b00_1000_0000_0000_0000 => Some(Look::WordEndHalfAscii), - 0b01_0000_0000_0000_0000 => Some(Look::WordStartHalfUnicode), - 0b10_0000_0000_0000_0000 => Some(Look::WordEndHalfUnicode), + 0b00_0000_0001 => Some(Look::Start), + 0b00_0000_0010 => Some(Look::End), + 0b00_0000_0100 => Some(Look::StartLF), + 0b00_0000_1000 => Some(Look::EndLF), + 0b00_0001_0000 => Some(Look::StartCRLF), + 0b00_0010_0000 => Some(Look::EndCRLF), + 0b00_0100_0000 => Some(Look::WordAscii), + 0b00_1000_0000 => Some(Look::WordAsciiNegate), + 0b01_0000_0000 => Some(Look::WordUnicode), + 0b10_0000_0000 => Some(Look::WordUnicodeNegate), _ => None, } } @@ -1762,14 +1704,6 @@ Look::WordAsciiNegate => 'B', Look::WordUnicode => 'ð›ƒ', Look::WordUnicodeNegate => 'ðš©', - Look::WordStartAscii => '<', - Look::WordEndAscii => '>', - Look::WordStartUnicode => '〈', - Look::WordEndUnicode => '〉', - Look::WordStartHalfAscii => 'â—', - Look::WordEndHalfAscii => 'â–·', - Look::WordStartHalfUnicode => 'â—€', - Look::WordEndHalfUnicode => 'â–¶', } } } @@ -2660,7 +2594,7 @@ /// range of `u16` values to be represented. For example, even if the /// current implementation only makes use of the 10 least significant bits, /// it may use more bits in a future semver compatible release. - pub bits: u32, + pub bits: u16, } impl LookSet { @@ -2763,22 +2697,13 @@ pub fn contains_word_unicode(self) -> bool { self.contains(Look::WordUnicode) || self.contains(Look::WordUnicodeNegate) - || self.contains(Look::WordStartUnicode) - || self.contains(Look::WordEndUnicode) - || self.contains(Look::WordStartHalfUnicode) - || self.contains(Look::WordEndHalfUnicode) } /// Returns true if and only if this set contains any ASCII word boundary /// or negated ASCII word boundary assertions. #[inline] pub fn contains_word_ascii(self) -> bool { - self.contains(Look::WordAscii) - || self.contains(Look::WordAsciiNegate) - || self.contains(Look::WordStartAscii) - || self.contains(Look::WordEndAscii) - || self.contains(Look::WordStartHalfAscii) - || self.contains(Look::WordEndHalfAscii) + self.contains(Look::WordAscii) || self.contains(Look::WordAsciiNegate) } /// Returns an iterator over all of the look-around assertions in this set. @@ -2857,31 +2782,29 @@ *self = self.intersect(other); } - /// Return a `LookSet` from the slice given as a native endian 32-bit + /// Return a `LookSet` from the slice given as a native endian 16-bit /// integer. /// /// # Panics /// - /// This panics if `slice.len() < 4`. + /// This panics if `slice.len() < 2`. #[inline] pub fn read_repr(slice: &[u8]) -> LookSet { - let bits = u32::from_ne_bytes(slice[..4].try_into().unwrap()); + let bits = u16::from_ne_bytes(slice[..2].try_into().unwrap()); LookSet { bits } } - /// Write a `LookSet` as a native endian 32-bit integer to the beginning + /// Write a `LookSet` as a native endian 16-bit integer to the beginning /// of the slice given. /// /// # Panics /// - /// This panics if `slice.len() < 4`. + /// This panics if `slice.len() < 2`. #[inline] pub fn write_repr(self, slice: &mut [u8]) { let raw = self.bits.to_ne_bytes(); slice[0] = raw[0]; slice[1] = raw[1]; - slice[2] = raw[2]; - slice[3] = raw[3]; } } @@ -2914,9 +2837,9 @@ return None; } // We'll never have more than u8::MAX distinct look-around assertions, - // so 'bit' will always fit into a u16. - let bit = u16::try_from(self.set.bits.trailing_zeros()).unwrap(); - let look = Look::from_repr(1 << bit)?; + // so 'repr' will always fit into a u16. + let repr = u16::try_from(self.set.bits.trailing_zeros()).unwrap(); + let look = Look::from_repr(1 << repr)?; self.set = self.set.remove(look); Some(look) } @@ -3838,7 +3761,7 @@ assert_eq!(0, set.iter().count()); let set = LookSet::full(); - assert_eq!(18, set.iter().count()); + assert_eq!(10, set.iter().count()); let set = LookSet::empty().insert(Look::StartLF).insert(Look::WordUnicode); @@ -3856,6 +3779,6 @@ let res = format!("{:?}", LookSet::empty()); assert_eq!("∅", res); let res = format!("{:?}", LookSet::full()); - assert_eq!("Az^$rRbBð›ƒðš©<>〈〉â—▷◀▶", res); + assert_eq!("Az^$rRbBð›ƒðš©", res); } } diff -Nru temporalio-1.3.0/vendor/regex-syntax/src/hir/print.rs temporalio-1.3.0/vendor/regex-syntax/src/hir/print.rs --- temporalio-1.3.0/vendor/regex-syntax/src/hir/print.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/regex-syntax/src/hir/print.rs 2023-10-30 19:40:00.000000000 +0000 @@ -202,30 +202,6 @@ hir::Look::WordUnicodeNegate => { self.wtr.write_str(r"\B")?; } - hir::Look::WordStartAscii => { - self.wtr.write_str(r"(?-u:\b{start})")?; - } - hir::Look::WordEndAscii => { - self.wtr.write_str(r"(?-u:\b{end})")?; - } - hir::Look::WordStartUnicode => { - self.wtr.write_str(r"\b{start}")?; - } - hir::Look::WordEndUnicode => { - self.wtr.write_str(r"\b{end}")?; - } - hir::Look::WordStartHalfAscii => { - self.wtr.write_str(r"(?-u:\b{start-half})")?; - } - hir::Look::WordEndHalfAscii => { - self.wtr.write_str(r"(?-u:\b{end-half})")?; - } - hir::Look::WordStartHalfUnicode => { - self.wtr.write_str(r"\b{start-half}")?; - } - hir::Look::WordEndHalfUnicode => { - self.wtr.write_str(r"\b{end-half}")?; - } }, HirKind::Capture(hir::Capture { ref name, .. }) => { self.wtr.write_str("(")?; diff -Nru temporalio-1.3.0/vendor/regex-syntax/src/hir/translate.rs temporalio-1.3.0/vendor/regex-syntax/src/hir/translate.rs --- temporalio-1.3.0/vendor/regex-syntax/src/hir/translate.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/regex-syntax/src/hir/translate.rs 2023-10-30 19:40:00.000000000 +0000 @@ -337,7 +337,7 @@ fn visit_pre(&mut self, ast: &Ast) -> Result<()> { match *ast { - Ast::ClassBracketed(_) => { + Ast::Class(ast::Class::Bracketed(_)) => { if self.flags().unicode() { let cls = hir::ClassUnicode::empty(); self.push(HirFrame::ClassUnicode(cls)); @@ -354,14 +354,14 @@ .unwrap_or_else(|| self.flags()); self.push(HirFrame::Group { old_flags }); } + Ast::Concat(ref x) if x.asts.is_empty() => {} Ast::Concat(_) => { self.push(HirFrame::Concat); } - Ast::Alternation(ref x) => { + Ast::Alternation(ref x) if x.asts.is_empty() => {} + Ast::Alternation(_) => { self.push(HirFrame::Alternation); - if !x.asts.is_empty() { - self.push(HirFrame::AlternationBranch); - } + self.push(HirFrame::AlternationBranch); } _ => {} } @@ -386,20 +386,29 @@ // consistency sake. self.push(HirFrame::Expr(Hir::empty())); } - Ast::Literal(ref x) => match self.ast_literal_to_scalar(x)? { - Either::Right(byte) => self.push_byte(byte), - Either::Left(ch) => match self.case_fold_char(x.span, ch)? { - None => self.push_char(ch), - Some(expr) => self.push(HirFrame::Expr(expr)), - }, - }, - Ast::Dot(ref span) => { - self.push(HirFrame::Expr(self.hir_dot(**span)?)); + Ast::Literal(ref x) => { + match self.ast_literal_to_scalar(x)? { + Either::Right(byte) => self.push_byte(byte), + Either::Left(ch) => { + if !self.flags().unicode() && ch.len_utf8() > 1 { + return Err(self + .error(x.span, ErrorKind::UnicodeNotAllowed)); + } + match self.case_fold_char(x.span, ch)? { + None => self.push_char(ch), + Some(expr) => self.push(HirFrame::Expr(expr)), + } + } + } + // self.push(HirFrame::Expr(self.hir_literal(x)?)); + } + Ast::Dot(span) => { + self.push(HirFrame::Expr(self.hir_dot(span)?)); } Ast::Assertion(ref x) => { self.push(HirFrame::Expr(self.hir_assertion(x)?)); } - Ast::ClassPerl(ref x) => { + Ast::Class(ast::Class::Perl(ref x)) => { if self.flags().unicode() { let cls = self.hir_perl_unicode_class(x)?; let hcls = hir::Class::Unicode(cls); @@ -410,11 +419,11 @@ self.push(HirFrame::Expr(Hir::class(hcls))); } } - Ast::ClassUnicode(ref x) => { + Ast::Class(ast::Class::Unicode(ref x)) => { let cls = hir::Class::Unicode(self.hir_unicode_class(x)?); self.push(HirFrame::Expr(Hir::class(cls))); } - Ast::ClassBracketed(ref ast) => { + Ast::Class(ast::Class::Bracketed(ref ast)) => { if self.flags().unicode() { let mut cls = self.pop().unwrap().unwrap_class_unicode(); self.unicode_fold_and_negate( @@ -865,8 +874,8 @@ })?; Ok(Some(Hir::class(hir::Class::Unicode(cls)))) } else { - if !c.is_ascii() { - return Ok(None); + if c.len_utf8() > 1 { + return Err(self.error(span, ErrorKind::UnicodeNotAllowed)); } // If case folding won't do anything, then don't bother trying. match c { @@ -955,34 +964,6 @@ } else { hir::Look::WordAsciiNegate }), - ast::AssertionKind::WordBoundaryStart - | ast::AssertionKind::WordBoundaryStartAngle => { - Hir::look(if unicode { - hir::Look::WordStartUnicode - } else { - hir::Look::WordStartAscii - }) - } - ast::AssertionKind::WordBoundaryEnd - | ast::AssertionKind::WordBoundaryEndAngle => { - Hir::look(if unicode { - hir::Look::WordEndUnicode - } else { - hir::Look::WordEndAscii - }) - } - ast::AssertionKind::WordBoundaryStartHalf => { - Hir::look(if unicode { - hir::Look::WordStartHalfUnicode - } else { - hir::Look::WordStartHalfAscii - }) - } - ast::AssertionKind::WordBoundaryEndHalf => Hir::look(if unicode { - hir::Look::WordEndHalfUnicode - } else { - hir::Look::WordEndHalfAscii - }), }) } @@ -1204,8 +1185,9 @@ match self.ast_literal_to_scalar(ast)? { Either::Right(byte) => Ok(byte), Either::Left(ch) => { - if ch.is_ascii() { - Ok(u8::try_from(ch).unwrap()) + let cp = u32::from(ch); + if cp <= 0x7F { + Ok(u8::try_from(cp).unwrap()) } else { // We can't feasibly support Unicode in // byte oriented classes. Byte classes don't @@ -1653,7 +1635,16 @@ assert_eq!(t_bytes(r"(?-u)\x61"), hir_lit("a")); assert_eq!(t_bytes(r"(?-u)\xFF"), hir_blit(b"\xFF")); - assert_eq!(t("(?-u)☃"), hir_lit("☃")); + assert_eq!( + t_err("(?-u)☃"), + TestError { + kind: hir::ErrorKind::UnicodeNotAllowed, + span: Span::new( + Position::new(5, 1, 6), + Position::new(8, 1, 7) + ), + } + ); assert_eq!( t_err(r"(?-u)\xFF"), TestError { @@ -1731,7 +1722,16 @@ ); assert_eq!(t_bytes(r"(?i-u)\xFF"), hir_blit(b"\xFF")); - assert_eq!(t("(?i-u)β"), hir_lit("β"),); + assert_eq!( + t_err("(?i-u)β"), + TestError { + kind: hir::ErrorKind::UnicodeNotAllowed, + span: Span::new( + Position::new(6, 1, 7), + Position::new(8, 1, 8), + ), + } + ); } #[test] @@ -3626,99 +3626,4 @@ ]), ); } - - #[test] - fn regression_alt_empty_concat() { - use crate::ast::{self, Ast}; - - let span = Span::splat(Position::new(0, 0, 0)); - let ast = Ast::alternation(ast::Alternation { - span, - asts: vec![Ast::concat(ast::Concat { span, asts: vec![] })], - }); - - let mut t = Translator::new(); - assert_eq!(Ok(Hir::empty()), t.translate("", &ast)); - } - - #[test] - fn regression_empty_alt() { - use crate::ast::{self, Ast}; - - let span = Span::splat(Position::new(0, 0, 0)); - let ast = Ast::concat(ast::Concat { - span, - asts: vec![Ast::alternation(ast::Alternation { - span, - asts: vec![], - })], - }); - - let mut t = Translator::new(); - assert_eq!(Ok(Hir::fail()), t.translate("", &ast)); - } - - #[test] - fn regression_singleton_alt() { - use crate::{ - ast::{self, Ast}, - hir::Dot, - }; - - let span = Span::splat(Position::new(0, 0, 0)); - let ast = Ast::concat(ast::Concat { - span, - asts: vec![Ast::alternation(ast::Alternation { - span, - asts: vec![Ast::dot(span)], - })], - }); - - let mut t = Translator::new(); - assert_eq!(Ok(Hir::dot(Dot::AnyCharExceptLF)), t.translate("", &ast)); - } - - // See: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=63168 - #[test] - fn regression_fuzz_match() { - let pat = "[(\u{6} \0-\u{afdf5}] \0 "; - let ast = ParserBuilder::new() - .octal(false) - .ignore_whitespace(true) - .build() - .parse(pat) - .unwrap(); - let hir = TranslatorBuilder::new() - .utf8(true) - .case_insensitive(false) - .multi_line(false) - .dot_matches_new_line(false) - .swap_greed(true) - .unicode(true) - .build() - .translate(pat, &ast) - .unwrap(); - assert_eq!( - hir, - Hir::concat(vec![ - hir_uclass(&[('\0', '\u{afdf5}')]), - hir_lit("\0"), - ]) - ); - } - - // See: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=63155 - #[cfg(feature = "unicode")] - #[test] - fn regression_fuzz_difference1() { - let pat = r"\W\W|\W[^\v--\W\W\P{Script_Extensions:Pau_Cin_Hau}\u10A1A1-\U{3E3E3}--~~~~--~~~~~~~~------~~~~~~--~~~~~~]*"; - let _ = t(pat); // shouldn't panic - } - - // See: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=63153 - #[test] - fn regression_fuzz_char_decrement1() { - let pat = "w[w[^w?\rw\rw[^w?\rw[^w?\rw[^w?\rw[^w?\rw[^w?\rw[^w?\r\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0w?\rw[^w?\rw[^w?\rw[^w\0\0\u{1}\0]\0\0-*\0]\0\0\0\0\0\0\u{1}\0]\0\0-*\0]\0\0\0\0\0\u{1}\0]\0\0\0\0\0\0\0\0\0*\0\0\u{1}\0]\0\0-*\0][^w?\rw[^w?\rw[^w?\rw[^w?\rw[^w?\rw[^w?\rw[^w\0\0\u{1}\0]\0\0-*\0]\0\0\0\0\0\0\u{1}\0]\0\0-*\0]\0\0\0\0\0\u{1}\0]\0\0\0\0\0\0\0\0\0x\0\0\u{1}\0]\0\0-*\0]\0\0\0\0\0\0\0\0\0*??\0\u{7f}{2}\u{10}??\0\0\0\0\0\0\0\0\0\u{3}\0\0\0}\0-*\0]\0\0\0\0\0\0\u{1}\0]\0\0-*\0]\0\0\0\0\0\0\u{1}\0]\0\0-*\0]\0\0\0\0\0\u{1}\0]\0\0-*\0]\0\0\0\0\0\0\0\u{1}\0]\0\u{1}\u{1}H-i]-]\0\0\0\0\u{1}\0]\0\0\0\u{1}\0]\0\0-*\0\0\0\0\u{1}9-\u{7f}]\0'|-\u{7f}]\0'|(?i-ux)[-\u{7f}]\0'\u{3}\0\0\0}\0-*\0] will result in a parse error. Thus, we can // turn them into something else in the future without it being a // backwards incompatible change. - // - // OK, now we support \< and \>, and we need to retain them as *not* - // escapeable here since the escape sequence is significant. '<' | '>' => false, _ => true, } @@ -372,7 +381,7 @@ /// Returns true if and only if the given character is an ASCII word character. /// /// An ASCII word character is defined by the following character class: -/// `[_0-9a-zA-Z]`. +/// `[_0-9a-zA-Z]'. pub fn is_word_byte(c: u8) -> bool { match c { b'_' | b'0'..=b'9' | b'a'..=b'z' | b'A'..=b'Z' => true, diff -Nru temporalio-1.3.0/vendor/reqwest/.cargo-checksum.json temporalio-1.3.0/vendor/reqwest/.cargo-checksum.json --- temporalio-1.3.0/vendor/reqwest/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/reqwest/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"CHANGELOG.md":"744d10dd06613e74b9ad3a7cc02d4ba83cac8bacc6038808697f95fe4fddf9e9","Cargo.lock":"175c21b8b429092373fe9b4f83802fea3c1f7c71552ab7afa35e52ffe4ae1bb9","Cargo.toml":"c6677ee360e9603c25837b5d6469dde9c5839a081df152568ebe3a2f786fdae3","LICENSE-APACHE":"751963a8b88c0e3a9f27e98933079fbcf09b9998b2c13ac49c2e4d58444520d6","LICENSE-MIT":"37ef4a3ef1391064b2f44aa9cb0c401faad37c8b240a7386ce5e77dea9526f3e","README.md":"0aea0c4746d110da906a6fc0bdb8e02e12a0bad6997eb47c3f2ea41c5bc3df02","examples/blocking.rs":"7bbaa12b8736e28107aa1ba3a8ac575f16fff108c4ac1daf552f4ee9ae597c57","examples/form.rs":"6aa421acc636d2d8a39205549349fbcbee0ce288f151fe5b2582b21a11528466","examples/h3_simple.rs":"25238faf3afb4bf520701abfa5ac3866ae2b90559278cc8e46c6ac17fbc572bf","examples/json_dynamic.rs":"50f863c34530bfaa2ee5eca79cd4e402f872e7bc20b43f3b2b237c67ce9bcce6","examples/json_typed.rs":"ec678ffca5197212f9f343f7bd18335d3ff765506ecc59f03dec93f351da0ce0","examples/simple.rs":"425c0f82c93042f6881d41f26ccc145ce1b757cf278dbac65ed6d5e1aed27fb5","examples/tor_socks.rs":"bda2391518d7fe32e32dd4acf03e65046afcf09010e6730dd055dc7b77da7e52","src/async_impl/body.rs":"219f5c3ef79f4b74936409f54ec01a88b735f2f53eff2dea9ed353299fde7921","src/async_impl/client.rs":"74861e073a7f6cee0c264a5e45b4eef4889ca098e7d5585bb25df6599fd4afd7","src/async_impl/decoder.rs":"ad099a5397f54f09dd4caede5c12859e8525acdecde6cab800c0157579e9c60f","src/async_impl/h3_client/connect.rs":"c7f710e3a0a1c34248fb7703c4f8578c3af7fc46bf7eefdd6bc8ea1b21b0b3a1","src/async_impl/h3_client/dns.rs":"3133fa4174eeb1e56ed16a4151d6204815c73879e73b7c39fbde35ea71e0c6d9","src/async_impl/h3_client/mod.rs":"46d6d198cd4c47b9830eb62ad89f0b3321f617d5863c656f71e5764c0c39468f","src/async_impl/h3_client/pool.rs":"597ad187d8478915bd11872c7fd93f1ef9a464c0e9e3ce3e532e473af57eea96","src/async_impl/mod.rs":"bb4f69f0f8376c5d0e77e5a2f2eccd25fe943f3e4a6376e9a005822582721a25","src/async_impl/multipart.rs":"57a4f43e6e20f08a9e4e3824eeccdc6d88acf7484d1c79a009c4c2fe1624cd52","src/async_impl/request.rs":"110059605a8f86df2dcefd2f97053d8f349a33c8882377f7b8ab5965bf9d7f1b","src/async_impl/response.rs":"c2fe780b529bfc5aded2b73c5d2ba486e7e8629c9a3a0e20503a6470db01068b","src/async_impl/upgrade.rs":"16aa4ebcca6029176a62bb65c29d00ccf94c9c9b288164c0645373d7003e5ef7","src/blocking/body.rs":"d6b1011cb1c63e44b944c60e45feee5501cd70a4249ae73c8b476112d30db28f","src/blocking/client.rs":"520c1e315154b169e492b168c171bf39ec1544fe4c4e93d80c014fe061706b48","src/blocking/mod.rs":"ddcfe859e45871fb819c940868085c26526c8f0831ea175cd4aafd4ba8939992","src/blocking/multipart.rs":"7da92473fedc61091192f4136b4a81672629aa1368500d8ec530bf0d790a3e69","src/blocking/request.rs":"34e125881cbd9a9922ebf88f4aee19d369fcffd88d8fff531b3307105606407f","src/blocking/response.rs":"ea7d4b3990cfd8a30f7da41f185b909158e036b27655385666171e1006f69cbc","src/blocking/wait.rs":"095f3396efc5b6471c6337de850d1e570bcf8a214a892fd0aba87e5b2e2f72e7","src/connect.rs":"2923efb919cb3853eed95daec2c059aba06a334a161cf3a60e4665e692c3b605","src/cookie.rs":"61bf5b0fee73879f02e081b6ddf43b08646cef25b49cf5f2188f2ea1deecd844","src/dns/gai.rs":"f097505c616b179d9f210d6ab79a79aafd7ee110385b92d7d77e12083ae6acef","src/dns/mod.rs":"a7262254f16ba429119b03039d073f57c552075c1d822d2a67d21ca9b874397a","src/dns/resolve.rs":"bbb1f2d0bdea15caba7737a4fbc3de7b11f86dc1124f6fef290f9d3b31f89383","src/dns/trust_dns.rs":"e2cf209526a45256c3b0fbe79799f90e29596d49f31990f7a564eb3148fd1ae9","src/error.rs":"2b6f25dcef49df73d5061571c6a141a9a943d620950ab75a1e7b3d7b5d112105","src/into_url.rs":"cb94de5c0a3ab216ab668e47cecb72b94a25c1e4d3c4c1c1e576ce8306cd77cb","src/lib.rs":"28993f900954b243e5bc360fe42babc58462a5b233c6dbcb3e0719df22e25f3a","src/proxy.rs":"1f251c7d88d3d9e926fe03923a3e903f9efcc89626ce94e962ff145de1b4f858","src/redirect.rs":"00e9732c96696e6a2fdd4e9df97efa8b92730073d857ab7fec7a0178f9faf6e6","src/response.rs":"12cf82de2499a426686ed4f3719cce73e269b7b9ddc9c88458e7378beb2c58a8","src/tls.rs":"528ce1c658184fcfda24012ac5874f8da58edb4d8beb75213cc0ce3d49a37d82","src/util.rs":"8a957635c5bec50b71f5bd5254794afe0bfb71f5d8dc0523fc1700063ab9234f","src/wasm/body.rs":"45309584d278eef32ac592e225ededdfaeba3e09fe295820a8c3babfe4fa79e9","src/wasm/client.rs":"8481c8d2550faf64a3e98f3934b34477639a1bcc00625c292a7796f5acf460d0","src/wasm/mod.rs":"2ba7da28d66b5b25312bf0c4387d1d5ffe4429dfd20c2db78713329298dd7690","src/wasm/multipart.rs":"7c5fae9d5ba166a812c61fb50dd2abf0d499d1e2c4a03097f378fc3c420372fa","src/wasm/request.rs":"7dd268bfb909fbf2720e02dcb9f396008364c4d9c12b47ec7132883d63617aad","src/wasm/response.rs":"3a2b446a73f563c80f7a4a4e9c5f6ac78e535ad08d6711874578d097ace53091","tests/badssl.rs":"32af96c2423a0d958577f0ac93af2c11fec724a129a46de3aa907d831cba263e","tests/blocking.rs":"68bf436d89568b17abc938a82b26ea5453d364c730a589fa947b15af98976c59","tests/brotli.rs":"9dcada695d377de0aa727741bc4fa8d87b04d80c3abe5af6912cc3e85e455f9b","tests/client.rs":"877520390b0f8747f57f683a58af4771b4d9d44109bdfbbc7974374a9822e340","tests/cookie.rs":"fadf20a8b4f850a84916090f31006a56f7193398b50cf930f217009a0a3d0df4","tests/deflate.rs":"12bfccbd8c48d2075151ff2f0743d5eefa9b4d5ccc022b289dfecf1df18dfc4d","tests/gzip.rs":"fea12ccf89e67e7f61348838d0688e33778d022d0ff164739e1dc0d409675a6c","tests/multipart.rs":"2403d5f57c7409d553fb609885abdd147d1b05cdb3d079e7c6fa70df3c882de9","tests/proxy.rs":"bb09e85249e2c6b9a8b9521c28b90f021bad68cd32abbe4ff59f82c7c0d6afd2","tests/redirect.rs":"df4a208d2ac1c4d15c3d2aa632ca617ffcf83c7045fdf4432bad07364e1fc355","tests/support/mod.rs":"52cb3c53251f4336fc3964dd4bf2df53e5a8fd846e66802f8d18089daea80e18","tests/support/server.rs":"50cc68350577a056dba0627a29118b0e4d5857969bde35ce966da4996ebe55bd","tests/timeouts.rs":"86a43acbfa9920da606993cd4cf51fdac18e61eb088f0ed6e27e181a1426d597","tests/upgrade.rs":"43797b650ce4885b3db2366ae6fdb2d50e1fbe5ee8dfad036459c2e1ea121c72","tests/wasm_simple.rs":"b24a55ac8f3bc3a4fe2a4a3454fdc289855dee072fde002f7d3f9624dbaabc50"},"package":"046cd98826c46c2ac8ddecae268eb5c2e58628688a5fc7a2643704a73faba95b"} \ No newline at end of file +{"files":{"CHANGELOG.md":"e90e208ae46c5ef9564a022914dafd5f76a4935d7294e76d4d6010f9e3f04562","Cargo.lock":"cfb84dd1ca6a99b1f605703077bb6f641061d18fc56b1ea2b6efbdc9669198ba","Cargo.toml":"bd07953d3c3ba70633ba8c5f7fa6174fc42a98f43f2ef7caf268848e48bf6df3","LICENSE-APACHE":"751963a8b88c0e3a9f27e98933079fbcf09b9998b2c13ac49c2e4d58444520d6","LICENSE-MIT":"37ef4a3ef1391064b2f44aa9cb0c401faad37c8b240a7386ce5e77dea9526f3e","README.md":"0aea0c4746d110da906a6fc0bdb8e02e12a0bad6997eb47c3f2ea41c5bc3df02","examples/blocking.rs":"7bbaa12b8736e28107aa1ba3a8ac575f16fff108c4ac1daf552f4ee9ae597c57","examples/form.rs":"6aa421acc636d2d8a39205549349fbcbee0ce288f151fe5b2582b21a11528466","examples/h3_simple.rs":"25238faf3afb4bf520701abfa5ac3866ae2b90559278cc8e46c6ac17fbc572bf","examples/json_dynamic.rs":"50f863c34530bfaa2ee5eca79cd4e402f872e7bc20b43f3b2b237c67ce9bcce6","examples/json_typed.rs":"ec678ffca5197212f9f343f7bd18335d3ff765506ecc59f03dec93f351da0ce0","examples/simple.rs":"425c0f82c93042f6881d41f26ccc145ce1b757cf278dbac65ed6d5e1aed27fb5","examples/tor_socks.rs":"bda2391518d7fe32e32dd4acf03e65046afcf09010e6730dd055dc7b77da7e52","src/async_impl/body.rs":"219f5c3ef79f4b74936409f54ec01a88b735f2f53eff2dea9ed353299fde7921","src/async_impl/client.rs":"6ec9d8cb767da74dda2d30ac3b47a00e7ab6917f3a1612229511407db646a310","src/async_impl/decoder.rs":"ad099a5397f54f09dd4caede5c12859e8525acdecde6cab800c0157579e9c60f","src/async_impl/h3_client/connect.rs":"c7f710e3a0a1c34248fb7703c4f8578c3af7fc46bf7eefdd6bc8ea1b21b0b3a1","src/async_impl/h3_client/dns.rs":"3133fa4174eeb1e56ed16a4151d6204815c73879e73b7c39fbde35ea71e0c6d9","src/async_impl/h3_client/mod.rs":"46d6d198cd4c47b9830eb62ad89f0b3321f617d5863c656f71e5764c0c39468f","src/async_impl/h3_client/pool.rs":"597ad187d8478915bd11872c7fd93f1ef9a464c0e9e3ce3e532e473af57eea96","src/async_impl/mod.rs":"bb4f69f0f8376c5d0e77e5a2f2eccd25fe943f3e4a6376e9a005822582721a25","src/async_impl/multipart.rs":"57a4f43e6e20f08a9e4e3824eeccdc6d88acf7484d1c79a009c4c2fe1624cd52","src/async_impl/request.rs":"110059605a8f86df2dcefd2f97053d8f349a33c8882377f7b8ab5965bf9d7f1b","src/async_impl/response.rs":"c2fe780b529bfc5aded2b73c5d2ba486e7e8629c9a3a0e20503a6470db01068b","src/async_impl/upgrade.rs":"16aa4ebcca6029176a62bb65c29d00ccf94c9c9b288164c0645373d7003e5ef7","src/blocking/body.rs":"d6b1011cb1c63e44b944c60e45feee5501cd70a4249ae73c8b476112d30db28f","src/blocking/client.rs":"8e9507c62258cb8cc277031aa42f40c6b41f2944a4833a49e11e56715c679a58","src/blocking/mod.rs":"ddcfe859e45871fb819c940868085c26526c8f0831ea175cd4aafd4ba8939992","src/blocking/multipart.rs":"7da92473fedc61091192f4136b4a81672629aa1368500d8ec530bf0d790a3e69","src/blocking/request.rs":"34e125881cbd9a9922ebf88f4aee19d369fcffd88d8fff531b3307105606407f","src/blocking/response.rs":"ea7d4b3990cfd8a30f7da41f185b909158e036b27655385666171e1006f69cbc","src/blocking/wait.rs":"095f3396efc5b6471c6337de850d1e570bcf8a214a892fd0aba87e5b2e2f72e7","src/connect.rs":"edfa6baf580ae0f2acbbead3d0cd68b2fdbcf53d5626a2882834dcebd2fef295","src/cookie.rs":"61bf5b0fee73879f02e081b6ddf43b08646cef25b49cf5f2188f2ea1deecd844","src/dns/gai.rs":"f097505c616b179d9f210d6ab79a79aafd7ee110385b92d7d77e12083ae6acef","src/dns/mod.rs":"a7262254f16ba429119b03039d073f57c552075c1d822d2a67d21ca9b874397a","src/dns/resolve.rs":"bbb1f2d0bdea15caba7737a4fbc3de7b11f86dc1124f6fef290f9d3b31f89383","src/dns/trust_dns.rs":"2223b6989b6a0236e3404b05050fafe708fa02759f8d9447b5012f9d6fc52a27","src/error.rs":"52dece4f0360829577e4a523c766f4b4a827985494865a7e0386a5ce92a4dae2","src/into_url.rs":"cb94de5c0a3ab216ab668e47cecb72b94a25c1e4d3c4c1c1e576ce8306cd77cb","src/lib.rs":"0f1ad75da69123f118a7a9ba101f62645dbf2d48e7650b5683c8a24f04939bcd","src/proxy.rs":"3cb46ac97b0cd112dda3a0b0da86da6e43d1ea39a8c45f4308feeff51c8d9500","src/redirect.rs":"00e9732c96696e6a2fdd4e9df97efa8b92730073d857ab7fec7a0178f9faf6e6","src/response.rs":"12cf82de2499a426686ed4f3719cce73e269b7b9ddc9c88458e7378beb2c58a8","src/tls.rs":"04c24a03556823f287e7a7bcd73c89d2f205b3b8dfe3e602b70d1cfc5b118f8d","src/util.rs":"8a957635c5bec50b71f5bd5254794afe0bfb71f5d8dc0523fc1700063ab9234f","src/wasm/body.rs":"45309584d278eef32ac592e225ededdfaeba3e09fe295820a8c3babfe4fa79e9","src/wasm/client.rs":"8481c8d2550faf64a3e98f3934b34477639a1bcc00625c292a7796f5acf460d0","src/wasm/mod.rs":"2ba7da28d66b5b25312bf0c4387d1d5ffe4429dfd20c2db78713329298dd7690","src/wasm/multipart.rs":"7c5fae9d5ba166a812c61fb50dd2abf0d499d1e2c4a03097f378fc3c420372fa","src/wasm/request.rs":"7dd268bfb909fbf2720e02dcb9f396008364c4d9c12b47ec7132883d63617aad","src/wasm/response.rs":"3a2b446a73f563c80f7a4a4e9c5f6ac78e535ad08d6711874578d097ace53091","tests/badssl.rs":"32af96c2423a0d958577f0ac93af2c11fec724a129a46de3aa907d831cba263e","tests/blocking.rs":"53680debb01b2d0c8f0a0d95b355c6625a50a2773e74f0be6920f5cce6f1a144","tests/brotli.rs":"9dcada695d377de0aa727741bc4fa8d87b04d80c3abe5af6912cc3e85e455f9b","tests/client.rs":"51e27c6f02161e2fc029f9505b749866c9dbffda29e2b904c1b4d8eb73f2ff74","tests/cookie.rs":"fadf20a8b4f850a84916090f31006a56f7193398b50cf930f217009a0a3d0df4","tests/deflate.rs":"12bfccbd8c48d2075151ff2f0743d5eefa9b4d5ccc022b289dfecf1df18dfc4d","tests/gzip.rs":"fea12ccf89e67e7f61348838d0688e33778d022d0ff164739e1dc0d409675a6c","tests/multipart.rs":"2403d5f57c7409d553fb609885abdd147d1b05cdb3d079e7c6fa70df3c882de9","tests/proxy.rs":"bb09e85249e2c6b9a8b9521c28b90f021bad68cd32abbe4ff59f82c7c0d6afd2","tests/redirect.rs":"df4a208d2ac1c4d15c3d2aa632ca617ffcf83c7045fdf4432bad07364e1fc355","tests/support/mod.rs":"52cb3c53251f4336fc3964dd4bf2df53e5a8fd846e66802f8d18089daea80e18","tests/support/server.rs":"50cc68350577a056dba0627a29118b0e4d5857969bde35ce966da4996ebe55bd","tests/timeouts.rs":"30dfb00c26d13b014243fd7b040b86b6fdf0b96b57831bed952ff931f4c9c0e8","tests/upgrade.rs":"43797b650ce4885b3db2366ae6fdb2d50e1fbe5ee8dfad036459c2e1ea121c72","tests/wasm_simple.rs":"b24a55ac8f3bc3a4fe2a4a3454fdc289855dee072fde002f7d3f9624dbaabc50"},"package":"3e9ad3fe7488d7e34558a2033d45a0c90b72d97b4f80705666fea71472e2e6a1"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/reqwest/Cargo.lock temporalio-1.3.0/vendor/reqwest/Cargo.lock --- temporalio-1.3.0/vendor/reqwest/Cargo.lock 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/reqwest/Cargo.lock 2023-10-30 19:40:00.000000000 +0000 @@ -4,9 +4,9 @@ [[package]] name = "addr2line" -version = "0.21.0" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +checksum = "f4fa78e18c64fce05e902adecd7a5eed15a5e0a3439f7b0e169f0252214865e3" dependencies = [ "gimli", ] @@ -25,9 +25,9 @@ [[package]] name = "aho-corasick" -version = "1.1.1" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea5d730647d4fadd988536d06fecce94b7b4f2a7efdae548f1cf4b63205518ab" +checksum = "6748e8def348ed4d14996fa801f4122cd763fff530258cdc03f64b25f89d3a5a" dependencies = [ "memchr", ] @@ -49,9 +49,9 @@ [[package]] name = "async-compression" -version = "0.4.3" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb42b2197bf15ccb092b62c74515dbd8b86d0effd934795f6687c93b6e679a2c" +checksum = "62b74f44609f0f91493e3082d3734d98497e094777144380ea4db9f9905dd5b6" dependencies = [ "brotli", "flate2", @@ -69,7 +69,7 @@ dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.29", ] [[package]] @@ -91,9 +91,9 @@ [[package]] name = "backtrace" -version = "0.3.69" +version = "0.3.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +checksum = "4319208da049c43661739c5fade2ba182f09d1dc2299b32298d3a31692b17e12" dependencies = [ "addr2line", "cc", @@ -106,9 +106,9 @@ [[package]] name = "base64" -version = "0.21.4" +version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ba43ea6f343b788c8764558649e08df62f86c6ef251fdaeb1ffd010a9ae50a2" +checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" [[package]] name = "bitflags" @@ -124,9 +124,9 @@ [[package]] name = "brotli" -version = "3.4.0" +version = "3.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "516074a47ef4bce09577a3b379392300159ce5b1ba2e501ff1c819950066100f" +checksum = "a1a0b1dbcc8ae29329621f8d4f0d835787c1c38bb1401979b49d13b0b305ff68" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -135,9 +135,9 @@ [[package]] name = "brotli-decompressor" -version = "2.5.0" +version = "2.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da74e2b81409b1b743f8f0c62cc6254afefb8b8e50bbfe3735550f7aeefa3448" +checksum = "4b6561fd3f895a11e8f72af2cb7d22e08366bebc2b6b57f7744c4bda27034744" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -145,15 +145,15 @@ [[package]] name = "bumpalo" -version = "3.14.0" +version = "3.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" +checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" [[package]] name = "bytes" -version = "1.5.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" +checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" [[package]] name = "cc" @@ -259,23 +259,23 @@ [[package]] name = "encoding_rs" -version = "0.8.33" +version = "0.8.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" +checksum = "071a31f4ee85403370b58aca746f01041ede6f0da2730960ad001edc2b71b394" dependencies = [ "cfg-if", ] [[package]] name = "enum-as-inner" -version = "0.6.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ffccbb6966c05b32ef8fbac435df276c4ae4d3dc55a8cd0eb9745e6c12f546a" +checksum = "c9720bba047d567ffc8a3cba48bf19126600e249ab7f128e9233e6376976a116" dependencies = [ "heck", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -293,9 +293,9 @@ [[package]] name = "errno" -version = "0.3.4" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "add4f07d43996f76ef320709726a556a9d4f965d9410d8d0271132d2f8293480" +checksum = "6b30f669a7961ef1631673d2766cc92f52d64f7ef354d4fe0ddfd30ed52f0f4f" dependencies = [ "errno-dragonfly", "libc", @@ -323,9 +323,9 @@ [[package]] name = "fastrand" -version = "2.0.1" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" +checksum = "6999dc1837253364c2ebb0704ba97994bd874e8f195d665c50b7548f6ea92764" [[package]] name = "flate2" @@ -423,7 +423,7 @@ dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.29", ] [[package]] @@ -469,9 +469,9 @@ [[package]] name = "gimli" -version = "0.28.0" +version = "0.27.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" +checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" [[package]] name = "h2" @@ -543,9 +543,9 @@ [[package]] name = "hermit-abi" -version = "0.3.3" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" +checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" [[package]] name = "hostname" @@ -705,7 +705,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f" dependencies = [ - "socket2 0.5.4", + "socket2 0.5.3", "widestring", "windows-sys", "winreg", @@ -740,9 +740,9 @@ [[package]] name = "libc" -version = "0.2.148" +version = "0.2.147" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cdc71e17332e86d2e1d38c1f99edcb6288ee11b815fb1a4b049eaa2114d369b" +checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" [[package]] name = "libflate" @@ -772,9 +772,9 @@ [[package]] name = "linux-raw-sys" -version = "0.4.8" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3852614a3bd9ca9804678ba6be5e3b8ce76dfc902cae004e3e0c44051b6e88db" +checksum = "57bcfdad1b858c2db7c38303a6d2ad4dfaf5eb53dfeb0910128b2c26d6158503" [[package]] name = "lock_api" @@ -815,9 +815,9 @@ [[package]] name = "memchr" -version = "2.6.4" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" [[package]] name = "mime" @@ -879,15 +879,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi 0.3.3", + "hermit-abi 0.3.2", "libc", ] [[package]] name = "object" -version = "0.32.1" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" +checksum = "8bda667d9f2b5051b8833f59f3bf748b28ef54f850f4fcb389a252aa383866d1" dependencies = [ "memchr", ] @@ -900,11 +900,11 @@ [[package]] name = "openssl" -version = "0.10.57" +version = "0.10.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bac25ee399abb46215765b1cb35bc0212377e58a061560d8b29b024fd0430e7c" +checksum = "729b745ad4a5575dd06a3e1af1414bd330ee561c01b3899eb584baeaa8def17e" dependencies = [ - "bitflags 2.4.0", + "bitflags 1.3.2", "cfg-if", "foreign-types", "libc", @@ -921,7 +921,7 @@ dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.29", ] [[package]] @@ -932,18 +932,18 @@ [[package]] name = "openssl-src" -version = "300.1.5+3.1.3" +version = "111.27.0+1.1.1v" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "559068e4c12950d7dcaa1857a61725c0d38d4fc03ff8e070ab31a75d6e316491" +checksum = "06e8f197c82d7511c5b014030c9b1efeda40d7d5f99d23b4ceed3524a5e63f02" dependencies = [ "cc", ] [[package]] name = "openssl-sys" -version = "0.9.93" +version = "0.9.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db4d56a4c0478783083cfafcc42493dd4a981d41669da64b4572a2a089b51b1d" +checksum = "866b5f16f90776b9bb8dc1e1802ac6f0513de3a7a7465867bfbc563dc737faac" dependencies = [ "cc", "libc", @@ -983,9 +983,9 @@ [[package]] name = "pin-project-lite" -version = "0.2.13" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" +checksum = "12cc1b0bf1727a77a54b6654e7b5f1af8604923edc8b81885f8ec92f9e3f0a05" [[package]] name = "pin-utils" @@ -1007,9 +1007,9 @@ [[package]] name = "proc-macro2" -version = "1.0.67" +version = "1.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d433d9f1a3e8c1263d9456598b16fec66f4acc9a74dacffd35c7bb09b3a1328" +checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" dependencies = [ "unicode-ident", ] @@ -1055,9 +1055,9 @@ [[package]] name = "quinn-proto" -version = "0.10.5" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c78e758510582acc40acb90458401172d41f1016f8c9dde89e49677afb7eec1" +checksum = "b83c2a964b8b68e6c9c616f09b735b436a78843704fa6979a076073e622f69dc" dependencies = [ "bytes", "rand", @@ -1078,7 +1078,7 @@ dependencies = [ "bytes", "libc", - "socket2 0.5.4", + "socket2 0.5.3", "tracing", "windows-sys", ] @@ -1133,9 +1133,9 @@ [[package]] name = "regex" -version = "1.9.6" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebee201405406dbf528b8b672104ae6d6d63e6d118cb10e4d51abbc7b58044ff" +checksum = "81bc1d4caf89fac26a70747fe603c130093b53c773888797a6329091246d651a" dependencies = [ "aho-corasick", "memchr", @@ -1145,9 +1145,9 @@ [[package]] name = "regex-automata" -version = "0.3.9" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59b23e92ee4318893fa3fe3e6fb365258efbfe6ac6ab30f090cdcbb7aa37efa9" +checksum = "fed1ceff11a1dddaee50c9dc8e4938bd106e9d89ae372f192311e7da498e3b69" dependencies = [ "aho-corasick", "memchr", @@ -1156,13 +1156,13 @@ [[package]] name = "regex-syntax" -version = "0.7.5" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" +checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" [[package]] name = "reqwest" -version = "0.11.22" +version = "0.11.20" dependencies = [ "async-compression", "base64", @@ -1201,7 +1201,6 @@ "serde", "serde_json", "serde_urlencoded", - "system-configuration", "tokio", "tokio-native-tls", "tokio-rustls", @@ -1264,9 +1263,9 @@ [[package]] name = "rustix" -version = "0.38.15" +version = "0.38.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2f9da0cbd88f9f09e7814e388301c8414c51c62aa6ce1e4b5c551d49d96e531" +checksum = "19ed4fa021d81c8392ce04db050a3da9a60299050b7ae1cf482d862b54a7218f" dependencies = [ "bitflags 2.4.0", "errno", @@ -1277,9 +1276,9 @@ [[package]] name = "rustls" -version = "0.21.7" +version = "0.21.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd8d6c9f025a446bc4d18ad9632e69aec8f287aa84499ee335599fabd20c3fd8" +checksum = "1d1feddffcfcc0b33f5c6ce9a29e341e4cd59c3f78e7ee45f4a40c038b1d6cbb" dependencies = [ "log", "ring", @@ -1310,9 +1309,9 @@ [[package]] name = "rustls-webpki" -version = "0.101.6" +version = "0.101.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c7d5dece342910d9ba34d259310cae3e0154b873b35408b787b59bce53d34fe" +checksum = "261e9e0888cba427c3316e6322805653c9425240b6fd96cee7cb671ab70ab8d0" dependencies = [ "ring", "untrusted", @@ -1380,29 +1379,29 @@ [[package]] name = "serde" -version = "1.0.188" +version = "1.0.171" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9e0fcba69a370eed61bcf2b728575f726b50b55cba78064753d708ddc7549e" +checksum = "30e27d1e4fd7659406c492fd6cfaf2066ba8773de45ca75e855590f856dc34a9" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.188" +version = "1.0.171" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2" +checksum = "389894603bd18c46fa56231694f8d827779c0951a667087194cf9de94ed24682" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.29", ] [[package]] name = "serde_json" -version = "1.0.107" +version = "1.0.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b420ce6e3d8bd882e9b243c6eed35dbc9a6110c9769e74b584e0d68d1f20c65" +checksum = "693151e1ac27563d6dbcec9dee9fbd5da8539b20fa14ad3752b2e6d363ace360" dependencies = [ "itoa", "ryu", @@ -1423,18 +1422,18 @@ [[package]] name = "slab" -version = "0.4.9" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" dependencies = [ "autocfg", ] [[package]] name = "smallvec" -version = "1.11.1" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "942b4a808e05215192e39f4ab80813e599068285906cc91aa64f923db842bd5a" +checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" [[package]] name = "socket2" @@ -1448,9 +1447,9 @@ [[package]] name = "socket2" -version = "0.5.4" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4031e820eb552adee9295814c0ced9e5cf38ddf1e8b7d566d6de8e2538ea989e" +checksum = "2538b18701741680e0322a2302176d3253a35388e2e62f172f64f4f16605f877" dependencies = [ "libc", "windows-sys", @@ -1464,9 +1463,9 @@ [[package]] name = "syn" -version = "2.0.37" +version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7303ef2c05cd654186cb250d29049a24840ca25d2747c25c0381c8d9e2f582e8" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ "proc-macro2", "quote", @@ -1474,24 +1473,14 @@ ] [[package]] -name = "system-configuration" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "system-configuration-sys", -] - -[[package]] -name = "system-configuration-sys" -version = "0.5.0" +name = "syn" +version = "2.0.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +checksum = "c324c494eba9d92503e6f1ef2e6df781e78f6a7705a0202d9801b198807d518a" dependencies = [ - "core-foundation-sys", - "libc", + "proc-macro2", + "quote", + "unicode-ident", ] [[package]] @@ -1501,7 +1490,7 @@ checksum = "cb94d2f3cc536af71caac6b6fcebf65860b347e7ce0cc9ebe8f70d3e521054ef" dependencies = [ "cfg-if", - "fastrand 2.0.1", + "fastrand 2.0.0", "redox_syscall", "rustix", "windows-sys", @@ -1509,38 +1498,38 @@ [[package]] name = "termcolor" -version = "1.3.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6093bad37da69aab9d123a8091e4be0aa4a03e4d601ec641c327398315f62b64" +checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" dependencies = [ "winapi-util", ] [[package]] name = "thiserror" -version = "1.0.49" +version = "1.0.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1177e8c6d7ede7afde3585fd2513e611227efd6481bd78d2e82ba1ce16557ed4" +checksum = "97a802ec30afc17eee47b2855fc72e0c4cd62be9b4efe6591edde0ec5bd68d8f" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.49" +version = "1.0.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10712f02019e9288794769fba95cd6847df9874d49d871d062172f9dd41bc4cc" +checksum = "6bb623b56e39ab7dcd4b1b98bb6c8f8d907ed255b18de254088016b27a8ee19b" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.29", ] [[package]] name = "time" -version = "0.3.29" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "426f806f4089c493dcac0d24c29c01e2c38baf8e30f1b716ee37e83d200b18fe" +checksum = "a79d09ac6b08c1ab3906a2f7cc2e81a0e27c7ae89c63812df75e52bef0751e07" dependencies = [ "deranged", "itoa", @@ -1551,15 +1540,15 @@ [[package]] name = "time-core" -version = "0.1.2" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" +checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" [[package]] name = "time-macros" -version = "0.2.15" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ad70d68dba9e1f8aceda7aa6711965dfec1cac869f311a51bd08b3a2ccbce20" +checksum = "75c65469ed6b3a4809d987a41eb1dc918e9bc1d92211cbad7ae82931846f7451" dependencies = [ "time-core", ] @@ -1591,7 +1580,7 @@ "mio", "num_cpus", "pin-project-lite", - "socket2 0.5.4", + "socket2 0.5.3", "tokio-macros", "windows-sys", ] @@ -1604,7 +1593,7 @@ dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.29", ] [[package]] @@ -1641,9 +1630,9 @@ [[package]] name = "tokio-util" -version = "0.7.9" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d68074620f57a0b21594d9735eb2e98ab38b17f80d3fcb189fca266771ca60d" +checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" dependencies = [ "bytes", "futures-core", @@ -1679,7 +1668,7 @@ dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.29", ] [[package]] @@ -1693,9 +1682,9 @@ [[package]] name = "trust-dns-proto" -version = "0.23.0" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dc775440033cb114085f6f2437682b194fa7546466024b1037e82a48a052a69" +checksum = "4f7f83d1e4a0e4358ac54c5c3681e5d7da5efc5a7a632c90bb6d6669ddd9bc26" dependencies = [ "async-trait", "cfg-if", @@ -1704,9 +1693,9 @@ "futures-channel", "futures-io", "futures-util", - "idna 0.4.0", + "idna 0.2.3", "ipnet", - "once_cell", + "lazy_static", "rand", "smallvec", "thiserror", @@ -1718,17 +1707,16 @@ [[package]] name = "trust-dns-resolver" -version = "0.23.0" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff7aed33ef3e8bf2c9966fccdfed93f93d46f432282ea875cd66faabc6ef2f" +checksum = "aff21aa4dcefb0a1afbfac26deb0adc93888c7d295fb63ab273ef276ba2b7cfe" dependencies = [ "cfg-if", "futures-util", "ipconfig", + "lazy_static", "lru-cache", - "once_cell", "parking_lot", - "rand", "resolv-conf", "smallvec", "thiserror", @@ -1745,9 +1733,9 @@ [[package]] name = "unicase" -version = "2.7.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" +checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" dependencies = [ "version_check", ] @@ -1760,9 +1748,9 @@ [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" [[package]] name = "unicode-normalization" @@ -1781,9 +1769,9 @@ [[package]] name = "url" -version = "2.4.1" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5" +checksum = "50bff7831e19200a85b17131d085c25d7811bc4e186efdaf54bbd132994a88cb" dependencies = [ "form_urlencoded", "idna 0.4.0", @@ -1840,7 +1828,7 @@ "once_cell", "proc-macro2", "quote", - "syn", + "syn 2.0.29", "wasm-bindgen-shared", ] @@ -1874,7 +1862,7 @@ dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.29", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -1962,9 +1950,9 @@ [[package]] name = "winapi-util" -version = "0.1.6" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" dependencies = [ "winapi", ] diff -Nru temporalio-1.3.0/vendor/reqwest/Cargo.toml temporalio-1.3.0/vendor/reqwest/Cargo.toml --- temporalio-1.3.0/vendor/reqwest/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/reqwest/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -13,7 +13,7 @@ edition = "2018" rust-version = "1.63.0" name = "reqwest" -version = "0.11.22" +version = "0.11.20" authors = ["Sean McArthur "] autotests = true description = "higher level HTTP client library" @@ -357,8 +357,7 @@ default-features = false [target."cfg(not(target_arch = \"wasm32\"))".dependencies.trust-dns-resolver] -version = "0.23" -features = ["tokio-runtime"] +version = "0.22" optional = true [target."cfg(not(target_arch = \"wasm32\"))".dependencies.webpki-roots] @@ -446,8 +445,5 @@ [target."cfg(target_arch = \"wasm32\")".dev-dependencies.wasm-bindgen-test] version = "0.3" -[target."cfg(target_os = \"macos\")".dependencies.system-configuration] -version = "0.5.1" - [target."cfg(windows)".dependencies.winreg] version = "0.50.0" diff -Nru temporalio-1.3.0/vendor/reqwest/CHANGELOG.md temporalio-1.3.0/vendor/reqwest/CHANGELOG.md --- temporalio-1.3.0/vendor/reqwest/CHANGELOG.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/reqwest/CHANGELOG.md 2023-10-30 19:40:00.000000000 +0000 @@ -1,14 +1,3 @@ -## v0.11.22 - -- Fix compilation on Windows when `trust-dns` is enabled. - -## v0.11.21 - -- Add automatically detecting macOS proxy settings. -- Add `ClientBuilder::tls_info(bool)`, which will put `tls::TlsInfo` into the response extensions. -- Fix trust-dns resolver from possible hangs. -- Fix connect timeout to be split among multiple IP addresses. - ## v0.11.20 - Fix `deflate` decompression back to using zlib, as outlined in the spec. diff -Nru temporalio-1.3.0/vendor/reqwest/src/async_impl/client.rs temporalio-1.3.0/vendor/reqwest/src/async_impl/client.rs --- temporalio-1.3.0/vendor/reqwest/src/async_impl/client.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/reqwest/src/async_impl/client.rs 2023-10-30 19:40:00.000000000 +0000 @@ -115,8 +115,6 @@ #[cfg(feature = "__tls")] max_tls_version: Option, #[cfg(feature = "__tls")] - tls_info: bool, - #[cfg(feature = "__tls")] tls: TlsBackend, http_version_pref: HttpVersionPref, http09_responses: bool, @@ -200,8 +198,6 @@ #[cfg(feature = "__tls")] max_tls_version: None, #[cfg(feature = "__tls")] - tls_info: false, - #[cfg(feature = "__tls")] tls: TlsBackend::default(), http_version_pref: HttpVersionPref::All, http09_responses: false, @@ -270,7 +266,7 @@ let mut resolver: Arc = match config.trust_dns { false => Arc::new(GaiResolver::new()), #[cfg(feature = "trust-dns")] - true => Arc::new(TrustDnsResolver::default()), + true => Arc::new(TrustDnsResolver::new().map_err(crate::error::builder)?), #[cfg(not(feature = "trust-dns"))] true => unreachable!("trust-dns shouldn't be enabled unless the feature is"), }; @@ -283,8 +279,7 @@ config.dns_overrides, )); } - let mut http = HttpConnector::new_with_resolver(DynResolver::new(resolver.clone())); - http.set_connect_timeout(config.connect_timeout); + let http = HttpConnector::new_with_resolver(DynResolver::new(resolver.clone())); #[cfg(all(feature = "http3", feature = "__rustls"))] let build_h3_connector = @@ -413,7 +408,6 @@ user_agent(&config.headers), config.local_address, config.nodelay, - config.tls_info, )? } #[cfg(feature = "native-tls")] @@ -424,7 +418,6 @@ user_agent(&config.headers), config.local_address, config.nodelay, - config.tls_info, ), #[cfg(feature = "__rustls")] TlsBackend::BuiltRustls(conn) => { @@ -449,7 +442,6 @@ user_agent(&config.headers), config.local_address, config.nodelay, - config.tls_info, ) } #[cfg(feature = "__rustls")] @@ -594,7 +586,6 @@ user_agent(&config.headers), config.local_address, config.nodelay, - config.tls_info, ) } #[cfg(any(feature = "native-tls", feature = "__rustls",))] @@ -1492,26 +1483,6 @@ self } - /// Add TLS information as `TlsInfo` extension to responses. - /// - /// # Optional - /// - /// This requires the optional `default-tls`, `native-tls`, or `rustls-tls(-...)` - /// feature to be enabled. - #[cfg(feature = "__tls")] - #[cfg_attr( - docsrs, - doc(cfg(any( - feature = "default-tls", - feature = "native-tls", - feature = "rustls-tls" - ))) - )] - pub fn tls_info(mut self, tls_info: bool) -> ClientBuilder { - self.config.tls_info = tls_info; - self - } - /// Enables the [trust-dns](trust_dns_resolver) async resolver instead of a default threadpool using `getaddrinfo`. /// /// If the `trust-dns` feature is turned on, the default option is enabled. @@ -2016,8 +1987,6 @@ } f.field("tls_sni", &self.tls_sni); - - f.field("tls_info", &self.tls_info); } #[cfg(all(feature = "native-tls-crate", feature = "__rustls"))] diff -Nru temporalio-1.3.0/vendor/reqwest/src/blocking/client.rs temporalio-1.3.0/vendor/reqwest/src/blocking/client.rs --- temporalio-1.3.0/vendor/reqwest/src/blocking/client.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/reqwest/src/blocking/client.rs 2023-10-30 19:40:00.000000000 +0000 @@ -738,25 +738,6 @@ self.with_inner(move |inner| inner.use_rustls_tls()) } - /// Add TLS information as `TlsInfo` extension to responses. - /// - /// # Optional - /// - /// This requires the optional `default-tls`, `native-tls`, or `rustls-tls(-...)` - /// feature to be enabled. - #[cfg(feature = "__tls")] - #[cfg_attr( - docsrs, - doc(cfg(any( - feature = "default-tls", - feature = "native-tls", - feature = "rustls-tls" - ))) - )] - pub fn tls_info(self, tls_info: bool) -> ClientBuilder { - self.with_inner(|inner| inner.tls_info(tls_info)) - } - /// Use a preconfigured TLS backend. /// /// If the passed `Any` argument is not a TLS backend that reqwest diff -Nru temporalio-1.3.0/vendor/reqwest/src/connect.rs temporalio-1.3.0/vendor/reqwest/src/connect.rs --- temporalio-1.3.0/vendor/reqwest/src/connect.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/reqwest/src/connect.rs 2023-10-30 19:40:00.000000000 +0000 @@ -36,8 +36,6 @@ #[cfg(feature = "__tls")] nodelay: bool, #[cfg(feature = "__tls")] - tls_info: bool, - #[cfg(feature = "__tls")] user_agent: Option, } @@ -84,14 +82,13 @@ user_agent: Option, local_addr: T, nodelay: bool, - tls_info: bool, ) -> crate::Result where T: Into>, { let tls = tls.build().map_err(crate::error::builder)?; Ok(Self::from_built_default_tls( - http, tls, proxies, user_agent, local_addr, nodelay, tls_info, + http, tls, proxies, user_agent, local_addr, nodelay, )) } @@ -103,7 +100,6 @@ user_agent: Option, local_addr: T, nodelay: bool, - tls_info: bool, ) -> Connector where T: Into>, @@ -117,7 +113,6 @@ verbose: verbose::OFF, timeout: None, nodelay, - tls_info, user_agent, } } @@ -130,7 +125,6 @@ user_agent: Option, local_addr: T, nodelay: bool, - tls_info: bool, ) -> Connector where T: Into>, @@ -157,7 +151,6 @@ verbose: verbose::OFF, timeout: None, nodelay, - tls_info, user_agent, } } @@ -195,7 +188,6 @@ return Ok(Conn { inner: self.verbose.wrap(NativeTlsConn { inner: io }), is_proxy: false, - tls_info: self.tls_info, }); } } @@ -216,7 +208,6 @@ return Ok(Conn { inner: self.verbose.wrap(RustlsTlsConn { inner: io }), is_proxy: false, - tls_info: false, }); } } @@ -227,7 +218,6 @@ socks::connect(proxy, dst, dns).await.map(|tcp| Conn { inner: self.verbose.wrap(tcp), is_proxy: false, - tls_info: false, }) } @@ -239,7 +229,6 @@ Ok(Conn { inner: self.verbose.wrap(io), is_proxy, - tls_info: false, }) } #[cfg(feature = "default-tls")] @@ -264,13 +253,11 @@ Ok(Conn { inner: self.verbose.wrap(NativeTlsConn { inner: stream }), is_proxy, - tls_info: self.tls_info, }) } else { Ok(Conn { inner: self.verbose.wrap(io), is_proxy, - tls_info: false, }) } } @@ -296,13 +283,11 @@ Ok(Conn { inner: self.verbose.wrap(RustlsTlsConn { inner: stream }), is_proxy, - tls_info: self.tls_info, }) } else { Ok(Conn { inner: self.verbose.wrap(io), is_proxy, - tls_info: false, }) } } @@ -352,7 +337,6 @@ return Ok(Conn { inner: self.verbose.wrap(NativeTlsConn { inner: io }), is_proxy: false, - tls_info: false, }); } } @@ -385,7 +369,6 @@ return Ok(Conn { inner: self.verbose.wrap(RustlsTlsConn { inner: io }), is_proxy: false, - tls_info: false, }); } } @@ -461,105 +444,6 @@ } } -#[cfg(feature = "__tls")] -trait TlsInfoFactory { - fn tls_info(&self) -> Option; -} - -#[cfg(feature = "__tls")] -impl TlsInfoFactory for tokio::net::TcpStream { - fn tls_info(&self) -> Option { - None - } -} - -#[cfg(feature = "default-tls")] -impl TlsInfoFactory for hyper_tls::MaybeHttpsStream { - fn tls_info(&self) -> Option { - match self { - hyper_tls::MaybeHttpsStream::Https(tls) => tls.tls_info(), - hyper_tls::MaybeHttpsStream::Http(_) => None, - } - } -} - -#[cfg(feature = "default-tls")] -impl TlsInfoFactory for hyper_tls::TlsStream> { - fn tls_info(&self) -> Option { - let peer_certificate = self - .get_ref() - .peer_certificate() - .ok() - .flatten() - .and_then(|c| c.to_der().ok()); - Some(crate::tls::TlsInfo { peer_certificate }) - } -} - -#[cfg(feature = "default-tls")] -impl TlsInfoFactory for tokio_native_tls::TlsStream { - fn tls_info(&self) -> Option { - let peer_certificate = self - .get_ref() - .peer_certificate() - .ok() - .flatten() - .and_then(|c| c.to_der().ok()); - Some(crate::tls::TlsInfo { peer_certificate }) - } -} - -#[cfg(feature = "__rustls")] -impl TlsInfoFactory for hyper_rustls::MaybeHttpsStream { - fn tls_info(&self) -> Option { - match self { - hyper_rustls::MaybeHttpsStream::Https(tls) => tls.tls_info(), - hyper_rustls::MaybeHttpsStream::Http(_) => None, - } - } -} - -#[cfg(feature = "__rustls")] -impl TlsInfoFactory for tokio_rustls::TlsStream { - fn tls_info(&self) -> Option { - let peer_certificate = self - .get_ref() - .1 - .peer_certificates() - .and_then(|certs| certs.first()) - .map(|c| c.0.clone()); - Some(crate::tls::TlsInfo { peer_certificate }) - } -} - -#[cfg(feature = "__rustls")] -impl TlsInfoFactory - for tokio_rustls::client::TlsStream> -{ - fn tls_info(&self) -> Option { - let peer_certificate = self - .get_ref() - .1 - .peer_certificates() - .and_then(|certs| certs.first()) - .map(|c| c.0.clone()); - Some(crate::tls::TlsInfo { peer_certificate }) - } -} - -#[cfg(feature = "__rustls")] -impl TlsInfoFactory for tokio_rustls::client::TlsStream { - fn tls_info(&self) -> Option { - let peer_certificate = self - .get_ref() - .1 - .peer_certificates() - .and_then(|certs| certs.first()) - .map(|c| c.0.clone()); - Some(crate::tls::TlsInfo { peer_certificate }) - } -} - pub(crate) trait AsyncConn: AsyncRead + AsyncWrite + Connection + Send + Sync + Unpin + 'static { @@ -567,17 +451,7 @@ impl AsyncConn for T {} -#[cfg(feature = "__tls")] -trait AsyncConnWithInfo: AsyncConn + TlsInfoFactory {} -#[cfg(not(feature = "__tls"))] -trait AsyncConnWithInfo: AsyncConn {} - -#[cfg(feature = "__tls")] -impl AsyncConnWithInfo for T {} -#[cfg(not(feature = "__tls"))] -impl AsyncConnWithInfo for T {} - -type BoxConn = Box; +type BoxConn = Box; pin_project! { /// Note: the `is_proxy` member means *is plain text HTTP proxy*. @@ -588,26 +462,12 @@ #[pin] inner: BoxConn, is_proxy: bool, - // Only needed for __tls, but #[cfg()] on fields breaks pin_project! - tls_info: bool, } } impl Connection for Conn { fn connected(&self) -> Connected { - let connected = self.inner.connected().proxy(self.is_proxy); - #[cfg(feature = "__tls")] - if self.tls_info { - if let Some(tls_info) = self.inner.tls_info() { - connected.extra(tls_info) - } else { - connected - } - } else { - connected - } - #[cfg(not(feature = "__tls"))] - connected + self.inner.connected().proxy(self.is_proxy) } } @@ -735,7 +595,6 @@ #[cfg(feature = "default-tls")] mod native_tls_conn { - use super::TlsInfoFactory; use hyper::client::connect::{Connected, Connection}; use pin_project_lite::pin_project; use std::{ @@ -823,23 +682,10 @@ AsyncWrite::poll_shutdown(this.inner, cx) } } - - impl TlsInfoFactory for NativeTlsConn { - fn tls_info(&self) -> Option { - self.inner.tls_info() - } - } - - impl TlsInfoFactory for NativeTlsConn> { - fn tls_info(&self) -> Option { - self.inner.tls_info() - } - } } #[cfg(feature = "__rustls")] mod rustls_tls_conn { - use super::TlsInfoFactory; use hyper::client::connect::{Connected, Connection}; use pin_project_lite::pin_project; use std::{ @@ -916,18 +762,6 @@ AsyncWrite::poll_shutdown(this.inner, cx) } } - - impl TlsInfoFactory for RustlsTlsConn { - fn tls_info(&self) -> Option { - self.inner.tls_info() - } - } - - impl TlsInfoFactory for RustlsTlsConn> { - fn tls_info(&self) -> Option { - self.inner.tls_info() - } - } } #[cfg(feature = "socks")] @@ -1010,7 +844,7 @@ pub(super) struct Wrapper(pub(super) bool); impl Wrapper { - pub(super) fn wrap(&self, conn: T) -> super::BoxConn { + pub(super) fn wrap(&self, conn: T) -> super::BoxConn { if self.0 && log::log_enabled!(log::Level::Trace) { Box::new(Verbose { // truncate is fine @@ -1105,13 +939,6 @@ } } - #[cfg(feature = "__tls")] - impl super::TlsInfoFactory for Verbose { - fn tls_info(&self) -> Option { - self.inner.tls_info() - } - } - struct Escape<'a>(&'a [u8]); impl fmt::Debug for Escape<'_> { diff -Nru temporalio-1.3.0/vendor/reqwest/src/dns/trust_dns.rs temporalio-1.3.0/vendor/reqwest/src/dns/trust_dns.rs --- temporalio-1.3.0/vendor/reqwest/src/dns/trust_dns.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/reqwest/src/dns/trust_dns.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,9 +1,13 @@ //! DNS resolution via the [trust_dns_resolver](https://github.com/bluejekyll/trust-dns) crate use hyper::client::connect::dns::Name; -use once_cell::sync::OnceCell; +use once_cell::sync::Lazy; +use tokio::sync::Mutex; pub use trust_dns_resolver::config::{ResolverConfig, ResolverOpts}; -use trust_dns_resolver::{lookup_ip::LookupIpIntoIter, system_conf, TokioAsyncResolver}; +use trust_dns_resolver::{ + lookup_ip::LookupIpIntoIter, system_conf, AsyncResolver, TokioConnection, + TokioConnectionProvider, TokioHandle, +}; use std::io; use std::net::SocketAddr; @@ -11,24 +15,64 @@ use super::{Addrs, Resolve, Resolving}; +use crate::error::BoxError; + +type SharedResolver = Arc>; + +static SYSTEM_CONF: Lazy> = + Lazy::new(|| system_conf::read_system_conf().map_err(io::Error::from)); + /// Wrapper around an `AsyncResolver`, which implements the `Resolve` trait. -#[derive(Debug, Default, Clone)] +#[derive(Debug, Clone)] pub(crate) struct TrustDnsResolver { - /// Since we might not have been called in the context of a - /// Tokio Runtime in initialization, so we must delay the actual - /// construction of the resolver. - state: Arc>, + state: Arc>, } struct SocketAddrs { iter: LookupIpIntoIter, } +#[derive(Debug)] +enum State { + Init, + Ready(SharedResolver), +} + +impl TrustDnsResolver { + /// Create a new resolver with the default configuration, + /// which reads from `/etc/resolve.conf`. + pub fn new() -> io::Result { + SYSTEM_CONF.as_ref().map_err(|e| { + io::Error::new(e.kind(), format!("error reading DNS system conf: {}", e)) + })?; + + // At this stage, we might not have been called in the context of a + // Tokio Runtime, so we must delay the actual construction of the + // resolver. + Ok(TrustDnsResolver { + state: Arc::new(Mutex::new(State::Init)), + }) + } +} + impl Resolve for TrustDnsResolver { fn resolve(&self, name: Name) -> Resolving { let resolver = self.clone(); Box::pin(async move { - let resolver = resolver.state.get_or_try_init(new_resolver)?; + let mut lock = resolver.state.lock().await; + + let resolver = match &*lock { + State::Init => { + let resolver = new_resolver().await?; + *lock = State::Ready(resolver.clone()); + resolver + } + State::Ready(resolver) => resolver.clone(), + }; + + // Don't keep lock once the resolver is constructed, otherwise + // only one lookup could be done at a time. + drop(lock); let lookup = resolver.lookup_ip(name.as_str()).await?; let addrs: Addrs = Box::new(SocketAddrs { @@ -47,14 +91,18 @@ } } -/// Create a new resolver with the default configuration, -/// which reads from `/etc/resolve.conf`. -fn new_resolver() -> io::Result { - let (config, opts) = system_conf::read_system_conf().map_err(|e| { - io::Error::new( - io::ErrorKind::Other, - format!("error reading DNS system conf: {}", e), - ) - })?; - Ok(TokioAsyncResolver::tokio(config, opts)) +async fn new_resolver() -> Result { + let (config, opts) = SYSTEM_CONF + .as_ref() + .expect("can't construct TrustDnsResolver if SYSTEM_CONF is error") + .clone(); + new_resolver_with_config(config, opts) +} + +fn new_resolver_with_config( + config: ResolverConfig, + opts: ResolverOpts, +) -> Result { + let resolver = AsyncResolver::new(config, opts, TokioHandle)?; + Ok(Arc::new(resolver)) } diff -Nru temporalio-1.3.0/vendor/reqwest/src/error.rs temporalio-1.3.0/vendor/reqwest/src/error.rs --- temporalio-1.3.0/vendor/reqwest/src/error.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/reqwest/src/error.rs 2023-10-30 19:40:00.000000000 +0000 @@ -105,11 +105,6 @@ if err.is::() { return true; } - if let Some(io) = err.downcast_ref::() { - if io.kind() == io::ErrorKind::TimedOut { - return true; - } - } source = err.source(); } diff -Nru temporalio-1.3.0/vendor/reqwest/src/lib.rs temporalio-1.3.0/vendor/reqwest/src/lib.rs --- temporalio-1.3.0/vendor/reqwest/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/reqwest/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -2,7 +2,7 @@ #![deny(missing_debug_implementations)] #![cfg_attr(docsrs, feature(doc_cfg))] #![cfg_attr(test, deny(warnings))] -#![doc(html_root_url = "https://docs.rs/reqwest/0.11.22")] +#![doc(html_root_url = "https://docs.rs/reqwest/0.11.20")] //! # reqwest //! @@ -161,12 +161,6 @@ //! - Various parts of TLS can also be configured or even disabled on the //! `ClientBuilder`. //! -//! ## WASM -//! The Client implementation automatically switches to the WASM one when the target_arch is wasm32, -//! the usage is basically the same as the async api. Some of the features are disabled in wasm -//! : [`tls`](tls) [`cookie`](cookie) [`blocking`](blocking). -//! -//! //! ## Optional Features //! //! The following are a list of [Cargo features][cargo-features] that can be diff -Nru temporalio-1.3.0/vendor/reqwest/src/proxy.rs temporalio-1.3.0/vendor/reqwest/src/proxy.rs --- temporalio-1.3.0/vendor/reqwest/src/proxy.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/reqwest/src/proxy.rs 2023-10-30 19:40:00.000000000 +0000 @@ -13,22 +13,6 @@ use std::env; use std::error::Error; use std::net::IpAddr; -#[cfg(target_os = "macos")] -use system_configuration::{ - core_foundation::{ - base::CFType, - dictionary::CFDictionary, - number::CFNumber, - string::{CFString, CFStringRef}, - }, - dynamic_store::SCDynamicStoreBuilder, - sys::schema_definitions::kSCPropNetProxiesHTTPEnable, - sys::schema_definitions::kSCPropNetProxiesHTTPPort, - sys::schema_definitions::kSCPropNetProxiesHTTPProxy, - sys::schema_definitions::kSCPropNetProxiesHTTPSEnable, - sys::schema_definitions::kSCPropNetProxiesHTTPSPort, - sys::schema_definitions::kSCPropNetProxiesHTTPSProxy, -}; #[cfg(target_os = "windows")] use winreg::enums::HKEY_CURRENT_USER; #[cfg(target_os = "windows")] @@ -284,7 +268,7 @@ pub(crate) fn system() -> Proxy { let mut proxy = if cfg!(feature = "__internal_proxy_sys_no_cache") { Proxy::new(Intercept::System(Arc::new(get_sys_proxies( - get_from_platform(), + get_from_registry(), )))) } else { Proxy::new(Intercept::System(SYS_PROXIES.clone())) @@ -719,6 +703,7 @@ } type SystemProxyMap = HashMap; +type RegistryProxyValues = (u32, String); #[derive(Clone, Debug)] enum Intercept { @@ -803,36 +788,34 @@ } static SYS_PROXIES: Lazy> = - Lazy::new(|| Arc::new(get_sys_proxies(get_from_platform()))); + Lazy::new(|| Arc::new(get_sys_proxies(get_from_registry()))); /// Get system proxies information. /// -/// All platforms will check for proxy settings via environment variables. -/// If those aren't set, platform-wide proxy settings will be looked up on -/// Windows and MacOS platforms instead. Errors encountered while discovering -/// these settings are ignored. +/// It can only support Linux, Unix like, and windows system. Note that it will always +/// return a HashMap, even if something runs into error when find registry information in +/// Windows system. Note that invalid proxy url in the system setting will be ignored. /// /// Returns: /// System proxies information as a hashmap like /// {"http": Url::parse("http://127.0.0.1:80"), "https": Url::parse("https://127.0.0.1:80")} fn get_sys_proxies( - #[cfg_attr( - not(any(target_os = "windows", target_os = "macos")), - allow(unused_variables) - )] - platform_proxies: Option, + #[cfg_attr(not(target_os = "windows"), allow(unused_variables))] registry_values: Option< + RegistryProxyValues, + >, ) -> SystemProxyMap { let proxies = get_from_environment(); - #[cfg(any(target_os = "windows", target_os = "macos"))] - if proxies.is_empty() { - // if there are errors in acquiring the platform proxies, - // we'll just return an empty HashMap - if let Some(platform_proxies) = platform_proxies { - return parse_platform_values(platform_proxies); + // TODO: move the following #[cfg] to `if expression` when attributes on `if` expressions allowed + #[cfg(target_os = "windows")] + { + if proxies.is_empty() { + // don't care errors if can't get proxies from registry, just return an empty HashMap. + if let Some(registry_values) = registry_values { + return parse_registry_values(registry_values); + } } } - proxies } @@ -890,7 +873,7 @@ } #[cfg(target_os = "windows")] -fn get_from_platform_impl() -> Result, Box> { +fn get_from_registry_impl() -> Result> { let hkcu = RegKey::predef(HKEY_CURRENT_USER); let internet_setting: RegKey = hkcu.open_subkey("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings")?; @@ -898,92 +881,33 @@ let proxy_enable: u32 = internet_setting.get_value("ProxyEnable")?; let proxy_server: String = internet_setting.get_value("ProxyServer")?; - Ok((proxy_enable == 1).then_some(proxy_server)) + Ok((proxy_enable, proxy_server)) } -#[cfg(target_os = "macos")] -fn parse_setting_from_dynamic_store( - proxies_map: &CFDictionary, - enabled_key: CFStringRef, - host_key: CFStringRef, - port_key: CFStringRef, - scheme: &str, -) -> Option { - let proxy_enabled = proxies_map - .find(enabled_key) - .and_then(|flag| flag.downcast::()) - .and_then(|flag| flag.to_i32()) - .unwrap_or(0) - == 1; - - if proxy_enabled { - let proxy_host = proxies_map - .find(host_key) - .and_then(|host| host.downcast::()) - .map(|host| host.to_string()); - let proxy_port = proxies_map - .find(port_key) - .and_then(|port| port.downcast::()) - .and_then(|port| port.to_i32()); - - return match (proxy_host, proxy_port) { - (Some(proxy_host), Some(proxy_port)) => { - Some(format!("{scheme}={proxy_host}:{proxy_port}")) - } - (Some(proxy_host), None) => Some(format!("{scheme}={proxy_host}")), - (None, Some(_)) => None, - (None, None) => None, - }; - } - - None +#[cfg(target_os = "windows")] +fn get_from_registry() -> Option { + get_from_registry_impl().ok() } -#[cfg(target_os = "macos")] -fn get_from_platform_impl() -> Result, Box> { - let store = SCDynamicStoreBuilder::new("reqwest").build(); - - let Some(proxies_map) = store.get_proxies() else { - return Ok(None); - }; - - let http_proxy_config = parse_setting_from_dynamic_store( - &proxies_map, - unsafe { kSCPropNetProxiesHTTPEnable }, - unsafe { kSCPropNetProxiesHTTPProxy }, - unsafe { kSCPropNetProxiesHTTPPort }, - "http", - ); - let https_proxy_config = parse_setting_from_dynamic_store( - &proxies_map, - unsafe { kSCPropNetProxiesHTTPSEnable }, - unsafe { kSCPropNetProxiesHTTPSProxy }, - unsafe { kSCPropNetProxiesHTTPSPort }, - "https", - ); - - match http_proxy_config.as_ref().zip(https_proxy_config.as_ref()) { - Some((http_config, https_config)) => Ok(Some(format!("{http_config};{https_config}"))), - None => Ok(http_proxy_config.or(https_proxy_config)), - } +#[cfg(not(target_os = "windows"))] +fn get_from_registry() -> Option { + None } -#[cfg(any(target_os = "windows", target_os = "macos"))] -fn get_from_platform() -> Option { - get_from_platform_impl().ok().flatten() -} +#[cfg(target_os = "windows")] +fn parse_registry_values_impl( + registry_values: RegistryProxyValues, +) -> Result> { + let (proxy_enable, proxy_server) = registry_values; -#[cfg(not(any(target_os = "windows", target_os = "macos")))] -fn get_from_platform() -> Option { - None -} + if proxy_enable == 0 { + return Ok(HashMap::new()); + } -#[cfg(any(target_os = "windows", target_os = "macos"))] -fn parse_platform_values_impl(platform_values: String) -> SystemProxyMap { let mut proxies = HashMap::new(); - if platform_values.contains("=") { + if proxy_server.contains("=") { // per-protocol settings. - for p in platform_values.split(";") { + for p in proxy_server.split(";") { let protocol_parts: Vec<&str> = p.split("=").collect(); match protocol_parts.as_slice() { [protocol, address] => { @@ -1006,21 +930,21 @@ } } } else { - if let Some(scheme) = extract_type_prefix(&platform_values) { + if let Some(scheme) = extract_type_prefix(&proxy_server) { // Explicit protocol has been specified - insert_proxy(&mut proxies, scheme, platform_values.to_owned()); + insert_proxy(&mut proxies, scheme, proxy_server.to_owned()); } else { // No explicit protocol has been specified, default to HTTP - insert_proxy(&mut proxies, "http", format!("http://{}", platform_values)); - insert_proxy(&mut proxies, "https", format!("http://{}", platform_values)); + insert_proxy(&mut proxies, "http", format!("http://{}", proxy_server)); + insert_proxy(&mut proxies, "https", format!("http://{}", proxy_server)); } } - proxies + Ok(proxies) } /// Extract the protocol from the given address, if present /// For example, "https://example.com" will return Some("https") -#[cfg(any(target_os = "windows", target_os = "macos"))] +#[cfg(target_os = "windows")] fn extract_type_prefix(address: &str) -> Option<&str> { if let Some(indice) = address.find("://") { if indice == 0 { @@ -1040,9 +964,9 @@ } } -#[cfg(any(target_os = "windows", target_os = "macos"))] -fn parse_platform_values(platform_values: String) -> SystemProxyMap { - parse_platform_values_impl(platform_values) +#[cfg(target_os = "windows")] +fn parse_registry_values(registry_values: RegistryProxyValues) -> SystemProxyMap { + parse_registry_values_impl(registry_values).unwrap_or(HashMap::new()) } #[cfg(test)] @@ -1249,7 +1173,7 @@ assert!(all_proxies.values().all(|p| p.host() == "127.0.0.2")); } - #[cfg(any(target_os = "windows", target_os = "macos"))] + #[cfg(target_os = "windows")] #[test] fn test_get_sys_proxies_registry_parsing() { // Stop other threads from modifying process-global ENV while we are. @@ -1261,16 +1185,20 @@ // Mock ENV, get the results, before doing assertions // to avoid assert! -> panic! -> Mutex Poisoned. let baseline_proxies = get_sys_proxies(None); + // the system proxy in the registry has been disabled + let disabled_proxies = get_sys_proxies(Some((0, String::from("http://127.0.0.1/")))); // set valid proxy - let valid_proxies = get_sys_proxies(Some(String::from("http://127.0.0.1/"))); - let valid_proxies_no_scheme = get_sys_proxies(Some(String::from("127.0.0.1"))); + let valid_proxies = get_sys_proxies(Some((1, String::from("http://127.0.0.1/")))); + let valid_proxies_no_scheme = get_sys_proxies(Some((1, String::from("127.0.0.1")))); let valid_proxies_explicit_https = - get_sys_proxies(Some(String::from("https://127.0.0.1/"))); - let multiple_proxies = get_sys_proxies(Some(String::from( - "http=127.0.0.1:8888;https=127.0.0.2:8888", + get_sys_proxies(Some((1, String::from("https://127.0.0.1/")))); + let multiple_proxies = get_sys_proxies(Some(( + 1, + String::from("http=127.0.0.1:8888;https=127.0.0.2:8888"), ))); - let multiple_proxies_explicit_scheme = get_sys_proxies(Some(String::from( - "http=http://127.0.0.1:8888;https=https://127.0.0.2:8888", + let multiple_proxies_explicit_scheme = get_sys_proxies(Some(( + 1, + String::from("http=http://127.0.0.1:8888;https=https://127.0.0.2:8888"), ))); // reset user setting when guards drop @@ -1280,6 +1208,7 @@ drop(_lock); assert_eq!(baseline_proxies.contains_key("http"), false); + assert_eq!(disabled_proxies.contains_key("http"), false); let p = &valid_proxies["http"]; assert_eq!(p.scheme(), "http"); @@ -1562,7 +1491,7 @@ drop(_lock); } - #[cfg(any(target_os = "windows", target_os = "macos"))] + #[cfg(target_os = "windows")] #[test] fn test_type_prefix_extraction() { assert!(extract_type_prefix("test").is_none()); diff -Nru temporalio-1.3.0/vendor/reqwest/src/tls.rs temporalio-1.3.0/vendor/reqwest/src/tls.rs --- temporalio-1.3.0/vendor/reqwest/src/tls.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/reqwest/src/tls.rs 2023-10-30 19:40:00.000000000 +0000 @@ -463,26 +463,6 @@ } } -/// Hyper extension carrying extra TLS layer information. -/// Made available to clients on responses when `tls_info` is set. -#[derive(Clone)] -pub struct TlsInfo { - pub(crate) peer_certificate: Option>, -} - -impl TlsInfo { - /// Get the DER encoded leaf certificate of the peer. - pub fn peer_certificate(&self) -> Option<&[u8]> { - self.peer_certificate.as_ref().map(|der| &der[..]) - } -} - -impl std::fmt::Debug for TlsInfo { - fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { - f.debug_struct("TlsInfo").finish() - } -} - #[cfg(test)] mod tests { use super::*; diff -Nru temporalio-1.3.0/vendor/reqwest/tests/blocking.rs temporalio-1.3.0/vendor/reqwest/tests/blocking.rs --- temporalio-1.3.0/vendor/reqwest/tests/blocking.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/reqwest/tests/blocking.rs 2023-10-30 19:40:00.000000000 +0000 @@ -362,25 +362,3 @@ assert_eq!("application/json", req.headers().get(CONTENT_TYPE).unwrap()); } - -#[test] -fn test_response_no_tls_info_for_http() { - let server = server::http(move |_req| async { http::Response::new("Hello".into()) }); - - let url = format!("http://{}/text", server.addr()); - - let client = reqwest::blocking::Client::builder() - .tls_info(true) - .build() - .unwrap(); - - let res = client.get(&url).send().unwrap(); - assert_eq!(res.url().as_str(), &url); - assert_eq!(res.status(), reqwest::StatusCode::OK); - assert_eq!(res.content_length(), Some(5)); - let tls_info = res.extensions().get::(); - assert_eq!(tls_info.is_none(), true); - - let body = res.text().unwrap(); - assert_eq!(b"Hello", body.as_bytes()); -} diff -Nru temporalio-1.3.0/vendor/reqwest/tests/client.rs temporalio-1.3.0/vendor/reqwest/tests/client.rs --- temporalio-1.3.0/vendor/reqwest/tests/client.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/reqwest/tests/client.rs 2023-10-30 19:40:00.000000000 +0000 @@ -408,33 +408,3 @@ assert_eq!("application/json", req.headers().get(CONTENT_TYPE).unwrap()); } - -#[cfg(all(feature = "__tls", not(feature = "rustls-tls-manual-roots")))] -#[tokio::test] -async fn test_tls_info() { - let resp = reqwest::Client::builder() - .tls_info(true) - .build() - .expect("client builder") - .get("https://google.com") - .send() - .await - .expect("response"); - let tls_info = resp.extensions().get::(); - assert!(tls_info.is_some()); - let tls_info = tls_info.unwrap(); - let peer_certificate = tls_info.peer_certificate(); - assert!(peer_certificate.is_some()); - let der = peer_certificate.unwrap(); - assert_eq!(der[0], 0x30); // ASN.1 SEQUENCE - - let resp = reqwest::Client::builder() - .build() - .expect("client builder") - .get("https://google.com") - .send() - .await - .expect("response"); - let tls_info = resp.extensions().get::(); - assert!(tls_info.is_none()); -} diff -Nru temporalio-1.3.0/vendor/reqwest/tests/timeouts.rs temporalio-1.3.0/vendor/reqwest/tests/timeouts.rs --- temporalio-1.3.0/vendor/reqwest/tests/timeouts.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/reqwest/tests/timeouts.rs 2023-10-30 19:40:00.000000000 +0000 @@ -86,63 +86,6 @@ assert!(err.is_connect() && err.is_timeout()); } -#[cfg(not(target_arch = "wasm32"))] -#[tokio::test] -async fn connect_many_timeout_succeeds() { - let _ = env_logger::try_init(); - - let server = server::http(move |_req| async { http::Response::default() }); - let port = server.addr().port(); - - let client = reqwest::Client::builder() - .resolve_to_addrs( - "many_addrs", - &["10.255.255.1:81".parse().unwrap(), server.addr()], - ) - .connect_timeout(Duration::from_millis(100)) - .build() - .unwrap(); - - let url = format!("http://many_addrs:{port}/eventual"); - - let _res = client - .get(url) - .timeout(Duration::from_millis(1000)) - .send() - .await - .unwrap(); -} - -#[cfg(not(target_arch = "wasm32"))] -#[tokio::test] -async fn connect_many_timeout() { - let _ = env_logger::try_init(); - - let client = reqwest::Client::builder() - .resolve_to_addrs( - "many_addrs", - &[ - "10.255.255.1:81".parse().unwrap(), - "10.255.255.2:81".parse().unwrap(), - ], - ) - .connect_timeout(Duration::from_millis(100)) - .build() - .unwrap(); - - let url = format!("http://many_addrs:81/slow"); - - let res = client - .get(url) - .timeout(Duration::from_millis(1000)) - .send() - .await; - - let err = res.unwrap_err(); - - assert!(err.is_connect() && err.is_timeout()); -} - #[tokio::test] async fn response_timeout() { let _ = env_logger::try_init(); diff -Nru temporalio-1.3.0/vendor/ring/build.rs temporalio-1.3.0/vendor/ring/build.rs --- temporalio-1.3.0/vendor/ring/build.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring/build.rs 2023-10-30 19:40:00.000000000 +0000 @@ -109,7 +109,6 @@ fn cpp_flags(compiler: &cc::Tool) -> &'static [&'static str] { if !compiler.is_like_msvc() { static NON_MSVC_FLAGS: &[&str] = &[ - "-fvisibility=hidden", "-std=c1x", // GCC 4.6 requires "c1x" instead of "c11" "-pedantic", "-Wall", @@ -134,15 +133,21 @@ "-Wundef", "-Wuninitialized", "-Wwrite-strings", + "-fvisibility=hidden", ]; NON_MSVC_FLAGS } else { static MSVC_FLAGS: &[&str] = &[ - "/Gy", // Enable function-level linking. + "/GS", // Buffer security checks. + "/Gy", // Enable function-level linking. + "/EHsc", // C++ exceptions only, only in C++. + "/GR-", // Disable RTTI. "/Zc:wchar_t", "/Zc:forScope", "/Zc:inline", + "/Zc:rvalueCast", // Warnings. + "/sdl", "/Wall", "/wd4127", // C4127: conditional expression is constant "/wd4464", // C4464: relative include path contains '..' @@ -587,6 +592,13 @@ for f in cpp_flags(&compiler) { let _ = c.flag(f); } + if target.os != "none" + && target.os != "redox" + && target.os != "windows" + && target.arch != "wasm32" + { + let _ = c.flag("-fstack-protector"); + } if target.os.as_str() == "macos" { // ``-gfull`` is required for Darwin's |-dead_strip|. @@ -599,10 +611,20 @@ let _ = c.define("NDEBUG", None); } + if compiler.is_like_msvc() { + if std::env::var("OPT_LEVEL").unwrap() == "0" { + let _ = c.flag("/Od"); // Disable optimization for debug builds. + // run-time checking: (s)tack frame, (u)ninitialized variables + let _ = c.flag("/RTCsu"); + } else { + let _ = c.flag("/Ox"); // Enable full optimization. + } + } + // Allow cross-compiling without a target sysroot for these targets. // // poly1305_vec.c requires which requires . - if (target.arch == "wasm32") + if (target.arch == "wasm32" && target.os == "unknown") || (target.os == "linux" && target.is_musl && target.arch != "x86_64") { if let Ok(compiler) = c.try_get_compiler() { @@ -617,6 +639,14 @@ if target.force_warnings_into_errors { c.warnings_into_errors(true); } + if target.is_musl { + // Some platforms enable _FORTIFY_SOURCE by default, but musl + // libc doesn't support it yet. See + // http://wiki.musl-libc.org/wiki/Future_Ideas#Fortify + // http://www.openwall.com/lists/musl/2015/02/04/3 + // http://www.openwall.com/lists/musl/2015/06/17/1 + let _ = c.flag("-U_FORTIFY_SOURCE"); + } } /// Assembles the assemply language source `file` into the object file @@ -721,7 +751,7 @@ .collect::>() } -fn is_perlasm(path: &Path) -> bool { +fn is_perlasm(path: &PathBuf) -> bool { path.extension().unwrap().to_str().unwrap() == "pl" } @@ -949,13 +979,15 @@ "ecp_nistz256_neg", "ecp_nistz256_select_w5", "ecp_nistz256_select_w7", + "nistz384_point_add", + "nistz384_point_double", + "nistz384_point_mul", "p256_mul_mont", "p256_point_add", "p256_point_add_affine", "p256_point_double", "p256_point_mul", "p256_point_mul_base", - "p256_point_mul_base_vartime", "p256_scalar_mul_mont", "p256_scalar_sqr_rep_mont", "p256_sqr_mont", @@ -963,9 +995,6 @@ "p384_elem_mul_mont", "p384_elem_neg", "p384_elem_sub", - "p384_point_add", - "p384_point_double", - "p384_point_mul", "p384_scalar_mul_mont", "openssl_poly1305_neon2_addmulmod", "openssl_poly1305_neon2_blocks", diff -Nru temporalio-1.3.0/vendor/ring/.cargo-checksum.json temporalio-1.3.0/vendor/ring/.cargo-checksum.json --- temporalio-1.3.0/vendor/ring/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1,8 +1,8 @@ { "files": { - "Cargo.toml": "1eb629a293ed262d1b23079be9e71597ad9affa9ecb638b3fefcab48c6ebbcee", + "Cargo.toml": "bd1b334671e4998311984f6b0e2875f46b8ceee138ae929831df805be627ae61", "LICENSE": "76b39f9b371688eac9d8323f96ee80b3aef5ecbc2217f25377bd4e4a615296a9", - "build.rs": "2ad0310d9c6e57c9ac49d4f3e2cdaaf5198005441201af0da5bcabde9f9bcf48", + "build.rs": "6104125db1bf9c9107bb863f8af3e865bb61800c3a9b00abebf098d5db693d89", "crypto/chacha/asm/chacha-armv4.pl": "2ea5f9dd73c9748d6adab2455ef85d9eda17f576e0900ea93703ebbd915d4558", "crypto/chacha/asm/chacha-armv8.pl": "9b0f5dd7650abe2b9d5f5039732a1798646ef43b243d69f69422cc8b77d0500a", "crypto/chacha/asm/chacha-x86.pl": "c6a1c1ab3200bb75269275b5c56ef3fa0402ff72d82bc36d1c16b1089b41db9c", @@ -13,7 +13,7 @@ "crypto/cpu_intel.c": "5274bbb2b934f8d26585fbb7fba7b8329ecdfac8af626c0a38b1341b86a14590", "crypto/crypto.c": "8f22734bcc80c10f6ff7bd4e49e5a537f685983f517da3cd66a3588205570a77", "crypto/curve25519/asm/x25519-asm-arm.S": "584f4500b2cf55f2e7b18df831ac19f8e9cc8ec9c399c66452cf731d28d45715", - "crypto/curve25519/curve25519.c": "af884152b1b3526861ae724461c0031a5ea18df701c679790df288383078dcdd", + "crypto/curve25519/curve25519.c": "461316a73b6d0a79e25443cab6bc09ef1ff4b783df026c06d67039ae1883a1d3", "crypto/curve25519/curve25519_64_adx.c": "4aff2f9615c7b300fe59dc74f98bdaa9c21eb43b54b0f94b018a8c573ea0a4f9", "crypto/curve25519/curve25519_tables.h": "5e594f0a2e08afbc94d6327a7604afbc409f209138b0efbdb95115ba5315faed", "crypto/curve25519/internal.h": "8f0e88a8f10e77cad0eb768a53953eaaea898e42eb9e5be9fe510dbba77ed51a", @@ -37,13 +37,13 @@ "crypto/fipsmodule/ec/ecp_nistz.c": "d5d2359807cea970cdbd059935322890a5535c39b8abf633d4324656392d527d", "crypto/fipsmodule/ec/ecp_nistz.h": "ba6982c928bbbc3c71e9ef2a7bd0e1f4ca3436bf3d178e0c5727fbcd49dfea61", "crypto/fipsmodule/ec/ecp_nistz384.h": "7aeb84e1d64b1018d8e0c89b97ae1e603f31f9cd4786104ce5932f4d425bb1d7", - "crypto/fipsmodule/ec/ecp_nistz384.inl": "0229835ebc9bdfe9268c53cf3e5d346831a9b2f66377a320d92407f2293b5412", + "crypto/fipsmodule/ec/ecp_nistz384.inl": "d5b342dd19e7afed0c914d9115a017263532a26b267cf906203f606cde09e9ec", "crypto/fipsmodule/ec/gfp_p256.c": "ff6754545e9420e0b660e7bca32082d2025a3ca7a568404df71915f53f9cb2fd", "crypto/fipsmodule/ec/gfp_p384.c": "5960def96ada5859d551817b962414063a1900248d164f241a87be3d4990efe9", "crypto/fipsmodule/ec/p256-nistz-table.h": "04de70aacb1b079abe368125fbd683e4dae32c3c877f33187742ad4068810a52", - "crypto/fipsmodule/ec/p256-nistz.c": "7dbf5f116b23e1d9d23d567de4d0ce8cde21389a5873466e179413ce94ada17e", + "crypto/fipsmodule/ec/p256-nistz.c": "a65c169d62799bec734355c126bf2151bc89a7bbf758d58357e7b7938fe35d83", "crypto/fipsmodule/ec/p256-nistz.h": "9df1f95ae7d1e9bc6a03c5caf5f3d04c6e83b46ac3c0b01354919c91b46cecb5", - "crypto/fipsmodule/ec/p256.c": "29a3f9306d8bc1470ac7c0172ddd1ecdcfc0c2b51386da0e4b405b0a5ea5d30b", + "crypto/fipsmodule/ec/p256.c": "25e651379609730d9a03e405edbea759b889d2c64ee5620216c0093ce7560fd0", "crypto/fipsmodule/ec/p256_shared.h": "ab61cdd9bd80b5b208ba96b04daa335afe55353e527f033009eeb9d986e3c594", "crypto/fipsmodule/ec/p256_table.h": "e51b222d99a6ea4bbbb6c43c0b34a57f3687f1a826931f2401e4ffa03b4de0d5", "crypto/fipsmodule/ec/util.h": "db277b9751c8b34117792eaa5be4bb0c528c341071e4e7665b6350bd54846b58", @@ -79,7 +79,7 @@ "include/ring-core/check.h": "11026e3101e263f98fea8ae879e5de1acb678f26d9d4536cad792b08fdd5eb57", "include/ring-core/mem.h": "99056f78311ebb0e17d4a5e8d64d649329da676b7915a9733016b4bf836bfb9c", "include/ring-core/poly1305.h": "4e975208caaf1031642ee2ae7f145a2728b36734e1db4e1c230a159cf29e0e72", - "include/ring-core/target.h": "f1e65888fa7e24ccfab4fa3b22baad613e9f4c3bee5bbcb3487bf771f7f4cece", + "include/ring-core/target.h": "d3d4c738988ea92daa0281bb7a6f58856c40fea6709f04184916a1356828cf85", "include/ring-core/type_check.h": "c1e3b240de5cb7c1264cfd198f3cfa067f47fb00370e56d86d333f7c9b3cd3ee", "pregenerated/aesni-gcm-x86_64-elf.S": "65d6fe52c6b4e33b8d1143b23618c416a311aa484088a46c2d3974e005c8a09f", "pregenerated/aesni-gcm-x86_64-macosx.S": "c5ec0ccb1e60d2dcd34ba494980c2619e4ca3fff137883b0dd5853b2c1ac2c9f", @@ -144,8 +144,8 @@ "pregenerated/tmp/ghash-x86-win32n.asm": "6611dea69a50b26258bee4b564ce34f81b785f396e6f235eb318e6fbddbcf646", "pregenerated/tmp/ghash-x86_64-nasm.asm": "47996d41da7c92d40775e64fae8c86ad6bfecd7d0897c953b66a751fe74c1685", "pregenerated/tmp/p256-x86_64-asm-nasm.asm": "cac941b9ffa66be49181d0ca64e5ff1ed3e8ebaa279e84237d146d8e58605bfa", - "pregenerated/tmp/ring_core_generated/prefix_symbols_asm.h": "eec2f5e0af03cc10517dbedcd8a0ebd587fe3043f6aa0dcdb020900fa7995c16", - "pregenerated/tmp/ring_core_generated/prefix_symbols_nasm.inc": "c74366fde8873a9f5051041020b329dbac614c2bfffe3f82de9d2b87d7d98713", + "pregenerated/tmp/ring_core_generated/prefix_symbols_asm.h": "2d5bd63400a601824931630e01490f511de68dd60a778f3fc375de1e5cda113b", + "pregenerated/tmp/ring_core_generated/prefix_symbols_nasm.inc": "7606320a738d9d42222bd13d6d0b8ccf5aac39f4035e4cef1511e3fa9e482a7d", "pregenerated/tmp/sha256-x86_64-nasm.asm": "d38a93efb29822bd19a181805c05fb9d73729f6b16c8fdeadef9c2b17bf6026d", "pregenerated/tmp/sha512-x86_64-nasm.asm": "8e83653efaf37d20ef4dbb16419c78c35aad70a23407012bd6bdfec3cfdd40c5", "pregenerated/tmp/vpaes-x86-win32n.asm": "bc1874555a2a872c65bbd2260163ab2b153e3cff8d14fd79cd0b4345532f2de3", @@ -166,15 +166,15 @@ "pregenerated/x86_64-mont5-elf.S": "25a6dd78531d68b7d840b7f701e77545588c3ca667d56496f1d63bc9343afc98", "pregenerated/x86_64-mont5-macosx.S": "e5352368831385b8e19c8af017f1369008ee8262d518401bb9b07d93b08083ac", "src/aead.rs": "ca4d30d604b7213675df939ddf028e1b081f3973dd69a961fdeb86e8859cf594", - "src/aead/aes.rs": "6eb07a99ead82a4bf66e3f365b5913a759b58fd8803971fb4bce9bed95d4bf59", - "src/aead/aes_gcm.rs": "57707ce14cf28206cb85142dbb9124a7d49cfbee78e689800de8f8d6bed77456", - "src/aead/block.rs": "da61c3d7ca8e66570606952c20c0ad45b1d72c1e502a9c01febe717221b87467", - "src/aead/chacha.rs": "728a83bfd8ac0660b07736886ac4246e82baf69a70a62ec8fd033823ff13989e", - "src/aead/chacha/fallback.rs": "3f904f75cd4df04389c119a0d2cbf6dbe5fae38a1a095b89e21d56542839e0de", - "src/aead/chacha20_poly1305.rs": "4d67175285197c5d468ad72cbe998da37628a2a3edd0c0419330d0b7cb3f8ba2", - "src/aead/chacha20_poly1305_openssh.rs": "dc5ec40e3c1a45d9da2a100279ea5331ac1b6d5ce840ff1823531a3cfa16f45e", - "src/aead/gcm.rs": "a998aa1ebe37b08e84dbff99ed0301363b9bb935f42ed68633c9a16f01b535fd", - "src/aead/gcm/gcm_nohw.rs": "7ab4246218ecaa64a63452f6e0a4d80acc03ceaf61b8eedb47d29f1c7e54510f", + "src/aead/aes.rs": "d03ba546088473721928d4103da819e026bb488f6964bf9407f2283c16fa278d", + "src/aead/aes_gcm.rs": "2fe30e8bc4a464eaa65c67f8907ada1ae6445b6bae5092c9e7b178cdaec3cf6c", + "src/aead/block.rs": "f3d70afffede7f09f71b57a15c8302f8dc2947d0f3106ec49736de341db42f76", + "src/aead/chacha.rs": "5ec18e03f7415fc278df84e0954ebfbe7c0fe621af235517422c332125186def", + "src/aead/chacha/fallback.rs": "7e17d1245ceed6e0a8a7f12d167aa71baf59f7d9a6ac37446dd0459422d4fe7d", + "src/aead/chacha20_poly1305.rs": "eaaca9d3e977109a7f08e09a69fa5c0cbea7e3a1e879ed17ce20692c5d77b3f9", + "src/aead/chacha20_poly1305_openssh.rs": "7784986656ba13942566c29a0e643ab323549d607ffe2c2d1f81de598cadca03", + "src/aead/gcm.rs": "be2ab80c151be1bb4ab3034f2fb260730ded9ea7488b788b93a82c6e02f8ed66", + "src/aead/gcm/gcm_nohw.rs": "0f2fc045a978e9322f89a710e0cdc5a95db04984432984996b4732c3df11192c", "src/aead/less_safe_key.rs": "9ae1073adf1f3b69bdca1e4c1ee73f17e80551ebf2f628c6d8bbd189b6f1d718", "src/aead/nonce.rs": "91bbf1018e2a6c151ea501627f10fe61910739a35ea3cab929395bf59d208db7", "src/aead/opening_key.rs": "adc7f77883a916d10b2347bbec9b14a0325f8ebd87592993138d239526e35512", @@ -185,12 +185,12 @@ "src/aead/shift.rs": "cbc7f10ca8971debb02a5b1e0c99fe7e502f510ade87ba76a51cea1854de3e47", "src/aead/unbound_key.rs": "557e328c040a74724f6d81370e67e45dccd3eb63dd14222d79c01c23ec6c3ee4", "src/agreement.rs": "fe9d369bee3e18eada0ba32fe2f9c5fbdb9fc2fcf243ed36500ff3b029c09a10", - "src/arithmetic.rs": "2e5126a0abd3a4d1b38fa5b3d5cf3e44ddb3e6c003f1f6d43f7445d703846f90", - "src/arithmetic/bigint.rs": "0bbd9bec48279ae92d7dec08ecb1f533d69ed8b9e7475de0a8e8980c76b41620", + "src/arithmetic.rs": "a87e711708fb568dbf62009e151be7bd5b3b8a69cc9d3559508bd042aaf82787", + "src/arithmetic/bigint.rs": "4ec17e02eda55067f8736e8acb2ddcf09632277006648b2bd8e05613a0471cf9", "src/arithmetic/bigint/boxed_limbs.rs": "ba087490545e1808c8c35d003b77d5e549c27a8546c4fb3b8f12930d11a849ce", "src/arithmetic/bigint/modulus.rs": "60a41d0052bdd362857027c62f95c61f85ea169c2c7e0842b47740e127de1101", "src/arithmetic/bigint/private_exponent.rs": "ca4afa9f731f017395515188998f3ea4fdf8db561807b3da4fd8faca517b2055", - "src/arithmetic/constant.rs": "a22609497e1ee6aae2a6095fed91de56037906fbf49c2a66bdd9befd560157fd", + "src/arithmetic/constant.rs": "a5c0448ff100ba4c137dc320b2b30f997cfc2e973847da7301f097265c338ed9", "src/arithmetic/montgomery.rs": "24b103f0d07ccc5ffcd90a96e9fd8731179cd0240ece19349983742eb0fa0436", "src/arithmetic/n0.rs": "2d27721c954869a0afbf53345f13d485b86e66cd8c655fb607ad5666d0151367", "src/arithmetic/nonnegative.rs": "2c6d55dc185e4de4d1d74f687e93799cdcd414b24fec6327838e2d33c1a30a14", @@ -206,17 +206,17 @@ "src/digest.rs": "58b416157e148e504152098d4bf96b2eb9ea48199b355ea51b6f78df1a9cc129", "src/digest/sha1.rs": "542b3a20ffb5800fab3215df1b931b640753cdb04742d0a63afde46ea20feba0", "src/digest/sha2.rs": "1ce42bdd98bed119053eb2c36c161154dfbdd0014092219e8583ab3ea75c238e", - "src/ec.rs": "9b59ba0e616fa6cda295cf5df7d69deea560546ce4749977861bfb5c99c1e696", - "src/ec/curve25519.rs": "6693e2f4d30791072ee197651b37402e47bb2b4675b574a73c7cae252dbd9f09", + "src/ec.rs": "1b2067f41217f83b4921b593e4e8c4746ed8bc1febb79cc6ed2db716809cee60", + "src/ec/curve25519.rs": "9af5358f331756535b5acea2aa9e1cf58f32b0433719d7df64b5cafe407650b9", "src/ec/curve25519/ed25519.rs": "d025eac2dfce52442a9d1aa0c159509bee7c8b6fd48506b90aa5bb4e4f09dc5f", "src/ec/curve25519/ed25519/ed25519_pkcs8_v2_template.der": "b209940853a4d88930cf2a12d18dd6823de256cd30303676ba1be07475cc83b8", "src/ec/curve25519/ed25519/signing.rs": "82d98b6143efd0803267f9b0a6527c8397266a89941ef162b6cf562c472ab2b6", "src/ec/curve25519/ed25519/verification.rs": "a51979d7540e43d4295289416d8fe41d85e2368b741725f69e38ef83edf1f491", "src/ec/curve25519/ops.rs": "8b50e26f211ba4cfcf0227b51ceb3882a4c35052c2e2e326ec93afccb67b716c", - "src/ec/curve25519/scalar.rs": "5a1c01c08fc4794bda1e477be16e1ecedd9105e98e5d94392fe4fa4b0e40f314", + "src/ec/curve25519/scalar.rs": "5d499eae1d5129250d1e13482be7712a68d68592fdcd18c8992daf7b43a6cd26", "src/ec/curve25519/x25519.rs": "9fe38223707ef411303e3c1295867a2b6ed58231006194f92257cf4318e3bec8", - "src/ec/keys.rs": "b5ec825590a4c82f56beef9b51019e9f6d338264479a827eada9c5d2830336e3", - "src/ec/suite_b.rs": "f148590678a611e3b746c4b9994c7e19ca37f6deac756de69812a36693a40516", + "src/ec/keys.rs": "f6d22f9fa6e43df19fe4e6d50e0d0641132b935c5accc4cacda254770b43948c", + "src/ec/suite_b.rs": "265d6f89847312e9c6451dee4ca7afc09f0664bee1d5e9ac1794f2e2f7b2cb5e", "src/ec/suite_b/curve.rs": "64926ae050efe82a04880d24d3abb26f3e4765773d457627e5e39bcc3d008482", "src/ec/suite_b/ecdh.rs": "2284fade50e5bde08831a23bf4a29dae57add560e40528050efa2b977dc28ce9", "src/ec/suite_b/ecdsa.rs": "013e0d2d2a21eb437253b03a1f6a1a4ba8c45eb1c2ea1396696bdd04a8ed2932", @@ -224,14 +224,14 @@ "src/ec/suite_b/ecdsa/ecPublicKey_p256_pkcs8_v1_template.der": "5a2207da0199ebe3e2a80e15e7692b21f215f855ed3bd2c51f466c7969e11990", "src/ec/suite_b/ecdsa/ecPublicKey_p384_pkcs8_v1_template.der": "5ec14cd6aac17cec849382ee5e2077497f98ce435d7aee2116cd092bf84f5556", "src/ec/suite_b/ecdsa/signing.rs": "f9a34b59b767aea363c6875cad32101ecd32bacfb3943ee2c9331f1defe5a3b5", - "src/ec/suite_b/ecdsa/verification.rs": "c6f9181612fe43858a1a8f7d377dd629c5901776a6a79c46fc5a60d5e4048b28", - "src/ec/suite_b/ops.rs": "6febe0a7d1a370c76fdb132b2684add4e6e4035c8063f549e5ca9360937e7acc", - "src/ec/suite_b/ops/elem.rs": "9859218607f1683db866911d2aef178fc1e103399b07c8b51a1f5e3377438b77", - "src/ec/suite_b/ops/p256.rs": "2599a82c8381bb017ee8f5a9e8ad2f6e2d43811ee359a5fe5098bf007f1a2e68", - "src/ec/suite_b/ops/p384.rs": "084710dd890b1ac8437c99d867cfe3cc26602fdf520f205d1b4d27faacd2b131", + "src/ec/suite_b/ecdsa/verification.rs": "95bfc1002d5e757ca7ef1835deebb645abbfab7e25a0899f57acb9a4fb09fd84", + "src/ec/suite_b/ops.rs": "5470117286fb3e3802b5db75492987c4032367b7885ddd007a87361e3262045b", + "src/ec/suite_b/ops/elem.rs": "365792ad051514a3354a63b84b16c9d3189e25ce9363092838835df246409a4f", + "src/ec/suite_b/ops/p256.rs": "421c61c08850d594a8eab68f394e6c18d235fc80f0c324dadb9795cbab084b0a", + "src/ec/suite_b/ops/p384.rs": "fd3238e9f5398550eeedb08999007c19656f13a9fee6e68462008b033019c305", "src/ec/suite_b/private_key.rs": "cbce4db4600d5fe989d8f792c5decc8451acb1319f2c2d0dced5ba60236055cf", "src/ec/suite_b/public_key.rs": "f254259ce6dcad4f2ec981b0d3140952473cbe98d9c7c97ff96c1d9da369df0f", - "src/endian.rs": "32b898a57b95a7802938653db7060c02357f05aec34d14141f1c78fe611bb791", + "src/endian.rs": "0699a14ca33454473bf6cbbb6df22d0f882b2a63d011fada7329027cabf2d425", "src/error.rs": "4bc1c33840a199c5b8b7e4f6bbd65ad89f2ffe71723ec502dadea902d9b38098", "src/hkdf.rs": "31a9fd689c1f46d1dcc26dc9e3f83f3c520f21f6eb15a07eb380d7d752f1f924", "src/hmac.rs": "9846b73578852c25c510d4d2ce94a1e2efeef425d42fd0f2234199975f5d2094", @@ -240,26 +240,24 @@ "src/io/der_writer.rs": "ba6f9c5452b0b67db75765f1eb686078896aca591e76d27673097d6b32057954", "src/io/positive.rs": "f09a01bcdd7a8f8c30170a5f854e4b3a041c7cfe2c5b9f34b709ec15eda4321d", "src/io/writer.rs": "72d4cda37949b80823f6c2e6a6bb4b7dde5bfdc47c1143226b06ca4720d2cfbe", - "src/lib.rs": "307721f01272eb7d5dce81c0df677bdc766e6949d07ab80970858e77f00b2206", + "src/lib.rs": "58b258122de61c7c5f706f7db18b46167f7f99dff12ffe39227e5643e4e28fbe", "src/limb.rs": "d1571846ab3e89a58193bb3f8f745cba97f925681dde3297333c04c75de79a25", "src/pbkdf2.rs": "0bdb545fe876592da86108f95f89244e8a91f5d2397ee9b31d123a5426518722", "src/pkcs8.rs": "85ecbb686808892712cfbb204c5230d55773ab1200f1da968f330e7c44986dc2", - "src/polyfill.rs": "e4b857a6485925241bebb46f6670c4c71e1c808b9de53869842b4b106d81ecff", + "src/polyfill.rs": "10fe2667ff903c485260a6ebc59fa44bfd211efaaf5b080e74cc7316b70700e1", "src/polyfill/array_flat_map.rs": "0027962af7fa4e1830b4f67b4da400d3a13bb5dad7f96188ece1ffec412eb2b4", - "src/polyfill/array_flatten.rs": "8998d2cbb87fa28262bf6cd9b22a3f4095550121f6908e0155fac48a15f486c0", - "src/polyfill/array_split_map.rs": "010f41f9f54a97d8acd2c4e415e1627638c82202ec700efefef483309ebed096", - "src/polyfill/chunks_fixed.rs": "7fc0affe68398c710f5c3f588136d21c3b927a0740336858e0c4f1613760ca40", + "src/polyfill/chunks_fixed.rs": "d786034d51b47441d2d2a4ae6d4a09b9acff97f6c4916be2429fb80541eddb48", "src/polyfill/leading_zeros_skipped.rs": "4a505dc28cad0b5718fe0f2a74b8f79de1bc78cc49c2bf1f65b8e7e3eaad7489", "src/polyfill/test.rs": "38312699139268c9fc35f7d5ead73b118a79a471f6575da4b8a59efbf84eead7", "src/polyfill/unwrap_const.rs": "6d7a6c2c425aa801198daa6af33ecf70f769e32372b5d50c68b1ec49386e92a4", "src/prefixed.rs": "b20a1ccd54544a592910ae73dd34f4684cfad32b409da346c155b18c139eeee0", - "src/rand.rs": "e8a5694c199b87fc901065dc1335d5981a1111d924106523c54b9b39425fccb0", + "src/rand.rs": "e98f11874ca8598bb17b48083ce90c02593932251da1eda42ce127ecb253436c", "src/rsa.rs": "b2c7ac54940d2fc799f653e5f54786eb0180ed6be02b7fd1221d57161e469a97", "src/rsa/keypair.rs": "63ebc13b7ad72bccbd818d32652f62233dbd7458be4d639a270487f7618221a6", "src/rsa/keypair_components.rs": "b3ce592439de54153b89c80e86165e8405f86c710e283d456b8cd5da5ad6ac65", "src/rsa/padding.rs": "acfa094a1027d35e9c9b1ed1df1a603cf306947ec78b0a12a424502ba95755b9", "src/rsa/padding/pkcs1.rs": "07f08720eb2fbfff10f901596a7c4ecd12a23c37496fd73030e5279a770c6706", - "src/rsa/padding/pss.rs": "1be7f86347aaa0d325147d0efd46941bcc018e403c3340c6655cdc23b53392c4", + "src/rsa/padding/pss.rs": "b5d7d9032221eb1510467e5a5aa89c282c516ab2840e83e8f091056cc9ba0db8", "src/rsa/public_exponent.rs": "e49a90b89b806322329a6fff85fee5c81c4ff7ee3b1e896ece0db0be9a35a2f8", "src/rsa/public_key.rs": "2c54854ab0f2399edcf45261590b2e5f9eb462c91a8b37020687b18963e61976", "src/rsa/public_key_components.rs": "7cd2a5d1339cfc65eaf826f133db78f6184c0ca060c029c8eb3c1c22e7452967", @@ -269,10 +267,10 @@ "src/rsa/verification.rs": "ad350bb826451f23f1113ae62dd0a7627e085b5e74944470bab43a0fddc99858", "src/signature.rs": "3c60ed963c9e607a030bf8d391c8d81cc97e6a9f1ea4f5bb150d73ad508c04cc", "src/test.rs": "f388c047d915e13f90f413c4054eeb19e2e131c02ddabf487fd506641b289f90", - "tests/aead_tests.rs": "078b64626db4f8a205a0085bd16d08ed93e9dcaabe93ce055bddfac9191903de", - "tests/agreement_tests.rs": "4ff8c5362e139c4689eed8ee6b989c9ec7ed0f8eb44ebb3ecc103c5c5d253482", - "tests/constant_time_tests.rs": "c7a98264ae51af9fbafc569010b08c2f8788e6cfc7e335d0b1ae0fce0f8c5720", - "tests/digest_tests.rs": "b3779136bbc022422f46f997fff420adacc670f8ed3092fb703feae376cd0219", + "tests/aead_tests.rs": "17d75e8cb2570795f18cf8db0dad394790d78b0292bfeeda055dce107d125e04", + "tests/agreement_tests.rs": "e89561ac54e0aee01a9168cf9cef2e5a0ad9165daabb29c3c686be57ac6d55fd", + "tests/constant_time_tests.rs": "38715ef4e19fb9e4c36f47c18828ba6d3686ea977bcc34bbd9bafed22d6a4515", + "tests/digest_tests.rs": "bb25cfb99247a166bc7d6ed700608b7a86fa1dbc562b655e01809ad0759dfcdc", "tests/ecdsa_test_private_key_p256.p8": "d56f99994233d749d03315f5cb9797fad81d3e25f962d2cd543d4dfe7cdd1389", "tests/ecdsa_test_public_key_p256.der": "93c930878dc29d802b151bf492a2f00672b2240b740002a650ccb706664d10c9", "tests/ecdsa_test_public_key_p256_debug.txt": "ccce94ab37a5e5286f0e5f1934bdeb39539e8f72bc7ccd0a1f666c9a1abc0bdb", @@ -281,19 +279,19 @@ "tests/ed25519_test_private_key.p8": "8a5217b181c3096224275c3fedcfc938e54aee073114314cbc1a9cedfacce3b8", "tests/ed25519_test_public_key.bin": "21fe31dfa154a261626bf854046fd2271b7bed4b6abe45aa58877ef47f9721b9", "tests/ed25519_test_public_key.der": "119e5ed7b8533bdf24897f07fe4dd57671a64f8d10534ba128c9bb016af86484", - "tests/ed25519_tests.rs": "32622f208ead062ef16fd72b2187875b6470ef3908663d115fe377ca015e658d", + "tests/ed25519_tests.rs": "1ee03d4a0dc27ab3094abc2754287f774efadd04a1275603e252fe731fe3d362", "tests/error_tests.rs": "059683579f639039d9d386839b48afa0d547ce000c324b1acb3cc88116f5275e", - "tests/hkdf_tests.rs": "9f475baaf46d941c72f6fb82644fb40bae2d428c656f566db74c9568f7e19ff9", - "tests/hmac_tests.rs": "74a557804e14b60198e60c22606838f60703c75b93ba38f30aead703a30c6e09", - "tests/pbkdf2_tests.rs": "d58ae408635e748d5ff295adf2a5d7b80c2cd37efa6dd018d3c5898aa8be09d6", + "tests/hkdf_tests.rs": "d0853ba06a0e4f07355444e15556ed5815ddd5d8cecc6185dc50794be6724ac8", + "tests/hmac_tests.rs": "ae1da517934b5165244bfc1647e0c9e4b57741da057e372f3466f91a7185156d", + "tests/pbkdf2_tests.rs": "9a8780ecf3bd973d7ab06a9176be7bbbd397bc6e2eea283bcc31aa6061566d57", "tests/quic_tests.rs": "6b5285ba4bd0347b74ee74a77324ec019cc3c0d5d7ea118be0933b5719d0ccf8", - "tests/rand_tests.rs": "0215dd836070d764b1fa834a2c08f1cdbab58f50fb5d399070de401c5146f391", + "tests/rand_tests.rs": "82599b5bf1c3d532e678de571f5fad9daf4d22ce19517d95dc26d298bb0acc8f", "tests/rsa_test_private_key_2048.p8": "a0d95a0b133b4c217bc11322b67d62eb13537b8a9f66e20b5c9b5ac31af21859", "tests/rsa_test_public_key_2048.der": "7180acb59312d3544c3b36975ae6c4c55f59035ce4de487852cf6c99b33868cd", "tests/rsa_test_public_key_2048_debug.txt": "dc471e4ca8c1ef4b57d2ce79c9b9ba25ab9e262ed63a24d2b65cb2d2f3797ffd", "tests/rsa_test_public_modulus.bin": "a564c096055103ddd882641e3cb22c849b202a8a1bd646001451bb52b9ec7fd3", - "tests/rsa_tests.rs": "3bef8c0f07f038e4a29a19166b00c4fb9b52275f63c2ebf301b4ac04f08f2b27", - "tests/signature_tests.rs": "872a0f2ff8eb440fdf64bdec4bdea7d604ccac321e69ab5203060e5f1baca28e", + "tests/rsa_tests.rs": "9b650e58490c9d4930d34d763c826ea67c9b8e26ec6ae76fdb464be8a1d105f6", + "tests/signature_tests.rs": "abaedc4cbba1b08b5d093037d43d069bebf10df02c6905104f9686f86de84c9f", "third_party/NIST/SHAVS/SHA1LongMsg.rsp": "c765dbc1609e9046b12f60a5285a88128dab4315080c94ce9f2a57a7b0b980be", "third_party/NIST/SHAVS/SHA1Monte.rsp": "d458fa7e39095b4e292a75b0cd224f90b72dc801a63ad2c0d75b8f10d745ab6d", "third_party/NIST/SHAVS/SHA1ShortMsg.rsp": "be0991ddc5372932d55804b11713c9140d10435ef4b316a0773e3506eec79cda", @@ -320,5 +318,5 @@ "third_party/fiat/p256_64.h": "c5f54bc513da6de13cfec3334ed095786a46ca25352a5e038437095157c4aa03", "third_party/fiat/p256_64_msvc.h": "5a36a2b959c2b68ac7f197f472bee55d58f7ec58dda6c226f565d6bd721dbeda" }, - "package": "fb0205304757e5d899b9c2e448b867ffd03ae7f988002e47cd24954391394d0b" + "package": "9babe80d5c16becf6594aa32ad2be8fe08498e7ae60b77de8df700e67f191d7e" } diff -Nru temporalio-1.3.0/vendor/ring/Cargo.toml temporalio-1.3.0/vendor/ring/Cargo.toml --- temporalio-1.3.0/vendor/ring/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -13,10 +13,10 @@ edition = "2021" rust-version = "1.61.0" name = "ring" -version = "0.17.5" +version = "0.17.3" authors = ["Brian Smith "] build = "build.rs" -links = "ring_core_0_17_5" +links = "ring_core_0_17_3" include = [ "LICENSE", "Cargo.toml", @@ -191,13 +191,13 @@ name = "ring" [dependencies.getrandom] -version = "0.2.10" +version = "0.2.8" [dependencies.untrusted] version = "0.9" [build-dependencies.cc] -version = "1.0.83" +version = "1.0.69" default-features = false [features] @@ -221,19 +221,19 @@ "Win32_System_Threading", ] -[target."cfg(all(target_arch = \"wasm32\", target_os = \"unknown\"))".dev-dependencies.wasm-bindgen-test] -version = "0.3.37" -default-features = false - [target."cfg(any(target_arch = \"x86\",target_arch = \"x86_64\", all(any(target_arch = \"aarch64\", target_arch = \"arm\"), any(target_os = \"android\", target_os = \"fuchsia\", target_os = \"linux\", target_os = \"windows\"))))".dependencies.spin] -version = "0.9.8" +version = "0.9.2" features = ["once"] default-features = false [target."cfg(any(target_os = \"android\", target_os = \"linux\"))".dependencies.libc] -version = "0.2.148" +version = "0.2.100" +default-features = false + +[target."cfg(any(unix, windows))".dev-dependencies.libc] +version = "0.2.100" default-features = false -[target."cfg(any(unix, windows, target_os = \"wasi\"))".dev-dependencies.libc] -version = "0.2.148" +[target."cfg(target_arch = \"wasm32\")".dev-dependencies.wasm-bindgen-test] +version = "0.3.26" default-features = false diff -Nru temporalio-1.3.0/vendor/ring/crypto/curve25519/curve25519.c temporalio-1.3.0/vendor/ring/crypto/curve25519/curve25519.c --- temporalio-1.3.0/vendor/ring/crypto/curve25519/curve25519.c 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring/crypto/curve25519/curve25519.c 2023-10-30 19:40:00.000000000 +0000 @@ -240,11 +240,9 @@ fe_mul_impl(h->v, f->v, g->v); } -#if defined(OPENSSL_SMALL) -static void fe_mul_llt(fe_loose *h, const fe_loose *f, const fe *g) { - fe_mul_impl(h->v, f->v, g->v); -} -#endif +// static void fe_mul_llt(fe_loose *h, const fe_loose *f, const fe *g) was +// removed. This comment is here to make diffs vs. BoringSSL easier to read. + static void fe_mul_ttt(fe *h, const fe *f, const fe *g) { fe_mul_impl(h->v, f->v, g->v); diff -Nru temporalio-1.3.0/vendor/ring/crypto/fipsmodule/ec/ecp_nistz384.inl temporalio-1.3.0/vendor/ring/crypto/fipsmodule/ec/ecp_nistz384.inl --- temporalio-1.3.0/vendor/ring/crypto/fipsmodule/ec/ecp_nistz384.inl 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring/crypto/fipsmodule/ec/ecp_nistz384.inl 2023-10-30 19:40:00.000000000 +0000 @@ -29,7 +29,7 @@ #endif /* Point double: r = 2*a */ -static void nistz384_point_double(P384_POINT *r, const P384_POINT *a) { +void nistz384_point_double(P384_POINT *r, const P384_POINT *a) { BN_ULONG S[P384_LIMBS]; BN_ULONG M[P384_LIMBS]; BN_ULONG Zsqr[P384_LIMBS]; @@ -74,8 +74,8 @@ } /* Point addition: r = a+b */ -static void nistz384_point_add(P384_POINT *r, const P384_POINT *a, - const P384_POINT *b) { +void nistz384_point_add(P384_POINT *r, const P384_POINT *a, + const P384_POINT *b) { BN_ULONG U2[P384_LIMBS], S2[P384_LIMBS]; BN_ULONG U1[P384_LIMBS], S1[P384_LIMBS]; BN_ULONG Z1sqr[P384_LIMBS]; @@ -174,10 +174,9 @@ } /* r = p * p_scalar */ -static void nistz384_point_mul(P384_POINT *r, - const BN_ULONG p_scalar[P384_LIMBS], - const Limb p_x[P384_LIMBS], - const Limb p_y[P384_LIMBS]) { +void nistz384_point_mul(P384_POINT *r, const BN_ULONG p_scalar[P384_LIMBS], + const BN_ULONG p_x[P384_LIMBS], + const BN_ULONG p_y[P384_LIMBS]) { static const size_t kWindowSize = 5; static const crypto_word_t kMask = (1 << (5 /* kWindowSize */ + 1)) - 1; @@ -253,48 +252,6 @@ add_precomputed_w5(r, wvalue, table); } -void p384_point_double(Limb r[3][P384_LIMBS], const Limb a[3][P384_LIMBS]) -{ - P384_POINT t; - limbs_copy(t.X, a[0], P384_LIMBS); - limbs_copy(t.Y, a[1], P384_LIMBS); - limbs_copy(t.Z, a[2], P384_LIMBS); - nistz384_point_double(&t, &t); - limbs_copy(r[0], t.X, P384_LIMBS); - limbs_copy(r[1], t.Y, P384_LIMBS); - limbs_copy(r[2], t.Z, P384_LIMBS); -} - -void p384_point_add(Limb r[3][P384_LIMBS], - const Limb a[3][P384_LIMBS], - const Limb b[3][P384_LIMBS]) -{ - P384_POINT t1; - limbs_copy(t1.X, a[0], P384_LIMBS); - limbs_copy(t1.Y, a[1], P384_LIMBS); - limbs_copy(t1.Z, a[2], P384_LIMBS); - - P384_POINT t2; - limbs_copy(t2.X, b[0], P384_LIMBS); - limbs_copy(t2.Y, b[1], P384_LIMBS); - limbs_copy(t2.Z, b[2], P384_LIMBS); - - nistz384_point_add(&t1, &t1, &t2); - - limbs_copy(r[0], t1.X, P384_LIMBS); - limbs_copy(r[1], t1.Y, P384_LIMBS); - limbs_copy(r[2], t1.Z, P384_LIMBS); -} - -void p384_point_mul(Limb r[3][P384_LIMBS], const BN_ULONG p_scalar[P384_LIMBS], - const Limb p_x[P384_LIMBS], const Limb p_y[P384_LIMBS]) { - alignas(64) P384_POINT acc; - nistz384_point_mul(&acc, p_scalar, p_x, p_y); - limbs_copy(r[0], acc.X, P384_LIMBS); - limbs_copy(r[1], acc.Y, P384_LIMBS); - limbs_copy(r[2], acc.Z, P384_LIMBS); -} - #if defined(__GNUC__) || defined(__clang__) #pragma GCC diagnostic pop #endif diff -Nru temporalio-1.3.0/vendor/ring/crypto/fipsmodule/ec/p256.c temporalio-1.3.0/vendor/ring/crypto/fipsmodule/ec/p256.c --- temporalio-1.3.0/vendor/ring/crypto/fipsmodule/ec/p256.c 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring/crypto/fipsmodule/ec/p256.c 2023-10-30 19:40:00.000000000 +0000 @@ -96,21 +96,6 @@ fiat_p256_selectznz(out, !!t, z, nz); } -static void fiat_p256_from_words(fiat_p256_felem out, - const Limb in[32 / sizeof(BN_ULONG)]) { - // Typically, |BN_ULONG| and |fiat_p256_limb_t| will be the same type, but on - // 64-bit platforms without |uint128_t|, they are different. However, on - // little-endian systems, |uint64_t[4]| and |uint32_t[8]| have the same - // layout. - OPENSSL_memcpy(out, in, 32); -} - -static void fiat_p256_to_words(Limb out[32 / sizeof(BN_ULONG)], const fiat_p256_felem in) { - // See |fiat_p256_from_words|. - OPENSSL_memcpy(out, in, 32); -} - - // Group operations // ---------------- // @@ -354,8 +339,8 @@ #endif } -void p256_point_mul(Limb r[3][P256_LIMBS], const Limb scalar[P256_LIMBS], - const Limb p_x[P256_LIMBS], const Limb p_y[P256_LIMBS]) { +void p256_point_mul(P256_POINT *r, const Limb scalar[P256_LIMBS], + const Limb p_x[P256_LIMBS], const Limb p_y[P256_LIMBS]) { debug_assert_nonsecret(r != NULL); debug_assert_nonsecret(scalar != NULL); debug_assert_nonsecret(p_x != NULL); @@ -364,9 +349,9 @@ fiat_p256_felem p_pre_comp[17][3]; OPENSSL_memset(&p_pre_comp, 0, sizeof(p_pre_comp)); // Precompute multiples. - fiat_p256_from_words(p_pre_comp[1][0], p_x); - fiat_p256_from_words(p_pre_comp[1][1], p_y); - fiat_p256_copy(p_pre_comp[1][2], fiat_p256_one); + limbs_copy(&p_pre_comp[1][0][0], p_x, P256_LIMBS); + limbs_copy(&p_pre_comp[1][1][0], p_y, P256_LIMBS); + limbs_copy(&p_pre_comp[1][2][0], fiat_p256_one, P256_LIMBS); for (size_t j = 2; j <= 16; ++j) { if (j & 1) { @@ -422,12 +407,12 @@ } } - fiat_p256_to_words(r[0], nq[0]); - fiat_p256_to_words(r[1], nq[1]); - fiat_p256_to_words(r[2], nq[2]); + limbs_copy(r->X, nq[0], P256_LIMBS); + limbs_copy(r->Y, nq[1], P256_LIMBS); + limbs_copy(r->Z, nq[2], P256_LIMBS); } -void p256_point_mul_base(Limb r[3][P256_LIMBS], const Limb scalar[P256_LIMBS]) { +void p256_point_mul_base(P256_POINT *r, const Limb scalar[P256_LIMBS]) { // Set nq to the point at infinity. fiat_p256_felem nq[3] = {{0}, {0}, {0}}, tmp[3]; @@ -468,72 +453,45 @@ tmp[0], tmp[1], tmp[2]); } - fiat_p256_to_words(r[0], nq[0]); - fiat_p256_to_words(r[1], nq[1]); - fiat_p256_to_words(r[2], nq[2]); + limbs_copy(r->X, nq[0], P256_LIMBS); + limbs_copy(r->Y, nq[1], P256_LIMBS); + limbs_copy(r->Z, nq[2], P256_LIMBS); } void p256_mul_mont(Limb r[P256_LIMBS], const Limb a[P256_LIMBS], - const Limb b[P256_LIMBS]) { - fiat_p256_felem a_, b_; - fiat_p256_from_words(a_, a); - fiat_p256_from_words(b_, b); - fiat_p256_mul(a_, a_, b_); - fiat_p256_to_words(r, a_); + const Limb b[P256_LIMBS]) { + fiat_p256_mul(r, a, b); } void p256_sqr_mont(Limb r[P256_LIMBS], const Limb a[P256_LIMBS]) { - fiat_p256_felem x; - fiat_p256_from_words(x, a); - fiat_p256_square(x, x); - fiat_p256_to_words(r, x); -} - -void p256_point_add(Limb r[3][P256_LIMBS], const Limb a[3][P256_LIMBS], - const Limb b[3][P256_LIMBS]) { - fiat_p256_felem x1, y1, z1, x2, y2, z2; - fiat_p256_from_words(x1, a[0]); - fiat_p256_from_words(y1, a[1]); - fiat_p256_from_words(z1, a[2]); - fiat_p256_from_words(x2, b[0]); - fiat_p256_from_words(y2, b[1]); - fiat_p256_from_words(z2, b[2]); - fiat_p256_point_add(x1, y1, z1, x1, y1, z1, 0 /* both Jacobian */, x2, y2, - z2); - fiat_p256_to_words(r[0], x1); - fiat_p256_to_words(r[1], y1); - fiat_p256_to_words(r[2], z1); -} - -void p256_point_double(Limb r[3][P256_LIMBS], const Limb a[3][P256_LIMBS]) { - fiat_p256_felem x, y, z; - fiat_p256_from_words(x, a[0]); - fiat_p256_from_words(y, a[1]); - fiat_p256_from_words(z, a[2]); - fiat_p256_point_double(x, y, z, x, y, z); - fiat_p256_to_words(r[0], x); - fiat_p256_to_words(r[1], y); - fiat_p256_to_words(r[2], z); + fiat_p256_square(r, a); +} + +void p256_point_add(P256_POINT *r, const P256_POINT *a, const P256_POINT *b) { + fiat_p256_point_add(r->X, r->Y, r->Z, + a->X, a->Y, a->Z, + 0, + b->X, b->Y, b->Z); +} + +void p256_point_double(P256_POINT *r, const P256_POINT *a) { + fiat_p256_point_double(r->X, r->Y, r->Z, + a->X, a->Y, a->Z); } // For testing only. -void p256_point_add_affine(Limb r[3][P256_LIMBS], const Limb a[3][P256_LIMBS], - const Limb b[2][P256_LIMBS]) { - fiat_p256_felem x1, y1, z1, x2, y2; - fiat_p256_from_words(x1, a[0]); - fiat_p256_from_words(y1, a[1]); - fiat_p256_from_words(z1, a[2]); - fiat_p256_from_words(x2, b[0]); - fiat_p256_from_words(y2, b[1]); - - fiat_p256_felem z2 = {0}; - fiat_p256_cmovznz(z2, fiat_p256_nz(x2) & fiat_p256_nz(y2), z2, fiat_p256_one); - - fiat_p256_point_add(x1, y1, z1, x1, y1, z1, 1 /* mixed */, x2, y2, z2); - - fiat_p256_to_words(r[0], x1); - fiat_p256_to_words(r[1], y1); - fiat_p256_to_words(r[2], z1); +void p256_point_add_affine(P256_POINT *r, const P256_POINT *a, + const BN_ULONG b[P256_LIMBS * 2]) { + const Limb *b_x = &b[0]; + const Limb *b_y = &b[P256_LIMBS]; + fiat_p256_felem b_z = {0}; + crypto_word_t b_is_inf = constant_time_select_w( + LIMBS_are_zero(b_x, P256_LIMBS), LIMBS_are_zero(b_y, P256_LIMBS), 0); + fiat_p256_cmovznz(b_z, constant_time_is_zero_w(b_is_inf), b_z, fiat_p256_one); + fiat_p256_point_add(r->X, r->Y, r->Z, + a->X, a->Y, a->Z, + 1, + b_x, b_y, b_z); } #endif diff -Nru temporalio-1.3.0/vendor/ring/crypto/fipsmodule/ec/p256-nistz.c temporalio-1.3.0/vendor/ring/crypto/fipsmodule/ec/p256-nistz.c --- temporalio-1.3.0/vendor/ring/crypto/fipsmodule/ec/p256-nistz.c 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring/crypto/fipsmodule/ec/p256-nistz.c 2023-10-30 19:40:00.000000000 +0000 @@ -232,18 +232,18 @@ return booth_recode_w7(wvalue); } -void p256_point_mul(Limb r[3][P256_LIMBS], const Limb p_scalar[P256_LIMBS], +void p256_point_mul(P256_POINT *r, const Limb p_scalar[P256_LIMBS], const Limb p_x[P256_LIMBS], const Limb p_y[P256_LIMBS]) { alignas(32) P256_POINT out; ecp_nistz256_windowed_mul(&out, p_scalar, p_x, p_y); - limbs_copy(r[0], out.X, P256_LIMBS); - limbs_copy(r[1], out.Y, P256_LIMBS); - limbs_copy(r[2], out.Z, P256_LIMBS); + limbs_copy(r->X, out.X, P256_LIMBS); + limbs_copy(r->Y, out.Y, P256_LIMBS); + limbs_copy(r->Z, out.Z, P256_LIMBS); } -void p256_point_mul_base(Limb r[3][P256_LIMBS], const Limb scalar[P256_LIMBS]) { +void p256_point_mul_base(P256_POINT *r, const Limb scalar[P256_LIMBS]) { P256_SCALAR_BYTES p_str; p256_scalar_bytes_from_limbs(p_str, scalar); @@ -279,64 +279,9 @@ ecp_nistz256_point_add_affine(&p, &p, &t); } - limbs_copy(r[0], p.X, P256_LIMBS); - limbs_copy(r[1], p.Y, P256_LIMBS); - limbs_copy(r[2], p.Z, P256_LIMBS); -} - -void p256_point_mul_base_vartime(Limb r[3][P256_LIMBS], - const Limb g_scalar[P256_LIMBS]) { - alignas(32) P256_POINT p; - uint8_t p_str[33]; - OPENSSL_memcpy(p_str, g_scalar, 32); - p_str[32] = 0; - - // First window - size_t index = 0; - size_t wvalue = calc_first_wvalue(&index, p_str); - - // Convert |p| from affine to Jacobian coordinates. We set Z to zero if |p| - // is infinity and |ONE| otherwise. |p| was computed from the table, so it - // is infinity iff |wvalue >> 1| is zero. - if ((wvalue >> 1) != 0) { - OPENSSL_memcpy(p.X, &ecp_nistz256_precomputed[0][(wvalue >> 1) - 1].X, - sizeof(p.X)); - OPENSSL_memcpy(p.Y, &ecp_nistz256_precomputed[0][(wvalue >> 1) - 1].Y, - sizeof(p.Y)); - OPENSSL_memcpy(p.Z, ONE, sizeof(p.Z)); - } else { - OPENSSL_memset(p.X, 0, sizeof(p.X)); - OPENSSL_memset(p.Y, 0, sizeof(p.Y)); - OPENSSL_memset(p.Z, 0, sizeof(p.Z)); - } - - if ((wvalue & 1) == 1) { - ecp_nistz256_neg(p.Y, p.Y); - } - - for (int i = 1; i < 37; i++) { - wvalue = calc_wvalue(&index, p_str); - if ((wvalue >> 1) == 0) { - continue; - } - - alignas(32) P256_POINT_AFFINE t; - OPENSSL_memcpy(&t, &ecp_nistz256_precomputed[i][(wvalue >> 1) - 1], - sizeof(t)); - if ((wvalue & 1) == 1) { - ecp_nistz256_neg(t.Y, t.Y); - } - - // Note |ecp_nistz256_point_add_affine| does not work if |p| and |t| are - // the same non-infinity point, so it is important that we compute the - // |g_scalar| term before the |p_scalar| term. - ecp_nistz256_point_add_affine(&p, &p, &t); - } - - - limbs_copy(r[0], p.X, P256_LIMBS); - limbs_copy(r[1], p.Y, P256_LIMBS); - limbs_copy(r[2], p.Z, P256_LIMBS); + limbs_copy(r->X, p.X, P256_LIMBS); + limbs_copy(r->Y, p.Y, P256_LIMBS); + limbs_copy(r->Z, p.Z, P256_LIMBS); } #endif /* defined(OPENSSL_USE_NISTZ256) */ diff -Nru temporalio-1.3.0/vendor/ring/include/ring-core/target.h temporalio-1.3.0/vendor/ring/include/ring-core/target.h --- temporalio-1.3.0/vendor/ring/include/ring-core/target.h 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring/include/ring-core/target.h 2023-10-30 19:40:00.000000000 +0000 @@ -152,8 +152,4 @@ #endif #endif // OPENSSL_ASM_INCOMPATIBLE -#if !defined(OPENSSL_X86_64) && !defined(OPENSSL_AARCH64) -#define OPENSSL_SMALL -#endif - #endif // OPENSSL_HEADER_TARGET_H diff -Nru temporalio-1.3.0/vendor/ring/pregenerated/tmp/ring_core_generated/prefix_symbols_asm.h temporalio-1.3.0/vendor/ring/pregenerated/tmp/ring_core_generated/prefix_symbols_asm.h --- temporalio-1.3.0/vendor/ring/pregenerated/tmp/ring_core_generated/prefix_symbols_asm.h 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring/pregenerated/tmp/ring_core_generated/prefix_symbols_asm.h 2023-10-30 19:40:00.000000000 +0000 @@ -10,112 +10,111 @@ #define _ecp_nistz256_ord_sqr_mont _p256_scalar_sqr_rep_mont #define _ecp_nistz256_mul_mont _p256_mul_mont #define _ecp_nistz256_sqr_mont _p256_sqr_mont -#define _CRYPTO_memcmp _ring_core_0_17_5_CRYPTO_memcmp -#define _CRYPTO_poly1305_finish _ring_core_0_17_5_CRYPTO_poly1305_finish -#define _CRYPTO_poly1305_finish_neon _ring_core_0_17_5_CRYPTO_poly1305_finish_neon -#define _CRYPTO_poly1305_init _ring_core_0_17_5_CRYPTO_poly1305_init -#define _CRYPTO_poly1305_init_neon _ring_core_0_17_5_CRYPTO_poly1305_init_neon -#define _CRYPTO_poly1305_update _ring_core_0_17_5_CRYPTO_poly1305_update -#define _CRYPTO_poly1305_update_neon _ring_core_0_17_5_CRYPTO_poly1305_update_neon -#define _ChaCha20_ctr32 _ring_core_0_17_5_ChaCha20_ctr32 -#define _LIMBS_add_mod _ring_core_0_17_5_LIMBS_add_mod -#define _LIMBS_are_even _ring_core_0_17_5_LIMBS_are_even -#define _LIMBS_are_zero _ring_core_0_17_5_LIMBS_are_zero -#define _LIMBS_equal _ring_core_0_17_5_LIMBS_equal -#define _LIMBS_equal_limb _ring_core_0_17_5_LIMBS_equal_limb -#define _LIMBS_less_than _ring_core_0_17_5_LIMBS_less_than -#define _LIMBS_less_than_limb _ring_core_0_17_5_LIMBS_less_than_limb -#define _LIMBS_reduce_once _ring_core_0_17_5_LIMBS_reduce_once -#define _LIMBS_select_512_32 _ring_core_0_17_5_LIMBS_select_512_32 -#define _LIMBS_shl_mod _ring_core_0_17_5_LIMBS_shl_mod -#define _LIMBS_sub_mod _ring_core_0_17_5_LIMBS_sub_mod -#define _LIMBS_window5_split_window _ring_core_0_17_5_LIMBS_window5_split_window -#define _LIMBS_window5_unsplit_window _ring_core_0_17_5_LIMBS_window5_unsplit_window -#define _LIMB_shr _ring_core_0_17_5_LIMB_shr -#define _OPENSSL_armcap_P _ring_core_0_17_5_OPENSSL_armcap_P -#define _OPENSSL_cpuid_setup _ring_core_0_17_5_OPENSSL_cpuid_setup -#define _OPENSSL_ia32cap_P _ring_core_0_17_5_OPENSSL_ia32cap_P -#define _aes_hw_ctr32_encrypt_blocks _ring_core_0_17_5_aes_hw_ctr32_encrypt_blocks -#define _aes_hw_encrypt _ring_core_0_17_5_aes_hw_encrypt -#define _aes_hw_set_encrypt_key _ring_core_0_17_5_aes_hw_set_encrypt_key -#define _aes_nohw_ctr32_encrypt_blocks _ring_core_0_17_5_aes_nohw_ctr32_encrypt_blocks -#define _aes_nohw_encrypt _ring_core_0_17_5_aes_nohw_encrypt -#define _aes_nohw_set_encrypt_key _ring_core_0_17_5_aes_nohw_set_encrypt_key -#define _aesni_gcm_decrypt _ring_core_0_17_5_aesni_gcm_decrypt -#define _aesni_gcm_encrypt _ring_core_0_17_5_aesni_gcm_encrypt -#define _bn_from_montgomery_in_place _ring_core_0_17_5_bn_from_montgomery_in_place -#define _bn_gather5 _ring_core_0_17_5_bn_gather5 -#define _bn_mul_mont _ring_core_0_17_5_bn_mul_mont -#define _bn_mul_mont_gather5 _ring_core_0_17_5_bn_mul_mont_gather5 -#define _bn_neg_inv_mod_r_u64 _ring_core_0_17_5_bn_neg_inv_mod_r_u64 -#define _bn_power5 _ring_core_0_17_5_bn_power5 -#define _bn_scatter5 _ring_core_0_17_5_bn_scatter5 -#define _bn_sqr8x_internal _ring_core_0_17_5_bn_sqr8x_internal -#define _bn_sqrx8x_internal _ring_core_0_17_5_bn_sqrx8x_internal -#define _bsaes_ctr32_encrypt_blocks _ring_core_0_17_5_bsaes_ctr32_encrypt_blocks -#define _bssl_constant_time_test_conditional_memcpy _ring_core_0_17_5_bssl_constant_time_test_conditional_memcpy -#define _bssl_constant_time_test_conditional_memxor _ring_core_0_17_5_bssl_constant_time_test_conditional_memxor -#define _bssl_constant_time_test_main _ring_core_0_17_5_bssl_constant_time_test_main -#define _chacha20_poly1305_open _ring_core_0_17_5_chacha20_poly1305_open -#define _chacha20_poly1305_seal _ring_core_0_17_5_chacha20_poly1305_seal -#define _fiat_curve25519_adx_mul _ring_core_0_17_5_fiat_curve25519_adx_mul -#define _fiat_curve25519_adx_square _ring_core_0_17_5_fiat_curve25519_adx_square -#define _gcm_ghash_avx _ring_core_0_17_5_gcm_ghash_avx -#define _gcm_ghash_clmul _ring_core_0_17_5_gcm_ghash_clmul -#define _gcm_ghash_neon _ring_core_0_17_5_gcm_ghash_neon -#define _gcm_gmult_clmul _ring_core_0_17_5_gcm_gmult_clmul -#define _gcm_gmult_neon _ring_core_0_17_5_gcm_gmult_neon -#define _gcm_init_avx _ring_core_0_17_5_gcm_init_avx -#define _gcm_init_clmul _ring_core_0_17_5_gcm_init_clmul -#define _gcm_init_neon _ring_core_0_17_5_gcm_init_neon -#define _k25519Precomp _ring_core_0_17_5_k25519Precomp -#define _limbs_mul_add_limb _ring_core_0_17_5_limbs_mul_add_limb -#define _little_endian_bytes_from_scalar _ring_core_0_17_5_little_endian_bytes_from_scalar -#define _ecp_nistz256_neg _ring_core_0_17_5_ecp_nistz256_neg -#define _ecp_nistz256_select_w5 _ring_core_0_17_5_ecp_nistz256_select_w5 -#define _ecp_nistz256_select_w7 _ring_core_0_17_5_ecp_nistz256_select_w7 -#define _p256_mul_mont _ring_core_0_17_5_p256_mul_mont -#define _p256_point_add _ring_core_0_17_5_p256_point_add -#define _p256_point_add_affine _ring_core_0_17_5_p256_point_add_affine -#define _p256_point_double _ring_core_0_17_5_p256_point_double -#define _p256_point_mul _ring_core_0_17_5_p256_point_mul -#define _p256_point_mul_base _ring_core_0_17_5_p256_point_mul_base -#define _p256_point_mul_base_vartime _ring_core_0_17_5_p256_point_mul_base_vartime -#define _p256_scalar_mul_mont _ring_core_0_17_5_p256_scalar_mul_mont -#define _p256_scalar_sqr_rep_mont _ring_core_0_17_5_p256_scalar_sqr_rep_mont -#define _p256_sqr_mont _ring_core_0_17_5_p256_sqr_mont -#define _p384_elem_div_by_2 _ring_core_0_17_5_p384_elem_div_by_2 -#define _p384_elem_mul_mont _ring_core_0_17_5_p384_elem_mul_mont -#define _p384_elem_neg _ring_core_0_17_5_p384_elem_neg -#define _p384_elem_sub _ring_core_0_17_5_p384_elem_sub -#define _p384_point_add _ring_core_0_17_5_p384_point_add -#define _p384_point_double _ring_core_0_17_5_p384_point_double -#define _p384_point_mul _ring_core_0_17_5_p384_point_mul -#define _p384_scalar_mul_mont _ring_core_0_17_5_p384_scalar_mul_mont -#define _openssl_poly1305_neon2_addmulmod _ring_core_0_17_5_openssl_poly1305_neon2_addmulmod -#define _openssl_poly1305_neon2_blocks _ring_core_0_17_5_openssl_poly1305_neon2_blocks -#define _sha256_block_data_order _ring_core_0_17_5_sha256_block_data_order -#define _sha512_block_data_order _ring_core_0_17_5_sha512_block_data_order -#define _vpaes_ctr32_encrypt_blocks _ring_core_0_17_5_vpaes_ctr32_encrypt_blocks -#define _vpaes_encrypt _ring_core_0_17_5_vpaes_encrypt -#define _vpaes_encrypt_key_to_bsaes _ring_core_0_17_5_vpaes_encrypt_key_to_bsaes -#define _vpaes_set_encrypt_key _ring_core_0_17_5_vpaes_set_encrypt_key -#define _x25519_NEON _ring_core_0_17_5_x25519_NEON -#define _x25519_fe_invert _ring_core_0_17_5_x25519_fe_invert -#define _x25519_fe_isnegative _ring_core_0_17_5_x25519_fe_isnegative -#define _x25519_fe_mul_ttt _ring_core_0_17_5_x25519_fe_mul_ttt -#define _x25519_fe_neg _ring_core_0_17_5_x25519_fe_neg -#define _x25519_fe_tobytes _ring_core_0_17_5_x25519_fe_tobytes -#define _x25519_ge_double_scalarmult_vartime _ring_core_0_17_5_x25519_ge_double_scalarmult_vartime -#define _x25519_ge_frombytes_vartime _ring_core_0_17_5_x25519_ge_frombytes_vartime -#define _x25519_ge_scalarmult_base _ring_core_0_17_5_x25519_ge_scalarmult_base -#define _x25519_ge_scalarmult_base_adx _ring_core_0_17_5_x25519_ge_scalarmult_base_adx -#define _x25519_public_from_private_generic_masked _ring_core_0_17_5_x25519_public_from_private_generic_masked -#define _x25519_sc_mask _ring_core_0_17_5_x25519_sc_mask -#define _x25519_sc_muladd _ring_core_0_17_5_x25519_sc_muladd -#define _x25519_sc_reduce _ring_core_0_17_5_x25519_sc_reduce -#define _x25519_scalar_mult_adx _ring_core_0_17_5_x25519_scalar_mult_adx -#define _x25519_scalar_mult_generic_masked _ring_core_0_17_5_x25519_scalar_mult_generic_masked +#define _CRYPTO_memcmp _ring_core_0_17_3_CRYPTO_memcmp +#define _CRYPTO_poly1305_finish _ring_core_0_17_3_CRYPTO_poly1305_finish +#define _CRYPTO_poly1305_finish_neon _ring_core_0_17_3_CRYPTO_poly1305_finish_neon +#define _CRYPTO_poly1305_init _ring_core_0_17_3_CRYPTO_poly1305_init +#define _CRYPTO_poly1305_init_neon _ring_core_0_17_3_CRYPTO_poly1305_init_neon +#define _CRYPTO_poly1305_update _ring_core_0_17_3_CRYPTO_poly1305_update +#define _CRYPTO_poly1305_update_neon _ring_core_0_17_3_CRYPTO_poly1305_update_neon +#define _ChaCha20_ctr32 _ring_core_0_17_3_ChaCha20_ctr32 +#define _LIMBS_add_mod _ring_core_0_17_3_LIMBS_add_mod +#define _LIMBS_are_even _ring_core_0_17_3_LIMBS_are_even +#define _LIMBS_are_zero _ring_core_0_17_3_LIMBS_are_zero +#define _LIMBS_equal _ring_core_0_17_3_LIMBS_equal +#define _LIMBS_equal_limb _ring_core_0_17_3_LIMBS_equal_limb +#define _LIMBS_less_than _ring_core_0_17_3_LIMBS_less_than +#define _LIMBS_less_than_limb _ring_core_0_17_3_LIMBS_less_than_limb +#define _LIMBS_reduce_once _ring_core_0_17_3_LIMBS_reduce_once +#define _LIMBS_select_512_32 _ring_core_0_17_3_LIMBS_select_512_32 +#define _LIMBS_shl_mod _ring_core_0_17_3_LIMBS_shl_mod +#define _LIMBS_sub_mod _ring_core_0_17_3_LIMBS_sub_mod +#define _LIMBS_window5_split_window _ring_core_0_17_3_LIMBS_window5_split_window +#define _LIMBS_window5_unsplit_window _ring_core_0_17_3_LIMBS_window5_unsplit_window +#define _LIMB_shr _ring_core_0_17_3_LIMB_shr +#define _OPENSSL_armcap_P _ring_core_0_17_3_OPENSSL_armcap_P +#define _OPENSSL_cpuid_setup _ring_core_0_17_3_OPENSSL_cpuid_setup +#define _OPENSSL_ia32cap_P _ring_core_0_17_3_OPENSSL_ia32cap_P +#define _aes_hw_ctr32_encrypt_blocks _ring_core_0_17_3_aes_hw_ctr32_encrypt_blocks +#define _aes_hw_encrypt _ring_core_0_17_3_aes_hw_encrypt +#define _aes_hw_set_encrypt_key _ring_core_0_17_3_aes_hw_set_encrypt_key +#define _aes_nohw_ctr32_encrypt_blocks _ring_core_0_17_3_aes_nohw_ctr32_encrypt_blocks +#define _aes_nohw_encrypt _ring_core_0_17_3_aes_nohw_encrypt +#define _aes_nohw_set_encrypt_key _ring_core_0_17_3_aes_nohw_set_encrypt_key +#define _aesni_gcm_decrypt _ring_core_0_17_3_aesni_gcm_decrypt +#define _aesni_gcm_encrypt _ring_core_0_17_3_aesni_gcm_encrypt +#define _bn_from_montgomery_in_place _ring_core_0_17_3_bn_from_montgomery_in_place +#define _bn_gather5 _ring_core_0_17_3_bn_gather5 +#define _bn_mul_mont _ring_core_0_17_3_bn_mul_mont +#define _bn_mul_mont_gather5 _ring_core_0_17_3_bn_mul_mont_gather5 +#define _bn_neg_inv_mod_r_u64 _ring_core_0_17_3_bn_neg_inv_mod_r_u64 +#define _bn_power5 _ring_core_0_17_3_bn_power5 +#define _bn_scatter5 _ring_core_0_17_3_bn_scatter5 +#define _bn_sqr8x_internal _ring_core_0_17_3_bn_sqr8x_internal +#define _bn_sqrx8x_internal _ring_core_0_17_3_bn_sqrx8x_internal +#define _bsaes_ctr32_encrypt_blocks _ring_core_0_17_3_bsaes_ctr32_encrypt_blocks +#define _bssl_constant_time_test_conditional_memcpy _ring_core_0_17_3_bssl_constant_time_test_conditional_memcpy +#define _bssl_constant_time_test_conditional_memxor _ring_core_0_17_3_bssl_constant_time_test_conditional_memxor +#define _bssl_constant_time_test_main _ring_core_0_17_3_bssl_constant_time_test_main +#define _chacha20_poly1305_open _ring_core_0_17_3_chacha20_poly1305_open +#define _chacha20_poly1305_seal _ring_core_0_17_3_chacha20_poly1305_seal +#define _fiat_curve25519_adx_mul _ring_core_0_17_3_fiat_curve25519_adx_mul +#define _fiat_curve25519_adx_square _ring_core_0_17_3_fiat_curve25519_adx_square +#define _gcm_ghash_avx _ring_core_0_17_3_gcm_ghash_avx +#define _gcm_ghash_clmul _ring_core_0_17_3_gcm_ghash_clmul +#define _gcm_ghash_neon _ring_core_0_17_3_gcm_ghash_neon +#define _gcm_gmult_clmul _ring_core_0_17_3_gcm_gmult_clmul +#define _gcm_gmult_neon _ring_core_0_17_3_gcm_gmult_neon +#define _gcm_init_avx _ring_core_0_17_3_gcm_init_avx +#define _gcm_init_clmul _ring_core_0_17_3_gcm_init_clmul +#define _gcm_init_neon _ring_core_0_17_3_gcm_init_neon +#define _k25519Precomp _ring_core_0_17_3_k25519Precomp +#define _limbs_mul_add_limb _ring_core_0_17_3_limbs_mul_add_limb +#define _little_endian_bytes_from_scalar _ring_core_0_17_3_little_endian_bytes_from_scalar +#define _ecp_nistz256_neg _ring_core_0_17_3_ecp_nistz256_neg +#define _ecp_nistz256_select_w5 _ring_core_0_17_3_ecp_nistz256_select_w5 +#define _ecp_nistz256_select_w7 _ring_core_0_17_3_ecp_nistz256_select_w7 +#define _nistz384_point_add _ring_core_0_17_3_nistz384_point_add +#define _nistz384_point_double _ring_core_0_17_3_nistz384_point_double +#define _nistz384_point_mul _ring_core_0_17_3_nistz384_point_mul +#define _p256_mul_mont _ring_core_0_17_3_p256_mul_mont +#define _p256_point_add _ring_core_0_17_3_p256_point_add +#define _p256_point_add_affine _ring_core_0_17_3_p256_point_add_affine +#define _p256_point_double _ring_core_0_17_3_p256_point_double +#define _p256_point_mul _ring_core_0_17_3_p256_point_mul +#define _p256_point_mul_base _ring_core_0_17_3_p256_point_mul_base +#define _p256_scalar_mul_mont _ring_core_0_17_3_p256_scalar_mul_mont +#define _p256_scalar_sqr_rep_mont _ring_core_0_17_3_p256_scalar_sqr_rep_mont +#define _p256_sqr_mont _ring_core_0_17_3_p256_sqr_mont +#define _p384_elem_div_by_2 _ring_core_0_17_3_p384_elem_div_by_2 +#define _p384_elem_mul_mont _ring_core_0_17_3_p384_elem_mul_mont +#define _p384_elem_neg _ring_core_0_17_3_p384_elem_neg +#define _p384_elem_sub _ring_core_0_17_3_p384_elem_sub +#define _p384_scalar_mul_mont _ring_core_0_17_3_p384_scalar_mul_mont +#define _openssl_poly1305_neon2_addmulmod _ring_core_0_17_3_openssl_poly1305_neon2_addmulmod +#define _openssl_poly1305_neon2_blocks _ring_core_0_17_3_openssl_poly1305_neon2_blocks +#define _sha256_block_data_order _ring_core_0_17_3_sha256_block_data_order +#define _sha512_block_data_order _ring_core_0_17_3_sha512_block_data_order +#define _vpaes_ctr32_encrypt_blocks _ring_core_0_17_3_vpaes_ctr32_encrypt_blocks +#define _vpaes_encrypt _ring_core_0_17_3_vpaes_encrypt +#define _vpaes_encrypt_key_to_bsaes _ring_core_0_17_3_vpaes_encrypt_key_to_bsaes +#define _vpaes_set_encrypt_key _ring_core_0_17_3_vpaes_set_encrypt_key +#define _x25519_NEON _ring_core_0_17_3_x25519_NEON +#define _x25519_fe_invert _ring_core_0_17_3_x25519_fe_invert +#define _x25519_fe_isnegative _ring_core_0_17_3_x25519_fe_isnegative +#define _x25519_fe_mul_ttt _ring_core_0_17_3_x25519_fe_mul_ttt +#define _x25519_fe_neg _ring_core_0_17_3_x25519_fe_neg +#define _x25519_fe_tobytes _ring_core_0_17_3_x25519_fe_tobytes +#define _x25519_ge_double_scalarmult_vartime _ring_core_0_17_3_x25519_ge_double_scalarmult_vartime +#define _x25519_ge_frombytes_vartime _ring_core_0_17_3_x25519_ge_frombytes_vartime +#define _x25519_ge_scalarmult_base _ring_core_0_17_3_x25519_ge_scalarmult_base +#define _x25519_ge_scalarmult_base_adx _ring_core_0_17_3_x25519_ge_scalarmult_base_adx +#define _x25519_public_from_private_generic_masked _ring_core_0_17_3_x25519_public_from_private_generic_masked +#define _x25519_sc_mask _ring_core_0_17_3_x25519_sc_mask +#define _x25519_sc_muladd _ring_core_0_17_3_x25519_sc_muladd +#define _x25519_sc_reduce _ring_core_0_17_3_x25519_sc_reduce +#define _x25519_scalar_mult_adx _ring_core_0_17_3_x25519_scalar_mult_adx +#define _x25519_scalar_mult_generic_masked _ring_core_0_17_3_x25519_scalar_mult_generic_masked #else #define ecp_nistz256_point_double p256_point_double @@ -125,112 +124,111 @@ #define ecp_nistz256_ord_sqr_mont p256_scalar_sqr_rep_mont #define ecp_nistz256_mul_mont p256_mul_mont #define ecp_nistz256_sqr_mont p256_sqr_mont -#define CRYPTO_memcmp ring_core_0_17_5_CRYPTO_memcmp -#define CRYPTO_poly1305_finish ring_core_0_17_5_CRYPTO_poly1305_finish -#define CRYPTO_poly1305_finish_neon ring_core_0_17_5_CRYPTO_poly1305_finish_neon -#define CRYPTO_poly1305_init ring_core_0_17_5_CRYPTO_poly1305_init -#define CRYPTO_poly1305_init_neon ring_core_0_17_5_CRYPTO_poly1305_init_neon -#define CRYPTO_poly1305_update ring_core_0_17_5_CRYPTO_poly1305_update -#define CRYPTO_poly1305_update_neon ring_core_0_17_5_CRYPTO_poly1305_update_neon -#define ChaCha20_ctr32 ring_core_0_17_5_ChaCha20_ctr32 -#define LIMBS_add_mod ring_core_0_17_5_LIMBS_add_mod -#define LIMBS_are_even ring_core_0_17_5_LIMBS_are_even -#define LIMBS_are_zero ring_core_0_17_5_LIMBS_are_zero -#define LIMBS_equal ring_core_0_17_5_LIMBS_equal -#define LIMBS_equal_limb ring_core_0_17_5_LIMBS_equal_limb -#define LIMBS_less_than ring_core_0_17_5_LIMBS_less_than -#define LIMBS_less_than_limb ring_core_0_17_5_LIMBS_less_than_limb -#define LIMBS_reduce_once ring_core_0_17_5_LIMBS_reduce_once -#define LIMBS_select_512_32 ring_core_0_17_5_LIMBS_select_512_32 -#define LIMBS_shl_mod ring_core_0_17_5_LIMBS_shl_mod -#define LIMBS_sub_mod ring_core_0_17_5_LIMBS_sub_mod -#define LIMBS_window5_split_window ring_core_0_17_5_LIMBS_window5_split_window -#define LIMBS_window5_unsplit_window ring_core_0_17_5_LIMBS_window5_unsplit_window -#define LIMB_shr ring_core_0_17_5_LIMB_shr -#define OPENSSL_armcap_P ring_core_0_17_5_OPENSSL_armcap_P -#define OPENSSL_cpuid_setup ring_core_0_17_5_OPENSSL_cpuid_setup -#define OPENSSL_ia32cap_P ring_core_0_17_5_OPENSSL_ia32cap_P -#define aes_hw_ctr32_encrypt_blocks ring_core_0_17_5_aes_hw_ctr32_encrypt_blocks -#define aes_hw_encrypt ring_core_0_17_5_aes_hw_encrypt -#define aes_hw_set_encrypt_key ring_core_0_17_5_aes_hw_set_encrypt_key -#define aes_nohw_ctr32_encrypt_blocks ring_core_0_17_5_aes_nohw_ctr32_encrypt_blocks -#define aes_nohw_encrypt ring_core_0_17_5_aes_nohw_encrypt -#define aes_nohw_set_encrypt_key ring_core_0_17_5_aes_nohw_set_encrypt_key -#define aesni_gcm_decrypt ring_core_0_17_5_aesni_gcm_decrypt -#define aesni_gcm_encrypt ring_core_0_17_5_aesni_gcm_encrypt -#define bn_from_montgomery_in_place ring_core_0_17_5_bn_from_montgomery_in_place -#define bn_gather5 ring_core_0_17_5_bn_gather5 -#define bn_mul_mont ring_core_0_17_5_bn_mul_mont -#define bn_mul_mont_gather5 ring_core_0_17_5_bn_mul_mont_gather5 -#define bn_neg_inv_mod_r_u64 ring_core_0_17_5_bn_neg_inv_mod_r_u64 -#define bn_power5 ring_core_0_17_5_bn_power5 -#define bn_scatter5 ring_core_0_17_5_bn_scatter5 -#define bn_sqr8x_internal ring_core_0_17_5_bn_sqr8x_internal -#define bn_sqrx8x_internal ring_core_0_17_5_bn_sqrx8x_internal -#define bsaes_ctr32_encrypt_blocks ring_core_0_17_5_bsaes_ctr32_encrypt_blocks -#define bssl_constant_time_test_conditional_memcpy ring_core_0_17_5_bssl_constant_time_test_conditional_memcpy -#define bssl_constant_time_test_conditional_memxor ring_core_0_17_5_bssl_constant_time_test_conditional_memxor -#define bssl_constant_time_test_main ring_core_0_17_5_bssl_constant_time_test_main -#define chacha20_poly1305_open ring_core_0_17_5_chacha20_poly1305_open -#define chacha20_poly1305_seal ring_core_0_17_5_chacha20_poly1305_seal -#define fiat_curve25519_adx_mul ring_core_0_17_5_fiat_curve25519_adx_mul -#define fiat_curve25519_adx_square ring_core_0_17_5_fiat_curve25519_adx_square -#define gcm_ghash_avx ring_core_0_17_5_gcm_ghash_avx -#define gcm_ghash_clmul ring_core_0_17_5_gcm_ghash_clmul -#define gcm_ghash_neon ring_core_0_17_5_gcm_ghash_neon -#define gcm_gmult_clmul ring_core_0_17_5_gcm_gmult_clmul -#define gcm_gmult_neon ring_core_0_17_5_gcm_gmult_neon -#define gcm_init_avx ring_core_0_17_5_gcm_init_avx -#define gcm_init_clmul ring_core_0_17_5_gcm_init_clmul -#define gcm_init_neon ring_core_0_17_5_gcm_init_neon -#define k25519Precomp ring_core_0_17_5_k25519Precomp -#define limbs_mul_add_limb ring_core_0_17_5_limbs_mul_add_limb -#define little_endian_bytes_from_scalar ring_core_0_17_5_little_endian_bytes_from_scalar -#define ecp_nistz256_neg ring_core_0_17_5_ecp_nistz256_neg -#define ecp_nistz256_select_w5 ring_core_0_17_5_ecp_nistz256_select_w5 -#define ecp_nistz256_select_w7 ring_core_0_17_5_ecp_nistz256_select_w7 -#define p256_mul_mont ring_core_0_17_5_p256_mul_mont -#define p256_point_add ring_core_0_17_5_p256_point_add -#define p256_point_add_affine ring_core_0_17_5_p256_point_add_affine -#define p256_point_double ring_core_0_17_5_p256_point_double -#define p256_point_mul ring_core_0_17_5_p256_point_mul -#define p256_point_mul_base ring_core_0_17_5_p256_point_mul_base -#define p256_point_mul_base_vartime ring_core_0_17_5_p256_point_mul_base_vartime -#define p256_scalar_mul_mont ring_core_0_17_5_p256_scalar_mul_mont -#define p256_scalar_sqr_rep_mont ring_core_0_17_5_p256_scalar_sqr_rep_mont -#define p256_sqr_mont ring_core_0_17_5_p256_sqr_mont -#define p384_elem_div_by_2 ring_core_0_17_5_p384_elem_div_by_2 -#define p384_elem_mul_mont ring_core_0_17_5_p384_elem_mul_mont -#define p384_elem_neg ring_core_0_17_5_p384_elem_neg -#define p384_elem_sub ring_core_0_17_5_p384_elem_sub -#define p384_point_add ring_core_0_17_5_p384_point_add -#define p384_point_double ring_core_0_17_5_p384_point_double -#define p384_point_mul ring_core_0_17_5_p384_point_mul -#define p384_scalar_mul_mont ring_core_0_17_5_p384_scalar_mul_mont -#define openssl_poly1305_neon2_addmulmod ring_core_0_17_5_openssl_poly1305_neon2_addmulmod -#define openssl_poly1305_neon2_blocks ring_core_0_17_5_openssl_poly1305_neon2_blocks -#define sha256_block_data_order ring_core_0_17_5_sha256_block_data_order -#define sha512_block_data_order ring_core_0_17_5_sha512_block_data_order -#define vpaes_ctr32_encrypt_blocks ring_core_0_17_5_vpaes_ctr32_encrypt_blocks -#define vpaes_encrypt ring_core_0_17_5_vpaes_encrypt -#define vpaes_encrypt_key_to_bsaes ring_core_0_17_5_vpaes_encrypt_key_to_bsaes -#define vpaes_set_encrypt_key ring_core_0_17_5_vpaes_set_encrypt_key -#define x25519_NEON ring_core_0_17_5_x25519_NEON -#define x25519_fe_invert ring_core_0_17_5_x25519_fe_invert -#define x25519_fe_isnegative ring_core_0_17_5_x25519_fe_isnegative -#define x25519_fe_mul_ttt ring_core_0_17_5_x25519_fe_mul_ttt -#define x25519_fe_neg ring_core_0_17_5_x25519_fe_neg -#define x25519_fe_tobytes ring_core_0_17_5_x25519_fe_tobytes -#define x25519_ge_double_scalarmult_vartime ring_core_0_17_5_x25519_ge_double_scalarmult_vartime -#define x25519_ge_frombytes_vartime ring_core_0_17_5_x25519_ge_frombytes_vartime -#define x25519_ge_scalarmult_base ring_core_0_17_5_x25519_ge_scalarmult_base -#define x25519_ge_scalarmult_base_adx ring_core_0_17_5_x25519_ge_scalarmult_base_adx -#define x25519_public_from_private_generic_masked ring_core_0_17_5_x25519_public_from_private_generic_masked -#define x25519_sc_mask ring_core_0_17_5_x25519_sc_mask -#define x25519_sc_muladd ring_core_0_17_5_x25519_sc_muladd -#define x25519_sc_reduce ring_core_0_17_5_x25519_sc_reduce -#define x25519_scalar_mult_adx ring_core_0_17_5_x25519_scalar_mult_adx -#define x25519_scalar_mult_generic_masked ring_core_0_17_5_x25519_scalar_mult_generic_masked +#define CRYPTO_memcmp ring_core_0_17_3_CRYPTO_memcmp +#define CRYPTO_poly1305_finish ring_core_0_17_3_CRYPTO_poly1305_finish +#define CRYPTO_poly1305_finish_neon ring_core_0_17_3_CRYPTO_poly1305_finish_neon +#define CRYPTO_poly1305_init ring_core_0_17_3_CRYPTO_poly1305_init +#define CRYPTO_poly1305_init_neon ring_core_0_17_3_CRYPTO_poly1305_init_neon +#define CRYPTO_poly1305_update ring_core_0_17_3_CRYPTO_poly1305_update +#define CRYPTO_poly1305_update_neon ring_core_0_17_3_CRYPTO_poly1305_update_neon +#define ChaCha20_ctr32 ring_core_0_17_3_ChaCha20_ctr32 +#define LIMBS_add_mod ring_core_0_17_3_LIMBS_add_mod +#define LIMBS_are_even ring_core_0_17_3_LIMBS_are_even +#define LIMBS_are_zero ring_core_0_17_3_LIMBS_are_zero +#define LIMBS_equal ring_core_0_17_3_LIMBS_equal +#define LIMBS_equal_limb ring_core_0_17_3_LIMBS_equal_limb +#define LIMBS_less_than ring_core_0_17_3_LIMBS_less_than +#define LIMBS_less_than_limb ring_core_0_17_3_LIMBS_less_than_limb +#define LIMBS_reduce_once ring_core_0_17_3_LIMBS_reduce_once +#define LIMBS_select_512_32 ring_core_0_17_3_LIMBS_select_512_32 +#define LIMBS_shl_mod ring_core_0_17_3_LIMBS_shl_mod +#define LIMBS_sub_mod ring_core_0_17_3_LIMBS_sub_mod +#define LIMBS_window5_split_window ring_core_0_17_3_LIMBS_window5_split_window +#define LIMBS_window5_unsplit_window ring_core_0_17_3_LIMBS_window5_unsplit_window +#define LIMB_shr ring_core_0_17_3_LIMB_shr +#define OPENSSL_armcap_P ring_core_0_17_3_OPENSSL_armcap_P +#define OPENSSL_cpuid_setup ring_core_0_17_3_OPENSSL_cpuid_setup +#define OPENSSL_ia32cap_P ring_core_0_17_3_OPENSSL_ia32cap_P +#define aes_hw_ctr32_encrypt_blocks ring_core_0_17_3_aes_hw_ctr32_encrypt_blocks +#define aes_hw_encrypt ring_core_0_17_3_aes_hw_encrypt +#define aes_hw_set_encrypt_key ring_core_0_17_3_aes_hw_set_encrypt_key +#define aes_nohw_ctr32_encrypt_blocks ring_core_0_17_3_aes_nohw_ctr32_encrypt_blocks +#define aes_nohw_encrypt ring_core_0_17_3_aes_nohw_encrypt +#define aes_nohw_set_encrypt_key ring_core_0_17_3_aes_nohw_set_encrypt_key +#define aesni_gcm_decrypt ring_core_0_17_3_aesni_gcm_decrypt +#define aesni_gcm_encrypt ring_core_0_17_3_aesni_gcm_encrypt +#define bn_from_montgomery_in_place ring_core_0_17_3_bn_from_montgomery_in_place +#define bn_gather5 ring_core_0_17_3_bn_gather5 +#define bn_mul_mont ring_core_0_17_3_bn_mul_mont +#define bn_mul_mont_gather5 ring_core_0_17_3_bn_mul_mont_gather5 +#define bn_neg_inv_mod_r_u64 ring_core_0_17_3_bn_neg_inv_mod_r_u64 +#define bn_power5 ring_core_0_17_3_bn_power5 +#define bn_scatter5 ring_core_0_17_3_bn_scatter5 +#define bn_sqr8x_internal ring_core_0_17_3_bn_sqr8x_internal +#define bn_sqrx8x_internal ring_core_0_17_3_bn_sqrx8x_internal +#define bsaes_ctr32_encrypt_blocks ring_core_0_17_3_bsaes_ctr32_encrypt_blocks +#define bssl_constant_time_test_conditional_memcpy ring_core_0_17_3_bssl_constant_time_test_conditional_memcpy +#define bssl_constant_time_test_conditional_memxor ring_core_0_17_3_bssl_constant_time_test_conditional_memxor +#define bssl_constant_time_test_main ring_core_0_17_3_bssl_constant_time_test_main +#define chacha20_poly1305_open ring_core_0_17_3_chacha20_poly1305_open +#define chacha20_poly1305_seal ring_core_0_17_3_chacha20_poly1305_seal +#define fiat_curve25519_adx_mul ring_core_0_17_3_fiat_curve25519_adx_mul +#define fiat_curve25519_adx_square ring_core_0_17_3_fiat_curve25519_adx_square +#define gcm_ghash_avx ring_core_0_17_3_gcm_ghash_avx +#define gcm_ghash_clmul ring_core_0_17_3_gcm_ghash_clmul +#define gcm_ghash_neon ring_core_0_17_3_gcm_ghash_neon +#define gcm_gmult_clmul ring_core_0_17_3_gcm_gmult_clmul +#define gcm_gmult_neon ring_core_0_17_3_gcm_gmult_neon +#define gcm_init_avx ring_core_0_17_3_gcm_init_avx +#define gcm_init_clmul ring_core_0_17_3_gcm_init_clmul +#define gcm_init_neon ring_core_0_17_3_gcm_init_neon +#define k25519Precomp ring_core_0_17_3_k25519Precomp +#define limbs_mul_add_limb ring_core_0_17_3_limbs_mul_add_limb +#define little_endian_bytes_from_scalar ring_core_0_17_3_little_endian_bytes_from_scalar +#define ecp_nistz256_neg ring_core_0_17_3_ecp_nistz256_neg +#define ecp_nistz256_select_w5 ring_core_0_17_3_ecp_nistz256_select_w5 +#define ecp_nistz256_select_w7 ring_core_0_17_3_ecp_nistz256_select_w7 +#define nistz384_point_add ring_core_0_17_3_nistz384_point_add +#define nistz384_point_double ring_core_0_17_3_nistz384_point_double +#define nistz384_point_mul ring_core_0_17_3_nistz384_point_mul +#define p256_mul_mont ring_core_0_17_3_p256_mul_mont +#define p256_point_add ring_core_0_17_3_p256_point_add +#define p256_point_add_affine ring_core_0_17_3_p256_point_add_affine +#define p256_point_double ring_core_0_17_3_p256_point_double +#define p256_point_mul ring_core_0_17_3_p256_point_mul +#define p256_point_mul_base ring_core_0_17_3_p256_point_mul_base +#define p256_scalar_mul_mont ring_core_0_17_3_p256_scalar_mul_mont +#define p256_scalar_sqr_rep_mont ring_core_0_17_3_p256_scalar_sqr_rep_mont +#define p256_sqr_mont ring_core_0_17_3_p256_sqr_mont +#define p384_elem_div_by_2 ring_core_0_17_3_p384_elem_div_by_2 +#define p384_elem_mul_mont ring_core_0_17_3_p384_elem_mul_mont +#define p384_elem_neg ring_core_0_17_3_p384_elem_neg +#define p384_elem_sub ring_core_0_17_3_p384_elem_sub +#define p384_scalar_mul_mont ring_core_0_17_3_p384_scalar_mul_mont +#define openssl_poly1305_neon2_addmulmod ring_core_0_17_3_openssl_poly1305_neon2_addmulmod +#define openssl_poly1305_neon2_blocks ring_core_0_17_3_openssl_poly1305_neon2_blocks +#define sha256_block_data_order ring_core_0_17_3_sha256_block_data_order +#define sha512_block_data_order ring_core_0_17_3_sha512_block_data_order +#define vpaes_ctr32_encrypt_blocks ring_core_0_17_3_vpaes_ctr32_encrypt_blocks +#define vpaes_encrypt ring_core_0_17_3_vpaes_encrypt +#define vpaes_encrypt_key_to_bsaes ring_core_0_17_3_vpaes_encrypt_key_to_bsaes +#define vpaes_set_encrypt_key ring_core_0_17_3_vpaes_set_encrypt_key +#define x25519_NEON ring_core_0_17_3_x25519_NEON +#define x25519_fe_invert ring_core_0_17_3_x25519_fe_invert +#define x25519_fe_isnegative ring_core_0_17_3_x25519_fe_isnegative +#define x25519_fe_mul_ttt ring_core_0_17_3_x25519_fe_mul_ttt +#define x25519_fe_neg ring_core_0_17_3_x25519_fe_neg +#define x25519_fe_tobytes ring_core_0_17_3_x25519_fe_tobytes +#define x25519_ge_double_scalarmult_vartime ring_core_0_17_3_x25519_ge_double_scalarmult_vartime +#define x25519_ge_frombytes_vartime ring_core_0_17_3_x25519_ge_frombytes_vartime +#define x25519_ge_scalarmult_base ring_core_0_17_3_x25519_ge_scalarmult_base +#define x25519_ge_scalarmult_base_adx ring_core_0_17_3_x25519_ge_scalarmult_base_adx +#define x25519_public_from_private_generic_masked ring_core_0_17_3_x25519_public_from_private_generic_masked +#define x25519_sc_mask ring_core_0_17_3_x25519_sc_mask +#define x25519_sc_muladd ring_core_0_17_3_x25519_sc_muladd +#define x25519_sc_reduce ring_core_0_17_3_x25519_sc_reduce +#define x25519_scalar_mult_adx ring_core_0_17_3_x25519_scalar_mult_adx +#define x25519_scalar_mult_generic_masked ring_core_0_17_3_x25519_scalar_mult_generic_masked #endif #endif diff -Nru temporalio-1.3.0/vendor/ring/pregenerated/tmp/ring_core_generated/prefix_symbols_nasm.inc temporalio-1.3.0/vendor/ring/pregenerated/tmp/ring_core_generated/prefix_symbols_nasm.inc --- temporalio-1.3.0/vendor/ring/pregenerated/tmp/ring_core_generated/prefix_symbols_nasm.inc 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring/pregenerated/tmp/ring_core_generated/prefix_symbols_nasm.inc 2023-10-30 19:40:00.000000000 +0000 @@ -10,112 +10,111 @@ %define _ecp_nistz256_ord_sqr_mont _p256_scalar_sqr_rep_mont %define _ecp_nistz256_mul_mont _p256_mul_mont %define _ecp_nistz256_sqr_mont _p256_sqr_mont -%define _CRYPTO_memcmp _ring_core_0_17_5_CRYPTO_memcmp -%define _CRYPTO_poly1305_finish _ring_core_0_17_5_CRYPTO_poly1305_finish -%define _CRYPTO_poly1305_finish_neon _ring_core_0_17_5_CRYPTO_poly1305_finish_neon -%define _CRYPTO_poly1305_init _ring_core_0_17_5_CRYPTO_poly1305_init -%define _CRYPTO_poly1305_init_neon _ring_core_0_17_5_CRYPTO_poly1305_init_neon -%define _CRYPTO_poly1305_update _ring_core_0_17_5_CRYPTO_poly1305_update -%define _CRYPTO_poly1305_update_neon _ring_core_0_17_5_CRYPTO_poly1305_update_neon -%define _ChaCha20_ctr32 _ring_core_0_17_5_ChaCha20_ctr32 -%define _LIMBS_add_mod _ring_core_0_17_5_LIMBS_add_mod -%define _LIMBS_are_even _ring_core_0_17_5_LIMBS_are_even -%define _LIMBS_are_zero _ring_core_0_17_5_LIMBS_are_zero -%define _LIMBS_equal _ring_core_0_17_5_LIMBS_equal -%define _LIMBS_equal_limb _ring_core_0_17_5_LIMBS_equal_limb -%define _LIMBS_less_than _ring_core_0_17_5_LIMBS_less_than -%define _LIMBS_less_than_limb _ring_core_0_17_5_LIMBS_less_than_limb -%define _LIMBS_reduce_once _ring_core_0_17_5_LIMBS_reduce_once -%define _LIMBS_select_512_32 _ring_core_0_17_5_LIMBS_select_512_32 -%define _LIMBS_shl_mod _ring_core_0_17_5_LIMBS_shl_mod -%define _LIMBS_sub_mod _ring_core_0_17_5_LIMBS_sub_mod -%define _LIMBS_window5_split_window _ring_core_0_17_5_LIMBS_window5_split_window -%define _LIMBS_window5_unsplit_window _ring_core_0_17_5_LIMBS_window5_unsplit_window -%define _LIMB_shr _ring_core_0_17_5_LIMB_shr -%define _OPENSSL_armcap_P _ring_core_0_17_5_OPENSSL_armcap_P -%define _OPENSSL_cpuid_setup _ring_core_0_17_5_OPENSSL_cpuid_setup -%define _OPENSSL_ia32cap_P _ring_core_0_17_5_OPENSSL_ia32cap_P -%define _aes_hw_ctr32_encrypt_blocks _ring_core_0_17_5_aes_hw_ctr32_encrypt_blocks -%define _aes_hw_encrypt _ring_core_0_17_5_aes_hw_encrypt -%define _aes_hw_set_encrypt_key _ring_core_0_17_5_aes_hw_set_encrypt_key -%define _aes_nohw_ctr32_encrypt_blocks _ring_core_0_17_5_aes_nohw_ctr32_encrypt_blocks -%define _aes_nohw_encrypt _ring_core_0_17_5_aes_nohw_encrypt -%define _aes_nohw_set_encrypt_key _ring_core_0_17_5_aes_nohw_set_encrypt_key -%define _aesni_gcm_decrypt _ring_core_0_17_5_aesni_gcm_decrypt -%define _aesni_gcm_encrypt _ring_core_0_17_5_aesni_gcm_encrypt -%define _bn_from_montgomery_in_place _ring_core_0_17_5_bn_from_montgomery_in_place -%define _bn_gather5 _ring_core_0_17_5_bn_gather5 -%define _bn_mul_mont _ring_core_0_17_5_bn_mul_mont -%define _bn_mul_mont_gather5 _ring_core_0_17_5_bn_mul_mont_gather5 -%define _bn_neg_inv_mod_r_u64 _ring_core_0_17_5_bn_neg_inv_mod_r_u64 -%define _bn_power5 _ring_core_0_17_5_bn_power5 -%define _bn_scatter5 _ring_core_0_17_5_bn_scatter5 -%define _bn_sqr8x_internal _ring_core_0_17_5_bn_sqr8x_internal -%define _bn_sqrx8x_internal _ring_core_0_17_5_bn_sqrx8x_internal -%define _bsaes_ctr32_encrypt_blocks _ring_core_0_17_5_bsaes_ctr32_encrypt_blocks -%define _bssl_constant_time_test_conditional_memcpy _ring_core_0_17_5_bssl_constant_time_test_conditional_memcpy -%define _bssl_constant_time_test_conditional_memxor _ring_core_0_17_5_bssl_constant_time_test_conditional_memxor -%define _bssl_constant_time_test_main _ring_core_0_17_5_bssl_constant_time_test_main -%define _chacha20_poly1305_open _ring_core_0_17_5_chacha20_poly1305_open -%define _chacha20_poly1305_seal _ring_core_0_17_5_chacha20_poly1305_seal -%define _fiat_curve25519_adx_mul _ring_core_0_17_5_fiat_curve25519_adx_mul -%define _fiat_curve25519_adx_square _ring_core_0_17_5_fiat_curve25519_adx_square -%define _gcm_ghash_avx _ring_core_0_17_5_gcm_ghash_avx -%define _gcm_ghash_clmul _ring_core_0_17_5_gcm_ghash_clmul -%define _gcm_ghash_neon _ring_core_0_17_5_gcm_ghash_neon -%define _gcm_gmult_clmul _ring_core_0_17_5_gcm_gmult_clmul -%define _gcm_gmult_neon _ring_core_0_17_5_gcm_gmult_neon -%define _gcm_init_avx _ring_core_0_17_5_gcm_init_avx -%define _gcm_init_clmul _ring_core_0_17_5_gcm_init_clmul -%define _gcm_init_neon _ring_core_0_17_5_gcm_init_neon -%define _k25519Precomp _ring_core_0_17_5_k25519Precomp -%define _limbs_mul_add_limb _ring_core_0_17_5_limbs_mul_add_limb -%define _little_endian_bytes_from_scalar _ring_core_0_17_5_little_endian_bytes_from_scalar -%define _ecp_nistz256_neg _ring_core_0_17_5_ecp_nistz256_neg -%define _ecp_nistz256_select_w5 _ring_core_0_17_5_ecp_nistz256_select_w5 -%define _ecp_nistz256_select_w7 _ring_core_0_17_5_ecp_nistz256_select_w7 -%define _p256_mul_mont _ring_core_0_17_5_p256_mul_mont -%define _p256_point_add _ring_core_0_17_5_p256_point_add -%define _p256_point_add_affine _ring_core_0_17_5_p256_point_add_affine -%define _p256_point_double _ring_core_0_17_5_p256_point_double -%define _p256_point_mul _ring_core_0_17_5_p256_point_mul -%define _p256_point_mul_base _ring_core_0_17_5_p256_point_mul_base -%define _p256_point_mul_base_vartime _ring_core_0_17_5_p256_point_mul_base_vartime -%define _p256_scalar_mul_mont _ring_core_0_17_5_p256_scalar_mul_mont -%define _p256_scalar_sqr_rep_mont _ring_core_0_17_5_p256_scalar_sqr_rep_mont -%define _p256_sqr_mont _ring_core_0_17_5_p256_sqr_mont -%define _p384_elem_div_by_2 _ring_core_0_17_5_p384_elem_div_by_2 -%define _p384_elem_mul_mont _ring_core_0_17_5_p384_elem_mul_mont -%define _p384_elem_neg _ring_core_0_17_5_p384_elem_neg -%define _p384_elem_sub _ring_core_0_17_5_p384_elem_sub -%define _p384_point_add _ring_core_0_17_5_p384_point_add -%define _p384_point_double _ring_core_0_17_5_p384_point_double -%define _p384_point_mul _ring_core_0_17_5_p384_point_mul -%define _p384_scalar_mul_mont _ring_core_0_17_5_p384_scalar_mul_mont -%define _openssl_poly1305_neon2_addmulmod _ring_core_0_17_5_openssl_poly1305_neon2_addmulmod -%define _openssl_poly1305_neon2_blocks _ring_core_0_17_5_openssl_poly1305_neon2_blocks -%define _sha256_block_data_order _ring_core_0_17_5_sha256_block_data_order -%define _sha512_block_data_order _ring_core_0_17_5_sha512_block_data_order -%define _vpaes_ctr32_encrypt_blocks _ring_core_0_17_5_vpaes_ctr32_encrypt_blocks -%define _vpaes_encrypt _ring_core_0_17_5_vpaes_encrypt -%define _vpaes_encrypt_key_to_bsaes _ring_core_0_17_5_vpaes_encrypt_key_to_bsaes -%define _vpaes_set_encrypt_key _ring_core_0_17_5_vpaes_set_encrypt_key -%define _x25519_NEON _ring_core_0_17_5_x25519_NEON -%define _x25519_fe_invert _ring_core_0_17_5_x25519_fe_invert -%define _x25519_fe_isnegative _ring_core_0_17_5_x25519_fe_isnegative -%define _x25519_fe_mul_ttt _ring_core_0_17_5_x25519_fe_mul_ttt -%define _x25519_fe_neg _ring_core_0_17_5_x25519_fe_neg -%define _x25519_fe_tobytes _ring_core_0_17_5_x25519_fe_tobytes -%define _x25519_ge_double_scalarmult_vartime _ring_core_0_17_5_x25519_ge_double_scalarmult_vartime -%define _x25519_ge_frombytes_vartime _ring_core_0_17_5_x25519_ge_frombytes_vartime -%define _x25519_ge_scalarmult_base _ring_core_0_17_5_x25519_ge_scalarmult_base -%define _x25519_ge_scalarmult_base_adx _ring_core_0_17_5_x25519_ge_scalarmult_base_adx -%define _x25519_public_from_private_generic_masked _ring_core_0_17_5_x25519_public_from_private_generic_masked -%define _x25519_sc_mask _ring_core_0_17_5_x25519_sc_mask -%define _x25519_sc_muladd _ring_core_0_17_5_x25519_sc_muladd -%define _x25519_sc_reduce _ring_core_0_17_5_x25519_sc_reduce -%define _x25519_scalar_mult_adx _ring_core_0_17_5_x25519_scalar_mult_adx -%define _x25519_scalar_mult_generic_masked _ring_core_0_17_5_x25519_scalar_mult_generic_masked +%define _CRYPTO_memcmp _ring_core_0_17_3_CRYPTO_memcmp +%define _CRYPTO_poly1305_finish _ring_core_0_17_3_CRYPTO_poly1305_finish +%define _CRYPTO_poly1305_finish_neon _ring_core_0_17_3_CRYPTO_poly1305_finish_neon +%define _CRYPTO_poly1305_init _ring_core_0_17_3_CRYPTO_poly1305_init +%define _CRYPTO_poly1305_init_neon _ring_core_0_17_3_CRYPTO_poly1305_init_neon +%define _CRYPTO_poly1305_update _ring_core_0_17_3_CRYPTO_poly1305_update +%define _CRYPTO_poly1305_update_neon _ring_core_0_17_3_CRYPTO_poly1305_update_neon +%define _ChaCha20_ctr32 _ring_core_0_17_3_ChaCha20_ctr32 +%define _LIMBS_add_mod _ring_core_0_17_3_LIMBS_add_mod +%define _LIMBS_are_even _ring_core_0_17_3_LIMBS_are_even +%define _LIMBS_are_zero _ring_core_0_17_3_LIMBS_are_zero +%define _LIMBS_equal _ring_core_0_17_3_LIMBS_equal +%define _LIMBS_equal_limb _ring_core_0_17_3_LIMBS_equal_limb +%define _LIMBS_less_than _ring_core_0_17_3_LIMBS_less_than +%define _LIMBS_less_than_limb _ring_core_0_17_3_LIMBS_less_than_limb +%define _LIMBS_reduce_once _ring_core_0_17_3_LIMBS_reduce_once +%define _LIMBS_select_512_32 _ring_core_0_17_3_LIMBS_select_512_32 +%define _LIMBS_shl_mod _ring_core_0_17_3_LIMBS_shl_mod +%define _LIMBS_sub_mod _ring_core_0_17_3_LIMBS_sub_mod +%define _LIMBS_window5_split_window _ring_core_0_17_3_LIMBS_window5_split_window +%define _LIMBS_window5_unsplit_window _ring_core_0_17_3_LIMBS_window5_unsplit_window +%define _LIMB_shr _ring_core_0_17_3_LIMB_shr +%define _OPENSSL_armcap_P _ring_core_0_17_3_OPENSSL_armcap_P +%define _OPENSSL_cpuid_setup _ring_core_0_17_3_OPENSSL_cpuid_setup +%define _OPENSSL_ia32cap_P _ring_core_0_17_3_OPENSSL_ia32cap_P +%define _aes_hw_ctr32_encrypt_blocks _ring_core_0_17_3_aes_hw_ctr32_encrypt_blocks +%define _aes_hw_encrypt _ring_core_0_17_3_aes_hw_encrypt +%define _aes_hw_set_encrypt_key _ring_core_0_17_3_aes_hw_set_encrypt_key +%define _aes_nohw_ctr32_encrypt_blocks _ring_core_0_17_3_aes_nohw_ctr32_encrypt_blocks +%define _aes_nohw_encrypt _ring_core_0_17_3_aes_nohw_encrypt +%define _aes_nohw_set_encrypt_key _ring_core_0_17_3_aes_nohw_set_encrypt_key +%define _aesni_gcm_decrypt _ring_core_0_17_3_aesni_gcm_decrypt +%define _aesni_gcm_encrypt _ring_core_0_17_3_aesni_gcm_encrypt +%define _bn_from_montgomery_in_place _ring_core_0_17_3_bn_from_montgomery_in_place +%define _bn_gather5 _ring_core_0_17_3_bn_gather5 +%define _bn_mul_mont _ring_core_0_17_3_bn_mul_mont +%define _bn_mul_mont_gather5 _ring_core_0_17_3_bn_mul_mont_gather5 +%define _bn_neg_inv_mod_r_u64 _ring_core_0_17_3_bn_neg_inv_mod_r_u64 +%define _bn_power5 _ring_core_0_17_3_bn_power5 +%define _bn_scatter5 _ring_core_0_17_3_bn_scatter5 +%define _bn_sqr8x_internal _ring_core_0_17_3_bn_sqr8x_internal +%define _bn_sqrx8x_internal _ring_core_0_17_3_bn_sqrx8x_internal +%define _bsaes_ctr32_encrypt_blocks _ring_core_0_17_3_bsaes_ctr32_encrypt_blocks +%define _bssl_constant_time_test_conditional_memcpy _ring_core_0_17_3_bssl_constant_time_test_conditional_memcpy +%define _bssl_constant_time_test_conditional_memxor _ring_core_0_17_3_bssl_constant_time_test_conditional_memxor +%define _bssl_constant_time_test_main _ring_core_0_17_3_bssl_constant_time_test_main +%define _chacha20_poly1305_open _ring_core_0_17_3_chacha20_poly1305_open +%define _chacha20_poly1305_seal _ring_core_0_17_3_chacha20_poly1305_seal +%define _fiat_curve25519_adx_mul _ring_core_0_17_3_fiat_curve25519_adx_mul +%define _fiat_curve25519_adx_square _ring_core_0_17_3_fiat_curve25519_adx_square +%define _gcm_ghash_avx _ring_core_0_17_3_gcm_ghash_avx +%define _gcm_ghash_clmul _ring_core_0_17_3_gcm_ghash_clmul +%define _gcm_ghash_neon _ring_core_0_17_3_gcm_ghash_neon +%define _gcm_gmult_clmul _ring_core_0_17_3_gcm_gmult_clmul +%define _gcm_gmult_neon _ring_core_0_17_3_gcm_gmult_neon +%define _gcm_init_avx _ring_core_0_17_3_gcm_init_avx +%define _gcm_init_clmul _ring_core_0_17_3_gcm_init_clmul +%define _gcm_init_neon _ring_core_0_17_3_gcm_init_neon +%define _k25519Precomp _ring_core_0_17_3_k25519Precomp +%define _limbs_mul_add_limb _ring_core_0_17_3_limbs_mul_add_limb +%define _little_endian_bytes_from_scalar _ring_core_0_17_3_little_endian_bytes_from_scalar +%define _ecp_nistz256_neg _ring_core_0_17_3_ecp_nistz256_neg +%define _ecp_nistz256_select_w5 _ring_core_0_17_3_ecp_nistz256_select_w5 +%define _ecp_nistz256_select_w7 _ring_core_0_17_3_ecp_nistz256_select_w7 +%define _nistz384_point_add _ring_core_0_17_3_nistz384_point_add +%define _nistz384_point_double _ring_core_0_17_3_nistz384_point_double +%define _nistz384_point_mul _ring_core_0_17_3_nistz384_point_mul +%define _p256_mul_mont _ring_core_0_17_3_p256_mul_mont +%define _p256_point_add _ring_core_0_17_3_p256_point_add +%define _p256_point_add_affine _ring_core_0_17_3_p256_point_add_affine +%define _p256_point_double _ring_core_0_17_3_p256_point_double +%define _p256_point_mul _ring_core_0_17_3_p256_point_mul +%define _p256_point_mul_base _ring_core_0_17_3_p256_point_mul_base +%define _p256_scalar_mul_mont _ring_core_0_17_3_p256_scalar_mul_mont +%define _p256_scalar_sqr_rep_mont _ring_core_0_17_3_p256_scalar_sqr_rep_mont +%define _p256_sqr_mont _ring_core_0_17_3_p256_sqr_mont +%define _p384_elem_div_by_2 _ring_core_0_17_3_p384_elem_div_by_2 +%define _p384_elem_mul_mont _ring_core_0_17_3_p384_elem_mul_mont +%define _p384_elem_neg _ring_core_0_17_3_p384_elem_neg +%define _p384_elem_sub _ring_core_0_17_3_p384_elem_sub +%define _p384_scalar_mul_mont _ring_core_0_17_3_p384_scalar_mul_mont +%define _openssl_poly1305_neon2_addmulmod _ring_core_0_17_3_openssl_poly1305_neon2_addmulmod +%define _openssl_poly1305_neon2_blocks _ring_core_0_17_3_openssl_poly1305_neon2_blocks +%define _sha256_block_data_order _ring_core_0_17_3_sha256_block_data_order +%define _sha512_block_data_order _ring_core_0_17_3_sha512_block_data_order +%define _vpaes_ctr32_encrypt_blocks _ring_core_0_17_3_vpaes_ctr32_encrypt_blocks +%define _vpaes_encrypt _ring_core_0_17_3_vpaes_encrypt +%define _vpaes_encrypt_key_to_bsaes _ring_core_0_17_3_vpaes_encrypt_key_to_bsaes +%define _vpaes_set_encrypt_key _ring_core_0_17_3_vpaes_set_encrypt_key +%define _x25519_NEON _ring_core_0_17_3_x25519_NEON +%define _x25519_fe_invert _ring_core_0_17_3_x25519_fe_invert +%define _x25519_fe_isnegative _ring_core_0_17_3_x25519_fe_isnegative +%define _x25519_fe_mul_ttt _ring_core_0_17_3_x25519_fe_mul_ttt +%define _x25519_fe_neg _ring_core_0_17_3_x25519_fe_neg +%define _x25519_fe_tobytes _ring_core_0_17_3_x25519_fe_tobytes +%define _x25519_ge_double_scalarmult_vartime _ring_core_0_17_3_x25519_ge_double_scalarmult_vartime +%define _x25519_ge_frombytes_vartime _ring_core_0_17_3_x25519_ge_frombytes_vartime +%define _x25519_ge_scalarmult_base _ring_core_0_17_3_x25519_ge_scalarmult_base +%define _x25519_ge_scalarmult_base_adx _ring_core_0_17_3_x25519_ge_scalarmult_base_adx +%define _x25519_public_from_private_generic_masked _ring_core_0_17_3_x25519_public_from_private_generic_masked +%define _x25519_sc_mask _ring_core_0_17_3_x25519_sc_mask +%define _x25519_sc_muladd _ring_core_0_17_3_x25519_sc_muladd +%define _x25519_sc_reduce _ring_core_0_17_3_x25519_sc_reduce +%define _x25519_scalar_mult_adx _ring_core_0_17_3_x25519_scalar_mult_adx +%define _x25519_scalar_mult_generic_masked _ring_core_0_17_3_x25519_scalar_mult_generic_masked %else %define ecp_nistz256_point_double p256_point_double @@ -125,112 +124,111 @@ %define ecp_nistz256_ord_sqr_mont p256_scalar_sqr_rep_mont %define ecp_nistz256_mul_mont p256_mul_mont %define ecp_nistz256_sqr_mont p256_sqr_mont -%define CRYPTO_memcmp ring_core_0_17_5_CRYPTO_memcmp -%define CRYPTO_poly1305_finish ring_core_0_17_5_CRYPTO_poly1305_finish -%define CRYPTO_poly1305_finish_neon ring_core_0_17_5_CRYPTO_poly1305_finish_neon -%define CRYPTO_poly1305_init ring_core_0_17_5_CRYPTO_poly1305_init -%define CRYPTO_poly1305_init_neon ring_core_0_17_5_CRYPTO_poly1305_init_neon -%define CRYPTO_poly1305_update ring_core_0_17_5_CRYPTO_poly1305_update -%define CRYPTO_poly1305_update_neon ring_core_0_17_5_CRYPTO_poly1305_update_neon -%define ChaCha20_ctr32 ring_core_0_17_5_ChaCha20_ctr32 -%define LIMBS_add_mod ring_core_0_17_5_LIMBS_add_mod -%define LIMBS_are_even ring_core_0_17_5_LIMBS_are_even -%define LIMBS_are_zero ring_core_0_17_5_LIMBS_are_zero -%define LIMBS_equal ring_core_0_17_5_LIMBS_equal -%define LIMBS_equal_limb ring_core_0_17_5_LIMBS_equal_limb -%define LIMBS_less_than ring_core_0_17_5_LIMBS_less_than -%define LIMBS_less_than_limb ring_core_0_17_5_LIMBS_less_than_limb -%define LIMBS_reduce_once ring_core_0_17_5_LIMBS_reduce_once -%define LIMBS_select_512_32 ring_core_0_17_5_LIMBS_select_512_32 -%define LIMBS_shl_mod ring_core_0_17_5_LIMBS_shl_mod -%define LIMBS_sub_mod ring_core_0_17_5_LIMBS_sub_mod -%define LIMBS_window5_split_window ring_core_0_17_5_LIMBS_window5_split_window -%define LIMBS_window5_unsplit_window ring_core_0_17_5_LIMBS_window5_unsplit_window -%define LIMB_shr ring_core_0_17_5_LIMB_shr -%define OPENSSL_armcap_P ring_core_0_17_5_OPENSSL_armcap_P -%define OPENSSL_cpuid_setup ring_core_0_17_5_OPENSSL_cpuid_setup -%define OPENSSL_ia32cap_P ring_core_0_17_5_OPENSSL_ia32cap_P -%define aes_hw_ctr32_encrypt_blocks ring_core_0_17_5_aes_hw_ctr32_encrypt_blocks -%define aes_hw_encrypt ring_core_0_17_5_aes_hw_encrypt -%define aes_hw_set_encrypt_key ring_core_0_17_5_aes_hw_set_encrypt_key -%define aes_nohw_ctr32_encrypt_blocks ring_core_0_17_5_aes_nohw_ctr32_encrypt_blocks -%define aes_nohw_encrypt ring_core_0_17_5_aes_nohw_encrypt -%define aes_nohw_set_encrypt_key ring_core_0_17_5_aes_nohw_set_encrypt_key -%define aesni_gcm_decrypt ring_core_0_17_5_aesni_gcm_decrypt -%define aesni_gcm_encrypt ring_core_0_17_5_aesni_gcm_encrypt -%define bn_from_montgomery_in_place ring_core_0_17_5_bn_from_montgomery_in_place -%define bn_gather5 ring_core_0_17_5_bn_gather5 -%define bn_mul_mont ring_core_0_17_5_bn_mul_mont -%define bn_mul_mont_gather5 ring_core_0_17_5_bn_mul_mont_gather5 -%define bn_neg_inv_mod_r_u64 ring_core_0_17_5_bn_neg_inv_mod_r_u64 -%define bn_power5 ring_core_0_17_5_bn_power5 -%define bn_scatter5 ring_core_0_17_5_bn_scatter5 -%define bn_sqr8x_internal ring_core_0_17_5_bn_sqr8x_internal -%define bn_sqrx8x_internal ring_core_0_17_5_bn_sqrx8x_internal -%define bsaes_ctr32_encrypt_blocks ring_core_0_17_5_bsaes_ctr32_encrypt_blocks -%define bssl_constant_time_test_conditional_memcpy ring_core_0_17_5_bssl_constant_time_test_conditional_memcpy -%define bssl_constant_time_test_conditional_memxor ring_core_0_17_5_bssl_constant_time_test_conditional_memxor -%define bssl_constant_time_test_main ring_core_0_17_5_bssl_constant_time_test_main -%define chacha20_poly1305_open ring_core_0_17_5_chacha20_poly1305_open -%define chacha20_poly1305_seal ring_core_0_17_5_chacha20_poly1305_seal -%define fiat_curve25519_adx_mul ring_core_0_17_5_fiat_curve25519_adx_mul -%define fiat_curve25519_adx_square ring_core_0_17_5_fiat_curve25519_adx_square -%define gcm_ghash_avx ring_core_0_17_5_gcm_ghash_avx -%define gcm_ghash_clmul ring_core_0_17_5_gcm_ghash_clmul -%define gcm_ghash_neon ring_core_0_17_5_gcm_ghash_neon -%define gcm_gmult_clmul ring_core_0_17_5_gcm_gmult_clmul -%define gcm_gmult_neon ring_core_0_17_5_gcm_gmult_neon -%define gcm_init_avx ring_core_0_17_5_gcm_init_avx -%define gcm_init_clmul ring_core_0_17_5_gcm_init_clmul -%define gcm_init_neon ring_core_0_17_5_gcm_init_neon -%define k25519Precomp ring_core_0_17_5_k25519Precomp -%define limbs_mul_add_limb ring_core_0_17_5_limbs_mul_add_limb -%define little_endian_bytes_from_scalar ring_core_0_17_5_little_endian_bytes_from_scalar -%define ecp_nistz256_neg ring_core_0_17_5_ecp_nistz256_neg -%define ecp_nistz256_select_w5 ring_core_0_17_5_ecp_nistz256_select_w5 -%define ecp_nistz256_select_w7 ring_core_0_17_5_ecp_nistz256_select_w7 -%define p256_mul_mont ring_core_0_17_5_p256_mul_mont -%define p256_point_add ring_core_0_17_5_p256_point_add -%define p256_point_add_affine ring_core_0_17_5_p256_point_add_affine -%define p256_point_double ring_core_0_17_5_p256_point_double -%define p256_point_mul ring_core_0_17_5_p256_point_mul -%define p256_point_mul_base ring_core_0_17_5_p256_point_mul_base -%define p256_point_mul_base_vartime ring_core_0_17_5_p256_point_mul_base_vartime -%define p256_scalar_mul_mont ring_core_0_17_5_p256_scalar_mul_mont -%define p256_scalar_sqr_rep_mont ring_core_0_17_5_p256_scalar_sqr_rep_mont -%define p256_sqr_mont ring_core_0_17_5_p256_sqr_mont -%define p384_elem_div_by_2 ring_core_0_17_5_p384_elem_div_by_2 -%define p384_elem_mul_mont ring_core_0_17_5_p384_elem_mul_mont -%define p384_elem_neg ring_core_0_17_5_p384_elem_neg -%define p384_elem_sub ring_core_0_17_5_p384_elem_sub -%define p384_point_add ring_core_0_17_5_p384_point_add -%define p384_point_double ring_core_0_17_5_p384_point_double -%define p384_point_mul ring_core_0_17_5_p384_point_mul -%define p384_scalar_mul_mont ring_core_0_17_5_p384_scalar_mul_mont -%define openssl_poly1305_neon2_addmulmod ring_core_0_17_5_openssl_poly1305_neon2_addmulmod -%define openssl_poly1305_neon2_blocks ring_core_0_17_5_openssl_poly1305_neon2_blocks -%define sha256_block_data_order ring_core_0_17_5_sha256_block_data_order -%define sha512_block_data_order ring_core_0_17_5_sha512_block_data_order -%define vpaes_ctr32_encrypt_blocks ring_core_0_17_5_vpaes_ctr32_encrypt_blocks -%define vpaes_encrypt ring_core_0_17_5_vpaes_encrypt -%define vpaes_encrypt_key_to_bsaes ring_core_0_17_5_vpaes_encrypt_key_to_bsaes -%define vpaes_set_encrypt_key ring_core_0_17_5_vpaes_set_encrypt_key -%define x25519_NEON ring_core_0_17_5_x25519_NEON -%define x25519_fe_invert ring_core_0_17_5_x25519_fe_invert -%define x25519_fe_isnegative ring_core_0_17_5_x25519_fe_isnegative -%define x25519_fe_mul_ttt ring_core_0_17_5_x25519_fe_mul_ttt -%define x25519_fe_neg ring_core_0_17_5_x25519_fe_neg -%define x25519_fe_tobytes ring_core_0_17_5_x25519_fe_tobytes -%define x25519_ge_double_scalarmult_vartime ring_core_0_17_5_x25519_ge_double_scalarmult_vartime -%define x25519_ge_frombytes_vartime ring_core_0_17_5_x25519_ge_frombytes_vartime -%define x25519_ge_scalarmult_base ring_core_0_17_5_x25519_ge_scalarmult_base -%define x25519_ge_scalarmult_base_adx ring_core_0_17_5_x25519_ge_scalarmult_base_adx -%define x25519_public_from_private_generic_masked ring_core_0_17_5_x25519_public_from_private_generic_masked -%define x25519_sc_mask ring_core_0_17_5_x25519_sc_mask -%define x25519_sc_muladd ring_core_0_17_5_x25519_sc_muladd -%define x25519_sc_reduce ring_core_0_17_5_x25519_sc_reduce -%define x25519_scalar_mult_adx ring_core_0_17_5_x25519_scalar_mult_adx -%define x25519_scalar_mult_generic_masked ring_core_0_17_5_x25519_scalar_mult_generic_masked +%define CRYPTO_memcmp ring_core_0_17_3_CRYPTO_memcmp +%define CRYPTO_poly1305_finish ring_core_0_17_3_CRYPTO_poly1305_finish +%define CRYPTO_poly1305_finish_neon ring_core_0_17_3_CRYPTO_poly1305_finish_neon +%define CRYPTO_poly1305_init ring_core_0_17_3_CRYPTO_poly1305_init +%define CRYPTO_poly1305_init_neon ring_core_0_17_3_CRYPTO_poly1305_init_neon +%define CRYPTO_poly1305_update ring_core_0_17_3_CRYPTO_poly1305_update +%define CRYPTO_poly1305_update_neon ring_core_0_17_3_CRYPTO_poly1305_update_neon +%define ChaCha20_ctr32 ring_core_0_17_3_ChaCha20_ctr32 +%define LIMBS_add_mod ring_core_0_17_3_LIMBS_add_mod +%define LIMBS_are_even ring_core_0_17_3_LIMBS_are_even +%define LIMBS_are_zero ring_core_0_17_3_LIMBS_are_zero +%define LIMBS_equal ring_core_0_17_3_LIMBS_equal +%define LIMBS_equal_limb ring_core_0_17_3_LIMBS_equal_limb +%define LIMBS_less_than ring_core_0_17_3_LIMBS_less_than +%define LIMBS_less_than_limb ring_core_0_17_3_LIMBS_less_than_limb +%define LIMBS_reduce_once ring_core_0_17_3_LIMBS_reduce_once +%define LIMBS_select_512_32 ring_core_0_17_3_LIMBS_select_512_32 +%define LIMBS_shl_mod ring_core_0_17_3_LIMBS_shl_mod +%define LIMBS_sub_mod ring_core_0_17_3_LIMBS_sub_mod +%define LIMBS_window5_split_window ring_core_0_17_3_LIMBS_window5_split_window +%define LIMBS_window5_unsplit_window ring_core_0_17_3_LIMBS_window5_unsplit_window +%define LIMB_shr ring_core_0_17_3_LIMB_shr +%define OPENSSL_armcap_P ring_core_0_17_3_OPENSSL_armcap_P +%define OPENSSL_cpuid_setup ring_core_0_17_3_OPENSSL_cpuid_setup +%define OPENSSL_ia32cap_P ring_core_0_17_3_OPENSSL_ia32cap_P +%define aes_hw_ctr32_encrypt_blocks ring_core_0_17_3_aes_hw_ctr32_encrypt_blocks +%define aes_hw_encrypt ring_core_0_17_3_aes_hw_encrypt +%define aes_hw_set_encrypt_key ring_core_0_17_3_aes_hw_set_encrypt_key +%define aes_nohw_ctr32_encrypt_blocks ring_core_0_17_3_aes_nohw_ctr32_encrypt_blocks +%define aes_nohw_encrypt ring_core_0_17_3_aes_nohw_encrypt +%define aes_nohw_set_encrypt_key ring_core_0_17_3_aes_nohw_set_encrypt_key +%define aesni_gcm_decrypt ring_core_0_17_3_aesni_gcm_decrypt +%define aesni_gcm_encrypt ring_core_0_17_3_aesni_gcm_encrypt +%define bn_from_montgomery_in_place ring_core_0_17_3_bn_from_montgomery_in_place +%define bn_gather5 ring_core_0_17_3_bn_gather5 +%define bn_mul_mont ring_core_0_17_3_bn_mul_mont +%define bn_mul_mont_gather5 ring_core_0_17_3_bn_mul_mont_gather5 +%define bn_neg_inv_mod_r_u64 ring_core_0_17_3_bn_neg_inv_mod_r_u64 +%define bn_power5 ring_core_0_17_3_bn_power5 +%define bn_scatter5 ring_core_0_17_3_bn_scatter5 +%define bn_sqr8x_internal ring_core_0_17_3_bn_sqr8x_internal +%define bn_sqrx8x_internal ring_core_0_17_3_bn_sqrx8x_internal +%define bsaes_ctr32_encrypt_blocks ring_core_0_17_3_bsaes_ctr32_encrypt_blocks +%define bssl_constant_time_test_conditional_memcpy ring_core_0_17_3_bssl_constant_time_test_conditional_memcpy +%define bssl_constant_time_test_conditional_memxor ring_core_0_17_3_bssl_constant_time_test_conditional_memxor +%define bssl_constant_time_test_main ring_core_0_17_3_bssl_constant_time_test_main +%define chacha20_poly1305_open ring_core_0_17_3_chacha20_poly1305_open +%define chacha20_poly1305_seal ring_core_0_17_3_chacha20_poly1305_seal +%define fiat_curve25519_adx_mul ring_core_0_17_3_fiat_curve25519_adx_mul +%define fiat_curve25519_adx_square ring_core_0_17_3_fiat_curve25519_adx_square +%define gcm_ghash_avx ring_core_0_17_3_gcm_ghash_avx +%define gcm_ghash_clmul ring_core_0_17_3_gcm_ghash_clmul +%define gcm_ghash_neon ring_core_0_17_3_gcm_ghash_neon +%define gcm_gmult_clmul ring_core_0_17_3_gcm_gmult_clmul +%define gcm_gmult_neon ring_core_0_17_3_gcm_gmult_neon +%define gcm_init_avx ring_core_0_17_3_gcm_init_avx +%define gcm_init_clmul ring_core_0_17_3_gcm_init_clmul +%define gcm_init_neon ring_core_0_17_3_gcm_init_neon +%define k25519Precomp ring_core_0_17_3_k25519Precomp +%define limbs_mul_add_limb ring_core_0_17_3_limbs_mul_add_limb +%define little_endian_bytes_from_scalar ring_core_0_17_3_little_endian_bytes_from_scalar +%define ecp_nistz256_neg ring_core_0_17_3_ecp_nistz256_neg +%define ecp_nistz256_select_w5 ring_core_0_17_3_ecp_nistz256_select_w5 +%define ecp_nistz256_select_w7 ring_core_0_17_3_ecp_nistz256_select_w7 +%define nistz384_point_add ring_core_0_17_3_nistz384_point_add +%define nistz384_point_double ring_core_0_17_3_nistz384_point_double +%define nistz384_point_mul ring_core_0_17_3_nistz384_point_mul +%define p256_mul_mont ring_core_0_17_3_p256_mul_mont +%define p256_point_add ring_core_0_17_3_p256_point_add +%define p256_point_add_affine ring_core_0_17_3_p256_point_add_affine +%define p256_point_double ring_core_0_17_3_p256_point_double +%define p256_point_mul ring_core_0_17_3_p256_point_mul +%define p256_point_mul_base ring_core_0_17_3_p256_point_mul_base +%define p256_scalar_mul_mont ring_core_0_17_3_p256_scalar_mul_mont +%define p256_scalar_sqr_rep_mont ring_core_0_17_3_p256_scalar_sqr_rep_mont +%define p256_sqr_mont ring_core_0_17_3_p256_sqr_mont +%define p384_elem_div_by_2 ring_core_0_17_3_p384_elem_div_by_2 +%define p384_elem_mul_mont ring_core_0_17_3_p384_elem_mul_mont +%define p384_elem_neg ring_core_0_17_3_p384_elem_neg +%define p384_elem_sub ring_core_0_17_3_p384_elem_sub +%define p384_scalar_mul_mont ring_core_0_17_3_p384_scalar_mul_mont +%define openssl_poly1305_neon2_addmulmod ring_core_0_17_3_openssl_poly1305_neon2_addmulmod +%define openssl_poly1305_neon2_blocks ring_core_0_17_3_openssl_poly1305_neon2_blocks +%define sha256_block_data_order ring_core_0_17_3_sha256_block_data_order +%define sha512_block_data_order ring_core_0_17_3_sha512_block_data_order +%define vpaes_ctr32_encrypt_blocks ring_core_0_17_3_vpaes_ctr32_encrypt_blocks +%define vpaes_encrypt ring_core_0_17_3_vpaes_encrypt +%define vpaes_encrypt_key_to_bsaes ring_core_0_17_3_vpaes_encrypt_key_to_bsaes +%define vpaes_set_encrypt_key ring_core_0_17_3_vpaes_set_encrypt_key +%define x25519_NEON ring_core_0_17_3_x25519_NEON +%define x25519_fe_invert ring_core_0_17_3_x25519_fe_invert +%define x25519_fe_isnegative ring_core_0_17_3_x25519_fe_isnegative +%define x25519_fe_mul_ttt ring_core_0_17_3_x25519_fe_mul_ttt +%define x25519_fe_neg ring_core_0_17_3_x25519_fe_neg +%define x25519_fe_tobytes ring_core_0_17_3_x25519_fe_tobytes +%define x25519_ge_double_scalarmult_vartime ring_core_0_17_3_x25519_ge_double_scalarmult_vartime +%define x25519_ge_frombytes_vartime ring_core_0_17_3_x25519_ge_frombytes_vartime +%define x25519_ge_scalarmult_base ring_core_0_17_3_x25519_ge_scalarmult_base +%define x25519_ge_scalarmult_base_adx ring_core_0_17_3_x25519_ge_scalarmult_base_adx +%define x25519_public_from_private_generic_masked ring_core_0_17_3_x25519_public_from_private_generic_masked +%define x25519_sc_mask ring_core_0_17_3_x25519_sc_mask +%define x25519_sc_muladd ring_core_0_17_3_x25519_sc_muladd +%define x25519_sc_reduce ring_core_0_17_3_x25519_sc_reduce +%define x25519_scalar_mult_adx ring_core_0_17_3_x25519_scalar_mult_adx +%define x25519_scalar_mult_generic_masked ring_core_0_17_3_x25519_scalar_mult_generic_masked %endif %endif diff -Nru temporalio-1.3.0/vendor/ring/src/aead/aes_gcm.rs temporalio-1.3.0/vendor/ring/src/aead/aes_gcm.rs --- temporalio-1.3.0/vendor/ring/src/aead/aes_gcm.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring/src/aead/aes_gcm.rs 2023-10-30 19:40:00.000000000 +0000 @@ -17,10 +17,7 @@ block::{Block, BLOCK_LEN}, gcm, shift, Aad, Nonce, Tag, }; -use crate::{ - aead, cpu, error, - polyfill::{self}, -}; +use crate::{aead, cpu, error, polyfill}; use core::ops::RangeFrom; /// AES-128 in GCM mode with 128-bit tags and 96 bit nonces. @@ -245,13 +242,11 @@ // Authenticate the final block containing the input lengths. let aad_bits = polyfill::u64_from_usize(aad_len) << 3; let ciphertext_bits = polyfill::u64_from_usize(in_out_len) << 3; - gcm_ctx.update_block(Block::from( - [aad_bits, ciphertext_bits].map(u64::to_be_bytes), - )); + gcm_ctx.update_block(Block::from([aad_bits, ciphertext_bits])); // Finalize the tag and return it. gcm_ctx.pre_finish(|pre_tag| { - let encrypted_iv = aes_key.encrypt_block(tag_iv.into_block_less_safe()); + let encrypted_iv = aes_key.encrypt_block(Block::from(tag_iv.as_bytes_less_safe())); let tag = pre_tag ^ encrypted_iv; Tag(*tag.as_ref()) }) diff -Nru temporalio-1.3.0/vendor/ring/src/aead/aes.rs temporalio-1.3.0/vendor/ring/src/aead/aes.rs --- temporalio-1.3.0/vendor/ring/src/aead/aes.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring/src/aead/aes.rs 2023-10-30 19:40:00.000000000 +0000 @@ -20,9 +20,9 @@ use crate::{ bits::BitLength, c, cpu, - endian::BigEndian, + endian::{ArrayEncoding, BigEndian}, error, - polyfill::{self, ArraySplitMap}, + polyfill::{self, ChunksFixed}, }; use core::ops::RangeFrom; @@ -202,7 +202,7 @@ #[inline] pub fn encrypt_iv_xor_block(&self, iv: Iv, input: Block) -> Block { - let encrypted_iv = self.encrypt_block(iv.into_block_less_safe()); + let encrypted_iv = self.encrypt_block(Block::from(iv.as_bytes_less_safe())); encrypted_iv ^ input } @@ -327,13 +327,12 @@ impl Counter { pub fn one(nonce: Nonce) -> Self { - let [n0, n1, n2] = nonce.as_ref().array_split_map(BigEndian::::from); - Self([n0, n1, n2, 1.into()]) + let nonce = nonce.as_ref().chunks_fixed(); + Self([nonce[0].into(), nonce[1].into(), nonce[2].into(), 1.into()]) } pub fn increment(&mut self) -> Iv { - let iv: [[u8; 4]; 4] = self.0.map(Into::into); - let iv = Iv(Block::from(iv)); + let iv = Iv(self.0); self.increment_by_less_safe(1); iv } @@ -347,26 +346,22 @@ /// The IV for a single block encryption. /// /// Intentionally not `Clone` to ensure each is used only once. -pub struct Iv(Block); +pub struct Iv([BigEndian; 4]); impl From for Iv { fn from(counter: Counter) -> Self { - let iv: [[u8; 4]; 4] = counter.0.map(Into::into); - Self(Block::from(iv)) + Self(counter.0) } } impl Iv { - /// "Less safe" because it defeats attempts to use the type system to prevent reuse of the IV. - #[inline] - pub(super) fn into_block_less_safe(self) -> Block { - self.0 + pub(super) fn as_bytes_less_safe(&self) -> &[u8; 16] { + self.0.as_byte_array() } } #[repr(C)] // Only so `Key` can be `#[repr(C)]` #[derive(Clone, Copy)] -#[allow(clippy::upper_case_acronyms)] pub enum Implementation { #[cfg(any( target_arch = "aarch64", diff -Nru temporalio-1.3.0/vendor/ring/src/aead/block.rs temporalio-1.3.0/vendor/ring/src/aead/block.rs --- temporalio-1.3.0/vendor/ring/src/aead/block.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring/src/aead/block.rs 2023-10-30 19:40:00.000000000 +0000 @@ -12,19 +12,19 @@ // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -use crate::polyfill::ArrayFlatten; +use crate::endian::*; use core::ops::{BitXor, BitXorAssign}; #[repr(transparent)] #[derive(Copy, Clone)] -pub struct Block([u8; 16]); +pub struct Block([BigEndian; 2]); pub const BLOCK_LEN: usize = 16; impl Block { #[inline] pub fn zero() -> Self { - Self([0; 16]) + Self([Encoding::ZERO; 2]) } #[inline] @@ -42,11 +42,23 @@ } } +impl From<[u64; 2]> for Block { + #[inline] + fn from(other: [u64; 2]) -> Self { + Self([other[0].into(), other[1].into()]) + } +} + +impl From for [u64; 2] { + #[inline] + fn from(Block(components): Block) -> Self { + components.map(Into::into) + } +} + impl BitXorAssign for Block { #[inline] fn bitxor_assign(&mut self, a: Self) { - // Relies heavily on optimizer to optimize this into word- or vector- - // level XOR. for (r, a) in self.0.iter_mut().zip(a.0.iter()) { *r ^= *a; } @@ -64,26 +76,16 @@ } } -impl From for Block -where - T: ArrayFlatten, -{ - #[inline] - fn from(bytes: T) -> Self { - Self(bytes.array_flatten()) - } -} - impl From<&'_ [u8; BLOCK_LEN]> for Block { #[inline] fn from(bytes: &[u8; BLOCK_LEN]) -> Self { - Self(*bytes) + Self(FromByteArray::from_byte_array(bytes)) } } impl AsRef<[u8; BLOCK_LEN]> for Block { #[inline] fn as_ref(&self) -> &[u8; BLOCK_LEN] { - &self.0 + self.0.as_byte_array() } } diff -Nru temporalio-1.3.0/vendor/ring/src/aead/chacha/fallback.rs temporalio-1.3.0/vendor/ring/src/aead/chacha/fallback.rs --- temporalio-1.3.0/vendor/ring/src/aead/chacha/fallback.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring/src/aead/chacha/fallback.rs 2023-10-30 19:40:00.000000000 +0000 @@ -16,6 +16,7 @@ // Adapted from the BoringSSL crypto/chacha/chacha.c. use super::{Counter, Key, BLOCK_LEN}; +use crate::polyfill::ChunksFixedMut; use core::ops::RangeFrom; pub(super) fn ChaCha20_ctr32( @@ -81,10 +82,9 @@ *x = x.wrapping_add(*input); } - output - .chunks_exact_mut(core::mem::size_of::()) - .zip(x.iter()) - .for_each(|(output, &x)| output.copy_from_slice(&x.to_le_bytes())); + for (output, &x) in ChunksFixedMut::<[u8; 4]>::chunks_fixed_mut(output).zip(x.iter()) { + *output = u32::to_le_bytes(x) + } } #[inline(always)] diff -Nru temporalio-1.3.0/vendor/ring/src/aead/chacha20_poly1305_openssh.rs temporalio-1.3.0/vendor/ring/src/aead/chacha20_poly1305_openssh.rs --- temporalio-1.3.0/vendor/ring/src/aead/chacha20_poly1305_openssh.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring/src/aead/chacha20_poly1305_openssh.rs 2023-10-30 19:40:00.000000000 +0000 @@ -36,7 +36,7 @@ polyfill::ChunksFixed, Nonce, Tag, }; -use crate::{constant_time, error}; +use crate::{constant_time, endian::*, error}; /// A key for sealing packets. pub struct SealingKey { @@ -161,9 +161,12 @@ } fn make_counter(sequence_number: u32) -> Counter { - let [s0, s1, s2, s3] = sequence_number.to_be_bytes(); - let nonce = [0, 0, 0, 0, 0, 0, 0, 0, s0, s1, s2, s3]; - Counter::zero(Nonce::assume_unique_for_key(nonce)) + let nonce = [ + BigEndian::ZERO, + BigEndian::ZERO, + BigEndian::from(sequence_number), + ]; + Counter::zero(Nonce::assume_unique_for_key(*(nonce.as_byte_array()))) } /// The length of key. diff -Nru temporalio-1.3.0/vendor/ring/src/aead/chacha20_poly1305.rs temporalio-1.3.0/vendor/ring/src/aead/chacha20_poly1305.rs --- temporalio-1.3.0/vendor/ring/src/aead/chacha20_poly1305.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring/src/aead/chacha20_poly1305.rs 2023-10-30 19:40:00.000000000 +0000 @@ -16,10 +16,7 @@ chacha::{self, Counter, Iv}, poly1305, Aad, Nonce, Tag, }; -use crate::{ - aead, cpu, error, - polyfill::{self, ArrayFlatten}, -}; +use crate::{aead, cpu, endian::*, error, polyfill}; use core::ops::RangeFrom; /// ChaCha20-Poly1305 as described in [RFC 8439]. @@ -210,10 +207,13 @@ } fn finish(mut auth: poly1305::Context, aad_len: usize, in_out_len: usize) -> Tag { - let block: [[u8; 8]; 2] = [aad_len, in_out_len] - .map(polyfill::u64_from_usize) - .map(u64::to_le_bytes); - auth.update(&block.array_flatten()); + auth.update( + [ + LittleEndian::from(polyfill::u64_from_usize(aad_len)), + LittleEndian::from(polyfill::u64_from_usize(in_out_len)), + ] + .as_byte_array(), + ); auth.finish() } diff -Nru temporalio-1.3.0/vendor/ring/src/aead/chacha.rs temporalio-1.3.0/vendor/ring/src/aead/chacha.rs --- temporalio-1.3.0/vendor/ring/src/aead/chacha.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring/src/aead/chacha.rs 2023-10-30 19:40:00.000000000 +0000 @@ -14,7 +14,7 @@ // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. use super::{quic::Sample, Nonce}; -use crate::cpu; +use crate::{cpu, polyfill::ChunksFixed}; #[cfg(any( test, @@ -27,7 +27,6 @@ ))] mod fallback; -use crate::polyfill::ArraySplitMap; use core::ops::RangeFrom; #[derive(Clone)] @@ -38,8 +37,9 @@ impl Key { pub(super) fn new(value: [u8; KEY_LEN], cpu_features: cpu::Features) -> Self { + let value: &[[u8; 4]; KEY_LEN / 4] = value.chunks_fixed(); Self { - words: value.array_split_map(u32::from_le_bytes), + words: value.map(u32::from_le_bytes), cpu_features, } } @@ -159,8 +159,13 @@ } fn from_nonce_and_ctr(nonce: Nonce, ctr: u32) -> Self { - let [n0, n1, n2] = nonce.as_ref().array_split_map(u32::from_le_bytes); - Self([ctr, n0, n1, n2]) + let nonce = nonce.as_ref().chunks_fixed(); + Self([ + ctr, + u32::from_le_bytes(nonce[0]), + u32::from_le_bytes(nonce[1]), + u32::from_le_bytes(nonce[2]), + ]) } pub fn increment(&mut self) -> Iv { @@ -192,7 +197,8 @@ impl Iv { fn assume_unique_for_key(value: [u8; 16]) -> Self { - Self(value.array_split_map(u32::from_le_bytes)) + let value: &[[u8; 4]; 4] = value.chunks_fixed(); + Self(value.map(u32::from_le_bytes)) } fn into_counter_for_single_block_less_safe(self) -> Counter { diff -Nru temporalio-1.3.0/vendor/ring/src/aead/gcm/gcm_nohw.rs temporalio-1.3.0/vendor/ring/src/aead/gcm/gcm_nohw.rs --- temporalio-1.3.0/vendor/ring/src/aead/gcm/gcm_nohw.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring/src/aead/gcm/gcm_nohw.rs 2023-10-30 19:40:00.000000000 +0000 @@ -23,7 +23,7 @@ // Unlike the BearSSL notes, we use u128 in the 64-bit implementation. use super::{Block, Xi, BLOCK_LEN}; -use crate::polyfill::ArraySplitMap; +use crate::polyfill::ChunksFixed; #[cfg(target_pointer_width = "64")] fn gcm_mul64_nohw(a: u64, b: u64) -> (u64, u64) { @@ -224,10 +224,10 @@ pub(super) fn ghash(xi: &mut Xi, h: super::u128, input: &[[u8; BLOCK_LEN]]) { with_swapped_xi(xi, |swapped| { - input.iter().for_each(|&input| { - let input = input.array_split_map(u64::from_be_bytes); - swapped[0] ^= input[1]; - swapped[1] ^= input[0]; + input.iter().for_each(|input| { + let input: &[[u8; 8]; 2] = input.chunks_fixed(); + swapped[0] ^= u64::from_be_bytes(input[1]); + swapped[1] ^= u64::from_be_bytes(input[0]); gcm_polyval_nohw(swapped, h); }); }); @@ -235,9 +235,8 @@ #[inline] fn with_swapped_xi(Xi(xi): &mut Xi, f: impl FnOnce(&mut [u64; 2])) { - let unswapped: [u64; 2] = xi.as_ref().array_split_map(u64::from_be_bytes); + let unswapped: [u64; 2] = (*xi).into(); let mut swapped: [u64; 2] = [unswapped[1], unswapped[0]]; f(&mut swapped); - let reswapped = [swapped[1], swapped[0]]; - *xi = Block::from(reswapped.map(u64::to_be_bytes)) + *xi = Block::from([swapped[1], swapped[0]]) } diff -Nru temporalio-1.3.0/vendor/ring/src/aead/gcm.rs temporalio-1.3.0/vendor/ring/src/aead/gcm.rs --- temporalio-1.3.0/vendor/ring/src/aead/gcm.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring/src/aead/gcm.rs 2023-10-30 19:40:00.000000000 +0000 @@ -16,7 +16,7 @@ block::{Block, BLOCK_LEN}, Aad, }; -use crate::{cpu, polyfill::ArraySplitMap}; +use crate::cpu; use core::ops::BitXorAssign; #[cfg(not(target_arch = "aarch64"))] @@ -30,7 +30,7 @@ impl Key { pub(super) fn new(h_be: Block, cpu_features: cpu::Features) -> Self { - let h: [u64; 2] = h_be.as_ref().array_split_map(u64::from_be_bytes); + let h: [u64; 2] = h_be.into(); let mut key = Self { h_table: HTable { @@ -294,7 +294,6 @@ Htable: HTable, } -#[allow(clippy::upper_case_acronyms)] enum Implementation { #[cfg(any( target_arch = "aarch64", diff -Nru temporalio-1.3.0/vendor/ring/src/arithmetic/bigint.rs temporalio-1.3.0/vendor/ring/src/arithmetic/bigint.rs --- temporalio-1.3.0/vendor/ring/src/arithmetic/bigint.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring/src/arithmetic/bigint.rs 2023-10-30 19:40:00.000000000 +0000 @@ -562,25 +562,66 @@ table.split_at_mut(TABLE_ENTRIES * num_limbs) }; - fn scatter(table: &mut [Limb], acc: &[Limb], i: Window, num_limbs: usize) { + fn entry(table: &[Limb], i: usize, num_limbs: usize) -> &[Limb] { + &table[(i * num_limbs)..][..num_limbs] + } + fn entry_mut(table: &mut [Limb], i: usize, num_limbs: usize) -> &mut [Limb] { + &mut table[(i * num_limbs)..][..num_limbs] + } + + const ACC: usize = 0; // `tmp` in OpenSSL + const BASE: usize = ACC + 1; // `am` in OpenSSL + const M: usize = BASE + 1; // `np` in OpenSSL + + entry_mut(state, BASE, num_limbs).copy_from_slice(&base.limbs); + entry_mut(state, M, num_limbs).copy_from_slice(m.limbs()); + + fn scatter(table: &mut [Limb], state: &[Limb], i: Window, num_limbs: usize) { prefixed_extern! { fn bn_scatter5(a: *const Limb, a_len: c::size_t, table: *mut Limb, i: Window); } - unsafe { bn_scatter5(acc.as_ptr(), num_limbs, table.as_mut_ptr(), i) } + unsafe { + bn_scatter5( + entry(state, ACC, num_limbs).as_ptr(), + num_limbs, + table.as_mut_ptr(), + i, + ) + } } - fn gather(table: &[Limb], acc: &mut [Limb], i: Window, num_limbs: usize) { + fn gather(table: &[Limb], state: &mut [Limb], i: Window, num_limbs: usize) { prefixed_extern! { fn bn_gather5(r: *mut Limb, a_len: c::size_t, table: *const Limb, i: Window); } - unsafe { bn_gather5(acc.as_mut_ptr(), num_limbs, table.as_ptr(), i) } + unsafe { + bn_gather5( + entry_mut(state, ACC, num_limbs).as_mut_ptr(), + num_limbs, + table.as_ptr(), + i, + ) + } + } + + fn gather_square( + table: &[Limb], + state: &mut [Limb], + n0: &N0, + i: Window, + num_limbs: usize, + cpu_features: cpu::Features, + ) { + gather(table, state, i, num_limbs); + assert_eq!(ACC, 0); + let (acc, rest) = state.split_at_mut(num_limbs); + let m = entry(rest, M - 1, num_limbs); + limbs_mont_square(acc, m, n0, cpu_features); } - fn limbs_mul_mont_gather5_amm( + fn gather_mul_base_amm( table: &[Limb], - acc: &mut [Limb], - base: &[Limb], - m: &[Limb], + state: &mut [Limb], n0: &N0, i: Window, num_limbs: usize, @@ -598,10 +639,10 @@ } unsafe { bn_mul_mont_gather5( - acc.as_mut_ptr(), - base.as_ptr(), + entry_mut(state, ACC, num_limbs).as_mut_ptr(), + entry(state, BASE, num_limbs).as_ptr(), table.as_ptr(), - m.as_ptr(), + entry(state, M, num_limbs).as_ptr(), n0, num_limbs, i, @@ -609,14 +650,7 @@ } } - fn power_amm( - table: &[Limb], - acc: &mut [Limb], - m_cached: &[Limb], - n0: &N0, - i: Window, - num_limbs: usize, - ) { + fn power_amm(table: &[Limb], state: &mut [Limb], n0: &N0, i: Window, num_limbs: usize) { prefixed_extern! { fn bn_power5( r: *mut Limb, @@ -630,10 +664,10 @@ } unsafe { bn_power5( - acc.as_mut_ptr(), - acc.as_ptr(), + entry_mut(state, ACC, num_limbs).as_mut_ptr(), + entry_mut(state, ACC, num_limbs).as_mut_ptr(), table.as_ptr(), - m_cached.as_ptr(), + entry(state, M, num_limbs).as_ptr(), n0, num_limbs, i, @@ -641,81 +675,42 @@ } } - // These are named `(tmp, am, np)` in BoringSSL. - let (acc, base_cached, m_cached): (&mut [Limb], &[Limb], &[Limb]) = { - let (acc, rest) = state.split_at_mut(num_limbs); - let (base_cached, rest) = rest.split_at_mut(num_limbs); - - // Upstream, the input `base` is not Montgomery-encoded, so they compute a - // Montgomery-encoded copy and store it here. - base_cached.copy_from_slice(&base.limbs); - - let m_cached = &mut rest[..num_limbs]; - // "To improve cache locality" according to upstream. - m_cached.copy_from_slice(m.limbs()); - - (acc, base_cached, m_cached) - }; - - let n0 = m.n0(); - - // Fill in all the powers of 2 of `acc` into the table using only squaring and without any - // gathering, storing the last calculated power into `acc`. - fn scatter_powers_of_2( - table: &mut [Limb], - acc: &mut [Limb], - m_cached: &[Limb], - n0: &N0, - mut i: Window, - num_limbs: usize, - cpu_features: cpu::Features, - ) { - loop { - scatter(table, acc, i, num_limbs); - i *= 2; - if i >= (TABLE_ENTRIES as Window) { - break; - } - limbs_mont_square(acc, m_cached, n0, cpu_features); - } - } - - // All entries in `table` will be Montgomery encoded. - - // acc = table[0] = base**0 (i.e. 1). - // `acc` was initialized to zero and hasn't changed. Change it to 1 and then Montgomery - // encode it. - debug_assert!(acc.iter().all(|&value| value == 0)); - acc[0] = 1; - limbs_mont_mul(acc, &m.oneRR().0.limbs, m_cached, n0, cpu_features); - scatter(table, acc, 0, num_limbs); - - // acc = base**1 (i.e. base). - acc.copy_from_slice(base_cached); - - // Fill in entries 1, 2, 4, 8, 16. - scatter_powers_of_2(table, acc, m_cached, n0, 1, num_limbs, cpu_features); - // Fill in entries 3, 6, 12, 24; 5, 10, 20, 30; 7, 14, 28; 9, 18; 11, 22; 13, 26; 15, 30; - // 17; 19; 21; 23; 25; 27; 29; 31. - for i in (3..(TABLE_ENTRIES as Window)).step_by(2) { - limbs_mul_mont_gather5_amm(table, acc, base_cached, m_cached, n0, i - 1, num_limbs); - scatter_powers_of_2(table, acc, m_cached, n0, i, num_limbs, cpu_features); + // table[0] = base**0. + { + let acc = entry_mut(state, ACC, num_limbs); + acc[0] = 1; + limbs_mont_mul(acc, &m.oneRR().0.limbs, m.limbs(), m.n0(), cpu_features); + } + scatter(table, state, 0, num_limbs); + + // table[1] = base**1. + entry_mut(state, ACC, num_limbs).copy_from_slice(&base.limbs); + scatter(table, state, 1, num_limbs); + + for i in 2..(TABLE_ENTRIES as Window) { + if i % 2 == 0 { + // TODO: Optimize this to avoid gathering + gather_square(table, state, m.n0(), i / 2, num_limbs, cpu_features); + } else { + gather_mul_base_amm(table, state, m.n0(), i - 1, num_limbs) + }; + scatter(table, state, i, num_limbs); } - let acc = limb::fold_5_bit_windows( + let state = limb::fold_5_bit_windows( exponent.limbs(), |initial_window| { - gather(table, acc, initial_window, num_limbs); - acc + gather(table, state, initial_window, num_limbs); + state }, - |acc, window| { - power_amm(table, acc, m_cached, n0, window, num_limbs); - acc + |state, window| { + power_amm(table, state, m.n0(), window, num_limbs); + state }, ); let mut r_amm = base.limbs; - r_amm.copy_from_slice(acc); + r_amm.copy_from_slice(entry(state, ACC, num_limbs)); Ok(from_montgomery_amm(r_amm, m)) } diff -Nru temporalio-1.3.0/vendor/ring/src/arithmetic/constant.rs temporalio-1.3.0/vendor/ring/src/arithmetic/constant.rs --- temporalio-1.3.0/vendor/ring/src/arithmetic/constant.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring/src/arithmetic/constant.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,26 +1,13 @@ -use crate::limb::Limb; - -const fn parse_digit(d: u8) -> u8 { - match d.to_ascii_lowercase() { - b'0'..=b'9' => d - b'0', - b'a'..=b'f' => d - b'a' + 10, - _ => panic!(), - } +#[cfg(target_pointer_width = "32")] +macro_rules! limbs { + ( $($limb:expr),+ ) => { + [ $($limb),+ ] + }; } -// TODO: this would be nicer as a trait, but currently traits don't support const functions -pub const fn limbs_from_hex(hex: &str) -> [Limb; LIMBS] { - let hex = hex.as_bytes(); - let mut limbs = [0; LIMBS]; - let limb_nibbles = core::mem::size_of::() * 2; - let mut i = 0; - - while i < hex.len() { - let char = hex[hex.len() - 1 - i]; - let val = parse_digit(char); - limbs[i / limb_nibbles] |= (val as Limb) << ((i % limb_nibbles) * 4); - i += 1; - } - - limbs +#[cfg(target_pointer_width = "64")] +macro_rules! limbs { + ( $($limb_lo:expr, $limb_hi:expr),+) => { + [ $((($limb_hi | 0u64) << 32) | $limb_lo),+ ] + }; } diff -Nru temporalio-1.3.0/vendor/ring/src/arithmetic.rs temporalio-1.3.0/vendor/ring/src/arithmetic.rs --- temporalio-1.3.0/vendor/ring/src/arithmetic.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring/src/arithmetic.rs 2023-10-30 19:40:00.000000000 +0000 @@ -12,7 +12,8 @@ // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -mod constant; +#[macro_use] +pub mod constant; #[cfg(feature = "alloc")] pub mod bigint; @@ -25,5 +26,3 @@ #[allow(dead_code)] const BIGINT_MODULUS_MAX_LIMBS: usize = 8192 / crate::limb::LIMB_BITS; - -pub use constant::limbs_from_hex; diff -Nru temporalio-1.3.0/vendor/ring/src/ec/curve25519/scalar.rs temporalio-1.3.0/vendor/ring/src/ec/curve25519/scalar.rs --- temporalio-1.3.0/vendor/ring/src/ec/curve25519/scalar.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring/src/ec/curve25519/scalar.rs 2023-10-30 19:40:00.000000000 +0000 @@ -12,7 +12,7 @@ // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -use crate::{arithmetic::limbs_from_hex, digest, error, limb}; +use crate::{digest, error, limb}; #[repr(transparent)] pub struct Scalar([u8; SCALAR_LEN]); @@ -24,7 +24,7 @@ // that not in the range [0, n). pub fn from_bytes_checked(bytes: [u8; SCALAR_LEN]) -> Result { const ORDER: [limb::Limb; SCALAR_LEN / limb::LIMB_BYTES] = - limbs_from_hex("1000000000000000000000000000000014def9dea2f79cd65812631a5cf5d3ed"); + limbs![0x5cf5d3ed, 0x5812631a, 0xa2f79cd6, 0x14def9de, 0, 0, 0, 0x10000000]; // `bytes` is in little-endian order. let mut reversed = bytes; diff -Nru temporalio-1.3.0/vendor/ring/src/ec/curve25519.rs temporalio-1.3.0/vendor/ring/src/ec/curve25519.rs --- temporalio-1.3.0/vendor/ring/src/ec/curve25519.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring/src/ec/curve25519.rs 2023-10-30 19:40:00.000000000 +0000 @@ -16,6 +16,7 @@ pub mod ed25519; +#[cfg(not(target_arch = "wasm32"))] pub mod x25519; mod ops; diff -Nru temporalio-1.3.0/vendor/ring/src/ec/keys.rs temporalio-1.3.0/vendor/ring/src/ec/keys.rs --- temporalio-1.3.0/vendor/ring/src/ec/keys.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring/src/ec/keys.rs 2023-10-30 19:40:00.000000000 +0000 @@ -23,6 +23,7 @@ pub struct Seed { bytes: [u8; SEED_MAX_BYTES], curve: &'static Curve, + #[cfg_attr(target_arch = "wasm32", allow(dead_code))] pub(crate) cpu_features: cpu::Features, } diff -Nru temporalio-1.3.0/vendor/ring/src/ec/suite_b/ecdsa/verification.rs temporalio-1.3.0/vendor/ring/src/ec/suite_b/ecdsa/verification.rs --- temporalio-1.3.0/vendor/ring/src/ec/suite_b/ecdsa/verification.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring/src/ec/suite_b/ecdsa/verification.rs 2023-10-30 19:40:00.000000000 +0000 @@ -123,7 +123,7 @@ // NSA Guide Step 6: "Compute the elliptic curve point // R = (xR, yR) = u1*G + u2*Q, using EC scalar multiplication and EC // addition. If R is equal to the point at infinity, output INVALID." - let product = (self.ops.twin_mul)(&u1, &u2, &peer_pub_key); + let product = twin_mul(self.ops.private_key_ops, &u1, &u2, &peer_pub_key); // Verify that the point we computed is on the curve; see // `verify_affine_point_is_on_the_curve_scaled` for details on why. It @@ -158,7 +158,7 @@ } if self.ops.elem_less_than(&r, &self.ops.q_minus_n) { self.ops - .scalar_ops + .private_key_ops .common .elem_add(&mut r, &public_key_ops.common.n); if sig_r_equals_x(self.ops, &r, &x, &z2) { @@ -193,6 +193,18 @@ }) } +fn twin_mul( + ops: &PrivateKeyOps, + g_scalar: &Scalar, + p_scalar: &Scalar, + p_xy: &(Elem, Elem), +) -> Point { + // XXX: Inefficient. TODO: implement interleaved wNAF multiplication. + let scaled_g = ops.point_mul_base(g_scalar); + let scaled_p = ops.point_mul(p_scalar, p_xy); + ops.common.point_sum(&scaled_g, &scaled_p) +} + /// Verification of fixed-length (PKCS#11 style) ECDSA signatures using the /// P-256 curve and SHA-256. /// diff -Nru temporalio-1.3.0/vendor/ring/src/ec/suite_b/ops/elem.rs temporalio-1.3.0/vendor/ring/src/ec/suite_b/ops/elem.rs --- temporalio-1.3.0/vendor/ring/src/ec/suite_b/ops/elem.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring/src/ec/suite_b/ops/elem.rs 2023-10-30 19:40:00.000000000 +0000 @@ -13,10 +13,7 @@ // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. use crate::{ - arithmetic::{ - limbs_from_hex, - montgomery::{Encoding, ProductEncoding}, - }, + arithmetic::montgomery::{Encoding, ProductEncoding}, limb::{Limb, LIMB_BITS}, }; use core::marker::PhantomData; @@ -46,14 +43,6 @@ m: PhantomData, encoding: PhantomData, } - } - - pub const fn from_hex(hex: &str) -> Self { - Elem { - limbs: limbs_from_hex(hex), - m: PhantomData, - encoding: PhantomData, - } } } diff -Nru temporalio-1.3.0/vendor/ring/src/ec/suite_b/ops/p256.rs temporalio-1.3.0/vendor/ring/src/ec/suite_b/ops/p256.rs --- temporalio-1.3.0/vendor/ring/src/ec/suite_b/ops/p256.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring/src/ec/suite_b/ops/p256.rs 2023-10-30 19:40:00.000000000 +0000 @@ -16,17 +16,53 @@ elem::{binary_op, binary_op_assign}, elem_sqr_mul, elem_sqr_mul_acc, Modulus, *, }; +use core::marker::PhantomData; + +macro_rules! p256_limbs { + [ $($limb:expr),+ ] => { + limbs![$($limb),+, 0, 0, 0, 0] + }; +} pub static COMMON_OPS: CommonOps = CommonOps { num_limbs: 256 / LIMB_BITS, q: Modulus { - p: limbs_from_hex("ffffffff00000001000000000000000000000000ffffffffffffffffffffffff"), - rr: limbs_from_hex("4fffffffdfffffffffffffffefffffffbffffffff0000000000000003"), + p: p256_limbs![ + 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000001, + 0xffffffff + ], + rr: p256_limbs![ + 0x00000003, 0x00000000, 0xffffffff, 0xfffffffb, 0xfffffffe, 0xffffffff, 0xfffffffd, + 0x00000004 + ], + }, + + n: Elem { + limbs: p256_limbs![ + 0xfc632551, 0xf3b9cac2, 0xa7179e84, 0xbce6faad, 0xffffffff, 0xffffffff, 0x00000000, + 0xffffffff + ], + m: PhantomData, + encoding: PhantomData, // Unencoded + }, + + a: Elem { + limbs: p256_limbs![ + 0xfffffffc, 0xffffffff, 0xffffffff, 0x00000003, 0x00000000, 0x00000000, 0x00000004, + 0xfffffffc + ], + m: PhantomData, + encoding: PhantomData, // R + }, + b: Elem { + limbs: p256_limbs![ + 0x29c4bddf, 0xd89cdf62, 0x78843090, 0xacf005cd, 0xf7212ed6, 0xe5a220ab, 0x04874834, + 0xdc30061d + ], + m: PhantomData, + encoding: PhantomData, // R }, - n: Elem::from_hex("ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551"), - a: Elem::from_hex("fffffffc00000004000000000000000000000003fffffffffffffffffffffffc"), - b: Elem::from_hex("dc30061d04874834e5a220abf7212ed6acf005cd78843090d89cdf6229c4bddf"), elem_mul_mont: p256_mul_mont, elem_sqr_mont: p256_sqr_mont, @@ -114,45 +150,26 @@ pub static PUBLIC_SCALAR_OPS: PublicScalarOps = PublicScalarOps { scalar_ops: &SCALAR_OPS, public_key_ops: &PUBLIC_KEY_OPS, + private_key_ops: &PRIVATE_KEY_OPS, - #[cfg(any(target_arch = "aarch64", target_arch = "x86_64"))] - twin_mul: twin_mul_nistz256, - - #[cfg(not(any(target_arch = "aarch64", target_arch = "x86_64")))] - twin_mul: |g_scalar, p_scalar, p_xy| { - twin_mul_inefficient(&PRIVATE_KEY_OPS, g_scalar, p_scalar, p_xy) + q_minus_n: Elem { + limbs: p256_limbs![0x039cdaae, 0x0c46353d, 0x58e8617b, 0x43190553, 0, 0, 0, 0], + m: PhantomData, + encoding: PhantomData, // Unencoded }, - - q_minus_n: Elem::from_hex("4319055358e8617b0c46353d039cdaae"), }; -#[cfg(any(target_arch = "aarch64", target_arch = "x86_64"))] -fn twin_mul_nistz256(g_scalar: &Scalar, p_scalar: &Scalar, p_xy: &(Elem, Elem)) -> Point { - let scaled_g = point_mul_base_vartime(g_scalar); - let scaled_p = PRIVATE_KEY_OPS.point_mul(p_scalar, p_xy); - PRIVATE_KEY_OPS.common.point_sum(&scaled_g, &scaled_p) -} - -#[cfg(any(target_arch = "aarch64", target_arch = "x86_64"))] -fn point_mul_base_vartime(g_scalar: &Scalar) -> Point { - prefixed_extern! { - fn p256_point_mul_base_vartime(r: *mut Limb, // [3][COMMON_OPS.num_limbs] - g_scalar: *const Limb, // [COMMON_OPS.num_limbs] - ); - } - let mut scaled_g = Point::new_at_infinity(); - unsafe { - p256_point_mul_base_vartime(scaled_g.xyz.as_mut_ptr(), g_scalar.limbs.as_ptr()); - } - scaled_g -} - pub static PRIVATE_SCALAR_OPS: PrivateScalarOps = PrivateScalarOps { scalar_ops: &SCALAR_OPS, - oneRR_mod_n: Scalar::from_hex( - "66e12d94f3d956202845b2392b6bec594699799c49bd6fa683244c95be79eea2", - ), + oneRR_mod_n: Scalar { + limbs: p256_limbs![ + 0xbe79eea2, 0x83244c95, 0x49bd6fa6, 0x4699799c, 0x2b6bec59, 0x2845b239, 0xf3d95620, + 0x66e12d94 + ], + m: PhantomData, + encoding: PhantomData, // R + }, }; fn p256_scalar_inv_to_mont(a: &Scalar) -> Scalar { @@ -194,7 +211,10 @@ fn to_mont(a: &Scalar) -> Scalar { static N_RR: Scalar = Scalar { - limbs: PRIVATE_SCALAR_OPS.oneRR_mod_n.limbs, + limbs: p256_limbs![ + 0xbe79eea2, 0x83244c95, 0x49bd6fa6, 0x4699799c, 0x2b6bec59, 0x2845b239, 0xf3d95620, + 0x66e12d94 + ], m: PhantomData, encoding: PhantomData, }; @@ -311,17 +331,3 @@ rep: Limb, ); } - -#[cfg(test)] -mod tests { - #[cfg(any(target_arch = "aarch64", target_arch = "x86_64"))] - #[test] - fn p256_point_mul_base_vartime_test() { - use super::{super::tests::point_mul_base_tests, *}; - point_mul_base_tests( - &PRIVATE_KEY_OPS, - point_mul_base_vartime, - test_file!("p256_point_mul_base_tests.txt"), - ); - } -} diff -Nru temporalio-1.3.0/vendor/ring/src/ec/suite_b/ops/p384.rs temporalio-1.3.0/vendor/ring/src/ec/suite_b/ops/p384.rs --- temporalio-1.3.0/vendor/ring/src/ec/suite_b/ops/p384.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring/src/ec/suite_b/ops/p384.rs 2023-10-30 19:40:00.000000000 +0000 @@ -12,35 +12,65 @@ // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -use crate::arithmetic::limbs_from_hex; - use super::{ elem::{binary_op, binary_op_assign}, elem_sqr_mul, elem_sqr_mul_acc, Modulus, *, }; +use core::marker::PhantomData; + +macro_rules! p384_limbs { + [$($limb:expr),+] => { + limbs![$($limb),+] + }; +} pub static COMMON_OPS: CommonOps = CommonOps { num_limbs: 384 / LIMB_BITS, q: Modulus { - p: limbs_from_hex("fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff"), - rr: limbs_from_hex("10000000200000000fffffffe000000000000000200000000fffffffe00000001"), + p: p384_limbs![ + 0xffffffff, 0x00000000, 0x00000000, 0xffffffff, 0xfffffffe, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff + ], + rr: p384_limbs![1, 0xfffffffe, 0, 2, 0, 0xfffffffe, 0, 2, 1, 0, 0, 0], }, - n: Elem::from_hex("ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973"), - a: Elem::from_hex("fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfffffffc0000000000000003fffffffc"), - b: Elem::from_hex("cd08114b604fbff9b62b21f41f022094e3374bee94938ae277f2209b1920022ef729add87a4c32ec081188719d412dcc") -, + n: Elem { + limbs: p384_limbs![ + 0xccc52973, 0xecec196a, 0x48b0a77a, 0x581a0db2, 0xf4372ddf, 0xc7634d81, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff + ], + m: PhantomData, + encoding: PhantomData, // Unencoded + }, + + a: Elem { + limbs: p384_limbs![ + 0xfffffffc, 0x00000003, 0x00000000, 0xfffffffc, 0xfffffffb, 0xffffffff, 0xffffffff, + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff + ], + m: PhantomData, + encoding: PhantomData, // Unreduced + }, + b: Elem { + limbs: p384_limbs![ + 0x9d412dcc, 0x08118871, 0x7a4c32ec, 0xf729add8, 0x1920022e, 0x77f2209b, 0x94938ae2, + 0xe3374bee, 0x1f022094, 0xb62b21f4, 0x604fbff9, 0xcd08114b + ], + m: PhantomData, + encoding: PhantomData, // Unreduced + }, + elem_mul_mont: p384_elem_mul_mont, elem_sqr_mont: p384_elem_sqr_mont, - point_add_jacobian_impl: p384_point_add, + point_add_jacobian_impl: nistz384_point_add, }; pub static PRIVATE_KEY_OPS: PrivateKeyOps = PrivateKeyOps { common: &COMMON_OPS, elem_inv_squared: p384_elem_inv_squared, point_mul_base_impl: p384_point_mul_base_impl, - point_mul_impl: p384_point_mul, + point_mul_impl: nistz384_point_mul, }; fn p384_elem_inv_squared(a: &Elem) -> Elem { @@ -101,9 +131,23 @@ fn p384_point_mul_base_impl(a: &Scalar) -> Point { // XXX: Not efficient. TODO: Precompute multiples of the generator. - const GENERATOR: (Elem, Elem) = ( - Elem::from_hex("4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528"), - Elem::from_hex("2b78abc25a15c5e9dd8002263969a840c6c3521968f4ffd98bade7562e83b050a1bfa8bf7bb4a9ac23043dad4b03a4fe"), + static GENERATOR: (Elem, Elem) = ( + Elem { + limbs: p384_limbs![ + 0x49c0b528, 0x3dd07566, 0xa0d6ce38, 0x20e378e2, 0x541b4d6e, 0x879c3afc, 0x59a30eff, + 0x64548684, 0x614ede2b, 0x812ff723, 0x299e1513, 0x4d3aadc2 + ], + m: PhantomData, + encoding: PhantomData, + }, + Elem { + limbs: p384_limbs![ + 0x4b03a4fe, 0x23043dad, 0x7bb4a9ac, 0xa1bfa8bf, 0x2e83b050, 0x8bade756, 0x68f4ffd9, + 0xc6c35219, 0x3969a840, 0xdd800226, 0x5a15c5e9, 0x2b78abc2 + ], + m: PhantomData, + encoding: PhantomData, + }, ); PRIVATE_KEY_OPS.point_mul(a, &GENERATOR) @@ -122,18 +166,27 @@ pub static PUBLIC_SCALAR_OPS: PublicScalarOps = PublicScalarOps { scalar_ops: &SCALAR_OPS, public_key_ops: &PUBLIC_KEY_OPS, - twin_mul: |g_scalar, p_scalar, p_xy| { - twin_mul_inefficient(&PRIVATE_KEY_OPS, g_scalar, p_scalar, p_xy) - }, + private_key_ops: &PRIVATE_KEY_OPS, + + q_minus_n: Elem { + limbs: p384_limbs![ + 0x333ad68c, 0x1313e696, 0xb74f5885, 0xa7e5f24c, 0x0bc8d21f, 0x389cb27e, 0, 0, 0, 0, 0, + 0 + ], - q_minus_n: Elem::from_hex("389cb27e0bc8d21fa7e5f24cb74f58851313e696333ad68c"), + m: PhantomData, + encoding: PhantomData, // Unencoded + }, }; pub static PRIVATE_SCALAR_OPS: PrivateScalarOps = PrivateScalarOps { scalar_ops: &SCALAR_OPS, - oneRR_mod_n: Scalar::from_hex("c84ee012b39bf213fb05b7a28266895d40d49174aab1cc5bc3e483afcb82947ff3d81e5df1aa4192d319b2419b409a9"), - + oneRR_mod_n: Scalar { + limbs: N_RR_LIMBS, + m: PhantomData, + encoding: PhantomData, // R + }, }; fn p384_scalar_inv_to_mont(a: &Scalar) -> Scalar { @@ -180,7 +233,7 @@ fn to_mont(a: &Scalar) -> Scalar { static N_RR: Scalar = Scalar { - limbs: PRIVATE_SCALAR_OPS.oneRR_mod_n.limbs, + limbs: N_RR_LIMBS, m: PhantomData, encoding: PhantomData, }; @@ -279,6 +332,11 @@ p384_elem_mul_mont(r, a, a); } +const N_RR_LIMBS: [Limb; MAX_LIMBS] = p384_limbs![ + 0x19b409a9, 0x2d319b24, 0xdf1aa419, 0xff3d81e5, 0xfcb82947, 0xbc3e483a, 0x4aab1cc5, 0xd40d4917, + 0x28266895, 0x3fb05b7a, 0x2b39bf21, 0x0c84ee01 +]; + prefixed_extern! { fn p384_elem_mul_mont( r: *mut Limb, // [COMMON_OPS.num_limbs] @@ -286,12 +344,12 @@ b: *const Limb, // [COMMON_OPS.num_limbs] ); - fn p384_point_add( + fn nistz384_point_add( r: *mut Limb, // [3][COMMON_OPS.num_limbs] a: *const Limb, // [3][COMMON_OPS.num_limbs] b: *const Limb, // [3][COMMON_OPS.num_limbs] ); - fn p384_point_mul( + fn nistz384_point_mul( r: *mut Limb, // [3][COMMON_OPS.num_limbs] p_scalar: *const Limb, // [COMMON_OPS.num_limbs] p_x: *const Limb, // [COMMON_OPS.num_limbs] diff -Nru temporalio-1.3.0/vendor/ring/src/ec/suite_b/ops.rs temporalio-1.3.0/vendor/ring/src/ec/suite_b/ops.rs --- temporalio-1.3.0/vendor/ring/src/ec/suite_b/ops.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring/src/ec/suite_b/ops.rs 2023-10-30 19:40:00.000000000 +0000 @@ -12,7 +12,7 @@ // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -use crate::{arithmetic::limbs_from_hex, arithmetic::montgomery::*, c, error, limb::*}; +use crate::{arithmetic::montgomery::*, c, error, limb::*}; use core::marker::PhantomData; pub use self::elem::*; @@ -50,7 +50,11 @@ } } -const ONE: Elem = Elem::from_hex("1"); +static ONE: Elem = Elem { + limbs: limbs![1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + m: PhantomData, + encoding: PhantomData, +}; /// Operations and values needed by all curve operations. pub struct CommonOps { @@ -270,7 +274,10 @@ pub scalar_ops: &'static ScalarOps, pub public_key_ops: &'static PublicKeyOps, - pub twin_mul: fn(g_scalar: &Scalar, p_scalar: &Scalar, p_xy: &(Elem, Elem)) -> Point, + // XXX: `PublicScalarOps` shouldn't depend on `PrivateKeyOps`, but it does + // temporarily until `twin_mul` is rewritten. + pub private_key_ops: &'static PrivateKeyOps, + pub q_minus_n: Elem, } @@ -302,19 +309,6 @@ pub oneRR_mod_n: Scalar, // 1 * R**2 (mod n). TOOD: Use One. } -// XXX: Inefficient and unnecessarily depends on `PrivateKeyOps`. TODO: implement interleaved wNAF -// multiplication. -fn twin_mul_inefficient( - ops: &PrivateKeyOps, - g_scalar: &Scalar, - p_scalar: &Scalar, - p_xy: &(Elem, Elem), -) -> Point { - let scaled_g = ops.point_mul_base(g_scalar); - let scaled_p = ops.point_mul(p_scalar, p_xy); - ops.common.point_sum(&scaled_g, &scaled_p) -} - // This assumes n < q < 2*n. pub fn elem_reduced_to_scalar(ops: &CommonOps, elem: &Elem) -> Scalar { let num_limbs = ops.num_limbs; @@ -856,14 +850,14 @@ #[test] fn p384_point_double_test() { prefixed_extern! { - fn p384_point_double( + fn nistz384_point_double( r: *mut Limb, // [p384::COMMON_OPS.num_limbs*3] a: *const Limb, // [p384::COMMON_OPS.num_limbs*3] ); } point_double_test( &p384::PRIVATE_KEY_OPS, - p384_point_double, + nistz384_point_double, test_file!("ops/p384_point_double_tests.txt"), ); } @@ -979,7 +973,6 @@ fn p256_point_mul_base_test() { point_mul_base_tests( &p256::PRIVATE_KEY_OPS, - |s| p256::PRIVATE_KEY_OPS.point_mul_base(s), test_file!("ops/p256_point_mul_base_tests.txt"), ); } @@ -988,21 +981,16 @@ fn p384_point_mul_base_test() { point_mul_base_tests( &p384::PRIVATE_KEY_OPS, - |s| p384::PRIVATE_KEY_OPS.point_mul_base(s), test_file!("ops/p384_point_mul_base_tests.txt"), ); } - pub(super) fn point_mul_base_tests( - ops: &PrivateKeyOps, - f: impl Fn(&Scalar) -> Point, - test_file: test::File, - ) { + fn point_mul_base_tests(ops: &PrivateKeyOps, test_file: test::File) { test::run(test_file, |section, test_case| { assert_eq!(section, ""); let g_scalar = consume_scalar(ops.common, test_case, "g_scalar"); let expected_result = consume_point(ops, test_case, "r"); - let actual_result = f(&g_scalar); + let actual_result = ops.point_mul_base(&g_scalar); assert_point_actual_equals_expected(ops, &actual_result, &expected_result); Ok(()) }) diff -Nru temporalio-1.3.0/vendor/ring/src/ec/suite_b.rs temporalio-1.3.0/vendor/ring/src/ec/suite_b.rs --- temporalio-1.3.0/vendor/ring/src/ec/suite_b.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring/src/ec/suite_b.rs 2023-10-30 19:40:00.000000000 +0000 @@ -229,6 +229,7 @@ pub mod curve; +#[cfg(not(target_arch = "wasm32"))] pub mod ecdh; pub mod ecdsa; diff -Nru temporalio-1.3.0/vendor/ring/src/ec.rs temporalio-1.3.0/vendor/ring/src/ec.rs --- temporalio-1.3.0/vendor/ring/src/ec.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring/src/ec.rs 2023-10-30 19:40:00.000000000 +0000 @@ -36,6 +36,7 @@ #[derive(Clone, Copy, Debug, PartialEq)] pub enum CurveID { + #[cfg(not(target_arch = "wasm32"))] Curve25519, P256, P384, diff -Nru temporalio-1.3.0/vendor/ring/src/endian.rs temporalio-1.3.0/vendor/ring/src/endian.rs --- temporalio-1.3.0/vendor/ring/src/endian.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring/src/endian.rs 2023-10-30 19:40:00.000000000 +0000 @@ -17,11 +17,40 @@ fn as_byte_array(&self) -> &T; } +/// Work around the inability to implement `from` for arrays of `Encoding`s +/// due to the coherence rules. +pub trait FromByteArray { + fn from_byte_array(a: &T) -> Self; +} + macro_rules! define_endian { ($endian:ident) => { #[derive(Clone, Copy)] #[repr(transparent)] pub struct $endian(T); + + impl core::ops::BitXorAssign for $endian + where + T: core::ops::BitXorAssign, + { + #[inline(always)] + fn bitxor_assign(&mut self, a: Self) { + self.0 ^= a.0; + } + } + }; +} + +macro_rules! impl_from_byte_array { + ($endian:ident, $base:ident, $elems:expr) => { + impl FromByteArray<[u8; $elems * core::mem::size_of::<$base>()]> + for [$endian<$base>; $elems] + { + #[inline] + fn from_byte_array(a: &[u8; $elems * core::mem::size_of::<$base>()]) -> Self { + unsafe { core::mem::transmute_copy(a) } + } + } }; } @@ -37,6 +66,8 @@ unsafe { &*as_bytes_ptr } } } + + impl_from_byte_array!($endian, $base, $elems); }; } @@ -90,8 +121,11 @@ } define_endian!(BigEndian); +define_endian!(LittleEndian); impl_endian!(BigEndian, u32, to_be, from_be, 4); impl_endian!(BigEndian, u64, to_be, from_be, 8); +impl_endian!(LittleEndian, u32, to_le, from_le, 4); +impl_endian!(LittleEndian, u64, to_le, from_le, 8); #[cfg(test)] mod tests { diff -Nru temporalio-1.3.0/vendor/ring/src/lib.rs temporalio-1.3.0/vendor/ring/src/lib.rs --- temporalio-1.3.0/vendor/ring/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -36,19 +36,15 @@ // When running mk/package.sh, don't actually build any code. #![cfg(not(pregenerate_asm_only))] #![allow( - clippy::collapsible_if, - clippy::identity_op, - clippy::len_without_is_empty, - clippy::let_unit_value, - clippy::new_without_default, - clippy::neg_cmp_op_on_partial_ord, - clippy::too_many_arguments, - clippy::type_complexity, + missing_copy_implementations, + missing_debug_implementations, non_camel_case_types, non_snake_case, unsafe_code )] -#![deny(variant_size_differences)] +// `#[derive(...)]` uses `trivial_numeric_casts` and `unused_qualifications` +// internally. +#![deny(missing_docs, unused_qualifications, variant_size_differences)] #![forbid(unused_results)] #![no_std] @@ -75,6 +71,7 @@ pub mod aead; +#[cfg(not(target_arch = "wasm32"))] pub mod agreement; mod bits; diff -Nru temporalio-1.3.0/vendor/ring/src/polyfill/array_flatten.rs temporalio-1.3.0/vendor/ring/src/polyfill/array_flatten.rs --- temporalio-1.3.0/vendor/ring/src/polyfill/array_flatten.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring/src/polyfill/array_flatten.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,44 +0,0 @@ -// Copyright 2023 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -pub trait ArrayFlatten { - type Output; - - /// Returns the flattened form of `a` - fn array_flatten(self) -> Self::Output; -} - -impl ArrayFlatten for [[T; 8]; 2] { - type Output = [T; 16]; - - #[inline(always)] - fn array_flatten(self) -> Self::Output { - let [[a0, a1, a2, a3, a4, a5, a6, a7], [b0, b1, b2, b3, b4, b5, b6, b7]] = self; - [ - a0, a1, a2, a3, a4, a5, a6, a7, b0, b1, b2, b3, b4, b5, b6, b7, - ] - } -} - -impl ArrayFlatten for [[T; 4]; 4] { - type Output = [T; 16]; - - #[inline(always)] - fn array_flatten(self) -> Self::Output { - let [[a0, a1, a2, a3], [b0, b1, b2, b3], [c0, c1, c2, c3], [d0, d1, d2, d3]] = self; - [ - a0, a1, a2, a3, b0, b1, b2, b3, c0, c1, c2, c3, d0, d1, d2, d3, - ] - } -} diff -Nru temporalio-1.3.0/vendor/ring/src/polyfill/array_split_map.rs temporalio-1.3.0/vendor/ring/src/polyfill/array_split_map.rs --- temporalio-1.3.0/vendor/ring/src/polyfill/array_split_map.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring/src/polyfill/array_split_map.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,71 +0,0 @@ -// Copyright 2023 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -pub trait ArraySplitMap { - fn array_split_map(self, f: impl Fn([I; CN]) -> O) -> [O; ON]; -} - -impl ArraySplitMap for [I; 12] { - #[inline] - fn array_split_map(self, f: impl Fn([I; 4]) -> O) -> [O; 3] { - let [a0, a1, a2, a3, b0, b1, b2, b3, c0, c1, c2, c3] = self; - [ - f([a0, a1, a2, a3]), - f([b0, b1, b2, b3]), - f([c0, c1, c2, c3]), - ] - } -} - -impl ArraySplitMap for [I; 16] { - #[inline] - fn array_split_map(self, f: impl Fn([I; 4]) -> O) -> [O; 4] { - let [a0, a1, a2, a3, b0, b1, b2, b3, c0, c1, c2, c3, d0, d1, d2, d3] = self; - [ - f([a0, a1, a2, a3]), - f([b0, b1, b2, b3]), - f([c0, c1, c2, c3]), - f([d0, d1, d2, d3]), - ] - } -} - -impl ArraySplitMap for [I; 32] { - #[inline] - fn array_split_map(self, f: impl Fn([I; 4]) -> O) -> [O; 8] { - let [a0, a1, a2, a3, b0, b1, b2, b3, c0, c1, c2, c3, d0, d1, d2, d3, e0, e1, e2, e3, f0, f1, f2, f3, g0, g1, g2, g3, h0, h1, h2, h3] = - self; - [ - f([a0, a1, a2, a3]), - f([b0, b1, b2, b3]), - f([c0, c1, c2, c3]), - f([d0, d1, d2, d3]), - f([e0, e1, e2, e3]), - f([f0, f1, f2, f3]), - f([g0, g1, g2, g3]), - f([h0, h1, h2, h3]), - ] - } -} - -impl ArraySplitMap for [I; 16] { - #[inline] - fn array_split_map(self, f: impl Fn([I; 8]) -> O) -> [O; 2] { - let [a0, a1, a2, a3, a4, a5, a6, a7, b0, b1, b2, b3, b4, b5, b6, b7] = self; - [ - f([a0, a1, a2, a3, a4, a5, a6, a7]), - f([b0, b1, b2, b3, b4, b5, b6, b7]), - ] - } -} diff -Nru temporalio-1.3.0/vendor/ring/src/polyfill/chunks_fixed.rs temporalio-1.3.0/vendor/ring/src/polyfill/chunks_fixed.rs --- temporalio-1.3.0/vendor/ring/src/polyfill/chunks_fixed.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring/src/polyfill/chunks_fixed.rs 2023-10-30 19:40:00.000000000 +0000 @@ -6,6 +6,23 @@ fn chunks_fixed(self) -> Chunks; } +/// Allows iterating over a mutable array in fixed-length chunks. +/// +/// The design of this is different than that for `ChunksFixed` because it +/// isn't clear that we can legally (according to Rust's rules) convert create +/// a mutable reference to the chunked type from a mutable reference. +/// +/// TODO: Get clarification on the rules and refactor this tp be more like +/// `ChunksFixed`. +pub trait ChunksFixedMut<'a, Chunk> +where + Chunk: 'a, +{ + type MutIterator: Iterator; + + fn chunks_fixed_mut(self) -> Self::MutIterator; +} + /// `$unchuncked_len` must be divisible by `$chunk_len`. macro_rules! define_chunks_fixed { ( $unchuncked_len:expr, $chunk_len:expr ) => { @@ -23,9 +40,29 @@ unsafe { &*as_ptr } } } + + impl<'a, T> ChunksFixedMut<'a, [T; $chunk_len]> for &'a mut [T; $unchuncked_len] { + type MutIterator = core::iter::Map< + core::slice::ChunksExactMut<'a, T>, + fn(&'a mut [T]) -> &'a mut [T; $chunk_len], + >; + + #[inline(always)] + fn chunks_fixed_mut(self) -> Self::MutIterator { + // There will be no remainder because `$unchuncked_len` must be divisible by + // `$chunk_len`. The `unwrap()` will not fail for the same reason. + self.chunks_exact_mut($chunk_len) + .map(|slice| slice.try_into().unwrap()) + } + } }; } // Sorted by the first value, then the second value. +define_chunks_fixed!(12, 4); +define_chunks_fixed!(16, 4); +define_chunks_fixed!(16, 8); +define_chunks_fixed!(32, 4); +define_chunks_fixed!(64, 4); define_chunks_fixed!(64, 32); define_chunks_fixed!(80, 20); diff -Nru temporalio-1.3.0/vendor/ring/src/polyfill.rs temporalio-1.3.0/vendor/ring/src/polyfill.rs --- temporalio-1.3.0/vendor/ring/src/polyfill.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring/src/polyfill.rs 2023-10-30 19:40:00.000000000 +0000 @@ -28,8 +28,6 @@ mod chunks_fixed; mod array_flat_map; -mod array_flatten; -mod array_split_map; #[cfg(feature = "alloc")] mod leading_zeros_skipped; @@ -39,10 +37,7 @@ mod unwrap_const; -pub use self::{ - array_flat_map::ArrayFlatMap, array_flatten::ArrayFlatten, array_split_map::ArraySplitMap, - chunks_fixed::*, unwrap_const::unwrap_const, -}; +pub use self::{array_flat_map::ArrayFlatMap, chunks_fixed::*, unwrap_const::unwrap_const}; #[cfg(feature = "alloc")] pub use leading_zeros_skipped::LeadingZerosStripped; diff -Nru temporalio-1.3.0/vendor/ring/src/rand.rs temporalio-1.3.0/vendor/ring/src/rand.rs --- temporalio-1.3.0/vendor/ring/src/rand.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring/src/rand.rs 2023-10-30 19:40:00.000000000 +0000 @@ -129,24 +129,21 @@ target_os = "dragonfly", target_os = "freebsd", target_os = "haiku", - target_os = "hermit", target_os = "illumos", target_os = "ios", + target_os = "tvos", target_os = "linux", target_os = "macos", target_os = "netbsd", target_os = "openbsd", target_os = "redox", target_os = "solaris", - target_os = "tvos", - target_os = "vita", target_os = "windows", + target_os = "vita", all( + feature = "wasm32_unknown_unknown_js", target_arch = "wasm32", - any( - target_os = "wasi", - all(target_os = "unknown", feature = "wasm32_unknown_unknown_js") - ) + target_os = "unknown", ), ))] impl sealed::SecureRandom for SystemRandom { diff -Nru temporalio-1.3.0/vendor/ring/src/rsa/padding/pss.rs temporalio-1.3.0/vendor/ring/src/rsa/padding/pss.rs --- temporalio-1.3.0/vendor/ring/src/rsa/padding/pss.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring/src/rsa/padding/pss.rs 2023-10-30 19:40:00.000000000 +0000 @@ -21,7 +21,6 @@ /// documentation for more details. /// /// [RFC 3447 Section 8.1]: https://tools.ietf.org/html/rfc3447#section-8.1 -#[allow(clippy::upper_case_acronyms)] // TODO: Until we implement cargo-semver-checks #[derive(Debug)] pub struct PSS { digest_alg: &'static digest::Algorithm, diff -Nru temporalio-1.3.0/vendor/ring/tests/aead_tests.rs temporalio-1.3.0/vendor/ring/tests/aead_tests.rs --- temporalio-1.3.0/vendor/ring/tests/aead_tests.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring/tests/aead_tests.rs 2023-10-30 19:40:00.000000000 +0000 @@ -12,10 +12,10 @@ // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -#[cfg(all(target_arch = "wasm32", target_os = "unknown"))] +#[cfg(target_arch = "wasm32")] use wasm_bindgen_test::{wasm_bindgen_test as test, wasm_bindgen_test_configure}; -#[cfg(all(target_arch = "wasm32", target_os = "unknown"))] +#[cfg(target_arch = "wasm32")] wasm_bindgen_test_configure!(run_in_browser); use core::ops::RangeFrom; @@ -48,10 +48,11 @@ $( #[allow(non_snake_case)] mod $alg { // Provide a separate namespace for each algorithm's test. + #[cfg(not(target_arch = "wasm32"))] use super::super::*; - #[cfg(all(target_arch = "wasm32", target_os = "unknown"))] - use wasm_bindgen_test::wasm_bindgen_test as test; + #[cfg(target_arch = "wasm32")] + use super::super::{*, test}; test_known_answer!( $alg, diff -Nru temporalio-1.3.0/vendor/ring/tests/agreement_tests.rs temporalio-1.3.0/vendor/ring/tests/agreement_tests.rs --- temporalio-1.3.0/vendor/ring/tests/agreement_tests.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring/tests/agreement_tests.rs 2023-10-30 19:40:00.000000000 +0000 @@ -12,11 +12,7 @@ // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -#[cfg(all(target_arch = "wasm32", target_os = "unknown"))] -use wasm_bindgen_test::{wasm_bindgen_test as test, wasm_bindgen_test_configure}; - -#[cfg(all(target_arch = "wasm32", target_os = "unknown"))] -wasm_bindgen_test_configure!(run_in_browser); +#![cfg(not(target_arch = "wasm32"))] extern crate alloc; diff -Nru temporalio-1.3.0/vendor/ring/tests/constant_time_tests.rs temporalio-1.3.0/vendor/ring/tests/constant_time_tests.rs --- temporalio-1.3.0/vendor/ring/tests/constant_time_tests.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring/tests/constant_time_tests.rs 2023-10-30 19:40:00.000000000 +0000 @@ -14,10 +14,10 @@ use ring::{constant_time, error, rand}; -#[cfg(all(target_arch = "wasm32", target_os = "unknown"))] +#[cfg(target_arch = "wasm32")] use wasm_bindgen_test::{wasm_bindgen_test as test, wasm_bindgen_test_configure}; -#[cfg(all(target_arch = "wasm32", target_os = "unknown"))] +#[cfg(target_arch = "wasm32")] wasm_bindgen_test_configure!(run_in_browser); // This logic is loosly based on BoringSSL's `TEST(ConstantTimeTest, MemCmp)`. diff -Nru temporalio-1.3.0/vendor/ring/tests/digest_tests.rs temporalio-1.3.0/vendor/ring/tests/digest_tests.rs --- temporalio-1.3.0/vendor/ring/tests/digest_tests.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring/tests/digest_tests.rs 2023-10-30 19:40:00.000000000 +0000 @@ -14,10 +14,10 @@ use ring::{digest, test, test_file}; -#[cfg(all(target_arch = "wasm32", target_os = "unknown"))] +#[cfg(target_arch = "wasm32")] use wasm_bindgen_test::{wasm_bindgen_test as test, wasm_bindgen_test_configure}; -#[cfg(all(target_arch = "wasm32", target_os = "unknown"))] +#[cfg(target_arch = "wasm32")] wasm_bindgen_test_configure!(run_in_browser); /// Test vectors from BoringSSL, Go, and other sources. @@ -79,7 +79,7 @@ use super::{run_known_answer_test, run_monte_carlo_test}; use ring::{digest, test_file}; - #[cfg(all(target_arch = "wasm32", target_os = "unknown"))] + #[cfg(target_arch = "wasm32")] use wasm_bindgen_test::wasm_bindgen_test as test; #[test] @@ -180,6 +180,8 @@ macro_rules! test_i_u_f { ( $test_name:ident, $alg:expr) => { #[cfg(not(debug_assertions))] + // TODO: Get this working on WebAssembly + #[cfg(not(target_arch = "wasm32"))] #[test] fn $test_name() { let mut input = [0; (digest::MAX_BLOCK_LEN + 1) * 3]; @@ -239,7 +241,9 @@ /// This is not run in dev (debug) builds because it is too slow. macro_rules! test_large_digest { ( $test_name:ident, $alg:expr, $len:expr, $expected:expr) => { + // TODO: get this working on WebAssembly. #[cfg(not(debug_assertions))] + #[cfg(not(target_arch = "wasm32"))] #[test] fn $test_name() { let chunk = vec![123u8; 16 * 1024]; diff -Nru temporalio-1.3.0/vendor/ring/tests/ed25519_tests.rs temporalio-1.3.0/vendor/ring/tests/ed25519_tests.rs --- temporalio-1.3.0/vendor/ring/tests/ed25519_tests.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring/tests/ed25519_tests.rs 2023-10-30 19:40:00.000000000 +0000 @@ -18,10 +18,10 @@ test, test_file, }; -#[cfg(all(target_arch = "wasm32", target_os = "unknown"))] +#[cfg(target_arch = "wasm32")] use wasm_bindgen_test::{wasm_bindgen_test as test, wasm_bindgen_test_configure}; -#[cfg(all(target_arch = "wasm32", target_os = "unknown"))] +#[cfg(target_arch = "wasm32")] wasm_bindgen_test_configure!(run_in_browser); /// Test vectors from BoringSSL. diff -Nru temporalio-1.3.0/vendor/ring/tests/hkdf_tests.rs temporalio-1.3.0/vendor/ring/tests/hkdf_tests.rs --- temporalio-1.3.0/vendor/ring/tests/hkdf_tests.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring/tests/hkdf_tests.rs 2023-10-30 19:40:00.000000000 +0000 @@ -14,10 +14,10 @@ use ring::{digest, error, hkdf, test, test_file}; -#[cfg(all(target_arch = "wasm32", target_os = "unknown"))] +#[cfg(target_arch = "wasm32")] use wasm_bindgen_test::{wasm_bindgen_test as test, wasm_bindgen_test_configure}; -#[cfg(all(target_arch = "wasm32", target_os = "unknown"))] +#[cfg(target_arch = "wasm32")] wasm_bindgen_test_configure!(run_in_browser); #[test] diff -Nru temporalio-1.3.0/vendor/ring/tests/hmac_tests.rs temporalio-1.3.0/vendor/ring/tests/hmac_tests.rs --- temporalio-1.3.0/vendor/ring/tests/hmac_tests.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring/tests/hmac_tests.rs 2023-10-30 19:40:00.000000000 +0000 @@ -14,10 +14,10 @@ use ring::{digest, hmac, test, test_file}; -#[cfg(all(target_arch = "wasm32", target_os = "unknown"))] +#[cfg(target_arch = "wasm32")] use wasm_bindgen_test::{wasm_bindgen_test as test, wasm_bindgen_test_configure}; -#[cfg(all(target_arch = "wasm32", target_os = "unknown"))] +#[cfg(target_arch = "wasm32")] wasm_bindgen_test_configure!(run_in_browser); #[test] diff -Nru temporalio-1.3.0/vendor/ring/tests/pbkdf2_tests.rs temporalio-1.3.0/vendor/ring/tests/pbkdf2_tests.rs --- temporalio-1.3.0/vendor/ring/tests/pbkdf2_tests.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring/tests/pbkdf2_tests.rs 2023-10-30 19:40:00.000000000 +0000 @@ -15,10 +15,10 @@ use core::num::NonZeroU32; use ring::{digest, error, pbkdf2, test, test_file}; -#[cfg(all(target_arch = "wasm32", target_os = "unknown"))] +#[cfg(target_arch = "wasm32")] use wasm_bindgen_test::{wasm_bindgen_test as test, wasm_bindgen_test_configure}; -#[cfg(all(target_arch = "wasm32", target_os = "unknown"))] +#[cfg(target_arch = "wasm32")] wasm_bindgen_test_configure!(run_in_browser); /// Test vectors from BoringSSL, Go, and other sources. diff -Nru temporalio-1.3.0/vendor/ring/tests/rand_tests.rs temporalio-1.3.0/vendor/ring/tests/rand_tests.rs --- temporalio-1.3.0/vendor/ring/tests/rand_tests.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring/tests/rand_tests.rs 2023-10-30 19:40:00.000000000 +0000 @@ -17,10 +17,10 @@ test, }; -#[cfg(all(target_arch = "wasm32", target_os = "unknown"))] +#[cfg(target_arch = "wasm32")] use wasm_bindgen_test::{wasm_bindgen_test as test, wasm_bindgen_test_configure}; -#[cfg(all(target_arch = "wasm32", target_os = "unknown"))] +#[cfg(target_arch = "wasm32")] wasm_bindgen_test_configure!(run_in_browser); #[test] diff -Nru temporalio-1.3.0/vendor/ring/tests/rsa_tests.rs temporalio-1.3.0/vendor/ring/tests/rsa_tests.rs --- temporalio-1.3.0/vendor/ring/tests/rsa_tests.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring/tests/rsa_tests.rs 2023-10-30 19:40:00.000000000 +0000 @@ -22,10 +22,10 @@ test, test_file, }; -#[cfg(all(target_arch = "wasm32", target_os = "unknown"))] +#[cfg(target_arch = "wasm32")] use wasm_bindgen_test::{wasm_bindgen_test as test, wasm_bindgen_test_configure}; -#[cfg(all(target_arch = "wasm32", target_os = "unknown"))] +#[cfg(target_arch = "wasm32")] wasm_bindgen_test_configure!(run_in_browser); #[test] diff -Nru temporalio-1.3.0/vendor/ring/tests/signature_tests.rs temporalio-1.3.0/vendor/ring/tests/signature_tests.rs --- temporalio-1.3.0/vendor/ring/tests/signature_tests.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring/tests/signature_tests.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,9 +1,9 @@ use ring::{signature, test}; -#[cfg(all(target_arch = "wasm32", target_os = "unknown"))] +#[cfg(target_arch = "wasm32")] use wasm_bindgen_test::{wasm_bindgen_test as test, wasm_bindgen_test_configure}; -#[cfg(all(target_arch = "wasm32", target_os = "unknown"))] +#[cfg(target_arch = "wasm32")] wasm_bindgen_test_configure!(run_in_browser); #[test] diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/build.rs temporalio-1.3.0/vendor/ring-0.16.20/build.rs --- temporalio-1.3.0/vendor/ring-0.16.20/build.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/build.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,815 +0,0 @@ -// Copyright 2015-2016 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -//! Build the non-Rust components. - -// It seems like it would be a good idea to use `log!` for logging, but it -// isn't worth having the external dependencies (one for the `log` crate, and -// another for the concrete logging implementation). Instead we use `eprintln!` -// to log everything to stderr. - -// In the `pregenerate_asm_main()` case we don't want to access (Cargo) -// environment variables at all, so avoid `use std::env` here. - -use std::{ - fs::{self, DirEntry}, - path::{Path, PathBuf}, - process::Command, - time::SystemTime, -}; - -const X86: &str = "x86"; -const X86_64: &str = "x86_64"; -const AARCH64: &str = "aarch64"; -const ARM: &str = "arm"; - -#[rustfmt::skip] -const RING_SRCS: &[(&[&str], &str)] = &[ - (&[], "crypto/fipsmodule/aes/aes_nohw.c"), - (&[], "crypto/fipsmodule/bn/montgomery.c"), - (&[], "crypto/fipsmodule/bn/montgomery_inv.c"), - (&[], "crypto/limbs/limbs.c"), - (&[], "crypto/mem.c"), - (&[], "crypto/poly1305/poly1305.c"), - - (&[AARCH64, ARM, X86_64, X86], "crypto/crypto.c"), - (&[AARCH64, ARM, X86_64, X86], "crypto/curve25519/curve25519.c"), - (&[AARCH64, ARM, X86_64, X86], "crypto/fipsmodule/ec/ecp_nistz.c"), - (&[AARCH64, ARM, X86_64, X86], "crypto/fipsmodule/ec/ecp_nistz256.c"), - (&[AARCH64, ARM, X86_64, X86], "crypto/fipsmodule/ec/gfp_p256.c"), - (&[AARCH64, ARM, X86_64, X86], "crypto/fipsmodule/ec/gfp_p384.c"), - - (&[X86_64, X86], "crypto/cpu-intel.c"), - - (&[X86], "crypto/fipsmodule/aes/asm/aesni-x86.pl"), - (&[X86], "crypto/fipsmodule/aes/asm/vpaes-x86.pl"), - (&[X86], "crypto/fipsmodule/bn/asm/x86-mont.pl"), - (&[X86], "crypto/chacha/asm/chacha-x86.pl"), - (&[X86], "crypto/fipsmodule/ec/asm/ecp_nistz256-x86.pl"), - (&[X86], "crypto/fipsmodule/modes/asm/ghash-x86.pl"), - - (&[X86_64], "crypto/fipsmodule/aes/asm/aesni-x86_64.pl"), - (&[X86_64], "crypto/fipsmodule/aes/asm/vpaes-x86_64.pl"), - (&[X86_64], "crypto/fipsmodule/bn/asm/x86_64-mont.pl"), - (&[X86_64], "crypto/fipsmodule/bn/asm/x86_64-mont5.pl"), - (&[X86_64], "crypto/chacha/asm/chacha-x86_64.pl"), - (&[X86_64], "crypto/fipsmodule/ec/asm/p256-x86_64-asm.pl"), - (&[X86_64], "crypto/fipsmodule/modes/asm/aesni-gcm-x86_64.pl"), - (&[X86_64], "crypto/fipsmodule/modes/asm/ghash-x86_64.pl"), - (&[X86_64], "crypto/poly1305/poly1305_vec.c"), - (&[X86_64], SHA512_X86_64), - (&[X86_64], "crypto/cipher_extra/asm/chacha20_poly1305_x86_64.pl"), - - (&[AARCH64, ARM], "crypto/fipsmodule/aes/asm/aesv8-armx.pl"), - (&[AARCH64, ARM], "crypto/fipsmodule/modes/asm/ghashv8-armx.pl"), - - (&[ARM], "crypto/fipsmodule/aes/asm/bsaes-armv7.pl"), - (&[ARM], "crypto/fipsmodule/aes/asm/vpaes-armv7.pl"), - (&[ARM], "crypto/fipsmodule/bn/asm/armv4-mont.pl"), - (&[ARM], "crypto/chacha/asm/chacha-armv4.pl"), - (&[ARM], "crypto/curve25519/asm/x25519-asm-arm.S"), - (&[ARM], "crypto/fipsmodule/ec/asm/ecp_nistz256-armv4.pl"), - (&[ARM], "crypto/fipsmodule/modes/asm/ghash-armv4.pl"), - (&[ARM], "crypto/poly1305/poly1305_arm.c"), - (&[ARM], "crypto/poly1305/poly1305_arm_asm.S"), - (&[ARM], "crypto/fipsmodule/sha/asm/sha256-armv4.pl"), - (&[ARM], "crypto/fipsmodule/sha/asm/sha512-armv4.pl"), - - (&[AARCH64], "crypto/fipsmodule/aes/asm/vpaes-armv8.pl"), - (&[AARCH64], "crypto/fipsmodule/bn/asm/armv8-mont.pl"), - (&[AARCH64], "crypto/chacha/asm/chacha-armv8.pl"), - (&[AARCH64], "crypto/fipsmodule/ec/asm/ecp_nistz256-armv8.pl"), - (&[AARCH64], "crypto/fipsmodule/modes/asm/ghash-neon-armv8.pl"), - (&[AARCH64], SHA512_ARMV8), -]; - -const SHA256_X86_64: &str = "crypto/fipsmodule/sha/asm/sha256-x86_64.pl"; -const SHA512_X86_64: &str = "crypto/fipsmodule/sha/asm/sha512-x86_64.pl"; - -const SHA256_ARMV8: &str = "crypto/fipsmodule/sha/asm/sha256-armv8.pl"; -const SHA512_ARMV8: &str = "crypto/fipsmodule/sha/asm/sha512-armv8.pl"; - -const RING_TEST_SRCS: &[&str] = &[("crypto/constant_time_test.c")]; - -#[rustfmt::skip] -const RING_INCLUDES: &[&str] = - &[ - "crypto/curve25519/curve25519_tables.h", - "crypto/curve25519/internal.h", - "crypto/fipsmodule/bn/internal.h", - "crypto/fipsmodule/ec/ecp_nistz256_table.inl", - "crypto/fipsmodule/ec/ecp_nistz384.inl", - "crypto/fipsmodule/ec/ecp_nistz.h", - "crypto/fipsmodule/ec/ecp_nistz384.h", - "crypto/fipsmodule/ec/ecp_nistz256.h", - "crypto/internal.h", - "crypto/limbs/limbs.h", - "crypto/limbs/limbs.inl", - "crypto/poly1305/internal.h", - "include/GFp/aes.h", - "include/GFp/arm_arch.h", - "include/GFp/base.h", - "include/GFp/check.h", - "include/GFp/cpu.h", - "include/GFp/mem.h", - "include/GFp/poly1305.h", - "include/GFp/type_check.h", - "third_party/fiat/curve25519_32.h", - "third_party/fiat/curve25519_64.h", - ]; - -#[rustfmt::skip] -const RING_PERL_INCLUDES: &[&str] = - &["crypto/perlasm/arm-xlate.pl", - "crypto/perlasm/x86gas.pl", - "crypto/perlasm/x86nasm.pl", - "crypto/perlasm/x86asm.pl", - "crypto/perlasm/x86_64-xlate.pl"]; - -const RING_BUILD_FILE: &[&str] = &["build.rs"]; - -const PREGENERATED: &str = "pregenerated"; - -fn c_flags(target: &Target) -> &'static [&'static str] { - if target.env != MSVC { - static NON_MSVC_FLAGS: &[&str] = &[ - "-std=c1x", // GCC 4.6 requires "c1x" instead of "c11" - "-Wbad-function-cast", - "-Wnested-externs", - "-Wstrict-prototypes", - ]; - NON_MSVC_FLAGS - } else { - &[] - } -} - -fn cpp_flags(target: &Target) -> &'static [&'static str] { - if target.env != MSVC { - static NON_MSVC_FLAGS: &[&str] = &[ - "-pedantic", - "-pedantic-errors", - "-Wall", - "-Wextra", - "-Wcast-align", - "-Wcast-qual", - "-Wconversion", - "-Wenum-compare", - "-Wfloat-equal", - "-Wformat=2", - "-Winline", - "-Winvalid-pch", - "-Wmissing-field-initializers", - "-Wmissing-include-dirs", - "-Wredundant-decls", - "-Wshadow", - "-Wsign-compare", - "-Wsign-conversion", - "-Wundef", - "-Wuninitialized", - "-Wwrite-strings", - "-fno-strict-aliasing", - "-fvisibility=hidden", - ]; - NON_MSVC_FLAGS - } else { - static MSVC_FLAGS: &[&str] = &[ - "/GS", // Buffer security checks. - "/Gy", // Enable function-level linking. - "/EHsc", // C++ exceptions only, only in C++. - "/GR-", // Disable RTTI. - "/Zc:wchar_t", - "/Zc:forScope", - "/Zc:inline", - "/Zc:rvalueCast", - // Warnings. - "/sdl", - "/Wall", - "/wd4127", // C4127: conditional expression is constant - "/wd4464", // C4464: relative include path contains '..' - "/wd4514", // C4514: : unreferenced inline function has be - "/wd4710", // C4710: function not inlined - "/wd4711", // C4711: function 'function' selected for inline expansion - "/wd4820", // C4820: : bytes padding added after - "/wd5045", /* C5045: Compiler will insert Spectre mitigation for memory load if - * /Qspectre switch specified */ - ]; - MSVC_FLAGS - } -} - -const LD_FLAGS: &[&str] = &[]; - -// None means "any OS" or "any target". The first match in sequence order is -// taken. -const ASM_TARGETS: &[(&str, Option<&str>, Option<&str>)] = &[ - ("x86_64", Some("ios"), Some("macosx")), - ("x86_64", Some("macos"), Some("macosx")), - ("x86_64", Some(WINDOWS), Some("nasm")), - ("x86_64", None, Some("elf")), - ("aarch64", Some("ios"), Some("ios64")), - ("aarch64", Some("macos"), Some("ios64")), - ("aarch64", None, Some("linux64")), - ("x86", Some(WINDOWS), Some("win32n")), - ("x86", Some("ios"), Some("macosx")), - ("x86", None, Some("elf")), - ("arm", Some("ios"), Some("ios32")), - ("arm", None, Some("linux32")), - ("wasm32", None, None), -]; - -const WINDOWS: &str = "windows"; -const MSVC: &str = "msvc"; -const MSVC_OBJ_OPT: &str = "/Fo"; -const MSVC_OBJ_EXT: &str = "obj"; - -fn main() { - if let Ok(package_name) = std::env::var("CARGO_PKG_NAME") { - if package_name == "ring" { - ring_build_rs_main(); - return; - } - } - - pregenerate_asm_main(); -} - -fn ring_build_rs_main() { - use std::env; - - let out_dir = env::var("OUT_DIR").unwrap(); - let out_dir = PathBuf::from(out_dir); - - let arch = env::var("CARGO_CFG_TARGET_ARCH").unwrap(); - let os = env::var("CARGO_CFG_TARGET_OS").unwrap(); - let env = env::var("CARGO_CFG_TARGET_ENV").unwrap(); - let (obj_ext, obj_opt) = if env == MSVC { - (MSVC_OBJ_EXT, MSVC_OBJ_OPT) - } else { - ("o", "-o") - }; - - let is_git = std::fs::metadata(".git").is_ok(); - - // Published builds are always release builds. - let is_debug = is_git && env::var("DEBUG").unwrap() != "false"; - - let target = Target { - arch, - os, - env, - obj_ext, - obj_opt, - is_git, - is_debug, - }; - let pregenerated = PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap()).join(PREGENERATED); - - build_c_code(&target, pregenerated, &out_dir); - check_all_files_tracked() -} - -fn pregenerate_asm_main() { - let pregenerated = PathBuf::from(PREGENERATED); - std::fs::create_dir(&pregenerated).unwrap(); - let pregenerated_tmp = pregenerated.join("tmp"); - std::fs::create_dir(&pregenerated_tmp).unwrap(); - - for &(target_arch, target_os, perlasm_format) in ASM_TARGETS { - // For Windows, package pregenerated object files instead of - // pregenerated assembly language source files, so that the user - // doesn't need to install the assembler. - let asm_dir = if target_os == Some(WINDOWS) { - &pregenerated_tmp - } else { - &pregenerated - }; - - if let Some(perlasm_format) = perlasm_format { - let perlasm_src_dsts = - perlasm_src_dsts(&asm_dir, target_arch, target_os, perlasm_format); - perlasm(&perlasm_src_dsts, target_arch, perlasm_format, None); - - if target_os == Some(WINDOWS) { - let srcs = asm_srcs(perlasm_src_dsts); - for src in srcs { - let obj_path = obj_path(&pregenerated, &src, MSVC_OBJ_EXT); - run_command(nasm(&src, target_arch, &obj_path)); - } - } - } - } -} - -struct Target { - arch: String, - os: String, - env: String, - obj_ext: &'static str, - obj_opt: &'static str, - is_git: bool, - is_debug: bool, -} - -fn build_c_code(target: &Target, pregenerated: PathBuf, out_dir: &Path) { - #[cfg(not(feature = "wasm32_c"))] - { - if &target.arch == "wasm32" { - return; - } - } - - let includes_modified = RING_INCLUDES - .iter() - .chain(RING_BUILD_FILE.iter()) - .chain(RING_PERL_INCLUDES.iter()) - .map(|f| file_modified(Path::new(*f))) - .max() - .unwrap(); - - fn is_none_or_equals(opt: Option, other: T) -> bool - where - T: PartialEq, - { - if let Some(value) = opt { - value == other - } else { - true - } - } - - let (_, _, perlasm_format) = ASM_TARGETS - .iter() - .find(|entry| { - let &(entry_arch, entry_os, _) = *entry; - entry_arch == target.arch && is_none_or_equals(entry_os, &target.os) - }) - .unwrap(); - - let use_pregenerated = !target.is_git; - let warnings_are_errors = target.is_git; - - let asm_dir = if use_pregenerated { - &pregenerated - } else { - out_dir - }; - - let asm_srcs = if let Some(perlasm_format) = perlasm_format { - let perlasm_src_dsts = - perlasm_src_dsts(asm_dir, &target.arch, Some(&target.os), perlasm_format); - - if !use_pregenerated { - perlasm( - &perlasm_src_dsts[..], - &target.arch, - perlasm_format, - Some(includes_modified), - ); - } - - let mut asm_srcs = asm_srcs(perlasm_src_dsts); - - // For Windows we also pregenerate the object files for non-Git builds so - // the user doesn't need to install the assembler. On other platforms we - // assume the C compiler also assembles. - if use_pregenerated && target.os == WINDOWS { - // The pregenerated object files always use ".obj" as the extension, - // even when the C/C++ compiler outputs files with the ".o" extension. - asm_srcs = asm_srcs - .iter() - .map(|src| obj_path(&pregenerated, src.as_path(), "obj")) - .collect::>(); - } - - asm_srcs - } else { - Vec::new() - }; - - let core_srcs = sources_for_arch(&target.arch) - .into_iter() - .filter(|p| !is_perlasm(&p)) - .collect::>(); - - let test_srcs = RING_TEST_SRCS.iter().map(PathBuf::from).collect::>(); - - let libs = [ - ("ring-core", &core_srcs[..], &asm_srcs[..]), - ("ring-test", &test_srcs[..], &[]), - ]; - - // XXX: Ideally, ring-test would only be built for `cargo test`, but Cargo - // can't do that yet. - libs.iter().for_each(|&(lib_name, srcs, additional_srcs)| { - build_library( - &target, - &out_dir, - lib_name, - srcs, - additional_srcs, - warnings_are_errors, - includes_modified, - ) - }); - - println!( - "cargo:rustc-link-search=native={}", - out_dir.to_str().expect("Invalid path") - ); -} - -fn build_library( - target: &Target, - out_dir: &Path, - lib_name: &str, - srcs: &[PathBuf], - additional_srcs: &[PathBuf], - warnings_are_errors: bool, - includes_modified: SystemTime, -) { - // Compile all the (dirty) source files into object files. - let objs = additional_srcs - .iter() - .chain(srcs.iter()) - .filter(|f| &target.env != "msvc" || f.extension().unwrap().to_str().unwrap() != "S") - .map(|f| compile(f, target, warnings_are_errors, out_dir, includes_modified)) - .collect::>(); - - // Rebuild the library if necessary. - let lib_path = PathBuf::from(out_dir).join(format!("lib{}.a", lib_name)); - - if objs - .iter() - .map(Path::new) - .any(|p| need_run(&p, &lib_path, includes_modified)) - { - let mut c = cc::Build::new(); - - for f in LD_FLAGS { - let _ = c.flag(&f); - } - match target.os.as_str() { - "macos" => { - let _ = c.flag("-fPIC"); - let _ = c.flag("-Wl,-dead_strip"); - } - _ => { - let _ = c.flag("-Wl,--gc-sections"); - } - } - for o in objs { - let _ = c.object(o); - } - - // Handled below. - let _ = c.cargo_metadata(false); - - c.compile( - lib_path - .file_name() - .and_then(|f| f.to_str()) - .expect("No filename"), - ); - } - - // Link the library. This works even when the library doesn't need to be - // rebuilt. - println!("cargo:rustc-link-lib=static={}", lib_name); -} - -fn compile( - p: &Path, - target: &Target, - warnings_are_errors: bool, - out_dir: &Path, - includes_modified: SystemTime, -) -> String { - let ext = p.extension().unwrap().to_str().unwrap(); - if ext == "obj" { - p.to_str().expect("Invalid path").into() - } else { - let mut out_path = out_dir.join(p.file_name().unwrap()); - assert!(out_path.set_extension(target.obj_ext)); - if need_run(&p, &out_path, includes_modified) { - let cmd = if target.os != WINDOWS || ext != "asm" { - cc(p, ext, target, warnings_are_errors, &out_path) - } else { - nasm(p, &target.arch, &out_path) - }; - - run_command(cmd); - } - out_path.to_str().expect("Invalid path").into() - } -} - -fn obj_path(out_dir: &Path, src: &Path, obj_ext: &str) -> PathBuf { - let mut out_path = out_dir.join(src.file_name().unwrap()); - assert!(out_path.set_extension(obj_ext)); - out_path -} - -fn cc( - file: &Path, - ext: &str, - target: &Target, - warnings_are_errors: bool, - out_dir: &Path, -) -> Command { - let is_musl = target.env.starts_with("musl"); - - let mut c = cc::Build::new(); - let _ = c.include("include"); - match ext { - "c" => { - for f in c_flags(target) { - let _ = c.flag(f); - } - } - "S" => (), - e => panic!("Unsupported file extension: {:?}", e), - }; - for f in cpp_flags(target) { - let _ = c.flag(&f); - } - if target.os != "none" - && target.os != "redox" - && target.os != "windows" - && target.arch != "wasm32" - { - let _ = c.flag("-fstack-protector"); - } - - match (target.os.as_str(), target.env.as_str()) { - // ``-gfull`` is required for Darwin's |-dead_strip|. - ("macos", _) => { - let _ = c.flag("-gfull"); - } - (_, "msvc") => (), - _ => { - let _ = c.flag("-g3"); - } - }; - if !target.is_debug { - let _ = c.define("NDEBUG", None); - } - - if &target.env == "msvc" { - if std::env::var("OPT_LEVEL").unwrap() == "0" { - let _ = c.flag("/Od"); // Disable optimization for debug builds. - // run-time checking: (s)tack frame, (u)ninitialized variables - let _ = c.flag("/RTCsu"); - } else { - let _ = c.flag("/Ox"); // Enable full optimization. - } - } - - // Allow cross-compiling without a target sysroot for these targets. - // - // poly1305_vec.c requires which requires . - if (target.arch == "wasm32" && target.os == "unknown") - || (target.os == "linux" && is_musl && target.arch != "x86_64") - { - if let Ok(compiler) = c.try_get_compiler() { - // TODO: Expand this to non-clang compilers in 0.17.0 if practical. - if compiler.is_like_clang() { - let _ = c.flag("-nostdlibinc"); - let _ = c.define("GFp_NOSTDLIBINC", "1"); - } - } - } - - if warnings_are_errors { - let flag = if &target.env != "msvc" { - "-Werror" - } else { - "/WX" - }; - let _ = c.flag(flag); - } - if is_musl { - // Some platforms enable _FORTIFY_SOURCE by default, but musl - // libc doesn't support it yet. See - // http://wiki.musl-libc.org/wiki/Future_Ideas#Fortify - // http://www.openwall.com/lists/musl/2015/02/04/3 - // http://www.openwall.com/lists/musl/2015/06/17/1 - let _ = c.flag("-U_FORTIFY_SOURCE"); - } - - let mut c = c.get_compiler().to_command(); - let _ = c - .arg("-c") - .arg(format!( - "{}{}", - target.obj_opt, - out_dir.to_str().expect("Invalid path") - )) - .arg(file); - c -} - -fn nasm(file: &Path, arch: &str, out_file: &Path) -> Command { - let oformat = match arch { - "x86_64" => ("win64"), - "x86" => ("win32"), - _ => panic!("unsupported arch: {}", arch), - }; - let mut c = Command::new("./target/tools/nasm"); - let _ = c - .arg("-o") - .arg(out_file.to_str().expect("Invalid path")) - .arg("-f") - .arg(oformat) - .arg("-Xgnu") - .arg("-gcv8") - .arg(file); - c -} - -fn run_command_with_args(command_name: S, args: &[String]) -where - S: AsRef + Copy, -{ - let mut cmd = Command::new(command_name); - let _ = cmd.args(args); - run_command(cmd) -} - -fn run_command(mut cmd: Command) { - eprintln!("running {:?}", cmd); - let status = cmd.status().unwrap_or_else(|e| { - panic!("failed to execute [{:?}]: {}", cmd, e); - }); - if !status.success() { - panic!("execution failed"); - } -} - -fn sources_for_arch(arch: &str) -> Vec { - RING_SRCS - .iter() - .filter(|&&(archs, _)| archs.is_empty() || archs.contains(&arch)) - .map(|&(_, p)| PathBuf::from(p)) - .collect::>() -} - -fn perlasm_src_dsts( - out_dir: &Path, - arch: &str, - os: Option<&str>, - perlasm_format: &str, -) -> Vec<(PathBuf, PathBuf)> { - let srcs = sources_for_arch(arch); - let mut src_dsts = srcs - .iter() - .filter(|p| is_perlasm(p)) - .map(|src| (src.clone(), asm_path(out_dir, src, os, perlasm_format))) - .collect::>(); - - // Some PerlAsm source files need to be run multiple times with different - // output paths. - { - // Appease the borrow checker. - let mut maybe_synthesize = |concrete, synthesized| { - let concrete_path = PathBuf::from(concrete); - if srcs.contains(&concrete_path) { - let synthesized_path = PathBuf::from(synthesized); - src_dsts.push(( - concrete_path, - asm_path(out_dir, &synthesized_path, os, perlasm_format), - )) - } - }; - maybe_synthesize(SHA512_X86_64, SHA256_X86_64); - maybe_synthesize(SHA512_ARMV8, SHA256_ARMV8); - } - - src_dsts -} - -fn asm_srcs(perlasm_src_dsts: Vec<(PathBuf, PathBuf)>) -> Vec { - perlasm_src_dsts - .into_iter() - .map(|(_src, dst)| dst) - .collect::>() -} - -fn is_perlasm(path: &PathBuf) -> bool { - path.extension().unwrap().to_str().unwrap() == "pl" -} - -fn asm_path(out_dir: &Path, src: &Path, os: Option<&str>, perlasm_format: &str) -> PathBuf { - let src_stem = src.file_stem().expect("source file without basename"); - - let dst_stem = src_stem.to_str().unwrap(); - let dst_extension = if os == Some("windows") { "asm" } else { "S" }; - let dst_filename = format!("{}-{}.{}", dst_stem, perlasm_format, dst_extension); - out_dir.join(dst_filename) -} - -fn perlasm( - src_dst: &[(PathBuf, PathBuf)], - arch: &str, - perlasm_format: &str, - includes_modified: Option, -) { - for (src, dst) in src_dst { - if let Some(includes_modified) = includes_modified { - if !need_run(src, dst, includes_modified) { - continue; - } - } - - let mut args = Vec::::new(); - args.push(src.to_string_lossy().into_owned()); - args.push(perlasm_format.to_owned()); - if arch == "x86" { - args.push("-fPIC".into()); - args.push("-DOPENSSL_IA32_SSE2".into()); - } - // Work around PerlAsm issue for ARM and AAarch64 targets by replacing - // back slashes with forward slashes. - let dst = dst - .to_str() - .expect("Could not convert path") - .replace("\\", "/"); - args.push(dst); - run_command_with_args(&get_command("PERL_EXECUTABLE", "perl"), &args); - } -} - -fn need_run(source: &Path, target: &Path, includes_modified: SystemTime) -> bool { - let s_modified = file_modified(source); - if let Ok(target_metadata) = std::fs::metadata(target) { - let target_modified = target_metadata.modified().unwrap(); - s_modified >= target_modified || includes_modified >= target_modified - } else { - // On error fetching metadata for the target file, assume the target - // doesn't exist. - true - } -} - -fn file_modified(path: &Path) -> SystemTime { - let path = Path::new(path); - let path_as_str = format!("{:?}", path); - std::fs::metadata(path) - .expect(&path_as_str) - .modified() - .expect("nah") -} - -fn get_command(var: &str, default: &str) -> String { - std::env::var(var).unwrap_or_else(|_| default.into()) -} - -fn check_all_files_tracked() { - for path in &["crypto", "include", "third_party/fiat"] { - walk_dir(&PathBuf::from(path), &is_tracked); - } -} - -fn is_tracked(file: &DirEntry) { - let p = file.path(); - let cmp = |f| p == PathBuf::from(f); - let tracked = match p.extension().and_then(|p| p.to_str()) { - Some("h") | Some("inl") => RING_INCLUDES.iter().any(cmp), - Some("c") | Some("S") | Some("asm") => { - RING_SRCS.iter().any(|(_, f)| cmp(f)) || RING_TEST_SRCS.iter().any(cmp) - } - Some("pl") => RING_SRCS.iter().any(|(_, f)| cmp(f)) || RING_PERL_INCLUDES.iter().any(cmp), - _ => true, - }; - if !tracked { - panic!("{:?} is not tracked in build.rs", p); - } -} - -fn walk_dir(dir: &Path, cb: &F) -where - F: Fn(&DirEntry), -{ - if dir.is_dir() { - for entry in fs::read_dir(dir).unwrap() { - let entry = entry.unwrap(); - let path = entry.path(); - if path.is_dir() { - walk_dir(&path, cb); - } else { - cb(&entry); - } - } - } -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/.cargo-checksum.json temporalio-1.3.0/vendor/ring-0.16.20/.cargo-checksum.json --- temporalio-1.3.0/vendor/ring-0.16.20/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/.cargo-checksum.json 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -{"files":{"Cargo.toml":"9ea7674888129f591cd4eb5dc5f594bcbf09796e3b4ff8a3a9e1b27f7fe344d4","LICENSE":"76b39f9b371688eac9d8323f96ee80b3aef5ecbc2217f25377bd4e4a615296a9","build.rs":"1a850d791184374f614d01c86c8d6c9ba0500e64cb746edc9720ceaaa1cd8eaf","crypto/chacha/asm/chacha-armv4.pl":"776e12b3bd3894583a82bec19b1cbcdf03e3834902c5f54f7319c8e8cfa2cebd","crypto/chacha/asm/chacha-armv8.pl":"0d5e1d236c7fdea5bcba73c4d594672ff8b8d7ef2c35fd494939b6bd0b6f0b33","crypto/chacha/asm/chacha-x86.pl":"f92f3a0e6d11aee4a355e973fcaad7cbde2bda916f42b15e54fcd970914758d8","crypto/chacha/asm/chacha-x86_64.pl":"14c685c8e090b70f371506597645863a86ff58f0e894e0b453301b6c15ed4f94","crypto/cipher_extra/asm/chacha20_poly1305_x86_64.pl":"d996a994c0401d90838693423c517a76987a8921fb66047345eab201addcc12c","crypto/constant_time_test.c":"e0a214714cf547b5767980f408fc4108c7ad696547f5cab4b1eb26010af0c576","crypto/cpu-intel.c":"978e626c5232f355a006582e24eb82eba809de871d48d82c0c1d5ea60e99965e","crypto/crypto.c":"08fc0099b3be08a3762f57e5fb4dc8df323a14996ecba024193d308d75fcd0f8","crypto/curve25519/asm/x25519-asm-arm.S":"2871b4e3ee564fe44580a468920c2b47efe54a93157d6f166f91bd4689900390","crypto/curve25519/curve25519.c":"21a36b21532fef5f9c3a05e2998b1f9cc3cf213dfe9aece75c31eb18f3cfa57a","crypto/curve25519/curve25519_tables.h":"aabc1281eb622d433ef1869a2550d6f35a2b2347c5fb67ba1512b0c17bcc93b1","crypto/curve25519/internal.h":"90c1fc2fdc98e88d5505be2004b4b8f8830e8774576b210092be95622491ecc2","crypto/fipsmodule/aes/aes_nohw.c":"db8dda69362c7075e71cde44687231729006edd7fdfaa0bd7614be6c982ec6cd","crypto/fipsmodule/aes/asm/aesni-x86.pl":"7f901a13e28787a0c54716dd53fa06fbb19a16e0c99b85e1a53c2fac22b40b15","crypto/fipsmodule/aes/asm/aesni-x86_64.pl":"5da2ca798ef7a4bd70c38515c6f8d5ede5c66cc5400f092a7e5b3553755d1d22","crypto/fipsmodule/aes/asm/aesv8-armx.pl":"b848ebe14f72b33a0d67665e3fe800a1e7d8f4c4ff26e168f2baa4660439a329","crypto/fipsmodule/aes/asm/bsaes-armv7.pl":"7b926cdb2a7249a06b3d072c296dca2c5ca454de0504a3a0d882e88aafdf8cfe","crypto/fipsmodule/aes/asm/vpaes-x86.pl":"6024058bdc1ac8bf3dd6dcfec69bb3185964c67310a64b3cea31dbbaed413114","crypto/fipsmodule/aes/asm/vpaes-x86_64.pl":"a5e6039f9af10f6f246794189643c46bd753b573c01d7076bacf5c5aace5f7c8","crypto/fipsmodule/bn/asm/armv4-mont.pl":"8608cd13cd8a6ae5f607b4c86dda2c9c5434c596bb24b9a71e34f5944945b250","crypto/fipsmodule/bn/asm/armv8-mont.pl":"85ae9aecc0de393406d01623c121f2f4fedaab381f3213897f228a201cc2272a","crypto/fipsmodule/bn/asm/x86-mont.pl":"beec8c6b561c0bb36da7fa273884adb47345a4e1a5c4a987d40b4f32ee75058c","crypto/fipsmodule/bn/asm/x86_64-mont.pl":"d006778aa240c3c4173e00166ffd5e7475a75a1f8957a2e1e8bb19ab4fddfbe9","crypto/fipsmodule/bn/asm/x86_64-mont5.pl":"02c2f13e1afc1819ff9ad47f1774b7b6c3b055ddc360919a84c860413239fc2a","crypto/fipsmodule/bn/internal.h":"09193ba3c20593b78c560c95541d11fd3a4f695d6f619c4fa6ecdc521b0b5a92","crypto/fipsmodule/bn/montgomery.c":"864c83a6d2e8b7b2dddd92ef01a3df30339ef5447c4974e8ab4a8028a098609d","crypto/fipsmodule/bn/montgomery_inv.c":"c894c171a817feca2487561657ed746ab6adc23b6844d5155dfe58852a0f9974","crypto/fipsmodule/ec/asm/ecp_nistz256-armv4.pl":"92306d57efaa4ee29537af036c9442f5baad7060009a2cedad3258b462c619cd","crypto/fipsmodule/ec/asm/ecp_nistz256-armv8.pl":"107cbb066e158bdbf7e711870e7f4407d83191a7fdbb60bf027e187ca43d3a77","crypto/fipsmodule/ec/asm/ecp_nistz256-x86.pl":"b9457d8d77eb17cc545d28e04eced96a95371e12927a56f68e4e3c38205cf4e8","crypto/fipsmodule/ec/asm/p256-x86_64-asm.pl":"80ac45f0afc4569ea654dedab46f125acf7646a9b2c6a9ad98bfdacacfe8e6d7","crypto/fipsmodule/ec/ecp_nistz.c":"d5818610ec87e3194bfe54b0a89ff5c75ad8d4d637bd24c575d87d5efd341f79","crypto/fipsmodule/ec/ecp_nistz.h":"6eaa9ba8127bbcc97f3b260467470302ab65478b3bb9766e36c0eb29e83a6c4e","crypto/fipsmodule/ec/ecp_nistz256.c":"59a47768fb433f5c8c6bc1882385a3db64f4db25cc0b4dadbe13f6084d44abaf","crypto/fipsmodule/ec/ecp_nistz256.h":"b7de7f8edc225c90feda8f8822f7fc177f21c9019d342c8d9004187c6582deb0","crypto/fipsmodule/ec/ecp_nistz256_table.inl":"f897a158bbac30b08b41585fde64023d3288846ef90a23e0f3790fad8e3d8961","crypto/fipsmodule/ec/ecp_nistz384.h":"7aeb84e1d64b1018d8e0c89b97ae1e603f31f9cd4786104ce5932f4d425bb1d7","crypto/fipsmodule/ec/ecp_nistz384.inl":"afaef5c14e12a6b846d96435d77a277fa58af46161a125e10a9decf80849a8ca","crypto/fipsmodule/ec/gfp_p256.c":"ebe36852365a8fd98defb1ee144dd5fe240411a8d3955d4a14ddbf47cccb8fa7","crypto/fipsmodule/ec/gfp_p384.c":"00caa7965eb9638f054c37409ec86047b72e4ad7196b8fa0ccdcd7e1b525d56f","crypto/fipsmodule/ecdsa/ecdsa_verify_tests.txt":"a607b74542c3833ab907e74e341c988ed16ee1e4b02c4323887e82c881a6b990","crypto/fipsmodule/modes/asm/aesni-gcm-x86_64.pl":"fb5840d6034ccb88ea0e8bbb87022edc34199a40305acfa598596fe691be87c2","crypto/fipsmodule/modes/asm/ghash-armv4.pl":"59c4d85d9f69acf6a9117c346401e783fc8e189b62b725d78fb8f13d8ed6aafd","crypto/fipsmodule/modes/asm/ghash-x86.pl":"60e670449f62cea9858a1a967743479d3f27e5e6e60c2f273a2fa554a6ca5b22","crypto/fipsmodule/modes/asm/ghash-x86_64.pl":"ffc134f81a2e0e168a92dbca6496b1b39594f3c41128b5c83c1fc3c9da436e0c","crypto/fipsmodule/modes/asm/ghashv8-armx.pl":"10ee68ce6f01833067aa7edffa06817fb032ec345d79518c8cadece7c3869008","crypto/fipsmodule/sha/asm/sha256-armv4.pl":"ddd3e3434f45f0d69318200a8aa372771bdfd4507f7109775b731fc171430ea9","crypto/fipsmodule/sha/asm/sha512-armv4.pl":"f935b851a593811b96cbbd18d06e50c38691407dbd6533e0e54eb272d5e6c7cf","crypto/fipsmodule/sha/asm/sha512-armv8.pl":"d53dbbb842ab1c0b9415f62b3e117be9a384f628140142fcaf193b843679676f","crypto/fipsmodule/sha/asm/sha512-x86_64.pl":"a9543814ec3e45642efbabacf3fc8fdb9e5ee1176c0540a81b4c4ec4255c3cf8","crypto/internal.h":"d8db57b0bc7dd309c6e3b8505597b2a6e52b122d9e9a749be9954c91d8ae4b29","crypto/limbs/limbs.c":"4aa7640aff6b2e0463040c08f652253db8b8d581b67439e5222846a978f4acce","crypto/limbs/limbs.h":"61a8b3e2f9f3c342e7642823e1185114b59f02a1a31d824a87e369927690e298","crypto/limbs/limbs.inl":"dbd7a3c2f4a4b57bef69be99746dde06128a8df8db2376fb445cd63acd6c0fae","crypto/mem.c":"18e2844c6205fab613031e671dac3b65ceeb18bb5125f2a11e4df7ec0c09ec0f","crypto/perlasm/arm-xlate.pl":"bb388297c8a58b81104514fa316da23b5dc1737ae7b3807686701f49c7b3afc5","crypto/perlasm/x86_64-xlate.pl":"0eb214c1d09a35bafe5a0a47b1252806034a2941746a4dfedcbe408608f86ac0","crypto/perlasm/x86asm.pl":"060eb03f8a2ce12b36164affd4501190498e9906c8b072822b63a0a0e3a315cc","crypto/perlasm/x86gas.pl":"183d2642ab2e4c76b46bcb97a92fd16c539d9c07331c7204b0564d78c9413817","crypto/perlasm/x86nasm.pl":"351b5f1df553b07f21696bff10a8d598bdfba165dbb1f636a032b021f4632316","crypto/poly1305/internal.h":"52eb2f8b4ae3336626e12951440d664a03b4022d0d84e754f9e47cdc1d375895","crypto/poly1305/poly1305.c":"7b9613bf27046c8c1e817ebe1f8368664157d6df9214904d43f34144bf5153ad","crypto/poly1305/poly1305_arm.c":"f2abd93575ca9e5a40685c770b0c3585371fc55483229f9fda29b6ffbffa1205","crypto/poly1305/poly1305_arm_asm.S":"76090c8e5588cfead864e3a134915c80e29bb05da30e3df10aa90eadc3ff2e4f","crypto/poly1305/poly1305_vec.c":"3ebf98e531493f3fd069da543a416565aca88d7703f70a996280393ec56c5b23","doc/link-to-readme.md":"84cff31ddc513710f4004b974b84301fc3fc0ebb7f070e33ae1814275206a58a","include/GFp/aes.h":"fe399abed5f51e4f87efb740db962bfbba8ee3da0895ff87a0adac01b84cec98","include/GFp/arm_arch.h":"eecf5feb17c99da6238a8795b1431b8e8ce00e0f308540e0873d454c729efaba","include/GFp/base.h":"b84ad976b2e971b4a83f9a6dabd83df52b5b098b711f4f201566e7e3d059c936","include/GFp/check.h":"76f0b1bbab92909fd18ae1f7715f4c925058aae998fa0d534e76de109ce34d05","include/GFp/cpu.h":"ee8f3861e73b89b3249763d2b030fdc9f23c79dea95977746df7a95c32ebfacf","include/GFp/mem.h":"a6c2172ca0be27017a6860773d61e2d2832dbce5298841176fbbf96fc243964f","include/GFp/poly1305.h":"ddfd01593b1db976475b6e0752e04abfc7a9aac3d5a226fedd98170078c7f9d8","include/GFp/type_check.h":"6311bbc55de60641683e0380014588dfc5fe8545d62a430f73289f6194bc9f81","pregenerated/aesni-gcm-x86_64-elf.S":"839f774f6e16f59a09a1314e8776cf1323272f9ab36f3874e7a2c678f127bb0a","pregenerated/aesni-gcm-x86_64-macosx.S":"416356efcc64fa2d8562e4cdfd5450d24dc7fc7b0b75a34c477aa1d6c72797b4","pregenerated/aesni-gcm-x86_64-nasm.obj":"f468394e9dc996237799360d0829a1ef2fcd033806f64c4ce774fd9d517fa7ed","pregenerated/aesni-x86-elf.S":"97b76bcfcef2157ce71d9d6bc91106e8ead6d2c64ff07e7217ff3b000114c89b","pregenerated/aesni-x86-macosx.S":"daec8c6e24442e087c0f9d966de30c5e65ce54965d5e4d3807b32b86b831ea32","pregenerated/aesni-x86-win32n.obj":"8fe90b258d7d1f29b5ffd8f775a3a08a81582aa0878cbbfb43842dcfa1ac1656","pregenerated/aesni-x86_64-elf.S":"c3db64af73503a62ac6150173e0595f3c306152d106fe5d6f709b28cb5377865","pregenerated/aesni-x86_64-macosx.S":"c259f14d6c4ffaca8228b9b2adb72500ab8cc1e72fb00679222fa3cf023fcf5c","pregenerated/aesni-x86_64-nasm.obj":"5d368e8177abaa248670265aaa42cb3aa7c13474d4217ae8e10fdba5ebbbf2a3","pregenerated/aesv8-armx-ios32.S":"eb2a1d9065e2404b1ea44ebd59f3a413e0dc3e8fe0c21b5c37d1e720b0ae2f7e","pregenerated/aesv8-armx-ios64.S":"90f21051f66327c638a43cabe6bd69609c8a1e66540214bc956e53fdd8bc5bbf","pregenerated/aesv8-armx-linux32.S":"5355690bdb5516e8e75343766c9c861f3efec34be8b791042aa3131771968266","pregenerated/aesv8-armx-linux64.S":"4e210b6ae0aaac9a7d241166fe8024acbaae471df6c281b4e35ee518fd12d6ec","pregenerated/armv4-mont-ios32.S":"d4557d82508e4490d84de0aa2df9c1b7c638d609dd2b5dfeb0763d5181b711c6","pregenerated/armv4-mont-linux32.S":"baab9d2a8e5f10e7da4b31319d2dd60471c3b54e5d04174fb173032d3ccbd8ae","pregenerated/armv8-mont-ios64.S":"9d9134a72ec9845c4071049d466e2e546108e7890f30ad95016f80f71c4e8840","pregenerated/armv8-mont-linux64.S":"0fbadcdb812550c4df7f4dc7c74d2784cb4f330c22ee57c5190de86802d5bead","pregenerated/bsaes-armv7-ios32.S":"05c8c6232272ab728b7dd3046cf3c53e3628ccf0fe32ce69d65822f11c439cb0","pregenerated/bsaes-armv7-linux32.S":"18ba628ad2da5a89c83a67b3323b3ac0da39827ed2f43cb32a6b3c939a7b3db5","pregenerated/chacha-armv4-ios32.S":"4c3533dd7d3b2ae91bc6f005c38c9fab5f2c86a5deb191964f5b667d8b7e0e79","pregenerated/chacha-armv4-linux32.S":"d69afc323632c366aed2b973453ecb627a046560a9387a6f53f28343c6d87007","pregenerated/chacha-armv8-ios64.S":"910597f9f54fea74f991039d4f13fc67cca72d4f5d437e61f44bafa3b348edc4","pregenerated/chacha-armv8-linux64.S":"25b6a39eda3aa1136fb604f4f45fa494bddc1cbce8b60f5408106b61bb458547","pregenerated/chacha-x86-elf.S":"006bd68948565d8cf52796677b7c92e54414aa9001d5e411298460c197a701df","pregenerated/chacha-x86-macosx.S":"5e2f5071e7dcc62ab2e1ef3ccc4b2bf3d5c3645a08a31045007a0c52bc45a11a","pregenerated/chacha-x86-win32n.obj":"1d5dc4d533575c6d1e751c347f5fc29a43eb069d6e9c66dc4a4cd4da20ac098c","pregenerated/chacha-x86_64-elf.S":"8198bb9aecee6b633f93a864823a5031c4ef8d86c44417f683279865201a27fe","pregenerated/chacha-x86_64-macosx.S":"115e186a1141f24ea2ec95d56ddb329e90ddb5494b2af084d532fb135c25e6e1","pregenerated/chacha-x86_64-nasm.obj":"f7fded0b06e96b492df13a68507e60b305d7fa5037864aa5ceb47444ad806d8f","pregenerated/chacha20_poly1305_x86_64-elf.S":"9b089ebe5e3164bef6129cd87b37ed1466ea290b0b01a39f760c8917a81df302","pregenerated/chacha20_poly1305_x86_64-macosx.S":"3cfa0b9e62dee437ee3a55a64b33681cf063b23a0f649235c0500bc4537a7e87","pregenerated/chacha20_poly1305_x86_64-nasm.obj":"f5161b858d55d2698331b78f837ccd510b9bc475fce41c0fd448fb123c4a3cb1","pregenerated/ecp_nistz256-armv4-ios32.S":"67b29460d061e31a01c29e4d7d01dfb9d1565df008715219b0e801f3267222af","pregenerated/ecp_nistz256-armv4-linux32.S":"8fcfcdc38968c0b5d4d1d5b0b02eb0c81017c47c0d92be438b0c7b2bced2b315","pregenerated/ecp_nistz256-armv8-ios64.S":"3303ffa99060aaa77a8e2ae80ecbc0ca4d01e1d0fa8984d140ba9d8d3a5dfe6b","pregenerated/ecp_nistz256-armv8-linux64.S":"f6b087a341257b34d3b0d44c2cdcd4d45730ff7be43ae61d22ec31a82776ef1d","pregenerated/ecp_nistz256-x86-elf.S":"2abef2ebc797857a33287ded29ea3f19d3cc16828edec44037298e7213fd11b5","pregenerated/ecp_nistz256-x86-macosx.S":"7486e70d91b2c5db5422b53e51c58882a23b1e5661c0120c8d2c5fc5bb070b07","pregenerated/ecp_nistz256-x86-win32n.obj":"f160c9c70ce8147c58fa2f98a9cdd1a3942f1defbc68c293e55be0b5aa36a064","pregenerated/ghash-armv4-ios32.S":"92df1bc8ab2eac0fc487052c42fafb75b345e58d7a77cd8e30defe2a158841e4","pregenerated/ghash-armv4-linux32.S":"90c8a658915ef630ee767cea1297bec12f99bbc34f4639ee743d9c6ac5442132","pregenerated/ghash-neon-armv8-ios64.S":"3a98b439c6e5241e07f2abfa25cb2a5da9733d4c1a14254c477d62de0e02df70","pregenerated/ghash-neon-armv8-linux64.S":"5a14cc2182a707852cc3873a3f43910f67ba8e28a9c171e055709fd5576a65a0","pregenerated/ghash-x86-elf.S":"e90f3d5f2da844d78ed8f9a42e8076cc8d6e4d9d9b9f0622dcc231fd9dd89a8d","pregenerated/ghash-x86-macosx.S":"77acdfa80ba0e1f4352950cf4226d401120e59c59fb2eebf10c8b5dcb0dc1d88","pregenerated/ghash-x86-win32n.obj":"2faa80c7a5650ff5bf57fd04e72578b73d1f6713890a5d96edaa5be7ff676ecf","pregenerated/ghash-x86_64-elf.S":"38e7418fb6a11cfa4966aeef2038bb05f7e28ddf1a5a7ef0bd4ee20adafcec20","pregenerated/ghash-x86_64-macosx.S":"f42f5c764c1196d6ebfe00d8208ca297ffb35b1fd64a1055f6350dd87a811df8","pregenerated/ghash-x86_64-nasm.obj":"9b1350599400246b5d98f0b31fd9602764f22f268909ce14d7088cd735d4ec00","pregenerated/ghashv8-armx-ios32.S":"d37794ca858e9b49781158c144af55f09258d243f6722ca331bd80a36a6a2bb1","pregenerated/ghashv8-armx-ios64.S":"1b16110bc44614d9601e9af754abe51d58e763cf52ba3b7befb246f519e6ef1a","pregenerated/ghashv8-armx-linux32.S":"70dde07679a4ba8d38ad689164e74d89fe2cb55344357d03f9a613849b693d12","pregenerated/ghashv8-armx-linux64.S":"49643df44cf790360242427602343ee15ab2875cd26cbc30239ad10f424760dd","pregenerated/p256-x86_64-asm-elf.S":"f4d1ad978ef311cf56a703d36d96aeff7dd72a45dcea8eb91ee4a7245c870f52","pregenerated/p256-x86_64-asm-macosx.S":"56a06191e2885742ad31a2d3ba9e2704e2edef3b34148f9bf6e5df9c09821802","pregenerated/p256-x86_64-asm-nasm.obj":"f974ce322dadb7759a9f044d59856f53a1d5a9487462df1db0d041e1283c4c8a","pregenerated/sha256-armv4-ios32.S":"1f2d3b83692b175cb0419db4a771f89287fc759d95bc3abc7a46d4c3ff3e7171","pregenerated/sha256-armv4-linux32.S":"d9dc1a92218071562057124741db8fc9d397e482178210a5c38e7fbce20c1f0a","pregenerated/sha256-armv8-ios64.S":"3af6bd68116d286fa646edf3a0455b0641f8c679174e9bfad15a3cfbb478d7c8","pregenerated/sha256-armv8-linux64.S":"4444d51783cb738d109ee308e429cf031f09d2db6bd9083e972863f041f5345e","pregenerated/sha256-x86_64-elf.S":"4ba15c1fb22d29844a828fe3b307395747981489ae97284e68a195c3890c9eb5","pregenerated/sha256-x86_64-macosx.S":"f08bc11e30b778ed0ef065b60b8d0e2871fcf08fabfec375eecaf653f9e4d03a","pregenerated/sha256-x86_64-nasm.obj":"93c8850e7a3a922ef7627c01039427a2af987b61f15dea163a58855a5396a4e9","pregenerated/sha512-armv4-ios32.S":"234cd599e80ead2618df4d3984f3a872104d8cdd9fa76c8235bcd3fe4c54e724","pregenerated/sha512-armv4-linux32.S":"37468f12529bbeda3c7b90f7f6c15ef8a4549441c1de3e0d1a9d5a1d56a6023e","pregenerated/sha512-armv8-ios64.S":"190dc1d4247375437e29a20d467abb8188ee7ff2acb61e34e1188c6b54cf7732","pregenerated/sha512-armv8-linux64.S":"e75f108040f77bc7b1619f9ee61d5ea9c3ac14f139eb371c0e33df2bf41137b1","pregenerated/sha512-x86_64-elf.S":"78d445f4f2526e28f544f735e8af0abcb9128feee78fd10dd5ccbb57418f0533","pregenerated/sha512-x86_64-macosx.S":"26694e275333099f32d854488473ca91d4eae0d7a4abb6fbe34579b4a3a8d1f8","pregenerated/sha512-x86_64-nasm.obj":"775141ee3bd95c4783de374a92e603c429129ce0f84e9b4beedee37091ec16fa","pregenerated/tmp/aesni-gcm-x86_64-nasm.asm":"cbb0552dc5c461b55e188554bbfc65cc617352e412437f1b82a2cfb272ee64c9","pregenerated/tmp/aesni-x86-win32n.asm":"17ec3f0ed9e4ddfaa0836bc94a1c494b44a2df034bf19f1a56f4f4bd95642871","pregenerated/tmp/aesni-x86_64-nasm.asm":"15fa829c04c05678793703a661dd5df3e18c0307f6ce7937e5c1b070842f8ff4","pregenerated/tmp/chacha-x86-win32n.asm":"9aa5b99b65a28d1592882bda201913c1202924327cc013ffbe774cd224d337f0","pregenerated/tmp/chacha-x86_64-nasm.asm":"2e786ccfa5933e1dc676310bf02485437549794a1efc5e605ae9b70d0bd45387","pregenerated/tmp/chacha20_poly1305_x86_64-nasm.asm":"ae9f1aa6b2b1fd203c4e347c8f88e8d282618cae620b54d2fe23342658a693e4","pregenerated/tmp/ecp_nistz256-x86-win32n.asm":"e924606f35d37cca56f819fff7cb9b0dba6011c022acc052a61d0b399c204d14","pregenerated/tmp/ghash-x86-win32n.asm":"be68d36eea9e93265b1ff9f3fadd3611b96dd0563d2f17ddd30230a8764ab000","pregenerated/tmp/ghash-x86_64-nasm.asm":"4573faf1e83b3dfa6e98d3c2a720b2d6a967d0863c79f1e06b2701ab4550b28e","pregenerated/tmp/p256-x86_64-asm-nasm.asm":"4009302d68a06f430efe075d3026733dc894269b1b497b7fa64659e2e8055aec","pregenerated/tmp/sha256-x86_64-nasm.asm":"593fb0095950fcd900c81506c75007f215ce7a6f42ecc6c0c406f0ca72567130","pregenerated/tmp/sha512-x86_64-nasm.asm":"2c1193ead520148b2b3daccdcf8f2eed5fca2c61f3d0816c8b3255960b065739","pregenerated/tmp/vpaes-x86-win32n.asm":"13d8dc4590139fb38aa069beeb9cd4c21ff06afcdb9d570646183a8802876831","pregenerated/tmp/vpaes-x86_64-nasm.asm":"e1606d75935bacf00248a4c706866cdb47f66ec7e31b31ac376a5fc633d426fd","pregenerated/tmp/x86-mont-win32n.asm":"945f149bf139d9bb618e89945f5d5766904e911702401e8b2e6059fb076f69ee","pregenerated/tmp/x86_64-mont-nasm.asm":"a1d5a0548380eee1f618a7175821d409901862da7a8ab3adca0291285cede53a","pregenerated/tmp/x86_64-mont5-nasm.asm":"e5146b01b4b658b54c4b4999248622562e0280877ead55aa34db0bcd6c93ddee","pregenerated/vpaes-armv7-ios32.S":"97e3f3d8192f5af14624e5a8d774c91d67f7b167e268c7c29692c5b6ea95e952","pregenerated/vpaes-armv7-linux32.S":"f338c746b42539eb833fd23d37c7594b0d52f49793ea91cbcad3b159818231ac","pregenerated/vpaes-armv8-ios64.S":"2966a55ccd6239e075f6cf5849bc20235b3251258dc045f0574ed3ac68311519","pregenerated/vpaes-armv8-linux64.S":"a36c08179f1b264f379c686800da857baff299a11932073c7758e8c688e9e1c8","pregenerated/vpaes-x86-elf.S":"6ea5189ae3b0e59dd2ada396d912ff3cc96ea8690a1c0b21c6ff8d3c81d3989b","pregenerated/vpaes-x86-macosx.S":"d3d44014c63249fcf020a88a7463060d033ddb3e1b1c2d08945c45bfbbe05a36","pregenerated/vpaes-x86-win32n.obj":"d71da62ee1ba86b4601efd8620a3ef37b3c5e02427795b6f64b6fce278e44e03","pregenerated/vpaes-x86_64-elf.S":"f16784c955f761587d235f6b747e6c6aa0a99c522947842f68bc6ad842bdd87c","pregenerated/vpaes-x86_64-macosx.S":"76ef4527ae6a3daccaf47de2e8f97ffcd064e045f11e7474357cbb82cfd4c79d","pregenerated/vpaes-x86_64-nasm.obj":"6c8c834652ae8721cb79117042e25151656aea9510bf545085f471e28d506d62","pregenerated/x86-mont-elf.S":"c410ae3e4ae6a3b5d083c5637dfc1e56726bc0a48a7e5a0f8f0d64839ae31001","pregenerated/x86-mont-macosx.S":"7d85116fc8a29c64215166fb2c44566dc7c1b31048a635605f4fd8fcbaea3459","pregenerated/x86-mont-win32n.obj":"dedb267ca7c096002cbaa0b8a7c50c4bdbad49075fc5eda05a36bc7317ce6d0a","pregenerated/x86_64-mont-elf.S":"a80d374dfc65de88a57244457db872c49280303de86be22965641211cde27592","pregenerated/x86_64-mont-macosx.S":"191c8e8dc9e8dfd07f3cf9e52e8bd18a8209cf25f648ba0e1c7f724307830377","pregenerated/x86_64-mont-nasm.obj":"19f0bdeca2fab921036334106bc5045446c24bc2c2420e2899e4f25a8c572383","pregenerated/x86_64-mont5-elf.S":"2c9e98a0d6a06f8e60b1c558f0a1392072b4f8d3f3782b9a058d01c60b083ee6","pregenerated/x86_64-mont5-macosx.S":"cfcd23902e6ed06dfb1bbb736c13f286de756e37a9dc8e70eb0414d382f27386","pregenerated/x86_64-mont5-nasm.obj":"9683a81571b9729c0d2c7c85d3a2d97818b468c0de0dc5f785683a5cc90d3c4e","src/aead.rs":"003f872da7427c2f67a6e11961ccb24ab4d2421bdfc40ff6cdbe8c99904cd5f4","src/aead/aes.rs":"6e728e446d322d6d8adf81143c4d02547ae462375819ddb436ee4d8dbd4527dc","src/aead/aes_gcm.rs":"6cbd8613ce92e68d9959cd3b9d0c683238c015d6278f1129c1b374ac6dbabd85","src/aead/aes_tests.txt":"4ae334ed8c34c0cef24c22b73568faec906a39e26a428e4cd6fe4f810cc51fb0","src/aead/block.rs":"813e46cff3bf4293ad3d4ef241f4539dd44d857d8bf4e364c1d5a82136e209d4","src/aead/chacha.rs":"f91bbfada73940849555c4fb484900f721b372ff3fe7e92ef4defe796b2f7c58","src/aead/chacha20_poly1305.rs":"7edc8ec1d2924d135f7fe7a4e747cd9df271ff56551c0fca1f6a8a51e4a2c869","src/aead/chacha20_poly1305_openssh.rs":"3bcce02de1a133d770158751f5d0f15fd6ff456fca801c942397664c3645b7a8","src/aead/chacha_tests.txt":"6ed1303cef7a0ffa30cc76f9933509a2d952a334b80c731d52d32c6ef3b37042","src/aead/counter.rs":"164bbe9701f15453a05656f35c27958e0dfb52a747770a6def9011966c092c04","src/aead/gcm.rs":"db2aa2c959aeeb63533747aaa04ade292368f8d6af35884db2fd1e9b205391c9","src/aead/gcm/gcm_nohw.rs":"a63e73d88c95be1f1aed2df212f7d6fda397fc6b026ad29781b1fa114724ae76","src/aead/iv.rs":"2d14af136fca616d0f801891452e15e82d84967d10646436d81be38326b8ee23","src/aead/nonce.rs":"6f2650e0b41dbed50faf9323eef82c2fb469696c45a30a86e136e3ed72fdfc84","src/aead/poly1305.rs":"5820ca403cdee995866953c1151b1a9b36befe93a663d0e5ddc1ca8ad361159a","src/aead/poly1305_test.txt":"89be1be8e403e5a17845f0603e19337604f1f278c7b283de2c7227ef6041491f","src/aead/quic.rs":"bad997157e38925bd972b028ab8224cf729e6603bb4c3bcc5e712f950dc74bcf","src/aead/shift.rs":"0a39a662e5d2571f9a69857d9e006491ac3f4580f954e8581d81574deb6cb3e9","src/agreement.rs":"3cd5a496eae019b263e59e921ebd4ecd3c1f65344fc2f1feae0dcf723016fbe3","src/arithmetic.rs":"af3619f2da6c0475d961d40fd6fe256035ee8523802a759814c65b7b5d38686f","src/arithmetic/bigint.rs":"3f5085b77a057d0fa327cd063d0a8cbb6d22a48b0cb56dda2f27d97b993e0828","src/arithmetic/bigint_elem_exp_consttime_tests.txt":"5f84de732433df1e0db3b3eb690bdb0cc1a735bdc7e60a8218d5910e9d9ac436","src/arithmetic/bigint_elem_exp_vartime_tests.txt":"6501c58fa66083ceb7dffe14a0191cd6a2d74a96aafeb72d828841844a37f409","src/arithmetic/bigint_elem_mul_tests.txt":"0de8d667f4bae0648607cff2c53df81a6b2ccddb8ee620593350255b36de0e91","src/arithmetic/bigint_elem_reduced_once_tests.txt":"7b4aea41259ffa329d669843d6dbf29a5ba56d845210bbf4b0a2ccafbe8d8c01","src/arithmetic/bigint_elem_reduced_tests.txt":"7c5dd25b495b89bab09e8f09cbbecf34aa28ee7eb2ed592bad50ab63e5b17ebe","src/arithmetic/bigint_elem_squared_tests.txt":"0517a5446667fd49d198a89fd93f19d9870fd3fddad3371ad9aa8075b6020e22","src/arithmetic/constant.rs":"a5c0448ff100ba4c137dc320b2b30f997cfc2e973847da7301f097265c338ed9","src/arithmetic/montgomery.rs":"adb7d8e3bb058fcbab6911967d62cf2e2b2ffc9fa165cc8da0de984fe6eab5d2","src/bits.rs":"b2d30f13b13a73d02ffccc9d116554eb03889a42d893a73cf5793d361365190b","src/bssl.rs":"e9d0413f24aed47def667f65098e3d138532fd4624d563230009be34ea5bed0d","src/c.rs":"d96cdd683f4ffc4d3a287d1adb7e07006b2a18e47513aafedceb385c979b669c","src/constant_time.rs":"214de9c0fe5b22f3db4b84a323754cdc9eb9d3d1030e37b7275e566912287e07","src/cpu.rs":"862202907b124cc43026428585ac789b7e8fdbef1093437169ca3a30110570fd","src/data/alg-rsa-encryption.der":"7bc023427767a2f2e156f8ae030d06d19f862e326b952116649b423c3ff7110e","src/debug.rs":"6781fc1d6a02c7e70f1e2c0ca0f0a51695e7ec540b2a17a2ced85cce12ee1b34","src/digest.rs":"36ef202b9eac667929f2e2d5a1abef550fd7e776c758f956a063e665d59a5273","src/digest/sha1.rs":"1b2246fa4f399b663a85e75e227c0709623acff18c5851913522acf213236cbe","src/digest/sha2.rs":"506005139eccea01710ff06567c1cef53dc4a48f42ccfe310f9edb87e51385ad","src/ec.rs":"9b59ba0e616fa6cda295cf5df7d69deea560546ce4749977861bfb5c99c1e696","src/ec/curve25519.rs":"06dc74549ba985176a2e48474d8621bc08588d8d28816b92ebfcbe8e8f2c9f30","src/ec/curve25519/ed25519.rs":"d025eac2dfce52442a9d1aa0c159509bee7c8b6fd48506b90aa5bb4e4f09dc5f","src/ec/curve25519/ed25519/ed25519_pkcs8_v2_template.der":"1bd2db034b5160de343688ff570db3da6a5bbfc66f9f2dd015f0902e2d2b7e34","src/ec/curve25519/ed25519/signing.rs":"2f76fa5149d902f05009cc33bf100006b6933de8b4b9fbbfb0cb3137f0dfef76","src/ec/curve25519/ed25519/verification.rs":"ceca0fd74d34ed656434998ee83391e13b2c6f00261cdf838179b4771329ff89","src/ec/curve25519/ops.rs":"0537473d8827e018071a958163cd61211a8a99a4c10420c566d93a6479bb82bc","src/ec/curve25519/scalar.rs":"f3167f9f9099ca46f5a3cfc31da7421967f8f7a4077bbe6f855e9ce33fcc33e4","src/ec/curve25519/x25519.rs":"90a6de55acf56c00a5ce35efc4c7c4223e355053b57aaf4bb88e054bebbb05ed","src/ec/keys.rs":"31b41f125107b489c5ca8fd35897c7bf68ae61bd013181cda096b150a45eaa82","src/ec/suite_b.rs":"ea7a3e143791d9c2bc8c753617ade5f8d8777024a8a0e9c4e9582933a828c68c","src/ec/suite_b/curve.rs":"64926ae050efe82a04880d24d3abb26f3e4765773d457627e5e39bcc3d008482","src/ec/suite_b/ecdh.rs":"0cc05ceceacb362489ea4f4a6a006e0aad8488d70996fdb80c1884a56ed576e0","src/ec/suite_b/ecdsa.rs":"013e0d2d2a21eb437253b03a1f6a1a4ba8c45eb1c2ea1396696bdd04a8ed2932","src/ec/suite_b/ecdsa/digest_scalar.rs":"e9036c7cad58a3333611c24c3483481c5856225fc7e479c02c8e652b692786f1","src/ec/suite_b/ecdsa/ecPublicKey_p256_pkcs8_v1_template.der":"5a2207da0199ebe3e2a80e15e7692b21f215f855ed3bd2c51f466c7969e11990","src/ec/suite_b/ecdsa/ecPublicKey_p384_pkcs8_v1_template.der":"5ec14cd6aac17cec849382ee5e2077497f98ce435d7aee2116cd092bf84f5556","src/ec/suite_b/ecdsa/ecdsa_digest_scalar_tests.txt":"7f38872c3acbd5d156783de92f3671062101af3cc496c1b261165971b3eea2ee","src/ec/suite_b/ecdsa/ecdsa_sign_asn1_tests.txt":"ab92cd110846b42d7738374d25734cff6459467f40121c4e7fda5b31bee651e2","src/ec/suite_b/ecdsa/ecdsa_sign_fixed_tests.txt":"c471d314f18270c79141062d5964d84fbe38c1bb9559ca217f3511d34fc4af25","src/ec/suite_b/ecdsa/signing.rs":"5d6f26173d4d12fad3df5d7771de7d2412bad746b11a1673a42b05b095f3f56b","src/ec/suite_b/ecdsa/verification.rs":"e5e027197b73382b73b69d14e450ed75d7fba0934bcf683589ed482df3161480","src/ec/suite_b/ops.rs":"f526e5aceb3344b22e97d3e615cde8b9f40804dfada3e93152e23eb37e3f8f60","src/ec/suite_b/ops/elem.rs":"365792ad051514a3354a63b84b16c9d3189e25ce9363092838835df246409a4f","src/ec/suite_b/ops/p256.rs":"b3952d225bf0edb5a6b9f7d0d427c5960ccd4a85d3c97c4f6e13e2e7dba18c8e","src/ec/suite_b/ops/p256_elem_mul_tests.txt":"02e7a991d6643a81229f462d21ea72f0503c038d783583c83ad7f118952ecf0b","src/ec/suite_b/ops/p256_elem_neg_tests.txt":"b61eb959dd473bd8edbc4566f18be0ac9f483be9e7d0900f48eb764454475807","src/ec/suite_b/ops/p256_elem_sum_tests.txt":"2fbbc13100065539bce71e83d642878a90103b5ca3d9b8d3c321db15a0c05c9e","src/ec/suite_b/ops/p256_point_double_tests.txt":"34a5968bb40320c6cc0f7d248951376823d46c0aab1fc7ba59311bc1cfd34417","src/ec/suite_b/ops/p256_point_mul_base_tests.txt":"f207084da07de3f63b7563b07994915dc770e2b7d5dfe41881b2ffe875ad69d7","src/ec/suite_b/ops/p256_point_mul_serialized_tests.txt":"f3c8061e0f891441de35e80869c253c65fea2ed1dd4f9be7a444c956211d32ae","src/ec/suite_b/ops/p256_point_mul_tests.txt":"894e02359b562f3d74757f4d8fdd20c5fc5528634f5922ce01d9546910e0b0b9","src/ec/suite_b/ops/p256_point_sum_mixed_tests.txt":"c2a178ad0371ff7dcf15364edbbb5cd0e82478d7e1037a6d3b2243204465f918","src/ec/suite_b/ops/p256_point_sum_tests.txt":"1ede1f508c673890e2f48ba53309397a17a02f13370aac114f34ea0c3c4f4617","src/ec/suite_b/ops/p256_scalar_mul_tests.txt":"6fa09fc69c9962c31f090ffc747d4cafe184429b8e0acad3adda7b14ac26a4ef","src/ec/suite_b/ops/p256_scalar_square_tests.txt":"19633fcefdf8af6685fa9750a96c17478e282972ee7ffbf4c4303229f7938db3","src/ec/suite_b/ops/p384.rs":"1881e96ce311f1a1c4532c87feb9bbab3dc32177d01afd4a4375ab5ab67a5bda","src/ec/suite_b/ops/p384_elem_div_by_2_tests.txt":"8c4d02994577c8b6ec3a83158fe20ce92366052ddff349b02bad4595847be8cc","src/ec/suite_b/ops/p384_elem_mul_tests.txt":"acf37680470a3574acfe64cb3629186d1f29bc8e905c5d9c1e40a2c2bde2701d","src/ec/suite_b/ops/p384_elem_neg_tests.txt":"08986c5fb0b8adfd3be6ba217ee68308c5e452dba086d92793e0ce3383c1acaa","src/ec/suite_b/ops/p384_elem_sum_tests.txt":"48850b24fca0487a875379b6de77879f97578f50111c11a12e8d789f6c8f0ab4","src/ec/suite_b/ops/p384_point_double_tests.txt":"6d25547058f40d98ef3c2a1957fb72a57f4fb19623c28dda92b42b7adc93bc9a","src/ec/suite_b/ops/p384_point_mul_base_tests.txt":"4995baf7080a6a4d72de1d262300c4ee49d0449034e1250f87bb15fadb78408f","src/ec/suite_b/ops/p384_point_mul_tests.txt":"2fa85969ab080e6f977ed92abbe29f6f5f0658e5ee126834769673ff557efbd0","src/ec/suite_b/ops/p384_point_sum_tests.txt":"5cbdf15ce4a56a952b85046e49cd0fc4ee22d516d914ab48c19b7801864bd352","src/ec/suite_b/ops/p384_scalar_mul_tests.txt":"f88e82363d7a1eb4fd687bd54dec6cb05e2796e751f39b5c774c11af0569bea5","src/ec/suite_b/private_key.rs":"6d2926d33fb5a0468f57a7de94f5321b054e851ddc1cba6fe0c1eeadc200db51","src/ec/suite_b/public_key.rs":"f254259ce6dcad4f2ec981b0d3140952473cbe98d9c7c97ff96c1d9da369df0f","src/ec/suite_b/suite_b_public_key_tests.txt":"392bcb543cf69cbab5252792a8dfe09ffa3421cb27d65cdafe9771bd68d49a5d","src/endian.rs":"cd2369b4b61d2c51d03eab1e5cbc4c738e4c24376699bea6707b26a110115aa0","src/error.rs":"baecffe0297dbfa9ae277bdfc5b2338dc34a856fcf6d8848bc5922298c9b1a3c","src/hkdf.rs":"c1928b1bdaebd74e2a21064cbab3ea2477dbce59bfe717c04d557362979daa54","src/hmac.rs":"04beeb74fac2f12ddb112b7272430333014bf1b4e028ccdff6755d40697fc0d7","src/hmac_generate_serializable_tests.txt":"d9fad4aa957496eb05dd67d97699631bd428de8a5be6e29aeb82b732eae97a59","src/io.rs":"83ead14e2d50b5e80a1fc813781a097825f06743924bb6eaa85eef7a7c6198f3","src/io/der.rs":"550b7e8561207a8f4af2b63fbef9b8573f6de843ee4e1630a7450171529496c9","src/io/der_writer.rs":"ba6f9c5452b0b67db75765f1eb686078896aca591e76d27673097d6b32057954","src/io/positive.rs":"3cba48798f15870075eb5177b1d430fad7857e574bfbb1ddd4a6cc2bdc2efcf6","src/io/writer.rs":"9012a7b89d1597797d613ffc754765a43d2185e95cf98872c62f60ee5538b0f7","src/lib.rs":"7b6094dbb914f97c6e68d994c78910303fad259dcd83a31d16fbca04852014c8","src/limb.rs":"ff626c337d8b559b6c83f5d9b93a569bee078807fbe58fb5e6506c06c3227fc0","src/pbkdf2.rs":"5a6a58b9f45f579d831c49afeb373400cb6d7a8fc32da37f44f9a2871a4d0e33","src/pkcs8.rs":"554b10b05ebb5a7474ed41d22dbda33ceee237b737cabd0ca7b73d3b56a5248e","src/polyfill.rs":"39c7deed8c1b34dc0d62aeb7a8989a61651a97f95ced62d7187ae6bb566cb39d","src/rand.rs":"32fd0bfbf0d934b49571ebfa6fc1a45bbfd8410e185f26a8c6d76442429fa0c0","src/rsa.rs":"19879586b7a132d21f9b994cd96a937933c2bd5d8030e8e9397c08c14c4a3f17","src/rsa/convert_nist_rsa_test_vectors.py":"9480f86d8c9a8ca77a6606036e8c2de02c444265deb3c98bb7fc1e4117b4462d","src/rsa/padding.rs":"53dc68748c5a1c1334a1be5643d8e9654c7c844fd1b372c3dad848f7871f638c","src/rsa/rsa_pss_padding_tests.txt":"1b68a294521e983a4a35fd7ad4e5823d6173641ad63d736b3b8e6e867f748ea8","src/rsa/signature_rsa_example_private_key.der":"5344d57f719a98c4464aed1d1c2fa569f0a9de8621c6fdec7d28923a0e1c662c","src/rsa/signature_rsa_example_public_key.der":"28b0a357936485bd2a7776321cccfe17c2347f2bb75751ddf9dfc6429cacb6f1","src/rsa/signing.rs":"c9bf4381dc3b4a35c6513ebeb9b3a0870fd217fbf3b1277d155bf10fec531e8c","src/rsa/verification.rs":"2ed4dd2f6fc1d24f4fe6a8deb60f3af1bd397c3aca748de1fe330c78c50f36a8","src/signature.rs":"9cefccc5cf8369d4185242c680c085ca5e5d125d6017d9e387271f3989de887b","src/test.rs":"7ff06984616c12163a1427b3eb93da5ad9cd050d8ca09fa65069e1a00208b1ae","src/test_1_syntax_error_tests.txt":"c6e72aaee3817e145fea114020193c5b3acbbd2f3a97614f1c2670822f1ac6f1","src/test_1_tests.txt":"1014aec056f9a06eb23983e61eb6dae8384ee982f4eb0c5be002fb5d6ce10f99","src/test_3_tests.txt":"e489a2da5f486e75cd6e2cf7089f09d6ddf61a8765fd58c47bc79ad32be77e13","tests/aead_aes_128_gcm_tests.txt":"2e88612cf3d767626f62d59d81652fef5611f4418bf56016c12ac0bc26a12a20","tests/aead_aes_256_gcm_tests.txt":"c21fab30c0098cddef658908ca2820d656c4717d24d79ef3dd68251695972040","tests/aead_chacha20_poly1305_openssh_tests.txt":"85a012f4b6bc9b7ca5af861179ce832ea93e4a175b604be781bd1fdd9accc24e","tests/aead_chacha20_poly1305_tests.txt":"3688abbd7b1d87c9200b627c289a2bebf763f512baadf536cd72cc8f3ce80fe5","tests/aead_tests.rs":"34ba985fa0137232af48c3854a88b2f964f1c9cd5c0ac9fd4e6fb02282c30ed2","tests/agreement_tests.rs":"46367d118bd47eb0fbfb848a0ffb54b127e55f54a081893099f0bae9bdbaf052","tests/agreement_tests.txt":"4b784d203e87f9de0678df00ac1b2a28db169f680a3333e9d773656fcebceea9","tests/constant_time_tests.rs":"89a777d20a5066b8c961ee7204ddd8c4b6731857e20576d7345069e929b5ff1d","tests/digest_tests.rs":"9d416a88e306ddb0225b83ae26133d86510847fd0ec71cdbb2e73eb183f6bc23","tests/digest_tests.txt":"dd817794e2ba72ed637805e225240a295ae7b4cbea956dcd23c4752da67a394c","tests/ecdsa_from_pkcs8_tests.txt":"8880710ed78fea954b23f7adda6189b599307f22ba5c24b44f8ca9f00e9bbb6c","tests/ecdsa_test_private_key_p256.p8":"d56f99994233d749d03315f5cb9797fad81d3e25f962d2cd543d4dfe7cdd1389","tests/ecdsa_test_public_key_p256.der":"93c930878dc29d802b151bf492a2f00672b2240b740002a650ccb706664d10c9","tests/ecdsa_test_public_key_p256_debug.txt":"ccce94ab37a5e5286f0e5f1934bdeb39539e8f72bc7ccd0a1f666c9a1abc0bdb","tests/ecdsa_tests.rs":"a7aa7c7ba2ad2457a530fb0cc3d6230ea5333716c4342f89abed4aa593cb9fa8","tests/ecdsa_verify_asn1_tests.txt":"4ae6325e0a1fdf4cd6fd2f299a7fb7a60927d0775b63aa9b027676fa76f3ee6d","tests/ecdsa_verify_fixed_tests.txt":"837f116fca066cb181677e389cf92b684d15ed883189b4544538cb5387e6b742","tests/ed25519_from_pkcs8_tests.txt":"4312701b6fbc57992598a4db50b0bf9bcc1df91004901f43e30982ba85d9d466","tests/ed25519_from_pkcs8_unchecked_tests.txt":"e2a7a54c8ea31b87bb5357a002f6f4c11b50ad5050681aaed91a375ef58c239b","tests/ed25519_test_private_key.bin":"644d50ab64864c20a12b3c4656d46b4a48f69ef7c47ecdc8415cd28316b22ef5","tests/ed25519_test_private_key.p8":"13e11da834fecc6aed04d8ff36a0301a5fb8187c86f5ab0f9cde434eda6762fe","tests/ed25519_test_public_key.bin":"21fe31dfa154a261626bf854046fd2271b7bed4b6abe45aa58877ef47f9721b9","tests/ed25519_test_public_key.der":"119e5ed7b8533bdf24897f07fe4dd57671a64f8d10534ba128c9bb016af86484","tests/ed25519_tests.rs":"e25677a3b5d9562d779f96b5ab0c87e8c660c37b0d168a4d4914e86b8ac4570a","tests/ed25519_tests.txt":"f99c7e7bf7cbbd7df936ca883ca0cb293c31ad37c03597890fdb07dc1c923d36","tests/hkdf_tests.rs":"fa08f594d00fba48b1add8f5c9784ed119ebea7ab829c831df1c688357899abf","tests/hkdf_tests.txt":"558f087d6b6b06cd542487017e4ef2e2926052f3cdbbe9fe50a2085f4d83aad0","tests/hmac_tests.rs":"59168ccc15d1cf627153f00fc4451cdb210731da6035299a9b05d48ba8a218a7","tests/hmac_tests.txt":"272c143921789a66d39396843c2fa0aadbdfe26d061bd2b7836ec40dfc76e09e","tests/pbkdf2_tests.rs":"ffe1be0230f1c156006d0891e33ff813f8a24ff75c5fc0fa5452f06914c69ee5","tests/pbkdf2_tests.txt":"db65f42fb72cec9ca89c8c071d11c341f67c4df5e0c66a70735da5d1d370cee3","tests/quic_aes_128_tests.txt":"786f989f301ca97b17e3a62e1dd5d9562baf0f3081f59de5e34fcc4d9e8d9580","tests/quic_aes_256_tests.txt":"63540293d9b95e67aa9cdb7effdb5d40f977ec6a527490ce7b32592debac0428","tests/quic_chacha20_tests.txt":"b0c2abc90ecbb0146fa812c33641ad643380189429bb9e7c7db1b32d3363c67a","tests/quic_tests.rs":"6b5285ba4bd0347b74ee74a77324ec019cc3c0d5d7ea118be0933b5719d0ccf8","tests/rand_tests.rs":"43676fdfc9c759b5960656137bde936da07186617155482e94e1f452bbe47110","tests/rsa_from_pkcs8_tests.txt":"2ccd777cc8014904bb98de0462ee220c0a641f88d67aac489cff0742c9a1bc9f","tests/rsa_pkcs1_sign_tests.txt":"4dc33c2a47412849c1c860a1b0b3f59293fabd438611d65d3d9f70722a272967","tests/rsa_pkcs1_verify_tests.txt":"9f091f8ceb39f6542f90271756d9da65b1791bac53a0f5daf9f2e30b2f3c7949","tests/rsa_primitive_verify_tests.txt":"68c90857490543bcfb836f3b8644445acfe90a2e4c5189310914ce5484927418","tests/rsa_pss_sign_tests.txt":"aca70cfc877b055c0a29da2a457563cd1b5afe6e932b011e8b9a15d57dbe10d0","tests/rsa_pss_verify_tests.txt":"afcde20cea975ea235d9828bbb9b083f77584a7cb8c5c955e40c4bd305573f4a","tests/rsa_test_private_key_2048.p8":"a0d95a0b133b4c217bc11322b67d62eb13537b8a9f66e20b5c9b5ac31af21859","tests/rsa_test_public_key_2048.der":"7180acb59312d3544c3b36975ae6c4c55f59035ce4de487852cf6c99b33868cd","tests/rsa_test_public_key_2048_debug.txt":"04bd9f0854fd9c1bd4cc91cf9b0e0a1b4aba790e67f1cf5b3f80c85b81349321","tests/rsa_tests.rs":"15b20531171daff6a0de36dfa1b52be646062f1de24b39873ec97e491ec1e165","tests/signature_tests.rs":"7219ced0ce0dd552726a0fc3c98f05bff5ec1f645981862672967b50d6159491","third_party/NIST/SHAVS/SHA1LongMsg.rsp":"c765dbc1609e9046b12f60a5285a88128dab4315080c94ce9f2a57a7b0b980be","third_party/NIST/SHAVS/SHA1Monte.rsp":"d458fa7e39095b4e292a75b0cd224f90b72dc801a63ad2c0d75b8f10d745ab6d","third_party/NIST/SHAVS/SHA1ShortMsg.rsp":"be0991ddc5372932d55804b11713c9140d10435ef4b316a0773e3506eec79cda","third_party/NIST/SHAVS/SHA224LongMsg.rsp":"d37115e5d2286dde969c5e1b2275cd83ecb066366d7a38bb6b2b3adb4a88de89","third_party/NIST/SHAVS/SHA224Monte.rsp":"7854d388666ea3eb01bdaca37dc8ae0bc39d30f8731d9a5487cbd61de47d1d59","third_party/NIST/SHAVS/SHA224ShortMsg.rsp":"0dad6656c08f77252f6ccb789e42284fd61fc53bba30e83162800aa3d2aa939f","third_party/NIST/SHAVS/SHA256LongMsg.rsp":"6fac36f37360bcf74ffcf4465c18e30d6d5a04cc90885b901fc3130c16060974","third_party/NIST/SHAVS/SHA256Monte.rsp":"29ea30c6bb4b84e425fb8c1d731c6bb852dac935825f2bd1143e5d3c4f10bfb9","third_party/NIST/SHAVS/SHA256ShortMsg.rsp":"75e1cb83994638481808e225b9eb0c1ebd0c232d952ac42b61abce6363be283c","third_party/NIST/SHAVS/SHA384LongMsg.rsp":"536171765a4278c000ac3c9913edb2eed0ca7ccd5a10b72ed79fdfe7901a6d6a","third_party/NIST/SHAVS/SHA384Monte.rsp":"4270099431ff52ee1686dc472351e681c26c507433df8f107c7de203b771424e","third_party/NIST/SHAVS/SHA384ShortMsg.rsp":"7ea7bcf00fadc20949fae63703e40681ddf288fea808471cb3cbc95f3ec16811","third_party/NIST/SHAVS/SHA512LongMsg.rsp":"b1f3f05d5c209777954d49521d7ea1349447c36a0c52849e044bc397a27dd410","third_party/NIST/SHAVS/SHA512Monte.rsp":"8ca78659286c2f01667a98fc7accd32fc171ae7b24ac00f1a8ce6b77770247fa","third_party/NIST/SHAVS/SHA512ShortMsg.rsp":"e53a36c03609e5a3e3cc4b6e117a499db7864c23ec825c6cec99503a45f40764","third_party/fiat/LICENSE":"0c125a4dab5ab869473e6491db22f6c0a7f8a4de58588d03bb2b16c0c8ebd7de","third_party/fiat/curve25519_32.h":"7bcd226c85bdb0fe8fd4d80c006cc3fab4352df94aa8fedd826b6b1f60beaecf","third_party/fiat/curve25519_64.h":"b57420753499030621a681cbfac90df82f641147e6b8c55ee644c8fe9178e291"},"package":"3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/Cargo.toml temporalio-1.3.0/vendor/ring-0.16.20/Cargo.toml --- temporalio-1.3.0/vendor/ring-0.16.20/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/Cargo.toml 1970-01-01 00:00:00.000000000 +0000 @@ -1,92 +0,0 @@ -# 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 believe there's an error in this file please file an -# issue against the rust-lang/cargo repository. If you're -# editing this file be aware that the upstream Cargo.toml -# will likely look very different (and much more reasonable) - -[package] -edition = "2018" -name = "ring" -version = "0.16.20" -authors = ["Brian Smith "] -build = "build.rs" -links = "ring-asm" -include = ["LICENSE", "Cargo.toml", "pregenerated/*", "build.rs", "crypto/chacha/asm/chacha-armv4.pl", "crypto/chacha/asm/chacha-armv8.pl", "crypto/chacha/asm/chacha-x86.pl", "crypto/chacha/asm/chacha-x86_64.pl", "crypto/cipher_extra/test/aes_128_gcm_siv_tests.txt", "crypto/cipher_extra/test/aes_256_gcm_siv_tests.txt", "crypto/constant_time_test.c", "crypto/cpu-intel.c", "crypto/crypto.c", "crypto/curve25519/asm/x25519-asm-arm.S", "crypto/curve25519/curve25519.c", "crypto/curve25519/curve25519_tables.h", "crypto/curve25519/internal.h", "crypto/fipsmodule/aes/aes_nohw.c", "crypto/fipsmodule/aes/asm/aesni-x86.pl", "crypto/fipsmodule/aes/asm/aesni-x86_64.pl", "crypto/fipsmodule/aes/asm/aesv8-armx.pl", "crypto/fipsmodule/aes/asm/bsaes-armv7.pl", "crypto/fipsmodule/aes/asm/bsaes-x86_64.pl", "crypto/fipsmodule/aes/asm/vsaes-armv7.pl", "crypto/fipsmodule/aes/asm/vpaes-x86.pl", "crypto/fipsmodule/aes/asm/vpaes-x86_64.pl", "crypto/fipsmodule/bn/asm/armv4-mont.pl", "crypto/fipsmodule/bn/asm/armv8-mont.pl", "crypto/fipsmodule/bn/asm/x86-mont.pl", "crypto/fipsmodule/bn/asm/x86_64-mont.pl", "crypto/fipsmodule/bn/asm/x86_64-mont5.pl", "crypto/fipsmodule/bn/internal.h", "crypto/fipsmodule/bn/montgomery.c", "crypto/fipsmodule/bn/montgomery_inv.c", "crypto/fipsmodule/ec/asm/ecp_nistz256-armv4.pl", "crypto/fipsmodule/ec/asm/ecp_nistz256-armv8.pl", "crypto/fipsmodule/ec/asm/ecp_nistz256-x86.pl", "crypto/fipsmodule/ec/asm/p256-x86_64-asm.pl", "crypto/fipsmodule/ec/ecp_nistz.c", "crypto/fipsmodule/ec/ecp_nistz.h", "crypto/fipsmodule/ec/ecp_nistz256.c", "crypto/fipsmodule/ec/ecp_nistz256.h", "crypto/fipsmodule/ec/ecp_nistz256_table.inl", "crypto/fipsmodule/ec/ecp_nistz384.h", "crypto/fipsmodule/ec/ecp_nistz384.inl", "crypto/fipsmodule/ec/gfp_p256.c", "crypto/fipsmodule/ec/gfp_p384.c", "crypto/fipsmodule/ecdsa/ecdsa_verify_tests.txt", "crypto/fipsmodule/modes/asm/aesni-gcm-x86_64.pl", "crypto/fipsmodule/modes/asm/ghash-armv4.pl", "crypto/fipsmodule/modes/asm/ghash-x86.pl", "crypto/fipsmodule/modes/asm/ghash-x86_64.pl", "crypto/fipsmodule/modes/asm/ghashv8-armx.pl", "crypto/fipsmodule/sha/asm/sha256-armv4.pl", "crypto/fipsmodule/sha/asm/sha512-armv4.pl", "crypto/fipsmodule/sha/asm/sha512-armv8.pl", "crypto/fipsmodule/sha/asm/sha512-x86_64.pl", "crypto/internal.h", "crypto/limbs/limbs.c", "crypto/limbs/limbs.h", "crypto/limbs/limbs.inl", "crypto/mem.c", "crypto/perlasm/arm-xlate.pl", "crypto/perlasm/x86asm.pl", "crypto/perlasm/x86gas.pl", "crypto/perlasm/x86nasm.pl", "crypto/perlasm/x86_64-xlate.pl", "crypto/poly1305/internal.h", "crypto/poly1305/poly1305.c", "crypto/poly1305/poly1305_arm.c", "crypto/poly1305/poly1305_arm_asm.S", "crypto/poly1305/poly1305_vec.c", "crypto/cipher_extra/asm/chacha20_poly1305_x86_64.pl", "doc/link-to-readme.md", "examples/checkdigest.rs", "include/GFp/aes.h", "include/GFp/arm_arch.h", "include/GFp/base.h", "include/GFp/check.h", "include/GFp/cpu.h", "include/GFp/mem.h", "include/GFp/poly1305.h", "include/GFp/type_check.h", "src/aead.rs", "src/aead/aes.rs", "src/aead/aes_gcm.rs", "src/aead/aes_tests.txt", "src/aead/block.rs", "src/aead/chacha.rs", "src/aead/chacha_tests.txt", "src/aead/chacha20_poly1305.rs", "src/aead/chacha20_poly1305_openssh.rs", "src/aead/counter.rs", "src/aead/gcm.rs", "src/aead/gcm/gcm_nohw.rs", "src/aead/iv.rs", "src/aead/nonce.rs", "src/aead/poly1305.rs", "src/aead/poly1305_test.txt", "src/aead/quic.rs", "src/aead/shift.rs", "src/agreement.rs", "src/arithmetic.rs", "src/arithmetic/bigint.rs", "src/arithmetic/bigint_elem_exp_consttime_tests.txt", "src/arithmetic/bigint_elem_exp_vartime_tests.txt", "src/arithmetic/bigint_elem_mul_tests.txt", "src/arithmetic/bigint_elem_reduced_once_tests.txt", "src/arithmetic/bigint_elem_reduced_tests.txt", "src/arithmetic/bigint_elem_squared_tests.txt", "src/arithmetic/constant.rs", "src/arithmetic/montgomery.rs", "src/array.rs", "src/bits.rs", "src/bssl.rs", "src/c.rs", "src/constant_time.rs", "src/cpu.rs", "src/data/alg-rsa-encryption.der", "src/debug.rs", "src/digest.rs", "src/digest/sha1.rs", "src/digest/sha2.rs", "src/ec/curve25519/ed25519/digest.rs", "src/ec/curve25519/ed25519.rs", "src/ec/curve25519/ed25519/signing.rs", "src/ec/curve25519/ed25519/verification.rs", "src/ec/curve25519/ed25519/ed25519_pkcs8_v2_template.der", "src/ec/curve25519.rs", "src/ec/curve25519/ops.rs", "src/ec/curve25519/scalar.rs", "src/ec/curve25519/x25519.rs", "src/ec.rs", "src/ec/keys.rs", "src/ec/suite_b/curve.rs", "src/ec/suite_b/ecdh.rs", "src/ec/suite_b/ecdsa/digest_scalar.rs", "src/ec/suite_b/ecdsa.rs", "src/ec/suite_b/ecdsa/signing.rs", "src/ec/suite_b/ecdsa/verification.rs", "src/ec/suite_b/ecdsa/ecdsa_digest_scalar_tests.txt", "src/ec/suite_b/ecdsa/ecPublicKey_p256_pkcs8_v1_template.der", "src/ec/suite_b/ecdsa/ecPublicKey_p384_pkcs8_v1_template.der", "src/ec/suite_b/ecdsa/ecdsa_sign_asn1_tests.txt", "src/ec/suite_b/ecdsa/ecdsa_sign_fixed_tests.txt", "src/ec/suite_b.rs", "src/ec/suite_b/ops/elem.rs", "src/ec/suite_b/ops.rs", "src/ec/suite_b/ops/p256.rs", "src/ec/suite_b/ops/p256_elem_mul_tests.txt", "src/ec/suite_b/ops/p256_elem_neg_tests.txt", "src/ec/suite_b/ops/p256_elem_sum_tests.txt", "src/ec/suite_b/ops/p256_point_double_tests.txt", "src/ec/suite_b/ops/p256_point_mul_base_tests.txt", "src/ec/suite_b/ops/p256_point_mul_serialized_tests.txt", "src/ec/suite_b/ops/p256_point_mul_tests.txt", "src/ec/suite_b/ops/p256_point_sum_mixed_tests.txt", "src/ec/suite_b/ops/p256_point_sum_tests.txt", "src/ec/suite_b/ops/p256_scalar_mul_tests.txt", "src/ec/suite_b/ops/p256_scalar_square_tests.txt", "src/ec/suite_b/ops/p384.rs", "src/ec/suite_b/ops/p384_elem_div_by_2_tests.txt", "src/ec/suite_b/ops/p384_elem_mul_tests.txt", "src/ec/suite_b/ops/p384_elem_neg_tests.txt", "src/ec/suite_b/ops/p384_elem_sum_tests.txt", "src/ec/suite_b/ops/p384_point_double_tests.txt", "src/ec/suite_b/ops/p384_point_mul_base_tests.txt", "src/ec/suite_b/ops/p384_point_mul_tests.txt", "src/ec/suite_b/ops/p384_point_sum_tests.txt", "src/ec/suite_b/ops/p384_scalar_mul_tests.txt", "src/ec/suite_b/private_key.rs", "src/ec/suite_b/public_key.rs", "src/ec/suite_b/suite_b_public_key_tests.txt", "src/endian.rs", "src/error.rs", "src/hkdf.rs", "src/hmac.rs", "src/hmac_generate_serializable_tests.txt", "src/io.rs", "src/io/der.rs", "src/io/der_writer.rs", "src/io/positive.rs", "src/io/writer.rs", "src/lib.rs", "src/limb.rs", "src/endian.rs", "src/pbkdf2.rs", "src/pkcs8.rs", "src/polyfill.rs", "src/polyfill/convert.rs", "src/rand.rs", "src/rsa/convert_nist_rsa_test_vectors.py", "src/rsa.rs", "src/rsa/padding.rs", "src/rsa/random.rs", "src/rsa/rsa_pss_padding_tests.txt", "src/rsa/signature_rsa_example_private_key.der", "src/rsa/signature_rsa_example_public_key.der", "src/rsa/signing.rs", "src/rsa/verification.rs", "src/signature.rs", "src/test.rs", "src/test_1_syntax_error_tests.txt", "src/test_1_tests.txt", "src/test_3_tests.txt", "tests/aead_aes_128_gcm_tests.txt", "tests/aead_aes_256_gcm_tests.txt", "tests/aead_chacha20_poly1305_tests.txt", "tests/aead_chacha20_poly1305_openssh_tests.txt", "tests/aead_tests.rs", "tests/agreement_tests.rs", "tests/agreement_tests.txt", "tests/constant_time_tests.rs", "tests/digest_tests.rs", "tests/digest_tests.txt", "tests/ecdsa_from_pkcs8_tests.txt", "tests/ecdsa_tests.rs", "tests/ecdsa_test_private_key_p256.p8", "tests/ecdsa_test_public_key_p256.der", "tests/ecdsa_test_public_key_p256_debug.txt", "tests/ecdsa_sign_asn1_tests.txt", "tests/ecdsa_sign_fixed_tests.txt", "tests/ecdsa_verify_asn1_tests.txt", "tests/ecdsa_verify_fixed_tests.txt", "tests/ed25519_from_pkcs8_tests.txt", "tests/ed25519_from_pkcs8_unchecked_tests.txt", "tests/ed25519_tests.rs", "tests/ed25519_tests.txt", "tests/ed25519_test_private_key.bin", "tests/ed25519_test_private_key.p8", "tests/ed25519_test_public_key.bin", "tests/ed25519_test_public_key.der", "tests/hkdf_tests.rs", "tests/hkdf_tests.txt", "tests/hmac_tests.rs", "tests/hmac_tests.txt", "tests/pbkdf2_tests.rs", "tests/pbkdf2_tests.txt", "tests/quic_aes_128_tests.txt", "tests/quic_aes_256_tests.txt", "tests/quic_chacha20_tests.txt", "tests/quic_tests.rs", "tests/rand_tests.rs", "tests/rsa_from_pkcs8_tests.txt", "tests/rsa_pkcs1_sign_tests.txt", "tests/rsa_pkcs1_verify_tests.txt", "tests/rsa_primitive_verify_tests.txt", "tests/rsa_pss_sign_tests.txt", "tests/rsa_pss_verify_tests.txt", "tests/rsa_tests.rs", "tests/rsa_test_private_key_2048.p8", "tests/rsa_test_public_key_2048.der", "tests/rsa_test_public_key_2048_debug.txt", "tests/signature_tests.rs", "third_party/fiat/curve25519_32.h", "third_party/fiat/curve25519_64.h", "third_party/fiat/LICENSE", "third_party/fiat/make_curve25519_tables.py", "third_party/NIST/SHAVS/SHA1LongMsg.rsp", "third_party/NIST/SHAVS/SHA1Monte.rsp", "third_party/NIST/SHAVS/SHA1ShortMsg.rsp", "third_party/NIST/SHAVS/SHA224LongMsg.rsp", "third_party/NIST/SHAVS/SHA224Monte.rsp", "third_party/NIST/SHAVS/SHA224ShortMsg.rsp", "third_party/NIST/SHAVS/SHA256LongMsg.rsp", "third_party/NIST/SHAVS/SHA256Monte.rsp", "third_party/NIST/SHAVS/SHA256ShortMsg.rsp", "third_party/NIST/SHAVS/SHA384LongMsg.rsp", "third_party/NIST/SHAVS/SHA384Monte.rsp", "third_party/NIST/SHAVS/SHA384ShortMsg.rsp", "third_party/NIST/SHAVS/SHA512LongMsg.rsp", "third_party/NIST/SHAVS/SHA512Monte.rsp", "third_party/NIST/SHAVS/SHA512ShortMsg.rsp"] -description = "Safe, fast, small crypto using Rust." -documentation = "https://briansmith.org/rustdoc/ring/" -readme = "doc/link-to-readme.md" -keywords = ["crypto", "cryptography", "rand", "ECC", "RSA"] -categories = ["cryptography", "no-std"] -license-file = "LICENSE" -repository = "https://github.com/briansmith/ring" -[package.metadata.docs.rs] -all-features = true -[profile.bench] -opt-level = 3 -lto = true -codegen-units = 1 -debug = false -debug-assertions = false -rpath = false - -[profile.release] -opt-level = 3 -lto = true -codegen-units = 1 -debug = false -debug-assertions = false -rpath = false - -[lib] -name = "ring" -[dependencies.untrusted] -version = "0.7.1" -[build-dependencies.cc] -version = "1.0.62" -default-features = false - -[features] -alloc = [] -default = ["alloc", "dev_urandom_fallback"] -dev_urandom_fallback = ["once_cell"] -internal_benches = [] -slow_tests = [] -std = ["alloc"] -test_logging = [] -wasm32_c = [] -[target."cfg(all(target_arch = \"wasm32\", target_vendor = \"unknown\", target_os = \"unknown\", target_env = \"\"))".dependencies.web-sys] -version = "0.3.37" -features = ["Crypto", "Window"] -default-features = false -[target."cfg(any(target_arch = \"x86\",target_arch = \"x86_64\", all(any(target_arch = \"aarch64\", target_arch = \"arm\"), any(target_os = \"android\", target_os = \"fuchsia\", target_os = \"linux\"))))".dependencies.spin] -version = "0.5.2" -default-features = false -[target."cfg(any(target_os = \"android\", target_os = \"linux\"))".dependencies.libc] -version = "0.2.69" -default-features = false - -[target."cfg(any(target_os = \"android\", target_os = \"linux\"))".dependencies.once_cell] -version = "1.5.2" -features = ["std"] -optional = true -default-features = false -[target."cfg(any(target_os = \"dragonfly\", target_os = \"freebsd\", target_os = \"illumos\", target_os = \"netbsd\", target_os = \"openbsd\", target_os = \"solaris\"))".dependencies.once_cell] -version = "1.5.2" -features = ["std"] -default-features = false -[target."cfg(any(unix, windows))".dev-dependencies.libc] -version = "0.2.80" -default-features = false -[target."cfg(target_arch = \"wasm32\")".dev-dependencies.wasm-bindgen-test] -version = "0.3.18" -default-features = false -[target."cfg(target_os = \"windows\")".dependencies.winapi] -version = "0.3.8" -features = ["ntsecapi", "wtypesbase"] -default-features = false diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/crypto/chacha/asm/chacha-armv4.pl temporalio-1.3.0/vendor/ring-0.16.20/crypto/chacha/asm/chacha-armv4.pl --- temporalio-1.3.0/vendor/ring-0.16.20/crypto/chacha/asm/chacha-armv4.pl 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/crypto/chacha/asm/chacha-armv4.pl 1970-01-01 00:00:00.000000000 +0000 @@ -1,1167 +0,0 @@ -#! /usr/bin/env perl -# Copyright 2016 The OpenSSL Project Authors. All Rights Reserved. -# -# Licensed under the OpenSSL license (the "License"). You may not use -# this file except in compliance with the License. You can obtain a copy -# in the file LICENSE in the source distribution or at -# https://www.openssl.org/source/license.html - -# -# ==================================================================== -# Written by Andy Polyakov for the OpenSSL -# project. The module is, however, dual licensed under OpenSSL and -# CRYPTOGAMS licenses depending on where you obtain it. For further -# details see http://www.openssl.org/~appro/cryptogams/. -# ==================================================================== -# -# December 2014 -# -# ChaCha20 for ARMv4. -# -# Performance in cycles per byte out of large buffer. -# -# IALU/gcc-4.4 1xNEON 3xNEON+1xIALU -# -# Cortex-A5 19.3(*)/+95% 21.8 14.1 -# Cortex-A8 10.5(*)/+160% 13.9 6.35 -# Cortex-A9 12.9(**)/+110% 14.3 6.50 -# Cortex-A15 11.0/+40% 16.0 5.00 -# Snapdragon S4 11.5/+125% 13.6 4.90 -# -# (*) most "favourable" result for aligned data on little-endian -# processor, result for misaligned data is 10-15% lower; -# (**) this result is a trade-off: it can be improved by 20%, -# but then Snapdragon S4 and Cortex-A8 results get -# 20-25% worse; - -$flavour = shift; -if ($flavour=~/\w[\w\-]*\.\w+$/) { $output=$flavour; undef $flavour; } -else { while (($output=shift) && ($output!~/\w[\w\-]*\.\w+$/)) {} } - -if ($flavour && $flavour ne "void") { - $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; - ( $xlate="${dir}arm-xlate.pl" and -f $xlate ) or - ( $xlate="${dir}../../perlasm/arm-xlate.pl" and -f $xlate) or - die "can't locate arm-xlate.pl"; - - open OUT,"| \"$^X\" $xlate $flavour $output"; - *STDOUT=*OUT; -} else { - open OUT,">$output"; - *STDOUT=*OUT; -} - -sub AUTOLOAD() # thunk [simplified] x86-style perlasm -{ my $opcode = $AUTOLOAD; $opcode =~ s/.*:://; $opcode =~ s/_/\./; - my $arg = pop; - $arg = "#$arg" if ($arg*1 eq $arg); - $code .= "\t$opcode\t".join(',',@_,$arg)."\n"; -} - -my @x=map("r$_",(0..7,"x","x","x","x",12,"x",14,"x")); -my @t=map("r$_",(8..11)); - -sub ROUND { -my ($a0,$b0,$c0,$d0)=@_; -my ($a1,$b1,$c1,$d1)=map(($_&~3)+(($_+1)&3),($a0,$b0,$c0,$d0)); -my ($a2,$b2,$c2,$d2)=map(($_&~3)+(($_+1)&3),($a1,$b1,$c1,$d1)); -my ($a3,$b3,$c3,$d3)=map(($_&~3)+(($_+1)&3),($a2,$b2,$c2,$d2)); -my $odd = $d0&1; -my ($xc,$xc_) = (@t[0..1]); -my ($xd,$xd_) = $odd ? (@t[2],@x[$d1]) : (@x[$d0],@t[2]); -my @ret; - - # Consider order in which variables are addressed by their - # index: - # - # a b c d - # - # 0 4 8 12 < even round - # 1 5 9 13 - # 2 6 10 14 - # 3 7 11 15 - # 0 5 10 15 < odd round - # 1 6 11 12 - # 2 7 8 13 - # 3 4 9 14 - # - # 'a', 'b' are permanently allocated in registers, @x[0..7], - # while 'c's and pair of 'd's are maintained in memory. If - # you observe 'c' column, you'll notice that pair of 'c's is - # invariant between rounds. This means that we have to reload - # them once per round, in the middle. This is why you'll see - # bunch of 'c' stores and loads in the middle, but none in - # the beginning or end. If you observe 'd' column, you'll - # notice that 15 and 13 are reused in next pair of rounds. - # This is why these two are chosen for offloading to memory, - # to make loads count more. - push @ret,( - "&add (@x[$a0],@x[$a0],@x[$b0])", - "&mov ($xd,$xd,'ror#16')", - "&add (@x[$a1],@x[$a1],@x[$b1])", - "&mov ($xd_,$xd_,'ror#16')", - "&eor ($xd,$xd,@x[$a0],'ror#16')", - "&eor ($xd_,$xd_,@x[$a1],'ror#16')", - - "&add ($xc,$xc,$xd)", - "&mov (@x[$b0],@x[$b0],'ror#20')", - "&add ($xc_,$xc_,$xd_)", - "&mov (@x[$b1],@x[$b1],'ror#20')", - "&eor (@x[$b0],@x[$b0],$xc,'ror#20')", - "&eor (@x[$b1],@x[$b1],$xc_,'ror#20')", - - "&add (@x[$a0],@x[$a0],@x[$b0])", - "&mov ($xd,$xd,'ror#24')", - "&add (@x[$a1],@x[$a1],@x[$b1])", - "&mov ($xd_,$xd_,'ror#24')", - "&eor ($xd,$xd,@x[$a0],'ror#24')", - "&eor ($xd_,$xd_,@x[$a1],'ror#24')", - - "&add ($xc,$xc,$xd)", - "&mov (@x[$b0],@x[$b0],'ror#25')" ); - push @ret,( - "&str ($xd,'[sp,#4*(16+$d0)]')", - "&ldr ($xd,'[sp,#4*(16+$d2)]')" ) if ($odd); - push @ret,( - "&add ($xc_,$xc_,$xd_)", - "&mov (@x[$b1],@x[$b1],'ror#25')" ); - push @ret,( - "&str ($xd_,'[sp,#4*(16+$d1)]')", - "&ldr ($xd_,'[sp,#4*(16+$d3)]')" ) if (!$odd); - push @ret,( - "&eor (@x[$b0],@x[$b0],$xc,'ror#25')", - "&eor (@x[$b1],@x[$b1],$xc_,'ror#25')" ); - - $xd=@x[$d2] if (!$odd); - $xd_=@x[$d3] if ($odd); - push @ret,( - "&str ($xc,'[sp,#4*(16+$c0)]')", - "&ldr ($xc,'[sp,#4*(16+$c2)]')", - "&add (@x[$a2],@x[$a2],@x[$b2])", - "&mov ($xd,$xd,'ror#16')", - "&str ($xc_,'[sp,#4*(16+$c1)]')", - "&ldr ($xc_,'[sp,#4*(16+$c3)]')", - "&add (@x[$a3],@x[$a3],@x[$b3])", - "&mov ($xd_,$xd_,'ror#16')", - "&eor ($xd,$xd,@x[$a2],'ror#16')", - "&eor ($xd_,$xd_,@x[$a3],'ror#16')", - - "&add ($xc,$xc,$xd)", - "&mov (@x[$b2],@x[$b2],'ror#20')", - "&add ($xc_,$xc_,$xd_)", - "&mov (@x[$b3],@x[$b3],'ror#20')", - "&eor (@x[$b2],@x[$b2],$xc,'ror#20')", - "&eor (@x[$b3],@x[$b3],$xc_,'ror#20')", - - "&add (@x[$a2],@x[$a2],@x[$b2])", - "&mov ($xd,$xd,'ror#24')", - "&add (@x[$a3],@x[$a3],@x[$b3])", - "&mov ($xd_,$xd_,'ror#24')", - "&eor ($xd,$xd,@x[$a2],'ror#24')", - "&eor ($xd_,$xd_,@x[$a3],'ror#24')", - - "&add ($xc,$xc,$xd)", - "&mov (@x[$b2],@x[$b2],'ror#25')", - "&add ($xc_,$xc_,$xd_)", - "&mov (@x[$b3],@x[$b3],'ror#25')", - "&eor (@x[$b2],@x[$b2],$xc,'ror#25')", - "&eor (@x[$b3],@x[$b3],$xc_,'ror#25')" ); - - @ret; -} - -$code.=<<___; -#include - -@ Silence ARMv8 deprecated IT instruction warnings. This file is used by both -@ ARMv7 and ARMv8 processors and does not use ARMv8 instructions. -.arch armv7-a - -.text -#if defined(__thumb2__) || defined(__clang__) -.syntax unified -#endif -#if defined(__thumb2__) -.thumb -#else -.code 32 -#endif - -#if defined(__thumb2__) || defined(__clang__) -#define ldrhsb ldrbhs -#endif - -.align 5 -.Lsigma: -.long 0x61707865,0x3320646e,0x79622d32,0x6b206574 @ endian-neutral -.Lone: -.long 1,0,0,0 -#if __ARM_MAX_ARCH__>=7 -.extern GFp_armcap_P -.hidden GFp_armcap_P -.LOPENSSL_armcap: -.word GFp_armcap_P-.LChaCha20_ctr32 -#else -.word -1 -#endif - -.globl GFp_ChaCha20_ctr32 -.type GFp_ChaCha20_ctr32,%function -.align 5 -GFp_ChaCha20_ctr32: -.LChaCha20_ctr32: - ldr r12,[sp,#0] @ pull pointer to counter and nonce - stmdb sp!,{r0-r2,r4-r11,lr} -#if __ARM_ARCH__<7 && !defined(__thumb2__) - sub r14,pc,#16 @ ChaCha20_ctr32 -#else - adr r14,.LChaCha20_ctr32 -#endif - cmp r2,#0 @ len==0? -#ifdef __thumb2__ - itt eq -#endif - addeq sp,sp,#4*3 - beq .Lno_data -#if __ARM_MAX_ARCH__>=7 - cmp r2,#192 @ test len - bls .Lshort - ldr r4,[r14,#-32] - ldr r4,[r14,r4] -# ifdef __APPLE__ - ldr r4,[r4] -# endif - tst r4,#ARMV7_NEON - bne .LChaCha20_neon -.Lshort: -#endif - ldmia r12,{r4-r7} @ load counter and nonce - sub sp,sp,#4*(16) @ off-load area - sub r14,r14,#64 @ .Lsigma - stmdb sp!,{r4-r7} @ copy counter and nonce - ldmia r3,{r4-r11} @ load key - ldmia r14,{r0-r3} @ load sigma - stmdb sp!,{r4-r11} @ copy key - stmdb sp!,{r0-r3} @ copy sigma - str r10,[sp,#4*(16+10)] @ off-load "@x[10]" - str r11,[sp,#4*(16+11)] @ off-load "@x[11]" - b .Loop_outer_enter - -.align 4 -.Loop_outer: - ldmia sp,{r0-r9} @ load key material - str @t[3],[sp,#4*(32+2)] @ save len - str r12, [sp,#4*(32+1)] @ save inp - str r14, [sp,#4*(32+0)] @ save out -.Loop_outer_enter: - ldr @t[3], [sp,#4*(15)] - ldr @x[12],[sp,#4*(12)] @ modulo-scheduled load - ldr @t[2], [sp,#4*(13)] - ldr @x[14],[sp,#4*(14)] - str @t[3], [sp,#4*(16+15)] - mov @t[3],#10 - b .Loop - -.align 4 -.Loop: - subs @t[3],@t[3],#1 -___ - foreach (&ROUND(0, 4, 8,12)) { eval; } - foreach (&ROUND(0, 5,10,15)) { eval; } -$code.=<<___; - bne .Loop - - ldr @t[3],[sp,#4*(32+2)] @ load len - - str @t[0], [sp,#4*(16+8)] @ modulo-scheduled store - str @t[1], [sp,#4*(16+9)] - str @x[12],[sp,#4*(16+12)] - str @t[2], [sp,#4*(16+13)] - str @x[14],[sp,#4*(16+14)] - - @ at this point we have first half of 512-bit result in - @ @x[0-7] and second half at sp+4*(16+8) - - cmp @t[3],#64 @ done yet? -#ifdef __thumb2__ - itete lo -#endif - addlo r12,sp,#4*(0) @ shortcut or ... - ldrhs r12,[sp,#4*(32+1)] @ ... load inp - addlo r14,sp,#4*(0) @ shortcut or ... - ldrhs r14,[sp,#4*(32+0)] @ ... load out - - ldr @t[0],[sp,#4*(0)] @ load key material - ldr @t[1],[sp,#4*(1)] - -#if __ARM_ARCH__>=6 || !defined(__ARMEB__) -# if __ARM_ARCH__<7 - orr @t[2],r12,r14 - tst @t[2],#3 @ are input and output aligned? - ldr @t[2],[sp,#4*(2)] - bne .Lunaligned - cmp @t[3],#64 @ restore flags -# else - ldr @t[2],[sp,#4*(2)] -# endif - ldr @t[3],[sp,#4*(3)] - - add @x[0],@x[0],@t[0] @ accumulate key material - add @x[1],@x[1],@t[1] -# ifdef __thumb2__ - itt hs -# endif - ldrhs @t[0],[r12],#16 @ load input - ldrhs @t[1],[r12,#-12] - - add @x[2],@x[2],@t[2] - add @x[3],@x[3],@t[3] -# ifdef __thumb2__ - itt hs -# endif - ldrhs @t[2],[r12,#-8] - ldrhs @t[3],[r12,#-4] -# if __ARM_ARCH__>=6 && defined(__ARMEB__) - rev @x[0],@x[0] - rev @x[1],@x[1] - rev @x[2],@x[2] - rev @x[3],@x[3] -# endif -# ifdef __thumb2__ - itt hs -# endif - eorhs @x[0],@x[0],@t[0] @ xor with input - eorhs @x[1],@x[1],@t[1] - add @t[0],sp,#4*(4) - str @x[0],[r14],#16 @ store output -# ifdef __thumb2__ - itt hs -# endif - eorhs @x[2],@x[2],@t[2] - eorhs @x[3],@x[3],@t[3] - ldmia @t[0],{@t[0]-@t[3]} @ load key material - str @x[1],[r14,#-12] - str @x[2],[r14,#-8] - str @x[3],[r14,#-4] - - add @x[4],@x[4],@t[0] @ accumulate key material - add @x[5],@x[5],@t[1] -# ifdef __thumb2__ - itt hs -# endif - ldrhs @t[0],[r12],#16 @ load input - ldrhs @t[1],[r12,#-12] - add @x[6],@x[6],@t[2] - add @x[7],@x[7],@t[3] -# ifdef __thumb2__ - itt hs -# endif - ldrhs @t[2],[r12,#-8] - ldrhs @t[3],[r12,#-4] -# if __ARM_ARCH__>=6 && defined(__ARMEB__) - rev @x[4],@x[4] - rev @x[5],@x[5] - rev @x[6],@x[6] - rev @x[7],@x[7] -# endif -# ifdef __thumb2__ - itt hs -# endif - eorhs @x[4],@x[4],@t[0] - eorhs @x[5],@x[5],@t[1] - add @t[0],sp,#4*(8) - str @x[4],[r14],#16 @ store output -# ifdef __thumb2__ - itt hs -# endif - eorhs @x[6],@x[6],@t[2] - eorhs @x[7],@x[7],@t[3] - str @x[5],[r14,#-12] - ldmia @t[0],{@t[0]-@t[3]} @ load key material - str @x[6],[r14,#-8] - add @x[0],sp,#4*(16+8) - str @x[7],[r14,#-4] - - ldmia @x[0],{@x[0]-@x[7]} @ load second half - - add @x[0],@x[0],@t[0] @ accumulate key material - add @x[1],@x[1],@t[1] -# ifdef __thumb2__ - itt hs -# endif - ldrhs @t[0],[r12],#16 @ load input - ldrhs @t[1],[r12,#-12] -# ifdef __thumb2__ - itt hi -# endif - strhi @t[2],[sp,#4*(16+10)] @ copy "@x[10]" while at it - strhi @t[3],[sp,#4*(16+11)] @ copy "@x[11]" while at it - add @x[2],@x[2],@t[2] - add @x[3],@x[3],@t[3] -# ifdef __thumb2__ - itt hs -# endif - ldrhs @t[2],[r12,#-8] - ldrhs @t[3],[r12,#-4] -# if __ARM_ARCH__>=6 && defined(__ARMEB__) - rev @x[0],@x[0] - rev @x[1],@x[1] - rev @x[2],@x[2] - rev @x[3],@x[3] -# endif -# ifdef __thumb2__ - itt hs -# endif - eorhs @x[0],@x[0],@t[0] - eorhs @x[1],@x[1],@t[1] - add @t[0],sp,#4*(12) - str @x[0],[r14],#16 @ store output -# ifdef __thumb2__ - itt hs -# endif - eorhs @x[2],@x[2],@t[2] - eorhs @x[3],@x[3],@t[3] - str @x[1],[r14,#-12] - ldmia @t[0],{@t[0]-@t[3]} @ load key material - str @x[2],[r14,#-8] - str @x[3],[r14,#-4] - - add @x[4],@x[4],@t[0] @ accumulate key material - add @x[5],@x[5],@t[1] -# ifdef __thumb2__ - itt hi -# endif - addhi @t[0],@t[0],#1 @ next counter value - strhi @t[0],[sp,#4*(12)] @ save next counter value -# ifdef __thumb2__ - itt hs -# endif - ldrhs @t[0],[r12],#16 @ load input - ldrhs @t[1],[r12,#-12] - add @x[6],@x[6],@t[2] - add @x[7],@x[7],@t[3] -# ifdef __thumb2__ - itt hs -# endif - ldrhs @t[2],[r12,#-8] - ldrhs @t[3],[r12,#-4] -# if __ARM_ARCH__>=6 && defined(__ARMEB__) - rev @x[4],@x[4] - rev @x[5],@x[5] - rev @x[6],@x[6] - rev @x[7],@x[7] -# endif -# ifdef __thumb2__ - itt hs -# endif - eorhs @x[4],@x[4],@t[0] - eorhs @x[5],@x[5],@t[1] -# ifdef __thumb2__ - it ne -# endif - ldrne @t[0],[sp,#4*(32+2)] @ re-load len -# ifdef __thumb2__ - itt hs -# endif - eorhs @x[6],@x[6],@t[2] - eorhs @x[7],@x[7],@t[3] - str @x[4],[r14],#16 @ store output - str @x[5],[r14,#-12] -# ifdef __thumb2__ - it hs -# endif - subhs @t[3],@t[0],#64 @ len-=64 - str @x[6],[r14,#-8] - str @x[7],[r14,#-4] - bhi .Loop_outer - - beq .Ldone -# if __ARM_ARCH__<7 - b .Ltail - -.align 4 -.Lunaligned: @ unaligned endian-neutral path - cmp @t[3],#64 @ restore flags -# endif -#endif -#if __ARM_ARCH__<7 - ldr @t[3],[sp,#4*(3)] -___ -for ($i=0;$i<16;$i+=4) { -my $j=$i&0x7; - -$code.=<<___ if ($i==4); - add @x[0],sp,#4*(16+8) -___ -$code.=<<___ if ($i==8); - ldmia @x[0],{@x[0]-@x[7]} @ load second half -# ifdef __thumb2__ - itt hi -# endif - strhi @t[2],[sp,#4*(16+10)] @ copy "@x[10]" - strhi @t[3],[sp,#4*(16+11)] @ copy "@x[11]" -___ -$code.=<<___; - add @x[$j+0],@x[$j+0],@t[0] @ accumulate key material -___ -$code.=<<___ if ($i==12); -# ifdef __thumb2__ - itt hi -# endif - addhi @t[0],@t[0],#1 @ next counter value - strhi @t[0],[sp,#4*(12)] @ save next counter value -___ -$code.=<<___; - add @x[$j+1],@x[$j+1],@t[1] - add @x[$j+2],@x[$j+2],@t[2] -# ifdef __thumb2__ - itete lo -# endif - eorlo @t[0],@t[0],@t[0] @ zero or ... - ldrhsb @t[0],[r12],#16 @ ... load input - eorlo @t[1],@t[1],@t[1] - ldrhsb @t[1],[r12,#-12] - - add @x[$j+3],@x[$j+3],@t[3] -# ifdef __thumb2__ - itete lo -# endif - eorlo @t[2],@t[2],@t[2] - ldrhsb @t[2],[r12,#-8] - eorlo @t[3],@t[3],@t[3] - ldrhsb @t[3],[r12,#-4] - - eor @x[$j+0],@t[0],@x[$j+0] @ xor with input (or zero) - eor @x[$j+1],@t[1],@x[$j+1] -# ifdef __thumb2__ - itt hs -# endif - ldrhsb @t[0],[r12,#-15] @ load more input - ldrhsb @t[1],[r12,#-11] - eor @x[$j+2],@t[2],@x[$j+2] - strb @x[$j+0],[r14],#16 @ store output - eor @x[$j+3],@t[3],@x[$j+3] -# ifdef __thumb2__ - itt hs -# endif - ldrhsb @t[2],[r12,#-7] - ldrhsb @t[3],[r12,#-3] - strb @x[$j+1],[r14,#-12] - eor @x[$j+0],@t[0],@x[$j+0],lsr#8 - strb @x[$j+2],[r14,#-8] - eor @x[$j+1],@t[1],@x[$j+1],lsr#8 -# ifdef __thumb2__ - itt hs -# endif - ldrhsb @t[0],[r12,#-14] @ load more input - ldrhsb @t[1],[r12,#-10] - strb @x[$j+3],[r14,#-4] - eor @x[$j+2],@t[2],@x[$j+2],lsr#8 - strb @x[$j+0],[r14,#-15] - eor @x[$j+3],@t[3],@x[$j+3],lsr#8 -# ifdef __thumb2__ - itt hs -# endif - ldrhsb @t[2],[r12,#-6] - ldrhsb @t[3],[r12,#-2] - strb @x[$j+1],[r14,#-11] - eor @x[$j+0],@t[0],@x[$j+0],lsr#8 - strb @x[$j+2],[r14,#-7] - eor @x[$j+1],@t[1],@x[$j+1],lsr#8 -# ifdef __thumb2__ - itt hs -# endif - ldrhsb @t[0],[r12,#-13] @ load more input - ldrhsb @t[1],[r12,#-9] - strb @x[$j+3],[r14,#-3] - eor @x[$j+2],@t[2],@x[$j+2],lsr#8 - strb @x[$j+0],[r14,#-14] - eor @x[$j+3],@t[3],@x[$j+3],lsr#8 -# ifdef __thumb2__ - itt hs -# endif - ldrhsb @t[2],[r12,#-5] - ldrhsb @t[3],[r12,#-1] - strb @x[$j+1],[r14,#-10] - strb @x[$j+2],[r14,#-6] - eor @x[$j+0],@t[0],@x[$j+0],lsr#8 - strb @x[$j+3],[r14,#-2] - eor @x[$j+1],@t[1],@x[$j+1],lsr#8 - strb @x[$j+0],[r14,#-13] - eor @x[$j+2],@t[2],@x[$j+2],lsr#8 - strb @x[$j+1],[r14,#-9] - eor @x[$j+3],@t[3],@x[$j+3],lsr#8 - strb @x[$j+2],[r14,#-5] - strb @x[$j+3],[r14,#-1] -___ -$code.=<<___ if ($i<12); - add @t[0],sp,#4*(4+$i) - ldmia @t[0],{@t[0]-@t[3]} @ load key material -___ -} -$code.=<<___; -# ifdef __thumb2__ - it ne -# endif - ldrne @t[0],[sp,#4*(32+2)] @ re-load len -# ifdef __thumb2__ - it hs -# endif - subhs @t[3],@t[0],#64 @ len-=64 - bhi .Loop_outer - - beq .Ldone -#endif - -.Ltail: - ldr r12,[sp,#4*(32+1)] @ load inp - add @t[1],sp,#4*(0) - ldr r14,[sp,#4*(32+0)] @ load out - -.Loop_tail: - ldrb @t[2],[@t[1]],#1 @ read buffer on stack - ldrb @t[3],[r12],#1 @ read input - subs @t[0],@t[0],#1 - eor @t[3],@t[3],@t[2] - strb @t[3],[r14],#1 @ store output - bne .Loop_tail - -.Ldone: - add sp,sp,#4*(32+3) -.Lno_data: - ldmia sp!,{r4-r11,pc} -.size GFp_ChaCha20_ctr32,.-GFp_ChaCha20_ctr32 -___ - -{{{ -my ($a0,$b0,$c0,$d0,$a1,$b1,$c1,$d1,$a2,$b2,$c2,$d2,$t0,$t1,$t2,$t3) = - map("q$_",(0..15)); - -sub NEONROUND { -my $odd = pop; -my ($a,$b,$c,$d,$t)=@_; - - ( - "&vadd_i32 ($a,$a,$b)", - "&veor ($d,$d,$a)", - "&vrev32_16 ($d,$d)", # vrot ($d,16) - - "&vadd_i32 ($c,$c,$d)", - "&veor ($t,$b,$c)", - "&vshr_u32 ($b,$t,20)", - "&vsli_32 ($b,$t,12)", - - "&vadd_i32 ($a,$a,$b)", - "&veor ($t,$d,$a)", - "&vshr_u32 ($d,$t,24)", - "&vsli_32 ($d,$t,8)", - - "&vadd_i32 ($c,$c,$d)", - "&veor ($t,$b,$c)", - "&vshr_u32 ($b,$t,25)", - "&vsli_32 ($b,$t,7)", - - "&vext_8 ($c,$c,$c,8)", - "&vext_8 ($b,$b,$b,$odd?12:4)", - "&vext_8 ($d,$d,$d,$odd?4:12)" - ); -} - -$code.=<<___; -#if __ARM_MAX_ARCH__>=7 -.arch armv7-a -.fpu neon - -.type ChaCha20_neon,%function -.align 5 -ChaCha20_neon: - ldr r12,[sp,#0] @ pull pointer to counter and nonce - stmdb sp!,{r0-r2,r4-r11,lr} -.LChaCha20_neon: - adr r14,.Lsigma - vstmdb sp!,{d8-d15} @ ABI spec says so - stmdb sp!,{r0-r3} - - vld1.32 {$b0-$c0},[r3] @ load key - ldmia r3,{r4-r11} @ load key - - sub sp,sp,#4*(16+16) - vld1.32 {$d0},[r12] @ load counter and nonce - add r12,sp,#4*8 - ldmia r14,{r0-r3} @ load sigma - vld1.32 {$a0},[r14]! @ load sigma - vld1.32 {$t0},[r14] @ one - vst1.32 {$c0-$d0},[r12] @ copy 1/2key|counter|nonce - vst1.32 {$a0-$b0},[sp] @ copy sigma|1/2key - - str r10,[sp,#4*(16+10)] @ off-load "@x[10]" - str r11,[sp,#4*(16+11)] @ off-load "@x[11]" - vshl.i32 $t1#lo,$t0#lo,#1 @ two - vstr $t0#lo,[sp,#4*(16+0)] - vshl.i32 $t2#lo,$t0#lo,#2 @ four - vstr $t1#lo,[sp,#4*(16+2)] - vmov $a1,$a0 - vstr $t2#lo,[sp,#4*(16+4)] - vmov $a2,$a0 - vmov $b1,$b0 - vmov $b2,$b0 - b .Loop_neon_enter - -.align 4 -.Loop_neon_outer: - ldmia sp,{r0-r9} @ load key material - cmp @t[3],#64*2 @ if len<=64*2 - bls .Lbreak_neon @ switch to integer-only - vmov $a1,$a0 - str @t[3],[sp,#4*(32+2)] @ save len - vmov $a2,$a0 - str r12, [sp,#4*(32+1)] @ save inp - vmov $b1,$b0 - str r14, [sp,#4*(32+0)] @ save out - vmov $b2,$b0 -.Loop_neon_enter: - ldr @t[3], [sp,#4*(15)] - vadd.i32 $d1,$d0,$t0 @ counter+1 - ldr @x[12],[sp,#4*(12)] @ modulo-scheduled load - vmov $c1,$c0 - ldr @t[2], [sp,#4*(13)] - vmov $c2,$c0 - ldr @x[14],[sp,#4*(14)] - vadd.i32 $d2,$d1,$t0 @ counter+2 - str @t[3], [sp,#4*(16+15)] - mov @t[3],#10 - add @x[12],@x[12],#3 @ counter+3 - b .Loop_neon - -.align 4 -.Loop_neon: - subs @t[3],@t[3],#1 -___ - my @thread0=&NEONROUND($a0,$b0,$c0,$d0,$t0,0); - my @thread1=&NEONROUND($a1,$b1,$c1,$d1,$t1,0); - my @thread2=&NEONROUND($a2,$b2,$c2,$d2,$t2,0); - my @thread3=&ROUND(0,4,8,12); - - foreach (@thread0) { - eval; eval(shift(@thread3)); - eval(shift(@thread1)); eval(shift(@thread3)); - eval(shift(@thread2)); eval(shift(@thread3)); - } - - @thread0=&NEONROUND($a0,$b0,$c0,$d0,$t0,1); - @thread1=&NEONROUND($a1,$b1,$c1,$d1,$t1,1); - @thread2=&NEONROUND($a2,$b2,$c2,$d2,$t2,1); - @thread3=&ROUND(0,5,10,15); - - foreach (@thread0) { - eval; eval(shift(@thread3)); - eval(shift(@thread1)); eval(shift(@thread3)); - eval(shift(@thread2)); eval(shift(@thread3)); - } -$code.=<<___; - bne .Loop_neon - - add @t[3],sp,#32 - vld1.32 {$t0-$t1},[sp] @ load key material - vld1.32 {$t2-$t3},[@t[3]] - - ldr @t[3],[sp,#4*(32+2)] @ load len - - str @t[0], [sp,#4*(16+8)] @ modulo-scheduled store - str @t[1], [sp,#4*(16+9)] - str @x[12],[sp,#4*(16+12)] - str @t[2], [sp,#4*(16+13)] - str @x[14],[sp,#4*(16+14)] - - @ at this point we have first half of 512-bit result in - @ @x[0-7] and second half at sp+4*(16+8) - - ldr r12,[sp,#4*(32+1)] @ load inp - ldr r14,[sp,#4*(32+0)] @ load out - - vadd.i32 $a0,$a0,$t0 @ accumulate key material - vadd.i32 $a1,$a1,$t0 - vadd.i32 $a2,$a2,$t0 - vldr $t0#lo,[sp,#4*(16+0)] @ one - - vadd.i32 $b0,$b0,$t1 - vadd.i32 $b1,$b1,$t1 - vadd.i32 $b2,$b2,$t1 - vldr $t1#lo,[sp,#4*(16+2)] @ two - - vadd.i32 $c0,$c0,$t2 - vadd.i32 $c1,$c1,$t2 - vadd.i32 $c2,$c2,$t2 - vadd.i32 $d1#lo,$d1#lo,$t0#lo @ counter+1 - vadd.i32 $d2#lo,$d2#lo,$t1#lo @ counter+2 - - vadd.i32 $d0,$d0,$t3 - vadd.i32 $d1,$d1,$t3 - vadd.i32 $d2,$d2,$t3 - - cmp @t[3],#64*4 - blo .Ltail_neon - - vld1.8 {$t0-$t1},[r12]! @ load input - mov @t[3],sp - vld1.8 {$t2-$t3},[r12]! - veor $a0,$a0,$t0 @ xor with input - veor $b0,$b0,$t1 - vld1.8 {$t0-$t1},[r12]! - veor $c0,$c0,$t2 - veor $d0,$d0,$t3 - vld1.8 {$t2-$t3},[r12]! - - veor $a1,$a1,$t0 - vst1.8 {$a0-$b0},[r14]! @ store output - veor $b1,$b1,$t1 - vld1.8 {$t0-$t1},[r12]! - veor $c1,$c1,$t2 - vst1.8 {$c0-$d0},[r14]! - veor $d1,$d1,$t3 - vld1.8 {$t2-$t3},[r12]! - - veor $a2,$a2,$t0 - vld1.32 {$a0-$b0},[@t[3]]! @ load for next iteration - veor $t0#hi,$t0#hi,$t0#hi - vldr $t0#lo,[sp,#4*(16+4)] @ four - veor $b2,$b2,$t1 - vld1.32 {$c0-$d0},[@t[3]] - veor $c2,$c2,$t2 - vst1.8 {$a1-$b1},[r14]! - veor $d2,$d2,$t3 - vst1.8 {$c1-$d1},[r14]! - - vadd.i32 $d0#lo,$d0#lo,$t0#lo @ next counter value - vldr $t0#lo,[sp,#4*(16+0)] @ one - - ldmia sp,{@t[0]-@t[3]} @ load key material - add @x[0],@x[0],@t[0] @ accumulate key material - ldr @t[0],[r12],#16 @ load input - vst1.8 {$a2-$b2},[r14]! - add @x[1],@x[1],@t[1] - ldr @t[1],[r12,#-12] - vst1.8 {$c2-$d2},[r14]! - add @x[2],@x[2],@t[2] - ldr @t[2],[r12,#-8] - add @x[3],@x[3],@t[3] - ldr @t[3],[r12,#-4] -# ifdef __ARMEB__ - rev @x[0],@x[0] - rev @x[1],@x[1] - rev @x[2],@x[2] - rev @x[3],@x[3] -# endif - eor @x[0],@x[0],@t[0] @ xor with input - add @t[0],sp,#4*(4) - eor @x[1],@x[1],@t[1] - str @x[0],[r14],#16 @ store output - eor @x[2],@x[2],@t[2] - str @x[1],[r14,#-12] - eor @x[3],@x[3],@t[3] - ldmia @t[0],{@t[0]-@t[3]} @ load key material - str @x[2],[r14,#-8] - str @x[3],[r14,#-4] - - add @x[4],@x[4],@t[0] @ accumulate key material - ldr @t[0],[r12],#16 @ load input - add @x[5],@x[5],@t[1] - ldr @t[1],[r12,#-12] - add @x[6],@x[6],@t[2] - ldr @t[2],[r12,#-8] - add @x[7],@x[7],@t[3] - ldr @t[3],[r12,#-4] -# ifdef __ARMEB__ - rev @x[4],@x[4] - rev @x[5],@x[5] - rev @x[6],@x[6] - rev @x[7],@x[7] -# endif - eor @x[4],@x[4],@t[0] - add @t[0],sp,#4*(8) - eor @x[5],@x[5],@t[1] - str @x[4],[r14],#16 @ store output - eor @x[6],@x[6],@t[2] - str @x[5],[r14,#-12] - eor @x[7],@x[7],@t[3] - ldmia @t[0],{@t[0]-@t[3]} @ load key material - str @x[6],[r14,#-8] - add @x[0],sp,#4*(16+8) - str @x[7],[r14,#-4] - - ldmia @x[0],{@x[0]-@x[7]} @ load second half - - add @x[0],@x[0],@t[0] @ accumulate key material - ldr @t[0],[r12],#16 @ load input - add @x[1],@x[1],@t[1] - ldr @t[1],[r12,#-12] -# ifdef __thumb2__ - it hi -# endif - strhi @t[2],[sp,#4*(16+10)] @ copy "@x[10]" while at it - add @x[2],@x[2],@t[2] - ldr @t[2],[r12,#-8] -# ifdef __thumb2__ - it hi -# endif - strhi @t[3],[sp,#4*(16+11)] @ copy "@x[11]" while at it - add @x[3],@x[3],@t[3] - ldr @t[3],[r12,#-4] -# ifdef __ARMEB__ - rev @x[0],@x[0] - rev @x[1],@x[1] - rev @x[2],@x[2] - rev @x[3],@x[3] -# endif - eor @x[0],@x[0],@t[0] - add @t[0],sp,#4*(12) - eor @x[1],@x[1],@t[1] - str @x[0],[r14],#16 @ store output - eor @x[2],@x[2],@t[2] - str @x[1],[r14,#-12] - eor @x[3],@x[3],@t[3] - ldmia @t[0],{@t[0]-@t[3]} @ load key material - str @x[2],[r14,#-8] - str @x[3],[r14,#-4] - - add @x[4],@x[4],@t[0] @ accumulate key material - add @t[0],@t[0],#4 @ next counter value - add @x[5],@x[5],@t[1] - str @t[0],[sp,#4*(12)] @ save next counter value - ldr @t[0],[r12],#16 @ load input - add @x[6],@x[6],@t[2] - add @x[4],@x[4],#3 @ counter+3 - ldr @t[1],[r12,#-12] - add @x[7],@x[7],@t[3] - ldr @t[2],[r12,#-8] - ldr @t[3],[r12,#-4] -# ifdef __ARMEB__ - rev @x[4],@x[4] - rev @x[5],@x[5] - rev @x[6],@x[6] - rev @x[7],@x[7] -# endif - eor @x[4],@x[4],@t[0] -# ifdef __thumb2__ - it hi -# endif - ldrhi @t[0],[sp,#4*(32+2)] @ re-load len - eor @x[5],@x[5],@t[1] - eor @x[6],@x[6],@t[2] - str @x[4],[r14],#16 @ store output - eor @x[7],@x[7],@t[3] - str @x[5],[r14,#-12] - sub @t[3],@t[0],#64*4 @ len-=64*4 - str @x[6],[r14,#-8] - str @x[7],[r14,#-4] - bhi .Loop_neon_outer - - b .Ldone_neon - -.align 4 -.Lbreak_neon: - @ harmonize NEON and integer-only stack frames: load data - @ from NEON frame, but save to integer-only one; distance - @ between the two is 4*(32+4+16-32)=4*(20). - - str @t[3], [sp,#4*(20+32+2)] @ save len - add @t[3],sp,#4*(32+4) - str r12, [sp,#4*(20+32+1)] @ save inp - str r14, [sp,#4*(20+32+0)] @ save out - - ldr @x[12],[sp,#4*(16+10)] - ldr @x[14],[sp,#4*(16+11)] - vldmia @t[3],{d8-d15} @ fulfill ABI requirement - str @x[12],[sp,#4*(20+16+10)] @ copy "@x[10]" - str @x[14],[sp,#4*(20+16+11)] @ copy "@x[11]" - - ldr @t[3], [sp,#4*(15)] - ldr @x[12],[sp,#4*(12)] @ modulo-scheduled load - ldr @t[2], [sp,#4*(13)] - ldr @x[14],[sp,#4*(14)] - str @t[3], [sp,#4*(20+16+15)] - add @t[3],sp,#4*(20) - vst1.32 {$a0-$b0},[@t[3]]! @ copy key - add sp,sp,#4*(20) @ switch frame - vst1.32 {$c0-$d0},[@t[3]] - mov @t[3],#10 - b .Loop @ go integer-only - -.align 4 -.Ltail_neon: - cmp @t[3],#64*3 - bhs .L192_or_more_neon - cmp @t[3],#64*2 - bhs .L128_or_more_neon - cmp @t[3],#64*1 - bhs .L64_or_more_neon - - add @t[0],sp,#4*(8) - vst1.8 {$a0-$b0},[sp] - add @t[2],sp,#4*(0) - vst1.8 {$c0-$d0},[@t[0]] - b .Loop_tail_neon - -.align 4 -.L64_or_more_neon: - vld1.8 {$t0-$t1},[r12]! - vld1.8 {$t2-$t3},[r12]! - veor $a0,$a0,$t0 - veor $b0,$b0,$t1 - veor $c0,$c0,$t2 - veor $d0,$d0,$t3 - vst1.8 {$a0-$b0},[r14]! - vst1.8 {$c0-$d0},[r14]! - - beq .Ldone_neon - - add @t[0],sp,#4*(8) - vst1.8 {$a1-$b1},[sp] - add @t[2],sp,#4*(0) - vst1.8 {$c1-$d1},[@t[0]] - sub @t[3],@t[3],#64*1 @ len-=64*1 - b .Loop_tail_neon - -.align 4 -.L128_or_more_neon: - vld1.8 {$t0-$t1},[r12]! - vld1.8 {$t2-$t3},[r12]! - veor $a0,$a0,$t0 - veor $b0,$b0,$t1 - vld1.8 {$t0-$t1},[r12]! - veor $c0,$c0,$t2 - veor $d0,$d0,$t3 - vld1.8 {$t2-$t3},[r12]! - - veor $a1,$a1,$t0 - veor $b1,$b1,$t1 - vst1.8 {$a0-$b0},[r14]! - veor $c1,$c1,$t2 - vst1.8 {$c0-$d0},[r14]! - veor $d1,$d1,$t3 - vst1.8 {$a1-$b1},[r14]! - vst1.8 {$c1-$d1},[r14]! - - beq .Ldone_neon - - add @t[0],sp,#4*(8) - vst1.8 {$a2-$b2},[sp] - add @t[2],sp,#4*(0) - vst1.8 {$c2-$d2},[@t[0]] - sub @t[3],@t[3],#64*2 @ len-=64*2 - b .Loop_tail_neon - -.align 4 -.L192_or_more_neon: - vld1.8 {$t0-$t1},[r12]! - vld1.8 {$t2-$t3},[r12]! - veor $a0,$a0,$t0 - veor $b0,$b0,$t1 - vld1.8 {$t0-$t1},[r12]! - veor $c0,$c0,$t2 - veor $d0,$d0,$t3 - vld1.8 {$t2-$t3},[r12]! - - veor $a1,$a1,$t0 - veor $b1,$b1,$t1 - vld1.8 {$t0-$t1},[r12]! - veor $c1,$c1,$t2 - vst1.8 {$a0-$b0},[r14]! - veor $d1,$d1,$t3 - vld1.8 {$t2-$t3},[r12]! - - veor $a2,$a2,$t0 - vst1.8 {$c0-$d0},[r14]! - veor $b2,$b2,$t1 - vst1.8 {$a1-$b1},[r14]! - veor $c2,$c2,$t2 - vst1.8 {$c1-$d1},[r14]! - veor $d2,$d2,$t3 - vst1.8 {$a2-$b2},[r14]! - vst1.8 {$c2-$d2},[r14]! - - beq .Ldone_neon - - ldmia sp,{@t[0]-@t[3]} @ load key material - add @x[0],@x[0],@t[0] @ accumulate key material - add @t[0],sp,#4*(4) - add @x[1],@x[1],@t[1] - add @x[2],@x[2],@t[2] - add @x[3],@x[3],@t[3] - ldmia @t[0],{@t[0]-@t[3]} @ load key material - - add @x[4],@x[4],@t[0] @ accumulate key material - add @t[0],sp,#4*(8) - add @x[5],@x[5],@t[1] - add @x[6],@x[6],@t[2] - add @x[7],@x[7],@t[3] - ldmia @t[0],{@t[0]-@t[3]} @ load key material -# ifdef __ARMEB__ - rev @x[0],@x[0] - rev @x[1],@x[1] - rev @x[2],@x[2] - rev @x[3],@x[3] - rev @x[4],@x[4] - rev @x[5],@x[5] - rev @x[6],@x[6] - rev @x[7],@x[7] -# endif - stmia sp,{@x[0]-@x[7]} - add @x[0],sp,#4*(16+8) - - ldmia @x[0],{@x[0]-@x[7]} @ load second half - - add @x[0],@x[0],@t[0] @ accumulate key material - add @t[0],sp,#4*(12) - add @x[1],@x[1],@t[1] - add @x[2],@x[2],@t[2] - add @x[3],@x[3],@t[3] - ldmia @t[0],{@t[0]-@t[3]} @ load key material - - add @x[4],@x[4],@t[0] @ accumulate key material - add @t[0],sp,#4*(8) - add @x[5],@x[5],@t[1] - add @x[4],@x[4],#3 @ counter+3 - add @x[6],@x[6],@t[2] - add @x[7],@x[7],@t[3] - ldr @t[3],[sp,#4*(32+2)] @ re-load len -# ifdef __ARMEB__ - rev @x[0],@x[0] - rev @x[1],@x[1] - rev @x[2],@x[2] - rev @x[3],@x[3] - rev @x[4],@x[4] - rev @x[5],@x[5] - rev @x[6],@x[6] - rev @x[7],@x[7] -# endif - stmia @t[0],{@x[0]-@x[7]} - add @t[2],sp,#4*(0) - sub @t[3],@t[3],#64*3 @ len-=64*3 - -.Loop_tail_neon: - ldrb @t[0],[@t[2]],#1 @ read buffer on stack - ldrb @t[1],[r12],#1 @ read input - subs @t[3],@t[3],#1 - eor @t[0],@t[0],@t[1] - strb @t[0],[r14],#1 @ store output - bne .Loop_tail_neon - -.Ldone_neon: - add sp,sp,#4*(32+4) - vldmia sp,{d8-d15} - add sp,sp,#4*(16+3) - ldmia sp!,{r4-r11,pc} -.size ChaCha20_neon,.-ChaCha20_neon -#endif -___ -}}} - -foreach (split("\n",$code)) { - s/\`([^\`]*)\`/eval $1/geo; - - s/\bq([0-9]+)#(lo|hi)/sprintf "d%d",2*$1+($2 eq "hi")/geo; - - print $_,"\n"; -} -close STDOUT or die "error closing STDOUT"; diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/crypto/chacha/asm/chacha-armv8.pl temporalio-1.3.0/vendor/ring-0.16.20/crypto/chacha/asm/chacha-armv8.pl --- temporalio-1.3.0/vendor/ring-0.16.20/crypto/chacha/asm/chacha-armv8.pl 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/crypto/chacha/asm/chacha-armv8.pl 1970-01-01 00:00:00.000000000 +0000 @@ -1,1144 +0,0 @@ -#! /usr/bin/env perl -# Copyright 2016 The OpenSSL Project Authors. All Rights Reserved. -# -# Licensed under the OpenSSL license (the "License"). You may not use -# this file except in compliance with the License. You can obtain a copy -# in the file LICENSE in the source distribution or at -# https://www.openssl.org/source/license.html - -# -# ==================================================================== -# Written by Andy Polyakov for the OpenSSL -# project. The module is, however, dual licensed under OpenSSL and -# CRYPTOGAMS licenses depending on where you obtain it. For further -# details see http://www.openssl.org/~appro/cryptogams/. -# ==================================================================== -# -# June 2015 -# -# ChaCha20 for ARMv8. -# -# Performance in cycles per byte out of large buffer. -# -# IALU/gcc-4.9 3xNEON+1xIALU 6xNEON+2xIALU -# -# Apple A7 5.50/+49% 3.33 1.70 -# Cortex-A53 8.40/+80% 4.72 4.72(*) -# Cortex-A57 8.06/+43% 4.90 4.43(**) -# Denver 4.50/+82% 2.63 2.67(*) -# X-Gene 9.50/+46% 8.82 8.89(*) -# Mongoose 8.00/+44% 3.64 3.25 -# Kryo 8.17/+50% 4.83 4.65 -# -# (*) it's expected that doubling interleave factor doesn't help -# all processors, only those with higher NEON latency and -# higher instruction issue rate; -# (**) expected improvement was actually higher; - -$flavour=shift; -$output=shift; - -$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; -( $xlate="${dir}arm-xlate.pl" and -f $xlate ) or -( $xlate="${dir}../../perlasm/arm-xlate.pl" and -f $xlate) or -die "can't locate arm-xlate.pl"; - -open OUT,"| \"$^X\" $xlate $flavour $output"; -*STDOUT=*OUT; - -sub AUTOLOAD() # thunk [simplified] x86-style perlasm -{ my $opcode = $AUTOLOAD; $opcode =~ s/.*:://; $opcode =~ s/_/\./; - my $arg = pop; - $arg = "#$arg" if ($arg*1 eq $arg); - $code .= "\t$opcode\t".join(',',@_,$arg)."\n"; -} - -my ($out,$inp,$len,$key,$ctr) = map("x$_",(0..4)); - -my @x=map("x$_",(5..17,19..21)); -my @d=map("x$_",(22..28,30)); - -sub ROUND { -my ($a0,$b0,$c0,$d0)=@_; -my ($a1,$b1,$c1,$d1)=map(($_&~3)+(($_+1)&3),($a0,$b0,$c0,$d0)); -my ($a2,$b2,$c2,$d2)=map(($_&~3)+(($_+1)&3),($a1,$b1,$c1,$d1)); -my ($a3,$b3,$c3,$d3)=map(($_&~3)+(($_+1)&3),($a2,$b2,$c2,$d2)); - - ( - "&add_32 (@x[$a0],@x[$a0],@x[$b0])", - "&add_32 (@x[$a1],@x[$a1],@x[$b1])", - "&add_32 (@x[$a2],@x[$a2],@x[$b2])", - "&add_32 (@x[$a3],@x[$a3],@x[$b3])", - "&eor_32 (@x[$d0],@x[$d0],@x[$a0])", - "&eor_32 (@x[$d1],@x[$d1],@x[$a1])", - "&eor_32 (@x[$d2],@x[$d2],@x[$a2])", - "&eor_32 (@x[$d3],@x[$d3],@x[$a3])", - "&ror_32 (@x[$d0],@x[$d0],16)", - "&ror_32 (@x[$d1],@x[$d1],16)", - "&ror_32 (@x[$d2],@x[$d2],16)", - "&ror_32 (@x[$d3],@x[$d3],16)", - - "&add_32 (@x[$c0],@x[$c0],@x[$d0])", - "&add_32 (@x[$c1],@x[$c1],@x[$d1])", - "&add_32 (@x[$c2],@x[$c2],@x[$d2])", - "&add_32 (@x[$c3],@x[$c3],@x[$d3])", - "&eor_32 (@x[$b0],@x[$b0],@x[$c0])", - "&eor_32 (@x[$b1],@x[$b1],@x[$c1])", - "&eor_32 (@x[$b2],@x[$b2],@x[$c2])", - "&eor_32 (@x[$b3],@x[$b3],@x[$c3])", - "&ror_32 (@x[$b0],@x[$b0],20)", - "&ror_32 (@x[$b1],@x[$b1],20)", - "&ror_32 (@x[$b2],@x[$b2],20)", - "&ror_32 (@x[$b3],@x[$b3],20)", - - "&add_32 (@x[$a0],@x[$a0],@x[$b0])", - "&add_32 (@x[$a1],@x[$a1],@x[$b1])", - "&add_32 (@x[$a2],@x[$a2],@x[$b2])", - "&add_32 (@x[$a3],@x[$a3],@x[$b3])", - "&eor_32 (@x[$d0],@x[$d0],@x[$a0])", - "&eor_32 (@x[$d1],@x[$d1],@x[$a1])", - "&eor_32 (@x[$d2],@x[$d2],@x[$a2])", - "&eor_32 (@x[$d3],@x[$d3],@x[$a3])", - "&ror_32 (@x[$d0],@x[$d0],24)", - "&ror_32 (@x[$d1],@x[$d1],24)", - "&ror_32 (@x[$d2],@x[$d2],24)", - "&ror_32 (@x[$d3],@x[$d3],24)", - - "&add_32 (@x[$c0],@x[$c0],@x[$d0])", - "&add_32 (@x[$c1],@x[$c1],@x[$d1])", - "&add_32 (@x[$c2],@x[$c2],@x[$d2])", - "&add_32 (@x[$c3],@x[$c3],@x[$d3])", - "&eor_32 (@x[$b0],@x[$b0],@x[$c0])", - "&eor_32 (@x[$b1],@x[$b1],@x[$c1])", - "&eor_32 (@x[$b2],@x[$b2],@x[$c2])", - "&eor_32 (@x[$b3],@x[$b3],@x[$c3])", - "&ror_32 (@x[$b0],@x[$b0],25)", - "&ror_32 (@x[$b1],@x[$b1],25)", - "&ror_32 (@x[$b2],@x[$b2],25)", - "&ror_32 (@x[$b3],@x[$b3],25)" - ); -} - -$code.=<<___; -#include - -.extern GFp_armcap_P -.hidden GFp_armcap_P - -.section .rodata - -.align 5 -.Lsigma: -.quad 0x3320646e61707865,0x6b20657479622d32 // endian-neutral -.Lone: -.long 1,0,0,0 -.asciz "ChaCha20 for ARMv8, CRYPTOGAMS by " - -.text - -.globl GFp_ChaCha20_ctr32 -.type GFp_ChaCha20_ctr32,%function -.align 5 -GFp_ChaCha20_ctr32: - AARCH64_VALID_CALL_TARGET - cbz $len,.Labort -#if __has_feature(hwaddress_sanitizer) && __clang_major__ >= 10 - adrp @x[0],:pg_hi21_nc:GFp_armcap_P -#else - adrp @x[0],:pg_hi21:GFp_armcap_P -#endif - cmp $len,#192 - b.lo .Lshort - ldr w17,[@x[0],:lo12:GFp_armcap_P] - tst w17,#ARMV7_NEON - b.ne ChaCha20_neon - -.Lshort: - AARCH64_SIGN_LINK_REGISTER - stp x29,x30,[sp,#-96]! - add x29,sp,#0 - - adrp @x[0],:pg_hi21:.Lsigma - add @x[0],@x[0],:lo12:.Lsigma - stp x19,x20,[sp,#16] - stp x21,x22,[sp,#32] - stp x23,x24,[sp,#48] - stp x25,x26,[sp,#64] - stp x27,x28,[sp,#80] - sub sp,sp,#64 - - ldp @d[0],@d[1],[@x[0]] // load sigma - ldp @d[2],@d[3],[$key] // load key - ldp @d[4],@d[5],[$key,#16] - ldp @d[6],@d[7],[$ctr] // load counter -#ifdef __ARMEB__ - ror @d[2],@d[2],#32 - ror @d[3],@d[3],#32 - ror @d[4],@d[4],#32 - ror @d[5],@d[5],#32 - ror @d[6],@d[6],#32 - ror @d[7],@d[7],#32 -#endif - -.Loop_outer: - mov.32 @x[0],@d[0] // unpack key block - lsr @x[1],@d[0],#32 - mov.32 @x[2],@d[1] - lsr @x[3],@d[1],#32 - mov.32 @x[4],@d[2] - lsr @x[5],@d[2],#32 - mov.32 @x[6],@d[3] - lsr @x[7],@d[3],#32 - mov.32 @x[8],@d[4] - lsr @x[9],@d[4],#32 - mov.32 @x[10],@d[5] - lsr @x[11],@d[5],#32 - mov.32 @x[12],@d[6] - lsr @x[13],@d[6],#32 - mov.32 @x[14],@d[7] - lsr @x[15],@d[7],#32 - - mov $ctr,#10 - subs $len,$len,#64 -.Loop: - sub $ctr,$ctr,#1 -___ - foreach (&ROUND(0, 4, 8,12)) { eval; } - foreach (&ROUND(0, 5,10,15)) { eval; } -$code.=<<___; - cbnz $ctr,.Loop - - add.32 @x[0],@x[0],@d[0] // accumulate key block - add @x[1],@x[1],@d[0],lsr#32 - add.32 @x[2],@x[2],@d[1] - add @x[3],@x[3],@d[1],lsr#32 - add.32 @x[4],@x[4],@d[2] - add @x[5],@x[5],@d[2],lsr#32 - add.32 @x[6],@x[6],@d[3] - add @x[7],@x[7],@d[3],lsr#32 - add.32 @x[8],@x[8],@d[4] - add @x[9],@x[9],@d[4],lsr#32 - add.32 @x[10],@x[10],@d[5] - add @x[11],@x[11],@d[5],lsr#32 - add.32 @x[12],@x[12],@d[6] - add @x[13],@x[13],@d[6],lsr#32 - add.32 @x[14],@x[14],@d[7] - add @x[15],@x[15],@d[7],lsr#32 - - b.lo .Ltail - - add @x[0],@x[0],@x[1],lsl#32 // pack - add @x[2],@x[2],@x[3],lsl#32 - ldp @x[1],@x[3],[$inp,#0] // load input - add @x[4],@x[4],@x[5],lsl#32 - add @x[6],@x[6],@x[7],lsl#32 - ldp @x[5],@x[7],[$inp,#16] - add @x[8],@x[8],@x[9],lsl#32 - add @x[10],@x[10],@x[11],lsl#32 - ldp @x[9],@x[11],[$inp,#32] - add @x[12],@x[12],@x[13],lsl#32 - add @x[14],@x[14],@x[15],lsl#32 - ldp @x[13],@x[15],[$inp,#48] - add $inp,$inp,#64 -#ifdef __ARMEB__ - rev @x[0],@x[0] - rev @x[2],@x[2] - rev @x[4],@x[4] - rev @x[6],@x[6] - rev @x[8],@x[8] - rev @x[10],@x[10] - rev @x[12],@x[12] - rev @x[14],@x[14] -#endif - eor @x[0],@x[0],@x[1] - eor @x[2],@x[2],@x[3] - eor @x[4],@x[4],@x[5] - eor @x[6],@x[6],@x[7] - eor @x[8],@x[8],@x[9] - eor @x[10],@x[10],@x[11] - eor @x[12],@x[12],@x[13] - eor @x[14],@x[14],@x[15] - - stp @x[0],@x[2],[$out,#0] // store output - add @d[6],@d[6],#1 // increment counter - stp @x[4],@x[6],[$out,#16] - stp @x[8],@x[10],[$out,#32] - stp @x[12],@x[14],[$out,#48] - add $out,$out,#64 - - b.hi .Loop_outer - - ldp x19,x20,[x29,#16] - add sp,sp,#64 - ldp x21,x22,[x29,#32] - ldp x23,x24,[x29,#48] - ldp x25,x26,[x29,#64] - ldp x27,x28,[x29,#80] - ldp x29,x30,[sp],#96 - AARCH64_VALIDATE_LINK_REGISTER -.Labort: - ret - -.align 4 -.Ltail: - add $len,$len,#64 -.Less_than_64: - sub $out,$out,#1 - add $inp,$inp,$len - add $out,$out,$len - add $ctr,sp,$len - neg $len,$len - - add @x[0],@x[0],@x[1],lsl#32 // pack - add @x[2],@x[2],@x[3],lsl#32 - add @x[4],@x[4],@x[5],lsl#32 - add @x[6],@x[6],@x[7],lsl#32 - add @x[8],@x[8],@x[9],lsl#32 - add @x[10],@x[10],@x[11],lsl#32 - add @x[12],@x[12],@x[13],lsl#32 - add @x[14],@x[14],@x[15],lsl#32 -#ifdef __ARMEB__ - rev @x[0],@x[0] - rev @x[2],@x[2] - rev @x[4],@x[4] - rev @x[6],@x[6] - rev @x[8],@x[8] - rev @x[10],@x[10] - rev @x[12],@x[12] - rev @x[14],@x[14] -#endif - stp @x[0],@x[2],[sp,#0] - stp @x[4],@x[6],[sp,#16] - stp @x[8],@x[10],[sp,#32] - stp @x[12],@x[14],[sp,#48] - -.Loop_tail: - ldrb w10,[$inp,$len] - ldrb w11,[$ctr,$len] - add $len,$len,#1 - eor w10,w10,w11 - strb w10,[$out,$len] - cbnz $len,.Loop_tail - - stp xzr,xzr,[sp,#0] - stp xzr,xzr,[sp,#16] - stp xzr,xzr,[sp,#32] - stp xzr,xzr,[sp,#48] - - ldp x19,x20,[x29,#16] - add sp,sp,#64 - ldp x21,x22,[x29,#32] - ldp x23,x24,[x29,#48] - ldp x25,x26,[x29,#64] - ldp x27,x28,[x29,#80] - ldp x29,x30,[sp],#96 - AARCH64_VALIDATE_LINK_REGISTER - ret -.size GFp_ChaCha20_ctr32,.-GFp_ChaCha20_ctr32 -___ - -{{{ -my ($A0,$B0,$C0,$D0,$A1,$B1,$C1,$D1,$A2,$B2,$C2,$D2,$T0,$T1,$T2,$T3) = - map("v$_.4s",(0..7,16..23)); -my (@K)=map("v$_.4s",(24..30)); -my $ONE="v31.4s"; - -sub NEONROUND { -my $odd = pop; -my ($a,$b,$c,$d,$t)=@_; - - ( - "&add ('$a','$a','$b')", - "&eor ('$d','$d','$a')", - "&rev32_16 ('$d','$d')", # vrot ($d,16) - - "&add ('$c','$c','$d')", - "&eor ('$t','$b','$c')", - "&ushr ('$b','$t',20)", - "&sli ('$b','$t',12)", - - "&add ('$a','$a','$b')", - "&eor ('$t','$d','$a')", - "&ushr ('$d','$t',24)", - "&sli ('$d','$t',8)", - - "&add ('$c','$c','$d')", - "&eor ('$t','$b','$c')", - "&ushr ('$b','$t',25)", - "&sli ('$b','$t',7)", - - "&ext ('$c','$c','$c',8)", - "&ext ('$d','$d','$d',$odd?4:12)", - "&ext ('$b','$b','$b',$odd?12:4)" - ); -} - -$code.=<<___; - -.type ChaCha20_neon,%function -.align 5 -ChaCha20_neon: - AARCH64_SIGN_LINK_REGISTER - stp x29,x30,[sp,#-96]! - add x29,sp,#0 - - adrp @x[0],:pg_hi21:.Lsigma - add @x[0],@x[0],:lo12:.Lsigma - stp x19,x20,[sp,#16] - stp x21,x22,[sp,#32] - stp x23,x24,[sp,#48] - stp x25,x26,[sp,#64] - stp x27,x28,[sp,#80] - cmp $len,#512 - b.hs .L512_or_more_neon - - sub sp,sp,#64 - - ldp @d[0],@d[1],[@x[0]] // load sigma - ld1 {@K[0]},[@x[0]],#16 - ldp @d[2],@d[3],[$key] // load key - ldp @d[4],@d[5],[$key,#16] - ld1 {@K[1],@K[2]},[$key] - ldp @d[6],@d[7],[$ctr] // load counter - ld1 {@K[3]},[$ctr] - ld1 {$ONE},[@x[0]] -#ifdef __ARMEB__ - rev64 @K[0],@K[0] - ror @d[2],@d[2],#32 - ror @d[3],@d[3],#32 - ror @d[4],@d[4],#32 - ror @d[5],@d[5],#32 - ror @d[6],@d[6],#32 - ror @d[7],@d[7],#32 -#endif - add @K[3],@K[3],$ONE // += 1 - add @K[4],@K[3],$ONE - add @K[5],@K[4],$ONE - shl $ONE,$ONE,#2 // 1 -> 4 - -.Loop_outer_neon: - mov.32 @x[0],@d[0] // unpack key block - lsr @x[1],@d[0],#32 - mov $A0,@K[0] - mov.32 @x[2],@d[1] - lsr @x[3],@d[1],#32 - mov $A1,@K[0] - mov.32 @x[4],@d[2] - lsr @x[5],@d[2],#32 - mov $A2,@K[0] - mov.32 @x[6],@d[3] - mov $B0,@K[1] - lsr @x[7],@d[3],#32 - mov $B1,@K[1] - mov.32 @x[8],@d[4] - mov $B2,@K[1] - lsr @x[9],@d[4],#32 - mov $D0,@K[3] - mov.32 @x[10],@d[5] - mov $D1,@K[4] - lsr @x[11],@d[5],#32 - mov $D2,@K[5] - mov.32 @x[12],@d[6] - mov $C0,@K[2] - lsr @x[13],@d[6],#32 - mov $C1,@K[2] - mov.32 @x[14],@d[7] - mov $C2,@K[2] - lsr @x[15],@d[7],#32 - - mov $ctr,#10 - subs $len,$len,#256 -.Loop_neon: - sub $ctr,$ctr,#1 -___ - my @thread0=&NEONROUND($A0,$B0,$C0,$D0,$T0,0); - my @thread1=&NEONROUND($A1,$B1,$C1,$D1,$T1,0); - my @thread2=&NEONROUND($A2,$B2,$C2,$D2,$T2,0); - my @thread3=&ROUND(0,4,8,12); - - foreach (@thread0) { - eval; eval(shift(@thread3)); - eval(shift(@thread1)); eval(shift(@thread3)); - eval(shift(@thread2)); eval(shift(@thread3)); - } - - @thread0=&NEONROUND($A0,$B0,$C0,$D0,$T0,1); - @thread1=&NEONROUND($A1,$B1,$C1,$D1,$T1,1); - @thread2=&NEONROUND($A2,$B2,$C2,$D2,$T2,1); - @thread3=&ROUND(0,5,10,15); - - foreach (@thread0) { - eval; eval(shift(@thread3)); - eval(shift(@thread1)); eval(shift(@thread3)); - eval(shift(@thread2)); eval(shift(@thread3)); - } -$code.=<<___; - cbnz $ctr,.Loop_neon - - add.32 @x[0],@x[0],@d[0] // accumulate key block - add $A0,$A0,@K[0] - add @x[1],@x[1],@d[0],lsr#32 - add $A1,$A1,@K[0] - add.32 @x[2],@x[2],@d[1] - add $A2,$A2,@K[0] - add @x[3],@x[3],@d[1],lsr#32 - add $C0,$C0,@K[2] - add.32 @x[4],@x[4],@d[2] - add $C1,$C1,@K[2] - add @x[5],@x[5],@d[2],lsr#32 - add $C2,$C2,@K[2] - add.32 @x[6],@x[6],@d[3] - add $D0,$D0,@K[3] - add @x[7],@x[7],@d[3],lsr#32 - add.32 @x[8],@x[8],@d[4] - add $D1,$D1,@K[4] - add @x[9],@x[9],@d[4],lsr#32 - add.32 @x[10],@x[10],@d[5] - add $D2,$D2,@K[5] - add @x[11],@x[11],@d[5],lsr#32 - add.32 @x[12],@x[12],@d[6] - add $B0,$B0,@K[1] - add @x[13],@x[13],@d[6],lsr#32 - add.32 @x[14],@x[14],@d[7] - add $B1,$B1,@K[1] - add @x[15],@x[15],@d[7],lsr#32 - add $B2,$B2,@K[1] - - b.lo .Ltail_neon - - add @x[0],@x[0],@x[1],lsl#32 // pack - add @x[2],@x[2],@x[3],lsl#32 - ldp @x[1],@x[3],[$inp,#0] // load input - add @x[4],@x[4],@x[5],lsl#32 - add @x[6],@x[6],@x[7],lsl#32 - ldp @x[5],@x[7],[$inp,#16] - add @x[8],@x[8],@x[9],lsl#32 - add @x[10],@x[10],@x[11],lsl#32 - ldp @x[9],@x[11],[$inp,#32] - add @x[12],@x[12],@x[13],lsl#32 - add @x[14],@x[14],@x[15],lsl#32 - ldp @x[13],@x[15],[$inp,#48] - add $inp,$inp,#64 -#ifdef __ARMEB__ - rev @x[0],@x[0] - rev @x[2],@x[2] - rev @x[4],@x[4] - rev @x[6],@x[6] - rev @x[8],@x[8] - rev @x[10],@x[10] - rev @x[12],@x[12] - rev @x[14],@x[14] -#endif - ld1.8 {$T0-$T3},[$inp],#64 - eor @x[0],@x[0],@x[1] - eor @x[2],@x[2],@x[3] - eor @x[4],@x[4],@x[5] - eor @x[6],@x[6],@x[7] - eor @x[8],@x[8],@x[9] - eor $A0,$A0,$T0 - eor @x[10],@x[10],@x[11] - eor $B0,$B0,$T1 - eor @x[12],@x[12],@x[13] - eor $C0,$C0,$T2 - eor @x[14],@x[14],@x[15] - eor $D0,$D0,$T3 - ld1.8 {$T0-$T3},[$inp],#64 - - stp @x[0],@x[2],[$out,#0] // store output - add @d[6],@d[6],#4 // increment counter - stp @x[4],@x[6],[$out,#16] - add @K[3],@K[3],$ONE // += 4 - stp @x[8],@x[10],[$out,#32] - add @K[4],@K[4],$ONE - stp @x[12],@x[14],[$out,#48] - add @K[5],@K[5],$ONE - add $out,$out,#64 - - st1.8 {$A0-$D0},[$out],#64 - ld1.8 {$A0-$D0},[$inp],#64 - - eor $A1,$A1,$T0 - eor $B1,$B1,$T1 - eor $C1,$C1,$T2 - eor $D1,$D1,$T3 - st1.8 {$A1-$D1},[$out],#64 - - eor $A2,$A2,$A0 - eor $B2,$B2,$B0 - eor $C2,$C2,$C0 - eor $D2,$D2,$D0 - st1.8 {$A2-$D2},[$out],#64 - - b.hi .Loop_outer_neon - - ldp x19,x20,[x29,#16] - add sp,sp,#64 - ldp x21,x22,[x29,#32] - ldp x23,x24,[x29,#48] - ldp x25,x26,[x29,#64] - ldp x27,x28,[x29,#80] - ldp x29,x30,[sp],#96 - AARCH64_VALIDATE_LINK_REGISTER - ret - -.Ltail_neon: - add $len,$len,#256 - cmp $len,#64 - b.lo .Less_than_64 - - add @x[0],@x[0],@x[1],lsl#32 // pack - add @x[2],@x[2],@x[3],lsl#32 - ldp @x[1],@x[3],[$inp,#0] // load input - add @x[4],@x[4],@x[5],lsl#32 - add @x[6],@x[6],@x[7],lsl#32 - ldp @x[5],@x[7],[$inp,#16] - add @x[8],@x[8],@x[9],lsl#32 - add @x[10],@x[10],@x[11],lsl#32 - ldp @x[9],@x[11],[$inp,#32] - add @x[12],@x[12],@x[13],lsl#32 - add @x[14],@x[14],@x[15],lsl#32 - ldp @x[13],@x[15],[$inp,#48] - add $inp,$inp,#64 -#ifdef __ARMEB__ - rev @x[0],@x[0] - rev @x[2],@x[2] - rev @x[4],@x[4] - rev @x[6],@x[6] - rev @x[8],@x[8] - rev @x[10],@x[10] - rev @x[12],@x[12] - rev @x[14],@x[14] -#endif - eor @x[0],@x[0],@x[1] - eor @x[2],@x[2],@x[3] - eor @x[4],@x[4],@x[5] - eor @x[6],@x[6],@x[7] - eor @x[8],@x[8],@x[9] - eor @x[10],@x[10],@x[11] - eor @x[12],@x[12],@x[13] - eor @x[14],@x[14],@x[15] - - stp @x[0],@x[2],[$out,#0] // store output - add @d[6],@d[6],#4 // increment counter - stp @x[4],@x[6],[$out,#16] - stp @x[8],@x[10],[$out,#32] - stp @x[12],@x[14],[$out,#48] - add $out,$out,#64 - b.eq .Ldone_neon - sub $len,$len,#64 - cmp $len,#64 - b.lo .Less_than_128 - - ld1.8 {$T0-$T3},[$inp],#64 - eor $A0,$A0,$T0 - eor $B0,$B0,$T1 - eor $C0,$C0,$T2 - eor $D0,$D0,$T3 - st1.8 {$A0-$D0},[$out],#64 - b.eq .Ldone_neon - sub $len,$len,#64 - cmp $len,#64 - b.lo .Less_than_192 - - ld1.8 {$T0-$T3},[$inp],#64 - eor $A1,$A1,$T0 - eor $B1,$B1,$T1 - eor $C1,$C1,$T2 - eor $D1,$D1,$T3 - st1.8 {$A1-$D1},[$out],#64 - b.eq .Ldone_neon - sub $len,$len,#64 - - st1.8 {$A2-$D2},[sp] - b .Last_neon - -.Less_than_128: - st1.8 {$A0-$D0},[sp] - b .Last_neon -.Less_than_192: - st1.8 {$A1-$D1},[sp] - b .Last_neon - -.align 4 -.Last_neon: - sub $out,$out,#1 - add $inp,$inp,$len - add $out,$out,$len - add $ctr,sp,$len - neg $len,$len - -.Loop_tail_neon: - ldrb w10,[$inp,$len] - ldrb w11,[$ctr,$len] - add $len,$len,#1 - eor w10,w10,w11 - strb w10,[$out,$len] - cbnz $len,.Loop_tail_neon - - stp xzr,xzr,[sp,#0] - stp xzr,xzr,[sp,#16] - stp xzr,xzr,[sp,#32] - stp xzr,xzr,[sp,#48] - -.Ldone_neon: - ldp x19,x20,[x29,#16] - add sp,sp,#64 - ldp x21,x22,[x29,#32] - ldp x23,x24,[x29,#48] - ldp x25,x26,[x29,#64] - ldp x27,x28,[x29,#80] - ldp x29,x30,[sp],#96 - AARCH64_VALIDATE_LINK_REGISTER - ret -.size ChaCha20_neon,.-ChaCha20_neon -___ -{ -my ($T0,$T1,$T2,$T3,$T4,$T5)=@K; -my ($A0,$B0,$C0,$D0,$A1,$B1,$C1,$D1,$A2,$B2,$C2,$D2, - $A3,$B3,$C3,$D3,$A4,$B4,$C4,$D4,$A5,$B5,$C5,$D5) = map("v$_.4s",(0..23)); - -$code.=<<___; -.type ChaCha20_512_neon,%function -.align 5 -ChaCha20_512_neon: - AARCH64_SIGN_LINK_REGISTER - stp x29,x30,[sp,#-96]! - add x29,sp,#0 - - adrp @x[0],:pg_hi21:.Lsigma - add @x[0],@x[0],:lo12:.Lsigma - stp x19,x20,[sp,#16] - stp x21,x22,[sp,#32] - stp x23,x24,[sp,#48] - stp x25,x26,[sp,#64] - stp x27,x28,[sp,#80] - -.L512_or_more_neon: - sub sp,sp,#128+64 - - ldp @d[0],@d[1],[@x[0]] // load sigma - ld1 {@K[0]},[@x[0]],#16 - ldp @d[2],@d[3],[$key] // load key - ldp @d[4],@d[5],[$key,#16] - ld1 {@K[1],@K[2]},[$key] - ldp @d[6],@d[7],[$ctr] // load counter - ld1 {@K[3]},[$ctr] - ld1 {$ONE},[@x[0]] -#ifdef __ARMEB__ - rev64 @K[0],@K[0] - ror @d[2],@d[2],#32 - ror @d[3],@d[3],#32 - ror @d[4],@d[4],#32 - ror @d[5],@d[5],#32 - ror @d[6],@d[6],#32 - ror @d[7],@d[7],#32 -#endif - add @K[3],@K[3],$ONE // += 1 - stp @K[0],@K[1],[sp,#0] // off-load key block, invariant part - add @K[3],@K[3],$ONE // not typo - str @K[2],[sp,#32] - add @K[4],@K[3],$ONE - add @K[5],@K[4],$ONE - add @K[6],@K[5],$ONE - shl $ONE,$ONE,#2 // 1 -> 4 - - stp d8,d9,[sp,#128+0] // meet ABI requirements - stp d10,d11,[sp,#128+16] - stp d12,d13,[sp,#128+32] - stp d14,d15,[sp,#128+48] - - sub $len,$len,#512 // not typo - -.Loop_outer_512_neon: - mov $A0,@K[0] - mov $A1,@K[0] - mov $A2,@K[0] - mov $A3,@K[0] - mov $A4,@K[0] - mov $A5,@K[0] - mov $B0,@K[1] - mov.32 @x[0],@d[0] // unpack key block - mov $B1,@K[1] - lsr @x[1],@d[0],#32 - mov $B2,@K[1] - mov.32 @x[2],@d[1] - mov $B3,@K[1] - lsr @x[3],@d[1],#32 - mov $B4,@K[1] - mov.32 @x[4],@d[2] - mov $B5,@K[1] - lsr @x[5],@d[2],#32 - mov $D0,@K[3] - mov.32 @x[6],@d[3] - mov $D1,@K[4] - lsr @x[7],@d[3],#32 - mov $D2,@K[5] - mov.32 @x[8],@d[4] - mov $D3,@K[6] - lsr @x[9],@d[4],#32 - mov $C0,@K[2] - mov.32 @x[10],@d[5] - mov $C1,@K[2] - lsr @x[11],@d[5],#32 - add $D4,$D0,$ONE // +4 - mov.32 @x[12],@d[6] - add $D5,$D1,$ONE // +4 - lsr @x[13],@d[6],#32 - mov $C2,@K[2] - mov.32 @x[14],@d[7] - mov $C3,@K[2] - lsr @x[15],@d[7],#32 - mov $C4,@K[2] - stp @K[3],@K[4],[sp,#48] // off-load key block, variable part - mov $C5,@K[2] - str @K[5],[sp,#80] - - mov $ctr,#5 - subs $len,$len,#512 -.Loop_upper_neon: - sub $ctr,$ctr,#1 -___ - my @thread0=&NEONROUND($A0,$B0,$C0,$D0,$T0,0); - my @thread1=&NEONROUND($A1,$B1,$C1,$D1,$T1,0); - my @thread2=&NEONROUND($A2,$B2,$C2,$D2,$T2,0); - my @thread3=&NEONROUND($A3,$B3,$C3,$D3,$T3,0); - my @thread4=&NEONROUND($A4,$B4,$C4,$D4,$T4,0); - my @thread5=&NEONROUND($A5,$B5,$C5,$D5,$T5,0); - my @thread67=(&ROUND(0,4,8,12),&ROUND(0,5,10,15)); - my $diff = ($#thread0+1)*6 - $#thread67 - 1; - my $i = 0; - - foreach (@thread0) { - eval; eval(shift(@thread67)); - eval(shift(@thread1)); eval(shift(@thread67)); - eval(shift(@thread2)); eval(shift(@thread67)); - eval(shift(@thread3)); eval(shift(@thread67)); - eval(shift(@thread4)); eval(shift(@thread67)); - eval(shift(@thread5)); eval(shift(@thread67)); - } - - @thread0=&NEONROUND($A0,$B0,$C0,$D0,$T0,1); - @thread1=&NEONROUND($A1,$B1,$C1,$D1,$T1,1); - @thread2=&NEONROUND($A2,$B2,$C2,$D2,$T2,1); - @thread3=&NEONROUND($A3,$B3,$C3,$D3,$T3,1); - @thread4=&NEONROUND($A4,$B4,$C4,$D4,$T4,1); - @thread5=&NEONROUND($A5,$B5,$C5,$D5,$T5,1); - @thread67=(&ROUND(0,4,8,12),&ROUND(0,5,10,15)); - - foreach (@thread0) { - eval; eval(shift(@thread67)); - eval(shift(@thread1)); eval(shift(@thread67)); - eval(shift(@thread2)); eval(shift(@thread67)); - eval(shift(@thread3)); eval(shift(@thread67)); - eval(shift(@thread4)); eval(shift(@thread67)); - eval(shift(@thread5)); eval(shift(@thread67)); - } -$code.=<<___; - cbnz $ctr,.Loop_upper_neon - - add.32 @x[0],@x[0],@d[0] // accumulate key block - add @x[1],@x[1],@d[0],lsr#32 - add.32 @x[2],@x[2],@d[1] - add @x[3],@x[3],@d[1],lsr#32 - add.32 @x[4],@x[4],@d[2] - add @x[5],@x[5],@d[2],lsr#32 - add.32 @x[6],@x[6],@d[3] - add @x[7],@x[7],@d[3],lsr#32 - add.32 @x[8],@x[8],@d[4] - add @x[9],@x[9],@d[4],lsr#32 - add.32 @x[10],@x[10],@d[5] - add @x[11],@x[11],@d[5],lsr#32 - add.32 @x[12],@x[12],@d[6] - add @x[13],@x[13],@d[6],lsr#32 - add.32 @x[14],@x[14],@d[7] - add @x[15],@x[15],@d[7],lsr#32 - - add @x[0],@x[0],@x[1],lsl#32 // pack - add @x[2],@x[2],@x[3],lsl#32 - ldp @x[1],@x[3],[$inp,#0] // load input - add @x[4],@x[4],@x[5],lsl#32 - add @x[6],@x[6],@x[7],lsl#32 - ldp @x[5],@x[7],[$inp,#16] - add @x[8],@x[8],@x[9],lsl#32 - add @x[10],@x[10],@x[11],lsl#32 - ldp @x[9],@x[11],[$inp,#32] - add @x[12],@x[12],@x[13],lsl#32 - add @x[14],@x[14],@x[15],lsl#32 - ldp @x[13],@x[15],[$inp,#48] - add $inp,$inp,#64 -#ifdef __ARMEB__ - rev @x[0],@x[0] - rev @x[2],@x[2] - rev @x[4],@x[4] - rev @x[6],@x[6] - rev @x[8],@x[8] - rev @x[10],@x[10] - rev @x[12],@x[12] - rev @x[14],@x[14] -#endif - eor @x[0],@x[0],@x[1] - eor @x[2],@x[2],@x[3] - eor @x[4],@x[4],@x[5] - eor @x[6],@x[6],@x[7] - eor @x[8],@x[8],@x[9] - eor @x[10],@x[10],@x[11] - eor @x[12],@x[12],@x[13] - eor @x[14],@x[14],@x[15] - - stp @x[0],@x[2],[$out,#0] // store output - add @d[6],@d[6],#1 // increment counter - mov.32 @x[0],@d[0] // unpack key block - lsr @x[1],@d[0],#32 - stp @x[4],@x[6],[$out,#16] - mov.32 @x[2],@d[1] - lsr @x[3],@d[1],#32 - stp @x[8],@x[10],[$out,#32] - mov.32 @x[4],@d[2] - lsr @x[5],@d[2],#32 - stp @x[12],@x[14],[$out,#48] - add $out,$out,#64 - mov.32 @x[6],@d[3] - lsr @x[7],@d[3],#32 - mov.32 @x[8],@d[4] - lsr @x[9],@d[4],#32 - mov.32 @x[10],@d[5] - lsr @x[11],@d[5],#32 - mov.32 @x[12],@d[6] - lsr @x[13],@d[6],#32 - mov.32 @x[14],@d[7] - lsr @x[15],@d[7],#32 - - mov $ctr,#5 -.Loop_lower_neon: - sub $ctr,$ctr,#1 -___ - @thread0=&NEONROUND($A0,$B0,$C0,$D0,$T0,0); - @thread1=&NEONROUND($A1,$B1,$C1,$D1,$T1,0); - @thread2=&NEONROUND($A2,$B2,$C2,$D2,$T2,0); - @thread3=&NEONROUND($A3,$B3,$C3,$D3,$T3,0); - @thread4=&NEONROUND($A4,$B4,$C4,$D4,$T4,0); - @thread5=&NEONROUND($A5,$B5,$C5,$D5,$T5,0); - @thread67=(&ROUND(0,4,8,12),&ROUND(0,5,10,15)); - - foreach (@thread0) { - eval; eval(shift(@thread67)); - eval(shift(@thread1)); eval(shift(@thread67)); - eval(shift(@thread2)); eval(shift(@thread67)); - eval(shift(@thread3)); eval(shift(@thread67)); - eval(shift(@thread4)); eval(shift(@thread67)); - eval(shift(@thread5)); eval(shift(@thread67)); - } - - @thread0=&NEONROUND($A0,$B0,$C0,$D0,$T0,1); - @thread1=&NEONROUND($A1,$B1,$C1,$D1,$T1,1); - @thread2=&NEONROUND($A2,$B2,$C2,$D2,$T2,1); - @thread3=&NEONROUND($A3,$B3,$C3,$D3,$T3,1); - @thread4=&NEONROUND($A4,$B4,$C4,$D4,$T4,1); - @thread5=&NEONROUND($A5,$B5,$C5,$D5,$T5,1); - @thread67=(&ROUND(0,4,8,12),&ROUND(0,5,10,15)); - - foreach (@thread0) { - eval; eval(shift(@thread67)); - eval(shift(@thread1)); eval(shift(@thread67)); - eval(shift(@thread2)); eval(shift(@thread67)); - eval(shift(@thread3)); eval(shift(@thread67)); - eval(shift(@thread4)); eval(shift(@thread67)); - eval(shift(@thread5)); eval(shift(@thread67)); - } -$code.=<<___; - cbnz $ctr,.Loop_lower_neon - - add.32 @x[0],@x[0],@d[0] // accumulate key block - ldp @K[0],@K[1],[sp,#0] - add @x[1],@x[1],@d[0],lsr#32 - ldp @K[2],@K[3],[sp,#32] - add.32 @x[2],@x[2],@d[1] - ldp @K[4],@K[5],[sp,#64] - add @x[3],@x[3],@d[1],lsr#32 - add $A0,$A0,@K[0] - add.32 @x[4],@x[4],@d[2] - add $A1,$A1,@K[0] - add @x[5],@x[5],@d[2],lsr#32 - add $A2,$A2,@K[0] - add.32 @x[6],@x[6],@d[3] - add $A3,$A3,@K[0] - add @x[7],@x[7],@d[3],lsr#32 - add $A4,$A4,@K[0] - add.32 @x[8],@x[8],@d[4] - add $A5,$A5,@K[0] - add @x[9],@x[9],@d[4],lsr#32 - add $C0,$C0,@K[2] - add.32 @x[10],@x[10],@d[5] - add $C1,$C1,@K[2] - add @x[11],@x[11],@d[5],lsr#32 - add $C2,$C2,@K[2] - add.32 @x[12],@x[12],@d[6] - add $C3,$C3,@K[2] - add @x[13],@x[13],@d[6],lsr#32 - add $C4,$C4,@K[2] - add.32 @x[14],@x[14],@d[7] - add $C5,$C5,@K[2] - add @x[15],@x[15],@d[7],lsr#32 - add $D4,$D4,$ONE // +4 - add @x[0],@x[0],@x[1],lsl#32 // pack - add $D5,$D5,$ONE // +4 - add @x[2],@x[2],@x[3],lsl#32 - add $D0,$D0,@K[3] - ldp @x[1],@x[3],[$inp,#0] // load input - add $D1,$D1,@K[4] - add @x[4],@x[4],@x[5],lsl#32 - add $D2,$D2,@K[5] - add @x[6],@x[6],@x[7],lsl#32 - add $D3,$D3,@K[6] - ldp @x[5],@x[7],[$inp,#16] - add $D4,$D4,@K[3] - add @x[8],@x[8],@x[9],lsl#32 - add $D5,$D5,@K[4] - add @x[10],@x[10],@x[11],lsl#32 - add $B0,$B0,@K[1] - ldp @x[9],@x[11],[$inp,#32] - add $B1,$B1,@K[1] - add @x[12],@x[12],@x[13],lsl#32 - add $B2,$B2,@K[1] - add @x[14],@x[14],@x[15],lsl#32 - add $B3,$B3,@K[1] - ldp @x[13],@x[15],[$inp,#48] - add $B4,$B4,@K[1] - add $inp,$inp,#64 - add $B5,$B5,@K[1] - -#ifdef __ARMEB__ - rev @x[0],@x[0] - rev @x[2],@x[2] - rev @x[4],@x[4] - rev @x[6],@x[6] - rev @x[8],@x[8] - rev @x[10],@x[10] - rev @x[12],@x[12] - rev @x[14],@x[14] -#endif - ld1.8 {$T0-$T3},[$inp],#64 - eor @x[0],@x[0],@x[1] - eor @x[2],@x[2],@x[3] - eor @x[4],@x[4],@x[5] - eor @x[6],@x[6],@x[7] - eor @x[8],@x[8],@x[9] - eor $A0,$A0,$T0 - eor @x[10],@x[10],@x[11] - eor $B0,$B0,$T1 - eor @x[12],@x[12],@x[13] - eor $C0,$C0,$T2 - eor @x[14],@x[14],@x[15] - eor $D0,$D0,$T3 - ld1.8 {$T0-$T3},[$inp],#64 - - stp @x[0],@x[2],[$out,#0] // store output - add @d[6],@d[6],#7 // increment counter - stp @x[4],@x[6],[$out,#16] - stp @x[8],@x[10],[$out,#32] - stp @x[12],@x[14],[$out,#48] - add $out,$out,#64 - st1.8 {$A0-$D0},[$out],#64 - - ld1.8 {$A0-$D0},[$inp],#64 - eor $A1,$A1,$T0 - eor $B1,$B1,$T1 - eor $C1,$C1,$T2 - eor $D1,$D1,$T3 - st1.8 {$A1-$D1},[$out],#64 - - ld1.8 {$A1-$D1},[$inp],#64 - eor $A2,$A2,$A0 - ldp @K[0],@K[1],[sp,#0] - eor $B2,$B2,$B0 - ldp @K[2],@K[3],[sp,#32] - eor $C2,$C2,$C0 - eor $D2,$D2,$D0 - st1.8 {$A2-$D2},[$out],#64 - - ld1.8 {$A2-$D2},[$inp],#64 - eor $A3,$A3,$A1 - eor $B3,$B3,$B1 - eor $C3,$C3,$C1 - eor $D3,$D3,$D1 - st1.8 {$A3-$D3},[$out],#64 - - ld1.8 {$A3-$D3},[$inp],#64 - eor $A4,$A4,$A2 - eor $B4,$B4,$B2 - eor $C4,$C4,$C2 - eor $D4,$D4,$D2 - st1.8 {$A4-$D4},[$out],#64 - - shl $A0,$ONE,#1 // 4 -> 8 - eor $A5,$A5,$A3 - eor $B5,$B5,$B3 - eor $C5,$C5,$C3 - eor $D5,$D5,$D3 - st1.8 {$A5-$D5},[$out],#64 - - add @K[3],@K[3],$A0 // += 8 - add @K[4],@K[4],$A0 - add @K[5],@K[5],$A0 - add @K[6],@K[6],$A0 - - b.hs .Loop_outer_512_neon - - adds $len,$len,#512 - ushr $A0,$ONE,#2 // 4 -> 1 - - ldp d8,d9,[sp,#128+0] // meet ABI requirements - ldp d10,d11,[sp,#128+16] - ldp d12,d13,[sp,#128+32] - ldp d14,d15,[sp,#128+48] - - stp @K[0],$ONE,[sp,#0] // wipe off-load area - stp @K[0],$ONE,[sp,#32] - stp @K[0],$ONE,[sp,#64] - - b.eq .Ldone_512_neon - - cmp $len,#192 - sub @K[3],@K[3],$A0 // -= 1 - sub @K[4],@K[4],$A0 - sub @K[5],@K[5],$A0 - add sp,sp,#128 - b.hs .Loop_outer_neon - - eor @K[1],@K[1],@K[1] - eor @K[2],@K[2],@K[2] - eor @K[3],@K[3],@K[3] - eor @K[4],@K[4],@K[4] - eor @K[5],@K[5],@K[5] - eor @K[6],@K[6],@K[6] - b .Loop_outer - -.Ldone_512_neon: - ldp x19,x20,[x29,#16] - add sp,sp,#128+64 - ldp x21,x22,[x29,#32] - ldp x23,x24,[x29,#48] - ldp x25,x26,[x29,#64] - ldp x27,x28,[x29,#80] - ldp x29,x30,[sp],#96 - AARCH64_VALIDATE_LINK_REGISTER - ret -.size ChaCha20_512_neon,.-ChaCha20_512_neon -___ -} -}}} - -foreach (split("\n",$code)) { - s/\`([^\`]*)\`/eval $1/geo; - - (s/\b([a-z]+)\.32\b/$1/ and (s/x([0-9]+)/w$1/g or 1)) or - (m/\b(eor|ext|mov)\b/ and (s/\.4s/\.16b/g or 1)) or - (s/\b((?:ld|st)1)\.8\b/$1/ and (s/\.4s/\.16b/g or 1)) or - (m/\b(ld|st)[rp]\b/ and (s/v([0-9]+)\.4s/q$1/g or 1)) or - (s/\brev32\.16\b/rev32/ and (s/\.4s/\.8h/g or 1)); - - #s/\bq([0-9]+)#(lo|hi)/sprintf "d%d",2*$1+($2 eq "hi")/geo; - - print $_,"\n"; -} -close STDOUT or die "error closing STDOUT"; # flush diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/crypto/chacha/asm/chacha-x86_64.pl temporalio-1.3.0/vendor/ring-0.16.20/crypto/chacha/asm/chacha-x86_64.pl --- temporalio-1.3.0/vendor/ring-0.16.20/crypto/chacha/asm/chacha-x86_64.pl 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/crypto/chacha/asm/chacha-x86_64.pl 1970-01-01 00:00:00.000000000 +0000 @@ -1,2035 +0,0 @@ -#! /usr/bin/env perl -# Copyright 2016 The OpenSSL Project Authors. All Rights Reserved. -# -# Licensed under the OpenSSL license (the "License"). You may not use -# this file except in compliance with the License. You can obtain a copy -# in the file LICENSE in the source distribution or at -# https://www.openssl.org/source/license.html - -# -# ==================================================================== -# Written by Andy Polyakov for the OpenSSL -# project. The module is, however, dual licensed under OpenSSL and -# CRYPTOGAMS licenses depending on where you obtain it. For further -# details see http://www.openssl.org/~appro/cryptogams/. -# ==================================================================== -# -# November 2014 -# -# ChaCha20 for x86_64. -# -# December 2016 -# -# Add AVX512F code path. -# -# Performance in cycles per byte out of large buffer. -# -# IALU/gcc 4.8(i) 1xSSSE3/SSE2 4xSSSE3 NxAVX(v) -# -# P4 9.48/+99% -/22.7(ii) - -# Core2 7.83/+55% 7.90/8.08 4.35 -# Westmere 7.19/+50% 5.60/6.70 3.00 -# Sandy Bridge 8.31/+42% 5.45/6.76 2.72 -# Ivy Bridge 6.71/+46% 5.40/6.49 2.41 -# Haswell 5.92/+43% 5.20/6.45 2.42 1.23 -# Skylake[-X] 5.87/+39% 4.70/- 2.31 1.19[0.57] -# Silvermont 12.0/+33% 7.75/7.40 7.03(iii) -# Knights L 11.7/- - 9.60(iii) 0.80 -# Goldmont 10.6/+17% 5.10/- 3.28 -# Sledgehammer 7.28/+52% -/14.2(ii) - -# Bulldozer 9.66/+28% 9.85/11.1 3.06(iv) -# Ryzen 5.96/+50% 5.19/- 2.40 2.09 -# VIA Nano 10.5/+46% 6.72/8.60 6.05 -# -# (i) compared to older gcc 3.x one can observe >2x improvement on -# most platforms; -# (ii) as it can be seen, SSE2 performance is too low on legacy -# processors; NxSSE2 results are naturally better, but not -# impressively better than IALU ones, which is why you won't -# find SSE2 code below; -# (iii) this is not optimal result for Atom because of MSROM -# limitations, SSE2 can do better, but gain is considered too -# low to justify the [maintenance] effort; -# (iv) Bulldozer actually executes 4xXOP code path that delivers 2.20; -# -# Modified from upstream OpenSSL to remove the XOP code. - -$flavour = shift; -$output = shift; -if ($flavour =~ /\./) { $output = $flavour; undef $flavour; } - -$win64=0; $win64=1 if ($flavour =~ /[nm]asm|mingw64/ || $output =~ /\.asm$/); - -$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; -( $xlate="${dir}x86_64-xlate.pl" and -f $xlate ) or -( $xlate="${dir}../../perlasm/x86_64-xlate.pl" and -f $xlate) or -die "can't locate x86_64-xlate.pl"; - -$avx = 2; - -open OUT,"| \"$^X\" $xlate $flavour $output"; -*STDOUT=*OUT; - -# input parameter block -($out,$inp,$len,$key,$counter)=("%rdi","%rsi","%rdx","%rcx","%r8"); - -$code.=<<___; -.text - -.extern GFp_ia32cap_P - -.align 64 -.Lzero: -.long 0,0,0,0 -.Lone: -.long 1,0,0,0 -.Linc: -.long 0,1,2,3 -.Lfour: -.long 4,4,4,4 -.Lincy: -.long 0,2,4,6,1,3,5,7 -.Leight: -.long 8,8,8,8,8,8,8,8 -.Lrot16: -.byte 0x2,0x3,0x0,0x1, 0x6,0x7,0x4,0x5, 0xa,0xb,0x8,0x9, 0xe,0xf,0xc,0xd -.Lrot24: -.byte 0x3,0x0,0x1,0x2, 0x7,0x4,0x5,0x6, 0xb,0x8,0x9,0xa, 0xf,0xc,0xd,0xe -.Lsigma: -.asciz "expand 32-byte k" -.align 64 -.Lzeroz: -.long 0,0,0,0, 1,0,0,0, 2,0,0,0, 3,0,0,0 -.Lfourz: -.long 4,0,0,0, 4,0,0,0, 4,0,0,0, 4,0,0,0 -.Lincz: -.long 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 -.Lsixteen: -.long 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16 -.asciz "ChaCha20 for x86_64, CRYPTOGAMS by " -___ - -sub AUTOLOAD() # thunk [simplified] 32-bit style perlasm -{ my $opcode = $AUTOLOAD; $opcode =~ s/.*:://; - my $arg = pop; - $arg = "\$$arg" if ($arg*1 eq $arg); - $code .= "\t$opcode\t".join(',',$arg,reverse @_)."\n"; -} - -@x=("%eax","%ebx","%ecx","%edx",map("%r${_}d",(8..11)), - "%nox","%nox","%nox","%nox",map("%r${_}d",(12..15))); -@t=("%esi","%edi"); - -sub ROUND { # critical path is 24 cycles per round -my ($a0,$b0,$c0,$d0)=@_; -my ($a1,$b1,$c1,$d1)=map(($_&~3)+(($_+1)&3),($a0,$b0,$c0,$d0)); -my ($a2,$b2,$c2,$d2)=map(($_&~3)+(($_+1)&3),($a1,$b1,$c1,$d1)); -my ($a3,$b3,$c3,$d3)=map(($_&~3)+(($_+1)&3),($a2,$b2,$c2,$d2)); -my ($xc,$xc_)=map("\"$_\"",@t); -my @x=map("\"$_\"",@x); - - # Consider order in which variables are addressed by their - # index: - # - # a b c d - # - # 0 4 8 12 < even round - # 1 5 9 13 - # 2 6 10 14 - # 3 7 11 15 - # 0 5 10 15 < odd round - # 1 6 11 12 - # 2 7 8 13 - # 3 4 9 14 - # - # 'a', 'b' and 'd's are permanently allocated in registers, - # @x[0..7,12..15], while 'c's are maintained in memory. If - # you observe 'c' column, you'll notice that pair of 'c's is - # invariant between rounds. This means that we have to reload - # them once per round, in the middle. This is why you'll see - # bunch of 'c' stores and loads in the middle, but none in - # the beginning or end. - - # Normally instructions would be interleaved to favour in-order - # execution. Generally out-of-order cores manage it gracefully, - # but not this time for some reason. As in-order execution - # cores are dying breed, old Atom is the only one around, - # instructions are left uninterleaved. Besides, Atom is better - # off executing 1xSSSE3 code anyway... - - ( - "&add (@x[$a0],@x[$b0])", # Q1 - "&xor (@x[$d0],@x[$a0])", - "&rol (@x[$d0],16)", - "&add (@x[$a1],@x[$b1])", # Q2 - "&xor (@x[$d1],@x[$a1])", - "&rol (@x[$d1],16)", - - "&add ($xc,@x[$d0])", - "&xor (@x[$b0],$xc)", - "&rol (@x[$b0],12)", - "&add ($xc_,@x[$d1])", - "&xor (@x[$b1],$xc_)", - "&rol (@x[$b1],12)", - - "&add (@x[$a0],@x[$b0])", - "&xor (@x[$d0],@x[$a0])", - "&rol (@x[$d0],8)", - "&add (@x[$a1],@x[$b1])", - "&xor (@x[$d1],@x[$a1])", - "&rol (@x[$d1],8)", - - "&add ($xc,@x[$d0])", - "&xor (@x[$b0],$xc)", - "&rol (@x[$b0],7)", - "&add ($xc_,@x[$d1])", - "&xor (@x[$b1],$xc_)", - "&rol (@x[$b1],7)", - - "&mov (\"4*$c0(%rsp)\",$xc)", # reload pair of 'c's - "&mov (\"4*$c1(%rsp)\",$xc_)", - "&mov ($xc,\"4*$c2(%rsp)\")", - "&mov ($xc_,\"4*$c3(%rsp)\")", - - "&add (@x[$a2],@x[$b2])", # Q3 - "&xor (@x[$d2],@x[$a2])", - "&rol (@x[$d2],16)", - "&add (@x[$a3],@x[$b3])", # Q4 - "&xor (@x[$d3],@x[$a3])", - "&rol (@x[$d3],16)", - - "&add ($xc,@x[$d2])", - "&xor (@x[$b2],$xc)", - "&rol (@x[$b2],12)", - "&add ($xc_,@x[$d3])", - "&xor (@x[$b3],$xc_)", - "&rol (@x[$b3],12)", - - "&add (@x[$a2],@x[$b2])", - "&xor (@x[$d2],@x[$a2])", - "&rol (@x[$d2],8)", - "&add (@x[$a3],@x[$b3])", - "&xor (@x[$d3],@x[$a3])", - "&rol (@x[$d3],8)", - - "&add ($xc,@x[$d2])", - "&xor (@x[$b2],$xc)", - "&rol (@x[$b2],7)", - "&add ($xc_,@x[$d3])", - "&xor (@x[$b3],$xc_)", - "&rol (@x[$b3],7)" - ); -} - -######################################################################## -# Generic code path that handles all lengths on pre-SSSE3 processors. -$code.=<<___; -.globl GFp_ChaCha20_ctr32 -.type GFp_ChaCha20_ctr32,\@function,5 -.align 64 -GFp_ChaCha20_ctr32: -.cfi_startproc - cmp \$0,$len - je .Lno_data - mov GFp_ia32cap_P+4(%rip),%r10 -___ -$code.=<<___; - test \$`1<<(41-32)`,%r10d - jnz .LChaCha20_ssse3 - - push %rbx -.cfi_push rbx - push %rbp -.cfi_push rbp - push %r12 -.cfi_push r12 - push %r13 -.cfi_push r13 - push %r14 -.cfi_push r14 - push %r15 -.cfi_push r15 - sub \$64+24,%rsp -.cfi_adjust_cfa_offset `64+24` -.Lctr32_body: - - #movdqa .Lsigma(%rip),%xmm0 - movdqu ($key),%xmm1 - movdqu 16($key),%xmm2 - movdqu ($counter),%xmm3 - movdqa .Lone(%rip),%xmm4 - - #movdqa %xmm0,4*0(%rsp) # key[0] - movdqa %xmm1,4*4(%rsp) # key[1] - movdqa %xmm2,4*8(%rsp) # key[2] - movdqa %xmm3,4*12(%rsp) # key[3] - mov $len,%rbp # reassign $len - jmp .Loop_outer - -.align 32 -.Loop_outer: - mov \$0x61707865,@x[0] # 'expa' - mov \$0x3320646e,@x[1] # 'nd 3' - mov \$0x79622d32,@x[2] # '2-by' - mov \$0x6b206574,@x[3] # 'te k' - mov 4*4(%rsp),@x[4] - mov 4*5(%rsp),@x[5] - mov 4*6(%rsp),@x[6] - mov 4*7(%rsp),@x[7] - movd %xmm3,@x[12] - mov 4*13(%rsp),@x[13] - mov 4*14(%rsp),@x[14] - mov 4*15(%rsp),@x[15] - - mov %rbp,64+0(%rsp) # save len - mov \$10,%ebp - mov $inp,64+8(%rsp) # save inp - movq %xmm2,%rsi # "@x[8]" - mov $out,64+16(%rsp) # save out - mov %rsi,%rdi - shr \$32,%rdi # "@x[9]" - jmp .Loop - -.align 32 -.Loop: -___ - foreach (&ROUND (0, 4, 8,12)) { eval; } - foreach (&ROUND (0, 5,10,15)) { eval; } - &dec ("%ebp"); - &jnz (".Loop"); - -$code.=<<___; - mov @t[1],4*9(%rsp) # modulo-scheduled - mov @t[0],4*8(%rsp) - mov 64(%rsp),%rbp # load len - movdqa %xmm2,%xmm1 - mov 64+8(%rsp),$inp # load inp - paddd %xmm4,%xmm3 # increment counter - mov 64+16(%rsp),$out # load out - - add \$0x61707865,@x[0] # 'expa' - add \$0x3320646e,@x[1] # 'nd 3' - add \$0x79622d32,@x[2] # '2-by' - add \$0x6b206574,@x[3] # 'te k' - add 4*4(%rsp),@x[4] - add 4*5(%rsp),@x[5] - add 4*6(%rsp),@x[6] - add 4*7(%rsp),@x[7] - add 4*12(%rsp),@x[12] - add 4*13(%rsp),@x[13] - add 4*14(%rsp),@x[14] - add 4*15(%rsp),@x[15] - paddd 4*8(%rsp),%xmm1 - - cmp \$64,%rbp - jb .Ltail - - xor 4*0($inp),@x[0] # xor with input - xor 4*1($inp),@x[1] - xor 4*2($inp),@x[2] - xor 4*3($inp),@x[3] - xor 4*4($inp),@x[4] - xor 4*5($inp),@x[5] - xor 4*6($inp),@x[6] - xor 4*7($inp),@x[7] - movdqu 4*8($inp),%xmm0 - xor 4*12($inp),@x[12] - xor 4*13($inp),@x[13] - xor 4*14($inp),@x[14] - xor 4*15($inp),@x[15] - lea 4*16($inp),$inp # inp+=64 - pxor %xmm1,%xmm0 - - movdqa %xmm2,4*8(%rsp) - movd %xmm3,4*12(%rsp) - - mov @x[0],4*0($out) # write output - mov @x[1],4*1($out) - mov @x[2],4*2($out) - mov @x[3],4*3($out) - mov @x[4],4*4($out) - mov @x[5],4*5($out) - mov @x[6],4*6($out) - mov @x[7],4*7($out) - movdqu %xmm0,4*8($out) - mov @x[12],4*12($out) - mov @x[13],4*13($out) - mov @x[14],4*14($out) - mov @x[15],4*15($out) - lea 4*16($out),$out # out+=64 - - sub \$64,%rbp - jnz .Loop_outer - - jmp .Ldone - -.align 16 -.Ltail: - mov @x[0],4*0(%rsp) - mov @x[1],4*1(%rsp) - xor %rbx,%rbx - mov @x[2],4*2(%rsp) - mov @x[3],4*3(%rsp) - mov @x[4],4*4(%rsp) - mov @x[5],4*5(%rsp) - mov @x[6],4*6(%rsp) - mov @x[7],4*7(%rsp) - movdqa %xmm1,4*8(%rsp) - mov @x[12],4*12(%rsp) - mov @x[13],4*13(%rsp) - mov @x[14],4*14(%rsp) - mov @x[15],4*15(%rsp) - -.Loop_tail: - movzb ($inp,%rbx),%eax - movzb (%rsp,%rbx),%edx - lea 1(%rbx),%rbx - xor %edx,%eax - mov %al,-1($out,%rbx) - dec %rbp - jnz .Loop_tail - -.Ldone: - lea 64+24+48(%rsp),%rsi - mov -48(%rsi),%r15 -.cfi_restore r15 - mov -40(%rsi),%r14 -.cfi_restore r14 - mov -32(%rsi),%r13 -.cfi_restore r13 - mov -24(%rsi),%r12 -.cfi_restore r12 - mov -16(%rsi),%rbp -.cfi_restore rbp - mov -8(%rsi),%rbx -.cfi_restore rbx - lea (%rsi),%rsp -.cfi_adjust_cfa_offset `-64-24-48` -.Lno_data: - ret -.cfi_endproc -.size GFp_ChaCha20_ctr32,.-GFp_ChaCha20_ctr32 -___ - -######################################################################## -# SSSE3 code path that handles shorter lengths -{ -my ($a,$b,$c,$d,$t,$t1,$rot16,$rot24)=map("%xmm$_",(0..7)); - -sub SSSE3ROUND { # critical path is 20 "SIMD ticks" per round - &paddd ($a,$b); - &pxor ($d,$a); - &pshufb ($d,$rot16); - - &paddd ($c,$d); - &pxor ($b,$c); - &movdqa ($t,$b); - &psrld ($b,20); - &pslld ($t,12); - &por ($b,$t); - - &paddd ($a,$b); - &pxor ($d,$a); - &pshufb ($d,$rot24); - - &paddd ($c,$d); - &pxor ($b,$c); - &movdqa ($t,$b); - &psrld ($b,25); - &pslld ($t,7); - &por ($b,$t); -} - -my $xframe = $win64 ? 32+8 : 8; - -$code.=<<___; -.type ChaCha20_ssse3,\@function,5 -.align 32 -ChaCha20_ssse3: -.LChaCha20_ssse3: -.cfi_startproc - mov %rsp,%r9 # frame pointer -.cfi_def_cfa_register r9 -___ -$code.=<<___; - cmp \$128,$len # we might throw away some data, - ja .LChaCha20_4x # but overall it won't be slower - -.Ldo_sse3_after_all: - sub \$64+$xframe,%rsp -___ -$code.=<<___ if ($win64); - movaps %xmm6,-0x28(%r9) - movaps %xmm7,-0x18(%r9) -.Lssse3_body: -___ -$code.=<<___; - movdqa .Lsigma(%rip),$a - movdqu ($key),$b - movdqu 16($key),$c - movdqu ($counter),$d - movdqa .Lrot16(%rip),$rot16 - movdqa .Lrot24(%rip),$rot24 - - movdqa $a,0x00(%rsp) - movdqa $b,0x10(%rsp) - movdqa $c,0x20(%rsp) - movdqa $d,0x30(%rsp) - mov \$10,$counter # reuse $counter - jmp .Loop_ssse3 - -.align 32 -.Loop_outer_ssse3: - movdqa .Lone(%rip),$d - movdqa 0x00(%rsp),$a - movdqa 0x10(%rsp),$b - movdqa 0x20(%rsp),$c - paddd 0x30(%rsp),$d - mov \$10,$counter - movdqa $d,0x30(%rsp) - jmp .Loop_ssse3 - -.align 32 -.Loop_ssse3: -___ - &SSSE3ROUND(); - &pshufd ($c,$c,0b01001110); - &pshufd ($b,$b,0b00111001); - &pshufd ($d,$d,0b10010011); - &nop (); - - &SSSE3ROUND(); - &pshufd ($c,$c,0b01001110); - &pshufd ($b,$b,0b10010011); - &pshufd ($d,$d,0b00111001); - - &dec ($counter); - &jnz (".Loop_ssse3"); - -$code.=<<___; - paddd 0x00(%rsp),$a - paddd 0x10(%rsp),$b - paddd 0x20(%rsp),$c - paddd 0x30(%rsp),$d - - cmp \$64,$len - jb .Ltail_ssse3 - - movdqu 0x00($inp),$t - movdqu 0x10($inp),$t1 - pxor $t,$a # xor with input - movdqu 0x20($inp),$t - pxor $t1,$b - movdqu 0x30($inp),$t1 - lea 0x40($inp),$inp # inp+=64 - pxor $t,$c - pxor $t1,$d - - movdqu $a,0x00($out) # write output - movdqu $b,0x10($out) - movdqu $c,0x20($out) - movdqu $d,0x30($out) - lea 0x40($out),$out # out+=64 - - sub \$64,$len - jnz .Loop_outer_ssse3 - - jmp .Ldone_ssse3 - -.align 16 -.Ltail_ssse3: - movdqa $a,0x00(%rsp) - movdqa $b,0x10(%rsp) - movdqa $c,0x20(%rsp) - movdqa $d,0x30(%rsp) - xor $counter,$counter - -.Loop_tail_ssse3: - movzb ($inp,$counter),%eax - movzb (%rsp,$counter),%ecx - lea 1($counter),$counter - xor %ecx,%eax - mov %al,-1($out,$counter) - dec $len - jnz .Loop_tail_ssse3 - -.Ldone_ssse3: -___ -$code.=<<___ if ($win64); - movaps -0x28(%r9),%xmm6 - movaps -0x18(%r9),%xmm7 -___ -$code.=<<___; - lea (%r9),%rsp -.cfi_def_cfa_register rsp -.Lssse3_epilogue: - ret -.cfi_endproc -.size ChaCha20_ssse3,.-ChaCha20_ssse3 -___ -} - -######################################################################## -# SSSE3 code path that handles longer messages. -{ -# assign variables to favor Atom front-end -my ($xd0,$xd1,$xd2,$xd3, $xt0,$xt1,$xt2,$xt3, - $xa0,$xa1,$xa2,$xa3, $xb0,$xb1,$xb2,$xb3)=map("%xmm$_",(0..15)); -my @xx=($xa0,$xa1,$xa2,$xa3, $xb0,$xb1,$xb2,$xb3, - "%nox","%nox","%nox","%nox", $xd0,$xd1,$xd2,$xd3); - -sub SSSE3_lane_ROUND { -my ($a0,$b0,$c0,$d0)=@_; -my ($a1,$b1,$c1,$d1)=map(($_&~3)+(($_+1)&3),($a0,$b0,$c0,$d0)); -my ($a2,$b2,$c2,$d2)=map(($_&~3)+(($_+1)&3),($a1,$b1,$c1,$d1)); -my ($a3,$b3,$c3,$d3)=map(($_&~3)+(($_+1)&3),($a2,$b2,$c2,$d2)); -my ($xc,$xc_,$t0,$t1)=map("\"$_\"",$xt0,$xt1,$xt2,$xt3); -my @x=map("\"$_\"",@xx); - - # Consider order in which variables are addressed by their - # index: - # - # a b c d - # - # 0 4 8 12 < even round - # 1 5 9 13 - # 2 6 10 14 - # 3 7 11 15 - # 0 5 10 15 < odd round - # 1 6 11 12 - # 2 7 8 13 - # 3 4 9 14 - # - # 'a', 'b' and 'd's are permanently allocated in registers, - # @x[0..7,12..15], while 'c's are maintained in memory. If - # you observe 'c' column, you'll notice that pair of 'c's is - # invariant between rounds. This means that we have to reload - # them once per round, in the middle. This is why you'll see - # bunch of 'c' stores and loads in the middle, but none in - # the beginning or end. - - ( - "&paddd (@x[$a0],@x[$b0])", # Q1 - "&paddd (@x[$a1],@x[$b1])", # Q2 - "&pxor (@x[$d0],@x[$a0])", - "&pxor (@x[$d1],@x[$a1])", - "&pshufb (@x[$d0],$t1)", - "&pshufb (@x[$d1],$t1)", - - "&paddd ($xc,@x[$d0])", - "&paddd ($xc_,@x[$d1])", - "&pxor (@x[$b0],$xc)", - "&pxor (@x[$b1],$xc_)", - "&movdqa ($t0,@x[$b0])", - "&pslld (@x[$b0],12)", - "&psrld ($t0,20)", - "&movdqa ($t1,@x[$b1])", - "&pslld (@x[$b1],12)", - "&por (@x[$b0],$t0)", - "&psrld ($t1,20)", - "&movdqa ($t0,'(%r11)')", # .Lrot24(%rip) - "&por (@x[$b1],$t1)", - - "&paddd (@x[$a0],@x[$b0])", - "&paddd (@x[$a1],@x[$b1])", - "&pxor (@x[$d0],@x[$a0])", - "&pxor (@x[$d1],@x[$a1])", - "&pshufb (@x[$d0],$t0)", - "&pshufb (@x[$d1],$t0)", - - "&paddd ($xc,@x[$d0])", - "&paddd ($xc_,@x[$d1])", - "&pxor (@x[$b0],$xc)", - "&pxor (@x[$b1],$xc_)", - "&movdqa ($t1,@x[$b0])", - "&pslld (@x[$b0],7)", - "&psrld ($t1,25)", - "&movdqa ($t0,@x[$b1])", - "&pslld (@x[$b1],7)", - "&por (@x[$b0],$t1)", - "&psrld ($t0,25)", - "&movdqa ($t1,'(%r10)')", # .Lrot16(%rip) - "&por (@x[$b1],$t0)", - - "&movdqa (\"`16*($c0-8)`(%rsp)\",$xc)", # reload pair of 'c's - "&movdqa (\"`16*($c1-8)`(%rsp)\",$xc_)", - "&movdqa ($xc,\"`16*($c2-8)`(%rsp)\")", - "&movdqa ($xc_,\"`16*($c3-8)`(%rsp)\")", - - "&paddd (@x[$a2],@x[$b2])", # Q3 - "&paddd (@x[$a3],@x[$b3])", # Q4 - "&pxor (@x[$d2],@x[$a2])", - "&pxor (@x[$d3],@x[$a3])", - "&pshufb (@x[$d2],$t1)", - "&pshufb (@x[$d3],$t1)", - - "&paddd ($xc,@x[$d2])", - "&paddd ($xc_,@x[$d3])", - "&pxor (@x[$b2],$xc)", - "&pxor (@x[$b3],$xc_)", - "&movdqa ($t0,@x[$b2])", - "&pslld (@x[$b2],12)", - "&psrld ($t0,20)", - "&movdqa ($t1,@x[$b3])", - "&pslld (@x[$b3],12)", - "&por (@x[$b2],$t0)", - "&psrld ($t1,20)", - "&movdqa ($t0,'(%r11)')", # .Lrot24(%rip) - "&por (@x[$b3],$t1)", - - "&paddd (@x[$a2],@x[$b2])", - "&paddd (@x[$a3],@x[$b3])", - "&pxor (@x[$d2],@x[$a2])", - "&pxor (@x[$d3],@x[$a3])", - "&pshufb (@x[$d2],$t0)", - "&pshufb (@x[$d3],$t0)", - - "&paddd ($xc,@x[$d2])", - "&paddd ($xc_,@x[$d3])", - "&pxor (@x[$b2],$xc)", - "&pxor (@x[$b3],$xc_)", - "&movdqa ($t1,@x[$b2])", - "&pslld (@x[$b2],7)", - "&psrld ($t1,25)", - "&movdqa ($t0,@x[$b3])", - "&pslld (@x[$b3],7)", - "&por (@x[$b2],$t1)", - "&psrld ($t0,25)", - "&movdqa ($t1,'(%r10)')", # .Lrot16(%rip) - "&por (@x[$b3],$t0)" - ); -} - -my $xframe = $win64 ? 0xa8 : 8; - -$code.=<<___; -.type ChaCha20_4x,\@function,5 -.align 32 -ChaCha20_4x: -.LChaCha20_4x: -.cfi_startproc - mov %rsp,%r9 # frame pointer -.cfi_def_cfa_register r9 - mov %r10,%r11 -___ -$code.=<<___ if ($avx>1); - shr \$32,%r10 # GFp_ia32cap_P+8 - test \$`1<<5`,%r10 # test AVX2 - jnz .LChaCha20_8x -___ -$code.=<<___; - cmp \$192,$len - ja .Lproceed4x - - and \$`1<<26|1<<22`,%r11 # isolate XSAVE+MOVBE - cmp \$`1<<22`,%r11 # check for MOVBE without XSAVE - je .Ldo_sse3_after_all # to detect Atom - -.Lproceed4x: - sub \$0x140+$xframe,%rsp -___ - ################ stack layout - # +0x00 SIMD equivalent of @x[8-12] - # ... - # +0x40 constant copy of key[0-2] smashed by lanes - # ... - # +0x100 SIMD counters (with nonce smashed by lanes) - # ... - # +0x140 -$code.=<<___ if ($win64); - movaps %xmm6,-0xa8(%r9) - movaps %xmm7,-0x98(%r9) - movaps %xmm8,-0x88(%r9) - movaps %xmm9,-0x78(%r9) - movaps %xmm10,-0x68(%r9) - movaps %xmm11,-0x58(%r9) - movaps %xmm12,-0x48(%r9) - movaps %xmm13,-0x38(%r9) - movaps %xmm14,-0x28(%r9) - movaps %xmm15,-0x18(%r9) -.L4x_body: -___ -$code.=<<___; - movdqa .Lsigma(%rip),$xa3 # key[0] - movdqu ($key),$xb3 # key[1] - movdqu 16($key),$xt3 # key[2] - movdqu ($counter),$xd3 # key[3] - lea 0x100(%rsp),%rcx # size optimization - lea .Lrot16(%rip),%r10 - lea .Lrot24(%rip),%r11 - - pshufd \$0x00,$xa3,$xa0 # smash key by lanes... - pshufd \$0x55,$xa3,$xa1 - movdqa $xa0,0x40(%rsp) # ... and offload - pshufd \$0xaa,$xa3,$xa2 - movdqa $xa1,0x50(%rsp) - pshufd \$0xff,$xa3,$xa3 - movdqa $xa2,0x60(%rsp) - movdqa $xa3,0x70(%rsp) - - pshufd \$0x00,$xb3,$xb0 - pshufd \$0x55,$xb3,$xb1 - movdqa $xb0,0x80-0x100(%rcx) - pshufd \$0xaa,$xb3,$xb2 - movdqa $xb1,0x90-0x100(%rcx) - pshufd \$0xff,$xb3,$xb3 - movdqa $xb2,0xa0-0x100(%rcx) - movdqa $xb3,0xb0-0x100(%rcx) - - pshufd \$0x00,$xt3,$xt0 # "$xc0" - pshufd \$0x55,$xt3,$xt1 # "$xc1" - movdqa $xt0,0xc0-0x100(%rcx) - pshufd \$0xaa,$xt3,$xt2 # "$xc2" - movdqa $xt1,0xd0-0x100(%rcx) - pshufd \$0xff,$xt3,$xt3 # "$xc3" - movdqa $xt2,0xe0-0x100(%rcx) - movdqa $xt3,0xf0-0x100(%rcx) - - pshufd \$0x00,$xd3,$xd0 - pshufd \$0x55,$xd3,$xd1 - paddd .Linc(%rip),$xd0 # don't save counters yet - pshufd \$0xaa,$xd3,$xd2 - movdqa $xd1,0x110-0x100(%rcx) - pshufd \$0xff,$xd3,$xd3 - movdqa $xd2,0x120-0x100(%rcx) - movdqa $xd3,0x130-0x100(%rcx) - - jmp .Loop_enter4x - -.align 32 -.Loop_outer4x: - movdqa 0x40(%rsp),$xa0 # re-load smashed key - movdqa 0x50(%rsp),$xa1 - movdqa 0x60(%rsp),$xa2 - movdqa 0x70(%rsp),$xa3 - movdqa 0x80-0x100(%rcx),$xb0 - movdqa 0x90-0x100(%rcx),$xb1 - movdqa 0xa0-0x100(%rcx),$xb2 - movdqa 0xb0-0x100(%rcx),$xb3 - movdqa 0xc0-0x100(%rcx),$xt0 # "$xc0" - movdqa 0xd0-0x100(%rcx),$xt1 # "$xc1" - movdqa 0xe0-0x100(%rcx),$xt2 # "$xc2" - movdqa 0xf0-0x100(%rcx),$xt3 # "$xc3" - movdqa 0x100-0x100(%rcx),$xd0 - movdqa 0x110-0x100(%rcx),$xd1 - movdqa 0x120-0x100(%rcx),$xd2 - movdqa 0x130-0x100(%rcx),$xd3 - paddd .Lfour(%rip),$xd0 # next SIMD counters - -.Loop_enter4x: - movdqa $xt2,0x20(%rsp) # SIMD equivalent of "@x[10]" - movdqa $xt3,0x30(%rsp) # SIMD equivalent of "@x[11]" - movdqa (%r10),$xt3 # .Lrot16(%rip) - mov \$10,%eax - movdqa $xd0,0x100-0x100(%rcx) # save SIMD counters - jmp .Loop4x - -.align 32 -.Loop4x: -___ - foreach (&SSSE3_lane_ROUND(0, 4, 8,12)) { eval; } - foreach (&SSSE3_lane_ROUND(0, 5,10,15)) { eval; } -$code.=<<___; - dec %eax - jnz .Loop4x - - paddd 0x40(%rsp),$xa0 # accumulate key material - paddd 0x50(%rsp),$xa1 - paddd 0x60(%rsp),$xa2 - paddd 0x70(%rsp),$xa3 - - movdqa $xa0,$xt2 # "de-interlace" data - punpckldq $xa1,$xa0 - movdqa $xa2,$xt3 - punpckldq $xa3,$xa2 - punpckhdq $xa1,$xt2 - punpckhdq $xa3,$xt3 - movdqa $xa0,$xa1 - punpcklqdq $xa2,$xa0 # "a0" - movdqa $xt2,$xa3 - punpcklqdq $xt3,$xt2 # "a2" - punpckhqdq $xa2,$xa1 # "a1" - punpckhqdq $xt3,$xa3 # "a3" -___ - ($xa2,$xt2)=($xt2,$xa2); -$code.=<<___; - paddd 0x80-0x100(%rcx),$xb0 - paddd 0x90-0x100(%rcx),$xb1 - paddd 0xa0-0x100(%rcx),$xb2 - paddd 0xb0-0x100(%rcx),$xb3 - - movdqa $xa0,0x00(%rsp) # offload $xaN - movdqa $xa1,0x10(%rsp) - movdqa 0x20(%rsp),$xa0 # "xc2" - movdqa 0x30(%rsp),$xa1 # "xc3" - - movdqa $xb0,$xt2 - punpckldq $xb1,$xb0 - movdqa $xb2,$xt3 - punpckldq $xb3,$xb2 - punpckhdq $xb1,$xt2 - punpckhdq $xb3,$xt3 - movdqa $xb0,$xb1 - punpcklqdq $xb2,$xb0 # "b0" - movdqa $xt2,$xb3 - punpcklqdq $xt3,$xt2 # "b2" - punpckhqdq $xb2,$xb1 # "b1" - punpckhqdq $xt3,$xb3 # "b3" -___ - ($xb2,$xt2)=($xt2,$xb2); - my ($xc0,$xc1,$xc2,$xc3)=($xt0,$xt1,$xa0,$xa1); -$code.=<<___; - paddd 0xc0-0x100(%rcx),$xc0 - paddd 0xd0-0x100(%rcx),$xc1 - paddd 0xe0-0x100(%rcx),$xc2 - paddd 0xf0-0x100(%rcx),$xc3 - - movdqa $xa2,0x20(%rsp) # keep offloading $xaN - movdqa $xa3,0x30(%rsp) - - movdqa $xc0,$xt2 - punpckldq $xc1,$xc0 - movdqa $xc2,$xt3 - punpckldq $xc3,$xc2 - punpckhdq $xc1,$xt2 - punpckhdq $xc3,$xt3 - movdqa $xc0,$xc1 - punpcklqdq $xc2,$xc0 # "c0" - movdqa $xt2,$xc3 - punpcklqdq $xt3,$xt2 # "c2" - punpckhqdq $xc2,$xc1 # "c1" - punpckhqdq $xt3,$xc3 # "c3" -___ - ($xc2,$xt2)=($xt2,$xc2); - ($xt0,$xt1)=($xa2,$xa3); # use $xaN as temporary -$code.=<<___; - paddd 0x100-0x100(%rcx),$xd0 - paddd 0x110-0x100(%rcx),$xd1 - paddd 0x120-0x100(%rcx),$xd2 - paddd 0x130-0x100(%rcx),$xd3 - - movdqa $xd0,$xt2 - punpckldq $xd1,$xd0 - movdqa $xd2,$xt3 - punpckldq $xd3,$xd2 - punpckhdq $xd1,$xt2 - punpckhdq $xd3,$xt3 - movdqa $xd0,$xd1 - punpcklqdq $xd2,$xd0 # "d0" - movdqa $xt2,$xd3 - punpcklqdq $xt3,$xt2 # "d2" - punpckhqdq $xd2,$xd1 # "d1" - punpckhqdq $xt3,$xd3 # "d3" -___ - ($xd2,$xt2)=($xt2,$xd2); -$code.=<<___; - cmp \$64*4,$len - jb .Ltail4x - - movdqu 0x00($inp),$xt0 # xor with input - movdqu 0x10($inp),$xt1 - movdqu 0x20($inp),$xt2 - movdqu 0x30($inp),$xt3 - pxor 0x00(%rsp),$xt0 # $xaN is offloaded, remember? - pxor $xb0,$xt1 - pxor $xc0,$xt2 - pxor $xd0,$xt3 - - movdqu $xt0,0x00($out) - movdqu 0x40($inp),$xt0 - movdqu $xt1,0x10($out) - movdqu 0x50($inp),$xt1 - movdqu $xt2,0x20($out) - movdqu 0x60($inp),$xt2 - movdqu $xt3,0x30($out) - movdqu 0x70($inp),$xt3 - lea 0x80($inp),$inp # size optimization - pxor 0x10(%rsp),$xt0 - pxor $xb1,$xt1 - pxor $xc1,$xt2 - pxor $xd1,$xt3 - - movdqu $xt0,0x40($out) - movdqu 0x00($inp),$xt0 - movdqu $xt1,0x50($out) - movdqu 0x10($inp),$xt1 - movdqu $xt2,0x60($out) - movdqu 0x20($inp),$xt2 - movdqu $xt3,0x70($out) - lea 0x80($out),$out # size optimization - movdqu 0x30($inp),$xt3 - pxor 0x20(%rsp),$xt0 - pxor $xb2,$xt1 - pxor $xc2,$xt2 - pxor $xd2,$xt3 - - movdqu $xt0,0x00($out) - movdqu 0x40($inp),$xt0 - movdqu $xt1,0x10($out) - movdqu 0x50($inp),$xt1 - movdqu $xt2,0x20($out) - movdqu 0x60($inp),$xt2 - movdqu $xt3,0x30($out) - movdqu 0x70($inp),$xt3 - lea 0x80($inp),$inp # inp+=64*4 - pxor 0x30(%rsp),$xt0 - pxor $xb3,$xt1 - pxor $xc3,$xt2 - pxor $xd3,$xt3 - movdqu $xt0,0x40($out) - movdqu $xt1,0x50($out) - movdqu $xt2,0x60($out) - movdqu $xt3,0x70($out) - lea 0x80($out),$out # out+=64*4 - - sub \$64*4,$len - jnz .Loop_outer4x - - jmp .Ldone4x - -.Ltail4x: - cmp \$192,$len - jae .L192_or_more4x - cmp \$128,$len - jae .L128_or_more4x - cmp \$64,$len - jae .L64_or_more4x - - #movdqa 0x00(%rsp),$xt0 # $xaN is offloaded, remember? - xor %r10,%r10 - #movdqa $xt0,0x00(%rsp) - movdqa $xb0,0x10(%rsp) - movdqa $xc0,0x20(%rsp) - movdqa $xd0,0x30(%rsp) - jmp .Loop_tail4x - -.align 32 -.L64_or_more4x: - movdqu 0x00($inp),$xt0 # xor with input - movdqu 0x10($inp),$xt1 - movdqu 0x20($inp),$xt2 - movdqu 0x30($inp),$xt3 - pxor 0x00(%rsp),$xt0 # $xaxN is offloaded, remember? - pxor $xb0,$xt1 - pxor $xc0,$xt2 - pxor $xd0,$xt3 - movdqu $xt0,0x00($out) - movdqu $xt1,0x10($out) - movdqu $xt2,0x20($out) - movdqu $xt3,0x30($out) - je .Ldone4x - - movdqa 0x10(%rsp),$xt0 # $xaN is offloaded, remember? - lea 0x40($inp),$inp # inp+=64*1 - xor %r10,%r10 - movdqa $xt0,0x00(%rsp) - movdqa $xb1,0x10(%rsp) - lea 0x40($out),$out # out+=64*1 - movdqa $xc1,0x20(%rsp) - sub \$64,$len # len-=64*1 - movdqa $xd1,0x30(%rsp) - jmp .Loop_tail4x - -.align 32 -.L128_or_more4x: - movdqu 0x00($inp),$xt0 # xor with input - movdqu 0x10($inp),$xt1 - movdqu 0x20($inp),$xt2 - movdqu 0x30($inp),$xt3 - pxor 0x00(%rsp),$xt0 # $xaN is offloaded, remember? - pxor $xb0,$xt1 - pxor $xc0,$xt2 - pxor $xd0,$xt3 - - movdqu $xt0,0x00($out) - movdqu 0x40($inp),$xt0 - movdqu $xt1,0x10($out) - movdqu 0x50($inp),$xt1 - movdqu $xt2,0x20($out) - movdqu 0x60($inp),$xt2 - movdqu $xt3,0x30($out) - movdqu 0x70($inp),$xt3 - pxor 0x10(%rsp),$xt0 - pxor $xb1,$xt1 - pxor $xc1,$xt2 - pxor $xd1,$xt3 - movdqu $xt0,0x40($out) - movdqu $xt1,0x50($out) - movdqu $xt2,0x60($out) - movdqu $xt3,0x70($out) - je .Ldone4x - - movdqa 0x20(%rsp),$xt0 # $xaN is offloaded, remember? - lea 0x80($inp),$inp # inp+=64*2 - xor %r10,%r10 - movdqa $xt0,0x00(%rsp) - movdqa $xb2,0x10(%rsp) - lea 0x80($out),$out # out+=64*2 - movdqa $xc2,0x20(%rsp) - sub \$128,$len # len-=64*2 - movdqa $xd2,0x30(%rsp) - jmp .Loop_tail4x - -.align 32 -.L192_or_more4x: - movdqu 0x00($inp),$xt0 # xor with input - movdqu 0x10($inp),$xt1 - movdqu 0x20($inp),$xt2 - movdqu 0x30($inp),$xt3 - pxor 0x00(%rsp),$xt0 # $xaN is offloaded, remember? - pxor $xb0,$xt1 - pxor $xc0,$xt2 - pxor $xd0,$xt3 - - movdqu $xt0,0x00($out) - movdqu 0x40($inp),$xt0 - movdqu $xt1,0x10($out) - movdqu 0x50($inp),$xt1 - movdqu $xt2,0x20($out) - movdqu 0x60($inp),$xt2 - movdqu $xt3,0x30($out) - movdqu 0x70($inp),$xt3 - lea 0x80($inp),$inp # size optimization - pxor 0x10(%rsp),$xt0 - pxor $xb1,$xt1 - pxor $xc1,$xt2 - pxor $xd1,$xt3 - - movdqu $xt0,0x40($out) - movdqu 0x00($inp),$xt0 - movdqu $xt1,0x50($out) - movdqu 0x10($inp),$xt1 - movdqu $xt2,0x60($out) - movdqu 0x20($inp),$xt2 - movdqu $xt3,0x70($out) - lea 0x80($out),$out # size optimization - movdqu 0x30($inp),$xt3 - pxor 0x20(%rsp),$xt0 - pxor $xb2,$xt1 - pxor $xc2,$xt2 - pxor $xd2,$xt3 - movdqu $xt0,0x00($out) - movdqu $xt1,0x10($out) - movdqu $xt2,0x20($out) - movdqu $xt3,0x30($out) - je .Ldone4x - - movdqa 0x30(%rsp),$xt0 # $xaN is offloaded, remember? - lea 0x40($inp),$inp # inp+=64*3 - xor %r10,%r10 - movdqa $xt0,0x00(%rsp) - movdqa $xb3,0x10(%rsp) - lea 0x40($out),$out # out+=64*3 - movdqa $xc3,0x20(%rsp) - sub \$192,$len # len-=64*3 - movdqa $xd3,0x30(%rsp) - -.Loop_tail4x: - movzb ($inp,%r10),%eax - movzb (%rsp,%r10),%ecx - lea 1(%r10),%r10 - xor %ecx,%eax - mov %al,-1($out,%r10) - dec $len - jnz .Loop_tail4x - -.Ldone4x: -___ -$code.=<<___ if ($win64); - movaps -0xa8(%r9),%xmm6 - movaps -0x98(%r9),%xmm7 - movaps -0x88(%r9),%xmm8 - movaps -0x78(%r9),%xmm9 - movaps -0x68(%r9),%xmm10 - movaps -0x58(%r9),%xmm11 - movaps -0x48(%r9),%xmm12 - movaps -0x38(%r9),%xmm13 - movaps -0x28(%r9),%xmm14 - movaps -0x18(%r9),%xmm15 -___ -$code.=<<___; - lea (%r9),%rsp -.cfi_def_cfa_register rsp -.L4x_epilogue: - ret -.cfi_endproc -.size ChaCha20_4x,.-ChaCha20_4x -___ -} - -######################################################################## -# AVX2 code path -if ($avx>1) { -my ($xb0,$xb1,$xb2,$xb3, $xd0,$xd1,$xd2,$xd3, - $xa0,$xa1,$xa2,$xa3, $xt0,$xt1,$xt2,$xt3)=map("%ymm$_",(0..15)); -my @xx=($xa0,$xa1,$xa2,$xa3, $xb0,$xb1,$xb2,$xb3, - "%nox","%nox","%nox","%nox", $xd0,$xd1,$xd2,$xd3); - -sub AVX2_lane_ROUND { -my ($a0,$b0,$c0,$d0)=@_; -my ($a1,$b1,$c1,$d1)=map(($_&~3)+(($_+1)&3),($a0,$b0,$c0,$d0)); -my ($a2,$b2,$c2,$d2)=map(($_&~3)+(($_+1)&3),($a1,$b1,$c1,$d1)); -my ($a3,$b3,$c3,$d3)=map(($_&~3)+(($_+1)&3),($a2,$b2,$c2,$d2)); -my ($xc,$xc_,$t0,$t1)=map("\"$_\"",$xt0,$xt1,$xt2,$xt3); -my @x=map("\"$_\"",@xx); - - # Consider order in which variables are addressed by their - # index: - # - # a b c d - # - # 0 4 8 12 < even round - # 1 5 9 13 - # 2 6 10 14 - # 3 7 11 15 - # 0 5 10 15 < odd round - # 1 6 11 12 - # 2 7 8 13 - # 3 4 9 14 - # - # 'a', 'b' and 'd's are permanently allocated in registers, - # @x[0..7,12..15], while 'c's are maintained in memory. If - # you observe 'c' column, you'll notice that pair of 'c's is - # invariant between rounds. This means that we have to reload - # them once per round, in the middle. This is why you'll see - # bunch of 'c' stores and loads in the middle, but none in - # the beginning or end. - - ( - "&vpaddd (@x[$a0],@x[$a0],@x[$b0])", # Q1 - "&vpxor (@x[$d0],@x[$a0],@x[$d0])", - "&vpshufb (@x[$d0],@x[$d0],$t1)", - "&vpaddd (@x[$a1],@x[$a1],@x[$b1])", # Q2 - "&vpxor (@x[$d1],@x[$a1],@x[$d1])", - "&vpshufb (@x[$d1],@x[$d1],$t1)", - - "&vpaddd ($xc,$xc,@x[$d0])", - "&vpxor (@x[$b0],$xc,@x[$b0])", - "&vpslld ($t0,@x[$b0],12)", - "&vpsrld (@x[$b0],@x[$b0],20)", - "&vpor (@x[$b0],$t0,@x[$b0])", - "&vbroadcasti128($t0,'(%r11)')", # .Lrot24(%rip) - "&vpaddd ($xc_,$xc_,@x[$d1])", - "&vpxor (@x[$b1],$xc_,@x[$b1])", - "&vpslld ($t1,@x[$b1],12)", - "&vpsrld (@x[$b1],@x[$b1],20)", - "&vpor (@x[$b1],$t1,@x[$b1])", - - "&vpaddd (@x[$a0],@x[$a0],@x[$b0])", - "&vpxor (@x[$d0],@x[$a0],@x[$d0])", - "&vpshufb (@x[$d0],@x[$d0],$t0)", - "&vpaddd (@x[$a1],@x[$a1],@x[$b1])", - "&vpxor (@x[$d1],@x[$a1],@x[$d1])", - "&vpshufb (@x[$d1],@x[$d1],$t0)", - - "&vpaddd ($xc,$xc,@x[$d0])", - "&vpxor (@x[$b0],$xc,@x[$b0])", - "&vpslld ($t1,@x[$b0],7)", - "&vpsrld (@x[$b0],@x[$b0],25)", - "&vpor (@x[$b0],$t1,@x[$b0])", - "&vbroadcasti128($t1,'(%r10)')", # .Lrot16(%rip) - "&vpaddd ($xc_,$xc_,@x[$d1])", - "&vpxor (@x[$b1],$xc_,@x[$b1])", - "&vpslld ($t0,@x[$b1],7)", - "&vpsrld (@x[$b1],@x[$b1],25)", - "&vpor (@x[$b1],$t0,@x[$b1])", - - "&vmovdqa (\"`32*($c0-8)`(%rsp)\",$xc)", # reload pair of 'c's - "&vmovdqa (\"`32*($c1-8)`(%rsp)\",$xc_)", - "&vmovdqa ($xc,\"`32*($c2-8)`(%rsp)\")", - "&vmovdqa ($xc_,\"`32*($c3-8)`(%rsp)\")", - - "&vpaddd (@x[$a2],@x[$a2],@x[$b2])", # Q3 - "&vpxor (@x[$d2],@x[$a2],@x[$d2])", - "&vpshufb (@x[$d2],@x[$d2],$t1)", - "&vpaddd (@x[$a3],@x[$a3],@x[$b3])", # Q4 - "&vpxor (@x[$d3],@x[$a3],@x[$d3])", - "&vpshufb (@x[$d3],@x[$d3],$t1)", - - "&vpaddd ($xc,$xc,@x[$d2])", - "&vpxor (@x[$b2],$xc,@x[$b2])", - "&vpslld ($t0,@x[$b2],12)", - "&vpsrld (@x[$b2],@x[$b2],20)", - "&vpor (@x[$b2],$t0,@x[$b2])", - "&vbroadcasti128($t0,'(%r11)')", # .Lrot24(%rip) - "&vpaddd ($xc_,$xc_,@x[$d3])", - "&vpxor (@x[$b3],$xc_,@x[$b3])", - "&vpslld ($t1,@x[$b3],12)", - "&vpsrld (@x[$b3],@x[$b3],20)", - "&vpor (@x[$b3],$t1,@x[$b3])", - - "&vpaddd (@x[$a2],@x[$a2],@x[$b2])", - "&vpxor (@x[$d2],@x[$a2],@x[$d2])", - "&vpshufb (@x[$d2],@x[$d2],$t0)", - "&vpaddd (@x[$a3],@x[$a3],@x[$b3])", - "&vpxor (@x[$d3],@x[$a3],@x[$d3])", - "&vpshufb (@x[$d3],@x[$d3],$t0)", - - "&vpaddd ($xc,$xc,@x[$d2])", - "&vpxor (@x[$b2],$xc,@x[$b2])", - "&vpslld ($t1,@x[$b2],7)", - "&vpsrld (@x[$b2],@x[$b2],25)", - "&vpor (@x[$b2],$t1,@x[$b2])", - "&vbroadcasti128($t1,'(%r10)')", # .Lrot16(%rip) - "&vpaddd ($xc_,$xc_,@x[$d3])", - "&vpxor (@x[$b3],$xc_,@x[$b3])", - "&vpslld ($t0,@x[$b3],7)", - "&vpsrld (@x[$b3],@x[$b3],25)", - "&vpor (@x[$b3],$t0,@x[$b3])" - ); -} - -my $xframe = $win64 ? 0xa8 : 8; - -$code.=<<___; -.type ChaCha20_8x,\@function,5 -.align 32 -ChaCha20_8x: -.LChaCha20_8x: -.cfi_startproc - mov %rsp,%r9 # frame register -.cfi_def_cfa_register r9 - sub \$0x280+$xframe,%rsp - and \$-32,%rsp -___ -$code.=<<___ if ($win64); - movaps %xmm6,-0xa8(%r9) - movaps %xmm7,-0x98(%r9) - movaps %xmm8,-0x88(%r9) - movaps %xmm9,-0x78(%r9) - movaps %xmm10,-0x68(%r9) - movaps %xmm11,-0x58(%r9) - movaps %xmm12,-0x48(%r9) - movaps %xmm13,-0x38(%r9) - movaps %xmm14,-0x28(%r9) - movaps %xmm15,-0x18(%r9) -.L8x_body: -___ -$code.=<<___; - vzeroupper - - ################ stack layout - # +0x00 SIMD equivalent of @x[8-12] - # ... - # +0x80 constant copy of key[0-2] smashed by lanes - # ... - # +0x200 SIMD counters (with nonce smashed by lanes) - # ... - # +0x280 - - vbroadcasti128 .Lsigma(%rip),$xa3 # key[0] - vbroadcasti128 ($key),$xb3 # key[1] - vbroadcasti128 16($key),$xt3 # key[2] - vbroadcasti128 ($counter),$xd3 # key[3] - lea 0x100(%rsp),%rcx # size optimization - lea 0x200(%rsp),%rax # size optimization - lea .Lrot16(%rip),%r10 - lea .Lrot24(%rip),%r11 - - vpshufd \$0x00,$xa3,$xa0 # smash key by lanes... - vpshufd \$0x55,$xa3,$xa1 - vmovdqa $xa0,0x80-0x100(%rcx) # ... and offload - vpshufd \$0xaa,$xa3,$xa2 - vmovdqa $xa1,0xa0-0x100(%rcx) - vpshufd \$0xff,$xa3,$xa3 - vmovdqa $xa2,0xc0-0x100(%rcx) - vmovdqa $xa3,0xe0-0x100(%rcx) - - vpshufd \$0x00,$xb3,$xb0 - vpshufd \$0x55,$xb3,$xb1 - vmovdqa $xb0,0x100-0x100(%rcx) - vpshufd \$0xaa,$xb3,$xb2 - vmovdqa $xb1,0x120-0x100(%rcx) - vpshufd \$0xff,$xb3,$xb3 - vmovdqa $xb2,0x140-0x100(%rcx) - vmovdqa $xb3,0x160-0x100(%rcx) - - vpshufd \$0x00,$xt3,$xt0 # "xc0" - vpshufd \$0x55,$xt3,$xt1 # "xc1" - vmovdqa $xt0,0x180-0x200(%rax) - vpshufd \$0xaa,$xt3,$xt2 # "xc2" - vmovdqa $xt1,0x1a0-0x200(%rax) - vpshufd \$0xff,$xt3,$xt3 # "xc3" - vmovdqa $xt2,0x1c0-0x200(%rax) - vmovdqa $xt3,0x1e0-0x200(%rax) - - vpshufd \$0x00,$xd3,$xd0 - vpshufd \$0x55,$xd3,$xd1 - vpaddd .Lincy(%rip),$xd0,$xd0 # don't save counters yet - vpshufd \$0xaa,$xd3,$xd2 - vmovdqa $xd1,0x220-0x200(%rax) - vpshufd \$0xff,$xd3,$xd3 - vmovdqa $xd2,0x240-0x200(%rax) - vmovdqa $xd3,0x260-0x200(%rax) - - jmp .Loop_enter8x - -.align 32 -.Loop_outer8x: - vmovdqa 0x80-0x100(%rcx),$xa0 # re-load smashed key - vmovdqa 0xa0-0x100(%rcx),$xa1 - vmovdqa 0xc0-0x100(%rcx),$xa2 - vmovdqa 0xe0-0x100(%rcx),$xa3 - vmovdqa 0x100-0x100(%rcx),$xb0 - vmovdqa 0x120-0x100(%rcx),$xb1 - vmovdqa 0x140-0x100(%rcx),$xb2 - vmovdqa 0x160-0x100(%rcx),$xb3 - vmovdqa 0x180-0x200(%rax),$xt0 # "xc0" - vmovdqa 0x1a0-0x200(%rax),$xt1 # "xc1" - vmovdqa 0x1c0-0x200(%rax),$xt2 # "xc2" - vmovdqa 0x1e0-0x200(%rax),$xt3 # "xc3" - vmovdqa 0x200-0x200(%rax),$xd0 - vmovdqa 0x220-0x200(%rax),$xd1 - vmovdqa 0x240-0x200(%rax),$xd2 - vmovdqa 0x260-0x200(%rax),$xd3 - vpaddd .Leight(%rip),$xd0,$xd0 # next SIMD counters - -.Loop_enter8x: - vmovdqa $xt2,0x40(%rsp) # SIMD equivalent of "@x[10]" - vmovdqa $xt3,0x60(%rsp) # SIMD equivalent of "@x[11]" - vbroadcasti128 (%r10),$xt3 - vmovdqa $xd0,0x200-0x200(%rax) # save SIMD counters - mov \$10,%eax - jmp .Loop8x - -.align 32 -.Loop8x: -___ - foreach (&AVX2_lane_ROUND(0, 4, 8,12)) { eval; } - foreach (&AVX2_lane_ROUND(0, 5,10,15)) { eval; } -$code.=<<___; - dec %eax - jnz .Loop8x - - lea 0x200(%rsp),%rax # size optimization - vpaddd 0x80-0x100(%rcx),$xa0,$xa0 # accumulate key - vpaddd 0xa0-0x100(%rcx),$xa1,$xa1 - vpaddd 0xc0-0x100(%rcx),$xa2,$xa2 - vpaddd 0xe0-0x100(%rcx),$xa3,$xa3 - - vpunpckldq $xa1,$xa0,$xt2 # "de-interlace" data - vpunpckldq $xa3,$xa2,$xt3 - vpunpckhdq $xa1,$xa0,$xa0 - vpunpckhdq $xa3,$xa2,$xa2 - vpunpcklqdq $xt3,$xt2,$xa1 # "a0" - vpunpckhqdq $xt3,$xt2,$xt2 # "a1" - vpunpcklqdq $xa2,$xa0,$xa3 # "a2" - vpunpckhqdq $xa2,$xa0,$xa0 # "a3" -___ - ($xa0,$xa1,$xa2,$xa3,$xt2)=($xa1,$xt2,$xa3,$xa0,$xa2); -$code.=<<___; - vpaddd 0x100-0x100(%rcx),$xb0,$xb0 - vpaddd 0x120-0x100(%rcx),$xb1,$xb1 - vpaddd 0x140-0x100(%rcx),$xb2,$xb2 - vpaddd 0x160-0x100(%rcx),$xb3,$xb3 - - vpunpckldq $xb1,$xb0,$xt2 - vpunpckldq $xb3,$xb2,$xt3 - vpunpckhdq $xb1,$xb0,$xb0 - vpunpckhdq $xb3,$xb2,$xb2 - vpunpcklqdq $xt3,$xt2,$xb1 # "b0" - vpunpckhqdq $xt3,$xt2,$xt2 # "b1" - vpunpcklqdq $xb2,$xb0,$xb3 # "b2" - vpunpckhqdq $xb2,$xb0,$xb0 # "b3" -___ - ($xb0,$xb1,$xb2,$xb3,$xt2)=($xb1,$xt2,$xb3,$xb0,$xb2); -$code.=<<___; - vperm2i128 \$0x20,$xb0,$xa0,$xt3 # "de-interlace" further - vperm2i128 \$0x31,$xb0,$xa0,$xb0 - vperm2i128 \$0x20,$xb1,$xa1,$xa0 - vperm2i128 \$0x31,$xb1,$xa1,$xb1 - vperm2i128 \$0x20,$xb2,$xa2,$xa1 - vperm2i128 \$0x31,$xb2,$xa2,$xb2 - vperm2i128 \$0x20,$xb3,$xa3,$xa2 - vperm2i128 \$0x31,$xb3,$xa3,$xb3 -___ - ($xa0,$xa1,$xa2,$xa3,$xt3)=($xt3,$xa0,$xa1,$xa2,$xa3); - my ($xc0,$xc1,$xc2,$xc3)=($xt0,$xt1,$xa0,$xa1); -$code.=<<___; - vmovdqa $xa0,0x00(%rsp) # offload $xaN - vmovdqa $xa1,0x20(%rsp) - vmovdqa 0x40(%rsp),$xc2 # $xa0 - vmovdqa 0x60(%rsp),$xc3 # $xa1 - - vpaddd 0x180-0x200(%rax),$xc0,$xc0 - vpaddd 0x1a0-0x200(%rax),$xc1,$xc1 - vpaddd 0x1c0-0x200(%rax),$xc2,$xc2 - vpaddd 0x1e0-0x200(%rax),$xc3,$xc3 - - vpunpckldq $xc1,$xc0,$xt2 - vpunpckldq $xc3,$xc2,$xt3 - vpunpckhdq $xc1,$xc0,$xc0 - vpunpckhdq $xc3,$xc2,$xc2 - vpunpcklqdq $xt3,$xt2,$xc1 # "c0" - vpunpckhqdq $xt3,$xt2,$xt2 # "c1" - vpunpcklqdq $xc2,$xc0,$xc3 # "c2" - vpunpckhqdq $xc2,$xc0,$xc0 # "c3" -___ - ($xc0,$xc1,$xc2,$xc3,$xt2)=($xc1,$xt2,$xc3,$xc0,$xc2); -$code.=<<___; - vpaddd 0x200-0x200(%rax),$xd0,$xd0 - vpaddd 0x220-0x200(%rax),$xd1,$xd1 - vpaddd 0x240-0x200(%rax),$xd2,$xd2 - vpaddd 0x260-0x200(%rax),$xd3,$xd3 - - vpunpckldq $xd1,$xd0,$xt2 - vpunpckldq $xd3,$xd2,$xt3 - vpunpckhdq $xd1,$xd0,$xd0 - vpunpckhdq $xd3,$xd2,$xd2 - vpunpcklqdq $xt3,$xt2,$xd1 # "d0" - vpunpckhqdq $xt3,$xt2,$xt2 # "d1" - vpunpcklqdq $xd2,$xd0,$xd3 # "d2" - vpunpckhqdq $xd2,$xd0,$xd0 # "d3" -___ - ($xd0,$xd1,$xd2,$xd3,$xt2)=($xd1,$xt2,$xd3,$xd0,$xd2); -$code.=<<___; - vperm2i128 \$0x20,$xd0,$xc0,$xt3 # "de-interlace" further - vperm2i128 \$0x31,$xd0,$xc0,$xd0 - vperm2i128 \$0x20,$xd1,$xc1,$xc0 - vperm2i128 \$0x31,$xd1,$xc1,$xd1 - vperm2i128 \$0x20,$xd2,$xc2,$xc1 - vperm2i128 \$0x31,$xd2,$xc2,$xd2 - vperm2i128 \$0x20,$xd3,$xc3,$xc2 - vperm2i128 \$0x31,$xd3,$xc3,$xd3 -___ - ($xc0,$xc1,$xc2,$xc3,$xt3)=($xt3,$xc0,$xc1,$xc2,$xc3); - ($xb0,$xb1,$xb2,$xb3,$xc0,$xc1,$xc2,$xc3)= - ($xc0,$xc1,$xc2,$xc3,$xb0,$xb1,$xb2,$xb3); - ($xa0,$xa1)=($xt2,$xt3); -$code.=<<___; - vmovdqa 0x00(%rsp),$xa0 # $xaN was offloaded, remember? - vmovdqa 0x20(%rsp),$xa1 - - cmp \$64*8,$len - jb .Ltail8x - - vpxor 0x00($inp),$xa0,$xa0 # xor with input - vpxor 0x20($inp),$xb0,$xb0 - vpxor 0x40($inp),$xc0,$xc0 - vpxor 0x60($inp),$xd0,$xd0 - lea 0x80($inp),$inp # size optimization - vmovdqu $xa0,0x00($out) - vmovdqu $xb0,0x20($out) - vmovdqu $xc0,0x40($out) - vmovdqu $xd0,0x60($out) - lea 0x80($out),$out # size optimization - - vpxor 0x00($inp),$xa1,$xa1 - vpxor 0x20($inp),$xb1,$xb1 - vpxor 0x40($inp),$xc1,$xc1 - vpxor 0x60($inp),$xd1,$xd1 - lea 0x80($inp),$inp # size optimization - vmovdqu $xa1,0x00($out) - vmovdqu $xb1,0x20($out) - vmovdqu $xc1,0x40($out) - vmovdqu $xd1,0x60($out) - lea 0x80($out),$out # size optimization - - vpxor 0x00($inp),$xa2,$xa2 - vpxor 0x20($inp),$xb2,$xb2 - vpxor 0x40($inp),$xc2,$xc2 - vpxor 0x60($inp),$xd2,$xd2 - lea 0x80($inp),$inp # size optimization - vmovdqu $xa2,0x00($out) - vmovdqu $xb2,0x20($out) - vmovdqu $xc2,0x40($out) - vmovdqu $xd2,0x60($out) - lea 0x80($out),$out # size optimization - - vpxor 0x00($inp),$xa3,$xa3 - vpxor 0x20($inp),$xb3,$xb3 - vpxor 0x40($inp),$xc3,$xc3 - vpxor 0x60($inp),$xd3,$xd3 - lea 0x80($inp),$inp # size optimization - vmovdqu $xa3,0x00($out) - vmovdqu $xb3,0x20($out) - vmovdqu $xc3,0x40($out) - vmovdqu $xd3,0x60($out) - lea 0x80($out),$out # size optimization - - sub \$64*8,$len - jnz .Loop_outer8x - - jmp .Ldone8x - -.Ltail8x: - cmp \$448,$len - jae .L448_or_more8x - cmp \$384,$len - jae .L384_or_more8x - cmp \$320,$len - jae .L320_or_more8x - cmp \$256,$len - jae .L256_or_more8x - cmp \$192,$len - jae .L192_or_more8x - cmp \$128,$len - jae .L128_or_more8x - cmp \$64,$len - jae .L64_or_more8x - - xor %r10,%r10 - vmovdqa $xa0,0x00(%rsp) - vmovdqa $xb0,0x20(%rsp) - jmp .Loop_tail8x - -.align 32 -.L64_or_more8x: - vpxor 0x00($inp),$xa0,$xa0 # xor with input - vpxor 0x20($inp),$xb0,$xb0 - vmovdqu $xa0,0x00($out) - vmovdqu $xb0,0x20($out) - je .Ldone8x - - lea 0x40($inp),$inp # inp+=64*1 - xor %r10,%r10 - vmovdqa $xc0,0x00(%rsp) - lea 0x40($out),$out # out+=64*1 - sub \$64,$len # len-=64*1 - vmovdqa $xd0,0x20(%rsp) - jmp .Loop_tail8x - -.align 32 -.L128_or_more8x: - vpxor 0x00($inp),$xa0,$xa0 # xor with input - vpxor 0x20($inp),$xb0,$xb0 - vpxor 0x40($inp),$xc0,$xc0 - vpxor 0x60($inp),$xd0,$xd0 - vmovdqu $xa0,0x00($out) - vmovdqu $xb0,0x20($out) - vmovdqu $xc0,0x40($out) - vmovdqu $xd0,0x60($out) - je .Ldone8x - - lea 0x80($inp),$inp # inp+=64*2 - xor %r10,%r10 - vmovdqa $xa1,0x00(%rsp) - lea 0x80($out),$out # out+=64*2 - sub \$128,$len # len-=64*2 - vmovdqa $xb1,0x20(%rsp) - jmp .Loop_tail8x - -.align 32 -.L192_or_more8x: - vpxor 0x00($inp),$xa0,$xa0 # xor with input - vpxor 0x20($inp),$xb0,$xb0 - vpxor 0x40($inp),$xc0,$xc0 - vpxor 0x60($inp),$xd0,$xd0 - vpxor 0x80($inp),$xa1,$xa1 - vpxor 0xa0($inp),$xb1,$xb1 - vmovdqu $xa0,0x00($out) - vmovdqu $xb0,0x20($out) - vmovdqu $xc0,0x40($out) - vmovdqu $xd0,0x60($out) - vmovdqu $xa1,0x80($out) - vmovdqu $xb1,0xa0($out) - je .Ldone8x - - lea 0xc0($inp),$inp # inp+=64*3 - xor %r10,%r10 - vmovdqa $xc1,0x00(%rsp) - lea 0xc0($out),$out # out+=64*3 - sub \$192,$len # len-=64*3 - vmovdqa $xd1,0x20(%rsp) - jmp .Loop_tail8x - -.align 32 -.L256_or_more8x: - vpxor 0x00($inp),$xa0,$xa0 # xor with input - vpxor 0x20($inp),$xb0,$xb0 - vpxor 0x40($inp),$xc0,$xc0 - vpxor 0x60($inp),$xd0,$xd0 - vpxor 0x80($inp),$xa1,$xa1 - vpxor 0xa0($inp),$xb1,$xb1 - vpxor 0xc0($inp),$xc1,$xc1 - vpxor 0xe0($inp),$xd1,$xd1 - vmovdqu $xa0,0x00($out) - vmovdqu $xb0,0x20($out) - vmovdqu $xc0,0x40($out) - vmovdqu $xd0,0x60($out) - vmovdqu $xa1,0x80($out) - vmovdqu $xb1,0xa0($out) - vmovdqu $xc1,0xc0($out) - vmovdqu $xd1,0xe0($out) - je .Ldone8x - - lea 0x100($inp),$inp # inp+=64*4 - xor %r10,%r10 - vmovdqa $xa2,0x00(%rsp) - lea 0x100($out),$out # out+=64*4 - sub \$256,$len # len-=64*4 - vmovdqa $xb2,0x20(%rsp) - jmp .Loop_tail8x - -.align 32 -.L320_or_more8x: - vpxor 0x00($inp),$xa0,$xa0 # xor with input - vpxor 0x20($inp),$xb0,$xb0 - vpxor 0x40($inp),$xc0,$xc0 - vpxor 0x60($inp),$xd0,$xd0 - vpxor 0x80($inp),$xa1,$xa1 - vpxor 0xa0($inp),$xb1,$xb1 - vpxor 0xc0($inp),$xc1,$xc1 - vpxor 0xe0($inp),$xd1,$xd1 - vpxor 0x100($inp),$xa2,$xa2 - vpxor 0x120($inp),$xb2,$xb2 - vmovdqu $xa0,0x00($out) - vmovdqu $xb0,0x20($out) - vmovdqu $xc0,0x40($out) - vmovdqu $xd0,0x60($out) - vmovdqu $xa1,0x80($out) - vmovdqu $xb1,0xa0($out) - vmovdqu $xc1,0xc0($out) - vmovdqu $xd1,0xe0($out) - vmovdqu $xa2,0x100($out) - vmovdqu $xb2,0x120($out) - je .Ldone8x - - lea 0x140($inp),$inp # inp+=64*5 - xor %r10,%r10 - vmovdqa $xc2,0x00(%rsp) - lea 0x140($out),$out # out+=64*5 - sub \$320,$len # len-=64*5 - vmovdqa $xd2,0x20(%rsp) - jmp .Loop_tail8x - -.align 32 -.L384_or_more8x: - vpxor 0x00($inp),$xa0,$xa0 # xor with input - vpxor 0x20($inp),$xb0,$xb0 - vpxor 0x40($inp),$xc0,$xc0 - vpxor 0x60($inp),$xd0,$xd0 - vpxor 0x80($inp),$xa1,$xa1 - vpxor 0xa0($inp),$xb1,$xb1 - vpxor 0xc0($inp),$xc1,$xc1 - vpxor 0xe0($inp),$xd1,$xd1 - vpxor 0x100($inp),$xa2,$xa2 - vpxor 0x120($inp),$xb2,$xb2 - vpxor 0x140($inp),$xc2,$xc2 - vpxor 0x160($inp),$xd2,$xd2 - vmovdqu $xa0,0x00($out) - vmovdqu $xb0,0x20($out) - vmovdqu $xc0,0x40($out) - vmovdqu $xd0,0x60($out) - vmovdqu $xa1,0x80($out) - vmovdqu $xb1,0xa0($out) - vmovdqu $xc1,0xc0($out) - vmovdqu $xd1,0xe0($out) - vmovdqu $xa2,0x100($out) - vmovdqu $xb2,0x120($out) - vmovdqu $xc2,0x140($out) - vmovdqu $xd2,0x160($out) - je .Ldone8x - - lea 0x180($inp),$inp # inp+=64*6 - xor %r10,%r10 - vmovdqa $xa3,0x00(%rsp) - lea 0x180($out),$out # out+=64*6 - sub \$384,$len # len-=64*6 - vmovdqa $xb3,0x20(%rsp) - jmp .Loop_tail8x - -.align 32 -.L448_or_more8x: - vpxor 0x00($inp),$xa0,$xa0 # xor with input - vpxor 0x20($inp),$xb0,$xb0 - vpxor 0x40($inp),$xc0,$xc0 - vpxor 0x60($inp),$xd0,$xd0 - vpxor 0x80($inp),$xa1,$xa1 - vpxor 0xa0($inp),$xb1,$xb1 - vpxor 0xc0($inp),$xc1,$xc1 - vpxor 0xe0($inp),$xd1,$xd1 - vpxor 0x100($inp),$xa2,$xa2 - vpxor 0x120($inp),$xb2,$xb2 - vpxor 0x140($inp),$xc2,$xc2 - vpxor 0x160($inp),$xd2,$xd2 - vpxor 0x180($inp),$xa3,$xa3 - vpxor 0x1a0($inp),$xb3,$xb3 - vmovdqu $xa0,0x00($out) - vmovdqu $xb0,0x20($out) - vmovdqu $xc0,0x40($out) - vmovdqu $xd0,0x60($out) - vmovdqu $xa1,0x80($out) - vmovdqu $xb1,0xa0($out) - vmovdqu $xc1,0xc0($out) - vmovdqu $xd1,0xe0($out) - vmovdqu $xa2,0x100($out) - vmovdqu $xb2,0x120($out) - vmovdqu $xc2,0x140($out) - vmovdqu $xd2,0x160($out) - vmovdqu $xa3,0x180($out) - vmovdqu $xb3,0x1a0($out) - je .Ldone8x - - lea 0x1c0($inp),$inp # inp+=64*7 - xor %r10,%r10 - vmovdqa $xc3,0x00(%rsp) - lea 0x1c0($out),$out # out+=64*7 - sub \$448,$len # len-=64*7 - vmovdqa $xd3,0x20(%rsp) - -.Loop_tail8x: - movzb ($inp,%r10),%eax - movzb (%rsp,%r10),%ecx - lea 1(%r10),%r10 - xor %ecx,%eax - mov %al,-1($out,%r10) - dec $len - jnz .Loop_tail8x - -.Ldone8x: - vzeroall -___ -$code.=<<___ if ($win64); - movaps -0xa8(%r9),%xmm6 - movaps -0x98(%r9),%xmm7 - movaps -0x88(%r9),%xmm8 - movaps -0x78(%r9),%xmm9 - movaps -0x68(%r9),%xmm10 - movaps -0x58(%r9),%xmm11 - movaps -0x48(%r9),%xmm12 - movaps -0x38(%r9),%xmm13 - movaps -0x28(%r9),%xmm14 - movaps -0x18(%r9),%xmm15 -___ -$code.=<<___; - lea (%r9),%rsp -.cfi_def_cfa_register rsp -.L8x_epilogue: - ret -.cfi_endproc -.size ChaCha20_8x,.-ChaCha20_8x -___ -} - -######################################################################## -# AVX512 code paths were removed - -# EXCEPTION_DISPOSITION handler (EXCEPTION_RECORD *rec,ULONG64 frame, -# CONTEXT *context,DISPATCHER_CONTEXT *disp) -if ($win64) { -$rec="%rcx"; -$frame="%rdx"; -$context="%r8"; -$disp="%r9"; - -$code.=<<___; -.extern __imp_RtlVirtualUnwind -.type se_handler,\@abi-omnipotent -.align 16 -se_handler: - push %rsi - push %rdi - push %rbx - push %rbp - push %r12 - push %r13 - push %r14 - push %r15 - pushfq - sub \$64,%rsp - - mov 120($context),%rax # pull context->Rax - mov 248($context),%rbx # pull context->Rip - - mov 8($disp),%rsi # disp->ImageBase - mov 56($disp),%r11 # disp->HandlerData - - lea .Lctr32_body(%rip),%r10 - cmp %r10,%rbx # context->Rip<.Lprologue - jb .Lcommon_seh_tail - - mov 152($context),%rax # pull context->Rsp - - lea .Lno_data(%rip),%r10 # epilogue label - cmp %r10,%rbx # context->Rip>=.Lepilogue - jae .Lcommon_seh_tail - - lea 64+24+48(%rax),%rax - - mov -8(%rax),%rbx - mov -16(%rax),%rbp - mov -24(%rax),%r12 - mov -32(%rax),%r13 - mov -40(%rax),%r14 - mov -48(%rax),%r15 - mov %rbx,144($context) # restore context->Rbx - mov %rbp,160($context) # restore context->Rbp - mov %r12,216($context) # restore context->R12 - mov %r13,224($context) # restore context->R13 - mov %r14,232($context) # restore context->R14 - mov %r15,240($context) # restore context->R14 - -.Lcommon_seh_tail: - mov 8(%rax),%rdi - mov 16(%rax),%rsi - mov %rax,152($context) # restore context->Rsp - mov %rsi,168($context) # restore context->Rsi - mov %rdi,176($context) # restore context->Rdi - - mov 40($disp),%rdi # disp->ContextRecord - mov $context,%rsi # context - mov \$154,%ecx # sizeof(CONTEXT) - .long 0xa548f3fc # cld; rep movsq - - mov $disp,%rsi - xor %rcx,%rcx # arg1, UNW_FLAG_NHANDLER - mov 8(%rsi),%rdx # arg2, disp->ImageBase - mov 0(%rsi),%r8 # arg3, disp->ControlPc - mov 16(%rsi),%r9 # arg4, disp->FunctionEntry - mov 40(%rsi),%r10 # disp->ContextRecord - lea 56(%rsi),%r11 # &disp->HandlerData - lea 24(%rsi),%r12 # &disp->EstablisherFrame - mov %r10,32(%rsp) # arg5 - mov %r11,40(%rsp) # arg6 - mov %r12,48(%rsp) # arg7 - mov %rcx,56(%rsp) # arg8, (NULL) - call *__imp_RtlVirtualUnwind(%rip) - - mov \$1,%eax # ExceptionContinueSearch - add \$64,%rsp - popfq - pop %r15 - pop %r14 - pop %r13 - pop %r12 - pop %rbp - pop %rbx - pop %rdi - pop %rsi - ret -.size se_handler,.-se_handler - -.type ssse3_handler,\@abi-omnipotent -.align 16 -ssse3_handler: - push %rsi - push %rdi - push %rbx - push %rbp - push %r12 - push %r13 - push %r14 - push %r15 - pushfq - sub \$64,%rsp - - mov 120($context),%rax # pull context->Rax - mov 248($context),%rbx # pull context->Rip - - mov 8($disp),%rsi # disp->ImageBase - mov 56($disp),%r11 # disp->HandlerData - - mov 0(%r11),%r10d # HandlerData[0] - lea (%rsi,%r10),%r10 # prologue label - cmp %r10,%rbx # context->RipR9 - - mov 4(%r11),%r10d # HandlerData[1] - lea (%rsi,%r10),%r10 # epilogue label - cmp %r10,%rbx # context->Rip>=epilogue label - jae .Lcommon_seh_tail - - lea -0x28(%rax),%rsi - lea 512($context),%rdi # &context.Xmm6 - mov \$4,%ecx - .long 0xa548f3fc # cld; rep movsq - - jmp .Lcommon_seh_tail -.size ssse3_handler,.-ssse3_handler - -.type full_handler,\@abi-omnipotent -.align 16 -full_handler: - push %rsi - push %rdi - push %rbx - push %rbp - push %r12 - push %r13 - push %r14 - push %r15 - pushfq - sub \$64,%rsp - - mov 120($context),%rax # pull context->Rax - mov 248($context),%rbx # pull context->Rip - - mov 8($disp),%rsi # disp->ImageBase - mov 56($disp),%r11 # disp->HandlerData - - mov 0(%r11),%r10d # HandlerData[0] - lea (%rsi,%r10),%r10 # prologue label - cmp %r10,%rbx # context->RipR9 - - mov 4(%r11),%r10d # HandlerData[1] - lea (%rsi,%r10),%r10 # epilogue label - cmp %r10,%rbx # context->Rip>=epilogue label - jae .Lcommon_seh_tail - - lea -0xa8(%rax),%rsi - lea 512($context),%rdi # &context.Xmm6 - mov \$20,%ecx - .long 0xa548f3fc # cld; rep movsq - - jmp .Lcommon_seh_tail -.size full_handler,.-full_handler - -.section .pdata -.align 4 - .rva .LSEH_begin_GFp_ChaCha20_ctr32 - .rva .LSEH_end_GFp_ChaCha20_ctr32 - .rva .LSEH_info_GFp_ChaCha20_ctr32 - - .rva .LSEH_begin_ChaCha20_ssse3 - .rva .LSEH_end_ChaCha20_ssse3 - .rva .LSEH_info_ChaCha20_ssse3 - - .rva .LSEH_begin_ChaCha20_4x - .rva .LSEH_end_ChaCha20_4x - .rva .LSEH_info_ChaCha20_4x -___ -$code.=<<___ if ($avx>1); - .rva .LSEH_begin_ChaCha20_8x - .rva .LSEH_end_ChaCha20_8x - .rva .LSEH_info_ChaCha20_8x -___ -$code.=<<___; -.section .xdata -.align 8 -.LSEH_info_GFp_ChaCha20_ctr32: - .byte 9,0,0,0 - .rva se_handler - -.LSEH_info_ChaCha20_ssse3: - .byte 9,0,0,0 - .rva ssse3_handler - .rva .Lssse3_body,.Lssse3_epilogue - -.LSEH_info_ChaCha20_4x: - .byte 9,0,0,0 - .rva full_handler - .rva .L4x_body,.L4x_epilogue -___ -$code.=<<___ if ($avx>1); -.LSEH_info_ChaCha20_8x: - .byte 9,0,0,0 - .rva full_handler - .rva .L8x_body,.L8x_epilogue # HandlerData[] -___ -} - -foreach (split("\n",$code)) { - s/\`([^\`]*)\`/eval $1/ge; - - s/%x#%[yz]/%x/g; # "down-shift" - - print $_,"\n"; -} - -close STDOUT or die "error closing STDOUT"; diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/crypto/chacha/asm/chacha-x86.pl temporalio-1.3.0/vendor/ring-0.16.20/crypto/chacha/asm/chacha-x86.pl --- temporalio-1.3.0/vendor/ring-0.16.20/crypto/chacha/asm/chacha-x86.pl 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/crypto/chacha/asm/chacha-x86.pl 1970-01-01 00:00:00.000000000 +0000 @@ -1,772 +0,0 @@ -#! /usr/bin/env perl -# Copyright 2016 The OpenSSL Project Authors. All Rights Reserved. -# -# Licensed under the OpenSSL license (the "License"). You may not use -# this file except in compliance with the License. You can obtain a copy -# in the file LICENSE in the source distribution or at -# https://www.openssl.org/source/license.html - -# -# ==================================================================== -# Written by Andy Polyakov for the OpenSSL -# project. The module is, however, dual licensed under OpenSSL and -# CRYPTOGAMS licenses depending on where you obtain it. For further -# details see http://www.openssl.org/~appro/cryptogams/. -# ==================================================================== -# -# January 2015 -# -# ChaCha20 for x86. -# -# Performance in cycles per byte out of large buffer. -# -# 1xIALU/gcc 4xSSSE3 -# Pentium 17.5/+80% -# PIII 14.2/+60% -# P4 18.6/+84% -# Core2 9.56/+89% 4.83 -# Westmere 9.50/+45% 3.35 -# Sandy Bridge 10.5/+47% 3.20 -# Haswell 8.15/+50% 2.83 -# Skylake 7.53/+22% 2.75 -# Silvermont 17.4/+36% 8.35 -# Goldmont 13.4/+40% 4.36 -# Sledgehammer 10.2/+54% -# Bulldozer 13.4/+50% 4.38(*) -# -# (*) Bulldozer actually executes 4xXOP code path that delivers 3.55; -# -# Modified from upstream OpenSSL to remove the XOP code. - -$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; -push(@INC,"${dir}","${dir}../../perlasm"); -require "x86asm.pl"; - -$output=pop; -open STDOUT,">$output"; - -&asm_init($ARGV[0],$ARGV[$#ARGV] eq "386"); - -$xmm=$ymm=1; -$gasver=999; # enable everything - -$a="eax"; -($b,$b_)=("ebx","ebp"); -($c,$c_)=("ecx","esi"); -($d,$d_)=("edx","edi"); - -sub QUARTERROUND { -my ($ai,$bi,$ci,$di,$i)=@_; -my ($an,$bn,$cn,$dn)=map(($_&~3)+(($_+1)&3),($ai,$bi,$ci,$di)); # next -my ($ap,$bp,$cp,$dp)=map(($_&~3)+(($_-1)&3),($ai,$bi,$ci,$di)); # previous - - # a b c d - # - # 0 4 8 12 < even round - # 1 5 9 13 - # 2 6 10 14 - # 3 7 11 15 - # 0 5 10 15 < odd round - # 1 6 11 12 - # 2 7 8 13 - # 3 4 9 14 - - if ($i==0) { - my $j=4; - ($ap,$bp,$cp,$dp)=map(($_&~3)+(($_-$j--)&3),($ap,$bp,$cp,$dp)); - } elsif ($i==3) { - my $j=0; - ($an,$bn,$cn,$dn)=map(($_&~3)+(($_+$j++)&3),($an,$bn,$cn,$dn)); - } elsif ($i==4) { - my $j=4; - ($ap,$bp,$cp,$dp)=map(($_&~3)+(($_+$j--)&3),($ap,$bp,$cp,$dp)); - } elsif ($i==7) { - my $j=0; - ($an,$bn,$cn,$dn)=map(($_&~3)+(($_-$j++)&3),($an,$bn,$cn,$dn)); - } - - #&add ($a,$b); # see elsewhere - &xor ($d,$a); - &mov (&DWP(4*$cp,"esp"),$c_) if ($ai>0 && $ai<3); - &rol ($d,16); - &mov (&DWP(4*$bp,"esp"),$b_) if ($i!=0); - &add ($c,$d); - &mov ($c_,&DWP(4*$cn,"esp")) if ($ai>0 && $ai<3); - &xor ($b,$c); - &mov ($d_,&DWP(4*$dn,"esp")) if ($di!=$dn); - &rol ($b,12); - &mov ($b_,&DWP(4*$bn,"esp")) if ($i<7); - &mov ($b_,&DWP(128,"esp")) if ($i==7); # loop counter - &add ($a,$b); - &xor ($d,$a); - &mov (&DWP(4*$ai,"esp"),$a); - &rol ($d,8); - &mov ($a,&DWP(4*$an,"esp")); - &add ($c,$d); - &mov (&DWP(4*$di,"esp"),$d) if ($di!=$dn); - &mov ($d_,$d) if ($di==$dn); - &xor ($b,$c); - &add ($a,$b_) if ($i<7); # elsewhere - &rol ($b,7); - - ($b,$b_)=($b_,$b); - ($c,$c_)=($c_,$c); - ($d,$d_)=($d_,$d); -} - -&static_label("ssse3_shortcut"); -&static_label("ssse3_data"); -&static_label("pic_point"); - -&function_begin("GFp_ChaCha20_ctr32"); - &xor ("eax","eax"); - &cmp ("eax",&wparam(2)); # len==0? - &je (&label("no_data")); -if ($xmm) { - &call (&label("pic_point")); -&set_label("pic_point"); - &blindpop("eax"); - &picmeup("ebp","GFp_ia32cap_P","eax",&label("pic_point")); - &test (&DWP(0,"ebp"),1<<24); # test FXSR bit - &jz (&label("x86")); - &test (&DWP(4,"ebp"),1<<9); # test SSSE3 bit - &jz (&label("x86")); - &jmp (&label("ssse3_shortcut")); -&set_label("x86"); -} - &mov ("esi",&wparam(3)); # key - &mov ("edi",&wparam(4)); # counter and nonce - - &stack_push(33); - - &mov ("eax",&DWP(4*0,"esi")); # copy key - &mov ("ebx",&DWP(4*1,"esi")); - &mov ("ecx",&DWP(4*2,"esi")); - &mov ("edx",&DWP(4*3,"esi")); - &mov (&DWP(64+4*4,"esp"),"eax"); - &mov (&DWP(64+4*5,"esp"),"ebx"); - &mov (&DWP(64+4*6,"esp"),"ecx"); - &mov (&DWP(64+4*7,"esp"),"edx"); - &mov ("eax",&DWP(4*4,"esi")); - &mov ("ebx",&DWP(4*5,"esi")); - &mov ("ecx",&DWP(4*6,"esi")); - &mov ("edx",&DWP(4*7,"esi")); - &mov (&DWP(64+4*8,"esp"),"eax"); - &mov (&DWP(64+4*9,"esp"),"ebx"); - &mov (&DWP(64+4*10,"esp"),"ecx"); - &mov (&DWP(64+4*11,"esp"),"edx"); - &mov ("eax",&DWP(4*0,"edi")); # copy counter and nonce - &mov ("ebx",&DWP(4*1,"edi")); - &mov ("ecx",&DWP(4*2,"edi")); - &mov ("edx",&DWP(4*3,"edi")); - &sub ("eax",1); - &mov (&DWP(64+4*12,"esp"),"eax"); - &mov (&DWP(64+4*13,"esp"),"ebx"); - &mov (&DWP(64+4*14,"esp"),"ecx"); - &mov (&DWP(64+4*15,"esp"),"edx"); - &jmp (&label("entry")); - -&set_label("outer_loop",16); - &mov (&wparam(1),$b); # save input - &mov (&wparam(0),$a); # save output - &mov (&wparam(2),$c); # save len -&set_label("entry"); - &mov ($a,0x61707865); - &mov (&DWP(4*1,"esp"),0x3320646e); - &mov (&DWP(4*2,"esp"),0x79622d32); - &mov (&DWP(4*3,"esp"),0x6b206574); - - &mov ($b, &DWP(64+4*5,"esp")); # copy key material - &mov ($b_,&DWP(64+4*6,"esp")); - &mov ($c, &DWP(64+4*10,"esp")); - &mov ($c_,&DWP(64+4*11,"esp")); - &mov ($d, &DWP(64+4*13,"esp")); - &mov ($d_,&DWP(64+4*14,"esp")); - &mov (&DWP(4*5,"esp"),$b); - &mov (&DWP(4*6,"esp"),$b_); - &mov (&DWP(4*10,"esp"),$c); - &mov (&DWP(4*11,"esp"),$c_); - &mov (&DWP(4*13,"esp"),$d); - &mov (&DWP(4*14,"esp"),$d_); - - &mov ($b, &DWP(64+4*7,"esp")); - &mov ($d_,&DWP(64+4*15,"esp")); - &mov ($d, &DWP(64+4*12,"esp")); - &mov ($b_,&DWP(64+4*4,"esp")); - &mov ($c, &DWP(64+4*8,"esp")); - &mov ($c_,&DWP(64+4*9,"esp")); - &add ($d,1); # counter value - &mov (&DWP(4*7,"esp"),$b); - &mov (&DWP(4*15,"esp"),$d_); - &mov (&DWP(64+4*12,"esp"),$d); # save counter value - - &mov ($b,10); # loop counter - &jmp (&label("loop")); - -&set_label("loop",16); - &add ($a,$b_); # elsewhere - &mov (&DWP(128,"esp"),$b); # save loop counter - &mov ($b,$b_); - &QUARTERROUND(0, 4, 8, 12, 0); - &QUARTERROUND(1, 5, 9, 13, 1); - &QUARTERROUND(2, 6,10, 14, 2); - &QUARTERROUND(3, 7,11, 15, 3); - &QUARTERROUND(0, 5,10, 15, 4); - &QUARTERROUND(1, 6,11, 12, 5); - &QUARTERROUND(2, 7, 8, 13, 6); - &QUARTERROUND(3, 4, 9, 14, 7); - &dec ($b); - &jnz (&label("loop")); - - &mov ($b,&wparam(2)); # load len - - &add ($a,0x61707865); # accumulate key material - &add ($b_,&DWP(64+4*4,"esp")); - &add ($c, &DWP(64+4*8,"esp")); - &add ($c_,&DWP(64+4*9,"esp")); - - &cmp ($b,64); - &jb (&label("tail")); - - &mov ($b,&wparam(1)); # load input pointer - &add ($d, &DWP(64+4*12,"esp")); - &add ($d_,&DWP(64+4*14,"esp")); - - &xor ($a, &DWP(4*0,$b)); # xor with input - &xor ($b_,&DWP(4*4,$b)); - &mov (&DWP(4*0,"esp"),$a); - &mov ($a,&wparam(0)); # load output pointer - &xor ($c, &DWP(4*8,$b)); - &xor ($c_,&DWP(4*9,$b)); - &xor ($d, &DWP(4*12,$b)); - &xor ($d_,&DWP(4*14,$b)); - &mov (&DWP(4*4,$a),$b_); # write output - &mov (&DWP(4*8,$a),$c); - &mov (&DWP(4*9,$a),$c_); - &mov (&DWP(4*12,$a),$d); - &mov (&DWP(4*14,$a),$d_); - - &mov ($b_,&DWP(4*1,"esp")); - &mov ($c, &DWP(4*2,"esp")); - &mov ($c_,&DWP(4*3,"esp")); - &mov ($d, &DWP(4*5,"esp")); - &mov ($d_,&DWP(4*6,"esp")); - &add ($b_,0x3320646e); # accumulate key material - &add ($c, 0x79622d32); - &add ($c_,0x6b206574); - &add ($d, &DWP(64+4*5,"esp")); - &add ($d_,&DWP(64+4*6,"esp")); - &xor ($b_,&DWP(4*1,$b)); - &xor ($c, &DWP(4*2,$b)); - &xor ($c_,&DWP(4*3,$b)); - &xor ($d, &DWP(4*5,$b)); - &xor ($d_,&DWP(4*6,$b)); - &mov (&DWP(4*1,$a),$b_); - &mov (&DWP(4*2,$a),$c); - &mov (&DWP(4*3,$a),$c_); - &mov (&DWP(4*5,$a),$d); - &mov (&DWP(4*6,$a),$d_); - - &mov ($b_,&DWP(4*7,"esp")); - &mov ($c, &DWP(4*10,"esp")); - &mov ($c_,&DWP(4*11,"esp")); - &mov ($d, &DWP(4*13,"esp")); - &mov ($d_,&DWP(4*15,"esp")); - &add ($b_,&DWP(64+4*7,"esp")); - &add ($c, &DWP(64+4*10,"esp")); - &add ($c_,&DWP(64+4*11,"esp")); - &add ($d, &DWP(64+4*13,"esp")); - &add ($d_,&DWP(64+4*15,"esp")); - &xor ($b_,&DWP(4*7,$b)); - &xor ($c, &DWP(4*10,$b)); - &xor ($c_,&DWP(4*11,$b)); - &xor ($d, &DWP(4*13,$b)); - &xor ($d_,&DWP(4*15,$b)); - &lea ($b,&DWP(4*16,$b)); - &mov (&DWP(4*7,$a),$b_); - &mov ($b_,&DWP(4*0,"esp")); - &mov (&DWP(4*10,$a),$c); - &mov ($c,&wparam(2)); # len - &mov (&DWP(4*11,$a),$c_); - &mov (&DWP(4*13,$a),$d); - &mov (&DWP(4*15,$a),$d_); - &mov (&DWP(4*0,$a),$b_); - &lea ($a,&DWP(4*16,$a)); - &sub ($c,64); - &jnz (&label("outer_loop")); - - &jmp (&label("done")); - -&set_label("tail"); - &add ($d, &DWP(64+4*12,"esp")); - &add ($d_,&DWP(64+4*14,"esp")); - &mov (&DWP(4*0,"esp"),$a); - &mov (&DWP(4*4,"esp"),$b_); - &mov (&DWP(4*8,"esp"),$c); - &mov (&DWP(4*9,"esp"),$c_); - &mov (&DWP(4*12,"esp"),$d); - &mov (&DWP(4*14,"esp"),$d_); - - &mov ($b_,&DWP(4*1,"esp")); - &mov ($c, &DWP(4*2,"esp")); - &mov ($c_,&DWP(4*3,"esp")); - &mov ($d, &DWP(4*5,"esp")); - &mov ($d_,&DWP(4*6,"esp")); - &add ($b_,0x3320646e); # accumulate key material - &add ($c, 0x79622d32); - &add ($c_,0x6b206574); - &add ($d, &DWP(64+4*5,"esp")); - &add ($d_,&DWP(64+4*6,"esp")); - &mov (&DWP(4*1,"esp"),$b_); - &mov (&DWP(4*2,"esp"),$c); - &mov (&DWP(4*3,"esp"),$c_); - &mov (&DWP(4*5,"esp"),$d); - &mov (&DWP(4*6,"esp"),$d_); - - &mov ($b_,&DWP(4*7,"esp")); - &mov ($c, &DWP(4*10,"esp")); - &mov ($c_,&DWP(4*11,"esp")); - &mov ($d, &DWP(4*13,"esp")); - &mov ($d_,&DWP(4*15,"esp")); - &add ($b_,&DWP(64+4*7,"esp")); - &add ($c, &DWP(64+4*10,"esp")); - &add ($c_,&DWP(64+4*11,"esp")); - &add ($d, &DWP(64+4*13,"esp")); - &add ($d_,&DWP(64+4*15,"esp")); - &mov (&DWP(4*7,"esp"),$b_); - &mov ($b_,&wparam(1)); # load input - &mov (&DWP(4*10,"esp"),$c); - &mov ($c,&wparam(0)); # load output - &mov (&DWP(4*11,"esp"),$c_); - &xor ($c_,$c_); - &mov (&DWP(4*13,"esp"),$d); - &mov (&DWP(4*15,"esp"),$d_); - - &xor ("eax","eax"); - &xor ("edx","edx"); -&set_label("tail_loop"); - &movb ("al",&BP(0,$c_,$b_)); - &movb ("dl",&BP(0,"esp",$c_)); - &lea ($c_,&DWP(1,$c_)); - &xor ("al","dl"); - &mov (&BP(-1,$c,$c_),"al"); - &dec ($b); - &jnz (&label("tail_loop")); - -&set_label("done"); - &stack_pop(33); -&set_label("no_data"); -&function_end("GFp_ChaCha20_ctr32"); - -if ($xmm) { -my ($xa,$xa_,$xb,$xb_,$xc,$xc_,$xd,$xd_)=map("xmm$_",(0..7)); -my ($out,$inp,$len)=("edi","esi","ecx"); - -sub QUARTERROUND_SSSE3 { -my ($ai,$bi,$ci,$di,$i)=@_; -my ($an,$bn,$cn,$dn)=map(($_&~3)+(($_+1)&3),($ai,$bi,$ci,$di)); # next -my ($ap,$bp,$cp,$dp)=map(($_&~3)+(($_-1)&3),($ai,$bi,$ci,$di)); # previous - - # a b c d - # - # 0 4 8 12 < even round - # 1 5 9 13 - # 2 6 10 14 - # 3 7 11 15 - # 0 5 10 15 < odd round - # 1 6 11 12 - # 2 7 8 13 - # 3 4 9 14 - - if ($i==0) { - my $j=4; - ($ap,$bp,$cp,$dp)=map(($_&~3)+(($_-$j--)&3),($ap,$bp,$cp,$dp)); - } elsif ($i==3) { - my $j=0; - ($an,$bn,$cn,$dn)=map(($_&~3)+(($_+$j++)&3),($an,$bn,$cn,$dn)); - } elsif ($i==4) { - my $j=4; - ($ap,$bp,$cp,$dp)=map(($_&~3)+(($_+$j--)&3),($ap,$bp,$cp,$dp)); - } elsif ($i==7) { - my $j=0; - ($an,$bn,$cn,$dn)=map(($_&~3)+(($_-$j++)&3),($an,$bn,$cn,$dn)); - } - - #&paddd ($xa,$xb); # see elsewhere - #&pxor ($xd,$xa); # see elsewhere - &movdqa(&QWP(16*$cp-128,"ebx"),$xc_) if ($ai>0 && $ai<3); - &pshufb ($xd,&QWP(0,"eax")); # rot16 - &movdqa(&QWP(16*$bp-128,"ebx"),$xb_) if ($i!=0); - &paddd ($xc,$xd); - &movdqa($xc_,&QWP(16*$cn-128,"ebx")) if ($ai>0 && $ai<3); - &pxor ($xb,$xc); - &movdqa($xb_,&QWP(16*$bn-128,"ebx")) if ($i<7); - &movdqa ($xa_,$xb); # borrow as temporary - &pslld ($xb,12); - &psrld ($xa_,20); - &por ($xb,$xa_); - &movdqa($xa_,&QWP(16*$an-128,"ebx")); - &paddd ($xa,$xb); - &movdqa($xd_,&QWP(16*$dn-128,"ebx")) if ($di!=$dn); - &pxor ($xd,$xa); - &movdqa (&QWP(16*$ai-128,"ebx"),$xa); - &pshufb ($xd,&QWP(16,"eax")); # rot8 - &paddd ($xc,$xd); - &movdqa (&QWP(16*$di-128,"ebx"),$xd) if ($di!=$dn); - &movdqa ($xd_,$xd) if ($di==$dn); - &pxor ($xb,$xc); - &paddd ($xa_,$xb_) if ($i<7); # elsewhere - &movdqa ($xa,$xb); # borrow as temporary - &pslld ($xb,7); - &psrld ($xa,25); - &pxor ($xd_,$xa_) if ($i<7); # elsewhere - &por ($xb,$xa); - - ($xa,$xa_)=($xa_,$xa); - ($xb,$xb_)=($xb_,$xb); - ($xc,$xc_)=($xc_,$xc); - ($xd,$xd_)=($xd_,$xd); -} - -&function_begin("_ChaCha20_ssse3"); -&set_label("ssse3_shortcut"); - &mov ($out,&wparam(0)); - &mov ($inp,&wparam(1)); - &mov ($len,&wparam(2)); - &mov ("edx",&wparam(3)); # key - &mov ("ebx",&wparam(4)); # counter and nonce - - &mov ("ebp","esp"); - &stack_push (131); - &and ("esp",-64); - &mov (&DWP(512,"esp"),"ebp"); - - &lea ("eax",&DWP(&label("ssse3_data")."-". - &label("pic_point"),"eax")); - &movdqu ("xmm3",&QWP(0,"ebx")); # counter and nonce - -if (defined($gasver) && $gasver>=2.17) { # even though we encode - # pshufb manually, we - # handle only register - # operands, while this - # segment uses memory - # operand... - &cmp ($len,64*4); - &jb (&label("1x")); - - &mov (&DWP(512+4,"esp"),"edx"); # offload pointers - &mov (&DWP(512+8,"esp"),"ebx"); - &sub ($len,64*4); # bias len - &lea ("ebp",&DWP(256+128,"esp")); # size optimization - - &movdqu ("xmm7",&QWP(0,"edx")); # key - &pshufd ("xmm0","xmm3",0x00); - &pshufd ("xmm1","xmm3",0x55); - &pshufd ("xmm2","xmm3",0xaa); - &pshufd ("xmm3","xmm3",0xff); - &paddd ("xmm0",&QWP(16*3,"eax")); # fix counters - &pshufd ("xmm4","xmm7",0x00); - &pshufd ("xmm5","xmm7",0x55); - &psubd ("xmm0",&QWP(16*4,"eax")); - &pshufd ("xmm6","xmm7",0xaa); - &pshufd ("xmm7","xmm7",0xff); - &movdqa (&QWP(16*12-128,"ebp"),"xmm0"); - &movdqa (&QWP(16*13-128,"ebp"),"xmm1"); - &movdqa (&QWP(16*14-128,"ebp"),"xmm2"); - &movdqa (&QWP(16*15-128,"ebp"),"xmm3"); - &movdqu ("xmm3",&QWP(16,"edx")); # key - &movdqa (&QWP(16*4-128,"ebp"),"xmm4"); - &movdqa (&QWP(16*5-128,"ebp"),"xmm5"); - &movdqa (&QWP(16*6-128,"ebp"),"xmm6"); - &movdqa (&QWP(16*7-128,"ebp"),"xmm7"); - &movdqa ("xmm7",&QWP(16*2,"eax")); # sigma - &lea ("ebx",&DWP(128,"esp")); # size optimization - - &pshufd ("xmm0","xmm3",0x00); - &pshufd ("xmm1","xmm3",0x55); - &pshufd ("xmm2","xmm3",0xaa); - &pshufd ("xmm3","xmm3",0xff); - &pshufd ("xmm4","xmm7",0x00); - &pshufd ("xmm5","xmm7",0x55); - &pshufd ("xmm6","xmm7",0xaa); - &pshufd ("xmm7","xmm7",0xff); - &movdqa (&QWP(16*8-128,"ebp"),"xmm0"); - &movdqa (&QWP(16*9-128,"ebp"),"xmm1"); - &movdqa (&QWP(16*10-128,"ebp"),"xmm2"); - &movdqa (&QWP(16*11-128,"ebp"),"xmm3"); - &movdqa (&QWP(16*0-128,"ebp"),"xmm4"); - &movdqa (&QWP(16*1-128,"ebp"),"xmm5"); - &movdqa (&QWP(16*2-128,"ebp"),"xmm6"); - &movdqa (&QWP(16*3-128,"ebp"),"xmm7"); - - &lea ($inp,&DWP(128,$inp)); # size optimization - &lea ($out,&DWP(128,$out)); # size optimization - &jmp (&label("outer_loop")); - -&set_label("outer_loop",16); - #&movdqa ("xmm0",&QWP(16*0-128,"ebp")); # copy key material - &movdqa ("xmm1",&QWP(16*1-128,"ebp")); - &movdqa ("xmm2",&QWP(16*2-128,"ebp")); - &movdqa ("xmm3",&QWP(16*3-128,"ebp")); - #&movdqa ("xmm4",&QWP(16*4-128,"ebp")); - &movdqa ("xmm5",&QWP(16*5-128,"ebp")); - &movdqa ("xmm6",&QWP(16*6-128,"ebp")); - &movdqa ("xmm7",&QWP(16*7-128,"ebp")); - #&movdqa (&QWP(16*0-128,"ebx"),"xmm0"); - &movdqa (&QWP(16*1-128,"ebx"),"xmm1"); - &movdqa (&QWP(16*2-128,"ebx"),"xmm2"); - &movdqa (&QWP(16*3-128,"ebx"),"xmm3"); - #&movdqa (&QWP(16*4-128,"ebx"),"xmm4"); - &movdqa (&QWP(16*5-128,"ebx"),"xmm5"); - &movdqa (&QWP(16*6-128,"ebx"),"xmm6"); - &movdqa (&QWP(16*7-128,"ebx"),"xmm7"); - #&movdqa ("xmm0",&QWP(16*8-128,"ebp")); - #&movdqa ("xmm1",&QWP(16*9-128,"ebp")); - &movdqa ("xmm2",&QWP(16*10-128,"ebp")); - &movdqa ("xmm3",&QWP(16*11-128,"ebp")); - &movdqa ("xmm4",&QWP(16*12-128,"ebp")); - &movdqa ("xmm5",&QWP(16*13-128,"ebp")); - &movdqa ("xmm6",&QWP(16*14-128,"ebp")); - &movdqa ("xmm7",&QWP(16*15-128,"ebp")); - &paddd ("xmm4",&QWP(16*4,"eax")); # counter value - #&movdqa (&QWP(16*8-128,"ebx"),"xmm0"); - #&movdqa (&QWP(16*9-128,"ebx"),"xmm1"); - &movdqa (&QWP(16*10-128,"ebx"),"xmm2"); - &movdqa (&QWP(16*11-128,"ebx"),"xmm3"); - &movdqa (&QWP(16*12-128,"ebx"),"xmm4"); - &movdqa (&QWP(16*13-128,"ebx"),"xmm5"); - &movdqa (&QWP(16*14-128,"ebx"),"xmm6"); - &movdqa (&QWP(16*15-128,"ebx"),"xmm7"); - &movdqa (&QWP(16*12-128,"ebp"),"xmm4"); # save counter value - - &movdqa ($xa, &QWP(16*0-128,"ebp")); - &movdqa ($xd, "xmm4"); - &movdqa ($xb_,&QWP(16*4-128,"ebp")); - &movdqa ($xc, &QWP(16*8-128,"ebp")); - &movdqa ($xc_,&QWP(16*9-128,"ebp")); - - &mov ("edx",10); # loop counter - &nop (); - -&set_label("loop",16); - &paddd ($xa,$xb_); # elsewhere - &movdqa ($xb,$xb_); - &pxor ($xd,$xa); # elsewhere - &QUARTERROUND_SSSE3(0, 4, 8, 12, 0); - &QUARTERROUND_SSSE3(1, 5, 9, 13, 1); - &QUARTERROUND_SSSE3(2, 6,10, 14, 2); - &QUARTERROUND_SSSE3(3, 7,11, 15, 3); - &QUARTERROUND_SSSE3(0, 5,10, 15, 4); - &QUARTERROUND_SSSE3(1, 6,11, 12, 5); - &QUARTERROUND_SSSE3(2, 7, 8, 13, 6); - &QUARTERROUND_SSSE3(3, 4, 9, 14, 7); - &dec ("edx"); - &jnz (&label("loop")); - - &movdqa (&QWP(16*4-128,"ebx"),$xb_); - &movdqa (&QWP(16*8-128,"ebx"),$xc); - &movdqa (&QWP(16*9-128,"ebx"),$xc_); - &movdqa (&QWP(16*12-128,"ebx"),$xd); - &movdqa (&QWP(16*14-128,"ebx"),$xd_); - - my ($xa0,$xa1,$xa2,$xa3,$xt0,$xt1,$xt2,$xt3)=map("xmm$_",(0..7)); - - #&movdqa ($xa0,&QWP(16*0-128,"ebx")); # it's there - &movdqa ($xa1,&QWP(16*1-128,"ebx")); - &movdqa ($xa2,&QWP(16*2-128,"ebx")); - &movdqa ($xa3,&QWP(16*3-128,"ebx")); - - for($i=0;$i<256;$i+=64) { - &paddd ($xa0,&QWP($i+16*0-128,"ebp")); # accumulate key material - &paddd ($xa1,&QWP($i+16*1-128,"ebp")); - &paddd ($xa2,&QWP($i+16*2-128,"ebp")); - &paddd ($xa3,&QWP($i+16*3-128,"ebp")); - - &movdqa ($xt2,$xa0); # "de-interlace" data - &punpckldq ($xa0,$xa1); - &movdqa ($xt3,$xa2); - &punpckldq ($xa2,$xa3); - &punpckhdq ($xt2,$xa1); - &punpckhdq ($xt3,$xa3); - &movdqa ($xa1,$xa0); - &punpcklqdq ($xa0,$xa2); # "a0" - &movdqa ($xa3,$xt2); - &punpcklqdq ($xt2,$xt3); # "a2" - &punpckhqdq ($xa1,$xa2); # "a1" - &punpckhqdq ($xa3,$xt3); # "a3" - - #($xa2,$xt2)=($xt2,$xa2); - - &movdqu ($xt0,&QWP(64*0-128,$inp)); # load input - &movdqu ($xt1,&QWP(64*1-128,$inp)); - &movdqu ($xa2,&QWP(64*2-128,$inp)); - &movdqu ($xt3,&QWP(64*3-128,$inp)); - &lea ($inp,&QWP($i<192?16:(64*4-16*3),$inp)); - &pxor ($xt0,$xa0); - &movdqa ($xa0,&QWP($i+16*4-128,"ebx")) if ($i<192); - &pxor ($xt1,$xa1); - &movdqa ($xa1,&QWP($i+16*5-128,"ebx")) if ($i<192); - &pxor ($xt2,$xa2); - &movdqa ($xa2,&QWP($i+16*6-128,"ebx")) if ($i<192); - &pxor ($xt3,$xa3); - &movdqa ($xa3,&QWP($i+16*7-128,"ebx")) if ($i<192); - &movdqu (&QWP(64*0-128,$out),$xt0); # store output - &movdqu (&QWP(64*1-128,$out),$xt1); - &movdqu (&QWP(64*2-128,$out),$xt2); - &movdqu (&QWP(64*3-128,$out),$xt3); - &lea ($out,&QWP($i<192?16:(64*4-16*3),$out)); - } - &sub ($len,64*4); - &jnc (&label("outer_loop")); - - &add ($len,64*4); - &jz (&label("done")); - - &mov ("ebx",&DWP(512+8,"esp")); # restore pointers - &lea ($inp,&DWP(-128,$inp)); - &mov ("edx",&DWP(512+4,"esp")); - &lea ($out,&DWP(-128,$out)); - - &movd ("xmm2",&DWP(16*12-128,"ebp")); # counter value - &movdqu ("xmm3",&QWP(0,"ebx")); - &paddd ("xmm2",&QWP(16*6,"eax")); # +four - &pand ("xmm3",&QWP(16*7,"eax")); - &por ("xmm3","xmm2"); # counter value -} -{ -my ($a,$b,$c,$d,$t,$t1,$rot16,$rot24)=map("xmm$_",(0..7)); - -sub SSSE3ROUND { # critical path is 20 "SIMD ticks" per round - &paddd ($a,$b); - &pxor ($d,$a); - &pshufb ($d,$rot16); - - &paddd ($c,$d); - &pxor ($b,$c); - &movdqa ($t,$b); - &psrld ($b,20); - &pslld ($t,12); - &por ($b,$t); - - &paddd ($a,$b); - &pxor ($d,$a); - &pshufb ($d,$rot24); - - &paddd ($c,$d); - &pxor ($b,$c); - &movdqa ($t,$b); - &psrld ($b,25); - &pslld ($t,7); - &por ($b,$t); -} - -&set_label("1x"); - &movdqa ($a,&QWP(16*2,"eax")); # sigma - &movdqu ($b,&QWP(0,"edx")); - &movdqu ($c,&QWP(16,"edx")); - #&movdqu ($d,&QWP(0,"ebx")); # already loaded - &movdqa ($rot16,&QWP(0,"eax")); - &movdqa ($rot24,&QWP(16,"eax")); - &mov (&DWP(16*3,"esp"),"ebp"); - - &movdqa (&QWP(16*0,"esp"),$a); - &movdqa (&QWP(16*1,"esp"),$b); - &movdqa (&QWP(16*2,"esp"),$c); - &movdqa (&QWP(16*3,"esp"),$d); - &mov ("edx",10); - &jmp (&label("loop1x")); - -&set_label("outer1x",16); - &movdqa ($d,&QWP(16*5,"eax")); # one - &movdqa ($a,&QWP(16*0,"esp")); - &movdqa ($b,&QWP(16*1,"esp")); - &movdqa ($c,&QWP(16*2,"esp")); - &paddd ($d,&QWP(16*3,"esp")); - &mov ("edx",10); - &movdqa (&QWP(16*3,"esp"),$d); - &jmp (&label("loop1x")); - -&set_label("loop1x",16); - &SSSE3ROUND(); - &pshufd ($c,$c,0b01001110); - &pshufd ($b,$b,0b00111001); - &pshufd ($d,$d,0b10010011); - &nop (); - - &SSSE3ROUND(); - &pshufd ($c,$c,0b01001110); - &pshufd ($b,$b,0b10010011); - &pshufd ($d,$d,0b00111001); - - &dec ("edx"); - &jnz (&label("loop1x")); - - &paddd ($a,&QWP(16*0,"esp")); - &paddd ($b,&QWP(16*1,"esp")); - &paddd ($c,&QWP(16*2,"esp")); - &paddd ($d,&QWP(16*3,"esp")); - - &cmp ($len,64); - &jb (&label("tail")); - - &movdqu ($t,&QWP(16*0,$inp)); - &movdqu ($t1,&QWP(16*1,$inp)); - &pxor ($a,$t); # xor with input - &movdqu ($t,&QWP(16*2,$inp)); - &pxor ($b,$t1); - &movdqu ($t1,&QWP(16*3,$inp)); - &pxor ($c,$t); - &pxor ($d,$t1); - &lea ($inp,&DWP(16*4,$inp)); # inp+=64 - - &movdqu (&QWP(16*0,$out),$a); # write output - &movdqu (&QWP(16*1,$out),$b); - &movdqu (&QWP(16*2,$out),$c); - &movdqu (&QWP(16*3,$out),$d); - &lea ($out,&DWP(16*4,$out)); # inp+=64 - - &sub ($len,64); - &jnz (&label("outer1x")); - - &jmp (&label("done")); - -&set_label("tail"); - &movdqa (&QWP(16*0,"esp"),$a); - &movdqa (&QWP(16*1,"esp"),$b); - &movdqa (&QWP(16*2,"esp"),$c); - &movdqa (&QWP(16*3,"esp"),$d); - - &xor ("eax","eax"); - &xor ("edx","edx"); - &xor ("ebp","ebp"); - -&set_label("tail_loop"); - &movb ("al",&BP(0,"esp","ebp")); - &movb ("dl",&BP(0,$inp,"ebp")); - &lea ("ebp",&DWP(1,"ebp")); - &xor ("al","dl"); - &movb (&BP(-1,$out,"ebp"),"al"); - &dec ($len); - &jnz (&label("tail_loop")); -} -&set_label("done"); - &mov ("esp",&DWP(512,"esp")); -&function_end("_ChaCha20_ssse3"); - -&align (64); -&set_label("ssse3_data"); -&data_byte(0x2,0x3,0x0,0x1, 0x6,0x7,0x4,0x5, 0xa,0xb,0x8,0x9, 0xe,0xf,0xc,0xd); -&data_byte(0x3,0x0,0x1,0x2, 0x7,0x4,0x5,0x6, 0xb,0x8,0x9,0xa, 0xf,0xc,0xd,0xe); -&data_word(0x61707865,0x3320646e,0x79622d32,0x6b206574); -&data_word(0,1,2,3); -&data_word(4,4,4,4); -&data_word(1,0,0,0); -&data_word(4,0,0,0); -&data_word(0,-1,-1,-1); -&align (64); -} -&asciz ("ChaCha20 for x86, CRYPTOGAMS by "); - -&asm_finish(); - -close STDOUT or die "error closing STDOUT"; diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/crypto/cipher_extra/asm/chacha20_poly1305_x86_64.pl temporalio-1.3.0/vendor/ring-0.16.20/crypto/cipher_extra/asm/chacha20_poly1305_x86_64.pl --- temporalio-1.3.0/vendor/ring-0.16.20/crypto/cipher_extra/asm/chacha20_poly1305_x86_64.pl 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/crypto/cipher_extra/asm/chacha20_poly1305_x86_64.pl 1970-01-01 00:00:00.000000000 +0000 @@ -1,2561 +0,0 @@ -#!/usr/bin/env perl - -# Copyright (c) 2015, CloudFlare Ltd. -# -# Permission to use, copy, modify, and/or distribute this software for any -# purpose with or without fee is hereby granted, provided that the above -# copyright notice and this permission notice appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -# SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -# OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ - -############################################################################## -# # -# Author: Vlad Krasnov # -# # -############################################################################## - -$flavour = shift; -$output = shift; -if ($flavour =~ /\./) { $output = $flavour; undef $flavour; } - -$win64=0; $win64=1 if ($flavour =~ /[nm]asm|mingw64/ || $output =~ /\.asm$/); - -$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; -( $xlate="${dir}x86_64-xlate.pl" and -f $xlate ) or -( $xlate="${dir}../../perlasm/x86_64-xlate.pl" and -f $xlate) or -die "can't locate x86_64-xlate.pl"; - -open OUT,"| \"$^X\" \"$xlate\" $flavour \"$output\""; -*STDOUT=*OUT; - -$avx = 2; - -$code.=<<___; -.text -.extern GFp_ia32cap_P - -chacha20_poly1305_constants: - -.align 64 -.Lchacha20_consts: -.byte 'e','x','p','a','n','d',' ','3','2','-','b','y','t','e',' ','k' -.byte 'e','x','p','a','n','d',' ','3','2','-','b','y','t','e',' ','k' -.Lrol8: -.byte 3,0,1,2, 7,4,5,6, 11,8,9,10, 15,12,13,14 -.byte 3,0,1,2, 7,4,5,6, 11,8,9,10, 15,12,13,14 -.Lrol16: -.byte 2,3,0,1, 6,7,4,5, 10,11,8,9, 14,15,12,13 -.byte 2,3,0,1, 6,7,4,5, 10,11,8,9, 14,15,12,13 -.Lavx2_init: -.long 0,0,0,0 -.Lsse_inc: -.long 1,0,0,0 -.Lavx2_inc: -.long 2,0,0,0,2,0,0,0 -.Lclamp: -.quad 0x0FFFFFFC0FFFFFFF, 0x0FFFFFFC0FFFFFFC -.quad 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF -.align 16 -.Land_masks: -.byte 0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 -.byte 0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 -.byte 0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 -.byte 0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 -.byte 0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 -.byte 0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 -.byte 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 -.byte 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 -.byte 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00 -.byte 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00 -.byte 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00 -.byte 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00 -.byte 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00 -.byte 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00 -.byte 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00 -.byte 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff -___ - -my ($oup,$inp,$inl,$adp,$keyp,$itr1,$itr2,$adl)=("%rdi","%rsi","%rbx","%rcx","%r9","%rcx","%r8","%r8"); -my ($acc0,$acc1,$acc2)=map("%r$_",(10..12)); -my ($t0,$t1,$t2,$t3)=("%r13","%r14","%r15","%r9"); -my ($A0,$A1,$A2,$A3,$B0,$B1,$B2,$B3,$C0,$C1,$C2,$C3,$D0,$D1,$D2,$D3)=map("%xmm$_",(0..15)); -my ($T0,$T1,$T2,$T3)=($A3,$B3,$C3,$D3); -my $xmm_storage = 0; -if ($win64) { - $xmm_storage = 10*16; -} -my $xmm_store="0*16(%rbp)"; -my $r_store="$xmm_storage+0*16(%rbp)"; -my $s_store="$xmm_storage+1*16(%rbp)"; -my $len_store="$xmm_storage+2*16(%rbp)"; -my $state1_store="$xmm_storage+3*16(%rbp)"; -my $state2_store="$xmm_storage+4*16(%rbp)"; -my $tmp_store="$xmm_storage+5*16(%rbp)"; -my $ctr0_store="$xmm_storage+6*16(%rbp)"; -my $ctr1_store="$xmm_storage+7*16(%rbp)"; -my $ctr2_store="$xmm_storage+8*16(%rbp)"; -my $ctr3_store="$xmm_storage+9*16(%rbp)"; - -sub chacha_qr { -my ($a,$b,$c,$d,$t,$dir)=@_; -$code.="movdqa $t, $tmp_store\n" if ($dir =~ /store/); -$code.="paddd $b, $a - pxor $a, $d - pshufb .Lrol16(%rip), $d - paddd $d, $c - pxor $c, $b - movdqa $b, $t - pslld \$12, $t - psrld \$20, $b - pxor $t, $b - paddd $b, $a - pxor $a, $d - pshufb .Lrol8(%rip), $d - paddd $d, $c - pxor $c, $b - movdqa $b, $t - pslld \$7, $t - psrld \$25, $b - pxor $t, $b\n"; -$code.="palignr \$4, $b, $b - palignr \$8, $c, $c - palignr \$12, $d, $d\n" if ($dir =~ /left/); -$code.="palignr \$12, $b, $b - palignr \$8, $c, $c - palignr \$4, $d, $d\n" if ($dir =~ /right/); -$code.="movdqa $tmp_store, $t\n" if ($dir =~ /load/); -} - -sub poly_add { -my ($src)=@_; -$code.="add 0+$src, $acc0 - adc 8+$src, $acc1 - adc \$1, $acc2\n"; -} - -sub poly_stage1 { -$code.="mov 0+$r_store, %rax - mov %rax, $t2 - mul $acc0 - mov %rax, $t0 - mov %rdx, $t1 - mov 0+$r_store, %rax - mul $acc1 - imulq $acc2, $t2 - add %rax, $t1 - adc %rdx, $t2\n"; -} - -sub poly_stage2 { -$code.="mov 8+$r_store, %rax - mov %rax, $t3 - mul $acc0 - add %rax, $t1 - adc \$0, %rdx - mov %rdx, $acc0 - mov 8+$r_store, %rax - mul $acc1 - add %rax, $t2 - adc \$0, %rdx\n"; -} - -sub poly_stage3 { -$code.="imulq $acc2, $t3 - add $acc0, $t2 - adc %rdx, $t3\n"; -} - -# At the beginning of the reduce stage t = [t3:t2:t1:t0] is a product of -# r = [r1:r0] and acc = [acc2:acc1:acc0] -# r is 124 bits at most (due to clamping) and acc is 131 bits at most -# (acc2 is at most 4 before the addition and can be at most 6 when we add in -# the next block) therefore t is at most 255 bits big, and t3 is 63 bits. -sub poly_reduce_stage { -$code.="mov $t0, $acc0 - mov $t1, $acc1 - mov $t2, $acc2 - and \$3, $acc2 # At this point acc2 is 2 bits at most (value of 3) - mov $t2, $t0 - and \$-4, $t0 - mov $t3, $t1 - shrd \$2, $t3, $t2 - shr \$2, $t3 - add $t0, $t2 - adc $t1, $t3 # No carry out since t3 is 61 bits and t1 is 63 bits - add $t2, $acc0 - adc $t3, $acc1 - adc \$0, $acc2\n"; # At this point acc2 has the value of 4 at most -} - -sub poly_mul { - &poly_stage1(); - &poly_stage2(); - &poly_stage3(); - &poly_reduce_stage(); -} - -sub prep_state { -my ($n)=@_; -$code.="movdqa .Lchacha20_consts(%rip), $A0 - movdqa $state1_store, $B0 - movdqa $state2_store, $C0\n"; -$code.="movdqa $A0, $A1 - movdqa $B0, $B1 - movdqa $C0, $C1\n" if ($n ge 2); -$code.="movdqa $A0, $A2 - movdqa $B0, $B2 - movdqa $C0, $C2\n" if ($n ge 3); -$code.="movdqa $A0, $A3 - movdqa $B0, $B3 - movdqa $C0, $C3\n" if ($n ge 4); -$code.="movdqa $ctr0_store, $D0 - paddd .Lsse_inc(%rip), $D0 - movdqa $D0, $ctr0_store\n" if ($n eq 1); -$code.="movdqa $ctr0_store, $D1 - paddd .Lsse_inc(%rip), $D1 - movdqa $D1, $D0 - paddd .Lsse_inc(%rip), $D0 - movdqa $D0, $ctr0_store - movdqa $D1, $ctr1_store\n" if ($n eq 2); -$code.="movdqa $ctr0_store, $D2 - paddd .Lsse_inc(%rip), $D2 - movdqa $D2, $D1 - paddd .Lsse_inc(%rip), $D1 - movdqa $D1, $D0 - paddd .Lsse_inc(%rip), $D0 - movdqa $D0, $ctr0_store - movdqa $D1, $ctr1_store - movdqa $D2, $ctr2_store\n" if ($n eq 3); -$code.="movdqa $ctr0_store, $D3 - paddd .Lsse_inc(%rip), $D3 - movdqa $D3, $D2 - paddd .Lsse_inc(%rip), $D2 - movdqa $D2, $D1 - paddd .Lsse_inc(%rip), $D1 - movdqa $D1, $D0 - paddd .Lsse_inc(%rip), $D0 - movdqa $D0, $ctr0_store - movdqa $D1, $ctr1_store - movdqa $D2, $ctr2_store - movdqa $D3, $ctr3_store\n" if ($n eq 4); -} - -sub finalize_state { -my ($n)=@_; -$code.="paddd .Lchacha20_consts(%rip), $A3 - paddd $state1_store, $B3 - paddd $state2_store, $C3 - paddd $ctr3_store, $D3\n" if ($n eq 4); -$code.="paddd .Lchacha20_consts(%rip), $A2 - paddd $state1_store, $B2 - paddd $state2_store, $C2 - paddd $ctr2_store, $D2\n" if ($n ge 3); -$code.="paddd .Lchacha20_consts(%rip), $A1 - paddd $state1_store, $B1 - paddd $state2_store, $C1 - paddd $ctr1_store, $D1\n" if ($n ge 2); -$code.="paddd .Lchacha20_consts(%rip), $A0 - paddd $state1_store, $B0 - paddd $state2_store, $C0 - paddd $ctr0_store, $D0\n"; -} - -sub xor_stream { -my ($A, $B, $C, $D, $offset)=@_; -$code.="movdqu 0*16 + $offset($inp), $A3 - movdqu 1*16 + $offset($inp), $B3 - movdqu 2*16 + $offset($inp), $C3 - movdqu 3*16 + $offset($inp), $D3 - pxor $A3, $A - pxor $B3, $B - pxor $C3, $C - pxor $D, $D3 - movdqu $A, 0*16 + $offset($oup) - movdqu $B, 1*16 + $offset($oup) - movdqu $C, 2*16 + $offset($oup) - movdqu $D3, 3*16 + $offset($oup)\n"; -} - -sub xor_stream_using_temp { -my ($A, $B, $C, $D, $offset, $temp)=@_; -$code.="movdqa $temp, $tmp_store - movdqu 0*16 + $offset($inp), $temp - pxor $A, $temp - movdqu $temp, 0*16 + $offset($oup) - movdqu 1*16 + $offset($inp), $temp - pxor $B, $temp - movdqu $temp, 1*16 + $offset($oup) - movdqu 2*16 + $offset($inp), $temp - pxor $C, $temp - movdqu $temp, 2*16 + $offset($oup) - movdqu 3*16 + $offset($inp), $temp - pxor $D, $temp - movdqu $temp, 3*16 + $offset($oup)\n"; -} - -sub gen_chacha_round { -my ($rot1, $rot2, $shift)=@_; -my $round=""; -$round.="movdqa $C0, $tmp_store\n" if ($rot1 eq 20); -$round.="movdqa $rot2, $C0 - paddd $B3, $A3 - paddd $B2, $A2 - paddd $B1, $A1 - paddd $B0, $A0 - pxor $A3, $D3 - pxor $A2, $D2 - pxor $A1, $D1 - pxor $A0, $D0 - pshufb $C0, $D3 - pshufb $C0, $D2 - pshufb $C0, $D1 - pshufb $C0, $D0 - movdqa $tmp_store, $C0 - paddd $D3, $C3 - paddd $D2, $C2 - paddd $D1, $C1 - paddd $D0, $C0 - pxor $C3, $B3 - pxor $C2, $B2 - pxor $C1, $B1 - pxor $C0, $B0 - movdqa $C0, $tmp_store - movdqa $B3, $C0 - psrld \$$rot1, $C0 - pslld \$32-$rot1, $B3 - pxor $C0, $B3 - movdqa $B2, $C0 - psrld \$$rot1, $C0 - pslld \$32-$rot1, $B2 - pxor $C0, $B2 - movdqa $B1, $C0 - psrld \$$rot1, $C0 - pslld \$32-$rot1, $B1 - pxor $C0, $B1 - movdqa $B0, $C0 - psrld \$$rot1, $C0 - pslld \$32-$rot1, $B0 - pxor $C0, $B0\n"; -($s1,$s2,$s3)=(4,8,12) if ($shift =~ /left/); -($s1,$s2,$s3)=(12,8,4) if ($shift =~ /right/); -$round.="movdqa $tmp_store, $C0 - palignr \$$s1, $B3, $B3 - palignr \$$s2, $C3, $C3 - palignr \$$s3, $D3, $D3 - palignr \$$s1, $B2, $B2 - palignr \$$s2, $C2, $C2 - palignr \$$s3, $D2, $D2 - palignr \$$s1, $B1, $B1 - palignr \$$s2, $C1, $C1 - palignr \$$s3, $D1, $D1 - palignr \$$s1, $B0, $B0 - palignr \$$s2, $C0, $C0 - palignr \$$s3, $D0, $D0\n" -if (($shift =~ /left/) || ($shift =~ /right/)); -return $round; -}; - -$chacha_body = &gen_chacha_round(20, ".Lrol16(%rip)") . - &gen_chacha_round(25, ".Lrol8(%rip)", "left") . - &gen_chacha_round(20, ".Lrol16(%rip)") . - &gen_chacha_round(25, ".Lrol8(%rip)", "right"); - -my @loop_body = split /\n/, $chacha_body; - -sub emit_body { -my ($n)=@_; - for (my $i=0; $i < $n; $i++) { - $code=$code.shift(@loop_body)."\n"; - }; -} - -{ -################################################################################ -# void poly_hash_ad_internal(); -$code.=" -.type poly_hash_ad_internal,\@abi-omnipotent -.align 64 -poly_hash_ad_internal: -.cfi_startproc -.cfi_def_cfa rsp, 8 - xor $acc0, $acc0 - xor $acc1, $acc1 - xor $acc2, $acc2 - cmp \$13, $itr2 - jne .Lhash_ad_loop -.Lpoly_fast_tls_ad: - # Special treatment for the TLS case of 13 bytes - mov ($adp), $acc0 - mov 5($adp), $acc1 - shr \$24, $acc1 - mov \$1, $acc2\n"; - &poly_mul(); $code.=" - ret -.Lhash_ad_loop: - # Hash in 16 byte chunk - cmp \$16, $itr2 - jb .Lhash_ad_tail\n"; - &poly_add("0($adp)"); - &poly_mul(); $code.=" - lea 1*16($adp), $adp - sub \$16, $itr2 - jmp .Lhash_ad_loop -.Lhash_ad_tail: - cmp \$0, $itr2 - je .Lhash_ad_done - # Hash last < 16 byte tail - xor $t0, $t0 - xor $t1, $t1 - xor $t2, $t2 - add $itr2, $adp -.Lhash_ad_tail_loop: - shld \$8, $t0, $t1 - shl \$8, $t0 - movzxb -1($adp), $t2 - xor $t2, $t0 - dec $adp - dec $itr2 - jne .Lhash_ad_tail_loop - - add $t0, $acc0 - adc $t1, $acc1 - adc \$1, $acc2\n"; - &poly_mul(); $code.=" - # Finished AD -.Lhash_ad_done: - ret -.cfi_endproc -.size poly_hash_ad_internal, .-poly_hash_ad_internal\n"; -} - -{ -################################################################################ -# void GFp_chacha20_poly1305_open(uint8_t *out_plaintext, const uint8_t *ciphertext, -# size_t plaintext_len, const uint8_t *ad, -# size_t ad_len, -# union chacha20_poly1305_open_data *aead_data) -# -$code.=" -.globl GFp_chacha20_poly1305_open -.type GFp_chacha20_poly1305_open,\@function,6 -.align 64 -GFp_chacha20_poly1305_open: -.cfi_startproc - push %rbp -.cfi_push %rbp - push %rbx -.cfi_push %rbx - push %r12 -.cfi_push %r12 - push %r13 -.cfi_push %r13 - push %r14 -.cfi_push %r14 - push %r15 -.cfi_push %r15 - # We write the calculated authenticator back to keyp at the end, so save - # the pointer on the stack too. - push $keyp -.cfi_push $keyp - sub \$288 + $xmm_storage + 32, %rsp -.cfi_adjust_cfa_offset 288 + 32 - - lea 32(%rsp), %rbp - and \$-32, %rbp\n"; -$code.=" - movaps %xmm6,16*0+$xmm_store - movaps %xmm7,16*1+$xmm_store - movaps %xmm8,16*2+$xmm_store - movaps %xmm9,16*3+$xmm_store - movaps %xmm10,16*4+$xmm_store - movaps %xmm11,16*5+$xmm_store - movaps %xmm12,16*6+$xmm_store - movaps %xmm13,16*7+$xmm_store - movaps %xmm14,16*8+$xmm_store - movaps %xmm15,16*9+$xmm_store\n" if ($win64); -$code.=" - mov %rdx, $inl - mov $adl, 0+$len_store - mov $inl, 8+$len_store\n"; -$code.=" - mov GFp_ia32cap_P+8(%rip), %eax - and \$`(1<<5) + (1<<8)`, %eax # Check both BMI2 and AVX2 are present - xor \$`(1<<5) + (1<<8)`, %eax - jz chacha20_poly1305_open_avx2\n" if ($avx>1); -$code.=" - cmp \$128, $inl - jbe .Lopen_sse_128 - # For long buffers, prepare the poly key first - movdqa .Lchacha20_consts(%rip), $A0 - movdqu 0*16($keyp), $B0 - movdqu 1*16($keyp), $C0 - movdqu 2*16($keyp), $D0 - - movdqa $D0, $T1 - # Store on stack, to free keyp - movdqa $B0, $state1_store - movdqa $C0, $state2_store - movdqa $D0, $ctr0_store - mov \$10, $acc0 -.Lopen_sse_init_rounds:\n"; - &chacha_qr($A0,$B0,$C0,$D0,$T0,"left"); - &chacha_qr($A0,$B0,$C0,$D0,$T0,"right"); $code.=" - dec $acc0 - jne .Lopen_sse_init_rounds - # A0|B0 hold the Poly1305 32-byte key, C0,D0 can be discarded - paddd .Lchacha20_consts(%rip), $A0 - paddd $state1_store, $B0 - # Clamp and store the key - pand .Lclamp(%rip), $A0 - movdqa $A0, $r_store - movdqa $B0, $s_store - # Hash - mov $adl, $itr2 - call poly_hash_ad_internal -.Lopen_sse_main_loop: - cmp \$16*16, $inl - jb .Lopen_sse_tail - # Load state, increment counter blocks\n"; - &prep_state(4); $code.=" - # There are 10 ChaCha20 iterations of 2QR each, so for 6 iterations we - # hash 2 blocks, and for the remaining 4 only 1 block - for a total of 16 - mov \$4, $itr1 - mov $inp, $itr2 -.Lopen_sse_main_loop_rounds:\n"; - &emit_body(20); - &poly_add("0($itr2)"); $code.=" - lea 2*8($itr2), $itr2\n"; - &emit_body(20); - &poly_stage1(); - &emit_body(20); - &poly_stage2(); - &emit_body(20); - &poly_stage3(); - &emit_body(20); - &poly_reduce_stage(); - foreach $l (@loop_body) {$code.=$l."\n";} - @loop_body = split /\n/, $chacha_body; $code.=" - dec $itr1 - jge .Lopen_sse_main_loop_rounds\n"; - &poly_add("0($itr2)"); - &poly_mul(); $code.=" - lea 2*8($itr2), $itr2 - cmp \$-6, $itr1 - jg .Lopen_sse_main_loop_rounds\n"; - &finalize_state(4); - &xor_stream_using_temp($A3, $B3, $C3, $D3, "0*16", $D0); - &xor_stream($A2, $B2, $C2, $D2, "4*16"); - &xor_stream($A1, $B1, $C1, $D1, "8*16"); - &xor_stream($A0, $B0, $C0, $tmp_store, "12*16"); $code.=" - lea 16*16($inp), $inp - lea 16*16($oup), $oup - sub \$16*16, $inl - jmp .Lopen_sse_main_loop -.Lopen_sse_tail: - # Handle the various tail sizes efficiently - test $inl, $inl - jz .Lopen_sse_finalize - cmp \$12*16, $inl - ja .Lopen_sse_tail_256 - cmp \$8*16, $inl - ja .Lopen_sse_tail_192 - cmp \$4*16, $inl - ja .Lopen_sse_tail_128\n"; -############################################################################### - # At most 64 bytes are left - &prep_state(1); $code.=" - xor $itr2, $itr2 - mov $inl, $itr1 - cmp \$16, $itr1 - jb .Lopen_sse_tail_64_rounds -.Lopen_sse_tail_64_rounds_and_x1hash: \n"; - &poly_add("0($inp,$itr2)"); - &poly_mul(); $code.=" - sub \$16, $itr1 -.Lopen_sse_tail_64_rounds: - add \$16, $itr2\n"; - &chacha_qr($A0,$B0,$C0,$D0,$T0,"left"); - &chacha_qr($A0,$B0,$C0,$D0,$T0,"right"); $code.=" - cmp \$16, $itr1 - jae .Lopen_sse_tail_64_rounds_and_x1hash - cmp \$10*16, $itr2 - jne .Lopen_sse_tail_64_rounds\n"; - &finalize_state(1); $code.=" - jmp .Lopen_sse_tail_64_dec_loop -############################################################################### -.Lopen_sse_tail_128:\n"; - # 65 - 128 bytes are left - &prep_state(2); $code.=" - mov $inl, $itr1 - and \$-16, $itr1 - xor $itr2, $itr2 -.Lopen_sse_tail_128_rounds_and_x1hash: \n"; - &poly_add("0($inp,$itr2)"); - &poly_mul(); $code.=" -.Lopen_sse_tail_128_rounds: - add \$16, $itr2\n"; - &chacha_qr($A0,$B0,$C0,$D0,$T0,"left"); - &chacha_qr($A1,$B1,$C1,$D1,$T0,"left"); - &chacha_qr($A0,$B0,$C0,$D0,$T0,"right"); - &chacha_qr($A1,$B1,$C1,$D1,$T0,"right");$code.=" - cmp $itr1, $itr2 - jb .Lopen_sse_tail_128_rounds_and_x1hash - cmp \$10*16, $itr2 - jne .Lopen_sse_tail_128_rounds\n"; - &finalize_state(2); - &xor_stream($A1, $B1, $C1, $D1, "0*16"); $code.=" - sub \$4*16, $inl - lea 4*16($inp), $inp - lea 4*16($oup), $oup - jmp .Lopen_sse_tail_64_dec_loop -############################################################################### -.Lopen_sse_tail_192:\n"; - # 129 - 192 bytes are left - &prep_state(3); $code.=" - mov $inl, $itr1 - mov \$10*16, $itr2 - cmp \$10*16, $itr1 - cmovg $itr2, $itr1 - and \$-16, $itr1 - xor $itr2, $itr2 -.Lopen_sse_tail_192_rounds_and_x1hash: \n"; - &poly_add("0($inp,$itr2)"); - &poly_mul(); $code.=" -.Lopen_sse_tail_192_rounds: - add \$16, $itr2\n"; - &chacha_qr($A0,$B0,$C0,$D0,$T0,"left"); - &chacha_qr($A1,$B1,$C1,$D1,$T0,"left"); - &chacha_qr($A2,$B2,$C2,$D2,$T0,"left"); - &chacha_qr($A0,$B0,$C0,$D0,$T0,"right"); - &chacha_qr($A1,$B1,$C1,$D1,$T0,"right"); - &chacha_qr($A2,$B2,$C2,$D2,$T0,"right"); $code.=" - cmp $itr1, $itr2 - jb .Lopen_sse_tail_192_rounds_and_x1hash - cmp \$10*16, $itr2 - jne .Lopen_sse_tail_192_rounds - cmp \$11*16, $inl - jb .Lopen_sse_tail_192_finish\n"; - &poly_add("10*16($inp)"); - &poly_mul(); $code.=" - cmp \$12*16, $inl - jb .Lopen_sse_tail_192_finish\n"; - &poly_add("11*16($inp)"); - &poly_mul(); $code.=" -.Lopen_sse_tail_192_finish: \n"; - &finalize_state(3); - &xor_stream($A2, $B2, $C2, $D2, "0*16"); - &xor_stream($A1, $B1, $C1, $D1, "4*16"); $code.=" - sub \$8*16, $inl - lea 8*16($inp), $inp - lea 8*16($oup), $oup - jmp .Lopen_sse_tail_64_dec_loop -############################################################################### -.Lopen_sse_tail_256:\n"; - # 193 - 255 bytes are left - &prep_state(4); $code.=" - xor $itr2, $itr2 -.Lopen_sse_tail_256_rounds_and_x1hash: \n"; - &poly_add("0($inp,$itr2)"); - &chacha_qr($A0,$B0,$C0,$D0,$C3,"store_left"); - &chacha_qr($A1,$B1,$C1,$D1,$C3,"left"); - &chacha_qr($A2,$B2,$C2,$D2,$C3,"left_load"); - &poly_stage1(); - &chacha_qr($A3,$B3,$C3,$D3,$C1,"store_left_load"); - &poly_stage2(); - &chacha_qr($A0,$B0,$C0,$D0,$C3,"store_right"); - &chacha_qr($A1,$B1,$C1,$D1,$C3,"right"); - &poly_stage3(); - &chacha_qr($A2,$B2,$C2,$D2,$C3,"right_load"); - &poly_reduce_stage(); - &chacha_qr($A3,$B3,$C3,$D3,$C1,"store_right_load"); $code.=" - add \$16, $itr2 - cmp \$10*16, $itr2 - jb .Lopen_sse_tail_256_rounds_and_x1hash - - mov $inl, $itr1 - and \$-16, $itr1 -.Lopen_sse_tail_256_hash: \n"; - &poly_add("0($inp,$itr2)"); - &poly_mul(); $code.=" - add \$16, $itr2 - cmp $itr1, $itr2 - jb .Lopen_sse_tail_256_hash\n"; - &finalize_state(4); - &xor_stream_using_temp($A3, $B3, $C3, $D3, "0*16", $D0); - &xor_stream($A2, $B2, $C2, $D2, "4*16"); - &xor_stream($A1, $B1, $C1, $D1, "8*16"); $code.=" - movdqa $tmp_store, $D0 - sub \$12*16, $inl - lea 12*16($inp), $inp - lea 12*16($oup), $oup -############################################################################### - # Decrypt the remaining data, 16B at a time, using existing stream -.Lopen_sse_tail_64_dec_loop: - cmp \$16, $inl - jb .Lopen_sse_tail_16_init - sub \$16, $inl - movdqu ($inp), $T0 - pxor $T0, $A0 - movdqu $A0, ($oup) - lea 16($inp), $inp - lea 16($oup), $oup - movdqa $B0, $A0 - movdqa $C0, $B0 - movdqa $D0, $C0 - jmp .Lopen_sse_tail_64_dec_loop -.Lopen_sse_tail_16_init: - movdqa $A0, $A1 - - # Decrypt up to 16 bytes at the end. -.Lopen_sse_tail_16: - test $inl, $inl - jz .Lopen_sse_finalize - - # Read the final bytes into $T0. They need to be read in reverse order so - # that they end up in the correct order in $T0. - pxor $T0, $T0 - lea -1($inp,$inl), $inp - movq $inl, $itr2 -.Lopen_sse_tail_16_compose: - pslldq \$1, $T0 - pinsrb \$0, ($inp), $T0 - sub \$1, $inp - sub \$1, $itr2 - jnz .Lopen_sse_tail_16_compose - - movq $T0, $t0 - pextrq \$1, $T0, $t1 - # The final bytes of keystream are in $A1. - pxor $A1, $T0 - - # Copy the plaintext bytes out. -.Lopen_sse_tail_16_extract: - pextrb \$0, $T0, ($oup) - psrldq \$1, $T0 - add \$1, $oup - sub \$1, $inl - jne .Lopen_sse_tail_16_extract - - add $t0, $acc0 - adc $t1, $acc1 - adc \$1, $acc2\n"; - &poly_mul(); $code.=" - -.Lopen_sse_finalize:\n"; - &poly_add($len_store); - &poly_mul(); $code.=" - # Final reduce - mov $acc0, $t0 - mov $acc1, $t1 - mov $acc2, $t2 - sub \$-5, $acc0 - sbb \$-1, $acc1 - sbb \$3, $acc2 - cmovc $t0, $acc0 - cmovc $t1, $acc1 - cmovc $t2, $acc2 - # Add in s part of the key - add 0+$s_store, $acc0 - adc 8+$s_store, $acc1\n"; - -$code.=" - movaps 16*0+$xmm_store, %xmm6 - movaps 16*1+$xmm_store, %xmm7 - movaps 16*2+$xmm_store, %xmm8 - movaps 16*3+$xmm_store, %xmm9 - movaps 16*4+$xmm_store, %xmm10 - movaps 16*5+$xmm_store, %xmm11 - movaps 16*6+$xmm_store, %xmm12 - movaps 16*7+$xmm_store, %xmm13 - movaps 16*8+$xmm_store, %xmm14 - movaps 16*9+$xmm_store, %xmm15\n" if ($win64); -$code.=" -.cfi_remember_state - add \$288 + $xmm_storage + 32, %rsp -.cfi_adjust_cfa_offset -(288 + 32) - # The tag replaces the key on return - pop $keyp -.cfi_pop $keyp - mov $acc0, ($keyp) - mov $acc1, 8($keyp) - pop %r15 -.cfi_pop %r15 - pop %r14 -.cfi_pop %r14 - pop %r13 -.cfi_pop %r13 - pop %r12 -.cfi_pop %r12 - pop %rbx -.cfi_pop %rbx - pop %rbp -.cfi_pop %rbp - ret -############################################################################### -.Lopen_sse_128: -.cfi_restore_state - movdqu .Lchacha20_consts(%rip), $A0\nmovdqa $A0, $A1\nmovdqa $A0, $A2 - movdqu 0*16($keyp), $B0\nmovdqa $B0, $B1\nmovdqa $B0, $B2 - movdqu 1*16($keyp), $C0\nmovdqa $C0, $C1\nmovdqa $C0, $C2 - movdqu 2*16($keyp), $D0 - movdqa $D0, $D1\npaddd .Lsse_inc(%rip), $D1 - movdqa $D1, $D2\npaddd .Lsse_inc(%rip), $D2 - movdqa $B0, $T1\nmovdqa $C0, $T2\nmovdqa $D1, $T3 - mov \$10, $acc0 - -.Lopen_sse_128_rounds: \n"; - &chacha_qr($A0,$B0,$C0,$D0,$T0,"left"); - &chacha_qr($A1,$B1,$C1,$D1,$T0,"left"); - &chacha_qr($A2,$B2,$C2,$D2,$T0,"left"); - &chacha_qr($A0,$B0,$C0,$D0,$T0,"right"); - &chacha_qr($A1,$B1,$C1,$D1,$T0,"right"); - &chacha_qr($A2,$B2,$C2,$D2,$T0,"right"); $code.=" - dec $acc0 - jnz .Lopen_sse_128_rounds - paddd .Lchacha20_consts(%rip), $A0 - paddd .Lchacha20_consts(%rip), $A1 - paddd .Lchacha20_consts(%rip), $A2 - paddd $T1, $B0\npaddd $T1, $B1\npaddd $T1, $B2 - paddd $T2, $C1\npaddd $T2, $C2 - paddd $T3, $D1 - paddd .Lsse_inc(%rip), $T3 - paddd $T3, $D2 - # Clamp and store the key - pand .Lclamp(%rip), $A0 - movdqa $A0, $r_store - movdqa $B0, $s_store - # Hash - mov $adl, $itr2 - call poly_hash_ad_internal -.Lopen_sse_128_xor_hash: - cmp \$16, $inl - jb .Lopen_sse_tail_16 - sub \$16, $inl\n"; - # Load for hashing - &poly_add("0*8($inp)"); $code.=" - # Load for decryption - movdqu 0*16($inp), $T0 - pxor $T0, $A1 - movdqu $A1, 0*16($oup) - lea 1*16($inp), $inp - lea 1*16($oup), $oup\n"; - &poly_mul(); $code.=" - # Shift the stream left - movdqa $B1, $A1 - movdqa $C1, $B1 - movdqa $D1, $C1 - movdqa $A2, $D1 - movdqa $B2, $A2 - movdqa $C2, $B2 - movdqa $D2, $C2 - jmp .Lopen_sse_128_xor_hash -.size GFp_chacha20_poly1305_open, .-GFp_chacha20_poly1305_open -.cfi_endproc - -################################################################################ -# void GFp_chacha20_poly1305_seal(uint8_t *out_ciphertext, const uint8_t *plaintext, -# size_t plaintext_len, const uint8_t *ad, -# size_t ad_len, -# union chacha20_poly1305_seal_data *data); -.globl GFp_chacha20_poly1305_seal -.type GFp_chacha20_poly1305_seal,\@function,6 -.align 64 -GFp_chacha20_poly1305_seal: -.cfi_startproc - push %rbp -.cfi_push %rbp - push %rbx -.cfi_push %rbx - push %r12 -.cfi_push %r12 - push %r13 -.cfi_push %r13 - push %r14 -.cfi_push %r14 - push %r15 -.cfi_push %r15 -# We write the calculated authenticator back to keyp at the end, so save -# the pointer on the stack too. - push $keyp -.cfi_push $keyp - sub \$288 + $xmm_storage + 32, %rsp -.cfi_adjust_cfa_offset 288 + 32 - lea 32(%rsp), %rbp - and \$-32, %rbp\n"; -$code.=" - movaps %xmm6,16*0+$xmm_store - movaps %xmm7,16*1+$xmm_store - movaps %xmm8,16*2+$xmm_store - movaps %xmm9,16*3+$xmm_store - movaps %xmm10,16*4+$xmm_store - movaps %xmm11,16*5+$xmm_store - movaps %xmm12,16*6+$xmm_store - movaps %xmm13,16*7+$xmm_store - movaps %xmm14,16*8+$xmm_store - movaps %xmm15,16*9+$xmm_store\n" if ($win64); -$code.=" - mov 56($keyp), $inl # extra_in_len - addq %rdx, $inl - mov $adl, 0+$len_store - mov $inl, 8+$len_store - mov %rdx, $inl\n"; -$code.=" - mov GFp_ia32cap_P+8(%rip), %eax - and \$`(1<<5) + (1<<8)`, %eax # Check both BMI2 and AVX2 are present - xor \$`(1<<5) + (1<<8)`, %eax - jz chacha20_poly1305_seal_avx2\n" if ($avx>1); -$code.=" - cmp \$128, $inl - jbe .Lseal_sse_128 - # For longer buffers, prepare the poly key + some stream - movdqa .Lchacha20_consts(%rip), $A0 - movdqu 0*16($keyp), $B0 - movdqu 1*16($keyp), $C0 - movdqu 2*16($keyp), $D0 - - movdqa $A0, $A1 - movdqa $A0, $A2 - movdqa $A0, $A3 - movdqa $B0, $B1 - movdqa $B0, $B2 - movdqa $B0, $B3 - movdqa $C0, $C1 - movdqa $C0, $C2 - movdqa $C0, $C3 - movdqa $D0, $D3 - paddd .Lsse_inc(%rip), $D0 - movdqa $D0, $D2 - paddd .Lsse_inc(%rip), $D0 - movdqa $D0, $D1 - paddd .Lsse_inc(%rip), $D0 - # Store on stack - movdqa $B0, $state1_store - movdqa $C0, $state2_store - movdqa $D0, $ctr0_store - movdqa $D1, $ctr1_store - movdqa $D2, $ctr2_store - movdqa $D3, $ctr3_store - mov \$10, $acc0 -.Lseal_sse_init_rounds: \n"; - foreach $l (@loop_body) {$code.=$l."\n";} - @loop_body = split /\n/, $chacha_body; $code.=" - dec $acc0 - jnz .Lseal_sse_init_rounds\n"; - &finalize_state(4); $code.=" - # Clamp and store the key - pand .Lclamp(%rip), $A3 - movdqa $A3, $r_store - movdqa $B3, $s_store - # Hash - mov $adl, $itr2 - call poly_hash_ad_internal\n"; - &xor_stream($A2,$B2,$C2,$D2,"0*16"); - &xor_stream($A1,$B1,$C1,$D1,"4*16"); $code.=" - cmp \$12*16, $inl - ja .Lseal_sse_main_init - mov \$8*16, $itr1 - sub \$8*16, $inl - lea 8*16($inp), $inp - jmp .Lseal_sse_128_tail_hash -.Lseal_sse_main_init:\n"; - &xor_stream($A0, $B0, $C0, $D0, "8*16"); $code.=" - mov \$12*16, $itr1 - sub \$12*16, $inl - lea 12*16($inp), $inp - mov \$2, $itr1 - mov \$8, $itr2 - cmp \$4*16, $inl - jbe .Lseal_sse_tail_64 - cmp \$8*16, $inl - jbe .Lseal_sse_tail_128 - cmp \$12*16, $inl - jbe .Lseal_sse_tail_192 - -.Lseal_sse_main_loop: \n"; - # The main loop - &prep_state(4); $code.=" -.align 32 -.Lseal_sse_main_rounds: \n"; - &emit_body(20); - &poly_add("0($oup)"); - &emit_body(20); - &poly_stage1(); - &emit_body(20); - &poly_stage2(); - &emit_body(20); - &poly_stage3(); - &emit_body(20); - &poly_reduce_stage(); - foreach $l (@loop_body) {$code.=$l."\n";} - @loop_body = split /\n/, $chacha_body; $code.=" - lea 16($oup), $oup - dec $itr2 - jge .Lseal_sse_main_rounds\n"; - &poly_add("0*8($oup)"); - &poly_mul(); $code.=" - lea 16($oup), $oup - dec $itr1 - jg .Lseal_sse_main_rounds\n"; - - &finalize_state(4);$code.=" - movdqa $D2, $tmp_store\n"; - &xor_stream_using_temp($A3,$B3,$C3,$D3,0*16,$D2); $code.=" - movdqa $tmp_store, $D2\n"; - &xor_stream($A2,$B2,$C2,$D2, 4*16); - &xor_stream($A1,$B1,$C1,$D1, 8*16); $code.=" - cmp \$16*16, $inl - ja .Lseal_sse_main_loop_xor - - mov \$12*16, $itr1 - sub \$12*16, $inl - lea 12*16($inp), $inp - jmp .Lseal_sse_128_tail_hash -.Lseal_sse_main_loop_xor: \n"; - &xor_stream($A0,$B0,$C0,$D0,"12*16"); $code.=" - lea 16*16($inp), $inp - sub \$16*16, $inl - mov \$6, $itr1 - mov \$4, $itr2 - cmp \$12*16, $inl - jg .Lseal_sse_main_loop - mov $inl, $itr1 - test $inl, $inl - je .Lseal_sse_128_tail_hash - mov \$6, $itr1 - cmp \$8*16, $inl - ja .Lseal_sse_tail_192 - cmp \$4*16, $inl - ja .Lseal_sse_tail_128 -############################################################################### -.Lseal_sse_tail_64: \n"; - &prep_state(1); $code.=" -.Lseal_sse_tail_64_rounds_and_x2hash: \n"; - &poly_add("0($oup)"); - &poly_mul(); $code.=" - lea 16($oup), $oup -.Lseal_sse_tail_64_rounds_and_x1hash: \n"; - &chacha_qr($A0,$B0,$C0,$D0,$T0,"left"); - &chacha_qr($A0,$B0,$C0,$D0,$T0,"right"); - &poly_add("0($oup)"); - &poly_mul(); $code.=" - lea 16($oup), $oup - dec $itr1 - jg .Lseal_sse_tail_64_rounds_and_x2hash - dec $itr2 - jge .Lseal_sse_tail_64_rounds_and_x1hash\n"; - &finalize_state(1); $code.=" - jmp .Lseal_sse_128_tail_xor -############################################################################### -.Lseal_sse_tail_128:\n"; - &prep_state(2); $code.=" -.Lseal_sse_tail_128_rounds_and_x2hash: \n"; - &poly_add("0($oup)"); - &poly_mul(); $code.=" - lea 16($oup), $oup -.Lseal_sse_tail_128_rounds_and_x1hash: \n"; - &chacha_qr($A0,$B0,$C0,$D0,$T0,"left"); - &chacha_qr($A1,$B1,$C1,$D1,$T0,"left"); - &poly_add("0($oup)"); - &poly_mul(); - &chacha_qr($A0,$B0,$C0,$D0,$T0,"right"); - &chacha_qr($A1,$B1,$C1,$D1,$T0,"right"); $code.=" - lea 16($oup), $oup - dec $itr1 - jg .Lseal_sse_tail_128_rounds_and_x2hash - dec $itr2 - jge .Lseal_sse_tail_128_rounds_and_x1hash\n"; - &finalize_state(2); - &xor_stream($A1,$B1,$C1,$D1,0*16); $code.=" - mov \$4*16, $itr1 - sub \$4*16, $inl - lea 4*16($inp), $inp - jmp .Lseal_sse_128_tail_hash -############################################################################### -.Lseal_sse_tail_192:\n"; - &prep_state(3); $code.=" -.Lseal_sse_tail_192_rounds_and_x2hash: \n"; - &poly_add("0($oup)"); - &poly_mul(); $code.=" - lea 16($oup), $oup -.Lseal_sse_tail_192_rounds_and_x1hash: \n"; - &chacha_qr($A0,$B0,$C0,$D0,$T0,"left"); - &chacha_qr($A1,$B1,$C1,$D1,$T0,"left"); - &chacha_qr($A2,$B2,$C2,$D2,$T0,"left"); - &poly_add("0($oup)"); - &poly_mul(); - &chacha_qr($A0,$B0,$C0,$D0,$T0,"right"); - &chacha_qr($A1,$B1,$C1,$D1,$T0,"right"); - &chacha_qr($A2,$B2,$C2,$D2,$T0,"right"); $code.=" - lea 16($oup), $oup - dec $itr1 - jg .Lseal_sse_tail_192_rounds_and_x2hash - dec $itr2 - jge .Lseal_sse_tail_192_rounds_and_x1hash\n"; - &finalize_state(3); - &xor_stream($A2,$B2,$C2,$D2,0*16); - &xor_stream($A1,$B1,$C1,$D1,4*16); $code.=" - mov \$8*16, $itr1 - sub \$8*16, $inl - lea 8*16($inp), $inp -############################################################################### -.Lseal_sse_128_tail_hash: - cmp \$16, $itr1 - jb .Lseal_sse_128_tail_xor\n"; - &poly_add("0($oup)"); - &poly_mul(); $code.=" - sub \$16, $itr1 - lea 16($oup), $oup - jmp .Lseal_sse_128_tail_hash - -.Lseal_sse_128_tail_xor: - cmp \$16, $inl - jb .Lseal_sse_tail_16 - sub \$16, $inl - # Load for decryption - movdqu 0*16($inp), $T0 - pxor $T0, $A0 - movdqu $A0, 0*16($oup) - # Then hash - add 0*8($oup), $acc0 - adc 1*8($oup), $acc1 - adc \$1, $acc2 - lea 1*16($inp), $inp - lea 1*16($oup), $oup\n"; - &poly_mul(); $code.=" - # Shift the stream left - movdqa $B0, $A0 - movdqa $C0, $B0 - movdqa $D0, $C0 - movdqa $A1, $D0 - movdqa $B1, $A1 - movdqa $C1, $B1 - movdqa $D1, $C1 - jmp .Lseal_sse_128_tail_xor - -.Lseal_sse_tail_16: - test $inl, $inl - jz .Lprocess_blocks_of_extra_in - # We can only load the PT one byte at a time to avoid buffer overread - mov $inl, $itr2 - mov $inl, $itr1 - lea -1($inp,$inl), $inp - pxor $T3, $T3 -.Lseal_sse_tail_16_compose: - pslldq \$1, $T3 - pinsrb \$0, ($inp), $T3 - lea -1($inp), $inp - dec $itr1 - jne .Lseal_sse_tail_16_compose - - # XOR the keystream with the plaintext. - pxor $A0, $T3 - - # Write ciphertext out, byte-by-byte. - movq $inl, $itr1 - movdqu $T3, $A0 -.Lseal_sse_tail_16_extract: - pextrb \$0, $A0, ($oup) - psrldq \$1, $A0 - add \$1, $oup - sub \$1, $itr1 - jnz .Lseal_sse_tail_16_extract - - # $T3 contains the final (partial, non-empty) block of ciphertext which - # needs to be fed into the Poly1305 state. The right-most $inl bytes of it - # are valid. We need to fill it with extra_in bytes until full, or until we - # run out of bytes. - # - # $keyp points to the tag output, which is actually a struct with the - # extra_in pointer and length at offset 48. - movq 288 + $xmm_storage + 32(%rsp), $keyp - movq 56($keyp), $t1 # extra_in_len - movq 48($keyp), $t0 # extra_in - test $t1, $t1 - jz .Lprocess_partial_block # Common case: no bytes of extra_in - - movq \$16, $t2 - subq $inl, $t2 # 16-$inl is the number of bytes that fit into $T3. - cmpq $t2, $t1 # if extra_in_len < 16-$inl, only copy extra_in_len - # (note that AT&T syntax reverses the arguments) - jge .Lload_extra_in - movq $t1, $t2 - -.Lload_extra_in: - # $t2 contains the number of bytes of extra_in (pointed to by $t0) to load - # into $T3. They are loaded in reverse order. - leaq -1($t0,$t2), $inp - # Update extra_in and extra_in_len to reflect the bytes that are about to - # be read. - addq $t2, $t0 - subq $t2, $t1 - movq $t0, 48($keyp) - movq $t1, 56($keyp) - - # Update $itr2, which is used to select the mask later on, to reflect the - # extra bytes about to be added. - addq $t2, $itr2 - - # Load $t2 bytes of extra_in into $T2. - pxor $T2, $T2 -.Lload_extra_load_loop: - pslldq \$1, $T2 - pinsrb \$0, ($inp), $T2 - lea -1($inp), $inp - sub \$1, $t2 - jnz .Lload_extra_load_loop - - # Shift $T2 up the length of the remainder from the main encryption. Sadly, - # the shift for an XMM register has to be a constant, thus we loop to do - # this. - movq $inl, $t2 - -.Lload_extra_shift_loop: - pslldq \$1, $T2 - sub \$1, $t2 - jnz .Lload_extra_shift_loop - - # Mask $T3 (the remainder from the main encryption) so that superfluous - # bytes are zero. This means that the non-zero bytes in $T2 and $T3 are - # disjoint and so we can merge them with an OR. - lea .Land_masks(%rip), $t2 - shl \$4, $inl - pand -16($t2,$inl), $T3 - - # Merge $T2 into $T3, forming the remainder block. - por $T2, $T3 - - # The block of ciphertext + extra_in is ready to be included in the - # Poly1305 state. - movq $T3, $t0 - pextrq \$1, $T3, $t1 - add $t0, $acc0 - adc $t1, $acc1 - adc \$1, $acc2\n"; - &poly_mul(); $code.=" - -.Lprocess_blocks_of_extra_in: - # There may be additional bytes of extra_in to process. - movq 288+32+$xmm_storage (%rsp), $keyp - movq 48($keyp), $inp # extra_in - movq 56($keyp), $itr2 # extra_in_len - movq $itr2, $itr1 - shr \$4, $itr2 # number of blocks - -.Lprocess_extra_hash_loop: - jz process_extra_in_trailer\n"; - &poly_add("0($inp)"); - &poly_mul(); $code.=" - leaq 16($inp), $inp - subq \$1, $itr2 - jmp .Lprocess_extra_hash_loop -process_extra_in_trailer: - andq \$15, $itr1 # remaining num bytes (<16) of extra_in - movq $itr1, $inl - jz .Ldo_length_block - leaq -1($inp,$itr1), $inp - -.Lprocess_extra_in_trailer_load: - pslldq \$1, $T3 - pinsrb \$0, ($inp), $T3 - lea -1($inp), $inp - sub \$1, $itr1 - jnz .Lprocess_extra_in_trailer_load - -.Lprocess_partial_block: - # $T3 contains $inl bytes of data to be fed into Poly1305. $inl != 0 - lea .Land_masks(%rip), $t2 - shl \$4, $inl - pand -16($t2,$inl), $T3 - movq $T3, $t0 - pextrq \$1, $T3, $t1 - add $t0, $acc0 - adc $t1, $acc1 - adc \$1, $acc2\n"; - &poly_mul(); $code.=" - -.Ldo_length_block:\n"; - &poly_add($len_store); - &poly_mul(); $code.=" - # Final reduce - mov $acc0, $t0 - mov $acc1, $t1 - mov $acc2, $t2 - sub \$-5, $acc0 - sbb \$-1, $acc1 - sbb \$3, $acc2 - cmovc $t0, $acc0 - cmovc $t1, $acc1 - cmovc $t2, $acc2 - # Add in s part of the key - add 0+$s_store, $acc0 - adc 8+$s_store, $acc1\n"; - -$code.=" - movaps 16*0+$xmm_store, %xmm6 - movaps 16*1+$xmm_store, %xmm7 - movaps 16*2+$xmm_store, %xmm8 - movaps 16*3+$xmm_store, %xmm9 - movaps 16*4+$xmm_store, %xmm10 - movaps 16*5+$xmm_store, %xmm11 - movaps 16*6+$xmm_store, %xmm12 - movaps 16*7+$xmm_store, %xmm13 - movaps 16*8+$xmm_store, %xmm14 - movaps 16*9+$xmm_store, %xmm15\n" if ($win64); -$code.=" -.cfi_remember_state - add \$288 + $xmm_storage + 32, %rsp -.cfi_adjust_cfa_offset -(288 + 32) - # The tag replaces the key on return - pop $keyp -.cfi_pop $keyp - mov $acc0, ($keyp) - mov $acc1, 8($keyp) - pop %r15 -.cfi_pop %r15 - pop %r14 -.cfi_pop %r14 - pop %r13 -.cfi_pop %r13 - pop %r12 -.cfi_pop %r12 - pop %rbx -.cfi_pop %rbx - pop %rbp -.cfi_pop %rbp - ret -################################################################################ -.Lseal_sse_128: -.cfi_restore_state - movdqu .Lchacha20_consts(%rip), $A0\nmovdqa $A0, $A1\nmovdqa $A0, $A2 - movdqu 0*16($keyp), $B0\nmovdqa $B0, $B1\nmovdqa $B0, $B2 - movdqu 1*16($keyp), $C0\nmovdqa $C0, $C1\nmovdqa $C0, $C2 - movdqu 2*16($keyp), $D2 - movdqa $D2, $D0\npaddd .Lsse_inc(%rip), $D0 - movdqa $D0, $D1\npaddd .Lsse_inc(%rip), $D1 - movdqa $B0, $T1\nmovdqa $C0, $T2\nmovdqa $D0, $T3 - mov \$10, $acc0 - -.Lseal_sse_128_rounds:\n"; - &chacha_qr($A0,$B0,$C0,$D0,$T0,"left"); - &chacha_qr($A1,$B1,$C1,$D1,$T0,"left"); - &chacha_qr($A2,$B2,$C2,$D2,$T0,"left"); - &chacha_qr($A0,$B0,$C0,$D0,$T0,"right"); - &chacha_qr($A1,$B1,$C1,$D1,$T0,"right"); - &chacha_qr($A2,$B2,$C2,$D2,$T0,"right"); $code.=" - dec $acc0 - jnz .Lseal_sse_128_rounds - paddd .Lchacha20_consts(%rip), $A0 - paddd .Lchacha20_consts(%rip), $A1 - paddd .Lchacha20_consts(%rip), $A2 - paddd $T1, $B0\npaddd $T1, $B1\npaddd $T1, $B2 - paddd $T2, $C0\npaddd $T2, $C1 - paddd $T3, $D0 - paddd .Lsse_inc(%rip), $T3 - paddd $T3, $D1 - # Clamp and store the key - pand .Lclamp(%rip), $A2 - movdqa $A2, $r_store - movdqa $B2, $s_store - # Hash - mov %r8, $itr2 - call poly_hash_ad_internal - jmp .Lseal_sse_128_tail_xor -.size GFp_chacha20_poly1305_seal, .-GFp_chacha20_poly1305_seal -.cfi_endproc\n"; -} - -if ($avx>1) { - -($A0,$A1,$A2,$A3,$B0,$B1,$B2,$B3,$C0,$C1,$C2,$C3,$D0,$D1,$D2,$D3)=map("%ymm$_",(0..15)); -my ($A0x,$A1x,$A2x,$A3x,$B0x,$B1x,$B2x,$B3x,$C0x,$C1x,$C2x,$C3x,$D0x,$D1x,$D2x,$D3x)=map("%xmm$_",(0..15)); -($T0,$T1,$T2,$T3)=($A3,$B3,$C3,$D3); -$state1_store="$xmm_storage+2*32(%rbp)"; -$state2_store="$xmm_storage+3*32(%rbp)"; -$tmp_store="$xmm_storage+4*32(%rbp)"; -$ctr0_store="$xmm_storage+5*32(%rbp)"; -$ctr1_store="$xmm_storage+6*32(%rbp)"; -$ctr2_store="$xmm_storage+7*32(%rbp)"; -$ctr3_store="$xmm_storage+8*32(%rbp)"; - -sub chacha_qr_avx2 { -my ($a,$b,$c,$d,$t,$dir)=@_; -$code.=<<___ if ($dir =~ /store/); - vmovdqa $t, $tmp_store -___ -$code.=<<___; - vpaddd $b, $a, $a - vpxor $a, $d, $d - vpshufb .Lrol16(%rip), $d, $d - vpaddd $d, $c, $c - vpxor $c, $b, $b - vpsrld \$20, $b, $t - vpslld \$12, $b, $b - vpxor $t, $b, $b - vpaddd $b, $a, $a - vpxor $a, $d, $d - vpshufb .Lrol8(%rip), $d, $d - vpaddd $d, $c, $c - vpxor $c, $b, $b - vpslld \$7, $b, $t - vpsrld \$25, $b, $b - vpxor $t, $b, $b -___ -$code.=<<___ if ($dir =~ /left/); - vpalignr \$12, $d, $d, $d - vpalignr \$8, $c, $c, $c - vpalignr \$4, $b, $b, $b -___ -$code.=<<___ if ($dir =~ /right/); - vpalignr \$4, $d, $d, $d - vpalignr \$8, $c, $c, $c - vpalignr \$12, $b, $b, $b -___ -$code.=<<___ if ($dir =~ /load/); - vmovdqa $tmp_store, $t -___ -} - -sub prep_state_avx2 { -my ($n)=@_; -$code.=<<___; - vmovdqa .Lchacha20_consts(%rip), $A0 - vmovdqa $state1_store, $B0 - vmovdqa $state2_store, $C0 -___ -$code.=<<___ if ($n ge 2); - vmovdqa $A0, $A1 - vmovdqa $B0, $B1 - vmovdqa $C0, $C1 -___ -$code.=<<___ if ($n ge 3); - vmovdqa $A0, $A2 - vmovdqa $B0, $B2 - vmovdqa $C0, $C2 -___ -$code.=<<___ if ($n ge 4); - vmovdqa $A0, $A3 - vmovdqa $B0, $B3 - vmovdqa $C0, $C3 -___ -$code.=<<___ if ($n eq 1); - vmovdqa .Lavx2_inc(%rip), $D0 - vpaddd $ctr0_store, $D0, $D0 - vmovdqa $D0, $ctr0_store -___ -$code.=<<___ if ($n eq 2); - vmovdqa .Lavx2_inc(%rip), $D0 - vpaddd $ctr0_store, $D0, $D1 - vpaddd $D1, $D0, $D0 - vmovdqa $D0, $ctr0_store - vmovdqa $D1, $ctr1_store -___ -$code.=<<___ if ($n eq 3); - vmovdqa .Lavx2_inc(%rip), $D0 - vpaddd $ctr0_store, $D0, $D2 - vpaddd $D2, $D0, $D1 - vpaddd $D1, $D0, $D0 - vmovdqa $D0, $ctr0_store - vmovdqa $D1, $ctr1_store - vmovdqa $D2, $ctr2_store -___ -$code.=<<___ if ($n eq 4); - vmovdqa .Lavx2_inc(%rip), $D0 - vpaddd $ctr0_store, $D0, $D3 - vpaddd $D3, $D0, $D2 - vpaddd $D2, $D0, $D1 - vpaddd $D1, $D0, $D0 - vmovdqa $D3, $ctr3_store - vmovdqa $D2, $ctr2_store - vmovdqa $D1, $ctr1_store - vmovdqa $D0, $ctr0_store -___ -} - -sub finalize_state_avx2 { -my ($n)=@_; -$code.=<<___ if ($n eq 4); - vpaddd .Lchacha20_consts(%rip), $A3, $A3 - vpaddd $state1_store, $B3, $B3 - vpaddd $state2_store, $C3, $C3 - vpaddd $ctr3_store, $D3, $D3 -___ -$code.=<<___ if ($n ge 3); - vpaddd .Lchacha20_consts(%rip), $A2, $A2 - vpaddd $state1_store, $B2, $B2 - vpaddd $state2_store, $C2, $C2 - vpaddd $ctr2_store, $D2, $D2 -___ -$code.=<<___ if ($n ge 2); - vpaddd .Lchacha20_consts(%rip), $A1, $A1 - vpaddd $state1_store, $B1, $B1 - vpaddd $state2_store, $C1, $C1 - vpaddd $ctr1_store, $D1, $D1 -___ -$code.=<<___; - vpaddd .Lchacha20_consts(%rip), $A0, $A0 - vpaddd $state1_store, $B0, $B0 - vpaddd $state2_store, $C0, $C0 - vpaddd $ctr0_store, $D0, $D0 -___ -} - -sub xor_stream_avx2 { -my ($A, $B, $C, $D, $offset, $hlp)=@_; -$code.=<<___; - vperm2i128 \$0x02, $A, $B, $hlp - vperm2i128 \$0x13, $A, $B, $B - vperm2i128 \$0x02, $C, $D, $A - vperm2i128 \$0x13, $C, $D, $C - vpxor 0*32+$offset($inp), $hlp, $hlp - vpxor 1*32+$offset($inp), $A, $A - vpxor 2*32+$offset($inp), $B, $B - vpxor 3*32+$offset($inp), $C, $C - vmovdqu $hlp, 0*32+$offset($oup) - vmovdqu $A, 1*32+$offset($oup) - vmovdqu $B, 2*32+$offset($oup) - vmovdqu $C, 3*32+$offset($oup) -___ -} - -sub finish_stream_avx2 { -my ($A, $B, $C, $D, $hlp)=@_; -$code.=<<___; - vperm2i128 \$0x13, $A, $B, $hlp - vperm2i128 \$0x02, $A, $B, $A - vperm2i128 \$0x02, $C, $D, $B - vperm2i128 \$0x13, $C, $D, $D - vmovdqa $hlp, $C -___ -} - -sub poly_stage1_mulx { -$code.=<<___; - mov 0+$r_store, %rdx - mov %rdx, $t2 - mulx $acc0, $t0, $t1 - mulx $acc1, %rax, %rdx - imulq $acc2, $t2 - add %rax, $t1 - adc %rdx, $t2 -___ -} - -sub poly_stage2_mulx { -$code.=<<___; - mov 8+$r_store, %rdx - mulx $acc0, $acc0, %rax - add $acc0, $t1 - mulx $acc1, $acc1, $t3 - adc $acc1, $t2 - adc \$0, $t3 - imulq $acc2, %rdx -___ -} - -sub poly_stage3_mulx { -$code.=<<___; - add %rax, $t2 - adc %rdx, $t3 -___ -} - -sub poly_mul_mulx { - &poly_stage1_mulx(); - &poly_stage2_mulx(); - &poly_stage3_mulx(); - &poly_reduce_stage(); -} - -sub gen_chacha_round_avx2 { -my ($rot1, $rot2, $shift)=@_; -my $round=""; -$round=$round ."vmovdqa $C0, $tmp_store\n" if ($rot1 eq 20); -$round=$round ."vmovdqa $rot2, $C0 - vpaddd $B3, $A3, $A3 - vpaddd $B2, $A2, $A2 - vpaddd $B1, $A1, $A1 - vpaddd $B0, $A0, $A0 - vpxor $A3, $D3, $D3 - vpxor $A2, $D2, $D2 - vpxor $A1, $D1, $D1 - vpxor $A0, $D0, $D0 - vpshufb $C0, $D3, $D3 - vpshufb $C0, $D2, $D2 - vpshufb $C0, $D1, $D1 - vpshufb $C0, $D0, $D0 - vpaddd $D3, $C3, $C3 - vpaddd $D2, $C2, $C2 - vpaddd $D1, $C1, $C1 - vpaddd $tmp_store, $D0, $C0 - vpxor $C3, $B3, $B3 - vpxor $C2, $B2, $B2 - vpxor $C1, $B1, $B1 - vpxor $C0, $B0, $B0 - vmovdqa $C0, $tmp_store - vpsrld \$$rot1, $B3, $C0 - vpslld \$32-$rot1, $B3, $B3 - vpxor $C0, $B3, $B3 - vpsrld \$$rot1, $B2, $C0 - vpslld \$32-$rot1, $B2, $B2 - vpxor $C0, $B2, $B2 - vpsrld \$$rot1, $B1, $C0 - vpslld \$32-$rot1, $B1, $B1 - vpxor $C0, $B1, $B1 - vpsrld \$$rot1, $B0, $C0 - vpslld \$32-$rot1, $B0, $B0 - vpxor $C0, $B0, $B0\n"; -($s1,$s2,$s3)=(4,8,12) if ($shift =~ /left/); -($s1,$s2,$s3)=(12,8,4) if ($shift =~ /right/); -$round=$round ."vmovdqa $tmp_store, $C0 - vpalignr \$$s1, $B3, $B3, $B3 - vpalignr \$$s2, $C3, $C3, $C3 - vpalignr \$$s3, $D3, $D3, $D3 - vpalignr \$$s1, $B2, $B2, $B2 - vpalignr \$$s2, $C2, $C2, $C2 - vpalignr \$$s3, $D2, $D2, $D2 - vpalignr \$$s1, $B1, $B1, $B1 - vpalignr \$$s2, $C1, $C1, $C1 - vpalignr \$$s3, $D1, $D1, $D1 - vpalignr \$$s1, $B0, $B0, $B0 - vpalignr \$$s2, $C0, $C0, $C0 - vpalignr \$$s3, $D0, $D0, $D0\n" -if (($shift =~ /left/) || ($shift =~ /right/)); -return $round; -}; - -$chacha_body = &gen_chacha_round_avx2(20, ".Lrol16(%rip)") . - &gen_chacha_round_avx2(25, ".Lrol8(%rip)", "left") . - &gen_chacha_round_avx2(20, ".Lrol16(%rip)") . - &gen_chacha_round_avx2(25, ".Lrol8(%rip)", "right"); - -@loop_body = split /\n/, $chacha_body; - -$code.=" -############################################################################### -.type chacha20_poly1305_open_avx2,\@abi-omnipotent -.align 64 -chacha20_poly1305_open_avx2: -.cfi_startproc - -# Since the AVX2 function operates in the frame of the SSE function, we just copy the frame state to over here -.cfi_push %rbp -.cfi_push %rbx -.cfi_push %r12 -.cfi_push %r13 -.cfi_push %r14 -.cfi_push %r15 -.cfi_push $keyp -.cfi_adjust_cfa_offset 288 + 32 - - vzeroupper - vmovdqa .Lchacha20_consts(%rip), $A0 - vbroadcasti128 0*16($keyp), $B0 - vbroadcasti128 1*16($keyp), $C0 - vbroadcasti128 2*16($keyp), $D0 - vpaddd .Lavx2_init(%rip), $D0, $D0 - cmp \$6*32, $inl - jbe .Lopen_avx2_192 - cmp \$10*32, $inl - jbe .Lopen_avx2_320 - - vmovdqa $B0, $state1_store - vmovdqa $C0, $state2_store - vmovdqa $D0, $ctr0_store - mov \$10, $acc0 -.Lopen_avx2_init_rounds: \n"; - &chacha_qr_avx2($A0,$B0,$C0,$D0,$T0,"left"); - &chacha_qr_avx2($A0,$B0,$C0,$D0,$T0,"right"); $code.=" - dec $acc0 - jne .Lopen_avx2_init_rounds - vpaddd .Lchacha20_consts(%rip), $A0, $A0 - vpaddd $state1_store, $B0, $B0 - vpaddd $state2_store, $C0, $C0 - vpaddd $ctr0_store, $D0, $D0 - - vperm2i128 \$0x02, $A0, $B0, $T0 - # Clamp and store key - vpand .Lclamp(%rip), $T0, $T0 - vmovdqa $T0, $r_store - # Stream for the first 64 bytes - vperm2i128 \$0x13, $A0, $B0, $A0 - vperm2i128 \$0x13, $C0, $D0, $B0 - # Hash AD + first 64 bytes - mov $adl, $itr2 - call poly_hash_ad_internal - # Hash first 64 bytes - xor $itr1, $itr1 -.Lopen_avx2_init_hash: \n"; - &poly_add("0($inp,$itr1)"); - &poly_mul(); $code.=" - add \$16, $itr1 - cmp \$2*32, $itr1 - jne .Lopen_avx2_init_hash - # Decrypt first 64 bytes - vpxor 0*32($inp), $A0, $A0 - vpxor 1*32($inp), $B0, $B0 - # Store first 64 bytes of decrypted data - vmovdqu $A0, 0*32($oup) - vmovdqu $B0, 1*32($oup) - lea 2*32($inp), $inp - lea 2*32($oup), $oup - sub \$2*32, $inl -.Lopen_avx2_main_loop: - # Hash and decrypt 512 bytes each iteration - cmp \$16*32, $inl - jb .Lopen_avx2_main_loop_done\n"; - &prep_state_avx2(4); $code.=" - xor $itr1, $itr1 -.Lopen_avx2_main_loop_rounds: \n"; - &poly_add("0*8($inp,$itr1)"); - &emit_body(10); - &poly_stage1_mulx(); - &emit_body(9); - &poly_stage2_mulx(); - &emit_body(12); - &poly_stage3_mulx(); - &emit_body(10); - &poly_reduce_stage(); - &emit_body(9); - &poly_add("2*8($inp,$itr1)"); - &emit_body(8); - &poly_stage1_mulx(); - &emit_body(18); - &poly_stage2_mulx(); - &emit_body(18); - &poly_stage3_mulx(); - &emit_body(9); - &poly_reduce_stage(); - &emit_body(8); - &poly_add("4*8($inp,$itr1)"); $code.=" - lea 6*8($itr1), $itr1\n"; - &emit_body(18); - &poly_stage1_mulx(); - &emit_body(8); - &poly_stage2_mulx(); - &emit_body(8); - &poly_stage3_mulx(); - &emit_body(18); - &poly_reduce_stage(); - foreach $l (@loop_body) {$code.=$l."\n";} - @loop_body = split /\n/, $chacha_body; $code.=" - cmp \$10*6*8, $itr1 - jne .Lopen_avx2_main_loop_rounds\n"; - &finalize_state_avx2(4); $code.=" - vmovdqa $A0, $tmp_store\n"; - &poly_add("10*6*8($inp)"); - &xor_stream_avx2($A3, $B3, $C3, $D3, 0*32, $A0); $code.=" - vmovdqa $tmp_store, $A0\n"; - &poly_mul(); - &xor_stream_avx2($A2, $B2, $C2, $D2, 4*32, $A3); - &poly_add("10*6*8+2*8($inp)"); - &xor_stream_avx2($A1, $B1, $C1, $D1, 8*32, $A3); - &poly_mul(); - &xor_stream_avx2($A0, $B0, $C0, $D0, 12*32, $A3); $code.=" - lea 16*32($inp), $inp - lea 16*32($oup), $oup - sub \$16*32, $inl - jmp .Lopen_avx2_main_loop -.Lopen_avx2_main_loop_done: - test $inl, $inl - vzeroupper - je .Lopen_sse_finalize - - cmp \$12*32, $inl - ja .Lopen_avx2_tail_512 - cmp \$8*32, $inl - ja .Lopen_avx2_tail_384 - cmp \$4*32, $inl - ja .Lopen_avx2_tail_256\n"; -############################################################################### - # 1-128 bytes left - &prep_state_avx2(1); $code.=" - xor $itr2, $itr2 - mov $inl, $itr1 - and \$-16, $itr1 - test $itr1, $itr1 - je .Lopen_avx2_tail_128_rounds # Have nothing to hash -.Lopen_avx2_tail_128_rounds_and_x1hash: \n"; - &poly_add("0*8($inp,$itr2)"); - &poly_mul(); $code.=" -.Lopen_avx2_tail_128_rounds: - add \$16, $itr2\n"; - &chacha_qr_avx2($A0,$B0,$C0,$D0,$T0,"left"); - &chacha_qr_avx2($A0,$B0,$C0,$D0,$T0,"right"); $code.=" - cmp $itr1, $itr2 - jb .Lopen_avx2_tail_128_rounds_and_x1hash - cmp \$160, $itr2 - jne .Lopen_avx2_tail_128_rounds\n"; - &finalize_state_avx2(1); - &finish_stream_avx2($A0,$B0,$C0,$D0,$T0); $code.=" - jmp .Lopen_avx2_tail_128_xor -############################################################################### -.Lopen_avx2_tail_256: \n"; - # 129-256 bytes left - &prep_state_avx2(2); $code.=" - mov $inl, $tmp_store - mov $inl, $itr1 - sub \$4*32, $itr1 - shr \$4, $itr1 - mov \$10, $itr2 - cmp \$10, $itr1 - cmovg $itr2, $itr1 - mov $inp, $inl - xor $itr2, $itr2 -.Lopen_avx2_tail_256_rounds_and_x1hash: \n"; - &poly_add("0*8($inl)"); - &poly_mul_mulx(); $code.=" - lea 16($inl), $inl -.Lopen_avx2_tail_256_rounds: \n"; - &chacha_qr_avx2($A0,$B0,$C0,$D0,$T0,"left"); - &chacha_qr_avx2($A1,$B1,$C1,$D1,$T0,"left"); $code.=" - inc $itr2\n"; - &chacha_qr_avx2($A0,$B0,$C0,$D0,$T0,"right"); - &chacha_qr_avx2($A1,$B1,$C1,$D1,$T0,"right"); - &chacha_qr_avx2($A2,$B2,$C2,$D2,$T0,"right"); $code.=" - cmp $itr1, $itr2 - jb .Lopen_avx2_tail_256_rounds_and_x1hash - cmp \$10, $itr2 - jne .Lopen_avx2_tail_256_rounds - mov $inl, $itr2 - sub $inp, $inl - mov $inl, $itr1 - mov $tmp_store, $inl -.Lopen_avx2_tail_256_hash: - add \$16, $itr1 - cmp $inl, $itr1 - jg .Lopen_avx2_tail_256_done\n"; - &poly_add("0*8($itr2)"); - &poly_mul_mulx(); $code.=" - lea 16($itr2), $itr2 - jmp .Lopen_avx2_tail_256_hash -.Lopen_avx2_tail_256_done: \n"; - &finalize_state_avx2(2); - &xor_stream_avx2($A1, $B1, $C1, $D1, 0*32, $T0); - &finish_stream_avx2($A0, $B0, $C0, $D0, $T0); $code.=" - lea 4*32($inp), $inp - lea 4*32($oup), $oup - sub \$4*32, $inl - jmp .Lopen_avx2_tail_128_xor -############################################################################### -.Lopen_avx2_tail_384: \n"; - # 257-383 bytes left - &prep_state_avx2(3); $code.=" - mov $inl, $tmp_store - mov $inl, $itr1 - sub \$8*32, $itr1 - shr \$4, $itr1 - add \$6, $itr1 - mov \$10, $itr2 - cmp \$10, $itr1 - cmovg $itr2, $itr1 - mov $inp, $inl - xor $itr2, $itr2 -.Lopen_avx2_tail_384_rounds_and_x2hash: \n"; - &poly_add("0*8($inl)"); - &poly_mul_mulx(); $code.=" - lea 16($inl), $inl -.Lopen_avx2_tail_384_rounds_and_x1hash: \n"; - &chacha_qr_avx2($A2,$B2,$C2,$D2,$T0,"left"); - &chacha_qr_avx2($A1,$B1,$C1,$D1,$T0,"left"); - &chacha_qr_avx2($A0,$B0,$C0,$D0,$T0,"left"); - &poly_add("0*8($inl)"); - &poly_mul(); $code.=" - lea 16($inl), $inl - inc $itr2\n"; - &chacha_qr_avx2($A2,$B2,$C2,$D2,$T0,"right"); - &chacha_qr_avx2($A1,$B1,$C1,$D1,$T0,"right"); - &chacha_qr_avx2($A0,$B0,$C0,$D0,$T0,"right"); $code.=" - cmp $itr1, $itr2 - jb .Lopen_avx2_tail_384_rounds_and_x2hash - cmp \$10, $itr2 - jne .Lopen_avx2_tail_384_rounds_and_x1hash - mov $inl, $itr2 - sub $inp, $inl - mov $inl, $itr1 - mov $tmp_store, $inl -.Lopen_avx2_384_tail_hash: - add \$16, $itr1 - cmp $inl, $itr1 - jg .Lopen_avx2_384_tail_done\n"; - &poly_add("0*8($itr2)"); - &poly_mul_mulx(); $code.=" - lea 16($itr2), $itr2 - jmp .Lopen_avx2_384_tail_hash -.Lopen_avx2_384_tail_done: \n"; - &finalize_state_avx2(3); - &xor_stream_avx2($A2, $B2, $C2, $D2, 0*32, $T0); - &xor_stream_avx2($A1, $B1, $C1, $D1, 4*32, $T0); - &finish_stream_avx2($A0, $B0, $C0, $D0, $T0); $code.=" - lea 8*32($inp), $inp - lea 8*32($oup), $oup - sub \$8*32, $inl - jmp .Lopen_avx2_tail_128_xor -############################################################################### -.Lopen_avx2_tail_512: \n"; - # 384-512 bytes left - &prep_state_avx2(4); $code.=" - xor $itr1, $itr1 - mov $inp, $itr2 -.Lopen_avx2_tail_512_rounds_and_x2hash: \n"; - &poly_add("0*8($itr2)"); - &poly_mul(); $code.=" - lea 2*8($itr2), $itr2 -.Lopen_avx2_tail_512_rounds_and_x1hash: \n"; - &emit_body(37); - &poly_add("0*8($itr2)"); - &poly_mul_mulx(); - &emit_body(48); - &poly_add("2*8($itr2)"); - &poly_mul_mulx(); $code.=" - lea 4*8($itr2), $itr2\n"; - foreach $l (@loop_body) {$code.=$l."\n";} - @loop_body = split /\n/, $chacha_body; $code.=" - inc $itr1 - cmp \$4, $itr1 - jl .Lopen_avx2_tail_512_rounds_and_x2hash - cmp \$10, $itr1 - jne .Lopen_avx2_tail_512_rounds_and_x1hash - mov $inl, $itr1 - sub \$12*32, $itr1 - and \$-16, $itr1 -.Lopen_avx2_tail_512_hash: - test $itr1, $itr1 - je .Lopen_avx2_tail_512_done\n"; - &poly_add("0*8($itr2)"); - &poly_mul_mulx(); $code.=" - lea 2*8($itr2), $itr2 - sub \$2*8, $itr1 - jmp .Lopen_avx2_tail_512_hash -.Lopen_avx2_tail_512_done: \n"; - &finalize_state_avx2(4); $code.=" - vmovdqa $A0, $tmp_store\n"; - &xor_stream_avx2($A3, $B3, $C3, $D3, 0*32, $A0); $code.=" - vmovdqa $tmp_store, $A0\n"; - &xor_stream_avx2($A2, $B2, $C2, $D2, 4*32, $A3); - &xor_stream_avx2($A1, $B1, $C1, $D1, 8*32, $A3); - &finish_stream_avx2($A0, $B0, $C0, $D0, $A3); $code.=" - lea 12*32($inp), $inp - lea 12*32($oup), $oup - sub \$12*32, $inl -.Lopen_avx2_tail_128_xor: - cmp \$32, $inl - jb .Lopen_avx2_tail_32_xor - sub \$32, $inl - vpxor ($inp), $A0, $A0 - vmovdqu $A0, ($oup) - lea 1*32($inp), $inp - lea 1*32($oup), $oup - vmovdqa $B0, $A0 - vmovdqa $C0, $B0 - vmovdqa $D0, $C0 - jmp .Lopen_avx2_tail_128_xor -.Lopen_avx2_tail_32_xor: - cmp \$16, $inl - vmovdqa $A0x, $A1x - jb .Lopen_avx2_exit - sub \$16, $inl - #load for decryption - vpxor ($inp), $A0x, $A1x - vmovdqu $A1x, ($oup) - lea 1*16($inp), $inp - lea 1*16($oup), $oup - vperm2i128 \$0x11, $A0, $A0, $A0 - vmovdqa $A0x, $A1x -.Lopen_avx2_exit: - vzeroupper - jmp .Lopen_sse_tail_16 -############################################################################### -.Lopen_avx2_192: - vmovdqa $A0, $A1 - vmovdqa $A0, $A2 - vmovdqa $B0, $B1 - vmovdqa $B0, $B2 - vmovdqa $C0, $C1 - vmovdqa $C0, $C2 - vpaddd .Lavx2_inc(%rip), $D0, $D1 - vmovdqa $D0, $T2 - vmovdqa $D1, $T3 - mov \$10, $acc0 -.Lopen_avx2_192_rounds: \n"; - &chacha_qr_avx2($A0,$B0,$C0,$D0,$T0,"left"); - &chacha_qr_avx2($A1,$B1,$C1,$D1,$T0,"left"); - &chacha_qr_avx2($A0,$B0,$C0,$D0,$T0,"right"); - &chacha_qr_avx2($A1,$B1,$C1,$D1,$T0,"right"); $code.=" - dec $acc0 - jne .Lopen_avx2_192_rounds - vpaddd $A2, $A0, $A0 - vpaddd $A2, $A1, $A1 - vpaddd $B2, $B0, $B0 - vpaddd $B2, $B1, $B1 - vpaddd $C2, $C0, $C0 - vpaddd $C2, $C1, $C1 - vpaddd $T2, $D0, $D0 - vpaddd $T3, $D1, $D1 - vperm2i128 \$0x02, $A0, $B0, $T0 - # Clamp and store the key - vpand .Lclamp(%rip), $T0, $T0 - vmovdqa $T0, $r_store - # Stream for up to 192 bytes - vperm2i128 \$0x13, $A0, $B0, $A0 - vperm2i128 \$0x13, $C0, $D0, $B0 - vperm2i128 \$0x02, $A1, $B1, $C0 - vperm2i128 \$0x02, $C1, $D1, $D0 - vperm2i128 \$0x13, $A1, $B1, $A1 - vperm2i128 \$0x13, $C1, $D1, $B1 -.Lopen_avx2_short: - mov $adl, $itr2 - call poly_hash_ad_internal -.Lopen_avx2_short_hash_and_xor_loop: - cmp \$32, $inl - jb .Lopen_avx2_short_tail_32 - sub \$32, $inl\n"; - # Load + hash - &poly_add("0*8($inp)"); - &poly_mul(); - &poly_add("2*8($inp)"); - &poly_mul(); $code.=" - # Load + decrypt - vpxor ($inp), $A0, $A0 - vmovdqu $A0, ($oup) - lea 1*32($inp), $inp - lea 1*32($oup), $oup - # Shift stream - vmovdqa $B0, $A0 - vmovdqa $C0, $B0 - vmovdqa $D0, $C0 - vmovdqa $A1, $D0 - vmovdqa $B1, $A1 - vmovdqa $C1, $B1 - vmovdqa $D1, $C1 - vmovdqa $A2, $D1 - vmovdqa $B2, $A2 - jmp .Lopen_avx2_short_hash_and_xor_loop -.Lopen_avx2_short_tail_32: - cmp \$16, $inl - vmovdqa $A0x, $A1x - jb .Lopen_avx2_short_tail_32_exit - sub \$16, $inl\n"; - &poly_add("0*8($inp)"); - &poly_mul(); $code.=" - vpxor ($inp), $A0x, $A3x - vmovdqu $A3x, ($oup) - lea 1*16($inp), $inp - lea 1*16($oup), $oup - vextracti128 \$1, $A0, $A1x -.Lopen_avx2_short_tail_32_exit: - vzeroupper - jmp .Lopen_sse_tail_16 -############################################################################### -.Lopen_avx2_320: - vmovdqa $A0, $A1 - vmovdqa $A0, $A2 - vmovdqa $B0, $B1 - vmovdqa $B0, $B2 - vmovdqa $C0, $C1 - vmovdqa $C0, $C2 - vpaddd .Lavx2_inc(%rip), $D0, $D1 - vpaddd .Lavx2_inc(%rip), $D1, $D2 - vmovdqa $B0, $T1 - vmovdqa $C0, $T2 - vmovdqa $D0, $ctr0_store - vmovdqa $D1, $ctr1_store - vmovdqa $D2, $ctr2_store - mov \$10, $acc0 -.Lopen_avx2_320_rounds: \n"; - &chacha_qr_avx2($A0,$B0,$C0,$D0,$T0,"left"); - &chacha_qr_avx2($A1,$B1,$C1,$D1,$T0,"left"); - &chacha_qr_avx2($A2,$B2,$C2,$D2,$T0,"left"); - &chacha_qr_avx2($A0,$B0,$C0,$D0,$T0,"right"); - &chacha_qr_avx2($A1,$B1,$C1,$D1,$T0,"right"); - &chacha_qr_avx2($A2,$B2,$C2,$D2,$T0,"right"); $code.=" - dec $acc0 - jne .Lopen_avx2_320_rounds - vpaddd .Lchacha20_consts(%rip), $A0, $A0 - vpaddd .Lchacha20_consts(%rip), $A1, $A1 - vpaddd .Lchacha20_consts(%rip), $A2, $A2 - vpaddd $T1, $B0, $B0 - vpaddd $T1, $B1, $B1 - vpaddd $T1, $B2, $B2 - vpaddd $T2, $C0, $C0 - vpaddd $T2, $C1, $C1 - vpaddd $T2, $C2, $C2 - vpaddd $ctr0_store, $D0, $D0 - vpaddd $ctr1_store, $D1, $D1 - vpaddd $ctr2_store, $D2, $D2 - vperm2i128 \$0x02, $A0, $B0, $T0 - # Clamp and store the key - vpand .Lclamp(%rip), $T0, $T0 - vmovdqa $T0, $r_store - # Stream for up to 320 bytes - vperm2i128 \$0x13, $A0, $B0, $A0 - vperm2i128 \$0x13, $C0, $D0, $B0 - vperm2i128 \$0x02, $A1, $B1, $C0 - vperm2i128 \$0x02, $C1, $D1, $D0 - vperm2i128 \$0x13, $A1, $B1, $A1 - vperm2i128 \$0x13, $C1, $D1, $B1 - vperm2i128 \$0x02, $A2, $B2, $C1 - vperm2i128 \$0x02, $C2, $D2, $D1 - vperm2i128 \$0x13, $A2, $B2, $A2 - vperm2i128 \$0x13, $C2, $D2, $B2 - jmp .Lopen_avx2_short -.size chacha20_poly1305_open_avx2, .-chacha20_poly1305_open_avx2 -.cfi_endproc -############################################################################### -############################################################################### -.type chacha20_poly1305_seal_avx2,\@abi-omnipotent -.align 64 -chacha20_poly1305_seal_avx2: -.cfi_startproc - -# Since the AVX2 function operates in the frame of the SSE function, we just copy the frame state to over here -.cfi_push %rbp -.cfi_push %rbx -.cfi_push %r12 -.cfi_push %r13 -.cfi_push %r14 -.cfi_push %r15 -.cfi_push $keyp -.cfi_adjust_cfa_offset 288 + 32 - - vzeroupper - vmovdqa .Lchacha20_consts(%rip), $A0 - vbroadcasti128 0*16($keyp), $B0 - vbroadcasti128 1*16($keyp), $C0 - vbroadcasti128 2*16($keyp), $D0 - vpaddd .Lavx2_init(%rip), $D0, $D0 - cmp \$6*32, $inl - jbe .Lseal_avx2_192 - cmp \$10*32, $inl - jbe .Lseal_avx2_320 - vmovdqa $A0, $A1 - vmovdqa $A0, $A2 - vmovdqa $A0, $A3 - vmovdqa $B0, $B1 - vmovdqa $B0, $B2 - vmovdqa $B0, $B3 - vmovdqa $B0, $state1_store - vmovdqa $C0, $C1 - vmovdqa $C0, $C2 - vmovdqa $C0, $C3 - vmovdqa $C0, $state2_store - vmovdqa $D0, $D3 - vpaddd .Lavx2_inc(%rip), $D3, $D2 - vpaddd .Lavx2_inc(%rip), $D2, $D1 - vpaddd .Lavx2_inc(%rip), $D1, $D0 - vmovdqa $D0, $ctr0_store - vmovdqa $D1, $ctr1_store - vmovdqa $D2, $ctr2_store - vmovdqa $D3, $ctr3_store - mov \$10, $acc0 -.Lseal_avx2_init_rounds: \n"; - foreach $l (@loop_body) {$code.=$l."\n";} - @loop_body = split /\n/, $chacha_body; $code.=" - dec $acc0 - jnz .Lseal_avx2_init_rounds\n"; - &finalize_state_avx2(4); $code.=" - vperm2i128 \$0x13, $C3, $D3, $C3 - vperm2i128 \$0x02, $A3, $B3, $D3 - vperm2i128 \$0x13, $A3, $B3, $A3 - vpand .Lclamp(%rip), $D3, $D3 - vmovdqa $D3, $r_store - mov $adl, $itr2 - call poly_hash_ad_internal - # Safely store 320 bytes (otherwise would handle with optimized call) - vpxor 0*32($inp), $A3, $A3 - vpxor 1*32($inp), $C3, $C3 - vmovdqu $A3, 0*32($oup) - vmovdqu $C3, 1*32($oup)\n"; - &xor_stream_avx2($A2,$B2,$C2,$D2,2*32,$T3); - &xor_stream_avx2($A1,$B1,$C1,$D1,6*32,$T3); - &finish_stream_avx2($A0,$B0,$C0,$D0,$T3); $code.=" - lea 10*32($inp), $inp - sub \$10*32, $inl - mov \$10*32, $itr1 - cmp \$4*32, $inl - jbe .Lseal_avx2_short_hash_remainder - vpxor 0*32($inp), $A0, $A0 - vpxor 1*32($inp), $B0, $B0 - vpxor 2*32($inp), $C0, $C0 - vpxor 3*32($inp), $D0, $D0 - vmovdqu $A0, 10*32($oup) - vmovdqu $B0, 11*32($oup) - vmovdqu $C0, 12*32($oup) - vmovdqu $D0, 13*32($oup) - lea 4*32($inp), $inp - sub \$4*32, $inl - mov \$8, $itr1 - mov \$2, $itr2 - cmp \$4*32, $inl - jbe .Lseal_avx2_tail_128 - cmp \$8*32, $inl - jbe .Lseal_avx2_tail_256 - cmp \$12*32, $inl - jbe .Lseal_avx2_tail_384 - cmp \$16*32, $inl - jbe .Lseal_avx2_tail_512\n"; - # We have 448 bytes to hash, but main loop hashes 512 bytes at a time - perform some rounds, before the main loop - &prep_state_avx2(4); - foreach $l (@loop_body) {$code.=$l."\n";} - @loop_body = split /\n/, $chacha_body; - &emit_body(41); - @loop_body = split /\n/, $chacha_body; $code.=" - sub \$16, $oup - mov \$9, $itr1 - jmp .Lseal_avx2_main_loop_rounds_entry -.align 32 -.Lseal_avx2_main_loop: \n"; - &prep_state_avx2(4); $code.=" - mov \$10, $itr1 -.align 32 -.Lseal_avx2_main_loop_rounds: \n"; - &poly_add("0*8($oup)"); - &emit_body(10); - &poly_stage1_mulx(); - &emit_body(9); - &poly_stage2_mulx(); - &emit_body(12); - &poly_stage3_mulx(); - &emit_body(10); - &poly_reduce_stage(); $code.=" -.Lseal_avx2_main_loop_rounds_entry: \n"; - &emit_body(9); - &poly_add("2*8($oup)"); - &emit_body(8); - &poly_stage1_mulx(); - &emit_body(18); - &poly_stage2_mulx(); - &emit_body(18); - &poly_stage3_mulx(); - &emit_body(9); - &poly_reduce_stage(); - &emit_body(8); - &poly_add("4*8($oup)"); $code.=" - lea 6*8($oup), $oup\n"; - &emit_body(18); - &poly_stage1_mulx(); - &emit_body(8); - &poly_stage2_mulx(); - &emit_body(8); - &poly_stage3_mulx(); - &emit_body(18); - &poly_reduce_stage(); - foreach $l (@loop_body) {$code.=$l."\n";} - @loop_body = split /\n/, $chacha_body; $code.=" - dec $itr1 - jne .Lseal_avx2_main_loop_rounds\n"; - &finalize_state_avx2(4); $code.=" - vmovdqa $A0, $tmp_store\n"; - &poly_add("0*8($oup)"); - &poly_mul_mulx(); - &poly_add("2*8($oup)"); - &poly_mul_mulx(); $code.=" - lea 4*8($oup), $oup\n"; - &xor_stream_avx2($A3, $B3, $C3, $D3, 0*32, $A0); $code.=" - vmovdqa $tmp_store, $A0\n"; - &xor_stream_avx2($A2, $B2, $C2, $D2, 4*32, $A3); - &xor_stream_avx2($A1, $B1, $C1, $D1, 8*32, $A3); - &xor_stream_avx2($A0, $B0, $C0, $D0, 12*32, $A3); $code.=" - lea 16*32($inp), $inp - sub \$16*32, $inl - cmp \$16*32, $inl - jg .Lseal_avx2_main_loop -\n"; - &poly_add("0*8($oup)"); - &poly_mul_mulx(); - &poly_add("2*8($oup)"); - &poly_mul_mulx(); $code.=" - lea 4*8($oup), $oup - mov \$10, $itr1 - xor $itr2, $itr2 - - cmp \$12*32, $inl - ja .Lseal_avx2_tail_512 - cmp \$8*32, $inl - ja .Lseal_avx2_tail_384 - cmp \$4*32, $inl - ja .Lseal_avx2_tail_256 -############################################################################### -.Lseal_avx2_tail_128:\n"; - &prep_state_avx2(1); $code.=" -.Lseal_avx2_tail_128_rounds_and_3xhash: \n"; - &poly_add("0($oup)"); - &poly_mul_mulx(); $code.=" - lea 2*8($oup), $oup -.Lseal_avx2_tail_128_rounds_and_2xhash: \n"; - &chacha_qr_avx2($A0,$B0,$C0,$D0,$T0,"left"); - &poly_add("0*8($oup)"); - &poly_mul_mulx(); - &chacha_qr_avx2($A0,$B0,$C0,$D0,$T0,"right"); - &poly_add("2*8($oup)"); - &poly_mul_mulx(); $code.=" - lea 4*8($oup), $oup - dec $itr1 - jg .Lseal_avx2_tail_128_rounds_and_3xhash - dec $itr2 - jge .Lseal_avx2_tail_128_rounds_and_2xhash\n"; - &finalize_state_avx2(1); - &finish_stream_avx2($A0,$B0,$C0,$D0,$T0); $code.=" - jmp .Lseal_avx2_short_loop -############################################################################### -.Lseal_avx2_tail_256:\n"; - &prep_state_avx2(2); $code.=" -.Lseal_avx2_tail_256_rounds_and_3xhash: \n"; - &poly_add("0($oup)"); - &poly_mul(); $code.=" - lea 2*8($oup), $oup -.Lseal_avx2_tail_256_rounds_and_2xhash: \n"; - &chacha_qr_avx2($A0,$B0,$C0,$D0,$T0,"left"); - &chacha_qr_avx2($A1,$B1,$C1,$D1,$T0,"left"); - &poly_add("0*8($oup)"); - &poly_mul(); - &chacha_qr_avx2($A0,$B0,$C0,$D0,$T0,"right"); - &chacha_qr_avx2($A1,$B1,$C1,$D1,$T0,"right"); - &poly_add("2*8($oup)"); - &poly_mul(); $code.=" - lea 4*8($oup), $oup - dec $itr1 - jg .Lseal_avx2_tail_256_rounds_and_3xhash - dec $itr2 - jge .Lseal_avx2_tail_256_rounds_and_2xhash\n"; - &finalize_state_avx2(2); - &xor_stream_avx2($A1,$B1,$C1,$D1,0*32,$T0); - &finish_stream_avx2($A0,$B0,$C0,$D0,$T0); $code.=" - mov \$4*32, $itr1 - lea 4*32($inp), $inp - sub \$4*32, $inl - jmp .Lseal_avx2_short_hash_remainder -############################################################################### -.Lseal_avx2_tail_384:\n"; - &prep_state_avx2(3); $code.=" -.Lseal_avx2_tail_384_rounds_and_3xhash: \n"; - &poly_add("0($oup)"); - &poly_mul(); $code.=" - lea 2*8($oup), $oup -.Lseal_avx2_tail_384_rounds_and_2xhash: \n"; - &chacha_qr_avx2($A0,$B0,$C0,$D0,$T0,"left"); - &chacha_qr_avx2($A1,$B1,$C1,$D1,$T0,"left"); - &poly_add("0*8($oup)"); - &poly_mul(); - &chacha_qr_avx2($A2,$B2,$C2,$D2,$T0,"left"); - &chacha_qr_avx2($A0,$B0,$C0,$D0,$T0,"right"); - &poly_add("2*8($oup)"); - &poly_mul(); - &chacha_qr_avx2($A1,$B1,$C1,$D1,$T0,"right"); - &chacha_qr_avx2($A2,$B2,$C2,$D2,$T0,"right"); $code.=" - lea 4*8($oup), $oup - dec $itr1 - jg .Lseal_avx2_tail_384_rounds_and_3xhash - dec $itr2 - jge .Lseal_avx2_tail_384_rounds_and_2xhash\n"; - &finalize_state_avx2(3); - &xor_stream_avx2($A2,$B2,$C2,$D2,0*32,$T0); - &xor_stream_avx2($A1,$B1,$C1,$D1,4*32,$T0); - &finish_stream_avx2($A0,$B0,$C0,$D0,$T0); $code.=" - mov \$8*32, $itr1 - lea 8*32($inp), $inp - sub \$8*32, $inl - jmp .Lseal_avx2_short_hash_remainder -############################################################################### -.Lseal_avx2_tail_512:\n"; - &prep_state_avx2(4); $code.=" -.Lseal_avx2_tail_512_rounds_and_3xhash: \n"; - &poly_add("0($oup)"); - &poly_mul_mulx(); $code.=" - lea 2*8($oup), $oup -.Lseal_avx2_tail_512_rounds_and_2xhash: \n"; - &emit_body(20); - &poly_add("0*8($oup)"); - &emit_body(20); - &poly_stage1_mulx(); - &emit_body(20); - &poly_stage2_mulx(); - &emit_body(20); - &poly_stage3_mulx(); - &emit_body(20); - &poly_reduce_stage(); - &emit_body(20); - &poly_add("2*8($oup)"); - &emit_body(20); - &poly_stage1_mulx(); - &emit_body(20); - &poly_stage2_mulx(); - &emit_body(20); - &poly_stage3_mulx(); - &emit_body(20); - &poly_reduce_stage(); - foreach $l (@loop_body) {$code.=$l."\n";} - @loop_body = split /\n/, $chacha_body; $code.=" - lea 4*8($oup), $oup - dec $itr1 - jg .Lseal_avx2_tail_512_rounds_and_3xhash - dec $itr2 - jge .Lseal_avx2_tail_512_rounds_and_2xhash\n"; - &finalize_state_avx2(4); $code.=" - vmovdqa $A0, $tmp_store\n"; - &xor_stream_avx2($A3, $B3, $C3, $D3, 0*32, $A0); $code.=" - vmovdqa $tmp_store, $A0\n"; - &xor_stream_avx2($A2, $B2, $C2, $D2, 4*32, $A3); - &xor_stream_avx2($A1, $B1, $C1, $D1, 8*32, $A3); - &finish_stream_avx2($A0,$B0,$C0,$D0,$T0); $code.=" - mov \$12*32, $itr1 - lea 12*32($inp), $inp - sub \$12*32, $inl - jmp .Lseal_avx2_short_hash_remainder -################################################################################ -.Lseal_avx2_320: - vmovdqa $A0, $A1 - vmovdqa $A0, $A2 - vmovdqa $B0, $B1 - vmovdqa $B0, $B2 - vmovdqa $C0, $C1 - vmovdqa $C0, $C2 - vpaddd .Lavx2_inc(%rip), $D0, $D1 - vpaddd .Lavx2_inc(%rip), $D1, $D2 - vmovdqa $B0, $T1 - vmovdqa $C0, $T2 - vmovdqa $D0, $ctr0_store - vmovdqa $D1, $ctr1_store - vmovdqa $D2, $ctr2_store - mov \$10, $acc0 -.Lseal_avx2_320_rounds: \n"; - &chacha_qr_avx2($A0,$B0,$C0,$D0,$T0,"left"); - &chacha_qr_avx2($A1,$B1,$C1,$D1,$T0,"left"); - &chacha_qr_avx2($A2,$B2,$C2,$D2,$T0,"left"); - &chacha_qr_avx2($A0,$B0,$C0,$D0,$T0,"right"); - &chacha_qr_avx2($A1,$B1,$C1,$D1,$T0,"right"); - &chacha_qr_avx2($A2,$B2,$C2,$D2,$T0,"right"); $code.=" - dec $acc0 - jne .Lseal_avx2_320_rounds - vpaddd .Lchacha20_consts(%rip), $A0, $A0 - vpaddd .Lchacha20_consts(%rip), $A1, $A1 - vpaddd .Lchacha20_consts(%rip), $A2, $A2 - vpaddd $T1, $B0, $B0 - vpaddd $T1, $B1, $B1 - vpaddd $T1, $B2, $B2 - vpaddd $T2, $C0, $C0 - vpaddd $T2, $C1, $C1 - vpaddd $T2, $C2, $C2 - vpaddd $ctr0_store, $D0, $D0 - vpaddd $ctr1_store, $D1, $D1 - vpaddd $ctr2_store, $D2, $D2 - vperm2i128 \$0x02, $A0, $B0, $T0 - # Clamp and store the key - vpand .Lclamp(%rip), $T0, $T0 - vmovdqa $T0, $r_store - # Stream for up to 320 bytes - vperm2i128 \$0x13, $A0, $B0, $A0 - vperm2i128 \$0x13, $C0, $D0, $B0 - vperm2i128 \$0x02, $A1, $B1, $C0 - vperm2i128 \$0x02, $C1, $D1, $D0 - vperm2i128 \$0x13, $A1, $B1, $A1 - vperm2i128 \$0x13, $C1, $D1, $B1 - vperm2i128 \$0x02, $A2, $B2, $C1 - vperm2i128 \$0x02, $C2, $D2, $D1 - vperm2i128 \$0x13, $A2, $B2, $A2 - vperm2i128 \$0x13, $C2, $D2, $B2 - jmp .Lseal_avx2_short -################################################################################ -.Lseal_avx2_192: - vmovdqa $A0, $A1 - vmovdqa $A0, $A2 - vmovdqa $B0, $B1 - vmovdqa $B0, $B2 - vmovdqa $C0, $C1 - vmovdqa $C0, $C2 - vpaddd .Lavx2_inc(%rip), $D0, $D1 - vmovdqa $D0, $T2 - vmovdqa $D1, $T3 - mov \$10, $acc0 -.Lseal_avx2_192_rounds: \n"; - &chacha_qr_avx2($A0,$B0,$C0,$D0,$T0,"left"); - &chacha_qr_avx2($A1,$B1,$C1,$D1,$T0,"left"); - &chacha_qr_avx2($A0,$B0,$C0,$D0,$T0,"right"); - &chacha_qr_avx2($A1,$B1,$C1,$D1,$T0,"right"); $code.=" - dec $acc0 - jne .Lseal_avx2_192_rounds - vpaddd $A2, $A0, $A0 - vpaddd $A2, $A1, $A1 - vpaddd $B2, $B0, $B0 - vpaddd $B2, $B1, $B1 - vpaddd $C2, $C0, $C0 - vpaddd $C2, $C1, $C1 - vpaddd $T2, $D0, $D0 - vpaddd $T3, $D1, $D1 - vperm2i128 \$0x02, $A0, $B0, $T0 - # Clamp and store the key - vpand .Lclamp(%rip), $T0, $T0 - vmovdqa $T0, $r_store - # Stream for up to 192 bytes - vperm2i128 \$0x13, $A0, $B0, $A0 - vperm2i128 \$0x13, $C0, $D0, $B0 - vperm2i128 \$0x02, $A1, $B1, $C0 - vperm2i128 \$0x02, $C1, $D1, $D0 - vperm2i128 \$0x13, $A1, $B1, $A1 - vperm2i128 \$0x13, $C1, $D1, $B1 -.Lseal_avx2_short: - mov $adl, $itr2 - call poly_hash_ad_internal - xor $itr1, $itr1 -.Lseal_avx2_short_hash_remainder: - cmp \$16, $itr1 - jb .Lseal_avx2_short_loop\n"; - &poly_add("0($oup)"); - &poly_mul(); $code.=" - sub \$16, $itr1 - add \$16, $oup - jmp .Lseal_avx2_short_hash_remainder -.Lseal_avx2_short_loop: - cmp \$32, $inl - jb .Lseal_avx2_short_tail - sub \$32, $inl - # Encrypt - vpxor ($inp), $A0, $A0 - vmovdqu $A0, ($oup) - lea 1*32($inp), $inp - # Load + hash\n"; - &poly_add("0*8($oup)"); - &poly_mul(); - &poly_add("2*8($oup)"); - &poly_mul(); $code.=" - lea 1*32($oup), $oup - # Shift stream - vmovdqa $B0, $A0 - vmovdqa $C0, $B0 - vmovdqa $D0, $C0 - vmovdqa $A1, $D0 - vmovdqa $B1, $A1 - vmovdqa $C1, $B1 - vmovdqa $D1, $C1 - vmovdqa $A2, $D1 - vmovdqa $B2, $A2 - jmp .Lseal_avx2_short_loop -.Lseal_avx2_short_tail: - cmp \$16, $inl - jb .Lseal_avx2_exit - sub \$16, $inl - vpxor ($inp), $A0x, $A3x - vmovdqu $A3x, ($oup) - lea 1*16($inp), $inp\n"; - &poly_add("0*8($oup)"); - &poly_mul(); $code.=" - lea 1*16($oup), $oup - vextracti128 \$1, $A0, $A0x -.Lseal_avx2_exit: - vzeroupper - jmp .Lseal_sse_tail_16 -.cfi_endproc -.size chacha20_poly1305_seal_avx2, .-chacha20_poly1305_seal_avx2 -"; -} - -$code =~ s/\`([^\`]*)\`/eval $1/gem; - -print $code; - -close STDOUT or die "error closing STDOUT"; diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/crypto/constant_time_test.c temporalio-1.3.0/vendor/ring-0.16.20/crypto/constant_time_test.c --- temporalio-1.3.0/vendor/ring-0.16.20/crypto/constant_time_test.c 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/crypto/constant_time_test.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,128 +0,0 @@ -/* - * Utilities for constant-time cryptography. - * - * Author: Emilia Kasper (emilia@openssl.org) - * Based on previous work by Bodo Moeller, Emilia Kasper, Adam Langley - * (Google). - * ==================================================================== - * Copyright (c) 2014 The OpenSSL Project. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * "This product includes cryptographic software written by - * Eric Young (eay@cryptsoft.com)" - * The word 'cryptographic' can be left out if the rouines from the library - * being used are not cryptographic related :-). - * 4. If you include any Windows specific code (or a derivative thereof) from - * the apps directory (application code) you must include an acknowledgement: - * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" - * - * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * The licence and distribution terms for any publically available version or - * derivative of this code cannot be changed. i.e. this code cannot simply be - * copied and put under another distribution licence - * [including the GNU Public Licence.] - */ - -#include "internal.h" - -int bssl_constant_time_test_main(void); - -static int test_binary_op_w(crypto_word (*op)(crypto_word a, crypto_word b), - crypto_word a, crypto_word b, int is_true) { - crypto_word c = op(a, b); - if (is_true && c != CONSTTIME_TRUE_W) { - return 1; - } else if (!is_true && c != CONSTTIME_FALSE_W) { - return 1; - } - return 0; -} - -static int test_is_zero_w(crypto_word a) { - crypto_word c = constant_time_is_zero_w(a); - if (a == 0 && c != CONSTTIME_TRUE_W) { - return 1; - } else if (a != 0 && c != CONSTTIME_FALSE_W) { - return 1; - } - - c = constant_time_is_nonzero_w(a); - if (a == 0 && c != CONSTTIME_FALSE_W) { - return 1; - } else if (a != 0 && c != CONSTTIME_TRUE_W) { - return 1; - } - - return 0; -} - -static int test_select_w(crypto_word a, crypto_word b) { - crypto_word selected = constant_time_select_w(CONSTTIME_TRUE_W, a, b); - if (selected != a) { - return 1; - } - selected = constant_time_select_w(CONSTTIME_FALSE_W, a, b); - if (selected != b) { - return 1; - } - return 0; -} - -static crypto_word test_values_s[] = { - 0, - 1, - 1024, - 12345, - 32000, -#if defined(OPENSSL_64_BIT) - 0xffffffff / 2 - 1, - 0xffffffff / 2, - 0xffffffff / 2 + 1, - 0xffffffff - 1, - 0xffffffff, -#endif - SIZE_MAX / 2 - 1, - SIZE_MAX / 2, - SIZE_MAX / 2 + 1, - SIZE_MAX - 1, - SIZE_MAX -}; - -int bssl_constant_time_test_main(void) { - int num_failed = 0; - - for (size_t i = 0; - i < sizeof(test_values_s) / sizeof(test_values_s[0]); ++i) { - crypto_word a = test_values_s[i]; - num_failed += test_is_zero_w(a); - for (size_t j = 0; - j < sizeof(test_values_s) / sizeof(test_values_s[0]); ++j) { - crypto_word b = test_values_s[j]; - num_failed += test_binary_op_w(&constant_time_eq_w, a, b, a == b); - num_failed += test_binary_op_w(&constant_time_eq_w, b, a, b == a); - num_failed += test_select_w(a, b); - } - } - - return num_failed == 0; -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/crypto/cpu-intel.c temporalio-1.3.0/vendor/ring-0.16.20/crypto/cpu-intel.c --- temporalio-1.3.0/vendor/ring-0.16.20/crypto/cpu-intel.c 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/crypto/cpu-intel.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,203 +0,0 @@ -/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) - * All rights reserved. - * - * This package is an SSL implementation written - * by Eric Young (eay@cryptsoft.com). - * The implementation was written so as to conform with Netscapes SSL. - * - * This library is free for commercial and non-commercial use as long as - * the following conditions are aheared to. The following conditions - * apply to all code found in this distribution, be it the RC4, RSA, - * lhash, DES, etc., code; not just the SSL code. The SSL documentation - * included with this distribution is covered by the same copyright terms - * except that the holder is Tim Hudson (tjh@cryptsoft.com). - * - * Copyright remains Eric Young's, and as such any Copyright notices in - * the code are not to be removed. - * If this package is used in a product, Eric Young should be given attribution - * as the author of the parts of the library used. - * This can be in the form of a textual message at program startup or - * in documentation (online or textual) provided with the package. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * "This product includes cryptographic software written by - * Eric Young (eay@cryptsoft.com)" - * The word 'cryptographic' can be left out if the rouines from the library - * being used are not cryptographic related :-). - * 4. If you include any Windows specific code (or a derivative thereof) from - * the apps directory (application code) you must include an acknowledgement: - * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" - * - * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * The licence and distribution terms for any publically available version or - * derivative of this code cannot be changed. i.e. this code cannot simply be - * copied and put under another distribution licence - * [including the GNU Public Licence.] */ - -#include - - -#if !defined(OPENSSL_NO_ASM) && (defined(OPENSSL_X86) || defined(OPENSSL_X86_64)) - -#if defined(_MSC_VER) && !defined(__clang__) -#pragma warning(push, 3) -#include -#include -#pragma warning(pop) -#endif - -#include "internal.h" - - -// OPENSSL_cpuid runs the cpuid instruction. |leaf| is passed in as EAX and ECX -// is set to zero. It writes EAX, EBX, ECX, and EDX to |*out_eax| through -// |*out_edx|. -static void OPENSSL_cpuid(uint32_t *out_eax, uint32_t *out_ebx, - uint32_t *out_ecx, uint32_t *out_edx, uint32_t leaf) { -#if defined(_MSC_VER) && !defined(__clang__) - int tmp[4]; - __cpuid(tmp, (int)leaf); - *out_eax = (uint32_t)tmp[0]; - *out_ebx = (uint32_t)tmp[1]; - *out_ecx = (uint32_t)tmp[2]; - *out_edx = (uint32_t)tmp[3]; -#elif defined(__pic__) && defined(OPENSSL_32_BIT) - // Inline assembly may not clobber the PIC register. For 32-bit, this is EBX. - // See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47602. - __asm__ volatile ( - "xor %%ecx, %%ecx\n" - "mov %%ebx, %%edi\n" - "cpuid\n" - "xchg %%edi, %%ebx\n" - : "=a"(*out_eax), "=D"(*out_ebx), "=c"(*out_ecx), "=d"(*out_edx) - : "a"(leaf) - ); -#else - __asm__ volatile ( - "xor %%ecx, %%ecx\n" - "cpuid\n" - : "=a"(*out_eax), "=b"(*out_ebx), "=c"(*out_ecx), "=d"(*out_edx) - : "a"(leaf) - ); -#endif -} - -// OPENSSL_xgetbv returns the value of an Intel Extended Control Register (XCR). -// Currently only XCR0 is defined by Intel so |xcr| should always be zero. -// -// See https://software.intel.com/en-us/articles/how-to-detect-new-instruction-support-in-the-4th-generation-intel-core-processor-family -static uint64_t OPENSSL_xgetbv(uint32_t xcr) { -#if defined(_MSC_VER) && !defined(__clang__) - return (uint64_t)_xgetbv(xcr); -#else - uint32_t eax, edx; - __asm__ volatile ("xgetbv" : "=a"(eax), "=d"(edx) : "c"(xcr)); - return (((uint64_t)edx) << 32) | eax; -#endif -} - -void GFp_cpuid_setup(void) { - // Determine the vendor and maximum input value. - uint32_t eax, ebx, ecx, edx; - OPENSSL_cpuid(&eax, &ebx, &ecx, &edx, 0); - - uint32_t num_ids = eax; - - int is_intel = ebx == 0x756e6547 /* Genu */ && - edx == 0x49656e69 /* ineI */ && - ecx == 0x6c65746e /* ntel */; - - uint32_t extended_features[2] = {0}; - if (num_ids >= 7) { - OPENSSL_cpuid(&eax, &ebx, &ecx, &edx, 7); - extended_features[0] = ebx; - extended_features[1] = ecx; - } - - OPENSSL_cpuid(&eax, &ebx, &ecx, &edx, 1); - - // Force the hyper-threading bit so that the more conservative path is always - // chosen. - edx |= 1u << 28; - - // Reserved bit #20 was historically repurposed to control the in-memory - // representation of RC4 state. Always set it to zero. - edx &= ~(1u << 20); - - // Reserved bit #30 is repurposed to signal an Intel CPU. - if (is_intel) { - edx |= (1u << 30); - - // Clear the XSAVE bit on Knights Landing to mimic Silvermont. This enables - // some Silvermont-specific codepaths which perform better. See OpenSSL - // commit 64d92d74985ebb3d0be58a9718f9e080a14a8e7f. - if ((eax & 0x0fff0ff0) == 0x00050670 /* Knights Landing */ || - (eax & 0x0fff0ff0) == 0x00080650 /* Knights Mill (per SDE) */) { - ecx &= ~(1u << 26); - } - } else { - edx &= ~(1u << 30); - } - - // The SDBG bit is repurposed to denote AMD XOP support. Don't ever use AMD - // XOP code paths. - ecx &= ~(1u << 11); - - uint64_t xcr0 = 0; - if (ecx & (1u << 27)) { - // XCR0 may only be queried if the OSXSAVE bit is set. - xcr0 = OPENSSL_xgetbv(0); - } - // See Intel manual, volume 1, section 14.3. - if ((xcr0 & 6) != 6) { - // YMM registers cannot be used. - ecx &= ~(1u << 28); // AVX - ecx &= ~(1u << 12); // FMA - ecx &= ~(1u << 11); // AMD XOP - // Clear AVX2 and AVX512* bits. - // - // TODO(davidben): Should bits 17 and 26-28 also be cleared? Upstream - // doesn't clear those. - extended_features[0] &= - ~((1u << 5) | (1u << 16) | (1u << 21) | (1u << 30) | (1u << 31)); - } - // See Intel manual, volume 1, section 15.2. - if ((xcr0 & 0xe6) != 0xe6) { - // Clear AVX512F. Note we don't touch other AVX512 extensions because they - // can be used with YMM. - extended_features[0] &= ~(1u << 16); - } - - // Disable ADX instructions on Knights Landing. See OpenSSL commit - // 64d92d74985ebb3d0be58a9718f9e080a14a8e7f. - if ((ecx & (1u << 26)) == 0) { - extended_features[0] &= ~(1u << 19); - } - - GFp_ia32cap_P[0] = edx; - GFp_ia32cap_P[1] = ecx; - GFp_ia32cap_P[2] = extended_features[0]; - GFp_ia32cap_P[3] = extended_features[1]; -} - -#endif // !OPENSSL_NO_ASM && (OPENSSL_X86 || OPENSSL_X86_64) diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/crypto/crypto.c temporalio-1.3.0/vendor/ring-0.16.20/crypto/crypto.c --- temporalio-1.3.0/vendor/ring-0.16.20/crypto/crypto.c 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/crypto/crypto.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,38 +0,0 @@ -/* Copyright (c) 2014, Google Inc. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY - * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION - * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ - -#include -#include "internal.h" - -// Our assembly does not use the GOT to reference symbols, which means -// references to visible symbols will often require a TEXTREL. This is -// undesirable, so all assembly-referenced symbols should be hidden. CPU -// capabilities are the only such symbols defined in C. Explicitly hide them, -// rather than rely on being built with -fvisibility=hidden. -#if defined(OPENSSL_WINDOWS) -#define HIDDEN -#else -#define HIDDEN __attribute__((visibility("hidden"))) -#endif - -#if defined(OPENSSL_X86) || defined(OPENSSL_X86_64) -// This value must be explicitly initialised to zero in order to work around a -// bug in libtool or the linker on OS X. -// -// If not initialised then it becomes a "common symbol". When put into an -// archive, linking on OS X will fail to resolve common symbols. By -// initialising it to zero, it becomes a "data symbol", which isn't so -// affected. -HIDDEN uint32_t GFp_ia32cap_P[4] = {0}; -#endif diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/crypto/curve25519/asm/x25519-asm-arm.S temporalio-1.3.0/vendor/ring-0.16.20/crypto/curve25519/asm/x25519-asm-arm.S --- temporalio-1.3.0/vendor/ring-0.16.20/crypto/curve25519/asm/x25519-asm-arm.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/crypto/curve25519/asm/x25519-asm-arm.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,2138 +0,0 @@ -/* Copyright (c) 2015, Google Inc. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY - * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION - * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ - -/* This file is taken from crypto_scalarmult/curve25519/neon2/scalarmult.s in - * SUPERCOP 20141124 (http://bench.cr.yp.to/supercop.html). That code is public - * domain licensed but the standard ISC license is included above to keep - * licensing simple. */ - -#if defined(__has_feature) -#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) -#define OPENSSL_NO_ASM -#endif -#endif - -#if !defined(OPENSSL_NO_ASM) && defined(__arm__) && !defined(__APPLE__) - -#if defined(BORINGSSL_PREFIX) -#include -#endif - -.fpu neon -.text -.align 4 - -.global GFp_x25519_NEON - -.hidden GFp_x25519_NEON -.type GFp_x25519_NEON, %function -GFp_x25519_NEON: - -vpush {q4,q5,q6,q7} -mov r12,sp -sub sp,sp,#736 -and sp,sp,#0xffffffe0 -strd r4,[sp,#0] -strd r6,[sp,#8] -strd r8,[sp,#16] -strd r10,[sp,#24] -str r12,[sp,#480] -str r14,[sp,#484] -mov r0,r0 -mov r1,r1 -mov r2,r2 -add r3,sp,#32 -ldr r4,=0 -ldr r5,=254 -vmov.i32 q0,#1 -vshr.u64 q1,q0,#7 -vshr.u64 q0,q0,#8 -vmov.i32 d4,#19 -vmov.i32 d5,#38 -add r6,sp,#512 -vst1.8 {d2-d3},[r6,: 128] -add r6,sp,#528 -vst1.8 {d0-d1},[r6,: 128] -add r6,sp,#544 -vst1.8 {d4-d5},[r6,: 128] -add r6,r3,#0 -vmov.i32 q2,#0 -vst1.8 {d4-d5},[r6,: 128]! -vst1.8 {d4-d5},[r6,: 128]! -vst1.8 d4,[r6,: 64] -add r6,r3,#0 -ldr r7,=960 -sub r7,r7,#2 -neg r7,r7 -sub r7,r7,r7,LSL #7 -str r7,[r6] -add r6,sp,#704 -vld1.8 {d4-d5},[r1]! -vld1.8 {d6-d7},[r1] -vst1.8 {d4-d5},[r6,: 128]! -vst1.8 {d6-d7},[r6,: 128] -sub r1,r6,#16 -ldrb r6,[r1] -and r6,r6,#248 -strb r6,[r1] -ldrb r6,[r1,#31] -and r6,r6,#127 -orr r6,r6,#64 -strb r6,[r1,#31] -vmov.i64 q2,#0xffffffff -vshr.u64 q3,q2,#7 -vshr.u64 q2,q2,#6 -vld1.8 {d8},[r2] -vld1.8 {d10},[r2] -add r2,r2,#6 -vld1.8 {d12},[r2] -vld1.8 {d14},[r2] -add r2,r2,#6 -vld1.8 {d16},[r2] -add r2,r2,#4 -vld1.8 {d18},[r2] -vld1.8 {d20},[r2] -add r2,r2,#6 -vld1.8 {d22},[r2] -add r2,r2,#2 -vld1.8 {d24},[r2] -vld1.8 {d26},[r2] -vshr.u64 q5,q5,#26 -vshr.u64 q6,q6,#3 -vshr.u64 q7,q7,#29 -vshr.u64 q8,q8,#6 -vshr.u64 q10,q10,#25 -vshr.u64 q11,q11,#3 -vshr.u64 q12,q12,#12 -vshr.u64 q13,q13,#38 -vand q4,q4,q2 -vand q6,q6,q2 -vand q8,q8,q2 -vand q10,q10,q2 -vand q2,q12,q2 -vand q5,q5,q3 -vand q7,q7,q3 -vand q9,q9,q3 -vand q11,q11,q3 -vand q3,q13,q3 -add r2,r3,#48 -vadd.i64 q12,q4,q1 -vadd.i64 q13,q10,q1 -vshr.s64 q12,q12,#26 -vshr.s64 q13,q13,#26 -vadd.i64 q5,q5,q12 -vshl.i64 q12,q12,#26 -vadd.i64 q14,q5,q0 -vadd.i64 q11,q11,q13 -vshl.i64 q13,q13,#26 -vadd.i64 q15,q11,q0 -vsub.i64 q4,q4,q12 -vshr.s64 q12,q14,#25 -vsub.i64 q10,q10,q13 -vshr.s64 q13,q15,#25 -vadd.i64 q6,q6,q12 -vshl.i64 q12,q12,#25 -vadd.i64 q14,q6,q1 -vadd.i64 q2,q2,q13 -vsub.i64 q5,q5,q12 -vshr.s64 q12,q14,#26 -vshl.i64 q13,q13,#25 -vadd.i64 q14,q2,q1 -vadd.i64 q7,q7,q12 -vshl.i64 q12,q12,#26 -vadd.i64 q15,q7,q0 -vsub.i64 q11,q11,q13 -vshr.s64 q13,q14,#26 -vsub.i64 q6,q6,q12 -vshr.s64 q12,q15,#25 -vadd.i64 q3,q3,q13 -vshl.i64 q13,q13,#26 -vadd.i64 q14,q3,q0 -vadd.i64 q8,q8,q12 -vshl.i64 q12,q12,#25 -vadd.i64 q15,q8,q1 -add r2,r2,#8 -vsub.i64 q2,q2,q13 -vshr.s64 q13,q14,#25 -vsub.i64 q7,q7,q12 -vshr.s64 q12,q15,#26 -vadd.i64 q14,q13,q13 -vadd.i64 q9,q9,q12 -vtrn.32 d12,d14 -vshl.i64 q12,q12,#26 -vtrn.32 d13,d15 -vadd.i64 q0,q9,q0 -vadd.i64 q4,q4,q14 -vst1.8 d12,[r2,: 64]! -vshl.i64 q6,q13,#4 -vsub.i64 q7,q8,q12 -vshr.s64 q0,q0,#25 -vadd.i64 q4,q4,q6 -vadd.i64 q6,q10,q0 -vshl.i64 q0,q0,#25 -vadd.i64 q8,q6,q1 -vadd.i64 q4,q4,q13 -vshl.i64 q10,q13,#25 -vadd.i64 q1,q4,q1 -vsub.i64 q0,q9,q0 -vshr.s64 q8,q8,#26 -vsub.i64 q3,q3,q10 -vtrn.32 d14,d0 -vshr.s64 q1,q1,#26 -vtrn.32 d15,d1 -vadd.i64 q0,q11,q8 -vst1.8 d14,[r2,: 64] -vshl.i64 q7,q8,#26 -vadd.i64 q5,q5,q1 -vtrn.32 d4,d6 -vshl.i64 q1,q1,#26 -vtrn.32 d5,d7 -vsub.i64 q3,q6,q7 -add r2,r2,#16 -vsub.i64 q1,q4,q1 -vst1.8 d4,[r2,: 64] -vtrn.32 d6,d0 -vtrn.32 d7,d1 -sub r2,r2,#8 -vtrn.32 d2,d10 -vtrn.32 d3,d11 -vst1.8 d6,[r2,: 64] -sub r2,r2,#24 -vst1.8 d2,[r2,: 64] -add r2,r3,#96 -vmov.i32 q0,#0 -vmov.i64 d2,#0xff -vmov.i64 d3,#0 -vshr.u32 q1,q1,#7 -vst1.8 {d2-d3},[r2,: 128]! -vst1.8 {d0-d1},[r2,: 128]! -vst1.8 d0,[r2,: 64] -add r2,r3,#144 -vmov.i32 q0,#0 -vst1.8 {d0-d1},[r2,: 128]! -vst1.8 {d0-d1},[r2,: 128]! -vst1.8 d0,[r2,: 64] -add r2,r3,#240 -vmov.i32 q0,#0 -vmov.i64 d2,#0xff -vmov.i64 d3,#0 -vshr.u32 q1,q1,#7 -vst1.8 {d2-d3},[r2,: 128]! -vst1.8 {d0-d1},[r2,: 128]! -vst1.8 d0,[r2,: 64] -add r2,r3,#48 -add r6,r3,#192 -vld1.8 {d0-d1},[r2,: 128]! -vld1.8 {d2-d3},[r2,: 128]! -vld1.8 {d4},[r2,: 64] -vst1.8 {d0-d1},[r6,: 128]! -vst1.8 {d2-d3},[r6,: 128]! -vst1.8 d4,[r6,: 64] -._mainloop: -mov r2,r5,LSR #3 -and r6,r5,#7 -ldrb r2,[r1,r2] -mov r2,r2,LSR r6 -and r2,r2,#1 -str r5,[sp,#488] -eor r4,r4,r2 -str r2,[sp,#492] -neg r2,r4 -add r4,r3,#96 -add r5,r3,#192 -add r6,r3,#144 -vld1.8 {d8-d9},[r4,: 128]! -add r7,r3,#240 -vld1.8 {d10-d11},[r5,: 128]! -veor q6,q4,q5 -vld1.8 {d14-d15},[r6,: 128]! -vdup.i32 q8,r2 -vld1.8 {d18-d19},[r7,: 128]! -veor q10,q7,q9 -vld1.8 {d22-d23},[r4,: 128]! -vand q6,q6,q8 -vld1.8 {d24-d25},[r5,: 128]! -vand q10,q10,q8 -vld1.8 {d26-d27},[r6,: 128]! -veor q4,q4,q6 -vld1.8 {d28-d29},[r7,: 128]! -veor q5,q5,q6 -vld1.8 {d0},[r4,: 64] -veor q6,q7,q10 -vld1.8 {d2},[r5,: 64] -veor q7,q9,q10 -vld1.8 {d4},[r6,: 64] -veor q9,q11,q12 -vld1.8 {d6},[r7,: 64] -veor q10,q0,q1 -sub r2,r4,#32 -vand q9,q9,q8 -sub r4,r5,#32 -vand q10,q10,q8 -sub r5,r6,#32 -veor q11,q11,q9 -sub r6,r7,#32 -veor q0,q0,q10 -veor q9,q12,q9 -veor q1,q1,q10 -veor q10,q13,q14 -veor q12,q2,q3 -vand q10,q10,q8 -vand q8,q12,q8 -veor q12,q13,q10 -veor q2,q2,q8 -veor q10,q14,q10 -veor q3,q3,q8 -vadd.i32 q8,q4,q6 -vsub.i32 q4,q4,q6 -vst1.8 {d16-d17},[r2,: 128]! -vadd.i32 q6,q11,q12 -vst1.8 {d8-d9},[r5,: 128]! -vsub.i32 q4,q11,q12 -vst1.8 {d12-d13},[r2,: 128]! -vadd.i32 q6,q0,q2 -vst1.8 {d8-d9},[r5,: 128]! -vsub.i32 q0,q0,q2 -vst1.8 d12,[r2,: 64] -vadd.i32 q2,q5,q7 -vst1.8 d0,[r5,: 64] -vsub.i32 q0,q5,q7 -vst1.8 {d4-d5},[r4,: 128]! -vadd.i32 q2,q9,q10 -vst1.8 {d0-d1},[r6,: 128]! -vsub.i32 q0,q9,q10 -vst1.8 {d4-d5},[r4,: 128]! -vadd.i32 q2,q1,q3 -vst1.8 {d0-d1},[r6,: 128]! -vsub.i32 q0,q1,q3 -vst1.8 d4,[r4,: 64] -vst1.8 d0,[r6,: 64] -add r2,sp,#544 -add r4,r3,#96 -add r5,r3,#144 -vld1.8 {d0-d1},[r2,: 128] -vld1.8 {d2-d3},[r4,: 128]! -vld1.8 {d4-d5},[r5,: 128]! -vzip.i32 q1,q2 -vld1.8 {d6-d7},[r4,: 128]! -vld1.8 {d8-d9},[r5,: 128]! -vshl.i32 q5,q1,#1 -vzip.i32 q3,q4 -vshl.i32 q6,q2,#1 -vld1.8 {d14},[r4,: 64] -vshl.i32 q8,q3,#1 -vld1.8 {d15},[r5,: 64] -vshl.i32 q9,q4,#1 -vmul.i32 d21,d7,d1 -vtrn.32 d14,d15 -vmul.i32 q11,q4,q0 -vmul.i32 q0,q7,q0 -vmull.s32 q12,d2,d2 -vmlal.s32 q12,d11,d1 -vmlal.s32 q12,d12,d0 -vmlal.s32 q12,d13,d23 -vmlal.s32 q12,d16,d22 -vmlal.s32 q12,d7,d21 -vmull.s32 q10,d2,d11 -vmlal.s32 q10,d4,d1 -vmlal.s32 q10,d13,d0 -vmlal.s32 q10,d6,d23 -vmlal.s32 q10,d17,d22 -vmull.s32 q13,d10,d4 -vmlal.s32 q13,d11,d3 -vmlal.s32 q13,d13,d1 -vmlal.s32 q13,d16,d0 -vmlal.s32 q13,d17,d23 -vmlal.s32 q13,d8,d22 -vmull.s32 q1,d10,d5 -vmlal.s32 q1,d11,d4 -vmlal.s32 q1,d6,d1 -vmlal.s32 q1,d17,d0 -vmlal.s32 q1,d8,d23 -vmull.s32 q14,d10,d6 -vmlal.s32 q14,d11,d13 -vmlal.s32 q14,d4,d4 -vmlal.s32 q14,d17,d1 -vmlal.s32 q14,d18,d0 -vmlal.s32 q14,d9,d23 -vmull.s32 q11,d10,d7 -vmlal.s32 q11,d11,d6 -vmlal.s32 q11,d12,d5 -vmlal.s32 q11,d8,d1 -vmlal.s32 q11,d19,d0 -vmull.s32 q15,d10,d8 -vmlal.s32 q15,d11,d17 -vmlal.s32 q15,d12,d6 -vmlal.s32 q15,d13,d5 -vmlal.s32 q15,d19,d1 -vmlal.s32 q15,d14,d0 -vmull.s32 q2,d10,d9 -vmlal.s32 q2,d11,d8 -vmlal.s32 q2,d12,d7 -vmlal.s32 q2,d13,d6 -vmlal.s32 q2,d14,d1 -vmull.s32 q0,d15,d1 -vmlal.s32 q0,d10,d14 -vmlal.s32 q0,d11,d19 -vmlal.s32 q0,d12,d8 -vmlal.s32 q0,d13,d17 -vmlal.s32 q0,d6,d6 -add r2,sp,#512 -vld1.8 {d18-d19},[r2,: 128] -vmull.s32 q3,d16,d7 -vmlal.s32 q3,d10,d15 -vmlal.s32 q3,d11,d14 -vmlal.s32 q3,d12,d9 -vmlal.s32 q3,d13,d8 -add r2,sp,#528 -vld1.8 {d8-d9},[r2,: 128] -vadd.i64 q5,q12,q9 -vadd.i64 q6,q15,q9 -vshr.s64 q5,q5,#26 -vshr.s64 q6,q6,#26 -vadd.i64 q7,q10,q5 -vshl.i64 q5,q5,#26 -vadd.i64 q8,q7,q4 -vadd.i64 q2,q2,q6 -vshl.i64 q6,q6,#26 -vadd.i64 q10,q2,q4 -vsub.i64 q5,q12,q5 -vshr.s64 q8,q8,#25 -vsub.i64 q6,q15,q6 -vshr.s64 q10,q10,#25 -vadd.i64 q12,q13,q8 -vshl.i64 q8,q8,#25 -vadd.i64 q13,q12,q9 -vadd.i64 q0,q0,q10 -vsub.i64 q7,q7,q8 -vshr.s64 q8,q13,#26 -vshl.i64 q10,q10,#25 -vadd.i64 q13,q0,q9 -vadd.i64 q1,q1,q8 -vshl.i64 q8,q8,#26 -vadd.i64 q15,q1,q4 -vsub.i64 q2,q2,q10 -vshr.s64 q10,q13,#26 -vsub.i64 q8,q12,q8 -vshr.s64 q12,q15,#25 -vadd.i64 q3,q3,q10 -vshl.i64 q10,q10,#26 -vadd.i64 q13,q3,q4 -vadd.i64 q14,q14,q12 -add r2,r3,#288 -vshl.i64 q12,q12,#25 -add r4,r3,#336 -vadd.i64 q15,q14,q9 -add r2,r2,#8 -vsub.i64 q0,q0,q10 -add r4,r4,#8 -vshr.s64 q10,q13,#25 -vsub.i64 q1,q1,q12 -vshr.s64 q12,q15,#26 -vadd.i64 q13,q10,q10 -vadd.i64 q11,q11,q12 -vtrn.32 d16,d2 -vshl.i64 q12,q12,#26 -vtrn.32 d17,d3 -vadd.i64 q1,q11,q4 -vadd.i64 q4,q5,q13 -vst1.8 d16,[r2,: 64]! -vshl.i64 q5,q10,#4 -vst1.8 d17,[r4,: 64]! -vsub.i64 q8,q14,q12 -vshr.s64 q1,q1,#25 -vadd.i64 q4,q4,q5 -vadd.i64 q5,q6,q1 -vshl.i64 q1,q1,#25 -vadd.i64 q6,q5,q9 -vadd.i64 q4,q4,q10 -vshl.i64 q10,q10,#25 -vadd.i64 q9,q4,q9 -vsub.i64 q1,q11,q1 -vshr.s64 q6,q6,#26 -vsub.i64 q3,q3,q10 -vtrn.32 d16,d2 -vshr.s64 q9,q9,#26 -vtrn.32 d17,d3 -vadd.i64 q1,q2,q6 -vst1.8 d16,[r2,: 64] -vshl.i64 q2,q6,#26 -vst1.8 d17,[r4,: 64] -vadd.i64 q6,q7,q9 -vtrn.32 d0,d6 -vshl.i64 q7,q9,#26 -vtrn.32 d1,d7 -vsub.i64 q2,q5,q2 -add r2,r2,#16 -vsub.i64 q3,q4,q7 -vst1.8 d0,[r2,: 64] -add r4,r4,#16 -vst1.8 d1,[r4,: 64] -vtrn.32 d4,d2 -vtrn.32 d5,d3 -sub r2,r2,#8 -sub r4,r4,#8 -vtrn.32 d6,d12 -vtrn.32 d7,d13 -vst1.8 d4,[r2,: 64] -vst1.8 d5,[r4,: 64] -sub r2,r2,#24 -sub r4,r4,#24 -vst1.8 d6,[r2,: 64] -vst1.8 d7,[r4,: 64] -add r2,r3,#240 -add r4,r3,#96 -vld1.8 {d0-d1},[r4,: 128]! -vld1.8 {d2-d3},[r4,: 128]! -vld1.8 {d4},[r4,: 64] -add r4,r3,#144 -vld1.8 {d6-d7},[r4,: 128]! -vtrn.32 q0,q3 -vld1.8 {d8-d9},[r4,: 128]! -vshl.i32 q5,q0,#4 -vtrn.32 q1,q4 -vshl.i32 q6,q3,#4 -vadd.i32 q5,q5,q0 -vadd.i32 q6,q6,q3 -vshl.i32 q7,q1,#4 -vld1.8 {d5},[r4,: 64] -vshl.i32 q8,q4,#4 -vtrn.32 d4,d5 -vadd.i32 q7,q7,q1 -vadd.i32 q8,q8,q4 -vld1.8 {d18-d19},[r2,: 128]! -vshl.i32 q10,q2,#4 -vld1.8 {d22-d23},[r2,: 128]! -vadd.i32 q10,q10,q2 -vld1.8 {d24},[r2,: 64] -vadd.i32 q5,q5,q0 -add r2,r3,#192 -vld1.8 {d26-d27},[r2,: 128]! -vadd.i32 q6,q6,q3 -vld1.8 {d28-d29},[r2,: 128]! -vadd.i32 q8,q8,q4 -vld1.8 {d25},[r2,: 64] -vadd.i32 q10,q10,q2 -vtrn.32 q9,q13 -vadd.i32 q7,q7,q1 -vadd.i32 q5,q5,q0 -vtrn.32 q11,q14 -vadd.i32 q6,q6,q3 -add r2,sp,#560 -vadd.i32 q10,q10,q2 -vtrn.32 d24,d25 -vst1.8 {d12-d13},[r2,: 128] -vshl.i32 q6,q13,#1 -add r2,sp,#576 -vst1.8 {d20-d21},[r2,: 128] -vshl.i32 q10,q14,#1 -add r2,sp,#592 -vst1.8 {d12-d13},[r2,: 128] -vshl.i32 q15,q12,#1 -vadd.i32 q8,q8,q4 -vext.32 d10,d31,d30,#0 -vadd.i32 q7,q7,q1 -add r2,sp,#608 -vst1.8 {d16-d17},[r2,: 128] -vmull.s32 q8,d18,d5 -vmlal.s32 q8,d26,d4 -vmlal.s32 q8,d19,d9 -vmlal.s32 q8,d27,d3 -vmlal.s32 q8,d22,d8 -vmlal.s32 q8,d28,d2 -vmlal.s32 q8,d23,d7 -vmlal.s32 q8,d29,d1 -vmlal.s32 q8,d24,d6 -vmlal.s32 q8,d25,d0 -add r2,sp,#624 -vst1.8 {d14-d15},[r2,: 128] -vmull.s32 q2,d18,d4 -vmlal.s32 q2,d12,d9 -vmlal.s32 q2,d13,d8 -vmlal.s32 q2,d19,d3 -vmlal.s32 q2,d22,d2 -vmlal.s32 q2,d23,d1 -vmlal.s32 q2,d24,d0 -add r2,sp,#640 -vst1.8 {d20-d21},[r2,: 128] -vmull.s32 q7,d18,d9 -vmlal.s32 q7,d26,d3 -vmlal.s32 q7,d19,d8 -vmlal.s32 q7,d27,d2 -vmlal.s32 q7,d22,d7 -vmlal.s32 q7,d28,d1 -vmlal.s32 q7,d23,d6 -vmlal.s32 q7,d29,d0 -add r2,sp,#656 -vst1.8 {d10-d11},[r2,: 128] -vmull.s32 q5,d18,d3 -vmlal.s32 q5,d19,d2 -vmlal.s32 q5,d22,d1 -vmlal.s32 q5,d23,d0 -vmlal.s32 q5,d12,d8 -add r2,sp,#672 -vst1.8 {d16-d17},[r2,: 128] -vmull.s32 q4,d18,d8 -vmlal.s32 q4,d26,d2 -vmlal.s32 q4,d19,d7 -vmlal.s32 q4,d27,d1 -vmlal.s32 q4,d22,d6 -vmlal.s32 q4,d28,d0 -vmull.s32 q8,d18,d7 -vmlal.s32 q8,d26,d1 -vmlal.s32 q8,d19,d6 -vmlal.s32 q8,d27,d0 -add r2,sp,#576 -vld1.8 {d20-d21},[r2,: 128] -vmlal.s32 q7,d24,d21 -vmlal.s32 q7,d25,d20 -vmlal.s32 q4,d23,d21 -vmlal.s32 q4,d29,d20 -vmlal.s32 q8,d22,d21 -vmlal.s32 q8,d28,d20 -vmlal.s32 q5,d24,d20 -add r2,sp,#576 -vst1.8 {d14-d15},[r2,: 128] -vmull.s32 q7,d18,d6 -vmlal.s32 q7,d26,d0 -add r2,sp,#656 -vld1.8 {d30-d31},[r2,: 128] -vmlal.s32 q2,d30,d21 -vmlal.s32 q7,d19,d21 -vmlal.s32 q7,d27,d20 -add r2,sp,#624 -vld1.8 {d26-d27},[r2,: 128] -vmlal.s32 q4,d25,d27 -vmlal.s32 q8,d29,d27 -vmlal.s32 q8,d25,d26 -vmlal.s32 q7,d28,d27 -vmlal.s32 q7,d29,d26 -add r2,sp,#608 -vld1.8 {d28-d29},[r2,: 128] -vmlal.s32 q4,d24,d29 -vmlal.s32 q8,d23,d29 -vmlal.s32 q8,d24,d28 -vmlal.s32 q7,d22,d29 -vmlal.s32 q7,d23,d28 -add r2,sp,#608 -vst1.8 {d8-d9},[r2,: 128] -add r2,sp,#560 -vld1.8 {d8-d9},[r2,: 128] -vmlal.s32 q7,d24,d9 -vmlal.s32 q7,d25,d31 -vmull.s32 q1,d18,d2 -vmlal.s32 q1,d19,d1 -vmlal.s32 q1,d22,d0 -vmlal.s32 q1,d24,d27 -vmlal.s32 q1,d23,d20 -vmlal.s32 q1,d12,d7 -vmlal.s32 q1,d13,d6 -vmull.s32 q6,d18,d1 -vmlal.s32 q6,d19,d0 -vmlal.s32 q6,d23,d27 -vmlal.s32 q6,d22,d20 -vmlal.s32 q6,d24,d26 -vmull.s32 q0,d18,d0 -vmlal.s32 q0,d22,d27 -vmlal.s32 q0,d23,d26 -vmlal.s32 q0,d24,d31 -vmlal.s32 q0,d19,d20 -add r2,sp,#640 -vld1.8 {d18-d19},[r2,: 128] -vmlal.s32 q2,d18,d7 -vmlal.s32 q2,d19,d6 -vmlal.s32 q5,d18,d6 -vmlal.s32 q5,d19,d21 -vmlal.s32 q1,d18,d21 -vmlal.s32 q1,d19,d29 -vmlal.s32 q0,d18,d28 -vmlal.s32 q0,d19,d9 -vmlal.s32 q6,d18,d29 -vmlal.s32 q6,d19,d28 -add r2,sp,#592 -vld1.8 {d18-d19},[r2,: 128] -add r2,sp,#512 -vld1.8 {d22-d23},[r2,: 128] -vmlal.s32 q5,d19,d7 -vmlal.s32 q0,d18,d21 -vmlal.s32 q0,d19,d29 -vmlal.s32 q6,d18,d6 -add r2,sp,#528 -vld1.8 {d6-d7},[r2,: 128] -vmlal.s32 q6,d19,d21 -add r2,sp,#576 -vld1.8 {d18-d19},[r2,: 128] -vmlal.s32 q0,d30,d8 -add r2,sp,#672 -vld1.8 {d20-d21},[r2,: 128] -vmlal.s32 q5,d30,d29 -add r2,sp,#608 -vld1.8 {d24-d25},[r2,: 128] -vmlal.s32 q1,d30,d28 -vadd.i64 q13,q0,q11 -vadd.i64 q14,q5,q11 -vmlal.s32 q6,d30,d9 -vshr.s64 q4,q13,#26 -vshr.s64 q13,q14,#26 -vadd.i64 q7,q7,q4 -vshl.i64 q4,q4,#26 -vadd.i64 q14,q7,q3 -vadd.i64 q9,q9,q13 -vshl.i64 q13,q13,#26 -vadd.i64 q15,q9,q3 -vsub.i64 q0,q0,q4 -vshr.s64 q4,q14,#25 -vsub.i64 q5,q5,q13 -vshr.s64 q13,q15,#25 -vadd.i64 q6,q6,q4 -vshl.i64 q4,q4,#25 -vadd.i64 q14,q6,q11 -vadd.i64 q2,q2,q13 -vsub.i64 q4,q7,q4 -vshr.s64 q7,q14,#26 -vshl.i64 q13,q13,#25 -vadd.i64 q14,q2,q11 -vadd.i64 q8,q8,q7 -vshl.i64 q7,q7,#26 -vadd.i64 q15,q8,q3 -vsub.i64 q9,q9,q13 -vshr.s64 q13,q14,#26 -vsub.i64 q6,q6,q7 -vshr.s64 q7,q15,#25 -vadd.i64 q10,q10,q13 -vshl.i64 q13,q13,#26 -vadd.i64 q14,q10,q3 -vadd.i64 q1,q1,q7 -add r2,r3,#144 -vshl.i64 q7,q7,#25 -add r4,r3,#96 -vadd.i64 q15,q1,q11 -add r2,r2,#8 -vsub.i64 q2,q2,q13 -add r4,r4,#8 -vshr.s64 q13,q14,#25 -vsub.i64 q7,q8,q7 -vshr.s64 q8,q15,#26 -vadd.i64 q14,q13,q13 -vadd.i64 q12,q12,q8 -vtrn.32 d12,d14 -vshl.i64 q8,q8,#26 -vtrn.32 d13,d15 -vadd.i64 q3,q12,q3 -vadd.i64 q0,q0,q14 -vst1.8 d12,[r2,: 64]! -vshl.i64 q7,q13,#4 -vst1.8 d13,[r4,: 64]! -vsub.i64 q1,q1,q8 -vshr.s64 q3,q3,#25 -vadd.i64 q0,q0,q7 -vadd.i64 q5,q5,q3 -vshl.i64 q3,q3,#25 -vadd.i64 q6,q5,q11 -vadd.i64 q0,q0,q13 -vshl.i64 q7,q13,#25 -vadd.i64 q8,q0,q11 -vsub.i64 q3,q12,q3 -vshr.s64 q6,q6,#26 -vsub.i64 q7,q10,q7 -vtrn.32 d2,d6 -vshr.s64 q8,q8,#26 -vtrn.32 d3,d7 -vadd.i64 q3,q9,q6 -vst1.8 d2,[r2,: 64] -vshl.i64 q6,q6,#26 -vst1.8 d3,[r4,: 64] -vadd.i64 q1,q4,q8 -vtrn.32 d4,d14 -vshl.i64 q4,q8,#26 -vtrn.32 d5,d15 -vsub.i64 q5,q5,q6 -add r2,r2,#16 -vsub.i64 q0,q0,q4 -vst1.8 d4,[r2,: 64] -add r4,r4,#16 -vst1.8 d5,[r4,: 64] -vtrn.32 d10,d6 -vtrn.32 d11,d7 -sub r2,r2,#8 -sub r4,r4,#8 -vtrn.32 d0,d2 -vtrn.32 d1,d3 -vst1.8 d10,[r2,: 64] -vst1.8 d11,[r4,: 64] -sub r2,r2,#24 -sub r4,r4,#24 -vst1.8 d0,[r2,: 64] -vst1.8 d1,[r4,: 64] -add r2,r3,#288 -add r4,r3,#336 -vld1.8 {d0-d1},[r2,: 128]! -vld1.8 {d2-d3},[r4,: 128]! -vsub.i32 q0,q0,q1 -vld1.8 {d2-d3},[r2,: 128]! -vld1.8 {d4-d5},[r4,: 128]! -vsub.i32 q1,q1,q2 -add r5,r3,#240 -vld1.8 {d4},[r2,: 64] -vld1.8 {d6},[r4,: 64] -vsub.i32 q2,q2,q3 -vst1.8 {d0-d1},[r5,: 128]! -vst1.8 {d2-d3},[r5,: 128]! -vst1.8 d4,[r5,: 64] -add r2,r3,#144 -add r4,r3,#96 -add r5,r3,#144 -add r6,r3,#192 -vld1.8 {d0-d1},[r2,: 128]! -vld1.8 {d2-d3},[r4,: 128]! -vsub.i32 q2,q0,q1 -vadd.i32 q0,q0,q1 -vld1.8 {d2-d3},[r2,: 128]! -vld1.8 {d6-d7},[r4,: 128]! -vsub.i32 q4,q1,q3 -vadd.i32 q1,q1,q3 -vld1.8 {d6},[r2,: 64] -vld1.8 {d10},[r4,: 64] -vsub.i32 q6,q3,q5 -vadd.i32 q3,q3,q5 -vst1.8 {d4-d5},[r5,: 128]! -vst1.8 {d0-d1},[r6,: 128]! -vst1.8 {d8-d9},[r5,: 128]! -vst1.8 {d2-d3},[r6,: 128]! -vst1.8 d12,[r5,: 64] -vst1.8 d6,[r6,: 64] -add r2,r3,#0 -add r4,r3,#240 -vld1.8 {d0-d1},[r4,: 128]! -vld1.8 {d2-d3},[r4,: 128]! -vld1.8 {d4},[r4,: 64] -add r4,r3,#336 -vld1.8 {d6-d7},[r4,: 128]! -vtrn.32 q0,q3 -vld1.8 {d8-d9},[r4,: 128]! -vshl.i32 q5,q0,#4 -vtrn.32 q1,q4 -vshl.i32 q6,q3,#4 -vadd.i32 q5,q5,q0 -vadd.i32 q6,q6,q3 -vshl.i32 q7,q1,#4 -vld1.8 {d5},[r4,: 64] -vshl.i32 q8,q4,#4 -vtrn.32 d4,d5 -vadd.i32 q7,q7,q1 -vadd.i32 q8,q8,q4 -vld1.8 {d18-d19},[r2,: 128]! -vshl.i32 q10,q2,#4 -vld1.8 {d22-d23},[r2,: 128]! -vadd.i32 q10,q10,q2 -vld1.8 {d24},[r2,: 64] -vadd.i32 q5,q5,q0 -add r2,r3,#288 -vld1.8 {d26-d27},[r2,: 128]! -vadd.i32 q6,q6,q3 -vld1.8 {d28-d29},[r2,: 128]! -vadd.i32 q8,q8,q4 -vld1.8 {d25},[r2,: 64] -vadd.i32 q10,q10,q2 -vtrn.32 q9,q13 -vadd.i32 q7,q7,q1 -vadd.i32 q5,q5,q0 -vtrn.32 q11,q14 -vadd.i32 q6,q6,q3 -add r2,sp,#560 -vadd.i32 q10,q10,q2 -vtrn.32 d24,d25 -vst1.8 {d12-d13},[r2,: 128] -vshl.i32 q6,q13,#1 -add r2,sp,#576 -vst1.8 {d20-d21},[r2,: 128] -vshl.i32 q10,q14,#1 -add r2,sp,#592 -vst1.8 {d12-d13},[r2,: 128] -vshl.i32 q15,q12,#1 -vadd.i32 q8,q8,q4 -vext.32 d10,d31,d30,#0 -vadd.i32 q7,q7,q1 -add r2,sp,#608 -vst1.8 {d16-d17},[r2,: 128] -vmull.s32 q8,d18,d5 -vmlal.s32 q8,d26,d4 -vmlal.s32 q8,d19,d9 -vmlal.s32 q8,d27,d3 -vmlal.s32 q8,d22,d8 -vmlal.s32 q8,d28,d2 -vmlal.s32 q8,d23,d7 -vmlal.s32 q8,d29,d1 -vmlal.s32 q8,d24,d6 -vmlal.s32 q8,d25,d0 -add r2,sp,#624 -vst1.8 {d14-d15},[r2,: 128] -vmull.s32 q2,d18,d4 -vmlal.s32 q2,d12,d9 -vmlal.s32 q2,d13,d8 -vmlal.s32 q2,d19,d3 -vmlal.s32 q2,d22,d2 -vmlal.s32 q2,d23,d1 -vmlal.s32 q2,d24,d0 -add r2,sp,#640 -vst1.8 {d20-d21},[r2,: 128] -vmull.s32 q7,d18,d9 -vmlal.s32 q7,d26,d3 -vmlal.s32 q7,d19,d8 -vmlal.s32 q7,d27,d2 -vmlal.s32 q7,d22,d7 -vmlal.s32 q7,d28,d1 -vmlal.s32 q7,d23,d6 -vmlal.s32 q7,d29,d0 -add r2,sp,#656 -vst1.8 {d10-d11},[r2,: 128] -vmull.s32 q5,d18,d3 -vmlal.s32 q5,d19,d2 -vmlal.s32 q5,d22,d1 -vmlal.s32 q5,d23,d0 -vmlal.s32 q5,d12,d8 -add r2,sp,#672 -vst1.8 {d16-d17},[r2,: 128] -vmull.s32 q4,d18,d8 -vmlal.s32 q4,d26,d2 -vmlal.s32 q4,d19,d7 -vmlal.s32 q4,d27,d1 -vmlal.s32 q4,d22,d6 -vmlal.s32 q4,d28,d0 -vmull.s32 q8,d18,d7 -vmlal.s32 q8,d26,d1 -vmlal.s32 q8,d19,d6 -vmlal.s32 q8,d27,d0 -add r2,sp,#576 -vld1.8 {d20-d21},[r2,: 128] -vmlal.s32 q7,d24,d21 -vmlal.s32 q7,d25,d20 -vmlal.s32 q4,d23,d21 -vmlal.s32 q4,d29,d20 -vmlal.s32 q8,d22,d21 -vmlal.s32 q8,d28,d20 -vmlal.s32 q5,d24,d20 -add r2,sp,#576 -vst1.8 {d14-d15},[r2,: 128] -vmull.s32 q7,d18,d6 -vmlal.s32 q7,d26,d0 -add r2,sp,#656 -vld1.8 {d30-d31},[r2,: 128] -vmlal.s32 q2,d30,d21 -vmlal.s32 q7,d19,d21 -vmlal.s32 q7,d27,d20 -add r2,sp,#624 -vld1.8 {d26-d27},[r2,: 128] -vmlal.s32 q4,d25,d27 -vmlal.s32 q8,d29,d27 -vmlal.s32 q8,d25,d26 -vmlal.s32 q7,d28,d27 -vmlal.s32 q7,d29,d26 -add r2,sp,#608 -vld1.8 {d28-d29},[r2,: 128] -vmlal.s32 q4,d24,d29 -vmlal.s32 q8,d23,d29 -vmlal.s32 q8,d24,d28 -vmlal.s32 q7,d22,d29 -vmlal.s32 q7,d23,d28 -add r2,sp,#608 -vst1.8 {d8-d9},[r2,: 128] -add r2,sp,#560 -vld1.8 {d8-d9},[r2,: 128] -vmlal.s32 q7,d24,d9 -vmlal.s32 q7,d25,d31 -vmull.s32 q1,d18,d2 -vmlal.s32 q1,d19,d1 -vmlal.s32 q1,d22,d0 -vmlal.s32 q1,d24,d27 -vmlal.s32 q1,d23,d20 -vmlal.s32 q1,d12,d7 -vmlal.s32 q1,d13,d6 -vmull.s32 q6,d18,d1 -vmlal.s32 q6,d19,d0 -vmlal.s32 q6,d23,d27 -vmlal.s32 q6,d22,d20 -vmlal.s32 q6,d24,d26 -vmull.s32 q0,d18,d0 -vmlal.s32 q0,d22,d27 -vmlal.s32 q0,d23,d26 -vmlal.s32 q0,d24,d31 -vmlal.s32 q0,d19,d20 -add r2,sp,#640 -vld1.8 {d18-d19},[r2,: 128] -vmlal.s32 q2,d18,d7 -vmlal.s32 q2,d19,d6 -vmlal.s32 q5,d18,d6 -vmlal.s32 q5,d19,d21 -vmlal.s32 q1,d18,d21 -vmlal.s32 q1,d19,d29 -vmlal.s32 q0,d18,d28 -vmlal.s32 q0,d19,d9 -vmlal.s32 q6,d18,d29 -vmlal.s32 q6,d19,d28 -add r2,sp,#592 -vld1.8 {d18-d19},[r2,: 128] -add r2,sp,#512 -vld1.8 {d22-d23},[r2,: 128] -vmlal.s32 q5,d19,d7 -vmlal.s32 q0,d18,d21 -vmlal.s32 q0,d19,d29 -vmlal.s32 q6,d18,d6 -add r2,sp,#528 -vld1.8 {d6-d7},[r2,: 128] -vmlal.s32 q6,d19,d21 -add r2,sp,#576 -vld1.8 {d18-d19},[r2,: 128] -vmlal.s32 q0,d30,d8 -add r2,sp,#672 -vld1.8 {d20-d21},[r2,: 128] -vmlal.s32 q5,d30,d29 -add r2,sp,#608 -vld1.8 {d24-d25},[r2,: 128] -vmlal.s32 q1,d30,d28 -vadd.i64 q13,q0,q11 -vadd.i64 q14,q5,q11 -vmlal.s32 q6,d30,d9 -vshr.s64 q4,q13,#26 -vshr.s64 q13,q14,#26 -vadd.i64 q7,q7,q4 -vshl.i64 q4,q4,#26 -vadd.i64 q14,q7,q3 -vadd.i64 q9,q9,q13 -vshl.i64 q13,q13,#26 -vadd.i64 q15,q9,q3 -vsub.i64 q0,q0,q4 -vshr.s64 q4,q14,#25 -vsub.i64 q5,q5,q13 -vshr.s64 q13,q15,#25 -vadd.i64 q6,q6,q4 -vshl.i64 q4,q4,#25 -vadd.i64 q14,q6,q11 -vadd.i64 q2,q2,q13 -vsub.i64 q4,q7,q4 -vshr.s64 q7,q14,#26 -vshl.i64 q13,q13,#25 -vadd.i64 q14,q2,q11 -vadd.i64 q8,q8,q7 -vshl.i64 q7,q7,#26 -vadd.i64 q15,q8,q3 -vsub.i64 q9,q9,q13 -vshr.s64 q13,q14,#26 -vsub.i64 q6,q6,q7 -vshr.s64 q7,q15,#25 -vadd.i64 q10,q10,q13 -vshl.i64 q13,q13,#26 -vadd.i64 q14,q10,q3 -vadd.i64 q1,q1,q7 -add r2,r3,#288 -vshl.i64 q7,q7,#25 -add r4,r3,#96 -vadd.i64 q15,q1,q11 -add r2,r2,#8 -vsub.i64 q2,q2,q13 -add r4,r4,#8 -vshr.s64 q13,q14,#25 -vsub.i64 q7,q8,q7 -vshr.s64 q8,q15,#26 -vadd.i64 q14,q13,q13 -vadd.i64 q12,q12,q8 -vtrn.32 d12,d14 -vshl.i64 q8,q8,#26 -vtrn.32 d13,d15 -vadd.i64 q3,q12,q3 -vadd.i64 q0,q0,q14 -vst1.8 d12,[r2,: 64]! -vshl.i64 q7,q13,#4 -vst1.8 d13,[r4,: 64]! -vsub.i64 q1,q1,q8 -vshr.s64 q3,q3,#25 -vadd.i64 q0,q0,q7 -vadd.i64 q5,q5,q3 -vshl.i64 q3,q3,#25 -vadd.i64 q6,q5,q11 -vadd.i64 q0,q0,q13 -vshl.i64 q7,q13,#25 -vadd.i64 q8,q0,q11 -vsub.i64 q3,q12,q3 -vshr.s64 q6,q6,#26 -vsub.i64 q7,q10,q7 -vtrn.32 d2,d6 -vshr.s64 q8,q8,#26 -vtrn.32 d3,d7 -vadd.i64 q3,q9,q6 -vst1.8 d2,[r2,: 64] -vshl.i64 q6,q6,#26 -vst1.8 d3,[r4,: 64] -vadd.i64 q1,q4,q8 -vtrn.32 d4,d14 -vshl.i64 q4,q8,#26 -vtrn.32 d5,d15 -vsub.i64 q5,q5,q6 -add r2,r2,#16 -vsub.i64 q0,q0,q4 -vst1.8 d4,[r2,: 64] -add r4,r4,#16 -vst1.8 d5,[r4,: 64] -vtrn.32 d10,d6 -vtrn.32 d11,d7 -sub r2,r2,#8 -sub r4,r4,#8 -vtrn.32 d0,d2 -vtrn.32 d1,d3 -vst1.8 d10,[r2,: 64] -vst1.8 d11,[r4,: 64] -sub r2,r2,#24 -sub r4,r4,#24 -vst1.8 d0,[r2,: 64] -vst1.8 d1,[r4,: 64] -add r2,sp,#544 -add r4,r3,#144 -add r5,r3,#192 -vld1.8 {d0-d1},[r2,: 128] -vld1.8 {d2-d3},[r4,: 128]! -vld1.8 {d4-d5},[r5,: 128]! -vzip.i32 q1,q2 -vld1.8 {d6-d7},[r4,: 128]! -vld1.8 {d8-d9},[r5,: 128]! -vshl.i32 q5,q1,#1 -vzip.i32 q3,q4 -vshl.i32 q6,q2,#1 -vld1.8 {d14},[r4,: 64] -vshl.i32 q8,q3,#1 -vld1.8 {d15},[r5,: 64] -vshl.i32 q9,q4,#1 -vmul.i32 d21,d7,d1 -vtrn.32 d14,d15 -vmul.i32 q11,q4,q0 -vmul.i32 q0,q7,q0 -vmull.s32 q12,d2,d2 -vmlal.s32 q12,d11,d1 -vmlal.s32 q12,d12,d0 -vmlal.s32 q12,d13,d23 -vmlal.s32 q12,d16,d22 -vmlal.s32 q12,d7,d21 -vmull.s32 q10,d2,d11 -vmlal.s32 q10,d4,d1 -vmlal.s32 q10,d13,d0 -vmlal.s32 q10,d6,d23 -vmlal.s32 q10,d17,d22 -vmull.s32 q13,d10,d4 -vmlal.s32 q13,d11,d3 -vmlal.s32 q13,d13,d1 -vmlal.s32 q13,d16,d0 -vmlal.s32 q13,d17,d23 -vmlal.s32 q13,d8,d22 -vmull.s32 q1,d10,d5 -vmlal.s32 q1,d11,d4 -vmlal.s32 q1,d6,d1 -vmlal.s32 q1,d17,d0 -vmlal.s32 q1,d8,d23 -vmull.s32 q14,d10,d6 -vmlal.s32 q14,d11,d13 -vmlal.s32 q14,d4,d4 -vmlal.s32 q14,d17,d1 -vmlal.s32 q14,d18,d0 -vmlal.s32 q14,d9,d23 -vmull.s32 q11,d10,d7 -vmlal.s32 q11,d11,d6 -vmlal.s32 q11,d12,d5 -vmlal.s32 q11,d8,d1 -vmlal.s32 q11,d19,d0 -vmull.s32 q15,d10,d8 -vmlal.s32 q15,d11,d17 -vmlal.s32 q15,d12,d6 -vmlal.s32 q15,d13,d5 -vmlal.s32 q15,d19,d1 -vmlal.s32 q15,d14,d0 -vmull.s32 q2,d10,d9 -vmlal.s32 q2,d11,d8 -vmlal.s32 q2,d12,d7 -vmlal.s32 q2,d13,d6 -vmlal.s32 q2,d14,d1 -vmull.s32 q0,d15,d1 -vmlal.s32 q0,d10,d14 -vmlal.s32 q0,d11,d19 -vmlal.s32 q0,d12,d8 -vmlal.s32 q0,d13,d17 -vmlal.s32 q0,d6,d6 -add r2,sp,#512 -vld1.8 {d18-d19},[r2,: 128] -vmull.s32 q3,d16,d7 -vmlal.s32 q3,d10,d15 -vmlal.s32 q3,d11,d14 -vmlal.s32 q3,d12,d9 -vmlal.s32 q3,d13,d8 -add r2,sp,#528 -vld1.8 {d8-d9},[r2,: 128] -vadd.i64 q5,q12,q9 -vadd.i64 q6,q15,q9 -vshr.s64 q5,q5,#26 -vshr.s64 q6,q6,#26 -vadd.i64 q7,q10,q5 -vshl.i64 q5,q5,#26 -vadd.i64 q8,q7,q4 -vadd.i64 q2,q2,q6 -vshl.i64 q6,q6,#26 -vadd.i64 q10,q2,q4 -vsub.i64 q5,q12,q5 -vshr.s64 q8,q8,#25 -vsub.i64 q6,q15,q6 -vshr.s64 q10,q10,#25 -vadd.i64 q12,q13,q8 -vshl.i64 q8,q8,#25 -vadd.i64 q13,q12,q9 -vadd.i64 q0,q0,q10 -vsub.i64 q7,q7,q8 -vshr.s64 q8,q13,#26 -vshl.i64 q10,q10,#25 -vadd.i64 q13,q0,q9 -vadd.i64 q1,q1,q8 -vshl.i64 q8,q8,#26 -vadd.i64 q15,q1,q4 -vsub.i64 q2,q2,q10 -vshr.s64 q10,q13,#26 -vsub.i64 q8,q12,q8 -vshr.s64 q12,q15,#25 -vadd.i64 q3,q3,q10 -vshl.i64 q10,q10,#26 -vadd.i64 q13,q3,q4 -vadd.i64 q14,q14,q12 -add r2,r3,#144 -vshl.i64 q12,q12,#25 -add r4,r3,#192 -vadd.i64 q15,q14,q9 -add r2,r2,#8 -vsub.i64 q0,q0,q10 -add r4,r4,#8 -vshr.s64 q10,q13,#25 -vsub.i64 q1,q1,q12 -vshr.s64 q12,q15,#26 -vadd.i64 q13,q10,q10 -vadd.i64 q11,q11,q12 -vtrn.32 d16,d2 -vshl.i64 q12,q12,#26 -vtrn.32 d17,d3 -vadd.i64 q1,q11,q4 -vadd.i64 q4,q5,q13 -vst1.8 d16,[r2,: 64]! -vshl.i64 q5,q10,#4 -vst1.8 d17,[r4,: 64]! -vsub.i64 q8,q14,q12 -vshr.s64 q1,q1,#25 -vadd.i64 q4,q4,q5 -vadd.i64 q5,q6,q1 -vshl.i64 q1,q1,#25 -vadd.i64 q6,q5,q9 -vadd.i64 q4,q4,q10 -vshl.i64 q10,q10,#25 -vadd.i64 q9,q4,q9 -vsub.i64 q1,q11,q1 -vshr.s64 q6,q6,#26 -vsub.i64 q3,q3,q10 -vtrn.32 d16,d2 -vshr.s64 q9,q9,#26 -vtrn.32 d17,d3 -vadd.i64 q1,q2,q6 -vst1.8 d16,[r2,: 64] -vshl.i64 q2,q6,#26 -vst1.8 d17,[r4,: 64] -vadd.i64 q6,q7,q9 -vtrn.32 d0,d6 -vshl.i64 q7,q9,#26 -vtrn.32 d1,d7 -vsub.i64 q2,q5,q2 -add r2,r2,#16 -vsub.i64 q3,q4,q7 -vst1.8 d0,[r2,: 64] -add r4,r4,#16 -vst1.8 d1,[r4,: 64] -vtrn.32 d4,d2 -vtrn.32 d5,d3 -sub r2,r2,#8 -sub r4,r4,#8 -vtrn.32 d6,d12 -vtrn.32 d7,d13 -vst1.8 d4,[r2,: 64] -vst1.8 d5,[r4,: 64] -sub r2,r2,#24 -sub r4,r4,#24 -vst1.8 d6,[r2,: 64] -vst1.8 d7,[r4,: 64] -add r2,r3,#336 -add r4,r3,#288 -vld1.8 {d0-d1},[r2,: 128]! -vld1.8 {d2-d3},[r4,: 128]! -vadd.i32 q0,q0,q1 -vld1.8 {d2-d3},[r2,: 128]! -vld1.8 {d4-d5},[r4,: 128]! -vadd.i32 q1,q1,q2 -add r5,r3,#288 -vld1.8 {d4},[r2,: 64] -vld1.8 {d6},[r4,: 64] -vadd.i32 q2,q2,q3 -vst1.8 {d0-d1},[r5,: 128]! -vst1.8 {d2-d3},[r5,: 128]! -vst1.8 d4,[r5,: 64] -add r2,r3,#48 -add r4,r3,#144 -vld1.8 {d0-d1},[r4,: 128]! -vld1.8 {d2-d3},[r4,: 128]! -vld1.8 {d4},[r4,: 64] -add r4,r3,#288 -vld1.8 {d6-d7},[r4,: 128]! -vtrn.32 q0,q3 -vld1.8 {d8-d9},[r4,: 128]! -vshl.i32 q5,q0,#4 -vtrn.32 q1,q4 -vshl.i32 q6,q3,#4 -vadd.i32 q5,q5,q0 -vadd.i32 q6,q6,q3 -vshl.i32 q7,q1,#4 -vld1.8 {d5},[r4,: 64] -vshl.i32 q8,q4,#4 -vtrn.32 d4,d5 -vadd.i32 q7,q7,q1 -vadd.i32 q8,q8,q4 -vld1.8 {d18-d19},[r2,: 128]! -vshl.i32 q10,q2,#4 -vld1.8 {d22-d23},[r2,: 128]! -vadd.i32 q10,q10,q2 -vld1.8 {d24},[r2,: 64] -vadd.i32 q5,q5,q0 -add r2,r3,#240 -vld1.8 {d26-d27},[r2,: 128]! -vadd.i32 q6,q6,q3 -vld1.8 {d28-d29},[r2,: 128]! -vadd.i32 q8,q8,q4 -vld1.8 {d25},[r2,: 64] -vadd.i32 q10,q10,q2 -vtrn.32 q9,q13 -vadd.i32 q7,q7,q1 -vadd.i32 q5,q5,q0 -vtrn.32 q11,q14 -vadd.i32 q6,q6,q3 -add r2,sp,#560 -vadd.i32 q10,q10,q2 -vtrn.32 d24,d25 -vst1.8 {d12-d13},[r2,: 128] -vshl.i32 q6,q13,#1 -add r2,sp,#576 -vst1.8 {d20-d21},[r2,: 128] -vshl.i32 q10,q14,#1 -add r2,sp,#592 -vst1.8 {d12-d13},[r2,: 128] -vshl.i32 q15,q12,#1 -vadd.i32 q8,q8,q4 -vext.32 d10,d31,d30,#0 -vadd.i32 q7,q7,q1 -add r2,sp,#608 -vst1.8 {d16-d17},[r2,: 128] -vmull.s32 q8,d18,d5 -vmlal.s32 q8,d26,d4 -vmlal.s32 q8,d19,d9 -vmlal.s32 q8,d27,d3 -vmlal.s32 q8,d22,d8 -vmlal.s32 q8,d28,d2 -vmlal.s32 q8,d23,d7 -vmlal.s32 q8,d29,d1 -vmlal.s32 q8,d24,d6 -vmlal.s32 q8,d25,d0 -add r2,sp,#624 -vst1.8 {d14-d15},[r2,: 128] -vmull.s32 q2,d18,d4 -vmlal.s32 q2,d12,d9 -vmlal.s32 q2,d13,d8 -vmlal.s32 q2,d19,d3 -vmlal.s32 q2,d22,d2 -vmlal.s32 q2,d23,d1 -vmlal.s32 q2,d24,d0 -add r2,sp,#640 -vst1.8 {d20-d21},[r2,: 128] -vmull.s32 q7,d18,d9 -vmlal.s32 q7,d26,d3 -vmlal.s32 q7,d19,d8 -vmlal.s32 q7,d27,d2 -vmlal.s32 q7,d22,d7 -vmlal.s32 q7,d28,d1 -vmlal.s32 q7,d23,d6 -vmlal.s32 q7,d29,d0 -add r2,sp,#656 -vst1.8 {d10-d11},[r2,: 128] -vmull.s32 q5,d18,d3 -vmlal.s32 q5,d19,d2 -vmlal.s32 q5,d22,d1 -vmlal.s32 q5,d23,d0 -vmlal.s32 q5,d12,d8 -add r2,sp,#672 -vst1.8 {d16-d17},[r2,: 128] -vmull.s32 q4,d18,d8 -vmlal.s32 q4,d26,d2 -vmlal.s32 q4,d19,d7 -vmlal.s32 q4,d27,d1 -vmlal.s32 q4,d22,d6 -vmlal.s32 q4,d28,d0 -vmull.s32 q8,d18,d7 -vmlal.s32 q8,d26,d1 -vmlal.s32 q8,d19,d6 -vmlal.s32 q8,d27,d0 -add r2,sp,#576 -vld1.8 {d20-d21},[r2,: 128] -vmlal.s32 q7,d24,d21 -vmlal.s32 q7,d25,d20 -vmlal.s32 q4,d23,d21 -vmlal.s32 q4,d29,d20 -vmlal.s32 q8,d22,d21 -vmlal.s32 q8,d28,d20 -vmlal.s32 q5,d24,d20 -add r2,sp,#576 -vst1.8 {d14-d15},[r2,: 128] -vmull.s32 q7,d18,d6 -vmlal.s32 q7,d26,d0 -add r2,sp,#656 -vld1.8 {d30-d31},[r2,: 128] -vmlal.s32 q2,d30,d21 -vmlal.s32 q7,d19,d21 -vmlal.s32 q7,d27,d20 -add r2,sp,#624 -vld1.8 {d26-d27},[r2,: 128] -vmlal.s32 q4,d25,d27 -vmlal.s32 q8,d29,d27 -vmlal.s32 q8,d25,d26 -vmlal.s32 q7,d28,d27 -vmlal.s32 q7,d29,d26 -add r2,sp,#608 -vld1.8 {d28-d29},[r2,: 128] -vmlal.s32 q4,d24,d29 -vmlal.s32 q8,d23,d29 -vmlal.s32 q8,d24,d28 -vmlal.s32 q7,d22,d29 -vmlal.s32 q7,d23,d28 -add r2,sp,#608 -vst1.8 {d8-d9},[r2,: 128] -add r2,sp,#560 -vld1.8 {d8-d9},[r2,: 128] -vmlal.s32 q7,d24,d9 -vmlal.s32 q7,d25,d31 -vmull.s32 q1,d18,d2 -vmlal.s32 q1,d19,d1 -vmlal.s32 q1,d22,d0 -vmlal.s32 q1,d24,d27 -vmlal.s32 q1,d23,d20 -vmlal.s32 q1,d12,d7 -vmlal.s32 q1,d13,d6 -vmull.s32 q6,d18,d1 -vmlal.s32 q6,d19,d0 -vmlal.s32 q6,d23,d27 -vmlal.s32 q6,d22,d20 -vmlal.s32 q6,d24,d26 -vmull.s32 q0,d18,d0 -vmlal.s32 q0,d22,d27 -vmlal.s32 q0,d23,d26 -vmlal.s32 q0,d24,d31 -vmlal.s32 q0,d19,d20 -add r2,sp,#640 -vld1.8 {d18-d19},[r2,: 128] -vmlal.s32 q2,d18,d7 -vmlal.s32 q2,d19,d6 -vmlal.s32 q5,d18,d6 -vmlal.s32 q5,d19,d21 -vmlal.s32 q1,d18,d21 -vmlal.s32 q1,d19,d29 -vmlal.s32 q0,d18,d28 -vmlal.s32 q0,d19,d9 -vmlal.s32 q6,d18,d29 -vmlal.s32 q6,d19,d28 -add r2,sp,#592 -vld1.8 {d18-d19},[r2,: 128] -add r2,sp,#512 -vld1.8 {d22-d23},[r2,: 128] -vmlal.s32 q5,d19,d7 -vmlal.s32 q0,d18,d21 -vmlal.s32 q0,d19,d29 -vmlal.s32 q6,d18,d6 -add r2,sp,#528 -vld1.8 {d6-d7},[r2,: 128] -vmlal.s32 q6,d19,d21 -add r2,sp,#576 -vld1.8 {d18-d19},[r2,: 128] -vmlal.s32 q0,d30,d8 -add r2,sp,#672 -vld1.8 {d20-d21},[r2,: 128] -vmlal.s32 q5,d30,d29 -add r2,sp,#608 -vld1.8 {d24-d25},[r2,: 128] -vmlal.s32 q1,d30,d28 -vadd.i64 q13,q0,q11 -vadd.i64 q14,q5,q11 -vmlal.s32 q6,d30,d9 -vshr.s64 q4,q13,#26 -vshr.s64 q13,q14,#26 -vadd.i64 q7,q7,q4 -vshl.i64 q4,q4,#26 -vadd.i64 q14,q7,q3 -vadd.i64 q9,q9,q13 -vshl.i64 q13,q13,#26 -vadd.i64 q15,q9,q3 -vsub.i64 q0,q0,q4 -vshr.s64 q4,q14,#25 -vsub.i64 q5,q5,q13 -vshr.s64 q13,q15,#25 -vadd.i64 q6,q6,q4 -vshl.i64 q4,q4,#25 -vadd.i64 q14,q6,q11 -vadd.i64 q2,q2,q13 -vsub.i64 q4,q7,q4 -vshr.s64 q7,q14,#26 -vshl.i64 q13,q13,#25 -vadd.i64 q14,q2,q11 -vadd.i64 q8,q8,q7 -vshl.i64 q7,q7,#26 -vadd.i64 q15,q8,q3 -vsub.i64 q9,q9,q13 -vshr.s64 q13,q14,#26 -vsub.i64 q6,q6,q7 -vshr.s64 q7,q15,#25 -vadd.i64 q10,q10,q13 -vshl.i64 q13,q13,#26 -vadd.i64 q14,q10,q3 -vadd.i64 q1,q1,q7 -add r2,r3,#240 -vshl.i64 q7,q7,#25 -add r4,r3,#144 -vadd.i64 q15,q1,q11 -add r2,r2,#8 -vsub.i64 q2,q2,q13 -add r4,r4,#8 -vshr.s64 q13,q14,#25 -vsub.i64 q7,q8,q7 -vshr.s64 q8,q15,#26 -vadd.i64 q14,q13,q13 -vadd.i64 q12,q12,q8 -vtrn.32 d12,d14 -vshl.i64 q8,q8,#26 -vtrn.32 d13,d15 -vadd.i64 q3,q12,q3 -vadd.i64 q0,q0,q14 -vst1.8 d12,[r2,: 64]! -vshl.i64 q7,q13,#4 -vst1.8 d13,[r4,: 64]! -vsub.i64 q1,q1,q8 -vshr.s64 q3,q3,#25 -vadd.i64 q0,q0,q7 -vadd.i64 q5,q5,q3 -vshl.i64 q3,q3,#25 -vadd.i64 q6,q5,q11 -vadd.i64 q0,q0,q13 -vshl.i64 q7,q13,#25 -vadd.i64 q8,q0,q11 -vsub.i64 q3,q12,q3 -vshr.s64 q6,q6,#26 -vsub.i64 q7,q10,q7 -vtrn.32 d2,d6 -vshr.s64 q8,q8,#26 -vtrn.32 d3,d7 -vadd.i64 q3,q9,q6 -vst1.8 d2,[r2,: 64] -vshl.i64 q6,q6,#26 -vst1.8 d3,[r4,: 64] -vadd.i64 q1,q4,q8 -vtrn.32 d4,d14 -vshl.i64 q4,q8,#26 -vtrn.32 d5,d15 -vsub.i64 q5,q5,q6 -add r2,r2,#16 -vsub.i64 q0,q0,q4 -vst1.8 d4,[r2,: 64] -add r4,r4,#16 -vst1.8 d5,[r4,: 64] -vtrn.32 d10,d6 -vtrn.32 d11,d7 -sub r2,r2,#8 -sub r4,r4,#8 -vtrn.32 d0,d2 -vtrn.32 d1,d3 -vst1.8 d10,[r2,: 64] -vst1.8 d11,[r4,: 64] -sub r2,r2,#24 -sub r4,r4,#24 -vst1.8 d0,[r2,: 64] -vst1.8 d1,[r4,: 64] -ldr r2,[sp,#488] -ldr r4,[sp,#492] -subs r5,r2,#1 -bge ._mainloop -add r1,r3,#144 -add r2,r3,#336 -vld1.8 {d0-d1},[r1,: 128]! -vld1.8 {d2-d3},[r1,: 128]! -vld1.8 {d4},[r1,: 64] -vst1.8 {d0-d1},[r2,: 128]! -vst1.8 {d2-d3},[r2,: 128]! -vst1.8 d4,[r2,: 64] -ldr r1,=0 -._invertloop: -add r2,r3,#144 -ldr r4,=0 -ldr r5,=2 -cmp r1,#1 -ldreq r5,=1 -addeq r2,r3,#336 -addeq r4,r3,#48 -cmp r1,#2 -ldreq r5,=1 -addeq r2,r3,#48 -cmp r1,#3 -ldreq r5,=5 -addeq r4,r3,#336 -cmp r1,#4 -ldreq r5,=10 -cmp r1,#5 -ldreq r5,=20 -cmp r1,#6 -ldreq r5,=10 -addeq r2,r3,#336 -addeq r4,r3,#336 -cmp r1,#7 -ldreq r5,=50 -cmp r1,#8 -ldreq r5,=100 -cmp r1,#9 -ldreq r5,=50 -addeq r2,r3,#336 -cmp r1,#10 -ldreq r5,=5 -addeq r2,r3,#48 -cmp r1,#11 -ldreq r5,=0 -addeq r2,r3,#96 -add r6,r3,#144 -add r7,r3,#288 -vld1.8 {d0-d1},[r6,: 128]! -vld1.8 {d2-d3},[r6,: 128]! -vld1.8 {d4},[r6,: 64] -vst1.8 {d0-d1},[r7,: 128]! -vst1.8 {d2-d3},[r7,: 128]! -vst1.8 d4,[r7,: 64] -cmp r5,#0 -beq ._skipsquaringloop -._squaringloop: -add r6,r3,#288 -add r7,r3,#288 -add r8,r3,#288 -vmov.i32 q0,#19 -vmov.i32 q1,#0 -vmov.i32 q2,#1 -vzip.i32 q1,q2 -vld1.8 {d4-d5},[r7,: 128]! -vld1.8 {d6-d7},[r7,: 128]! -vld1.8 {d9},[r7,: 64] -vld1.8 {d10-d11},[r6,: 128]! -add r7,sp,#416 -vld1.8 {d12-d13},[r6,: 128]! -vmul.i32 q7,q2,q0 -vld1.8 {d8},[r6,: 64] -vext.32 d17,d11,d10,#1 -vmul.i32 q9,q3,q0 -vext.32 d16,d10,d8,#1 -vshl.u32 q10,q5,q1 -vext.32 d22,d14,d4,#1 -vext.32 d24,d18,d6,#1 -vshl.u32 q13,q6,q1 -vshl.u32 d28,d8,d2 -vrev64.i32 d22,d22 -vmul.i32 d1,d9,d1 -vrev64.i32 d24,d24 -vext.32 d29,d8,d13,#1 -vext.32 d0,d1,d9,#1 -vrev64.i32 d0,d0 -vext.32 d2,d9,d1,#1 -vext.32 d23,d15,d5,#1 -vmull.s32 q4,d20,d4 -vrev64.i32 d23,d23 -vmlal.s32 q4,d21,d1 -vrev64.i32 d2,d2 -vmlal.s32 q4,d26,d19 -vext.32 d3,d5,d15,#1 -vmlal.s32 q4,d27,d18 -vrev64.i32 d3,d3 -vmlal.s32 q4,d28,d15 -vext.32 d14,d12,d11,#1 -vmull.s32 q5,d16,d23 -vext.32 d15,d13,d12,#1 -vmlal.s32 q5,d17,d4 -vst1.8 d8,[r7,: 64]! -vmlal.s32 q5,d14,d1 -vext.32 d12,d9,d8,#0 -vmlal.s32 q5,d15,d19 -vmov.i64 d13,#0 -vmlal.s32 q5,d29,d18 -vext.32 d25,d19,d7,#1 -vmlal.s32 q6,d20,d5 -vrev64.i32 d25,d25 -vmlal.s32 q6,d21,d4 -vst1.8 d11,[r7,: 64]! -vmlal.s32 q6,d26,d1 -vext.32 d9,d10,d10,#0 -vmlal.s32 q6,d27,d19 -vmov.i64 d8,#0 -vmlal.s32 q6,d28,d18 -vmlal.s32 q4,d16,d24 -vmlal.s32 q4,d17,d5 -vmlal.s32 q4,d14,d4 -vst1.8 d12,[r7,: 64]! -vmlal.s32 q4,d15,d1 -vext.32 d10,d13,d12,#0 -vmlal.s32 q4,d29,d19 -vmov.i64 d11,#0 -vmlal.s32 q5,d20,d6 -vmlal.s32 q5,d21,d5 -vmlal.s32 q5,d26,d4 -vext.32 d13,d8,d8,#0 -vmlal.s32 q5,d27,d1 -vmov.i64 d12,#0 -vmlal.s32 q5,d28,d19 -vst1.8 d9,[r7,: 64]! -vmlal.s32 q6,d16,d25 -vmlal.s32 q6,d17,d6 -vst1.8 d10,[r7,: 64] -vmlal.s32 q6,d14,d5 -vext.32 d8,d11,d10,#0 -vmlal.s32 q6,d15,d4 -vmov.i64 d9,#0 -vmlal.s32 q6,d29,d1 -vmlal.s32 q4,d20,d7 -vmlal.s32 q4,d21,d6 -vmlal.s32 q4,d26,d5 -vext.32 d11,d12,d12,#0 -vmlal.s32 q4,d27,d4 -vmov.i64 d10,#0 -vmlal.s32 q4,d28,d1 -vmlal.s32 q5,d16,d0 -sub r6,r7,#32 -vmlal.s32 q5,d17,d7 -vmlal.s32 q5,d14,d6 -vext.32 d30,d9,d8,#0 -vmlal.s32 q5,d15,d5 -vld1.8 {d31},[r6,: 64]! -vmlal.s32 q5,d29,d4 -vmlal.s32 q15,d20,d0 -vext.32 d0,d6,d18,#1 -vmlal.s32 q15,d21,d25 -vrev64.i32 d0,d0 -vmlal.s32 q15,d26,d24 -vext.32 d1,d7,d19,#1 -vext.32 d7,d10,d10,#0 -vmlal.s32 q15,d27,d23 -vrev64.i32 d1,d1 -vld1.8 {d6},[r6,: 64] -vmlal.s32 q15,d28,d22 -vmlal.s32 q3,d16,d4 -add r6,r6,#24 -vmlal.s32 q3,d17,d2 -vext.32 d4,d31,d30,#0 -vmov d17,d11 -vmlal.s32 q3,d14,d1 -vext.32 d11,d13,d13,#0 -vext.32 d13,d30,d30,#0 -vmlal.s32 q3,d15,d0 -vext.32 d1,d8,d8,#0 -vmlal.s32 q3,d29,d3 -vld1.8 {d5},[r6,: 64] -sub r6,r6,#16 -vext.32 d10,d6,d6,#0 -vmov.i32 q1,#0xffffffff -vshl.i64 q4,q1,#25 -add r7,sp,#512 -vld1.8 {d14-d15},[r7,: 128] -vadd.i64 q9,q2,q7 -vshl.i64 q1,q1,#26 -vshr.s64 q10,q9,#26 -vld1.8 {d0},[r6,: 64]! -vadd.i64 q5,q5,q10 -vand q9,q9,q1 -vld1.8 {d16},[r6,: 64]! -add r6,sp,#528 -vld1.8 {d20-d21},[r6,: 128] -vadd.i64 q11,q5,q10 -vsub.i64 q2,q2,q9 -vshr.s64 q9,q11,#25 -vext.32 d12,d5,d4,#0 -vand q11,q11,q4 -vadd.i64 q0,q0,q9 -vmov d19,d7 -vadd.i64 q3,q0,q7 -vsub.i64 q5,q5,q11 -vshr.s64 q11,q3,#26 -vext.32 d18,d11,d10,#0 -vand q3,q3,q1 -vadd.i64 q8,q8,q11 -vadd.i64 q11,q8,q10 -vsub.i64 q0,q0,q3 -vshr.s64 q3,q11,#25 -vand q11,q11,q4 -vadd.i64 q3,q6,q3 -vadd.i64 q6,q3,q7 -vsub.i64 q8,q8,q11 -vshr.s64 q11,q6,#26 -vand q6,q6,q1 -vadd.i64 q9,q9,q11 -vadd.i64 d25,d19,d21 -vsub.i64 q3,q3,q6 -vshr.s64 d23,d25,#25 -vand q4,q12,q4 -vadd.i64 d21,d23,d23 -vshl.i64 d25,d23,#4 -vadd.i64 d21,d21,d23 -vadd.i64 d25,d25,d21 -vadd.i64 d4,d4,d25 -vzip.i32 q0,q8 -vadd.i64 d12,d4,d14 -add r6,r8,#8 -vst1.8 d0,[r6,: 64] -vsub.i64 d19,d19,d9 -add r6,r6,#16 -vst1.8 d16,[r6,: 64] -vshr.s64 d22,d12,#26 -vand q0,q6,q1 -vadd.i64 d10,d10,d22 -vzip.i32 q3,q9 -vsub.i64 d4,d4,d0 -sub r6,r6,#8 -vst1.8 d6,[r6,: 64] -add r6,r6,#16 -vst1.8 d18,[r6,: 64] -vzip.i32 q2,q5 -sub r6,r6,#32 -vst1.8 d4,[r6,: 64] -subs r5,r5,#1 -bhi ._squaringloop -._skipsquaringloop: -mov r2,r2 -add r5,r3,#288 -add r6,r3,#144 -vmov.i32 q0,#19 -vmov.i32 q1,#0 -vmov.i32 q2,#1 -vzip.i32 q1,q2 -vld1.8 {d4-d5},[r5,: 128]! -vld1.8 {d6-d7},[r5,: 128]! -vld1.8 {d9},[r5,: 64] -vld1.8 {d10-d11},[r2,: 128]! -add r5,sp,#416 -vld1.8 {d12-d13},[r2,: 128]! -vmul.i32 q7,q2,q0 -vld1.8 {d8},[r2,: 64] -vext.32 d17,d11,d10,#1 -vmul.i32 q9,q3,q0 -vext.32 d16,d10,d8,#1 -vshl.u32 q10,q5,q1 -vext.32 d22,d14,d4,#1 -vext.32 d24,d18,d6,#1 -vshl.u32 q13,q6,q1 -vshl.u32 d28,d8,d2 -vrev64.i32 d22,d22 -vmul.i32 d1,d9,d1 -vrev64.i32 d24,d24 -vext.32 d29,d8,d13,#1 -vext.32 d0,d1,d9,#1 -vrev64.i32 d0,d0 -vext.32 d2,d9,d1,#1 -vext.32 d23,d15,d5,#1 -vmull.s32 q4,d20,d4 -vrev64.i32 d23,d23 -vmlal.s32 q4,d21,d1 -vrev64.i32 d2,d2 -vmlal.s32 q4,d26,d19 -vext.32 d3,d5,d15,#1 -vmlal.s32 q4,d27,d18 -vrev64.i32 d3,d3 -vmlal.s32 q4,d28,d15 -vext.32 d14,d12,d11,#1 -vmull.s32 q5,d16,d23 -vext.32 d15,d13,d12,#1 -vmlal.s32 q5,d17,d4 -vst1.8 d8,[r5,: 64]! -vmlal.s32 q5,d14,d1 -vext.32 d12,d9,d8,#0 -vmlal.s32 q5,d15,d19 -vmov.i64 d13,#0 -vmlal.s32 q5,d29,d18 -vext.32 d25,d19,d7,#1 -vmlal.s32 q6,d20,d5 -vrev64.i32 d25,d25 -vmlal.s32 q6,d21,d4 -vst1.8 d11,[r5,: 64]! -vmlal.s32 q6,d26,d1 -vext.32 d9,d10,d10,#0 -vmlal.s32 q6,d27,d19 -vmov.i64 d8,#0 -vmlal.s32 q6,d28,d18 -vmlal.s32 q4,d16,d24 -vmlal.s32 q4,d17,d5 -vmlal.s32 q4,d14,d4 -vst1.8 d12,[r5,: 64]! -vmlal.s32 q4,d15,d1 -vext.32 d10,d13,d12,#0 -vmlal.s32 q4,d29,d19 -vmov.i64 d11,#0 -vmlal.s32 q5,d20,d6 -vmlal.s32 q5,d21,d5 -vmlal.s32 q5,d26,d4 -vext.32 d13,d8,d8,#0 -vmlal.s32 q5,d27,d1 -vmov.i64 d12,#0 -vmlal.s32 q5,d28,d19 -vst1.8 d9,[r5,: 64]! -vmlal.s32 q6,d16,d25 -vmlal.s32 q6,d17,d6 -vst1.8 d10,[r5,: 64] -vmlal.s32 q6,d14,d5 -vext.32 d8,d11,d10,#0 -vmlal.s32 q6,d15,d4 -vmov.i64 d9,#0 -vmlal.s32 q6,d29,d1 -vmlal.s32 q4,d20,d7 -vmlal.s32 q4,d21,d6 -vmlal.s32 q4,d26,d5 -vext.32 d11,d12,d12,#0 -vmlal.s32 q4,d27,d4 -vmov.i64 d10,#0 -vmlal.s32 q4,d28,d1 -vmlal.s32 q5,d16,d0 -sub r2,r5,#32 -vmlal.s32 q5,d17,d7 -vmlal.s32 q5,d14,d6 -vext.32 d30,d9,d8,#0 -vmlal.s32 q5,d15,d5 -vld1.8 {d31},[r2,: 64]! -vmlal.s32 q5,d29,d4 -vmlal.s32 q15,d20,d0 -vext.32 d0,d6,d18,#1 -vmlal.s32 q15,d21,d25 -vrev64.i32 d0,d0 -vmlal.s32 q15,d26,d24 -vext.32 d1,d7,d19,#1 -vext.32 d7,d10,d10,#0 -vmlal.s32 q15,d27,d23 -vrev64.i32 d1,d1 -vld1.8 {d6},[r2,: 64] -vmlal.s32 q15,d28,d22 -vmlal.s32 q3,d16,d4 -add r2,r2,#24 -vmlal.s32 q3,d17,d2 -vext.32 d4,d31,d30,#0 -vmov d17,d11 -vmlal.s32 q3,d14,d1 -vext.32 d11,d13,d13,#0 -vext.32 d13,d30,d30,#0 -vmlal.s32 q3,d15,d0 -vext.32 d1,d8,d8,#0 -vmlal.s32 q3,d29,d3 -vld1.8 {d5},[r2,: 64] -sub r2,r2,#16 -vext.32 d10,d6,d6,#0 -vmov.i32 q1,#0xffffffff -vshl.i64 q4,q1,#25 -add r5,sp,#512 -vld1.8 {d14-d15},[r5,: 128] -vadd.i64 q9,q2,q7 -vshl.i64 q1,q1,#26 -vshr.s64 q10,q9,#26 -vld1.8 {d0},[r2,: 64]! -vadd.i64 q5,q5,q10 -vand q9,q9,q1 -vld1.8 {d16},[r2,: 64]! -add r2,sp,#528 -vld1.8 {d20-d21},[r2,: 128] -vadd.i64 q11,q5,q10 -vsub.i64 q2,q2,q9 -vshr.s64 q9,q11,#25 -vext.32 d12,d5,d4,#0 -vand q11,q11,q4 -vadd.i64 q0,q0,q9 -vmov d19,d7 -vadd.i64 q3,q0,q7 -vsub.i64 q5,q5,q11 -vshr.s64 q11,q3,#26 -vext.32 d18,d11,d10,#0 -vand q3,q3,q1 -vadd.i64 q8,q8,q11 -vadd.i64 q11,q8,q10 -vsub.i64 q0,q0,q3 -vshr.s64 q3,q11,#25 -vand q11,q11,q4 -vadd.i64 q3,q6,q3 -vadd.i64 q6,q3,q7 -vsub.i64 q8,q8,q11 -vshr.s64 q11,q6,#26 -vand q6,q6,q1 -vadd.i64 q9,q9,q11 -vadd.i64 d25,d19,d21 -vsub.i64 q3,q3,q6 -vshr.s64 d23,d25,#25 -vand q4,q12,q4 -vadd.i64 d21,d23,d23 -vshl.i64 d25,d23,#4 -vadd.i64 d21,d21,d23 -vadd.i64 d25,d25,d21 -vadd.i64 d4,d4,d25 -vzip.i32 q0,q8 -vadd.i64 d12,d4,d14 -add r2,r6,#8 -vst1.8 d0,[r2,: 64] -vsub.i64 d19,d19,d9 -add r2,r2,#16 -vst1.8 d16,[r2,: 64] -vshr.s64 d22,d12,#26 -vand q0,q6,q1 -vadd.i64 d10,d10,d22 -vzip.i32 q3,q9 -vsub.i64 d4,d4,d0 -sub r2,r2,#8 -vst1.8 d6,[r2,: 64] -add r2,r2,#16 -vst1.8 d18,[r2,: 64] -vzip.i32 q2,q5 -sub r2,r2,#32 -vst1.8 d4,[r2,: 64] -cmp r4,#0 -beq ._skippostcopy -add r2,r3,#144 -mov r4,r4 -vld1.8 {d0-d1},[r2,: 128]! -vld1.8 {d2-d3},[r2,: 128]! -vld1.8 {d4},[r2,: 64] -vst1.8 {d0-d1},[r4,: 128]! -vst1.8 {d2-d3},[r4,: 128]! -vst1.8 d4,[r4,: 64] -._skippostcopy: -cmp r1,#1 -bne ._skipfinalcopy -add r2,r3,#288 -add r4,r3,#144 -vld1.8 {d0-d1},[r2,: 128]! -vld1.8 {d2-d3},[r2,: 128]! -vld1.8 {d4},[r2,: 64] -vst1.8 {d0-d1},[r4,: 128]! -vst1.8 {d2-d3},[r4,: 128]! -vst1.8 d4,[r4,: 64] -._skipfinalcopy: -add r1,r1,#1 -cmp r1,#12 -blo ._invertloop -add r1,r3,#144 -ldr r2,[r1],#4 -ldr r3,[r1],#4 -ldr r4,[r1],#4 -ldr r5,[r1],#4 -ldr r6,[r1],#4 -ldr r7,[r1],#4 -ldr r8,[r1],#4 -ldr r9,[r1],#4 -ldr r10,[r1],#4 -ldr r1,[r1] -add r11,r1,r1,LSL #4 -add r11,r11,r1,LSL #1 -add r11,r11,#16777216 -mov r11,r11,ASR #25 -add r11,r11,r2 -mov r11,r11,ASR #26 -add r11,r11,r3 -mov r11,r11,ASR #25 -add r11,r11,r4 -mov r11,r11,ASR #26 -add r11,r11,r5 -mov r11,r11,ASR #25 -add r11,r11,r6 -mov r11,r11,ASR #26 -add r11,r11,r7 -mov r11,r11,ASR #25 -add r11,r11,r8 -mov r11,r11,ASR #26 -add r11,r11,r9 -mov r11,r11,ASR #25 -add r11,r11,r10 -mov r11,r11,ASR #26 -add r11,r11,r1 -mov r11,r11,ASR #25 -add r2,r2,r11 -add r2,r2,r11,LSL #1 -add r2,r2,r11,LSL #4 -mov r11,r2,ASR #26 -add r3,r3,r11 -sub r2,r2,r11,LSL #26 -mov r11,r3,ASR #25 -add r4,r4,r11 -sub r3,r3,r11,LSL #25 -mov r11,r4,ASR #26 -add r5,r5,r11 -sub r4,r4,r11,LSL #26 -mov r11,r5,ASR #25 -add r6,r6,r11 -sub r5,r5,r11,LSL #25 -mov r11,r6,ASR #26 -add r7,r7,r11 -sub r6,r6,r11,LSL #26 -mov r11,r7,ASR #25 -add r8,r8,r11 -sub r7,r7,r11,LSL #25 -mov r11,r8,ASR #26 -add r9,r9,r11 -sub r8,r8,r11,LSL #26 -mov r11,r9,ASR #25 -add r10,r10,r11 -sub r9,r9,r11,LSL #25 -mov r11,r10,ASR #26 -add r1,r1,r11 -sub r10,r10,r11,LSL #26 -mov r11,r1,ASR #25 -sub r1,r1,r11,LSL #25 -add r2,r2,r3,LSL #26 -mov r3,r3,LSR #6 -add r3,r3,r4,LSL #19 -mov r4,r4,LSR #13 -add r4,r4,r5,LSL #13 -mov r5,r5,LSR #19 -add r5,r5,r6,LSL #6 -add r6,r7,r8,LSL #25 -mov r7,r8,LSR #7 -add r7,r7,r9,LSL #19 -mov r8,r9,LSR #13 -add r8,r8,r10,LSL #12 -mov r9,r10,LSR #20 -add r1,r9,r1,LSL #6 -str r2,[r0],#4 -str r3,[r0],#4 -str r4,[r0],#4 -str r5,[r0],#4 -str r6,[r0],#4 -str r7,[r0],#4 -str r8,[r0],#4 -str r1,[r0] -ldrd r4,[sp,#0] -ldrd r6,[sp,#8] -ldrd r8,[sp,#16] -ldrd r10,[sp,#24] -ldr r12,[sp,#480] -ldr r14,[sp,#484] -ldr r0,=0 -mov sp,r12 -vpop {q4,q5,q6,q7} -bx lr - -#endif /* !OPENSSL_NO_ASM && __arm__ && !__APPLE__ */ - -#if defined(__ELF__) -.section .note.GNU-stack,"",%progbits -#endif diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/crypto/curve25519/curve25519.c temporalio-1.3.0/vendor/ring-0.16.20/crypto/curve25519/curve25519.c --- temporalio-1.3.0/vendor/ring-0.16.20/crypto/curve25519/curve25519.c 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/crypto/curve25519/curve25519.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,1911 +0,0 @@ -/* Copyright (c) 2020, Google Inc. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY - * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION - * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ - -// Some of this code is taken from the ref10 version of Ed25519 in SUPERCOP -// 20141124 (http://bench.cr.yp.to/supercop.html). That code is released as -// public domain. Other parts have been replaced to call into code generated by -// Fiat (https://github.com/mit-plv/fiat-crypto) in //third_party/fiat. -// -// The field functions are shared by Ed25519 and X25519 where possible. - -#include - -#include "internal.h" -#include "../internal.h" - -#if defined(_MSC_VER) && !defined(__clang__) -// '=': conversion from 'int64_t' to 'int32_t', possible loss of data -#pragma warning(disable: 4242) -// '=': conversion from 'int32_t' to 'uint8_t', possible loss of data -#pragma warning(disable: 4244) -#endif - -#if defined(__GNUC__) -#pragma GCC diagnostic ignored "-Wconversion" -#pragma GCC diagnostic ignored "-Wsign-conversion" -#endif - -// Various pre-computed constants. -#include "./curve25519_tables.h" - -#if defined(BORINGSSL_CURVE25519_64BIT) -#if defined(__GNUC__) -#pragma GCC diagnostic ignored "-Wpedantic" -#endif -#include "../../third_party/fiat/curve25519_64.h" -#else -#include "../../third_party/fiat/curve25519_32.h" -#endif // BORINGSSL_CURVE25519_64BIT - - -// Low-level intrinsic operations - -static uint64_t load_3(const uint8_t *in) { - uint64_t result; - result = (uint64_t)in[0]; - result |= ((uint64_t)in[1]) << 8; - result |= ((uint64_t)in[2]) << 16; - return result; -} - -static uint64_t load_4(const uint8_t *in) { - uint64_t result; - result = (uint64_t)in[0]; - result |= ((uint64_t)in[1]) << 8; - result |= ((uint64_t)in[2]) << 16; - result |= ((uint64_t)in[3]) << 24; - return result; -} - - -// Field operations. - -#if defined(BORINGSSL_CURVE25519_64BIT) - -// assert_fe asserts that |f| satisfies bounds: -// -// [[0x0 ~> 0x8cccccccccccc], -// [0x0 ~> 0x8cccccccccccc], -// [0x0 ~> 0x8cccccccccccc], -// [0x0 ~> 0x8cccccccccccc], -// [0x0 ~> 0x8cccccccccccc]] -// -// See comments in curve25519_64.h for which functions use these bounds for -// inputs or outputs. -#define assert_fe(f) \ - do { \ - for (unsigned _assert_fe_i = 0; _assert_fe_i < 5; _assert_fe_i++) { \ - dev_assert_secret(f[_assert_fe_i] <= UINT64_C(0x8cccccccccccc)); \ - } \ - } while (0) - -// assert_fe_loose asserts that |f| satisfies bounds: -// -// [[0x0 ~> 0x1a666666666664], -// [0x0 ~> 0x1a666666666664], -// [0x0 ~> 0x1a666666666664], -// [0x0 ~> 0x1a666666666664], -// [0x0 ~> 0x1a666666666664]] -// -// See comments in curve25519_64.h for which functions use these bounds for -// inputs or outputs. -#define assert_fe_loose(f) \ - do { \ - for (unsigned _assert_fe_i = 0; _assert_fe_i < 5; _assert_fe_i++) { \ - dev_assert_secret(f[_assert_fe_i] <= UINT64_C(0x1a666666666664)); \ - } \ - } while (0) - -#else - -// assert_fe asserts that |f| satisfies bounds: -// -// [[0x0 ~> 0x4666666], [0x0 ~> 0x2333333], -// [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], -// [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], -// [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], -// [0x0 ~> 0x4666666], [0x0 ~> 0x2333333]] -// -// See comments in curve25519_32.h for which functions use these bounds for -// inputs or outputs. -#define assert_fe(f) \ - do { \ - for (unsigned _assert_fe_i = 0; _assert_fe_i < 10; _assert_fe_i++) { \ - dev_assert_secret(f[_assert_fe_i] <= \ - ((_assert_fe_i & 1) ? 0x2333333u : 0x4666666u)); \ - } \ - } while (0) - -// assert_fe_loose asserts that |f| satisfies bounds: -// -// [[0x0 ~> 0xd333332], [0x0 ~> 0x6999999], -// [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], -// [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], -// [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], -// [0x0 ~> 0xd333332], [0x0 ~> 0x6999999]] -// -// See comments in curve25519_32.h for which functions use these bounds for -// inputs or outputs. -#define assert_fe_loose(f) \ - do { \ - for (unsigned _assert_fe_i = 0; _assert_fe_i < 10; _assert_fe_i++) { \ - dev_assert_secret(f[_assert_fe_i] <= \ - ((_assert_fe_i & 1) ? 0x6999999u : 0xd333332u)); \ - } \ - } while (0) - -#endif // BORINGSSL_CURVE25519_64BIT - -OPENSSL_STATIC_ASSERT(sizeof(fe) == sizeof(fe_limb_t) * FE_NUM_LIMBS, - "fe_limb_t[FE_NUM_LIMBS] is inconsistent with fe"); - -static void fe_frombytes_strict(fe *h, const uint8_t s[32]) { - // |fiat_25519_from_bytes| requires the top-most bit be clear. - dev_assert_secret((s[31] & 0x80) == 0); - fiat_25519_from_bytes(h->v, s); - assert_fe(h->v); -} - -static void fe_frombytes(fe *h, const uint8_t s[32]) { - uint8_t s_copy[32]; - GFp_memcpy(s_copy, s, 32); - s_copy[31] &= 0x7f; - fe_frombytes_strict(h, s_copy); -} - -static void fe_tobytes(uint8_t s[32], const fe *f) { - assert_fe(f->v); - fiat_25519_to_bytes(s, f->v); -} - -// h = 0 -static void fe_0(fe *h) { - GFp_memset(h, 0, sizeof(fe)); -} - -static void fe_loose_0(fe_loose *h) { - GFp_memset(h, 0, sizeof(fe_loose)); -} - -// h = 1 -static void fe_1(fe *h) { - GFp_memset(h, 0, sizeof(fe)); - h->v[0] = 1; -} - -static void fe_loose_1(fe_loose *h) { - GFp_memset(h, 0, sizeof(fe_loose)); - h->v[0] = 1; -} - -// h = f + g -// Can overlap h with f or g. -static void fe_add(fe_loose *h, const fe *f, const fe *g) { - assert_fe(f->v); - assert_fe(g->v); - fiat_25519_add(h->v, f->v, g->v); - assert_fe_loose(h->v); -} - -// h = f - g -// Can overlap h with f or g. -static void fe_sub(fe_loose *h, const fe *f, const fe *g) { - assert_fe(f->v); - assert_fe(g->v); - fiat_25519_sub(h->v, f->v, g->v); - assert_fe_loose(h->v); -} - -static void fe_carry(fe *h, const fe_loose* f) { - assert_fe_loose(f->v); - fiat_25519_carry(h->v, f->v); - assert_fe(h->v); -} - -static void fe_mul_impl(fe_limb_t out[FE_NUM_LIMBS], - const fe_limb_t in1[FE_NUM_LIMBS], - const fe_limb_t in2[FE_NUM_LIMBS]) { - assert_fe_loose(in1); - assert_fe_loose(in2); - fiat_25519_carry_mul(out, in1, in2); - assert_fe(out); -} - -static void fe_mul_ltt(fe_loose *h, const fe *f, const fe *g) { - fe_mul_impl(h->v, f->v, g->v); -} - -// static void fe_mul_llt(fe_loose *h, const fe_loose *f, const fe *g) was -// removed. This comment is here to make diffs vs. BoringSSL easier to read. - - -static void fe_mul_ttt(fe *h, const fe *f, const fe *g) { - fe_mul_impl(h->v, f->v, g->v); -} - -static void fe_mul_tlt(fe *h, const fe_loose *f, const fe *g) { - fe_mul_impl(h->v, f->v, g->v); -} - -static void fe_mul_ttl(fe *h, const fe *f, const fe_loose *g) { - fe_mul_impl(h->v, f->v, g->v); -} - -static void fe_mul_tll(fe *h, const fe_loose *f, const fe_loose *g) { - fe_mul_impl(h->v, f->v, g->v); -} - -static void fe_sq_tl(fe *h, const fe_loose *f) { - assert_fe_loose(f->v); - fiat_25519_carry_square(h->v, f->v); - assert_fe(h->v); -} - -static void fe_sq_tt(fe *h, const fe *f) { - assert_fe_loose(f->v); - fiat_25519_carry_square(h->v, f->v); - assert_fe(h->v); -} - -// Replace (f,g) with (g,f) if b == 1; -// replace (f,g) with (f,g) if b == 0. -// -// Preconditions: b in {0,1}. -static void fe_cswap(fe *f, fe *g, fe_limb_t b) { - b = 0-b; - for (unsigned i = 0; i < FE_NUM_LIMBS; i++) { - fe_limb_t x = f->v[i] ^ g->v[i]; - x &= b; - f->v[i] ^= x; - g->v[i] ^= x; - } -} - -static void fe_mul121666(fe *h, const fe_loose *f) { - assert_fe_loose(f->v); - fiat_25519_carry_scmul_121666(h->v, f->v); - assert_fe(h->v); -} - -// h = -f -static void fe_neg(fe_loose *h, const fe *f) { - assert_fe(f->v); - fiat_25519_opp(h->v, f->v); - assert_fe_loose(h->v); -} - -// Replace (f,g) with (g,g) if b == 1; -// replace (f,g) with (f,g) if b == 0. -// -// Preconditions: b in {0,1}. -static void fe_cmov(fe_loose *f, const fe_loose *g, fe_limb_t b) { - // Silence an unused function warning. |fiat_25519_selectznz| isn't quite the - // calling convention the rest of this code wants, so implement it by hand. - // - // TODO(davidben): Switch to fiat's calling convention, or ask fiat to emit a - // different one. - (void)fiat_25519_selectznz; - - b = 0-b; - for (unsigned i = 0; i < FE_NUM_LIMBS; i++) { - fe_limb_t x = f->v[i] ^ g->v[i]; - x &= b; - f->v[i] ^= x; - } -} - -// h = f -static void fe_copy(fe *h, const fe *f) { - fe_limbs_copy(h->v, f->v); -} - -static void fe_copy_lt(fe_loose *h, const fe *f) { - fe_limbs_copy(h->v, f->v); -} -#if !defined(OPENSSL_SMALL) -static void fe_copy_ll(fe_loose *h, const fe_loose *f) { - fe_limbs_copy(h->v, f->v); -} -#endif // !defined(OPENSSL_SMALL) - -static void fe_loose_invert(fe *out, const fe_loose *z) { - fe t0; - fe t1; - fe t2; - fe t3; - int i; - - fe_sq_tl(&t0, z); - fe_sq_tt(&t1, &t0); - for (i = 1; i < 2; ++i) { - fe_sq_tt(&t1, &t1); - } - fe_mul_tlt(&t1, z, &t1); - fe_mul_ttt(&t0, &t0, &t1); - fe_sq_tt(&t2, &t0); - fe_mul_ttt(&t1, &t1, &t2); - fe_sq_tt(&t2, &t1); - for (i = 1; i < 5; ++i) { - fe_sq_tt(&t2, &t2); - } - fe_mul_ttt(&t1, &t2, &t1); - fe_sq_tt(&t2, &t1); - for (i = 1; i < 10; ++i) { - fe_sq_tt(&t2, &t2); - } - fe_mul_ttt(&t2, &t2, &t1); - fe_sq_tt(&t3, &t2); - for (i = 1; i < 20; ++i) { - fe_sq_tt(&t3, &t3); - } - fe_mul_ttt(&t2, &t3, &t2); - fe_sq_tt(&t2, &t2); - for (i = 1; i < 10; ++i) { - fe_sq_tt(&t2, &t2); - } - fe_mul_ttt(&t1, &t2, &t1); - fe_sq_tt(&t2, &t1); - for (i = 1; i < 50; ++i) { - fe_sq_tt(&t2, &t2); - } - fe_mul_ttt(&t2, &t2, &t1); - fe_sq_tt(&t3, &t2); - for (i = 1; i < 100; ++i) { - fe_sq_tt(&t3, &t3); - } - fe_mul_ttt(&t2, &t3, &t2); - fe_sq_tt(&t2, &t2); - for (i = 1; i < 50; ++i) { - fe_sq_tt(&t2, &t2); - } - fe_mul_ttt(&t1, &t2, &t1); - fe_sq_tt(&t1, &t1); - for (i = 1; i < 5; ++i) { - fe_sq_tt(&t1, &t1); - } - fe_mul_ttt(out, &t1, &t0); -} - -static void fe_invert(fe *out, const fe *z) { - fe_loose l; - fe_copy_lt(&l, z); - fe_loose_invert(out, &l); -} - -// return 0 if f == 0 -// return 1 if f != 0 -static int fe_isnonzero(const fe_loose *f) { - fe tight; - fe_carry(&tight, f); - uint8_t s[32]; - fe_tobytes(s, &tight); - - static const uint8_t zero[32] = {0}; - return GFp_memcmp(s, zero, sizeof(zero)) != 0; -} - -// return 1 if f is in {1,3,5,...,q-2} -// return 0 if f is in {0,2,4,...,q-1} -static int fe_isnegative(const fe *f) { - uint8_t s[32]; - fe_tobytes(s, f); - return s[0] & 1; -} - -static void fe_sq2_tt(fe *h, const fe *f) { - // h = f^2 - fe_sq_tt(h, f); - - // h = h + h - fe_loose tmp; - fe_add(&tmp, h, h); - fe_carry(h, &tmp); -} - -static void fe_pow22523(fe *out, const fe *z) { - fe t0; - fe t1; - fe t2; - int i; - - fe_sq_tt(&t0, z); - fe_sq_tt(&t1, &t0); - for (i = 1; i < 2; ++i) { - fe_sq_tt(&t1, &t1); - } - fe_mul_ttt(&t1, z, &t1); - fe_mul_ttt(&t0, &t0, &t1); - fe_sq_tt(&t0, &t0); - fe_mul_ttt(&t0, &t1, &t0); - fe_sq_tt(&t1, &t0); - for (i = 1; i < 5; ++i) { - fe_sq_tt(&t1, &t1); - } - fe_mul_ttt(&t0, &t1, &t0); - fe_sq_tt(&t1, &t0); - for (i = 1; i < 10; ++i) { - fe_sq_tt(&t1, &t1); - } - fe_mul_ttt(&t1, &t1, &t0); - fe_sq_tt(&t2, &t1); - for (i = 1; i < 20; ++i) { - fe_sq_tt(&t2, &t2); - } - fe_mul_ttt(&t1, &t2, &t1); - fe_sq_tt(&t1, &t1); - for (i = 1; i < 10; ++i) { - fe_sq_tt(&t1, &t1); - } - fe_mul_ttt(&t0, &t1, &t0); - fe_sq_tt(&t1, &t0); - for (i = 1; i < 50; ++i) { - fe_sq_tt(&t1, &t1); - } - fe_mul_ttt(&t1, &t1, &t0); - fe_sq_tt(&t2, &t1); - for (i = 1; i < 100; ++i) { - fe_sq_tt(&t2, &t2); - } - fe_mul_ttt(&t1, &t2, &t1); - fe_sq_tt(&t1, &t1); - for (i = 1; i < 50; ++i) { - fe_sq_tt(&t1, &t1); - } - fe_mul_ttt(&t0, &t1, &t0); - fe_sq_tt(&t0, &t0); - for (i = 1; i < 2; ++i) { - fe_sq_tt(&t0, &t0); - } - fe_mul_ttt(out, &t0, z); -} - - -// Group operations. - -int GFp_x25519_ge_frombytes_vartime(ge_p3 *h, const uint8_t s[32]) { - fe u; - fe_loose v; - fe v3; - fe vxx; - fe_loose check; - - fe_frombytes(&h->Y, s); - fe_1(&h->Z); - fe_sq_tt(&v3, &h->Y); - fe_mul_ttt(&vxx, &v3, &d); - fe_sub(&v, &v3, &h->Z); // u = y^2-1 - fe_carry(&u, &v); - fe_add(&v, &vxx, &h->Z); // v = dy^2+1 - - fe_sq_tl(&v3, &v); - fe_mul_ttl(&v3, &v3, &v); // v3 = v^3 - fe_sq_tt(&h->X, &v3); - fe_mul_ttl(&h->X, &h->X, &v); - fe_mul_ttt(&h->X, &h->X, &u); // x = uv^7 - - fe_pow22523(&h->X, &h->X); // x = (uv^7)^((q-5)/8) - fe_mul_ttt(&h->X, &h->X, &v3); - fe_mul_ttt(&h->X, &h->X, &u); // x = uv^3(uv^7)^((q-5)/8) - - fe_sq_tt(&vxx, &h->X); - fe_mul_ttl(&vxx, &vxx, &v); - fe_sub(&check, &vxx, &u); - if (fe_isnonzero(&check)) { - fe_add(&check, &vxx, &u); - if (fe_isnonzero(&check)) { - return 0; - } - fe_mul_ttt(&h->X, &h->X, &sqrtm1); - } - - if (fe_isnegative(&h->X) != (s[31] >> 7)) { - fe_loose t; - fe_neg(&t, &h->X); - fe_carry(&h->X, &t); - } - - fe_mul_ttt(&h->T, &h->X, &h->Y); - return 1; -} - -static void ge_p2_0(ge_p2 *h) { - fe_0(&h->X); - fe_1(&h->Y); - fe_1(&h->Z); -} - -static void ge_p3_0(ge_p3 *h) { - fe_0(&h->X); - fe_1(&h->Y); - fe_1(&h->Z); - fe_0(&h->T); -} - -static void ge_precomp_0(ge_precomp *h) { - fe_loose_1(&h->yplusx); - fe_loose_1(&h->yminusx); - fe_loose_0(&h->xy2d); -} - -// r = p -static void ge_p3_to_p2(ge_p2 *r, const ge_p3 *p) { - fe_copy(&r->X, &p->X); - fe_copy(&r->Y, &p->Y); - fe_copy(&r->Z, &p->Z); -} - -// r = p -static void x25519_ge_p3_to_cached(ge_cached *r, const ge_p3 *p) { - fe_add(&r->YplusX, &p->Y, &p->X); - fe_sub(&r->YminusX, &p->Y, &p->X); - fe_copy_lt(&r->Z, &p->Z); - fe_mul_ltt(&r->T2d, &p->T, &d2); -} - -// r = p -static void x25519_ge_p1p1_to_p2(ge_p2 *r, const ge_p1p1 *p) { - fe_mul_tll(&r->X, &p->X, &p->T); - fe_mul_tll(&r->Y, &p->Y, &p->Z); - fe_mul_tll(&r->Z, &p->Z, &p->T); -} - -// r = p -static void x25519_ge_p1p1_to_p3(ge_p3 *r, const ge_p1p1 *p) { - fe_mul_tll(&r->X, &p->X, &p->T); - fe_mul_tll(&r->Y, &p->Y, &p->Z); - fe_mul_tll(&r->Z, &p->Z, &p->T); - fe_mul_tll(&r->T, &p->X, &p->Y); -} - -// r = 2 * p -static void ge_p2_dbl(ge_p1p1 *r, const ge_p2 *p) { - fe trX, trZ, trT; - fe t0; - - fe_sq_tt(&trX, &p->X); - fe_sq_tt(&trZ, &p->Y); - fe_sq2_tt(&trT, &p->Z); - fe_add(&r->Y, &p->X, &p->Y); - fe_sq_tl(&t0, &r->Y); - - fe_add(&r->Y, &trZ, &trX); - fe_sub(&r->Z, &trZ, &trX); - fe_carry(&trZ, &r->Y); - fe_sub(&r->X, &t0, &trZ); - fe_carry(&trZ, &r->Z); - fe_sub(&r->T, &trT, &trZ); -} - -// r = 2 * p -static void ge_p3_dbl(ge_p1p1 *r, const ge_p3 *p) { - ge_p2 q; - ge_p3_to_p2(&q, p); - ge_p2_dbl(r, &q); -} - -// r = p + q -static void ge_madd(ge_p1p1 *r, const ge_p3 *p, const ge_precomp *q) { - fe trY, trZ, trT; - - fe_add(&r->X, &p->Y, &p->X); - fe_sub(&r->Y, &p->Y, &p->X); - fe_mul_tll(&trZ, &r->X, &q->yplusx); - fe_mul_tll(&trY, &r->Y, &q->yminusx); - fe_mul_tlt(&trT, &q->xy2d, &p->T); - fe_add(&r->T, &p->Z, &p->Z); - fe_sub(&r->X, &trZ, &trY); - fe_add(&r->Y, &trZ, &trY); - fe_carry(&trZ, &r->T); - fe_add(&r->Z, &trZ, &trT); - fe_sub(&r->T, &trZ, &trT); -} - -// r = p - q -static void ge_msub(ge_p1p1 *r, const ge_p3 *p, const ge_precomp *q) { - fe trY, trZ, trT; - - fe_add(&r->X, &p->Y, &p->X); - fe_sub(&r->Y, &p->Y, &p->X); - fe_mul_tll(&trZ, &r->X, &q->yminusx); - fe_mul_tll(&trY, &r->Y, &q->yplusx); - fe_mul_tlt(&trT, &q->xy2d, &p->T); - fe_add(&r->T, &p->Z, &p->Z); - fe_sub(&r->X, &trZ, &trY); - fe_add(&r->Y, &trZ, &trY); - fe_carry(&trZ, &r->T); - fe_sub(&r->Z, &trZ, &trT); - fe_add(&r->T, &trZ, &trT); -} - -// r = p + q -static void x25519_ge_add(ge_p1p1 *r, const ge_p3 *p, const ge_cached *q) { - fe trX, trY, trZ, trT; - - fe_add(&r->X, &p->Y, &p->X); - fe_sub(&r->Y, &p->Y, &p->X); - fe_mul_tll(&trZ, &r->X, &q->YplusX); - fe_mul_tll(&trY, &r->Y, &q->YminusX); - fe_mul_tlt(&trT, &q->T2d, &p->T); - fe_mul_ttl(&trX, &p->Z, &q->Z); - fe_add(&r->T, &trX, &trX); - fe_sub(&r->X, &trZ, &trY); - fe_add(&r->Y, &trZ, &trY); - fe_carry(&trZ, &r->T); - fe_add(&r->Z, &trZ, &trT); - fe_sub(&r->T, &trZ, &trT); -} - -// r = p - q -static void x25519_ge_sub(ge_p1p1 *r, const ge_p3 *p, const ge_cached *q) { - fe trX, trY, trZ, trT; - - fe_add(&r->X, &p->Y, &p->X); - fe_sub(&r->Y, &p->Y, &p->X); - fe_mul_tll(&trZ, &r->X, &q->YminusX); - fe_mul_tll(&trY, &r->Y, &q->YplusX); - fe_mul_tlt(&trT, &q->T2d, &p->T); - fe_mul_ttl(&trX, &p->Z, &q->Z); - fe_add(&r->T, &trX, &trX); - fe_sub(&r->X, &trZ, &trY); - fe_add(&r->Y, &trZ, &trY); - fe_carry(&trZ, &r->T); - fe_sub(&r->Z, &trZ, &trT); - fe_add(&r->T, &trZ, &trT); -} - -static uint8_t equal(signed char b, signed char c) { - uint8_t ub = b; - uint8_t uc = c; - uint8_t x = ub ^ uc; // 0: yes; 1..255: no - uint32_t y = x; // 0: yes; 1..255: no - y -= 1; // 4294967295: yes; 0..254: no - y >>= 31; // 1: yes; 0: no - return y; -} - -static void cmov(ge_precomp *t, const ge_precomp *u, uint8_t b) { - fe_cmov(&t->yplusx, &u->yplusx, b); - fe_cmov(&t->yminusx, &u->yminusx, b); - fe_cmov(&t->xy2d, &u->xy2d, b); -} - -#if defined(OPENSSL_SMALL) - -static void x25519_ge_scalarmult_small_precomp( - ge_p3 *h, const uint8_t a[32], const uint8_t precomp_table[15 * 2 * 32]) { - // precomp_table is first expanded into matching |ge_precomp| - // elements. - ge_precomp multiples[15]; - - unsigned i; - for (i = 0; i < 15; i++) { - // The precomputed table is assumed to already clear the top bit, so - // |fe_frombytes_strict| may be used directly. - const uint8_t *bytes = &precomp_table[i*(2 * 32)]; - fe x, y; - fe_frombytes_strict(&x, bytes); - fe_frombytes_strict(&y, bytes + 32); - - ge_precomp *out = &multiples[i]; - fe_add(&out->yplusx, &y, &x); - fe_sub(&out->yminusx, &y, &x); - fe_mul_ltt(&out->xy2d, &x, &y); - fe_mul_llt(&out->xy2d, &out->xy2d, &d2); - } - - // See the comment above |k25519SmallPrecomp| about the structure of the - // precomputed elements. This loop does 64 additions and 64 doublings to - // calculate the result. - ge_p3_0(h); - - for (i = 63; i < 64; i--) { - unsigned j; - signed char index = 0; - - for (j = 0; j < 4; j++) { - const uint8_t bit = 1 & (a[(8 * j) + (i / 8)] >> (i & 7)); - index |= (bit << j); - } - - ge_precomp e; - ge_precomp_0(&e); - - for (j = 1; j < 16; j++) { - cmov(&e, &multiples[j-1], equal(index, j)); - } - - ge_cached cached; - ge_p1p1 r; - x25519_ge_p3_to_cached(&cached, h); - x25519_ge_add(&r, h, &cached); - x25519_ge_p1p1_to_p3(h, &r); - - ge_madd(&r, h, &e); - x25519_ge_p1p1_to_p3(h, &r); - } -} - -void x25519_ge_scalarmult_base(ge_p3 *h, const uint8_t a[32]) { - x25519_ge_scalarmult_small_precomp(h, a, k25519SmallPrecomp); -} - -#else - -static uint8_t negative(signed char b) { - uint32_t x = b; - x >>= 31; // 1: yes; 0: no - return x; -} - -static void table_select(ge_precomp *t, int pos, signed char b) { - ge_precomp minust; - uint8_t bnegative = negative(b); - uint8_t babs = b - ((uint8_t)((-bnegative) & b) << 1); - - ge_precomp_0(t); - cmov(t, &k25519Precomp[pos][0], equal(babs, 1)); - cmov(t, &k25519Precomp[pos][1], equal(babs, 2)); - cmov(t, &k25519Precomp[pos][2], equal(babs, 3)); - cmov(t, &k25519Precomp[pos][3], equal(babs, 4)); - cmov(t, &k25519Precomp[pos][4], equal(babs, 5)); - cmov(t, &k25519Precomp[pos][5], equal(babs, 6)); - cmov(t, &k25519Precomp[pos][6], equal(babs, 7)); - cmov(t, &k25519Precomp[pos][7], equal(babs, 8)); - fe_copy_ll(&minust.yplusx, &t->yminusx); - fe_copy_ll(&minust.yminusx, &t->yplusx); - - // NOTE: the input table is canonical, but types don't encode it - fe tmp; - fe_carry(&tmp, &t->xy2d); - fe_neg(&minust.xy2d, &tmp); - - cmov(t, &minust, bnegative); -} - -// h = a * B -// where a = a[0]+256*a[1]+...+256^31 a[31] -// B is the Ed25519 base point (x,4/5) with x positive. -// -// Preconditions: -// a[31] <= 127 -void GFp_x25519_ge_scalarmult_base(ge_p3 *h, const uint8_t *a) { - signed char e[64]; - signed char carry; - ge_p1p1 r; - ge_p2 s; - ge_precomp t; - int i; - - for (i = 0; i < 32; ++i) { - e[2 * i + 0] = (a[i] >> 0) & 15; - e[2 * i + 1] = (a[i] >> 4) & 15; - } - // each e[i] is between 0 and 15 - // e[63] is between 0 and 7 - - carry = 0; - for (i = 0; i < 63; ++i) { - e[i] += carry; - carry = e[i] + 8; - carry >>= 4; - e[i] -= carry << 4; - } - e[63] += carry; - // each e[i] is between -8 and 8 - - ge_p3_0(h); - for (i = 1; i < 64; i += 2) { - table_select(&t, i / 2, e[i]); - ge_madd(&r, h, &t); - x25519_ge_p1p1_to_p3(h, &r); - } - - ge_p3_dbl(&r, h); - x25519_ge_p1p1_to_p2(&s, &r); - ge_p2_dbl(&r, &s); - x25519_ge_p1p1_to_p2(&s, &r); - ge_p2_dbl(&r, &s); - x25519_ge_p1p1_to_p2(&s, &r); - ge_p2_dbl(&r, &s); - x25519_ge_p1p1_to_p3(h, &r); - - for (i = 0; i < 64; i += 2) { - table_select(&t, i / 2, e[i]); - ge_madd(&r, h, &t); - x25519_ge_p1p1_to_p3(h, &r); - } -} - -#endif - -static void slide(signed char *r, const uint8_t *a) { - int i; - int b; - int k; - - for (i = 0; i < 256; ++i) { - r[i] = 1 & (a[i >> 3] >> (i & 7)); - } - - for (i = 0; i < 256; ++i) { - if (r[i]) { - for (b = 1; b <= 6 && i + b < 256; ++b) { - if (r[i + b]) { - if (r[i] + (r[i + b] << b) <= 15) { - r[i] += r[i + b] << b; - r[i + b] = 0; - } else if (r[i] - (r[i + b] << b) >= -15) { - r[i] -= r[i + b] << b; - for (k = i + b; k < 256; ++k) { - if (!r[k]) { - r[k] = 1; - break; - } - r[k] = 0; - } - } else { - break; - } - } - } - } - } -} - -// r = a * A + b * B -// where a = a[0]+256*a[1]+...+256^31 a[31]. -// and b = b[0]+256*b[1]+...+256^31 b[31]. -// B is the Ed25519 base point (x,4/5) with x positive. -static void ge_double_scalarmult_vartime(ge_p2 *r, const uint8_t *a, - const ge_p3 *A, const uint8_t *b) { - signed char aslide[256]; - signed char bslide[256]; - ge_cached Ai[8]; // A,3A,5A,7A,9A,11A,13A,15A - ge_p1p1 t; - ge_p3 u; - ge_p3 A2; - int i; - - slide(aslide, a); - slide(bslide, b); - - x25519_ge_p3_to_cached(&Ai[0], A); - ge_p3_dbl(&t, A); - x25519_ge_p1p1_to_p3(&A2, &t); - x25519_ge_add(&t, &A2, &Ai[0]); - x25519_ge_p1p1_to_p3(&u, &t); - x25519_ge_p3_to_cached(&Ai[1], &u); - x25519_ge_add(&t, &A2, &Ai[1]); - x25519_ge_p1p1_to_p3(&u, &t); - x25519_ge_p3_to_cached(&Ai[2], &u); - x25519_ge_add(&t, &A2, &Ai[2]); - x25519_ge_p1p1_to_p3(&u, &t); - x25519_ge_p3_to_cached(&Ai[3], &u); - x25519_ge_add(&t, &A2, &Ai[3]); - x25519_ge_p1p1_to_p3(&u, &t); - x25519_ge_p3_to_cached(&Ai[4], &u); - x25519_ge_add(&t, &A2, &Ai[4]); - x25519_ge_p1p1_to_p3(&u, &t); - x25519_ge_p3_to_cached(&Ai[5], &u); - x25519_ge_add(&t, &A2, &Ai[5]); - x25519_ge_p1p1_to_p3(&u, &t); - x25519_ge_p3_to_cached(&Ai[6], &u); - x25519_ge_add(&t, &A2, &Ai[6]); - x25519_ge_p1p1_to_p3(&u, &t); - x25519_ge_p3_to_cached(&Ai[7], &u); - - ge_p2_0(r); - - for (i = 255; i >= 0; --i) { - if (aslide[i] || bslide[i]) { - break; - } - } - - for (; i >= 0; --i) { - ge_p2_dbl(&t, r); - - if (aslide[i] > 0) { - x25519_ge_p1p1_to_p3(&u, &t); - x25519_ge_add(&t, &u, &Ai[aslide[i] / 2]); - } else if (aslide[i] < 0) { - x25519_ge_p1p1_to_p3(&u, &t); - x25519_ge_sub(&t, &u, &Ai[(-aslide[i]) / 2]); - } - - if (bslide[i] > 0) { - x25519_ge_p1p1_to_p3(&u, &t); - ge_madd(&t, &u, &Bi[bslide[i] / 2]); - } else if (bslide[i] < 0) { - x25519_ge_p1p1_to_p3(&u, &t); - ge_msub(&t, &u, &Bi[(-bslide[i]) / 2]); - } - - x25519_ge_p1p1_to_p2(r, &t); - } -} - -// int64_lshift21 returns |a << 21| but is defined when shifting bits into the -// sign bit. This works around a language flaw in C. -static inline int64_t int64_lshift21(int64_t a) { - return (int64_t)((uint64_t)a << 21); -} - -// The set of scalars is \Z/l -// where l = 2^252 + 27742317777372353535851937790883648493. - -// Input: -// s[0]+256*s[1]+...+256^63*s[63] = s -// -// Output: -// s[0]+256*s[1]+...+256^31*s[31] = s mod l -// where l = 2^252 + 27742317777372353535851937790883648493. -// Overwrites s in place. -void GFp_x25519_sc_reduce(uint8_t s[64]) { - int64_t s0 = 2097151 & load_3(s); - int64_t s1 = 2097151 & (load_4(s + 2) >> 5); - int64_t s2 = 2097151 & (load_3(s + 5) >> 2); - int64_t s3 = 2097151 & (load_4(s + 7) >> 7); - int64_t s4 = 2097151 & (load_4(s + 10) >> 4); - int64_t s5 = 2097151 & (load_3(s + 13) >> 1); - int64_t s6 = 2097151 & (load_4(s + 15) >> 6); - int64_t s7 = 2097151 & (load_3(s + 18) >> 3); - int64_t s8 = 2097151 & load_3(s + 21); - int64_t s9 = 2097151 & (load_4(s + 23) >> 5); - int64_t s10 = 2097151 & (load_3(s + 26) >> 2); - int64_t s11 = 2097151 & (load_4(s + 28) >> 7); - int64_t s12 = 2097151 & (load_4(s + 31) >> 4); - int64_t s13 = 2097151 & (load_3(s + 34) >> 1); - int64_t s14 = 2097151 & (load_4(s + 36) >> 6); - int64_t s15 = 2097151 & (load_3(s + 39) >> 3); - int64_t s16 = 2097151 & load_3(s + 42); - int64_t s17 = 2097151 & (load_4(s + 44) >> 5); - int64_t s18 = 2097151 & (load_3(s + 47) >> 2); - int64_t s19 = 2097151 & (load_4(s + 49) >> 7); - int64_t s20 = 2097151 & (load_4(s + 52) >> 4); - int64_t s21 = 2097151 & (load_3(s + 55) >> 1); - int64_t s22 = 2097151 & (load_4(s + 57) >> 6); - int64_t s23 = (load_4(s + 60) >> 3); - int64_t carry0; - int64_t carry1; - int64_t carry2; - int64_t carry3; - int64_t carry4; - int64_t carry5; - int64_t carry6; - int64_t carry7; - int64_t carry8; - int64_t carry9; - int64_t carry10; - int64_t carry11; - int64_t carry12; - int64_t carry13; - int64_t carry14; - int64_t carry15; - int64_t carry16; - - s11 += s23 * 666643; - s12 += s23 * 470296; - s13 += s23 * 654183; - s14 -= s23 * 997805; - s15 += s23 * 136657; - s16 -= s23 * 683901; - s23 = 0; - - s10 += s22 * 666643; - s11 += s22 * 470296; - s12 += s22 * 654183; - s13 -= s22 * 997805; - s14 += s22 * 136657; - s15 -= s22 * 683901; - s22 = 0; - - s9 += s21 * 666643; - s10 += s21 * 470296; - s11 += s21 * 654183; - s12 -= s21 * 997805; - s13 += s21 * 136657; - s14 -= s21 * 683901; - s21 = 0; - - s8 += s20 * 666643; - s9 += s20 * 470296; - s10 += s20 * 654183; - s11 -= s20 * 997805; - s12 += s20 * 136657; - s13 -= s20 * 683901; - s20 = 0; - - s7 += s19 * 666643; - s8 += s19 * 470296; - s9 += s19 * 654183; - s10 -= s19 * 997805; - s11 += s19 * 136657; - s12 -= s19 * 683901; - s19 = 0; - - s6 += s18 * 666643; - s7 += s18 * 470296; - s8 += s18 * 654183; - s9 -= s18 * 997805; - s10 += s18 * 136657; - s11 -= s18 * 683901; - s18 = 0; - - carry6 = (s6 + (1 << 20)) >> 21; - s7 += carry6; - s6 -= int64_lshift21(carry6); - carry8 = (s8 + (1 << 20)) >> 21; - s9 += carry8; - s8 -= int64_lshift21(carry8); - carry10 = (s10 + (1 << 20)) >> 21; - s11 += carry10; - s10 -= int64_lshift21(carry10); - carry12 = (s12 + (1 << 20)) >> 21; - s13 += carry12; - s12 -= int64_lshift21(carry12); - carry14 = (s14 + (1 << 20)) >> 21; - s15 += carry14; - s14 -= int64_lshift21(carry14); - carry16 = (s16 + (1 << 20)) >> 21; - s17 += carry16; - s16 -= int64_lshift21(carry16); - - carry7 = (s7 + (1 << 20)) >> 21; - s8 += carry7; - s7 -= int64_lshift21(carry7); - carry9 = (s9 + (1 << 20)) >> 21; - s10 += carry9; - s9 -= int64_lshift21(carry9); - carry11 = (s11 + (1 << 20)) >> 21; - s12 += carry11; - s11 -= int64_lshift21(carry11); - carry13 = (s13 + (1 << 20)) >> 21; - s14 += carry13; - s13 -= int64_lshift21(carry13); - carry15 = (s15 + (1 << 20)) >> 21; - s16 += carry15; - s15 -= int64_lshift21(carry15); - - s5 += s17 * 666643; - s6 += s17 * 470296; - s7 += s17 * 654183; - s8 -= s17 * 997805; - s9 += s17 * 136657; - s10 -= s17 * 683901; - s17 = 0; - - s4 += s16 * 666643; - s5 += s16 * 470296; - s6 += s16 * 654183; - s7 -= s16 * 997805; - s8 += s16 * 136657; - s9 -= s16 * 683901; - s16 = 0; - - s3 += s15 * 666643; - s4 += s15 * 470296; - s5 += s15 * 654183; - s6 -= s15 * 997805; - s7 += s15 * 136657; - s8 -= s15 * 683901; - s15 = 0; - - s2 += s14 * 666643; - s3 += s14 * 470296; - s4 += s14 * 654183; - s5 -= s14 * 997805; - s6 += s14 * 136657; - s7 -= s14 * 683901; - s14 = 0; - - s1 += s13 * 666643; - s2 += s13 * 470296; - s3 += s13 * 654183; - s4 -= s13 * 997805; - s5 += s13 * 136657; - s6 -= s13 * 683901; - s13 = 0; - - s0 += s12 * 666643; - s1 += s12 * 470296; - s2 += s12 * 654183; - s3 -= s12 * 997805; - s4 += s12 * 136657; - s5 -= s12 * 683901; - s12 = 0; - - carry0 = (s0 + (1 << 20)) >> 21; - s1 += carry0; - s0 -= int64_lshift21(carry0); - carry2 = (s2 + (1 << 20)) >> 21; - s3 += carry2; - s2 -= int64_lshift21(carry2); - carry4 = (s4 + (1 << 20)) >> 21; - s5 += carry4; - s4 -= int64_lshift21(carry4); - carry6 = (s6 + (1 << 20)) >> 21; - s7 += carry6; - s6 -= int64_lshift21(carry6); - carry8 = (s8 + (1 << 20)) >> 21; - s9 += carry8; - s8 -= int64_lshift21(carry8); - carry10 = (s10 + (1 << 20)) >> 21; - s11 += carry10; - s10 -= int64_lshift21(carry10); - - carry1 = (s1 + (1 << 20)) >> 21; - s2 += carry1; - s1 -= int64_lshift21(carry1); - carry3 = (s3 + (1 << 20)) >> 21; - s4 += carry3; - s3 -= int64_lshift21(carry3); - carry5 = (s5 + (1 << 20)) >> 21; - s6 += carry5; - s5 -= int64_lshift21(carry5); - carry7 = (s7 + (1 << 20)) >> 21; - s8 += carry7; - s7 -= int64_lshift21(carry7); - carry9 = (s9 + (1 << 20)) >> 21; - s10 += carry9; - s9 -= int64_lshift21(carry9); - carry11 = (s11 + (1 << 20)) >> 21; - s12 += carry11; - s11 -= int64_lshift21(carry11); - - s0 += s12 * 666643; - s1 += s12 * 470296; - s2 += s12 * 654183; - s3 -= s12 * 997805; - s4 += s12 * 136657; - s5 -= s12 * 683901; - s12 = 0; - - carry0 = s0 >> 21; - s1 += carry0; - s0 -= int64_lshift21(carry0); - carry1 = s1 >> 21; - s2 += carry1; - s1 -= int64_lshift21(carry1); - carry2 = s2 >> 21; - s3 += carry2; - s2 -= int64_lshift21(carry2); - carry3 = s3 >> 21; - s4 += carry3; - s3 -= int64_lshift21(carry3); - carry4 = s4 >> 21; - s5 += carry4; - s4 -= int64_lshift21(carry4); - carry5 = s5 >> 21; - s6 += carry5; - s5 -= int64_lshift21(carry5); - carry6 = s6 >> 21; - s7 += carry6; - s6 -= int64_lshift21(carry6); - carry7 = s7 >> 21; - s8 += carry7; - s7 -= int64_lshift21(carry7); - carry8 = s8 >> 21; - s9 += carry8; - s8 -= int64_lshift21(carry8); - carry9 = s9 >> 21; - s10 += carry9; - s9 -= int64_lshift21(carry9); - carry10 = s10 >> 21; - s11 += carry10; - s10 -= int64_lshift21(carry10); - carry11 = s11 >> 21; - s12 += carry11; - s11 -= int64_lshift21(carry11); - - s0 += s12 * 666643; - s1 += s12 * 470296; - s2 += s12 * 654183; - s3 -= s12 * 997805; - s4 += s12 * 136657; - s5 -= s12 * 683901; - s12 = 0; - - carry0 = s0 >> 21; - s1 += carry0; - s0 -= int64_lshift21(carry0); - carry1 = s1 >> 21; - s2 += carry1; - s1 -= int64_lshift21(carry1); - carry2 = s2 >> 21; - s3 += carry2; - s2 -= int64_lshift21(carry2); - carry3 = s3 >> 21; - s4 += carry3; - s3 -= int64_lshift21(carry3); - carry4 = s4 >> 21; - s5 += carry4; - s4 -= int64_lshift21(carry4); - carry5 = s5 >> 21; - s6 += carry5; - s5 -= int64_lshift21(carry5); - carry6 = s6 >> 21; - s7 += carry6; - s6 -= int64_lshift21(carry6); - carry7 = s7 >> 21; - s8 += carry7; - s7 -= int64_lshift21(carry7); - carry8 = s8 >> 21; - s9 += carry8; - s8 -= int64_lshift21(carry8); - carry9 = s9 >> 21; - s10 += carry9; - s9 -= int64_lshift21(carry9); - carry10 = s10 >> 21; - s11 += carry10; - s10 -= int64_lshift21(carry10); - - s[0] = s0 >> 0; - s[1] = s0 >> 8; - s[2] = (s0 >> 16) | (s1 << 5); - s[3] = s1 >> 3; - s[4] = s1 >> 11; - s[5] = (s1 >> 19) | (s2 << 2); - s[6] = s2 >> 6; - s[7] = (s2 >> 14) | (s3 << 7); - s[8] = s3 >> 1; - s[9] = s3 >> 9; - s[10] = (s3 >> 17) | (s4 << 4); - s[11] = s4 >> 4; - s[12] = s4 >> 12; - s[13] = (s4 >> 20) | (s5 << 1); - s[14] = s5 >> 7; - s[15] = (s5 >> 15) | (s6 << 6); - s[16] = s6 >> 2; - s[17] = s6 >> 10; - s[18] = (s6 >> 18) | (s7 << 3); - s[19] = s7 >> 5; - s[20] = s7 >> 13; - s[21] = s8 >> 0; - s[22] = s8 >> 8; - s[23] = (s8 >> 16) | (s9 << 5); - s[24] = s9 >> 3; - s[25] = s9 >> 11; - s[26] = (s9 >> 19) | (s10 << 2); - s[27] = s10 >> 6; - s[28] = (s10 >> 14) | (s11 << 7); - s[29] = s11 >> 1; - s[30] = s11 >> 9; - s[31] = s11 >> 17; -} - -// Input: -// a[0]+256*a[1]+...+256^31*a[31] = a -// b[0]+256*b[1]+...+256^31*b[31] = b -// c[0]+256*c[1]+...+256^31*c[31] = c -// -// Output: -// s[0]+256*s[1]+...+256^31*s[31] = (ab+c) mod l -// where l = 2^252 + 27742317777372353535851937790883648493. -static void sc_muladd(uint8_t *s, const uint8_t *a, const uint8_t *b, - const uint8_t *c) { - int64_t a0 = 2097151 & load_3(a); - int64_t a1 = 2097151 & (load_4(a + 2) >> 5); - int64_t a2 = 2097151 & (load_3(a + 5) >> 2); - int64_t a3 = 2097151 & (load_4(a + 7) >> 7); - int64_t a4 = 2097151 & (load_4(a + 10) >> 4); - int64_t a5 = 2097151 & (load_3(a + 13) >> 1); - int64_t a6 = 2097151 & (load_4(a + 15) >> 6); - int64_t a7 = 2097151 & (load_3(a + 18) >> 3); - int64_t a8 = 2097151 & load_3(a + 21); - int64_t a9 = 2097151 & (load_4(a + 23) >> 5); - int64_t a10 = 2097151 & (load_3(a + 26) >> 2); - int64_t a11 = (load_4(a + 28) >> 7); - int64_t b0 = 2097151 & load_3(b); - int64_t b1 = 2097151 & (load_4(b + 2) >> 5); - int64_t b2 = 2097151 & (load_3(b + 5) >> 2); - int64_t b3 = 2097151 & (load_4(b + 7) >> 7); - int64_t b4 = 2097151 & (load_4(b + 10) >> 4); - int64_t b5 = 2097151 & (load_3(b + 13) >> 1); - int64_t b6 = 2097151 & (load_4(b + 15) >> 6); - int64_t b7 = 2097151 & (load_3(b + 18) >> 3); - int64_t b8 = 2097151 & load_3(b + 21); - int64_t b9 = 2097151 & (load_4(b + 23) >> 5); - int64_t b10 = 2097151 & (load_3(b + 26) >> 2); - int64_t b11 = (load_4(b + 28) >> 7); - int64_t c0 = 2097151 & load_3(c); - int64_t c1 = 2097151 & (load_4(c + 2) >> 5); - int64_t c2 = 2097151 & (load_3(c + 5) >> 2); - int64_t c3 = 2097151 & (load_4(c + 7) >> 7); - int64_t c4 = 2097151 & (load_4(c + 10) >> 4); - int64_t c5 = 2097151 & (load_3(c + 13) >> 1); - int64_t c6 = 2097151 & (load_4(c + 15) >> 6); - int64_t c7 = 2097151 & (load_3(c + 18) >> 3); - int64_t c8 = 2097151 & load_3(c + 21); - int64_t c9 = 2097151 & (load_4(c + 23) >> 5); - int64_t c10 = 2097151 & (load_3(c + 26) >> 2); - int64_t c11 = (load_4(c + 28) >> 7); - int64_t s0; - int64_t s1; - int64_t s2; - int64_t s3; - int64_t s4; - int64_t s5; - int64_t s6; - int64_t s7; - int64_t s8; - int64_t s9; - int64_t s10; - int64_t s11; - int64_t s12; - int64_t s13; - int64_t s14; - int64_t s15; - int64_t s16; - int64_t s17; - int64_t s18; - int64_t s19; - int64_t s20; - int64_t s21; - int64_t s22; - int64_t s23; - int64_t carry0; - int64_t carry1; - int64_t carry2; - int64_t carry3; - int64_t carry4; - int64_t carry5; - int64_t carry6; - int64_t carry7; - int64_t carry8; - int64_t carry9; - int64_t carry10; - int64_t carry11; - int64_t carry12; - int64_t carry13; - int64_t carry14; - int64_t carry15; - int64_t carry16; - int64_t carry17; - int64_t carry18; - int64_t carry19; - int64_t carry20; - int64_t carry21; - int64_t carry22; - - s0 = c0 + a0 * b0; - s1 = c1 + a0 * b1 + a1 * b0; - s2 = c2 + a0 * b2 + a1 * b1 + a2 * b0; - s3 = c3 + a0 * b3 + a1 * b2 + a2 * b1 + a3 * b0; - s4 = c4 + a0 * b4 + a1 * b3 + a2 * b2 + a3 * b1 + a4 * b0; - s5 = c5 + a0 * b5 + a1 * b4 + a2 * b3 + a3 * b2 + a4 * b1 + a5 * b0; - s6 = c6 + a0 * b6 + a1 * b5 + a2 * b4 + a3 * b3 + a4 * b2 + a5 * b1 + a6 * b0; - s7 = c7 + a0 * b7 + a1 * b6 + a2 * b5 + a3 * b4 + a4 * b3 + a5 * b2 + - a6 * b1 + a7 * b0; - s8 = c8 + a0 * b8 + a1 * b7 + a2 * b6 + a3 * b5 + a4 * b4 + a5 * b3 + - a6 * b2 + a7 * b1 + a8 * b0; - s9 = c9 + a0 * b9 + a1 * b8 + a2 * b7 + a3 * b6 + a4 * b5 + a5 * b4 + - a6 * b3 + a7 * b2 + a8 * b1 + a9 * b0; - s10 = c10 + a0 * b10 + a1 * b9 + a2 * b8 + a3 * b7 + a4 * b6 + a5 * b5 + - a6 * b4 + a7 * b3 + a8 * b2 + a9 * b1 + a10 * b0; - s11 = c11 + a0 * b11 + a1 * b10 + a2 * b9 + a3 * b8 + a4 * b7 + a5 * b6 + - a6 * b5 + a7 * b4 + a8 * b3 + a9 * b2 + a10 * b1 + a11 * b0; - s12 = a1 * b11 + a2 * b10 + a3 * b9 + a4 * b8 + a5 * b7 + a6 * b6 + a7 * b5 + - a8 * b4 + a9 * b3 + a10 * b2 + a11 * b1; - s13 = a2 * b11 + a3 * b10 + a4 * b9 + a5 * b8 + a6 * b7 + a7 * b6 + a8 * b5 + - a9 * b4 + a10 * b3 + a11 * b2; - s14 = a3 * b11 + a4 * b10 + a5 * b9 + a6 * b8 + a7 * b7 + a8 * b6 + a9 * b5 + - a10 * b4 + a11 * b3; - s15 = a4 * b11 + a5 * b10 + a6 * b9 + a7 * b8 + a8 * b7 + a9 * b6 + a10 * b5 + - a11 * b4; - s16 = a5 * b11 + a6 * b10 + a7 * b9 + a8 * b8 + a9 * b7 + a10 * b6 + a11 * b5; - s17 = a6 * b11 + a7 * b10 + a8 * b9 + a9 * b8 + a10 * b7 + a11 * b6; - s18 = a7 * b11 + a8 * b10 + a9 * b9 + a10 * b8 + a11 * b7; - s19 = a8 * b11 + a9 * b10 + a10 * b9 + a11 * b8; - s20 = a9 * b11 + a10 * b10 + a11 * b9; - s21 = a10 * b11 + a11 * b10; - s22 = a11 * b11; - s23 = 0; - - carry0 = (s0 + (1 << 20)) >> 21; - s1 += carry0; - s0 -= int64_lshift21(carry0); - carry2 = (s2 + (1 << 20)) >> 21; - s3 += carry2; - s2 -= int64_lshift21(carry2); - carry4 = (s4 + (1 << 20)) >> 21; - s5 += carry4; - s4 -= int64_lshift21(carry4); - carry6 = (s6 + (1 << 20)) >> 21; - s7 += carry6; - s6 -= int64_lshift21(carry6); - carry8 = (s8 + (1 << 20)) >> 21; - s9 += carry8; - s8 -= int64_lshift21(carry8); - carry10 = (s10 + (1 << 20)) >> 21; - s11 += carry10; - s10 -= int64_lshift21(carry10); - carry12 = (s12 + (1 << 20)) >> 21; - s13 += carry12; - s12 -= int64_lshift21(carry12); - carry14 = (s14 + (1 << 20)) >> 21; - s15 += carry14; - s14 -= int64_lshift21(carry14); - carry16 = (s16 + (1 << 20)) >> 21; - s17 += carry16; - s16 -= int64_lshift21(carry16); - carry18 = (s18 + (1 << 20)) >> 21; - s19 += carry18; - s18 -= int64_lshift21(carry18); - carry20 = (s20 + (1 << 20)) >> 21; - s21 += carry20; - s20 -= int64_lshift21(carry20); - carry22 = (s22 + (1 << 20)) >> 21; - s23 += carry22; - s22 -= int64_lshift21(carry22); - - carry1 = (s1 + (1 << 20)) >> 21; - s2 += carry1; - s1 -= int64_lshift21(carry1); - carry3 = (s3 + (1 << 20)) >> 21; - s4 += carry3; - s3 -= int64_lshift21(carry3); - carry5 = (s5 + (1 << 20)) >> 21; - s6 += carry5; - s5 -= int64_lshift21(carry5); - carry7 = (s7 + (1 << 20)) >> 21; - s8 += carry7; - s7 -= int64_lshift21(carry7); - carry9 = (s9 + (1 << 20)) >> 21; - s10 += carry9; - s9 -= int64_lshift21(carry9); - carry11 = (s11 + (1 << 20)) >> 21; - s12 += carry11; - s11 -= int64_lshift21(carry11); - carry13 = (s13 + (1 << 20)) >> 21; - s14 += carry13; - s13 -= int64_lshift21(carry13); - carry15 = (s15 + (1 << 20)) >> 21; - s16 += carry15; - s15 -= int64_lshift21(carry15); - carry17 = (s17 + (1 << 20)) >> 21; - s18 += carry17; - s17 -= int64_lshift21(carry17); - carry19 = (s19 + (1 << 20)) >> 21; - s20 += carry19; - s19 -= int64_lshift21(carry19); - carry21 = (s21 + (1 << 20)) >> 21; - s22 += carry21; - s21 -= int64_lshift21(carry21); - - s11 += s23 * 666643; - s12 += s23 * 470296; - s13 += s23 * 654183; - s14 -= s23 * 997805; - s15 += s23 * 136657; - s16 -= s23 * 683901; - s23 = 0; - - s10 += s22 * 666643; - s11 += s22 * 470296; - s12 += s22 * 654183; - s13 -= s22 * 997805; - s14 += s22 * 136657; - s15 -= s22 * 683901; - s22 = 0; - - s9 += s21 * 666643; - s10 += s21 * 470296; - s11 += s21 * 654183; - s12 -= s21 * 997805; - s13 += s21 * 136657; - s14 -= s21 * 683901; - s21 = 0; - - s8 += s20 * 666643; - s9 += s20 * 470296; - s10 += s20 * 654183; - s11 -= s20 * 997805; - s12 += s20 * 136657; - s13 -= s20 * 683901; - s20 = 0; - - s7 += s19 * 666643; - s8 += s19 * 470296; - s9 += s19 * 654183; - s10 -= s19 * 997805; - s11 += s19 * 136657; - s12 -= s19 * 683901; - s19 = 0; - - s6 += s18 * 666643; - s7 += s18 * 470296; - s8 += s18 * 654183; - s9 -= s18 * 997805; - s10 += s18 * 136657; - s11 -= s18 * 683901; - s18 = 0; - - carry6 = (s6 + (1 << 20)) >> 21; - s7 += carry6; - s6 -= int64_lshift21(carry6); - carry8 = (s8 + (1 << 20)) >> 21; - s9 += carry8; - s8 -= int64_lshift21(carry8); - carry10 = (s10 + (1 << 20)) >> 21; - s11 += carry10; - s10 -= int64_lshift21(carry10); - carry12 = (s12 + (1 << 20)) >> 21; - s13 += carry12; - s12 -= int64_lshift21(carry12); - carry14 = (s14 + (1 << 20)) >> 21; - s15 += carry14; - s14 -= int64_lshift21(carry14); - carry16 = (s16 + (1 << 20)) >> 21; - s17 += carry16; - s16 -= int64_lshift21(carry16); - - carry7 = (s7 + (1 << 20)) >> 21; - s8 += carry7; - s7 -= int64_lshift21(carry7); - carry9 = (s9 + (1 << 20)) >> 21; - s10 += carry9; - s9 -= int64_lshift21(carry9); - carry11 = (s11 + (1 << 20)) >> 21; - s12 += carry11; - s11 -= int64_lshift21(carry11); - carry13 = (s13 + (1 << 20)) >> 21; - s14 += carry13; - s13 -= int64_lshift21(carry13); - carry15 = (s15 + (1 << 20)) >> 21; - s16 += carry15; - s15 -= int64_lshift21(carry15); - - s5 += s17 * 666643; - s6 += s17 * 470296; - s7 += s17 * 654183; - s8 -= s17 * 997805; - s9 += s17 * 136657; - s10 -= s17 * 683901; - s17 = 0; - - s4 += s16 * 666643; - s5 += s16 * 470296; - s6 += s16 * 654183; - s7 -= s16 * 997805; - s8 += s16 * 136657; - s9 -= s16 * 683901; - s16 = 0; - - s3 += s15 * 666643; - s4 += s15 * 470296; - s5 += s15 * 654183; - s6 -= s15 * 997805; - s7 += s15 * 136657; - s8 -= s15 * 683901; - s15 = 0; - - s2 += s14 * 666643; - s3 += s14 * 470296; - s4 += s14 * 654183; - s5 -= s14 * 997805; - s6 += s14 * 136657; - s7 -= s14 * 683901; - s14 = 0; - - s1 += s13 * 666643; - s2 += s13 * 470296; - s3 += s13 * 654183; - s4 -= s13 * 997805; - s5 += s13 * 136657; - s6 -= s13 * 683901; - s13 = 0; - - s0 += s12 * 666643; - s1 += s12 * 470296; - s2 += s12 * 654183; - s3 -= s12 * 997805; - s4 += s12 * 136657; - s5 -= s12 * 683901; - s12 = 0; - - carry0 = (s0 + (1 << 20)) >> 21; - s1 += carry0; - s0 -= int64_lshift21(carry0); - carry2 = (s2 + (1 << 20)) >> 21; - s3 += carry2; - s2 -= int64_lshift21(carry2); - carry4 = (s4 + (1 << 20)) >> 21; - s5 += carry4; - s4 -= int64_lshift21(carry4); - carry6 = (s6 + (1 << 20)) >> 21; - s7 += carry6; - s6 -= int64_lshift21(carry6); - carry8 = (s8 + (1 << 20)) >> 21; - s9 += carry8; - s8 -= int64_lshift21(carry8); - carry10 = (s10 + (1 << 20)) >> 21; - s11 += carry10; - s10 -= int64_lshift21(carry10); - - carry1 = (s1 + (1 << 20)) >> 21; - s2 += carry1; - s1 -= int64_lshift21(carry1); - carry3 = (s3 + (1 << 20)) >> 21; - s4 += carry3; - s3 -= int64_lshift21(carry3); - carry5 = (s5 + (1 << 20)) >> 21; - s6 += carry5; - s5 -= int64_lshift21(carry5); - carry7 = (s7 + (1 << 20)) >> 21; - s8 += carry7; - s7 -= int64_lshift21(carry7); - carry9 = (s9 + (1 << 20)) >> 21; - s10 += carry9; - s9 -= int64_lshift21(carry9); - carry11 = (s11 + (1 << 20)) >> 21; - s12 += carry11; - s11 -= int64_lshift21(carry11); - - s0 += s12 * 666643; - s1 += s12 * 470296; - s2 += s12 * 654183; - s3 -= s12 * 997805; - s4 += s12 * 136657; - s5 -= s12 * 683901; - s12 = 0; - - carry0 = s0 >> 21; - s1 += carry0; - s0 -= int64_lshift21(carry0); - carry1 = s1 >> 21; - s2 += carry1; - s1 -= int64_lshift21(carry1); - carry2 = s2 >> 21; - s3 += carry2; - s2 -= int64_lshift21(carry2); - carry3 = s3 >> 21; - s4 += carry3; - s3 -= int64_lshift21(carry3); - carry4 = s4 >> 21; - s5 += carry4; - s4 -= int64_lshift21(carry4); - carry5 = s5 >> 21; - s6 += carry5; - s5 -= int64_lshift21(carry5); - carry6 = s6 >> 21; - s7 += carry6; - s6 -= int64_lshift21(carry6); - carry7 = s7 >> 21; - s8 += carry7; - s7 -= int64_lshift21(carry7); - carry8 = s8 >> 21; - s9 += carry8; - s8 -= int64_lshift21(carry8); - carry9 = s9 >> 21; - s10 += carry9; - s9 -= int64_lshift21(carry9); - carry10 = s10 >> 21; - s11 += carry10; - s10 -= int64_lshift21(carry10); - carry11 = s11 >> 21; - s12 += carry11; - s11 -= int64_lshift21(carry11); - - s0 += s12 * 666643; - s1 += s12 * 470296; - s2 += s12 * 654183; - s3 -= s12 * 997805; - s4 += s12 * 136657; - s5 -= s12 * 683901; - s12 = 0; - - carry0 = s0 >> 21; - s1 += carry0; - s0 -= int64_lshift21(carry0); - carry1 = s1 >> 21; - s2 += carry1; - s1 -= int64_lshift21(carry1); - carry2 = s2 >> 21; - s3 += carry2; - s2 -= int64_lshift21(carry2); - carry3 = s3 >> 21; - s4 += carry3; - s3 -= int64_lshift21(carry3); - carry4 = s4 >> 21; - s5 += carry4; - s4 -= int64_lshift21(carry4); - carry5 = s5 >> 21; - s6 += carry5; - s5 -= int64_lshift21(carry5); - carry6 = s6 >> 21; - s7 += carry6; - s6 -= int64_lshift21(carry6); - carry7 = s7 >> 21; - s8 += carry7; - s7 -= int64_lshift21(carry7); - carry8 = s8 >> 21; - s9 += carry8; - s8 -= int64_lshift21(carry8); - carry9 = s9 >> 21; - s10 += carry9; - s9 -= int64_lshift21(carry9); - carry10 = s10 >> 21; - s11 += carry10; - s10 -= int64_lshift21(carry10); - - s[0] = s0 >> 0; - s[1] = s0 >> 8; - s[2] = (s0 >> 16) | (s1 << 5); - s[3] = s1 >> 3; - s[4] = s1 >> 11; - s[5] = (s1 >> 19) | (s2 << 2); - s[6] = s2 >> 6; - s[7] = (s2 >> 14) | (s3 << 7); - s[8] = s3 >> 1; - s[9] = s3 >> 9; - s[10] = (s3 >> 17) | (s4 << 4); - s[11] = s4 >> 4; - s[12] = s4 >> 12; - s[13] = (s4 >> 20) | (s5 << 1); - s[14] = s5 >> 7; - s[15] = (s5 >> 15) | (s6 << 6); - s[16] = s6 >> 2; - s[17] = s6 >> 10; - s[18] = (s6 >> 18) | (s7 << 3); - s[19] = s7 >> 5; - s[20] = s7 >> 13; - s[21] = s8 >> 0; - s[22] = s8 >> 8; - s[23] = (s8 >> 16) | (s9 << 5); - s[24] = s9 >> 3; - s[25] = s9 >> 11; - s[26] = (s9 >> 19) | (s10 << 2); - s[27] = s10 >> 6; - s[28] = (s10 >> 14) | (s11 << 7); - s[29] = s11 >> 1; - s[30] = s11 >> 9; - s[31] = s11 >> 17; -} - - -void GFp_x25519_scalar_mult_generic_masked(uint8_t out[32], - const uint8_t scalar_masked[32], - const uint8_t point[32]) { - fe x1, x2, z2, x3, z3, tmp0, tmp1; - fe_loose x2l, z2l, x3l, tmp0l, tmp1l; - - uint8_t e[32]; - GFp_memcpy(e, scalar_masked, 32); - // The following implementation was transcribed to Coq and proven to - // correspond to unary scalar multiplication in affine coordinates given that - // x1 != 0 is the x coordinate of some point on the curve. It was also checked - // in Coq that doing a ladderstep with x1 = x3 = 0 gives z2' = z3' = 0, and z2 - // = z3 = 0 gives z2' = z3' = 0. The statement was quantified over the - // underlying field, so it applies to Curve25519 itself and the quadratic - // twist of Curve25519. It was not proven in Coq that prime-field arithmetic - // correctly simulates extension-field arithmetic on prime-field values. - // The decoding of the byte array representation of e was not considered. - // Specification of Montgomery curves in affine coordinates: - // - // Proof that these form a group that is isomorphic to a Weierstrass curve: - // - // Coq transcription and correctness proof of the loop (where scalarbits=255): - // - // - // preconditions: 0 <= e < 2^255 (not necessarily e < order), fe_invert(0) = 0 - fe_frombytes(&x1, point); - fe_1(&x2); - fe_0(&z2); - fe_copy(&x3, &x1); - fe_1(&z3); - - unsigned swap = 0; - int pos; - for (pos = 254; pos >= 0; --pos) { - // loop invariant as of right before the test, for the case where x1 != 0: - // pos >= -1; if z2 = 0 then x2 is nonzero; if z3 = 0 then x3 is nonzero - // let r := e >> (pos+1) in the following equalities of projective points: - // to_xz (r*P) === if swap then (x3, z3) else (x2, z2) - // to_xz ((r+1)*P) === if swap then (x2, z2) else (x3, z3) - // x1 is the nonzero x coordinate of the nonzero point (r*P-(r+1)*P) - unsigned b = 1 & (e[pos / 8] >> (pos & 7)); - swap ^= b; - fe_cswap(&x2, &x3, swap); - fe_cswap(&z2, &z3, swap); - swap = b; - // Coq transcription of ladderstep formula (called from transcribed loop): - // - // - // x1 != 0 - // x1 = 0 - fe_sub(&tmp0l, &x3, &z3); - fe_sub(&tmp1l, &x2, &z2); - fe_add(&x2l, &x2, &z2); - fe_add(&z2l, &x3, &z3); - fe_mul_tll(&z3, &tmp0l, &x2l); - fe_mul_tll(&z2, &z2l, &tmp1l); - fe_sq_tl(&tmp0, &tmp1l); - fe_sq_tl(&tmp1, &x2l); - fe_add(&x3l, &z3, &z2); - fe_sub(&z2l, &z3, &z2); - fe_mul_ttt(&x2, &tmp1, &tmp0); - fe_sub(&tmp1l, &tmp1, &tmp0); - fe_sq_tl(&z2, &z2l); - fe_mul121666(&z3, &tmp1l); - fe_sq_tl(&x3, &x3l); - fe_add(&tmp0l, &tmp0, &z3); - fe_mul_ttt(&z3, &x1, &z2); - fe_mul_tll(&z2, &tmp1l, &tmp0l); - } - // here pos=-1, so r=e, so to_xz (e*P) === if swap then (x3, z3) else (x2, z2) - fe_cswap(&x2, &x3, swap); - fe_cswap(&z2, &z3, swap); - - fe_invert(&z2, &z2); - fe_mul_ttt(&x2, &x2, &z2); - fe_tobytes(out, &x2); -} - -void GFp_x25519_public_from_private_generic_masked(uint8_t out_public_value[32], - const uint8_t private_key_masked[32]) { - uint8_t e[32]; - GFp_memcpy(e, private_key_masked, 32); - - ge_p3 A; - GFp_x25519_ge_scalarmult_base(&A, e); - - // We only need the u-coordinate of the curve25519 point. The map is - // u=(y+1)/(1-y). Since y=Y/Z, this gives u=(Z+Y)/(Z-Y). - fe_loose zplusy, zminusy; - fe zminusy_inv; - fe_add(&zplusy, &A.Z, &A.Y); - fe_sub(&zminusy, &A.Z, &A.Y); - fe_loose_invert(&zminusy_inv, &zminusy); - fe_mul_tlt(&zminusy_inv, &zplusy, &zminusy_inv); - fe_tobytes(out_public_value, &zminusy_inv); -} - -void GFp_x25519_fe_invert(fe *out, const fe *z) { - fe_invert(out, z); -} - -uint8_t GFp_x25519_fe_isnegative(const fe *f) { - return (uint8_t)fe_isnegative(f); -} - -void GFp_x25519_fe_mul_ttt(fe *h, const fe *f, const fe *g) { - fe_mul_ttt(h, f, g); -} - -void GFp_x25519_fe_neg(fe *f) { - fe_loose t; - fe_neg(&t, f); - fe_carry(f, &t); -} - -void GFp_x25519_fe_tobytes(uint8_t s[32], const fe *h) { - fe_tobytes(s, h); -} - -void GFp_x25519_ge_double_scalarmult_vartime(ge_p2 *r, const uint8_t *a, - const ge_p3 *A, const uint8_t *b) { - ge_double_scalarmult_vartime(r, a, A, b); -} - -void GFp_x25519_sc_mask(uint8_t a[32]) { - a[0] &= 248; - a[31] &= 127; - a[31] |= 64; -} - -void GFp_x25519_sc_muladd(uint8_t *s, const uint8_t *a, const uint8_t *b, - const uint8_t *c) { - sc_muladd(s, a, b, c); -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/crypto/curve25519/curve25519_tables.h temporalio-1.3.0/vendor/ring-0.16.20/crypto/curve25519/curve25519_tables.h --- temporalio-1.3.0/vendor/ring-0.16.20/crypto/curve25519/curve25519_tables.h 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/crypto/curve25519/curve25519_tables.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,7872 +0,0 @@ -/* Copyright (c) 2020, Google Inc. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY - * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION - * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ - -// This file is generated from -// ./make_curve25519_tables.py > curve25519_tables.h - - -static const fe d = {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 929955233495203, 466365720129213, 1662059464998953, 2033849074728123, - 1442794654840575 -#else - 56195235, 13857412, 51736253, 6949390, 114729, 24766616, 60832955, 30306712, - 48412415, 21499315 -#endif -}}; - -static const fe sqrtm1 = {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1718705420411056, 234908883556509, 2233514472574048, 2117202627021982, - 765476049583133 -#else - 34513072, 25610706, 9377949, 3500415, 12389472, 33281959, 41962654, - 31548777, 326685, 11406482 -#endif -}}; - -static const fe d2 = {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1859910466990425, 932731440258426, 1072319116312658, 1815898335770999, - 633789495995903 -#else - 45281625, 27714825, 36363642, 13898781, 229458, 15978800, 54557047, - 27058993, 29715967, 9444199 -#endif -}}; - -#if defined(OPENSSL_SMALL) - -// This block of code replaces the standard base-point table with a much smaller -// one. The standard table is 30,720 bytes while this one is just 960. -// -// This table contains 15 pairs of group elements, (x, y), where each field -// element is serialised with |fe_tobytes|. If |i| is the index of the group -// element then consider i+1 as a four-bit number: (iâ‚€, iâ‚, iâ‚‚, i₃) (where iâ‚€ -// is the most significant bit). The value of the group element is then: -// (i₀×2^192 + iâ‚×2^128 + i₂×2^64 + i₃)G, where G is the generator. -static const uint8_t k25519SmallPrecomp[15 * 2 * 32] = { - 0x1a, 0xd5, 0x25, 0x8f, 0x60, 0x2d, 0x56, 0xc9, 0xb2, 0xa7, 0x25, 0x95, - 0x60, 0xc7, 0x2c, 0x69, 0x5c, 0xdc, 0xd6, 0xfd, 0x31, 0xe2, 0xa4, 0xc0, - 0xfe, 0x53, 0x6e, 0xcd, 0xd3, 0x36, 0x69, 0x21, 0x58, 0x66, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x66, 0x02, 0xa2, 0xed, 0xf4, 0x8f, 0x6b, 0x0b, 0x3e, - 0xeb, 0x35, 0x1a, 0xd5, 0x7e, 0xdb, 0x78, 0x00, 0x96, 0x8a, 0xa0, 0xb4, - 0xcf, 0x60, 0x4b, 0xd4, 0xd5, 0xf9, 0x2d, 0xbf, 0x88, 0xbd, 0x22, 0x62, - 0x13, 0x53, 0xe4, 0x82, 0x57, 0xfa, 0x1e, 0x8f, 0x06, 0x2b, 0x90, 0xba, - 0x08, 0xb6, 0x10, 0x54, 0x4f, 0x7c, 0x1b, 0x26, 0xed, 0xda, 0x6b, 0xdd, - 0x25, 0xd0, 0x4e, 0xea, 0x42, 0xbb, 0x25, 0x03, 0xa2, 0xfb, 0xcc, 0x61, - 0x67, 0x06, 0x70, 0x1a, 0xc4, 0x78, 0x3a, 0xff, 0x32, 0x62, 0xdd, 0x2c, - 0xab, 0x50, 0x19, 0x3b, 0xf2, 0x9b, 0x7d, 0xb8, 0xfd, 0x4f, 0x29, 0x9c, - 0xa7, 0x91, 0xba, 0x0e, 0x46, 0x5e, 0x51, 0xfe, 0x1d, 0xbf, 0xe5, 0xe5, - 0x9b, 0x95, 0x0d, 0x67, 0xf8, 0xd1, 0xb5, 0x5a, 0xa1, 0x93, 0x2c, 0xc3, - 0xde, 0x0e, 0x97, 0x85, 0x2d, 0x7f, 0xea, 0xab, 0x3e, 0x47, 0x30, 0x18, - 0x24, 0xe8, 0xb7, 0x60, 0xae, 0x47, 0x80, 0xfc, 0xe5, 0x23, 0xe7, 0xc2, - 0xc9, 0x85, 0xe6, 0x98, 0xa0, 0x29, 0x4e, 0xe1, 0x84, 0x39, 0x2d, 0x95, - 0x2c, 0xf3, 0x45, 0x3c, 0xff, 0xaf, 0x27, 0x4c, 0x6b, 0xa6, 0xf5, 0x4b, - 0x11, 0xbd, 0xba, 0x5b, 0x9e, 0xc4, 0xa4, 0x51, 0x1e, 0xbe, 0xd0, 0x90, - 0x3a, 0x9c, 0xc2, 0x26, 0xb6, 0x1e, 0xf1, 0x95, 0x7d, 0xc8, 0x6d, 0x52, - 0xe6, 0x99, 0x2c, 0x5f, 0x9a, 0x96, 0x0c, 0x68, 0x29, 0xfd, 0xe2, 0xfb, - 0xe6, 0xbc, 0xec, 0x31, 0x08, 0xec, 0xe6, 0xb0, 0x53, 0x60, 0xc3, 0x8c, - 0xbe, 0xc1, 0xb3, 0x8a, 0x8f, 0xe4, 0x88, 0x2b, 0x55, 0xe5, 0x64, 0x6e, - 0x9b, 0xd0, 0xaf, 0x7b, 0x64, 0x2a, 0x35, 0x25, 0x10, 0x52, 0xc5, 0x9e, - 0x58, 0x11, 0x39, 0x36, 0x45, 0x51, 0xb8, 0x39, 0x93, 0xfc, 0x9d, 0x6a, - 0xbe, 0x58, 0xcb, 0xa4, 0x0f, 0x51, 0x3c, 0x38, 0x05, 0xca, 0xab, 0x43, - 0x63, 0x0e, 0xf3, 0x8b, 0x41, 0xa6, 0xf8, 0x9b, 0x53, 0x70, 0x80, 0x53, - 0x86, 0x5e, 0x8f, 0xe3, 0xc3, 0x0d, 0x18, 0xc8, 0x4b, 0x34, 0x1f, 0xd8, - 0x1d, 0xbc, 0xf2, 0x6d, 0x34, 0x3a, 0xbe, 0xdf, 0xd9, 0xf6, 0xf3, 0x89, - 0xa1, 0xe1, 0x94, 0x9f, 0x5d, 0x4c, 0x5d, 0xe9, 0xa1, 0x49, 0x92, 0xef, - 0x0e, 0x53, 0x81, 0x89, 0x58, 0x87, 0xa6, 0x37, 0xf1, 0xdd, 0x62, 0x60, - 0x63, 0x5a, 0x9d, 0x1b, 0x8c, 0xc6, 0x7d, 0x52, 0xea, 0x70, 0x09, 0x6a, - 0xe1, 0x32, 0xf3, 0x73, 0x21, 0x1f, 0x07, 0x7b, 0x7c, 0x9b, 0x49, 0xd8, - 0xc0, 0xf3, 0x25, 0x72, 0x6f, 0x9d, 0xed, 0x31, 0x67, 0x36, 0x36, 0x54, - 0x40, 0x92, 0x71, 0xe6, 0x11, 0x28, 0x11, 0xad, 0x93, 0x32, 0x85, 0x7b, - 0x3e, 0xb7, 0x3b, 0x49, 0x13, 0x1c, 0x07, 0xb0, 0x2e, 0x93, 0xaa, 0xfd, - 0xfd, 0x28, 0x47, 0x3d, 0x8d, 0xd2, 0xda, 0xc7, 0x44, 0xd6, 0x7a, 0xdb, - 0x26, 0x7d, 0x1d, 0xb8, 0xe1, 0xde, 0x9d, 0x7a, 0x7d, 0x17, 0x7e, 0x1c, - 0x37, 0x04, 0x8d, 0x2d, 0x7c, 0x5e, 0x18, 0x38, 0x1e, 0xaf, 0xc7, 0x1b, - 0x33, 0x48, 0x31, 0x00, 0x59, 0xf6, 0xf2, 0xca, 0x0f, 0x27, 0x1b, 0x63, - 0x12, 0x7e, 0x02, 0x1d, 0x49, 0xc0, 0x5d, 0x79, 0x87, 0xef, 0x5e, 0x7a, - 0x2f, 0x1f, 0x66, 0x55, 0xd8, 0x09, 0xd9, 0x61, 0x38, 0x68, 0xb0, 0x07, - 0xa3, 0xfc, 0xcc, 0x85, 0x10, 0x7f, 0x4c, 0x65, 0x65, 0xb3, 0xfa, 0xfa, - 0xa5, 0x53, 0x6f, 0xdb, 0x74, 0x4c, 0x56, 0x46, 0x03, 0xe2, 0xd5, 0x7a, - 0x29, 0x1c, 0xc6, 0x02, 0xbc, 0x59, 0xf2, 0x04, 0x75, 0x63, 0xc0, 0x84, - 0x2f, 0x60, 0x1c, 0x67, 0x76, 0xfd, 0x63, 0x86, 0xf3, 0xfa, 0xbf, 0xdc, - 0xd2, 0x2d, 0x90, 0x91, 0xbd, 0x33, 0xa9, 0xe5, 0x66, 0x0c, 0xda, 0x42, - 0x27, 0xca, 0xf4, 0x66, 0xc2, 0xec, 0x92, 0x14, 0x57, 0x06, 0x63, 0xd0, - 0x4d, 0x15, 0x06, 0xeb, 0x69, 0x58, 0x4f, 0x77, 0xc5, 0x8b, 0xc7, 0xf0, - 0x8e, 0xed, 0x64, 0xa0, 0xb3, 0x3c, 0x66, 0x71, 0xc6, 0x2d, 0xda, 0x0a, - 0x0d, 0xfe, 0x70, 0x27, 0x64, 0xf8, 0x27, 0xfa, 0xf6, 0x5f, 0x30, 0xa5, - 0x0d, 0x6c, 0xda, 0xf2, 0x62, 0x5e, 0x78, 0x47, 0xd3, 0x66, 0x00, 0x1c, - 0xfd, 0x56, 0x1f, 0x5d, 0x3f, 0x6f, 0xf4, 0x4c, 0xd8, 0xfd, 0x0e, 0x27, - 0xc9, 0x5c, 0x2b, 0xbc, 0xc0, 0xa4, 0xe7, 0x23, 0x29, 0x02, 0x9f, 0x31, - 0xd6, 0xe9, 0xd7, 0x96, 0xf4, 0xe0, 0x5e, 0x0b, 0x0e, 0x13, 0xee, 0x3c, - 0x09, 0xed, 0xf2, 0x3d, 0x76, 0x91, 0xc3, 0xa4, 0x97, 0xae, 0xd4, 0x87, - 0xd0, 0x5d, 0xf6, 0x18, 0x47, 0x1f, 0x1d, 0x67, 0xf2, 0xcf, 0x63, 0xa0, - 0x91, 0x27, 0xf8, 0x93, 0x45, 0x75, 0x23, 0x3f, 0xd1, 0xf1, 0xad, 0x23, - 0xdd, 0x64, 0x93, 0x96, 0x41, 0x70, 0x7f, 0xf7, 0xf5, 0xa9, 0x89, 0xa2, - 0x34, 0xb0, 0x8d, 0x1b, 0xae, 0x19, 0x15, 0x49, 0x58, 0x23, 0x6d, 0x87, - 0x15, 0x4f, 0x81, 0x76, 0xfb, 0x23, 0xb5, 0xea, 0xcf, 0xac, 0x54, 0x8d, - 0x4e, 0x42, 0x2f, 0xeb, 0x0f, 0x63, 0xdb, 0x68, 0x37, 0xa8, 0xcf, 0x8b, - 0xab, 0xf5, 0xa4, 0x6e, 0x96, 0x2a, 0xb2, 0xd6, 0xbe, 0x9e, 0xbd, 0x0d, - 0xb4, 0x42, 0xa9, 0xcf, 0x01, 0x83, 0x8a, 0x17, 0x47, 0x76, 0xc4, 0xc6, - 0x83, 0x04, 0x95, 0x0b, 0xfc, 0x11, 0xc9, 0x62, 0xb8, 0x0c, 0x76, 0x84, - 0xd9, 0xb9, 0x37, 0xfa, 0xfc, 0x7c, 0xc2, 0x6d, 0x58, 0x3e, 0xb3, 0x04, - 0xbb, 0x8c, 0x8f, 0x48, 0xbc, 0x91, 0x27, 0xcc, 0xf9, 0xb7, 0x22, 0x19, - 0x83, 0x2e, 0x09, 0xb5, 0x72, 0xd9, 0x54, 0x1c, 0x4d, 0xa1, 0xea, 0x0b, - 0xf1, 0xc6, 0x08, 0x72, 0x46, 0x87, 0x7a, 0x6e, 0x80, 0x56, 0x0a, 0x8a, - 0xc0, 0xdd, 0x11, 0x6b, 0xd6, 0xdd, 0x47, 0xdf, 0x10, 0xd9, 0xd8, 0xea, - 0x7c, 0xb0, 0x8f, 0x03, 0x00, 0x2e, 0xc1, 0x8f, 0x44, 0xa8, 0xd3, 0x30, - 0x06, 0x89, 0xa2, 0xf9, 0x34, 0xad, 0xdc, 0x03, 0x85, 0xed, 0x51, 0xa7, - 0x82, 0x9c, 0xe7, 0x5d, 0x52, 0x93, 0x0c, 0x32, 0x9a, 0x5b, 0xe1, 0xaa, - 0xca, 0xb8, 0x02, 0x6d, 0x3a, 0xd4, 0xb1, 0x3a, 0xf0, 0x5f, 0xbe, 0xb5, - 0x0d, 0x10, 0x6b, 0x38, 0x32, 0xac, 0x76, 0x80, 0xbd, 0xca, 0x94, 0x71, - 0x7a, 0xf2, 0xc9, 0x35, 0x2a, 0xde, 0x9f, 0x42, 0x49, 0x18, 0x01, 0xab, - 0xbc, 0xef, 0x7c, 0x64, 0x3f, 0x58, 0x3d, 0x92, 0x59, 0xdb, 0x13, 0xdb, - 0x58, 0x6e, 0x0a, 0xe0, 0xb7, 0x91, 0x4a, 0x08, 0x20, 0xd6, 0x2e, 0x3c, - 0x45, 0xc9, 0x8b, 0x17, 0x79, 0xe7, 0xc7, 0x90, 0x99, 0x3a, 0x18, 0x25, -}; - -#else - -// k25519Precomp[i][j] = (j+1)*256^i*B -static const ge_precomp k25519Precomp[32][8] = { - { - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1288382639258501, 245678601348599, 269427782077623, - 1462984067271730, 137412439391563 -#else - 25967493, 19198397, 29566455, 3660896, 54414519, 4014786, - 27544626, 21800161, 61029707, 2047604 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 62697248952638, 204681361388450, 631292143396476, - 338455783676468, 1213667448819585 -#else - 54563134, 934261, 64385954, 3049989, 66381436, 9406985, - 12720692, 5043384, 19500929, 18085054 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 301289933810280, 1259582250014073, 1422107436869536, - 796239922652654, 1953934009299142 -#else - 58370664, 4489569, 9688441, 18769238, 10184608, 21191052, - 29287918, 11864899, 42594502, 29115885 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1380971894829527, 790832306631236, 2067202295274102, - 1995808275510000, 1566530869037010 -#else - 54292951, 20578084, 45527620, 11784319, 41753206, 30803714, - 55390960, 29739860, 66750418, 23343128 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 463307831301544, 432984605774163, 1610641361907204, - 750899048855000, 1894842303421586 -#else - 45405608, 6903824, 27185491, 6451973, 37531140, 24000426, - 51492312, 11189267, 40279186, 28235350 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 748439484463711, 1033211726465151, 1396005112841647, - 1611506220286469, 1972177495910992 -#else - 26966623, 11152617, 32442495, 15396054, 14353839, 20802097, - 63980037, 24013313, 51636816, 29387734 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1601611775252272, 1720807796594148, 1132070835939856, - 1260455018889551, 2147779492816911 -#else - 15636272, 23865875, 24204772, 25642034, 616976, 16869170, - 27787599, 18782243, 28944399, 32004408 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 316559037616741, 2177824224946892, 1459442586438991, - 1461528397712656, 751590696113597 -#else - 16568933, 4717097, 55552716, 32452109, 15682895, 21747389, - 16354576, 21778470, 7689661, 11199574 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1850748884277385, 1200145853858453, 1068094770532492, - 672251375690438, 1586055907191707 -#else - 30464137, 27578307, 55329429, 17883566, 23220364, 15915852, - 7512774, 10017326, 49359771, 23634074 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 934282339813791, 1846903124198670, 1172395437954843, - 1007037127761661, 1830588347719256 -#else - 50071967, 13921891, 10945806, 27521001, 27105051, 17470053, - 38182653, 15006022, 3284568, 27277892 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1694390458783935, 1735906047636159, 705069562067493, - 648033061693059, 696214010414170 -#else - 23599295, 25248385, 55915199, 25867015, 13236773, 10506355, - 7464579, 9656445, 13059162, 10374397 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1121406372216585, 192876649532226, 190294192191717, - 1994165897297032, 2245000007398739 -#else - 7798537, 16710257, 3033922, 2874086, 28997861, 2835604, - 32406664, 29715387, 66467155, 33453106 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 769950342298419, 132954430919746, 844085933195555, - 974092374476333, 726076285546016 -#else - 10861363, 11473154, 27284546, 1981175, 37044515, 12577860, - 32867885, 14515107, 51670560, 10819379 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 425251763115706, 608463272472562, 442562545713235, - 837766094556764, 374555092627893 -#else - 4708026, 6336745, 20377586, 9066809, 55836755, 6594695, - 41455196, 12483687, 54440373, 5581305 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1086255230780037, 274979815921559, 1960002765731872, - 929474102396301, 1190409889297339 -#else - 19563141, 16186464, 37722007, 4097518, 10237984, 29206317, - 28542349, 13850243, 43430843, 17738489 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1388594989461809, 316767091099457, 394298842192982, - 1230079486801005, 1440737038838979 -#else - 51736881, 20691677, 32573249, 4720197, 40672342, 5875510, - 47920237, 18329612, 57289923, 21468654 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 7380825640100, 146210432690483, 304903576448906, - 1198869323871120, 997689833219095 -#else - 58559652, 109982, 15149363, 2178705, 22900618, 4543417, 3044240, - 17864545, 1762327, 14866737 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1181317918772081, 114573476638901, 262805072233344, - 265712217171332, 294181933805782 -#else - 48909169, 17603008, 56635573, 1707277, 49922944, 3916100, - 38872452, 3959420, 27914454, 4383652 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 665000864555967, 2065379846933859, 370231110385876, - 350988370788628, 1233371373142985 -#else - 5153727, 9909285, 1723747, 30776558, 30523604, 5516873, - 19480852, 5230134, 43156425, 18378665 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2019367628972465, 676711900706637, 110710997811333, - 1108646842542025, 517791959672113 -#else - 36839857, 30090922, 7665485, 10083793, 28475525, 1649722, - 20654025, 16520125, 30598449, 7715701 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 965130719900578, 247011430587952, 526356006571389, - 91986625355052, 2157223321444601 -#else - 28881826, 14381568, 9657904, 3680757, 46927229, 7843315, - 35708204, 1370707, 29794553, 32145132 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2068619540119183, 1966274918058806, 957728544705549, - 729906502578991, 159834893065166 -#else - 14499471, 30824833, 33917750, 29299779, 28494861, 14271267, - 30290735, 10876454, 33954766, 2381725 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2073601412052185, 31021124762708, 264500969797082, - 248034690651703, 1030252227928288 -#else - 59913433, 30899068, 52378708, 462250, 39384538, 3941371, - 60872247, 3696004, 34808032, 15351954 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 551790716293402, 1989538725166328, 801169423371717, - 2052451893578887, 678432056995012 -#else - 27431194, 8222322, 16448760, 29646437, 48401861, 11938354, - 34147463, 30583916, 29551812, 10109425 -#endif - }}, - }, - }, - { - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1368953770187805, 790347636712921, 437508475667162, - 2142576377050580, 1932081720066286 -#else - 53451805, 20399000, 35825113, 11777097, 21447386, 6519384, - 64730580, 31926875, 10092782, 28790261 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 953638594433374, 1092333936795051, 1419774766716690, - 805677984380077, 859228993502513 -#else - 27939166, 14210322, 4677035, 16277044, 44144402, 21156292, - 34600109, 12005537, 49298737, 12803509 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1200766035879111, 20142053207432, 1465634435977050, - 1645256912097844, 295121984874596 -#else - 17228999, 17892808, 65875336, 300139, 65883994, 21839654, - 30364212, 24516238, 18016356, 4397660 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1735718747031557, 1248237894295956, 1204753118328107, - 976066523550493, 65943769534592 -#else - 56150021, 25864224, 4776340, 18600194, 27850027, 17952220, - 40489757, 14544524, 49631360, 982638 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1060098822528990, 1586825862073490, 212301317240126, - 1975302711403555, 666724059764335 -#else - 29253598, 15796703, 64244882, 23645547, 10057022, 3163536, - 7332899, 29434304, 46061167, 9934962 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1091990273418756, 1572899409348578, 80968014455247, - 306009358661350, 1520450739132526 -#else - 5793284, 16271923, 42977250, 23438027, 29188559, 1206517, - 52360934, 4559894, 36984942, 22656481 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1480517209436112, 1511153322193952, 1244343858991172, - 304788150493241, 369136856496443 -#else - 39464912, 22061425, 16282656, 22517939, 28414020, 18542168, - 24191033, 4541697, 53770555, 5500567 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2151330273626164, 762045184746182, 1688074332551515, - 823046109005759, 907602769079491 -#else - 12650548, 32057319, 9052870, 11355358, 49428827, 25154267, - 49678271, 12264342, 10874051, 13524335 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2047386910586836, 168470092900250, 1552838872594810, - 340951180073789, 360819374702533 -#else - 25556948, 30508442, 714650, 2510400, 23394682, 23139102, - 33119037, 5080568, 44580805, 5376627 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1982622644432056, 2014393600336956, 128909208804214, - 1617792623929191, 105294281913815 -#else - 41020600, 29543379, 50095164, 30016803, 60382070, 1920896, - 44787559, 24106988, 4535767, 1569007 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 980234343912898, 1712256739246056, 588935272190264, - 204298813091998, 841798321043288 -#else - 64853442, 14606629, 45416424, 25514613, 28430648, 8775819, - 36614302, 3044289, 31848280, 12543772 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 197561292938973, 454817274782871, 1963754960082318, - 2113372252160468, 971377527342673 -#else - 45080285, 2943892, 35251351, 6777305, 13784462, 29262229, - 39731668, 31491700, 7718481, 14474653 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 164699448829328, 3127451757672, 1199504971548753, - 1766155447043652, 1899238924683527 -#else - 2385296, 2454213, 44477544, 46602, 62670929, 17874016, 656964, - 26317767, 24316167, 28300865 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 732262946680281, 1674412764227063, 2182456405662809, - 1350894754474250, 558458873295247 -#else - 13741529, 10911568, 33875447, 24950694, 46931033, 32521134, - 33040650, 20129900, 46379407, 8321685 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2103305098582922, 1960809151316468, 715134605001343, - 1454892949167181, 40827143824949 -#else - 21060490, 31341688, 15712756, 29218333, 1639039, 10656336, - 23845965, 21679594, 57124405, 608371 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1239289043050212, 1744654158124578, 758702410031698, - 1796762995074688, 1603056663766 -#else - 53436132, 18466845, 56219170, 25997372, 61071954, 11305546, - 1123968, 26773855, 27229398, 23887 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2232056027107988, 987343914584615, 2115594492994461, - 1819598072792159, 1119305654014850 -#else - 43864724, 33260226, 55364135, 14712570, 37643165, 31524814, - 12797023, 27114124, 65475458, 16678953 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 320153677847348, 939613871605645, 641883205761567, - 1930009789398224, 329165806634126 -#else - 37608244, 4770661, 51054477, 14001337, 7830047, 9564805, - 65600720, 28759386, 49939598, 4904952 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 980930490474130, 1242488692177893, 1251446316964684, - 1086618677993530, 1961430968465772 -#else - 24059538, 14617003, 19037157, 18514524, 19766092, 18648003, - 5169210, 16191880, 2128236, 29227599 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 276821765317453, 1536835591188030, 1305212741412361, - 61473904210175, 2051377036983058 -#else - 50127693, 4124965, 58568254, 22900634, 30336521, 19449185, - 37302527, 916032, 60226322, 30567899 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 833449923882501, 1750270368490475, 1123347002068295, - 185477424765687, 278090826653186 -#else - 44477957, 12419371, 59974635, 26081060, 50629959, 16739174, - 285431, 2763829, 15736322, 4143876 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 794524995833413, 1849907304548286, 53348672473145, - 1272368559505217, 1147304168324779 -#else - 2379333, 11839345, 62998462, 27565766, 11274297, 794957, 212801, - 18959769, 23527083, 17096164 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1504846112759364, 1203096289004681, 562139421471418, - 274333017451844, 1284344053775441 -#else - 33431108, 22423954, 49269897, 17927531, 8909498, 8376530, - 34483524, 4087880, 51919953, 19138217 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 483048732424432, 2116063063343382, 30120189902313, - 292451576741007, 1156379271702225 -#else - 1767664, 7197987, 53903638, 31531796, 54017513, 448825, 5799055, - 4357868, 62334673, 17231393 -#endif - }}, - }, - }, - { - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 928372153029038, 2147692869914564, 1455665844462196, - 1986737809425946, 185207050258089 -#else - 6721966, 13833823, 43585476, 32003117, 26354292, 21691111, - 23365146, 29604700, 7390889, 2759800 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 137732961814206, 706670923917341, 1387038086865771, - 1965643813686352, 1384777115696347 -#else - 4409022, 2052381, 23373853, 10530217, 7676779, 20668478, - 21302352, 29290375, 1244379, 20634787 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 481144981981577, 2053319313589856, 2065402289827512, - 617954271490316, 1106602634668125 -#else - 62687625, 7169618, 4982368, 30596842, 30256824, 30776892, - 14086412, 9208236, 15886429, 16489664 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 696298019648792, 893299659040895, 1148636718636009, - 26734077349617, 2203955659340681 -#else - 1996056, 10375649, 14346367, 13311202, 60234729, 17116020, - 53415665, 398368, 36502409, 32841498 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 657390353372855, 998499966885562, 991893336905797, - 810470207106761, 343139804608786 -#else - 41801399, 9795879, 64331450, 14878808, 33577029, 14780362, - 13348553, 12076947, 36272402, 5113181 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 791736669492960, 934767652997115, 824656780392914, - 1759463253018643, 361530362383518 -#else - 49338080, 11797795, 31950843, 13929123, 41220562, 12288343, - 36767763, 26218045, 13847710, 5387222 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2022541353055597, 2094700262587466, 1551008075025686, - 242785517418164, 695985404963562 -#else - 48526701, 30138214, 17824842, 31213466, 22744342, 23111821, - 8763060, 3617786, 47508202, 10370990 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1287487199965223, 2215311941380308, 1552928390931986, - 1664859529680196, 1125004975265243 -#else - 20246567, 19185054, 22358228, 33010720, 18507282, 23140436, - 14554436, 24808340, 32232923, 16763880 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 677434665154918, 989582503122485, 1817429540898386, - 1052904935475344, 1143826298169798 -#else - 9648486, 10094563, 26416693, 14745928, 36734546, 27081810, - 11094160, 15689506, 3140038, 17044340 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 367266328308408, 318431188922404, 695629353755355, - 634085657580832, 24581612564426 -#else - 50948792, 5472694, 31895588, 4744994, 8823515, 10365685, - 39884064, 9448612, 38334410, 366294 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 773360688841258, 1815381330538070, 363773437667376, - 539629987070205, 783280434248437 -#else - 19153450, 11523972, 56012374, 27051289, 42461232, 5420646, - 28344573, 8041113, 719605, 11671788 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 180820816194166, 168937968377394, 748416242794470, - 1227281252254508, 1567587861004268 -#else - 8678006, 2694440, 60300850, 2517371, 4964326, 11152271, - 51675948, 18287915, 27000812, 23358879 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 478775558583645, 2062896624554807, 699391259285399, - 358099408427873, 1277310261461761 -#else - 51950941, 7134311, 8639287, 30739555, 59873175, 10421741, - 564065, 5336097, 6750977, 19033406 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1984740906540026, 1079164179400229, 1056021349262661, - 1659958556483663, 1088529069025527 -#else - 11836410, 29574944, 26297893, 16080799, 23455045, 15735944, - 1695823, 24735310, 8169719, 16220347 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 580736401511151, 1842931091388998, 1177201471228238, - 2075460256527244, 1301133425678027 -#else - 48993007, 8653646, 17578566, 27461813, 59083086, 17541668, - 55964556, 30926767, 61118155, 19388398 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1515728832059182, 1575261009617579, 1510246567196186, - 191078022609704, 116661716289141 -#else - 43800366, 22586119, 15213227, 23473218, 36255258, 22504427, - 27884328, 2847284, 2655861, 1738395 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1295295738269652, 1714742313707026, 545583042462581, - 2034411676262552, 1513248090013606 -#else - 39571412, 19301410, 41772562, 25551651, 57738101, 8129820, - 21651608, 30315096, 48021414, 22549153 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 230710545179830, 30821514358353, 760704303452229, - 390668103790604, 573437871383156 -#else - 1533110, 3437855, 23735889, 459276, 29970501, 11335377, - 26030092, 5821408, 10478196, 8544890 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1169380107545646, 263167233745614, 2022901299054448, - 819900753251120, 2023898464874585 -#else - 32173102, 17425121, 24896206, 3921497, 22579056, 30143578, - 19270448, 12217473, 17789017, 30158437 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2102254323485823, 1570832666216754, 34696906544624, - 1993213739807337, 70638552271463 -#else - 36555903, 31326030, 51530034, 23407230, 13243888, 517024, - 15479401, 29701199, 30460519, 1052596 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 894132856735058, 548675863558441, 845349339503395, - 1942269668326667, 1615682209874691 -#else - 55493970, 13323617, 32618793, 8175907, 51878691, 12596686, - 27491595, 28942073, 3179267, 24075541 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1287670217537834, 1222355136884920, 1846481788678694, - 1150426571265110, 1613523400722047 -#else - 31947050, 19187781, 62468280, 18214510, 51982886, 27514722, - 52352086, 17142691, 19072639, 24043372 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 793388516527298, 1315457083650035, 1972286999342417, - 1901825953052455, 338269477222410 -#else - 11685058, 11822410, 3158003, 19601838, 33402193, 29389366, - 5977895, 28339415, 473098, 5040608 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 550201530671806, 778605267108140, 2063911101902983, - 115500557286349, 2041641272971022 -#else - 46817982, 8198641, 39698732, 11602122, 1290375, 30754672, - 28326861, 1721092, 47550222, 30422825 -#endif - }}, - }, - }, - { - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 717255318455100, 519313764361315, 2080406977303708, - 541981206705521, 774328150311600 -#else - 7881532, 10687937, 7578723, 7738378, 48157852, 31000479, - 21820785, 8076149, 39240368, 11538388 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 261715221532238, 1795354330069993, 1496878026850283, - 499739720521052, 389031152673770 -#else - 47173198, 3899860, 18283497, 26752864, 51380203, 22305220, - 8754524, 7446702, 61432810, 5797015 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1997217696294013, 1717306351628065, 1684313917746180, - 1644426076011410, 1857378133465451 -#else - 55813245, 29760862, 51326753, 25589858, 12708868, 25098233, - 2014098, 24503858, 64739691, 27677090 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1475434724792648, 76931896285979, 1116729029771667, - 2002544139318042, 725547833803938 -#else - 44636488, 21985690, 39426843, 1146374, 18956691, 16640559, - 1192730, 29840233, 15123618, 10811505 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2022306639183567, 726296063571875, 315345054448644, - 1058733329149221, 1448201136060677 -#else - 14352079, 30134717, 48166819, 10822654, 32750596, 4699007, - 67038501, 15776355, 38222085, 21579878 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1710065158525665, 1895094923036397, 123988286168546, - 1145519900776355, 1607510767693874 -#else - 38867681, 25481956, 62129901, 28239114, 29416930, 1847569, - 46454691, 17069576, 4714546, 23953777 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 561605375422540, 1071733543815037, 131496498800990, - 1946868434569999, 828138133964203 -#else - 15200332, 8368572, 19679101, 15970074, 35236190, 1959450, - 24611599, 29010600, 55362987, 12340219 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1548495173745801, 442310529226540, 998072547000384, - 553054358385281, 644824326376171 -#else - 12876937, 23074376, 33134380, 6590940, 60801088, 14872439, - 9613953, 8241152, 15370987, 9608631 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1445526537029440, 2225519789662536, 914628859347385, - 1064754194555068, 1660295614401091 -#else - 62965568, 21540023, 8446280, 33162829, 4407737, 13629032, - 59383996, 15866073, 38898243, 24740332 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1199690223111956, 24028135822341, 66638289244341, - 57626156285975, 565093967979607 -#else - 26660628, 17876777, 8393733, 358047, 59707573, 992987, 43204631, - 858696, 20571223, 8420556 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 876926774220824, 554618976488214, 1012056309841565, - 839961821554611, 1414499340307677 -#else - 14620696, 13067227, 51661590, 8264466, 14106269, 15080814, - 33531827, 12516406, 45534429, 21077682 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 703047626104145, 1266841406201770, 165556500219173, - 486991595001879, 1011325891650656 -#else - 236881, 10476226, 57258, 18877408, 6472997, 2466984, 17258519, - 7256740, 8791136, 15069930 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1622861044480487, 1156394801573634, 1869132565415504, - 327103985777730, 2095342781472284 -#else - 1276391, 24182514, 22949634, 17231625, 43615824, 27852245, - 14711874, 4874229, 36445724, 31223040 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 334886927423922, 489511099221528, 129160865966726, - 1720809113143481, 619700195649254 -#else - 5855666, 4990204, 53397016, 7294283, 59304582, 1924646, - 65685689, 25642053, 34039526, 9234252 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1646545795166119, 1758370782583567, 714746174550637, - 1472693650165135, 898994790308209 -#else - 20590503, 24535444, 31529743, 26201766, 64402029, 10650547, - 31559055, 21944845, 18979185, 13396066 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 333403773039279, 295772542452938, 1693106465353610, - 912330357530760, 471235657950362 -#else - 24474287, 4968103, 22267082, 4407354, 24063882, 25229252, - 48291976, 13594781, 33514650, 7021958 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1811196219982022, 1068969825533602, 289602974833439, - 1988956043611592, 863562343398367 -#else - 55541958, 26988926, 45743778, 15928891, 40950559, 4315420, - 41160136, 29637754, 45628383, 12868081 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 906282429780072, 2108672665779781, 432396390473936, - 150625823801893, 1708930497638539 -#else - 38473832, 13504660, 19988037, 31421671, 21078224, 6443208, - 45662757, 2244499, 54653067, 25465048 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 925664675702328, 21416848568684, 1831436641861340, - 601157008940113, 371818055044496 -#else - 36513336, 13793478, 61256044, 319135, 41385692, 27290532, - 33086545, 8957937, 51875216, 5540520 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1479786007267725, 1738881859066675, 68646196476567, - 2146507056100328, 1247662817535471 -#else - 55478669, 22050529, 58989363, 25911358, 2620055, 1022908, - 43398120, 31985447, 50980335, 18591624 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 52035296774456, 939969390708103, 312023458773250, - 59873523517659, 1231345905848899 -#else - 23152952, 775386, 27395463, 14006635, 57407746, 4649511, - 1689819, 892185, 55595587, 18348483 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 643355106415761, 290186807495774, 2013561737429023, - 319648069511546, 393736678496162 -#else - 9770129, 9586738, 26496094, 4324120, 1556511, 30004408, - 27453818, 4763127, 47929250, 5867133 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 129358342392716, 1932811617704777, 1176749390799681, - 398040349861790, 1170779668090425 -#else - 34343820, 1927589, 31726409, 28801137, 23962433, 17534932, - 27846558, 5931263, 37359161, 17445976 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2051980782668029, 121859921510665, 2048329875753063, - 1235229850149665, 519062146124755 -#else - 27461885, 30576896, 22380809, 1815854, 44075111, 30522493, - 7283489, 18406359, 47582163, 7734628 -#endif - }}, - }, - }, - { - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1608170971973096, 415809060360428, 1350468408164766, - 2038620059057678, 1026904485989112 -#else - 59098600, 23963614, 55988460, 6196037, 29344158, 20123547, - 7585294, 30377806, 18549496, 15302069 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1837656083115103, 1510134048812070, 906263674192061, - 1821064197805734, 565375124676301 -#else - 34450527, 27383209, 59436070, 22502750, 6258877, 13504381, - 10458790, 27135971, 58236621, 8424745 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 578027192365650, 2034800251375322, 2128954087207123, - 478816193810521, 2196171989962750 -#else - 24687186, 8613276, 36441818, 30320886, 1863891, 31723888, - 19206233, 7134917, 55824382, 32725512 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1633188840273139, 852787172373708, 1548762607215796, - 1266275218902681, 1107218203325133 -#else - 11334899, 24336410, 8025292, 12707519, 17523892, 23078361, - 10243737, 18868971, 62042829, 16498836 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 462189358480054, 1784816734159228, 1611334301651368, - 1303938263943540, 707589560319424 -#else - 8911542, 6887158, 57524604, 26595841, 11145640, 24010752, - 17303924, 19430194, 6536640, 10543906 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1038829280972848, 38176604650029, 753193246598573, - 1136076426528122, 595709990562434 -#else - 38162480, 15479762, 49642029, 568875, 65611181, 11223453, - 64439674, 16928857, 39873154, 8876770 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1408451820859834, 2194984964010833, 2198361797561729, - 1061962440055713, 1645147963442934 -#else - 41365946, 20987567, 51458897, 32707824, 34082177, 32758143, - 33627041, 15824473, 66504438, 24514614 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 4701053362120, 1647641066302348, 1047553002242085, - 1923635013395977, 206970314902065 -#else - 10330056, 70051, 7957388, 24551765, 9764901, 15609756, 27698697, - 28664395, 1657393, 3084098 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1750479161778571, 1362553355169293, 1891721260220598, - 966109370862782, 1024913988299801 -#else - 10477963, 26084172, 12119565, 20303627, 29016246, 28188843, - 31280318, 14396151, 36875289, 15272408 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 212699049131723, 1117950018299775, 1873945661751056, - 1403802921984058, 130896082652698 -#else - 54820555, 3169462, 28813183, 16658753, 25116432, 27923966, - 41934906, 20918293, 42094106, 1950503 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 636808533673210, 1262201711667560, 390951380330599, - 1663420692697294, 561951321757406 -#else - 40928506, 9489186, 11053416, 18808271, 36055143, 5825629, - 58724558, 24786899, 15341278, 8373727 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 520731594438141, 1446301499955692, 273753264629267, - 1565101517999256, 1019411827004672 -#else - 28685821, 7759505, 52730348, 21551571, 35137043, 4079241, - 298136, 23321830, 64230656, 15190419 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 926527492029409, 1191853477411379, 734233225181171, - 184038887541270, 1790426146325343 -#else - 34175969, 13806335, 52771379, 17760000, 43104243, 10940927, - 8669718, 2742393, 41075551, 26679428 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1464651961852572, 1483737295721717, 1519450561335517, - 1161429831763785, 405914998179977 -#else - 65528476, 21825014, 41129205, 22109408, 49696989, 22641577, - 9291593, 17306653, 54954121, 6048604 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 996126634382301, 796204125879525, 127517800546509, - 344155944689303, 615279846169038 -#else - 36803549, 14843443, 1539301, 11864366, 20201677, 1900163, - 13934231, 5128323, 11213262, 9168384 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 738724080975276, 2188666632415296, 1961313708559162, - 1506545807547587, 1151301638969740 -#else - 40828332, 11007846, 19408960, 32613674, 48515898, 29225851, - 62020803, 22449281, 20470156, 17155731 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 622917337413835, 1218989177089035, 1284857712846592, - 970502061709359, 351025208117090 -#else - 43972811, 9282191, 14855179, 18164354, 59746048, 19145871, - 44324911, 14461607, 14042978, 5230683 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2067814584765580, 1677855129927492, 2086109782475197, - 235286517313238, 1416314046739645 -#else - 29969548, 30812838, 50396996, 25001989, 9175485, 31085458, - 21556950, 3506042, 61174973, 21104723 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 586844262630358, 307444381952195, 458399356043426, - 602068024507062, 1028548203415243 -#else - 63964118, 8744660, 19704003, 4581278, 46678178, 6830682, - 45824694, 8971512, 38569675, 15326562 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 678489922928203, 2016657584724032, 90977383049628, - 1026831907234582, 615271492942522 -#else - 47644235, 10110287, 49846336, 30050539, 43608476, 1355668, - 51585814, 15300987, 46594746, 9168259 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 301225714012278, 1094837270268560, 1202288391010439, - 644352775178361, 1647055902137983 -#else - 61755510, 4488612, 43305616, 16314346, 7780487, 17915493, - 38160505, 9601604, 33087103, 24543045 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1210746697896478, 1416608304244708, 686487477217856, - 1245131191434135, 1051238336855737 -#else - 47665694, 18041531, 46311396, 21109108, 37284416, 10229460, - 39664535, 18553900, 61111993, 15664671 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1135604073198207, 1683322080485474, 769147804376683, - 2086688130589414, 900445683120379 -#else - 23294591, 16921819, 44458082, 25083453, 27844203, 11461195, - 13099750, 31094076, 18151675, 13417686 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1971518477615628, 401909519527336, 448627091057375, - 1409486868273821, 1214789035034363 -#else - 42385932, 29377914, 35958184, 5988918, 40250079, 6685064, - 1661597, 21002991, 15271675, 18101767 -#endif - }}, - }, - }, - { - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1364039144731711, 1897497433586190, 2203097701135459, - 145461396811251, 1349844460790699 -#else - 11433023, 20325767, 8239630, 28274915, 65123427, 32828713, - 48410099, 2167543, 60187563, 20114249 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1045230323257973, 818206601145807, 630513189076103, - 1672046528998132, 807204017562437 -#else - 35672693, 15575145, 30436815, 12192228, 44645511, 9395378, - 57191156, 24915434, 12215109, 12028277 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 439961968385997, 386362664488986, 1382706320807688, - 309894000125359, 2207801346498567 -#else - 14098381, 6555944, 23007258, 5757252, 51681032, 20603929, - 30123439, 4617780, 50208775, 32898803 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1229004686397588, 920643968530863, 123975893911178, - 681423993215777, 1400559197080973 -#else - 63082644, 18313596, 11893167, 13718664, 52299402, 1847384, - 51288865, 10154008, 23973261, 20869958 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2003766096898049, 170074059235165, 1141124258967971, - 1485419893480973, 1573762821028725 -#else - 40577025, 29858441, 65199965, 2534300, 35238307, 17004076, - 18341389, 22134481, 32013173, 23450893 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 729905708611432, 1270323270673202, 123353058984288, - 426460209632942, 2195574535456672 -#else - 41629544, 10876442, 55337778, 18929291, 54739296, 1838103, - 21911214, 6354752, 4425632, 32716610 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1271140255321235, 2044363183174497, 52125387634689, - 1445120246694705, 942541986339084 -#else - 56675475, 18941465, 22229857, 30463385, 53917697, 776728, - 49693489, 21533969, 4725004, 14044970 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1761608437466135, 583360847526804, 1586706389685493, - 2157056599579261, 1170692369685772 -#else - 19268631, 26250011, 1555348, 8692754, 45634805, 23643767, - 6347389, 32142648, 47586572, 17444675 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 871476219910823, 1878769545097794, 2241832391238412, - 548957640601001, 690047440233174 -#else - 42244775, 12986007, 56209986, 27995847, 55796492, 33405905, - 19541417, 8180106, 9282262, 10282508 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 297194732135507, 1366347803776820, 1301185512245601, - 561849853336294, 1533554921345731 -#else - 40903763, 4428546, 58447668, 20360168, 4098401, 19389175, - 15522534, 8372215, 5542595, 22851749 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 999628998628371, 1132836708493400, 2084741674517453, - 469343353015612, 678782988708035 -#else - 56546323, 14895632, 26814552, 16880582, 49628109, 31065071, - 64326972, 6993760, 49014979, 10114654 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2189427607417022, 699801937082607, 412764402319267, - 1478091893643349, 2244675696854460 -#else - 47001790, 32625013, 31422703, 10427861, 59998115, 6150668, - 38017109, 22025285, 25953724, 33448274 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1712292055966563, 204413590624874, 1405738637332841, - 408981300829763, 861082219276721 -#else - 62874467, 25515139, 57989738, 3045999, 2101609, 20947138, - 19390019, 6094296, 63793585, 12831124 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 508561155940631, 966928475686665, 2236717801150132, - 424543858577297, 2089272956986143 -#else - 51110167, 7578151, 5310217, 14408357, 33560244, 33329692, - 31575953, 6326196, 7381791, 31132593 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 221245220129925, 1156020201681217, 491145634799213, - 542422431960839, 828100817819207 -#else - 46206085, 3296810, 24736065, 17226043, 18374253, 7318640, - 6295303, 8082724, 51746375, 12339663 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 153756971240384, 1299874139923977, 393099165260502, - 1058234455773022, 996989038681183 -#else - 27724736, 2291157, 6088201, 19369634, 1792726, 5857634, - 13848414, 15768922, 25091167, 14856294 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 559086812798481, 573177704212711, 1629737083816402, - 1399819713462595, 1646954378266038 -#else - 48242193, 8331042, 24373479, 8541013, 66406866, 24284974, - 12927299, 20858939, 44926390, 24541532 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1887963056288059, 228507035730124, 1468368348640282, - 930557653420194, 613513962454686 -#else - 55685435, 28132841, 11632844, 3405020, 30536730, 21880393, - 39848098, 13866389, 30146206, 9142070 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1224529808187553, 1577022856702685, 2206946542980843, - 625883007765001, 279930793512158 -#else - 3924129, 18246916, 53291741, 23499471, 12291819, 32886066, - 39406089, 9326383, 58871006, 4171293 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1076287717051609, 1114455570543035, 187297059715481, - 250446884292121, 1885187512550540 -#else - 51186905, 16037936, 6713787, 16606682, 45496729, 2790943, - 26396185, 3731949, 345228, 28091483 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 902497362940219, 76749815795675, 1657927525633846, - 1420238379745202, 1340321636548352 -#else - 45781307, 13448258, 25284571, 1143661, 20614966, 24705045, - 2031538, 21163201, 50855680, 19972348 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1129576631190784, 1281994010027327, 996844254743018, - 257876363489249, 1150850742055018 -#else - 31016192, 16832003, 26371391, 19103199, 62081514, 14854136, - 17477601, 3842657, 28012650, 17149012 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 628740660038789, 1943038498527841, 467786347793886, - 1093341428303375, 235413859513003 -#else - 62033029, 9368965, 58546785, 28953529, 51858910, 6970559, - 57918991, 16292056, 58241707, 3507939 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 237425418909360, 469614029179605, 1512389769174935, - 1241726368345357, 441602891065214 -#else - 29439664, 3537914, 23333589, 6997794, 49553303, 22536363, - 51899661, 18503164, 57943934, 6580395 -#endif - }}, - }, - }, - { - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1736417953058555, 726531315520508, 1833335034432527, - 1629442561574747, 624418919286085 -#else - 54923003, 25874643, 16438268, 10826160, 58412047, 27318820, - 17860443, 24280586, 65013061, 9304566 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1960754663920689, 497040957888962, 1909832851283095, - 1271432136996826, 2219780368020940 -#else - 20714545, 29217521, 29088194, 7406487, 11426967, 28458727, - 14792666, 18945815, 5289420, 33077305 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1537037379417136, 1358865369268262, 2130838645654099, - 828733687040705, 1999987652890901 -#else - 50443312, 22903641, 60948518, 20248671, 9192019, 31751970, - 17271489, 12349094, 26939669, 29802138 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 629042105241814, 1098854999137608, 887281544569320, - 1423102019874777, 7911258951561 -#else - 54218966, 9373457, 31595848, 16374215, 21471720, 13221525, - 39825369, 21205872, 63410057, 117886 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1811562332665373, 1501882019007673, 2213763501088999, - 359573079719636, 36370565049116 -#else - 22263325, 26994382, 3984569, 22379786, 51994855, 32987646, - 28311252, 5358056, 43789084, 541963 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 218907117361280, 1209298913016966, 1944312619096112, - 1130690631451061, 1342327389191701 -#else - 16259200, 3261970, 2309254, 18019958, 50223152, 28972515, - 24134069, 16848603, 53771797, 20002236 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1369976867854704, 1396479602419169, 1765656654398856, - 2203659200586299, 998327836117241 -#else - 9378160, 20414246, 44262881, 20809167, 28198280, 26310334, - 64709179, 32837080, 690425, 14876244 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2230701885562825, 1348173180338974, 2172856128624598, - 1426538746123771, 444193481326151 -#else - 24977353, 33240048, 58884894, 20089345, 28432342, 32378079, - 54040059, 21257083, 44727879, 6618998 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 784210426627951, 918204562375674, 1284546780452985, - 1324534636134684, 1872449409642708 -#else - 65570671, 11685645, 12944378, 13682314, 42719353, 19141238, - 8044828, 19737104, 32239828, 27901670 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 319638829540294, 596282656808406, 2037902696412608, - 1557219121643918, 341938082688094 -#else - 48505798, 4762989, 66182614, 8885303, 38696384, 30367116, - 9781646, 23204373, 32779358, 5095274 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1901860206695915, 2004489122065736, 1625847061568236, - 973529743399879, 2075287685312905 -#else - 34100715, 28339925, 34843976, 29869215, 9460460, 24227009, - 42507207, 14506723, 21639561, 30924196 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1371853944110545, 1042332820512553, 1949855697918254, - 1791195775521505, 37487364849293 -#else - 50707921, 20442216, 25239337, 15531969, 3987758, 29055114, - 65819361, 26690896, 17874573, 558605 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 687200189577855, 1082536651125675, 644224940871546, - 340923196057951, 343581346747396 -#else - 53508735, 10240080, 9171883, 16131053, 46239610, 9599699, - 33499487, 5080151, 2085892, 5119761 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2082717129583892, 27829425539422, 145655066671970, - 1690527209845512, 1865260509673478 -#else - 44903700, 31034903, 50727262, 414690, 42089314, 2170429, - 30634760, 25190818, 35108870, 27794547 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1059729620568824, 2163709103470266, 1440302280256872, - 1769143160546397, 869830310425069 -#else - 60263160, 15791201, 8550074, 32241778, 29928808, 21462176, - 27534429, 26362287, 44757485, 12961481 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1609516219779025, 777277757338817, 2101121130363987, - 550762194946473, 1905542338659364 -#else - 42616785, 23983660, 10368193, 11582341, 43711571, 31309144, - 16533929, 8206996, 36914212, 28394793 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2024821921041576, 426948675450149, 595133284085473, - 471860860885970, 600321679413000 -#else - 55987368, 30172197, 2307365, 6362031, 66973409, 8868176, - 50273234, 7031274, 7589640, 8945490 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 598474602406721, 1468128276358244, 1191923149557635, - 1501376424093216, 1281662691293476 -#else - 34956097, 8917966, 6661220, 21876816, 65916803, 17761038, - 7251488, 22372252, 24099108, 19098262 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1721138489890707, 1264336102277790, 433064545421287, - 1359988423149466, 1561871293409447 -#else - 5019539, 25646962, 4244126, 18840076, 40175591, 6453164, - 47990682, 20265406, 60876967, 23273695 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 719520245587143, 393380711632345, 132350400863381, - 1543271270810729, 1819543295798660 -#else - 10853575, 10721687, 26480089, 5861829, 44113045, 1972174, - 65242217, 22996533, 63745412, 27113307 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 396397949784152, 1811354474471839, 1362679985304303, - 2117033964846756, 498041172552279 -#else - 50106456, 5906789, 221599, 26991285, 7828207, 20305514, - 24362660, 31546264, 53242455, 7421391 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1812471844975748, 1856491995543149, 126579494584102, - 1036244859282620, 1975108050082550 -#else - 8139908, 27007935, 32257645, 27663886, 30375718, 1886181, - 45933756, 15441251, 28826358, 29431403 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 650623932407995, 1137551288410575, 2125223403615539, - 1725658013221271, 2134892965117796 -#else - 6267067, 9695052, 7709135, 16950835, 34239795, 31668296, - 14795159, 25714308, 13746020, 31812384 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 522584000310195, 1241762481390450, 1743702789495384, - 2227404127826575, 1686746002148897 -#else - 28584883, 7787108, 60375922, 18503702, 22846040, 25983196, - 63926927, 33190907, 4771361, 25134474 -#endif - }}, - }, - }, - { - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 427904865186312, 1703211129693455, 1585368107547509, - 1436984488744336, 761188534613978 -#else - 24949256, 6376279, 39642383, 25379823, 48462709, 23623825, - 33543568, 21412737, 3569626, 11342593 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 318101947455002, 248138407995851, 1481904195303927, - 309278454311197, 1258516760217879 -#else - 26514970, 4740088, 27912651, 3697550, 19331575, 22082093, - 6809885, 4608608, 7325975, 18753361 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1275068538599310, 513726919533379, 349926553492294, - 688428871968420, 1702400196000666 -#else - 55490446, 19000001, 42787651, 7655127, 65739590, 5214311, - 39708324, 10258389, 49462170, 25367739 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1061864036265233, 961611260325381, 321859632700838, - 1045600629959517, 1985130202504038 -#else - 11431185, 15823007, 26570245, 14329124, 18029990, 4796082, - 35662685, 15580663, 9280358, 29580745 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1558816436882417, 1962896332636523, 1337709822062152, - 1501413830776938, 294436165831932 -#else - 66948081, 23228174, 44253547, 29249434, 46247496, 19933429, - 34297962, 22372809, 51563772, 4387440 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 818359826554971, 1862173000996177, 626821592884859, - 573655738872376, 1749691246745455 -#else - 46309467, 12194511, 3937617, 27748540, 39954043, 9340369, - 42594872, 8548136, 20617071, 26072431 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1988022651432119, 1082111498586040, 1834020786104821, - 1454826876423687, 692929915223122 -#else - 66170039, 29623845, 58394552, 16124717, 24603125, 27329039, - 53333511, 21678609, 24345682, 10325460 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2146513703733331, 584788900394667, 464965657279958, - 2183973639356127, 238371159456790 -#else - 47253587, 31985546, 44906155, 8714033, 14007766, 6928528, - 16318175, 32543743, 4766742, 3552007 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1129007025494441, 2197883144413266, 265142755578169, - 971864464758890, 1983715884903702 -#else - 45357481, 16823515, 1351762, 32751011, 63099193, 3950934, - 3217514, 14481909, 10988822, 29559670 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1291366624493075, 381456718189114, 1711482489312444, - 1815233647702022, 892279782992467 -#else - 15564307, 19242862, 3101242, 5684148, 30446780, 25503076, - 12677126, 27049089, 58813011, 13296004 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 444548969917454, 1452286453853356, 2113731441506810, - 645188273895859, 810317625309512 -#else - 57666574, 6624295, 36809900, 21640754, 62437882, 31497052, - 31521203, 9614054, 37108040, 12074673 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2242724082797924, 1373354730327868, 1006520110883049, - 2147330369940688, 1151816104883620 -#else - 4771172, 33419193, 14290748, 20464580, 27992297, 14998318, - 65694928, 31997715, 29832612, 17163397 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1745720200383796, 1911723143175317, 2056329390702074, - 355227174309849, 879232794371100 -#else - 7064884, 26013258, 47946901, 28486894, 48217594, 30641695, - 25825241, 5293297, 39986204, 13101589 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 163723479936298, 115424889803150, 1156016391581227, - 1894942220753364, 1970549419986329 -#else - 64810282, 2439669, 59642254, 1719964, 39841323, 17225986, - 32512468, 28236839, 36752793, 29363474 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 681981452362484, 267208874112496, 1374683991933094, - 638600984916117, 646178654558546 -#else - 37102324, 10162315, 33928688, 3981722, 50626726, 20484387, - 14413973, 9515896, 19568978, 9628812 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 13378654854251, 106237307029567, 1944412051589651, - 1841976767925457, 230702819835573 -#else - 33053803, 199357, 15894591, 1583059, 27380243, 28973997, - 49269969, 27447592, 60817077, 3437739 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 260683893467075, 854060306077237, 913639551980112, - 4704576840123, 280254810808712 -#else - 48129987, 3884492, 19469877, 12726490, 15913552, 13614290, - 44147131, 70103, 7463304, 4176122 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 715374893080287, 1173334812210491, 1806524662079626, - 1894596008000979, 398905715033393 -#else - 39984863, 10659916, 11482427, 17484051, 12771466, 26919315, - 34389459, 28231680, 24216881, 5944158 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 500026409727661, 1596431288195371, 1420380351989370, - 985211561521489, 392444930785633 -#else - 8894125, 7450974, 64444715, 23788679, 39028346, 21165316, - 19345745, 14680796, 11632993, 5847885 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2096421546958141, 1922523000950363, 789831022876840, - 427295144688779, 320923973161730 -#else - 26942781, 31239115, 9129563, 28647825, 26024104, 11769399, - 55590027, 6367193, 57381634, 4782139 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1927770723575450, 1485792977512719, 1850996108474547, - 551696031508956, 2126047405475647 -#else - 19916442, 28726022, 44198159, 22140040, 25606323, 27581991, - 33253852, 8220911, 6358847, 31680575 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2112099158080148, 742570803909715, 6484558077432, - 1951119898618916, 93090382703416 -#else - 801428, 31472730, 16569427, 11065167, 29875704, 96627, 7908388, - 29073952, 53570360, 1387154 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 383905201636970, 859946997631870, 855623867637644, - 1017125780577795, 794250831877809 -#else - 19646058, 5720633, 55692158, 12814208, 11607948, 12749789, - 14147075, 15156355, 45242033, 11835259 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 77571826285752, 999304298101753, 487841111777762, - 1038031143212339, 339066367948762 -#else - 19299512, 1155910, 28703737, 14890794, 2925026, 7269399, - 26121523, 15467869, 40548314, 5052482 -#endif - }}, - }, - }, - { - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 674994775520533, 266035846330789, 826951213393478, - 1405007746162285, 1781791018620876 -#else - 64091413, 10058205, 1980837, 3964243, 22160966, 12322533, - 60677741, 20936246, 12228556, 26550755 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1001412661522686, 348196197067298, 1666614366723946, - 888424995032760, 580747687801357 -#else - 32944382, 14922211, 44263970, 5188527, 21913450, 24834489, - 4001464, 13238564, 60994061, 8653814 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1939560076207777, 1409892634407635, 552574736069277, - 383854338280405, 190706709864139 -#else - 22865569, 28901697, 27603667, 21009037, 14348957, 8234005, - 24808405, 5719875, 28483275, 2841751 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2177087163428741, 1439255351721944, 1208070840382793, - 2230616362004769, 1396886392021913 -#else - 50687877, 32441126, 66781144, 21446575, 21886281, 18001658, - 65220897, 33238773, 19932057, 20815229 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 676962063230039, 1880275537148808, 2046721011602706, - 888463247083003, 1318301552024067 -#else - 55452759, 10087520, 58243976, 28018288, 47830290, 30498519, - 3999227, 13239134, 62331395, 19644223 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1466980508178206, 617045217998949, 652303580573628, - 757303753529064, 207583137376902 -#else - 1382174, 21859713, 17266789, 9194690, 53784508, 9720080, - 20403944, 11284705, 53095046, 3093229 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1511056752906902, 105403126891277, 493434892772846, - 1091943425335976, 1802717338077427 -#else - 16650902, 22516500, 66044685, 1570628, 58779118, 7352752, - 66806440, 16271224, 43059443, 26862581 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1853982405405128, 1878664056251147, 1528011020803992, - 1019626468153565, 1128438412189035 -#else - 45197768, 27626490, 62497547, 27994275, 35364760, 22769138, - 24123613, 15193618, 45456747, 16815042 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1963939888391106, 293456433791664, 697897559513649, - 985882796904380, 796244541237972 -#else - 57172930, 29264984, 41829040, 4372841, 2087473, 10399484, - 31870908, 14690798, 17361620, 11864968 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 416770998629779, 389655552427054, 1314476859406756, - 1749382513022778, 1161905598739491 -#else - 55801235, 6210371, 13206574, 5806320, 38091172, 19587231, - 54777658, 26067830, 41530403, 17313742 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1428358296490651, 1027115282420478, 304840698058337, - 441410174026628, 1819358356278573 -#else - 14668443, 21284197, 26039038, 15305210, 25515617, 4542480, - 10453892, 6577524, 9145645, 27110552 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 204943430200135, 1554861433819175, 216426658514651, - 264149070665950, 2047097371738319 -#else - 5974855, 3053895, 57675815, 23169240, 35243739, 3225008, - 59136222, 3936127, 61456591, 30504127 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1934415182909034, 1393285083565062, 516409331772960, - 1157690734993892, 121039666594268 -#else - 30625386, 28825032, 41552902, 20761565, 46624288, 7695098, - 17097188, 17250936, 39109084, 1803631 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 662035583584445, 286736105093098, 1131773000510616, - 818494214211439, 472943792054479 -#else - 63555773, 9865098, 61880298, 4272700, 61435032, 16864731, - 14911343, 12196514, 45703375, 7047411 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 665784778135882, 1893179629898606, 808313193813106, - 276797254706413, 1563426179676396 -#else - 20093258, 9920966, 55970670, 28210574, 13161586, 12044805, - 34252013, 4124600, 34765036, 23296865 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 945205108984232, 526277562959295, 1324180513733566, - 1666970227868664, 153547609289173 -#else - 46320040, 14084653, 53577151, 7842146, 19119038, 19731827, - 4752376, 24839792, 45429205, 2288037 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2031433403516252, 203996615228162, 170487168837083, - 981513604791390, 843573964916831 -#else - 40289628, 30270716, 29965058, 3039786, 52635099, 2540456, - 29457502, 14625692, 42289247, 12570231 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1476570093962618, 838514669399805, 1857930577281364, - 2017007352225784, 317085545220047 -#else - 66045306, 22002608, 16920317, 12494842, 1278292, 27685323, - 45948920, 30055751, 55134159, 4724942 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1461557121912842, 1600674043318359, 2157134900399597, - 1670641601940616, 127765583803283 -#else - 17960970, 21778898, 62967895, 23851901, 58232301, 32143814, - 54201480, 24894499, 37532563, 1903855 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1293543509393474, 2143624609202546, 1058361566797508, - 214097127393994, 946888515472729 -#else - 23134274, 19275300, 56426866, 31942495, 20684484, 15770816, - 54119114, 3190295, 26955097, 14109738 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 357067959932916, 1290876214345711, 521245575443703, - 1494975468601005, 800942377643885 -#else - 15308788, 5320727, 36995055, 19235554, 22902007, 7767164, - 29425325, 22276870, 31960941, 11934971 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 566116659100033, 820247422481740, 994464017954148, - 327157611686365, 92591318111744 -#else - 39713153, 8435795, 4109644, 12222639, 42480996, 14818668, - 20638173, 4875028, 10491392, 1379718 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 617256647603209, 1652107761099439, 1857213046645471, - 1085597175214970, 817432759830522 -#else - 53949449, 9197840, 3875503, 24618324, 65725151, 27674630, - 33518458, 16176658, 21432314, 12180697 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 771808161440705, 1323510426395069, 680497615846440, - 851580615547985, 1320806384849017 -#else - 55321537, 11500837, 13787581, 19721842, 44678184, 10140204, - 1465425, 12689540, 56807545, 19681548 -#endif - }}, - }, - }, - { - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1219260086131915, 647169006596815, 79601124759706, - 2161724213426748, 404861897060198 -#else - 5414091, 18168391, 46101199, 9643569, 12834970, 1186149, - 64485948, 32212200, 26128230, 6032912 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1327968293887866, 1335500852943256, 1401587164534264, - 558137311952440, 1551360549268902 -#else - 40771450, 19788269, 32496024, 19900513, 17847800, 20885276, - 3604024, 8316894, 41233830, 23117073 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 417621685193956, 1429953819744454, 396157358457099, - 1940470778873255, 214000046234152 -#else - 3296484, 6223048, 24680646, 21307972, 44056843, 5903204, - 58246567, 28915267, 12376616, 3188849 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1268047918491973, 2172375426948536, 1533916099229249, - 1761293575457130, 1590622667026765 -#else - 29190469, 18895386, 27549112, 32370916, 3520065, 22857131, - 32049514, 26245319, 50999629, 23702124 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1627072914981959, 2211603081280073, 1912369601616504, - 1191770436221309, 2187309757525860 -#else - 52364359, 24245275, 735817, 32955454, 46701176, 28496527, - 25246077, 17758763, 18640740, 32593455 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1149147819689533, 378692712667677, 828475842424202, - 2218619146419342, 70688125792186 -#else - 60180029, 17123636, 10361373, 5642961, 4910474, 12345252, - 35470478, 33060001, 10530746, 1053335 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1299739417079761, 1438616663452759, 1536729078504412, - 2053896748919838, 1008421032591246 -#else - 37842897, 19367626, 53570647, 21437058, 47651804, 22899047, - 35646494, 30605446, 24018830, 15026644 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2040723824657366, 399555637875075, 632543375452995, - 872649937008051, 1235394727030233 -#else - 44516310, 30409154, 64819587, 5953842, 53668675, 9425630, - 25310643, 13003497, 64794073, 18408815 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2211311599327900, 2139787259888175, 938706616835350, - 12609661139114, 2081897930719789 -#else - 39688860, 32951110, 59064879, 31885314, 41016598, 13987818, - 39811242, 187898, 43942445, 31022696 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1324994503390450, 336982330582631, 1183998925654177, - 1091654665913274, 48727673971319 -#else - 45364466, 19743956, 1844839, 5021428, 56674465, 17642958, - 9716666, 16266922, 62038647, 726098 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1845522914617879, 1222198248335542, 150841072760134, - 1927029069940982, 1189913404498011 -#else - 29370903, 27500434, 7334070, 18212173, 9385286, 2247707, - 53446902, 28714970, 30007387, 17731091 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1079559557592645, 2215338383666441, 1903569501302605, - 49033973033940, 305703433934152 -#else - 66172485, 16086690, 23751945, 33011114, 65941325, 28365395, - 9137108, 730663, 9835848, 4555336 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 94653405416909, 1386121349852999, 1062130477891762, - 36553947479274, 833669648948846 -#else - 43732429, 1410445, 44855111, 20654817, 30867634, 15826977, - 17693930, 544696, 55123566, 12422645 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1432015813136298, 440364795295369, 1395647062821501, - 1976874522764578, 934452372723352 -#else - 31117226, 21338698, 53606025, 6561946, 57231997, 20796761, - 61990178, 29457725, 29120152, 13924425 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1296625309219774, 2068273464883862, 1858621048097805, - 1492281814208508, 2235868981918946 -#else - 49707966, 19321222, 19675798, 30819676, 56101901, 27695611, - 57724924, 22236731, 7240930, 33317044 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1490330266465570, 1858795661361448, 1436241134969763, - 294573218899647, 1208140011028933 -#else - 35747106, 22207651, 52101416, 27698213, 44655523, 21401660, - 1222335, 4389483, 3293637, 18002689 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1282462923712748, 741885683986255, 2027754642827561, - 518989529541027, 1826610009555945 -#else - 50424044, 19110186, 11038543, 11054958, 53307689, 30215898, - 42789283, 7733546, 12796905, 27218610 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1525827120027511, 723686461809551, 1597702369236987, - 244802101764964, 1502833890372311 -#else - 58349431, 22736595, 41689999, 10783768, 36493307, 23807620, - 38855524, 3647835, 3222231, 22393970 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 113622036244513, 1233740067745854, 674109952278496, - 2114345180342965, 166764512856263 -#else - 18606113, 1693100, 41660478, 18384159, 4112352, 10045021, - 23603893, 31506198, 59558087, 2484984 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2041668749310338, 2184405322203901, 1633400637611036, - 2110682505536899, 2048144390084644 -#else - 9255298, 30423235, 54952701, 32550175, 13098012, 24339566, - 16377219, 31451620, 47306788, 30519729 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 503058759232932, 760293024620937, 2027152777219493, - 666858468148475, 1539184379870952 -#else - 44379556, 7496159, 61366665, 11329248, 19991973, 30206930, - 35390715, 9936965, 37011176, 22935634 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1916168475367211, 915626432541343, 883217071712575, - 363427871374304, 1976029821251593 -#else - 21878571, 28553135, 4338335, 13643897, 64071999, 13160959, - 19708896, 5415497, 59748361, 29445138 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 678039535434506, 570587290189340, 1605302676614120, - 2147762562875701, 1706063797091704 -#else - 27736842, 10103576, 12500508, 8502413, 63695848, 23920873, - 10436917, 32004156, 43449720, 25422331 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1439489648586438, 2194580753290951, 832380563557396, - 561521973970522, 584497280718389 -#else - 19492550, 21450067, 37426887, 32701801, 63900692, 12403436, - 30066266, 8367329, 13243957, 8709688 -#endif - }}, - }, - }, - { - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 187989455492609, 681223515948275, 1933493571072456, - 1872921007304880, 488162364135671 -#else - 12015105, 2801261, 28198131, 10151021, 24818120, 28811299, - 55914672, 27908697, 5150967, 7274186 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1413466089534451, 410844090765630, 1397263346404072, - 408227143123410, 1594561803147811 -#else - 2831347, 21062286, 1478974, 6122054, 23825128, 20820846, - 31097298, 6083058, 31021603, 23760822 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2102170800973153, 719462588665004, 1479649438510153, - 1097529543970028, 1302363283777685 -#else - 64578913, 31324785, 445612, 10720828, 53259337, 22048494, - 43601132, 16354464, 15067285, 19406725 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 942065717847195, 1069313679352961, 2007341951411051, - 70973416446291, 1419433790163706 -#else - 7840923, 14037873, 33744001, 15934015, 66380651, 29911725, - 21403987, 1057586, 47729402, 21151211 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1146565545556377, 1661971299445212, 406681704748893, - 564452436406089, 1109109865829139 -#else - 915865, 17085158, 15608284, 24765302, 42751837, 6060029, - 49737545, 8410996, 59888403, 16527024 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2214421081775077, 1165671861210569, 1890453018796184, - 3556249878661, 442116172656317 -#else - 32922597, 32997445, 20336073, 17369864, 10903704, 28169945, - 16957573, 52992, 23834301, 6588044 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 753830546620811, 1666955059895019, 1530775289309243, - 1119987029104146, 2164156153857580 -#else - 32752011, 11232950, 3381995, 24839566, 22652987, 22810329, - 17159698, 16689107, 46794284, 32248439 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 615171919212796, 1523849404854568, 854560460547503, - 2067097370290715, 1765325848586042 -#else - 62419196, 9166775, 41398568, 22707125, 11576751, 12733943, - 7924251, 30802151, 1976122, 26305405 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1094538949313667, 1796592198908825, 870221004284388, - 2025558921863561, 1699010892802384 -#else - 21251203, 16309901, 64125849, 26771309, 30810596, 12967303, - 156041, 30183180, 12331344, 25317235 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1951351290725195, 1916457206844795, 198025184438026, - 1909076887557595, 1938542290318919 -#else - 8651595, 29077400, 51023227, 28557437, 13002506, 2950805, - 29054427, 28447462, 10008135, 28886531 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1014323197538413, 869150639940606, 1756009942696599, - 1334952557375672, 1544945379082874 -#else - 31486061, 15114593, 52847614, 12951353, 14369431, 26166587, - 16347320, 19892343, 8684154, 23021480 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 764055910920305, 1603590757375439, 146805246592357, - 1843313433854297, 954279890114939 -#else - 19443825, 11385320, 24468943, 23895364, 43189605, 2187568, - 40845657, 27467510, 31316347, 14219878 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 80113526615750, 764536758732259, 1055139345100233, - 469252651759390, 617897512431515 -#else - 38514374, 1193784, 32245219, 11392485, 31092169, 15722801, - 27146014, 6992409, 29126555, 9207390 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 74497112547268, 740094153192149, 1745254631717581, - 727713886503130, 1283034364416928 -#else - 32382916, 1110093, 18477781, 11028262, 39697101, 26006320, - 62128346, 10843781, 59151264, 19118701 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 525892105991110, 1723776830270342, 1476444848991936, - 573789489857760, 133864092632978 -#else - 2814918, 7836403, 27519878, 25686276, 46214848, 22000742, - 45614304, 8550129, 28346258, 1994730 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 542611720192581, 1986812262899321, 1162535242465837, - 481498966143464, 544600533583622 -#else - 47530565, 8085544, 53108345, 29605809, 2785837, 17323125, - 47591912, 7174893, 22628102, 8115180 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 64123227344372, 1239927720647794, 1360722983445904, - 222610813654661, 62429487187991 -#else - 36703732, 955510, 55975026, 18476362, 34661776, 20276352, - 41457285, 3317159, 57165847, 930271 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1793193323953132, 91096687857833, 70945970938921, - 2158587638946380, 1537042406482111 -#else - 51805164, 26720662, 28856489, 1357446, 23421993, 1057177, - 24091212, 32165462, 44343487, 22903716 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1895854577604609, 1394895708949416, 1728548428495944, - 1140864900240149, 563645333603061 -#else - 44357633, 28250434, 54201256, 20785565, 51297352, 25757378, - 52269845, 17000211, 65241845, 8398969 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 141358280486863, 91435889572504, 1087208572552643, - 1829599652522921, 1193307020643647 -#else - 35139535, 2106402, 62372504, 1362500, 12813763, 16200670, - 22981545, 27263159, 18009407, 17781660 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1611230858525381, 950720175540785, 499589887488610, - 2001656988495019, 88977313255908 -#else - 49887941, 24009210, 39324209, 14166834, 29815394, 7444469, - 29551787, 29827013, 19288548, 1325865 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1189080501479658, 2184348804772597, 1040818725742319, - 2018318290311834, 1712060030915354 -#else - 15100138, 17718680, 43184885, 32549333, 40658671, 15509407, - 12376730, 30075286, 33166106, 25511682 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 873966876953756, 1090638350350440, 1708559325189137, - 672344594801910, 1320437969700239 -#else - 20909212, 13023121, 57899112, 16251777, 61330449, 25459517, - 12412150, 10018715, 2213263, 19676059 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1508590048271766, 1131769479776094, 101550868699323, - 428297785557897, 561791648661744 -#else - 32529814, 22479743, 30361438, 16864679, 57972923, 1513225, - 22922121, 6382134, 61341936, 8371347 -#endif - }}, - }, - }, - { - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 756417570499462, 237882279232602, 2136263418594016, - 1701968045454886, 703713185137472 -#else - 9923462, 11271500, 12616794, 3544722, 37110496, 31832805, - 12891686, 25361300, 40665920, 10486143 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1781187809325462, 1697624151492346, 1381393690939988, - 175194132284669, 1483054666415238 -#else - 44511638, 26541766, 8587002, 25296571, 4084308, 20584370, - 361725, 2610596, 43187334, 22099236 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2175517777364616, 708781536456029, 955668231122942, - 1967557500069555, 2021208005604118 -#else - 5408392, 32417741, 62139741, 10561667, 24145918, 14240566, - 31319731, 29318891, 19985174, 30118346 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1115135966606887, 224217372950782, 915967306279222, - 593866251291540, 561747094208006 -#else - 53114407, 16616820, 14549246, 3341099, 32155958, 13648976, - 49531796, 8849296, 65030, 8370684 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1443163092879439, 391875531646162, 2180847134654632, - 464538543018753, 1594098196837178 -#else - 58787919, 21504805, 31204562, 5839400, 46481576, 32497154, - 47665921, 6922163, 12743482, 23753914 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 850858855888869, 319436476624586, 327807784938441, - 740785849558761, 17128415486016 -#else - 64747493, 12678784, 28815050, 4759974, 43215817, 4884716, - 23783145, 11038569, 18800704, 255233 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2132756334090067, 536247820155645, 48907151276867, - 608473197600695, 1261689545022784 -#else - 61839187, 31780545, 13957885, 7990715, 23132995, 728773, - 13393847, 9066957, 19258688, 18800639 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1525176236978354, 974205476721062, 293436255662638, - 148269621098039, 137961998433963 -#else - 64172210, 22726896, 56676774, 14516792, 63468078, 4372540, - 35173943, 2209389, 65584811, 2055793 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1121075518299410, 2071745529082111, 1265567917414828, - 1648196578317805, 496232102750820 -#else - 580882, 16705327, 5468415, 30871414, 36182444, 18858431, - 59905517, 24560042, 37087844, 7394434 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 122321229299801, 1022922077493685, 2001275453369484, - 2017441881607947, 993205880778002 -#else - 23838809, 1822728, 51370421, 15242726, 8318092, 29821328, - 45436683, 30062226, 62287122, 14799920 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 654925550560074, 1168810995576858, 575655959430926, - 905758704861388, 496774564663534 -#else - 13345610, 9759151, 3371034, 17416641, 16353038, 8577942, - 31129804, 13496856, 58052846, 7402517 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1954109525779738, 2117022646152485, 338102630417180, - 1194140505732026, 107881734943492 -#else - 2286874, 29118501, 47066405, 31546095, 53412636, 5038121, - 11006906, 17794080, 8205060, 1607563 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1714785840001267, 2036500018681589, 1876380234251966, - 2056717182974196, 1645855254384642 -#else - 14414067, 25552300, 3331829, 30346215, 22249150, 27960244, - 18364660, 30647474, 30019586, 24525154 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 106431476499341, 62482972120563, 1513446655109411, - 807258751769522, 538491469114 -#else - 39420813, 1585952, 56333811, 931068, 37988643, 22552112, - 52698034, 12029092, 9944378, 8024 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2002850762893643, 1243624520538135, 1486040410574605, - 2184752338181213, 378495998083531 -#else - 4368715, 29844802, 29874199, 18531449, 46878477, 22143727, - 50994269, 32555346, 58966475, 5640029 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 922510868424903, 1089502620807680, 402544072617374, - 1131446598479839, 1290278588136533 -#else - 10299591, 13746483, 11661824, 16234854, 7630238, 5998374, - 9809887, 16859868, 15219797, 19226649 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1867998812076769, 715425053580701, 39968586461416, - 2173068014586163, 653822651801304 -#else - 27425505, 27835351, 3055005, 10660664, 23458024, 595578, - 51710259, 32381236, 48766680, 9742716 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 162892278589453, 182585796682149, 75093073137630, - 497037941226502, 133871727117371 -#else - 6744077, 2427284, 26042789, 2720740, 66260958, 1118973, - 32324614, 7406442, 12420155, 1994844 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1914596576579670, 1608999621851578, 1987629837704609, - 1519655314857977, 1819193753409464 -#else - 14012502, 28529712, 48724410, 23975962, 40623521, 29617992, - 54075385, 22644628, 24319928, 27108099 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1949315551096831, 1069003344994464, 1939165033499916, - 1548227205730856, 1933767655861407 -#else - 16412671, 29047065, 10772640, 15929391, 50040076, 28895810, - 10555944, 23070383, 37006495, 28815383 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1730519386931635, 1393284965610134, 1597143735726030, - 416032382447158, 1429665248828629 -#else - 22397363, 25786748, 57815702, 20761563, 17166286, 23799296, - 39775798, 6199365, 21880021, 21303672 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 360275475604565, 547835731063078, 215360904187529, - 596646739879007, 332709650425085 -#else - 62825557, 5368522, 35991846, 8163388, 36785801, 3209127, - 16557151, 8890729, 8840445, 4957760 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 47602113726801, 1522314509708010, 437706261372925, - 814035330438027, 335930650933545 -#else - 51661137, 709326, 60189418, 22684253, 37330941, 6522331, - 45388683, 12130071, 52312361, 5005756 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1291597595523886, 1058020588994081, 402837842324045, - 1363323695882781, 2105763393033193 -#else - 64994094, 19246303, 23019041, 15765735, 41839181, 6002751, - 10183197, 20315106, 50713577, 31378319 -#endif - }}, - }, - }, - { - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 109521982566564, 1715257748585139, 1112231216891516, - 2046641005101484, 134249157157013 -#else - 48083108, 1632004, 13466291, 25559332, 43468412, 16573536, - 35094956, 30497327, 22208661, 2000468 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2156991030936798, 2227544497153325, 1869050094431622, - 754875860479115, 1754242344267058 -#else - 3065054, 32141671, 41510189, 33192999, 49425798, 27851016, - 58944651, 11248526, 63417650, 26140247 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1846089562873800, 98894784984326, 1412430299204844, - 171351226625762, 1100604760929008 -#else - 10379208, 27508878, 8877318, 1473647, 37817580, 21046851, - 16690914, 2553332, 63976176, 16400288 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 84172382130492, 499710970700046, 425749630620778, - 1762872794206857, 612842602127960 -#else - 15716668, 1254266, 48636174, 7446273, 58659946, 6344163, - 45011593, 26268851, 26894936, 9132066 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 868309334532756, 1703010512741873, 1952690008738057, - 4325269926064, 2071083554962116 -#else - 24158868, 12938817, 11085297, 25376834, 39045385, 29097348, - 36532400, 64451, 60291780, 30861549 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 523094549451158, 401938899487815, 1407690589076010, - 2022387426254453, 158660516411257 -#else - 13488534, 7794716, 22236231, 5989356, 25426474, 20976224, - 2350709, 30135921, 62420857, 2364225 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 612867287630009, 448212612103814, 571629077419196, - 1466796750919376, 1728478129663858 -#else - 16335033, 9132434, 25640582, 6678888, 1725628, 8517937, - 55301840, 21856974, 15445874, 25756331 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1723848973783452, 2208822520534681, 1718748322776940, - 1974268454121942, 1194212502258141 -#else - 29004188, 25687351, 28661401, 32914020, 54314860, 25611345, - 31863254, 29418892, 66830813, 17795152 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1254114807944608, 977770684047110, 2010756238954993, - 1783628927194099, 1525962994408256 -#else - 60986784, 18687766, 38493958, 14569918, 56250865, 29962602, - 10343411, 26578142, 37280576, 22738620 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 232464058235826, 1948628555342434, 1835348780427694, - 1031609499437291, 64472106918373 -#else - 27081650, 3463984, 14099042, 29036828, 1616302, 27348828, - 29542635, 15372179, 17293797, 960709 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 767338676040683, 754089548318405, 1523192045639075, - 435746025122062, 512692508440385 -#else - 20263915, 11434237, 61343429, 11236809, 13505955, 22697330, - 50997518, 6493121, 47724353, 7639713 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1255955808701983, 1700487367990941, 1166401238800299, - 1175121994891534, 1190934801395380 -#else - 64278047, 18715199, 25403037, 25339236, 58791851, 17380732, - 18006286, 17510682, 29994676, 17746311 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 349144008168292, 1337012557669162, 1475912332999108, - 1321618454900458, 47611291904320 -#else - 9769828, 5202651, 42951466, 19923039, 39057860, 21992807, - 42495722, 19693649, 35924288, 709463 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 877519947135419, 2172838026132651, 272304391224129, - 1655143327559984, 886229406429814 -#else - 12286395, 13076066, 45333675, 32377809, 42105665, 4057651, - 35090736, 24663557, 16102006, 13205847 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 375806028254706, 214463229793940, 572906353144089, - 572168269875638, 697556386112979 -#else - 13733362, 5599946, 10557076, 3195751, 61550873, 8536969, - 41568694, 8525971, 10151379, 10394400 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1168827102357844, 823864273033637, 2071538752104697, - 788062026895924, 599578340743362 -#else - 4024660, 17416881, 22436261, 12276534, 58009849, 30868332, - 19698228, 11743039, 33806530, 8934413 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1948116082078088, 2054898304487796, 2204939184983900, - 210526805152138, 786593586607626 -#else - 51229064, 29029191, 58528116, 30620370, 14634844, 32856154, - 57659786, 3137093, 55571978, 11721157 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1915320147894736, 156481169009469, 655050471180417, - 592917090415421, 2165897438660879 -#else - 17555920, 28540494, 8268605, 2331751, 44370049, 9761012, - 9319229, 8835153, 57903375, 32274386 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1726336468579724, 1119932070398949, 1929199510967666, - 33918788322959, 1836837863503150 -#else - 66647436, 25724417, 20614117, 16688288, 59594098, 28747312, - 22300303, 505429, 6108462, 27371017 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 829996854845988, 217061778005138, 1686565909803640, - 1346948817219846, 1723823550730181 -#else - 62038564, 12367916, 36445330, 3234472, 32617080, 25131790, - 29880582, 20071101, 40210373, 25686972 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 384301494966394, 687038900403062, 2211195391021739, - 254684538421383, 1245698430589680 -#else - 35133562, 5726538, 26934134, 10237677, 63935147, 32949378, - 24199303, 3795095, 7592688, 18562353 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1247567493562688, 1978182094455847, 183871474792955, - 806570235643435, 288461518067916 -#else - 21594432, 18590204, 17466407, 29477210, 32537083, 2739898, - 6407723, 12018833, 38852812, 4298411 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1449077384734201, 38285445457996, 2136537659177832, - 2146493000841573, 725161151123125 -#else - 46458361, 21592935, 39872588, 570497, 3767144, 31836892, - 13891941, 31985238, 13717173, 10805743 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1201928866368855, 800415690605445, 1703146756828343, - 997278587541744, 1858284414104014 -#else - 52432215, 17910135, 15287173, 11927123, 24177847, 25378864, - 66312432, 14860608, 40169934, 27690595 -#endif - }}, - }, - }, - { - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 356468809648877, 782373916933152, 1718002439402870, - 1392222252219254, 663171266061951 -#else - 12962541, 5311799, 57048096, 11658279, 18855286, 25600231, - 13286262, 20745728, 62727807, 9882021 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 759628738230460, 1012693474275852, 353780233086498, - 246080061387552, 2030378857679162 -#else - 18512060, 11319350, 46985740, 15090308, 18818594, 5271736, - 44380960, 3666878, 43141434, 30255002 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2040672435071076, 888593182036908, 1298443657189359, - 1804780278521327, 354070726137060 -#else - 60319844, 30408388, 16192428, 13241070, 15898607, 19348318, - 57023983, 26893321, 64705764, 5276064 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1894938527423184, 1463213041477277, 474410505497651, - 247294963033299, 877975941029128 -#else - 30169808, 28236784, 26306205, 21803573, 27814963, 7069267, - 7152851, 3684982, 1449224, 13082861 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 207937160991127, 12966911039119, 820997788283092, - 1010440472205286, 1701372890140810 -#else - 10342807, 3098505, 2119311, 193222, 25702612, 12233820, - 23697382, 15056736, 46092426, 25352431 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 218882774543183, 533427444716285, 1233243976733245, - 435054256891319, 1509568989549904 -#else - 33958735, 3261607, 22745853, 7948688, 19370557, 18376767, - 40936887, 6482813, 56808784, 22494330 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1888838535711826, 1052177758340622, 1213553803324135, - 169182009127332, 463374268115872 -#else - 32869458, 28145887, 25609742, 15678670, 56421095, 18083360, - 26112420, 2521008, 44444576, 6904814 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 299137589460312, 1594371588983567, 868058494039073, - 257771590636681, 1805012993142921 -#else - 29506904, 4457497, 3377935, 23757988, 36598817, 12935079, - 1561737, 3841096, 38105225, 26896789 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1806842755664364, 2098896946025095, 1356630998422878, - 1458279806348064, 347755825962072 -#else - 10340844, 26924055, 48452231, 31276001, 12621150, 20215377, - 30878496, 21730062, 41524312, 5181965 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1402334161391744, 1560083671046299, 1008585416617747, - 1147797150908892, 1420416683642459 -#else - 25940096, 20896407, 17324187, 23247058, 58437395, 15029093, - 24396252, 17103510, 64786011, 21165857 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 665506704253369, 273770475169863, 799236974202630, - 848328990077558, 1811448782807931 -#else - 45343161, 9916822, 65808455, 4079497, 66080518, 11909558, - 1782390, 12641087, 20603771, 26992690 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1468412523962641, 771866649897997, 1931766110147832, - 799561180078482, 524837559150077 -#else - 48226577, 21881051, 24849421, 11501709, 13161720, 28785558, - 1925522, 11914390, 4662781, 7820689 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2223212657821850, 630416247363666, 2144451165500328, - 816911130947791, 1024351058410032 -#else - 12241050, 33128450, 8132690, 9393934, 32846760, 31954812, - 29749455, 12172924, 16136752, 15264020 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1266603897524861, 156378408858100, 1275649024228779, - 447738405888420, 253186462063095 -#else - 56758909, 18873868, 58896884, 2330219, 49446315, 19008651, - 10658212, 6671822, 19012087, 3772772 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2022215964509735, 136144366993649, 1800716593296582, - 1193970603800203, 871675847064218 -#else - 3753511, 30133366, 10617073, 2028709, 14841030, 26832768, - 28718731, 17791548, 20527770, 12988982 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1862751661970328, 851596246739884, 1519315554814041, - 1542798466547449, 1417975335901520 -#else - 52286360, 27757162, 63400876, 12689772, 66209881, 22639565, - 42925817, 22989488, 3299664, 21129479 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1228168094547481, 334133883362894, 587567568420081, - 433612590281181, 603390400373205 -#else - 50331161, 18301130, 57466446, 4978982, 3308785, 8755439, - 6943197, 6461331, 41525717, 8991217 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 121893973206505, 1843345804916664, 1703118377384911, - 497810164760654, 101150811654673 -#else - 49882601, 1816361, 65435576, 27467992, 31783887, 25378441, - 34160718, 7417949, 36866577, 1507264 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 458346255946468, 290909935619344, 1452768413850679, - 550922875254215, 1537286854336538 -#else - 29692644, 6829891, 56610064, 4334895, 20945975, 21647936, - 38221255, 8209390, 14606362, 22907359 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 584322311184395, 380661238802118, 114839394528060, - 655082270500073, 2111856026034852 -#else - 63627275, 8707080, 32188102, 5672294, 22096700, 1711240, - 34088169, 9761486, 4170404, 31469107 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 996965581008991, 2148998626477022, 1012273164934654, - 1073876063914522, 1688031788934939 -#else - 55521375, 14855944, 62981086, 32022574, 40459774, 15084045, - 22186522, 16002000, 52832027, 25153633 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 923487018849600, 2085106799623355, 528082801620136, - 1606206360876188, 735907091712524 -#else - 62297408, 13761028, 35404987, 31070512, 63796392, 7869046, - 59995292, 23934339, 13240844, 10965870 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1697697887804317, 1335343703828273, 831288615207040, - 949416685250051, 288760277392022 -#else - 59366301, 25297669, 52340529, 19898171, 43876480, 12387165, - 4498947, 14147411, 29514390, 4302863 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1419122478109648, 1325574567803701, 602393874111094, - 2107893372601700, 1314159682671307 -#else - 53695440, 21146572, 20757301, 19752600, 14785142, 8976368, - 62047588, 31410058, 17846987, 19582505 -#endif - }}, - }, - }, - { - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2201150872731804, 2180241023425241, 97663456423163, - 1633405770247824, 848945042443986 -#else - 64864412, 32799703, 62511833, 32488122, 60861691, 1455298, - 45461136, 24339642, 61886162, 12650266 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1173339555550611, 818605084277583, 47521504364289, - 924108720564965, 735423405754506 -#else - 57202067, 17484121, 21134159, 12198166, 40044289, 708125, - 387813, 13770293, 47974538, 10958662 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 830104860549448, 1886653193241086, 1600929509383773, - 1475051275443631, 286679780900937 -#else - 22470984, 12369526, 23446014, 28113323, 45588061, 23855708, - 55336367, 21979976, 42025033, 4271861 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1577111294832995, 1030899169768747, 144900916293530, - 1964672592979567, 568390100955250 -#else - 41939299, 23500789, 47199531, 15361594, 61124506, 2159191, - 75375, 29275903, 34582642, 8469672 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 278388655910247, 487143369099838, 927762205508727, - 181017540174210, 1616886700741287 -#else - 15854951, 4148314, 58214974, 7259001, 11666551, 13824734, - 36577666, 2697371, 24154791, 24093489 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1191033906638969, 940823957346562, 1606870843663445, - 861684761499847, 658674867251089 -#else - 15446137, 17747788, 29759746, 14019369, 30811221, 23944241, - 35526855, 12840103, 24913809, 9815020 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1875032594195546, 1427106132796197, 724736390962158, - 901860512044740, 635268497268760 -#else - 62399578, 27940162, 35267365, 21265538, 52665326, 10799413, - 58005188, 13438768, 18735128, 9466238 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 622869792298357, 1903919278950367, 1922588621661629, - 1520574711600434, 1087100760174640 -#else - 11933045, 9281483, 5081055, 28370608, 64480701, 28648802, - 59381042, 22658328, 44380208, 16199063 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 25465949416618, 1693639527318811, 1526153382657203, - 125943137857169, 145276964043999 -#else - 14576810, 379472, 40322331, 25237195, 37682355, 22741457, - 67006097, 1876698, 30801119, 2164795 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 214739857969358, 920212862967915, 1939901550972269, - 1211862791775221, 85097515720120 -#else - 15995086, 3199873, 13672555, 13712240, 47730029, 28906785, - 54027253, 18058162, 53616056, 1268051 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2006245852772938, 734762734836159, 254642929763427, - 1406213292755966, 239303749517686 -#else - 56818250, 29895392, 63822271, 10948817, 23037027, 3794475, - 63638526, 20954210, 50053494, 3565903 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1619678837192149, 1919424032779215, 1357391272956794, - 1525634040073113, 1310226789796241 -#else - 29210069, 24135095, 61189071, 28601646, 10834810, 20226706, - 50596761, 22733718, 39946641, 19523900 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1040763709762123, 1704449869235352, 605263070456329, - 1998838089036355, 1312142911487502 -#else - 53946955, 15508587, 16663704, 25398282, 38758921, 9019122, - 37925443, 29785008, 2244110, 19552453 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1996723311435669, 1844342766567060, 985455700466044, - 1165924681400960, 311508689870129 -#else - 61955989, 29753495, 57802388, 27482848, 16243068, 14684434, - 41435776, 17373631, 13491505, 4641841 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 43173156290518, 2202883069785309, 1137787467085917, - 1733636061944606, 1394992037553852 -#else - 10813398, 643330, 47920349, 32825515, 30292061, 16954354, - 27548446, 25833190, 14476988, 20787001 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 670078326344559, 555655025059356, 471959386282438, - 2141455487356409, 849015953823125 -#else - 10292079, 9984945, 6481436, 8279905, 59857350, 7032742, - 27282937, 31910173, 39196053, 12651323 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2197214573372804, 794254097241315, 1030190060513737, - 267632515541902, 2040478049202624 -#else - 35923332, 32741048, 22271203, 11835308, 10201545, 15351028, - 17099662, 3988035, 21721536, 30405492 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1812516004670529, 1609256702920783, 1706897079364493, - 258549904773295, 996051247540686 -#else - 10202177, 27008593, 35735631, 23979793, 34958221, 25434748, - 54202543, 3852693, 13216206, 14842320 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1540374301420584, 1764656898914615, 1810104162020396, - 923808779163088, 664390074196579 -#else - 51293224, 22953365, 60569911, 26295436, 60124204, 26972653, - 35608016, 13765823, 39674467, 9900183 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1323460699404750, 1262690757880991, 871777133477900, - 1060078894988977, 1712236889662886 -#else - 14465486, 19721101, 34974879, 18815558, 39665676, 12990491, - 33046193, 15796406, 60056998, 25514317 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1696163952057966, 1391710137550823, 608793846867416, - 1034391509472039, 1780770894075012 -#else - 30924398, 25274812, 6359015, 20738097, 16508376, 9071735, - 41620263, 15413634, 9524356, 26535554 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1367603834210841, 2131988646583224, 890353773628144, - 1908908219165595, 270836895252891 -#else - 12274201, 20378885, 32627640, 31769106, 6736624, 13267305, - 5237659, 28444949, 15663515, 4035784 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 597536315471731, 40375058742586, 1942256403956049, - 1185484645495932, 312666282024145 -#else - 64157555, 8903984, 17349946, 601635, 50676049, 28941875, - 53376124, 17665097, 44850385, 4659090 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1919411405316294, 1234508526402192, 1066863051997083, - 1008444703737597, 1348810787701552 -#else - 50192582, 28601458, 36715152, 18395610, 20774811, 15897498, - 5736189, 15026997, 64930608, 20098846 -#endif - }}, - }, - }, - { - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2102881477513865, 1570274565945361, 1573617900503708, - 18662635732583, 2232324307922098 -#else - 58249865, 31335375, 28571665, 23398914, 66634396, 23448733, - 63307367, 278094, 23440562, 33264224 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1853931367696942, 8107973870707, 350214504129299, - 775206934582587, 1752317649166792 -#else - 10226222, 27625730, 15139955, 120818, 52241171, 5218602, - 32937275, 11551483, 50536904, 26111567 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1417148368003523, 721357181628282, 505725498207811, - 373232277872983, 261634707184480 -#else - 17932739, 21117156, 43069306, 10749059, 11316803, 7535897, - 22503767, 5561594, 63462240, 3898660 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2186733281493267, 2250694917008620, 1014829812957440, - 479998161452389, 83566193876474 -#else - 7749907, 32584865, 50769132, 33537967, 42090752, 15122142, - 65535333, 7152529, 21831162, 1245233 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1268116367301224, 560157088142809, 802626839600444, - 2210189936605713, 1129993785579988 -#else - 26958440, 18896406, 4314585, 8346991, 61431100, 11960071, - 34519569, 32934396, 36706772, 16838219 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 615183387352312, 917611676109240, 878893615973325, - 978940963313282, 938686890583575 -#else - 54942968, 9166946, 33491384, 13673479, 29787085, 13096535, - 6280834, 14587357, 44770839, 13987524 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 522024729211672, 1045059315315808, 1892245413707790, - 1907891107684253, 2059998109500714 -#else - 42758936, 7778774, 21116000, 15572597, 62275598, 28196653, - 62807965, 28429792, 59639082, 30696363 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1799679152208884, 912132775900387, 25967768040979, - 432130448590461, 274568990261996 -#else - 9681908, 26817309, 35157219, 13591837, 60225043, 386949, - 31622781, 6439245, 52527852, 4091396 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 98698809797682, 2144627600856209, 1907959298569602, - 811491302610148, 1262481774981493 -#else - 58682418, 1470726, 38999185, 31957441, 3978626, 28430809, - 47486180, 12092162, 29077877, 18812444 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1791451399743152, 1713538728337276, 118349997257490, - 1882306388849954, 158235232210248 -#else - 5269168, 26694706, 53878652, 25533716, 25932562, 1763552, - 61502754, 28048550, 47091016, 2357888 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1217809823321928, 2173947284933160, 1986927836272325, - 1388114931125539, 12686131160169 -#else - 32264008, 18146780, 61721128, 32394338, 65017541, 29607531, - 23104803, 20684524, 5727337, 189038 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1650875518872272, 1136263858253897, 1732115601395988, - 734312880662190, 1252904681142109 -#else - 14609104, 24599962, 61108297, 16931650, 52531476, 25810533, - 40363694, 10942114, 41219933, 18669734 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 372986456113865, 525430915458171, 2116279931702135, - 501422713587815, 1907002872974925 -#else - 20513481, 5557931, 51504251, 7829530, 26413943, 31535028, - 45729895, 7471780, 13913677, 28416557 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 803147181835288, 868941437997146, 316299302989663, - 943495589630550, 571224287904572 -#else - 41534488, 11967825, 29233242, 12948236, 60354399, 4713226, - 58167894, 14059179, 12878652, 8511905 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 227742695588364, 1776969298667369, 628602552821802, - 457210915378118, 2041906378111140 -#else - 41452044, 3393630, 64153449, 26478905, 64858154, 9366907, - 36885446, 6812973, 5568676, 30426776 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 815000523470260, 913085688728307, 1052060118271173, - 1345536665214223, 541623413135555 -#else - 11630004, 12144454, 2116339, 13606037, 27378885, 15676917, - 49700111, 20050058, 52713667, 8070817 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1580216071604333, 1877997504342444, 857147161260913, - 703522726778478, 2182763974211603 -#else - 27117677, 23547054, 35826092, 27984343, 1127281, 12772488, - 37262958, 10483305, 55556115, 32525717 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1870080310923419, 71988220958492, 1783225432016732, - 615915287105016, 1035570475990230 -#else - 10637467, 27866368, 5674780, 1072708, 40765276, 26572129, - 65424888, 9177852, 39615702, 15431202 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 730987750830150, 857613889540280, 1083813157271766, - 1002817255970169, 1719228484436074 -#else - 20525126, 10892566, 54366392, 12779442, 37615830, 16150074, - 38868345, 14943141, 52052074, 25618500 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 377616581647602, 1581980403078513, 804044118130621, - 2034382823044191, 643844048472185 -#else - 37084402, 5626925, 66557297, 23573344, 753597, 11981191, - 25244767, 30314666, 63752313, 9594023 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 176957326463017, 1573744060478586, 528642225008045, - 1816109618372371, 1515140189765006 -#else - 43356201, 2636869, 61944954, 23450613, 585133, 7877383, - 11345683, 27062142, 13352334, 22577348 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1888911448245718, 1387110895611080, 1924503794066429, - 1731539523700949, 2230378382645454 -#else - 65177046, 28146973, 3304648, 20669563, 17015805, 28677341, - 37325013, 25801949, 53893326, 33235227 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 443392177002051, 233793396845137, 2199506622312416, - 1011858706515937, 974676837063129 -#else - 20239939, 6607058, 6203985, 3483793, 48721888, 32775202, - 46385121, 15077869, 44358105, 14523816 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1846351103143623, 1949984838808427, 671247021915253, - 1946756846184401, 1929296930380217 -#else - 27406023, 27512775, 27423595, 29057038, 4996213, 10002360, - 38266833, 29008937, 36936121, 28748764 -#endif - }}, - }, - }, - { - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 849646212452002, 1410198775302919, 73767886183695, - 1641663456615812, 762256272452411 -#else - 11374242, 12660715, 17861383, 21013599, 10935567, 1099227, - 53222788, 24462691, 39381819, 11358503 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 692017667358279, 723305578826727, 1638042139863265, - 748219305990306, 334589200523901 -#else - 54378055, 10311866, 1510375, 10778093, 64989409, 24408729, - 32676002, 11149336, 40985213, 4985767 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 22893968530686, 2235758574399251, 1661465835630252, - 925707319443452, 1203475116966621 -#else - 48012542, 341146, 60911379, 33315398, 15756972, 24757770, - 66125820, 13794113, 47694557, 17933176 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 801299035785166, 1733292596726131, 1664508947088596, - 467749120991922, 1647498584535623 -#else - 6490062, 11940286, 25495923, 25828072, 8668372, 24803116, - 3367602, 6970005, 65417799, 24549641 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 903105258014366, 427141894933047, 561187017169777, - 1884330244401954, 1914145708422219 -#else - 1656478, 13457317, 15370807, 6364910, 13605745, 8362338, - 47934242, 28078708, 50312267, 28522993 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1344191060517578, 1960935031767890, 1518838929955259, - 1781502350597190, 1564784025565682 -#else - 44835530, 20030007, 67044178, 29220208, 48503227, 22632463, - 46537798, 26546453, 67009010, 23317098 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 673723351748086, 1979969272514923, 1175287312495508, - 1187589090978666, 1881897672213940 -#else - 17747446, 10039260, 19368299, 29503841, 46478228, 17513145, - 31992682, 17696456, 37848500, 28042460 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1917185587363432, 1098342571752737, 5935801044414, - 2000527662351839, 1538640296181569 -#else - 31932008, 28568291, 47496481, 16366579, 22023614, 88450, - 11371999, 29810185, 4882241, 22927527 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2495540013192, 678856913479236, 224998292422872, - 219635787698590, 1972465269000940 -#else - 29796488, 37186, 19818052, 10115756, 55279832, 3352735, - 18551198, 3272828, 61917932, 29392022 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 271413961212179, 1353052061471651, 344711291283483, - 2014925838520662, 2006221033113941 -#else - 12501267, 4044383, 58495907, 20162046, 34678811, 5136598, - 47878486, 30024734, 330069, 29895023 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 194583029968109, 514316781467765, 829677956235672, - 1676415686873082, 810104584395840 -#else - 6384877, 2899513, 17807477, 7663917, 64749976, 12363164, - 25366522, 24980540, 66837568, 12071498 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1980510813313589, 1948645276483975, 152063780665900, - 129968026417582, 256984195613935 -#else - 58743349, 29511910, 25133447, 29037077, 60897836, 2265926, - 34339246, 1936674, 61949167, 3829362 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1860190562533102, 1936576191345085, 461100292705964, - 1811043097042830, 957486749306835 -#else - 28425966, 27718999, 66531773, 28857233, 52891308, 6870929, - 7921550, 26986645, 26333139, 14267664 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 796664815624365, 1543160838872951, 1500897791837765, - 1667315977988401, 599303877030711 -#else - 56041645, 11871230, 27385719, 22994888, 62522949, 22365119, - 10004785, 24844944, 45347639, 8930323 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1151480509533204, 2136010406720455, 738796060240027, - 319298003765044, 1150614464349587 -#else - 45911060, 17158396, 25654215, 31829035, 12282011, 11008919, - 1541940, 4757911, 40617363, 17145491 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1731069268103150, 735642447616087, 1364750481334268, - 417232839982871, 927108269127661 -#else - 13537262, 25794942, 46504023, 10961926, 61186044, 20336366, - 53952279, 6217253, 51165165, 13814989 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1017222050227968, 1987716148359, 2234319589635701, - 621282683093392, 2132553131763026 -#else - 49686272, 15157789, 18705543, 29619, 24409717, 33293956, - 27361680, 9257833, 65152338, 31777517 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1567828528453324, 1017807205202360, 565295260895298, - 829541698429100, 307243822276582 -#else - 42063564, 23362465, 15366584, 15166509, 54003778, 8423555, - 37937324, 12361134, 48422886, 4578289 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 249079270936248, 1501514259790706, 947909724204848, - 944551802437487, 552658763982480 -#else - 24579768, 3711570, 1342322, 22374306, 40103728, 14124955, - 44564335, 14074918, 21964432, 8235257 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2089966982947227, 1854140343916181, 2151980759220007, - 2139781292261749, 158070445864917 -#else - 60580251, 31142934, 9442965, 27628844, 12025639, 32067012, - 64127349, 31885225, 13006805, 2355433 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1338766321464554, 1906702607371284, 1519569445519894, - 115384726262267, 1393058953390992 -#else - 50803946, 19949172, 60476436, 28412082, 16974358, 22643349, - 27202043, 1719366, 1141648, 20758196 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1364621558265400, 1512388234908357, 1926731583198686, - 2041482526432505, 920401122333774 -#else - 54244920, 20334445, 58790597, 22536340, 60298718, 28710537, - 13475065, 30420460, 32674894, 13715045 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1884844597333588, 601480070269079, 620203503079537, - 1079527400117915, 1202076693132015 -#else - 11423316, 28086373, 32344215, 8962751, 24989809, 9241752, - 53843611, 16086211, 38367983, 17912338 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 840922919763324, 727955812569642, 1303406629750194, - 522898432152867, 294161410441865 -#else - 65699196, 12530727, 60740138, 10847386, 19531186, 19422272, - 55399715, 7791793, 39862921, 4383346 -#endif - }}, - }, - }, - { - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 353760790835310, 1598361541848743, 1122905698202299, - 1922533590158905, 419107700666580 -#else - 38137966, 5271446, 65842855, 23817442, 54653627, 16732598, - 62246457, 28647982, 27193556, 6245191 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 359856369838236, 180914355488683, 861726472646627, - 218807937262986, 575626773232501 -#else - 51914908, 5362277, 65324971, 2695833, 4960227, 12840725, - 23061898, 3260492, 22510453, 8577507 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 755467689082474, 909202735047934, 730078068932500, - 936309075711518, 2007798262842972 -#else - 54476394, 11257345, 34415870, 13548176, 66387860, 10879010, - 31168030, 13952092, 37537372, 29918525 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1609384177904073, 362745185608627, 1335318541768201, - 800965770436248, 547877979267412 -#else - 3877321, 23981693, 32416691, 5405324, 56104457, 19897796, - 3759768, 11935320, 5611860, 8164018 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 984339177776787, 815727786505884, 1645154585713747, - 1659074964378553, 1686601651984156 -#else - 50833043, 14667796, 15906460, 12155291, 44997715, 24514713, - 32003001, 24722143, 5773084, 25132323 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1697863093781930, 599794399429786, 1104556219769607, - 830560774794755, 12812858601017 -#else - 43320746, 25300131, 1950874, 8937633, 18686727, 16459170, - 66203139, 12376319, 31632953, 190926 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1168737550514982, 897832437380552, 463140296333799, - 302564600022547, 2008360505135501 -#else - 42515238, 17415546, 58684872, 13378745, 14162407, 6901328, - 58820115, 4508563, 41767309, 29926903 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1856930662813910, 678090852002597, 1920179140755167, - 1259527833759868, 55540971895511 -#else - 8884438, 27670423, 6023973, 10104341, 60227295, 28612898, - 18722940, 18768427, 65436375, 827624 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1158643631044921, 476554103621892, 178447851439725, - 1305025542653569, 103433927680625 -#else - 34388281, 17265135, 34605316, 7101209, 13354605, 2659080, - 65308289, 19446395, 42230385, 1541285 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2176793111709008, 1576725716350391, 2009350167273523, - 2012390194631546, 2125297410909580 -#else - 2901328, 32436745, 3880375, 23495044, 49487923, 29941650, - 45306746, 29986950, 20456844, 31669399 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 825403285195098, 2144208587560784, 1925552004644643, - 1915177840006985, 1015952128947864 -#else - 27019610, 12299467, 53450576, 31951197, 54247203, 28692960, - 47568713, 28538373, 29439640, 15138866 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1807108316634472, 1534392066433717, 347342975407218, - 1153820745616376, 7375003497471 -#else - 21536104, 26928012, 34661045, 22864223, 44700786, 5175813, - 61688824, 17193268, 7779327, 109896 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 983061001799725, 431211889901241, 2201903782961093, - 817393911064341, 2214616493042167 -#else - 30279725, 14648750, 59063993, 6425557, 13639621, 32810923, - 28698389, 12180118, 23177719, 33000357 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 228567918409756, 865093958780220, 358083886450556, - 159617889659320, 1360637926292598 -#else - 26572828, 3405927, 35407164, 12890904, 47843196, 5335865, - 60615096, 2378491, 4439158, 20275085 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 234147501399755, 2229469128637390, 2175289352258889, - 1397401514549353, 1885288963089922 -#else - 44392139, 3489069, 57883598, 33221678, 18875721, 32414337, - 14819433, 20822905, 49391106, 28092994 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1111762412951562, 252849572507389, 1048714233823341, - 146111095601446, 1237505378776770 -#else - 62052362, 16566550, 15953661, 3767752, 56672365, 15627059, - 66287910, 2177224, 8550082, 18440267 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1113790697840279, 1051167139966244, 1045930658550944, - 2011366241542643, 1686166824620755 -#else - 48635543, 16596774, 66727204, 15663610, 22860960, 15585581, - 39264755, 29971692, 43848403, 25125843 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1054097349305049, 1872495070333352, 182121071220717, - 1064378906787311, 100273572924182 -#else - 34628313, 15707274, 58902952, 27902350, 29464557, 2713815, - 44383727, 15860481, 45206294, 1494192 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1306410853171605, 1627717417672447, 50983221088417, - 1109249951172250, 870201789081392 -#else - 47546773, 19467038, 41524991, 24254879, 13127841, 759709, - 21923482, 16529112, 8742704, 12967017 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 104233794644221, 1548919791188248, 2224541913267306, - 2054909377116478, 1043803389015153 -#else - 38643965, 1553204, 32536856, 23080703, 42417258, 33148257, - 58194238, 30620535, 37205105, 15553882 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 216762189468802, 707284285441622, 190678557969733, - 973969342604308, 1403009538434867 -#else - 21877890, 3230008, 9881174, 10539357, 62311749, 2841331, - 11543572, 14513274, 19375923, 20906471 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1279024291038477, 344776835218310, 273722096017199, - 1834200436811442, 634517197663804 -#else - 8832269, 19058947, 13253510, 5137575, 5037871, 4078777, - 24880818, 27331716, 2862652, 9455043 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 343805853118335, 1302216857414201, 566872543223541, - 2051138939539004, 321428858384280 -#else - 29306751, 5123106, 20245049, 19404543, 9592565, 8447059, - 65031740, 30564351, 15511448, 4789663 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 470067171324852, 1618629234173951, 2000092177515639, - 7307679772789, 1117521120249968 -#else - 46429108, 7004546, 8824831, 24119455, 63063159, 29803695, - 61354101, 108892, 23513200, 16652362 -#endif - }}, - }, - }, - { - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 278151578291475, 1810282338562947, 1771599529530998, - 1383659409671631, 685373414471841 -#else - 33852691, 4144781, 62632835, 26975308, 10770038, 26398890, - 60458447, 20618131, 48789665, 10212859 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 577009397403102, 1791440261786291, 2177643735971638, - 174546149911960, 1412505077782326 -#else - 2756062, 8598110, 7383731, 26694540, 22312758, 32449420, - 21179800, 2600940, 57120566, 21047965 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 893719721537457, 1201282458018197, 1522349501711173, - 58011597740583, 1130406465887139 -#else - 42463153, 13317461, 36659605, 17900503, 21365573, 22684775, - 11344423, 864440, 64609187, 16844368 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 412607348255453, 1280455764199780, 2233277987330768, - 14180080401665, 331584698417165 -#else - 40676061, 6148328, 49924452, 19080277, 18782928, 33278435, - 44547329, 211299, 2719757, 4940997 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 262483770854550, 990511055108216, 526885552771698, - 571664396646158, 354086190278723 -#else - 65784982, 3911312, 60160120, 14759764, 37081714, 7851206, - 21690126, 8518463, 26699843, 5276295 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1820352417585487, 24495617171480, 1547899057533253, - 10041836186225, 480457105094042 -#else - 53958991, 27125364, 9396248, 365013, 24703301, 23065493, - 1321585, 149635, 51656090, 7159368 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2023310314989233, 637905337525881, 2106474638900687, - 557820711084072, 1687858215057826 -#else - 9987761, 30149673, 17507961, 9505530, 9731535, 31388918, - 22356008, 8312176, 22477218, 25151047 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1144168702609745, 604444390410187, 1544541121756138, - 1925315550126027, 626401428894002 -#else - 18155857, 17049442, 19744715, 9006923, 15154154, 23015456, - 24256459, 28689437, 44560690, 9334108 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1922168257351784, 2018674099908659, 1776454117494445, - 956539191509034, 36031129147635 -#else - 2986088, 28642539, 10776627, 30080588, 10620589, 26471229, - 45695018, 14253544, 44521715, 536905 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 544644538748041, 1039872944430374, 876750409130610, - 710657711326551, 1216952687484972 -#else - 4377737, 8115836, 24567078, 15495314, 11625074, 13064599, - 7390551, 10589625, 10838060, 18134008 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 58242421545916, 2035812695641843, 2118491866122923, - 1191684463816273, 46921517454099 -#else - 47766460, 867879, 9277171, 30335973, 52677291, 31567988, - 19295825, 17757482, 6378259, 699185 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 272268252444639, 1374166457774292, 2230115177009552, - 1053149803909880, 1354288411641016 -#else - 7895007, 4057113, 60027092, 20476675, 49222032, 33231305, - 66392824, 15693154, 62063800, 20180469 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1857910905368338, 1754729879288912, 885945464109877, - 1516096106802166, 1602902393369811 -#else - 59371282, 27685029, 52542544, 26147512, 11385653, 13201616, - 31730678, 22591592, 63190227, 23885106 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1193437069800958, 901107149704790, 999672920611411, - 477584824802207, 364239578697845 -#else - 10188286, 17783598, 59772502, 13427542, 22223443, 14896287, - 30743455, 7116568, 45322357, 5427592 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 886299989548838, 1538292895758047, 1590564179491896, - 1944527126709657, 837344427345298 -#else - 696102, 13206899, 27047647, 22922350, 15285304, 23701253, - 10798489, 28975712, 19236242, 12477404 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 754558365378305, 1712186480903618, 1703656826337531, - 750310918489786, 518996040250900 -#else - 55879425, 11243795, 50054594, 25513566, 66320635, 25386464, - 63211194, 11180503, 43939348, 7733643 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1309847803895382, 1462151862813074, 211370866671570, - 1544595152703681, 1027691798954090 -#else - 17800790, 19518253, 40108434, 21787760, 23887826, 3149671, - 23466177, 23016261, 10322026, 15313801 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 803217563745370, 1884799722343599, 1357706345069218, - 2244955901722095, 730869460037413 -#else - 26246234, 11968874, 32263343, 28085704, 6830754, 20231401, - 51314159, 33452449, 42659621, 10890803 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 689299471295966, 1831210565161071, 1375187341585438, - 1106284977546171, 1893781834054269 -#else - 35743198, 10271362, 54448239, 27287163, 16690206, 20491888, - 52126651, 16484930, 25180797, 28219548 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 696351368613042, 1494385251239250, 738037133616932, - 636385507851544, 927483222611406 -#else - 66522290, 10376443, 34522450, 22268075, 19801892, 10997610, - 2276632, 9482883, 316878, 13820577 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1949114198209333, 1104419699537997, 783495707664463, - 1747473107602770, 2002634765788641 -#else - 57226037, 29044064, 64993357, 16457135, 56008783, 11674995, - 30756178, 26039378, 30696929, 29841583 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1607325776830197, 530883941415333, 1451089452727895, - 1581691157083423, 496100432831154 -#else - 32988917, 23951020, 12499365, 7910787, 56491607, 21622917, - 59766047, 23569034, 34759346, 7392472 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1068900648804224, 2006891997072550, 1134049269345549, - 1638760646180091, 2055396084625778 -#else - 58253184, 15927860, 9866406, 29905021, 64711949, 16898650, - 36699387, 24419436, 25112946, 30627788 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2222475519314561, 1870703901472013, 1884051508440561, - 1344072275216753, 1318025677799069 -#else - 64604801, 33117465, 25621773, 27875660, 15085041, 28074555, - 42223985, 20028237, 5537437, 19640113 -#endif - }}, - }, - }, - { - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 155711679280656, 681100400509288, 389811735211209, - 2135723811340709, 408733211204125 -#else - 55883280, 2320284, 57524584, 10149186, 33664201, 5808647, - 52232613, 31824764, 31234589, 6090599 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 7813206966729, 194444201427550, 2071405409526507, - 1065605076176312, 1645486789731291 -#else - 57475529, 116425, 26083934, 2897444, 60744427, 30866345, 609720, - 15878753, 60138459, 24519663 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 16625790644959, 1647648827778410, 1579910185572704, - 436452271048548, 121070048451050 -#else - 39351007, 247743, 51914090, 24551880, 23288160, 23542496, - 43239268, 6503645, 20650474, 1804084 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1037263028552531, 568385780377829, 297953104144430, - 1558584511931211, 2238221839292471 -#else - 39519059, 15456423, 8972517, 8469608, 15640622, 4439847, - 3121995, 23224719, 27842615, 33352104 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 190565267697443, 672855706028058, 338796554369226, - 337687268493904, 853246848691734 -#else - 51801891, 2839643, 22530074, 10026331, 4602058, 5048462, - 28248656, 5031932, 55733782, 12714368 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1763863028400139, 766498079432444, 1321118624818005, - 69494294452268, 858786744165651 -#else - 20807691, 26283607, 29286140, 11421711, 39232341, 19686201, - 45881388, 1035545, 47375635, 12796919 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1292056768563024, 1456632109855638, 1100631247050184, - 1386133165675321, 1232898350193752 -#else - 12076880, 19253146, 58323862, 21705509, 42096072, 16400683, - 49517369, 20654993, 3480664, 18371617 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 366253102478259, 525676242508811, 1449610995265438, - 1183300845322183, 185960306491545 -#else - 34747315, 5457596, 28548107, 7833186, 7303070, 21600887, - 42745799, 17632556, 33734809, 2771024 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 28315355815982, 460422265558930, 1799675876678724, - 1969256312504498, 1051823843138725 -#else - 45719598, 421931, 26597266, 6860826, 22486084, 26817260, - 49971378, 29344205, 42556581, 15673396 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 156914999361983, 1606148405719949, 1665208410108430, - 317643278692271, 1383783705665320 -#else - 46924223, 2338215, 19788685, 23933476, 63107598, 24813538, - 46837679, 4733253, 3727144, 20619984 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 54684536365732, 2210010038536222, 1194984798155308, - 535239027773705, 1516355079301361 -#else - 6120100, 814863, 55314462, 32931715, 6812204, 17806661, 2019593, - 7975683, 31123697, 22595451 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1484387703771650, 198537510937949, 2186282186359116, - 617687444857508, 647477376402122 -#else - 30069250, 22119100, 30434653, 2958439, 18399564, 32578143, - 12296868, 9204260, 50676426, 9648164 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2147715541830533, 500032538445817, 646380016884826, - 352227855331122, 1488268620408052 -#else - 32705413, 32003455, 30705657, 7451065, 55303258, 9631812, - 3305266, 5248604, 41100532, 22176930 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 159386186465542, 1877626593362941, 618737197060512, - 1026674284330807, 1158121760792685 -#else - 17219846, 2375039, 35537917, 27978816, 47649184, 9219902, - 294711, 15298639, 2662509, 17257359 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1744544377739822, 1964054180355661, 1685781755873170, - 2169740670377448, 1286112621104591 -#else - 65935918, 25995736, 62742093, 29266687, 45762450, 25120105, - 32087528, 32331655, 32247247, 19164571 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 81977249784993, 1667943117713086, 1668983819634866, - 1605016835177615, 1353960708075544 -#else - 14312609, 1221556, 17395390, 24854289, 62163122, 24869796, - 38911119, 23916614, 51081240, 20175586 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1602253788689063, 439542044889886, 2220348297664483, - 657877410752869, 157451572512238 -#else - 65680039, 23875441, 57873182, 6549686, 59725795, 33085767, - 23046501, 9803137, 17597934, 2346211 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1029287186166717, 65860128430192, 525298368814832, - 1491902500801986, 1461064796385400 -#else - 18510781, 15337574, 26171504, 981392, 44867312, 7827555, - 43617730, 22231079, 3059832, 21771562 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 408216988729246, 2121095722306989, 913562102267595, - 1879708920318308, 241061448436731 -#else - 10141598, 6082907, 17829293, 31606789, 9830091, 13613136, - 41552228, 28009845, 33606651, 3592095 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1185483484383269, 1356339572588553, 584932367316448, - 102132779946470, 1792922621116791 -#else - 33114149, 17665080, 40583177, 20211034, 33076704, 8716171, - 1151462, 1521897, 66126199, 26716628 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1966196870701923, 2230044620318636, 1425982460745905, - 261167817826569, 46517743394330 -#else - 34169699, 29298616, 23947180, 33230254, 34035889, 21248794, - 50471177, 3891703, 26353178, 693168 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 107077591595359, 884959942172345, 27306869797400, - 2224911448949390, 964352058245223 -#else - 30374239, 1595580, 50224825, 13186930, 4600344, 406904, 9585294, - 33153764, 31375463, 14369965 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1730194207717538, 431790042319772, 1831515233279467, - 1372080552768581, 1074513929381760 -#else - 52738210, 25781902, 1510300, 6434173, 48324075, 27291703, - 32732229, 20445593, 17901440, 16011505 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1450880638731607, 1019861580989005, 1229729455116861, - 1174945729836143, 826083146840706 -#else - 18171223, 21619806, 54608461, 15197121, 56070717, 18324396, - 47936623, 17508055, 8764034, 12309598 -#endif - }}, - }, - }, - { - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1899935429242705, 1602068751520477, 940583196550370, - 82431069053859, 1540863155745696 -#else - 5975889, 28311244, 47649501, 23872684, 55567586, 14015781, - 43443107, 1228318, 17544096, 22960650 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2136688454840028, 2099509000964294, 1690800495246475, - 1217643678575476, 828720645084218 -#else - 5811932, 31839139, 3442886, 31285122, 48741515, 25194890, - 49064820, 18144304, 61543482, 12348899 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 765548025667841, 462473984016099, 998061409979798, - 546353034089527, 2212508972466858 -#else - 35709185, 11407554, 25755363, 6891399, 63851926, 14872273, - 42259511, 8141294, 56476330, 32968952 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 46575283771160, 892570971573071, 1281983193144090, - 1491520128287375, 75847005908304 -#else - 54433560, 694025, 62032719, 13300343, 14015258, 19103038, - 57410191, 22225381, 30944592, 1130208 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1801436127943107, 1734436817907890, 1268728090345068, - 167003097070711, 2233597765834956 -#else - 8247747, 26843490, 40546482, 25845122, 52706924, 18905521, - 4652151, 2488540, 23550156, 33283200 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1997562060465113, 1048700225534011, 7615603985628, - 1855310849546841, 2242557647635213 -#else - 17294297, 29765994, 7026747, 15626851, 22990044, 113481, - 2267737, 27646286, 66700045, 33416712 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1161017320376250, 492624580169043, 2169815802355237, - 976496781732542, 1770879511019629 -#else - 16091066, 17300506, 18599251, 7340678, 2137637, 32332775, - 63744702, 14550935, 3260525, 26388161 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1357044908364776, 729130645262438, 1762469072918979, - 1365633616878458, 181282906404941 -#else - 62198760, 20221544, 18550886, 10864893, 50649539, 26262835, - 44079994, 20349526, 54360141, 2701325 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1080413443139865, 1155205815510486, 1848782073549786, - 622566975152580, 124965574467971 -#else - 58534169, 16099414, 4629974, 17213908, 46322650, 27548999, - 57090500, 9276970, 11329923, 1862132 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1184526762066993, 247622751762817, 692129017206356, - 820018689412496, 2188697339828085 -#else - 14763057, 17650824, 36190593, 3689866, 3511892, 10313526, - 45157776, 12219230, 58070901, 32614131 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2020536369003019, 202261491735136, 1053169669150884, - 2056531979272544, 778165514694311 -#else - 8894987, 30108338, 6150752, 3013931, 301220, 15693451, 35127648, - 30644714, 51670695, 11595569 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 237404399610207, 1308324858405118, 1229680749538400, - 720131409105291, 1958958863624906 -#else - 15214943, 3537601, 40870142, 19495559, 4418656, 18323671, - 13947275, 10730794, 53619402, 29190761 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 515583508038846, 17656978857189, 1717918437373989, - 1568052070792483, 46975803123923 -#else - 64570558, 7682792, 32759013, 263109, 37124133, 25598979, - 44776739, 23365796, 977107, 699994 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 281527309158085, 36970532401524, 866906920877543, - 2222282602952734, 1289598729589882 -#else - 54642373, 4195083, 57897332, 550903, 51543527, 12917919, - 19118110, 33114591, 36574330, 19216518 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1278207464902042, 494742455008756, 1262082121427081, - 1577236621659884, 1888786707293291 -#else - 31788442, 19046775, 4799988, 7372237, 8808585, 18806489, - 9408236, 23502657, 12493931, 28145115 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 353042527954210, 1830056151907359, 1111731275799225, - 174960955838824, 404312815582675 -#else - 41428258, 5260743, 47873055, 27269961, 63412921, 16566086, - 27218280, 2607121, 29375955, 6024730 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2064251142068628, 1666421603389706, 1419271365315441, - 468767774902855, 191535130366583 -#else - 842132, 30759739, 62345482, 24831616, 26332017, 21148791, - 11831879, 6985184, 57168503, 2854095 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1716987058588002, 1859366439773457, 1767194234188234, - 64476199777924, 1117233614485261 -#else - 62261602, 25585100, 2516241, 27706719, 9695690, 26333246, - 16512644, 960770, 12121869, 16648078 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 984292135520292, 135138246951259, 2220652137473167, - 1722843421165029, 190482558012909 -#else - 51890212, 14667095, 53772635, 2013716, 30598287, 33090295, - 35603941, 25672367, 20237805, 2838411 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 298845952651262, 1166086588952562, 1179896526238434, - 1347812759398693, 1412945390096208 -#else - 47820798, 4453151, 15298546, 17376044, 22115042, 17581828, - 12544293, 20083975, 1068880, 21054527 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1143239552672925, 906436640714209, 2177000572812152, - 2075299936108548, 325186347798433 -#else - 57549981, 17035596, 33238497, 13506958, 30505848, 32439836, - 58621956, 30924378, 12521377, 4845654 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 721024854374772, 684487861263316, 1373438744094159, - 2193186935276995, 1387043709851261 -#else - 38910324, 10744107, 64150484, 10199663, 7759311, 20465832, - 3409347, 32681032, 60626557, 20668561 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 418098668140962, 715065997721283, 1471916138376055, - 2168570337288357, 937812682637044 -#else - 43547042, 6230155, 46726851, 10655313, 43068279, 21933259, - 10477733, 32314216, 63995636, 13974497 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1043584187226485, 2143395746619356, 2209558562919611, - 482427979307092, 847556718384018 -#else - 12966261, 15550616, 35069916, 31939085, 21025979, 32924988, - 5642324, 7188737, 18895762, 12629579 -#endif - }}, - }, - }, - { - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1248731221520759, 1465200936117687, 540803492710140, - 52978634680892, 261434490176109 -#else - 14741879, 18607545, 22177207, 21833195, 1279740, 8058600, - 11758140, 789443, 32195181, 3895677 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1057329623869501, 620334067429122, 461700859268034, - 2012481616501857, 297268569108938 -#else - 10758205, 15755439, 62598914, 9243697, 62229442, 6879878, - 64904289, 29988312, 58126794, 4429646 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1055352180870759, 1553151421852298, 1510903185371259, - 1470458349428097, 1226259419062731 -#else - 64654951, 15725972, 46672522, 23143759, 61304955, 22514211, - 59972993, 21911536, 18047435, 18272689 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1492988790301668, 790326625573331, 1190107028409745, - 1389394752159193, 1620408196604194 -#else - 41935844, 22247266, 29759955, 11776784, 44846481, 17733976, - 10993113, 20703595, 49488162, 24145963 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 47000654413729, 1004754424173864, 1868044813557703, - 173236934059409, 588771199737015 -#else - 21987233, 700364, 42603816, 14972007, 59334599, 27836036, - 32155025, 2581431, 37149879, 8773374 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 30498470091663, 1082245510489825, 576771653181956, - 806509986132686, 1317634017056939 -#else - 41540495, 454462, 53896929, 16126714, 25240068, 8594567, - 20656846, 12017935, 59234475, 19634276 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 420308055751555, 1493354863316002, 165206721528088, - 1884845694919786, 2065456951573059 -#else - 6028163, 6263078, 36097058, 22252721, 66289944, 2461771, - 35267690, 28086389, 65387075, 30777706 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1115636332012334, 1854340990964155, 83792697369514, - 1972177451994021, 457455116057587 -#else - 54829870, 16624276, 987579, 27631834, 32908202, 1248608, - 7719845, 29387734, 28408819, 6816612 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1698968457310898, 1435137169051090, 1083661677032510, - 938363267483709, 340103887207182 -#else - 56750770, 25316602, 19549650, 21385210, 22082622, 16147817, - 20613181, 13982702, 56769294, 5067942 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1995325341336574, 911500251774648, 164010755403692, - 855378419194762, 1573601397528842 -#else - 36602878, 29732664, 12074680, 13582412, 47230892, 2443950, - 47389578, 12746131, 5331210, 23448488 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 241719380661528, 310028521317150, 1215881323380194, - 1408214976493624, 2141142156467363 -#else - 30528792, 3601899, 65151774, 4619784, 39747042, 18118043, - 24180792, 20984038, 27679907, 31905504 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1315157046163473, 727368447885818, 1363466668108618, - 1668921439990361, 1398483384337907 -#else - 9402385, 19597367, 32834042, 10838634, 40528714, 20317236, - 26653273, 24868867, 22611443, 20839026 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 75029678299646, 1015388206460473, 1849729037055212, - 1939814616452984, 444404230394954 -#else - 22190590, 1118029, 22736441, 15130463, 36648172, 27563110, - 19189624, 28905490, 4854858, 6622139 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2053597130993710, 2024431685856332, 2233550957004860, - 2012407275509545, 872546993104440 -#else - 58798126, 30600981, 58846284, 30166382, 56707132, 33282502, - 13424425, 29987205, 26404408, 13001963 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1217269667678610, 599909351968693, 1390077048548598, - 1471879360694802, 739586172317596 -#else - 35867026, 18138731, 64114613, 8939345, 11562230, 20713762, - 41044498, 21932711, 51703708, 11020692 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1718318639380794, 1560510726633958, 904462881159922, - 1418028351780052, 94404349451937 -#else - 1866042, 25604943, 59210214, 23253421, 12483314, 13477547, - 3175636, 21130269, 28761761, 1406734 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2132502667405250, 214379346175414, 1502748313768060, - 1960071701057800, 1353971822643138 -#else - 66660290, 31776765, 13018550, 3194501, 57528444, 22392694, - 24760584, 29207344, 25577410, 20175752 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 319394212043702, 2127459436033571, 717646691535162, - 663366796076914, 318459064945314 -#else - 42818486, 4759344, 66418211, 31701615, 2066746, 10693769, - 37513074, 9884935, 57739938, 4745409 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 405989424923593, 1960452633787083, 667349034401665, - 1492674260767112, 1451061489880787 -#else - 57967561, 6049713, 47577803, 29213020, 35848065, 9944275, - 51646856, 22242579, 10931923, 21622501 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 947085906234007, 323284730494107, 1485778563977200, - 728576821512394, 901584347702286 -#else - 50547351, 14112679, 59096219, 4817317, 59068400, 22139825, - 44255434, 10856640, 46638094, 13434653 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1575783124125742, 2126210792434375, 1569430791264065, - 1402582372904727, 1891780248341114 -#else - 22759470, 23480998, 50342599, 31683009, 13637441, 23386341, - 1765143, 20900106, 28445306, 28189722 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 838432205560695, 1997703511451664, 1018791879907867, - 1662001808174331, 78328132957753 -#else - 29875063, 12493613, 2795536, 29768102, 1710619, 15181182, - 56913147, 24765756, 9074233, 1167180 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 739152638255629, 2074935399403557, 505483666745895, - 1611883356514088, 628654635394878 -#else - 40903181, 11014232, 57266213, 30918946, 40200743, 7532293, - 48391976, 24018933, 3843902, 9367684 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1822054032121349, 643057948186973, 7306757352712, - 577249257962099, 284735863382083 -#else - 56139269, 27150720, 9591133, 9582310, 11349256, 108879, - 16235123, 8601684, 66969667, 4242894 -#endif - }}, - }, - }, - { - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1366558556363930, 1448606567552086, 1478881020944768, - 165803179355898, 1115718458123498 -#else - 22092954, 20363309, 65066070, 21585919, 32186752, 22037044, - 60534522, 2470659, 39691498, 16625500 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 204146226972102, 1630511199034723, 2215235214174763, - 174665910283542, 956127674017216 -#else - 56051142, 3042015, 13770083, 24296510, 584235, 33009577, - 59338006, 2602724, 39757248, 14247412 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1562934578796716, 1070893489712745, 11324610642270, - 958989751581897, 2172552325473805 -#else - 6314156, 23289540, 34336361, 15957556, 56951134, 168749, - 58490057, 14290060, 27108877, 32373552 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1770564423056027, 735523631664565, 1326060113795289, - 1509650369341127, 65892421582684 -#else - 58522267, 26383465, 13241781, 10960156, 34117849, 19759835, - 33547975, 22495543, 39960412, 981873 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 623682558650637, 1337866509471512, 990313350206649, - 1314236615762469, 1164772974270275 -#else - 22833421, 9293594, 34459416, 19935764, 57971897, 14756818, - 44180005, 19583651, 56629059, 17356469 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 223256821462517, 723690150104139, 1000261663630601, - 933280913953265, 254872671543046 -#else - 59340277, 3326785, 38997067, 10783823, 19178761, 14905060, - 22680049, 13906969, 51175174, 3797898 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1969087237026041, 624795725447124, 1335555107635969, - 2069986355593023, 1712100149341902 -#else - 21721337, 29341686, 54902740, 9310181, 63226625, 19901321, - 23740223, 30845200, 20491982, 25512280 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1236103475266979, 1837885883267218, 1026072585230455, - 1025865513954973, 1801964901432134 -#else - 9209251, 18419377, 53852306, 27386633, 66377847, 15289672, - 25947805, 15286587, 30997318, 26851369 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1115241013365517, 1712251818829143, 2148864332502771, - 2096001471438138, 2235017246626125 -#else - 7392013, 16618386, 23946583, 25514540, 53843699, 32020573, - 52911418, 31232855, 17649997, 33304352 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1299268198601632, 2047148477845621, 2165648650132450, - 1612539282026145, 514197911628890 -#else - 57807776, 19360604, 30609525, 30504889, 41933794, 32270679, - 51867297, 24028707, 64875610, 7662145 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 118352772338543, 1067608711804704, 1434796676193498, - 1683240170548391, 230866769907437 -#else - 49550191, 1763593, 33994528, 15908609, 37067994, 21380136, - 7335079, 25082233, 63934189, 3440182 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1850689576796636, 1601590730430274, 1139674615958142, - 1954384401440257, 76039205311 -#else - 47219164, 27577423, 42997570, 23865561, 10799742, 16982475, - 40449, 29122597, 4862399, 1133 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1723387471374172, 997301467038410, 533927635123657, - 20928644693965, 1756575222802513 -#else - 34252636, 25680474, 61686474, 14860949, 50789833, 7956141, - 7258061, 311861, 36513873, 26175010 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2146711623855116, 503278928021499, 625853062251406, - 1109121378393107, 1033853809911861 -#else - 63335436, 31988495, 28985339, 7499440, 24445838, 9325937, - 29727763, 16527196, 18278453, 15405622 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 571005965509422, 2005213373292546, 1016697270349626, - 56607856974274, 914438579435146 -#else - 62726958, 8508651, 47210498, 29880007, 61124410, 15149969, - 53795266, 843522, 45233802, 13626196 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1346698876211176, 2076651707527589, 1084761571110205, - 265334478828406, 1068954492309671 -#else - 2281448, 20067377, 56193445, 30944521, 1879357, 16164207, - 56324982, 3953791, 13340839, 15928663 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1769967932677654, 1695893319756416, 1151863389675920, - 1781042784397689, 400287774418285 -#else - 31727126, 26374577, 48671360, 25270779, 2875792, 17164102, - 41838969, 26539605, 43656557, 5964752 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1851867764003121, 403841933237558, 820549523771987, - 761292590207581, 1743735048551143 -#else - 4100401, 27594980, 49929526, 6017713, 48403027, 12227140, - 40424029, 11344143, 2538215, 25983677 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 410915148140008, 2107072311871739, 1004367461876503, - 99684895396761, 1180818713503224 -#else - 57675240, 6123112, 11159803, 31397824, 30016279, 14966241, - 46633881, 1485420, 66479608, 17595569 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 285945406881439, 648174397347453, 1098403762631981, - 1366547441102991, 1505876883139217 -#else - 40304287, 4260918, 11851389, 9658551, 35091757, 16367491, - 46903439, 20363143, 11659921, 22439314 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 672095903120153, 1675918957959872, 636236529315028, - 1569297300327696, 2164144194785875 -#else - 26180377, 10015009, 36264640, 24973138, 5418196, 9480663, - 2231568, 23384352, 33100371, 32248261 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1902708175321798, 1035343530915438, 1178560808893263, - 301095684058146, 1280977479761118 -#else - 15121094, 28352561, 56718958, 15427820, 39598927, 17561924, - 21670946, 4486675, 61177054, 19088051 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1615357281742403, 404257611616381, 2160201349780978, - 1160947379188955, 1578038619549541 -#else - 16166467, 24070699, 56004733, 6023907, 35182066, 32189508, - 2340059, 17299464, 56373093, 23514607 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2013087639791217, 822734930507457, 1785668418619014, - 1668650702946164, 389450875221715 -#else - 28042865, 29997343, 54982337, 12259705, 63391366, 26608532, - 6766452, 24864833, 18036435, 5803270 -#endif - }}, - }, - }, - { - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 453918449698368, 106406819929001, 2072540975937135, - 308588860670238, 1304394580755385 -#else - 66291264, 6763911, 11803561, 1585585, 10958447, 30883267, - 23855390, 4598332, 60949433, 19436993 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1295082798350326, 2091844511495996, 1851348972587817, - 3375039684596, 789440738712837 -#else - 36077558, 19298237, 17332028, 31170912, 31312681, 27587249, - 696308, 50292, 47013125, 11763583 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2083069137186154, 848523102004566, 993982213589257, - 1405313299916317, 1532824818698468 -#else - 66514282, 31040148, 34874710, 12643979, 12650761, 14811489, - 665117, 20940800, 47335652, 22840869 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1495961298852430, 1397203457344779, 1774950217066942, - 139302743555696, 66603584342787 -#else - 30464590, 22291560, 62981387, 20819953, 19835326, 26448819, - 42712688, 2075772, 50088707, 992470 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1782411379088302, 1096724939964781, 27593390721418, - 542241850291353, 1540337798439873 -#else - 18357166, 26559999, 7766381, 16342475, 37783946, 411173, - 14578841, 8080033, 55534529, 22952821 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 693543956581437, 171507720360750, 1557908942697227, - 1074697073443438, 1104093109037196 -#else - 19598397, 10334610, 12555054, 2555664, 18821899, 23214652, - 21873262, 16014234, 26224780, 16452269 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 345288228393419, 1099643569747172, 134881908403743, - 1740551994106740, 248212179299770 -#else - 36884939, 5145195, 5944548, 16385966, 3976735, 2009897, - 55731060, 25936245, 46575034, 3698649 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 231429562203065, 1526290236421172, 2021375064026423, - 1520954495658041, 806337791525116 -#else - 14187449, 3448569, 56472628, 22743496, 44444983, 30120835, - 7268409, 22663988, 27394300, 12015369 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1079623667189886, 872403650198613, 766894200588288, - 2163700860774109, 2023464507911816 -#else - 19695742, 16087646, 28032085, 12999827, 6817792, 11427614, - 20244189, 32241655, 53849736, 30151970 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 854645372543796, 1936406001954827, 151460662541253, - 825325739271555, 1554306377287556 -#else - 30860084, 12735208, 65220619, 28854697, 50133957, 2256939, - 58942851, 12298311, 58558340, 23160969 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1497138821904622, 1044820250515590, 1742593886423484, - 1237204112746837, 849047450816987 -#else - 61389038, 22309106, 65198214, 15569034, 26642876, 25966672, - 61319509, 18435777, 62132699, 12651792 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 667962773375330, 1897271816877105, 1399712621683474, - 1143302161683099, 2081798441209593 -#else - 64260450, 9953420, 11531313, 28271553, 26895122, 20857343, - 53990043, 17036529, 9768697, 31021214 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 127147851567005, 1936114012888110, 1704424366552046, - 856674880716312, 716603621335359 -#else - 42389405, 1894650, 66821166, 28850346, 15348718, 25397902, - 32767512, 12765450, 4940095, 10678226 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1072409664800960, 2146937497077528, 1508780108920651, - 935767602384853, 1112800433544068 -#else - 18860224, 15980149, 48121624, 31991861, 40875851, 22482575, - 59264981, 13944023, 42736516, 16582018 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 333549023751292, 280219272863308, 2104176666454852, - 1036466864875785, 536135186520207 -#else - 51604604, 4970267, 37215820, 4175592, 46115652, 31354675, - 55404809, 15444559, 56105103, 7989036 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 373666279883137, 146457241530109, 304116267127857, - 416088749147715, 1258577131183391 -#else - 31490433, 5568061, 64696061, 2182382, 34772017, 4531685, - 35030595, 6200205, 47422751, 18754260 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1186115062588401, 2251609796968486, 1098944457878953, - 1153112761201374, 1791625503417267 -#else - 49800177, 17674491, 35586086, 33551600, 34221481, 16375548, - 8680158, 17182719, 28550067, 26697300 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1870078460219737, 2129630962183380, 852283639691142, - 292865602592851, 401904317342226 -#else - 38981977, 27866340, 16837844, 31733974, 60258182, 12700015, - 37068883, 4364037, 1155602, 5988841 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1361070124828035, 815664541425524, 1026798897364671, - 1951790935390647, 555874891834790 -#else - 21890435, 20281525, 54484852, 12154348, 59276991, 15300495, - 23148983, 29083951, 24618406, 8283181 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1546301003424277, 459094500062839, 1097668518375311, - 1780297770129643, 720763293687608 -#else - 33972757, 23041680, 9975415, 6841041, 35549071, 16356535, - 3070187, 26528504, 1466168, 10740210 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1212405311403990, 1536693382542438, 61028431067459, - 1863929423417129, 1223219538638038 -#else - 65599446, 18066246, 53605478, 22898515, 32799043, 909394, - 53169961, 27774712, 34944214, 18227391 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1294303766540260, 1183557465955093, 882271357233093, - 63854569425375, 2213283684565087 -#else - 3960804, 19286629, 39082773, 17636380, 47704005, 13146867, - 15567327, 951507, 63848543, 32980496 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 339050984211414, 601386726509773, 413735232134068, - 966191255137228, 1839475899458159 -#else - 24740822, 5052253, 37014733, 8961360, 25877428, 6165135, - 42740684, 14397371, 59728495, 27410326 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 235605972169408, 2174055643032978, 1538335001838863, - 1281866796917192, 1815940222628465 -#else - 38220480, 3510802, 39005586, 32395953, 55870735, 22922977, - 51667400, 19101303, 65483377, 27059617 -#endif - }}, - }, - }, - { - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1632352921721536, 1833328609514701, 2092779091951987, - 1923956201873226, 2210068022482919 -#else - 793280, 24323954, 8836301, 27318725, 39747955, 31184838, - 33152842, 28669181, 57202663, 32932579 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 35271216625062, 1712350667021807, 983664255668860, - 98571260373038, 1232645608559836 -#else - 5666214, 525582, 20782575, 25516013, 42570364, 14657739, - 16099374, 1468826, 60937436, 18367850 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1998172393429622, 1798947921427073, 784387737563581, - 1589352214827263, 1589861734168180 -#else - 62249590, 29775088, 64191105, 26806412, 7778749, 11688288, - 36704511, 23683193, 65549940, 23690785 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1733739258725305, 31715717059538, 201969945218860, - 992093044556990, 1194308773174556 -#else - 10896313, 25834728, 824274, 472601, 47648556, 3009586, 25248958, - 14783338, 36527388, 17796587 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 846415389605137, 746163495539180, 829658752826080, - 592067705956946, 957242537821393 -#else - 10566929, 12612572, 35164652, 11118702, 54475488, 12362878, - 21752402, 8822496, 24003793, 14264025 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1758148849754419, 619249044817679, 168089007997045, - 1371497636330523, 1867101418880350 -#else - 27713843, 26198459, 56100623, 9227529, 27050101, 2504721, - 23886875, 20436907, 13958494, 27821979 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 326633984209635, 261759506071016, 1700682323676193, - 1577907266349064, 1217647663383016 -#else - 43627235, 4867225, 39861736, 3900520, 29838369, 25342141, - 35219464, 23512650, 7340520, 18144364 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1714182387328607, 1477856482074168, 574895689942184, - 2159118410227270, 1555532449716575 -#else - 4646495, 25543308, 44342840, 22021777, 23184552, 8566613, - 31366726, 32173371, 52042079, 23179239 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 853828206885131, 998498946036955, 1835887550391235, - 207627336608048, 258363815956050 -#else - 49838347, 12723031, 50115803, 14878793, 21619651, 27356856, - 27584816, 3093888, 58265170, 3849920 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 141141474651677, 1236728744905256, 643101419899887, - 1646615130509173, 1208239602291765 -#else - 58043933, 2103171, 25561640, 18428694, 61869039, 9582957, - 32477045, 24536477, 5002293, 18004173 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1501663228068911, 1354879465566912, 1444432675498247, - 897812463852601, 855062598754348 -#else - 55051311, 22376525, 21115584, 20189277, 8808711, 21523724, - 16489529, 13378448, 41263148, 12741425 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 714380763546606, 1032824444965790, 1774073483745338, - 1063840874947367, 1738680636537158 -#else - 61162478, 10645102, 36197278, 15390283, 63821882, 26435754, - 24306471, 15852464, 28834118, 25908360 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1640635546696252, 633168953192112, 2212651044092396, - 30590958583852, 368515260889378 -#else - 49773116, 24447374, 42577584, 9434952, 58636780, 32971069, - 54018092, 455840, 20461858, 5491305 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1171650314802029, 1567085444565577, 1453660792008405, - 757914533009261, 1619511342778196 -#else - 13669229, 17458950, 54626889, 23351392, 52539093, 21661233, - 42112877, 11293806, 38520660, 24132599 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 420958967093237, 971103481109486, 2169549185607107, - 1301191633558497, 1661514101014240 -#else - 28497909, 6272777, 34085870, 14470569, 8906179, 32328802, - 18504673, 19389266, 29867744, 24758489 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 907123651818302, 1332556122804146, 1824055253424487, - 1367614217442959, 1982558335973172 -#else - 50901822, 13517195, 39309234, 19856633, 24009063, 27180541, - 60741263, 20379039, 22853428, 29542421 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1121533090144639, 1021251337022187, 110469995947421, - 1511059774758394, 2110035908131662 -#else - 24191359, 16712145, 53177067, 15217830, 14542237, 1646131, - 18603514, 22516545, 12876622, 31441985 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 303213233384524, 2061932261128138, 352862124777736, - 40828818670255, 249879468482660 -#else - 17902668, 4518229, 66697162, 30725184, 26878216, 5258055, - 54248111, 608396, 16031844, 3723494 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 856559257852200, 508517664949010, 1378193767894916, - 1723459126947129, 1962275756614521 -#else - 38476072, 12763727, 46662418, 7577503, 33001348, 20536687, - 17558841, 25681542, 23896953, 29240187 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1445691340537320, 40614383122127, 402104303144865, - 485134269878232, 1659439323587426 -#else - 47103464, 21542479, 31520463, 605201, 2543521, 5991821, - 64163800, 7229063, 57189218, 24727572 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 20057458979482, 1183363722525800, 2140003847237215, - 2053873950687614, 2112017736174909 -#else - 28816026, 298879, 38943848, 17633493, 19000927, 31888542, - 54428030, 30605106, 49057085, 31471516 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2228654250927986, 1483591363415267, 1368661293910956, - 1076511285177291, 526650682059608 -#else - 16000882, 33209536, 3493091, 22107234, 37604268, 20394642, - 12577739, 16041268, 47393624, 7847706 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 709481497028540, 531682216165724, 316963769431931, - 1814315888453765, 258560242424104 -#else - 10151868, 10572098, 27312476, 7922682, 14825339, 4723128, - 34252933, 27035413, 57088296, 3852847 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1053447823660455, 1955135194248683, 1010900954918985, - 1182614026976701, 1240051576966610 -#else - 55678375, 15697595, 45987307, 29133784, 5386313, 15063598, - 16514493, 17622322, 29330898, 18478208 -#endif - }}, - }, - }, - { - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1957943897155497, 1788667368028035, 137692910029106, - 1039519607062, 826404763313028 -#else - 41609129, 29175637, 51885955, 26653220, 16615730, 2051784, - 3303702, 15490, 39560068, 12314390 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1848942433095597, 1582009882530495, 1849292741020143, - 1068498323302788, 2001402229799484 -#else - 15683501, 27551389, 18109119, 23573784, 15337967, 27556609, - 50391428, 15921865, 16103996, 29823217 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1528282417624269, 2142492439828191, 2179662545816034, - 362568973150328, 1591374675250271 -#else - 43939021, 22773182, 13588191, 31925625, 63310306, 32479502, - 47835256, 5402698, 37293151, 23713330 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 160026679434388, 232341189218716, 2149181472355545, - 598041771119831, 183859001910173 -#else - 23190676, 2384583, 34394524, 3462153, 37205209, 32025299, - 55842007, 8911516, 41903005, 2739712 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2013278155187349, 662660471354454, 793981225706267, - 411706605985744, 804490933124791 -#else - 21374101, 30000182, 33584214, 9874410, 15377179, 11831242, - 33578960, 6134906, 4931255, 11987849 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2051892037280204, 488391251096321, 2230187337030708, - 930221970662692, 679002758255210 -#else - 67101132, 30575573, 50885377, 7277596, 105524, 33232381, - 35628324, 13861387, 37032554, 10117929 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1530723630438670, 875873929577927, 341560134269988, - 449903119530753, 1055551308214179 -#else - 37607694, 22809559, 40945095, 13051538, 41483300, 5089642, - 60783361, 6704078, 12890019, 15728940 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1461835919309432, 1955256480136428, 180866187813063, - 1551979252664528, 557743861963950 -#else - 45136504, 21783052, 66157804, 29135591, 14704839, 2695116, - 903376, 23126293, 12885166, 8311031 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 359179641731115, 1324915145732949, 902828372691474, - 294254275669987, 1887036027752957 -#else - 49592363, 5352193, 10384213, 19742774, 7506450, 13453191, - 26423267, 4384730, 1888765, 28119028 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2043271609454323, 2038225437857464, 1317528426475850, - 1398989128982787, 2027639881006861 -#else - 41291507, 30447119, 53614264, 30371925, 30896458, 19632703, - 34857219, 20846562, 47644429, 30214188 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2072902725256516, 312132452743412, 309930885642209, - 996244312618453, 1590501300352303 -#else - 43500868, 30888657, 66582772, 4651135, 5765089, 4618330, - 6092245, 14845197, 17151279, 23700316 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1397254305160710, 695734355138021, 2233992044438756, - 1776180593969996, 1085588199351115 -#else - 42278406, 20820711, 51942885, 10367249, 37577956, 33289075, - 22825804, 26467153, 50242379, 16176524 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 440567051331029, 254894786356681, 493869224930222, - 1556322069683366, 1567456540319218 -#else - 43525589, 6564960, 20063689, 3798228, 62368686, 7359224, - 2006182, 23191006, 38362610, 23356922 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1950722461391320, 1907845598854797, 1822757481635527, - 2121567704750244, 73811931471221 -#else - 56482264, 29068029, 53788301, 28429114, 3432135, 27161203, - 23632036, 31613822, 32808309, 1099883 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 387139307395758, 2058036430315676, 1220915649965325, - 1794832055328951, 1230009312169328 -#else - 15030958, 5768825, 39657628, 30667132, 60681485, 18193060, - 51830967, 26745081, 2051440, 18328567 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1765973779329517, 659344059446977, 19821901606666, - 1301928341311214, 1116266004075885 -#else - 63746541, 26315059, 7517889, 9824992, 23555850, 295369, 5148398, - 19400244, 44422509, 16633659 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1127572801181483, 1224743760571696, 1276219889847274, - 1529738721702581, 1589819666871853 -#else - 4577067, 16802144, 13249840, 18250104, 19958762, 19017158, - 18559669, 22794883, 8402477, 23690159 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2181229378964934, 2190885205260020, 1511536077659137, - 1246504208580490, 668883326494241 -#else - 38702534, 32502850, 40318708, 32646733, 49896449, 22523642, - 9453450, 18574360, 17983009, 9967138 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 437866655573314, 669026411194768, 81896997980338, - 523874406393178, 245052060935236 -#else - 41346370, 6524721, 26585488, 9969270, 24709298, 1220360, - 65430874, 7806336, 17507396, 3651560 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1975438052228868, 1071801519999806, 594652299224319, - 1877697652668809, 1489635366987285 -#else - 56688388, 29436320, 14584638, 15971087, 51340543, 8861009, - 26556809, 27979875, 48555541, 22197296 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 958592545673770, 233048016518599, 851568750216589, - 567703851596087, 1740300006094761 -#else - 2839082, 14284142, 4029895, 3472686, 14402957, 12689363, - 40466743, 8459446, 61503401, 25932490 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2014540178270324, 192672779514432, 213877182641530, - 2194819933853411, 1716422829364835 -#else - 62269556, 30018987, 9744960, 2871048, 25113978, 3187018, - 41998051, 32705365, 17258083, 25576693 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1540769606609725, 2148289943846077, 1597804156127445, - 1230603716683868, 815423458809453 -#else - 18164541, 22959256, 49953981, 32012014, 19237077, 23809137, - 23357532, 18337424, 26908269, 12150756 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1738560251245018, 1779576754536888, 1783765347671392, - 1880170990446751, 1088225159617541 -#else - 36843994, 25906566, 5112248, 26517760, 65609056, 26580174, - 43167, 28016731, 34806789, 16215818 -#endif - }}, - }, - }, - { - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 659303913929492, 1956447718227573, 1830568515922666, - 841069049744408, 1669607124206368 -#else - 60209940, 9824393, 54804085, 29153342, 35711722, 27277596, - 32574488, 12532905, 59605792, 24879084 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1143465490433355, 1532194726196059, 1093276745494697, - 481041706116088, 2121405433561163 -#else - 39765323, 17038963, 39957339, 22831480, 946345, 16291093, - 254968, 7168080, 21676107, 31611404 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1686424298744462, 1451806974487153, 266296068846582, - 1834686947542675, 1720762336132256 -#else - 21260942, 25129680, 50276977, 21633609, 43430902, 3968120, - 63456915, 27338965, 63552672, 25641356 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 889217026388959, 1043290623284660, 856125087551909, - 1669272323124636, 1603340330827879 -#else - 16544735, 13250366, 50304436, 15546241, 62525861, 12757257, - 64646556, 24874095, 48201831, 23891632 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1206396181488998, 333158148435054, 1402633492821422, - 1120091191722026, 1945474114550509 -#else - 64693606, 17976703, 18312302, 4964443, 51836334, 20900867, - 26820650, 16690659, 25459437, 28989823 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 766720088232571, 1512222781191002, 1189719893490790, - 2091302129467914, 2141418006894941 -#else - 41964155, 11425019, 28423002, 22533875, 60963942, 17728207, - 9142794, 31162830, 60676445, 31909614 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 419663647306612, 1998875112167987, 1426599870253707, - 1154928355379510, 486538532138187 -#else - 44004212, 6253475, 16964147, 29785560, 41994891, 21257994, - 39651638, 17209773, 6335691, 7249989 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 938160078005954, 1421776319053174, 1941643234741774, - 180002183320818, 1414380336750546 -#else - 36775618, 13979674, 7503222, 21186118, 55152142, 28932738, - 36836594, 2682241, 25993170, 21075909 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 398001940109652, 1577721237663248, 1012748649830402, - 1540516006905144, 1011684812884559 -#else - 4364628, 5930691, 32304656, 23509878, 59054082, 15091130, - 22857016, 22955477, 31820367, 15075278 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1653276489969630, 6081825167624, 1921777941170836, - 1604139841794531, 861211053640641 -#else - 31879134, 24635739, 17258760, 90626, 59067028, 28636722, - 24162787, 23903546, 49138625, 12833044 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 996661541407379, 1455877387952927, 744312806857277, - 139213896196746, 1000282908547789 -#else - 19073683, 14851414, 42705695, 21694263, 7625277, 11091125, - 47489674, 2074448, 57694925, 14905376 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1450817495603008, 1476865707053229, 1030490562252053, - 620966950353376, 1744760161539058 -#else - 24483648, 21618865, 64589997, 22007013, 65555733, 15355505, - 41826784, 9253128, 27628530, 25998952 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 559728410002599, 37056661641185, 2038622963352006, - 1637244893271723, 1026565352238948 -#else - 17597607, 8340603, 19355617, 552187, 26198470, 30377849, - 4593323, 24396850, 52997988, 15297015 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 962165956135846, 1116599660248791, 182090178006815, - 1455605467021751, 196053588803284 -#else - 510886, 14337390, 35323607, 16638631, 6328095, 2713355, - 46891447, 21690211, 8683220, 2921426 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 796863823080135, 1897365583584155, 420466939481601, - 2165972651724672, 932177357788289 -#else - 18606791, 11874196, 27155355, 28272950, 43077121, 6265445, - 41930624, 32275507, 4674689, 13890525 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 877047233620632, 1375632631944375, 643773611882121, - 660022738847877, 19353932331831 -#else - 13609624, 13069022, 39736503, 20498523, 24360585, 9592974, - 14977157, 9835105, 4389687, 288396 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2216943882299338, 394841323190322, 2222656898319671, - 558186553950529, 1077236877025190 -#else - 9922506, 33035038, 13613106, 5883594, 48350519, 33120168, - 54804801, 8317627, 23388070, 16052080 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 801118384953213, 1914330175515892, 574541023311511, - 1471123787903705, 1526158900256288 -#else - 12719997, 11937594, 35138804, 28525742, 26900119, 8561328, - 46953177, 21921452, 52354592, 22741539 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 949617889087234, 2207116611267331, 912920039141287, - 501158539198789, 62362560771472 -#else - 15961858, 14150409, 26716931, 32888600, 44314535, 13603568, - 11829573, 7467844, 38286736, 929274 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1474518386765335, 1760793622169197, 1157399790472736, - 1622864308058898, 165428294422792 -#else - 11038231, 21972036, 39798381, 26237869, 56610336, 17246600, - 43629330, 24182562, 45715720, 2465073 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1961673048027128, 102619413083113, 1051982726768458, - 1603657989805485, 1941613251499678 -#else - 20017144, 29231206, 27915241, 1529148, 12396362, 15675764, - 13817261, 23896366, 2463390, 28932292 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1401939116319266, 335306339903072, 72046196085786, - 862423201496006, 850518754531384 -#else - 50749986, 20890520, 55043680, 4996453, 65852442, 1073571, - 9583558, 12851107, 4003896, 12673717 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1234706593321979, 1083343891215917, 898273974314935, - 1640859118399498, 157578398571149 -#else - 65377275, 18398561, 63845933, 16143081, 19294135, 13385325, - 14741514, 24450706, 7903885, 2348101 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1143483057726416, 1992614991758919, 674268662140796, - 1773370048077526, 674318359920189 -#else - 24536016, 17039225, 12715591, 29692277, 1511292, 10047386, - 63266518, 26425272, 38731325, 10048126 -#endif - }}, - }, - }, - { - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1835401379538542, 173900035308392, 818247630716732, - 1762100412152786, 1021506399448291 -#else - 54486638, 27349611, 30718824, 2591312, 56491836, 12192839, - 18873298, 26257342, 34811107, 15221631 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1506632088156630, 2127481795522179, 513812919490255, - 140643715928370, 442476620300318 -#else - 40630742, 22450567, 11546243, 31701949, 9180879, 7656409, - 45764914, 2095754, 29769758, 6593415 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2056683376856736, 219094741662735, 2193541883188309, - 1841182310235800, 556477468664293 -#else - 35114656, 30646970, 4176911, 3264766, 12538965, 32686321, - 26312344, 27435754, 30958053, 8292160 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1315019427910827, 1049075855992603, 2066573052986543, - 266904467185534, 2040482348591520 -#else - 31429803, 19595316, 29173531, 15632448, 12174511, 30794338, - 32808830, 3977186, 26143136, 30405556 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 94096246544434, 922482381166992, 24517828745563, - 2139430508542503, 2097139044231004 -#else - 22648882, 1402143, 44308880, 13746058, 7936347, 365344, - 58440231, 31879998, 63350620, 31249806 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 537697207950515, 1399352016347350, 1563663552106345, - 2148749520888918, 549922092988516 -#else - 51616947, 8012312, 64594134, 20851969, 43143017, 23300402, - 65496150, 32018862, 50444388, 8194477 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1747985413252434, 680511052635695, 1809559829982725, - 594274250930054, 201673170745982 -#else - 27338066, 26047012, 59694639, 10140404, 48082437, 26964542, - 27277190, 8855376, 28572286, 3005164 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 323583936109569, 1973572998577657, 1192219029966558, - 79354804385273, 1374043025560347 -#else - 26287105, 4821776, 25476601, 29408529, 63344350, 17765447, - 49100281, 1182478, 41014043, 20474836 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 213277331329947, 416202017849623, 1950535221091783, - 1313441578103244, 2171386783823658 -#else - 59937691, 3178079, 23970071, 6201893, 49913287, 29065239, - 45232588, 19571804, 32208682, 32356184 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 189088804229831, 993969372859110, 895870121536987, - 1547301535298256, 1477373024911350 -#else - 50451143, 2817642, 56822502, 14811297, 6024667, 13349505, - 39793360, 23056589, 39436278, 22014573 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1620578418245010, 541035331188469, 2235785724453865, - 2154865809088198, 1974627268751826 -#else - 15941010, 24148500, 45741813, 8062054, 31876073, 33315803, - 51830470, 32110002, 15397330, 29424239 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1346805451740245, 1350981335690626, 942744349501813, - 2155094562545502, 1012483751693409 -#else - 8934485, 20068965, 43822466, 20131190, 34662773, 14047985, - 31170398, 32113411, 39603297, 15087183 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2107080134091762, 1132567062788208, 1824935377687210, - 769194804343737, 1857941799971888 -#else - 48751602, 31397940, 24524912, 16876564, 15520426, 27193656, - 51606457, 11461895, 16788528, 27685490 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1074666112436467, 249279386739593, 1174337926625354, - 1559013532006480, 1472287775519121 -#else - 65161459, 16013772, 21750665, 3714552, 49707082, 17498998, - 63338576, 23231111, 31322513, 21938797 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1872620123779532, 1892932666768992, 1921559078394978, - 1270573311796160, 1438913646755037 -#else - 21426636, 27904214, 53460576, 28206894, 38296674, 28633461, - 48833472, 18933017, 13040861, 21441484 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 837390187648199, 1012253300223599, 989780015893987, - 1351393287739814, 328627746545550 -#else - 11293895, 12478086, 39972463, 15083749, 37801443, 14748871, - 14555558, 20137329, 1613710, 4896935 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1028328827183114, 1711043289969857, 1350832470374933, - 1923164689604327, 1495656368846911 -#else - 41213962, 15323293, 58619073, 25496531, 25967125, 20128972, - 2825959, 28657387, 43137087, 22287016 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1900828492104143, 430212361082163, 687437570852799, - 832514536673512, 1685641495940794 -#else - 51184079, 28324551, 49665331, 6410663, 3622847, 10243618, - 20615400, 12405433, 43355834, 25118015 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 842632847936398, 605670026766216, 290836444839585, - 163210774892356, 2213815011799645 -#else - 60017550, 12556207, 46917512, 9025186, 50036385, 4333800, - 4378436, 2432030, 23097949, 32988414 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1176336383453996, 1725477294339771, 12700622672454, - 678015708818208, 162724078519879 -#else - 4565804, 17528778, 20084411, 25711615, 1724998, 189254, - 24767264, 10103221, 48596551, 2424777 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1448049969043497, 1789411762943521, 385587766217753, - 90201620913498, 832999441066823 -#else - 366633, 21577626, 8173089, 26664313, 30788633, 5745705, - 59940186, 1344108, 63466311, 12412658 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 516086333293313, 2240508292484616, 1351669528166508, - 1223255565316488, 750235824427138 -#else - 43107073, 7690285, 14929416, 33386175, 34898028, 20141445, - 24162696, 18227928, 63967362, 11179384 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1263624896582495, 1102602401673328, 526302183714372, - 2152015839128799, 1483839308490010 -#else - 18289503, 18829478, 8056944, 16430056, 45379140, 7842513, - 61107423, 32067534, 48424218, 22110928 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 442991718646863, 1599275157036458, 1925389027579192, - 899514691371390, 350263251085160 -#else - 476239, 6601091, 60956074, 23831056, 17503544, 28690532, - 27672958, 13403813, 11052904, 5219329 -#endif - }}, - }, - }, - { - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1689713572022143, 593854559254373, 978095044791970, - 1985127338729499, 1676069120347625 -#else - 20678527, 25178694, 34436965, 8849122, 62099106, 14574751, - 31186971, 29580702, 9014761, 24975376 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1557207018622683, 340631692799603, 1477725909476187, - 614735951619419, 2033237123746766 -#else - 53464795, 23204192, 51146355, 5075807, 65594203, 22019831, - 34006363, 9160279, 8473550, 30297594 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 968764929340557, 1225534776710944, 662967304013036, - 1155521416178595, 791142883466590 -#else - 24900749, 14435722, 17209120, 18261891, 44516588, 9878982, - 59419555, 17218610, 42540382, 11788947 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1487081286167458, 993039441814934, 1792378982844640, - 698652444999874, 2153908693179754 -#else - 63990690, 22159237, 53306774, 14797440, 9652448, 26708528, - 47071426, 10410732, 42540394, 32095740 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1123181311102823, 685575944875442, 507605465509927, - 1412590462117473, 568017325228626 -#else - 51449703, 16736705, 44641714, 10215877, 58011687, 7563910, - 11871841, 21049238, 48595538, 8464117 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 560258797465417, 2193971151466401, 1824086900849026, - 579056363542056, 1690063960036441 -#else - 43708233, 8348506, 52522913, 32692717, 63158658, 27181012, - 14325288, 8628612, 33313881, 25183915 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1918407319222416, 353767553059963, 1930426334528099, - 1564816146005724, 1861342381708096 -#else - 46921872, 28586496, 22367355, 5271547, 66011747, 28765593, - 42303196, 23317577, 58168128, 27736162 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2131325168777276, 1176636658428908, 1756922641512981, - 1390243617176012, 1966325177038383 -#else - 60160060, 31759219, 34483180, 17533252, 32635413, 26180187, - 15989196, 20716244, 28358191, 29300528 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2063958120364491, 2140267332393533, 699896251574968, - 273268351312140, 375580724713232 -#else - 43547083, 30755372, 34757181, 31892468, 57961144, 10429266, - 50471180, 4072015, 61757200, 5596588 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2024297515263178, 416959329722687, 1079014235017302, - 171612225573183, 1031677520051053 -#else - 38872266, 30164383, 12312895, 6213178, 3117142, 16078565, - 29266239, 2557221, 1768301, 15373193 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2033900009388450, 1744902869870788, 2190580087917640, - 1949474984254121, 231049754293748 -#else - 59865506, 30307471, 62515396, 26001078, 66980936, 32642186, - 66017961, 29049440, 42448372, 3442909 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 343868674606581, 550155864008088, 1450580864229630, - 481603765195050, 896972360018042 -#else - 36898293, 5124042, 14181784, 8197961, 18964734, 21615339, - 22597930, 7176455, 48523386, 13365929 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2151139328380127, 314745882084928, 59756825775204, - 1676664391494651, 2048348075599360 -#else - 59231455, 32054473, 8324672, 4690079, 6261860, 890446, 24538107, - 24984246, 57419264, 30522764 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1528930066340597, 1605003907059576, 1055061081337675, - 1458319101947665, 1234195845213142 -#else - 25008885, 22782833, 62803832, 23916421, 16265035, 15721635, - 683793, 21730648, 15723478, 18390951 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 830430507734812, 1780282976102377, 1425386760709037, - 362399353095425, 2168861579799910 -#else - 57448220, 12374378, 40101865, 26528283, 59384749, 21239917, - 11879681, 5400171, 519526, 32318556 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1155762232730333, 980662895504006, 2053766700883521, - 490966214077606, 510405877041357 -#else - 22258397, 17222199, 59239046, 14613015, 44588609, 30603508, - 46754982, 7315966, 16648397, 7605640 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1683750316716132, 652278688286128, 1221798761193539, - 1897360681476669, 319658166027343 -#else - 59027556, 25089834, 58885552, 9719709, 19259459, 18206220, - 23994941, 28272877, 57640015, 4763277 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 618808732869972, 72755186759744, 2060379135624181, - 1730731526741822, 48862757828238 -#else - 45409620, 9220968, 51378240, 1084136, 41632757, 30702041, - 31088446, 25789909, 55752334, 728111 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1463171970593505, 1143040711767452, 614590986558883, - 1409210575145591, 1882816996436803 -#else - 26047201, 21802961, 60208540, 17032633, 24092067, 9158119, - 62835319, 20998873, 37743427, 28056159 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2230133264691131, 563950955091024, 2042915975426398, - 827314356293472, 672028980152815 -#else - 17510331, 33231575, 5854288, 8403524, 17133918, 30441820, - 38997856, 12327944, 10750447, 10014012 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 264204366029760, 1654686424479449, 2185050199932931, - 2207056159091748, 506015669043634 -#else - 56796096, 3936951, 9156313, 24656749, 16498691, 32559785, - 39627812, 32887699, 3424690, 7540221 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1784446333136569, 1973746527984364, 334856327359575, - 1156769775884610, 1023950124675478 -#else - 30322361, 26590322, 11361004, 29411115, 7433303, 4989748, - 60037442, 17237212, 57864598, 15258045 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2065270940578383, 31477096270353, 306421879113491, - 181958643936686, 1907105536686083 -#else - 13054543, 30774935, 19155473, 469045, 54626067, 4566041, - 5631406, 2711395, 1062915, 28418087 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1496516440779464, 1748485652986458, 872778352227340, - 818358834654919, 97932669284220 -#else - 47868616, 22299832, 37599834, 26054466, 61273100, 13005410, - 61042375, 12194496, 32960380, 1459310 -#endif - }}, - }, - }, - { - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 471636015770351, 672455402793577, 1804995246884103, - 1842309243470804, 1501862504981682 -#else - 19852015, 7027924, 23669353, 10020366, 8586503, 26896525, - 394196, 27452547, 18638002, 22379495 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1013216974933691, 538921919682598, 1915776722521558, - 1742822441583877, 1886550687916656 -#else - 31395515, 15098109, 26581030, 8030562, 50580950, 28547297, - 9012485, 25970078, 60465776, 28111795 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2094270000643336, 303971879192276, 40801275554748, - 649448917027930, 1818544418535447 -#else - 57916680, 31207054, 65111764, 4529533, 25766844, 607986, - 67095642, 9677542, 34813975, 27098423 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2241737709499165, 549397817447461, 838180519319392, - 1725686958520781, 1705639080897747 -#else - 64664349, 33404494, 29348901, 8186665, 1873760, 12489863, - 36174285, 25714739, 59256019, 25416002 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1216074541925116, 50120933933509, 1565829004133810, - 721728156134580, 349206064666188 -#else - 51872508, 18120922, 7766469, 746860, 26346930, 23332670, - 39775412, 10754587, 57677388, 5203575 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 948617110470858, 346222547451945, 1126511960599975, - 1759386906004538, 493053284802266 -#else - 31834314, 14135496, 66338857, 5159117, 20917671, 16786336, - 59640890, 26216907, 31809242, 7347066 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1454933046815146, 874696014266362, 1467170975468588, - 1432316382418897, 2111710746366763 -#else - 57502122, 21680191, 20414458, 13033986, 13716524, 21862551, - 19797969, 21343177, 15192875, 31466942 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2105387117364450, 1996463405126433, 1303008614294500, - 851908115948209, 1353742049788635 -#else - 54445282, 31372712, 1168161, 29749623, 26747876, 19416341, - 10609329, 12694420, 33473243, 20172328 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 750300956351719, 1487736556065813, 15158817002104, - 1511998221598392, 971739901354129 -#else - 33184999, 11180355, 15832085, 22169002, 65475192, 225883, - 15089336, 22530529, 60973201, 14480052 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1874648163531693, 2124487685930551, 1810030029384882, - 918400043048335, 586348627300650 -#else - 31308717, 27934434, 31030839, 31657333, 15674546, 26971549, - 5496207, 13685227, 27595050, 8737275 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1235084464747900, 1166111146432082, 1745394857881591, - 1405516473883040, 4463504151617 -#else - 46790012, 18404192, 10933842, 17376410, 8335351, 26008410, - 36100512, 20943827, 26498113, 66511 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1663810156463827, 327797390285791, 1341846161759410, - 1964121122800605, 1747470312055380 -#else - 22644435, 24792703, 50437087, 4884561, 64003250, 19995065, - 30540765, 29267685, 53781076, 26039336 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 660005247548233, 2071860029952887, 1358748199950107, - 911703252219107, 1014379923023831 -#else - 39091017, 9834844, 18617207, 30873120, 63706907, 20246925, - 8205539, 13585437, 49981399, 15115438 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2206641276178231, 1690587809721504, 1600173622825126, - 2156096097634421, 1106822408548216 -#else - 23711543, 32881517, 31206560, 25191721, 6164646, 23844445, - 33572981, 32128335, 8236920, 16492939 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1344788193552206, 1949552134239140, 1735915881729557, - 675891104100469, 1834220014427292 -#else - 43198286, 20038905, 40809380, 29050590, 25005589, 25867162, - 19574901, 10071562, 6708380, 27332008 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1920949492387964, 158885288387530, 70308263664033, - 626038464897817, 1468081726101009 -#else - 2101372, 28624378, 19702730, 2367575, 51681697, 1047674, - 5301017, 9328700, 29955601, 21876122 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 622221042073383, 1210146474039168, 1742246422343683, - 1403839361379025, 417189490895736 -#else - 3096359, 9271816, 45488000, 18032587, 52260867, 25961494, - 41216721, 20918836, 57191288, 6216607 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 22727256592983, 168471543384997, 1324340989803650, - 1839310709638189, 504999476432775 -#else - 34493015, 338662, 41913253, 2510421, 37895298, 19734218, - 24822829, 27407865, 40341383, 7525078 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1313240518756327, 1721896294296942, 52263574587266, - 2065069734239232, 804910473424630 -#else - 44042215, 19568808, 16133486, 25658254, 63719298, 778787, - 66198528, 30771936, 47722230, 11994100 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1337466662091884, 1287645354669772, 2018019646776184, - 652181229374245, 898011753211715 -#else - 21691500, 19929806, 66467532, 19187410, 3285880, 30070836, - 42044197, 9718257, 59631427, 13381417 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1969792547910734, 779969968247557, 2011350094423418, - 1823964252907487, 1058949448296945 -#else - 18445390, 29352196, 14979845, 11622458, 65381754, 29971451, - 23111647, 27179185, 28535281, 15779576 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 207343737062002, 1118176942430253, 758894594548164, - 806764629546266, 1157700123092949 -#else - 30098034, 3089662, 57874477, 16662134, 45801924, 11308410, - 53040410, 12021729, 9955285, 17251076 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1273565321399022, 1638509681964574, 759235866488935, - 666015124346707, 897983460943405 -#else - 9734894, 18977602, 59635230, 24415696, 2060391, 11313496, - 48682835, 9924398, 20194861, 13380996 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1717263794012298, 1059601762860786, 1837819172257618, - 1054130665797229, 680893204263559 -#else - 40730762, 25589224, 44941042, 15789296, 49053522, 27385639, - 65123949, 15707770, 26342023, 10146099 -#endif - }}, - }, - }, - { - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2237039662793603, 2249022333361206, 2058613546633703, - 149454094845279, 2215176649164582 -#else - 41091971, 33334488, 21339190, 33513044, 19745255, 30675732, - 37471583, 2227039, 21612326, 33008704 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 79472182719605, 1851130257050174, 1825744808933107, - 821667333481068, 781795293511946 -#else - 54031477, 1184227, 23562814, 27583990, 46757619, 27205717, - 25764460, 12243797, 46252298, 11649657 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 755822026485370, 152464789723500, 1178207602290608, - 410307889503239, 156581253571278 -#else - 57077370, 11262625, 27384172, 2271902, 26947504, 17556661, - 39943, 6114064, 33514190, 2333242 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1418185496130297, 484520167728613, 1646737281442950, - 1401487684670265, 1349185550126961 -#else - 45675257, 21132610, 8119781, 7219913, 45278342, 24538297, - 60429113, 20883793, 24350577, 20104431 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1495380034400429, 325049476417173, 46346894893933, - 1553408840354856, 828980101835683 -#else - 62992557, 22282898, 43222677, 4843614, 37020525, 690622, - 35572776, 23147595, 8317859, 12352766 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1280337889310282, 2070832742866672, 1640940617225222, - 2098284908289951, 450929509534434 -#else - 18200138, 19078521, 34021104, 30857812, 43406342, 24451920, - 43556767, 31266881, 20712162, 6719373 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 407703353998781, 126572141483652, 286039827513621, - 1999255076709338, 2030511179441770 -#else - 26656189, 6075253, 59250308, 1886071, 38764821, 4262325, - 11117530, 29791222, 26224234, 30256974 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1254958221100483, 1153235960999843, 942907704968834, - 637105404087392, 1149293270147267 -#else - 49939907, 18700334, 63713187, 17184554, 47154818, 14050419, - 21728352, 9493610, 18620611, 17125804 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 894249020470196, 400291701616810, 406878712230981, - 1599128793487393, 1145868722604026 -#else - 53785524, 13325348, 11432106, 5964811, 18609221, 6062965, - 61839393, 23828875, 36407290, 17074774 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1497955250203334, 110116344653260, 1128535642171976, - 1900106496009660, 129792717460909 -#else - 43248326, 22321272, 26961356, 1640861, 34695752, 16816491, - 12248508, 28313793, 13735341, 1934062 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 452487513298665, 1352120549024569, 1173495883910956, - 1999111705922009, 367328130454226 -#else - 25089769, 6742589, 17081145, 20148166, 21909292, 17486451, - 51972569, 29789085, 45830866, 5473615 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1717539401269642, 1475188995688487, 891921989653942, - 836824441505699, 1885988485608364 -#else - 31883658, 25593331, 1083431, 21982029, 22828470, 13290673, - 59983779, 12469655, 29111212, 28103418 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1241784121422547, 187337051947583, 1118481812236193, - 428747751936362, 30358898927325 -#else - 24244947, 18504025, 40845887, 2791539, 52111265, 16666677, - 24367466, 6388839, 56813277, 452382 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2022432361201842, 1088816090685051, 1977843398539868, - 1854834215890724, 564238862029357 -#else - 41468082, 30136590, 5217915, 16224624, 19987036, 29472163, - 42872612, 27639183, 15766061, 8407814 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 938868489100585, 1100285072929025, 1017806255688848, - 1957262154788833, 152787950560442 -#else - 46701865, 13990230, 15495425, 16395525, 5377168, 15166495, - 58191841, 29165478, 59040954, 2276717 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 867319417678923, 620471962942542, 226032203305716, - 342001443957629, 1761675818237336 -#else - 30157899, 12924066, 49396814, 9245752, 19895028, 3368142, - 43281277, 5096218, 22740376, 26251015 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1295072362439987, 931227904689414, 1355731432641687, - 922235735834035, 892227229410209 -#else - 2041139, 19298082, 7783686, 13876377, 41161879, 20201972, - 24051123, 13742383, 51471265, 13295221 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1680989767906154, 535362787031440, 2136691276706570, - 1942228485381244, 1267350086882274 -#else - 33338218, 25048699, 12532112, 7977527, 9106186, 31839181, - 49388668, 28941459, 62657506, 18884987 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 366018233770527, 432660629755596, 126409707644535, - 1973842949591662, 645627343442376 -#else - 47063583, 5454096, 52762316, 6447145, 28862071, 1883651, - 64639598, 29412551, 7770568, 9620597 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 535509430575217, 546885533737322, 1524675609547799, - 2138095752851703, 1260738089896827 -#else - 23208049, 7979712, 33071466, 8149229, 1758231, 22719437, - 30945527, 31860109, 33606523, 18786461 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1159906385590467, 2198530004321610, 714559485023225, - 81880727882151, 1484020820037082 -#else - 1439939, 17283952, 66028874, 32760649, 4625401, 10647766, - 62065063, 1220117, 30494170, 22113633 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1377485731340769, 2046328105512000, 1802058637158797, - 62146136768173, 1356993908853901 -#else - 62071265, 20526136, 64138304, 30492664, 15640973, 26852766, - 40369837, 926049, 65424525, 20220784 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2013612215646735, 1830770575920375, 536135310219832, - 609272325580394, 270684344495013 -#else - 13908495, 30005160, 30919927, 27280607, 45587000, 7989038, - 9021034, 9078865, 3353509, 4033511 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1237542585982777, 2228682050256790, 1385281931622824, - 593183794882890, 493654978552689 -#else - 37445433, 18440821, 32259990, 33209950, 24295848, 20642309, - 23161162, 8839127, 27485041, 7356032 -#endif - }}, - }, - }, - { - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 47341488007760, 1891414891220257, 983894663308928, - 176161768286818, 1126261115179708 -#else - 9661008, 705443, 11980065, 28184278, 65480320, 14661172, - 60762722, 2625014, 28431036, 16782598 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1694030170963455, 502038567066200, 1691160065225467, - 949628319562187, 275110186693066 -#else - 43269631, 25243016, 41163352, 7480957, 49427195, 25200248, - 44562891, 14150564, 15970762, 4099461 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1124515748676336, 1661673816593408, 1499640319059718, - 1584929449166988, 558148594103306 -#else - 29262576, 16756590, 26350592, 24760869, 8529670, 22346382, - 13617292, 23617289, 11465738, 8317062 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1784525599998356, 1619698033617383, 2097300287550715, - 258265458103756, 1905684794832758 -#else - 41615764, 26591503, 32500199, 24135381, 44070139, 31252209, - 14898636, 3848455, 20969334, 28396916 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1288941072872766, 931787902039402, 190731008859042, - 2006859954667190, 1005931482221702 -#else - 46724414, 19206718, 48772458, 13884721, 34069410, 2842113, - 45498038, 29904543, 11177094, 14989547 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1465551264822703, 152905080555927, 680334307368453, - 173227184634745, 666407097159852 -#else - 42612143, 21838415, 16959895, 2278463, 12066309, 10137771, - 13515641, 2581286, 38621356, 9930239 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2111017076203943, 1378760485794347, 1248583954016456, - 1352289194864422, 1895180776543896 -#else - 49357223, 31456605, 16544299, 20545132, 51194056, 18605350, - 18345766, 20150679, 16291480, 28240394 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 171348223915638, 662766099800389, 462338943760497, - 466917763340314, 656911292869115 -#else - 33879670, 2553287, 32678213, 9875984, 8534129, 6889387, - 57432090, 6957616, 4368891, 9788741 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 488623681976577, 866497561541722, 1708105560937768, - 1673781214218839, 1506146329818807 -#else - 16660737, 7281060, 56278106, 12911819, 20108584, 25452756, - 45386327, 24941283, 16250551, 22443329 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 160425464456957, 950394373239689, 430497123340934, - 711676555398832, 320964687779005 -#else - 47343357, 2390525, 50557833, 14161979, 1905286, 6414907, - 4689584, 10604807, 36918461, 4782746 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 988979367990485, 1359729327576302, 1301834257246029, - 294141160829308, 29348272277475 -#else - 65754325, 14736940, 59741422, 20261545, 7710541, 19398842, - 57127292, 4383044, 22546403, 437323 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1434382743317910, 100082049942065, 221102347892623, - 186982837860588, 1305765053501834 -#else - 31665558, 21373968, 50922033, 1491338, 48740239, 3294681, - 27343084, 2786261, 36475274, 19457415 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2205916462268190, 499863829790820, 961960554686616, - 158062762756985, 1841471168298305 -#else - 52641566, 32870716, 33734756, 7448551, 19294360, 14334329, - 47418233, 2355318, 47824193, 27440058 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1191737341426592, 1847042034978363, 1382213545049056, - 1039952395710448, 788812858896859 -#else - 15121312, 17758270, 6377019, 27523071, 56310752, 20596586, - 18952176, 15496498, 37728731, 11754227 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1346965964571152, 1291881610839830, 2142916164336056, - 786821641205979, 1571709146321039 -#else - 64471568, 20071356, 8488726, 19250536, 12728760, 31931939, - 7141595, 11724556, 22761615, 23420291 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 787164375951248, 202869205373189, 1356590421032140, - 1431233331032510, 786341368775957 -#else - 16918416, 11729663, 49025285, 3022986, 36093132, 20214772, - 38367678, 21327038, 32851221, 11717399 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 492448143532951, 304105152670757, 1761767168301056, - 233782684697790, 1981295323106089 -#else - 11166615, 7338049, 60386341, 4531519, 37640192, 26252376, - 31474878, 3483633, 65915689, 29523600 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 665807507761866, 1343384868355425, 895831046139653, - 439338948736892, 1986828765695105 -#else - 66923210, 9921304, 31456609, 20017994, 55095045, 13348922, - 33142652, 6546660, 47123585, 29606055 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 756096210874553, 1721699973539149, 258765301727885, - 1390588532210645, 1212530909934781 -#else - 34648249, 11266711, 55911757, 25655328, 31703693, 3855903, - 58571733, 20721383, 36336829, 18068118 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 852891097972275, 1816988871354562, 1543772755726524, - 1174710635522444, 202129090724628 -#else - 49102387, 12709067, 3991746, 27075244, 45617340, 23004006, - 35973516, 17504552, 10928916, 3011958 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1205281565824323, 22430498399418, 992947814485516, - 1392458699738672, 688441466734558 -#else - 60151107, 17960094, 31696058, 334240, 29576716, 14796075, - 36277808, 20749251, 18008030, 10258577 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1050627428414972, 1955849529137135, 2171162376368357, - 91745868298214, 447733118757826 -#else - 44660220, 15655568, 7018479, 29144429, 36794597, 32352840, - 65255398, 1367119, 25127874, 6671743 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1287181461435438, 622722465530711, 880952150571872, - 741035693459198, 311565274989772 -#else - 29701166, 19180498, 56230743, 9279287, 67091296, 13127209, - 21382910, 11042292, 25838796, 4642684 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1003649078149734, 545233927396469, 1849786171789880, - 1318943684880434, 280345687170552 -#else - 46678630, 14955536, 42982517, 8124618, 61739576, 27563961, - 30468146, 19653792, 18423288, 4177476 -#endif - }}, - }, - }, -}; - -#endif // OPENSSL_SMALL - -// Bi[i] = (2*i+1)*B -static const ge_precomp Bi[8] = { - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1288382639258501, 245678601348599, 269427782077623, - 1462984067271730, 137412439391563 -#else - 25967493, 19198397, 29566455, 3660896, 54414519, 4014786, 27544626, - 21800161, 61029707, 2047604 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 62697248952638, 204681361388450, 631292143396476, 338455783676468, - 1213667448819585 -#else - 54563134, 934261, 64385954, 3049989, 66381436, 9406985, 12720692, - 5043384, 19500929, 18085054 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 301289933810280, 1259582250014073, 1422107436869536, - 796239922652654, 1953934009299142 -#else - 58370664, 4489569, 9688441, 18769238, 10184608, 21191052, 29287918, - 11864899, 42594502, 29115885 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1601611775252272, 1720807796594148, 1132070835939856, - 1260455018889551, 2147779492816911 -#else - 15636272, 23865875, 24204772, 25642034, 616976, 16869170, 27787599, - 18782243, 28944399, 32004408 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 316559037616741, 2177824224946892, 1459442586438991, - 1461528397712656, 751590696113597 -#else - 16568933, 4717097, 55552716, 32452109, 15682895, 21747389, 16354576, - 21778470, 7689661, 11199574 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1850748884277385, 1200145853858453, 1068094770532492, - 672251375690438, 1586055907191707 -#else - 30464137, 27578307, 55329429, 17883566, 23220364, 15915852, 7512774, - 10017326, 49359771, 23634074 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 769950342298419, 132954430919746, 844085933195555, 974092374476333, - 726076285546016 -#else - 10861363, 11473154, 27284546, 1981175, 37044515, 12577860, 32867885, - 14515107, 51670560, 10819379 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 425251763115706, 608463272472562, 442562545713235, 837766094556764, - 374555092627893 -#else - 4708026, 6336745, 20377586, 9066809, 55836755, 6594695, 41455196, - 12483687, 54440373, 5581305 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1086255230780037, 274979815921559, 1960002765731872, - 929474102396301, 1190409889297339 -#else - 19563141, 16186464, 37722007, 4097518, 10237984, 29206317, 28542349, - 13850243, 43430843, 17738489 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 665000864555967, 2065379846933859, 370231110385876, 350988370788628, - 1233371373142985 -#else - 5153727, 9909285, 1723747, 30776558, 30523604, 5516873, 19480852, - 5230134, 43156425, 18378665 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2019367628972465, 676711900706637, 110710997811333, - 1108646842542025, 517791959672113 -#else - 36839857, 30090922, 7665485, 10083793, 28475525, 1649722, 20654025, - 16520125, 30598449, 7715701 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 965130719900578, 247011430587952, 526356006571389, 91986625355052, - 2157223321444601 -#else - 28881826, 14381568, 9657904, 3680757, 46927229, 7843315, 35708204, - 1370707, 29794553, 32145132 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1802695059465007, 1664899123557221, 593559490740857, - 2160434469266659, 927570450755031 -#else - 44589871, 26862249, 14201701, 24808930, 43598457, 8844725, 18474211, - 32192982, 54046167, 13821876 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1725674970513508, 1933645953859181, 1542344539275782, - 1767788773573747, 1297447965928905 -#else - 60653668, 25714560, 3374701, 28813570, 40010246, 22982724, 31655027, - 26342105, 18853321, 19333481 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1381809363726107, 1430341051343062, 2061843536018959, - 1551778050872521, 2036394857967624 -#else - 4566811, 20590564, 38133974, 21313742, 59506191, 30723862, 58594505, - 23123294, 2207752, 30344648 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1970894096313054, 528066325833207, 1619374932191227, - 2207306624415883, 1169170329061080 -#else - 41954014, 29368610, 29681143, 7868801, 60254203, 24130566, 54671499, - 32891431, 35997400, 17421995 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 2070390218572616, 1458919061857835, 624171843017421, - 1055332792707765, 433987520732508 -#else - 25576264, 30851218, 7349803, 21739588, 16472781, 9300885, 3844789, - 15725684, 171356, 6466918 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 893653801273833, 1168026499324677, 1242553501121234, - 1306366254304474, 1086752658510815 -#else - 23103977, 13316479, 9739013, 17404951, 817874, 18515490, 8965338, - 19466374, 36393951, 16193876 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 213454002618221, 939771523987438, 1159882208056014, 317388369627517, - 621213314200687 -#else - 33587053, 3180712, 64714734, 14003686, 50205390, 17283591, 17238397, - 4729455, 49034351, 9256799 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1971678598905747, 338026507889165, 762398079972271, 655096486107477, - 42299032696322 -#else - 41926547, 29380300, 32336397, 5036987, 45872047, 11360616, 22616405, - 9761698, 47281666, 630304 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 177130678690680, 1754759263300204, 1864311296286618, - 1180675631479880, 1292726903152791 -#else - 53388152, 2639452, 42871404, 26147950, 9494426, 27780403, 60554312, - 17593437, 64659607, 19263131 -#endif - }}, - }, - { - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1913163449625248, 460779200291993, 2193883288642314, - 1008900146920800, 1721983679009502 -#else - 63957664, 28508356, 9282713, 6866145, 35201802, 32691408, 48168288, - 15033783, 25105118, 25659556 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 1070401523076875, 1272492007800961, 1910153608563310, - 2075579521696771, 1191169788841221 -#else - 42782475, 15950225, 35307649, 18961608, 55446126, 28463506, 1573891, - 30928545, 2198789, 17749813 -#endif - }}, - {{ -#if defined(BORINGSSL_CURVE25519_64BIT) - 692896803108118, 500174642072499, 2068223309439677, - 1162190621851337, 1426986007309901 -#else - 64009494, 10324966, 64867251, 7453182, 61661885, 30818928, 53296841, - 17317989, 34647629, 21263748 -#endif - }}, - }, -}; diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/crypto/curve25519/internal.h temporalio-1.3.0/vendor/ring-0.16.20/crypto/curve25519/internal.h --- temporalio-1.3.0/vendor/ring-0.16.20/crypto/curve25519/internal.h 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/crypto/curve25519/internal.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,116 +0,0 @@ -/* Copyright (c) 2020, Google Inc. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY - * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION - * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ - -#ifndef OPENSSL_HEADER_CURVE25519_INTERNAL_H -#define OPENSSL_HEADER_CURVE25519_INTERNAL_H - -#include - -#include "../internal.h" - - -#if defined(OPENSSL_ARM) && !defined(OPENSSL_NO_ASM) && !defined(OPENSSL_APPLE) -#define BORINGSSL_X25519_NEON - -// x25519_NEON is defined in asm/x25519-arm.S. -void GFp_x25519_NEON(uint8_t out[32], const uint8_t scalar[32], - const uint8_t point[32]); -#endif - -#if defined(BORINGSSL_HAS_UINT128) -#define BORINGSSL_CURVE25519_64BIT -#endif - -#if defined(BORINGSSL_CURVE25519_64BIT) -// An element t, -// entries t[0]...t[4], represents the integer t[0]+2^51 t[1]+2^102 t[2]+2^153 -// t[3]+2^204 t[4]. -// fe limbs are bounded by 1.125*2^51. -// fe_loose limbs are bounded by 3.375*2^51. -typedef uint64_t fe_limb_t; -#define FE_NUM_LIMBS 5 -#else -// An element t, -// entries t[0]...t[9], represents the integer t[0]+2^26 t[1]+2^51 t[2]+2^77 -// t[3]+2^102 t[4]+...+2^230 t[9]. -// fe limbs are bounded by 1.125*2^26,1.125*2^25,1.125*2^26,1.125*2^25,etc. -// fe_loose limbs are bounded by 3.375*2^26,3.375*2^25,3.375*2^26,3.375*2^25,etc. -typedef uint32_t fe_limb_t; -#define FE_NUM_LIMBS 10 -#endif - -// fe means field element. Here the field is \Z/(2^255-19). -// Multiplication and carrying produce fe from fe_loose. -// Keep in sync with `Elem` and `ELEM_LIMBS` in curve25519/ops.rs. -typedef struct fe { fe_limb_t v[FE_NUM_LIMBS]; } fe; - -// Addition and subtraction produce fe_loose from (fe, fe). -// Keep in sync with `Elem` and `ELEM_LIMBS` in curve25519/ops.rs. -typedef struct fe_loose { fe_limb_t v[FE_NUM_LIMBS]; } fe_loose; - -static inline void fe_limbs_copy(fe_limb_t r[], const fe_limb_t a[]) { - for (size_t i = 0; i < FE_NUM_LIMBS; ++i) { - r[i] = a[i]; - } -} - -// ge means group element. -// -// Here the group is the set of pairs (x,y) of field elements (see fe.h) -// satisfying -x^2 + y^2 = 1 + d x^2y^2 -// where d = -121665/121666. -// -// Representations: -// ge_p2 (projective): (X:Y:Z) satisfying x=X/Z, y=Y/Z -// ge_p3 (extended): (X:Y:Z:T) satisfying x=X/Z, y=Y/Z, XY=ZT -// ge_p1p1 (completed): ((X:Z),(Y:T)) satisfying x=X/Z, y=Y/T -// ge_precomp (Duif): (y+x,y-x,2dxy) - -// Keep in sync with `Point` in curve25519/ops.rs. -typedef struct { - fe X; - fe Y; - fe Z; -} ge_p2; - - -// Keep in sync with `ExtPoint` in curve25519/ops.rs. -typedef struct { - fe X; - fe Y; - fe Z; - fe T; -} ge_p3; - -typedef struct { - fe_loose X; - fe_loose Y; - fe_loose Z; - fe_loose T; -} ge_p1p1; - -typedef struct { - fe_loose yplusx; - fe_loose yminusx; - fe_loose xy2d; -} ge_precomp; - -typedef struct { - fe_loose YplusX; - fe_loose YminusX; - fe_loose Z; - fe_loose T2d; -} ge_cached; - -#endif // OPENSSL_HEADER_CURVE25519_INTERNAL_H diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/aes/aes_nohw.c temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/aes/aes_nohw.c --- temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/aes/aes_nohw.c 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/aes/aes_nohw.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,961 +0,0 @@ -/* Copyright (c) 2019, Google Inc. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY - * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION - * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ - -#include - -#include "../../internal.h" - -#if defined(OPENSSL_SSE2) -#include -#endif - - -// This file contains a constant-time implementation of AES, bitsliced with -// 32-bit, 64-bit, or 128-bit words, operating on two-, four-, and eight-block -// batches, respectively. The 128-bit implementation requires SSE2 intrinsics. -// -// This implementation is based on the algorithms described in the following -// references: -// - https://bearssl.org/constanttime.html#aes -// - https://eprint.iacr.org/2009/129.pdf -// - https://eprint.iacr.org/2009/191.pdf - - -// Word operations. -// -// An aes_word_t is the word used for this AES implementation. Throughout this -// file, bits and bytes are ordered little-endian, though "left" and "right" -// shifts match the operations themselves, which makes them reversed in a -// little-endian, left-to-right reading. -// -// Eight |aes_word_t|s contain |AES_NOHW_BATCH_SIZE| blocks. The bits in an -// |aes_word_t| are divided into 16 consecutive groups of |AES_NOHW_BATCH_SIZE| -// bits each, each corresponding to a byte in an AES block in column-major -// order (AES's byte order). We refer to these as "logical bytes". Note, in the -// 32-bit and 64-bit implementations, they are smaller than a byte. (The -// contents of a logical byte will be described later.) -// -// MSVC does not support C bit operators on |__m128i|, so the wrapper functions -// |aes_nohw_and|, etc., should be used instead. Note |aes_nohw_shift_left| and -// |aes_nohw_shift_right| measure the shift in logical bytes. That is, the shift -// value ranges from 0 to 15 independent of |aes_word_t| and -// |AES_NOHW_BATCH_SIZE|. -// -// This ordering is different from https://eprint.iacr.org/2009/129.pdf, which -// uses row-major order. Matching the AES order was easier to reason about, and -// we do not have PSHUFB available to arbitrarily permute bytes. - -#if defined(OPENSSL_SSE2) -typedef __m128i aes_word_t; -// AES_NOHW_WORD_SIZE is sizeof(aes_word_t). alignas(sizeof(T)) does not work in -// MSVC, so we define a constant. -#define AES_NOHW_WORD_SIZE 16 -#define AES_NOHW_BATCH_SIZE 8 -#define AES_NOHW_ROW0_MASK \ - _mm_set_epi32(0x000000ff, 0x000000ff, 0x000000ff, 0x000000ff) -#define AES_NOHW_ROW1_MASK \ - _mm_set_epi32(0x0000ff00, 0x0000ff00, 0x0000ff00, 0x0000ff00) -#define AES_NOHW_ROW2_MASK \ - _mm_set_epi32(0x00ff0000, 0x00ff0000, 0x00ff0000, 0x00ff0000) -#define AES_NOHW_ROW3_MASK \ - _mm_set_epi32(0xff000000, 0xff000000, 0xff000000, 0xff000000) -#define AES_NOHW_COL01_MASK \ - _mm_set_epi32(0x00000000, 0x00000000, 0xffffffff, 0xffffffff) -#define AES_NOHW_COL2_MASK \ - _mm_set_epi32(0x00000000, 0xffffffff, 0x00000000, 0x00000000) -#define AES_NOHW_COL3_MASK \ - _mm_set_epi32(0xffffffff, 0x00000000, 0x00000000, 0x00000000) - -static inline aes_word_t aes_nohw_and(aes_word_t a, aes_word_t b) { - return _mm_and_si128(a, b); -} - -static inline aes_word_t aes_nohw_or(aes_word_t a, aes_word_t b) { - return _mm_or_si128(a, b); -} - -static inline aes_word_t aes_nohw_xor(aes_word_t a, aes_word_t b) { - return _mm_xor_si128(a, b); -} - -static inline aes_word_t aes_nohw_not(aes_word_t a) { - return _mm_xor_si128( - a, _mm_set_epi32(0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff)); -} - -// These are macros because parameters to |_mm_slli_si128| and |_mm_srli_si128| -// must be constants. -#define aes_nohw_shift_left(/* aes_word_t */ a, /* const */ i) \ - _mm_slli_si128((a), (i)) -#define aes_nohw_shift_right(/* aes_word_t */ a, /* const */ i) \ - _mm_srli_si128((a), (i)) -#else // !OPENSSL_SSE2 -#if defined(OPENSSL_64_BIT) -typedef uint64_t aes_word_t; -#define AES_NOHW_WORD_SIZE 8 -#define AES_NOHW_BATCH_SIZE 4 -#define AES_NOHW_ROW0_MASK UINT64_C(0x000f000f000f000f) -#define AES_NOHW_ROW1_MASK UINT64_C(0x00f000f000f000f0) -#define AES_NOHW_ROW2_MASK UINT64_C(0x0f000f000f000f00) -#define AES_NOHW_ROW3_MASK UINT64_C(0xf000f000f000f000) -#define AES_NOHW_COL01_MASK UINT64_C(0x00000000ffffffff) -#define AES_NOHW_COL2_MASK UINT64_C(0x0000ffff00000000) -#define AES_NOHW_COL3_MASK UINT64_C(0xffff000000000000) -#else // !OPENSSL_64_BIT -typedef uint32_t aes_word_t; -#define AES_NOHW_WORD_SIZE 4 -#define AES_NOHW_BATCH_SIZE 2 -#define AES_NOHW_ROW0_MASK 0x03030303 -#define AES_NOHW_ROW1_MASK 0x0c0c0c0c -#define AES_NOHW_ROW2_MASK 0x30303030 -#define AES_NOHW_ROW3_MASK 0xc0c0c0c0 -#define AES_NOHW_COL01_MASK 0x0000ffff -#define AES_NOHW_COL2_MASK 0x00ff0000 -#define AES_NOHW_COL3_MASK 0xff000000 -#endif // OPENSSL_64_BIT - -static inline aes_word_t aes_nohw_and(aes_word_t a, aes_word_t b) { - return a & b; -} - -static inline aes_word_t aes_nohw_or(aes_word_t a, aes_word_t b) { - return a | b; -} - -static inline aes_word_t aes_nohw_xor(aes_word_t a, aes_word_t b) { - return a ^ b; -} - -static inline aes_word_t aes_nohw_not(aes_word_t a) { return ~a; } - -static inline aes_word_t aes_nohw_shift_left(aes_word_t a, aes_word_t i) { - return a << (i * AES_NOHW_BATCH_SIZE); -} - -static inline aes_word_t aes_nohw_shift_right(aes_word_t a, aes_word_t i) { - return a >> (i * AES_NOHW_BATCH_SIZE); -} -#endif // OPENSSL_SSE2 - -OPENSSL_STATIC_ASSERT(AES_NOHW_BATCH_SIZE * 128 == 8 * 8 * sizeof(aes_word_t), - "batch size does not match word size"); -OPENSSL_STATIC_ASSERT(AES_NOHW_WORD_SIZE == sizeof(aes_word_t), - "AES_NOHW_WORD_SIZE is incorrect"); - - -// Block representations. -// -// This implementation uses three representations for AES blocks. First, the -// public API represents blocks as uint8_t[16] in the usual way. Second, most -// AES steps are evaluated in bitsliced form, stored in an |AES_NOHW_BATCH|. -// This stores |AES_NOHW_BATCH_SIZE| blocks in bitsliced order. For 64-bit words -// containing bitsliced blocks a, b, c, d, this would be as follows (vertical -// bars divide logical bytes): -// -// batch.w[0] = a0 b0 c0 d0 | a8 b8 c8 d8 | a16 b16 c16 d16 ... -// batch.w[1] = a1 b1 c1 d1 | a9 b9 c9 d9 | a17 b17 c17 d17 ... -// batch.w[2] = a2 b2 c2 d2 | a10 b10 c10 d10 | a18 b18 c18 d18 ... -// batch.w[3] = a3 b3 c3 d3 | a11 b11 c11 d11 | a19 b19 c19 d19 ... -// ... -// -// Finally, an individual block may be stored as an intermediate form in an -// aes_word_t[AES_NOHW_BLOCK_WORDS]. In this form, we permute the bits in each -// block, so that block[0]'s ith logical byte contains least-significant -// |AES_NOHW_BATCH_SIZE| bits of byte i, block[1] contains the next group of -// |AES_NOHW_BATCH_SIZE| bits, and so on. We refer to this transformation as -// "compacting" the block. Note this is no-op with 128-bit words because then -// |AES_NOHW_BLOCK_WORDS| is one and |AES_NOHW_BATCH_SIZE| is eight. For 64-bit -// words, one block would be stored in two words: -// -// block[0] = a0 a1 a2 a3 | a8 a9 a10 a11 | a16 a17 a18 a19 ... -// block[1] = a4 a5 a6 a7 | a12 a13 a14 a15 | a20 a21 a22 a23 ... -// -// Observe that the distances between corresponding bits in bitsliced and -// compact bit orders match. If we line up corresponding words of each block, -// the bitsliced and compact representations may be converted by tranposing bits -// in corresponding logical bytes. Continuing the 64-bit example: -// -// block_a[0] = a0 a1 a2 a3 | a8 a9 a10 a11 | a16 a17 a18 a19 ... -// block_b[0] = b0 b1 b2 b3 | b8 b9 b10 b11 | b16 b17 b18 b19 ... -// block_c[0] = c0 c1 c2 c3 | c8 c9 c10 c11 | c16 c17 c18 c19 ... -// block_d[0] = d0 d1 d2 d3 | d8 d9 d10 d11 | d16 d17 d18 d19 ... -// -// batch.w[0] = a0 b0 c0 d0 | a8 b8 c8 d8 | a16 b16 c16 d16 ... -// batch.w[1] = a1 b1 c1 d1 | a9 b9 c9 d9 | a17 b17 c17 d17 ... -// batch.w[2] = a2 b2 c2 d2 | a10 b10 c10 d10 | a18 b18 c18 d18 ... -// batch.w[3] = a3 b3 c3 d3 | a11 b11 c11 d11 | a19 b19 c19 d19 ... -// -// Note also that bitwise operations and (logical) byte permutations on an -// |aes_word_t| work equally for the bitsliced and compact words. -// -// We use the compact form in the |AES_KEY| representation to save work -// inflating round keys into |AES_NOHW_BATCH|. The compact form also exists -// temporarily while moving blocks in or out of an |AES_NOHW_BATCH|, immediately -// before or after |aes_nohw_transpose|. - -#define AES_NOHW_BLOCK_WORDS (16 / sizeof(aes_word_t)) - -// An AES_NOHW_BATCH stores |AES_NOHW_BATCH_SIZE| blocks. Unless otherwise -// specified, it is in bitsliced form. -typedef struct { - aes_word_t w[8]; -} AES_NOHW_BATCH; - -// An AES_NOHW_SCHEDULE is an expanded bitsliced AES key schedule. It is -// suitable for encryption or decryption. It is as large as |AES_NOHW_BATCH| -// |AES_KEY|s so it should not be used as a long-term key representation. -typedef struct { - // keys is an array of batches, one for each round key. Each batch stores - // |AES_NOHW_BATCH_SIZE| copies of the round key in bitsliced form. - AES_NOHW_BATCH keys[AES_MAXNR + 1]; -} AES_NOHW_SCHEDULE; - -// aes_nohw_batch_set sets the |i|th block of |batch| to |in|. |batch| is in -// compact form. -static inline void aes_nohw_batch_set(AES_NOHW_BATCH *batch, - const aes_word_t in[AES_NOHW_BLOCK_WORDS], - size_t i) { - // Note the words are interleaved. The order comes from |aes_nohw_transpose|. - // If |i| is zero and this is the 64-bit implementation, in[0] contains bits - // 0-3 and in[1] contains bits 4-7. We place in[0] at w[0] and in[1] at - // w[4] so that bits 0 and 4 are in the correct position. (In general, bits - // along diagonals of |AES_NOHW_BATCH_SIZE| by |AES_NOHW_BATCH_SIZE| squares - // will be correctly placed.) - dev_assert_secret(i < AES_NOHW_BATCH_SIZE); -#if defined(OPENSSL_SSE2) - batch->w[i] = in[0]; -#elif defined(OPENSSL_64_BIT) - batch->w[i] = in[0]; - batch->w[i + 4] = in[1]; -#else - batch->w[i] = in[0]; - batch->w[i + 2] = in[1]; - batch->w[i + 4] = in[2]; - batch->w[i + 6] = in[3]; -#endif -} - -// aes_nohw_batch_get writes the |i|th block of |batch| to |out|. |batch| is in -// compact form. -static inline void aes_nohw_batch_get(const AES_NOHW_BATCH *batch, - aes_word_t out[AES_NOHW_BLOCK_WORDS], - size_t i) { - dev_assert_secret(i < AES_NOHW_BATCH_SIZE); -#if defined(OPENSSL_SSE2) - out[0] = batch->w[i]; -#elif defined(OPENSSL_64_BIT) - out[0] = batch->w[i]; - out[1] = batch->w[i + 4]; -#else - out[0] = batch->w[i]; - out[1] = batch->w[i + 2]; - out[2] = batch->w[i + 4]; - out[3] = batch->w[i + 6]; -#endif -} - -#if !defined(OPENSSL_SSE2) -// aes_nohw_delta_swap returns |a| with bits |a & mask| and -// |a & (mask << shift)| swapped. |mask| and |mask << shift| may not overlap. -static inline aes_word_t aes_nohw_delta_swap(aes_word_t a, aes_word_t mask, - aes_word_t shift) { - // See - // https://reflectionsonsecurity.wordpress.com/2014/05/11/efficient-bit-permutation-using-delta-swaps/ - aes_word_t b = (a ^ (a >> shift)) & mask; - return a ^ b ^ (b << shift); -} - -// In the 32-bit and 64-bit implementations, a block spans multiple words. -// |aes_nohw_compact_block| must permute bits across different words. First we -// implement |aes_nohw_compact_word| which performs a smaller version of the -// transformation which stays within a single word. -// -// These transformations are generalizations of the output of -// http://programming.sirrida.de/calcperm.php on smaller inputs. -#if defined(OPENSSL_64_BIT) -static inline uint64_t aes_nohw_compact_word(uint64_t a) { - // Numbering the 64/2 = 16 4-bit chunks, least to most significant, we swap - // quartets of those chunks: - // 0 1 2 3 | 4 5 6 7 | 8 9 10 11 | 12 13 14 15 => - // 0 2 1 3 | 4 6 5 7 | 8 10 9 11 | 12 14 13 15 - a = aes_nohw_delta_swap(a, UINT64_C(0x00f000f000f000f0), 4); - // Swap quartets of 8-bit chunks (still numbering by 4-bit chunks): - // 0 2 1 3 | 4 6 5 7 | 8 10 9 11 | 12 14 13 15 => - // 0 2 4 6 | 1 3 5 7 | 8 10 12 14 | 9 11 13 15 - a = aes_nohw_delta_swap(a, UINT64_C(0x0000ff000000ff00), 8); - // Swap quartets of 16-bit chunks (still numbering by 4-bit chunks): - // 0 2 4 6 | 1 3 5 7 | 8 10 12 14 | 9 11 13 15 => - // 0 2 4 6 | 8 10 12 14 | 1 3 5 7 | 9 11 13 15 - a = aes_nohw_delta_swap(a, UINT64_C(0x00000000ffff0000), 16); - return a; -} - -static inline uint64_t aes_nohw_uncompact_word(uint64_t a) { - // Reverse the steps of |aes_nohw_uncompact_word|. - a = aes_nohw_delta_swap(a, UINT64_C(0x00000000ffff0000), 16); - a = aes_nohw_delta_swap(a, UINT64_C(0x0000ff000000ff00), 8); - a = aes_nohw_delta_swap(a, UINT64_C(0x00f000f000f000f0), 4); - return a; -} -#else // !OPENSSL_64_BIT -static inline uint32_t aes_nohw_compact_word(uint32_t a) { - // Numbering the 32/2 = 16 pairs of bits, least to most significant, we swap: - // 0 1 2 3 | 4 5 6 7 | 8 9 10 11 | 12 13 14 15 => - // 0 4 2 6 | 1 5 3 7 | 8 12 10 14 | 9 13 11 15 - // Note: 0x00cc = 0b0000_0000_1100_1100 - // 0x00cc << 6 = 0b0011_0011_0000_0000 - a = aes_nohw_delta_swap(a, 0x00cc00cc, 6); - // Now we swap groups of four bits (still numbering by pairs): - // 0 4 2 6 | 1 5 3 7 | 8 12 10 14 | 9 13 11 15 => - // 0 4 8 12 | 1 5 9 13 | 2 6 10 14 | 3 7 11 15 - // Note: 0x0000_f0f0 << 12 = 0x0f0f_0000 - a = aes_nohw_delta_swap(a, 0x0000f0f0, 12); - return a; -} - -static inline uint32_t aes_nohw_uncompact_word(uint32_t a) { - // Reverse the steps of |aes_nohw_uncompact_word|. - a = aes_nohw_delta_swap(a, 0x0000f0f0, 12); - a = aes_nohw_delta_swap(a, 0x00cc00cc, 6); - return a; -} - -static inline uint32_t aes_nohw_word_from_bytes(uint8_t a0, uint8_t a1, - uint8_t a2, uint8_t a3) { - return (uint32_t)a0 | ((uint32_t)a1 << 8) | ((uint32_t)a2 << 16) | - ((uint32_t)a3 << 24); -} - -static inline uint8_t lo(uint32_t a) { - return (uint8_t)a; -} - -#endif // OPENSSL_64_BIT -#endif // !OPENSSL_SSE2 - -static inline void aes_nohw_compact_block(aes_word_t out[AES_NOHW_BLOCK_WORDS], - const uint8_t in[16]) { - GFp_memcpy(out, in, 16); -#if defined(OPENSSL_SSE2) - // No conversions needed. -#elif defined(OPENSSL_64_BIT) - uint64_t a0 = aes_nohw_compact_word(out[0]); - uint64_t a1 = aes_nohw_compact_word(out[1]); - out[0] = (a0 & UINT64_C(0x00000000ffffffff)) | (a1 << 32); - out[1] = (a1 & UINT64_C(0xffffffff00000000)) | (a0 >> 32); -#else - uint32_t a0 = aes_nohw_compact_word(out[0]); - uint32_t a1 = aes_nohw_compact_word(out[1]); - uint32_t a2 = aes_nohw_compact_word(out[2]); - uint32_t a3 = aes_nohw_compact_word(out[3]); - // Note clang, when building for ARM Thumb2, will sometimes miscompile - // expressions such as (a0 & 0x0000ff00) << 8, particularly when building - // without optimizations. This bug was introduced in - // https://reviews.llvm.org/rL340261 and fixed in - // https://reviews.llvm.org/rL351310. The following is written to avoid this. - out[0] = aes_nohw_word_from_bytes(lo(a0), lo(a1), lo(a2), lo(a3)); - out[1] = aes_nohw_word_from_bytes(lo(a0 >> 8), lo(a1 >> 8), lo(a2 >> 8), lo(a3 >> 8)); - out[2] = aes_nohw_word_from_bytes(lo(a0 >> 16), lo(a1 >> 16), lo(a2 >> 16), lo(a3 >> 16)); - out[3] = aes_nohw_word_from_bytes(lo(a0 >> 24), lo(a1 >> 24), lo(a2 >> 24), lo(a3 >> 24)); -#endif -} - -static inline void aes_nohw_uncompact_block( - uint8_t out[16], const aes_word_t in[AES_NOHW_BLOCK_WORDS]) { -#if defined(OPENSSL_SSE2) - GFp_memcpy(out, in, 16); // No conversions needed. -#elif defined(OPENSSL_64_BIT) - uint64_t a0 = in[0]; - uint64_t a1 = in[1]; - uint64_t b0 = - aes_nohw_uncompact_word((a0 & UINT64_C(0x00000000ffffffff)) | (a1 << 32)); - uint64_t b1 = - aes_nohw_uncompact_word((a1 & UINT64_C(0xffffffff00000000)) | (a0 >> 32)); - GFp_memcpy(out, &b0, 8); - GFp_memcpy(out + 8, &b1, 8); -#else - uint32_t a0 = in[0]; - uint32_t a1 = in[1]; - uint32_t a2 = in[2]; - uint32_t a3 = in[3]; - // Note clang, when building for ARM Thumb2, will sometimes miscompile - // expressions such as (a0 & 0x0000ff00) << 8, particularly when building - // without optimizations. This bug was introduced in - // https://reviews.llvm.org/rL340261 and fixed in - // https://reviews.llvm.org/rL351310. The following is written to avoid this. - uint32_t b0 = aes_nohw_word_from_bytes(lo(a0), lo(a1), lo(a2), lo(a3)); - uint32_t b1 = aes_nohw_word_from_bytes(lo(a0 >> 8), lo(a1 >> 8), lo(a2 >> 8), lo(a3 >> 8)); - uint32_t b2 = - aes_nohw_word_from_bytes(lo(a0 >> 16), lo(a1 >> 16), lo(a2 >> 16), lo(a3 >> 16)); - uint32_t b3 = - aes_nohw_word_from_bytes(lo(a0 >> 24), lo(a1 >> 24), lo(a2 >> 24), lo(a3 >> 24)); - b0 = aes_nohw_uncompact_word(b0); - b1 = aes_nohw_uncompact_word(b1); - b2 = aes_nohw_uncompact_word(b2); - b3 = aes_nohw_uncompact_word(b3); - GFp_memcpy(out, &b0, 4); - GFp_memcpy(out + 4, &b1, 4); - GFp_memcpy(out + 8, &b2, 4); - GFp_memcpy(out + 12, &b3, 4); -#endif -} - -// aes_nohw_swap_bits is a variation on a delta swap. It swaps the bits in -// |*a & (mask << shift)| with the bits in |*b & mask|. |mask| and -// |mask << shift| must not overlap. |mask| is specified as a |uint32_t|, but it -// is repeated to the full width of |aes_word_t|. -#if defined(OPENSSL_SSE2) -// This must be a macro because |_mm_srli_epi32| and |_mm_slli_epi32| require -// constant shift values. -#define aes_nohw_swap_bits(/*__m128i* */ a, /*__m128i* */ b, \ - /* uint32_t */ mask, /* const */ shift) \ - do { \ - __m128i swap = \ - _mm_and_si128(_mm_xor_si128(_mm_srli_epi32(*(a), (shift)), *(b)), \ - _mm_set_epi32((mask), (mask), (mask), (mask))); \ - *(a) = _mm_xor_si128(*(a), _mm_slli_epi32(swap, (shift))); \ - *(b) = _mm_xor_si128(*(b), swap); \ - \ - } while (0) -#else -static inline void aes_nohw_swap_bits(aes_word_t *a, aes_word_t *b, - uint32_t mask, aes_word_t shift) { -#if defined(OPENSSL_64_BIT) - aes_word_t mask_w = (((uint64_t)mask) << 32) | mask; -#else - aes_word_t mask_w = mask; -#endif - // This is a variation on a delta swap. - aes_word_t swap = ((*a >> shift) ^ *b) & mask_w; - *a ^= swap << shift; - *b ^= swap; -} -#endif // OPENSSL_SSE2 - -// aes_nohw_transpose converts |batch| to and from bitsliced form. It divides -// the 8 × word_size bits into AES_NOHW_BATCH_SIZE × AES_NOHW_BATCH_SIZE squares -// and transposes each square. -static void aes_nohw_transpose(AES_NOHW_BATCH *batch) { - // Swap bits with index 0 and 1 mod 2 (0x55 = 0b01010101). - aes_nohw_swap_bits(&batch->w[0], &batch->w[1], 0x55555555, 1); - aes_nohw_swap_bits(&batch->w[2], &batch->w[3], 0x55555555, 1); - aes_nohw_swap_bits(&batch->w[4], &batch->w[5], 0x55555555, 1); - aes_nohw_swap_bits(&batch->w[6], &batch->w[7], 0x55555555, 1); - -#if AES_NOHW_BATCH_SIZE >= 4 - // Swap bits with index 0-1 and 2-3 mod 4 (0x33 = 0b00110011). - aes_nohw_swap_bits(&batch->w[0], &batch->w[2], 0x33333333, 2); - aes_nohw_swap_bits(&batch->w[1], &batch->w[3], 0x33333333, 2); - aes_nohw_swap_bits(&batch->w[4], &batch->w[6], 0x33333333, 2); - aes_nohw_swap_bits(&batch->w[5], &batch->w[7], 0x33333333, 2); -#endif - -#if AES_NOHW_BATCH_SIZE >= 8 - // Swap bits with index 0-3 and 4-7 mod 8 (0x0f = 0b00001111). - aes_nohw_swap_bits(&batch->w[0], &batch->w[4], 0x0f0f0f0f, 4); - aes_nohw_swap_bits(&batch->w[1], &batch->w[5], 0x0f0f0f0f, 4); - aes_nohw_swap_bits(&batch->w[2], &batch->w[6], 0x0f0f0f0f, 4); - aes_nohw_swap_bits(&batch->w[3], &batch->w[7], 0x0f0f0f0f, 4); -#endif -} - -// aes_nohw_to_batch initializes |out| with the |num_blocks| blocks from |in|. -// |num_blocks| must be at most |AES_NOHW_BATCH|. -static void aes_nohw_to_batch(AES_NOHW_BATCH *out, const uint8_t *in, - size_t num_blocks) { - // Don't leave unused blocks uninitialized. - GFp_memset(out, 0, sizeof(AES_NOHW_BATCH)); - debug_assert_nonsecret(num_blocks <= AES_NOHW_BATCH_SIZE); - for (size_t i = 0; i < num_blocks; i++) { - aes_word_t block[AES_NOHW_BLOCK_WORDS]; - aes_nohw_compact_block(block, in + 16 * i); - aes_nohw_batch_set(out, block, i); - } - - aes_nohw_transpose(out); -} - -// aes_nohw_to_batch writes the first |num_blocks| blocks in |batch| to |out|. -// |num_blocks| must be at most |AES_NOHW_BATCH|. -static void aes_nohw_from_batch(uint8_t *out, size_t num_blocks, - const AES_NOHW_BATCH *batch) { - AES_NOHW_BATCH copy = *batch; - aes_nohw_transpose(©); - - debug_assert_nonsecret(num_blocks <= AES_NOHW_BATCH_SIZE); - for (size_t i = 0; i < num_blocks; i++) { - aes_word_t block[AES_NOHW_BLOCK_WORDS]; - aes_nohw_batch_get(©, block, i); - aes_nohw_uncompact_block(out + 16 * i, block); - } -} - - -// AES round steps. - -static void aes_nohw_add_round_key(AES_NOHW_BATCH *batch, - const AES_NOHW_BATCH *key) { - for (size_t i = 0; i < 8; i++) { - batch->w[i] = aes_nohw_xor(batch->w[i], key->w[i]); - } -} - -static void aes_nohw_sub_bytes(AES_NOHW_BATCH *batch) { - // See https://eprint.iacr.org/2009/191.pdf, Appendix C. - aes_word_t x0 = batch->w[7]; - aes_word_t x1 = batch->w[6]; - aes_word_t x2 = batch->w[5]; - aes_word_t x3 = batch->w[4]; - aes_word_t x4 = batch->w[3]; - aes_word_t x5 = batch->w[2]; - aes_word_t x6 = batch->w[1]; - aes_word_t x7 = batch->w[0]; - - // Figure 2, the top linear transformation. - aes_word_t y14 = aes_nohw_xor(x3, x5); - aes_word_t y13 = aes_nohw_xor(x0, x6); - aes_word_t y9 = aes_nohw_xor(x0, x3); - aes_word_t y8 = aes_nohw_xor(x0, x5); - aes_word_t t0 = aes_nohw_xor(x1, x2); - aes_word_t y1 = aes_nohw_xor(t0, x7); - aes_word_t y4 = aes_nohw_xor(y1, x3); - aes_word_t y12 = aes_nohw_xor(y13, y14); - aes_word_t y2 = aes_nohw_xor(y1, x0); - aes_word_t y5 = aes_nohw_xor(y1, x6); - aes_word_t y3 = aes_nohw_xor(y5, y8); - aes_word_t t1 = aes_nohw_xor(x4, y12); - aes_word_t y15 = aes_nohw_xor(t1, x5); - aes_word_t y20 = aes_nohw_xor(t1, x1); - aes_word_t y6 = aes_nohw_xor(y15, x7); - aes_word_t y10 = aes_nohw_xor(y15, t0); - aes_word_t y11 = aes_nohw_xor(y20, y9); - aes_word_t y7 = aes_nohw_xor(x7, y11); - aes_word_t y17 = aes_nohw_xor(y10, y11); - aes_word_t y19 = aes_nohw_xor(y10, y8); - aes_word_t y16 = aes_nohw_xor(t0, y11); - aes_word_t y21 = aes_nohw_xor(y13, y16); - aes_word_t y18 = aes_nohw_xor(x0, y16); - - // Figure 3, the middle non-linear section. - aes_word_t t2 = aes_nohw_and(y12, y15); - aes_word_t t3 = aes_nohw_and(y3, y6); - aes_word_t t4 = aes_nohw_xor(t3, t2); - aes_word_t t5 = aes_nohw_and(y4, x7); - aes_word_t t6 = aes_nohw_xor(t5, t2); - aes_word_t t7 = aes_nohw_and(y13, y16); - aes_word_t t8 = aes_nohw_and(y5, y1); - aes_word_t t9 = aes_nohw_xor(t8, t7); - aes_word_t t10 = aes_nohw_and(y2, y7); - aes_word_t t11 = aes_nohw_xor(t10, t7); - aes_word_t t12 = aes_nohw_and(y9, y11); - aes_word_t t13 = aes_nohw_and(y14, y17); - aes_word_t t14 = aes_nohw_xor(t13, t12); - aes_word_t t15 = aes_nohw_and(y8, y10); - aes_word_t t16 = aes_nohw_xor(t15, t12); - aes_word_t t17 = aes_nohw_xor(t4, t14); - aes_word_t t18 = aes_nohw_xor(t6, t16); - aes_word_t t19 = aes_nohw_xor(t9, t14); - aes_word_t t20 = aes_nohw_xor(t11, t16); - aes_word_t t21 = aes_nohw_xor(t17, y20); - aes_word_t t22 = aes_nohw_xor(t18, y19); - aes_word_t t23 = aes_nohw_xor(t19, y21); - aes_word_t t24 = aes_nohw_xor(t20, y18); - aes_word_t t25 = aes_nohw_xor(t21, t22); - aes_word_t t26 = aes_nohw_and(t21, t23); - aes_word_t t27 = aes_nohw_xor(t24, t26); - aes_word_t t28 = aes_nohw_and(t25, t27); - aes_word_t t29 = aes_nohw_xor(t28, t22); - aes_word_t t30 = aes_nohw_xor(t23, t24); - aes_word_t t31 = aes_nohw_xor(t22, t26); - aes_word_t t32 = aes_nohw_and(t31, t30); - aes_word_t t33 = aes_nohw_xor(t32, t24); - aes_word_t t34 = aes_nohw_xor(t23, t33); - aes_word_t t35 = aes_nohw_xor(t27, t33); - aes_word_t t36 = aes_nohw_and(t24, t35); - aes_word_t t37 = aes_nohw_xor(t36, t34); - aes_word_t t38 = aes_nohw_xor(t27, t36); - aes_word_t t39 = aes_nohw_and(t29, t38); - aes_word_t t40 = aes_nohw_xor(t25, t39); - aes_word_t t41 = aes_nohw_xor(t40, t37); - aes_word_t t42 = aes_nohw_xor(t29, t33); - aes_word_t t43 = aes_nohw_xor(t29, t40); - aes_word_t t44 = aes_nohw_xor(t33, t37); - aes_word_t t45 = aes_nohw_xor(t42, t41); - aes_word_t z0 = aes_nohw_and(t44, y15); - aes_word_t z1 = aes_nohw_and(t37, y6); - aes_word_t z2 = aes_nohw_and(t33, x7); - aes_word_t z3 = aes_nohw_and(t43, y16); - aes_word_t z4 = aes_nohw_and(t40, y1); - aes_word_t z5 = aes_nohw_and(t29, y7); - aes_word_t z6 = aes_nohw_and(t42, y11); - aes_word_t z7 = aes_nohw_and(t45, y17); - aes_word_t z8 = aes_nohw_and(t41, y10); - aes_word_t z9 = aes_nohw_and(t44, y12); - aes_word_t z10 = aes_nohw_and(t37, y3); - aes_word_t z11 = aes_nohw_and(t33, y4); - aes_word_t z12 = aes_nohw_and(t43, y13); - aes_word_t z13 = aes_nohw_and(t40, y5); - aes_word_t z14 = aes_nohw_and(t29, y2); - aes_word_t z15 = aes_nohw_and(t42, y9); - aes_word_t z16 = aes_nohw_and(t45, y14); - aes_word_t z17 = aes_nohw_and(t41, y8); - - // Figure 4, bottom linear transformation. - aes_word_t t46 = aes_nohw_xor(z15, z16); - aes_word_t t47 = aes_nohw_xor(z10, z11); - aes_word_t t48 = aes_nohw_xor(z5, z13); - aes_word_t t49 = aes_nohw_xor(z9, z10); - aes_word_t t50 = aes_nohw_xor(z2, z12); - aes_word_t t51 = aes_nohw_xor(z2, z5); - aes_word_t t52 = aes_nohw_xor(z7, z8); - aes_word_t t53 = aes_nohw_xor(z0, z3); - aes_word_t t54 = aes_nohw_xor(z6, z7); - aes_word_t t55 = aes_nohw_xor(z16, z17); - aes_word_t t56 = aes_nohw_xor(z12, t48); - aes_word_t t57 = aes_nohw_xor(t50, t53); - aes_word_t t58 = aes_nohw_xor(z4, t46); - aes_word_t t59 = aes_nohw_xor(z3, t54); - aes_word_t t60 = aes_nohw_xor(t46, t57); - aes_word_t t61 = aes_nohw_xor(z14, t57); - aes_word_t t62 = aes_nohw_xor(t52, t58); - aes_word_t t63 = aes_nohw_xor(t49, t58); - aes_word_t t64 = aes_nohw_xor(z4, t59); - aes_word_t t65 = aes_nohw_xor(t61, t62); - aes_word_t t66 = aes_nohw_xor(z1, t63); - aes_word_t s0 = aes_nohw_xor(t59, t63); - aes_word_t s6 = aes_nohw_xor(t56, aes_nohw_not(t62)); - aes_word_t s7 = aes_nohw_xor(t48, aes_nohw_not(t60)); - aes_word_t t67 = aes_nohw_xor(t64, t65); - aes_word_t s3 = aes_nohw_xor(t53, t66); - aes_word_t s4 = aes_nohw_xor(t51, t66); - aes_word_t s5 = aes_nohw_xor(t47, t65); - aes_word_t s1 = aes_nohw_xor(t64, aes_nohw_not(s3)); - aes_word_t s2 = aes_nohw_xor(t55, aes_nohw_not(t67)); - - batch->w[0] = s7; - batch->w[1] = s6; - batch->w[2] = s5; - batch->w[3] = s4; - batch->w[4] = s3; - batch->w[5] = s2; - batch->w[6] = s1; - batch->w[7] = s0; -} - -// aes_nohw_rotate_cols_right returns |v| with the columns in each row rotated -// to the right by |n|. This is a macro because |aes_nohw_shift_*| require -// constant shift counts in the SSE2 implementation. -#define aes_nohw_rotate_cols_right(/* aes_word_t */ v, /* const */ n) \ - (aes_nohw_or(aes_nohw_shift_right((v), (n)*4), \ - aes_nohw_shift_left((v), 16 - (n)*4))) - -static void aes_nohw_shift_rows(AES_NOHW_BATCH *batch) { - for (size_t i = 0; i < 8; i++) { - aes_word_t row0 = aes_nohw_and(batch->w[i], AES_NOHW_ROW0_MASK); - aes_word_t row1 = aes_nohw_and(batch->w[i], AES_NOHW_ROW1_MASK); - aes_word_t row2 = aes_nohw_and(batch->w[i], AES_NOHW_ROW2_MASK); - aes_word_t row3 = aes_nohw_and(batch->w[i], AES_NOHW_ROW3_MASK); - row1 = aes_nohw_rotate_cols_right(row1, 1); - row2 = aes_nohw_rotate_cols_right(row2, 2); - row3 = aes_nohw_rotate_cols_right(row3, 3); - batch->w[i] = aes_nohw_or(aes_nohw_or(row0, row1), aes_nohw_or(row2, row3)); - } -} - -// aes_nohw_rotate_rows_down returns |v| with the rows in each column rotated -// down by one. -static inline aes_word_t aes_nohw_rotate_rows_down(aes_word_t v) { -#if defined(OPENSSL_SSE2) - return _mm_or_si128(_mm_srli_epi32(v, 8), _mm_slli_epi32(v, 24)); -#elif defined(OPENSSL_64_BIT) - return ((v >> 4) & UINT64_C(0x0fff0fff0fff0fff)) | - ((v << 12) & UINT64_C(0xf000f000f000f000)); -#else - return ((v >> 2) & 0x3f3f3f3f) | ((v << 6) & 0xc0c0c0c0); -#endif -} - -// aes_nohw_rotate_rows_twice returns |v| with the rows in each column rotated -// by two. -static inline aes_word_t aes_nohw_rotate_rows_twice(aes_word_t v) { -#if defined(OPENSSL_SSE2) - return _mm_or_si128(_mm_srli_epi32(v, 16), _mm_slli_epi32(v, 16)); -#elif defined(OPENSSL_64_BIT) - return ((v >> 8) & UINT64_C(0x00ff00ff00ff00ff)) | - ((v << 8) & UINT64_C(0xff00ff00ff00ff00)); -#else - return ((v >> 4) & 0x0f0f0f0f) | ((v << 4) & 0xf0f0f0f0); -#endif -} - -static void aes_nohw_mix_columns(AES_NOHW_BATCH *batch) { - // See https://eprint.iacr.org/2009/129.pdf, section 4.4 and appendix A. - aes_word_t a0 = batch->w[0]; - aes_word_t a1 = batch->w[1]; - aes_word_t a2 = batch->w[2]; - aes_word_t a3 = batch->w[3]; - aes_word_t a4 = batch->w[4]; - aes_word_t a5 = batch->w[5]; - aes_word_t a6 = batch->w[6]; - aes_word_t a7 = batch->w[7]; - - aes_word_t r0 = aes_nohw_rotate_rows_down(a0); - aes_word_t a0_r0 = aes_nohw_xor(a0, r0); - aes_word_t r1 = aes_nohw_rotate_rows_down(a1); - aes_word_t a1_r1 = aes_nohw_xor(a1, r1); - aes_word_t r2 = aes_nohw_rotate_rows_down(a2); - aes_word_t a2_r2 = aes_nohw_xor(a2, r2); - aes_word_t r3 = aes_nohw_rotate_rows_down(a3); - aes_word_t a3_r3 = aes_nohw_xor(a3, r3); - aes_word_t r4 = aes_nohw_rotate_rows_down(a4); - aes_word_t a4_r4 = aes_nohw_xor(a4, r4); - aes_word_t r5 = aes_nohw_rotate_rows_down(a5); - aes_word_t a5_r5 = aes_nohw_xor(a5, r5); - aes_word_t r6 = aes_nohw_rotate_rows_down(a6); - aes_word_t a6_r6 = aes_nohw_xor(a6, r6); - aes_word_t r7 = aes_nohw_rotate_rows_down(a7); - aes_word_t a7_r7 = aes_nohw_xor(a7, r7); - - batch->w[0] = - aes_nohw_xor(aes_nohw_xor(a7_r7, r0), aes_nohw_rotate_rows_twice(a0_r0)); - batch->w[1] = - aes_nohw_xor(aes_nohw_xor(a0_r0, a7_r7), - aes_nohw_xor(r1, aes_nohw_rotate_rows_twice(a1_r1))); - batch->w[2] = - aes_nohw_xor(aes_nohw_xor(a1_r1, r2), aes_nohw_rotate_rows_twice(a2_r2)); - batch->w[3] = - aes_nohw_xor(aes_nohw_xor(a2_r2, a7_r7), - aes_nohw_xor(r3, aes_nohw_rotate_rows_twice(a3_r3))); - batch->w[4] = - aes_nohw_xor(aes_nohw_xor(a3_r3, a7_r7), - aes_nohw_xor(r4, aes_nohw_rotate_rows_twice(a4_r4))); - batch->w[5] = - aes_nohw_xor(aes_nohw_xor(a4_r4, r5), aes_nohw_rotate_rows_twice(a5_r5)); - batch->w[6] = - aes_nohw_xor(aes_nohw_xor(a5_r5, r6), aes_nohw_rotate_rows_twice(a6_r6)); - batch->w[7] = - aes_nohw_xor(aes_nohw_xor(a6_r6, r7), aes_nohw_rotate_rows_twice(a7_r7)); -} - -static void aes_nohw_encrypt_batch(const AES_NOHW_SCHEDULE *key, - size_t num_rounds, AES_NOHW_BATCH *batch) { - aes_nohw_add_round_key(batch, &key->keys[0]); - for (size_t i = 1; i < num_rounds; i++) { - aes_nohw_sub_bytes(batch); - aes_nohw_shift_rows(batch); - aes_nohw_mix_columns(batch); - aes_nohw_add_round_key(batch, &key->keys[i]); - } - aes_nohw_sub_bytes(batch); - aes_nohw_shift_rows(batch); - aes_nohw_add_round_key(batch, &key->keys[num_rounds]); -} - -// Key schedule. - -static void aes_nohw_expand_round_keys(AES_NOHW_SCHEDULE *out, - const AES_KEY *key) { - for (unsigned i = 0; i <= key->rounds; i++) { - // Copy the round key into each block in the batch. - for (size_t j = 0; j < AES_NOHW_BATCH_SIZE; j++) { - aes_word_t tmp[AES_NOHW_BLOCK_WORDS]; - GFp_memcpy(tmp, key->rd_key + 4 * i, 16); - aes_nohw_batch_set(&out->keys[i], tmp, j); - } - aes_nohw_transpose(&out->keys[i]); - } -} - -static const uint8_t aes_nohw_rcon[10] = {0x01, 0x02, 0x04, 0x08, 0x10, - 0x20, 0x40, 0x80, 0x1b, 0x36}; - -// aes_nohw_rcon_slice returns the |i|th group of |AES_NOHW_BATCH_SIZE| bits in -// |rcon|, stored in a |aes_word_t|. -static inline aes_word_t aes_nohw_rcon_slice(uint8_t rcon, size_t i) { - rcon = (rcon >> (i * AES_NOHW_BATCH_SIZE)) & ((1 << AES_NOHW_BATCH_SIZE) - 1); -#if defined(OPENSSL_SSE2) - return _mm_set_epi32(0, 0, 0, rcon); -#else - return ((aes_word_t)rcon); -#endif -} - -static void aes_nohw_sub_block(aes_word_t out[AES_NOHW_BLOCK_WORDS], - const aes_word_t in[AES_NOHW_BLOCK_WORDS]) { - AES_NOHW_BATCH batch; - GFp_memset(&batch, 0, sizeof(batch)); - aes_nohw_batch_set(&batch, in, 0); - aes_nohw_transpose(&batch); - aes_nohw_sub_bytes(&batch); - aes_nohw_transpose(&batch); - aes_nohw_batch_get(&batch, out, 0); -} - -static void aes_nohw_setup_key_128(AES_KEY *key, const uint8_t in[16]) { - key->rounds = 10; - - aes_word_t block[AES_NOHW_BLOCK_WORDS]; - aes_nohw_compact_block(block, in); - GFp_memcpy(key->rd_key, block, 16); - - for (size_t i = 1; i <= 10; i++) { - aes_word_t sub[AES_NOHW_BLOCK_WORDS]; - aes_nohw_sub_block(sub, block); - uint8_t rcon = aes_nohw_rcon[i - 1]; - for (size_t j = 0; j < AES_NOHW_BLOCK_WORDS; j++) { - // Incorporate |rcon| and the transformed word into the first word. - block[j] = aes_nohw_xor(block[j], aes_nohw_rcon_slice(rcon, j)); - block[j] = aes_nohw_xor( - block[j], - aes_nohw_shift_right(aes_nohw_rotate_rows_down(sub[j]), 12)); - // Propagate to the remaining words. Note this is reordered from the usual - // formulation to avoid needing masks. - aes_word_t v = block[j]; - block[j] = aes_nohw_xor(block[j], aes_nohw_shift_left(v, 4)); - block[j] = aes_nohw_xor(block[j], aes_nohw_shift_left(v, 8)); - block[j] = aes_nohw_xor(block[j], aes_nohw_shift_left(v, 12)); - } - GFp_memcpy(key->rd_key + 4 * i, block, 16); - } -} - -static void aes_nohw_setup_key_256(AES_KEY *key, const uint8_t in[32]) { - key->rounds = 14; - - // Each key schedule iteration produces two round keys. - aes_word_t block1[AES_NOHW_BLOCK_WORDS], block2[AES_NOHW_BLOCK_WORDS]; - aes_nohw_compact_block(block1, in); - GFp_memcpy(key->rd_key, block1, 16); - - aes_nohw_compact_block(block2, in + 16); - GFp_memcpy(key->rd_key + 4, block2, 16); - - for (size_t i = 2; i <= 14; i += 2) { - aes_word_t sub[AES_NOHW_BLOCK_WORDS]; - aes_nohw_sub_block(sub, block2); - uint8_t rcon = aes_nohw_rcon[i / 2 - 1]; - for (size_t j = 0; j < AES_NOHW_BLOCK_WORDS; j++) { - // Incorporate |rcon| and the transformed word into the first word. - block1[j] = aes_nohw_xor(block1[j], aes_nohw_rcon_slice(rcon, j)); - block1[j] = aes_nohw_xor( - block1[j], - aes_nohw_shift_right(aes_nohw_rotate_rows_down(sub[j]), 12)); - // Propagate to the remaining words. - aes_word_t v = block1[j]; - block1[j] = aes_nohw_xor(block1[j], aes_nohw_shift_left(v, 4)); - block1[j] = aes_nohw_xor(block1[j], aes_nohw_shift_left(v, 8)); - block1[j] = aes_nohw_xor(block1[j], aes_nohw_shift_left(v, 12)); - } - GFp_memcpy(key->rd_key + 4 * i, block1, 16); - - if (i == 14) { - break; - } - - aes_nohw_sub_block(sub, block1); - for (size_t j = 0; j < AES_NOHW_BLOCK_WORDS; j++) { - // Incorporate the transformed word into the first word. - block2[j] = aes_nohw_xor(block2[j], aes_nohw_shift_right(sub[j], 12)); - // Propagate to the remaining words. - aes_word_t v = block2[j]; - block2[j] = aes_nohw_xor(block2[j], aes_nohw_shift_left(v, 4)); - block2[j] = aes_nohw_xor(block2[j], aes_nohw_shift_left(v, 8)); - block2[j] = aes_nohw_xor(block2[j], aes_nohw_shift_left(v, 12)); - } - GFp_memcpy(key->rd_key + 4 * (i + 1), block2, 16); - } -} - - -// External API. - -int GFp_aes_nohw_set_encrypt_key(const uint8_t *key, unsigned bits, - AES_KEY *aeskey) { - switch (bits) { - case 128: - aes_nohw_setup_key_128(aeskey, key); - return 0; - case 256: - aes_nohw_setup_key_256(aeskey, key); - return 0; - } - return 1; -} - -void GFp_aes_nohw_encrypt(const uint8_t *in, uint8_t *out, const AES_KEY *key) { - AES_NOHW_SCHEDULE sched; - aes_nohw_expand_round_keys(&sched, key); - AES_NOHW_BATCH batch; - aes_nohw_to_batch(&batch, in, /*num_blocks=*/1); - aes_nohw_encrypt_batch(&sched, key->rounds, &batch); - aes_nohw_from_batch(out, /*num_blocks=*/1, &batch); -} - -static inline void aes_nohw_xor_block(uint8_t out[16], const uint8_t a[16], - const uint8_t b[16]) { - for (size_t i = 0; i < 16; i += sizeof(aes_word_t)) { - aes_word_t x, y; - GFp_memcpy(&x, a + i, sizeof(aes_word_t)); - GFp_memcpy(&y, b + i, sizeof(aes_word_t)); - x = aes_nohw_xor(x, y); - GFp_memcpy(out + i, &x, sizeof(aes_word_t)); - } -} - -void GFp_aes_nohw_ctr32_encrypt_blocks(const uint8_t *in, uint8_t *out, - size_t blocks, const AES_KEY *key, - const uint8_t ivec[16]) { - if (blocks == 0) { - return; - } - - AES_NOHW_SCHEDULE sched; - aes_nohw_expand_round_keys(&sched, key); - - // Make |AES_NOHW_BATCH_SIZE| copies of |ivec|. - alignas(AES_NOHW_WORD_SIZE) union { - uint32_t u32[AES_NOHW_BATCH_SIZE * 4]; - uint8_t u8[AES_NOHW_BATCH_SIZE * 16]; - } ivs, enc_ivs; - for (size_t i = 0; i < AES_NOHW_BATCH_SIZE; i++) { - GFp_memcpy(ivs.u8 + 16 * i, ivec, 16); - } - - uint32_t ctr = CRYPTO_bswap4(ivs.u32[3]); - for (;;) { - // Update counters. - for (uint32_t i = 0; i < AES_NOHW_BATCH_SIZE; i++) { - ivs.u32[4 * i + 3] = CRYPTO_bswap4(ctr + i); - } - - size_t todo = blocks >= AES_NOHW_BATCH_SIZE ? AES_NOHW_BATCH_SIZE : blocks; - AES_NOHW_BATCH batch; - aes_nohw_to_batch(&batch, ivs.u8, todo); - aes_nohw_encrypt_batch(&sched, key->rounds, &batch); - aes_nohw_from_batch(enc_ivs.u8, todo, &batch); - - for (size_t i = 0; i < todo; i++) { - aes_nohw_xor_block(out + 16 * i, in + 16 * i, enc_ivs.u8 + 16 * i); - } - - blocks -= todo; - if (blocks == 0) { - break; - } - - in += 16 * AES_NOHW_BATCH_SIZE; - out += 16 * AES_NOHW_BATCH_SIZE; - ctr += AES_NOHW_BATCH_SIZE; - } -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/aes/asm/aesni-x86_64.pl temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/aes/asm/aesni-x86_64.pl --- temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/aes/asm/aesni-x86_64.pl 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/aes/asm/aesni-x86_64.pl 1970-01-01 00:00:00.000000000 +0000 @@ -1,1704 +0,0 @@ -#! /usr/bin/env perl -# Copyright 2009-2016 The OpenSSL Project Authors. All Rights Reserved. -# -# Licensed under the OpenSSL license (the "License"). You may not use -# this file except in compliance with the License. You can obtain a copy -# in the file LICENSE in the source distribution or at -# https://www.openssl.org/source/license.html - -# -# ==================================================================== -# Written by Andy Polyakov for the OpenSSL -# project. The module is, however, dual licensed under OpenSSL and -# CRYPTOGAMS licenses depending on where you obtain it. For further -# details see http://www.openssl.org/~appro/cryptogams/. -# ==================================================================== -# -# This module implements support for Intel AES-NI extension. In -# OpenSSL context it's used with Intel engine, but can also be used as -# drop-in replacement for crypto/aes/asm/aes-x86_64.pl [see below for -# details]. -# -# Performance. -# -# Given aes(enc|dec) instructions' latency asymptotic performance for -# non-parallelizable modes such as CBC encrypt is 3.75 cycles per byte -# processed with 128-bit key. And given their throughput asymptotic -# performance for parallelizable modes is 1.25 cycles per byte. Being -# asymptotic limit it's not something you commonly achieve in reality, -# but how close does one get? Below are results collected for -# different modes and block sized. Pairs of numbers are for en-/ -# decryption. -# -# 16-byte 64-byte 256-byte 1-KB 8-KB -# ECB 4.25/4.25 1.38/1.38 1.28/1.28 1.26/1.26 1.26/1.26 -# CTR 5.42/5.42 1.92/1.92 1.44/1.44 1.28/1.28 1.26/1.26 -# CBC 4.38/4.43 4.15/1.43 4.07/1.32 4.07/1.29 4.06/1.28 -# CCM 5.66/9.42 4.42/5.41 4.16/4.40 4.09/4.15 4.06/4.07 -# OFB 5.42/5.42 4.64/4.64 4.44/4.44 4.39/4.39 4.38/4.38 -# CFB 5.73/5.85 5.56/5.62 5.48/5.56 5.47/5.55 5.47/5.55 -# -# ECB, CTR, CBC and CCM results are free from EVP overhead. This means -# that otherwise used 'openssl speed -evp aes-128-??? -engine aesni -# [-decrypt]' will exhibit 10-15% worse results for smaller blocks. -# The results were collected with specially crafted speed.c benchmark -# in order to compare them with results reported in "Intel Advanced -# Encryption Standard (AES) New Instruction Set" White Paper Revision -# 3.0 dated May 2010. All above results are consistently better. This -# module also provides better performance for block sizes smaller than -# 128 bytes in points *not* represented in the above table. -# -# Looking at the results for 8-KB buffer. -# -# CFB and OFB results are far from the limit, because implementation -# uses "generic" CRYPTO_[c|o]fb128_encrypt interfaces relying on -# single-block aesni_encrypt, which is not the most optimal way to go. -# CBC encrypt result is unexpectedly high and there is no documented -# explanation for it. Seemingly there is a small penalty for feeding -# the result back to AES unit the way it's done in CBC mode. There is -# nothing one can do and the result appears optimal. CCM result is -# identical to CBC, because CBC-MAC is essentially CBC encrypt without -# saving output. CCM CTR "stays invisible," because it's neatly -# interleaved wih CBC-MAC. This provides ~30% improvement over -# "straightforward" CCM implementation with CTR and CBC-MAC performed -# disjointly. Parallelizable modes practically achieve the theoretical -# limit. -# -# Looking at how results vary with buffer size. -# -# Curves are practically saturated at 1-KB buffer size. In most cases -# "256-byte" performance is >95%, and "64-byte" is ~90% of "8-KB" one. -# CTR curve doesn't follow this pattern and is "slowest" changing one -# with "256-byte" result being 87% of "8-KB." This is because overhead -# in CTR mode is most computationally intensive. Small-block CCM -# decrypt is slower than encrypt, because first CTR and last CBC-MAC -# iterations can't be interleaved. -# -# Results for 192- and 256-bit keys. -# -# EVP-free results were observed to scale perfectly with number of -# rounds for larger block sizes, i.e. 192-bit result being 10/12 times -# lower and 256-bit one - 10/14. Well, in CBC encrypt case differences -# are a tad smaller, because the above mentioned penalty biases all -# results by same constant value. In similar way function call -# overhead affects small-block performance, as well as OFB and CFB -# results. Differences are not large, most common coefficients are -# 10/11.7 and 10/13.4 (as opposite to 10/12.0 and 10/14.0), but one -# observe even 10/11.2 and 10/12.4 (CTR, OFB, CFB)... - -# January 2011 -# -# While Westmere processor features 6 cycles latency for aes[enc|dec] -# instructions, which can be scheduled every second cycle, Sandy -# Bridge spends 8 cycles per instruction, but it can schedule them -# every cycle. This means that code targeting Westmere would perform -# suboptimally on Sandy Bridge. Therefore this update. -# -# In addition, non-parallelizable CBC encrypt (as well as CCM) is -# optimized. Relative improvement might appear modest, 8% on Westmere, -# but in absolute terms it's 3.77 cycles per byte encrypted with -# 128-bit key on Westmere, and 5.07 - on Sandy Bridge. These numbers -# should be compared to asymptotic limits of 3.75 for Westmere and -# 5.00 for Sandy Bridge. Actually, the fact that they get this close -# to asymptotic limits is quite amazing. Indeed, the limit is -# calculated as latency times number of rounds, 10 for 128-bit key, -# and divided by 16, the number of bytes in block, or in other words -# it accounts *solely* for aesenc instructions. But there are extra -# instructions, and numbers so close to the asymptotic limits mean -# that it's as if it takes as little as *one* additional cycle to -# execute all of them. How is it possible? It is possible thanks to -# out-of-order execution logic, which manages to overlap post- -# processing of previous block, things like saving the output, with -# actual encryption of current block, as well as pre-processing of -# current block, things like fetching input and xor-ing it with -# 0-round element of the key schedule, with actual encryption of -# previous block. Keep this in mind... -# -# For parallelizable modes, such as ECB, CBC decrypt, CTR, higher -# performance is achieved by interleaving instructions working on -# independent blocks. In which case asymptotic limit for such modes -# can be obtained by dividing above mentioned numbers by AES -# instructions' interleave factor. Westmere can execute at most 3 -# instructions at a time, meaning that optimal interleave factor is 3, -# and that's where the "magic" number of 1.25 come from. "Optimal -# interleave factor" means that increase of interleave factor does -# not improve performance. The formula has proven to reflect reality -# pretty well on Westmere... Sandy Bridge on the other hand can -# execute up to 8 AES instructions at a time, so how does varying -# interleave factor affect the performance? Here is table for ECB -# (numbers are cycles per byte processed with 128-bit key): -# -# instruction interleave factor 3x 6x 8x -# theoretical asymptotic limit 1.67 0.83 0.625 -# measured performance for 8KB block 1.05 0.86 0.84 -# -# "as if" interleave factor 4.7x 5.8x 6.0x -# -# Further data for other parallelizable modes: -# -# CBC decrypt 1.16 0.93 0.74 -# CTR 1.14 0.91 0.74 -# -# Well, given 3x column it's probably inappropriate to call the limit -# asymptotic, if it can be surpassed, isn't it? What happens there? -# Rewind to CBC paragraph for the answer. Yes, out-of-order execution -# magic is responsible for this. Processor overlaps not only the -# additional instructions with AES ones, but even AES instructions -# processing adjacent triplets of independent blocks. In the 6x case -# additional instructions still claim disproportionally small amount -# of additional cycles, but in 8x case number of instructions must be -# a tad too high for out-of-order logic to cope with, and AES unit -# remains underutilized... As you can see 8x interleave is hardly -# justifiable, so there no need to feel bad that 32-bit aesni-x86.pl -# utilizes 6x interleave because of limited register bank capacity. -# -# Higher interleave factors do have negative impact on Westmere -# performance. While for ECB mode it's negligible ~1.5%, other -# parallelizables perform ~5% worse, which is outweighed by ~25% -# improvement on Sandy Bridge. To balance regression on Westmere -# CTR mode was implemented with 6x aesenc interleave factor. - -# April 2011 -# -# Add aesni_xts_[en|de]crypt. Westmere spends 1.25 cycles processing -# one byte out of 8KB with 128-bit key, Sandy Bridge - 0.90. Just like -# in CTR mode AES instruction interleave factor was chosen to be 6x. - -###################################################################### -# Current large-block performance in cycles per byte processed with -# 128-bit key (less is better). -# -# CBC en-/decrypt CTR XTS ECB OCB -# Westmere 3.77/1.25 1.25 1.25 1.26 -# * Bridge 5.07/0.74 0.75 0.90 0.85 0.98 -# Haswell 4.44/0.63 0.63 0.73 0.63 0.70 -# Skylake 2.62/0.63 0.63 0.63 0.63 -# Silvermont 5.75/3.54 3.56 4.12 3.87(*) 4.11 -# Knights L 2.54/0.77 0.78 0.85 - 1.50 -# Goldmont 3.82/1.26 1.26 1.29 1.29 1.50 -# Bulldozer 5.77/0.70 0.72 0.90 0.70 0.95 -# Ryzen 2.71/0.35 0.35 0.44 0.38 0.49 -# -# (*) Atom Silvermont ECB result is suboptimal because of penalties -# incurred by operations on %xmm8-15. As ECB is not considered -# critical, nothing was done to mitigate the problem. - -$PREFIX="aes_hw"; # if $PREFIX is set to "AES", the script - # generates drop-in replacement for - # crypto/aes/asm/aes-x86_64.pl:-) - -$flavour = shift; -$output = shift; -if ($flavour =~ /\./) { $output = $flavour; undef $flavour; } - -$win64=0; $win64=1 if ($flavour =~ /[nm]asm|mingw64/ || $output =~ /\.asm$/); - -$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; -( $xlate="${dir}x86_64-xlate.pl" and -f $xlate ) or -( $xlate="${dir}../../../perlasm/x86_64-xlate.pl" and -f $xlate) or -die "can't locate x86_64-xlate.pl"; - -open OUT,"| \"$^X\" \"$xlate\" $flavour \"$output\""; -*STDOUT=*OUT; - -$movkey = $PREFIX eq "aes_hw" ? "movups" : "movups"; -@_4args=$win64? ("%rcx","%rdx","%r8", "%r9") : # Win64 order - ("%rdi","%rsi","%rdx","%rcx"); # Unix order - -$code=".text\n"; -$code.=".extern GFp_ia32cap_P\n"; - -$rounds="%eax"; # input to and changed by aesni_[en|de]cryptN !!! -# this is natural Unix argument order for public $PREFIX_[ecb|cbc]_encrypt ... -$inp="%rdi"; -$out="%rsi"; -$len="%rdx"; -$key="%rcx"; # input to and changed by aesni_[en|de]cryptN !!! -$ivp="%r8"; # cbc, ctr, ... - -$rnds_="%r10d"; # backup copy for $rounds -$key_="%r11"; # backup copy for $key - -# %xmm register layout -$rndkey0="%xmm0"; $rndkey1="%xmm1"; -$inout0="%xmm2"; $inout1="%xmm3"; -$inout2="%xmm4"; $inout3="%xmm5"; -$inout4="%xmm6"; $inout5="%xmm7"; -$inout6="%xmm8"; $inout7="%xmm9"; - -$in2="%xmm6"; $in1="%xmm7"; # used in CBC decrypt, CTR, ... -$in0="%xmm8"; $iv="%xmm9"; - -# Inline version of internal aesni_[en|de]crypt1. -# -# Why folded loop? Because aes[enc|dec] is slow enough to accommodate -# cycles which take care of loop variables... -{ my $sn; -sub aesni_generate1 { -my ($p,$key,$rounds,$inout,$ivec)=@_; $inout=$inout0 if (!defined($inout)); -++$sn; -$code.=<<___; - $movkey ($key),$rndkey0 - $movkey 16($key),$rndkey1 -___ -$code.=<<___ if (defined($ivec)); - xorps $rndkey0,$ivec - lea 32($key),$key - xorps $ivec,$inout -___ -$code.=<<___ if (!defined($ivec)); - lea 32($key),$key - xorps $rndkey0,$inout -___ -$code.=<<___; -.Loop_${p}1_$sn: - aes${p} $rndkey1,$inout - dec $rounds - $movkey ($key),$rndkey1 - lea 16($key),$key - jnz .Loop_${p}1_$sn # loop body is 16 bytes - aes${p}last $rndkey1,$inout -___ -}} -# void $PREFIX_[en|de]crypt (const void *inp,void *out,const AES_KEY *key); -# -{ my ($inp,$out,$key) = @_4args; - -$code.=<<___; -.globl GFp_${PREFIX}_encrypt -.type GFp_${PREFIX}_encrypt,\@abi-omnipotent -.align 16 -GFp_${PREFIX}_encrypt: -.cfi_startproc - movups ($inp),$inout0 # load input - mov 240($key),$rounds # key->rounds -___ - &aesni_generate1("enc",$key,$rounds); -$code.=<<___; - pxor $rndkey0,$rndkey0 # clear register bank - pxor $rndkey1,$rndkey1 - movups $inout0,($out) # output - pxor $inout0,$inout0 - ret -.cfi_endproc -.size GFp_${PREFIX}_encrypt,.-GFp_${PREFIX}_encrypt -___ -} - -# _aesni_[en|de]cryptN are private interfaces, N denotes interleave -# factor. Why 3x subroutine were originally used in loops? Even though -# aes[enc|dec] latency was originally 6, it could be scheduled only -# every *2nd* cycle. Thus 3x interleave was the one providing optimal -# utilization, i.e. when subroutine's throughput is virtually same as -# of non-interleaved subroutine [for number of input blocks up to 3]. -# This is why it originally made no sense to implement 2x subroutine. -# But times change and it became appropriate to spend extra 192 bytes -# on 2x subroutine on Atom Silvermont account. For processors that -# can schedule aes[enc|dec] every cycle optimal interleave factor -# equals to corresponding instructions latency. 8x is optimal for -# * Bridge and "super-optimal" for other Intel CPUs... - -sub aesni_generate2 { -my $dir=shift; -# As already mentioned it takes in $key and $rounds, which are *not* -# preserved. $inout[0-1] is cipher/clear text... -$code.=<<___; -.type _aesni_${dir}rypt2,\@abi-omnipotent -.align 16 -_aesni_${dir}rypt2: -.cfi_startproc - $movkey ($key),$rndkey0 - shl \$4,$rounds - $movkey 16($key),$rndkey1 - xorps $rndkey0,$inout0 - xorps $rndkey0,$inout1 - $movkey 32($key),$rndkey0 - lea 32($key,$rounds),$key - neg %rax # $rounds - add \$16,%rax - -.L${dir}_loop2: - aes${dir} $rndkey1,$inout0 - aes${dir} $rndkey1,$inout1 - $movkey ($key,%rax),$rndkey1 - add \$32,%rax - aes${dir} $rndkey0,$inout0 - aes${dir} $rndkey0,$inout1 - $movkey -16($key,%rax),$rndkey0 - jnz .L${dir}_loop2 - - aes${dir} $rndkey1,$inout0 - aes${dir} $rndkey1,$inout1 - aes${dir}last $rndkey0,$inout0 - aes${dir}last $rndkey0,$inout1 - ret -.cfi_endproc -.size _aesni_${dir}rypt2,.-_aesni_${dir}rypt2 -___ -} -sub aesni_generate3 { -my $dir=shift; -# As already mentioned it takes in $key and $rounds, which are *not* -# preserved. $inout[0-2] is cipher/clear text... -$code.=<<___; -.type _aesni_${dir}rypt3,\@abi-omnipotent -.align 16 -_aesni_${dir}rypt3: -.cfi_startproc - $movkey ($key),$rndkey0 - shl \$4,$rounds - $movkey 16($key),$rndkey1 - xorps $rndkey0,$inout0 - xorps $rndkey0,$inout1 - xorps $rndkey0,$inout2 - $movkey 32($key),$rndkey0 - lea 32($key,$rounds),$key - neg %rax # $rounds - add \$16,%rax - -.L${dir}_loop3: - aes${dir} $rndkey1,$inout0 - aes${dir} $rndkey1,$inout1 - aes${dir} $rndkey1,$inout2 - $movkey ($key,%rax),$rndkey1 - add \$32,%rax - aes${dir} $rndkey0,$inout0 - aes${dir} $rndkey0,$inout1 - aes${dir} $rndkey0,$inout2 - $movkey -16($key,%rax),$rndkey0 - jnz .L${dir}_loop3 - - aes${dir} $rndkey1,$inout0 - aes${dir} $rndkey1,$inout1 - aes${dir} $rndkey1,$inout2 - aes${dir}last $rndkey0,$inout0 - aes${dir}last $rndkey0,$inout1 - aes${dir}last $rndkey0,$inout2 - ret -.cfi_endproc -.size _aesni_${dir}rypt3,.-_aesni_${dir}rypt3 -___ -} -# 4x interleave is implemented to improve small block performance, -# most notably [and naturally] 4 block by ~30%. One can argue that one -# should have implemented 5x as well, but improvement would be <20%, -# so it's not worth it... -sub aesni_generate4 { -my $dir=shift; -# As already mentioned it takes in $key and $rounds, which are *not* -# preserved. $inout[0-3] is cipher/clear text... -$code.=<<___; -.type _aesni_${dir}rypt4,\@abi-omnipotent -.align 16 -_aesni_${dir}rypt4: -.cfi_startproc - $movkey ($key),$rndkey0 - shl \$4,$rounds - $movkey 16($key),$rndkey1 - xorps $rndkey0,$inout0 - xorps $rndkey0,$inout1 - xorps $rndkey0,$inout2 - xorps $rndkey0,$inout3 - $movkey 32($key),$rndkey0 - lea 32($key,$rounds),$key - neg %rax # $rounds - .byte 0x0f,0x1f,0x00 - add \$16,%rax - -.L${dir}_loop4: - aes${dir} $rndkey1,$inout0 - aes${dir} $rndkey1,$inout1 - aes${dir} $rndkey1,$inout2 - aes${dir} $rndkey1,$inout3 - $movkey ($key,%rax),$rndkey1 - add \$32,%rax - aes${dir} $rndkey0,$inout0 - aes${dir} $rndkey0,$inout1 - aes${dir} $rndkey0,$inout2 - aes${dir} $rndkey0,$inout3 - $movkey -16($key,%rax),$rndkey0 - jnz .L${dir}_loop4 - - aes${dir} $rndkey1,$inout0 - aes${dir} $rndkey1,$inout1 - aes${dir} $rndkey1,$inout2 - aes${dir} $rndkey1,$inout3 - aes${dir}last $rndkey0,$inout0 - aes${dir}last $rndkey0,$inout1 - aes${dir}last $rndkey0,$inout2 - aes${dir}last $rndkey0,$inout3 - ret -.cfi_endproc -.size _aesni_${dir}rypt4,.-_aesni_${dir}rypt4 -___ -} -sub aesni_generate6 { -my $dir=shift; -# As already mentioned it takes in $key and $rounds, which are *not* -# preserved. $inout[0-5] is cipher/clear text... -$code.=<<___; -.type _aesni_${dir}rypt6,\@abi-omnipotent -.align 16 -_aesni_${dir}rypt6: -.cfi_startproc - $movkey ($key),$rndkey0 - shl \$4,$rounds - $movkey 16($key),$rndkey1 - xorps $rndkey0,$inout0 - pxor $rndkey0,$inout1 - pxor $rndkey0,$inout2 - aes${dir} $rndkey1,$inout0 - lea 32($key,$rounds),$key - neg %rax # $rounds - aes${dir} $rndkey1,$inout1 - pxor $rndkey0,$inout3 - pxor $rndkey0,$inout4 - aes${dir} $rndkey1,$inout2 - pxor $rndkey0,$inout5 - $movkey ($key,%rax),$rndkey0 - add \$16,%rax - jmp .L${dir}_loop6_enter -.align 16 -.L${dir}_loop6: - aes${dir} $rndkey1,$inout0 - aes${dir} $rndkey1,$inout1 - aes${dir} $rndkey1,$inout2 -.L${dir}_loop6_enter: - aes${dir} $rndkey1,$inout3 - aes${dir} $rndkey1,$inout4 - aes${dir} $rndkey1,$inout5 - $movkey ($key,%rax),$rndkey1 - add \$32,%rax - aes${dir} $rndkey0,$inout0 - aes${dir} $rndkey0,$inout1 - aes${dir} $rndkey0,$inout2 - aes${dir} $rndkey0,$inout3 - aes${dir} $rndkey0,$inout4 - aes${dir} $rndkey0,$inout5 - $movkey -16($key,%rax),$rndkey0 - jnz .L${dir}_loop6 - - aes${dir} $rndkey1,$inout0 - aes${dir} $rndkey1,$inout1 - aes${dir} $rndkey1,$inout2 - aes${dir} $rndkey1,$inout3 - aes${dir} $rndkey1,$inout4 - aes${dir} $rndkey1,$inout5 - aes${dir}last $rndkey0,$inout0 - aes${dir}last $rndkey0,$inout1 - aes${dir}last $rndkey0,$inout2 - aes${dir}last $rndkey0,$inout3 - aes${dir}last $rndkey0,$inout4 - aes${dir}last $rndkey0,$inout5 - ret -.cfi_endproc -.size _aesni_${dir}rypt6,.-_aesni_${dir}rypt6 -___ -} -sub aesni_generate8 { -my $dir=shift; -# As already mentioned it takes in $key and $rounds, which are *not* -# preserved. $inout[0-7] is cipher/clear text... -$code.=<<___; -.type _aesni_${dir}rypt8,\@abi-omnipotent -.align 16 -_aesni_${dir}rypt8: -.cfi_startproc - $movkey ($key),$rndkey0 - shl \$4,$rounds - $movkey 16($key),$rndkey1 - xorps $rndkey0,$inout0 - xorps $rndkey0,$inout1 - pxor $rndkey0,$inout2 - pxor $rndkey0,$inout3 - pxor $rndkey0,$inout4 - lea 32($key,$rounds),$key - neg %rax # $rounds - aes${dir} $rndkey1,$inout0 - pxor $rndkey0,$inout5 - pxor $rndkey0,$inout6 - aes${dir} $rndkey1,$inout1 - pxor $rndkey0,$inout7 - $movkey ($key,%rax),$rndkey0 - add \$16,%rax - jmp .L${dir}_loop8_inner -.align 16 -.L${dir}_loop8: - aes${dir} $rndkey1,$inout0 - aes${dir} $rndkey1,$inout1 -.L${dir}_loop8_inner: - aes${dir} $rndkey1,$inout2 - aes${dir} $rndkey1,$inout3 - aes${dir} $rndkey1,$inout4 - aes${dir} $rndkey1,$inout5 - aes${dir} $rndkey1,$inout6 - aes${dir} $rndkey1,$inout7 -.L${dir}_loop8_enter: - $movkey ($key,%rax),$rndkey1 - add \$32,%rax - aes${dir} $rndkey0,$inout0 - aes${dir} $rndkey0,$inout1 - aes${dir} $rndkey0,$inout2 - aes${dir} $rndkey0,$inout3 - aes${dir} $rndkey0,$inout4 - aes${dir} $rndkey0,$inout5 - aes${dir} $rndkey0,$inout6 - aes${dir} $rndkey0,$inout7 - $movkey -16($key,%rax),$rndkey0 - jnz .L${dir}_loop8 - - aes${dir} $rndkey1,$inout0 - aes${dir} $rndkey1,$inout1 - aes${dir} $rndkey1,$inout2 - aes${dir} $rndkey1,$inout3 - aes${dir} $rndkey1,$inout4 - aes${dir} $rndkey1,$inout5 - aes${dir} $rndkey1,$inout6 - aes${dir} $rndkey1,$inout7 - aes${dir}last $rndkey0,$inout0 - aes${dir}last $rndkey0,$inout1 - aes${dir}last $rndkey0,$inout2 - aes${dir}last $rndkey0,$inout3 - aes${dir}last $rndkey0,$inout4 - aes${dir}last $rndkey0,$inout5 - aes${dir}last $rndkey0,$inout6 - aes${dir}last $rndkey0,$inout7 - ret -.cfi_endproc -.size _aesni_${dir}rypt8,.-_aesni_${dir}rypt8 -___ -} -&aesni_generate2("enc") if ($PREFIX eq "aes_hw"); -&aesni_generate3("enc") if ($PREFIX eq "aes_hw"); -&aesni_generate4("enc") if ($PREFIX eq "aes_hw"); -&aesni_generate6("enc") if ($PREFIX eq "aes_hw"); -&aesni_generate8("enc") if ($PREFIX eq "aes_hw"); - -if ($PREFIX eq "aes_hw") { -{ -###################################################################### -# void GFp_aes_hw_ctr32_encrypt_blocks (const void *in, void *out, -# size_t blocks, const AES_KEY *key, -# const char *ivec); -# -# Handles only complete blocks, operates on 32-bit counter and -# does not update *ivec! (see crypto/modes/ctr128.c for details) -# -# Overhaul based on suggestions from Shay Gueron and Vlad Krasnov, -# http://rt.openssl.org/Ticket/Display.html?id=3021&user=guest&pass=guest. -# Keywords are full unroll and modulo-schedule counter calculations -# with zero-round key xor. -{ -my ($in0,$in1,$in2,$in3,$in4,$in5)=map("%xmm$_",(10..15)); -my ($key0,$ctr)=("%ebp","${ivp}d"); -my $frame_size = 0x80 + ($win64?160:0); - -$code.=<<___; -.globl GFp_${PREFIX}_ctr32_encrypt_blocks -.type GFp_${PREFIX}_ctr32_encrypt_blocks,\@function,5 -.align 16 -GFp_${PREFIX}_ctr32_encrypt_blocks: -.cfi_startproc - cmp \$1,$len - jne .Lctr32_bulk - - # handle single block without allocating stack frame, - # useful when handling edges - movups ($ivp),$inout0 - movups ($inp),$inout1 - mov 240($key),%edx # key->rounds -___ - &aesni_generate1("enc",$key,"%edx"); -$code.=<<___; - pxor $rndkey0,$rndkey0 # clear register bank - pxor $rndkey1,$rndkey1 - xorps $inout1,$inout0 - pxor $inout1,$inout1 - movups $inout0,($out) - xorps $inout0,$inout0 - jmp .Lctr32_epilogue - -.align 16 -.Lctr32_bulk: - lea (%rsp),$key_ # use $key_ as frame pointer -.cfi_def_cfa_register $key_ - push %rbp -.cfi_push %rbp - sub \$$frame_size,%rsp - and \$-16,%rsp # Linux kernel stack can be incorrectly seeded -___ -$code.=<<___ if ($win64); - movaps %xmm6,-0xa8($key_) # offload everything - movaps %xmm7,-0x98($key_) - movaps %xmm8,-0x88($key_) - movaps %xmm9,-0x78($key_) - movaps %xmm10,-0x68($key_) - movaps %xmm11,-0x58($key_) - movaps %xmm12,-0x48($key_) - movaps %xmm13,-0x38($key_) - movaps %xmm14,-0x28($key_) - movaps %xmm15,-0x18($key_) -.Lctr32_body: -___ -$code.=<<___; - - # 8 16-byte words on top of stack are counter values - # xor-ed with zero-round key - - movdqu ($ivp),$inout0 - movdqu ($key),$rndkey0 - mov 12($ivp),$ctr # counter LSB - pxor $rndkey0,$inout0 - mov 12($key),$key0 # 0-round key LSB - movdqa $inout0,0x00(%rsp) # populate counter block - bswap $ctr - movdqa $inout0,$inout1 - movdqa $inout0,$inout2 - movdqa $inout0,$inout3 - movdqa $inout0,0x40(%rsp) - movdqa $inout0,0x50(%rsp) - movdqa $inout0,0x60(%rsp) - mov %rdx,%r10 # about to borrow %rdx - movdqa $inout0,0x70(%rsp) - - lea 1($ctr),%rax - lea 2($ctr),%rdx - bswap %eax - bswap %edx - xor $key0,%eax - xor $key0,%edx - pinsrd \$3,%eax,$inout1 - lea 3($ctr),%rax - movdqa $inout1,0x10(%rsp) - pinsrd \$3,%edx,$inout2 - bswap %eax - mov %r10,%rdx # restore %rdx - lea 4($ctr),%r10 - movdqa $inout2,0x20(%rsp) - xor $key0,%eax - bswap %r10d - pinsrd \$3,%eax,$inout3 - xor $key0,%r10d - movdqa $inout3,0x30(%rsp) - lea 5($ctr),%r9 - mov %r10d,0x40+12(%rsp) - bswap %r9d - lea 6($ctr),%r10 - mov 240($key),$rounds # key->rounds - xor $key0,%r9d - bswap %r10d - mov %r9d,0x50+12(%rsp) - xor $key0,%r10d - lea 7($ctr),%r9 - mov %r10d,0x60+12(%rsp) - bswap %r9d - leaq GFp_ia32cap_P(%rip),%r10 - mov 4(%r10),%r10d - xor $key0,%r9d - and \$`1<<26|1<<22`,%r10d # isolate XSAVE+MOVBE - mov %r9d,0x70+12(%rsp) - - $movkey 0x10($key),$rndkey1 - - movdqa 0x40(%rsp),$inout4 - movdqa 0x50(%rsp),$inout5 - - cmp \$8,$len # $len is in blocks - jb .Lctr32_tail # short input if ($len<8) - - sub \$6,$len # $len is biased by -6 - cmp \$`1<<22`,%r10d # check for MOVBE without XSAVE - je .Lctr32_6x # [which denotes Atom Silvermont] - - lea 0x80($key),$key # size optimization - sub \$2,$len # $len is biased by -8 - jmp .Lctr32_loop8 - -.align 16 -.Lctr32_6x: - shl \$4,$rounds - mov \$48,$rnds_ - bswap $key0 - lea 32($key,$rounds),$key # end of key schedule - sub %rax,%r10 # twisted $rounds - jmp .Lctr32_loop6 - -.align 16 -.Lctr32_loop6: - add \$6,$ctr # next counter value - $movkey -48($key,$rnds_),$rndkey0 - aesenc $rndkey1,$inout0 - mov $ctr,%eax - xor $key0,%eax - aesenc $rndkey1,$inout1 - movbe %eax,`0x00+12`(%rsp) # store next counter value - lea 1($ctr),%eax - aesenc $rndkey1,$inout2 - xor $key0,%eax - movbe %eax,`0x10+12`(%rsp) - aesenc $rndkey1,$inout3 - lea 2($ctr),%eax - xor $key0,%eax - aesenc $rndkey1,$inout4 - movbe %eax,`0x20+12`(%rsp) - lea 3($ctr),%eax - aesenc $rndkey1,$inout5 - $movkey -32($key,$rnds_),$rndkey1 - xor $key0,%eax - - aesenc $rndkey0,$inout0 - movbe %eax,`0x30+12`(%rsp) - lea 4($ctr),%eax - aesenc $rndkey0,$inout1 - xor $key0,%eax - movbe %eax,`0x40+12`(%rsp) - aesenc $rndkey0,$inout2 - lea 5($ctr),%eax - xor $key0,%eax - aesenc $rndkey0,$inout3 - movbe %eax,`0x50+12`(%rsp) - mov %r10,%rax # mov $rnds_,$rounds - aesenc $rndkey0,$inout4 - aesenc $rndkey0,$inout5 - $movkey -16($key,$rnds_),$rndkey0 - - call .Lenc_loop6 - - movdqu ($inp),$inout6 # load 6 input blocks - movdqu 0x10($inp),$inout7 - movdqu 0x20($inp),$in0 - movdqu 0x30($inp),$in1 - movdqu 0x40($inp),$in2 - movdqu 0x50($inp),$in3 - lea 0x60($inp),$inp # $inp+=6*16 - $movkey -64($key,$rnds_),$rndkey1 - pxor $inout0,$inout6 # inp^=E(ctr) - movaps 0x00(%rsp),$inout0 # load next counter [xor-ed with 0 round] - pxor $inout1,$inout7 - movaps 0x10(%rsp),$inout1 - pxor $inout2,$in0 - movaps 0x20(%rsp),$inout2 - pxor $inout3,$in1 - movaps 0x30(%rsp),$inout3 - pxor $inout4,$in2 - movaps 0x40(%rsp),$inout4 - pxor $inout5,$in3 - movaps 0x50(%rsp),$inout5 - movdqu $inout6,($out) # store 6 output blocks - movdqu $inout7,0x10($out) - movdqu $in0,0x20($out) - movdqu $in1,0x30($out) - movdqu $in2,0x40($out) - movdqu $in3,0x50($out) - lea 0x60($out),$out # $out+=6*16 - - sub \$6,$len - jnc .Lctr32_loop6 # loop if $len-=6 didn't borrow - - add \$6,$len # restore real remaining $len - jz .Lctr32_done # done if ($len==0) - - lea -48($rnds_),$rounds - lea -80($key,$rnds_),$key # restore $key - neg $rounds - shr \$4,$rounds # restore $rounds - jmp .Lctr32_tail - -.align 32 -.Lctr32_loop8: - add \$8,$ctr # next counter value - movdqa 0x60(%rsp),$inout6 - aesenc $rndkey1,$inout0 - mov $ctr,%r9d - movdqa 0x70(%rsp),$inout7 - aesenc $rndkey1,$inout1 - bswap %r9d - $movkey 0x20-0x80($key),$rndkey0 - aesenc $rndkey1,$inout2 - xor $key0,%r9d - nop - aesenc $rndkey1,$inout3 - mov %r9d,0x00+12(%rsp) # store next counter value - lea 1($ctr),%r9 - aesenc $rndkey1,$inout4 - aesenc $rndkey1,$inout5 - aesenc $rndkey1,$inout6 - aesenc $rndkey1,$inout7 - $movkey 0x30-0x80($key),$rndkey1 -___ -for($i=2;$i<8;$i++) { -my $rndkeyx = ($i&1)?$rndkey1:$rndkey0; -$code.=<<___; - bswap %r9d - aesenc $rndkeyx,$inout0 - aesenc $rndkeyx,$inout1 - xor $key0,%r9d - .byte 0x66,0x90 - aesenc $rndkeyx,$inout2 - aesenc $rndkeyx,$inout3 - mov %r9d,`0x10*($i-1)`+12(%rsp) - lea $i($ctr),%r9 - aesenc $rndkeyx,$inout4 - aesenc $rndkeyx,$inout5 - aesenc $rndkeyx,$inout6 - aesenc $rndkeyx,$inout7 - $movkey `0x20+0x10*$i`-0x80($key),$rndkeyx -___ -} -$code.=<<___; - bswap %r9d - aesenc $rndkey0,$inout0 - aesenc $rndkey0,$inout1 - aesenc $rndkey0,$inout2 - xor $key0,%r9d - movdqu 0x00($inp),$in0 # start loading input - aesenc $rndkey0,$inout3 - mov %r9d,0x70+12(%rsp) - cmp \$11,$rounds - aesenc $rndkey0,$inout4 - aesenc $rndkey0,$inout5 - aesenc $rndkey0,$inout6 - aesenc $rndkey0,$inout7 - $movkey 0xa0-0x80($key),$rndkey0 - - jb .Lctr32_enc_done - - aesenc $rndkey1,$inout0 - aesenc $rndkey1,$inout1 - aesenc $rndkey1,$inout2 - aesenc $rndkey1,$inout3 - aesenc $rndkey1,$inout4 - aesenc $rndkey1,$inout5 - aesenc $rndkey1,$inout6 - aesenc $rndkey1,$inout7 - $movkey 0xb0-0x80($key),$rndkey1 - - aesenc $rndkey0,$inout0 - aesenc $rndkey0,$inout1 - aesenc $rndkey0,$inout2 - aesenc $rndkey0,$inout3 - aesenc $rndkey0,$inout4 - aesenc $rndkey0,$inout5 - aesenc $rndkey0,$inout6 - aesenc $rndkey0,$inout7 - $movkey 0xc0-0x80($key),$rndkey0 - - # 192-bit key support was removed. - - aesenc $rndkey1,$inout0 - aesenc $rndkey1,$inout1 - aesenc $rndkey1,$inout2 - aesenc $rndkey1,$inout3 - aesenc $rndkey1,$inout4 - aesenc $rndkey1,$inout5 - aesenc $rndkey1,$inout6 - aesenc $rndkey1,$inout7 - $movkey 0xd0-0x80($key),$rndkey1 - - aesenc $rndkey0,$inout0 - aesenc $rndkey0,$inout1 - aesenc $rndkey0,$inout2 - aesenc $rndkey0,$inout3 - aesenc $rndkey0,$inout4 - aesenc $rndkey0,$inout5 - aesenc $rndkey0,$inout6 - aesenc $rndkey0,$inout7 - $movkey 0xe0-0x80($key),$rndkey0 - jmp .Lctr32_enc_done - -.align 16 -.Lctr32_enc_done: - movdqu 0x10($inp),$in1 - pxor $rndkey0,$in0 # input^=round[last] - movdqu 0x20($inp),$in2 - pxor $rndkey0,$in1 - movdqu 0x30($inp),$in3 - pxor $rndkey0,$in2 - movdqu 0x40($inp),$in4 - pxor $rndkey0,$in3 - movdqu 0x50($inp),$in5 - pxor $rndkey0,$in4 - pxor $rndkey0,$in5 - aesenc $rndkey1,$inout0 - aesenc $rndkey1,$inout1 - aesenc $rndkey1,$inout2 - aesenc $rndkey1,$inout3 - aesenc $rndkey1,$inout4 - aesenc $rndkey1,$inout5 - aesenc $rndkey1,$inout6 - aesenc $rndkey1,$inout7 - movdqu 0x60($inp),$rndkey1 # borrow $rndkey1 for inp[6] - lea 0x80($inp),$inp # $inp+=8*16 - - aesenclast $in0,$inout0 # $inN is inp[N]^round[last] - pxor $rndkey0,$rndkey1 # borrowed $rndkey - movdqu 0x70-0x80($inp),$in0 - aesenclast $in1,$inout1 - pxor $rndkey0,$in0 - movdqa 0x00(%rsp),$in1 # load next counter block - aesenclast $in2,$inout2 - aesenclast $in3,$inout3 - movdqa 0x10(%rsp),$in2 - movdqa 0x20(%rsp),$in3 - aesenclast $in4,$inout4 - aesenclast $in5,$inout5 - movdqa 0x30(%rsp),$in4 - movdqa 0x40(%rsp),$in5 - aesenclast $rndkey1,$inout6 - movdqa 0x50(%rsp),$rndkey0 - $movkey 0x10-0x80($key),$rndkey1#real 1st-round key - aesenclast $in0,$inout7 - - movups $inout0,($out) # store 8 output blocks - movdqa $in1,$inout0 - movups $inout1,0x10($out) - movdqa $in2,$inout1 - movups $inout2,0x20($out) - movdqa $in3,$inout2 - movups $inout3,0x30($out) - movdqa $in4,$inout3 - movups $inout4,0x40($out) - movdqa $in5,$inout4 - movups $inout5,0x50($out) - movdqa $rndkey0,$inout5 - movups $inout6,0x60($out) - movups $inout7,0x70($out) - lea 0x80($out),$out # $out+=8*16 - - sub \$8,$len - jnc .Lctr32_loop8 # loop if $len-=8 didn't borrow - - add \$8,$len # restore real remaining $len - jz .Lctr32_done # done if ($len==0) - lea -0x80($key),$key - -.Lctr32_tail: - # note that at this point $inout0..5 are populated with - # counter values xor-ed with 0-round key - lea 16($key),$key - cmp \$4,$len - jb .Lctr32_loop3 - je .Lctr32_loop4 - - # if ($len>4) compute 7 E(counter) - shl \$4,$rounds - movdqa 0x60(%rsp),$inout6 - pxor $inout7,$inout7 - - $movkey 16($key),$rndkey0 - aesenc $rndkey1,$inout0 - aesenc $rndkey1,$inout1 - lea 32-16($key,$rounds),$key# prepare for .Lenc_loop8_enter - neg %rax - aesenc $rndkey1,$inout2 - add \$16,%rax # prepare for .Lenc_loop8_enter - movups ($inp),$in0 - aesenc $rndkey1,$inout3 - aesenc $rndkey1,$inout4 - movups 0x10($inp),$in1 # pre-load input - movups 0x20($inp),$in2 - aesenc $rndkey1,$inout5 - aesenc $rndkey1,$inout6 - - call .Lenc_loop8_enter - - movdqu 0x30($inp),$in3 - pxor $in0,$inout0 - movdqu 0x40($inp),$in0 - pxor $in1,$inout1 - movdqu $inout0,($out) # store output - pxor $in2,$inout2 - movdqu $inout1,0x10($out) - pxor $in3,$inout3 - movdqu $inout2,0x20($out) - pxor $in0,$inout4 - movdqu $inout3,0x30($out) - movdqu $inout4,0x40($out) - cmp \$6,$len - jb .Lctr32_done # $len was 5, stop store - - movups 0x50($inp),$in1 - xorps $in1,$inout5 - movups $inout5,0x50($out) - je .Lctr32_done # $len was 6, stop store - - movups 0x60($inp),$in2 - xorps $in2,$inout6 - movups $inout6,0x60($out) - jmp .Lctr32_done # $len was 7, stop store - -.align 32 -.Lctr32_loop4: - aesenc $rndkey1,$inout0 - lea 16($key),$key - dec $rounds - aesenc $rndkey1,$inout1 - aesenc $rndkey1,$inout2 - aesenc $rndkey1,$inout3 - $movkey ($key),$rndkey1 - jnz .Lctr32_loop4 - aesenclast $rndkey1,$inout0 - aesenclast $rndkey1,$inout1 - movups ($inp),$in0 # load input - movups 0x10($inp),$in1 - aesenclast $rndkey1,$inout2 - aesenclast $rndkey1,$inout3 - movups 0x20($inp),$in2 - movups 0x30($inp),$in3 - - xorps $in0,$inout0 - movups $inout0,($out) # store output - xorps $in1,$inout1 - movups $inout1,0x10($out) - pxor $in2,$inout2 - movdqu $inout2,0x20($out) - pxor $in3,$inout3 - movdqu $inout3,0x30($out) - jmp .Lctr32_done # $len was 4, stop store - -.align 32 -.Lctr32_loop3: - aesenc $rndkey1,$inout0 - lea 16($key),$key - dec $rounds - aesenc $rndkey1,$inout1 - aesenc $rndkey1,$inout2 - $movkey ($key),$rndkey1 - jnz .Lctr32_loop3 - aesenclast $rndkey1,$inout0 - aesenclast $rndkey1,$inout1 - aesenclast $rndkey1,$inout2 - - movups ($inp),$in0 # load input - xorps $in0,$inout0 - movups $inout0,($out) # store output - cmp \$2,$len - jb .Lctr32_done # $len was 1, stop store - - movups 0x10($inp),$in1 - xorps $in1,$inout1 - movups $inout1,0x10($out) - je .Lctr32_done # $len was 2, stop store - - movups 0x20($inp),$in2 - xorps $in2,$inout2 - movups $inout2,0x20($out) # $len was 3, stop store - -.Lctr32_done: - xorps %xmm0,%xmm0 # clear register bank - xor $key0,$key0 - pxor %xmm1,%xmm1 - pxor %xmm2,%xmm2 - pxor %xmm3,%xmm3 - pxor %xmm4,%xmm4 - pxor %xmm5,%xmm5 -___ -$code.=<<___ if (!$win64); - pxor %xmm6,%xmm6 - pxor %xmm7,%xmm7 - movaps %xmm0,0x00(%rsp) # clear stack - pxor %xmm8,%xmm8 - movaps %xmm0,0x10(%rsp) - pxor %xmm9,%xmm9 - movaps %xmm0,0x20(%rsp) - pxor %xmm10,%xmm10 - movaps %xmm0,0x30(%rsp) - pxor %xmm11,%xmm11 - movaps %xmm0,0x40(%rsp) - pxor %xmm12,%xmm12 - movaps %xmm0,0x50(%rsp) - pxor %xmm13,%xmm13 - movaps %xmm0,0x60(%rsp) - pxor %xmm14,%xmm14 - movaps %xmm0,0x70(%rsp) - pxor %xmm15,%xmm15 -___ -$code.=<<___ if ($win64); - movaps -0xa8($key_),%xmm6 - movaps %xmm0,-0xa8($key_) # clear stack - movaps -0x98($key_),%xmm7 - movaps %xmm0,-0x98($key_) - movaps -0x88($key_),%xmm8 - movaps %xmm0,-0x88($key_) - movaps -0x78($key_),%xmm9 - movaps %xmm0,-0x78($key_) - movaps -0x68($key_),%xmm10 - movaps %xmm0,-0x68($key_) - movaps -0x58($key_),%xmm11 - movaps %xmm0,-0x58($key_) - movaps -0x48($key_),%xmm12 - movaps %xmm0,-0x48($key_) - movaps -0x38($key_),%xmm13 - movaps %xmm0,-0x38($key_) - movaps -0x28($key_),%xmm14 - movaps %xmm0,-0x28($key_) - movaps -0x18($key_),%xmm15 - movaps %xmm0,-0x18($key_) - movaps %xmm0,0x00(%rsp) - movaps %xmm0,0x10(%rsp) - movaps %xmm0,0x20(%rsp) - movaps %xmm0,0x30(%rsp) - movaps %xmm0,0x40(%rsp) - movaps %xmm0,0x50(%rsp) - movaps %xmm0,0x60(%rsp) - movaps %xmm0,0x70(%rsp) -___ -$code.=<<___; - mov -8($key_),%rbp -.cfi_restore %rbp - lea ($key_),%rsp -.cfi_def_cfa_register %rsp -.Lctr32_epilogue: - ret -.cfi_endproc -.size GFp_${PREFIX}_ctr32_encrypt_blocks,.-GFp_${PREFIX}_ctr32_encrypt_blocks -___ -} }} - -{ my ($inp,$bits,$key) = @_4args; - $bits =~ s/%r/%e/; - -# This is based on submission by -# -# Huang Ying -# Vinodh Gopal -# Kahraman Akdemir -# -# Aggressively optimized in respect to aeskeygenassist's critical path -# and is contained in %xmm0-5 to meet Win64 ABI requirement. -# -# int GFp_${PREFIX}_set_encrypt_key(const unsigned char *inp, -# int bits, AES_KEY * const key); -# -# input: $inp user-supplied key -# $bits $inp length in bits -# $key pointer to key schedule -# output: %eax 0 denoting success, -1 or -2 - failure (see C) -# $bits rounds-1 (used in aesni_set_decrypt_key) -# *$key key schedule -# $key pointer to key schedule (used in -# aesni_set_decrypt_key) -# -# Subroutine is frame-less, which means that only volatile registers -# are used. Note that it's declared "abi-omnipotent", which means that -# amount of volatile registers is smaller on Windows. -# -$code.=<<___; -.globl GFp_${PREFIX}_set_encrypt_key -.type GFp_${PREFIX}_set_encrypt_key,\@abi-omnipotent -.align 16 -GFp_${PREFIX}_set_encrypt_key: -__aesni_set_encrypt_key: -.cfi_startproc - .byte 0x48,0x83,0xEC,0x08 # sub rsp,8 -.cfi_adjust_cfa_offset 8 - mov \$-1,%rax - test $inp,$inp - jz .Lenc_key_ret - test $key,$key - jz .Lenc_key_ret - - movups ($inp),%xmm0 # pull first 128 bits of *userKey - xorps %xmm4,%xmm4 # low dword of xmm4 is assumed 0 - leaq GFp_ia32cap_P(%rip),%r10 - movl 4(%r10),%r10d - and \$`1<<28|1<<11`,%r10d # AVX and XOP bits - lea 16($key),%rax # %rax is used as modifiable copy of $key - cmp \$256,$bits - je .L14rounds - # 192-bit key support was removed. - cmp \$128,$bits - jne .Lbad_keybits - -.L10rounds: - mov \$9,$bits # 10 rounds for 128-bit key - cmp \$`1<<28`,%r10d # AVX, bit no XOP - je .L10rounds_alt - - $movkey %xmm0,($key) # round 0 - aeskeygenassist \$0x1,%xmm0,%xmm1 # round 1 - call .Lkey_expansion_128_cold - aeskeygenassist \$0x2,%xmm0,%xmm1 # round 2 - call .Lkey_expansion_128 - aeskeygenassist \$0x4,%xmm0,%xmm1 # round 3 - call .Lkey_expansion_128 - aeskeygenassist \$0x8,%xmm0,%xmm1 # round 4 - call .Lkey_expansion_128 - aeskeygenassist \$0x10,%xmm0,%xmm1 # round 5 - call .Lkey_expansion_128 - aeskeygenassist \$0x20,%xmm0,%xmm1 # round 6 - call .Lkey_expansion_128 - aeskeygenassist \$0x40,%xmm0,%xmm1 # round 7 - call .Lkey_expansion_128 - aeskeygenassist \$0x80,%xmm0,%xmm1 # round 8 - call .Lkey_expansion_128 - aeskeygenassist \$0x1b,%xmm0,%xmm1 # round 9 - call .Lkey_expansion_128 - aeskeygenassist \$0x36,%xmm0,%xmm1 # round 10 - call .Lkey_expansion_128 - $movkey %xmm0,(%rax) - mov $bits,80(%rax) # 240(%rdx) - xor %eax,%eax - jmp .Lenc_key_ret - -.align 16 -.L10rounds_alt: - movdqa .Lkey_rotate(%rip),%xmm5 - mov \$8,%r10d - movdqa .Lkey_rcon1(%rip),%xmm4 - movdqa %xmm0,%xmm2 - movdqu %xmm0,($key) - jmp .Loop_key128 - -.align 16 -.Loop_key128: - pshufb %xmm5,%xmm0 - aesenclast %xmm4,%xmm0 - pslld \$1,%xmm4 - lea 16(%rax),%rax - - movdqa %xmm2,%xmm3 - pslldq \$4,%xmm2 - pxor %xmm2,%xmm3 - pslldq \$4,%xmm2 - pxor %xmm2,%xmm3 - pslldq \$4,%xmm2 - pxor %xmm3,%xmm2 - - pxor %xmm2,%xmm0 - movdqu %xmm0,-16(%rax) - movdqa %xmm0,%xmm2 - - dec %r10d - jnz .Loop_key128 - - movdqa .Lkey_rcon1b(%rip),%xmm4 - - pshufb %xmm5,%xmm0 - aesenclast %xmm4,%xmm0 - pslld \$1,%xmm4 - - movdqa %xmm2,%xmm3 - pslldq \$4,%xmm2 - pxor %xmm2,%xmm3 - pslldq \$4,%xmm2 - pxor %xmm2,%xmm3 - pslldq \$4,%xmm2 - pxor %xmm3,%xmm2 - - pxor %xmm2,%xmm0 - movdqu %xmm0,(%rax) - - movdqa %xmm0,%xmm2 - pshufb %xmm5,%xmm0 - aesenclast %xmm4,%xmm0 - - movdqa %xmm2,%xmm3 - pslldq \$4,%xmm2 - pxor %xmm2,%xmm3 - pslldq \$4,%xmm2 - pxor %xmm2,%xmm3 - pslldq \$4,%xmm2 - pxor %xmm3,%xmm2 - - pxor %xmm2,%xmm0 - movdqu %xmm0,16(%rax) - - mov $bits,96(%rax) # 240($key) - xor %eax,%eax - jmp .Lenc_key_ret - -# 192-bit key support was removed. - -.align 16 -.L14rounds: - movups 16($inp),%xmm2 # remaining half of *userKey - mov \$13,$bits # 14 rounds for 256 - lea 16(%rax),%rax - cmp \$`1<<28`,%r10d # AVX, but no XOP - je .L14rounds_alt - - $movkey %xmm0,($key) # round 0 - $movkey %xmm2,16($key) # round 1 - aeskeygenassist \$0x1,%xmm2,%xmm1 # round 2 - call .Lkey_expansion_256a_cold - aeskeygenassist \$0x1,%xmm0,%xmm1 # round 3 - call .Lkey_expansion_256b - aeskeygenassist \$0x2,%xmm2,%xmm1 # round 4 - call .Lkey_expansion_256a - aeskeygenassist \$0x2,%xmm0,%xmm1 # round 5 - call .Lkey_expansion_256b - aeskeygenassist \$0x4,%xmm2,%xmm1 # round 6 - call .Lkey_expansion_256a - aeskeygenassist \$0x4,%xmm0,%xmm1 # round 7 - call .Lkey_expansion_256b - aeskeygenassist \$0x8,%xmm2,%xmm1 # round 8 - call .Lkey_expansion_256a - aeskeygenassist \$0x8,%xmm0,%xmm1 # round 9 - call .Lkey_expansion_256b - aeskeygenassist \$0x10,%xmm2,%xmm1 # round 10 - call .Lkey_expansion_256a - aeskeygenassist \$0x10,%xmm0,%xmm1 # round 11 - call .Lkey_expansion_256b - aeskeygenassist \$0x20,%xmm2,%xmm1 # round 12 - call .Lkey_expansion_256a - aeskeygenassist \$0x20,%xmm0,%xmm1 # round 13 - call .Lkey_expansion_256b - aeskeygenassist \$0x40,%xmm2,%xmm1 # round 14 - call .Lkey_expansion_256a - $movkey %xmm0,(%rax) - mov $bits,16(%rax) # 240(%rdx) - xor %rax,%rax - jmp .Lenc_key_ret - -.align 16 -.L14rounds_alt: - movdqa .Lkey_rotate(%rip),%xmm5 - movdqa .Lkey_rcon1(%rip),%xmm4 - mov \$7,%r10d - movdqu %xmm0,0($key) - movdqa %xmm2,%xmm1 - movdqu %xmm2,16($key) - jmp .Loop_key256 - -.align 16 -.Loop_key256: - pshufb %xmm5,%xmm2 - aesenclast %xmm4,%xmm2 - - movdqa %xmm0,%xmm3 - pslldq \$4,%xmm0 - pxor %xmm0,%xmm3 - pslldq \$4,%xmm0 - pxor %xmm0,%xmm3 - pslldq \$4,%xmm0 - pxor %xmm3,%xmm0 - pslld \$1,%xmm4 - - pxor %xmm2,%xmm0 - movdqu %xmm0,(%rax) - - dec %r10d - jz .Ldone_key256 - - pshufd \$0xff,%xmm0,%xmm2 - pxor %xmm3,%xmm3 - aesenclast %xmm3,%xmm2 - - movdqa %xmm1,%xmm3 - pslldq \$4,%xmm1 - pxor %xmm1,%xmm3 - pslldq \$4,%xmm1 - pxor %xmm1,%xmm3 - pslldq \$4,%xmm1 - pxor %xmm3,%xmm1 - - pxor %xmm1,%xmm2 - movdqu %xmm2,16(%rax) - lea 32(%rax),%rax - movdqa %xmm2,%xmm1 - - jmp .Loop_key256 - -.Ldone_key256: - mov $bits,16(%rax) # 240($key) - xor %eax,%eax - jmp .Lenc_key_ret - -.align 16 -.Lbad_keybits: - mov \$-2,%rax -.Lenc_key_ret: - pxor %xmm0,%xmm0 - pxor %xmm1,%xmm1 - pxor %xmm2,%xmm2 - pxor %xmm3,%xmm3 - pxor %xmm4,%xmm4 - pxor %xmm5,%xmm5 - add \$8,%rsp -.cfi_adjust_cfa_offset -8 - ret -.cfi_endproc -.LSEH_end_GFp_set_encrypt_key: - -.align 16 -.Lkey_expansion_128: - $movkey %xmm0,(%rax) - lea 16(%rax),%rax -.Lkey_expansion_128_cold: - shufps \$0b00010000,%xmm0,%xmm4 - xorps %xmm4, %xmm0 - shufps \$0b10001100,%xmm0,%xmm4 - xorps %xmm4, %xmm0 - shufps \$0b11111111,%xmm1,%xmm1 # critical path - xorps %xmm1,%xmm0 - ret - -.align 16 -.Lkey_expansion_192a: - $movkey %xmm0,(%rax) - lea 16(%rax),%rax -.Lkey_expansion_192a_cold: - movaps %xmm2, %xmm5 -.Lkey_expansion_192b_warm: - shufps \$0b00010000,%xmm0,%xmm4 - movdqa %xmm2,%xmm3 - xorps %xmm4,%xmm0 - shufps \$0b10001100,%xmm0,%xmm4 - pslldq \$4,%xmm3 - xorps %xmm4,%xmm0 - pshufd \$0b01010101,%xmm1,%xmm1 # critical path - pxor %xmm3,%xmm2 - pxor %xmm1,%xmm0 - pshufd \$0b11111111,%xmm0,%xmm3 - pxor %xmm3,%xmm2 - ret - -.align 16 -.Lkey_expansion_192b: - movaps %xmm0,%xmm3 - shufps \$0b01000100,%xmm0,%xmm5 - $movkey %xmm5,(%rax) - shufps \$0b01001110,%xmm2,%xmm3 - $movkey %xmm3,16(%rax) - lea 32(%rax),%rax - jmp .Lkey_expansion_192b_warm - -.align 16 -.Lkey_expansion_256a: - $movkey %xmm2,(%rax) - lea 16(%rax),%rax -.Lkey_expansion_256a_cold: - shufps \$0b00010000,%xmm0,%xmm4 - xorps %xmm4,%xmm0 - shufps \$0b10001100,%xmm0,%xmm4 - xorps %xmm4,%xmm0 - shufps \$0b11111111,%xmm1,%xmm1 # critical path - xorps %xmm1,%xmm0 - ret - -.align 16 -.Lkey_expansion_256b: - $movkey %xmm0,(%rax) - lea 16(%rax),%rax - - shufps \$0b00010000,%xmm2,%xmm4 - xorps %xmm4,%xmm2 - shufps \$0b10001100,%xmm2,%xmm4 - xorps %xmm4,%xmm2 - shufps \$0b10101010,%xmm1,%xmm1 # critical path - xorps %xmm1,%xmm2 - ret -.size GFp_${PREFIX}_set_encrypt_key,.-GFp_${PREFIX}_set_encrypt_key -.size __aesni_set_encrypt_key,.-__aesni_set_encrypt_key -___ -} - -$code.=<<___; -.align 64 -.Lbswap_mask: - .byte 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 -.Lincrement32: - .long 6,6,6,0 -.Lincrement64: - .long 1,0,0,0 -.Lincrement1: - .byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 -.Lkey_rotate: - .long 0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d -.Lkey_rotate192: - .long 0x04070605,0x04070605,0x04070605,0x04070605 -.Lkey_rcon1: - .long 1,1,1,1 -.Lkey_rcon1b: - .long 0x1b,0x1b,0x1b,0x1b - -.asciz "AES for Intel AES-NI, CRYPTOGAMS by " -.align 64 -___ - -# EXCEPTION_DISPOSITION handler (EXCEPTION_RECORD *rec,ULONG64 frame, -# CONTEXT *context,DISPATCHER_CONTEXT *disp) -if ($win64) { -$rec="%rcx"; -$frame="%rdx"; -$context="%r8"; -$disp="%r9"; - -$code.=<<___; -.extern __imp_RtlVirtualUnwind -___ -$code.=<<___ if ($PREFIX eq "aes_hw"); -.type ctr_xts_se_handler,\@abi-omnipotent -.align 16 -ctr_xts_se_handler: - push %rsi - push %rdi - push %rbx - push %rbp - push %r12 - push %r13 - push %r14 - push %r15 - pushfq - sub \$64,%rsp - - mov 120($context),%rax # pull context->Rax - mov 248($context),%rbx # pull context->Rip - - mov 8($disp),%rsi # disp->ImageBase - mov 56($disp),%r11 # disp->HandlerData - - mov 0(%r11),%r10d # HandlerData[0] - lea (%rsi,%r10),%r10 # prologue lable - cmp %r10,%rbx # context->RipRsp - - mov 4(%r11),%r10d # HandlerData[1] - lea (%rsi,%r10),%r10 # epilogue label - cmp %r10,%rbx # context->Rip>=epilogue label - jae .Lcommon_seh_tail - - mov 208($context),%rax # pull context->R11 - - lea -0xa8(%rax),%rsi # %xmm save area - lea 512($context),%rdi # & context.Xmm6 - mov \$20,%ecx # 10*sizeof(%xmm0)/sizeof(%rax) - .long 0xa548f3fc # cld; rep movsq - - mov -8(%rax),%rbp # restore saved %rbp - mov %rbp,160($context) # restore context->Rbp - - -.Lcommon_seh_tail: - mov 8(%rax),%rdi - mov 16(%rax),%rsi - mov %rax,152($context) # restore context->Rsp - mov %rsi,168($context) # restore context->Rsi - mov %rdi,176($context) # restore context->Rdi - - mov 40($disp),%rdi # disp->ContextRecord - mov $context,%rsi # context - mov \$154,%ecx # sizeof(CONTEXT) - .long 0xa548f3fc # cld; rep movsq - - mov $disp,%rsi - xor %rcx,%rcx # arg1, UNW_FLAG_NHANDLER - mov 8(%rsi),%rdx # arg2, disp->ImageBase - mov 0(%rsi),%r8 # arg3, disp->ControlPc - mov 16(%rsi),%r9 # arg4, disp->FunctionEntry - mov 40(%rsi),%r10 # disp->ContextRecord - lea 56(%rsi),%r11 # &disp->HandlerData - lea 24(%rsi),%r12 # &disp->EstablisherFrame - mov %r10,32(%rsp) # arg5 - mov %r11,40(%rsp) # arg6 - mov %r12,48(%rsp) # arg7 - mov %rcx,56(%rsp) # arg8, (NULL) - call *__imp_RtlVirtualUnwind(%rip) - - mov \$1,%eax # ExceptionContinueSearch - add \$64,%rsp - popfq - pop %r15 - pop %r14 - pop %r13 - pop %r12 - pop %rbp - pop %rbx - pop %rdi - pop %rsi - ret -.size ctr_xts_se_handler,.-ctr_xts_se_handler - -.section .pdata -.align 4 -___ -$code.=<<___ if ($PREFIX eq "aes_hw"); - .rva .LSEH_begin_GFp_${PREFIX}_ctr32_encrypt_blocks - .rva .LSEH_end_GFp_${PREFIX}_ctr32_encrypt_blocks - .rva .LSEH_info_GFp_ctr32 -___ -$code.=<<___; - .rva GFp_${PREFIX}_set_encrypt_key - .rva .LSEH_end_GFp_set_encrypt_key - .rva .LSEH_info_GFp_key -.section .xdata -.align 8 -___ -$code.=<<___ if ($PREFIX eq "aes_hw"); -.LSEH_info_GFp_ctr32: - .byte 9,0,0,0 - .rva ctr_xts_se_handler - .rva .Lctr32_body,.Lctr32_epilogue # HandlerData[] -___ -$code.=<<___; -.LSEH_info_GFp_key: - .byte 0x01,0x04,0x01,0x00 - .byte 0x04,0x02,0x00,0x00 # sub rsp,8 -___ -} - -sub rex { - local *opcode=shift; - my ($dst,$src)=@_; - my $rex=0; - - $rex|=0x04 if($dst>=8); - $rex|=0x01 if($src>=8); - push @opcode,$rex|0x40 if($rex); -} - -sub aesni { - my $line=shift; - my @opcode=(0x66); - - if ($line=~/(aeskeygenassist)\s+\$([x0-9a-f]+),\s*%xmm([0-9]+),\s*%xmm([0-9]+)/) { - rex(\@opcode,$4,$3); - push @opcode,0x0f,0x3a,0xdf; - push @opcode,0xc0|($3&7)|(($4&7)<<3); # ModR/M - my $c=$2; - push @opcode,$c=~/^0/?oct($c):$c; - return ".byte\t".join(',',@opcode); - } - elsif ($line=~/(aes[a-z]+)\s+%xmm([0-9]+),\s*%xmm([0-9]+)/) { - my %opcodelet = ( - "aesimc" => 0xdb, - "aesenc" => 0xdc, "aesenclast" => 0xdd, - "aesdec" => 0xde, "aesdeclast" => 0xdf - ); - return undef if (!defined($opcodelet{$1})); - rex(\@opcode,$3,$2); - push @opcode,0x0f,0x38,$opcodelet{$1}; - push @opcode,0xc0|($2&7)|(($3&7)<<3); # ModR/M - return ".byte\t".join(',',@opcode); - } - elsif ($line=~/(aes[a-z]+)\s+([0x1-9a-fA-F]*)\(%rsp\),\s*%xmm([0-9]+)/) { - my %opcodelet = ( - "aesenc" => 0xdc, "aesenclast" => 0xdd, - "aesdec" => 0xde, "aesdeclast" => 0xdf - ); - return undef if (!defined($opcodelet{$1})); - my $off = $2; - push @opcode,0x44 if ($3>=8); - push @opcode,0x0f,0x38,$opcodelet{$1}; - push @opcode,0x44|(($3&7)<<3),0x24; # ModR/M - push @opcode,($off=~/^0/?oct($off):$off)&0xff; - return ".byte\t".join(',',@opcode); - } - return $line; -} - -sub movbe { - ".byte 0x0f,0x38,0xf1,0x44,0x24,".shift; -} - -$code =~ s/\`([^\`]*)\`/eval($1)/gem; -$code =~ s/\b(aes.*%xmm[0-9]+).*$/aesni($1)/gem; -#$code =~ s/\bmovbe\s+%eax/bswap %eax; mov %eax/gm; # debugging artefact -$code =~ s/\bmovbe\s+%eax,\s*([0-9]+)\(%rsp\)/movbe($1)/gem; - -print $code; - -close STDOUT or die "error closing STDOUT"; diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/aes/asm/aesni-x86.pl temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/aes/asm/aesni-x86.pl --- temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/aes/asm/aesni-x86.pl 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/aes/asm/aesni-x86.pl 1970-01-01 00:00:00.000000000 +0000 @@ -1,971 +0,0 @@ -#! /usr/bin/env perl -# Copyright 2009-2016 The OpenSSL Project Authors. All Rights Reserved. -# -# Licensed under the OpenSSL license (the "License"). You may not use -# this file except in compliance with the License. You can obtain a copy -# in the file LICENSE in the source distribution or at -# https://www.openssl.org/source/license.html - - -# ==================================================================== -# Written by Andy Polyakov for the OpenSSL -# project. The module is, however, dual licensed under OpenSSL and -# CRYPTOGAMS licenses depending on where you obtain it. For further -# details see http://www.openssl.org/~appro/cryptogams/. -# ==================================================================== -# -# This module implements support for Intel AES-NI extension. In -# OpenSSL context it's used with Intel engine, but can also be used as -# drop-in replacement for crypto/aes/asm/aes-586.pl [see below for -# details]. -# -# Performance. -# -# To start with see corresponding paragraph in aesni-x86_64.pl... -# Instead of filling table similar to one found there I've chosen to -# summarize *comparison* results for raw ECB, CTR and CBC benchmarks. -# The simplified table below represents 32-bit performance relative -# to 64-bit one in every given point. Ratios vary for different -# encryption modes, therefore interval values. -# -# 16-byte 64-byte 256-byte 1-KB 8-KB -# 53-67% 67-84% 91-94% 95-98% 97-99.5% -# -# Lower ratios for smaller block sizes are perfectly understandable, -# because function call overhead is higher in 32-bit mode. Largest -# 8-KB block performance is virtually same: 32-bit code is less than -# 1% slower for ECB, CBC and CCM, and ~3% slower otherwise. - -# January 2011 -# -# See aesni-x86_64.pl for details. Unlike x86_64 version this module -# interleaves at most 6 aes[enc|dec] instructions, because there are -# not enough registers for 8x interleave [which should be optimal for -# Sandy Bridge]. Actually, performance results for 6x interleave -# factor presented in aesni-x86_64.pl (except for CTR) are for this -# module. - -# April 2011 -# -# Add aesni_xts_[en|de]crypt. Westmere spends 1.50 cycles processing -# one byte out of 8KB with 128-bit key, Sandy Bridge - 1.09. - -# November 2015 -# -# Add aesni_ocb_[en|de]crypt. [Removed in BoringSSL] - -###################################################################### -# Current large-block performance in cycles per byte processed with -# 128-bit key (less is better). -# -# CBC en-/decrypt CTR XTS ECB OCB -# Westmere 3.77/1.37 1.37 1.52 1.27 -# * Bridge 5.07/0.98 0.99 1.09 0.91 1.10 -# Haswell 4.44/0.80 0.97 1.03 0.72 0.76 -# Skylake 2.68/0.65 0.65 0.66 0.64 0.66 -# Silvermont 5.77/3.56 3.67 4.03 3.46 4.03 -# Goldmont 3.84/1.39 1.39 1.63 1.31 1.70 -# Bulldozer 5.80/0.98 1.05 1.24 0.93 1.23 - -$PREFIX="GFp_aes_hw"; # if $PREFIX is set to "AES", the script - # generates drop-in replacement for - # crypto/aes/asm/aes-586.pl:-) -$AESNI_PREFIX="GFp_aes_hw"; -$inline=1; # inline _aesni_[en|de]crypt - -$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; -push(@INC,"${dir}","${dir}../../../perlasm"); -require "x86asm.pl"; - -$output = pop; -open OUT,">$output"; -*STDOUT=*OUT; - -&asm_init($ARGV[0]); - -&external_label("GFp_ia32cap_P"); -&static_label("key_const"); - -if ($PREFIX eq $AESNI_PREFIX) { $movekey=\&movups; } -else { $movekey=\&movups; } - -$len="eax"; -$rounds="ecx"; -$key="edx"; -$inp="esi"; -$out="edi"; -$rounds_="ebx"; # backup copy for $rounds -$key_="ebp"; # backup copy for $key - -$rndkey0="xmm0"; -$rndkey1="xmm1"; -$inout0="xmm2"; -$inout1="xmm3"; -$inout2="xmm4"; -$inout3="xmm5"; $in1="xmm5"; -$inout4="xmm6"; $in0="xmm6"; -$inout5="xmm7"; $ivec="xmm7"; - -# AESNI extension -sub aeskeygenassist -{ my($dst,$src,$imm)=@_; - if ("$dst:$src" =~ /xmm([0-7]):xmm([0-7])/) - { &data_byte(0x66,0x0f,0x3a,0xdf,0xc0|($1<<3)|$2,$imm); } -} -sub aescommon -{ my($opcodelet,$dst,$src)=@_; - if ("$dst:$src" =~ /xmm([0-7]):xmm([0-7])/) - { &data_byte(0x66,0x0f,0x38,$opcodelet,0xc0|($1<<3)|$2);} -} -sub aesimc { aescommon(0xdb,@_); } -sub aesenc { aescommon(0xdc,@_); } -sub aesenclast { aescommon(0xdd,@_); } - -# Inline version of internal aesni_[en|de]crypt1 -{ my $sn; -sub aesni_inline_generate1 -{ my ($p,$inout,$ivec)=@_; $inout=$inout0 if (!defined($inout)); - $sn++; - - &$movekey ($rndkey0,&QWP(0,$key)); - &$movekey ($rndkey1,&QWP(16,$key)); - &xorps ($ivec,$rndkey0) if (defined($ivec)); - &lea ($key,&DWP(32,$key)); - &xorps ($inout,$ivec) if (defined($ivec)); - &xorps ($inout,$rndkey0) if (!defined($ivec)); - &set_label("${p}1_loop_$sn"); - eval"&aes${p} ($inout,$rndkey1)"; - &dec ($rounds); - &$movekey ($rndkey1,&QWP(0,$key)); - &lea ($key,&DWP(16,$key)); - &jnz (&label("${p}1_loop_$sn")); - eval"&aes${p}last ($inout,$rndkey1)"; -}} - -sub aesni_generate1 # fully unrolled loop -{ my ($p,$inout)=@_; $inout=$inout0 if (!defined($inout)); - - &function_begin_B("_aesni_${p}rypt1"); - &movups ($rndkey0,&QWP(0,$key)); - &$movekey ($rndkey1,&QWP(0x10,$key)); - &xorps ($inout,$rndkey0); - &$movekey ($rndkey0,&QWP(0x20,$key)); - &lea ($key,&DWP(0x30,$key)); - &cmp ($rounds,11); - &jb (&label("${p}128")); - &lea ($key,&DWP(0x40,$key)); - # 192-bit key support was removed. - - eval"&aes${p} ($inout,$rndkey1)"; - &$movekey ($rndkey1,&QWP(-0x40,$key)); - eval"&aes${p} ($inout,$rndkey0)"; - &$movekey ($rndkey0,&QWP(-0x30,$key)); - - # 192-bit key support was removed. - eval"&aes${p} ($inout,$rndkey1)"; - &$movekey ($rndkey1,&QWP(-0x20,$key)); - eval"&aes${p} ($inout,$rndkey0)"; - &$movekey ($rndkey0,&QWP(-0x10,$key)); - &set_label("${p}128"); - eval"&aes${p} ($inout,$rndkey1)"; - &$movekey ($rndkey1,&QWP(0,$key)); - eval"&aes${p} ($inout,$rndkey0)"; - &$movekey ($rndkey0,&QWP(0x10,$key)); - eval"&aes${p} ($inout,$rndkey1)"; - &$movekey ($rndkey1,&QWP(0x20,$key)); - eval"&aes${p} ($inout,$rndkey0)"; - &$movekey ($rndkey0,&QWP(0x30,$key)); - eval"&aes${p} ($inout,$rndkey1)"; - &$movekey ($rndkey1,&QWP(0x40,$key)); - eval"&aes${p} ($inout,$rndkey0)"; - &$movekey ($rndkey0,&QWP(0x50,$key)); - eval"&aes${p} ($inout,$rndkey1)"; - &$movekey ($rndkey1,&QWP(0x60,$key)); - eval"&aes${p} ($inout,$rndkey0)"; - &$movekey ($rndkey0,&QWP(0x70,$key)); - eval"&aes${p} ($inout,$rndkey1)"; - eval"&aes${p}last ($inout,$rndkey0)"; - &ret(); - &function_end_B("_aesni_${p}rypt1"); -} - -# void $PREFIX_encrypt (const void *inp,void *out,const AES_KEY *key); -&aesni_generate1("enc") if (!$inline); -&function_begin_B("${PREFIX}_encrypt"); - &mov ("eax",&wparam(0)); - &mov ($key,&wparam(2)); - &movups ($inout0,&QWP(0,"eax")); - &mov ($rounds,&DWP(240,$key)); - &mov ("eax",&wparam(1)); - if ($inline) - { &aesni_inline_generate1("enc"); } - else - { &call ("_aesni_encrypt1"); } - &pxor ($rndkey0,$rndkey0); # clear register bank - &pxor ($rndkey1,$rndkey1); - &movups (&QWP(0,"eax"),$inout0); - &pxor ($inout0,$inout0); - &ret (); -&function_end_B("${PREFIX}_encrypt"); - -# _aesni_[en|de]cryptN are private interfaces, N denotes interleave -# factor. Why 3x subroutine were originally used in loops? Even though -# aes[enc|dec] latency was originally 6, it could be scheduled only -# every *2nd* cycle. Thus 3x interleave was the one providing optimal -# utilization, i.e. when subroutine's throughput is virtually same as -# of non-interleaved subroutine [for number of input blocks up to 3]. -# This is why it originally made no sense to implement 2x subroutine. -# But times change and it became appropriate to spend extra 192 bytes -# on 2x subroutine on Atom Silvermont account. For processors that -# can schedule aes[enc|dec] every cycle optimal interleave factor -# equals to corresponding instructions latency. 8x is optimal for -# * Bridge, but it's unfeasible to accommodate such implementation -# in XMM registers addressable in 32-bit mode and therefore maximum -# of 6x is used instead... - -sub aesni_generate2 -{ my $p=shift; - - &function_begin_B("_aesni_${p}rypt2"); - &$movekey ($rndkey0,&QWP(0,$key)); - &shl ($rounds,4); - &$movekey ($rndkey1,&QWP(16,$key)); - &xorps ($inout0,$rndkey0); - &pxor ($inout1,$rndkey0); - &$movekey ($rndkey0,&QWP(32,$key)); - &lea ($key,&DWP(32,$key,$rounds)); - &neg ($rounds); - &add ($rounds,16); - - &set_label("${p}2_loop"); - eval"&aes${p} ($inout0,$rndkey1)"; - eval"&aes${p} ($inout1,$rndkey1)"; - &$movekey ($rndkey1,&QWP(0,$key,$rounds)); - &add ($rounds,32); - eval"&aes${p} ($inout0,$rndkey0)"; - eval"&aes${p} ($inout1,$rndkey0)"; - &$movekey ($rndkey0,&QWP(-16,$key,$rounds)); - &jnz (&label("${p}2_loop")); - eval"&aes${p} ($inout0,$rndkey1)"; - eval"&aes${p} ($inout1,$rndkey1)"; - eval"&aes${p}last ($inout0,$rndkey0)"; - eval"&aes${p}last ($inout1,$rndkey0)"; - &ret(); - &function_end_B("_aesni_${p}rypt2"); -} - -sub aesni_generate3 -{ my $p=shift; - - &function_begin_B("_aesni_${p}rypt3"); - &$movekey ($rndkey0,&QWP(0,$key)); - &shl ($rounds,4); - &$movekey ($rndkey1,&QWP(16,$key)); - &xorps ($inout0,$rndkey0); - &pxor ($inout1,$rndkey0); - &pxor ($inout2,$rndkey0); - &$movekey ($rndkey0,&QWP(32,$key)); - &lea ($key,&DWP(32,$key,$rounds)); - &neg ($rounds); - &add ($rounds,16); - - &set_label("${p}3_loop"); - eval"&aes${p} ($inout0,$rndkey1)"; - eval"&aes${p} ($inout1,$rndkey1)"; - eval"&aes${p} ($inout2,$rndkey1)"; - &$movekey ($rndkey1,&QWP(0,$key,$rounds)); - &add ($rounds,32); - eval"&aes${p} ($inout0,$rndkey0)"; - eval"&aes${p} ($inout1,$rndkey0)"; - eval"&aes${p} ($inout2,$rndkey0)"; - &$movekey ($rndkey0,&QWP(-16,$key,$rounds)); - &jnz (&label("${p}3_loop")); - eval"&aes${p} ($inout0,$rndkey1)"; - eval"&aes${p} ($inout1,$rndkey1)"; - eval"&aes${p} ($inout2,$rndkey1)"; - eval"&aes${p}last ($inout0,$rndkey0)"; - eval"&aes${p}last ($inout1,$rndkey0)"; - eval"&aes${p}last ($inout2,$rndkey0)"; - &ret(); - &function_end_B("_aesni_${p}rypt3"); -} - -# 4x interleave is implemented to improve small block performance, -# most notably [and naturally] 4 block by ~30%. One can argue that one -# should have implemented 5x as well, but improvement would be <20%, -# so it's not worth it... -sub aesni_generate4 -{ my $p=shift; - - &function_begin_B("_aesni_${p}rypt4"); - &$movekey ($rndkey0,&QWP(0,$key)); - &$movekey ($rndkey1,&QWP(16,$key)); - &shl ($rounds,4); - &xorps ($inout0,$rndkey0); - &pxor ($inout1,$rndkey0); - &pxor ($inout2,$rndkey0); - &pxor ($inout3,$rndkey0); - &$movekey ($rndkey0,&QWP(32,$key)); - &lea ($key,&DWP(32,$key,$rounds)); - &neg ($rounds); - &data_byte (0x0f,0x1f,0x40,0x00); - &add ($rounds,16); - - &set_label("${p}4_loop"); - eval"&aes${p} ($inout0,$rndkey1)"; - eval"&aes${p} ($inout1,$rndkey1)"; - eval"&aes${p} ($inout2,$rndkey1)"; - eval"&aes${p} ($inout3,$rndkey1)"; - &$movekey ($rndkey1,&QWP(0,$key,$rounds)); - &add ($rounds,32); - eval"&aes${p} ($inout0,$rndkey0)"; - eval"&aes${p} ($inout1,$rndkey0)"; - eval"&aes${p} ($inout2,$rndkey0)"; - eval"&aes${p} ($inout3,$rndkey0)"; - &$movekey ($rndkey0,&QWP(-16,$key,$rounds)); - &jnz (&label("${p}4_loop")); - - eval"&aes${p} ($inout0,$rndkey1)"; - eval"&aes${p} ($inout1,$rndkey1)"; - eval"&aes${p} ($inout2,$rndkey1)"; - eval"&aes${p} ($inout3,$rndkey1)"; - eval"&aes${p}last ($inout0,$rndkey0)"; - eval"&aes${p}last ($inout1,$rndkey0)"; - eval"&aes${p}last ($inout2,$rndkey0)"; - eval"&aes${p}last ($inout3,$rndkey0)"; - &ret(); - &function_end_B("_aesni_${p}rypt4"); -} - -sub aesni_generate6 -{ my $p=shift; - - &function_begin_B("_aesni_${p}rypt6"); - &static_label("_aesni_${p}rypt6_enter"); - &$movekey ($rndkey0,&QWP(0,$key)); - &shl ($rounds,4); - &$movekey ($rndkey1,&QWP(16,$key)); - &xorps ($inout0,$rndkey0); - &pxor ($inout1,$rndkey0); # pxor does better here - &pxor ($inout2,$rndkey0); - eval"&aes${p} ($inout0,$rndkey1)"; - &pxor ($inout3,$rndkey0); - &pxor ($inout4,$rndkey0); - eval"&aes${p} ($inout1,$rndkey1)"; - &lea ($key,&DWP(32,$key,$rounds)); - &neg ($rounds); - eval"&aes${p} ($inout2,$rndkey1)"; - &pxor ($inout5,$rndkey0); - &$movekey ($rndkey0,&QWP(0,$key,$rounds)); - &add ($rounds,16); - &jmp (&label("_aesni_${p}rypt6_inner")); - - &set_label("${p}6_loop",16); - eval"&aes${p} ($inout0,$rndkey1)"; - eval"&aes${p} ($inout1,$rndkey1)"; - eval"&aes${p} ($inout2,$rndkey1)"; - &set_label("_aesni_${p}rypt6_inner"); - eval"&aes${p} ($inout3,$rndkey1)"; - eval"&aes${p} ($inout4,$rndkey1)"; - eval"&aes${p} ($inout5,$rndkey1)"; - &set_label("_aesni_${p}rypt6_enter"); - &$movekey ($rndkey1,&QWP(0,$key,$rounds)); - &add ($rounds,32); - eval"&aes${p} ($inout0,$rndkey0)"; - eval"&aes${p} ($inout1,$rndkey0)"; - eval"&aes${p} ($inout2,$rndkey0)"; - eval"&aes${p} ($inout3,$rndkey0)"; - eval"&aes${p} ($inout4,$rndkey0)"; - eval"&aes${p} ($inout5,$rndkey0)"; - &$movekey ($rndkey0,&QWP(-16,$key,$rounds)); - &jnz (&label("${p}6_loop")); - - eval"&aes${p} ($inout0,$rndkey1)"; - eval"&aes${p} ($inout1,$rndkey1)"; - eval"&aes${p} ($inout2,$rndkey1)"; - eval"&aes${p} ($inout3,$rndkey1)"; - eval"&aes${p} ($inout4,$rndkey1)"; - eval"&aes${p} ($inout5,$rndkey1)"; - eval"&aes${p}last ($inout0,$rndkey0)"; - eval"&aes${p}last ($inout1,$rndkey0)"; - eval"&aes${p}last ($inout2,$rndkey0)"; - eval"&aes${p}last ($inout3,$rndkey0)"; - eval"&aes${p}last ($inout4,$rndkey0)"; - eval"&aes${p}last ($inout5,$rndkey0)"; - &ret(); - &function_end_B("_aesni_${p}rypt6"); -} -&aesni_generate2("enc") if ($PREFIX eq $AESNI_PREFIX); -&aesni_generate3("enc") if ($PREFIX eq $AESNI_PREFIX); -&aesni_generate4("enc") if ($PREFIX eq $AESNI_PREFIX); -&aesni_generate6("enc") if ($PREFIX eq $AESNI_PREFIX); - -if ($PREFIX eq $AESNI_PREFIX) { - -###################################################################### -# void aes_hw_ctr32_encrypt_blocks (const void *in, void *out, -# size_t blocks, const AES_KEY *key, -# const char *ivec); -# -# Handles only complete blocks, operates on 32-bit counter and -# does not update *ivec! (see crypto/modes/ctr128.c for details) -# -# stack layout: -# 0 pshufb mask -# 16 vector addend: 0,6,6,6 -# 32 counter-less ivec -# 48 1st triplet of counter vector -# 64 2nd triplet of counter vector -# 80 saved %esp - -&function_begin("${PREFIX}_ctr32_encrypt_blocks"); - &mov ($inp,&wparam(0)); - &mov ($out,&wparam(1)); - &mov ($len,&wparam(2)); - &mov ($key,&wparam(3)); - &mov ($rounds_,&wparam(4)); - &mov ($key_,"esp"); - &sub ("esp",88); - &and ("esp",-16); # align stack - &mov (&DWP(80,"esp"),$key_); - - &cmp ($len,1); - &je (&label("ctr32_one_shortcut")); - - &movdqu ($inout5,&QWP(0,$rounds_)); # load ivec - - # compose byte-swap control mask for pshufb on stack - &mov (&DWP(0,"esp"),0x0c0d0e0f); - &mov (&DWP(4,"esp"),0x08090a0b); - &mov (&DWP(8,"esp"),0x04050607); - &mov (&DWP(12,"esp"),0x00010203); - - # compose counter increment vector on stack - &mov ($rounds,6); - &xor ($key_,$key_); - &mov (&DWP(16,"esp"),$rounds); - &mov (&DWP(20,"esp"),$rounds); - &mov (&DWP(24,"esp"),$rounds); - &mov (&DWP(28,"esp"),$key_); - - &pextrd ($rounds_,$inout5,3); # pull 32-bit counter - &pinsrd ($inout5,$key_,3); # wipe 32-bit counter - - &mov ($rounds,&DWP(240,$key)); # key->rounds - - # compose 2 vectors of 3x32-bit counters - &bswap ($rounds_); - &pxor ($rndkey0,$rndkey0); - &pxor ($rndkey1,$rndkey1); - &movdqa ($inout0,&QWP(0,"esp")); # load byte-swap mask - &pinsrd ($rndkey0,$rounds_,0); - &lea ($key_,&DWP(3,$rounds_)); - &pinsrd ($rndkey1,$key_,0); - &inc ($rounds_); - &pinsrd ($rndkey0,$rounds_,1); - &inc ($key_); - &pinsrd ($rndkey1,$key_,1); - &inc ($rounds_); - &pinsrd ($rndkey0,$rounds_,2); - &inc ($key_); - &pinsrd ($rndkey1,$key_,2); - &movdqa (&QWP(48,"esp"),$rndkey0); # save 1st triplet - &pshufb ($rndkey0,$inout0); # byte swap - &movdqu ($inout4,&QWP(0,$key)); # key[0] - &movdqa (&QWP(64,"esp"),$rndkey1); # save 2nd triplet - &pshufb ($rndkey1,$inout0); # byte swap - - &pshufd ($inout0,$rndkey0,3<<6); # place counter to upper dword - &pshufd ($inout1,$rndkey0,2<<6); - &cmp ($len,6); - &jb (&label("ctr32_tail")); - &pxor ($inout5,$inout4); # counter-less ivec^key[0] - &shl ($rounds,4); - &mov ($rounds_,16); - &movdqa (&QWP(32,"esp"),$inout5); # save counter-less ivec^key[0] - &mov ($key_,$key); # backup $key - &sub ($rounds_,$rounds); # backup twisted $rounds - &lea ($key,&DWP(32,$key,$rounds)); - &sub ($len,6); - &jmp (&label("ctr32_loop6")); - -&set_label("ctr32_loop6",16); - # inlining _aesni_encrypt6's prologue gives ~6% improvement... - &pshufd ($inout2,$rndkey0,1<<6); - &movdqa ($rndkey0,&QWP(32,"esp")); # pull counter-less ivec - &pshufd ($inout3,$rndkey1,3<<6); - &pxor ($inout0,$rndkey0); # merge counter-less ivec - &pshufd ($inout4,$rndkey1,2<<6); - &pxor ($inout1,$rndkey0); - &pshufd ($inout5,$rndkey1,1<<6); - &$movekey ($rndkey1,&QWP(16,$key_)); - &pxor ($inout2,$rndkey0); - &pxor ($inout3,$rndkey0); - &aesenc ($inout0,$rndkey1); - &pxor ($inout4,$rndkey0); - &pxor ($inout5,$rndkey0); - &aesenc ($inout1,$rndkey1); - &$movekey ($rndkey0,&QWP(32,$key_)); - &mov ($rounds,$rounds_); - &aesenc ($inout2,$rndkey1); - &aesenc ($inout3,$rndkey1); - &aesenc ($inout4,$rndkey1); - &aesenc ($inout5,$rndkey1); - - &call (&label("_aesni_encrypt6_enter")); - - &movups ($rndkey1,&QWP(0,$inp)); - &movups ($rndkey0,&QWP(0x10,$inp)); - &xorps ($inout0,$rndkey1); - &movups ($rndkey1,&QWP(0x20,$inp)); - &xorps ($inout1,$rndkey0); - &movups (&QWP(0,$out),$inout0); - &movdqa ($rndkey0,&QWP(16,"esp")); # load increment - &xorps ($inout2,$rndkey1); - &movdqa ($rndkey1,&QWP(64,"esp")); # load 2nd triplet - &movups (&QWP(0x10,$out),$inout1); - &movups (&QWP(0x20,$out),$inout2); - - &paddd ($rndkey1,$rndkey0); # 2nd triplet increment - &paddd ($rndkey0,&QWP(48,"esp")); # 1st triplet increment - &movdqa ($inout0,&QWP(0,"esp")); # load byte swap mask - - &movups ($inout1,&QWP(0x30,$inp)); - &movups ($inout2,&QWP(0x40,$inp)); - &xorps ($inout3,$inout1); - &movups ($inout1,&QWP(0x50,$inp)); - &lea ($inp,&DWP(0x60,$inp)); - &movdqa (&QWP(48,"esp"),$rndkey0); # save 1st triplet - &pshufb ($rndkey0,$inout0); # byte swap - &xorps ($inout4,$inout2); - &movups (&QWP(0x30,$out),$inout3); - &xorps ($inout5,$inout1); - &movdqa (&QWP(64,"esp"),$rndkey1); # save 2nd triplet - &pshufb ($rndkey1,$inout0); # byte swap - &movups (&QWP(0x40,$out),$inout4); - &pshufd ($inout0,$rndkey0,3<<6); - &movups (&QWP(0x50,$out),$inout5); - &lea ($out,&DWP(0x60,$out)); - - &pshufd ($inout1,$rndkey0,2<<6); - &sub ($len,6); - &jnc (&label("ctr32_loop6")); - - &add ($len,6); - &jz (&label("ctr32_ret")); - &movdqu ($inout5,&QWP(0,$key_)); - &mov ($key,$key_); - &pxor ($inout5,&QWP(32,"esp")); # restore count-less ivec - &mov ($rounds,&DWP(240,$key_)); # restore $rounds - -&set_label("ctr32_tail"); - &por ($inout0,$inout5); - &cmp ($len,2); - &jb (&label("ctr32_one")); - - &pshufd ($inout2,$rndkey0,1<<6); - &por ($inout1,$inout5); - &je (&label("ctr32_two")); - - &pshufd ($inout3,$rndkey1,3<<6); - &por ($inout2,$inout5); - &cmp ($len,4); - &jb (&label("ctr32_three")); - - &pshufd ($inout4,$rndkey1,2<<6); - &por ($inout3,$inout5); - &je (&label("ctr32_four")); - - &por ($inout4,$inout5); - &call ("_aesni_encrypt6"); - &movups ($rndkey1,&QWP(0,$inp)); - &movups ($rndkey0,&QWP(0x10,$inp)); - &xorps ($inout0,$rndkey1); - &movups ($rndkey1,&QWP(0x20,$inp)); - &xorps ($inout1,$rndkey0); - &movups ($rndkey0,&QWP(0x30,$inp)); - &xorps ($inout2,$rndkey1); - &movups ($rndkey1,&QWP(0x40,$inp)); - &xorps ($inout3,$rndkey0); - &movups (&QWP(0,$out),$inout0); - &xorps ($inout4,$rndkey1); - &movups (&QWP(0x10,$out),$inout1); - &movups (&QWP(0x20,$out),$inout2); - &movups (&QWP(0x30,$out),$inout3); - &movups (&QWP(0x40,$out),$inout4); - &jmp (&label("ctr32_ret")); - -&set_label("ctr32_one_shortcut",16); - &movups ($inout0,&QWP(0,$rounds_)); # load ivec - &mov ($rounds,&DWP(240,$key)); - -&set_label("ctr32_one"); - if ($inline) - { &aesni_inline_generate1("enc"); } - else - { &call ("_aesni_encrypt1"); } - &movups ($in0,&QWP(0,$inp)); - &xorps ($in0,$inout0); - &movups (&QWP(0,$out),$in0); - &jmp (&label("ctr32_ret")); - -&set_label("ctr32_two",16); - &call ("_aesni_encrypt2"); - &movups ($inout3,&QWP(0,$inp)); - &movups ($inout4,&QWP(0x10,$inp)); - &xorps ($inout0,$inout3); - &xorps ($inout1,$inout4); - &movups (&QWP(0,$out),$inout0); - &movups (&QWP(0x10,$out),$inout1); - &jmp (&label("ctr32_ret")); - -&set_label("ctr32_three",16); - &call ("_aesni_encrypt3"); - &movups ($inout3,&QWP(0,$inp)); - &movups ($inout4,&QWP(0x10,$inp)); - &xorps ($inout0,$inout3); - &movups ($inout5,&QWP(0x20,$inp)); - &xorps ($inout1,$inout4); - &movups (&QWP(0,$out),$inout0); - &xorps ($inout2,$inout5); - &movups (&QWP(0x10,$out),$inout1); - &movups (&QWP(0x20,$out),$inout2); - &jmp (&label("ctr32_ret")); - -&set_label("ctr32_four",16); - &call ("_aesni_encrypt4"); - &movups ($inout4,&QWP(0,$inp)); - &movups ($inout5,&QWP(0x10,$inp)); - &movups ($rndkey1,&QWP(0x20,$inp)); - &xorps ($inout0,$inout4); - &movups ($rndkey0,&QWP(0x30,$inp)); - &xorps ($inout1,$inout5); - &movups (&QWP(0,$out),$inout0); - &xorps ($inout2,$rndkey1); - &movups (&QWP(0x10,$out),$inout1); - &xorps ($inout3,$rndkey0); - &movups (&QWP(0x20,$out),$inout2); - &movups (&QWP(0x30,$out),$inout3); - -&set_label("ctr32_ret"); - &pxor ("xmm0","xmm0"); # clear register bank - &pxor ("xmm1","xmm1"); - &pxor ("xmm2","xmm2"); - &pxor ("xmm3","xmm3"); - &pxor ("xmm4","xmm4"); - &movdqa (&QWP(32,"esp"),"xmm0"); # clear stack - &pxor ("xmm5","xmm5"); - &movdqa (&QWP(48,"esp"),"xmm0"); - &pxor ("xmm6","xmm6"); - &movdqa (&QWP(64,"esp"),"xmm0"); - &pxor ("xmm7","xmm7"); - &mov ("esp",&DWP(80,"esp")); -&function_end("${PREFIX}_ctr32_encrypt_blocks"); -} - -###################################################################### -# Mechanical port from aesni-x86_64.pl. -# -# _aesni_set_encrypt_key is private interface, -# input: -# "eax" const unsigned char *userKey -# $rounds int bits -# $key AES_KEY *key -# output: -# "eax" return code -# $round rounds - -&function_begin_B("_aesni_set_encrypt_key"); - &push ("ebp"); - &push ("ebx"); - &test ("eax","eax"); - &jz (&label("bad_pointer")); - &test ($key,$key); - &jz (&label("bad_pointer")); - - &call (&label("pic")); -&set_label("pic"); - &blindpop("ebx"); - &lea ("ebx",&DWP(&label("key_const")."-".&label("pic"),"ebx")); - - &picmeup("ebp","GFp_ia32cap_P","ebx",&label("key_const")); - &movups ("xmm0",&QWP(0,"eax")); # pull first 128 bits of *userKey - &xorps ("xmm4","xmm4"); # low dword of xmm4 is assumed 0 - &mov ("ebp",&DWP(4,"ebp")); - &lea ($key,&DWP(16,$key)); - &and ("ebp",1<<28|1<<11); # AVX and XOP bits - &cmp ($rounds,256); - &je (&label("14rounds")); - # 192-bit key support was removed. - &cmp ($rounds,128); - &jne (&label("bad_keybits")); - -&set_label("10rounds",16); - &cmp ("ebp",1<<28); - &je (&label("10rounds_alt")); - - &mov ($rounds,9); - &$movekey (&QWP(-16,$key),"xmm0"); # round 0 - &aeskeygenassist("xmm1","xmm0",0x01); # round 1 - &call (&label("key_128_cold")); - &aeskeygenassist("xmm1","xmm0",0x2); # round 2 - &call (&label("key_128")); - &aeskeygenassist("xmm1","xmm0",0x04); # round 3 - &call (&label("key_128")); - &aeskeygenassist("xmm1","xmm0",0x08); # round 4 - &call (&label("key_128")); - &aeskeygenassist("xmm1","xmm0",0x10); # round 5 - &call (&label("key_128")); - &aeskeygenassist("xmm1","xmm0",0x20); # round 6 - &call (&label("key_128")); - &aeskeygenassist("xmm1","xmm0",0x40); # round 7 - &call (&label("key_128")); - &aeskeygenassist("xmm1","xmm0",0x80); # round 8 - &call (&label("key_128")); - &aeskeygenassist("xmm1","xmm0",0x1b); # round 9 - &call (&label("key_128")); - &aeskeygenassist("xmm1","xmm0",0x36); # round 10 - &call (&label("key_128")); - &$movekey (&QWP(0,$key),"xmm0"); - &mov (&DWP(80,$key),$rounds); - - &jmp (&label("good_key")); - -&set_label("key_128",16); - &$movekey (&QWP(0,$key),"xmm0"); - &lea ($key,&DWP(16,$key)); -&set_label("key_128_cold"); - &shufps ("xmm4","xmm0",0b00010000); - &xorps ("xmm0","xmm4"); - &shufps ("xmm4","xmm0",0b10001100); - &xorps ("xmm0","xmm4"); - &shufps ("xmm1","xmm1",0b11111111); # critical path - &xorps ("xmm0","xmm1"); - &ret(); - -&set_label("10rounds_alt",16); - &movdqa ("xmm5",&QWP(0x00,"ebx")); - &mov ($rounds,8); - &movdqa ("xmm4",&QWP(0x20,"ebx")); - &movdqa ("xmm2","xmm0"); - &movdqu (&QWP(-16,$key),"xmm0"); - -&set_label("loop_key128"); - &pshufb ("xmm0","xmm5"); - &aesenclast ("xmm0","xmm4"); - &pslld ("xmm4",1); - &lea ($key,&DWP(16,$key)); - - &movdqa ("xmm3","xmm2"); - &pslldq ("xmm2",4); - &pxor ("xmm3","xmm2"); - &pslldq ("xmm2",4); - &pxor ("xmm3","xmm2"); - &pslldq ("xmm2",4); - &pxor ("xmm2","xmm3"); - - &pxor ("xmm0","xmm2"); - &movdqu (&QWP(-16,$key),"xmm0"); - &movdqa ("xmm2","xmm0"); - - &dec ($rounds); - &jnz (&label("loop_key128")); - - &movdqa ("xmm4",&QWP(0x30,"ebx")); - - &pshufb ("xmm0","xmm5"); - &aesenclast ("xmm0","xmm4"); - &pslld ("xmm4",1); - - &movdqa ("xmm3","xmm2"); - &pslldq ("xmm2",4); - &pxor ("xmm3","xmm2"); - &pslldq ("xmm2",4); - &pxor ("xmm3","xmm2"); - &pslldq ("xmm2",4); - &pxor ("xmm2","xmm3"); - - &pxor ("xmm0","xmm2"); - &movdqu (&QWP(0,$key),"xmm0"); - - &movdqa ("xmm2","xmm0"); - &pshufb ("xmm0","xmm5"); - &aesenclast ("xmm0","xmm4"); - - &movdqa ("xmm3","xmm2"); - &pslldq ("xmm2",4); - &pxor ("xmm3","xmm2"); - &pslldq ("xmm2",4); - &pxor ("xmm3","xmm2"); - &pslldq ("xmm2",4); - &pxor ("xmm2","xmm3"); - - &pxor ("xmm0","xmm2"); - &movdqu (&QWP(16,$key),"xmm0"); - - &mov ($rounds,9); - &mov (&DWP(96,$key),$rounds); - - &jmp (&label("good_key")); - -# 192-bit key support was removed. - -&set_label("14rounds",16); - &movups ("xmm2",&QWP(16,"eax")); # remaining half of *userKey - &lea ($key,&DWP(16,$key)); - &cmp ("ebp",1<<28); - &je (&label("14rounds_alt")); - - &mov ($rounds,13); - &$movekey (&QWP(-32,$key),"xmm0"); # round 0 - &$movekey (&QWP(-16,$key),"xmm2"); # round 1 - &aeskeygenassist("xmm1","xmm2",0x01); # round 2 - &call (&label("key_256a_cold")); - &aeskeygenassist("xmm1","xmm0",0x01); # round 3 - &call (&label("key_256b")); - &aeskeygenassist("xmm1","xmm2",0x02); # round 4 - &call (&label("key_256a")); - &aeskeygenassist("xmm1","xmm0",0x02); # round 5 - &call (&label("key_256b")); - &aeskeygenassist("xmm1","xmm2",0x04); # round 6 - &call (&label("key_256a")); - &aeskeygenassist("xmm1","xmm0",0x04); # round 7 - &call (&label("key_256b")); - &aeskeygenassist("xmm1","xmm2",0x08); # round 8 - &call (&label("key_256a")); - &aeskeygenassist("xmm1","xmm0",0x08); # round 9 - &call (&label("key_256b")); - &aeskeygenassist("xmm1","xmm2",0x10); # round 10 - &call (&label("key_256a")); - &aeskeygenassist("xmm1","xmm0",0x10); # round 11 - &call (&label("key_256b")); - &aeskeygenassist("xmm1","xmm2",0x20); # round 12 - &call (&label("key_256a")); - &aeskeygenassist("xmm1","xmm0",0x20); # round 13 - &call (&label("key_256b")); - &aeskeygenassist("xmm1","xmm2",0x40); # round 14 - &call (&label("key_256a")); - &$movekey (&QWP(0,$key),"xmm0"); - &mov (&DWP(16,$key),$rounds); - &xor ("eax","eax"); - - &jmp (&label("good_key")); - -&set_label("key_256a",16); - &$movekey (&QWP(0,$key),"xmm2"); - &lea ($key,&DWP(16,$key)); -&set_label("key_256a_cold"); - &shufps ("xmm4","xmm0",0b00010000); - &xorps ("xmm0","xmm4"); - &shufps ("xmm4","xmm0",0b10001100); - &xorps ("xmm0","xmm4"); - &shufps ("xmm1","xmm1",0b11111111); # critical path - &xorps ("xmm0","xmm1"); - &ret(); - -&set_label("key_256b",16); - &$movekey (&QWP(0,$key),"xmm0"); - &lea ($key,&DWP(16,$key)); - - &shufps ("xmm4","xmm2",0b00010000); - &xorps ("xmm2","xmm4"); - &shufps ("xmm4","xmm2",0b10001100); - &xorps ("xmm2","xmm4"); - &shufps ("xmm1","xmm1",0b10101010); # critical path - &xorps ("xmm2","xmm1"); - &ret(); - -&set_label("14rounds_alt",16); - &movdqa ("xmm5",&QWP(0x00,"ebx")); - &movdqa ("xmm4",&QWP(0x20,"ebx")); - &mov ($rounds,7); - &movdqu (&QWP(-32,$key),"xmm0"); - &movdqa ("xmm1","xmm2"); - &movdqu (&QWP(-16,$key),"xmm2"); - -&set_label("loop_key256"); - &pshufb ("xmm2","xmm5"); - &aesenclast ("xmm2","xmm4"); - - &movdqa ("xmm3","xmm0"); - &pslldq ("xmm0",4); - &pxor ("xmm3","xmm0"); - &pslldq ("xmm0",4); - &pxor ("xmm3","xmm0"); - &pslldq ("xmm0",4); - &pxor ("xmm0","xmm3"); - &pslld ("xmm4",1); - - &pxor ("xmm0","xmm2"); - &movdqu (&QWP(0,$key),"xmm0"); - - &dec ($rounds); - &jz (&label("done_key256")); - - &pshufd ("xmm2","xmm0",0xff); - &pxor ("xmm3","xmm3"); - &aesenclast ("xmm2","xmm3"); - - &movdqa ("xmm3","xmm1"); - &pslldq ("xmm1",4); - &pxor ("xmm3","xmm1"); - &pslldq ("xmm1",4); - &pxor ("xmm3","xmm1"); - &pslldq ("xmm1",4); - &pxor ("xmm1","xmm3"); - - &pxor ("xmm2","xmm1"); - &movdqu (&QWP(16,$key),"xmm2"); - &lea ($key,&DWP(32,$key)); - &movdqa ("xmm1","xmm2"); - &jmp (&label("loop_key256")); - -&set_label("done_key256"); - &mov ($rounds,13); - &mov (&DWP(16,$key),$rounds); - -&set_label("good_key"); - &pxor ("xmm0","xmm0"); - &pxor ("xmm1","xmm1"); - &pxor ("xmm2","xmm2"); - &pxor ("xmm3","xmm3"); - &pxor ("xmm4","xmm4"); - &pxor ("xmm5","xmm5"); - &xor ("eax","eax"); - &pop ("ebx"); - &pop ("ebp"); - &ret (); - -&set_label("bad_pointer",4); - &mov ("eax",-1); - &pop ("ebx"); - &pop ("ebp"); - &ret (); -&set_label("bad_keybits",4); - &pxor ("xmm0","xmm0"); - &mov ("eax",-2); - &pop ("ebx"); - &pop ("ebp"); - &ret (); -&function_end_B("_aesni_set_encrypt_key"); - -# int $PREFIX_set_encrypt_key (const unsigned char *userKey, int bits, -# AES_KEY *key) -&function_begin_B("${PREFIX}_set_encrypt_key"); - &mov ("eax",&wparam(0)); - &mov ($rounds,&wparam(1)); - &mov ($key,&wparam(2)); - &call ("_aesni_set_encrypt_key"); - &ret (); -&function_end_B("${PREFIX}_set_encrypt_key"); - -&set_label("key_const",64); -&data_word(0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d); -&data_word(0x04070605,0x04070605,0x04070605,0x04070605); -&data_word(1,1,1,1); -&data_word(0x1b,0x1b,0x1b,0x1b); -&asciz("AES for Intel AES-NI, CRYPTOGAMS by "); - -&asm_finish(); - -close STDOUT or die "error closing STDOUT"; diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/aes/asm/aesv8-armx.pl temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/aes/asm/aesv8-armx.pl --- temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/aes/asm/aesv8-armx.pl 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/aes/asm/aesv8-armx.pl 1970-01-01 00:00:00.000000000 +0000 @@ -1,630 +0,0 @@ -#! /usr/bin/env perl -# Copyright 2014-2016 The OpenSSL Project Authors. All Rights Reserved. -# -# Licensed under the OpenSSL license (the "License"). You may not use -# this file except in compliance with the License. You can obtain a copy -# in the file LICENSE in the source distribution or at -# https://www.openssl.org/source/license.html - -# -# ==================================================================== -# Written by Andy Polyakov for the OpenSSL -# project. The module is, however, dual licensed under OpenSSL and -# CRYPTOGAMS licenses depending on where you obtain it. For further -# details see http://www.openssl.org/~appro/cryptogams/. -# ==================================================================== -# -# This module implements support for ARMv8 AES instructions. The -# module is endian-agnostic in sense that it supports both big- and -# little-endian cases. As does it support both 32- and 64-bit modes -# of operation. Latter is achieved by limiting amount of utilized -# registers to 16, which implies additional NEON load and integer -# instructions. This has no effect on mighty Apple A7, where results -# are literally equal to the theoretical estimates based on AES -# instruction latencies and issue rates. On Cortex-A53, an in-order -# execution core, this costs up to 10-15%, which is partially -# compensated by implementing dedicated code path for 128-bit -# CBC encrypt case. On Cortex-A57 parallelizable mode performance -# seems to be limited by sheer amount of NEON instructions... -# -# Performance in cycles per byte processed with 128-bit key: -# -# CBC enc CBC dec CTR -# Apple A7 2.39 1.20 1.20 -# Cortex-A53 1.32 1.29 1.46 -# Cortex-A57(*) 1.95 0.85 0.93 -# Denver 1.96 0.86 0.80 -# Mongoose 1.33 1.20 1.20 -# -# (*) original 3.64/1.34/1.32 results were for r0p0 revision -# and are still same even for updated module; - -$flavour = shift; -$output = shift; - -$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; -( $xlate="${dir}arm-xlate.pl" and -f $xlate ) or -( $xlate="${dir}../../../perlasm/arm-xlate.pl" and -f $xlate) or -die "can't locate arm-xlate.pl"; - -open OUT,"| \"$^X\" $xlate $flavour $output"; -*STDOUT=*OUT; - -$prefix="aes_hw"; - -$code=<<___; -#include - -#if __ARM_MAX_ARCH__>=7 -.text -___ -$code.=".arch armv8-a+crypto\n" if ($flavour =~ /64/); -$code.=<<___ if ($flavour !~ /64/); -.arch armv7-a // don't confuse not-so-latest binutils with argv8 :-) -.fpu neon -.code 32 -#undef __thumb2__ -___ - -# Assembler mnemonics are an eclectic mix of 32- and 64-bit syntax, -# NEON is mostly 32-bit mnemonics, integer - mostly 64. Goal is to -# maintain both 32- and 64-bit codes within single module and -# transliterate common code to either flavour with regex vodoo. -# -{{{ -my ($inp,$bits,$out,$ptr,$rounds)=("x0","w1","x2","x3","w12"); -my ($zero,$rcon,$mask,$in0,$in1,$tmp,$key)= - $flavour=~/64/? map("q$_",(0..6)) : map("q$_",(0..3,8..10)); - - -# On AArch64, put the data .rodata and use adrp + add for compatibility with -# execute-only memory. On AArch32, put it in .text and use adr. -$code.= ".section .rodata\n" if ($flavour =~ /64/); -$code.=<<___; -.align 5 -.Lrcon: -.long 0x01,0x01,0x01,0x01 -.long 0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d // rotate-n-splat -.long 0x1b,0x1b,0x1b,0x1b - -.text - -.globl GFp_${prefix}_set_encrypt_key -.type GFp_${prefix}_set_encrypt_key,%function -.align 5 -GFp_${prefix}_set_encrypt_key: -.Lenc_key: -___ -$code.=<<___ if ($flavour =~ /64/); - // Armv8.3-A PAuth: even though x30 is pushed to stack it is not popped later. - AARCH64_VALID_CALL_TARGET - stp x29,x30,[sp,#-16]! - add x29,sp,#0 -___ -$code.=<<___; - mov $ptr,#-1 - cmp $inp,#0 - b.eq .Lenc_key_abort - cmp $out,#0 - b.eq .Lenc_key_abort - mov $ptr,#-2 - cmp $bits,#128 - b.lt .Lenc_key_abort - cmp $bits,#256 - b.gt .Lenc_key_abort - tst $bits,#0x3f - b.ne .Lenc_key_abort - -___ -$code.=<<___ if ($flavour =~ /64/); - adrp $ptr,:pg_hi21:.Lrcon - add $ptr,$ptr,:lo12:.Lrcon -___ -$code.=<<___ if ($flavour !~ /64/); - adr $ptr,.Lrcon -___ -$code.=<<___; - cmp $bits,#192 - - veor $zero,$zero,$zero - vld1.8 {$in0},[$inp],#16 - mov $bits,#8 // reuse $bits - vld1.32 {$rcon,$mask},[$ptr],#32 - - b.lt .Loop128 - // 192-bit key support was removed. - b .L256 - -.align 4 -.Loop128: - vtbl.8 $key,{$in0},$mask - vext.8 $tmp,$zero,$in0,#12 - vst1.32 {$in0},[$out],#16 - aese $key,$zero - subs $bits,$bits,#1 - - veor $in0,$in0,$tmp - vext.8 $tmp,$zero,$tmp,#12 - veor $in0,$in0,$tmp - vext.8 $tmp,$zero,$tmp,#12 - veor $key,$key,$rcon - veor $in0,$in0,$tmp - vshl.u8 $rcon,$rcon,#1 - veor $in0,$in0,$key - b.ne .Loop128 - - vld1.32 {$rcon},[$ptr] - - vtbl.8 $key,{$in0},$mask - vext.8 $tmp,$zero,$in0,#12 - vst1.32 {$in0},[$out],#16 - aese $key,$zero - - veor $in0,$in0,$tmp - vext.8 $tmp,$zero,$tmp,#12 - veor $in0,$in0,$tmp - vext.8 $tmp,$zero,$tmp,#12 - veor $key,$key,$rcon - veor $in0,$in0,$tmp - vshl.u8 $rcon,$rcon,#1 - veor $in0,$in0,$key - - vtbl.8 $key,{$in0},$mask - vext.8 $tmp,$zero,$in0,#12 - vst1.32 {$in0},[$out],#16 - aese $key,$zero - - veor $in0,$in0,$tmp - vext.8 $tmp,$zero,$tmp,#12 - veor $in0,$in0,$tmp - vext.8 $tmp,$zero,$tmp,#12 - veor $key,$key,$rcon - veor $in0,$in0,$tmp - veor $in0,$in0,$key - vst1.32 {$in0},[$out] - add $out,$out,#0x50 - - mov $rounds,#10 - b .Ldone - -// 192-bit key support was removed. - -.align 4 -.L256: - vld1.8 {$in1},[$inp] - mov $bits,#7 - mov $rounds,#14 - vst1.32 {$in0},[$out],#16 - -.Loop256: - vtbl.8 $key,{$in1},$mask - vext.8 $tmp,$zero,$in0,#12 - vst1.32 {$in1},[$out],#16 - aese $key,$zero - subs $bits,$bits,#1 - - veor $in0,$in0,$tmp - vext.8 $tmp,$zero,$tmp,#12 - veor $in0,$in0,$tmp - vext.8 $tmp,$zero,$tmp,#12 - veor $key,$key,$rcon - veor $in0,$in0,$tmp - vshl.u8 $rcon,$rcon,#1 - veor $in0,$in0,$key - vst1.32 {$in0},[$out],#16 - b.eq .Ldone - - vdup.32 $key,${in0}[3] // just splat - vext.8 $tmp,$zero,$in1,#12 - aese $key,$zero - - veor $in1,$in1,$tmp - vext.8 $tmp,$zero,$tmp,#12 - veor $in1,$in1,$tmp - vext.8 $tmp,$zero,$tmp,#12 - veor $in1,$in1,$tmp - - veor $in1,$in1,$key - b .Loop256 - -.Ldone: - str $rounds,[$out] - mov $ptr,#0 - -.Lenc_key_abort: - mov x0,$ptr // return value - `"ldr x29,[sp],#16" if ($flavour =~ /64/)` - ret -.size GFp_${prefix}_set_encrypt_key,.-GFp_${prefix}_set_encrypt_key -___ -}}} -{{{ -sub gen_block () { -my $dir = shift; -my ($e,$mc) = $dir eq "en" ? ("e","mc") : ("d","imc"); -my ($inp,$out,$key)=map("x$_",(0..2)); -my $rounds="w3"; -my ($rndkey0,$rndkey1,$inout)=map("q$_",(0..3)); - -$code.=<<___; -.globl GFp_${prefix}_${dir}crypt -.type GFp_${prefix}_${dir}crypt,%function -.align 5 -GFp_${prefix}_${dir}crypt: - AARCH64_VALID_CALL_TARGET - ldr $rounds,[$key,#240] - vld1.32 {$rndkey0},[$key],#16 - vld1.8 {$inout},[$inp] - sub $rounds,$rounds,#2 - vld1.32 {$rndkey1},[$key],#16 - -.Loop_${dir}c: - aes$e $inout,$rndkey0 - aes$mc $inout,$inout - vld1.32 {$rndkey0},[$key],#16 - subs $rounds,$rounds,#2 - aes$e $inout,$rndkey1 - aes$mc $inout,$inout - vld1.32 {$rndkey1},[$key],#16 - b.gt .Loop_${dir}c - - aes$e $inout,$rndkey0 - aes$mc $inout,$inout - vld1.32 {$rndkey0},[$key] - aes$e $inout,$rndkey1 - veor $inout,$inout,$rndkey0 - - vst1.8 {$inout},[$out] - ret -.size GFp_${prefix}_${dir}crypt,.-GFp_${prefix}_${dir}crypt -___ -} -&gen_block("en"); -&gen_block("de"); -}}} -{{{ -my ($inp,$out,$len,$key,$ivp)=map("x$_",(0..4)); -my ($rounds,$cnt,$key_)=("w5","w6","x7"); -my ($ctr,$tctr0,$tctr1,$tctr2)=map("w$_",(8..10,12)); -my $step="x12"; # aliases with $tctr2 - -my ($dat0,$dat1,$in0,$in1,$tmp0,$tmp1,$ivec,$rndlast)=map("q$_",(0..7)); -my ($dat2,$in2,$tmp2)=map("q$_",(10,11,9)); - -my ($dat,$tmp)=($dat0,$tmp0); - -### q8-q15 preloaded key schedule - -$code.=<<___; -.globl GFp_${prefix}_ctr32_encrypt_blocks -.type GFp_${prefix}_ctr32_encrypt_blocks,%function -.align 5 -GFp_${prefix}_ctr32_encrypt_blocks: -___ -$code.=<<___ if ($flavour =~ /64/); - // Armv8.3-A PAuth: even though x30 is pushed to stack it is not popped later. - AARCH64_VALID_CALL_TARGET - stp x29,x30,[sp,#-16]! - add x29,sp,#0 -___ -$code.=<<___ if ($flavour !~ /64/); - mov ip,sp - stmdb sp!,{r4-r10,lr} - vstmdb sp!,{d8-d15} @ ABI specification says so - ldr r4, [ip] @ load remaining arg -___ -$code.=<<___; - ldr $rounds,[$key,#240] - - ldr $ctr, [$ivp, #12] - vld1.32 {$dat0},[$ivp] - - vld1.32 {q8-q9},[$key] // load key schedule... - sub $rounds,$rounds,#4 - mov $step,#16 - cmp $len,#2 - add $key_,$key,x5,lsl#4 // pointer to last 5 round keys - sub $rounds,$rounds,#2 - vld1.32 {q12-q13},[$key_],#32 - vld1.32 {q14-q15},[$key_],#32 - vld1.32 {$rndlast},[$key_] - add $key_,$key,#32 - mov $cnt,$rounds - cclr $step,lo - - // ARM Cortex-A57 and Cortex-A72 cores running in 32-bit mode are - // affected by silicon errata #1742098 [0] and #1655431 [1], - // respectively, where the second instruction of an aese/aesmc - // instruction pair may execute twice if an interrupt is taken right - // after the first instruction consumes an input register of which a - // single 32-bit lane has been updated the last time it was modified. - // - // This function uses a counter in one 32-bit lane. The vmov.32 lines - // could write to $dat1 and $dat2 directly, but that trips this bugs. - // We write to $ivec and copy to the final register as a workaround. - // - // [0] ARM-EPM-049219 v23 Cortex-A57 MPCore Software Developers Errata Notice - // [1] ARM-EPM-012079 v11.0 Cortex-A72 MPCore Software Developers Errata Notice -#ifndef __ARMEB__ - rev $ctr, $ctr -#endif - add $tctr1, $ctr, #1 - vorr $ivec,$dat0,$dat0 - rev $tctr1, $tctr1 - vmov.32 ${ivec}[3],$tctr1 - add $ctr, $ctr, #2 - vorr $dat1,$ivec,$ivec - b.ls .Lctr32_tail - rev $tctr2, $ctr - vmov.32 ${ivec}[3],$tctr2 - sub $len,$len,#3 // bias - vorr $dat2,$ivec,$ivec - b .Loop3x_ctr32 - -.align 4 -.Loop3x_ctr32: - aese $dat0,q8 - aesmc $dat0,$dat0 - aese $dat1,q8 - aesmc $dat1,$dat1 - aese $dat2,q8 - aesmc $dat2,$dat2 - vld1.32 {q8},[$key_],#16 - subs $cnt,$cnt,#2 - aese $dat0,q9 - aesmc $dat0,$dat0 - aese $dat1,q9 - aesmc $dat1,$dat1 - aese $dat2,q9 - aesmc $dat2,$dat2 - vld1.32 {q9},[$key_],#16 - b.gt .Loop3x_ctr32 - - aese $dat0,q8 - aesmc $tmp0,$dat0 - aese $dat1,q8 - aesmc $tmp1,$dat1 - vld1.8 {$in0},[$inp],#16 - add $tctr0,$ctr,#1 - aese $dat2,q8 - aesmc $dat2,$dat2 - vld1.8 {$in1},[$inp],#16 - rev $tctr0,$tctr0 - aese $tmp0,q9 - aesmc $tmp0,$tmp0 - aese $tmp1,q9 - aesmc $tmp1,$tmp1 - vld1.8 {$in2},[$inp],#16 - mov $key_,$key - aese $dat2,q9 - aesmc $tmp2,$dat2 - aese $tmp0,q12 - aesmc $tmp0,$tmp0 - aese $tmp1,q12 - aesmc $tmp1,$tmp1 - veor $in0,$in0,$rndlast - add $tctr1,$ctr,#2 - aese $tmp2,q12 - aesmc $tmp2,$tmp2 - veor $in1,$in1,$rndlast - add $ctr,$ctr,#3 - aese $tmp0,q13 - aesmc $tmp0,$tmp0 - aese $tmp1,q13 - aesmc $tmp1,$tmp1 - // Note the logic to update $dat0, $dat1, and $dat1 is written to work - // around a bug in ARM Cortex-A57 and Cortex-A72 cores running in - // 32-bit mode. See the comment above. - veor $in2,$in2,$rndlast - vmov.32 ${ivec}[3], $tctr0 - aese $tmp2,q13 - aesmc $tmp2,$tmp2 - vorr $dat0,$ivec,$ivec - rev $tctr1,$tctr1 - aese $tmp0,q14 - aesmc $tmp0,$tmp0 - vmov.32 ${ivec}[3], $tctr1 - rev $tctr2,$ctr - aese $tmp1,q14 - aesmc $tmp1,$tmp1 - vorr $dat1,$ivec,$ivec - vmov.32 ${ivec}[3], $tctr2 - aese $tmp2,q14 - aesmc $tmp2,$tmp2 - vorr $dat2,$ivec,$ivec - subs $len,$len,#3 - aese $tmp0,q15 - aese $tmp1,q15 - aese $tmp2,q15 - - veor $in0,$in0,$tmp0 - vld1.32 {q8},[$key_],#16 // re-pre-load rndkey[0] - vst1.8 {$in0},[$out],#16 - veor $in1,$in1,$tmp1 - mov $cnt,$rounds - vst1.8 {$in1},[$out],#16 - veor $in2,$in2,$tmp2 - vld1.32 {q9},[$key_],#16 // re-pre-load rndkey[1] - vst1.8 {$in2},[$out],#16 - b.hs .Loop3x_ctr32 - - adds $len,$len,#3 - b.eq .Lctr32_done - cmp $len,#1 - mov $step,#16 - cclr $step,eq - -.Lctr32_tail: - aese $dat0,q8 - aesmc $dat0,$dat0 - aese $dat1,q8 - aesmc $dat1,$dat1 - vld1.32 {q8},[$key_],#16 - subs $cnt,$cnt,#2 - aese $dat0,q9 - aesmc $dat0,$dat0 - aese $dat1,q9 - aesmc $dat1,$dat1 - vld1.32 {q9},[$key_],#16 - b.gt .Lctr32_tail - - aese $dat0,q8 - aesmc $dat0,$dat0 - aese $dat1,q8 - aesmc $dat1,$dat1 - aese $dat0,q9 - aesmc $dat0,$dat0 - aese $dat1,q9 - aesmc $dat1,$dat1 - vld1.8 {$in0},[$inp],$step - aese $dat0,q12 - aesmc $dat0,$dat0 - aese $dat1,q12 - aesmc $dat1,$dat1 - vld1.8 {$in1},[$inp] - aese $dat0,q13 - aesmc $dat0,$dat0 - aese $dat1,q13 - aesmc $dat1,$dat1 - veor $in0,$in0,$rndlast - aese $dat0,q14 - aesmc $dat0,$dat0 - aese $dat1,q14 - aesmc $dat1,$dat1 - veor $in1,$in1,$rndlast - aese $dat0,q15 - aese $dat1,q15 - - cmp $len,#1 - veor $in0,$in0,$dat0 - veor $in1,$in1,$dat1 - vst1.8 {$in0},[$out],#16 - b.eq .Lctr32_done - vst1.8 {$in1},[$out] - -.Lctr32_done: -___ -$code.=<<___ if ($flavour !~ /64/); - vldmia sp!,{d8-d15} - ldmia sp!,{r4-r10,pc} -___ -$code.=<<___ if ($flavour =~ /64/); - ldr x29,[sp],#16 - ret -___ -$code.=<<___; -.size GFp_${prefix}_ctr32_encrypt_blocks,.-GFp_${prefix}_ctr32_encrypt_blocks -___ -}}} -$code.=<<___; -#endif -___ -######################################## -if ($flavour =~ /64/) { ######## 64-bit code - my %opcode = ( - "aesd" => 0x4e285800, "aese" => 0x4e284800, - "aesimc"=> 0x4e287800, "aesmc" => 0x4e286800 ); - - local *unaes = sub { - my ($mnemonic,$arg)=@_; - - $arg =~ m/[qv]([0-9]+)[^,]*,\s*[qv]([0-9]+)/o && - sprintf ".inst\t0x%08x\t//%s %s", - $opcode{$mnemonic}|$1|($2<<5), - $mnemonic,$arg; - }; - - foreach(split("\n",$code)) { - s/\`([^\`]*)\`/eval($1)/geo; - - s/\bq([0-9]+)\b/"v".($1<8?$1:$1+8).".16b"/geo; # old->new registers - s/@\s/\/\//o; # old->new style commentary - - #s/[v]?(aes\w+)\s+([qv].*)/unaes($1,$2)/geo or - s/cclr\s+([wx])([^,]+),\s*([a-z]+)/csel $1$2,$1zr,$1$2,$3/o or - s/mov\.([a-z]+)\s+([wx][0-9]+),\s*([wx][0-9]+)/csel $2,$3,$2,$1/o or - s/vmov\.i8/movi/o or # fix up legacy mnemonics - s/vext\.8/ext/o or - s/vrev32\.8/rev32/o or - s/vtst\.8/cmtst/o or - s/vshr/ushr/o or - s/^(\s+)v/$1/o or # strip off v prefix - s/\bbx\s+lr\b/ret/o; - - # fix up remaining legacy suffixes - s/\.[ui]?8//o; - m/\],#8/o and s/\.16b/\.8b/go; - s/\.[ui]?32//o and s/\.16b/\.4s/go; - s/\.[ui]?64//o and s/\.16b/\.2d/go; - s/\.[42]([sd])\[([0-3])\]/\.$1\[$2\]/o; - - print $_,"\n"; - } -} else { ######## 32-bit code - my %opcode = ( - "aesd" => 0xf3b00340, "aese" => 0xf3b00300, - "aesimc"=> 0xf3b003c0, "aesmc" => 0xf3b00380 ); - - local *unaes = sub { - my ($mnemonic,$arg)=@_; - - if ($arg =~ m/[qv]([0-9]+)[^,]*,\s*[qv]([0-9]+)/o) { - my $word = $opcode{$mnemonic}|(($1&7)<<13)|(($1&8)<<19) - |(($2&7)<<1) |(($2&8)<<2); - # since ARMv7 instructions are always encoded little-endian. - # correct solution is to use .inst directive, but older - # assemblers don't implement it:-( - sprintf ".byte\t0x%02x,0x%02x,0x%02x,0x%02x\t@ %s %s", - $word&0xff,($word>>8)&0xff, - ($word>>16)&0xff,($word>>24)&0xff, - $mnemonic,$arg; - } - }; - - sub unvtbl { - my $arg=shift; - - $arg =~ m/q([0-9]+),\s*\{q([0-9]+)\},\s*q([0-9]+)/o && - sprintf "vtbl.8 d%d,{q%d},d%d\n\t". - "vtbl.8 d%d,{q%d},d%d", 2*$1,$2,2*$3, 2*$1+1,$2,2*$3+1; - } - - sub unvdup32 { - my $arg=shift; - - $arg =~ m/q([0-9]+),\s*q([0-9]+)\[([0-3])\]/o && - sprintf "vdup.32 q%d,d%d[%d]",$1,2*$2+($3>>1),$3&1; - } - - sub unvmov32 { - my $arg=shift; - - $arg =~ m/q([0-9]+)\[([0-3])\],(.*)/o && - sprintf "vmov.32 d%d[%d],%s",2*$1+($2>>1),$2&1,$3; - } - - foreach(split("\n",$code)) { - s/\`([^\`]*)\`/eval($1)/geo; - - s/\b[wx]([0-9]+)\b/r$1/go; # new->old registers - s/\bv([0-9])\.[12468]+[bsd]\b/q$1/go; # new->old registers - s/\/\/\s?/@ /o; # new->old style commentary - - # fix up remaining new-style suffixes - s/\{q([0-9]+)\},\s*\[(.+)\],#8/sprintf "{d%d},[$2]!",2*$1/eo or - s/\],#[0-9]+/]!/o; - - s/[v]?(aes\w+)\s+([qv].*)/unaes($1,$2)/geo or - s/cclr\s+([^,]+),\s*([a-z]+)/mov$2 $1,#0/o or - s/vtbl\.8\s+(.*)/unvtbl($1)/geo or - s/vdup\.32\s+(.*)/unvdup32($1)/geo or - s/vmov\.32\s+(.*)/unvmov32($1)/geo or - s/^(\s+)b\./$1b/o or - s/^(\s+)mov\./$1mov/o or - s/^(\s+)ret/$1bx\tlr/o; - - print $_,"\n"; - } -} - -close STDOUT or die "error closing STDOUT"; diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/aes/asm/bsaes-armv7.pl temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/aes/asm/bsaes-armv7.pl --- temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/aes/asm/bsaes-armv7.pl 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/aes/asm/bsaes-armv7.pl 1970-01-01 00:00:00.000000000 +0000 @@ -1,1142 +0,0 @@ -#! /usr/bin/env perl -# Copyright 2012-2016 The OpenSSL Project Authors. All Rights Reserved. -# -# Licensed under the OpenSSL license (the "License"). You may not use -# this file except in compliance with the License. You can obtain a copy -# in the file LICENSE in the source distribution or at -# https://www.openssl.org/source/license.html - - -# ==================================================================== -# Written by Andy Polyakov for the OpenSSL -# project. The module is, however, dual licensed under OpenSSL and -# CRYPTOGAMS licenses depending on where you obtain it. For further -# details see http://www.openssl.org/~appro/cryptogams/. -# -# Specific modes and adaptation for Linux kernel by Ard Biesheuvel -# of Linaro. Permission to use under GPL terms is granted. -# ==================================================================== - -# Bit-sliced AES for ARM NEON -# -# February 2012. -# -# This implementation is direct adaptation of bsaes-x86_64 module for -# ARM NEON. Except that this module is endian-neutral [in sense that -# it can be compiled for either endianness] by courtesy of vld1.8's -# neutrality. Initial version doesn't implement interface to OpenSSL, -# only low-level primitives and unsupported entry points, just enough -# to collect performance results, which for Cortex-A8 core are: -# -# encrypt 19.5 cycles per byte processed with 128-bit key -# decrypt 22.1 cycles per byte processed with 128-bit key -# key conv. 440 cycles per 128-bit key/0.18 of 8x block -# -# Snapdragon S4 encrypts byte in 17.6 cycles and decrypts in 19.7, -# which is [much] worse than anticipated (for further details see -# http://www.openssl.org/~appro/Snapdragon-S4.html). -# -# Cortex-A15 manages in 14.2/16.1 cycles [when integer-only code -# manages in 20.0 cycles]. -# -# When comparing to x86_64 results keep in mind that NEON unit is -# [mostly] single-issue and thus can't [fully] benefit from -# instruction-level parallelism. And when comparing to aes-armv4 -# results keep in mind key schedule conversion overhead (see -# bsaes-x86_64.pl for further details)... -# -# - -# April-August 2013 -# Add CBC, CTR and XTS subroutines and adapt for kernel use; courtesy of Ard. - -$flavour = shift; -if ($flavour=~/\w[\w\-]*\.\w+$/) { $output=$flavour; undef $flavour; } -else { while (($output=shift) && ($output!~/\w[\w\-]*\.\w+$/)) {} } - -if ($flavour && $flavour ne "void") { - $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; - ( $xlate="${dir}arm-xlate.pl" and -f $xlate ) or - ( $xlate="${dir}../../../perlasm/arm-xlate.pl" and -f $xlate) or - die "can't locate arm-xlate.pl"; - - open OUT,"| \"$^X\" $xlate $flavour $output"; - *STDOUT=*OUT; -} else { - open OUT,">$output"; - *STDOUT=*OUT; -} - -my ($inp,$out,$len,$key)=("r0","r1","r2","r3"); -my @XMM=map("q$_",(0..15)); - -{ -my ($key,$rounds,$const)=("r4","r5","r6"); - -sub Dlo() { shift=~m|q([1]?[0-9])|?"d".($1*2):""; } -sub Dhi() { shift=~m|q([1]?[0-9])|?"d".($1*2+1):""; } - -sub Sbox { -# input in lsb > [b0, b1, b2, b3, b4, b5, b6, b7] < msb -# output in lsb > [b0, b1, b4, b6, b3, b7, b2, b5] < msb -my @b=@_[0..7]; -my @t=@_[8..11]; -my @s=@_[12..15]; - &InBasisChange (@b); - &Inv_GF256 (@b[6,5,0,3,7,1,4,2],@t,@s); - &OutBasisChange (@b[7,1,4,2,6,5,0,3]); -} - -sub InBasisChange { -# input in lsb > [b0, b1, b2, b3, b4, b5, b6, b7] < msb -# output in lsb > [b6, b5, b0, b3, b7, b1, b4, b2] < msb -my @b=@_[0..7]; -$code.=<<___; - veor @b[2], @b[2], @b[1] - veor @b[5], @b[5], @b[6] - veor @b[3], @b[3], @b[0] - veor @b[6], @b[6], @b[2] - veor @b[5], @b[5], @b[0] - - veor @b[6], @b[6], @b[3] - veor @b[3], @b[3], @b[7] - veor @b[7], @b[7], @b[5] - veor @b[3], @b[3], @b[4] - veor @b[4], @b[4], @b[5] - - veor @b[2], @b[2], @b[7] - veor @b[3], @b[3], @b[1] - veor @b[1], @b[1], @b[5] -___ -} - -sub OutBasisChange { -# input in lsb > [b0, b1, b2, b3, b4, b5, b6, b7] < msb -# output in lsb > [b6, b1, b2, b4, b7, b0, b3, b5] < msb -my @b=@_[0..7]; -$code.=<<___; - veor @b[0], @b[0], @b[6] - veor @b[1], @b[1], @b[4] - veor @b[4], @b[4], @b[6] - veor @b[2], @b[2], @b[0] - veor @b[6], @b[6], @b[1] - - veor @b[1], @b[1], @b[5] - veor @b[5], @b[5], @b[3] - veor @b[3], @b[3], @b[7] - veor @b[7], @b[7], @b[5] - veor @b[2], @b[2], @b[5] - - veor @b[4], @b[4], @b[7] -___ -} - -sub InvSbox { -# input in lsb > [b0, b1, b2, b3, b4, b5, b6, b7] < msb -# output in lsb > [b0, b1, b6, b4, b2, b7, b3, b5] < msb -my @b=@_[0..7]; -my @t=@_[8..11]; -my @s=@_[12..15]; - &InvInBasisChange (@b); - &Inv_GF256 (@b[5,1,2,6,3,7,0,4],@t,@s); - &InvOutBasisChange (@b[3,7,0,4,5,1,2,6]); -} - -sub InvInBasisChange { # OutBasisChange in reverse (with twist) -my @b=@_[5,1,2,6,3,7,0,4]; -$code.=<<___ - veor @b[1], @b[1], @b[7] - veor @b[4], @b[4], @b[7] - - veor @b[7], @b[7], @b[5] - veor @b[1], @b[1], @b[3] - veor @b[2], @b[2], @b[5] - veor @b[3], @b[3], @b[7] - - veor @b[6], @b[6], @b[1] - veor @b[2], @b[2], @b[0] - veor @b[5], @b[5], @b[3] - veor @b[4], @b[4], @b[6] - veor @b[0], @b[0], @b[6] - veor @b[1], @b[1], @b[4] -___ -} - -sub InvOutBasisChange { # InBasisChange in reverse -my @b=@_[2,5,7,3,6,1,0,4]; -$code.=<<___; - veor @b[1], @b[1], @b[5] - veor @b[2], @b[2], @b[7] - - veor @b[3], @b[3], @b[1] - veor @b[4], @b[4], @b[5] - veor @b[7], @b[7], @b[5] - veor @b[3], @b[3], @b[4] - veor @b[5], @b[5], @b[0] - veor @b[3], @b[3], @b[7] - veor @b[6], @b[6], @b[2] - veor @b[2], @b[2], @b[1] - veor @b[6], @b[6], @b[3] - - veor @b[3], @b[3], @b[0] - veor @b[5], @b[5], @b[6] -___ -} - -sub Mul_GF4 { -#;************************************************************* -#;* Mul_GF4: Input x0-x1,y0-y1 Output x0-x1 Temp t0 (8) * -#;************************************************************* -my ($x0,$x1,$y0,$y1,$t0,$t1)=@_; -$code.=<<___; - veor $t0, $y0, $y1 - vand $t0, $t0, $x0 - veor $x0, $x0, $x1 - vand $t1, $x1, $y0 - vand $x0, $x0, $y1 - veor $x1, $t1, $t0 - veor $x0, $x0, $t1 -___ -} - -sub Mul_GF4_N { # not used, see next subroutine -# multiply and scale by N -my ($x0,$x1,$y0,$y1,$t0)=@_; -$code.=<<___; - veor $t0, $y0, $y1 - vand $t0, $t0, $x0 - veor $x0, $x0, $x1 - vand $x1, $x1, $y0 - vand $x0, $x0, $y1 - veor $x1, $x1, $x0 - veor $x0, $x0, $t0 -___ -} - -sub Mul_GF4_N_GF4 { -# interleaved Mul_GF4_N and Mul_GF4 -my ($x0,$x1,$y0,$y1,$t0, - $x2,$x3,$y2,$y3,$t1)=@_; -$code.=<<___; - veor $t0, $y0, $y1 - veor $t1, $y2, $y3 - vand $t0, $t0, $x0 - vand $t1, $t1, $x2 - veor $x0, $x0, $x1 - veor $x2, $x2, $x3 - vand $x1, $x1, $y0 - vand $x3, $x3, $y2 - vand $x0, $x0, $y1 - vand $x2, $x2, $y3 - veor $x1, $x1, $x0 - veor $x2, $x2, $x3 - veor $x0, $x0, $t0 - veor $x3, $x3, $t1 -___ -} -sub Mul_GF16_2 { -my @x=@_[0..7]; -my @y=@_[8..11]; -my @t=@_[12..15]; -$code.=<<___; - veor @t[0], @x[0], @x[2] - veor @t[1], @x[1], @x[3] -___ - &Mul_GF4 (@x[0], @x[1], @y[0], @y[1], @t[2..3]); -$code.=<<___; - veor @y[0], @y[0], @y[2] - veor @y[1], @y[1], @y[3] -___ - Mul_GF4_N_GF4 (@t[0], @t[1], @y[0], @y[1], @t[3], - @x[2], @x[3], @y[2], @y[3], @t[2]); -$code.=<<___; - veor @x[0], @x[0], @t[0] - veor @x[2], @x[2], @t[0] - veor @x[1], @x[1], @t[1] - veor @x[3], @x[3], @t[1] - - veor @t[0], @x[4], @x[6] - veor @t[1], @x[5], @x[7] -___ - &Mul_GF4_N_GF4 (@t[0], @t[1], @y[0], @y[1], @t[3], - @x[6], @x[7], @y[2], @y[3], @t[2]); -$code.=<<___; - veor @y[0], @y[0], @y[2] - veor @y[1], @y[1], @y[3] -___ - &Mul_GF4 (@x[4], @x[5], @y[0], @y[1], @t[2..3]); -$code.=<<___; - veor @x[4], @x[4], @t[0] - veor @x[6], @x[6], @t[0] - veor @x[5], @x[5], @t[1] - veor @x[7], @x[7], @t[1] -___ -} -sub Inv_GF256 { -#;******************************************************************** -#;* Inv_GF256: Input x0-x7 Output x0-x7 Temp t0-t3,s0-s3 (144) * -#;******************************************************************** -my @x=@_[0..7]; -my @t=@_[8..11]; -my @s=@_[12..15]; -# direct optimizations from hardware -$code.=<<___; - veor @t[3], @x[4], @x[6] - veor @t[2], @x[5], @x[7] - veor @t[1], @x[1], @x[3] - veor @s[1], @x[7], @x[6] - vmov @t[0], @t[2] - veor @s[0], @x[0], @x[2] - - vorr @t[2], @t[2], @t[1] - veor @s[3], @t[3], @t[0] - vand @s[2], @t[3], @s[0] - vorr @t[3], @t[3], @s[0] - veor @s[0], @s[0], @t[1] - vand @t[0], @t[0], @t[1] - veor @t[1], @x[3], @x[2] - vand @s[3], @s[3], @s[0] - vand @s[1], @s[1], @t[1] - veor @t[1], @x[4], @x[5] - veor @s[0], @x[1], @x[0] - veor @t[3], @t[3], @s[1] - veor @t[2], @t[2], @s[1] - vand @s[1], @t[1], @s[0] - vorr @t[1], @t[1], @s[0] - veor @t[3], @t[3], @s[3] - veor @t[0], @t[0], @s[1] - veor @t[2], @t[2], @s[2] - veor @t[1], @t[1], @s[3] - veor @t[0], @t[0], @s[2] - vand @s[0], @x[7], @x[3] - veor @t[1], @t[1], @s[2] - vand @s[1], @x[6], @x[2] - vand @s[2], @x[5], @x[1] - vorr @s[3], @x[4], @x[0] - veor @t[3], @t[3], @s[0] - veor @t[1], @t[1], @s[2] - veor @t[0], @t[0], @s[3] - veor @t[2], @t[2], @s[1] - - @ Inv_GF16 \t0, \t1, \t2, \t3, \s0, \s1, \s2, \s3 - - @ new smaller inversion - - vand @s[2], @t[3], @t[1] - vmov @s[0], @t[0] - - veor @s[1], @t[2], @s[2] - veor @s[3], @t[0], @s[2] - veor @s[2], @t[0], @s[2] @ @s[2]=@s[3] - - vbsl @s[1], @t[1], @t[0] - vbsl @s[3], @t[3], @t[2] - veor @t[3], @t[3], @t[2] - - vbsl @s[0], @s[1], @s[2] - vbsl @t[0], @s[2], @s[1] - - vand @s[2], @s[0], @s[3] - veor @t[1], @t[1], @t[0] - - veor @s[2], @s[2], @t[3] -___ -# output in s3, s2, s1, t1 - -# Mul_GF16_2 \x0, \x1, \x2, \x3, \x4, \x5, \x6, \x7, \t2, \t3, \t0, \t1, \s0, \s1, \s2, \s3 - -# Mul_GF16_2 \x0, \x1, \x2, \x3, \x4, \x5, \x6, \x7, \s3, \s2, \s1, \t1, \s0, \t0, \t2, \t3 - &Mul_GF16_2(@x,@s[3,2,1],@t[1],@s[0],@t[0,2,3]); - -### output msb > [x3,x2,x1,x0,x7,x6,x5,x4] < lsb -} - -# AES linear components - -sub ShiftRows { -my @x=@_[0..7]; -my @t=@_[8..11]; -my $mask=pop; -$code.=<<___; - vldmia $key!, {@t[0]-@t[3]} - veor @t[0], @t[0], @x[0] - veor @t[1], @t[1], @x[1] - vtbl.8 `&Dlo(@x[0])`, {@t[0]}, `&Dlo($mask)` - vtbl.8 `&Dhi(@x[0])`, {@t[0]}, `&Dhi($mask)` - vldmia $key!, {@t[0]} - veor @t[2], @t[2], @x[2] - vtbl.8 `&Dlo(@x[1])`, {@t[1]}, `&Dlo($mask)` - vtbl.8 `&Dhi(@x[1])`, {@t[1]}, `&Dhi($mask)` - vldmia $key!, {@t[1]} - veor @t[3], @t[3], @x[3] - vtbl.8 `&Dlo(@x[2])`, {@t[2]}, `&Dlo($mask)` - vtbl.8 `&Dhi(@x[2])`, {@t[2]}, `&Dhi($mask)` - vldmia $key!, {@t[2]} - vtbl.8 `&Dlo(@x[3])`, {@t[3]}, `&Dlo($mask)` - vtbl.8 `&Dhi(@x[3])`, {@t[3]}, `&Dhi($mask)` - vldmia $key!, {@t[3]} - veor @t[0], @t[0], @x[4] - veor @t[1], @t[1], @x[5] - vtbl.8 `&Dlo(@x[4])`, {@t[0]}, `&Dlo($mask)` - vtbl.8 `&Dhi(@x[4])`, {@t[0]}, `&Dhi($mask)` - veor @t[2], @t[2], @x[6] - vtbl.8 `&Dlo(@x[5])`, {@t[1]}, `&Dlo($mask)` - vtbl.8 `&Dhi(@x[5])`, {@t[1]}, `&Dhi($mask)` - veor @t[3], @t[3], @x[7] - vtbl.8 `&Dlo(@x[6])`, {@t[2]}, `&Dlo($mask)` - vtbl.8 `&Dhi(@x[6])`, {@t[2]}, `&Dhi($mask)` - vtbl.8 `&Dlo(@x[7])`, {@t[3]}, `&Dlo($mask)` - vtbl.8 `&Dhi(@x[7])`, {@t[3]}, `&Dhi($mask)` -___ -} - -sub MixColumns { -# modified to emit output in order suitable for feeding back to aesenc[last] -my @x=@_[0..7]; -my @t=@_[8..15]; -my $inv=@_[16]; # optional -$code.=<<___; - vext.8 @t[0], @x[0], @x[0], #12 @ x0 <<< 32 - vext.8 @t[1], @x[1], @x[1], #12 - veor @x[0], @x[0], @t[0] @ x0 ^ (x0 <<< 32) - vext.8 @t[2], @x[2], @x[2], #12 - veor @x[1], @x[1], @t[1] - vext.8 @t[3], @x[3], @x[3], #12 - veor @x[2], @x[2], @t[2] - vext.8 @t[4], @x[4], @x[4], #12 - veor @x[3], @x[3], @t[3] - vext.8 @t[5], @x[5], @x[5], #12 - veor @x[4], @x[4], @t[4] - vext.8 @t[6], @x[6], @x[6], #12 - veor @x[5], @x[5], @t[5] - vext.8 @t[7], @x[7], @x[7], #12 - veor @x[6], @x[6], @t[6] - - veor @t[1], @t[1], @x[0] - veor @x[7], @x[7], @t[7] - vext.8 @x[0], @x[0], @x[0], #8 @ (x0 ^ (x0 <<< 32)) <<< 64) - veor @t[2], @t[2], @x[1] - veor @t[0], @t[0], @x[7] - veor @t[1], @t[1], @x[7] - vext.8 @x[1], @x[1], @x[1], #8 - veor @t[5], @t[5], @x[4] - veor @x[0], @x[0], @t[0] - veor @t[6], @t[6], @x[5] - veor @x[1], @x[1], @t[1] - vext.8 @t[0], @x[4], @x[4], #8 - veor @t[4], @t[4], @x[3] - vext.8 @t[1], @x[5], @x[5], #8 - veor @t[7], @t[7], @x[6] - vext.8 @x[4], @x[3], @x[3], #8 - veor @t[3], @t[3], @x[2] - vext.8 @x[5], @x[7], @x[7], #8 - veor @t[4], @t[4], @x[7] - vext.8 @x[3], @x[6], @x[6], #8 - veor @t[3], @t[3], @x[7] - vext.8 @x[6], @x[2], @x[2], #8 - veor @x[7], @t[1], @t[5] -___ -$code.=<<___ if (!$inv); - veor @x[2], @t[0], @t[4] - veor @x[4], @x[4], @t[3] - veor @x[5], @x[5], @t[7] - veor @x[3], @x[3], @t[6] - @ vmov @x[2], @t[0] - veor @x[6], @x[6], @t[2] - @ vmov @x[7], @t[1] -___ -$code.=<<___ if ($inv); - veor @t[3], @t[3], @x[4] - veor @x[5], @x[5], @t[7] - veor @x[2], @x[3], @t[6] - veor @x[3], @t[0], @t[4] - veor @x[4], @x[6], @t[2] - vmov @x[6], @t[3] - @ vmov @x[7], @t[1] -___ -} - -sub InvMixColumns_orig { -my @x=@_[0..7]; -my @t=@_[8..15]; - -$code.=<<___; - @ multiplication by 0x0e - vext.8 @t[7], @x[7], @x[7], #12 - vmov @t[2], @x[2] - veor @x[2], @x[2], @x[5] @ 2 5 - veor @x[7], @x[7], @x[5] @ 7 5 - vext.8 @t[0], @x[0], @x[0], #12 - vmov @t[5], @x[5] - veor @x[5], @x[5], @x[0] @ 5 0 [1] - veor @x[0], @x[0], @x[1] @ 0 1 - vext.8 @t[1], @x[1], @x[1], #12 - veor @x[1], @x[1], @x[2] @ 1 25 - veor @x[0], @x[0], @x[6] @ 01 6 [2] - vext.8 @t[3], @x[3], @x[3], #12 - veor @x[1], @x[1], @x[3] @ 125 3 [4] - veor @x[2], @x[2], @x[0] @ 25 016 [3] - veor @x[3], @x[3], @x[7] @ 3 75 - veor @x[7], @x[7], @x[6] @ 75 6 [0] - vext.8 @t[6], @x[6], @x[6], #12 - vmov @t[4], @x[4] - veor @x[6], @x[6], @x[4] @ 6 4 - veor @x[4], @x[4], @x[3] @ 4 375 [6] - veor @x[3], @x[3], @x[7] @ 375 756=36 - veor @x[6], @x[6], @t[5] @ 64 5 [7] - veor @x[3], @x[3], @t[2] @ 36 2 - vext.8 @t[5], @t[5], @t[5], #12 - veor @x[3], @x[3], @t[4] @ 362 4 [5] -___ - my @y = @x[7,5,0,2,1,3,4,6]; -$code.=<<___; - @ multiplication by 0x0b - veor @y[1], @y[1], @y[0] - veor @y[0], @y[0], @t[0] - vext.8 @t[2], @t[2], @t[2], #12 - veor @y[1], @y[1], @t[1] - veor @y[0], @y[0], @t[5] - vext.8 @t[4], @t[4], @t[4], #12 - veor @y[1], @y[1], @t[6] - veor @y[0], @y[0], @t[7] - veor @t[7], @t[7], @t[6] @ clobber t[7] - - veor @y[3], @y[3], @t[0] - veor @y[1], @y[1], @y[0] - vext.8 @t[0], @t[0], @t[0], #12 - veor @y[2], @y[2], @t[1] - veor @y[4], @y[4], @t[1] - vext.8 @t[1], @t[1], @t[1], #12 - veor @y[2], @y[2], @t[2] - veor @y[3], @y[3], @t[2] - veor @y[5], @y[5], @t[2] - veor @y[2], @y[2], @t[7] - vext.8 @t[2], @t[2], @t[2], #12 - veor @y[3], @y[3], @t[3] - veor @y[6], @y[6], @t[3] - veor @y[4], @y[4], @t[3] - veor @y[7], @y[7], @t[4] - vext.8 @t[3], @t[3], @t[3], #12 - veor @y[5], @y[5], @t[4] - veor @y[7], @y[7], @t[7] - veor @t[7], @t[7], @t[5] @ clobber t[7] even more - veor @y[3], @y[3], @t[5] - veor @y[4], @y[4], @t[4] - - veor @y[5], @y[5], @t[7] - vext.8 @t[4], @t[4], @t[4], #12 - veor @y[6], @y[6], @t[7] - veor @y[4], @y[4], @t[7] - - veor @t[7], @t[7], @t[5] - vext.8 @t[5], @t[5], @t[5], #12 - - @ multiplication by 0x0d - veor @y[4], @y[4], @y[7] - veor @t[7], @t[7], @t[6] @ restore t[7] - veor @y[7], @y[7], @t[4] - vext.8 @t[6], @t[6], @t[6], #12 - veor @y[2], @y[2], @t[0] - veor @y[7], @y[7], @t[5] - vext.8 @t[7], @t[7], @t[7], #12 - veor @y[2], @y[2], @t[2] - - veor @y[3], @y[3], @y[1] - veor @y[1], @y[1], @t[1] - veor @y[0], @y[0], @t[0] - veor @y[3], @y[3], @t[0] - veor @y[1], @y[1], @t[5] - veor @y[0], @y[0], @t[5] - vext.8 @t[0], @t[0], @t[0], #12 - veor @y[1], @y[1], @t[7] - veor @y[0], @y[0], @t[6] - veor @y[3], @y[3], @y[1] - veor @y[4], @y[4], @t[1] - vext.8 @t[1], @t[1], @t[1], #12 - - veor @y[7], @y[7], @t[7] - veor @y[4], @y[4], @t[2] - veor @y[5], @y[5], @t[2] - veor @y[2], @y[2], @t[6] - veor @t[6], @t[6], @t[3] @ clobber t[6] - vext.8 @t[2], @t[2], @t[2], #12 - veor @y[4], @y[4], @y[7] - veor @y[3], @y[3], @t[6] - - veor @y[6], @y[6], @t[6] - veor @y[5], @y[5], @t[5] - vext.8 @t[5], @t[5], @t[5], #12 - veor @y[6], @y[6], @t[4] - vext.8 @t[4], @t[4], @t[4], #12 - veor @y[5], @y[5], @t[6] - veor @y[6], @y[6], @t[7] - vext.8 @t[7], @t[7], @t[7], #12 - veor @t[6], @t[6], @t[3] @ restore t[6] - vext.8 @t[3], @t[3], @t[3], #12 - - @ multiplication by 0x09 - veor @y[4], @y[4], @y[1] - veor @t[1], @t[1], @y[1] @ t[1]=y[1] - veor @t[0], @t[0], @t[5] @ clobber t[0] - vext.8 @t[6], @t[6], @t[6], #12 - veor @t[1], @t[1], @t[5] - veor @y[3], @y[3], @t[0] - veor @t[0], @t[0], @y[0] @ t[0]=y[0] - veor @t[1], @t[1], @t[6] - veor @t[6], @t[6], @t[7] @ clobber t[6] - veor @y[4], @y[4], @t[1] - veor @y[7], @y[7], @t[4] - veor @y[6], @y[6], @t[3] - veor @y[5], @y[5], @t[2] - veor @t[4], @t[4], @y[4] @ t[4]=y[4] - veor @t[3], @t[3], @y[3] @ t[3]=y[3] - veor @t[5], @t[5], @y[5] @ t[5]=y[5] - veor @t[2], @t[2], @y[2] @ t[2]=y[2] - veor @t[3], @t[3], @t[7] - veor @XMM[5], @t[5], @t[6] - veor @XMM[6], @t[6], @y[6] @ t[6]=y[6] - veor @XMM[2], @t[2], @t[6] - veor @XMM[7], @t[7], @y[7] @ t[7]=y[7] - - vmov @XMM[0], @t[0] - vmov @XMM[1], @t[1] - @ vmov @XMM[2], @t[2] - vmov @XMM[3], @t[3] - vmov @XMM[4], @t[4] - @ vmov @XMM[5], @t[5] - @ vmov @XMM[6], @t[6] - @ vmov @XMM[7], @t[7] -___ -} - -sub InvMixColumns { -my @x=@_[0..7]; -my @t=@_[8..15]; - -# Thanks to Jussi Kivilinna for providing pointer to -# -# | 0e 0b 0d 09 | | 02 03 01 01 | | 05 00 04 00 | -# | 09 0e 0b 0d | = | 01 02 03 01 | x | 00 05 00 04 | -# | 0d 09 0e 0b | | 01 01 02 03 | | 04 00 05 00 | -# | 0b 0d 09 0e | | 03 01 01 02 | | 00 04 00 05 | - -$code.=<<___; - @ multiplication by 0x05-0x00-0x04-0x00 - vext.8 @t[0], @x[0], @x[0], #8 - vext.8 @t[6], @x[6], @x[6], #8 - vext.8 @t[7], @x[7], @x[7], #8 - veor @t[0], @t[0], @x[0] - vext.8 @t[1], @x[1], @x[1], #8 - veor @t[6], @t[6], @x[6] - vext.8 @t[2], @x[2], @x[2], #8 - veor @t[7], @t[7], @x[7] - vext.8 @t[3], @x[3], @x[3], #8 - veor @t[1], @t[1], @x[1] - vext.8 @t[4], @x[4], @x[4], #8 - veor @t[2], @t[2], @x[2] - vext.8 @t[5], @x[5], @x[5], #8 - veor @t[3], @t[3], @x[3] - veor @t[4], @t[4], @x[4] - veor @t[5], @t[5], @x[5] - - veor @x[0], @x[0], @t[6] - veor @x[1], @x[1], @t[6] - veor @x[2], @x[2], @t[0] - veor @x[4], @x[4], @t[2] - veor @x[3], @x[3], @t[1] - veor @x[1], @x[1], @t[7] - veor @x[2], @x[2], @t[7] - veor @x[4], @x[4], @t[6] - veor @x[5], @x[5], @t[3] - veor @x[3], @x[3], @t[6] - veor @x[6], @x[6], @t[4] - veor @x[4], @x[4], @t[7] - veor @x[5], @x[5], @t[7] - veor @x[7], @x[7], @t[5] -___ - &MixColumns (@x,@t,1); # flipped 2<->3 and 4<->6 -} - -sub swapmove { -my ($a,$b,$n,$mask,$t)=@_; -$code.=<<___; - vshr.u64 $t, $b, #$n - veor $t, $t, $a - vand $t, $t, $mask - veor $a, $a, $t - vshl.u64 $t, $t, #$n - veor $b, $b, $t -___ -} -sub swapmove2x { -my ($a0,$b0,$a1,$b1,$n,$mask,$t0,$t1)=@_; -$code.=<<___; - vshr.u64 $t0, $b0, #$n - vshr.u64 $t1, $b1, #$n - veor $t0, $t0, $a0 - veor $t1, $t1, $a1 - vand $t0, $t0, $mask - vand $t1, $t1, $mask - veor $a0, $a0, $t0 - vshl.u64 $t0, $t0, #$n - veor $a1, $a1, $t1 - vshl.u64 $t1, $t1, #$n - veor $b0, $b0, $t0 - veor $b1, $b1, $t1 -___ -} - -sub bitslice { -my @x=reverse(@_[0..7]); -my ($t0,$t1,$t2,$t3)=@_[8..11]; -$code.=<<___; - vmov.i8 $t0,#0x55 @ compose .LBS0 - vmov.i8 $t1,#0x33 @ compose .LBS1 -___ - &swapmove2x(@x[0,1,2,3],1,$t0,$t2,$t3); - &swapmove2x(@x[4,5,6,7],1,$t0,$t2,$t3); -$code.=<<___; - vmov.i8 $t0,#0x0f @ compose .LBS2 -___ - &swapmove2x(@x[0,2,1,3],2,$t1,$t2,$t3); - &swapmove2x(@x[4,6,5,7],2,$t1,$t2,$t3); - - &swapmove2x(@x[0,4,1,5],4,$t0,$t2,$t3); - &swapmove2x(@x[2,6,3,7],4,$t0,$t2,$t3); -} - -$code.=<<___; -#ifndef __KERNEL__ -# include - -# define VFP_ABI_PUSH vstmdb sp!,{d8-d15} -# define VFP_ABI_POP vldmia sp!,{d8-d15} -# define VFP_ABI_FRAME 0x40 -#else -# define VFP_ABI_PUSH -# define VFP_ABI_POP -# define VFP_ABI_FRAME 0 -# define BSAES_ASM_EXTENDED_KEY -# define __ARM_ARCH__ __LINUX_ARM_ARCH__ -# define __ARM_MAX_ARCH__ 7 -#endif - -#ifdef __thumb__ -# define adrl adr -#endif - -#if __ARM_MAX_ARCH__>=7 -.arch armv7-a -.fpu neon - -.text -.syntax unified @ ARMv7-capable assembler is expected to handle this -#if defined(__thumb2__) && !defined(__APPLE__) -.thumb -#else -.code 32 -# undef __thumb2__ -#endif - -.type _bsaes_const,%object -.align 6 -_bsaes_const: -.LM0ISR: @ InvShiftRows constants - .quad 0x0a0e0206070b0f03, 0x0004080c0d010509 -.LISR: - .quad 0x0504070602010003, 0x0f0e0d0c080b0a09 -.LISRM0: - .quad 0x01040b0e0205080f, 0x0306090c00070a0d -.LM0SR: @ ShiftRows constants - .quad 0x0a0e02060f03070b, 0x0004080c05090d01 -.LSR: - .quad 0x0504070600030201, 0x0f0e0d0c0a09080b -.LSRM0: - .quad 0x0304090e00050a0f, 0x01060b0c0207080d -.LM0: - .quad 0x02060a0e03070b0f, 0x0004080c0105090d -.LREVM0SR: - .quad 0x090d01050c000408, 0x03070b0f060a0e02 -.asciz "Bit-sliced AES for NEON, CRYPTOGAMS by " -.align 6 -.size _bsaes_const,.-_bsaes_const - -.type _bsaes_encrypt8,%function -.align 4 -_bsaes_encrypt8: - adr $const,. - vldmia $key!, {@XMM[9]} @ round 0 key -#if defined(__thumb2__) || defined(__APPLE__) - adr $const,.LM0SR -#else - sub $const,$const,#_bsaes_encrypt8-.LM0SR -#endif - - vldmia $const!, {@XMM[8]} @ .LM0SR -_bsaes_encrypt8_alt: - veor @XMM[10], @XMM[0], @XMM[9] @ xor with round0 key - veor @XMM[11], @XMM[1], @XMM[9] - vtbl.8 `&Dlo(@XMM[0])`, {@XMM[10]}, `&Dlo(@XMM[8])` - vtbl.8 `&Dhi(@XMM[0])`, {@XMM[10]}, `&Dhi(@XMM[8])` - veor @XMM[12], @XMM[2], @XMM[9] - vtbl.8 `&Dlo(@XMM[1])`, {@XMM[11]}, `&Dlo(@XMM[8])` - vtbl.8 `&Dhi(@XMM[1])`, {@XMM[11]}, `&Dhi(@XMM[8])` - veor @XMM[13], @XMM[3], @XMM[9] - vtbl.8 `&Dlo(@XMM[2])`, {@XMM[12]}, `&Dlo(@XMM[8])` - vtbl.8 `&Dhi(@XMM[2])`, {@XMM[12]}, `&Dhi(@XMM[8])` - veor @XMM[14], @XMM[4], @XMM[9] - vtbl.8 `&Dlo(@XMM[3])`, {@XMM[13]}, `&Dlo(@XMM[8])` - vtbl.8 `&Dhi(@XMM[3])`, {@XMM[13]}, `&Dhi(@XMM[8])` - veor @XMM[15], @XMM[5], @XMM[9] - vtbl.8 `&Dlo(@XMM[4])`, {@XMM[14]}, `&Dlo(@XMM[8])` - vtbl.8 `&Dhi(@XMM[4])`, {@XMM[14]}, `&Dhi(@XMM[8])` - veor @XMM[10], @XMM[6], @XMM[9] - vtbl.8 `&Dlo(@XMM[5])`, {@XMM[15]}, `&Dlo(@XMM[8])` - vtbl.8 `&Dhi(@XMM[5])`, {@XMM[15]}, `&Dhi(@XMM[8])` - veor @XMM[11], @XMM[7], @XMM[9] - vtbl.8 `&Dlo(@XMM[6])`, {@XMM[10]}, `&Dlo(@XMM[8])` - vtbl.8 `&Dhi(@XMM[6])`, {@XMM[10]}, `&Dhi(@XMM[8])` - vtbl.8 `&Dlo(@XMM[7])`, {@XMM[11]}, `&Dlo(@XMM[8])` - vtbl.8 `&Dhi(@XMM[7])`, {@XMM[11]}, `&Dhi(@XMM[8])` -_bsaes_encrypt8_bitslice: -___ - &bitslice (@XMM[0..7, 8..11]); -$code.=<<___; - sub $rounds,$rounds,#1 - b .Lenc_sbox -.align 4 -.Lenc_loop: -___ - &ShiftRows (@XMM[0..7, 8..12]); -$code.=".Lenc_sbox:\n"; - &Sbox (@XMM[0..7, 8..15]); -$code.=<<___; - subs $rounds,$rounds,#1 - bcc .Lenc_done -___ - &MixColumns (@XMM[0,1,4,6,3,7,2,5, 8..15]); -$code.=<<___; - vldmia $const, {@XMM[12]} @ .LSR - ite eq @ Thumb2 thing, samity check in ARM - addeq $const,$const,#0x10 - bne .Lenc_loop - vldmia $const, {@XMM[12]} @ .LSRM0 - b .Lenc_loop -.align 4 -.Lenc_done: -___ - # output in lsb > [t0, t1, t4, t6, t3, t7, t2, t5] < msb - &bitslice (@XMM[0,1,4,6,3,7,2,5, 8..11]); -$code.=<<___; - vldmia $key, {@XMM[8]} @ last round key - veor @XMM[4], @XMM[4], @XMM[8] - veor @XMM[6], @XMM[6], @XMM[8] - veor @XMM[3], @XMM[3], @XMM[8] - veor @XMM[7], @XMM[7], @XMM[8] - veor @XMM[2], @XMM[2], @XMM[8] - veor @XMM[5], @XMM[5], @XMM[8] - veor @XMM[0], @XMM[0], @XMM[8] - veor @XMM[1], @XMM[1], @XMM[8] - bx lr -.size _bsaes_encrypt8,.-_bsaes_encrypt8 -___ -} -{ -my ($out,$inp,$rounds,$const)=("r12","r4","r5","r6"); - -sub bitslice_key { -my @x=reverse(@_[0..7]); -my ($bs0,$bs1,$bs2,$t2,$t3)=@_[8..12]; - - &swapmove (@x[0,1],1,$bs0,$t2,$t3); -$code.=<<___; - @ &swapmove(@x[2,3],1,$t0,$t2,$t3); - vmov @x[2], @x[0] - vmov @x[3], @x[1] -___ - #&swapmove2x(@x[4,5,6,7],1,$t0,$t2,$t3); - - &swapmove2x (@x[0,2,1,3],2,$bs1,$t2,$t3); -$code.=<<___; - @ &swapmove2x(@x[4,6,5,7],2,$t1,$t2,$t3); - vmov @x[4], @x[0] - vmov @x[6], @x[2] - vmov @x[5], @x[1] - vmov @x[7], @x[3] -___ - &swapmove2x (@x[0,4,1,5],4,$bs2,$t2,$t3); - &swapmove2x (@x[2,6,3,7],4,$bs2,$t2,$t3); -} - -$code.=<<___; -.type _bsaes_key_convert,%function -.align 4 -_bsaes_key_convert: - adr $const,. - vld1.8 {@XMM[7]}, [$inp]! @ load round 0 key -#if defined(__thumb2__) || defined(__APPLE__) - adr $const,.LM0 -#else - sub $const,$const,#_bsaes_key_convert-.LM0 -#endif - vld1.8 {@XMM[15]}, [$inp]! @ load round 1 key - - vmov.i8 @XMM[8], #0x01 @ bit masks - vmov.i8 @XMM[9], #0x02 - vmov.i8 @XMM[10], #0x04 - vmov.i8 @XMM[11], #0x08 - vmov.i8 @XMM[12], #0x10 - vmov.i8 @XMM[13], #0x20 - vldmia $const, {@XMM[14]} @ .LM0 - -#ifdef __ARMEL__ - vrev32.8 @XMM[7], @XMM[7] - vrev32.8 @XMM[15], @XMM[15] -#endif - sub $rounds,$rounds,#1 - vstmia $out!, {@XMM[7]} @ save round 0 key - b .Lkey_loop - -.align 4 -.Lkey_loop: - vtbl.8 `&Dlo(@XMM[7])`,{@XMM[15]},`&Dlo(@XMM[14])` - vtbl.8 `&Dhi(@XMM[7])`,{@XMM[15]},`&Dhi(@XMM[14])` - vmov.i8 @XMM[6], #0x40 - vmov.i8 @XMM[15], #0x80 - - vtst.8 @XMM[0], @XMM[7], @XMM[8] - vtst.8 @XMM[1], @XMM[7], @XMM[9] - vtst.8 @XMM[2], @XMM[7], @XMM[10] - vtst.8 @XMM[3], @XMM[7], @XMM[11] - vtst.8 @XMM[4], @XMM[7], @XMM[12] - vtst.8 @XMM[5], @XMM[7], @XMM[13] - vtst.8 @XMM[6], @XMM[7], @XMM[6] - vtst.8 @XMM[7], @XMM[7], @XMM[15] - vld1.8 {@XMM[15]}, [$inp]! @ load next round key - vmvn @XMM[0], @XMM[0] @ "pnot" - vmvn @XMM[1], @XMM[1] - vmvn @XMM[5], @XMM[5] - vmvn @XMM[6], @XMM[6] -#ifdef __ARMEL__ - vrev32.8 @XMM[15], @XMM[15] -#endif - subs $rounds,$rounds,#1 - vstmia $out!,{@XMM[0]-@XMM[7]} @ write bit-sliced round key - bne .Lkey_loop - - vmov.i8 @XMM[7],#0x63 @ compose .L63 - @ don't save last round key - bx lr -.size _bsaes_key_convert,.-_bsaes_key_convert -___ -} - -{ -my ($inp,$out,$len,$key, $ctr,$fp,$rounds)=(map("r$_",(0..3,8..10))); -my $const = "r6"; # shared with _bsaes_encrypt8_alt -my $keysched = "sp"; - -$code.=<<___; -.global GFp_bsaes_ctr32_encrypt_blocks -.type GFp_bsaes_ctr32_encrypt_blocks,%function -.align 5 -GFp_bsaes_ctr32_encrypt_blocks: - @ In OpenSSL, short inputs fall back to aes_nohw_* here. We patch this - @ out to retain a constant-time implementation. - mov ip, sp - stmdb sp!, {r4-r10, lr} - VFP_ABI_PUSH - ldr $ctr, [ip] @ ctr is 1st arg on the stack - sub sp, sp, #0x10 @ scratch space to carry over the ctr - mov $fp, sp @ save sp - - ldr $rounds, [$key, #240] @ get # of rounds -#ifndef BSAES_ASM_EXTENDED_KEY - @ allocate the key schedule on the stack - sub r12, sp, $rounds, lsl#7 @ 128 bytes per inner round key - add r12, #`128-32` @ size of bit-sliced key schedule - - @ populate the key schedule - mov r4, $key @ pass key - mov r5, $rounds @ pass # of rounds - mov sp, r12 @ sp is $keysched - bl _bsaes_key_convert - veor @XMM[7],@XMM[7],@XMM[15] @ fix up last round key - vstmia r12, {@XMM[7]} @ save last round key - - vld1.8 {@XMM[0]}, [$ctr] @ load counter -#ifdef __APPLE__ - mov $ctr, #:lower16:(.LREVM0SR-.LM0) - add $ctr, $const, $ctr -#else - add $ctr, $const, #.LREVM0SR-.LM0 @ borrow $ctr -#endif - vldmia $keysched, {@XMM[4]} @ load round0 key -#else - ldr r12, [$key, #244] - eors r12, #1 - beq 0f - - @ populate the key schedule - str r12, [$key, #244] - mov r4, $key @ pass key - mov r5, $rounds @ pass # of rounds - add r12, $key, #248 @ pass key schedule - bl _bsaes_key_convert - veor @XMM[7],@XMM[7],@XMM[15] @ fix up last round key - vstmia r12, {@XMM[7]} @ save last round key - -.align 2 -0: add r12, $key, #248 - vld1.8 {@XMM[0]}, [$ctr] @ load counter - adrl $ctr, .LREVM0SR @ borrow $ctr - vldmia r12, {@XMM[4]} @ load round0 key - sub sp, #0x10 @ place for adjusted round0 key -#endif - - vmov.i32 @XMM[8],#1 @ compose 1<<96 - veor @XMM[9],@XMM[9],@XMM[9] - vrev32.8 @XMM[0],@XMM[0] - vext.8 @XMM[8],@XMM[9],@XMM[8],#4 - vrev32.8 @XMM[4],@XMM[4] - vadd.u32 @XMM[9],@XMM[8],@XMM[8] @ compose 2<<96 - vstmia $keysched, {@XMM[4]} @ save adjusted round0 key - b .Lctr_enc_loop - -.align 4 -.Lctr_enc_loop: - vadd.u32 @XMM[10], @XMM[8], @XMM[9] @ compose 3<<96 - vadd.u32 @XMM[1], @XMM[0], @XMM[8] @ +1 - vadd.u32 @XMM[2], @XMM[0], @XMM[9] @ +2 - vadd.u32 @XMM[3], @XMM[0], @XMM[10] @ +3 - vadd.u32 @XMM[4], @XMM[1], @XMM[10] - vadd.u32 @XMM[5], @XMM[2], @XMM[10] - vadd.u32 @XMM[6], @XMM[3], @XMM[10] - vadd.u32 @XMM[7], @XMM[4], @XMM[10] - vadd.u32 @XMM[10], @XMM[5], @XMM[10] @ next counter - - @ Borrow prologue from _bsaes_encrypt8 to use the opportunity - @ to flip byte order in 32-bit counter - - vldmia $keysched, {@XMM[9]} @ load round0 key -#ifndef BSAES_ASM_EXTENDED_KEY - add r4, $keysched, #0x10 @ pass next round key -#else - add r4, $key, #`248+16` -#endif - vldmia $ctr, {@XMM[8]} @ .LREVM0SR - mov r5, $rounds @ pass rounds - vstmia $fp, {@XMM[10]} @ save next counter -#ifdef __APPLE__ - mov $const, #:lower16:(.LREVM0SR-.LSR) - sub $const, $ctr, $const -#else - sub $const, $ctr, #.LREVM0SR-.LSR @ pass constants -#endif - - bl _bsaes_encrypt8_alt - - subs $len, $len, #8 - blo .Lctr_enc_loop_done - - vld1.8 {@XMM[8]-@XMM[9]}, [$inp]! @ load input - vld1.8 {@XMM[10]-@XMM[11]}, [$inp]! - veor @XMM[0], @XMM[8] - veor @XMM[1], @XMM[9] - vld1.8 {@XMM[12]-@XMM[13]}, [$inp]! - veor @XMM[4], @XMM[10] - veor @XMM[6], @XMM[11] - vld1.8 {@XMM[14]-@XMM[15]}, [$inp]! - veor @XMM[3], @XMM[12] - vst1.8 {@XMM[0]-@XMM[1]}, [$out]! @ write output - veor @XMM[7], @XMM[13] - veor @XMM[2], @XMM[14] - vst1.8 {@XMM[4]}, [$out]! - veor @XMM[5], @XMM[15] - vst1.8 {@XMM[6]}, [$out]! - vmov.i32 @XMM[8], #1 @ compose 1<<96 - vst1.8 {@XMM[3]}, [$out]! - veor @XMM[9], @XMM[9], @XMM[9] - vst1.8 {@XMM[7]}, [$out]! - vext.8 @XMM[8], @XMM[9], @XMM[8], #4 - vst1.8 {@XMM[2]}, [$out]! - vadd.u32 @XMM[9],@XMM[8],@XMM[8] @ compose 2<<96 - vst1.8 {@XMM[5]}, [$out]! - vldmia $fp, {@XMM[0]} @ load counter - - bne .Lctr_enc_loop - b .Lctr_enc_done - -.align 4 -.Lctr_enc_loop_done: - add $len, $len, #8 - vld1.8 {@XMM[8]}, [$inp]! @ load input - veor @XMM[0], @XMM[8] - vst1.8 {@XMM[0]}, [$out]! @ write output - cmp $len, #2 - blo .Lctr_enc_done - vld1.8 {@XMM[9]}, [$inp]! - veor @XMM[1], @XMM[9] - vst1.8 {@XMM[1]}, [$out]! - beq .Lctr_enc_done - vld1.8 {@XMM[10]}, [$inp]! - veor @XMM[4], @XMM[10] - vst1.8 {@XMM[4]}, [$out]! - cmp $len, #4 - blo .Lctr_enc_done - vld1.8 {@XMM[11]}, [$inp]! - veor @XMM[6], @XMM[11] - vst1.8 {@XMM[6]}, [$out]! - beq .Lctr_enc_done - vld1.8 {@XMM[12]}, [$inp]! - veor @XMM[3], @XMM[12] - vst1.8 {@XMM[3]}, [$out]! - cmp $len, #6 - blo .Lctr_enc_done - vld1.8 {@XMM[13]}, [$inp]! - veor @XMM[7], @XMM[13] - vst1.8 {@XMM[7]}, [$out]! - beq .Lctr_enc_done - vld1.8 {@XMM[14]}, [$inp] - veor @XMM[2], @XMM[14] - vst1.8 {@XMM[2]}, [$out]! - -.Lctr_enc_done: - vmov.i32 q0, #0 - vmov.i32 q1, #0 -#ifndef BSAES_ASM_EXTENDED_KEY -.Lctr_enc_bzero: @ wipe key schedule [if any] - vstmia $keysched!, {q0-q1} - cmp $keysched, $fp - bne .Lctr_enc_bzero -#else - vstmia $keysched, {q0-q1} -#endif - - mov sp, $fp - add sp, #0x10 @ add sp,$fp,#0x10 is no good for thumb - VFP_ABI_POP - ldmia sp!, {r4-r10, pc} @ return - - @ OpenSSL contains aes_nohw_* fallback code here. We patch this - @ out to retain a constant-time implementation. -.size GFp_bsaes_ctr32_encrypt_blocks,.-GFp_bsaes_ctr32_encrypt_blocks -___ -} -$code.=<<___; -#endif -___ - -$code =~ s/\`([^\`]*)\`/eval($1)/gem; - -open SELF,$0; -while() { - next if (/^#!/); - last if (!s/^#/@/ and !/^$/); - print; -} -close SELF; - -print $code; - -close STDOUT or die "error closing STDOUT"; diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/aes/asm/vpaes-x86_64.pl temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/aes/asm/vpaes-x86_64.pl --- temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/aes/asm/vpaes-x86_64.pl 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/aes/asm/vpaes-x86_64.pl 1970-01-01 00:00:00.000000000 +0000 @@ -1,1064 +0,0 @@ -#! /usr/bin/env perl -# Copyright 2011-2016 The OpenSSL Project Authors. All Rights Reserved. -# -# Licensed under the OpenSSL license (the "License"). You may not use -# this file except in compliance with the License. You can obtain a copy -# in the file LICENSE in the source distribution or at -# https://www.openssl.org/source/license.html - - -###################################################################### -## Constant-time SSSE3 AES core implementation. -## version 0.1 -## -## By Mike Hamburg (Stanford University), 2009 -## Public domain. -## -## For details see http://shiftleft.org/papers/vector_aes/ and -## http://crypto.stanford.edu/vpaes/. - -###################################################################### -# September 2011. -# -# Interface to OpenSSL as "almost" drop-in replacement for -# aes-x86_64.pl. "Almost" refers to the fact that AES_cbc_encrypt -# doesn't handle partial vectors (doesn't have to if called from -# EVP only). "Drop-in" implies that this module doesn't share key -# schedule structure with the original nor does it make assumption -# about its alignment... -# -# Performance summary. aes-x86_64.pl column lists large-block CBC -# encrypt/decrypt/with-hyper-threading-off(*) results in cycles per -# byte processed with 128-bit key, and vpaes-x86_64.pl column - -# [also large-block CBC] encrypt/decrypt. -# -# aes-x86_64.pl vpaes-x86_64.pl -# -# Core 2(**) 29.6/41.1/14.3 21.9/25.2(***) -# Nehalem 29.6/40.3/14.6 10.0/11.8 -# Atom 57.3/74.2/32.1 60.9/77.2(***) -# Silvermont 52.7/64.0/19.5 48.8/60.8(***) -# Goldmont 38.9/49.0/17.8 10.6/12.6 -# -# (*) "Hyper-threading" in the context refers rather to cache shared -# among multiple cores, than to specifically Intel HTT. As vast -# majority of contemporary cores share cache, slower code path -# is common place. In other words "with-hyper-threading-off" -# results are presented mostly for reference purposes. -# -# (**) "Core 2" refers to initial 65nm design, a.k.a. Conroe. -# -# (***) Less impressive improvement on Core 2 and Atom is due to slow -# pshufb, yet it's respectable +36%/62% improvement on Core 2 -# (as implied, over "hyper-threading-safe" code path). -# -# - -$flavour = shift; -$output = shift; -if ($flavour =~ /\./) { $output = $flavour; undef $flavour; } - -$win64=0; $win64=1 if ($flavour =~ /[nm]asm|mingw64/ || $output =~ /\.asm$/); - -$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; -( $xlate="${dir}x86_64-xlate.pl" and -f $xlate ) or -( $xlate="${dir}../../../perlasm/x86_64-xlate.pl" and -f $xlate) or -die "can't locate x86_64-xlate.pl"; - -open OUT,"| \"$^X\" \"$xlate\" $flavour \"$output\""; -*STDOUT=*OUT; - -$PREFIX="vpaes"; - -$code.=<<___; -.text - -## -## _aes_encrypt_core -## -## AES-encrypt %xmm0. -## -## Inputs: -## %xmm0 = input -## %xmm9-%xmm15 as in _vpaes_preheat -## (%rdx) = scheduled keys -## -## Output in %xmm0 -## Clobbers %xmm1-%xmm5, %r9, %r10, %r11, %rax -## Preserves %xmm6 - %xmm8 so you get some local vectors -## -## -.type _vpaes_encrypt_core,\@abi-omnipotent -.align 16 -_vpaes_encrypt_core: -.cfi_startproc - mov %rdx, %r9 - mov \$16, %r11 - mov 240(%rdx),%eax - movdqa %xmm9, %xmm1 - movdqa .Lk_ipt(%rip), %xmm2 # iptlo - pandn %xmm0, %xmm1 - movdqu (%r9), %xmm5 # round0 key - psrld \$4, %xmm1 - pand %xmm9, %xmm0 - pshufb %xmm0, %xmm2 - movdqa .Lk_ipt+16(%rip), %xmm0 # ipthi - pshufb %xmm1, %xmm0 - pxor %xmm5, %xmm2 - add \$16, %r9 - pxor %xmm2, %xmm0 - lea .Lk_mc_backward(%rip),%r10 - jmp .Lenc_entry - -.align 16 -.Lenc_loop: - # middle of middle round - movdqa %xmm13, %xmm4 # 4 : sb1u - movdqa %xmm12, %xmm0 # 0 : sb1t - pshufb %xmm2, %xmm4 # 4 = sb1u - pshufb %xmm3, %xmm0 # 0 = sb1t - pxor %xmm5, %xmm4 # 4 = sb1u + k - movdqa %xmm15, %xmm5 # 4 : sb2u - pxor %xmm4, %xmm0 # 0 = A - movdqa -0x40(%r11,%r10), %xmm1 # .Lk_mc_forward[] - pshufb %xmm2, %xmm5 # 4 = sb2u - movdqa (%r11,%r10), %xmm4 # .Lk_mc_backward[] - movdqa %xmm14, %xmm2 # 2 : sb2t - pshufb %xmm3, %xmm2 # 2 = sb2t - movdqa %xmm0, %xmm3 # 3 = A - pxor %xmm5, %xmm2 # 2 = 2A - pshufb %xmm1, %xmm0 # 0 = B - add \$16, %r9 # next key - pxor %xmm2, %xmm0 # 0 = 2A+B - pshufb %xmm4, %xmm3 # 3 = D - add \$16, %r11 # next mc - pxor %xmm0, %xmm3 # 3 = 2A+B+D - pshufb %xmm1, %xmm0 # 0 = 2B+C - and \$0x30, %r11 # ... mod 4 - sub \$1,%rax # nr-- - pxor %xmm3, %xmm0 # 0 = 2A+3B+C+D - -.Lenc_entry: - # top of round - movdqa %xmm9, %xmm1 # 1 : i - movdqa %xmm11, %xmm5 # 2 : a/k - pandn %xmm0, %xmm1 # 1 = i<<4 - psrld \$4, %xmm1 # 1 = i - pand %xmm9, %xmm0 # 0 = k - pshufb %xmm0, %xmm5 # 2 = a/k - movdqa %xmm10, %xmm3 # 3 : 1/i - pxor %xmm1, %xmm0 # 0 = j - pshufb %xmm1, %xmm3 # 3 = 1/i - movdqa %xmm10, %xmm4 # 4 : 1/j - pxor %xmm5, %xmm3 # 3 = iak = 1/i + a/k - pshufb %xmm0, %xmm4 # 4 = 1/j - movdqa %xmm10, %xmm2 # 2 : 1/iak - pxor %xmm5, %xmm4 # 4 = jak = 1/j + a/k - pshufb %xmm3, %xmm2 # 2 = 1/iak - movdqa %xmm10, %xmm3 # 3 : 1/jak - pxor %xmm0, %xmm2 # 2 = io - pshufb %xmm4, %xmm3 # 3 = 1/jak - movdqu (%r9), %xmm5 - pxor %xmm1, %xmm3 # 3 = jo - jnz .Lenc_loop - - # middle of last round - movdqa -0x60(%r10), %xmm4 # 3 : sbou .Lk_sbo - movdqa -0x50(%r10), %xmm0 # 0 : sbot .Lk_sbo+16 - pshufb %xmm2, %xmm4 # 4 = sbou - pxor %xmm5, %xmm4 # 4 = sb1u + k - pshufb %xmm3, %xmm0 # 0 = sb1t - movdqa 0x40(%r11,%r10), %xmm1 # .Lk_sr[] - pxor %xmm4, %xmm0 # 0 = A - pshufb %xmm1, %xmm0 - ret -.cfi_endproc -.size _vpaes_encrypt_core,.-_vpaes_encrypt_core - -## -## _aes_encrypt_core_2x -## -## AES-encrypt %xmm0 and %xmm6 in parallel. -## -## Inputs: -## %xmm0 and %xmm6 = input -## %xmm9 and %xmm10 as in _vpaes_preheat -## (%rdx) = scheduled keys -## -## Output in %xmm0 and %xmm6 -## Clobbers %xmm1-%xmm5, %xmm7, %xmm8, %xmm11-%xmm13, %r9, %r10, %r11, %rax -## Preserves %xmm14 and %xmm15 -## -## This function stitches two parallel instances of _vpaes_encrypt_core. x86_64 -## provides 16 XMM registers. _vpaes_encrypt_core computes over six registers -## (%xmm0-%xmm5) and additionally uses seven registers with preloaded constants -## from _vpaes_preheat (%xmm9-%xmm15). This does not quite fit two instances, -## so we spill some of %xmm9 through %xmm15 back to memory. We keep %xmm9 and -## %xmm10 in registers as these values are used several times in a row. The -## remainder are read once per round and are spilled to memory. This leaves two -## registers preserved for the caller. -## -## Thus, of the two _vpaes_encrypt_core instances, the first uses (%xmm0-%xmm5) -## as before. The second uses %xmm6-%xmm8,%xmm11-%xmm13. (Add 6 to %xmm2 and -## below. Add 8 to %xmm3 and up.) Instructions in the second instance are -## indented by one space. -## -## -.type _vpaes_encrypt_core_2x,\@abi-omnipotent -.align 16 -_vpaes_encrypt_core_2x: -.cfi_startproc - mov %rdx, %r9 - mov \$16, %r11 - mov 240(%rdx),%eax - movdqa %xmm9, %xmm1 - movdqa %xmm9, %xmm7 - movdqa .Lk_ipt(%rip), %xmm2 # iptlo - movdqa %xmm2, %xmm8 - pandn %xmm0, %xmm1 - pandn %xmm6, %xmm7 - movdqu (%r9), %xmm5 # round0 key - # Also use %xmm5 in the second instance. - psrld \$4, %xmm1 - psrld \$4, %xmm7 - pand %xmm9, %xmm0 - pand %xmm9, %xmm6 - pshufb %xmm0, %xmm2 - pshufb %xmm6, %xmm8 - movdqa .Lk_ipt+16(%rip), %xmm0 # ipthi - movdqa %xmm0, %xmm6 - pshufb %xmm1, %xmm0 - pshufb %xmm7, %xmm6 - pxor %xmm5, %xmm2 - pxor %xmm5, %xmm8 - add \$16, %r9 - pxor %xmm2, %xmm0 - pxor %xmm8, %xmm6 - lea .Lk_mc_backward(%rip),%r10 - jmp .Lenc2x_entry - -.align 16 -.Lenc2x_loop: - # middle of middle round - movdqa .Lk_sb1(%rip), %xmm4 # 4 : sb1u - movdqa .Lk_sb1+16(%rip),%xmm0 # 0 : sb1t - movdqa %xmm4, %xmm12 - movdqa %xmm0, %xmm6 - pshufb %xmm2, %xmm4 # 4 = sb1u - pshufb %xmm8, %xmm12 - pshufb %xmm3, %xmm0 # 0 = sb1t - pshufb %xmm11, %xmm6 - pxor %xmm5, %xmm4 # 4 = sb1u + k - pxor %xmm5, %xmm12 - movdqa .Lk_sb2(%rip), %xmm5 # 4 : sb2u - movdqa %xmm5, %xmm13 - pxor %xmm4, %xmm0 # 0 = A - pxor %xmm12, %xmm6 - movdqa -0x40(%r11,%r10), %xmm1 # .Lk_mc_forward[] - # Also use %xmm1 in the second instance. - pshufb %xmm2, %xmm5 # 4 = sb2u - pshufb %xmm8, %xmm13 - movdqa (%r11,%r10), %xmm4 # .Lk_mc_backward[] - # Also use %xmm4 in the second instance. - movdqa .Lk_sb2+16(%rip), %xmm2 # 2 : sb2t - movdqa %xmm2, %xmm8 - pshufb %xmm3, %xmm2 # 2 = sb2t - pshufb %xmm11, %xmm8 - movdqa %xmm0, %xmm3 # 3 = A - movdqa %xmm6, %xmm11 - pxor %xmm5, %xmm2 # 2 = 2A - pxor %xmm13, %xmm8 - pshufb %xmm1, %xmm0 # 0 = B - pshufb %xmm1, %xmm6 - add \$16, %r9 # next key - pxor %xmm2, %xmm0 # 0 = 2A+B - pxor %xmm8, %xmm6 - pshufb %xmm4, %xmm3 # 3 = D - pshufb %xmm4, %xmm11 - add \$16, %r11 # next mc - pxor %xmm0, %xmm3 # 3 = 2A+B+D - pxor %xmm6, %xmm11 - pshufb %xmm1, %xmm0 # 0 = 2B+C - pshufb %xmm1, %xmm6 - and \$0x30, %r11 # ... mod 4 - sub \$1,%rax # nr-- - pxor %xmm3, %xmm0 # 0 = 2A+3B+C+D - pxor %xmm11, %xmm6 - -.Lenc2x_entry: - # top of round - movdqa %xmm9, %xmm1 # 1 : i - movdqa %xmm9, %xmm7 - movdqa .Lk_inv+16(%rip), %xmm5 # 2 : a/k - movdqa %xmm5, %xmm13 - pandn %xmm0, %xmm1 # 1 = i<<4 - pandn %xmm6, %xmm7 - psrld \$4, %xmm1 # 1 = i - psrld \$4, %xmm7 - pand %xmm9, %xmm0 # 0 = k - pand %xmm9, %xmm6 - pshufb %xmm0, %xmm5 # 2 = a/k - pshufb %xmm6, %xmm13 - movdqa %xmm10, %xmm3 # 3 : 1/i - movdqa %xmm10, %xmm11 - pxor %xmm1, %xmm0 # 0 = j - pxor %xmm7, %xmm6 - pshufb %xmm1, %xmm3 # 3 = 1/i - pshufb %xmm7, %xmm11 - movdqa %xmm10, %xmm4 # 4 : 1/j - movdqa %xmm10, %xmm12 - pxor %xmm5, %xmm3 # 3 = iak = 1/i + a/k - pxor %xmm13, %xmm11 - pshufb %xmm0, %xmm4 # 4 = 1/j - pshufb %xmm6, %xmm12 - movdqa %xmm10, %xmm2 # 2 : 1/iak - movdqa %xmm10, %xmm8 - pxor %xmm5, %xmm4 # 4 = jak = 1/j + a/k - pxor %xmm13, %xmm12 - pshufb %xmm3, %xmm2 # 2 = 1/iak - pshufb %xmm11, %xmm8 - movdqa %xmm10, %xmm3 # 3 : 1/jak - movdqa %xmm10, %xmm11 - pxor %xmm0, %xmm2 # 2 = io - pxor %xmm6, %xmm8 - pshufb %xmm4, %xmm3 # 3 = 1/jak - pshufb %xmm12, %xmm11 - movdqu (%r9), %xmm5 - # Also use %xmm5 in the second instance. - pxor %xmm1, %xmm3 # 3 = jo - pxor %xmm7, %xmm11 - jnz .Lenc2x_loop - - # middle of last round - movdqa -0x60(%r10), %xmm4 # 3 : sbou .Lk_sbo - movdqa -0x50(%r10), %xmm0 # 0 : sbot .Lk_sbo+16 - movdqa %xmm4, %xmm12 - movdqa %xmm0, %xmm6 - pshufb %xmm2, %xmm4 # 4 = sbou - pshufb %xmm8, %xmm12 - pxor %xmm5, %xmm4 # 4 = sb1u + k - pxor %xmm5, %xmm12 - pshufb %xmm3, %xmm0 # 0 = sb1t - pshufb %xmm11, %xmm6 - movdqa 0x40(%r11,%r10), %xmm1 # .Lk_sr[] - # Also use %xmm1 in the second instance. - pxor %xmm4, %xmm0 # 0 = A - pxor %xmm12, %xmm6 - pshufb %xmm1, %xmm0 - pshufb %xmm1, %xmm6 - ret -.cfi_endproc -.size _vpaes_encrypt_core_2x,.-_vpaes_encrypt_core_2x - -######################################################## -## ## -## AES key schedule ## -## ## -######################################################## -.type _vpaes_schedule_core,\@abi-omnipotent -.align 16 -_vpaes_schedule_core: -.cfi_startproc - # rdi = key - # rsi = size in bits - # rdx = buffer - # rcx = direction. 0=encrypt, 1=decrypt - - call _vpaes_preheat # load the tables - movdqa .Lk_rcon(%rip), %xmm8 # load rcon - movdqu (%rdi), %xmm0 # load key (unaligned) - - # input transform - movdqa %xmm0, %xmm3 - lea .Lk_ipt(%rip), %r11 - call _vpaes_schedule_transform - movdqa %xmm0, %xmm7 - - lea .Lk_sr(%rip),%r10 - - # encrypting, output zeroth round key after transform - movdqu %xmm0, (%rdx) - -.Lschedule_go: - cmp \$192, %esi - ja .Lschedule_256 - # 192-bit key support was removed. - # 128: fall though - -## -## .schedule_128 -## -## 128-bit specific part of key schedule. -## -## This schedule is really simple, because all its parts -## are accomplished by the subroutines. -## -.Lschedule_128: - mov \$10, %esi - -.Loop_schedule_128: - call _vpaes_schedule_round - dec %rsi - jz .Lschedule_mangle_last - call _vpaes_schedule_mangle # write output - jmp .Loop_schedule_128 - -## -## .aes_schedule_256 -## -## 256-bit specific part of key schedule. -## -## The structure here is very similar to the 128-bit -## schedule, but with an additional "low side" in -## %xmm6. The low side's rounds are the same as the -## high side's, except no rcon and no rotation. -## -.align 16 -.Lschedule_256: - movdqu 16(%rdi),%xmm0 # load key part 2 (unaligned) - call _vpaes_schedule_transform # input transform - mov \$7, %esi - -.Loop_schedule_256: - call _vpaes_schedule_mangle # output low result - movdqa %xmm0, %xmm6 # save cur_lo in xmm6 - - # high round - call _vpaes_schedule_round - dec %rsi - jz .Lschedule_mangle_last - call _vpaes_schedule_mangle - - # low round. swap xmm7 and xmm6 - pshufd \$0xFF, %xmm0, %xmm0 - movdqa %xmm7, %xmm5 - movdqa %xmm6, %xmm7 - call _vpaes_schedule_low_round - movdqa %xmm5, %xmm7 - - jmp .Loop_schedule_256 - - -## -## .aes_schedule_mangle_last -## -## Mangler for last round of key schedule -## Mangles %xmm0 -## when encrypting, outputs out(%xmm0) ^ 63 -## when decrypting, outputs unskew(%xmm0) -## -## Always called right before return... jumps to cleanup and exits -## -.align 16 -.Lschedule_mangle_last: - # schedule last round key from xmm0 - lea .Lk_deskew(%rip),%r11 # prepare to deskew - - # encrypting - movdqa (%r8,%r10),%xmm1 - pshufb %xmm1, %xmm0 # output permute - lea .Lk_opt(%rip), %r11 # prepare to output transform - add \$32, %rdx - -.Lschedule_mangle_last_dec: - add \$-16, %rdx - pxor .Lk_s63(%rip), %xmm0 - call _vpaes_schedule_transform # output transform - movdqu %xmm0, (%rdx) # save last key - - # cleanup - pxor %xmm0, %xmm0 - pxor %xmm1, %xmm1 - pxor %xmm2, %xmm2 - pxor %xmm3, %xmm3 - pxor %xmm4, %xmm4 - pxor %xmm5, %xmm5 - pxor %xmm6, %xmm6 - pxor %xmm7, %xmm7 - ret -.cfi_endproc -.size _vpaes_schedule_core,.-_vpaes_schedule_core - -## -## .aes_schedule_round -## -## Runs one main round of the key schedule on %xmm0, %xmm7 -## -## Specifically, runs subbytes on the high dword of %xmm0 -## then rotates it by one byte and xors into the low dword of -## %xmm7. -## -## Adds rcon from low byte of %xmm8, then rotates %xmm8 for -## next rcon. -## -## Smears the dwords of %xmm7 by xoring the low into the -## second low, result into third, result into highest. -## -## Returns results in %xmm7 = %xmm0. -## Clobbers %xmm1-%xmm4, %r11. -## -.type _vpaes_schedule_round,\@abi-omnipotent -.align 16 -_vpaes_schedule_round: -.cfi_startproc - # extract rcon from xmm8 - pxor %xmm1, %xmm1 - palignr \$15, %xmm8, %xmm1 - palignr \$15, %xmm8, %xmm8 - pxor %xmm1, %xmm7 - - # rotate - pshufd \$0xFF, %xmm0, %xmm0 - palignr \$1, %xmm0, %xmm0 - - # fall through... - - # low round: same as high round, but no rotation and no rcon. -_vpaes_schedule_low_round: - # smear xmm7 - movdqa %xmm7, %xmm1 - pslldq \$4, %xmm7 - pxor %xmm1, %xmm7 - movdqa %xmm7, %xmm1 - pslldq \$8, %xmm7 - pxor %xmm1, %xmm7 - pxor .Lk_s63(%rip), %xmm7 - - # subbytes - movdqa %xmm9, %xmm1 - pandn %xmm0, %xmm1 - psrld \$4, %xmm1 # 1 = i - pand %xmm9, %xmm0 # 0 = k - movdqa %xmm11, %xmm2 # 2 : a/k - pshufb %xmm0, %xmm2 # 2 = a/k - pxor %xmm1, %xmm0 # 0 = j - movdqa %xmm10, %xmm3 # 3 : 1/i - pshufb %xmm1, %xmm3 # 3 = 1/i - pxor %xmm2, %xmm3 # 3 = iak = 1/i + a/k - movdqa %xmm10, %xmm4 # 4 : 1/j - pshufb %xmm0, %xmm4 # 4 = 1/j - pxor %xmm2, %xmm4 # 4 = jak = 1/j + a/k - movdqa %xmm10, %xmm2 # 2 : 1/iak - pshufb %xmm3, %xmm2 # 2 = 1/iak - pxor %xmm0, %xmm2 # 2 = io - movdqa %xmm10, %xmm3 # 3 : 1/jak - pshufb %xmm4, %xmm3 # 3 = 1/jak - pxor %xmm1, %xmm3 # 3 = jo - movdqa %xmm13, %xmm4 # 4 : sbou - pshufb %xmm2, %xmm4 # 4 = sbou - movdqa %xmm12, %xmm0 # 0 : sbot - pshufb %xmm3, %xmm0 # 0 = sb1t - pxor %xmm4, %xmm0 # 0 = sbox output - - # add in smeared stuff - pxor %xmm7, %xmm0 - movdqa %xmm0, %xmm7 - ret -.cfi_endproc -.size _vpaes_schedule_round,.-_vpaes_schedule_round - -## -## .aes_schedule_transform -## -## Linear-transform %xmm0 according to tables at (%r11) -## -## Requires that %xmm9 = 0x0F0F... as in preheat -## Output in %xmm0 -## Clobbers %xmm1, %xmm2 -## -.type _vpaes_schedule_transform,\@abi-omnipotent -.align 16 -_vpaes_schedule_transform: -.cfi_startproc - movdqa %xmm9, %xmm1 - pandn %xmm0, %xmm1 - psrld \$4, %xmm1 - pand %xmm9, %xmm0 - movdqa (%r11), %xmm2 # lo - pshufb %xmm0, %xmm2 - movdqa 16(%r11), %xmm0 # hi - pshufb %xmm1, %xmm0 - pxor %xmm2, %xmm0 - ret -.cfi_endproc -.size _vpaes_schedule_transform,.-_vpaes_schedule_transform - -## -## .aes_schedule_mangle -## -## Mangle xmm0 from (basis-transformed) standard version -## to our version. -## -## On encrypt, -## xor with 0x63 -## multiply by circulant 0,1,1,1 -## apply shiftrows transform -## -## On decrypt, -## xor with 0x63 -## multiply by "inverse mixcolumns" circulant E,B,D,9 -## deskew -## apply shiftrows transform -## -## -## Writes out to (%rdx), and increments or decrements it -## Keeps track of round number mod 4 in %r8 -## Preserves xmm0 -## Clobbers xmm1-xmm5 -## -.type _vpaes_schedule_mangle,\@abi-omnipotent -.align 16 -_vpaes_schedule_mangle: -.cfi_startproc - movdqa %xmm0, %xmm4 # save xmm0 for later - movdqa .Lk_mc_forward(%rip),%xmm5 - - # encrypting - add \$16, %rdx - pxor .Lk_s63(%rip),%xmm4 - pshufb %xmm5, %xmm4 - movdqa %xmm4, %xmm3 - pshufb %xmm5, %xmm4 - pxor %xmm4, %xmm3 - pshufb %xmm5, %xmm4 - pxor %xmm4, %xmm3 - -.Lschedule_mangle_both: - movdqa (%r8,%r10),%xmm1 - pshufb %xmm1,%xmm3 - add \$-16, %r8 - and \$0x30, %r8 - movdqu %xmm3, (%rdx) - ret -.cfi_endproc -.size _vpaes_schedule_mangle,.-_vpaes_schedule_mangle - -# -# Interface to OpenSSL -# -.globl GFp_${PREFIX}_set_encrypt_key -.type GFp_${PREFIX}_set_encrypt_key,\@function,3 -.align 16 -GFp_${PREFIX}_set_encrypt_key: -.cfi_startproc -#ifdef BORINGSSL_DISPATCH_TEST -.extern BORINGSSL_function_hit - movb \$1, BORINGSSL_function_hit+5(%rip) -#endif - -___ -$code.=<<___ if ($win64); - lea -0xb8(%rsp),%rsp - movaps %xmm6,0x10(%rsp) - movaps %xmm7,0x20(%rsp) - movaps %xmm8,0x30(%rsp) - movaps %xmm9,0x40(%rsp) - movaps %xmm10,0x50(%rsp) - movaps %xmm11,0x60(%rsp) - movaps %xmm12,0x70(%rsp) - movaps %xmm13,0x80(%rsp) - movaps %xmm14,0x90(%rsp) - movaps %xmm15,0xa0(%rsp) -.Lenc_key_body: -___ -$code.=<<___; - mov %esi,%eax - shr \$5,%eax - add \$5,%eax - mov %eax,240(%rdx) # AES_KEY->rounds = nbits/32+5; - - mov \$0,%ecx - mov \$0x30,%r8d - call _vpaes_schedule_core -___ -$code.=<<___ if ($win64); - movaps 0x10(%rsp),%xmm6 - movaps 0x20(%rsp),%xmm7 - movaps 0x30(%rsp),%xmm8 - movaps 0x40(%rsp),%xmm9 - movaps 0x50(%rsp),%xmm10 - movaps 0x60(%rsp),%xmm11 - movaps 0x70(%rsp),%xmm12 - movaps 0x80(%rsp),%xmm13 - movaps 0x90(%rsp),%xmm14 - movaps 0xa0(%rsp),%xmm15 - lea 0xb8(%rsp),%rsp -.Lenc_key_epilogue: -___ -$code.=<<___; - xor %eax,%eax - ret -.cfi_endproc -.size GFp_${PREFIX}_set_encrypt_key,.-GFp_${PREFIX}_set_encrypt_key - -.globl GFp_${PREFIX}_encrypt -.type GFp_${PREFIX}_encrypt,\@function,3 -.align 16 -GFp_${PREFIX}_encrypt: -.cfi_startproc -___ -$code.=<<___ if ($win64); - lea -0xb8(%rsp),%rsp - movaps %xmm6,0x10(%rsp) - movaps %xmm7,0x20(%rsp) - movaps %xmm8,0x30(%rsp) - movaps %xmm9,0x40(%rsp) - movaps %xmm10,0x50(%rsp) - movaps %xmm11,0x60(%rsp) - movaps %xmm12,0x70(%rsp) - movaps %xmm13,0x80(%rsp) - movaps %xmm14,0x90(%rsp) - movaps %xmm15,0xa0(%rsp) -.Lenc_body: -___ -$code.=<<___; - movdqu (%rdi),%xmm0 - call _vpaes_preheat - call _vpaes_encrypt_core - movdqu %xmm0,(%rsi) -___ -$code.=<<___ if ($win64); - movaps 0x10(%rsp),%xmm6 - movaps 0x20(%rsp),%xmm7 - movaps 0x30(%rsp),%xmm8 - movaps 0x40(%rsp),%xmm9 - movaps 0x50(%rsp),%xmm10 - movaps 0x60(%rsp),%xmm11 - movaps 0x70(%rsp),%xmm12 - movaps 0x80(%rsp),%xmm13 - movaps 0x90(%rsp),%xmm14 - movaps 0xa0(%rsp),%xmm15 - lea 0xb8(%rsp),%rsp -.Lenc_epilogue: -___ -$code.=<<___; - ret -.cfi_endproc -.size GFp_${PREFIX}_encrypt,.-GFp_${PREFIX}_encrypt -___ -{ -my ($inp,$out,$blocks,$key,$ivp)=("%rdi","%rsi","%rdx","%rcx","%r8"); -# void GFp_vpaes_ctr32_encrypt_blocks(const uint8_t *inp, uint8_t *out, -# size_t blocks, const AES_KEY *key, -# const uint8_t ivp[16]); -$code.=<<___; -.globl GFp_${PREFIX}_ctr32_encrypt_blocks -.type GFp_${PREFIX}_ctr32_encrypt_blocks,\@function,5 -.align 16 -GFp_${PREFIX}_ctr32_encrypt_blocks: -.cfi_startproc - # _vpaes_encrypt_core and _vpaes_encrypt_core_2x expect the key in %rdx. - xchg $key, $blocks -___ -($blocks,$key)=($key,$blocks); -$code.=<<___; - test $blocks, $blocks - jz .Lctr32_abort -___ -$code.=<<___ if ($win64); - lea -0xb8(%rsp),%rsp - movaps %xmm6,0x10(%rsp) - movaps %xmm7,0x20(%rsp) - movaps %xmm8,0x30(%rsp) - movaps %xmm9,0x40(%rsp) - movaps %xmm10,0x50(%rsp) - movaps %xmm11,0x60(%rsp) - movaps %xmm12,0x70(%rsp) - movaps %xmm13,0x80(%rsp) - movaps %xmm14,0x90(%rsp) - movaps %xmm15,0xa0(%rsp) -.Lctr32_body: -___ -$code.=<<___; - movdqu ($ivp), %xmm0 # Load IV. - movdqa .Lctr_add_one(%rip), %xmm8 - sub $inp, $out # This allows only incrementing $inp. - call _vpaes_preheat - movdqa %xmm0, %xmm6 - pshufb .Lrev_ctr(%rip), %xmm6 - - test \$1, $blocks - jz .Lctr32_prep_loop - - # Handle one block so the remaining block count is even for - # _vpaes_encrypt_core_2x. - movdqu ($inp), %xmm7 # Load input. - call _vpaes_encrypt_core - pxor %xmm7, %xmm0 - paddd %xmm8, %xmm6 - movdqu %xmm0, ($out,$inp) - sub \$1, $blocks - lea 16($inp), $inp - jz .Lctr32_done - -.Lctr32_prep_loop: - # _vpaes_encrypt_core_2x leaves only %xmm14 and %xmm15 as spare - # registers. We maintain two byte-swapped counters in them. - movdqa %xmm6, %xmm14 - movdqa %xmm6, %xmm15 - paddd %xmm8, %xmm15 - -.Lctr32_loop: - movdqa .Lrev_ctr(%rip), %xmm1 # Set up counters. - movdqa %xmm14, %xmm0 - movdqa %xmm15, %xmm6 - pshufb %xmm1, %xmm0 - pshufb %xmm1, %xmm6 - call _vpaes_encrypt_core_2x - movdqu ($inp), %xmm1 # Load input. - movdqu 16($inp), %xmm2 - movdqa .Lctr_add_two(%rip), %xmm3 - pxor %xmm1, %xmm0 # XOR input. - pxor %xmm2, %xmm6 - paddd %xmm3, %xmm14 # Increment counters. - paddd %xmm3, %xmm15 - movdqu %xmm0, ($out,$inp) # Write output. - movdqu %xmm6, 16($out,$inp) - sub \$2, $blocks # Advance loop. - lea 32($inp), $inp - jnz .Lctr32_loop - -.Lctr32_done: -___ -$code.=<<___ if ($win64); - movaps 0x10(%rsp),%xmm6 - movaps 0x20(%rsp),%xmm7 - movaps 0x30(%rsp),%xmm8 - movaps 0x40(%rsp),%xmm9 - movaps 0x50(%rsp),%xmm10 - movaps 0x60(%rsp),%xmm11 - movaps 0x70(%rsp),%xmm12 - movaps 0x80(%rsp),%xmm13 - movaps 0x90(%rsp),%xmm14 - movaps 0xa0(%rsp),%xmm15 - lea 0xb8(%rsp),%rsp -.Lctr32_epilogue: -___ -$code.=<<___; -.Lctr32_abort: - ret -.cfi_endproc -.size GFp_${PREFIX}_ctr32_encrypt_blocks,.-GFp_${PREFIX}_ctr32_encrypt_blocks -___ -} -$code.=<<___; -## -## _aes_preheat -## -## Fills register %r10 -> .aes_consts (so you can -fPIC) -## and %xmm9-%xmm15 as specified below. -## -.type _vpaes_preheat,\@abi-omnipotent -.align 16 -_vpaes_preheat: -.cfi_startproc - lea .Lk_s0F(%rip), %r10 - movdqa -0x20(%r10), %xmm10 # .Lk_inv - movdqa -0x10(%r10), %xmm11 # .Lk_inv+16 - movdqa 0x00(%r10), %xmm9 # .Lk_s0F - movdqa 0x30(%r10), %xmm13 # .Lk_sb1 - movdqa 0x40(%r10), %xmm12 # .Lk_sb1+16 - movdqa 0x50(%r10), %xmm15 # .Lk_sb2 - movdqa 0x60(%r10), %xmm14 # .Lk_sb2+16 - ret -.cfi_endproc -.size _vpaes_preheat,.-_vpaes_preheat -######################################################## -## ## -## Constants ## -## ## -######################################################## -.type _vpaes_consts,\@object -.align 64 -_vpaes_consts: -.Lk_inv: # inv, inva - .quad 0x0E05060F0D080180, 0x040703090A0B0C02 - .quad 0x01040A060F0B0780, 0x030D0E0C02050809 - -.Lk_s0F: # s0F - .quad 0x0F0F0F0F0F0F0F0F, 0x0F0F0F0F0F0F0F0F - -.Lk_ipt: # input transform (lo, hi) - .quad 0xC2B2E8985A2A7000, 0xCABAE09052227808 - .quad 0x4C01307D317C4D00, 0xCD80B1FCB0FDCC81 - -.Lk_sb1: # sb1u, sb1t - .quad 0xB19BE18FCB503E00, 0xA5DF7A6E142AF544 - .quad 0x3618D415FAE22300, 0x3BF7CCC10D2ED9EF -.Lk_sb2: # sb2u, sb2t - .quad 0xE27A93C60B712400, 0x5EB7E955BC982FCD - .quad 0x69EB88400AE12900, 0xC2A163C8AB82234A -.Lk_sbo: # sbou, sbot - .quad 0xD0D26D176FBDC700, 0x15AABF7AC502A878 - .quad 0xCFE474A55FBB6A00, 0x8E1E90D1412B35FA - -.Lk_mc_forward: # mc_forward - .quad 0x0407060500030201, 0x0C0F0E0D080B0A09 - .quad 0x080B0A0904070605, 0x000302010C0F0E0D - .quad 0x0C0F0E0D080B0A09, 0x0407060500030201 - .quad 0x000302010C0F0E0D, 0x080B0A0904070605 - -.Lk_mc_backward:# mc_backward - .quad 0x0605040702010003, 0x0E0D0C0F0A09080B - .quad 0x020100030E0D0C0F, 0x0A09080B06050407 - .quad 0x0E0D0C0F0A09080B, 0x0605040702010003 - .quad 0x0A09080B06050407, 0x020100030E0D0C0F - -.Lk_sr: # sr - .quad 0x0706050403020100, 0x0F0E0D0C0B0A0908 - .quad 0x030E09040F0A0500, 0x0B06010C07020D08 - .quad 0x0F060D040B020900, 0x070E050C030A0108 - .quad 0x0B0E0104070A0D00, 0x0306090C0F020508 - -.Lk_rcon: # rcon - .quad 0x1F8391B9AF9DEEB6, 0x702A98084D7C7D81 - -.Lk_s63: # s63: all equal to 0x63 transformed - .quad 0x5B5B5B5B5B5B5B5B, 0x5B5B5B5B5B5B5B5B - -.Lk_opt: # output transform - .quad 0xFF9F4929D6B66000, 0xF7974121DEBE6808 - .quad 0x01EDBD5150BCEC00, 0xE10D5DB1B05C0CE0 - -.Lk_deskew: # deskew tables: inverts the sbox's "skew" - .quad 0x07E4A34047A4E300, 0x1DFEB95A5DBEF91A - .quad 0x5F36B5DC83EA6900, 0x2841C2ABF49D1E77 - -# .Lrev_ctr is a permutation which byte-swaps the counter portion of the IV. -.Lrev_ctr: - .quad 0x0706050403020100, 0x0c0d0e0f0b0a0908 -# .Lctr_add_* may be added to a byte-swapped xmm register to increment the -# counter. The register must be byte-swapped again to form the actual input. -.Lctr_add_one: - .quad 0x0000000000000000, 0x0000000100000000 -.Lctr_add_two: - .quad 0x0000000000000000, 0x0000000200000000 - -.asciz "Vector Permutation AES for x86_64/SSSE3, Mike Hamburg (Stanford University)" -.align 64 -.size _vpaes_consts,.-_vpaes_consts -___ - -if ($win64) { -# EXCEPTION_DISPOSITION handler (EXCEPTION_RECORD *rec,ULONG64 frame, -# CONTEXT *context,DISPATCHER_CONTEXT *disp) -$rec="%rcx"; -$frame="%rdx"; -$context="%r8"; -$disp="%r9"; - -$code.=<<___; -.extern __imp_RtlVirtualUnwind -.type se_handler,\@abi-omnipotent -.align 16 -se_handler: - push %rsi - push %rdi - push %rbx - push %rbp - push %r12 - push %r13 - push %r14 - push %r15 - pushfq - sub \$64,%rsp - - mov 120($context),%rax # pull context->Rax - mov 248($context),%rbx # pull context->Rip - - mov 8($disp),%rsi # disp->ImageBase - mov 56($disp),%r11 # disp->HandlerData - - mov 0(%r11),%r10d # HandlerData[0] - lea (%rsi,%r10),%r10 # prologue label - cmp %r10,%rbx # context->RipRsp - - mov 4(%r11),%r10d # HandlerData[1] - lea (%rsi,%r10),%r10 # epilogue label - cmp %r10,%rbx # context->Rip>=epilogue label - jae .Lin_prologue - - lea 16(%rax),%rsi # %xmm save area - lea 512($context),%rdi # &context.Xmm6 - mov \$20,%ecx # 10*sizeof(%xmm0)/sizeof(%rax) - .long 0xa548f3fc # cld; rep movsq - lea 0xb8(%rax),%rax # adjust stack pointer - -.Lin_prologue: - mov 8(%rax),%rdi - mov 16(%rax),%rsi - mov %rax,152($context) # restore context->Rsp - mov %rsi,168($context) # restore context->Rsi - mov %rdi,176($context) # restore context->Rdi - - mov 40($disp),%rdi # disp->ContextRecord - mov $context,%rsi # context - mov \$`1232/8`,%ecx # sizeof(CONTEXT) - .long 0xa548f3fc # cld; rep movsq - - mov $disp,%rsi - xor %rcx,%rcx # arg1, UNW_FLAG_NHANDLER - mov 8(%rsi),%rdx # arg2, disp->ImageBase - mov 0(%rsi),%r8 # arg3, disp->ControlPc - mov 16(%rsi),%r9 # arg4, disp->FunctionEntry - mov 40(%rsi),%r10 # disp->ContextRecord - lea 56(%rsi),%r11 # &disp->HandlerData - lea 24(%rsi),%r12 # &disp->EstablisherFrame - mov %r10,32(%rsp) # arg5 - mov %r11,40(%rsp) # arg6 - mov %r12,48(%rsp) # arg7 - mov %rcx,56(%rsp) # arg8, (NULL) - call *__imp_RtlVirtualUnwind(%rip) - - mov \$1,%eax # ExceptionContinueSearch - add \$64,%rsp - popfq - pop %r15 - pop %r14 - pop %r13 - pop %r12 - pop %rbp - pop %rbx - pop %rdi - pop %rsi - ret -.size se_handler,.-se_handler - -.section .pdata -.align 4 - .rva .LSEH_begin_GFp_${PREFIX}_set_encrypt_key - .rva .LSEH_end_GFp_${PREFIX}_set_encrypt_key - .rva .LSEH_info_GFp_${PREFIX}_set_encrypt_key - - .rva .LSEH_begin_GFp_${PREFIX}_encrypt - .rva .LSEH_end_GFp_${PREFIX}_encrypt - .rva .LSEH_info_GFp_${PREFIX}_encrypt - .rva .LSEH_begin_GFp_${PREFIX}_ctr32_encrypt_blocks - .rva .LSEH_end_GFp_${PREFIX}_ctr32_encrypt_blocks - .rva .LSEH_info_GFp_${PREFIX}_ctr32_encrypt_blocks - -.section .xdata -.align 8 -.LSEH_info_GFp_${PREFIX}_set_encrypt_key: - .byte 9,0,0,0 - .rva se_handler - .rva .Lenc_key_body,.Lenc_key_epilogue # HandlerData[] -.LSEH_info_GFp_${PREFIX}_encrypt: - .byte 9,0,0,0 - .rva se_handler - .rva .Lenc_body,.Lenc_epilogue # HandlerData[] -.LSEH_info_GFp_${PREFIX}_ctr32_encrypt_blocks: - .byte 9,0,0,0 - .rva se_handler - .rva .Lctr32_body,.Lctr32_epilogue # HandlerData[] -___ -} - -$code =~ s/\`([^\`]*)\`/eval($1)/gem; - -print $code; - -close STDOUT or die "error closing STDOUT"; diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/aes/asm/vpaes-x86.pl temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/aes/asm/vpaes-x86.pl --- temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/aes/asm/vpaes-x86.pl 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/aes/asm/vpaes-x86.pl 1970-01-01 00:00:00.000000000 +0000 @@ -1,603 +0,0 @@ -#! /usr/bin/env perl -# Copyright 2011-2016 The OpenSSL Project Authors. All Rights Reserved. -# -# Licensed under the OpenSSL license (the "License"). You may not use -# this file except in compliance with the License. You can obtain a copy -# in the file LICENSE in the source distribution or at -# https://www.openssl.org/source/license.html - - -###################################################################### -## Constant-time SSSE3 AES core implementation. -## version 0.1 -## -## By Mike Hamburg (Stanford University), 2009 -## Public domain. -## -## For details see http://shiftleft.org/papers/vector_aes/ and -## http://crypto.stanford.edu/vpaes/. - -###################################################################### -# September 2011. -# -# Port vpaes-x86_64.pl as 32-bit "almost" drop-in replacement for -# aes-586.pl. "Almost" refers to the fact that AES_cbc_encrypt -# doesn't handle partial vectors (doesn't have to if called from -# EVP only). "Drop-in" implies that this module doesn't share key -# schedule structure with the original nor does it make assumption -# about its alignment... -# -# Performance summary. aes-586.pl column lists large-block CBC -# encrypt/decrypt/with-hyper-threading-off(*) results in cycles per -# byte processed with 128-bit key, and vpaes-x86.pl column - [also -# large-block CBC] encrypt/decrypt. -# -# aes-586.pl vpaes-x86.pl -# -# Core 2(**) 28.1/41.4/18.3 21.9/25.2(***) -# Nehalem 27.9/40.4/18.1 10.2/11.9 -# Atom 70.7/92.1/60.1 61.1/75.4(***) -# Silvermont 45.4/62.9/24.1 49.2/61.1(***) -# -# (*) "Hyper-threading" in the context refers rather to cache shared -# among multiple cores, than to specifically Intel HTT. As vast -# majority of contemporary cores share cache, slower code path -# is common place. In other words "with-hyper-threading-off" -# results are presented mostly for reference purposes. -# -# (**) "Core 2" refers to initial 65nm design, a.k.a. Conroe. -# -# (***) Less impressive improvement on Core 2 and Atom is due to slow -# pshufb, yet it's respectable +28%/64% improvement on Core 2 -# and +15% on Atom (as implied, over "hyper-threading-safe" -# code path). -# -# - -$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; -push(@INC,"${dir}","${dir}../../../perlasm"); -require "x86asm.pl"; - -$output = pop; -open OUT,">$output"; -*STDOUT=*OUT; - -&asm_init($ARGV[0],$x86only = $ARGV[$#ARGV] eq "386"); - -$PREFIX="vpaes"; - -my ($round, $base, $magic, $key, $const, $inp, $out)= - ("eax", "ebx", "ecx", "edx","ebp", "esi","edi"); - -&static_label("_vpaes_consts"); -&static_label("_vpaes_schedule_low_round"); - -&set_label("_vpaes_consts",64); -$k_inv=-0x30; # inv, inva - &data_word(0x0D080180,0x0E05060F,0x0A0B0C02,0x04070309); - &data_word(0x0F0B0780,0x01040A06,0x02050809,0x030D0E0C); - -$k_s0F=-0x10; # s0F - &data_word(0x0F0F0F0F,0x0F0F0F0F,0x0F0F0F0F,0x0F0F0F0F); - -$k_ipt=0x00; # input transform (lo, hi) - &data_word(0x5A2A7000,0xC2B2E898,0x52227808,0xCABAE090); - &data_word(0x317C4D00,0x4C01307D,0xB0FDCC81,0xCD80B1FC); - -$k_sb1=0x20; # sb1u, sb1t - &data_word(0xCB503E00,0xB19BE18F,0x142AF544,0xA5DF7A6E); - &data_word(0xFAE22300,0x3618D415,0x0D2ED9EF,0x3BF7CCC1); -$k_sb2=0x40; # sb2u, sb2t - &data_word(0x0B712400,0xE27A93C6,0xBC982FCD,0x5EB7E955); - &data_word(0x0AE12900,0x69EB8840,0xAB82234A,0xC2A163C8); -$k_sbo=0x60; # sbou, sbot - &data_word(0x6FBDC700,0xD0D26D17,0xC502A878,0x15AABF7A); - &data_word(0x5FBB6A00,0xCFE474A5,0x412B35FA,0x8E1E90D1); - -$k_mc_forward=0x80; # mc_forward - &data_word(0x00030201,0x04070605,0x080B0A09,0x0C0F0E0D); - &data_word(0x04070605,0x080B0A09,0x0C0F0E0D,0x00030201); - &data_word(0x080B0A09,0x0C0F0E0D,0x00030201,0x04070605); - &data_word(0x0C0F0E0D,0x00030201,0x04070605,0x080B0A09); - -$k_mc_backward=0xc0; # mc_backward - &data_word(0x02010003,0x06050407,0x0A09080B,0x0E0D0C0F); - &data_word(0x0E0D0C0F,0x02010003,0x06050407,0x0A09080B); - &data_word(0x0A09080B,0x0E0D0C0F,0x02010003,0x06050407); - &data_word(0x06050407,0x0A09080B,0x0E0D0C0F,0x02010003); - -$k_sr=0x100; # sr - &data_word(0x03020100,0x07060504,0x0B0A0908,0x0F0E0D0C); - &data_word(0x0F0A0500,0x030E0904,0x07020D08,0x0B06010C); - &data_word(0x0B020900,0x0F060D04,0x030A0108,0x070E050C); - &data_word(0x070A0D00,0x0B0E0104,0x0F020508,0x0306090C); - -$k_rcon=0x140; # rcon - &data_word(0xAF9DEEB6,0x1F8391B9,0x4D7C7D81,0x702A9808); - -$k_s63=0x150; # s63: all equal to 0x63 transformed - &data_word(0x5B5B5B5B,0x5B5B5B5B,0x5B5B5B5B,0x5B5B5B5B); - -$k_opt=0x160; # output transform - &data_word(0xD6B66000,0xFF9F4929,0xDEBE6808,0xF7974121); - &data_word(0x50BCEC00,0x01EDBD51,0xB05C0CE0,0xE10D5DB1); - -$k_deskew=0x180; # deskew tables: inverts the sbox's "skew" - &data_word(0x47A4E300,0x07E4A340,0x5DBEF91A,0x1DFEB95A); - &data_word(0x83EA6900,0x5F36B5DC,0xF49D1E77,0x2841C2AB); - -&asciz ("Vector Permutation AES for x86/SSSE3, Mike Hamburg (Stanford University)"); -&align (64); - -&function_begin_B("_vpaes_preheat"); - &add ($const,&DWP(0,"esp")); - &movdqa ("xmm7",&QWP($k_inv,$const)); - &movdqa ("xmm6",&QWP($k_s0F,$const)); - &ret (); -&function_end_B("_vpaes_preheat"); - -## -## _aes_encrypt_core -## -## AES-encrypt %xmm0. -## -## Inputs: -## %xmm0 = input -## %xmm6-%xmm7 as in _vpaes_preheat -## (%edx) = scheduled keys -## -## Output in %xmm0 -## Clobbers %xmm1-%xmm5, %eax, %ebx, %ecx, %edx -## -## -&function_begin_B("_vpaes_encrypt_core"); - &mov ($magic,16); - &mov ($round,&DWP(240,$key)); - &movdqa ("xmm1","xmm6") - &movdqa ("xmm2",&QWP($k_ipt,$const)); - &pandn ("xmm1","xmm0"); - &pand ("xmm0","xmm6"); - &movdqu ("xmm5",&QWP(0,$key)); - &pshufb ("xmm2","xmm0"); - &movdqa ("xmm0",&QWP($k_ipt+16,$const)); - &pxor ("xmm2","xmm5"); - &psrld ("xmm1",4); - &add ($key,16); - &pshufb ("xmm0","xmm1"); - &lea ($base,&DWP($k_mc_backward,$const)); - &pxor ("xmm0","xmm2"); - &jmp (&label("enc_entry")); - - -&set_label("enc_loop",16); - # middle of middle round - &movdqa ("xmm4",&QWP($k_sb1,$const)); # 4 : sb1u - &movdqa ("xmm0",&QWP($k_sb1+16,$const));# 0 : sb1t - &pshufb ("xmm4","xmm2"); # 4 = sb1u - &pshufb ("xmm0","xmm3"); # 0 = sb1t - &pxor ("xmm4","xmm5"); # 4 = sb1u + k - &movdqa ("xmm5",&QWP($k_sb2,$const)); # 4 : sb2u - &pxor ("xmm0","xmm4"); # 0 = A - &movdqa ("xmm1",&QWP(-0x40,$base,$magic));# .Lk_mc_forward[] - &pshufb ("xmm5","xmm2"); # 4 = sb2u - &movdqa ("xmm2",&QWP($k_sb2+16,$const));# 2 : sb2t - &movdqa ("xmm4",&QWP(0,$base,$magic)); # .Lk_mc_backward[] - &pshufb ("xmm2","xmm3"); # 2 = sb2t - &movdqa ("xmm3","xmm0"); # 3 = A - &pxor ("xmm2","xmm5"); # 2 = 2A - &pshufb ("xmm0","xmm1"); # 0 = B - &add ($key,16); # next key - &pxor ("xmm0","xmm2"); # 0 = 2A+B - &pshufb ("xmm3","xmm4"); # 3 = D - &add ($magic,16); # next mc - &pxor ("xmm3","xmm0"); # 3 = 2A+B+D - &pshufb ("xmm0","xmm1"); # 0 = 2B+C - &and ($magic,0x30); # ... mod 4 - &sub ($round,1); # nr-- - &pxor ("xmm0","xmm3"); # 0 = 2A+3B+C+D - -&set_label("enc_entry"); - # top of round - &movdqa ("xmm1","xmm6"); # 1 : i - &movdqa ("xmm5",&QWP($k_inv+16,$const));# 2 : a/k - &pandn ("xmm1","xmm0"); # 1 = i<<4 - &psrld ("xmm1",4); # 1 = i - &pand ("xmm0","xmm6"); # 0 = k - &pshufb ("xmm5","xmm0"); # 2 = a/k - &movdqa ("xmm3","xmm7"); # 3 : 1/i - &pxor ("xmm0","xmm1"); # 0 = j - &pshufb ("xmm3","xmm1"); # 3 = 1/i - &movdqa ("xmm4","xmm7"); # 4 : 1/j - &pxor ("xmm3","xmm5"); # 3 = iak = 1/i + a/k - &pshufb ("xmm4","xmm0"); # 4 = 1/j - &movdqa ("xmm2","xmm7"); # 2 : 1/iak - &pxor ("xmm4","xmm5"); # 4 = jak = 1/j + a/k - &pshufb ("xmm2","xmm3"); # 2 = 1/iak - &movdqa ("xmm3","xmm7"); # 3 : 1/jak - &pxor ("xmm2","xmm0"); # 2 = io - &pshufb ("xmm3","xmm4"); # 3 = 1/jak - &movdqu ("xmm5",&QWP(0,$key)); - &pxor ("xmm3","xmm1"); # 3 = jo - &jnz (&label("enc_loop")); - - # middle of last round - &movdqa ("xmm4",&QWP($k_sbo,$const)); # 3 : sbou .Lk_sbo - &movdqa ("xmm0",&QWP($k_sbo+16,$const));# 3 : sbot .Lk_sbo+16 - &pshufb ("xmm4","xmm2"); # 4 = sbou - &pxor ("xmm4","xmm5"); # 4 = sb1u + k - &pshufb ("xmm0","xmm3"); # 0 = sb1t - &movdqa ("xmm1",&QWP(0x40,$base,$magic));# .Lk_sr[] - &pxor ("xmm0","xmm4"); # 0 = A - &pshufb ("xmm0","xmm1"); - &ret (); -&function_end_B("_vpaes_encrypt_core"); - -######################################################## -## ## -## AES key schedule ## -## ## -######################################################## -&function_begin_B("_vpaes_schedule_core"); - &add ($const,&DWP(0,"esp")); - &movdqu ("xmm0",&QWP(0,$inp)); # load key (unaligned) - &movdqa ("xmm2",&QWP($k_rcon,$const)); # load rcon - - # input transform - &movdqa ("xmm3","xmm0"); - &lea ($base,&DWP($k_ipt,$const)); - &movdqa (&QWP(4,"esp"),"xmm2"); # xmm8 - &call ("_vpaes_schedule_transform"); - &movdqa ("xmm7","xmm0"); - - &test ($out,$out); - &jnz (&label("schedule_am_decrypting")); - - # encrypting, output zeroth round key after transform - &movdqu (&QWP(0,$key),"xmm0"); - &jmp (&label("schedule_go")); - -&set_label("schedule_am_decrypting"); - # decrypting, output zeroth round key after shiftrows - &movdqa ("xmm1",&QWP($k_sr,$const,$magic)); - &pshufb ("xmm3","xmm1"); - &movdqu (&QWP(0,$key),"xmm3"); - &xor ($magic,0x30); - -&set_label("schedule_go"); - &cmp ($round,192); - &ja (&label("schedule_256")); - # 192-bit key support was removed. - # 128: fall though - -## -## .schedule_128 -## -## 128-bit specific part of key schedule. -## -## This schedule is really simple, because all its parts -## are accomplished by the subroutines. -## -&set_label("schedule_128"); - &mov ($round,10); - -&set_label("loop_schedule_128"); - &call ("_vpaes_schedule_round"); - &dec ($round); - &jz (&label("schedule_mangle_last")); - &call ("_vpaes_schedule_mangle"); # write output - &jmp (&label("loop_schedule_128")); - -## -## .aes_schedule_256 -## -## 256-bit specific part of key schedule. -## -## The structure here is very similar to the 128-bit -## schedule, but with an additional "low side" in -## %xmm6. The low side's rounds are the same as the -## high side's, except no rcon and no rotation. -## -&set_label("schedule_256",16); - &movdqu ("xmm0",&QWP(16,$inp)); # load key part 2 (unaligned) - &call ("_vpaes_schedule_transform"); # input transform - &mov ($round,7); - -&set_label("loop_schedule_256"); - &call ("_vpaes_schedule_mangle"); # output low result - &movdqa ("xmm6","xmm0"); # save cur_lo in xmm6 - - # high round - &call ("_vpaes_schedule_round"); - &dec ($round); - &jz (&label("schedule_mangle_last")); - &call ("_vpaes_schedule_mangle"); - - # low round. swap xmm7 and xmm6 - &pshufd ("xmm0","xmm0",0xFF); - &movdqa (&QWP(20,"esp"),"xmm7"); - &movdqa ("xmm7","xmm6"); - &call ("_vpaes_schedule_low_round"); - &movdqa ("xmm7",&QWP(20,"esp")); - - &jmp (&label("loop_schedule_256")); - -## -## .aes_schedule_mangle_last -## -## Mangler for last round of key schedule -## Mangles %xmm0 -## when encrypting, outputs out(%xmm0) ^ 63 -## when decrypting, outputs unskew(%xmm0) -## -## Always called right before return... jumps to cleanup and exits -## -&set_label("schedule_mangle_last",16); - # schedule last round key from xmm0 - &lea ($base,&DWP($k_deskew,$const)); - &test ($out,$out); - &jnz (&label("schedule_mangle_last_dec")); - - # encrypting - &movdqa ("xmm1",&QWP($k_sr,$const,$magic)); - &pshufb ("xmm0","xmm1"); # output permute - &lea ($base,&DWP($k_opt,$const)); # prepare to output transform - &add ($key,32); - -&set_label("schedule_mangle_last_dec"); - &add ($key,-16); - &pxor ("xmm0",&QWP($k_s63,$const)); - &call ("_vpaes_schedule_transform"); # output transform - &movdqu (&QWP(0,$key),"xmm0"); # save last key - - # cleanup - &pxor ("xmm0","xmm0"); - &pxor ("xmm1","xmm1"); - &pxor ("xmm2","xmm2"); - &pxor ("xmm3","xmm3"); - &pxor ("xmm4","xmm4"); - &pxor ("xmm5","xmm5"); - &pxor ("xmm6","xmm6"); - &pxor ("xmm7","xmm7"); - &ret (); -&function_end_B("_vpaes_schedule_core"); - -## -## .aes_schedule_round -## -## Runs one main round of the key schedule on %xmm0, %xmm7 -## -## Specifically, runs subbytes on the high dword of %xmm0 -## then rotates it by one byte and xors into the low dword of -## %xmm7. -## -## Adds rcon from low byte of %xmm8, then rotates %xmm8 for -## next rcon. -## -## Smears the dwords of %xmm7 by xoring the low into the -## second low, result into third, result into highest. -## -## Returns results in %xmm7 = %xmm0. -## Clobbers %xmm1-%xmm5. -## -&function_begin_B("_vpaes_schedule_round"); - # extract rcon from xmm8 - &movdqa ("xmm2",&QWP(8,"esp")); # xmm8 - &pxor ("xmm1","xmm1"); - &palignr("xmm1","xmm2",15); - &palignr("xmm2","xmm2",15); - &pxor ("xmm7","xmm1"); - - # rotate - &pshufd ("xmm0","xmm0",0xFF); - &palignr("xmm0","xmm0",1); - - # fall through... - &movdqa (&QWP(8,"esp"),"xmm2"); # xmm8 - - # low round: same as high round, but no rotation and no rcon. -&set_label("_vpaes_schedule_low_round"); - # smear xmm7 - &movdqa ("xmm1","xmm7"); - &pslldq ("xmm7",4); - &pxor ("xmm7","xmm1"); - &movdqa ("xmm1","xmm7"); - &pslldq ("xmm7",8); - &pxor ("xmm7","xmm1"); - &pxor ("xmm7",&QWP($k_s63,$const)); - - # subbyte - &movdqa ("xmm4",&QWP($k_s0F,$const)); - &movdqa ("xmm5",&QWP($k_inv,$const)); # 4 : 1/j - &movdqa ("xmm1","xmm4"); - &pandn ("xmm1","xmm0"); - &psrld ("xmm1",4); # 1 = i - &pand ("xmm0","xmm4"); # 0 = k - &movdqa ("xmm2",&QWP($k_inv+16,$const));# 2 : a/k - &pshufb ("xmm2","xmm0"); # 2 = a/k - &pxor ("xmm0","xmm1"); # 0 = j - &movdqa ("xmm3","xmm5"); # 3 : 1/i - &pshufb ("xmm3","xmm1"); # 3 = 1/i - &pxor ("xmm3","xmm2"); # 3 = iak = 1/i + a/k - &movdqa ("xmm4","xmm5"); # 4 : 1/j - &pshufb ("xmm4","xmm0"); # 4 = 1/j - &pxor ("xmm4","xmm2"); # 4 = jak = 1/j + a/k - &movdqa ("xmm2","xmm5"); # 2 : 1/iak - &pshufb ("xmm2","xmm3"); # 2 = 1/iak - &pxor ("xmm2","xmm0"); # 2 = io - &movdqa ("xmm3","xmm5"); # 3 : 1/jak - &pshufb ("xmm3","xmm4"); # 3 = 1/jak - &pxor ("xmm3","xmm1"); # 3 = jo - &movdqa ("xmm4",&QWP($k_sb1,$const)); # 4 : sbou - &pshufb ("xmm4","xmm2"); # 4 = sbou - &movdqa ("xmm0",&QWP($k_sb1+16,$const));# 0 : sbot - &pshufb ("xmm0","xmm3"); # 0 = sb1t - &pxor ("xmm0","xmm4"); # 0 = sbox output - - # add in smeared stuff - &pxor ("xmm0","xmm7"); - &movdqa ("xmm7","xmm0"); - &ret (); -&function_end_B("_vpaes_schedule_round"); - -## -## .aes_schedule_transform -## -## Linear-transform %xmm0 according to tables at (%ebx) -## -## Output in %xmm0 -## Clobbers %xmm1, %xmm2 -## -&function_begin_B("_vpaes_schedule_transform"); - &movdqa ("xmm2",&QWP($k_s0F,$const)); - &movdqa ("xmm1","xmm2"); - &pandn ("xmm1","xmm0"); - &psrld ("xmm1",4); - &pand ("xmm0","xmm2"); - &movdqa ("xmm2",&QWP(0,$base)); - &pshufb ("xmm2","xmm0"); - &movdqa ("xmm0",&QWP(16,$base)); - &pshufb ("xmm0","xmm1"); - &pxor ("xmm0","xmm2"); - &ret (); -&function_end_B("_vpaes_schedule_transform"); - -## -## .aes_schedule_mangle -## -## Mangle xmm0 from (basis-transformed) standard version -## to our version. -## -## On encrypt, -## xor with 0x63 -## multiply by circulant 0,1,1,1 -## apply shiftrows transform -## -## On decrypt, -## xor with 0x63 -## multiply by "inverse mixcolumns" circulant E,B,D,9 -## deskew -## apply shiftrows transform -## -## -## Writes out to (%edx), and increments or decrements it -## Keeps track of round number mod 4 in %ecx -## Preserves xmm0 -## Clobbers xmm1-xmm5 -## -&function_begin_B("_vpaes_schedule_mangle"); - &movdqa ("xmm4","xmm0"); # save xmm0 for later - &movdqa ("xmm5",&QWP($k_mc_forward,$const)); - &test ($out,$out); - &jnz (&label("schedule_mangle_dec")); - - # encrypting - &add ($key,16); - &pxor ("xmm4",&QWP($k_s63,$const)); - &pshufb ("xmm4","xmm5"); - &movdqa ("xmm3","xmm4"); - &pshufb ("xmm4","xmm5"); - &pxor ("xmm3","xmm4"); - &pshufb ("xmm4","xmm5"); - &pxor ("xmm3","xmm4"); - - &jmp (&label("schedule_mangle_both")); - -&set_label("schedule_mangle_dec",16); - # inverse mix columns - &movdqa ("xmm2",&QWP($k_s0F,$const)); - &lea ($inp,&DWP($k_dksd,$const)); - &movdqa ("xmm1","xmm2"); - &pandn ("xmm1","xmm4"); - &psrld ("xmm1",4); # 1 = hi - &pand ("xmm4","xmm2"); # 4 = lo - - &movdqa ("xmm2",&QWP(0,$inp)); - &pshufb ("xmm2","xmm4"); - &movdqa ("xmm3",&QWP(0x10,$inp)); - &pshufb ("xmm3","xmm1"); - &pxor ("xmm3","xmm2"); - &pshufb ("xmm3","xmm5"); - - &movdqa ("xmm2",&QWP(0x20,$inp)); - &pshufb ("xmm2","xmm4"); - &pxor ("xmm2","xmm3"); - &movdqa ("xmm3",&QWP(0x30,$inp)); - &pshufb ("xmm3","xmm1"); - &pxor ("xmm3","xmm2"); - &pshufb ("xmm3","xmm5"); - - &movdqa ("xmm2",&QWP(0x40,$inp)); - &pshufb ("xmm2","xmm4"); - &pxor ("xmm2","xmm3"); - &movdqa ("xmm3",&QWP(0x50,$inp)); - &pshufb ("xmm3","xmm1"); - &pxor ("xmm3","xmm2"); - &pshufb ("xmm3","xmm5"); - - &movdqa ("xmm2",&QWP(0x60,$inp)); - &pshufb ("xmm2","xmm4"); - &pxor ("xmm2","xmm3"); - &movdqa ("xmm3",&QWP(0x70,$inp)); - &pshufb ("xmm3","xmm1"); - &pxor ("xmm3","xmm2"); - - &add ($key,-16); - -&set_label("schedule_mangle_both"); - &movdqa ("xmm1",&QWP($k_sr,$const,$magic)); - &pshufb ("xmm3","xmm1"); - &add ($magic,-16); - &and ($magic,0x30); - &movdqu (&QWP(0,$key),"xmm3"); - &ret (); -&function_end_B("_vpaes_schedule_mangle"); - -# -# Interface to OpenSSL -# -&function_begin("GFp_${PREFIX}_set_encrypt_key"); - &mov ($inp,&wparam(0)); # inp - &lea ($base,&DWP(-56,"esp")); - &mov ($round,&wparam(1)); # bits - &and ($base,-16); - &mov ($key,&wparam(2)); # key - &xchg ($base,"esp"); # alloca - &mov (&DWP(48,"esp"),$base); - - &mov ($base,$round); - &shr ($base,5); - &add ($base,5); - &mov (&DWP(240,$key),$base); # AES_KEY->rounds = nbits/32+5; - &mov ($magic,0x30); - &mov ($out,0); - - &lea ($const,&DWP(&label("_vpaes_consts")."+0x30-".&label("pic_point"))); - &call ("_vpaes_schedule_core"); -&set_label("pic_point"); - - &mov ("esp",&DWP(48,"esp")); - &xor ("eax","eax"); -&function_end("GFp_${PREFIX}_set_encrypt_key"); - -&function_begin("GFp_${PREFIX}_encrypt"); - &lea ($const,&DWP(&label("_vpaes_consts")."+0x30-".&label("pic_point"))); - &call ("_vpaes_preheat"); -&set_label("pic_point"); - &mov ($inp,&wparam(0)); # inp - &lea ($base,&DWP(-56,"esp")); - &mov ($out,&wparam(1)); # out - &and ($base,-16); - &mov ($key,&wparam(2)); # key - &xchg ($base,"esp"); # alloca - &mov (&DWP(48,"esp"),$base); - - &movdqu ("xmm0",&QWP(0,$inp)); - &call ("_vpaes_encrypt_core"); - &movdqu (&QWP(0,$out),"xmm0"); - - &mov ("esp",&DWP(48,"esp")); -&function_end("GFp_${PREFIX}_encrypt"); - -&asm_finish(); - -close STDOUT or die "error closing STDOUT"; diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/bn/asm/armv4-mont.pl temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/bn/asm/armv4-mont.pl --- temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/bn/asm/armv4-mont.pl 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/bn/asm/armv4-mont.pl 1970-01-01 00:00:00.000000000 +0000 @@ -1,761 +0,0 @@ -#! /usr/bin/env perl -# Copyright 2007-2016 The OpenSSL Project Authors. All Rights Reserved. -# -# Licensed under the OpenSSL license (the "License"). You may not use -# this file except in compliance with the License. You can obtain a copy -# in the file LICENSE in the source distribution or at -# https://www.openssl.org/source/license.html - - -# ==================================================================== -# Written by Andy Polyakov for the OpenSSL -# project. The module is, however, dual licensed under OpenSSL and -# CRYPTOGAMS licenses depending on where you obtain it. For further -# details see http://www.openssl.org/~appro/cryptogams/. -# ==================================================================== - -# January 2007. - -# Montgomery multiplication for ARMv4. -# -# Performance improvement naturally varies among CPU implementations -# and compilers. The code was observed to provide +65-35% improvement -# [depending on key length, less for longer keys] on ARM920T, and -# +115-80% on Intel IXP425. This is compared to pre-bn_mul_mont code -# base and compiler generated code with in-lined umull and even umlal -# instructions. The latter means that this code didn't really have an -# "advantage" of utilizing some "secret" instruction. -# -# The code is interoperable with Thumb ISA and is rather compact, less -# than 1/2KB. Windows CE port would be trivial, as it's exclusively -# about decorations, ABI and instruction syntax are identical. - -# November 2013 -# -# Add NEON code path, which handles lengths divisible by 8. RSA/DSA -# performance improvement on Cortex-A8 is ~45-100% depending on key -# length, more for longer keys. On Cortex-A15 the span is ~10-105%. -# On Snapdragon S4 improvement was measured to vary from ~70% to -# incredible ~380%, yes, 4.8x faster, for RSA4096 sign. But this is -# rather because original integer-only code seems to perform -# suboptimally on S4. Situation on Cortex-A9 is unfortunately -# different. It's being looked into, but the trouble is that -# performance for vectors longer than 256 bits is actually couple -# of percent worse than for integer-only code. The code is chosen -# for execution on all NEON-capable processors, because gain on -# others outweighs the marginal loss on Cortex-A9. - -# September 2015 -# -# Align Cortex-A9 performance with November 2013 improvements, i.e. -# NEON code is now ~20-105% faster than integer-only one on this -# processor. But this optimization further improved performance even -# on other processors: NEON code path is ~45-180% faster than original -# integer-only on Cortex-A8, ~10-210% on Cortex-A15, ~70-450% on -# Snapdragon S4. - -$flavour = shift; -if ($flavour=~/\w[\w\-]*\.\w+$/) { $output=$flavour; undef $flavour; } -else { while (($output=shift) && ($output!~/\w[\w\-]*\.\w+$/)) {} } - -if ($flavour && $flavour ne "void") { - $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; - ( $xlate="${dir}arm-xlate.pl" and -f $xlate ) or - ( $xlate="${dir}../../../perlasm/arm-xlate.pl" and -f $xlate) or - die "can't locate arm-xlate.pl"; - - open OUT,"| \"$^X\" $xlate $flavour $output"; - *STDOUT=*OUT; -} else { - open OUT,">$output"; - *STDOUT=*OUT; -} - -$num="r0"; # starts as num argument, but holds &tp[num-1] -$ap="r1"; -$bp="r2"; $bi="r2"; $rp="r2"; -$np="r3"; -$tp="r4"; -$aj="r5"; -$nj="r6"; -$tj="r7"; -$n0="r8"; -########### # r9 is reserved by ELF as platform specific, e.g. TLS pointer -$alo="r10"; # sl, gcc uses it to keep @GOT -$ahi="r11"; # fp -$nlo="r12"; # ip -########### # r13 is stack pointer -$nhi="r14"; # lr -########### # r15 is program counter - -#### argument block layout relative to &tp[num-1], a.k.a. $num -$_rp="$num,#12*4"; -# ap permanently resides in r1 -$_bp="$num,#13*4"; -# np permanently resides in r3 -$_n0="$num,#14*4"; -$_num="$num,#15*4"; $_bpend=$_num; - -$code=<<___; -#include - -@ Silence ARMv8 deprecated IT instruction warnings. This file is used by both -@ ARMv7 and ARMv8 processors and does not use ARMv8 instructions. -.arch armv7-a - -.text -#if defined(__thumb2__) -.syntax unified -.thumb -#else -.code 32 -#endif - -#if __ARM_MAX_ARCH__>=7 -.extern GFp_armcap_P -.hidden GFp_armcap_P -.align 5 -.LOPENSSL_armcap: -.word GFp_armcap_P-.Lbn_mul_mont -#endif - -.global GFp_bn_mul_mont -.type GFp_bn_mul_mont,%function - -.align 5 -GFp_bn_mul_mont: -.Lbn_mul_mont: - ldr ip,[sp,#4] @ load num - stmdb sp!,{r0,r2} @ sp points at argument block -#if __ARM_MAX_ARCH__>=7 - tst ip,#7 - bne .Lialu - adr r0,.Lbn_mul_mont - ldr r2,.LOPENSSL_armcap - ldr r0,[r0,r2] -#ifdef __APPLE__ - ldr r0,[r0] -#endif - tst r0,#ARMV7_NEON @ NEON available? - ldmia sp, {r0,r2} - beq .Lialu - add sp,sp,#8 - b bn_mul8x_mont_neon -.align 4 -.Lialu: -#endif - cmp ip,#2 - mov $num,ip @ load num -#ifdef __thumb2__ - ittt lt -#endif - movlt r0,#0 - addlt sp,sp,#2*4 - blt .Labrt - - stmdb sp!,{r4-r12,lr} @ save 10 registers - - mov $num,$num,lsl#2 @ rescale $num for byte count - sub sp,sp,$num @ alloca(4*num) - sub sp,sp,#4 @ +extra dword - sub $num,$num,#4 @ "num=num-1" - add $tp,$bp,$num @ &bp[num-1] - - add $num,sp,$num @ $num to point at &tp[num-1] - ldr $n0,[$_n0] @ &n0 - ldr $bi,[$bp] @ bp[0] - ldr $aj,[$ap],#4 @ ap[0],ap++ - ldr $nj,[$np],#4 @ np[0],np++ - ldr $n0,[$n0] @ *n0 - str $tp,[$_bpend] @ save &bp[num] - - umull $alo,$ahi,$aj,$bi @ ap[0]*bp[0] - str $n0,[$_n0] @ save n0 value - mul $n0,$alo,$n0 @ "tp[0]"*n0 - mov $nlo,#0 - umlal $alo,$nlo,$nj,$n0 @ np[0]*n0+"t[0]" - mov $tp,sp - -.L1st: - ldr $aj,[$ap],#4 @ ap[j],ap++ - mov $alo,$ahi - ldr $nj,[$np],#4 @ np[j],np++ - mov $ahi,#0 - umlal $alo,$ahi,$aj,$bi @ ap[j]*bp[0] - mov $nhi,#0 - umlal $nlo,$nhi,$nj,$n0 @ np[j]*n0 - adds $nlo,$nlo,$alo - str $nlo,[$tp],#4 @ tp[j-1]=,tp++ - adc $nlo,$nhi,#0 - cmp $tp,$num - bne .L1st - - adds $nlo,$nlo,$ahi - ldr $tp,[$_bp] @ restore bp - mov $nhi,#0 - ldr $n0,[$_n0] @ restore n0 - adc $nhi,$nhi,#0 - str $nlo,[$num] @ tp[num-1]= - mov $tj,sp - str $nhi,[$num,#4] @ tp[num]= - -.Louter: - sub $tj,$num,$tj @ "original" $num-1 value - sub $ap,$ap,$tj @ "rewind" ap to &ap[1] - ldr $bi,[$tp,#4]! @ *(++bp) - sub $np,$np,$tj @ "rewind" np to &np[1] - ldr $aj,[$ap,#-4] @ ap[0] - ldr $alo,[sp] @ tp[0] - ldr $nj,[$np,#-4] @ np[0] - ldr $tj,[sp,#4] @ tp[1] - - mov $ahi,#0 - umlal $alo,$ahi,$aj,$bi @ ap[0]*bp[i]+tp[0] - str $tp,[$_bp] @ save bp - mul $n0,$alo,$n0 - mov $nlo,#0 - umlal $alo,$nlo,$nj,$n0 @ np[0]*n0+"tp[0]" - mov $tp,sp - -.Linner: - ldr $aj,[$ap],#4 @ ap[j],ap++ - adds $alo,$ahi,$tj @ +=tp[j] - ldr $nj,[$np],#4 @ np[j],np++ - mov $ahi,#0 - umlal $alo,$ahi,$aj,$bi @ ap[j]*bp[i] - mov $nhi,#0 - umlal $nlo,$nhi,$nj,$n0 @ np[j]*n0 - adc $ahi,$ahi,#0 - ldr $tj,[$tp,#8] @ tp[j+1] - adds $nlo,$nlo,$alo - str $nlo,[$tp],#4 @ tp[j-1]=,tp++ - adc $nlo,$nhi,#0 - cmp $tp,$num - bne .Linner - - adds $nlo,$nlo,$ahi - mov $nhi,#0 - ldr $tp,[$_bp] @ restore bp - adc $nhi,$nhi,#0 - ldr $n0,[$_n0] @ restore n0 - adds $nlo,$nlo,$tj - ldr $tj,[$_bpend] @ restore &bp[num] - adc $nhi,$nhi,#0 - str $nlo,[$num] @ tp[num-1]= - str $nhi,[$num,#4] @ tp[num]= - - cmp $tp,$tj -#ifdef __thumb2__ - itt ne -#endif - movne $tj,sp - bne .Louter - - ldr $rp,[$_rp] @ pull rp - mov $aj,sp - add $num,$num,#4 @ $num to point at &tp[num] - sub $aj,$num,$aj @ "original" num value - mov $tp,sp @ "rewind" $tp - mov $ap,$tp @ "borrow" $ap - sub $np,$np,$aj @ "rewind" $np to &np[0] - - subs $tj,$tj,$tj @ "clear" carry flag -.Lsub: ldr $tj,[$tp],#4 - ldr $nj,[$np],#4 - sbcs $tj,$tj,$nj @ tp[j]-np[j] - str $tj,[$rp],#4 @ rp[j]= - teq $tp,$num @ preserve carry - bne .Lsub - sbcs $nhi,$nhi,#0 @ upmost carry - mov $tp,sp @ "rewind" $tp - sub $rp,$rp,$aj @ "rewind" $rp - -.Lcopy: ldr $tj,[$tp] @ conditional copy - ldr $aj,[$rp] - str sp,[$tp],#4 @ zap tp -#ifdef __thumb2__ - it cc -#endif - movcc $aj,$tj - str $aj,[$rp],#4 - teq $tp,$num @ preserve carry - bne .Lcopy - - mov sp,$num - add sp,sp,#4 @ skip over tp[num+1] - ldmia sp!,{r4-r12,lr} @ restore registers - add sp,sp,#2*4 @ skip over {r0,r2} - mov r0,#1 -.Labrt: -#if __ARM_ARCH__>=5 - ret @ bx lr -#else - tst lr,#1 - moveq pc,lr @ be binary compatible with V4, yet - bx lr @ interoperable with Thumb ISA:-) -#endif -.size GFp_bn_mul_mont,.-GFp_bn_mul_mont -___ -{ -my ($A0,$A1,$A2,$A3)=map("d$_",(0..3)); -my ($N0,$N1,$N2,$N3)=map("d$_",(4..7)); -my ($Z,$Temp)=("q4","q5"); -my @ACC=map("q$_",(6..13)); -my ($Bi,$Ni,$M0)=map("d$_",(28..31)); -my $zero="$Z#lo"; -my $temp="$Temp#lo"; - -my ($rptr,$aptr,$bptr,$nptr,$n0,$num)=map("r$_",(0..5)); -my ($tinptr,$toutptr,$inner,$outer,$bnptr)=map("r$_",(6..11)); - -$code.=<<___; -#if __ARM_MAX_ARCH__>=7 -.arch armv7-a -.fpu neon - -.type bn_mul8x_mont_neon,%function -.align 5 -bn_mul8x_mont_neon: - mov ip,sp - stmdb sp!,{r4-r11} - vstmdb sp!,{d8-d15} @ ABI specification says so - ldmia ip,{r4-r5} @ load rest of parameter block - mov ip,sp - - cmp $num,#8 - bhi .LNEON_8n - - @ special case for $num==8, everything is in register bank... - - vld1.32 {${Bi}[0]}, [$bptr,:32]! - veor $zero,$zero,$zero - sub $toutptr,sp,$num,lsl#4 - vld1.32 {$A0-$A3}, [$aptr]! @ can't specify :32 :-( - and $toutptr,$toutptr,#-64 - vld1.32 {${M0}[0]}, [$n0,:32] - mov sp,$toutptr @ alloca - vzip.16 $Bi,$zero - - vmull.u32 @ACC[0],$Bi,${A0}[0] - vmull.u32 @ACC[1],$Bi,${A0}[1] - vmull.u32 @ACC[2],$Bi,${A1}[0] - vshl.i64 $Ni,@ACC[0]#hi,#16 - vmull.u32 @ACC[3],$Bi,${A1}[1] - - vadd.u64 $Ni,$Ni,@ACC[0]#lo - veor $zero,$zero,$zero - vmul.u32 $Ni,$Ni,$M0 - - vmull.u32 @ACC[4],$Bi,${A2}[0] - vld1.32 {$N0-$N3}, [$nptr]! - vmull.u32 @ACC[5],$Bi,${A2}[1] - vmull.u32 @ACC[6],$Bi,${A3}[0] - vzip.16 $Ni,$zero - vmull.u32 @ACC[7],$Bi,${A3}[1] - - vmlal.u32 @ACC[0],$Ni,${N0}[0] - sub $outer,$num,#1 - vmlal.u32 @ACC[1],$Ni,${N0}[1] - vmlal.u32 @ACC[2],$Ni,${N1}[0] - vmlal.u32 @ACC[3],$Ni,${N1}[1] - - vmlal.u32 @ACC[4],$Ni,${N2}[0] - vmov $Temp,@ACC[0] - vmlal.u32 @ACC[5],$Ni,${N2}[1] - vmov @ACC[0],@ACC[1] - vmlal.u32 @ACC[6],$Ni,${N3}[0] - vmov @ACC[1],@ACC[2] - vmlal.u32 @ACC[7],$Ni,${N3}[1] - vmov @ACC[2],@ACC[3] - vmov @ACC[3],@ACC[4] - vshr.u64 $temp,$temp,#16 - vmov @ACC[4],@ACC[5] - vmov @ACC[5],@ACC[6] - vadd.u64 $temp,$temp,$Temp#hi - vmov @ACC[6],@ACC[7] - veor @ACC[7],@ACC[7] - vshr.u64 $temp,$temp,#16 - - b .LNEON_outer8 - -.align 4 -.LNEON_outer8: - vld1.32 {${Bi}[0]}, [$bptr,:32]! - veor $zero,$zero,$zero - vzip.16 $Bi,$zero - vadd.u64 @ACC[0]#lo,@ACC[0]#lo,$temp - - vmlal.u32 @ACC[0],$Bi,${A0}[0] - vmlal.u32 @ACC[1],$Bi,${A0}[1] - vmlal.u32 @ACC[2],$Bi,${A1}[0] - vshl.i64 $Ni,@ACC[0]#hi,#16 - vmlal.u32 @ACC[3],$Bi,${A1}[1] - - vadd.u64 $Ni,$Ni,@ACC[0]#lo - veor $zero,$zero,$zero - subs $outer,$outer,#1 - vmul.u32 $Ni,$Ni,$M0 - - vmlal.u32 @ACC[4],$Bi,${A2}[0] - vmlal.u32 @ACC[5],$Bi,${A2}[1] - vmlal.u32 @ACC[6],$Bi,${A3}[0] - vzip.16 $Ni,$zero - vmlal.u32 @ACC[7],$Bi,${A3}[1] - - vmlal.u32 @ACC[0],$Ni,${N0}[0] - vmlal.u32 @ACC[1],$Ni,${N0}[1] - vmlal.u32 @ACC[2],$Ni,${N1}[0] - vmlal.u32 @ACC[3],$Ni,${N1}[1] - - vmlal.u32 @ACC[4],$Ni,${N2}[0] - vmov $Temp,@ACC[0] - vmlal.u32 @ACC[5],$Ni,${N2}[1] - vmov @ACC[0],@ACC[1] - vmlal.u32 @ACC[6],$Ni,${N3}[0] - vmov @ACC[1],@ACC[2] - vmlal.u32 @ACC[7],$Ni,${N3}[1] - vmov @ACC[2],@ACC[3] - vmov @ACC[3],@ACC[4] - vshr.u64 $temp,$temp,#16 - vmov @ACC[4],@ACC[5] - vmov @ACC[5],@ACC[6] - vadd.u64 $temp,$temp,$Temp#hi - vmov @ACC[6],@ACC[7] - veor @ACC[7],@ACC[7] - vshr.u64 $temp,$temp,#16 - - bne .LNEON_outer8 - - vadd.u64 @ACC[0]#lo,@ACC[0]#lo,$temp - mov $toutptr,sp - vshr.u64 $temp,@ACC[0]#lo,#16 - mov $inner,$num - vadd.u64 @ACC[0]#hi,@ACC[0]#hi,$temp - add $tinptr,sp,#96 - vshr.u64 $temp,@ACC[0]#hi,#16 - vzip.16 @ACC[0]#lo,@ACC[0]#hi - - b .LNEON_tail_entry - -.align 4 -.LNEON_8n: - veor @ACC[0],@ACC[0],@ACC[0] - sub $toutptr,sp,#128 - veor @ACC[1],@ACC[1],@ACC[1] - sub $toutptr,$toutptr,$num,lsl#4 - veor @ACC[2],@ACC[2],@ACC[2] - and $toutptr,$toutptr,#-64 - veor @ACC[3],@ACC[3],@ACC[3] - mov sp,$toutptr @ alloca - veor @ACC[4],@ACC[4],@ACC[4] - add $toutptr,$toutptr,#256 - veor @ACC[5],@ACC[5],@ACC[5] - sub $inner,$num,#8 - veor @ACC[6],@ACC[6],@ACC[6] - veor @ACC[7],@ACC[7],@ACC[7] - -.LNEON_8n_init: - vst1.64 {@ACC[0]-@ACC[1]},[$toutptr,:256]! - subs $inner,$inner,#8 - vst1.64 {@ACC[2]-@ACC[3]},[$toutptr,:256]! - vst1.64 {@ACC[4]-@ACC[5]},[$toutptr,:256]! - vst1.64 {@ACC[6]-@ACC[7]},[$toutptr,:256]! - bne .LNEON_8n_init - - add $tinptr,sp,#256 - vld1.32 {$A0-$A3},[$aptr]! - add $bnptr,sp,#8 - vld1.32 {${M0}[0]},[$n0,:32] - mov $outer,$num - b .LNEON_8n_outer - -.align 4 -.LNEON_8n_outer: - vld1.32 {${Bi}[0]},[$bptr,:32]! @ *b++ - veor $zero,$zero,$zero - vzip.16 $Bi,$zero - add $toutptr,sp,#128 - vld1.32 {$N0-$N3},[$nptr]! - - vmlal.u32 @ACC[0],$Bi,${A0}[0] - vmlal.u32 @ACC[1],$Bi,${A0}[1] - veor $zero,$zero,$zero - vmlal.u32 @ACC[2],$Bi,${A1}[0] - vshl.i64 $Ni,@ACC[0]#hi,#16 - vmlal.u32 @ACC[3],$Bi,${A1}[1] - vadd.u64 $Ni,$Ni,@ACC[0]#lo - vmlal.u32 @ACC[4],$Bi,${A2}[0] - vmul.u32 $Ni,$Ni,$M0 - vmlal.u32 @ACC[5],$Bi,${A2}[1] - vst1.32 {$Bi},[sp,:64] @ put aside smashed b[8*i+0] - vmlal.u32 @ACC[6],$Bi,${A3}[0] - vzip.16 $Ni,$zero - vmlal.u32 @ACC[7],$Bi,${A3}[1] -___ -for ($i=0; $i<7;) { -$code.=<<___; - vld1.32 {${Bi}[0]},[$bptr,:32]! @ *b++ - vmlal.u32 @ACC[0],$Ni,${N0}[0] - veor $temp,$temp,$temp - vmlal.u32 @ACC[1],$Ni,${N0}[1] - vzip.16 $Bi,$temp - vmlal.u32 @ACC[2],$Ni,${N1}[0] - vshr.u64 @ACC[0]#lo,@ACC[0]#lo,#16 - vmlal.u32 @ACC[3],$Ni,${N1}[1] - vmlal.u32 @ACC[4],$Ni,${N2}[0] - vadd.u64 @ACC[0]#lo,@ACC[0]#lo,@ACC[0]#hi - vmlal.u32 @ACC[5],$Ni,${N2}[1] - vshr.u64 @ACC[0]#lo,@ACC[0]#lo,#16 - vmlal.u32 @ACC[6],$Ni,${N3}[0] - vmlal.u32 @ACC[7],$Ni,${N3}[1] - vadd.u64 @ACC[1]#lo,@ACC[1]#lo,@ACC[0]#lo - vst1.32 {$Ni},[$bnptr,:64]! @ put aside smashed m[8*i+$i] -___ - push(@ACC,shift(@ACC)); $i++; -$code.=<<___; - vmlal.u32 @ACC[0],$Bi,${A0}[0] - vld1.64 {@ACC[7]},[$tinptr,:128]! - vmlal.u32 @ACC[1],$Bi,${A0}[1] - veor $zero,$zero,$zero - vmlal.u32 @ACC[2],$Bi,${A1}[0] - vshl.i64 $Ni,@ACC[0]#hi,#16 - vmlal.u32 @ACC[3],$Bi,${A1}[1] - vadd.u64 $Ni,$Ni,@ACC[0]#lo - vmlal.u32 @ACC[4],$Bi,${A2}[0] - vmul.u32 $Ni,$Ni,$M0 - vmlal.u32 @ACC[5],$Bi,${A2}[1] - vst1.32 {$Bi},[$bnptr,:64]! @ put aside smashed b[8*i+$i] - vmlal.u32 @ACC[6],$Bi,${A3}[0] - vzip.16 $Ni,$zero - vmlal.u32 @ACC[7],$Bi,${A3}[1] -___ -} -$code.=<<___; - vld1.32 {$Bi},[sp,:64] @ pull smashed b[8*i+0] - vmlal.u32 @ACC[0],$Ni,${N0}[0] - vld1.32 {$A0-$A3},[$aptr]! - vmlal.u32 @ACC[1],$Ni,${N0}[1] - vmlal.u32 @ACC[2],$Ni,${N1}[0] - vshr.u64 @ACC[0]#lo,@ACC[0]#lo,#16 - vmlal.u32 @ACC[3],$Ni,${N1}[1] - vmlal.u32 @ACC[4],$Ni,${N2}[0] - vadd.u64 @ACC[0]#lo,@ACC[0]#lo,@ACC[0]#hi - vmlal.u32 @ACC[5],$Ni,${N2}[1] - vshr.u64 @ACC[0]#lo,@ACC[0]#lo,#16 - vmlal.u32 @ACC[6],$Ni,${N3}[0] - vmlal.u32 @ACC[7],$Ni,${N3}[1] - vadd.u64 @ACC[1]#lo,@ACC[1]#lo,@ACC[0]#lo - vst1.32 {$Ni},[$bnptr,:64] @ put aside smashed m[8*i+$i] - add $bnptr,sp,#8 @ rewind -___ - push(@ACC,shift(@ACC)); -$code.=<<___; - sub $inner,$num,#8 - b .LNEON_8n_inner - -.align 4 -.LNEON_8n_inner: - subs $inner,$inner,#8 - vmlal.u32 @ACC[0],$Bi,${A0}[0] - vld1.64 {@ACC[7]},[$tinptr,:128] - vmlal.u32 @ACC[1],$Bi,${A0}[1] - vld1.32 {$Ni},[$bnptr,:64]! @ pull smashed m[8*i+0] - vmlal.u32 @ACC[2],$Bi,${A1}[0] - vld1.32 {$N0-$N3},[$nptr]! - vmlal.u32 @ACC[3],$Bi,${A1}[1] - it ne - addne $tinptr,$tinptr,#16 @ don't advance in last iteration - vmlal.u32 @ACC[4],$Bi,${A2}[0] - vmlal.u32 @ACC[5],$Bi,${A2}[1] - vmlal.u32 @ACC[6],$Bi,${A3}[0] - vmlal.u32 @ACC[7],$Bi,${A3}[1] -___ -for ($i=1; $i<8; $i++) { -$code.=<<___; - vld1.32 {$Bi},[$bnptr,:64]! @ pull smashed b[8*i+$i] - vmlal.u32 @ACC[0],$Ni,${N0}[0] - vmlal.u32 @ACC[1],$Ni,${N0}[1] - vmlal.u32 @ACC[2],$Ni,${N1}[0] - vmlal.u32 @ACC[3],$Ni,${N1}[1] - vmlal.u32 @ACC[4],$Ni,${N2}[0] - vmlal.u32 @ACC[5],$Ni,${N2}[1] - vmlal.u32 @ACC[6],$Ni,${N3}[0] - vmlal.u32 @ACC[7],$Ni,${N3}[1] - vst1.64 {@ACC[0]},[$toutptr,:128]! -___ - push(@ACC,shift(@ACC)); -$code.=<<___; - vmlal.u32 @ACC[0],$Bi,${A0}[0] - vld1.64 {@ACC[7]},[$tinptr,:128] - vmlal.u32 @ACC[1],$Bi,${A0}[1] - vld1.32 {$Ni},[$bnptr,:64]! @ pull smashed m[8*i+$i] - vmlal.u32 @ACC[2],$Bi,${A1}[0] - it ne - addne $tinptr,$tinptr,#16 @ don't advance in last iteration - vmlal.u32 @ACC[3],$Bi,${A1}[1] - vmlal.u32 @ACC[4],$Bi,${A2}[0] - vmlal.u32 @ACC[5],$Bi,${A2}[1] - vmlal.u32 @ACC[6],$Bi,${A3}[0] - vmlal.u32 @ACC[7],$Bi,${A3}[1] -___ -} -$code.=<<___; - it eq - subeq $aptr,$aptr,$num,lsl#2 @ rewind - vmlal.u32 @ACC[0],$Ni,${N0}[0] - vld1.32 {$Bi},[sp,:64] @ pull smashed b[8*i+0] - vmlal.u32 @ACC[1],$Ni,${N0}[1] - vld1.32 {$A0-$A3},[$aptr]! - vmlal.u32 @ACC[2],$Ni,${N1}[0] - add $bnptr,sp,#8 @ rewind - vmlal.u32 @ACC[3],$Ni,${N1}[1] - vmlal.u32 @ACC[4],$Ni,${N2}[0] - vmlal.u32 @ACC[5],$Ni,${N2}[1] - vmlal.u32 @ACC[6],$Ni,${N3}[0] - vst1.64 {@ACC[0]},[$toutptr,:128]! - vmlal.u32 @ACC[7],$Ni,${N3}[1] - - bne .LNEON_8n_inner -___ - push(@ACC,shift(@ACC)); -$code.=<<___; - add $tinptr,sp,#128 - vst1.64 {@ACC[0]-@ACC[1]},[$toutptr,:256]! - veor q2,q2,q2 @ $N0-$N1 - vst1.64 {@ACC[2]-@ACC[3]},[$toutptr,:256]! - veor q3,q3,q3 @ $N2-$N3 - vst1.64 {@ACC[4]-@ACC[5]},[$toutptr,:256]! - vst1.64 {@ACC[6]},[$toutptr,:128] - - subs $outer,$outer,#8 - vld1.64 {@ACC[0]-@ACC[1]},[$tinptr,:256]! - vld1.64 {@ACC[2]-@ACC[3]},[$tinptr,:256]! - vld1.64 {@ACC[4]-@ACC[5]},[$tinptr,:256]! - vld1.64 {@ACC[6]-@ACC[7]},[$tinptr,:256]! - - itt ne - subne $nptr,$nptr,$num,lsl#2 @ rewind - bne .LNEON_8n_outer - - add $toutptr,sp,#128 - vst1.64 {q2-q3}, [sp,:256]! @ start wiping stack frame - vshr.u64 $temp,@ACC[0]#lo,#16 - vst1.64 {q2-q3},[sp,:256]! - vadd.u64 @ACC[0]#hi,@ACC[0]#hi,$temp - vst1.64 {q2-q3}, [sp,:256]! - vshr.u64 $temp,@ACC[0]#hi,#16 - vst1.64 {q2-q3}, [sp,:256]! - vzip.16 @ACC[0]#lo,@ACC[0]#hi - - mov $inner,$num - b .LNEON_tail_entry - -.align 4 -.LNEON_tail: - vadd.u64 @ACC[0]#lo,@ACC[0]#lo,$temp - vshr.u64 $temp,@ACC[0]#lo,#16 - vld1.64 {@ACC[2]-@ACC[3]}, [$tinptr, :256]! - vadd.u64 @ACC[0]#hi,@ACC[0]#hi,$temp - vld1.64 {@ACC[4]-@ACC[5]}, [$tinptr, :256]! - vshr.u64 $temp,@ACC[0]#hi,#16 - vld1.64 {@ACC[6]-@ACC[7]}, [$tinptr, :256]! - vzip.16 @ACC[0]#lo,@ACC[0]#hi - -.LNEON_tail_entry: -___ -for ($i=1; $i<8; $i++) { -$code.=<<___; - vadd.u64 @ACC[1]#lo,@ACC[1]#lo,$temp - vst1.32 {@ACC[0]#lo[0]}, [$toutptr, :32]! - vshr.u64 $temp,@ACC[1]#lo,#16 - vadd.u64 @ACC[1]#hi,@ACC[1]#hi,$temp - vshr.u64 $temp,@ACC[1]#hi,#16 - vzip.16 @ACC[1]#lo,@ACC[1]#hi -___ - push(@ACC,shift(@ACC)); -} - push(@ACC,shift(@ACC)); -$code.=<<___; - vld1.64 {@ACC[0]-@ACC[1]}, [$tinptr, :256]! - subs $inner,$inner,#8 - vst1.32 {@ACC[7]#lo[0]}, [$toutptr, :32]! - bne .LNEON_tail - - vst1.32 {${temp}[0]}, [$toutptr, :32] @ top-most bit - sub $nptr,$nptr,$num,lsl#2 @ rewind $nptr - subs $aptr,sp,#0 @ clear carry flag - add $bptr,sp,$num,lsl#2 - -.LNEON_sub: - ldmia $aptr!, {r4-r7} - ldmia $nptr!, {r8-r11} - sbcs r8, r4,r8 - sbcs r9, r5,r9 - sbcs r10,r6,r10 - sbcs r11,r7,r11 - teq $aptr,$bptr @ preserves carry - stmia $rptr!, {r8-r11} - bne .LNEON_sub - - ldr r10, [$aptr] @ load top-most bit - mov r11,sp - veor q0,q0,q0 - sub r11,$bptr,r11 @ this is num*4 - veor q1,q1,q1 - mov $aptr,sp - sub $rptr,$rptr,r11 @ rewind $rptr - mov $nptr,$bptr @ second 3/4th of frame - sbcs r10,r10,#0 @ result is carry flag - -.LNEON_copy_n_zap: - ldmia $aptr!, {r4-r7} - ldmia $rptr, {r8-r11} - it cc - movcc r8, r4 - vst1.64 {q0-q1}, [$nptr,:256]! @ wipe - itt cc - movcc r9, r5 - movcc r10,r6 - vst1.64 {q0-q1}, [$nptr,:256]! @ wipe - it cc - movcc r11,r7 - ldmia $aptr, {r4-r7} - stmia $rptr!, {r8-r11} - sub $aptr,$aptr,#16 - ldmia $rptr, {r8-r11} - it cc - movcc r8, r4 - vst1.64 {q0-q1}, [$aptr,:256]! @ wipe - itt cc - movcc r9, r5 - movcc r10,r6 - vst1.64 {q0-q1}, [$nptr,:256]! @ wipe - it cc - movcc r11,r7 - teq $aptr,$bptr @ preserves carry - stmia $rptr!, {r8-r11} - bne .LNEON_copy_n_zap - - mov sp,ip - vldmia sp!,{d8-d15} - ldmia sp!,{r4-r11} - ret @ bx lr -.size bn_mul8x_mont_neon,.-bn_mul8x_mont_neon -#endif -___ -} -$code.=<<___; -.asciz "Montgomery multiplication for ARMv4/NEON, CRYPTOGAMS by " -___ - -foreach (split("\n",$code)) { - s/\`([^\`]*)\`/eval $1/ge; - - s/\bq([0-9]+)#(lo|hi)/sprintf "d%d",2*$1+($2 eq "hi")/ge or - s/\bret\b/bx lr/g or - s/\bbx\s+lr\b/.word\t0xe12fff1e/g; # make it possible to compile with -march=armv4 - - print $_,"\n"; -} - -close STDOUT or die "error closing STDOUT"; diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/bn/asm/armv8-mont.pl temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/bn/asm/armv8-mont.pl --- temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/bn/asm/armv8-mont.pl 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/bn/asm/armv8-mont.pl 1970-01-01 00:00:00.000000000 +0000 @@ -1,1523 +0,0 @@ -#! /usr/bin/env perl -# Copyright 2015-2016 The OpenSSL Project Authors. All Rights Reserved. -# -# Licensed under the OpenSSL license (the "License"). You may not use -# this file except in compliance with the License. You can obtain a copy -# in the file LICENSE in the source distribution or at -# https://www.openssl.org/source/license.html - - -# ==================================================================== -# Written by Andy Polyakov for the OpenSSL -# project. The module is, however, dual licensed under OpenSSL and -# CRYPTOGAMS licenses depending on where you obtain it. For further -# details see http://www.openssl.org/~appro/cryptogams/. -# ==================================================================== - -# March 2015 -# -# "Teaser" Montgomery multiplication module for ARMv8. Needs more -# work. While it does improve RSA sign performance by 20-30% (less for -# longer keys) on most processors, for some reason RSA2048 is not -# faster and RSA4096 goes 15-20% slower on Cortex-A57. Multiplication -# instruction issue rate is limited on processor in question, meaning -# that dedicated squaring procedure is a must. Well, actually all -# contemporary AArch64 processors seem to have limited multiplication -# issue rate, i.e. they can't issue multiplication every cycle, which -# explains moderate improvement coefficients in comparison to -# compiler-generated code. Recall that compiler is instructed to use -# umulh and therefore uses same amount of multiplication instructions -# to do the job. Assembly's edge is to minimize number of "collateral" -# instructions and of course instruction scheduling. -# -# April 2015 -# -# Squaring procedure that handles lengths divisible by 8 improves -# RSA/DSA performance by 25-40-60% depending on processor and key -# length. Overall improvement coefficients are always positive in -# comparison to compiler-generated code. On Cortex-A57 improvement -# is still modest on longest key lengths, while others exhibit e.g. -# 50-70% improvement for RSA4096 sign. RSA2048 sign is ~25% faster -# on Cortex-A57 and ~60-100% faster on others. - -$flavour = shift; -$output = shift; - -$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; -( $xlate="${dir}arm-xlate.pl" and -f $xlate ) or -( $xlate="${dir}../../../perlasm/arm-xlate.pl" and -f $xlate) or -die "can't locate arm-xlate.pl"; - -open OUT,"| \"$^X\" $xlate $flavour $output"; -*STDOUT=*OUT; - -($lo0,$hi0,$aj,$m0,$alo,$ahi, - $lo1,$hi1,$nj,$m1,$nlo,$nhi, - $ovf, $i,$j,$tp,$tj) = map("x$_",6..17,19..24); - -# int GFp_bn_mul_mont( -$rp="x0"; # BN_ULONG *rp, -$ap="x1"; # const BN_ULONG *ap, -$bp="x2"; # const BN_ULONG *bp, -$np="x3"; # const BN_ULONG *np, -$n0="x4"; # const BN_ULONG *n0, -$num="x5"; # size_t num); - -$code.=<<___; -#include - -.text - -.globl GFp_bn_mul_mont -.type GFp_bn_mul_mont,%function -.align 5 -GFp_bn_mul_mont: - AARCH64_SIGN_LINK_REGISTER - tst $num,#7 - b.eq __bn_sqr8x_mont - tst $num,#3 - b.eq __bn_mul4x_mont -.Lmul_mont: - stp x29,x30,[sp,#-64]! - add x29,sp,#0 - stp x19,x20,[sp,#16] - stp x21,x22,[sp,#32] - stp x23,x24,[sp,#48] - - ldr $m0,[$bp],#8 // bp[0] - sub $tp,sp,$num,lsl#3 - ldp $hi0,$aj,[$ap],#16 // ap[0..1] - lsl $num,$num,#3 - ldr $n0,[$n0] // *n0 - and $tp,$tp,#-16 // ABI says so - ldp $hi1,$nj,[$np],#16 // np[0..1] - - mul $lo0,$hi0,$m0 // ap[0]*bp[0] - sub $j,$num,#16 // j=num-2 - umulh $hi0,$hi0,$m0 - mul $alo,$aj,$m0 // ap[1]*bp[0] - umulh $ahi,$aj,$m0 - - mul $m1,$lo0,$n0 // "tp[0]"*n0 - mov sp,$tp // alloca - - // (*) mul $lo1,$hi1,$m1 // np[0]*m1 - umulh $hi1,$hi1,$m1 - mul $nlo,$nj,$m1 // np[1]*m1 - // (*) adds $lo1,$lo1,$lo0 // discarded - // (*) As for removal of first multiplication and addition - // instructions. The outcome of first addition is - // guaranteed to be zero, which leaves two computationally - // significant outcomes: it either carries or not. Then - // question is when does it carry? Is there alternative - // way to deduce it? If you follow operations, you can - // observe that condition for carry is quite simple: - // $lo0 being non-zero. So that carry can be calculated - // by adding -1 to $lo0. That's what next instruction does. - subs xzr,$lo0,#1 // (*) - umulh $nhi,$nj,$m1 - adc $hi1,$hi1,xzr - cbz $j,.L1st_skip - -.L1st: - ldr $aj,[$ap],#8 - adds $lo0,$alo,$hi0 - sub $j,$j,#8 // j-- - adc $hi0,$ahi,xzr - - ldr $nj,[$np],#8 - adds $lo1,$nlo,$hi1 - mul $alo,$aj,$m0 // ap[j]*bp[0] - adc $hi1,$nhi,xzr - umulh $ahi,$aj,$m0 - - adds $lo1,$lo1,$lo0 - mul $nlo,$nj,$m1 // np[j]*m1 - adc $hi1,$hi1,xzr - umulh $nhi,$nj,$m1 - str $lo1,[$tp],#8 // tp[j-1] - cbnz $j,.L1st - -.L1st_skip: - adds $lo0,$alo,$hi0 - sub $ap,$ap,$num // rewind $ap - adc $hi0,$ahi,xzr - - adds $lo1,$nlo,$hi1 - sub $np,$np,$num // rewind $np - adc $hi1,$nhi,xzr - - adds $lo1,$lo1,$lo0 - sub $i,$num,#8 // i=num-1 - adcs $hi1,$hi1,$hi0 - - adc $ovf,xzr,xzr // upmost overflow bit - stp $lo1,$hi1,[$tp] - -.Louter: - ldr $m0,[$bp],#8 // bp[i] - ldp $hi0,$aj,[$ap],#16 - ldr $tj,[sp] // tp[0] - add $tp,sp,#8 - - mul $lo0,$hi0,$m0 // ap[0]*bp[i] - sub $j,$num,#16 // j=num-2 - umulh $hi0,$hi0,$m0 - ldp $hi1,$nj,[$np],#16 - mul $alo,$aj,$m0 // ap[1]*bp[i] - adds $lo0,$lo0,$tj - umulh $ahi,$aj,$m0 - adc $hi0,$hi0,xzr - - mul $m1,$lo0,$n0 - sub $i,$i,#8 // i-- - - // (*) mul $lo1,$hi1,$m1 // np[0]*m1 - umulh $hi1,$hi1,$m1 - mul $nlo,$nj,$m1 // np[1]*m1 - // (*) adds $lo1,$lo1,$lo0 - subs xzr,$lo0,#1 // (*) - umulh $nhi,$nj,$m1 - cbz $j,.Linner_skip - -.Linner: - ldr $aj,[$ap],#8 - adc $hi1,$hi1,xzr - ldr $tj,[$tp],#8 // tp[j] - adds $lo0,$alo,$hi0 - sub $j,$j,#8 // j-- - adc $hi0,$ahi,xzr - - adds $lo1,$nlo,$hi1 - ldr $nj,[$np],#8 - adc $hi1,$nhi,xzr - - mul $alo,$aj,$m0 // ap[j]*bp[i] - adds $lo0,$lo0,$tj - umulh $ahi,$aj,$m0 - adc $hi0,$hi0,xzr - - mul $nlo,$nj,$m1 // np[j]*m1 - adds $lo1,$lo1,$lo0 - umulh $nhi,$nj,$m1 - str $lo1,[$tp,#-16] // tp[j-1] - cbnz $j,.Linner - -.Linner_skip: - ldr $tj,[$tp],#8 // tp[j] - adc $hi1,$hi1,xzr - adds $lo0,$alo,$hi0 - sub $ap,$ap,$num // rewind $ap - adc $hi0,$ahi,xzr - - adds $lo1,$nlo,$hi1 - sub $np,$np,$num // rewind $np - adcs $hi1,$nhi,$ovf - adc $ovf,xzr,xzr - - adds $lo0,$lo0,$tj - adc $hi0,$hi0,xzr - - adds $lo1,$lo1,$lo0 - adcs $hi1,$hi1,$hi0 - adc $ovf,$ovf,xzr // upmost overflow bit - stp $lo1,$hi1,[$tp,#-16] - - cbnz $i,.Louter - - // Final step. We see if result is larger than modulus, and - // if it is, subtract the modulus. But comparison implies - // subtraction. So we subtract modulus, see if it borrowed, - // and conditionally copy original value. - ldr $tj,[sp] // tp[0] - add $tp,sp,#8 - ldr $nj,[$np],#8 // np[0] - subs $j,$num,#8 // j=num-1 and clear borrow - mov $ap,$rp -.Lsub: - sbcs $aj,$tj,$nj // tp[j]-np[j] - ldr $tj,[$tp],#8 - sub $j,$j,#8 // j-- - ldr $nj,[$np],#8 - str $aj,[$ap],#8 // rp[j]=tp[j]-np[j] - cbnz $j,.Lsub - - sbcs $aj,$tj,$nj - sbcs $ovf,$ovf,xzr // did it borrow? - str $aj,[$ap],#8 // rp[num-1] - - ldr $tj,[sp] // tp[0] - add $tp,sp,#8 - ldr $aj,[$rp],#8 // rp[0] - sub $num,$num,#8 // num-- - nop -.Lcond_copy: - sub $num,$num,#8 // num-- - csel $nj,$tj,$aj,lo // did it borrow? - ldr $tj,[$tp],#8 - ldr $aj,[$rp],#8 - str xzr,[$tp,#-16] // wipe tp - str $nj,[$rp,#-16] - cbnz $num,.Lcond_copy - - csel $nj,$tj,$aj,lo - str xzr,[$tp,#-8] // wipe tp - str $nj,[$rp,#-8] - - ldp x19,x20,[x29,#16] - mov sp,x29 - ldp x21,x22,[x29,#32] - mov x0,#1 - ldp x23,x24,[x29,#48] - ldr x29,[sp],#64 - AARCH64_VALIDATE_LINK_REGISTER - ret -.size GFp_bn_mul_mont,.-GFp_bn_mul_mont -___ -{ -######################################################################## -# Following is ARMv8 adaptation of sqrx8x_mont from x86_64-mont5 module. - -my ($a0,$a1,$a2,$a3,$a4,$a5,$a6,$a7)=map("x$_",(6..13)); -my ($t0,$t1,$t2,$t3)=map("x$_",(14..17)); -my ($acc0,$acc1,$acc2,$acc3,$acc4,$acc5,$acc6,$acc7)=map("x$_",(19..26)); -my ($cnt,$carry,$topmost)=("x27","x28","x30"); -my ($tp,$ap_end,$na0)=($bp,$np,$carry); - -$code.=<<___; -.type __bn_sqr8x_mont,%function -.align 5 -__bn_sqr8x_mont: - // Not adding AARCH64_SIGN_LINK_REGISTER here because __bn_sqr8x_mont is jumped to - // only from bn_mul_mont which has already signed the return address. - cmp $ap,$bp - b.ne __bn_mul4x_mont -.Lsqr8x_mont: - stp x29,x30,[sp,#-128]! - add x29,sp,#0 - stp x19,x20,[sp,#16] - stp x21,x22,[sp,#32] - stp x23,x24,[sp,#48] - stp x25,x26,[sp,#64] - stp x27,x28,[sp,#80] - stp $rp,$np,[sp,#96] // offload rp and np - - ldp $a0,$a1,[$ap,#8*0] - ldp $a2,$a3,[$ap,#8*2] - ldp $a4,$a5,[$ap,#8*4] - ldp $a6,$a7,[$ap,#8*6] - - sub $tp,sp,$num,lsl#4 - lsl $num,$num,#3 - ldr $n0,[$n0] // *n0 - mov sp,$tp // alloca - sub $cnt,$num,#8*8 - b .Lsqr8x_zero_start - -.Lsqr8x_zero: - sub $cnt,$cnt,#8*8 - stp xzr,xzr,[$tp,#8*0] - stp xzr,xzr,[$tp,#8*2] - stp xzr,xzr,[$tp,#8*4] - stp xzr,xzr,[$tp,#8*6] -.Lsqr8x_zero_start: - stp xzr,xzr,[$tp,#8*8] - stp xzr,xzr,[$tp,#8*10] - stp xzr,xzr,[$tp,#8*12] - stp xzr,xzr,[$tp,#8*14] - add $tp,$tp,#8*16 - cbnz $cnt,.Lsqr8x_zero - - add $ap_end,$ap,$num - add $ap,$ap,#8*8 - mov $acc0,xzr - mov $acc1,xzr - mov $acc2,xzr - mov $acc3,xzr - mov $acc4,xzr - mov $acc5,xzr - mov $acc6,xzr - mov $acc7,xzr - mov $tp,sp - str $n0,[x29,#112] // offload n0 - - // Multiply everything but a[i]*a[i] -.align 4 -.Lsqr8x_outer_loop: - // a[1]a[0] (i) - // a[2]a[0] - // a[3]a[0] - // a[4]a[0] - // a[5]a[0] - // a[6]a[0] - // a[7]a[0] - // a[2]a[1] (ii) - // a[3]a[1] - // a[4]a[1] - // a[5]a[1] - // a[6]a[1] - // a[7]a[1] - // a[3]a[2] (iii) - // a[4]a[2] - // a[5]a[2] - // a[6]a[2] - // a[7]a[2] - // a[4]a[3] (iv) - // a[5]a[3] - // a[6]a[3] - // a[7]a[3] - // a[5]a[4] (v) - // a[6]a[4] - // a[7]a[4] - // a[6]a[5] (vi) - // a[7]a[5] - // a[7]a[6] (vii) - - mul $t0,$a1,$a0 // lo(a[1..7]*a[0]) (i) - mul $t1,$a2,$a0 - mul $t2,$a3,$a0 - mul $t3,$a4,$a0 - adds $acc1,$acc1,$t0 // t[1]+lo(a[1]*a[0]) - mul $t0,$a5,$a0 - adcs $acc2,$acc2,$t1 - mul $t1,$a6,$a0 - adcs $acc3,$acc3,$t2 - mul $t2,$a7,$a0 - adcs $acc4,$acc4,$t3 - umulh $t3,$a1,$a0 // hi(a[1..7]*a[0]) - adcs $acc5,$acc5,$t0 - umulh $t0,$a2,$a0 - adcs $acc6,$acc6,$t1 - umulh $t1,$a3,$a0 - adcs $acc7,$acc7,$t2 - umulh $t2,$a4,$a0 - stp $acc0,$acc1,[$tp],#8*2 // t[0..1] - adc $acc0,xzr,xzr // t[8] - adds $acc2,$acc2,$t3 // t[2]+lo(a[1]*a[0]) - umulh $t3,$a5,$a0 - adcs $acc3,$acc3,$t0 - umulh $t0,$a6,$a0 - adcs $acc4,$acc4,$t1 - umulh $t1,$a7,$a0 - adcs $acc5,$acc5,$t2 - mul $t2,$a2,$a1 // lo(a[2..7]*a[1]) (ii) - adcs $acc6,$acc6,$t3 - mul $t3,$a3,$a1 - adcs $acc7,$acc7,$t0 - mul $t0,$a4,$a1 - adc $acc0,$acc0,$t1 - - mul $t1,$a5,$a1 - adds $acc3,$acc3,$t2 - mul $t2,$a6,$a1 - adcs $acc4,$acc4,$t3 - mul $t3,$a7,$a1 - adcs $acc5,$acc5,$t0 - umulh $t0,$a2,$a1 // hi(a[2..7]*a[1]) - adcs $acc6,$acc6,$t1 - umulh $t1,$a3,$a1 - adcs $acc7,$acc7,$t2 - umulh $t2,$a4,$a1 - adcs $acc0,$acc0,$t3 - umulh $t3,$a5,$a1 - stp $acc2,$acc3,[$tp],#8*2 // t[2..3] - adc $acc1,xzr,xzr // t[9] - adds $acc4,$acc4,$t0 - umulh $t0,$a6,$a1 - adcs $acc5,$acc5,$t1 - umulh $t1,$a7,$a1 - adcs $acc6,$acc6,$t2 - mul $t2,$a3,$a2 // lo(a[3..7]*a[2]) (iii) - adcs $acc7,$acc7,$t3 - mul $t3,$a4,$a2 - adcs $acc0,$acc0,$t0 - mul $t0,$a5,$a2 - adc $acc1,$acc1,$t1 - - mul $t1,$a6,$a2 - adds $acc5,$acc5,$t2 - mul $t2,$a7,$a2 - adcs $acc6,$acc6,$t3 - umulh $t3,$a3,$a2 // hi(a[3..7]*a[2]) - adcs $acc7,$acc7,$t0 - umulh $t0,$a4,$a2 - adcs $acc0,$acc0,$t1 - umulh $t1,$a5,$a2 - adcs $acc1,$acc1,$t2 - umulh $t2,$a6,$a2 - stp $acc4,$acc5,[$tp],#8*2 // t[4..5] - adc $acc2,xzr,xzr // t[10] - adds $acc6,$acc6,$t3 - umulh $t3,$a7,$a2 - adcs $acc7,$acc7,$t0 - mul $t0,$a4,$a3 // lo(a[4..7]*a[3]) (iv) - adcs $acc0,$acc0,$t1 - mul $t1,$a5,$a3 - adcs $acc1,$acc1,$t2 - mul $t2,$a6,$a3 - adc $acc2,$acc2,$t3 - - mul $t3,$a7,$a3 - adds $acc7,$acc7,$t0 - umulh $t0,$a4,$a3 // hi(a[4..7]*a[3]) - adcs $acc0,$acc0,$t1 - umulh $t1,$a5,$a3 - adcs $acc1,$acc1,$t2 - umulh $t2,$a6,$a3 - adcs $acc2,$acc2,$t3 - umulh $t3,$a7,$a3 - stp $acc6,$acc7,[$tp],#8*2 // t[6..7] - adc $acc3,xzr,xzr // t[11] - adds $acc0,$acc0,$t0 - mul $t0,$a5,$a4 // lo(a[5..7]*a[4]) (v) - adcs $acc1,$acc1,$t1 - mul $t1,$a6,$a4 - adcs $acc2,$acc2,$t2 - mul $t2,$a7,$a4 - adc $acc3,$acc3,$t3 - - umulh $t3,$a5,$a4 // hi(a[5..7]*a[4]) - adds $acc1,$acc1,$t0 - umulh $t0,$a6,$a4 - adcs $acc2,$acc2,$t1 - umulh $t1,$a7,$a4 - adcs $acc3,$acc3,$t2 - mul $t2,$a6,$a5 // lo(a[6..7]*a[5]) (vi) - adc $acc4,xzr,xzr // t[12] - adds $acc2,$acc2,$t3 - mul $t3,$a7,$a5 - adcs $acc3,$acc3,$t0 - umulh $t0,$a6,$a5 // hi(a[6..7]*a[5]) - adc $acc4,$acc4,$t1 - - umulh $t1,$a7,$a5 - adds $acc3,$acc3,$t2 - mul $t2,$a7,$a6 // lo(a[7]*a[6]) (vii) - adcs $acc4,$acc4,$t3 - umulh $t3,$a7,$a6 // hi(a[7]*a[6]) - adc $acc5,xzr,xzr // t[13] - adds $acc4,$acc4,$t0 - sub $cnt,$ap_end,$ap // done yet? - adc $acc5,$acc5,$t1 - - adds $acc5,$acc5,$t2 - sub $t0,$ap_end,$num // rewinded ap - adc $acc6,xzr,xzr // t[14] - add $acc6,$acc6,$t3 - - cbz $cnt,.Lsqr8x_outer_break - - mov $n0,$a0 - ldp $a0,$a1,[$tp,#8*0] - ldp $a2,$a3,[$tp,#8*2] - ldp $a4,$a5,[$tp,#8*4] - ldp $a6,$a7,[$tp,#8*6] - adds $acc0,$acc0,$a0 - adcs $acc1,$acc1,$a1 - ldp $a0,$a1,[$ap,#8*0] - adcs $acc2,$acc2,$a2 - adcs $acc3,$acc3,$a3 - ldp $a2,$a3,[$ap,#8*2] - adcs $acc4,$acc4,$a4 - adcs $acc5,$acc5,$a5 - ldp $a4,$a5,[$ap,#8*4] - adcs $acc6,$acc6,$a6 - mov $rp,$ap - adcs $acc7,xzr,$a7 - ldp $a6,$a7,[$ap,#8*6] - add $ap,$ap,#8*8 - //adc $carry,xzr,xzr // moved below - mov $cnt,#-8*8 - - // a[8]a[0] - // a[9]a[0] - // a[a]a[0] - // a[b]a[0] - // a[c]a[0] - // a[d]a[0] - // a[e]a[0] - // a[f]a[0] - // a[8]a[1] - // a[f]a[1]........................ - // a[8]a[2] - // a[f]a[2]........................ - // a[8]a[3] - // a[f]a[3]........................ - // a[8]a[4] - // a[f]a[4]........................ - // a[8]a[5] - // a[f]a[5]........................ - // a[8]a[6] - // a[f]a[6]........................ - // a[8]a[7] - // a[f]a[7]........................ -.Lsqr8x_mul: - mul $t0,$a0,$n0 - adc $carry,xzr,xzr // carry bit, modulo-scheduled - mul $t1,$a1,$n0 - add $cnt,$cnt,#8 - mul $t2,$a2,$n0 - mul $t3,$a3,$n0 - adds $acc0,$acc0,$t0 - mul $t0,$a4,$n0 - adcs $acc1,$acc1,$t1 - mul $t1,$a5,$n0 - adcs $acc2,$acc2,$t2 - mul $t2,$a6,$n0 - adcs $acc3,$acc3,$t3 - mul $t3,$a7,$n0 - adcs $acc4,$acc4,$t0 - umulh $t0,$a0,$n0 - adcs $acc5,$acc5,$t1 - umulh $t1,$a1,$n0 - adcs $acc6,$acc6,$t2 - umulh $t2,$a2,$n0 - adcs $acc7,$acc7,$t3 - umulh $t3,$a3,$n0 - adc $carry,$carry,xzr - str $acc0,[$tp],#8 - adds $acc0,$acc1,$t0 - umulh $t0,$a4,$n0 - adcs $acc1,$acc2,$t1 - umulh $t1,$a5,$n0 - adcs $acc2,$acc3,$t2 - umulh $t2,$a6,$n0 - adcs $acc3,$acc4,$t3 - umulh $t3,$a7,$n0 - ldr $n0,[$rp,$cnt] - adcs $acc4,$acc5,$t0 - adcs $acc5,$acc6,$t1 - adcs $acc6,$acc7,$t2 - adcs $acc7,$carry,$t3 - //adc $carry,xzr,xzr // moved above - cbnz $cnt,.Lsqr8x_mul - // note that carry flag is guaranteed - // to be zero at this point - cmp $ap,$ap_end // done yet? - b.eq .Lsqr8x_break - - ldp $a0,$a1,[$tp,#8*0] - ldp $a2,$a3,[$tp,#8*2] - ldp $a4,$a5,[$tp,#8*4] - ldp $a6,$a7,[$tp,#8*6] - adds $acc0,$acc0,$a0 - ldr $n0,[$rp,#-8*8] - adcs $acc1,$acc1,$a1 - ldp $a0,$a1,[$ap,#8*0] - adcs $acc2,$acc2,$a2 - adcs $acc3,$acc3,$a3 - ldp $a2,$a3,[$ap,#8*2] - adcs $acc4,$acc4,$a4 - adcs $acc5,$acc5,$a5 - ldp $a4,$a5,[$ap,#8*4] - adcs $acc6,$acc6,$a6 - mov $cnt,#-8*8 - adcs $acc7,$acc7,$a7 - ldp $a6,$a7,[$ap,#8*6] - add $ap,$ap,#8*8 - //adc $carry,xzr,xzr // moved above - b .Lsqr8x_mul - -.align 4 -.Lsqr8x_break: - ldp $a0,$a1,[$rp,#8*0] - add $ap,$rp,#8*8 - ldp $a2,$a3,[$rp,#8*2] - sub $t0,$ap_end,$ap // is it last iteration? - ldp $a4,$a5,[$rp,#8*4] - sub $t1,$tp,$t0 - ldp $a6,$a7,[$rp,#8*6] - cbz $t0,.Lsqr8x_outer_loop - - stp $acc0,$acc1,[$tp,#8*0] - ldp $acc0,$acc1,[$t1,#8*0] - stp $acc2,$acc3,[$tp,#8*2] - ldp $acc2,$acc3,[$t1,#8*2] - stp $acc4,$acc5,[$tp,#8*4] - ldp $acc4,$acc5,[$t1,#8*4] - stp $acc6,$acc7,[$tp,#8*6] - mov $tp,$t1 - ldp $acc6,$acc7,[$t1,#8*6] - b .Lsqr8x_outer_loop - -.align 4 -.Lsqr8x_outer_break: - // Now multiply above result by 2 and add a[n-1]*a[n-1]|...|a[0]*a[0] - ldp $a1,$a3,[$t0,#8*0] // recall that $t0 is &a[0] - ldp $t1,$t2,[sp,#8*1] - ldp $a5,$a7,[$t0,#8*2] - add $ap,$t0,#8*4 - ldp $t3,$t0,[sp,#8*3] - - stp $acc0,$acc1,[$tp,#8*0] - mul $acc0,$a1,$a1 - stp $acc2,$acc3,[$tp,#8*2] - umulh $a1,$a1,$a1 - stp $acc4,$acc5,[$tp,#8*4] - mul $a2,$a3,$a3 - stp $acc6,$acc7,[$tp,#8*6] - mov $tp,sp - umulh $a3,$a3,$a3 - adds $acc1,$a1,$t1,lsl#1 - extr $t1,$t2,$t1,#63 - sub $cnt,$num,#8*4 - -.Lsqr4x_shift_n_add: - adcs $acc2,$a2,$t1 - extr $t2,$t3,$t2,#63 - sub $cnt,$cnt,#8*4 - adcs $acc3,$a3,$t2 - ldp $t1,$t2,[$tp,#8*5] - mul $a4,$a5,$a5 - ldp $a1,$a3,[$ap],#8*2 - umulh $a5,$a5,$a5 - mul $a6,$a7,$a7 - umulh $a7,$a7,$a7 - extr $t3,$t0,$t3,#63 - stp $acc0,$acc1,[$tp,#8*0] - adcs $acc4,$a4,$t3 - extr $t0,$t1,$t0,#63 - stp $acc2,$acc3,[$tp,#8*2] - adcs $acc5,$a5,$t0 - ldp $t3,$t0,[$tp,#8*7] - extr $t1,$t2,$t1,#63 - adcs $acc6,$a6,$t1 - extr $t2,$t3,$t2,#63 - adcs $acc7,$a7,$t2 - ldp $t1,$t2,[$tp,#8*9] - mul $a0,$a1,$a1 - ldp $a5,$a7,[$ap],#8*2 - umulh $a1,$a1,$a1 - mul $a2,$a3,$a3 - umulh $a3,$a3,$a3 - stp $acc4,$acc5,[$tp,#8*4] - extr $t3,$t0,$t3,#63 - stp $acc6,$acc7,[$tp,#8*6] - add $tp,$tp,#8*8 - adcs $acc0,$a0,$t3 - extr $t0,$t1,$t0,#63 - adcs $acc1,$a1,$t0 - ldp $t3,$t0,[$tp,#8*3] - extr $t1,$t2,$t1,#63 - cbnz $cnt,.Lsqr4x_shift_n_add -___ -my ($np,$np_end)=($ap,$ap_end); -$code.=<<___; - ldp $np,$n0,[x29,#104] // pull np and n0 - - adcs $acc2,$a2,$t1 - extr $t2,$t3,$t2,#63 - adcs $acc3,$a3,$t2 - ldp $t1,$t2,[$tp,#8*5] - mul $a4,$a5,$a5 - umulh $a5,$a5,$a5 - stp $acc0,$acc1,[$tp,#8*0] - mul $a6,$a7,$a7 - umulh $a7,$a7,$a7 - stp $acc2,$acc3,[$tp,#8*2] - extr $t3,$t0,$t3,#63 - adcs $acc4,$a4,$t3 - extr $t0,$t1,$t0,#63 - ldp $acc0,$acc1,[sp,#8*0] - adcs $acc5,$a5,$t0 - extr $t1,$t2,$t1,#63 - ldp $a0,$a1,[$np,#8*0] - adcs $acc6,$a6,$t1 - extr $t2,xzr,$t2,#63 - ldp $a2,$a3,[$np,#8*2] - adc $acc7,$a7,$t2 - ldp $a4,$a5,[$np,#8*4] - - // Reduce by 512 bits per iteration - mul $na0,$n0,$acc0 // t[0]*n0 - ldp $a6,$a7,[$np,#8*6] - add $np_end,$np,$num - ldp $acc2,$acc3,[sp,#8*2] - stp $acc4,$acc5,[$tp,#8*4] - ldp $acc4,$acc5,[sp,#8*4] - stp $acc6,$acc7,[$tp,#8*6] - ldp $acc6,$acc7,[sp,#8*6] - add $np,$np,#8*8 - mov $topmost,xzr // initial top-most carry - mov $tp,sp - mov $cnt,#8 - -.Lsqr8x_reduction: - // (*) mul $t0,$a0,$na0 // lo(n[0-7])*lo(t[0]*n0) - mul $t1,$a1,$na0 - sub $cnt,$cnt,#1 - mul $t2,$a2,$na0 - str $na0,[$tp],#8 // put aside t[0]*n0 for tail processing - mul $t3,$a3,$na0 - // (*) adds xzr,$acc0,$t0 - subs xzr,$acc0,#1 // (*) - mul $t0,$a4,$na0 - adcs $acc0,$acc1,$t1 - mul $t1,$a5,$na0 - adcs $acc1,$acc2,$t2 - mul $t2,$a6,$na0 - adcs $acc2,$acc3,$t3 - mul $t3,$a7,$na0 - adcs $acc3,$acc4,$t0 - umulh $t0,$a0,$na0 // hi(n[0-7])*lo(t[0]*n0) - adcs $acc4,$acc5,$t1 - umulh $t1,$a1,$na0 - adcs $acc5,$acc6,$t2 - umulh $t2,$a2,$na0 - adcs $acc6,$acc7,$t3 - umulh $t3,$a3,$na0 - adc $acc7,xzr,xzr - adds $acc0,$acc0,$t0 - umulh $t0,$a4,$na0 - adcs $acc1,$acc1,$t1 - umulh $t1,$a5,$na0 - adcs $acc2,$acc2,$t2 - umulh $t2,$a6,$na0 - adcs $acc3,$acc3,$t3 - umulh $t3,$a7,$na0 - mul $na0,$n0,$acc0 // next t[0]*n0 - adcs $acc4,$acc4,$t0 - adcs $acc5,$acc5,$t1 - adcs $acc6,$acc6,$t2 - adc $acc7,$acc7,$t3 - cbnz $cnt,.Lsqr8x_reduction - - ldp $t0,$t1,[$tp,#8*0] - ldp $t2,$t3,[$tp,#8*2] - mov $rp,$tp - sub $cnt,$np_end,$np // done yet? - adds $acc0,$acc0,$t0 - adcs $acc1,$acc1,$t1 - ldp $t0,$t1,[$tp,#8*4] - adcs $acc2,$acc2,$t2 - adcs $acc3,$acc3,$t3 - ldp $t2,$t3,[$tp,#8*6] - adcs $acc4,$acc4,$t0 - adcs $acc5,$acc5,$t1 - adcs $acc6,$acc6,$t2 - adcs $acc7,$acc7,$t3 - //adc $carry,xzr,xzr // moved below - cbz $cnt,.Lsqr8x8_post_condition - - ldr $n0,[$tp,#-8*8] - ldp $a0,$a1,[$np,#8*0] - ldp $a2,$a3,[$np,#8*2] - ldp $a4,$a5,[$np,#8*4] - mov $cnt,#-8*8 - ldp $a6,$a7,[$np,#8*6] - add $np,$np,#8*8 - -.Lsqr8x_tail: - mul $t0,$a0,$n0 - adc $carry,xzr,xzr // carry bit, modulo-scheduled - mul $t1,$a1,$n0 - add $cnt,$cnt,#8 - mul $t2,$a2,$n0 - mul $t3,$a3,$n0 - adds $acc0,$acc0,$t0 - mul $t0,$a4,$n0 - adcs $acc1,$acc1,$t1 - mul $t1,$a5,$n0 - adcs $acc2,$acc2,$t2 - mul $t2,$a6,$n0 - adcs $acc3,$acc3,$t3 - mul $t3,$a7,$n0 - adcs $acc4,$acc4,$t0 - umulh $t0,$a0,$n0 - adcs $acc5,$acc5,$t1 - umulh $t1,$a1,$n0 - adcs $acc6,$acc6,$t2 - umulh $t2,$a2,$n0 - adcs $acc7,$acc7,$t3 - umulh $t3,$a3,$n0 - adc $carry,$carry,xzr - str $acc0,[$tp],#8 - adds $acc0,$acc1,$t0 - umulh $t0,$a4,$n0 - adcs $acc1,$acc2,$t1 - umulh $t1,$a5,$n0 - adcs $acc2,$acc3,$t2 - umulh $t2,$a6,$n0 - adcs $acc3,$acc4,$t3 - umulh $t3,$a7,$n0 - ldr $n0,[$rp,$cnt] - adcs $acc4,$acc5,$t0 - adcs $acc5,$acc6,$t1 - adcs $acc6,$acc7,$t2 - adcs $acc7,$carry,$t3 - //adc $carry,xzr,xzr // moved above - cbnz $cnt,.Lsqr8x_tail - // note that carry flag is guaranteed - // to be zero at this point - ldp $a0,$a1,[$tp,#8*0] - sub $cnt,$np_end,$np // done yet? - sub $t2,$np_end,$num // rewinded np - ldp $a2,$a3,[$tp,#8*2] - ldp $a4,$a5,[$tp,#8*4] - ldp $a6,$a7,[$tp,#8*6] - cbz $cnt,.Lsqr8x_tail_break - - ldr $n0,[$rp,#-8*8] - adds $acc0,$acc0,$a0 - adcs $acc1,$acc1,$a1 - ldp $a0,$a1,[$np,#8*0] - adcs $acc2,$acc2,$a2 - adcs $acc3,$acc3,$a3 - ldp $a2,$a3,[$np,#8*2] - adcs $acc4,$acc4,$a4 - adcs $acc5,$acc5,$a5 - ldp $a4,$a5,[$np,#8*4] - adcs $acc6,$acc6,$a6 - mov $cnt,#-8*8 - adcs $acc7,$acc7,$a7 - ldp $a6,$a7,[$np,#8*6] - add $np,$np,#8*8 - //adc $carry,xzr,xzr // moved above - b .Lsqr8x_tail - -.align 4 -.Lsqr8x_tail_break: - ldr $n0,[x29,#112] // pull n0 - add $cnt,$tp,#8*8 // end of current t[num] window - - subs xzr,$topmost,#1 // "move" top-most carry to carry bit - adcs $t0,$acc0,$a0 - adcs $t1,$acc1,$a1 - ldp $acc0,$acc1,[$rp,#8*0] - adcs $acc2,$acc2,$a2 - ldp $a0,$a1,[$t2,#8*0] // recall that $t2 is &n[0] - adcs $acc3,$acc3,$a3 - ldp $a2,$a3,[$t2,#8*2] - adcs $acc4,$acc4,$a4 - adcs $acc5,$acc5,$a5 - ldp $a4,$a5,[$t2,#8*4] - adcs $acc6,$acc6,$a6 - adcs $acc7,$acc7,$a7 - ldp $a6,$a7,[$t2,#8*6] - add $np,$t2,#8*8 - adc $topmost,xzr,xzr // top-most carry - mul $na0,$n0,$acc0 - stp $t0,$t1,[$tp,#8*0] - stp $acc2,$acc3,[$tp,#8*2] - ldp $acc2,$acc3,[$rp,#8*2] - stp $acc4,$acc5,[$tp,#8*4] - ldp $acc4,$acc5,[$rp,#8*4] - cmp $cnt,x29 // did we hit the bottom? - stp $acc6,$acc7,[$tp,#8*6] - mov $tp,$rp // slide the window - ldp $acc6,$acc7,[$rp,#8*6] - mov $cnt,#8 - b.ne .Lsqr8x_reduction - - // Final step. We see if result is larger than modulus, and - // if it is, subtract the modulus. But comparison implies - // subtraction. So we subtract modulus, see if it borrowed, - // and conditionally copy original value. - ldr $rp,[x29,#96] // pull rp - add $tp,$tp,#8*8 - subs $t0,$acc0,$a0 - sbcs $t1,$acc1,$a1 - sub $cnt,$num,#8*8 - mov $ap_end,$rp // $rp copy - -.Lsqr8x_sub: - sbcs $t2,$acc2,$a2 - ldp $a0,$a1,[$np,#8*0] - sbcs $t3,$acc3,$a3 - stp $t0,$t1,[$rp,#8*0] - sbcs $t0,$acc4,$a4 - ldp $a2,$a3,[$np,#8*2] - sbcs $t1,$acc5,$a5 - stp $t2,$t3,[$rp,#8*2] - sbcs $t2,$acc6,$a6 - ldp $a4,$a5,[$np,#8*4] - sbcs $t3,$acc7,$a7 - ldp $a6,$a7,[$np,#8*6] - add $np,$np,#8*8 - ldp $acc0,$acc1,[$tp,#8*0] - sub $cnt,$cnt,#8*8 - ldp $acc2,$acc3,[$tp,#8*2] - ldp $acc4,$acc5,[$tp,#8*4] - ldp $acc6,$acc7,[$tp,#8*6] - add $tp,$tp,#8*8 - stp $t0,$t1,[$rp,#8*4] - sbcs $t0,$acc0,$a0 - stp $t2,$t3,[$rp,#8*6] - add $rp,$rp,#8*8 - sbcs $t1,$acc1,$a1 - cbnz $cnt,.Lsqr8x_sub - - sbcs $t2,$acc2,$a2 - mov $tp,sp - add $ap,sp,$num - ldp $a0,$a1,[$ap_end,#8*0] - sbcs $t3,$acc3,$a3 - stp $t0,$t1,[$rp,#8*0] - sbcs $t0,$acc4,$a4 - ldp $a2,$a3,[$ap_end,#8*2] - sbcs $t1,$acc5,$a5 - stp $t2,$t3,[$rp,#8*2] - sbcs $t2,$acc6,$a6 - ldp $acc0,$acc1,[$ap,#8*0] - sbcs $t3,$acc7,$a7 - ldp $acc2,$acc3,[$ap,#8*2] - sbcs xzr,$topmost,xzr // did it borrow? - ldr x30,[x29,#8] // pull return address - stp $t0,$t1,[$rp,#8*4] - stp $t2,$t3,[$rp,#8*6] - - sub $cnt,$num,#8*4 -.Lsqr4x_cond_copy: - sub $cnt,$cnt,#8*4 - csel $t0,$acc0,$a0,lo - stp xzr,xzr,[$tp,#8*0] - csel $t1,$acc1,$a1,lo - ldp $a0,$a1,[$ap_end,#8*4] - ldp $acc0,$acc1,[$ap,#8*4] - csel $t2,$acc2,$a2,lo - stp xzr,xzr,[$tp,#8*2] - add $tp,$tp,#8*4 - csel $t3,$acc3,$a3,lo - ldp $a2,$a3,[$ap_end,#8*6] - ldp $acc2,$acc3,[$ap,#8*6] - add $ap,$ap,#8*4 - stp $t0,$t1,[$ap_end,#8*0] - stp $t2,$t3,[$ap_end,#8*2] - add $ap_end,$ap_end,#8*4 - stp xzr,xzr,[$ap,#8*0] - stp xzr,xzr,[$ap,#8*2] - cbnz $cnt,.Lsqr4x_cond_copy - - csel $t0,$acc0,$a0,lo - stp xzr,xzr,[$tp,#8*0] - csel $t1,$acc1,$a1,lo - stp xzr,xzr,[$tp,#8*2] - csel $t2,$acc2,$a2,lo - csel $t3,$acc3,$a3,lo - stp $t0,$t1,[$ap_end,#8*0] - stp $t2,$t3,[$ap_end,#8*2] - - b .Lsqr8x_done - -.align 4 -.Lsqr8x8_post_condition: - adc $carry,xzr,xzr - ldr x30,[x29,#8] // pull return address - // $acc0-7,$carry hold result, $a0-7 hold modulus - subs $a0,$acc0,$a0 - ldr $ap,[x29,#96] // pull rp - sbcs $a1,$acc1,$a1 - stp xzr,xzr,[sp,#8*0] - sbcs $a2,$acc2,$a2 - stp xzr,xzr,[sp,#8*2] - sbcs $a3,$acc3,$a3 - stp xzr,xzr,[sp,#8*4] - sbcs $a4,$acc4,$a4 - stp xzr,xzr,[sp,#8*6] - sbcs $a5,$acc5,$a5 - stp xzr,xzr,[sp,#8*8] - sbcs $a6,$acc6,$a6 - stp xzr,xzr,[sp,#8*10] - sbcs $a7,$acc7,$a7 - stp xzr,xzr,[sp,#8*12] - sbcs $carry,$carry,xzr // did it borrow? - stp xzr,xzr,[sp,#8*14] - - // $a0-7 hold result-modulus - csel $a0,$acc0,$a0,lo - csel $a1,$acc1,$a1,lo - csel $a2,$acc2,$a2,lo - csel $a3,$acc3,$a3,lo - stp $a0,$a1,[$ap,#8*0] - csel $a4,$acc4,$a4,lo - csel $a5,$acc5,$a5,lo - stp $a2,$a3,[$ap,#8*2] - csel $a6,$acc6,$a6,lo - csel $a7,$acc7,$a7,lo - stp $a4,$a5,[$ap,#8*4] - stp $a6,$a7,[$ap,#8*6] - -.Lsqr8x_done: - ldp x19,x20,[x29,#16] - mov sp,x29 - ldp x21,x22,[x29,#32] - mov x0,#1 - ldp x23,x24,[x29,#48] - ldp x25,x26,[x29,#64] - ldp x27,x28,[x29,#80] - ldr x29,[sp],#128 - // x30 is popped earlier - AARCH64_VALIDATE_LINK_REGISTER - ret -.size __bn_sqr8x_mont,.-__bn_sqr8x_mont -___ -} - -{ -######################################################################## -# Even though this might look as ARMv8 adaptation of mulx4x_mont from -# x86_64-mont5 module, it's different in sense that it performs -# reduction 256 bits at a time. - -my ($a0,$a1,$a2,$a3, - $t0,$t1,$t2,$t3, - $m0,$m1,$m2,$m3, - $acc0,$acc1,$acc2,$acc3,$acc4, - $bi,$mi,$tp,$ap_end,$cnt) = map("x$_",(6..17,19..28)); -my $bp_end=$rp; -my ($carry,$topmost) = ($rp,"x30"); - -$code.=<<___; -.type __bn_mul4x_mont,%function -.align 5 -__bn_mul4x_mont: - // Not adding AARCH64_SIGN_LINK_REGISTER here because __bn_mul4x_mont is jumped to - // only from bn_mul_mont or __bn_mul8x_mont which have already signed the - // return address. - stp x29,x30,[sp,#-128]! - add x29,sp,#0 - stp x19,x20,[sp,#16] - stp x21,x22,[sp,#32] - stp x23,x24,[sp,#48] - stp x25,x26,[sp,#64] - stp x27,x28,[sp,#80] - - sub $tp,sp,$num,lsl#3 - lsl $num,$num,#3 - ldr $n0,[$n0] // *n0 - sub sp,$tp,#8*4 // alloca - - add $t0,$bp,$num - add $ap_end,$ap,$num - stp $rp,$t0,[x29,#96] // offload rp and &b[num] - - ldr $bi,[$bp,#8*0] // b[0] - ldp $a0,$a1,[$ap,#8*0] // a[0..3] - ldp $a2,$a3,[$ap,#8*2] - add $ap,$ap,#8*4 - mov $acc0,xzr - mov $acc1,xzr - mov $acc2,xzr - mov $acc3,xzr - ldp $m0,$m1,[$np,#8*0] // n[0..3] - ldp $m2,$m3,[$np,#8*2] - adds $np,$np,#8*4 // clear carry bit - mov $carry,xzr - mov $cnt,#0 - mov $tp,sp - -.Loop_mul4x_1st_reduction: - mul $t0,$a0,$bi // lo(a[0..3]*b[0]) - adc $carry,$carry,xzr // modulo-scheduled - mul $t1,$a1,$bi - add $cnt,$cnt,#8 - mul $t2,$a2,$bi - and $cnt,$cnt,#31 - mul $t3,$a3,$bi - adds $acc0,$acc0,$t0 - umulh $t0,$a0,$bi // hi(a[0..3]*b[0]) - adcs $acc1,$acc1,$t1 - mul $mi,$acc0,$n0 // t[0]*n0 - adcs $acc2,$acc2,$t2 - umulh $t1,$a1,$bi - adcs $acc3,$acc3,$t3 - umulh $t2,$a2,$bi - adc $acc4,xzr,xzr - umulh $t3,$a3,$bi - ldr $bi,[$bp,$cnt] // next b[i] (or b[0]) - adds $acc1,$acc1,$t0 - // (*) mul $t0,$m0,$mi // lo(n[0..3]*t[0]*n0) - str $mi,[$tp],#8 // put aside t[0]*n0 for tail processing - adcs $acc2,$acc2,$t1 - mul $t1,$m1,$mi - adcs $acc3,$acc3,$t2 - mul $t2,$m2,$mi - adc $acc4,$acc4,$t3 // can't overflow - mul $t3,$m3,$mi - // (*) adds xzr,$acc0,$t0 - subs xzr,$acc0,#1 // (*) - umulh $t0,$m0,$mi // hi(n[0..3]*t[0]*n0) - adcs $acc0,$acc1,$t1 - umulh $t1,$m1,$mi - adcs $acc1,$acc2,$t2 - umulh $t2,$m2,$mi - adcs $acc2,$acc3,$t3 - umulh $t3,$m3,$mi - adcs $acc3,$acc4,$carry - adc $carry,xzr,xzr - adds $acc0,$acc0,$t0 - sub $t0,$ap_end,$ap - adcs $acc1,$acc1,$t1 - adcs $acc2,$acc2,$t2 - adcs $acc3,$acc3,$t3 - //adc $carry,$carry,xzr - cbnz $cnt,.Loop_mul4x_1st_reduction - - cbz $t0,.Lmul4x4_post_condition - - ldp $a0,$a1,[$ap,#8*0] // a[4..7] - ldp $a2,$a3,[$ap,#8*2] - add $ap,$ap,#8*4 - ldr $mi,[sp] // a[0]*n0 - ldp $m0,$m1,[$np,#8*0] // n[4..7] - ldp $m2,$m3,[$np,#8*2] - add $np,$np,#8*4 - -.Loop_mul4x_1st_tail: - mul $t0,$a0,$bi // lo(a[4..7]*b[i]) - adc $carry,$carry,xzr // modulo-scheduled - mul $t1,$a1,$bi - add $cnt,$cnt,#8 - mul $t2,$a2,$bi - and $cnt,$cnt,#31 - mul $t3,$a3,$bi - adds $acc0,$acc0,$t0 - umulh $t0,$a0,$bi // hi(a[4..7]*b[i]) - adcs $acc1,$acc1,$t1 - umulh $t1,$a1,$bi - adcs $acc2,$acc2,$t2 - umulh $t2,$a2,$bi - adcs $acc3,$acc3,$t3 - umulh $t3,$a3,$bi - adc $acc4,xzr,xzr - ldr $bi,[$bp,$cnt] // next b[i] (or b[0]) - adds $acc1,$acc1,$t0 - mul $t0,$m0,$mi // lo(n[4..7]*a[0]*n0) - adcs $acc2,$acc2,$t1 - mul $t1,$m1,$mi - adcs $acc3,$acc3,$t2 - mul $t2,$m2,$mi - adc $acc4,$acc4,$t3 // can't overflow - mul $t3,$m3,$mi - adds $acc0,$acc0,$t0 - umulh $t0,$m0,$mi // hi(n[4..7]*a[0]*n0) - adcs $acc1,$acc1,$t1 - umulh $t1,$m1,$mi - adcs $acc2,$acc2,$t2 - umulh $t2,$m2,$mi - adcs $acc3,$acc3,$t3 - adcs $acc4,$acc4,$carry - umulh $t3,$m3,$mi - adc $carry,xzr,xzr - ldr $mi,[sp,$cnt] // next t[0]*n0 - str $acc0,[$tp],#8 // result!!! - adds $acc0,$acc1,$t0 - sub $t0,$ap_end,$ap // done yet? - adcs $acc1,$acc2,$t1 - adcs $acc2,$acc3,$t2 - adcs $acc3,$acc4,$t3 - //adc $carry,$carry,xzr - cbnz $cnt,.Loop_mul4x_1st_tail - - sub $t1,$ap_end,$num // rewinded $ap - cbz $t0,.Lmul4x_proceed - - ldp $a0,$a1,[$ap,#8*0] - ldp $a2,$a3,[$ap,#8*2] - add $ap,$ap,#8*4 - ldp $m0,$m1,[$np,#8*0] - ldp $m2,$m3,[$np,#8*2] - add $np,$np,#8*4 - b .Loop_mul4x_1st_tail - -.align 5 -.Lmul4x_proceed: - ldr $bi,[$bp,#8*4]! // *++b - adc $topmost,$carry,xzr - ldp $a0,$a1,[$t1,#8*0] // a[0..3] - sub $np,$np,$num // rewind np - ldp $a2,$a3,[$t1,#8*2] - add $ap,$t1,#8*4 - - stp $acc0,$acc1,[$tp,#8*0] // result!!! - ldp $acc0,$acc1,[sp,#8*4] // t[0..3] - stp $acc2,$acc3,[$tp,#8*2] // result!!! - ldp $acc2,$acc3,[sp,#8*6] - - ldp $m0,$m1,[$np,#8*0] // n[0..3] - mov $tp,sp - ldp $m2,$m3,[$np,#8*2] - adds $np,$np,#8*4 // clear carry bit - mov $carry,xzr - -.align 4 -.Loop_mul4x_reduction: - mul $t0,$a0,$bi // lo(a[0..3]*b[4]) - adc $carry,$carry,xzr // modulo-scheduled - mul $t1,$a1,$bi - add $cnt,$cnt,#8 - mul $t2,$a2,$bi - and $cnt,$cnt,#31 - mul $t3,$a3,$bi - adds $acc0,$acc0,$t0 - umulh $t0,$a0,$bi // hi(a[0..3]*b[4]) - adcs $acc1,$acc1,$t1 - mul $mi,$acc0,$n0 // t[0]*n0 - adcs $acc2,$acc2,$t2 - umulh $t1,$a1,$bi - adcs $acc3,$acc3,$t3 - umulh $t2,$a2,$bi - adc $acc4,xzr,xzr - umulh $t3,$a3,$bi - ldr $bi,[$bp,$cnt] // next b[i] - adds $acc1,$acc1,$t0 - // (*) mul $t0,$m0,$mi - str $mi,[$tp],#8 // put aside t[0]*n0 for tail processing - adcs $acc2,$acc2,$t1 - mul $t1,$m1,$mi // lo(n[0..3]*t[0]*n0 - adcs $acc3,$acc3,$t2 - mul $t2,$m2,$mi - adc $acc4,$acc4,$t3 // can't overflow - mul $t3,$m3,$mi - // (*) adds xzr,$acc0,$t0 - subs xzr,$acc0,#1 // (*) - umulh $t0,$m0,$mi // hi(n[0..3]*t[0]*n0 - adcs $acc0,$acc1,$t1 - umulh $t1,$m1,$mi - adcs $acc1,$acc2,$t2 - umulh $t2,$m2,$mi - adcs $acc2,$acc3,$t3 - umulh $t3,$m3,$mi - adcs $acc3,$acc4,$carry - adc $carry,xzr,xzr - adds $acc0,$acc0,$t0 - adcs $acc1,$acc1,$t1 - adcs $acc2,$acc2,$t2 - adcs $acc3,$acc3,$t3 - //adc $carry,$carry,xzr - cbnz $cnt,.Loop_mul4x_reduction - - adc $carry,$carry,xzr - ldp $t0,$t1,[$tp,#8*4] // t[4..7] - ldp $t2,$t3,[$tp,#8*6] - ldp $a0,$a1,[$ap,#8*0] // a[4..7] - ldp $a2,$a3,[$ap,#8*2] - add $ap,$ap,#8*4 - adds $acc0,$acc0,$t0 - adcs $acc1,$acc1,$t1 - adcs $acc2,$acc2,$t2 - adcs $acc3,$acc3,$t3 - //adc $carry,$carry,xzr - - ldr $mi,[sp] // t[0]*n0 - ldp $m0,$m1,[$np,#8*0] // n[4..7] - ldp $m2,$m3,[$np,#8*2] - add $np,$np,#8*4 - -.align 4 -.Loop_mul4x_tail: - mul $t0,$a0,$bi // lo(a[4..7]*b[4]) - adc $carry,$carry,xzr // modulo-scheduled - mul $t1,$a1,$bi - add $cnt,$cnt,#8 - mul $t2,$a2,$bi - and $cnt,$cnt,#31 - mul $t3,$a3,$bi - adds $acc0,$acc0,$t0 - umulh $t0,$a0,$bi // hi(a[4..7]*b[4]) - adcs $acc1,$acc1,$t1 - umulh $t1,$a1,$bi - adcs $acc2,$acc2,$t2 - umulh $t2,$a2,$bi - adcs $acc3,$acc3,$t3 - umulh $t3,$a3,$bi - adc $acc4,xzr,xzr - ldr $bi,[$bp,$cnt] // next b[i] - adds $acc1,$acc1,$t0 - mul $t0,$m0,$mi // lo(n[4..7]*t[0]*n0) - adcs $acc2,$acc2,$t1 - mul $t1,$m1,$mi - adcs $acc3,$acc3,$t2 - mul $t2,$m2,$mi - adc $acc4,$acc4,$t3 // can't overflow - mul $t3,$m3,$mi - adds $acc0,$acc0,$t0 - umulh $t0,$m0,$mi // hi(n[4..7]*t[0]*n0) - adcs $acc1,$acc1,$t1 - umulh $t1,$m1,$mi - adcs $acc2,$acc2,$t2 - umulh $t2,$m2,$mi - adcs $acc3,$acc3,$t3 - umulh $t3,$m3,$mi - adcs $acc4,$acc4,$carry - ldr $mi,[sp,$cnt] // next a[0]*n0 - adc $carry,xzr,xzr - str $acc0,[$tp],#8 // result!!! - adds $acc0,$acc1,$t0 - sub $t0,$ap_end,$ap // done yet? - adcs $acc1,$acc2,$t1 - adcs $acc2,$acc3,$t2 - adcs $acc3,$acc4,$t3 - //adc $carry,$carry,xzr - cbnz $cnt,.Loop_mul4x_tail - - sub $t1,$np,$num // rewinded np? - adc $carry,$carry,xzr - cbz $t0,.Loop_mul4x_break - - ldp $t0,$t1,[$tp,#8*4] - ldp $t2,$t3,[$tp,#8*6] - ldp $a0,$a1,[$ap,#8*0] - ldp $a2,$a3,[$ap,#8*2] - add $ap,$ap,#8*4 - adds $acc0,$acc0,$t0 - adcs $acc1,$acc1,$t1 - adcs $acc2,$acc2,$t2 - adcs $acc3,$acc3,$t3 - //adc $carry,$carry,xzr - ldp $m0,$m1,[$np,#8*0] - ldp $m2,$m3,[$np,#8*2] - add $np,$np,#8*4 - b .Loop_mul4x_tail - -.align 4 -.Loop_mul4x_break: - ldp $t2,$t3,[x29,#96] // pull rp and &b[num] - adds $acc0,$acc0,$topmost - add $bp,$bp,#8*4 // bp++ - adcs $acc1,$acc1,xzr - sub $ap,$ap,$num // rewind ap - adcs $acc2,$acc2,xzr - stp $acc0,$acc1,[$tp,#8*0] // result!!! - adcs $acc3,$acc3,xzr - ldp $acc0,$acc1,[sp,#8*4] // t[0..3] - adc $topmost,$carry,xzr - stp $acc2,$acc3,[$tp,#8*2] // result!!! - cmp $bp,$t3 // done yet? - ldp $acc2,$acc3,[sp,#8*6] - ldp $m0,$m1,[$t1,#8*0] // n[0..3] - ldp $m2,$m3,[$t1,#8*2] - add $np,$t1,#8*4 - b.eq .Lmul4x_post - - ldr $bi,[$bp] - ldp $a0,$a1,[$ap,#8*0] // a[0..3] - ldp $a2,$a3,[$ap,#8*2] - adds $ap,$ap,#8*4 // clear carry bit - mov $carry,xzr - mov $tp,sp - b .Loop_mul4x_reduction - -.align 4 -.Lmul4x_post: - // Final step. We see if result is larger than modulus, and - // if it is, subtract the modulus. But comparison implies - // subtraction. So we subtract modulus, see if it borrowed, - // and conditionally copy original value. - mov $rp,$t2 - mov $ap_end,$t2 // $rp copy - subs $t0,$acc0,$m0 - add $tp,sp,#8*8 - sbcs $t1,$acc1,$m1 - sub $cnt,$num,#8*4 - -.Lmul4x_sub: - sbcs $t2,$acc2,$m2 - ldp $m0,$m1,[$np,#8*0] - sub $cnt,$cnt,#8*4 - ldp $acc0,$acc1,[$tp,#8*0] - sbcs $t3,$acc3,$m3 - ldp $m2,$m3,[$np,#8*2] - add $np,$np,#8*4 - ldp $acc2,$acc3,[$tp,#8*2] - add $tp,$tp,#8*4 - stp $t0,$t1,[$rp,#8*0] - sbcs $t0,$acc0,$m0 - stp $t2,$t3,[$rp,#8*2] - add $rp,$rp,#8*4 - sbcs $t1,$acc1,$m1 - cbnz $cnt,.Lmul4x_sub - - sbcs $t2,$acc2,$m2 - mov $tp,sp - add $ap,sp,#8*4 - ldp $a0,$a1,[$ap_end,#8*0] - sbcs $t3,$acc3,$m3 - stp $t0,$t1,[$rp,#8*0] - ldp $a2,$a3,[$ap_end,#8*2] - stp $t2,$t3,[$rp,#8*2] - ldp $acc0,$acc1,[$ap,#8*0] - ldp $acc2,$acc3,[$ap,#8*2] - sbcs xzr,$topmost,xzr // did it borrow? - ldr x30,[x29,#8] // pull return address - - sub $cnt,$num,#8*4 -.Lmul4x_cond_copy: - sub $cnt,$cnt,#8*4 - csel $t0,$acc0,$a0,lo - stp xzr,xzr,[$tp,#8*0] - csel $t1,$acc1,$a1,lo - ldp $a0,$a1,[$ap_end,#8*4] - ldp $acc0,$acc1,[$ap,#8*4] - csel $t2,$acc2,$a2,lo - stp xzr,xzr,[$tp,#8*2] - add $tp,$tp,#8*4 - csel $t3,$acc3,$a3,lo - ldp $a2,$a3,[$ap_end,#8*6] - ldp $acc2,$acc3,[$ap,#8*6] - add $ap,$ap,#8*4 - stp $t0,$t1,[$ap_end,#8*0] - stp $t2,$t3,[$ap_end,#8*2] - add $ap_end,$ap_end,#8*4 - cbnz $cnt,.Lmul4x_cond_copy - - csel $t0,$acc0,$a0,lo - stp xzr,xzr,[$tp,#8*0] - csel $t1,$acc1,$a1,lo - stp xzr,xzr,[$tp,#8*2] - csel $t2,$acc2,$a2,lo - stp xzr,xzr,[$tp,#8*3] - csel $t3,$acc3,$a3,lo - stp xzr,xzr,[$tp,#8*4] - stp $t0,$t1,[$ap_end,#8*0] - stp $t2,$t3,[$ap_end,#8*2] - - b .Lmul4x_done - -.align 4 -.Lmul4x4_post_condition: - adc $carry,$carry,xzr - ldr $ap,[x29,#96] // pull rp - // $acc0-3,$carry hold result, $m0-7 hold modulus - subs $a0,$acc0,$m0 - ldr x30,[x29,#8] // pull return address - sbcs $a1,$acc1,$m1 - stp xzr,xzr,[sp,#8*0] - sbcs $a2,$acc2,$m2 - stp xzr,xzr,[sp,#8*2] - sbcs $a3,$acc3,$m3 - stp xzr,xzr,[sp,#8*4] - sbcs xzr,$carry,xzr // did it borrow? - stp xzr,xzr,[sp,#8*6] - - // $a0-3 hold result-modulus - csel $a0,$acc0,$a0,lo - csel $a1,$acc1,$a1,lo - csel $a2,$acc2,$a2,lo - csel $a3,$acc3,$a3,lo - stp $a0,$a1,[$ap,#8*0] - stp $a2,$a3,[$ap,#8*2] - -.Lmul4x_done: - ldp x19,x20,[x29,#16] - mov sp,x29 - ldp x21,x22,[x29,#32] - mov x0,#1 - ldp x23,x24,[x29,#48] - ldp x25,x26,[x29,#64] - ldp x27,x28,[x29,#80] - ldr x29,[sp],#128 - // x30 is popped earlier - AARCH64_VALIDATE_LINK_REGISTER - ret -.size __bn_mul4x_mont,.-__bn_mul4x_mont -___ -} -$code.=<<___; -.asciz "Montgomery Multiplication for ARMv8, CRYPTOGAMS by " -.align 4 -___ - -print $code; - -close STDOUT or die "error closing STDOUT"; diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/bn/asm/x86_64-mont5.pl temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/bn/asm/x86_64-mont5.pl --- temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/bn/asm/x86_64-mont5.pl 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/bn/asm/x86_64-mont5.pl 1970-01-01 00:00:00.000000000 +0000 @@ -1,3932 +0,0 @@ -#! /usr/bin/env perl -# Copyright 2011-2016 The OpenSSL Project Authors. All Rights Reserved. -# -# Licensed under the OpenSSL license (the "License"). You may not use -# this file except in compliance with the License. You can obtain a copy -# in the file LICENSE in the source distribution or at -# https://www.openssl.org/source/license.html - - -# ==================================================================== -# Written by Andy Polyakov for the OpenSSL -# project. The module is, however, dual licensed under OpenSSL and -# CRYPTOGAMS licenses depending on where you obtain it. For further -# details see http://www.openssl.org/~appro/cryptogams/. -# ==================================================================== - -# August 2011. -# -# Companion to x86_64-mont.pl that optimizes cache-timing attack -# countermeasures. The subroutines are produced by replacing bp[i] -# references in their x86_64-mont.pl counterparts with cache-neutral -# references to powers table computed in BN_mod_exp_mont_consttime. -# In addition subroutine that scatters elements of the powers table -# is implemented, so that scatter-/gathering can be tuned without -# bn_exp.c modifications. - -# August 2013. -# -# Add MULX/AD*X code paths and additional interfaces to optimize for -# branch prediction unit. For input lengths that are multiples of 8 -# the np argument is not just modulus value, but one interleaved -# with 0. This is to optimize post-condition... - -$flavour = shift; -$output = shift; -if ($flavour =~ /\./) { $output = $flavour; undef $flavour; } - -$win64=0; $win64=1 if ($flavour =~ /[nm]asm|mingw64/ || $output =~ /\.asm$/); - -$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; -( $xlate="${dir}x86_64-xlate.pl" and -f $xlate ) or -( $xlate="${dir}../../../perlasm/x86_64-xlate.pl" and -f $xlate) or -die "can't locate x86_64-xlate.pl"; - -open OUT,"| \"$^X\" \"$xlate\" $flavour \"$output\""; -*STDOUT=*OUT; - -# In upstream, this is controlled by shelling out to the compiler to check -# versions, but BoringSSL is intended to be used with pre-generated perlasm -# output, so this isn't useful anyway. -$addx = 1; - -# int GFp_bn_mul_mont_gather5( -$rp="%rdi"; # BN_ULONG *rp, -$ap="%rsi"; # const BN_ULONG *ap, -$bp="%rdx"; # const BN_ULONG *bp, -$np="%rcx"; # const BN_ULONG *np, -$n0="%r8"; # const BN_ULONG *n0, -$num="%r9"; # int num, - # int idx); # 0 to 2^5-1, "index" in $bp holding - # pre-computed powers of a', interlaced - # in such manner that b[0] is $bp[idx], - # b[1] is [2^5+idx], etc. -$lo0="%r10"; -$hi0="%r11"; -$hi1="%r13"; -$i="%r14"; -$j="%r15"; -$m0="%rbx"; -$m1="%rbp"; - -$code=<<___; -.text - -.extern GFp_ia32cap_P - -.globl GFp_bn_mul_mont_gather5 -.type GFp_bn_mul_mont_gather5,\@function,6 -.align 64 -GFp_bn_mul_mont_gather5: -.cfi_startproc - mov ${num}d,${num}d - mov %rsp,%rax -.cfi_def_cfa_register %rax - test \$7,${num}d - jnz .Lmul_enter -___ -$code.=<<___ if ($addx); - leaq GFp_ia32cap_P(%rip),%r11 - mov 8(%r11),%r11d -___ -$code.=<<___; - jmp .Lmul4x_enter - -.align 16 -.Lmul_enter: - movd `($win64?56:8)`(%rsp),%xmm5 # load 7th argument - push %rbx -.cfi_push %rbx - push %rbp -.cfi_push %rbp - push %r12 -.cfi_push %r12 - push %r13 -.cfi_push %r13 - push %r14 -.cfi_push %r14 - push %r15 -.cfi_push %r15 - - neg $num - mov %rsp,%r11 - lea -280(%rsp,$num,8),%r10 # future alloca(8*(num+2)+256+8) - neg $num # restore $num - and \$-1024,%r10 # minimize TLB usage - - # An OS-agnostic version of __chkstk. - # - # Some OSes (Windows) insist on stack being "wired" to - # physical memory in strictly sequential manner, i.e. if stack - # allocation spans two pages, then reference to farmost one can - # be punishable by SEGV. But page walking can do good even on - # other OSes, because it guarantees that villain thread hits - # the guard page before it can make damage to innocent one... - sub %r10,%r11 - and \$-4096,%r11 - lea (%r10,%r11),%rsp - mov (%rsp),%r11 - cmp %r10,%rsp - ja .Lmul_page_walk - jmp .Lmul_page_walk_done - -.Lmul_page_walk: - lea -4096(%rsp),%rsp - mov (%rsp),%r11 - cmp %r10,%rsp - ja .Lmul_page_walk -.Lmul_page_walk_done: - - lea .Linc(%rip),%r10 - mov %rax,8(%rsp,$num,8) # tp[num+1]=%rsp -.cfi_cfa_expression %rsp+8,$num,8,mul,plus,deref,+8 -.Lmul_body: - - lea 128($bp),%r12 # reassign $bp (+size optimization) -___ - $bp="%r12"; - $STRIDE=2**5*8; # 5 is "window size" - $N=$STRIDE/4; # should match cache line size -$code.=<<___; - movdqa 0(%r10),%xmm0 # 00000001000000010000000000000000 - movdqa 16(%r10),%xmm1 # 00000002000000020000000200000002 - lea 24-112(%rsp,$num,8),%r10# place the mask after tp[num+3] (+ICache optimization) - and \$-16,%r10 - - pshufd \$0,%xmm5,%xmm5 # broadcast index - movdqa %xmm1,%xmm4 - movdqa %xmm1,%xmm2 -___ -######################################################################## -# calculate mask by comparing 0..31 to index and save result to stack -# -$code.=<<___; - paddd %xmm0,%xmm1 - pcmpeqd %xmm5,%xmm0 # compare to 1,0 - .byte 0x67 - movdqa %xmm4,%xmm3 -___ -for($k=0;$k<$STRIDE/16-4;$k+=4) { -$code.=<<___; - paddd %xmm1,%xmm2 - pcmpeqd %xmm5,%xmm1 # compare to 3,2 - movdqa %xmm0,`16*($k+0)+112`(%r10) - movdqa %xmm4,%xmm0 - - paddd %xmm2,%xmm3 - pcmpeqd %xmm5,%xmm2 # compare to 5,4 - movdqa %xmm1,`16*($k+1)+112`(%r10) - movdqa %xmm4,%xmm1 - - paddd %xmm3,%xmm0 - pcmpeqd %xmm5,%xmm3 # compare to 7,6 - movdqa %xmm2,`16*($k+2)+112`(%r10) - movdqa %xmm4,%xmm2 - - paddd %xmm0,%xmm1 - pcmpeqd %xmm5,%xmm0 - movdqa %xmm3,`16*($k+3)+112`(%r10) - movdqa %xmm4,%xmm3 -___ -} -$code.=<<___; # last iteration can be optimized - paddd %xmm1,%xmm2 - pcmpeqd %xmm5,%xmm1 - movdqa %xmm0,`16*($k+0)+112`(%r10) - - paddd %xmm2,%xmm3 - .byte 0x67 - pcmpeqd %xmm5,%xmm2 - movdqa %xmm1,`16*($k+1)+112`(%r10) - - pcmpeqd %xmm5,%xmm3 - movdqa %xmm2,`16*($k+2)+112`(%r10) - pand `16*($k+0)-128`($bp),%xmm0 # while it's still in register - - pand `16*($k+1)-128`($bp),%xmm1 - pand `16*($k+2)-128`($bp),%xmm2 - movdqa %xmm3,`16*($k+3)+112`(%r10) - pand `16*($k+3)-128`($bp),%xmm3 - por %xmm2,%xmm0 - por %xmm3,%xmm1 -___ -for($k=0;$k<$STRIDE/16-4;$k+=4) { -$code.=<<___; - movdqa `16*($k+0)-128`($bp),%xmm4 - movdqa `16*($k+1)-128`($bp),%xmm5 - movdqa `16*($k+2)-128`($bp),%xmm2 - pand `16*($k+0)+112`(%r10),%xmm4 - movdqa `16*($k+3)-128`($bp),%xmm3 - pand `16*($k+1)+112`(%r10),%xmm5 - por %xmm4,%xmm0 - pand `16*($k+2)+112`(%r10),%xmm2 - por %xmm5,%xmm1 - pand `16*($k+3)+112`(%r10),%xmm3 - por %xmm2,%xmm0 - por %xmm3,%xmm1 -___ -} -$code.=<<___; - por %xmm1,%xmm0 - pshufd \$0x4e,%xmm0,%xmm1 - por %xmm1,%xmm0 - lea $STRIDE($bp),$bp - movq %xmm0,$m0 # m0=bp[0] - - mov ($n0),$n0 # pull n0[0] value - mov ($ap),%rax - - xor $i,$i # i=0 - xor $j,$j # j=0 - - mov $n0,$m1 - mulq $m0 # ap[0]*bp[0] - mov %rax,$lo0 - mov ($np),%rax - - imulq $lo0,$m1 # "tp[0]"*n0 - mov %rdx,$hi0 - - mulq $m1 # np[0]*m1 - add %rax,$lo0 # discarded - mov 8($ap),%rax - adc \$0,%rdx - mov %rdx,$hi1 - - lea 1($j),$j # j++ - jmp .L1st_enter - -.align 16 -.L1st: - add %rax,$hi1 - mov ($ap,$j,8),%rax - adc \$0,%rdx - add $hi0,$hi1 # np[j]*m1+ap[j]*bp[0] - mov $lo0,$hi0 - adc \$0,%rdx - mov $hi1,-16(%rsp,$j,8) # tp[j-1] - mov %rdx,$hi1 - -.L1st_enter: - mulq $m0 # ap[j]*bp[0] - add %rax,$hi0 - mov ($np,$j,8),%rax - adc \$0,%rdx - lea 1($j),$j # j++ - mov %rdx,$lo0 - - mulq $m1 # np[j]*m1 - cmp $num,$j - jne .L1st # note that upon exit $j==$num, so - # they can be used interchangeably - - add %rax,$hi1 - adc \$0,%rdx - add $hi0,$hi1 # np[j]*m1+ap[j]*bp[0] - adc \$0,%rdx - mov $hi1,-16(%rsp,$num,8) # tp[num-1] - mov %rdx,$hi1 - mov $lo0,$hi0 - - xor %rdx,%rdx - add $hi0,$hi1 - adc \$0,%rdx - mov $hi1,-8(%rsp,$num,8) - mov %rdx,(%rsp,$num,8) # store upmost overflow bit - - lea 1($i),$i # i++ - jmp .Louter -.align 16 -.Louter: - lea 24+128(%rsp,$num,8),%rdx # where 256-byte mask is (+size optimization) - and \$-16,%rdx - pxor %xmm4,%xmm4 - pxor %xmm5,%xmm5 -___ -for($k=0;$k<$STRIDE/16;$k+=4) { -$code.=<<___; - movdqa `16*($k+0)-128`($bp),%xmm0 - movdqa `16*($k+1)-128`($bp),%xmm1 - movdqa `16*($k+2)-128`($bp),%xmm2 - movdqa `16*($k+3)-128`($bp),%xmm3 - pand `16*($k+0)-128`(%rdx),%xmm0 - pand `16*($k+1)-128`(%rdx),%xmm1 - por %xmm0,%xmm4 - pand `16*($k+2)-128`(%rdx),%xmm2 - por %xmm1,%xmm5 - pand `16*($k+3)-128`(%rdx),%xmm3 - por %xmm2,%xmm4 - por %xmm3,%xmm5 -___ -} -$code.=<<___; - por %xmm5,%xmm4 - pshufd \$0x4e,%xmm4,%xmm0 - por %xmm4,%xmm0 - lea $STRIDE($bp),$bp - - mov ($ap),%rax # ap[0] - movq %xmm0,$m0 # m0=bp[i] - - xor $j,$j # j=0 - mov $n0,$m1 - mov (%rsp),$lo0 - - mulq $m0 # ap[0]*bp[i] - add %rax,$lo0 # ap[0]*bp[i]+tp[0] - mov ($np),%rax - adc \$0,%rdx - - imulq $lo0,$m1 # tp[0]*n0 - mov %rdx,$hi0 - - mulq $m1 # np[0]*m1 - add %rax,$lo0 # discarded - mov 8($ap),%rax - adc \$0,%rdx - mov 8(%rsp),$lo0 # tp[1] - mov %rdx,$hi1 - - lea 1($j),$j # j++ - jmp .Linner_enter - -.align 16 -.Linner: - add %rax,$hi1 - mov ($ap,$j,8),%rax - adc \$0,%rdx - add $lo0,$hi1 # np[j]*m1+ap[j]*bp[i]+tp[j] - mov (%rsp,$j,8),$lo0 - adc \$0,%rdx - mov $hi1,-16(%rsp,$j,8) # tp[j-1] - mov %rdx,$hi1 - -.Linner_enter: - mulq $m0 # ap[j]*bp[i] - add %rax,$hi0 - mov ($np,$j,8),%rax - adc \$0,%rdx - add $hi0,$lo0 # ap[j]*bp[i]+tp[j] - mov %rdx,$hi0 - adc \$0,$hi0 - lea 1($j),$j # j++ - - mulq $m1 # np[j]*m1 - cmp $num,$j - jne .Linner # note that upon exit $j==$num, so - # they can be used interchangeably - add %rax,$hi1 - adc \$0,%rdx - add $lo0,$hi1 # np[j]*m1+ap[j]*bp[i]+tp[j] - mov (%rsp,$num,8),$lo0 - adc \$0,%rdx - mov $hi1,-16(%rsp,$num,8) # tp[num-1] - mov %rdx,$hi1 - - xor %rdx,%rdx - add $hi0,$hi1 - adc \$0,%rdx - add $lo0,$hi1 # pull upmost overflow bit - adc \$0,%rdx - mov $hi1,-8(%rsp,$num,8) - mov %rdx,(%rsp,$num,8) # store upmost overflow bit - - lea 1($i),$i # i++ - cmp $num,$i - jb .Louter - - xor $i,$i # i=0 and clear CF! - mov (%rsp),%rax # tp[0] - lea (%rsp),$ap # borrow ap for tp - mov $num,$j # j=num - jmp .Lsub -.align 16 -.Lsub: sbb ($np,$i,8),%rax - mov %rax,($rp,$i,8) # rp[i]=tp[i]-np[i] - mov 8($ap,$i,8),%rax # tp[i+1] - lea 1($i),$i # i++ - dec $j # doesn't affect CF! - jnz .Lsub - - sbb \$0,%rax # handle upmost overflow bit - mov \$-1,%rbx - xor %rax,%rbx - xor $i,$i - mov $num,$j # j=num - -.Lcopy: # conditional copy - mov ($rp,$i,8),%rcx - mov (%rsp,$i,8),%rdx - and %rbx,%rcx - and %rax,%rdx - mov $i,(%rsp,$i,8) # zap temporary vector - or %rcx,%rdx - mov %rdx,($rp,$i,8) # rp[i]=tp[i] - lea 1($i),$i - sub \$1,$j - jnz .Lcopy - - mov 8(%rsp,$num,8),%rsi # restore %rsp -.cfi_def_cfa %rsi,8 - mov \$1,%rax - - mov -48(%rsi),%r15 -.cfi_restore %r15 - mov -40(%rsi),%r14 -.cfi_restore %r14 - mov -32(%rsi),%r13 -.cfi_restore %r13 - mov -24(%rsi),%r12 -.cfi_restore %r12 - mov -16(%rsi),%rbp -.cfi_restore %rbp - mov -8(%rsi),%rbx -.cfi_restore %rbx - lea (%rsi),%rsp -.cfi_def_cfa_register %rsp -.Lmul_epilogue: - ret -.cfi_endproc -.size GFp_bn_mul_mont_gather5,.-GFp_bn_mul_mont_gather5 -___ -{{{ -my @A=("%r10","%r11"); -my @N=("%r13","%rdi"); -$code.=<<___; -.type bn_mul4x_mont_gather5,\@function,6 -.align 32 -bn_mul4x_mont_gather5: -.cfi_startproc - .byte 0x67 - mov %rsp,%rax -.cfi_def_cfa_register %rax -.Lmul4x_enter: -___ -$code.=<<___ if ($addx); - and \$0x80108,%r11d - cmp \$0x80108,%r11d # check for AD*X+BMI2+BMI1 - je .Lmulx4x_enter -___ -$code.=<<___; - push %rbx -.cfi_push %rbx - push %rbp -.cfi_push %rbp - push %r12 -.cfi_push %r12 - push %r13 -.cfi_push %r13 - push %r14 -.cfi_push %r14 - push %r15 -.cfi_push %r15 -.Lmul4x_prologue: - - .byte 0x67 - shl \$3,${num}d # convert $num to bytes - lea ($num,$num,2),%r10 # 3*$num in bytes - neg $num # -$num - - ############################################################## - # Ensure that stack frame doesn't alias with $rptr+3*$num - # modulo 4096, which covers ret[num], am[num] and n[num] - # (see bn_exp.c). This is done to allow memory disambiguation - # logic do its magic. [Extra [num] is allocated in order - # to align with GFp_bn_power5's frame, which is cleansed after - # completing exponentiation. Extra 256 bytes is for power mask - # calculated from 7th argument, the index.] - # - lea -320(%rsp,$num,2),%r11 - mov %rsp,%rbp - sub $rp,%r11 - and \$4095,%r11 - cmp %r11,%r10 - jb .Lmul4xsp_alt - sub %r11,%rbp # align with $rp - lea -320(%rbp,$num,2),%rbp # future alloca(frame+2*num*8+256) - jmp .Lmul4xsp_done - -.align 32 -.Lmul4xsp_alt: - lea 4096-320(,$num,2),%r10 - lea -320(%rbp,$num,2),%rbp # future alloca(frame+2*num*8+256) - sub %r10,%r11 - mov \$0,%r10 - cmovc %r10,%r11 - sub %r11,%rbp -.Lmul4xsp_done: - and \$-64,%rbp - mov %rsp,%r11 - sub %rbp,%r11 - and \$-4096,%r11 - lea (%rbp,%r11),%rsp - mov (%rsp),%r10 - cmp %rbp,%rsp - ja .Lmul4x_page_walk - jmp .Lmul4x_page_walk_done - -.Lmul4x_page_walk: - lea -4096(%rsp),%rsp - mov (%rsp),%r10 - cmp %rbp,%rsp - ja .Lmul4x_page_walk -.Lmul4x_page_walk_done: - - neg $num - - mov %rax,40(%rsp) -.cfi_cfa_expression %rsp+40,deref,+8 -.Lmul4x_body: - - call mul4x_internal - - mov 40(%rsp),%rsi # restore %rsp -.cfi_def_cfa %rsi,8 - mov \$1,%rax - - mov -48(%rsi),%r15 -.cfi_restore %r15 - mov -40(%rsi),%r14 -.cfi_restore %r14 - mov -32(%rsi),%r13 -.cfi_restore %r13 - mov -24(%rsi),%r12 -.cfi_restore %r12 - mov -16(%rsi),%rbp -.cfi_restore %rbp - mov -8(%rsi),%rbx -.cfi_restore %rbx - lea (%rsi),%rsp -.cfi_def_cfa_register %rsp -.Lmul4x_epilogue: - ret -.cfi_endproc -.size bn_mul4x_mont_gather5,.-bn_mul4x_mont_gather5 - -.type mul4x_internal,\@abi-omnipotent -.align 32 -mul4x_internal: -.cfi_startproc - shl \$5,$num # $num was in bytes - movd `($win64?56:8)`(%rax),%xmm5 # load 7th argument, index - lea .Linc(%rip),%rax - lea 128(%rdx,$num),%r13 # end of powers table (+size optimization) - shr \$5,$num # restore $num -___ - $bp="%r12"; - $STRIDE=2**5*8; # 5 is "window size" - $N=$STRIDE/4; # should match cache line size - $tp=$i; -$code.=<<___; - movdqa 0(%rax),%xmm0 # 00000001000000010000000000000000 - movdqa 16(%rax),%xmm1 # 00000002000000020000000200000002 - lea 88-112(%rsp,$num),%r10 # place the mask after tp[num+1] (+ICache optimization) - lea 128(%rdx),$bp # size optimization - - pshufd \$0,%xmm5,%xmm5 # broadcast index - movdqa %xmm1,%xmm4 - .byte 0x67,0x67 - movdqa %xmm1,%xmm2 -___ -######################################################################## -# calculate mask by comparing 0..31 to index and save result to stack -# -$code.=<<___; - paddd %xmm0,%xmm1 - pcmpeqd %xmm5,%xmm0 # compare to 1,0 - .byte 0x67 - movdqa %xmm4,%xmm3 -___ -for($i=0;$i<$STRIDE/16-4;$i+=4) { -$code.=<<___; - paddd %xmm1,%xmm2 - pcmpeqd %xmm5,%xmm1 # compare to 3,2 - movdqa %xmm0,`16*($i+0)+112`(%r10) - movdqa %xmm4,%xmm0 - - paddd %xmm2,%xmm3 - pcmpeqd %xmm5,%xmm2 # compare to 5,4 - movdqa %xmm1,`16*($i+1)+112`(%r10) - movdqa %xmm4,%xmm1 - - paddd %xmm3,%xmm0 - pcmpeqd %xmm5,%xmm3 # compare to 7,6 - movdqa %xmm2,`16*($i+2)+112`(%r10) - movdqa %xmm4,%xmm2 - - paddd %xmm0,%xmm1 - pcmpeqd %xmm5,%xmm0 - movdqa %xmm3,`16*($i+3)+112`(%r10) - movdqa %xmm4,%xmm3 -___ -} -$code.=<<___; # last iteration can be optimized - paddd %xmm1,%xmm2 - pcmpeqd %xmm5,%xmm1 - movdqa %xmm0,`16*($i+0)+112`(%r10) - - paddd %xmm2,%xmm3 - .byte 0x67 - pcmpeqd %xmm5,%xmm2 - movdqa %xmm1,`16*($i+1)+112`(%r10) - - pcmpeqd %xmm5,%xmm3 - movdqa %xmm2,`16*($i+2)+112`(%r10) - pand `16*($i+0)-128`($bp),%xmm0 # while it's still in register - - pand `16*($i+1)-128`($bp),%xmm1 - pand `16*($i+2)-128`($bp),%xmm2 - movdqa %xmm3,`16*($i+3)+112`(%r10) - pand `16*($i+3)-128`($bp),%xmm3 - por %xmm2,%xmm0 - por %xmm3,%xmm1 -___ -for($i=0;$i<$STRIDE/16-4;$i+=4) { -$code.=<<___; - movdqa `16*($i+0)-128`($bp),%xmm4 - movdqa `16*($i+1)-128`($bp),%xmm5 - movdqa `16*($i+2)-128`($bp),%xmm2 - pand `16*($i+0)+112`(%r10),%xmm4 - movdqa `16*($i+3)-128`($bp),%xmm3 - pand `16*($i+1)+112`(%r10),%xmm5 - por %xmm4,%xmm0 - pand `16*($i+2)+112`(%r10),%xmm2 - por %xmm5,%xmm1 - pand `16*($i+3)+112`(%r10),%xmm3 - por %xmm2,%xmm0 - por %xmm3,%xmm1 -___ -} -$code.=<<___; - por %xmm1,%xmm0 - pshufd \$0x4e,%xmm0,%xmm1 - por %xmm1,%xmm0 - lea $STRIDE($bp),$bp - movq %xmm0,$m0 # m0=bp[0] - - mov %r13,16+8(%rsp) # save end of b[num] - mov $rp, 56+8(%rsp) # save $rp - - mov ($n0),$n0 # pull n0[0] value - mov ($ap),%rax - lea ($ap,$num),$ap # end of a[num] - neg $num - - mov $n0,$m1 - mulq $m0 # ap[0]*bp[0] - mov %rax,$A[0] - mov ($np),%rax - - imulq $A[0],$m1 # "tp[0]"*n0 - lea 64+8(%rsp),$tp - mov %rdx,$A[1] - - mulq $m1 # np[0]*m1 - add %rax,$A[0] # discarded - mov 8($ap,$num),%rax - adc \$0,%rdx - mov %rdx,$N[1] - - mulq $m0 - add %rax,$A[1] - mov 8*1($np),%rax - adc \$0,%rdx - mov %rdx,$A[0] - - mulq $m1 - add %rax,$N[1] - mov 16($ap,$num),%rax - adc \$0,%rdx - add $A[1],$N[1] - lea 4*8($num),$j # j=4 - lea 8*4($np),$np - adc \$0,%rdx - mov $N[1],($tp) - mov %rdx,$N[0] - jmp .L1st4x - -.align 32 -.L1st4x: - mulq $m0 # ap[j]*bp[0] - add %rax,$A[0] - mov -8*2($np),%rax - lea 32($tp),$tp - adc \$0,%rdx - mov %rdx,$A[1] - - mulq $m1 # np[j]*m1 - add %rax,$N[0] - mov -8($ap,$j),%rax - adc \$0,%rdx - add $A[0],$N[0] # np[j]*m1+ap[j]*bp[0] - adc \$0,%rdx - mov $N[0],-24($tp) # tp[j-1] - mov %rdx,$N[1] - - mulq $m0 # ap[j]*bp[0] - add %rax,$A[1] - mov -8*1($np),%rax - adc \$0,%rdx - mov %rdx,$A[0] - - mulq $m1 # np[j]*m1 - add %rax,$N[1] - mov ($ap,$j),%rax - adc \$0,%rdx - add $A[1],$N[1] # np[j]*m1+ap[j]*bp[0] - adc \$0,%rdx - mov $N[1],-16($tp) # tp[j-1] - mov %rdx,$N[0] - - mulq $m0 # ap[j]*bp[0] - add %rax,$A[0] - mov 8*0($np),%rax - adc \$0,%rdx - mov %rdx,$A[1] - - mulq $m1 # np[j]*m1 - add %rax,$N[0] - mov 8($ap,$j),%rax - adc \$0,%rdx - add $A[0],$N[0] # np[j]*m1+ap[j]*bp[0] - adc \$0,%rdx - mov $N[0],-8($tp) # tp[j-1] - mov %rdx,$N[1] - - mulq $m0 # ap[j]*bp[0] - add %rax,$A[1] - mov 8*1($np),%rax - adc \$0,%rdx - mov %rdx,$A[0] - - mulq $m1 # np[j]*m1 - add %rax,$N[1] - mov 16($ap,$j),%rax - adc \$0,%rdx - add $A[1],$N[1] # np[j]*m1+ap[j]*bp[0] - lea 8*4($np),$np - adc \$0,%rdx - mov $N[1],($tp) # tp[j-1] - mov %rdx,$N[0] - - add \$32,$j # j+=4 - jnz .L1st4x - - mulq $m0 # ap[j]*bp[0] - add %rax,$A[0] - mov -8*2($np),%rax - lea 32($tp),$tp - adc \$0,%rdx - mov %rdx,$A[1] - - mulq $m1 # np[j]*m1 - add %rax,$N[0] - mov -8($ap),%rax - adc \$0,%rdx - add $A[0],$N[0] # np[j]*m1+ap[j]*bp[0] - adc \$0,%rdx - mov $N[0],-24($tp) # tp[j-1] - mov %rdx,$N[1] - - mulq $m0 # ap[j]*bp[0] - add %rax,$A[1] - mov -8*1($np),%rax - adc \$0,%rdx - mov %rdx,$A[0] - - mulq $m1 # np[j]*m1 - add %rax,$N[1] - mov ($ap,$num),%rax # ap[0] - adc \$0,%rdx - add $A[1],$N[1] # np[j]*m1+ap[j]*bp[0] - adc \$0,%rdx - mov $N[1],-16($tp) # tp[j-1] - mov %rdx,$N[0] - - lea ($np,$num),$np # rewind $np - - xor $N[1],$N[1] - add $A[0],$N[0] - adc \$0,$N[1] - mov $N[0],-8($tp) - - jmp .Louter4x - -.align 32 -.Louter4x: - lea 16+128($tp),%rdx # where 256-byte mask is (+size optimization) - pxor %xmm4,%xmm4 - pxor %xmm5,%xmm5 -___ -for($i=0;$i<$STRIDE/16;$i+=4) { -$code.=<<___; - movdqa `16*($i+0)-128`($bp),%xmm0 - movdqa `16*($i+1)-128`($bp),%xmm1 - movdqa `16*($i+2)-128`($bp),%xmm2 - movdqa `16*($i+3)-128`($bp),%xmm3 - pand `16*($i+0)-128`(%rdx),%xmm0 - pand `16*($i+1)-128`(%rdx),%xmm1 - por %xmm0,%xmm4 - pand `16*($i+2)-128`(%rdx),%xmm2 - por %xmm1,%xmm5 - pand `16*($i+3)-128`(%rdx),%xmm3 - por %xmm2,%xmm4 - por %xmm3,%xmm5 -___ -} -$code.=<<___; - por %xmm5,%xmm4 - pshufd \$0x4e,%xmm4,%xmm0 - por %xmm4,%xmm0 - lea $STRIDE($bp),$bp - movq %xmm0,$m0 # m0=bp[i] - - mov ($tp,$num),$A[0] - mov $n0,$m1 - mulq $m0 # ap[0]*bp[i] - add %rax,$A[0] # ap[0]*bp[i]+tp[0] - mov ($np),%rax - adc \$0,%rdx - - imulq $A[0],$m1 # tp[0]*n0 - mov %rdx,$A[1] - mov $N[1],($tp) # store upmost overflow bit - - lea ($tp,$num),$tp # rewind $tp - - mulq $m1 # np[0]*m1 - add %rax,$A[0] # "$N[0]", discarded - mov 8($ap,$num),%rax - adc \$0,%rdx - mov %rdx,$N[1] - - mulq $m0 # ap[j]*bp[i] - add %rax,$A[1] - mov 8*1($np),%rax - adc \$0,%rdx - add 8($tp),$A[1] # +tp[1] - adc \$0,%rdx - mov %rdx,$A[0] - - mulq $m1 # np[j]*m1 - add %rax,$N[1] - mov 16($ap,$num),%rax - adc \$0,%rdx - add $A[1],$N[1] # np[j]*m1+ap[j]*bp[i]+tp[j] - lea 4*8($num),$j # j=4 - lea 8*4($np),$np - adc \$0,%rdx - mov %rdx,$N[0] - jmp .Linner4x - -.align 32 -.Linner4x: - mulq $m0 # ap[j]*bp[i] - add %rax,$A[0] - mov -8*2($np),%rax - adc \$0,%rdx - add 16($tp),$A[0] # ap[j]*bp[i]+tp[j] - lea 32($tp),$tp - adc \$0,%rdx - mov %rdx,$A[1] - - mulq $m1 # np[j]*m1 - add %rax,$N[0] - mov -8($ap,$j),%rax - adc \$0,%rdx - add $A[0],$N[0] - adc \$0,%rdx - mov $N[1],-32($tp) # tp[j-1] - mov %rdx,$N[1] - - mulq $m0 # ap[j]*bp[i] - add %rax,$A[1] - mov -8*1($np),%rax - adc \$0,%rdx - add -8($tp),$A[1] - adc \$0,%rdx - mov %rdx,$A[0] - - mulq $m1 # np[j]*m1 - add %rax,$N[1] - mov ($ap,$j),%rax - adc \$0,%rdx - add $A[1],$N[1] - adc \$0,%rdx - mov $N[0],-24($tp) # tp[j-1] - mov %rdx,$N[0] - - mulq $m0 # ap[j]*bp[i] - add %rax,$A[0] - mov 8*0($np),%rax - adc \$0,%rdx - add ($tp),$A[0] # ap[j]*bp[i]+tp[j] - adc \$0,%rdx - mov %rdx,$A[1] - - mulq $m1 # np[j]*m1 - add %rax,$N[0] - mov 8($ap,$j),%rax - adc \$0,%rdx - add $A[0],$N[0] - adc \$0,%rdx - mov $N[1],-16($tp) # tp[j-1] - mov %rdx,$N[1] - - mulq $m0 # ap[j]*bp[i] - add %rax,$A[1] - mov 8*1($np),%rax - adc \$0,%rdx - add 8($tp),$A[1] - adc \$0,%rdx - mov %rdx,$A[0] - - mulq $m1 # np[j]*m1 - add %rax,$N[1] - mov 16($ap,$j),%rax - adc \$0,%rdx - add $A[1],$N[1] - lea 8*4($np),$np - adc \$0,%rdx - mov $N[0],-8($tp) # tp[j-1] - mov %rdx,$N[0] - - add \$32,$j # j+=4 - jnz .Linner4x - - mulq $m0 # ap[j]*bp[i] - add %rax,$A[0] - mov -8*2($np),%rax - adc \$0,%rdx - add 16($tp),$A[0] # ap[j]*bp[i]+tp[j] - lea 32($tp),$tp - adc \$0,%rdx - mov %rdx,$A[1] - - mulq $m1 # np[j]*m1 - add %rax,$N[0] - mov -8($ap),%rax - adc \$0,%rdx - add $A[0],$N[0] - adc \$0,%rdx - mov $N[1],-32($tp) # tp[j-1] - mov %rdx,$N[1] - - mulq $m0 # ap[j]*bp[i] - add %rax,$A[1] - mov $m1,%rax - mov -8*1($np),$m1 - adc \$0,%rdx - add -8($tp),$A[1] - adc \$0,%rdx - mov %rdx,$A[0] - - mulq $m1 # np[j]*m1 - add %rax,$N[1] - mov ($ap,$num),%rax # ap[0] - adc \$0,%rdx - add $A[1],$N[1] - adc \$0,%rdx - mov $N[0],-24($tp) # tp[j-1] - mov %rdx,$N[0] - - mov $N[1],-16($tp) # tp[j-1] - lea ($np,$num),$np # rewind $np - - xor $N[1],$N[1] - add $A[0],$N[0] - adc \$0,$N[1] - add ($tp),$N[0] # pull upmost overflow bit - adc \$0,$N[1] # upmost overflow bit - mov $N[0],-8($tp) - - cmp 16+8(%rsp),$bp - jb .Louter4x -___ -if (1) { -$code.=<<___; - xor %rax,%rax - sub $N[0],$m1 # compare top-most words - adc $j,$j # $j is zero - or $j,$N[1] - sub $N[1],%rax # %rax=-$N[1] - lea ($tp,$num),%rbx # tptr in .sqr4x_sub - mov ($np),%r12 - lea ($np),%rbp # nptr in .sqr4x_sub - mov %r9,%rcx - sar \$3+2,%rcx - mov 56+8(%rsp),%rdi # rptr in .sqr4x_sub - dec %r12 # so that after 'not' we get -n[0] - xor %r10,%r10 - mov 8*1(%rbp),%r13 - mov 8*2(%rbp),%r14 - mov 8*3(%rbp),%r15 - jmp .Lsqr4x_sub_entry -___ -} else { -my @ri=("%rax",$bp,$m0,$m1); -my $rp="%rdx"; -$code.=<<___ - xor \$1,$N[1] - lea ($tp,$num),$tp # rewind $tp - sar \$5,$num # cf=0 - lea ($np,$N[1],8),$np - mov 56+8(%rsp),$rp # restore $rp - jmp .Lsub4x - -.align 32 -.Lsub4x: - .byte 0x66 - mov 8*0($tp),@ri[0] - mov 8*1($tp),@ri[1] - .byte 0x66 - sbb 16*0($np),@ri[0] - mov 8*2($tp),@ri[2] - sbb 16*1($np),@ri[1] - mov 3*8($tp),@ri[3] - lea 4*8($tp),$tp - sbb 16*2($np),@ri[2] - mov @ri[0],8*0($rp) - sbb 16*3($np),@ri[3] - lea 16*4($np),$np - mov @ri[1],8*1($rp) - mov @ri[2],8*2($rp) - mov @ri[3],8*3($rp) - lea 8*4($rp),$rp - - inc $num - jnz .Lsub4x - - ret -___ -} -$code.=<<___; -.cfi_endproc -.size mul4x_internal,.-mul4x_internal -___ -}}} - {{{ -###################################################################### -# void GFp_bn_power5( -my $rptr="%rdi"; # BN_ULONG *rptr, -my $aptr="%rsi"; # const BN_ULONG *aptr, -my $bptr="%rdx"; # const void *table, -my $nptr="%rcx"; # const BN_ULONG *nptr, -my $n0 ="%r8"; # const BN_ULONG *n0); -my $num ="%r9"; # int num, has to be divisible by 8 - # int pwr - -my ($i,$j,$tptr)=("%rbp","%rcx",$rptr); -my @A0=("%r10","%r11"); -my @A1=("%r12","%r13"); -my ($a0,$a1,$ai)=("%r14","%r15","%rbx"); - -$code.=<<___; -.globl GFp_bn_power5 -.type GFp_bn_power5,\@function,6 -.align 32 -GFp_bn_power5: -.cfi_startproc - mov %rsp,%rax -.cfi_def_cfa_register %rax -___ -$code.=<<___ if ($addx); - leaq GFp_ia32cap_P(%rip),%r11 - mov 8(%r11),%r11d - and \$0x80108,%r11d - cmp \$0x80108,%r11d # check for AD*X+BMI2+BMI1 - je .Lpowerx5_enter -___ -$code.=<<___; - push %rbx -.cfi_push %rbx - push %rbp -.cfi_push %rbp - push %r12 -.cfi_push %r12 - push %r13 -.cfi_push %r13 - push %r14 -.cfi_push %r14 - push %r15 -.cfi_push %r15 -.Lpower5_prologue: - - shl \$3,${num}d # convert $num to bytes - lea ($num,$num,2),%r10d # 3*$num - neg $num - mov ($n0),$n0 # *n0 - - ############################################################## - # Ensure that stack frame doesn't alias with $rptr+3*$num - # modulo 4096, which covers ret[num], am[num] and n[num] - # (see bn_exp.c). This is done to allow memory disambiguation - # logic do its magic. [Extra 256 bytes is for power mask - # calculated from 7th argument, the index.] - # - lea -320(%rsp,$num,2),%r11 - mov %rsp,%rbp - sub $rptr,%r11 - and \$4095,%r11 - cmp %r11,%r10 - jb .Lpwr_sp_alt - sub %r11,%rbp # align with $aptr - lea -320(%rbp,$num,2),%rbp # future alloca(frame+2*num*8+256) - jmp .Lpwr_sp_done - -.align 32 -.Lpwr_sp_alt: - lea 4096-320(,$num,2),%r10 - lea -320(%rbp,$num,2),%rbp # future alloca(frame+2*num*8+256) - sub %r10,%r11 - mov \$0,%r10 - cmovc %r10,%r11 - sub %r11,%rbp -.Lpwr_sp_done: - and \$-64,%rbp - mov %rsp,%r11 - sub %rbp,%r11 - and \$-4096,%r11 - lea (%rbp,%r11),%rsp - mov (%rsp),%r10 - cmp %rbp,%rsp - ja .Lpwr_page_walk - jmp .Lpwr_page_walk_done - -.Lpwr_page_walk: - lea -4096(%rsp),%rsp - mov (%rsp),%r10 - cmp %rbp,%rsp - ja .Lpwr_page_walk -.Lpwr_page_walk_done: - - mov $num,%r10 - neg $num - - ############################################################## - # Stack layout - # - # +0 saved $num, used in reduction section - # +8 &t[2*$num], used in reduction section - # +32 saved *n0 - # +40 saved %rsp - # +48 t[2*$num] - # - mov $n0, 32(%rsp) - mov %rax, 40(%rsp) # save original %rsp -.cfi_cfa_expression %rsp+40,deref,+8 -.Lpower5_body: - movq $rptr,%xmm1 # save $rptr, used in sqr8x - movq $nptr,%xmm2 # save $nptr - movq %r10, %xmm3 # -$num, used in sqr8x - movq $bptr,%xmm4 - - call __bn_sqr8x_internal - call __bn_post4x_internal - call __bn_sqr8x_internal - call __bn_post4x_internal - call __bn_sqr8x_internal - call __bn_post4x_internal - call __bn_sqr8x_internal - call __bn_post4x_internal - call __bn_sqr8x_internal - call __bn_post4x_internal - - movq %xmm2,$nptr - movq %xmm4,$bptr - mov $aptr,$rptr - mov 40(%rsp),%rax - lea 32(%rsp),$n0 - - call mul4x_internal - - mov 40(%rsp),%rsi # restore %rsp -.cfi_def_cfa %rsi,8 - mov \$1,%rax - mov -48(%rsi),%r15 -.cfi_restore %r15 - mov -40(%rsi),%r14 -.cfi_restore %r14 - mov -32(%rsi),%r13 -.cfi_restore %r13 - mov -24(%rsi),%r12 -.cfi_restore %r12 - mov -16(%rsi),%rbp -.cfi_restore %rbp - mov -8(%rsi),%rbx -.cfi_restore %rbx - lea (%rsi),%rsp -.cfi_def_cfa_register %rsp -.Lpower5_epilogue: - ret -.cfi_endproc -.size GFp_bn_power5,.-GFp_bn_power5 - -.globl GFp_bn_sqr8x_internal -.hidden GFp_bn_sqr8x_internal -.type GFp_bn_sqr8x_internal,\@abi-omnipotent -.align 32 -GFp_bn_sqr8x_internal: -__bn_sqr8x_internal: -.cfi_startproc - ############################################################## - # Squaring part: - # - # a) multiply-n-add everything but a[i]*a[i]; - # b) shift result of a) by 1 to the left and accumulate - # a[i]*a[i] products; - # - ############################################################## - # a[1]a[0] - # a[2]a[0] - # a[3]a[0] - # a[2]a[1] - # a[4]a[0] - # a[3]a[1] - # a[5]a[0] - # a[4]a[1] - # a[3]a[2] - # a[6]a[0] - # a[5]a[1] - # a[4]a[2] - # a[7]a[0] - # a[6]a[1] - # a[5]a[2] - # a[4]a[3] - # a[7]a[1] - # a[6]a[2] - # a[5]a[3] - # a[7]a[2] - # a[6]a[3] - # a[5]a[4] - # a[7]a[3] - # a[6]a[4] - # a[7]a[4] - # a[6]a[5] - # a[7]a[5] - # a[7]a[6] - # a[1]a[0] - # a[2]a[0] - # a[3]a[0] - # a[4]a[0] - # a[5]a[0] - # a[6]a[0] - # a[7]a[0] - # a[2]a[1] - # a[3]a[1] - # a[4]a[1] - # a[5]a[1] - # a[6]a[1] - # a[7]a[1] - # a[3]a[2] - # a[4]a[2] - # a[5]a[2] - # a[6]a[2] - # a[7]a[2] - # a[4]a[3] - # a[5]a[3] - # a[6]a[3] - # a[7]a[3] - # a[5]a[4] - # a[6]a[4] - # a[7]a[4] - # a[6]a[5] - # a[7]a[5] - # a[7]a[6] - # a[0]a[0] - # a[1]a[1] - # a[2]a[2] - # a[3]a[3] - # a[4]a[4] - # a[5]a[5] - # a[6]a[6] - # a[7]a[7] - - lea 32(%r10),$i # $i=-($num-32) - lea ($aptr,$num),$aptr # end of a[] buffer, ($aptr,$i)=&ap[2] - - mov $num,$j # $j=$num - - # comments apply to $num==8 case - mov -32($aptr,$i),$a0 # a[0] - lea 48+8(%rsp,$num,2),$tptr # end of tp[] buffer, &tp[2*$num] - mov -24($aptr,$i),%rax # a[1] - lea -32($tptr,$i),$tptr # end of tp[] window, &tp[2*$num-"$i"] - mov -16($aptr,$i),$ai # a[2] - mov %rax,$a1 - - mul $a0 # a[1]*a[0] - mov %rax,$A0[0] # a[1]*a[0] - mov $ai,%rax # a[2] - mov %rdx,$A0[1] - mov $A0[0],-24($tptr,$i) # t[1] - - mul $a0 # a[2]*a[0] - add %rax,$A0[1] - mov $ai,%rax - adc \$0,%rdx - mov $A0[1],-16($tptr,$i) # t[2] - mov %rdx,$A0[0] - - - mov -8($aptr,$i),$ai # a[3] - mul $a1 # a[2]*a[1] - mov %rax,$A1[0] # a[2]*a[1]+t[3] - mov $ai,%rax - mov %rdx,$A1[1] - - lea ($i),$j - mul $a0 # a[3]*a[0] - add %rax,$A0[0] # a[3]*a[0]+a[2]*a[1]+t[3] - mov $ai,%rax - mov %rdx,$A0[1] - adc \$0,$A0[1] - add $A1[0],$A0[0] - adc \$0,$A0[1] - mov $A0[0],-8($tptr,$j) # t[3] - jmp .Lsqr4x_1st - -.align 32 -.Lsqr4x_1st: - mov ($aptr,$j),$ai # a[4] - mul $a1 # a[3]*a[1] - add %rax,$A1[1] # a[3]*a[1]+t[4] - mov $ai,%rax - mov %rdx,$A1[0] - adc \$0,$A1[0] - - mul $a0 # a[4]*a[0] - add %rax,$A0[1] # a[4]*a[0]+a[3]*a[1]+t[4] - mov $ai,%rax # a[3] - mov 8($aptr,$j),$ai # a[5] - mov %rdx,$A0[0] - adc \$0,$A0[0] - add $A1[1],$A0[1] - adc \$0,$A0[0] - - - mul $a1 # a[4]*a[3] - add %rax,$A1[0] # a[4]*a[3]+t[5] - mov $ai,%rax - mov $A0[1],($tptr,$j) # t[4] - mov %rdx,$A1[1] - adc \$0,$A1[1] - - mul $a0 # a[5]*a[2] - add %rax,$A0[0] # a[5]*a[2]+a[4]*a[3]+t[5] - mov $ai,%rax - mov 16($aptr,$j),$ai # a[6] - mov %rdx,$A0[1] - adc \$0,$A0[1] - add $A1[0],$A0[0] - adc \$0,$A0[1] - - mul $a1 # a[5]*a[3] - add %rax,$A1[1] # a[5]*a[3]+t[6] - mov $ai,%rax - mov $A0[0],8($tptr,$j) # t[5] - mov %rdx,$A1[0] - adc \$0,$A1[0] - - mul $a0 # a[6]*a[2] - add %rax,$A0[1] # a[6]*a[2]+a[5]*a[3]+t[6] - mov $ai,%rax # a[3] - mov 24($aptr,$j),$ai # a[7] - mov %rdx,$A0[0] - adc \$0,$A0[0] - add $A1[1],$A0[1] - adc \$0,$A0[0] - - - mul $a1 # a[6]*a[5] - add %rax,$A1[0] # a[6]*a[5]+t[7] - mov $ai,%rax - mov $A0[1],16($tptr,$j) # t[6] - mov %rdx,$A1[1] - adc \$0,$A1[1] - lea 32($j),$j - - mul $a0 # a[7]*a[4] - add %rax,$A0[0] # a[7]*a[4]+a[6]*a[5]+t[6] - mov $ai,%rax - mov %rdx,$A0[1] - adc \$0,$A0[1] - add $A1[0],$A0[0] - adc \$0,$A0[1] - mov $A0[0],-8($tptr,$j) # t[7] - - cmp \$0,$j - jne .Lsqr4x_1st - - mul $a1 # a[7]*a[5] - add %rax,$A1[1] - lea 16($i),$i - adc \$0,%rdx - add $A0[1],$A1[1] - adc \$0,%rdx - - mov $A1[1],($tptr) # t[8] - mov %rdx,$A1[0] - mov %rdx,8($tptr) # t[9] - jmp .Lsqr4x_outer - -.align 32 -.Lsqr4x_outer: # comments apply to $num==6 case - mov -32($aptr,$i),$a0 # a[0] - lea 48+8(%rsp,$num,2),$tptr # end of tp[] buffer, &tp[2*$num] - mov -24($aptr,$i),%rax # a[1] - lea -32($tptr,$i),$tptr # end of tp[] window, &tp[2*$num-"$i"] - mov -16($aptr,$i),$ai # a[2] - mov %rax,$a1 - - mul $a0 # a[1]*a[0] - mov -24($tptr,$i),$A0[0] # t[1] - add %rax,$A0[0] # a[1]*a[0]+t[1] - mov $ai,%rax # a[2] - adc \$0,%rdx - mov $A0[0],-24($tptr,$i) # t[1] - mov %rdx,$A0[1] - - mul $a0 # a[2]*a[0] - add %rax,$A0[1] - mov $ai,%rax - adc \$0,%rdx - add -16($tptr,$i),$A0[1] # a[2]*a[0]+t[2] - mov %rdx,$A0[0] - adc \$0,$A0[0] - mov $A0[1],-16($tptr,$i) # t[2] - - xor $A1[0],$A1[0] - - mov -8($aptr,$i),$ai # a[3] - mul $a1 # a[2]*a[1] - add %rax,$A1[0] # a[2]*a[1]+t[3] - mov $ai,%rax - adc \$0,%rdx - add -8($tptr,$i),$A1[0] - mov %rdx,$A1[1] - adc \$0,$A1[1] - - mul $a0 # a[3]*a[0] - add %rax,$A0[0] # a[3]*a[0]+a[2]*a[1]+t[3] - mov $ai,%rax - adc \$0,%rdx - add $A1[0],$A0[0] - mov %rdx,$A0[1] - adc \$0,$A0[1] - mov $A0[0],-8($tptr,$i) # t[3] - - lea ($i),$j - jmp .Lsqr4x_inner - -.align 32 -.Lsqr4x_inner: - mov ($aptr,$j),$ai # a[4] - mul $a1 # a[3]*a[1] - add %rax,$A1[1] # a[3]*a[1]+t[4] - mov $ai,%rax - mov %rdx,$A1[0] - adc \$0,$A1[0] - add ($tptr,$j),$A1[1] - adc \$0,$A1[0] - - .byte 0x67 - mul $a0 # a[4]*a[0] - add %rax,$A0[1] # a[4]*a[0]+a[3]*a[1]+t[4] - mov $ai,%rax # a[3] - mov 8($aptr,$j),$ai # a[5] - mov %rdx,$A0[0] - adc \$0,$A0[0] - add $A1[1],$A0[1] - adc \$0,$A0[0] - - mul $a1 # a[4]*a[3] - add %rax,$A1[0] # a[4]*a[3]+t[5] - mov $A0[1],($tptr,$j) # t[4] - mov $ai,%rax - mov %rdx,$A1[1] - adc \$0,$A1[1] - add 8($tptr,$j),$A1[0] - lea 16($j),$j # j++ - adc \$0,$A1[1] - - mul $a0 # a[5]*a[2] - add %rax,$A0[0] # a[5]*a[2]+a[4]*a[3]+t[5] - mov $ai,%rax - adc \$0,%rdx - add $A1[0],$A0[0] - mov %rdx,$A0[1] - adc \$0,$A0[1] - mov $A0[0],-8($tptr,$j) # t[5], "preloaded t[1]" below - - cmp \$0,$j - jne .Lsqr4x_inner - - .byte 0x67 - mul $a1 # a[5]*a[3] - add %rax,$A1[1] - adc \$0,%rdx - add $A0[1],$A1[1] - adc \$0,%rdx - - mov $A1[1],($tptr) # t[6], "preloaded t[2]" below - mov %rdx,$A1[0] - mov %rdx,8($tptr) # t[7], "preloaded t[3]" below - - add \$16,$i - jnz .Lsqr4x_outer - - # comments apply to $num==4 case - mov -32($aptr),$a0 # a[0] - lea 48+8(%rsp,$num,2),$tptr # end of tp[] buffer, &tp[2*$num] - mov -24($aptr),%rax # a[1] - lea -32($tptr,$i),$tptr # end of tp[] window, &tp[2*$num-"$i"] - mov -16($aptr),$ai # a[2] - mov %rax,$a1 - - mul $a0 # a[1]*a[0] - add %rax,$A0[0] # a[1]*a[0]+t[1], preloaded t[1] - mov $ai,%rax # a[2] - mov %rdx,$A0[1] - adc \$0,$A0[1] - - mul $a0 # a[2]*a[0] - add %rax,$A0[1] - mov $ai,%rax - mov $A0[0],-24($tptr) # t[1] - mov %rdx,$A0[0] - adc \$0,$A0[0] - add $A1[1],$A0[1] # a[2]*a[0]+t[2], preloaded t[2] - mov -8($aptr),$ai # a[3] - adc \$0,$A0[0] - - mul $a1 # a[2]*a[1] - add %rax,$A1[0] # a[2]*a[1]+t[3], preloaded t[3] - mov $ai,%rax - mov $A0[1],-16($tptr) # t[2] - mov %rdx,$A1[1] - adc \$0,$A1[1] - - mul $a0 # a[3]*a[0] - add %rax,$A0[0] # a[3]*a[0]+a[2]*a[1]+t[3] - mov $ai,%rax - mov %rdx,$A0[1] - adc \$0,$A0[1] - add $A1[0],$A0[0] - adc \$0,$A0[1] - mov $A0[0],-8($tptr) # t[3] - - mul $a1 # a[3]*a[1] - add %rax,$A1[1] - mov -16($aptr),%rax # a[2] - adc \$0,%rdx - add $A0[1],$A1[1] - adc \$0,%rdx - - mov $A1[1],($tptr) # t[4] - mov %rdx,$A1[0] - mov %rdx,8($tptr) # t[5] - - mul $ai # a[2]*a[3] -___ -{ -my ($shift,$carry)=($a0,$a1); -my @S=(@A1,$ai,$n0); -$code.=<<___; - add \$16,$i - xor $shift,$shift - sub $num,$i # $i=16-$num - xor $carry,$carry - - add $A1[0],%rax # t[5] - adc \$0,%rdx - mov %rax,8($tptr) # t[5] - mov %rdx,16($tptr) # t[6] - mov $carry,24($tptr) # t[7] - - mov -16($aptr,$i),%rax # a[0] - lea 48+8(%rsp),$tptr - xor $A0[0],$A0[0] # t[0] - mov 8($tptr),$A0[1] # t[1] - - lea ($shift,$A0[0],2),$S[0] # t[2*i]<<1 | shift - shr \$63,$A0[0] - lea ($j,$A0[1],2),$S[1] # t[2*i+1]<<1 | - shr \$63,$A0[1] - or $A0[0],$S[1] # | t[2*i]>>63 - mov 16($tptr),$A0[0] # t[2*i+2] # prefetch - mov $A0[1],$shift # shift=t[2*i+1]>>63 - mul %rax # a[i]*a[i] - neg $carry # mov $carry,cf - mov 24($tptr),$A0[1] # t[2*i+2+1] # prefetch - adc %rax,$S[0] - mov -8($aptr,$i),%rax # a[i+1] # prefetch - mov $S[0],($tptr) - adc %rdx,$S[1] - - lea ($shift,$A0[0],2),$S[2] # t[2*i]<<1 | shift - mov $S[1],8($tptr) - sbb $carry,$carry # mov cf,$carry - shr \$63,$A0[0] - lea ($j,$A0[1],2),$S[3] # t[2*i+1]<<1 | - shr \$63,$A0[1] - or $A0[0],$S[3] # | t[2*i]>>63 - mov 32($tptr),$A0[0] # t[2*i+2] # prefetch - mov $A0[1],$shift # shift=t[2*i+1]>>63 - mul %rax # a[i]*a[i] - neg $carry # mov $carry,cf - mov 40($tptr),$A0[1] # t[2*i+2+1] # prefetch - adc %rax,$S[2] - mov 0($aptr,$i),%rax # a[i+1] # prefetch - mov $S[2],16($tptr) - adc %rdx,$S[3] - lea 16($i),$i - mov $S[3],24($tptr) - sbb $carry,$carry # mov cf,$carry - lea 64($tptr),$tptr - jmp .Lsqr4x_shift_n_add - -.align 32 -.Lsqr4x_shift_n_add: - lea ($shift,$A0[0],2),$S[0] # t[2*i]<<1 | shift - shr \$63,$A0[0] - lea ($j,$A0[1],2),$S[1] # t[2*i+1]<<1 | - shr \$63,$A0[1] - or $A0[0],$S[1] # | t[2*i]>>63 - mov -16($tptr),$A0[0] # t[2*i+2] # prefetch - mov $A0[1],$shift # shift=t[2*i+1]>>63 - mul %rax # a[i]*a[i] - neg $carry # mov $carry,cf - mov -8($tptr),$A0[1] # t[2*i+2+1] # prefetch - adc %rax,$S[0] - mov -8($aptr,$i),%rax # a[i+1] # prefetch - mov $S[0],-32($tptr) - adc %rdx,$S[1] - - lea ($shift,$A0[0],2),$S[2] # t[2*i]<<1 | shift - mov $S[1],-24($tptr) - sbb $carry,$carry # mov cf,$carry - shr \$63,$A0[0] - lea ($j,$A0[1],2),$S[3] # t[2*i+1]<<1 | - shr \$63,$A0[1] - or $A0[0],$S[3] # | t[2*i]>>63 - mov 0($tptr),$A0[0] # t[2*i+2] # prefetch - mov $A0[1],$shift # shift=t[2*i+1]>>63 - mul %rax # a[i]*a[i] - neg $carry # mov $carry,cf - mov 8($tptr),$A0[1] # t[2*i+2+1] # prefetch - adc %rax,$S[2] - mov 0($aptr,$i),%rax # a[i+1] # prefetch - mov $S[2],-16($tptr) - adc %rdx,$S[3] - - lea ($shift,$A0[0],2),$S[0] # t[2*i]<<1 | shift - mov $S[3],-8($tptr) - sbb $carry,$carry # mov cf,$carry - shr \$63,$A0[0] - lea ($j,$A0[1],2),$S[1] # t[2*i+1]<<1 | - shr \$63,$A0[1] - or $A0[0],$S[1] # | t[2*i]>>63 - mov 16($tptr),$A0[0] # t[2*i+2] # prefetch - mov $A0[1],$shift # shift=t[2*i+1]>>63 - mul %rax # a[i]*a[i] - neg $carry # mov $carry,cf - mov 24($tptr),$A0[1] # t[2*i+2+1] # prefetch - adc %rax,$S[0] - mov 8($aptr,$i),%rax # a[i+1] # prefetch - mov $S[0],0($tptr) - adc %rdx,$S[1] - - lea ($shift,$A0[0],2),$S[2] # t[2*i]<<1 | shift - mov $S[1],8($tptr) - sbb $carry,$carry # mov cf,$carry - shr \$63,$A0[0] - lea ($j,$A0[1],2),$S[3] # t[2*i+1]<<1 | - shr \$63,$A0[1] - or $A0[0],$S[3] # | t[2*i]>>63 - mov 32($tptr),$A0[0] # t[2*i+2] # prefetch - mov $A0[1],$shift # shift=t[2*i+1]>>63 - mul %rax # a[i]*a[i] - neg $carry # mov $carry,cf - mov 40($tptr),$A0[1] # t[2*i+2+1] # prefetch - adc %rax,$S[2] - mov 16($aptr,$i),%rax # a[i+1] # prefetch - mov $S[2],16($tptr) - adc %rdx,$S[3] - mov $S[3],24($tptr) - sbb $carry,$carry # mov cf,$carry - lea 64($tptr),$tptr - add \$32,$i - jnz .Lsqr4x_shift_n_add - - lea ($shift,$A0[0],2),$S[0] # t[2*i]<<1 | shift - .byte 0x67 - shr \$63,$A0[0] - lea ($j,$A0[1],2),$S[1] # t[2*i+1]<<1 | - shr \$63,$A0[1] - or $A0[0],$S[1] # | t[2*i]>>63 - mov -16($tptr),$A0[0] # t[2*i+2] # prefetch - mov $A0[1],$shift # shift=t[2*i+1]>>63 - mul %rax # a[i]*a[i] - neg $carry # mov $carry,cf - mov -8($tptr),$A0[1] # t[2*i+2+1] # prefetch - adc %rax,$S[0] - mov -8($aptr),%rax # a[i+1] # prefetch - mov $S[0],-32($tptr) - adc %rdx,$S[1] - - lea ($shift,$A0[0],2),$S[2] # t[2*i]<<1|shift - mov $S[1],-24($tptr) - sbb $carry,$carry # mov cf,$carry - shr \$63,$A0[0] - lea ($j,$A0[1],2),$S[3] # t[2*i+1]<<1 | - shr \$63,$A0[1] - or $A0[0],$S[3] # | t[2*i]>>63 - mul %rax # a[i]*a[i] - neg $carry # mov $carry,cf - adc %rax,$S[2] - adc %rdx,$S[3] - mov $S[2],-16($tptr) - mov $S[3],-8($tptr) -___ -} -###################################################################### -# Montgomery reduction part, "word-by-word" algorithm. -# -# This new path is inspired by multiple submissions from Intel, by -# Shay Gueron, Vlad Krasnov, Erdinc Ozturk, James Guilford, -# Vinodh Gopal... -{ -my ($nptr,$tptr,$carry,$m0)=("%rbp","%rdi","%rsi","%rbx"); - -$code.=<<___; - movq %xmm2,$nptr -__bn_sqr8x_reduction: - xor %rax,%rax - lea ($nptr,$num),%rcx # end of n[] - lea 48+8(%rsp,$num,2),%rdx # end of t[] buffer - mov %rcx,0+8(%rsp) - lea 48+8(%rsp,$num),$tptr # end of initial t[] window - mov %rdx,8+8(%rsp) - neg $num - jmp .L8x_reduction_loop - -.align 32 -.L8x_reduction_loop: - lea ($tptr,$num),$tptr # start of current t[] window - .byte 0x66 - mov 8*0($tptr),$m0 - mov 8*1($tptr),%r9 - mov 8*2($tptr),%r10 - mov 8*3($tptr),%r11 - mov 8*4($tptr),%r12 - mov 8*5($tptr),%r13 - mov 8*6($tptr),%r14 - mov 8*7($tptr),%r15 - mov %rax,(%rdx) # store top-most carry bit - lea 8*8($tptr),$tptr - - .byte 0x67 - mov $m0,%r8 - imulq 32+8(%rsp),$m0 # n0*a[0] - mov 8*0($nptr),%rax # n[0] - mov \$8,%ecx - jmp .L8x_reduce - -.align 32 -.L8x_reduce: - mulq $m0 - mov 8*1($nptr),%rax # n[1] - neg %r8 - mov %rdx,%r8 - adc \$0,%r8 - - mulq $m0 - add %rax,%r9 - mov 8*2($nptr),%rax - adc \$0,%rdx - add %r9,%r8 - mov $m0,48-8+8(%rsp,%rcx,8) # put aside n0*a[i] - mov %rdx,%r9 - adc \$0,%r9 - - mulq $m0 - add %rax,%r10 - mov 8*3($nptr),%rax - adc \$0,%rdx - add %r10,%r9 - mov 32+8(%rsp),$carry # pull n0, borrow $carry - mov %rdx,%r10 - adc \$0,%r10 - - mulq $m0 - add %rax,%r11 - mov 8*4($nptr),%rax - adc \$0,%rdx - imulq %r8,$carry # modulo-scheduled - add %r11,%r10 - mov %rdx,%r11 - adc \$0,%r11 - - mulq $m0 - add %rax,%r12 - mov 8*5($nptr),%rax - adc \$0,%rdx - add %r12,%r11 - mov %rdx,%r12 - adc \$0,%r12 - - mulq $m0 - add %rax,%r13 - mov 8*6($nptr),%rax - adc \$0,%rdx - add %r13,%r12 - mov %rdx,%r13 - adc \$0,%r13 - - mulq $m0 - add %rax,%r14 - mov 8*7($nptr),%rax - adc \$0,%rdx - add %r14,%r13 - mov %rdx,%r14 - adc \$0,%r14 - - mulq $m0 - mov $carry,$m0 # n0*a[i] - add %rax,%r15 - mov 8*0($nptr),%rax # n[0] - adc \$0,%rdx - add %r15,%r14 - mov %rdx,%r15 - adc \$0,%r15 - - dec %ecx - jnz .L8x_reduce - - lea 8*8($nptr),$nptr - xor %rax,%rax - mov 8+8(%rsp),%rdx # pull end of t[] - cmp 0+8(%rsp),$nptr # end of n[]? - jae .L8x_no_tail - - .byte 0x66 - add 8*0($tptr),%r8 - adc 8*1($tptr),%r9 - adc 8*2($tptr),%r10 - adc 8*3($tptr),%r11 - adc 8*4($tptr),%r12 - adc 8*5($tptr),%r13 - adc 8*6($tptr),%r14 - adc 8*7($tptr),%r15 - sbb $carry,$carry # top carry - - mov 48+56+8(%rsp),$m0 # pull n0*a[0] - mov \$8,%ecx - mov 8*0($nptr),%rax - jmp .L8x_tail - -.align 32 -.L8x_tail: - mulq $m0 - add %rax,%r8 - mov 8*1($nptr),%rax - mov %r8,($tptr) # save result - mov %rdx,%r8 - adc \$0,%r8 - - mulq $m0 - add %rax,%r9 - mov 8*2($nptr),%rax - adc \$0,%rdx - add %r9,%r8 - lea 8($tptr),$tptr # $tptr++ - mov %rdx,%r9 - adc \$0,%r9 - - mulq $m0 - add %rax,%r10 - mov 8*3($nptr),%rax - adc \$0,%rdx - add %r10,%r9 - mov %rdx,%r10 - adc \$0,%r10 - - mulq $m0 - add %rax,%r11 - mov 8*4($nptr),%rax - adc \$0,%rdx - add %r11,%r10 - mov %rdx,%r11 - adc \$0,%r11 - - mulq $m0 - add %rax,%r12 - mov 8*5($nptr),%rax - adc \$0,%rdx - add %r12,%r11 - mov %rdx,%r12 - adc \$0,%r12 - - mulq $m0 - add %rax,%r13 - mov 8*6($nptr),%rax - adc \$0,%rdx - add %r13,%r12 - mov %rdx,%r13 - adc \$0,%r13 - - mulq $m0 - add %rax,%r14 - mov 8*7($nptr),%rax - adc \$0,%rdx - add %r14,%r13 - mov %rdx,%r14 - adc \$0,%r14 - - mulq $m0 - mov 48-16+8(%rsp,%rcx,8),$m0# pull n0*a[i] - add %rax,%r15 - adc \$0,%rdx - add %r15,%r14 - mov 8*0($nptr),%rax # pull n[0] - mov %rdx,%r15 - adc \$0,%r15 - - dec %ecx - jnz .L8x_tail - - lea 8*8($nptr),$nptr - mov 8+8(%rsp),%rdx # pull end of t[] - cmp 0+8(%rsp),$nptr # end of n[]? - jae .L8x_tail_done # break out of loop - - mov 48+56+8(%rsp),$m0 # pull n0*a[0] - neg $carry - mov 8*0($nptr),%rax # pull n[0] - adc 8*0($tptr),%r8 - adc 8*1($tptr),%r9 - adc 8*2($tptr),%r10 - adc 8*3($tptr),%r11 - adc 8*4($tptr),%r12 - adc 8*5($tptr),%r13 - adc 8*6($tptr),%r14 - adc 8*7($tptr),%r15 - sbb $carry,$carry # top carry - - mov \$8,%ecx - jmp .L8x_tail - -.align 32 -.L8x_tail_done: - xor %rax,%rax - add (%rdx),%r8 # can this overflow? - adc \$0,%r9 - adc \$0,%r10 - adc \$0,%r11 - adc \$0,%r12 - adc \$0,%r13 - adc \$0,%r14 - adc \$0,%r15 - adc \$0,%rax - - neg $carry -.L8x_no_tail: - adc 8*0($tptr),%r8 - adc 8*1($tptr),%r9 - adc 8*2($tptr),%r10 - adc 8*3($tptr),%r11 - adc 8*4($tptr),%r12 - adc 8*5($tptr),%r13 - adc 8*6($tptr),%r14 - adc 8*7($tptr),%r15 - adc \$0,%rax # top-most carry - mov -8($nptr),%rcx # np[num-1] - xor $carry,$carry - - movq %xmm2,$nptr # restore $nptr - - mov %r8,8*0($tptr) # store top 512 bits - mov %r9,8*1($tptr) - movq %xmm3,$num # $num is %r9, can't be moved upwards - mov %r10,8*2($tptr) - mov %r11,8*3($tptr) - mov %r12,8*4($tptr) - mov %r13,8*5($tptr) - mov %r14,8*6($tptr) - mov %r15,8*7($tptr) - lea 8*8($tptr),$tptr - - cmp %rdx,$tptr # end of t[]? - jb .L8x_reduction_loop - ret -.cfi_endproc -.size GFp_bn_sqr8x_internal,.-GFp_bn_sqr8x_internal -___ -} -############################################################## -# Post-condition, 4x unrolled -# -{ -my ($tptr,$nptr)=("%rbx","%rbp"); -$code.=<<___; -.type __bn_post4x_internal,\@abi-omnipotent -.align 32 -__bn_post4x_internal: -.cfi_startproc - mov 8*0($nptr),%r12 - lea (%rdi,$num),$tptr # %rdi was $tptr above - mov $num,%rcx - movq %xmm1,$rptr # restore $rptr - neg %rax - movq %xmm1,$aptr # prepare for back-to-back call - sar \$3+2,%rcx - dec %r12 # so that after 'not' we get -n[0] - xor %r10,%r10 - mov 8*1($nptr),%r13 - mov 8*2($nptr),%r14 - mov 8*3($nptr),%r15 - jmp .Lsqr4x_sub_entry - -.align 16 -.Lsqr4x_sub: - mov 8*0($nptr),%r12 - mov 8*1($nptr),%r13 - mov 8*2($nptr),%r14 - mov 8*3($nptr),%r15 -.Lsqr4x_sub_entry: - lea 8*4($nptr),$nptr - not %r12 - not %r13 - not %r14 - not %r15 - and %rax,%r12 - and %rax,%r13 - and %rax,%r14 - and %rax,%r15 - - neg %r10 # mov %r10,%cf - adc 8*0($tptr),%r12 - adc 8*1($tptr),%r13 - adc 8*2($tptr),%r14 - adc 8*3($tptr),%r15 - mov %r12,8*0($rptr) - lea 8*4($tptr),$tptr - mov %r13,8*1($rptr) - sbb %r10,%r10 # mov %cf,%r10 - mov %r14,8*2($rptr) - mov %r15,8*3($rptr) - lea 8*4($rptr),$rptr - - inc %rcx # pass %cf - jnz .Lsqr4x_sub - - mov $num,%r10 # prepare for back-to-back call - neg $num # restore $num - ret -.cfi_endproc -.size __bn_post4x_internal,.-__bn_post4x_internal -___ -} -{ -$code.=<<___; -.globl GFp_bn_from_montgomery -.type GFp_bn_from_montgomery,\@abi-omnipotent -.align 32 -GFp_bn_from_montgomery: -.cfi_startproc - testl \$7,`($win64?"48(%rsp)":"%r9d")` - jz bn_from_mont8x - xor %eax,%eax - ret -.cfi_endproc -.size GFp_bn_from_montgomery,.-GFp_bn_from_montgomery - -.type bn_from_mont8x,\@function,6 -.align 32 -bn_from_mont8x: -.cfi_startproc - .byte 0x67 - mov %rsp,%rax -.cfi_def_cfa_register %rax - push %rbx -.cfi_push %rbx - push %rbp -.cfi_push %rbp - push %r12 -.cfi_push %r12 - push %r13 -.cfi_push %r13 - push %r14 -.cfi_push %r14 - push %r15 -.cfi_push %r15 -.Lfrom_prologue: - - shl \$3,${num}d # convert $num to bytes - lea ($num,$num,2),%r10 # 3*$num in bytes - neg $num - mov ($n0),$n0 # *n0 - - ############################################################## - # Ensure that stack frame doesn't alias with $rptr+3*$num - # modulo 4096, which covers ret[num], am[num] and n[num] - # (see bn_exp.c). The stack is allocated to aligned with - # GFp_bn_power5's frame, and as GFp_bn_from_montgomery happens to be - # last operation, we use the opportunity to cleanse it. - # - lea -320(%rsp,$num,2),%r11 - mov %rsp,%rbp - sub $rptr,%r11 - and \$4095,%r11 - cmp %r11,%r10 - jb .Lfrom_sp_alt - sub %r11,%rbp # align with $aptr - lea -320(%rbp,$num,2),%rbp # future alloca(frame+2*$num*8+256) - jmp .Lfrom_sp_done - -.align 32 -.Lfrom_sp_alt: - lea 4096-320(,$num,2),%r10 - lea -320(%rbp,$num,2),%rbp # future alloca(frame+2*$num*8+256) - sub %r10,%r11 - mov \$0,%r10 - cmovc %r10,%r11 - sub %r11,%rbp -.Lfrom_sp_done: - and \$-64,%rbp - mov %rsp,%r11 - sub %rbp,%r11 - and \$-4096,%r11 - lea (%rbp,%r11),%rsp - mov (%rsp),%r10 - cmp %rbp,%rsp - ja .Lfrom_page_walk - jmp .Lfrom_page_walk_done - -.Lfrom_page_walk: - lea -4096(%rsp),%rsp - mov (%rsp),%r10 - cmp %rbp,%rsp - ja .Lfrom_page_walk -.Lfrom_page_walk_done: - - mov $num,%r10 - neg $num - - ############################################################## - # Stack layout - # - # +0 saved $num, used in reduction section - # +8 &t[2*$num], used in reduction section - # +32 saved *n0 - # +40 saved %rsp - # +48 t[2*$num] - # - mov $n0, 32(%rsp) - mov %rax, 40(%rsp) # save original %rsp -.cfi_cfa_expression %rsp+40,deref,+8 -.Lfrom_body: - mov $num,%r11 - lea 48(%rsp),%rax - pxor %xmm0,%xmm0 - jmp .Lmul_by_1 - -.align 32 -.Lmul_by_1: - movdqu ($aptr),%xmm1 - movdqu 16($aptr),%xmm2 - movdqu 32($aptr),%xmm3 - movdqa %xmm0,(%rax,$num) - movdqu 48($aptr),%xmm4 - movdqa %xmm0,16(%rax,$num) - .byte 0x48,0x8d,0xb6,0x40,0x00,0x00,0x00 # lea 64($aptr),$aptr - movdqa %xmm1,(%rax) - movdqa %xmm0,32(%rax,$num) - movdqa %xmm2,16(%rax) - movdqa %xmm0,48(%rax,$num) - movdqa %xmm3,32(%rax) - movdqa %xmm4,48(%rax) - lea 64(%rax),%rax - sub \$64,%r11 - jnz .Lmul_by_1 - - movq $rptr,%xmm1 - movq $nptr,%xmm2 - .byte 0x67 - mov $nptr,%rbp - movq %r10, %xmm3 # -num -___ -$code.=<<___ if ($addx); - leaq GFp_ia32cap_P(%rip),%r11 - mov 8(%r11),%r11d - and \$0x80108,%r11d - cmp \$0x80108,%r11d # check for AD*X+BMI2+BMI1 - jne .Lfrom_mont_nox - - lea (%rax,$num),$rptr - call __bn_sqrx8x_reduction - call __bn_postx4x_internal - - pxor %xmm0,%xmm0 - lea 48(%rsp),%rax - jmp .Lfrom_mont_zero - -.align 32 -.Lfrom_mont_nox: -___ -$code.=<<___; - call __bn_sqr8x_reduction - call __bn_post4x_internal - - pxor %xmm0,%xmm0 - lea 48(%rsp),%rax - jmp .Lfrom_mont_zero - -.align 32 -.Lfrom_mont_zero: - mov 40(%rsp),%rsi # restore %rsp -.cfi_def_cfa %rsi,8 - movdqa %xmm0,16*0(%rax) - movdqa %xmm0,16*1(%rax) - movdqa %xmm0,16*2(%rax) - movdqa %xmm0,16*3(%rax) - lea 16*4(%rax),%rax - sub \$32,$num - jnz .Lfrom_mont_zero - - mov \$1,%rax - mov -48(%rsi),%r15 -.cfi_restore %r15 - mov -40(%rsi),%r14 -.cfi_restore %r14 - mov -32(%rsi),%r13 -.cfi_restore %r13 - mov -24(%rsi),%r12 -.cfi_restore %r12 - mov -16(%rsi),%rbp -.cfi_restore %rbp - mov -8(%rsi),%rbx -.cfi_restore %rbx - lea (%rsi),%rsp -.cfi_def_cfa_register %rsp -.Lfrom_epilogue: - ret -.cfi_endproc -.size bn_from_mont8x,.-bn_from_mont8x -___ -} -}}} - -if ($addx) {{{ -my $bp="%rdx"; # restore original value - -$code.=<<___; -.type bn_mulx4x_mont_gather5,\@function,6 -.align 32 -bn_mulx4x_mont_gather5: -.cfi_startproc - mov %rsp,%rax -.cfi_def_cfa_register %rax -.Lmulx4x_enter: - push %rbx -.cfi_push %rbx - push %rbp -.cfi_push %rbp - push %r12 -.cfi_push %r12 - push %r13 -.cfi_push %r13 - push %r14 -.cfi_push %r14 - push %r15 -.cfi_push %r15 -.Lmulx4x_prologue: - - shl \$3,${num}d # convert $num to bytes - lea ($num,$num,2),%r10 # 3*$num in bytes - neg $num # -$num - mov ($n0),$n0 # *n0 - - ############################################################## - # Ensure that stack frame doesn't alias with $rptr+3*$num - # modulo 4096, which covers ret[num], am[num] and n[num] - # (see bn_exp.c). This is done to allow memory disambiguation - # logic do its magic. [Extra [num] is allocated in order - # to align with GFp_bn_power5's frame, which is cleansed after - # completing exponentiation. Extra 256 bytes is for power mask - # calculated from 7th argument, the index.] - # - lea -320(%rsp,$num,2),%r11 - mov %rsp,%rbp - sub $rp,%r11 - and \$4095,%r11 - cmp %r11,%r10 - jb .Lmulx4xsp_alt - sub %r11,%rbp # align with $aptr - lea -320(%rbp,$num,2),%rbp # future alloca(frame+2*$num*8+256) - jmp .Lmulx4xsp_done - -.Lmulx4xsp_alt: - lea 4096-320(,$num,2),%r10 - lea -320(%rbp,$num,2),%rbp # future alloca(frame+2*$num*8+256) - sub %r10,%r11 - mov \$0,%r10 - cmovc %r10,%r11 - sub %r11,%rbp -.Lmulx4xsp_done: - and \$-64,%rbp # ensure alignment - mov %rsp,%r11 - sub %rbp,%r11 - and \$-4096,%r11 - lea (%rbp,%r11),%rsp - mov (%rsp),%r10 - cmp %rbp,%rsp - ja .Lmulx4x_page_walk - jmp .Lmulx4x_page_walk_done - -.Lmulx4x_page_walk: - lea -4096(%rsp),%rsp - mov (%rsp),%r10 - cmp %rbp,%rsp - ja .Lmulx4x_page_walk -.Lmulx4x_page_walk_done: - - ############################################################## - # Stack layout - # +0 -num - # +8 off-loaded &b[i] - # +16 end of b[num] - # +24 inner counter - # +32 saved n0 - # +40 saved %rsp - # +48 - # +56 saved rp - # +64 tmp[num+1] - # - mov $n0, 32(%rsp) # save *n0 - mov %rax,40(%rsp) # save original %rsp -.cfi_cfa_expression %rsp+40,deref,+8 -.Lmulx4x_body: - call mulx4x_internal - - mov 40(%rsp),%rsi # restore %rsp -.cfi_def_cfa %rsi,8 - mov \$1,%rax - - mov -48(%rsi),%r15 -.cfi_restore %r15 - mov -40(%rsi),%r14 -.cfi_restore %r14 - mov -32(%rsi),%r13 -.cfi_restore %r13 - mov -24(%rsi),%r12 -.cfi_restore %r12 - mov -16(%rsi),%rbp -.cfi_restore %rbp - mov -8(%rsi),%rbx -.cfi_restore %rbx - lea (%rsi),%rsp -.cfi_def_cfa_register %rsp -.Lmulx4x_epilogue: - ret -.cfi_endproc -.size bn_mulx4x_mont_gather5,.-bn_mulx4x_mont_gather5 - -.type mulx4x_internal,\@abi-omnipotent -.align 32 -mulx4x_internal: -.cfi_startproc - mov $num,8(%rsp) # save -$num (it was in bytes) - mov $num,%r10 - neg $num # restore $num - shl \$5,$num - neg %r10 # restore $num - lea 128($bp,$num),%r13 # end of powers table (+size optimization) - shr \$5+5,$num - movd `($win64?56:8)`(%rax),%xmm5 # load 7th argument - sub \$1,$num - lea .Linc(%rip),%rax - mov %r13,16+8(%rsp) # end of b[num] - mov $num,24+8(%rsp) # inner counter - mov $rp, 56+8(%rsp) # save $rp -___ -my ($aptr, $bptr, $nptr, $tptr, $mi, $bi, $zero, $num)= - ("%rsi","%rdi","%rcx","%rbx","%r8","%r9","%rbp","%rax"); -my $rptr=$bptr; -my $STRIDE=2**5*8; # 5 is "window size" -my $N=$STRIDE/4; # should match cache line size -$code.=<<___; - movdqa 0(%rax),%xmm0 # 00000001000000010000000000000000 - movdqa 16(%rax),%xmm1 # 00000002000000020000000200000002 - lea 88-112(%rsp,%r10),%r10 # place the mask after tp[num+1] (+ICache optimization) - lea 128($bp),$bptr # size optimization - - pshufd \$0,%xmm5,%xmm5 # broadcast index - movdqa %xmm1,%xmm4 - .byte 0x67 - movdqa %xmm1,%xmm2 -___ -######################################################################## -# calculate mask by comparing 0..31 to index and save result to stack -# -$code.=<<___; - .byte 0x67 - paddd %xmm0,%xmm1 - pcmpeqd %xmm5,%xmm0 # compare to 1,0 - movdqa %xmm4,%xmm3 -___ -for($i=0;$i<$STRIDE/16-4;$i+=4) { -$code.=<<___; - paddd %xmm1,%xmm2 - pcmpeqd %xmm5,%xmm1 # compare to 3,2 - movdqa %xmm0,`16*($i+0)+112`(%r10) - movdqa %xmm4,%xmm0 - - paddd %xmm2,%xmm3 - pcmpeqd %xmm5,%xmm2 # compare to 5,4 - movdqa %xmm1,`16*($i+1)+112`(%r10) - movdqa %xmm4,%xmm1 - - paddd %xmm3,%xmm0 - pcmpeqd %xmm5,%xmm3 # compare to 7,6 - movdqa %xmm2,`16*($i+2)+112`(%r10) - movdqa %xmm4,%xmm2 - - paddd %xmm0,%xmm1 - pcmpeqd %xmm5,%xmm0 - movdqa %xmm3,`16*($i+3)+112`(%r10) - movdqa %xmm4,%xmm3 -___ -} -$code.=<<___; # last iteration can be optimized - .byte 0x67 - paddd %xmm1,%xmm2 - pcmpeqd %xmm5,%xmm1 - movdqa %xmm0,`16*($i+0)+112`(%r10) - - paddd %xmm2,%xmm3 - pcmpeqd %xmm5,%xmm2 - movdqa %xmm1,`16*($i+1)+112`(%r10) - - pcmpeqd %xmm5,%xmm3 - movdqa %xmm2,`16*($i+2)+112`(%r10) - - pand `16*($i+0)-128`($bptr),%xmm0 # while it's still in register - pand `16*($i+1)-128`($bptr),%xmm1 - pand `16*($i+2)-128`($bptr),%xmm2 - movdqa %xmm3,`16*($i+3)+112`(%r10) - pand `16*($i+3)-128`($bptr),%xmm3 - por %xmm2,%xmm0 - por %xmm3,%xmm1 -___ -for($i=0;$i<$STRIDE/16-4;$i+=4) { -$code.=<<___; - movdqa `16*($i+0)-128`($bptr),%xmm4 - movdqa `16*($i+1)-128`($bptr),%xmm5 - movdqa `16*($i+2)-128`($bptr),%xmm2 - pand `16*($i+0)+112`(%r10),%xmm4 - movdqa `16*($i+3)-128`($bptr),%xmm3 - pand `16*($i+1)+112`(%r10),%xmm5 - por %xmm4,%xmm0 - pand `16*($i+2)+112`(%r10),%xmm2 - por %xmm5,%xmm1 - pand `16*($i+3)+112`(%r10),%xmm3 - por %xmm2,%xmm0 - por %xmm3,%xmm1 -___ -} -$code.=<<___; - pxor %xmm1,%xmm0 - pshufd \$0x4e,%xmm0,%xmm1 - por %xmm1,%xmm0 - lea $STRIDE($bptr),$bptr - movq %xmm0,%rdx # bp[0] - lea 64+8*4+8(%rsp),$tptr - - mov %rdx,$bi - mulx 0*8($aptr),$mi,%rax # a[0]*b[0] - mulx 1*8($aptr),%r11,%r12 # a[1]*b[0] - add %rax,%r11 - mulx 2*8($aptr),%rax,%r13 # ... - adc %rax,%r12 - adc \$0,%r13 - mulx 3*8($aptr),%rax,%r14 - - mov $mi,%r15 - imulq 32+8(%rsp),$mi # "t[0]"*n0 - xor $zero,$zero # cf=0, of=0 - mov $mi,%rdx - - mov $bptr,8+8(%rsp) # off-load &b[i] - - lea 4*8($aptr),$aptr - adcx %rax,%r13 - adcx $zero,%r14 # cf=0 - - mulx 0*8($nptr),%rax,%r10 - adcx %rax,%r15 # discarded - adox %r11,%r10 - mulx 1*8($nptr),%rax,%r11 - adcx %rax,%r10 - adox %r12,%r11 - mulx 2*8($nptr),%rax,%r12 - mov 24+8(%rsp),$bptr # counter value - mov %r10,-8*4($tptr) - adcx %rax,%r11 - adox %r13,%r12 - mulx 3*8($nptr),%rax,%r15 - mov $bi,%rdx - mov %r11,-8*3($tptr) - adcx %rax,%r12 - adox $zero,%r15 # of=0 - lea 4*8($nptr),$nptr - mov %r12,-8*2($tptr) - jmp .Lmulx4x_1st - -.align 32 -.Lmulx4x_1st: - adcx $zero,%r15 # cf=0, modulo-scheduled - mulx 0*8($aptr),%r10,%rax # a[4]*b[0] - adcx %r14,%r10 - mulx 1*8($aptr),%r11,%r14 # a[5]*b[0] - adcx %rax,%r11 - mulx 2*8($aptr),%r12,%rax # ... - adcx %r14,%r12 - mulx 3*8($aptr),%r13,%r14 - .byte 0x67,0x67 - mov $mi,%rdx - adcx %rax,%r13 - adcx $zero,%r14 # cf=0 - lea 4*8($aptr),$aptr - lea 4*8($tptr),$tptr - - adox %r15,%r10 - mulx 0*8($nptr),%rax,%r15 - adcx %rax,%r10 - adox %r15,%r11 - mulx 1*8($nptr),%rax,%r15 - adcx %rax,%r11 - adox %r15,%r12 - mulx 2*8($nptr),%rax,%r15 - mov %r10,-5*8($tptr) - adcx %rax,%r12 - mov %r11,-4*8($tptr) - adox %r15,%r13 - mulx 3*8($nptr),%rax,%r15 - mov $bi,%rdx - mov %r12,-3*8($tptr) - adcx %rax,%r13 - adox $zero,%r15 - lea 4*8($nptr),$nptr - mov %r13,-2*8($tptr) - - dec $bptr # of=0, pass cf - jnz .Lmulx4x_1st - - mov 8(%rsp),$num # load -num - adc $zero,%r15 # modulo-scheduled - lea ($aptr,$num),$aptr # rewind $aptr - add %r15,%r14 - mov 8+8(%rsp),$bptr # re-load &b[i] - adc $zero,$zero # top-most carry - mov %r14,-1*8($tptr) - jmp .Lmulx4x_outer - -.align 32 -.Lmulx4x_outer: - lea 16-256($tptr),%r10 # where 256-byte mask is (+density control) - pxor %xmm4,%xmm4 - .byte 0x67,0x67 - pxor %xmm5,%xmm5 -___ -for($i=0;$i<$STRIDE/16;$i+=4) { -$code.=<<___; - movdqa `16*($i+0)-128`($bptr),%xmm0 - movdqa `16*($i+1)-128`($bptr),%xmm1 - movdqa `16*($i+2)-128`($bptr),%xmm2 - pand `16*($i+0)+256`(%r10),%xmm0 - movdqa `16*($i+3)-128`($bptr),%xmm3 - pand `16*($i+1)+256`(%r10),%xmm1 - por %xmm0,%xmm4 - pand `16*($i+2)+256`(%r10),%xmm2 - por %xmm1,%xmm5 - pand `16*($i+3)+256`(%r10),%xmm3 - por %xmm2,%xmm4 - por %xmm3,%xmm5 -___ -} -$code.=<<___; - por %xmm5,%xmm4 - pshufd \$0x4e,%xmm4,%xmm0 - por %xmm4,%xmm0 - lea $STRIDE($bptr),$bptr - movq %xmm0,%rdx # m0=bp[i] - - mov $zero,($tptr) # save top-most carry - lea 4*8($tptr,$num),$tptr # rewind $tptr - mulx 0*8($aptr),$mi,%r11 # a[0]*b[i] - xor $zero,$zero # cf=0, of=0 - mov %rdx,$bi - mulx 1*8($aptr),%r14,%r12 # a[1]*b[i] - adox -4*8($tptr),$mi # +t[0] - adcx %r14,%r11 - mulx 2*8($aptr),%r15,%r13 # ... - adox -3*8($tptr),%r11 - adcx %r15,%r12 - mulx 3*8($aptr),%rdx,%r14 - adox -2*8($tptr),%r12 - adcx %rdx,%r13 - lea ($nptr,$num),$nptr # rewind $nptr - lea 4*8($aptr),$aptr - adox -1*8($tptr),%r13 - adcx $zero,%r14 - adox $zero,%r14 - - mov $mi,%r15 - imulq 32+8(%rsp),$mi # "t[0]"*n0 - - mov $mi,%rdx - xor $zero,$zero # cf=0, of=0 - mov $bptr,8+8(%rsp) # off-load &b[i] - - mulx 0*8($nptr),%rax,%r10 - adcx %rax,%r15 # discarded - adox %r11,%r10 - mulx 1*8($nptr),%rax,%r11 - adcx %rax,%r10 - adox %r12,%r11 - mulx 2*8($nptr),%rax,%r12 - adcx %rax,%r11 - adox %r13,%r12 - mulx 3*8($nptr),%rax,%r15 - mov $bi,%rdx - mov 24+8(%rsp),$bptr # counter value - mov %r10,-8*4($tptr) - adcx %rax,%r12 - mov %r11,-8*3($tptr) - adox $zero,%r15 # of=0 - mov %r12,-8*2($tptr) - lea 4*8($nptr),$nptr - jmp .Lmulx4x_inner - -.align 32 -.Lmulx4x_inner: - mulx 0*8($aptr),%r10,%rax # a[4]*b[i] - adcx $zero,%r15 # cf=0, modulo-scheduled - adox %r14,%r10 - mulx 1*8($aptr),%r11,%r14 # a[5]*b[i] - adcx 0*8($tptr),%r10 - adox %rax,%r11 - mulx 2*8($aptr),%r12,%rax # ... - adcx 1*8($tptr),%r11 - adox %r14,%r12 - mulx 3*8($aptr),%r13,%r14 - mov $mi,%rdx - adcx 2*8($tptr),%r12 - adox %rax,%r13 - adcx 3*8($tptr),%r13 - adox $zero,%r14 # of=0 - lea 4*8($aptr),$aptr - lea 4*8($tptr),$tptr - adcx $zero,%r14 # cf=0 - - adox %r15,%r10 - mulx 0*8($nptr),%rax,%r15 - adcx %rax,%r10 - adox %r15,%r11 - mulx 1*8($nptr),%rax,%r15 - adcx %rax,%r11 - adox %r15,%r12 - mulx 2*8($nptr),%rax,%r15 - mov %r10,-5*8($tptr) - adcx %rax,%r12 - adox %r15,%r13 - mov %r11,-4*8($tptr) - mulx 3*8($nptr),%rax,%r15 - mov $bi,%rdx - lea 4*8($nptr),$nptr - mov %r12,-3*8($tptr) - adcx %rax,%r13 - adox $zero,%r15 - mov %r13,-2*8($tptr) - - dec $bptr # of=0, pass cf - jnz .Lmulx4x_inner - - mov 0+8(%rsp),$num # load -num - adc $zero,%r15 # modulo-scheduled - sub 0*8($tptr),$bptr # pull top-most carry to %cf - mov 8+8(%rsp),$bptr # re-load &b[i] - mov 16+8(%rsp),%r10 - adc %r15,%r14 - lea ($aptr,$num),$aptr # rewind $aptr - adc $zero,$zero # top-most carry - mov %r14,-1*8($tptr) - - cmp %r10,$bptr - jb .Lmulx4x_outer - - mov -8($nptr),%r10 - mov $zero,%r8 - mov ($nptr,$num),%r12 - lea ($nptr,$num),%rbp # rewind $nptr - mov $num,%rcx - lea ($tptr,$num),%rdi # rewind $tptr - xor %eax,%eax - xor %r15,%r15 - sub %r14,%r10 # compare top-most words - adc %r15,%r15 - or %r15,%r8 - sar \$3+2,%rcx - sub %r8,%rax # %rax=-%r8 - mov 56+8(%rsp),%rdx # restore rp - dec %r12 # so that after 'not' we get -n[0] - mov 8*1(%rbp),%r13 - xor %r8,%r8 - mov 8*2(%rbp),%r14 - mov 8*3(%rbp),%r15 - jmp .Lsqrx4x_sub_entry # common post-condition -.cfi_endproc -.size mulx4x_internal,.-mulx4x_internal -___ -} { -###################################################################### -# void GFp_bn_power5( -my $rptr="%rdi"; # BN_ULONG *rptr, -my $aptr="%rsi"; # const BN_ULONG *aptr, -my $bptr="%rdx"; # const void *table, -my $nptr="%rcx"; # const BN_ULONG *nptr, -my $n0 ="%r8"; # const BN_ULONG *n0); -my $num ="%r9"; # int num, has to be divisible by 8 - # int pwr); - -my ($i,$j,$tptr)=("%rbp","%rcx",$rptr); -my @A0=("%r10","%r11"); -my @A1=("%r12","%r13"); -my ($a0,$a1,$ai)=("%r14","%r15","%rbx"); - -$code.=<<___; -.type bn_powerx5,\@function,6 -.align 32 -bn_powerx5: -.cfi_startproc - mov %rsp,%rax -.cfi_def_cfa_register %rax -.Lpowerx5_enter: - push %rbx -.cfi_push %rbx - push %rbp -.cfi_push %rbp - push %r12 -.cfi_push %r12 - push %r13 -.cfi_push %r13 - push %r14 -.cfi_push %r14 - push %r15 -.cfi_push %r15 -.Lpowerx5_prologue: - - shl \$3,${num}d # convert $num to bytes - lea ($num,$num,2),%r10 # 3*$num in bytes - neg $num - mov ($n0),$n0 # *n0 - - ############################################################## - # Ensure that stack frame doesn't alias with $rptr+3*$num - # modulo 4096, which covers ret[num], am[num] and n[num] - # (see bn_exp.c). This is done to allow memory disambiguation - # logic do its magic. [Extra 256 bytes is for power mask - # calculated from 7th argument, the index.] - # - lea -320(%rsp,$num,2),%r11 - mov %rsp,%rbp - sub $rptr,%r11 - and \$4095,%r11 - cmp %r11,%r10 - jb .Lpwrx_sp_alt - sub %r11,%rbp # align with $aptr - lea -320(%rbp,$num,2),%rbp # future alloca(frame+2*$num*8+256) - jmp .Lpwrx_sp_done - -.align 32 -.Lpwrx_sp_alt: - lea 4096-320(,$num,2),%r10 - lea -320(%rbp,$num,2),%rbp # alloca(frame+2*$num*8+256) - sub %r10,%r11 - mov \$0,%r10 - cmovc %r10,%r11 - sub %r11,%rbp -.Lpwrx_sp_done: - and \$-64,%rbp - mov %rsp,%r11 - sub %rbp,%r11 - and \$-4096,%r11 - lea (%rbp,%r11),%rsp - mov (%rsp),%r10 - cmp %rbp,%rsp - ja .Lpwrx_page_walk - jmp .Lpwrx_page_walk_done - -.Lpwrx_page_walk: - lea -4096(%rsp),%rsp - mov (%rsp),%r10 - cmp %rbp,%rsp - ja .Lpwrx_page_walk -.Lpwrx_page_walk_done: - - mov $num,%r10 - neg $num - - ############################################################## - # Stack layout - # - # +0 saved $num, used in reduction section - # +8 &t[2*$num], used in reduction section - # +16 intermediate carry bit - # +24 top-most carry bit, used in reduction section - # +32 saved *n0 - # +40 saved %rsp - # +48 t[2*$num] - # - pxor %xmm0,%xmm0 - movq $rptr,%xmm1 # save $rptr - movq $nptr,%xmm2 # save $nptr - movq %r10, %xmm3 # -$num - movq $bptr,%xmm4 - mov $n0, 32(%rsp) - mov %rax, 40(%rsp) # save original %rsp -.cfi_cfa_expression %rsp+40,deref,+8 -.Lpowerx5_body: - - call __bn_sqrx8x_internal - call __bn_postx4x_internal - call __bn_sqrx8x_internal - call __bn_postx4x_internal - call __bn_sqrx8x_internal - call __bn_postx4x_internal - call __bn_sqrx8x_internal - call __bn_postx4x_internal - call __bn_sqrx8x_internal - call __bn_postx4x_internal - - mov %r10,$num # -num - mov $aptr,$rptr - movq %xmm2,$nptr - movq %xmm4,$bptr - mov 40(%rsp),%rax - - call mulx4x_internal - - mov 40(%rsp),%rsi # restore %rsp -.cfi_def_cfa %rsi,8 - mov \$1,%rax - - mov -48(%rsi),%r15 -.cfi_restore %r15 - mov -40(%rsi),%r14 -.cfi_restore %r14 - mov -32(%rsi),%r13 -.cfi_restore %r13 - mov -24(%rsi),%r12 -.cfi_restore %r12 - mov -16(%rsi),%rbp -.cfi_restore %rbp - mov -8(%rsi),%rbx -.cfi_restore %rbx - lea (%rsi),%rsp -.cfi_def_cfa_register %rsp -.Lpowerx5_epilogue: - ret -.cfi_endproc -.size bn_powerx5,.-bn_powerx5 - -.globl GFp_bn_sqrx8x_internal -.type GFp_bn_sqrx8x_internal,\@abi-omnipotent -.align 32 -GFp_bn_sqrx8x_internal: -__bn_sqrx8x_internal: -.cfi_startproc - ################################################################## - # Squaring part: - # - # a) multiply-n-add everything but a[i]*a[i]; - # b) shift result of a) by 1 to the left and accumulate - # a[i]*a[i] products; - # - ################################################################## - # a[7]a[7]a[6]a[6]a[5]a[5]a[4]a[4]a[3]a[3]a[2]a[2]a[1]a[1]a[0]a[0] - # a[1]a[0] - # a[2]a[0] - # a[3]a[0] - # a[2]a[1] - # a[3]a[1] - # a[3]a[2] - # - # a[4]a[0] - # a[5]a[0] - # a[6]a[0] - # a[7]a[0] - # a[4]a[1] - # a[5]a[1] - # a[6]a[1] - # a[7]a[1] - # a[4]a[2] - # a[5]a[2] - # a[6]a[2] - # a[7]a[2] - # a[4]a[3] - # a[5]a[3] - # a[6]a[3] - # a[7]a[3] - # - # a[5]a[4] - # a[6]a[4] - # a[7]a[4] - # a[6]a[5] - # a[7]a[5] - # a[7]a[6] - # a[7]a[7]a[6]a[6]a[5]a[5]a[4]a[4]a[3]a[3]a[2]a[2]a[1]a[1]a[0]a[0] -___ -{ -my ($zero,$carry)=("%rbp","%rcx"); -my $aaptr=$zero; -$code.=<<___; - lea 48+8(%rsp),$tptr - lea ($aptr,$num),$aaptr - mov $num,0+8(%rsp) # save $num - mov $aaptr,8+8(%rsp) # save end of $aptr - jmp .Lsqr8x_zero_start - -.align 32 -.byte 0x66,0x66,0x66,0x2e,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00 -.Lsqrx8x_zero: - .byte 0x3e - movdqa %xmm0,0*8($tptr) - movdqa %xmm0,2*8($tptr) - movdqa %xmm0,4*8($tptr) - movdqa %xmm0,6*8($tptr) -.Lsqr8x_zero_start: # aligned at 32 - movdqa %xmm0,8*8($tptr) - movdqa %xmm0,10*8($tptr) - movdqa %xmm0,12*8($tptr) - movdqa %xmm0,14*8($tptr) - lea 16*8($tptr),$tptr - sub \$64,$num - jnz .Lsqrx8x_zero - - mov 0*8($aptr),%rdx # a[0], modulo-scheduled - #xor %r9,%r9 # t[1], ex-$num, zero already - xor %r10,%r10 - xor %r11,%r11 - xor %r12,%r12 - xor %r13,%r13 - xor %r14,%r14 - xor %r15,%r15 - lea 48+8(%rsp),$tptr - xor $zero,$zero # cf=0, cf=0 - jmp .Lsqrx8x_outer_loop - -.align 32 -.Lsqrx8x_outer_loop: - mulx 1*8($aptr),%r8,%rax # a[1]*a[0] - adcx %r9,%r8 # a[1]*a[0]+=t[1] - adox %rax,%r10 - mulx 2*8($aptr),%r9,%rax # a[2]*a[0] - adcx %r10,%r9 - adox %rax,%r11 - .byte 0xc4,0xe2,0xab,0xf6,0x86,0x18,0x00,0x00,0x00 # mulx 3*8($aptr),%r10,%rax # ... - adcx %r11,%r10 - adox %rax,%r12 - .byte 0xc4,0xe2,0xa3,0xf6,0x86,0x20,0x00,0x00,0x00 # mulx 4*8($aptr),%r11,%rax - adcx %r12,%r11 - adox %rax,%r13 - mulx 5*8($aptr),%r12,%rax - adcx %r13,%r12 - adox %rax,%r14 - mulx 6*8($aptr),%r13,%rax - adcx %r14,%r13 - adox %r15,%rax - mulx 7*8($aptr),%r14,%r15 - mov 1*8($aptr),%rdx # a[1] - adcx %rax,%r14 - adox $zero,%r15 - adc 8*8($tptr),%r15 - mov %r8,1*8($tptr) # t[1] - mov %r9,2*8($tptr) # t[2] - sbb $carry,$carry # mov %cf,$carry - xor $zero,$zero # cf=0, of=0 - - - mulx 2*8($aptr),%r8,%rbx # a[2]*a[1] - mulx 3*8($aptr),%r9,%rax # a[3]*a[1] - adcx %r10,%r8 - adox %rbx,%r9 - mulx 4*8($aptr),%r10,%rbx # ... - adcx %r11,%r9 - adox %rax,%r10 - .byte 0xc4,0xe2,0xa3,0xf6,0x86,0x28,0x00,0x00,0x00 # mulx 5*8($aptr),%r11,%rax - adcx %r12,%r10 - adox %rbx,%r11 - .byte 0xc4,0xe2,0x9b,0xf6,0x9e,0x30,0x00,0x00,0x00 # mulx 6*8($aptr),%r12,%rbx - adcx %r13,%r11 - adox %r14,%r12 - .byte 0xc4,0x62,0x93,0xf6,0xb6,0x38,0x00,0x00,0x00 # mulx 7*8($aptr),%r13,%r14 - mov 2*8($aptr),%rdx # a[2] - adcx %rax,%r12 - adox %rbx,%r13 - adcx %r15,%r13 - adox $zero,%r14 # of=0 - adcx $zero,%r14 # cf=0 - - mov %r8,3*8($tptr) # t[3] - mov %r9,4*8($tptr) # t[4] - - mulx 3*8($aptr),%r8,%rbx # a[3]*a[2] - mulx 4*8($aptr),%r9,%rax # a[4]*a[2] - adcx %r10,%r8 - adox %rbx,%r9 - mulx 5*8($aptr),%r10,%rbx # ... - adcx %r11,%r9 - adox %rax,%r10 - .byte 0xc4,0xe2,0xa3,0xf6,0x86,0x30,0x00,0x00,0x00 # mulx 6*8($aptr),%r11,%rax - adcx %r12,%r10 - adox %r13,%r11 - .byte 0xc4,0x62,0x9b,0xf6,0xae,0x38,0x00,0x00,0x00 # mulx 7*8($aptr),%r12,%r13 - .byte 0x3e - mov 3*8($aptr),%rdx # a[3] - adcx %rbx,%r11 - adox %rax,%r12 - adcx %r14,%r12 - mov %r8,5*8($tptr) # t[5] - mov %r9,6*8($tptr) # t[6] - mulx 4*8($aptr),%r8,%rax # a[4]*a[3] - adox $zero,%r13 # of=0 - adcx $zero,%r13 # cf=0 - - mulx 5*8($aptr),%r9,%rbx # a[5]*a[3] - adcx %r10,%r8 - adox %rax,%r9 - mulx 6*8($aptr),%r10,%rax # ... - adcx %r11,%r9 - adox %r12,%r10 - mulx 7*8($aptr),%r11,%r12 - mov 4*8($aptr),%rdx # a[4] - mov 5*8($aptr),%r14 # a[5] - adcx %rbx,%r10 - adox %rax,%r11 - mov 6*8($aptr),%r15 # a[6] - adcx %r13,%r11 - adox $zero,%r12 # of=0 - adcx $zero,%r12 # cf=0 - - mov %r8,7*8($tptr) # t[7] - mov %r9,8*8($tptr) # t[8] - - mulx %r14,%r9,%rax # a[5]*a[4] - mov 7*8($aptr),%r8 # a[7] - adcx %r10,%r9 - mulx %r15,%r10,%rbx # a[6]*a[4] - adox %rax,%r10 - adcx %r11,%r10 - mulx %r8,%r11,%rax # a[7]*a[4] - mov %r14,%rdx # a[5] - adox %rbx,%r11 - adcx %r12,%r11 - #adox $zero,%rax # of=0 - adcx $zero,%rax # cf=0 - - mulx %r15,%r14,%rbx # a[6]*a[5] - mulx %r8,%r12,%r13 # a[7]*a[5] - mov %r15,%rdx # a[6] - lea 8*8($aptr),$aptr - adcx %r14,%r11 - adox %rbx,%r12 - adcx %rax,%r12 - adox $zero,%r13 - - .byte 0x67,0x67 - mulx %r8,%r8,%r14 # a[7]*a[6] - adcx %r8,%r13 - adcx $zero,%r14 - - cmp 8+8(%rsp),$aptr - je .Lsqrx8x_outer_break - - neg $carry # mov $carry,%cf - mov \$-8,%rcx - mov $zero,%r15 - mov 8*8($tptr),%r8 - adcx 9*8($tptr),%r9 # +=t[9] - adcx 10*8($tptr),%r10 # ... - adcx 11*8($tptr),%r11 - adc 12*8($tptr),%r12 - adc 13*8($tptr),%r13 - adc 14*8($tptr),%r14 - adc 15*8($tptr),%r15 - lea ($aptr),$aaptr - lea 2*64($tptr),$tptr - sbb %rax,%rax # mov %cf,$carry - - mov -64($aptr),%rdx # a[0] - mov %rax,16+8(%rsp) # offload $carry - mov $tptr,24+8(%rsp) - - #lea 8*8($tptr),$tptr # see 2*8*8($tptr) above - xor %eax,%eax # cf=0, of=0 - jmp .Lsqrx8x_loop - -.align 32 -.Lsqrx8x_loop: - mov %r8,%rbx - mulx 0*8($aaptr),%rax,%r8 # a[8]*a[i] - adcx %rax,%rbx # +=t[8] - adox %r9,%r8 - - mulx 1*8($aaptr),%rax,%r9 # ... - adcx %rax,%r8 - adox %r10,%r9 - - mulx 2*8($aaptr),%rax,%r10 - adcx %rax,%r9 - adox %r11,%r10 - - mulx 3*8($aaptr),%rax,%r11 - adcx %rax,%r10 - adox %r12,%r11 - - .byte 0xc4,0x62,0xfb,0xf6,0xa5,0x20,0x00,0x00,0x00 # mulx 4*8($aaptr),%rax,%r12 - adcx %rax,%r11 - adox %r13,%r12 - - mulx 5*8($aaptr),%rax,%r13 - adcx %rax,%r12 - adox %r14,%r13 - - mulx 6*8($aaptr),%rax,%r14 - mov %rbx,($tptr,%rcx,8) # store t[8+i] - mov \$0,%ebx - adcx %rax,%r13 - adox %r15,%r14 - - .byte 0xc4,0x62,0xfb,0xf6,0xbd,0x38,0x00,0x00,0x00 # mulx 7*8($aaptr),%rax,%r15 - mov 8($aptr,%rcx,8),%rdx # a[i] - adcx %rax,%r14 - adox %rbx,%r15 # %rbx is 0, of=0 - adcx %rbx,%r15 # cf=0 - - .byte 0x67 - inc %rcx # of=0 - jnz .Lsqrx8x_loop - - lea 8*8($aaptr),$aaptr - mov \$-8,%rcx - cmp 8+8(%rsp),$aaptr # done? - je .Lsqrx8x_break - - sub 16+8(%rsp),%rbx # mov 16(%rsp),%cf - .byte 0x66 - mov -64($aptr),%rdx - adcx 0*8($tptr),%r8 - adcx 1*8($tptr),%r9 - adc 2*8($tptr),%r10 - adc 3*8($tptr),%r11 - adc 4*8($tptr),%r12 - adc 5*8($tptr),%r13 - adc 6*8($tptr),%r14 - adc 7*8($tptr),%r15 - lea 8*8($tptr),$tptr - .byte 0x67 - sbb %rax,%rax # mov %cf,%rax - xor %ebx,%ebx # cf=0, of=0 - mov %rax,16+8(%rsp) # offload carry - jmp .Lsqrx8x_loop - -.align 32 -.Lsqrx8x_break: - xor $zero,$zero - sub 16+8(%rsp),%rbx # mov 16(%rsp),%cf - adcx $zero,%r8 - mov 24+8(%rsp),$carry # initial $tptr, borrow $carry - adcx $zero,%r9 - mov 0*8($aptr),%rdx # a[8], modulo-scheduled - adc \$0,%r10 - mov %r8,0*8($tptr) - adc \$0,%r11 - adc \$0,%r12 - adc \$0,%r13 - adc \$0,%r14 - adc \$0,%r15 - cmp $carry,$tptr # cf=0, of=0 - je .Lsqrx8x_outer_loop - - mov %r9,1*8($tptr) - mov 1*8($carry),%r9 - mov %r10,2*8($tptr) - mov 2*8($carry),%r10 - mov %r11,3*8($tptr) - mov 3*8($carry),%r11 - mov %r12,4*8($tptr) - mov 4*8($carry),%r12 - mov %r13,5*8($tptr) - mov 5*8($carry),%r13 - mov %r14,6*8($tptr) - mov 6*8($carry),%r14 - mov %r15,7*8($tptr) - mov 7*8($carry),%r15 - mov $carry,$tptr - jmp .Lsqrx8x_outer_loop - -.align 32 -.Lsqrx8x_outer_break: - mov %r9,9*8($tptr) # t[9] - movq %xmm3,%rcx # -$num - mov %r10,10*8($tptr) # ... - mov %r11,11*8($tptr) - mov %r12,12*8($tptr) - mov %r13,13*8($tptr) - mov %r14,14*8($tptr) -___ -} { -my $i="%rcx"; -$code.=<<___; - lea 48+8(%rsp),$tptr - mov ($aptr,$i),%rdx # a[0] - - mov 8($tptr),$A0[1] # t[1] - xor $A0[0],$A0[0] # t[0], of=0, cf=0 - mov 0+8(%rsp),$num # restore $num - adox $A0[1],$A0[1] - mov 16($tptr),$A1[0] # t[2] # prefetch - mov 24($tptr),$A1[1] # t[3] # prefetch - #jmp .Lsqrx4x_shift_n_add # happens to be aligned - -.align 32 -.Lsqrx4x_shift_n_add: - mulx %rdx,%rax,%rbx - adox $A1[0],$A1[0] - adcx $A0[0],%rax - .byte 0x48,0x8b,0x94,0x0e,0x08,0x00,0x00,0x00 # mov 8($aptr,$i),%rdx # a[i+1] # prefetch - .byte 0x4c,0x8b,0x97,0x20,0x00,0x00,0x00 # mov 32($tptr),$A0[0] # t[2*i+4] # prefetch - adox $A1[1],$A1[1] - adcx $A0[1],%rbx - mov 40($tptr),$A0[1] # t[2*i+4+1] # prefetch - mov %rax,0($tptr) - mov %rbx,8($tptr) - - mulx %rdx,%rax,%rbx - adox $A0[0],$A0[0] - adcx $A1[0],%rax - mov 16($aptr,$i),%rdx # a[i+2] # prefetch - mov 48($tptr),$A1[0] # t[2*i+6] # prefetch - adox $A0[1],$A0[1] - adcx $A1[1],%rbx - mov 56($tptr),$A1[1] # t[2*i+6+1] # prefetch - mov %rax,16($tptr) - mov %rbx,24($tptr) - - mulx %rdx,%rax,%rbx - adox $A1[0],$A1[0] - adcx $A0[0],%rax - mov 24($aptr,$i),%rdx # a[i+3] # prefetch - lea 32($i),$i - mov 64($tptr),$A0[0] # t[2*i+8] # prefetch - adox $A1[1],$A1[1] - adcx $A0[1],%rbx - mov 72($tptr),$A0[1] # t[2*i+8+1] # prefetch - mov %rax,32($tptr) - mov %rbx,40($tptr) - - mulx %rdx,%rax,%rbx - adox $A0[0],$A0[0] - adcx $A1[0],%rax - jrcxz .Lsqrx4x_shift_n_add_break - .byte 0x48,0x8b,0x94,0x0e,0x00,0x00,0x00,0x00 # mov 0($aptr,$i),%rdx # a[i+4] # prefetch - adox $A0[1],$A0[1] - adcx $A1[1],%rbx - mov 80($tptr),$A1[0] # t[2*i+10] # prefetch - mov 88($tptr),$A1[1] # t[2*i+10+1] # prefetch - mov %rax,48($tptr) - mov %rbx,56($tptr) - lea 64($tptr),$tptr - nop - jmp .Lsqrx4x_shift_n_add - -.align 32 -.Lsqrx4x_shift_n_add_break: - adcx $A1[1],%rbx - mov %rax,48($tptr) - mov %rbx,56($tptr) - lea 64($tptr),$tptr # end of t[] buffer -___ -} -###################################################################### -# Montgomery reduction part, "word-by-word" algorithm. -# -# This new path is inspired by multiple submissions from Intel, by -# Shay Gueron, Vlad Krasnov, Erdinc Ozturk, James Guilford, -# Vinodh Gopal... -{ -my ($nptr,$carry,$m0)=("%rbp","%rsi","%rdx"); - -$code.=<<___; - movq %xmm2,$nptr -__bn_sqrx8x_reduction: - xor %eax,%eax # initial top-most carry bit - mov 32+8(%rsp),%rbx # n0 - mov 48+8(%rsp),%rdx # "%r8", 8*0($tptr) - lea -8*8($nptr,$num),%rcx # end of n[] - #lea 48+8(%rsp,$num,2),$tptr # end of t[] buffer - mov %rcx, 0+8(%rsp) # save end of n[] - mov $tptr,8+8(%rsp) # save end of t[] - - lea 48+8(%rsp),$tptr # initial t[] window - jmp .Lsqrx8x_reduction_loop - -.align 32 -.Lsqrx8x_reduction_loop: - mov 8*1($tptr),%r9 - mov 8*2($tptr),%r10 - mov 8*3($tptr),%r11 - mov 8*4($tptr),%r12 - mov %rdx,%r8 - imulq %rbx,%rdx # n0*a[i] - mov 8*5($tptr),%r13 - mov 8*6($tptr),%r14 - mov 8*7($tptr),%r15 - mov %rax,24+8(%rsp) # store top-most carry bit - - lea 8*8($tptr),$tptr - xor $carry,$carry # cf=0,of=0 - mov \$-8,%rcx - jmp .Lsqrx8x_reduce - -.align 32 -.Lsqrx8x_reduce: - mov %r8, %rbx - mulx 8*0($nptr),%rax,%r8 # n[0] - adcx %rbx,%rax # discarded - adox %r9,%r8 - - mulx 8*1($nptr),%rbx,%r9 # n[1] - adcx %rbx,%r8 - adox %r10,%r9 - - mulx 8*2($nptr),%rbx,%r10 - adcx %rbx,%r9 - adox %r11,%r10 - - mulx 8*3($nptr),%rbx,%r11 - adcx %rbx,%r10 - adox %r12,%r11 - - .byte 0xc4,0x62,0xe3,0xf6,0xa5,0x20,0x00,0x00,0x00 # mulx 8*4($nptr),%rbx,%r12 - mov %rdx,%rax - mov %r8,%rdx - adcx %rbx,%r11 - adox %r13,%r12 - - mulx 32+8(%rsp),%rbx,%rdx # %rdx discarded - mov %rax,%rdx - mov %rax,64+48+8(%rsp,%rcx,8) # put aside n0*a[i] - - mulx 8*5($nptr),%rax,%r13 - adcx %rax,%r12 - adox %r14,%r13 - - mulx 8*6($nptr),%rax,%r14 - adcx %rax,%r13 - adox %r15,%r14 - - mulx 8*7($nptr),%rax,%r15 - mov %rbx,%rdx - adcx %rax,%r14 - adox $carry,%r15 # $carry is 0 - adcx $carry,%r15 # cf=0 - - .byte 0x67,0x67,0x67 - inc %rcx # of=0 - jnz .Lsqrx8x_reduce - - mov $carry,%rax # xor %rax,%rax - cmp 0+8(%rsp),$nptr # end of n[]? - jae .Lsqrx8x_no_tail - - mov 48+8(%rsp),%rdx # pull n0*a[0] - add 8*0($tptr),%r8 - lea 8*8($nptr),$nptr - mov \$-8,%rcx - adcx 8*1($tptr),%r9 - adcx 8*2($tptr),%r10 - adc 8*3($tptr),%r11 - adc 8*4($tptr),%r12 - adc 8*5($tptr),%r13 - adc 8*6($tptr),%r14 - adc 8*7($tptr),%r15 - lea 8*8($tptr),$tptr - sbb %rax,%rax # top carry - - xor $carry,$carry # of=0, cf=0 - mov %rax,16+8(%rsp) - jmp .Lsqrx8x_tail - -.align 32 -.Lsqrx8x_tail: - mov %r8,%rbx - mulx 8*0($nptr),%rax,%r8 - adcx %rax,%rbx - adox %r9,%r8 - - mulx 8*1($nptr),%rax,%r9 - adcx %rax,%r8 - adox %r10,%r9 - - mulx 8*2($nptr),%rax,%r10 - adcx %rax,%r9 - adox %r11,%r10 - - mulx 8*3($nptr),%rax,%r11 - adcx %rax,%r10 - adox %r12,%r11 - - .byte 0xc4,0x62,0xfb,0xf6,0xa5,0x20,0x00,0x00,0x00 # mulx 8*4($nptr),%rax,%r12 - adcx %rax,%r11 - adox %r13,%r12 - - mulx 8*5($nptr),%rax,%r13 - adcx %rax,%r12 - adox %r14,%r13 - - mulx 8*6($nptr),%rax,%r14 - adcx %rax,%r13 - adox %r15,%r14 - - mulx 8*7($nptr),%rax,%r15 - mov 72+48+8(%rsp,%rcx,8),%rdx # pull n0*a[i] - adcx %rax,%r14 - adox $carry,%r15 - mov %rbx,($tptr,%rcx,8) # save result - mov %r8,%rbx - adcx $carry,%r15 # cf=0 - - inc %rcx # of=0 - jnz .Lsqrx8x_tail - - cmp 0+8(%rsp),$nptr # end of n[]? - jae .Lsqrx8x_tail_done # break out of loop - - sub 16+8(%rsp),$carry # mov 16(%rsp),%cf - mov 48+8(%rsp),%rdx # pull n0*a[0] - lea 8*8($nptr),$nptr - adc 8*0($tptr),%r8 - adc 8*1($tptr),%r9 - adc 8*2($tptr),%r10 - adc 8*3($tptr),%r11 - adc 8*4($tptr),%r12 - adc 8*5($tptr),%r13 - adc 8*6($tptr),%r14 - adc 8*7($tptr),%r15 - lea 8*8($tptr),$tptr - sbb %rax,%rax - sub \$8,%rcx # mov \$-8,%rcx - - xor $carry,$carry # of=0, cf=0 - mov %rax,16+8(%rsp) - jmp .Lsqrx8x_tail - -.align 32 -.Lsqrx8x_tail_done: - xor %rax,%rax - add 24+8(%rsp),%r8 # can this overflow? - adc \$0,%r9 - adc \$0,%r10 - adc \$0,%r11 - adc \$0,%r12 - adc \$0,%r13 - adc \$0,%r14 - adc \$0,%r15 - adc \$0,%rax - - sub 16+8(%rsp),$carry # mov 16(%rsp),%cf -.Lsqrx8x_no_tail: # %cf is 0 if jumped here - adc 8*0($tptr),%r8 - movq %xmm3,%rcx - adc 8*1($tptr),%r9 - mov 8*7($nptr),$carry - movq %xmm2,$nptr # restore $nptr - adc 8*2($tptr),%r10 - adc 8*3($tptr),%r11 - adc 8*4($tptr),%r12 - adc 8*5($tptr),%r13 - adc 8*6($tptr),%r14 - adc 8*7($tptr),%r15 - adc \$0,%rax # top-most carry - - mov 32+8(%rsp),%rbx # n0 - mov 8*8($tptr,%rcx),%rdx # modulo-scheduled "%r8" - - mov %r8,8*0($tptr) # store top 512 bits - lea 8*8($tptr),%r8 # borrow %r8 - mov %r9,8*1($tptr) - mov %r10,8*2($tptr) - mov %r11,8*3($tptr) - mov %r12,8*4($tptr) - mov %r13,8*5($tptr) - mov %r14,8*6($tptr) - mov %r15,8*7($tptr) - - lea 8*8($tptr,%rcx),$tptr # start of current t[] window - cmp 8+8(%rsp),%r8 # end of t[]? - jb .Lsqrx8x_reduction_loop - ret -.cfi_endproc -.size GFp_bn_sqrx8x_internal,.-GFp_bn_sqrx8x_internal -___ -} -############################################################## -# Post-condition, 4x unrolled -# -{ -my ($rptr,$nptr)=("%rdx","%rbp"); -$code.=<<___; -.align 32 -.type __bn_postx4x_internal,\@abi-omnipotent -__bn_postx4x_internal: -.cfi_startproc - mov 8*0($nptr),%r12 - mov %rcx,%r10 # -$num - mov %rcx,%r9 # -$num - neg %rax - sar \$3+2,%rcx - #lea 48+8(%rsp,%r9),$tptr - movq %xmm1,$rptr # restore $rptr - movq %xmm1,$aptr # prepare for back-to-back call - dec %r12 # so that after 'not' we get -n[0] - mov 8*1($nptr),%r13 - xor %r8,%r8 - mov 8*2($nptr),%r14 - mov 8*3($nptr),%r15 - jmp .Lsqrx4x_sub_entry - -.align 16 -.Lsqrx4x_sub: - mov 8*0($nptr),%r12 - mov 8*1($nptr),%r13 - mov 8*2($nptr),%r14 - mov 8*3($nptr),%r15 -.Lsqrx4x_sub_entry: - andn %rax,%r12,%r12 - lea 8*4($nptr),$nptr - andn %rax,%r13,%r13 - andn %rax,%r14,%r14 - andn %rax,%r15,%r15 - - neg %r8 # mov %r8,%cf - adc 8*0($tptr),%r12 - adc 8*1($tptr),%r13 - adc 8*2($tptr),%r14 - adc 8*3($tptr),%r15 - mov %r12,8*0($rptr) - lea 8*4($tptr),$tptr - mov %r13,8*1($rptr) - sbb %r8,%r8 # mov %cf,%r8 - mov %r14,8*2($rptr) - mov %r15,8*3($rptr) - lea 8*4($rptr),$rptr - - inc %rcx - jnz .Lsqrx4x_sub - - neg %r9 # restore $num - - ret -.cfi_endproc -.size __bn_postx4x_internal,.-__bn_postx4x_internal -___ -} -}}} -{ -my ($inp,$num,$tbl,$idx)=$win64?("%rcx","%edx","%r8", "%r9d") : # Win64 order - ("%rdi","%esi","%rdx","%ecx"); # Unix order -my $out=$inp; -my $STRIDE=2**5*8; -my $N=$STRIDE/4; - -$code.=<<___; -.globl GFp_bn_scatter5 -.type GFp_bn_scatter5,\@abi-omnipotent -.align 16 -GFp_bn_scatter5: -.cfi_startproc - cmp \$0, $num - jz .Lscatter_epilogue - lea ($tbl,$idx,8),$tbl -.Lscatter: - mov ($inp),%rax - lea 8($inp),$inp - mov %rax,($tbl) - lea 32*8($tbl),$tbl - sub \$1,$num - jnz .Lscatter -.Lscatter_epilogue: - ret -.cfi_endproc -.size GFp_bn_scatter5,.-GFp_bn_scatter5 - -.globl GFp_bn_gather5 -.type GFp_bn_gather5,\@abi-omnipotent -.align 32 -GFp_bn_gather5: -.cfi_startproc -.LSEH_begin_GFp_bn_gather5: # Win64 thing, but harmless in other cases - # I can't trust assembler to use specific encoding:-( - .byte 0x4c,0x8d,0x14,0x24 #lea (%rsp),%r10 -.cfi_def_cfa_register %r10 - .byte 0x48,0x81,0xec,0x08,0x01,0x00,0x00 #sub $0x108,%rsp - lea .Linc(%rip),%rax - and \$-16,%rsp # shouldn't be formally required - - movd $idx,%xmm5 - movdqa 0(%rax),%xmm0 # 00000001000000010000000000000000 - movdqa 16(%rax),%xmm1 # 00000002000000020000000200000002 - lea 128($tbl),%r11 # size optimization - lea 128(%rsp),%rax # size optimization - - pshufd \$0,%xmm5,%xmm5 # broadcast $idx - movdqa %xmm1,%xmm4 - movdqa %xmm1,%xmm2 -___ -######################################################################## -# calculate mask by comparing 0..31 to $idx and save result to stack -# -for($i=0;$i<$STRIDE/16;$i+=4) { -$code.=<<___; - paddd %xmm0,%xmm1 - pcmpeqd %xmm5,%xmm0 # compare to 1,0 -___ -$code.=<<___ if ($i); - movdqa %xmm3,`16*($i-1)-128`(%rax) -___ -$code.=<<___; - movdqa %xmm4,%xmm3 - - paddd %xmm1,%xmm2 - pcmpeqd %xmm5,%xmm1 # compare to 3,2 - movdqa %xmm0,`16*($i+0)-128`(%rax) - movdqa %xmm4,%xmm0 - - paddd %xmm2,%xmm3 - pcmpeqd %xmm5,%xmm2 # compare to 5,4 - movdqa %xmm1,`16*($i+1)-128`(%rax) - movdqa %xmm4,%xmm1 - - paddd %xmm3,%xmm0 - pcmpeqd %xmm5,%xmm3 # compare to 7,6 - movdqa %xmm2,`16*($i+2)-128`(%rax) - movdqa %xmm4,%xmm2 -___ -} -$code.=<<___; - movdqa %xmm3,`16*($i-1)-128`(%rax) - jmp .Lgather - -.align 32 -.Lgather: - pxor %xmm4,%xmm4 - pxor %xmm5,%xmm5 -___ -for($i=0;$i<$STRIDE/16;$i+=4) { -$code.=<<___; - movdqa `16*($i+0)-128`(%r11),%xmm0 - movdqa `16*($i+1)-128`(%r11),%xmm1 - movdqa `16*($i+2)-128`(%r11),%xmm2 - pand `16*($i+0)-128`(%rax),%xmm0 - movdqa `16*($i+3)-128`(%r11),%xmm3 - pand `16*($i+1)-128`(%rax),%xmm1 - por %xmm0,%xmm4 - pand `16*($i+2)-128`(%rax),%xmm2 - por %xmm1,%xmm5 - pand `16*($i+3)-128`(%rax),%xmm3 - por %xmm2,%xmm4 - por %xmm3,%xmm5 -___ -} -$code.=<<___; - por %xmm5,%xmm4 - lea $STRIDE(%r11),%r11 - pshufd \$0x4e,%xmm4,%xmm0 - por %xmm4,%xmm0 - movq %xmm0,($out) # m0=bp[0] - lea 8($out),$out - sub \$1,$num - jnz .Lgather - - lea (%r10),%rsp -.cfi_def_cfa_register %rsp - ret -.LSEH_end_GFp_bn_gather5: -.cfi_endproc -.size GFp_bn_gather5,.-GFp_bn_gather5 -___ -} -$code.=<<___; -.align 64 -.Linc: - .long 0,0, 1,1 - .long 2,2, 2,2 -.asciz "Montgomery Multiplication with scatter/gather for x86_64, CRYPTOGAMS by " -___ - -# EXCEPTION_DISPOSITION handler (EXCEPTION_RECORD *rec,ULONG64 frame, -# CONTEXT *context,DISPATCHER_CONTEXT *disp) -if ($win64) { -$rec="%rcx"; -$frame="%rdx"; -$context="%r8"; -$disp="%r9"; - -$code.=<<___; -.extern __imp_RtlVirtualUnwind -.type mul_handler,\@abi-omnipotent -.align 16 -mul_handler: - push %rsi - push %rdi - push %rbx - push %rbp - push %r12 - push %r13 - push %r14 - push %r15 - pushfq - sub \$64,%rsp - - mov 120($context),%rax # pull context->Rax - mov 248($context),%rbx # pull context->Rip - - mov 8($disp),%rsi # disp->ImageBase - mov 56($disp),%r11 # disp->HandlerData - - mov 0(%r11),%r10d # HandlerData[0] - lea (%rsi,%r10),%r10 # end of prologue label - cmp %r10,%rbx # context->RipRipRsp - - mov 8(%r11),%r10d # HandlerData[2] - lea (%rsi,%r10),%r10 # epilogue label - cmp %r10,%rbx # context->Rip>=epilogue label - jae .Lcommon_seh_tail - - lea .Lmul_epilogue(%rip),%r10 - cmp %r10,%rbx - ja .Lbody_40 - - mov 192($context),%r10 # pull $num - mov 8(%rax,%r10,8),%rax # pull saved stack pointer - - jmp .Lcommon_pop_regs - -.Lbody_40: - mov 40(%rax),%rax # pull saved stack pointer -.Lcommon_pop_regs: - mov -8(%rax),%rbx - mov -16(%rax),%rbp - mov -24(%rax),%r12 - mov -32(%rax),%r13 - mov -40(%rax),%r14 - mov -48(%rax),%r15 - mov %rbx,144($context) # restore context->Rbx - mov %rbp,160($context) # restore context->Rbp - mov %r12,216($context) # restore context->R12 - mov %r13,224($context) # restore context->R13 - mov %r14,232($context) # restore context->R14 - mov %r15,240($context) # restore context->R15 - -.Lcommon_seh_tail: - mov 8(%rax),%rdi - mov 16(%rax),%rsi - mov %rax,152($context) # restore context->Rsp - mov %rsi,168($context) # restore context->Rsi - mov %rdi,176($context) # restore context->Rdi - - mov 40($disp),%rdi # disp->ContextRecord - mov $context,%rsi # context - mov \$154,%ecx # sizeof(CONTEXT) - .long 0xa548f3fc # cld; rep movsq - - mov $disp,%rsi - xor %rcx,%rcx # arg1, UNW_FLAG_NHANDLER - mov 8(%rsi),%rdx # arg2, disp->ImageBase - mov 0(%rsi),%r8 # arg3, disp->ControlPc - mov 16(%rsi),%r9 # arg4, disp->FunctionEntry - mov 40(%rsi),%r10 # disp->ContextRecord - lea 56(%rsi),%r11 # &disp->HandlerData - lea 24(%rsi),%r12 # &disp->EstablisherFrame - mov %r10,32(%rsp) # arg5 - mov %r11,40(%rsp) # arg6 - mov %r12,48(%rsp) # arg7 - mov %rcx,56(%rsp) # arg8, (NULL) - call *__imp_RtlVirtualUnwind(%rip) - - mov \$1,%eax # ExceptionContinueSearch - add \$64,%rsp - popfq - pop %r15 - pop %r14 - pop %r13 - pop %r12 - pop %rbp - pop %rbx - pop %rdi - pop %rsi - ret -.size mul_handler,.-mul_handler - -.section .pdata -.align 4 - .rva .LSEH_begin_GFp_bn_mul_mont_gather5 - .rva .LSEH_end_GFp_bn_mul_mont_gather5 - .rva .LSEH_info_GFp_bn_mul_mont_gather5 - - .rva .LSEH_begin_bn_mul4x_mont_gather5 - .rva .LSEH_end_bn_mul4x_mont_gather5 - .rva .LSEH_info_bn_mul4x_mont_gather5 - - .rva .LSEH_begin_GFp_bn_power5 - .rva .LSEH_end_GFp_bn_power5 - .rva .LSEH_info_GFp_bn_power5 - - .rva .LSEH_begin_bn_from_mont8x - .rva .LSEH_end_bn_from_mont8x - .rva .LSEH_info_bn_from_mont8x -___ -$code.=<<___ if ($addx); - .rva .LSEH_begin_bn_mulx4x_mont_gather5 - .rva .LSEH_end_bn_mulx4x_mont_gather5 - .rva .LSEH_info_bn_mulx4x_mont_gather5 - - .rva .LSEH_begin_bn_powerx5 - .rva .LSEH_end_bn_powerx5 - .rva .LSEH_info_GFp_bn_powerx5 -___ -$code.=<<___; - .rva .LSEH_begin_GFp_bn_gather5 - .rva .LSEH_end_GFp_bn_gather5 - .rva .LSEH_info_GFp_bn_gather5 - -.section .xdata -.align 8 -.LSEH_info_GFp_bn_mul_mont_gather5: - .byte 9,0,0,0 - .rva mul_handler - .rva .Lmul_body,.Lmul_body,.Lmul_epilogue # HandlerData[] -.align 8 -.LSEH_info_bn_mul4x_mont_gather5: - .byte 9,0,0,0 - .rva mul_handler - .rva .Lmul4x_prologue,.Lmul4x_body,.Lmul4x_epilogue # HandlerData[] -.align 8 -.LSEH_info_GFp_bn_power5: - .byte 9,0,0,0 - .rva mul_handler - .rva .Lpower5_prologue,.Lpower5_body,.Lpower5_epilogue # HandlerData[] -.align 8 -.LSEH_info_bn_from_mont8x: - .byte 9,0,0,0 - .rva mul_handler - .rva .Lfrom_prologue,.Lfrom_body,.Lfrom_epilogue # HandlerData[] -___ -$code.=<<___ if ($addx); -.align 8 -.LSEH_info_bn_mulx4x_mont_gather5: - .byte 9,0,0,0 - .rva mul_handler - .rva .Lmulx4x_prologue,.Lmulx4x_body,.Lmulx4x_epilogue # HandlerData[] -.align 8 -.LSEH_info_GFp_bn_powerx5: - .byte 9,0,0,0 - .rva mul_handler - .rva .Lpowerx5_prologue,.Lpowerx5_body,.Lpowerx5_epilogue # HandlerData[] -___ -$code.=<<___; -.align 8 -.LSEH_info_GFp_bn_gather5: - .byte 0x01,0x0b,0x03,0x0a - .byte 0x0b,0x01,0x21,0x00 # sub rsp,0x108 - .byte 0x04,0xa3,0x00,0x00 # lea r10,(rsp) -.align 8 -___ -} - -$code =~ s/\`([^\`]*)\`/eval($1)/gem; - -print $code; -close STDOUT or die "error closing STDOUT"; diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/bn/asm/x86_64-mont.pl temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/bn/asm/x86_64-mont.pl --- temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/bn/asm/x86_64-mont.pl 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/bn/asm/x86_64-mont.pl 1970-01-01 00:00:00.000000000 +0000 @@ -1,1579 +0,0 @@ -#! /usr/bin/env perl -# Copyright 2005-2016 The OpenSSL Project Authors. All Rights Reserved. -# -# Licensed under the OpenSSL license (the "License"). You may not use -# this file except in compliance with the License. You can obtain a copy -# in the file LICENSE in the source distribution or at -# https://www.openssl.org/source/license.html - - -# ==================================================================== -# Written by Andy Polyakov for the OpenSSL -# project. The module is, however, dual licensed under OpenSSL and -# CRYPTOGAMS licenses depending on where you obtain it. For further -# details see http://www.openssl.org/~appro/cryptogams/. -# ==================================================================== - -# October 2005. -# -# Montgomery multiplication routine for x86_64. While it gives modest -# 9% improvement of rsa4096 sign on Opteron, rsa512 sign runs more -# than twice, >2x, as fast. Most common rsa1024 sign is improved by -# respectful 50%. It remains to be seen if loop unrolling and -# dedicated squaring routine can provide further improvement... - -# July 2011. -# -# Add dedicated squaring procedure. Performance improvement varies -# from platform to platform, but in average it's ~5%/15%/25%/33% -# for 512-/1024-/2048-/4096-bit RSA *sign* benchmarks respectively. - -# August 2011. -# -# Unroll and modulo-schedule inner loops in such manner that they -# are "fallen through" for input lengths of 8, which is critical for -# 1024-bit RSA *sign*. Average performance improvement in comparison -# to *initial* version of this module from 2005 is ~0%/30%/40%/45% -# for 512-/1024-/2048-/4096-bit RSA *sign* benchmarks respectively. - -# June 2013. -# -# Optimize reduction in squaring procedure and improve 1024+-bit RSA -# sign performance by 10-16% on Intel Sandy Bridge and later -# (virtually same on non-Intel processors). - -# August 2013. -# -# Add MULX/ADOX/ADCX code path. - -$flavour = shift; -$output = shift; -if ($flavour =~ /\./) { $output = $flavour; undef $flavour; } - -$win64=0; $win64=1 if ($flavour =~ /[nm]asm|mingw64/ || $output =~ /\.asm$/); - -$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; -( $xlate="${dir}x86_64-xlate.pl" and -f $xlate ) or -( $xlate="${dir}../../../perlasm/x86_64-xlate.pl" and -f $xlate) or -die "can't locate x86_64-xlate.pl"; - -open OUT,"| \"$^X\" \"$xlate\" $flavour \"$output\""; -*STDOUT=*OUT; - -# In upstream, this is controlled by shelling out to the compiler to check -# versions, but BoringSSL is intended to be used with pre-generated perlasm -# output, so this isn't useful anyway. -$addx = 1; - -# void GFp_bn_mul_mont( -$rp="%rdi"; # BN_ULONG *rp, -$ap="%rsi"; # const BN_ULONG *ap, -$bp="%rdx"; # const BN_ULONG *bp, -$np="%rcx"; # const BN_ULONG *np, -$n0="%r8"; # const BN_ULONG *n0, -# TODO(davidben): The code below treats $num as an int, but C passes in a -# size_t. -$num="%r9"; # size_t num); -$lo0="%r10"; -$hi0="%r11"; -$hi1="%r13"; -$i="%r14"; -$j="%r15"; -$m0="%rbx"; -$m1="%rbp"; - -$code=<<___; -.text - -.extern GFp_ia32cap_P - -.globl GFp_bn_mul_mont -.type GFp_bn_mul_mont,\@function,6 -.align 16 -GFp_bn_mul_mont: -.cfi_startproc - mov ${num}d,${num}d - mov %rsp,%rax -.cfi_def_cfa_register %rax - test \$3,${num}d - jnz .Lmul_enter - cmp \$8,${num}d - jb .Lmul_enter -___ -$code.=<<___ if ($addx); - mov GFp_ia32cap_P+8(%rip),%r11d -___ -$code.=<<___; - cmp $ap,$bp - jne .Lmul4x_enter - test \$7,${num}d - jz .Lsqr8x_enter - jmp .Lmul4x_enter - -.align 16 -.Lmul_enter: - push %rbx -.cfi_push %rbx - push %rbp -.cfi_push %rbp - push %r12 -.cfi_push %r12 - push %r13 -.cfi_push %r13 - push %r14 -.cfi_push %r14 - push %r15 -.cfi_push %r15 - - neg $num - mov %rsp,%r11 - lea -16(%rsp,$num,8),%r10 # future alloca(8*(num+2)) - neg $num # restore $num - and \$-1024,%r10 # minimize TLB usage - - # An OS-agnostic version of __chkstk. - # - # Some OSes (Windows) insist on stack being "wired" to - # physical memory in strictly sequential manner, i.e. if stack - # allocation spans two pages, then reference to farmost one can - # be punishable by SEGV. But page walking can do good even on - # other OSes, because it guarantees that villain thread hits - # the guard page before it can make damage to innocent one... - sub %r10,%r11 - and \$-4096,%r11 - lea (%r10,%r11),%rsp - mov (%rsp),%r11 - cmp %r10,%rsp - ja .Lmul_page_walk - jmp .Lmul_page_walk_done - -.align 16 -.Lmul_page_walk: - lea -4096(%rsp),%rsp - mov (%rsp),%r11 - cmp %r10,%rsp - ja .Lmul_page_walk -.Lmul_page_walk_done: - - mov %rax,8(%rsp,$num,8) # tp[num+1]=%rsp -.cfi_cfa_expression %rsp+8,$num,8,mul,plus,deref,+8 -.Lmul_body: - mov $bp,%r12 # reassign $bp -___ - $bp="%r12"; -$code.=<<___; - mov ($n0),$n0 # pull n0[0] value - mov ($bp),$m0 # m0=bp[0] - mov ($ap),%rax - - xor $i,$i # i=0 - xor $j,$j # j=0 - - mov $n0,$m1 - mulq $m0 # ap[0]*bp[0] - mov %rax,$lo0 - mov ($np),%rax - - imulq $lo0,$m1 # "tp[0]"*n0 - mov %rdx,$hi0 - - mulq $m1 # np[0]*m1 - add %rax,$lo0 # discarded - mov 8($ap),%rax - adc \$0,%rdx - mov %rdx,$hi1 - - lea 1($j),$j # j++ - jmp .L1st_enter - -.align 16 -.L1st: - add %rax,$hi1 - mov ($ap,$j,8),%rax - adc \$0,%rdx - add $hi0,$hi1 # np[j]*m1+ap[j]*bp[0] - mov $lo0,$hi0 - adc \$0,%rdx - mov $hi1,-16(%rsp,$j,8) # tp[j-1] - mov %rdx,$hi1 - -.L1st_enter: - mulq $m0 # ap[j]*bp[0] - add %rax,$hi0 - mov ($np,$j,8),%rax - adc \$0,%rdx - lea 1($j),$j # j++ - mov %rdx,$lo0 - - mulq $m1 # np[j]*m1 - cmp $num,$j - jne .L1st - - add %rax,$hi1 - mov ($ap),%rax # ap[0] - adc \$0,%rdx - add $hi0,$hi1 # np[j]*m1+ap[j]*bp[0] - adc \$0,%rdx - mov $hi1,-16(%rsp,$j,8) # tp[j-1] - mov %rdx,$hi1 - mov $lo0,$hi0 - - xor %rdx,%rdx - add $hi0,$hi1 - adc \$0,%rdx - mov $hi1,-8(%rsp,$num,8) - mov %rdx,(%rsp,$num,8) # store upmost overflow bit - - lea 1($i),$i # i++ - jmp .Louter -.align 16 -.Louter: - mov ($bp,$i,8),$m0 # m0=bp[i] - xor $j,$j # j=0 - mov $n0,$m1 - mov (%rsp),$lo0 - mulq $m0 # ap[0]*bp[i] - add %rax,$lo0 # ap[0]*bp[i]+tp[0] - mov ($np),%rax - adc \$0,%rdx - - imulq $lo0,$m1 # tp[0]*n0 - mov %rdx,$hi0 - - mulq $m1 # np[0]*m1 - add %rax,$lo0 # discarded - mov 8($ap),%rax - adc \$0,%rdx - mov 8(%rsp),$lo0 # tp[1] - mov %rdx,$hi1 - - lea 1($j),$j # j++ - jmp .Linner_enter - -.align 16 -.Linner: - add %rax,$hi1 - mov ($ap,$j,8),%rax - adc \$0,%rdx - add $lo0,$hi1 # np[j]*m1+ap[j]*bp[i]+tp[j] - mov (%rsp,$j,8),$lo0 - adc \$0,%rdx - mov $hi1,-16(%rsp,$j,8) # tp[j-1] - mov %rdx,$hi1 - -.Linner_enter: - mulq $m0 # ap[j]*bp[i] - add %rax,$hi0 - mov ($np,$j,8),%rax - adc \$0,%rdx - add $hi0,$lo0 # ap[j]*bp[i]+tp[j] - mov %rdx,$hi0 - adc \$0,$hi0 - lea 1($j),$j # j++ - - mulq $m1 # np[j]*m1 - cmp $num,$j - jne .Linner - - add %rax,$hi1 - mov ($ap),%rax # ap[0] - adc \$0,%rdx - add $lo0,$hi1 # np[j]*m1+ap[j]*bp[i]+tp[j] - mov (%rsp,$j,8),$lo0 - adc \$0,%rdx - mov $hi1,-16(%rsp,$j,8) # tp[j-1] - mov %rdx,$hi1 - - xor %rdx,%rdx - add $hi0,$hi1 - adc \$0,%rdx - add $lo0,$hi1 # pull upmost overflow bit - adc \$0,%rdx - mov $hi1,-8(%rsp,$num,8) - mov %rdx,(%rsp,$num,8) # store upmost overflow bit - - lea 1($i),$i # i++ - cmp $num,$i - jb .Louter - - xor $i,$i # i=0 and clear CF! - mov (%rsp),%rax # tp[0] - mov $num,$j # j=num - -.align 16 -.Lsub: sbb ($np,$i,8),%rax - mov %rax,($rp,$i,8) # rp[i]=tp[i]-np[i] - mov 8(%rsp,$i,8),%rax # tp[i+1] - lea 1($i),$i # i++ - dec $j # doesn't affect CF! - jnz .Lsub - - sbb \$0,%rax # handle upmost overflow bit - mov \$-1,%rbx - xor %rax,%rbx # not %rax - xor $i,$i - mov $num,$j # j=num - -.Lcopy: # conditional copy - mov ($rp,$i,8),%rcx - mov (%rsp,$i,8),%rdx - and %rbx,%rcx - and %rax,%rdx - mov $num,(%rsp,$i,8) # zap temporary vector - or %rcx,%rdx - mov %rdx,($rp,$i,8) # rp[i]=tp[i] - lea 1($i),$i - sub \$1,$j - jnz .Lcopy - - mov 8(%rsp,$num,8),%rsi # restore %rsp -.cfi_def_cfa %rsi,8 - mov \$1,%rax - mov -48(%rsi),%r15 -.cfi_restore %r15 - mov -40(%rsi),%r14 -.cfi_restore %r14 - mov -32(%rsi),%r13 -.cfi_restore %r13 - mov -24(%rsi),%r12 -.cfi_restore %r12 - mov -16(%rsi),%rbp -.cfi_restore %rbp - mov -8(%rsi),%rbx -.cfi_restore %rbx - lea (%rsi),%rsp -.cfi_def_cfa_register %rsp -.Lmul_epilogue: - ret -.cfi_endproc -.size GFp_bn_mul_mont,.-GFp_bn_mul_mont -___ -{{{ -my @A=("%r10","%r11"); -my @N=("%r13","%rdi"); -$code.=<<___; -.type bn_mul4x_mont,\@function,6 -.align 16 -bn_mul4x_mont: -.cfi_startproc - mov ${num}d,${num}d - mov %rsp,%rax -.cfi_def_cfa_register %rax -.Lmul4x_enter: -___ -$code.=<<___ if ($addx); - and \$0x80100,%r11d - cmp \$0x80100,%r11d - je .Lmulx4x_enter -___ -$code.=<<___; - push %rbx -.cfi_push %rbx - push %rbp -.cfi_push %rbp - push %r12 -.cfi_push %r12 - push %r13 -.cfi_push %r13 - push %r14 -.cfi_push %r14 - push %r15 -.cfi_push %r15 - - neg $num - mov %rsp,%r11 - lea -32(%rsp,$num,8),%r10 # future alloca(8*(num+4)) - neg $num # restore - and \$-1024,%r10 # minimize TLB usage - - sub %r10,%r11 - and \$-4096,%r11 - lea (%r10,%r11),%rsp - mov (%rsp),%r11 - cmp %r10,%rsp - ja .Lmul4x_page_walk - jmp .Lmul4x_page_walk_done - -.Lmul4x_page_walk: - lea -4096(%rsp),%rsp - mov (%rsp),%r11 - cmp %r10,%rsp - ja .Lmul4x_page_walk -.Lmul4x_page_walk_done: - - mov %rax,8(%rsp,$num,8) # tp[num+1]=%rsp -.cfi_cfa_expression %rsp+8,$num,8,mul,plus,deref,+8 -.Lmul4x_body: - mov $rp,16(%rsp,$num,8) # tp[num+2]=$rp - mov %rdx,%r12 # reassign $bp -___ - $bp="%r12"; -$code.=<<___; - mov ($n0),$n0 # pull n0[0] value - mov ($bp),$m0 # m0=bp[0] - mov ($ap),%rax - - xor $i,$i # i=0 - xor $j,$j # j=0 - - mov $n0,$m1 - mulq $m0 # ap[0]*bp[0] - mov %rax,$A[0] - mov ($np),%rax - - imulq $A[0],$m1 # "tp[0]"*n0 - mov %rdx,$A[1] - - mulq $m1 # np[0]*m1 - add %rax,$A[0] # discarded - mov 8($ap),%rax - adc \$0,%rdx - mov %rdx,$N[1] - - mulq $m0 - add %rax,$A[1] - mov 8($np),%rax - adc \$0,%rdx - mov %rdx,$A[0] - - mulq $m1 - add %rax,$N[1] - mov 16($ap),%rax - adc \$0,%rdx - add $A[1],$N[1] - lea 4($j),$j # j++ - adc \$0,%rdx - mov $N[1],(%rsp) - mov %rdx,$N[0] - jmp .L1st4x -.align 16 -.L1st4x: - mulq $m0 # ap[j]*bp[0] - add %rax,$A[0] - mov -16($np,$j,8),%rax - adc \$0,%rdx - mov %rdx,$A[1] - - mulq $m1 # np[j]*m1 - add %rax,$N[0] - mov -8($ap,$j,8),%rax - adc \$0,%rdx - add $A[0],$N[0] # np[j]*m1+ap[j]*bp[0] - adc \$0,%rdx - mov $N[0],-24(%rsp,$j,8) # tp[j-1] - mov %rdx,$N[1] - - mulq $m0 # ap[j]*bp[0] - add %rax,$A[1] - mov -8($np,$j,8),%rax - adc \$0,%rdx - mov %rdx,$A[0] - - mulq $m1 # np[j]*m1 - add %rax,$N[1] - mov ($ap,$j,8),%rax - adc \$0,%rdx - add $A[1],$N[1] # np[j]*m1+ap[j]*bp[0] - adc \$0,%rdx - mov $N[1],-16(%rsp,$j,8) # tp[j-1] - mov %rdx,$N[0] - - mulq $m0 # ap[j]*bp[0] - add %rax,$A[0] - mov ($np,$j,8),%rax - adc \$0,%rdx - mov %rdx,$A[1] - - mulq $m1 # np[j]*m1 - add %rax,$N[0] - mov 8($ap,$j,8),%rax - adc \$0,%rdx - add $A[0],$N[0] # np[j]*m1+ap[j]*bp[0] - adc \$0,%rdx - mov $N[0],-8(%rsp,$j,8) # tp[j-1] - mov %rdx,$N[1] - - mulq $m0 # ap[j]*bp[0] - add %rax,$A[1] - mov 8($np,$j,8),%rax - adc \$0,%rdx - lea 4($j),$j # j++ - mov %rdx,$A[0] - - mulq $m1 # np[j]*m1 - add %rax,$N[1] - mov -16($ap,$j,8),%rax - adc \$0,%rdx - add $A[1],$N[1] # np[j]*m1+ap[j]*bp[0] - adc \$0,%rdx - mov $N[1],-32(%rsp,$j,8) # tp[j-1] - mov %rdx,$N[0] - cmp $num,$j - jb .L1st4x - - mulq $m0 # ap[j]*bp[0] - add %rax,$A[0] - mov -16($np,$j,8),%rax - adc \$0,%rdx - mov %rdx,$A[1] - - mulq $m1 # np[j]*m1 - add %rax,$N[0] - mov -8($ap,$j,8),%rax - adc \$0,%rdx - add $A[0],$N[0] # np[j]*m1+ap[j]*bp[0] - adc \$0,%rdx - mov $N[0],-24(%rsp,$j,8) # tp[j-1] - mov %rdx,$N[1] - - mulq $m0 # ap[j]*bp[0] - add %rax,$A[1] - mov -8($np,$j,8),%rax - adc \$0,%rdx - mov %rdx,$A[0] - - mulq $m1 # np[j]*m1 - add %rax,$N[1] - mov ($ap),%rax # ap[0] - adc \$0,%rdx - add $A[1],$N[1] # np[j]*m1+ap[j]*bp[0] - adc \$0,%rdx - mov $N[1],-16(%rsp,$j,8) # tp[j-1] - mov %rdx,$N[0] - - xor $N[1],$N[1] - add $A[0],$N[0] - adc \$0,$N[1] - mov $N[0],-8(%rsp,$j,8) - mov $N[1],(%rsp,$j,8) # store upmost overflow bit - - lea 1($i),$i # i++ -.align 4 -.Louter4x: - mov ($bp,$i,8),$m0 # m0=bp[i] - xor $j,$j # j=0 - mov (%rsp),$A[0] - mov $n0,$m1 - mulq $m0 # ap[0]*bp[i] - add %rax,$A[0] # ap[0]*bp[i]+tp[0] - mov ($np),%rax - adc \$0,%rdx - - imulq $A[0],$m1 # tp[0]*n0 - mov %rdx,$A[1] - - mulq $m1 # np[0]*m1 - add %rax,$A[0] # "$N[0]", discarded - mov 8($ap),%rax - adc \$0,%rdx - mov %rdx,$N[1] - - mulq $m0 # ap[j]*bp[i] - add %rax,$A[1] - mov 8($np),%rax - adc \$0,%rdx - add 8(%rsp),$A[1] # +tp[1] - adc \$0,%rdx - mov %rdx,$A[0] - - mulq $m1 # np[j]*m1 - add %rax,$N[1] - mov 16($ap),%rax - adc \$0,%rdx - add $A[1],$N[1] # np[j]*m1+ap[j]*bp[i]+tp[j] - lea 4($j),$j # j+=2 - adc \$0,%rdx - mov $N[1],(%rsp) # tp[j-1] - mov %rdx,$N[0] - jmp .Linner4x -.align 16 -.Linner4x: - mulq $m0 # ap[j]*bp[i] - add %rax,$A[0] - mov -16($np,$j,8),%rax - adc \$0,%rdx - add -16(%rsp,$j,8),$A[0] # ap[j]*bp[i]+tp[j] - adc \$0,%rdx - mov %rdx,$A[1] - - mulq $m1 # np[j]*m1 - add %rax,$N[0] - mov -8($ap,$j,8),%rax - adc \$0,%rdx - add $A[0],$N[0] - adc \$0,%rdx - mov $N[0],-24(%rsp,$j,8) # tp[j-1] - mov %rdx,$N[1] - - mulq $m0 # ap[j]*bp[i] - add %rax,$A[1] - mov -8($np,$j,8),%rax - adc \$0,%rdx - add -8(%rsp,$j,8),$A[1] - adc \$0,%rdx - mov %rdx,$A[0] - - mulq $m1 # np[j]*m1 - add %rax,$N[1] - mov ($ap,$j,8),%rax - adc \$0,%rdx - add $A[1],$N[1] - adc \$0,%rdx - mov $N[1],-16(%rsp,$j,8) # tp[j-1] - mov %rdx,$N[0] - - mulq $m0 # ap[j]*bp[i] - add %rax,$A[0] - mov ($np,$j,8),%rax - adc \$0,%rdx - add (%rsp,$j,8),$A[0] # ap[j]*bp[i]+tp[j] - adc \$0,%rdx - mov %rdx,$A[1] - - mulq $m1 # np[j]*m1 - add %rax,$N[0] - mov 8($ap,$j,8),%rax - adc \$0,%rdx - add $A[0],$N[0] - adc \$0,%rdx - mov $N[0],-8(%rsp,$j,8) # tp[j-1] - mov %rdx,$N[1] - - mulq $m0 # ap[j]*bp[i] - add %rax,$A[1] - mov 8($np,$j,8),%rax - adc \$0,%rdx - add 8(%rsp,$j,8),$A[1] - adc \$0,%rdx - lea 4($j),$j # j++ - mov %rdx,$A[0] - - mulq $m1 # np[j]*m1 - add %rax,$N[1] - mov -16($ap,$j,8),%rax - adc \$0,%rdx - add $A[1],$N[1] - adc \$0,%rdx - mov $N[1],-32(%rsp,$j,8) # tp[j-1] - mov %rdx,$N[0] - cmp $num,$j - jb .Linner4x - - mulq $m0 # ap[j]*bp[i] - add %rax,$A[0] - mov -16($np,$j,8),%rax - adc \$0,%rdx - add -16(%rsp,$j,8),$A[0] # ap[j]*bp[i]+tp[j] - adc \$0,%rdx - mov %rdx,$A[1] - - mulq $m1 # np[j]*m1 - add %rax,$N[0] - mov -8($ap,$j,8),%rax - adc \$0,%rdx - add $A[0],$N[0] - adc \$0,%rdx - mov $N[0],-24(%rsp,$j,8) # tp[j-1] - mov %rdx,$N[1] - - mulq $m0 # ap[j]*bp[i] - add %rax,$A[1] - mov -8($np,$j,8),%rax - adc \$0,%rdx - add -8(%rsp,$j,8),$A[1] - adc \$0,%rdx - lea 1($i),$i # i++ - mov %rdx,$A[0] - - mulq $m1 # np[j]*m1 - add %rax,$N[1] - mov ($ap),%rax # ap[0] - adc \$0,%rdx - add $A[1],$N[1] - adc \$0,%rdx - mov $N[1],-16(%rsp,$j,8) # tp[j-1] - mov %rdx,$N[0] - - xor $N[1],$N[1] - add $A[0],$N[0] - adc \$0,$N[1] - add (%rsp,$num,8),$N[0] # pull upmost overflow bit - adc \$0,$N[1] - mov $N[0],-8(%rsp,$j,8) - mov $N[1],(%rsp,$j,8) # store upmost overflow bit - - cmp $num,$i - jb .Louter4x -___ -{ -my @ri=("%rax","%rdx",$m0,$m1); -$code.=<<___; - mov 16(%rsp,$num,8),$rp # restore $rp - lea -4($num),$j - mov 0(%rsp),@ri[0] # tp[0] - mov 8(%rsp),@ri[1] # tp[1] - shr \$2,$j # j=num/4-1 - lea (%rsp),$ap # borrow ap for tp - xor $i,$i # i=0 and clear CF! - - sub 0($np),@ri[0] - mov 16($ap),@ri[2] # tp[2] - mov 24($ap),@ri[3] # tp[3] - sbb 8($np),@ri[1] - -.Lsub4x: - mov @ri[0],0($rp,$i,8) # rp[i]=tp[i]-np[i] - mov @ri[1],8($rp,$i,8) # rp[i]=tp[i]-np[i] - sbb 16($np,$i,8),@ri[2] - mov 32($ap,$i,8),@ri[0] # tp[i+1] - mov 40($ap,$i,8),@ri[1] - sbb 24($np,$i,8),@ri[3] - mov @ri[2],16($rp,$i,8) # rp[i]=tp[i]-np[i] - mov @ri[3],24($rp,$i,8) # rp[i]=tp[i]-np[i] - sbb 32($np,$i,8),@ri[0] - mov 48($ap,$i,8),@ri[2] - mov 56($ap,$i,8),@ri[3] - sbb 40($np,$i,8),@ri[1] - lea 4($i),$i # i++ - dec $j # doesn't affect CF! - jnz .Lsub4x - - mov @ri[0],0($rp,$i,8) # rp[i]=tp[i]-np[i] - mov 32($ap,$i,8),@ri[0] # load overflow bit - sbb 16($np,$i,8),@ri[2] - mov @ri[1],8($rp,$i,8) # rp[i]=tp[i]-np[i] - sbb 24($np,$i,8),@ri[3] - mov @ri[2],16($rp,$i,8) # rp[i]=tp[i]-np[i] - - sbb \$0,@ri[0] # handle upmost overflow bit - mov @ri[3],24($rp,$i,8) # rp[i]=tp[i]-np[i] - pxor %xmm0,%xmm0 - movq @ri[0],%xmm4 - pcmpeqd %xmm5,%xmm5 - pshufd \$0,%xmm4,%xmm4 - mov $num,$j - pxor %xmm4,%xmm5 - shr \$2,$j # j=num/4 - xor %eax,%eax # i=0 - - jmp .Lcopy4x -.align 16 -.Lcopy4x: # conditional copy - movdqa (%rsp,%rax),%xmm1 - movdqu ($rp,%rax),%xmm2 - pand %xmm4,%xmm1 - pand %xmm5,%xmm2 - movdqa 16(%rsp,%rax),%xmm3 - movdqa %xmm0,(%rsp,%rax) - por %xmm2,%xmm1 - movdqu 16($rp,%rax),%xmm2 - movdqu %xmm1,($rp,%rax) - pand %xmm4,%xmm3 - pand %xmm5,%xmm2 - movdqa %xmm0,16(%rsp,%rax) - por %xmm2,%xmm3 - movdqu %xmm3,16($rp,%rax) - lea 32(%rax),%rax - dec $j - jnz .Lcopy4x -___ -} -$code.=<<___; - mov 8(%rsp,$num,8),%rsi # restore %rsp -.cfi_def_cfa %rsi, 8 - mov \$1,%rax - mov -48(%rsi),%r15 -.cfi_restore %r15 - mov -40(%rsi),%r14 -.cfi_restore %r14 - mov -32(%rsi),%r13 -.cfi_restore %r13 - mov -24(%rsi),%r12 -.cfi_restore %r12 - mov -16(%rsi),%rbp -.cfi_restore %rbp - mov -8(%rsi),%rbx -.cfi_restore %rbx - lea (%rsi),%rsp -.cfi_def_cfa_register %rsp -.Lmul4x_epilogue: - ret -.cfi_endproc -.size bn_mul4x_mont,.-bn_mul4x_mont -___ -}}} - {{{ -###################################################################### -# void bn_sqr8x_mont( -my $rptr="%rdi"; # const BN_ULONG *rptr, -my $aptr="%rsi"; # const BN_ULONG *aptr, -my $bptr="%rdx"; # not used -my $nptr="%rcx"; # const BN_ULONG *nptr, -my $n0 ="%r8"; # const BN_ULONG *n0); -my $num ="%r9"; # int num, has to be divisible by 8 - -my ($i,$j,$tptr)=("%rbp","%rcx",$rptr); -my @A0=("%r10","%r11"); -my @A1=("%r12","%r13"); -my ($a0,$a1,$ai)=("%r14","%r15","%rbx"); - -$code.=<<___ if ($addx); -.extern GFp_bn_sqrx8x_internal # see x86_64-mont5 module -___ -$code.=<<___; -.extern GFp_bn_sqr8x_internal # see x86_64-mont5 module - -.type bn_sqr8x_mont,\@function,6 -.align 32 -bn_sqr8x_mont: -.cfi_startproc - mov %rsp,%rax -.cfi_def_cfa_register %rax -.Lsqr8x_enter: - push %rbx -.cfi_push %rbx - push %rbp -.cfi_push %rbp - push %r12 -.cfi_push %r12 - push %r13 -.cfi_push %r13 - push %r14 -.cfi_push %r14 - push %r15 -.cfi_push %r15 -.Lsqr8x_prologue: - - mov ${num}d,%r10d - shl \$3,${num}d # convert $num to bytes - shl \$3+2,%r10 # 4*$num - neg $num - - ############################################################## - # ensure that stack frame doesn't alias with $aptr modulo - # 4096. this is done to allow memory disambiguation logic - # do its job. - # - lea -64(%rsp,$num,2),%r11 - mov %rsp,%rbp - mov ($n0),$n0 # *n0 - sub $aptr,%r11 - and \$4095,%r11 - cmp %r11,%r10 - jb .Lsqr8x_sp_alt - sub %r11,%rbp # align with $aptr - lea -64(%rbp,$num,2),%rbp # future alloca(frame+2*$num) - jmp .Lsqr8x_sp_done - -.align 32 -.Lsqr8x_sp_alt: - lea 4096-64(,$num,2),%r10 # 4096-frame-2*$num - lea -64(%rbp,$num,2),%rbp # future alloca(frame+2*$num) - sub %r10,%r11 - mov \$0,%r10 - cmovc %r10,%r11 - sub %r11,%rbp -.Lsqr8x_sp_done: - and \$-64,%rbp - mov %rsp,%r11 - sub %rbp,%r11 - and \$-4096,%r11 - lea (%rbp,%r11),%rsp - mov (%rsp),%r10 - cmp %rbp,%rsp - ja .Lsqr8x_page_walk - jmp .Lsqr8x_page_walk_done - -.align 16 -.Lsqr8x_page_walk: - lea -4096(%rsp),%rsp - mov (%rsp),%r10 - cmp %rbp,%rsp - ja .Lsqr8x_page_walk -.Lsqr8x_page_walk_done: - - mov $num,%r10 - neg $num - - mov $n0, 32(%rsp) - mov %rax, 40(%rsp) # save original %rsp -.cfi_cfa_expression %rsp+40,deref,+8 -.Lsqr8x_body: - - movq $nptr, %xmm2 # save pointer to modulus - pxor %xmm0,%xmm0 - movq $rptr,%xmm1 # save $rptr - movq %r10, %xmm3 # -$num -___ -$code.=<<___ if ($addx); - mov GFp_ia32cap_P+8(%rip),%eax - and \$0x80100,%eax - cmp \$0x80100,%eax - jne .Lsqr8x_nox - - call GFp_bn_sqrx8x_internal # see x86_64-mont5 module - # %rax top-most carry - # %rbp nptr - # %rcx -8*num - # %r8 end of tp[2*num] - lea (%r8,%rcx),%rbx - mov %rcx,$num - mov %rcx,%rdx - movq %xmm1,$rptr - sar \$3+2,%rcx # %cf=0 - jmp .Lsqr8x_sub - -.align 32 -.Lsqr8x_nox: -___ -$code.=<<___; - call GFp_bn_sqr8x_internal # see x86_64-mont5 module - # %rax top-most carry - # %rbp nptr - # %r8 -8*num - # %rdi end of tp[2*num] - lea (%rdi,$num),%rbx - mov $num,%rcx - mov $num,%rdx - movq %xmm1,$rptr - sar \$3+2,%rcx # %cf=0 - jmp .Lsqr8x_sub - -.align 32 -.Lsqr8x_sub: - mov 8*0(%rbx),%r12 - mov 8*1(%rbx),%r13 - mov 8*2(%rbx),%r14 - mov 8*3(%rbx),%r15 - lea 8*4(%rbx),%rbx - sbb 8*0(%rbp),%r12 - sbb 8*1(%rbp),%r13 - sbb 8*2(%rbp),%r14 - sbb 8*3(%rbp),%r15 - lea 8*4(%rbp),%rbp - mov %r12,8*0($rptr) - mov %r13,8*1($rptr) - mov %r14,8*2($rptr) - mov %r15,8*3($rptr) - lea 8*4($rptr),$rptr - inc %rcx # preserves %cf - jnz .Lsqr8x_sub - - sbb \$0,%rax # top-most carry - lea (%rbx,$num),%rbx # rewind - lea ($rptr,$num),$rptr # rewind - - movq %rax,%xmm1 - pxor %xmm0,%xmm0 - pshufd \$0,%xmm1,%xmm1 - mov 40(%rsp),%rsi # restore %rsp -.cfi_def_cfa %rsi,8 - jmp .Lsqr8x_cond_copy - -.align 32 -.Lsqr8x_cond_copy: - movdqa 16*0(%rbx),%xmm2 - movdqa 16*1(%rbx),%xmm3 - lea 16*2(%rbx),%rbx - movdqu 16*0($rptr),%xmm4 - movdqu 16*1($rptr),%xmm5 - lea 16*2($rptr),$rptr - movdqa %xmm0,-16*2(%rbx) # zero tp - movdqa %xmm0,-16*1(%rbx) - movdqa %xmm0,-16*2(%rbx,%rdx) - movdqa %xmm0,-16*1(%rbx,%rdx) - pcmpeqd %xmm1,%xmm0 - pand %xmm1,%xmm2 - pand %xmm1,%xmm3 - pand %xmm0,%xmm4 - pand %xmm0,%xmm5 - pxor %xmm0,%xmm0 - por %xmm2,%xmm4 - por %xmm3,%xmm5 - movdqu %xmm4,-16*2($rptr) - movdqu %xmm5,-16*1($rptr) - add \$32,$num - jnz .Lsqr8x_cond_copy - - mov \$1,%rax - mov -48(%rsi),%r15 -.cfi_restore %r15 - mov -40(%rsi),%r14 -.cfi_restore %r14 - mov -32(%rsi),%r13 -.cfi_restore %r13 - mov -24(%rsi),%r12 -.cfi_restore %r12 - mov -16(%rsi),%rbp -.cfi_restore %rbp - mov -8(%rsi),%rbx -.cfi_restore %rbx - lea (%rsi),%rsp -.cfi_def_cfa_register %rsp -.Lsqr8x_epilogue: - ret -.cfi_endproc -.size bn_sqr8x_mont,.-bn_sqr8x_mont -___ -}}} - -if ($addx) {{{ -my $bp="%rdx"; # original value - -$code.=<<___; -.type bn_mulx4x_mont,\@function,6 -.align 32 -bn_mulx4x_mont: -.cfi_startproc - mov %rsp,%rax -.cfi_def_cfa_register %rax -.Lmulx4x_enter: - push %rbx -.cfi_push %rbx - push %rbp -.cfi_push %rbp - push %r12 -.cfi_push %r12 - push %r13 -.cfi_push %r13 - push %r14 -.cfi_push %r14 - push %r15 -.cfi_push %r15 -.Lmulx4x_prologue: - - shl \$3,${num}d # convert $num to bytes - xor %r10,%r10 - sub $num,%r10 # -$num - mov ($n0),$n0 # *n0 - lea -72(%rsp,%r10),%rbp # future alloca(frame+$num+8) - and \$-128,%rbp - mov %rsp,%r11 - sub %rbp,%r11 - and \$-4096,%r11 - lea (%rbp,%r11),%rsp - mov (%rsp),%r10 - cmp %rbp,%rsp - ja .Lmulx4x_page_walk - jmp .Lmulx4x_page_walk_done - -.align 16 -.Lmulx4x_page_walk: - lea -4096(%rsp),%rsp - mov (%rsp),%r10 - cmp %rbp,%rsp - ja .Lmulx4x_page_walk -.Lmulx4x_page_walk_done: - - lea ($bp,$num),%r10 - ############################################################## - # Stack layout - # +0 num - # +8 off-loaded &b[i] - # +16 end of b[num] - # +24 saved n0 - # +32 saved rp - # +40 saved %rsp - # +48 inner counter - # +56 - # +64 tmp[num+1] - # - mov $num,0(%rsp) # save $num - shr \$5,$num - mov %r10,16(%rsp) # end of b[num] - sub \$1,$num - mov $n0, 24(%rsp) # save *n0 - mov $rp, 32(%rsp) # save $rp - mov %rax,40(%rsp) # save original %rsp -.cfi_cfa_expression %rsp+40,deref,+8 - mov $num,48(%rsp) # inner counter - jmp .Lmulx4x_body - -.align 32 -.Lmulx4x_body: -___ -my ($aptr, $bptr, $nptr, $tptr, $mi, $bi, $zero, $num)= - ("%rsi","%rdi","%rcx","%rbx","%r8","%r9","%rbp","%rax"); -my $rptr=$bptr; -$code.=<<___; - lea 8($bp),$bptr - mov ($bp),%rdx # b[0], $bp==%rdx actually - lea 64+32(%rsp),$tptr - mov %rdx,$bi - - mulx 0*8($aptr),$mi,%rax # a[0]*b[0] - mulx 1*8($aptr),%r11,%r14 # a[1]*b[0] - add %rax,%r11 - mov $bptr,8(%rsp) # off-load &b[i] - mulx 2*8($aptr),%r12,%r13 # ... - adc %r14,%r12 - adc \$0,%r13 - - mov $mi,$bptr # borrow $bptr - imulq 24(%rsp),$mi # "t[0]"*n0 - xor $zero,$zero # cf=0, of=0 - - mulx 3*8($aptr),%rax,%r14 - mov $mi,%rdx - lea 4*8($aptr),$aptr - adcx %rax,%r13 - adcx $zero,%r14 # cf=0 - - mulx 0*8($nptr),%rax,%r10 - adcx %rax,$bptr # discarded - adox %r11,%r10 - mulx 1*8($nptr),%rax,%r11 - adcx %rax,%r10 - adox %r12,%r11 - .byte 0xc4,0x62,0xfb,0xf6,0xa1,0x10,0x00,0x00,0x00 # mulx 2*8($nptr),%rax,%r12 - mov 48(%rsp),$bptr # counter value - mov %r10,-4*8($tptr) - adcx %rax,%r11 - adox %r13,%r12 - mulx 3*8($nptr),%rax,%r15 - mov $bi,%rdx - mov %r11,-3*8($tptr) - adcx %rax,%r12 - adox $zero,%r15 # of=0 - lea 4*8($nptr),$nptr - mov %r12,-2*8($tptr) - - jmp .Lmulx4x_1st - -.align 32 -.Lmulx4x_1st: - adcx $zero,%r15 # cf=0, modulo-scheduled - mulx 0*8($aptr),%r10,%rax # a[4]*b[0] - adcx %r14,%r10 - mulx 1*8($aptr),%r11,%r14 # a[5]*b[0] - adcx %rax,%r11 - mulx 2*8($aptr),%r12,%rax # ... - adcx %r14,%r12 - mulx 3*8($aptr),%r13,%r14 - .byte 0x67,0x67 - mov $mi,%rdx - adcx %rax,%r13 - adcx $zero,%r14 # cf=0 - lea 4*8($aptr),$aptr - lea 4*8($tptr),$tptr - - adox %r15,%r10 - mulx 0*8($nptr),%rax,%r15 - adcx %rax,%r10 - adox %r15,%r11 - mulx 1*8($nptr),%rax,%r15 - adcx %rax,%r11 - adox %r15,%r12 - mulx 2*8($nptr),%rax,%r15 - mov %r10,-5*8($tptr) - adcx %rax,%r12 - mov %r11,-4*8($tptr) - adox %r15,%r13 - mulx 3*8($nptr),%rax,%r15 - mov $bi,%rdx - mov %r12,-3*8($tptr) - adcx %rax,%r13 - adox $zero,%r15 - lea 4*8($nptr),$nptr - mov %r13,-2*8($tptr) - - dec $bptr # of=0, pass cf - jnz .Lmulx4x_1st - - mov 0(%rsp),$num # load num - mov 8(%rsp),$bptr # re-load &b[i] - adc $zero,%r15 # modulo-scheduled - add %r15,%r14 - sbb %r15,%r15 # top-most carry - mov %r14,-1*8($tptr) - jmp .Lmulx4x_outer - -.align 32 -.Lmulx4x_outer: - mov ($bptr),%rdx # b[i] - lea 8($bptr),$bptr # b++ - sub $num,$aptr # rewind $aptr - mov %r15,($tptr) # save top-most carry - lea 64+4*8(%rsp),$tptr - sub $num,$nptr # rewind $nptr - - mulx 0*8($aptr),$mi,%r11 # a[0]*b[i] - xor %ebp,%ebp # xor $zero,$zero # cf=0, of=0 - mov %rdx,$bi - mulx 1*8($aptr),%r14,%r12 # a[1]*b[i] - adox -4*8($tptr),$mi - adcx %r14,%r11 - mulx 2*8($aptr),%r15,%r13 # ... - adox -3*8($tptr),%r11 - adcx %r15,%r12 - adox -2*8($tptr),%r12 - adcx $zero,%r13 - adox $zero,%r13 - - mov $bptr,8(%rsp) # off-load &b[i] - mov $mi,%r15 - imulq 24(%rsp),$mi # "t[0]"*n0 - xor %ebp,%ebp # xor $zero,$zero # cf=0, of=0 - - mulx 3*8($aptr),%rax,%r14 - mov $mi,%rdx - adcx %rax,%r13 - adox -1*8($tptr),%r13 - adcx $zero,%r14 - lea 4*8($aptr),$aptr - adox $zero,%r14 - - mulx 0*8($nptr),%rax,%r10 - adcx %rax,%r15 # discarded - adox %r11,%r10 - mulx 1*8($nptr),%rax,%r11 - adcx %rax,%r10 - adox %r12,%r11 - mulx 2*8($nptr),%rax,%r12 - mov %r10,-4*8($tptr) - adcx %rax,%r11 - adox %r13,%r12 - mulx 3*8($nptr),%rax,%r15 - mov $bi,%rdx - mov %r11,-3*8($tptr) - lea 4*8($nptr),$nptr - adcx %rax,%r12 - adox $zero,%r15 # of=0 - mov 48(%rsp),$bptr # counter value - mov %r12,-2*8($tptr) - - jmp .Lmulx4x_inner - -.align 32 -.Lmulx4x_inner: - mulx 0*8($aptr),%r10,%rax # a[4]*b[i] - adcx $zero,%r15 # cf=0, modulo-scheduled - adox %r14,%r10 - mulx 1*8($aptr),%r11,%r14 # a[5]*b[i] - adcx 0*8($tptr),%r10 - adox %rax,%r11 - mulx 2*8($aptr),%r12,%rax # ... - adcx 1*8($tptr),%r11 - adox %r14,%r12 - mulx 3*8($aptr),%r13,%r14 - mov $mi,%rdx - adcx 2*8($tptr),%r12 - adox %rax,%r13 - adcx 3*8($tptr),%r13 - adox $zero,%r14 # of=0 - lea 4*8($aptr),$aptr - lea 4*8($tptr),$tptr - adcx $zero,%r14 # cf=0 - - adox %r15,%r10 - mulx 0*8($nptr),%rax,%r15 - adcx %rax,%r10 - adox %r15,%r11 - mulx 1*8($nptr),%rax,%r15 - adcx %rax,%r11 - adox %r15,%r12 - mulx 2*8($nptr),%rax,%r15 - mov %r10,-5*8($tptr) - adcx %rax,%r12 - adox %r15,%r13 - mulx 3*8($nptr),%rax,%r15 - mov $bi,%rdx - mov %r11,-4*8($tptr) - mov %r12,-3*8($tptr) - adcx %rax,%r13 - adox $zero,%r15 - lea 4*8($nptr),$nptr - mov %r13,-2*8($tptr) - - dec $bptr # of=0, pass cf - jnz .Lmulx4x_inner - - mov 0(%rsp),$num # load num - mov 8(%rsp),$bptr # re-load &b[i] - adc $zero,%r15 # modulo-scheduled - sub 0*8($tptr),$zero # pull top-most carry - adc %r15,%r14 - sbb %r15,%r15 # top-most carry - mov %r14,-1*8($tptr) - - cmp 16(%rsp),$bptr - jne .Lmulx4x_outer - - lea 64(%rsp),$tptr - sub $num,$nptr # rewind $nptr - neg %r15 - mov $num,%rdx - shr \$3+2,$num # %cf=0 - mov 32(%rsp),$rptr # restore rp - jmp .Lmulx4x_sub - -.align 32 -.Lmulx4x_sub: - mov 8*0($tptr),%r11 - mov 8*1($tptr),%r12 - mov 8*2($tptr),%r13 - mov 8*3($tptr),%r14 - lea 8*4($tptr),$tptr - sbb 8*0($nptr),%r11 - sbb 8*1($nptr),%r12 - sbb 8*2($nptr),%r13 - sbb 8*3($nptr),%r14 - lea 8*4($nptr),$nptr - mov %r11,8*0($rptr) - mov %r12,8*1($rptr) - mov %r13,8*2($rptr) - mov %r14,8*3($rptr) - lea 8*4($rptr),$rptr - dec $num # preserves %cf - jnz .Lmulx4x_sub - - sbb \$0,%r15 # top-most carry - lea 64(%rsp),$tptr - sub %rdx,$rptr # rewind - - movq %r15,%xmm1 - pxor %xmm0,%xmm0 - pshufd \$0,%xmm1,%xmm1 - mov 40(%rsp),%rsi # restore %rsp -.cfi_def_cfa %rsi,8 - jmp .Lmulx4x_cond_copy - -.align 32 -.Lmulx4x_cond_copy: - movdqa 16*0($tptr),%xmm2 - movdqa 16*1($tptr),%xmm3 - lea 16*2($tptr),$tptr - movdqu 16*0($rptr),%xmm4 - movdqu 16*1($rptr),%xmm5 - lea 16*2($rptr),$rptr - movdqa %xmm0,-16*2($tptr) # zero tp - movdqa %xmm0,-16*1($tptr) - pcmpeqd %xmm1,%xmm0 - pand %xmm1,%xmm2 - pand %xmm1,%xmm3 - pand %xmm0,%xmm4 - pand %xmm0,%xmm5 - pxor %xmm0,%xmm0 - por %xmm2,%xmm4 - por %xmm3,%xmm5 - movdqu %xmm4,-16*2($rptr) - movdqu %xmm5,-16*1($rptr) - sub \$32,%rdx - jnz .Lmulx4x_cond_copy - - mov %rdx,($tptr) - - mov \$1,%rax - mov -48(%rsi),%r15 -.cfi_restore %r15 - mov -40(%rsi),%r14 -.cfi_restore %r14 - mov -32(%rsi),%r13 -.cfi_restore %r13 - mov -24(%rsi),%r12 -.cfi_restore %r12 - mov -16(%rsi),%rbp -.cfi_restore %rbp - mov -8(%rsi),%rbx -.cfi_restore %rbx - lea (%rsi),%rsp -.cfi_def_cfa_register %rsp -.Lmulx4x_epilogue: - ret -.cfi_endproc -.size bn_mulx4x_mont,.-bn_mulx4x_mont -___ -}}} -$code.=<<___; -.asciz "Montgomery Multiplication for x86_64, CRYPTOGAMS by " -.align 16 -___ - -# EXCEPTION_DISPOSITION handler (EXCEPTION_RECORD *rec,ULONG64 frame, -# CONTEXT *context,DISPATCHER_CONTEXT *disp) -if ($win64) { -$rec="%rcx"; -$frame="%rdx"; -$context="%r8"; -$disp="%r9"; - -$code.=<<___; -.extern __imp_RtlVirtualUnwind -.type mul_handler,\@abi-omnipotent -.align 16 -mul_handler: - push %rsi - push %rdi - push %rbx - push %rbp - push %r12 - push %r13 - push %r14 - push %r15 - pushfq - sub \$64,%rsp - - mov 120($context),%rax # pull context->Rax - mov 248($context),%rbx # pull context->Rip - - mov 8($disp),%rsi # disp->ImageBase - mov 56($disp),%r11 # disp->HandlerData - - mov 0(%r11),%r10d # HandlerData[0] - lea (%rsi,%r10),%r10 # end of prologue label - cmp %r10,%rbx # context->RipRsp - - mov 4(%r11),%r10d # HandlerData[1] - lea (%rsi,%r10),%r10 # epilogue label - cmp %r10,%rbx # context->Rip>=epilogue label - jae .Lcommon_seh_tail - - mov 192($context),%r10 # pull $num - mov 8(%rax,%r10,8),%rax # pull saved stack pointer - - jmp .Lcommon_pop_regs -.size mul_handler,.-mul_handler - -.type sqr_handler,\@abi-omnipotent -.align 16 -sqr_handler: - push %rsi - push %rdi - push %rbx - push %rbp - push %r12 - push %r13 - push %r14 - push %r15 - pushfq - sub \$64,%rsp - - mov 120($context),%rax # pull context->Rax - mov 248($context),%rbx # pull context->Rip - - mov 8($disp),%rsi # disp->ImageBase - mov 56($disp),%r11 # disp->HandlerData - - mov 0(%r11),%r10d # HandlerData[0] - lea (%rsi,%r10),%r10 # end of prologue label - cmp %r10,%rbx # context->Rip<.Lsqr_prologue - jb .Lcommon_seh_tail - - mov 4(%r11),%r10d # HandlerData[1] - lea (%rsi,%r10),%r10 # body label - cmp %r10,%rbx # context->Rip<.Lsqr_body - jb .Lcommon_pop_regs - - mov 152($context),%rax # pull context->Rsp - - mov 8(%r11),%r10d # HandlerData[2] - lea (%rsi,%r10),%r10 # epilogue label - cmp %r10,%rbx # context->Rip>=.Lsqr_epilogue - jae .Lcommon_seh_tail - - mov 40(%rax),%rax # pull saved stack pointer - -.Lcommon_pop_regs: - mov -8(%rax),%rbx - mov -16(%rax),%rbp - mov -24(%rax),%r12 - mov -32(%rax),%r13 - mov -40(%rax),%r14 - mov -48(%rax),%r15 - mov %rbx,144($context) # restore context->Rbx - mov %rbp,160($context) # restore context->Rbp - mov %r12,216($context) # restore context->R12 - mov %r13,224($context) # restore context->R13 - mov %r14,232($context) # restore context->R14 - mov %r15,240($context) # restore context->R15 - -.Lcommon_seh_tail: - mov 8(%rax),%rdi - mov 16(%rax),%rsi - mov %rax,152($context) # restore context->Rsp - mov %rsi,168($context) # restore context->Rsi - mov %rdi,176($context) # restore context->Rdi - - mov 40($disp),%rdi # disp->ContextRecord - mov $context,%rsi # context - mov \$154,%ecx # sizeof(CONTEXT) - .long 0xa548f3fc # cld; rep movsq - - mov $disp,%rsi - xor %rcx,%rcx # arg1, UNW_FLAG_NHANDLER - mov 8(%rsi),%rdx # arg2, disp->ImageBase - mov 0(%rsi),%r8 # arg3, disp->ControlPc - mov 16(%rsi),%r9 # arg4, disp->FunctionEntry - mov 40(%rsi),%r10 # disp->ContextRecord - lea 56(%rsi),%r11 # &disp->HandlerData - lea 24(%rsi),%r12 # &disp->EstablisherFrame - mov %r10,32(%rsp) # arg5 - mov %r11,40(%rsp) # arg6 - mov %r12,48(%rsp) # arg7 - mov %rcx,56(%rsp) # arg8, (NULL) - call *__imp_RtlVirtualUnwind(%rip) - - mov \$1,%eax # ExceptionContinueSearch - add \$64,%rsp - popfq - pop %r15 - pop %r14 - pop %r13 - pop %r12 - pop %rbp - pop %rbx - pop %rdi - pop %rsi - ret -.size sqr_handler,.-sqr_handler - -.section .pdata -.align 4 - .rva .LSEH_begin_GFp_bn_mul_mont - .rva .LSEH_end_GFp_bn_mul_mont - .rva .LSEH_info_GFp_bn_mul_mont - - .rva .LSEH_begin_bn_mul4x_mont - .rva .LSEH_end_bn_mul4x_mont - .rva .LSEH_info_bn_mul4x_mont - - .rva .LSEH_begin_bn_sqr8x_mont - .rva .LSEH_end_bn_sqr8x_mont - .rva .LSEH_info_bn_sqr8x_mont -___ -$code.=<<___ if ($addx); - .rva .LSEH_begin_bn_mulx4x_mont - .rva .LSEH_end_bn_mulx4x_mont - .rva .LSEH_info_bn_mulx4x_mont -___ -$code.=<<___; -.section .xdata -.align 8 -.LSEH_info_GFp_bn_mul_mont: - .byte 9,0,0,0 - .rva mul_handler - .rva .Lmul_body,.Lmul_epilogue # HandlerData[] -.LSEH_info_bn_mul4x_mont: - .byte 9,0,0,0 - .rva mul_handler - .rva .Lmul4x_body,.Lmul4x_epilogue # HandlerData[] -.LSEH_info_bn_sqr8x_mont: - .byte 9,0,0,0 - .rva sqr_handler - .rva .Lsqr8x_prologue,.Lsqr8x_body,.Lsqr8x_epilogue # HandlerData[] -.align 8 -___ -$code.=<<___ if ($addx); -.LSEH_info_bn_mulx4x_mont: - .byte 9,0,0,0 - .rva sqr_handler - .rva .Lmulx4x_prologue,.Lmulx4x_body,.Lmulx4x_epilogue # HandlerData[] -.align 8 -___ -} - -print $code; -close STDOUT or die "error closing STDOUT"; diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/bn/asm/x86-mont.pl temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/bn/asm/x86-mont.pl --- temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/bn/asm/x86-mont.pl 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/bn/asm/x86-mont.pl 1970-01-01 00:00:00.000000000 +0000 @@ -1,336 +0,0 @@ -#! /usr/bin/env perl -# Copyright 2005-2016 The OpenSSL Project Authors. All Rights Reserved. -# -# Licensed under the OpenSSL license (the "License"). You may not use -# this file except in compliance with the License. You can obtain a copy -# in the file LICENSE in the source distribution or at -# https://www.openssl.org/source/license.html - - -# ==================================================================== -# Written by Andy Polyakov for the OpenSSL -# project. The module is, however, dual licensed under OpenSSL and -# CRYPTOGAMS licenses depending on where you obtain it. For further -# details see http://www.openssl.org/~appro/cryptogams/. -# ==================================================================== - -# October 2005 -# -# This is a "teaser" code, as it can be improved in several ways... -# First of all non-SSE2 path should be implemented (yes, for now it -# performs Montgomery multiplication/convolution only on SSE2-capable -# CPUs such as P4, others fall down to original code). Then inner loop -# can be unrolled and modulo-scheduled to improve ILP and possibly -# moved to 128-bit XMM register bank (though it would require input -# rearrangement and/or increase bus bandwidth utilization). Dedicated -# squaring procedure should give further performance improvement... -# Yet, for being draft, the code improves rsa512 *sign* benchmark by -# 110%(!), rsa1024 one - by 70% and rsa4096 - by 20%:-) - -# December 2006 -# -# Modulo-scheduling SSE2 loops results in further 15-20% improvement. -# Integer-only code [being equipped with dedicated squaring procedure] -# gives ~40% on rsa512 sign benchmark... - -$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; -push(@INC,"${dir}","${dir}../../../perlasm"); -require "x86asm.pl"; - -$output = pop; -open STDOUT,">$output"; - -&asm_init($ARGV[0]); - -$sse2=0; -for (@ARGV) { $sse2=1 if (/-DOPENSSL_IA32_SSE2/); } - -&external_label("GFp_ia32cap_P") if ($sse2); - -&function_begin("GFp_bn_mul_mont"); - -$i="edx"; -$j="ecx"; -$ap="esi"; $tp="esi"; # overlapping variables!!! -$rp="edi"; $bp="edi"; # overlapping variables!!! -$np="ebp"; -$num="ebx"; - -$_num=&DWP(4*0,"esp"); # stack top layout -$_rp=&DWP(4*1,"esp"); -$_ap=&DWP(4*2,"esp"); -$_bp=&DWP(4*3,"esp"); -$_np=&DWP(4*4,"esp"); -$_n0=&DWP(4*5,"esp"); $_n0q=&QWP(4*5,"esp"); -$_sp=&DWP(4*6,"esp"); -$_bpend=&DWP(4*7,"esp"); -$frame=32; # size of above frame rounded up to 16n - - &xor ("eax","eax"); - &mov ("edi",&wparam(5)); # int num - - &lea ("esi",&wparam(0)); # put aside pointer to argument block - &lea ("edx",&wparam(1)); # load ap - &add ("edi",2); # extra two words on top of tp - &neg ("edi"); - &lea ("ebp",&DWP(-$frame,"esp","edi",4)); # future alloca($frame+4*(num+2)) - &neg ("edi"); - - # minimize cache contention by arranging 2K window between stack - # pointer and ap argument [np is also position sensitive vector, - # but it's assumed to be near ap, as it's allocated at ~same - # time]. - &mov ("eax","ebp"); - &sub ("eax","edx"); - &and ("eax",2047); - &sub ("ebp","eax"); # this aligns sp and ap modulo 2048 - - &xor ("edx","ebp"); - &and ("edx",2048); - &xor ("edx",2048); - &sub ("ebp","edx"); # this splits them apart modulo 4096 - - &and ("ebp",-64); # align to cache line - - # An OS-agnostic version of __chkstk. - # - # Some OSes (Windows) insist on stack being "wired" to - # physical memory in strictly sequential manner, i.e. if stack - # allocation spans two pages, then reference to farmost one can - # be punishable by SEGV. But page walking can do good even on - # other OSes, because it guarantees that villain thread hits - # the guard page before it can make damage to innocent one... - &mov ("eax","esp"); - &sub ("eax","ebp"); - &and ("eax",-4096); - &mov ("edx","esp"); # saved stack pointer! - &lea ("esp",&DWP(0,"ebp","eax")); - &mov ("eax",&DWP(0,"esp")); - &cmp ("esp","ebp"); - &ja (&label("page_walk")); - &jmp (&label("page_walk_done")); - -&set_label("page_walk",16); - &lea ("esp",&DWP(-4096,"esp")); - &mov ("eax",&DWP(0,"esp")); - &cmp ("esp","ebp"); - &ja (&label("page_walk")); -&set_label("page_walk_done"); - - ################################# load argument block... - &mov ("eax",&DWP(0*4,"esi"));# BN_ULONG *rp - &mov ("ebx",&DWP(1*4,"esi"));# const BN_ULONG *ap - &mov ("ecx",&DWP(2*4,"esi"));# const BN_ULONG *bp - &mov ("ebp",&DWP(3*4,"esi"));# const BN_ULONG *np - &mov ("esi",&DWP(4*4,"esi"));# const BN_ULONG *n0 - #&mov ("edi",&DWP(5*4,"esi"));# int num - - &mov ("esi",&DWP(0,"esi")); # pull n0[0] - &mov ($_rp,"eax"); # ... save a copy of argument block - &mov ($_ap,"ebx"); - &mov ($_bp,"ecx"); - &mov ($_np,"ebp"); - &mov ($_n0,"esi"); - &lea ($num,&DWP(-3,"edi")); # num=num-1 to assist modulo-scheduling - #&mov ($_num,$num); # redundant as $num is not reused - &mov ($_sp,"edx"); # saved stack pointer! - -if($sse2) { -$acc0="mm0"; # mmx register bank layout -$acc1="mm1"; -$car0="mm2"; -$car1="mm3"; -$mul0="mm4"; -$mul1="mm5"; -$temp="mm6"; -$mask="mm7"; - - &picmeup("eax","GFp_ia32cap_P"); - &bt (&DWP(0,"eax"),26); - # The non-SSE2 code was removed. - - &mov ("eax",-1); - &movd ($mask,"eax"); # mask 32 lower bits - - &mov ($ap,$_ap); # load input pointers - &mov ($bp,$_bp); - &mov ($np,$_np); - - &xor ($i,$i); # i=0 - &xor ($j,$j); # j=0 - - &movd ($mul0,&DWP(0,$bp)); # bp[0] - &movd ($mul1,&DWP(0,$ap)); # ap[0] - &movd ($car1,&DWP(0,$np)); # np[0] - - &pmuludq($mul1,$mul0); # ap[0]*bp[0] - &movq ($car0,$mul1); - &movq ($acc0,$mul1); # I wish movd worked for - &pand ($acc0,$mask); # inter-register transfers - - &pmuludq($mul1,$_n0q); # *=n0 - - &pmuludq($car1,$mul1); # "t[0]"*np[0]*n0 - &paddq ($car1,$acc0); - - &movd ($acc1,&DWP(4,$np)); # np[1] - &movd ($acc0,&DWP(4,$ap)); # ap[1] - - &psrlq ($car0,32); - &psrlq ($car1,32); - - &inc ($j); # j++ -&set_label("1st",16); - &pmuludq($acc0,$mul0); # ap[j]*bp[0] - &pmuludq($acc1,$mul1); # np[j]*m1 - &paddq ($car0,$acc0); # +=c0 - &paddq ($car1,$acc1); # +=c1 - - &movq ($acc0,$car0); - &pand ($acc0,$mask); - &movd ($acc1,&DWP(4,$np,$j,4)); # np[j+1] - &paddq ($car1,$acc0); # +=ap[j]*bp[0]; - &movd ($acc0,&DWP(4,$ap,$j,4)); # ap[j+1] - &psrlq ($car0,32); - &movd (&DWP($frame-4,"esp",$j,4),$car1); # tp[j-1]= - &psrlq ($car1,32); - - &lea ($j,&DWP(1,$j)); - &cmp ($j,$num); - &jl (&label("1st")); - - &pmuludq($acc0,$mul0); # ap[num-1]*bp[0] - &pmuludq($acc1,$mul1); # np[num-1]*m1 - &paddq ($car0,$acc0); # +=c0 - &paddq ($car1,$acc1); # +=c1 - - &movq ($acc0,$car0); - &pand ($acc0,$mask); - &paddq ($car1,$acc0); # +=ap[num-1]*bp[0]; - &movd (&DWP($frame-4,"esp",$j,4),$car1); # tp[num-2]= - - &psrlq ($car0,32); - &psrlq ($car1,32); - - &paddq ($car1,$car0); - &movq (&QWP($frame,"esp",$num,4),$car1); # tp[num].tp[num-1] - - &inc ($i); # i++ -&set_label("outer"); - &xor ($j,$j); # j=0 - - &movd ($mul0,&DWP(0,$bp,$i,4)); # bp[i] - &movd ($mul1,&DWP(0,$ap)); # ap[0] - &movd ($temp,&DWP($frame,"esp")); # tp[0] - &movd ($car1,&DWP(0,$np)); # np[0] - &pmuludq($mul1,$mul0); # ap[0]*bp[i] - - &paddq ($mul1,$temp); # +=tp[0] - &movq ($acc0,$mul1); - &movq ($car0,$mul1); - &pand ($acc0,$mask); - - &pmuludq($mul1,$_n0q); # *=n0 - - &pmuludq($car1,$mul1); - &paddq ($car1,$acc0); - - &movd ($temp,&DWP($frame+4,"esp")); # tp[1] - &movd ($acc1,&DWP(4,$np)); # np[1] - &movd ($acc0,&DWP(4,$ap)); # ap[1] - - &psrlq ($car0,32); - &psrlq ($car1,32); - &paddq ($car0,$temp); # +=tp[1] - - &inc ($j); # j++ - &dec ($num); -&set_label("inner"); - &pmuludq($acc0,$mul0); # ap[j]*bp[i] - &pmuludq($acc1,$mul1); # np[j]*m1 - &paddq ($car0,$acc0); # +=c0 - &paddq ($car1,$acc1); # +=c1 - - &movq ($acc0,$car0); - &movd ($temp,&DWP($frame+4,"esp",$j,4));# tp[j+1] - &pand ($acc0,$mask); - &movd ($acc1,&DWP(4,$np,$j,4)); # np[j+1] - &paddq ($car1,$acc0); # +=ap[j]*bp[i]+tp[j] - &movd ($acc0,&DWP(4,$ap,$j,4)); # ap[j+1] - &psrlq ($car0,32); - &movd (&DWP($frame-4,"esp",$j,4),$car1);# tp[j-1]= - &psrlq ($car1,32); - &paddq ($car0,$temp); # +=tp[j+1] - - &dec ($num); - &lea ($j,&DWP(1,$j)); # j++ - &jnz (&label("inner")); - - &mov ($num,$j); - &pmuludq($acc0,$mul0); # ap[num-1]*bp[i] - &pmuludq($acc1,$mul1); # np[num-1]*m1 - &paddq ($car0,$acc0); # +=c0 - &paddq ($car1,$acc1); # +=c1 - - &movq ($acc0,$car0); - &pand ($acc0,$mask); - &paddq ($car1,$acc0); # +=ap[num-1]*bp[i]+tp[num-1] - &movd (&DWP($frame-4,"esp",$j,4),$car1); # tp[num-2]= - &psrlq ($car0,32); - &psrlq ($car1,32); - - &movd ($temp,&DWP($frame+4,"esp",$num,4)); # += tp[num] - &paddq ($car1,$car0); - &paddq ($car1,$temp); - &movq (&QWP($frame,"esp",$num,4),$car1); # tp[num].tp[num-1] - - &lea ($i,&DWP(1,$i)); # i++ - &cmp ($i,$num); - &jle (&label("outer")); - - &emms (); # done with mmx bank - -} # The non-SSE2 code was removed. - -&set_label("common_tail",16); - &mov ($np,$_np); # load modulus pointer - &mov ($rp,$_rp); # load result pointer - &lea ($tp,&DWP($frame,"esp")); # [$ap and $bp are zapped] - - &mov ("eax",&DWP(0,$tp)); # tp[0] - &mov ($j,$num); # j=num-1 - &xor ($i,$i); # i=0 and clear CF! - -&set_label("sub",16); - &sbb ("eax",&DWP(0,$np,$i,4)); - &mov (&DWP(0,$rp,$i,4),"eax"); # rp[i]=tp[i]-np[i] - &dec ($j); # doesn't affect CF! - &mov ("eax",&DWP(4,$tp,$i,4)); # tp[i+1] - &lea ($i,&DWP(1,$i)); # i++ - &jge (&label("sub")); - - &sbb ("eax",0); # handle upmost overflow bit - &mov ("edx",-1); - &xor ("edx","eax"); - &jmp (&label("copy")); - -&set_label("copy",16); # conditional copy - &mov ($tp,&DWP($frame,"esp",$num,4)); - &mov ($np,&DWP(0,$rp,$num,4)); - &mov (&DWP($frame,"esp",$num,4),$j); # zap temporary vector - &and ($tp,"eax"); - &and ($np,"edx"); - &or ($np,$tp); - &mov (&DWP(0,$rp,$num,4),$np); - &dec ($num); - &jge (&label("copy")); - - &mov ("esp",$_sp); # pull saved stack pointer - &mov ("eax",1); -&function_end("GFp_bn_mul_mont"); - -&asciz("Montgomery Multiplication for x86, CRYPTOGAMS by "); - -&asm_finish(); - -close STDOUT or die "error closing STDOUT"; diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/bn/internal.h temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/bn/internal.h --- temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/bn/internal.h 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/bn/internal.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,197 +0,0 @@ -/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) - * All rights reserved. - * - * This package is an SSL implementation written - * by Eric Young (eay@cryptsoft.com). - * The implementation was written so as to conform with Netscapes SSL. - * - * This library is free for commercial and non-commercial use as long as - * the following conditions are aheared to. The following conditions - * apply to all code found in this distribution, be it the RC4, RSA, - * lhash, DES, etc., code; not just the SSL code. The SSL documentation - * included with this distribution is covered by the same copyright terms - * except that the holder is Tim Hudson (tjh@cryptsoft.com). - * - * Copyright remains Eric Young's, and as such any Copyright notices in - * the code are not to be removed. - * If this package is used in a product, Eric Young should be given attribution - * as the author of the parts of the library used. - * This can be in the form of a textual message at program startup or - * in documentation (online or textual) provided with the package. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * "This product includes cryptographic software written by - * Eric Young (eay@cryptsoft.com)" - * The word 'cryptographic' can be left out if the rouines from the library - * being used are not cryptographic related :-). - * 4. If you include any Windows specific code (or a derivative thereof) from - * the apps directory (application code) you must include an acknowledgement: - * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" - * - * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * The licence and distribution terms for any publically available version or - * derivative of this code cannot be changed. i.e. this code cannot simply be - * copied and put under another distribution licence - * [including the GNU Public Licence.] - */ -/* ==================================================================== - * Copyright (c) 1998-2006 The OpenSSL Project. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. All advertising materials mentioning features or use of this - * software must display the following acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" - * - * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to - * endorse or promote products derived from this software without - * prior written permission. For written permission, please contact - * openssl-core@openssl.org. - * - * 5. Products derived from this software may not be called "OpenSSL" - * nor may "OpenSSL" appear in their names without prior written - * permission of the OpenSSL Project. - * - * 6. Redistributions of any form whatsoever must retain the following - * acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit (http://www.openssl.org/)" - * - * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY - * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * ==================================================================== - * - * This product includes cryptographic software written by Eric Young - * (eay@cryptsoft.com). This product includes software written by Tim - * Hudson (tjh@cryptsoft.com). - * - */ -/* ==================================================================== - * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. - * - * Portions of the attached software ("Contribution") are developed by - * SUN MICROSYSTEMS, INC., and are contributed to the OpenSSL project. - * - * The Contribution is licensed pursuant to the Eric Young open source - * license provided above. - * - * The binary polynomial arithmetic software is originally written by - * Sheueling Chang Shantz and Douglas Stebila of Sun Microsystems - * Laboratories. */ - -#ifndef OPENSSL_HEADER_BN_INTERNAL_H -#define OPENSSL_HEADER_BN_INTERNAL_H - -#include - -#if defined(OPENSSL_X86_64) && defined(_MSC_VER) && !defined(__clang__) -#pragma warning(push, 3) -#include -#pragma warning(pop) -#pragma intrinsic(_umul128) -#endif - -#include "../../internal.h" - -typedef crypto_word BN_ULONG; - -#if defined(OPENSSL_64_BIT) - -#if defined(BORINGSSL_HAS_UINT128) -// MSVC doesn't support two-word integers on 64-bit. -#define BN_ULLONG uint128_t -#endif - -#define BN_BITS2 64 -#define BN_MONT_CTX_N0_LIMBS 1 -#define BN_MONT_CTX_N0(hi, lo) TOBN(hi, lo), 0 -#define TOBN(hi, lo) ((BN_ULONG)(hi) << 32 | (lo)) - -#elif defined(OPENSSL_32_BIT) - -#define BN_ULLONG uint64_t -#define BN_BITS2 32 -// On some 32-bit platforms, Montgomery multiplication is done using 64-bit -// arithmetic with SIMD instructions. On such platforms, |BN_MONT_CTX::n0| -// needs to be two words long. Only certain 32-bit platforms actually make use -// of n0[1] and shorter R value would suffice for the others. However, -// currently only the assembly files know which is which. -#define BN_MONT_CTX_N0_LIMBS 2 -#define BN_MONT_CTX_N0(hi, lo) TOBN(hi, lo) -#define TOBN(hi, lo) (lo), (hi) - -#else -#error "Must define either OPENSSL_32_BIT or OPENSSL_64_BIT" -#endif - - -// |num| must be at least 4, at least on x86. -// -// In other forks, |bn_mul_mont| returns an |int| indicating whether it -// actually did the multiplication. All our implementations always do the -// multiplication, and forcing callers to deal with the possibility of it -// failing just leads to further problems. -// -// In other forks, |bn_mod_mul|'s `num` argument has type |int| but it is -// implicitly treated as a |size_t|; when |int| is smaller than |size_t| -// then the |movq 48(%rsp),%r9| done by x86_64-xlate.pl implicitly does the -// conversion. -OPENSSL_STATIC_ASSERT(sizeof(int) == sizeof(size_t) || - (sizeof(int) == 4 && sizeof(size_t) == 8), - "int and size_t ABI mismatch"); -void GFp_bn_mul_mont(BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp, - const BN_ULONG *np, const BN_ULONG *n0, size_t num); - -static inline void bn_umult_lohi(BN_ULONG *low_out, BN_ULONG *high_out, - BN_ULONG a, BN_ULONG b) { -#if defined(OPENSSL_X86_64) && defined(_MSC_VER) && !defined(__clang__) - *low_out = _umul128(a, b, high_out); -#else - BN_ULLONG result = (BN_ULLONG)a * b; - *low_out = (BN_ULONG)result; - *high_out = (BN_ULONG)(result >> BN_BITS2); -#endif -} - -#endif // OPENSSL_HEADER_BN_INTERNAL_H diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/bn/montgomery.c temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/bn/montgomery.c --- temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/bn/montgomery.c 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/bn/montgomery.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,158 +0,0 @@ -/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) - * All rights reserved. - * - * This package is an SSL implementation written - * by Eric Young (eay@cryptsoft.com). - * The implementation was written so as to conform with Netscapes SSL. - * - * This library is free for commercial and non-commercial use as long as - * the following conditions are aheared to. The following conditions - * apply to all code found in this distribution, be it the RC4, RSA, - * lhash, DES, etc., code; not just the SSL code. The SSL documentation - * included with this distribution is covered by the same copyright terms - * except that the holder is Tim Hudson (tjh@cryptsoft.com). - * - * Copyright remains Eric Young's, and as such any Copyright notices in - * the code are not to be removed. - * If this package is used in a product, Eric Young should be given attribution - * as the author of the parts of the library used. - * This can be in the form of a textual message at program startup or - * in documentation (online or textual) provided with the package. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * "This product includes cryptographic software written by - * Eric Young (eay@cryptsoft.com)" - * The word 'cryptographic' can be left out if the rouines from the library - * being used are not cryptographic related :-). - * 4. If you include any Windows specific code (or a derivative thereof) from - * the apps directory (application code) you must include an acknowledgement: - * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" - * - * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * The licence and distribution terms for any publically available version or - * derivative of this code cannot be changed. i.e. this code cannot simply be - * copied and put under another distribution licence - * [including the GNU Public Licence.] - */ -/* ==================================================================== - * Copyright (c) 1998-2006 The OpenSSL Project. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. All advertising materials mentioning features or use of this - * software must display the following acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" - * - * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to - * endorse or promote products derived from this software without - * prior written permission. For written permission, please contact - * openssl-core@openssl.org. - * - * 5. Products derived from this software may not be called "OpenSSL" - * nor may "OpenSSL" appear in their names without prior written - * permission of the OpenSSL Project. - * - * 6. Redistributions of any form whatsoever must retain the following - * acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit (http://www.openssl.org/)" - * - * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY - * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * ==================================================================== - * - * This product includes cryptographic software written by Eric Young - * (eay@cryptsoft.com). This product includes software written by Tim - * Hudson (tjh@cryptsoft.com). */ - -#include "internal.h" -#include "../../internal.h" - -#include "../../limbs/limbs.h" -#include "../../limbs/limbs.inl" - -OPENSSL_STATIC_ASSERT(BN_MONT_CTX_N0_LIMBS == 1 || BN_MONT_CTX_N0_LIMBS == 2, - "BN_MONT_CTX_N0_LIMBS value is invalid"); -OPENSSL_STATIC_ASSERT( - sizeof(BN_ULONG) * BN_MONT_CTX_N0_LIMBS == sizeof(uint64_t), - "uint64_t is insufficient precision for n0"); - -int GFp_bn_from_montgomery_in_place(BN_ULONG r[], size_t num_r, BN_ULONG a[], - size_t num_a, const BN_ULONG n[], - size_t num_n, - const BN_ULONG n0_[BN_MONT_CTX_N0_LIMBS]) { - if (num_n == 0 || num_r != num_n || num_a != 2 * num_n) { - return 0; - } - - // Add multiples of |n| to |r| until R = 2^(nl * BN_BITS2) divides it. On - // input, we had |r| < |n| * R, so now |r| < 2 * |n| * R. Note that |r| - // includes |carry| which is stored separately. - BN_ULONG n0 = n0_[0]; - BN_ULONG carry = 0; - for (size_t i = 0; i < num_n; i++) { - BN_ULONG v = GFp_limbs_mul_add_limb(a + i, n, a[i] * n0, num_n); - v += carry + a[i + num_n]; - carry |= (v != a[i + num_n]); - carry &= (v <= a[i + num_n]); - a[i + num_n] = v; - } - - // Shift |num_n| words to divide by R. We have |a| < 2 * |n|. Note that |a| - // includes |carry| which is stored separately. - a += num_n; - - // |a| thus requires at most one additional subtraction |n| to be reduced. - // Subtract |n| and select the answer in constant time. - BN_ULONG v = limbs_sub(r, a, n, num_n) - carry; - // |v| is one if |a| - |n| underflowed or zero if it did not. Note |v| cannot - // be -1. That would imply the subtraction did not fit in |num_n| words, and - // we know at most one subtraction is needed. - v = 0u - v; - for (size_t i = 0; i < num_n; i++) { - r[i] = constant_time_select_w(v, a[i], r[i]); - a[i] = 0; - } - return 1; -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/bn/montgomery_inv.c temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/bn/montgomery_inv.c --- temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/bn/montgomery_inv.c 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/bn/montgomery_inv.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,105 +0,0 @@ -/* Copyright 2016 Brian Smith. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY - * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION - * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ - -#include "internal.h" -#include "../../internal.h" - - -OPENSSL_STATIC_ASSERT(BN_MONT_CTX_N0_LIMBS == 1 || BN_MONT_CTX_N0_LIMBS == 2, - "BN_MONT_CTX_N0_LIMBS value is invalid"); -OPENSSL_STATIC_ASSERT(sizeof(BN_ULONG) * BN_MONT_CTX_N0_LIMBS == sizeof(uint64_t), - "uint64_t is insufficient precision for n0"); - -// LG_LITTLE_R is log_2(r). -#define LG_LITTLE_R (BN_MONT_CTX_N0_LIMBS * BN_BITS2) - -// bn_neg_inv_r_mod_n_u64 calculates the -1/n mod r; i.e. it calculates |v| -// such that u*r - v*n == 1. |r| is the constant defined in |bn_mont_n0|. |n| -// must be odd. -// -// This is derived from |xbinGCD| in Henry S. Warren, Jr.'s "Montgomery -// Multiplication" (http://www.hackersdelight.org/MontgomeryMultiplication.pdf). -// It is very similar to the MODULAR-INVERSE function in Stephen R. Dussé's and -// Burton S. Kaliski Jr.'s "A Cryptographic Library for the Motorola DSP56000" -// (http://link.springer.com/chapter/10.1007%2F3-540-46877-3_21). -// -// This is inspired by Joppe W. Bos's "Constant Time Modular Inversion" -// (http://www.joppebos.com/files/CTInversion.pdf) so that the inversion is -// constant-time with respect to |n|. We assume uint64_t additions, -// subtractions, shifts, and bitwise operations are all constant time, which -// may be a large leap of faith on 32-bit targets. We avoid division and -// multiplication, which tend to be the most problematic in terms of timing -// leaks. -// -// Most GCD implementations return values such that |u*r + v*n == 1|, so the -// caller would have to negate the resultant |v| for the purpose of Montgomery -// multiplication. This implementation does the negation implicitly by doing -// the computations as a difference instead of a sum. -uint64_t GFp_bn_neg_inv_mod_r_u64(uint64_t n) { - dev_assert_secret(n % 2 == 1); - - // alpha == 2**(lg r - 1) == r / 2. - static const uint64_t alpha = UINT64_C(1) << (LG_LITTLE_R - 1); - - const uint64_t beta = n; - - uint64_t u = 1; - uint64_t v = 0; - - // The invariant maintained from here on is: - // 2**(lg r - i) == u*2*alpha - v*beta. - for (size_t i = 0; i < LG_LITTLE_R; ++i) { -#if BN_BITS2 == 64 && defined(BN_ULLONG) - dev_assert_secret((BN_ULLONG)(1) << (LG_LITTLE_R - i) == - ((BN_ULLONG)u * 2 * alpha) - ((BN_ULLONG)v * beta)); -#endif - - // Delete a common factor of 2 in u and v if |u| is even. Otherwise, set - // |u = (u + beta) / 2| and |v = (v / 2) + alpha|. - - uint64_t u_is_odd = UINT64_C(0) - (u & 1); // Either 0xff..ff or 0. - - // The addition can overflow, so use Dietz's method for it. - // - // Dietz calculates (x+y)/2 by (x xor y)>>1 + x&y. This is valid for all - // (unsigned) x and y, even when x+y overflows. Evidence for 32-bit values - // (embedded in 64 bits to so that overflow can be ignored): - // - // (declare-fun x () (_ BitVec 64)) - // (declare-fun y () (_ BitVec 64)) - // (assert (let ( - // (one (_ bv1 64)) - // (thirtyTwo (_ bv32 64))) - // (and - // (bvult x (bvshl one thirtyTwo)) - // (bvult y (bvshl one thirtyTwo)) - // (not (= - // (bvadd (bvlshr (bvxor x y) one) (bvand x y)) - // (bvlshr (bvadd x y) one))) - // ))) - // (check-sat) - uint64_t beta_if_u_is_odd = beta & u_is_odd; // Either |beta| or 0. - u = ((u ^ beta_if_u_is_odd) >> 1) + (u & beta_if_u_is_odd); - - uint64_t alpha_if_u_is_odd = alpha & u_is_odd; /* Either |alpha| or 0. */ - v = (v >> 1) + alpha_if_u_is_odd; - } - - // The invariant now shows that u*r - v*n == 1 since r == 2 * alpha. -#if BN_BITS2 == 64 && defined(BN_ULLONG) - dev_assert_secret(1 == ((BN_ULLONG)u * 2 * alpha) - ((BN_ULLONG)v * beta)); -#endif - - return v; -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/ec/asm/ecp_nistz256-armv4.pl temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/ec/asm/ecp_nistz256-armv4.pl --- temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/ec/asm/ecp_nistz256-armv4.pl 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/ec/asm/ecp_nistz256-armv4.pl 1970-01-01 00:00:00.000000000 +0000 @@ -1,901 +0,0 @@ -#! /usr/bin/env perl -# Copyright 2015-2018 The OpenSSL Project Authors. All Rights Reserved. -# -# Licensed under the OpenSSL license (the "License"). You may not use -# this file except in compliance with the License. You can obtain a copy -# in the file LICENSE in the source distribution or at -# https://www.openssl.org/source/license.html - - -# ==================================================================== -# Written by Andy Polyakov for the OpenSSL -# project. The module is, however, dual licensed under OpenSSL and -# CRYPTOGAMS licenses depending on where you obtain it. For further -# details see http://www.openssl.org/~appro/cryptogams/. -# ==================================================================== -# -# ECP_NISTZ256 module for ARMv4. -# -# October 2014. -# -# Original ECP_NISTZ256 submission targeting x86_64 is detailed in -# http://eprint.iacr.org/2013/816. In the process of adaptation -# original .c module was made 32-bit savvy in order to make this -# implementation possible. -# -# with/without -DECP_NISTZ256_ASM -# Cortex-A8 +53-170% -# Cortex-A9 +76-205% -# Cortex-A15 +100-316% -# Snapdragon S4 +66-187% -# -# Ranges denote minimum and maximum improvement coefficients depending -# on benchmark. Lower coefficients are for ECDSA sign, server-side -# operation. Keep in mind that +200% means 3x improvement. - -$flavour = shift; -if ($flavour=~/\w[\w\-]*\.\w+$/) { $output=$flavour; undef $flavour; } -else { while (($output=shift) && ($output!~/\w[\w\-]*\.\w+$/)) {} } - -if ($flavour && $flavour ne "void") { - $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; - ( $xlate="${dir}arm-xlate.pl" and -f $xlate ) or - ( $xlate="${dir}../../../perlasm/arm-xlate.pl" and -f $xlate) or - die "can't locate arm-xlate.pl"; - - open STDOUT,"| \"$^X\" $xlate $flavour $output"; -} else { - open STDOUT,">$output"; -} - -$code.=<<___; -#include - -.text -#if defined(__thumb2__) -.syntax unified -.thumb -#else -.code 32 -#endif - -.asciz "ECP_NISTZ256 for ARMv4, CRYPTOGAMS by " -.align 6 -___ - -######################################################################## -# common register layout, note that $t2 is link register, so that if -# internal subroutine uses $t2, then it has to offload lr... - -($r_ptr,$a_ptr,$b_ptr,$ff,$a0,$a1,$a2,$a3,$a4,$a5,$a6,$a7,$t1,$t2)= - map("r$_",(0..12,14)); -($t0,$t3)=($ff,$a_ptr); - -$code.=<<___; -.type __ecp_nistz256_mul_by_2,%function -.align 4 -__ecp_nistz256_mul_by_2: - ldr $a0,[$a_ptr,#0] - ldr $a1,[$a_ptr,#4] - ldr $a2,[$a_ptr,#8] - adds $a0,$a0,$a0 @ a[0:7]+=a[0:7], i.e. add with itself - ldr $a3,[$a_ptr,#12] - adcs $a1,$a1,$a1 - ldr $a4,[$a_ptr,#16] - adcs $a2,$a2,$a2 - ldr $a5,[$a_ptr,#20] - adcs $a3,$a3,$a3 - ldr $a6,[$a_ptr,#24] - adcs $a4,$a4,$a4 - ldr $a7,[$a_ptr,#28] - adcs $a5,$a5,$a5 - adcs $a6,$a6,$a6 - mov $ff,#0 - adcs $a7,$a7,$a7 - adc $ff,$ff,#0 - - b .Lreduce_by_sub -.size __ecp_nistz256_mul_by_2,.-__ecp_nistz256_mul_by_2 - -@ void GFp_nistz256_add(BN_ULONG r0[8],const BN_ULONG r1[8], -@ const BN_ULONG r2[8]); -.globl GFp_nistz256_add -.type GFp_nistz256_add,%function -.align 4 -GFp_nistz256_add: - stmdb sp!,{r4-r12,lr} - bl __ecp_nistz256_add -#if __ARM_ARCH__>=5 || !defined(__thumb__) - ldmia sp!,{r4-r12,pc} -#else - ldmia sp!,{r4-r12,lr} - bx lr @ interoperable with Thumb ISA:-) -#endif -.size GFp_nistz256_add,.-GFp_nistz256_add - -.type __ecp_nistz256_add,%function -.align 4 -__ecp_nistz256_add: - str lr,[sp,#-4]! @ push lr - - ldr $a0,[$a_ptr,#0] - ldr $a1,[$a_ptr,#4] - ldr $a2,[$a_ptr,#8] - ldr $a3,[$a_ptr,#12] - ldr $a4,[$a_ptr,#16] - ldr $t0,[$b_ptr,#0] - ldr $a5,[$a_ptr,#20] - ldr $t1,[$b_ptr,#4] - ldr $a6,[$a_ptr,#24] - ldr $t2,[$b_ptr,#8] - ldr $a7,[$a_ptr,#28] - ldr $t3,[$b_ptr,#12] - adds $a0,$a0,$t0 - ldr $t0,[$b_ptr,#16] - adcs $a1,$a1,$t1 - ldr $t1,[$b_ptr,#20] - adcs $a2,$a2,$t2 - ldr $t2,[$b_ptr,#24] - adcs $a3,$a3,$t3 - ldr $t3,[$b_ptr,#28] - adcs $a4,$a4,$t0 - adcs $a5,$a5,$t1 - adcs $a6,$a6,$t2 - mov $ff,#0 - adcs $a7,$a7,$t3 - adc $ff,$ff,#0 - ldr lr,[sp],#4 @ pop lr - -.Lreduce_by_sub: - - @ if a+b >= modulus, subtract modulus. - @ - @ But since comparison implies subtraction, we subtract - @ modulus and then add it back if subtraction borrowed. - - subs $a0,$a0,#-1 - sbcs $a1,$a1,#-1 - sbcs $a2,$a2,#-1 - sbcs $a3,$a3,#0 - sbcs $a4,$a4,#0 - sbcs $a5,$a5,#0 - sbcs $a6,$a6,#1 - sbcs $a7,$a7,#-1 - sbc $ff,$ff,#0 - - @ Note that because mod has special form, i.e. consists of - @ 0xffffffff, 1 and 0s, we can conditionally synthesize it by - @ using value of borrow as a whole or extracting single bit. - @ Follow $ff register... - - adds $a0,$a0,$ff @ add synthesized modulus - adcs $a1,$a1,$ff - str $a0,[$r_ptr,#0] - adcs $a2,$a2,$ff - str $a1,[$r_ptr,#4] - adcs $a3,$a3,#0 - str $a2,[$r_ptr,#8] - adcs $a4,$a4,#0 - str $a3,[$r_ptr,#12] - adcs $a5,$a5,#0 - str $a4,[$r_ptr,#16] - adcs $a6,$a6,$ff,lsr#31 - str $a5,[$r_ptr,#20] - adcs $a7,$a7,$ff - str $a6,[$r_ptr,#24] - str $a7,[$r_ptr,#28] - - mov pc,lr -.size __ecp_nistz256_add,.-__ecp_nistz256_add - -.type __ecp_nistz256_mul_by_3,%function -.align 4 -__ecp_nistz256_mul_by_3: - str lr,[sp,#-4]! @ push lr - - @ As multiplication by 3 is performed as 2*n+n, below are inline - @ copies of __ecp_nistz256_mul_by_2 and __ecp_nistz256_add, see - @ corresponding subroutines for details. - - ldr $a0,[$a_ptr,#0] - ldr $a1,[$a_ptr,#4] - ldr $a2,[$a_ptr,#8] - adds $a0,$a0,$a0 @ a[0:7]+=a[0:7] - ldr $a3,[$a_ptr,#12] - adcs $a1,$a1,$a1 - ldr $a4,[$a_ptr,#16] - adcs $a2,$a2,$a2 - ldr $a5,[$a_ptr,#20] - adcs $a3,$a3,$a3 - ldr $a6,[$a_ptr,#24] - adcs $a4,$a4,$a4 - ldr $a7,[$a_ptr,#28] - adcs $a5,$a5,$a5 - adcs $a6,$a6,$a6 - mov $ff,#0 - adcs $a7,$a7,$a7 - adc $ff,$ff,#0 - - subs $a0,$a0,#-1 @ .Lreduce_by_sub but without stores - sbcs $a1,$a1,#-1 - sbcs $a2,$a2,#-1 - sbcs $a3,$a3,#0 - sbcs $a4,$a4,#0 - sbcs $a5,$a5,#0 - sbcs $a6,$a6,#1 - sbcs $a7,$a7,#-1 - sbc $ff,$ff,#0 - - adds $a0,$a0,$ff @ add synthesized modulus - adcs $a1,$a1,$ff - adcs $a2,$a2,$ff - adcs $a3,$a3,#0 - adcs $a4,$a4,#0 - ldr $b_ptr,[$a_ptr,#0] - adcs $a5,$a5,#0 - ldr $t1,[$a_ptr,#4] - adcs $a6,$a6,$ff,lsr#31 - ldr $t2,[$a_ptr,#8] - adc $a7,$a7,$ff - - ldr $t0,[$a_ptr,#12] - adds $a0,$a0,$b_ptr @ 2*a[0:7]+=a[0:7] - ldr $b_ptr,[$a_ptr,#16] - adcs $a1,$a1,$t1 - ldr $t1,[$a_ptr,#20] - adcs $a2,$a2,$t2 - ldr $t2,[$a_ptr,#24] - adcs $a3,$a3,$t0 - ldr $t3,[$a_ptr,#28] - adcs $a4,$a4,$b_ptr - adcs $a5,$a5,$t1 - adcs $a6,$a6,$t2 - mov $ff,#0 - adcs $a7,$a7,$t3 - adc $ff,$ff,#0 - ldr lr,[sp],#4 @ pop lr - - b .Lreduce_by_sub -.size __ecp_nistz256_mul_by_3,.-__ecp_nistz256_mul_by_3 - -.type __ecp_nistz256_div_by_2,%function -.align 4 -__ecp_nistz256_div_by_2: - @ ret = (a is odd ? a+mod : a) >> 1 - - ldr $a0,[$a_ptr,#0] - ldr $a1,[$a_ptr,#4] - ldr $a2,[$a_ptr,#8] - mov $ff,$a0,lsl#31 @ place least significant bit to most - @ significant position, now arithmetic - @ right shift by 31 will produce -1 or - @ 0, while logical right shift 1 or 0, - @ this is how modulus is conditionally - @ synthesized in this case... - ldr $a3,[$a_ptr,#12] - adds $a0,$a0,$ff,asr#31 - ldr $a4,[$a_ptr,#16] - adcs $a1,$a1,$ff,asr#31 - ldr $a5,[$a_ptr,#20] - adcs $a2,$a2,$ff,asr#31 - ldr $a6,[$a_ptr,#24] - adcs $a3,$a3,#0 - ldr $a7,[$a_ptr,#28] - adcs $a4,$a4,#0 - mov $a0,$a0,lsr#1 @ a[0:7]>>=1, we can start early - @ because it doesn't affect flags - adcs $a5,$a5,#0 - orr $a0,$a0,$a1,lsl#31 - adcs $a6,$a6,$ff,lsr#31 - mov $b_ptr,#0 - adcs $a7,$a7,$ff,asr#31 - mov $a1,$a1,lsr#1 - adc $b_ptr,$b_ptr,#0 @ top-most carry bit from addition - - orr $a1,$a1,$a2,lsl#31 - mov $a2,$a2,lsr#1 - str $a0,[$r_ptr,#0] - orr $a2,$a2,$a3,lsl#31 - mov $a3,$a3,lsr#1 - str $a1,[$r_ptr,#4] - orr $a3,$a3,$a4,lsl#31 - mov $a4,$a4,lsr#1 - str $a2,[$r_ptr,#8] - orr $a4,$a4,$a5,lsl#31 - mov $a5,$a5,lsr#1 - str $a3,[$r_ptr,#12] - orr $a5,$a5,$a6,lsl#31 - mov $a6,$a6,lsr#1 - str $a4,[$r_ptr,#16] - orr $a6,$a6,$a7,lsl#31 - mov $a7,$a7,lsr#1 - str $a5,[$r_ptr,#20] - orr $a7,$a7,$b_ptr,lsl#31 @ don't forget the top-most carry bit - str $a6,[$r_ptr,#24] - str $a7,[$r_ptr,#28] - - mov pc,lr -.size __ecp_nistz256_div_by_2,.-__ecp_nistz256_div_by_2 - -.type __ecp_nistz256_sub,%function -.align 4 -__ecp_nistz256_sub: - str lr,[sp,#-4]! @ push lr - - ldr $a0,[$a_ptr,#0] - ldr $a1,[$a_ptr,#4] - ldr $a2,[$a_ptr,#8] - ldr $a3,[$a_ptr,#12] - ldr $a4,[$a_ptr,#16] - ldr $t0,[$b_ptr,#0] - ldr $a5,[$a_ptr,#20] - ldr $t1,[$b_ptr,#4] - ldr $a6,[$a_ptr,#24] - ldr $t2,[$b_ptr,#8] - ldr $a7,[$a_ptr,#28] - ldr $t3,[$b_ptr,#12] - subs $a0,$a0,$t0 - ldr $t0,[$b_ptr,#16] - sbcs $a1,$a1,$t1 - ldr $t1,[$b_ptr,#20] - sbcs $a2,$a2,$t2 - ldr $t2,[$b_ptr,#24] - sbcs $a3,$a3,$t3 - ldr $t3,[$b_ptr,#28] - sbcs $a4,$a4,$t0 - sbcs $a5,$a5,$t1 - sbcs $a6,$a6,$t2 - sbcs $a7,$a7,$t3 - sbc $ff,$ff,$ff @ broadcast borrow bit - ldr lr,[sp],#4 @ pop lr - -.Lreduce_by_add: - - @ if a-b borrows, add modulus. - @ - @ Note that because mod has special form, i.e. consists of - @ 0xffffffff, 1 and 0s, we can conditionally synthesize it by - @ broadcasting borrow bit to a register, $ff, and using it as - @ a whole or extracting single bit. - - adds $a0,$a0,$ff @ add synthesized modulus - adcs $a1,$a1,$ff - str $a0,[$r_ptr,#0] - adcs $a2,$a2,$ff - str $a1,[$r_ptr,#4] - adcs $a3,$a3,#0 - str $a2,[$r_ptr,#8] - adcs $a4,$a4,#0 - str $a3,[$r_ptr,#12] - adcs $a5,$a5,#0 - str $a4,[$r_ptr,#16] - adcs $a6,$a6,$ff,lsr#31 - str $a5,[$r_ptr,#20] - adcs $a7,$a7,$ff - str $a6,[$r_ptr,#24] - str $a7,[$r_ptr,#28] - - mov pc,lr -.size __ecp_nistz256_sub,.-__ecp_nistz256_sub - -@ void GFp_nistz256_neg(BN_ULONG r0[8],const BN_ULONG r1[8]); -.globl GFp_nistz256_neg -.type GFp_nistz256_neg,%function -.align 4 -GFp_nistz256_neg: - stmdb sp!,{r4-r12,lr} - bl __ecp_nistz256_neg -#if __ARM_ARCH__>=5 || !defined(__thumb__) - ldmia sp!,{r4-r12,pc} -#else - ldmia sp!,{r4-r12,lr} - bx lr @ interoperable with Thumb ISA:-) -#endif -.size GFp_nistz256_neg,.-GFp_nistz256_neg - -.type __ecp_nistz256_neg,%function -.align 4 -__ecp_nistz256_neg: - ldr $a0,[$a_ptr,#0] - eor $ff,$ff,$ff - ldr $a1,[$a_ptr,#4] - ldr $a2,[$a_ptr,#8] - subs $a0,$ff,$a0 - ldr $a3,[$a_ptr,#12] - sbcs $a1,$ff,$a1 - ldr $a4,[$a_ptr,#16] - sbcs $a2,$ff,$a2 - ldr $a5,[$a_ptr,#20] - sbcs $a3,$ff,$a3 - ldr $a6,[$a_ptr,#24] - sbcs $a4,$ff,$a4 - ldr $a7,[$a_ptr,#28] - sbcs $a5,$ff,$a5 - sbcs $a6,$ff,$a6 - sbcs $a7,$ff,$a7 - sbc $ff,$ff,$ff - - b .Lreduce_by_add -.size __ecp_nistz256_neg,.-__ecp_nistz256_neg -___ -{ -my @acc=map("r$_",(3..11)); -my ($t0,$t1,$bj,$t2,$t3)=map("r$_",(0,1,2,12,14)); - -$code.=<<___; -@ void GFp_nistz256_mul_mont(BN_ULONG r0[8],const BN_ULONG r1[8], -@ const BN_ULONG r2[8]); -.globl GFp_nistz256_mul_mont -.type GFp_nistz256_mul_mont,%function -.align 4 -GFp_nistz256_mul_mont: - stmdb sp!,{r4-r12,lr} - bl __ecp_nistz256_mul_mont -#if __ARM_ARCH__>=5 || !defined(__thumb__) - ldmia sp!,{r4-r12,pc} -#else - ldmia sp!,{r4-r12,lr} - bx lr @ interoperable with Thumb ISA:-) -#endif -.size GFp_nistz256_mul_mont,.-GFp_nistz256_mul_mont - -.type __ecp_nistz256_mul_mont,%function -.align 4 -__ecp_nistz256_mul_mont: - stmdb sp!,{r0-r2,lr} @ make a copy of arguments too - - ldr $bj,[$b_ptr,#0] @ b[0] - ldmia $a_ptr,{@acc[1]-@acc[8]} - - umull @acc[0],$t3,@acc[1],$bj @ r[0]=a[0]*b[0] - stmdb sp!,{$acc[1]-@acc[8]} @ copy a[0-7] to stack, so - @ that it can be addressed - @ without spending register - @ on address - umull @acc[1],$t0,@acc[2],$bj @ r[1]=a[1]*b[0] - umull @acc[2],$t1,@acc[3],$bj - adds @acc[1],@acc[1],$t3 @ accumulate high part of mult - umull @acc[3],$t2,@acc[4],$bj - adcs @acc[2],@acc[2],$t0 - umull @acc[4],$t3,@acc[5],$bj - adcs @acc[3],@acc[3],$t1 - umull @acc[5],$t0,@acc[6],$bj - adcs @acc[4],@acc[4],$t2 - umull @acc[6],$t1,@acc[7],$bj - adcs @acc[5],@acc[5],$t3 - umull @acc[7],$t2,@acc[8],$bj - adcs @acc[6],@acc[6],$t0 - adcs @acc[7],@acc[7],$t1 - eor $t3,$t3,$t3 @ first overflow bit is zero - adc @acc[8],$t2,#0 -___ -for(my $i=1;$i<8;$i++) { -my $t4=@acc[0]; - - # Reduction iteration is normally performed by accumulating - # result of multiplication of modulus by "magic" digit [and - # omitting least significant word, which is guaranteed to - # be 0], but thanks to special form of modulus and "magic" - # digit being equal to least significant word, it can be - # performed with additions and subtractions alone. Indeed: - # - # ffff.0001.0000.0000.0000.ffff.ffff.ffff - # * abcd - # + xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.abcd - # - # Now observing that ff..ff*x = (2^n-1)*x = 2^n*x-x, we - # rewrite above as: - # - # xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.abcd - # + abcd.0000.abcd.0000.0000.abcd.0000.0000.0000 - # - abcd.0000.0000.0000.0000.0000.0000.abcd - # - # or marking redundant operations: - # - # xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.---- - # + abcd.0000.abcd.0000.0000.abcd.----.----.---- - # - abcd.----.----.----.----.----.----.---- - -$code.=<<___; - @ multiplication-less reduction $i - adds @acc[3],@acc[3],@acc[0] @ r[3]+=r[0] - ldr $bj,[sp,#40] @ restore b_ptr - adcs @acc[4],@acc[4],#0 @ r[4]+=0 - adcs @acc[5],@acc[5],#0 @ r[5]+=0 - adcs @acc[6],@acc[6],@acc[0] @ r[6]+=r[0] - ldr $t1,[sp,#0] @ load a[0] - adcs @acc[7],@acc[7],#0 @ r[7]+=0 - ldr $bj,[$bj,#4*$i] @ load b[i] - adcs @acc[8],@acc[8],@acc[0] @ r[8]+=r[0] - eor $t0,$t0,$t0 - adc $t3,$t3,#0 @ overflow bit - subs @acc[7],@acc[7],@acc[0] @ r[7]-=r[0] - ldr $t2,[sp,#4] @ a[1] - sbcs @acc[8],@acc[8],#0 @ r[8]-=0 - umlal @acc[1],$t0,$t1,$bj @ "r[0]"+=a[0]*b[i] - eor $t1,$t1,$t1 - sbc @acc[0],$t3,#0 @ overflow bit, keep in mind - @ that netto result is - @ addition of a value which - @ makes underflow impossible - - ldr $t3,[sp,#8] @ a[2] - umlal @acc[2],$t1,$t2,$bj @ "r[1]"+=a[1]*b[i] - str @acc[0],[sp,#36] @ temporarily offload overflow - eor $t2,$t2,$t2 - ldr $t4,[sp,#12] @ a[3], $t4 is alias @acc[0] - umlal @acc[3],$t2,$t3,$bj @ "r[2]"+=a[2]*b[i] - eor $t3,$t3,$t3 - adds @acc[2],@acc[2],$t0 @ accumulate high part of mult - ldr $t0,[sp,#16] @ a[4] - umlal @acc[4],$t3,$t4,$bj @ "r[3]"+=a[3]*b[i] - eor $t4,$t4,$t4 - adcs @acc[3],@acc[3],$t1 - ldr $t1,[sp,#20] @ a[5] - umlal @acc[5],$t4,$t0,$bj @ "r[4]"+=a[4]*b[i] - eor $t0,$t0,$t0 - adcs @acc[4],@acc[4],$t2 - ldr $t2,[sp,#24] @ a[6] - umlal @acc[6],$t0,$t1,$bj @ "r[5]"+=a[5]*b[i] - eor $t1,$t1,$t1 - adcs @acc[5],@acc[5],$t3 - ldr $t3,[sp,#28] @ a[7] - umlal @acc[7],$t1,$t2,$bj @ "r[6]"+=a[6]*b[i] - eor $t2,$t2,$t2 - adcs @acc[6],@acc[6],$t4 - ldr @acc[0],[sp,#36] @ restore overflow bit - umlal @acc[8],$t2,$t3,$bj @ "r[7]"+=a[7]*b[i] - eor $t3,$t3,$t3 - adcs @acc[7],@acc[7],$t0 - adcs @acc[8],@acc[8],$t1 - adcs @acc[0],$acc[0],$t2 - adc $t3,$t3,#0 @ new overflow bit -___ - push(@acc,shift(@acc)); # rotate registers, so that - # "r[i]" becomes r[i] -} -$code.=<<___; - @ last multiplication-less reduction - adds @acc[3],@acc[3],@acc[0] - ldr $r_ptr,[sp,#32] @ restore r_ptr - adcs @acc[4],@acc[4],#0 - adcs @acc[5],@acc[5],#0 - adcs @acc[6],@acc[6],@acc[0] - adcs @acc[7],@acc[7],#0 - adcs @acc[8],@acc[8],@acc[0] - adc $t3,$t3,#0 - subs @acc[7],@acc[7],@acc[0] - sbcs @acc[8],@acc[8],#0 - sbc @acc[0],$t3,#0 @ overflow bit - - @ Final step is "if result > mod, subtract mod", but we do it - @ "other way around", namely subtract modulus from result - @ and if it borrowed, add modulus back. - - adds @acc[1],@acc[1],#1 @ subs @acc[1],@acc[1],#-1 - adcs @acc[2],@acc[2],#0 @ sbcs @acc[2],@acc[2],#-1 - adcs @acc[3],@acc[3],#0 @ sbcs @acc[3],@acc[3],#-1 - sbcs @acc[4],@acc[4],#0 - sbcs @acc[5],@acc[5],#0 - sbcs @acc[6],@acc[6],#0 - sbcs @acc[7],@acc[7],#1 - adcs @acc[8],@acc[8],#0 @ sbcs @acc[8],@acc[8],#-1 - ldr lr,[sp,#44] @ restore lr - sbc @acc[0],@acc[0],#0 @ broadcast borrow bit - add sp,sp,#48 - - @ Note that because mod has special form, i.e. consists of - @ 0xffffffff, 1 and 0s, we can conditionally synthesize it by - @ broadcasting borrow bit to a register, @acc[0], and using it as - @ a whole or extracting single bit. - - adds @acc[1],@acc[1],@acc[0] @ add modulus or zero - adcs @acc[2],@acc[2],@acc[0] - str @acc[1],[$r_ptr,#0] - adcs @acc[3],@acc[3],@acc[0] - str @acc[2],[$r_ptr,#4] - adcs @acc[4],@acc[4],#0 - str @acc[3],[$r_ptr,#8] - adcs @acc[5],@acc[5],#0 - str @acc[4],[$r_ptr,#12] - adcs @acc[6],@acc[6],#0 - str @acc[5],[$r_ptr,#16] - adcs @acc[7],@acc[7],@acc[0],lsr#31 - str @acc[6],[$r_ptr,#20] - adc @acc[8],@acc[8],@acc[0] - str @acc[7],[$r_ptr,#24] - str @acc[8],[$r_ptr,#28] - - mov pc,lr -.size __ecp_nistz256_mul_mont,.-__ecp_nistz256_mul_mont -___ -} - -{{{ -######################################################################## -# Below $aN assignment matches order in which 256-bit result appears in -# register bank at return from __ecp_nistz256_mul_mont, so that we can -# skip over reloading it from memory. This means that below functions -# use custom calling sequence accepting 256-bit input in registers, -# output pointer in r0, $r_ptr, and optional pointer in r2, $b_ptr. -# -# See their "normal" counterparts for insights on calculations. - -my ($a0,$a1,$a2,$a3,$a4,$a5,$a6,$a7, - $t0,$t1,$t2,$t3)=map("r$_",(11,3..10,12,14,1)); -my $ff=$b_ptr; - -$code.=<<___; -.type __ecp_nistz256_sub_from,%function -.align 5 -__ecp_nistz256_sub_from: - str lr,[sp,#-4]! @ push lr - - ldr $t0,[$b_ptr,#0] - ldr $t1,[$b_ptr,#4] - ldr $t2,[$b_ptr,#8] - ldr $t3,[$b_ptr,#12] - subs $a0,$a0,$t0 - ldr $t0,[$b_ptr,#16] - sbcs $a1,$a1,$t1 - ldr $t1,[$b_ptr,#20] - sbcs $a2,$a2,$t2 - ldr $t2,[$b_ptr,#24] - sbcs $a3,$a3,$t3 - ldr $t3,[$b_ptr,#28] - sbcs $a4,$a4,$t0 - sbcs $a5,$a5,$t1 - sbcs $a6,$a6,$t2 - sbcs $a7,$a7,$t3 - sbc $ff,$ff,$ff @ broadcast borrow bit - ldr lr,[sp],#4 @ pop lr - - adds $a0,$a0,$ff @ add synthesized modulus - adcs $a1,$a1,$ff - str $a0,[$r_ptr,#0] - adcs $a2,$a2,$ff - str $a1,[$r_ptr,#4] - adcs $a3,$a3,#0 - str $a2,[$r_ptr,#8] - adcs $a4,$a4,#0 - str $a3,[$r_ptr,#12] - adcs $a5,$a5,#0 - str $a4,[$r_ptr,#16] - adcs $a6,$a6,$ff,lsr#31 - str $a5,[$r_ptr,#20] - adcs $a7,$a7,$ff - str $a6,[$r_ptr,#24] - str $a7,[$r_ptr,#28] - - mov pc,lr -.size __ecp_nistz256_sub_from,.-__ecp_nistz256_sub_from - -.type __ecp_nistz256_sub_morf,%function -.align 5 -__ecp_nistz256_sub_morf: - str lr,[sp,#-4]! @ push lr - - ldr $t0,[$b_ptr,#0] - ldr $t1,[$b_ptr,#4] - ldr $t2,[$b_ptr,#8] - ldr $t3,[$b_ptr,#12] - subs $a0,$t0,$a0 - ldr $t0,[$b_ptr,#16] - sbcs $a1,$t1,$a1 - ldr $t1,[$b_ptr,#20] - sbcs $a2,$t2,$a2 - ldr $t2,[$b_ptr,#24] - sbcs $a3,$t3,$a3 - ldr $t3,[$b_ptr,#28] - sbcs $a4,$t0,$a4 - sbcs $a5,$t1,$a5 - sbcs $a6,$t2,$a6 - sbcs $a7,$t3,$a7 - sbc $ff,$ff,$ff @ broadcast borrow bit - ldr lr,[sp],#4 @ pop lr - - adds $a0,$a0,$ff @ add synthesized modulus - adcs $a1,$a1,$ff - str $a0,[$r_ptr,#0] - adcs $a2,$a2,$ff - str $a1,[$r_ptr,#4] - adcs $a3,$a3,#0 - str $a2,[$r_ptr,#8] - adcs $a4,$a4,#0 - str $a3,[$r_ptr,#12] - adcs $a5,$a5,#0 - str $a4,[$r_ptr,#16] - adcs $a6,$a6,$ff,lsr#31 - str $a5,[$r_ptr,#20] - adcs $a7,$a7,$ff - str $a6,[$r_ptr,#24] - str $a7,[$r_ptr,#28] - - mov pc,lr -.size __ecp_nistz256_sub_morf,.-__ecp_nistz256_sub_morf - -.type __ecp_nistz256_add_self,%function -.align 4 -__ecp_nistz256_add_self: - adds $a0,$a0,$a0 @ a[0:7]+=a[0:7] - adcs $a1,$a1,$a1 - adcs $a2,$a2,$a2 - adcs $a3,$a3,$a3 - adcs $a4,$a4,$a4 - adcs $a5,$a5,$a5 - adcs $a6,$a6,$a6 - mov $ff,#0 - adcs $a7,$a7,$a7 - adc $ff,$ff,#0 - - @ if a+b >= modulus, subtract modulus. - @ - @ But since comparison implies subtraction, we subtract - @ modulus and then add it back if subtraction borrowed. - - subs $a0,$a0,#-1 - sbcs $a1,$a1,#-1 - sbcs $a2,$a2,#-1 - sbcs $a3,$a3,#0 - sbcs $a4,$a4,#0 - sbcs $a5,$a5,#0 - sbcs $a6,$a6,#1 - sbcs $a7,$a7,#-1 - sbc $ff,$ff,#0 - - @ Note that because mod has special form, i.e. consists of - @ 0xffffffff, 1 and 0s, we can conditionally synthesize it by - @ using value of borrow as a whole or extracting single bit. - @ Follow $ff register... - - adds $a0,$a0,$ff @ add synthesized modulus - adcs $a1,$a1,$ff - str $a0,[$r_ptr,#0] - adcs $a2,$a2,$ff - str $a1,[$r_ptr,#4] - adcs $a3,$a3,#0 - str $a2,[$r_ptr,#8] - adcs $a4,$a4,#0 - str $a3,[$r_ptr,#12] - adcs $a5,$a5,#0 - str $a4,[$r_ptr,#16] - adcs $a6,$a6,$ff,lsr#31 - str $a5,[$r_ptr,#20] - adcs $a7,$a7,$ff - str $a6,[$r_ptr,#24] - str $a7,[$r_ptr,#28] - - mov pc,lr -.size __ecp_nistz256_add_self,.-__ecp_nistz256_add_self - -___ - -######################################################################## -# following subroutines are "literal" implementation of those found in -# ecp_nistz256.c -# -######################################################################## -# void ecp_nistz256_point_double(P256_POINT *out,const P256_POINT *inp); -# -{ -my ($S,$M,$Zsqr,$in_x,$tmp0)=map(32*$_,(0..4)); -# above map() describes stack layout with 5 temporary -# 256-bit vectors on top. Then note that we push -# starting from r0, which means that we have copy of -# input arguments just below these temporary vectors. - -$code.=<<___; -.globl GFp_nistz256_point_double -.type GFp_nistz256_point_double,%function -.align 5 -GFp_nistz256_point_double: - stmdb sp!,{r0-r12,lr} @ push from r0, unusual, but intentional - sub sp,sp,#32*5 - -.Lpoint_double_shortcut: - add r3,sp,#$in_x - ldmia $a_ptr!,{r4-r11} @ copy in_x - stmia r3,{r4-r11} - - add $r_ptr,sp,#$S - bl __ecp_nistz256_mul_by_2 @ p256_mul_by_2(S, in_y); - - add $b_ptr,$a_ptr,#32 - add $a_ptr,$a_ptr,#32 - add $r_ptr,sp,#$Zsqr - bl __ecp_nistz256_mul_mont @ p256_sqr_mont(Zsqr, in_z); - - add $a_ptr,sp,#$S - add $b_ptr,sp,#$S - add $r_ptr,sp,#$S - bl __ecp_nistz256_mul_mont @ p256_sqr_mont(S, S); - - ldr $b_ptr,[sp,#32*5+4] - add $a_ptr,$b_ptr,#32 - add $b_ptr,$b_ptr,#64 - add $r_ptr,sp,#$tmp0 - bl __ecp_nistz256_mul_mont @ p256_mul_mont(tmp0, in_z, in_y); - - ldr $r_ptr,[sp,#32*5] - add $r_ptr,$r_ptr,#64 - bl __ecp_nistz256_add_self @ p256_mul_by_2(res_z, tmp0); - - add $a_ptr,sp,#$in_x - add $b_ptr,sp,#$Zsqr - add $r_ptr,sp,#$M - bl __ecp_nistz256_add @ p256_add(M, in_x, Zsqr); - - add $a_ptr,sp,#$in_x - add $b_ptr,sp,#$Zsqr - add $r_ptr,sp,#$Zsqr - bl __ecp_nistz256_sub @ p256_sub(Zsqr, in_x, Zsqr); - - add $a_ptr,sp,#$S - add $b_ptr,sp,#$S - add $r_ptr,sp,#$tmp0 - bl __ecp_nistz256_mul_mont @ p256_sqr_mont(tmp0, S); - - add $a_ptr,sp,#$Zsqr - add $b_ptr,sp,#$M - add $r_ptr,sp,#$M - bl __ecp_nistz256_mul_mont @ p256_mul_mont(M, M, Zsqr); - - ldr $r_ptr,[sp,#32*5] - add $a_ptr,sp,#$tmp0 - add $r_ptr,$r_ptr,#32 - bl __ecp_nistz256_div_by_2 @ p256_div_by_2(res_y, tmp0); - - add $a_ptr,sp,#$M - add $r_ptr,sp,#$M - bl __ecp_nistz256_mul_by_3 @ p256_mul_by_3(M, M); - - add $a_ptr,sp,#$in_x - add $b_ptr,sp,#$S - add $r_ptr,sp,#$S - bl __ecp_nistz256_mul_mont @ p256_mul_mont(S, S, in_x); - - add $r_ptr,sp,#$tmp0 - bl __ecp_nistz256_add_self @ p256_mul_by_2(tmp0, S); - - ldr $r_ptr,[sp,#32*5] - add $a_ptr,sp,#$M - add $b_ptr,sp,#$M - bl __ecp_nistz256_mul_mont @ p256_sqr_mont(res_x, M); - - add $b_ptr,sp,#$tmp0 - bl __ecp_nistz256_sub_from @ p256_sub(res_x, res_x, tmp0); - - add $b_ptr,sp,#$S - add $r_ptr,sp,#$S - bl __ecp_nistz256_sub_morf @ p256_sub(S, S, res_x); - - add $a_ptr,sp,#$M - add $b_ptr,sp,#$S - bl __ecp_nistz256_mul_mont @ p256_mul_mont(S, S, M); - - ldr $r_ptr,[sp,#32*5] - add $b_ptr,$r_ptr,#32 - add $r_ptr,$r_ptr,#32 - bl __ecp_nistz256_sub_from @ p256_sub(res_y, S, res_y); - - add sp,sp,#32*5+16 @ +16 means "skip even over saved r0-r3" -#if __ARM_ARCH__>=5 || !defined(__thumb__) - ldmia sp!,{r4-r12,pc} -#else - ldmia sp!,{r4-r12,lr} - bx lr @ interoperable with Thumb ISA:-) -#endif -.size GFp_nistz256_point_double,.-GFp_nistz256_point_double -___ -} - -}}} - -foreach (split("\n",$code)) { - s/\`([^\`]*)\`/eval $1/geo; - - s/\bq([0-9]+)#(lo|hi)/sprintf "d%d",2*$1+($2 eq "hi")/geo; - - print $_,"\n"; -} -close STDOUT or die "error closing STDOUT"; diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/ec/asm/ecp_nistz256-armv8.pl temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/ec/asm/ecp_nistz256-armv8.pl --- temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/ec/asm/ecp_nistz256-armv8.pl 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/ec/asm/ecp_nistz256-armv8.pl 1970-01-01 00:00:00.000000000 +0000 @@ -1,908 +0,0 @@ -#! /usr/bin/env perl -# Copyright 2015-2016 The OpenSSL Project Authors. All Rights Reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in -# the documentation and/or other materials provided with the -# distribution. -# -# 3. All advertising materials mentioning features or use of this -# software must display the following acknowledgment: -# "This product includes software developed by the OpenSSL Project -# for use in the OpenSSL Toolkit. (http://www.openssl.org/)" -# -# 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to -# endorse or promote products derived from this software without -# prior written permission. For written permission, please contact -# openssl-core@openssl.org. -# -# 5. Products derived from this software may not be called "OpenSSL" -# nor may "OpenSSL" appear in their names without prior written -# permission of the OpenSSL Project. -# -# 6. Redistributions of any form whatsoever must retain the following -# acknowledgment: -# "This product includes software developed by the OpenSSL Project -# for use in the OpenSSL Toolkit (http://www.openssl.org/)" -# -# THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY -# EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR -# ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -# OF THE POSSIBILITY OF SUCH DAMAGE. -# ==================================================================== -# -# This product includes cryptographic software written by Eric Young -# (eay@cryptsoft.com). This product includes software written by Tim -# Hudson (tjh@cryptsoft.com). - - -# ==================================================================== -# Written by Andy Polyakov for the OpenSSL -# project. The module is, however, dual licensed under OpenSSL and -# CRYPTOGAMS licenses depending on where you obtain it. For further -# details see http://www.openssl.org/~appro/cryptogams/. -# ==================================================================== -# -# ECP_NISTZ256 module for ARMv8. -# -# February 2015. -# -# Original ECP_NISTZ256 submission targeting x86_64 is detailed in -# http://eprint.iacr.org/2013/816. -# -# with/without -DECP_NISTZ256_ASM -# Apple A7 +120-360% -# Cortex-A53 +120-400% -# Cortex-A57 +120-350% -# X-Gene +200-330% -# Denver +140-400% -# -# Ranges denote minimum and maximum improvement coefficients depending -# on benchmark. Lower coefficients are for ECDSA sign, server-side -# operation. Keep in mind that +400% means 5x improvement. - -$flavour = shift; -while (($output=shift) && ($output!~/\w[\w\-]*\.\w+$/)) {} - -$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; -( $xlate="${dir}arm-xlate.pl" and -f $xlate ) or -( $xlate="${dir}../../../perlasm/arm-xlate.pl" and -f $xlate) or -die "can't locate arm-xlate.pl"; - -open OUT,"| \"$^X\" $xlate $flavour $output"; -*STDOUT=*OUT; - -{ -my ($rp,$ap,$bp,$bi,$a0,$a1,$a2,$a3,$t0,$t1,$t2,$t3,$poly1,$poly3, - $acc0,$acc1,$acc2,$acc3,$acc4,$acc5) = - map("x$_",(0..17,19,20)); - -my ($acc6,$acc7)=($ap,$bp); # used in __ecp_nistz256_sqr_mont - -$code.=<<___; -#include - -.text -.align 5 -.Lpoly: -.quad 0xffffffffffffffff,0x00000000ffffffff,0x0000000000000000,0xffffffff00000001 -.Lone_mont: -.quad 0x0000000000000001,0xffffffff00000000,0xffffffffffffffff,0x00000000fffffffe -.Lone: -.quad 1,0,0,0 -.asciz "ECP_NISTZ256 for ARMv8, CRYPTOGAMS by " - -// void GFp_nistz256_mul_mont(BN_ULONG x0[4],const BN_ULONG x1[4], -// const BN_ULONG x2[4]); -.globl GFp_nistz256_mul_mont -.type GFp_nistz256_mul_mont,%function -.align 4 -GFp_nistz256_mul_mont: - stp x29,x30,[sp,#-32]! - add x29,sp,#0 - stp x19,x20,[sp,#16] - - ldr $bi,[$bp] // bp[0] - ldp $a0,$a1,[$ap] - ldp $a2,$a3,[$ap,#16] - ldr $poly1,.Lpoly+8 - ldr $poly3,.Lpoly+24 - - bl __ecp_nistz256_mul_mont - - ldp x19,x20,[sp,#16] - ldp x29,x30,[sp],#32 - ret -.size GFp_nistz256_mul_mont,.-GFp_nistz256_mul_mont - -// void GFp_nistz256_sqr_mont(BN_ULONG x0[4],const BN_ULONG x1[4]); -.globl GFp_nistz256_sqr_mont -.type GFp_nistz256_sqr_mont,%function -.align 4 -GFp_nistz256_sqr_mont: - stp x29,x30,[sp,#-32]! - add x29,sp,#0 - stp x19,x20,[sp,#16] - - ldp $a0,$a1,[$ap] - ldp $a2,$a3,[$ap,#16] - ldr $poly1,.Lpoly+8 - ldr $poly3,.Lpoly+24 - - bl __ecp_nistz256_sqr_mont - - ldp x19,x20,[sp,#16] - ldp x29,x30,[sp],#32 - ret -.size GFp_nistz256_sqr_mont,.-GFp_nistz256_sqr_mont - -// void GFp_nistz256_add(BN_ULONG x0[4],const BN_ULONG x1[4], -// const BN_ULONG x2[4]); -.globl GFp_nistz256_add -.type GFp_nistz256_add,%function -.align 4 -GFp_nistz256_add: - stp x29,x30,[sp,#-16]! - add x29,sp,#0 - - ldp $acc0,$acc1,[$ap] - ldp $t0,$t1,[$bp] - ldp $acc2,$acc3,[$ap,#16] - ldp $t2,$t3,[$bp,#16] - ldr $poly1,.Lpoly+8 - ldr $poly3,.Lpoly+24 - - bl __ecp_nistz256_add - - ldp x29,x30,[sp],#16 - ret -.size GFp_nistz256_add,.-GFp_nistz256_add - -// void GFp_nistz256_neg(BN_ULONG x0[4],const BN_ULONG x1[4]); -.globl GFp_nistz256_neg -.type GFp_nistz256_neg,%function -.align 4 -GFp_nistz256_neg: - stp x29,x30,[sp,#-16]! - add x29,sp,#0 - - mov $bp,$ap - mov $acc0,xzr // a = 0 - mov $acc1,xzr - mov $acc2,xzr - mov $acc3,xzr - ldr $poly1,.Lpoly+8 - ldr $poly3,.Lpoly+24 - - bl __ecp_nistz256_sub_from - - ldp x29,x30,[sp],#16 - ret -.size GFp_nistz256_neg,.-GFp_nistz256_neg - -// note that __ecp_nistz256_mul_mont expects a[0-3] input pre-loaded -// to $a0-$a3 and b[0] - to $bi -.type __ecp_nistz256_mul_mont,%function -.align 4 -__ecp_nistz256_mul_mont: - mul $acc0,$a0,$bi // a[0]*b[0] - umulh $t0,$a0,$bi - - mul $acc1,$a1,$bi // a[1]*b[0] - umulh $t1,$a1,$bi - - mul $acc2,$a2,$bi // a[2]*b[0] - umulh $t2,$a2,$bi - - mul $acc3,$a3,$bi // a[3]*b[0] - umulh $t3,$a3,$bi - ldr $bi,[$bp,#8] // b[1] - - adds $acc1,$acc1,$t0 // accumulate high parts of multiplication - lsl $t0,$acc0,#32 - adcs $acc2,$acc2,$t1 - lsr $t1,$acc0,#32 - adcs $acc3,$acc3,$t2 - adc $acc4,xzr,$t3 - mov $acc5,xzr -___ -for($i=1;$i<4;$i++) { - # Reduction iteration is normally performed by accumulating - # result of multiplication of modulus by "magic" digit [and - # omitting least significant word, which is guaranteed to - # be 0], but thanks to special form of modulus and "magic" - # digit being equal to least significant word, it can be - # performed with additions and subtractions alone. Indeed: - # - # ffff0001.00000000.0000ffff.ffffffff - # * abcdefgh - # + xxxxxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx.abcdefgh - # - # Now observing that ff..ff*x = (2^n-1)*x = 2^n*x-x, we - # rewrite above as: - # - # xxxxxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx.abcdefgh - # + abcdefgh.abcdefgh.0000abcd.efgh0000.00000000 - # - 0000abcd.efgh0000.00000000.00000000.abcdefgh - # - # or marking redundant operations: - # - # xxxxxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx.-------- - # + abcdefgh.abcdefgh.0000abcd.efgh0000.-------- - # - 0000abcd.efgh0000.--------.--------.-------- - -$code.=<<___; - subs $t2,$acc0,$t0 // "*0xffff0001" - sbc $t3,$acc0,$t1 - adds $acc0,$acc1,$t0 // +=acc[0]<<96 and omit acc[0] - mul $t0,$a0,$bi // lo(a[0]*b[i]) - adcs $acc1,$acc2,$t1 - mul $t1,$a1,$bi // lo(a[1]*b[i]) - adcs $acc2,$acc3,$t2 // +=acc[0]*0xffff0001 - mul $t2,$a2,$bi // lo(a[2]*b[i]) - adcs $acc3,$acc4,$t3 - mul $t3,$a3,$bi // lo(a[3]*b[i]) - adc $acc4,$acc5,xzr - - adds $acc0,$acc0,$t0 // accumulate low parts of multiplication - umulh $t0,$a0,$bi // hi(a[0]*b[i]) - adcs $acc1,$acc1,$t1 - umulh $t1,$a1,$bi // hi(a[1]*b[i]) - adcs $acc2,$acc2,$t2 - umulh $t2,$a2,$bi // hi(a[2]*b[i]) - adcs $acc3,$acc3,$t3 - umulh $t3,$a3,$bi // hi(a[3]*b[i]) - adc $acc4,$acc4,xzr -___ -$code.=<<___ if ($i<3); - ldr $bi,[$bp,#8*($i+1)] // b[$i+1] -___ -$code.=<<___; - adds $acc1,$acc1,$t0 // accumulate high parts of multiplication - lsl $t0,$acc0,#32 - adcs $acc2,$acc2,$t1 - lsr $t1,$acc0,#32 - adcs $acc3,$acc3,$t2 - adcs $acc4,$acc4,$t3 - adc $acc5,xzr,xzr -___ -} -$code.=<<___; - // last reduction - subs $t2,$acc0,$t0 // "*0xffff0001" - sbc $t3,$acc0,$t1 - adds $acc0,$acc1,$t0 // +=acc[0]<<96 and omit acc[0] - adcs $acc1,$acc2,$t1 - adcs $acc2,$acc3,$t2 // +=acc[0]*0xffff0001 - adcs $acc3,$acc4,$t3 - adc $acc4,$acc5,xzr - - adds $t0,$acc0,#1 // subs $t0,$acc0,#-1 // tmp = ret-modulus - sbcs $t1,$acc1,$poly1 - sbcs $t2,$acc2,xzr - sbcs $t3,$acc3,$poly3 - sbcs xzr,$acc4,xzr // did it borrow? - - csel $acc0,$acc0,$t0,lo // ret = borrow ? ret : ret-modulus - csel $acc1,$acc1,$t1,lo - csel $acc2,$acc2,$t2,lo - stp $acc0,$acc1,[$rp] - csel $acc3,$acc3,$t3,lo - stp $acc2,$acc3,[$rp,#16] - - ret -.size __ecp_nistz256_mul_mont,.-__ecp_nistz256_mul_mont - -// note that __ecp_nistz256_sqr_mont expects a[0-3] input pre-loaded -// to $a0-$a3 -.type __ecp_nistz256_sqr_mont,%function -.align 4 -__ecp_nistz256_sqr_mont: - // | | | | | |a1*a0| | - // | | | | |a2*a0| | | - // | |a3*a2|a3*a0| | | | - // | | | |a2*a1| | | | - // | | |a3*a1| | | | | - // *| | | | | | | | 2| - // +|a3*a3|a2*a2|a1*a1|a0*a0| - // |--+--+--+--+--+--+--+--| - // |A7|A6|A5|A4|A3|A2|A1|A0|, where Ax is $accx, i.e. follow $accx - // - // "can't overflow" below mark carrying into high part of - // multiplication result, which can't overflow, because it - // can never be all ones. - - mul $acc1,$a1,$a0 // a[1]*a[0] - umulh $t1,$a1,$a0 - mul $acc2,$a2,$a0 // a[2]*a[0] - umulh $t2,$a2,$a0 - mul $acc3,$a3,$a0 // a[3]*a[0] - umulh $acc4,$a3,$a0 - - adds $acc2,$acc2,$t1 // accumulate high parts of multiplication - mul $t0,$a2,$a1 // a[2]*a[1] - umulh $t1,$a2,$a1 - adcs $acc3,$acc3,$t2 - mul $t2,$a3,$a1 // a[3]*a[1] - umulh $t3,$a3,$a1 - adc $acc4,$acc4,xzr // can't overflow - - mul $acc5,$a3,$a2 // a[3]*a[2] - umulh $acc6,$a3,$a2 - - adds $t1,$t1,$t2 // accumulate high parts of multiplication - mul $acc0,$a0,$a0 // a[0]*a[0] - adc $t2,$t3,xzr // can't overflow - - adds $acc3,$acc3,$t0 // accumulate low parts of multiplication - umulh $a0,$a0,$a0 - adcs $acc4,$acc4,$t1 - mul $t1,$a1,$a1 // a[1]*a[1] - adcs $acc5,$acc5,$t2 - umulh $a1,$a1,$a1 - adc $acc6,$acc6,xzr // can't overflow - - adds $acc1,$acc1,$acc1 // acc[1-6]*=2 - mul $t2,$a2,$a2 // a[2]*a[2] - adcs $acc2,$acc2,$acc2 - umulh $a2,$a2,$a2 - adcs $acc3,$acc3,$acc3 - mul $t3,$a3,$a3 // a[3]*a[3] - adcs $acc4,$acc4,$acc4 - umulh $a3,$a3,$a3 - adcs $acc5,$acc5,$acc5 - adcs $acc6,$acc6,$acc6 - adc $acc7,xzr,xzr - - adds $acc1,$acc1,$a0 // +a[i]*a[i] - adcs $acc2,$acc2,$t1 - adcs $acc3,$acc3,$a1 - adcs $acc4,$acc4,$t2 - adcs $acc5,$acc5,$a2 - lsl $t0,$acc0,#32 - adcs $acc6,$acc6,$t3 - lsr $t1,$acc0,#32 - adc $acc7,$acc7,$a3 -___ -for($i=0;$i<3;$i++) { # reductions, see commentary in - # multiplication for details -$code.=<<___; - subs $t2,$acc0,$t0 // "*0xffff0001" - sbc $t3,$acc0,$t1 - adds $acc0,$acc1,$t0 // +=acc[0]<<96 and omit acc[0] - adcs $acc1,$acc2,$t1 - lsl $t0,$acc0,#32 - adcs $acc2,$acc3,$t2 // +=acc[0]*0xffff0001 - lsr $t1,$acc0,#32 - adc $acc3,$t3,xzr // can't overflow -___ -} -$code.=<<___; - subs $t2,$acc0,$t0 // "*0xffff0001" - sbc $t3,$acc0,$t1 - adds $acc0,$acc1,$t0 // +=acc[0]<<96 and omit acc[0] - adcs $acc1,$acc2,$t1 - adcs $acc2,$acc3,$t2 // +=acc[0]*0xffff0001 - adc $acc3,$t3,xzr // can't overflow - - adds $acc0,$acc0,$acc4 // accumulate upper half - adcs $acc1,$acc1,$acc5 - adcs $acc2,$acc2,$acc6 - adcs $acc3,$acc3,$acc7 - adc $acc4,xzr,xzr - - adds $t0,$acc0,#1 // subs $t0,$acc0,#-1 // tmp = ret-modulus - sbcs $t1,$acc1,$poly1 - sbcs $t2,$acc2,xzr - sbcs $t3,$acc3,$poly3 - sbcs xzr,$acc4,xzr // did it borrow? - - csel $acc0,$acc0,$t0,lo // ret = borrow ? ret : ret-modulus - csel $acc1,$acc1,$t1,lo - csel $acc2,$acc2,$t2,lo - stp $acc0,$acc1,[$rp] - csel $acc3,$acc3,$t3,lo - stp $acc2,$acc3,[$rp,#16] - - ret -.size __ecp_nistz256_sqr_mont,.-__ecp_nistz256_sqr_mont - -// Note that __ecp_nistz256_add expects both input vectors pre-loaded to -// $a0-$a3 and $t0-$t3. This is done because it's used in multiple -// contexts, e.g. in multiplication by 2 and 3... -.type __ecp_nistz256_add,%function -.align 4 -__ecp_nistz256_add: - adds $acc0,$acc0,$t0 // ret = a+b - adcs $acc1,$acc1,$t1 - adcs $acc2,$acc2,$t2 - adcs $acc3,$acc3,$t3 - adc $ap,xzr,xzr // zap $ap - - adds $t0,$acc0,#1 // subs $t0,$a0,#-1 // tmp = ret-modulus - sbcs $t1,$acc1,$poly1 - sbcs $t2,$acc2,xzr - sbcs $t3,$acc3,$poly3 - sbcs xzr,$ap,xzr // did subtraction borrow? - - csel $acc0,$acc0,$t0,lo // ret = borrow ? ret : ret-modulus - csel $acc1,$acc1,$t1,lo - csel $acc2,$acc2,$t2,lo - stp $acc0,$acc1,[$rp] - csel $acc3,$acc3,$t3,lo - stp $acc2,$acc3,[$rp,#16] - - ret -.size __ecp_nistz256_add,.-__ecp_nistz256_add - -.type __ecp_nistz256_sub_from,%function -.align 4 -__ecp_nistz256_sub_from: - ldp $t0,$t1,[$bp] - ldp $t2,$t3,[$bp,#16] - subs $acc0,$acc0,$t0 // ret = a-b - sbcs $acc1,$acc1,$t1 - sbcs $acc2,$acc2,$t2 - sbcs $acc3,$acc3,$t3 - sbc $ap,xzr,xzr // zap $ap - - subs $t0,$acc0,#1 // adds $t0,$a0,#-1 // tmp = ret+modulus - adcs $t1,$acc1,$poly1 - adcs $t2,$acc2,xzr - adc $t3,$acc3,$poly3 - cmp $ap,xzr // did subtraction borrow? - - csel $acc0,$acc0,$t0,eq // ret = borrow ? ret+modulus : ret - csel $acc1,$acc1,$t1,eq - csel $acc2,$acc2,$t2,eq - stp $acc0,$acc1,[$rp] - csel $acc3,$acc3,$t3,eq - stp $acc2,$acc3,[$rp,#16] - - ret -.size __ecp_nistz256_sub_from,.-__ecp_nistz256_sub_from - -.type __ecp_nistz256_sub_morf,%function -.align 4 -__ecp_nistz256_sub_morf: - ldp $t0,$t1,[$bp] - ldp $t2,$t3,[$bp,#16] - subs $acc0,$t0,$acc0 // ret = b-a - sbcs $acc1,$t1,$acc1 - sbcs $acc2,$t2,$acc2 - sbcs $acc3,$t3,$acc3 - sbc $ap,xzr,xzr // zap $ap - - subs $t0,$acc0,#1 // adds $t0,$a0,#-1 // tmp = ret+modulus - adcs $t1,$acc1,$poly1 - adcs $t2,$acc2,xzr - adc $t3,$acc3,$poly3 - cmp $ap,xzr // did subtraction borrow? - - csel $acc0,$acc0,$t0,eq // ret = borrow ? ret+modulus : ret - csel $acc1,$acc1,$t1,eq - csel $acc2,$acc2,$t2,eq - stp $acc0,$acc1,[$rp] - csel $acc3,$acc3,$t3,eq - stp $acc2,$acc3,[$rp,#16] - - ret -.size __ecp_nistz256_sub_morf,.-__ecp_nistz256_sub_morf - -.type __ecp_nistz256_div_by_2,%function -.align 4 -__ecp_nistz256_div_by_2: - subs $t0,$acc0,#1 // adds $t0,$a0,#-1 // tmp = a+modulus - adcs $t1,$acc1,$poly1 - adcs $t2,$acc2,xzr - adcs $t3,$acc3,$poly3 - adc $ap,xzr,xzr // zap $ap - tst $acc0,#1 // is a even? - - csel $acc0,$acc0,$t0,eq // ret = even ? a : a+modulus - csel $acc1,$acc1,$t1,eq - csel $acc2,$acc2,$t2,eq - csel $acc3,$acc3,$t3,eq - csel $ap,xzr,$ap,eq - - lsr $acc0,$acc0,#1 // ret >>= 1 - orr $acc0,$acc0,$acc1,lsl#63 - lsr $acc1,$acc1,#1 - orr $acc1,$acc1,$acc2,lsl#63 - lsr $acc2,$acc2,#1 - orr $acc2,$acc2,$acc3,lsl#63 - lsr $acc3,$acc3,#1 - stp $acc0,$acc1,[$rp] - orr $acc3,$acc3,$ap,lsl#63 - stp $acc2,$acc3,[$rp,#16] - - ret -.size __ecp_nistz256_div_by_2,.-__ecp_nistz256_div_by_2 -___ -######################################################################## -# following subroutines are "literal" implementation of those found in -# ecp_nistz256.c -# -######################################################################## -# void GFp_nistz256_point_double(P256_POINT *out,const P256_POINT *inp); -# -{ -my ($S,$M,$Zsqr,$tmp0)=map(32*$_,(0..3)); -# above map() describes stack layout with 4 temporary -# 256-bit vectors on top. -my ($rp_real,$ap_real) = map("x$_",(21,22)); - -$code.=<<___; -.globl GFp_nistz256_point_double -.type GFp_nistz256_point_double,%function -.align 5 -GFp_nistz256_point_double: - stp x29,x30,[sp,#-80]! - add x29,sp,#0 - stp x19,x20,[sp,#16] - stp x21,x22,[sp,#32] - sub sp,sp,#32*4 - -.Ldouble_shortcut: - ldp $acc0,$acc1,[$ap,#32] - mov $rp_real,$rp - ldp $acc2,$acc3,[$ap,#48] - mov $ap_real,$ap - ldr $poly1,.Lpoly+8 - mov $t0,$acc0 - ldr $poly3,.Lpoly+24 - mov $t1,$acc1 - ldp $a0,$a1,[$ap_real,#64] // forward load for p256_sqr_mont - mov $t2,$acc2 - mov $t3,$acc3 - ldp $a2,$a3,[$ap_real,#64+16] - add $rp,sp,#$S - bl __ecp_nistz256_add // p256_mul_by_2(S, in_y); - - add $rp,sp,#$Zsqr - bl __ecp_nistz256_sqr_mont // p256_sqr_mont(Zsqr, in_z); - - ldp $t0,$t1,[$ap_real] - ldp $t2,$t3,[$ap_real,#16] - mov $a0,$acc0 // put Zsqr aside for p256_sub - mov $a1,$acc1 - mov $a2,$acc2 - mov $a3,$acc3 - add $rp,sp,#$M - bl __ecp_nistz256_add // p256_add(M, Zsqr, in_x); - - add $bp,$ap_real,#0 - mov $acc0,$a0 // restore Zsqr - mov $acc1,$a1 - ldp $a0,$a1,[sp,#$S] // forward load for p256_sqr_mont - mov $acc2,$a2 - mov $acc3,$a3 - ldp $a2,$a3,[sp,#$S+16] - add $rp,sp,#$Zsqr - bl __ecp_nistz256_sub_morf // p256_sub(Zsqr, in_x, Zsqr); - - add $rp,sp,#$S - bl __ecp_nistz256_sqr_mont // p256_sqr_mont(S, S); - - ldr $bi,[$ap_real,#32] - ldp $a0,$a1,[$ap_real,#64] - ldp $a2,$a3,[$ap_real,#64+16] - add $bp,$ap_real,#32 - add $rp,sp,#$tmp0 - bl __ecp_nistz256_mul_mont // p256_mul_mont(tmp0, in_z, in_y); - - mov $t0,$acc0 - mov $t1,$acc1 - ldp $a0,$a1,[sp,#$S] // forward load for p256_sqr_mont - mov $t2,$acc2 - mov $t3,$acc3 - ldp $a2,$a3,[sp,#$S+16] - add $rp,$rp_real,#64 - bl __ecp_nistz256_add // p256_mul_by_2(res_z, tmp0); - - add $rp,sp,#$tmp0 - bl __ecp_nistz256_sqr_mont // p256_sqr_mont(tmp0, S); - - ldr $bi,[sp,#$Zsqr] // forward load for p256_mul_mont - ldp $a0,$a1,[sp,#$M] - ldp $a2,$a3,[sp,#$M+16] - add $rp,$rp_real,#32 - bl __ecp_nistz256_div_by_2 // p256_div_by_2(res_y, tmp0); - - add $bp,sp,#$Zsqr - add $rp,sp,#$M - bl __ecp_nistz256_mul_mont // p256_mul_mont(M, M, Zsqr); - - mov $t0,$acc0 // duplicate M - mov $t1,$acc1 - mov $t2,$acc2 - mov $t3,$acc3 - mov $a0,$acc0 // put M aside - mov $a1,$acc1 - mov $a2,$acc2 - mov $a3,$acc3 - add $rp,sp,#$M - bl __ecp_nistz256_add - mov $t0,$a0 // restore M - mov $t1,$a1 - ldr $bi,[$ap_real] // forward load for p256_mul_mont - mov $t2,$a2 - ldp $a0,$a1,[sp,#$S] - mov $t3,$a3 - ldp $a2,$a3,[sp,#$S+16] - bl __ecp_nistz256_add // p256_mul_by_3(M, M); - - add $bp,$ap_real,#0 - add $rp,sp,#$S - bl __ecp_nistz256_mul_mont // p256_mul_mont(S, S, in_x); - - mov $t0,$acc0 - mov $t1,$acc1 - ldp $a0,$a1,[sp,#$M] // forward load for p256_sqr_mont - mov $t2,$acc2 - mov $t3,$acc3 - ldp $a2,$a3,[sp,#$M+16] - add $rp,sp,#$tmp0 - bl __ecp_nistz256_add // p256_mul_by_2(tmp0, S); - - add $rp,$rp_real,#0 - bl __ecp_nistz256_sqr_mont // p256_sqr_mont(res_x, M); - - add $bp,sp,#$tmp0 - bl __ecp_nistz256_sub_from // p256_sub(res_x, res_x, tmp0); - - add $bp,sp,#$S - add $rp,sp,#$S - bl __ecp_nistz256_sub_morf // p256_sub(S, S, res_x); - - ldr $bi,[sp,#$M] - mov $a0,$acc0 // copy S - mov $a1,$acc1 - mov $a2,$acc2 - mov $a3,$acc3 - add $bp,sp,#$M - bl __ecp_nistz256_mul_mont // p256_mul_mont(S, S, M); - - add $bp,$rp_real,#32 - add $rp,$rp_real,#32 - bl __ecp_nistz256_sub_from // p256_sub(res_y, S, res_y); - - add sp,x29,#0 // destroy frame - ldp x19,x20,[x29,#16] - ldp x21,x22,[x29,#32] - ldp x29,x30,[sp],#80 - ret -.size GFp_nistz256_point_double,.-GFp_nistz256_point_double -___ -} - -######################################################################## -# void GFp_nistz256_point_add_affine(P256_POINT *out,const P256_POINT *in1, -# const P256_POINT_AFFINE *in2); -{ -my ($res_x,$res_y,$res_z, - $U2,$S2,$H,$R,$Hsqr,$Hcub,$Rsqr)=map(32*$_,(0..9)); -my $Z1sqr = $S2; -# above map() describes stack layout with 10 temporary -# 256-bit vectors on top. -my ($rp_real,$ap_real,$bp_real,$in1infty,$in2infty,$temp)=map("x$_",(21..26)); - -$code.=<<___; -.globl GFp_nistz256_point_add_affine -.type GFp_nistz256_point_add_affine,%function -.align 5 -GFp_nistz256_point_add_affine: - stp x29,x30,[sp,#-80]! - add x29,sp,#0 - stp x19,x20,[sp,#16] - stp x21,x22,[sp,#32] - stp x23,x24,[sp,#48] - stp x25,x26,[sp,#64] - sub sp,sp,#32*10 - - mov $rp_real,$rp - mov $ap_real,$ap - mov $bp_real,$bp - ldr $poly1,.Lpoly+8 - ldr $poly3,.Lpoly+24 - - ldp $a0,$a1,[$ap,#64] // in1_z - ldp $a2,$a3,[$ap,#64+16] - orr $t0,$a0,$a1 - orr $t2,$a2,$a3 - orr $in1infty,$t0,$t2 - cmp $in1infty,#0 - csetm $in1infty,ne // !in1infty - - ldp $acc0,$acc1,[$bp] // in2_x - ldp $acc2,$acc3,[$bp,#16] - ldp $t0,$t1,[$bp,#32] // in2_y - ldp $t2,$t3,[$bp,#48] - orr $acc0,$acc0,$acc1 - orr $acc2,$acc2,$acc3 - orr $t0,$t0,$t1 - orr $t2,$t2,$t3 - orr $acc0,$acc0,$acc2 - orr $t0,$t0,$t2 - orr $in2infty,$acc0,$t0 - cmp $in2infty,#0 - csetm $in2infty,ne // !in2infty - - add $rp,sp,#$Z1sqr - bl __ecp_nistz256_sqr_mont // p256_sqr_mont(Z1sqr, in1_z); - - mov $a0,$acc0 - mov $a1,$acc1 - mov $a2,$acc2 - mov $a3,$acc3 - ldr $bi,[$bp_real] - add $bp,$bp_real,#0 - add $rp,sp,#$U2 - bl __ecp_nistz256_mul_mont // p256_mul_mont(U2, Z1sqr, in2_x); - - add $bp,$ap_real,#0 - ldr $bi,[$ap_real,#64] // forward load for p256_mul_mont - ldp $a0,$a1,[sp,#$Z1sqr] - ldp $a2,$a3,[sp,#$Z1sqr+16] - add $rp,sp,#$H - bl __ecp_nistz256_sub_from // p256_sub(H, U2, in1_x); - - add $bp,$ap_real,#64 - add $rp,sp,#$S2 - bl __ecp_nistz256_mul_mont // p256_mul_mont(S2, Z1sqr, in1_z); - - ldr $bi,[$ap_real,#64] - ldp $a0,$a1,[sp,#$H] - ldp $a2,$a3,[sp,#$H+16] - add $bp,$ap_real,#64 - add $rp,sp,#$res_z - bl __ecp_nistz256_mul_mont // p256_mul_mont(res_z, H, in1_z); - - ldr $bi,[$bp_real,#32] - ldp $a0,$a1,[sp,#$S2] - ldp $a2,$a3,[sp,#$S2+16] - add $bp,$bp_real,#32 - add $rp,sp,#$S2 - bl __ecp_nistz256_mul_mont // p256_mul_mont(S2, S2, in2_y); - - add $bp,$ap_real,#32 - ldp $a0,$a1,[sp,#$H] // forward load for p256_sqr_mont - ldp $a2,$a3,[sp,#$H+16] - add $rp,sp,#$R - bl __ecp_nistz256_sub_from // p256_sub(R, S2, in1_y); - - add $rp,sp,#$Hsqr - bl __ecp_nistz256_sqr_mont // p256_sqr_mont(Hsqr, H); - - ldp $a0,$a1,[sp,#$R] - ldp $a2,$a3,[sp,#$R+16] - add $rp,sp,#$Rsqr - bl __ecp_nistz256_sqr_mont // p256_sqr_mont(Rsqr, R); - - ldr $bi,[sp,#$H] - ldp $a0,$a1,[sp,#$Hsqr] - ldp $a2,$a3,[sp,#$Hsqr+16] - add $bp,sp,#$H - add $rp,sp,#$Hcub - bl __ecp_nistz256_mul_mont // p256_mul_mont(Hcub, Hsqr, H); - - ldr $bi,[$ap_real] - ldp $a0,$a1,[sp,#$Hsqr] - ldp $a2,$a3,[sp,#$Hsqr+16] - add $bp,$ap_real,#0 - add $rp,sp,#$U2 - bl __ecp_nistz256_mul_mont // p256_mul_mont(U2, in1_x, Hsqr); - - mov $t0,$acc0 - mov $t1,$acc1 - mov $t2,$acc2 - mov $t3,$acc3 - add $rp,sp,#$Hsqr - bl __ecp_nistz256_add // p256_mul_by_2(Hsqr, U2); - - add $bp,sp,#$Rsqr - add $rp,sp,#$res_x - bl __ecp_nistz256_sub_morf // p256_sub(res_x, Rsqr, Hsqr); - - add $bp,sp,#$Hcub - bl __ecp_nistz256_sub_from // p256_sub(res_x, res_x, Hcub); - - add $bp,sp,#$U2 - ldr $bi,[$ap_real,#32] // forward load for p256_mul_mont - ldp $a0,$a1,[sp,#$Hcub] - ldp $a2,$a3,[sp,#$Hcub+16] - add $rp,sp,#$res_y - bl __ecp_nistz256_sub_morf // p256_sub(res_y, U2, res_x); - - add $bp,$ap_real,#32 - add $rp,sp,#$S2 - bl __ecp_nistz256_mul_mont // p256_mul_mont(S2, in1_y, Hcub); - - ldr $bi,[sp,#$R] - ldp $a0,$a1,[sp,#$res_y] - ldp $a2,$a3,[sp,#$res_y+16] - add $bp,sp,#$R - add $rp,sp,#$res_y - bl __ecp_nistz256_mul_mont // p256_mul_mont(res_y, res_y, R); - - add $bp,sp,#$S2 - bl __ecp_nistz256_sub_from // p256_sub(res_y, res_y, S2); - - ldp $a0,$a1,[sp,#$res_x] // res - ldp $a2,$a3,[sp,#$res_x+16] - ldp $t0,$t1,[$bp_real] // in2 - ldp $t2,$t3,[$bp_real,#16] -___ -for($i=0;$i<64;$i+=32) { # conditional moves -$code.=<<___; - ldp $acc0,$acc1,[$ap_real,#$i] // in1 - cmp $in1infty,#0 // !$in1intfy, remember? - ldp $acc2,$acc3,[$ap_real,#$i+16] - csel $t0,$a0,$t0,ne - csel $t1,$a1,$t1,ne - ldp $a0,$a1,[sp,#$res_x+$i+32] // res - csel $t2,$a2,$t2,ne - csel $t3,$a3,$t3,ne - cmp $in2infty,#0 // !$in2intfy, remember? - ldp $a2,$a3,[sp,#$res_x+$i+48] - csel $acc0,$t0,$acc0,ne - csel $acc1,$t1,$acc1,ne - ldp $t0,$t1,[$bp_real,#$i+32] // in2 - csel $acc2,$t2,$acc2,ne - csel $acc3,$t3,$acc3,ne - ldp $t2,$t3,[$bp_real,#$i+48] - stp $acc0,$acc1,[$rp_real,#$i] - stp $acc2,$acc3,[$rp_real,#$i+16] -___ -$code.=<<___ if ($i == 0); - adr $bp_real,.Lone_mont-64 -___ -} -$code.=<<___; - ldp $acc0,$acc1,[$ap_real,#$i] // in1 - cmp $in1infty,#0 // !$in1intfy, remember? - ldp $acc2,$acc3,[$ap_real,#$i+16] - csel $t0,$a0,$t0,ne - csel $t1,$a1,$t1,ne - csel $t2,$a2,$t2,ne - csel $t3,$a3,$t3,ne - cmp $in2infty,#0 // !$in2intfy, remember? - csel $acc0,$t0,$acc0,ne - csel $acc1,$t1,$acc1,ne - csel $acc2,$t2,$acc2,ne - csel $acc3,$t3,$acc3,ne - stp $acc0,$acc1,[$rp_real,#$i] - stp $acc2,$acc3,[$rp_real,#$i+16] - - add sp,x29,#0 // destroy frame - ldp x19,x20,[x29,#16] - ldp x21,x22,[x29,#32] - ldp x23,x24,[x29,#48] - ldp x25,x26,[x29,#64] - ldp x29,x30,[sp],#80 - ret -.size GFp_nistz256_point_add_affine,.-GFp_nistz256_point_add_affine -___ -} } - -foreach (split("\n",$code)) { - s/\`([^\`]*)\`/eval $1/ge; - - print $_,"\n"; -} -close STDOUT or die "error closing STDOUT"; diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/ec/asm/ecp_nistz256-x86.pl temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/ec/asm/ecp_nistz256-x86.pl --- temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/ec/asm/ecp_nistz256-x86.pl 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/ec/asm/ecp_nistz256-x86.pl 1970-01-01 00:00:00.000000000 +0000 @@ -1,1122 +0,0 @@ -#! /usr/bin/env perl -# Copyright 2015-2016 The OpenSSL Project Authors. All Rights Reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in -# the documentation and/or other materials provided with the -# distribution. -# -# 3. All advertising materials mentioning features or use of this -# software must display the following acknowledgment: -# "This product includes software developed by the OpenSSL Project -# for use in the OpenSSL Toolkit. (http://www.openssl.org/)" -# -# 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to -# endorse or promote products derived from this software without -# prior written permission. For written permission, please contact -# openssl-core@openssl.org. -# -# 5. Products derived from this software may not be called "OpenSSL" -# nor may "OpenSSL" appear in their names without prior written -# permission of the OpenSSL Project. -# -# 6. Redistributions of any form whatsoever must retain the following -# acknowledgment: -# "This product includes software developed by the OpenSSL Project -# for use in the OpenSSL Toolkit (http://www.openssl.org/)" -# -# THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY -# EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR -# ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -# OF THE POSSIBILITY OF SUCH DAMAGE. -# ==================================================================== -# -# This product includes cryptographic software written by Eric Young -# (eay@cryptsoft.com). This product includes software written by Tim -# Hudson (tjh@cryptsoft.com). - - -# ==================================================================== -# Written by Andy Polyakov for the OpenSSL -# project. The module is, however, dual licensed under OpenSSL and -# CRYPTOGAMS licenses depending on where you obtain it. For further -# details see http://www.openssl.org/~appro/cryptogams/. -# ==================================================================== -# -# ECP_NISTZ256 module for x86/SSE2. -# -# October 2014. -# -# Original ECP_NISTZ256 submission targeting x86_64 is detailed in -# http://eprint.iacr.org/2013/816. In the process of adaptation -# original .c module was made 32-bit savvy in order to make this -# implementation possible. -# -# with/without -DECP_NISTZ256_ASM -# Pentium +66-163% -# PIII +72-172% -# P4 +65-132% -# Core2 +90-215% -# Sandy Bridge +105-265% (contemporary i[57]-* are all close to this) -# Atom +65-155% -# Opteron +54-110% -# Bulldozer +99-240% -# VIA Nano +93-290% -# -# Ranges denote minimum and maximum improvement coefficients depending -# on benchmark. Lower coefficients are for ECDSA sign, server-side -# operation. Keep in mind that +200% means 3x improvement. - -$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; -push(@INC,"${dir}","${dir}../../../perlasm"); -require "x86asm.pl"; - -$output=pop; -open STDOUT,">$output"; - -&asm_init($ARGV[0],"ecp_nistz256-x86.pl",$ARGV[$#ARGV] eq "386"); - -$sse2=0; -for (@ARGV) { $sse2=1 if (/-DOPENSSL_IA32_SSE2/); } - -&external_label("GFp_ia32cap_P") if ($sse2); - - -######################################################################## -# Keep in mind that constants are stored least to most significant word -&static_label("ONE_mont"); -&set_label("ONE_mont"); -&data_word(1,0,0,-1,-1,-1,-2,0); - - -&function_begin_B("_ecp_nistz256_div_by_2"); - # tmp = a is odd ? a+mod : a - # - # note that because mod has special form, i.e. consists of - # 0xffffffff, 1 and 0s, we can conditionally synthesize it by - # assigning least significant bit of input to one register, - # %ebp, and its negative to another, %edx. - - &mov ("ebp",&DWP(0,"esi")); - &xor ("edx","edx"); - &mov ("ebx",&DWP(4,"esi")); - &mov ("eax","ebp"); - &and ("ebp",1); - &mov ("ecx",&DWP(8,"esi")); - &sub ("edx","ebp"); - - &add ("eax","edx"); - &adc ("ebx","edx"); - &mov (&DWP(0,"edi"),"eax"); - &adc ("ecx","edx"); - &mov (&DWP(4,"edi"),"ebx"); - &mov (&DWP(8,"edi"),"ecx"); - - &mov ("eax",&DWP(12,"esi")); - &mov ("ebx",&DWP(16,"esi")); - &adc ("eax",0); - &mov ("ecx",&DWP(20,"esi")); - &adc ("ebx",0); - &mov (&DWP(12,"edi"),"eax"); - &adc ("ecx",0); - &mov (&DWP(16,"edi"),"ebx"); - &mov (&DWP(20,"edi"),"ecx"); - - &mov ("eax",&DWP(24,"esi")); - &mov ("ebx",&DWP(28,"esi")); - &adc ("eax","ebp"); - &adc ("ebx","edx"); - &mov (&DWP(24,"edi"),"eax"); - &sbb ("esi","esi"); # broadcast carry bit - &mov (&DWP(28,"edi"),"ebx"); - - # ret = tmp >> 1 - - &mov ("eax",&DWP(0,"edi")); - &mov ("ebx",&DWP(4,"edi")); - &mov ("ecx",&DWP(8,"edi")); - &mov ("edx",&DWP(12,"edi")); - - &shr ("eax",1); - &mov ("ebp","ebx"); - &shl ("ebx",31); - &or ("eax","ebx"); - - &shr ("ebp",1); - &mov ("ebx","ecx"); - &shl ("ecx",31); - &mov (&DWP(0,"edi"),"eax"); - &or ("ebp","ecx"); - &mov ("eax",&DWP(16,"edi")); - - &shr ("ebx",1); - &mov ("ecx","edx"); - &shl ("edx",31); - &mov (&DWP(4,"edi"),"ebp"); - &or ("ebx","edx"); - &mov ("ebp",&DWP(20,"edi")); - - &shr ("ecx",1); - &mov ("edx","eax"); - &shl ("eax",31); - &mov (&DWP(8,"edi"),"ebx"); - &or ("ecx","eax"); - &mov ("ebx",&DWP(24,"edi")); - - &shr ("edx",1); - &mov ("eax","ebp"); - &shl ("ebp",31); - &mov (&DWP(12,"edi"),"ecx"); - &or ("edx","ebp"); - &mov ("ecx",&DWP(28,"edi")); - - &shr ("eax",1); - &mov ("ebp","ebx"); - &shl ("ebx",31); - &mov (&DWP(16,"edi"),"edx"); - &or ("eax","ebx"); - - &shr ("ebp",1); - &mov ("ebx","ecx"); - &shl ("ecx",31); - &mov (&DWP(20,"edi"),"eax"); - &or ("ebp","ecx"); - - &shr ("ebx",1); - &shl ("esi",31); - &mov (&DWP(24,"edi"),"ebp"); - &or ("ebx","esi"); # handle top-most carry bit - &mov (&DWP(28,"edi"),"ebx"); - - &ret (); -&function_end_B("_ecp_nistz256_div_by_2"); - -######################################################################## -# void GFp_nistz256_add(BN_ULONG edi[8],const BN_ULONG esi[8], -# const BN_ULONG ebp[8]); -&function_begin("GFp_nistz256_add"); - &mov ("esi",&wparam(1)); - &mov ("ebp",&wparam(2)); - &mov ("edi",&wparam(0)); - &call ("_ecp_nistz256_add"); -&function_end("GFp_nistz256_add"); - -&function_begin_B("_ecp_nistz256_add"); - &mov ("eax",&DWP(0,"esi")); - &mov ("ebx",&DWP(4,"esi")); - &mov ("ecx",&DWP(8,"esi")); - &add ("eax",&DWP(0,"ebp")); - &mov ("edx",&DWP(12,"esi")); - &adc ("ebx",&DWP(4,"ebp")); - &mov (&DWP(0,"edi"),"eax"); - &adc ("ecx",&DWP(8,"ebp")); - &mov (&DWP(4,"edi"),"ebx"); - &adc ("edx",&DWP(12,"ebp")); - &mov (&DWP(8,"edi"),"ecx"); - &mov (&DWP(12,"edi"),"edx"); - - &mov ("eax",&DWP(16,"esi")); - &mov ("ebx",&DWP(20,"esi")); - &mov ("ecx",&DWP(24,"esi")); - &adc ("eax",&DWP(16,"ebp")); - &mov ("edx",&DWP(28,"esi")); - &adc ("ebx",&DWP(20,"ebp")); - &mov (&DWP(16,"edi"),"eax"); - &adc ("ecx",&DWP(24,"ebp")); - &mov (&DWP(20,"edi"),"ebx"); - &mov ("esi",0); - &adc ("edx",&DWP(28,"ebp")); - &mov (&DWP(24,"edi"),"ecx"); - &adc ("esi",0); - &mov (&DWP(28,"edi"),"edx"); - - # if a+b >= modulus, subtract modulus. - # - # But since comparison implies subtraction, we subtract modulus - # to see if it borrows, and then subtract it for real if - # subtraction didn't borrow. - - &mov ("eax",&DWP(0,"edi")); - &mov ("ebx",&DWP(4,"edi")); - &mov ("ecx",&DWP(8,"edi")); - &sub ("eax",-1); - &mov ("edx",&DWP(12,"edi")); - &sbb ("ebx",-1); - &mov ("eax",&DWP(16,"edi")); - &sbb ("ecx",-1); - &mov ("ebx",&DWP(20,"edi")); - &sbb ("edx",0); - &mov ("ecx",&DWP(24,"edi")); - &sbb ("eax",0); - &mov ("edx",&DWP(28,"edi")); - &sbb ("ebx",0); - &sbb ("ecx",1); - &sbb ("edx",-1); - &sbb ("esi",0); - - # Note that because mod has special form, i.e. consists of - # 0xffffffff, 1 and 0s, we can conditionally synthesize it by - # by using borrow. - - ¬ ("esi"); - &mov ("eax",&DWP(0,"edi")); - &mov ("ebp","esi"); - &mov ("ebx",&DWP(4,"edi")); - &shr ("ebp",31); - &mov ("ecx",&DWP(8,"edi")); - &sub ("eax","esi"); - &mov ("edx",&DWP(12,"edi")); - &sbb ("ebx","esi"); - &mov (&DWP(0,"edi"),"eax"); - &sbb ("ecx","esi"); - &mov (&DWP(4,"edi"),"ebx"); - &sbb ("edx",0); - &mov (&DWP(8,"edi"),"ecx"); - &mov (&DWP(12,"edi"),"edx"); - - &mov ("eax",&DWP(16,"edi")); - &mov ("ebx",&DWP(20,"edi")); - &mov ("ecx",&DWP(24,"edi")); - &sbb ("eax",0); - &mov ("edx",&DWP(28,"edi")); - &sbb ("ebx",0); - &mov (&DWP(16,"edi"),"eax"); - &sbb ("ecx","ebp"); - &mov (&DWP(20,"edi"),"ebx"); - &sbb ("edx","esi"); - &mov (&DWP(24,"edi"),"ecx"); - &mov (&DWP(28,"edi"),"edx"); - - &ret (); -&function_end_B("_ecp_nistz256_add"); - -&function_begin_B("_ecp_nistz256_sub"); - &mov ("eax",&DWP(0,"esi")); - &mov ("ebx",&DWP(4,"esi")); - &mov ("ecx",&DWP(8,"esi")); - &sub ("eax",&DWP(0,"ebp")); - &mov ("edx",&DWP(12,"esi")); - &sbb ("ebx",&DWP(4,"ebp")); - &mov (&DWP(0,"edi"),"eax"); - &sbb ("ecx",&DWP(8,"ebp")); - &mov (&DWP(4,"edi"),"ebx"); - &sbb ("edx",&DWP(12,"ebp")); - &mov (&DWP(8,"edi"),"ecx"); - &mov (&DWP(12,"edi"),"edx"); - - &mov ("eax",&DWP(16,"esi")); - &mov ("ebx",&DWP(20,"esi")); - &mov ("ecx",&DWP(24,"esi")); - &sbb ("eax",&DWP(16,"ebp")); - &mov ("edx",&DWP(28,"esi")); - &sbb ("ebx",&DWP(20,"ebp")); - &sbb ("ecx",&DWP(24,"ebp")); - &mov (&DWP(16,"edi"),"eax"); - &sbb ("edx",&DWP(28,"ebp")); - &mov (&DWP(20,"edi"),"ebx"); - &sbb ("esi","esi"); # broadcast borrow bit - &mov (&DWP(24,"edi"),"ecx"); - &mov (&DWP(28,"edi"),"edx"); - - # if a-b borrows, add modulus. - # - # Note that because mod has special form, i.e. consists of - # 0xffffffff, 1 and 0s, we can conditionally synthesize it by - # assigning borrow bit to one register, %ebp, and its negative - # to another, %esi. But we started by calculating %esi... - - &mov ("eax",&DWP(0,"edi")); - &mov ("ebp","esi"); - &mov ("ebx",&DWP(4,"edi")); - &shr ("ebp",31); - &mov ("ecx",&DWP(8,"edi")); - &add ("eax","esi"); - &mov ("edx",&DWP(12,"edi")); - &adc ("ebx","esi"); - &mov (&DWP(0,"edi"),"eax"); - &adc ("ecx","esi"); - &mov (&DWP(4,"edi"),"ebx"); - &adc ("edx",0); - &mov (&DWP(8,"edi"),"ecx"); - &mov (&DWP(12,"edi"),"edx"); - - &mov ("eax",&DWP(16,"edi")); - &mov ("ebx",&DWP(20,"edi")); - &mov ("ecx",&DWP(24,"edi")); - &adc ("eax",0); - &mov ("edx",&DWP(28,"edi")); - &adc ("ebx",0); - &mov (&DWP(16,"edi"),"eax"); - &adc ("ecx","ebp"); - &mov (&DWP(20,"edi"),"ebx"); - &adc ("edx","esi"); - &mov (&DWP(24,"edi"),"ecx"); - &mov (&DWP(28,"edi"),"edx"); - - &ret (); -&function_end_B("_ecp_nistz256_sub"); - -######################################################################## -# void GFp_nistz256_neg(BN_ULONG edi[8],const BN_ULONG esi[8]); -&function_begin("GFp_nistz256_neg"); - &mov ("ebp",&wparam(1)); - &mov ("edi",&wparam(0)); - - &xor ("eax","eax"); - &stack_push(8); - &mov (&DWP(0,"esp"),"eax"); - &mov ("esi","esp"); - &mov (&DWP(4,"esp"),"eax"); - &mov (&DWP(8,"esp"),"eax"); - &mov (&DWP(12,"esp"),"eax"); - &mov (&DWP(16,"esp"),"eax"); - &mov (&DWP(20,"esp"),"eax"); - &mov (&DWP(24,"esp"),"eax"); - &mov (&DWP(28,"esp"),"eax"); - - &call ("_ecp_nistz256_sub"); - - &stack_pop(8); -&function_end("GFp_nistz256_neg"); - -&function_begin_B("_picup_eax"); - &mov ("eax",&DWP(0,"esp")); - &ret (); -&function_end_B("_picup_eax"); - -######################################################################## -# void GFp_nistz256_mul_mont(BN_ULONG edi[8],const BN_ULONG esi[8], -# const BN_ULONG ebp[8]); -&function_begin("GFp_nistz256_mul_mont"); - &mov ("esi",&wparam(1)); - &mov ("ebp",&wparam(2)); - if ($sse2) { - &call ("_picup_eax"); - &set_label("pic"); - &picmeup("eax","GFp_ia32cap_P","eax",&label("pic")); - &mov ("eax",&DWP(0,"eax")); } - &mov ("edi",&wparam(0)); - &call ("_ecp_nistz256_mul_mont"); -&function_end("GFp_nistz256_mul_mont"); - -&function_begin_B("_ecp_nistz256_mul_mont"); - if ($sse2) { - # We always use SSE2 - - ######################################## - # SSE2 code path featuring 32x16-bit - # multiplications is ~2x faster than - # IALU counterpart (except on Atom)... - ######################################## - # stack layout: - # +------------------------------------+< %esp - # | 7 16-byte temporary XMM words, | - # | "sliding" toward lower address | - # . . - # +------------------------------------+ - # | unused XMM word | - # +------------------------------------+< +128,%ebx - # | 8 16-byte XMM words holding copies | - # | of a[i]<<64|a[i] | - # . . - # . . - # +------------------------------------+< +256 - &mov ("edx","esp"); - &sub ("esp",0x100); - - &movd ("xmm7",&DWP(0,"ebp")); # b[0] -> 0000.00xy - &lea ("ebp",&DWP(4,"ebp")); - &pcmpeqd("xmm6","xmm6"); - &psrlq ("xmm6",48); # compose 0xffff<<64|0xffff - - &pshuflw("xmm7","xmm7",0b11011100); # 0000.00xy -> 0000.0x0y - &and ("esp",-64); - &pshufd ("xmm7","xmm7",0b11011100); # 0000.0x0y -> 000x.000y - &lea ("ebx",&DWP(0x80,"esp")); - - &movd ("xmm0",&DWP(4*0,"esi")); # a[0] -> 0000.00xy - &pshufd ("xmm0","xmm0",0b11001100); # 0000.00xy -> 00xy.00xy - &movd ("xmm1",&DWP(4*1,"esi")); # a[1] -> ... - &movdqa (&QWP(0x00,"ebx"),"xmm0"); # offload converted a[0] - &pmuludq("xmm0","xmm7"); # a[0]*b[0] - - &movd ("xmm2",&DWP(4*2,"esi")); - &pshufd ("xmm1","xmm1",0b11001100); - &movdqa (&QWP(0x10,"ebx"),"xmm1"); - &pmuludq("xmm1","xmm7"); # a[1]*b[0] - - &movq ("xmm4","xmm0"); # clear upper 64 bits - &pslldq("xmm4",6); - &paddq ("xmm4","xmm0"); - &movdqa("xmm5","xmm4"); - &psrldq("xmm4",10); # upper 32 bits of a[0]*b[0] - &pand ("xmm5","xmm6"); # lower 32 bits of a[0]*b[0] - - # Upper half of a[0]*b[i] is carried into next multiplication - # iteration, while lower one "participates" in actual reduction. - # Normally latter is done by accumulating result of multiplication - # of modulus by "magic" digit, but thanks to special form of modulus - # and "magic" digit it can be performed only with additions and - # subtractions (see note in IALU section below). Note that we are - # not bothered with carry bits, they are accumulated in "flatten" - # phase after all multiplications and reductions. - - &movd ("xmm3",&DWP(4*3,"esi")); - &pshufd ("xmm2","xmm2",0b11001100); - &movdqa (&QWP(0x20,"ebx"),"xmm2"); - &pmuludq("xmm2","xmm7"); # a[2]*b[0] - &paddq ("xmm1","xmm4"); # a[1]*b[0]+hw(a[0]*b[0]), carry - &movdqa (&QWP(0x00,"esp"),"xmm1"); # t[0] - - &movd ("xmm0",&DWP(4*4,"esi")); - &pshufd ("xmm3","xmm3",0b11001100); - &movdqa (&QWP(0x30,"ebx"),"xmm3"); - &pmuludq("xmm3","xmm7"); # a[3]*b[0] - &movdqa (&QWP(0x10,"esp"),"xmm2"); - - &movd ("xmm1",&DWP(4*5,"esi")); - &pshufd ("xmm0","xmm0",0b11001100); - &movdqa (&QWP(0x40,"ebx"),"xmm0"); - &pmuludq("xmm0","xmm7"); # a[4]*b[0] - &paddq ("xmm3","xmm5"); # a[3]*b[0]+lw(a[0]*b[0]), reduction step - &movdqa (&QWP(0x20,"esp"),"xmm3"); - - &movd ("xmm2",&DWP(4*6,"esi")); - &pshufd ("xmm1","xmm1",0b11001100); - &movdqa (&QWP(0x50,"ebx"),"xmm1"); - &pmuludq("xmm1","xmm7"); # a[5]*b[0] - &movdqa (&QWP(0x30,"esp"),"xmm0"); - &pshufd("xmm4","xmm5",0b10110001); # xmm4 = xmm5<<32, reduction step - - &movd ("xmm3",&DWP(4*7,"esi")); - &pshufd ("xmm2","xmm2",0b11001100); - &movdqa (&QWP(0x60,"ebx"),"xmm2"); - &pmuludq("xmm2","xmm7"); # a[6]*b[0] - &movdqa (&QWP(0x40,"esp"),"xmm1"); - &psubq ("xmm4","xmm5"); # xmm4 = xmm5*0xffffffff, reduction step - - &movd ("xmm0",&DWP(0,"ebp")); # b[1] -> 0000.00xy - &pshufd ("xmm3","xmm3",0b11001100); - &movdqa (&QWP(0x70,"ebx"),"xmm3"); - &pmuludq("xmm3","xmm7"); # a[7]*b[0] - - &pshuflw("xmm7","xmm0",0b11011100); # 0000.00xy -> 0000.0x0y - &movdqa ("xmm0",&QWP(0x00,"ebx")); # pre-load converted a[0] - &pshufd ("xmm7","xmm7",0b11011100); # 0000.0x0y -> 000x.000y - - &mov ("ecx",6); - &lea ("ebp",&DWP(4,"ebp")); - &jmp (&label("madd_sse2")); - -&set_label("madd_sse2",16); - &paddq ("xmm2","xmm5"); # a[6]*b[i-1]+lw(a[0]*b[i-1]), reduction step [modulo-scheduled] - &paddq ("xmm3","xmm4"); # a[7]*b[i-1]+lw(a[0]*b[i-1])*0xffffffff, reduction step [modulo-scheduled] - &movdqa ("xmm1",&QWP(0x10,"ebx")); - &pmuludq("xmm0","xmm7"); # a[0]*b[i] - &movdqa(&QWP(0x50,"esp"),"xmm2"); - - &movdqa ("xmm2",&QWP(0x20,"ebx")); - &pmuludq("xmm1","xmm7"); # a[1]*b[i] - &movdqa(&QWP(0x60,"esp"),"xmm3"); - &paddq ("xmm0",&QWP(0x00,"esp")); - - &movdqa ("xmm3",&QWP(0x30,"ebx")); - &pmuludq("xmm2","xmm7"); # a[2]*b[i] - &movq ("xmm4","xmm0"); # clear upper 64 bits - &pslldq("xmm4",6); - &paddq ("xmm1",&QWP(0x10,"esp")); - &paddq ("xmm4","xmm0"); - &movdqa("xmm5","xmm4"); - &psrldq("xmm4",10); # upper 33 bits of a[0]*b[i]+t[0] - - &movdqa ("xmm0",&QWP(0x40,"ebx")); - &pmuludq("xmm3","xmm7"); # a[3]*b[i] - &paddq ("xmm1","xmm4"); # a[1]*b[i]+hw(a[0]*b[i]), carry - &paddq ("xmm2",&QWP(0x20,"esp")); - &movdqa (&QWP(0x00,"esp"),"xmm1"); - - &movdqa ("xmm1",&QWP(0x50,"ebx")); - &pmuludq("xmm0","xmm7"); # a[4]*b[i] - &paddq ("xmm3",&QWP(0x30,"esp")); - &movdqa (&QWP(0x10,"esp"),"xmm2"); - &pand ("xmm5","xmm6"); # lower 32 bits of a[0]*b[i] - - &movdqa ("xmm2",&QWP(0x60,"ebx")); - &pmuludq("xmm1","xmm7"); # a[5]*b[i] - &paddq ("xmm3","xmm5"); # a[3]*b[i]+lw(a[0]*b[i]), reduction step - &paddq ("xmm0",&QWP(0x40,"esp")); - &movdqa (&QWP(0x20,"esp"),"xmm3"); - &pshufd("xmm4","xmm5",0b10110001); # xmm4 = xmm5<<32, reduction step - - &movdqa ("xmm3","xmm7"); - &pmuludq("xmm2","xmm7"); # a[6]*b[i] - &movd ("xmm7",&DWP(0,"ebp")); # b[i++] -> 0000.00xy - &lea ("ebp",&DWP(4,"ebp")); - &paddq ("xmm1",&QWP(0x50,"esp")); - &psubq ("xmm4","xmm5"); # xmm4 = xmm5*0xffffffff, reduction step - &movdqa (&QWP(0x30,"esp"),"xmm0"); - &pshuflw("xmm7","xmm7",0b11011100); # 0000.00xy -> 0000.0x0y - - &pmuludq("xmm3",&QWP(0x70,"ebx")); # a[7]*b[i] - &pshufd("xmm7","xmm7",0b11011100); # 0000.0x0y -> 000x.000y - &movdqa("xmm0",&QWP(0x00,"ebx")); # pre-load converted a[0] - &movdqa (&QWP(0x40,"esp"),"xmm1"); - &paddq ("xmm2",&QWP(0x60,"esp")); - - &dec ("ecx"); - &jnz (&label("madd_sse2")); - - &paddq ("xmm2","xmm5"); # a[6]*b[6]+lw(a[0]*b[6]), reduction step [modulo-scheduled] - &paddq ("xmm3","xmm4"); # a[7]*b[6]+lw(a[0]*b[6])*0xffffffff, reduction step [modulo-scheduled] - &movdqa ("xmm1",&QWP(0x10,"ebx")); - &pmuludq("xmm0","xmm7"); # a[0]*b[7] - &movdqa(&QWP(0x50,"esp"),"xmm2"); - - &movdqa ("xmm2",&QWP(0x20,"ebx")); - &pmuludq("xmm1","xmm7"); # a[1]*b[7] - &movdqa(&QWP(0x60,"esp"),"xmm3"); - &paddq ("xmm0",&QWP(0x00,"esp")); - - &movdqa ("xmm3",&QWP(0x30,"ebx")); - &pmuludq("xmm2","xmm7"); # a[2]*b[7] - &movq ("xmm4","xmm0"); # clear upper 64 bits - &pslldq("xmm4",6); - &paddq ("xmm1",&QWP(0x10,"esp")); - &paddq ("xmm4","xmm0"); - &movdqa("xmm5","xmm4"); - &psrldq("xmm4",10); # upper 33 bits of a[0]*b[i]+t[0] - - &movdqa ("xmm0",&QWP(0x40,"ebx")); - &pmuludq("xmm3","xmm7"); # a[3]*b[7] - &paddq ("xmm1","xmm4"); # a[1]*b[7]+hw(a[0]*b[7]), carry - &paddq ("xmm2",&QWP(0x20,"esp")); - &movdqa (&QWP(0x00,"esp"),"xmm1"); - - &movdqa ("xmm1",&QWP(0x50,"ebx")); - &pmuludq("xmm0","xmm7"); # a[4]*b[7] - &paddq ("xmm3",&QWP(0x30,"esp")); - &movdqa (&QWP(0x10,"esp"),"xmm2"); - &pand ("xmm5","xmm6"); # lower 32 bits of a[0]*b[i] - - &movdqa ("xmm2",&QWP(0x60,"ebx")); - &pmuludq("xmm1","xmm7"); # a[5]*b[7] - &paddq ("xmm3","xmm5"); # reduction step - &paddq ("xmm0",&QWP(0x40,"esp")); - &movdqa (&QWP(0x20,"esp"),"xmm3"); - &pshufd("xmm4","xmm5",0b10110001); # xmm4 = xmm5<<32, reduction step - - &movdqa ("xmm3",&QWP(0x70,"ebx")); - &pmuludq("xmm2","xmm7"); # a[6]*b[7] - &paddq ("xmm1",&QWP(0x50,"esp")); - &psubq ("xmm4","xmm5"); # xmm4 = xmm5*0xffffffff, reduction step - &movdqa (&QWP(0x30,"esp"),"xmm0"); - - &pmuludq("xmm3","xmm7"); # a[7]*b[7] - &pcmpeqd("xmm7","xmm7"); - &movdqa ("xmm0",&QWP(0x00,"esp")); - &pslldq ("xmm7",8); - &movdqa (&QWP(0x40,"esp"),"xmm1"); - &paddq ("xmm2",&QWP(0x60,"esp")); - - &paddq ("xmm2","xmm5"); # a[6]*b[7]+lw(a[0]*b[7]), reduction step - &paddq ("xmm3","xmm4"); # a[6]*b[7]+lw(a[0]*b[7])*0xffffffff, reduction step - &movdqa(&QWP(0x50,"esp"),"xmm2"); - &movdqa(&QWP(0x60,"esp"),"xmm3"); - - &movdqa ("xmm1",&QWP(0x10,"esp")); - &movdqa ("xmm2",&QWP(0x20,"esp")); - &movdqa ("xmm3",&QWP(0x30,"esp")); - - &movq ("xmm4","xmm0"); # "flatten" - &pand ("xmm0","xmm7"); - &xor ("ebp","ebp"); - &pslldq ("xmm4",6); - &movq ("xmm5","xmm1"); - &paddq ("xmm0","xmm4"); - &pand ("xmm1","xmm7"); - &psrldq ("xmm0",6); - &movd ("eax","xmm0"); - &psrldq ("xmm0",4); - - &paddq ("xmm5","xmm0"); - &movdqa ("xmm0",&QWP(0x40,"esp")); - &sub ("eax",-1); # start subtracting modulus, - # this is used to determine - # if result is larger/smaller - # than modulus (see below) - &pslldq ("xmm5",6); - &movq ("xmm4","xmm2"); - &paddq ("xmm1","xmm5"); - &pand ("xmm2","xmm7"); - &psrldq ("xmm1",6); - &mov (&DWP(4*0,"edi"),"eax"); - &movd ("eax","xmm1"); - &psrldq ("xmm1",4); - - &paddq ("xmm4","xmm1"); - &movdqa ("xmm1",&QWP(0x50,"esp")); - &sbb ("eax",-1); - &pslldq ("xmm4",6); - &movq ("xmm5","xmm3"); - &paddq ("xmm2","xmm4"); - &pand ("xmm3","xmm7"); - &psrldq ("xmm2",6); - &mov (&DWP(4*1,"edi"),"eax"); - &movd ("eax","xmm2"); - &psrldq ("xmm2",4); - - &paddq ("xmm5","xmm2"); - &movdqa ("xmm2",&QWP(0x60,"esp")); - &sbb ("eax",-1); - &pslldq ("xmm5",6); - &movq ("xmm4","xmm0"); - &paddq ("xmm3","xmm5"); - &pand ("xmm0","xmm7"); - &psrldq ("xmm3",6); - &mov (&DWP(4*2,"edi"),"eax"); - &movd ("eax","xmm3"); - &psrldq ("xmm3",4); - - &paddq ("xmm4","xmm3"); - &sbb ("eax",0); - &pslldq ("xmm4",6); - &movq ("xmm5","xmm1"); - &paddq ("xmm0","xmm4"); - &pand ("xmm1","xmm7"); - &psrldq ("xmm0",6); - &mov (&DWP(4*3,"edi"),"eax"); - &movd ("eax","xmm0"); - &psrldq ("xmm0",4); - - &paddq ("xmm5","xmm0"); - &sbb ("eax",0); - &pslldq ("xmm5",6); - &movq ("xmm4","xmm2"); - &paddq ("xmm1","xmm5"); - &pand ("xmm2","xmm7"); - &psrldq ("xmm1",6); - &movd ("ebx","xmm1"); - &psrldq ("xmm1",4); - &mov ("esp","edx"); - - &paddq ("xmm4","xmm1"); - &pslldq ("xmm4",6); - &paddq ("xmm2","xmm4"); - &psrldq ("xmm2",6); - &movd ("ecx","xmm2"); - &psrldq ("xmm2",4); - &sbb ("ebx",0); - &movd ("edx","xmm2"); - &pextrw ("esi","xmm2",2); # top-most overflow bit - &sbb ("ecx",1); - &sbb ("edx",-1); - &sbb ("esi",0); # borrow from subtraction - - # Final step is "if result > mod, subtract mod", and at this point - # we have result - mod written to output buffer, as well as borrow - # bit from this subtraction, and if borrow bit is set, we add - # modulus back. - # - # Note that because mod has special form, i.e. consists of - # 0xffffffff, 1 and 0s, we can conditionally synthesize it by - # assigning borrow bit to one register, %ebp, and its negative - # to another, %esi. But we started by calculating %esi... - - &sub ("ebp","esi"); - &add (&DWP(4*0,"edi"),"esi"); # add modulus or zero - &adc (&DWP(4*1,"edi"),"esi"); - &adc (&DWP(4*2,"edi"),"esi"); - &adc (&DWP(4*3,"edi"),0); - &adc ("eax",0); - &adc ("ebx",0); - &mov (&DWP(4*4,"edi"),"eax"); - &adc ("ecx","ebp"); - &mov (&DWP(4*5,"edi"),"ebx"); - &adc ("edx","esi"); - &mov (&DWP(4*6,"edi"),"ecx"); - &mov (&DWP(4*7,"edi"),"edx"); - - &ret (); - -} # Non-SSE2 code removed. - -&function_end_B("_ecp_nistz256_mul_mont"); - -######################################################################## -# following subroutines are "literal" implementation of those found in -# ecp_nistz256.c -# -######################################################################## -# void GFp_nistz256_point_double(P256_POINT *out,const P256_POINT *inp); -# -&static_label("point_double_shortcut"); -&function_begin("GFp_nistz256_point_double"); -{ my ($S,$M,$Zsqr,$in_x,$tmp0)=map(32*$_,(0..4)); - - &mov ("esi",&wparam(1)); - - # above map() describes stack layout with 5 temporary - # 256-bit vectors on top, then we take extra word for - # GFp_ia32cap_P copy. - &stack_push(8*5+1); - if ($sse2) { - &call ("_picup_eax"); - &set_label("pic"); - &picmeup("edx","GFp_ia32cap_P","eax",&label("pic")); - &mov ("ebp",&DWP(0,"edx")); } - -&set_label("point_double_shortcut"); - &mov ("eax",&DWP(0,"esi")); # copy in_x - &mov ("ebx",&DWP(4,"esi")); - &mov ("ecx",&DWP(8,"esi")); - &mov ("edx",&DWP(12,"esi")); - &mov (&DWP($in_x+0,"esp"),"eax"); - &mov (&DWP($in_x+4,"esp"),"ebx"); - &mov (&DWP($in_x+8,"esp"),"ecx"); - &mov (&DWP($in_x+12,"esp"),"edx"); - &mov ("eax",&DWP(16,"esi")); - &mov ("ebx",&DWP(20,"esi")); - &mov ("ecx",&DWP(24,"esi")); - &mov ("edx",&DWP(28,"esi")); - &mov (&DWP($in_x+16,"esp"),"eax"); - &mov (&DWP($in_x+20,"esp"),"ebx"); - &mov (&DWP($in_x+24,"esp"),"ecx"); - &mov (&DWP($in_x+28,"esp"),"edx"); - &mov (&DWP(32*5,"esp"),"ebp"); # GFp_ia32cap_P copy - - &lea ("ebp",&DWP(32,"esi")); - &lea ("esi",&DWP(32,"esi")); - &lea ("edi",&DWP($S,"esp")); - &call ("_ecp_nistz256_add"); # p256_mul_by_2(S, in_y); - - &mov ("eax",&DWP(32*5,"esp")); # GFp_ia32cap_P copy - &mov ("esi",64); - &add ("esi",&wparam(1)); - &lea ("edi",&DWP($Zsqr,"esp")); - &mov ("ebp","esi"); - &call ("_ecp_nistz256_mul_mont"); # p256_sqr_mont(Zsqr, in_z); - - &mov ("eax",&DWP(32*5,"esp")); # GFp_ia32cap_P copy - &lea ("esi",&DWP($S,"esp")); - &lea ("ebp",&DWP($S,"esp")); - &lea ("edi",&DWP($S,"esp")); - &call ("_ecp_nistz256_mul_mont"); # p256_sqr_mont(S, S); - - &mov ("eax",&DWP(32*5,"esp")); # GFp_ia32cap_P copy - &mov ("ebp",&wparam(1)); - &lea ("esi",&DWP(32,"ebp")); - &lea ("ebp",&DWP(64,"ebp")); - &lea ("edi",&DWP($tmp0,"esp")); - &call ("_ecp_nistz256_mul_mont"); # p256_mul_mont(tmp0, in_z, in_y); - - &lea ("esi",&DWP($in_x,"esp")); - &lea ("ebp",&DWP($Zsqr,"esp")); - &lea ("edi",&DWP($M,"esp")); - &call ("_ecp_nistz256_add"); # p256_add(M, in_x, Zsqr); - - &mov ("edi",64); - &lea ("esi",&DWP($tmp0,"esp")); - &lea ("ebp",&DWP($tmp0,"esp")); - &add ("edi",&wparam(0)); - &call ("_ecp_nistz256_add"); # p256_mul_by_2(res_z, tmp0); - - &lea ("esi",&DWP($in_x,"esp")); - &lea ("ebp",&DWP($Zsqr,"esp")); - &lea ("edi",&DWP($Zsqr,"esp")); - &call ("_ecp_nistz256_sub"); # p256_sub(Zsqr, in_x, Zsqr); - - &mov ("eax",&DWP(32*5,"esp")); # GFp_ia32cap_P copy - &lea ("esi",&DWP($S,"esp")); - &lea ("ebp",&DWP($S,"esp")); - &lea ("edi",&DWP($tmp0,"esp")); - &call ("_ecp_nistz256_mul_mont"); # p256_sqr_mont(tmp0, S); - - &mov ("eax",&DWP(32*5,"esp")); # GFp_ia32cap_P copy - &lea ("esi",&DWP($M,"esp")); - &lea ("ebp",&DWP($Zsqr,"esp")); - &lea ("edi",&DWP($M,"esp")); - &call ("_ecp_nistz256_mul_mont"); # p256_mul_mont(M, M, Zsqr); - - &mov ("edi",32); - &lea ("esi",&DWP($tmp0,"esp")); - &add ("edi",&wparam(0)); - &call ("_ecp_nistz256_div_by_2"); # p256_div_by_2(res_y, tmp0); - - &lea ("esi",&DWP($M,"esp")); - &lea ("ebp",&DWP($M,"esp")); - &lea ("edi",&DWP($tmp0,"esp")); - &call ("_ecp_nistz256_add"); # 1/2 p256_mul_by_3(M, M); - - &mov ("eax",&DWP(32*5,"esp")); # GFp_ia32cap_P copy - &lea ("esi",&DWP($in_x,"esp")); - &lea ("ebp",&DWP($S,"esp")); - &lea ("edi",&DWP($S,"esp")); - &call ("_ecp_nistz256_mul_mont"); # p256_mul_mont(S, S, in_x); - - &lea ("esi",&DWP($tmp0,"esp")); - &lea ("ebp",&DWP($M,"esp")); - &lea ("edi",&DWP($M,"esp")); - &call ("_ecp_nistz256_add"); # 2/2 p256_mul_by_3(M, M); - - &lea ("esi",&DWP($S,"esp")); - &lea ("ebp",&DWP($S,"esp")); - &lea ("edi",&DWP($tmp0,"esp")); - &call ("_ecp_nistz256_add"); # p256_mul_by_2(tmp0, S); - - &mov ("eax",&DWP(32*5,"esp")); # GFp_ia32cap_P copy - &lea ("esi",&DWP($M,"esp")); - &lea ("ebp",&DWP($M,"esp")); - &mov ("edi",&wparam(0)); - &call ("_ecp_nistz256_mul_mont"); # p256_sqr_mont(res_x, M); - - &mov ("esi","edi"); # %edi is still res_x here - &lea ("ebp",&DWP($tmp0,"esp")); - &call ("_ecp_nistz256_sub"); # p256_sub(res_x, res_x, tmp0); - - &lea ("esi",&DWP($S,"esp")); - &mov ("ebp","edi"); # %edi is still res_x - &lea ("edi",&DWP($S,"esp")); - &call ("_ecp_nistz256_sub"); # p256_sub(S, S, res_x); - - &mov ("eax",&DWP(32*5,"esp")); # GFp_ia32cap_P copy - &mov ("esi","edi"); # %edi is still &S - &lea ("ebp",&DWP($M,"esp")); - &call ("_ecp_nistz256_mul_mont"); # p256_mul_mont(S, S, M); - - &mov ("ebp",32); - &lea ("esi",&DWP($S,"esp")); - &add ("ebp",&wparam(0)); - &mov ("edi","ebp"); - &call ("_ecp_nistz256_sub"); # p256_sub(res_y, S, res_y); - - &stack_pop(8*5+1); -} &function_end("GFp_nistz256_point_double"); - -######################################################################## -# void GFp_nistz256_point_add_affine(P256_POINT *out, -# const P256_POINT *in1, -# const P256_POINT_AFFINE *in2); -&function_begin("GFp_nistz256_point_add_affine"); -{ - my ($res_x,$res_y,$res_z, - $in1_x,$in1_y,$in1_z, - $in2_x,$in2_y, - $U2,$S2,$H,$R,$Hsqr,$Hcub,$Rsqr)=map(32*$_,(0..14)); - my $Z1sqr = $S2; - my @ONE_mont=(1,0,0,-1,-1,-1,-2,0); - - &mov ("esi",&wparam(1)); - - # above map() describes stack layout with 15 temporary - # 256-bit vectors on top, then we take extra words for - # !in1infty, !in2infty, and GFp_ia32cap_P copy. - &stack_push(8*15+3); - if ($sse2) { - &call ("_picup_eax"); - &set_label("pic"); - &picmeup("edx","GFp_ia32cap_P","eax",&label("pic")); - &mov ("ebp",&DWP(0,"edx")); } - - &lea ("edi",&DWP($in1_x,"esp")); - for($i=0;$i<96;$i+=16) { - &mov ("eax",&DWP($i+0,"esi")); # copy in1 - &mov ("ebx",&DWP($i+4,"esi")); - &mov ("ecx",&DWP($i+8,"esi")); - &mov ("edx",&DWP($i+12,"esi")); - &mov (&DWP($i+0,"edi"),"eax"); - &mov (&DWP(32*15+8,"esp"),"ebp") if ($i==0); - &mov ("ebp","eax") if ($i==64); - &or ("ebp","eax") if ($i>64); - &mov (&DWP($i+4,"edi"),"ebx"); - &or ("ebp","ebx") if ($i>=64); - &mov (&DWP($i+8,"edi"),"ecx"); - &or ("ebp","ecx") if ($i>=64); - &mov (&DWP($i+12,"edi"),"edx"); - &or ("ebp","edx") if ($i>=64); - } - &xor ("eax","eax"); - &mov ("esi",&wparam(2)); - &sub ("eax","ebp"); - &or ("ebp","eax"); - &sar ("ebp",31); - &mov (&DWP(32*15+0,"esp"),"ebp"); # !in1infty - - &lea ("edi",&DWP($in2_x,"esp")); - for($i=0;$i<64;$i+=16) { - &mov ("eax",&DWP($i+0,"esi")); # copy in2 - &mov ("ebx",&DWP($i+4,"esi")); - &mov ("ecx",&DWP($i+8,"esi")); - &mov ("edx",&DWP($i+12,"esi")); - &mov (&DWP($i+0,"edi"),"eax"); - &mov ("ebp","eax") if ($i==0); - &or ("ebp","eax") if ($i!=0); - &mov (&DWP($i+4,"edi"),"ebx"); - &or ("ebp","ebx"); - &mov (&DWP($i+8,"edi"),"ecx"); - &or ("ebp","ecx"); - &mov (&DWP($i+12,"edi"),"edx"); - &or ("ebp","edx"); - } - &xor ("ebx","ebx"); - &mov ("eax",&DWP(32*15+8,"esp")); # GFp_ia32cap_P copy - &sub ("ebx","ebp"); - &lea ("esi",&DWP($in1_z,"esp")); - &or ("ebx","ebp"); - &lea ("ebp",&DWP($in1_z,"esp")); - &sar ("ebx",31); - &lea ("edi",&DWP($Z1sqr,"esp")); - &mov (&DWP(32*15+4,"esp"),"ebx"); # !in2infty - - &call ("_ecp_nistz256_mul_mont"); # p256_sqr_mont(Z1sqr, in1_z); - - &mov ("eax",&DWP(32*15+8,"esp")); # GFp_ia32cap_P copy - &lea ("esi",&DWP($in2_x,"esp")); - &mov ("ebp","edi"); # %esi is stull &Z1sqr - &lea ("edi",&DWP($U2,"esp")); - &call ("_ecp_nistz256_mul_mont"); # p256_mul_mont(U2, Z1sqr, in2_x); - - &mov ("eax",&DWP(32*15+8,"esp")); # GFp_ia32cap_P copy - &lea ("esi",&DWP($in1_z,"esp")); - &lea ("ebp",&DWP($Z1sqr,"esp")); - &lea ("edi",&DWP($S2,"esp")); - &call ("_ecp_nistz256_mul_mont"); # p256_mul_mont(S2, Z1sqr, in1_z); - - &lea ("esi",&DWP($U2,"esp")); - &lea ("ebp",&DWP($in1_x,"esp")); - &lea ("edi",&DWP($H,"esp")); - &call ("_ecp_nistz256_sub"); # p256_sub(H, U2, in1_x); - - &mov ("eax",&DWP(32*15+8,"esp")); # GFp_ia32cap_P copy - &lea ("esi",&DWP($in2_y,"esp")); - &lea ("ebp",&DWP($S2,"esp")); - &lea ("edi",&DWP($S2,"esp")); - &call ("_ecp_nistz256_mul_mont"); # p256_mul_mont(S2, S2, in2_y); - - &mov ("eax",&DWP(32*15+8,"esp")); # GFp_ia32cap_P copy - &lea ("esi",&DWP($in1_z,"esp")); - &lea ("ebp",&DWP($H,"esp")); - &lea ("edi",&DWP($res_z,"esp")); - &call ("_ecp_nistz256_mul_mont"); # p256_mul_mont(res_z, H, in1_z); - - &lea ("esi",&DWP($S2,"esp")); - &lea ("ebp",&DWP($in1_y,"esp")); - &lea ("edi",&DWP($R,"esp")); - &call ("_ecp_nistz256_sub"); # p256_sub(R, S2, in1_y); - - &mov ("eax",&DWP(32*15+8,"esp")); # GFp_ia32cap_P copy - &lea ("esi",&DWP($H,"esp")); - &lea ("ebp",&DWP($H,"esp")); - &lea ("edi",&DWP($Hsqr,"esp")); - &call ("_ecp_nistz256_mul_mont"); # p256_sqr_mont(Hsqr, H); - - &mov ("eax",&DWP(32*15+8,"esp")); # GFp_ia32cap_P copy - &lea ("esi",&DWP($R,"esp")); - &lea ("ebp",&DWP($R,"esp")); - &lea ("edi",&DWP($Rsqr,"esp")); - &call ("_ecp_nistz256_mul_mont"); # p256_sqr_mont(Rsqr, R); - - &mov ("eax",&DWP(32*15+8,"esp")); # GFp_ia32cap_P copy - &lea ("esi",&DWP($in1_x,"esp")); - &lea ("ebp",&DWP($Hsqr,"esp")); - &lea ("edi",&DWP($U2,"esp")); - &call ("_ecp_nistz256_mul_mont"); # p256_mul_mont(U2, in1_x, Hsqr); - - &mov ("eax",&DWP(32*15+8,"esp")); # GFp_ia32cap_P copy - &lea ("esi",&DWP($H,"esp")); - &lea ("ebp",&DWP($Hsqr,"esp")); - &lea ("edi",&DWP($Hcub,"esp")); - &call ("_ecp_nistz256_mul_mont"); # p256_mul_mont(Hcub, Hsqr, H); - - &lea ("esi",&DWP($U2,"esp")); - &lea ("ebp",&DWP($U2,"esp")); - &lea ("edi",&DWP($Hsqr,"esp")); - &call ("_ecp_nistz256_add"); # p256_mul_by_2(Hsqr, U2); - - &lea ("esi",&DWP($Rsqr,"esp")); - &lea ("ebp",&DWP($Hsqr,"esp")); - &lea ("edi",&DWP($res_x,"esp")); - &call ("_ecp_nistz256_sub"); # p256_sub(res_x, Rsqr, Hsqr); - - &lea ("esi",&DWP($res_x,"esp")); - &lea ("ebp",&DWP($Hcub,"esp")); - &lea ("edi",&DWP($res_x,"esp")); - &call ("_ecp_nistz256_sub"); # p256_sub(res_x, res_x, Hcub); - - &lea ("esi",&DWP($U2,"esp")); - &lea ("ebp",&DWP($res_x,"esp")); - &lea ("edi",&DWP($res_y,"esp")); - &call ("_ecp_nistz256_sub"); # p256_sub(res_y, U2, res_x); - - &mov ("eax",&DWP(32*15+8,"esp")); # GFp_ia32cap_P copy - &lea ("esi",&DWP($Hcub,"esp")); - &lea ("ebp",&DWP($in1_y,"esp")); - &lea ("edi",&DWP($S2,"esp")); - &call ("_ecp_nistz256_mul_mont"); # p256_mul_mont(S2, Hcub, in1_y); - - &mov ("eax",&DWP(32*15+8,"esp")); # GFp_ia32cap_P copy - &lea ("esi",&DWP($R,"esp")); - &lea ("ebp",&DWP($res_y,"esp")); - &lea ("edi",&DWP($res_y,"esp")); - &call ("_ecp_nistz256_mul_mont"); # p256_mul_mont(res_y, res_y, R); - - &lea ("esi",&DWP($res_y,"esp")); - &lea ("ebp",&DWP($S2,"esp")); - &lea ("edi",&DWP($res_y,"esp")); - &call ("_ecp_nistz256_sub"); # p256_sub(res_y, res_y, S2); - - &mov ("ebp",&DWP(32*15+0,"esp")); # !in1infty - &mov ("esi",&DWP(32*15+4,"esp")); # !in2infty - &mov ("edi",&wparam(0)); - &mov ("edx","ebp"); - ¬ ("ebp"); - &and ("edx","esi"); - &and ("ebp","esi"); - ¬ ("esi"); - - ######################################## - # conditional moves - for($i=64;$i<96;$i+=4) { - my $one=@ONE_mont[($i-64)/4]; - - &mov ("eax","edx"); - &and ("eax",&DWP($res_x+$i,"esp")); - &mov ("ebx","ebp") if ($one && $one!=-1); - &and ("ebx",$one) if ($one && $one!=-1); - &mov ("ecx","esi"); - &and ("ecx",&DWP($in1_x+$i,"esp")); - &or ("eax",$one==-1?"ebp":"ebx") if ($one); - &or ("eax","ecx"); - &mov (&DWP($i,"edi"),"eax"); - } - for($i=0;$i<64;$i+=4) { - &mov ("eax","edx"); - &and ("eax",&DWP($res_x+$i,"esp")); - &mov ("ebx","ebp"); - &and ("ebx",&DWP($in2_x+$i,"esp")); - &mov ("ecx","esi"); - &and ("ecx",&DWP($in1_x+$i,"esp")); - &or ("eax","ebx"); - &or ("eax","ecx"); - &mov (&DWP($i,"edi"),"eax"); - } - &stack_pop(8*15+3); -} &function_end("GFp_nistz256_point_add_affine"); - -&asm_finish(); - -close STDOUT or die "error closing STDOUT"; diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/ec/asm/p256-x86_64-asm.pl temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/ec/asm/p256-x86_64-asm.pl --- temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/ec/asm/p256-x86_64-asm.pl 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/ec/asm/p256-x86_64-asm.pl 1970-01-01 00:00:00.000000000 +0000 @@ -1,4202 +0,0 @@ -#! /usr/bin/env perl -# Copyright 2014-2016 The OpenSSL Project Authors. All Rights Reserved. -# Copyright (c) 2014, Intel Corporation. All Rights Reserved. -# Copyright (c) 2015 CloudFlare, Inc. -# -# Licensed under the OpenSSL license (the "License"). You may not use -# this file except in compliance with the License. You can obtain a copy -# in the file LICENSE in the source distribution or at -# https://www.openssl.org/source/license.html -# -# Originally written by Shay Gueron (1, 2), and Vlad Krasnov (1, 3) -# (1) Intel Corporation, Israel Development Center, Haifa, Israel -# (2) University of Haifa, Israel -# (3) CloudFlare, Inc. -# -# Reference: -# S.Gueron and V.Krasnov, "Fast Prime Field Elliptic Curve Cryptography with -# 256 Bit Primes" - -# Further optimization by : -# -# this/original with/without -DECP_NISTZ256_ASM(*) -# Opteron +15-49% +150-195% -# Bulldozer +18-45% +175-240% -# P4 +24-46% +100-150% -# Westmere +18-34% +87-160% -# Sandy Bridge +14-35% +120-185% -# Ivy Bridge +11-35% +125-180% -# Haswell +10-37% +160-200% -# Broadwell +24-58% +210-270% -# Atom +20-50% +180-240% -# VIA Nano +50-160% +480-480% -# -# (*) "without -DECP_NISTZ256_ASM" refers to build with -# "enable-ec_nistp_64_gcc_128"; -# -# Ranges denote minimum and maximum improvement coefficients depending -# on benchmark. In "this/original" column lower coefficient is for -# ECDSA sign, while in "with/without" - for ECDH key agreement, and -# higher - for ECDSA sign, relatively fastest server-side operation. -# Keep in mind that +100% means 2x improvement. - -$flavour = shift; -$output = shift; -if ($flavour =~ /\./) { $output = $flavour; undef $flavour; } - -$win64=0; $win64=1 if ($flavour =~ /[nm]asm|mingw64/ || $output =~ /\.asm$/); - -$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; -( $xlate="${dir}x86_64-xlate.pl" and -f $xlate ) or -( $xlate="${dir}../../../perlasm/x86_64-xlate.pl" and -f $xlate) or -die "can't locate x86_64-xlate.pl"; - -open OUT,"| \"$^X\" \"$xlate\" $flavour \"$output\""; -*STDOUT=*OUT; - -$avx = 2; -$addx = 1; - -$code.=<<___; -.text -.extern GFp_ia32cap_P - -# The polynomial -.align 64 -.Lpoly: -.quad 0xffffffffffffffff, 0x00000000ffffffff, 0x0000000000000000, 0xffffffff00000001 - -.LOne: -.long 1,1,1,1,1,1,1,1 -.LTwo: -.long 2,2,2,2,2,2,2,2 -.LThree: -.long 3,3,3,3,3,3,3,3 -.LONE_mont: -.quad 0x0000000000000001, 0xffffffff00000000, 0xffffffffffffffff, 0x00000000fffffffe - -# Constants for computations modulo ord(p256) -.Lord: -.quad 0xf3b9cac2fc632551, 0xbce6faada7179e84, 0xffffffffffffffff, 0xffffffff00000000 -.LordK: -.quad 0xccd1c8aaee00bc4f -___ - -{ -my ($a0,$a1,$a2,$a3)=map("%r$_",(8..11)); -my ($t0,$t1,$t2,$t3,$t4)=("%rax","%rdx","%rcx","%r12","%r13"); -my ($r_ptr,$a_ptr,$b_ptr)=("%rdi","%rsi","%rdx"); - -$code.=<<___; - -################################################################################ -# void GFp_nistz256_add(uint64_t res[4], uint64_t a[4], uint64_t b[4]); -.globl GFp_nistz256_add -.type GFp_nistz256_add,\@function,3 -.align 32 -GFp_nistz256_add: - push %r12 - push %r13 - - mov 8*0($a_ptr), $a0 - xor $t4, $t4 - mov 8*1($a_ptr), $a1 - mov 8*2($a_ptr), $a2 - mov 8*3($a_ptr), $a3 - lea .Lpoly(%rip), $a_ptr - - add 8*0($b_ptr), $a0 - adc 8*1($b_ptr), $a1 - mov $a0, $t0 - adc 8*2($b_ptr), $a2 - adc 8*3($b_ptr), $a3 - mov $a1, $t1 - adc \$0, $t4 - - sub 8*0($a_ptr), $a0 - mov $a2, $t2 - sbb 8*1($a_ptr), $a1 - sbb 8*2($a_ptr), $a2 - mov $a3, $t3 - sbb 8*3($a_ptr), $a3 - sbb \$0, $t4 - - cmovc $t0, $a0 - cmovc $t1, $a1 - mov $a0, 8*0($r_ptr) - cmovc $t2, $a2 - mov $a1, 8*1($r_ptr) - cmovc $t3, $a3 - mov $a2, 8*2($r_ptr) - mov $a3, 8*3($r_ptr) - - pop %r13 - pop %r12 - ret -.size GFp_nistz256_add,.-GFp_nistz256_add - -################################################################################ -# void GFp_nistz256_neg(uint64_t res[4], uint64_t a[4]); -.globl GFp_nistz256_neg -.type GFp_nistz256_neg,\@function,2 -.align 32 -GFp_nistz256_neg: -.cfi_startproc - push %r12 -.cfi_push %r12 - push %r13 -.cfi_push %r13 -.Lneg_body: - - xor $a0, $a0 - xor $a1, $a1 - xor $a2, $a2 - xor $a3, $a3 - xor $t4, $t4 - - sub 8*0($a_ptr), $a0 - sbb 8*1($a_ptr), $a1 - sbb 8*2($a_ptr), $a2 - mov $a0, $t0 - sbb 8*3($a_ptr), $a3 - lea .Lpoly(%rip), $a_ptr - mov $a1, $t1 - sbb \$0, $t4 - - add 8*0($a_ptr), $a0 - mov $a2, $t2 - adc 8*1($a_ptr), $a1 - adc 8*2($a_ptr), $a2 - mov $a3, $t3 - adc 8*3($a_ptr), $a3 - test $t4, $t4 - - cmovz $t0, $a0 - cmovz $t1, $a1 - mov $a0, 8*0($r_ptr) - cmovz $t2, $a2 - mov $a1, 8*1($r_ptr) - cmovz $t3, $a3 - mov $a2, 8*2($r_ptr) - mov $a3, 8*3($r_ptr) - - mov 0(%rsp),%r13 -.cfi_restore %r13 - mov 8(%rsp),%r12 -.cfi_restore %r12 - lea 16(%rsp),%rsp -.cfi_adjust_cfa_offset -16 -.Lneg_epilogue: - ret -.cfi_endproc -.size GFp_nistz256_neg,.-GFp_nistz256_neg -___ -} -{ -my ($r_ptr,$a_ptr,$b_org,$b_ptr)=("%rdi","%rsi","%rdx","%rbx"); -my ($acc0,$acc1,$acc2,$acc3,$acc4,$acc5,$acc6,$acc7)=map("%r$_",(8..15)); -my ($t0,$t1,$t2,$t3,$t4)=("%rcx","%rbp","%rbx","%rdx","%rax"); -my ($poly1,$poly3)=($acc6,$acc7); - -$code.=<<___; -################################################################################ -# void GFp_p256_scalar_mul_mont( -# uint64_t res[4], -# uint64_t a[4], -# uint64_t b[4]); - -.globl GFp_p256_scalar_mul_mont -.type GFp_p256_scalar_mul_mont,\@function,3 -.align 32 -GFp_p256_scalar_mul_mont: -.cfi_startproc -___ -$code.=<<___ if ($addx); - leaq GFp_ia32cap_P(%rip), %rcx - mov 8(%rcx), %rcx - and \$0x80100, %ecx - cmp \$0x80100, %ecx - je .Lecp_nistz256_ord_mul_montx -___ -$code.=<<___; - push %rbp -.cfi_push %rbp - push %rbx -.cfi_push %rbx - push %r12 -.cfi_push %r12 - push %r13 -.cfi_push %r13 - push %r14 -.cfi_push %r14 - push %r15 -.cfi_push %r15 -.Lord_mul_body: - - mov 8*0($b_org), %rax - mov $b_org, $b_ptr - lea .Lord(%rip), %r14 - mov .LordK(%rip), %r15 - - ################################# * b[0] - mov %rax, $t0 - mulq 8*0($a_ptr) - mov %rax, $acc0 - mov $t0, %rax - mov %rdx, $acc1 - - mulq 8*1($a_ptr) - add %rax, $acc1 - mov $t0, %rax - adc \$0, %rdx - mov %rdx, $acc2 - - mulq 8*2($a_ptr) - add %rax, $acc2 - mov $t0, %rax - adc \$0, %rdx - - mov $acc0, $acc5 - imulq %r15,$acc0 - - mov %rdx, $acc3 - mulq 8*3($a_ptr) - add %rax, $acc3 - mov $acc0, %rax - adc \$0, %rdx - mov %rdx, $acc4 - - ################################# First reduction step - mulq 8*0(%r14) - mov $acc0, $t1 - add %rax, $acc5 # guaranteed to be zero - mov $acc0, %rax - adc \$0, %rdx - mov %rdx, $t0 - - sub $acc0, $acc2 - sbb \$0, $acc0 # can't borrow - - mulq 8*1(%r14) - add $t0, $acc1 - adc \$0, %rdx - add %rax, $acc1 - mov $t1, %rax - adc %rdx, $acc2 - mov $t1, %rdx - adc \$0, $acc0 # can't overflow - - shl \$32, %rax - shr \$32, %rdx - sub %rax, $acc3 - mov 8*1($b_ptr), %rax - sbb %rdx, $t1 # can't borrow - - add $acc0, $acc3 - adc $t1, $acc4 - adc \$0, $acc5 - - ################################# * b[1] - mov %rax, $t0 - mulq 8*0($a_ptr) - add %rax, $acc1 - mov $t0, %rax - adc \$0, %rdx - mov %rdx, $t1 - - mulq 8*1($a_ptr) - add $t1, $acc2 - adc \$0, %rdx - add %rax, $acc2 - mov $t0, %rax - adc \$0, %rdx - mov %rdx, $t1 - - mulq 8*2($a_ptr) - add $t1, $acc3 - adc \$0, %rdx - add %rax, $acc3 - mov $t0, %rax - adc \$0, %rdx - - mov $acc1, $t0 - imulq %r15, $acc1 - - mov %rdx, $t1 - mulq 8*3($a_ptr) - add $t1, $acc4 - adc \$0, %rdx - xor $acc0, $acc0 - add %rax, $acc4 - mov $acc1, %rax - adc %rdx, $acc5 - adc \$0, $acc0 - - ################################# Second reduction step - mulq 8*0(%r14) - mov $acc1, $t1 - add %rax, $t0 # guaranteed to be zero - mov $acc1, %rax - adc %rdx, $t0 - - sub $acc1, $acc3 - sbb \$0, $acc1 # can't borrow - - mulq 8*1(%r14) - add $t0, $acc2 - adc \$0, %rdx - add %rax, $acc2 - mov $t1, %rax - adc %rdx, $acc3 - mov $t1, %rdx - adc \$0, $acc1 # can't overflow - - shl \$32, %rax - shr \$32, %rdx - sub %rax, $acc4 - mov 8*2($b_ptr), %rax - sbb %rdx, $t1 # can't borrow - - add $acc1, $acc4 - adc $t1, $acc5 - adc \$0, $acc0 - - ################################## * b[2] - mov %rax, $t0 - mulq 8*0($a_ptr) - add %rax, $acc2 - mov $t0, %rax - adc \$0, %rdx - mov %rdx, $t1 - - mulq 8*1($a_ptr) - add $t1, $acc3 - adc \$0, %rdx - add %rax, $acc3 - mov $t0, %rax - adc \$0, %rdx - mov %rdx, $t1 - - mulq 8*2($a_ptr) - add $t1, $acc4 - adc \$0, %rdx - add %rax, $acc4 - mov $t0, %rax - adc \$0, %rdx - - mov $acc2, $t0 - imulq %r15, $acc2 - - mov %rdx, $t1 - mulq 8*3($a_ptr) - add $t1, $acc5 - adc \$0, %rdx - xor $acc1, $acc1 - add %rax, $acc5 - mov $acc2, %rax - adc %rdx, $acc0 - adc \$0, $acc1 - - ################################# Third reduction step - mulq 8*0(%r14) - mov $acc2, $t1 - add %rax, $t0 # guaranteed to be zero - mov $acc2, %rax - adc %rdx, $t0 - - sub $acc2, $acc4 - sbb \$0, $acc2 # can't borrow - - mulq 8*1(%r14) - add $t0, $acc3 - adc \$0, %rdx - add %rax, $acc3 - mov $t1, %rax - adc %rdx, $acc4 - mov $t1, %rdx - adc \$0, $acc2 # can't overflow - - shl \$32, %rax - shr \$32, %rdx - sub %rax, $acc5 - mov 8*3($b_ptr), %rax - sbb %rdx, $t1 # can't borrow - - add $acc2, $acc5 - adc $t1, $acc0 - adc \$0, $acc1 - - ################################# * b[3] - mov %rax, $t0 - mulq 8*0($a_ptr) - add %rax, $acc3 - mov $t0, %rax - adc \$0, %rdx - mov %rdx, $t1 - - mulq 8*1($a_ptr) - add $t1, $acc4 - adc \$0, %rdx - add %rax, $acc4 - mov $t0, %rax - adc \$0, %rdx - mov %rdx, $t1 - - mulq 8*2($a_ptr) - add $t1, $acc5 - adc \$0, %rdx - add %rax, $acc5 - mov $t0, %rax - adc \$0, %rdx - - mov $acc3, $t0 - imulq %r15, $acc3 - - mov %rdx, $t1 - mulq 8*3($a_ptr) - add $t1, $acc0 - adc \$0, %rdx - xor $acc2, $acc2 - add %rax, $acc0 - mov $acc3, %rax - adc %rdx, $acc1 - adc \$0, $acc2 - - ################################# Last reduction step - mulq 8*0(%r14) - mov $acc3, $t1 - add %rax, $t0 # guaranteed to be zero - mov $acc3, %rax - adc %rdx, $t0 - - sub $acc3, $acc5 - sbb \$0, $acc3 # can't borrow - - mulq 8*1(%r14) - add $t0, $acc4 - adc \$0, %rdx - add %rax, $acc4 - mov $t1, %rax - adc %rdx, $acc5 - mov $t1, %rdx - adc \$0, $acc3 # can't overflow - - shl \$32, %rax - shr \$32, %rdx - sub %rax, $acc0 - sbb %rdx, $t1 # can't borrow - - add $acc3, $acc0 - adc $t1, $acc1 - adc \$0, $acc2 - - ################################# Subtract ord - mov $acc4, $a_ptr - sub 8*0(%r14), $acc4 - mov $acc5, $acc3 - sbb 8*1(%r14), $acc5 - mov $acc0, $t0 - sbb 8*2(%r14), $acc0 - mov $acc1, $t1 - sbb 8*3(%r14), $acc1 - sbb \$0, $acc2 - - cmovc $a_ptr, $acc4 - cmovc $acc3, $acc5 - cmovc $t0, $acc0 - cmovc $t1, $acc1 - - mov $acc4, 8*0($r_ptr) - mov $acc5, 8*1($r_ptr) - mov $acc0, 8*2($r_ptr) - mov $acc1, 8*3($r_ptr) - - mov 0(%rsp),%r15 -.cfi_restore %r15 - mov 8(%rsp),%r14 -.cfi_restore %r14 - mov 16(%rsp),%r13 -.cfi_restore %r13 - mov 24(%rsp),%r12 -.cfi_restore %r12 - mov 32(%rsp),%rbx -.cfi_restore %rbx - mov 40(%rsp),%rbp -.cfi_restore %rbp - lea 48(%rsp),%rsp -.cfi_adjust_cfa_offset -48 -.Lord_mul_epilogue: - ret -.cfi_endproc -.size GFp_p256_scalar_mul_mont,.-GFp_p256_scalar_mul_mont - -################################################################################ -# void GFp_p256_scalar_sqr_rep_mont( -# uint64_t res[4], -# uint64_t a[4], -# uint64_t rep); - -.globl GFp_p256_scalar_sqr_rep_mont -.type GFp_p256_scalar_sqr_rep_mont,\@function,3 -.align 32 -GFp_p256_scalar_sqr_rep_mont: -.cfi_startproc -___ -$code.=<<___ if ($addx); - leaq GFp_ia32cap_P(%rip), %rcx - mov 8(%rcx), %rcx - and \$0x80100, %ecx - cmp \$0x80100, %ecx - je .Lecp_nistz256_ord_sqr_montx -___ -$code.=<<___; - push %rbp -.cfi_push %rbp - push %rbx -.cfi_push %rbx - push %r12 -.cfi_push %r12 - push %r13 -.cfi_push %r13 - push %r14 -.cfi_push %r14 - push %r15 -.cfi_push %r15 -.Lord_sqr_body: - - mov 8*0($a_ptr), $acc0 - mov 8*1($a_ptr), %rax - mov 8*2($a_ptr), $acc6 - mov 8*3($a_ptr), $acc7 - lea .Lord(%rip), $a_ptr # pointer to modulus - mov $b_org, $b_ptr - jmp .Loop_ord_sqr - -.align 32 -.Loop_ord_sqr: - ################################# a[1:] * a[0] - mov %rax, $t1 # put aside a[1] - mul $acc0 # a[1] * a[0] - mov %rax, $acc1 - movq $t1, %xmm1 # offload a[1] - mov $acc6, %rax - mov %rdx, $acc2 - - mul $acc0 # a[2] * a[0] - add %rax, $acc2 - mov $acc7, %rax - movq $acc6, %xmm2 # offload a[2] - adc \$0, %rdx - mov %rdx, $acc3 - - mul $acc0 # a[3] * a[0] - add %rax, $acc3 - mov $acc7, %rax - movq $acc7, %xmm3 # offload a[3] - adc \$0, %rdx - mov %rdx, $acc4 - - ################################# a[3] * a[2] - mul $acc6 # a[3] * a[2] - mov %rax, $acc5 - mov $acc6, %rax - mov %rdx, $acc6 - - ################################# a[2:] * a[1] - mul $t1 # a[2] * a[1] - add %rax, $acc3 - mov $acc7, %rax - adc \$0, %rdx - mov %rdx, $acc7 - - mul $t1 # a[3] * a[1] - add %rax, $acc4 - adc \$0, %rdx - - add $acc7, $acc4 - adc %rdx, $acc5 - adc \$0, $acc6 # can't overflow - - ################################# *2 - xor $acc7, $acc7 - mov $acc0, %rax - add $acc1, $acc1 - adc $acc2, $acc2 - adc $acc3, $acc3 - adc $acc4, $acc4 - adc $acc5, $acc5 - adc $acc6, $acc6 - adc \$0, $acc7 - - ################################# Missing products - mul %rax # a[0] * a[0] - mov %rax, $acc0 - movq %xmm1, %rax - mov %rdx, $t1 - - mul %rax # a[1] * a[1] - add $t1, $acc1 - adc %rax, $acc2 - movq %xmm2, %rax - adc \$0, %rdx - mov %rdx, $t1 - - mul %rax # a[2] * a[2] - add $t1, $acc3 - adc %rax, $acc4 - movq %xmm3, %rax - adc \$0, %rdx - mov %rdx, $t1 - - mov $acc0, $t0 - imulq 8*4($a_ptr), $acc0 # *= .LordK - - mul %rax # a[3] * a[3] - add $t1, $acc5 - adc %rax, $acc6 - mov 8*0($a_ptr), %rax # modulus[0] - adc %rdx, $acc7 # can't overflow - - ################################# First reduction step - mul $acc0 - mov $acc0, $t1 - add %rax, $t0 # guaranteed to be zero - mov 8*1($a_ptr), %rax # modulus[1] - adc %rdx, $t0 - - sub $acc0, $acc2 - sbb \$0, $t1 # can't borrow - - mul $acc0 - add $t0, $acc1 - adc \$0, %rdx - add %rax, $acc1 - mov $acc0, %rax - adc %rdx, $acc2 - mov $acc0, %rdx - adc \$0, $t1 # can't overflow - - mov $acc1, $t0 - imulq 8*4($a_ptr), $acc1 # *= .LordK - - shl \$32, %rax - shr \$32, %rdx - sub %rax, $acc3 - mov 8*0($a_ptr), %rax - sbb %rdx, $acc0 # can't borrow - - add $t1, $acc3 - adc \$0, $acc0 # can't overflow - - ################################# Second reduction step - mul $acc1 - mov $acc1, $t1 - add %rax, $t0 # guaranteed to be zero - mov 8*1($a_ptr), %rax - adc %rdx, $t0 - - sub $acc1, $acc3 - sbb \$0, $t1 # can't borrow - - mul $acc1 - add $t0, $acc2 - adc \$0, %rdx - add %rax, $acc2 - mov $acc1, %rax - adc %rdx, $acc3 - mov $acc1, %rdx - adc \$0, $t1 # can't overflow - - mov $acc2, $t0 - imulq 8*4($a_ptr), $acc2 # *= .LordK - - shl \$32, %rax - shr \$32, %rdx - sub %rax, $acc0 - mov 8*0($a_ptr), %rax - sbb %rdx, $acc1 # can't borrow - - add $t1, $acc0 - adc \$0, $acc1 # can't overflow - - ################################# Third reduction step - mul $acc2 - mov $acc2, $t1 - add %rax, $t0 # guaranteed to be zero - mov 8*1($a_ptr), %rax - adc %rdx, $t0 - - sub $acc2, $acc0 - sbb \$0, $t1 # can't borrow - - mul $acc2 - add $t0, $acc3 - adc \$0, %rdx - add %rax, $acc3 - mov $acc2, %rax - adc %rdx, $acc0 - mov $acc2, %rdx - adc \$0, $t1 # can't overflow - - mov $acc3, $t0 - imulq 8*4($a_ptr), $acc3 # *= .LordK - - shl \$32, %rax - shr \$32, %rdx - sub %rax, $acc1 - mov 8*0($a_ptr), %rax - sbb %rdx, $acc2 # can't borrow - - add $t1, $acc1 - adc \$0, $acc2 # can't overflow - - ################################# Last reduction step - mul $acc3 - mov $acc3, $t1 - add %rax, $t0 # guaranteed to be zero - mov 8*1($a_ptr), %rax - adc %rdx, $t0 - - sub $acc3, $acc1 - sbb \$0, $t1 # can't borrow - - mul $acc3 - add $t0, $acc0 - adc \$0, %rdx - add %rax, $acc0 - mov $acc3, %rax - adc %rdx, $acc1 - mov $acc3, %rdx - adc \$0, $t1 # can't overflow - - shl \$32, %rax - shr \$32, %rdx - sub %rax, $acc2 - sbb %rdx, $acc3 # can't borrow - - add $t1, $acc2 - adc \$0, $acc3 # can't overflow - - ################################# Add bits [511:256] of the sqr result - xor %rdx, %rdx - add $acc4, $acc0 - adc $acc5, $acc1 - mov $acc0, $acc4 - adc $acc6, $acc2 - adc $acc7, $acc3 - mov $acc1, %rax - adc \$0, %rdx - - ################################# Compare to modulus - sub 8*0($a_ptr), $acc0 - mov $acc2, $acc6 - sbb 8*1($a_ptr), $acc1 - sbb 8*2($a_ptr), $acc2 - mov $acc3, $acc7 - sbb 8*3($a_ptr), $acc3 - sbb \$0, %rdx - - cmovc $acc4, $acc0 - cmovnc $acc1, %rax - cmovnc $acc2, $acc6 - cmovnc $acc3, $acc7 - - dec $b_ptr - jnz .Loop_ord_sqr - - mov $acc0, 8*0($r_ptr) - mov %rax, 8*1($r_ptr) - pxor %xmm1, %xmm1 - mov $acc6, 8*2($r_ptr) - pxor %xmm2, %xmm2 - mov $acc7, 8*3($r_ptr) - pxor %xmm3, %xmm3 - - mov 0(%rsp),%r15 -.cfi_restore %r15 - mov 8(%rsp),%r14 -.cfi_restore %r14 - mov 16(%rsp),%r13 -.cfi_restore %r13 - mov 24(%rsp),%r12 -.cfi_restore %r12 - mov 32(%rsp),%rbx -.cfi_restore %rbx - mov 40(%rsp),%rbp -.cfi_restore %rbp - lea 48(%rsp),%rsp -.cfi_adjust_cfa_offset -48 -.Lord_sqr_epilogue: - ret -.cfi_endproc -.size GFp_p256_scalar_sqr_rep_mont,.-GFp_p256_scalar_sqr_rep_mont -___ - -$code.=<<___ if ($addx); -################################################################################ -.type ecp_nistz256_ord_mul_montx,\@function,3 -.align 32 -ecp_nistz256_ord_mul_montx: -.cfi_startproc -.Lecp_nistz256_ord_mul_montx: - push %rbp -.cfi_push %rbp - push %rbx -.cfi_push %rbx - push %r12 -.cfi_push %r12 - push %r13 -.cfi_push %r13 - push %r14 -.cfi_push %r14 - push %r15 -.cfi_push %r15 -.Lord_mulx_body: - - mov $b_org, $b_ptr - mov 8*0($b_org), %rdx - mov 8*0($a_ptr), $acc1 - mov 8*1($a_ptr), $acc2 - mov 8*2($a_ptr), $acc3 - mov 8*3($a_ptr), $acc4 - lea -128($a_ptr), $a_ptr # control u-op density - lea .Lord-128(%rip), %r14 - mov .LordK(%rip), %r15 - - ################################# Multiply by b[0] - mulx $acc1, $acc0, $acc1 - mulx $acc2, $t0, $acc2 - mulx $acc3, $t1, $acc3 - add $t0, $acc1 - mulx $acc4, $t0, $acc4 - mov $acc0, %rdx - mulx %r15, %rdx, %rax - adc $t1, $acc2 - adc $t0, $acc3 - adc \$0, $acc4 - - ################################# reduction - xor $acc5, $acc5 # $acc5=0, cf=0, of=0 - mulx 8*0+128(%r14), $t0, $t1 - adcx $t0, $acc0 # guaranteed to be zero - adox $t1, $acc1 - - mulx 8*1+128(%r14), $t0, $t1 - adcx $t0, $acc1 - adox $t1, $acc2 - - mulx 8*2+128(%r14), $t0, $t1 - adcx $t0, $acc2 - adox $t1, $acc3 - - mulx 8*3+128(%r14), $t0, $t1 - mov 8*1($b_ptr), %rdx - adcx $t0, $acc3 - adox $t1, $acc4 - adcx $acc0, $acc4 - adox $acc0, $acc5 - adc \$0, $acc5 # cf=0, of=0 - - ################################# Multiply by b[1] - mulx 8*0+128($a_ptr), $t0, $t1 - adcx $t0, $acc1 - adox $t1, $acc2 - - mulx 8*1+128($a_ptr), $t0, $t1 - adcx $t0, $acc2 - adox $t1, $acc3 - - mulx 8*2+128($a_ptr), $t0, $t1 - adcx $t0, $acc3 - adox $t1, $acc4 - - mulx 8*3+128($a_ptr), $t0, $t1 - mov $acc1, %rdx - mulx %r15, %rdx, %rax - adcx $t0, $acc4 - adox $t1, $acc5 - - adcx $acc0, $acc5 - adox $acc0, $acc0 - adc \$0, $acc0 # cf=0, of=0 - - ################################# reduction - mulx 8*0+128(%r14), $t0, $t1 - adcx $t0, $acc1 # guaranteed to be zero - adox $t1, $acc2 - - mulx 8*1+128(%r14), $t0, $t1 - adcx $t0, $acc2 - adox $t1, $acc3 - - mulx 8*2+128(%r14), $t0, $t1 - adcx $t0, $acc3 - adox $t1, $acc4 - - mulx 8*3+128(%r14), $t0, $t1 - mov 8*2($b_ptr), %rdx - adcx $t0, $acc4 - adox $t1, $acc5 - adcx $acc1, $acc5 - adox $acc1, $acc0 - adc \$0, $acc0 # cf=0, of=0 - - ################################# Multiply by b[2] - mulx 8*0+128($a_ptr), $t0, $t1 - adcx $t0, $acc2 - adox $t1, $acc3 - - mulx 8*1+128($a_ptr), $t0, $t1 - adcx $t0, $acc3 - adox $t1, $acc4 - - mulx 8*2+128($a_ptr), $t0, $t1 - adcx $t0, $acc4 - adox $t1, $acc5 - - mulx 8*3+128($a_ptr), $t0, $t1 - mov $acc2, %rdx - mulx %r15, %rdx, %rax - adcx $t0, $acc5 - adox $t1, $acc0 - - adcx $acc1, $acc0 - adox $acc1, $acc1 - adc \$0, $acc1 # cf=0, of=0 - - ################################# reduction - mulx 8*0+128(%r14), $t0, $t1 - adcx $t0, $acc2 # guaranteed to be zero - adox $t1, $acc3 - - mulx 8*1+128(%r14), $t0, $t1 - adcx $t0, $acc3 - adox $t1, $acc4 - - mulx 8*2+128(%r14), $t0, $t1 - adcx $t0, $acc4 - adox $t1, $acc5 - - mulx 8*3+128(%r14), $t0, $t1 - mov 8*3($b_ptr), %rdx - adcx $t0, $acc5 - adox $t1, $acc0 - adcx $acc2, $acc0 - adox $acc2, $acc1 - adc \$0, $acc1 # cf=0, of=0 - - ################################# Multiply by b[3] - mulx 8*0+128($a_ptr), $t0, $t1 - adcx $t0, $acc3 - adox $t1, $acc4 - - mulx 8*1+128($a_ptr), $t0, $t1 - adcx $t0, $acc4 - adox $t1, $acc5 - - mulx 8*2+128($a_ptr), $t0, $t1 - adcx $t0, $acc5 - adox $t1, $acc0 - - mulx 8*3+128($a_ptr), $t0, $t1 - mov $acc3, %rdx - mulx %r15, %rdx, %rax - adcx $t0, $acc0 - adox $t1, $acc1 - - adcx $acc2, $acc1 - adox $acc2, $acc2 - adc \$0, $acc2 # cf=0, of=0 - - ################################# reduction - mulx 8*0+128(%r14), $t0, $t1 - adcx $t0, $acc3 # guranteed to be zero - adox $t1, $acc4 - - mulx 8*1+128(%r14), $t0, $t1 - adcx $t0, $acc4 - adox $t1, $acc5 - - mulx 8*2+128(%r14), $t0, $t1 - adcx $t0, $acc5 - adox $t1, $acc0 - - mulx 8*3+128(%r14), $t0, $t1 - lea 128(%r14),%r14 - mov $acc4, $t2 - adcx $t0, $acc0 - adox $t1, $acc1 - mov $acc5, $t3 - adcx $acc3, $acc1 - adox $acc3, $acc2 - adc \$0, $acc2 - - ################################# - # Branch-less conditional subtraction of P - mov $acc0, $t0 - sub 8*0(%r14), $acc4 - sbb 8*1(%r14), $acc5 - sbb 8*2(%r14), $acc0 - mov $acc1, $t1 - sbb 8*3(%r14), $acc1 - sbb \$0, $acc2 - - cmovc $t2, $acc4 - cmovc $t3, $acc5 - cmovc $t0, $acc0 - cmovc $t1, $acc1 - - mov $acc4, 8*0($r_ptr) - mov $acc5, 8*1($r_ptr) - mov $acc0, 8*2($r_ptr) - mov $acc1, 8*3($r_ptr) - - mov 0(%rsp),%r15 -.cfi_restore %r15 - mov 8(%rsp),%r14 -.cfi_restore %r14 - mov 16(%rsp),%r13 -.cfi_restore %r13 - mov 24(%rsp),%r12 -.cfi_restore %r12 - mov 32(%rsp),%rbx -.cfi_restore %rbx - mov 40(%rsp),%rbp -.cfi_restore %rbp - lea 48(%rsp),%rsp -.cfi_adjust_cfa_offset -48 -.Lord_mulx_epilogue: - ret -.cfi_endproc -.size ecp_nistz256_ord_mul_montx,.-ecp_nistz256_ord_mul_montx - -.type ecp_nistz256_ord_sqr_montx,\@function,3 -.align 32 -ecp_nistz256_ord_sqr_montx: -.cfi_startproc -.Lecp_nistz256_ord_sqr_montx: - push %rbp -.cfi_push %rbp - push %rbx -.cfi_push %rbx - push %r12 -.cfi_push %r12 - push %r13 -.cfi_push %r13 - push %r14 -.cfi_push %r14 - push %r15 -.cfi_push %r15 -.Lord_sqrx_body: - - mov $b_org, $b_ptr - mov 8*0($a_ptr), %rdx - mov 8*1($a_ptr), $acc6 - mov 8*2($a_ptr), $acc7 - mov 8*3($a_ptr), $acc0 - lea .Lord(%rip), $a_ptr - jmp .Loop_ord_sqrx - -.align 32 -.Loop_ord_sqrx: - mulx $acc6, $acc1, $acc2 # a[0]*a[1] - mulx $acc7, $t0, $acc3 # a[0]*a[2] - mov %rdx, %rax # offload a[0] - movq $acc6, %xmm1 # offload a[1] - mulx $acc0, $t1, $acc4 # a[0]*a[3] - mov $acc6, %rdx - add $t0, $acc2 - movq $acc7, %xmm2 # offload a[2] - adc $t1, $acc3 - adc \$0, $acc4 - xor $acc5, $acc5 # $acc5=0,cf=0,of=0 - ################################# - mulx $acc7, $t0, $t1 # a[1]*a[2] - adcx $t0, $acc3 - adox $t1, $acc4 - - mulx $acc0, $t0, $t1 # a[1]*a[3] - mov $acc7, %rdx - adcx $t0, $acc4 - adox $t1, $acc5 - adc \$0, $acc5 - ################################# - mulx $acc0, $t0, $acc6 # a[2]*a[3] - mov %rax, %rdx - movq $acc0, %xmm3 # offload a[3] - xor $acc7, $acc7 # $acc7=0,cf=0,of=0 - adcx $acc1, $acc1 # acc1:6<<1 - adox $t0, $acc5 - adcx $acc2, $acc2 - adox $acc7, $acc6 # of=0 - - ################################# a[i]*a[i] - mulx %rdx, $acc0, $t1 - movq %xmm1, %rdx - adcx $acc3, $acc3 - adox $t1, $acc1 - adcx $acc4, $acc4 - mulx %rdx, $t0, $t4 - movq %xmm2, %rdx - adcx $acc5, $acc5 - adox $t0, $acc2 - adcx $acc6, $acc6 - mulx %rdx, $t0, $t1 - .byte 0x67 - movq %xmm3, %rdx - adox $t4, $acc3 - adcx $acc7, $acc7 - adox $t0, $acc4 - adox $t1, $acc5 - mulx %rdx, $t0, $t4 - adox $t0, $acc6 - adox $t4, $acc7 - - ################################# reduction - mov $acc0, %rdx - mulx 8*4($a_ptr), %rdx, $t0 - - xor %rax, %rax # cf=0, of=0 - mulx 8*0($a_ptr), $t0, $t1 - adcx $t0, $acc0 # guaranteed to be zero - adox $t1, $acc1 - mulx 8*1($a_ptr), $t0, $t1 - adcx $t0, $acc1 - adox $t1, $acc2 - mulx 8*2($a_ptr), $t0, $t1 - adcx $t0, $acc2 - adox $t1, $acc3 - mulx 8*3($a_ptr), $t0, $t1 - adcx $t0, $acc3 - adox $t1, $acc0 # of=0 - adcx %rax, $acc0 # cf=0 - - ################################# - mov $acc1, %rdx - mulx 8*4($a_ptr), %rdx, $t0 - - mulx 8*0($a_ptr), $t0, $t1 - adox $t0, $acc1 # guaranteed to be zero - adcx $t1, $acc2 - mulx 8*1($a_ptr), $t0, $t1 - adox $t0, $acc2 - adcx $t1, $acc3 - mulx 8*2($a_ptr), $t0, $t1 - adox $t0, $acc3 - adcx $t1, $acc0 - mulx 8*3($a_ptr), $t0, $t1 - adox $t0, $acc0 - adcx $t1, $acc1 # cf=0 - adox %rax, $acc1 # of=0 - - ################################# - mov $acc2, %rdx - mulx 8*4($a_ptr), %rdx, $t0 - - mulx 8*0($a_ptr), $t0, $t1 - adcx $t0, $acc2 # guaranteed to be zero - adox $t1, $acc3 - mulx 8*1($a_ptr), $t0, $t1 - adcx $t0, $acc3 - adox $t1, $acc0 - mulx 8*2($a_ptr), $t0, $t1 - adcx $t0, $acc0 - adox $t1, $acc1 - mulx 8*3($a_ptr), $t0, $t1 - adcx $t0, $acc1 - adox $t1, $acc2 # of=0 - adcx %rax, $acc2 # cf=0 - - ################################# - mov $acc3, %rdx - mulx 8*4($a_ptr), %rdx, $t0 - - mulx 8*0($a_ptr), $t0, $t1 - adox $t0, $acc3 # guaranteed to be zero - adcx $t1, $acc0 - mulx 8*1($a_ptr), $t0, $t1 - adox $t0, $acc0 - adcx $t1, $acc1 - mulx 8*2($a_ptr), $t0, $t1 - adox $t0, $acc1 - adcx $t1, $acc2 - mulx 8*3($a_ptr), $t0, $t1 - adox $t0, $acc2 - adcx $t1, $acc3 - adox %rax, $acc3 - - ################################# accumulate upper half - add $acc0, $acc4 # add $acc4, $acc0 - adc $acc5, $acc1 - mov $acc4, %rdx - adc $acc6, $acc2 - adc $acc7, $acc3 - mov $acc1, $acc6 - adc \$0, %rax - - ################################# compare to modulus - sub 8*0($a_ptr), $acc4 - mov $acc2, $acc7 - sbb 8*1($a_ptr), $acc1 - sbb 8*2($a_ptr), $acc2 - mov $acc3, $acc0 - sbb 8*3($a_ptr), $acc3 - sbb \$0, %rax - - cmovnc $acc4, %rdx - cmovnc $acc1, $acc6 - cmovnc $acc2, $acc7 - cmovnc $acc3, $acc0 - - dec $b_ptr - jnz .Loop_ord_sqrx - - mov %rdx, 8*0($r_ptr) - mov $acc6, 8*1($r_ptr) - pxor %xmm1, %xmm1 - mov $acc7, 8*2($r_ptr) - pxor %xmm2, %xmm2 - mov $acc0, 8*3($r_ptr) - pxor %xmm3, %xmm3 - - mov 0(%rsp),%r15 -.cfi_restore %r15 - mov 8(%rsp),%r14 -.cfi_restore %r14 - mov 16(%rsp),%r13 -.cfi_restore %r13 - mov 24(%rsp),%r12 -.cfi_restore %r12 - mov 32(%rsp),%rbx -.cfi_restore %rbx - mov 40(%rsp),%rbp -.cfi_restore %rbp - lea 48(%rsp),%rsp -.cfi_adjust_cfa_offset -48 -.Lord_sqrx_epilogue: - ret -.cfi_endproc -.size ecp_nistz256_ord_sqr_montx,.-ecp_nistz256_ord_sqr_montx -___ - -$code.=<<___; -################################################################################ -# void GFp_nistz256_mul_mont( -# uint64_t res[4], -# uint64_t a[4], -# uint64_t b[4]); - -.globl GFp_nistz256_mul_mont -.type GFp_nistz256_mul_mont,\@function,3 -.align 32 -GFp_nistz256_mul_mont: -.cfi_startproc -___ -$code.=<<___ if ($addx); - leaq GFp_ia32cap_P(%rip), %rcx - mov 8(%rcx), %rcx - and \$0x80100, %ecx -___ -$code.=<<___; -.Lmul_mont: - push %rbp -.cfi_push %rbp - push %rbx -.cfi_push %rbx - push %r12 -.cfi_push %r12 - push %r13 -.cfi_push %r13 - push %r14 -.cfi_push %r14 - push %r15 -.cfi_push %r15 -.Lmul_body: -___ -$code.=<<___ if ($addx); - cmp \$0x80100, %ecx - je .Lmul_montx -___ -$code.=<<___; - mov $b_org, $b_ptr - mov 8*0($b_org), %rax - mov 8*0($a_ptr), $acc1 - mov 8*1($a_ptr), $acc2 - mov 8*2($a_ptr), $acc3 - mov 8*3($a_ptr), $acc4 - - call __ecp_nistz256_mul_montq -___ -$code.=<<___ if ($addx); - jmp .Lmul_mont_done - -.align 32 -.Lmul_montx: - mov $b_org, $b_ptr - mov 8*0($b_org), %rdx - mov 8*0($a_ptr), $acc1 - mov 8*1($a_ptr), $acc2 - mov 8*2($a_ptr), $acc3 - mov 8*3($a_ptr), $acc4 - lea -128($a_ptr), $a_ptr # control u-op density - - call __ecp_nistz256_mul_montx -___ -$code.=<<___; -.Lmul_mont_done: - mov 0(%rsp),%r15 -.cfi_restore %r15 - mov 8(%rsp),%r14 -.cfi_restore %r14 - mov 16(%rsp),%r13 -.cfi_restore %r13 - mov 24(%rsp),%r12 -.cfi_restore %r12 - mov 32(%rsp),%rbx -.cfi_restore %rbx - mov 40(%rsp),%rbp -.cfi_restore %rbp - lea 48(%rsp),%rsp -.cfi_adjust_cfa_offset -48 -.Lmul_epilogue: - ret -.cfi_endproc -.size GFp_nistz256_mul_mont,.-GFp_nistz256_mul_mont - -.type __ecp_nistz256_mul_montq,\@abi-omnipotent -.align 32 -__ecp_nistz256_mul_montq: -.cfi_startproc - ######################################################################## - # Multiply a by b[0] - mov %rax, $t1 - mulq $acc1 - mov .Lpoly+8*1(%rip),$poly1 - mov %rax, $acc0 - mov $t1, %rax - mov %rdx, $acc1 - - mulq $acc2 - mov .Lpoly+8*3(%rip),$poly3 - add %rax, $acc1 - mov $t1, %rax - adc \$0, %rdx - mov %rdx, $acc2 - - mulq $acc3 - add %rax, $acc2 - mov $t1, %rax - adc \$0, %rdx - mov %rdx, $acc3 - - mulq $acc4 - add %rax, $acc3 - mov $acc0, %rax - adc \$0, %rdx - xor $acc5, $acc5 - mov %rdx, $acc4 - - ######################################################################## - # First reduction step - # Basically now we want to multiply acc[0] by p256, - # and add the result to the acc. - # Due to the special form of p256 we do some optimizations - # - # acc[0] x p256[0..1] = acc[0] x 2^96 - acc[0] - # then we add acc[0] and get acc[0] x 2^96 - - mov $acc0, $t1 - shl \$32, $acc0 - mulq $poly3 - shr \$32, $t1 - add $acc0, $acc1 # +=acc[0]<<96 - adc $t1, $acc2 - adc %rax, $acc3 - mov 8*1($b_ptr), %rax - adc %rdx, $acc4 - adc \$0, $acc5 - xor $acc0, $acc0 - - ######################################################################## - # Multiply by b[1] - mov %rax, $t1 - mulq 8*0($a_ptr) - add %rax, $acc1 - mov $t1, %rax - adc \$0, %rdx - mov %rdx, $t0 - - mulq 8*1($a_ptr) - add $t0, $acc2 - adc \$0, %rdx - add %rax, $acc2 - mov $t1, %rax - adc \$0, %rdx - mov %rdx, $t0 - - mulq 8*2($a_ptr) - add $t0, $acc3 - adc \$0, %rdx - add %rax, $acc3 - mov $t1, %rax - adc \$0, %rdx - mov %rdx, $t0 - - mulq 8*3($a_ptr) - add $t0, $acc4 - adc \$0, %rdx - add %rax, $acc4 - mov $acc1, %rax - adc %rdx, $acc5 - adc \$0, $acc0 - - ######################################################################## - # Second reduction step - mov $acc1, $t1 - shl \$32, $acc1 - mulq $poly3 - shr \$32, $t1 - add $acc1, $acc2 - adc $t1, $acc3 - adc %rax, $acc4 - mov 8*2($b_ptr), %rax - adc %rdx, $acc5 - adc \$0, $acc0 - xor $acc1, $acc1 - - ######################################################################## - # Multiply by b[2] - mov %rax, $t1 - mulq 8*0($a_ptr) - add %rax, $acc2 - mov $t1, %rax - adc \$0, %rdx - mov %rdx, $t0 - - mulq 8*1($a_ptr) - add $t0, $acc3 - adc \$0, %rdx - add %rax, $acc3 - mov $t1, %rax - adc \$0, %rdx - mov %rdx, $t0 - - mulq 8*2($a_ptr) - add $t0, $acc4 - adc \$0, %rdx - add %rax, $acc4 - mov $t1, %rax - adc \$0, %rdx - mov %rdx, $t0 - - mulq 8*3($a_ptr) - add $t0, $acc5 - adc \$0, %rdx - add %rax, $acc5 - mov $acc2, %rax - adc %rdx, $acc0 - adc \$0, $acc1 - - ######################################################################## - # Third reduction step - mov $acc2, $t1 - shl \$32, $acc2 - mulq $poly3 - shr \$32, $t1 - add $acc2, $acc3 - adc $t1, $acc4 - adc %rax, $acc5 - mov 8*3($b_ptr), %rax - adc %rdx, $acc0 - adc \$0, $acc1 - xor $acc2, $acc2 - - ######################################################################## - # Multiply by b[3] - mov %rax, $t1 - mulq 8*0($a_ptr) - add %rax, $acc3 - mov $t1, %rax - adc \$0, %rdx - mov %rdx, $t0 - - mulq 8*1($a_ptr) - add $t0, $acc4 - adc \$0, %rdx - add %rax, $acc4 - mov $t1, %rax - adc \$0, %rdx - mov %rdx, $t0 - - mulq 8*2($a_ptr) - add $t0, $acc5 - adc \$0, %rdx - add %rax, $acc5 - mov $t1, %rax - adc \$0, %rdx - mov %rdx, $t0 - - mulq 8*3($a_ptr) - add $t0, $acc0 - adc \$0, %rdx - add %rax, $acc0 - mov $acc3, %rax - adc %rdx, $acc1 - adc \$0, $acc2 - - ######################################################################## - # Final reduction step - mov $acc3, $t1 - shl \$32, $acc3 - mulq $poly3 - shr \$32, $t1 - add $acc3, $acc4 - adc $t1, $acc5 - mov $acc4, $t0 - adc %rax, $acc0 - adc %rdx, $acc1 - mov $acc5, $t1 - adc \$0, $acc2 - - ######################################################################## - # Branch-less conditional subtraction of P - sub \$-1, $acc4 # .Lpoly[0] - mov $acc0, $t2 - sbb $poly1, $acc5 # .Lpoly[1] - sbb \$0, $acc0 # .Lpoly[2] - mov $acc1, $t3 - sbb $poly3, $acc1 # .Lpoly[3] - sbb \$0, $acc2 - - cmovc $t0, $acc4 - cmovc $t1, $acc5 - mov $acc4, 8*0($r_ptr) - cmovc $t2, $acc0 - mov $acc5, 8*1($r_ptr) - cmovc $t3, $acc1 - mov $acc0, 8*2($r_ptr) - mov $acc1, 8*3($r_ptr) - - ret -.cfi_endproc -.size __ecp_nistz256_mul_montq,.-__ecp_nistz256_mul_montq - -################################################################################ -# void GFp_nistz256_sqr_mont( -# uint64_t res[4], -# uint64_t a[4]); - -# we optimize the square according to S.Gueron and V.Krasnov, -# "Speeding up Big-Number Squaring" -.globl GFp_nistz256_sqr_mont -.type GFp_nistz256_sqr_mont,\@function,2 -.align 32 -GFp_nistz256_sqr_mont: -.cfi_startproc -___ -$code.=<<___ if ($addx); - leaq GFp_ia32cap_P(%rip), %rcx - mov 8(%rcx), %rcx - and \$0x80100, %ecx -___ -$code.=<<___; - push %rbp -.cfi_push %rbp - push %rbx -.cfi_push %rbx - push %r12 -.cfi_push %r12 - push %r13 -.cfi_push %r13 - push %r14 -.cfi_push %r14 - push %r15 -.cfi_push %r15 -.Lsqr_body: -___ -$code.=<<___ if ($addx); - cmp \$0x80100, %ecx - je .Lsqr_montx -___ -$code.=<<___; - mov 8*0($a_ptr), %rax - mov 8*1($a_ptr), $acc6 - mov 8*2($a_ptr), $acc7 - mov 8*3($a_ptr), $acc0 - - call __ecp_nistz256_sqr_montq -___ -$code.=<<___ if ($addx); - jmp .Lsqr_mont_done - -.align 32 -.Lsqr_montx: - mov 8*0($a_ptr), %rdx - mov 8*1($a_ptr), $acc6 - mov 8*2($a_ptr), $acc7 - mov 8*3($a_ptr), $acc0 - lea -128($a_ptr), $a_ptr # control u-op density - - call __ecp_nistz256_sqr_montx -___ -$code.=<<___; -.Lsqr_mont_done: - mov 0(%rsp),%r15 -.cfi_restore %r15 - mov 8(%rsp),%r14 -.cfi_restore %r14 - mov 16(%rsp),%r13 -.cfi_restore %r13 - mov 24(%rsp),%r12 -.cfi_restore %r12 - mov 32(%rsp),%rbx -.cfi_restore %rbx - mov 40(%rsp),%rbp -.cfi_restore %rbp - lea 48(%rsp),%rsp -.cfi_adjust_cfa_offset -48 -.Lsqr_epilogue: - ret -.cfi_endproc -.size GFp_nistz256_sqr_mont,.-GFp_nistz256_sqr_mont - -.type __ecp_nistz256_sqr_montq,\@abi-omnipotent -.align 32 -__ecp_nistz256_sqr_montq: -.cfi_startproc - mov %rax, $acc5 - mulq $acc6 # a[1]*a[0] - mov %rax, $acc1 - mov $acc7, %rax - mov %rdx, $acc2 - - mulq $acc5 # a[0]*a[2] - add %rax, $acc2 - mov $acc0, %rax - adc \$0, %rdx - mov %rdx, $acc3 - - mulq $acc5 # a[0]*a[3] - add %rax, $acc3 - mov $acc7, %rax - adc \$0, %rdx - mov %rdx, $acc4 - - ################################# - mulq $acc6 # a[1]*a[2] - add %rax, $acc3 - mov $acc0, %rax - adc \$0, %rdx - mov %rdx, $t1 - - mulq $acc6 # a[1]*a[3] - add %rax, $acc4 - mov $acc0, %rax - adc \$0, %rdx - add $t1, $acc4 - mov %rdx, $acc5 - adc \$0, $acc5 - - ################################# - mulq $acc7 # a[2]*a[3] - xor $acc7, $acc7 - add %rax, $acc5 - mov 8*0($a_ptr), %rax - mov %rdx, $acc6 - adc \$0, $acc6 - - add $acc1, $acc1 # acc1:6<<1 - adc $acc2, $acc2 - adc $acc3, $acc3 - adc $acc4, $acc4 - adc $acc5, $acc5 - adc $acc6, $acc6 - adc \$0, $acc7 - - mulq %rax - mov %rax, $acc0 - mov 8*1($a_ptr), %rax - mov %rdx, $t0 - - mulq %rax - add $t0, $acc1 - adc %rax, $acc2 - mov 8*2($a_ptr), %rax - adc \$0, %rdx - mov %rdx, $t0 - - mulq %rax - add $t0, $acc3 - adc %rax, $acc4 - mov 8*3($a_ptr), %rax - adc \$0, %rdx - mov %rdx, $t0 - - mulq %rax - add $t0, $acc5 - adc %rax, $acc6 - mov $acc0, %rax - adc %rdx, $acc7 - - mov .Lpoly+8*1(%rip), $a_ptr - mov .Lpoly+8*3(%rip), $t1 - - ########################################## - # Now the reduction - # First iteration - mov $acc0, $t0 - shl \$32, $acc0 - mulq $t1 - shr \$32, $t0 - add $acc0, $acc1 # +=acc[0]<<96 - adc $t0, $acc2 - adc %rax, $acc3 - mov $acc1, %rax - adc \$0, %rdx - - ########################################## - # Second iteration - mov $acc1, $t0 - shl \$32, $acc1 - mov %rdx, $acc0 - mulq $t1 - shr \$32, $t0 - add $acc1, $acc2 - adc $t0, $acc3 - adc %rax, $acc0 - mov $acc2, %rax - adc \$0, %rdx - - ########################################## - # Third iteration - mov $acc2, $t0 - shl \$32, $acc2 - mov %rdx, $acc1 - mulq $t1 - shr \$32, $t0 - add $acc2, $acc3 - adc $t0, $acc0 - adc %rax, $acc1 - mov $acc3, %rax - adc \$0, %rdx - - ########################################### - # Last iteration - mov $acc3, $t0 - shl \$32, $acc3 - mov %rdx, $acc2 - mulq $t1 - shr \$32, $t0 - add $acc3, $acc0 - adc $t0, $acc1 - adc %rax, $acc2 - adc \$0, %rdx - xor $acc3, $acc3 - - ############################################ - # Add the rest of the acc - add $acc0, $acc4 - adc $acc1, $acc5 - mov $acc4, $acc0 - adc $acc2, $acc6 - adc %rdx, $acc7 - mov $acc5, $acc1 - adc \$0, $acc3 - - sub \$-1, $acc4 # .Lpoly[0] - mov $acc6, $acc2 - sbb $a_ptr, $acc5 # .Lpoly[1] - sbb \$0, $acc6 # .Lpoly[2] - mov $acc7, $t0 - sbb $t1, $acc7 # .Lpoly[3] - sbb \$0, $acc3 - - cmovc $acc0, $acc4 - cmovc $acc1, $acc5 - mov $acc4, 8*0($r_ptr) - cmovc $acc2, $acc6 - mov $acc5, 8*1($r_ptr) - cmovc $t0, $acc7 - mov $acc6, 8*2($r_ptr) - mov $acc7, 8*3($r_ptr) - - ret -.cfi_endproc -.size __ecp_nistz256_sqr_montq,.-__ecp_nistz256_sqr_montq -___ - -if ($addx) { -$code.=<<___; -.type __ecp_nistz256_mul_montx,\@abi-omnipotent -.align 32 -__ecp_nistz256_mul_montx: -.cfi_startproc - ######################################################################## - # Multiply by b[0] - mulx $acc1, $acc0, $acc1 - mulx $acc2, $t0, $acc2 - mov \$32, $poly1 - xor $acc5, $acc5 # cf=0 - mulx $acc3, $t1, $acc3 - mov .Lpoly+8*3(%rip), $poly3 - adc $t0, $acc1 - mulx $acc4, $t0, $acc4 - mov $acc0, %rdx - adc $t1, $acc2 - shlx $poly1,$acc0,$t1 - adc $t0, $acc3 - shrx $poly1,$acc0,$t0 - adc \$0, $acc4 - - ######################################################################## - # First reduction step - add $t1, $acc1 - adc $t0, $acc2 - - mulx $poly3, $t0, $t1 - mov 8*1($b_ptr), %rdx - adc $t0, $acc3 - adc $t1, $acc4 - adc \$0, $acc5 - xor $acc0, $acc0 # $acc0=0,cf=0,of=0 - - ######################################################################## - # Multiply by b[1] - mulx 8*0+128($a_ptr), $t0, $t1 - adcx $t0, $acc1 - adox $t1, $acc2 - - mulx 8*1+128($a_ptr), $t0, $t1 - adcx $t0, $acc2 - adox $t1, $acc3 - - mulx 8*2+128($a_ptr), $t0, $t1 - adcx $t0, $acc3 - adox $t1, $acc4 - - mulx 8*3+128($a_ptr), $t0, $t1 - mov $acc1, %rdx - adcx $t0, $acc4 - shlx $poly1, $acc1, $t0 - adox $t1, $acc5 - shrx $poly1, $acc1, $t1 - - adcx $acc0, $acc5 - adox $acc0, $acc0 - adc \$0, $acc0 - - ######################################################################## - # Second reduction step - add $t0, $acc2 - adc $t1, $acc3 - - mulx $poly3, $t0, $t1 - mov 8*2($b_ptr), %rdx - adc $t0, $acc4 - adc $t1, $acc5 - adc \$0, $acc0 - xor $acc1 ,$acc1 # $acc1=0,cf=0,of=0 - - ######################################################################## - # Multiply by b[2] - mulx 8*0+128($a_ptr), $t0, $t1 - adcx $t0, $acc2 - adox $t1, $acc3 - - mulx 8*1+128($a_ptr), $t0, $t1 - adcx $t0, $acc3 - adox $t1, $acc4 - - mulx 8*2+128($a_ptr), $t0, $t1 - adcx $t0, $acc4 - adox $t1, $acc5 - - mulx 8*3+128($a_ptr), $t0, $t1 - mov $acc2, %rdx - adcx $t0, $acc5 - shlx $poly1, $acc2, $t0 - adox $t1, $acc0 - shrx $poly1, $acc2, $t1 - - adcx $acc1, $acc0 - adox $acc1, $acc1 - adc \$0, $acc1 - - ######################################################################## - # Third reduction step - add $t0, $acc3 - adc $t1, $acc4 - - mulx $poly3, $t0, $t1 - mov 8*3($b_ptr), %rdx - adc $t0, $acc5 - adc $t1, $acc0 - adc \$0, $acc1 - xor $acc2, $acc2 # $acc2=0,cf=0,of=0 - - ######################################################################## - # Multiply by b[3] - mulx 8*0+128($a_ptr), $t0, $t1 - adcx $t0, $acc3 - adox $t1, $acc4 - - mulx 8*1+128($a_ptr), $t0, $t1 - adcx $t0, $acc4 - adox $t1, $acc5 - - mulx 8*2+128($a_ptr), $t0, $t1 - adcx $t0, $acc5 - adox $t1, $acc0 - - mulx 8*3+128($a_ptr), $t0, $t1 - mov $acc3, %rdx - adcx $t0, $acc0 - shlx $poly1, $acc3, $t0 - adox $t1, $acc1 - shrx $poly1, $acc3, $t1 - - adcx $acc2, $acc1 - adox $acc2, $acc2 - adc \$0, $acc2 - - ######################################################################## - # Fourth reduction step - add $t0, $acc4 - adc $t1, $acc5 - - mulx $poly3, $t0, $t1 - mov $acc4, $t2 - mov .Lpoly+8*1(%rip), $poly1 - adc $t0, $acc0 - mov $acc5, $t3 - adc $t1, $acc1 - adc \$0, $acc2 - - ######################################################################## - # Branch-less conditional subtraction of P - xor %eax, %eax - mov $acc0, $t0 - sbb \$-1, $acc4 # .Lpoly[0] - sbb $poly1, $acc5 # .Lpoly[1] - sbb \$0, $acc0 # .Lpoly[2] - mov $acc1, $t1 - sbb $poly3, $acc1 # .Lpoly[3] - sbb \$0, $acc2 - - cmovc $t2, $acc4 - cmovc $t3, $acc5 - mov $acc4, 8*0($r_ptr) - cmovc $t0, $acc0 - mov $acc5, 8*1($r_ptr) - cmovc $t1, $acc1 - mov $acc0, 8*2($r_ptr) - mov $acc1, 8*3($r_ptr) - - ret -.cfi_endproc -.size __ecp_nistz256_mul_montx,.-__ecp_nistz256_mul_montx - -.type __ecp_nistz256_sqr_montx,\@abi-omnipotent -.align 32 -__ecp_nistz256_sqr_montx: -.cfi_startproc - mulx $acc6, $acc1, $acc2 # a[0]*a[1] - mulx $acc7, $t0, $acc3 # a[0]*a[2] - xor %eax, %eax - adc $t0, $acc2 - mulx $acc0, $t1, $acc4 # a[0]*a[3] - mov $acc6, %rdx - adc $t1, $acc3 - adc \$0, $acc4 - xor $acc5, $acc5 # $acc5=0,cf=0,of=0 - - ################################# - mulx $acc7, $t0, $t1 # a[1]*a[2] - adcx $t0, $acc3 - adox $t1, $acc4 - - mulx $acc0, $t0, $t1 # a[1]*a[3] - mov $acc7, %rdx - adcx $t0, $acc4 - adox $t1, $acc5 - adc \$0, $acc5 - - ################################# - mulx $acc0, $t0, $acc6 # a[2]*a[3] - mov 8*0+128($a_ptr), %rdx - xor $acc7, $acc7 # $acc7=0,cf=0,of=0 - adcx $acc1, $acc1 # acc1:6<<1 - adox $t0, $acc5 - adcx $acc2, $acc2 - adox $acc7, $acc6 # of=0 - - mulx %rdx, $acc0, $t1 - mov 8*1+128($a_ptr), %rdx - adcx $acc3, $acc3 - adox $t1, $acc1 - adcx $acc4, $acc4 - mulx %rdx, $t0, $t4 - mov 8*2+128($a_ptr), %rdx - adcx $acc5, $acc5 - adox $t0, $acc2 - adcx $acc6, $acc6 - .byte 0x67 - mulx %rdx, $t0, $t1 - mov 8*3+128($a_ptr), %rdx - adox $t4, $acc3 - adcx $acc7, $acc7 - adox $t0, $acc4 - mov \$32, $a_ptr - adox $t1, $acc5 - .byte 0x67,0x67 - mulx %rdx, $t0, $t4 - mov .Lpoly+8*3(%rip), %rdx - adox $t0, $acc6 - shlx $a_ptr, $acc0, $t0 - adox $t4, $acc7 - shrx $a_ptr, $acc0, $t4 - mov %rdx,$t1 - - # reduction step 1 - add $t0, $acc1 - adc $t4, $acc2 - - mulx $acc0, $t0, $acc0 - adc $t0, $acc3 - shlx $a_ptr, $acc1, $t0 - adc \$0, $acc0 - shrx $a_ptr, $acc1, $t4 - - # reduction step 2 - add $t0, $acc2 - adc $t4, $acc3 - - mulx $acc1, $t0, $acc1 - adc $t0, $acc0 - shlx $a_ptr, $acc2, $t0 - adc \$0, $acc1 - shrx $a_ptr, $acc2, $t4 - - # reduction step 3 - add $t0, $acc3 - adc $t4, $acc0 - - mulx $acc2, $t0, $acc2 - adc $t0, $acc1 - shlx $a_ptr, $acc3, $t0 - adc \$0, $acc2 - shrx $a_ptr, $acc3, $t4 - - # reduction step 4 - add $t0, $acc0 - adc $t4, $acc1 - - mulx $acc3, $t0, $acc3 - adc $t0, $acc2 - adc \$0, $acc3 - - xor $t3, $t3 - add $acc0, $acc4 # accumulate upper half - mov .Lpoly+8*1(%rip), $a_ptr - adc $acc1, $acc5 - mov $acc4, $acc0 - adc $acc2, $acc6 - adc $acc3, $acc7 - mov $acc5, $acc1 - adc \$0, $t3 - - sub \$-1, $acc4 # .Lpoly[0] - mov $acc6, $acc2 - sbb $a_ptr, $acc5 # .Lpoly[1] - sbb \$0, $acc6 # .Lpoly[2] - mov $acc7, $acc3 - sbb $t1, $acc7 # .Lpoly[3] - sbb \$0, $t3 - - cmovc $acc0, $acc4 - cmovc $acc1, $acc5 - mov $acc4, 8*0($r_ptr) - cmovc $acc2, $acc6 - mov $acc5, 8*1($r_ptr) - cmovc $acc3, $acc7 - mov $acc6, 8*2($r_ptr) - mov $acc7, 8*3($r_ptr) - - ret -.cfi_endproc -.size __ecp_nistz256_sqr_montx,.-__ecp_nistz256_sqr_montx -___ -} -} -{ -my ($val,$in_t,$index)=$win64?("%rcx","%rdx","%r8d"):("%rdi","%rsi","%edx"); -my ($ONE,$INDEX,$Ra,$Rb,$Rc,$Rd,$Re,$Rf)=map("%xmm$_",(0..7)); -my ($M0,$T0a,$T0b,$T0c,$T0d,$T0e,$T0f,$TMP0)=map("%xmm$_",(8..15)); -my ($M1,$T2a,$T2b,$TMP2,$M2,$T2a,$T2b,$TMP2)=map("%xmm$_",(8..15)); - -$code.=<<___; -################################################################################ -# void GFp_nistz256_select_w5(uint64_t *val, uint64_t *in_t, crypto_word index); -.globl GFp_nistz256_select_w5 -.type GFp_nistz256_select_w5,\@abi-omnipotent -.align 32 -GFp_nistz256_select_w5: -.cfi_startproc -___ -$code.=<<___ if ($avx>1); - leaq GFp_ia32cap_P(%rip), %rax - mov 8(%rax), %rax - test \$`1<<5`, %eax - jnz .Lavx2_select_w5 -___ -$code.=<<___ if ($win64); - lea -0x88(%rsp), %rax -.LSEH_begin_GFp_nistz256_select_w5: - .byte 0x48,0x8d,0x60,0xe0 #lea -0x20(%rax), %rsp - .byte 0x0f,0x29,0x70,0xe0 #movaps %xmm6, -0x20(%rax) - .byte 0x0f,0x29,0x78,0xf0 #movaps %xmm7, -0x10(%rax) - .byte 0x44,0x0f,0x29,0x00 #movaps %xmm8, 0(%rax) - .byte 0x44,0x0f,0x29,0x48,0x10 #movaps %xmm9, 0x10(%rax) - .byte 0x44,0x0f,0x29,0x50,0x20 #movaps %xmm10, 0x20(%rax) - .byte 0x44,0x0f,0x29,0x58,0x30 #movaps %xmm11, 0x30(%rax) - .byte 0x44,0x0f,0x29,0x60,0x40 #movaps %xmm12, 0x40(%rax) - .byte 0x44,0x0f,0x29,0x68,0x50 #movaps %xmm13, 0x50(%rax) - .byte 0x44,0x0f,0x29,0x70,0x60 #movaps %xmm14, 0x60(%rax) - .byte 0x44,0x0f,0x29,0x78,0x70 #movaps %xmm15, 0x70(%rax) -___ -$code.=<<___; - movdqa .LOne(%rip), $ONE - movd $index, $INDEX - - pxor $Ra, $Ra - pxor $Rb, $Rb - pxor $Rc, $Rc - pxor $Rd, $Rd - pxor $Re, $Re - pxor $Rf, $Rf - - movdqa $ONE, $M0 - pshufd \$0, $INDEX, $INDEX - - mov \$16, %rax -.Lselect_loop_sse_w5: - - movdqa $M0, $TMP0 - paddd $ONE, $M0 - pcmpeqd $INDEX, $TMP0 - - movdqa 16*0($in_t), $T0a - movdqa 16*1($in_t), $T0b - movdqa 16*2($in_t), $T0c - movdqa 16*3($in_t), $T0d - movdqa 16*4($in_t), $T0e - movdqa 16*5($in_t), $T0f - lea 16*6($in_t), $in_t - - pand $TMP0, $T0a - pand $TMP0, $T0b - por $T0a, $Ra - pand $TMP0, $T0c - por $T0b, $Rb - pand $TMP0, $T0d - por $T0c, $Rc - pand $TMP0, $T0e - por $T0d, $Rd - pand $TMP0, $T0f - por $T0e, $Re - por $T0f, $Rf - - dec %rax - jnz .Lselect_loop_sse_w5 - - movdqu $Ra, 16*0($val) - movdqu $Rb, 16*1($val) - movdqu $Rc, 16*2($val) - movdqu $Rd, 16*3($val) - movdqu $Re, 16*4($val) - movdqu $Rf, 16*5($val) -___ -$code.=<<___ if ($win64); - movaps (%rsp), %xmm6 - movaps 0x10(%rsp), %xmm7 - movaps 0x20(%rsp), %xmm8 - movaps 0x30(%rsp), %xmm9 - movaps 0x40(%rsp), %xmm10 - movaps 0x50(%rsp), %xmm11 - movaps 0x60(%rsp), %xmm12 - movaps 0x70(%rsp), %xmm13 - movaps 0x80(%rsp), %xmm14 - movaps 0x90(%rsp), %xmm15 - lea 0xa8(%rsp), %rsp -___ -$code.=<<___; - ret -.cfi_endproc -.LSEH_end_GFp_nistz256_select_w5: -.size GFp_nistz256_select_w5,.-GFp_nistz256_select_w5 - -################################################################################ -# void GFp_nistz256_select_w7(uint64_t *val, uint64_t *in_t, crypto_word index); -.globl GFp_nistz256_select_w7 -.type GFp_nistz256_select_w7,\@abi-omnipotent -.align 32 -GFp_nistz256_select_w7: -.cfi_startproc -___ -$code.=<<___ if ($avx>1); - leaq GFp_ia32cap_P(%rip), %rax - mov 8(%rax), %rax - test \$`1<<5`, %eax - jnz .Lavx2_select_w7 -___ -$code.=<<___ if ($win64); - lea -0x88(%rsp), %rax -.LSEH_begin_GFp_nistz256_select_w7: - .byte 0x48,0x8d,0x60,0xe0 #lea -0x20(%rax), %rsp - .byte 0x0f,0x29,0x70,0xe0 #movaps %xmm6, -0x20(%rax) - .byte 0x0f,0x29,0x78,0xf0 #movaps %xmm7, -0x10(%rax) - .byte 0x44,0x0f,0x29,0x00 #movaps %xmm8, 0(%rax) - .byte 0x44,0x0f,0x29,0x48,0x10 #movaps %xmm9, 0x10(%rax) - .byte 0x44,0x0f,0x29,0x50,0x20 #movaps %xmm10, 0x20(%rax) - .byte 0x44,0x0f,0x29,0x58,0x30 #movaps %xmm11, 0x30(%rax) - .byte 0x44,0x0f,0x29,0x60,0x40 #movaps %xmm12, 0x40(%rax) - .byte 0x44,0x0f,0x29,0x68,0x50 #movaps %xmm13, 0x50(%rax) - .byte 0x44,0x0f,0x29,0x70,0x60 #movaps %xmm14, 0x60(%rax) - .byte 0x44,0x0f,0x29,0x78,0x70 #movaps %xmm15, 0x70(%rax) -___ -$code.=<<___; - movdqa .LOne(%rip), $M0 - movd $index, $INDEX - - pxor $Ra, $Ra - pxor $Rb, $Rb - pxor $Rc, $Rc - pxor $Rd, $Rd - - movdqa $M0, $ONE - pshufd \$0, $INDEX, $INDEX - mov \$64, %rax - -.Lselect_loop_sse_w7: - movdqa $M0, $TMP0 - paddd $ONE, $M0 - movdqa 16*0($in_t), $T0a - movdqa 16*1($in_t), $T0b - pcmpeqd $INDEX, $TMP0 - movdqa 16*2($in_t), $T0c - movdqa 16*3($in_t), $T0d - lea 16*4($in_t), $in_t - - pand $TMP0, $T0a - pand $TMP0, $T0b - por $T0a, $Ra - pand $TMP0, $T0c - por $T0b, $Rb - pand $TMP0, $T0d - por $T0c, $Rc - prefetcht0 255($in_t) - por $T0d, $Rd - - dec %rax - jnz .Lselect_loop_sse_w7 - - movdqu $Ra, 16*0($val) - movdqu $Rb, 16*1($val) - movdqu $Rc, 16*2($val) - movdqu $Rd, 16*3($val) -___ -$code.=<<___ if ($win64); - movaps (%rsp), %xmm6 - movaps 0x10(%rsp), %xmm7 - movaps 0x20(%rsp), %xmm8 - movaps 0x30(%rsp), %xmm9 - movaps 0x40(%rsp), %xmm10 - movaps 0x50(%rsp), %xmm11 - movaps 0x60(%rsp), %xmm12 - movaps 0x70(%rsp), %xmm13 - movaps 0x80(%rsp), %xmm14 - movaps 0x90(%rsp), %xmm15 - lea 0xa8(%rsp), %rsp -___ -$code.=<<___; - ret -.cfi_endproc -.LSEH_end_GFp_nistz256_select_w7: -.size GFp_nistz256_select_w7,.-GFp_nistz256_select_w7 -___ -} -if ($avx>1) { -my ($val,$in_t,$index)=$win64?("%rcx","%rdx","%r8d"):("%rdi","%rsi","%edx"); -my ($TWO,$INDEX,$Ra,$Rb,$Rc)=map("%ymm$_",(0..4)); -my ($M0,$T0a,$T0b,$T0c,$TMP0)=map("%ymm$_",(5..9)); -my ($M1,$T1a,$T1b,$T1c,$TMP1)=map("%ymm$_",(10..14)); - -$code.=<<___; -################################################################################ -# void GFp_nistz256_avx2_select_w5(uint64_t *val, uint64_t *in_t, crypto_word index); -.type GFp_nistz256_avx2_select_w5,\@abi-omnipotent -.align 32 -GFp_nistz256_avx2_select_w5: -.cfi_startproc -.Lavx2_select_w5: - vzeroupper -___ -$code.=<<___ if ($win64); - lea -0x88(%rsp), %rax - mov %rsp,%r11 -.LSEH_begin_GFp_nistz256_avx2_select_w5: - .byte 0x48,0x8d,0x60,0xe0 # lea -0x20(%rax), %rsp - .byte 0xc5,0xf8,0x29,0x70,0xe0 # vmovaps %xmm6, -0x20(%rax) - .byte 0xc5,0xf8,0x29,0x78,0xf0 # vmovaps %xmm7, -0x10(%rax) - .byte 0xc5,0x78,0x29,0x40,0x00 # vmovaps %xmm8, 8(%rax) - .byte 0xc5,0x78,0x29,0x48,0x10 # vmovaps %xmm9, 0x10(%rax) - .byte 0xc5,0x78,0x29,0x50,0x20 # vmovaps %xmm10, 0x20(%rax) - .byte 0xc5,0x78,0x29,0x58,0x30 # vmovaps %xmm11, 0x30(%rax) - .byte 0xc5,0x78,0x29,0x60,0x40 # vmovaps %xmm12, 0x40(%rax) - .byte 0xc5,0x78,0x29,0x68,0x50 # vmovaps %xmm13, 0x50(%rax) - .byte 0xc5,0x78,0x29,0x70,0x60 # vmovaps %xmm14, 0x60(%rax) - .byte 0xc5,0x78,0x29,0x78,0x70 # vmovaps %xmm15, 0x70(%rax) -___ -$code.=<<___; - vmovdqa .LTwo(%rip), $TWO - - vpxor $Ra, $Ra, $Ra - vpxor $Rb, $Rb, $Rb - vpxor $Rc, $Rc, $Rc - - vmovdqa .LOne(%rip), $M0 - vmovdqa .LTwo(%rip), $M1 - - vmovd $index, %xmm1 - vpermd $INDEX, $Ra, $INDEX - - mov \$8, %rax -.Lselect_loop_avx2_w5: - - vmovdqa 32*0($in_t), $T0a - vmovdqa 32*1($in_t), $T0b - vmovdqa 32*2($in_t), $T0c - - vmovdqa 32*3($in_t), $T1a - vmovdqa 32*4($in_t), $T1b - vmovdqa 32*5($in_t), $T1c - - vpcmpeqd $INDEX, $M0, $TMP0 - vpcmpeqd $INDEX, $M1, $TMP1 - - vpaddd $TWO, $M0, $M0 - vpaddd $TWO, $M1, $M1 - lea 32*6($in_t), $in_t - - vpand $TMP0, $T0a, $T0a - vpand $TMP0, $T0b, $T0b - vpand $TMP0, $T0c, $T0c - vpand $TMP1, $T1a, $T1a - vpand $TMP1, $T1b, $T1b - vpand $TMP1, $T1c, $T1c - - vpxor $T0a, $Ra, $Ra - vpxor $T0b, $Rb, $Rb - vpxor $T0c, $Rc, $Rc - vpxor $T1a, $Ra, $Ra - vpxor $T1b, $Rb, $Rb - vpxor $T1c, $Rc, $Rc - - dec %rax - jnz .Lselect_loop_avx2_w5 - - vmovdqu $Ra, 32*0($val) - vmovdqu $Rb, 32*1($val) - vmovdqu $Rc, 32*2($val) - vzeroupper -___ -$code.=<<___ if ($win64); - movaps (%rsp), %xmm6 - movaps 0x10(%rsp), %xmm7 - movaps 0x20(%rsp), %xmm8 - movaps 0x30(%rsp), %xmm9 - movaps 0x40(%rsp), %xmm10 - movaps 0x50(%rsp), %xmm11 - movaps 0x60(%rsp), %xmm12 - movaps 0x70(%rsp), %xmm13 - movaps 0x80(%rsp), %xmm14 - movaps 0x90(%rsp), %xmm15 - lea (%r11), %rsp -___ -$code.=<<___; - ret -.cfi_endproc -.LSEH_end_GFp_nistz256_avx2_select_w5: -.size GFp_nistz256_avx2_select_w5,.-GFp_nistz256_avx2_select_w5 -___ -} -if ($avx>1) { -my ($val,$in_t,$index)=$win64?("%rcx","%rdx","%r8d"):("%rdi","%rsi","%edx"); -my ($THREE,$INDEX,$Ra,$Rb)=map("%ymm$_",(0..3)); -my ($M0,$T0a,$T0b,$TMP0)=map("%ymm$_",(4..7)); -my ($M1,$T1a,$T1b,$TMP1)=map("%ymm$_",(8..11)); -my ($M2,$T2a,$T2b,$TMP2)=map("%ymm$_",(12..15)); - -$code.=<<___; - -################################################################################ -# void GFp_nistz256_avx2_select_w7(uint64_t *val, uint64_t *in_t, crypto_word index); -.globl GFp_nistz256_avx2_select_w7 -.type GFp_nistz256_avx2_select_w7,\@abi-omnipotent -.align 32 -GFp_nistz256_avx2_select_w7: -.cfi_startproc -.Lavx2_select_w7: - vzeroupper -___ -$code.=<<___ if ($win64); - mov %rsp,%r11 - lea -0x88(%rsp), %rax -.LSEH_begin_GFp_nistz256_avx2_select_w7: - .byte 0x48,0x8d,0x60,0xe0 # lea -0x20(%rax), %rsp - .byte 0xc5,0xf8,0x29,0x70,0xe0 # vmovaps %xmm6, -0x20(%rax) - .byte 0xc5,0xf8,0x29,0x78,0xf0 # vmovaps %xmm7, -0x10(%rax) - .byte 0xc5,0x78,0x29,0x40,0x00 # vmovaps %xmm8, 8(%rax) - .byte 0xc5,0x78,0x29,0x48,0x10 # vmovaps %xmm9, 0x10(%rax) - .byte 0xc5,0x78,0x29,0x50,0x20 # vmovaps %xmm10, 0x20(%rax) - .byte 0xc5,0x78,0x29,0x58,0x30 # vmovaps %xmm11, 0x30(%rax) - .byte 0xc5,0x78,0x29,0x60,0x40 # vmovaps %xmm12, 0x40(%rax) - .byte 0xc5,0x78,0x29,0x68,0x50 # vmovaps %xmm13, 0x50(%rax) - .byte 0xc5,0x78,0x29,0x70,0x60 # vmovaps %xmm14, 0x60(%rax) - .byte 0xc5,0x78,0x29,0x78,0x70 # vmovaps %xmm15, 0x70(%rax) -___ -$code.=<<___; - vmovdqa .LThree(%rip), $THREE - - vpxor $Ra, $Ra, $Ra - vpxor $Rb, $Rb, $Rb - - vmovdqa .LOne(%rip), $M0 - vmovdqa .LTwo(%rip), $M1 - vmovdqa .LThree(%rip), $M2 - - vmovd $index, %xmm1 - vpermd $INDEX, $Ra, $INDEX - # Skip index = 0, because it is implicitly the point at infinity - - mov \$21, %rax -.Lselect_loop_avx2_w7: - - vmovdqa 32*0($in_t), $T0a - vmovdqa 32*1($in_t), $T0b - - vmovdqa 32*2($in_t), $T1a - vmovdqa 32*3($in_t), $T1b - - vmovdqa 32*4($in_t), $T2a - vmovdqa 32*5($in_t), $T2b - - vpcmpeqd $INDEX, $M0, $TMP0 - vpcmpeqd $INDEX, $M1, $TMP1 - vpcmpeqd $INDEX, $M2, $TMP2 - - vpaddd $THREE, $M0, $M0 - vpaddd $THREE, $M1, $M1 - vpaddd $THREE, $M2, $M2 - lea 32*6($in_t), $in_t - - vpand $TMP0, $T0a, $T0a - vpand $TMP0, $T0b, $T0b - vpand $TMP1, $T1a, $T1a - vpand $TMP1, $T1b, $T1b - vpand $TMP2, $T2a, $T2a - vpand $TMP2, $T2b, $T2b - - vpxor $T0a, $Ra, $Ra - vpxor $T0b, $Rb, $Rb - vpxor $T1a, $Ra, $Ra - vpxor $T1b, $Rb, $Rb - vpxor $T2a, $Ra, $Ra - vpxor $T2b, $Rb, $Rb - - dec %rax - jnz .Lselect_loop_avx2_w7 - - - vmovdqa 32*0($in_t), $T0a - vmovdqa 32*1($in_t), $T0b - - vpcmpeqd $INDEX, $M0, $TMP0 - - vpand $TMP0, $T0a, $T0a - vpand $TMP0, $T0b, $T0b - - vpxor $T0a, $Ra, $Ra - vpxor $T0b, $Rb, $Rb - - vmovdqu $Ra, 32*0($val) - vmovdqu $Rb, 32*1($val) - vzeroupper -___ -$code.=<<___ if ($win64); - movaps (%rsp), %xmm6 - movaps 0x10(%rsp), %xmm7 - movaps 0x20(%rsp), %xmm8 - movaps 0x30(%rsp), %xmm9 - movaps 0x40(%rsp), %xmm10 - movaps 0x50(%rsp), %xmm11 - movaps 0x60(%rsp), %xmm12 - movaps 0x70(%rsp), %xmm13 - movaps 0x80(%rsp), %xmm14 - movaps 0x90(%rsp), %xmm15 - lea (%r11), %rsp -___ -$code.=<<___; - ret -.cfi_endproc -.LSEH_end_GFp_nistz256_avx2_select_w7: -.size GFp_nistz256_avx2_select_w7,.-GFp_nistz256_avx2_select_w7 -___ -} else { -$code.=<<___; -.globl GFp_nistz256_avx2_select_w7 -.type GFp_nistz256_avx2_select_w7,\@function,3 -.align 32 -GFp_nistz256_avx2_select_w7: - .byte 0x0f,0x0b # ud2 - ret -.size GFp_nistz256_avx2_select_w7,.-GFp_nistz256_avx2_select_w7 -___ -} -{{{ -######################################################################## -# This block implements higher level point_double, point_add and -# point_add_affine. The key to performance in this case is to allow -# out-of-order execution logic to overlap computations from next step -# with tail processing from current step. By using tailored calling -# sequence we minimize inter-step overhead to give processor better -# shot at overlapping operations... -# -# You will notice that input data is copied to stack. Trouble is that -# there are no registers to spare for holding original pointers and -# reloading them, pointers, would create undesired dependencies on -# effective addresses calculation paths. In other words it's too done -# to favour out-of-order execution logic. -# - -my ($r_ptr,$a_ptr,$b_org,$b_ptr)=("%rdi","%rsi","%rdx","%rbx"); -my ($acc0,$acc1,$acc2,$acc3,$acc4,$acc5,$acc6,$acc7)=map("%r$_",(8..15)); -my ($t0,$t1,$t2,$t3,$t4)=("%rax","%rbp","%rcx",$acc4,$acc4); -my ($poly1,$poly3)=($acc6,$acc7); - -sub load_for_mul () { -my ($a,$b,$src0) = @_; -my $bias = $src0 eq "%rax" ? 0 : -128; - -" mov $b, $src0 - lea $b, $b_ptr - mov 8*0+$a, $acc1 - mov 8*1+$a, $acc2 - lea $bias+$a, $a_ptr - mov 8*2+$a, $acc3 - mov 8*3+$a, $acc4" -} - -sub load_for_sqr () { -my ($a,$src0) = @_; -my $bias = $src0 eq "%rax" ? 0 : -128; - -" mov 8*0+$a, $src0 - mov 8*1+$a, $acc6 - lea $bias+$a, $a_ptr - mov 8*2+$a, $acc7 - mov 8*3+$a, $acc0" -} - - { -######################################################################## -# operate in 4-5-0-1 "name space" that matches multiplication output -# -my ($a0,$a1,$a2,$a3,$t3,$t4)=($acc4,$acc5,$acc0,$acc1,$acc2,$acc3); - -$code.=<<___; -.type __ecp_nistz256_add_toq,\@abi-omnipotent -.align 32 -__ecp_nistz256_add_toq: -.cfi_startproc - xor $t4,$t4 - add 8*0($b_ptr), $a0 - adc 8*1($b_ptr), $a1 - mov $a0, $t0 - adc 8*2($b_ptr), $a2 - adc 8*3($b_ptr), $a3 - mov $a1, $t1 - adc \$0, $t4 - - sub \$-1, $a0 - mov $a2, $t2 - sbb $poly1, $a1 - sbb \$0, $a2 - mov $a3, $t3 - sbb $poly3, $a3 - sbb \$0, $t4 - - cmovc $t0, $a0 - cmovc $t1, $a1 - mov $a0, 8*0($r_ptr) - cmovc $t2, $a2 - mov $a1, 8*1($r_ptr) - cmovc $t3, $a3 - mov $a2, 8*2($r_ptr) - mov $a3, 8*3($r_ptr) - - ret -.cfi_endproc -.size __ecp_nistz256_add_toq,.-__ecp_nistz256_add_toq - -.type __ecp_nistz256_sub_fromq,\@abi-omnipotent -.align 32 -__ecp_nistz256_sub_fromq: -.cfi_startproc - sub 8*0($b_ptr), $a0 - sbb 8*1($b_ptr), $a1 - mov $a0, $t0 - sbb 8*2($b_ptr), $a2 - sbb 8*3($b_ptr), $a3 - mov $a1, $t1 - sbb $t4, $t4 - - add \$-1, $a0 - mov $a2, $t2 - adc $poly1, $a1 - adc \$0, $a2 - mov $a3, $t3 - adc $poly3, $a3 - test $t4, $t4 - - cmovz $t0, $a0 - cmovz $t1, $a1 - mov $a0, 8*0($r_ptr) - cmovz $t2, $a2 - mov $a1, 8*1($r_ptr) - cmovz $t3, $a3 - mov $a2, 8*2($r_ptr) - mov $a3, 8*3($r_ptr) - - ret -.cfi_endproc -.size __ecp_nistz256_sub_fromq,.-__ecp_nistz256_sub_fromq - -.type __ecp_nistz256_subq,\@abi-omnipotent -.align 32 -__ecp_nistz256_subq: -.cfi_startproc - sub $a0, $t0 - sbb $a1, $t1 - mov $t0, $a0 - sbb $a2, $t2 - sbb $a3, $t3 - mov $t1, $a1 - sbb $t4, $t4 - - add \$-1, $t0 - mov $t2, $a2 - adc $poly1, $t1 - adc \$0, $t2 - mov $t3, $a3 - adc $poly3, $t3 - test $t4, $t4 - - cmovnz $t0, $a0 - cmovnz $t1, $a1 - cmovnz $t2, $a2 - cmovnz $t3, $a3 - - ret -.cfi_endproc -.size __ecp_nistz256_subq,.-__ecp_nistz256_subq - -.type __ecp_nistz256_mul_by_2q,\@abi-omnipotent -.align 32 -__ecp_nistz256_mul_by_2q: -.cfi_startproc - xor $t4, $t4 - add $a0, $a0 # a0:a3+a0:a3 - adc $a1, $a1 - mov $a0, $t0 - adc $a2, $a2 - adc $a3, $a3 - mov $a1, $t1 - adc \$0, $t4 - - sub \$-1, $a0 - mov $a2, $t2 - sbb $poly1, $a1 - sbb \$0, $a2 - mov $a3, $t3 - sbb $poly3, $a3 - sbb \$0, $t4 - - cmovc $t0, $a0 - cmovc $t1, $a1 - mov $a0, 8*0($r_ptr) - cmovc $t2, $a2 - mov $a1, 8*1($r_ptr) - cmovc $t3, $a3 - mov $a2, 8*2($r_ptr) - mov $a3, 8*3($r_ptr) - - ret -.cfi_endproc -.size __ecp_nistz256_mul_by_2q,.-__ecp_nistz256_mul_by_2q -___ - } -sub gen_double () { - my $x = shift; - my ($src0,$sfx,$bias); - my ($S,$M,$Zsqr,$in_x,$tmp0)=map(32*$_,(0..4)); - - if ($x ne "x") { - $src0 = "%rax"; - $sfx = ""; - $bias = 0; - -$code.=<<___; -.globl GFp_nistz256_point_double -.type GFp_nistz256_point_double,\@function,2 -.align 32 -GFp_nistz256_point_double: -.cfi_startproc -___ -$code.=<<___ if ($addx); - leaq GFp_ia32cap_P(%rip), %rcx - mov 8(%rcx), %rcx - and \$0x80100, %ecx - cmp \$0x80100, %ecx - je .Lpoint_doublex -___ - } else { - $src0 = "%rdx"; - $sfx = "x"; - $bias = 128; - -$code.=<<___; -.type GFp_nistz256_point_doublex,\@function,2 -.align 32 -GFp_nistz256_point_doublex: -.cfi_startproc -.Lpoint_doublex: -___ - } -$code.=<<___; - push %rbp -.cfi_push %rbp - push %rbx -.cfi_push %rbx - push %r12 -.cfi_push %r12 - push %r13 -.cfi_push %r13 - push %r14 -.cfi_push %r14 - push %r15 -.cfi_push %r15 - sub \$32*5+8, %rsp -.cfi_adjust_cfa_offset 32*5+8 -.Lpoint_double${x}_body: - -.Lpoint_double_shortcut$x: - movdqu 0x00($a_ptr), %xmm0 # copy *(P256_POINT *)$a_ptr.x - mov $a_ptr, $b_ptr # backup copy - movdqu 0x10($a_ptr), %xmm1 - mov 0x20+8*0($a_ptr), $acc4 # load in_y in "5-4-0-1" order - mov 0x20+8*1($a_ptr), $acc5 - mov 0x20+8*2($a_ptr), $acc0 - mov 0x20+8*3($a_ptr), $acc1 - mov .Lpoly+8*1(%rip), $poly1 - mov .Lpoly+8*3(%rip), $poly3 - movdqa %xmm0, $in_x(%rsp) - movdqa %xmm1, $in_x+0x10(%rsp) - lea 0x20($r_ptr), $acc2 - lea 0x40($r_ptr), $acc3 - movq $r_ptr, %xmm0 - movq $acc2, %xmm1 - movq $acc3, %xmm2 - - lea $S(%rsp), $r_ptr - call __ecp_nistz256_mul_by_2$x # p256_mul_by_2(S, in_y); - - mov 0x40+8*0($a_ptr), $src0 - mov 0x40+8*1($a_ptr), $acc6 - mov 0x40+8*2($a_ptr), $acc7 - mov 0x40+8*3($a_ptr), $acc0 - lea 0x40-$bias($a_ptr), $a_ptr - lea $Zsqr(%rsp), $r_ptr - call __ecp_nistz256_sqr_mont$x # p256_sqr_mont(Zsqr, in_z); - - `&load_for_sqr("$S(%rsp)", "$src0")` - lea $S(%rsp), $r_ptr - call __ecp_nistz256_sqr_mont$x # p256_sqr_mont(S, S); - - mov 0x20($b_ptr), $src0 # $b_ptr is still valid - mov 0x40+8*0($b_ptr), $acc1 - mov 0x40+8*1($b_ptr), $acc2 - mov 0x40+8*2($b_ptr), $acc3 - mov 0x40+8*3($b_ptr), $acc4 - lea 0x40-$bias($b_ptr), $a_ptr - lea 0x20($b_ptr), $b_ptr - movq %xmm2, $r_ptr - call __ecp_nistz256_mul_mont$x # p256_mul_mont(res_z, in_z, in_y); - call __ecp_nistz256_mul_by_2$x # p256_mul_by_2(res_z, res_z); - - mov $in_x+8*0(%rsp), $acc4 # "5-4-0-1" order - mov $in_x+8*1(%rsp), $acc5 - lea $Zsqr(%rsp), $b_ptr - mov $in_x+8*2(%rsp), $acc0 - mov $in_x+8*3(%rsp), $acc1 - lea $M(%rsp), $r_ptr - call __ecp_nistz256_add_to$x # p256_add(M, in_x, Zsqr); - - mov $in_x+8*0(%rsp), $acc4 # "5-4-0-1" order - mov $in_x+8*1(%rsp), $acc5 - lea $Zsqr(%rsp), $b_ptr - mov $in_x+8*2(%rsp), $acc0 - mov $in_x+8*3(%rsp), $acc1 - lea $Zsqr(%rsp), $r_ptr - call __ecp_nistz256_sub_from$x # p256_sub(Zsqr, in_x, Zsqr); - - `&load_for_sqr("$S(%rsp)", "$src0")` - movq %xmm1, $r_ptr - call __ecp_nistz256_sqr_mont$x # p256_sqr_mont(res_y, S); -___ -{ -######## GFp_nistz256_div_by_2(res_y, res_y); ########################## -# operate in 4-5-6-7 "name space" that matches squaring output -# -my ($poly1,$poly3)=($a_ptr,$t1); -my ($a0,$a1,$a2,$a3,$t3,$t4,$t1)=($acc4,$acc5,$acc6,$acc7,$acc0,$acc1,$acc2); - -$code.=<<___; - xor $t4, $t4 - mov $a0, $t0 - add \$-1, $a0 - mov $a1, $t1 - adc $poly1, $a1 - mov $a2, $t2 - adc \$0, $a2 - mov $a3, $t3 - adc $poly3, $a3 - adc \$0, $t4 - xor $a_ptr, $a_ptr # borrow $a_ptr - test \$1, $t0 - - cmovz $t0, $a0 - cmovz $t1, $a1 - cmovz $t2, $a2 - cmovz $t3, $a3 - cmovz $a_ptr, $t4 - - mov $a1, $t0 # a0:a3>>1 - shr \$1, $a0 - shl \$63, $t0 - mov $a2, $t1 - shr \$1, $a1 - or $t0, $a0 - shl \$63, $t1 - mov $a3, $t2 - shr \$1, $a2 - or $t1, $a1 - shl \$63, $t2 - mov $a0, 8*0($r_ptr) - shr \$1, $a3 - mov $a1, 8*1($r_ptr) - shl \$63, $t4 - or $t2, $a2 - or $t4, $a3 - mov $a2, 8*2($r_ptr) - mov $a3, 8*3($r_ptr) -___ -} -$code.=<<___; - `&load_for_mul("$M(%rsp)", "$Zsqr(%rsp)", "$src0")` - lea $M(%rsp), $r_ptr - call __ecp_nistz256_mul_mont$x # p256_mul_mont(M, M, Zsqr); - - lea $tmp0(%rsp), $r_ptr - call __ecp_nistz256_mul_by_2$x - - lea $M(%rsp), $b_ptr - lea $M(%rsp), $r_ptr - call __ecp_nistz256_add_to$x # p256_mul_by_3(M, M); - - `&load_for_mul("$S(%rsp)", "$in_x(%rsp)", "$src0")` - lea $S(%rsp), $r_ptr - call __ecp_nistz256_mul_mont$x # p256_mul_mont(S, S, in_x); - - lea $tmp0(%rsp), $r_ptr - call __ecp_nistz256_mul_by_2$x # p256_mul_by_2(tmp0, S); - - `&load_for_sqr("$M(%rsp)", "$src0")` - movq %xmm0, $r_ptr - call __ecp_nistz256_sqr_mont$x # p256_sqr_mont(res_x, M); - - lea $tmp0(%rsp), $b_ptr - mov $acc6, $acc0 # harmonize sqr output and sub input - mov $acc7, $acc1 - mov $a_ptr, $poly1 - mov $t1, $poly3 - call __ecp_nistz256_sub_from$x # p256_sub(res_x, res_x, tmp0); - - mov $S+8*0(%rsp), $t0 - mov $S+8*1(%rsp), $t1 - mov $S+8*2(%rsp), $t2 - mov $S+8*3(%rsp), $acc2 # "4-5-0-1" order - lea $S(%rsp), $r_ptr - call __ecp_nistz256_sub$x # p256_sub(S, S, res_x); - - mov $M(%rsp), $src0 - lea $M(%rsp), $b_ptr - mov $acc4, $acc6 # harmonize sub output and mul input - xor %ecx, %ecx - mov $acc4, $S+8*0(%rsp) # have to save:-( - mov $acc5, $acc2 - mov $acc5, $S+8*1(%rsp) - cmovz $acc0, $acc3 - mov $acc0, $S+8*2(%rsp) - lea $S-$bias(%rsp), $a_ptr - cmovz $acc1, $acc4 - mov $acc1, $S+8*3(%rsp) - mov $acc6, $acc1 - lea $S(%rsp), $r_ptr - call __ecp_nistz256_mul_mont$x # p256_mul_mont(S, S, M); - - movq %xmm1, $b_ptr - movq %xmm1, $r_ptr - call __ecp_nistz256_sub_from$x # p256_sub(res_y, S, res_y); - - lea 32*5+56(%rsp), %rsi -.cfi_def_cfa %rsi,8 - mov -48(%rsi),%r15 -.cfi_restore %r15 - mov -40(%rsi),%r14 -.cfi_restore %r14 - mov -32(%rsi),%r13 -.cfi_restore %r13 - mov -24(%rsi),%r12 -.cfi_restore %r12 - mov -16(%rsi),%rbx -.cfi_restore %rbx - mov -8(%rsi),%rbp -.cfi_restore %rbp - lea (%rsi),%rsp -.cfi_def_cfa_register %rsp -.Lpoint_double${x}_epilogue: - ret -.cfi_endproc -.size GFp_nistz256_point_double$sfx,.-GFp_nistz256_point_double$sfx -___ -} -&gen_double("q"); - -sub gen_add () { - my $x = shift; - my ($src0,$sfx,$bias); - my ($H,$Hsqr,$R,$Rsqr,$Hcub, - $U1,$U2,$S1,$S2, - $res_x,$res_y,$res_z, - $in1_x,$in1_y,$in1_z, - $in2_x,$in2_y,$in2_z)=map(32*$_,(0..17)); - my ($Z1sqr, $Z2sqr) = ($Hsqr, $Rsqr); - - if ($x ne "x") { - $src0 = "%rax"; - $sfx = ""; - $bias = 0; - -$code.=<<___; -.globl GFp_nistz256_point_add -.type GFp_nistz256_point_add,\@function,3 -.align 32 -GFp_nistz256_point_add: -.cfi_startproc -___ -$code.=<<___ if ($addx); - leaq GFp_ia32cap_P(%rip), %rcx - mov 8(%rcx), %rcx - and \$0x80100, %ecx - cmp \$0x80100, %ecx - je .Lpoint_addx -___ - } else { - $src0 = "%rdx"; - $sfx = "x"; - $bias = 128; - -$code.=<<___; -.type GFp_nistz256_point_addx,\@function,3 -.align 32 -GFp_nistz256_point_addx: -.cfi_startproc -.Lpoint_addx: -___ - } -$code.=<<___; - push %rbp -.cfi_push %rbp - push %rbx -.cfi_push %rbx - push %r12 -.cfi_push %r12 - push %r13 -.cfi_push %r13 - push %r14 -.cfi_push %r14 - push %r15 -.cfi_push %r15 - sub \$32*18+8, %rsp -.cfi_adjust_cfa_offset 32*18+8 -.Lpoint_add${x}_body: - - movdqu 0x00($a_ptr), %xmm0 # copy *(P256_POINT *)$a_ptr - movdqu 0x10($a_ptr), %xmm1 - movdqu 0x20($a_ptr), %xmm2 - movdqu 0x30($a_ptr), %xmm3 - movdqu 0x40($a_ptr), %xmm4 - movdqu 0x50($a_ptr), %xmm5 - mov $a_ptr, $b_ptr # reassign - mov $b_org, $a_ptr # reassign - movdqa %xmm0, $in1_x(%rsp) - movdqa %xmm1, $in1_x+0x10(%rsp) - movdqa %xmm2, $in1_y(%rsp) - movdqa %xmm3, $in1_y+0x10(%rsp) - movdqa %xmm4, $in1_z(%rsp) - movdqa %xmm5, $in1_z+0x10(%rsp) - por %xmm4, %xmm5 - - movdqu 0x00($a_ptr), %xmm0 # copy *(P256_POINT *)$b_ptr - pshufd \$0xb1, %xmm5, %xmm3 - movdqu 0x10($a_ptr), %xmm1 - movdqu 0x20($a_ptr), %xmm2 - por %xmm3, %xmm5 - movdqu 0x30($a_ptr), %xmm3 - mov 0x40+8*0($a_ptr), $src0 # load original in2_z - mov 0x40+8*1($a_ptr), $acc6 - mov 0x40+8*2($a_ptr), $acc7 - mov 0x40+8*3($a_ptr), $acc0 - movdqa %xmm0, $in2_x(%rsp) - pshufd \$0x1e, %xmm5, %xmm4 - movdqa %xmm1, $in2_x+0x10(%rsp) - movdqu 0x40($a_ptr),%xmm0 # in2_z again - movdqu 0x50($a_ptr),%xmm1 - movdqa %xmm2, $in2_y(%rsp) - movdqa %xmm3, $in2_y+0x10(%rsp) - por %xmm4, %xmm5 - pxor %xmm4, %xmm4 - por %xmm0, %xmm1 - movq $r_ptr, %xmm0 # save $r_ptr - - lea 0x40-$bias($a_ptr), $a_ptr # $a_ptr is still valid - mov $src0, $in2_z+8*0(%rsp) # make in2_z copy - mov $acc6, $in2_z+8*1(%rsp) - mov $acc7, $in2_z+8*2(%rsp) - mov $acc0, $in2_z+8*3(%rsp) - lea $Z2sqr(%rsp), $r_ptr # Z2^2 - call __ecp_nistz256_sqr_mont$x # p256_sqr_mont(Z2sqr, in2_z); - - pcmpeqd %xmm4, %xmm5 - pshufd \$0xb1, %xmm1, %xmm4 - por %xmm1, %xmm4 - pshufd \$0, %xmm5, %xmm5 # in1infty - pshufd \$0x1e, %xmm4, %xmm3 - por %xmm3, %xmm4 - pxor %xmm3, %xmm3 - pcmpeqd %xmm3, %xmm4 - pshufd \$0, %xmm4, %xmm4 # in2infty - mov 0x40+8*0($b_ptr), $src0 # load original in1_z - mov 0x40+8*1($b_ptr), $acc6 - mov 0x40+8*2($b_ptr), $acc7 - mov 0x40+8*3($b_ptr), $acc0 - movq $b_ptr, %xmm1 - - lea 0x40-$bias($b_ptr), $a_ptr - lea $Z1sqr(%rsp), $r_ptr # Z1^2 - call __ecp_nistz256_sqr_mont$x # p256_sqr_mont(Z1sqr, in1_z); - - `&load_for_mul("$Z2sqr(%rsp)", "$in2_z(%rsp)", "$src0")` - lea $S1(%rsp), $r_ptr # S1 = Z2^3 - call __ecp_nistz256_mul_mont$x # p256_mul_mont(S1, Z2sqr, in2_z); - - `&load_for_mul("$Z1sqr(%rsp)", "$in1_z(%rsp)", "$src0")` - lea $S2(%rsp), $r_ptr # S2 = Z1^3 - call __ecp_nistz256_mul_mont$x # p256_mul_mont(S2, Z1sqr, in1_z); - - `&load_for_mul("$S1(%rsp)", "$in1_y(%rsp)", "$src0")` - lea $S1(%rsp), $r_ptr # S1 = Y1*Z2^3 - call __ecp_nistz256_mul_mont$x # p256_mul_mont(S1, S1, in1_y); - - `&load_for_mul("$S2(%rsp)", "$in2_y(%rsp)", "$src0")` - lea $S2(%rsp), $r_ptr # S2 = Y2*Z1^3 - call __ecp_nistz256_mul_mont$x # p256_mul_mont(S2, S2, in2_y); - - lea $S1(%rsp), $b_ptr - lea $R(%rsp), $r_ptr # R = S2 - S1 - call __ecp_nistz256_sub_from$x # p256_sub(R, S2, S1); - - or $acc5, $acc4 # see if result is zero - movdqa %xmm4, %xmm2 - or $acc0, $acc4 - or $acc1, $acc4 - por %xmm5, %xmm2 # in1infty || in2infty - movq $acc4, %xmm3 - - `&load_for_mul("$Z2sqr(%rsp)", "$in1_x(%rsp)", "$src0")` - lea $U1(%rsp), $r_ptr # U1 = X1*Z2^2 - call __ecp_nistz256_mul_mont$x # p256_mul_mont(U1, in1_x, Z2sqr); - - `&load_for_mul("$Z1sqr(%rsp)", "$in2_x(%rsp)", "$src0")` - lea $U2(%rsp), $r_ptr # U2 = X2*Z1^2 - call __ecp_nistz256_mul_mont$x # p256_mul_mont(U2, in2_x, Z1sqr); - - lea $U1(%rsp), $b_ptr - lea $H(%rsp), $r_ptr # H = U2 - U1 - call __ecp_nistz256_sub_from$x # p256_sub(H, U2, U1); - - or $acc5, $acc4 # see if result is zero - or $acc0, $acc4 - or $acc1, $acc4 # !is_equal(U1, U2) - - movq %xmm2, $acc0 - movq %xmm3, $acc1 - or $acc0, $acc4 - .byte 0x3e # predict taken - jnz .Ladd_proceed$x # !is_equal(U1, U2) || in1infty || in2infty - - # We now know A = B or A = -B and neither is infinity. Compare the - # y-coordinates via S1 and S2. - test $acc1, $acc1 - jz .Ladd_double$x # is_equal(S1, S2) - - # A = -B, so the result is infinity. - # - # TODO(davidben): Does .Ladd_proceed handle this case? It seems to, in - # which case we should eliminate this special-case and simplify the - # timing analysis. - movq %xmm0, $r_ptr # restore $r_ptr - pxor %xmm0, %xmm0 - movdqu %xmm0, 0x00($r_ptr) - movdqu %xmm0, 0x10($r_ptr) - movdqu %xmm0, 0x20($r_ptr) - movdqu %xmm0, 0x30($r_ptr) - movdqu %xmm0, 0x40($r_ptr) - movdqu %xmm0, 0x50($r_ptr) - jmp .Ladd_done$x - -.align 32 -.Ladd_double$x: - movq %xmm1, $a_ptr # restore $a_ptr - movq %xmm0, $r_ptr # restore $r_ptr - add \$`32*(18-5)`, %rsp # difference in frame sizes -.cfi_adjust_cfa_offset `-32*(18-5)` - jmp .Lpoint_double_shortcut$x -.cfi_adjust_cfa_offset `32*(18-5)` - -.align 32 -.Ladd_proceed$x: - `&load_for_sqr("$R(%rsp)", "$src0")` - lea $Rsqr(%rsp), $r_ptr # R^2 - call __ecp_nistz256_sqr_mont$x # p256_sqr_mont(Rsqr, R); - - `&load_for_mul("$H(%rsp)", "$in1_z(%rsp)", "$src0")` - lea $res_z(%rsp), $r_ptr # Z3 = H*Z1*Z2 - call __ecp_nistz256_mul_mont$x # p256_mul_mont(res_z, H, in1_z); - - `&load_for_sqr("$H(%rsp)", "$src0")` - lea $Hsqr(%rsp), $r_ptr # H^2 - call __ecp_nistz256_sqr_mont$x # p256_sqr_mont(Hsqr, H); - - `&load_for_mul("$res_z(%rsp)", "$in2_z(%rsp)", "$src0")` - lea $res_z(%rsp), $r_ptr # Z3 = H*Z1*Z2 - call __ecp_nistz256_mul_mont$x # p256_mul_mont(res_z, res_z, in2_z); - - `&load_for_mul("$Hsqr(%rsp)", "$H(%rsp)", "$src0")` - lea $Hcub(%rsp), $r_ptr # H^3 - call __ecp_nistz256_mul_mont$x # p256_mul_mont(Hcub, Hsqr, H); - - `&load_for_mul("$Hsqr(%rsp)", "$U1(%rsp)", "$src0")` - lea $U2(%rsp), $r_ptr # U1*H^2 - call __ecp_nistz256_mul_mont$x # p256_mul_mont(U2, U1, Hsqr); -___ -{ -####################################################################### -# operate in 4-5-0-1 "name space" that matches multiplication output -# -my ($acc0,$acc1,$acc2,$acc3,$t3,$t4)=($acc4,$acc5,$acc0,$acc1,$acc2,$acc3); -my ($poly1, $poly3)=($acc6,$acc7); - -$code.=<<___; - #lea $U2(%rsp), $a_ptr - #lea $Hsqr(%rsp), $r_ptr # 2*U1*H^2 - #call __ecp_nistz256_mul_by_2 # ecp_nistz256_mul_by_2(Hsqr, U2); - - xor $t4, $t4 - add $acc0, $acc0 # a0:a3+a0:a3 - lea $Rsqr(%rsp), $a_ptr - adc $acc1, $acc1 - mov $acc0, $t0 - adc $acc2, $acc2 - adc $acc3, $acc3 - mov $acc1, $t1 - adc \$0, $t4 - - sub \$-1, $acc0 - mov $acc2, $t2 - sbb $poly1, $acc1 - sbb \$0, $acc2 - mov $acc3, $t3 - sbb $poly3, $acc3 - sbb \$0, $t4 - - cmovc $t0, $acc0 - mov 8*0($a_ptr), $t0 - cmovc $t1, $acc1 - mov 8*1($a_ptr), $t1 - cmovc $t2, $acc2 - mov 8*2($a_ptr), $t2 - cmovc $t3, $acc3 - mov 8*3($a_ptr), $t3 - - call __ecp_nistz256_sub$x # p256_sub(res_x, Rsqr, Hsqr); - - lea $Hcub(%rsp), $b_ptr - lea $res_x(%rsp), $r_ptr - call __ecp_nistz256_sub_from$x # p256_sub(res_x, res_x, Hcub); - - mov $U2+8*0(%rsp), $t0 - mov $U2+8*1(%rsp), $t1 - mov $U2+8*2(%rsp), $t2 - mov $U2+8*3(%rsp), $t3 - lea $res_y(%rsp), $r_ptr - - call __ecp_nistz256_sub$x # p256_sub(res_y, U2, res_x); - - mov $acc0, 8*0($r_ptr) # save the result, as - mov $acc1, 8*1($r_ptr) # __ecp_nistz256_sub doesn't - mov $acc2, 8*2($r_ptr) - mov $acc3, 8*3($r_ptr) -___ -} -$code.=<<___; - `&load_for_mul("$S1(%rsp)", "$Hcub(%rsp)", "$src0")` - lea $S2(%rsp), $r_ptr - call __ecp_nistz256_mul_mont$x # p256_mul_mont(S2, S1, Hcub); - - `&load_for_mul("$R(%rsp)", "$res_y(%rsp)", "$src0")` - lea $res_y(%rsp), $r_ptr - call __ecp_nistz256_mul_mont$x # p256_mul_mont(res_y, R, res_y); - - lea $S2(%rsp), $b_ptr - lea $res_y(%rsp), $r_ptr - call __ecp_nistz256_sub_from$x # p256_sub(res_y, res_y, S2); - - movq %xmm0, $r_ptr # restore $r_ptr - - movdqa %xmm5, %xmm0 # copy_conditional(res_z, in2_z, in1infty); - movdqa %xmm5, %xmm1 - pandn $res_z(%rsp), %xmm0 - movdqa %xmm5, %xmm2 - pandn $res_z+0x10(%rsp), %xmm1 - movdqa %xmm5, %xmm3 - pand $in2_z(%rsp), %xmm2 - pand $in2_z+0x10(%rsp), %xmm3 - por %xmm0, %xmm2 - por %xmm1, %xmm3 - - movdqa %xmm4, %xmm0 # copy_conditional(res_z, in1_z, in2infty); - movdqa %xmm4, %xmm1 - pandn %xmm2, %xmm0 - movdqa %xmm4, %xmm2 - pandn %xmm3, %xmm1 - movdqa %xmm4, %xmm3 - pand $in1_z(%rsp), %xmm2 - pand $in1_z+0x10(%rsp), %xmm3 - por %xmm0, %xmm2 - por %xmm1, %xmm3 - movdqu %xmm2, 0x40($r_ptr) - movdqu %xmm3, 0x50($r_ptr) - - movdqa %xmm5, %xmm0 # copy_conditional(res_x, in2_x, in1infty); - movdqa %xmm5, %xmm1 - pandn $res_x(%rsp), %xmm0 - movdqa %xmm5, %xmm2 - pandn $res_x+0x10(%rsp), %xmm1 - movdqa %xmm5, %xmm3 - pand $in2_x(%rsp), %xmm2 - pand $in2_x+0x10(%rsp), %xmm3 - por %xmm0, %xmm2 - por %xmm1, %xmm3 - - movdqa %xmm4, %xmm0 # copy_conditional(res_x, in1_x, in2infty); - movdqa %xmm4, %xmm1 - pandn %xmm2, %xmm0 - movdqa %xmm4, %xmm2 - pandn %xmm3, %xmm1 - movdqa %xmm4, %xmm3 - pand $in1_x(%rsp), %xmm2 - pand $in1_x+0x10(%rsp), %xmm3 - por %xmm0, %xmm2 - por %xmm1, %xmm3 - movdqu %xmm2, 0x00($r_ptr) - movdqu %xmm3, 0x10($r_ptr) - - movdqa %xmm5, %xmm0 # copy_conditional(res_y, in2_y, in1infty); - movdqa %xmm5, %xmm1 - pandn $res_y(%rsp), %xmm0 - movdqa %xmm5, %xmm2 - pandn $res_y+0x10(%rsp), %xmm1 - movdqa %xmm5, %xmm3 - pand $in2_y(%rsp), %xmm2 - pand $in2_y+0x10(%rsp), %xmm3 - por %xmm0, %xmm2 - por %xmm1, %xmm3 - - movdqa %xmm4, %xmm0 # copy_conditional(res_y, in1_y, in2infty); - movdqa %xmm4, %xmm1 - pandn %xmm2, %xmm0 - movdqa %xmm4, %xmm2 - pandn %xmm3, %xmm1 - movdqa %xmm4, %xmm3 - pand $in1_y(%rsp), %xmm2 - pand $in1_y+0x10(%rsp), %xmm3 - por %xmm0, %xmm2 - por %xmm1, %xmm3 - movdqu %xmm2, 0x20($r_ptr) - movdqu %xmm3, 0x30($r_ptr) - -.Ladd_done$x: - lea 32*18+56(%rsp), %rsi -.cfi_def_cfa %rsi,8 - mov -48(%rsi),%r15 -.cfi_restore %r15 - mov -40(%rsi),%r14 -.cfi_restore %r14 - mov -32(%rsi),%r13 -.cfi_restore %r13 - mov -24(%rsi),%r12 -.cfi_restore %r12 - mov -16(%rsi),%rbx -.cfi_restore %rbx - mov -8(%rsi),%rbp -.cfi_restore %rbp - lea (%rsi),%rsp -.cfi_def_cfa_register %rsp -.Lpoint_add${x}_epilogue: - ret -.cfi_endproc -.size GFp_nistz256_point_add$sfx,.-GFp_nistz256_point_add$sfx -___ -} -&gen_add("q"); - -sub gen_add_affine () { - my $x = shift; - my ($src0,$sfx,$bias); - my ($U2,$S2,$H,$R,$Hsqr,$Hcub,$Rsqr, - $res_x,$res_y,$res_z, - $in1_x,$in1_y,$in1_z, - $in2_x,$in2_y)=map(32*$_,(0..14)); - my $Z1sqr = $S2; - - if ($x ne "x") { - $src0 = "%rax"; - $sfx = ""; - $bias = 0; - -$code.=<<___; -.globl GFp_nistz256_point_add_affine -.type GFp_nistz256_point_add_affine,\@function,3 -.align 32 -GFp_nistz256_point_add_affine: -.cfi_startproc -___ -$code.=<<___ if ($addx); - leaq GFp_ia32cap_P(%rip), %rcx - mov 8(%rcx), %rcx - and \$0x80100, %ecx - cmp \$0x80100, %ecx - je .Lpoint_add_affinex -___ - } else { - $src0 = "%rdx"; - $sfx = "x"; - $bias = 128; - -$code.=<<___; -.type GFp_nistz256_point_add_affinex,\@function,3 -.align 32 -GFp_nistz256_point_add_affinex: -.cfi_startproc -.Lpoint_add_affinex: -___ - } -$code.=<<___; - push %rbp -.cfi_push %rbp - push %rbx -.cfi_push %rbx - push %r12 -.cfi_push %r12 - push %r13 -.cfi_push %r13 - push %r14 -.cfi_push %r14 - push %r15 -.cfi_push %r15 - sub \$32*15+8, %rsp -.cfi_adjust_cfa_offset 32*15+8 -.Ladd_affine${x}_body: - - movdqu 0x00($a_ptr), %xmm0 # copy *(P256_POINT *)$a_ptr - mov $b_org, $b_ptr # reassign - movdqu 0x10($a_ptr), %xmm1 - movdqu 0x20($a_ptr), %xmm2 - movdqu 0x30($a_ptr), %xmm3 - movdqu 0x40($a_ptr), %xmm4 - movdqu 0x50($a_ptr), %xmm5 - mov 0x40+8*0($a_ptr), $src0 # load original in1_z - mov 0x40+8*1($a_ptr), $acc6 - mov 0x40+8*2($a_ptr), $acc7 - mov 0x40+8*3($a_ptr), $acc0 - movdqa %xmm0, $in1_x(%rsp) - movdqa %xmm1, $in1_x+0x10(%rsp) - movdqa %xmm2, $in1_y(%rsp) - movdqa %xmm3, $in1_y+0x10(%rsp) - movdqa %xmm4, $in1_z(%rsp) - movdqa %xmm5, $in1_z+0x10(%rsp) - por %xmm4, %xmm5 - - movdqu 0x00($b_ptr), %xmm0 # copy *(P256_POINT_AFFINE *)$b_ptr - pshufd \$0xb1, %xmm5, %xmm3 - movdqu 0x10($b_ptr), %xmm1 - movdqu 0x20($b_ptr), %xmm2 - por %xmm3, %xmm5 - movdqu 0x30($b_ptr), %xmm3 - movdqa %xmm0, $in2_x(%rsp) - pshufd \$0x1e, %xmm5, %xmm4 - movdqa %xmm1, $in2_x+0x10(%rsp) - por %xmm0, %xmm1 - movq $r_ptr, %xmm0 # save $r_ptr - movdqa %xmm2, $in2_y(%rsp) - movdqa %xmm3, $in2_y+0x10(%rsp) - por %xmm2, %xmm3 - por %xmm4, %xmm5 - pxor %xmm4, %xmm4 - por %xmm1, %xmm3 - - lea 0x40-$bias($a_ptr), $a_ptr # $a_ptr is still valid - lea $Z1sqr(%rsp), $r_ptr # Z1^2 - call __ecp_nistz256_sqr_mont$x # p256_sqr_mont(Z1sqr, in1_z); - - pcmpeqd %xmm4, %xmm5 - pshufd \$0xb1, %xmm3, %xmm4 - mov 0x00($b_ptr), $src0 # $b_ptr is still valid - #lea 0x00($b_ptr), $b_ptr - mov $acc4, $acc1 # harmonize sqr output and mul input - por %xmm3, %xmm4 - pshufd \$0, %xmm5, %xmm5 # in1infty - pshufd \$0x1e, %xmm4, %xmm3 - mov $acc5, $acc2 - por %xmm3, %xmm4 - pxor %xmm3, %xmm3 - mov $acc6, $acc3 - pcmpeqd %xmm3, %xmm4 - pshufd \$0, %xmm4, %xmm4 # in2infty - - lea $Z1sqr-$bias(%rsp), $a_ptr - mov $acc7, $acc4 - lea $U2(%rsp), $r_ptr # U2 = X2*Z1^2 - call __ecp_nistz256_mul_mont$x # p256_mul_mont(U2, Z1sqr, in2_x); - - lea $in1_x(%rsp), $b_ptr - lea $H(%rsp), $r_ptr # H = U2 - U1 - call __ecp_nistz256_sub_from$x # p256_sub(H, U2, in1_x); - - `&load_for_mul("$Z1sqr(%rsp)", "$in1_z(%rsp)", "$src0")` - lea $S2(%rsp), $r_ptr # S2 = Z1^3 - call __ecp_nistz256_mul_mont$x # p256_mul_mont(S2, Z1sqr, in1_z); - - `&load_for_mul("$H(%rsp)", "$in1_z(%rsp)", "$src0")` - lea $res_z(%rsp), $r_ptr # Z3 = H*Z1*Z2 - call __ecp_nistz256_mul_mont$x # p256_mul_mont(res_z, H, in1_z); - - `&load_for_mul("$S2(%rsp)", "$in2_y(%rsp)", "$src0")` - lea $S2(%rsp), $r_ptr # S2 = Y2*Z1^3 - call __ecp_nistz256_mul_mont$x # p256_mul_mont(S2, S2, in2_y); - - lea $in1_y(%rsp), $b_ptr - lea $R(%rsp), $r_ptr # R = S2 - S1 - call __ecp_nistz256_sub_from$x # p256_sub(R, S2, in1_y); - - `&load_for_sqr("$H(%rsp)", "$src0")` - lea $Hsqr(%rsp), $r_ptr # H^2 - call __ecp_nistz256_sqr_mont$x # p256_sqr_mont(Hsqr, H); - - `&load_for_sqr("$R(%rsp)", "$src0")` - lea $Rsqr(%rsp), $r_ptr # R^2 - call __ecp_nistz256_sqr_mont$x # p256_sqr_mont(Rsqr, R); - - `&load_for_mul("$H(%rsp)", "$Hsqr(%rsp)", "$src0")` - lea $Hcub(%rsp), $r_ptr # H^3 - call __ecp_nistz256_mul_mont$x # p256_mul_mont(Hcub, Hsqr, H); - - `&load_for_mul("$Hsqr(%rsp)", "$in1_x(%rsp)", "$src0")` - lea $U2(%rsp), $r_ptr # U1*H^2 - call __ecp_nistz256_mul_mont$x # p256_mul_mont(U2, in1_x, Hsqr); -___ -{ -####################################################################### -# operate in 4-5-0-1 "name space" that matches multiplication output -# -my ($acc0,$acc1,$acc2,$acc3,$t3,$t4)=($acc4,$acc5,$acc0,$acc1,$acc2,$acc3); -my ($poly1, $poly3)=($acc6,$acc7); - -$code.=<<___; - #lea $U2(%rsp), $a_ptr - #lea $Hsqr(%rsp), $r_ptr # 2*U1*H^2 - #call __ecp_nistz256_mul_by_2 # ecp_nistz256_mul_by_2(Hsqr, U2); - - xor $t4, $t4 - add $acc0, $acc0 # a0:a3+a0:a3 - lea $Rsqr(%rsp), $a_ptr - adc $acc1, $acc1 - mov $acc0, $t0 - adc $acc2, $acc2 - adc $acc3, $acc3 - mov $acc1, $t1 - adc \$0, $t4 - - sub \$-1, $acc0 - mov $acc2, $t2 - sbb $poly1, $acc1 - sbb \$0, $acc2 - mov $acc3, $t3 - sbb $poly3, $acc3 - sbb \$0, $t4 - - cmovc $t0, $acc0 - mov 8*0($a_ptr), $t0 - cmovc $t1, $acc1 - mov 8*1($a_ptr), $t1 - cmovc $t2, $acc2 - mov 8*2($a_ptr), $t2 - cmovc $t3, $acc3 - mov 8*3($a_ptr), $t3 - - call __ecp_nistz256_sub$x # p256_sub(res_x, Rsqr, Hsqr); - - lea $Hcub(%rsp), $b_ptr - lea $res_x(%rsp), $r_ptr - call __ecp_nistz256_sub_from$x # p256_sub(res_x, res_x, Hcub); - - mov $U2+8*0(%rsp), $t0 - mov $U2+8*1(%rsp), $t1 - mov $U2+8*2(%rsp), $t2 - mov $U2+8*3(%rsp), $t3 - lea $H(%rsp), $r_ptr - - call __ecp_nistz256_sub$x # p256_sub(H, U2, res_x); - - mov $acc0, 8*0($r_ptr) # save the result, as - mov $acc1, 8*1($r_ptr) # __ecp_nistz256_sub doesn't - mov $acc2, 8*2($r_ptr) - mov $acc3, 8*3($r_ptr) -___ -} -$code.=<<___; - `&load_for_mul("$Hcub(%rsp)", "$in1_y(%rsp)", "$src0")` - lea $S2(%rsp), $r_ptr - call __ecp_nistz256_mul_mont$x # p256_mul_mont(S2, Hcub, in1_y); - - `&load_for_mul("$H(%rsp)", "$R(%rsp)", "$src0")` - lea $H(%rsp), $r_ptr - call __ecp_nistz256_mul_mont$x # p256_mul_mont(H, H, R); - - lea $S2(%rsp), $b_ptr - lea $res_y(%rsp), $r_ptr - call __ecp_nistz256_sub_from$x # p256_sub(res_y, H, S2); - - movq %xmm0, $r_ptr # restore $r_ptr - - movdqa %xmm5, %xmm0 # copy_conditional(res_z, ONE, in1infty); - movdqa %xmm5, %xmm1 - pandn $res_z(%rsp), %xmm0 - movdqa %xmm5, %xmm2 - pandn $res_z+0x10(%rsp), %xmm1 - movdqa %xmm5, %xmm3 - pand .LONE_mont(%rip), %xmm2 - pand .LONE_mont+0x10(%rip), %xmm3 - por %xmm0, %xmm2 - por %xmm1, %xmm3 - - movdqa %xmm4, %xmm0 # copy_conditional(res_z, in1_z, in2infty); - movdqa %xmm4, %xmm1 - pandn %xmm2, %xmm0 - movdqa %xmm4, %xmm2 - pandn %xmm3, %xmm1 - movdqa %xmm4, %xmm3 - pand $in1_z(%rsp), %xmm2 - pand $in1_z+0x10(%rsp), %xmm3 - por %xmm0, %xmm2 - por %xmm1, %xmm3 - movdqu %xmm2, 0x40($r_ptr) - movdqu %xmm3, 0x50($r_ptr) - - movdqa %xmm5, %xmm0 # copy_conditional(res_x, in2_x, in1infty); - movdqa %xmm5, %xmm1 - pandn $res_x(%rsp), %xmm0 - movdqa %xmm5, %xmm2 - pandn $res_x+0x10(%rsp), %xmm1 - movdqa %xmm5, %xmm3 - pand $in2_x(%rsp), %xmm2 - pand $in2_x+0x10(%rsp), %xmm3 - por %xmm0, %xmm2 - por %xmm1, %xmm3 - - movdqa %xmm4, %xmm0 # copy_conditional(res_x, in1_x, in2infty); - movdqa %xmm4, %xmm1 - pandn %xmm2, %xmm0 - movdqa %xmm4, %xmm2 - pandn %xmm3, %xmm1 - movdqa %xmm4, %xmm3 - pand $in1_x(%rsp), %xmm2 - pand $in1_x+0x10(%rsp), %xmm3 - por %xmm0, %xmm2 - por %xmm1, %xmm3 - movdqu %xmm2, 0x00($r_ptr) - movdqu %xmm3, 0x10($r_ptr) - - movdqa %xmm5, %xmm0 # copy_conditional(res_y, in2_y, in1infty); - movdqa %xmm5, %xmm1 - pandn $res_y(%rsp), %xmm0 - movdqa %xmm5, %xmm2 - pandn $res_y+0x10(%rsp), %xmm1 - movdqa %xmm5, %xmm3 - pand $in2_y(%rsp), %xmm2 - pand $in2_y+0x10(%rsp), %xmm3 - por %xmm0, %xmm2 - por %xmm1, %xmm3 - - movdqa %xmm4, %xmm0 # copy_conditional(res_y, in1_y, in2infty); - movdqa %xmm4, %xmm1 - pandn %xmm2, %xmm0 - movdqa %xmm4, %xmm2 - pandn %xmm3, %xmm1 - movdqa %xmm4, %xmm3 - pand $in1_y(%rsp), %xmm2 - pand $in1_y+0x10(%rsp), %xmm3 - por %xmm0, %xmm2 - por %xmm1, %xmm3 - movdqu %xmm2, 0x20($r_ptr) - movdqu %xmm3, 0x30($r_ptr) - - lea 32*15+56(%rsp), %rsi -.cfi_def_cfa %rsi,8 - mov -48(%rsi),%r15 -.cfi_restore %r15 - mov -40(%rsi),%r14 -.cfi_restore %r14 - mov -32(%rsi),%r13 -.cfi_restore %r13 - mov -24(%rsi),%r12 -.cfi_restore %r12 - mov -16(%rsi),%rbx -.cfi_restore %rbx - mov -8(%rsi),%rbp -.cfi_restore %rbp - lea (%rsi),%rsp -.cfi_def_cfa_register %rsp -.Ladd_affine${x}_epilogue: - ret -.cfi_endproc -.size GFp_nistz256_point_add_affine$sfx,.-GFp_nistz256_point_add_affine$sfx -___ -} -&gen_add_affine("q"); - -######################################################################## -# AD*X magic -# -if ($addx) { { -######################################################################## -# operate in 4-5-0-1 "name space" that matches multiplication output -# -my ($a0,$a1,$a2,$a3,$t3,$t4)=($acc4,$acc5,$acc0,$acc1,$acc2,$acc3); - -$code.=<<___; -.type __ecp_nistz256_add_tox,\@abi-omnipotent -.align 32 -__ecp_nistz256_add_tox: -.cfi_startproc - xor $t4, $t4 - adc 8*0($b_ptr), $a0 - adc 8*1($b_ptr), $a1 - mov $a0, $t0 - adc 8*2($b_ptr), $a2 - adc 8*3($b_ptr), $a3 - mov $a1, $t1 - adc \$0, $t4 - - xor $t3, $t3 - sbb \$-1, $a0 - mov $a2, $t2 - sbb $poly1, $a1 - sbb \$0, $a2 - mov $a3, $t3 - sbb $poly3, $a3 - sbb \$0, $t4 - - cmovc $t0, $a0 - cmovc $t1, $a1 - mov $a0, 8*0($r_ptr) - cmovc $t2, $a2 - mov $a1, 8*1($r_ptr) - cmovc $t3, $a3 - mov $a2, 8*2($r_ptr) - mov $a3, 8*3($r_ptr) - - ret -.cfi_endproc -.size __ecp_nistz256_add_tox,.-__ecp_nistz256_add_tox - -.type __ecp_nistz256_sub_fromx,\@abi-omnipotent -.align 32 -__ecp_nistz256_sub_fromx: -.cfi_startproc - xor $t4, $t4 - sbb 8*0($b_ptr), $a0 - sbb 8*1($b_ptr), $a1 - mov $a0, $t0 - sbb 8*2($b_ptr), $a2 - sbb 8*3($b_ptr), $a3 - mov $a1, $t1 - sbb \$0, $t4 - - xor $t3, $t3 - adc \$-1, $a0 - mov $a2, $t2 - adc $poly1, $a1 - adc \$0, $a2 - mov $a3, $t3 - adc $poly3, $a3 - - bt \$0, $t4 - cmovnc $t0, $a0 - cmovnc $t1, $a1 - mov $a0, 8*0($r_ptr) - cmovnc $t2, $a2 - mov $a1, 8*1($r_ptr) - cmovnc $t3, $a3 - mov $a2, 8*2($r_ptr) - mov $a3, 8*3($r_ptr) - - ret -.cfi_endproc -.size __ecp_nistz256_sub_fromx,.-__ecp_nistz256_sub_fromx - -.type __ecp_nistz256_subx,\@abi-omnipotent -.align 32 -__ecp_nistz256_subx: -.cfi_startproc - xor $t4, $t4 - sbb $a0, $t0 - sbb $a1, $t1 - mov $t0, $a0 - sbb $a2, $t2 - sbb $a3, $t3 - mov $t1, $a1 - sbb \$0, $t4 - - xor $a3 ,$a3 - adc \$-1, $t0 - mov $t2, $a2 - adc $poly1, $t1 - adc \$0, $t2 - mov $t3, $a3 - adc $poly3, $t3 - - bt \$0, $t4 - cmovc $t0, $a0 - cmovc $t1, $a1 - cmovc $t2, $a2 - cmovc $t3, $a3 - - ret -.cfi_endproc -.size __ecp_nistz256_subx,.-__ecp_nistz256_subx - -.type __ecp_nistz256_mul_by_2x,\@abi-omnipotent -.align 32 -__ecp_nistz256_mul_by_2x: -.cfi_startproc - xor $t4, $t4 - adc $a0, $a0 # a0:a3+a0:a3 - adc $a1, $a1 - mov $a0, $t0 - adc $a2, $a2 - adc $a3, $a3 - mov $a1, $t1 - adc \$0, $t4 - - xor $t3, $t3 - sbb \$-1, $a0 - mov $a2, $t2 - sbb $poly1, $a1 - sbb \$0, $a2 - mov $a3, $t3 - sbb $poly3, $a3 - sbb \$0, $t4 - - cmovc $t0, $a0 - cmovc $t1, $a1 - mov $a0, 8*0($r_ptr) - cmovc $t2, $a2 - mov $a1, 8*1($r_ptr) - cmovc $t3, $a3 - mov $a2, 8*2($r_ptr) - mov $a3, 8*3($r_ptr) - - ret -.cfi_endproc -.size __ecp_nistz256_mul_by_2x,.-__ecp_nistz256_mul_by_2x -___ - } -&gen_double("x"); -&gen_add("x"); -&gen_add_affine("x"); -} -}}} - -# EXCEPTION_DISPOSITION handler (EXCEPTION_RECORD *rec,ULONG64 frame, -# CONTEXT *context,DISPATCHER_CONTEXT *disp) -if ($win64) { -$rec="%rcx"; -$frame="%rdx"; -$context="%r8"; -$disp="%r9"; - -$code.=<<___; -.extern __imp_RtlVirtualUnwind - -.type short_handler,\@abi-omnipotent -.align 16 -short_handler: - push %rsi - push %rdi - push %rbx - push %rbp - push %r12 - push %r13 - push %r14 - push %r15 - pushfq - sub \$64,%rsp - - mov 120($context),%rax # pull context->Rax - mov 248($context),%rbx # pull context->Rip - - mov 8($disp),%rsi # disp->ImageBase - mov 56($disp),%r11 # disp->HandlerData - - mov 0(%r11),%r10d # HandlerData[0] - lea (%rsi,%r10),%r10 # end of prologue label - cmp %r10,%rbx # context->RipRsp - - mov 4(%r11),%r10d # HandlerData[1] - lea (%rsi,%r10),%r10 # epilogue label - cmp %r10,%rbx # context->Rip>=epilogue label - jae .Lcommon_seh_tail - - lea 16(%rax),%rax - - mov -8(%rax),%r12 - mov -16(%rax),%r13 - mov %r12,216($context) # restore context->R12 - mov %r13,224($context) # restore context->R13 - - jmp .Lcommon_seh_tail -.size short_handler,.-short_handler - -.type full_handler,\@abi-omnipotent -.align 16 -full_handler: - push %rsi - push %rdi - push %rbx - push %rbp - push %r12 - push %r13 - push %r14 - push %r15 - pushfq - sub \$64,%rsp - - mov 120($context),%rax # pull context->Rax - mov 248($context),%rbx # pull context->Rip - - mov 8($disp),%rsi # disp->ImageBase - mov 56($disp),%r11 # disp->HandlerData - - mov 0(%r11),%r10d # HandlerData[0] - lea (%rsi,%r10),%r10 # end of prologue label - cmp %r10,%rbx # context->RipRsp - - mov 4(%r11),%r10d # HandlerData[1] - lea (%rsi,%r10),%r10 # epilogue label - cmp %r10,%rbx # context->Rip>=epilogue label - jae .Lcommon_seh_tail - - mov 8(%r11),%r10d # HandlerData[2] - lea (%rax,%r10),%rax - - mov -8(%rax),%rbp - mov -16(%rax),%rbx - mov -24(%rax),%r12 - mov -32(%rax),%r13 - mov -40(%rax),%r14 - mov -48(%rax),%r15 - mov %rbx,144($context) # restore context->Rbx - mov %rbp,160($context) # restore context->Rbp - mov %r12,216($context) # restore context->R12 - mov %r13,224($context) # restore context->R13 - mov %r14,232($context) # restore context->R14 - mov %r15,240($context) # restore context->R15 - -.Lcommon_seh_tail: - mov 8(%rax),%rdi - mov 16(%rax),%rsi - mov %rax,152($context) # restore context->Rsp - mov %rsi,168($context) # restore context->Rsi - mov %rdi,176($context) # restore context->Rdi - - mov 40($disp),%rdi # disp->ContextRecord - mov $context,%rsi # context - mov \$154,%ecx # sizeof(CONTEXT) - .long 0xa548f3fc # cld; rep movsq - - mov $disp,%rsi - xor %rcx,%rcx # arg1, UNW_FLAG_NHANDLER - mov 8(%rsi),%rdx # arg2, disp->ImageBase - mov 0(%rsi),%r8 # arg3, disp->ControlPc - mov 16(%rsi),%r9 # arg4, disp->FunctionEntry - mov 40(%rsi),%r10 # disp->ContextRecord - lea 56(%rsi),%r11 # &disp->HandlerData - lea 24(%rsi),%r12 # &disp->EstablisherFrame - mov %r10,32(%rsp) # arg5 - mov %r11,40(%rsp) # arg6 - mov %r12,48(%rsp) # arg7 - mov %rcx,56(%rsp) # arg8, (NULL) - call *__imp_RtlVirtualUnwind(%rip) - - mov \$1,%eax # ExceptionContinueSearch - add \$64,%rsp - popfq - pop %r15 - pop %r14 - pop %r13 - pop %r12 - pop %rbp - pop %rbx - pop %rdi - pop %rsi - ret -.size full_handler,.-full_handler - -.section .pdata -.align 4 - .rva .LSEH_begin_GFp_nistz256_neg - .rva .LSEH_end_GFp_nistz256_neg - .rva .LSEH_info_GFp_nistz256_neg - - .rva .LSEH_begin_GFp_p256_scalar_mul_mont - .rva .LSEH_end_GFp_p256_scalar_mul_mont - .rva .LSEH_info_GFp_p256_scalar_mul_mont - - .rva .LSEH_begin_GFp_p256_scalar_sqr_rep_mont - .rva .LSEH_end_GFp_p256_scalar_sqr_rep_mont - .rva .LSEH_info_GFp_p256_scalar_sqr_rep_mont -___ -$code.=<<___ if ($addx); - .rva .LSEH_begin_ecp_nistz256_ord_mul_montx - .rva .LSEH_end_ecp_nistz256_ord_mul_montx - .rva .LSEH_info_ecp_nistz256_ord_mul_montx - - .rva .LSEH_begin_ecp_nistz256_ord_sqr_montx - .rva .LSEH_end_ecp_nistz256_ord_sqr_montx - .rva .LSEH_info_ecp_nistz256_ord_sqr_montx -___ -$code.=<<___; - .rva .LSEH_begin_GFp_nistz256_mul_mont - .rva .LSEH_end_GFp_nistz256_mul_mont - .rva .LSEH_info_GFp_nistz256_mul_mont - - .rva .LSEH_begin_GFp_nistz256_sqr_mont - .rva .LSEH_end_GFp_nistz256_sqr_mont - .rva .LSEH_info_GFp_nistz256_sqr_mont - - .rva .LSEH_begin_GFp_nistz256_select_w5 - .rva .LSEH_end_GFp_nistz256_select_w5 - .rva .LSEH_info_GFp_nistz256_select_wX - - .rva .LSEH_begin_GFp_nistz256_select_w7 - .rva .LSEH_end_GFp_nistz256_select_w7 - .rva .LSEH_info_GFp_nistz256_select_wX -___ -$code.=<<___ if ($avx>1); - .rva .LSEH_begin_GFp_nistz256_avx2_select_w5 - .rva .LSEH_end_GFp_nistz256_avx2_select_w5 - .rva .LSEH_info_GFp_nistz256_avx2_select_wX - - .rva .LSEH_begin_GFp_nistz256_avx2_select_w7 - .rva .LSEH_end_GFp_nistz256_avx2_select_w7 - .rva .LSEH_info_GFp_nistz256_avx2_select_wX -___ -$code.=<<___; - .rva .LSEH_begin_GFp_nistz256_point_double - .rva .LSEH_end_GFp_nistz256_point_double - .rva .LSEH_info_GFp_nistz256_point_double - - .rva .LSEH_begin_GFp_nistz256_point_add - .rva .LSEH_end_GFp_nistz256_point_add - .rva .LSEH_info_GFp_nistz256_point_add - - .rva .LSEH_begin_GFp_nistz256_point_add_affine - .rva .LSEH_end_GFp_nistz256_point_add_affine - .rva .LSEH_info_GFp_nistz256_point_add_affine -___ -$code.=<<___ if ($addx); - .rva .LSEH_begin_GFp_nistz256_point_doublex - .rva .LSEH_end_GFp_nistz256_point_doublex - .rva .LSEH_info_GFp_nistz256_point_doublex - - .rva .LSEH_begin_GFp_nistz256_point_addx - .rva .LSEH_end_GFp_nistz256_point_addx - .rva .LSEH_info_GFp_nistz256_point_addx - - .rva .LSEH_begin_GFp_nistz256_point_add_affinex - .rva .LSEH_end_GFp_nistz256_point_add_affinex - .rva .LSEH_info_GFp_nistz256_point_add_affinex -___ -$code.=<<___; - -.section .xdata -.align 8 -.LSEH_info_GFp_nistz256_neg: - .byte 9,0,0,0 - .rva short_handler - .rva .Lneg_body,.Lneg_epilogue # HandlerData[] -.LSEH_info_GFp_p256_scalar_mul_mont: - .byte 9,0,0,0 - .rva full_handler - .rva .Lord_mul_body,.Lord_mul_epilogue # HandlerData[] - .long 48,0 -.LSEH_info_GFp_p256_scalar_sqr_rep_mont: - .byte 9,0,0,0 - .rva full_handler - .rva .Lord_sqr_body,.Lord_sqr_epilogue # HandlerData[] - .long 48,0 -___ -$code.=<<___ if ($addx); -.LSEH_info_ecp_nistz256_ord_mul_montx: - .byte 9,0,0,0 - .rva full_handler - .rva .Lord_mulx_body,.Lord_mulx_epilogue # HandlerData[] - .long 48,0 -.LSEH_info_ecp_nistz256_ord_sqr_montx: - .byte 9,0,0,0 - .rva full_handler - .rva .Lord_sqrx_body,.Lord_sqrx_epilogue # HandlerData[] - .long 48,0 -___ -$code.=<<___; -.LSEH_info_GFp_nistz256_mul_mont: - .byte 9,0,0,0 - .rva full_handler - .rva .Lmul_body,.Lmul_epilogue # HandlerData[] - .long 48,0 -.LSEH_info_GFp_nistz256_sqr_mont: - .byte 9,0,0,0 - .rva full_handler - .rva .Lsqr_body,.Lsqr_epilogue # HandlerData[] - .long 48,0 -.LSEH_info_GFp_nistz256_select_wX: - .byte 0x01,0x33,0x16,0x00 - .byte 0x33,0xf8,0x09,0x00 #movaps 0x90(rsp),xmm15 - .byte 0x2e,0xe8,0x08,0x00 #movaps 0x80(rsp),xmm14 - .byte 0x29,0xd8,0x07,0x00 #movaps 0x70(rsp),xmm13 - .byte 0x24,0xc8,0x06,0x00 #movaps 0x60(rsp),xmm12 - .byte 0x1f,0xb8,0x05,0x00 #movaps 0x50(rsp),xmm11 - .byte 0x1a,0xa8,0x04,0x00 #movaps 0x40(rsp),xmm10 - .byte 0x15,0x98,0x03,0x00 #movaps 0x30(rsp),xmm9 - .byte 0x10,0x88,0x02,0x00 #movaps 0x20(rsp),xmm8 - .byte 0x0c,0x78,0x01,0x00 #movaps 0x10(rsp),xmm7 - .byte 0x08,0x68,0x00,0x00 #movaps 0x00(rsp),xmm6 - .byte 0x04,0x01,0x15,0x00 #sub rsp,0xa8 - .align 8 -___ -$code.=<<___ if ($avx>1); -.LSEH_info_GFp_nistz256_avx2_select_wX: - .byte 0x01,0x36,0x17,0x0b - .byte 0x36,0xf8,0x09,0x00 # vmovaps 0x90(rsp),xmm15 - .byte 0x31,0xe8,0x08,0x00 # vmovaps 0x80(rsp),xmm14 - .byte 0x2c,0xd8,0x07,0x00 # vmovaps 0x70(rsp),xmm13 - .byte 0x27,0xc8,0x06,0x00 # vmovaps 0x60(rsp),xmm12 - .byte 0x22,0xb8,0x05,0x00 # vmovaps 0x50(rsp),xmm11 - .byte 0x1d,0xa8,0x04,0x00 # vmovaps 0x40(rsp),xmm10 - .byte 0x18,0x98,0x03,0x00 # vmovaps 0x30(rsp),xmm9 - .byte 0x13,0x88,0x02,0x00 # vmovaps 0x20(rsp),xmm8 - .byte 0x0e,0x78,0x01,0x00 # vmovaps 0x10(rsp),xmm7 - .byte 0x09,0x68,0x00,0x00 # vmovaps 0x00(rsp),xmm6 - .byte 0x04,0x01,0x15,0x00 # sub rsp,0xa8 - .byte 0x00,0xb3,0x00,0x00 # set_frame r11 - .align 8 -___ -$code.=<<___; -.LSEH_info_GFp_nistz256_point_double: - .byte 9,0,0,0 - .rva full_handler - .rva .Lpoint_doubleq_body,.Lpoint_doubleq_epilogue # HandlerData[] - .long 32*5+56,0 -.LSEH_info_GFp_nistz256_point_add: - .byte 9,0,0,0 - .rva full_handler - .rva .Lpoint_addq_body,.Lpoint_addq_epilogue # HandlerData[] - .long 32*18+56,0 -.LSEH_info_GFp_nistz256_point_add_affine: - .byte 9,0,0,0 - .rva full_handler - .rva .Ladd_affineq_body,.Ladd_affineq_epilogue # HandlerData[] - .long 32*15+56,0 -___ -$code.=<<___ if ($addx); -.align 8 -.LSEH_info_GFp_nistz256_point_doublex: - .byte 9,0,0,0 - .rva full_handler - .rva .Lpoint_doublex_body,.Lpoint_doublex_epilogue # HandlerData[] - .long 32*5+56,0 -.LSEH_info_GFp_nistz256_point_addx: - .byte 9,0,0,0 - .rva full_handler - .rva .Lpoint_addx_body,.Lpoint_addx_epilogue # HandlerData[] - .long 32*18+56,0 -.LSEH_info_GFp_nistz256_point_add_affinex: - .byte 9,0,0,0 - .rva full_handler - .rva .Ladd_affinex_body,.Ladd_affinex_epilogue # HandlerData[] - .long 32*15+56,0 -___ -} - -$code =~ s/\`([^\`]*)\`/eval $1/gem; -print $code; -close STDOUT or die "error closing STDOUT"; diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/ec/ecp_nistz256.c temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/ec/ecp_nistz256.c --- temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/ec/ecp_nistz256.c 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/ec/ecp_nistz256.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,349 +0,0 @@ -/* Copyright (c) 2014, Intel Corporation. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY - * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION - * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ - -/* Developers and authors: - * Shay Gueron (1, 2), and Vlad Krasnov (1) - * (1) Intel Corporation, Israel Development Center - * (2) University of Haifa - * Reference: - * Shay Gueron and Vlad Krasnov - * "Fast Prime Field Elliptic Curve Cryptography with 256 Bit Primes" - * http://eprint.iacr.org/2013/816 */ - -#include "ecp_nistz256.h" - -#include "ecp_nistz.h" -#include "../bn/internal.h" -#include "../../limbs/limbs.inl" - -#if defined(__GNUC__) -#pragma GCC diagnostic ignored "-Wsign-conversion" -#endif - -/* Functions implemented in assembly */ -/* Modular neg: res = -a mod P */ -void GFp_nistz256_neg(Limb res[P256_LIMBS], const Limb a[P256_LIMBS]); - - -/* One converted into the Montgomery domain */ -static const Limb ONE[P256_LIMBS] = { - TOBN(0x00000000, 0x00000001), TOBN(0xffffffff, 0x00000000), - TOBN(0xffffffff, 0xffffffff), TOBN(0x00000000, 0xfffffffe), -}; - -static void copy_conditional(Limb dst[P256_LIMBS], - const Limb src[P256_LIMBS], Limb move) { - Limb mask1 = move; - Limb mask2 = ~mask1; - - dst[0] = (src[0] & mask1) ^ (dst[0] & mask2); - dst[1] = (src[1] & mask1) ^ (dst[1] & mask2); - dst[2] = (src[2] & mask1) ^ (dst[2] & mask2); - dst[3] = (src[3] & mask1) ^ (dst[3] & mask2); - if (P256_LIMBS == 8) { - dst[4] = (src[4] & mask1) ^ (dst[4] & mask2); - dst[5] = (src[5] & mask1) ^ (dst[5] & mask2); - dst[6] = (src[6] & mask1) ^ (dst[6] & mask2); - dst[7] = (src[7] & mask1) ^ (dst[7] & mask2); - } -} - -void GFp_nistz256_point_double(P256_POINT *r, const P256_POINT *a); - -#if defined(GFp_USE_LARGE_TABLE) -void GFp_nistz256_point_add_affine(P256_POINT *r, const P256_POINT *a, - const P256_POINT_AFFINE *b); -#endif - -void GFp_nistz256_point_add(P256_POINT *r, const P256_POINT *a, - const P256_POINT *b); - -// |GFp_nistz256_point_add| is defined in assembly language in X86-64 only. -#if !defined(OPENSSL_X86_64) - -static const BN_ULONG Q[P256_LIMBS] = { - TOBN(0xffffffff, 0xffffffff), - TOBN(0x00000000, 0xffffffff), - TOBN(0x00000000, 0x00000000), - TOBN(0xffffffff, 0x00000001), -}; - -static inline Limb is_equal(const Limb a[P256_LIMBS], const Limb b[P256_LIMBS]) { - return LIMBS_equal(a, b, P256_LIMBS); -} - -static inline Limb is_zero(const BN_ULONG a[P256_LIMBS]) { - return LIMBS_are_zero(a, P256_LIMBS); -} - -static inline void elem_mul_by_2(Limb r[P256_LIMBS], const Limb a[P256_LIMBS]) { - LIMBS_shl_mod(r, a, Q, P256_LIMBS); -} - -static inline void elem_mul_mont(Limb r[P256_LIMBS], const Limb a[P256_LIMBS], - const Limb b[P256_LIMBS]) { - GFp_nistz256_mul_mont(r, a, b); -} - -static inline void elem_sqr_mont(Limb r[P256_LIMBS], const Limb a[P256_LIMBS]) { - GFp_nistz256_sqr_mont(r, a); -} - -static inline void elem_sub(Limb r[P256_LIMBS], const Limb a[P256_LIMBS], - const Limb b[P256_LIMBS]) { - LIMBS_sub_mod(r, a, b, Q, P256_LIMBS); -} - -/* Point addition: r = a+b */ -void GFp_nistz256_point_add(P256_POINT *r, const P256_POINT *a, const P256_POINT *b) { - BN_ULONG U2[P256_LIMBS], S2[P256_LIMBS]; - BN_ULONG U1[P256_LIMBS], S1[P256_LIMBS]; - BN_ULONG Z1sqr[P256_LIMBS]; - BN_ULONG Z2sqr[P256_LIMBS]; - BN_ULONG H[P256_LIMBS], R[P256_LIMBS]; - BN_ULONG Hsqr[P256_LIMBS]; - BN_ULONG Rsqr[P256_LIMBS]; - BN_ULONG Hcub[P256_LIMBS]; - - BN_ULONG res_x[P256_LIMBS]; - BN_ULONG res_y[P256_LIMBS]; - BN_ULONG res_z[P256_LIMBS]; - - const BN_ULONG *in1_x = a->X; - const BN_ULONG *in1_y = a->Y; - const BN_ULONG *in1_z = a->Z; - - const BN_ULONG *in2_x = b->X; - const BN_ULONG *in2_y = b->Y; - const BN_ULONG *in2_z = b->Z; - - BN_ULONG in1infty = is_zero(a->Z); - BN_ULONG in2infty = is_zero(b->Z); - - elem_sqr_mont(Z2sqr, in2_z); /* Z2^2 */ - elem_sqr_mont(Z1sqr, in1_z); /* Z1^2 */ - - elem_mul_mont(S1, Z2sqr, in2_z); /* S1 = Z2^3 */ - elem_mul_mont(S2, Z1sqr, in1_z); /* S2 = Z1^3 */ - - elem_mul_mont(S1, S1, in1_y); /* S1 = Y1*Z2^3 */ - elem_mul_mont(S2, S2, in2_y); /* S2 = Y2*Z1^3 */ - elem_sub(R, S2, S1); /* R = S2 - S1 */ - - elem_mul_mont(U1, in1_x, Z2sqr); /* U1 = X1*Z2^2 */ - elem_mul_mont(U2, in2_x, Z1sqr); /* U2 = X2*Z1^2 */ - elem_sub(H, U2, U1); /* H = U2 - U1 */ - - BN_ULONG is_exceptional = is_equal(U1, U2) & ~in1infty & ~in2infty; - if (is_exceptional) { - if (is_equal(S1, S2)) { - GFp_nistz256_point_double(r, a); - } else { - limbs_zero(r->X, P256_LIMBS); - limbs_zero(r->Y, P256_LIMBS); - limbs_zero(r->Z, P256_LIMBS); - } - return; - } - - elem_sqr_mont(Rsqr, R); /* R^2 */ - elem_mul_mont(res_z, H, in1_z); /* Z3 = H*Z1*Z2 */ - elem_sqr_mont(Hsqr, H); /* H^2 */ - elem_mul_mont(res_z, res_z, in2_z); /* Z3 = H*Z1*Z2 */ - elem_mul_mont(Hcub, Hsqr, H); /* H^3 */ - - elem_mul_mont(U2, U1, Hsqr); /* U1*H^2 */ - elem_mul_by_2(Hsqr, U2); /* 2*U1*H^2 */ - - elem_sub(res_x, Rsqr, Hsqr); - elem_sub(res_x, res_x, Hcub); - - elem_sub(res_y, U2, res_x); - - elem_mul_mont(S2, S1, Hcub); - elem_mul_mont(res_y, R, res_y); - elem_sub(res_y, res_y, S2); - - copy_conditional(res_x, in2_x, in1infty); - copy_conditional(res_y, in2_y, in1infty); - copy_conditional(res_z, in2_z, in1infty); - - copy_conditional(res_x, in1_x, in2infty); - copy_conditional(res_y, in1_y, in2infty); - copy_conditional(res_z, in1_z, in2infty); - - limbs_copy(r->X, res_x, P256_LIMBS); - limbs_copy(r->Y, res_y, P256_LIMBS); - limbs_copy(r->Z, res_z, P256_LIMBS); -} -#endif - -/* r = p * p_scalar */ -void GFp_nistz256_point_mul(P256_POINT *r, const Limb p_scalar[P256_LIMBS], - const Limb p_x[P256_LIMBS], - const Limb p_y[P256_LIMBS]) { - static const size_t kWindowSize = 5; - static const crypto_word kMask = (1 << (5 /* kWindowSize */ + 1)) - 1; - - uint8_t p_str[(P256_LIMBS * sizeof(Limb)) + 1]; - gfp_little_endian_bytes_from_scalar(p_str, sizeof(p_str) / sizeof(p_str[0]), - p_scalar, P256_LIMBS); - - /* A |P256_POINT| is (3 * 32) = 96 bytes, and the 64-byte alignment should - * add no more than 63 bytes of overhead. Thus, |table| should require - * ~1599 ((96 * 16) + 63) bytes of stack space. */ - alignas(64) P256_POINT table[16]; - - /* table[0] is implicitly (0,0,0) (the point at infinity), therefore it is - * not stored. All other values are actually stored with an offset of -1 in - * table. */ - P256_POINT *row = table; - - limbs_copy(row[1 - 1].X, p_x, P256_LIMBS); - limbs_copy(row[1 - 1].Y, p_y, P256_LIMBS); - limbs_copy(row[1 - 1].Z, ONE, P256_LIMBS); - - GFp_nistz256_point_double(&row[2 - 1], &row[1 - 1]); - GFp_nistz256_point_add(&row[3 - 1], &row[2 - 1], &row[1 - 1]); - GFp_nistz256_point_double(&row[4 - 1], &row[2 - 1]); - GFp_nistz256_point_double(&row[6 - 1], &row[3 - 1]); - GFp_nistz256_point_double(&row[8 - 1], &row[4 - 1]); - GFp_nistz256_point_double(&row[12 - 1], &row[6 - 1]); - GFp_nistz256_point_add(&row[5 - 1], &row[4 - 1], &row[1 - 1]); - GFp_nistz256_point_add(&row[7 - 1], &row[6 - 1], &row[1 - 1]); - GFp_nistz256_point_add(&row[9 - 1], &row[8 - 1], &row[1 - 1]); - GFp_nistz256_point_add(&row[13 - 1], &row[12 - 1], &row[1 - 1]); - GFp_nistz256_point_double(&row[14 - 1], &row[7 - 1]); - GFp_nistz256_point_double(&row[10 - 1], &row[5 - 1]); - GFp_nistz256_point_add(&row[15 - 1], &row[14 - 1], &row[1 - 1]); - GFp_nistz256_point_add(&row[11 - 1], &row[10 - 1], &row[1 - 1]); - GFp_nistz256_point_double(&row[16 - 1], &row[8 - 1]); - - Limb tmp[P256_LIMBS]; - alignas(32) P256_POINT h; - static const size_t START_INDEX = 256 - 1; - size_t index = START_INDEX; - - crypto_word raw_wvalue; - crypto_word recoded_is_negative; - crypto_word recoded; - - raw_wvalue = p_str[(index - 1) / 8]; - raw_wvalue = (raw_wvalue >> ((index - 1) % 8)) & kMask; - booth_recode(&recoded_is_negative, &recoded, raw_wvalue, kWindowSize); - dev_assert_secret(!recoded_is_negative); - GFp_nistz256_select_w5(r, table, recoded); - - while (index >= kWindowSize) { - if (index != START_INDEX) { - size_t off = (index - 1) / 8; - - raw_wvalue = p_str[off] | p_str[off + 1] << 8; - raw_wvalue = (raw_wvalue >> ((index - 1) % 8)) & kMask; - booth_recode(&recoded_is_negative, &recoded, raw_wvalue, kWindowSize); - - GFp_nistz256_select_w5(&h, table, recoded); - GFp_nistz256_neg(tmp, h.Y); - copy_conditional(h.Y, tmp, recoded_is_negative); - - GFp_nistz256_point_add(r, r, &h); - } - - index -= kWindowSize; - - GFp_nistz256_point_double(r, r); - GFp_nistz256_point_double(r, r); - GFp_nistz256_point_double(r, r); - GFp_nistz256_point_double(r, r); - GFp_nistz256_point_double(r, r); - } - - /* Final window */ - raw_wvalue = p_str[0]; - raw_wvalue = (raw_wvalue << 1) & kMask; - - booth_recode(&recoded_is_negative, &recoded, raw_wvalue, kWindowSize); - GFp_nistz256_select_w5(&h, table, recoded); - GFp_nistz256_neg(tmp, h.Y); - copy_conditional(h.Y, tmp, recoded_is_negative); - GFp_nistz256_point_add(r, r, &h); -} - -#if defined(GFp_USE_LARGE_TABLE) - -/* Precomputed tables for the default generator */ -#include "ecp_nistz256_table.inl" - -static const size_t kWindowSize = 7; - -static inline void select_precomputed(P256_POINT_AFFINE *p, size_t i, - crypto_word raw_wvalue) { - crypto_word recoded_is_negative; - crypto_word recoded; - booth_recode(&recoded_is_negative, &recoded, raw_wvalue, kWindowSize); - GFp_nistz256_select_w7(p, GFp_nistz256_precomputed[i], recoded); - Limb neg_y[P256_LIMBS]; - GFp_nistz256_neg(neg_y, p->Y); - copy_conditional(p->Y, neg_y, recoded_is_negative); -} - -/* This assumes that |x| and |y| have been each been reduced to their minimal - * unique representations. */ -static Limb is_infinity(const Limb x[P256_LIMBS], - const Limb y[P256_LIMBS]) { - Limb acc = 0; - for (size_t i = 0; i < P256_LIMBS; ++i) { - acc |= x[i] | y[i]; - } - return constant_time_is_zero_w(acc); -} - -void GFp_nistz256_point_mul_base(P256_POINT *r, - const Limb g_scalar[P256_LIMBS]) { - static const crypto_word kMask = (1 << (7 /* kWindowSize */ + 1)) - 1; - - uint8_t p_str[(P256_LIMBS * sizeof(Limb)) + 1]; - gfp_little_endian_bytes_from_scalar(p_str, sizeof(p_str) / sizeof(p_str[0]), - g_scalar, P256_LIMBS); - - /* First window */ - size_t index = kWindowSize; - - alignas(32) P256_POINT_AFFINE t; - - crypto_word raw_wvalue = (p_str[0] << 1) & kMask; - select_precomputed(&t, 0, raw_wvalue); - - alignas(32) P256_POINT p; - limbs_copy(p.X, t.X, P256_LIMBS); - limbs_copy(p.Y, t.Y, P256_LIMBS); - limbs_copy(p.Z, ONE, P256_LIMBS); - /* If it is at the point at infinity then p.p.X will be zero. */ - copy_conditional(p.Z, p.X, is_infinity(p.X, p.Y)); - - for (size_t i = 1; i < 37; i++) { - size_t off = (index - 1) / 8; - raw_wvalue = p_str[off] | p_str[off + 1] << 8; - raw_wvalue = (raw_wvalue >> ((index - 1) % 8)) & kMask; - index += kWindowSize; - select_precomputed(&t, i, raw_wvalue); - GFp_nistz256_point_add_affine(&p, &p, &t); - } - - limbs_copy(r->X, p.X, P256_LIMBS); - limbs_copy(r->Y, p.Y, P256_LIMBS); - limbs_copy(r->Z, p.Z, P256_LIMBS); -} - -#endif diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/ec/ecp_nistz256.h temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/ec/ecp_nistz256.h --- temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/ec/ecp_nistz256.h 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/ec/ecp_nistz256.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,54 +0,0 @@ -/* Copyright (c) 2014, Intel Corporation. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY - * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION - * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ - -#ifndef OPENSSL_HEADER_EC_ECP_NISTZ256_H -#define OPENSSL_HEADER_EC_ECP_NISTZ256_H - -#include "../../limbs/limbs.h" - -// Keep this in sync with p256.rs. -#if defined(OPENSSL_AARCH64) || defined(OPENSSL_X86) || defined(OPENSSL_X86_64) -#define GFp_USE_LARGE_TABLE -#endif - -#define P256_LIMBS (256u / LIMB_BITS) - -typedef struct { - Limb X[P256_LIMBS]; - Limb Y[P256_LIMBS]; - Limb Z[P256_LIMBS]; -} P256_POINT; - -#if defined(GFp_USE_LARGE_TABLE) -typedef struct { - Limb X[P256_LIMBS]; - Limb Y[P256_LIMBS]; -} P256_POINT_AFFINE; -#endif - -typedef Limb PRECOMP256_ROW[64 * 2 * P256_LIMBS]; // 64 (x, y) entries. - -void GFp_nistz256_mul_mont(Limb res[P256_LIMBS], const Limb a[P256_LIMBS], - const Limb b[P256_LIMBS]); -void GFp_nistz256_sqr_mont(Limb res[P256_LIMBS], const Limb a[P256_LIMBS]); - -/* Functions that perform constant time access to the precomputed tables */ -void GFp_nistz256_select_w5(P256_POINT *out, const P256_POINT table[16], - crypto_word index); - -#if defined(GFp_USE_LARGE_TABLE) -void GFp_nistz256_select_w7(P256_POINT_AFFINE *out, const PRECOMP256_ROW table, crypto_word index); -#endif - -#endif /* OPENSSL_HEADER_EC_ECP_NISTZ256_H */ diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/ec/ecp_nistz256_table.inl temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/ec/ecp_nistz256_table.inl --- temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/ec/ecp_nistz256_table.inl 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/ec/ecp_nistz256_table.inl 1970-01-01 00:00:00.000000000 +0000 @@ -1,9501 +0,0 @@ -/* Copyright (c) 2015, Intel Inc. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY - * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION - * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ - -// This is the precomputed constant time access table for the code in -// GFp_nistz256.c, for the default generator. The table consists of 37 -// subtables, each subtable contains 64 affine points. The affine points are -// encoded as eight uint64's, four for the x coordinate and four for the y. -// Both values are in little-endian order. There are 37 tables because a -// signed, 6-bit recoding of the scalar is used and ceil(256/(6 + 1)) = 37. -// Within each table there are 64 values because the 6-bit recoding can take -// 64 values, ignoring the sign bit, which is implemented by performing a -// negation of the affine point when required. We would like to align it to 2MB -// in order to increase the chances of using a large page but that appears to -// lead to invalid ELF files being produced. - -// This file is generated by make_p256-x86_64-table.go. - -static const alignas(4096) PRECOMP256_ROW GFp_nistz256_precomputed[37] = { - {TOBN(0x79e730d4, 0x18a9143c), TOBN(0x75ba95fc, 0x5fedb601), - TOBN(0x79fb732b, 0x77622510), TOBN(0x18905f76, 0xa53755c6), - TOBN(0xddf25357, 0xce95560a), TOBN(0x8b4ab8e4, 0xba19e45c), - TOBN(0xd2e88688, 0xdd21f325), TOBN(0x8571ff18, 0x25885d85), - TOBN(0x850046d4, 0x10ddd64d), TOBN(0xaa6ae3c1, 0xa433827d), - TOBN(0x73220503, 0x8d1490d9), TOBN(0xf6bb32e4, 0x3dcf3a3b), - TOBN(0x2f3648d3, 0x61bee1a5), TOBN(0x152cd7cb, 0xeb236ff8), - TOBN(0x19a8fb0e, 0x92042dbe), TOBN(0x78c57751, 0x0a5b8a3b), - TOBN(0xffac3f90, 0x4eebc127), TOBN(0xb027f84a, 0x087d81fb), - TOBN(0x66ad77dd, 0x87cbbc98), TOBN(0x26936a3f, 0xb6ff747e), - TOBN(0xb04c5c1f, 0xc983a7eb), TOBN(0x583e47ad, 0x0861fe1a), - TOBN(0x78820831, 0x1a2ee98e), TOBN(0xd5f06a29, 0xe587cc07), - TOBN(0x74b0b50d, 0x46918dcc), TOBN(0x4650a6ed, 0xc623c173), - TOBN(0x0cdaacac, 0xe8100af2), TOBN(0x577362f5, 0x41b0176b), - TOBN(0x2d96f24c, 0xe4cbaba6), TOBN(0x17628471, 0xfad6f447), - TOBN(0x6b6c36de, 0xe5ddd22e), TOBN(0x84b14c39, 0x4c5ab863), - TOBN(0xbe1b8aae, 0xc45c61f5), TOBN(0x90ec649a, 0x94b9537d), - TOBN(0x941cb5aa, 0xd076c20c), TOBN(0xc9079605, 0x890523c8), - TOBN(0xeb309b4a, 0xe7ba4f10), TOBN(0x73c568ef, 0xe5eb882b), - TOBN(0x3540a987, 0x7e7a1f68), TOBN(0x73a076bb, 0x2dd1e916), - TOBN(0x40394737, 0x3e77664a), TOBN(0x55ae744f, 0x346cee3e), - TOBN(0xd50a961a, 0x5b17a3ad), TOBN(0x13074b59, 0x54213673), - TOBN(0x93d36220, 0xd377e44b), TOBN(0x299c2b53, 0xadff14b5), - TOBN(0xf424d44c, 0xef639f11), TOBN(0xa4c9916d, 0x4a07f75f), - TOBN(0x0746354e, 0xa0173b4f), TOBN(0x2bd20213, 0xd23c00f7), - TOBN(0xf43eaab5, 0x0c23bb08), TOBN(0x13ba5119, 0xc3123e03), - TOBN(0x2847d030, 0x3f5b9d4d), TOBN(0x6742f2f2, 0x5da67bdd), - TOBN(0xef933bdc, 0x77c94195), TOBN(0xeaedd915, 0x6e240867), - TOBN(0x27f14cd1, 0x9499a78f), TOBN(0x462ab5c5, 0x6f9b3455), - TOBN(0x8f90f02a, 0xf02cfc6b), TOBN(0xb763891e, 0xb265230d), - TOBN(0xf59da3a9, 0x532d4977), TOBN(0x21e3327d, 0xcf9eba15), - TOBN(0x123c7b84, 0xbe60bbf0), TOBN(0x56ec12f2, 0x7706df76), - TOBN(0x75c96e8f, 0x264e20e8), TOBN(0xabe6bfed, 0x59a7a841), - TOBN(0x2cc09c04, 0x44c8eb00), TOBN(0xe05b3080, 0xf0c4e16b), - TOBN(0x1eb7777a, 0xa45f3314), TOBN(0x56af7bed, 0xce5d45e3), - TOBN(0x2b6e019a, 0x88b12f1a), TOBN(0x086659cd, 0xfd835f9b), - TOBN(0x2c18dbd1, 0x9dc21ec8), TOBN(0x98f9868a, 0x0fcf8139), - TOBN(0x737d2cd6, 0x48250b49), TOBN(0xcc61c947, 0x24b3428f), - TOBN(0x0c2b4078, 0x80dd9e76), TOBN(0xc43a8991, 0x383fbe08), - TOBN(0x5f7d2d65, 0x779be5d2), TOBN(0x78719a54, 0xeb3b4ab5), - TOBN(0xea7d260a, 0x6245e404), TOBN(0x9de40795, 0x6e7fdfe0), - TOBN(0x1ff3a415, 0x8dac1ab5), TOBN(0x3e7090f1, 0x649c9073), - TOBN(0x1a768561, 0x2b944e88), TOBN(0x250f939e, 0xe57f61c8), - TOBN(0x0c0daa89, 0x1ead643d), TOBN(0x68930023, 0xe125b88e), - TOBN(0x04b71aa7, 0xd2697768), TOBN(0xabdedef5, 0xca345a33), - TOBN(0x2409d29d, 0xee37385e), TOBN(0x4ee1df77, 0xcb83e156), - TOBN(0x0cac12d9, 0x1cbb5b43), TOBN(0x170ed2f6, 0xca895637), - TOBN(0x28228cfa, 0x8ade6d66), TOBN(0x7ff57c95, 0x53238aca), - TOBN(0xccc42563, 0x4b2ed709), TOBN(0x0e356769, 0x856fd30d), - TOBN(0xbcbcd43f, 0x559e9811), TOBN(0x738477ac, 0x5395b759), - TOBN(0x35752b90, 0xc00ee17f), TOBN(0x68748390, 0x742ed2e3), - TOBN(0x7cd06422, 0xbd1f5bc1), TOBN(0xfbc08769, 0xc9e7b797), - TOBN(0xa242a35b, 0xb0cf664a), TOBN(0x126e48f7, 0x7f9707e3), - TOBN(0x1717bf54, 0xc6832660), TOBN(0xfaae7332, 0xfd12c72e), - TOBN(0x27b52db7, 0x995d586b), TOBN(0xbe29569e, 0x832237c2), - TOBN(0xe8e4193e, 0x2a65e7db), TOBN(0x152706dc, 0x2eaa1bbb), - TOBN(0x72bcd8b7, 0xbc60055b), TOBN(0x03cc23ee, 0x56e27e4b), - TOBN(0xee337424, 0xe4819370), TOBN(0xe2aa0e43, 0x0ad3da09), - TOBN(0x40b8524f, 0x6383c45d), TOBN(0xd7663554, 0x42a41b25), - TOBN(0x64efa6de, 0x778a4797), TOBN(0x2042170a, 0x7079adf4), - TOBN(0x808b0b65, 0x0bc6fb80), TOBN(0x5882e075, 0x3ffe2e6b), - TOBN(0xd5ef2f7c, 0x2c83f549), TOBN(0x54d63c80, 0x9103b723), - TOBN(0xf2f11bd6, 0x52a23f9b), TOBN(0x3670c319, 0x4b0b6587), - TOBN(0x55c4623b, 0xb1580e9e), TOBN(0x64edf7b2, 0x01efe220), - TOBN(0x97091dcb, 0xd53c5c9d), TOBN(0xf17624b6, 0xac0a177b), - TOBN(0xb0f13975, 0x2cfe2dff), TOBN(0xc1a35c0a, 0x6c7a574e), - TOBN(0x227d3146, 0x93e79987), TOBN(0x0575bf30, 0xe89cb80e), - TOBN(0x2f4e247f, 0x0d1883bb), TOBN(0xebd51226, 0x3274c3d0), - TOBN(0x5f3e51c8, 0x56ada97a), TOBN(0x4afc964d, 0x8f8b403e), - TOBN(0xa6f247ab, 0x412e2979), TOBN(0x675abd1b, 0x6f80ebda), - TOBN(0x66a2bd72, 0x5e485a1d), TOBN(0x4b2a5caf, 0x8f4f0b3c), - TOBN(0x2626927f, 0x1b847bba), TOBN(0x6c6fc7d9, 0x0502394d), - TOBN(0xfea912ba, 0xa5659ae8), TOBN(0x68363aba, 0x25e1a16e), - TOBN(0xb8842277, 0x752c41ac), TOBN(0xfe545c28, 0x2897c3fc), - TOBN(0x2d36e9e7, 0xdc4c696b), TOBN(0x5806244a, 0xfba977c5), - TOBN(0x85665e9b, 0xe39508c1), TOBN(0xf720ee25, 0x6d12597b), - TOBN(0x8a979129, 0xd2337a31), TOBN(0x5916868f, 0x0f862bdc), - TOBN(0x048099d9, 0x5dd283ba), TOBN(0xe2d1eeb6, 0xfe5bfb4e), - TOBN(0x82ef1c41, 0x7884005d), TOBN(0xa2d4ec17, 0xffffcbae), - TOBN(0x9161c53f, 0x8aa95e66), TOBN(0x5ee104e1, 0xc5fee0d0), - TOBN(0x562e4cec, 0xc135b208), TOBN(0x74e1b265, 0x4783f47d), - TOBN(0x6d2a506c, 0x5a3f3b30), TOBN(0xecead9f4, 0xc16762fc), - TOBN(0xf29dd4b2, 0xe286e5b9), TOBN(0x1b0fadc0, 0x83bb3c61), - TOBN(0x7a75023e, 0x7fac29a4), TOBN(0xc086d5f1, 0xc9477fa3), - TOBN(0x0fc61135, 0x2f6f3076), TOBN(0xc99ffa23, 0xe3912a9a), - TOBN(0x6a0b0685, 0xd2f8ba3d), TOBN(0xfdc777e8, 0xe93358a4), - TOBN(0x94a787bb, 0x35415f04), TOBN(0x640c2d6a, 0x4d23fea4), - TOBN(0x9de917da, 0x153a35b5), TOBN(0x793e8d07, 0x5d5cd074), - TOBN(0xf4f87653, 0x2de45068), TOBN(0x37c7a7e8, 0x9e2e1f6e), - TOBN(0xd0825fa2, 0xa3584069), TOBN(0xaf2cea7c, 0x1727bf42), - TOBN(0x0360a4fb, 0x9e4785a9), TOBN(0xe5fda49c, 0x27299f4a), - TOBN(0x48068e13, 0x71ac2f71), TOBN(0x83d0687b, 0x9077666f), - TOBN(0x6d3883b2, 0x15d02819), TOBN(0x6d0d7550, 0x40dd9a35), - TOBN(0x61d7cbf9, 0x1d2b469f), TOBN(0xf97b232f, 0x2efc3115), - TOBN(0xa551d750, 0xb24bcbc7), TOBN(0x11ea4949, 0x88a1e356), - TOBN(0x7669f031, 0x93cb7501), TOBN(0x595dc55e, 0xca737b8a), - TOBN(0xa4a319ac, 0xd837879f), TOBN(0x6fc1b49e, 0xed6b67b0), - TOBN(0xe3959933, 0x32f1f3af), TOBN(0x966742eb, 0x65432a2e), - TOBN(0x4b8dc9fe, 0xb4966228), TOBN(0x96cc6312, 0x43f43950), - TOBN(0x12068859, 0xc9b731ee), TOBN(0x7b948dc3, 0x56f79968), - TOBN(0x61e4ad32, 0xed1f8008), TOBN(0xe6c9267a, 0xd8b17538), - TOBN(0x1ac7c5eb, 0x857ff6fb), TOBN(0x994baaa8, 0x55f2fb10), - TOBN(0x84cf14e1, 0x1d248018), TOBN(0x5a39898b, 0x628ac508), - TOBN(0x14fde97b, 0x5fa944f5), TOBN(0xed178030, 0xd12e5ac7), - TOBN(0x042c2af4, 0x97e2feb4), TOBN(0xd36a42d7, 0xaebf7313), - TOBN(0x49d2c9eb, 0x084ffdd7), TOBN(0x9f8aa54b, 0x2ef7c76a), - TOBN(0x9200b7ba, 0x09895e70), TOBN(0x3bd0c66f, 0xddb7fb58), - TOBN(0x2d97d108, 0x78eb4cbb), TOBN(0x2d431068, 0xd84bde31), - TOBN(0x4b523eb7, 0x172ccd1f), TOBN(0x7323cb28, 0x30a6a892), - TOBN(0x97082ec0, 0xcfe153eb), TOBN(0xe97f6b6a, 0xf2aadb97), - TOBN(0x1d3d393e, 0xd1a83da1), TOBN(0xa6a7f9c7, 0x804b2a68), - TOBN(0x4a688b48, 0x2d0cb71e), TOBN(0xa9b4cc5f, 0x40585278), - TOBN(0x5e5db46a, 0xcb66e132), TOBN(0xf1be963a, 0x0d925880), - TOBN(0x944a7027, 0x0317b9e2), TOBN(0xe266f959, 0x48603d48), - TOBN(0x98db6673, 0x5c208899), TOBN(0x90472447, 0xa2fb18a3), - TOBN(0x8a966939, 0x777c619f), TOBN(0x3798142a, 0x2a3be21b), - TOBN(0xb4241cb1, 0x3298b343), TOBN(0xa3a14e49, 0xb44f65a1), - TOBN(0xc5f4d6cd, 0x3ac77acd), TOBN(0xd0288cb5, 0x52b6fc3c), - TOBN(0xd5cc8c2f, 0x1c040abc), TOBN(0xb675511e, 0x06bf9b4a), - TOBN(0xd667da37, 0x9b3aa441), TOBN(0x460d45ce, 0x51601f72), - TOBN(0xe2f73c69, 0x6755ff89), TOBN(0xdd3cf7e7, 0x473017e6), - TOBN(0x8ef5689d, 0x3cf7600d), TOBN(0x948dc4f8, 0xb1fc87b4), - TOBN(0xd9e9fe81, 0x4ea53299), TOBN(0x2d921ca2, 0x98eb6028), - TOBN(0xfaecedfd, 0x0c9803fc), TOBN(0xf38ae891, 0x4d7b4745), - TOBN(0xd8c5fccf, 0xc5e3a3d8), TOBN(0xbefd904c, 0x4079dfbf), - TOBN(0xbc6d6a58, 0xfead0197), TOBN(0x39227077, 0x695532a4), - TOBN(0x09e23e6d, 0xdbef42f5), TOBN(0x7e449b64, 0x480a9908), - TOBN(0x7b969c1a, 0xad9a2e40), TOBN(0x6231d792, 0x9591c2a4), - TOBN(0x87151456, 0x0f664534), TOBN(0x85ceae7c, 0x4b68f103), - TOBN(0xac09c4ae, 0x65578ab9), TOBN(0x33ec6868, 0xf044b10c), - TOBN(0x6ac4832b, 0x3a8ec1f1), TOBN(0x5509d128, 0x5847d5ef), - TOBN(0xf909604f, 0x763f1574), TOBN(0xb16c4303, 0xc32f63c4), - TOBN(0xb6ab2014, 0x7ca23cd3), TOBN(0xcaa7a5c6, 0xa391849d), - TOBN(0x5b0673a3, 0x75678d94), TOBN(0xc982ddd4, 0xdd303e64), - TOBN(0xfd7b000b, 0x5db6f971), TOBN(0xbba2cb1f, 0x6f876f92), - TOBN(0xc77332a3, 0x3c569426), TOBN(0xa159100c, 0x570d74f8), - TOBN(0xfd16847f, 0xdec67ef5), TOBN(0x742ee464, 0x233e76b7), - TOBN(0x0b8e4134, 0xefc2b4c8), TOBN(0xca640b86, 0x42a3e521), - TOBN(0x653a0190, 0x8ceb6aa9), TOBN(0x313c300c, 0x547852d5), - TOBN(0x24e4ab12, 0x6b237af7), TOBN(0x2ba90162, 0x8bb47af8), - TOBN(0x3d5e58d6, 0xa8219bb7), TOBN(0xc691d0bd, 0x1b06c57f), - TOBN(0x0ae4cb10, 0xd257576e), TOBN(0x3569656c, 0xd54a3dc3), - TOBN(0xe5ebaebd, 0x94cda03a), TOBN(0x934e82d3, 0x162bfe13), - TOBN(0x450ac0ba, 0xe251a0c6), TOBN(0x480b9e11, 0xdd6da526), - TOBN(0x00467bc5, 0x8cce08b5), TOBN(0xb636458c, 0x7f178d55), - TOBN(0xc5748bae, 0xa677d806), TOBN(0x2763a387, 0xdfa394eb), - TOBN(0xa12b448a, 0x7d3cebb6), TOBN(0xe7adda3e, 0x6f20d850), - TOBN(0xf63ebce5, 0x1558462c), TOBN(0x58b36143, 0x620088a8), - TOBN(0x8a2cc3ca, 0x4d63c0ee), TOBN(0x51233117, 0x0fe948ce), - TOBN(0x7463fd85, 0x222ef33b), TOBN(0xadf0c7dc, 0x7c603d6c), - TOBN(0x0ec32d3b, 0xfe7765e5), TOBN(0xccaab359, 0xbf380409), - TOBN(0xbdaa84d6, 0x8e59319c), TOBN(0xd9a4c280, 0x9c80c34d), - TOBN(0xa9d89488, 0xa059c142), TOBN(0x6f5ae714, 0xff0b9346), - TOBN(0x068f237d, 0x16fb3664), TOBN(0x5853e4c4, 0x363186ac), - TOBN(0xe2d87d23, 0x63c52f98), TOBN(0x2ec4a766, 0x81828876), - TOBN(0x47b864fa, 0xe14e7b1c), TOBN(0x0c0bc0e5, 0x69192408), - TOBN(0xe4d7681d, 0xb82e9f3e), TOBN(0x83200f0b, 0xdf25e13c), - TOBN(0x8909984c, 0x66f27280), TOBN(0x462d7b00, 0x75f73227), - TOBN(0xd90ba188, 0xf2651798), TOBN(0x74c6e18c, 0x36ab1c34), - TOBN(0xab256ea3, 0x5ef54359), TOBN(0x03466612, 0xd1aa702f), - TOBN(0x624d6049, 0x2ed22e91), TOBN(0x6fdfe0b5, 0x6f072822), - TOBN(0xeeca1115, 0x39ce2271), TOBN(0x98100a4f, 0xdb01614f), - TOBN(0xb6b0daa2, 0xa35c628f), TOBN(0xb6f94d2e, 0xc87e9a47), - TOBN(0xc6773259, 0x1d57d9ce), TOBN(0xf70bfeec, 0x03884a7b), - TOBN(0x5fb35ccf, 0xed2bad01), TOBN(0xa155cbe3, 0x1da6a5c7), - TOBN(0xc2e2594c, 0x30a92f8f), TOBN(0x649c89ce, 0x5bfafe43), - TOBN(0xd158667d, 0xe9ff257a), TOBN(0x9b359611, 0xf32c50ae), - TOBN(0x4b00b20b, 0x906014cf), TOBN(0xf3a8cfe3, 0x89bc7d3d), - TOBN(0x4ff23ffd, 0x248a7d06), TOBN(0x80c5bfb4, 0x878873fa), - TOBN(0xb7d9ad90, 0x05745981), TOBN(0x179c85db, 0x3db01994), - TOBN(0xba41b062, 0x61a6966c), TOBN(0x4d82d052, 0xeadce5a8), - TOBN(0x9e91cd3b, 0xa5e6a318), TOBN(0x47795f4f, 0x95b2dda0), - TOBN(0xecfd7c1f, 0xd55a897c), TOBN(0x009194ab, 0xb29110fb), - TOBN(0x5f0e2046, 0xe381d3b0), TOBN(0x5f3425f6, 0xa98dd291), - TOBN(0xbfa06687, 0x730d50da), TOBN(0x0423446c, 0x4b083b7f), - TOBN(0x397a247d, 0xd69d3417), TOBN(0xeb629f90, 0x387ba42a), - TOBN(0x1ee426cc, 0xd5cd79bf), TOBN(0x0032940b, 0x946c6e18), - TOBN(0x1b1e8ae0, 0x57477f58), TOBN(0xe94f7d34, 0x6d823278), - TOBN(0xc747cb96, 0x782ba21a), TOBN(0xc5254469, 0xf72b33a5), - TOBN(0x772ef6de, 0xc7f80c81), TOBN(0xd73acbfe, 0x2cd9e6b5), - TOBN(0x4075b5b1, 0x49ee90d9), TOBN(0x785c339a, 0xa06e9eba), - TOBN(0xa1030d5b, 0xabf825e0), TOBN(0xcec684c3, 0xa42931dc), - TOBN(0x42ab62c9, 0xc1586e63), TOBN(0x45431d66, 0x5ab43f2b), - TOBN(0x57c8b2c0, 0x55f7835d), TOBN(0x033da338, 0xc1b7f865), - TOBN(0x283c7513, 0xcaa76097), TOBN(0x0a624fa9, 0x36c83906), - TOBN(0x6b20afec, 0x715af2c7), TOBN(0x4b969974, 0xeba78bfd), - TOBN(0x220755cc, 0xd921d60e), TOBN(0x9b944e10, 0x7baeca13), - TOBN(0x04819d51, 0x5ded93d4), TOBN(0x9bbff86e, 0x6dddfd27), - TOBN(0x6b344130, 0x77adc612), TOBN(0xa7496529, 0xbbd803a0), - TOBN(0x1a1baaa7, 0x6d8805bd), TOBN(0xc8403902, 0x470343ad), - TOBN(0x39f59f66, 0x175adff1), TOBN(0x0b26d7fb, 0xb7d8c5b7), - TOBN(0xa875f5ce, 0x529d75e3), TOBN(0x85efc7e9, 0x41325cc2), - TOBN(0x21950b42, 0x1ff6acd3), TOBN(0xffe70484, 0x53dc6909), - TOBN(0xff4cd0b2, 0x28766127), TOBN(0xabdbe608, 0x4fb7db2b), - TOBN(0x837c9228, 0x5e1109e8), TOBN(0x26147d27, 0xf4645b5a), - TOBN(0x4d78f592, 0xf7818ed8), TOBN(0xd394077e, 0xf247fa36), - TOBN(0x0fb9c2d0, 0x488c171a), TOBN(0xa78bfbaa, 0x13685278), - TOBN(0xedfbe268, 0xd5b1fa6a), TOBN(0x0dceb8db, 0x2b7eaba7), - TOBN(0xbf9e8089, 0x9ae2b710), TOBN(0xefde7ae6, 0xa4449c96), - TOBN(0x43b7716b, 0xcc143a46), TOBN(0xd7d34194, 0xc3628c13), - TOBN(0x508cec1c, 0x3b3f64c9), TOBN(0xe20bc0ba, 0x1e5edf3f), - TOBN(0xda1deb85, 0x2f4318d4), TOBN(0xd20ebe0d, 0x5c3fa443), - TOBN(0x370b4ea7, 0x73241ea3), TOBN(0x61f1511c, 0x5e1a5f65), - TOBN(0x99a5e23d, 0x82681c62), TOBN(0xd731e383, 0xa2f54c2d), - TOBN(0x2692f36e, 0x83445904), TOBN(0x2e0ec469, 0xaf45f9c0), - TOBN(0x905a3201, 0xc67528b7), TOBN(0x88f77f34, 0xd0e5e542), - TOBN(0xf67a8d29, 0x5864687c), TOBN(0x23b92eae, 0x22df3562), - TOBN(0x5c27014b, 0x9bbec39e), TOBN(0x7ef2f226, 0x9c0f0f8d), - TOBN(0x97359638, 0x546c4d8d), TOBN(0x5f9c3fc4, 0x92f24679), - TOBN(0x912e8bed, 0xa8c8acd9), TOBN(0xec3a318d, 0x306634b0), - TOBN(0x80167f41, 0xc31cb264), TOBN(0x3db82f6f, 0x522113f2), - TOBN(0xb155bcd2, 0xdcafe197), TOBN(0xfba1da59, 0x43465283), - TOBN(0xa0425b8e, 0xb212cf53), TOBN(0x4f2e512e, 0xf8557c5f), - TOBN(0xc1286ff9, 0x25c4d56c), TOBN(0xbb8a0fea, 0xee26c851), - TOBN(0xc28f70d2, 0xe7d6107e), TOBN(0x7ee0c444, 0xe76265aa), - TOBN(0x3df277a4, 0x1d1936b1), TOBN(0x1a556e3f, 0xea9595eb), - TOBN(0x258bbbf9, 0xe7305683), TOBN(0x31eea5bf, 0x07ef5be6), - TOBN(0x0deb0e4a, 0x46c814c1), TOBN(0x5cee8449, 0xa7b730dd), - TOBN(0xeab495c5, 0xa0182bde), TOBN(0xee759f87, 0x9e27a6b4), - TOBN(0xc2cf6a68, 0x80e518ca), TOBN(0x25e8013f, 0xf14cf3f4), - TOBN(0x8fc44140, 0x7e8d7a14), TOBN(0xbb1ff3ca, 0x9556f36a), - TOBN(0x6a844385, 0x14600044), TOBN(0xba3f0c4a, 0x7451ae63), - TOBN(0xdfcac25b, 0x1f9af32a), TOBN(0x01e0db86, 0xb1f2214b), - TOBN(0x4e9a5bc2, 0xa4b596ac), TOBN(0x83927681, 0x026c2c08), - TOBN(0x3ec832e7, 0x7acaca28), TOBN(0x1bfeea57, 0xc7385b29), - TOBN(0x068212e3, 0xfd1eaf38), TOBN(0xc1329830, 0x6acf8ccc), - TOBN(0xb909f2db, 0x2aac9e59), TOBN(0x5748060d, 0xb661782a), - TOBN(0xc5ab2632, 0xc79b7a01), TOBN(0xda44c6c6, 0x00017626), - TOBN(0xf26c00e8, 0xa7ea82f0), TOBN(0x99cac80d, 0xe4299aaf), - TOBN(0xd66fe3b6, 0x7ed78be1), TOBN(0x305f725f, 0x648d02cd), - TOBN(0x33ed1bc4, 0x623fb21b), TOBN(0xfa70533e, 0x7a6319ad), - TOBN(0x17ab562d, 0xbe5ffb3e), TOBN(0x06374994, 0x56674741), - TOBN(0x69d44ed6, 0x5c46aa8e), TOBN(0x2100d5d3, 0xa8d063d1), - TOBN(0xcb9727ea, 0xa2d17c36), TOBN(0x4c2bab1b, 0x8add53b7), - TOBN(0xa084e90c, 0x15426704), TOBN(0x778afcd3, 0xa837ebea), - TOBN(0x6651f701, 0x7ce477f8), TOBN(0xa0624998, 0x46fb7a8b), - TOBN(0xdc1e6828, 0xed8a6e19), TOBN(0x33fc2336, 0x4189d9c7), - TOBN(0x026f8fe2, 0x671c39bc), TOBN(0xd40c4ccd, 0xbc6f9915), - TOBN(0xafa135bb, 0xf80e75ca), TOBN(0x12c651a0, 0x22adff2c), - TOBN(0xc40a04bd, 0x4f51ad96), TOBN(0x04820109, 0xbbe4e832), - TOBN(0x3667eb1a, 0x7f4c04cc), TOBN(0x59556621, 0xa9404f84), - TOBN(0x71cdf653, 0x7eceb50a), TOBN(0x994a44a6, 0x9b8335fa), - TOBN(0xd7faf819, 0xdbeb9b69), TOBN(0x473c5680, 0xeed4350d), - TOBN(0xb6658466, 0xda44bba2), TOBN(0x0d1bc780, 0x872bdbf3), - TOBN(0xe535f175, 0xa1962f91), TOBN(0x6ed7e061, 0xed58f5a7), - TOBN(0x177aa4c0, 0x2089a233), TOBN(0x0dbcb03a, 0xe539b413), - TOBN(0xe3dc424e, 0xbb32e38e), TOBN(0x6472e5ef, 0x6806701e), - TOBN(0xdd47ff98, 0x814be9ee), TOBN(0x6b60cfff, 0x35ace009), - TOBN(0xb8d3d931, 0x9ff91fe5), TOBN(0x039c4800, 0xf0518eed), - TOBN(0x95c37632, 0x9182cb26), TOBN(0x0763a434, 0x82fc568d), - TOBN(0x707c04d5, 0x383e76ba), TOBN(0xac98b930, 0x824e8197), - TOBN(0x92bf7c8f, 0x91230de0), TOBN(0x90876a01, 0x40959b70), - TOBN(0xdb6d96f3, 0x05968b80), TOBN(0x380a0913, 0x089f73b9), - TOBN(0x7da70b83, 0xc2c61e01), TOBN(0x95fb8394, 0x569b38c7), - TOBN(0x9a3c6512, 0x80edfe2f), TOBN(0x8f726bb9, 0x8faeaf82), - TOBN(0x8010a4a0, 0x78424bf8), TOBN(0x29672044, 0x0e844970)}, - {TOBN(0x63c5cb81, 0x7a2ad62a), TOBN(0x7ef2b6b9, 0xac62ff54), - TOBN(0x3749bba4, 0xb3ad9db5), TOBN(0xad311f2c, 0x46d5a617), - TOBN(0xb77a8087, 0xc2ff3b6d), TOBN(0xb46feaf3, 0x367834ff), - TOBN(0xf8aa266d, 0x75d6b138), TOBN(0xfa38d320, 0xec008188), - TOBN(0x486d8ffa, 0x696946fc), TOBN(0x50fbc6d8, 0xb9cba56d), - TOBN(0x7e3d423e, 0x90f35a15), TOBN(0x7c3da195, 0xc0dd962c), - TOBN(0xe673fdb0, 0x3cfd5d8b), TOBN(0x0704b7c2, 0x889dfca5), - TOBN(0xf6ce581f, 0xf52305aa), TOBN(0x399d49eb, 0x914d5e53), - TOBN(0x380a496d, 0x6ec293cd), TOBN(0x733dbda7, 0x8e7051f5), - TOBN(0x037e388d, 0xb849140a), TOBN(0xee4b32b0, 0x5946dbf6), - TOBN(0xb1c4fda9, 0xcae368d1), TOBN(0x5001a7b0, 0xfdb0b2f3), - TOBN(0x6df59374, 0x2e3ac46e), TOBN(0x4af675f2, 0x39b3e656), - TOBN(0x44e38110, 0x39949296), TOBN(0x5b63827b, 0x361db1b5), - TOBN(0x3e5323ed, 0x206eaff5), TOBN(0x942370d2, 0xc21f4290), - TOBN(0xf2caaf2e, 0xe0d985a1), TOBN(0x192cc64b, 0x7239846d), - TOBN(0x7c0b8f47, 0xae6312f8), TOBN(0x7dc61f91, 0x96620108), - TOBN(0xb830fb5b, 0xc2da7de9), TOBN(0xd0e643df, 0x0ff8d3be), - TOBN(0x31ee77ba, 0x188a9641), TOBN(0x4e8aa3aa, 0xbcf6d502), - TOBN(0xf9fb6532, 0x9a49110f), TOBN(0xd18317f6, 0x2dd6b220), - TOBN(0x7e3ced41, 0x52c3ea5a), TOBN(0x0d296a14, 0x7d579c4a), - TOBN(0x35d6a53e, 0xed4c3717), TOBN(0x9f8240cf, 0x3d0ed2a3), - TOBN(0x8c0d4d05, 0xe5543aa5), TOBN(0x45d5bbfb, 0xdd33b4b4), - TOBN(0xfa04cc73, 0x137fd28e), TOBN(0x862ac6ef, 0xc73b3ffd), - TOBN(0x403ff9f5, 0x31f51ef2), TOBN(0x34d5e0fc, 0xbc73f5a2), - TOBN(0xf2526820, 0x08913f4f), TOBN(0xea20ed61, 0xeac93d95), - TOBN(0x51ed38b4, 0x6ca6b26c), TOBN(0x8662dcbc, 0xea4327b0), - TOBN(0x6daf295c, 0x725d2aaa), TOBN(0xbad2752f, 0x8e52dcda), - TOBN(0x2210e721, 0x0b17dacc), TOBN(0xa37f7912, 0xd51e8232), - TOBN(0x4f7081e1, 0x44cc3add), TOBN(0xd5ffa1d6, 0x87be82cf), - TOBN(0x89890b6c, 0x0edd6472), TOBN(0xada26e1a, 0x3ed17863), - TOBN(0x276f2715, 0x63483caa), TOBN(0xe6924cd9, 0x2f6077fd), - TOBN(0x05a7fe98, 0x0a466e3c), TOBN(0xf1c794b0, 0xb1902d1f), - TOBN(0xe5213688, 0x82a8042c), TOBN(0xd931cfaf, 0xcd278298), - TOBN(0x069a0ae0, 0xf597a740), TOBN(0x0adbb3f3, 0xeb59107c), - TOBN(0x983e951e, 0x5eaa8eb8), TOBN(0xe663a8b5, 0x11b48e78), - TOBN(0x1631cc0d, 0x8a03f2c5), TOBN(0x7577c11e, 0x11e271e2), - TOBN(0x33b2385c, 0x08369a90), TOBN(0x2990c59b, 0x190eb4f8), - TOBN(0x819a6145, 0xc68eac80), TOBN(0x7a786d62, 0x2ec4a014), - TOBN(0x33faadbe, 0x20ac3a8d), TOBN(0x31a21781, 0x5aba2d30), - TOBN(0x209d2742, 0xdba4f565), TOBN(0xdb2ce9e3, 0x55aa0fbb), - TOBN(0x8cef334b, 0x168984df), TOBN(0xe81dce17, 0x33879638), - TOBN(0xf6e6949c, 0x263720f0), TOBN(0x5c56feaf, 0xf593cbec), - TOBN(0x8bff5601, 0xfde58c84), TOBN(0x74e24117, 0x2eccb314), - TOBN(0xbcf01b61, 0x4c9a8a78), TOBN(0xa233e35e, 0x544c9868), - TOBN(0xb3156bf3, 0x8bd7aff1), TOBN(0x1b5ee4cb, 0x1d81b146), - TOBN(0x7ba1ac41, 0xd628a915), TOBN(0x8f3a8f9c, 0xfd89699e), - TOBN(0x7329b9c9, 0xa0748be7), TOBN(0x1d391c95, 0xa92e621f), - TOBN(0xe51e6b21, 0x4d10a837), TOBN(0xd255f53a, 0x4947b435), - TOBN(0x07669e04, 0xf1788ee3), TOBN(0xc14f27af, 0xa86938a2), - TOBN(0x8b47a334, 0xe93a01c0), TOBN(0xff627438, 0xd9366808), - TOBN(0x7a0985d8, 0xca2a5965), TOBN(0x3d9a5542, 0xd6e9b9b3), - TOBN(0xc23eb80b, 0x4cf972e8), TOBN(0x5c1c33bb, 0x4fdf72fd), - TOBN(0x0c4a58d4, 0x74a86108), TOBN(0xf8048a8f, 0xee4c5d90), - TOBN(0xe3c7c924, 0xe86d4c80), TOBN(0x28c889de, 0x056a1e60), - TOBN(0x57e2662e, 0xb214a040), TOBN(0xe8c48e98, 0x37e10347), - TOBN(0x87742862, 0x80ac748a), TOBN(0xf1c24022, 0x186b06f2), - TOBN(0xac2dd4c3, 0x5f74040a), TOBN(0x409aeb71, 0xfceac957), - TOBN(0x4fbad782, 0x55c4ec23), TOBN(0xb359ed61, 0x8a7b76ec), - TOBN(0x12744926, 0xed6f4a60), TOBN(0xe21e8d7f, 0x4b912de3), - TOBN(0xe2575a59, 0xfc705a59), TOBN(0x72f1d4de, 0xed2dbc0e), - TOBN(0x3d2b24b9, 0xeb7926b8), TOBN(0xbff88cb3, 0xcdbe5509), - TOBN(0xd0f399af, 0xe4dd640b), TOBN(0x3c5fe130, 0x2f76ed45), - TOBN(0x6f3562f4, 0x3764fb3d), TOBN(0x7b5af318, 0x3151b62d), - TOBN(0xd5bd0bc7, 0xd79ce5f3), TOBN(0xfdaf6b20, 0xec66890f), - TOBN(0x735c67ec, 0x6063540c), TOBN(0x50b259c2, 0xe5f9cb8f), - TOBN(0xb8734f9a, 0x3f99c6ab), TOBN(0xf8cc13d5, 0xa3a7bc85), - TOBN(0x80c1b305, 0xc5217659), TOBN(0xfe5364d4, 0x4ec12a54), - TOBN(0xbd87045e, 0x681345fe), TOBN(0x7f8efeb1, 0x582f897f), - TOBN(0xe8cbf1e5, 0xd5923359), TOBN(0xdb0cea9d, 0x539b9fb0), - TOBN(0x0c5b34cf, 0x49859b98), TOBN(0x5e583c56, 0xa4403cc6), - TOBN(0x11fc1a2d, 0xd48185b7), TOBN(0xc93fbc7e, 0x6e521787), - TOBN(0x47e7a058, 0x05105b8b), TOBN(0x7b4d4d58, 0xdb8260c8), - TOBN(0xe33930b0, 0x46eb842a), TOBN(0x8e844a9a, 0x7bdae56d), - TOBN(0x34ef3a9e, 0x13f7fdfc), TOBN(0xb3768f82, 0x636ca176), - TOBN(0x2821f4e0, 0x4e09e61c), TOBN(0x414dc3a1, 0xa0c7cddc), - TOBN(0xd5379437, 0x54945fcd), TOBN(0x151b6eef, 0xb3555ff1), - TOBN(0xb31bd613, 0x6339c083), TOBN(0x39ff8155, 0xdfb64701), - TOBN(0x7c3388d2, 0xe29604ab), TOBN(0x1e19084b, 0xa6b10442), - TOBN(0x17cf54c0, 0xeccd47ef), TOBN(0x89693385, 0x4a5dfb30), - TOBN(0x69d023fb, 0x47daf9f6), TOBN(0x9222840b, 0x7d91d959), - TOBN(0x439108f5, 0x803bac62), TOBN(0x0b7dd91d, 0x379bd45f), - TOBN(0xd651e827, 0xca63c581), TOBN(0x5c5d75f6, 0x509c104f), - TOBN(0x7d5fc738, 0x1f2dc308), TOBN(0x20faa7bf, 0xd98454be), - TOBN(0x95374bee, 0xa517b031), TOBN(0xf036b9b1, 0x642692ac), - TOBN(0xc5106109, 0x39842194), TOBN(0xb7e2353e, 0x49d05295), - TOBN(0xfc8c1d5c, 0xefb42ee0), TOBN(0xe04884eb, 0x08ce811c), - TOBN(0xf1f75d81, 0x7419f40e), TOBN(0x5b0ac162, 0xa995c241), - TOBN(0x120921bb, 0xc4c55646), TOBN(0x713520c2, 0x8d33cf97), - TOBN(0xb4a65a5c, 0xe98c5100), TOBN(0x6cec871d, 0x2ddd0f5a), - TOBN(0x251f0b7f, 0x9ba2e78b), TOBN(0x224a8434, 0xce3a2a5f), - TOBN(0x26827f61, 0x25f5c46f), TOBN(0x6a22bedc, 0x48545ec0), - TOBN(0x25ae5fa0, 0xb1bb5cdc), TOBN(0xd693682f, 0xfcb9b98f), - TOBN(0x32027fe8, 0x91e5d7d3), TOBN(0xf14b7d17, 0x73a07678), - TOBN(0xf88497b3, 0xc0dfdd61), TOBN(0xf7c2eec0, 0x2a8c4f48), - TOBN(0xaa5573f4, 0x3756e621), TOBN(0xc013a240, 0x1825b948), - TOBN(0x1c03b345, 0x63878572), TOBN(0xa0472bea, 0x653a4184), - TOBN(0xf4222e27, 0x0ac69a80), TOBN(0x34096d25, 0xf51e54f6), - TOBN(0x00a648cb, 0x8fffa591), TOBN(0x4e87acdc, 0x69b6527f), - TOBN(0x0575e037, 0xe285ccb4), TOBN(0x188089e4, 0x50ddcf52), - TOBN(0xaa96c9a8, 0x870ff719), TOBN(0x74a56cd8, 0x1fc7e369), - TOBN(0x41d04ee2, 0x1726931a), TOBN(0x0bbbb2c8, 0x3660ecfd), - TOBN(0xa6ef6de5, 0x24818e18), TOBN(0xe421cc51, 0xe7d57887), - TOBN(0xf127d208, 0xbea87be6), TOBN(0x16a475d3, 0xb1cdd682), - TOBN(0x9db1b684, 0x439b63f7), TOBN(0x5359b3db, 0xf0f113b6), - TOBN(0xdfccf1de, 0x8bf06e31), TOBN(0x1fdf8f44, 0xdd383901), - TOBN(0x10775cad, 0x5017e7d2), TOBN(0xdfc3a597, 0x58d11eef), - TOBN(0x6ec9c8a0, 0xb1ecff10), TOBN(0xee6ed6cc, 0x28400549), - TOBN(0xb5ad7bae, 0x1b4f8d73), TOBN(0x61b4f11d, 0xe00aaab9), - TOBN(0x7b32d69b, 0xd4eff2d7), TOBN(0x88ae6771, 0x4288b60f), - TOBN(0x159461b4, 0x37a1e723), TOBN(0x1f3d4789, 0x570aae8c), - TOBN(0x869118c0, 0x7f9871da), TOBN(0x35fbda78, 0xf635e278), - TOBN(0x738f3641, 0xe1541dac), TOBN(0x6794b13a, 0xc0dae45f), - TOBN(0x065064ac, 0x09cc0917), TOBN(0x27c53729, 0xc68540fd), - TOBN(0x0d2d4c8e, 0xef227671), TOBN(0xd23a9f80, 0xa1785a04), - TOBN(0x98c59528, 0x52650359), TOBN(0xfa09ad01, 0x74a1acad), - TOBN(0x082d5a29, 0x0b55bf5c), TOBN(0xa40f1c67, 0x419b8084), - TOBN(0x3a5c752e, 0xdcc18770), TOBN(0x4baf1f2f, 0x8825c3a5), - TOBN(0xebd63f74, 0x21b153ed), TOBN(0xa2383e47, 0xb2f64723), - TOBN(0xe7bf620a, 0x2646d19a), TOBN(0x56cb44ec, 0x03c83ffd), - TOBN(0xaf7267c9, 0x4f6be9f1), TOBN(0x8b2dfd7b, 0xc06bb5e9), - TOBN(0xb87072f2, 0xa672c5c7), TOBN(0xeacb11c8, 0x0d53c5e2), - TOBN(0x22dac29d, 0xff435932), TOBN(0x37bdb99d, 0x4408693c), - TOBN(0xf6e62fb6, 0x2899c20f), TOBN(0x3535d512, 0x447ece24), - TOBN(0xfbdc6b88, 0xff577ce3), TOBN(0x726693bd, 0x190575f2), - TOBN(0x6772b0e5, 0xab4b35a2), TOBN(0x1d8b6001, 0xf5eeaacf), - TOBN(0x728f7ce4, 0x795b9580), TOBN(0x4a20ed2a, 0x41fb81da), - TOBN(0x9f685cd4, 0x4fec01e6), TOBN(0x3ed7ddcc, 0xa7ff50ad), - TOBN(0x460fd264, 0x0c2d97fd), TOBN(0x3a241426, 0xeb82f4f9), - TOBN(0x17d1df2c, 0x6a8ea820), TOBN(0xb2b50d3b, 0xf22cc254), - TOBN(0x03856cba, 0xb7291426), TOBN(0x87fd26ae, 0x04f5ee39), - TOBN(0x9cb696cc, 0x02bee4ba), TOBN(0x53121804, 0x06820fd6), - TOBN(0xa5dfc269, 0x0212e985), TOBN(0x666f7ffa, 0x160f9a09), - TOBN(0xc503cd33, 0xbccd9617), TOBN(0x365dede4, 0xba7730a3), - TOBN(0x798c6355, 0x5ddb0786), TOBN(0xa6c3200e, 0xfc9cd3bc), - TOBN(0x060ffb2c, 0xe5e35efd), TOBN(0x99a4e25b, 0x5555a1c1), - TOBN(0x11d95375, 0xf70b3751), TOBN(0x0a57354a, 0x160e1bf6), - TOBN(0xecb3ae4b, 0xf8e4b065), TOBN(0x07a834c4, 0x2e53022b), - TOBN(0x1cd300b3, 0x8692ed96), TOBN(0x16a6f792, 0x61ee14ec), - TOBN(0x8f1063c6, 0x6a8649ed), TOBN(0xfbcdfcfe, 0x869f3e14), - TOBN(0x2cfb97c1, 0x00a7b3ec), TOBN(0xcea49b3c, 0x7130c2f1), - TOBN(0x462d044f, 0xe9d96488), TOBN(0x4b53d52e, 0x8182a0c1), - TOBN(0x84b6ddd3, 0x0391e9e9), TOBN(0x80ab7b48, 0xb1741a09), - TOBN(0xec0e15d4, 0x27d3317f), TOBN(0x8dfc1ddb, 0x1a64671e), - TOBN(0x93cc5d5f, 0xd49c5b92), TOBN(0xc995d53d, 0x3674a331), - TOBN(0x302e41ec, 0x090090ae), TOBN(0x2278a0cc, 0xedb06830), - TOBN(0x1d025932, 0xfbc99690), TOBN(0x0c32fbd2, 0xb80d68da), - TOBN(0xd79146da, 0xf341a6c1), TOBN(0xae0ba139, 0x1bef68a0), - TOBN(0xc6b8a563, 0x8d774b3a), TOBN(0x1cf307bd, 0x880ba4d7), - TOBN(0xc033bdc7, 0x19803511), TOBN(0xa9f97b3b, 0x8888c3be), - TOBN(0x3d68aebc, 0x85c6d05e), TOBN(0xc3b88a9d, 0x193919eb), - TOBN(0x2d300748, 0xc48b0ee3), TOBN(0x7506bc7c, 0x07a746c1), - TOBN(0xfc48437c, 0x6e6d57f3), TOBN(0x5bd71587, 0xcfeaa91a), - TOBN(0xa4ed0408, 0xc1bc5225), TOBN(0xd0b946db, 0x2719226d), - TOBN(0x109ecd62, 0x758d2d43), TOBN(0x75c8485a, 0x2751759b), - TOBN(0xb0b75f49, 0x9ce4177a), TOBN(0x4fa61a1e, 0x79c10c3d), - TOBN(0xc062d300, 0xa167fcd7), TOBN(0x4df3874c, 0x750f0fa8), - TOBN(0x29ae2cf9, 0x83dfedc9), TOBN(0xf8437134, 0x8d87631a), - TOBN(0xaf571711, 0x7429c8d2), TOBN(0x18d15867, 0x146d9272), - TOBN(0x83053ecf, 0x69769bb7), TOBN(0xc55eb856, 0xc479ab82), - TOBN(0x5ef7791c, 0x21b0f4b2), TOBN(0xaa5956ba, 0x3d491525), - TOBN(0x407a96c2, 0x9fe20eba), TOBN(0xf27168bb, 0xe52a5ad3), - TOBN(0x43b60ab3, 0xbf1d9d89), TOBN(0xe45c51ef, 0x710e727a), - TOBN(0xdfca5276, 0x099b4221), TOBN(0x8dc6407c, 0x2557a159), - TOBN(0x0ead8335, 0x91035895), TOBN(0x0a9db957, 0x9c55dc32), - TOBN(0xe40736d3, 0xdf61bc76), TOBN(0x13a619c0, 0x3f778cdb), - TOBN(0x6dd921a4, 0xc56ea28f), TOBN(0x76a52433, 0x2fa647b4), - TOBN(0x23591891, 0xac5bdc5d), TOBN(0xff4a1a72, 0xbac7dc01), - TOBN(0x9905e261, 0x62df8453), TOBN(0x3ac045df, 0xe63b265f), - TOBN(0x8a3f341b, 0xad53dba7), TOBN(0x8ec269cc, 0x837b625a), - TOBN(0xd71a2782, 0x3ae31189), TOBN(0x8fb4f9a3, 0x55e96120), - TOBN(0x804af823, 0xff9875cf), TOBN(0x23224f57, 0x5d442a9b), - TOBN(0x1c4d3b9e, 0xecc62679), TOBN(0x91da22fb, 0xa0e7ddb1), - TOBN(0xa370324d, 0x6c04a661), TOBN(0x9710d3b6, 0x5e376d17), - TOBN(0xed8c98f0, 0x3044e357), TOBN(0xc364ebbe, 0x6422701c), - TOBN(0x347f5d51, 0x7733d61c), TOBN(0xd55644b9, 0xcea826c3), - TOBN(0x80c6e0ad, 0x55a25548), TOBN(0x0aa7641d, 0x844220a7), - TOBN(0x1438ec81, 0x31810660), TOBN(0x9dfa6507, 0xde4b4043), - TOBN(0x10b515d8, 0xcc3e0273), TOBN(0x1b6066dd, 0x28d8cfb2), - TOBN(0xd3b04591, 0x9c9efebd), TOBN(0x425d4bdf, 0xa21c1ff4), - TOBN(0x5fe5af19, 0xd57607d3), TOBN(0xbbf773f7, 0x54481084), - TOBN(0x8435bd69, 0x94b03ed1), TOBN(0xd9ad1de3, 0x634cc546), - TOBN(0x2cf423fc, 0x00e420ca), TOBN(0xeed26d80, 0xa03096dd), - TOBN(0xd7f60be7, 0xa4db09d2), TOBN(0xf47f569d, 0x960622f7), - TOBN(0xe5925fd7, 0x7296c729), TOBN(0xeff2db26, 0x26ca2715), - TOBN(0xa6fcd014, 0xb913e759), TOBN(0x53da4786, 0x8ff4de93), - TOBN(0x14616d79, 0xc32068e1), TOBN(0xb187d664, 0xccdf352e), - TOBN(0xf7afb650, 0x1dc90b59), TOBN(0x8170e943, 0x7daa1b26), - TOBN(0xc8e3bdd8, 0x700c0a84), TOBN(0x6e8d345f, 0x6482bdfa), - TOBN(0x84cfbfa1, 0xc5c5ea50), TOBN(0xd3baf14c, 0x67960681), - TOBN(0x26398403, 0x0dd50942), TOBN(0xe4b7839c, 0x4716a663), - TOBN(0xd5f1f794, 0xe7de6dc0), TOBN(0x5cd0f4d4, 0x622aa7ce), - TOBN(0x5295f3f1, 0x59acfeec), TOBN(0x8d933552, 0x953e0607), - TOBN(0xc7db8ec5, 0x776c5722), TOBN(0xdc467e62, 0x2b5f290c), - TOBN(0xd4297e70, 0x4ff425a9), TOBN(0x4be924c1, 0x0cf7bb72), - TOBN(0x0d5dc5ae, 0xa1892131), TOBN(0x8bf8a8e3, 0xa705c992), - TOBN(0x73a0b064, 0x7a305ac5), TOBN(0x00c9ca4e, 0x9a8c77a8), - TOBN(0x5dfee80f, 0x83774bdd), TOBN(0x63131602, 0x85734485), - TOBN(0xa1b524ae, 0x914a69a9), TOBN(0xebc2ffaf, 0xd4e300d7), - TOBN(0x52c93db7, 0x7cfa46a5), TOBN(0x71e6161f, 0x21653b50), - TOBN(0x3574fc57, 0xa4bc580a), TOBN(0xc09015dd, 0xe1bc1253), - TOBN(0x4b7b47b2, 0xd174d7aa), TOBN(0x4072d8e8, 0xf3a15d04), - TOBN(0xeeb7d47f, 0xd6fa07ed), TOBN(0x6f2b9ff9, 0xedbdafb1), - TOBN(0x18c51615, 0x3760fe8a), TOBN(0x7a96e6bf, 0xf06c6c13), - TOBN(0x4d7a0410, 0x0ea2d071), TOBN(0xa1914e9b, 0x0be2a5ce), - TOBN(0x5726e357, 0xd8a3c5cf), TOBN(0x1197ecc3, 0x2abb2b13), - TOBN(0x6c0d7f7f, 0x31ae88dd), TOBN(0x15b20d1a, 0xfdbb3efe), - TOBN(0xcd06aa26, 0x70584039), TOBN(0x2277c969, 0xa7dc9747), - TOBN(0xbca69587, 0x7855d815), TOBN(0x899ea238, 0x5188b32a), - TOBN(0x37d9228b, 0x760c1c9d), TOBN(0xc7efbb11, 0x9b5c18da), - TOBN(0x7f0d1bc8, 0x19f6dbc5), TOBN(0x4875384b, 0x07e6905b), - TOBN(0xc7c50baa, 0x3ba8cd86), TOBN(0xb0ce40fb, 0xc2905de0), - TOBN(0x70840673, 0x7a231952), TOBN(0xa912a262, 0xcf43de26), - TOBN(0x9c38ddcc, 0xeb5b76c1), TOBN(0x746f5285, 0x26fc0ab4), - TOBN(0x52a63a50, 0xd62c269f), TOBN(0x60049c55, 0x99458621), - TOBN(0xe7f48f82, 0x3c2f7c9e), TOBN(0x6bd99043, 0x917d5cf3), - TOBN(0xeb1317a8, 0x8701f469), TOBN(0xbd3fe2ed, 0x9a449fe0), - TOBN(0x421e79ca, 0x12ef3d36), TOBN(0x9ee3c36c, 0x3e7ea5de), - TOBN(0xe48198b5, 0xcdff36f7), TOBN(0xaff4f967, 0xc6b82228), - TOBN(0x15e19dd0, 0xc47adb7e), TOBN(0x45699b23, 0x032e7dfa), - TOBN(0x40680c8b, 0x1fae026a), TOBN(0x5a347a48, 0x550dbf4d), - TOBN(0xe652533b, 0x3cef0d7d), TOBN(0xd94f7b18, 0x2bbb4381), - TOBN(0x838752be, 0x0e80f500), TOBN(0x8e6e2488, 0x9e9c9bfb), - TOBN(0xc9751697, 0x16caca6a), TOBN(0x866c49d8, 0x38531ad9), - TOBN(0xc917e239, 0x7151ade1), TOBN(0x2d016ec1, 0x6037c407), - TOBN(0xa407ccc9, 0x00eac3f9), TOBN(0x835f6280, 0xe2ed4748), - TOBN(0xcc54c347, 0x1cc98e0d), TOBN(0x0e969937, 0xdcb572eb), - TOBN(0x1b16c8e8, 0x8f30c9cb), TOBN(0xa606ae75, 0x373c4661), - TOBN(0x47aa689b, 0x35502cab), TOBN(0xf89014ae, 0x4d9bb64f), - TOBN(0x202f6a9c, 0x31c71f7b), TOBN(0x01f95aa3, 0x296ffe5c), - TOBN(0x5fc06014, 0x53cec3a3), TOBN(0xeb991237, 0x5f498a45), - TOBN(0xae9a935e, 0x5d91ba87), TOBN(0xc6ac6281, 0x0b564a19), - TOBN(0x8a8fe81c, 0x3bd44e69), TOBN(0x7c8b467f, 0x9dd11d45), - TOBN(0xf772251f, 0xea5b8e69), TOBN(0xaeecb3bd, 0xc5b75fbc), - TOBN(0x1aca3331, 0x887ff0e5), TOBN(0xbe5d49ff, 0x19f0a131), - TOBN(0x582c13aa, 0xe5c8646f), TOBN(0xdbaa12e8, 0x20e19980), - TOBN(0x8f40f31a, 0xf7abbd94), TOBN(0x1f13f5a8, 0x1dfc7663), - TOBN(0x5d81f1ee, 0xaceb4fc0), TOBN(0x36256002, 0x5e6f0f42), - TOBN(0x4b67d6d7, 0x751370c8), TOBN(0x2608b698, 0x03e80589), - TOBN(0xcfc0d2fc, 0x05268301), TOBN(0xa6943d39, 0x40309212), - TOBN(0x192a90c2, 0x1fd0e1c2), TOBN(0xb209f113, 0x37f1dc76), - TOBN(0xefcc5e06, 0x97bf1298), TOBN(0xcbdb6730, 0x219d639e), - TOBN(0xd009c116, 0xb81e8c6f), TOBN(0xa3ffdde3, 0x1a7ce2e5), - TOBN(0xc53fbaaa, 0xa914d3ba), TOBN(0x836d500f, 0x88df85ee), - TOBN(0xd98dc71b, 0x66ee0751), TOBN(0x5a3d7005, 0x714516fd), - TOBN(0x21d3634d, 0x39eedbba), TOBN(0x35cd2e68, 0x0455a46d), - TOBN(0xc8cafe65, 0xf9d7eb0c), TOBN(0xbda3ce9e, 0x00cefb3e), - TOBN(0xddc17a60, 0x2c9cf7a4), TOBN(0x01572ee4, 0x7bcb8773), - TOBN(0xa92b2b01, 0x8c7548df), TOBN(0x732fd309, 0xa84600e3), - TOBN(0xe22109c7, 0x16543a40), TOBN(0x9acafd36, 0xfede3c6c), - TOBN(0xfb206852, 0x6824e614), TOBN(0x2a4544a9, 0xda25dca0), - TOBN(0x25985262, 0x91d60b06), TOBN(0x281b7be9, 0x28753545), - TOBN(0xec667b1a, 0x90f13b27), TOBN(0x33a83aff, 0x940e2eb4), - TOBN(0x80009862, 0xd5d721d5), TOBN(0x0c3357a3, 0x5bd3a182), - TOBN(0x27f3a83b, 0x7aa2cda4), TOBN(0xb58ae74e, 0xf6f83085), - TOBN(0x2a911a81, 0x2e6dad6b), TOBN(0xde286051, 0xf43d6c5b), - TOBN(0x4bdccc41, 0xf996c4d8), TOBN(0xe7312ec0, 0x0ae1e24e)}, - {TOBN(0xf8d112e7, 0x6e6485b3), TOBN(0x4d3e24db, 0x771c52f8), - TOBN(0x48e3ee41, 0x684a2f6d), TOBN(0x7161957d, 0x21d95551), - TOBN(0x19631283, 0xcdb12a6c), TOBN(0xbf3fa882, 0x2e50e164), - TOBN(0xf6254b63, 0x3166cc73), TOBN(0x3aefa7ae, 0xaee8cc38), - TOBN(0x79b0fe62, 0x3b36f9fd), TOBN(0x26543b23, 0xfde19fc0), - TOBN(0x136e64a0, 0x958482ef), TOBN(0x23f63771, 0x9b095825), - TOBN(0x14cfd596, 0xb6a1142e), TOBN(0x5ea6aac6, 0x335aac0b), - TOBN(0x86a0e8bd, 0xf3081dd5), TOBN(0x5fb89d79, 0x003dc12a), - TOBN(0xf615c33a, 0xf72e34d4), TOBN(0x0bd9ea40, 0x110eec35), - TOBN(0x1c12bc5b, 0xc1dea34e), TOBN(0x686584c9, 0x49ae4699), - TOBN(0x13ad95d3, 0x8c97b942), TOBN(0x4609561a, 0x4e5c7562), - TOBN(0x9e94a4ae, 0xf2737f89), TOBN(0xf57594c6, 0x371c78b6), - TOBN(0x0f0165fc, 0xe3779ee3), TOBN(0xe00e7f9d, 0xbd495d9e), - TOBN(0x1fa4efa2, 0x20284e7a), TOBN(0x4564bade, 0x47ac6219), - TOBN(0x90e6312a, 0xc4708e8e), TOBN(0x4f5725fb, 0xa71e9adf), - TOBN(0xe95f55ae, 0x3d684b9f), TOBN(0x47f7ccb1, 0x1e94b415), - TOBN(0x7322851b, 0x8d946581), TOBN(0xf0d13133, 0xbdf4a012), - TOBN(0xa3510f69, 0x6584dae0), TOBN(0x03a7c171, 0x3c9f6c6d), - TOBN(0x5be97f38, 0xe475381a), TOBN(0xca1ba422, 0x85823334), - TOBN(0xf83cc5c7, 0x0be17dda), TOBN(0x158b1494, 0x0b918c0f), - TOBN(0xda3a77e5, 0x522e6b69), TOBN(0x69c908c3, 0xbbcd6c18), - TOBN(0x1f1b9e48, 0xd924fd56), TOBN(0x37c64e36, 0xaa4bb3f7), - TOBN(0x5a4fdbdf, 0xee478d7d), TOBN(0xba75c8bc, 0x0193f7a0), - TOBN(0x84bc1e84, 0x56cd16df), TOBN(0x1fb08f08, 0x46fad151), - TOBN(0x8a7cabf9, 0x842e9f30), TOBN(0xa331d4bf, 0x5eab83af), - TOBN(0xd272cfba, 0x017f2a6a), TOBN(0x27560abc, 0x83aba0e3), - TOBN(0x94b83387, 0x0e3a6b75), TOBN(0x25c6aea2, 0x6b9f50f5), - TOBN(0x803d691d, 0xb5fdf6d0), TOBN(0x03b77509, 0xe6333514), - TOBN(0x36178903, 0x61a341c1), TOBN(0x3604dc60, 0x0cfd6142), - TOBN(0x022295eb, 0x8533316c), TOBN(0x3dbde4ac, 0x44af2922), - TOBN(0x898afc5d, 0x1c7eef69), TOBN(0x58896805, 0xd14f4fa1), - TOBN(0x05002160, 0x203c21ca), TOBN(0x6f0d1f30, 0x40ef730b), - TOBN(0x8e8c44d4, 0x196224f8), TOBN(0x75a4ab95, 0x374d079d), - TOBN(0x79085ecc, 0x7d48f123), TOBN(0x56f04d31, 0x1bf65ad8), - TOBN(0xe220bf1c, 0xbda602b2), TOBN(0x73ee1742, 0xf9612c69), - TOBN(0x76008fc8, 0x084fd06b), TOBN(0x4000ef9f, 0xf11380d1), - TOBN(0x48201b4b, 0x12cfe297), TOBN(0x3eee129c, 0x292f74e5), - TOBN(0xe1fe114e, 0xc9e874e8), TOBN(0x899b055c, 0x92c5fc41), - TOBN(0x4e477a64, 0x3a39c8cf), TOBN(0x82f09efe, 0x78963cc9), - TOBN(0x6fd3fd8f, 0xd333f863), TOBN(0x85132b2a, 0xdc949c63), - TOBN(0x7e06a3ab, 0x516eb17b), TOBN(0x73bec06f, 0xd2c7372b), - TOBN(0xe4f74f55, 0xba896da6), TOBN(0xbb4afef8, 0x8e9eb40f), - TOBN(0x2d75bec8, 0xe61d66b0), TOBN(0x02bda4b4, 0xef29300b), - TOBN(0x8bbaa8de, 0x026baa5a), TOBN(0xff54befd, 0xa07f4440), - TOBN(0xbd9b8b1d, 0xbe7a2af3), TOBN(0xec51caa9, 0x4fb74a72), - TOBN(0xb9937a4b, 0x63879697), TOBN(0x7c9a9d20, 0xec2687d5), - TOBN(0x1773e44f, 0x6ef5f014), TOBN(0x8abcf412, 0xe90c6900), - TOBN(0x387bd022, 0x8142161e), TOBN(0x50393755, 0xfcb6ff2a), - TOBN(0x9813fd56, 0xed6def63), TOBN(0x53cf6482, 0x7d53106c), - TOBN(0x991a35bd, 0x431f7ac1), TOBN(0xf1e274dd, 0x63e65faf), - TOBN(0xf63ffa3c, 0x44cc7880), TOBN(0x411a426b, 0x7c256981), - TOBN(0xb698b9fd, 0x93a420e0), TOBN(0x89fdddc0, 0xae53f8fe), - TOBN(0x766e0722, 0x32398baa), TOBN(0x205fee42, 0x5cfca031), - TOBN(0xa49f5341, 0x7a029cf2), TOBN(0xa88c68b8, 0x4023890d), - TOBN(0xbc275041, 0x7337aaa8), TOBN(0x9ed364ad, 0x0eb384f4), - TOBN(0xe0816f85, 0x29aba92f), TOBN(0x2e9e1941, 0x04e38a88), - TOBN(0x57eef44a, 0x3dafd2d5), TOBN(0x35d1fae5, 0x97ed98d8), - TOBN(0x50628c09, 0x2307f9b1), TOBN(0x09d84aae, 0xd6cba5c6), - TOBN(0x67071bc7, 0x88aaa691), TOBN(0x2dea57a9, 0xafe6cb03), - TOBN(0xdfe11bb4, 0x3d78ac01), TOBN(0x7286418c, 0x7fd7aa51), - TOBN(0xfabf7709, 0x77f7195a), TOBN(0x8ec86167, 0xadeb838f), - TOBN(0xea1285a8, 0xbb4f012d), TOBN(0xd6883503, 0x9a3eab3f), - TOBN(0xee5d24f8, 0x309004c2), TOBN(0xa96e4b76, 0x13ffe95e), - TOBN(0x0cdffe12, 0xbd223ea4), TOBN(0x8f5c2ee5, 0xb6739a53), - TOBN(0x5cb4aaa5, 0xdd968198), TOBN(0xfa131c52, 0x72413a6c), - TOBN(0x53d46a90, 0x9536d903), TOBN(0xb270f0d3, 0x48606d8e), - TOBN(0x518c7564, 0xa053a3bc), TOBN(0x088254b7, 0x1a86caef), - TOBN(0xb3ba8cb4, 0x0ab5efd0), TOBN(0x5c59900e, 0x4605945d), - TOBN(0xecace1dd, 0xa1887395), TOBN(0x40960f36, 0x932a65de), - TOBN(0x9611ff5c, 0x3aa95529), TOBN(0xc58215b0, 0x7c1e5a36), - TOBN(0xd48c9b58, 0xf0e1a524), TOBN(0xb406856b, 0xf590dfb8), - TOBN(0xc7605e04, 0x9cd95662), TOBN(0x0dd036ee, 0xa33ecf82), - TOBN(0xa50171ac, 0xc33156b3), TOBN(0xf09d24ea, 0x4a80172e), - TOBN(0x4e1f72c6, 0x76dc8eef), TOBN(0xe60caadc, 0x5e3d44ee), - TOBN(0x006ef8a6, 0x979b1d8f), TOBN(0x60908a1c, 0x97788d26), - TOBN(0x6e08f95b, 0x266feec0), TOBN(0x618427c2, 0x22e8c94e), - TOBN(0x3d613339, 0x59145a65), TOBN(0xcd9bc368, 0xfa406337), - TOBN(0x82d11be3, 0x2d8a52a0), TOBN(0xf6877b27, 0x97a1c590), - TOBN(0x837a819b, 0xf5cbdb25), TOBN(0x2a4fd1d8, 0xde090249), - TOBN(0x622a7de7, 0x74990e5f), TOBN(0x840fa5a0, 0x7945511b), - TOBN(0x30b974be, 0x6558842d), TOBN(0x70df8c64, 0x17f3d0a6), - TOBN(0x7c803520, 0x7542e46d), TOBN(0x7251fe7f, 0xe4ecc823), - TOBN(0xe59134cb, 0x5e9aac9a), TOBN(0x11bb0934, 0xf0045d71), - TOBN(0x53e5d9b5, 0xdbcb1d4e), TOBN(0x8d97a905, 0x92defc91), - TOBN(0xfe289327, 0x7946d3f9), TOBN(0xe132bd24, 0x07472273), - TOBN(0xeeeb510c, 0x1eb6ae86), TOBN(0x777708c5, 0xf0595067), - TOBN(0x18e2c8cd, 0x1297029e), TOBN(0x2c61095c, 0xbbf9305e), - TOBN(0xe466c258, 0x6b85d6d9), TOBN(0x8ac06c36, 0xda1ea530), - TOBN(0xa365dc39, 0xa1304668), TOBN(0xe4a9c885, 0x07f89606), - TOBN(0x65a4898f, 0xacc7228d), TOBN(0x3e2347ff, 0x84ca8303), - TOBN(0xa5f6fb77, 0xea7d23a3), TOBN(0x2fac257d, 0x672a71cd), - TOBN(0x6908bef8, 0x7e6a44d3), TOBN(0x8ff87566, 0x891d3d7a), - TOBN(0xe58e90b3, 0x6b0cf82e), TOBN(0x6438d246, 0x2615b5e7), - TOBN(0x07b1f8fc, 0x669c145a), TOBN(0xb0d8b2da, 0x36f1e1cb), - TOBN(0x54d5dadb, 0xd9184c4d), TOBN(0x3dbb18d5, 0xf93d9976), - TOBN(0x0a3e0f56, 0xd1147d47), TOBN(0x2afa8c8d, 0xa0a48609), - TOBN(0x275353e8, 0xbc36742c), TOBN(0x898f427e, 0xeea0ed90), - TOBN(0x26f4947e, 0x3e477b00), TOBN(0x8ad8848a, 0x308741e3), - TOBN(0x6c703c38, 0xd74a2a46), TOBN(0x5e3e05a9, 0x9ba17ba2), - TOBN(0xc1fa6f66, 0x4ab9a9e4), TOBN(0x474a2d9a, 0x3841d6ec), - TOBN(0x871239ad, 0x653ae326), TOBN(0x14bcf72a, 0xa74cbb43), - TOBN(0x8737650e, 0x20d4c083), TOBN(0x3df86536, 0x110ed4af), - TOBN(0xd2d86fe7, 0xb53ca555), TOBN(0x688cb00d, 0xabd5d538), - TOBN(0xcf81bda3, 0x1ad38468), TOBN(0x7ccfe3cc, 0xf01167b6), - TOBN(0xcf4f47e0, 0x6c4c1fe6), TOBN(0x557e1f1a, 0x298bbb79), - TOBN(0xf93b974f, 0x30d45a14), TOBN(0x174a1d2d, 0x0baf97c4), - TOBN(0x7a003b30, 0xc51fbf53), TOBN(0xd8940991, 0xee68b225), - TOBN(0x5b0aa7b7, 0x1c0f4173), TOBN(0x975797c9, 0xa20a7153), - TOBN(0x26e08c07, 0xe3533d77), TOBN(0xd7222e6a, 0x2e341c99), - TOBN(0x9d60ec3d, 0x8d2dc4ed), TOBN(0xbdfe0d8f, 0x7c476cf8), - TOBN(0x1fe59ab6, 0x1d056605), TOBN(0xa9ea9df6, 0x86a8551f), - TOBN(0x8489941e, 0x47fb8d8c), TOBN(0xfeb874eb, 0x4a7f1b10), - TOBN(0xfe5fea86, 0x7ee0d98f), TOBN(0x201ad34b, 0xdbf61864), - TOBN(0x45d8fe47, 0x37c031d4), TOBN(0xd5f49fae, 0x795f0822), - TOBN(0xdb0fb291, 0xc7f4a40c), TOBN(0x2e69d9c1, 0x730ddd92), - TOBN(0x754e1054, 0x49d76987), TOBN(0x8a24911d, 0x7662db87), - TOBN(0x61fc1810, 0x60a71676), TOBN(0xe852d1a8, 0xf66a8ad1), - TOBN(0x172bbd65, 0x6417231e), TOBN(0x0d6de7bd, 0x3babb11f), - TOBN(0x6fde6f88, 0xc8e347f8), TOBN(0x1c587547, 0x9bd99cc3), - TOBN(0x78e54ed0, 0x34076950), TOBN(0x97f0f334, 0x796e83ba), - TOBN(0xe4dbe1ce, 0x4924867a), TOBN(0xbd5f51b0, 0x60b84917), - TOBN(0x37530040, 0x3cb09a79), TOBN(0xdb3fe0f8, 0xff1743d8), - TOBN(0xed7894d8, 0x556fa9db), TOBN(0xfa262169, 0x23412fbf), - TOBN(0x563be0db, 0xba7b9291), TOBN(0x6ca8b8c0, 0x0c9fb234), - TOBN(0xed406aa9, 0xbd763802), TOBN(0xc21486a0, 0x65303da1), - TOBN(0x61ae291e, 0xc7e62ec4), TOBN(0x622a0492, 0xdf99333e), - TOBN(0x7fd80c9d, 0xbb7a8ee0), TOBN(0xdc2ed3bc, 0x6c01aedb), - TOBN(0x35c35a12, 0x08be74ec), TOBN(0xd540cb1a, 0x469f671f), - TOBN(0xd16ced4e, 0xcf84f6c7), TOBN(0x8561fb9c, 0x2d090f43), - TOBN(0x7e693d79, 0x6f239db4), TOBN(0xa736f928, 0x77bd0d94), - TOBN(0x07b4d929, 0x2c1950ee), TOBN(0xda177543, 0x56dc11b3), - TOBN(0xa5dfbbaa, 0x7a6a878e), TOBN(0x1c70cb29, 0x4decb08a), - TOBN(0xfba28c8b, 0x6f0f7c50), TOBN(0xa8eba2b8, 0x854dcc6d), - TOBN(0x5ff8e89a, 0x36b78642), TOBN(0x070c1c8e, 0xf6873adf), - TOBN(0xbbd3c371, 0x6484d2e4), TOBN(0xfb78318f, 0x0d414129), - TOBN(0x2621a39c, 0x6ad93b0b), TOBN(0x979d74c2, 0xa9e917f7), - TOBN(0xfc195647, 0x61fb0428), TOBN(0x4d78954a, 0xbee624d4), - TOBN(0xb94896e0, 0xb8ae86fd), TOBN(0x6667ac0c, 0xc91c8b13), - TOBN(0x9f180512, 0x43bcf832), TOBN(0xfbadf8b7, 0xa0010137), - TOBN(0xc69b4089, 0xb3ba8aa7), TOBN(0xfac4bacd, 0xe687ce85), - TOBN(0x9164088d, 0x977eab40), TOBN(0x51f4c5b6, 0x2760b390), - TOBN(0xd238238f, 0x340dd553), TOBN(0x358566c3, 0xdb1d31c9), - TOBN(0x3a5ad69e, 0x5068f5ff), TOBN(0xf31435fc, 0xdaff6b06), - TOBN(0xae549a5b, 0xd6debff0), TOBN(0x59e5f0b7, 0x75e01331), - TOBN(0x5d492fb8, 0x98559acf), TOBN(0x96018c2e, 0x4db79b50), - TOBN(0x55f4a48f, 0x609f66aa), TOBN(0x1943b3af, 0x4900a14f), - TOBN(0xc22496df, 0x15a40d39), TOBN(0xb2a44684, 0x4c20f7c5), - TOBN(0x76a35afa, 0x3b98404c), TOBN(0xbec75725, 0xff5d1b77), - TOBN(0xb67aa163, 0xbea06444), TOBN(0x27e95bb2, 0xf724b6f2), - TOBN(0x3c20e3e9, 0xd238c8ab), TOBN(0x1213754e, 0xddd6ae17), - TOBN(0x8c431020, 0x716e0f74), TOBN(0x6679c82e, 0xffc095c2), - TOBN(0x2eb3adf4, 0xd0ac2932), TOBN(0x2cc970d3, 0x01bb7a76), - TOBN(0x70c71f2f, 0x740f0e66), TOBN(0x545c616b, 0x2b6b23cc), - TOBN(0x4528cfcb, 0xb40a8bd7), TOBN(0xff839633, 0x2ab27722), - TOBN(0x049127d9, 0x025ac99a), TOBN(0xd314d4a0, 0x2b63e33b), - TOBN(0xc8c310e7, 0x28d84519), TOBN(0x0fcb8983, 0xb3bc84ba), - TOBN(0x2cc52261, 0x38634818), TOBN(0x501814f4, 0xb44c2e0b), - TOBN(0xf7e181aa, 0x54dfdba3), TOBN(0xcfd58ff0, 0xe759718c), - TOBN(0xf90cdb14, 0xd3b507a8), TOBN(0x57bd478e, 0xc50bdad8), - TOBN(0x29c197e2, 0x50e5f9aa), TOBN(0x4db6eef8, 0xe40bc855), - TOBN(0x2cc8f21a, 0xd1fc0654), TOBN(0xc71cc963, 0x81269d73), - TOBN(0xecfbb204, 0x077f49f9), TOBN(0xdde92571, 0xca56b793), - TOBN(0x9abed6a3, 0xf97ad8f7), TOBN(0xe6c19d3f, 0x924de3bd), - TOBN(0x8dce92f4, 0xa140a800), TOBN(0x85f44d1e, 0x1337af07), - TOBN(0x5953c08b, 0x09d64c52), TOBN(0xa1b5e49f, 0xf5df9749), - TOBN(0x336a8fb8, 0x52735f7d), TOBN(0xb332b6db, 0x9add676b), - TOBN(0x558b88a0, 0xb4511aa4), TOBN(0x09788752, 0xdbd5cc55), - TOBN(0x16b43b9c, 0xd8cd52bd), TOBN(0x7f0bc5a0, 0xc2a2696b), - TOBN(0x146e12d4, 0xc11f61ef), TOBN(0x9ce10754, 0x3a83e79e), - TOBN(0x08ec73d9, 0x6cbfca15), TOBN(0x09ff29ad, 0x5b49653f), - TOBN(0xe31b72bd, 0xe7da946e), TOBN(0xebf9eb3b, 0xee80a4f2), - TOBN(0xd1aabd08, 0x17598ce4), TOBN(0x18b5fef4, 0x53f37e80), - TOBN(0xd5d5cdd3, 0x5958cd79), TOBN(0x3580a1b5, 0x1d373114), - TOBN(0xa36e4c91, 0xfa935726), TOBN(0xa38c534d, 0xef20d760), - TOBN(0x7088e40a, 0x2ff5845b), TOBN(0xe5bb40bd, 0xbd78177f), - TOBN(0x4f06a7a8, 0x857f9920), TOBN(0xe3cc3e50, 0xe968f05d), - TOBN(0x1d68b7fe, 0xe5682d26), TOBN(0x5206f76f, 0xaec7f87c), - TOBN(0x41110530, 0x041951ab), TOBN(0x58ec52c1, 0xd4b5a71a), - TOBN(0xf3488f99, 0x0f75cf9a), TOBN(0xf411951f, 0xba82d0d5), - TOBN(0x27ee75be, 0x618895ab), TOBN(0xeae060d4, 0x6d8aab14), - TOBN(0x9ae1df73, 0x7fb54dc2), TOBN(0x1f3e391b, 0x25963649), - TOBN(0x242ec32a, 0xfe055081), TOBN(0x5bd450ef, 0x8491c9bd), - TOBN(0x367efc67, 0x981eb389), TOBN(0xed7e1928, 0x3a0550d5), - TOBN(0x362e776b, 0xab3ce75c), TOBN(0xe890e308, 0x1f24c523), - TOBN(0xb961b682, 0xfeccef76), TOBN(0x8b8e11f5, 0x8bba6d92), - TOBN(0x8f2ccc4c, 0x2b2375c4), TOBN(0x0d7f7a52, 0xe2f86cfa), - TOBN(0xfd94d30a, 0x9efe5633), TOBN(0x2d8d246b, 0x5451f934), - TOBN(0x2234c6e3, 0x244e6a00), TOBN(0xde2b5b0d, 0xddec8c50), - TOBN(0x2ce53c5a, 0xbf776f5b), TOBN(0x6f724071, 0x60357b05), - TOBN(0xb2593717, 0x71bf3f7a), TOBN(0x87d2501c, 0x440c4a9f), - TOBN(0x440552e1, 0x87b05340), TOBN(0xb7bf7cc8, 0x21624c32), - TOBN(0x4155a6ce, 0x22facddb), TOBN(0x5a4228cb, 0x889837ef), - TOBN(0xef87d6d6, 0xfd4fd671), TOBN(0xa233687e, 0xc2daa10e), - TOBN(0x75622244, 0x03c0eb96), TOBN(0x7632d184, 0x8bf19be6), - TOBN(0x05d0f8e9, 0x40735ff4), TOBN(0x3a3e6e13, 0xc00931f1), - TOBN(0x31ccde6a, 0xdafe3f18), TOBN(0xf381366a, 0xcfe51207), - TOBN(0x24c222a9, 0x60167d92), TOBN(0x62f9d6f8, 0x7529f18c), - TOBN(0x412397c0, 0x0353b114), TOBN(0x334d89dc, 0xef808043), - TOBN(0xd9ec63ba, 0x2a4383ce), TOBN(0xcec8e937, 0x5cf92ba0), - TOBN(0xfb8b4288, 0xc8be74c0), TOBN(0x67d6912f, 0x105d4391), - TOBN(0x7b996c46, 0x1b913149), TOBN(0x36aae2ef, 0x3a4e02da), - TOBN(0xb68aa003, 0x972de594), TOBN(0x284ec70d, 0x4ec6d545), - TOBN(0xf3d2b2d0, 0x61391d54), TOBN(0x69c5d5d6, 0xfe114e92), - TOBN(0xbe0f00b5, 0xb4482dff), TOBN(0xe1596fa5, 0xf5bf33c5), - TOBN(0x10595b56, 0x96a71cba), TOBN(0x944938b2, 0xfdcadeb7), - TOBN(0xa282da4c, 0xfccd8471), TOBN(0x98ec05f3, 0x0d37bfe1), - TOBN(0xe171ce1b, 0x0698304a), TOBN(0x2d691444, 0x21bdf79b), - TOBN(0xd0cd3b74, 0x1b21dec1), TOBN(0x712ecd8b, 0x16a15f71), - TOBN(0x8d4c00a7, 0x00fd56e1), TOBN(0x02ec9692, 0xf9527c18), - TOBN(0x21c44937, 0x4a3e42e1), TOBN(0x9176fbab, 0x1392ae0a), - TOBN(0x8726f1ba, 0x44b7b618), TOBN(0xb4d7aae9, 0xf1de491c), - TOBN(0xf91df7b9, 0x07b582c0), TOBN(0x7e116c30, 0xef60aa3a), - TOBN(0x99270f81, 0x466265d7), TOBN(0xb15b6fe2, 0x4df7adf0), - TOBN(0xfe33b2d3, 0xf9738f7f), TOBN(0x48553ab9, 0xd6d70f95), - TOBN(0x2cc72ac8, 0xc21e94db), TOBN(0x795ac38d, 0xbdc0bbee), - TOBN(0x0a1be449, 0x2e40478f), TOBN(0x81bd3394, 0x052bde55), - TOBN(0x63c8dbe9, 0x56b3c4f2), TOBN(0x017a99cf, 0x904177cc), - TOBN(0x947bbddb, 0x4d010fc1), TOBN(0xacf9b00b, 0xbb2c9b21), - TOBN(0x2970bc8d, 0x47173611), TOBN(0x1a4cbe08, 0xac7d756f), - TOBN(0x06d9f4aa, 0x67d541a2), TOBN(0xa3e8b689, 0x59c2cf44), - TOBN(0xaad066da, 0x4d88f1dd), TOBN(0xc604f165, 0x7ad35dea), - TOBN(0x7edc0720, 0x4478ca67), TOBN(0xa10dfae0, 0xba02ce06), - TOBN(0xeceb1c76, 0xaf36f4e4), TOBN(0x994b2292, 0xaf3f8f48), - TOBN(0xbf9ed77b, 0x77c8a68c), TOBN(0x74f544ea, 0x51744c9d), - TOBN(0x82d05bb9, 0x8113a757), TOBN(0x4ef2d2b4, 0x8a9885e4), - TOBN(0x1e332be5, 0x1aa7865f), TOBN(0x22b76b18, 0x290d1a52), - TOBN(0x308a2310, 0x44351683), TOBN(0x9d861896, 0xa3f22840), - TOBN(0x5959ddcd, 0x841ed947), TOBN(0x0def0c94, 0x154b73bf), - TOBN(0xf0105417, 0x4c7c15e0), TOBN(0x539bfb02, 0x3a277c32), - TOBN(0xe699268e, 0xf9dccf5f), TOBN(0x9f5796a5, 0x0247a3bd), - TOBN(0x8b839de8, 0x4f157269), TOBN(0xc825c1e5, 0x7a30196b), - TOBN(0x6ef0aabc, 0xdc8a5a91), TOBN(0xf4a8ce6c, 0x498b7fe6), - TOBN(0x1cce35a7, 0x70cbac78), TOBN(0x83488e9b, 0xf6b23958), - TOBN(0x0341a070, 0xd76cb011), TOBN(0xda6c9d06, 0xae1b2658), - TOBN(0xb701fb30, 0xdd648c52), TOBN(0x994ca02c, 0x52fb9fd1), - TOBN(0x06933117, 0x6f563086), TOBN(0x3d2b8100, 0x17856bab), - TOBN(0xe89f48c8, 0x5963a46e), TOBN(0x658ab875, 0xa99e61c7), - TOBN(0x6e296f87, 0x4b8517b4), TOBN(0x36c4fcdc, 0xfc1bc656), - TOBN(0xde5227a1, 0xa3906def), TOBN(0x9fe95f57, 0x62418945), - TOBN(0x20c91e81, 0xfdd96cde), TOBN(0x5adbe47e, 0xda4480de), - TOBN(0xa009370f, 0x396de2b6), TOBN(0x98583d4b, 0xf0ecc7bd), - TOBN(0xf44f6b57, 0xe51d0672), TOBN(0x03d6b078, 0x556b1984), - TOBN(0x27dbdd93, 0xb0b64912), TOBN(0x9b3a3434, 0x15687b09), - TOBN(0x0dba6461, 0x51ec20a9), TOBN(0xec93db7f, 0xff28187c), - TOBN(0x00ff8c24, 0x66e48bdd), TOBN(0x2514f2f9, 0x11ccd78e), - TOBN(0xeba11f4f, 0xe1250603), TOBN(0x8a22cd41, 0x243fa156), - TOBN(0xa4e58df4, 0xb283e4c6), TOBN(0x78c29859, 0x8b39783f), - TOBN(0x5235aee2, 0xa5259809), TOBN(0xc16284b5, 0x0e0227dd), - TOBN(0xa5f57916, 0x1338830d), TOBN(0x6d4b8a6b, 0xd2123fca), - TOBN(0x236ea68a, 0xf9c546f8), TOBN(0xc1d36873, 0xfa608d36), - TOBN(0xcd76e495, 0x8d436d13), TOBN(0xd4d9c221, 0x8fb080af), - TOBN(0x665c1728, 0xe8ad3fb5), TOBN(0xcf1ebe4d, 0xb3d572e0), - TOBN(0xa7a8746a, 0x584c5e20), TOBN(0x267e4ea1, 0xb9dc7035), - TOBN(0x593a15cf, 0xb9548c9b), TOBN(0x5e6e2135, 0x4bd012f3), - TOBN(0xdf31cc6a, 0x8c8f936e), TOBN(0x8af84d04, 0xb5c241dc), - TOBN(0x63990a6f, 0x345efb86), TOBN(0x6fef4e61, 0xb9b962cb)}, - {TOBN(0xf6368f09, 0x25722608), TOBN(0x131260db, 0x131cf5c6), - TOBN(0x40eb353b, 0xfab4f7ac), TOBN(0x85c78880, 0x37eee829), - TOBN(0x4c1581ff, 0xc3bdf24e), TOBN(0x5bff75cb, 0xf5c3c5a8), - TOBN(0x35e8c83f, 0xa14e6f40), TOBN(0xb81d1c0f, 0x0295e0ca), - TOBN(0xfcde7cc8, 0xf43a730f), TOBN(0xe89b6f3c, 0x33ab590e), - TOBN(0xc823f529, 0xad03240b), TOBN(0x82b79afe, 0x98bea5db), - TOBN(0x568f2856, 0x962fe5de), TOBN(0x0c590adb, 0x60c591f3), - TOBN(0x1fc74a14, 0x4a28a858), TOBN(0x3b662498, 0xb3203f4c), - TOBN(0x91e3cf0d, 0x6c39765a), TOBN(0xa2db3acd, 0xac3cca0b), - TOBN(0x288f2f08, 0xcb953b50), TOBN(0x2414582c, 0xcf43cf1a), - TOBN(0x8dec8bbc, 0x60eee9a8), TOBN(0x54c79f02, 0x729aa042), - TOBN(0xd81cd5ec, 0x6532f5d5), TOBN(0xa672303a, 0xcf82e15f), - TOBN(0x376aafa8, 0x719c0563), TOBN(0xcd8ad2dc, 0xbc5fc79f), - TOBN(0x303fdb9f, 0xcb750cd3), TOBN(0x14ff052f, 0x4418b08e), - TOBN(0xf75084cf, 0x3e2d6520), TOBN(0x7ebdf0f8, 0x144ed509), - TOBN(0xf43bf0f2, 0xd3f25b98), TOBN(0x86ad71cf, 0xa354d837), - TOBN(0xb827fe92, 0x26f43572), TOBN(0xdfd3ab5b, 0x5d824758), - TOBN(0x315dd23a, 0x539094c1), TOBN(0x85c0e37a, 0x66623d68), - TOBN(0x575c7972, 0x7be19ae0), TOBN(0x616a3396, 0xdf0d36b5), - TOBN(0xa1ebb3c8, 0x26b1ff7e), TOBN(0x635b9485, 0x140ad453), - TOBN(0x92bf3cda, 0xda430c0b), TOBN(0x4702850e, 0x3a96dac6), - TOBN(0xc91cf0a5, 0x15ac326a), TOBN(0x95de4f49, 0xab8c25e4), - TOBN(0xb01bad09, 0xe265c17c), TOBN(0x24e45464, 0x087b3881), - TOBN(0xd43e583c, 0xe1fac5ca), TOBN(0xe17cb318, 0x6ead97a6), - TOBN(0x6cc39243, 0x74dcec46), TOBN(0x33cfc02d, 0x54c2b73f), - TOBN(0x82917844, 0xf26cd99c), TOBN(0x8819dd95, 0xd1773f89), - TOBN(0x09572aa6, 0x0871f427), TOBN(0x8e0cf365, 0xf6f01c34), - TOBN(0x7fa52988, 0xbff1f5af), TOBN(0x4eb357ea, 0xe75e8e50), - TOBN(0xd9d0c8c4, 0x868af75d), TOBN(0xd7325cff, 0x45c8c7ea), - TOBN(0xab471996, 0xcc81ecb0), TOBN(0xff5d55f3, 0x611824ed), - TOBN(0xbe314541, 0x1977a0ee), TOBN(0x5085c4c5, 0x722038c6), - TOBN(0x2d5335bf, 0xf94bb495), TOBN(0x894ad8a6, 0xc8e2a082), - TOBN(0x5c3e2341, 0xada35438), TOBN(0xf4a9fc89, 0x049b8c4e), - TOBN(0xbeeb355a, 0x9f17cf34), TOBN(0x3f311e0e, 0x6c91fe10), - TOBN(0xc2d20038, 0x92ab9891), TOBN(0x257bdcc1, 0x3e8ce9a9), - TOBN(0x1b2d9789, 0x88c53bee), TOBN(0x927ce89a, 0xcdba143a), - TOBN(0xb0a32cca, 0x523db280), TOBN(0x5c889f8a, 0x50d43783), - TOBN(0x503e04b3, 0x4897d16f), TOBN(0x8cdb6e78, 0x08f5f2e8), - TOBN(0x6ab91cf0, 0x179c8e74), TOBN(0xd8874e52, 0x48211d60), - TOBN(0xf948d4d5, 0xea851200), TOBN(0x4076d41e, 0xe6f9840a), - TOBN(0xc20e263c, 0x47b517ea), TOBN(0x79a448fd, 0x30685e5e), - TOBN(0xe55f6f78, 0xf90631a0), TOBN(0x88a790b1, 0xa79e6346), - TOBN(0x62160c7d, 0x80969fe8), TOBN(0x54f92fd4, 0x41491bb9), - TOBN(0xa6645c23, 0x5c957526), TOBN(0xf44cc5ae, 0xbea3ce7b), - TOBN(0xf7628327, 0x8b1e68b7), TOBN(0xc731ad7a, 0x303f29d3), - TOBN(0xfe5a9ca9, 0x57d03ecb), TOBN(0x96c0d50c, 0x41bc97a7), - TOBN(0xc4669fe7, 0x9b4f7f24), TOBN(0xfdd781d8, 0x3d9967ef), - TOBN(0x7892c7c3, 0x5d2c208d), TOBN(0x8bf64f7c, 0xae545cb3), - TOBN(0xc01f862c, 0x467be912), TOBN(0xf4c85ee9, 0xc73d30cc), - TOBN(0x1fa6f4be, 0x6ab83ec7), TOBN(0xa07a3c1c, 0x4e3e3cf9), - TOBN(0x87f8ef45, 0x0c00beb3), TOBN(0x30e2c2b3, 0x000d4c3e), - TOBN(0x1aa00b94, 0xfe08bf5b), TOBN(0x32c133aa, 0x9224ef52), - TOBN(0x38df16bb, 0x32e5685d), TOBN(0x68a9e069, 0x58e6f544), - TOBN(0x495aaff7, 0xcdc5ebc6), TOBN(0xf894a645, 0x378b135f), - TOBN(0xf316350a, 0x09e27ecf), TOBN(0xeced201e, 0x58f7179d), - TOBN(0x2eec273c, 0xe97861ba), TOBN(0x47ec2cae, 0xd693be2e), - TOBN(0xfa4c97c4, 0xf68367ce), TOBN(0xe4f47d0b, 0xbe5a5755), - TOBN(0x17de815d, 0xb298a979), TOBN(0xd7eca659, 0xc177dc7d), - TOBN(0x20fdbb71, 0x49ded0a3), TOBN(0x4cb2aad4, 0xfb34d3c5), - TOBN(0x2cf31d28, 0x60858a33), TOBN(0x3b6873ef, 0xa24aa40f), - TOBN(0x540234b2, 0x2c11bb37), TOBN(0x2d0366dd, 0xed4c74a3), - TOBN(0xf9a968da, 0xeec5f25d), TOBN(0x36601068, 0x67b63142), - TOBN(0x07cd6d2c, 0x68d7b6d4), TOBN(0xa8f74f09, 0x0c842942), - TOBN(0xe2751404, 0x7768b1ee), TOBN(0x4b5f7e89, 0xfe62aee4), - TOBN(0xc6a77177, 0x89070d26), TOBN(0xa1f28e4e, 0xdd1c8bc7), - TOBN(0xea5f4f06, 0x469e1f17), TOBN(0x78fc242a, 0xfbdb78e0), - TOBN(0xc9c7c592, 0x8b0588f1), TOBN(0xb6b7a0fd, 0x1535921e), - TOBN(0xcc5bdb91, 0xbde5ae35), TOBN(0xb42c485e, 0x12ff1864), - TOBN(0xa1113e13, 0xdbab98aa), TOBN(0xde9d469b, 0xa17b1024), - TOBN(0x23f48b37, 0xc0462d3a), TOBN(0x3752e537, 0x7c5c078d), - TOBN(0xe3a86add, 0x15544eb9), TOBN(0xf013aea7, 0x80fba279), - TOBN(0x8b5bb76c, 0xf22001b5), TOBN(0xe617ba14, 0xf02891ab), - TOBN(0xd39182a6, 0x936219d3), TOBN(0x5ce1f194, 0xae51cb19), - TOBN(0xc78f8598, 0xbf07a74c), TOBN(0x6d7158f2, 0x22cbf1bc), - TOBN(0x3b846b21, 0xe300ce18), TOBN(0x35fba630, 0x2d11275d), - TOBN(0x5fe25c36, 0xa0239b9b), TOBN(0xd8beb35d, 0xdf05d940), - TOBN(0x4db02bb0, 0x1f7e320d), TOBN(0x0641c364, 0x6da320ea), - TOBN(0x6d95fa5d, 0x821389a3), TOBN(0x92699748, 0x8fcd8e3d), - TOBN(0x316fef17, 0xceb6c143), TOBN(0x67fcb841, 0xd933762b), - TOBN(0xbb837e35, 0x118b17f8), TOBN(0x4b92552f, 0x9fd24821), - TOBN(0xae6bc70e, 0x46aca793), TOBN(0x1cf0b0e4, 0xe579311b), - TOBN(0x8dc631be, 0x5802f716), TOBN(0x099bdc6f, 0xbddbee4d), - TOBN(0xcc352bb2, 0x0caf8b05), TOBN(0xf74d505a, 0x72d63df2), - TOBN(0xb9876d4b, 0x91c4f408), TOBN(0x1ce18473, 0x9e229b2d), - TOBN(0x49507597, 0x83abdb4a), TOBN(0x850fbcb6, 0xdee84b18), - TOBN(0x6325236e, 0x609e67dc), TOBN(0x04d831d9, 0x9336c6d8), - TOBN(0x8deaae3b, 0xfa12d45d), TOBN(0xe425f8ce, 0x4746e246), - TOBN(0x8004c175, 0x24f5f31e), TOBN(0xaca16d8f, 0xad62c3b7), - TOBN(0x0dc15a6a, 0x9152f934), TOBN(0xf1235e5d, 0xed0e12c1), - TOBN(0xc33c06ec, 0xda477dac), TOBN(0x76be8732, 0xb2ea0006), - TOBN(0xcf3f7831, 0x0c0cd313), TOBN(0x3c524553, 0xa614260d), - TOBN(0x31a756f8, 0xcab22d15), TOBN(0x03ee10d1, 0x77827a20), - TOBN(0xd1e059b2, 0x1994ef20), TOBN(0x2a653b69, 0x638ae318), - TOBN(0x70d5eb58, 0x2f699010), TOBN(0x279739f7, 0x09f5f84a), - TOBN(0x5da4663c, 0x8b799336), TOBN(0xfdfdf14d, 0x203c37eb), - TOBN(0x32d8a9dc, 0xa1dbfb2d), TOBN(0xab40cff0, 0x77d48f9b), - TOBN(0xc018b383, 0xd20b42d5), TOBN(0xf9a810ef, 0x9f78845f), - TOBN(0x40af3753, 0xbdba9df0), TOBN(0xb90bdcfc, 0x131dfdf9), - TOBN(0x18720591, 0xf01ab782), TOBN(0xc823f211, 0x6af12a88), - TOBN(0xa51b80f3, 0x0dc14401), TOBN(0xde248f77, 0xfb2dfbe3), - TOBN(0xef5a44e5, 0x0cafe751), TOBN(0x73997c9c, 0xd4dcd221), - TOBN(0x32fd86d1, 0xde854024), TOBN(0xd5b53adc, 0xa09b84bb), - TOBN(0x008d7a11, 0xdcedd8d1), TOBN(0x406bd1c8, 0x74b32c84), - TOBN(0x5d4472ff, 0x05dde8b1), TOBN(0x2e25f2cd, 0xfce2b32f), - TOBN(0xbec0dd5e, 0x29dfc254), TOBN(0x4455fcf6, 0x2b98b267), - TOBN(0x0b4d43a5, 0xc72df2ad), TOBN(0xea70e6be, 0x48a75397), - TOBN(0x2aad6169, 0x5820f3bf), TOBN(0xf410d2dd, 0x9e37f68f), - TOBN(0x70fb7dba, 0x7be5ac83), TOBN(0x636bb645, 0x36ec3eec), - TOBN(0x27104ea3, 0x9754e21c), TOBN(0xbc87a3e6, 0x8d63c373), - TOBN(0x483351d7, 0x4109db9a), TOBN(0x0fa724e3, 0x60134da7), - TOBN(0x9ff44c29, 0xb0720b16), TOBN(0x2dd0cf13, 0x06aceead), - TOBN(0x5942758c, 0xe26929a6), TOBN(0x96c5db92, 0xb766a92b), - TOBN(0xcec7d4c0, 0x5f18395e), TOBN(0xd3f22744, 0x1f80d032), - TOBN(0x7a68b37a, 0xcb86075b), TOBN(0x074764dd, 0xafef92db), - TOBN(0xded1e950, 0x7bc7f389), TOBN(0xc580c850, 0xb9756460), - TOBN(0xaeeec2a4, 0x7da48157), TOBN(0x3f0b4e7f, 0x82c587b3), - TOBN(0x231c6de8, 0xa9f19c53), TOBN(0x5717bd73, 0x6974e34e), - TOBN(0xd9e1d216, 0xf1508fa9), TOBN(0x9f112361, 0xdadaa124), - TOBN(0x80145e31, 0x823b7348), TOBN(0x4dd8f0d5, 0xac634069), - TOBN(0xe3d82fc7, 0x2297c258), TOBN(0x276fcfee, 0x9cee7431), - TOBN(0x8eb61b5e, 0x2bc0aea9), TOBN(0x4f668fd5, 0xde329431), - TOBN(0x03a32ab1, 0x38e4b87e), TOBN(0xe1374517, 0x73d0ef0b), - TOBN(0x1a46f7e6, 0x853ac983), TOBN(0xc3bdf42e, 0x68e78a57), - TOBN(0xacf20785, 0x2ea96dd1), TOBN(0xa10649b9, 0xf1638460), - TOBN(0xf2369f0b, 0x879fbbed), TOBN(0x0ff0ae86, 0xda9d1869), - TOBN(0x5251d759, 0x56766f45), TOBN(0x4984d8c0, 0x2be8d0fc), - TOBN(0x7ecc95a6, 0xd21008f0), TOBN(0x29bd54a0, 0x3a1a1c49), - TOBN(0xab9828c5, 0xd26c50f3), TOBN(0x32c0087c, 0x51d0d251), - TOBN(0x9bac3ce6, 0x0c1cdb26), TOBN(0xcd94d947, 0x557ca205), - TOBN(0x1b1bd598, 0x9db1fdcd), TOBN(0x0eda0108, 0xa3d8b149), - TOBN(0x95066610, 0x56152fcc), TOBN(0xc2f037e6, 0xe7192b33), - TOBN(0xdeffb41a, 0xc92e05a4), TOBN(0x1105f6c2, 0xc2f6c62e), - TOBN(0x68e73500, 0x8733913c), TOBN(0xcce86163, 0x3f3adc40), - TOBN(0xf407a942, 0x38a278e9), TOBN(0xd13c1b9d, 0x2ab21292), - TOBN(0x93ed7ec7, 0x1c74cf5c), TOBN(0x8887dc48, 0xf1a4c1b4), - TOBN(0x3830ff30, 0x4b3a11f1), TOBN(0x358c5a3c, 0x58937cb6), - TOBN(0x027dc404, 0x89022829), TOBN(0x40e93977, 0x3b798f79), - TOBN(0x90ad3337, 0x38be6ead), TOBN(0x9c23f6bc, 0xf34c0a5d), - TOBN(0xd1711a35, 0xfbffd8bb), TOBN(0x60fcfb49, 0x1949d3dd), - TOBN(0x09c8ef4b, 0x7825d93a), TOBN(0x24233cff, 0xa0a8c968), - TOBN(0x67ade46c, 0xe6d982af), TOBN(0xebb6bf3e, 0xe7544d7c), - TOBN(0xd6b9ba76, 0x3d8bd087), TOBN(0x46fe382d, 0x4dc61280), - TOBN(0xbd39a7e8, 0xb5bdbd75), TOBN(0xab381331, 0xb8f228fe), - TOBN(0x0709a77c, 0xce1c4300), TOBN(0x6a247e56, 0xf337ceac), - TOBN(0x8f34f21b, 0x636288be), TOBN(0x9dfdca74, 0xc8a7c305), - TOBN(0x6decfd1b, 0xea919e04), TOBN(0xcdf2688d, 0x8e1991f8), - TOBN(0xe607df44, 0xd0f8a67e), TOBN(0xd985df4b, 0x0b58d010), - TOBN(0x57f834c5, 0x0c24f8f4), TOBN(0xe976ef56, 0xa0bf01ae), - TOBN(0x536395ac, 0xa1c32373), TOBN(0x351027aa, 0x734c0a13), - TOBN(0xd2f1b5d6, 0x5e6bd5bc), TOBN(0x2b539e24, 0x223debed), - TOBN(0xd4994cec, 0x0eaa1d71), TOBN(0x2a83381d, 0x661dcf65), - TOBN(0x5f1aed2f, 0x7b54c740), TOBN(0x0bea3fa5, 0xd6dda5ee), - TOBN(0x9d4fb684, 0x36cc6134), TOBN(0x8eb9bbf3, 0xc0a443dd), - TOBN(0xfc500e2e, 0x383b7d2a), TOBN(0x7aad621c, 0x5b775257), - TOBN(0x69284d74, 0x0a8f7cc0), TOBN(0xe820c2ce, 0x07562d65), - TOBN(0xbf9531b9, 0x499758ee), TOBN(0x73e95ca5, 0x6ee0cc2d), - TOBN(0xf61790ab, 0xfbaf50a5), TOBN(0xdf55e76b, 0x684e0750), - TOBN(0xec516da7, 0xf176b005), TOBN(0x575553bb, 0x7a2dddc7), - TOBN(0x37c87ca3, 0x553afa73), TOBN(0x315f3ffc, 0x4d55c251), - TOBN(0xe846442a, 0xaf3e5d35), TOBN(0x61b91149, 0x6495ff28), - TOBN(0x23cc95d3, 0xfa326dc3), TOBN(0x1df4da1f, 0x18fc2cea), - TOBN(0x24bf9adc, 0xd0a37d59), TOBN(0xb6710053, 0x320d6e1e), - TOBN(0x96f9667e, 0x618344d1), TOBN(0xcc7ce042, 0xa06445af), - TOBN(0xa02d8514, 0xd68dbc3a), TOBN(0x4ea109e4, 0x280b5a5b), - TOBN(0x5741a7ac, 0xb40961bf), TOBN(0x4ada5937, 0x6aa56bfa), - TOBN(0x7feb9145, 0x02b765d1), TOBN(0x561e97be, 0xe6ad1582), - TOBN(0xbbc4a5b6, 0xda3982f5), TOBN(0x0c2659ed, 0xb546f468), - TOBN(0xb8e7e6aa, 0x59612d20), TOBN(0xd83dfe20, 0xac19e8e0), - TOBN(0x8530c45f, 0xb835398c), TOBN(0x6106a8bf, 0xb38a41c2), - TOBN(0x21e8f9a6, 0x35f5dcdb), TOBN(0x39707137, 0xcae498ed), - TOBN(0x70c23834, 0xd8249f00), TOBN(0x9f14b58f, 0xab2537a0), - TOBN(0xd043c365, 0x5f61c0c2), TOBN(0xdc5926d6, 0x09a194a7), - TOBN(0xddec0339, 0x8e77738a), TOBN(0xd07a63ef, 0xfba46426), - TOBN(0x2e58e79c, 0xee7f6e86), TOBN(0xe59b0459, 0xff32d241), - TOBN(0xc5ec84e5, 0x20fa0338), TOBN(0x97939ac8, 0xeaff5ace), - TOBN(0x0310a4e3, 0xb4a38313), TOBN(0x9115fba2, 0x8f9d9885), - TOBN(0x8dd710c2, 0x5fadf8c3), TOBN(0x66be38a2, 0xce19c0e2), - TOBN(0xd42a279c, 0x4cfe5022), TOBN(0x597bb530, 0x0e24e1b8), - TOBN(0x3cde86b7, 0xc153ca7f), TOBN(0xa8d30fb3, 0x707d63bd), - TOBN(0xac905f92, 0xbd60d21e), TOBN(0x98e7ffb6, 0x7b9a54ab), - TOBN(0xd7147df8, 0xe9726a30), TOBN(0xb5e216ff, 0xafce3533), - TOBN(0xb550b799, 0x2ff1ec40), TOBN(0x6b613b87, 0xa1e953fd), - TOBN(0x87b88dba, 0x792d5610), TOBN(0x2ee1270a, 0xa190fbe1), - TOBN(0x02f4e2dc, 0x2ef581da), TOBN(0x016530e4, 0xeff82a95), - TOBN(0xcbb93dfd, 0x8fd6ee89), TOBN(0x16d3d986, 0x46848fff), - TOBN(0x600eff24, 0x1da47adf), TOBN(0x1b9754a0, 0x0ad47a71), - TOBN(0x8f9266df, 0x70c33b98), TOBN(0xaadc87ae, 0xdf34186e), - TOBN(0x0d2ce8e1, 0x4ad24132), TOBN(0x8a47cbfc, 0x19946eba), - TOBN(0x47feeb66, 0x62b5f3af), TOBN(0xcefab561, 0x0abb3734), - TOBN(0x449de60e, 0x19f35cb1), TOBN(0x39f8db14, 0x157f0eb9), - TOBN(0xffaecc5b, 0x3c61bfd6), TOBN(0xa5a4d41d, 0x41216703), - TOBN(0x7f8fabed, 0x224e1cc2), TOBN(0x0d5a8186, 0x871ad953), - TOBN(0xf10774f7, 0xd22da9a9), TOBN(0x45b8a678, 0xcc8a9b0d), - TOBN(0xd9c2e722, 0xbdc32cff), TOBN(0xbf71b5f5, 0x337202a5), - TOBN(0x95c57f2f, 0x69fc4db9), TOBN(0xb6dad34c, 0x765d01e1), - TOBN(0x7e0bd13f, 0xcb904635), TOBN(0x61751253, 0x763a588c), - TOBN(0xd85c2997, 0x81af2c2d), TOBN(0xc0f7d9c4, 0x81b9d7da), - TOBN(0x838a34ae, 0x08533e8d), TOBN(0x15c4cb08, 0x311d8311), - TOBN(0x97f83285, 0x8e121e14), TOBN(0xeea7dc1e, 0x85000a5f), - TOBN(0x0c6059b6, 0x5d256274), TOBN(0xec9beace, 0xb95075c0), - TOBN(0x173daad7, 0x1df97828), TOBN(0xbf851cb5, 0xa8937877), - TOBN(0xb083c594, 0x01646f3c), TOBN(0x3bad30cf, 0x50c6d352), - TOBN(0xfeb2b202, 0x496bbcea), TOBN(0x3cf9fd4f, 0x18a1e8ba), - TOBN(0xd26de7ff, 0x1c066029), TOBN(0x39c81e9e, 0x4e9ed4f8), - TOBN(0xd8be0cb9, 0x7b390d35), TOBN(0x01df2bbd, 0x964aab27), - TOBN(0x3e8c1a65, 0xc3ef64f8), TOBN(0x567291d1, 0x716ed1dd), - TOBN(0x95499c6c, 0x5f5406d3), TOBN(0x71fdda39, 0x5ba8e23f), - TOBN(0xcfeb320e, 0xd5096ece), TOBN(0xbe7ba92b, 0xca66dd16), - TOBN(0x4608d36b, 0xc6fb5a7d), TOBN(0xe3eea15a, 0x6d2dd0e0), - TOBN(0x75b0a3eb, 0x8f97a36a), TOBN(0xf59814cc, 0x1c83de1e), - TOBN(0x56c9c5b0, 0x1c33c23f), TOBN(0xa96c1da4, 0x6faa4136), - TOBN(0x46bf2074, 0xde316551), TOBN(0x3b866e7b, 0x1f756c8f), - TOBN(0x727727d8, 0x1495ed6b), TOBN(0xb2394243, 0xb682dce7), - TOBN(0x8ab8454e, 0x758610f3), TOBN(0xc243ce84, 0x857d72a4), - TOBN(0x7b320d71, 0xdbbf370f), TOBN(0xff9afa37, 0x78e0f7ca), - TOBN(0x0119d1e0, 0xea7b523f), TOBN(0xb997f8cb, 0x058c7d42), - TOBN(0x285bcd2a, 0x37bbb184), TOBN(0x51dcec49, 0xa45d1fa6), - TOBN(0x6ade3b64, 0xe29634cb), TOBN(0x080c94a7, 0x26b86ef1), - TOBN(0xba583db1, 0x2283fbe3), TOBN(0x902bddc8, 0x5a9315ed), - TOBN(0x07c1ccb3, 0x86964bec), TOBN(0x78f4eacf, 0xb6258301), - TOBN(0x4bdf3a49, 0x56f90823), TOBN(0xba0f5080, 0x741d777b), - TOBN(0x091d71c3, 0xf38bf760), TOBN(0x9633d50f, 0x9b625b02), - TOBN(0x03ecb743, 0xb8c9de61), TOBN(0xb4751254, 0x5de74720), - TOBN(0x9f9defc9, 0x74ce1cb2), TOBN(0x774a4f6a, 0x00bd32ef), - TOBN(0xaca385f7, 0x73848f22), TOBN(0x53dad716, 0xf3f8558e), - TOBN(0xab7b34b0, 0x93c471f9), TOBN(0xf530e069, 0x19644bc7), - TOBN(0x3d9fb1ff, 0xdd59d31a), TOBN(0x4382e0df, 0x08daa795), - TOBN(0x165c6f4b, 0xd5cc88d7), TOBN(0xeaa392d5, 0x4a18c900), - TOBN(0x94203c67, 0x648024ee), TOBN(0x188763f2, 0x8c2fabcd), - TOBN(0xa80f87ac, 0xbbaec835), TOBN(0x632c96e0, 0xf29d8d54), - TOBN(0x29b0a60e, 0x4c00a95e), TOBN(0x2ef17f40, 0xe011e9fa), - TOBN(0xf6c0e1d1, 0x15b77223), TOBN(0xaaec2c62, 0x14b04e32), - TOBN(0xd35688d8, 0x3d84e58c), TOBN(0x2af5094c, 0x958571db), - TOBN(0x4fff7e19, 0x760682a6), TOBN(0x4cb27077, 0xe39a407c), - TOBN(0x0f59c547, 0x4ff0e321), TOBN(0x169f34a6, 0x1b34c8ff), - TOBN(0x2bff1096, 0x52bc1ba7), TOBN(0xa25423b7, 0x83583544), - TOBN(0x5d55d5d5, 0x0ac8b782), TOBN(0xff6622ec, 0x2db3c892), - TOBN(0x48fce741, 0x6b8bb642), TOBN(0x31d6998c, 0x69d7e3dc), - TOBN(0xdbaf8004, 0xcadcaed0), TOBN(0x801b0142, 0xd81d053c), - TOBN(0x94b189fc, 0x59630ec6), TOBN(0x120e9934, 0xaf762c8e), - TOBN(0x53a29aa4, 0xfdc6a404), TOBN(0x19d8e01e, 0xa1909948), - TOBN(0x3cfcabf1, 0xd7e89681), TOBN(0x3321a50d, 0x4e132d37), - TOBN(0xd0496863, 0xe9a86111), TOBN(0x8c0cde61, 0x06a3bc65), - TOBN(0xaf866c49, 0xfc9f8eef), TOBN(0x2066350e, 0xff7f5141), - TOBN(0x4f8a4689, 0xe56ddfbd), TOBN(0xea1b0c07, 0xfe32983a), - TOBN(0x2b317462, 0x873cb8cb), TOBN(0x658deddc, 0x2d93229f), - TOBN(0x65efaf4d, 0x0f64ef58), TOBN(0xfe43287d, 0x730cc7a8), - TOBN(0xaebc0c72, 0x3d047d70), TOBN(0x92efa539, 0xd92d26c9), - TOBN(0x06e78457, 0x94b56526), TOBN(0x415cb80f, 0x0961002d), - TOBN(0x89e5c565, 0x76dcb10f), TOBN(0x8bbb6982, 0xff9259fe), - TOBN(0x4fe8795b, 0x9abc2668), TOBN(0xb5d4f534, 0x1e678fb1), - TOBN(0x6601f3be, 0x7b7da2b9), TOBN(0x98da59e2, 0xa13d6805), - TOBN(0x190d8ea6, 0x01799a52), TOBN(0xa20cec41, 0xb86d2952), - TOBN(0x3062ffb2, 0x7fff2a7c), TOBN(0x741b32e5, 0x79f19d37), - TOBN(0xf80d8181, 0x4eb57d47), TOBN(0x7a2d0ed4, 0x16aef06b), - TOBN(0x09735fb0, 0x1cecb588), TOBN(0x1641caaa, 0xc6061f5b)}, - {TOBN(0x7f99824f, 0x20151427), TOBN(0x206828b6, 0x92430206), - TOBN(0xaa9097d7, 0xe1112357), TOBN(0xacf9a2f2, 0x09e414ec), - TOBN(0xdbdac9da, 0x27915356), TOBN(0x7e0734b7, 0x001efee3), - TOBN(0x54fab5bb, 0xd2b288e2), TOBN(0x4c630fc4, 0xf62dd09c), - TOBN(0x8537107a, 0x1ac2703b), TOBN(0xb49258d8, 0x6bc857b5), - TOBN(0x57df14de, 0xbcdaccd1), TOBN(0x24ab68d7, 0xc4ae8529), - TOBN(0x7ed8b5d4, 0x734e59d0), TOBN(0x5f8740c8, 0xc495cc80), - TOBN(0x84aedd5a, 0x291db9b3), TOBN(0x80b360f8, 0x4fb995be), - TOBN(0xae915f5d, 0x5fa067d1), TOBN(0x4134b57f, 0x9668960c), - TOBN(0xbd3656d6, 0xa48edaac), TOBN(0xdac1e3e4, 0xfc1d7436), - TOBN(0x674ff869, 0xd81fbb26), TOBN(0x449ed3ec, 0xb26c33d4), - TOBN(0x85138705, 0xd94203e8), TOBN(0xccde538b, 0xbeeb6f4a), - TOBN(0x55d5c68d, 0xa61a76fa), TOBN(0x598b441d, 0xca1554dc), - TOBN(0xd39923b9, 0x773b279c), TOBN(0x33331d3c, 0x36bf9efc), - TOBN(0x2d4c848e, 0x298de399), TOBN(0xcfdb8e77, 0xa1a27f56), - TOBN(0x94c855ea, 0x57b8ab70), TOBN(0xdcdb9dae, 0x6f7879ba), - TOBN(0x7bdff8c2, 0x019f2a59), TOBN(0xb3ce5bb3, 0xcb4fbc74), - TOBN(0xea907f68, 0x8a9173dd), TOBN(0x6cd3d0d3, 0x95a75439), - TOBN(0x92ecc4d6, 0xefed021c), TOBN(0x09a9f9b0, 0x6a77339a), - TOBN(0x87ca6b15, 0x7188c64a), TOBN(0x10c29968, 0x44899158), - TOBN(0x5859a229, 0xed6e82ef), TOBN(0x16f338e3, 0x65ebaf4e), - TOBN(0x0cd31387, 0x5ead67ae), TOBN(0x1c73d228, 0x54ef0bb4), - TOBN(0x4cb55131, 0x74a5c8c7), TOBN(0x01cd2970, 0x7f69ad6a), - TOBN(0xa04d00dd, 0xe966f87e), TOBN(0xd96fe447, 0x0b7b0321), - TOBN(0x342ac06e, 0x88fbd381), TOBN(0x02cd4a84, 0x5c35a493), - TOBN(0xe8fa89de, 0x54f1bbcd), TOBN(0x341d6367, 0x2575ed4c), - TOBN(0xebe357fb, 0xd238202b), TOBN(0x600b4d1a, 0xa984ead9), - TOBN(0xc35c9f44, 0x52436ea0), TOBN(0x96fe0a39, 0xa370751b), - TOBN(0x4c4f0736, 0x7f636a38), TOBN(0x9f943fb7, 0x0e76d5cb), - TOBN(0xb03510ba, 0xa8b68b8b), TOBN(0xc246780a, 0x9ed07a1f), - TOBN(0x3c051415, 0x6d549fc2), TOBN(0xc2953f31, 0x607781ca), - TOBN(0x955e2c69, 0xd8d95413), TOBN(0xb300fadc, 0x7bd282e3), - TOBN(0x81fe7b50, 0x87e9189f), TOBN(0xdb17375c, 0xf42dda27), - TOBN(0x22f7d896, 0xcf0a5904), TOBN(0xa0e57c5a, 0xebe348e6), - TOBN(0xa61011d3, 0xf40e3c80), TOBN(0xb1189321, 0x8db705c5), - TOBN(0x4ed9309e, 0x50fedec3), TOBN(0xdcf14a10, 0x4d6d5c1d), - TOBN(0x056c265b, 0x55691342), TOBN(0xe8e08504, 0x91049dc7), - TOBN(0x131329f5, 0xc9bae20a), TOBN(0x96c8b3e8, 0xd9dccdb4), - TOBN(0x8c5ff838, 0xfb4ee6b4), TOBN(0xfc5a9aeb, 0x41e8ccf0), - TOBN(0x7417b764, 0xfae050c6), TOBN(0x0953c3d7, 0x00452080), - TOBN(0x21372682, 0x38dfe7e8), TOBN(0xea417e15, 0x2bb79d4b), - TOBN(0x59641f1c, 0x76e7cf2d), TOBN(0x271e3059, 0xea0bcfcc), - TOBN(0x624c7dfd, 0x7253ecbd), TOBN(0x2f552e25, 0x4fca6186), - TOBN(0xcbf84ecd, 0x4d866e9c), TOBN(0x73967709, 0xf68d4610), - TOBN(0xa14b1163, 0xc27901b4), TOBN(0xfd9236e0, 0x899b8bf3), - TOBN(0x42b091ec, 0xcbc6da0a), TOBN(0xbb1dac6f, 0x5ad1d297), - TOBN(0x80e61d53, 0xa91cf76e), TOBN(0x4110a412, 0xd31f1ee7), - TOBN(0x2d87c3ba, 0x13efcf77), TOBN(0x1f374bb4, 0xdf450d76), - TOBN(0x5e78e2f2, 0x0d188dab), TOBN(0xe3968ed0, 0xf4b885ef), - TOBN(0x46c0568e, 0x7314570f), TOBN(0x31616338, 0x01170521), - TOBN(0x18e1e7e2, 0x4f0c8afe), TOBN(0x4caa75ff, 0xdeea78da), - TOBN(0x82db67f2, 0x7c5d8a51), TOBN(0x36a44d86, 0x6f505370), - TOBN(0xd72c5bda, 0x0333974f), TOBN(0x5db516ae, 0x27a70146), - TOBN(0x34705281, 0x210ef921), TOBN(0xbff17a8f, 0x0c9c38e5), - TOBN(0x78f4814e, 0x12476da1), TOBN(0xc1e16613, 0x33c16980), - TOBN(0x9e5b386f, 0x424d4bca), TOBN(0x4c274e87, 0xc85740de), - TOBN(0xb6a9b88d, 0x6c2f5226), TOBN(0x14d1b944, 0x550d7ca8), - TOBN(0x580c85fc, 0x1fc41709), TOBN(0xc1da368b, 0x54c6d519), - TOBN(0x2b0785ce, 0xd5113cf7), TOBN(0x0670f633, 0x5a34708f), - TOBN(0x46e23767, 0x15cc3f88), TOBN(0x1b480cfa, 0x50c72c8f), - TOBN(0x20288602, 0x4147519a), TOBN(0xd0981eac, 0x26b372f0), - TOBN(0xa9d4a7ca, 0xa785ebc8), TOBN(0xd953c50d, 0xdbdf58e9), - TOBN(0x9d6361cc, 0xfd590f8f), TOBN(0x72e9626b, 0x44e6c917), - TOBN(0x7fd96110, 0x22eb64cf), TOBN(0x863ebb7e, 0x9eb288f3), - TOBN(0x6e6ab761, 0x6aca8ee7), TOBN(0x97d10b39, 0xd7b40358), - TOBN(0x1687d377, 0x1e5feb0d), TOBN(0xc83e50e4, 0x8265a27a), - TOBN(0x8f75a9fe, 0xc954b313), TOBN(0xcc2e8f47, 0x310d1f61), - TOBN(0xf5ba81c5, 0x6557d0e0), TOBN(0x25f9680c, 0x3eaf6207), - TOBN(0xf95c6609, 0x4354080b), TOBN(0x5225bfa5, 0x7bf2fe1c), - TOBN(0xc5c004e2, 0x5c7d98fa), TOBN(0x3561bf1c, 0x019aaf60), - TOBN(0x5e6f9f17, 0xba151474), TOBN(0xdec2f934, 0xb04f6eca), - TOBN(0x64e368a1, 0x269acb1e), TOBN(0x1332d9e4, 0x0cdda493), - TOBN(0x60d6cf69, 0xdf23de05), TOBN(0x66d17da2, 0x009339a0), - TOBN(0x9fcac985, 0x0a693923), TOBN(0xbcf057fc, 0xed7c6a6d), - TOBN(0xc3c5c8c5, 0xf0b5662c), TOBN(0x25318dd8, 0xdcba4f24), - TOBN(0x60e8cb75, 0x082b69ff), TOBN(0x7c23b3ee, 0x1e728c01), - TOBN(0x15e10a0a, 0x097e4403), TOBN(0xcb3d0a86, 0x19854665), - TOBN(0x88d8e211, 0xd67d4826), TOBN(0xb39af66e, 0x0b9d2839), - TOBN(0xa5f94588, 0xbd475ca8), TOBN(0xe06b7966, 0xc077b80b), - TOBN(0xfedb1485, 0xda27c26c), TOBN(0xd290d33a, 0xfe0fd5e0), - TOBN(0xa40bcc47, 0xf34fb0fa), TOBN(0xb4760cc8, 0x1fb1ab09), - TOBN(0x8fca0993, 0xa273bfe3), TOBN(0x13e4fe07, 0xf70b213c), - TOBN(0x3bcdb992, 0xfdb05163), TOBN(0x8c484b11, 0x0c2b19b6), - TOBN(0x1acb815f, 0xaaf2e3e2), TOBN(0xc6905935, 0xb89ff1b4), - TOBN(0xb2ad6f9d, 0x586e74e1), TOBN(0x488883ad, 0x67b80484), - TOBN(0x758aa2c7, 0x369c3ddb), TOBN(0x8ab74e69, 0x9f9afd31), - TOBN(0x10fc2d28, 0x5e21beb1), TOBN(0x3484518a, 0x318c42f9), - TOBN(0x377427dc, 0x53cf40c3), TOBN(0x9de0781a, 0x391bc1d9), - TOBN(0x8faee858, 0x693807e1), TOBN(0xa3865327, 0x4e81ccc7), - TOBN(0x02c30ff2, 0x6f835b84), TOBN(0xb604437b, 0x0d3d38d4), - TOBN(0xb3fc8a98, 0x5ca1823d), TOBN(0xb82f7ec9, 0x03be0324), - TOBN(0xee36d761, 0xcf684a33), TOBN(0x5a01df0e, 0x9f29bf7d), - TOBN(0x686202f3, 0x1306583d), TOBN(0x05b10da0, 0x437c622e), - TOBN(0xbf9aaa0f, 0x076a7bc8), TOBN(0x25e94efb, 0x8f8f4e43), - TOBN(0x8a35c9b7, 0xfa3dc26d), TOBN(0xe0e5fb93, 0x96ff03c5), - TOBN(0xa77e3843, 0xebc394ce), TOBN(0xcede6595, 0x8361de60), - TOBN(0xd27c22f6, 0xa1993545), TOBN(0xab01cc36, 0x24d671ba), - TOBN(0x63fa2877, 0xa169c28e), TOBN(0x925ef904, 0x2eb08376), - TOBN(0x3b2fa3cf, 0x53aa0b32), TOBN(0xb27beb5b, 0x71c49d7a), - TOBN(0xb60e1834, 0xd105e27f), TOBN(0xd6089788, 0x4f68570d), - TOBN(0x23094ce0, 0xd6fbc2ac), TOBN(0x738037a1, 0x815ff551), - TOBN(0xda73b1bb, 0x6bef119c), TOBN(0xdcf6c430, 0xeef506ba), - TOBN(0x00e4fe7b, 0xe3ef104a), TOBN(0xebdd9a2c, 0x0a065628), - TOBN(0x853a81c3, 0x8792043e), TOBN(0x22ad6ece, 0xb3b59108), - TOBN(0x9fb813c0, 0x39cd297d), TOBN(0x8ec7e16e, 0x05bda5d9), - TOBN(0x2834797c, 0x0d104b96), TOBN(0xcc11a2e7, 0x7c511510), - TOBN(0x96ca5a53, 0x96ee6380), TOBN(0x054c8655, 0xcea38742), - TOBN(0xb5946852, 0xd54dfa7d), TOBN(0x97c422e7, 0x1f4ab207), - TOBN(0xbf907509, 0x0c22b540), TOBN(0x2cde42aa, 0xb7c267d4), - TOBN(0xba18f9ed, 0x5ab0d693), TOBN(0x3ba62aa6, 0x6e4660d9), - TOBN(0xb24bf97b, 0xab9ea96a), TOBN(0x5d039642, 0xe3b60e32), - TOBN(0x4e6a4506, 0x7c4d9bd5), TOBN(0x666c5b9e, 0x7ed4a6a4), - TOBN(0xfa3fdcd9, 0x8edbd7cc), TOBN(0x4660bb87, 0xc6ccd753), - TOBN(0x9ae90820, 0x21e6b64f), TOBN(0x8a56a713, 0xb36bfb3f), - TOBN(0xabfce096, 0x5726d47f), TOBN(0x9eed01b2, 0x0b1a9a7f), - TOBN(0x30e9cad4, 0x4eb74a37), TOBN(0x7b2524cc, 0x53e9666d), - TOBN(0x6a29683b, 0x8f4b002f), TOBN(0xc2200d7a, 0x41f4fc20), - TOBN(0xcf3af47a, 0x3a338acc), TOBN(0x6539a4fb, 0xe7128975), - TOBN(0xcec31c14, 0xc33c7fcf), TOBN(0x7eb6799b, 0xc7be322b), - TOBN(0x119ef4e9, 0x6646f623), TOBN(0x7b7a26a5, 0x54d7299b), - TOBN(0xcb37f08d, 0x403f46f2), TOBN(0x94b8fc43, 0x1a0ec0c7), - TOBN(0xbb8514e3, 0xc332142f), TOBN(0xf3ed2c33, 0xe80d2a7a), - TOBN(0x8d2080af, 0xb639126c), TOBN(0xf7b6be60, 0xe3553ade), - TOBN(0x3950aa9f, 0x1c7e2b09), TOBN(0x847ff958, 0x6410f02b), - TOBN(0x877b7cf5, 0x678a31b0), TOBN(0xd50301ae, 0x3998b620), - TOBN(0x734257c5, 0xc00fb396), TOBN(0xf9fb18a0, 0x04e672a6), - TOBN(0xff8bd8eb, 0xe8758851), TOBN(0x1e64e4c6, 0x5d99ba44), - TOBN(0x4b8eaedf, 0x7dfd93b7), TOBN(0xba2f2a98, 0x04e76b8c), - TOBN(0x7d790cba, 0xe8053433), TOBN(0xc8e725a0, 0x3d2c9585), - TOBN(0x58c5c476, 0xcdd8f5ed), TOBN(0xd106b952, 0xefa9fe1d), - TOBN(0x3c5c775b, 0x0eff13a9), TOBN(0x242442ba, 0xe057b930), - TOBN(0xe9f458d4, 0xc9b70cbd), TOBN(0x69b71448, 0xa3cdb89a), - TOBN(0x41ee46f6, 0x0e2ed742), TOBN(0x573f1045, 0x40067493), - TOBN(0xb1e154ff, 0x9d54c304), TOBN(0x2ad0436a, 0x8d3a7502), - TOBN(0xee4aaa2d, 0x431a8121), TOBN(0xcd38b3ab, 0x886f11ed), - TOBN(0x57d49ea6, 0x034a0eb7), TOBN(0xd2b773bd, 0xf7e85e58), - TOBN(0x4a559ac4, 0x9b5c1f14), TOBN(0xc444be1a, 0x3e54df2b), - TOBN(0x13aad704, 0xeda41891), TOBN(0xcd927bec, 0x5eb5c788), - TOBN(0xeb3c8516, 0xe48c8a34), TOBN(0x1b7ac812, 0x4b546669), - TOBN(0x1815f896, 0x594df8ec), TOBN(0x87c6a79c, 0x79227865), - TOBN(0xae02a2f0, 0x9b56ddbd), TOBN(0x1339b5ac, 0x8a2f1cf3), - TOBN(0xf2b569c7, 0x839dff0d), TOBN(0xb0b9e864, 0xfee9a43d), - TOBN(0x4ff8ca41, 0x77bb064e), TOBN(0x145a2812, 0xfd249f63), - TOBN(0x3ab7beac, 0xf86f689a), TOBN(0x9bafec27, 0x01d35f5e), - TOBN(0x28054c65, 0x4265aa91), TOBN(0xa4b18304, 0x035efe42), - TOBN(0x6887b0e6, 0x9639dec7), TOBN(0xf4b8f6ad, 0x3d52aea5), - TOBN(0xfb9293cc, 0x971a8a13), TOBN(0x3f159e5d, 0x4c934d07), - TOBN(0x2c50e9b1, 0x09acbc29), TOBN(0x08eb65e6, 0x7154d129), - TOBN(0x4feff589, 0x30b75c3e), TOBN(0x0bb82fe2, 0x94491c93), - TOBN(0xd8ac377a, 0x89af62bb), TOBN(0xd7b51490, 0x9685e49f), - TOBN(0xabca9a7b, 0x04497f19), TOBN(0x1b35ed0a, 0x1a7ad13f), - TOBN(0x6b601e21, 0x3ec86ed6), TOBN(0xda91fcb9, 0xce0c76f1), - TOBN(0x9e28507b, 0xd7ab27e1), TOBN(0x7c19a555, 0x63945b7b), - TOBN(0x6b43f0a1, 0xaafc9827), TOBN(0x443b4fbd, 0x3aa55b91), - TOBN(0x962b2e65, 0x6962c88f), TOBN(0x139da8d4, 0xce0db0ca), - TOBN(0xb93f05dd, 0x1b8d6c4f), TOBN(0x779cdff7, 0x180b9824), - TOBN(0xbba23fdd, 0xae57c7b7), TOBN(0x345342f2, 0x1b932522), - TOBN(0xfd9c80fe, 0x556d4aa3), TOBN(0xa03907ba, 0x6525bb61), - TOBN(0x38b010e1, 0xff218933), TOBN(0xc066b654, 0xaa52117b), - TOBN(0x8e141920, 0x94f2e6ea), TOBN(0x66a27dca, 0x0d32f2b2), - TOBN(0x69c7f993, 0x048b3717), TOBN(0xbf5a989a, 0xb178ae1c), - TOBN(0x49fa9058, 0x564f1d6b), TOBN(0x27ec6e15, 0xd31fde4e), - TOBN(0x4cce0373, 0x7276e7fc), TOBN(0x64086d79, 0x89d6bf02), - TOBN(0x5a72f046, 0x4ccdd979), TOBN(0x909c3566, 0x47775631), - TOBN(0x1c07bc6b, 0x75dd7125), TOBN(0xb4c6bc97, 0x87a0428d), - TOBN(0x507ece52, 0xfdeb6b9d), TOBN(0xfca56512, 0xb2c95432), - TOBN(0x15d97181, 0xd0e8bd06), TOBN(0x384dd317, 0xc6bb46ea), - TOBN(0x5441ea20, 0x3952b624), TOBN(0xbcf70dee, 0x4e7dc2fb), - TOBN(0x372b016e, 0x6628e8c3), TOBN(0x07a0d667, 0xb60a7522), - TOBN(0xcf05751b, 0x0a344ee2), TOBN(0x0ec09a48, 0x118bdeec), - TOBN(0x6e4b3d4e, 0xd83dce46), TOBN(0x43a6316d, 0x99d2fc6e), - TOBN(0xa99d8989, 0x56cf044c), TOBN(0x7c7f4454, 0xae3e5fb7), - TOBN(0xb2e6b121, 0xfbabbe92), TOBN(0x281850fb, 0xe1330076), - TOBN(0x093581ec, 0x97890015), TOBN(0x69b1dded, 0x75ff77f5), - TOBN(0x7cf0b18f, 0xab105105), TOBN(0x953ced31, 0xa89ccfef), - TOBN(0x3151f85f, 0xeb914009), TOBN(0x3c9f1b87, 0x88ed48ad), - TOBN(0xc9aba1a1, 0x4a7eadcb), TOBN(0x928e7501, 0x522e71cf), - TOBN(0xeaede727, 0x3a2e4f83), TOBN(0x467e10d1, 0x1ce3bbd3), - TOBN(0xf3442ac3, 0xb955dcf0), TOBN(0xba96307d, 0xd3d5e527), - TOBN(0xf763a10e, 0xfd77f474), TOBN(0x5d744bd0, 0x6a6e1ff0), - TOBN(0xd287282a, 0xa777899e), TOBN(0xe20eda8f, 0xd03f3cde), - TOBN(0x6a7e75bb, 0x50b07d31), TOBN(0x0b7e2a94, 0x6f379de4), - TOBN(0x31cb64ad, 0x19f593cf), TOBN(0x7b1a9e4f, 0x1e76ef1d), - TOBN(0xe18c9c9d, 0xb62d609c), TOBN(0x439bad6d, 0xe779a650), - TOBN(0x219d9066, 0xe032f144), TOBN(0x1db632b8, 0xe8b2ec6a), - TOBN(0xff0d0fd4, 0xfda12f78), TOBN(0x56fb4c2d, 0x2a25d265), - TOBN(0x5f4e2ee1, 0x255a03f1), TOBN(0x61cd6af2, 0xe96af176), - TOBN(0xe0317ba8, 0xd068bc97), TOBN(0x927d6bab, 0x264b988e), - TOBN(0xa18f07e0, 0xe90fb21e), TOBN(0x00fd2b80, 0xbba7fca1), - TOBN(0x20387f27, 0x95cd67b5), TOBN(0x5b89a4e7, 0xd39707f7), - TOBN(0x8f83ad3f, 0x894407ce), TOBN(0xa0025b94, 0x6c226132), - TOBN(0xc79563c7, 0xf906c13b), TOBN(0x5f548f31, 0x4e7bb025), - TOBN(0x2b4c6b8f, 0xeac6d113), TOBN(0xa67e3f9c, 0x0e813c76), - TOBN(0x3982717c, 0x3fe1f4b9), TOBN(0x58865819, 0x26d8050e), - TOBN(0x99f3640c, 0xf7f06f20), TOBN(0xdc610216, 0x2a66ebc2), - TOBN(0x52f2c175, 0x767a1e08), TOBN(0x05660e1a, 0x5999871b), - TOBN(0x6b0f1762, 0x6d3c4693), TOBN(0xf0e7d627, 0x37ed7bea), - TOBN(0xc51758c7, 0xb75b226d), TOBN(0x40a88628, 0x1f91613b), - TOBN(0x889dbaa7, 0xbbb38ce0), TOBN(0xe0404b65, 0xbddcad81), - TOBN(0xfebccd3a, 0x8bc9671f), TOBN(0xfbf9a357, 0xee1f5375), - TOBN(0x5dc169b0, 0x28f33398), TOBN(0xb07ec11d, 0x72e90f65), - TOBN(0xae7f3b4a, 0xfaab1eb1), TOBN(0xd970195e, 0x5f17538a), - TOBN(0x52b05cbe, 0x0181e640), TOBN(0xf5debd62, 0x2643313d), - TOBN(0x76148154, 0x5df31f82), TOBN(0x23e03b33, 0x3a9e13c5), - TOBN(0xff758949, 0x4fde0c1f), TOBN(0xbf8a1abe, 0xe5b6ec20), - TOBN(0x702278fb, 0x87e1db6c), TOBN(0xc447ad7a, 0x35ed658f), - TOBN(0x48d4aa38, 0x03d0ccf2), TOBN(0x80acb338, 0x819a7c03), - TOBN(0x9bc7c89e, 0x6e17cecc), TOBN(0x46736b8b, 0x03be1d82), - TOBN(0xd65d7b60, 0xc0432f96), TOBN(0xddebe7a3, 0xdeb5442f), - TOBN(0x79a25307, 0x7dff69a2), TOBN(0x37a56d94, 0x02cf3122), - TOBN(0x8bab8aed, 0xf2350d0a), TOBN(0x13c3f276, 0x037b0d9a), - TOBN(0xc664957c, 0x44c65cae), TOBN(0x88b44089, 0xc2e71a88), - TOBN(0xdb88e5a3, 0x5cb02664), TOBN(0x5d4c0bf1, 0x8686c72e), - TOBN(0xea3d9b62, 0xa682d53e), TOBN(0x9b605ef4, 0x0b2ad431), - TOBN(0x71bac202, 0xc69645d0), TOBN(0xa115f03a, 0x6a1b66e7), - TOBN(0xfe2c563a, 0x158f4dc4), TOBN(0xf715b3a0, 0x4d12a78c), - TOBN(0x8f7f0a48, 0xd413213a), TOBN(0x2035806d, 0xc04becdb), - TOBN(0xecd34a99, 0x5d8587f5), TOBN(0x4d8c3079, 0x9f6d3a71), - TOBN(0x1b2a2a67, 0x8d95a8f6), TOBN(0xc58c9d7d, 0xf2110d0d), - TOBN(0xdeee81d5, 0xcf8fba3f), TOBN(0xa42be3c0, 0x0c7cdf68), - TOBN(0x2126f742, 0xd43b5eaa), TOBN(0x054a0766, 0xdfa59b85), - TOBN(0x9d0d5e36, 0x126bfd45), TOBN(0xa1f8fbd7, 0x384f8a8f), - TOBN(0x317680f5, 0xd563fccc), TOBN(0x48ca5055, 0xf280a928), - TOBN(0xe00b81b2, 0x27b578cf), TOBN(0x10aad918, 0x2994a514), - TOBN(0xd9e07b62, 0xb7bdc953), TOBN(0x9f0f6ff2, 0x5bc086dd), - TOBN(0x09d1ccff, 0x655eee77), TOBN(0x45475f79, 0x5bef7df1), - TOBN(0x3faa28fa, 0x86f702cc), TOBN(0x92e60905, 0x0f021f07), - TOBN(0xe9e62968, 0x7f8fa8c6), TOBN(0xbd71419a, 0xf036ea2c), - TOBN(0x171ee1cc, 0x6028da9a), TOBN(0x5352fe1a, 0xc251f573), - TOBN(0xf8ff236e, 0x3fa997f4), TOBN(0xd831b6c9, 0xa5749d5f), - TOBN(0x7c872e1d, 0xe350e2c2), TOBN(0xc56240d9, 0x1e0ce403), - TOBN(0xf9deb077, 0x6974f5cb), TOBN(0x7d50ba87, 0x961c3728), - TOBN(0xd6f89426, 0x5a3a2518), TOBN(0xcf817799, 0xc6303d43), - TOBN(0x510a0471, 0x619e5696), TOBN(0xab049ff6, 0x3a5e307b), - TOBN(0xe4cdf9b0, 0xfeb13ec7), TOBN(0xd5e97117, 0x9d8ff90c), - TOBN(0xf6f64d06, 0x9afa96af), TOBN(0x00d0bf5e, 0x9d2012a2), - TOBN(0xe63f301f, 0x358bcdc0), TOBN(0x07689e99, 0x0a9d47f8), - TOBN(0x1f689e2f, 0x4f43d43a), TOBN(0x4d542a16, 0x90920904), - TOBN(0xaea293d5, 0x9ca0a707), TOBN(0xd061fe45, 0x8ac68065), - TOBN(0x1033bf1b, 0x0090008c), TOBN(0x29749558, 0xc08a6db6), - TOBN(0x74b5fc59, 0xc1d5d034), TOBN(0xf712e9f6, 0x67e215e0), - TOBN(0xfd520cbd, 0x860200e6), TOBN(0x0229acb4, 0x3ea22588), - TOBN(0x9cd1e14c, 0xfff0c82e), TOBN(0x87684b62, 0x59c69e73), - TOBN(0xda85e61c, 0x96ccb989), TOBN(0x2d5dbb02, 0xa3d06493), - TOBN(0xf22ad33a, 0xe86b173c), TOBN(0xe8e41ea5, 0xa79ff0e3), - TOBN(0x01d2d725, 0xdd0d0c10), TOBN(0x31f39088, 0x032d28f9), - TOBN(0x7b3f71e1, 0x7829839e), TOBN(0x0cf691b4, 0x4502ae58), - TOBN(0xef658dbd, 0xbefc6115), TOBN(0xa5cd6ee5, 0xb3ab5314), - TOBN(0x206c8d7b, 0x5f1d2347), TOBN(0x794645ba, 0x4cc2253a), - TOBN(0xd517d8ff, 0x58389e08), TOBN(0x4fa20dee, 0x9f847288), - TOBN(0xeba072d8, 0xd797770a), TOBN(0x7360c91d, 0xbf429e26), - TOBN(0x7200a3b3, 0x80af8279), TOBN(0x6a1c9150, 0x82dadce3), - TOBN(0x0ee6d3a7, 0xc35d8794), TOBN(0x042e6558, 0x0356bae5), - TOBN(0x9f59698d, 0x643322fd), TOBN(0x9379ae15, 0x50a61967), - TOBN(0x64b9ae62, 0xfcc9981e), TOBN(0xaed3d631, 0x6d2934c6), - TOBN(0x2454b302, 0x5e4e65eb), TOBN(0xab09f647, 0xf9950428)}, - {TOBN(0xb2083a12, 0x22248acc), TOBN(0x1f6ec0ef, 0x3264e366), - TOBN(0x5659b704, 0x5afdee28), TOBN(0x7a823a40, 0xe6430bb5), - TOBN(0x24592a04, 0xe1900a79), TOBN(0xcde09d4a, 0xc9ee6576), - TOBN(0x52b6463f, 0x4b5ea54a), TOBN(0x1efe9ed3, 0xd3ca65a7), - TOBN(0xe27a6dbe, 0x305406dd), TOBN(0x8eb7dc7f, 0xdd5d1957), - TOBN(0xf54a6876, 0x387d4d8f), TOBN(0x9c479409, 0xc7762de4), - TOBN(0xbe4d5b5d, 0x99b30778), TOBN(0x25380c56, 0x6e793682), - TOBN(0x602d37f3, 0xdac740e3), TOBN(0x140deabe, 0x1566e4ae), - TOBN(0x4481d067, 0xafd32acf), TOBN(0xd8f0fcca, 0xe1f71ccf), - TOBN(0xd208dd0c, 0xb596f2da), TOBN(0xd049d730, 0x9aad93f9), - TOBN(0xc79f263d, 0x42ab580e), TOBN(0x09411bb1, 0x23f707b4), - TOBN(0x8cfde1ff, 0x835e0eda), TOBN(0x72707490, 0x90f03402), - TOBN(0xeaee6126, 0xc49a861e), TOBN(0x024f3b65, 0xe14f0d06), - TOBN(0x51a3f1e8, 0xc69bfc17), TOBN(0xc3c3a8e9, 0xa7686381), - TOBN(0x3400752c, 0xb103d4c8), TOBN(0x02bc4613, 0x9218b36b), - TOBN(0xc67f75eb, 0x7651504a), TOBN(0xd6848b56, 0xd02aebfa), - TOBN(0xbd9802e6, 0xc30fa92b), TOBN(0x5a70d96d, 0x9a552784), - TOBN(0x9085c4ea, 0x3f83169b), TOBN(0xfa9423bb, 0x06908228), - TOBN(0x2ffebe12, 0xfe97a5b9), TOBN(0x85da6049, 0x71b99118), - TOBN(0x9cbc2f7f, 0x63178846), TOBN(0xfd96bc70, 0x9153218e), - TOBN(0x958381db, 0x1782269b), TOBN(0xae34bf79, 0x2597e550), - TOBN(0xbb5c6064, 0x5f385153), TOBN(0x6f0e96af, 0xe3088048), - TOBN(0xbf6a0215, 0x77884456), TOBN(0xb3b5688c, 0x69310ea7), - TOBN(0x17c94295, 0x04fad2de), TOBN(0xe020f0e5, 0x17896d4d), - TOBN(0x730ba0ab, 0x0976505f), TOBN(0x567f6813, 0x095e2ec5), - TOBN(0x47062010, 0x6331ab71), TOBN(0x72cfa977, 0x41d22b9f), - TOBN(0x33e55ead, 0x8a2373da), TOBN(0xa8d0d5f4, 0x7ba45a68), - TOBN(0xba1d8f9c, 0x03029d15), TOBN(0x8f34f1cc, 0xfc55b9f3), - TOBN(0xcca4428d, 0xbbe5a1a9), TOBN(0x8187fd5f, 0x3126bd67), - TOBN(0x0036973a, 0x48105826), TOBN(0xa39b6663, 0xb8bd61a0), - TOBN(0x6d42deef, 0x2d65a808), TOBN(0x4969044f, 0x94636b19), - TOBN(0xf611ee47, 0xdd5d564c), TOBN(0x7b2f3a49, 0xd2873077), - TOBN(0x94157d45, 0x300eb294), TOBN(0x2b2a656e, 0x169c1494), - TOBN(0xc000dd76, 0xd3a47aa9), TOBN(0xa2864e4f, 0xa6243ea4), - TOBN(0x82716c47, 0xdb89842e), TOBN(0x12dfd7d7, 0x61479fb7), - TOBN(0x3b9a2c56, 0xe0b2f6dc), TOBN(0x46be862a, 0xd7f85d67), - TOBN(0x03b0d8dd, 0x0f82b214), TOBN(0x460c34f9, 0xf103cbc6), - TOBN(0xf32e5c03, 0x18d79e19), TOBN(0x8b8888ba, 0xa84117f8), - TOBN(0x8f3c37dc, 0xc0722677), TOBN(0x10d21be9, 0x1c1c0f27), - TOBN(0xd47c8468, 0xe0f7a0c6), TOBN(0x9bf02213, 0xadecc0e0), - TOBN(0x0baa7d12, 0x42b48b99), TOBN(0x1bcb665d, 0x48424096), - TOBN(0x8b847cd6, 0xebfb5cfb), TOBN(0x87c2ae56, 0x9ad4d10d), - TOBN(0xf1cbb122, 0x0de36726), TOBN(0xe7043c68, 0x3fdfbd21), - TOBN(0x4bd0826a, 0x4e79d460), TOBN(0x11f5e598, 0x4bd1a2cb), - TOBN(0x97554160, 0xb7fe7b6e), TOBN(0x7d16189a, 0x400a3fb2), - TOBN(0xd73e9bea, 0xe328ca1e), TOBN(0x0dd04b97, 0xe793d8cc), - TOBN(0xa9c83c9b, 0x506db8cc), TOBN(0x5cd47aae, 0xcf38814c), - TOBN(0x26fc430d, 0xb64b45e6), TOBN(0x079b5499, 0xd818ea84), - TOBN(0xebb01102, 0xc1c24a3b), TOBN(0xca24e568, 0x1c161c1a), - TOBN(0x103eea69, 0x36f00a4a), TOBN(0x9ad76ee8, 0x76176c7b), - TOBN(0x97451fc2, 0x538e0ff7), TOBN(0x94f89809, 0x6604b3b0), - TOBN(0x6311436e, 0x3249cfd7), TOBN(0x27b4a7bd, 0x41224f69), - TOBN(0x03b5d21a, 0xe0ac2941), TOBN(0x279b0254, 0xc2d31937), - TOBN(0x3307c052, 0xcac992d0), TOBN(0x6aa7cb92, 0xefa8b1f3), - TOBN(0x5a182580, 0x0d37c7a5), TOBN(0x13380c37, 0x342d5422), - TOBN(0x92ac2d66, 0xd5d2ef92), TOBN(0x035a70c9, 0x030c63c6), - TOBN(0xc16025dd, 0x4ce4f152), TOBN(0x1f419a71, 0xf9df7c06), - TOBN(0x6d5b2214, 0x91e4bb14), TOBN(0xfc43c6cc, 0x839fb4ce), - TOBN(0x49f06591, 0x925d6b2d), TOBN(0x4b37d9d3, 0x62186598), - TOBN(0x8c54a971, 0xd01b1629), TOBN(0xe1a9c29f, 0x51d50e05), - TOBN(0x5109b785, 0x71ba1861), TOBN(0x48b22d5c, 0xd0c8f93d), - TOBN(0xe8fa84a7, 0x8633bb93), TOBN(0x53fba6ba, 0x5aebbd08), - TOBN(0x7ff27df3, 0xe5eea7d8), TOBN(0x521c8796, 0x68ca7158), - TOBN(0xb9d5133b, 0xce6f1a05), TOBN(0x2d50cd53, 0xfd0ebee4), - TOBN(0xc82115d6, 0xc5a3ef16), TOBN(0x993eff9d, 0xba079221), - TOBN(0xe4da2c5e, 0x4b5da81c), TOBN(0x9a89dbdb, 0x8033fd85), - TOBN(0x60819ebf, 0x2b892891), TOBN(0x53902b21, 0x5d14a4d5), - TOBN(0x6ac35051, 0xd7fda421), TOBN(0xcc6ab885, 0x61c83284), - TOBN(0x14eba133, 0xf74cff17), TOBN(0x240aaa03, 0xecb813f2), - TOBN(0xcfbb6540, 0x6f665bee), TOBN(0x084b1fe4, 0xa425ad73), - TOBN(0x009d5d16, 0xd081f6a6), TOBN(0x35304fe8, 0xeef82c90), - TOBN(0xf20346d5, 0xaa9eaa22), TOBN(0x0ada9f07, 0xac1c91e3), - TOBN(0xa6e21678, 0x968a6144), TOBN(0x54c1f77c, 0x07b31a1e), - TOBN(0xd6bb787e, 0x5781fbe1), TOBN(0x61bd2ee0, 0xe31f1c4a), - TOBN(0xf25aa1e9, 0x781105fc), TOBN(0x9cf2971f, 0x7b2f8e80), - TOBN(0x26d15412, 0xcdff919b), TOBN(0x01db4ebe, 0x34bc896e), - TOBN(0x7d9b3e23, 0xb40df1cf), TOBN(0x59337373, 0x94e971b4), - TOBN(0xbf57bd14, 0x669cf921), TOBN(0x865daedf, 0x0c1a1064), - TOBN(0x3eb70bd3, 0x83279125), TOBN(0xbc3d5b9f, 0x34ecdaab), - TOBN(0x91e3ed7e, 0x5f755caf), TOBN(0x49699f54, 0xd41e6f02), - TOBN(0x185770e1, 0xd4a7a15b), TOBN(0x08f3587a, 0xeaac87e7), - TOBN(0x352018db, 0x473133ea), TOBN(0x674ce719, 0x04fd30fc), - TOBN(0x7b8d9835, 0x088b3e0e), TOBN(0x7a0356a9, 0x5d0d47a1), - TOBN(0x9d9e7659, 0x6474a3c4), TOBN(0x61ea48a7, 0xff66966c), - TOBN(0x30417758, 0x0f3e4834), TOBN(0xfdbb21c2, 0x17a9afcb), - TOBN(0x756fa17f, 0x2f9a67b3), TOBN(0x2a6b2421, 0xa245c1a8), - TOBN(0x64be2794, 0x4af02291), TOBN(0xade465c6, 0x2a5804fe), - TOBN(0x8dffbd39, 0xa6f08fd7), TOBN(0xc4efa84c, 0xaa14403b), - TOBN(0xa1b91b2a, 0x442b0f5c), TOBN(0xb748e317, 0xcf997736), - TOBN(0x8d1b62bf, 0xcee90e16), TOBN(0x907ae271, 0x0b2078c0), - TOBN(0xdf31534b, 0x0c9bcddd), TOBN(0x043fb054, 0x39adce83), - TOBN(0x99031043, 0xd826846a), TOBN(0x61a9c0d6, 0xb144f393), - TOBN(0xdab48046, 0x47718427), TOBN(0xdf17ff9b, 0x6e830f8b), - TOBN(0x408d7ee8, 0xe49a1347), TOBN(0x6ac71e23, 0x91c1d4ae), - TOBN(0xc8cbb9fd, 0x1defd73c), TOBN(0x19840657, 0xbbbbfec5), - TOBN(0x39db1cb5, 0x9e7ef8ea), TOBN(0x78aa8296, 0x64105f30), - TOBN(0xa3d9b7f0, 0xa3738c29), TOBN(0x0a2f235a, 0xbc3250a3), - TOBN(0x55e506f6, 0x445e4caf), TOBN(0x0974f73d, 0x33475f7a), - TOBN(0xd37dbba3, 0x5ba2f5a8), TOBN(0x542c6e63, 0x6af40066), - TOBN(0x26d99b53, 0xc5d73e2c), TOBN(0x06060d7d, 0x6c3ca33e), - TOBN(0xcdbef1c2, 0x065fef4a), TOBN(0x77e60f7d, 0xfd5b92e3), - TOBN(0xd7c549f0, 0x26708350), TOBN(0x201b3ad0, 0x34f121bf), - TOBN(0x5fcac2a1, 0x0334fc14), TOBN(0x8a9a9e09, 0x344552f6), - TOBN(0x7dd8a1d3, 0x97653082), TOBN(0x5fc0738f, 0x79d4f289), - TOBN(0x787d244d, 0x17d2d8c3), TOBN(0xeffc6345, 0x70830684), - TOBN(0x5ddb96dd, 0xe4f73ae5), TOBN(0x8efb14b1, 0x172549a5), - TOBN(0x6eb73eee, 0x2245ae7a), TOBN(0xbca4061e, 0xea11f13e), - TOBN(0xb577421d, 0x30b01f5d), TOBN(0xaa688b24, 0x782e152c), - TOBN(0x67608e71, 0xbd3502ba), TOBN(0x4ef41f24, 0xb4de75a0), - TOBN(0xb08dde5e, 0xfd6125e5), TOBN(0xde484825, 0xa409543f), - TOBN(0x1f198d98, 0x65cc2295), TOBN(0x428a3771, 0x6e0edfa2), - TOBN(0x4f9697a2, 0xadf35fc7), TOBN(0x01a43c79, 0xf7cac3c7), - TOBN(0xb05d7059, 0x0fd3659a), TOBN(0x8927f30c, 0xbb7f2d9a), - TOBN(0x4023d1ac, 0x8cf984d3), TOBN(0x32125ed3, 0x02897a45), - TOBN(0xfb572dad, 0x3d414205), TOBN(0x73000ef2, 0xe3fa82a9), - TOBN(0x4c0868e9, 0xf10a5581), TOBN(0x5b61fc67, 0x6b0b3ca5), - TOBN(0xc1258d5b, 0x7cae440c), TOBN(0x21c08b41, 0x402b7531), - TOBN(0xf61a8955, 0xde932321), TOBN(0x3568faf8, 0x2d1408af), - TOBN(0x71b15e99, 0x9ecf965b), TOBN(0xf14ed248, 0xe917276f), - TOBN(0xc6f4caa1, 0x820cf9e2), TOBN(0x681b20b2, 0x18d83c7e), - TOBN(0x6cde738d, 0xc6c01120), TOBN(0x71db0813, 0xae70e0db), - TOBN(0x95fc0644, 0x74afe18c), TOBN(0x34619053, 0x129e2be7), - TOBN(0x80615cea, 0xdb2a3b15), TOBN(0x0a49a19e, 0xdb4c7073), - TOBN(0x0e1b84c8, 0x8fd2d367), TOBN(0xd74bf462, 0x033fb8aa), - TOBN(0x889f6d65, 0x533ef217), TOBN(0x7158c7e4, 0xc3ca2e87), - TOBN(0xfb670dfb, 0xdc2b4167), TOBN(0x75910a01, 0x844c257f), - TOBN(0xf336bf07, 0xcf88577d), TOBN(0x22245250, 0xe45e2ace), - TOBN(0x2ed92e8d, 0x7ca23d85), TOBN(0x29f8be4c, 0x2b812f58), - TOBN(0xdd9ebaa7, 0x076fe12b), TOBN(0x3f2400cb, 0xae1537f9), - TOBN(0x1aa93528, 0x17bdfb46), TOBN(0xc0f98430, 0x67883b41), - TOBN(0x5590ede1, 0x0170911d), TOBN(0x7562f5bb, 0x34d4b17f), - TOBN(0xe1fa1df2, 0x1826b8d2), TOBN(0xb40b796a, 0x6bd80d59), - TOBN(0xd65bf197, 0x3467ba92), TOBN(0x8c9b46db, 0xf70954b0), - TOBN(0x97c8a0f3, 0x0e78f15d), TOBN(0xa8f3a69a, 0x85a4c961), - TOBN(0x4242660f, 0x61e4ce9b), TOBN(0xbf06aab3, 0x6ea6790c), - TOBN(0xc6706f8e, 0xec986416), TOBN(0x9e56dec1, 0x9a9fc225), - TOBN(0x527c46f4, 0x9a9898d9), TOBN(0xd799e77b, 0x5633cdef), - TOBN(0x24eacc16, 0x7d9e4297), TOBN(0xabb61cea, 0x6b1cb734), - TOBN(0xbee2e8a7, 0xf778443c), TOBN(0x3bb42bf1, 0x29de2fe6), - TOBN(0xcbed86a1, 0x3003bb6f), TOBN(0xd3918e6c, 0xd781cdf6), - TOBN(0x4bee3271, 0x9a5103f1), TOBN(0x5243efc6, 0xf50eac06), - TOBN(0xb8e122cb, 0x6adcc119), TOBN(0x1b7faa84, 0xc0b80a08), - TOBN(0x32c3d1bd, 0x6dfcd08c), TOBN(0x129dec4e, 0x0be427de), - TOBN(0x98ab679c, 0x1d263c83), TOBN(0xafc83cb7, 0xcef64eff), - TOBN(0x85eb6088, 0x2fa6be76), TOBN(0x892585fb, 0x1328cbfe), - TOBN(0xc154d3ed, 0xcf618dda), TOBN(0xc44f601b, 0x3abaf26e), - TOBN(0x7bf57d0b, 0x2be1fdfd), TOBN(0xa833bd2d, 0x21137fee), - TOBN(0x9353af36, 0x2db591a8), TOBN(0xc76f26dc, 0x5562a056), - TOBN(0x1d87e47d, 0x3fdf5a51), TOBN(0x7afb5f93, 0x55c9cab0), - TOBN(0x91bbf58f, 0x89e0586e), TOBN(0x7c72c018, 0x0d843709), - TOBN(0xa9a5aafb, 0x99b5c3dc), TOBN(0xa48a0f1d, 0x3844aeb0), - TOBN(0x7178b7dd, 0xb667e482), TOBN(0x453985e9, 0x6e23a59a), - TOBN(0x4a54c860, 0x01b25dd8), TOBN(0x0dd37f48, 0xfb897c8a), - TOBN(0x5f8aa610, 0x0ea90cd9), TOBN(0xc8892c68, 0x16d5830d), - TOBN(0xeb4befc0, 0xef514ca5), TOBN(0x478eb679, 0xe72c9ee6), - TOBN(0x9bca20da, 0xdbc40d5f), TOBN(0xf015de21, 0xdde4f64a), - TOBN(0xaa6a4de0, 0xeaf4b8a5), TOBN(0x68cfd9ca, 0x4bc60e32), - TOBN(0x668a4b01, 0x7fd15e70), TOBN(0xd9f0694a, 0xf27dc09d), - TOBN(0xf6c3cad5, 0xba708bcd), TOBN(0x5cd2ba69, 0x5bb95c2a), - TOBN(0xaa28c1d3, 0x33c0a58f), TOBN(0x23e274e3, 0xabc77870), - TOBN(0x44c3692d, 0xdfd20a4a), TOBN(0x091c5fd3, 0x81a66653), - TOBN(0x6c0bb691, 0x09a0757d), TOBN(0x9072e8b9, 0x667343ea), - TOBN(0x31d40eb0, 0x80848bec), TOBN(0x95bd480a, 0x79fd36cc), - TOBN(0x01a77c61, 0x65ed43f5), TOBN(0xafccd127, 0x2e0d40bf), - TOBN(0xeccfc82d, 0x1cc1884b), TOBN(0xc85ac201, 0x5d4753b4), - TOBN(0xc7a6caac, 0x658e099f), TOBN(0xcf46369e, 0x04b27390), - TOBN(0xe2e7d049, 0x506467ea), TOBN(0x481b63a2, 0x37cdeccc), - TOBN(0x4029abd8, 0xed80143a), TOBN(0x28bfe3c7, 0xbcb00b88), - TOBN(0x3bec1009, 0x0643d84a), TOBN(0x885f3668, 0xabd11041), - TOBN(0xdb02432c, 0xf83a34d6), TOBN(0x32f7b360, 0x719ceebe), - TOBN(0xf06c7837, 0xdad1fe7a), TOBN(0x60a157a9, 0x5441a0b0), - TOBN(0x704970e9, 0xe2d47550), TOBN(0xcd2bd553, 0x271b9020), - TOBN(0xff57f82f, 0x33e24a0b), TOBN(0x9cbee23f, 0xf2565079), - TOBN(0x16353427, 0xeb5f5825), TOBN(0x276feec4, 0xe948d662), - TOBN(0xd1b62bc6, 0xda10032b), TOBN(0x718351dd, 0xf0e72a53), - TOBN(0x93452076, 0x2420e7ba), TOBN(0x96368fff, 0x3a00118d), - TOBN(0x00ce2d26, 0x150a49e4), TOBN(0x0c28b636, 0x3f04706b), - TOBN(0xbad65a46, 0x58b196d0), TOBN(0x6c8455fc, 0xec9f8b7c), - TOBN(0xe90c895f, 0x2d71867e), TOBN(0x5c0be31b, 0xedf9f38c), - TOBN(0x2a37a15e, 0xd8f6ec04), TOBN(0x239639e7, 0x8cd85251), - TOBN(0xd8975315, 0x9c7c4c6b), TOBN(0x603aa3c0, 0xd7409af7), - TOBN(0xb8d53d0c, 0x007132fb), TOBN(0x68d12af7, 0xa6849238), - TOBN(0xbe0607e7, 0xbf5d9279), TOBN(0x9aa50055, 0xaada74ce), - TOBN(0xe81079cb, 0xba7e8ccb), TOBN(0x610c71d1, 0xa5f4ff5e), - TOBN(0x9e2ee1a7, 0x5aa07093), TOBN(0xca84004b, 0xa75da47c), - TOBN(0x074d3951, 0x3de75401), TOBN(0xf938f756, 0xbb311592), - TOBN(0x96197618, 0x00a43421), TOBN(0x39a25362, 0x07bc78c8), - TOBN(0x278f710a, 0x0a171276), TOBN(0xb28446ea, 0x8d1a8f08), - TOBN(0x184781bf, 0xe3b6a661), TOBN(0x7751cb1d, 0xe6d279f7), - TOBN(0xf8ff95d6, 0xc59eb662), TOBN(0x186d90b7, 0x58d3dea7), - TOBN(0x0e4bb6c1, 0xdfb4f754), TOBN(0x5c5cf56b, 0x2b2801dc), - TOBN(0xc561e452, 0x1f54564d), TOBN(0xb4fb8c60, 0xf0dd7f13), - TOBN(0xf8849630, 0x33ff98c7), TOBN(0x9619fffa, 0xcf17769c), - TOBN(0xf8090bf6, 0x1bfdd80a), TOBN(0x14d9a149, 0x422cfe63), - TOBN(0xb354c360, 0x6f6df9ea), TOBN(0xdbcf770d, 0x218f17ea), - TOBN(0x207db7c8, 0x79eb3480), TOBN(0x213dbda8, 0x559b6a26), - TOBN(0xac4c200b, 0x29fc81b3), TOBN(0xebc3e09f, 0x171d87c1), - TOBN(0x91799530, 0x1481aa9e), TOBN(0x051b92e1, 0x92e114fa), - TOBN(0xdf8f92e9, 0xecb5537f), TOBN(0x44b1b2cc, 0x290c7483), - TOBN(0xa711455a, 0x2adeb016), TOBN(0x964b6856, 0x81a10c2c), - TOBN(0x4f159d99, 0xcec03623), TOBN(0x05532225, 0xef3271ea), - TOBN(0xb231bea3, 0xc5ee4849), TOBN(0x57a54f50, 0x7094f103), - TOBN(0x3e2d421d, 0x9598b352), TOBN(0xe865a49c, 0x67412ab4), - TOBN(0xd2998a25, 0x1cc3a912), TOBN(0x5d092808, 0x0c74d65d), - TOBN(0x73f45908, 0x4088567a), TOBN(0xeb6b280e, 0x1f214a61), - TOBN(0x8c9adc34, 0xcaf0c13d), TOBN(0x39d12938, 0xf561fb80), - TOBN(0xb2dc3a5e, 0xbc6edfb4), TOBN(0x7485b1b1, 0xfe4d210e), - TOBN(0x062e0400, 0xe186ae72), TOBN(0x91e32d5c, 0x6eeb3b88), - TOBN(0x6df574d7, 0x4be59224), TOBN(0xebc88ccc, 0x716d55f3), - TOBN(0x26c2e6d0, 0xcad6ed33), TOBN(0xc6e21e7d, 0x0d3e8b10), - TOBN(0x2cc5840e, 0x5bcc36bb), TOBN(0x9292445e, 0x7da74f69), - TOBN(0x8be8d321, 0x4e5193a8), TOBN(0x3ec23629, 0x8df06413), - TOBN(0xc7e9ae85, 0xb134defa), TOBN(0x6073b1d0, 0x1bb2d475), - TOBN(0xb9ad615e, 0x2863c00d), TOBN(0x9e29493d, 0x525f4ac4), - TOBN(0xc32b1dea, 0x4e9acf4f), TOBN(0x3e1f01c8, 0xa50db88d), - TOBN(0xb05d70ea, 0x04da916c), TOBN(0x714b0d0a, 0xd865803e), - TOBN(0x4bd493fc, 0x9920cb5e), TOBN(0x5b44b1f7, 0x92c7a3ac), - TOBN(0xa2a77293, 0xbcec9235), TOBN(0x5ee06e87, 0xcd378553), - TOBN(0xceff8173, 0xda621607), TOBN(0x2bb03e4c, 0x99f5d290), - TOBN(0x2945106a, 0xa6f734ac), TOBN(0xb5056604, 0xd25c4732), - TOBN(0x5945920c, 0xe079afee), TOBN(0x686e17a0, 0x6789831f), - TOBN(0x5966bee8, 0xb74a5ae5), TOBN(0x38a673a2, 0x1e258d46), - TOBN(0xbd1cc1f2, 0x83141c95), TOBN(0x3b2ecf4f, 0x0e96e486), - TOBN(0xcd3aa896, 0x74e5fc78), TOBN(0x415ec10c, 0x2482fa7a), - TOBN(0x15234419, 0x80503380), TOBN(0x513d917a, 0xd314b392), - TOBN(0xb0b52f4e, 0x63caecae), TOBN(0x07bf22ad, 0x2dc7780b), - TOBN(0xe761e8a1, 0xe4306839), TOBN(0x1b3be962, 0x5dd7feaa), - TOBN(0x4fe728de, 0x74c778f1), TOBN(0xf1fa0bda, 0x5e0070f6), - TOBN(0x85205a31, 0x6ec3f510), TOBN(0x2c7e4a14, 0xd2980475), - TOBN(0xde3c19c0, 0x6f30ebfd), TOBN(0xdb1c1f38, 0xd4b7e644), - TOBN(0xfe291a75, 0x5dce364a), TOBN(0xb7b22a3c, 0x058f5be3), - TOBN(0x2cd2c302, 0x37fea38c), TOBN(0x2930967a, 0x2e17be17), - TOBN(0x87f009de, 0x0c061c65), TOBN(0xcb014aac, 0xedc6ed44), - TOBN(0x49bd1cb4, 0x3bafb1eb), TOBN(0x81bd8b5c, 0x282d3688), - TOBN(0x1cdab87e, 0xf01a17af), TOBN(0x21f37ac4, 0xe710063b), - TOBN(0x5a6c5676, 0x42fc8193), TOBN(0xf4753e70, 0x56a6015c), - TOBN(0x020f795e, 0xa15b0a44), TOBN(0x8f37c8d7, 0x8958a958), - TOBN(0x63b7e89b, 0xa4b675b5), TOBN(0xb4fb0c0c, 0x0fc31aea), - TOBN(0xed95e639, 0xa7ff1f2e), TOBN(0x9880f5a3, 0x619614fb), - TOBN(0xdeb6ff02, 0x947151ab), TOBN(0x5bc5118c, 0xa868dcdb), - TOBN(0xd8da2055, 0x4c20cea5), TOBN(0xcac2776e, 0x14c4d69a), - TOBN(0xcccb22c1, 0x622d599b), TOBN(0xa4ddb653, 0x68a9bb50), - TOBN(0x2c4ff151, 0x1b4941b4), TOBN(0xe1ff19b4, 0x6efba588), - TOBN(0x35034363, 0xc48345e0), TOBN(0x45542e3d, 0x1e29dfc4), - TOBN(0xf197cb91, 0x349f7aed), TOBN(0x3b2b5a00, 0x8fca8420), - TOBN(0x7c175ee8, 0x23aaf6d8), TOBN(0x54dcf421, 0x35af32b6), - TOBN(0x0ba14307, 0x27d6561e), TOBN(0x879d5ee4, 0xd175b1e2), - TOBN(0xc7c43673, 0x99807db5), TOBN(0x77a54455, 0x9cd55bcd), - TOBN(0xe6c2ff13, 0x0105c072), TOBN(0x18f7a99f, 0x8dda7da4), - TOBN(0x4c301820, 0x0e2d35c1), TOBN(0x06a53ca0, 0xd9cc6c82), - TOBN(0xaa21cc1e, 0xf1aa1d9e), TOBN(0x32414334, 0x4a75b1e8), - TOBN(0x2a6d1328, 0x0ebe9fdc), TOBN(0x16bd173f, 0x98a4755a), - TOBN(0xfbb9b245, 0x2133ffd9), TOBN(0x39a8b2f1, 0x830f1a20), - TOBN(0x484bc97d, 0xd5a1f52a), TOBN(0xd6aebf56, 0xa40eddf8), - TOBN(0x32257acb, 0x76ccdac6), TOBN(0xaf4d36ec, 0x1586ff27), - TOBN(0x8eaa8863, 0xf8de7dd1), TOBN(0x0045d5cf, 0x88647c16)}, - {TOBN(0xa6f3d574, 0xc005979d), TOBN(0xc2072b42, 0x6a40e350), - TOBN(0xfca5c156, 0x8de2ecf9), TOBN(0xa8c8bf5b, 0xa515344e), - TOBN(0x97aee555, 0x114df14a), TOBN(0xd4374a4d, 0xfdc5ec6b), - TOBN(0x754cc28f, 0x2ca85418), TOBN(0x71cb9e27, 0xd3c41f78), - TOBN(0x89105079, 0x03605c39), TOBN(0xf0843d9e, 0xa142c96c), - TOBN(0xf3744934, 0x16923684), TOBN(0x732caa2f, 0xfa0a2893), - TOBN(0xb2e8c270, 0x61160170), TOBN(0xc32788cc, 0x437fbaa3), - TOBN(0x39cd818e, 0xa6eda3ac), TOBN(0xe2e94239, 0x9e2b2e07), - TOBN(0x6967d39b, 0x0260e52a), TOBN(0xd42585cc, 0x90653325), - TOBN(0x0d9bd605, 0x21ca7954), TOBN(0x4fa20877, 0x81ed57b3), - TOBN(0x60c1eff8, 0xe34a0bbe), TOBN(0x56b0040c, 0x84f6ef64), - TOBN(0x28be2b24, 0xb1af8483), TOBN(0xb2278163, 0xf5531614), - TOBN(0x8df27545, 0x5922ac1c), TOBN(0xa7b3ef5c, 0xa52b3f63), - TOBN(0x8e77b214, 0x71de57c4), TOBN(0x31682c10, 0x834c008b), - TOBN(0xc76824f0, 0x4bd55d31), TOBN(0xb6d1c086, 0x17b61c71), - TOBN(0x31db0903, 0xc2a5089d), TOBN(0x9c092172, 0x184e5d3f), - TOBN(0xdd7ced5b, 0xc00cc638), TOBN(0x1a2015eb, 0x61278fc2), - TOBN(0x2e8e5288, 0x6a37f8d6), TOBN(0xc457786f, 0xe79933ad), - TOBN(0xb3fe4cce, 0x2c51211a), TOBN(0xad9b10b2, 0x24c20498), - TOBN(0x90d87a4f, 0xd28db5e5), TOBN(0x698cd105, 0x3aca2fc3), - TOBN(0x4f112d07, 0xe91b536d), TOBN(0xceb982f2, 0x9eba09d6), - TOBN(0x3c157b2c, 0x197c396f), TOBN(0xe23c2d41, 0x7b66eb24), - TOBN(0x480c57d9, 0x3f330d37), TOBN(0xb3a4c8a1, 0x79108deb), - TOBN(0x702388de, 0xcb199ce5), TOBN(0x0b019211, 0xb944a8d4), - TOBN(0x24f2a692, 0x840bb336), TOBN(0x7c353bdc, 0xa669fa7b), - TOBN(0xda20d6fc, 0xdec9c300), TOBN(0x625fbe2f, 0xa13a4f17), - TOBN(0xa2b1b61a, 0xdbc17328), TOBN(0x008965bf, 0xa9515621), - TOBN(0x49690939, 0xc620ff46), TOBN(0x182dd27d, 0x8717e91c), - TOBN(0x5ace5035, 0xea6c3997), TOBN(0x54259aaa, 0xc2610bef), - TOBN(0xef18bb3f, 0x3c80dd39), TOBN(0x6910b95b, 0x5fc3fa39), - TOBN(0xfce2f510, 0x43e09aee), TOBN(0xced56c9f, 0xa7675665), - TOBN(0x10e265ac, 0xd872db61), TOBN(0x6982812e, 0xae9fce69), - TOBN(0x29be11c6, 0xce800998), TOBN(0x72bb1752, 0xb90360d9), - TOBN(0x2c193197, 0x5a4ad590), TOBN(0x2ba2f548, 0x9fc1dbc0), - TOBN(0x7fe4eebb, 0xe490ebe0), TOBN(0x12a0a4cd, 0x7fae11c0), - TOBN(0x7197cf81, 0xe903ba37), TOBN(0xcf7d4aa8, 0xde1c6dd8), - TOBN(0x92af6bf4, 0x3fd5684c), TOBN(0x2b26eecf, 0x80360aa1), - TOBN(0xbd960f30, 0x00546a82), TOBN(0x407b3c43, 0xf59ad8fe), - TOBN(0x86cae5fe, 0x249c82ba), TOBN(0x9e0faec7, 0x2463744c), - TOBN(0x87f551e8, 0x94916272), TOBN(0x033f9344, 0x6ceb0615), - TOBN(0x1e5eb0d1, 0x8be82e84), TOBN(0x89967f0e, 0x7a582fef), - TOBN(0xbcf687d5, 0xa6e921fa), TOBN(0xdfee4cf3, 0xd37a09ba), - TOBN(0x94f06965, 0xb493c465), TOBN(0x638b9a1c, 0x7635c030), - TOBN(0x76667864, 0x66f05e9f), TOBN(0xccaf6808, 0xc04da725), - TOBN(0xca2eb690, 0x768fccfc), TOBN(0xf402d37d, 0xb835b362), - TOBN(0x0efac0d0, 0xe2fdfcce), TOBN(0xefc9cdef, 0xb638d990), - TOBN(0x2af12b72, 0xd1669a8b), TOBN(0x33c536bc, 0x5774ccbd), - TOBN(0x30b21909, 0xfb34870e), TOBN(0xc38fa2f7, 0x7df25aca), - TOBN(0x74c5f02b, 0xbf81f3f5), TOBN(0x0525a5ae, 0xaf7e4581), - TOBN(0x88d2aaba, 0x433c54ae), TOBN(0xed9775db, 0x806a56c5), - TOBN(0xd320738a, 0xc0edb37d), TOBN(0x25fdb6ee, 0x66cc1f51), - TOBN(0xac661d17, 0x10600d76), TOBN(0x931ec1f3, 0xbdd1ed76), - TOBN(0x65c11d62, 0x19ee43f1), TOBN(0x5cd57c3e, 0x60829d97), - TOBN(0xd26c91a3, 0x984be6e8), TOBN(0xf08d9309, 0x8b0c53bd), - TOBN(0x94bc9e5b, 0xc016e4ea), TOBN(0xd3916839, 0x11d43d2b), - TOBN(0x886c5ad7, 0x73701155), TOBN(0xe0377626, 0x20b00715), - TOBN(0x7f01c9ec, 0xaa80ba59), TOBN(0x3083411a, 0x68538e51), - TOBN(0x970370f1, 0xe88128af), TOBN(0x625cc3db, 0x91dec14b), - TOBN(0xfef9666c, 0x01ac3107), TOBN(0xb2a8d577, 0xd5057ac3), - TOBN(0xb0f26299, 0x92be5df7), TOBN(0xf579c8e5, 0x00353924), - TOBN(0xb8fa3d93, 0x1341ed7a), TOBN(0x4223272c, 0xa7b59d49), - TOBN(0x3dcb1947, 0x83b8c4a4), TOBN(0x4e413c01, 0xed1302e4), - TOBN(0x6d999127, 0xe17e44ce), TOBN(0xee86bf75, 0x33b3adfb), - TOBN(0xf6902fe6, 0x25aa96ca), TOBN(0xb73540e4, 0xe5aae47d), - TOBN(0x32801d7b, 0x1b4a158c), TOBN(0xe571c99e, 0x27e2a369), - TOBN(0x40cb76c0, 0x10d9f197), TOBN(0xc308c289, 0x3167c0ae), - TOBN(0xa6ef9dd3, 0xeb7958f2), TOBN(0xa7226dfc, 0x300879b1), - TOBN(0x6cd0b362, 0x7edf0636), TOBN(0x4efbce6c, 0x7bc37eed), - TOBN(0x75f92a05, 0x8d699021), TOBN(0x586d4c79, 0x772566e3), - TOBN(0x378ca5f1, 0x761ad23a), TOBN(0x650d86fc, 0x1465a8ac), - TOBN(0x7a4ed457, 0x842ba251), TOBN(0x6b65e3e6, 0x42234933), - TOBN(0xaf1543b7, 0x31aad657), TOBN(0xa4cefe98, 0xcbfec369), - TOBN(0xb587da90, 0x9f47befb), TOBN(0x6562e9fb, 0x41312d13), - TOBN(0xa691ea59, 0xeff1cefe), TOBN(0xcc30477a, 0x05fc4cf6), - TOBN(0xa1632461, 0x0b0ffd3d), TOBN(0xa1f16f3b, 0x5b355956), - TOBN(0x5b148d53, 0x4224ec24), TOBN(0xdc834e7b, 0xf977012a), - TOBN(0x7bfc5e75, 0xb2c69dbc), TOBN(0x3aa77a29, 0x03c3da6c), - TOBN(0xde0df03c, 0xca910271), TOBN(0xcbd5ca4a, 0x7806dc55), - TOBN(0xe1ca5807, 0x6db476cb), TOBN(0xfde15d62, 0x5f37a31e), - TOBN(0xf49af520, 0xf41af416), TOBN(0x96c5c5b1, 0x7d342db5), - TOBN(0x155c43b7, 0xeb4ceb9b), TOBN(0x2e993010, 0x4e77371a), - TOBN(0x1d2987da, 0x675d43af), TOBN(0xef2bc1c0, 0x8599fd72), - TOBN(0x96894b7b, 0x9342f6b2), TOBN(0x201eadf2, 0x7c8e71f0), - TOBN(0xf3479d9f, 0x4a1f3efc), TOBN(0xe0f8a742, 0x702a9704), - TOBN(0xeafd44b6, 0xb3eba40c), TOBN(0xf9739f29, 0xc1c1e0d0), - TOBN(0x0091471a, 0x619d505e), TOBN(0xc15f9c96, 0x9d7c263e), - TOBN(0x5be47285, 0x83afbe33), TOBN(0xa3b6d6af, 0x04f1e092), - TOBN(0xe76526b9, 0x751a9d11), TOBN(0x2ec5b26d, 0x9a4ae4d2), - TOBN(0xeb66f4d9, 0x02f6fb8d), TOBN(0x4063c561, 0x96912164), - TOBN(0xeb7050c1, 0x80ef3000), TOBN(0x288d1c33, 0xeaa5b3f0), - TOBN(0xe87c68d6, 0x07806fd8), TOBN(0xb2f7f9d5, 0x4bbbf50f), - TOBN(0x25972f3a, 0xac8d6627), TOBN(0xf8547774, 0x10e8c13b), - TOBN(0xcc50ef6c, 0x872b4a60), TOBN(0xab2a34a4, 0x4613521b), - TOBN(0x39c5c190, 0x983e15d1), TOBN(0x61dde5df, 0x59905512), - TOBN(0xe417f621, 0x9f2275f3), TOBN(0x0750c8b6, 0x451d894b), - TOBN(0x75b04ab9, 0x78b0bdaa), TOBN(0x3bfd9fd4, 0x458589bd), - TOBN(0xf1013e30, 0xee9120b6), TOBN(0x2b51af93, 0x23a4743e), - TOBN(0xea96ffae, 0x48d14d9e), TOBN(0x71dc0dbe, 0x698a1d32), - TOBN(0x914962d2, 0x0180cca4), TOBN(0x1ae60677, 0xc3568963), - TOBN(0x8cf227b1, 0x437bc444), TOBN(0xc650c83b, 0xc9962c7a), - TOBN(0x23c2c7dd, 0xfe7ccfc4), TOBN(0xf925c89d, 0x1b929d48), - TOBN(0x4460f74b, 0x06783c33), TOBN(0xac2c8d49, 0xa590475a), - TOBN(0xfb40b407, 0xb807bba0), TOBN(0x9d1e362d, 0x69ff8f3a), - TOBN(0xa33e9681, 0xcbef64a4), TOBN(0x67ece5fa, 0x332fb4b2), - TOBN(0x6900a99b, 0x739f10e3), TOBN(0xc3341ca9, 0xff525925), - TOBN(0xee18a626, 0xa9e2d041), TOBN(0xa5a83685, 0x29580ddd), - TOBN(0xf3470c81, 0x9d7de3cd), TOBN(0xedf02586, 0x2062cf9c), - TOBN(0xf43522fa, 0xc010edb0), TOBN(0x30314135, 0x13a4b1ae), - TOBN(0xc792e02a, 0xdb22b94b), TOBN(0x993d8ae9, 0xa1eaa45b), - TOBN(0x8aad6cd3, 0xcd1e1c63), TOBN(0x89529ca7, 0xc5ce688a), - TOBN(0x2ccee3aa, 0xe572a253), TOBN(0xe02b6438, 0x02a21efb), - TOBN(0xa7091b6e, 0xc9430358), TOBN(0x06d1b1fa, 0x9d7db504), - TOBN(0x58846d32, 0xc4744733), TOBN(0x40517c71, 0x379f9e34), - TOBN(0x2f65655f, 0x130ef6ca), TOBN(0x526e4488, 0xf1f3503f), - TOBN(0x8467bd17, 0x7ee4a976), TOBN(0x1d9dc913, 0x921363d1), - TOBN(0xd8d24c33, 0xb069e041), TOBN(0x5eb5da0a, 0x2cdf7f51), - TOBN(0x1c0f3cb1, 0x197b994f), TOBN(0x3c95a6c5, 0x2843eae9), - TOBN(0x7766ffc9, 0xa6097ea5), TOBN(0x7bea4093, 0xd723b867), - TOBN(0xb48e1f73, 0x4db378f9), TOBN(0x70025b00, 0xe37b77ac), - TOBN(0x943dc8e7, 0xaf24ad46), TOBN(0xb98a15ac, 0x16d00a85), - TOBN(0x3adc38ba, 0x2743b004), TOBN(0xb1c7f4f7, 0x334415ee), - TOBN(0xea43df8f, 0x1e62d05a), TOBN(0x32618905, 0x9d76a3b6), - TOBN(0x2fbd0bb5, 0xa23a0f46), TOBN(0x5bc971db, 0x6a01918c), - TOBN(0x7801d94a, 0xb4743f94), TOBN(0xb94df65e, 0x676ae22b), - TOBN(0xaafcbfab, 0xaf95894c), TOBN(0x7b9bdc07, 0x276b2241), - TOBN(0xeaf98362, 0x5bdda48b), TOBN(0x5977faf2, 0xa3fcb4df), - TOBN(0xbed042ef, 0x052c4b5b), TOBN(0x9fe87f71, 0x067591f0), - TOBN(0xc89c73ca, 0x22f24ec7), TOBN(0x7d37fa9e, 0xe64a9f1b), - TOBN(0x2710841a, 0x15562627), TOBN(0x2c01a613, 0xc243b034), - TOBN(0x1d135c56, 0x2bc68609), TOBN(0xc2ca1715, 0x8b03f1f6), - TOBN(0xc9966c2d, 0x3eb81d82), TOBN(0xc02abf4a, 0x8f6df13e), - TOBN(0x77b34bd7, 0x8f72b43b), TOBN(0xaff6218f, 0x360c82b0), - TOBN(0x0aa5726c, 0x8d55b9d2), TOBN(0xdc0adbe9, 0x99e9bffb), - TOBN(0x9097549c, 0xefb9e72a), TOBN(0x16755712, 0x9dfb3111), - TOBN(0xdd8bf984, 0xf26847f9), TOBN(0xbcb8e387, 0xdfb30cb7), - TOBN(0xc1fd32a7, 0x5171ef9c), TOBN(0x977f3fc7, 0x389b363f), - TOBN(0x116eaf2b, 0xf4babda0), TOBN(0xfeab68bd, 0xf7113c8e), - TOBN(0xd1e3f064, 0xb7def526), TOBN(0x1ac30885, 0xe0b3fa02), - TOBN(0x1c5a6e7b, 0x40142d9d), TOBN(0x839b5603, 0x30921c0b), - TOBN(0x48f301fa, 0x36a116a3), TOBN(0x380e1107, 0xcfd9ee6d), - TOBN(0x7945ead8, 0x58854be1), TOBN(0x4111c12e, 0xcbd4d49d), - TOBN(0xece3b1ec, 0x3a29c2ef), TOBN(0x6356d404, 0x8d3616f5), - TOBN(0x9f0d6a8f, 0x594d320e), TOBN(0x0989316d, 0xf651ccd2), - TOBN(0x6c32117a, 0x0f8fdde4), TOBN(0x9abe5cc5, 0xa26a9bbc), - TOBN(0xcff560fb, 0x9723f671), TOBN(0x21b2a12d, 0x7f3d593c), - TOBN(0xe4cb18da, 0x24ba0696), TOBN(0x186e2220, 0xc3543384), - TOBN(0x722f64e0, 0x88312c29), TOBN(0x94282a99, 0x17dc7752), - TOBN(0x62467bbf, 0x5a85ee89), TOBN(0xf435c650, 0xf10076a0), - TOBN(0xc9ff1539, 0x43b3a50b), TOBN(0x7132130c, 0x1a53efbc), - TOBN(0x31bfe063, 0xf7b0c5b7), TOBN(0xb0179a7d, 0x4ea994cc), - TOBN(0x12d064b3, 0xc85f455b), TOBN(0x47259328, 0x8f6e0062), - TOBN(0xf64e590b, 0xb875d6d9), TOBN(0x22dd6225, 0xad92bcc7), - TOBN(0xb658038e, 0xb9c3bd6d), TOBN(0x00cdb0d6, 0xfbba27c8), - TOBN(0x0c681337, 0x1062c45d), TOBN(0xd8515b8c, 0x2d33407d), - TOBN(0xcb8f699e, 0x8cbb5ecf), TOBN(0x8c4347f8, 0xc608d7d8), - TOBN(0x2c11850a, 0xbb3e00db), TOBN(0x20a8dafd, 0xecb49d19), - TOBN(0xbd781480, 0x45ee2f40), TOBN(0x75e354af, 0x416b60cf), - TOBN(0xde0b58a1, 0x8d49a8c4), TOBN(0xe40e94e2, 0xfa359536), - TOBN(0xbd4fa59f, 0x62accd76), TOBN(0x05cf466a, 0x8c762837), - TOBN(0xb5abda99, 0x448c277b), TOBN(0x5a9e01bf, 0x48b13740), - TOBN(0x9d457798, 0x326aad8d), TOBN(0xbdef4954, 0xc396f7e7), - TOBN(0x6fb274a2, 0xc253e292), TOBN(0x2800bf0a, 0x1cfe53e7), - TOBN(0x22426d31, 0x44438fd4), TOBN(0xef233923, 0x5e259f9a), - TOBN(0x4188503c, 0x03f66264), TOBN(0x9e5e7f13, 0x7f9fdfab), - TOBN(0x565eb76c, 0x5fcc1aba), TOBN(0xea632548, 0x59b5bff8), - TOBN(0x5587c087, 0xaab6d3fa), TOBN(0x92b639ea, 0x6ce39c1b), - TOBN(0x0706e782, 0x953b135c), TOBN(0x7308912e, 0x425268ef), - TOBN(0x599e92c7, 0x090e7469), TOBN(0x83b90f52, 0x9bc35e75), - TOBN(0x4750b3d0, 0x244975b3), TOBN(0xf3a44358, 0x11965d72), - TOBN(0x179c6774, 0x9c8dc751), TOBN(0xff18cdfe, 0xd23d9ff0), - TOBN(0xc4013833, 0x2028e247), TOBN(0x96e280e2, 0xf3bfbc79), - TOBN(0xf60417bd, 0xd0880a84), TOBN(0x263c9f3d, 0x2a568151), - TOBN(0x36be15b3, 0x2d2ce811), TOBN(0x846dc0c2, 0xf8291d21), - TOBN(0x5cfa0ecb, 0x789fcfdb), TOBN(0x45a0beed, 0xd7535b9a), - TOBN(0xec8e9f07, 0x96d69af1), TOBN(0x31a7c5b8, 0x599ab6dc), - TOBN(0xd36d45ef, 0xf9e2e09f), TOBN(0x3cf49ef1, 0xdcee954b), - TOBN(0x6be34cf3, 0x086cff9b), TOBN(0x88dbd491, 0x39a3360f), - TOBN(0x1e96b8cc, 0x0dbfbd1d), TOBN(0xc1e5f7bf, 0xcb7e2552), - TOBN(0x0547b214, 0x28819d98), TOBN(0xc770dd9c, 0x7aea9dcb), - TOBN(0xaef0d4c7, 0x041d68c8), TOBN(0xcc2b9818, 0x13cb9ba8), - TOBN(0x7fc7bc76, 0xfe86c607), TOBN(0x6b7b9337, 0x502a9a95), - TOBN(0x1948dc27, 0xd14dab63), TOBN(0x249dd198, 0xdae047be), - TOBN(0xe8356584, 0xa981a202), TOBN(0x3531dd18, 0x3a893387), - TOBN(0x1be11f90, 0xc85c7209), TOBN(0x93d2fe1e, 0xe2a52b5a), - TOBN(0x8225bfe2, 0xec6d6b97), TOBN(0x9cf6d6f4, 0xbd0aa5de), - TOBN(0x911459cb, 0x54779f5f), TOBN(0x5649cddb, 0x86aeb1f3), - TOBN(0x32133579, 0x3f26ce5a), TOBN(0xc289a102, 0x550f431e), - TOBN(0x559dcfda, 0x73b84c6f), TOBN(0x84973819, 0xee3ac4d7), - TOBN(0xb51e55e6, 0xf2606a82), TOBN(0xe25f7061, 0x90f2fb57), - TOBN(0xacef6c2a, 0xb1a4e37c), TOBN(0x864e359d, 0x5dcf2706), - TOBN(0x479e6b18, 0x7ce57316), TOBN(0x2cab2500, 0x3a96b23d), - TOBN(0xed489862, 0x8ef16df7), TOBN(0x2056538c, 0xef3758b5), - TOBN(0xa7df865e, 0xf15d3101), TOBN(0x80c5533a, 0x61b553d7), - TOBN(0x366e1997, 0x4ed14294), TOBN(0x6620741f, 0xb3c0bcd6), - TOBN(0x21d1d9c4, 0xedc45418), TOBN(0x005b859e, 0xc1cc4a9d), - TOBN(0xdf01f630, 0xa1c462f0), TOBN(0x15d06cf3, 0xf26820c7), - TOBN(0x9f7f24ee, 0x3484be47), TOBN(0x2ff33e96, 0x4a0c902f), - TOBN(0x00bdf457, 0x5a0bc453), TOBN(0x2378dfaf, 0x1aa238db), - TOBN(0x272420ec, 0x856720f2), TOBN(0x2ad9d95b, 0x96797291), - TOBN(0xd1242cc6, 0x768a1558), TOBN(0x2e287f8b, 0x5cc86aa8), - TOBN(0x796873d0, 0x990cecaa), TOBN(0xade55f81, 0x675d4080), - TOBN(0x2645eea3, 0x21f0cd84), TOBN(0x7a1efa0f, 0xb4e17d02), - TOBN(0xf6858420, 0x037cc061), TOBN(0x682e05f0, 0xd5d43e12), - TOBN(0x59c36994, 0x27218710), TOBN(0x85cbba4d, 0x3f7cd2fc), - TOBN(0x726f9729, 0x7a3cd22a), TOBN(0x9f8cd5dc, 0x4a628397), - TOBN(0x17b93ab9, 0xc23165ed), TOBN(0xff5f5dbf, 0x122823d4), - TOBN(0xc1e4e4b5, 0x654a446d), TOBN(0xd1a9496f, 0x677257ba), - TOBN(0x6387ba94, 0xde766a56), TOBN(0x23608bc8, 0x521ec74a), - TOBN(0x16a522d7, 0x6688c4d4), TOBN(0x9d6b4282, 0x07373abd), - TOBN(0xa62f07ac, 0xb42efaa3), TOBN(0xf73e00f7, 0xe3b90180), - TOBN(0x36175fec, 0x49421c3e), TOBN(0xc4e44f9b, 0x3dcf2678), - TOBN(0x76df436b, 0x7220f09f), TOBN(0x172755fb, 0x3aa8b6cf), - TOBN(0xbab89d57, 0x446139cc), TOBN(0x0a0a6e02, 0x5fe0208f), - TOBN(0xcdbb63e2, 0x11e5d399), TOBN(0x33ecaa12, 0xa8977f0b), - TOBN(0x59598b21, 0xf7c42664), TOBN(0xb3e91b32, 0xab65d08a), - TOBN(0x035822ee, 0xf4502526), TOBN(0x1dcf0176, 0x720a82a9), - TOBN(0x50f8598f, 0x3d589e02), TOBN(0xdf0478ff, 0xb1d63d2c), - TOBN(0x8b8068bd, 0x1571cd07), TOBN(0x30c3aa4f, 0xd79670cd), - TOBN(0x25e8fd4b, 0x941ade7f), TOBN(0x3d1debdc, 0x32790011), - TOBN(0x65b6dcbd, 0x3a3f9ff0), TOBN(0x282736a4, 0x793de69c), - TOBN(0xef69a0c3, 0xd41d3bd3), TOBN(0xb533b8c9, 0x07a26bde), - TOBN(0xe2801d97, 0xdb2edf9f), TOBN(0xdc4a8269, 0xe1877af0), - TOBN(0x6c1c5851, 0x3d590dbe), TOBN(0x84632f6b, 0xee4e9357), - TOBN(0xd36d36b7, 0x79b33374), TOBN(0xb46833e3, 0x9bbca2e6), - TOBN(0x37893913, 0xf7fc0586), TOBN(0x385315f7, 0x66bf4719), - TOBN(0x72c56293, 0xb31855dc), TOBN(0xd1416d4e, 0x849061fe), - TOBN(0xbeb3ab78, 0x51047213), TOBN(0x447f6e61, 0xf040c996), - TOBN(0xd06d310d, 0x638b1d0c), TOBN(0xe28a413f, 0xbad1522e), - TOBN(0x685a76cb, 0x82003f86), TOBN(0x610d07f7, 0x0bcdbca3), - TOBN(0x6ff66021, 0x9ca4c455), TOBN(0x7df39b87, 0xcea10eec), - TOBN(0xb9255f96, 0xe22db218), TOBN(0x8cc6d9eb, 0x08a34c44), - TOBN(0xcd4ffb86, 0x859f9276), TOBN(0x8fa15eb2, 0x50d07335), - TOBN(0xdf553845, 0xcf2c24b5), TOBN(0x89f66a9f, 0x52f9c3ba), - TOBN(0x8f22b5b9, 0xe4a7ceb3), TOBN(0xaffef809, 0x0e134686), - TOBN(0x3e53e1c6, 0x8eb8fac2), TOBN(0x93c1e4eb, 0x28aec98e), - TOBN(0xb6b91ec5, 0x32a43bcb), TOBN(0x2dbfa947, 0xb2d74a51), - TOBN(0xe065d190, 0xca84bad7), TOBN(0xfb13919f, 0xad58e65c), - TOBN(0x3c41718b, 0xf1cb6e31), TOBN(0x688969f0, 0x06d05c3f), - TOBN(0xd4f94ce7, 0x21264d45), TOBN(0xfdfb65e9, 0x7367532b), - TOBN(0x5b1be8b1, 0x0945a39d), TOBN(0x229f789c, 0x2b8baf3b), - TOBN(0xd8f41f3e, 0x6f49f15d), TOBN(0x678ce828, 0x907f0792), - TOBN(0xc69ace82, 0xfca6e867), TOBN(0x106451ae, 0xd01dcc89), - TOBN(0x1bb4f7f0, 0x19fc32d2), TOBN(0x64633dfc, 0xb00c52d2), - TOBN(0x8f13549a, 0xad9ea445), TOBN(0x99a3bf50, 0xfb323705), - TOBN(0x0c9625a2, 0x534d4dbc), TOBN(0x45b8f1d1, 0xc2a2fea3), - TOBN(0x76ec21a1, 0xa530fc1a), TOBN(0x4bac9c2a, 0x9e5bd734), - TOBN(0x5996d76a, 0x7b4e3587), TOBN(0x0045cdee, 0x1182d9e3), - TOBN(0x1aee24b9, 0x1207f13d), TOBN(0x66452e97, 0x97345a41), - TOBN(0x16e5b054, 0x9f950cd0), TOBN(0x9cc72fb1, 0xd7fdd075), - TOBN(0x6edd61e7, 0x66249663), TOBN(0xde4caa4d, 0xf043cccb), - TOBN(0x11b1f57a, 0x55c7ac17), TOBN(0x779cbd44, 0x1a85e24d), - TOBN(0x78030f86, 0xe46081e7), TOBN(0xfd4a6032, 0x8e20f643), - TOBN(0xcc7a6488, 0x0a750c0f), TOBN(0x39bacfe3, 0x4e548e83), - TOBN(0x3d418c76, 0x0c110f05), TOBN(0x3e4daa4c, 0xb1f11588), - TOBN(0x2733e7b5, 0x5ffc69ff), TOBN(0x46f147bc, 0x92053127), - TOBN(0x885b2434, 0xd722df94), TOBN(0x6a444f65, 0xe6fc6b7c)}, - {TOBN(0x7a1a465a, 0xc3f16ea8), TOBN(0x115a461d, 0xb2f1d11c), - TOBN(0x4767dd95, 0x6c68a172), TOBN(0x3392f2eb, 0xd13a4698), - TOBN(0xc7a99ccd, 0xe526cdc7), TOBN(0x8e537fdc, 0x22292b81), - TOBN(0x76d8cf69, 0xa6d39198), TOBN(0xffc5ff43, 0x2446852d), - TOBN(0x97b14f7e, 0xa90567e6), TOBN(0x513257b7, 0xb6ae5cb7), - TOBN(0x85454a3c, 0x9f10903d), TOBN(0xd8d2c9ad, 0x69bc3724), - TOBN(0x38da9324, 0x6b29cb44), TOBN(0xb540a21d, 0x77c8cbac), - TOBN(0x9bbfe435, 0x01918e42), TOBN(0xfffa707a, 0x56c3614e), - TOBN(0x0ce4e3f1, 0xd4e353b7), TOBN(0x062d8a14, 0xef46b0a0), - TOBN(0x6408d5ab, 0x574b73fd), TOBN(0xbc41d1c9, 0xd3273ffd), - TOBN(0x3538e1e7, 0x6be77800), TOBN(0x71fe8b37, 0xc5655031), - TOBN(0x1cd91621, 0x6b9b331a), TOBN(0xad825d0b, 0xbb388f73), - TOBN(0x56c2e05b, 0x1cb76219), TOBN(0x0ec0bf91, 0x71567e7e), - TOBN(0xe7076f86, 0x61c4c910), TOBN(0xd67b085b, 0xbabc04d9), - TOBN(0x9fb90459, 0x5e93a96a), TOBN(0x7526c1ea, 0xfbdc249a), - TOBN(0x0d44d367, 0xecdd0bb7), TOBN(0x95399917, 0x9dc0d695), - TOBN(0x61360ee9, 0x9e240d18), TOBN(0x057cdcac, 0xb4b94466), - TOBN(0xe7667cd1, 0x2fe5325c), TOBN(0x1fa297b5, 0x21974e3b), - TOBN(0xfa4081e7, 0xdb083d76), TOBN(0x31993be6, 0xf206bd15), - TOBN(0x8949269b, 0x14c19f8c), TOBN(0x21468d72, 0xa9d92357), - TOBN(0x2ccbc583, 0xa4c506ec), TOBN(0x957ed188, 0xd1acfe97), - TOBN(0x8baed833, 0x12f1aea2), TOBN(0xef2a6cb4, 0x8325362d), - TOBN(0x130dde42, 0x8e195c43), TOBN(0xc842025a, 0x0e6050c6), - TOBN(0x2da972a7, 0x08686a5d), TOBN(0xb52999a1, 0xe508b4a8), - TOBN(0xd9f090b9, 0x10a5a8bd), TOBN(0xca91d249, 0x096864da), - TOBN(0x8e6a93be, 0x3f67dbc1), TOBN(0xacae6fba, 0xf5f4764c), - TOBN(0x1563c6e0, 0xd21411a0), TOBN(0x28fa787f, 0xda0a4ad8), - TOBN(0xd524491c, 0x908c8030), TOBN(0x1257ba0e, 0x4c795f07), - TOBN(0x83f49167, 0xceca9754), TOBN(0x426d2cf6, 0x4b7939a0), - TOBN(0x2555e355, 0x723fd0bf), TOBN(0xa96e6d06, 0xc4f144e2), - TOBN(0x4768a8dd, 0x87880e61), TOBN(0x15543815, 0xe508e4d5), - TOBN(0x09d7e772, 0xb1b65e15), TOBN(0x63439dd6, 0xac302fa0), - TOBN(0xb93f802f, 0xc14e35c2), TOBN(0x71735b7c, 0x4341333c), - TOBN(0x03a25104, 0x16d4f362), TOBN(0x3f4d069b, 0xbf433c8e), - TOBN(0x0d83ae01, 0xf78f5a7c), TOBN(0x50a8ffbe, 0x7c4eed07), - TOBN(0xc74f8906, 0x76e10f83), TOBN(0x7d080966, 0x9ddaf8e1), - TOBN(0xb11df8e1, 0x698e04cc), TOBN(0x877be203, 0x169005c8), - TOBN(0x32749e8c, 0x4f3c6179), TOBN(0x2dbc9d0a, 0x7853fc05), - TOBN(0x187d4f93, 0x9454d937), TOBN(0xe682ce9d, 0xb4800e1b), - TOBN(0xa9129ad8, 0x165e68e8), TOBN(0x0fe29735, 0xbe7f785b), - TOBN(0x5303f40c, 0x5b9e02b7), TOBN(0xa37c9692, 0x35ee04e8), - TOBN(0x5f46cc20, 0x34d6632b), TOBN(0x55ef72b2, 0x96ac545b), - TOBN(0xabec5c1f, 0x7b91b062), TOBN(0x0a79e1c7, 0xbb33e821), - TOBN(0xbb04b428, 0x3a9f4117), TOBN(0x0de1f28f, 0xfd2a475a), - TOBN(0x31019ccf, 0x3a4434b4), TOBN(0xa3458111, 0x1a7954dc), - TOBN(0xa9dac80d, 0xe34972a7), TOBN(0xb043d054, 0x74f6b8dd), - TOBN(0x021c319e, 0x11137b1a), TOBN(0x00a754ce, 0xed5cc03f), - TOBN(0x0aa2c794, 0xcbea5ad4), TOBN(0x093e67f4, 0x70c015b6), - TOBN(0x72cdfee9, 0xc97e3f6b), TOBN(0xc10bcab4, 0xb6da7461), - TOBN(0x3b02d2fc, 0xb59806b9), TOBN(0x85185e89, 0xa1de6f47), - TOBN(0x39e6931f, 0x0eb6c4d4), TOBN(0x4d4440bd, 0xd4fa5b04), - TOBN(0x5418786e, 0x34be7eb8), TOBN(0x6380e521, 0x9d7259bc), - TOBN(0x20ac0351, 0xd598d710), TOBN(0x272c4166, 0xcb3a4da4), - TOBN(0xdb82fe1a, 0xca71de1f), TOBN(0x746e79f2, 0xd8f54b0f), - TOBN(0x6e7fc736, 0x4b573e9b), TOBN(0x75d03f46, 0xfd4b5040), - TOBN(0x5c1cc36d, 0x0b98d87b), TOBN(0x513ba3f1, 0x1f472da1), - TOBN(0x79d0af26, 0xabb177dd), TOBN(0xf82ab568, 0x7891d564), - TOBN(0x2b6768a9, 0x72232173), TOBN(0xefbb3bb0, 0x8c1f6619), - TOBN(0xb29c11db, 0xa6d18358), TOBN(0x519e2797, 0xb0916d3a), - TOBN(0xd4dc18f0, 0x9188e290), TOBN(0x648e86e3, 0x98b0ca7f), - TOBN(0x859d3145, 0x983c38b5), TOBN(0xb14f176c, 0x637abc8b), - TOBN(0x2793fb9d, 0xcaff7be6), TOBN(0xebe5a55f, 0x35a66a5a), - TOBN(0x7cec1dcd, 0x9f87dc59), TOBN(0x7c595cd3, 0xfbdbf560), - TOBN(0x5b543b22, 0x26eb3257), TOBN(0x69080646, 0xc4c935fd), - TOBN(0x7f2e4403, 0x81e9ede3), TOBN(0x243c3894, 0xcaf6df0a), - TOBN(0x7c605bb1, 0x1c073b11), TOBN(0xcd06a541, 0xba6a4a62), - TOBN(0x29168949, 0x49d4e2e5), TOBN(0x33649d07, 0x4af66880), - TOBN(0xbfc0c885, 0xe9a85035), TOBN(0xb4e52113, 0xfc410f4b), - TOBN(0xdca3b706, 0x78a6513b), TOBN(0x92ea4a2a, 0x9edb1943), - TOBN(0x02642216, 0xdb6e2dd8), TOBN(0x9b45d0b4, 0x9fd57894), - TOBN(0x114e70db, 0xc69d11ae), TOBN(0x1477dd19, 0x4c57595f), - TOBN(0xbc2208b4, 0xec77c272), TOBN(0x95c5b4d7, 0xdb68f59c), - TOBN(0xb8c4fc63, 0x42e532b7), TOBN(0x386ba422, 0x9ae35290), - TOBN(0xfb5dda42, 0xd201ecbc), TOBN(0x2353dc8b, 0xa0e38fd6), - TOBN(0x9a0b85ea, 0x68f7e978), TOBN(0x96ec5682, 0x2ad6d11f), - TOBN(0x5e279d6c, 0xe5f6886d), TOBN(0xd3fe03cd, 0x3cb1914d), - TOBN(0xfe541fa4, 0x7ea67c77), TOBN(0x952bd2af, 0xe3ea810c), - TOBN(0x791fef56, 0x8d01d374), TOBN(0xa3a1c621, 0x0f11336e), - TOBN(0x5ad0d5a9, 0xc7ec6d79), TOBN(0xff7038af, 0x3225c342), - TOBN(0x003c6689, 0xbc69601b), TOBN(0x25059bc7, 0x45e8747d), - TOBN(0xfa4965b2, 0xf2086fbf), TOBN(0xf6840ea6, 0x86916078), - TOBN(0xd7ac7620, 0x70081d6c), TOBN(0xe600da31, 0xb5328645), - TOBN(0x01916f63, 0x529b8a80), TOBN(0xe80e4858, 0x2d7d6f3e), - TOBN(0x29eb0fe8, 0xd664ca7c), TOBN(0xf017637b, 0xe7b43b0c), - TOBN(0x9a75c806, 0x76cb2566), TOBN(0x8f76acb1, 0xb24892d9), - TOBN(0x7ae7b9cc, 0x1f08fe45), TOBN(0x19ef7329, 0x6a4907d8), - TOBN(0x2db4ab71, 0x5f228bf0), TOBN(0xf3cdea39, 0x817032d7), - TOBN(0x0b1f482e, 0xdcabe3c0), TOBN(0x3baf76b4, 0xbb86325c), - TOBN(0xd49065e0, 0x10089465), TOBN(0x3bab5d29, 0x8e77c596), - TOBN(0x7636c3a6, 0x193dbd95), TOBN(0xdef5d294, 0xb246e499), - TOBN(0xb22c58b9, 0x286b2475), TOBN(0xa0b93939, 0xcd80862b), - TOBN(0x3002c83a, 0xf0992388), TOBN(0x6de01f9b, 0xeacbe14c), - TOBN(0x6aac688e, 0xadd70482), TOBN(0x708de92a, 0x7b4a4e8a), - TOBN(0x75b6dd73, 0x758a6eef), TOBN(0xea4bf352, 0x725b3c43), - TOBN(0x10041f2c, 0x87912868), TOBN(0xb1b1be95, 0xef09297a), - TOBN(0x19ae23c5, 0xa9f3860a), TOBN(0xc4f0f839, 0x515dcf4b), - TOBN(0x3c7ecca3, 0x97f6306a), TOBN(0x744c44ae, 0x68a3a4b0), - TOBN(0x69cd13a0, 0xb3a1d8a2), TOBN(0x7cad0a1e, 0x5256b578), - TOBN(0xea653fcd, 0x33791d9e), TOBN(0x9cc2a05d, 0x74b2e05f), - TOBN(0x73b391dc, 0xfd7affa2), TOBN(0xddb7091e, 0xb6b05442), - TOBN(0xc71e27bf, 0x8538a5c6), TOBN(0x195c63dd, 0x89abff17), - TOBN(0xfd315285, 0x1b71e3da), TOBN(0x9cbdfda7, 0xfa680fa0), - TOBN(0x9db876ca, 0x849d7eab), TOBN(0xebe2764b, 0x3c273271), - TOBN(0x663357e3, 0xf208dcea), TOBN(0x8c5bd833, 0x565b1b70), - TOBN(0xccc3b4f5, 0x9837fc0d), TOBN(0x9b641ba8, 0xa79cf00f), - TOBN(0x7428243d, 0xdfdf3990), TOBN(0x83a594c4, 0x020786b1), - TOBN(0xb712451a, 0x526c4502), TOBN(0x9d39438e, 0x6adb3f93), - TOBN(0xfdb261e3, 0xe9ff0ccd), TOBN(0x80344e3c, 0xe07af4c3), - TOBN(0x75900d7c, 0x2fa4f126), TOBN(0x08a3b865, 0x5c99a232), - TOBN(0x2478b6bf, 0xdb25e0c3), TOBN(0x482cc2c2, 0x71db2edf), - TOBN(0x37df7e64, 0x5f321bb8), TOBN(0x8a93821b, 0x9a8005b4), - TOBN(0x3fa2f10c, 0xcc8c1958), TOBN(0x0d332218, 0x2c269d0a), - TOBN(0x20ab8119, 0xe246b0e6), TOBN(0xb39781e4, 0xd349fd17), - TOBN(0xd293231e, 0xb31aa100), TOBN(0x4b779c97, 0xbb032168), - TOBN(0x4b3f19e1, 0xc8470500), TOBN(0x45b7efe9, 0x0c4c869d), - TOBN(0xdb84f38a, 0xa1a6bbcc), TOBN(0x3b59cb15, 0xb2fddbc1), - TOBN(0xba5514df, 0x3fd165e8), TOBN(0x499fd6a9, 0x061f8811), - TOBN(0x72cd1fe0, 0xbfef9f00), TOBN(0x120a4bb9, 0x79ad7e8a), - TOBN(0xf2ffd095, 0x5f4a5ac5), TOBN(0xcfd174f1, 0x95a7a2f0), - TOBN(0xd42301ba, 0x9d17baf1), TOBN(0xd2fa487a, 0x77f22089), - TOBN(0x9cb09efe, 0xb1dc77e1), TOBN(0xe9566939, 0x21c99682), - TOBN(0x8c546901, 0x6c6067bb), TOBN(0xfd378574, 0x61c24456), - TOBN(0x2b6a6cbe, 0x81796b33), TOBN(0x62d550f6, 0x58e87f8b), - TOBN(0x1b763e1c, 0x7f1b01b4), TOBN(0x4b93cfea, 0x1b1b5e12), - TOBN(0xb9345238, 0x1d531696), TOBN(0x57201c00, 0x88cdde69), - TOBN(0xdde92251, 0x9a86afc7), TOBN(0xe3043895, 0xbd35cea8), - TOBN(0x7608c1e1, 0x8555970d), TOBN(0x8267dfa9, 0x2535935e), - TOBN(0xd4c60a57, 0x322ea38b), TOBN(0xe0bf7977, 0x804ef8b5), - TOBN(0x1a0dab28, 0xc06fece4), TOBN(0xd405991e, 0x94e7b49d), - TOBN(0xc542b6d2, 0x706dab28), TOBN(0xcb228da3, 0xa91618fb), - TOBN(0x224e4164, 0x107d1cea), TOBN(0xeb9fdab3, 0xd0f5d8f1), - TOBN(0xc02ba386, 0x0d6e41cd), TOBN(0x676a72c5, 0x9b1f7146), - TOBN(0xffd6dd98, 0x4d6cb00b), TOBN(0xcef9c5ca, 0xde2e8d7c), - TOBN(0xa1bbf5d7, 0x641c7936), TOBN(0x1b95b230, 0xee8f772e), - TOBN(0xf765a92e, 0xe8ac25b1), TOBN(0xceb04cfc, 0x3a18b7c6), - TOBN(0x27944cef, 0x0acc8966), TOBN(0xcbb3c957, 0x434c1004), - TOBN(0x9c9971a1, 0xa43ff93c), TOBN(0x5bc2db17, 0xa1e358a9), - TOBN(0x45b4862e, 0xa8d9bc82), TOBN(0x70ebfbfb, 0x2201e052), - TOBN(0xafdf64c7, 0x92871591), TOBN(0xea5bcae6, 0xb42d0219), - TOBN(0xde536c55, 0x2ad8f03c), TOBN(0xcd6c3f4d, 0xa76aa33c), - TOBN(0xbeb5f623, 0x0bca6de3), TOBN(0xdd20dd99, 0xb1e706fd), - TOBN(0x90b3ff9d, 0xac9059d4), TOBN(0x2d7b2902, 0x7ccccc4e), - TOBN(0x8a090a59, 0xce98840f), TOBN(0xa5d947e0, 0x8410680a), - TOBN(0x49ae346a, 0x923379a5), TOBN(0x7dbc84f9, 0xb28a3156), - TOBN(0xfd40d916, 0x54a1aff2), TOBN(0xabf318ba, 0x3a78fb9b), - TOBN(0x50152ed8, 0x3029f95e), TOBN(0x9fc1dd77, 0xc58ad7fa), - TOBN(0x5fa57915, 0x13595c17), TOBN(0xb9504668, 0x8f62b3a9), - TOBN(0x907b5b24, 0xff3055b0), TOBN(0x2e995e35, 0x9a84f125), - TOBN(0x87dacf69, 0x7e9bbcfb), TOBN(0x95d0c1d6, 0xe86d96e3), - TOBN(0x65726e3c, 0x2d95a75c), TOBN(0x2c3c9001, 0xacd27f21), - TOBN(0x1deab561, 0x6c973f57), TOBN(0x108b7e2c, 0xa5221643), - TOBN(0x5fee9859, 0xc4ef79d4), TOBN(0xbd62b88a, 0x40d4b8c6), - TOBN(0xb4dd29c4, 0x197c75d6), TOBN(0x266a6df2, 0xb7076feb), - TOBN(0x9512d0ea, 0x4bf2df11), TOBN(0x1320c24f, 0x6b0cc9ec), - TOBN(0x6bb1e0e1, 0x01a59596), TOBN(0x8317c5bb, 0xeff9aaac), - TOBN(0x65bb405e, 0x385aa6c9), TOBN(0x613439c1, 0x8f07988f), - TOBN(0xd730049f, 0x16a66e91), TOBN(0xe97f2820, 0xfa1b0e0d), - TOBN(0x4131e003, 0x304c28ea), TOBN(0x820ab732, 0x526bac62), - TOBN(0xb2ac9ef9, 0x28714423), TOBN(0x54ecfffa, 0xadb10cb2), - TOBN(0x8781476e, 0xf886a4cc), TOBN(0x4b2c87b5, 0xdb2f8d49), - TOBN(0xe857cd20, 0x0a44295d), TOBN(0x707d7d21, 0x58c6b044), - TOBN(0xae8521f9, 0xf596757c), TOBN(0x87448f03, 0x67b2b714), - TOBN(0x13a9bc45, 0x5ebcd58d), TOBN(0x79bcced9, 0x9122d3c1), - TOBN(0x3c644247, 0x9e076642), TOBN(0x0cf22778, 0x2df4767d), - TOBN(0x5e61aee4, 0x71d444b6), TOBN(0x211236bf, 0xc5084a1d), - TOBN(0x7e15bc9a, 0x4fd3eaf6), TOBN(0x68df2c34, 0xab622bf5), - TOBN(0x9e674f0f, 0x59bf4f36), TOBN(0xf883669b, 0xd7f34d73), - TOBN(0xc48ac1b8, 0x31497b1d), TOBN(0x323b925d, 0x5106703b), - TOBN(0x22156f42, 0x74082008), TOBN(0xeffc521a, 0xc8482bcb), - TOBN(0x5c6831bf, 0x12173479), TOBN(0xcaa2528f, 0xc4739490), - TOBN(0x84d2102a, 0x8f1b3c4d), TOBN(0xcf64dfc1, 0x2d9bec0d), - TOBN(0x433febad, 0x78a546ef), TOBN(0x1f621ec3, 0x7b73cef1), - TOBN(0x6aecd627, 0x37338615), TOBN(0x162082ab, 0x01d8edf6), - TOBN(0x833a8119, 0x19e86b66), TOBN(0x6023a251, 0xd299b5db), - TOBN(0xf5bb0c3a, 0xbbf04b89), TOBN(0x6735eb69, 0xae749a44), - TOBN(0xd0e058c5, 0x4713de3b), TOBN(0xfdf2593e, 0x2c3d4ccd), - TOBN(0x1b8f414e, 0xfdd23667), TOBN(0xdd52aaca, 0xfa2015ee), - TOBN(0x3e31b517, 0xbd9625ff), TOBN(0x5ec9322d, 0x8db5918c), - TOBN(0xbc73ac85, 0xa96f5294), TOBN(0x82aa5bf3, 0x61a0666a), - TOBN(0x49755810, 0xbf08ac42), TOBN(0xd21cdfd5, 0x891cedfc), - TOBN(0x918cb57b, 0x67f8be10), TOBN(0x365d1a7c, 0x56ffa726), - TOBN(0x2435c504, 0x6532de93), TOBN(0xc0fc5e10, 0x2674cd02), - TOBN(0x6e51fcf8, 0x9cbbb142), TOBN(0x1d436e5a, 0xafc50692), - TOBN(0x766bffff, 0x3fbcae22), TOBN(0x3148c2fd, 0xfd55d3b8), - TOBN(0x52c7fdc9, 0x233222fa), TOBN(0x89ff1092, 0xe419fb6b), - TOBN(0x3cd6db99, 0x25254977), TOBN(0x2e85a161, 0x1cf12ca7), - TOBN(0xadd2547c, 0xdc810bc9), TOBN(0xea3f458f, 0x9d257c22), - TOBN(0x642c1fbe, 0x27d6b19b), TOBN(0xed07e6b5, 0x140481a6), - TOBN(0x6ada1d42, 0x86d2e0f8), TOBN(0xe5920122, 0x0e8a9fd5), - TOBN(0x02c936af, 0x708c1b49), TOBN(0x60f30fee, 0x2b4bfaff), - TOBN(0x6637ad06, 0x858e6a61), TOBN(0xce4c7767, 0x3fd374d0), - TOBN(0x39d54b2d, 0x7188defb), TOBN(0xa8c9d250, 0xf56a6b66), - TOBN(0x58fc0f5e, 0xb24fe1dc), TOBN(0x9eaf9dee, 0x6b73f24c), - TOBN(0xa90d588b, 0x33650705), TOBN(0xde5b62c5, 0xaf2ec729), - TOBN(0x5c72cfae, 0xd3c2b36e), TOBN(0x868c19d5, 0x034435da), - TOBN(0x88605f93, 0xe17ee145), TOBN(0xaa60c4ee, 0x77a5d5b1), - TOBN(0xbcf5bfd2, 0x3b60c472), TOBN(0xaf4ef13c, 0xeb1d3049), - TOBN(0x373f44fc, 0xe13895c9), TOBN(0xf29b382f, 0x0cbc9822), - TOBN(0x1bfcb853, 0x73efaef6), TOBN(0xcf56ac9c, 0xa8c96f40), - TOBN(0xd7adf109, 0x7a191e24), TOBN(0x98035f44, 0xbf8a8dc2), - TOBN(0xf40a71b9, 0x1e750c84), TOBN(0xc57f7b0c, 0x5dc6c469), - TOBN(0x49a0e79c, 0x6fbc19c1), TOBN(0x6b0f5889, 0xa48ebdb8), - TOBN(0x5d3fd084, 0xa07c4e9f), TOBN(0xc3830111, 0xab27de14), - TOBN(0x0e4929fe, 0x33e08dcc), TOBN(0xf4a5ad24, 0x40bb73a3), - TOBN(0xde86c2bf, 0x490f97ca), TOBN(0x288f09c6, 0x67a1ce18), - TOBN(0x364bb886, 0x1844478d), TOBN(0x7840fa42, 0xceedb040), - TOBN(0x1269fdd2, 0x5a631b37), TOBN(0x94761f1e, 0xa47c8b7d), - TOBN(0xfc0c2e17, 0x481c6266), TOBN(0x85e16ea2, 0x3daa5fa7), - TOBN(0xccd86033, 0x92491048), TOBN(0x0c2f6963, 0xf4d402d7), - TOBN(0x6336f7df, 0xdf6a865c), TOBN(0x0a2a463c, 0xb5c02a87), - TOBN(0xb0e29be7, 0xbf2f12ee), TOBN(0xf0a22002, 0x66bad988), - TOBN(0x27f87e03, 0x9123c1d7), TOBN(0x21669c55, 0x328a8c98), - TOBN(0x186b9803, 0x92f14529), TOBN(0xd3d056cc, 0x63954df3), - TOBN(0x2f03fd58, 0x175a46f6), TOBN(0x63e34ebe, 0x11558558), - TOBN(0xe13fedee, 0x5b80cfa5), TOBN(0xe872a120, 0xd401dbd1), - TOBN(0x52657616, 0xe8a9d667), TOBN(0xbc8da4b6, 0xe08d6693), - TOBN(0x370fb9bb, 0x1b703e75), TOBN(0x6773b186, 0xd4338363), - TOBN(0x18dad378, 0xecef7bff), TOBN(0xaac787ed, 0x995677da), - TOBN(0x4801ea8b, 0x0437164b), TOBN(0xf430ad20, 0x73fe795e), - TOBN(0xb164154d, 0x8ee5eb73), TOBN(0x0884ecd8, 0x108f7c0e), - TOBN(0x0e6ec096, 0x5f520698), TOBN(0x640631fe, 0x44f7b8d9), - TOBN(0x92fd34fc, 0xa35a68b9), TOBN(0x9c5a4b66, 0x4d40cf4e), - TOBN(0x949454bf, 0x80b6783d), TOBN(0x80e701fe, 0x3a320a10), - TOBN(0x8d1a564a, 0x1a0a39b2), TOBN(0x1436d53d, 0x320587db), - TOBN(0xf5096e6d, 0x6556c362), TOBN(0xbc23a3c0, 0xe2455d7e), - TOBN(0x3a7aee54, 0x807230f9), TOBN(0x9ba1cfa6, 0x22ae82fd), - TOBN(0x833a057a, 0x99c5d706), TOBN(0x8be85f4b, 0x842315c9), - TOBN(0xd083179a, 0x66a72f12), TOBN(0x2fc77d5d, 0xcdcc73cd), - TOBN(0x22b88a80, 0x5616ee30), TOBN(0xfb09548f, 0xe7ab1083), - TOBN(0x8ad6ab0d, 0x511270cd), TOBN(0x61f6c57a, 0x6924d9ab), - TOBN(0xa0f7bf72, 0x90aecb08), TOBN(0x849f87c9, 0x0df784a4), - TOBN(0x27c79c15, 0xcfaf1d03), TOBN(0xbbf9f675, 0xc463face), - TOBN(0x91502c65, 0x765ba543), TOBN(0x18ce3cac, 0x42ea60dd), - TOBN(0xe5cee6ac, 0x6e43ecb3), TOBN(0x63e4e910, 0x68f2aeeb), - TOBN(0x26234fa3, 0xc85932ee), TOBN(0x96883e8b, 0x4c90c44d), - TOBN(0x29b9e738, 0xa18a50f6), TOBN(0xbfc62b2a, 0x3f0420df), - TOBN(0xd22a7d90, 0x6d3e1fa9), TOBN(0x17115618, 0xfe05b8a3), - TOBN(0x2a0c9926, 0xbb2b9c01), TOBN(0xc739fcc6, 0xe07e76a2), - TOBN(0x540e9157, 0x165e439a), TOBN(0x06353a62, 0x6a9063d8), - TOBN(0x84d95594, 0x61e927a3), TOBN(0x013b9b26, 0xe2e0be7f), - TOBN(0x4feaec3b, 0x973497f1), TOBN(0x15c0f94e, 0x093ebc2d), - TOBN(0x6af5f227, 0x33af0583), TOBN(0x0c2af206, 0xc61f3340), - TOBN(0xd25dbdf1, 0x4457397c), TOBN(0x2e8ed017, 0xcabcbae0), - TOBN(0xe3010938, 0xc2815306), TOBN(0xbaa99337, 0xe8c6cd68), - TOBN(0x08513182, 0x3b0ec7de), TOBN(0x1e1b822b, 0x58df05df), - TOBN(0x5c14842f, 0xa5c3b683), TOBN(0x98fe977e, 0x3eba34ce), - TOBN(0xfd2316c2, 0x0d5e8873), TOBN(0xe48d839a, 0xbd0d427d), - TOBN(0x495b2218, 0x623fc961), TOBN(0x24ee56e7, 0xb46fba5e), - TOBN(0x9184a55b, 0x91e4de58), TOBN(0xa7488ca5, 0xdfdea288), - TOBN(0xa723862e, 0xa8dcc943), TOBN(0x92d762b2, 0x849dc0fc), - TOBN(0x3c444a12, 0x091ff4a9), TOBN(0x581113fa, 0x0cada274), - TOBN(0xb9de0a45, 0x30d8eae2), TOBN(0x5e0fcd85, 0xdf6b41ea), - TOBN(0x6233ea68, 0xc094dbb5), TOBN(0xb77d062e, 0xd968d410), - TOBN(0x3e719bbc, 0x58b3002d), TOBN(0x68e7dd3d, 0x3dc49d58), - TOBN(0x8d825740, 0x013a5e58), TOBN(0x21311747, 0x3c9e3c1b), - TOBN(0x0cb0a2a7, 0x7c99b6ab), TOBN(0x5c48a3b3, 0xc2f888f2)}, - {TOBN(0xc7913e91, 0x991724f3), TOBN(0x5eda799c, 0x39cbd686), - TOBN(0xddb595c7, 0x63d4fc1e), TOBN(0x6b63b80b, 0xac4fed54), - TOBN(0x6ea0fc69, 0x7e5fb516), TOBN(0x737708ba, 0xd0f1c964), - TOBN(0x9628745f, 0x11a92ca5), TOBN(0x61f37958, 0x9a86967a), - TOBN(0x9af39b2c, 0xaa665072), TOBN(0x78322fa4, 0xefd324ef), - TOBN(0x3d153394, 0xc327bd31), TOBN(0x81d5f271, 0x3129dab0), - TOBN(0xc72e0c42, 0xf48027f5), TOBN(0xaa40cdbc, 0x8536e717), - TOBN(0xf45a657a, 0x2d369d0f), TOBN(0xb03bbfc4, 0xea7f74e6), - TOBN(0x46a8c418, 0x0d738ded), TOBN(0x6f1a5bb0, 0xe0de5729), - TOBN(0xf10230b9, 0x8ba81675), TOBN(0x32c6f30c, 0x112b33d4), - TOBN(0x7559129d, 0xd8fffb62), TOBN(0x6a281b47, 0xb459bf05), - TOBN(0x77c1bd3a, 0xfa3b6776), TOBN(0x0709b380, 0x7829973a), - TOBN(0x8c26b232, 0xa3326505), TOBN(0x38d69272, 0xee1d41bf), - TOBN(0x0459453e, 0xffe32afa), TOBN(0xce8143ad, 0x7cb3ea87), - TOBN(0x932ec1fa, 0x7e6ab666), TOBN(0x6cd2d230, 0x22286264), - TOBN(0x459a46fe, 0x6736f8ed), TOBN(0x50bf0d00, 0x9eca85bb), - TOBN(0x0b825852, 0x877a21ec), TOBN(0x300414a7, 0x0f537a94), - TOBN(0x3f1cba40, 0x21a9a6a2), TOBN(0x50824eee, 0x76943c00), - TOBN(0xa0dbfcec, 0xf83cba5d), TOBN(0xf9538148, 0x93b4f3c0), - TOBN(0x61744162, 0x48f24dd7), TOBN(0x5322d64d, 0xe4fb09dd), - TOBN(0x57447384, 0x3d9325f3), TOBN(0xa9bef2d0, 0xf371cb84), - TOBN(0x77d2188b, 0xa61e36c5), TOBN(0xbbd6a7d7, 0xc602df72), - TOBN(0xba3aa902, 0x8f61bc0b), TOBN(0xf49085ed, 0x6ed0b6a1), - TOBN(0x8bc625d6, 0xae6e8298), TOBN(0x832b0b1d, 0xa2e9c01d), - TOBN(0xa337c447, 0xf1f0ced1), TOBN(0x800cc793, 0x9492dd2b), - TOBN(0x4b93151d, 0xbea08efa), TOBN(0x820cf3f8, 0xde0a741e), - TOBN(0xff1982dc, 0x1c0f7d13), TOBN(0xef921960, 0x84dde6ca), - TOBN(0x1ad7d972, 0x45f96ee3), TOBN(0x319c8dbe, 0x29dea0c7), - TOBN(0xd3ea3871, 0x7b82b99b), TOBN(0x75922d4d, 0x470eb624), - TOBN(0x8f66ec54, 0x3b95d466), TOBN(0x66e673cc, 0xbee1e346), - TOBN(0x6afe67c4, 0xb5f2b89a), TOBN(0x3de9c1e6, 0x290e5cd3), - TOBN(0x8c278bb6, 0x310a2ada), TOBN(0x420fa384, 0x0bdb323b), - TOBN(0x0ae1d63b, 0x0eb919b0), TOBN(0xd74ee51d, 0xa74b9620), - TOBN(0x395458d0, 0xa674290c), TOBN(0x324c930f, 0x4620a510), - TOBN(0x2d1f4d19, 0xfbac27d4), TOBN(0x4086e8ca, 0x9bedeeac), - TOBN(0x0cdd211b, 0x9b679ab8), TOBN(0x5970167d, 0x7090fec4), - TOBN(0x3420f2c9, 0xfaf1fc63), TOBN(0x616d333a, 0x328c8bb4), - TOBN(0x7d65364c, 0x57f1fe4a), TOBN(0x9343e877, 0x55e5c73a), - TOBN(0x5795176b, 0xe970e78c), TOBN(0xa36ccebf, 0x60533627), - TOBN(0xfc7c7380, 0x09cdfc1b), TOBN(0xb39a2afe, 0xb3fec326), - TOBN(0xb7ff1ba1, 0x6224408a), TOBN(0xcc856e92, 0x247cfc5e), - TOBN(0x01f102e7, 0xc18bc493), TOBN(0x4613ab74, 0x2091c727), - TOBN(0xaa25e89c, 0xc420bf2b), TOBN(0x00a53176, 0x90337ec2), - TOBN(0xd2be9f43, 0x7d025fc7), TOBN(0x3316fb85, 0x6e6fe3dc), - TOBN(0x27520af5, 0x9ac50814), TOBN(0xfdf95e78, 0x9a8e4223), - TOBN(0xb7e7df2a, 0x56bec5a0), TOBN(0xf7022f7d, 0xdf159e5d), - TOBN(0x93eeeab1, 0xcac1fe8f), TOBN(0x8040188c, 0x37451168), - TOBN(0x7ee8aa8a, 0xd967dce6), TOBN(0xfa0e79e7, 0x3abc9299), - TOBN(0x67332cfc, 0x2064cfd1), TOBN(0x339c31de, 0xb0651934), - TOBN(0x719b28d5, 0x2a3bcbea), TOBN(0xee74c82b, 0x9d6ae5c6), - TOBN(0x0927d05e, 0xbaf28ee6), TOBN(0x82cecf2c, 0x9d719028), - TOBN(0x0b0d353e, 0xddb30289), TOBN(0xfe4bb977, 0xfddb2e29), - TOBN(0xbb5bb990, 0x640bfd9e), TOBN(0xd226e277, 0x82f62108), - TOBN(0x4bf00985, 0x02ffdd56), TOBN(0x7756758a, 0x2ca1b1b5), - TOBN(0xc32b62a3, 0x5285fe91), TOBN(0xedbc546a, 0x8c9cd140), - TOBN(0x1e47a013, 0xaf5cb008), TOBN(0xbca7e720, 0x073ce8f2), - TOBN(0xe10b2ab8, 0x17a91cae), TOBN(0xb89aab65, 0x08e27f63), - TOBN(0x7b3074a7, 0xdba3ddf9), TOBN(0x1c20ce09, 0x330c2972), - TOBN(0x6b9917b4, 0x5fcf7e33), TOBN(0xe6793743, 0x945ceb42), - TOBN(0x18fc2215, 0x5c633d19), TOBN(0xad1adb3c, 0xc7485474), - TOBN(0x646f9679, 0x6424c49b), TOBN(0xf888dfe8, 0x67c241c9), - TOBN(0xe12d4b93, 0x24f68b49), TOBN(0x9a6b62d8, 0xa571df20), - TOBN(0x81b4b26d, 0x179483cb), TOBN(0x666f9632, 0x9511fae2), - TOBN(0xd281b3e4, 0xd53aa51f), TOBN(0x7f96a765, 0x7f3dbd16), - TOBN(0xa7f8b5bf, 0x074a30ce), TOBN(0xd7f52107, 0x005a32e6), - TOBN(0x6f9e0907, 0x50237ed4), TOBN(0x2f21da47, 0x8096fa2b), - TOBN(0xf3e19cb4, 0xeec863a0), TOBN(0xd18f77fd, 0x9527620a), - TOBN(0x9505c81c, 0x407c1cf8), TOBN(0x9998db4e, 0x1b6ec284), - TOBN(0x7e3389e5, 0xc247d44d), TOBN(0x12507141, 0x3f4f3d80), - TOBN(0xd4ba0110, 0x4a78a6c7), TOBN(0x312874a0, 0x767720be), - TOBN(0xded059a6, 0x75944370), TOBN(0xd6123d90, 0x3b2c0bdd), - TOBN(0xa56b717b, 0x51c108e3), TOBN(0x9bb7940e, 0x070623e9), - TOBN(0x794e2d59, 0x84ac066c), TOBN(0xf5954a92, 0xe68c69a0), - TOBN(0x28c52458, 0x4fd99dcc), TOBN(0x60e639fc, 0xb1012517), - TOBN(0xc2e60125, 0x7de79248), TOBN(0xe9ef6404, 0xf12fc6d7), - TOBN(0x4c4f2808, 0x2a3b5d32), TOBN(0x865ad32e, 0xc768eb8a), - TOBN(0xac02331b, 0x13fb70b6), TOBN(0x037b44c1, 0x95599b27), - TOBN(0x1a860fc4, 0x60bd082c), TOBN(0xa2e25745, 0xc980cd01), - TOBN(0xee3387a8, 0x1da0263e), TOBN(0x931bfb95, 0x2d10f3d6), - TOBN(0x5b687270, 0xa1f24a32), TOBN(0xf140e65d, 0xca494b86), - TOBN(0x4f4ddf91, 0xb2f1ac7a), TOBN(0xf99eaabb, 0x760fee27), - TOBN(0x57f4008a, 0x49c228e5), TOBN(0x090be440, 0x1cf713bb), - TOBN(0xac91fbe4, 0x5004f022), TOBN(0xd838c2c2, 0x569e1af6), - TOBN(0xd6c7d20b, 0x0f1daaa5), TOBN(0xaa063ac1, 0x1bbb02c0), - TOBN(0x0938a422, 0x59558a78), TOBN(0x5343c669, 0x8435da2f), - TOBN(0x96f67b18, 0x034410dc), TOBN(0x7cc1e424, 0x84510804), - TOBN(0x86a1543f, 0x16dfbb7d), TOBN(0x921fa942, 0x5b5bd592), - TOBN(0x9dcccb6e, 0xb33dd03c), TOBN(0x8581ddd9, 0xb843f51e), - TOBN(0x54935fcb, 0x81d73c9e), TOBN(0x6d07e979, 0x0a5e97ab), - TOBN(0x4dc7b30a, 0xcf3a6bab), TOBN(0x147ab1f3, 0x170bee11), - TOBN(0x0aaf8e3d, 0x9fafdee4), TOBN(0xfab3dbcb, 0x538a8b95), - TOBN(0x405df4b3, 0x6ef13871), TOBN(0xf1f4e9cb, 0x088d5a49), - TOBN(0x9bcd24d3, 0x66b33f1d), TOBN(0x3b97b820, 0x5ce445c0), - TOBN(0xe2926549, 0xba93ff61), TOBN(0xd9c341ce, 0x4dafe616), - TOBN(0xfb30a76e, 0x16efb6f3), TOBN(0xdf24b8ca, 0x605b953c), - TOBN(0x8bd52afe, 0xc2fffb9f), TOBN(0xbbac5ff7, 0xe19d0b96), - TOBN(0x43c01b87, 0x459afccd), TOBN(0x6bd45143, 0xb7432652), - TOBN(0x84734530, 0x55b5d78e), TOBN(0x81088fdb, 0x1554ba7d), - TOBN(0xada0a52c, 0x1e269375), TOBN(0xf9f037c4, 0x2dc5ec10), - TOBN(0xc0660607, 0x94bfbc11), TOBN(0xc0a630bb, 0xc9c40d2f), - TOBN(0x5efc797e, 0xab64c31e), TOBN(0xffdb1dab, 0x74507144), - TOBN(0xf6124287, 0x1ca6790c), TOBN(0xe9609d81, 0xe69bf1bf), - TOBN(0xdb898595, 0x00d24fc9), TOBN(0x9c750333, 0xe51fb417), - TOBN(0x51830a91, 0xfef7bbde), TOBN(0x0ce67dc8, 0x945f585c), - TOBN(0x9a730ed4, 0x4763eb50), TOBN(0x24a0e221, 0xc1ab0d66), - TOBN(0x643b6393, 0x648748f3), TOBN(0x1982daa1, 0x6d3c6291), - TOBN(0x6f00a9f7, 0x8bbc5549), TOBN(0x7a1783e1, 0x7f36384e), - TOBN(0xe8346323, 0xde977f50), TOBN(0x91ab688d, 0xb245502a), - TOBN(0x331ab6b5, 0x6d0bdd66), TOBN(0x0a6ef32e, 0x64b71229), - TOBN(0x1028150e, 0xfe7c352f), TOBN(0x27e04350, 0xce7b39d3), - TOBN(0x2a3c8acd, 0xc1070c82), TOBN(0xfb2034d3, 0x80c9feef), - TOBN(0x2d729621, 0x709f3729), TOBN(0x8df290bf, 0x62cb4549), - TOBN(0x02f99f33, 0xfc2e4326), TOBN(0x3b30076d, 0x5eddf032), - TOBN(0xbb21f8cf, 0x0c652fb5), TOBN(0x314fb49e, 0xed91cf7b), - TOBN(0xa013eca5, 0x2f700750), TOBN(0x2b9e3c23, 0x712a4575), - TOBN(0xe5355557, 0xaf30fbb0), TOBN(0x1ada3516, 0x7c77e771), - TOBN(0x45f6ecb2, 0x7b135670), TOBN(0xe85d19df, 0x7cfc202e), - TOBN(0x0f1b50c7, 0x58d1be9f), TOBN(0x5ebf2c0a, 0xead2e344), - TOBN(0x1531fe4e, 0xabc199c9), TOBN(0xc7032592, 0x56bab0ae), - TOBN(0x16ab2e48, 0x6c1fec54), TOBN(0x0f87fda8, 0x04280188), - TOBN(0xdc9f46fc, 0x609e4a74), TOBN(0x2a44a143, 0xba667f91), - TOBN(0xbc3d8b95, 0xb4d83436), TOBN(0xa01e4bd0, 0xc7bd2958), - TOBN(0x7b182932, 0x73483c90), TOBN(0xa79c6aa1, 0xa7c7b598), - TOBN(0xbf3983c6, 0xeaaac07e), TOBN(0x8f18181e, 0x96e0d4e6), - TOBN(0x8553d37c, 0x051af62b), TOBN(0xe9a998eb, 0x0bf94496), - TOBN(0xe0844f9f, 0xb0d59aa1), TOBN(0x983fd558, 0xe6afb813), - TOBN(0x9670c0ca, 0x65d69804), TOBN(0x732b22de, 0x6ea5ff2d), - TOBN(0xd7640ba9, 0x5fd8623b), TOBN(0x9f619163, 0xa6351782), - TOBN(0x0bfc27ee, 0xacee5043), TOBN(0xae419e73, 0x2eb10f02), - TOBN(0x19c028d1, 0x8943fb05), TOBN(0x71f01cf7, 0xff13aa2a), - TOBN(0x7790737e, 0x8887a132), TOBN(0x67513309, 0x66318410), - TOBN(0x9819e8a3, 0x7ddb795e), TOBN(0xfecb8ef5, 0xdad100b2), - TOBN(0x59f74a22, 0x3021926a), TOBN(0xb7c28a49, 0x6f9b4c1c), - TOBN(0xed1a733f, 0x912ad0ab), TOBN(0x42a910af, 0x01a5659c), - TOBN(0x3842c6e0, 0x7bd68cab), TOBN(0x2b57fa38, 0x76d70ac8), - TOBN(0x8a6707a8, 0x3c53aaeb), TOBN(0x62c1c510, 0x65b4db18), - TOBN(0x8de2c1fb, 0xb2d09dc7), TOBN(0xc3dfed12, 0x266bd23b), - TOBN(0x927d039b, 0xd5b27db6), TOBN(0x2fb2f0f1, 0x103243da), - TOBN(0xf855a07b, 0x80be7399), TOBN(0xed9327ce, 0x1f9f27a8), - TOBN(0xa0bd99c7, 0x729bdef7), TOBN(0x2b67125e, 0x28250d88), - TOBN(0x784b26e8, 0x8670ced7), TOBN(0xe3dfe41f, 0xc31bd3b4), - TOBN(0x9e353a06, 0xbcc85cbc), TOBN(0x302e2909, 0x60178a9d), - TOBN(0x860abf11, 0xa6eac16e), TOBN(0x76447000, 0xaa2b3aac), - TOBN(0x46ff9d19, 0x850afdab), TOBN(0x35bdd6a5, 0xfdb2d4c1), - TOBN(0xe82594b0, 0x7e5c9ce9), TOBN(0x0f379e53, 0x20af346e), - TOBN(0x608b31e3, 0xbc65ad4a), TOBN(0x710c6b12, 0x267c4826), - TOBN(0x51c966f9, 0x71954cf1), TOBN(0xb1cec793, 0x0d0aa215), - TOBN(0x1f155989, 0x86bd23a8), TOBN(0xae2ff99c, 0xf9452e86), - TOBN(0xd8dd953c, 0x340ceaa2), TOBN(0x26355275, 0x2e2e9333), - TOBN(0x15d4e5f9, 0x8586f06d), TOBN(0xd6bf94a8, 0xf7cab546), - TOBN(0x33c59a0a, 0xb76a9af0), TOBN(0x52740ab3, 0xba095af7), - TOBN(0xc444de8a, 0x24389ca0), TOBN(0xcc6f9863, 0x706da0cb), - TOBN(0xb5a741a7, 0x6b2515cf), TOBN(0x71c41601, 0x9585c749), - TOBN(0x78350d4f, 0xe683de97), TOBN(0x31d61524, 0x63d0b5f5), - TOBN(0x7a0cc5e1, 0xfbce090b), TOBN(0xaac927ed, 0xfbcb2a5b), - TOBN(0xe920de49, 0x20d84c35), TOBN(0x8c06a0b6, 0x22b4de26), - TOBN(0xd34dd58b, 0xafe7ddf3), TOBN(0x55851fed, 0xc1e6e55b), - TOBN(0xd1395616, 0x960696e7), TOBN(0x940304b2, 0x5f22705f), - TOBN(0x6f43f861, 0xb0a2a860), TOBN(0xcf121282, 0x0e7cc981), - TOBN(0x12186212, 0x0ab64a96), TOBN(0x09215b9a, 0xb789383c), - TOBN(0x311eb305, 0x37387c09), TOBN(0xc5832fce, 0xf03ee760), - TOBN(0x30358f58, 0x32f7ea19), TOBN(0xe01d3c34, 0x91d53551), - TOBN(0x1ca5ee41, 0xda48ea80), TOBN(0x34e71e8e, 0xcf4fa4c1), - TOBN(0x312abd25, 0x7af1e1c7), TOBN(0xe3afcdeb, 0x2153f4a5), - TOBN(0x9d5c84d7, 0x00235e9a), TOBN(0x0308d3f4, 0x8c4c836f), - TOBN(0xc0a66b04, 0x89332de5), TOBN(0x610dd399, 0x89e566ef), - TOBN(0xf8eea460, 0xd1ac1635), TOBN(0x84cbb3fb, 0x20a2c0df), - TOBN(0x40afb488, 0xe74a48c5), TOBN(0x29738198, 0xd326b150), - TOBN(0x2a17747f, 0xa6d74081), TOBN(0x60ea4c05, 0x55a26214), - TOBN(0x53514bb4, 0x1f88c5fe), TOBN(0xedd64567, 0x7e83426c), - TOBN(0xd5d6cbec, 0x96460b25), TOBN(0xa12fd0ce, 0x68dc115e), - TOBN(0xc5bc3ed2, 0x697840ea), TOBN(0x969876a8, 0xa6331e31), - TOBN(0x60c36217, 0x472ff580), TOBN(0xf4229705, 0x4ad41393), - TOBN(0x4bd99ef0, 0xa03b8b92), TOBN(0x501c7317, 0xc144f4f6), - TOBN(0x159009b3, 0x18464945), TOBN(0x6d5e594c, 0x74c5c6be), - TOBN(0x2d587011, 0x321a3660), TOBN(0xd1e184b1, 0x3898d022), - TOBN(0x5ba04752, 0x4c6a7e04), TOBN(0x47fa1e2b, 0x45550b65), - TOBN(0x9419daf0, 0x48c0a9a5), TOBN(0x66362953, 0x7c243236), - TOBN(0xcd0744b1, 0x5cb12a88), TOBN(0x561b6f9a, 0x2b646188), - TOBN(0x599415a5, 0x66c2c0c0), TOBN(0xbe3f0859, 0x0f83f09a), - TOBN(0x9141c5be, 0xb92041b8), TOBN(0x01ae38c7, 0x26477d0d), - TOBN(0xca8b71f3, 0xd12c7a94), TOBN(0xfab5b31f, 0x765c70db), - TOBN(0x76ae7492, 0x487443e9), TOBN(0x8595a310, 0x990d1349), - TOBN(0xf8dbeda8, 0x7d460a37), TOBN(0x7f7ad082, 0x1e45a38f), - TOBN(0xed1d4db6, 0x1059705a), TOBN(0xa3dd492a, 0xe6b9c697), - TOBN(0x4b92ee3a, 0x6eb38bd5), TOBN(0xbab2609d, 0x67cc0bb7), - TOBN(0x7fc4fe89, 0x6e70ee82), TOBN(0xeff2c56e, 0x13e6b7e3), - TOBN(0x9b18959e, 0x34d26fca), TOBN(0x2517ab66, 0x889d6b45), - TOBN(0xf167b4e0, 0xbdefdd4f), TOBN(0x69958465, 0xf366e401), - TOBN(0x5aa368ab, 0xa73bbec0), TOBN(0x12148709, 0x7b240c21), - TOBN(0x378c3233, 0x18969006), TOBN(0xcb4d73ce, 0xe1fe53d1), - TOBN(0x5f50a80e, 0x130c4361), TOBN(0xd67f5951, 0x7ef5212b), - TOBN(0xf145e21e, 0x9e70c72e), TOBN(0xb2e52e29, 0x5566d2fb), - TOBN(0x44eaba4a, 0x032397f5), TOBN(0x5e56937b, 0x7e31a7de), - TOBN(0x68dcf517, 0x456c61e1), TOBN(0xbc2e954a, 0xa8b0a388), - TOBN(0xe3552fa7, 0x60a8b755), TOBN(0x03442dae, 0x73ad0cde), - TOBN(0x37ffe747, 0xceb26210), TOBN(0x983545e8, 0x787baef9), - TOBN(0x8b8c8535, 0x86a3de31), TOBN(0xc621dbcb, 0xfacd46db), - TOBN(0x82e442e9, 0x59266fbb), TOBN(0xa3514c37, 0x339d471c), - TOBN(0x3a11b771, 0x62cdad96), TOBN(0xf0cb3b3c, 0xecf9bdf0), - TOBN(0x3fcbdbce, 0x478e2135), TOBN(0x7547b5cf, 0xbda35342), - TOBN(0xa97e81f1, 0x8a677af6), TOBN(0xc8c2bf83, 0x28817987), - TOBN(0xdf07eaaf, 0x45580985), TOBN(0xc68d1f05, 0xc93b45cb), - TOBN(0x106aa2fe, 0xc77b4cac), TOBN(0x4c1d8afc, 0x04a7ae86), - TOBN(0xdb41c3fd, 0x9eb45ab2), TOBN(0x5b234b5b, 0xd4b22e74), - TOBN(0xda253dec, 0xf215958a), TOBN(0x67e0606e, 0xa04edfa0), - TOBN(0xabbbf070, 0xef751b11), TOBN(0xf352f175, 0xf6f06dce), - TOBN(0xdfc4b6af, 0x6839f6b4), TOBN(0x53ddf9a8, 0x9959848e), - TOBN(0xda49c379, 0xc21520b0), TOBN(0x90864ff0, 0xdbd5d1b6), - TOBN(0x2f055d23, 0x5f49c7f7), TOBN(0xe51e4e6a, 0xa796b2d8), - TOBN(0xc361a67f, 0x5c9dc340), TOBN(0x5ad53c37, 0xbca7c620), - TOBN(0xda1d6588, 0x32c756d0), TOBN(0xad60d911, 0x8bb67e13), - TOBN(0xd6c47bdf, 0x0eeec8c6), TOBN(0x4a27fec1, 0x078a1821), - TOBN(0x081f7415, 0xc3099524), TOBN(0x8effdf0b, 0x82cd8060), - TOBN(0xdb70ec1c, 0x65842df8), TOBN(0x8821b358, 0xd319a901), - TOBN(0x72ee56ee, 0xde42b529), TOBN(0x5bb39592, 0x236e4286), - TOBN(0xd1183316, 0xfd6f7140), TOBN(0xf9fadb5b, 0xbd8e81f7), - TOBN(0x701d5e0c, 0x5a02d962), TOBN(0xfdee4dbf, 0x1b601324), - TOBN(0xbed17407, 0x35d7620e), TOBN(0x04e3c2c3, 0xf48c0012), - TOBN(0x9ee29da7, 0x3455449a), TOBN(0x562cdef4, 0x91a836c4), - TOBN(0x8f682a5f, 0x47701097), TOBN(0x617125d8, 0xff88d0c2), - TOBN(0x948fda24, 0x57bb86dd), TOBN(0x348abb8f, 0x289f7286), - TOBN(0xeb10eab5, 0x99d94bbd), TOBN(0xd51ba28e, 0x4684d160), - TOBN(0xabe0e51c, 0x30c8f41a), TOBN(0x66588b45, 0x13254f4a), - TOBN(0x147ebf01, 0xfad097a5), TOBN(0x49883ea8, 0x610e815d), - TOBN(0xe44d60ba, 0x8a11de56), TOBN(0xa970de6e, 0x827a7a6d), - TOBN(0x2be41424, 0x5e17fc19), TOBN(0xd833c657, 0x01214057), - TOBN(0x1375813b, 0x363e723f), TOBN(0x6820bb88, 0xe6a52e9b), - TOBN(0x7e7f6970, 0xd875d56a), TOBN(0xd6a0a9ac, 0x51fbf6bf), - TOBN(0x54ba8790, 0xa3083c12), TOBN(0xebaeb23d, 0x6ae7eb64), - TOBN(0xa8685c3a, 0xb99a907a), TOBN(0xf1e74550, 0x026bf40b), - TOBN(0x7b73a027, 0xc802cd9e), TOBN(0x9a8a927c, 0x4fef4635), - TOBN(0xe1b6f60c, 0x08191224), TOBN(0xc4126ebb, 0xde4ec091), - TOBN(0xe1dff4dc, 0x4ae38d84), TOBN(0xde3f57db, 0x4f2ef985), - TOBN(0x34964337, 0xd446a1dd), TOBN(0x7bf217a0, 0x859e77f6), - TOBN(0x8ff10527, 0x8e1d13f5), TOBN(0xa304ef03, 0x74eeae27), - TOBN(0xfc6f5e47, 0xd19dfa5a), TOBN(0xdb007de3, 0x7fad982b), - TOBN(0x28205ad1, 0x613715f5), TOBN(0x251e6729, 0x7889529e), - TOBN(0x72705184, 0x1ae98e78), TOBN(0xf818537d, 0x271cac32), - TOBN(0xc8a15b7e, 0xb7f410f5), TOBN(0xc474356f, 0x81f62393), - TOBN(0x92dbdc5a, 0xc242316b), TOBN(0xabe060ac, 0xdbf4aff5), - TOBN(0x6e8c38fe, 0x909a8ec6), TOBN(0x43e514e5, 0x6116cb94), - TOBN(0x2078fa38, 0x07d784f9), TOBN(0x1161a880, 0xf4b5b357), - TOBN(0x5283ce79, 0x13adea3d), TOBN(0x0756c3e6, 0xcc6a910b), - TOBN(0x60bcfe01, 0xaaa79697), TOBN(0x04a73b29, 0x56391db1), - TOBN(0xdd8dad47, 0x189b45a0), TOBN(0xbfac0dd0, 0x48d5b8d9), - TOBN(0x34ab3af5, 0x7d3d2ec2), TOBN(0x6fa2fc2d, 0x207bd3af), - TOBN(0x9ff40092, 0x66550ded), TOBN(0x719b3e87, 0x1fd5b913), - TOBN(0xa573a496, 0x6d17fbc7), TOBN(0x0cd1a70a, 0x73d2b24e), - TOBN(0x34e2c5ca, 0xb2676937), TOBN(0xe7050b06, 0xbf669f21), - TOBN(0xfbe948b6, 0x1ede9046), TOBN(0xa0530051, 0x97662659), - TOBN(0x58cbd4ed, 0xf10124c5), TOBN(0xde2646e4, 0xdd6c06c8), - TOBN(0x332f8108, 0x8cad38c0), TOBN(0x471b7e90, 0x6bd68ae2), - TOBN(0x56ac3fb2, 0x0d8e27a3), TOBN(0xb54660db, 0x136b4b0d), - TOBN(0x123a1e11, 0xa6fd8de4), TOBN(0x44dbffea, 0xa37799ef), - TOBN(0x4540b977, 0xce6ac17c), TOBN(0x495173a8, 0xaf60acef)}, - {TOBN(0x9ebb284d, 0x391c2a82), TOBN(0xbcdd4863, 0x158308e8), - TOBN(0x006f16ec, 0x83f1edca), TOBN(0xa13e2c37, 0x695dc6c8), - TOBN(0x2ab756f0, 0x4a057a87), TOBN(0xa8765500, 0xa6b48f98), - TOBN(0x4252face, 0x68651c44), TOBN(0xa52b540b, 0xe1765e02), - TOBN(0x4f922fc5, 0x16a0d2bb), TOBN(0x0d5cc16c, 0x1a623499), - TOBN(0x9241cf3a, 0x57c62c8b), TOBN(0x2f5e6961, 0xfd1b667f), - TOBN(0x5c15c70b, 0xf5a01797), TOBN(0x3d20b44d, 0x60956192), - TOBN(0x04911b37, 0x071fdb52), TOBN(0xf648f916, 0x8d6f0f7b), - TOBN(0x6dc1acaf, 0xe60b7cf7), TOBN(0x25860a50, 0x84a9d869), - TOBN(0x56fc6f09, 0xe7ba8ac4), TOBN(0x828c5bd0, 0x6148d29e), - TOBN(0xac6b435e, 0xdc55ae5f), TOBN(0xa527f56c, 0xc0117411), - TOBN(0x94d5045e, 0xfd24342c), TOBN(0x2c4c0a35, 0x70b67c0d), - TOBN(0x027cc8b8, 0xfac61d9a), TOBN(0x7d25e062, 0xe3c6fe8a), - TOBN(0xe08805bf, 0xe5bff503), TOBN(0x13271e6c, 0x6ff632f7), - TOBN(0x55dca6c0, 0x232f76a5), TOBN(0x8957c32d, 0x701ef426), - TOBN(0xee728bcb, 0xa10a5178), TOBN(0x5ea60411, 0xb62c5173), - TOBN(0xfc4e964e, 0xd0b8892b), TOBN(0x9ea17683, 0x9301bb74), - TOBN(0x6265c5ae, 0xfcc48626), TOBN(0xe60cf82e, 0xbb3e9102), - TOBN(0x57adf797, 0xd4df5531), TOBN(0x235b59a1, 0x8deeefe2), - TOBN(0x60adcf58, 0x3f306eb1), TOBN(0x105c2753, 0x3d09492d), - TOBN(0x4090914b, 0xb5def996), TOBN(0x1cb69c83, 0x233dd1e7), - TOBN(0xc1e9c1d3, 0x9b3d5e76), TOBN(0x1f3338ed, 0xfccf6012), - TOBN(0xb1e95d0d, 0x2f5378a8), TOBN(0xacf4c2c7, 0x2f00cd21), - TOBN(0x6e984240, 0xeb5fe290), TOBN(0xd66c038d, 0x248088ae), - TOBN(0x804d264a, 0xf94d70cf), TOBN(0xbdb802ef, 0x7314bf7e), - TOBN(0x8fb54de2, 0x4333ed02), TOBN(0x740461e0, 0x285635d9), - TOBN(0x4113b2c8, 0x365e9383), TOBN(0xea762c83, 0x3fdef652), - TOBN(0x4eec6e2e, 0x47b956c1), TOBN(0xa3d814be, 0x65620fa4), - TOBN(0x9ad5462b, 0xb4d8bc50), TOBN(0x181c0b16, 0xa9195770), - TOBN(0xebd4fe1c, 0x78412a68), TOBN(0xae0341bc, 0xc0dff48c), - TOBN(0xb6bc45cf, 0x7003e866), TOBN(0xf11a6dea, 0x8a24a41b), - TOBN(0x5407151a, 0xd04c24c2), TOBN(0x62c9d27d, 0xda5b7b68), - TOBN(0x2e964235, 0x88cceff6), TOBN(0x8594c54f, 0x8b07ed69), - TOBN(0x1578e73c, 0xc84d0d0d), TOBN(0x7b4e1055, 0xff532868), - TOBN(0xa348c0d5, 0xb5ec995a), TOBN(0xbf4b9d55, 0x14289a54), - TOBN(0x9ba155a6, 0x58fbd777), TOBN(0x186ed7a8, 0x1a84491d), - TOBN(0xd4992b30, 0x614c0900), TOBN(0xda98d121, 0xbd00c24b), - TOBN(0x7f534dc8, 0x7ec4bfa1), TOBN(0x4a5ff674, 0x37dc34bc), - TOBN(0x68c196b8, 0x1d7ea1d7), TOBN(0x38cf2893, 0x80a6d208), - TOBN(0xfd56cd09, 0xe3cbbd6e), TOBN(0xec72e27e, 0x4205a5b6), - TOBN(0x15ea68f5, 0xa44f77f7), TOBN(0x7aa5f9fd, 0xb43c52bc), - TOBN(0x86ff676f, 0x94f0e609), TOBN(0xa4cde963, 0x2e2d432b), - TOBN(0x8cafa0c0, 0xeee470af), TOBN(0x84137d0e, 0x8a3f5ec8), - TOBN(0xebb40411, 0xfaa31231), TOBN(0xa239c13f, 0x6f7f7ccf), - TOBN(0x32865719, 0xa8afd30b), TOBN(0x86798328, 0x8a826dce), - TOBN(0xdf04e891, 0xc4a8fbe0), TOBN(0xbb6b6e1b, 0xebf56ad3), - TOBN(0x0a695b11, 0x471f1ff0), TOBN(0xd76c3389, 0xbe15baf0), - TOBN(0x018edb95, 0xbe96c43e), TOBN(0xf2beaaf4, 0x90794158), - TOBN(0x152db09e, 0xc3076a27), TOBN(0x5e82908e, 0xe416545d), - TOBN(0xa2c41272, 0x356d6f2e), TOBN(0xdc9c9642, 0x31fd74e1), - TOBN(0x66ceb88d, 0x519bf615), TOBN(0xe29ecd76, 0x05a2274e), - TOBN(0x3a0473c4, 0xbf5e2fa0), TOBN(0x6b6eb671, 0x64284e67), - TOBN(0xe8b97932, 0xb88756dd), TOBN(0xed4e8652, 0xf17e3e61), - TOBN(0xc2dd1499, 0x3ee1c4a4), TOBN(0xc0aaee17, 0x597f8c0e), - TOBN(0x15c4edb9, 0x6c168af3), TOBN(0x6563c7bf, 0xb39ae875), - TOBN(0xadfadb6f, 0x20adb436), TOBN(0xad55e8c9, 0x9a042ac0), - TOBN(0x975a1ed8, 0xb76da1f5), TOBN(0x10dfa466, 0xa58acb94), - TOBN(0x8dd7f7e3, 0xac060282), TOBN(0x6813e66a, 0x572a051e), - TOBN(0xb4ccae1e, 0x350cb901), TOBN(0xb653d656, 0x50cb7822), - TOBN(0x42484710, 0xdfab3b87), TOBN(0xcd7ee537, 0x9b670fd0), - TOBN(0x0a50b12e, 0x523b8bf6), TOBN(0x8009eb5b, 0x8f910c1b), - TOBN(0xf535af82, 0x4a167588), TOBN(0x0f835f9c, 0xfb2a2abd), - TOBN(0xf59b2931, 0x2afceb62), TOBN(0xc797df2a, 0x169d383f), - TOBN(0xeb3f5fb0, 0x66ac02b0), TOBN(0x029d4c6f, 0xdaa2d0ca), - TOBN(0xd4059bc1, 0xafab4bc5), TOBN(0x833f5c6f, 0x56783247), - TOBN(0xb5346630, 0x8d2d3605), TOBN(0x83387891, 0xd34d8433), - TOBN(0xd973b30f, 0xadd9419a), TOBN(0xbcca1099, 0xafe3fce8), - TOBN(0x08178315, 0x0809aac6), TOBN(0x01b7f21a, 0x540f0f11), - TOBN(0x65c29219, 0x909523c8), TOBN(0xa62f648f, 0xa3a1c741), - TOBN(0x88598d4f, 0x60c9e55a), TOBN(0xbce9141b, 0x0e4f347a), - TOBN(0x9af97d84, 0x35f9b988), TOBN(0x0210da62, 0x320475b6), - TOBN(0x3c076e22, 0x9191476c), TOBN(0x7520dbd9, 0x44fc7834), - TOBN(0x6a6b2cfe, 0xc1ab1bbd), TOBN(0xef8a65be, 0xdc650938), - TOBN(0x72855540, 0x805d7bc4), TOBN(0xda389396, 0xed11fdfd), - TOBN(0xa9d5bd36, 0x74660876), TOBN(0x11d67c54, 0xb45dff35), - TOBN(0x6af7d148, 0xa4f5da94), TOBN(0xbb8d4c3f, 0xc0bbeb31), - TOBN(0x87a7ebd1, 0xe0a1b12a), TOBN(0x1e4ef88d, 0x770ba95f), - TOBN(0x8c33345c, 0xdc2ae9cb), TOBN(0xcecf1276, 0x01cc8403), - TOBN(0x687c012e, 0x1b39b80f), TOBN(0xfd90d0ad, 0x35c33ba4), - TOBN(0xa3ef5a67, 0x5c9661c2), TOBN(0x368fc88e, 0xe017429e), - TOBN(0xd30c6761, 0x196a2fa2), TOBN(0x931b9817, 0xbd5b312e), - TOBN(0xba01000c, 0x72f54a31), TOBN(0xa203d2c8, 0x66eaa541), - TOBN(0xf2abdee0, 0x98939db3), TOBN(0xe37d6c2c, 0x3e606c02), - TOBN(0xf2921574, 0x521ff643), TOBN(0x2781b3c4, 0xd7e2fca3), - TOBN(0x664300b0, 0x7850ec06), TOBN(0xac5a38b9, 0x7d3a10cf), - TOBN(0x9233188d, 0xe34ab39d), TOBN(0xe77057e4, 0x5072cbb9), - TOBN(0xbcf0c042, 0xb59e78df), TOBN(0x4cfc91e8, 0x1d97de52), - TOBN(0x4661a26c, 0x3ee0ca4a), TOBN(0x5620a4c1, 0xfb8507bc), - TOBN(0x4b44d4aa, 0x049f842c), TOBN(0xceabc5d5, 0x1540e82b), - TOBN(0x306710fd, 0x15c6f156), TOBN(0xbe5ae52b, 0x63db1d72), - TOBN(0x06f1e7e6, 0x334957f1), TOBN(0x57e388f0, 0x31144a70), - TOBN(0xfb69bb2f, 0xdf96447b), TOBN(0x0f78ebd3, 0x73e38a12), - TOBN(0xb8222605, 0x2b7ce542), TOBN(0xe6d4ce99, 0x7472bde1), - TOBN(0x53e16ebe, 0x09d2f4da), TOBN(0x180ff42e, 0x53b92b2e), - TOBN(0xc59bcc02, 0x2c34a1c6), TOBN(0x3803d6f9, 0x422c46c2), - TOBN(0x18aff74f, 0x5c14a8a2), TOBN(0x55aebf80, 0x10a08b28), - TOBN(0x66097d58, 0x7135593f), TOBN(0x32e6eff7, 0x2be570cd), - TOBN(0x584e6a10, 0x2a8c860d), TOBN(0xcd185890, 0xa2eb4163), - TOBN(0x7ceae99d, 0x6d97e134), TOBN(0xd42c6b70, 0xdd8447ce), - TOBN(0x59ddbb4a, 0xb8c50273), TOBN(0x03c612df, 0x3cf34e1e), - TOBN(0x84b9ca15, 0x04b6c5a0), TOBN(0x35216f39, 0x18f0e3a3), - TOBN(0x3ec2d2bc, 0xbd986c00), TOBN(0x8bf546d9, 0xd19228fe), - TOBN(0xd1c655a4, 0x4cd623c3), TOBN(0x366ce718, 0x502b8e5a), - TOBN(0x2cfc84b4, 0xeea0bfe7), TOBN(0xe01d5cee, 0xcf443e8e), - TOBN(0x8ec045d9, 0x036520f8), TOBN(0xdfb3c3d1, 0x92d40e98), - TOBN(0x0bac4cce, 0xcc559a04), TOBN(0x35eccae5, 0x240ea6b1), - TOBN(0x180b32db, 0xf8a5a0ac), TOBN(0x547972a5, 0xeb699700), - TOBN(0xa3765801, 0xca26bca0), TOBN(0x57e09d0e, 0xa647f25a), - TOBN(0xb956970e, 0x2fdd23cc), TOBN(0xb80288bc, 0x5682e971), - TOBN(0xe6e6d91e, 0x9ae86ebc), TOBN(0x0564c83f, 0x8c9f1939), - TOBN(0x551932a2, 0x39560368), TOBN(0xe893752b, 0x049c28e2), - TOBN(0x0b03cee5, 0xa6a158c3), TOBN(0xe12d656b, 0x04964263), - TOBN(0x4b47554e, 0x63e3bc1d), TOBN(0xc719b6a2, 0x45044ff7), - TOBN(0x4f24d30a, 0xe48daa07), TOBN(0xa3f37556, 0xc8c1edc3), - TOBN(0x9a47bf76, 0x0700d360), TOBN(0xbb1a1824, 0x822ae4e2), - TOBN(0x22e275a3, 0x89f1fb4c), TOBN(0x72b1aa23, 0x9968c5f5), - TOBN(0xa75feaca, 0xbe063f64), TOBN(0x9b392f43, 0xbce47a09), - TOBN(0xd4241509, 0x1ad07aca), TOBN(0x4b0c591b, 0x8d26cd0f), - TOBN(0x2d42ddfd, 0x92f1169a), TOBN(0x63aeb1ac, 0x4cbf2392), - TOBN(0x1de9e877, 0x0691a2af), TOBN(0xebe79af7, 0xd98021da), - TOBN(0xcfdf2a4e, 0x40e50acf), TOBN(0xf0a98ad7, 0xaf01d665), - TOBN(0xefb640bf, 0x1831be1f), TOBN(0x6fe8bd2f, 0x80e9ada0), - TOBN(0x94c103a1, 0x6cafbc91), TOBN(0x170f8759, 0x8308e08c), - TOBN(0x5de2d2ab, 0x9780ff4f), TOBN(0x666466bc, 0x45b201f2), - TOBN(0x58af2010, 0xf5b343bc), TOBN(0x0f2e400a, 0xf2f142fe), - TOBN(0x3483bfde, 0xa85f4bdf), TOBN(0xf0b1d093, 0x03bfeaa9), - TOBN(0x2ea01b95, 0xc7081603), TOBN(0xe943e4c9, 0x3dba1097), - TOBN(0x47be92ad, 0xb438f3a6), TOBN(0x00bb7742, 0xe5bf6636), - TOBN(0x136b7083, 0x824297b4), TOBN(0x9d0e5580, 0x5584455f), - TOBN(0xab48cedc, 0xf1c7d69e), TOBN(0x53a9e481, 0x2a256e76), - TOBN(0x0402b0e0, 0x65eb2413), TOBN(0xdadbbb84, 0x8fc407a7), - TOBN(0xa65cd5a4, 0x8d7f5492), TOBN(0x21d44293, 0x74bae294), - TOBN(0x66917ce6, 0x3b5f1cc4), TOBN(0x37ae52ea, 0xce872e62), - TOBN(0xbb087b72, 0x2905f244), TOBN(0x12077086, 0x1e6af74f), - TOBN(0x4b644e49, 0x1058edea), TOBN(0x827510e3, 0xb638ca1d), - TOBN(0x8cf2b704, 0x6038591c), TOBN(0xffc8b47a, 0xfe635063), - TOBN(0x3ae220e6, 0x1b4d5e63), TOBN(0xbd864742, 0x9d961b4b), - TOBN(0x610c107e, 0x9bd16bed), TOBN(0x4270352a, 0x1127147b), - TOBN(0x7d17ffe6, 0x64cfc50e), TOBN(0x50dee01a, 0x1e36cb42), - TOBN(0x068a7622, 0x35dc5f9a), TOBN(0x9a08d536, 0xdf53f62c), - TOBN(0x4ed71457, 0x6be5f7de), TOBN(0xd93006f8, 0xc2263c9e), - TOBN(0xe073694c, 0xcacacb36), TOBN(0x2ff7a5b4, 0x3ae118ab), - TOBN(0x3cce53f1, 0xcd871236), TOBN(0xf156a39d, 0xc2aa6d52), - TOBN(0x9cc5f271, 0xb198d76d), TOBN(0xbc615b6f, 0x81383d39), - TOBN(0xa54538e8, 0xde3eee6b), TOBN(0x58c77538, 0xab910d91), - TOBN(0x31e5bdbc, 0x58d278bd), TOBN(0x3cde4adf, 0xb963acae), - TOBN(0xb1881fd2, 0x5302169c), TOBN(0x8ca60fa0, 0xa989ed8b), - TOBN(0xa1999458, 0xff96a0ee), TOBN(0xc1141f03, 0xac6c283d), - TOBN(0x7677408d, 0x6dfafed3), TOBN(0x33a01653, 0x39661588), - TOBN(0x3c9c15ec, 0x0b726fa0), TOBN(0x090cfd93, 0x6c9b56da), - TOBN(0xe34f4bae, 0xa3c40af5), TOBN(0x3469eadb, 0xd21129f1), - TOBN(0xcc51674a, 0x1e207ce8), TOBN(0x1e293b24, 0xc83b1ef9), - TOBN(0x17173d13, 0x1e6c0bb4), TOBN(0x19004695, 0x90776d35), - TOBN(0xe7980e34, 0x6de6f922), TOBN(0x873554cb, 0xf4dd9a22), - TOBN(0x0316c627, 0xcbf18a51), TOBN(0x4d93651b, 0x3032c081), - TOBN(0x207f2771, 0x3946834d), TOBN(0x2c08d7b4, 0x30cdbf80), - TOBN(0x137a4fb4, 0x86df2a61), TOBN(0xa1ed9c07, 0xecf7b4a2), - TOBN(0xb2e460e2, 0x7bd042ff), TOBN(0xb7f5e2fa, 0x5f62f5ec), - TOBN(0x7aa6ec6b, 0xcc2423b7), TOBN(0x75ce0a7f, 0xba63eea7), - TOBN(0x67a45fb1, 0xf250a6e1), TOBN(0x93bc919c, 0xe53cdc9f), - TOBN(0x9271f56f, 0x871942df), TOBN(0x2372ff6f, 0x7859ad66), - TOBN(0x5f4c2b96, 0x33cb1a78), TOBN(0xe3e29101, 0x5838aa83), - TOBN(0xa7ed1611, 0xe4e8110c), TOBN(0x2a2d70d5, 0x330198ce), - TOBN(0xbdf132e8, 0x6720efe0), TOBN(0xe61a8962, 0x66a471bf), - TOBN(0x796d3a85, 0x825808bd), TOBN(0x51dc3cb7, 0x3fd6e902), - TOBN(0x643c768a, 0x916219d1), TOBN(0x36cd7685, 0xa2ad7d32), - TOBN(0xe3db9d05, 0xb22922a4), TOBN(0x6494c87e, 0xdba29660), - TOBN(0xf0ac91df, 0xbcd2ebc7), TOBN(0x4deb57a0, 0x45107f8d), - TOBN(0x42271f59, 0xc3d12a73), TOBN(0x5f71687c, 0xa5c2c51d), - TOBN(0xcb1f50c6, 0x05797bcb), TOBN(0x29ed0ed9, 0xd6d34eb0), - TOBN(0xe5fe5b47, 0x4683c2eb), TOBN(0x4956eeb5, 0x97447c46), - TOBN(0x5b163a43, 0x71207167), TOBN(0x93fa2fed, 0x0248c5ef), - TOBN(0x67930af2, 0x31f63950), TOBN(0xa77797c1, 0x14caa2c9), - TOBN(0x526e80ee, 0x27ac7e62), TOBN(0xe1e6e626, 0x58b28aec), - TOBN(0x636178b0, 0xb3c9fef0), TOBN(0xaf7752e0, 0x6d5f90be), - TOBN(0x94ecaf18, 0xeece51cf), TOBN(0x2864d0ed, 0xca806e1f), - TOBN(0x6de2e383, 0x97c69134), TOBN(0x5a42c316, 0xeb291293), - TOBN(0xc7779219, 0x6a60bae0), TOBN(0xa24de346, 0x6b7599d1), - TOBN(0x49d374aa, 0xb75d4941), TOBN(0x98900586, 0x2d501ff0), - TOBN(0x9f16d40e, 0xeb7974cf), TOBN(0x1033860b, 0xcdd8c115), - TOBN(0xb6c69ac8, 0x2094cec3), TOBN(0x9976fb88, 0x403b770c), - TOBN(0x1dea026c, 0x4859590d), TOBN(0xb6acbb46, 0x8562d1fd), - TOBN(0x7cd6c461, 0x44569d85), TOBN(0xc3190a36, 0x97f0891d), - TOBN(0xc6f53195, 0x48d5a17d), TOBN(0x7d919966, 0xd749abc8), - TOBN(0x65104837, 0xdd1c8a20), TOBN(0x7e5410c8, 0x2f683419), - TOBN(0x958c3ca8, 0xbe94022e), TOBN(0x605c3197, 0x6145dac2), - TOBN(0x3fc07501, 0x01683d54), TOBN(0x1d7127c5, 0x595b1234), - TOBN(0x10b8f87c, 0x9481277f), TOBN(0x677db2a8, 0xe65a1adb), - TOBN(0xec2fccaa, 0xddce3345), TOBN(0x2a6811b7, 0x012a4350), - TOBN(0x96760ff1, 0xac598bdc), TOBN(0x054d652a, 0xd1bf4128), - TOBN(0x0a1151d4, 0x92a21005), TOBN(0xad7f3971, 0x33110fdf), - TOBN(0x8c95928c, 0x1960100f), TOBN(0x6c91c825, 0x7bf03362), - TOBN(0xc8c8b2a2, 0xce309f06), TOBN(0xfdb27b59, 0xca27204b), - TOBN(0xd223eaa5, 0x0848e32e), TOBN(0xb93e4b2e, 0xe7bfaf1e), - TOBN(0xc5308ae6, 0x44aa3ded), TOBN(0x317a666a, 0xc015d573), - TOBN(0xc888ce23, 0x1a979707), TOBN(0xf141c1e6, 0x0d5c4958), - TOBN(0xb53b7de5, 0x61906373), TOBN(0x858dbade, 0xeb999595), - TOBN(0x8cbb47b2, 0xa59e5c36), TOBN(0x660318b3, 0xdcf4e842), - TOBN(0xbd161ccd, 0x12ba4b7a), TOBN(0xf399daab, 0xf8c8282a), - TOBN(0x1587633a, 0xeeb2130d), TOBN(0xa465311a, 0xda38dd7d), - TOBN(0x5f75eec8, 0x64d3779b), TOBN(0x3c5d0476, 0xad64c171), - TOBN(0x87410371, 0x2a914428), TOBN(0x8096a891, 0x90e2fc29), - TOBN(0xd3d2ae9d, 0x23b3ebc2), TOBN(0x90bdd6db, 0xa580cfd6), - TOBN(0x52dbb7f3, 0xc5b01f6c), TOBN(0xe68eded4, 0xe102a2dc), - TOBN(0x17785b77, 0x99eb6df0), TOBN(0x26c3cc51, 0x7386b779), - TOBN(0x345ed988, 0x6417a48e), TOBN(0xe990b4e4, 0x07d6ef31), - TOBN(0x0f456b7e, 0x2586abba), TOBN(0x239ca6a5, 0x59c96e9a), - TOBN(0xe327459c, 0xe2eb4206), TOBN(0x3a4c3313, 0xa002b90a), - TOBN(0x2a114806, 0xf6a3f6fb), TOBN(0xad5cad2f, 0x85c251dd), - TOBN(0x92c1f613, 0xf5a784d3), TOBN(0xec7bfacf, 0x349766d5), - TOBN(0x04b3cd33, 0x3e23cb3b), TOBN(0x3979fe84, 0xc5a64b2d), - TOBN(0x192e2720, 0x7e589106), TOBN(0xa60c43d1, 0xa15b527f), - TOBN(0x2dae9082, 0xbe7cf3a6), TOBN(0xcc86ba92, 0xbc967274), - TOBN(0xf28a2ce8, 0xaea0a8a9), TOBN(0x404ca6d9, 0x6ee988b3), - TOBN(0xfd7e9c5d, 0x005921b8), TOBN(0xf56297f1, 0x44e79bf9), - TOBN(0xa163b460, 0x0d75ddc2), TOBN(0x30b23616, 0xa1f2be87), - TOBN(0x4b070d21, 0xbfe50e2b), TOBN(0x7ef8cfd0, 0xe1bfede1), - TOBN(0xadba0011, 0x2aac4ae0), TOBN(0x2a3e7d01, 0xb9ebd033), - TOBN(0x995277ec, 0xe38d9d1c), TOBN(0xb500249e, 0x9c5d2de3), - TOBN(0x8912b820, 0xf13ca8c9), TOBN(0xc8798114, 0x877793af), - TOBN(0x19e6125d, 0xec3f1dec), TOBN(0x07b1f040, 0x911178da), - TOBN(0xd93ededa, 0x904a6738), TOBN(0x55187a5a, 0x0bebedcd), - TOBN(0xf7d04722, 0xeb329d41), TOBN(0xf449099e, 0xf170b391), - TOBN(0xfd317a69, 0xca99f828), TOBN(0x50c3db2b, 0x34a4976d), - TOBN(0xe9ba7784, 0x3757b392), TOBN(0x326caefd, 0xaa3ca05a), - TOBN(0x78e5293b, 0xf1e593d4), TOBN(0x7842a937, 0x0d98fd13), - TOBN(0xe694bf96, 0x5f96b10d), TOBN(0x373a9df6, 0x06a8cd05), - TOBN(0x997d1e51, 0xe8f0c7fc), TOBN(0x1d019790, 0x63fd972e), - TOBN(0x0064d858, 0x5499fb32), TOBN(0x7b67bad9, 0x77a8aeb7), - TOBN(0x1d3eb977, 0x2d08eec5), TOBN(0x5fc047a6, 0xcbabae1d), - TOBN(0x0577d159, 0xe54a64bb), TOBN(0x8862201b, 0xc43497e4), - TOBN(0xad6b4e28, 0x2ce0608d), TOBN(0x8b687b7d, 0x0b167aac), - TOBN(0x6ed4d367, 0x8b2ecfa9), TOBN(0x24dfe62d, 0xa90c3c38), - TOBN(0xa1862e10, 0x3fe5c42b), TOBN(0x1ca73dca, 0xd5732a9f), - TOBN(0x35f038b7, 0x76bb87ad), TOBN(0x674976ab, 0xf242b81f), - TOBN(0x4f2bde7e, 0xb0fd90cd), TOBN(0x6efc172e, 0xa7fdf092), - TOBN(0x3806b69b, 0x92222f1f), TOBN(0x5a2459ca, 0x6cf7ae70), - TOBN(0x6789f69c, 0xa85217ee), TOBN(0x5f232b5e, 0xe3dc85ac), - TOBN(0x660e3ec5, 0x48e9e516), TOBN(0x124b4e47, 0x3197eb31), - TOBN(0x10a0cb13, 0xaafcca23), TOBN(0x7bd63ba4, 0x8213224f), - TOBN(0xaffad7cc, 0x290a7f4f), TOBN(0x6b409c9e, 0x0286b461), - TOBN(0x58ab809f, 0xffa407af), TOBN(0xc3122eed, 0xc68ac073), - TOBN(0x17bf9e50, 0x4ef24d7e), TOBN(0x5d929794, 0x3e2a5811), - TOBN(0x519bc867, 0x02902e01), TOBN(0x76bba5da, 0x39c8a851), - TOBN(0xe9f9669c, 0xda94951e), TOBN(0x4b6af58d, 0x66b8d418), - TOBN(0xfa321074, 0x17d426a4), TOBN(0xc78e66a9, 0x9dde6027), - TOBN(0x0516c083, 0x4a53b964), TOBN(0xfc659d38, 0xff602330), - TOBN(0x0ab55e5c, 0x58c5c897), TOBN(0x985099b2, 0x838bc5df), - TOBN(0x061d9efc, 0xc52fc238), TOBN(0x712b2728, 0x6ac1da3f), - TOBN(0xfb658149, 0x9283fe08), TOBN(0x4954ac94, 0xb8aaa2f7), - TOBN(0x85c0ada4, 0x7fb2e74f), TOBN(0xee8ba98e, 0xb89926b0), - TOBN(0xe4f9d37d, 0x23d1af5b), TOBN(0x14ccdbf9, 0xba9b015e), - TOBN(0xb674481b, 0x7bfe7178), TOBN(0x4e1debae, 0x65405868), - TOBN(0x061b2821, 0xc48c867d), TOBN(0x69c15b35, 0x513b30ea), - TOBN(0x3b4a1666, 0x36871088), TOBN(0xe5e29f5d, 0x1220b1ff), - TOBN(0x4b82bb35, 0x233d9f4d), TOBN(0x4e076333, 0x18cdc675)}, - {TOBN(0x0d53f5c7, 0xa3e6fced), TOBN(0xe8cbbdd5, 0xf45fbdeb), - TOBN(0xf85c01df, 0x13339a70), TOBN(0x0ff71880, 0x142ceb81), - TOBN(0x4c4e8774, 0xbd70437a), TOBN(0x5fb32891, 0xba0bda6a), - TOBN(0x1cdbebd2, 0xf18bd26e), TOBN(0x2f9526f1, 0x03a9d522), - TOBN(0x40ce3051, 0x92c4d684), TOBN(0x8b04d725, 0x7612efcd), - TOBN(0xb9dcda36, 0x6f9cae20), TOBN(0x0edc4d24, 0xf058856c), - TOBN(0x64f2e6bf, 0x85427900), TOBN(0x3de81295, 0xdc09dfea), - TOBN(0xd41b4487, 0x379bf26c), TOBN(0x50b62c6d, 0x6df135a9), - TOBN(0xd4f8e3b4, 0xc72dfe67), TOBN(0xc416b0f6, 0x90e19fdf), - TOBN(0x18b9098d, 0x4c13bd35), TOBN(0xac11118a, 0x15b8cb9e), - TOBN(0xf598a318, 0xf0062841), TOBN(0xbfe0602f, 0x89f356f4), - TOBN(0x7ae3637e, 0x30177a0c), TOBN(0x34097747, 0x61136537), - TOBN(0x0db2fb5e, 0xd005832a), TOBN(0x5f5efd3b, 0x91042e4f), - TOBN(0x8c4ffdc6, 0xed70f8ca), TOBN(0xe4645d0b, 0xb52da9cc), - TOBN(0x9596f58b, 0xc9001d1f), TOBN(0x52c8f0bc, 0x4e117205), - TOBN(0xfd4aa0d2, 0xe398a084), TOBN(0x815bfe3a, 0x104f49de), - TOBN(0x97e5443f, 0x23885e5f), TOBN(0xf72f8f99, 0xe8433aab), - TOBN(0xbd00b154, 0xe4d4e604), TOBN(0xd0b35e6a, 0xe5e173ff), - TOBN(0x57b2a048, 0x9164722d), TOBN(0x3e3c665b, 0x88761ec8), - TOBN(0x6bdd1397, 0x3da83832), TOBN(0x3c8b1a1e, 0x73dafe3b), - TOBN(0x4497ace6, 0x54317cac), TOBN(0xbe600ab9, 0x521771b3), - TOBN(0xb42e409e, 0xb0dfe8b8), TOBN(0x386a67d7, 0x3942310f), - TOBN(0x25548d8d, 0x4431cc28), TOBN(0xa7cff142, 0x985dc524), - TOBN(0x4d60f5a1, 0x93c4be32), TOBN(0x83ebd5c8, 0xd071c6e1), - TOBN(0xba3a80a7, 0xb1fd2b0b), TOBN(0x9b3ad396, 0x5bec33e8), - TOBN(0xb3868d61, 0x79743fb3), TOBN(0xcfd169fc, 0xfdb462fa), - TOBN(0xd3b499d7, 0x9ce0a6af), TOBN(0x55dc1cf1, 0xe42d3ff8), - TOBN(0x04fb9e6c, 0xc6c3e1b2), TOBN(0x47e6961d, 0x6f69a474), - TOBN(0x54eb3acc, 0xe548b37b), TOBN(0xb38e7542, 0x84d40549), - TOBN(0x8c3daa51, 0x7b341b4f), TOBN(0x2f6928ec, 0x690bf7fa), - TOBN(0x0496b323, 0x86ce6c41), TOBN(0x01be1c55, 0x10adadcd), - TOBN(0xc04e67e7, 0x4bb5faf9), TOBN(0x3cbaf678, 0xe15c9985), - TOBN(0x8cd12145, 0x50ca4247), TOBN(0xba1aa47a, 0xe7dd30aa), - TOBN(0x2f81ddf1, 0xe58fee24), TOBN(0x03452936, 0xeec9b0e8), - TOBN(0x8bdc3b81, 0x243aea96), TOBN(0x9a2919af, 0x15c3d0e5), - TOBN(0x9ea640ec, 0x10948361), TOBN(0x5ac86d5b, 0x6e0bcccf), - TOBN(0xf892d918, 0xc36cf440), TOBN(0xaed3e837, 0xc939719c), - TOBN(0xb07b08d2, 0xc0218b64), TOBN(0x6f1bcbba, 0xce9790dd), - TOBN(0x4a84d6ed, 0x60919b8e), TOBN(0xd8900791, 0x8ac1f9eb), - TOBN(0xf84941aa, 0x0dd5daef), TOBN(0xb22fe40a, 0x67fd62c5), - TOBN(0x97e15ba2, 0x157f2db3), TOBN(0xbda2fc8f, 0x8e28ca9c), - TOBN(0x5d050da4, 0x37b9f454), TOBN(0x3d57eb57, 0x2379d72e), - TOBN(0xe9b5eba2, 0xfb5ee997), TOBN(0x01648ca2, 0xe11538ca), - TOBN(0x32bb76f6, 0xf6327974), TOBN(0x338f14b8, 0xff3f4bb7), - TOBN(0x524d226a, 0xd7ab9a2d), TOBN(0x9c00090d, 0x7dfae958), - TOBN(0x0ba5f539, 0x8751d8c2), TOBN(0x8afcbcdd, 0x3ab8262d), - TOBN(0x57392729, 0xe99d043b), TOBN(0xef51263b, 0xaebc943a), - TOBN(0x9feace93, 0x20862935), TOBN(0x639efc03, 0xb06c817b), - TOBN(0x1fe054b3, 0x66b4be7a), TOBN(0x3f25a9de, 0x84a37a1e), - TOBN(0xf39ef1ad, 0x78d75cd9), TOBN(0xd7b58f49, 0x5062c1b5), - TOBN(0x6f74f9a9, 0xff563436), TOBN(0xf718ff29, 0xe8af51e7), - TOBN(0x5234d313, 0x15e97fec), TOBN(0xb6a8e2b1, 0x292f1c0a), - TOBN(0xa7f53aa8, 0x327720c1), TOBN(0x956ca322, 0xba092cc8), - TOBN(0x8f03d64a, 0x28746c4d), TOBN(0x51fe1782, 0x66d0d392), - TOBN(0xd19b34db, 0x3c832c80), TOBN(0x60dccc5c, 0x6da2e3b4), - TOBN(0x245dd62e, 0x0a104ccc), TOBN(0xa7ab1de1, 0x620b21fd), - TOBN(0xb293ae0b, 0x3893d123), TOBN(0xf7b75783, 0xb15ee71c), - TOBN(0x5aa3c614, 0x42a9468b), TOBN(0xd686123c, 0xdb15d744), - TOBN(0x8c616891, 0xa7ab4116), TOBN(0x6fcd72c8, 0xa4e6a459), - TOBN(0xac219110, 0x77e5fad7), TOBN(0xfb6a20e7, 0x704fa46b), - TOBN(0xe839be7d, 0x341d81dc), TOBN(0xcddb6889, 0x32148379), - TOBN(0xda6211a1, 0xf7026ead), TOBN(0xf3b2575f, 0xf4d1cc5e), - TOBN(0x40cfc8f6, 0xa7a73ae6), TOBN(0x83879a5e, 0x61d5b483), - TOBN(0xc5acb1ed, 0x41a50ebc), TOBN(0x59a60cc8, 0x3c07d8fa), - TOBN(0x1b73bdce, 0xb1876262), TOBN(0x2b0d79f0, 0x12af4ee9), - TOBN(0x8bcf3b0b, 0xd46e1d07), TOBN(0x17d6af9d, 0xe45d152f), - TOBN(0x73520461, 0x6d736451), TOBN(0x43cbbd97, 0x56b0bf5a), - TOBN(0xb0833a5b, 0xd5999b9d), TOBN(0x702614f0, 0xeb72e398), - TOBN(0x0aadf01a, 0x59c3e9f8), TOBN(0x40200e77, 0xce6b3d16), - TOBN(0xda22bdd3, 0xdeddafad), TOBN(0x76dedaf4, 0x310d72e1), - TOBN(0x49ef807c, 0x4bc2e88f), TOBN(0x6ba81291, 0x146dd5a5), - TOBN(0xa1a4077a, 0x7d8d59e9), TOBN(0x87b6a2e7, 0x802db349), - TOBN(0xd5679997, 0x1b4e598e), TOBN(0xf499ef1f, 0x06fe4b1d), - TOBN(0x3978d3ae, 0xfcb267c5), TOBN(0xb582b557, 0x235786d0), - TOBN(0x32b3b2ca, 0x1715cb07), TOBN(0x4c3de6a2, 0x8480241d), - TOBN(0x63b5ffed, 0xcb571ecd), TOBN(0xeaf53900, 0xed2fe9a9), - TOBN(0xdec98d4a, 0xc3b81990), TOBN(0x1cb83722, 0x9e0cc8fe), - TOBN(0xfe0b0491, 0xd2b427b9), TOBN(0x0f2386ac, 0xe983a66c), - TOBN(0x930c4d1e, 0xb3291213), TOBN(0xa2f82b2e, 0x59a62ae4), - TOBN(0x77233853, 0xf93e89e3), TOBN(0x7f8063ac, 0x11777c7f), - TOBN(0xff0eb567, 0x59ad2877), TOBN(0x6f454642, 0x9865c754), - TOBN(0xe6fe701a, 0x236e9a84), TOBN(0xc586ef16, 0x06e40fc3), - TOBN(0x3f62b6e0, 0x24bafad9), TOBN(0xc8b42bd2, 0x64da906a), - TOBN(0xc98e1eb4, 0xda3276a0), TOBN(0x30d0e5fc, 0x06cbf852), - TOBN(0x1b6b2ae1, 0xe8b4dfd4), TOBN(0xd754d5c7, 0x8301cbac), - TOBN(0x66097629, 0x112a39ac), TOBN(0xf86b5999, 0x93ba4ab9), - TOBN(0x26c9dea7, 0x99f9d581), TOBN(0x0473b1a8, 0xc2fafeaa), - TOBN(0x1469af55, 0x3b2505a5), TOBN(0x227d16d7, 0xd6a43323), - TOBN(0x3316f73c, 0xad3d97f9), TOBN(0x52bf3bb5, 0x1f137455), - TOBN(0x953eafeb, 0x09954e7c), TOBN(0xa721dfed, 0xdd732411), - TOBN(0xb4929821, 0x141d4579), TOBN(0x3411321c, 0xaa3bd435), - TOBN(0xafb355aa, 0x17fa6015), TOBN(0xb4e7ef4a, 0x18e42f0e), - TOBN(0x604ac97c, 0x59371000), TOBN(0xe1c48c70, 0x7f759c18), - TOBN(0x3f62ecc5, 0xa5db6b65), TOBN(0x0a78b173, 0x38a21495), - TOBN(0x6be1819d, 0xbcc8ad94), TOBN(0x70dc04f6, 0xd89c3400), - TOBN(0x462557b4, 0xa6b4840a), TOBN(0x544c6ade, 0x60bd21c0), - TOBN(0x6a00f24e, 0x907a544b), TOBN(0xa7520dcb, 0x313da210), - TOBN(0xfe939b75, 0x11e4994b), TOBN(0x918b6ba6, 0xbc275d70), - TOBN(0xd3e5e0fc, 0x644be892), TOBN(0x707a9816, 0xfdaf6c42), - TOBN(0x60145567, 0xf15c13fe), TOBN(0x4818ebaa, 0xe130a54a), - TOBN(0x28aad3ad, 0x58d2f767), TOBN(0xdc5267fd, 0xd7e7c773), - TOBN(0x4919cc88, 0xc3afcc98), TOBN(0xaa2e6ab0, 0x2db8cd4b), - TOBN(0xd46fec04, 0xd0c63eaa), TOBN(0xa1cb92c5, 0x19ffa832), - TOBN(0x678dd178, 0xe43a631f), TOBN(0xfb5ae1cd, 0x3dc788b3), - TOBN(0x68b4fb90, 0x6e77de04), TOBN(0x7992bcf0, 0xf06dbb97), - TOBN(0x896e6a13, 0xc417c01d), TOBN(0x8d96332c, 0xb956be01), - TOBN(0x902fc93a, 0x413aa2b9), TOBN(0x99a4d915, 0xfc98c8a5), - TOBN(0x52c29407, 0x565f1137), TOBN(0x4072690f, 0x21e4f281), - TOBN(0x36e607cf, 0x02ff6072), TOBN(0xa47d2ca9, 0x8ad98cdc), - TOBN(0xbf471d1e, 0xf5f56609), TOBN(0xbcf86623, 0xf264ada0), - TOBN(0xb70c0687, 0xaa9e5cb6), TOBN(0xc98124f2, 0x17401c6c), - TOBN(0x8189635f, 0xd4a61435), TOBN(0xd28fb8af, 0xa9d98ea6), - TOBN(0xb9a67c2a, 0x40c251f8), TOBN(0x88cd5d87, 0xa2da44be), - TOBN(0x437deb96, 0xe09b5423), TOBN(0x150467db, 0x64287dc1), - TOBN(0xe161debb, 0xcdabb839), TOBN(0xa79e9742, 0xf1839a3e), - TOBN(0xbb8dd3c2, 0x652d202b), TOBN(0x7b3e67f7, 0xe9f97d96), - TOBN(0x5aa5d78f, 0xb1cb6ac9), TOBN(0xffa13e8e, 0xca1d0d45), - TOBN(0x369295dd, 0x2ba5bf95), TOBN(0xd68bd1f8, 0x39aff05e), - TOBN(0xaf0d86f9, 0x26d783f2), TOBN(0x543a59b3, 0xfc3aafc1), - TOBN(0x3fcf81d2, 0x7b7da97c), TOBN(0xc990a056, 0xd25dee46), - TOBN(0x3e6775b8, 0x519cce2c), TOBN(0xfc9af71f, 0xae13d863), - TOBN(0x774a4a6f, 0x47c1605c), TOBN(0x46ba4245, 0x2fd205e8), - TOBN(0xa06feea4, 0xd3fd524d), TOBN(0x1e724641, 0x6de1acc2), - TOBN(0xf53816f1, 0x334e2b42), TOBN(0x49e5918e, 0x922f0024), - TOBN(0x439530b6, 0x65c7322d), TOBN(0xcf12cc01, 0xb3c1b3fb), - TOBN(0xc70b0186, 0x0172f685), TOBN(0xb915ee22, 0x1b58391d), - TOBN(0x9afdf03b, 0xa317db24), TOBN(0x87dec659, 0x17b8ffc4), - TOBN(0x7f46597b, 0xe4d3d050), TOBN(0x80a1c1ed, 0x006500e7), - TOBN(0x84902a96, 0x78bf030e), TOBN(0xfb5e9c9a, 0x50560148), - TOBN(0x6dae0a92, 0x63362426), TOBN(0xdcaeecf4, 0xa9e30c40), - TOBN(0xc0d887bb, 0x518d0c6b), TOBN(0x99181152, 0xcb985b9d), - TOBN(0xad186898, 0xef7bc381), TOBN(0x18168ffb, 0x9ee46201), - TOBN(0x9a04cdaa, 0x2502753c), TOBN(0xbb279e26, 0x51407c41), - TOBN(0xeacb03aa, 0xf23564e5), TOBN(0x18336582, 0x71e61016), - TOBN(0x8684b8c4, 0xeb809877), TOBN(0xb336e18d, 0xea0e672e), - TOBN(0xefb601f0, 0x34ee5867), TOBN(0x2733edbe, 0x1341cfd1), - TOBN(0xb15e809a, 0x26025c3c), TOBN(0xe6e981a6, 0x9350df88), - TOBN(0x92376237, 0x8502fd8e), TOBN(0x4791f216, 0x0c12be9b), - TOBN(0xb7256789, 0x25f02425), TOBN(0xec863194, 0x7a974443), - TOBN(0x7c0ce882, 0xfb41cc52), TOBN(0xc266ff7e, 0xf25c07f2), - TOBN(0x3d4da8c3, 0x017025f3), TOBN(0xefcf628c, 0xfb9579b4), - TOBN(0x5c4d0016, 0x1f3716ec), TOBN(0x9c27ebc4, 0x6801116e), - TOBN(0x5eba0ea1, 0x1da1767e), TOBN(0xfe151452, 0x47004c57), - TOBN(0x3ace6df6, 0x8c2373b7), TOBN(0x75c3dffe, 0x5dbc37ac), - TOBN(0x3dc32a73, 0xddc925fc), TOBN(0xb679c841, 0x2f65ee0b), - TOBN(0x715a3295, 0x451cbfeb), TOBN(0xd9889768, 0xf76e9a29), - TOBN(0xec20ce7f, 0xb28ad247), TOBN(0xe99146c4, 0x00894d79), - TOBN(0x71457d7c, 0x9f5e3ea7), TOBN(0x097b2662, 0x38030031), - TOBN(0xdb7f6ae6, 0xcf9f82a8), TOBN(0x319decb9, 0x438f473a), - TOBN(0xa63ab386, 0x283856c3), TOBN(0x13e3172f, 0xb06a361b), - TOBN(0x2959f8dc, 0x7d5a006c), TOBN(0x2dbc27c6, 0x75fba752), - TOBN(0xc1227ab2, 0x87c22c9e), TOBN(0x06f61f75, 0x71a268b2), - TOBN(0x1b6bb971, 0x04779ce2), TOBN(0xaca83812, 0x0aadcb1d), - TOBN(0x297ae0bc, 0xaeaab2d5), TOBN(0xa5c14ee7, 0x5bfb9f13), - TOBN(0xaa00c583, 0xf17a62c7), TOBN(0x39eb962c, 0x173759f6), - TOBN(0x1eeba1d4, 0x86c9a88f), TOBN(0x0ab6c37a, 0xdf016c5e), - TOBN(0xa2a147db, 0xa28a0749), TOBN(0x246c20d6, 0xee519165), - TOBN(0x5068d1b1, 0xd3810715), TOBN(0xb1e7018c, 0x748160b9), - TOBN(0x03f5b1fa, 0xf380ff62), TOBN(0xef7fb1dd, 0xf3cb2c1e), - TOBN(0xeab539a8, 0xfc91a7da), TOBN(0x83ddb707, 0xf3f9b561), - TOBN(0xc550e211, 0xfe7df7a4), TOBN(0xa7cd07f2, 0x063f6f40), - TOBN(0xb0de3635, 0x2976879c), TOBN(0xb5f83f85, 0xe55741da), - TOBN(0x4ea9d25e, 0xf3d8ac3d), TOBN(0x6fe2066f, 0x62819f02), - TOBN(0x4ab2b9c2, 0xcef4a564), TOBN(0x1e155d96, 0x5ffa2de3), - TOBN(0x0eb0a19b, 0xc3a72d00), TOBN(0x4037665b, 0x8513c31b), - TOBN(0x2fb2b6bf, 0x04c64637), TOBN(0x45c34d6e, 0x08cdc639), - TOBN(0x56f1e10f, 0xf01fd796), TOBN(0x4dfb8101, 0xfe3667b8), - TOBN(0xe0eda253, 0x9021d0c0), TOBN(0x7a94e9ff, 0x8a06c6ab), - TOBN(0x2d3bb0d9, 0xbb9aa882), TOBN(0xea20e4e5, 0xec05fd10), - TOBN(0xed7eeb5f, 0x1a1ca64e), TOBN(0x2fa6b43c, 0xc6327cbd), - TOBN(0xb577e3cf, 0x3aa91121), TOBN(0x8c6bd5ea, 0x3a34079b), - TOBN(0xd7e5ba39, 0x60e02fc0), TOBN(0xf16dd2c3, 0x90141bf8), - TOBN(0xb57276d9, 0x80101b98), TOBN(0x760883fd, 0xb82f0f66), - TOBN(0x89d7de75, 0x4bc3eff3), TOBN(0x03b60643, 0x5dc2ab40), - TOBN(0xcd6e53df, 0xe05beeac), TOBN(0xf2f1e862, 0xbc3325cd), - TOBN(0xdd0f7921, 0x774f03c3), TOBN(0x97ca7221, 0x4552cc1b), - TOBN(0x5a0d6afe, 0x1cd19f72), TOBN(0xa20915dc, 0xf183fbeb), - TOBN(0x9fda4b40, 0x832c403c), TOBN(0x32738edd, 0xbe425442), - TOBN(0x469a1df6, 0xb5eccf1a), TOBN(0x4b5aff42, 0x28bbe1f0), - TOBN(0x31359d7f, 0x570dfc93), TOBN(0xa18be235, 0xf0088628), - TOBN(0xa5b30fba, 0xb00ed3a9), TOBN(0x34c61374, 0x73cdf8be), - TOBN(0x2c5c5f46, 0xabc56797), TOBN(0x5cecf93d, 0xb82a8ae2), - TOBN(0x7d3dbe41, 0xa968fbf0), TOBN(0xd23d4583, 0x1a5c7f3d), - TOBN(0xf28f69a0, 0xc087a9c7), TOBN(0xc2d75471, 0x474471ca), - TOBN(0x36ec9f4a, 0x4eb732ec), TOBN(0x6c943bbd, 0xb1ca6bed), - TOBN(0xd64535e1, 0xf2457892), TOBN(0x8b84a8ea, 0xf7e2ac06), - TOBN(0xe0936cd3, 0x2499dd5f), TOBN(0x12053d7e, 0x0ed04e57), - TOBN(0x4bdd0076, 0xe4305d9d), TOBN(0x34a527b9, 0x1f67f0a2), - TOBN(0xe79a4af0, 0x9cec46ea), TOBN(0xb15347a1, 0x658b9bc7), - TOBN(0x6bd2796f, 0x35af2f75), TOBN(0xac957990, 0x4051c435), - TOBN(0x2669dda3, 0xc33a655d), TOBN(0x5d503c2e, 0x88514aa3), - TOBN(0xdfa11337, 0x3753dd41), TOBN(0x3f054673, 0x0b754f78), - TOBN(0xbf185677, 0x496125bd), TOBN(0xfb0023c8, 0x3775006c), - TOBN(0xfa0f072f, 0x3a037899), TOBN(0x4222b6eb, 0x0e4aea57), - TOBN(0x3dde5e76, 0x7866d25a), TOBN(0xb6eb04f8, 0x4837aa6f), - TOBN(0x5315591a, 0x2cf1cdb8), TOBN(0x6dfb4f41, 0x2d4e683c), - TOBN(0x7e923ea4, 0x48ee1f3a), TOBN(0x9604d9f7, 0x05a2afd5), - TOBN(0xbe1d4a33, 0x40ea4948), TOBN(0x5b45f1f4, 0xb44cbd2f), - TOBN(0x5faf8376, 0x4acc757e), TOBN(0xa7cf9ab8, 0x63d68ff7), - TOBN(0x8ad62f69, 0xdf0e404b), TOBN(0xd65f33c2, 0x12bdafdf), - TOBN(0xc365de15, 0xa377b14e), TOBN(0x6bf5463b, 0x8e39f60c), - TOBN(0x62030d2d, 0x2ce68148), TOBN(0xd95867ef, 0xe6f843a8), - TOBN(0xd39a0244, 0xef5ab017), TOBN(0x0bd2d8c1, 0x4ab55d12), - TOBN(0xc9503db3, 0x41639169), TOBN(0x2d4e25b0, 0xf7660c8a), - TOBN(0x760cb3b5, 0xe224c5d7), TOBN(0xfa3baf8c, 0x68616919), - TOBN(0x9fbca113, 0x8d142552), TOBN(0x1ab18bf1, 0x7669ebf5), - TOBN(0x55e6f53e, 0x9bdf25dd), TOBN(0x04cc0bf3, 0xcb6cd154), - TOBN(0x595bef49, 0x95e89080), TOBN(0xfe9459a8, 0x104a9ac1), - TOBN(0xad2d89ca, 0xcce9bb32), TOBN(0xddea65e1, 0xf7de8285), - TOBN(0x62ed8c35, 0xb351bd4b), TOBN(0x4150ff36, 0x0c0e19a7), - TOBN(0x86e3c801, 0x345f4e47), TOBN(0x3bf21f71, 0x203a266c), - TOBN(0x7ae110d4, 0x855b1f13), TOBN(0x5d6aaf6a, 0x07262517), - TOBN(0x1e0f12e1, 0x813d28f1), TOBN(0x6000e11d, 0x7ad7a523), - TOBN(0xc7d8deef, 0xc744a17b), TOBN(0x1e990b48, 0x14c05a00), - TOBN(0x68fddaee, 0x93e976d5), TOBN(0x696241d1, 0x46610d63), - TOBN(0xb204e7c3, 0x893dda88), TOBN(0x8bccfa65, 0x6a3a6946), - TOBN(0xb59425b4, 0xc5cd1411), TOBN(0x701b4042, 0xff3658b1), - TOBN(0xe3e56bca, 0x4784cf93), TOBN(0x27de5f15, 0x8fe68d60), - TOBN(0x4ab9cfce, 0xf8d53f19), TOBN(0xddb10311, 0xa40a730d), - TOBN(0x6fa73cd1, 0x4eee0a8a), TOBN(0xfd548748, 0x5249719d), - TOBN(0x49d66316, 0xa8123ef0), TOBN(0x73c32db4, 0xe7f95438), - TOBN(0x2e2ed209, 0x0d9e7854), TOBN(0xf98a9329, 0x9d9f0507), - TOBN(0xc5d33cf6, 0x0c6aa20a), TOBN(0x9a32ba14, 0x75279bb2), - TOBN(0x7e3202cb, 0x774a7307), TOBN(0x64ed4bc4, 0xe8c42dbd), - TOBN(0xc20f1a06, 0xd4caed0d), TOBN(0xb8021407, 0x171d22b3), - TOBN(0xd426ca04, 0xd13268d7), TOBN(0x92377007, 0x25f4d126), - TOBN(0x4204cbc3, 0x71f21a85), TOBN(0x18461b7a, 0xf82369ba), - TOBN(0xc0c07d31, 0x3fc858f9), TOBN(0x5deb5a50, 0xe2bab569), - TOBN(0xd5959d46, 0xd5eea89e), TOBN(0xfdff8424, 0x08437f4b), - TOBN(0xf21071e4, 0x3cfe254f), TOBN(0x72417696, 0x95468321), - TOBN(0x5d8288b9, 0x102cae3e), TOBN(0x2d143e3d, 0xf1965dff), - TOBN(0x00c9a376, 0xa078d847), TOBN(0x6fc0da31, 0x26028731), - TOBN(0xa2baeadf, 0xe45083a2), TOBN(0x66bc7218, 0x5e5b4bcd), - TOBN(0x2c826442, 0xd04b8e7f), TOBN(0xc19f5451, 0x6c4b586b), - TOBN(0x60182c49, 0x5b7eeed5), TOBN(0xd9954ecd, 0x7aa9dfa1), - TOBN(0xa403a8ec, 0xc73884ad), TOBN(0x7fb17de2, 0x9bb39041), - TOBN(0x694b64c5, 0xabb020e8), TOBN(0x3d18c184, 0x19c4eec7), - TOBN(0x9c4673ef, 0x1c4793e5), TOBN(0xc7b8aeb5, 0x056092e6), - TOBN(0x3aa1ca43, 0xf0f8c16b), TOBN(0x224ed5ec, 0xd679b2f6), - TOBN(0x0d56eeaf, 0x55a205c9), TOBN(0xbfe115ba, 0x4b8e028b), - TOBN(0x97e60849, 0x3927f4fe), TOBN(0xf91fbf94, 0x759aa7c5), - TOBN(0x985af769, 0x6be90a51), TOBN(0xc1277b78, 0x78ccb823), - TOBN(0x395b656e, 0xe7a75952), TOBN(0x00df7de0, 0x928da5f5), - TOBN(0x09c23175, 0x4ca4454f), TOBN(0x4ec971f4, 0x7aa2d3c1), - TOBN(0x45c3c507, 0xe75d9ccc), TOBN(0x63b7be8a, 0x3dc90306), - TOBN(0x37e09c66, 0x5db44bdc), TOBN(0x50d60da1, 0x6841c6a2), - TOBN(0x6f9b65ee, 0x08df1b12), TOBN(0x38734879, 0x7ff089df), - TOBN(0x9c331a66, 0x3fe8013d), TOBN(0x017f5de9, 0x5f42fcc8), - TOBN(0x43077866, 0xe8e57567), TOBN(0xc9f781ce, 0xf9fcdb18), - TOBN(0x38131dda, 0x9b12e174), TOBN(0x25d84aa3, 0x8a03752a), - TOBN(0x45e09e09, 0x4d0c0ce2), TOBN(0x1564008b, 0x92bebba5), - TOBN(0xf7e8ad31, 0xa87284c7), TOBN(0xb7c4b46c, 0x97e7bbaa), - TOBN(0x3e22a7b3, 0x97acf4ec), TOBN(0x0426c400, 0x5ea8b640), - TOBN(0x5e3295a6, 0x4e969285), TOBN(0x22aabc59, 0xa6a45670), - TOBN(0xb929714c, 0x5f5942bc), TOBN(0x9a6168bd, 0xfa3182ed), - TOBN(0x2216a665, 0x104152ba), TOBN(0x46908d03, 0xb6926368)}, - {TOBN(0xa9f5d874, 0x5a1251fb), TOBN(0x967747a8, 0xc72725c7), - TOBN(0x195c33e5, 0x31ffe89e), TOBN(0x609d210f, 0xe964935e), - TOBN(0xcafd6ca8, 0x2fe12227), TOBN(0xaf9b5b96, 0x0426469d), - TOBN(0x2e9ee04c, 0x5693183c), TOBN(0x1084a333, 0xc8146fef), - TOBN(0x96649933, 0xaed1d1f7), TOBN(0x566eaff3, 0x50563090), - TOBN(0x345057f0, 0xad2e39cf), TOBN(0x148ff65b, 0x1f832124), - TOBN(0x042e89d4, 0xcf94cf0d), TOBN(0x319bec84, 0x520c58b3), - TOBN(0x2a267626, 0x5361aa0d), TOBN(0xc86fa302, 0x8fbc87ad), - TOBN(0xfc83d2ab, 0x5c8b06d5), TOBN(0xb1a785a2, 0xfe4eac46), - TOBN(0xb99315bc, 0x846f7779), TOBN(0xcf31d816, 0xef9ea505), - TOBN(0x2391fe6a, 0x15d7dc85), TOBN(0x2f132b04, 0xb4016b33), - TOBN(0x29547fe3, 0x181cb4c7), TOBN(0xdb66d8a6, 0x650155a1), - TOBN(0x6b66d7e1, 0xadc1696f), TOBN(0x98ebe593, 0x0acd72d0), - TOBN(0x65f24550, 0xcc1b7435), TOBN(0xce231393, 0xb4b9a5ec), - TOBN(0x234a22d4, 0xdb067df9), TOBN(0x98dda095, 0xcaff9b00), - TOBN(0x1bbc75a0, 0x6100c9c1), TOBN(0x1560a9c8, 0x939cf695), - TOBN(0xcf006d3e, 0x99e0925f), TOBN(0x2dd74a96, 0x6322375a), - TOBN(0xc58b446a, 0xb56af5ba), TOBN(0x50292683, 0xe0b9b4f1), - TOBN(0xe2c34cb4, 0x1aeaffa3), TOBN(0x8b17203f, 0x9b9587c1), - TOBN(0x6d559207, 0xead1350c), TOBN(0x2b66a215, 0xfb7f9604), - TOBN(0x0850325e, 0xfe51bf74), TOBN(0x9c4f579e, 0x5e460094), - TOBN(0x5c87b92a, 0x76da2f25), TOBN(0x889de4e0, 0x6febef33), - TOBN(0x6900ec06, 0x646083ce), TOBN(0xbe2a0335, 0xbfe12773), - TOBN(0xadd1da35, 0xc5344110), TOBN(0x757568b7, 0xb802cd20), - TOBN(0x75559779, 0x00f7e6c8), TOBN(0x38e8b94f, 0x0facd2f0), - TOBN(0xfea1f3af, 0x03fde375), TOBN(0x5e11a1d8, 0x75881dfc), - TOBN(0xb3a6b02e, 0xc1e2f2ef), TOBN(0x193d2bbb, 0xc605a6c5), - TOBN(0x325ffeee, 0x339a0b2d), TOBN(0x27b6a724, 0x9e0c8846), - TOBN(0xe4050f1c, 0xf1c367ca), TOBN(0x9bc85a9b, 0xc90fbc7d), - TOBN(0xa373c4a2, 0xe1a11032), TOBN(0xb64232b7, 0xad0393a9), - TOBN(0xf5577eb0, 0x167dad29), TOBN(0x1604f301, 0x94b78ab2), - TOBN(0x0baa94af, 0xe829348b), TOBN(0x77fbd8dd, 0x41654342), - TOBN(0xdab50ea5, 0xb964e39a), TOBN(0xd4c29e3c, 0xd0d3c76e), - TOBN(0x80dae67c, 0x56d11964), TOBN(0x7307a8bf, 0xe5ffcc2f), - TOBN(0x65bbc1aa, 0x91708c3b), TOBN(0xa151e62c, 0x28bf0eeb), - TOBN(0x6cb53381, 0x6fa34db7), TOBN(0x5139e05c, 0xa29403a8), - TOBN(0x6ff651b4, 0x94a7cd2e), TOBN(0x5671ffd1, 0x0699336c), - TOBN(0x6f5fd2cc, 0x979a896a), TOBN(0x11e893a8, 0xd8148cef), - TOBN(0x988906a1, 0x65cf7b10), TOBN(0x81b67178, 0xc50d8485), - TOBN(0x7c0deb35, 0x8a35b3de), TOBN(0x423ac855, 0xc1d29799), - TOBN(0xaf580d87, 0xdac50b74), TOBN(0x28b2b89f, 0x5869734c), - TOBN(0x99a3b936, 0x874e28fb), TOBN(0xbb2c9190, 0x25f3f73a), - TOBN(0x199f6918, 0x84a9d5b7), TOBN(0x7ebe2325, 0x7e770374), - TOBN(0xf442e107, 0x0738efe2), TOBN(0xcf9f3f56, 0xcf9082d2), - TOBN(0x719f69e1, 0x09618708), TOBN(0xcc9e8364, 0xc183f9b1), - TOBN(0xec203a95, 0x366a21af), TOBN(0x6aec5d6d, 0x068b141f), - TOBN(0xee2df78a, 0x994f04e9), TOBN(0xb39ccae8, 0x271245b0), - TOBN(0xb875a4a9, 0x97e43f4f), TOBN(0x507dfe11, 0xdb2cea98), - TOBN(0x4fbf81cb, 0x489b03e9), TOBN(0xdb86ec5b, 0x6ec414fa), - TOBN(0xfad444f9, 0xf51b3ae5), TOBN(0xca7d33d6, 0x1914e3fe), - TOBN(0xa9c32f5c, 0x0ae6c4d0), TOBN(0xa9ca1d1e, 0x73969568), - TOBN(0x98043c31, 0x1aa7467e), TOBN(0xe832e75c, 0xe21b5ac6), - TOBN(0x314b7aea, 0x5232123d), TOBN(0x08307c8c, 0x65ae86db), - TOBN(0x06e7165c, 0xaa4668ed), TOBN(0xb170458b, 0xb4d3ec39), - TOBN(0x4d2e3ec6, 0xc19bb986), TOBN(0xc5f34846, 0xae0304ed), - TOBN(0x917695a0, 0x6c9f9722), TOBN(0x6c7f7317, 0x4cab1c0a), - TOBN(0x6295940e, 0x9d6d2e8b), TOBN(0xd318b8c1, 0x549f7c97), - TOBN(0x22453204, 0x97713885), TOBN(0x468d834b, 0xa8a440fe), - TOBN(0xd81fe5b2, 0xbfba796e), TOBN(0x152364db, 0x6d71f116), - TOBN(0xbb8c7c59, 0xb5b66e53), TOBN(0x0b12c61b, 0x2641a192), - TOBN(0x31f14802, 0xfcf0a7fd), TOBN(0x42fd0789, 0x5488b01e), - TOBN(0x71d78d6d, 0x9952b498), TOBN(0x8eb572d9, 0x07ac5201), - TOBN(0xe0a2a44c, 0x4d194a88), TOBN(0xd2b63fd9, 0xba017e66), - TOBN(0x78efc6c8, 0xf888aefc), TOBN(0xb76f6bda, 0x4a881a11), - TOBN(0x187f314b, 0xb46c2397), TOBN(0x004cf566, 0x5ded2819), - TOBN(0xa9ea5704, 0x38764d34), TOBN(0xbba45217, 0x78084709), - TOBN(0x06474571, 0x1171121e), TOBN(0xad7b7eb1, 0xe7c9b671), - TOBN(0xdacfbc40, 0x730f7507), TOBN(0x178cd8c6, 0xc7ad7bd1), - TOBN(0xbf0be101, 0xb2a67238), TOBN(0x3556d367, 0xaf9c14f2), - TOBN(0x104b7831, 0xa5662075), TOBN(0x58ca59bb, 0x79d9e60a), - TOBN(0x4bc45392, 0xa569a73b), TOBN(0x517a52e8, 0x5698f6c9), - TOBN(0x85643da5, 0xaeadd755), TOBN(0x1aed0cd5, 0x2a581b84), - TOBN(0xb9b4ff84, 0x80af1372), TOBN(0x244c3113, 0xf1ba5d1f), - TOBN(0x2a5dacbe, 0xf5f98d31), TOBN(0x2c3323e8, 0x4375bc2a), - TOBN(0x17a3ab4a, 0x5594b1dd), TOBN(0xa1928bfb, 0xceb4797e), - TOBN(0xe83af245, 0xe4886a19), TOBN(0x8979d546, 0x72b5a74a), - TOBN(0xa0f726bc, 0x19f9e967), TOBN(0xd9d03152, 0xe8fbbf4e), - TOBN(0xcfd6f51d, 0xb7707d40), TOBN(0x633084d9, 0x63f6e6e0), - TOBN(0xedcd9cdc, 0x55667eaf), TOBN(0x73b7f92b, 0x2e44d56f), - TOBN(0xfb2e39b6, 0x4e962b14), TOBN(0x7d408f6e, 0xf671fcbf), - TOBN(0xcc634ddc, 0x164a89bb), TOBN(0x74a42bb2, 0x3ef3bd05), - TOBN(0x1280dbb2, 0x428decbb), TOBN(0x6103f6bb, 0x402c8596), - TOBN(0xfa2bf581, 0x355a5752), TOBN(0x562f96a8, 0x00946674), - TOBN(0x4e4ca16d, 0x6da0223b), TOBN(0xfe47819f, 0x28d3aa25), - TOBN(0x9eea3075, 0xf8dfcf8a), TOBN(0xa284f0aa, 0x95669825), - TOBN(0xb3fca250, 0x867d3fd8), TOBN(0x20757b5f, 0x269d691e), - TOBN(0xf2c24020, 0x93b8a5de), TOBN(0xd3f93359, 0xebc06da6), - TOBN(0x1178293e, 0xb2739c33), TOBN(0xd2a3e770, 0xbcd686e5), - TOBN(0xa76f49f4, 0xcd941534), TOBN(0x0d37406b, 0xe3c71c0e), - TOBN(0x172d9397, 0x3b97f7e3), TOBN(0xec17e239, 0xbd7fd0de), - TOBN(0xe3290551, 0x6f496ba2), TOBN(0x6a693172, 0x36ad50e7), - TOBN(0xc4e539a2, 0x83e7eff5), TOBN(0x752737e7, 0x18e1b4cf), - TOBN(0xa2f7932c, 0x68af43ee), TOBN(0x5502468e, 0x703d00bd), - TOBN(0xe5dc978f, 0x2fb061f5), TOBN(0xc9a1904a, 0x28c815ad), - TOBN(0xd3af538d, 0x470c56a4), TOBN(0x159abc5f, 0x193d8ced), - TOBN(0x2a37245f, 0x20108ef3), TOBN(0xfa17081e, 0x223f7178), - TOBN(0x27b0fb2b, 0x10c8c0f5), TOBN(0x2102c3ea, 0x40650547), - TOBN(0x594564df, 0x8ac3bfa7), TOBN(0x98102033, 0x509dad96), - TOBN(0x6989643f, 0xf1d18a13), TOBN(0x35eebd91, 0xd7fc5af0), - TOBN(0x078d096a, 0xfaeaafd8), TOBN(0xb7a89341, 0xdef3de98), - TOBN(0x2a206e8d, 0xecf2a73a), TOBN(0x066a6397, 0x8e551994), - TOBN(0x3a6a088a, 0xb98d53a2), TOBN(0x0ce7c67c, 0x2d1124aa), - TOBN(0x48cec671, 0x759a113c), TOBN(0xe3b373d3, 0x4f6f67fa), - TOBN(0x5455d479, 0xfd36727b), TOBN(0xe5a428ee, 0xa13c0d81), - TOBN(0xb853dbc8, 0x1c86682b), TOBN(0xb78d2727, 0xb8d02b2a), - TOBN(0xaaf69bed, 0x8ebc329a), TOBN(0xdb6b40b3, 0x293b2148), - TOBN(0xe42ea77d, 0xb8c4961f), TOBN(0xb1a12f7c, 0x20e5e0ab), - TOBN(0xa0ec5274, 0x79e8b05e), TOBN(0x68027391, 0xfab60a80), - TOBN(0x6bfeea5f, 0x16b1bd5e), TOBN(0xf957e420, 0x4de30ad3), - TOBN(0xcbaf664e, 0x6a353b9e), TOBN(0x5c873312, 0x26d14feb), - TOBN(0x4e87f98c, 0xb65f57cb), TOBN(0xdb60a621, 0x5e0cdd41), - TOBN(0x67c16865, 0xa6881440), TOBN(0x1093ef1a, 0x46ab52aa), - TOBN(0xc095afb5, 0x3f4ece64), TOBN(0x6a6bb02e, 0x7604551a), - TOBN(0x55d44b4e, 0x0b26b8cd), TOBN(0xe5f9a999, 0xf971268a), - TOBN(0xc08ec425, 0x11a7de84), TOBN(0x83568095, 0xfda469dd), - TOBN(0x737bfba1, 0x6c6c90a2), TOBN(0x1cb9c4a0, 0xbe229831), - TOBN(0x93bccbba, 0xbb2eec64), TOBN(0xa0c23b64, 0xda03adbe), - TOBN(0x5f7aa00a, 0xe0e86ac4), TOBN(0x470b941e, 0xfc1401e6), - TOBN(0x5ad8d679, 0x9df43574), TOBN(0x4ccfb8a9, 0x0f65d810), - TOBN(0x1bce80e3, 0xaa7fbd81), TOBN(0x273291ad, 0x9508d20a), - TOBN(0xf5c4b46b, 0x42a92806), TOBN(0x810684ec, 0xa86ab44a), - TOBN(0x4591640b, 0xca0bc9f8), TOBN(0xb5efcdfc, 0x5c4b6054), - TOBN(0x16fc8907, 0x6e9edd12), TOBN(0xe29d0b50, 0xd4d792f9), - TOBN(0xa45fd01c, 0x9b03116d), TOBN(0x85035235, 0xc81765a4), - TOBN(0x1fe2a9b2, 0xb4b4b67c), TOBN(0xc1d10df0, 0xe8020604), - TOBN(0x9d64abfc, 0xbc8058d8), TOBN(0x8943b9b2, 0x712a0fbb), - TOBN(0x90eed914, 0x3b3def04), TOBN(0x85ab3aa2, 0x4ce775ff), - TOBN(0x605fd4ca, 0x7bbc9040), TOBN(0x8b34a564, 0xe2c75dfb), - TOBN(0x41ffc94a, 0x10358560), TOBN(0x2d8a5072, 0x9e5c28aa), - TOBN(0xe915a0fc, 0x4cc7eb15), TOBN(0xe9efab05, 0x8f6d0f5d), - TOBN(0xdbab47a9, 0xd19e9b91), TOBN(0x8cfed745, 0x0276154c), - TOBN(0x154357ae, 0x2cfede0d), TOBN(0x520630df, 0x19f5a4ef), - TOBN(0x25759f7c, 0xe382360f), TOBN(0xb6db05c9, 0x88bf5857), - TOBN(0x2917d61d, 0x6c58d46c), TOBN(0x14f8e491, 0xfd20cb7a), - TOBN(0xb68a727a, 0x11c20340), TOBN(0x0386f86f, 0xaf7ccbb6), - TOBN(0x5c8bc6cc, 0xfee09a20), TOBN(0x7d76ff4a, 0xbb7eea35), - TOBN(0xa7bdebe7, 0xdb15be7a), TOBN(0x67a08054, 0xd89f0302), - TOBN(0x56bf0ea9, 0xc1193364), TOBN(0xc8244467, 0x62837ebe), - TOBN(0x32bd8e8b, 0x20d841b8), TOBN(0x127a0548, 0xdbb8a54f), - TOBN(0x83dd4ca6, 0x63b20236), TOBN(0x87714718, 0x203491fa), - TOBN(0x4dabcaaa, 0xaa8a5288), TOBN(0x91cc0c8a, 0xaf23a1c9), - TOBN(0x34c72c6a, 0x3f220e0c), TOBN(0xbcc20bdf, 0x1232144a), - TOBN(0x6e2f42da, 0xa20ede1b), TOBN(0xc441f00c, 0x74a00515), - TOBN(0xbf46a5b6, 0x734b8c4b), TOBN(0x57409503, 0x7b56c9a4), - TOBN(0x9f735261, 0xe4585d45), TOBN(0x9231faed, 0x6734e642), - TOBN(0x1158a176, 0xbe70ee6c), TOBN(0x35f1068d, 0x7c3501bf), - TOBN(0x6beef900, 0xa2d26115), TOBN(0x649406f2, 0xef0afee3), - TOBN(0x3f43a60a, 0xbc2420a1), TOBN(0x509002a7, 0xd5aee4ac), - TOBN(0xb46836a5, 0x3ff3571b), TOBN(0x24f98b78, 0x837927c1), - TOBN(0x6254256a, 0x4533c716), TOBN(0xf27abb0b, 0xd07ee196), - TOBN(0xd7cf64fc, 0x5c6d5bfd), TOBN(0x6915c751, 0xf0cd7a77), - TOBN(0xd9f59012, 0x8798f534), TOBN(0x772b0da8, 0xf81d8b5f), - TOBN(0x1244260c, 0x2e03fa69), TOBN(0x36cf0e3a, 0x3be1a374), - TOBN(0x6e7c1633, 0xef06b960), TOBN(0xa71a4c55, 0x671f90f6), - TOBN(0x7a941251, 0x33c673db), TOBN(0xc0bea510, 0x73e8c131), - TOBN(0x61a8a699, 0xd4f6c734), TOBN(0x25e78c88, 0x341ed001), - TOBN(0x5c18acf8, 0x8e2f7d90), TOBN(0xfdbf33d7, 0x77be32cd), - TOBN(0x0a085cd7, 0xd2eb5ee9), TOBN(0x2d702cfb, 0xb3201115), - TOBN(0xb6e0ebdb, 0x85c88ce8), TOBN(0x23a3ce3c, 0x1e01d617), - TOBN(0x3041618e, 0x567333ac), TOBN(0x9dd0fd8f, 0x157edb6b), - TOBN(0x27f74702, 0xb57872b8), TOBN(0x2ef26b4f, 0x657d5fe1), - TOBN(0x95426f0a, 0x57cf3d40), TOBN(0x847e2ad1, 0x65a6067a), - TOBN(0xd474d9a0, 0x09996a74), TOBN(0x16a56acd, 0x2a26115c), - TOBN(0x02a615c3, 0xd16f4d43), TOBN(0xcc3fc965, 0xaadb85b7), - TOBN(0x386bda73, 0xce07d1b0), TOBN(0xd82910c2, 0x58ad4178), - TOBN(0x124f82cf, 0xcd2617f4), TOBN(0xcc2f5e8d, 0xef691770), - TOBN(0x82702550, 0xb8c30ccc), TOBN(0x7b856aea, 0x1a8e575a), - TOBN(0xbb822fef, 0xb1ab9459), TOBN(0x085928bc, 0xec24e38e), - TOBN(0x5d0402ec, 0xba8f4b4d), TOBN(0xc07cd4ba, 0x00b4d58b), - TOBN(0x5d8dffd5, 0x29227e7a), TOBN(0x61d44d0c, 0x31bf386f), - TOBN(0xe486dc2b, 0x135e6f4d), TOBN(0x680962eb, 0xe79410ef), - TOBN(0xa61bd343, 0xf10088b5), TOBN(0x6aa76076, 0xe2e28686), - TOBN(0x80463d11, 0x8fb98871), TOBN(0xcb26f5c3, 0xbbc76aff), - TOBN(0xd4ab8edd, 0xfbe03614), TOBN(0xc8eb579b, 0xc0cf2dee), - TOBN(0xcc004c15, 0xc93bae41), TOBN(0x46fbae5d, 0x3aeca3b2), - TOBN(0x671235cf, 0x0f1e9ab1), TOBN(0xadfba934, 0x9ec285c1), - TOBN(0x88ded013, 0xf216c980), TOBN(0xc8ac4fb8, 0xf79e0bc1), - TOBN(0xa29b89c6, 0xfb97a237), TOBN(0xb697b780, 0x9922d8e7), - TOBN(0x3142c639, 0xddb945b5), TOBN(0x447b06c7, 0xe094c3a9), - TOBN(0xcdcb3642, 0x72266c90), TOBN(0x633aad08, 0xa9385046), - TOBN(0xa36c936b, 0xb57c6477), TOBN(0x871f8b64, 0xe94dbcc6), - TOBN(0x28d0fb62, 0xa591a67b), TOBN(0x9d40e081, 0xc1d926f5), - TOBN(0x3111eaf6, 0xf2d84b5a), TOBN(0x228993f9, 0xa565b644), - TOBN(0x0ccbf592, 0x2c83188b), TOBN(0xf87b30ab, 0x3df3e197), - TOBN(0xb8658b31, 0x7642bca8), TOBN(0x1a032d7f, 0x52800f17), - TOBN(0x051dcae5, 0x79bf9445), TOBN(0xeba6b8ee, 0x54a2e253), - TOBN(0x5c8b9cad, 0xd4485692), TOBN(0x84bda40e, 0x8986e9be), - TOBN(0xd16d16a4, 0x2f0db448), TOBN(0x8ec80050, 0xa14d4188), - TOBN(0xb2b26107, 0x98fa7aaa), TOBN(0x41209ee4, 0xf073aa4e), - TOBN(0xf1570359, 0xf2d6b19b), TOBN(0xcbe6868c, 0xfc577caf), - TOBN(0x186c4bdc, 0x32c04dd3), TOBN(0xa6c35fae, 0xcfeee397), - TOBN(0xb4a1b312, 0xf086c0cf), TOBN(0xe0a5ccc6, 0xd9461fe2), - TOBN(0xc32278aa, 0x1536189f), TOBN(0x1126c55f, 0xba6df571), - TOBN(0x0f71a602, 0xb194560e), TOBN(0x8b2d7405, 0x324bd6e1), - TOBN(0x8481939e, 0x3738be71), TOBN(0xb5090b1a, 0x1a4d97a9), - TOBN(0x116c65a3, 0xf05ba915), TOBN(0x21863ad3, 0xaae448aa), - TOBN(0xd24e2679, 0xa7aae5d3), TOBN(0x7076013d, 0x0de5c1c4), - TOBN(0x2d50f8ba, 0xbb05b629), TOBN(0x73c1abe2, 0x6e66efbb), - TOBN(0xefd4b422, 0xf2488af7), TOBN(0xe4105d02, 0x663ba575), - TOBN(0x7eb60a8b, 0x53a69457), TOBN(0x62210008, 0xc945973b), - TOBN(0xfb255478, 0x77a50ec6), TOBN(0xbf0392f7, 0x0a37a72c), - TOBN(0xa0a7a19c, 0x4be18e7a), TOBN(0x90d8ea16, 0x25b1e0af), - TOBN(0x7582a293, 0xef953f57), TOBN(0x90a64d05, 0xbdc5465a), - TOBN(0xca79c497, 0xe2510717), TOBN(0x560dbb7c, 0x18cb641f), - TOBN(0x1d8e3286, 0x4b66abfb), TOBN(0xd26f52e5, 0x59030900), - TOBN(0x1ee3f643, 0x5584941a), TOBN(0x6d3b3730, 0x569f5958), - TOBN(0x9ff2a62f, 0x4789dba5), TOBN(0x91fcb815, 0x72b5c9b7), - TOBN(0xf446cb7d, 0x6c8f9a0e), TOBN(0x48f625c1, 0x39b7ecb5), - TOBN(0xbabae801, 0x1c6219b8), TOBN(0xe7a562d9, 0x28ac2f23), - TOBN(0xe1b48732, 0x26e20588), TOBN(0x06ee1cad, 0x775af051), - TOBN(0xda29ae43, 0xfaff79f7), TOBN(0xc141a412, 0x652ee9e0), - TOBN(0x1e127f6f, 0x195f4bd0), TOBN(0x29c6ab4f, 0x072f34f8), - TOBN(0x7b7c1477, 0x30448112), TOBN(0x82b51af1, 0xe4a38656), - TOBN(0x2bf2028a, 0x2f315010), TOBN(0xc9a4a01f, 0x6ea88cd4), - TOBN(0xf63e95d8, 0x257e5818), TOBN(0xdd8efa10, 0xb4519b16), - TOBN(0xed8973e0, 0x0da910bf), TOBN(0xed49d077, 0x5c0fe4a9), - TOBN(0xac3aac5e, 0xb7caee1e), TOBN(0x1033898d, 0xa7f4da57), - TOBN(0x42145c0e, 0x5c6669b9), TOBN(0x42daa688, 0xc1aa2aa0), - TOBN(0x629cc15c, 0x1a1d885a), TOBN(0x25572ec0, 0xf4b76817), - TOBN(0x8312e435, 0x9c8f8f28), TOBN(0x8107f8cd, 0x81965490), - TOBN(0x516ff3a3, 0x6fa6110c), TOBN(0x74fb1eb1, 0xfb93561f), - TOBN(0x6c0c9047, 0x8457522b), TOBN(0xcfd32104, 0x6bb8bdc6), - TOBN(0x2d6884a2, 0xcc80ad57), TOBN(0x7c27fc35, 0x86a9b637), - TOBN(0x3461baed, 0xadf4e8cd), TOBN(0x1d56251a, 0x617242f0), - TOBN(0x0b80d209, 0xc955bef4), TOBN(0xdf02cad2, 0x06adb047), - TOBN(0xf0d7cb91, 0x5ec74fee), TOBN(0xd2503375, 0x1111ba44), - TOBN(0x9671755e, 0xdf53cb36), TOBN(0x54dcb612, 0x3368551b), - TOBN(0x66d69aac, 0xc8a025a4), TOBN(0x6be946c6, 0xe77ef445), - TOBN(0x719946d1, 0xa995e094), TOBN(0x65e848f6, 0xe51e04d8), - TOBN(0xe62f3300, 0x6a1e3113), TOBN(0x1541c7c1, 0x501de503), - TOBN(0x4daac9fa, 0xf4acfade), TOBN(0x0e585897, 0x44cd0b71), - TOBN(0x544fd869, 0x0a51cd77), TOBN(0x60fc20ed, 0x0031016d), - TOBN(0x58b404ec, 0xa4276867), TOBN(0x46f6c3cc, 0x34f34993), - TOBN(0x477ca007, 0xc636e5bd), TOBN(0x8018f5e5, 0x7c458b47), - TOBN(0xa1202270, 0xe47b668f), TOBN(0xcef48ccd, 0xee14f203), - TOBN(0x23f98bae, 0x62ff9b4d), TOBN(0x55acc035, 0xc589eddd), - TOBN(0x3fe712af, 0x64db4444), TOBN(0x19e9d634, 0xbecdd480), - TOBN(0xe08bc047, 0xa930978a), TOBN(0x2dbf24ec, 0xa1280733), - TOBN(0x3c0ae38c, 0x2cd706b2), TOBN(0x5b012a5b, 0x359017b9), - TOBN(0x3943c38c, 0x72e0f5ae), TOBN(0x786167ea, 0x57176fa3), - TOBN(0xe5f9897d, 0x594881dc), TOBN(0x6b5efad8, 0xcfb820c1), - TOBN(0xb2179093, 0xd55018de), TOBN(0x39ad7d32, 0x0bac56ce), - TOBN(0xb55122e0, 0x2cfc0e81), TOBN(0x117c4661, 0xf6d89daa), - TOBN(0x362d01e1, 0xcb64fa09), TOBN(0x6a309b4e, 0x3e9c4ddd), - TOBN(0xfa979fb7, 0xabea49b1), TOBN(0xb4b1d27d, 0x10e2c6c5), - TOBN(0xbd61c2c4, 0x23afde7a), TOBN(0xeb6614f8, 0x9786d358), - TOBN(0x4a5d816b, 0x7f6f7459), TOBN(0xe431a44f, 0x09360e7b), - TOBN(0x8c27a032, 0xc309914c), TOBN(0xcea5d68a, 0xcaede3d8), - TOBN(0x3668f665, 0x3a0a3f95), TOBN(0x89369416, 0x7ceba27b), - TOBN(0x89981fad, 0xe4728fe9), TOBN(0x7102c8a0, 0x8a093562), - TOBN(0xbb80310e, 0x235d21c8), TOBN(0x505e55d1, 0xbefb7f7b), - TOBN(0xa0a90811, 0x12958a67), TOBN(0xd67e106a, 0x4d851fef), - TOBN(0xb84011a9, 0x431dd80e), TOBN(0xeb7c7cca, 0x73306cd9), - TOBN(0x20fadd29, 0xd1b3b730), TOBN(0x83858b5b, 0xfe37b3d3), - TOBN(0xbf4cd193, 0xb6251d5c), TOBN(0x1cca1fd3, 0x1352d952), - TOBN(0xc66157a4, 0x90fbc051), TOBN(0x7990a638, 0x89b98636)}, - {TOBN(0xe5aa692a, 0x87dec0e1), TOBN(0x010ded8d, 0xf7b39d00), - TOBN(0x7b1b80c8, 0x54cfa0b5), TOBN(0x66beb876, 0xa0f8ea28), - TOBN(0x50d7f531, 0x3476cd0e), TOBN(0xa63d0e65, 0xb08d3949), - TOBN(0x1a09eea9, 0x53479fc6), TOBN(0x82ae9891, 0xf499e742), - TOBN(0xab58b910, 0x5ca7d866), TOBN(0x582967e2, 0x3adb3b34), - TOBN(0x89ae4447, 0xcceac0bc), TOBN(0x919c667c, 0x7bf56af5), - TOBN(0x9aec17b1, 0x60f5dcd7), TOBN(0xec697b9f, 0xddcaadbc), - TOBN(0x0b98f341, 0x463467f5), TOBN(0xb187f1f7, 0xa967132f), - TOBN(0x90fe7a1d, 0x214aeb18), TOBN(0x1506af3c, 0x741432f7), - TOBN(0xbb5565f9, 0xe591a0c4), TOBN(0x10d41a77, 0xb44f1bc3), - TOBN(0xa09d65e4, 0xa84bde96), TOBN(0x42f060d8, 0xf20a6a1c), - TOBN(0x652a3bfd, 0xf27f9ce7), TOBN(0xb6bdb65c, 0x3b3d739f), - TOBN(0xeb5ddcb6, 0xec7fae9f), TOBN(0x995f2714, 0xefb66e5a), - TOBN(0xdee95d8e, 0x69445d52), TOBN(0x1b6c2d46, 0x09e27620), - TOBN(0x32621c31, 0x8129d716), TOBN(0xb03909f1, 0x0958c1aa), - TOBN(0x8c468ef9, 0x1af4af63), TOBN(0x162c429f, 0xfba5cdf6), - TOBN(0x2f682343, 0x753b9371), TOBN(0x29cab45a, 0x5f1f9cd7), - TOBN(0x571623ab, 0xb245db96), TOBN(0xc507db09, 0x3fd79999), - TOBN(0x4e2ef652, 0xaf036c32), TOBN(0x86f0cc78, 0x05018e5c), - TOBN(0xc10a73d4, 0xab8be350), TOBN(0x6519b397, 0x7e826327), - TOBN(0xe8cb5eef, 0x9c053df7), TOBN(0x8de25b37, 0xb300ea6f), - TOBN(0xdb03fa92, 0xc849cffb), TOBN(0x242e43a7, 0xe84169bb), - TOBN(0xe4fa51f4, 0xdd6f958e), TOBN(0x6925a77f, 0xf4445a8d), - TOBN(0xe6e72a50, 0xe90d8949), TOBN(0xc66648e3, 0x2b1f6390), - TOBN(0xb2ab1957, 0x173e460c), TOBN(0x1bbbce75, 0x30704590), - TOBN(0xc0a90dbd, 0xdb1c7162), TOBN(0x505e399e, 0x15cdd65d), - TOBN(0x68434dcb, 0x57797ab7), TOBN(0x60ad35ba, 0x6a2ca8e8), - TOBN(0x4bfdb1e0, 0xde3336c1), TOBN(0xbbef99eb, 0xd8b39015), - TOBN(0x6c3b96f3, 0x1711ebec), TOBN(0x2da40f1f, 0xce98fdc4), - TOBN(0xb99774d3, 0x57b4411f), TOBN(0x87c8bdf4, 0x15b65bb6), - TOBN(0xda3a89e3, 0xc2eef12d), TOBN(0xde95bb9b, 0x3c7471f3), - TOBN(0x600f225b, 0xd812c594), TOBN(0x54907c5d, 0x2b75a56b), - TOBN(0xa93cc5f0, 0x8db60e35), TOBN(0x743e3cd6, 0xfa833319), - TOBN(0x7dad5c41, 0xf81683c9), TOBN(0x70c1e7d9, 0x9c34107e), - TOBN(0x0edc4a39, 0xa6be0907), TOBN(0x36d47035, 0x86d0b7d3), - TOBN(0x8c76da03, 0x272bfa60), TOBN(0x0b4a07ea, 0x0f08a414), - TOBN(0x699e4d29, 0x45c1dd53), TOBN(0xcadc5898, 0x231debb5), - TOBN(0xdf49fcc7, 0xa77f00e0), TOBN(0x93057bbf, 0xa73e5a0e), - TOBN(0x2f8b7ecd, 0x027a4cd1), TOBN(0x114734b3, 0xc614011a), - TOBN(0xe7a01db7, 0x67677c68), TOBN(0x89d9be5e, 0x7e273f4f), - TOBN(0xd225cb2e, 0x089808ef), TOBN(0xf1f7a27d, 0xd59e4107), - TOBN(0x53afc761, 0x8211b9c9), TOBN(0x0361bc67, 0xe6819159), - TOBN(0x2a865d0b, 0x7f071426), TOBN(0x6a3c1810, 0xe7072567), - TOBN(0x3e3bca1e, 0x0d6bcabd), TOBN(0xa1b02bc1, 0x408591bc), - TOBN(0xe0deee59, 0x31fba239), TOBN(0xf47424d3, 0x98bd91d1), - TOBN(0x0f8886f4, 0x071a3c1d), TOBN(0x3f7d41e8, 0xa819233b), - TOBN(0x708623c2, 0xcf6eb998), TOBN(0x86bb49af, 0x609a287f), - TOBN(0x942bb249, 0x63c90762), TOBN(0x0ef6eea5, 0x55a9654b), - TOBN(0x5f6d2d72, 0x36f5defe), TOBN(0xfa9922dc, 0x56f99176), - TOBN(0x6c8c5ece, 0xf78ce0c7), TOBN(0x7b44589d, 0xbe09b55e), - TOBN(0xe11b3bca, 0x9ea83770), TOBN(0xd7fa2c7f, 0x2ab71547), - TOBN(0x2a3dd6fa, 0x2a1ddcc0), TOBN(0x09acb430, 0x5a7b7707), - TOBN(0x4add4a2e, 0x649d4e57), TOBN(0xcd53a2b0, 0x1917526e), - TOBN(0xc5262330, 0x20b44ac4), TOBN(0x4028746a, 0xbaa2c31d), - TOBN(0x51318390, 0x64291d4c), TOBN(0xbf48f151, 0xee5ad909), - TOBN(0xcce57f59, 0x7b185681), TOBN(0x7c3ac1b0, 0x4854d442), - TOBN(0x65587dc3, 0xc093c171), TOBN(0xae7acb24, 0x24f42b65), - TOBN(0x5a338adb, 0x955996cb), TOBN(0xc8e65675, 0x6051f91b), - TOBN(0x66711fba, 0x28b8d0b1), TOBN(0x15d74137, 0xb6c10a90), - TOBN(0x70cdd7eb, 0x3a232a80), TOBN(0xc9e2f07f, 0x6191ed24), - TOBN(0xa80d1db6, 0xf79588c0), TOBN(0xfa52fc69, 0xb55768cc), - TOBN(0x0b4df1ae, 0x7f54438a), TOBN(0x0cadd1a7, 0xf9b46a4f), - TOBN(0xb40ea6b3, 0x1803dd6f), TOBN(0x488e4fa5, 0x55eaae35), - TOBN(0x9f047d55, 0x382e4e16), TOBN(0xc9b5b7e0, 0x2f6e0c98), - TOBN(0x6b1bd2d3, 0x95762649), TOBN(0xa9604ee7, 0xc7aea3f6), - TOBN(0x3646ff27, 0x6dc6f896), TOBN(0x9bf0e7f5, 0x2860bad1), - TOBN(0x2d92c821, 0x7cb44b92), TOBN(0xa2f5ce63, 0xaea9c182), - TOBN(0xd0a2afb1, 0x9154a5fd), TOBN(0x482e474c, 0x95801da6), - TOBN(0xc19972d0, 0xb611c24b), TOBN(0x1d468e65, 0x60a8f351), - TOBN(0xeb758069, 0x7bcf6421), TOBN(0xec9dd0ee, 0x88fbc491), - TOBN(0x5b59d2bf, 0x956c2e32), TOBN(0x73dc6864, 0xdcddf94e), - TOBN(0xfd5e2321, 0xbcee7665), TOBN(0xa7b4f8ef, 0x5e9a06c4), - TOBN(0xfba918dd, 0x7280f855), TOBN(0xbbaac260, 0x8baec688), - TOBN(0xa3b3f00f, 0x33400f42), TOBN(0x3d2dba29, 0x66f2e6e4), - TOBN(0xb6f71a94, 0x98509375), TOBN(0x8f33031f, 0xcea423cc), - TOBN(0x009b8dd0, 0x4807e6fb), TOBN(0x5163cfe5, 0x5cdb954c), - TOBN(0x03cc8f17, 0xcf41c6e8), TOBN(0xf1f03c2a, 0x037b925c), - TOBN(0xc39c19cc, 0x66d2427c), TOBN(0x823d24ba, 0x7b6c18e4), - TOBN(0x32ef9013, 0x901f0b4f), TOBN(0x684360f1, 0xf8941c2e), - TOBN(0x0ebaff52, 0x2c28092e), TOBN(0x7891e4e3, 0x256c932f), - TOBN(0x51264319, 0xac445e3d), TOBN(0x553432e7, 0x8ea74381), - TOBN(0xe6eeaa69, 0x67e9c50a), TOBN(0x27ced284, 0x62e628c7), - TOBN(0x3f96d375, 0x7a4afa57), TOBN(0xde0a14c3, 0xe484c150), - TOBN(0x364a24eb, 0x38bd9923), TOBN(0x1df18da0, 0xe5177422), - TOBN(0x174e8f82, 0xd8d38a9b), TOBN(0x2e97c600, 0xe7de1391), - TOBN(0xc5709850, 0xa1c175dd), TOBN(0x969041a0, 0x32ae5035), - TOBN(0xcbfd533b, 0x76a2086b), TOBN(0xd6bba71b, 0xd7c2e8fe), - TOBN(0xb2d58ee6, 0x099dfb67), TOBN(0x3a8b342d, 0x064a85d9), - TOBN(0x3bc07649, 0x522f9be3), TOBN(0x690c075b, 0xdf1f49a8), - TOBN(0x80e1aee8, 0x3854ec42), TOBN(0x2a7dbf44, 0x17689dc7), - TOBN(0xc004fc0e, 0x3faf4078), TOBN(0xb2f02e9e, 0xdf11862c), - TOBN(0xf10a5e0f, 0xa0a1b7b3), TOBN(0x30aca623, 0x8936ec80), - TOBN(0xf83cbf05, 0x02f40d9a), TOBN(0x4681c468, 0x2c318a4d), - TOBN(0x98575618, 0x0e9c2674), TOBN(0xbe79d046, 0x1847092e), - TOBN(0xaf1e480a, 0x78bd01e0), TOBN(0x6dd359e4, 0x72a51db9), - TOBN(0x62ce3821, 0xe3afbab6), TOBN(0xc5cee5b6, 0x17733199), - TOBN(0xe08b30d4, 0x6ffd9fbb), TOBN(0x6e5bc699, 0x36c610b7), - TOBN(0xf343cff2, 0x9ce262cf), TOBN(0xca2e4e35, 0x68b914c1), - TOBN(0x011d64c0, 0x16de36c5), TOBN(0xe0b10fdd, 0x42e2b829), - TOBN(0x78942981, 0x6685aaf8), TOBN(0xe7511708, 0x230ede97), - TOBN(0x671ed8fc, 0x3b922bf8), TOBN(0xe4d8c0a0, 0x4c29b133), - TOBN(0x87eb1239, 0x3b6e99c4), TOBN(0xaff3974c, 0x8793beba), - TOBN(0x03749405, 0x2c18df9b), TOBN(0xc5c3a293, 0x91007139), - TOBN(0x6a77234f, 0xe37a0b95), TOBN(0x02c29a21, 0xb661c96b), - TOBN(0xc3aaf1d6, 0x141ecf61), TOBN(0x9195509e, 0x3bb22f53), - TOBN(0x29597404, 0x22d51357), TOBN(0x1b083822, 0x537bed60), - TOBN(0xcd7d6e35, 0xe07289f0), TOBN(0x1f94c48c, 0x6dd86eff), - TOBN(0xc8bb1f82, 0xeb0f9cfa), TOBN(0x9ee0b7e6, 0x1b2eb97d), - TOBN(0x5a52fe2e, 0x34d74e31), TOBN(0xa352c310, 0x3bf79ab6), - TOBN(0x97ff6c5a, 0xabfeeb8f), TOBN(0xbfbe8fef, 0xf5c97305), - TOBN(0xd6081ce6, 0xa7904608), TOBN(0x1f812f3a, 0xc4fca249), - TOBN(0x9b24bc9a, 0xb9e5e200), TOBN(0x91022c67, 0x38012ee8), - TOBN(0xe83d9c5d, 0x30a713a1), TOBN(0x4876e3f0, 0x84ef0f93), - TOBN(0xc9777029, 0xc1fbf928), TOBN(0xef7a6bb3, 0xbce7d2a4), - TOBN(0xb8067228, 0xdfa2a659), TOBN(0xd5cd3398, 0xd877a48f), - TOBN(0xbea4fd8f, 0x025d0f3f), TOBN(0xd67d2e35, 0x2eae7c2b), - TOBN(0x184de7d7, 0xcc5f4394), TOBN(0xb5551b5c, 0x4536e142), - TOBN(0x2e89b212, 0xd34aa60a), TOBN(0x14a96fea, 0xf50051d5), - TOBN(0x4e21ef74, 0x0d12bb0b), TOBN(0xc522f020, 0x60b9677e), - TOBN(0x8b12e467, 0x2df7731d), TOBN(0x39f80382, 0x7b326d31), - TOBN(0xdfb8630c, 0x39024a94), TOBN(0xaacb96a8, 0x97319452), - TOBN(0xd68a3961, 0xeda3867c), TOBN(0x0c58e2b0, 0x77c4ffca), - TOBN(0x3d545d63, 0x4da919fa), TOBN(0xef79b69a, 0xf15e2289), - TOBN(0x54bc3d3d, 0x808bab10), TOBN(0xc8ab3007, 0x45f82c37), - TOBN(0xc12738b6, 0x7c4a658a), TOBN(0xb3c47639, 0x40e72182), - TOBN(0x3b77be46, 0x8798e44f), TOBN(0xdc047df2, 0x17a7f85f), - TOBN(0x2439d4c5, 0x5e59d92d), TOBN(0xcedca475, 0xe8e64d8d), - TOBN(0xa724cd0d, 0x87ca9b16), TOBN(0x35e4fd59, 0xa5540dfe), - TOBN(0xf8c1ff18, 0xe4bcf6b1), TOBN(0x856d6285, 0x295018fa), - TOBN(0x433f665c, 0x3263c949), TOBN(0xa6a76dd6, 0xa1f21409), - TOBN(0x17d32334, 0xcc7b4f79), TOBN(0xa1d03122, 0x06720e4a), - TOBN(0xadb6661d, 0x81d9bed5), TOBN(0xf0d6fb02, 0x11db15d1), - TOBN(0x7fd11ad5, 0x1fb747d2), TOBN(0xab50f959, 0x3033762b), - TOBN(0x2a7e711b, 0xfbefaf5a), TOBN(0xc7393278, 0x3fef2bbf), - TOBN(0xe29fa244, 0x0df6f9be), TOBN(0x9092757b, 0x71efd215), - TOBN(0xee60e311, 0x4f3d6fd9), TOBN(0x338542d4, 0x0acfb78b), - TOBN(0x44a23f08, 0x38961a0f), TOBN(0x1426eade, 0x986987ca), - TOBN(0x36e6ee2e, 0x4a863cc6), TOBN(0x48059420, 0x628b8b79), - TOBN(0x30303ad8, 0x7396e1de), TOBN(0x5c8bdc48, 0x38c5aad1), - TOBN(0x3e40e11f, 0x5c8f5066), TOBN(0xabd6e768, 0x8d246bbd), - TOBN(0x68aa40bb, 0x23330a01), TOBN(0xd23f5ee4, 0xc34eafa0), - TOBN(0x3bbee315, 0x5de02c21), TOBN(0x18dd4397, 0xd1d8dd06), - TOBN(0x3ba1939a, 0x122d7b44), TOBN(0xe6d3b40a, 0xa33870d6), - TOBN(0x8e620f70, 0x1c4fe3f8), TOBN(0xf6bba1a5, 0xd3a50cbf), - TOBN(0x4a78bde5, 0xcfc0aee0), TOBN(0x847edc46, 0xc08c50bd), - TOBN(0xbaa2439c, 0xad63c9b2), TOBN(0xceb4a728, 0x10fc2acb), - TOBN(0xa419e40e, 0x26da033d), TOBN(0x6cc3889d, 0x03e02683), - TOBN(0x1cd28559, 0xfdccf725), TOBN(0x0fd7e0f1, 0x8d13d208), - TOBN(0x01b9733b, 0x1f0df9d4), TOBN(0x8cc2c5f3, 0xa2b5e4f3), - TOBN(0x43053bfa, 0x3a304fd4), TOBN(0x8e87665c, 0x0a9f1aa7), - TOBN(0x087f29ec, 0xd73dc965), TOBN(0x15ace455, 0x3e9023db), - TOBN(0x2370e309, 0x2bce28b4), TOBN(0xf9723442, 0xb6b1e84a), - TOBN(0xbeee662e, 0xb72d9f26), TOBN(0xb19396de, 0xf0e47109), - TOBN(0x85b1fa73, 0xe13289d0), TOBN(0x436cf77e, 0x54e58e32), - TOBN(0x0ec833b3, 0xe990ef77), TOBN(0x7373e3ed, 0x1b11fc25), - TOBN(0xbe0eda87, 0x0fc332ce), TOBN(0xced04970, 0x8d7ea856), - TOBN(0xf85ff785, 0x7e977ca0), TOBN(0xb66ee8da, 0xdfdd5d2b), - TOBN(0xf5e37950, 0x905af461), TOBN(0x587b9090, 0x966d487c), - TOBN(0x6a198a1b, 0x32ba0127), TOBN(0xa7720e07, 0x141615ac), - TOBN(0xa23f3499, 0x996ef2f2), TOBN(0xef5f64b4, 0x470bcb3d), - TOBN(0xa526a962, 0x92b8c559), TOBN(0x0c14aac0, 0x69740a0f), - TOBN(0x0d41a9e3, 0xa6bdc0a5), TOBN(0x97d52106, 0x9c48aef4), - TOBN(0xcf16bd30, 0x3e7c253b), TOBN(0xcc834b1a, 0x47fdedc1), - TOBN(0x7362c6e5, 0x373aab2e), TOBN(0x264ed85e, 0xc5f590ff), - TOBN(0x7a46d9c0, 0x66d41870), TOBN(0xa50c20b1, 0x4787ba09), - TOBN(0x185e7e51, 0xe3d44635), TOBN(0xb3b3e080, 0x31e2d8dc), - TOBN(0xbed1e558, 0xa179e9d9), TOBN(0x2daa3f79, 0x74a76781), - TOBN(0x4372baf2, 0x3a40864f), TOBN(0x46900c54, 0x4fe75cb5), - TOBN(0xb95f171e, 0xf76765d0), TOBN(0x4ad726d2, 0x95c87502), - TOBN(0x2ec769da, 0x4d7c99bd), TOBN(0x5e2ddd19, 0xc36cdfa8), - TOBN(0xc22117fc, 0xa93e6dea), TOBN(0xe8a2583b, 0x93771123), - TOBN(0xbe2f6089, 0xfa08a3a2), TOBN(0x4809d5ed, 0x8f0e1112), - TOBN(0x3b414aa3, 0xda7a095e), TOBN(0x9049acf1, 0x26f5aadd), - TOBN(0x78d46a4d, 0x6be8b84a), TOBN(0xd66b1963, 0xb732b9b3), - TOBN(0x5c2ac2a0, 0xde6e9555), TOBN(0xcf52d098, 0xb5bd8770), - TOBN(0x15a15fa6, 0x0fd28921), TOBN(0x56ccb81e, 0x8b27536d), - TOBN(0x0f0d8ab8, 0x9f4ccbb8), TOBN(0xed5f44d2, 0xdb221729), - TOBN(0x43141988, 0x00bed10c), TOBN(0xc94348a4, 0x1d735b8b), - TOBN(0x79f3e9c4, 0x29ef8479), TOBN(0x4c13a4e3, 0x614c693f), - TOBN(0x32c9af56, 0x8e143a14), TOBN(0xbc517799, 0xe29ac5c4), - TOBN(0x05e17992, 0x2774856f), TOBN(0x6e52fb05, 0x6c1bf55f), - TOBN(0xaeda4225, 0xe4f19e16), TOBN(0x70f4728a, 0xaf5ccb26), - TOBN(0x5d2118d1, 0xb2947f22), TOBN(0xc827ea16, 0x281d6fb9), - TOBN(0x8412328d, 0x8cf0eabd), TOBN(0x45ee9fb2, 0x03ef9dcf), - TOBN(0x8e700421, 0xbb937d63), TOBN(0xdf8ff2d5, 0xcc4b37a6), - TOBN(0xa4c0d5b2, 0x5ced7b68), TOBN(0x6537c1ef, 0xc7308f59), - TOBN(0x25ce6a26, 0x3b37f8e8), TOBN(0x170e9a9b, 0xdeebc6ce), - TOBN(0xdd037952, 0x8728d72c), TOBN(0x445b0e55, 0x850154bc), - TOBN(0x4b7d0e06, 0x83a7337b), TOBN(0x1e3416d4, 0xffecf249), - TOBN(0x24840eff, 0x66a2b71f), TOBN(0xd0d9a50a, 0xb37cc26d), - TOBN(0xe2198150, 0x6fe28ef7), TOBN(0x3cc5ef16, 0x23324c7f), - TOBN(0x220f3455, 0x769b5263), TOBN(0xe2ade2f1, 0xa10bf475), - TOBN(0x28cd20fa, 0x458d3671), TOBN(0x1549722c, 0x2dc4847b), - TOBN(0x6dd01e55, 0x591941e3), TOBN(0x0e6fbcea, 0x27128ccb), - TOBN(0xae1a1e6b, 0x3bef0262), TOBN(0xfa8c472c, 0x8f54e103), - TOBN(0x7539c0a8, 0x72c052ec), TOBN(0xd7b27369, 0x5a3490e9), - TOBN(0x143fe1f1, 0x71684349), TOBN(0x36b4722e, 0x32e19b97), - TOBN(0xdc059227, 0x90980aff), TOBN(0x175c9c88, 0x9e13d674), - TOBN(0xa7de5b22, 0x6e6bfdb1), TOBN(0x5ea5b7b2, 0xbedb4b46), - TOBN(0xd5570191, 0xd34a6e44), TOBN(0xfcf60d2e, 0xa24ff7e6), - TOBN(0x614a392d, 0x677819e1), TOBN(0x7be74c7e, 0xaa5a29e8), - TOBN(0xab50fece, 0x63c85f3f), TOBN(0xaca2e2a9, 0x46cab337), - TOBN(0x7f700388, 0x122a6fe3), TOBN(0xdb69f703, 0x882a04a8), - TOBN(0x9a77935d, 0xcf7aed57), TOBN(0xdf16207c, 0x8d91c86f), - TOBN(0x2fca49ab, 0x63ed9998), TOBN(0xa3125c44, 0xa77ddf96), - TOBN(0x05dd8a86, 0x24344072), TOBN(0xa023dda2, 0xfec3fb56), - TOBN(0x421b41fc, 0x0c743032), TOBN(0x4f2120c1, 0x5e438639), - TOBN(0xfb7cae51, 0xc83c1b07), TOBN(0xb2370caa, 0xcac2171a), - TOBN(0x2eb2d962, 0x6cc820fb), TOBN(0x59feee5c, 0xb85a44bf), - TOBN(0x94620fca, 0x5b6598f0), TOBN(0x6b922cae, 0x7e314051), - TOBN(0xff8745ad, 0x106bed4e), TOBN(0x546e71f5, 0xdfa1e9ab), - TOBN(0x935c1e48, 0x1ec29487), TOBN(0x9509216c, 0x4d936530), - TOBN(0xc7ca3067, 0x85c9a2db), TOBN(0xd6ae5152, 0x6be8606f), - TOBN(0x09dbcae6, 0xe14c651d), TOBN(0xc9536e23, 0x9bc32f96), - TOBN(0xa90535a9, 0x34521b03), TOBN(0xf39c526c, 0x878756ff), - TOBN(0x383172ec, 0x8aedf03c), TOBN(0x20a8075e, 0xefe0c034), - TOBN(0xf22f9c62, 0x64026422), TOBN(0x8dd10780, 0x24b9d076), - TOBN(0x944c742a, 0x3bef2950), TOBN(0x55b9502e, 0x88a2b00b), - TOBN(0xa59e14b4, 0x86a09817), TOBN(0xa39dd3ac, 0x47bb4071), - TOBN(0x55137f66, 0x3be0592f), TOBN(0x07fcafd4, 0xc9e63f5b), - TOBN(0x963652ee, 0x346eb226), TOBN(0x7dfab085, 0xec2facb7), - TOBN(0x273bf2b8, 0x691add26), TOBN(0x30d74540, 0xf2b46c44), - TOBN(0x05e8e73e, 0xf2c2d065), TOBN(0xff9b8a00, 0xd42eeac9), - TOBN(0x2fcbd205, 0x97209d22), TOBN(0xeb740ffa, 0xde14ea2c), - TOBN(0xc71ff913, 0xa8aef518), TOBN(0x7bfc74bb, 0xfff4cfa2), - TOBN(0x1716680c, 0xb6b36048), TOBN(0x121b2cce, 0x9ef79af1), - TOBN(0xbff3c836, 0xa01eb3d3), TOBN(0x50eb1c6a, 0x5f79077b), - TOBN(0xa48c32d6, 0xa004bbcf), TOBN(0x47a59316, 0x7d64f61d), - TOBN(0x6068147f, 0x93102016), TOBN(0x12c5f654, 0x94d12576), - TOBN(0xefb071a7, 0xc9bc6b91), TOBN(0x7c2da0c5, 0x6e23ea95), - TOBN(0xf4fd45b6, 0xd4a1dd5d), TOBN(0x3e7ad9b6, 0x9122b13c), - TOBN(0x342ca118, 0xe6f57a48), TOBN(0x1c2e94a7, 0x06f8288f), - TOBN(0x99e68f07, 0x5a97d231), TOBN(0x7c80de97, 0x4d838758), - TOBN(0xbce0f5d0, 0x05872727), TOBN(0xbe5d95c2, 0x19c4d016), - TOBN(0x921d5cb1, 0x9c2492ee), TOBN(0x42192dc1, 0x404d6fb3), - TOBN(0x4c84dcd1, 0x32f988d3), TOBN(0xde26d61f, 0xa17b8e85), - TOBN(0xc466dcb6, 0x137c7408), TOBN(0x9a38d7b6, 0x36a266da), - TOBN(0x7ef5cb06, 0x83bebf1b), TOBN(0xe5cdcbbf, 0x0fd014e3), - TOBN(0x30aa376d, 0xf65965a0), TOBN(0x60fe88c2, 0xebb3e95e), - TOBN(0x33fd0b61, 0x66ee6f20), TOBN(0x8827dcdb, 0x3f41f0a0), - TOBN(0xbf8a9d24, 0x0c56c690), TOBN(0x40265dad, 0xddb7641d), - TOBN(0x522b05bf, 0x3a6b662b), TOBN(0x466d1dfe, 0xb1478c9b), - TOBN(0xaa616962, 0x1484469b), TOBN(0x0db60549, 0x02df8f9f), - TOBN(0xc37bca02, 0x3cb8bf51), TOBN(0x5effe346, 0x21371ce8), - TOBN(0xe8f65264, 0xff112c32), TOBN(0x8a9c736d, 0x7b971fb2), - TOBN(0xa4f19470, 0x7b75080d), TOBN(0xfc3f2c5a, 0x8839c59b), - TOBN(0x1d6c777e, 0x5aeb49c2), TOBN(0xf3db034d, 0xda1addfe), - TOBN(0xd76fee5a, 0x5535affc), TOBN(0x0853ac70, 0xb92251fd), - TOBN(0x37e3d594, 0x8b2a29d5), TOBN(0x28f1f457, 0x4de00ddb), - TOBN(0x8083c1b5, 0xf42c328b), TOBN(0xd8ef1d8f, 0xe493c73b), - TOBN(0x96fb6260, 0x41dc61bd), TOBN(0xf74e8a9d, 0x27ee2f8a), - TOBN(0x7c605a80, 0x2c946a5d), TOBN(0xeed48d65, 0x3839ccfd), - TOBN(0x9894344f, 0x3a29467a), TOBN(0xde81e949, 0xc51eba6d), - TOBN(0xdaea066b, 0xa5e5c2f2), TOBN(0x3fc8a614, 0x08c8c7b3), - TOBN(0x7adff88f, 0x06d0de9f), TOBN(0xbbc11cf5, 0x3b75ce0a), - TOBN(0x9fbb7acc, 0xfbbc87d5), TOBN(0xa1458e26, 0x7badfde2)}, - {TOBN(0x1cb43668, 0xe039c256), TOBN(0x5f26fb8b, 0x7c17fd5d), - TOBN(0xeee426af, 0x79aa062b), TOBN(0x072002d0, 0xd78fbf04), - TOBN(0x4c9ca237, 0xe84fb7e3), TOBN(0xb401d8a1, 0x0c82133d), - TOBN(0xaaa52592, 0x6d7e4181), TOBN(0xe9430833, 0x73dbb152), - TOBN(0xf92dda31, 0xbe24319a), TOBN(0x03f7d28b, 0xe095a8e7), - TOBN(0xa52fe840, 0x98782185), TOBN(0x276ddafe, 0x29c24dbc), - TOBN(0x80cd5496, 0x1d7a64eb), TOBN(0xe4360889, 0x7f1dbe42), - TOBN(0x2f81a877, 0x8438d2d5), TOBN(0x7e4d52a8, 0x85169036), - TOBN(0x19e3d5b1, 0x1d59715d), TOBN(0xc7eaa762, 0xd788983e), - TOBN(0xe5a730b0, 0xabf1f248), TOBN(0xfbab8084, 0xfae3fd83), - TOBN(0x65e50d21, 0x53765b2f), TOBN(0xbdd4e083, 0xfa127f3d), - TOBN(0x9cf3c074, 0x397b1b10), TOBN(0x59f8090c, 0xb1b59fd3), - TOBN(0x7b15fd9d, 0x615faa8f), TOBN(0x8fa1eb40, 0x968554ed), - TOBN(0x7bb4447e, 0x7aa44882), TOBN(0x2bb2d0d1, 0x029fff32), - TOBN(0x075e2a64, 0x6caa6d2f), TOBN(0x8eb879de, 0x22e7351b), - TOBN(0xbcd5624e, 0x9a506c62), TOBN(0x218eaef0, 0xa87e24dc), - TOBN(0x37e56847, 0x44ddfa35), TOBN(0x9ccfc5c5, 0xdab3f747), - TOBN(0x9ac1df3f, 0x1ee96cf4), TOBN(0x0c0571a1, 0x3b480b8f), - TOBN(0x2fbeb3d5, 0x4b3a7b3c), TOBN(0x35c03669, 0x5dcdbb99), - TOBN(0x52a0f5dc, 0xb2415b3a), TOBN(0xd57759b4, 0x4413ed9a), - TOBN(0x1fe647d8, 0x3d30a2c5), TOBN(0x0857f77e, 0xf78a81dc), - TOBN(0x11d5a334, 0x131a4a9b), TOBN(0xc0a94af9, 0x29d393f5), - TOBN(0xbc3a5c0b, 0xdaa6ec1a), TOBN(0xba9fe493, 0x88d2d7ed), - TOBN(0xbb4335b4, 0xbb614797), TOBN(0x991c4d68, 0x72f83533), - TOBN(0x53258c28, 0xd2f01cb3), TOBN(0x93d6eaa3, 0xd75db0b1), - TOBN(0x419a2b0d, 0xe87d0db4), TOBN(0xa1e48f03, 0xd8fe8493), - TOBN(0xf747faf6, 0xc508b23a), TOBN(0xf137571a, 0x35d53549), - TOBN(0x9f5e58e2, 0xfcf9b838), TOBN(0xc7186cee, 0xa7fd3cf5), - TOBN(0x77b868ce, 0xe978a1d3), TOBN(0xe3a68b33, 0x7ab92d04), - TOBN(0x51029794, 0x87a5b862), TOBN(0x5f0606c3, 0x3a61d41d), - TOBN(0x2814be27, 0x6f9326f1), TOBN(0x2f521c14, 0xc6fe3c2e), - TOBN(0x17464d7d, 0xacdf7351), TOBN(0x10f5f9d3, 0x777f7e44), - TOBN(0xce8e616b, 0x269fb37d), TOBN(0xaaf73804, 0x7de62de5), - TOBN(0xaba11175, 0x4fdd4153), TOBN(0x515759ba, 0x3770b49b), - TOBN(0x8b09ebf8, 0xaa423a61), TOBN(0x592245a1, 0xcd41fb92), - TOBN(0x1cba8ec1, 0x9b4c8936), TOBN(0xa87e91e3, 0xaf36710e), - TOBN(0x1fd84ce4, 0x3d34a2e3), TOBN(0xee3759ce, 0xb43b5d61), - TOBN(0x895bc78c, 0x619186c7), TOBN(0xf19c3809, 0xcbb9725a), - TOBN(0xc0be21aa, 0xde744b1f), TOBN(0xa7d222b0, 0x60f8056b), - TOBN(0x74be6157, 0xb23efe11), TOBN(0x6fab2b4f, 0x0cd68253), - TOBN(0xad33ea5f, 0x4bf1d725), TOBN(0x9c1d8ee2, 0x4f6c950f), - TOBN(0x544ee78a, 0xa377af06), TOBN(0x54f489bb, 0x94a113e1), - TOBN(0x8f11d634, 0x992fb7e8), TOBN(0x0169a7aa, 0xa2a44347), - TOBN(0x1d49d4af, 0x95020e00), TOBN(0x95945722, 0xe08e120b), - TOBN(0xb6e33878, 0xa4d32282), TOBN(0xe36e029d, 0x48020ae7), - TOBN(0xe05847fb, 0x37a9b750), TOBN(0xf876812c, 0xb29e3819), - TOBN(0x84ad138e, 0xd23a17f0), TOBN(0x6d7b4480, 0xf0b3950e), - TOBN(0xdfa8aef4, 0x2fd67ae0), TOBN(0x8d3eea24, 0x52333af6), - TOBN(0x0d052075, 0xb15d5acc), TOBN(0xc6d9c79f, 0xbd815bc4), - TOBN(0x8dcafd88, 0xdfa36cf2), TOBN(0x908ccbe2, 0x38aa9070), - TOBN(0x638722c4, 0xba35afce), TOBN(0x5a3da8b0, 0xfd6abf0b), - TOBN(0x2dce252c, 0xc9c335c1), TOBN(0x84e7f0de, 0x65aa799b), - TOBN(0x2101a522, 0xb99a72cb), TOBN(0x06de6e67, 0x87618016), - TOBN(0x5ff8c7cd, 0xe6f3653e), TOBN(0x0a821ab5, 0xc7a6754a), - TOBN(0x7e3fa52b, 0x7cb0b5a2), TOBN(0xa7fb121c, 0xc9048790), - TOBN(0x1a725020, 0x06ce053a), TOBN(0xb490a31f, 0x04e929b0), - TOBN(0xe17be47d, 0x62dd61ad), TOBN(0x781a961c, 0x6be01371), - TOBN(0x1063bfd3, 0xdae3cbba), TOBN(0x35647406, 0x7f73c9ba), - TOBN(0xf50e957b, 0x2736a129), TOBN(0xa6313702, 0xed13f256), - TOBN(0x9436ee65, 0x3a19fcc5), TOBN(0xcf2bdb29, 0xe7a4c8b6), - TOBN(0xb06b1244, 0xc5f95cd8), TOBN(0xda8c8af0, 0xf4ab95f4), - TOBN(0x1bae59c2, 0xb9e5836d), TOBN(0x07d51e7e, 0x3acffffc), - TOBN(0x01e15e6a, 0xc2ccbcda), TOBN(0x3bc1923f, 0x8528c3e0), - TOBN(0x43324577, 0xa49fead4), TOBN(0x61a1b884, 0x2aa7a711), - TOBN(0xf9a86e08, 0x700230ef), TOBN(0x0af585a1, 0xbd19adf8), - TOBN(0x7645f361, 0xf55ad8f2), TOBN(0x6e676223, 0x46c3614c), - TOBN(0x23cb257c, 0x4e774d3f), TOBN(0x82a38513, 0xac102d1b), - TOBN(0x9bcddd88, 0x7b126aa5), TOBN(0xe716998b, 0xeefd3ee4), - TOBN(0x4239d571, 0xfb167583), TOBN(0xdd011c78, 0xd16c8f8a), - TOBN(0x271c2895, 0x69a27519), TOBN(0x9ce0a3b7, 0xd2d64b6a), - TOBN(0x8c977289, 0xd5ec6738), TOBN(0xa3b49f9a, 0x8840ef6b), - TOBN(0x808c14c9, 0x9a453419), TOBN(0x5c00295b, 0x0cf0a2d5), - TOBN(0x524414fb, 0x1d4bcc76), TOBN(0xb07691d2, 0x459a88f1), - TOBN(0x77f43263, 0xf70d110f), TOBN(0x64ada5e0, 0xb7abf9f3), - TOBN(0xafd0f94e, 0x5b544cf5), TOBN(0xb4a13a15, 0xfd2713fe), - TOBN(0xb99b7d6e, 0x250c74f4), TOBN(0x097f2f73, 0x20324e45), - TOBN(0x994b37d8, 0xaffa8208), TOBN(0xc3c31b0b, 0xdc29aafc), - TOBN(0x3da74651, 0x7a3a607f), TOBN(0xd8e1b8c1, 0xfe6955d6), - TOBN(0x716e1815, 0xc8418682), TOBN(0x541d487f, 0x7dc91d97), - TOBN(0x48a04669, 0xc6996982), TOBN(0xf39cab15, 0x83a6502e), - TOBN(0x025801a0, 0xe68db055), TOBN(0xf3569758, 0xba3338d5), - TOBN(0xb0c8c0aa, 0xee2afa84), TOBN(0x4f6985d3, 0xfb6562d1), - TOBN(0x351f1f15, 0x132ed17a), TOBN(0x510ed0b4, 0xc04365fe), - TOBN(0xa3f98138, 0xe5b1f066), TOBN(0xbc9d95d6, 0x32df03dc), - TOBN(0xa83ccf6e, 0x19abd09e), TOBN(0x0b4097c1, 0x4ff17edb), - TOBN(0x58a5c478, 0xd64a06ce), TOBN(0x2ddcc3fd, 0x544a58fd), - TOBN(0xd449503d, 0x9e8153b8), TOBN(0x3324fd02, 0x7774179b), - TOBN(0xaf5d47c8, 0xdbd9120c), TOBN(0xeb860162, 0x34fa94db), - TOBN(0x5817bdd1, 0x972f07f4), TOBN(0xe5579e2e, 0xd27bbceb), - TOBN(0x86847a1f, 0x5f11e5a6), TOBN(0xb39ed255, 0x7c3cf048), - TOBN(0xe1076417, 0xa2f62e55), TOBN(0x6b9ab38f, 0x1bcf82a2), - TOBN(0x4bb7c319, 0x7aeb29f9), TOBN(0xf6d17da3, 0x17227a46), - TOBN(0xab53ddbd, 0x0f968c00), TOBN(0xa03da7ec, 0x000c880b), - TOBN(0x7b239624, 0x6a9ad24d), TOBN(0x612c0401, 0x01ec60d0), - TOBN(0x70d10493, 0x109f5df1), TOBN(0xfbda4030, 0x80af7550), - TOBN(0x30b93f95, 0xc6b9a9b3), TOBN(0x0c74ec71, 0x007d9418), - TOBN(0x94175564, 0x6edb951f), TOBN(0x5f4a9d78, 0x7f22c282), - TOBN(0xb7870895, 0xb38d1196), TOBN(0xbc593df3, 0xa228ce7c), - TOBN(0xc78c5bd4, 0x6af3641a), TOBN(0x7802200b, 0x3d9b3dcc), - TOBN(0x0dc73f32, 0x8be33304), TOBN(0x847ed87d, 0x61ffb79a), - TOBN(0xf85c974e, 0x6d671192), TOBN(0x1e14100a, 0xde16f60f), - TOBN(0x45cb0d5a, 0x95c38797), TOBN(0x18923bba, 0x9b022da4), - TOBN(0xef2be899, 0xbbe7e86e), TOBN(0x4a1510ee, 0x216067bf), - TOBN(0xd98c8154, 0x84d5ce3e), TOBN(0x1af777f0, 0xf92a2b90), - TOBN(0x9fbcb400, 0x4ef65724), TOBN(0x3e04a4c9, 0x3c0ca6fe), - TOBN(0xfb3e2cb5, 0x55002994), TOBN(0x1f3a93c5, 0x5363ecab), - TOBN(0x1fe00efe, 0x3923555b), TOBN(0x744bedd9, 0x1e1751ea), - TOBN(0x3fb2db59, 0x6ab69357), TOBN(0x8dbd7365, 0xf5e6618b), - TOBN(0x99d53099, 0xdf1ea40e), TOBN(0xb3f24a0b, 0x57d61e64), - TOBN(0xd088a198, 0x596eb812), TOBN(0x22c8361b, 0x5762940b), - TOBN(0x66f01f97, 0xf9c0d95c), TOBN(0x88461172, 0x8e43cdae), - TOBN(0x11599a7f, 0xb72b15c3), TOBN(0x135a7536, 0x420d95cc), - TOBN(0x2dcdf0f7, 0x5f7ae2f6), TOBN(0x15fc6e1d, 0xd7fa6da2), - TOBN(0x81ca829a, 0xd1d441b6), TOBN(0x84c10cf8, 0x04a106b6), - TOBN(0xa9b26c95, 0xa73fbbd0), TOBN(0x7f24e0cb, 0x4d8f6ee8), - TOBN(0x48b45937, 0x1e25a043), TOBN(0xf8a74fca, 0x036f3dfe), - TOBN(0x1ed46585, 0xc9f84296), TOBN(0x7fbaa8fb, 0x3bc278b0), - TOBN(0xa8e96cd4, 0x6c4fcbd0), TOBN(0x940a1202, 0x73b60a5f), - TOBN(0x34aae120, 0x55a4aec8), TOBN(0x550e9a74, 0xdbd742f0), - TOBN(0x794456d7, 0x228c68ab), TOBN(0x492f8868, 0xa4e25ec6), - TOBN(0x682915ad, 0xb2d8f398), TOBN(0xf13b51cc, 0x5b84c953), - TOBN(0xcda90ab8, 0x5bb917d6), TOBN(0x4b615560, 0x4ea3dee1), - TOBN(0x578b4e85, 0x0a52c1c8), TOBN(0xeab1a695, 0x20b75fc4), - TOBN(0x60c14f3c, 0xaa0bb3c6), TOBN(0x220f448a, 0xb8216094), - TOBN(0x4fe7ee31, 0xb0e63d34), TOBN(0xf4600572, 0xa9e54fab), - TOBN(0xc0493334, 0xd5e7b5a4), TOBN(0x8589fb92, 0x06d54831), - TOBN(0xaa70f5cc, 0x6583553a), TOBN(0x0879094a, 0xe25649e5), - TOBN(0xcc904507, 0x10044652), TOBN(0xebb0696d, 0x02541c4f), - TOBN(0x5a171fde, 0xb9718710), TOBN(0x38f1bed8, 0xf374a9f5), - TOBN(0xc8c582e1, 0xba39bdc1), TOBN(0xfc457b0a, 0x908cc0ce), - TOBN(0x9a187fd4, 0x883841e2), TOBN(0x8ec25b39, 0x38725381), - TOBN(0x2553ed05, 0x96f84395), TOBN(0x095c7661, 0x6f6c6897), - TOBN(0x917ac85c, 0x4bdc5610), TOBN(0xb2885fe4, 0x179eb301), - TOBN(0x5fc65547, 0x8b78bdcc), TOBN(0x4a9fc893, 0xe59e4699), - TOBN(0xbb7ff0cd, 0x3ce299af), TOBN(0x195be9b3, 0xadf38b20), - TOBN(0x6a929c87, 0xd38ddb8f), TOBN(0x55fcc99c, 0xb21a51b9), - TOBN(0x2b695b4c, 0x721a4593), TOBN(0xed1e9a15, 0x768eaac2), - TOBN(0xfb63d71c, 0x7489f914), TOBN(0xf98ba31c, 0x78118910), - TOBN(0x80291373, 0x9b128eb4), TOBN(0x7801214e, 0xd448af4a), - TOBN(0xdbd2e22b, 0x55418dd3), TOBN(0xeffb3c0d, 0xd3998242), - TOBN(0xdfa6077c, 0xc7bf3827), TOBN(0xf2165bcb, 0x47f8238f), - TOBN(0xfe37cf68, 0x8564d554), TOBN(0xe5f825c4, 0x0a81fb98), - TOBN(0x43cc4f67, 0xffed4d6f), TOBN(0xbc609578, 0xb50a34b0), - TOBN(0x8aa8fcf9, 0x5041faf1), TOBN(0x5659f053, 0x651773b6), - TOBN(0xe87582c3, 0x6044d63b), TOBN(0xa6089409, 0x0cdb0ca0), - TOBN(0x8c993e0f, 0xbfb2bcf6), TOBN(0xfc64a719, 0x45985cfc), - TOBN(0x15c4da80, 0x83dbedba), TOBN(0x804ae112, 0x2be67df7), - TOBN(0xda4c9658, 0xa23defde), TOBN(0x12002ddd, 0x5156e0d3), - TOBN(0xe68eae89, 0x5dd21b96), TOBN(0x8b99f28b, 0xcf44624d), - TOBN(0x0ae00808, 0x1ec8897a), TOBN(0xdd0a9303, 0x6712f76e), - TOBN(0x96237522, 0x4e233de4), TOBN(0x192445b1, 0x2b36a8a5), - TOBN(0xabf9ff74, 0x023993d9), TOBN(0x21f37bf4, 0x2aad4a8f), - TOBN(0x340a4349, 0xf8bd2bbd), TOBN(0x1d902cd9, 0x4868195d), - TOBN(0x3d27bbf1, 0xe5fdb6f1), TOBN(0x7a5ab088, 0x124f9f1c), - TOBN(0xc466ab06, 0xf7a09e03), TOBN(0x2f8a1977, 0x31f2c123), - TOBN(0xda355dc7, 0x041b6657), TOBN(0xcb840d12, 0x8ece2a7c), - TOBN(0xb600ad9f, 0x7db32675), TOBN(0x78fea133, 0x07a06f1b), - TOBN(0x5d032269, 0xb31f6094), TOBN(0x07753ef5, 0x83ec37aa), - TOBN(0x03485aed, 0x9c0bea78), TOBN(0x41bb3989, 0xbc3f4524), - TOBN(0x09403761, 0x697f726d), TOBN(0x6109beb3, 0xdf394820), - TOBN(0x804111ea, 0x3b6d1145), TOBN(0xb6271ea9, 0xa8582654), - TOBN(0x619615e6, 0x24e66562), TOBN(0xa2554945, 0xd7b6ad9c), - TOBN(0xd9c4985e, 0x99bfe35f), TOBN(0x9770ccc0, 0x7b51cdf6), - TOBN(0x7c327013, 0x92881832), TOBN(0x8777d45f, 0x286b26d1), - TOBN(0x9bbeda22, 0xd847999d), TOBN(0x03aa33b6, 0xc3525d32), - TOBN(0x4b7b96d4, 0x28a959a1), TOBN(0xbb3786e5, 0x31e5d234), - TOBN(0xaeb5d3ce, 0x6961f247), TOBN(0x20aa85af, 0x02f93d3f), - TOBN(0x9cd1ad3d, 0xd7a7ae4f), TOBN(0xbf6688f0, 0x781adaa8), - TOBN(0xb1b40e86, 0x7469cead), TOBN(0x1904c524, 0x309fca48), - TOBN(0x9b7312af, 0x4b54bbc7), TOBN(0xbe24bf8f, 0x593affa2), - TOBN(0xbe5e0790, 0xbd98764b), TOBN(0xa0f45f17, 0xa26e299e), - TOBN(0x4af0d2c2, 0x6b8fe4c7), TOBN(0xef170db1, 0x8ae8a3e6), - TOBN(0x0e8d61a0, 0x29e0ccc1), TOBN(0xcd53e87e, 0x60ad36ca), - TOBN(0x328c6623, 0xc8173822), TOBN(0x7ee1767d, 0xa496be55), - TOBN(0x89f13259, 0x648945af), TOBN(0x9e45a5fd, 0x25c8009c), - TOBN(0xaf2febd9, 0x1f61ab8c), TOBN(0x43f6bc86, 0x8a275385), - TOBN(0x87792348, 0xf2142e79), TOBN(0x17d89259, 0xc6e6238a), - TOBN(0x7536d2f6, 0x4a839d9b), TOBN(0x1f428fce, 0x76a1fbdc), - TOBN(0x1c109601, 0x0db06dfe), TOBN(0xbfc16bc1, 0x50a3a3cc), - TOBN(0xf9cbd9ec, 0x9b30f41b), TOBN(0x5b5da0d6, 0x00138cce), - TOBN(0xec1d0a48, 0x56ef96a7), TOBN(0xb47eb848, 0x982bf842), - TOBN(0x66deae32, 0xec3f700d), TOBN(0x4e43c42c, 0xaa1181e0), - TOBN(0xa1d72a31, 0xd1a4aa2a), TOBN(0x440d4668, 0xc004f3ce), - TOBN(0x0d6a2d3b, 0x45fe8a7a), TOBN(0x820e52e2, 0xfb128365), - TOBN(0x29ac5fcf, 0x25e51b09), TOBN(0x180cd2bf, 0x2023d159), - TOBN(0xa9892171, 0xa1ebf90e), TOBN(0xf97c4c87, 0x7c132181), - TOBN(0x9f1dc724, 0xc03dbb7e), TOBN(0xae043765, 0x018cbbe4), - TOBN(0xfb0b2a36, 0x0767d153), TOBN(0xa8e2f4d6, 0x249cbaeb), - TOBN(0x172a5247, 0xd95ea168), TOBN(0x1758fada, 0x2970764a), - TOBN(0xac803a51, 0x1d978169), TOBN(0x299cfe2e, 0xde77e01b), - TOBN(0x652a1e17, 0xb0a98927), TOBN(0x2e26e1d1, 0x20014495), - TOBN(0x7ae0af9f, 0x7175b56a), TOBN(0xc2e22a80, 0xd64b9f95), - TOBN(0x4d0ff9fb, 0xd90a060a), TOBN(0x496a27db, 0xbaf38085), - TOBN(0x32305401, 0xda776bcf), TOBN(0xb8cdcef6, 0x725f209e), - TOBN(0x61ba0f37, 0x436a0bba), TOBN(0x263fa108, 0x76860049), - TOBN(0x92beb98e, 0xda3542cf), TOBN(0xa2d4d14a, 0xd5849538), - TOBN(0x989b9d68, 0x12e9a1bc), TOBN(0x61d9075c, 0x5f6e3268), - TOBN(0x352c6aa9, 0x99ace638), TOBN(0xde4e4a55, 0x920f43ff), - TOBN(0xe5e4144a, 0xd673c017), TOBN(0x667417ae, 0x6f6e05ea), - TOBN(0x613416ae, 0xdcd1bd56), TOBN(0x5eb36201, 0x86693711), - TOBN(0x2d7bc504, 0x3a1aa914), TOBN(0x175a1299, 0x76dc5975), - TOBN(0xe900e0f2, 0x3fc8125c), TOBN(0x569ef68c, 0x11198875), - TOBN(0x9012db63, 0x63a113b4), TOBN(0xe3bd3f56, 0x98835766), - TOBN(0xa5c94a52, 0x76412dea), TOBN(0xad9e2a09, 0xaa735e5c), - TOBN(0x405a984c, 0x508b65e9), TOBN(0xbde4a1d1, 0x6df1a0d1), - TOBN(0x1a9433a1, 0xdfba80da), TOBN(0xe9192ff9, 0x9440ad2e), - TOBN(0x9f649696, 0x5099fe92), TOBN(0x25ddb65c, 0x0b27a54a), - TOBN(0x178279dd, 0xc590da61), TOBN(0x5479a999, 0xfbde681a), - TOBN(0xd0e84e05, 0x013fe162), TOBN(0xbe11dc92, 0x632d471b), - TOBN(0xdf0b0c45, 0xfc0e089f), TOBN(0x04fb15b0, 0x4c144025), - TOBN(0xa61d5fc2, 0x13c99927), TOBN(0xa033e9e0, 0x3de2eb35), - TOBN(0xf8185d5c, 0xb8dacbb4), TOBN(0x9a88e265, 0x8644549d), - TOBN(0xf717af62, 0x54671ff6), TOBN(0x4bd4241b, 0x5fa58603), - TOBN(0x06fba40b, 0xe67773c0), TOBN(0xc1d933d2, 0x6a2847e9), - TOBN(0xf4f5acf3, 0x689e2c70), TOBN(0x92aab0e7, 0x46bafd31), - TOBN(0x798d76aa, 0x3473f6e5), TOBN(0xcc6641db, 0x93141934), - TOBN(0xcae27757, 0xd31e535e), TOBN(0x04cc43b6, 0x87c2ee11), - TOBN(0x8d1f9675, 0x2e029ffa), TOBN(0xc2150672, 0xe4cc7a2c), - TOBN(0x3b03c1e0, 0x8d68b013), TOBN(0xa9d6816f, 0xedf298f3), - TOBN(0x1bfbb529, 0xa2804464), TOBN(0x95a52fae, 0x5db22125), - TOBN(0x55b32160, 0x0e1cb64e), TOBN(0x004828f6, 0x7e7fc9fe), - TOBN(0x13394b82, 0x1bb0fb93), TOBN(0xb6293a2d, 0x35f1a920), - TOBN(0xde35ef21, 0xd145d2d9), TOBN(0xbe6225b3, 0xbb8fa603), - TOBN(0x00fc8f6b, 0x32cf252d), TOBN(0xa28e52e6, 0x117cf8c2), - TOBN(0x9d1dc89b, 0x4c371e6d), TOBN(0xcebe0675, 0x36ef0f28), - TOBN(0x5de05d09, 0xa4292f81), TOBN(0xa8303593, 0x353e3083), - TOBN(0xa1715b0a, 0x7e37a9bb), TOBN(0x8c56f61e, 0x2b8faec3), - TOBN(0x52507431, 0x33c9b102), TOBN(0x0130cefc, 0xa44431f0), - TOBN(0x56039fa0, 0xbd865cfb), TOBN(0x4b03e578, 0xbc5f1dd7), - TOBN(0x40edf2e4, 0xbabe7224), TOBN(0xc752496d, 0x3a1988f6), - TOBN(0xd1572d3b, 0x564beb6b), TOBN(0x0db1d110, 0x39a1c608), - TOBN(0x568d1934, 0x16f60126), TOBN(0x05ae9668, 0xf354af33), - TOBN(0x19de6d37, 0xc92544f2), TOBN(0xcc084353, 0xa35837d5), - TOBN(0xcbb6869c, 0x1a514ece), TOBN(0xb633e728, 0x2e1d1066), - TOBN(0xf15dd69f, 0x936c581c), TOBN(0x96e7b8ce, 0x7439c4f9), - TOBN(0x5e676f48, 0x2e448a5b), TOBN(0xb2ca7d5b, 0xfd916bbb), - TOBN(0xd55a2541, 0xf5024025), TOBN(0x47bc5769, 0xe4c2d937), - TOBN(0x7d31b92a, 0x0362189f), TOBN(0x83f3086e, 0xef7816f9), - TOBN(0xf9f46d94, 0xb587579a), TOBN(0xec2d22d8, 0x30e76c5f), - TOBN(0x27d57461, 0xb000ffcf), TOBN(0xbb7e65f9, 0x364ffc2c), - TOBN(0x7c7c9477, 0x6652a220), TOBN(0x61618f89, 0xd696c981), - TOBN(0x5021701d, 0x89effff3), TOBN(0xf2c8ff8e, 0x7c314163), - TOBN(0x2da413ad, 0x8efb4d3e), TOBN(0x937b5adf, 0xce176d95), - TOBN(0x22867d34, 0x2a67d51c), TOBN(0x262b9b10, 0x18eb3ac9), - TOBN(0x4e314fe4, 0xc43ff28b), TOBN(0x76476627, 0x6a664e7a), - TOBN(0x3e90e40b, 0xb7a565c2), TOBN(0x8588993a, 0xc1acf831), - TOBN(0xd7b501d6, 0x8f938829), TOBN(0x996627ee, 0x3edd7d4c), - TOBN(0x37d44a62, 0x90cd34c7), TOBN(0xa8327499, 0xf3833e8d), - TOBN(0x2e18917d, 0x4bf50353), TOBN(0x85dd726b, 0x556765fb), - TOBN(0x54fe65d6, 0x93d5ab66), TOBN(0x3ddbaced, 0x915c25fe), - TOBN(0xa799d9a4, 0x12f22e85), TOBN(0xe2a24867, 0x6d06f6bc), - TOBN(0xf4f1ee56, 0x43ca1637), TOBN(0xfda2828b, 0x61ece30a), - TOBN(0x758c1a3e, 0xa2dee7a6), TOBN(0xdcde2f3c, 0x734b2284), - TOBN(0xaba445d2, 0x4eaba6ad), TOBN(0x35aaf668, 0x76cee0a7), - TOBN(0x7e0b04a9, 0xe5aa049a), TOBN(0xe74083ad, 0x91103e84), - TOBN(0xbeb183ce, 0x40afecc3), TOBN(0x6b89de9f, 0xea043f7a)}, - {TOBN(0x0e299d23, 0xfe67ba66), TOBN(0x91450760, 0x93cf2f34), - TOBN(0xf45b5ea9, 0x97fcf913), TOBN(0x5be00843, 0x8bd7ddda), - TOBN(0x358c3e05, 0xd53ff04d), TOBN(0xbf7ccdc3, 0x5de91ef7), - TOBN(0xad684dbf, 0xb69ec1a0), TOBN(0x367e7cf2, 0x801fd997), - TOBN(0x0ca1f3b7, 0xb0dc8595), TOBN(0x27de4608, 0x9f1d9f2e), - TOBN(0x1af3bf39, 0xbadd82a7), TOBN(0x79356a79, 0x65862448), - TOBN(0xc0602345, 0xf5f9a052), TOBN(0x1a8b0f89, 0x139a42f9), - TOBN(0xb53eee42, 0x844d40fc), TOBN(0x93b0bfe5, 0x4e5b6368), - TOBN(0x5434dd02, 0xc024789c), TOBN(0x90dca9ea, 0x41b57bfc), - TOBN(0x8aa898e2, 0x243398df), TOBN(0xf607c834, 0x894a94bb), - TOBN(0xbb07be97, 0xc2c99b76), TOBN(0x6576ba67, 0x18c29302), - TOBN(0x3d79efcc, 0xe703a88c), TOBN(0xf259ced7, 0xb6a0d106), - TOBN(0x0f893a5d, 0xc8de610b), TOBN(0xe8c515fb, 0x67e223ce), - TOBN(0x7774bfa6, 0x4ead6dc5), TOBN(0x89d20f95, 0x925c728f), - TOBN(0x7a1e0966, 0x098583ce), TOBN(0xa2eedb94, 0x93f2a7d7), - TOBN(0x1b282097, 0x4c304d4a), TOBN(0x0842e3da, 0xc077282d), - TOBN(0xe4d972a3, 0x3b9e2d7b), TOBN(0x7cc60b27, 0xc48218ff), - TOBN(0x8fc70838, 0x84149d91), TOBN(0x5c04346f, 0x2f461ecc), - TOBN(0xebe9fdf2, 0x614650a9), TOBN(0x5e35b537, 0xc1f666ac), - TOBN(0x645613d1, 0x88babc83), TOBN(0x88cace3a, 0xc5e1c93e), - TOBN(0x209ca375, 0x3de92e23), TOBN(0xccb03cc8, 0x5fbbb6e3), - TOBN(0xccb90f03, 0xd7b1487e), TOBN(0xfa9c2a38, 0xc710941f), - TOBN(0x756c3823, 0x6724ceed), TOBN(0x3a902258, 0x192d0323), - TOBN(0xb150e519, 0xea5e038e), TOBN(0xdcba2865, 0xc7427591), - TOBN(0xe549237f, 0x78890732), TOBN(0xc443bef9, 0x53fcb4d9), - TOBN(0x9884d8a6, 0xeb3480d6), TOBN(0x8a35b6a1, 0x3048b186), - TOBN(0xb4e44716, 0x65e9a90a), TOBN(0x45bf380d, 0x653006c0), - TOBN(0x8f3f820d, 0x4fe9ae3b), TOBN(0x244a35a0, 0x979a3b71), - TOBN(0xa1010e9d, 0x74cd06ff), TOBN(0x9c17c7df, 0xaca3eeac), - TOBN(0x74c86cd3, 0x8063aa2b), TOBN(0x8595c4b3, 0x734614ff), - TOBN(0xa3de00ca, 0x990f62cc), TOBN(0xd9bed213, 0xca0c3be5), - TOBN(0x7886078a, 0xdf8ce9f5), TOBN(0xddb27ce3, 0x5cd44444), - TOBN(0xed374a66, 0x58926ddd), TOBN(0x138b2d49, 0x908015b8), - TOBN(0x886c6579, 0xde1f7ab8), TOBN(0x888b9aa0, 0xc3020b7a), - TOBN(0xd3ec034e, 0x3a96e355), TOBN(0xba65b0b8, 0xf30fbe9a), - TOBN(0x064c8e50, 0xff21367a), TOBN(0x1f508ea4, 0x0b04b46e), - TOBN(0x98561a49, 0x747c866c), TOBN(0xbbb1e5fe, 0x0518a062), - TOBN(0x20ff4e8b, 0xecdc3608), TOBN(0x7f55cded, 0x20184027), - TOBN(0x8d73ec95, 0xf38c85f0), TOBN(0x5b589fdf, 0x8bc3b8c3), - TOBN(0xbe95dd98, 0x0f12b66f), TOBN(0xf5bd1a09, 0x0e338e01), - TOBN(0x65163ae5, 0x5e915918), TOBN(0x6158d6d9, 0x86f8a46b), - TOBN(0x8466b538, 0xeeebf99c), TOBN(0xca8761f6, 0xbca477ef), - TOBN(0xaf3449c2, 0x9ebbc601), TOBN(0xef3b0f41, 0xe0c3ae2f), - TOBN(0xaa6c577d, 0x5de63752), TOBN(0xe9166601, 0x64682a51), - TOBN(0x5a3097be, 0xfc15aa1e), TOBN(0x40d12548, 0xb54b0745), - TOBN(0x5bad4706, 0x519a5f12), TOBN(0xed03f717, 0xa439dee6), - TOBN(0x0794bb6c, 0x4a02c499), TOBN(0xf725083d, 0xcffe71d2), - TOBN(0x2cad7519, 0x0f3adcaf), TOBN(0x7f68ea1c, 0x43729310), - TOBN(0xe747c8c7, 0xb7ffd977), TOBN(0xec104c35, 0x80761a22), - TOBN(0x8395ebaf, 0x5a3ffb83), TOBN(0xfb3261f4, 0xe4b63db7), - TOBN(0x53544960, 0xd883e544), TOBN(0x13520d70, 0x8cc2eeb8), - TOBN(0x08f6337b, 0xd3d65f99), TOBN(0x83997db2, 0x781cf95b), - TOBN(0xce6ff106, 0x0dbd2c01), TOBN(0x4f8eea6b, 0x1f9ce934), - TOBN(0x546f7c4b, 0x0e993921), TOBN(0x6236a324, 0x5e753fc7), - TOBN(0x65a41f84, 0xa16022e9), TOBN(0x0c18d878, 0x43d1dbb2), - TOBN(0x73c55640, 0x2d4cef9c), TOBN(0xa0428108, 0x70444c74), - TOBN(0x68e4f15e, 0x9afdfb3c), TOBN(0x49a56143, 0x5bdfb6df), - TOBN(0xa9bc1bd4, 0x5f823d97), TOBN(0xbceb5970, 0xea111c2a), - TOBN(0x366b455f, 0xb269bbc4), TOBN(0x7cd85e1e, 0xe9bc5d62), - TOBN(0xc743c41c, 0x4f18b086), TOBN(0xa4b40990, 0x95294fb9), - TOBN(0x9c7c581d, 0x26ee8382), TOBN(0xcf17dcc5, 0x359d638e), - TOBN(0xee8273ab, 0xb728ae3d), TOBN(0x1d112926, 0xf821f047), - TOBN(0x11498477, 0x50491a74), TOBN(0x687fa761, 0xfde0dfb9), - TOBN(0x2c258022, 0x7ea435ab), TOBN(0x6b8bdb94, 0x91ce7e3f), - TOBN(0x4c5b5dc9, 0x3bf834aa), TOBN(0x04371819, 0x4f6c7e4b), - TOBN(0xc284e00a, 0x3736bcad), TOBN(0x0d881118, 0x21ae8f8d), - TOBN(0xf9cf0f82, 0xf48c8e33), TOBN(0xa11fd075, 0xa1bf40db), - TOBN(0xdceab0de, 0xdc2733e5), TOBN(0xc560a8b5, 0x8e986bd7), - TOBN(0x48dd1fe2, 0x3929d097), TOBN(0x3885b290, 0x92f188f1), - TOBN(0x0f2ae613, 0xda6fcdac), TOBN(0x9054303e, 0xb662a46c), - TOBN(0xb6871e44, 0x0738042a), TOBN(0x98e6a977, 0xbdaf6449), - TOBN(0xd8bc0650, 0xd1c9df1b), TOBN(0xef3d6451, 0x36e098f9), - TOBN(0x03fbae82, 0xb6d72d28), TOBN(0x77ca9db1, 0xf5d84080), - TOBN(0x8a112cff, 0xa58efc1c), TOBN(0x518d761c, 0xc564cb4a), - TOBN(0x69b5740e, 0xf0d1b5ce), TOBN(0x717039cc, 0xe9eb1785), - TOBN(0x3fe29f90, 0x22f53382), TOBN(0x8e54ba56, 0x6bc7c95c), - TOBN(0x9c806d8a, 0xf7f91d0f), TOBN(0x3b61b0f1, 0xa82a5728), - TOBN(0x4640032d, 0x94d76754), TOBN(0x273eb5de, 0x47d834c6), - TOBN(0x2988abf7, 0x7b4e4d53), TOBN(0xb7ce66bf, 0xde401777), - TOBN(0x9fba6b32, 0x715071b3), TOBN(0x82413c24, 0xad3a1a98), - TOBN(0x5b7fc8c4, 0xe0e8ad93), TOBN(0xb5679aee, 0x5fab868d), - TOBN(0xb1f9d2fa, 0x2b3946f3), TOBN(0x458897dc, 0x5685b50a), - TOBN(0x1e98c930, 0x89d0caf3), TOBN(0x39564c5f, 0x78642e92), - TOBN(0x1b77729a, 0x0dbdaf18), TOBN(0xf9170722, 0x579e82e6), - TOBN(0x680c0317, 0xe4515fa5), TOBN(0xf85cff84, 0xfb0c790f), - TOBN(0xc7a82aab, 0x6d2e0765), TOBN(0x7446bca9, 0x35c82b32), - TOBN(0x5de607aa, 0x6d63184f), TOBN(0x7c1a46a8, 0x262803a6), - TOBN(0xd218313d, 0xaebe8035), TOBN(0x92113ffd, 0xc73c51f8), - TOBN(0x4b38e083, 0x12e7e46c), TOBN(0x69d0a37a, 0x56126bd5), - TOBN(0xfb3f324b, 0x73c07e04), TOBN(0xa0c22f67, 0x8fda7267), - TOBN(0x8f2c0051, 0x4d2c7d8f), TOBN(0xbc45ced3, 0xcbe2cae5), - TOBN(0xe1c6cf07, 0xa8f0f277), TOBN(0xbc392312, 0x1eb99a98), - TOBN(0x75537b7e, 0x3cc8ac85), TOBN(0x8d725f57, 0xdd02753b), - TOBN(0xfd05ff64, 0xb737df2f), TOBN(0x55fe8712, 0xf6d2531d), - TOBN(0x57ce04a9, 0x6ab6b01c), TOBN(0x69a02a89, 0x7cd93724), - TOBN(0x4f82ac35, 0xcf86699b), TOBN(0x8242d3ad, 0x9cb4b232), - TOBN(0x713d0f65, 0xd62105e5), TOBN(0xbb222bfa, 0x2d29be61), - TOBN(0xf2f9a79e, 0x6cfbef09), TOBN(0xfc24d8d3, 0xd5d6782f), - TOBN(0x5db77085, 0xd4129967), TOBN(0xdb81c3cc, 0xdc3c2a43), - TOBN(0x9d655fc0, 0x05d8d9a3), TOBN(0x3f5d057a, 0x54298026), - TOBN(0x1157f56d, 0x88c54694), TOBN(0xb26baba5, 0x9b09573e), - TOBN(0x2cab03b0, 0x22adffd1), TOBN(0x60a412c8, 0xdd69f383), - TOBN(0xed76e98b, 0x54b25039), TOBN(0xd4ee67d3, 0x687e714d), - TOBN(0x87739648, 0x7b00b594), TOBN(0xce419775, 0xc9ef709b), - TOBN(0x40f76f85, 0x1c203a40), TOBN(0x30d352d6, 0xeafd8f91), - TOBN(0xaf196d3d, 0x95578dd2), TOBN(0xea4bb3d7, 0x77cc3f3d), - TOBN(0x42a5bd03, 0xb98e782b), TOBN(0xac958c40, 0x0624920d), - TOBN(0xb838134c, 0xfc56fcc8), TOBN(0x86ec4ccf, 0x89572e5e), - TOBN(0x69c43526, 0x9be47be0), TOBN(0x323b7dd8, 0xcb28fea1), - TOBN(0xfa5538ba, 0x3a6c67e5), TOBN(0xef921d70, 0x1d378e46), - TOBN(0xf92961fc, 0x3c4b880e), TOBN(0x3f6f914e, 0x98940a67), - TOBN(0xa990eb0a, 0xfef0ff39), TOBN(0xa6c2920f, 0xf0eeff9c), - TOBN(0xca804166, 0x51b8d9a3), TOBN(0x42531bc9, 0x0ffb0db1), - TOBN(0x72ce4718, 0xaa82e7ce), TOBN(0x6e199913, 0xdf574741), - TOBN(0xd5f1b13d, 0xd5d36946), TOBN(0x8255dc65, 0xf68f0194), - TOBN(0xdc9df4cd, 0x8710d230), TOBN(0x3453c20f, 0x138c1988), - TOBN(0x9af98dc0, 0x89a6ef01), TOBN(0x4dbcc3f0, 0x9857df85), - TOBN(0x34805601, 0x5c1ad924), TOBN(0x40448da5, 0xd0493046), - TOBN(0xf629926d, 0x4ee343e2), TOBN(0x6343f1bd, 0x90e8a301), - TOBN(0xefc93491, 0x40815b3f), TOBN(0xf882a423, 0xde8f66fb), - TOBN(0x3a12d5f4, 0xe7db9f57), TOBN(0x7dfba38a, 0x3c384c27), - TOBN(0x7a904bfd, 0x6fc660b1), TOBN(0xeb6c5db3, 0x2773b21c), - TOBN(0xc350ee66, 0x1cdfe049), TOBN(0x9baac0ce, 0x44540f29), - TOBN(0xbc57b6ab, 0xa5ec6aad), TOBN(0x167ce8c3, 0x0a7c1baa), - TOBN(0xb23a03a5, 0x53fb2b56), TOBN(0x6ce141e7, 0x4e057f78), - TOBN(0x796525c3, 0x89e490d9), TOBN(0x0bc95725, 0xa31a7e75), - TOBN(0x1ec56791, 0x1220fd06), TOBN(0x716e3a3c, 0x408b0bd6), - TOBN(0x31cd6bf7, 0xe8ebeba9), TOBN(0xa7326ca6, 0xbee6b670), - TOBN(0x3d9f851c, 0xcd090c43), TOBN(0x561e8f13, 0xf12c3988), - TOBN(0x50490b6a, 0x904b7be4), TOBN(0x61690ce1, 0x0410737b), - TOBN(0x299e9a37, 0x0f009052), TOBN(0x258758f0, 0xf026092e), - TOBN(0x9fa255f3, 0xfdfcdc0f), TOBN(0xdbc9fb1f, 0xc0e1bcd2), - TOBN(0x35f9dd6e, 0x24651840), TOBN(0xdca45a84, 0xa5c59abc), - TOBN(0x103d396f, 0xecca4938), TOBN(0x4532da0a, 0xb97b3f29), - TOBN(0xc4135ea5, 0x1999a6bf), TOBN(0x3aa9505a, 0x5e6bf2ee), - TOBN(0xf77cef06, 0x3f5be093), TOBN(0x97d1a0f8, 0xa943152e), - TOBN(0x2cb0ebba, 0x2e1c21dd), TOBN(0xf41b29fc, 0x2c6797c4), - TOBN(0xc6e17321, 0xb300101f), TOBN(0x4422b0e9, 0xd0d79a89), - TOBN(0x49e4901c, 0x92f1bfc4), TOBN(0x06ab1f8f, 0xe1e10ed9), - TOBN(0x84d35577, 0xdb2926b8), TOBN(0xca349d39, 0x356e8ec2), - TOBN(0x70b63d32, 0x343bf1a9), TOBN(0x8fd3bd28, 0x37d1a6b1), - TOBN(0x0454879c, 0x316865b4), TOBN(0xee959ff6, 0xc458efa2), - TOBN(0x0461dcf8, 0x9706dc3f), TOBN(0x737db0e2, 0x164e4b2e), - TOBN(0x09262680, 0x2f8843c8), TOBN(0x54498bbc, 0x7745e6f6), - TOBN(0x359473fa, 0xa29e24af), TOBN(0xfcc3c454, 0x70aa87a1), - TOBN(0xfd2c4bf5, 0x00573ace), TOBN(0xb65b514e, 0x28dd1965), - TOBN(0xe46ae7cf, 0x2193e393), TOBN(0x60e9a4e1, 0xf5444d97), - TOBN(0xe7594e96, 0x00ff38ed), TOBN(0x43d84d2f, 0x0a0e0f02), - TOBN(0x8b6db141, 0xee398a21), TOBN(0xb88a56ae, 0xe3bcc5be), - TOBN(0x0a1aa52f, 0x373460ea), TOBN(0x20da1a56, 0x160bb19b), - TOBN(0xfb54999d, 0x65bf0384), TOBN(0x71a14d24, 0x5d5a180e), - TOBN(0xbc44db7b, 0x21737b04), TOBN(0xd84fcb18, 0x01dd8e92), - TOBN(0x80de937b, 0xfa44b479), TOBN(0x53505499, 0x5c98fd4f), - TOBN(0x1edb12ab, 0x28f08727), TOBN(0x4c58b582, 0xa5f3ef53), - TOBN(0xbfb236d8, 0x8327f246), TOBN(0xc3a3bfaa, 0x4d7df320), - TOBN(0xecd96c59, 0xb96024f2), TOBN(0xfc293a53, 0x7f4e0433), - TOBN(0x5341352b, 0x5acf6e10), TOBN(0xc50343fd, 0xafe652c3), - TOBN(0x4af3792d, 0x18577a7f), TOBN(0xe1a4c617, 0xaf16823d), - TOBN(0x9b26d0cd, 0x33425d0a), TOBN(0x306399ed, 0x9b7bc47f), - TOBN(0x2a792f33, 0x706bb20b), TOBN(0x31219614, 0x98111055), - TOBN(0x864ec064, 0x87f5d28b), TOBN(0x11392d91, 0x962277fd), - TOBN(0xb5aa7942, 0xbb6aed5f), TOBN(0x080094dc, 0x47e799d9), - TOBN(0x4afa588c, 0x208ba19b), TOBN(0xd3e7570f, 0x8512f284), - TOBN(0xcbae64e6, 0x02f5799a), TOBN(0xdeebe7ef, 0x514b9492), - TOBN(0x30300f98, 0xe5c298ff), TOBN(0x17f561be, 0x3678361f), - TOBN(0xf52ff312, 0x98cb9a16), TOBN(0x6233c3bc, 0x5562d490), - TOBN(0x7bfa15a1, 0x92e3a2cb), TOBN(0x961bcfd1, 0xe6365119), - TOBN(0x3bdd29bf, 0x2c8c53b1), TOBN(0x739704df, 0x822844ba), - TOBN(0x7dacfb58, 0x7e7b754b), TOBN(0x23360791, 0xa806c9b9), - TOBN(0xe7eb88c9, 0x23504452), TOBN(0x2983e996, 0x852c1783), - TOBN(0xdd4ae529, 0x958d881d), TOBN(0x026bae03, 0x262c7b3c), - TOBN(0x3a6f9193, 0x960b52d1), TOBN(0xd0980f90, 0x92696cfb), - TOBN(0x4c1f428c, 0xd5f30851), TOBN(0x94dfed27, 0x2a4f6630), - TOBN(0x4df53772, 0xfc5d48a4), TOBN(0xdd2d5a2f, 0x933260ce), - TOBN(0x574115bd, 0xd44cc7a5), TOBN(0x4ba6b20d, 0xbd12533a), - TOBN(0x30e93cb8, 0x243057c9), TOBN(0x794c486a, 0x14de320e), - TOBN(0xe925d4ce, 0xf21496e4), TOBN(0xf951d198, 0xec696331), - TOBN(0x9810e2de, 0x3e8d812f), TOBN(0xd0a47259, 0x389294ab), - TOBN(0x513ba2b5, 0x0e3bab66), TOBN(0x462caff5, 0xabad306f), - TOBN(0xe2dc6d59, 0xaf04c49e), TOBN(0x1aeb8750, 0xe0b84b0b), - TOBN(0xc034f12f, 0x2f7d0ca2), TOBN(0x6d2e8128, 0xe06acf2f), - TOBN(0x801f4f83, 0x21facc2f), TOBN(0xa1170c03, 0xf40ef607), - TOBN(0xfe0a1d4f, 0x7805a99c), TOBN(0xbde56a36, 0xcc26aba5), - TOBN(0x5b1629d0, 0x35531f40), TOBN(0xac212c2b, 0x9afa6108), - TOBN(0x30a06bf3, 0x15697be5), TOBN(0x6f0545dc, 0x2c63c7c1), - TOBN(0x5d8cb842, 0x7ccdadaf), TOBN(0xd52e379b, 0xac7015bb), - TOBN(0xc4f56147, 0xf462c23e), TOBN(0xd44a4298, 0x46bc24b0), - TOBN(0xbc73d23a, 0xe2856d4f), TOBN(0x61cedd8c, 0x0832bcdf), - TOBN(0x60953556, 0x99f241d7), TOBN(0xee4adbd7, 0x001a349d), - TOBN(0x0b35bf6a, 0xaa89e491), TOBN(0x7f0076f4, 0x136f7546), - TOBN(0xd19a18ba, 0x9264da3d), TOBN(0x6eb2d2cd, 0x62a7a28b), - TOBN(0xcdba941f, 0x8761c971), TOBN(0x1550518b, 0xa3be4a5d), - TOBN(0xd0e8e2f0, 0x57d0b70c), TOBN(0xeea8612e, 0xcd133ba3), - TOBN(0x814670f0, 0x44416aec), TOBN(0x424db6c3, 0x30775061), - TOBN(0xd96039d1, 0x16213fd1), TOBN(0xc61e7fa5, 0x18a3478f), - TOBN(0xa805bdcc, 0xcb0c5021), TOBN(0xbdd6f3a8, 0x0cc616dd), - TOBN(0x06009667, 0x5d97f7e2), TOBN(0x31db0fc1, 0xaf0bf4b6), - TOBN(0x23680ed4, 0x5491627a), TOBN(0xb99a3c66, 0x7d741fb1), - TOBN(0xe9bb5f55, 0x36b1ff92), TOBN(0x29738577, 0x512b388d), - TOBN(0xdb8a2ce7, 0x50fcf263), TOBN(0x385346d4, 0x6c4f7b47), - TOBN(0xbe86c5ef, 0x31631f9e), TOBN(0xbf91da21, 0x03a57a29), - TOBN(0xc3b1f796, 0x7b23f821), TOBN(0x0f7d00d2, 0x770db354), - TOBN(0x8ffc6c3b, 0xd8fe79da), TOBN(0xcc5e8c40, 0xd525c996), - TOBN(0x4640991d, 0xcfff632a), TOBN(0x64d97e8c, 0x67112528), - TOBN(0xc232d973, 0x02f1cd1e), TOBN(0xce87eacb, 0x1dd212a4), - TOBN(0x6e4c8c73, 0xe69802f7), TOBN(0x12ef0290, 0x1fffddbd), - TOBN(0x941ec74e, 0x1bcea6e2), TOBN(0xd0b54024, 0x3cb92cbb), - TOBN(0x809fb9d4, 0x7e8f9d05), TOBN(0x3bf16159, 0xf2992aae), - TOBN(0xad40f279, 0xf8a7a838), TOBN(0x11aea631, 0x05615660), - TOBN(0xbf52e6f1, 0xa01f6fa1), TOBN(0xef046995, 0x3dc2aec9), - TOBN(0x785dbec9, 0xd8080711), TOBN(0xe1aec60a, 0x9fdedf76), - TOBN(0xece797b5, 0xfa21c126), TOBN(0xc66e898f, 0x05e52732), - TOBN(0x39bb69c4, 0x08811fdb), TOBN(0x8bfe1ef8, 0x2fc7f082), - TOBN(0xc8e7a393, 0x174f4138), TOBN(0xfba8ad1d, 0xd58d1f98), - TOBN(0xbc21d0ce, 0xbfd2fd5b), TOBN(0x0b839a82, 0x6ee60d61), - TOBN(0xaacf7658, 0xafd22253), TOBN(0xb526bed8, 0xaae396b3), - TOBN(0xccc1bbc2, 0x38564464), TOBN(0x9e3ff947, 0x8c45bc73), - TOBN(0xcde9bca3, 0x58188a78), TOBN(0x138b8ee0, 0xd73bf8f7), - TOBN(0x5c7e234c, 0x4123c489), TOBN(0x66e69368, 0xfa643297), - TOBN(0x0629eeee, 0x39a15fa3), TOBN(0x95fab881, 0xa9e2a927), - TOBN(0xb2497007, 0xeafbb1e1), TOBN(0xd75c9ce6, 0xe75b7a93), - TOBN(0x3558352d, 0xefb68d78), TOBN(0xa2f26699, 0x223f6396), - TOBN(0xeb911ecf, 0xe469b17a), TOBN(0x62545779, 0xe72d3ec2), - TOBN(0x8ea47de7, 0x82cb113f), TOBN(0xebe4b086, 0x4e1fa98d), - TOBN(0xec2d5ed7, 0x8cdfedb1), TOBN(0xa535c077, 0xfe211a74), - TOBN(0x9678109b, 0x11d244c5), TOBN(0xf17c8bfb, 0xbe299a76), - TOBN(0xb651412e, 0xfb11fbc4), TOBN(0xea0b5482, 0x94ab3f65), - TOBN(0xd8dffd95, 0x0cf78243), TOBN(0x2e719e57, 0xce0361d4), - TOBN(0x9007f085, 0x304ddc5b), TOBN(0x095e8c6d, 0x4daba2ea), - TOBN(0x5a33cdb4, 0x3f9d28a9), TOBN(0x85b95cd8, 0xe2283003), - TOBN(0xbcd6c819, 0xb9744733), TOBN(0x29c5f538, 0xfc7f5783), - TOBN(0x6c49b2fa, 0xd59038e4), TOBN(0x68349cc1, 0x3bbe1018), - TOBN(0xcc490c1d, 0x21830ee5), TOBN(0x36f9c4ee, 0xe9bfa297), - TOBN(0x58fd7294, 0x48de1a94), TOBN(0xaadb13a8, 0x4e8f2cdc), - TOBN(0x515eaaa0, 0x81313dba), TOBN(0xc76bb468, 0xc2152dd8), - TOBN(0x357f8d75, 0xa653dbf8), TOBN(0xe4d8c4d1, 0xb14ac143), - TOBN(0xbdb8e675, 0xb055cb40), TOBN(0x898f8e7b, 0x977b5167), - TOBN(0xecc65651, 0xb82fb863), TOBN(0x56544814, 0x6d88f01f), - TOBN(0xb0928e95, 0x263a75a9), TOBN(0xcfb6836f, 0x1a22fcda), - TOBN(0x651d14db, 0x3f3bd37c), TOBN(0x1d3837fb, 0xb6ad4664), - TOBN(0x7c5fb538, 0xff4f94ab), TOBN(0x7243c712, 0x6d7fb8f2), - TOBN(0xef13d60c, 0xa85c5287), TOBN(0x18cfb7c7, 0x4bb8dd1b), - TOBN(0x82f9bfe6, 0x72908219), TOBN(0x35c4592b, 0x9d5144ab), - TOBN(0x52734f37, 0x9cf4b42f), TOBN(0x6bac55e7, 0x8c60ddc4), - TOBN(0xb5cd811e, 0x94dea0f6), TOBN(0x259ecae4, 0xe18cc1a3), - TOBN(0x6a0e836e, 0x15e660f8), TOBN(0x6c639ea6, 0x0e02bff2), - TOBN(0x8721b8cb, 0x7e1026fd), TOBN(0x9e73b50b, 0x63261942), - TOBN(0xb8c70974, 0x77f01da3), TOBN(0x1839e6a6, 0x8268f57f), - TOBN(0x571b9415, 0x5150b805), TOBN(0x1892389e, 0xf92c7097), - TOBN(0x8d69c18e, 0x4a084b95), TOBN(0x7014c512, 0xbe5b495c), - TOBN(0x4780db36, 0x1b07523c), TOBN(0x2f6219ce, 0x2c1c64fa), - TOBN(0xc38b81b0, 0x602c105a), TOBN(0xab4f4f20, 0x5dc8e360), - TOBN(0x20d3c982, 0xcf7d62d2), TOBN(0x1f36e29d, 0x23ba8150), - TOBN(0x48ae0bf0, 0x92763f9e), TOBN(0x7a527e6b, 0x1d3a7007), - TOBN(0xb4a89097, 0x581a85e3), TOBN(0x1f1a520f, 0xdc158be5), - TOBN(0xf98db37d, 0x167d726e), TOBN(0x8802786e, 0x1113e862)}, - {TOBN(0xefb2149e, 0x36f09ab0), TOBN(0x03f163ca, 0x4a10bb5b), - TOBN(0xd0297045, 0x06e20998), TOBN(0x56f0af00, 0x1b5a3bab), - TOBN(0x7af4cfec, 0x70880e0d), TOBN(0x7332a66f, 0xbe3d913f), - TOBN(0x32e6c84a, 0x7eceb4bd), TOBN(0xedc4a79a, 0x9c228f55), - TOBN(0xc37c7dd0, 0xc55c4496), TOBN(0xa6a96357, 0x25bbabd2), - TOBN(0x5b7e63f2, 0xadd7f363), TOBN(0x9dce3782, 0x2e73f1df), - TOBN(0xe1e5a16a, 0xb2b91f71), TOBN(0xe4489823, 0x5ba0163c), - TOBN(0xf2759c32, 0xf6e515ad), TOBN(0xa5e2f1f8, 0x8615eecf), - TOBN(0x74519be7, 0xabded551), TOBN(0x03d358b8, 0xc8b74410), - TOBN(0x4d00b10b, 0x0e10d9a9), TOBN(0x6392b0b1, 0x28da52b7), - TOBN(0x6744a298, 0x0b75c904), TOBN(0xc305b0ae, 0xa8f7f96c), - TOBN(0x042e421d, 0x182cf932), TOBN(0xf6fc5d50, 0x9e4636ca), - TOBN(0x795847c9, 0xd64cc78c), TOBN(0x6c50621b, 0x9b6cb27b), - TOBN(0x07099bf8, 0xdf8022ab), TOBN(0x48f862eb, 0xc04eda1d), - TOBN(0xd12732ed, 0xe1603c16), TOBN(0x19a80e0f, 0x5c9a9450), - TOBN(0xe2257f54, 0xb429b4fc), TOBN(0x66d3b2c6, 0x45460515), - TOBN(0x6ca4f87e, 0x822e37be), TOBN(0x73f237b4, 0x253bda4e), - TOBN(0xf747f3a2, 0x41190aeb), TOBN(0xf06fa36f, 0x804cf284), - TOBN(0x0a6bbb6e, 0xfc621c12), TOBN(0x5d624b64, 0x40b80ec6), - TOBN(0x4b072425, 0x7ba556f3), TOBN(0x7fa0c354, 0x3e2d20a8), - TOBN(0xe921fa31, 0xe3229d41), TOBN(0xa929c652, 0x94531bd4), - TOBN(0x84156027, 0xa6d38209), TOBN(0xf3d69f73, 0x6bdb97bd), - TOBN(0x8906d19a, 0x16833631), TOBN(0x68a34c2e, 0x03d51be3), - TOBN(0xcb59583b, 0x0e511cd8), TOBN(0x99ce6bfd, 0xfdc132a8), - TOBN(0x3facdaaa, 0xffcdb463), TOBN(0x658bbc1a, 0x34a38b08), - TOBN(0x12a801f8, 0xf1a9078d), TOBN(0x1567bcf9, 0x6ab855de), - TOBN(0xe08498e0, 0x3572359b), TOBN(0xcf0353e5, 0x8659e68b), - TOBN(0xbb86e9c8, 0x7d23807c), TOBN(0xbc08728d, 0x2198e8a2), - TOBN(0x8de2b7bc, 0x453cadd6), TOBN(0x203900a7, 0xbc0bc1f8), - TOBN(0xbcd86e47, 0xa6abd3af), TOBN(0x911cac12, 0x8502effb), - TOBN(0x2d550242, 0xec965469), TOBN(0x0e9f7692, 0x29e0017e), - TOBN(0x633f078f, 0x65979885), TOBN(0xfb87d449, 0x4cf751ef), - TOBN(0xe1790e4b, 0xfc25419a), TOBN(0x36467203, 0x4bff3cfd), - TOBN(0xc8db6386, 0x25b6e83f), TOBN(0x6cc69f23, 0x6cad6fd2), - TOBN(0x0219e45a, 0x6bc68bb9), TOBN(0xe43d79b6, 0x297f7334), - TOBN(0x7d445368, 0x465dc97c), TOBN(0x4b9eea32, 0x2a0b949a), - TOBN(0x1b96c6ba, 0x6102d021), TOBN(0xeaafac78, 0x2f4461ea), - TOBN(0xd4b85c41, 0xc49f19a8), TOBN(0x275c28e4, 0xcf538875), - TOBN(0x35451a9d, 0xdd2e54e0), TOBN(0x6991adb5, 0x0605618b), - TOBN(0x5b8b4bcd, 0x7b36cd24), TOBN(0x372a4f8c, 0x56f37216), - TOBN(0xc890bd73, 0xa6a5da60), TOBN(0x6f083da0, 0xdc4c9ff0), - TOBN(0xf4e14d94, 0xf0536e57), TOBN(0xf9ee1eda, 0xaaec8243), - TOBN(0x571241ec, 0x8bdcf8e7), TOBN(0xa5db8271, 0x0b041e26), - TOBN(0x9a0b9a99, 0xe3fff040), TOBN(0xcaaf21dd, 0x7c271202), - TOBN(0xb4e2b2e1, 0x4f0dd2e8), TOBN(0xe77e7c4f, 0x0a377ac7), - TOBN(0x69202c3f, 0x0d7a2198), TOBN(0xf759b7ff, 0x28200eb8), - TOBN(0xc87526ed, 0xdcfe314e), TOBN(0xeb84c524, 0x53d5cf99), - TOBN(0xb1b52ace, 0x515138b6), TOBN(0x5aa7ff8c, 0x23fca3f4), - TOBN(0xff0b13c3, 0xb9791a26), TOBN(0x960022da, 0xcdd58b16), - TOBN(0xdbd55c92, 0x57aad2de), TOBN(0x3baaaaa3, 0xf30fe619), - TOBN(0x9a4b2346, 0x0d881efd), TOBN(0x506416c0, 0x46325e2a), - TOBN(0x91381e76, 0x035c18d4), TOBN(0xb3bb68be, 0xf27817b0), - TOBN(0x15bfb8bf, 0x5116f937), TOBN(0x7c64a586, 0xc1268943), - TOBN(0x71e25cc3, 0x8419a2c8), TOBN(0x9fd6b0c4, 0x8335f463), - TOBN(0x4bf0ba3c, 0xe8ee0e0e), TOBN(0x6f6fba60, 0x298c21fa), - TOBN(0x57d57b39, 0xae66bee0), TOBN(0x292d5130, 0x22672544), - TOBN(0xf451105d, 0xbab093b3), TOBN(0x012f59b9, 0x02839986), - TOBN(0x8a915802, 0x3474a89c), TOBN(0x048c919c, 0x2de03e97), - TOBN(0xc476a2b5, 0x91071cd5), TOBN(0x791ed89a, 0x034970a5), - TOBN(0x89bd9042, 0xe1b7994b), TOBN(0x8eaf5179, 0xa1057ffd), - TOBN(0x6066e2a2, 0xd551ee10), TOBN(0x87a8f1d8, 0x727e09a6), - TOBN(0x00d08bab, 0x2c01148d), TOBN(0x6da8e4f1, 0x424f33fe), - TOBN(0x466d17f0, 0xcf9a4e71), TOBN(0xff502010, 0x3bf5cb19), - TOBN(0xdccf97d8, 0xd062ecc0), TOBN(0x80c0d9af, 0x81d80ac4), - TOBN(0xe87771d8, 0x033f2876), TOBN(0xb0186ec6, 0x7d5cc3db), - TOBN(0x58e8bb80, 0x3bc9bc1d), TOBN(0x4d1395cc, 0x6f6ef60e), - TOBN(0xa73c62d6, 0x186244a0), TOBN(0x918e5f23, 0x110a5b53), - TOBN(0xed4878ca, 0x741b7eab), TOBN(0x3038d71a, 0xdbe03e51), - TOBN(0x840204b7, 0xa93c3246), TOBN(0x21ab6069, 0xa0b9b4cd), - TOBN(0xf5fa6e2b, 0xb1d64218), TOBN(0x1de6ad0e, 0xf3d56191), - TOBN(0x570aaa88, 0xff1929c7), TOBN(0xc6df4c6b, 0x640e87b5), - TOBN(0xde8a74f2, 0xc65f0ccc), TOBN(0x8b972fd5, 0xe6f6cc01), - TOBN(0x3fff36b6, 0x0b846531), TOBN(0xba7e45e6, 0x10a5e475), - TOBN(0x84a1d10e, 0x4145b6c5), TOBN(0xf1f7f91a, 0x5e046d9d), - TOBN(0x0317a692, 0x44de90d7), TOBN(0x951a1d4a, 0xf199c15e), - TOBN(0x91f78046, 0xc9d73deb), TOBN(0x74c82828, 0xfab8224f), - TOBN(0xaa6778fc, 0xe7560b90), TOBN(0xb4073e61, 0xa7e824ce), - TOBN(0xff0d693c, 0xd642eba8), TOBN(0x7ce2e57a, 0x5dccef38), - TOBN(0x89c2c789, 0x1df1ad46), TOBN(0x83a06922, 0x098346fd), - TOBN(0x2d715d72, 0xda2fc177), TOBN(0x7b6dd71d, 0x85b6cf1d), - TOBN(0xc60a6d0a, 0x73fa9cb0), TOBN(0xedd3992e, 0x328bf5a9), - TOBN(0xc380ddd0, 0x832c8c82), TOBN(0xd182d410, 0xa2a0bf50), - TOBN(0x7d9d7438, 0xd9a528db), TOBN(0xe8b1a0e9, 0xcaf53994), - TOBN(0xddd6e5fe, 0x0e19987c), TOBN(0xacb8df03, 0x190b059d), - TOBN(0x53703a32, 0x8300129f), TOBN(0x1f637662, 0x68c43bfd), - TOBN(0xbcbd1913, 0x00e54051), TOBN(0x812fcc62, 0x7bf5a8c5), - TOBN(0x3f969d5f, 0x29fb85da), TOBN(0x72f4e00a, 0x694759e8), - TOBN(0x426b6e52, 0x790726b7), TOBN(0x617bbc87, 0x3bdbb209), - TOBN(0x511f8bb9, 0x97aee317), TOBN(0x812a4096, 0xe81536a8), - TOBN(0x137dfe59, 0x3ac09b9b), TOBN(0x0682238f, 0xba8c9a7a), - TOBN(0x7072ead6, 0xaeccb4bd), TOBN(0x6a34e9aa, 0x692ba633), - TOBN(0xc82eaec2, 0x6fff9d33), TOBN(0xfb753512, 0x1d4d2b62), - TOBN(0x1a0445ff, 0x1d7aadab), TOBN(0x65d38260, 0xd5f6a67c), - TOBN(0x6e62fb08, 0x91cfb26f), TOBN(0xef1e0fa5, 0x5c7d91d6), - TOBN(0x47e7c7ba, 0x33db72cd), TOBN(0x017cbc09, 0xfa7c74b2), - TOBN(0x3c931590, 0xf50a503c), TOBN(0xcac54f60, 0x616baa42), - TOBN(0x9b6cd380, 0xb2369f0f), TOBN(0x97d3a70d, 0x23c76151), - TOBN(0x5f9dd6fc, 0x9862a9c6), TOBN(0x044c4ab2, 0x12312f51), - TOBN(0x035ea0fd, 0x834a2ddc), TOBN(0x49e6b862, 0xcc7b826d), - TOBN(0xb03d6883, 0x62fce490), TOBN(0x62f2497a, 0xb37e36e9), - TOBN(0x04b005b6, 0xc6458293), TOBN(0x36bb5276, 0xe8d10af7), - TOBN(0xacf2dc13, 0x8ee617b8), TOBN(0x470d2d35, 0xb004b3d4), - TOBN(0x06790832, 0xfeeb1b77), TOBN(0x2bb75c39, 0x85657f9c), - TOBN(0xd70bd4ed, 0xc0f60004), TOBN(0xfe797ecc, 0x219b018b), - TOBN(0x9b5bec2a, 0x753aebcc), TOBN(0xdaf9f3dc, 0xc939eca5), - TOBN(0xd6bc6833, 0xd095ad09), TOBN(0x98abdd51, 0xdaa4d2fc), - TOBN(0xd9840a31, 0x8d168be5), TOBN(0xcf7c10e0, 0x2325a23c), - TOBN(0xa5c02aa0, 0x7e6ecfaf), TOBN(0x2462e7e6, 0xb5bfdf18), - TOBN(0xab2d8a8b, 0xa0cc3f12), TOBN(0x68dd485d, 0xbc672a29), - TOBN(0x72039752, 0x596f2cd3), TOBN(0x5d3eea67, 0xa0cf3d8d), - TOBN(0x810a1a81, 0xe6602671), TOBN(0x8f144a40, 0x14026c0c), - TOBN(0xbc753a6d, 0x76b50f85), TOBN(0xc4dc21e8, 0x645cd4a4), - TOBN(0xc5262dea, 0x521d0378), TOBN(0x802b8e0e, 0x05011c6f), - TOBN(0x1ba19cbb, 0x0b4c19ea), TOBN(0x21db64b5, 0xebf0aaec), - TOBN(0x1f394ee9, 0x70342f9d), TOBN(0x93a10aee, 0x1bc44a14), - TOBN(0xa7eed31b, 0x3efd0baa), TOBN(0x6e7c824e, 0x1d154e65), - TOBN(0xee23fa81, 0x9966e7ee), TOBN(0x64ec4aa8, 0x05b7920d), - TOBN(0x2d44462d, 0x2d90aad4), TOBN(0xf44dd195, 0xdf277ad5), - TOBN(0x8d6471f1, 0xbb46b6a1), TOBN(0x1e65d313, 0xfd885090), - TOBN(0x33a800f5, 0x13a977b4), TOBN(0xaca9d721, 0x0797e1ef), - TOBN(0x9a5a85a0, 0xfcff6a17), TOBN(0x9970a3f3, 0x1eca7cee), - TOBN(0xbb9f0d6b, 0xc9504be3), TOBN(0xe0c504be, 0xadd24ee2), - TOBN(0x7e09d956, 0x77fcc2f4), TOBN(0xef1a5227, 0x65bb5fc4), - TOBN(0x145d4fb1, 0x8b9286aa), TOBN(0x66fd0c5d, 0x6649028b), - TOBN(0x98857ceb, 0x1bf4581c), TOBN(0xe635e186, 0xaca7b166), - TOBN(0x278ddd22, 0x659722ac), TOBN(0xa0903c4c, 0x1db68007), - TOBN(0x366e4589, 0x48f21402), TOBN(0x31b49c14, 0xb96abda2), - TOBN(0x329c4b09, 0xe0403190), TOBN(0x97197ca3, 0xd29f43fe), - TOBN(0x8073dd1e, 0x274983d8), TOBN(0xda1a3bde, 0x55717c8f), - TOBN(0xfd3d4da2, 0x0361f9d1), TOBN(0x1332d081, 0x4c7de1ce), - TOBN(0x9b7ef7a3, 0xaa6d0e10), TOBN(0x17db2e73, 0xf54f1c4a), - TOBN(0xaf3dffae, 0x4cd35567), TOBN(0xaaa2f406, 0xe56f4e71), - TOBN(0x8966759e, 0x7ace3fc7), TOBN(0x9594eacf, 0x45a8d8c6), - TOBN(0x8de3bd8b, 0x91834e0e), TOBN(0xafe4ca53, 0x548c0421), - TOBN(0xfdd7e856, 0xe6ee81c6), TOBN(0x8f671beb, 0x6b891a3a), - TOBN(0xf7a58f2b, 0xfae63829), TOBN(0x9ab186fb, 0x9c11ac9f), - TOBN(0x8d6eb369, 0x10b5be76), TOBN(0x046b7739, 0xfb040bcd), - TOBN(0xccb4529f, 0xcb73de88), TOBN(0x1df0fefc, 0xcf26be03), - TOBN(0xad7757a6, 0xbcfcd027), TOBN(0xa8786c75, 0xbb3165ca), - TOBN(0xe9db1e34, 0x7e99a4d9), TOBN(0x99ee86df, 0xb06c504b), - TOBN(0x5b7c2ddd, 0xc15c9f0a), TOBN(0xdf87a734, 0x4295989e), - TOBN(0x59ece47c, 0x03d08fda), TOBN(0xb074d3dd, 0xad5fc702), - TOBN(0x20407903, 0x51a03776), TOBN(0x2bb1f77b, 0x2a608007), - TOBN(0x25c58f4f, 0xe1153185), TOBN(0xe6df62f6, 0x766e6447), - TOBN(0xefb3d1be, 0xed51275a), TOBN(0x5de47dc7, 0x2f0f483f), - TOBN(0x7932d98e, 0x97c2bedf), TOBN(0xd5c11927, 0x0219f8a1), - TOBN(0x9d751200, 0xa73a294e), TOBN(0x5f88434a, 0x9dc20172), - TOBN(0xd28d9fd3, 0xa26f506a), TOBN(0xa890cd31, 0x9d1dcd48), - TOBN(0x0aebaec1, 0x70f4d3b4), TOBN(0xfd1a1369, 0x0ffc8d00), - TOBN(0xb9d9c240, 0x57d57838), TOBN(0x45929d26, 0x68bac361), - TOBN(0x5a2cd060, 0x25b15ca6), TOBN(0x4b3c83e1, 0x6e474446), - TOBN(0x1aac7578, 0xee1e5134), TOBN(0xa418f5d6, 0xc91e2f41), - TOBN(0x6936fc8a, 0x213ed68b), TOBN(0x860ae7ed, 0x510a5224), - TOBN(0x63660335, 0xdef09b53), TOBN(0x641b2897, 0xcd79c98d), - TOBN(0x29bd38e1, 0x01110f35), TOBN(0x79c26f42, 0x648b1937), - TOBN(0x64dae519, 0x9d9164f4), TOBN(0xd85a2310, 0x0265c273), - TOBN(0x7173dd5d, 0x4b07e2b1), TOBN(0xd144c4cb, 0x8d9ea221), - TOBN(0xe8b04ea4, 0x1105ab14), TOBN(0x92dda542, 0xfe80d8f1), - TOBN(0xe9982fa8, 0xcf03dce6), TOBN(0x8b5ea965, 0x1a22cffc), - TOBN(0xf7f4ea7f, 0x3fad88c4), TOBN(0x62db773e, 0x6a5ba95c), - TOBN(0xd20f02fb, 0x93f24567), TOBN(0xfd46c69a, 0x315257ca), - TOBN(0x0ac74cc7, 0x8bcab987), TOBN(0x46f31c01, 0x5ceca2f5), - TOBN(0x40aedb59, 0x888b219e), TOBN(0xe50ecc37, 0xe1fccd02), - TOBN(0x1bcd9dad, 0x911f816c), TOBN(0x583cc1ec, 0x8db9b00c), - TOBN(0xf3cd2e66, 0xa483bf11), TOBN(0xfa08a6f5, 0xb1b2c169), - TOBN(0xf375e245, 0x4be9fa28), TOBN(0x99a7ffec, 0x5b6d011f), - TOBN(0x6a3ebddb, 0xc4ae62da), TOBN(0x6cea00ae, 0x374aef5d), - TOBN(0xab5fb98d, 0x9d4d05bc), TOBN(0x7cba1423, 0xd560f252), - TOBN(0x49b2cc21, 0x208490de), TOBN(0x1ca66ec3, 0xbcfb2879), - TOBN(0x7f1166b7, 0x1b6fb16f), TOBN(0xfff63e08, 0x65fe5db3), - TOBN(0xb8345abe, 0x8b2610be), TOBN(0xb732ed80, 0x39de3df4), - TOBN(0x0e24ed50, 0x211c32b4), TOBN(0xd10d8a69, 0x848ff27d), - TOBN(0xc1074398, 0xed4de248), TOBN(0xd7cedace, 0x10488927), - TOBN(0xa4aa6bf8, 0x85673e13), TOBN(0xb46bae91, 0x6daf30af), - TOBN(0x07088472, 0xfcef7ad8), TOBN(0x61151608, 0xd4b35e97), - TOBN(0xbcfe8f26, 0xdde29986), TOBN(0xeb84c4c7, 0xd5a34c79), - TOBN(0xc1eec55c, 0x164e1214), TOBN(0x891be86d, 0xa147bb03), - TOBN(0x9fab4d10, 0x0ba96835), TOBN(0xbf01e9b8, 0xa5c1ae9f), - TOBN(0x6b4de139, 0xb186ebc0), TOBN(0xd5c74c26, 0x85b91bca), - TOBN(0x5086a99c, 0xc2d93854), TOBN(0xeed62a7b, 0xa7a9dfbc), - TOBN(0x8778ed6f, 0x76b7618a), TOBN(0xbff750a5, 0x03b66062), - TOBN(0x4cb7be22, 0xb65186db), TOBN(0x369dfbf0, 0xcc3a6d13), - TOBN(0xc7dab26c, 0x7191a321), TOBN(0x9edac3f9, 0x40ed718e), - TOBN(0xbc142b36, 0xd0cfd183), TOBN(0xc8af82f6, 0x7c991693), - TOBN(0xb3d1e4d8, 0x97ce0b2a), TOBN(0xe6d7c87f, 0xc3a55cdf), - TOBN(0x35846b95, 0x68b81afe), TOBN(0x018d12af, 0xd3c239d8), - TOBN(0x2b2c6208, 0x01206e15), TOBN(0xe0e42453, 0xa3b882c6), - TOBN(0x854470a3, 0xa50162d5), TOBN(0x08157478, 0x7017a62a), - TOBN(0x18bd3fb4, 0x820357c7), TOBN(0x992039ae, 0x6f1458ad), - TOBN(0x9a1df3c5, 0x25b44aa1), TOBN(0x2d780357, 0xed3d5281), - TOBN(0x58cf7e4d, 0xc77ad4d4), TOBN(0xd49a7998, 0xf9df4fc4), - TOBN(0x4465a8b5, 0x1d71205e), TOBN(0xa0ee0ea6, 0x649254aa), - TOBN(0x4b5eeecf, 0xab7bd771), TOBN(0x6c873073, 0x35c262b9), - TOBN(0xdc5bd648, 0x3c9d61e7), TOBN(0x233d6d54, 0x321460d2), - TOBN(0xd20c5626, 0xfc195bcc), TOBN(0x25445958, 0x04d78b63), - TOBN(0xe03fcb3d, 0x17ec8ef3), TOBN(0x54b690d1, 0x46b8f781), - TOBN(0x82fa2c8a, 0x21230646), TOBN(0xf51aabb9, 0x084f418c), - TOBN(0xff4fbec1, 0x1a30ba43), TOBN(0x6a5acf73, 0x743c9df7), - TOBN(0x1da2b357, 0xd635b4d5), TOBN(0xc3de68dd, 0xecd5c1da), - TOBN(0xa689080b, 0xd61af0dd), TOBN(0xdea5938a, 0xd665bf99), - TOBN(0x0231d71a, 0xfe637294), TOBN(0x01968aa6, 0xa5a81cd8), - TOBN(0x11252d50, 0x048e63b5), TOBN(0xc446bc52, 0x6ca007e9), - TOBN(0xef8c50a6, 0x96d6134b), TOBN(0x9361fbf5, 0x9e09a05c), - TOBN(0xf17f85a6, 0xdca3291a), TOBN(0xb178d548, 0xff251a21), - TOBN(0x87f6374b, 0xa4df3915), TOBN(0x566ce1bf, 0x2fd5d608), - TOBN(0x425cba4d, 0x7de35102), TOBN(0x6b745f8f, 0x58c5d5e2), - TOBN(0x88402af6, 0x63122edf), TOBN(0x3190f9ed, 0x3b989a89), - TOBN(0x4ad3d387, 0xebba3156), TOBN(0xef385ad9, 0xc7c469a5), - TOBN(0xb08281de, 0x3f642c29), TOBN(0x20be0888, 0x910ffb88), - TOBN(0xf353dd4a, 0xd5292546), TOBN(0x3f1627de, 0x8377a262), - TOBN(0xa5faa013, 0xeefcd638), TOBN(0x8f3bf626, 0x74cc77c3), - TOBN(0x32618f65, 0xa348f55e), TOBN(0x5787c0dc, 0x9fefeb9e), - TOBN(0xf1673aa2, 0xd9a23e44), TOBN(0x88dfa993, 0x4e10690d), - TOBN(0x1ced1b36, 0x2bf91108), TOBN(0x9193ceca, 0x3af48649), - TOBN(0xfb34327d, 0x2d738fc5), TOBN(0x6697b037, 0x975fee6c), - TOBN(0x2f485da0, 0xc04079a5), TOBN(0x2cdf5735, 0x2feaa1ac), - TOBN(0x76944420, 0xbd55659e), TOBN(0x7973e32b, 0x4376090c), - TOBN(0x86bb4fe1, 0x163b591a), TOBN(0x10441aed, 0xc196f0ca), - TOBN(0x3b431f4a, 0x045ad915), TOBN(0x6c11b437, 0xa4afacb1), - TOBN(0x30b0c7db, 0x71fdbbd8), TOBN(0xb642931f, 0xeda65acd), - TOBN(0x4baae6e8, 0x9c92b235), TOBN(0xa73bbd0e, 0x6b3993a1), - TOBN(0xd06d60ec, 0x693dd031), TOBN(0x03cab91b, 0x7156881c), - TOBN(0xd615862f, 0x1db3574b), TOBN(0x485b0185, 0x64bb061a), - TOBN(0x27434988, 0xa0181e06), TOBN(0x2cd61ad4, 0xc1c0c757), - TOBN(0x3effed5a, 0x2ff9f403), TOBN(0x8dc98d8b, 0x62239029), - TOBN(0x2206021e, 0x1f17b70d), TOBN(0xafbec0ca, 0xbf510015), - TOBN(0x9fed7164, 0x80130dfa), TOBN(0x306dc2b5, 0x8a02dcf5), - TOBN(0x48f06620, 0xfeb10fc0), TOBN(0x78d1e1d5, 0x5a57cf51), - TOBN(0xadef8c5a, 0x192ef710), TOBN(0x88afbd4b, 0x3b7431f9), - TOBN(0x7e1f7407, 0x64250c9e), TOBN(0x6e31318d, 0xb58bec07), - TOBN(0xfd4fc4b8, 0x24f89b4e), TOBN(0x65a5dd88, 0x48c36a2a), - TOBN(0x4f1eccff, 0xf024baa7), TOBN(0x22a21cf2, 0xcba94650), - TOBN(0x95d29dee, 0x42a554f7), TOBN(0x828983a5, 0x002ec4ba), - TOBN(0x8112a1f7, 0x8badb73d), TOBN(0x79ea8897, 0xa27c1839), - TOBN(0x8969a5a7, 0xd065fd83), TOBN(0xf49af791, 0xb262a0bc), - TOBN(0xfcdea8b6, 0xaf2b5127), TOBN(0x10e913e1, 0x564c2dbc), - TOBN(0x51239d14, 0xbc21ef51), TOBN(0xe51c3ceb, 0x4ce57292), - TOBN(0x795ff068, 0x47bbcc3b), TOBN(0x86b46e1e, 0xbd7e11e6), - TOBN(0x0ea6ba23, 0x80041ef4), TOBN(0xd72fe505, 0x6262342e), - TOBN(0x8abc6dfd, 0x31d294d4), TOBN(0xbbe017a2, 0x1278c2c9), - TOBN(0xb1fcfa09, 0xb389328a), TOBN(0x322fbc62, 0xd01771b5), - TOBN(0x04c0d063, 0x60b045bf), TOBN(0xdb652edc, 0x10e52d01), - TOBN(0x50ef932c, 0x03ec6627), TOBN(0xde1b3b2d, 0xc1ee50e3), - TOBN(0x5ab7bdc5, 0xdc37a90d), TOBN(0xfea67213, 0x31e33a96), - TOBN(0x6482b5cb, 0x4f2999aa), TOBN(0x38476cc6, 0xb8cbf0dd), - TOBN(0x93ebfacb, 0x173405bb), TOBN(0x15cdafe7, 0xe52369ec), - TOBN(0xd42d5ba4, 0xd935b7db), TOBN(0x648b6004, 0x1c99a4cd), - TOBN(0x785101bd, 0xa3b5545b), TOBN(0x4bf2c38a, 0x9dd67faf), - TOBN(0xb1aadc63, 0x4442449c), TOBN(0xe0e9921a, 0x33ad4fb8), - TOBN(0x5c552313, 0xaa686d82), TOBN(0xdee635fa, 0x465d866c), - TOBN(0xbc3c224a, 0x18ee6e8a), TOBN(0xeed748a6, 0xed42e02f), - TOBN(0xe70f930a, 0xd474cd08), TOBN(0x774ea6ec, 0xfff24adf), - TOBN(0x03e2de1c, 0xf3480d4a), TOBN(0xf0d8edc7, 0xbc8acf1a), - TOBN(0xf23e3303, 0x68295a9c), TOBN(0xfadd5f68, 0xc546a97d), - TOBN(0x895597ad, 0x96f8acb1), TOBN(0xbddd49d5, 0x671bdae2), - TOBN(0x16fcd528, 0x21dd43f4), TOBN(0xa5a45412, 0x6619141a)}, - {TOBN(0x8ce9b6bf, 0xc360e25a), TOBN(0xe6425195, 0x075a1a78), - TOBN(0x9dc756a8, 0x481732f4), TOBN(0x83c0440f, 0x5432b57a), - TOBN(0xc670b3f1, 0xd720281f), TOBN(0x2205910e, 0xd135e051), - TOBN(0xded14b0e, 0xdb052be7), TOBN(0x697b3d27, 0xc568ea39), - TOBN(0x2e599b9a, 0xfb3ff9ed), TOBN(0x28c2e0ab, 0x17f6515c), - TOBN(0x1cbee4fd, 0x474da449), TOBN(0x071279a4, 0x4f364452), - TOBN(0x97abff66, 0x01fbe855), TOBN(0x3ee394e8, 0x5fda51c4), - TOBN(0x190385f6, 0x67597c0b), TOBN(0x6e9fccc6, 0xa27ee34b), - TOBN(0x0b89de93, 0x14092ebb), TOBN(0xf17256bd, 0x428e240c), - TOBN(0xcf89a7f3, 0x93d2f064), TOBN(0x4f57841e, 0xe1ed3b14), - TOBN(0x4ee14405, 0xe708d855), TOBN(0x856aae72, 0x03f1c3d0), - TOBN(0xc8e5424f, 0xbdd7eed5), TOBN(0x3333e4ef, 0x73ab4270), - TOBN(0x3bc77ade, 0xdda492f8), TOBN(0xc11a3aea, 0x78297205), - TOBN(0x5e89a3e7, 0x34931b4c), TOBN(0x17512e2e, 0x9f5694bb), - TOBN(0x5dc349f3, 0x177bf8b6), TOBN(0x232ea4ba, 0x08c7ff3e), - TOBN(0x9c4f9d16, 0xf511145d), TOBN(0xccf109a3, 0x33b379c3), - TOBN(0xe75e7a88, 0xa1f25897), TOBN(0x7ac6961f, 0xa1b5d4d8), - TOBN(0xe3e10773, 0x08f3ed5c), TOBN(0x208a54ec, 0x0a892dfb), - TOBN(0xbe826e19, 0x78660710), TOBN(0x0cf70a97, 0x237df2c8), - TOBN(0x418a7340, 0xed704da5), TOBN(0xa3eeb9a9, 0x08ca33fd), - TOBN(0x49d96233, 0x169bca96), TOBN(0x04d286d4, 0x2da6aafb), - TOBN(0xc09606ec, 0xa0c2fa94), TOBN(0x8869d0d5, 0x23ff0fb3), - TOBN(0xa99937e5, 0xd0150d65), TOBN(0xa92e2503, 0x240c14c9), - TOBN(0x656bf945, 0x108e2d49), TOBN(0x152a733a, 0xa2f59e2b), - TOBN(0xb4323d58, 0x8434a920), TOBN(0xc0af8e93, 0x622103c5), - TOBN(0x667518ef, 0x938dbf9a), TOBN(0xa1843073, 0x83a9cdf2), - TOBN(0x350a94aa, 0x5447ab80), TOBN(0xe5e5a325, 0xc75a3d61), - TOBN(0x74ba507f, 0x68411a9e), TOBN(0x10581fc1, 0x594f70c5), - TOBN(0x60e28570, 0x80eb24a9), TOBN(0x7bedfb4d, 0x488e0cfd), - TOBN(0x721ebbd7, 0xc259cdb8), TOBN(0x0b0da855, 0xbc6390a9), - TOBN(0x2b4d04db, 0xde314c70), TOBN(0xcdbf1fbc, 0x6c32e846), - TOBN(0x33833eab, 0xb162fc9e), TOBN(0x9939b48b, 0xb0dd3ab7), - TOBN(0x5aaa98a7, 0xcb0c9c8c), TOBN(0x75105f30, 0x81c4375c), - TOBN(0xceee5057, 0x5ef1c90f), TOBN(0xb31e065f, 0xc23a17bf), - TOBN(0x5364d275, 0xd4b6d45a), TOBN(0xd363f3ad, 0x62ec8996), - TOBN(0xb5d21239, 0x4391c65b), TOBN(0x84564765, 0xebb41b47), - TOBN(0x20d18ecc, 0x37107c78), TOBN(0xacff3b6b, 0x570c2a66), - TOBN(0x22f975d9, 0x9bd0d845), TOBN(0xef0a0c46, 0xba178fa0), - TOBN(0x1a419651, 0x76b6028e), TOBN(0xc49ec674, 0x248612d4), - TOBN(0x5b6ac4f2, 0x7338af55), TOBN(0x06145e62, 0x7bee5a36), - TOBN(0x33e95d07, 0xe75746b5), TOBN(0x1c1e1f6d, 0xc40c78be), - TOBN(0x967833ef, 0x222ff8e2), TOBN(0x4bedcf6a, 0xb49180ad), - TOBN(0x6b37e9c1, 0x3d7a4c8a), TOBN(0x2748887c, 0x6ddfe760), - TOBN(0xf7055123, 0xaa3a5bbc), TOBN(0x954ff225, 0x7bbb8e74), - TOBN(0xc42b8ab1, 0x97c3dfb9), TOBN(0x55a549b0, 0xcf168154), - TOBN(0xad6748e7, 0xc1b50692), TOBN(0x2775780f, 0x6fc5cbcb), - TOBN(0x4eab80b8, 0xe1c9d7c8), TOBN(0x8c69dae1, 0x3fdbcd56), - TOBN(0x47e6b4fb, 0x9969eace), TOBN(0x002f1085, 0xa705cb5a), - TOBN(0x4e23ca44, 0x6d3fea55), TOBN(0xb4ae9c86, 0xf4810568), - TOBN(0x47bfb91b, 0x2a62f27d), TOBN(0x60deb4c9, 0xd9bac28c), - TOBN(0xa892d894, 0x7de6c34c), TOBN(0x4ee68259, 0x4494587d), - TOBN(0x914ee14e, 0x1a3f8a5b), TOBN(0xbb113eaa, 0x28700385), - TOBN(0x81ca03b9, 0x2115b4c9), TOBN(0x7c163d38, 0x8908cad1), - TOBN(0xc912a118, 0xaa18179a), TOBN(0xe09ed750, 0x886e3081), - TOBN(0xa676e3fa, 0x26f516ca), TOBN(0x753cacf7, 0x8e732f91), - TOBN(0x51592aea, 0x833da8b4), TOBN(0xc626f42f, 0x4cbea8aa), - TOBN(0xef9dc899, 0xa7b56eaf), TOBN(0x00c0e52c, 0x34ef7316), - TOBN(0x5b1e4e24, 0xfe818a86), TOBN(0x9d31e20d, 0xc538be47), - TOBN(0x22eb932d, 0x3ed68974), TOBN(0xe44bbc08, 0x7c4e87c4), - TOBN(0x4121086e, 0x0dde9aef), TOBN(0x8e6b9cff, 0x134f4345), - TOBN(0x96892c1f, 0x711b0eb9), TOBN(0xb905f2c8, 0x780ab954), - TOBN(0xace26309, 0xa20792db), TOBN(0xec8ac9b3, 0x0684e126), - TOBN(0x486ad8b6, 0xb40a2447), TOBN(0x60121fc1, 0x9fe3fb24), - TOBN(0x5626fccf, 0x1a8e3b3f), TOBN(0x4e568622, 0x6ad1f394), - TOBN(0xda7aae0d, 0x196aa5a1), TOBN(0xe0df8c77, 0x1041b5fb), - TOBN(0x451465d9, 0x26b318b7), TOBN(0xc29b6e55, 0x7ab136e9), - TOBN(0x2c2ab48b, 0x71148463), TOBN(0xb5738de3, 0x64454a76), - TOBN(0x54ccf9a0, 0x5a03abe4), TOBN(0x377c0296, 0x0427d58e), - TOBN(0x73f5f0b9, 0x2bb39c1f), TOBN(0x14373f2c, 0xe608d8c5), - TOBN(0xdcbfd314, 0x00fbb805), TOBN(0xdf18fb20, 0x83afdcfb), - TOBN(0x81a57f42, 0x42b3523f), TOBN(0xe958532d, 0x87f650fb), - TOBN(0xaa8dc8b6, 0x8b0a7d7c), TOBN(0x1b75dfb7, 0x150166be), - TOBN(0x90e4f7c9, 0x2d7d1413), TOBN(0x67e2d6b5, 0x9834f597), - TOBN(0x4fd4f4f9, 0xa808c3e8), TOBN(0xaf8237e0, 0xd5281ec1), - TOBN(0x25ab5fdc, 0x84687cee), TOBN(0xc5ded6b1, 0xa5b26c09), - TOBN(0x8e4a5aec, 0xc8ea7650), TOBN(0x23b73e5c, 0x14cc417f), - TOBN(0x2bfb4318, 0x3037bf52), TOBN(0xb61e6db5, 0x78c725d7), - TOBN(0x8efd4060, 0xbbb3e5d7), TOBN(0x2e014701, 0xdbac488e), - TOBN(0xac75cf9a, 0x360aa449), TOBN(0xb70cfd05, 0x79634d08), - TOBN(0xa591536d, 0xfffb15ef), TOBN(0xb2c37582, 0xd07c106c), - TOBN(0xb4293fdc, 0xf50225f9), TOBN(0xc52e175c, 0xb0e12b03), - TOBN(0xf649c3ba, 0xd0a8bf64), TOBN(0x745a8fef, 0xeb8ae3c6), - TOBN(0x30d7e5a3, 0x58321bc3), TOBN(0xb1732be7, 0x0bc4df48), - TOBN(0x1f217993, 0xe9ea5058), TOBN(0xf7a71cde, 0x3e4fd745), - TOBN(0x86cc533e, 0x894c5bbb), TOBN(0x6915c7d9, 0x69d83082), - TOBN(0xa6aa2d05, 0x5815c244), TOBN(0xaeeee592, 0x49b22ce5), - TOBN(0x89e39d13, 0x78135486), TOBN(0x3a275c1f, 0x16b76f2f), - TOBN(0xdb6bcc1b, 0xe036e8f5), TOBN(0x4df69b21, 0x5e4709f5), - TOBN(0xa188b250, 0x2d0f39aa), TOBN(0x622118bb, 0x15a85947), - TOBN(0x2ebf520f, 0xfde0f4fa), TOBN(0xa40e9f29, 0x4860e539), - TOBN(0x7b6a51eb, 0x22b57f0f), TOBN(0x849a33b9, 0x7e80644a), - TOBN(0x50e5d16f, 0x1cf095fe), TOBN(0xd754b54e, 0xec55f002), - TOBN(0x5cfbbb22, 0x236f4a98), TOBN(0x0b0c59e9, 0x066800bb), - TOBN(0x4ac69a8f, 0x5a9a7774), TOBN(0x2b33f804, 0xd6bec948), - TOBN(0xb3729295, 0x32e6c466), TOBN(0x68956d0f, 0x4e599c73), - TOBN(0xa47a249f, 0x155c31cc), TOBN(0x24d80f0d, 0xe1ce284e), - TOBN(0xcd821dfb, 0x988baf01), TOBN(0xe6331a7d, 0xdbb16647), - TOBN(0x1eb8ad33, 0x094cb960), TOBN(0x593cca38, 0xc91bbca5), - TOBN(0x384aac8d, 0x26567456), TOBN(0x40fa0309, 0xc04b6490), - TOBN(0x97834cd6, 0xdab6c8f6), TOBN(0x68a7318d, 0x3f91e55f), - TOBN(0xa00fd04e, 0xfc4d3157), TOBN(0xb56f8ab2, 0x2bf3bdea), - TOBN(0x014f5648, 0x4fa57172), TOBN(0x948c5860, 0x450abdb3), - TOBN(0x342b5df0, 0x0ebd4f08), TOBN(0x3e5168cd, 0x0e82938e), - TOBN(0x7aedc1ce, 0xb0df5dd0), TOBN(0x6bbbc6d9, 0xe5732516), - TOBN(0xc7bfd486, 0x605daaa6), TOBN(0x46fd72b7, 0xbb9a6c9e), - TOBN(0xe4847fb1, 0xa124fb89), TOBN(0x75959cbd, 0xa2d8ffbc), - TOBN(0x42579f65, 0xc8a588ee), TOBN(0x368c92e6, 0xb80b499d), - TOBN(0xea4ef6cd, 0x999a5df1), TOBN(0xaa73bb7f, 0x936fe604), - TOBN(0xf347a70d, 0x6457d188), TOBN(0x86eda86b, 0x8b7a388b), - TOBN(0xb7cdff06, 0x0ccd6013), TOBN(0xbeb1b6c7, 0xd0053fb2), - TOBN(0x0b022387, 0x99240a9f), TOBN(0x1bbb384f, 0x776189b2), - TOBN(0x8695e71e, 0x9066193a), TOBN(0x2eb50097, 0x06ffac7e), - TOBN(0x0654a9c0, 0x4a7d2caa), TOBN(0x6f3fb3d1, 0xa5aaa290), - TOBN(0x835db041, 0xff476e8f), TOBN(0x540b8b0b, 0xc42295e4), - TOBN(0xa5c73ac9, 0x05e214f5), TOBN(0x9a74075a, 0x56a0b638), - TOBN(0x2e4b1090, 0xce9e680b), TOBN(0x57a5b479, 0x6b8d9afa), - TOBN(0x0dca48e7, 0x26bfe65c), TOBN(0x097e391c, 0x7290c307), - TOBN(0x683c462e, 0x6669e72e), TOBN(0xf505be1e, 0x062559ac), - TOBN(0x5fbe3ea1, 0xe3a3035a), TOBN(0x6431ebf6, 0x9cd50da8), - TOBN(0xfd169d5c, 0x1f6407f2), TOBN(0x8d838a95, 0x60fce6b8), - TOBN(0x2a2bfa7f, 0x650006f0), TOBN(0xdfd7dad3, 0x50c0fbb2), - TOBN(0x92452495, 0xccf9ad96), TOBN(0x183bf494, 0xd95635f9), - TOBN(0x02d5df43, 0x4a7bd989), TOBN(0x505385cc, 0xa5431095), - TOBN(0xdd98e67d, 0xfd43f53e), TOBN(0xd61e1a6c, 0x500c34a9), - TOBN(0x5a4b46c6, 0x4a8a3d62), TOBN(0x8469c4d0, 0x247743d2), - TOBN(0x2bb3a13d, 0x88f7e433), TOBN(0x62b23a10, 0x01be5849), - TOBN(0xe83596b4, 0xa63d1a4c), TOBN(0x454e7fea, 0x7d183f3e), - TOBN(0x643fce61, 0x17afb01c), TOBN(0x4e65e5e6, 0x1c4c3638), - TOBN(0x41d85ea1, 0xef74c45b), TOBN(0x2cfbfa66, 0xae328506), - TOBN(0x98b078f5, 0x3ada7da9), TOBN(0xd985fe37, 0xec752fbb), - TOBN(0xeece68fe, 0x5a0148b4), TOBN(0x6f9a55c7, 0x2d78136d), - TOBN(0x232dccc4, 0xd2b729ce), TOBN(0xa27e0dfd, 0x90aafbc4), - TOBN(0x96474452, 0x12b4603e), TOBN(0xa876c551, 0x6b706d14), - TOBN(0xdf145fcf, 0x69a9d412), TOBN(0xe2ab75b7, 0x2d479c34), - TOBN(0x12df9a76, 0x1a23ff97), TOBN(0xc6138992, 0x5d359d10), - TOBN(0x6e51c7ae, 0xfa835f22), TOBN(0x69a79cb1, 0xc0fcc4d9), - TOBN(0xf57f350d, 0x594cc7e1), TOBN(0x3079ca63, 0x3350ab79), - TOBN(0x226fb614, 0x9aff594a), TOBN(0x35afec02, 0x6d59a62b), - TOBN(0x9bee46f4, 0x06ed2c6e), TOBN(0x58da1735, 0x7d939a57), - TOBN(0x44c50402, 0x8fd1797e), TOBN(0xd8853e7c, 0x5ccea6ca), - TOBN(0x4065508d, 0xa35fcd5f), TOBN(0x8965df8c, 0x495ccaeb), - TOBN(0x0f2da850, 0x12e1a962), TOBN(0xee471b94, 0xc1cf1cc4), - TOBN(0xcef19bc8, 0x0a08fb75), TOBN(0x704958f5, 0x81de3591), - TOBN(0x2867f8b2, 0x3aef4f88), TOBN(0x8d749384, 0xea9f9a5f), - TOBN(0x1b385537, 0x8c9049f4), TOBN(0x5be948f3, 0x7b92d8b6), - TOBN(0xd96f725d, 0xb6e2bd6b), TOBN(0x37a222bc, 0x958c454d), - TOBN(0xe7c61abb, 0x8809bf61), TOBN(0x46f07fbc, 0x1346f18d), - TOBN(0xfb567a7a, 0xe87c0d1c), TOBN(0x84a461c8, 0x7ef3d07a), - TOBN(0x0a5adce6, 0xd9278d98), TOBN(0x24d94813, 0x9dfc73e1), - TOBN(0x4f3528b6, 0x054321c3), TOBN(0x2e03fdde, 0x692ea706), - TOBN(0x10e60619, 0x47b533c0), TOBN(0x1a8bc73f, 0x2ca3c055), - TOBN(0xae58d4b2, 0x1bb62b8f), TOBN(0xb2045a73, 0x584a24e3), - TOBN(0x3ab3d5af, 0xbd76e195), TOBN(0x478dd1ad, 0x6938a810), - TOBN(0x6ffab393, 0x6ee3d5cb), TOBN(0xdfb693db, 0x22b361e4), - TOBN(0xf9694496, 0x51dbf1a7), TOBN(0xcab4b4ef, 0x08a2e762), - TOBN(0xe8c92f25, 0xd39bba9a), TOBN(0x850e61bc, 0xf1464d96), - TOBN(0xb7e830e3, 0xdc09508b), TOBN(0xfaf6d2cf, 0x74317655), - TOBN(0x72606ceb, 0xdf690355), TOBN(0x48bb92b3, 0xd0c3ded6), - TOBN(0x65b75484, 0x5c7cf892), TOBN(0xf6cd7ac9, 0xd5d5f01f), - TOBN(0xc2c30a59, 0x96401d69), TOBN(0x91268650, 0xed921878), - TOBN(0x380bf913, 0xb78c558f), TOBN(0x43c0baeb, 0xc8afdaa9), - TOBN(0x377f61d5, 0x54f169d3), TOBN(0xf8da07e3, 0xae5ff20b), - TOBN(0xb676c49d, 0xa8a90ea8), TOBN(0x81c1ff2b, 0x83a29b21), - TOBN(0x383297ac, 0x2ad8d276), TOBN(0x3001122f, 0xba89f982), - TOBN(0xe1d794be, 0x6718e448), TOBN(0x246c1482, 0x7c3e6e13), - TOBN(0x56646ef8, 0x5d26b5ef), TOBN(0x80f5091e, 0x88069cdd), - TOBN(0xc5992e2f, 0x724bdd38), TOBN(0x02e915b4, 0x8471e8c7), - TOBN(0x96ff320a, 0x0d0ff2a9), TOBN(0xbf886487, 0x4384d1a0), - TOBN(0xbbe1e6a6, 0xc93f72d6), TOBN(0xd5f75d12, 0xcad800ea), - TOBN(0xfa40a09f, 0xe7acf117), TOBN(0x32c8cdd5, 0x7581a355), - TOBN(0x74221992, 0x7023c499), TOBN(0xa8afe5d7, 0x38ec3901), - TOBN(0x5691afcb, 0xa90e83f0), TOBN(0x41bcaa03, 0x0b8f8eac), - TOBN(0xe38b5ff9, 0x8d2668d5), TOBN(0x0715281a, 0x7ad81965), - TOBN(0x1bc8fc7c, 0x03c6ce11), TOBN(0xcbbee6e2, 0x8b650436), - TOBN(0x06b00fe8, 0x0cdb9808), TOBN(0x17d6e066, 0xfe3ed315), - TOBN(0x2e9d38c6, 0x4d0b5018), TOBN(0xab8bfd56, 0x844dcaef), - TOBN(0x42894a59, 0x513aed8b), TOBN(0xf77f3b6d, 0x314bd07a), - TOBN(0xbbdecb8f, 0x8e42b582), TOBN(0xf10e2fa8, 0xd2390fe6), - TOBN(0xefb95022, 0x62a2f201), TOBN(0x4d59ea50, 0x50ee32b0), - TOBN(0xd87f7728, 0x6da789a8), TOBN(0xcf98a2cf, 0xf79492c4), - TOBN(0xf9577239, 0x720943c2), TOBN(0xba044cf5, 0x3990b9d0), - TOBN(0x5aa8e823, 0x95f2884a), TOBN(0x834de6ed, 0x0278a0af), - TOBN(0xc8e1ee9a, 0x5f25bd12), TOBN(0x9259ceaa, 0x6f7ab271), - TOBN(0x7e6d97a2, 0x77d00b76), TOBN(0x5c0c6eea, 0xa437832a), - TOBN(0x5232c20f, 0x5606b81d), TOBN(0xabd7b375, 0x0d991ee5), - TOBN(0x4d2bfe35, 0x8632d951), TOBN(0x78f85146, 0x98ed9364), - TOBN(0x951873f0, 0xf30c3282), TOBN(0x0da8ac80, 0xa789230b), - TOBN(0x3ac7789c, 0x5398967f), TOBN(0xa69b8f7f, 0xbdda0fb5), - TOBN(0xe5db7717, 0x6add8545), TOBN(0x1b71cb66, 0x72c49b66), - TOBN(0xd8560739, 0x68421d77), TOBN(0x03840fe8, 0x83e3afea), - TOBN(0xb391dad5, 0x1ec69977), TOBN(0xae243fb9, 0x307f6726), - TOBN(0xc88ac87b, 0xe8ca160c), TOBN(0x5174cced, 0x4ce355f4), - TOBN(0x98a35966, 0xe58ba37d), TOBN(0xfdcc8da2, 0x7817335d), - TOBN(0x5b752830, 0x83fbc7bf), TOBN(0x68e419d4, 0xd9c96984), - TOBN(0x409a39f4, 0x02a40380), TOBN(0x88940faf, 0x1fe977bc), - TOBN(0xc640a94b, 0x8f8edea6), TOBN(0x1e22cd17, 0xed11547d), - TOBN(0xe28568ce, 0x59ffc3e2), TOBN(0x60aa1b55, 0xc1dee4e7), - TOBN(0xc67497c8, 0x837cb363), TOBN(0x06fb438a, 0x105a2bf2), - TOBN(0x30357ec4, 0x500d8e20), TOBN(0x1ad9095d, 0x0670db10), - TOBN(0x7f589a05, 0xc73b7cfd), TOBN(0xf544607d, 0x880d6d28), - TOBN(0x17ba93b1, 0xa20ef103), TOBN(0xad859130, 0x6ba6577b), - TOBN(0x65c91cf6, 0x6fa214a0), TOBN(0xd7d49c6c, 0x27990da5), - TOBN(0xecd9ec8d, 0x20bb569d), TOBN(0xbd4b2502, 0xeeffbc33), - TOBN(0x2056ca5a, 0x6bed0467), TOBN(0x7916a1f7, 0x5b63728c), - TOBN(0xd4f9497d, 0x53a4f566), TOBN(0x89734664, 0x97b56810), - TOBN(0xf8e1da74, 0x0494a621), TOBN(0x82546a93, 0x8d011c68), - TOBN(0x1f3acb19, 0xc61ac162), TOBN(0x52f8fa9c, 0xabad0d3e), - TOBN(0x15356523, 0xb4b7ea43), TOBN(0x5a16ad61, 0xae608125), - TOBN(0xb0bcb87f, 0x4faed184), TOBN(0x5f236b1d, 0x5029f45f), - TOBN(0xd42c7607, 0x0bc6b1fc), TOBN(0xc644324e, 0x68aefce3), - TOBN(0x8e191d59, 0x5c5d8446), TOBN(0xc0208077, 0x13ae1979), - TOBN(0xadcaee55, 0x3ba59cc7), TOBN(0x20ed6d6b, 0xa2cb81ba), - TOBN(0x0952ba19, 0xb6efcffc), TOBN(0x60f12d68, 0x97c0b87c), - TOBN(0x4ee2c7c4, 0x9caa30bc), TOBN(0x767238b7, 0x97fbff4e), - TOBN(0xebc73921, 0x501b5d92), TOBN(0x3279e3df, 0xc2a37737), - TOBN(0x9fc12bc8, 0x6d197543), TOBN(0xfa94dc6f, 0x0a40db4e), - TOBN(0x7392b41a, 0x530ccbbd), TOBN(0x87c82146, 0xea823525), - TOBN(0xa52f984c, 0x05d98d0c), TOBN(0x2ae57d73, 0x5ef6974c), - TOBN(0x9377f7bf, 0x3042a6dd), TOBN(0xb1a007c0, 0x19647a64), - TOBN(0xfaa9079a, 0x0cca9767), TOBN(0x3d81a25b, 0xf68f72d5), - TOBN(0x752067f8, 0xff81578e), TOBN(0x78622150, 0x9045447d), - TOBN(0xc0c22fcf, 0x0505aa6f), TOBN(0x1030f0a6, 0x6bed1c77), - TOBN(0x31f29f15, 0x1f0bd739), TOBN(0x2d7989c7, 0xe6debe85), - TOBN(0x5c070e72, 0x8e677e98), TOBN(0x0a817bd3, 0x06e81fd5), - TOBN(0xc110d830, 0xb0f2ac95), TOBN(0x48d0995a, 0xab20e64e), - TOBN(0x0f3e00e1, 0x7729cd9a), TOBN(0x2a570c20, 0xdd556946), - TOBN(0x912dbcfd, 0x4e86214d), TOBN(0x2d014ee2, 0xcf615498), - TOBN(0x55e2b1e6, 0x3530d76e), TOBN(0xc5135ae4, 0xfd0fd6d1), - TOBN(0x0066273a, 0xd4f3049f), TOBN(0xbb8e9893, 0xe7087477), - TOBN(0x2dba1ddb, 0x14c6e5fd), TOBN(0xdba37886, 0x51f57e6c), - TOBN(0x5aaee0a6, 0x5a72f2cf), TOBN(0x1208bfbf, 0x7bea5642), - TOBN(0xf5c6aa3b, 0x67872c37), TOBN(0xd726e083, 0x43f93224), - TOBN(0x1854daa5, 0x061f1658), TOBN(0xc0016df1, 0xdf0cd2b3), - TOBN(0xc2a3f23e, 0x833d50de), TOBN(0x73b681d2, 0xbbbd3017), - TOBN(0x2f046dc4, 0x3ac343c0), TOBN(0x9c847e7d, 0x85716421), - TOBN(0xe1e13c91, 0x0917eed4), TOBN(0x3fc9eebd, 0x63a1b9c6), - TOBN(0x0f816a72, 0x7fe02299), TOBN(0x6335ccc2, 0x294f3319), - TOBN(0x3820179f, 0x4745c5be), TOBN(0xe647b782, 0x922f066e), - TOBN(0xc22e49de, 0x02cafb8a), TOBN(0x299bc2ff, 0xfcc2eccc), - TOBN(0x9a8feea2, 0x6e0e8282), TOBN(0xa627278b, 0xfe893205), - TOBN(0xa7e19733, 0x7933e47b), TOBN(0xf4ff6b13, 0x2e766402), - TOBN(0xa4d8be0a, 0x98440d9f), TOBN(0x658f5c2f, 0x38938808), - TOBN(0x90b75677, 0xc95b3b3e), TOBN(0xfa044269, 0x3137b6ff), - TOBN(0x077b039b, 0x43c47c29), TOBN(0xcca95dd3, 0x8a6445b2), - TOBN(0x0b498ba4, 0x2333fc4c), TOBN(0x274f8e68, 0xf736a1b1), - TOBN(0x6ca348fd, 0x5f1d4b2e), TOBN(0x24d3be78, 0xa8f10199), - TOBN(0x8535f858, 0xca14f530), TOBN(0xa6e7f163, 0x5b982e51), - TOBN(0x847c8512, 0x36e1bf62), TOBN(0xf6a7c58e, 0x03448418), - TOBN(0x583f3703, 0xf9374ab6), TOBN(0x864f9195, 0x6e564145), - TOBN(0x33bc3f48, 0x22526d50), TOBN(0x9f323c80, 0x1262a496), - TOBN(0xaa97a7ae, 0x3f046a9a), TOBN(0x70da183e, 0xdf8a039a), - TOBN(0x5b68f71c, 0x52aa0ba6), TOBN(0x9be0fe51, 0x21459c2d), - TOBN(0xc1e17eb6, 0xcbc613e5), TOBN(0x33131d55, 0x497ea61c), - TOBN(0x2f69d39e, 0xaf7eded5), TOBN(0x73c2f434, 0xde6af11b), - TOBN(0x4ca52493, 0xa4a375fa), TOBN(0x5f06787c, 0xb833c5c2), - TOBN(0x814e091f, 0x3e6e71cf), TOBN(0x76451f57, 0x8b746666)}, - {TOBN(0x80f9bdef, 0x694db7e0), TOBN(0xedca8787, 0xb9fcddc6), - TOBN(0x51981c34, 0x03b8dce1), TOBN(0x4274dcf1, 0x70e10ba1), - TOBN(0xf72743b8, 0x6def6d1a), TOBN(0xd25b1670, 0xebdb1866), - TOBN(0xc4491e8c, 0x050c6f58), TOBN(0x2be2b2ab, 0x87fbd7f5), - TOBN(0x3e0e5c9d, 0xd111f8ec), TOBN(0xbcc33f8d, 0xb7c4e760), - TOBN(0x702f9a91, 0xbd392a51), TOBN(0x7da4a795, 0xc132e92d), - TOBN(0x1a0b0ae3, 0x0bb1151b), TOBN(0x54febac8, 0x02e32251), - TOBN(0xea3a5082, 0x694e9e78), TOBN(0xe58ffec1, 0xe4fe40b8), - TOBN(0xf85592fc, 0xd1e0cf9e), TOBN(0xdea75f0d, 0xc0e7b2e8), - TOBN(0xc04215cf, 0xc135584e), TOBN(0x174fc727, 0x2f57092a), - TOBN(0xe7277877, 0xeb930bea), TOBN(0x504caccb, 0x5eb02a5a), - TOBN(0xf9fe08f7, 0xf5241b9b), TOBN(0xe7fb62f4, 0x8d5ca954), - TOBN(0xfbb8349d, 0x29c4120b), TOBN(0x9f94391f, 0xc0d0d915), - TOBN(0xc4074fa7, 0x5410ba51), TOBN(0xa66adbf6, 0x150a5911), - TOBN(0xc164543c, 0x34bfca38), TOBN(0xe0f27560, 0xb9e1ccfc), - TOBN(0x99da0f53, 0xe820219c), TOBN(0xe8234498, 0xc6b4997a), - TOBN(0xcfb88b76, 0x9d4c5423), TOBN(0x9e56eb10, 0xb0521c49), - TOBN(0x418e0b5e, 0xbe8700a1), TOBN(0x00cbaad6, 0xf93cb58a), - TOBN(0xe923fbde, 0xd92a5e67), TOBN(0xca4979ac, 0x1f347f11), - TOBN(0x89162d85, 0x6bc0585b), TOBN(0xdd6254af, 0xac3c70e3), - TOBN(0x7b23c513, 0x516e19e4), TOBN(0x56e2e847, 0xc5c4d593), - TOBN(0x9f727d73, 0x5ce71ef6), TOBN(0x5b6304a6, 0xf79a44c5), - TOBN(0x6638a736, 0x3ab7e433), TOBN(0x1adea470, 0xfe742f83), - TOBN(0xe054b854, 0x5b7fc19f), TOBN(0xf935381a, 0xba1d0698), - TOBN(0x546eab2d, 0x799e9a74), TOBN(0x96239e0e, 0xa949f729), - TOBN(0xca274c6b, 0x7090055a), TOBN(0x835142c3, 0x9020c9b0), - TOBN(0xa405667a, 0xa2e8807f), TOBN(0x29f2c085, 0x1aa3d39e), - TOBN(0xcc555d64, 0x42fc72f5), TOBN(0xe856e0e7, 0xfbeacb3c), - TOBN(0xb5504f9d, 0x918e4936), TOBN(0x65035ef6, 0xb2513982), - TOBN(0x0553a0c2, 0x6f4d9cb9), TOBN(0x6cb10d56, 0xbea85509), - TOBN(0x48d957b7, 0xa242da11), TOBN(0x16a4d3dd, 0x672b7268), - TOBN(0x3d7e637c, 0x8502a96b), TOBN(0x27c7032b, 0x730d463b), - TOBN(0xbdc02b18, 0xe4136a14), TOBN(0xbacf969d, 0x678e32bf), - TOBN(0xc98d89a3, 0xdd9c3c03), TOBN(0x7b92420a, 0x23becc4f), - TOBN(0xd4b41f78, 0xc64d565c), TOBN(0x9f969d00, 0x10f28295), - TOBN(0xec7f7f76, 0xb13d051a), TOBN(0x08945e1e, 0xa92da585), - TOBN(0x55366b7d, 0x5846426f), TOBN(0xe7d09e89, 0x247d441d), - TOBN(0x510b404d, 0x736fbf48), TOBN(0x7fa003d0, 0xe784bd7d), - TOBN(0x25f7614f, 0x17fd9596), TOBN(0x49e0e0a1, 0x35cb98db), - TOBN(0x2c65957b, 0x2e83a76a), TOBN(0x5d40da8d, 0xcddbe0f8), - TOBN(0xf2b8c405, 0x050bad24), TOBN(0x8918426d, 0xc2aa4823), - TOBN(0x2aeab3dd, 0xa38365a7), TOBN(0x72031717, 0x7c91b690), - TOBN(0x8b00d699, 0x60a94120), TOBN(0x478a255d, 0xe99eaeec), - TOBN(0xbf656a5f, 0x6f60aafd), TOBN(0xdfd7cb75, 0x5dee77b3), - TOBN(0x37f68bb4, 0xa595939d), TOBN(0x03556479, 0x28740217), - TOBN(0x8e740e7c, 0x84ad7612), TOBN(0xd89bc843, 0x9044695f), - TOBN(0xf7f3da5d, 0x85a9184d), TOBN(0x562563bb, 0x9fc0b074), - TOBN(0x06d2e6aa, 0xf88a888e), TOBN(0x612d8643, 0x161fbe7c), - TOBN(0x465edba7, 0xf64085e7), TOBN(0xb230f304, 0x29aa8511), - TOBN(0x53388426, 0xcda2d188), TOBN(0x90885735, 0x4b666649), - TOBN(0x6f02ff9a, 0x652f54f6), TOBN(0x65c82294, 0x5fae2bf0), - TOBN(0x7816ade0, 0x62f5eee3), TOBN(0xdcdbdf43, 0xfcc56d70), - TOBN(0x9fb3bba3, 0x54530bb2), TOBN(0xbde3ef77, 0xcb0869ea), - TOBN(0x89bc9046, 0x0b431163), TOBN(0x4d03d7d2, 0xe4819a35), - TOBN(0x33ae4f9e, 0x43b6a782), TOBN(0x216db307, 0x9c88a686), - TOBN(0x91dd88e0, 0x00ffedd9), TOBN(0xb280da9f, 0x12bd4840), - TOBN(0x32a7cb8a, 0x1635e741), TOBN(0xfe14008a, 0x78be02a7), - TOBN(0x3fafb334, 0x1b7ae030), TOBN(0x7fd508e7, 0x5add0ce9), - TOBN(0x72c83219, 0xd607ad51), TOBN(0x0f229c0a, 0x8d40964a), - TOBN(0x1be2c336, 0x1c878da2), TOBN(0xe0c96742, 0xeab2ab86), - TOBN(0x458f8691, 0x3e538cd7), TOBN(0xa7001f6c, 0x8e08ad53), - TOBN(0x52b8c6e6, 0xbf5d15ff), TOBN(0x548234a4, 0x011215dd), - TOBN(0xff5a9d2d, 0x3d5b4045), TOBN(0xb0ffeeb6, 0x4a904190), - TOBN(0x55a3aca4, 0x48607f8b), TOBN(0x8cbd665c, 0x30a0672a), - TOBN(0x87f834e0, 0x42583068), TOBN(0x02da2aeb, 0xf3f6e683), - TOBN(0x6b763e5d, 0x05c12248), TOBN(0x7230378f, 0x65a8aefc), - TOBN(0x93bd80b5, 0x71e8e5ca), TOBN(0x53ab041c, 0xb3b62524), - TOBN(0x1b860513, 0x6c9c552e), TOBN(0xe84d402c, 0xd5524e66), - TOBN(0xa37f3573, 0xf37f5937), TOBN(0xeb0f6c7d, 0xd1e4fca5), - TOBN(0x2965a554, 0xac8ab0fc), TOBN(0x17fbf56c, 0x274676ac), - TOBN(0x2e2f6bd9, 0xacf7d720), TOBN(0x41fc8f88, 0x10224766), - TOBN(0x517a14b3, 0x85d53bef), TOBN(0xdae327a5, 0x7d76a7d1), - TOBN(0x6ad0a065, 0xc4818267), TOBN(0x33aa189b, 0x37c1bbc1), - TOBN(0x64970b52, 0x27392a92), TOBN(0x21699a1c, 0x2d1535ea), - TOBN(0xcd20779c, 0xc2d7a7fd), TOBN(0xe3186059, 0x99c83cf2), - TOBN(0x9b69440b, 0x72c0b8c7), TOBN(0xa81497d7, 0x7b9e0e4d), - TOBN(0x515d5c89, 0x1f5f82dc), TOBN(0x9a7f67d7, 0x6361079e), - TOBN(0xa8da81e3, 0x11a35330), TOBN(0xe44990c4, 0x4b18be1b), - TOBN(0xc7d5ed95, 0xaf103e59), TOBN(0xece8aba7, 0x8dac9261), - TOBN(0xbe82b099, 0x9394b8d3), TOBN(0x6830f09a, 0x16adfe83), - TOBN(0x250a29b4, 0x88172d01), TOBN(0x8b20bd65, 0xcaff9e02), - TOBN(0xb8a7661e, 0xe8a6329a), TOBN(0x4520304d, 0xd3fce920), - TOBN(0xae45da1f, 0x2b47f7ef), TOBN(0xe07f5288, 0x5bffc540), - TOBN(0xf7997009, 0x3464f874), TOBN(0x2244c2cd, 0xa6fa1f38), - TOBN(0x43c41ac1, 0x94d7d9b1), TOBN(0x5bafdd82, 0xc82e7f17), - TOBN(0xdf0614c1, 0x5fda0fca), TOBN(0x74b043a7, 0xa8ae37ad), - TOBN(0x3ba6afa1, 0x9e71734c), TOBN(0x15d5437e, 0x9c450f2e), - TOBN(0x4a5883fe, 0x67e242b1), TOBN(0x5143bdc2, 0x2c1953c2), - TOBN(0x542b8b53, 0xfc5e8920), TOBN(0x363bf9a8, 0x9a9cee08), - TOBN(0x02375f10, 0xc3486e08), TOBN(0x2037543b, 0x8c5e70d2), - TOBN(0x7109bccc, 0x625640b4), TOBN(0xcbc1051e, 0x8bc62c3b), - TOBN(0xf8455fed, 0x803f26ea), TOBN(0x6badceab, 0xeb372424), - TOBN(0xa2a9ce7c, 0x6b53f5f9), TOBN(0x64246595, 0x1b176d99), - TOBN(0xb1298d36, 0xb95c081b), TOBN(0x53505bb8, 0x1d9a9ee6), - TOBN(0x3f6f9e61, 0xf2ba70b0), TOBN(0xd07e16c9, 0x8afad453), - TOBN(0x9f1694bb, 0xe7eb4a6a), TOBN(0xdfebced9, 0x3cb0bc8e), - TOBN(0x92d3dcdc, 0x53868c8b), TOBN(0x174311a2, 0x386107a6), - TOBN(0x4109e07c, 0x689b4e64), TOBN(0x30e4587f, 0x2df3dcb6), - TOBN(0x841aea31, 0x0811b3b2), TOBN(0x6144d41d, 0x0cce43ea), - TOBN(0x464c4581, 0x2a9a7803), TOBN(0xd03d371f, 0x3e158930), - TOBN(0xc676d7f2, 0xb1f3390b), TOBN(0x9f7a1b8c, 0xa5b61272), - TOBN(0x4ebebfc9, 0xc2e127a9), TOBN(0x4602500c, 0x5dd997bf), - TOBN(0x7f09771c, 0x4711230f), TOBN(0x058eb37c, 0x020f09c1), - TOBN(0xab693d4b, 0xfee5e38b), TOBN(0x9289eb1f, 0x4653cbc0), - TOBN(0xbecf46ab, 0xd51b9cf5), TOBN(0xd2aa9c02, 0x9f0121af), - TOBN(0x36aaf7d2, 0xe90dc274), TOBN(0x909e4ea0, 0x48b95a3c), - TOBN(0xe6b70496, 0x6f32dbdb), TOBN(0x672188a0, 0x8b030b3e), - TOBN(0xeeffe5b3, 0xcfb617e2), TOBN(0x87e947de, 0x7c82709e), - TOBN(0xa44d2b39, 0x1770f5a7), TOBN(0xe4d4d791, 0x0e44eb82), - TOBN(0x42e69d1e, 0x3f69712a), TOBN(0xbf11c4d6, 0xac6a820e), - TOBN(0xb5e7f3e5, 0x42c4224c), TOBN(0xd6b4e81c, 0x449d941c), - TOBN(0x5d72bd16, 0x5450e878), TOBN(0x6a61e28a, 0xee25ac54), - TOBN(0x33272094, 0xe6f1cd95), TOBN(0x7512f30d, 0x0d18673f), - TOBN(0x32f7a4ca, 0x5afc1464), TOBN(0x2f095656, 0x6bbb977b), - TOBN(0x586f47ca, 0xa8226200), TOBN(0x02c868ad, 0x1ac07369), - TOBN(0x4ef2b845, 0xc613acbe), TOBN(0x43d7563e, 0x0386054c), - TOBN(0x54da9dc7, 0xab952578), TOBN(0xb5423df2, 0x26e84d0b), - TOBN(0xa8b64eeb, 0x9b872042), TOBN(0xac205782, 0x5990f6df), - TOBN(0x4ff696eb, 0x21f4c77a), TOBN(0x1a79c3e4, 0xaab273af), - TOBN(0x29bc922e, 0x9436b3f1), TOBN(0xff807ef8, 0xd6d9a27a), - TOBN(0x82acea3d, 0x778f22a0), TOBN(0xfb10b2e8, 0x5b5e7469), - TOBN(0xc0b16980, 0x2818ee7d), TOBN(0x011afff4, 0xc91c1a2f), - TOBN(0x95a6d126, 0xad124418), TOBN(0x31c081a5, 0xe72e295f), - TOBN(0x36bb283a, 0xf2f4db75), TOBN(0xd115540f, 0x7acef462), - TOBN(0xc7f3a8f8, 0x33f6746c), TOBN(0x21e46f65, 0xfea990ca), - TOBN(0x915fd5c5, 0xcaddb0a9), TOBN(0xbd41f016, 0x78614555), - TOBN(0x346f4434, 0x426ffb58), TOBN(0x80559436, 0x14dbc204), - TOBN(0xf3dd20fe, 0x5a969b7f), TOBN(0x9d59e956, 0xe899a39a), - TOBN(0xf1b0971c, 0x8ad4cf4b), TOBN(0x03448860, 0x2ffb8fb8), - TOBN(0xf071ac3c, 0x65340ba4), TOBN(0x408d0596, 0xb27fd758), - TOBN(0xe7c78ea4, 0x98c364b0), TOBN(0xa4aac4a5, 0x051e8ab5), - TOBN(0xb9e1d560, 0x485d9002), TOBN(0x9acd518a, 0x88844455), - TOBN(0xe4ca688f, 0xd06f56c0), TOBN(0xa48af70d, 0xdf027972), - TOBN(0x691f0f04, 0x5e9a609d), TOBN(0xa9dd82cd, 0xee61270e), - TOBN(0x8903ca63, 0xa0ef18d3), TOBN(0x9fb7ee35, 0x3d6ca3bd), - TOBN(0xa7b4a09c, 0xabf47d03), TOBN(0x4cdada01, 0x1c67de8e), - TOBN(0x52003749, 0x9355a244), TOBN(0xe77fd2b6, 0x4f2151a9), - TOBN(0x695d6cf6, 0x66b4efcb), TOBN(0xc5a0cacf, 0xda2cfe25), - TOBN(0x104efe5c, 0xef811865), TOBN(0xf52813e8, 0x9ea5cc3d), - TOBN(0x855683dc, 0x40b58dbc), TOBN(0x0338ecde, 0x175fcb11), - TOBN(0xf9a05637, 0x74921592), TOBN(0xb4f1261d, 0xb9bb9d31), - TOBN(0x551429b7, 0x4e9c5459), TOBN(0xbe182e6f, 0x6ea71f53), - TOBN(0xd3a3b07c, 0xdfc50573), TOBN(0x9ba1afda, 0x62be8d44), - TOBN(0x9bcfd2cb, 0x52ab65d3), TOBN(0xdf11d547, 0xa9571802), - TOBN(0x099403ee, 0x02a2404a), TOBN(0x497406f4, 0x21088a71), - TOBN(0x99479409, 0x5004ae71), TOBN(0xbdb42078, 0xa812c362), - TOBN(0x2b72a30f, 0xd8828442), TOBN(0x283add27, 0xfcb5ed1c), - TOBN(0xf7c0e200, 0x66a40015), TOBN(0x3e3be641, 0x08b295ef), - TOBN(0xac127dc1, 0xe038a675), TOBN(0x729deff3, 0x8c5c6320), - TOBN(0xb7df8fd4, 0xa90d2c53), TOBN(0x9b74b0ec, 0x681e7cd3), - TOBN(0x5cb5a623, 0xdab407e5), TOBN(0xcdbd3615, 0x76b340c6), - TOBN(0xa184415a, 0x7d28392c), TOBN(0xc184c1d8, 0xe96f7830), - TOBN(0xc3204f19, 0x81d3a80f), TOBN(0xfde0c841, 0xc8e02432), - TOBN(0x78203b3e, 0x8149e0c1), TOBN(0x5904bdbb, 0x08053a73), - TOBN(0x30fc1dd1, 0x101b6805), TOBN(0x43c223bc, 0x49aa6d49), - TOBN(0x9ed67141, 0x7a174087), TOBN(0x311469a0, 0xd5997008), - TOBN(0xb189b684, 0x5e43fc61), TOBN(0xf3282375, 0xe0d3ab57), - TOBN(0x4fa34b67, 0xb1181da8), TOBN(0x621ed0b2, 0x99ee52b8), - TOBN(0x9b178de1, 0xad990676), TOBN(0xd51de67b, 0x56d54065), - TOBN(0x2a2c27c4, 0x7538c201), TOBN(0x33856ec8, 0x38a40f5c), - TOBN(0x2522fc15, 0xbe6cdcde), TOBN(0x1e603f33, 0x9f0c6f89), - TOBN(0x7994edc3, 0x103e30a6), TOBN(0x033a00db, 0x220c853e), - TOBN(0xd3cfa409, 0xf7bb7fd7), TOBN(0x70f8781e, 0x462d18f6), - TOBN(0xbbd82980, 0x687fe295), TOBN(0x6eef4c32, 0x595669f3), - TOBN(0x86a9303b, 0x2f7e85c3), TOBN(0x5fce4621, 0x71988f9b), - TOBN(0x5b935bf6, 0xc138acb5), TOBN(0x30ea7d67, 0x25661212), - TOBN(0xef1eb5f4, 0xe51ab9a2), TOBN(0x0587c98a, 0xae067c78), - TOBN(0xb3ce1b3c, 0x77ca9ca6), TOBN(0x2a553d4d, 0x54b5f057), - TOBN(0xc7898236, 0x4da29ec2), TOBN(0xdbdd5d13, 0xb9c57316), - TOBN(0xc57d6e6b, 0x2cd80d47), TOBN(0x80b460cf, 0xfe9e7391), - TOBN(0x98648cab, 0xf963c31e), TOBN(0x67f9f633, 0xcc4d32fd), - TOBN(0x0af42a9d, 0xfdf7c687), TOBN(0x55f292a3, 0x0b015ea7), - TOBN(0x89e468b2, 0xcd21ab3d), TOBN(0xe504f022, 0xc393d392), - TOBN(0xab21e1d4, 0xa5013af9), TOBN(0xe3283f78, 0xc2c28acb), - TOBN(0xf38b35f6, 0x226bf99f), TOBN(0xe8354274, 0x0e291e69), - TOBN(0x61673a15, 0xb20c162d), TOBN(0xc101dc75, 0xb04fbdbe), - TOBN(0x8323b4c2, 0x255bd617), TOBN(0x6c969693, 0x6c2a9154), - TOBN(0xc6e65860, 0x62679387), TOBN(0x8e01db0c, 0xb8c88e23), - TOBN(0x33c42873, 0x893a5559), TOBN(0x7630f04b, 0x47a3e149), - TOBN(0xb5d80805, 0xddcf35f8), TOBN(0x582ca080, 0x77dfe732), - TOBN(0x2c7156e1, 0x0b1894a0), TOBN(0x92034001, 0xd81c68c0), - TOBN(0xed225d00, 0xc8b115b5), TOBN(0x237f9c22, 0x83b907f2), - TOBN(0x0ea2f32f, 0x4470e2c0), TOBN(0xb725f7c1, 0x58be4e95), - TOBN(0x0f1dcafa, 0xb1ae5463), TOBN(0x59ed5187, 0x1ba2fc04), - TOBN(0xf6e0f316, 0xd0115d4d), TOBN(0x5180b12f, 0xd3691599), - TOBN(0x157e32c9, 0x527f0a41), TOBN(0x7b0b081d, 0xa8e0ecc0), - TOBN(0x6dbaaa8a, 0xbf4f0dd0), TOBN(0x99b289c7, 0x4d252696), - TOBN(0x79b7755e, 0xdbf864fe), TOBN(0x6974e2b1, 0x76cad3ab), - TOBN(0x35dbbee2, 0x06ddd657), TOBN(0xe7cbdd11, 0x2ff3a96d), - TOBN(0x88381968, 0x076be758), TOBN(0x2d737e72, 0x08c91f5d), - TOBN(0x5f83ab62, 0x86ec3776), TOBN(0x98aa649d, 0x945fa7a1), - TOBN(0xf477ec37, 0x72ef0933), TOBN(0x66f52b1e, 0x098c17b1), - TOBN(0x9eec58fb, 0xd803738b), TOBN(0x91aaade7, 0xe4e86aa4), - TOBN(0x6b1ae617, 0xa5b51492), TOBN(0x63272121, 0xbbc45974), - TOBN(0x7e0e28f0, 0x862c5129), TOBN(0x0a8f79a9, 0x3321a4a0), - TOBN(0xe26d1664, 0x5041c88f), TOBN(0x0571b805, 0x53233e3a), - TOBN(0xd1b0ccde, 0xc9520711), TOBN(0x55a9e4ed, 0x3c8b84bf), - TOBN(0x9426bd39, 0xa1fef314), TOBN(0x4f5f638e, 0x6eb93f2b), - TOBN(0xba2a1ed3, 0x2bf9341b), TOBN(0xd63c1321, 0x4d42d5a9), - TOBN(0xd2964a89, 0x316dc7c5), TOBN(0xd1759606, 0xca511851), - TOBN(0xd8a9201f, 0xf9e6ed35), TOBN(0xb7b5ee45, 0x6736925a), - TOBN(0x0a83fbbc, 0x99581af7), TOBN(0x3076bc40, 0x64eeb051), - TOBN(0x5511c98c, 0x02dec312), TOBN(0x270de898, 0x238dcb78), - TOBN(0x2cf4cf9c, 0x539c08c9), TOBN(0xa70cb65e, 0x38d3b06e), - TOBN(0xb12ec10e, 0xcfe57bbd), TOBN(0x82c7b656, 0x35a0c2b5), - TOBN(0xddc7d5cd, 0x161c67bd), TOBN(0xe32e8985, 0xae3a32cc), - TOBN(0x7aba9444, 0xd11a5529), TOBN(0xe964ed02, 0x2427fa1a), - TOBN(0x1528392d, 0x24a1770a), TOBN(0xa152ce2c, 0x12c72fcd), - TOBN(0x714553a4, 0x8ec07649), TOBN(0x18b4c290, 0x459dd453), - TOBN(0xea32b714, 0x7b64b110), TOBN(0xb871bfa5, 0x2e6f07a2), - TOBN(0xb67112e5, 0x9e2e3c9b), TOBN(0xfbf250e5, 0x44aa90f6), - TOBN(0xf77aedb8, 0xbd539006), TOBN(0x3b0cdf9a, 0xd172a66f), - TOBN(0xedf69fea, 0xf8c51187), TOBN(0x05bb67ec, 0x741e4da7), - TOBN(0x47df0f32, 0x08114345), TOBN(0x56facb07, 0xbb9792b1), - TOBN(0xf3e007e9, 0x8f6229e4), TOBN(0x62d103f4, 0x526fba0f), - TOBN(0x4f33bef7, 0xb0339d79), TOBN(0x9841357b, 0xb59bfec1), - TOBN(0xfa8dbb59, 0xc34e6705), TOBN(0xc3c7180b, 0x7fdaa84c), - TOBN(0xf95872fc, 0xa4108537), TOBN(0x8750cc3b, 0x932a3e5a), - TOBN(0xb61cc69d, 0xb7275d7d), TOBN(0xffa0168b, 0x2e59b2e9), - TOBN(0xca032abc, 0x6ecbb493), TOBN(0x1d86dbd3, 0x2c9082d8), - TOBN(0xae1e0b67, 0xe28ef5ba), TOBN(0x2c9a4699, 0xcb18e169), - TOBN(0x0ecd0e33, 0x1e6bbd20), TOBN(0x571b360e, 0xaf5e81d2), - TOBN(0xcd9fea58, 0x101c1d45), TOBN(0x6651788e, 0x18880452), - TOBN(0xa9972635, 0x1f8dd446), TOBN(0x44bed022, 0xe37281d0), - TOBN(0x094b2b2d, 0x33da525d), TOBN(0xf193678e, 0x13144fd8), - TOBN(0xb8ab5ba4, 0xf4c1061d), TOBN(0x4343b5fa, 0xdccbe0f4), - TOBN(0xa8702371, 0x63812713), TOBN(0x47bf6d2d, 0xf7611d93), - TOBN(0x46729b8c, 0xbd21e1d7), TOBN(0x7484d4e0, 0xd629e77d), - TOBN(0x830e6eea, 0x60dbac1f), TOBN(0x23d8c484, 0xda06a2f7), - TOBN(0x896714b0, 0x50ca535b), TOBN(0xdc8d3644, 0xebd97a9b), - TOBN(0x106ef9fa, 0xb12177b4), TOBN(0xf79bf464, 0x534d5d9c), - TOBN(0x2537a349, 0xa6ab360b), TOBN(0xc7c54253, 0xa00c744f), - TOBN(0xb3c7a047, 0xe5911a76), TOBN(0x61ffa5c8, 0x647f1ee7), - TOBN(0x15aed36f, 0x8f56ab42), TOBN(0x6a0d41b0, 0xa3ff9ac9), - TOBN(0x68f469f5, 0xcc30d357), TOBN(0xbe9adf81, 0x6b72be96), - TOBN(0x1cd926fe, 0x903ad461), TOBN(0x7e89e38f, 0xcaca441b), - TOBN(0xf0f82de5, 0xfacf69d4), TOBN(0x363b7e76, 0x4775344c), - TOBN(0x6894f312, 0xb2e36d04), TOBN(0x3c6cb4fe, 0x11d1c9a5), - TOBN(0x85d9c339, 0x4008e1f2), TOBN(0x5e9a85ea, 0x249f326c), - TOBN(0xdc35c60a, 0x678c5e06), TOBN(0xc08b944f, 0x9f86fba9), - TOBN(0xde40c02c, 0x89f71f0f), TOBN(0xad8f3e31, 0xff3da3c0), - TOBN(0x3ea5096b, 0x42125ded), TOBN(0x13879cbf, 0xa7379183), - TOBN(0x6f4714a5, 0x6b306a0b), TOBN(0x359c2ea6, 0x67646c5e), - TOBN(0xfacf8943, 0x07726368), TOBN(0x07a58935, 0x65ff431e), - TOBN(0x24d661d1, 0x68754ab0), TOBN(0x801fce1d, 0x6f429a76), - TOBN(0xc068a85f, 0xa58ce769), TOBN(0xedc35c54, 0x5d5eca2b), - TOBN(0xea31276f, 0xa3f660d1), TOBN(0xa0184ebe, 0xb8fc7167), - TOBN(0x0f20f21a, 0x1d8db0ae), TOBN(0xd96d095f, 0x56c35e12), - TOBN(0xedf402b5, 0xf8c2a25b), TOBN(0x1bb772b9, 0x059204b6), - TOBN(0x50cbeae2, 0x19b4e34c), TOBN(0x93109d80, 0x3fa0845a), - TOBN(0x54f7ccf7, 0x8ef59fb5), TOBN(0x3b438fe2, 0x88070963), - TOBN(0x9e28c659, 0x31f3ba9b), TOBN(0x9cc31b46, 0xead9da92), - TOBN(0x3c2f0ba9, 0xb733aa5f), TOBN(0xdece47cb, 0xf05af235), - TOBN(0xf8e3f715, 0xa2ac82a5), TOBN(0xc97ba641, 0x2203f18a), - TOBN(0xc3af5504, 0x09c11060), TOBN(0x56ea2c05, 0x46af512d), - TOBN(0xfac28daf, 0xf3f28146), TOBN(0x87fab43a, 0x959ef494)}, - {TOBN(0x09891641, 0xd4c5105f), TOBN(0x1ae80f8e, 0x6d7fbd65), - TOBN(0x9d67225f, 0xbee6bdb0), TOBN(0x3b433b59, 0x7fc4d860), - TOBN(0x44e66db6, 0x93e85638), TOBN(0xf7b59252, 0xe3e9862f), - TOBN(0xdb785157, 0x665c32ec), TOBN(0x702fefd7, 0xae362f50), - TOBN(0x3754475d, 0x0fefb0c3), TOBN(0xd48fb56b, 0x46d7c35d), - TOBN(0xa070b633, 0x363798a4), TOBN(0xae89f3d2, 0x8fdb98e6), - TOBN(0x970b89c8, 0x6363d14c), TOBN(0x89817521, 0x67abd27d), - TOBN(0x9bf7d474, 0x44d5a021), TOBN(0xb3083baf, 0xcac72aee), - TOBN(0x389741de, 0xbe949a44), TOBN(0x638e9388, 0x546a4fa5), - TOBN(0x3fe6419c, 0xa0047bdc), TOBN(0x7047f648, 0xaaea57ca), - TOBN(0x54e48a90, 0x41fbab17), TOBN(0xda8e0b28, 0x576bdba2), - TOBN(0xe807eebc, 0xc72afddc), TOBN(0x07d3336d, 0xf42577bf), - TOBN(0x62a8c244, 0xbfe20925), TOBN(0x91c19ac3, 0x8fdce867), - TOBN(0x5a96a5d5, 0xdd387063), TOBN(0x61d587d4, 0x21d324f6), - TOBN(0xe87673a2, 0xa37173ea), TOBN(0x23848008, 0x53778b65), - TOBN(0x10f8441e, 0x05bab43e), TOBN(0xfa11fe12, 0x4621efbe), - TOBN(0x047b772e, 0x81685d7b), TOBN(0x23f27d81, 0xbf34a976), - TOBN(0xc27608e2, 0x915f48ef), TOBN(0x3b0b43fa, 0xa521d5c3), - TOBN(0x7613fb26, 0x63ca7284), TOBN(0x7f5729b4, 0x1d4db837), - TOBN(0x87b14898, 0x583b526b), TOBN(0x00b732a6, 0xbbadd3d1), - TOBN(0x8e02f426, 0x2048e396), TOBN(0x436b50b6, 0x383d9de4), - TOBN(0xf78d3481, 0x471e85ad), TOBN(0x8b01ea6a, 0xd005c8d6), - TOBN(0xd3c7afee, 0x97015c07), TOBN(0x46cdf1a9, 0x4e3ba2ae), - TOBN(0x7a42e501, 0x83d3a1d2), TOBN(0xd54b5268, 0xb541dff4), - TOBN(0x3f24cf30, 0x4e23e9bc), TOBN(0x4387f816, 0x126e3624), - TOBN(0x26a46a03, 0x3b0b6d61), TOBN(0xaf1bc845, 0x8b2d777c), - TOBN(0x25c401ba, 0x527de79c), TOBN(0x0e1346d4, 0x4261bbb6), - TOBN(0x4b96c44b, 0x287b4bc7), TOBN(0x658493c7, 0x5254562f), - TOBN(0x23f949fe, 0xb8a24a20), TOBN(0x17ebfed1, 0xf52ca53f), - TOBN(0x9b691bbe, 0xbcfb4853), TOBN(0x5617ff6b, 0x6278a05d), - TOBN(0x241b34c5, 0xe3c99ebd), TOBN(0xfc64242e, 0x1784156a), - TOBN(0x4206482f, 0x695d67df), TOBN(0xb967ce0e, 0xee27c011), - TOBN(0x65db3751, 0x21c80b5d), TOBN(0x2e7a563c, 0xa31ecca0), - TOBN(0xe56ffc4e, 0x5238a07e), TOBN(0x3d6c2966, 0x32ced854), - TOBN(0xe99d7d1a, 0xaf70b885), TOBN(0xafc3bad9, 0x2d686459), - TOBN(0x9c78bf46, 0x0cc8ba5b), TOBN(0x5a439519, 0x18955aa3), - TOBN(0xf8b517a8, 0x5fe4e314), TOBN(0xe60234d0, 0xfcb8906f), - TOBN(0xffe542ac, 0xf2061b23), TOBN(0x287e191f, 0x6b4cb59c), - TOBN(0x21857ddc, 0x09d877d8), TOBN(0x1c23478c, 0x14678941), - TOBN(0xbbf0c056, 0xb6e05ea4), TOBN(0x82da4b53, 0xb01594fe), - TOBN(0xf7526791, 0xfadb8608), TOBN(0x049e832d, 0x7b74cdf6), - TOBN(0xa43581cc, 0xc2b90a34), TOBN(0x73639eb8, 0x9360b10c), - TOBN(0x4fba331f, 0xe1e4a71b), TOBN(0x6ffd6b93, 0x8072f919), - TOBN(0x6e53271c, 0x65679032), TOBN(0x67206444, 0xf14272ce), - TOBN(0xc0f734a3, 0xb2335834), TOBN(0x9526205a, 0x90ef6860), - TOBN(0xcb8be717, 0x04e2bb0d), TOBN(0x2418871e, 0x02f383fa), - TOBN(0xd7177681, 0x4082c157), TOBN(0xcc914ad0, 0x29c20073), - TOBN(0xf186c1eb, 0xe587e728), TOBN(0x6fdb3c22, 0x61bcd5fd), - TOBN(0x30d014a6, 0xf2f9f8e9), TOBN(0x963ece23, 0x4fec49d2), - TOBN(0x862025c5, 0x9605a8d9), TOBN(0x39874445, 0x19f8929a), - TOBN(0x01b6ff65, 0x12bf476a), TOBN(0x598a64d8, 0x09cf7d91), - TOBN(0xd7ec7749, 0x93be56ca), TOBN(0x10899785, 0xcbb33615), - TOBN(0xb8a092fd, 0x02eee3ad), TOBN(0xa86b3d35, 0x30145270), - TOBN(0x323d98c6, 0x8512b675), TOBN(0x4b8bc785, 0x62ebb40f), - TOBN(0x7d301f54, 0x413f9cde), TOBN(0xa5e4fb4f, 0x2bab5664), - TOBN(0x1d2b252d, 0x1cbfec23), TOBN(0xfcd576bb, 0xe177120d), - TOBN(0x04427d3e, 0x83731a34), TOBN(0x2bb9028e, 0xed836e8e), - TOBN(0xb36acff8, 0xb612ca7c), TOBN(0xb88fe5ef, 0xd3d9c73a), - TOBN(0xbe2a6bc6, 0xedea4eb3), TOBN(0x43b93133, 0x488eec77), - TOBN(0xf41ff566, 0xb17106e1), TOBN(0x469e9172, 0x654efa32), - TOBN(0xb4480f04, 0x41c23fa3), TOBN(0xb4712eb0, 0xc1989a2e), - TOBN(0x3ccbba0f, 0x93a29ca7), TOBN(0x6e205c14, 0xd619428c), - TOBN(0x90db7957, 0xb3641686), TOBN(0x0432691d, 0x45ac8b4e), - TOBN(0x07a759ac, 0xf64e0350), TOBN(0x0514d89c, 0x9c972517), - TOBN(0x1701147f, 0xa8e67fc3), TOBN(0x9e2e0b8b, 0xab2085be), - TOBN(0xd5651824, 0xac284e57), TOBN(0x890d4325, 0x74893664), - TOBN(0x8a7c5e6e, 0xc55e68a3), TOBN(0xbf12e90b, 0x4339c85a), - TOBN(0x31846b85, 0xf922b655), TOBN(0x9a54ce4d, 0x0bf4d700), - TOBN(0xd7f4e83a, 0xf1a14295), TOBN(0x916f955c, 0xb285d4f9), - TOBN(0xe57bb0e0, 0x99ffdaba), TOBN(0x28a43034, 0xeab0d152), - TOBN(0x0a36ffa2, 0xb8a9cef8), TOBN(0x5517407e, 0xb9ec051a), - TOBN(0x9c796096, 0xea68e672), TOBN(0x853db5fb, 0xfb3c77fb), - TOBN(0x21474ba9, 0xe864a51a), TOBN(0x6c267699, 0x6e8a1b8b), - TOBN(0x7c823626, 0x94120a28), TOBN(0xe61e9a48, 0x8383a5db), - TOBN(0x7dd75003, 0x9f84216d), TOBN(0xab020d07, 0xad43cd85), - TOBN(0x9437ae48, 0xda12c659), TOBN(0x6449c2eb, 0xe65452ad), - TOBN(0xcc7c4c1c, 0x2cf9d7c1), TOBN(0x1320886a, 0xee95e5ab), - TOBN(0xbb7b9056, 0xbeae170c), TOBN(0xc8a5b250, 0xdbc0d662), - TOBN(0x4ed81432, 0xc11d2303), TOBN(0x7da66912, 0x1f03769f), - TOBN(0x3ac7a5fd, 0x84539828), TOBN(0x14dada94, 0x3bccdd02), - TOBN(0x8b84c321, 0x7ef6b0d1), TOBN(0x52a9477a, 0x7c933f22), - TOBN(0x5ef6728a, 0xfd440b82), TOBN(0x5c3bd859, 0x6ce4bd5e), - TOBN(0x918b80f5, 0xf22c2d3e), TOBN(0x368d5040, 0xb7bb6cc5), - TOBN(0xb66142a1, 0x2695a11c), TOBN(0x60ac583a, 0xeb19ea70), - TOBN(0x317cbb98, 0x0eab2437), TOBN(0x8cc08c55, 0x5e2654c8), - TOBN(0xfe2d6520, 0xe6d8307f), TOBN(0xe9f147f3, 0x57428993), - TOBN(0x5f9c7d14, 0xd2fd6cf1), TOBN(0xa3ecd064, 0x2d4fcbb0), - TOBN(0xad83fef0, 0x8e7341f7), TOBN(0x643f23a0, 0x3a63115c), - TOBN(0xd38a78ab, 0xe65ab743), TOBN(0xbf7c75b1, 0x35edc89c), - TOBN(0x3dd8752e, 0x530df568), TOBN(0xf85c4a76, 0xe308c682), - TOBN(0x4c9955b2, 0xe68acf37), TOBN(0xa544df3d, 0xab32af85), - TOBN(0x4b8ec3f5, 0xa25cf493), TOBN(0x4d8f2764, 0x1a622feb), - TOBN(0x7bb4f7aa, 0xf0dcbc49), TOBN(0x7de551f9, 0x70bbb45b), - TOBN(0xcfd0f3e4, 0x9f2ca2e5), TOBN(0xece58709, 0x1f5c76ef), - TOBN(0x32920edd, 0x167d79ae), TOBN(0x039df8a2, 0xfa7d7ec1), - TOBN(0xf46206c0, 0xbb30af91), TOBN(0x1ff5e2f5, 0x22676b59), - TOBN(0x11f4a039, 0x6ea51d66), TOBN(0x506c1445, 0x807d7a26), - TOBN(0x60da5705, 0x755a9b24), TOBN(0x8fc8cc32, 0x1f1a319e), - TOBN(0x83642d4d, 0x9433d67d), TOBN(0x7fa5cb8f, 0x6a7dd296), - TOBN(0x576591db, 0x9b7bde07), TOBN(0x13173d25, 0x419716fb), - TOBN(0xea30599d, 0xd5b340ff), TOBN(0xfc6b5297, 0xb0fe76c5), - TOBN(0x1c6968c8, 0xab8f5adc), TOBN(0xf723c7f5, 0x901c928d), - TOBN(0x4203c321, 0x9773d402), TOBN(0xdf7c6aa3, 0x1b51dd47), - TOBN(0x3d49e37a, 0x552be23c), TOBN(0x57febee8, 0x0b5a6e87), - TOBN(0xc5ecbee4, 0x7bd8e739), TOBN(0x79d44994, 0xae63bf75), - TOBN(0x168bd00f, 0x38fb8923), TOBN(0x75d48ee4, 0xd0533130), - TOBN(0x554f77aa, 0xdb5cdf33), TOBN(0x3396e896, 0x3c696769), - TOBN(0x2fdddbf2, 0xd3fd674e), TOBN(0xbbb8f6ee, 0x99d0e3e5), - TOBN(0x51b90651, 0xcbae2f70), TOBN(0xefc4bc05, 0x93aaa8eb), - TOBN(0x8ecd8689, 0xdd1df499), TOBN(0x1aee99a8, 0x22f367a5), - TOBN(0x95d485b9, 0xae8274c5), TOBN(0x6c14d445, 0x7d30b39c), - TOBN(0xbafea90b, 0xbcc1ef81), TOBN(0x7c5f317a, 0xa459a2ed), - TOBN(0x01211075, 0x4ef44227), TOBN(0xa17bed6e, 0xdc20f496), - TOBN(0x0cdfe424, 0x819853cd), TOBN(0x13793298, 0xf71e2ce7), - TOBN(0x3c1f3078, 0xdbbe307b), TOBN(0x6dd1c20e, 0x76ee9936), - TOBN(0x23ee4b57, 0x423caa20), TOBN(0x4ac3793b, 0x8efb840e), - TOBN(0x934438eb, 0xed1f8ca0), TOBN(0x3e546658, 0x4ebb25a2), - TOBN(0xc415af0e, 0xc069896f), TOBN(0xc13eddb0, 0x9a5aa43d), - TOBN(0x7a04204f, 0xd49eb8f6), TOBN(0xd0d5bdfc, 0xd74f1670), - TOBN(0x3697e286, 0x56fc0558), TOBN(0x10207371, 0x01cebade), - TOBN(0x5f87e690, 0x0647a82b), TOBN(0x908e0ed4, 0x8f40054f), - TOBN(0xa9f633d4, 0x79853803), TOBN(0x8ed13c9a, 0x4a28b252), - TOBN(0x3e2ef676, 0x1f460f64), TOBN(0x53930b9b, 0x36d06336), - TOBN(0x347073ac, 0x8fc4979b), TOBN(0x84380e0e, 0x5ecd5597), - TOBN(0xe3b22c6b, 0xc4fe3c39), TOBN(0xba4a8153, 0x6c7bebdf), - TOBN(0xf23ab6b7, 0x25693459), TOBN(0x53bc3770, 0x14922b11), - TOBN(0x4645c8ab, 0x5afc60db), TOBN(0xaa022355, 0x20b9f2a3), - TOBN(0x52a2954c, 0xce0fc507), TOBN(0x8c2731bb, 0x7ce1c2e7), - TOBN(0xf39608ab, 0x18a0339d), TOBN(0xac7a658d, 0x3735436c), - TOBN(0xb22c2b07, 0xcd992b4f), TOBN(0x4e83daec, 0xf40dcfd4), - TOBN(0x8a34c7be, 0x2f39ea3e), TOBN(0xef0c005f, 0xb0a56d2e), - TOBN(0x62731f6a, 0x6edd8038), TOBN(0x5721d740, 0x4e3cb075), - TOBN(0x1ea41511, 0xfbeeee1b), TOBN(0xd1ef5e73, 0xef1d0c05), - TOBN(0x42feefd1, 0x73c07d35), TOBN(0xe530a00a, 0x8a329493), - TOBN(0x5d55b7fe, 0xf15ebfb0), TOBN(0x549de03c, 0xd322491a), - TOBN(0xf7b5f602, 0x745b3237), TOBN(0x3632a3a2, 0x1ab6e2b6), - TOBN(0x0d3bba89, 0x0ef59f78), TOBN(0x0dfc6443, 0xc9e52b9a), - TOBN(0x1dc79699, 0x72631447), TOBN(0xef033917, 0xb3be20b1), - TOBN(0x0c92735d, 0xb1383948), TOBN(0xc1fc29a2, 0xc0dd7d7d), - TOBN(0x6485b697, 0x403ed068), TOBN(0x13bfaab3, 0xaac93bdc), - TOBN(0x410dc6a9, 0x0deeaf52), TOBN(0xb003fb02, 0x4c641c15), - TOBN(0x1384978c, 0x5bc504c4), TOBN(0x37640487, 0x864a6a77), - TOBN(0x05991bc6, 0x222a77da), TOBN(0x62260a57, 0x5e47eb11), - TOBN(0xc7af6613, 0xf21b432c), TOBN(0x22f3acc9, 0xab4953e9), - TOBN(0x52934922, 0x8e41d155), TOBN(0x4d024568, 0x3ac059ef), - TOBN(0xb0201755, 0x4d884411), TOBN(0xce8055cf, 0xa59a178f), - TOBN(0xcd77d1af, 0xf6204549), TOBN(0xa0a00a3e, 0xc7066759), - TOBN(0x471071ef, 0x0272c229), TOBN(0x009bcf6b, 0xd3c4b6b0), - TOBN(0x2a2638a8, 0x22305177), TOBN(0xd51d59df, 0x41645bbf), - TOBN(0xa81142fd, 0xc0a7a3c0), TOBN(0xa17eca6d, 0x4c7063ee), - TOBN(0x0bb887ed, 0x60d9dcec), TOBN(0xd6d28e51, 0x20ad2455), - TOBN(0xebed6308, 0xa67102ba), TOBN(0x042c3114, 0x8bffa408), - TOBN(0xfd099ac5, 0x8aa68e30), TOBN(0x7a6a3d7c, 0x1483513e), - TOBN(0xffcc6b75, 0xba2d8f0c), TOBN(0x54dacf96, 0x1e78b954), - TOBN(0xf645696f, 0xa4a9af89), TOBN(0x3a411940, 0x06ac98ec), - TOBN(0x41b8b3f6, 0x22a67a20), TOBN(0x2d0b1e0f, 0x99dec626), - TOBN(0x27c89192, 0x40be34e8), TOBN(0xc7162b37, 0x91907f35), - TOBN(0x90188ec1, 0xa956702b), TOBN(0xca132f7d, 0xdf93769c), - TOBN(0x3ece44f9, 0x0e2025b4), TOBN(0x67aaec69, 0x0c62f14c), - TOBN(0xad741418, 0x22e3cc11), TOBN(0xcf9b75c3, 0x7ff9a50e), - TOBN(0x02fa2b16, 0x4d348272), TOBN(0xbd99d61a, 0x9959d56d), - TOBN(0xbc4f19db, 0x18762916), TOBN(0xcc7cce50, 0x49c1ac80), - TOBN(0x4d59ebaa, 0xd846bd83), TOBN(0x8775a9dc, 0xa9202849), - TOBN(0x07ec4ae1, 0x6e1f4ca9), TOBN(0x27eb5875, 0xba893f11), - TOBN(0x00284d51, 0x662cc565), TOBN(0x82353a6b, 0x0db4138d), - TOBN(0xd9c7aaaa, 0xaa32a594), TOBN(0xf5528b5e, 0xa5669c47), - TOBN(0xf3220231, 0x2f23c5ff), TOBN(0xe3e8147a, 0x6affa3a1), - TOBN(0xfb423d5c, 0x202ddda0), TOBN(0x3d6414ac, 0x6b871bd4), - TOBN(0x586f82e1, 0xa51a168a), TOBN(0xb712c671, 0x48ae5448), - TOBN(0x9a2e4bd1, 0x76233eb8), TOBN(0x0188223a, 0x78811ca9), - TOBN(0x553c5e21, 0xf7c18de1), TOBN(0x7682e451, 0xb27bb286), - TOBN(0x3ed036b3, 0x0e51e929), TOBN(0xf487211b, 0xec9cb34f), - TOBN(0x0d094277, 0x0c24efc8), TOBN(0x0349fd04, 0xbef737a4), - TOBN(0x6d1c9dd2, 0x514cdd28), TOBN(0x29c135ff, 0x30da9521), - TOBN(0xea6e4508, 0xf78b0b6f), TOBN(0x176f5dd2, 0x678c143c), - TOBN(0x08148418, 0x4be21e65), TOBN(0x27f7525c, 0xe7df38c4), - TOBN(0x1fb70e09, 0x748ab1a4), TOBN(0x9cba50a0, 0x5efe4433), - TOBN(0x7846c7a6, 0x15f75af2), TOBN(0x2a7c2c57, 0x5ee73ea8), - TOBN(0x42e566a4, 0x3f0a449a), TOBN(0x45474c3b, 0xad90fc3d), - TOBN(0x7447be3d, 0x8b61d057), TOBN(0x3e9d1cf1, 0x3a4ec092), - TOBN(0x1603e453, 0xf380a6e6), TOBN(0x0b86e431, 0x9b1437c2), - TOBN(0x7a4173f2, 0xef29610a), TOBN(0x8fa729a7, 0xf03d57f7), - TOBN(0x3e186f6e, 0x6c9c217e), TOBN(0xbe1d3079, 0x91919524), - TOBN(0x92a62a70, 0x153d4fb1), TOBN(0x32ed3e34, 0xd68c2f71), - TOBN(0xd785027f, 0x9eb1a8b7), TOBN(0xbc37eb77, 0xc5b22fe8), - TOBN(0x466b34f0, 0xb9d6a191), TOBN(0x008a89af, 0x9a05f816), - TOBN(0x19b028fb, 0x7d42c10a), TOBN(0x7fe8c92f, 0x49b3f6b8), - TOBN(0x58907cc0, 0xa5a0ade3), TOBN(0xb3154f51, 0x559d1a7c), - TOBN(0x5066efb6, 0xd9790ed6), TOBN(0xa77a0cbc, 0xa6aa793b), - TOBN(0x1a915f3c, 0x223e042e), TOBN(0x1c5def04, 0x69c5874b), - TOBN(0x0e830078, 0x73b6c1da), TOBN(0x55cf85d2, 0xfcd8557a), - TOBN(0x0f7c7c76, 0x0460f3b1), TOBN(0x87052acb, 0x46e58063), - TOBN(0x09212b80, 0x907eae66), TOBN(0x3cb068e0, 0x4d721c89), - TOBN(0xa87941ae, 0xdd45ac1c), TOBN(0xde8d5c0d, 0x0daa0dbb), - TOBN(0xda421fdc, 0xe3502e6e), TOBN(0xc8944201, 0x4d89a084), - TOBN(0x7307ba5e, 0xf0c24bfb), TOBN(0xda212beb, 0x20bde0ef), - TOBN(0xea2da24b, 0xf82ce682), TOBN(0x058d3816, 0x07f71fe4), - TOBN(0x35a02462, 0x5ffad8de), TOBN(0xcd7b05dc, 0xaadcefab), - TOBN(0xd442f8ed, 0x1d9f54ec), TOBN(0x8be3d618, 0xb2d3b5ca), - TOBN(0xe2220ed0, 0xe06b2ce2), TOBN(0x82699a5f, 0x1b0da4c0), - TOBN(0x3ff106f5, 0x71c0c3a7), TOBN(0x8f580f5a, 0x0d34180c), - TOBN(0x4ebb120e, 0x22d7d375), TOBN(0x5e5782cc, 0xe9513675), - TOBN(0x2275580c, 0x99c82a70), TOBN(0xe8359fbf, 0x15ea8c4c), - TOBN(0x53b48db8, 0x7b415e70), TOBN(0xaacf2240, 0x100c6014), - TOBN(0x9faaccf5, 0xe4652f1d), TOBN(0xbd6fdd2a, 0xd56157b2), - TOBN(0xa4f4fb1f, 0x6261ec50), TOBN(0x244e55ad, 0x476bcd52), - TOBN(0x881c9305, 0x047d320b), TOBN(0x1ca983d5, 0x6181263f), - TOBN(0x354e9a44, 0x278fb8ee), TOBN(0xad2dbc0f, 0x396e4964), - TOBN(0x723f3aa2, 0x9268b3de), TOBN(0x0d1ca29a, 0xe6e0609a), - TOBN(0x794866aa, 0x6cf44252), TOBN(0x0b59f3e3, 0x01af87ed), - TOBN(0xe234e5ff, 0x7f4a6c51), TOBN(0xa8768fd2, 0x61dc2f7e), - TOBN(0xdafc7332, 0x0a94d81f), TOBN(0xd7f84282, 0x06938ce1), - TOBN(0xae0b3c0e, 0x0546063e), TOBN(0x7fbadcb2, 0x5d61abc6), - TOBN(0xd5d7a2c9, 0x369ac400), TOBN(0xa5978d09, 0xae67d10c), - TOBN(0x290f211e, 0x4f85eaac), TOBN(0xe61e2ad1, 0xfacac681), - TOBN(0xae125225, 0x388384cd), TOBN(0xa7fb68e9, 0xccfde30f), - TOBN(0x7a59b936, 0x3daed4c2), TOBN(0x80a9aa40, 0x2606f789), - TOBN(0xb40c1ea5, 0xf6a6d90a), TOBN(0x948364d3, 0x514d5885), - TOBN(0x062ebc60, 0x70985182), TOBN(0xa6db5b0e, 0x33310895), - TOBN(0x64a12175, 0xe329c2f5), TOBN(0xc5f25bd2, 0x90ea237e), - TOBN(0x7915c524, 0x2d0a4c23), TOBN(0xeb5d26e4, 0x6bb3cc52), - TOBN(0x369a9116, 0xc09e2c92), TOBN(0x0c527f92, 0xcf182cf8), - TOBN(0x9e591938, 0x2aede0ac), TOBN(0xb2922208, 0x6cc34939), - TOBN(0x3c9d8962, 0x99a34361), TOBN(0x3c81836d, 0xc1905fe6), - TOBN(0x4bfeb57f, 0xa001ec5a), TOBN(0xe993f5bb, 0xa0dc5dba), - TOBN(0x47884109, 0x724a1380), TOBN(0x8a0369ab, 0x32fe9a04), - TOBN(0xea068d60, 0x8c927db8), TOBN(0xbf5f37cf, 0x94655741), - TOBN(0x47d402a2, 0x04b6c7ea), TOBN(0x4551c295, 0x6af259cb), - TOBN(0x698b71e7, 0xed77ee8b), TOBN(0xbddf7bd0, 0xf309d5c7), - TOBN(0x6201c22c, 0x34e780ca), TOBN(0xab04f7d8, 0x4c295ef4), - TOBN(0x1c947294, 0x4313a8ce), TOBN(0xe532e4ac, 0x92ca4cfe), - TOBN(0x89738f80, 0xd0a7a97a), TOBN(0xec088c88, 0xa580fd5b), - TOBN(0x612b1ecc, 0x42ce9e51), TOBN(0x8f9840fd, 0xb25fdd2a), - TOBN(0x3cda78c0, 0x01e7f839), TOBN(0x546b3d3a, 0xece05480), - TOBN(0x271719a9, 0x80d30916), TOBN(0x45497107, 0x584c20c4), - TOBN(0xaf8f9478, 0x5bc78608), TOBN(0x28c7d484, 0x277e2a4c), - TOBN(0xfce01767, 0x88a2ffe4), TOBN(0xdc506a35, 0x28e169a5), - TOBN(0x0ea10861, 0x7af9c93a), TOBN(0x1ed24361, 0x03fa0e08), - TOBN(0x96eaaa92, 0xa3d694e7), TOBN(0xc0f43b4d, 0xef50bc74), - TOBN(0xce6aa58c, 0x64114db4), TOBN(0x8218e8ea, 0x7c000fd4), - TOBN(0xac815dfb, 0x185f8844), TOBN(0xcd7e90cb, 0x1557abfb), - TOBN(0x23d16655, 0xafbfecdf), TOBN(0x80f3271f, 0x085cac4a), - TOBN(0x7fc39aa7, 0xd0e62f47), TOBN(0x88d519d1, 0x460a48e5), - TOBN(0x59559ac4, 0xd28f101e), TOBN(0x7981d9e9, 0xca9ae816), - TOBN(0x5c38652c, 0x9ac38203), TOBN(0x86eaf87f, 0x57657fe5), - TOBN(0x568fc472, 0xe21f5416), TOBN(0x2afff39c, 0xe7e597b5), - TOBN(0x3adbbb07, 0x256d4eab), TOBN(0x22598692, 0x8285ab89), - TOBN(0x35f8112a, 0x041caefe), TOBN(0x95df02e3, 0xa5064c8b), - TOBN(0x4d63356e, 0xc7004bf3), TOBN(0x230a08f4, 0xdb83c7de), - TOBN(0xca27b270, 0x8709a7b7), TOBN(0x0d1c4cc4, 0xcb9abd2d), - TOBN(0x8a0bc66e, 0x7550fee8), TOBN(0x369cd4c7, 0x9cf7247e), - TOBN(0x75562e84, 0x92b5b7e7), TOBN(0x8fed0da0, 0x5802af7b), - TOBN(0x6a7091c2, 0xe48fb889), TOBN(0x26882c13, 0x7b8a9d06), - TOBN(0xa2498663, 0x1b82a0e2), TOBN(0x844ed736, 0x3518152d), - TOBN(0x282f476f, 0xd86e27c7), TOBN(0xa04edaca, 0x04afefdc), - TOBN(0x8b256ebc, 0x6119e34d), TOBN(0x56a413e9, 0x0787d78b)}, - {TOBN(0x82ee061d, 0x5a74be50), TOBN(0xe41781c4, 0xdea16ff5), - TOBN(0xe0b0c81e, 0x99bfc8a2), TOBN(0x624f4d69, 0x0b547e2d), - TOBN(0x3a83545d, 0xbdcc9ae4), TOBN(0x2573dbb6, 0x409b1e8e), - TOBN(0x482960c4, 0xa6c93539), TOBN(0xf01059ad, 0x5ae18798), - TOBN(0x715c9f97, 0x3112795f), TOBN(0xe8244437, 0x984e6ee1), - TOBN(0x55cb4858, 0xecb66bcd), TOBN(0x7c136735, 0xabaffbee), - TOBN(0x54661595, 0x5dbec38e), TOBN(0x51c0782c, 0x388ad153), - TOBN(0x9ba4c53a, 0xc6e0952f), TOBN(0x27e6782a, 0x1b21dfa8), - TOBN(0x682f903d, 0x4ed2dbc2), TOBN(0x0eba59c8, 0x7c3b2d83), - TOBN(0x8e9dc84d, 0x9c7e9335), TOBN(0x5f9b21b0, 0x0eb226d7), - TOBN(0xe33bd394, 0xaf267bae), TOBN(0xaa86cc25, 0xbe2e15ae), - TOBN(0x4f0bf67d, 0x6a8ec500), TOBN(0x5846aa44, 0xf9630658), - TOBN(0xfeb09740, 0xe2c2bf15), TOBN(0x627a2205, 0xa9e99704), - TOBN(0xec8d73d0, 0xc2fbc565), TOBN(0x223eed8f, 0xc20c8de8), - TOBN(0x1ee32583, 0xa8363b49), TOBN(0x1a0b6cb9, 0xc9c2b0a6), - TOBN(0x49f7c3d2, 0x90dbc85c), TOBN(0xa8dfbb97, 0x1ef4c1ac), - TOBN(0xafb34d4c, 0x65c7c2ab), TOBN(0x1d4610e7, 0xe2c5ea84), - TOBN(0x893f6d1b, 0x973c4ab5), TOBN(0xa3cdd7e9, 0x945ba5c4), - TOBN(0x60514983, 0x064417ee), TOBN(0x1459b23c, 0xad6bdf2b), - TOBN(0x23b2c341, 0x5cf726c3), TOBN(0x3a829635, 0x32d6354a), - TOBN(0x294f901f, 0xab192c18), TOBN(0xec5fcbfe, 0x7030164f), - TOBN(0xe2e2fcb7, 0xe2246ba6), TOBN(0x1e7c88b3, 0x221a1a0c), - TOBN(0x72c7dd93, 0xc92d88c5), TOBN(0x41c2148e, 0x1106fb59), - TOBN(0x547dd4f5, 0xa0f60f14), TOBN(0xed9b52b2, 0x63960f31), - TOBN(0x6c8349eb, 0xb0a5b358), TOBN(0xb154c5c2, 0x9e7e2ed6), - TOBN(0xcad5eccf, 0xeda462db), TOBN(0xf2d6dbe4, 0x2de66b69), - TOBN(0x426aedf3, 0x8665e5b2), TOBN(0x488a8513, 0x7b7f5723), - TOBN(0x15cc43b3, 0x8bcbb386), TOBN(0x27ad0af3, 0xd791d879), - TOBN(0xc16c236e, 0x846e364f), TOBN(0x7f33527c, 0xdea50ca0), - TOBN(0xc4810775, 0x0926b86d), TOBN(0x6c2a3609, 0x0598e70c), - TOBN(0xa6755e52, 0xf024e924), TOBN(0xe0fa07a4, 0x9db4afca), - TOBN(0x15c3ce7d, 0x66831790), TOBN(0x5b4ef350, 0xa6cbb0d6), - TOBN(0x2c4aafc4, 0xb6205969), TOBN(0x42563f02, 0xf6c7854f), - TOBN(0x016aced5, 0x1d983b48), TOBN(0xfeb356d8, 0x99949755), - TOBN(0x8c2a2c81, 0xd1a39bd7), TOBN(0x8f44340f, 0xe6934ae9), - TOBN(0x148cf91c, 0x447904da), TOBN(0x7340185f, 0x0f51a926), - TOBN(0x2f8f00fb, 0x7409ab46), TOBN(0x057e78e6, 0x80e289b2), - TOBN(0x03e5022c, 0xa888e5d1), TOBN(0x3c87111a, 0x9dede4e2), - TOBN(0x5b9b0e1c, 0x7809460b), TOBN(0xe751c852, 0x71c9abc7), - TOBN(0x8b944e28, 0xc7cc1dc9), TOBN(0x4f201ffa, 0x1d3cfa08), - TOBN(0x02fc905c, 0x3e6721ce), TOBN(0xd52d70da, 0xd0b3674c), - TOBN(0x5dc2e5ca, 0x18810da4), TOBN(0xa984b273, 0x5c69dd99), - TOBN(0x63b92527, 0x84de5ca4), TOBN(0x2f1c9872, 0xc852dec4), - TOBN(0x18b03593, 0xc2e3de09), TOBN(0x19d70b01, 0x9813dc2f), - TOBN(0x42806b2d, 0xa6dc1d29), TOBN(0xd3030009, 0xf871e144), - TOBN(0xa1feb333, 0xaaf49276), TOBN(0xb5583b9e, 0xc70bc04b), - TOBN(0x1db0be78, 0x95695f20), TOBN(0xfc841811, 0x89d012b5), - TOBN(0x6409f272, 0x05f61643), TOBN(0x40d34174, 0xd5883128), - TOBN(0xd79196f5, 0x67419833), TOBN(0x6059e252, 0x863b7b08), - TOBN(0x84da1817, 0x1c56700c), TOBN(0x5758ee56, 0xb28d3ec4), - TOBN(0x7da2771d, 0x013b0ea6), TOBN(0xfddf524b, 0x54c5e9b9), - TOBN(0x7df4faf8, 0x24305d80), TOBN(0x58f5c1bf, 0x3a97763f), - TOBN(0xa5af37f1, 0x7c696042), TOBN(0xd4cba22c, 0x4a2538de), - TOBN(0x211cb995, 0x9ea42600), TOBN(0xcd105f41, 0x7b069889), - TOBN(0xb1e1cf19, 0xddb81e74), TOBN(0x472f2d89, 0x5157b8ca), - TOBN(0x086fb008, 0xee9db885), TOBN(0x365cd570, 0x0f26d131), - TOBN(0x284b02bb, 0xa2be7053), TOBN(0xdcbbf7c6, 0x7ab9a6d6), - TOBN(0x4425559c, 0x20f7a530), TOBN(0x961f2dfa, 0x188767c8), - TOBN(0xe2fd9435, 0x70dc80c4), TOBN(0x104d6b63, 0xf0784120), - TOBN(0x7f592bc1, 0x53567122), TOBN(0xf6bc1246, 0xf688ad77), - TOBN(0x05214c05, 0x0f15dde9), TOBN(0xa47a76a8, 0x0d5f2b82), - TOBN(0xbb254d30, 0x62e82b62), TOBN(0x11a05fe0, 0x3ec955ee), - TOBN(0x7eaff46e, 0x9d529b36), TOBN(0x55ab1301, 0x8f9e3df6), - TOBN(0xc463e371, 0x99317698), TOBN(0xfd251438, 0xccda47ad), - TOBN(0xca9c3547, 0x23d695ea), TOBN(0x48ce626e, 0x16e589b5), - TOBN(0x6b5b64c7, 0xb187d086), TOBN(0xd02e1794, 0xb2207948), - TOBN(0x8b58e98f, 0x7198111d), TOBN(0x90ca6305, 0xdcf9c3cc), - TOBN(0x5691fe72, 0xf34089b0), TOBN(0x60941af1, 0xfc7c80ff), - TOBN(0xa09bc0a2, 0x22eb51e5), TOBN(0xc0bb7244, 0xaa9cf09a), - TOBN(0x36a8077f, 0x80159f06), TOBN(0x8b5c989e, 0xdddc560e), - TOBN(0x19d2f316, 0x512e1f43), TOBN(0x02eac554, 0xad08ff62), - TOBN(0x012ab84c, 0x07d20b4e), TOBN(0x37d1e115, 0xd6d4e4e1), - TOBN(0xb6443e1a, 0xab7b19a8), TOBN(0xf08d067e, 0xdef8cd45), - TOBN(0x63adf3e9, 0x685e03da), TOBN(0xcf15a10e, 0x4792b916), - TOBN(0xf44bcce5, 0xb738a425), TOBN(0xebe131d5, 0x9636b2fd), - TOBN(0x94068841, 0x7850d605), TOBN(0x09684eaa, 0xb40d749d), - TOBN(0x8c3c669c, 0x72ba075b), TOBN(0x89f78b55, 0xba469015), - TOBN(0x5706aade, 0x3e9f8ba8), TOBN(0x6d8bd565, 0xb32d7ed7), - TOBN(0x25f4e63b, 0x805f08d6), TOBN(0x7f48200d, 0xc3bcc1b5), - TOBN(0x4e801968, 0xb025d847), TOBN(0x74afac04, 0x87cbe0a8), - TOBN(0x43ed2c2b, 0x7e63d690), TOBN(0xefb6bbf0, 0x0223cdb8), - TOBN(0x4fec3cae, 0x2884d3fe), TOBN(0x065ecce6, 0xd75e25a4), - TOBN(0x6c2294ce, 0x69f79071), TOBN(0x0d9a8e5f, 0x044b8666), - TOBN(0x5009f238, 0x17b69d8f), TOBN(0x3c29f8fe, 0xc5dfdaf7), - TOBN(0x9067528f, 0xebae68c4), TOBN(0x5b385632, 0x30c5ba21), - TOBN(0x540df119, 0x1fdd1aec), TOBN(0xcf37825b, 0xcfba4c78), - TOBN(0x77eff980, 0xbeb11454), TOBN(0x40a1a991, 0x60c1b066), - TOBN(0xe8018980, 0xf889a1c7), TOBN(0xb9c52ae9, 0x76c24be0), - TOBN(0x05fbbcce, 0x45650ef4), TOBN(0xae000f10, 0x8aa29ac7), - TOBN(0x884b7172, 0x4f04c470), TOBN(0x7cd4fde2, 0x19bb5c25), - TOBN(0x6477b22a, 0xe8840869), TOBN(0xa8868859, 0x5fbd0686), - TOBN(0xf23cc02e, 0x1116dfba), TOBN(0x76cd563f, 0xd87d7776), - TOBN(0xe2a37598, 0xa9d82abf), TOBN(0x5f188ccb, 0xe6c170f5), - TOBN(0x81682200, 0x5066b087), TOBN(0xda22c212, 0xc7155ada), - TOBN(0x151e5d3a, 0xfbddb479), TOBN(0x4b606b84, 0x6d715b99), - TOBN(0x4a73b54b, 0xf997cb2e), TOBN(0x9a1bfe43, 0x3ecd8b66), - TOBN(0x1c312809, 0x2a67d48a), TOBN(0xcd6a671e, 0x031fa9e2), - TOBN(0xbec3312a, 0x0e43a34a), TOBN(0x1d935639, 0x55ef47d3), - TOBN(0x5ea02489, 0x8fea73ea), TOBN(0x8247b364, 0xa035afb2), - TOBN(0xb58300a6, 0x5265b54c), TOBN(0x3286662f, 0x722c7148), - TOBN(0xb77fd76b, 0xb4ec4c20), TOBN(0xf0a12fa7, 0x0f3fe3fd), - TOBN(0xf845bbf5, 0x41d8c7e8), TOBN(0xe4d969ca, 0x5ec10aa8), - TOBN(0x4c0053b7, 0x43e232a3), TOBN(0xdc7a3fac, 0x37f8a45a), - TOBN(0x3c4261c5, 0x20d81c8f), TOBN(0xfd4b3453, 0xb00eab00), - TOBN(0x76d48f86, 0xd36e3062), TOBN(0x626c5277, 0xa143ff02), - TOBN(0x538174de, 0xaf76f42e), TOBN(0x2267aa86, 0x6407ceac), - TOBN(0xfad76351, 0x72e572d5), TOBN(0xab861af7, 0xba7330eb), - TOBN(0xa0a1c8c7, 0x418d8657), TOBN(0x988821cb, 0x20289a52), - TOBN(0x79732522, 0xcccc18ad), TOBN(0xaadf3f8d, 0xf1a6e027), - TOBN(0xf7382c93, 0x17c2354d), TOBN(0x5ce1680c, 0xd818b689), - TOBN(0x359ebbfc, 0xd9ecbee9), TOBN(0x4330689c, 0x1cae62ac), - TOBN(0xb55ce5b4, 0xc51ac38a), TOBN(0x7921dfea, 0xfe238ee8), - TOBN(0x3972bef8, 0x271d1ca5), TOBN(0x3e423bc7, 0xe8aabd18), - TOBN(0x57b09f3f, 0x44a3e5e3), TOBN(0x5da886ae, 0x7b444d66), - TOBN(0x68206634, 0xa9964375), TOBN(0x356a2fa3, 0x699cd0ff), - TOBN(0xaf0faa24, 0xdba515e9), TOBN(0x536e1f5c, 0xb321d79a), - TOBN(0xd3b9913a, 0x5c04e4ea), TOBN(0xd549dcfe, 0xd6f11513), - TOBN(0xee227bf5, 0x79fd1d94), TOBN(0x9f35afee, 0xb43f2c67), - TOBN(0xd2638d24, 0xf1314f53), TOBN(0x62baf948, 0xcabcd822), - TOBN(0x5542de29, 0x4ef48db0), TOBN(0xb3eb6a04, 0xfc5f6bb2), - TOBN(0x23c110ae, 0x1208e16a), TOBN(0x1a4d15b5, 0xf8363e24), - TOBN(0x30716844, 0x164be00b), TOBN(0xa8e24824, 0xf6f4690d), - TOBN(0x548773a2, 0x90b170cf), TOBN(0xa1bef331, 0x42f191f4), - TOBN(0x70f418d0, 0x9247aa97), TOBN(0xea06028e, 0x48be9147), - TOBN(0xe13122f3, 0xdbfb894e), TOBN(0xbe9b79f6, 0xce274b18), - TOBN(0x85a49de5, 0xca58aadf), TOBN(0x24957758, 0x11487351), - TOBN(0x111def61, 0xbb939099), TOBN(0x1d6a974a, 0x26d13694), - TOBN(0x4474b4ce, 0xd3fc253b), TOBN(0x3a1485e6, 0x4c5db15e), - TOBN(0xe79667b4, 0x147c15b4), TOBN(0xe34f553b, 0x7bc61301), - TOBN(0x032b80f8, 0x17094381), TOBN(0x55d8bafd, 0x723eaa21), - TOBN(0x5a987995, 0xf1c0e74e), TOBN(0x5a9b292e, 0xebba289c), - TOBN(0x413cd4b2, 0xeb4c8251), TOBN(0x98b5d243, 0xd162db0a), - TOBN(0xbb47bf66, 0x68342520), TOBN(0x08d68949, 0xbaa862d1), - TOBN(0x11f349c7, 0xe906abcd), TOBN(0x454ce985, 0xed7bf00e), - TOBN(0xacab5c9e, 0xb55b803b), TOBN(0xb03468ea, 0x31e3c16d), - TOBN(0x5c24213d, 0xd273bf12), TOBN(0x211538eb, 0x71587887), - TOBN(0x198e4a2f, 0x731dea2d), TOBN(0xd5856cf2, 0x74ed7b2a), - TOBN(0x86a632eb, 0x13a664fe), TOBN(0x932cd909, 0xbda41291), - TOBN(0x850e95d4, 0xc0c4ddc0), TOBN(0xc0f422f8, 0x347fc2c9), - TOBN(0xe68cbec4, 0x86076bcb), TOBN(0xf9e7c0c0, 0xcd6cd286), - TOBN(0x65994ddb, 0x0f5f27ca), TOBN(0xe85461fb, 0xa80d59ff), - TOBN(0xff05481a, 0x66601023), TOBN(0xc665427a, 0xfc9ebbfb), - TOBN(0xb0571a69, 0x7587fd52), TOBN(0x935289f8, 0x8d49efce), - TOBN(0x61becc60, 0xea420688), TOBN(0xb22639d9, 0x13a786af), - TOBN(0x1a8e6220, 0x361ecf90), TOBN(0x001f23e0, 0x25506463), - TOBN(0xe4ae9b5d, 0x0a5c2b79), TOBN(0xebc9cdad, 0xd8149db5), - TOBN(0xb33164a1, 0x934aa728), TOBN(0x750eb00e, 0xae9b60f3), - TOBN(0x5a91615b, 0x9b9cfbfd), TOBN(0x97015cbf, 0xef45f7f6), - TOBN(0xb462c4a5, 0xbf5151df), TOBN(0x21adcc41, 0xb07118f2), - TOBN(0xd60c545b, 0x043fa42c), TOBN(0xfc21aa54, 0xe96be1ab), - TOBN(0xe84bc32f, 0x4e51ea80), TOBN(0x3dae45f0, 0x259b5d8d), - TOBN(0xbb73c7eb, 0xc38f1b5e), TOBN(0xe405a74a, 0xe8ae617d), - TOBN(0xbb1ae9c6, 0x9f1c56bd), TOBN(0x8c176b98, 0x49f196a4), - TOBN(0xc448f311, 0x6875092b), TOBN(0xb5afe3de, 0x9f976033), - TOBN(0xa8dafd49, 0x145813e5), TOBN(0x687fc4d9, 0xe2b34226), - TOBN(0xf2dfc92d, 0x4c7ff57f), TOBN(0x004e3fc1, 0x401f1b46), - TOBN(0x5afddab6, 0x1430c9ab), TOBN(0x0bdd41d3, 0x2238e997), - TOBN(0xf0947430, 0x418042ae), TOBN(0x71f9adda, 0xcdddc4cb), - TOBN(0x7090c016, 0xc52dd907), TOBN(0xd9bdf44d, 0x29e2047f), - TOBN(0xe6f1fe80, 0x1b1011a6), TOBN(0xb63accbc, 0xd9acdc78), - TOBN(0xcfc7e235, 0x1272a95b), TOBN(0x0c667717, 0xa6276ac8), - TOBN(0x3c0d3709, 0xe2d7eef7), TOBN(0x5add2b06, 0x9a685b3e), - TOBN(0x363ad32d, 0x14ea5d65), TOBN(0xf8e01f06, 0x8d7dd506), - TOBN(0xc9ea2213, 0x75b4aac6), TOBN(0xed2a2bf9, 0x0d353466), - TOBN(0x439d79b5, 0xe9d3a7c3), TOBN(0x8e0ee5a6, 0x81b7f34b), - TOBN(0xcf3dacf5, 0x1dc4ba75), TOBN(0x1d3d1773, 0xeb3310c7), - TOBN(0xa8e67112, 0x7747ae83), TOBN(0x31f43160, 0x197d6b40), - TOBN(0x0521ccee, 0xcd961400), TOBN(0x67246f11, 0xf6535768), - TOBN(0x702fcc5a, 0xef0c3133), TOBN(0x247cc45d, 0x7e16693b), - TOBN(0xfd484e49, 0xc729b749), TOBN(0x522cef7d, 0xb218320f), - TOBN(0xe56ef405, 0x59ab93b3), TOBN(0x225fba11, 0x9f181071), - TOBN(0x33bd6595, 0x15330ed0), TOBN(0xc4be69d5, 0x1ddb32f7), - TOBN(0x264c7668, 0x0448087c), TOBN(0xac30903f, 0x71432dae), - TOBN(0x3851b266, 0x00f9bf47), TOBN(0x400ed311, 0x6cdd6d03), - TOBN(0x045e79fe, 0xf8fd2424), TOBN(0xfdfd974a, 0xfa6da98b), - TOBN(0x45c9f641, 0x0c1e673a), TOBN(0x76f2e733, 0x5b2c5168), - TOBN(0x1adaebb5, 0x2a601753), TOBN(0xb286514c, 0xc57c2d49), - TOBN(0xd8769670, 0x1e0bfd24), TOBN(0x950c547e, 0x04478922), - TOBN(0xd1d41969, 0xe5d32bfe), TOBN(0x30bc1472, 0x750d6c3e), - TOBN(0x8f3679fe, 0xe0e27f3a), TOBN(0x8f64a7dc, 0xa4a6ee0c), - TOBN(0x2fe59937, 0x633dfb1f), TOBN(0xea82c395, 0x977f2547), - TOBN(0xcbdfdf1a, 0x661ea646), TOBN(0xc7ccc591, 0xb9085451), - TOBN(0x82177962, 0x81761e13), TOBN(0xda57596f, 0x9196885c), - TOBN(0xbc17e849, 0x28ffbd70), TOBN(0x1e6e0a41, 0x2671d36f), - TOBN(0x61ae872c, 0x4152fcf5), TOBN(0x441c87b0, 0x9e77e754), - TOBN(0xd0799dd5, 0xa34dff09), TOBN(0x766b4e44, 0x88a6b171), - TOBN(0xdc06a512, 0x11f1c792), TOBN(0xea02ae93, 0x4be35c3e), - TOBN(0xe5ca4d6d, 0xe90c469e), TOBN(0x4df4368e, 0x56e4ff5c), - TOBN(0x7817acab, 0x4baef62e), TOBN(0x9f5a2202, 0xa85b91e8), - TOBN(0x9666ebe6, 0x6ce57610), TOBN(0x32ad31f3, 0xf73bfe03), - TOBN(0x628330a4, 0x25bcf4d6), TOBN(0xea950593, 0x515056e6), - TOBN(0x59811c89, 0xe1332156), TOBN(0xc89cf1fe, 0x8c11b2d7), - TOBN(0x75b63913, 0x04e60cc0), TOBN(0xce811e8d, 0x4625d375), - TOBN(0x030e43fc, 0x2d26e562), TOBN(0xfbb30b4b, 0x608d36a0), - TOBN(0x634ff82c, 0x48528118), TOBN(0x7c6fe085, 0xcd285911), - TOBN(0x7f2830c0, 0x99358f28), TOBN(0x2e60a95e, 0x665e6c09), - TOBN(0x08407d3d, 0x9b785dbf), TOBN(0x530889ab, 0xa759bce7), - TOBN(0xf228e0e6, 0x52f61239), TOBN(0x2b6d1461, 0x6879be3c), - TOBN(0xe6902c04, 0x51a7bbf7), TOBN(0x30ad99f0, 0x76f24a64), - TOBN(0x66d9317a, 0x98bc6da0), TOBN(0xf4f877f3, 0xcb596ac0), - TOBN(0xb05ff62d, 0x4c44f119), TOBN(0x4555f536, 0xe9b77416), - TOBN(0xc7c0d059, 0x8caed63b), TOBN(0x0cd2b7ce, 0xc358b2a9), - TOBN(0x3f33287b, 0x46945fa3), TOBN(0xf8785b20, 0xd67c8791), - TOBN(0xc54a7a61, 0x9637bd08), TOBN(0x54d4598c, 0x18be79d7), - TOBN(0x889e5acb, 0xc46d7ce1), TOBN(0x9a515bb7, 0x8b085877), - TOBN(0xfac1a03d, 0x0b7a5050), TOBN(0x7d3e738a, 0xf2926035), - TOBN(0x861cc2ce, 0x2a6cb0eb), TOBN(0x6f2e2955, 0x8f7adc79), - TOBN(0x61c4d451, 0x33016376), TOBN(0xd9fd2c80, 0x5ad59090), - TOBN(0xe5a83738, 0xb2b836a1), TOBN(0x855b41a0, 0x7c0d6622), - TOBN(0x186fe317, 0x7cc19af1), TOBN(0x6465c1ff, 0xfdd99acb), - TOBN(0x46e5c23f, 0x6974b99e), TOBN(0x75a7cf8b, 0xa2717cbe), - TOBN(0x4d2ebc3f, 0x062be658), TOBN(0x094b4447, 0x5f209c98), - TOBN(0x4af285ed, 0xb940cb5a), TOBN(0x6706d792, 0x7cc82f10), - TOBN(0xc8c8776c, 0x030526fa), TOBN(0xfa8e6f76, 0xa0da9140), - TOBN(0x77ea9d34, 0x591ee4f0), TOBN(0x5f46e337, 0x40274166), - TOBN(0x1bdf98bb, 0xea671457), TOBN(0xd7c08b46, 0x862a1fe2), - TOBN(0x46cc303c, 0x1c08ad63), TOBN(0x99543440, 0x4c845e7b), - TOBN(0x1b8fbdb5, 0x48f36bf7), TOBN(0x5b82c392, 0x8c8273a7), - TOBN(0x08f712c4, 0x928435d5), TOBN(0x071cf0f1, 0x79330380), - TOBN(0xc74c2d24, 0xa8da054a), TOBN(0xcb0e7201, 0x43c46b5c), - TOBN(0x0ad7337a, 0xc0b7eff3), TOBN(0x8552225e, 0xc5e48b3c), - TOBN(0xe6f78b0c, 0x73f13a5f), TOBN(0x5e70062e, 0x82349cbe), - TOBN(0x6b8d5048, 0xe7073969), TOBN(0x392d2a29, 0xc33cb3d2), - TOBN(0xee4f727c, 0x4ecaa20f), TOBN(0xa068c99e, 0x2ccde707), - TOBN(0xfcd5651f, 0xb87a2913), TOBN(0xea3e3c15, 0x3cc252f0), - TOBN(0x777d92df, 0x3b6cd3e4), TOBN(0x7a414143, 0xc5a732e7), - TOBN(0xa895951a, 0xa71ff493), TOBN(0xfe980c92, 0xbbd37cf6), - TOBN(0x45bd5e64, 0xdecfeeff), TOBN(0x910dc2a9, 0xa44c43e9), - TOBN(0xcb403f26, 0xcca9f54d), TOBN(0x928bbdfb, 0x9303f6db), - TOBN(0x3c37951e, 0xa9eee67c), TOBN(0x3bd61a52, 0xf79961c3), - TOBN(0x09a238e6, 0x395c9a79), TOBN(0x6940ca2d, 0x61eb352d), - TOBN(0x7d1e5c5e, 0xc1875631), TOBN(0x1e19742c, 0x1e1b20d1), - TOBN(0x4633d908, 0x23fc2e6e), TOBN(0xa76e29a9, 0x08959149), - TOBN(0x61069d9c, 0x84ed7da5), TOBN(0x0baa11cf, 0x5dbcad51), - TOBN(0xd01eec64, 0x961849da), TOBN(0x93b75f1f, 0xaf3d8c28), - TOBN(0x57bc4f9f, 0x1ca2ee44), TOBN(0x5a26322d, 0x00e00558), - TOBN(0x1888d658, 0x61a023ef), TOBN(0x1d72aab4, 0xb9e5246e), - TOBN(0xa9a26348, 0xe5563ec0), TOBN(0xa0971963, 0xc3439a43), - TOBN(0x567dd54b, 0xadb9b5b7), TOBN(0x73fac1a1, 0xc45a524b), - TOBN(0x8fe97ef7, 0xfe38e608), TOBN(0x608748d2, 0x3f384f48), - TOBN(0xb0571794, 0xc486094f), TOBN(0x869254a3, 0x8bf3a8d6), - TOBN(0x148a8dd1, 0x310b0e25), TOBN(0x99ab9f3f, 0x9aa3f7d8), - TOBN(0x0927c68a, 0x6706c02e), TOBN(0x22b5e76c, 0x69790e6c), - TOBN(0x6c325260, 0x6c71376c), TOBN(0x53a57690, 0x09ef6657), - TOBN(0x8d63f852, 0xedffcf3a), TOBN(0xb4d2ed04, 0x3c0a6f55), - TOBN(0xdb3aa8de, 0x12519b9e), TOBN(0x5d38e9c4, 0x1e0a569a), - TOBN(0x871528bf, 0x303747e2), TOBN(0xa208e77c, 0xf5b5c18d), - TOBN(0x9d129c88, 0xca6bf923), TOBN(0xbcbf197f, 0xbf02839f), - TOBN(0x9b9bf030, 0x27323194), TOBN(0x3b055a8b, 0x339ca59d), - TOBN(0xb46b2312, 0x0f669520), TOBN(0x19789f1f, 0x497e5f24), - TOBN(0x9c499468, 0xaaf01801), TOBN(0x72ee1190, 0x8b69d59c), - TOBN(0x8bd39595, 0xacf4c079), TOBN(0x3ee11ece, 0x8e0cd048), - TOBN(0xebde86ec, 0x1ed66f18), TOBN(0x225d906b, 0xd61fce43), - TOBN(0x5cab07d6, 0xe8bed74d), TOBN(0x16e4617f, 0x27855ab7), - TOBN(0x6568aadd, 0xb2fbc3dd), TOBN(0xedb5484f, 0x8aeddf5b), - TOBN(0x878f20e8, 0x6dcf2fad), TOBN(0x3516497c, 0x615f5699)}, - {TOBN(0xef0a3fec, 0xfa181e69), TOBN(0x9ea02f81, 0x30d69a98), - TOBN(0xb2e9cf8e, 0x66eab95d), TOBN(0x520f2beb, 0x24720021), - TOBN(0x621c540a, 0x1df84361), TOBN(0x12037721, 0x71fa6d5d), - TOBN(0x6e3c7b51, 0x0ff5f6ff), TOBN(0x817a069b, 0xabb2bef3), - TOBN(0x83572fb6, 0xb294cda6), TOBN(0x6ce9bf75, 0xb9039f34), - TOBN(0x20e012f0, 0x095cbb21), TOBN(0xa0aecc1b, 0xd063f0da), - TOBN(0x57c21c3a, 0xf02909e5), TOBN(0xc7d59ecf, 0x48ce9cdc), - TOBN(0x2732b844, 0x8ae336f8), TOBN(0x056e3723, 0x3f4f85f4), - TOBN(0x8a10b531, 0x89e800ca), TOBN(0x50fe0c17, 0x145208fd), - TOBN(0x9e43c0d3, 0xb714ba37), TOBN(0x427d200e, 0x34189acc), - TOBN(0x05dee24f, 0xe616e2c0), TOBN(0x9c25f4c8, 0xee1854c1), - TOBN(0x4d3222a5, 0x8f342a73), TOBN(0x0807804f, 0xa027c952), - TOBN(0xc222653a, 0x4f0d56f3), TOBN(0x961e4047, 0xca28b805), - TOBN(0x2c03f8b0, 0x4a73434b), TOBN(0x4c966787, 0xab712a19), - TOBN(0xcc196c42, 0x864fee42), TOBN(0xc1be93da, 0x5b0ece5c), - TOBN(0xa87d9f22, 0xc131c159), TOBN(0x2bb6d593, 0xdce45655), - TOBN(0x22c49ec9, 0xb809b7ce), TOBN(0x8a41486b, 0xe2c72c2c), - TOBN(0x813b9420, 0xfea0bf36), TOBN(0xb3d36ee9, 0xa66dac69), - TOBN(0x6fddc08a, 0x328cc987), TOBN(0x0a3bcd2c, 0x3a326461), - TOBN(0x7103c49d, 0xd810dbba), TOBN(0xf9d81a28, 0x4b78a4c4), - TOBN(0x3de865ad, 0xe4d55941), TOBN(0xdedafa5e, 0x30384087), - TOBN(0x6f414abb, 0x4ef18b9b), TOBN(0x9ee9ea42, 0xfaee5268), - TOBN(0x260faa16, 0x37a55a4a), TOBN(0xeb19a514, 0x015f93b9), - TOBN(0x51d7ebd2, 0x9e9c3598), TOBN(0x523fc56d, 0x1932178e), - TOBN(0x501d070c, 0xb98fe684), TOBN(0xd60fbe9a, 0x124a1458), - TOBN(0xa45761c8, 0x92bc6b3f), TOBN(0xf5384858, 0xfe6f27cb), - TOBN(0x4b0271f7, 0xb59e763b), TOBN(0x3d4606a9, 0x5b5a8e5e), - TOBN(0x1eda5d9b, 0x05a48292), TOBN(0xda7731d0, 0xe6fec446), - TOBN(0xa3e33693, 0x90d45871), TOBN(0xe9764040, 0x06166d8d), - TOBN(0xb5c33682, 0x89a90403), TOBN(0x4bd17983, 0x72f1d637), - TOBN(0xa616679e, 0xd5d2c53a), TOBN(0x5ec4bcd8, 0xfdcf3b87), - TOBN(0xae6d7613, 0xb66a694e), TOBN(0x7460fc76, 0xe3fc27e5), - TOBN(0x70469b82, 0x95caabee), TOBN(0xde024ca5, 0x889501e3), - TOBN(0x6bdadc06, 0x076ed265), TOBN(0x0cb1236b, 0x5a0ef8b2), - TOBN(0x4065ddbf, 0x0972ebf9), TOBN(0xf1dd3875, 0x22aca432), - TOBN(0xa88b97cf, 0x744aff76), TOBN(0xd1359afd, 0xfe8e3d24), - TOBN(0x52a3ba2b, 0x91502cf3), TOBN(0x2c3832a8, 0x084db75d), - TOBN(0x04a12ddd, 0xde30b1c9), TOBN(0x7802eabc, 0xe31fd60c), - TOBN(0x33707327, 0xa37fddab), TOBN(0x65d6f2ab, 0xfaafa973), - TOBN(0x3525c5b8, 0x11e6f91a), TOBN(0x76aeb0c9, 0x5f46530b), - TOBN(0xe8815ff6, 0x2f93a675), TOBN(0xa6ec9684, 0x05f48679), - TOBN(0x6dcbb556, 0x358ae884), TOBN(0x0af61472, 0xe19e3873), - TOBN(0x72334372, 0xa5f696be), TOBN(0xc65e57ea, 0x6f22fb70), - TOBN(0x268da30c, 0x946cea90), TOBN(0x136a8a87, 0x65681b2a), - TOBN(0xad5e81dc, 0x0f9f44d4), TOBN(0xf09a6960, 0x2c46585a), - TOBN(0xd1649164, 0xc447d1b1), TOBN(0x3b4b36c8, 0x879dc8b1), - TOBN(0x20d4177b, 0x3b6b234c), TOBN(0x096a2505, 0x1730d9d0), - TOBN(0x0611b9b8, 0xef80531d), TOBN(0xba904b3b, 0x64bb495d), - TOBN(0x1192d9d4, 0x93a3147a), TOBN(0x9f30a5dc, 0x9a565545), - TOBN(0x90b1f9cb, 0x6ef07212), TOBN(0x29958546, 0x0d87fc13), - TOBN(0xd3323eff, 0xc17db9ba), TOBN(0xcb18548c, 0xcb1644a8), - TOBN(0x18a306d4, 0x4f49ffbc), TOBN(0x28d658f1, 0x4c2e8684), - TOBN(0x44ba60cd, 0xa99f8c71), TOBN(0x67b7abdb, 0x4bf742ff), - TOBN(0x66310f9c, 0x914b3f99), TOBN(0xae430a32, 0xf412c161), - TOBN(0x1e6776d3, 0x88ace52f), TOBN(0x4bc0fa24, 0x52d7067d), - TOBN(0x03c286aa, 0x8f07cd1b), TOBN(0x4cb8f38c, 0xa985b2c1), - TOBN(0x83ccbe80, 0x8c3bff36), TOBN(0x005a0bd2, 0x5263e575), - TOBN(0x460d7dda, 0x259bdcd1), TOBN(0x4a1c5642, 0xfa5cab6b), - TOBN(0x2b7bdbb9, 0x9fe4fc88), TOBN(0x09418e28, 0xcc97bbb5), - TOBN(0xd8274fb4, 0xa12321ae), TOBN(0xb137007d, 0x5c87b64e), - TOBN(0x80531fe1, 0xc63c4962), TOBN(0x50541e89, 0x981fdb25), - TOBN(0xdc1291a1, 0xfd4c2b6b), TOBN(0xc0693a17, 0xa6df4fca), - TOBN(0xb2c4604e, 0x0117f203), TOBN(0x245f1963, 0x0a99b8d0), - TOBN(0xaedc20aa, 0xc6212c44), TOBN(0xb1ed4e56, 0x520f52a8), - TOBN(0xfe48f575, 0xf8547be3), TOBN(0x0a7033cd, 0xa9e45f98), - TOBN(0x4b45d3a9, 0x18c50100), TOBN(0xb2a6cd6a, 0xa61d41da), - TOBN(0x60bbb4f5, 0x57933c6b), TOBN(0xa7538ebd, 0x2b0d7ffc), - TOBN(0x9ea3ab8d, 0x8cd626b6), TOBN(0x8273a484, 0x3601625a), - TOBN(0x88859845, 0x0168e508), TOBN(0x8cbc9bb2, 0x99a94abd), - TOBN(0x713ac792, 0xfab0a671), TOBN(0xa3995b19, 0x6c9ebffc), - TOBN(0xe711668e, 0x1239e152), TOBN(0x56892558, 0xbbb8dff4), - TOBN(0x8bfc7dab, 0xdbf17963), TOBN(0x5b59fe5a, 0xb3de1253), - TOBN(0x7e3320eb, 0x34a9f7ae), TOBN(0xe5e8cf72, 0xd751efe4), - TOBN(0x7ea003bc, 0xd9be2f37), TOBN(0xc0f551a0, 0xb6c08ef7), - TOBN(0x56606268, 0x038f6725), TOBN(0x1dd38e35, 0x6d92d3b6), - TOBN(0x07dfce7c, 0xc3cbd686), TOBN(0x4e549e04, 0x651c5da8), - TOBN(0x4058f93b, 0x08b19340), TOBN(0xc2fae6f4, 0xcac6d89d), - TOBN(0x4bad8a8c, 0x8f159cc7), TOBN(0x0ddba4b3, 0xcb0b601c), - TOBN(0xda4fc7b5, 0x1dd95f8c), TOBN(0x1d163cd7, 0xcea5c255), - TOBN(0x30707d06, 0x274a8c4c), TOBN(0x79d9e008, 0x2802e9ce), - TOBN(0x02a29ebf, 0xe6ddd505), TOBN(0x37064e74, 0xb50bed1a), - TOBN(0x3f6bae65, 0xa7327d57), TOBN(0x3846f5f1, 0xf83920bc), - TOBN(0x87c37491, 0x60df1b9b), TOBN(0x4cfb2895, 0x2d1da29f), - TOBN(0x10a478ca, 0x4ed1743c), TOBN(0x390c6030, 0x3edd47c6), - TOBN(0x8f3e5312, 0x8c0a78de), TOBN(0xccd02bda, 0x1e85df70), - TOBN(0xd6c75c03, 0xa61b6582), TOBN(0x0762921c, 0xfc0eebd1), - TOBN(0xd34d0823, 0xd85010c0), TOBN(0xd73aaacb, 0x0044cf1f), - TOBN(0xfb4159bb, 0xa3b5e78a), TOBN(0x2287c7f7, 0xe5826f3f), - TOBN(0x4aeaf742, 0x580b1a01), TOBN(0xf080415d, 0x60423b79), - TOBN(0xe12622cd, 0xa7dea144), TOBN(0x49ea4996, 0x59d62472), - TOBN(0xb42991ef, 0x571f3913), TOBN(0x0610f214, 0xf5b25a8a), - TOBN(0x47adc585, 0x30b79e8f), TOBN(0xf90e3df6, 0x07a065a2), - TOBN(0x5d0a5deb, 0x43e2e034), TOBN(0x53fb5a34, 0x444024aa), - TOBN(0xa8628c68, 0x6b0c9f7f), TOBN(0x9c69c29c, 0xac563656), - TOBN(0x5a231feb, 0xbace47b6), TOBN(0xbdce0289, 0x9ea5a2ec), - TOBN(0x05da1fac, 0x9463853e), TOBN(0x96812c52, 0x509e78aa), - TOBN(0xd3fb5771, 0x57151692), TOBN(0xeb2721f8, 0xd98e1c44), - TOBN(0xc0506087, 0x32399be1), TOBN(0xda5a5511, 0xd979d8b8), - TOBN(0x737ed55d, 0xc6f56780), TOBN(0xe20d3004, 0x0dc7a7f4), - TOBN(0x02ce7301, 0xf5941a03), TOBN(0x91ef5215, 0xed30f83a), - TOBN(0x28727fc1, 0x4092d85f), TOBN(0x72d223c6, 0x5c49e41a), - TOBN(0xa7cf30a2, 0xba6a4d81), TOBN(0x7c086209, 0xb030d87d), - TOBN(0x04844c7d, 0xfc588b09), TOBN(0x728cd499, 0x5874bbb0), - TOBN(0xcc1281ee, 0xe84c0495), TOBN(0x0769b5ba, 0xec31958f), - TOBN(0x665c228b, 0xf99c2471), TOBN(0xf2d8a11b, 0x191eb110), - TOBN(0x4594f494, 0xd36d7024), TOBN(0x482ded8b, 0xcdcb25a1), - TOBN(0xc958a9d8, 0xdadd4885), TOBN(0x7004477e, 0xf1d2b547), - TOBN(0x0a45f6ef, 0x2a0af550), TOBN(0x4fc739d6, 0x2f8d6351), - TOBN(0x75cdaf27, 0x786f08a9), TOBN(0x8700bb26, 0x42c2737f), - TOBN(0x855a7141, 0x1c4e2670), TOBN(0x810188c1, 0x15076fef), - TOBN(0xc251d0c9, 0xabcd3297), TOBN(0xae4c8967, 0xf48108eb), - TOBN(0xbd146de7, 0x18ceed30), TOBN(0xf9d4f07a, 0xc986bced), - TOBN(0x5ad98ed5, 0x83fa1e08), TOBN(0x7780d33e, 0xbeabd1fb), - TOBN(0xe330513c, 0x903b1196), TOBN(0xba11de9e, 0xa47bc8c4), - TOBN(0x684334da, 0x02c2d064), TOBN(0x7ecf360d, 0xa48de23b), - TOBN(0x57a1b474, 0x0a9089d8), TOBN(0xf28fa439, 0xff36734c), - TOBN(0xf2a482cb, 0xea4570b3), TOBN(0xee65d68b, 0xa5ebcee9), - TOBN(0x988d0036, 0xb9694cd5), TOBN(0x53edd0e9, 0x37885d32), - TOBN(0xe37e3307, 0xbeb9bc6d), TOBN(0xe9abb907, 0x9f5c6768), - TOBN(0x4396ccd5, 0x51f2160f), TOBN(0x2500888c, 0x47336da6), - TOBN(0x383f9ed9, 0x926fce43), TOBN(0x809dd1c7, 0x04da2930), - TOBN(0x30f6f596, 0x8a4cb227), TOBN(0x0d700c7f, 0x73a56b38), - TOBN(0x1825ea33, 0xab64a065), TOBN(0xaab9b735, 0x1338df80), - TOBN(0x1516100d, 0x9b63f57f), TOBN(0x2574395a, 0x27a6a634), - TOBN(0xb5560fb6, 0x700a1acd), TOBN(0xe823fd73, 0xfd999681), - TOBN(0xda915d1f, 0x6cb4e1ba), TOBN(0x0d030118, 0x6ebe00a3), - TOBN(0x744fb0c9, 0x89fca8cd), TOBN(0x970d01db, 0xf9da0e0b), - TOBN(0x0ad8c564, 0x7931d76f), TOBN(0xb15737bf, 0xf659b96a), - TOBN(0xdc9933e8, 0xa8b484e7), TOBN(0xb2fdbdf9, 0x7a26dec7), - TOBN(0x2349e9a4, 0x9f1f0136), TOBN(0x7860368e, 0x70fddddb), - TOBN(0xd93d2c1c, 0xf9ad3e18), TOBN(0x6d6c5f17, 0x689f4e79), - TOBN(0x7a544d91, 0xb24ff1b6), TOBN(0x3e12a5eb, 0xfe16cd8c), - TOBN(0x543574e9, 0xa56b872f), TOBN(0xa1ad550c, 0xfcf68ea2), - TOBN(0x689e37d2, 0x3f560ef7), TOBN(0x8c54b9ca, 0xc9d47a8b), - TOBN(0x46d40a4a, 0x088ac342), TOBN(0xec450c7c, 0x1576c6d0), - TOBN(0xb589e31c, 0x1f9689e9), TOBN(0xdacf2602, 0xb8781718), - TOBN(0xa89237c6, 0xc8cb6b42), TOBN(0x1326fc93, 0xb96ef381), - TOBN(0x55d56c6d, 0xb5f07825), TOBN(0xacba2eea, 0x7449e22d), - TOBN(0x74e0887a, 0x633c3000), TOBN(0xcb6cd172, 0xd7cbcf71), - TOBN(0x309e81de, 0xc36cf1be), TOBN(0x07a18a6d, 0x60ae399b), - TOBN(0xb36c2679, 0x9edce57e), TOBN(0x52b892f4, 0xdf001d41), - TOBN(0xd884ae5d, 0x16a1f2c6), TOBN(0x9b329424, 0xefcc370a), - TOBN(0x3120daf2, 0xbd2e21df), TOBN(0x55298d2d, 0x02470a99), - TOBN(0x0b78af6c, 0xa05db32e), TOBN(0x5c76a331, 0x601f5636), - TOBN(0xaae861ff, 0xf8a4f29c), TOBN(0x70dc9240, 0xd68f8d49), - TOBN(0x960e649f, 0x81b1321c), TOBN(0x3d2c801b, 0x8792e4ce), - TOBN(0xf479f772, 0x42521876), TOBN(0x0bed93bc, 0x416c79b1), - TOBN(0xa67fbc05, 0x263e5bc9), TOBN(0x01e8e630, 0x521db049), - TOBN(0x76f26738, 0xc6f3431e), TOBN(0xe609cb02, 0xe3267541), - TOBN(0xb10cff2d, 0x818c877c), TOBN(0x1f0e75ce, 0x786a13cb), - TOBN(0xf4fdca64, 0x1158544d), TOBN(0x5d777e89, 0x6cb71ed0), - TOBN(0x3c233737, 0xa9aa4755), TOBN(0x7b453192, 0xe527ab40), - TOBN(0xdb59f688, 0x39f05ffe), TOBN(0x8f4f4be0, 0x6d82574e), - TOBN(0xcce3450c, 0xee292d1b), TOBN(0xaa448a12, 0x61ccd086), - TOBN(0xabce91b3, 0xf7914967), TOBN(0x4537f09b, 0x1908a5ed), - TOBN(0xa812421e, 0xf51042e7), TOBN(0xfaf5cebc, 0xec0b3a34), - TOBN(0x730ffd87, 0x4ca6b39a), TOBN(0x70fb72ed, 0x02efd342), - TOBN(0xeb4735f9, 0xd75c8edb), TOBN(0xc11f2157, 0xc278aa51), - TOBN(0xc459f635, 0xbf3bfebf), TOBN(0x3a1ff0b4, 0x6bd9601f), - TOBN(0xc9d12823, 0xc420cb73), TOBN(0x3e9af3e2, 0x3c2915a3), - TOBN(0xe0c82c72, 0xb41c3440), TOBN(0x175239e5, 0xe3039a5f), - TOBN(0xe1084b8a, 0x558795a3), TOBN(0x328d0a1d, 0xd01e5c60), - TOBN(0x0a495f2e, 0xd3788a04), TOBN(0x25d8ff16, 0x66c11a9f), - TOBN(0xf5155f05, 0x9ed692d6), TOBN(0x954fa107, 0x4f425fe4), - TOBN(0xd16aabf2, 0xe98aaa99), TOBN(0x90cd8ba0, 0x96b0f88a), - TOBN(0x957f4782, 0xc154026a), TOBN(0x54ee0734, 0x52af56d2), - TOBN(0xbcf89e54, 0x45b4147a), TOBN(0x3d102f21, 0x9a52816c), - TOBN(0x6808517e, 0x39b62e77), TOBN(0x92e25421, 0x69169ad8), - TOBN(0xd721d871, 0xbb608558), TOBN(0x60e4ebae, 0xf6d4ff9b), - TOBN(0x0ba10819, 0x41f2763e), TOBN(0xca2e45be, 0x51ee3247), - TOBN(0x66d172ec, 0x2bfd7a5f), TOBN(0x528a8f2f, 0x74d0b12d), - TOBN(0xe17f1e38, 0xdabe70dc), TOBN(0x1d5d7316, 0x9f93983c), - TOBN(0x51b2184a, 0xdf423e31), TOBN(0xcb417291, 0xaedb1a10), - TOBN(0x2054ca93, 0x625bcab9), TOBN(0x54396860, 0xa98998f0), - TOBN(0x4e53f6c4, 0xa54ae57e), TOBN(0x0ffeb590, 0xee648e9d), - TOBN(0xfbbdaadc, 0x6afaf6bc), TOBN(0xf88ae796, 0xaa3bfb8a), - TOBN(0x209f1d44, 0xd2359ed9), TOBN(0xac68dd03, 0xf3544ce2), - TOBN(0xf378da47, 0xfd51e569), TOBN(0xe1abd860, 0x2cc80097), - TOBN(0x23ca18d9, 0x343b6e3a), TOBN(0x480797e8, 0xb40a1bae), - TOBN(0xd1f0c717, 0x533f3e67), TOBN(0x44896970, 0x06e6cdfc), - TOBN(0x8ca21055, 0x52a82e8d), TOBN(0xb2caf785, 0x78460cdc), - TOBN(0x4c1b7b62, 0xe9037178), TOBN(0xefc09d2c, 0xdb514b58), - TOBN(0x5f2df9ee, 0x9113be5c), TOBN(0x2fbda78f, 0xb3f9271c), - TOBN(0xe09a81af, 0x8f83fc54), TOBN(0x06b13866, 0x8afb5141), - TOBN(0x38f6480f, 0x43e3865d), TOBN(0x72dd77a8, 0x1ddf47d9), - TOBN(0xf2a8e971, 0x4c205ff7), TOBN(0x46d449d8, 0x9d088ad8), - TOBN(0x926619ea, 0x185d706f), TOBN(0xe47e02eb, 0xc7dd7f62), - TOBN(0xe7f120a7, 0x8cbc2031), TOBN(0xc18bef00, 0x998d4ac9), - TOBN(0x18f37a9c, 0x6bdf22da), TOBN(0xefbc432f, 0x90dc82df), - TOBN(0xc52cef8e, 0x5d703651), TOBN(0x82887ba0, 0xd99881a5), - TOBN(0x7cec9dda, 0xb920ec1d), TOBN(0xd0d7e8c3, 0xec3e8d3b), - TOBN(0x445bc395, 0x4ca88747), TOBN(0xedeaa2e0, 0x9fd53535), - TOBN(0x461b1d93, 0x6cc87475), TOBN(0xd92a52e2, 0x6d2383bd), - TOBN(0xfabccb59, 0xd7903546), TOBN(0x6111a761, 0x3d14b112), - TOBN(0x0ae584fe, 0xb3d5f612), TOBN(0x5ea69b8d, 0x60e828ec), - TOBN(0x6c078985, 0x54087030), TOBN(0x649cab04, 0xac4821fe), - TOBN(0x25ecedcf, 0x8bdce214), TOBN(0xb5622f72, 0x86af7361), - TOBN(0x0e1227aa, 0x7038b9e2), TOBN(0xd0efb273, 0xac20fa77), - TOBN(0x817ff88b, 0x79df975b), TOBN(0x856bf286, 0x1999503e), - TOBN(0xb4d5351f, 0x5038ec46), TOBN(0x740a52c5, 0xfc42af6e), - TOBN(0x2e38bb15, 0x2cbb1a3f), TOBN(0xc3eb99fe, 0x17a83429), - TOBN(0xca4fcbf1, 0xdd66bb74), TOBN(0x880784d6, 0xcde5e8fc), - TOBN(0xddc84c1c, 0xb4e7a0be), TOBN(0x8780510d, 0xbd15a72f), - TOBN(0x44bcf1af, 0x81ec30e1), TOBN(0x141e50a8, 0x0a61073e), - TOBN(0x0d955718, 0x47be87ae), TOBN(0x68a61417, 0xf76a4372), - TOBN(0xf57e7e87, 0xc607c3d3), TOBN(0x043afaf8, 0x5252f332), - TOBN(0xcc14e121, 0x1552a4d2), TOBN(0xb6dee692, 0xbb4d4ab4), - TOBN(0xb6ab74c8, 0xa03816a4), TOBN(0x84001ae4, 0x6f394a29), - TOBN(0x5bed8344, 0xd795fb45), TOBN(0x57326e7d, 0xb79f55a5), - TOBN(0xc9533ce0, 0x4accdffc), TOBN(0x53473caf, 0x3993fa04), - TOBN(0x7906eb93, 0xa13df4c8), TOBN(0xa73e51f6, 0x97cbe46f), - TOBN(0xd1ab3ae1, 0x0ae4ccf8), TOBN(0x25614508, 0x8a5b3dbc), - TOBN(0x61eff962, 0x11a71b27), TOBN(0xdf71412b, 0x6bb7fa39), - TOBN(0xb31ba6b8, 0x2bd7f3ef), TOBN(0xb0b9c415, 0x69180d29), - TOBN(0xeec14552, 0x014cdde5), TOBN(0x702c624b, 0x227b4bbb), - TOBN(0x2b15e8c2, 0xd3e988f3), TOBN(0xee3bcc6d, 0xa4f7fd04), - TOBN(0x9d00822a, 0x42ac6c85), TOBN(0x2db0cea6, 0x1df9f2b7), - TOBN(0xd7cad2ab, 0x42de1e58), TOBN(0x346ed526, 0x2d6fbb61), - TOBN(0xb3962995, 0x1a2faf09), TOBN(0x2fa8a580, 0x7c25612e), - TOBN(0x30ae04da, 0x7cf56490), TOBN(0x75662908, 0x0eea3961), - TOBN(0x3609f5c5, 0x3d080847), TOBN(0xcb081d39, 0x5241d4f6), - TOBN(0xb4fb3810, 0x77961a63), TOBN(0xc20c5984, 0x2abb66fc), - TOBN(0x3d40aa7c, 0xf902f245), TOBN(0x9cb12736, 0x4e536b1e), - TOBN(0x5eda24da, 0x99b3134f), TOBN(0xafbd9c69, 0x5cd011af), - TOBN(0x9a16e30a, 0xc7088c7d), TOBN(0x5ab65710, 0x3207389f), - TOBN(0x1b09547f, 0xe7407a53), TOBN(0x2322f9d7, 0x4fdc6eab), - TOBN(0xc0f2f22d, 0x7430de4d), TOBN(0x19382696, 0xe68ca9a9), - TOBN(0x17f1eff1, 0x918e5868), TOBN(0xe3b5b635, 0x586f4204), - TOBN(0x146ef980, 0x3fbc4341), TOBN(0x359f2c80, 0x5b5eed4e), - TOBN(0x9f35744e, 0x7482e41d), TOBN(0x9a9ac3ec, 0xf3b224c2), - TOBN(0x9161a6fe, 0x91fc50ae), TOBN(0x89ccc66b, 0xc613fa7c), - TOBN(0x89268b14, 0xc732f15a), TOBN(0x7cd6f4e2, 0xb467ed03), - TOBN(0xfbf79869, 0xce56b40e), TOBN(0xf93e094c, 0xc02dde98), - TOBN(0xefe0c3a8, 0xedee2cd7), TOBN(0x90f3ffc0, 0xb268fd42), - TOBN(0x81a7fd56, 0x08241aed), TOBN(0x95ab7ad8, 0x00b1afe8), - TOBN(0x40127056, 0x3e310d52), TOBN(0xd3ffdeb1, 0x09d9fc43), - TOBN(0xc8f85c91, 0xd11a8594), TOBN(0x2e74d258, 0x31cf6db8), - TOBN(0x829c7ca3, 0x02b5dfd0), TOBN(0xe389cfbe, 0x69143c86), - TOBN(0xd01b6405, 0x941768d8), TOBN(0x45103995, 0x03bf825d), - TOBN(0xcc4ee166, 0x56cd17e2), TOBN(0xbea3c283, 0xba037e79), - TOBN(0x4e1ac06e, 0xd9a47520), TOBN(0xfbfe18aa, 0xaf852404), - TOBN(0x5615f8e2, 0x8087648a), TOBN(0x7301e47e, 0xb9d150d9), - TOBN(0x79f9f9dd, 0xb299b977), TOBN(0x76697a7b, 0xa5b78314), - TOBN(0x10d67468, 0x7d7c90e7), TOBN(0x7afffe03, 0x937210b5), - TOBN(0x5aef3e4b, 0x28c22cee), TOBN(0xefb0ecd8, 0x09fd55ae), - TOBN(0x4cea7132, 0x0d2a5d6a), TOBN(0x9cfb5fa1, 0x01db6357), - TOBN(0x395e0b57, 0xf36e1ac5), TOBN(0x008fa9ad, 0x36cafb7d), - TOBN(0x8f6cdf70, 0x5308c4db), TOBN(0x51527a37, 0x95ed2477), - TOBN(0xba0dee30, 0x5bd21311), TOBN(0x6ed41b22, 0x909c90d7), - TOBN(0xc5f6b758, 0x7c8696d3), TOBN(0x0db8eaa8, 0x3ce83a80), - TOBN(0xd297fe37, 0xb24b4b6f), TOBN(0xfe58afe8, 0x522d1f0d), - TOBN(0x97358736, 0x8c98dbd9), TOBN(0x6bc226ca, 0x9454a527), - TOBN(0xa12b384e, 0xce53c2d0), TOBN(0x779d897d, 0x5e4606da), - TOBN(0xa53e47b0, 0x73ec12b0), TOBN(0x462dbbba, 0x5756f1ad), - TOBN(0x69fe09f2, 0xcafe37b6), TOBN(0x273d1ebf, 0xecce2e17), - TOBN(0x8ac1d538, 0x3cf607fd), TOBN(0x8035f7ff, 0x12e10c25)}, - {TOBN(0x854d34c7, 0x7e6c5520), TOBN(0xc27df9ef, 0xdcb9ea58), - TOBN(0x405f2369, 0xd686666d), TOBN(0x29d1febf, 0x0417aa85), - TOBN(0x9846819e, 0x93470afe), TOBN(0x3e6a9669, 0xe2a27f9e), - TOBN(0x24d008a2, 0xe31e6504), TOBN(0xdba7cecf, 0x9cb7680a), - TOBN(0xecaff541, 0x338d6e43), TOBN(0x56f7dd73, 0x4541d5cc), - TOBN(0xb5d426de, 0x96bc88ca), TOBN(0x48d94f6b, 0x9ed3a2c3), - TOBN(0x6354a3bb, 0x2ef8279c), TOBN(0xd575465b, 0x0b1867f2), - TOBN(0xef99b0ff, 0x95225151), TOBN(0xf3e19d88, 0xf94500d8), - TOBN(0x92a83268, 0xe32dd620), TOBN(0x913ec99f, 0x627849a2), - TOBN(0xedd8fdfa, 0x2c378882), TOBN(0xaf96f33e, 0xee6f8cfe), - TOBN(0xc06737e5, 0xdc3fa8a5), TOBN(0x236bb531, 0xb0b03a1d), - TOBN(0x33e59f29, 0x89f037b0), TOBN(0x13f9b5a7, 0xd9a12a53), - TOBN(0x0d0df6ce, 0x51efb310), TOBN(0xcb5b2eb4, 0x958df5be), - TOBN(0xd6459e29, 0x36158e59), TOBN(0x82aae2b9, 0x1466e336), - TOBN(0xfb658a39, 0x411aa636), TOBN(0x7152ecc5, 0xd4c0a933), - TOBN(0xf10c758a, 0x49f026b7), TOBN(0xf4837f97, 0xcb09311f), - TOBN(0xddfb02c4, 0xc753c45f), TOBN(0x18ca81b6, 0xf9c840fe), - TOBN(0x846fd09a, 0xb0f8a3e6), TOBN(0xb1162add, 0xe7733dbc), - TOBN(0x7070ad20, 0x236e3ab6), TOBN(0xf88cdaf5, 0xb2a56326), - TOBN(0x05fc8719, 0x997cbc7a), TOBN(0x442cd452, 0x4b665272), - TOBN(0x7807f364, 0xb71698f5), TOBN(0x6ba418d2, 0x9f7b605e), - TOBN(0xfd20b00f, 0xa03b2cbb), TOBN(0x883eca37, 0xda54386f), - TOBN(0xff0be43f, 0xf3437f24), TOBN(0xe910b432, 0xa48bb33c), - TOBN(0x4963a128, 0x329df765), TOBN(0xac1dd556, 0xbe2fe6f7), - TOBN(0x557610f9, 0x24a0a3fc), TOBN(0x38e17bf4, 0xe881c3f9), - TOBN(0x6ba84faf, 0xed0dac99), TOBN(0xd4a222c3, 0x59eeb918), - TOBN(0xc79c1dbe, 0x13f542b6), TOBN(0x1fc65e0d, 0xe425d457), - TOBN(0xeffb754f, 0x1debb779), TOBN(0x638d8fd0, 0x9e08af60), - TOBN(0x994f523a, 0x626332d5), TOBN(0x7bc38833, 0x5561bb44), - TOBN(0x005ed4b0, 0x3d845ea2), TOBN(0xd39d3ee1, 0xc2a1f08a), - TOBN(0x6561fdd3, 0xe7676b0d), TOBN(0x620e35ff, 0xfb706017), - TOBN(0x36ce424f, 0xf264f9a8), TOBN(0xc4c3419f, 0xda2681f7), - TOBN(0xfb6afd2f, 0x69beb6e8), TOBN(0x3a50b993, 0x6d700d03), - TOBN(0xc840b2ad, 0x0c83a14f), TOBN(0x573207be, 0x54085bef), - TOBN(0x5af882e3, 0x09fe7e5b), TOBN(0x957678a4, 0x3b40a7e1), - TOBN(0x172d4bdd, 0x543056e2), TOBN(0x9c1b26b4, 0x0df13c0a), - TOBN(0x1c30861c, 0xf405ff06), TOBN(0xebac86bd, 0x486e828b), - TOBN(0xe791a971, 0x636933fc), TOBN(0x50e7c2be, 0x7aeee947), - TOBN(0xc3d4a095, 0xfa90d767), TOBN(0xae60eb7b, 0xe670ab7b), - TOBN(0x17633a64, 0x397b056d), TOBN(0x93a21f33, 0x105012aa), - TOBN(0x663c370b, 0xabb88643), TOBN(0x91df36d7, 0x22e21599), - TOBN(0x183ba835, 0x8b761671), TOBN(0x381eea1d, 0x728f3bf1), - TOBN(0xb9b2f1ba, 0x39966e6c), TOBN(0x7c464a28, 0xe7295492), - TOBN(0x0fd5f70a, 0x09b26b7f), TOBN(0xa9aba1f9, 0xfbe009df), - TOBN(0x857c1f22, 0x369b87ad), TOBN(0x3c00e5d9, 0x32fca556), - TOBN(0x1ad74cab, 0x90b06466), TOBN(0xa7112386, 0x550faaf2), - TOBN(0x7435e198, 0x6d9bd5f5), TOBN(0x2dcc7e38, 0x59c3463f), - TOBN(0xdc7df748, 0xca7bd4b2), TOBN(0x13cd4c08, 0x9dec2f31), - TOBN(0x0d3b5df8, 0xe3237710), TOBN(0x0dadb26e, 0xcbd2f7b0), - TOBN(0x9f5966ab, 0xe4aa082b), TOBN(0x666ec8de, 0x350e966e), - TOBN(0x1bfd1ed5, 0xee524216), TOBN(0xcd93c59b, 0x41dab0b6), - TOBN(0x658a8435, 0xd186d6ba), TOBN(0x1b7d34d2, 0x159d1195), - TOBN(0x5936e460, 0x22caf46b), TOBN(0x6a45dd8f, 0x9a96fe4f), - TOBN(0xf7925434, 0xb98f474e), TOBN(0x41410412, 0x0053ef15), - TOBN(0x71cf8d12, 0x41de97bf), TOBN(0xb8547b61, 0xbd80bef4), - TOBN(0xb47d3970, 0xc4db0037), TOBN(0xf1bcd328, 0xfef20dff), - TOBN(0x31a92e09, 0x10caad67), TOBN(0x1f591960, 0x5531a1e1), - TOBN(0x3bb852e0, 0x5f4fc840), TOBN(0x63e297ca, 0x93a72c6c), - TOBN(0x3c2b0b2e, 0x49abad67), TOBN(0x6ec405fc, 0xed3db0d9), - TOBN(0xdc14a530, 0x7fef1d40), TOBN(0xccd19846, 0x280896fc), - TOBN(0x00f83176, 0x9bb81648), TOBN(0xd69eb485, 0x653120d0), - TOBN(0xd17d75f4, 0x4ccabc62), TOBN(0x34a07f82, 0xb749fcb1), - TOBN(0x2c3af787, 0xbbfb5554), TOBN(0xb06ed4d0, 0x62e283f8), - TOBN(0x5722889f, 0xa19213a0), TOBN(0x162b085e, 0xdcf3c7b4), - TOBN(0xbcaecb31, 0xe0dd3eca), TOBN(0xc6237fbc, 0xe52f13a5), - TOBN(0xcc2b6b03, 0x27bac297), TOBN(0x2ae1cac5, 0xb917f54a), - TOBN(0x474807d4, 0x7845ae4f), TOBN(0xfec7dd92, 0xce5972e0), - TOBN(0xc3bd2541, 0x1d7915bb), TOBN(0x66f85dc4, 0xd94907ca), - TOBN(0xd981b888, 0xbdbcf0ca), TOBN(0xd75f5da6, 0xdf279e9f), - TOBN(0x128bbf24, 0x7054e934), TOBN(0x3c6ff6e5, 0x81db134b), - TOBN(0x795b7cf4, 0x047d26e4), TOBN(0xf370f7b8, 0x5049ec37), - TOBN(0xc6712d4d, 0xced945af), TOBN(0xdf30b5ec, 0x095642bc), - TOBN(0x9b034c62, 0x4896246e), TOBN(0x5652c016, 0xee90bbd1), - TOBN(0xeb38636f, 0x87fedb73), TOBN(0x5e32f847, 0x0135a613), - TOBN(0x0703b312, 0xcf933c83), TOBN(0xd05bb76e, 0x1a7f47e6), - TOBN(0x825e4f0c, 0x949c2415), TOBN(0x569e5622, 0x7250d6f8), - TOBN(0xbbe9eb3a, 0x6568013e), TOBN(0x8dbd203f, 0x22f243fc), - TOBN(0x9dbd7694, 0xb342734a), TOBN(0x8f6d12f8, 0x46afa984), - TOBN(0xb98610a2, 0xc9eade29), TOBN(0xbab4f323, 0x47dd0f18), - TOBN(0x5779737b, 0x671c0d46), TOBN(0x10b6a7c6, 0xd3e0a42a), - TOBN(0xfb19ddf3, 0x3035b41c), TOBN(0xd336343f, 0x99c45895), - TOBN(0x61fe4938, 0x54c857e5), TOBN(0xc4d506be, 0xae4e57d5), - TOBN(0x3cd8c8cb, 0xbbc33f75), TOBN(0x7281f08a, 0x9262c77d), - TOBN(0x083f4ea6, 0xf11a2823), TOBN(0x8895041e, 0x9fba2e33), - TOBN(0xfcdfea49, 0x9c438edf), TOBN(0x7678dcc3, 0x91edba44), - TOBN(0xf07b3b87, 0xe2ba50f0), TOBN(0xc13888ef, 0x43948c1b), - TOBN(0xc2135ad4, 0x1140af42), TOBN(0x8e5104f3, 0x926ed1a7), - TOBN(0xf24430cb, 0x88f6695f), TOBN(0x0ce0637b, 0x6d73c120), - TOBN(0xb2db01e6, 0xfe631e8f), TOBN(0x1c5563d7, 0xd7bdd24b), - TOBN(0x8daea3ba, 0x369ad44f), TOBN(0x000c81b6, 0x8187a9f9), - TOBN(0x5f48a951, 0xaae1fd9a), TOBN(0xe35626c7, 0x8d5aed8a), - TOBN(0x20952763, 0x0498c622), TOBN(0x76d17634, 0x773aa504), - TOBN(0x36d90dda, 0xeb300f7a), TOBN(0x9dcf7dfc, 0xedb5e801), - TOBN(0x645cb268, 0x74d5244c), TOBN(0xa127ee79, 0x348e3aa2), - TOBN(0x488acc53, 0x575f1dbb), TOBN(0x95037e85, 0x80e6161e), - TOBN(0x57e59283, 0x292650d0), TOBN(0xabe67d99, 0x14938216), - TOBN(0x3c7f944b, 0x3f8e1065), TOBN(0xed908cb6, 0x330e8924), - TOBN(0x08ee8fd5, 0x6f530136), TOBN(0x2227b7d5, 0xd7ffc169), - TOBN(0x4f55c893, 0xb5cd6dd5), TOBN(0x82225e11, 0xa62796e8), - TOBN(0x5c6cead1, 0xcb18e12c), TOBN(0x4381ae0c, 0x84f5a51a), - TOBN(0x345913d3, 0x7fafa4c8), TOBN(0x3d918082, 0x0491aac0), - TOBN(0x9347871f, 0x3e69264c), TOBN(0xbea9dd3c, 0xb4f4f0cd), - TOBN(0xbda5d067, 0x3eadd3e7), TOBN(0x0033c1b8, 0x0573bcd8), - TOBN(0x25589379, 0x5da2486c), TOBN(0xcb89ee5b, 0x86abbee7), - TOBN(0x8fe0a8f3, 0x22532e5d), TOBN(0xb6410ff0, 0x727dfc4c), - TOBN(0x619b9d58, 0x226726db), TOBN(0x5ec25669, 0x7a2b2dc7), - TOBN(0xaf4d2e06, 0x4c3beb01), TOBN(0x852123d0, 0x7acea556), - TOBN(0x0e9470fa, 0xf783487a), TOBN(0x75a7ea04, 0x5664b3eb), - TOBN(0x4ad78f35, 0x6798e4ba), TOBN(0x9214e6e5, 0xc7d0e091), - TOBN(0xc420b488, 0xb1290403), TOBN(0x64049e0a, 0xfc295749), - TOBN(0x03ef5af1, 0x3ae9841f), TOBN(0xdbe4ca19, 0xb0b662a6), - TOBN(0x46845c5f, 0xfa453458), TOBN(0xf8dabf19, 0x10b66722), - TOBN(0xb650f0aa, 0xcce2793b), TOBN(0x71db851e, 0xc5ec47c1), - TOBN(0x3eb78f3e, 0x3b234fa9), TOBN(0xb0c60f35, 0xfc0106ce), - TOBN(0x05427121, 0x774eadbd), TOBN(0x25367faf, 0xce323863), - TOBN(0x7541b5c9, 0xcd086976), TOBN(0x4ff069e2, 0xdc507ad1), - TOBN(0x74145256, 0x8776e667), TOBN(0x6e76142c, 0xb23c6bb5), - TOBN(0xdbf30712, 0x1b3a8a87), TOBN(0x60e7363e, 0x98450836), - TOBN(0x5741450e, 0xb7366d80), TOBN(0xe4ee14ca, 0x4837dbdf), - TOBN(0xa765eb9b, 0x69d4316f), TOBN(0x04548dca, 0x8ef43825), - TOBN(0x9c9f4e4c, 0x5ae888eb), TOBN(0x733abb51, 0x56e9ac99), - TOBN(0xdaad3c20, 0xba6ac029), TOBN(0x9b8dd3d3, 0x2ba3e38e), - TOBN(0xa9bb4c92, 0x0bc5d11a), TOBN(0xf20127a7, 0x9c5f88a3), - TOBN(0x4f52b06e, 0x161d3cb8), TOBN(0x26c1ff09, 0x6afaf0a6), - TOBN(0x32670d2f, 0x7189e71f), TOBN(0xc6438748, 0x5ecf91e7), - TOBN(0x15758e57, 0xdb757a21), TOBN(0x427d09f8, 0x290a9ce5), - TOBN(0x846a308f, 0x38384a7a), TOBN(0xaac3acb4, 0xb0732b99), - TOBN(0x9e941009, 0x17845819), TOBN(0x95cba111, 0xa7ce5e03), - TOBN(0x6f3d4f7f, 0xb00009c4), TOBN(0xb8396c27, 0x8ff28b5f), - TOBN(0xb1a9ae43, 0x1c97975d), TOBN(0x9d7ba8af, 0xe5d9fed5), - TOBN(0x338cf09f, 0x34f485b6), TOBN(0xbc0ddacc, 0x64122516), - TOBN(0xa450da12, 0x05d471fe), TOBN(0x4c3a6250, 0x628dd8c9), - TOBN(0x69c7d103, 0xd1295837), TOBN(0xa2893e50, 0x3807eb2f), - TOBN(0xd6e1e1de, 0xbdb41491), TOBN(0xc630745b, 0x5e138235), - TOBN(0xc892109e, 0x48661ae1), TOBN(0x8d17e7eb, 0xea2b2674), - TOBN(0x00ec0f87, 0xc328d6b5), TOBN(0x6d858645, 0xf079ff9e), - TOBN(0x6cdf243e, 0x19115ead), TOBN(0x1ce1393e, 0x4bac4fcf), - TOBN(0x2c960ed0, 0x9c29f25b), TOBN(0x59be4d8e, 0x9d388a05), - TOBN(0x0d46e06c, 0xd0def72b), TOBN(0xb923db5d, 0xe0342748), - TOBN(0xf7d3aacd, 0x936d4a3d), TOBN(0x558519cc, 0x0b0b099e), - TOBN(0x3ea8ebf8, 0x827097ef), TOBN(0x259353db, 0xd054f55d), - TOBN(0x84c89abc, 0x6d2ed089), TOBN(0x5c548b69, 0x8e096a7c), - TOBN(0xd587f616, 0x994b995d), TOBN(0x4d1531f6, 0xa5845601), - TOBN(0x792ab31e, 0x451fd9f0), TOBN(0xc8b57bb2, 0x65adf6ca), - TOBN(0x68440fcb, 0x1cd5ad73), TOBN(0xb9c860e6, 0x6144da4f), - TOBN(0x2ab286aa, 0x8462beb8), TOBN(0xcc6b8fff, 0xef46797f), - TOBN(0xac820da4, 0x20c8a471), TOBN(0x69ae05a1, 0x77ff7faf), - TOBN(0xb9163f39, 0xbfb5da77), TOBN(0xbd03e590, 0x2c73ab7a), - TOBN(0x7e862b5e, 0xb2940d9e), TOBN(0x3c663d86, 0x4b9af564), - TOBN(0xd8309031, 0xbde3033d), TOBN(0x298231b2, 0xd42c5bc6), - TOBN(0x42090d2c, 0x552ad093), TOBN(0xa4799d1c, 0xff854695), - TOBN(0x0a88b5d6, 0xd31f0d00), TOBN(0xf8b40825, 0xa2f26b46), - TOBN(0xec29b1ed, 0xf1bd7218), TOBN(0xd491c53b, 0x4b24c86e), - TOBN(0xd2fe588f, 0x3395ea65), TOBN(0x6f3764f7, 0x4456ef15), - TOBN(0xdb43116d, 0xcdc34800), TOBN(0xcdbcd456, 0xc1e33955), - TOBN(0xefdb5540, 0x74ab286b), TOBN(0x948c7a51, 0xd18c5d7c), - TOBN(0xeb81aa37, 0x7378058e), TOBN(0x41c746a1, 0x04411154), - TOBN(0xa10c73bc, 0xfb828ac7), TOBN(0x6439be91, 0x9d972b29), - TOBN(0x4bf3b4b0, 0x43a2fbad), TOBN(0x39e6dadf, 0x82b5e840), - TOBN(0x4f716408, 0x6397bd4c), TOBN(0x0f7de568, 0x7f1eeccb), - TOBN(0x5865c5a1, 0xd2ffbfc1), TOBN(0xf74211fa, 0x4ccb6451), - TOBN(0x66368a88, 0xc0b32558), TOBN(0x5b539dc2, 0x9ad7812e), - TOBN(0x579483d0, 0x2f3af6f6), TOBN(0x52132078, 0x99934ece), - TOBN(0x50b9650f, 0xdcc9e983), TOBN(0xca989ec9, 0xaee42b8a), - TOBN(0x6a44c829, 0xd6f62f99), TOBN(0x8f06a309, 0x4c2a7c0c), - TOBN(0x4ea2b3a0, 0x98a0cb0a), TOBN(0x5c547b70, 0xbeee8364), - TOBN(0x461d40e1, 0x682afe11), TOBN(0x9e0fc77a, 0x7b41c0a8), - TOBN(0x79e4aefd, 0xe20d5d36), TOBN(0x2916e520, 0x32dd9f63), - TOBN(0xf59e52e8, 0x3f883faf), TOBN(0x396f9639, 0x2b868d35), - TOBN(0xc902a9df, 0x4ca19881), TOBN(0x0fc96822, 0xdb2401a6), - TOBN(0x41237587, 0x66f1c68d), TOBN(0x10fc6de3, 0xfb476c0d), - TOBN(0xf8b6b579, 0x841f5d90), TOBN(0x2ba8446c, 0xfa24f44a), - TOBN(0xa237b920, 0xef4a9975), TOBN(0x60bb6004, 0x2330435f), - TOBN(0xd6f4ab5a, 0xcfb7e7b5), TOBN(0xb2ac5097, 0x83435391), - TOBN(0xf036ee2f, 0xb0d1ea67), TOBN(0xae779a6a, 0x74c56230), - TOBN(0x59bff8c8, 0xab838ae6), TOBN(0xcd83ca99, 0x9b38e6f0), - TOBN(0xbb27bef5, 0xe33deed3), TOBN(0xe6356f6f, 0x001892a8), - TOBN(0xbf3be6cc, 0x7adfbd3e), TOBN(0xaecbc81c, 0x33d1ac9d), - TOBN(0xe4feb909, 0xe6e861dc), TOBN(0x90a247a4, 0x53f5f801), - TOBN(0x01c50acb, 0x27346e57), TOBN(0xce29242e, 0x461acc1b), - TOBN(0x04dd214a, 0x2f998a91), TOBN(0x271ee9b1, 0xd4baf27b), - TOBN(0x7e3027d1, 0xe8c26722), TOBN(0x21d1645c, 0x1820dce5), - TOBN(0x086f242c, 0x7501779c), TOBN(0xf0061407, 0xfa0e8009), - TOBN(0xf23ce477, 0x60187129), TOBN(0x05bbdedb, 0x0fde9bd0), - TOBN(0x682f4832, 0x25d98473), TOBN(0xf207fe85, 0x5c658427), - TOBN(0xb6fdd7ba, 0x4166ffa1), TOBN(0x0c314056, 0x9eed799d), - TOBN(0x0db8048f, 0x4107e28f), TOBN(0x74ed3871, 0x41216840), - TOBN(0x74489f8f, 0x56a3c06e), TOBN(0x1e1c005b, 0x12777134), - TOBN(0xdb332a73, 0xf37ec3c3), TOBN(0xc65259bd, 0xdd59eba0), - TOBN(0x2291709c, 0xdb4d3257), TOBN(0x9a793b25, 0xbd389390), - TOBN(0xf39fe34b, 0xe43756f0), TOBN(0x2f76bdce, 0x9afb56c9), - TOBN(0x9f37867a, 0x61208b27), TOBN(0xea1d4307, 0x089972c3), - TOBN(0x8c595330, 0x8bdf623a), TOBN(0x5f5accda, 0x8441fb7d), - TOBN(0xfafa9418, 0x32ddfd95), TOBN(0x6ad40c5a, 0x0fde9be7), - TOBN(0x43faba89, 0xaeca8709), TOBN(0xc64a7cf1, 0x2c248a9d), - TOBN(0x16620252, 0x72637a76), TOBN(0xaee1c791, 0x22b8d1bb), - TOBN(0xf0f798fd, 0x21a843b2), TOBN(0x56e4ed4d, 0x8d005cb1), - TOBN(0x355f7780, 0x1f0d8abe), TOBN(0x197b04cf, 0x34522326), - TOBN(0x41f9b31f, 0xfd42c13f), TOBN(0x5ef7feb2, 0xb40f933d), - TOBN(0x27326f42, 0x5d60bad4), TOBN(0x027ecdb2, 0x8c92cf89), - TOBN(0x04aae4d1, 0x4e3352fe), TOBN(0x08414d2f, 0x73591b90), - TOBN(0x5ed6124e, 0xb7da7d60), TOBN(0xb985b931, 0x4d13d4ec), - TOBN(0xa592d3ab, 0x96bf36f9), TOBN(0x012dbed5, 0xbbdf51df), - TOBN(0xa57963c0, 0xdf6c177d), TOBN(0x010ec869, 0x87ca29cf), - TOBN(0xba1700f6, 0xbf926dff), TOBN(0x7c9fdbd1, 0xf4bf6bc2), - TOBN(0xdc18dc8f, 0x64da11f5), TOBN(0xa6074b7a, 0xd938ae75), - TOBN(0x14270066, 0xe84f44a4), TOBN(0x99998d38, 0xd27b954e), - TOBN(0xc1be8ab2, 0xb4f38e9a), TOBN(0x8bb55bbf, 0x15c01016), - TOBN(0xf73472b4, 0x0ea2ab30), TOBN(0xd365a340, 0xf73d68dd), - TOBN(0xc01a7168, 0x19c2e1eb), TOBN(0x32f49e37, 0x34061719), - TOBN(0xb73c57f1, 0x01d8b4d6), TOBN(0x03c8423c, 0x26b47700), - TOBN(0x321d0bc8, 0xa4d8826a), TOBN(0x6004213c, 0x4bc0e638), - TOBN(0xf78c64a1, 0xc1c06681), TOBN(0x16e0a16f, 0xef018e50), - TOBN(0x31cbdf91, 0xdb42b2b3), TOBN(0xf8f4ffce, 0xe0d36f58), - TOBN(0xcdcc71cd, 0x4cc5e3e0), TOBN(0xd55c7cfa, 0xa129e3e0), - TOBN(0xccdb6ba0, 0x0fb2cbf1), TOBN(0x6aba0005, 0xc4bce3cb), - TOBN(0x501cdb30, 0xd232cfc4), TOBN(0x9ddcf12e, 0xd58a3cef), - TOBN(0x02d2cf9c, 0x87e09149), TOBN(0xdc5d7ec7, 0x2c976257), - TOBN(0x6447986e, 0x0b50d7dd), TOBN(0x88fdbaf7, 0x807f112a), - TOBN(0x58c9822a, 0xb00ae9f6), TOBN(0x6abfb950, 0x6d3d27e0), - TOBN(0xd0a74487, 0x8a429f4f), TOBN(0x0649712b, 0xdb516609), - TOBN(0xb826ba57, 0xe769b5df), TOBN(0x82335df2, 0x1fc7aaf2), - TOBN(0x2389f067, 0x5c93d995), TOBN(0x59ac367a, 0x68677be6), - TOBN(0xa77985ff, 0x21d9951b), TOBN(0x038956fb, 0x85011cce), - TOBN(0x608e48cb, 0xbb734e37), TOBN(0xc08c0bf2, 0x2be5b26f), - TOBN(0x17bbdd3b, 0xf9b1a0d9), TOBN(0xeac7d898, 0x10483319), - TOBN(0xc95c4baf, 0xbc1a6dea), TOBN(0xfdd0e2bf, 0x172aafdb), - TOBN(0x40373cbc, 0x8235c41a), TOBN(0x14303f21, 0xfb6f41d5), - TOBN(0xba063621, 0x0408f237), TOBN(0xcad3b09a, 0xecd2d1ed), - TOBN(0x4667855a, 0x52abb6a2), TOBN(0xba9157dc, 0xaa8b417b), - TOBN(0xfe7f3507, 0x4f013efb), TOBN(0x1b112c4b, 0xaa38c4a2), - TOBN(0xa1406a60, 0x9ba64345), TOBN(0xe53cba33, 0x6993c80b), - TOBN(0x45466063, 0xded40d23), TOBN(0x3d5f1f4d, 0x54908e25), - TOBN(0x9ebefe62, 0x403c3c31), TOBN(0x274ea0b5, 0x0672a624), - TOBN(0xff818d99, 0x451d1b71), TOBN(0x80e82643, 0x8f79cf79), - TOBN(0xa165df13, 0x73ce37f5), TOBN(0xa744ef4f, 0xfe3a21fd), - TOBN(0x73f1e7f5, 0xcf551396), TOBN(0xc616898e, 0x868c676b), - TOBN(0x671c28c7, 0x8c442c36), TOBN(0xcfe5e558, 0x5e0a317d), - TOBN(0x1242d818, 0x7051f476), TOBN(0x56fad2a6, 0x14f03442), - TOBN(0x262068bc, 0x0a44d0f6), TOBN(0xdfa2cd6e, 0xce6edf4e), - TOBN(0x0f43813a, 0xd15d1517), TOBN(0x61214cb2, 0x377d44f5), - TOBN(0xd399aa29, 0xc639b35f), TOBN(0x42136d71, 0x54c51c19), - TOBN(0x9774711b, 0x08417221), TOBN(0x0a5546b3, 0x52545a57), - TOBN(0x80624c41, 0x1150582d), TOBN(0x9ec5c418, 0xfbc555bc), - TOBN(0x2c87dcad, 0x771849f1), TOBN(0xb0c932c5, 0x01d7bf6f), - TOBN(0x6aa5cd3e, 0x89116eb2), TOBN(0xd378c25a, 0x51ca7bd3), - TOBN(0xc612a0da, 0x9e6e3e31), TOBN(0x0417a54d, 0xb68ad5d0), - TOBN(0x00451e4a, 0x22c6edb8), TOBN(0x9fbfe019, 0xb42827ce), - TOBN(0x2fa92505, 0xba9384a2), TOBN(0x21b8596e, 0x64ad69c1), - TOBN(0x8f4fcc49, 0x983b35a6), TOBN(0xde093760, 0x72754672), - TOBN(0x2f14ccc8, 0xf7bffe6d), TOBN(0x27566bff, 0x5d94263d), - TOBN(0xb5b4e9c6, 0x2df3ec30), TOBN(0x94f1d7d5, 0x3e6ea6ba), - TOBN(0x97b7851a, 0xaaca5e9b), TOBN(0x518aa521, 0x56713b97), - TOBN(0x3357e8c7, 0x150a61f6), TOBN(0x7842e7e2, 0xec2c2b69), - TOBN(0x8dffaf65, 0x6868a548), TOBN(0xd963bd82, 0xe068fc81), - TOBN(0x64da5c8b, 0x65917733), TOBN(0x927090ff, 0x7b247328)}, - {TOBN(0x214bc9a7, 0xd298c241), TOBN(0xe3b697ba, 0x56807cfd), - TOBN(0xef1c7802, 0x4564eadb), TOBN(0xdde8cdcf, 0xb48149c5), - TOBN(0x946bf0a7, 0x5a4d2604), TOBN(0x27154d7f, 0x6c1538af), - TOBN(0x95cc9230, 0xde5b1fcc), TOBN(0xd88519e9, 0x66864f82), - TOBN(0xb828dd1a, 0x7cb1282c), TOBN(0xa08d7626, 0xbe46973a), - TOBN(0x6baf8d40, 0xe708d6b2), TOBN(0x72571fa1, 0x4daeb3f3), - TOBN(0x85b1732f, 0xf22dfd98), TOBN(0x87ab01a7, 0x0087108d), - TOBN(0xaaaafea8, 0x5988207a), TOBN(0xccc832f8, 0x69f00755), - TOBN(0x964d950e, 0x36ff3bf0), TOBN(0x8ad20f6f, 0xf0b34638), - TOBN(0x4d9177b3, 0xb5d7585f), TOBN(0xcf839760, 0xef3f019f), - TOBN(0x582fc5b3, 0x8288c545), TOBN(0x2f8e4e9b, 0x13116bd1), - TOBN(0xf91e1b2f, 0x332120ef), TOBN(0xcf568724, 0x2a17dd23), - TOBN(0x488f1185, 0xca8d9d1a), TOBN(0xadf2c77d, 0xd987ded2), - TOBN(0x5f3039f0, 0x60c46124), TOBN(0xe5d70b75, 0x71e095f4), - TOBN(0x82d58650, 0x6260e70f), TOBN(0x39d75ea7, 0xf750d105), - TOBN(0x8cf3d0b1, 0x75bac364), TOBN(0xf3a7564d, 0x21d01329), - TOBN(0x182f04cd, 0x2f52d2a7), TOBN(0x4fde149a, 0xe2df565a), - TOBN(0xb80c5eec, 0xa79fb2f7), TOBN(0xab491d7b, 0x22ddc897), - TOBN(0x99d76c18, 0xc6312c7f), TOBN(0xca0d5f3d, 0x6aa41a57), - TOBN(0x71207325, 0xd15363a0), TOBN(0xe82aa265, 0xbeb252c2), - TOBN(0x94ab4700, 0xec3128c2), TOBN(0x6c76d862, 0x8e383f49), - TOBN(0xdc36b150, 0xc03024eb), TOBN(0xfb439477, 0x53daac69), - TOBN(0xfc68764a, 0x8dc79623), TOBN(0x5b86995d, 0xb440fbb2), - TOBN(0xd66879bf, 0xccc5ee0d), TOBN(0x05228942, 0x95aa8bd3), - TOBN(0xb51a40a5, 0x1e6a75c1), TOBN(0x24327c76, 0x0ea7d817), - TOBN(0x06630182, 0x07774597), TOBN(0xd6fdbec3, 0x97fa7164), - TOBN(0x20c99dfb, 0x13c90f48), TOBN(0xd6ac5273, 0x686ef263), - TOBN(0xc6a50bdc, 0xfef64eeb), TOBN(0xcd87b281, 0x86fdfc32), - TOBN(0xb24aa43e, 0x3fcd3efc), TOBN(0xdd26c034, 0xb8088e9a), - TOBN(0xa5ef4dc9, 0xbd3d46ea), TOBN(0xa2f99d58, 0x8a4c6a6f), - TOBN(0xddabd355, 0x2f1da46c), TOBN(0x72c3f8ce, 0x1afacdd1), - TOBN(0xd90c4eee, 0x92d40578), TOBN(0xd28bb41f, 0xca623b94), - TOBN(0x50fc0711, 0x745edc11), TOBN(0x9dd9ad7d, 0x3dc87558), - TOBN(0xce6931fb, 0xb49d1e64), TOBN(0x6c77a0a2, 0xc98bd0f9), - TOBN(0x62b9a629, 0x6baf7cb1), TOBN(0xcf065f91, 0xccf72d22), - TOBN(0x7203cce9, 0x79639071), TOBN(0x09ae4885, 0xf9cb732f), - TOBN(0x5e7c3bec, 0xee8314f3), TOBN(0x1c068aed, 0xdbea298f), - TOBN(0x08d381f1, 0x7c80acec), TOBN(0x03b56be8, 0xe330495b), - TOBN(0xaeffb8f2, 0x9222882d), TOBN(0x95ff38f6, 0xc4af8bf7), - TOBN(0x50e32d35, 0x1fc57d8c), TOBN(0x6635be52, 0x17b444f0), - TOBN(0x04d15276, 0xa5177900), TOBN(0x4e1dbb47, 0xf6858752), - TOBN(0x5b475622, 0xc615796c), TOBN(0xa6fa0387, 0x691867bf), - TOBN(0xed7f5d56, 0x2844c6d0), TOBN(0xc633cf9b, 0x03a2477d), - TOBN(0xf6be5c40, 0x2d3721d6), TOBN(0xaf312eb7, 0xe9fd68e6), - TOBN(0x242792d2, 0xe7417ce1), TOBN(0xff42bc71, 0x970ee7f5), - TOBN(0x1ff4dc6d, 0x5c67a41e), TOBN(0x77709b7b, 0x20882a58), - TOBN(0x3554731d, 0xbe217f2c), TOBN(0x2af2a8cd, 0x5bb72177), - TOBN(0x58eee769, 0x591dd059), TOBN(0xbb2930c9, 0x4bba6477), - TOBN(0x863ee047, 0x7d930cfc), TOBN(0x4c262ad1, 0x396fd1f4), - TOBN(0xf4765bc8, 0x039af7e1), TOBN(0x2519834b, 0x5ba104f6), - TOBN(0x7cd61b4c, 0xd105f961), TOBN(0xa5415da5, 0xd63bca54), - TOBN(0x778280a0, 0x88a1f17c), TOBN(0xc4968949, 0x2329512c), - TOBN(0x174a9126, 0xcecdaa7a), TOBN(0xfc8c7e0e, 0x0b13247b), - TOBN(0x29c110d2, 0x3484c1c4), TOBN(0xf8eb8757, 0x831dfc3b), - TOBN(0x022f0212, 0xc0067452), TOBN(0x3f6f69ee, 0x7b9b926c), - TOBN(0x09032da0, 0xef42daf4), TOBN(0x79f00ade, 0x83f80de4), - TOBN(0x6210db71, 0x81236c97), TOBN(0x74f7685b, 0x3ee0781f), - TOBN(0x4df7da7b, 0xa3e41372), TOBN(0x2aae38b1, 0xb1a1553e), - TOBN(0x1688e222, 0xf6dd9d1b), TOBN(0x57695448, 0x5b8b6487), - TOBN(0x478d2127, 0x4b2edeaa), TOBN(0xb2818fa5, 0x1e85956a), - TOBN(0x1e6addda, 0xf176f2c0), TOBN(0x01ca4604, 0xe2572658), - TOBN(0x0a404ded, 0x85342ffb), TOBN(0x8cf60f96, 0x441838d6), - TOBN(0x9bbc691c, 0xc9071c4a), TOBN(0xfd588744, 0x34442803), - TOBN(0x97101c85, 0x809c0d81), TOBN(0xa7fb754c, 0x8c456f7f), - TOBN(0xc95f3c5c, 0xd51805e1), TOBN(0xab4ccd39, 0xb299dca8), - TOBN(0x3e03d20b, 0x47eaf500), TOBN(0xfa3165c1, 0xd7b80893), - TOBN(0x005e8b54, 0xe160e552), TOBN(0xdc4972ba, 0x9019d11f), - TOBN(0x21a6972e, 0x0c9a4a7a), TOBN(0xa52c258f, 0x37840fd7), - TOBN(0xf8559ff4, 0xc1e99d81), TOBN(0x08e1a7d6, 0xa3c617c0), - TOBN(0xb398fd43, 0x248c6ba7), TOBN(0x6ffedd91, 0xd1283794), - TOBN(0x8a6a59d2, 0xd629d208), TOBN(0xa9d141d5, 0x3490530e), - TOBN(0x42f6fc18, 0x38505989), TOBN(0x09bf250d, 0x479d94ee), - TOBN(0x223ad3b1, 0xb3822790), TOBN(0x6c5926c0, 0x93b8971c), - TOBN(0x609efc7e, 0x75f7fa62), TOBN(0x45d66a6d, 0x1ec2d989), - TOBN(0x4422d663, 0x987d2792), TOBN(0x4a73caad, 0x3eb31d2b), - TOBN(0xf06c2ac1, 0xa32cb9e6), TOBN(0xd9445c5f, 0x91aeba84), - TOBN(0x6af7a1d5, 0xaf71013f), TOBN(0xe68216e5, 0x0bedc946), - TOBN(0xf4cba30b, 0xd27370a0), TOBN(0x7981afbf, 0x870421cc), - TOBN(0x02496a67, 0x9449f0e1), TOBN(0x86cfc4be, 0x0a47edae), - TOBN(0x3073c936, 0xb1feca22), TOBN(0xf5694612, 0x03f8f8fb), - TOBN(0xd063b723, 0x901515ea), TOBN(0x4c6c77a5, 0x749cf038), - TOBN(0x6361e360, 0xab9e5059), TOBN(0x596cf171, 0xa76a37c0), - TOBN(0x800f53fa, 0x6530ae7a), TOBN(0x0f5e631e, 0x0792a7a6), - TOBN(0x5cc29c24, 0xefdb81c9), TOBN(0xa269e868, 0x3f9c40ba), - TOBN(0xec14f9e1, 0x2cb7191e), TOBN(0x78ea1bd8, 0xe5b08ea6), - TOBN(0x3c65aa9b, 0x46332bb9), TOBN(0x84cc22b3, 0xbf80ce25), - TOBN(0x0098e9e9, 0xd49d5bf1), TOBN(0xcd4ec1c6, 0x19087da4), - TOBN(0x3c9d07c5, 0xaef6e357), TOBN(0x839a0268, 0x9f8f64b8), - TOBN(0xc5e9eb62, 0xc6d8607f), TOBN(0x759689f5, 0x6aa995e4), - TOBN(0x70464669, 0xbbb48317), TOBN(0x921474bf, 0xe402417d), - TOBN(0xcabe135b, 0x2a354c8c), TOBN(0xd51e52d2, 0x812fa4b5), - TOBN(0xec741096, 0x53311fe8), TOBN(0x4f774535, 0xb864514b), - TOBN(0xbcadd671, 0x5bde48f8), TOBN(0xc9703873, 0x2189bc7d), - TOBN(0x5d45299e, 0xc709ee8a), TOBN(0xd1287ee2, 0x845aaff8), - TOBN(0x7d1f8874, 0xdb1dbf1f), TOBN(0xea46588b, 0x990c88d6), - TOBN(0x60ba649a, 0x84368313), TOBN(0xd5fdcbce, 0x60d543ae), - TOBN(0x90b46d43, 0x810d5ab0), TOBN(0x6739d8f9, 0x04d7e5cc), - TOBN(0x021c1a58, 0x0d337c33), TOBN(0x00a61162, 0x68e67c40), - TOBN(0x95ef413b, 0x379f0a1f), TOBN(0xfe126605, 0xe9e2ab95), - TOBN(0x67578b85, 0x2f5f199c), TOBN(0xf5c00329, 0x2cb84913), - TOBN(0xf7956430, 0x37577dd8), TOBN(0x83b82af4, 0x29c5fe88), - TOBN(0x9c1bea26, 0xcdbdc132), TOBN(0x589fa086, 0x9c04339e), - TOBN(0x033e9538, 0xb13799df), TOBN(0x85fa8b21, 0xd295d034), - TOBN(0xdf17f73f, 0xbd9ddcca), TOBN(0xf32bd122, 0xddb66334), - TOBN(0x55ef88a7, 0x858b044c), TOBN(0x1f0d69c2, 0x5aa9e397), - TOBN(0x55fd9cc3, 0x40d85559), TOBN(0xc774df72, 0x7785ddb2), - TOBN(0x5dcce9f6, 0xd3bd2e1c), TOBN(0xeb30da20, 0xa85dfed0), - TOBN(0x5ed7f5bb, 0xd3ed09c4), TOBN(0x7d42a35c, 0x82a9c1bd), - TOBN(0xcf3de995, 0x9890272d), TOBN(0x75f3432a, 0x3e713a10), - TOBN(0x5e13479f, 0xe28227b8), TOBN(0xb8561ea9, 0xfefacdc8), - TOBN(0xa6a297a0, 0x8332aafd), TOBN(0x9b0d8bb5, 0x73809b62), - TOBN(0xd2fa1cfd, 0x0c63036f), TOBN(0x7a16eb55, 0xbd64bda8), - TOBN(0x3f5cf5f6, 0x78e62ddc), TOBN(0x2267c454, 0x07fd752b), - TOBN(0x5e361b6b, 0x5e437bbe), TOBN(0x95c59501, 0x8354e075), - TOBN(0xec725f85, 0xf2b254d9), TOBN(0x844b617d, 0x2cb52b4e), - TOBN(0xed8554f5, 0xcf425fb5), TOBN(0xab67703e, 0x2af9f312), - TOBN(0x4cc34ec1, 0x3cf48283), TOBN(0xb09daa25, 0x9c8a705e), - TOBN(0xd1e9d0d0, 0x5b7d4f84), TOBN(0x4df6ef64, 0xdb38929d), - TOBN(0xe16b0763, 0xaa21ba46), TOBN(0xc6b1d178, 0xa293f8fb), - TOBN(0x0ff5b602, 0xd520aabf), TOBN(0x94d671bd, 0xc339397a), - TOBN(0x7c7d98cf, 0x4f5792fa), TOBN(0x7c5e0d67, 0x11215261), - TOBN(0x9b19a631, 0xa7c5a6d4), TOBN(0xc8511a62, 0x7a45274d), - TOBN(0x0c16621c, 0xa5a60d99), TOBN(0xf7fbab88, 0xcf5e48cb), - TOBN(0xab1e6ca2, 0xf7ddee08), TOBN(0x83bd08ce, 0xe7867f3c), - TOBN(0xf7e48e8a, 0x2ac13e27), TOBN(0x4494f6df, 0x4eb1a9f5), - TOBN(0xedbf84eb, 0x981f0a62), TOBN(0x49badc32, 0x536438f0), - TOBN(0x50bea541, 0x004f7571), TOBN(0xbac67d10, 0xdf1c94ee), - TOBN(0x253d73a1, 0xb727bc31), TOBN(0xb3d01cf2, 0x30686e28), - TOBN(0x51b77b1b, 0x55fd0b8b), TOBN(0xa099d183, 0xfeec3173), - TOBN(0x202b1fb7, 0x670e72b7), TOBN(0xadc88b33, 0xa8e1635f), - TOBN(0x34e8216a, 0xf989d905), TOBN(0xc2e68d20, 0x29b58d01), - TOBN(0x11f81c92, 0x6fe55a93), TOBN(0x15f1462a, 0x8f296f40), - TOBN(0x1915d375, 0xea3d62f2), TOBN(0xa17765a3, 0x01c8977d), - TOBN(0x7559710a, 0xe47b26f6), TOBN(0xe0bd29c8, 0x535077a5), - TOBN(0x615f976d, 0x08d84858), TOBN(0x370dfe85, 0x69ced5c1), - TOBN(0xbbc7503c, 0xa734fa56), TOBN(0xfbb9f1ec, 0x91ac4574), - TOBN(0x95d7ec53, 0x060dd7ef), TOBN(0xeef2dacd, 0x6e657979), - TOBN(0x54511af3, 0xe2a08235), TOBN(0x1e324aa4, 0x1f4aea3d), - TOBN(0x550e7e71, 0xe6e67671), TOBN(0xbccd5190, 0xbf52faf7), - TOBN(0xf880d316, 0x223cc62a), TOBN(0x0d402c7e, 0x2b32eb5d), - TOBN(0xa40bc039, 0x306a5a3b), TOBN(0x4e0a41fd, 0x96783a1b), - TOBN(0xa1e8d39a, 0x0253cdd4), TOBN(0x6480be26, 0xc7388638), - TOBN(0xee365e1d, 0x2285f382), TOBN(0x188d8d8f, 0xec0b5c36), - TOBN(0x34ef1a48, 0x1f0f4d82), TOBN(0x1a8f43e1, 0xa487d29a), - TOBN(0x8168226d, 0x77aefb3a), TOBN(0xf69a751e, 0x1e72c253), - TOBN(0x8e04359a, 0xe9594df1), TOBN(0x475ffd7d, 0xd14c0467), - TOBN(0xb5a2c2b1, 0x3844e95c), TOBN(0x85caf647, 0xdd12ef94), - TOBN(0x1ecd2a9f, 0xf1063d00), TOBN(0x1dd2e229, 0x23843311), - TOBN(0x38f0e09d, 0x73d17244), TOBN(0x3ede7746, 0x8fc653f1), - TOBN(0xae4459f5, 0xdc20e21c), TOBN(0x00db2ffa, 0x6a8599ea), - TOBN(0x11682c39, 0x30cfd905), TOBN(0x4934d074, 0xa5c112a6), - TOBN(0xbdf063c5, 0x568bfe95), TOBN(0x779a440a, 0x016c441a), - TOBN(0x0c23f218, 0x97d6fbdc), TOBN(0xd3a5cd87, 0xe0776aac), - TOBN(0xcee37f72, 0xd712e8db), TOBN(0xfb28c70d, 0x26f74e8d), - TOBN(0xffe0c728, 0xb61301a0), TOBN(0xa6282168, 0xd3724354), - TOBN(0x7ff4cb00, 0x768ffedc), TOBN(0xc51b3088, 0x03b02de9), - TOBN(0xa5a8147c, 0x3902dda5), TOBN(0x35d2f706, 0xfe6973b4), - TOBN(0x5ac2efcf, 0xc257457e), TOBN(0x933f48d4, 0x8700611b), - TOBN(0xc365af88, 0x4912beb2), TOBN(0x7f5a4de6, 0x162edf94), - TOBN(0xc646ba7c, 0x0c32f34b), TOBN(0x632c6af3, 0xb2091074), - TOBN(0x58d4f2e3, 0x753e43a9), TOBN(0x70e1d217, 0x24d4e23f), - TOBN(0xb24bf729, 0xafede6a6), TOBN(0x7f4a94d8, 0x710c8b60), - TOBN(0xaad90a96, 0x8d4faa6a), TOBN(0xd9ed0b32, 0xb066b690), - TOBN(0x52fcd37b, 0x78b6dbfd), TOBN(0x0b64615e, 0x8bd2b431), - TOBN(0x228e2048, 0xcfb9fad5), TOBN(0xbeaa386d, 0x240b76bd), - TOBN(0x2d6681c8, 0x90dad7bc), TOBN(0x3e553fc3, 0x06d38f5e), - TOBN(0xf27cdb9b, 0x9d5f9750), TOBN(0x3e85c52a, 0xd28c5b0e), - TOBN(0x190795af, 0x5247c39b), TOBN(0x547831eb, 0xbddd6828), - TOBN(0xf327a227, 0x4a82f424), TOBN(0x36919c78, 0x7e47f89d), - TOBN(0xe4783919, 0x43c7392c), TOBN(0xf101b9aa, 0x2316fefe), - TOBN(0xbcdc9e9c, 0x1c5009d2), TOBN(0xfb55ea13, 0x9cd18345), - TOBN(0xf5b5e231, 0xa3ce77c7), TOBN(0xde6b4527, 0xd2f2cb3d), - TOBN(0x10f6a333, 0x9bb26f5f), TOBN(0x1e85db8e, 0x044d85b6), - TOBN(0xc3697a08, 0x94197e54), TOBN(0x65e18cc0, 0xa7cb4ea8), - TOBN(0xa38c4f50, 0xa471fe6e), TOBN(0xf031747a, 0x2f13439c), - TOBN(0x53c4a6ba, 0xc007318b), TOBN(0xa8da3ee5, 0x1deccb3d), - TOBN(0x0555b31c, 0x558216b1), TOBN(0x90c7810c, 0x2f79e6c2), - TOBN(0x9b669f4d, 0xfe8eed3c), TOBN(0x70398ec8, 0xe0fac126), - TOBN(0xa96a449e, 0xf701b235), TOBN(0x0ceecdb3, 0xeb94f395), - TOBN(0x285fc368, 0xd0cb7431), TOBN(0x0d37bb52, 0x16a18c64), - TOBN(0x05110d38, 0xb880d2dd), TOBN(0xa60f177b, 0x65930d57), - TOBN(0x7da34a67, 0xf36235f5), TOBN(0x47f5e17c, 0x183816b9), - TOBN(0xc7664b57, 0xdb394af4), TOBN(0x39ba215d, 0x7036f789), - TOBN(0x46d2ca0e, 0x2f27b472), TOBN(0xc42647ee, 0xf73a84b7), - TOBN(0x44bc7545, 0x64488f1d), TOBN(0xaa922708, 0xf4cf85d5), - TOBN(0x721a01d5, 0x53e4df63), TOBN(0x649c0c51, 0x5db46ced), - TOBN(0x6bf0d64e, 0x3cffcb6c), TOBN(0xe3bf93fe, 0x50f71d96), - TOBN(0x75044558, 0xbcc194a0), TOBN(0x16ae3372, 0x6afdc554), - TOBN(0xbfc01adf, 0x5ca48f3f), TOBN(0x64352f06, 0xe22a9b84), - TOBN(0xcee54da1, 0xc1099e4a), TOBN(0xbbda54e8, 0xfa1b89c0), - TOBN(0x166a3df5, 0x6f6e55fb), TOBN(0x1ca44a24, 0x20176f88), - TOBN(0x936afd88, 0xdfb7b5ff), TOBN(0xe34c2437, 0x8611d4a0), - TOBN(0x7effbb75, 0x86142103), TOBN(0x6704ba1b, 0x1f34fc4d), - TOBN(0x7c2a468f, 0x10c1b122), TOBN(0x36b3a610, 0x8c6aace9), - TOBN(0xabfcc0a7, 0x75a0d050), TOBN(0x066f9197, 0x3ce33e32), - TOBN(0xce905ef4, 0x29fe09be), TOBN(0x89ee25ba, 0xa8376351), - TOBN(0x2a3ede22, 0xfd29dc76), TOBN(0x7fd32ed9, 0x36f17260), - TOBN(0x0cadcf68, 0x284b4126), TOBN(0x63422f08, 0xa7951fc8), - TOBN(0x562b24f4, 0x0807e199), TOBN(0xfe9ce5d1, 0x22ad4490), - TOBN(0xc2f51b10, 0x0db2b1b4), TOBN(0xeb3613ff, 0xe4541d0d), - TOBN(0xbd2c4a05, 0x2680813b), TOBN(0x527aa55d, 0x561b08d6), - TOBN(0xa9f8a40e, 0xa7205558), TOBN(0xe3eea56f, 0x243d0bec), - TOBN(0x7b853817, 0xa0ff58b3), TOBN(0xb67d3f65, 0x1a69e627), - TOBN(0x0b76bbb9, 0xa869b5d6), TOBN(0xa3afeb82, 0x546723ed), - TOBN(0x5f24416d, 0x3e554892), TOBN(0x8413b53d, 0x430e2a45), - TOBN(0x99c56aee, 0x9032a2a0), TOBN(0x09432bf6, 0xeec367b1), - TOBN(0x552850c6, 0xdaf0ecc1), TOBN(0x49ebce55, 0x5bc92048), - TOBN(0xdfb66ba6, 0x54811307), TOBN(0x1b84f797, 0x6f298597), - TOBN(0x79590481, 0x8d1d7a0d), TOBN(0xd9fabe03, 0x3a6fa556), - TOBN(0xa40f9c59, 0xba9e5d35), TOBN(0xcb1771c1, 0xf6247577), - TOBN(0x542a47ca, 0xe9a6312b), TOBN(0xa34b3560, 0x552dd8c5), - TOBN(0xfdf94de0, 0x0d794716), TOBN(0xd46124a9, 0x9c623094), - TOBN(0x56b7435d, 0x68afe8b4), TOBN(0x27f20540, 0x6c0d8ea1), - TOBN(0x12b77e14, 0x73186898), TOBN(0xdbc3dd46, 0x7479490f), - TOBN(0x951a9842, 0xc03b0c05), TOBN(0x8b1b3bb3, 0x7921bc96), - TOBN(0xa573b346, 0x2b202e0a), TOBN(0x77e4665d, 0x47254d56), - TOBN(0x08b70dfc, 0xd23e3984), TOBN(0xab86e8bc, 0xebd14236), - TOBN(0xaa3e07f8, 0x57114ba7), TOBN(0x5ac71689, 0xab0ef4f2), - TOBN(0x88fca384, 0x0139d9af), TOBN(0x72733f88, 0x76644af0), - TOBN(0xf122f72a, 0x65d74f4a), TOBN(0x13931577, 0xa5626c7a), - TOBN(0xd5b5d9eb, 0x70f8d5a4), TOBN(0x375adde7, 0xd7bbb228), - TOBN(0x31e88b86, 0x0c1c0b32), TOBN(0xd1f568c4, 0x173edbaa), - TOBN(0x1592fc83, 0x5459df02), TOBN(0x2beac0fb, 0x0fcd9a7e), - TOBN(0xb0a6fdb8, 0x1b473b0a), TOBN(0xe3224c6f, 0x0fe8fc48), - TOBN(0x680bd00e, 0xe87edf5b), TOBN(0x30385f02, 0x20e77cf5), - TOBN(0xe9ab98c0, 0x4d42d1b2), TOBN(0x72d191d2, 0xd3816d77), - TOBN(0x1564daca, 0x0917d9e5), TOBN(0x394eab59, 0x1f8fed7f), - TOBN(0xa209aa8d, 0x7fbb3896), TOBN(0x5564f3b9, 0xbe6ac98e), - TOBN(0xead21d05, 0xd73654ef), TOBN(0x68d1a9c4, 0x13d78d74), - TOBN(0x61e01708, 0x6d4973a0), TOBN(0x83da3500, 0x46e6d32a), - TOBN(0x6a3dfca4, 0x68ae0118), TOBN(0xa1b9a4c9, 0xd02da069), - TOBN(0x0b2ff9c7, 0xebab8302), TOBN(0x98af07c3, 0x944ba436), - TOBN(0x85997326, 0x995f0f9f), TOBN(0x467fade0, 0x71b58bc6), - TOBN(0x47e4495a, 0xbd625a2b), TOBN(0xfdd2d01d, 0x33c3b8cd), - TOBN(0x2c38ae28, 0xc693f9fa), TOBN(0x48622329, 0x348f7999), - TOBN(0x97bf738e, 0x2161f583), TOBN(0x15ee2fa7, 0x565e8cc9), - TOBN(0xa1a5c845, 0x5777e189), TOBN(0xcc10bee0, 0x456f2829), - TOBN(0x8ad95c56, 0xda762bd5), TOBN(0x152e2214, 0xe9d91da8), - TOBN(0x975b0e72, 0x7cb23c74), TOBN(0xfd5d7670, 0xa90c66df), - TOBN(0xb5b5b8ad, 0x225ffc53), TOBN(0xab6dff73, 0xfaded2ae), - TOBN(0xebd56781, 0x6f4cbe9d), TOBN(0x0ed8b249, 0x6a574bd7), - TOBN(0x41c246fe, 0x81a881fa), TOBN(0x91564805, 0xc3db9c70), - TOBN(0xd7c12b08, 0x5b862809), TOBN(0x1facd1f1, 0x55858d7b), - TOBN(0x7693747c, 0xaf09e92a), TOBN(0x3b69dcba, 0x189a425f), - TOBN(0x0be28e9f, 0x967365ef), TOBN(0x57300eb2, 0xe801f5c9), - TOBN(0x93b8ac6a, 0xd583352f), TOBN(0xa2cf1f89, 0xcd05b2b7), - TOBN(0x7c0c9b74, 0x4dcc40cc), TOBN(0xfee38c45, 0xada523fb), - TOBN(0xb49a4dec, 0x1099cc4d), TOBN(0x325c377f, 0x69f069c6), - TOBN(0xe12458ce, 0x476cc9ff), TOBN(0x580e0b6c, 0xc6d4cb63), - TOBN(0xd561c8b7, 0x9072289b), TOBN(0x0377f264, 0xa619e6da), - TOBN(0x26685362, 0x88e591a5), TOBN(0xa453a7bd, 0x7523ca2b), - TOBN(0x8a9536d2, 0xc1df4533), TOBN(0xc8e50f2f, 0xbe972f79), - TOBN(0xd433e50f, 0x6d3549cf), TOBN(0x6f33696f, 0xfacd665e), - TOBN(0x695bfdac, 0xce11fcb4), TOBN(0x810ee252, 0xaf7c9860), - TOBN(0x65450fe1, 0x7159bb2c), TOBN(0xf7dfbebe, 0x758b357b), - TOBN(0x2b057e74, 0xd69fea72), TOBN(0xd485717a, 0x92731745)}, - {TOBN(0x896c42e8, 0xee36860c), TOBN(0xdaf04dfd, 0x4113c22d), - TOBN(0x1adbb7b7, 0x44104213), TOBN(0xe5fd5fa1, 0x1fd394ea), - TOBN(0x68235d94, 0x1a4e0551), TOBN(0x6772cfbe, 0x18d10151), - TOBN(0x276071e3, 0x09984523), TOBN(0xe4e879de, 0x5a56ba98), - TOBN(0xaaafafb0, 0x285b9491), TOBN(0x01a0be88, 0x1e4c705e), - TOBN(0xff1d4f5d, 0x2ad9caab), TOBN(0x6e349a4a, 0xc37a233f), - TOBN(0xcf1c1246, 0x4a1c6a16), TOBN(0xd99e6b66, 0x29383260), - TOBN(0xea3d4366, 0x5f6d5471), TOBN(0x36974d04, 0xff8cc89b), - TOBN(0xc26c49a1, 0xcfe89d80), TOBN(0xb42c026d, 0xda9c8371), - TOBN(0xca6c013a, 0xdad066d2), TOBN(0xfb8f7228, 0x56a4f3ee), - TOBN(0x08b579ec, 0xd850935b), TOBN(0x34c1a74c, 0xd631e1b3), - TOBN(0xcb5fe596, 0xac198534), TOBN(0x39ff21f6, 0xe1f24f25), - TOBN(0x27f29e14, 0x8f929057), TOBN(0x7a64ae06, 0xc0c853df), - TOBN(0x256cd183, 0x58e9c5ce), TOBN(0x9d9cce82, 0xded092a5), - TOBN(0xcc6e5979, 0x6e93b7c7), TOBN(0xe1e47092, 0x31bb9e27), - TOBN(0xb70b3083, 0xaa9e29a0), TOBN(0xbf181a75, 0x3785e644), - TOBN(0xf53f2c65, 0x8ead09f7), TOBN(0x1335e1d5, 0x9780d14d), - TOBN(0x69cc20e0, 0xcd1b66bc), TOBN(0x9b670a37, 0xbbe0bfc8), - TOBN(0xce53dc81, 0x28efbeed), TOBN(0x0c74e77c, 0x8326a6e5), - TOBN(0x3604e0d2, 0xb88e9a63), TOBN(0xbab38fca, 0x13dc2248), - TOBN(0x8ed6e8c8, 0x5c0a3f1e), TOBN(0xbcad2492, 0x7c87c37f), - TOBN(0xfdfb62bb, 0x9ee3b78d), TOBN(0xeba8e477, 0xcbceba46), - TOBN(0x37d38cb0, 0xeeaede4b), TOBN(0x0bc498e8, 0x7976deb6), - TOBN(0xb2944c04, 0x6b6147fb), TOBN(0x8b123f35, 0xf71f9609), - TOBN(0xa155dcc7, 0xde79dc24), TOBN(0xf1168a32, 0x558f69cd), - TOBN(0xbac21595, 0x0d1850df), TOBN(0x15c8295b, 0xb204c848), - TOBN(0xf661aa36, 0x7d8184ff), TOBN(0xc396228e, 0x30447bdb), - TOBN(0x11cd5143, 0xbde4a59e), TOBN(0xe3a26e3b, 0x6beab5e6), - TOBN(0xd3b3a13f, 0x1402b9d0), TOBN(0x573441c3, 0x2c7bc863), - TOBN(0x4b301ec4, 0x578c3e6e), TOBN(0xc26fc9c4, 0x0adaf57e), - TOBN(0x96e71bfd, 0x7493cea3), TOBN(0xd05d4b3f, 0x1af81456), - TOBN(0xdaca2a8a, 0x6a8c608f), TOBN(0x53ef07f6, 0x0725b276), - TOBN(0x07a5fbd2, 0x7824fc56), TOBN(0x34675218, 0x13289077), - TOBN(0x5bf69fd5, 0xe0c48349), TOBN(0xa613ddd3, 0xb6aa7875), - TOBN(0x7f78c19c, 0x5450d866), TOBN(0x46f4409c, 0x8f84a481), - TOBN(0x9f1d1928, 0x90fce239), TOBN(0x016c4168, 0xb2ce44b9), - TOBN(0xbae023f0, 0xc7435978), TOBN(0xb152c888, 0x20e30e19), - TOBN(0x9c241645, 0xe3fa6faf), TOBN(0x735d95c1, 0x84823e60), - TOBN(0x03197573, 0x03955317), TOBN(0x0b4b02a9, 0xf03b4995), - TOBN(0x076bf559, 0x70274600), TOBN(0x32c5cc53, 0xaaf57508), - TOBN(0xe8af6d1f, 0x60624129), TOBN(0xb7bc5d64, 0x9a5e2b5e), - TOBN(0x3814b048, 0x5f082d72), TOBN(0x76f267f2, 0xce19677a), - TOBN(0x626c630f, 0xb36eed93), TOBN(0x55230cd7, 0x3bf56803), - TOBN(0x78837949, 0xce2736a0), TOBN(0x0d792d60, 0xaa6c55f1), - TOBN(0x0318dbfd, 0xd5c7c5d2), TOBN(0xb38f8da7, 0x072b342d), - TOBN(0x3569bddc, 0x7b8de38a), TOBN(0xf25b5887, 0xa1c94842), - TOBN(0xb2d5b284, 0x2946ad60), TOBN(0x854f29ad, 0xe9d1707e), - TOBN(0xaa5159dc, 0x2c6a4509), TOBN(0x899f94c0, 0x57189837), - TOBN(0xcf6adc51, 0xf4a55b03), TOBN(0x261762de, 0x35e3b2d5), - TOBN(0x4cc43012, 0x04827b51), TOBN(0xcd22a113, 0xc6021442), - TOBN(0xce2fd61a, 0x247c9569), TOBN(0x59a50973, 0xd152beca), - TOBN(0x6c835a11, 0x63a716d4), TOBN(0xc26455ed, 0x187dedcf), - TOBN(0x27f536e0, 0x49ce89e7), TOBN(0x18908539, 0xcc890cb5), - TOBN(0x308909ab, 0xd83c2aa1), TOBN(0xecd3142b, 0x1ab73bd3), - TOBN(0x6a85bf59, 0xb3f5ab84), TOBN(0x3c320a68, 0xf2bea4c6), - TOBN(0xad8dc538, 0x6da4541f), TOBN(0xeaf34eb0, 0xb7c41186), - TOBN(0x1c780129, 0x977c97c4), TOBN(0x5ff9beeb, 0xc57eb9fa), - TOBN(0xa24d0524, 0xc822c478), TOBN(0xfd8eec2a, 0x461cd415), - TOBN(0xfbde194e, 0xf027458c), TOBN(0xb4ff5319, 0x1d1be115), - TOBN(0x63f874d9, 0x4866d6f4), TOBN(0x35c75015, 0xb21ad0c9), - TOBN(0xa6b5c9d6, 0x46ac49d2), TOBN(0x42c77c0b, 0x83137aa9), - TOBN(0x24d000fc, 0x68225a38), TOBN(0x0f63cfc8, 0x2fe1e907), - TOBN(0x22d1b01b, 0xc6441f95), TOBN(0x7d38f719, 0xec8e448f), - TOBN(0x9b33fa5f, 0x787fb1ba), TOBN(0x94dcfda1, 0x190158df), - TOBN(0xc47cb339, 0x5f6d4a09), TOBN(0x6b4f355c, 0xee52b826), - TOBN(0x3d100f5d, 0xf51b930a), TOBN(0xf4512fac, 0x9f668f69), - TOBN(0x546781d5, 0x206c4c74), TOBN(0xd021d4d4, 0xcb4d2e48), - TOBN(0x494a54c2, 0xca085c2d), TOBN(0xf1dbaca4, 0x520850a8), - TOBN(0x63c79326, 0x490a1aca), TOBN(0xcb64dd9c, 0x41526b02), - TOBN(0xbb772591, 0xa2979258), TOBN(0x3f582970, 0x48d97846), - TOBN(0xd66b70d1, 0x7c213ba7), TOBN(0xc28febb5, 0xe8a0ced4), - TOBN(0x6b911831, 0xc10338c1), TOBN(0x0d54e389, 0xbf0126f3), - TOBN(0x7048d460, 0x4af206ee), TOBN(0x786c88f6, 0x77e97cb9), - TOBN(0xd4375ae1, 0xac64802e), TOBN(0x469bcfe1, 0xd53ec11c), - TOBN(0xfc9b340d, 0x47062230), TOBN(0xe743bb57, 0xc5b4a3ac), - TOBN(0xfe00b4aa, 0x59ef45ac), TOBN(0x29a4ef23, 0x59edf188), - TOBN(0x40242efe, 0xb483689b), TOBN(0x2575d3f6, 0x513ac262), - TOBN(0xf30037c8, 0x0ca6db72), TOBN(0xc9fcce82, 0x98864be2), - TOBN(0x84a112ff, 0x0149362d), TOBN(0x95e57582, 0x1c4ae971), - TOBN(0x1fa4b1a8, 0x945cf86c), TOBN(0x4525a734, 0x0b024a2f), - TOBN(0xe76c8b62, 0x8f338360), TOBN(0x483ff593, 0x28edf32b), - TOBN(0x67e8e90a, 0x298b1aec), TOBN(0x9caab338, 0x736d9a21), - TOBN(0x5c09d2fd, 0x66892709), TOBN(0x2496b4dc, 0xb55a1d41), - TOBN(0x93f5fb1a, 0xe24a4394), TOBN(0x08c75049, 0x6fa8f6c1), - TOBN(0xcaead1c2, 0xc905d85f), TOBN(0xe9d7f790, 0x0733ae57), - TOBN(0x24c9a65c, 0xf07cdd94), TOBN(0x7389359c, 0xa4b55931), - TOBN(0xf58709b7, 0x367e45f7), TOBN(0x1f203067, 0xcb7e7adc), - TOBN(0x82444bff, 0xc7b72818), TOBN(0x07303b35, 0xbaac8033), - TOBN(0x1e1ee4e4, 0xd13b7ea1), TOBN(0xe6489b24, 0xe0e74180), - TOBN(0xa5f2c610, 0x7e70ef70), TOBN(0xa1655412, 0xbdd10894), - TOBN(0x555ebefb, 0x7af4194e), TOBN(0x533c1c3c, 0x8e89bd9c), - TOBN(0x735b9b57, 0x89895856), TOBN(0x15fb3cd2, 0x567f5c15), - TOBN(0x057fed45, 0x526f09fd), TOBN(0xe8a4f10c, 0x8128240a), - TOBN(0x9332efc4, 0xff2bfd8d), TOBN(0x214e77a0, 0xbd35aa31), - TOBN(0x32896d73, 0x14faa40e), TOBN(0x767867ec, 0x01e5f186), - TOBN(0xc9adf8f1, 0x17a1813e), TOBN(0xcb6cda78, 0x54741795), - TOBN(0xb7521b6d, 0x349d51aa), TOBN(0xf56b5a9e, 0xe3c7b8e9), - TOBN(0xc6f1e5c9, 0x32a096df), TOBN(0x083667c4, 0xa3635024), - TOBN(0x365ea135, 0x18087f2f), TOBN(0xf1b8eaac, 0xd136e45d), - TOBN(0xc8a0e484, 0x73aec989), TOBN(0xd75a324b, 0x142c9259), - TOBN(0xb7b4d001, 0x01dae185), TOBN(0x45434e0b, 0x9b7a94bc), - TOBN(0xf54339af, 0xfbd8cb0b), TOBN(0xdcc4569e, 0xe98ef49e), - TOBN(0x7789318a, 0x09a51299), TOBN(0x81b4d206, 0xb2b025d8), - TOBN(0xf64aa418, 0xfae85792), TOBN(0x3e50258f, 0xacd7baf7), - TOBN(0xdce84cdb, 0x2996864b), TOBN(0xa2e67089, 0x1f485fa4), - TOBN(0xb28b2bb6, 0x534c6a5a), TOBN(0x31a7ec6b, 0xc94b9d39), - TOBN(0x1d217766, 0xd6bc20da), TOBN(0x4acdb5ec, 0x86761190), - TOBN(0x68726328, 0x73701063), TOBN(0x4d24ee7c, 0x2128c29b), - TOBN(0xc072ebd3, 0xa19fd868), TOBN(0x612e481c, 0xdb8ddd3b), - TOBN(0xb4e1d754, 0x1a64d852), TOBN(0x00ef95ac, 0xc4c6c4ab), - TOBN(0x1536d2ed, 0xaa0a6c46), TOBN(0x61294086, 0x43774790), - TOBN(0x54af25e8, 0x343fda10), TOBN(0x9ff9d98d, 0xfd25d6f2), - TOBN(0x0746af7c, 0x468b8835), TOBN(0x977a31cb, 0x730ecea7), - TOBN(0xa5096b80, 0xc2cf4a81), TOBN(0xaa986833, 0x6458c37a), - TOBN(0x6af29bf3, 0xa6bd9d34), TOBN(0x6a62fe9b, 0x33c5d854), - TOBN(0x50e6c304, 0xb7133b5e), TOBN(0x04b60159, 0x7d6e6848), - TOBN(0x4cd296df, 0x5579bea4), TOBN(0x10e35ac8, 0x5ceedaf1), - TOBN(0x04c4c5fd, 0xe3bcc5b1), TOBN(0x95f9ee8a, 0x89412cf9), - TOBN(0x2c9459ee, 0x82b6eb0f), TOBN(0x2e845765, 0x95c2aadd), - TOBN(0x774a84ae, 0xd327fcfe), TOBN(0xd8c93722, 0x0368d476), - TOBN(0x0dbd5748, 0xf83e8a3b), TOBN(0xa579aa96, 0x8d2495f3), - TOBN(0x535996a0, 0xae496e9b), TOBN(0x07afbfe9, 0xb7f9bcc2), - TOBN(0x3ac1dc6d, 0x5b7bd293), TOBN(0x3b592cff, 0x7022323d), - TOBN(0xba0deb98, 0x9c0a3e76), TOBN(0x18e78e9f, 0x4b197acb), - TOBN(0x211cde10, 0x296c36ef), TOBN(0x7ee89672, 0x82c4da77), - TOBN(0xb617d270, 0xa57836da), TOBN(0xf0cd9c31, 0x9cb7560b), - TOBN(0x01fdcbf7, 0xe455fe90), TOBN(0x3fb53cbb, 0x7e7334f3), - TOBN(0x781e2ea4, 0x4e7de4ec), TOBN(0x8adab3ad, 0x0b384fd0), - TOBN(0x129eee2f, 0x53d64829), TOBN(0x7a471e17, 0xa261492b), - TOBN(0xe4f9adb9, 0xe4cb4a2c), TOBN(0x3d359f6f, 0x97ba2c2d), - TOBN(0x346c6786, 0x0aacd697), TOBN(0x92b444c3, 0x75c2f8a8), - TOBN(0xc79fa117, 0xd85df44e), TOBN(0x56782372, 0x398ddf31), - TOBN(0x60e690f2, 0xbbbab3b8), TOBN(0x4851f8ae, 0x8b04816b), - TOBN(0xc72046ab, 0x9c92e4d2), TOBN(0x518c74a1, 0x7cf3136b), - TOBN(0xff4eb50a, 0xf9877d4c), TOBN(0x14578d90, 0xa919cabb), - TOBN(0x8218f8c4, 0xac5eb2b6), TOBN(0xa3ccc547, 0x542016e4), - TOBN(0x025bf48e, 0x327f8349), TOBN(0xf3e97346, 0xf43cb641), - TOBN(0xdc2bafdf, 0x500f1085), TOBN(0x57167876, 0x2f063055), - TOBN(0x5bd914b9, 0x411925a6), TOBN(0x7c078d48, 0xa1123de5), - TOBN(0xee6bf835, 0x182b165d), TOBN(0xb11b5e5b, 0xba519727), - TOBN(0xe33ea76c, 0x1eea7b85), TOBN(0x2352b461, 0x92d4f85e), - TOBN(0xf101d334, 0xafe115bb), TOBN(0xfabc1294, 0x889175a3), - TOBN(0x7f6bcdc0, 0x5233f925), TOBN(0xe0a802db, 0xe77fec55), - TOBN(0xbdb47b75, 0x8069b659), TOBN(0x1c5e12de, 0xf98fbd74), - TOBN(0x869c58c6, 0x4b8457ee), TOBN(0xa5360f69, 0x4f7ea9f7), - TOBN(0xe576c09f, 0xf460b38f), TOBN(0x6b70d548, 0x22b7fb36), - TOBN(0x3fd237f1, 0x3bfae315), TOBN(0x33797852, 0xcbdff369), - TOBN(0x97df25f5, 0x25b516f9), TOBN(0x46f388f2, 0xba38ad2d), - TOBN(0x656c4658, 0x89d8ddbb), TOBN(0x8830b26e, 0x70f38ee8), - TOBN(0x4320fd5c, 0xde1212b0), TOBN(0xc34f30cf, 0xe4a2edb2), - TOBN(0xabb131a3, 0x56ab64b8), TOBN(0x7f77f0cc, 0xd99c5d26), - TOBN(0x66856a37, 0xbf981d94), TOBN(0x19e76d09, 0x738bd76e), - TOBN(0xe76c8ac3, 0x96238f39), TOBN(0xc0a482be, 0xa830b366), - TOBN(0xb7b8eaff, 0x0b4eb499), TOBN(0x8ecd83bc, 0x4bfb4865), - TOBN(0x971b2cb7, 0xa2f3776f), TOBN(0xb42176a4, 0xf4b88adf), - TOBN(0xb9617df5, 0xbe1fa446), TOBN(0x8b32d508, 0xcd031bd2), - TOBN(0x1c6bd47d, 0x53b618c0), TOBN(0xc424f46c, 0x6a227923), - TOBN(0x7303ffde, 0xdd92d964), TOBN(0xe9712878, 0x71b5abf2), - TOBN(0x8f48a632, 0xf815561d), TOBN(0x85f48ff5, 0xd3c055d1), - TOBN(0x222a1427, 0x7525684f), TOBN(0xd0d841a0, 0x67360cc3), - TOBN(0x4245a926, 0x0b9267c6), TOBN(0xc78913f1, 0xcf07f863), - TOBN(0xaa844c8e, 0x4d0d9e24), TOBN(0xa42ad522, 0x3d5f9017), - TOBN(0xbd371749, 0xa2c989d5), TOBN(0x928292df, 0xe1f5e78e), - TOBN(0x493b383e, 0x0a1ea6da), TOBN(0x5136fd8d, 0x13aee529), - TOBN(0x860c44b1, 0xf2c34a99), TOBN(0x3b00aca4, 0xbf5855ac), - TOBN(0xabf6aaa0, 0xfaaf37be), TOBN(0x65f43682, 0x2a53ec08), - TOBN(0x1d9a5801, 0xa11b12e1), TOBN(0x78a7ab2c, 0xe20ed475), - TOBN(0x0de1067e, 0x9a41e0d5), TOBN(0x30473f5f, 0x305023ea), - TOBN(0xdd3ae09d, 0x169c7d97), TOBN(0x5cd5baa4, 0xcfaef9cd), - TOBN(0x5cd7440b, 0x65a44803), TOBN(0xdc13966a, 0x47f364de), - TOBN(0x077b2be8, 0x2b8357c1), TOBN(0x0cb1b4c5, 0xe9d57c2a), - TOBN(0x7a4ceb32, 0x05ff363e), TOBN(0xf310fa4d, 0xca35a9ef), - TOBN(0xdbb7b352, 0xf97f68c6), TOBN(0x0c773b50, 0x0b02cf58), - TOBN(0xea2e4821, 0x3c1f96d9), TOBN(0xffb357b0, 0xeee01815), - TOBN(0xb9c924cd, 0xe0f28039), TOBN(0x0b36c95a, 0x46a3fbe4), - TOBN(0x1faaaea4, 0x5e46db6c), TOBN(0xcae575c3, 0x1928aaff), - TOBN(0x7f671302, 0xa70dab86), TOBN(0xfcbd12a9, 0x71c58cfc), - TOBN(0xcbef9acf, 0xbee0cb92), TOBN(0x573da0b9, 0xf8c1b583), - TOBN(0x4752fcfe, 0x0d41d550), TOBN(0xe7eec0e3, 0x2155cffe), - TOBN(0x0fc39fcb, 0x545ae248), TOBN(0x522cb8d1, 0x8065f44e), - TOBN(0x263c962a, 0x70cbb96c), TOBN(0xe034362a, 0xbcd124a9), - TOBN(0xf120db28, 0x3c2ae58d), TOBN(0xb9a38d49, 0xfef6d507), - TOBN(0xb1fd2a82, 0x1ff140fd), TOBN(0xbd162f30, 0x20aee7e0), - TOBN(0x4e17a5d4, 0xcb251949), TOBN(0x2aebcb83, 0x4f7e1c3d), - TOBN(0x608eb25f, 0x937b0527), TOBN(0xf42e1e47, 0xeb7d9997), - TOBN(0xeba699c4, 0xb8a53a29), TOBN(0x1f921c71, 0xe091b536), - TOBN(0xcce29e7b, 0x5b26bbd5), TOBN(0x7a8ef5ed, 0x3b61a680), - TOBN(0xe5ef8043, 0xba1f1c7e), TOBN(0x16ea8217, 0x18158dda), - TOBN(0x01778a2b, 0x599ff0f9), TOBN(0x68a923d7, 0x8104fc6b), - TOBN(0x5bfa44df, 0xda694ff3), TOBN(0x4f7199db, 0xf7667f12), - TOBN(0xc06d8ff6, 0xe46f2a79), TOBN(0x08b5dead, 0xe9f8131d), - TOBN(0x02519a59, 0xabb4ce7c), TOBN(0xc4f710bc, 0xb42aec3e), - TOBN(0x3d77b057, 0x78bde41a), TOBN(0x6474bf80, 0xb4186b5a), - TOBN(0x048b3f67, 0x88c65741), TOBN(0xc64519de, 0x03c7c154), - TOBN(0xdf073846, 0x0edfcc4f), TOBN(0x319aa737, 0x48f1aa6b), - TOBN(0x8b9f8a02, 0xca909f77), TOBN(0x90258139, 0x7580bfef), - TOBN(0xd8bfd3ca, 0xc0c22719), TOBN(0xc60209e4, 0xc9ca151e), - TOBN(0x7a744ab5, 0xd9a1a69c), TOBN(0x6de5048b, 0x14937f8f), - TOBN(0x171938d8, 0xe115ac04), TOBN(0x7df70940, 0x1c6b16d2), - TOBN(0xa6aeb663, 0x7f8e94e7), TOBN(0xc130388e, 0x2a2cf094), - TOBN(0x1850be84, 0x77f54e6e), TOBN(0x9f258a72, 0x65d60fe5), - TOBN(0xff7ff0c0, 0x6c9146d6), TOBN(0x039aaf90, 0xe63a830b), - TOBN(0x38f27a73, 0x9460342f), TOBN(0x4703148c, 0x3f795f8a), - TOBN(0x1bb5467b, 0x9681a97e), TOBN(0x00931ba5, 0xecaeb594), - TOBN(0xcdb6719d, 0x786f337c), TOBN(0xd9c01cd2, 0xe704397d), - TOBN(0x0f4a3f20, 0x555c2fef), TOBN(0x00452509, 0x7c0af223), - TOBN(0x54a58047, 0x84db8e76), TOBN(0x3bacf1aa, 0x93c8aa06), - TOBN(0x11ca957c, 0xf7919422), TOBN(0x50641053, 0x78cdaa40), - TOBN(0x7a303874, 0x9f7144ae), TOBN(0x170c963f, 0x43d4acfd), - TOBN(0x5e148149, 0x58ddd3ef), TOBN(0xa7bde582, 0x9e72dba8), - TOBN(0x0769da8b, 0x6fa68750), TOBN(0xfa64e532, 0x572e0249), - TOBN(0xfcaadf9d, 0x2619ad31), TOBN(0x87882daa, 0xa7b349cd), - TOBN(0x9f6eb731, 0x6c67a775), TOBN(0xcb10471a, 0xefc5d0b1), - TOBN(0xb433750c, 0xe1b806b2), TOBN(0x19c5714d, 0x57b1ae7e), - TOBN(0xc0dc8b7b, 0xed03fd3f), TOBN(0xdd03344f, 0x31bc194e), - TOBN(0xa66c52a7, 0x8c6320b5), TOBN(0x8bc82ce3, 0xd0b6fd93), - TOBN(0xf8e13501, 0xb35f1341), TOBN(0xe53156dd, 0x25a43e42), - TOBN(0xd3adf27e, 0x4daeb85c), TOBN(0xb81d8379, 0xbbeddeb5), - TOBN(0x1b0b546e, 0x2e435867), TOBN(0x9020eb94, 0xeba5dd60), - TOBN(0x37d91161, 0x8210cb9d), TOBN(0x4c596b31, 0x5c91f1cf), - TOBN(0xb228a90f, 0x0e0b040d), TOBN(0xbaf02d82, 0x45ff897f), - TOBN(0x2aac79e6, 0x00fa6122), TOBN(0x24828817, 0x8e36f557), - TOBN(0xb9521d31, 0x113ec356), TOBN(0x9e48861e, 0x15eff1f8), - TOBN(0x2aa1d412, 0xe0d41715), TOBN(0x71f86203, 0x53f131b8), - TOBN(0xf60da8da, 0x3fd19408), TOBN(0x4aa716dc, 0x278d9d99), - TOBN(0x394531f7, 0xa8c51c90), TOBN(0xb560b0e8, 0xf59db51c), - TOBN(0xa28fc992, 0xfa34bdad), TOBN(0xf024fa14, 0x9cd4f8bd), - TOBN(0x5cf530f7, 0x23a9d0d3), TOBN(0x615ca193, 0xe28c9b56), - TOBN(0x6d2a483d, 0x6f73c51e), TOBN(0xa4cb2412, 0xea0dc2dd), - TOBN(0x50663c41, 0x1eb917ff), TOBN(0x3d3a74cf, 0xeade299e), - TOBN(0x29b3990f, 0x4a7a9202), TOBN(0xa9bccf59, 0xa7b15c3d), - TOBN(0x66a3ccdc, 0xa5df9208), TOBN(0x48027c14, 0x43f2f929), - TOBN(0xd385377c, 0x40b557f0), TOBN(0xe001c366, 0xcd684660), - TOBN(0x1b18ed6b, 0xe2183a27), TOBN(0x879738d8, 0x63210329), - TOBN(0xa687c74b, 0xbda94882), TOBN(0xd1bbcc48, 0xa684b299), - TOBN(0xaf6f1112, 0x863b3724), TOBN(0x6943d1b4, 0x2c8ce9f8), - TOBN(0xe044a3bb, 0x098cafb4), TOBN(0x27ed2310, 0x60d48caf), - TOBN(0x542b5675, 0x3a31b84d), TOBN(0xcbf3dd50, 0xfcddbed7), - TOBN(0x25031f16, 0x41b1d830), TOBN(0xa7ec851d, 0xcb0c1e27), - TOBN(0xac1c8fe0, 0xb5ae75db), TOBN(0xb24c7557, 0x08c52120), - TOBN(0x57f811dc, 0x1d4636c3), TOBN(0xf8436526, 0x681a9939), - TOBN(0x1f6bc6d9, 0x9c81adb3), TOBN(0x840f8ac3, 0x5b7d80d4), - TOBN(0x731a9811, 0xf4387f1a), TOBN(0x7c501cd3, 0xb5156880), - TOBN(0xa5ca4a07, 0xdfe68867), TOBN(0xf123d8f0, 0x5fcea120), - TOBN(0x1fbb0e71, 0xd607039e), TOBN(0x2b70e215, 0xcd3a4546), - TOBN(0x32d2f01d, 0x53324091), TOBN(0xb796ff08, 0x180ab19b), - TOBN(0x32d87a86, 0x3c57c4aa), TOBN(0x2aed9caf, 0xb7c49a27), - TOBN(0x9fb35eac, 0x31630d98), TOBN(0x338e8cdf, 0x5c3e20a3), - TOBN(0x80f16182, 0x66cde8db), TOBN(0x4e159980, 0x2d72fd36), - TOBN(0xd7b8f13b, 0x9b6e5072), TOBN(0xf5213907, 0x3b7b5dc1), - TOBN(0x4d431f1d, 0x8ce4396e), TOBN(0x37a1a680, 0xa7ed2142), - TOBN(0xbf375696, 0xd01aaf6b), TOBN(0xaa1c0c54, 0xe63aab66), - TOBN(0x3014368b, 0x4ed80940), TOBN(0x67e6d056, 0x7a6fcedd), - TOBN(0x7c208c49, 0xca97579f), TOBN(0xfe3d7a81, 0xa23597f6), - TOBN(0x5e203202, 0x7e096ae2), TOBN(0xb1f3e1e7, 0x24b39366), - TOBN(0x26da26f3, 0x2fdcdffc), TOBN(0x79422f1d, 0x6097be83)}, - {TOBN(0x263a2cfb, 0x9db3b381), TOBN(0x9c3a2dee, 0xd4df0a4b), - TOBN(0x728d06e9, 0x7d04e61f), TOBN(0x8b1adfbc, 0x42449325), - TOBN(0x6ec1d939, 0x7e053a1b), TOBN(0xee2be5c7, 0x66daf707), - TOBN(0x80ba1e14, 0x810ac7ab), TOBN(0xdd2ae778, 0xf530f174), - TOBN(0x0435d97a, 0x205b9d8b), TOBN(0x6eb8f064, 0x056756d4), - TOBN(0xd5e88a8b, 0xb6f8210e), TOBN(0x070ef12d, 0xec9fd9ea), - TOBN(0x4d849505, 0x3bcc876a), TOBN(0x12a75338, 0xa7404ce3), - TOBN(0xd22b49e1, 0xb8a1db5e), TOBN(0xec1f2051, 0x14bfa5ad), - TOBN(0xadbaeb79, 0xb6828f36), TOBN(0x9d7a0258, 0x01bd5b9e), - TOBN(0xeda01e0d, 0x1e844b0c), TOBN(0x4b625175, 0x887edfc9), - TOBN(0x14109fdd, 0x9669b621), TOBN(0x88a2ca56, 0xf6f87b98), - TOBN(0xfe2eb788, 0x170df6bc), TOBN(0x0cea06f4, 0xffa473f9), - TOBN(0x43ed81b5, 0xc4e83d33), TOBN(0xd9f35879, 0x5efd488b), - TOBN(0x164a620f, 0x9deb4d0f), TOBN(0xc6927bdb, 0xac6a7394), - TOBN(0x45c28df7, 0x9f9e0f03), TOBN(0x2868661e, 0xfcd7e1a9), - TOBN(0x7cf4e8d0, 0xffa348f1), TOBN(0x6bd4c284, 0x398538e0), - TOBN(0x2618a091, 0x289a8619), TOBN(0xef796e60, 0x6671b173), - TOBN(0x664e46e5, 0x9090c632), TOBN(0xa38062d4, 0x1e66f8fb), - TOBN(0x6c744a20, 0x0573274e), TOBN(0xd07b67e4, 0xa9271394), - TOBN(0x391223b2, 0x6bdc0e20), TOBN(0xbe2d93f1, 0xeb0a05a7), - TOBN(0xf23e2e53, 0x3f36d141), TOBN(0xe84bb3d4, 0x4dfca442), - TOBN(0xb804a48d, 0x6b7c023a), TOBN(0x1e16a8fa, 0x76431c3b), - TOBN(0x1b5452ad, 0xddd472e0), TOBN(0x7d405ee7, 0x0d1ee127), - TOBN(0x50fc6f1d, 0xffa27599), TOBN(0x351ac53c, 0xbf391b35), - TOBN(0x7efa14b8, 0x4444896b), TOBN(0x64974d2f, 0xf94027fb), - TOBN(0xefdcd0e8, 0xde84487d), TOBN(0x8c45b260, 0x2b48989b), - TOBN(0xa8fcbbc2, 0xd8463487), TOBN(0xd1b2b3f7, 0x3fbc476c), - TOBN(0x21d005b7, 0xc8f443c0), TOBN(0x518f2e67, 0x40c0139c), - TOBN(0x56036e8c, 0x06d75fc1), TOBN(0x2dcf7bb7, 0x3249a89f), - TOBN(0x81dd1d3d, 0xe245e7dd), TOBN(0xf578dc4b, 0xebd6e2a7), - TOBN(0x4c028903, 0xdf2ce7a0), TOBN(0xaee36288, 0x9c39afac), - TOBN(0xdc847c31, 0x146404ab), TOBN(0x6304c0d8, 0xa4e97818), - TOBN(0xae51dca2, 0xa91f6791), TOBN(0x2abe4190, 0x9baa9efc), - TOBN(0xd9d2e2f4, 0x559c7ac1), TOBN(0xe82f4b51, 0xfc9f773a), - TOBN(0xa7713027, 0x4073e81c), TOBN(0xc0276fac, 0xfbb596fc), - TOBN(0x1d819fc9, 0xa684f70c), TOBN(0x29b47fdd, 0xc9f7b1e0), - TOBN(0x358de103, 0x459b1940), TOBN(0xec881c59, 0x5b013e93), - TOBN(0x51574c93, 0x49532ad3), TOBN(0x2db1d445, 0xb37b46de), - TOBN(0xc6445b87, 0xdf239fd8), TOBN(0xc718af75, 0x151d24ee), - TOBN(0xaea1c4a4, 0xf43c6259), TOBN(0x40c0e5d7, 0x70be02f7), - TOBN(0x6a4590f4, 0x721b33f2), TOBN(0x2124f1fb, 0xfedf04ea), - TOBN(0xf8e53cde, 0x9745efe7), TOBN(0xe7e10432, 0x65f046d9), - TOBN(0xc3fca28e, 0xe4d0c7e6), TOBN(0x847e339a, 0x87253b1b), - TOBN(0x9b595348, 0x3743e643), TOBN(0xcb6a0a0b, 0x4fd12fc5), - TOBN(0xfb6836c3, 0x27d02dcc), TOBN(0x5ad00982, 0x7a68bcc2), - TOBN(0x1b24b44c, 0x005e912d), TOBN(0xcc83d20f, 0x811fdcfe), - TOBN(0x36527ec1, 0x666fba0c), TOBN(0x69948197, 0x14754635), - TOBN(0xfcdcb1a8, 0x556da9c2), TOBN(0xa5934267, 0x81a732b2), - TOBN(0xec1214ed, 0xa714181d), TOBN(0x609ac13b, 0x6067b341), - TOBN(0xff4b4c97, 0xa545df1f), TOBN(0xa1240501, 0x34d2076b), - TOBN(0x6efa0c23, 0x1409ca97), TOBN(0x254cc1a8, 0x20638c43), - TOBN(0xd4e363af, 0xdcfb46cd), TOBN(0x62c2adc3, 0x03942a27), - TOBN(0xc67b9df0, 0x56e46483), TOBN(0xa55abb20, 0x63736356), - TOBN(0xab93c098, 0xc551bc52), TOBN(0x382b49f9, 0xb15fe64b), - TOBN(0x9ec221ad, 0x4dff8d47), TOBN(0x79caf615, 0x437df4d6), - TOBN(0x5f13dc64, 0xbb456509), TOBN(0xe4c589d9, 0x191f0714), - TOBN(0x27b6a8ab, 0x3fd40e09), TOBN(0xe455842e, 0x77313ea9), - TOBN(0x8b51d1e2, 0x1f55988b), TOBN(0x5716dd73, 0x062bbbfc), - TOBN(0x633c11e5, 0x4e8bf3de), TOBN(0x9a0e77b6, 0x1b85be3b), - TOBN(0x56510729, 0x0911cca6), TOBN(0x27e76495, 0xefa6590f), - TOBN(0xe4ac8b33, 0x070d3aab), TOBN(0x2643672b, 0x9a2cd5e5), - TOBN(0x52eff79b, 0x1cfc9173), TOBN(0x665ca49b, 0x90a7c13f), - TOBN(0x5a8dda59, 0xb3efb998), TOBN(0x8a5b922d, 0x052f1341), - TOBN(0xae9ebbab, 0x3cf9a530), TOBN(0x35986e7b, 0xf56da4d7), - TOBN(0x3a636b5c, 0xff3513cc), TOBN(0xbb0cf8ba, 0x3198f7dd), - TOBN(0xb8d40522, 0x41f16f86), TOBN(0x760575d8, 0xde13a7bf), - TOBN(0x36f74e16, 0x9f7aa181), TOBN(0x163a3ecf, 0xf509ed1c), - TOBN(0x6aead61f, 0x3c40a491), TOBN(0x158c95fc, 0xdfe8fcaa), - TOBN(0xa3991b6e, 0x13cda46f), TOBN(0x79482415, 0x342faed0), - TOBN(0xf3ba5bde, 0x666b5970), TOBN(0x1d52e6bc, 0xb26ab6dd), - TOBN(0x768ba1e7, 0x8608dd3d), TOBN(0x4930db2a, 0xea076586), - TOBN(0xd9575714, 0xe7dc1afa), TOBN(0x1fc7bf7d, 0xf7c58817), - TOBN(0x6b47accd, 0xd9eee96c), TOBN(0x0ca277fb, 0xe58cec37), - TOBN(0x113fe413, 0xe702c42a), TOBN(0xdd1764ee, 0xc47cbe51), - TOBN(0x041e7cde, 0x7b3ed739), TOBN(0x50cb7459, 0x5ce9e1c0), - TOBN(0x35568513, 0x2925b212), TOBN(0x7cff95c4, 0x001b081c), - TOBN(0x63ee4cbd, 0x8088b454), TOBN(0xdb7f32f7, 0x9a9e0c8a), - TOBN(0xb377d418, 0x6b2447cb), TOBN(0xe3e982aa, 0xd370219b), - TOBN(0x06ccc1e4, 0xc2a2a593), TOBN(0x72c36865, 0x0773f24f), - TOBN(0xa13b4da7, 0x95859423), TOBN(0x8bbf1d33, 0x75040c8f), - TOBN(0x726f0973, 0xda50c991), TOBN(0x48afcd5b, 0x822d6ee2), - TOBN(0xe5fc718b, 0x20fd7771), TOBN(0xb9e8e77d, 0xfd0807a1), - TOBN(0x7f5e0f44, 0x99a7703d), TOBN(0x6972930e, 0x618e36f3), - TOBN(0x2b7c77b8, 0x23807bbe), TOBN(0xe5b82405, 0xcb27ff50), - TOBN(0xba8b8be3, 0xbd379062), TOBN(0xd64b7a1d, 0x2dce4a92), - TOBN(0x040a73c5, 0xb2952e37), TOBN(0x0a9e252e, 0xd438aeca), - TOBN(0xdd43956b, 0xc39d3bcb), TOBN(0x1a31ca00, 0xb32b2d63), - TOBN(0xd67133b8, 0x5c417a18), TOBN(0xd08e4790, 0x2ef442c8), - TOBN(0x98cb1ae9, 0x255c0980), TOBN(0x4bd86381, 0x2b4a739f), - TOBN(0x5a5c31e1, 0x1e4a45a1), TOBN(0x1e5d55fe, 0x9cb0db2f), - TOBN(0x74661b06, 0x8ff5cc29), TOBN(0x026b389f, 0x0eb8a4f4), - TOBN(0x536b21a4, 0x58848c24), TOBN(0x2e5bf8ec, 0x81dc72b0), - TOBN(0x03c187d0, 0xad886aac), TOBN(0x5c16878a, 0xb771b645), - TOBN(0xb07dfc6f, 0xc74045ab), TOBN(0x2c6360bf, 0x7800caed), - TOBN(0x24295bb5, 0xb9c972a3), TOBN(0xc9e6f88e, 0x7c9a6dba), - TOBN(0x90ffbf24, 0x92a79aa6), TOBN(0xde29d50a, 0x41c26ac2), - TOBN(0x9f0af483, 0xd309cbe6), TOBN(0x5b020d8a, 0xe0bced4f), - TOBN(0x606e986d, 0xb38023e3), TOBN(0xad8f2c9d, 0x1abc6933), - TOBN(0x19292e1d, 0xe7400e93), TOBN(0xfe3e18a9, 0x52be5e4d), - TOBN(0xe8e9771d, 0x2e0680bf), TOBN(0x8c5bec98, 0xc54db063), - TOBN(0x2af9662a, 0x74a55d1f), TOBN(0xe3fbf28f, 0x046f66d8), - TOBN(0xa3a72ab4, 0xd4dc4794), TOBN(0x09779f45, 0x5c7c2dd8), - TOBN(0xd893bdaf, 0xc3d19d8d), TOBN(0xd5a75094, 0x57d6a6df), - TOBN(0x8cf8fef9, 0x952e6255), TOBN(0x3da67cfb, 0xda9a8aff), - TOBN(0x4c23f62a, 0x2c160dcd), TOBN(0x34e6c5e3, 0x8f90eaef), - TOBN(0x35865519, 0xa9a65d5a), TOBN(0x07c48aae, 0x8fd38a3d), - TOBN(0xb7e7aeda, 0x50068527), TOBN(0x2c09ef23, 0x1c90936a), - TOBN(0x31ecfeb6, 0xe879324c), TOBN(0xa0871f6b, 0xfb0ec938), - TOBN(0xb1f0fb68, 0xd84d835d), TOBN(0xc90caf39, 0x861dc1e6), - TOBN(0x12e5b046, 0x7594f8d7), TOBN(0x26897ae2, 0x65012b92), - TOBN(0xbcf68a08, 0xa4d6755d), TOBN(0x403ee41c, 0x0991fbda), - TOBN(0x733e343e, 0x3bbf17e8), TOBN(0xd2c7980d, 0x679b3d65), - TOBN(0x33056232, 0xd2e11305), TOBN(0x966be492, 0xf3c07a6f), - TOBN(0x6a8878ff, 0xbb15509d), TOBN(0xff221101, 0x0a9b59a4), - TOBN(0x6c9f564a, 0xabe30129), TOBN(0xc6f2c940, 0x336e64cf), - TOBN(0x0fe75262, 0x8b0c8022), TOBN(0xbe0267e9, 0x6ae8db87), - TOBN(0x22e192f1, 0x93bc042b), TOBN(0xf085b534, 0xb237c458), - TOBN(0xa0d192bd, 0x832c4168), TOBN(0x7a76e9e3, 0xbdf6271d), - TOBN(0x52a882fa, 0xb88911b5), TOBN(0xc85345e4, 0xb4db0eb5), - TOBN(0xa3be02a6, 0x81a7c3ff), TOBN(0x51889c8c, 0xf0ec0469), - TOBN(0x9d031369, 0xa5e829e5), TOBN(0xcbb4c6fc, 0x1607aa41), - TOBN(0x75ac59a6, 0x241d84c1), TOBN(0xc043f2bf, 0x8829e0ee), - TOBN(0x82a38f75, 0x8ea5e185), TOBN(0x8bda40b9, 0xd87cbd9f), - TOBN(0x9e65e75e, 0x2d8fc601), TOBN(0x3d515f74, 0xa35690b3), - TOBN(0x534acf4f, 0xda79e5ac), TOBN(0x68b83b3a, 0x8630215f), - TOBN(0x5c748b2e, 0xd085756e), TOBN(0xb0317258, 0xe5d37cb2), - TOBN(0x6735841a, 0xc5ccc2c4), TOBN(0x7d7dc96b, 0x3d9d5069), - TOBN(0xa147e410, 0xfd1754bd), TOBN(0x65296e94, 0xd399ddd5), - TOBN(0xf6b5b2d0, 0xbc8fa5bc), TOBN(0x8a5ead67, 0x500c277b), - TOBN(0x214625e6, 0xdfa08a5d), TOBN(0x51fdfedc, 0x959cf047), - TOBN(0x6bc9430b, 0x289fca32), TOBN(0xe36ff0cf, 0x9d9bdc3f), - TOBN(0x2fe187cb, 0x58ea0ede), TOBN(0xed66af20, 0x5a900b3f), - TOBN(0x00e0968b, 0x5fa9f4d6), TOBN(0x2d4066ce, 0x37a362e7), - TOBN(0xa99a9748, 0xbd07e772), TOBN(0x710989c0, 0x06a4f1d0), - TOBN(0xd5dedf35, 0xce40cbd8), TOBN(0xab55c5f0, 0x1743293d), - TOBN(0x766f1144, 0x8aa24e2c), TOBN(0x94d874f8, 0x605fbcb4), - TOBN(0xa365f0e8, 0xa518001b), TOBN(0xee605eb6, 0x9d04ef0f), - TOBN(0x5a3915cd, 0xba8d4d25), TOBN(0x44c0e1b8, 0xb5113472), - TOBN(0xcbb024e8, 0x8b6740dc), TOBN(0x89087a53, 0xee1d4f0c), - TOBN(0xa88fa05c, 0x1fc4e372), TOBN(0x8bf395cb, 0xaf8b3af2), - TOBN(0x1e71c9a1, 0xdeb8568b), TOBN(0xa35daea0, 0x80fb3d32), - TOBN(0xe8b6f266, 0x2cf8fb81), TOBN(0x6d51afe8, 0x9490696a), - TOBN(0x81beac6e, 0x51803a19), TOBN(0xe3d24b7f, 0x86219080), - TOBN(0x727cfd9d, 0xdf6f463c), TOBN(0x8c6865ca, 0x72284ee8), - TOBN(0x32c88b7d, 0xb743f4ef), TOBN(0x3793909b, 0xe7d11dce), - TOBN(0xd398f922, 0x2ff2ebe8), TOBN(0x2c70ca44, 0xe5e49796), - TOBN(0xdf4d9929, 0xcb1131b1), TOBN(0x7826f298, 0x25888e79), - TOBN(0x4d3a112c, 0xf1d8740a), TOBN(0x00384cb6, 0x270afa8b), - TOBN(0xcb64125b, 0x3ab48095), TOBN(0x3451c256, 0x62d05106), - TOBN(0xd73d577d, 0xa4955845), TOBN(0x39570c16, 0xbf9f4433), - TOBN(0xd7dfaad3, 0xadecf263), TOBN(0xf1c3d8d1, 0xdc76e102), - TOBN(0x5e774a58, 0x54c6a836), TOBN(0xdad4b672, 0x3e92d47b), - TOBN(0xbe7e990f, 0xf0d796a0), TOBN(0x5fc62478, 0xdf0e8b02), - TOBN(0x8aae8bf4, 0x030c00ad), TOBN(0x3d2db93b, 0x9004ba0f), - TOBN(0xe48c8a79, 0xd85d5ddc), TOBN(0xe907caa7, 0x6bb07f34), - TOBN(0x58db343a, 0xa39eaed5), TOBN(0x0ea6e007, 0xadaf5724), - TOBN(0xe00df169, 0xd23233f3), TOBN(0x3e322796, 0x77cb637f), - TOBN(0x1f897c0e, 0x1da0cf6c), TOBN(0xa651f5d8, 0x31d6bbdd), - TOBN(0xdd61af19, 0x1a230c76), TOBN(0xbd527272, 0xcdaa5e4a), - TOBN(0xca753636, 0xd0abcd7e), TOBN(0x78bdd37c, 0x370bd8dc), - TOBN(0xc23916c2, 0x17cd93fe), TOBN(0x65b97a4d, 0xdadce6e2), - TOBN(0xe04ed4eb, 0x174e42f8), TOBN(0x1491ccaa, 0xbb21480a), - TOBN(0x145a8280, 0x23196332), TOBN(0x3c3862d7, 0x587b479a), - TOBN(0x9f4a88a3, 0x01dcd0ed), TOBN(0x4da2b7ef, 0x3ea12f1f), - TOBN(0xf8e7ae33, 0xb126e48e), TOBN(0x404a0b32, 0xf494e237), - TOBN(0x9beac474, 0xc55acadb), TOBN(0x4ee5cf3b, 0xcbec9fd9), - TOBN(0x336b33b9, 0x7df3c8c3), TOBN(0xbd905fe3, 0xb76808fd), - TOBN(0x8f436981, 0xaa45c16a), TOBN(0x255c5bfa, 0x3dd27b62), - TOBN(0x71965cbf, 0xc3dd9b4d), TOBN(0xce23edbf, 0xfc068a87), - TOBN(0xb78d4725, 0x745b029b), TOBN(0x74610713, 0xcefdd9bd), - TOBN(0x7116f75f, 0x1266bf52), TOBN(0x02046722, 0x18e49bb6), - TOBN(0xdf43df9f, 0x3d6f19e3), TOBN(0xef1bc7d0, 0xe685cb2f), - TOBN(0xcddb27c1, 0x7078c432), TOBN(0xe1961b9c, 0xb77fedb7), - TOBN(0x1edc2f5c, 0xc2290570), TOBN(0x2c3fefca, 0x19cbd886), - TOBN(0xcf880a36, 0xc2af389a), TOBN(0x96c610fd, 0xbda71cea), - TOBN(0xf03977a9, 0x32aa8463), TOBN(0x8eb7763f, 0x8586d90a), - TOBN(0x3f342454, 0x2a296e77), TOBN(0xc8718683, 0x42837a35), - TOBN(0x7dc71090, 0x6a09c731), TOBN(0x54778ffb, 0x51b816db), - TOBN(0x6b33bfec, 0xaf06defd), TOBN(0xfe3c105f, 0x8592b70b), - TOBN(0xf937fda4, 0x61da6114), TOBN(0x3c13e651, 0x4c266ad7), - TOBN(0xe363a829, 0x855938e8), TOBN(0x2eeb5d9e, 0x9de54b72), - TOBN(0xbeb93b0e, 0x20ccfab9), TOBN(0x3dffbb5f, 0x25e61a25), - TOBN(0x7f655e43, 0x1acc093d), TOBN(0x0cb6cc3d, 0x3964ce61), - TOBN(0x6ab283a1, 0xe5e9b460), TOBN(0x55d787c5, 0xa1c7e72d), - TOBN(0x4d2efd47, 0xdeadbf02), TOBN(0x11e80219, 0xac459068), - TOBN(0x810c7626, 0x71f311f0), TOBN(0xfa17ef8d, 0x4ab6ef53), - TOBN(0xaf47fd25, 0x93e43bff), TOBN(0x5cb5ff3f, 0x0be40632), - TOBN(0x54687106, 0x8ee61da3), TOBN(0x7764196e, 0xb08afd0f), - TOBN(0x831ab3ed, 0xf0290a8f), TOBN(0xcae81966, 0xcb47c387), - TOBN(0xaad7dece, 0x184efb4f), TOBN(0xdcfc53b3, 0x4749110e), - TOBN(0x6698f23c, 0x4cb632f9), TOBN(0xc42a1ad6, 0xb91f8067), - TOBN(0xb116a81d, 0x6284180a), TOBN(0xebedf5f8, 0xe901326f), - TOBN(0xf2274c9f, 0x97e3e044), TOBN(0x42018520, 0x11d09fc9), - TOBN(0x56a65f17, 0xd18e6e23), TOBN(0x2ea61e2a, 0x352b683c), - TOBN(0x27d291bc, 0x575eaa94), TOBN(0x9e7bc721, 0xb8ff522d), - TOBN(0x5f7268bf, 0xa7f04d6f), TOBN(0x5868c73f, 0xaba41748), - TOBN(0x9f85c2db, 0x7be0eead), TOBN(0x511e7842, 0xff719135), - TOBN(0x5a06b1e9, 0xc5ea90d7), TOBN(0x0c19e283, 0x26fab631), - TOBN(0x8af8f0cf, 0xe9206c55), TOBN(0x89389cb4, 0x3553c06a), - TOBN(0x39dbed97, 0xf65f8004), TOBN(0x0621b037, 0xc508991d), - TOBN(0x1c52e635, 0x96e78cc4), TOBN(0x5385c8b2, 0x0c06b4a8), - TOBN(0xd84ddfdb, 0xb0e87d03), TOBN(0xc49dfb66, 0x934bafad), - TOBN(0x7071e170, 0x59f70772), TOBN(0x3a073a84, 0x3a1db56b), - TOBN(0x03494903, 0x3b8af190), TOBN(0x7d882de3, 0xd32920f0), - TOBN(0x91633f0a, 0xb2cf8940), TOBN(0x72b0b178, 0x6f948f51), - TOBN(0x2d28dc30, 0x782653c8), TOBN(0x88829849, 0xdb903a05), - TOBN(0xb8095d0c, 0x6a19d2bb), TOBN(0x4b9e7f0c, 0x86f782cb), - TOBN(0x7af73988, 0x2d907064), TOBN(0xd12be0fe, 0x8b32643c), - TOBN(0x358ed23d, 0x0e165dc3), TOBN(0x3d47ce62, 0x4e2378ce), - TOBN(0x7e2bb0b9, 0xfeb8a087), TOBN(0x3246e8ae, 0xe29e10b9), - TOBN(0x459f4ec7, 0x03ce2b4d), TOBN(0xe9b4ca1b, 0xbbc077cf), - TOBN(0x2613b4f2, 0x0e9940c1), TOBN(0xfc598bb9, 0x047d1eb1), - TOBN(0x9744c62b, 0x45036099), TOBN(0xa9dee742, 0x167c65d8), - TOBN(0x0c511525, 0xdabe1943), TOBN(0xda110554, 0x93c6c624), - TOBN(0xae00a52c, 0x651a3be2), TOBN(0xcda5111d, 0x884449a6), - TOBN(0x063c06f4, 0xff33bed1), TOBN(0x73baaf9a, 0x0d3d76b4), - TOBN(0x52fb0c9d, 0x7fc63668), TOBN(0x6886c9dd, 0x0c039cde), - TOBN(0x602bd599, 0x55b22351), TOBN(0xb00cab02, 0x360c7c13), - TOBN(0x8cb616bc, 0x81b69442), TOBN(0x41486700, 0xb55c3cee), - TOBN(0x71093281, 0xf49ba278), TOBN(0xad956d9c, 0x64a50710), - TOBN(0x9561f28b, 0x638a7e81), TOBN(0x54155cdf, 0x5980ddc3), - TOBN(0xb2db4a96, 0xd26f247a), TOBN(0x9d774e4e, 0x4787d100), - TOBN(0x1a9e6e2e, 0x078637d2), TOBN(0x1c363e2d, 0x5e0ae06a), - TOBN(0x7493483e, 0xe9cfa354), TOBN(0x76843cb3, 0x7f74b98d), - TOBN(0xbaca6591, 0xd4b66947), TOBN(0xb452ce98, 0x04460a8c), - TOBN(0x6830d246, 0x43768f55), TOBN(0xf4197ed8, 0x7dff12df), - TOBN(0x6521b472, 0x400dd0f7), TOBN(0x59f5ca8f, 0x4b1e7093), - TOBN(0x6feff11b, 0x080338ae), TOBN(0x0ada31f6, 0xa29ca3c6), - TOBN(0x24794eb6, 0x94a2c215), TOBN(0xd83a43ab, 0x05a57ab4), - TOBN(0x264a543a, 0x2a6f89fe), TOBN(0x2c2a3868, 0xdd5ec7c2), - TOBN(0xd3373940, 0x8439d9b2), TOBN(0x715ea672, 0x0acd1f11), - TOBN(0x42c1d235, 0xe7e6cc19), TOBN(0x81ce6e96, 0xb990585c), - TOBN(0x04e5dfe0, 0xd809c7bd), TOBN(0xd7b2580c, 0x8f1050ab), - TOBN(0x6d91ad78, 0xd8a4176f), TOBN(0x0af556ee, 0x4e2e897c), - TOBN(0x162a8b73, 0x921de0ac), TOBN(0x52ac9c22, 0x7ea78400), - TOBN(0xee2a4eea, 0xefce2174), TOBN(0xbe61844e, 0x6d637f79), - TOBN(0x0491f1bc, 0x789a283b), TOBN(0x72d3ac3d, 0x880836f4), - TOBN(0xaa1c5ea3, 0x88e5402d), TOBN(0x1b192421, 0xd5cc473d), - TOBN(0x5c0b9998, 0x9dc84cac), TOBN(0xb0a8482d, 0x9c6e75b8), - TOBN(0x639961d0, 0x3a191ce2), TOBN(0xda3bc865, 0x6d837930), - TOBN(0xca990653, 0x056e6f8f), TOBN(0x84861c41, 0x64d133a7), - TOBN(0x8b403276, 0x746abe40), TOBN(0xb7b4d51a, 0xebf8e303), - TOBN(0x05b43211, 0x220a255d), TOBN(0xc997152c, 0x02419e6e), - TOBN(0x76ff47b6, 0x630c2fea), TOBN(0x50518677, 0x281fdade), - TOBN(0x3283b8ba, 0xcf902b0b), TOBN(0x8d4b4eb5, 0x37db303b), - TOBN(0xcc89f42d, 0x755011bc), TOBN(0xb43d74bb, 0xdd09d19b), - TOBN(0x65746bc9, 0x8adba350), TOBN(0x364eaf8c, 0xb51c1927), - TOBN(0x13c76596, 0x10ad72ec), TOBN(0x30045121, 0xf8d40c20), - TOBN(0x6d2d99b7, 0xea7b979b), TOBN(0xcd78cd74, 0xe6fb3bcd), - TOBN(0x11e45a9e, 0x86cffbfe), TOBN(0x78a61cf4, 0x637024f6), - TOBN(0xd06bc872, 0x3d502295), TOBN(0xf1376854, 0x458cb288), - TOBN(0xb9db26a1, 0x342f8586), TOBN(0xf33effcf, 0x4beee09e), - TOBN(0xd7e0c4cd, 0xb30cfb3a), TOBN(0x6d09b8c1, 0x6c9db4c8), - TOBN(0x40ba1a42, 0x07c8d9df), TOBN(0x6fd495f7, 0x1c52c66d), - TOBN(0xfb0e169f, 0x275264da), TOBN(0x80c2b746, 0xe57d8362), - TOBN(0xedd987f7, 0x49ad7222), TOBN(0xfdc229af, 0x4398ec7b)}, - {TOBN(0xb0d1ed84, 0x52666a58), TOBN(0x4bcb6e00, 0xe6a9c3c2), - TOBN(0x3c57411c, 0x26906408), TOBN(0xcfc20755, 0x13556400), - TOBN(0xa08b1c50, 0x5294dba3), TOBN(0xa30ba286, 0x8b7dd31e), - TOBN(0xd70ba90e, 0x991eca74), TOBN(0x094e142c, 0xe762c2b9), - TOBN(0xb81d783e, 0x979f3925), TOBN(0x1efd130a, 0xaf4c89a7), - TOBN(0x525c2144, 0xfd1bf7fa), TOBN(0x4b296904, 0x1b265a9e), - TOBN(0xed8e9634, 0xb9db65b6), TOBN(0x35c82e32, 0x03599d8a), - TOBN(0xdaa7a54f, 0x403563f3), TOBN(0x9df088ad, 0x022c38ab), - TOBN(0xe5cfb066, 0xbb3fd30a), TOBN(0x429169da, 0xeff0354e), - TOBN(0x809cf852, 0x3524e36c), TOBN(0x136f4fb3, 0x0155be1d), - TOBN(0x4826af01, 0x1fbba712), TOBN(0x6ef0f0b4, 0x506ba1a1), - TOBN(0xd9928b31, 0x77aea73e), TOBN(0xe2bf6af2, 0x5eaa244e), - TOBN(0x8d084f12, 0x4237b64b), TOBN(0x688ebe99, 0xe3ecfd07), - TOBN(0x57b8a70c, 0xf6845dd8), TOBN(0x808fc59c, 0x5da4a325), - TOBN(0xa9032b2b, 0xa3585862), TOBN(0xb66825d5, 0xedf29386), - TOBN(0xb5a5a8db, 0x431ec29b), TOBN(0xbb143a98, 0x3a1e8dc8), - TOBN(0x35ee94ce, 0x12ae381b), TOBN(0x3a7f176c, 0x86ccda90), - TOBN(0xc63a657e, 0x4606eaca), TOBN(0x9ae5a380, 0x43cd04df), - TOBN(0x9bec8d15, 0xed251b46), TOBN(0x1f5d6d30, 0xcaca5e64), - TOBN(0x347b3b35, 0x9ff20f07), TOBN(0x4d65f034, 0xf7e4b286), - TOBN(0x9e93ba24, 0xf111661e), TOBN(0xedced484, 0xb105eb04), - TOBN(0x96dc9ba1, 0xf424b578), TOBN(0xbf8f66b7, 0xe83e9069), - TOBN(0x872d4df4, 0xd7ed8216), TOBN(0xbf07f377, 0x8e2cbecf), - TOBN(0x4281d899, 0x98e73754), TOBN(0xfec85fbb, 0x8aab8708), - TOBN(0x9a3c0dee, 0xa5ba5b0b), TOBN(0xe6a116ce, 0x42d05299), - TOBN(0xae9775fe, 0xe9b02d42), TOBN(0x72b05200, 0xa1545cb6), - TOBN(0xbc506f7d, 0x31a3b4ea), TOBN(0xe5893078, 0x8bbd9b32), - TOBN(0xc8bc5f37, 0xe4b12a97), TOBN(0x6b000c06, 0x4a73b671), - TOBN(0x13b5bf22, 0x765fa7d0), TOBN(0x59805bf0, 0x1d6a5370), - TOBN(0x67a5e29d, 0x4280db98), TOBN(0x4f53916f, 0x776b1ce3), - TOBN(0x714ff61f, 0x33ddf626), TOBN(0x4206238e, 0xa085d103), - TOBN(0x1c50d4b7, 0xe5809ee3), TOBN(0x999f450d, 0x85f8eb1d), - TOBN(0x658a6051, 0xe4c79e9b), TOBN(0x1394cb73, 0xc66a9fea), - TOBN(0x27f31ed5, 0xc6be7b23), TOBN(0xf4c88f36, 0x5aa6f8fe), - TOBN(0x0fb0721f, 0x4aaa499e), TOBN(0x68b3a7d5, 0xe3fb2a6b), - TOBN(0xa788097d, 0x3a92851d), TOBN(0x060e7f8a, 0xe96f4913), - TOBN(0x82eebe73, 0x1a3a93bc), TOBN(0x42bbf465, 0xa21adc1a), - TOBN(0xc10b6fa4, 0xef030efd), TOBN(0x247aa4c7, 0x87b097bb), - TOBN(0x8b8dc632, 0xf60c77da), TOBN(0x6ffbc26a, 0xc223523e), - TOBN(0xa4f6ff11, 0x344579cf), TOBN(0x5825653c, 0x980250f6), - TOBN(0xb2dd097e, 0xbc1aa2b9), TOBN(0x07889393, 0x37a0333a), - TOBN(0x1cf55e71, 0x37a0db38), TOBN(0x2648487f, 0x792c1613), - TOBN(0xdad01336, 0x3fcef261), TOBN(0x6239c81d, 0x0eabf129), - TOBN(0x8ee761de, 0x9d276be2), TOBN(0x406a7a34, 0x1eda6ad3), - TOBN(0x4bf367ba, 0x4a493b31), TOBN(0x54f20a52, 0x9bf7f026), - TOBN(0xb696e062, 0x9795914b), TOBN(0xcddab96d, 0x8bf236ac), - TOBN(0x4ff2c70a, 0xed25ea13), TOBN(0xfa1d09eb, 0x81cbbbe7), - TOBN(0x88fc8c87, 0x468544c5), TOBN(0x847a670d, 0x696b3317), - TOBN(0xf133421e, 0x64bcb626), TOBN(0xaea638c8, 0x26dee0b5), - TOBN(0xd6e7680b, 0xb310346c), TOBN(0xe06f4097, 0xd5d4ced3), - TOBN(0x09961452, 0x7512a30b), TOBN(0xf3d867fd, 0xe589a59a), - TOBN(0x2e73254f, 0x52d0c180), TOBN(0x9063d8a3, 0x333c74ac), - TOBN(0xeda6c595, 0xd314e7bc), TOBN(0x2ee7464b, 0x467899ed), - TOBN(0x1cef423c, 0x0a1ed5d3), TOBN(0x217e76ea, 0x69cc7613), - TOBN(0x27ccce1f, 0xe7cda917), TOBN(0x12d8016b, 0x8a893f16), - TOBN(0xbcd6de84, 0x9fc74f6b), TOBN(0xfa5817e2, 0xf3144e61), - TOBN(0x1f354164, 0x0821ee4c), TOBN(0x1583eab4, 0x0bc61992), - TOBN(0x7490caf6, 0x1d72879f), TOBN(0x998ad9f3, 0xf76ae7b2), - TOBN(0x1e181950, 0xa41157f7), TOBN(0xa9d7e1e6, 0xe8da3a7e), - TOBN(0x963784eb, 0x8426b95f), TOBN(0x0ee4ed6e, 0x542e2a10), - TOBN(0xb79d4cc5, 0xac751e7b), TOBN(0x93f96472, 0xfd4211bd), - TOBN(0x8c72d3d2, 0xc8de4fc6), TOBN(0x7b69cbf5, 0xdf44f064), - TOBN(0x3da90ca2, 0xf4bf94e1), TOBN(0x1a5325f8, 0xf12894e2), - TOBN(0x0a437f6c, 0x7917d60b), TOBN(0x9be70486, 0x96c9cb5d), - TOBN(0xb4d880bf, 0xe1dc5c05), TOBN(0xd738adda, 0xeebeeb57), - TOBN(0x6f0119d3, 0xdf0fe6a3), TOBN(0x5c686e55, 0x66eaaf5a), - TOBN(0x9cb10b50, 0xdfd0b7ec), TOBN(0xbdd0264b, 0x6a497c21), - TOBN(0xfc093514, 0x8c546c96), TOBN(0x58a947fa, 0x79dbf42a), - TOBN(0xc0b48d4e, 0x49ccd6d7), TOBN(0xff8fb02c, 0x88bd5580), - TOBN(0xc75235e9, 0x07d473b2), TOBN(0x4fab1ac5, 0xa2188af3), - TOBN(0x030fa3bc, 0x97576ec0), TOBN(0xe8c946e8, 0x0b7e7d2f), - TOBN(0x40a5c9cc, 0x70305600), TOBN(0x6d8260a9, 0xc8b013b4), - TOBN(0x0368304f, 0x70bba85c), TOBN(0xad090da1, 0xa4a0d311), - TOBN(0x7170e870, 0x2415eec1), TOBN(0xbfba35fe, 0x8461ea47), - TOBN(0x6279019a, 0xc1e91938), TOBN(0xa47638f3, 0x1afc415f), - TOBN(0x36c65cbb, 0xbcba0e0f), TOBN(0x02160efb, 0x034e2c48), - TOBN(0xe6c51073, 0x615cd9e4), TOBN(0x498ec047, 0xf1243c06), - TOBN(0x3e5a8809, 0xb17b3d8c), TOBN(0x5cd99e61, 0x0cc565f1), - TOBN(0x81e312df, 0x7851dafe), TOBN(0xf156f5ba, 0xa79061e2), - TOBN(0x80d62b71, 0x880c590e), TOBN(0xbec9746f, 0x0a39faa1), - TOBN(0x1d98a9c1, 0xc8ed1f7a), TOBN(0x09e43bb5, 0xa81d5ff2), - TOBN(0xd5f00f68, 0x0da0794a), TOBN(0x412050d9, 0x661aa836), - TOBN(0xa89f7c4e, 0x90747e40), TOBN(0x6dc05ebb, 0xb62a3686), - TOBN(0xdf4de847, 0x308e3353), TOBN(0x53868fbb, 0x9fb53bb9), - TOBN(0x2b09d2c3, 0xcfdcf7dd), TOBN(0x41a9fce3, 0x723fcab4), - TOBN(0x73d905f7, 0x07f57ca3), TOBN(0x080f9fb1, 0xac8e1555), - TOBN(0x7c088e84, 0x9ba7a531), TOBN(0x07d35586, 0xed9a147f), - TOBN(0x602846ab, 0xaf48c336), TOBN(0x7320fd32, 0x0ccf0e79), - TOBN(0xaa780798, 0xb18bd1ff), TOBN(0x52c2e300, 0xafdd2905), - TOBN(0xf27ea3d6, 0x434267cd), TOBN(0x8b96d16d, 0x15605b5f), - TOBN(0x7bb31049, 0x4b45706b), TOBN(0xe7f58b8e, 0x743d25f8), - TOBN(0xe9b5e45b, 0x87f30076), TOBN(0xd19448d6, 0x5d053d5a), - TOBN(0x1ecc8cb9, 0xd3210a04), TOBN(0x6bc7d463, 0xdafb5269), - TOBN(0x3e59b10a, 0x67c3489f), TOBN(0x1769788c, 0x65641e1b), - TOBN(0x8a53b82d, 0xbd6cb838), TOBN(0x7066d6e6, 0x236d5f22), - TOBN(0x03aa1c61, 0x6908536e), TOBN(0xc971da0d, 0x66ae9809), - TOBN(0x01b3a86b, 0xc49a2fac), TOBN(0x3b8420c0, 0x3092e77a), - TOBN(0x02057300, 0x7d6fb556), TOBN(0x6941b2a1, 0xbff40a87), - TOBN(0x140b6308, 0x0658ff2a), TOBN(0x87804363, 0x3424ab36), - TOBN(0x0253bd51, 0x5751e299), TOBN(0xc75bcd76, 0x449c3e3a), - TOBN(0x92eb4090, 0x7f8f875d), TOBN(0x9c9d754e, 0x56c26bbf), - TOBN(0x158cea61, 0x8110bbe7), TOBN(0x62a6b802, 0x745f91ea), - TOBN(0xa79c41aa, 0xc6e7394b), TOBN(0x445b6a83, 0xad57ef10), - TOBN(0x0c5277eb, 0x6ea6f40c), TOBN(0x319fe96b, 0x88633365), - TOBN(0x0b0fc61f, 0x385f63cb), TOBN(0x41250c84, 0x22bdd127), - TOBN(0x67d153f1, 0x09e942c2), TOBN(0x60920d08, 0xc021ad5d), - TOBN(0x229f5746, 0x724d81a5), TOBN(0xb7ffb892, 0x5bba3299), - TOBN(0x518c51a1, 0xde413032), TOBN(0x2a9bfe77, 0x3c2fd94c), - TOBN(0xcbcde239, 0x3191f4fd), TOBN(0x43093e16, 0xd3d6ada1), - TOBN(0x184579f3, 0x58769606), TOBN(0x2c94a8b3, 0xd236625c), - TOBN(0x6922b9c0, 0x5c437d8e), TOBN(0x3d4ae423, 0xd8d9f3c8), - TOBN(0xf72c31c1, 0x2e7090a2), TOBN(0x4ac3f5f3, 0xd76a55bd), - TOBN(0x342508fc, 0x6b6af991), TOBN(0x0d527100, 0x1b5cebbd), - TOBN(0xb84740d0, 0xdd440dd7), TOBN(0x748ef841, 0x780162fd), - TOBN(0xa8dbfe0e, 0xdfc6fafb), TOBN(0xeadfdf05, 0xf7300f27), - TOBN(0x7d06555f, 0xfeba4ec9), TOBN(0x12c56f83, 0x9e25fa97), - TOBN(0x77f84203, 0xd39b8c34), TOBN(0xed8b1be6, 0x3125eddb), - TOBN(0x5bbf2441, 0xf6e39dc5), TOBN(0xb00f6ee6, 0x6a5d678a), - TOBN(0xba456ecf, 0x57d0ea99), TOBN(0xdcae0f58, 0x17e06c43), - TOBN(0x01643de4, 0x0f5b4baa), TOBN(0x2c324341, 0xd161b9be), - TOBN(0x80177f55, 0xe126d468), TOBN(0xed325f1f, 0x76748e09), - TOBN(0x6116004a, 0xcfa9bdc2), TOBN(0x2d8607e6, 0x3a9fb468), - TOBN(0x0e573e27, 0x6009d660), TOBN(0x3a525d2e, 0x8d10c5a1), - TOBN(0xd26cb45c, 0x3b9009a0), TOBN(0xb6b0cdc0, 0xde9d7448), - TOBN(0x949c9976, 0xe1337c26), TOBN(0x6faadebd, 0xd73d68e5), - TOBN(0x9e158614, 0xf1b768d9), TOBN(0x22dfa557, 0x9cc4f069), - TOBN(0xccd6da17, 0xbe93c6d6), TOBN(0x24866c61, 0xa504f5b9), - TOBN(0x2121353c, 0x8d694da1), TOBN(0x1c6ca580, 0x0140b8c6), - TOBN(0xc245ad8c, 0xe964021e), TOBN(0xb83bffba, 0x032b82b3), - TOBN(0xfaa220c6, 0x47ef9898), TOBN(0x7e8d3ac6, 0x982c948a), - TOBN(0x1faa2091, 0xbc2d124a), TOBN(0xbd54c3dd, 0x05b15ff4), - TOBN(0x386bf3ab, 0xc87c6fb7), TOBN(0xfb2b0563, 0xfdeb6f66), - TOBN(0x4e77c557, 0x5b45afb4), TOBN(0xe9ded649, 0xefb8912d), - TOBN(0x7ec9bbf5, 0x42f6e557), TOBN(0x2570dfff, 0x62671f00), - TOBN(0x2b3bfb78, 0x88e084bd), TOBN(0xa024b238, 0xf37fe5b4), - TOBN(0x44e7dc04, 0x95649aee), TOBN(0x498ca255, 0x5e7ec1d8), - TOBN(0x3bc766ea, 0xaaa07e86), TOBN(0x0db6facb, 0xf3608586), - TOBN(0xbadd2549, 0xbdc259c8), TOBN(0x95af3c6e, 0x041c649f), - TOBN(0xb36a928c, 0x02e30afb), TOBN(0x9b5356ad, 0x008a88b8), - TOBN(0x4b67a5f1, 0xcf1d9e9d), TOBN(0xc6542e47, 0xa5d8d8ce), - TOBN(0x73061fe8, 0x7adfb6cc), TOBN(0xcc826fd3, 0x98678141), - TOBN(0x00e758b1, 0x3c80515a), TOBN(0x6afe3247, 0x41485083), - TOBN(0x0fcb08b9, 0xb6ae8a75), TOBN(0xb8cf388d, 0x4acf51e1), - TOBN(0x344a5560, 0x6961b9d6), TOBN(0x1a6778b8, 0x6a97fd0c), - TOBN(0xd840fdc1, 0xecc4c7e3), TOBN(0xde9fe47d, 0x16db68cc), - TOBN(0xe95f89de, 0xa3e216aa), TOBN(0x84f1a6a4, 0x9594a8be), - TOBN(0x7ddc7d72, 0x5a7b162b), TOBN(0xc5cfda19, 0xadc817a3), - TOBN(0x80a5d350, 0x78b58d46), TOBN(0x93365b13, 0x82978f19), - TOBN(0x2e44d225, 0x26a1fc90), TOBN(0x0d6d10d2, 0x4d70705d), - TOBN(0xd94b6b10, 0xd70c45f4), TOBN(0x0f201022, 0xb216c079), - TOBN(0xcec966c5, 0x658fde41), TOBN(0xa8d2bc7d, 0x7e27601d), - TOBN(0xbfcce3e1, 0xff230be7), TOBN(0x3394ff6b, 0x0033ffb5), - TOBN(0xd890c509, 0x8132c9af), TOBN(0xaac4b0eb, 0x361e7868), - TOBN(0x5194ded3, 0xe82d15aa), TOBN(0x4550bd2e, 0x23ae6b7d), - TOBN(0x3fda318e, 0xea5399d4), TOBN(0xd989bffa, 0x91638b80), - TOBN(0x5ea124d0, 0xa14aa12d), TOBN(0x1fb1b899, 0x3667b944), - TOBN(0x95ec7969, 0x44c44d6a), TOBN(0x91df144a, 0x57e86137), - TOBN(0x915fd620, 0x73adac44), TOBN(0x8f01732d, 0x59a83801), - TOBN(0xec579d25, 0x3aa0a633), TOBN(0x06de5e7c, 0xc9d6d59c), - TOBN(0xc132f958, 0xb1ef8010), TOBN(0x29476f96, 0xe65c1a02), - TOBN(0x336a77c0, 0xd34c3565), TOBN(0xef1105b2, 0x1b9f1e9e), - TOBN(0x63e6d08b, 0xf9e08002), TOBN(0x9aff2f21, 0xc613809e), - TOBN(0xb5754f85, 0x3a80e75d), TOBN(0xde71853e, 0x6bbda681), - TOBN(0x86f041df, 0x8197fd7a), TOBN(0x8b332e08, 0x127817fa), - TOBN(0x05d99be8, 0xb9c20cda), TOBN(0x89f7aad5, 0xd5cd0c98), - TOBN(0x7ef936fe, 0x5bb94183), TOBN(0x92ca0753, 0xb05cd7f2), - TOBN(0x9d65db11, 0x74a1e035), TOBN(0x02628cc8, 0x13eaea92), - TOBN(0xf2d9e242, 0x49e4fbf2), TOBN(0x94fdfd9b, 0xe384f8b7), - TOBN(0x65f56054, 0x63428c6b), TOBN(0x2f7205b2, 0x90b409a5), - TOBN(0xf778bb78, 0xff45ae11), TOBN(0xa13045be, 0xc5ee53b2), - TOBN(0xe00a14ff, 0x03ef77fe), TOBN(0x689cd59f, 0xffef8bef), - TOBN(0x3578f0ed, 0x1e9ade22), TOBN(0xe99f3ec0, 0x6268b6a8), - TOBN(0xa2057d91, 0xea1b3c3e), TOBN(0x2d1a7053, 0xb8823a4a), - TOBN(0xabbb336a, 0x2cca451e), TOBN(0xcd2466e3, 0x2218bb5d), - TOBN(0x3ac1f42f, 0xc8cb762d), TOBN(0x7e312aae, 0x7690211f), - TOBN(0xebb9bd73, 0x45d07450), TOBN(0x207c4b82, 0x46c2213f), - TOBN(0x99d425c1, 0x375913ec), TOBN(0x94e45e96, 0x67908220), - TOBN(0xc08f3087, 0xcd67dbf6), TOBN(0xa5670fbe, 0xc0887056), - TOBN(0x6717b64a, 0x66f5b8fc), TOBN(0xd5a56aea, 0x786fec28), - TOBN(0xa8c3f55f, 0xc0ff4952), TOBN(0xa77fefae, 0x457ac49b), - TOBN(0x29882d7c, 0x98379d44), TOBN(0xd000bdfb, 0x509edc8a), - TOBN(0xc6f95979, 0xe66fe464), TOBN(0x504a6115, 0xfa61bde0), - TOBN(0x56b3b871, 0xeffea31a), TOBN(0x2d3de26d, 0xf0c21a54), - TOBN(0x21dbff31, 0x834753bf), TOBN(0xe67ecf49, 0x69269d86), - TOBN(0x7a176952, 0x151fe690), TOBN(0x03515804, 0x7f2adb5f), - TOBN(0xee794b15, 0xd1b62a8d), TOBN(0xf004ceec, 0xaae454e6), - TOBN(0x0897ea7c, 0xf0386fac), TOBN(0x3b62ff12, 0xd1fca751), - TOBN(0x154181df, 0x1b7a04ec), TOBN(0x2008e04a, 0xfb5847ec), - TOBN(0xd147148e, 0x41dbd772), TOBN(0x2b419f73, 0x22942654), - TOBN(0x669f30d3, 0xe9c544f7), TOBN(0x52a2c223, 0xc8540149), - TOBN(0x5da9ee14, 0x634dfb02), TOBN(0x5f074ff0, 0xf47869f3), - TOBN(0x74ee878d, 0xa3933acc), TOBN(0xe6510651, 0x4fe35ed1), - TOBN(0xb3eb9482, 0xf1012e7a), TOBN(0x51013cc0, 0xa8a566ae), - TOBN(0xdd5e9243, 0x47c00d3b), TOBN(0x7fde089d, 0x946bb0e5), - TOBN(0x030754fe, 0xc731b4b3), TOBN(0x12a136a4, 0x99fda062), - TOBN(0x7c1064b8, 0x5a1a35bc), TOBN(0xbf1f5763, 0x446c84ef), - TOBN(0xed29a56d, 0xa16d4b34), TOBN(0x7fba9d09, 0xdca21c4f), - TOBN(0x66d7ac00, 0x6d8de486), TOBN(0x60061987, 0x73a2a5e1), - TOBN(0x8b400f86, 0x9da28ff0), TOBN(0x3133f708, 0x43c4599c), - TOBN(0x9911c9b8, 0xee28cb0d), TOBN(0xcd7e2874, 0x8e0af61d), - TOBN(0x5a85f0f2, 0x72ed91fc), TOBN(0x85214f31, 0x9cd4a373), - TOBN(0x881fe5be, 0x1925253c), TOBN(0xd8dc98e0, 0x91e8bc76), - TOBN(0x7120affe, 0x585cc3a2), TOBN(0x724952ed, 0x735bf97a), - TOBN(0x5581e7dc, 0x3eb34581), TOBN(0x5cbff4f2, 0xe52ee57d), - TOBN(0x8d320a0e, 0x87d8cc7b), TOBN(0x9beaa7f3, 0xf1d280d0), - TOBN(0x7a0b9571, 0x9beec704), TOBN(0x9126332e, 0x5b7f0057), - TOBN(0x01fbc1b4, 0x8ed3bd6d), TOBN(0x35bb2c12, 0xd945eb24), - TOBN(0x6404694e, 0x9a8ae255), TOBN(0xb6092eec, 0x8d6abfb3), - TOBN(0x4d76143f, 0xcc058865), TOBN(0x7b0a5af2, 0x6e249922), - TOBN(0x8aef9440, 0x6a50d353), TOBN(0xe11e4bcc, 0x64f0e07a), - TOBN(0x4472993a, 0xa14a90fa), TOBN(0x7706e20c, 0xba0c51d4), - TOBN(0xf403292f, 0x1532672d), TOBN(0x52573bfa, 0x21829382), - TOBN(0x6a7bb6a9, 0x3b5bdb83), TOBN(0x08da65c0, 0xa4a72318), - TOBN(0xc58d22aa, 0x63eb065f), TOBN(0x1717596c, 0x1b15d685), - TOBN(0x112df0d0, 0xb266d88b), TOBN(0xf688ae97, 0x5941945a), - TOBN(0x487386e3, 0x7c292cac), TOBN(0x42f3b50d, 0x57d6985c), - TOBN(0x6da4f998, 0x6a90fc34), TOBN(0xc8f257d3, 0x65ca8a8d), - TOBN(0xc2feabca, 0x6951f762), TOBN(0xe1bc81d0, 0x74c323ac), - TOBN(0x1bc68f67, 0x251a2a12), TOBN(0x10d86587, 0xbe8a70dc), - TOBN(0xd648af7f, 0xf0f84d2e), TOBN(0xf0aa9ebc, 0x6a43ac92), - TOBN(0x69e3be04, 0x27596893), TOBN(0xb6bb02a6, 0x45bf452b), - TOBN(0x0875c11a, 0xf4c698c8), TOBN(0x6652b5c7, 0xbece3794), - TOBN(0x7b3755fd, 0x4f5c0499), TOBN(0x6ea16558, 0xb5532b38), - TOBN(0xd1c69889, 0xa2e96ef7), TOBN(0x9c773c3a, 0x61ed8f48), - TOBN(0x2b653a40, 0x9b323abc), TOBN(0xe26605e1, 0xf0e1d791), - TOBN(0x45d41064, 0x4a87157a), TOBN(0x8f9a78b7, 0xcbbce616), - TOBN(0xcf1e44aa, 0xc407eddd), TOBN(0x81ddd1d8, 0xa35b964f), - TOBN(0x473e339e, 0xfd083999), TOBN(0x6c94bdde, 0x8e796802), - TOBN(0x5a304ada, 0x8545d185), TOBN(0x82ae44ea, 0x738bb8cb), - TOBN(0x628a35e3, 0xdf87e10e), TOBN(0xd3624f3d, 0xa15b9fe3), - TOBN(0xcc44209b, 0x14be4254), TOBN(0x7d0efcbc, 0xbdbc2ea5), - TOBN(0x1f603362, 0x04c37bbe), TOBN(0x21f363f5, 0x56a5852c), - TOBN(0xa1503d1c, 0xa8501550), TOBN(0x2251e0e1, 0xd8ab10bb), - TOBN(0xde129c96, 0x6961c51c), TOBN(0x1f7246a4, 0x81910f68), - TOBN(0x2eb744ee, 0x5f2591f2), TOBN(0x3c47d33f, 0x5e627157), - TOBN(0x4d6d62c9, 0x22f3bd68), TOBN(0x6120a64b, 0xcb8df856), - TOBN(0x3a9ac6c0, 0x7b5d07df), TOBN(0xa92b9558, 0x7ef39783), - TOBN(0xe128a134, 0xab3a9b4f), TOBN(0x41c18807, 0xb1252f05), - TOBN(0xfc7ed089, 0x80ba9b1c), TOBN(0xac8dc6de, 0xc532a9dd), - TOBN(0xbf829cef, 0x55246809), TOBN(0x101b784f, 0x5b4ee80f), - TOBN(0xc09945bb, 0xb6f11603), TOBN(0x57b09dbe, 0x41d2801e), - TOBN(0xfba5202f, 0xa97534a8), TOBN(0x7fd8ae5f, 0xc17b9614), - TOBN(0xa50ba666, 0x78308435), TOBN(0x9572f77c, 0xd3868c4d), - TOBN(0x0cef7bfd, 0x2dd7aab0), TOBN(0xe7958e08, 0x2c7c79ff), - TOBN(0x81262e42, 0x25346689), TOBN(0x716da290, 0xb07c7004), - TOBN(0x35f911ea, 0xb7950ee3), TOBN(0x6fd72969, 0x261d21b5), - TOBN(0x52389803, 0x08b640d3), TOBN(0x5b0026ee, 0x887f12a1), - TOBN(0x20e21660, 0x742e9311), TOBN(0x0ef6d541, 0x5ff77ff7), - TOBN(0x969127f0, 0xf9c41135), TOBN(0xf21d60c9, 0x68a64993), - TOBN(0x656e5d0c, 0xe541875c), TOBN(0xf1e0f84e, 0xa1d3c233), - TOBN(0x9bcca359, 0x06002d60), TOBN(0xbe2da60c, 0x06191552), - TOBN(0x5da8bbae, 0x61181ec3), TOBN(0x9f04b823, 0x65806f19), - TOBN(0xf1604a7d, 0xd4b79bb8), TOBN(0xaee806fb, 0x52c878c8), - TOBN(0x34144f11, 0x8d47b8e8), TOBN(0x72edf52b, 0x949f9054), - TOBN(0xebfca84e, 0x2127015a), TOBN(0x9051d0c0, 0x9cb7cef3), - TOBN(0x86e8fe58, 0x296deec8), TOBN(0x33b28188, 0x41010d74)}, - {TOBN(0x01079383, 0x171b445f), TOBN(0x9bcf21e3, 0x8131ad4c), - TOBN(0x8cdfe205, 0xc93987e8), TOBN(0xe63f4152, 0xc92e8c8f), - TOBN(0x729462a9, 0x30add43d), TOBN(0x62ebb143, 0xc980f05a), - TOBN(0x4f3954e5, 0x3b06e968), TOBN(0xfe1d75ad, 0x242cf6b1), - TOBN(0x5f95c6c7, 0xaf8685c8), TOBN(0xd4c1c8ce, 0x2f8f01aa), - TOBN(0xc44bbe32, 0x2574692a), TOBN(0xb8003478, 0xd4a4a068), - TOBN(0x7c8fc6e5, 0x2eca3cdb), TOBN(0xea1db16b, 0xec04d399), - TOBN(0xb05bc82e, 0x8f2bc5cf), TOBN(0x763d517f, 0xf44793d2), - TOBN(0x4451c1b8, 0x08bd98d0), TOBN(0x644b1cd4, 0x6575f240), - TOBN(0x6907eb33, 0x7375d270), TOBN(0x56c8bebd, 0xfa2286bd), - TOBN(0xc713d2ac, 0xc4632b46), TOBN(0x17da427a, 0xafd60242), - TOBN(0x313065b7, 0xc95c7546), TOBN(0xf8239898, 0xbf17a3de), - TOBN(0xf3b7963f, 0x4c830320), TOBN(0x842c7aa0, 0x903203e3), - TOBN(0xaf22ca0a, 0xe7327afb), TOBN(0x38e13092, 0x967609b6), - TOBN(0x73b8fb62, 0x757558f1), TOBN(0x3cc3e831, 0xf7eca8c1), - TOBN(0xe4174474, 0xf6331627), TOBN(0xa77989ca, 0xc3c40234), - TOBN(0xe5fd17a1, 0x44a081e0), TOBN(0xd797fb7d, 0xb70e296a), - TOBN(0x2b472b30, 0x481f719c), TOBN(0x0e632a98, 0xfe6f8c52), - TOBN(0x89ccd116, 0xc5f0c284), TOBN(0xf51088af, 0x2d987c62), - TOBN(0x2a2bccda, 0x4c2de6cf), TOBN(0x810f9efe, 0xf679f0f9), - TOBN(0xb0f394b9, 0x7ffe4b3e), TOBN(0x0b691d21, 0xe5fa5d21), - TOBN(0xb0bd7747, 0x9dfbbc75), TOBN(0xd2830fda, 0xfaf78b00), - TOBN(0xf78c249c, 0x52434f57), TOBN(0x4b1f7545, 0x98096dab), - TOBN(0x73bf6f94, 0x8ff8c0b3), TOBN(0x34aef03d, 0x454e134c), - TOBN(0xf8d151f4, 0xb7ac7ec5), TOBN(0xd6ceb95a, 0xe50da7d5), - TOBN(0xa1b492b0, 0xdc3a0eb8), TOBN(0x75157b69, 0xb3dd2863), - TOBN(0xe2c4c74e, 0xc5413d62), TOBN(0xbe329ff7, 0xbc5fc4c7), - TOBN(0x835a2aea, 0x60fa9dda), TOBN(0xf117f5ad, 0x7445cb87), - TOBN(0xae8317f4, 0xb0166f7a), TOBN(0xfbd3e3f7, 0xceec74e6), - TOBN(0xfdb516ac, 0xe0874bfd), TOBN(0x3d846019, 0xc681f3a3), - TOBN(0x0b12ee5c, 0x7c1620b0), TOBN(0xba68b4dd, 0x2b63c501), - TOBN(0xac03cd32, 0x6668c51e), TOBN(0x2a6279f7, 0x4e0bcb5b), - TOBN(0x17bd69b0, 0x6ae85c10), TOBN(0x72946979, 0x1dfdd3a6), - TOBN(0xd9a03268, 0x2c078bec), TOBN(0x41c6a658, 0xbfd68a52), - TOBN(0xcdea1024, 0x0e023900), TOBN(0xbaeec121, 0xb10d144d), - TOBN(0x5a600e74, 0x058ab8dc), TOBN(0x1333af21, 0xbb89ccdd), - TOBN(0xdf25eae0, 0x3aaba1f1), TOBN(0x2cada16e, 0x3b7144cf), - TOBN(0x657ee27d, 0x71ab98bc), TOBN(0x99088b4c, 0x7a6fc96e), - TOBN(0x05d5c0a0, 0x3549dbd4), TOBN(0x42cbdf8f, 0xf158c3ac), - TOBN(0x3fb6b3b0, 0x87edd685), TOBN(0x22071cf6, 0x86f064d0), - TOBN(0xd2d6721f, 0xff2811e5), TOBN(0xdb81b703, 0xfe7fae8c), - TOBN(0x3cfb74ef, 0xd3f1f7bb), TOBN(0x0cdbcd76, 0x16cdeb5d), - TOBN(0x4f39642a, 0x566a808c), TOBN(0x02b74454, 0x340064d6), - TOBN(0xfabbadca, 0x0528fa6f), TOBN(0xe4c3074c, 0xd3fc0bb6), - TOBN(0xb32cb8b0, 0xb796d219), TOBN(0xc3e95f4f, 0x34741dd9), - TOBN(0x87212125, 0x68edf6f5), TOBN(0x7a03aee4, 0xa2b9cb8e), - TOBN(0x0cd3c376, 0xf53a89aa), TOBN(0x0d8af9b1, 0x948a28dc), - TOBN(0xcf86a3f4, 0x902ab04f), TOBN(0x8aacb62a, 0x7f42002d), - TOBN(0x106985eb, 0xf62ffd52), TOBN(0xe670b54e, 0x5797bf10), - TOBN(0x4b405209, 0xc5e30aef), TOBN(0x12c97a20, 0x4365b5e9), - TOBN(0x104646ce, 0x1fe32093), TOBN(0x13cb4ff6, 0x3907a8c9), - TOBN(0x8b9f30d1, 0xd46e726b), TOBN(0xe1985e21, 0xaba0f499), - TOBN(0xc573dea9, 0x10a230cd), TOBN(0x24f46a93, 0xcd30f947), - TOBN(0xf2623fcf, 0xabe2010a), TOBN(0x3f278cb2, 0x73f00e4f), - TOBN(0xed55c67d, 0x50b920eb), TOBN(0xf1cb9a2d, 0x8e760571), - TOBN(0x7c50d109, 0x0895b709), TOBN(0x4207cf07, 0x190d4369), - TOBN(0x3b027e81, 0xc4127fe1), TOBN(0xa9f8b9ad, 0x3ae9c566), - TOBN(0x5ab10851, 0xacbfbba5), TOBN(0xa747d648, 0x569556f5), - TOBN(0xcc172b5c, 0x2ba97bf7), TOBN(0x15e0f77d, 0xbcfa3324), - TOBN(0xa345b797, 0x7686279d), TOBN(0x5a723480, 0xe38003d3), - TOBN(0xfd8e139f, 0x8f5fcda8), TOBN(0xf3e558c4, 0xbdee5bfd), - TOBN(0xd76cbaf4, 0xe33f9f77), TOBN(0x3a4c97a4, 0x71771969), - TOBN(0xda27e84b, 0xf6dce6a7), TOBN(0xff373d96, 0x13e6c2d1), - TOBN(0xf115193c, 0xd759a6e9), TOBN(0x3f9b7025, 0x63d2262c), - TOBN(0xd9764a31, 0x317cd062), TOBN(0x30779d8e, 0x199f8332), - TOBN(0xd8074106, 0x16b11b0b), TOBN(0x7917ab9f, 0x78aeaed8), - TOBN(0xb67a9cbe, 0x28fb1d8e), TOBN(0x2e313563, 0x136eda33), - TOBN(0x010b7069, 0xa371a86c), TOBN(0x44d90fa2, 0x6744e6b7), - TOBN(0x68190867, 0xd6b3e243), TOBN(0x9fe6cd9d, 0x59048c48), - TOBN(0xb900b028, 0x95731538), TOBN(0xa012062f, 0x32cae04f), - TOBN(0x8107c8bc, 0x9399d082), TOBN(0x47e8c54a, 0x41df12e2), - TOBN(0x14ba5117, 0xb6ef3f73), TOBN(0x22260bea, 0x81362f0b), - TOBN(0x90ea261e, 0x1a18cc20), TOBN(0x2192999f, 0x2321d636), - TOBN(0xef64d314, 0xe311b6a0), TOBN(0xd7401e4c, 0x3b54a1f5), - TOBN(0x19019983, 0x6fbca2ba), TOBN(0x46ad3293, 0x8fbffc4b), - TOBN(0xa142d3f6, 0x3786bf40), TOBN(0xeb5cbc26, 0xb67039fc), - TOBN(0x9cb0ae6c, 0x252bd479), TOBN(0x05e0f88a, 0x12b5848f), - TOBN(0x78f6d2b2, 0xa5c97663), TOBN(0x6f6e149b, 0xc162225c), - TOBN(0xe602235c, 0xde601a89), TOBN(0xd17bbe98, 0xf373be1f), - TOBN(0xcaf49a5b, 0xa8471827), TOBN(0x7e1a0a85, 0x18aaa116), - TOBN(0x6c833196, 0x270580c3), TOBN(0x1e233839, 0xf1c98a14), - TOBN(0x67b2f7b4, 0xae34e0a5), TOBN(0x47ac8745, 0xd8ce7289), - TOBN(0x2b74779a, 0x100dd467), TOBN(0x274a4337, 0x4ee50d09), - TOBN(0x603dcf13, 0x83608bc9), TOBN(0xcd9da6c3, 0xc89e8388), - TOBN(0x2660199f, 0x355116ac), TOBN(0xcc38bb59, 0xb6d18eed), - TOBN(0x3075f31f, 0x2f4bc071), TOBN(0x9774457f, 0x265dc57e), - TOBN(0x06a6a9c8, 0xc6db88bb), TOBN(0x6429d07f, 0x4ec98e04), - TOBN(0x8d05e57b, 0x05ecaa8b), TOBN(0x20f140b1, 0x7872ea7b), - TOBN(0xdf8c0f09, 0xca494693), TOBN(0x48d3a020, 0xf252e909), - TOBN(0x4c5c29af, 0x57b14b12), TOBN(0x7e6fa37d, 0xbf47ad1c), - TOBN(0x66e7b506, 0x49a0c938), TOBN(0xb72c0d48, 0x6be5f41f), - TOBN(0x6a6242b8, 0xb2359412), TOBN(0xcd35c774, 0x8e859480), - TOBN(0x12536fea, 0x87baa627), TOBN(0x58c1fec1, 0xf72aa680), - TOBN(0x6c29b637, 0x601e5dc9), TOBN(0x9e3c3c1c, 0xde9e01b9), - TOBN(0xefc8127b, 0x2bcfe0b0), TOBN(0x35107102, 0x2a12f50d), - TOBN(0x6ccd6cb1, 0x4879b397), TOBN(0xf792f804, 0xf8a82f21), - TOBN(0x509d4804, 0xa9b46402), TOBN(0xedddf85d, 0xc10f0850), - TOBN(0x928410dc, 0x4b6208aa), TOBN(0xf6229c46, 0x391012dc), - TOBN(0xc5a7c41e, 0x7727b9b6), TOBN(0x289e4e4b, 0xaa444842), - TOBN(0x049ba1d9, 0xe9a947ea), TOBN(0x44f9e47f, 0x83c8debc), - TOBN(0xfa77a1fe, 0x611f8b8e), TOBN(0xfd2e416a, 0xf518f427), - TOBN(0xc5fffa70, 0x114ebac3), TOBN(0xfe57c4e9, 0x5d89697b), - TOBN(0xfdd053ac, 0xb1aaf613), TOBN(0x31df210f, 0xea585a45), - TOBN(0x318cc10e, 0x24985034), TOBN(0x1a38efd1, 0x5f1d6130), - TOBN(0xbf86f237, 0x0b1e9e21), TOBN(0xb258514d, 0x1dbe88aa), - TOBN(0x1e38a588, 0x90c1baf9), TOBN(0x2936a01e, 0xbdb9b692), - TOBN(0xd576de98, 0x6dd5b20c), TOBN(0xb586bf71, 0x70f98ecf), - TOBN(0xcccf0f12, 0xc42d2fd7), TOBN(0x8717e61c, 0xfb35bd7b), - TOBN(0x8b1e5722, 0x35e6fc06), TOBN(0x3477728f, 0x0b3e13d5), - TOBN(0x150c294d, 0xaa8a7372), TOBN(0xc0291d43, 0x3bfa528a), - TOBN(0xc6c8bc67, 0xcec5a196), TOBN(0xdeeb31e4, 0x5c2e8a7c), - TOBN(0xba93e244, 0xfb6e1c51), TOBN(0xb9f8b71b, 0x2e28e156), - TOBN(0xce65a287, 0x968a2ab9), TOBN(0xe3c5ce69, 0x46bbcb1f), - TOBN(0xf8c835b9, 0xe7ae3f30), TOBN(0x16bbee26, 0xff72b82b), - TOBN(0x665e2017, 0xfd42cd22), TOBN(0x1e139970, 0xf8b1d2a0), - TOBN(0x125cda29, 0x79204932), TOBN(0x7aee94a5, 0x49c3bee5), - TOBN(0x68c70160, 0x89821a66), TOBN(0xf7c37678, 0x8f981669), - TOBN(0xd90829fc, 0x48cc3645), TOBN(0x346af049, 0xd70addfc), - TOBN(0x2057b232, 0x370bf29c), TOBN(0xf90c73ce, 0x42e650ee), - TOBN(0xe03386ea, 0xa126ab90), TOBN(0x0e266e7e, 0x975a087b), - TOBN(0x80578eb9, 0x0fca65d9), TOBN(0x7e2989ea, 0x16af45b8), - TOBN(0x7438212d, 0xcac75a4e), TOBN(0x38c7ca39, 0x4fef36b8), - TOBN(0x8650c494, 0xd402676a), TOBN(0x26ab5a66, 0xf72c7c48), - TOBN(0x4e6cb426, 0xce3a464e), TOBN(0xf8f99896, 0x2b72f841), - TOBN(0x8c318491, 0x1a335cc8), TOBN(0x563459ba, 0x6a5913e4), - TOBN(0x1b920d61, 0xc7b32919), TOBN(0x805ab8b6, 0xa02425ad), - TOBN(0x2ac512da, 0x8d006086), TOBN(0x6ca4846a, 0xbcf5c0fd), - TOBN(0xafea51d8, 0xac2138d7), TOBN(0xcb647545, 0x344cd443), - TOBN(0x0429ee8f, 0xbd7d9040), TOBN(0xee66a2de, 0x819b9c96), - TOBN(0x54f9ec25, 0xdea7d744), TOBN(0x2ffea642, 0x671721bb), - TOBN(0x4f19dbd1, 0x114344ea), TOBN(0x04304536, 0xfd0dbc8b), - TOBN(0x014b50aa, 0x29ec7f91), TOBN(0xb5fc22fe, 0xbb06014d), - TOBN(0x60d963a9, 0x1ee682e0), TOBN(0xdf48abc0, 0xfe85c727), - TOBN(0x0cadba13, 0x2e707c2d), TOBN(0xde608d3a, 0xa645aeff), - TOBN(0x05f1c28b, 0xedafd883), TOBN(0x3c362ede, 0xbd94de1f), - TOBN(0x8dd0629d, 0x13593e41), TOBN(0x0a5e736f, 0x766d6eaf), - TOBN(0xbfa92311, 0xf68cf9d1), TOBN(0xa4f9ef87, 0xc1797556), - TOBN(0x10d75a1f, 0x5601c209), TOBN(0x651c374c, 0x09b07361), - TOBN(0x49950b58, 0x88b5cead), TOBN(0x0ef00058, 0x6fa9dbaa), - TOBN(0xf51ddc26, 0x4e15f33a), TOBN(0x1f8b5ca6, 0x2ef46140), - TOBN(0x343ac0a3, 0xee9523f0), TOBN(0xbb75eab2, 0x975ea978), - TOBN(0x1bccf332, 0x107387f4), TOBN(0x790f9259, 0x9ab0062e), - TOBN(0xf1a363ad, 0x1e4f6a5f), TOBN(0x06e08b84, 0x62519a50), - TOBN(0x60915187, 0x7265f1ee), TOBN(0x6a80ca34, 0x93ae985e), - TOBN(0x81b29768, 0xaaba4864), TOBN(0xb13cabf2, 0x8d52a7d6), - TOBN(0xb5c36348, 0x8ead03f1), TOBN(0xc932ad95, 0x81c7c1c0), - TOBN(0x5452708e, 0xcae1e27b), TOBN(0x9dac4269, 0x1b0df648), - TOBN(0x233e3f0c, 0xdfcdb8bc), TOBN(0xe6ceccdf, 0xec540174), - TOBN(0xbd0d845e, 0x95081181), TOBN(0xcc8a7920, 0x699355d5), - TOBN(0x111c0f6d, 0xc3b375a8), TOBN(0xfd95bc6b, 0xfd51e0dc), - TOBN(0x4a106a26, 0x6888523a), TOBN(0x4d142bd6, 0xcb01a06d), - TOBN(0x79bfd289, 0xadb9b397), TOBN(0x0bdbfb94, 0xe9863914), - TOBN(0x29d8a229, 0x1660f6a6), TOBN(0x7f6abcd6, 0x551c042d), - TOBN(0x13039deb, 0x0ac3ffe8), TOBN(0xa01be628, 0xec8523fb), - TOBN(0x6ea34103, 0x0ca1c328), TOBN(0xc74114bd, 0xb903928e), - TOBN(0x8aa4ff4e, 0x9e9144b0), TOBN(0x7064091f, 0x7f9a4b17), - TOBN(0xa3f4f521, 0xe447f2c4), TOBN(0x81b8da7a, 0x604291f0), - TOBN(0xd680bc46, 0x7d5926de), TOBN(0x84f21fd5, 0x34a1202f), - TOBN(0x1d1e3181, 0x4e9df3d8), TOBN(0x1ca4861a, 0x39ab8d34), - TOBN(0x809ddeec, 0x5b19aa4a), TOBN(0x59f72f7e, 0x4d329366), - TOBN(0xa2f93f41, 0x386d5087), TOBN(0x40bf739c, 0xdd67d64f), - TOBN(0xb4494205, 0x66702158), TOBN(0xc33c65be, 0x73b1e178), - TOBN(0xcdcd657c, 0x38ca6153), TOBN(0x97f4519a, 0xdc791976), - TOBN(0xcc7c7f29, 0xcd6e1f39), TOBN(0x38de9cfb, 0x7e3c3932), - TOBN(0xe448eba3, 0x7b793f85), TOBN(0xe9f8dbf9, 0xf067e914), - TOBN(0xc0390266, 0xf114ae87), TOBN(0x39ed75a7, 0xcd6a8e2a), - TOBN(0xadb14848, 0x7ffba390), TOBN(0x67f8cb8b, 0x6af9bc09), - TOBN(0x322c3848, 0x9c7476db), TOBN(0xa320fecf, 0x52a538d6), - TOBN(0xe0493002, 0xb2aced2b), TOBN(0xdfba1809, 0x616bd430), - TOBN(0x531c4644, 0xc331be70), TOBN(0xbc04d32e, 0x90d2e450), - TOBN(0x1805a0d1, 0x0f9f142d), TOBN(0x2c44a0c5, 0x47ee5a23), - TOBN(0x31875a43, 0x3989b4e3), TOBN(0x6b1949fd, 0x0c063481), - TOBN(0x2dfb9e08, 0xbe0f4492), TOBN(0x3ff0da03, 0xe9d5e517), - TOBN(0x03dbe9a1, 0xf79466a8), TOBN(0x0b87bcd0, 0x15ea9932), - TOBN(0xeb64fc83, 0xab1f58ab), TOBN(0x6d9598da, 0x817edc8a), - TOBN(0x699cff66, 0x1d3b67e5), TOBN(0x645c0f29, 0x92635853), - TOBN(0x253cdd82, 0xeabaf21c), TOBN(0x82b9602a, 0x2241659e), - TOBN(0x2cae07ec, 0x2d9f7091), TOBN(0xbe4c720c, 0x8b48cd9b), - TOBN(0x6ce5bc03, 0x6f08d6c9), TOBN(0x36e8a997, 0xaf10bf40), - TOBN(0x83422d21, 0x3e10ff12), TOBN(0x7b26d3eb, 0xbcc12494), - TOBN(0xb240d2d0, 0xc9469ad6), TOBN(0xc4a11b4d, 0x30afa05b), - TOBN(0x4b604ace, 0xdd6ba286), TOBN(0x18486600, 0x3ee2864c), - TOBN(0x5869d6ba, 0x8d9ce5be), TOBN(0x0d8f68c5, 0xff4bfb0d), - TOBN(0xb69f210b, 0x5700cf73), TOBN(0x61f6653a, 0x6d37c135), - TOBN(0xff3d432b, 0x5aff5a48), TOBN(0x0d81c4b9, 0x72ba3a69), - TOBN(0xee879ae9, 0xfa1899ef), TOBN(0xbac7e2a0, 0x2d6acafd), - TOBN(0xd6d93f6c, 0x1c664399), TOBN(0x4c288de1, 0x5bcb135d), - TOBN(0x83031dab, 0x9dab7cbf), TOBN(0xfe23feb0, 0x3abbf5f0), - TOBN(0x9f1b2466, 0xcdedca85), TOBN(0x140bb710, 0x1a09538c), - TOBN(0xac8ae851, 0x5e11115d), TOBN(0x0d63ff67, 0x6f03f59e), - TOBN(0x755e5551, 0x7d234afb), TOBN(0x61c2db4e, 0x7e208fc1), - TOBN(0xaa9859ce, 0xf28a4b5d), TOBN(0xbdd6d4fc, 0x34af030f), - TOBN(0xd1c4a26d, 0x3be01cb1), TOBN(0x9ba14ffc, 0x243aa07c), - TOBN(0xf95cd3a9, 0xb2503502), TOBN(0xe379bc06, 0x7d2a93ab), - TOBN(0x3efc18e9, 0xd4ca8d68), TOBN(0x083558ec, 0x80bb412a), - TOBN(0xd903b940, 0x9645a968), TOBN(0xa499f0b6, 0x9ba6054f), - TOBN(0x208b573c, 0xb8349abe), TOBN(0x3baab3e5, 0x30b4fc1c), - TOBN(0x87e978ba, 0xcb524990), TOBN(0x3524194e, 0xccdf0e80), - TOBN(0x62711725, 0x7d4bcc42), TOBN(0xe90a3d9b, 0xb90109ba), - TOBN(0x3b1bdd57, 0x1323e1e0), TOBN(0xb78e9bd5, 0x5eae1599), - TOBN(0x0794b746, 0x9e03d278), TOBN(0x80178605, 0xd70e6297), - TOBN(0x171792f8, 0x99c97855), TOBN(0x11b393ee, 0xf5a86b5c), - TOBN(0x48ef6582, 0xd8884f27), TOBN(0xbd44737a, 0xbf19ba5f), - TOBN(0x8698de4c, 0xa42062c6), TOBN(0x8975eb80, 0x61ce9c54), - TOBN(0xd50e57c7, 0xd7fe71f3), TOBN(0x15342190, 0xbc97ce38), - TOBN(0x51bda2de, 0x4df07b63), TOBN(0xba12aeae, 0x200eb87d), - TOBN(0xabe135d2, 0xa9b4f8f6), TOBN(0x04619d65, 0xfad6d99c), - TOBN(0x4a6683a7, 0x7994937c), TOBN(0x7a778c8b, 0x6f94f09a), - TOBN(0x8c508623, 0x20a71b89), TOBN(0x241a2aed, 0x1c229165), - TOBN(0x352be595, 0xaaf83a99), TOBN(0x9fbfee7f, 0x1562bac8), - TOBN(0xeaf658b9, 0x5c4017e3), TOBN(0x1dc7f9e0, 0x15120b86), - TOBN(0xd84f13dd, 0x4c034d6f), TOBN(0x283dd737, 0xeaea3038), - TOBN(0x197f2609, 0xcd85d6a2), TOBN(0x6ebbc345, 0xfae60177), - TOBN(0xb80f031b, 0x4e12fede), TOBN(0xde55d0c2, 0x07a2186b), - TOBN(0x1fb3e37f, 0x24dcdd5a), TOBN(0x8d602da5, 0x7ed191fb), - TOBN(0x108fb056, 0x76023e0d), TOBN(0x70178c71, 0x459c20c0), - TOBN(0xfad5a386, 0x3fe54cf0), TOBN(0xa4a3ec4f, 0x02bbb475), - TOBN(0x1aa5ec20, 0x919d94d7), TOBN(0x5d3b63b5, 0xa81e4ab3), - TOBN(0x7fa733d8, 0x5ad3d2af), TOBN(0xfbc586dd, 0xd1ac7a37), - TOBN(0x282925de, 0x40779614), TOBN(0xfe0ffffb, 0xe74a242a), - TOBN(0x3f39e67f, 0x906151e5), TOBN(0xcea27f5f, 0x55e10649), - TOBN(0xdca1d4e1, 0xc17cf7b7), TOBN(0x0c326d12, 0x2fe2362d), - TOBN(0x05f7ac33, 0x7dd35df3), TOBN(0x0c3b7639, 0xc396dbdf), - TOBN(0x0912f5ac, 0x03b7db1c), TOBN(0x9dea4b70, 0x5c9ed4a9), - TOBN(0x475e6e53, 0xaae3f639), TOBN(0xfaba0e7c, 0xfc278bac), - TOBN(0x16f9e221, 0x9490375f), TOBN(0xaebf9746, 0xa5a7ed0a), - TOBN(0x45f9af3f, 0xf41ad5d6), TOBN(0x03c4623c, 0xb2e99224), - TOBN(0x82c5bb5c, 0xb3cf56aa), TOBN(0x64311819, 0x34567ed3), - TOBN(0xec57f211, 0x8be489ac), TOBN(0x2821895d, 0xb9a1104b), - TOBN(0x610dc875, 0x6064e007), TOBN(0x8e526f3f, 0x5b20d0fe), - TOBN(0x6e71ca77, 0x5b645aee), TOBN(0x3d1dcb9f, 0x800e10ff), - TOBN(0x36b51162, 0x189cf6de), TOBN(0x2c5a3e30, 0x6bb17353), - TOBN(0xc186cd3e, 0x2a6c6fbf), TOBN(0xa74516fa, 0x4bf97906), - TOBN(0x5b4b8f4b, 0x279d6901), TOBN(0x0c4e57b4, 0x2b573743), - TOBN(0x75fdb229, 0xb6e386b6), TOBN(0xb46793fd, 0x99deac27), - TOBN(0xeeec47ea, 0xcf712629), TOBN(0xe965f3c4, 0xcbc3b2dd), - TOBN(0x8dd1fb83, 0x425c6559), TOBN(0x7fc00ee6, 0x0af06fda), - TOBN(0xe98c9225, 0x33d956df), TOBN(0x0f1ef335, 0x4fbdc8a2), - TOBN(0x2abb5145, 0xb79b8ea2), TOBN(0x40fd2945, 0xbdbff288), - TOBN(0x6a814ac4, 0xd7185db7), TOBN(0xc4329d6f, 0xc084609a), - TOBN(0xc9ba7b52, 0xed1be45d), TOBN(0x891dd20d, 0xe4cd2c74), - TOBN(0x5a4d4a7f, 0x824139b1), TOBN(0x66c17716, 0xb873c710), - TOBN(0x5e5bc141, 0x2843c4e0), TOBN(0xd5ac4817, 0xb97eb5bf), - TOBN(0xc0f8af54, 0x450c95c7), TOBN(0xc91b3fa0, 0x318406c5), - TOBN(0x360c340a, 0xab9d97f8), TOBN(0xfb57bd07, 0x90a2d611), - TOBN(0x4339ae3c, 0xa6a6f7e5), TOBN(0x9c1fcd2a, 0x2feb8a10), - TOBN(0x972bcca9, 0xc7ea7432), TOBN(0x1b0b924c, 0x308076f6), - TOBN(0x80b2814a, 0x2a5b4ca5), TOBN(0x2f78f55b, 0x61ef3b29), - TOBN(0xf838744a, 0xc18a414f), TOBN(0xc611eaae, 0x903d0a86), - TOBN(0x94dabc16, 0x2a453f55), TOBN(0xe6f2e3da, 0x14efb279), - TOBN(0x5b7a6017, 0x9320dc3c), TOBN(0x692e382f, 0x8df6b5a4), - TOBN(0x3f5e15e0, 0x2d40fa90), TOBN(0xc87883ae, 0x643dd318), - TOBN(0x511053e4, 0x53544774), TOBN(0x834d0ecc, 0x3adba2bc), - TOBN(0x4215d7f7, 0xbae371f5), TOBN(0xfcfd57bf, 0x6c8663bc), - TOBN(0xded2383d, 0xd6901b1d), TOBN(0x3b49fbb4, 0xb5587dc3), - TOBN(0xfd44a08d, 0x07625f62), TOBN(0x3ee4d65b, 0x9de9b762)}, - {TOBN(0x64e5137d, 0x0d63d1fa), TOBN(0x658fc052, 0x02a9d89f), - TOBN(0x48894874, 0x50436309), TOBN(0xe9ae30f8, 0xd598da61), - TOBN(0x2ed710d1, 0x818baf91), TOBN(0xe27e9e06, 0x8b6a0c20), - TOBN(0x1e28dcfb, 0x1c1a6b44), TOBN(0x883acb64, 0xd6ac57dc), - TOBN(0x8735728d, 0xc2c6ff70), TOBN(0x79d6122f, 0xc5dc2235), - TOBN(0x23f5d003, 0x19e277f9), TOBN(0x7ee84e25, 0xdded8cc7), - TOBN(0x91a8afb0, 0x63cd880a), TOBN(0x3f3ea7c6, 0x3574af60), - TOBN(0x0cfcdc84, 0x02de7f42), TOBN(0x62d0792f, 0xb31aa152), - TOBN(0x8e1b4e43, 0x8a5807ce), TOBN(0xad283893, 0xe4109a7e), - TOBN(0xc30cc9cb, 0xafd59dda), TOBN(0xf65f36c6, 0x3d8d8093), - TOBN(0xdf31469e, 0xa60d32b2), TOBN(0xee93df4b, 0x3e8191c8), - TOBN(0x9c1017c5, 0x355bdeb5), TOBN(0xd2623185, 0x8616aa28), - TOBN(0xb02c83f9, 0xdec31a21), TOBN(0x988c8b23, 0x6ad9d573), - TOBN(0x53e983ae, 0xa57be365), TOBN(0xe968734d, 0x646f834e), - TOBN(0x9137ea8f, 0x5da6309b), TOBN(0x10f3a624, 0xc1f1ce16), - TOBN(0x782a9ea2, 0xca440921), TOBN(0xdf94739e, 0x5b46f1b5), - TOBN(0x9f9be006, 0xcce85c9b), TOBN(0x360e70d6, 0xa4c7c2d3), - TOBN(0x2cd5beea, 0xaefa1e60), TOBN(0x64cf63c0, 0x8c3d2b6d), - TOBN(0xfb107fa3, 0xe1cf6f90), TOBN(0xb7e937c6, 0xd5e044e6), - TOBN(0x74e8ca78, 0xce34db9f), TOBN(0x4f8b36c1, 0x3e210bd0), - TOBN(0x1df165a4, 0x34a35ea8), TOBN(0x3418e0f7, 0x4d4412f6), - TOBN(0x5af1f8af, 0x518836c3), TOBN(0x42ceef4d, 0x130e1965), - TOBN(0x5560ca0b, 0x543a1957), TOBN(0xc33761e5, 0x886cb123), - TOBN(0x66624b1f, 0xfe98ed30), TOBN(0xf772f4bf, 0x1090997d), - TOBN(0xf4e540bb, 0x4885d410), TOBN(0x7287f810, 0x9ba5f8d7), - TOBN(0x22d0d865, 0xde98dfb1), TOBN(0x49ff51a1, 0xbcfbb8a3), - TOBN(0xb6b6fa53, 0x6bc3012e), TOBN(0x3d31fd72, 0x170d541d), - TOBN(0x8018724f, 0x4b0f4966), TOBN(0x79e7399f, 0x87dbde07), - TOBN(0x56f8410e, 0xf4f8b16a), TOBN(0x97241afe, 0xc47b266a), - TOBN(0x0a406b8e, 0x6d9c87c1), TOBN(0x803f3e02, 0xcd42ab1b), - TOBN(0x7f0309a8, 0x04dbec69), TOBN(0xa83b85f7, 0x3bbad05f), - TOBN(0xc6097273, 0xad8e197f), TOBN(0xc097440e, 0x5067adc1), - TOBN(0x730eafb6, 0x3524ff16), TOBN(0xd7f9b51e, 0x823fc6ce), - TOBN(0x27bd0d32, 0x443e4ac0), TOBN(0x40c59ad9, 0x4d66f217), - TOBN(0x6c33136f, 0x17c387a4), TOBN(0x5043b8d5, 0xeb86804d), - TOBN(0x74970312, 0x675a73c9), TOBN(0x838fdb31, 0xf16669b6), - TOBN(0xc507b6dd, 0x418e7ddd), TOBN(0x39888d93, 0x472f19d6), - TOBN(0x7eae26be, 0x0c27eb4d), TOBN(0x17b53ed3, 0xfbabb884), - TOBN(0xfc27021b, 0x2b01ae4f), TOBN(0x88462e87, 0xcf488682), - TOBN(0xbee096ec, 0x215e2d87), TOBN(0xeb2fea9a, 0xd242e29b), - TOBN(0x5d985b5f, 0xb821fc28), TOBN(0x89d2e197, 0xdc1e2ad2), - TOBN(0x55b566b8, 0x9030ba62), TOBN(0xe3fd41b5, 0x4f41b1c6), - TOBN(0xb738ac2e, 0xb9a96d61), TOBN(0x7f8567ca, 0x369443f4), - TOBN(0x8698622d, 0xf803a440), TOBN(0x2b586236, 0x8fe2f4dc), - TOBN(0xbbcc00c7, 0x56b95bce), TOBN(0x5ec03906, 0x616da680), - TOBN(0x79162ee6, 0x72214252), TOBN(0x43132b63, 0x86a892d2), - TOBN(0x4bdd3ff2, 0x2f3263bf), TOBN(0xd5b3733c, 0x9cd0a142), - TOBN(0x592eaa82, 0x44415ccb), TOBN(0x663e8924, 0x8d5474ea), - TOBN(0x8058a25e, 0x5236344e), TOBN(0x82e8df9d, 0xbda76ee6), - TOBN(0xdcf6efd8, 0x11cc3d22), TOBN(0x00089cda, 0x3b4ab529), - TOBN(0x91d3a071, 0xbd38a3db), TOBN(0x4ea97fc0, 0xef72b925), - TOBN(0x0c9fc15b, 0xea3edf75), TOBN(0x5a6297cd, 0xa4348ed3), - TOBN(0x0d38ab35, 0xce7c42d4), TOBN(0x9fd493ef, 0x82feab10), - TOBN(0x46056b6d, 0x82111b45), TOBN(0xda11dae1, 0x73efc5c3), - TOBN(0xdc740278, 0x5545a7fb), TOBN(0xbdb2601c, 0x40d507e6), - TOBN(0x121dfeeb, 0x7066fa58), TOBN(0x214369a8, 0x39ae8c2a), - TOBN(0x195709cb, 0x06e0956c), TOBN(0x4c9d254f, 0x010cd34b), - TOBN(0xf51e13f7, 0x0471a532), TOBN(0xe19d6791, 0x1e73054d), - TOBN(0xf702a628, 0xdb5c7be3), TOBN(0xc7141218, 0xb24dde05), - TOBN(0xdc18233c, 0xf29b2e2e), TOBN(0x3a6bd1e8, 0x85342dba), - TOBN(0x3f747fa0, 0xb311898c), TOBN(0xe2a272e4, 0xcd0eac65), - TOBN(0x4bba5851, 0xf914d0bc), TOBN(0x7a1a9660, 0xc4a43ee3), - TOBN(0xe5a367ce, 0xa1c8cde9), TOBN(0x9d958ba9, 0x7271abe3), - TOBN(0xf3ff7eb6, 0x3d1615cd), TOBN(0xa2280dce, 0xf5ae20b0), - TOBN(0x56dba5c1, 0xcf640147), TOBN(0xea5a2e3d, 0x5e83d118), - TOBN(0x04cd6b6d, 0xda24c511), TOBN(0x1c0f4671, 0xe854d214), - TOBN(0x91a6b7a9, 0x69565381), TOBN(0xdc966240, 0xdecf1f5b), - TOBN(0x1b22d21c, 0xfcf5d009), TOBN(0x2a05f641, 0x9021dbd5), - TOBN(0x8c0ed566, 0xd4312483), TOBN(0x5179a95d, 0x643e216f), - TOBN(0xcc185fec, 0x17044493), TOBN(0xb3063339, 0x54991a21), - TOBN(0xd801ecdb, 0x0081a726), TOBN(0x0149b0c6, 0x4fa89bbb), - TOBN(0xafe9065a, 0x4391b6b9), TOBN(0xedc92786, 0xd633f3a3), - TOBN(0xe408c24a, 0xae6a8e13), TOBN(0x85833fde, 0x9f3897ab), - TOBN(0x43800e7e, 0xd81a0715), TOBN(0xde08e346, 0xb44ffc5f), - TOBN(0x7094184c, 0xcdeff2e0), TOBN(0x49f9387b, 0x165eaed1), - TOBN(0x635d6129, 0x777c468a), TOBN(0x8c0dcfd1, 0x538c2dd8), - TOBN(0xd6d9d9e3, 0x7a6a308b), TOBN(0x62375830, 0x4c2767d3), - TOBN(0x874a8bc6, 0xf38cbeb6), TOBN(0xd94d3f1a, 0xccb6fd9e), - TOBN(0x92a9735b, 0xba21f248), TOBN(0x272ad0e5, 0x6cd1efb0), - TOBN(0x7437b69c, 0x05b03284), TOBN(0xe7f04702, 0x6948c225), - TOBN(0x8a56c04a, 0xcba2ecec), TOBN(0x0c181270, 0xe3a73e41), - TOBN(0x6cb34e9d, 0x03e93725), TOBN(0xf77c8713, 0x496521a9), - TOBN(0x94569183, 0xfa7f9f90), TOBN(0xf2e7aa4c, 0x8c9707ad), - TOBN(0xced2c9ba, 0x26c1c9a3), TOBN(0x9109fe96, 0x40197507), - TOBN(0x9ae868a9, 0xe9adfe1c), TOBN(0x3984403d, 0x314e39bb), - TOBN(0xb5875720, 0xf2fe378f), TOBN(0x33f901e0, 0xba44a628), - TOBN(0xea1125fe, 0x3652438c), TOBN(0xae9ec4e6, 0x9dd1f20b), - TOBN(0x1e740d9e, 0xbebf7fbd), TOBN(0x6dbd3ddc, 0x42dbe79c), - TOBN(0x62082aec, 0xedd36776), TOBN(0xf612c478, 0xe9859039), - TOBN(0xa493b201, 0x032f7065), TOBN(0xebd4d8f2, 0x4ff9b211), - TOBN(0x3f23a0aa, 0xaac4cb32), TOBN(0xea3aadb7, 0x15ed4005), - TOBN(0xacf17ea4, 0xafa27e63), TOBN(0x56125c1a, 0xc11fd66c), - TOBN(0x266344a4, 0x3794f8dc), TOBN(0xdcca923a, 0x483c5c36), - TOBN(0x2d6b6bbf, 0x3f9d10a0), TOBN(0xb320c5ca, 0x81d9bdf3), - TOBN(0x620e28ff, 0x47b50a95), TOBN(0x933e3b01, 0xcef03371), - TOBN(0xf081bf85, 0x99100153), TOBN(0x183be9a0, 0xc3a8c8d6), - TOBN(0x4e3ddc5a, 0xd6bbe24d), TOBN(0xc6c74630, 0x53843795), - TOBN(0x78193dd7, 0x65ec2d4c), TOBN(0xb8df26cc, 0xcd3c89b2), - TOBN(0x98dbe399, 0x5a483f8d), TOBN(0x72d8a957, 0x7dd3313a), - TOBN(0x65087294, 0xab0bd375), TOBN(0xfcd89248, 0x7c259d16), - TOBN(0x8a9443d7, 0x7613aa81), TOBN(0x80100800, 0x85fe6584), - TOBN(0x70fc4dbc, 0x7fb10288), TOBN(0xf58280d3, 0xe86beee8), - TOBN(0x14fdd82f, 0x7c978c38), TOBN(0xdf1204c1, 0x0de44d7b), - TOBN(0xa08a1c84, 0x4160252f), TOBN(0x591554ca, 0xc17646a5), - TOBN(0x214a37d6, 0xa05bd525), TOBN(0x48d5f09b, 0x07957b3c), - TOBN(0x0247cdcb, 0xd7109bc9), TOBN(0x40f9e4bb, 0x30599ce7), - TOBN(0xc325fa03, 0xf46ad2ec), TOBN(0x00f766cf, 0xc3e3f9ee), - TOBN(0xab556668, 0xd43a4577), TOBN(0x68d30a61, 0x3ee03b93), - TOBN(0x7ddc81ea, 0x77b46a08), TOBN(0xcf5a6477, 0xc7480699), - TOBN(0x43a8cb34, 0x6633f683), TOBN(0x1b867e6b, 0x92363c60), - TOBN(0x43921114, 0x1f60558e), TOBN(0xcdbcdd63, 0x2f41450e), - TOBN(0x7fc04601, 0xcc630e8b), TOBN(0xea7c66d5, 0x97038b43), - TOBN(0x7259b8a5, 0x04e99fd8), TOBN(0x98a8dd12, 0x4785549a), - TOBN(0x0e459a7c, 0x840552e1), TOBN(0xcdfcf4d0, 0x4bb0909e), - TOBN(0x34a86db2, 0x53758da7), TOBN(0xe643bb83, 0xeac997e1), - TOBN(0x96400bd7, 0x530c5b7e), TOBN(0x9f97af87, 0xb41c8b52), - TOBN(0x34fc8820, 0xfbeee3f9), TOBN(0x93e53490, 0x49091afd), - TOBN(0x764b9be5, 0x9a31f35c), TOBN(0x71f37864, 0x57e3d924), - TOBN(0x02fb34e0, 0x943aa75e), TOBN(0xa18c9c58, 0xab8ff6e4), - TOBN(0x080f31b1, 0x33cf0d19), TOBN(0x5c9682db, 0x083518a7), - TOBN(0x873d4ca6, 0xb709c3de), TOBN(0x64a84262, 0x3575b8f0), - TOBN(0x6275da1f, 0x020154bb), TOBN(0x97678caa, 0xd17cf1ab), - TOBN(0x8779795f, 0x951a95c3), TOBN(0xdd35b163, 0x50fccc08), - TOBN(0x32709627, 0x33d8f031), TOBN(0x3c5ab10a, 0x498dd85c), - TOBN(0xb6c185c3, 0x41dca566), TOBN(0x7de7feda, 0xd8622aa3), - TOBN(0x99e84d92, 0x901b6dfb), TOBN(0x30a02b0e, 0x7c4ad288), - TOBN(0xc7c81daa, 0x2fd3cf36), TOBN(0xd1319547, 0xdf89e59f), - TOBN(0xb2be8184, 0xcd496733), TOBN(0xd5f449eb, 0x93d3412b), - TOBN(0x7ea41b1b, 0x25fe531d), TOBN(0xf9797432, 0x6a1d5646), - TOBN(0x86067f72, 0x2bde501a), TOBN(0xf91481c0, 0x0c85e89c), - TOBN(0xca8ee465, 0xf8b05bc6), TOBN(0x1844e1cf, 0x02e83cda), - TOBN(0xca82114a, 0xb4dbe33b), TOBN(0x0f9f8769, 0x4eabfde2), - TOBN(0x4936b1c0, 0x38b27fe2), TOBN(0x63b6359b, 0xaba402df), - TOBN(0x40c0ea2f, 0x656bdbab), TOBN(0x9c992a89, 0x6580c39c), - TOBN(0x600e8f15, 0x2a60aed1), TOBN(0xeb089ca4, 0xe0bf49df), - TOBN(0x9c233d7d, 0x2d42d99a), TOBN(0x648d3f95, 0x4c6bc2fa), - TOBN(0xdcc383a8, 0xe1add3f3), TOBN(0xf42c0c6a, 0x4f64a348), - TOBN(0x2abd176f, 0x0030dbdb), TOBN(0x4de501a3, 0x7d6c215e), - TOBN(0x4a107c1f, 0x4b9a64bc), TOBN(0xa77f0ad3, 0x2496cd59), - TOBN(0xfb78ac62, 0x7688dffb), TOBN(0x7025a2ca, 0x67937d8e), - TOBN(0xfde8b2d1, 0xd1a8f4e7), TOBN(0xf5b3da47, 0x7354927c), - TOBN(0xe48606a3, 0xd9205735), TOBN(0xac477cc6, 0xe177b917), - TOBN(0xfb1f73d2, 0xa883239a), TOBN(0xe12572f6, 0xcc8b8357), - TOBN(0x9d355e9c, 0xfb1f4f86), TOBN(0x89b795f8, 0xd9f3ec6e), - TOBN(0x27be56f1, 0xb54398dc), TOBN(0x1890efd7, 0x3fedeed5), - TOBN(0x62f77f1f, 0x9c6d0140), TOBN(0x7ef0e314, 0x596f0ee4), - TOBN(0x50ca6631, 0xcc61dab3), TOBN(0x4a39801d, 0xf4866e4f), - TOBN(0x66c8d032, 0xae363b39), TOBN(0x22c591e5, 0x2ead66aa), - TOBN(0x954ba308, 0xde02a53e), TOBN(0x2a6c060f, 0xd389f357), - TOBN(0xe6cfcde8, 0xfbf40b66), TOBN(0x8e02fc56, 0xc6340ce1), - TOBN(0xe4957795, 0x73adb4ba), TOBN(0x7b86122c, 0xa7b03805), - TOBN(0x63f83512, 0x0c8e6fa6), TOBN(0x83660ea0, 0x057d7804), - TOBN(0xbad79105, 0x21ba473c), TOBN(0xb6c50bee, 0xded5389d), - TOBN(0xee2caf4d, 0xaa7c9bc0), TOBN(0xd97b8de4, 0x8c4e98a7), - TOBN(0xa9f63e70, 0xab3bbddb), TOBN(0x3898aabf, 0x2597815a), - TOBN(0x7659af89, 0xac15b3d9), TOBN(0xedf7725b, 0x703ce784), - TOBN(0x25470fab, 0xe085116b), TOBN(0x04a43375, 0x87285310), - TOBN(0x4e39187e, 0xe2bfd52f), TOBN(0x36166b44, 0x7d9ebc74), - TOBN(0x92ad433c, 0xfd4b322c), TOBN(0x726aa817, 0xba79ab51), - TOBN(0xf96eacd8, 0xc1db15eb), TOBN(0xfaf71e91, 0x0476be63), - TOBN(0xdd69a640, 0x641fad98), TOBN(0xb7995918, 0x29622559), - TOBN(0x03c6daa5, 0xde4199dc), TOBN(0x92cadc97, 0xad545eb4), - TOBN(0x1028238b, 0x256534e4), TOBN(0x73e80ce6, 0x8595409a), - TOBN(0x690d4c66, 0xd05dc59b), TOBN(0xc95f7b8f, 0x981dee80), - TOBN(0xf4337014, 0xd856ac25), TOBN(0x441bd9dd, 0xac524dca), - TOBN(0x640b3d85, 0x5f0499f5), TOBN(0x39cf84a9, 0xd5fda182), - TOBN(0x04e7b055, 0xb2aa95a0), TOBN(0x29e33f0a, 0x0ddf1860), - TOBN(0x082e74b5, 0x423f6b43), TOBN(0x217edeb9, 0x0aaa2b0f), - TOBN(0x58b83f35, 0x83cbea55), TOBN(0xc485ee4d, 0xbc185d70), - TOBN(0x833ff03b, 0x1e5f6992), TOBN(0xb5b9b9cc, 0xcf0c0dd5), - TOBN(0x7caaee8e, 0x4e9e8a50), TOBN(0x462e907b, 0x6269dafd), - TOBN(0x6ed5cee9, 0xfbe791c6), TOBN(0x68ca3259, 0xed430790), - TOBN(0x2b72bdf2, 0x13b5ba88), TOBN(0x60294c8a, 0x35ef0ac4), - TOBN(0x9c3230ed, 0x19b99b08), TOBN(0x560fff17, 0x6c2589aa), - TOBN(0x552b8487, 0xd6770374), TOBN(0xa373202d, 0x9a56f685), - TOBN(0xd3e7f907, 0x45f175d9), TOBN(0x3c2f315f, 0xd080d810), - TOBN(0x1130e9dd, 0x7b9520e8), TOBN(0xc078f9e2, 0x0af037b5), - TOBN(0x38cd2ec7, 0x1e9c104c), TOBN(0x0f684368, 0xc472fe92), - TOBN(0xd3f1b5ed, 0x6247e7ef), TOBN(0xb32d33a9, 0x396dfe21), - TOBN(0x46f59cf4, 0x4a9aa2c2), TOBN(0x69cd5168, 0xff0f7e41), - TOBN(0x3f59da0f, 0x4b3234da), TOBN(0xcf0b0235, 0xb4579ebe), - TOBN(0x6d1cbb25, 0x6d2476c7), TOBN(0x4f0837e6, 0x9dc30f08), - TOBN(0x9a4075bb, 0x906f6e98), TOBN(0x253bb434, 0xc761e7d1), - TOBN(0xde2e645f, 0x6e73af10), TOBN(0xb89a4060, 0x0c5f131c), - TOBN(0xd12840c5, 0xb8cc037f), TOBN(0x3d093a5b, 0x7405bb47), - TOBN(0x6202c253, 0x206348b8), TOBN(0xbf5d57fc, 0xc55a3ca7), - TOBN(0x89f6c90c, 0x8c3bef48), TOBN(0x23ac7623, 0x5a0a960a), - TOBN(0xdfbd3d6b, 0x552b42ab), TOBN(0x3ef22458, 0x132061f6), - TOBN(0xd74e9bda, 0xc97e6516), TOBN(0x88779360, 0xc230f49e), - TOBN(0xa6ec1de3, 0x1e74ea49), TOBN(0x581dcee5, 0x3fb645a2), - TOBN(0xbaef2391, 0x8f483f14), TOBN(0x6d2dddfc, 0xd137d13b), - TOBN(0x54cde50e, 0xd2743a42), TOBN(0x89a34fc5, 0xe4d97e67), - TOBN(0x13f1f5b3, 0x12e08ce5), TOBN(0xa80540b8, 0xa7f0b2ca), - TOBN(0x854bcf77, 0x01982805), TOBN(0xb8653ffd, 0x233bea04), - TOBN(0x8e7b8787, 0x02b0b4c9), TOBN(0x2675261f, 0x9acb170a), - TOBN(0x061a9d90, 0x930c14e5), TOBN(0xb59b30e0, 0xdef0abea), - TOBN(0x1dc19ea6, 0x0200ec7d), TOBN(0xb6f4a3f9, 0x0bce132b), - TOBN(0xb8d5de90, 0xf13e27e0), TOBN(0xbaee5ef0, 0x1fade16f), - TOBN(0x6f406aaa, 0xe4c6cf38), TOBN(0xab4cfe06, 0xd1369815), - TOBN(0x0dcffe87, 0xefd550c6), TOBN(0x9d4f59c7, 0x75ff7d39), - TOBN(0xb02553b1, 0x51deb6ad), TOBN(0x812399a4, 0xb1877749), - TOBN(0xce90f71f, 0xca6006e1), TOBN(0xc32363a6, 0xb02b6e77), - TOBN(0x02284fbe, 0xdc36c64d), TOBN(0x86c81e31, 0xa7e1ae61), - TOBN(0x2576c7e5, 0xb909d94a), TOBN(0x8b6f7d02, 0x818b2bb0), - TOBN(0xeca3ed07, 0x56faa38a), TOBN(0xa3790e6c, 0x9305bb54), - TOBN(0xd784eeda, 0x7bc73061), TOBN(0xbd56d369, 0x6dd50614), - TOBN(0xd6575949, 0x229a8aa9), TOBN(0xdcca8f47, 0x4595ec28), - TOBN(0x814305c1, 0x06ab4fe6), TOBN(0xc8c39768, 0x24f43f16), - TOBN(0xe2a45f36, 0x523f2b36), TOBN(0x995c6493, 0x920d93bb), - TOBN(0xf8afdab7, 0x90f1632b), TOBN(0x79ebbecd, 0x1c295954), - TOBN(0xc7bb3ddb, 0x79592f48), TOBN(0x67216a7b, 0x5f88e998), - TOBN(0xd91f098b, 0xbc01193e), TOBN(0xf7d928a5, 0xb1db83fc), - TOBN(0x55e38417, 0xe991f600), TOBN(0x2a91113e, 0x2981a934), - TOBN(0xcbc9d648, 0x06b13bde), TOBN(0xb011b6ac, 0x0755ff44), - TOBN(0x6f4cb518, 0x045ec613), TOBN(0x522d2d31, 0xc2f5930a), - TOBN(0x5acae1af, 0x382e65de), TOBN(0x57643067, 0x27bc966f), - TOBN(0x5e12705d, 0x1c7193f0), TOBN(0xf0f32f47, 0x3be8858e), - TOBN(0x785c3d7d, 0x96c6dfc7), TOBN(0xd75b4a20, 0xbf31795d), - TOBN(0x91acf17b, 0x342659d4), TOBN(0xe596ea34, 0x44f0378f), - TOBN(0x4515708f, 0xce52129d), TOBN(0x17387e1e, 0x79f2f585), - TOBN(0x72cfd2e9, 0x49dee168), TOBN(0x1ae05223, 0x3e2af239), - TOBN(0x009e75be, 0x1d94066a), TOBN(0x6cca31c7, 0x38abf413), - TOBN(0xb50bd61d, 0x9bc49908), TOBN(0x4a9b4a8c, 0xf5e2bc1e), - TOBN(0xeb6cc5f7, 0x946f83ac), TOBN(0x27da93fc, 0xebffab28), - TOBN(0xea314c96, 0x4821c8c5), TOBN(0x8de49ded, 0xa83c15f4), - TOBN(0x7a64cf20, 0x7af33004), TOBN(0x45f1bfeb, 0xc9627e10), - TOBN(0x878b0626, 0x54b9df60), TOBN(0x5e4fdc3c, 0xa95c0b33), - TOBN(0xe54a37ca, 0xc2035d8e), TOBN(0x9087cda9, 0x80f20b8c), - TOBN(0x36f61c23, 0x8319ade4), TOBN(0x766f287a, 0xde8cfdf8), - TOBN(0x48821948, 0x346f3705), TOBN(0x49a7b853, 0x16e4f4a2), - TOBN(0xb9b3f8a7, 0x5cedadfd), TOBN(0x8f562815, 0x8db2a815), - TOBN(0xc0b7d554, 0x01f68f95), TOBN(0x12971e27, 0x688a208e), - TOBN(0xc9f8b696, 0xd0ff34fc), TOBN(0x20824de2, 0x1222718c), - TOBN(0x7213cf9f, 0x0c95284d), TOBN(0xe2ad741b, 0xdc158240), - TOBN(0x0ee3a6df, 0x54043ccf), TOBN(0x16ff479b, 0xd84412b3), - TOBN(0xf6c74ee0, 0xdfc98af0), TOBN(0xa78a169f, 0x52fcd2fb), - TOBN(0xd8ae8746, 0x99c930e9), TOBN(0x1d33e858, 0x49e117a5), - TOBN(0x7581fcb4, 0x6624759f), TOBN(0xde50644f, 0x5bedc01d), - TOBN(0xbeec5d00, 0xcaf3155e), TOBN(0x672d66ac, 0xbc73e75f), - TOBN(0x86b9d8c6, 0x270b01db), TOBN(0xd249ef83, 0x50f55b79), - TOBN(0x6131d6d4, 0x73978fe3), TOBN(0xcc4e4542, 0x754b00a1), - TOBN(0x4e05df05, 0x57dfcfe9), TOBN(0x94b29cdd, 0x51ef6bf0), - TOBN(0xe4530cff, 0x9bc7edf2), TOBN(0x8ac236fd, 0xd3da65f3), - TOBN(0x0faf7d5f, 0xc8eb0b48), TOBN(0x4d2de14c, 0x660eb039), - TOBN(0xc006bba7, 0x60430e54), TOBN(0x10a2d0d6, 0xda3289ab), - TOBN(0x9c037a5d, 0xd7979c59), TOBN(0x04d1f3d3, 0xa116d944), - TOBN(0x9ff22473, 0x8a0983cd), TOBN(0x28e25b38, 0xc883cabb), - TOBN(0xe968dba5, 0x47a58995), TOBN(0x2c80b505, 0x774eebdf), - TOBN(0xee763b71, 0x4a953beb), TOBN(0x502e223f, 0x1642e7f6), - TOBN(0x6fe4b641, 0x61d5e722), TOBN(0x9d37c5b0, 0xdbef5316), - TOBN(0x0115ed70, 0xf8330bc7), TOBN(0x139850e6, 0x75a72789), - TOBN(0x27d7faec, 0xffceccc2), TOBN(0x3016a860, 0x4fd9f7f6), - TOBN(0xc492ec64, 0x4cd8f64c), TOBN(0x58a2d790, 0x279d7b51), - TOBN(0x0ced1fc5, 0x1fc75256), TOBN(0x3e658aed, 0x8f433017), - TOBN(0x0b61942e, 0x05da59eb), TOBN(0xba3d60a3, 0x0ddc3722), - TOBN(0x7c311cd1, 0x742e7f87), TOBN(0x6473ffee, 0xf6b01b6e)}, - {TOBN(0x8303604f, 0x692ac542), TOBN(0xf079ffe1, 0x227b91d3), - TOBN(0x19f63e63, 0x15aaf9bd), TOBN(0xf99ee565, 0xf1f344fb), - TOBN(0x8a1d661f, 0xd6219199), TOBN(0x8c883bc6, 0xd48ce41c), - TOBN(0x1065118f, 0x3c74d904), TOBN(0x713889ee, 0x0faf8b1b), - TOBN(0x972b3f8f, 0x81a1b3be), TOBN(0x4f3ce145, 0xce2764a0), - TOBN(0xe2d0f1cc, 0x28c4f5f7), TOBN(0xdeee0c0d, 0xc7f3985b), - TOBN(0x7df4adc0, 0xd39e25c3), TOBN(0x40619820, 0xc467a080), - TOBN(0x440ebc93, 0x61cf5a58), TOBN(0x527729a6, 0x422ad600), - TOBN(0xca6c0937, 0xb1b76ba6), TOBN(0x1a2eab85, 0x4d2026dc), - TOBN(0xb1715e15, 0x19d9ae0a), TOBN(0xf1ad9199, 0xbac4a026), - TOBN(0x35b3dfb8, 0x07ea7b0e), TOBN(0xedf5496f, 0x3ed9eb89), - TOBN(0x8932e5ff, 0x2d6d08ab), TOBN(0xf314874e, 0x25bd2731), - TOBN(0xefb26a75, 0x3f73f449), TOBN(0x1d1c94f8, 0x8d44fc79), - TOBN(0x49f0fbc5, 0x3bc0dc4d), TOBN(0xb747ea0b, 0x3698a0d0), - TOBN(0x5218c3fe, 0x228d291e), TOBN(0x35b804b5, 0x43c129d6), - TOBN(0xfac859b8, 0xd1acc516), TOBN(0x6c10697d, 0x95d6e668), - TOBN(0xc38e438f, 0x0876fd4e), TOBN(0x45f0c307, 0x83d2f383), - TOBN(0x203cc2ec, 0xb10934cb), TOBN(0x6a8f2439, 0x2c9d46ee), - TOBN(0xf16b431b, 0x65ccde7b), TOBN(0x41e2cd18, 0x27e76a6f), - TOBN(0xb9c8cf8f, 0x4e3484d7), TOBN(0x64426efd, 0x8315244a), - TOBN(0x1c0a8e44, 0xfc94dea3), TOBN(0x34c8cdbf, 0xdad6a0b0), - TOBN(0x919c3840, 0x04113cef), TOBN(0xfd32fba4, 0x15490ffa), - TOBN(0x58d190f6, 0x795dcfb7), TOBN(0xfef01b03, 0x83588baf), - TOBN(0x9e6d1d63, 0xca1fc1c0), TOBN(0x53173f96, 0xf0a41ac9), - TOBN(0x2b1d402a, 0xba16f73b), TOBN(0x2fb31014, 0x8cf9b9fc), - TOBN(0x2d51e60e, 0x446ef7bf), TOBN(0xc731021b, 0xb91e1745), - TOBN(0x9d3b4724, 0x4fee99d4), TOBN(0x4bca48b6, 0xfac5c1ea), - TOBN(0x70f5f514, 0xbbea9af7), TOBN(0x751f55a5, 0x974c283a), - TOBN(0x6e30251a, 0xcb452fdb), TOBN(0x31ee6965, 0x50f30650), - TOBN(0xb0b3e508, 0x933548d9), TOBN(0xb8949a4f, 0xf4b0ef5b), - TOBN(0x208b8326, 0x3c88f3bd), TOBN(0xab147c30, 0xdb1d9989), - TOBN(0xed6515fd, 0x44d4df03), TOBN(0x17a12f75, 0xe72eb0c5), - TOBN(0x3b59796d, 0x36cf69db), TOBN(0x1219eee9, 0x56670c18), - TOBN(0xfe3341f7, 0x7a070d8e), TOBN(0x9b70130b, 0xa327f90c), - TOBN(0x36a32462, 0x0ae18e0e), TOBN(0x2021a623, 0x46c0a638), - TOBN(0x251b5817, 0xc62eb0d4), TOBN(0x87bfbcdf, 0x4c762293), - TOBN(0xf78ab505, 0xcdd61d64), TOBN(0x8c7a53fc, 0xc8c18857), - TOBN(0xa653ce6f, 0x16147515), TOBN(0x9c923aa5, 0xea7d52d5), - TOBN(0xc24709cb, 0x5c18871f), TOBN(0x7d53bec8, 0x73b3cc74), - TOBN(0x59264aff, 0xfdd1d4c4), TOBN(0x5555917e, 0x240da582), - TOBN(0xcae8bbda, 0x548f5a0e), TOBN(0x1910eaba, 0x3bbfbbe1), - TOBN(0xae579685, 0x7677afc3), TOBN(0x49ea61f1, 0x73ff0b5c), - TOBN(0x78655478, 0x4f7c3922), TOBN(0x95d337cd, 0x20c68eef), - TOBN(0x68f1e1e5, 0xdf779ab9), TOBN(0x14b491b0, 0xb5cf69a8), - TOBN(0x7a6cbbe0, 0x28e3fe89), TOBN(0xe7e1fee4, 0xc5aac0eb), - TOBN(0x7f47eda5, 0x697e5140), TOBN(0x4f450137, 0xb454921f), - TOBN(0xdb625f84, 0x95cd8185), TOBN(0x74be0ba1, 0xcdb2e583), - TOBN(0xaee4fd7c, 0xdd5e6de4), TOBN(0x4251437d, 0xe8101739), - TOBN(0x686d72a0, 0xac620366), TOBN(0x4be3fb9c, 0xb6d59344), - TOBN(0x6e8b44e7, 0xa1eb75b9), TOBN(0x84e39da3, 0x91a5c10c), - TOBN(0x37cc1490, 0xb38f0409), TOBN(0x02951943, 0x2c2ade82), - TOBN(0x9b688783, 0x1190a2d8), TOBN(0x25627d14, 0x231182ba), - TOBN(0x6eb550aa, 0x658a6d87), TOBN(0x1405aaa7, 0xcf9c7325), - TOBN(0xd147142e, 0x5c8748c9), TOBN(0x7f637e4f, 0x53ede0e0), - TOBN(0xf8ca2776, 0x14ffad2c), TOBN(0xe58fb1bd, 0xbafb6791), - TOBN(0x17158c23, 0xbf8f93fc), TOBN(0x7f15b373, 0x0a4a4655), - TOBN(0x39d4add2, 0xd842ca72), TOBN(0xa71e4391, 0x3ed96305), - TOBN(0x5bb09cbe, 0x6700be14), TOBN(0x68d69d54, 0xd8befcf6), - TOBN(0xa45f5367, 0x37183bcf), TOBN(0x7152b7bb, 0x3370dff7), - TOBN(0xcf887baa, 0xbf12525b), TOBN(0xe7ac7bdd, 0xd6d1e3cd), - TOBN(0x25914f78, 0x81fdad90), TOBN(0xcf638f56, 0x0d2cf6ab), - TOBN(0xb90bc03f, 0xcc054de5), TOBN(0x932811a7, 0x18b06350), - TOBN(0x2f00b330, 0x9bbd11ff), TOBN(0x76108a6f, 0xb4044974), - TOBN(0x801bb9e0, 0xa851d266), TOBN(0x0dd099be, 0xbf8990c1), - TOBN(0x58c5aaaa, 0xabe32986), TOBN(0x0fe9dd2a, 0x50d59c27), - TOBN(0x84951ff4, 0x8d307305), TOBN(0x6c23f829, 0x86529b78), - TOBN(0x50bb2218, 0x0b136a79), TOBN(0x7e2174de, 0x77a20996), - TOBN(0x6f00a4b9, 0xc0bb4da6), TOBN(0x89a25a17, 0xefdde8da), - TOBN(0xf728a27e, 0xc11ee01d), TOBN(0xf900553a, 0xe5f10dfb), - TOBN(0x189a83c8, 0x02ec893c), TOBN(0x3ca5bdc1, 0x23f66d77), - TOBN(0x98781537, 0x97eada9f), TOBN(0x59c50ab3, 0x10256230), - TOBN(0x346042d9, 0x323c69b3), TOBN(0x1b715a6d, 0x2c460449), - TOBN(0xa41dd476, 0x6ae06e0b), TOBN(0xcdd7888e, 0x9d42e25f), - TOBN(0x0f395f74, 0x56b25a20), TOBN(0xeadfe0ae, 0x8700e27e), - TOBN(0xb09d52a9, 0x69950093), TOBN(0x3525d9cb, 0x327f8d40), - TOBN(0xb8235a94, 0x67df886a), TOBN(0x77e4b0dd, 0x035faec2), - TOBN(0x115eb20a, 0x517d7061), TOBN(0x77fe3433, 0x6c2df683), - TOBN(0x6870ddc7, 0xcdc6fc67), TOBN(0xb1610588, 0x0b87de83), - TOBN(0x343584ca, 0xd9c4ddbe), TOBN(0xb3164f1c, 0x3d754be2), - TOBN(0x0731ed3a, 0xc1e6c894), TOBN(0x26327dec, 0x4f6b904c), - TOBN(0x9d49c6de, 0x97b5cd32), TOBN(0x40835dae, 0xb5eceecd), - TOBN(0xc66350ed, 0xd9ded7fe), TOBN(0x8aeebb5c, 0x7a678804), - TOBN(0x51d42fb7, 0x5b8ee9ec), TOBN(0xd7a17bdd, 0x8e3ca118), - TOBN(0x40d7511a, 0x2ef4400e), TOBN(0xc48990ac, 0x875a66f4), - TOBN(0x8de07d2a, 0x2199e347), TOBN(0xbee75556, 0x2a39e051), - TOBN(0x56918786, 0x916e51dc), TOBN(0xeb191313, 0x4a2d89ec), - TOBN(0x6679610d, 0x37d341ed), TOBN(0x434fbb41, 0x56d51c2b), - TOBN(0xe54b7ee7, 0xd7492dba), TOBN(0xaa33a79a, 0x59021493), - TOBN(0x49fc5054, 0xe4bd6d3d), TOBN(0x09540f04, 0x5ab551d0), - TOBN(0x8acc9085, 0x4942d3a6), TOBN(0x231af02f, 0x2d28323b), - TOBN(0x93458cac, 0x0992c163), TOBN(0x1fef8e71, 0x888e3bb4), - TOBN(0x27578da5, 0xbe8c268c), TOBN(0xcc8be792, 0xe805ec00), - TOBN(0x29267bae, 0xc61c3855), TOBN(0xebff429d, 0x58c1fd3b), - TOBN(0x22d886c0, 0x8c0b93b8), TOBN(0xca5e00b2, 0x2ddb8953), - TOBN(0xcf330117, 0xc3fed8b7), TOBN(0xd49ac6fa, 0x819c01f6), - TOBN(0x6ddaa6bd, 0x3c0fbd54), TOBN(0x91743068, 0x8049a2cf), - TOBN(0xd67f981e, 0xaff2ef81), TOBN(0xc3654d35, 0x2818ae80), - TOBN(0x81d05044, 0x1b2aa892), TOBN(0x2db067bf, 0x3d099328), - TOBN(0xe7c79e86, 0x703dcc97), TOBN(0xe66f9b37, 0xe133e215), - TOBN(0xcdf119a6, 0xe39a7a5c), TOBN(0x47c60de3, 0x876f1b61), - TOBN(0x6e405939, 0xd860f1b2), TOBN(0x3e9a1dbc, 0xf5ed4d4a), - TOBN(0x3f23619e, 0xc9b6bcbd), TOBN(0x5ee790cf, 0x734e4497), - TOBN(0xf0a834b1, 0x5bdaf9bb), TOBN(0x02cedda7, 0x4ca295f0), - TOBN(0x4619aa2b, 0xcb8e378c), TOBN(0xe5613244, 0xcc987ea4), - TOBN(0x0bc022cc, 0x76b23a50), TOBN(0x4a2793ad, 0x0a6c21ce), - TOBN(0x38328780, 0x89cac3f5), TOBN(0x29176f1b, 0xcba26d56), - TOBN(0x06296187, 0x4f6f59eb), TOBN(0x86e9bca9, 0x8bdc658e), - TOBN(0x2ca9c4d3, 0x57e30402), TOBN(0x5438b216, 0x516a09bb), - TOBN(0x0a6a063c, 0x7672765a), TOBN(0x37a3ce64, 0x0547b9bf), - TOBN(0x42c099c8, 0x98b1a633), TOBN(0xb5ab800d, 0x05ee6961), - TOBN(0xf1963f59, 0x11a5acd6), TOBN(0xbaee6157, 0x46201063), - TOBN(0x36d9a649, 0xa596210a), TOBN(0xaed04363, 0x1ba7138c), - TOBN(0xcf817d1c, 0xa4a82b76), TOBN(0x5586960e, 0xf3806be9), - TOBN(0x7ab67c89, 0x09dc6bb5), TOBN(0x52ace7a0, 0x114fe7eb), - TOBN(0xcd987618, 0xcbbc9b70), TOBN(0x4f06fd5a, 0x604ca5e1), - TOBN(0x90af14ca, 0x6dbde133), TOBN(0x1afe4322, 0x948a3264), - TOBN(0xa70d2ca6, 0xc44b2c6c), TOBN(0xab726799, 0x0ef87dfe), - TOBN(0x310f64dc, 0x2e696377), TOBN(0x49b42e68, 0x4c8126a0), - TOBN(0x0ea444c3, 0xcea0b176), TOBN(0x53a8ddf7, 0xcb269182), - TOBN(0xf3e674eb, 0xbbba9dcb), TOBN(0x0d2878a8, 0xd8669d33), - TOBN(0x04b935d5, 0xd019b6a3), TOBN(0xbb5cf88e, 0x406f1e46), - TOBN(0xa1912d16, 0x5b57c111), TOBN(0x9803fc21, 0x19ebfd78), - TOBN(0x4f231c9e, 0xc07764a9), TOBN(0xd93286ee, 0xb75bd055), - TOBN(0x83a9457d, 0x8ee6c9de), TOBN(0x04695915, 0x6087ec90), - TOBN(0x14c6dd8a, 0x58d6cd46), TOBN(0x9cb633b5, 0x8e6634d2), - TOBN(0xc1305047, 0xf81bc328), TOBN(0x12ede0e2, 0x26a177e5), - TOBN(0x332cca62, 0x065a6f4f), TOBN(0xc3a47ecd, 0x67be487b), - TOBN(0x741eb187, 0x0f47ed1c), TOBN(0x99e66e58, 0xe7598b14), - TOBN(0x6f0544ca, 0x63d0ff12), TOBN(0xe5efc784, 0xb610a05f), - TOBN(0xf72917b1, 0x7cad7b47), TOBN(0x3ff6ea20, 0xf2cac0c0), - TOBN(0xcc23791b, 0xf21db8b7), TOBN(0x7dac70b1, 0xd7d93565), - TOBN(0x682cda1d, 0x694bdaad), TOBN(0xeb88bb8c, 0x1023516d), - TOBN(0xc4c634b4, 0xdfdbeb1b), TOBN(0x22f5ca72, 0xb4ee4dea), - TOBN(0x1045a368, 0xe6524821), TOBN(0xed9e8a3f, 0x052b18b2), - TOBN(0x9b7f2cb1, 0xb961f49a), TOBN(0x7fee2ec1, 0x7b009670), - TOBN(0x350d8754, 0x22507a6d), TOBN(0x561bd711, 0x4db55f1d), - TOBN(0x4c189ccc, 0x320bbcaf), TOBN(0x568434cf, 0xdf1de48c), - TOBN(0x6af1b00e, 0x0fa8f128), TOBN(0xf0ba9d02, 0x8907583c), - TOBN(0x735a4004, 0x32ff9f60), TOBN(0x3dd8e4b6, 0xc25dcf33), - TOBN(0xf2230f16, 0x42c74cef), TOBN(0xd8117623, 0x013fa8ad), - TOBN(0x36822876, 0xf51fe76e), TOBN(0x8a6811cc, 0x11d62589), - TOBN(0xc3fc7e65, 0x46225718), TOBN(0xb7df2c9f, 0xc82fdbcd), - TOBN(0x3b1d4e52, 0xdd7b205b), TOBN(0xb6959478, 0x47a2e414), - TOBN(0x05e4d793, 0xefa91148), TOBN(0xb47ed446, 0xfd2e9675), - TOBN(0x1a7098b9, 0x04c9d9bf), TOBN(0x661e2881, 0x1b793048), - TOBN(0xb1a16966, 0xb01ee461), TOBN(0xbc521308, 0x2954746f), - TOBN(0xc909a0fc, 0x2477de50), TOBN(0xd80bb41c, 0x7dbd51ef), - TOBN(0xa85be7ec, 0x53294905), TOBN(0x6d465b18, 0x83958f97), - TOBN(0x16f6f330, 0xfb6840fd), TOBN(0xfaaeb214, 0x3401e6c8), - TOBN(0xaf83d30f, 0xccb5b4f8), TOBN(0x22885739, 0x266dec4b), - TOBN(0x51b4367c, 0x7bc467df), TOBN(0x926562e3, 0xd842d27a), - TOBN(0xdfcb6614, 0x0fea14a6), TOBN(0xeb394dae, 0xf2734cd9), - TOBN(0x3eeae5d2, 0x11c0be98), TOBN(0xb1e6ed11, 0x814e8165), - TOBN(0x191086bc, 0xe52bce1c), TOBN(0x14b74cc6, 0xa75a04da), - TOBN(0x63cf1186, 0x8c060985), TOBN(0x071047de, 0x2dbd7f7c), - TOBN(0x4e433b8b, 0xce0942ca), TOBN(0xecbac447, 0xd8fec61d), - TOBN(0x8f0ed0e2, 0xebf3232f), TOBN(0xfff80f9e, 0xc52a2edd), - TOBN(0xad9ab433, 0x75b55fdb), TOBN(0x73ca7820, 0xe42e0c11), - TOBN(0x6dace0a0, 0xe6251b46), TOBN(0x89bc6b5c, 0x4c0d932d), - TOBN(0x3438cd77, 0x095da19a), TOBN(0x2f24a939, 0x8d48bdfb), - TOBN(0x99b47e46, 0x766561b7), TOBN(0x736600e6, 0x0ed0322a), - TOBN(0x06a47cb1, 0x638e1865), TOBN(0x927c1c2d, 0xcb136000), - TOBN(0x29542337, 0x0cc5df69), TOBN(0x99b37c02, 0x09d649a9), - TOBN(0xc5f0043c, 0x6aefdb27), TOBN(0x6cdd9987, 0x1be95c27), - TOBN(0x69850931, 0x390420d2), TOBN(0x299c40ac, 0x0983efa4), - TOBN(0x3a05e778, 0xaf39aead), TOBN(0x84274408, 0x43a45193), - TOBN(0x6bcd0fb9, 0x91a711a0), TOBN(0x461592c8, 0x9f52ab17), - TOBN(0xb49302b4, 0xda3c6ed6), TOBN(0xc51fddc7, 0x330d7067), - TOBN(0x94babeb6, 0xda50d531), TOBN(0x521b840d, 0xa6a7b9da), - TOBN(0x5305151e, 0x404bdc89), TOBN(0x1bcde201, 0xd0d07449), - TOBN(0xf427a78b, 0x3b76a59a), TOBN(0xf84841ce, 0x07791a1b), - TOBN(0xebd314be, 0xbf91ed1c), TOBN(0x8e61d34c, 0xbf172943), - TOBN(0x1d5dc451, 0x5541b892), TOBN(0xb186ee41, 0xfc9d9e54), - TOBN(0x9d9f345e, 0xd5bf610d), TOBN(0x3e7ba65d, 0xf6acca9f), - TOBN(0x9dda787a, 0xa8369486), TOBN(0x09f9dab7, 0x8eb5ba53), - TOBN(0x5afb2033, 0xd6481bc3), TOBN(0x76f4ce30, 0xafa62104), - TOBN(0xa8fa00cf, 0xf4f066b5), TOBN(0x89ab5143, 0x461dafc2), - TOBN(0x44339ed7, 0xa3389998), TOBN(0x2ff862f1, 0xbc214903), - TOBN(0x2c88f985, 0xb05556e3), TOBN(0xcd96058e, 0x3467081e), - TOBN(0x7d6a4176, 0xedc637ea), TOBN(0xe1743d09, 0x36a5acdc), - TOBN(0x66fd72e2, 0x7eb37726), TOBN(0xf7fa264e, 0x1481a037), - TOBN(0x9fbd3bde, 0x45f4aa79), TOBN(0xed1e0147, 0x767c3e22), - TOBN(0x7621f979, 0x82e7abe2), TOBN(0x19eedc72, 0x45f633f8), - TOBN(0xe69b155e, 0x6137bf3a), TOBN(0xa0ad13ce, 0x414ee94e), - TOBN(0x93e3d524, 0x1c0e651a), TOBN(0xab1a6e2a, 0x02ce227e), - TOBN(0xe7af1797, 0x4ab27eca), TOBN(0x245446de, 0xbd444f39), - TOBN(0x59e22a21, 0x56c07613), TOBN(0x43deafce, 0xf4275498), - TOBN(0x10834ccb, 0x67fd0946), TOBN(0xa75841e5, 0x47406edf), - TOBN(0xebd6a677, 0x7b0ac93d), TOBN(0xa6e37b0d, 0x78f5e0d7), - TOBN(0x2516c096, 0x76f5492b), TOBN(0x1e4bf888, 0x9ac05f3a), - TOBN(0xcdb42ce0, 0x4df0ba2b), TOBN(0x935d5cfd, 0x5062341b), - TOBN(0x8a303333, 0x82acac20), TOBN(0x429438c4, 0x5198b00e), - TOBN(0x1d083bc9, 0x049d33fa), TOBN(0x58b82dda, 0x946f67ff), - TOBN(0xac3e2db8, 0x67a1d6a3), TOBN(0x62e6bead, 0x1798aac8), - TOBN(0xfc85980f, 0xde46c58c), TOBN(0xa7f69379, 0x69c8d7be), - TOBN(0x23557927, 0x837b35ec), TOBN(0x06a933d8, 0xe0790c0c), - TOBN(0x827c0e9b, 0x077ff55d), TOBN(0x53977798, 0xbb26e680), - TOBN(0x59530874, 0x1d9cb54f), TOBN(0xcca3f449, 0x4aac53ef), - TOBN(0x11dc5c87, 0xa07eda0f), TOBN(0xc138bccf, 0xfd6400c8), - TOBN(0x549680d3, 0x13e5da72), TOBN(0xc93eed82, 0x4540617e), - TOBN(0xfd3db157, 0x4d0b75c0), TOBN(0x9716eb42, 0x6386075b), - TOBN(0x0639605c, 0x817b2c16), TOBN(0x09915109, 0xf1e4f201), - TOBN(0x35c9a928, 0x5cca6c3b), TOBN(0xb25f7d1a, 0x3505c900), - TOBN(0xeb9f7d20, 0x630480c4), TOBN(0xc3c7b8c6, 0x2a1a501c), - TOBN(0x3f99183c, 0x5a1f8e24), TOBN(0xfdb118fa, 0x9dd255f0), - TOBN(0xb9b18b90, 0xc27f62a6), TOBN(0xe8f732f7, 0x396ec191), - TOBN(0x524a2d91, 0x0be786ab), TOBN(0x5d32adef, 0x0ac5a0f5), - TOBN(0x9b53d4d6, 0x9725f694), TOBN(0x032a76c6, 0x0510ba89), - TOBN(0x840391a3, 0xebeb1544), TOBN(0x44b7b88c, 0x3ed73ac3), - TOBN(0xd24bae7a, 0x256cb8b3), TOBN(0x7ceb151a, 0xe394cb12), - TOBN(0xbd6b66d0, 0x5bc1e6a8), TOBN(0xec70cecb, 0x090f07bf), - TOBN(0x270644ed, 0x7d937589), TOBN(0xee9e1a3d, 0x5f1dccfe), - TOBN(0xb0d40a84, 0x745b98d2), TOBN(0xda429a21, 0x2556ed40), - TOBN(0xf676eced, 0x85148cb9), TOBN(0x5a22d40c, 0xded18936), - TOBN(0x3bc4b9e5, 0x70e8a4ce), TOBN(0xbfd1445b, 0x9eae0379), - TOBN(0xf23f2c0c, 0x1a0bd47e), TOBN(0xa9c0bb31, 0xe1845531), - TOBN(0x9ddc4d60, 0x0a4c3f6b), TOBN(0xbdfaad79, 0x2c15ef44), - TOBN(0xce55a236, 0x7f484acc), TOBN(0x08653ca7, 0x055b1f15), - TOBN(0x2efa8724, 0x538873a3), TOBN(0x09299e5d, 0xace1c7e7), - TOBN(0x07afab66, 0xade332ba), TOBN(0x9be1fdf6, 0x92dd71b7), - TOBN(0xa49b5d59, 0x5758b11c), TOBN(0x0b852893, 0xc8654f40), - TOBN(0xb63ef6f4, 0x52379447), TOBN(0xd4957d29, 0x105e690c), - TOBN(0x7d484363, 0x646559b0), TOBN(0xf4a8273c, 0x49788a8e), - TOBN(0xee406cb8, 0x34ce54a9), TOBN(0x1e1c260f, 0xf86fda9b), - TOBN(0xe150e228, 0xcf6a4a81), TOBN(0x1fa3b6a3, 0x1b488772), - TOBN(0x1e6ff110, 0xc5a9c15b), TOBN(0xc6133b91, 0x8ad6aa47), - TOBN(0x8ac5d55c, 0x9dffa978), TOBN(0xba1d1c1d, 0x5f3965f2), - TOBN(0xf969f4e0, 0x7732b52f), TOBN(0xfceecdb5, 0xa5172a07), - TOBN(0xb0120a5f, 0x10f2b8f5), TOBN(0xc83a6cdf, 0x5c4c2f63), - TOBN(0x4d47a491, 0xf8f9c213), TOBN(0xd9e1cce5, 0xd3f1bbd5), - TOBN(0x0d91bc7c, 0xaba7e372), TOBN(0xfcdc74c8, 0xdfd1a2db), - TOBN(0x05efa800, 0x374618e5), TOBN(0x11216969, 0x15a7925e), - TOBN(0xd4c89823, 0xf6021c5d), TOBN(0x880d5e84, 0xeff14423), - TOBN(0x6523bc5a, 0x6dcd1396), TOBN(0xd1acfdfc, 0x113c978b), - TOBN(0xb0c164e8, 0xbbb66840), TOBN(0xf7f4301e, 0x72b58459), - TOBN(0xc29ad4a6, 0xa638e8ec), TOBN(0xf5ab8961, 0x46b78699), - TOBN(0x9dbd7974, 0x0e954750), TOBN(0x0121de88, 0x64f9d2c6), - TOBN(0x2e597b42, 0xd985232e), TOBN(0x55b6c3c5, 0x53451777), - TOBN(0xbb53e547, 0x519cb9fb), TOBN(0xf134019f, 0x8428600d), - TOBN(0x5a473176, 0xe081791a), TOBN(0x2f3e2263, 0x35fb0c08), - TOBN(0xb28c3017, 0x73d273b0), TOBN(0xccd21076, 0x7721ef9a), - TOBN(0x054cc292, 0xb650dc39), TOBN(0x662246de, 0x6188045e), - TOBN(0x904b52fa, 0x6b83c0d1), TOBN(0xa72df267, 0x97e9cd46), - TOBN(0x886b43cd, 0x899725e4), TOBN(0x2b651688, 0xd849ff22), - TOBN(0x60479b79, 0x02f34533), TOBN(0x5e354c14, 0x0c77c148), - TOBN(0xb4bb7581, 0xa8537c78), TOBN(0x188043d7, 0xefe1495f), - TOBN(0x9ba12f42, 0x8c1d5026), TOBN(0x2e0c8a26, 0x93d4aaab), - TOBN(0xbdba7b8b, 0xaa57c450), TOBN(0x140c9ad6, 0x9bbdafef), - TOBN(0x2067aa42, 0x25ac0f18), TOBN(0xf7b1295b, 0x04d1fbf3), - TOBN(0x14829111, 0xa4b04824), TOBN(0x2ce3f192, 0x33bd5e91), - TOBN(0x9c7a1d55, 0x8f2e1b72), TOBN(0xfe932286, 0x302aa243), - TOBN(0x497ca7b4, 0xd4be9554), TOBN(0xb8e821b8, 0xe0547a6e), - TOBN(0xfb2838be, 0x67e573e0), TOBN(0x05891db9, 0x4084c44b), - TOBN(0x91311373, 0x96c1c2c5), TOBN(0x6aebfa3f, 0xd958444b), - TOBN(0xac9cdce9, 0xe56e55c1), TOBN(0x7148ced3, 0x2caa46d0), - TOBN(0x2e10c7ef, 0xb61fe8eb), TOBN(0x9fd835da, 0xff97cf4d)}, - {TOBN(0xa36da109, 0x081e9387), TOBN(0xfb9780d7, 0x8c935828), - TOBN(0xd5940332, 0xe540b015), TOBN(0xc9d7b51b, 0xe0f466fa), - TOBN(0xfaadcd41, 0xd6d9f671), TOBN(0xba6c1e28, 0xb1a2ac17), - TOBN(0x066a7833, 0xed201e5f), TOBN(0x19d99719, 0xf90f462b), - TOBN(0xf431f462, 0x060b5f61), TOBN(0xa56f46b4, 0x7bd057c2), - TOBN(0x348dca6c, 0x47e1bf65), TOBN(0x9a38783e, 0x41bcf1ff), - TOBN(0x7a5d33a9, 0xda710718), TOBN(0x5a779987, 0x2e0aeaf6), - TOBN(0xca87314d, 0x2d29d187), TOBN(0xfa0edc3e, 0xc687d733), - TOBN(0x9df33621, 0x6a31e09b), TOBN(0xde89e44d, 0xc1350e35), - TOBN(0x29214871, 0x4ca0cf52), TOBN(0xdf379672, 0x0b88a538), - TOBN(0xc92a510a, 0x2591d61b), TOBN(0x79aa87d7, 0x585b447b), - TOBN(0xf67db604, 0xe5287f77), TOBN(0x1697c8bf, 0x5efe7a80), - TOBN(0x1c894849, 0xcb198ac7), TOBN(0xa884a93d, 0x0f264665), - TOBN(0x2da964ef, 0x9b200678), TOBN(0x3c351b87, 0x009834e6), - TOBN(0xafb2ef9f, 0xe2c4b44b), TOBN(0x580f6c47, 0x3326790c), - TOBN(0xb8480521, 0x0b02264a), TOBN(0x8ba6f9e2, 0x42a194e2), - TOBN(0xfc87975f, 0x8fb54738), TOBN(0x35160788, 0x27c3ead3), - TOBN(0x834116d2, 0xb74a085a), TOBN(0x53c99a73, 0xa62fe996), - TOBN(0x87585be0, 0x5b81c51b), TOBN(0x925bafa8, 0xbe0852b7), - TOBN(0x76a4fafd, 0xa84d19a7), TOBN(0x39a45982, 0x585206d4), - TOBN(0x499b6ab6, 0x5eb03c0e), TOBN(0xf19b7954, 0x72bc3fde), - TOBN(0xa86b5b9c, 0x6e3a80d2), TOBN(0xe4377508, 0x6d42819f), - TOBN(0xc1663650, 0xbb3ee8a3), TOBN(0x75eb14fc, 0xb132075f), - TOBN(0xa8ccc906, 0x7ad834f6), TOBN(0xea6a2474, 0xe6e92ffd), - TOBN(0x9d72fd95, 0x0f8d6758), TOBN(0xcb84e101, 0x408c07dd), - TOBN(0xb9114bfd, 0xa5e23221), TOBN(0x358b5fe2, 0xe94e742c), - TOBN(0x1c0577ec, 0x95f40e75), TOBN(0xf0155451, 0x3d73f3d6), - TOBN(0x9d55cd67, 0xbd1b9b66), TOBN(0x63e86e78, 0xaf8d63c7), - TOBN(0x39d934ab, 0xd3c095f1), TOBN(0x04b261be, 0xe4b76d71), - TOBN(0x1d2e6970, 0xe73e6984), TOBN(0x879fb23b, 0x5e5fcb11), - TOBN(0x11506c72, 0xdfd75490), TOBN(0x3a97d085, 0x61bcf1c1), - TOBN(0x43201d82, 0xbf5e7007), TOBN(0x7f0ac52f, 0x798232a7), - TOBN(0x2715cbc4, 0x6eb564d4), TOBN(0x8d6c752c, 0x9e570e29), - TOBN(0xf80247c8, 0x9ef5fd5d), TOBN(0xc3c66b46, 0xd53eb514), - TOBN(0x9666b401, 0x0f87de56), TOBN(0xce62c06f, 0xc6c603b5), - TOBN(0xae7b4c60, 0x7e4fc942), TOBN(0x38ac0b77, 0x663a9c19), - TOBN(0xcb4d20ee, 0x4b049136), TOBN(0x8b63bf12, 0x356a4613), - TOBN(0x1221aef6, 0x70e08128), TOBN(0xe62d8c51, 0x4acb6b16), - TOBN(0x71f64a67, 0x379e7896), TOBN(0xb25237a2, 0xcafd7fa5), - TOBN(0xf077bd98, 0x3841ba6a), TOBN(0xc4ac0244, 0x3cd16e7e), - TOBN(0x548ba869, 0x21fea4ca), TOBN(0xd36d0817, 0xf3dfdac1), - TOBN(0x09d8d71f, 0xf4685faf), TOBN(0x8eff66be, 0xc52c459a), - TOBN(0x182faee7, 0x0b57235e), TOBN(0xee3c39b1, 0x0106712b), - TOBN(0x5107331f, 0xc0fcdcb0), TOBN(0x669fb9dc, 0xa51054ba), - TOBN(0xb25101fb, 0x319d7682), TOBN(0xb0293129, 0x0a982fee), - TOBN(0x51c1c9b9, 0x0261b344), TOBN(0x0e008c5b, 0xbfd371fa), - TOBN(0xd866dd1c, 0x0278ca33), TOBN(0x666f76a6, 0xe5aa53b1), - TOBN(0xe5cfb779, 0x6013a2cf), TOBN(0x1d3a1aad, 0xa3521836), - TOBN(0xcedd2531, 0x73faa485), TOBN(0xc8ee6c4f, 0xc0a76878), - TOBN(0xddbccfc9, 0x2a11667d), TOBN(0x1a418ea9, 0x1c2f695a), - TOBN(0xdb11bd92, 0x51f73971), TOBN(0x3e4b3c82, 0xda2ed89f), - TOBN(0x9a44f3f4, 0xe73e0319), TOBN(0xd1e3de0f, 0x303431af), - TOBN(0x3c5604ff, 0x50f75f9c), TOBN(0x1d8eddf3, 0x7e752b22), - TOBN(0x0ef074dd, 0x3c9a1118), TOBN(0xd0ffc172, 0xccb86d7b), - TOBN(0xabd1ece3, 0x037d90f2), TOBN(0xe3f307d6, 0x6055856c), - TOBN(0x422f9328, 0x7e4c6daf), TOBN(0x902aac66, 0x334879a0), - TOBN(0xb6a1e7bf, 0x94cdfade), TOBN(0x6c97e1ed, 0x7fc6d634), - TOBN(0x662ad24d, 0xa2fb63f8), TOBN(0xf81be1b9, 0xa5928405), - TOBN(0x86d765e4, 0xd14b4206), TOBN(0xbecc2e0e, 0x8fa0db65), - TOBN(0xa28838e0, 0xb17fc76c), TOBN(0xe49a602a, 0xe37cf24e), - TOBN(0x76b4131a, 0x567193ec), TOBN(0xaf3c305a, 0xe5f6e70b), - TOBN(0x9587bd39, 0x031eebdd), TOBN(0x5709def8, 0x71bbe831), - TOBN(0x57059983, 0x0eb2b669), TOBN(0x4d80ce1b, 0x875b7029), - TOBN(0x838a7da8, 0x0364ac16), TOBN(0x2f431d23, 0xbe1c83ab), - TOBN(0xe56812a6, 0xf9294dd3), TOBN(0xb448d01f, 0x9b4b0d77), - TOBN(0xf3ae6061, 0x04e8305c), TOBN(0x2bead645, 0x94d8c63e), - TOBN(0x0a85434d, 0x84fd8b07), TOBN(0x537b983f, 0xf7a9dee5), - TOBN(0xedcc5f18, 0xef55bd85), TOBN(0x2041af62, 0x21c6cf8b), - TOBN(0x8e52874c, 0xb940c71e), TOBN(0x211935a9, 0xdb5f4b3a), - TOBN(0x94350492, 0x301b1dc3), TOBN(0x33d2646d, 0x29958620), - TOBN(0x16b0d64b, 0xef911404), TOBN(0x9d1f25ea, 0x9a3c5ef4), - TOBN(0x20f200eb, 0x4a352c78), TOBN(0x43929f2c, 0x4bd0b428), - TOBN(0xa5656667, 0xc7196e29), TOBN(0x7992c2f0, 0x9391be48), - TOBN(0xaaa97cbd, 0x9ee0cd6e), TOBN(0x51b0310c, 0x3dc8c9bf), - TOBN(0x237f8acf, 0xdd9f22cb), TOBN(0xbb1d81a1, 0xb585d584), - TOBN(0x8d5d85f5, 0x8c416388), TOBN(0x0d6e5a5a, 0x42fe474f), - TOBN(0xe7812766, 0x38235d4e), TOBN(0x1c62bd67, 0x496e3298), - TOBN(0x8378660c, 0x3f175bc8), TOBN(0x4d04e189, 0x17afdd4d), - TOBN(0x32a81601, 0x85a8068c), TOBN(0xdb58e4e1, 0x92b29a85), - TOBN(0xe8a65b86, 0xc70d8a3b), TOBN(0x5f0e6f4e, 0x98a0403b), - TOBN(0x08129684, 0x69ed2370), TOBN(0x34dc30bd, 0x0871ee26), - TOBN(0x3a5ce948, 0x7c9c5b05), TOBN(0x7d487b80, 0x43a90c87), - TOBN(0x4089ba37, 0xdd0e7179), TOBN(0x45f80191, 0xb4041811), - TOBN(0x1c3e1058, 0x98747ba5), TOBN(0x98c4e13a, 0x6e1ae592), - TOBN(0xd44636e6, 0xe82c9f9e), TOBN(0x711db87c, 0xc33a1043), - TOBN(0x6f431263, 0xaa8aec05), TOBN(0x43ff120d, 0x2744a4aa), - TOBN(0xd3bd892f, 0xae77779b), TOBN(0xf0fe0cc9, 0x8cdc9f82), - TOBN(0xca5f7fe6, 0xf1c5b1bc), TOBN(0xcc63a682, 0x44929a72), - TOBN(0xc7eaba0c, 0x09dbe19a), TOBN(0x2f3585ad, 0x6b5c73c2), - TOBN(0x8ab8924b, 0x0ae50c30), TOBN(0x17fcd27a, 0x638b30ba), - TOBN(0xaf414d34, 0x10b3d5a5), TOBN(0x09c107d2, 0x2a9accf1), - TOBN(0x15dac49f, 0x946a6242), TOBN(0xaec3df2a, 0xd707d642), - TOBN(0x2c2492b7, 0x3f894ae0), TOBN(0xf59df3e5, 0xb75f18ce), - TOBN(0x7cb740d2, 0x8f53cad0), TOBN(0x3eb585fb, 0xc4f01294), - TOBN(0x17da0c86, 0x32c7f717), TOBN(0xeb8c795b, 0xaf943f4c), - TOBN(0x4ee23fb5, 0xf67c51d2), TOBN(0xef187575, 0x68889949), - TOBN(0xa6b4bdb2, 0x0389168b), TOBN(0xc4ecd258, 0xea577d03), - TOBN(0x3a63782b, 0x55743082), TOBN(0x6f678f4c, 0xc72f08cd), - TOBN(0x553511cf, 0x65e58dd8), TOBN(0xd53b4e3e, 0xd402c0cd), - TOBN(0x37de3e29, 0xa037c14c), TOBN(0x86b6c516, 0xc05712aa), - TOBN(0x2834da3e, 0xb38dff6f), TOBN(0xbe012c52, 0xea636be8), - TOBN(0x292d238c, 0x61dd37f8), TOBN(0x0e54523f, 0x8f8142db), - TOBN(0xe31eb436, 0x036a05d8), TOBN(0x83e3cdff, 0x1e93c0ff), - TOBN(0x3fd2fe0f, 0x50821ddf), TOBN(0xc8e19b0d, 0xff9eb33b), - TOBN(0xc8cc943f, 0xb569a5fe), TOBN(0xad0090d4, 0xd4342d75), - TOBN(0x82090b4b, 0xcaeca000), TOBN(0xca39687f, 0x1bd410eb), - TOBN(0xe7bb0df7, 0x65959d77), TOBN(0x39d78218, 0x9c964999), - TOBN(0xd87f62e8, 0xb2415451), TOBN(0xe5efb774, 0xbed76108), - TOBN(0x3ea011a4, 0xe822f0d0), TOBN(0xbc647ad1, 0x5a8704f8), - TOBN(0xbb315b35, 0x50c6820f), TOBN(0x863dec3d, 0xb7e76bec), - TOBN(0x01ff5d3a, 0xf017bfc7), TOBN(0x20054439, 0x976b8229), - TOBN(0x067fca37, 0x0bbd0d3b), TOBN(0xf63dde64, 0x7f5e3d0f), - TOBN(0x22dbefb3, 0x2a4c94e9), TOBN(0xafbff0fe, 0x96f8278a), - TOBN(0x80aea0b1, 0x3503793d), TOBN(0xb2238029, 0x5f06cd29), - TOBN(0x65703e57, 0x8ec3feca), TOBN(0x06c38314, 0x393e7053), - TOBN(0xa0b751eb, 0x7c6734c4), TOBN(0xd2e8a435, 0xc59f0f1e), - TOBN(0x147d9052, 0x5e9ca895), TOBN(0x2f4dd31e, 0x972072df), - TOBN(0xa16fda8e, 0xe6c6755c), TOBN(0xc66826ff, 0xcf196558), - TOBN(0x1f1a76a3, 0x0cf43895), TOBN(0xa9d604e0, 0x83c3097b), - TOBN(0xe1908309, 0x66390e0e), TOBN(0xa50bf753, 0xb3c85eff), - TOBN(0x0696bdde, 0xf6a70251), TOBN(0x548b801b, 0x3c6ab16a), - TOBN(0x37fcf704, 0xa4d08762), TOBN(0x090b3def, 0xdff76c4e), - TOBN(0x87e8cb89, 0x69cb9158), TOBN(0x44a90744, 0x995ece43), - TOBN(0xf85395f4, 0x0ad9fbf5), TOBN(0x49b0f6c5, 0x4fb0c82d), - TOBN(0x75d9bc15, 0xadf7cccf), TOBN(0x81a3e5d6, 0xdfa1e1b0), - TOBN(0x8c39e444, 0x249bc17e), TOBN(0xf37dccb2, 0x8ea7fd43), - TOBN(0xda654873, 0x907fba12), TOBN(0x35daa6da, 0x4a372904), - TOBN(0x0564cfc6, 0x6283a6c5), TOBN(0xd09fa4f6, 0x4a9395bf), - TOBN(0x688e9ec9, 0xaeb19a36), TOBN(0xd913f1ce, 0xc7bfbfb4), - TOBN(0x797b9a3c, 0x61c2faa6), TOBN(0x2f979bec, 0x6a0a9c12), - TOBN(0xb5969d0f, 0x359679ec), TOBN(0xebcf523d, 0x079b0460), - TOBN(0xfd6b0008, 0x10fab870), TOBN(0x3f2edcda, 0x9373a39c), - TOBN(0x0d64f9a7, 0x6f568431), TOBN(0xf848c27c, 0x02f8898c), - TOBN(0xf418ade1, 0x260b5bd5), TOBN(0xc1f3e323, 0x6973dee8), - TOBN(0x46e9319c, 0x26c185dd), TOBN(0x6d85b7d8, 0x546f0ac4), - TOBN(0x427965f2, 0x247f9d57), TOBN(0xb519b636, 0xb0035f48), - TOBN(0x6b6163a9, 0xab87d59c), TOBN(0xff9f58c3, 0x39caaa11), - TOBN(0x4ac39cde, 0x3177387b), TOBN(0x5f6557c2, 0x873e77f9), - TOBN(0x67504006, 0x36a83041), TOBN(0x9b1c96ca, 0x75ef196c), - TOBN(0xf34283de, 0xb08c7940), TOBN(0x7ea09644, 0x1128c316), - TOBN(0xb510b3b5, 0x6aa39dff), TOBN(0x59b43da2, 0x9f8e4d8c), - TOBN(0xa8ce31fd, 0x9e4c4b9f), TOBN(0x0e20be26, 0xc1303c01), - TOBN(0x18187182, 0xe8ee47c9), TOBN(0xd9687cdb, 0x7db98101), - TOBN(0x7a520e4d, 0xa1e14ff6), TOBN(0x429808ba, 0x8836d572), - TOBN(0xa37ca60d, 0x4944b663), TOBN(0xf901f7a9, 0xa3f91ae5), - TOBN(0xe4e3e76e, 0x9e36e3b1), TOBN(0x9aa219cf, 0x29d93250), - TOBN(0x347fe275, 0x056a2512), TOBN(0xa4d643d9, 0xde65d95c), - TOBN(0x9669d396, 0x699fc3ed), TOBN(0xb598dee2, 0xcf8c6bbe), - TOBN(0x682ac1e5, 0xdda9e5c6), TOBN(0x4e0d3c72, 0xcaa9fc95), - TOBN(0x17faaade, 0x772bea44), TOBN(0x5ef8428c, 0xab0009c8), - TOBN(0xcc4ce47a, 0x460ff016), TOBN(0xda6d12bf, 0x725281cb), - TOBN(0x44c67848, 0x0223aad2), TOBN(0x6e342afa, 0x36256e28), - TOBN(0x1400bb0b, 0x93a37c04), TOBN(0x62b1bc9b, 0xdd10bd96), - TOBN(0x7251adeb, 0x0dac46b7), TOBN(0x7d33b92e, 0x7be4ef51), - TOBN(0x28b2a94b, 0xe61fa29a), TOBN(0x4b2be13f, 0x06422233), - TOBN(0x36d6d062, 0x330d8d37), TOBN(0x5ef80e1e, 0xb28ca005), - TOBN(0x174d4699, 0x6d16768e), TOBN(0x9fc4ff6a, 0x628bf217), - TOBN(0x77705a94, 0x154e490d), TOBN(0x9d96dd28, 0x8d2d997a), - TOBN(0x77e2d9d8, 0xce5d72c4), TOBN(0x9d06c5a4, 0xc11c714f), - TOBN(0x02aa5136, 0x79e4a03e), TOBN(0x1386b3c2, 0x030ff28b), - TOBN(0xfe82e8a6, 0xfb283f61), TOBN(0x7df203e5, 0xf3abc3fb), - TOBN(0xeec7c351, 0x3a4d3622), TOBN(0xf7d17dbf, 0xdf762761), - TOBN(0xc3956e44, 0x522055f0), TOBN(0xde3012db, 0x8fa748db), - TOBN(0xca9fcb63, 0xbf1dcc14), TOBN(0xa56d9dcf, 0xbe4e2f3a), - TOBN(0xb86186b6, 0x8bcec9c2), TOBN(0x7cf24df9, 0x680b9f06), - TOBN(0xc46b45ea, 0xc0d29281), TOBN(0xfff42bc5, 0x07b10e12), - TOBN(0x12263c40, 0x4d289427), TOBN(0x3d5f1899, 0xb4848ec4), - TOBN(0x11f97010, 0xd040800c), TOBN(0xb4c5f529, 0x300feb20), - TOBN(0xcc543f8f, 0xde94fdcb), TOBN(0xe96af739, 0xc7c2f05e), - TOBN(0xaa5e0036, 0x882692e1), TOBN(0x09c75b68, 0x950d4ae9), - TOBN(0x62f63df2, 0xb5932a7a), TOBN(0x2658252e, 0xde0979ad), - TOBN(0x2a19343f, 0xb5e69631), TOBN(0x718c7501, 0x525b666b), - TOBN(0x26a42d69, 0xea40dc3a), TOBN(0xdc84ad22, 0xaecc018f), - TOBN(0x25c36c7b, 0x3270f04a), TOBN(0x46ba6d47, 0x50fa72ed), - TOBN(0x6c37d1c5, 0x93e58a8e), TOBN(0xa2394731, 0x120c088c), - TOBN(0xc3be4263, 0xcb6e86da), TOBN(0x2c417d36, 0x7126d038), - TOBN(0x5b70f9c5, 0x8b6f8efa), TOBN(0x671a2faa, 0x37718536), - TOBN(0xd3ced3c6, 0xb539c92b), TOBN(0xe56f1bd9, 0xa31203c2), - TOBN(0x8b096ec4, 0x9ff3c8eb), TOBN(0x2deae432, 0x43491cea), - TOBN(0x2465c6eb, 0x17943794), TOBN(0x5d267e66, 0x20586843), - TOBN(0x9d3d116d, 0xb07159d0), TOBN(0xae07a67f, 0xc1896210), - TOBN(0x8fc84d87, 0xbb961579), TOBN(0x30009e49, 0x1c1f8dd6), - TOBN(0x8a8caf22, 0xe3132819), TOBN(0xcffa197c, 0xf23ab4ff), - TOBN(0x58103a44, 0x205dd687), TOBN(0x57b796c3, 0x0ded67a2), - TOBN(0x0b9c3a6c, 0xa1779ad7), TOBN(0xa33cfe2e, 0x357c09c5), - TOBN(0x2ea29315, 0x3db4a57e), TOBN(0x91959695, 0x8ebeb52e), - TOBN(0x118db9a6, 0xe546c879), TOBN(0x8e996df4, 0x6295c8d6), - TOBN(0xdd990484, 0x55ec806b), TOBN(0x24f291ca, 0x165c1035), - TOBN(0xcca523bb, 0x440e2229), TOBN(0x324673a2, 0x73ef4d04), - TOBN(0xaf3adf34, 0x3e11ec39), TOBN(0x6136d7f1, 0xdc5968d3), - TOBN(0x7a7b2899, 0xb053a927), TOBN(0x3eaa2661, 0xae067ecd), - TOBN(0x8549b9c8, 0x02779cd9), TOBN(0x061d7940, 0xc53385ea), - TOBN(0x3e0ba883, 0xf06d18bd), TOBN(0x4ba6de53, 0xb2700843), - TOBN(0xb966b668, 0x591a9e4d), TOBN(0x93f67567, 0x7f4fa0ed), - TOBN(0x5a02711b, 0x4347237b), TOBN(0xbc041e2f, 0xe794608e), - TOBN(0x55af10f5, 0x70f73d8c), TOBN(0xd2d4d4f7, 0xbb7564f7), - TOBN(0xd7d27a89, 0xb3e93ce7), TOBN(0xf7b5a875, 0x5d3a2c1b), - TOBN(0xb29e68a0, 0x255b218a), TOBN(0xb533837e, 0x8af76754), - TOBN(0xd1b05a73, 0x579fab2e), TOBN(0xb41055a1, 0xecd74385), - TOBN(0xb2369274, 0x445e9115), TOBN(0x2972a7c4, 0xf520274e), - TOBN(0x6c08334e, 0xf678e68a), TOBN(0x4e4160f0, 0x99b057ed), - TOBN(0x3cfe11b8, 0x52ccb69a), TOBN(0x2fd1823a, 0x21c8f772), - TOBN(0xdf7f072f, 0x3298f055), TOBN(0x8c0566f9, 0xfec74a6e), - TOBN(0xe549e019, 0x5bb4d041), TOBN(0x7c3930ba, 0x9208d850), - TOBN(0xe07141fc, 0xaaa2902b), TOBN(0x539ad799, 0xe4f69ad3), - TOBN(0xa6453f94, 0x813f9ffd), TOBN(0xc58d3c48, 0x375bc2f7), - TOBN(0xb3326fad, 0x5dc64e96), TOBN(0x3aafcaa9, 0xb240e354), - TOBN(0x1d1b0903, 0xaca1e7a9), TOBN(0x4ceb9767, 0x1211b8a0), - TOBN(0xeca83e49, 0xe32a858e), TOBN(0x4c32892e, 0xae907bad), - TOBN(0xd5b42ab6, 0x2eb9b494), TOBN(0x7fde3ee2, 0x1eabae1b), - TOBN(0x13b5ab09, 0xcaf54957), TOBN(0xbfb028be, 0xe5f5d5d5), - TOBN(0x928a0650, 0x2003e2c0), TOBN(0x90793aac, 0x67476843), - TOBN(0x5e942e79, 0xc81710a0), TOBN(0x557e4a36, 0x27ccadd4), - TOBN(0x72a2bc56, 0x4bcf6d0c), TOBN(0x09ee5f43, 0x26d7b80c), - TOBN(0x6b70dbe9, 0xd4292f19), TOBN(0x56f74c26, 0x63f16b18), - TOBN(0xc23db0f7, 0x35fbb42a), TOBN(0xb606bdf6, 0x6ae10040), - TOBN(0x1eb15d4d, 0x044573ac), TOBN(0x7dc3cf86, 0x556b0ba4), - TOBN(0x97af9a33, 0xc60df6f7), TOBN(0x0b1ef85c, 0xa716ce8c), - TOBN(0x2922f884, 0xc96958be), TOBN(0x7c32fa94, 0x35690963), - TOBN(0x2d7f667c, 0xeaa00061), TOBN(0xeaaf7c17, 0x3547365c), - TOBN(0x1eb4de46, 0x87032d58), TOBN(0xc54f3d83, 0x5e2c79e0), - TOBN(0x07818df4, 0x5d04ef23), TOBN(0x55faa9c8, 0x673d41b4), - TOBN(0xced64f6f, 0x89b95355), TOBN(0x4860d2ea, 0xb7415c84), - TOBN(0x5fdb9bd2, 0x050ebad3), TOBN(0xdb53e0cc, 0x6685a5bf), - TOBN(0xb830c031, 0x9feb6593), TOBN(0xdd87f310, 0x6accff17), - TOBN(0x2303ebab, 0x9f555c10), TOBN(0x94603695, 0x287e7065), - TOBN(0xf88311c3, 0x2e83358c), TOBN(0x508dd9b4, 0xeefb0178), - TOBN(0x7ca23706, 0x2dba8652), TOBN(0x62aac5a3, 0x0047abe5), - TOBN(0x9a61d2a0, 0x8b1ea7b3), TOBN(0xd495ab63, 0xae8b1485), - TOBN(0x38740f84, 0x87052f99), TOBN(0x178ebe5b, 0xb2974eea), - TOBN(0x030bbcca, 0x5b36d17f), TOBN(0xb5e4cce3, 0xaaf86eea), - TOBN(0xb51a0220, 0x68f8e9e0), TOBN(0xa4348796, 0x09eb3e75), - TOBN(0xbe592309, 0xeef1a752), TOBN(0x5d7162d7, 0x6f2aa1ed), - TOBN(0xaebfb5ed, 0x0f007dd2), TOBN(0x255e14b2, 0xc89edd22), - TOBN(0xba85e072, 0x0303b697), TOBN(0xc5d17e25, 0xf05720ff), - TOBN(0x02b58d6e, 0x5128ebb6), TOBN(0x2c80242d, 0xd754e113), - TOBN(0x919fca5f, 0xabfae1ca), TOBN(0x937afaac, 0x1a21459b), - TOBN(0x9e0ca91c, 0x1f66a4d2), TOBN(0x194cc7f3, 0x23ec1331), - TOBN(0xad25143a, 0x8aa11690), TOBN(0xbe40ad8d, 0x09b59e08), - TOBN(0x37d60d9b, 0xe750860a), TOBN(0x6c53b008, 0xc6bf434c), - TOBN(0xb572415d, 0x1356eb80), TOBN(0xb8bf9da3, 0x9578ded8), - TOBN(0x22658e36, 0x5e8fb38b), TOBN(0x9b70ce22, 0x5af8cb22), - TOBN(0x7c00018a, 0x829a8180), TOBN(0x84329f93, 0xb81ed295), - TOBN(0x7c343ea2, 0x5f3cea83), TOBN(0x38f8655f, 0x67586536), - TOBN(0xa661a0d0, 0x1d3ec517), TOBN(0x98744652, 0x512321ae), - TOBN(0x084ca591, 0xeca92598), TOBN(0xa9bb9dc9, 0x1dcb3feb), - TOBN(0x14c54355, 0x78b4c240), TOBN(0x5ed62a3b, 0x610cafdc), - TOBN(0x07512f37, 0x1b38846b), TOBN(0x571bb70a, 0xb0e38161), - TOBN(0xb556b95b, 0x2da705d2), TOBN(0x3ef8ada6, 0xb1a08f98), - TOBN(0x85302ca7, 0xddecfbe5), TOBN(0x0e530573, 0x943105cd), - TOBN(0x60554d55, 0x21a9255d), TOBN(0x63a32fa1, 0xf2f3802a), - TOBN(0x35c8c5b0, 0xcd477875), TOBN(0x97f458ea, 0x6ad42da1), - TOBN(0x832d7080, 0xeb6b242d), TOBN(0xd30bd023, 0x3b71e246), - TOBN(0x7027991b, 0xbe31139d), TOBN(0x68797e91, 0x462e4e53), - TOBN(0x423fe20a, 0x6b4e185a), TOBN(0x82f2c67e, 0x42d9b707), - TOBN(0x25c81768, 0x4cf7811b), TOBN(0xbd53005e, 0x045bb95d)}, - {TOBN(0xe5f649be, 0x9d8e68fd), TOBN(0xdb0f0533, 0x1b044320), - TOBN(0xf6fde9b3, 0xe0c33398), TOBN(0x92f4209b, 0x66c8cfae), - TOBN(0xe9d1afcc, 0x1a739d4b), TOBN(0x09aea75f, 0xa28ab8de), - TOBN(0x14375fb5, 0xeac6f1d0), TOBN(0x6420b560, 0x708f7aa5), - TOBN(0x9eae499c, 0x6254dc41), TOBN(0x7e293924, 0x7a837e7e), - TOBN(0x74aec08c, 0x090524a7), TOBN(0xf82b9219, 0x8d6f55f2), - TOBN(0x493c962e, 0x1402cec5), TOBN(0x9f17ca17, 0xfa2f30e7), - TOBN(0xbcd783e8, 0xe9b879cb), TOBN(0xea3d8c14, 0x5a6f145f), - TOBN(0xdede15e7, 0x5e0dee6e), TOBN(0x74f24872, 0xdc628aa2), - TOBN(0xd3e9c4fe, 0x7861bb93), TOBN(0x56d4822a, 0x6187b2e0), - TOBN(0xb66417cf, 0xc59826f9), TOBN(0xca260969, 0x2408169e), - TOBN(0xedf69d06, 0xc79ef885), TOBN(0x00031f8a, 0xdc7d138f), - TOBN(0x103c46e6, 0x0ebcf726), TOBN(0x4482b831, 0x6231470e), - TOBN(0x6f6dfaca, 0x487c2109), TOBN(0x2e0ace97, 0x62e666ef), - TOBN(0x3246a9d3, 0x1f8d1f42), TOBN(0x1b1e83f1, 0x574944d2), - TOBN(0x13dfa63a, 0xa57f334b), TOBN(0x0cf8daed, 0x9f025d81), - TOBN(0x30d78ea8, 0x00ee11c1), TOBN(0xeb053cd4, 0xb5e3dd75), - TOBN(0x9b65b13e, 0xd58c43c5), TOBN(0xc3ad49bd, 0xbd151663), - TOBN(0x99fd8e41, 0xb6427990), TOBN(0x12cf15bd, 0x707eae1e), - TOBN(0x29ad4f1b, 0x1aabb71e), TOBN(0x5143e74d, 0x07545d0e), - TOBN(0x30266336, 0xc88bdee1), TOBN(0x25f29306, 0x5876767c), - TOBN(0x9c078571, 0xc6731996), TOBN(0xc88690b2, 0xed552951), - TOBN(0x274f2c2d, 0x852705b4), TOBN(0xb0bf8d44, 0x4e09552d), - TOBN(0x7628beeb, 0x986575d1), TOBN(0x407be238, 0x7f864651), - TOBN(0x0e5e3049, 0xa639fc6b), TOBN(0xe75c35d9, 0x86003625), - TOBN(0x0cf35bd8, 0x5dcc1646), TOBN(0x8bcaced2, 0x6c26273a), - TOBN(0xe22ecf1d, 0xb5536742), TOBN(0x013dd897, 0x1a9e068b), - TOBN(0x17f411cb, 0x8a7909c5), TOBN(0x5757ac98, 0x861dd506), - TOBN(0x85de1f0d, 0x1e935abb), TOBN(0xdefd10b4, 0x154de37a), - TOBN(0xb8d9e392, 0x369cebb5), TOBN(0x54d5ef9b, 0x761324be), - TOBN(0x4d6341ba, 0x74f17e26), TOBN(0xc0a0e3c8, 0x78c1dde4), - TOBN(0xa6d77581, 0x87d918fd), TOBN(0x66876015, 0x02ca3a13), - TOBN(0xc7313e9c, 0xf36658f0), TOBN(0xc433ef1c, 0x71f8057e), - TOBN(0x85326246, 0x1b6a835a), TOBN(0xc8f05398, 0x7c86394c), - TOBN(0xff398cdf, 0xe983c4a1), TOBN(0xbf5e8162, 0x03b7b931), - TOBN(0x93193c46, 0xb7b9045b), TOBN(0x1e4ebf5d, 0xa4a6e46b), - TOBN(0xf9942a60, 0x43a24fe7), TOBN(0x29c1191e, 0xffb3492b), - TOBN(0x9f662449, 0x902fde05), TOBN(0xc792a7ac, 0x6713c32d), - TOBN(0x2fd88ad8, 0xb737982c), TOBN(0x7e3a0319, 0xa21e60e3), - TOBN(0x09b0de44, 0x7383591a), TOBN(0x6df141ee, 0x8310a456), - TOBN(0xaec1a039, 0xe6d6f471), TOBN(0x14b2ba0f, 0x1198d12e), - TOBN(0xebc1a160, 0x3aeee5ac), TOBN(0x401f4836, 0xe0b964ce), - TOBN(0x2ee43796, 0x4fd03f66), TOBN(0x3fdb4e49, 0xdd8f3f12), - TOBN(0x6ef267f6, 0x29380f18), TOBN(0x3e8e9670, 0x8da64d16), - TOBN(0xbc19180c, 0x207674f1), TOBN(0x112e09a7, 0x33ae8fdb), - TOBN(0x99667554, 0x6aaeb71e), TOBN(0x79432af1, 0xe101b1c7), - TOBN(0xd5eb558f, 0xde2ddec6), TOBN(0x81392d1f, 0x5357753f), - TOBN(0xa7a76b97, 0x3ae1158a), TOBN(0x416fbbff, 0x4a899991), - TOBN(0x9e65fdfd, 0x0d4a9dcf), TOBN(0x7bc29e48, 0x944ddf12), - TOBN(0xbc1a92d9, 0x3c856866), TOBN(0x273c6905, 0x6e98dfe2), - TOBN(0x69fce418, 0xcdfaa6b8), TOBN(0x606bd823, 0x5061c69f), - TOBN(0x42d495a0, 0x6af75e27), TOBN(0x8ed3d505, 0x6d873a1f), - TOBN(0xaf552841, 0x6ab25b6a), TOBN(0xc6c0ffc7, 0x2b1a4523), - TOBN(0xab18827b, 0x21c99e03), TOBN(0x060e8648, 0x9034691b), - TOBN(0x5207f90f, 0x93c7f398), TOBN(0x9f4a96cb, 0x82f8d10b), - TOBN(0xdd71cd79, 0x3ad0f9e3), TOBN(0x84f435d2, 0xfc3a54f5), - TOBN(0x4b03c55b, 0x8e33787f), TOBN(0xef42f975, 0xa6384673), - TOBN(0xff7304f7, 0x5051b9f0), TOBN(0x18aca1dc, 0x741c87c2), - TOBN(0x56f120a7, 0x2d4bfe80), TOBN(0xfd823b3d, 0x053e732c), - TOBN(0x11bccfe4, 0x7537ca16), TOBN(0xdf6c9c74, 0x1b5a996b), - TOBN(0xee7332c7, 0x904fc3fa), TOBN(0x14a23f45, 0xc7e3636a), - TOBN(0xc38659c3, 0xf091d9aa), TOBN(0x4a995e5d, 0xb12d8540), - TOBN(0x20a53bec, 0xf3a5598a), TOBN(0x56534b17, 0xb1eaa995), - TOBN(0x9ed3dca4, 0xbf04e03c), TOBN(0x716c563a, 0xd8d56268), - TOBN(0x27ba77a4, 0x1d6178e7), TOBN(0xe4c80c40, 0x68a1ff8e), - TOBN(0x75011099, 0x0a13f63d), TOBN(0x7bf33521, 0xa61d46f3), - TOBN(0x0aff218e, 0x10b365bb), TOBN(0x81021804, 0x0fd7ea75), - TOBN(0x05a3fd8a, 0xa4b3a925), TOBN(0xb829e75f, 0x9b3db4e6), - TOBN(0x6bdc75a5, 0x4d53e5fb), TOBN(0x04a5dc02, 0xd52717e3), - TOBN(0x86af502f, 0xe9a42ec2), TOBN(0x8867e8fb, 0x2630e382), - TOBN(0xbf845c6e, 0xbec9889b), TOBN(0x54f491f2, 0xcb47c98d), - TOBN(0xa3091fba, 0x790c2a12), TOBN(0xd7f6fd78, 0xc20f708b), - TOBN(0xa569ac30, 0xacde5e17), TOBN(0xd0f996d0, 0x6852b4d7), - TOBN(0xe51d4bb5, 0x4609ae54), TOBN(0x3fa37d17, 0x0daed061), - TOBN(0x62a88684, 0x34b8fb41), TOBN(0x99a2acbd, 0x9efb64f1), - TOBN(0xb75c1a5e, 0x6448e1f2), TOBN(0xfa99951a, 0x42b5a069), - TOBN(0x6d956e89, 0x2f3b26e7), TOBN(0xf4709860, 0xda875247), - TOBN(0x3ad15179, 0x2482dda3), TOBN(0xd64110e3, 0x017d82f0), - TOBN(0x14928d2c, 0xfad414e4), TOBN(0x2b155f58, 0x2ed02b24), - TOBN(0x481a141b, 0xcb821bf1), TOBN(0x12e3c770, 0x4f81f5da), - TOBN(0xe49c5de5, 0x9fff8381), TOBN(0x11053232, 0x5bbec894), - TOBN(0xa0d051cc, 0x454d88c4), TOBN(0x4f6db89c, 0x1f8e531b), - TOBN(0x34fe3fd6, 0xca563a44), TOBN(0x7f5c2215, 0x58da8ab9), - TOBN(0x8445016d, 0x9474f0a1), TOBN(0x17d34d61, 0xcb7d8a0a), - TOBN(0x8e9d3910, 0x1c474019), TOBN(0xcaff2629, 0xd52ceefb), - TOBN(0xf9cf3e32, 0xc1622c2b), TOBN(0xd4b95e3c, 0xe9071a05), - TOBN(0xfbbca61f, 0x1594438c), TOBN(0x1eb6e6a6, 0x04aadedf), - TOBN(0x853027f4, 0x68e14940), TOBN(0x221d322a, 0xdfabda9c), - TOBN(0xed8ea9f6, 0xb7cb179a), TOBN(0xdc7b764d, 0xb7934dcc), - TOBN(0xfcb13940, 0x5e09180d), TOBN(0x6629a6bf, 0xb47dc2dd), - TOBN(0xbfc55e4e, 0x9f5a915e), TOBN(0xb1db9d37, 0x6204441e), - TOBN(0xf82d68cf, 0x930c5f53), TOBN(0x17d3a142, 0xcbb605b1), - TOBN(0xdd5944ea, 0x308780f2), TOBN(0xdc8de761, 0x3845f5e4), - TOBN(0x6beaba7d, 0x7624d7a3), TOBN(0x1e709afd, 0x304df11e), - TOBN(0x95364376, 0x02170456), TOBN(0xbf204b3a, 0xc8f94b64), - TOBN(0x4e53af7c, 0x5680ca68), TOBN(0x0526074a, 0xe0c67574), - TOBN(0x95d8cef8, 0xecd92af6), TOBN(0xe6b9fa7a, 0x6cd1745a), - TOBN(0x3d546d3d, 0xa325c3e4), TOBN(0x1f57691d, 0x9ae93aae), - TOBN(0xe891f3fe, 0x9d2e1a33), TOBN(0xd430093f, 0xac063d35), - TOBN(0xeda59b12, 0x5513a327), TOBN(0xdc2134f3, 0x5536f18f), - TOBN(0xaa51fe2c, 0x5c210286), TOBN(0x3f68aaee, 0x1cab658c), - TOBN(0x5a23a00b, 0xf9357292), TOBN(0x9a626f39, 0x7efdabed), - TOBN(0xfe2b3bf3, 0x199d78e3), TOBN(0xb7a2af77, 0x71bbc345), - TOBN(0x3d19827a, 0x1e59802c), TOBN(0x823bbc15, 0xb487a51c), - TOBN(0x856139f2, 0x99d0a422), TOBN(0x9ac3df65, 0xf456c6fb), - TOBN(0xaddf65c6, 0x701f8bd6), TOBN(0x149f321e, 0x3758df87), - TOBN(0xb1ecf714, 0x721b7eba), TOBN(0xe17df098, 0x31a3312a), - TOBN(0xdb2fd6ec, 0xd5c4d581), TOBN(0xfd02996f, 0x8fcea1b3), - TOBN(0xe29fa63e, 0x7882f14f), TOBN(0xc9f6dc35, 0x07c6cadc), - TOBN(0x46f22d6f, 0xb882bed0), TOBN(0x1a45755b, 0xd118e52c), - TOBN(0x9f2c7c27, 0x7c4608cf), TOBN(0x7ccbdf32, 0x568012c2), - TOBN(0xfcb0aedd, 0x61729b0e), TOBN(0x7ca2ca9e, 0xf7d75dbf), - TOBN(0xf58fecb1, 0x6f640f62), TOBN(0xe274b92b, 0x39f51946), - TOBN(0x7f4dfc04, 0x6288af44), TOBN(0x0a91f32a, 0xeac329e5), - TOBN(0x43ad274b, 0xd6aaba31), TOBN(0x719a1640, 0x0f6884f9), - TOBN(0x685d29f6, 0xdaf91e20), TOBN(0x5ec1cc33, 0x27e49d52), - TOBN(0x38f4de96, 0x3b54a059), TOBN(0x0e0015e5, 0xefbcfdb3), - TOBN(0x177d23d9, 0x4dbb8da6), TOBN(0x98724aa2, 0x97a617ad), - TOBN(0x30f0885b, 0xfdb6558e), TOBN(0xf9f7a28a, 0xc7899a96), - TOBN(0xd2ae8ac8, 0x872dc112), TOBN(0xfa0642ca, 0x73c3c459), - TOBN(0x15296981, 0xe7dfc8d6), TOBN(0x67cd4450, 0x1fb5b94a), - TOBN(0x0ec71cf1, 0x0eddfd37), TOBN(0xc7e5eeb3, 0x9a8eddc7), - TOBN(0x02ac8e3d, 0x81d95028), TOBN(0x0088f172, 0x70b0e35d), - TOBN(0xec041fab, 0xe1881fe3), TOBN(0x62cf71b8, 0xd99e7faa), - TOBN(0x5043dea7, 0xe0f222c2), TOBN(0x309d42ac, 0x72e65142), - TOBN(0x94fe9ddd, 0x9216cd30), TOBN(0xd6539c7d, 0x0f87feec), - TOBN(0x03c5a57c, 0x432ac7d7), TOBN(0x72692cf0, 0x327fda10), - TOBN(0xec28c85f, 0x280698de), TOBN(0x2331fb46, 0x7ec283b1), - TOBN(0xd34bfa32, 0x2867e633), TOBN(0x78709a82, 0x0a9cc815), - TOBN(0xb7fe6964, 0x875e2fa5), TOBN(0x25cc064f, 0x9e98bfb5), - TOBN(0x9eb0151c, 0x493a65c5), TOBN(0x5fb5d941, 0x53182464), - TOBN(0x69e6f130, 0xf04618e2), TOBN(0xa8ecec22, 0xf89c8ab6), - TOBN(0xcd6ac88b, 0xb96209bd), TOBN(0x65fa8cdb, 0xb3e1c9e0), - TOBN(0xa47d22f5, 0x4a8d8eac), TOBN(0x83895cdf, 0x8d33f963), - TOBN(0xa8adca59, 0xb56cd3d1), TOBN(0x10c8350b, 0xdaf38232), - TOBN(0x2b161fb3, 0xa5080a9f), TOBN(0xbe7f5c64, 0x3af65b3a), - TOBN(0x2c754039, 0x97403a11), TOBN(0x94626cf7, 0x121b96af), - TOBN(0x431de7c4, 0x6a983ec2), TOBN(0x3780dd3a, 0x52cc3df7), - TOBN(0xe28a0e46, 0x2baf8e3b), TOBN(0xabe68aad, 0x51d299ae), - TOBN(0x603eb8f9, 0x647a2408), TOBN(0x14c61ed6, 0x5c750981), - TOBN(0x88b34414, 0xc53352e7), TOBN(0x5a34889c, 0x1337d46e), - TOBN(0x612c1560, 0xf95f2bc8), TOBN(0x8a3f8441, 0xd4807a3a), - TOBN(0x680d9e97, 0x5224da68), TOBN(0x60cd6e88, 0xc3eb00e9), - TOBN(0x3875a98e, 0x9a6bc375), TOBN(0xdc80f924, 0x4fd554c2), - TOBN(0x6c4b3415, 0x6ac77407), TOBN(0xa1e5ea8f, 0x25420681), - TOBN(0x541bfa14, 0x4607a458), TOBN(0x5dbc7e7a, 0x96d7fbf9), - TOBN(0x646a851b, 0x31590a47), TOBN(0x039e85ba, 0x15ee6df8), - TOBN(0xd19fa231, 0xd7b43fc0), TOBN(0x84bc8be8, 0x299a0e04), - TOBN(0x2b9d2936, 0xf20df03a), TOBN(0x24054382, 0x8608d472), - TOBN(0x76b6ba04, 0x9149202a), TOBN(0xb21c3831, 0x3670e7b7), - TOBN(0xddd93059, 0xd6fdee10), TOBN(0x9da47ad3, 0x78488e71), - TOBN(0x99cc1dfd, 0xa0fcfb25), TOBN(0x42abde10, 0x64696954), - TOBN(0x14cc15fc, 0x17eab9fe), TOBN(0xd6e863e4, 0xd3e70972), - TOBN(0x29a7765c, 0x6432112c), TOBN(0x88660001, 0x5b0774d8), - TOBN(0x3729175a, 0x2c088eae), TOBN(0x13afbcae, 0x8230b8d4), - TOBN(0x44768151, 0x915f4379), TOBN(0xf086431a, 0xd8d22812), - TOBN(0x37461955, 0xc298b974), TOBN(0x905fb5f0, 0xf8711e04), - TOBN(0x787abf3a, 0xfe969d18), TOBN(0x392167c2, 0x6f6a494e), - TOBN(0xfc7a0d2d, 0x28c511da), TOBN(0xf127c7dc, 0xb66a262d), - TOBN(0xf9c4bb95, 0xfd63fdf0), TOBN(0x90016589, 0x3913ef46), - TOBN(0x74d2a73c, 0x11aa600d), TOBN(0x2f5379bd, 0x9fb5ab52), - TOBN(0xe49e53a4, 0x7fb70068), TOBN(0x68dd39e5, 0x404aa9a7), - TOBN(0xb9b0cf57, 0x2ecaa9c3), TOBN(0xba0e103b, 0xe824826b), - TOBN(0x60c2198b, 0x4631a3c4), TOBN(0xc5ff84ab, 0xfa8966a2), - TOBN(0x2d6ebe22, 0xac95aff8), TOBN(0x1c9bb6db, 0xb5a46d09), - TOBN(0x419062da, 0x53ee4f8d), TOBN(0x7b9042d0, 0xbb97efef), - TOBN(0x0f87f080, 0x830cf6bd), TOBN(0x4861d19a, 0x6ec8a6c6), - TOBN(0xd3a0daa1, 0x202f01aa), TOBN(0xb0111674, 0xf25afbd5), - TOBN(0x6d00d6cf, 0x1afb20d9), TOBN(0x13695000, 0x40671bc5), - TOBN(0x913ab0dc, 0x2485ea9b), TOBN(0x1f2bed06, 0x9eef61ac), - TOBN(0x850c8217, 0x6d799e20), TOBN(0x93415f37, 0x3271c2de), - TOBN(0x5afb06e9, 0x6c4f5910), TOBN(0x688a52df, 0xc4e9e421), - TOBN(0x30495ba3, 0xe2a9a6db), TOBN(0x4601303d, 0x58f9268b), - TOBN(0xbe3b0dad, 0x7eb0f04f), TOBN(0x4ea47250, 0x4456936d), - TOBN(0x8caf8798, 0xd33fd3e7), TOBN(0x1ccd8a89, 0xeb433708), - TOBN(0x9effe3e8, 0x87fd50ad), TOBN(0xbe240a56, 0x6b29c4df), - TOBN(0xec4ffd98, 0xca0e7ebd), TOBN(0xf586783a, 0xe748616e), - TOBN(0xa5b00d8f, 0xc77baa99), TOBN(0x0acada29, 0xb4f34c9c), - TOBN(0x36dad67d, 0x0fe723ac), TOBN(0x1d8e53a5, 0x39c36c1e), - TOBN(0xe4dd342d, 0x1f4bea41), TOBN(0x64fd5e35, 0xebc9e4e0), - TOBN(0x96f01f90, 0x57908805), TOBN(0xb5b9ea3d, 0x5ed480dd), - TOBN(0x366c5dc2, 0x3efd2dd0), TOBN(0xed2fe305, 0x6e9dfa27), - TOBN(0x4575e892, 0x6e9197e2), TOBN(0x11719c09, 0xab502a5d), - TOBN(0x264c7bec, 0xe81f213f), TOBN(0x741b9241, 0x55f5c457), - TOBN(0x78ac7b68, 0x49a5f4f4), TOBN(0xf91d70a2, 0x9fc45b7d), - TOBN(0x39b05544, 0xb0f5f355), TOBN(0x11f06bce, 0xeef930d9), - TOBN(0xdb84d25d, 0x038d05e1), TOBN(0x04838ee5, 0xbacc1d51), - TOBN(0x9da3ce86, 0x9e8ee00b), TOBN(0xc3412057, 0xc36eda1f), - TOBN(0xae80b913, 0x64d9c2f4), TOBN(0x7468bac3, 0xa010a8ff), - TOBN(0xdfd20037, 0x37359d41), TOBN(0x1a0f5ab8, 0x15efeacc), - TOBN(0x7c25ad2f, 0x659d0ce0), TOBN(0x4011bcbb, 0x6785cff1), - TOBN(0x128b9912, 0x7e2192c7), TOBN(0xa549d8e1, 0x13ccb0e8), - TOBN(0x805588d8, 0xc85438b1), TOBN(0x5680332d, 0xbc25cb27), - TOBN(0xdcd1bc96, 0x1a4bfdf4), TOBN(0x779ff428, 0x706f6566), - TOBN(0x8bbee998, 0xf059987a), TOBN(0xf6ce8cf2, 0xcc686de7), - TOBN(0xf8ad3c4a, 0x953cfdb2), TOBN(0xd1d426d9, 0x2205da36), - TOBN(0xb3c0f13f, 0xc781a241), TOBN(0x3e89360e, 0xd75362a8), - TOBN(0xccd05863, 0xc8a91184), TOBN(0x9bd0c9b7, 0xefa8a7f4), - TOBN(0x97ee4d53, 0x8a912a4b), TOBN(0xde5e15f8, 0xbcf518fd), - TOBN(0x6a055bf8, 0xc467e1e0), TOBN(0x10be4b4b, 0x1587e256), - TOBN(0xd90c14f2, 0x668621c9), TOBN(0xd5518f51, 0xab9c92c1), - TOBN(0x8e6a0100, 0xd6d47b3c), TOBN(0xcbe980dd, 0x66716175), - TOBN(0x500d3f10, 0xddd83683), TOBN(0x3b6cb35d, 0x99cac73c), - TOBN(0x53730c8b, 0x6083d550), TOBN(0xcf159767, 0xdf0a1987), - TOBN(0x84bfcf53, 0x43ad73b3), TOBN(0x1b528c20, 0x4f035a94), - TOBN(0x4294edf7, 0x33eeac69), TOBN(0xb6283e83, 0x817f3240), - TOBN(0xc3fdc959, 0x0a5f25b1), TOBN(0xefaf8aa5, 0x5844ee22), - TOBN(0xde269ba5, 0xdbdde4de), TOBN(0xe3347160, 0xc56133bf), - TOBN(0xc1184219, 0x8d9ea9f8), TOBN(0x090de5db, 0xf3fc1ab5), - TOBN(0x404c37b1, 0x0bf22cda), TOBN(0x7de20ec8, 0xf5618894), - TOBN(0x754c588e, 0xecdaecab), TOBN(0x6ca4b0ed, 0x88342743), - TOBN(0x76f08bdd, 0xf4a938ec), TOBN(0xd182de89, 0x91493ccb), - TOBN(0xd652c53e, 0xc8a4186a), TOBN(0xb3e878db, 0x946d8e33), - TOBN(0x088453c0, 0x5f37663c), TOBN(0x5cd9daaa, 0xb407748b), - TOBN(0xa1f5197f, 0x586d5e72), TOBN(0x47500be8, 0xc443ca59), - TOBN(0x78ef35b2, 0xe2652424), TOBN(0x09c5d26f, 0x6dd7767d), - TOBN(0x7175a79a, 0xa74d3f7b), TOBN(0x0428fd8d, 0xcf5ea459), - TOBN(0x511cb97c, 0xa5d1746d), TOBN(0x36363939, 0xe71d1278), - TOBN(0xcf2df955, 0x10350bf4), TOBN(0xb3817439, 0x60aae782), - TOBN(0xa748c0e4, 0x3e688809), TOBN(0x98021fbf, 0xd7a5a006), - TOBN(0x9076a70c, 0x0e367a98), TOBN(0xbea1bc15, 0x0f62b7c2), - TOBN(0x2645a68c, 0x30fe0343), TOBN(0xacaffa78, 0x699dc14f), - TOBN(0xf4469964, 0x457bf9c4), TOBN(0x0db6407b, 0x0d2ead83), - TOBN(0x68d56cad, 0xb2c6f3eb), TOBN(0x3b512e73, 0xf376356c), - TOBN(0xe43b0e1f, 0xfce10408), TOBN(0x89ddc003, 0x5a5e257d), - TOBN(0xb0ae0d12, 0x0362e5b3), TOBN(0x07f983c7, 0xb0519161), - TOBN(0xc2e94d15, 0x5d5231e7), TOBN(0xcff22aed, 0x0b4f9513), - TOBN(0xb02588dd, 0x6ad0b0b5), TOBN(0xb967d1ac, 0x11d0dcd5), - TOBN(0x8dac6bc6, 0xcf777b6c), TOBN(0x0062bdbd, 0x4c6d1959), - TOBN(0x53da71b5, 0x0ef5cc85), TOBN(0x07012c7d, 0x4006f14f), - TOBN(0x4617f962, 0xac47800d), TOBN(0x53365f2b, 0xc102ed75), - TOBN(0xb422efcb, 0x4ab8c9d3), TOBN(0x195cb26b, 0x34af31c9), - TOBN(0x3a926e29, 0x05f2c4ce), TOBN(0xbd2bdecb, 0x9856966c), - TOBN(0x5d16ab3a, 0x85527015), TOBN(0x9f81609e, 0x4486c231), - TOBN(0xd8b96b2c, 0xda350002), TOBN(0xbd054690, 0xfa1b7d36), - TOBN(0xdc90ebf5, 0xe71d79bc), TOBN(0xf241b6f9, 0x08964e4e), - TOBN(0x7c838643, 0x2fe3cd4c), TOBN(0xe0f33acb, 0xb4bc633c), - TOBN(0xb4a9ecec, 0x3d139f1f), TOBN(0x05ce69cd, 0xdc4a1f49), - TOBN(0xa19d1b16, 0xf5f98aaf), TOBN(0x45bb71d6, 0x6f23e0ef), - TOBN(0x33789fcd, 0x46cdfdd3), TOBN(0x9b8e2978, 0xcee040ca), - TOBN(0x9c69b246, 0xae0a6828), TOBN(0xba533d24, 0x7078d5aa), - TOBN(0x7a2e42c0, 0x7bb4fbdb), TOBN(0xcfb4879a, 0x7035385c), - TOBN(0x8c3dd30b, 0x3281705b), TOBN(0x7e361c6c, 0x404fe081), - TOBN(0x7b21649c, 0x3f604edf), TOBN(0x5dbf6a3f, 0xe52ffe47), - TOBN(0xc41b7c23, 0x4b54d9bf), TOBN(0x1374e681, 0x3511c3d9), - TOBN(0x1863bf16, 0xc1b2b758), TOBN(0x90e78507, 0x1e9e6a96), - TOBN(0xab4bf98d, 0x5d86f174), TOBN(0xd74e0bd3, 0x85e96fe4), - TOBN(0x8afde39f, 0xcac5d344), TOBN(0x90946dbc, 0xbd91b847), - TOBN(0xf5b42358, 0xfe1a838c), TOBN(0x05aae6c5, 0x620ac9d8), - TOBN(0x8e193bd8, 0xa1ce5a0b), TOBN(0x8f710571, 0x4dabfd72), - TOBN(0x8d8fdd48, 0x182caaac), TOBN(0x8c4aeefa, 0x040745cf), - TOBN(0x73c6c30a, 0xf3b93e6d), TOBN(0x991241f3, 0x16f42011), - TOBN(0xa0158eea, 0xe457a477), TOBN(0xd19857db, 0xee6ddc05), - TOBN(0xb3265224, 0x18c41671), TOBN(0x3ffdfc7e, 0x3c2c0d58), - TOBN(0x3a3a5254, 0x26ee7cda), TOBN(0x341b0869, 0xdf02c3a8), - TOBN(0xa023bf42, 0x723bbfc8), TOBN(0x3d15002a, 0x14452691)}, - {TOBN(0x5ef7324c, 0x85edfa30), TOBN(0x25976554, 0x87d4f3da), - TOBN(0x352f5bc0, 0xdcb50c86), TOBN(0x8f6927b0, 0x4832a96c), - TOBN(0xd08ee1ba, 0x55f2f94c), TOBN(0x6a996f99, 0x344b45fa), - TOBN(0xe133cb8d, 0xa8aa455d), TOBN(0x5d0721ec, 0x758dc1f7), - TOBN(0x6ba7a920, 0x79e5fb67), TOBN(0xe1331feb, 0x70aa725e), - TOBN(0x5080ccf5, 0x7df5d837), TOBN(0xe4cae01d, 0x7ff72e21), - TOBN(0xd9243ee6, 0x0412a77d), TOBN(0x06ff7cac, 0xdf449025), - TOBN(0xbe75f7cd, 0x23ef5a31), TOBN(0xbc957822, 0x0ddef7a8), - TOBN(0x8cf7230c, 0xb0ce1c55), TOBN(0x5b534d05, 0x0bbfb607), - TOBN(0xee1ef113, 0x0e16363b), TOBN(0x27e0aa7a, 0xb4999e82), - TOBN(0xce1dac2d, 0x79362c41), TOBN(0x67920c90, 0x91bb6cb0), - TOBN(0x1e648d63, 0x2223df24), TOBN(0x0f7d9eef, 0xe32e8f28), - TOBN(0x6943f39a, 0xfa833834), TOBN(0x22951722, 0xa6328562), - TOBN(0x81d63dd5, 0x4170fc10), TOBN(0x9f5fa58f, 0xaecc2e6d), - TOBN(0xb66c8725, 0xe77d9a3b), TOBN(0x11235cea, 0x6384ebe0), - TOBN(0x06a8c118, 0x5845e24a), TOBN(0x0137b286, 0xebd093b1), - TOBN(0xc589e1ce, 0x44ace150), TOBN(0xe0f8d3d9, 0x4381e97c), - TOBN(0x59e99b11, 0x62c5a4b8), TOBN(0x90d262f7, 0xfd0ec9f9), - TOBN(0xfbc854c9, 0x283e13c9), TOBN(0x2d04fde7, 0xaedc7085), - TOBN(0x057d7765, 0x47dcbecb), TOBN(0x8dbdf591, 0x9a76fa5f), - TOBN(0xd0150695, 0x0de1e578), TOBN(0x2e1463e7, 0xe9f72bc6), - TOBN(0xffa68441, 0x1b39eca5), TOBN(0x673c8530, 0x7c037f2f), - TOBN(0xd0d6a600, 0x747f91da), TOBN(0xb08d43e1, 0xc9cb78e9), - TOBN(0x0fc0c644, 0x27b5cef5), TOBN(0x5c1d160a, 0xa60a2fd6), - TOBN(0xf98cae53, 0x28c8e13b), TOBN(0x375f10c4, 0xb2eddcd1), - TOBN(0xd4eb8b7f, 0x5cce06ad), TOBN(0xb4669f45, 0x80a2e1ef), - TOBN(0xd593f9d0, 0x5bbd8699), TOBN(0x5528a4c9, 0xe7976d13), - TOBN(0x3923e095, 0x1c7e28d3), TOBN(0xb9293790, 0x3f6bb577), - TOBN(0xdb567d6a, 0xc42bd6d2), TOBN(0x6df86468, 0xbb1f96ae), - TOBN(0x0efe5b1a, 0x4843b28e), TOBN(0x961bbb05, 0x6379b240), - TOBN(0xb6caf5f0, 0x70a6a26b), TOBN(0x70686c0d, 0x328e6e39), - TOBN(0x80da06cf, 0x895fc8d3), TOBN(0x804d8810, 0xb363fdc9), - TOBN(0xbe22877b, 0x207f1670), TOBN(0x9b0dd188, 0x4e615291), - TOBN(0x625ae8dc, 0x97a3c2bf), TOBN(0x08584ef7, 0x439b86e8), - TOBN(0xde7190a5, 0xdcd898ff), TOBN(0x26286c40, 0x2058ee3d), - TOBN(0x3db0b217, 0x5f87b1c1), TOBN(0xcc334771, 0x102a6db5), - TOBN(0xd99de954, 0x2f770fb1), TOBN(0x97c1c620, 0x4cd7535e), - TOBN(0xd3b6c448, 0x3f09cefc), TOBN(0xd725af15, 0x5a63b4f8), - TOBN(0x0c95d24f, 0xc01e20ec), TOBN(0xdfd37494, 0x9ae7121f), - TOBN(0x7d6ddb72, 0xec77b7ec), TOBN(0xfe079d3b, 0x0353a4ae), - TOBN(0x3066e70a, 0x2e6ac8d2), TOBN(0x9c6b5a43, 0x106e5c05), - TOBN(0x52d3c6f5, 0xede59b8c), TOBN(0x30d6a5c3, 0xfccec9ae), - TOBN(0xedec7c22, 0x4fc0a9ef), TOBN(0x190ff083, 0x95c16ced), - TOBN(0xbe12ec8f, 0x94de0fde), TOBN(0x0d131ab8, 0x852d3433), - TOBN(0x42ace07e, 0x85701291), TOBN(0x94793ed9, 0x194061a8), - TOBN(0x30e83ed6, 0xd7f4a485), TOBN(0x9eec7269, 0xf9eeff4d), - TOBN(0x90acba59, 0x0c9d8005), TOBN(0x5feca458, 0x1e79b9d1), - TOBN(0x8fbe5427, 0x1d506a1e), TOBN(0xa32b2c8e, 0x2439cfa7), - TOBN(0x1671c173, 0x73dd0b4e), TOBN(0x37a28214, 0x44a054c6), - TOBN(0x81760a1b, 0x4e8b53f1), TOBN(0xa6c04224, 0xf9f93b9e), - TOBN(0x18784b34, 0xcf671e3c), TOBN(0x81bbecd2, 0xcda9b994), - TOBN(0x38831979, 0xb2ab3848), TOBN(0xef54feb7, 0xf2e03c2d), - TOBN(0xcf197ca7, 0xfb8088fa), TOBN(0x01427247, 0x4ddc96c5), - TOBN(0xa2d2550a, 0x30777176), TOBN(0x53469898, 0x4d0cf71d), - TOBN(0x6ce937b8, 0x3a2aaac6), TOBN(0xe9f91dc3, 0x5af38d9b), - TOBN(0x2598ad83, 0xc8bf2899), TOBN(0x8e706ac9, 0xb5536c16), - TOBN(0x40dc7495, 0xf688dc98), TOBN(0x26490cd7, 0x124c4afc), - TOBN(0xe651ec84, 0x1f18775c), TOBN(0x393ea6c3, 0xb4fdaf4a), - TOBN(0x1e1f3343, 0x7f338e0d), TOBN(0x39fb832b, 0x6053e7b5), - TOBN(0x46e702da, 0x619e14d5), TOBN(0x859cacd1, 0xcdeef6e0), - TOBN(0x63b99ce7, 0x4462007d), TOBN(0xb8ab48a5, 0x4cb5f5b7), - TOBN(0x9ec673d2, 0xf55edde7), TOBN(0xd1567f74, 0x8cfaefda), - TOBN(0x46381b6b, 0x0887bcec), TOBN(0x694497ce, 0xe178f3c2), - TOBN(0x5e6525e3, 0x1e6266cb), TOBN(0x5931de26, 0x697d6413), - TOBN(0x87f8df7c, 0x0e58d493), TOBN(0xb1ae5ed0, 0x58b73f12), - TOBN(0xc368f784, 0xdea0c34d), TOBN(0x9bd0a120, 0x859a91a0), - TOBN(0xb00d88b7, 0xcc863c68), TOBN(0x3a1cc11e, 0x3d1f4d65), - TOBN(0xea38e0e7, 0x0aa85593), TOBN(0x37f13e98, 0x7dc4aee8), - TOBN(0x10d38667, 0xbc947bad), TOBN(0x738e07ce, 0x2a36ee2e), - TOBN(0xc93470cd, 0xc577fcac), TOBN(0xdee1b616, 0x2782470d), - TOBN(0x36a25e67, 0x2e793d12), TOBN(0xd6aa6cae, 0xe0f186da), - TOBN(0x474d0fd9, 0x80e07af7), TOBN(0xf7cdc47d, 0xba8a5cd4), - TOBN(0x28af6d9d, 0xab15247f), TOBN(0x7c789c10, 0x493a537f), - TOBN(0x7ac9b110, 0x23a334e7), TOBN(0x0236ac09, 0x12c9c277), - TOBN(0xa7e5bd25, 0x1d7a5144), TOBN(0x098b9c2a, 0xf13ec4ec), - TOBN(0x3639daca, 0xd3f0abca), TOBN(0x642da81a, 0xa23960f9), - TOBN(0x7d2e5c05, 0x4f7269b1), TOBN(0xfcf30777, 0xe287c385), - TOBN(0x10edc84f, 0xf2a46f21), TOBN(0x35441757, 0x4f43fa36), - TOBN(0xf1327899, 0xfd703431), TOBN(0xa438d7a6, 0x16dd587a), - TOBN(0x65c34c57, 0xe9c8352d), TOBN(0xa728edab, 0x5cc5a24e), - TOBN(0xaed78abc, 0x42531689), TOBN(0x0a51a0e8, 0x010963ef), - TOBN(0x5776fa0a, 0xd717d9b3), TOBN(0xf356c239, 0x7dd3428b), - TOBN(0x29903fff, 0x8d3a3dac), TOBN(0x409597fa, 0x3d94491f), - TOBN(0x4cd7a5ff, 0xbf4a56a4), TOBN(0xe5096474, 0x8adab462), - TOBN(0xa97b5126, 0x5c3427b0), TOBN(0x6401405c, 0xd282c9bd), - TOBN(0x3629f8d7, 0x222c5c45), TOBN(0xb1c02c16, 0xe8d50aed), - TOBN(0xbea2ed75, 0xd9635bc9), TOBN(0x226790c7, 0x6e24552f), - TOBN(0x3c33f2a3, 0x65f1d066), TOBN(0x2a43463e, 0x6dfccc2e), - TOBN(0x8cc3453a, 0xdb483761), TOBN(0xe7cc6085, 0x65d5672b), - TOBN(0x277ed6cb, 0xde3efc87), TOBN(0x19f2f368, 0x69234eaf), - TOBN(0x9aaf4317, 0x5c0b800b), TOBN(0x1f1e7c89, 0x8b6da6e2), - TOBN(0x6cfb4715, 0xb94ec75e), TOBN(0xd590dd5f, 0x453118c2), - TOBN(0x14e49da1, 0x1f17a34c), TOBN(0x5420ab39, 0x235a1456), - TOBN(0xb7637241, 0x2f50363b), TOBN(0x7b15d623, 0xc3fabb6e), - TOBN(0xa0ef40b1, 0xe274e49c), TOBN(0x5cf50744, 0x96b1860a), - TOBN(0xd6583fbf, 0x66afe5a4), TOBN(0x44240510, 0xf47e3e9a), - TOBN(0x99254343, 0x11b2d595), TOBN(0xf1367499, 0xeec8df57), - TOBN(0x3cb12c61, 0x3e73dd05), TOBN(0xd248c033, 0x7dac102a), - TOBN(0xcf154f13, 0xa77739f5), TOBN(0xbf4288cb, 0x23d2af42), - TOBN(0xaa64c9b6, 0x32e4a1cf), TOBN(0xee8c07a8, 0xc8a208f3), - TOBN(0xe10d4999, 0x6fe8393f), TOBN(0x0f809a3f, 0xe91f3a32), - TOBN(0x61096d1c, 0x802f63c8), TOBN(0x289e1462, 0x57750d3d), - TOBN(0xed06167e, 0x9889feea), TOBN(0xd5c9c0e2, 0xe0993909), - TOBN(0x46fca0d8, 0x56508ac6), TOBN(0x91826047, 0x4f1b8e83), - TOBN(0x4f2c877a, 0x9a4a2751), TOBN(0x71bd0072, 0xcae6fead), - TOBN(0x38df8dcc, 0x06aa1941), TOBN(0x5a074b4c, 0x63beeaa8), - TOBN(0xd6d65934, 0xc1cec8ed), TOBN(0xa6ecb49e, 0xaabc03bd), - TOBN(0xaade91c2, 0xde8a8415), TOBN(0xcfb0efdf, 0x691136e0), - TOBN(0x11af45ee, 0x23ab3495), TOBN(0xa132df88, 0x0b77463d), - TOBN(0x8923c15c, 0x815d06f4), TOBN(0xc3ceb3f5, 0x0d61a436), - TOBN(0xaf52291d, 0xe88fb1da), TOBN(0xea057974, 0x1da12179), - TOBN(0xb0d7218c, 0xd2fef720), TOBN(0x6c0899c9, 0x8e1d8845), - TOBN(0x98157504, 0x752ddad7), TOBN(0xd60bd74f, 0xa1a68a97), - TOBN(0x7047a3a9, 0xf658fb99), TOBN(0x1f5d86d6, 0x5f8511e4), - TOBN(0xb8a4bc42, 0x4b5a6d88), TOBN(0x69eb2c33, 0x1abefa7d), - TOBN(0x95bf39e8, 0x13c9c510), TOBN(0xf571960a, 0xd48aab43), - TOBN(0x7e8cfbcf, 0x704e23c6), TOBN(0xc71b7d22, 0x28aaa65b), - TOBN(0xa041b2bd, 0x245e3c83), TOBN(0x69b98834, 0xd21854ff), - TOBN(0x89d227a3, 0x963bfeec), TOBN(0x99947aaa, 0xde7da7cb), - TOBN(0x1d9ee9db, 0xee68a9b1), TOBN(0x0a08f003, 0x698ec368), - TOBN(0xe9ea4094, 0x78ef2487), TOBN(0xc8d2d415, 0x02cfec26), - TOBN(0xc52f9a6e, 0xb7dcf328), TOBN(0x0ed489e3, 0x85b6a937), - TOBN(0x9b94986b, 0xbef3366e), TOBN(0x0de59c70, 0xedddddb8), - TOBN(0xffdb748c, 0xeadddbe2), TOBN(0x9b9784bb, 0x8266ea40), - TOBN(0x142b5502, 0x1a93507a), TOBN(0xb4cd1187, 0x8d3c06cf), - TOBN(0xdf70e76a, 0x91ec3f40), TOBN(0x484e81ad, 0x4e7553c2), - TOBN(0x830f87b5, 0x272e9d6e), TOBN(0xea1c93e5, 0xc6ff514a), - TOBN(0x67cc2adc, 0xc4192a8e), TOBN(0xc77e27e2, 0x42f4535a), - TOBN(0x9cdbab36, 0xd2b713c5), TOBN(0x86274ea0, 0xcf7b0cd3), - TOBN(0x784680f3, 0x09af826b), TOBN(0xbfcc837a, 0x0c72dea3), - TOBN(0xa8bdfe9d, 0xd6529b73), TOBN(0x708aa228, 0x63a88002), - TOBN(0x6c7a9a54, 0xc91d45b9), TOBN(0xdf1a38bb, 0xfd004f56), - TOBN(0x2e8c9a26, 0xb8bad853), TOBN(0x2d52cea3, 0x3723eae7), - TOBN(0x054d6d81, 0x56ca2830), TOBN(0xa3317d14, 0x9a8dc411), - TOBN(0xa08662fe, 0xfd4ddeda), TOBN(0xed2a153a, 0xb55d792b), - TOBN(0x7035c16a, 0xbfc6e944), TOBN(0xb6bc5834, 0x00171cf3), - TOBN(0xe27152b3, 0x83d102b6), TOBN(0xfe695a47, 0x0646b848), - TOBN(0xa5bb09d8, 0x916e6d37), TOBN(0xb4269d64, 0x0d17015e), - TOBN(0x8d8156a1, 0x0a1d2285), TOBN(0xfeef6c51, 0x46d26d72), - TOBN(0x9dac57c8, 0x4c5434a7), TOBN(0x0282e5be, 0x59d39e31), - TOBN(0xedfff181, 0x721c486d), TOBN(0x301baf10, 0xbc58824e), - TOBN(0x8136a6aa, 0x00570031), TOBN(0x55aaf78c, 0x1cddde68), - TOBN(0x26829371, 0x59c63952), TOBN(0x3a3bd274, 0x8bc25baf), - TOBN(0xecdf8657, 0xb7e52dc3), TOBN(0x2dd8c087, 0xfd78e6c8), - TOBN(0x20553274, 0xf5531461), TOBN(0x8b4a1281, 0x5d95499b), - TOBN(0xe2c8763a, 0x1a80f9d2), TOBN(0xd1dbe32b, 0x4ddec758), - TOBN(0xaf12210d, 0x30c34169), TOBN(0xba74a953, 0x78baa533), - TOBN(0x3d133c6e, 0xa438f254), TOBN(0xa431531a, 0x201bef5b), - TOBN(0x15295e22, 0xf669d7ec), TOBN(0xca374f64, 0x357fb515), - TOBN(0x8a8406ff, 0xeaa3fdb3), TOBN(0x106ae448, 0xdf3f2da8), - TOBN(0x8f9b0a90, 0x33c8e9a1), TOBN(0x234645e2, 0x71ad5885), - TOBN(0x3d083224, 0x1c0aed14), TOBN(0xf10a7d3e, 0x7a942d46), - TOBN(0x7c11deee, 0x40d5c9be), TOBN(0xb2bae7ff, 0xba84ed98), - TOBN(0x93e97139, 0xaad58ddd), TOBN(0x3d872796, 0x3f6d1fa3), - TOBN(0x483aca81, 0x8569ff13), TOBN(0x8b89a5fb, 0x9a600f72), - TOBN(0x4cbc27c3, 0xc06f2b86), TOBN(0x22130713, 0x63ad9c0b), - TOBN(0xb5358b1e, 0x48ac2840), TOBN(0x18311294, 0xecba9477), - TOBN(0xda58f990, 0xa6946b43), TOBN(0x3098baf9, 0x9ab41819), - TOBN(0x66c4c158, 0x4198da52), TOBN(0xab4fc17c, 0x146bfd1b), - TOBN(0x2f0a4c3c, 0xbf36a908), TOBN(0x2ae9e34b, 0x58cf7838), - TOBN(0xf411529e, 0x3fa11b1f), TOBN(0x21e43677, 0x974af2b4), - TOBN(0x7c20958e, 0xc230793b), TOBN(0x710ea885, 0x16e840f3), - TOBN(0xfc0b21fc, 0xc5dc67cf), TOBN(0x08d51647, 0x88405718), - TOBN(0xd955c21f, 0xcfe49eb7), TOBN(0x9722a5d5, 0x56dd4a1f), - TOBN(0xc9ef50e2, 0xc861baa5), TOBN(0xc0c21a5d, 0x9505ac3e), - TOBN(0xaf6b9a33, 0x8b7c063f), TOBN(0xc6370339, 0x2f4779c1), - TOBN(0x22df99c7, 0x638167c3), TOBN(0xfe6ffe76, 0x795db30c), - TOBN(0x2b822d33, 0xa4854989), TOBN(0xfef031dd, 0x30563aa5), - TOBN(0x16b09f82, 0xd57c667f), TOBN(0xc70312ce, 0xcc0b76f1), - TOBN(0xbf04a9e6, 0xc9118aec), TOBN(0x82fcb419, 0x3409d133), - TOBN(0x1a8ab385, 0xab45d44d), TOBN(0xfba07222, 0x617b83a3), - TOBN(0xb05f50dd, 0x58e81b52), TOBN(0x1d8db553, 0x21ce5aff), - TOBN(0x3097b8d4, 0xe344a873), TOBN(0x7d8d116d, 0xfe36d53e), - TOBN(0x6db22f58, 0x7875e750), TOBN(0x2dc5e373, 0x43e144ea), - TOBN(0xc05f32e6, 0xe799eb95), TOBN(0xe9e5f4df, 0x6899e6ec), - TOBN(0xbdc3bd68, 0x1fab23d5), TOBN(0xb72b8ab7, 0x73af60e6), - TOBN(0x8db27ae0, 0x2cecc84a), TOBN(0x600016d8, 0x7bdb871c), - TOBN(0x42a44b13, 0xd7c46f58), TOBN(0xb8919727, 0xc3a77d39), - TOBN(0xcfc6bbbd, 0xdafd6088), TOBN(0x1a740146, 0x6bd20d39), - TOBN(0x8c747abd, 0x98c41072), TOBN(0x4c91e765, 0xbdf68ea1), - TOBN(0x7c95e5ca, 0x08819a78), TOBN(0xcf48b729, 0xc9587921), - TOBN(0x091c7c5f, 0xdebbcc7d), TOBN(0x6f287404, 0xf0e05149), - TOBN(0xf83b5ac2, 0x26cd44ec), TOBN(0x88ae32a6, 0xcfea250e), - TOBN(0x6ac5047a, 0x1d06ebc5), TOBN(0xc7e550b4, 0xd434f781), - TOBN(0x61ab1cf2, 0x5c727bd2), TOBN(0x2e4badb1, 0x1cf915b0), - TOBN(0x1b4dadec, 0xf69d3920), TOBN(0xe61b1ca6, 0xf14c1dfe), - TOBN(0x90b479cc, 0xbd6bd51f), TOBN(0x8024e401, 0x8045ec30), - TOBN(0xcab29ca3, 0x25ef0e62), TOBN(0x4f2e9416, 0x49e4ebc0), - TOBN(0x45eb40ec, 0x0ccced58), TOBN(0x25cd4b9c, 0x0da44f98), - TOBN(0x43e06458, 0x871812c6), TOBN(0x99f80d55, 0x16cef651), - TOBN(0x571340c9, 0xce6dc153), TOBN(0x138d5117, 0xd8665521), - TOBN(0xacdb45bc, 0x4e07014d), TOBN(0x2f34bb38, 0x84b60b91), - TOBN(0xf44a4fd2, 0x2ae8921e), TOBN(0xb039288e, 0x892ba1e2), - TOBN(0x9da50174, 0xb1c180b2), TOBN(0x6b70ab66, 0x1693dc87), - TOBN(0x7e9babc9, 0xe7057481), TOBN(0x4581ddef, 0x9c80dc41), - TOBN(0x0c890da9, 0x51294682), TOBN(0x0b5629d3, 0x3f4736e5), - TOBN(0x2340c79e, 0xb06f5b41), TOBN(0xa42e84ce, 0x4e243469), - TOBN(0xf9a20135, 0x045a71a9), TOBN(0xefbfb415, 0xd27b6fb6), - TOBN(0x25ebea23, 0x9d33cd6f), TOBN(0x9caedb88, 0xaa6c0af8), - TOBN(0x53dc7e9a, 0xd9ce6f96), TOBN(0x3897f9fd, 0x51e0b15a), - TOBN(0xf51cb1f8, 0x8e5d788e), TOBN(0x1aec7ba8, 0xe1d490ee), - TOBN(0x265991e0, 0xcc58cb3c), TOBN(0x9f306e8c, 0x9fc3ad31), - TOBN(0x5fed006e, 0x5040a0ac), TOBN(0xca9d5043, 0xfb476f2e), - TOBN(0xa19c06e8, 0xbeea7a23), TOBN(0xd2865801, 0x0edabb63), - TOBN(0xdb92293f, 0x6967469a), TOBN(0x2894d839, 0x8d8a8ed8), - TOBN(0x87c9e406, 0xbbc77122), TOBN(0x8671c6f1, 0x2ea3a26a), - TOBN(0xe42df8d6, 0xd7de9853), TOBN(0x2e3ce346, 0xb1f2bcc7), - TOBN(0xda601dfc, 0x899d50cf), TOBN(0xbfc913de, 0xfb1b598f), - TOBN(0x81c4909f, 0xe61f7908), TOBN(0x192e304f, 0x9bbc7b29), - TOBN(0xc3ed8738, 0xc104b338), TOBN(0xedbe9e47, 0x783f5d61), - TOBN(0x0c06e9be, 0x2db30660), TOBN(0xda3e613f, 0xc0eb7d8e), - TOBN(0xd8fa3e97, 0x322e096e), TOBN(0xfebd91e8, 0xd336e247), - TOBN(0x8f13ccc4, 0xdf655a49), TOBN(0xa9e00dfc, 0x5eb20210), - TOBN(0x84631d0f, 0xc656b6ea), TOBN(0x93a058cd, 0xd8c0d947), - TOBN(0x6846904a, 0x67bd3448), TOBN(0x4a3d4e1a, 0xf394fd5c), - TOBN(0xc102c1a5, 0xdb225f52), TOBN(0xe3455bba, 0xfc4f5e9a), - TOBN(0x6b36985b, 0x4b9ad1ce), TOBN(0xa9818536, 0x5bb7f793), - TOBN(0x6c25e1d0, 0x48b1a416), TOBN(0x1381dd53, 0x3c81bee7), - TOBN(0xd2a30d61, 0x7a4a7620), TOBN(0xc8412926, 0x39b8944c), - TOBN(0x3c1c6fbe, 0x7a97c33a), TOBN(0x941e541d, 0x938664e7), - TOBN(0x417499e8, 0x4a34f239), TOBN(0x15fdb83c, 0xb90402d5), - TOBN(0xb75f46bf, 0x433aa832), TOBN(0xb61e15af, 0x63215db1), - TOBN(0xaabe59d4, 0xa127f89a), TOBN(0x5d541e0c, 0x07e816da), - TOBN(0xaaba0659, 0xa618b692), TOBN(0x55327733, 0x17266026), - TOBN(0xaf53a0fc, 0x95f57552), TOBN(0x32947650, 0x6cacb0c9), - TOBN(0x253ff58d, 0xc821be01), TOBN(0xb0309531, 0xa06f1146), - TOBN(0x59bbbdf5, 0x05c2e54d), TOBN(0x158f27ad, 0x26e8dd22), - TOBN(0xcc5b7ffb, 0x397e1e53), TOBN(0xae03f65b, 0x7fc1e50d), - TOBN(0xa9784ebd, 0x9c95f0f9), TOBN(0x5ed9deb2, 0x24640771), - TOBN(0x31244af7, 0x035561c4), TOBN(0x87332f3a, 0x7ee857de), - TOBN(0x09e16e9e, 0x2b9e0d88), TOBN(0x52d910f4, 0x56a06049), - TOBN(0x507ed477, 0xa9592f48), TOBN(0x85cb917b, 0x2365d678), - TOBN(0xf8511c93, 0x4c8998d1), TOBN(0x2186a3f1, 0x730ea58f), - TOBN(0x50189626, 0xb2029db0), TOBN(0x9137a6d9, 0x02ceb75a), - TOBN(0x2fe17f37, 0x748bc82c), TOBN(0x87c2e931, 0x80469f8c), - TOBN(0x850f71cd, 0xbf891aa2), TOBN(0x0ca1b89b, 0x75ec3d8d), - TOBN(0x516c43aa, 0x5e1cd3cd), TOBN(0x89397808, 0x9a887c28), - TOBN(0x0059c699, 0xddea1f9f), TOBN(0x7737d6fa, 0x8e6868f7), - TOBN(0x6d93746a, 0x60f1524b), TOBN(0x36985e55, 0xba052aa7), - TOBN(0x41b1d322, 0xed923ea5), TOBN(0x3429759f, 0x25852a11), - TOBN(0xbeca6ec3, 0x092e9f41), TOBN(0x3a238c66, 0x62256bbd), - TOBN(0xd82958ea, 0x70ad487d), TOBN(0x4ac8aaf9, 0x65610d93), - TOBN(0x3fa101b1, 0x5e4ccab0), TOBN(0x9bf430f2, 0x9de14bfb), - TOBN(0xa10f5cc6, 0x6531899d), TOBN(0x590005fb, 0xea8ce17d), - TOBN(0xc437912f, 0x24544cb6), TOBN(0x9987b71a, 0xd79ac2e3), - TOBN(0x13e3d9dd, 0xc058a212), TOBN(0x00075aac, 0xd2de9606), - TOBN(0x80ab508b, 0x6cac8369), TOBN(0x87842be7, 0xf54f6c89), - TOBN(0xa7ad663d, 0x6bc532a4), TOBN(0x67813de7, 0x78a91bc8), - TOBN(0x5dcb61ce, 0xc3427239), TOBN(0x5f3c7cf0, 0xc56934d9), - TOBN(0xc079e0fb, 0xe3191591), TOBN(0xe40896bd, 0xb01aada7), - TOBN(0x8d466791, 0x0492d25f), TOBN(0x8aeb30c9, 0xe7408276), - TOBN(0xe9437495, 0x9287aacc), TOBN(0x23d4708d, 0x79fe03d4), - TOBN(0x8cda9cf2, 0xd0c05199), TOBN(0x502fbc22, 0xfae78454), - TOBN(0xc0bda9df, 0xf572a182), TOBN(0x5f9b71b8, 0x6158b372), - TOBN(0xe0f33a59, 0x2b82dd07), TOBN(0x76302735, 0x9523032e), - TOBN(0x7fe1a721, 0xc4505a32), TOBN(0x7b6e3e82, 0xf796409f)}, - {TOBN(0xe3417bc0, 0x35d0b34a), TOBN(0x440b386b, 0x8327c0a7), - TOBN(0x8fb7262d, 0xac0362d1), TOBN(0x2c41114c, 0xe0cdf943), - TOBN(0x2ba5cef1, 0xad95a0b1), TOBN(0xc09b37a8, 0x67d54362), - TOBN(0x26d6cdd2, 0x01e486c9), TOBN(0x20477abf, 0x42ff9297), - TOBN(0xa004dcb3, 0x292a9287), TOBN(0xddc15cf6, 0x77b092c7), - TOBN(0x083a8464, 0x806c0605), TOBN(0x4a68df70, 0x3db997b0), - TOBN(0x9c134e45, 0x05bf7dd0), TOBN(0xa4e63d39, 0x8ccf7f8c), - TOBN(0xa6e6517f, 0x41b5f8af), TOBN(0xaa8b9342, 0xad7bc1cc), - TOBN(0x126f35b5, 0x1e706ad9), TOBN(0xb99cebb4, 0xc3a9ebdf), - TOBN(0xa75389af, 0xbf608d90), TOBN(0x76113c4f, 0xc6c89858), - TOBN(0x80de8eb0, 0x97e2b5aa), TOBN(0x7e1022cc, 0x63b91304), - TOBN(0x3bdab605, 0x6ccc066c), TOBN(0x33cbb144, 0xb2edf900), - TOBN(0xc4176471, 0x7af715d2), TOBN(0xe2f7f594, 0xd0134a96), - TOBN(0x2c1873ef, 0xa41ec956), TOBN(0xe4e7b4f6, 0x77821304), - TOBN(0xe5c8ff97, 0x88d5374a), TOBN(0x2b915e63, 0x80823d5b), - TOBN(0xea6bc755, 0xb2ee8fe2), TOBN(0x6657624c, 0xe7112651), - TOBN(0x157af101, 0xdace5aca), TOBN(0xc4fdbcf2, 0x11a6a267), - TOBN(0xdaddf340, 0xc49c8609), TOBN(0x97e49f52, 0xe9604a65), - TOBN(0x9be8e790, 0x937e2ad5), TOBN(0x846e2508, 0x326e17f1), - TOBN(0x3f38007a, 0x0bbbc0dc), TOBN(0xcf03603f, 0xb11e16d6), - TOBN(0xd6f800e0, 0x7442f1d5), TOBN(0x475607d1, 0x66e0e3ab), - TOBN(0x82807f16, 0xb7c64047), TOBN(0x8858e1e3, 0xa749883d), - TOBN(0x5859120b, 0x8231ee10), TOBN(0x1b80e7eb, 0x638a1ece), - TOBN(0xcb72525a, 0xc6aa73a4), TOBN(0xa7cdea3d, 0x844423ac), - TOBN(0x5ed0c007, 0xf8ae7c38), TOBN(0x6db07a5c, 0x3d740192), - TOBN(0xbe5e9c2a, 0x5fe36db3), TOBN(0xd5b9d57a, 0x76e95046), - TOBN(0x54ac32e7, 0x8eba20f2), TOBN(0xef11ca8f, 0x71b9a352), - TOBN(0x305e373e, 0xff98a658), TOBN(0xffe5a100, 0x823eb667), - TOBN(0x57477b11, 0xe51732d2), TOBN(0xdfd6eb28, 0x2538fc0e), - TOBN(0x5c43b0cc, 0x3b39eec5), TOBN(0x6af12778, 0xcb36cc57), - TOBN(0x70b0852d, 0x06c425ae), TOBN(0x6df92f8c, 0x5c221b9b), - TOBN(0x6c8d4f9e, 0xce826d9c), TOBN(0xf59aba7b, 0xb49359c3), - TOBN(0x5c8ed8d5, 0xda64309d), TOBN(0x61a6de56, 0x91b30704), - TOBN(0xd6b52f6a, 0x2f9b5808), TOBN(0x0eee4194, 0x98c958a7), - TOBN(0xcddd9aab, 0x771e4caa), TOBN(0x83965dfd, 0x78bc21be), - TOBN(0x02affce3, 0xb3b504f5), TOBN(0x30847a21, 0x561c8291), - TOBN(0xd2eb2cf1, 0x52bfda05), TOBN(0xe0e4c4e9, 0x6197b98c), - TOBN(0x1d35076c, 0xf8a1726f), TOBN(0x6c06085b, 0x2db11e3d), - TOBN(0x15c0c4d7, 0x4463ba14), TOBN(0x9d292f83, 0x0030238c), - TOBN(0x1311ee8b, 0x3727536d), TOBN(0xfeea86ef, 0xbeaedc1e), - TOBN(0xb9d18cd3, 0x66131e2e), TOBN(0xf31d974f, 0x80fe2682), - TOBN(0xb6e49e0f, 0xe4160289), TOBN(0x7c48ec0b, 0x08e92799), - TOBN(0x818111d8, 0xd1989aa7), TOBN(0xb34fa0aa, 0xebf926f9), - TOBN(0xdb5fe2f5, 0xa245474a), TOBN(0xf80a6ebb, 0x3c7ca756), - TOBN(0xa7f96054, 0xafa05dd8), TOBN(0x26dfcf21, 0xfcaf119e), - TOBN(0xe20ef2e3, 0x0564bb59), TOBN(0xef4dca50, 0x61cb02b8), - TOBN(0xcda7838a, 0x65d30672), TOBN(0x8b08d534, 0xfd657e86), - TOBN(0x4c5b4395, 0x46d595c8), TOBN(0x39b58725, 0x425cb836), - TOBN(0x8ea61059, 0x3de9abe3), TOBN(0x40434881, 0x9cdc03be), - TOBN(0x9b261245, 0xcfedce8c), TOBN(0x78c318b4, 0xcf5234a1), - TOBN(0x510bcf16, 0xfde24c99), TOBN(0x2a77cb75, 0xa2c2ff5d), - TOBN(0x9c895c2b, 0x27960fb4), TOBN(0xd30ce975, 0xb0eda42b), - TOBN(0xfda85393, 0x1a62cc26), TOBN(0x23c69b96, 0x50c0e052), - TOBN(0xa227df15, 0xbfc633f3), TOBN(0x2ac78848, 0x1bae7d48), - TOBN(0x487878f9, 0x187d073d), TOBN(0x6c2be919, 0x967f807d), - TOBN(0x765861d8, 0x336e6d8f), TOBN(0x88b8974c, 0xce528a43), - TOBN(0x09521177, 0xff57d051), TOBN(0x2ff38037, 0xfb6a1961), - TOBN(0xfc0aba74, 0xa3d76ad4), TOBN(0x7c764803, 0x25a7ec17), - TOBN(0x7532d75f, 0x48879bc8), TOBN(0xea7eacc0, 0x58ce6bc1), - TOBN(0xc82176b4, 0x8e896c16), TOBN(0x9a30e0b2, 0x2c750fed), - TOBN(0xc37e2c2e, 0x421d3aa4), TOBN(0xf926407c, 0xe84fa840), - TOBN(0x18abc03d, 0x1454e41c), TOBN(0x26605ecd, 0x3f7af644), - TOBN(0x242341a6, 0xd6a5eabf), TOBN(0x1edb84f4, 0x216b668e), - TOBN(0xd836edb8, 0x04010102), TOBN(0x5b337ce7, 0x945e1d8c), - TOBN(0xd2075c77, 0xc055dc14), TOBN(0x2a0ffa25, 0x81d89cdf), - TOBN(0x8ce815ea, 0x6ffdcbaf), TOBN(0xa3428878, 0xfb648867), - TOBN(0x277699cf, 0x884655fb), TOBN(0xfa5b5bd6, 0x364d3e41), - TOBN(0x01f680c6, 0x441e1cb7), TOBN(0x3fd61e66, 0xb70a7d67), - TOBN(0x666ba2dc, 0xcc78cf66), TOBN(0xb3018174, 0x6fdbff77), - TOBN(0x8d4dd0db, 0x168d4668), TOBN(0x259455d0, 0x1dab3a2a), - TOBN(0xf58564c5, 0xcde3acec), TOBN(0x77141925, 0x13adb276), - TOBN(0x527d725d, 0x8a303f65), TOBN(0x55deb6c9, 0xe6f38f7b), - TOBN(0xfd5bb657, 0xb1fa70fb), TOBN(0xfa07f50f, 0xd8073a00), - TOBN(0xf72e3aa7, 0xbca02500), TOBN(0xf68f895d, 0x9975740d), - TOBN(0x30112060, 0x5cae2a6a), TOBN(0x01bd7218, 0x02874842), - TOBN(0x3d423891, 0x7ce47bd3), TOBN(0xa66663c1, 0x789544f6), - TOBN(0x864d05d7, 0x3272d838), TOBN(0xe22924f9, 0xfa6295c5), - TOBN(0x8189593f, 0x6c2fda32), TOBN(0x330d7189, 0xb184b544), - TOBN(0x79efa62c, 0xbde1f714), TOBN(0x35771c94, 0xe5cb1a63), - TOBN(0x2f4826b8, 0x641c8332), TOBN(0x00a894fb, 0xc8cee854), - TOBN(0xb4b9a39b, 0x36194d40), TOBN(0xe857a7c5, 0x77612601), - TOBN(0xf4209dd2, 0x4ecf2f58), TOBN(0x82b9e66d, 0x5a033487), - TOBN(0xc1e36934, 0xe4e8b9dd), TOBN(0xd2372c9d, 0xa42377d7), - TOBN(0x51dc94c7, 0x0e3ae43b), TOBN(0x4c57761e, 0x04474f6f), - TOBN(0xdcdacd0a, 0x1058a318), TOBN(0x369cf3f5, 0x78053a9a), - TOBN(0xc6c3de50, 0x31c68de2), TOBN(0x4653a576, 0x3c4b6d9f), - TOBN(0x1688dd5a, 0xaa4e5c97), TOBN(0x5be80aa1, 0xb7ab3c74), - TOBN(0x70cefe7c, 0xbc65c283), TOBN(0x57f95f13, 0x06867091), - TOBN(0xa39114e2, 0x4415503b), TOBN(0xc08ff7c6, 0x4cbb17e9), - TOBN(0x1eff674d, 0xd7dec966), TOBN(0x6d4690af, 0x53376f63), - TOBN(0xff6fe32e, 0xea74237b), TOBN(0xc436d17e, 0xcd57508e), - TOBN(0x15aa28e1, 0xedcc40fe), TOBN(0x0d769c04, 0x581bbb44), - TOBN(0xc240b6de, 0x34eaacda), TOBN(0xd9e116e8, 0x2ba0f1de), - TOBN(0xcbe45ec7, 0x79438e55), TOBN(0x91787c9d, 0x96f752d7), - TOBN(0x897f532b, 0xf129ac2f), TOBN(0xd307b7c8, 0x5a36e22c), - TOBN(0x91940675, 0x749fb8f3), TOBN(0xd14f95d0, 0x157fdb28), - TOBN(0xfe51d029, 0x6ae55043), TOBN(0x8931e98f, 0x44a87de1), - TOBN(0xe57f1cc6, 0x09e4fee2), TOBN(0x0d063b67, 0x4e072d92), - TOBN(0x70a998b9, 0xed0e4316), TOBN(0xe74a736b, 0x306aca46), - TOBN(0xecf0fbf2, 0x4fda97c7), TOBN(0xa40f65cb, 0x3e178d93), - TOBN(0x16253604, 0x16df4285), TOBN(0xb0c9babb, 0xd0c56ae2), - TOBN(0x73032b19, 0xcfc5cfc3), TOBN(0xe497e5c3, 0x09752056), - TOBN(0x12096bb4, 0x164bda96), TOBN(0x1ee42419, 0xa0b74da1), - TOBN(0x8fc36243, 0x403826ba), TOBN(0x0c8f0069, 0xdc09e660), - TOBN(0x8667e981, 0xc27253c9), TOBN(0x05a6aefb, 0x92b36a45), - TOBN(0xa62c4b36, 0x9cb7bb46), TOBN(0x8394f375, 0x11f7027b), - TOBN(0x747bc79c, 0x5f109d0f), TOBN(0xcad88a76, 0x5b8cc60a), - TOBN(0x80c5a66b, 0x58f09e68), TOBN(0xe753d451, 0xf6127eac), - TOBN(0xc44b74a1, 0x5b0ec6f5), TOBN(0x47989fe4, 0x5289b2b8), - TOBN(0x745f8484, 0x58d6fc73), TOBN(0xec362a6f, 0xf61c70ab), - TOBN(0x070c98a7, 0xb3a8ad41), TOBN(0x73a20fc0, 0x7b63db51), - TOBN(0xed2c2173, 0xf44c35f4), TOBN(0x8a56149d, 0x9acc9dca), - TOBN(0x98f17881, 0x9ac6e0f4), TOBN(0x360fdeaf, 0xa413b5ed), - TOBN(0x0625b8f4, 0xa300b0fd), TOBN(0xf1f4d76a, 0x5b3222d3), - TOBN(0x9d6f5109, 0x587f76b8), TOBN(0x8b4ee08d, 0x2317fdb5), - TOBN(0x88089bb7, 0x8c68b095), TOBN(0x95570e9a, 0x5808d9b9), - TOBN(0xa395c36f, 0x35d33ae7), TOBN(0x200ea123, 0x50bb5a94), - TOBN(0x20c789bd, 0x0bafe84b), TOBN(0x243ef52d, 0x0919276a), - TOBN(0x3934c577, 0xe23ae233), TOBN(0xb93807af, 0xa460d1ec), - TOBN(0xb72a53b1, 0xf8fa76a4), TOBN(0xd8914cb0, 0xc3ca4491), - TOBN(0x2e128494, 0x3fb42622), TOBN(0x3b2700ac, 0x500907d5), - TOBN(0xf370fb09, 0x1a95ec63), TOBN(0xf8f30be2, 0x31b6dfbd), - TOBN(0xf2b2f8d2, 0x69e55f15), TOBN(0x1fead851, 0xcc1323e9), - TOBN(0xfa366010, 0xd9e5eef6), TOBN(0x64d487b0, 0xe316107e), - TOBN(0x4c076b86, 0xd23ddc82), TOBN(0x03fd344c, 0x7e0143f0), - TOBN(0xa95362ff, 0x317af2c5), TOBN(0x0add3db7, 0xe18b7a4f), - TOBN(0x9c673e3f, 0x8260e01b), TOBN(0xfbeb49e5, 0x54a1cc91), - TOBN(0x91351bf2, 0x92f2e433), TOBN(0xc755e7ec, 0x851141eb), - TOBN(0xc9a95139, 0x29607745), TOBN(0x0ca07420, 0xa26f2b28), - TOBN(0xcb2790e7, 0x4bc6f9dd), TOBN(0x345bbb58, 0xadcaffc0), - TOBN(0xc65ea38c, 0xbe0f27a2), TOBN(0x67c24d7c, 0x641fcb56), - TOBN(0x2c25f0a7, 0xa9e2c757), TOBN(0x93f5cdb0, 0x16f16c49), - TOBN(0x2ca5a9d7, 0xc5ee30a1), TOBN(0xd1593635, 0xb909b729), - TOBN(0x804ce9f3, 0xdadeff48), TOBN(0xec464751, 0xb07c30c3), - TOBN(0x89d65ff3, 0x9e49af6a), TOBN(0xf2d6238a, 0x6f3d01bc), - TOBN(0x1095561e, 0x0bced843), TOBN(0x51789e12, 0xc8a13fd8), - TOBN(0xd633f929, 0x763231df), TOBN(0x46df9f7d, 0xe7cbddef), - TOBN(0x01c889c0, 0xcb265da8), TOBN(0xfce1ad10, 0xaf4336d2), - TOBN(0x8d110df6, 0xfc6a0a7e), TOBN(0xdd431b98, 0x6da425dc), - TOBN(0xcdc4aeab, 0x1834aabe), TOBN(0x84deb124, 0x8439b7fc), - TOBN(0x8796f169, 0x3c2a5998), TOBN(0x9b9247b4, 0x7947190d), - TOBN(0x55b9d9a5, 0x11597014), TOBN(0x7e9dd70d, 0x7b1566ee), - TOBN(0x94ad78f7, 0xcbcd5e64), TOBN(0x0359ac17, 0x9bd4c032), - TOBN(0x3b11baaf, 0x7cc222ae), TOBN(0xa6a6e284, 0xba78e812), - TOBN(0x8392053f, 0x24cea1a0), TOBN(0xc97bce4a, 0x33621491), - TOBN(0x7eb1db34, 0x35399ee9), TOBN(0x473f78ef, 0xece81ad1), - TOBN(0x41d72fe0, 0xf63d3d0d), TOBN(0xe620b880, 0xafab62fc), - TOBN(0x92096bc9, 0x93158383), TOBN(0x41a21357, 0x8f896f6c), - TOBN(0x1b5ee2fa, 0xc7dcfcab), TOBN(0x650acfde, 0x9546e007), - TOBN(0xc081b749, 0xb1b02e07), TOBN(0xda9e41a0, 0xf9eca03d), - TOBN(0x013ba727, 0x175a54ab), TOBN(0xca0cd190, 0xea5d8d10), - TOBN(0x85ea52c0, 0x95fd96a9), TOBN(0x2c591b9f, 0xbc5c3940), - TOBN(0x6fb4d4e4, 0x2bad4d5f), TOBN(0xfa4c3590, 0xfef0059b), - TOBN(0x6a10218a, 0xf5122294), TOBN(0x9a78a81a, 0xa85751d1), - TOBN(0x04f20579, 0xa98e84e7), TOBN(0xfe1242c0, 0x4997e5b5), - TOBN(0xe77a273b, 0xca21e1e4), TOBN(0xfcc8b1ef, 0x9411939d), - TOBN(0xe20ea302, 0x92d0487a), TOBN(0x1442dbec, 0x294b91fe), - TOBN(0x1f7a4afe, 0xbb6b0e8f), TOBN(0x1700ef74, 0x6889c318), - TOBN(0xf5bbffc3, 0x70f1fc62), TOBN(0x3b31d4b6, 0x69c79cca), - TOBN(0xe8bc2aab, 0xa7f6340d), TOBN(0xb0b08ab4, 0xa725e10a), - TOBN(0x44f05701, 0xae340050), TOBN(0xba4b3016, 0x1cf0c569), - TOBN(0x5aa29f83, 0xfbe19a51), TOBN(0x1b9ed428, 0xb71d752e), - TOBN(0x1666e54e, 0xeb4819f5), TOBN(0x616cdfed, 0x9e18b75b), - TOBN(0x112ed5be, 0x3ee27b0b), TOBN(0xfbf28319, 0x44c7de4d), - TOBN(0xd685ec85, 0xe0e60d84), TOBN(0x68037e30, 0x1db7ee78), - TOBN(0x5b65bdcd, 0x003c4d6e), TOBN(0x33e7363a, 0x93e29a6a), - TOBN(0x995b3a61, 0x08d0756c), TOBN(0xd727f85c, 0x2faf134b), - TOBN(0xfac6edf7, 0x1d337823), TOBN(0x99b9aa50, 0x0439b8b4), - TOBN(0x722eb104, 0xe2b4e075), TOBN(0x49987295, 0x437c4926), - TOBN(0xb1e4c0e4, 0x46a9b82d), TOBN(0xd0cb3197, 0x57a006f5), - TOBN(0xf3de0f7d, 0xd7808c56), TOBN(0xb5c54d8f, 0x51f89772), - TOBN(0x500a114a, 0xadbd31aa), TOBN(0x9afaaaa6, 0x295f6cab), - TOBN(0x94705e21, 0x04cf667a), TOBN(0xfc2a811b, 0x9d3935d7), - TOBN(0x560b0280, 0x6d09267c), TOBN(0xf19ed119, 0xf780e53b), - TOBN(0xf0227c09, 0x067b6269), TOBN(0x967b8533, 0x5caef599), - TOBN(0x155b9243, 0x68efeebc), TOBN(0xcd6d34f5, 0xc497bae6), - TOBN(0x1dd8d5d3, 0x6cceb370), TOBN(0x2aeac579, 0xa78d7bf9), - TOBN(0x5d65017d, 0x70b67a62), TOBN(0x70c8e44f, 0x17c53f67), - TOBN(0xd1fc0950, 0x86a34d09), TOBN(0xe0fca256, 0xe7134907), - TOBN(0xe24fa29c, 0x80fdd315), TOBN(0x2c4acd03, 0xd87499ad), - TOBN(0xbaaf7517, 0x3b5a9ba6), TOBN(0xb9cbe1f6, 0x12e51a51), - TOBN(0xd88edae3, 0x5e154897), TOBN(0xe4309c3c, 0x77b66ca0), - TOBN(0xf5555805, 0xf67f3746), TOBN(0x85fc37ba, 0xa36401ff), - TOBN(0xdf86e2ca, 0xd9499a53), TOBN(0x6270b2a3, 0xecbc955b), - TOBN(0xafae64f5, 0x974ad33b), TOBN(0x04d85977, 0xfe7b2df1), - TOBN(0x2a3db3ff, 0x4ab03f73), TOBN(0x0b87878a, 0x8702740a), - TOBN(0x6d263f01, 0x5a061732), TOBN(0xc25430ce, 0xa32a1901), - TOBN(0xf7ebab3d, 0xdb155018), TOBN(0x3a86f693, 0x63a9b78e), - TOBN(0x349ae368, 0xda9f3804), TOBN(0x470f07fe, 0xa164349c), - TOBN(0xd52f4cc9, 0x8562baa5), TOBN(0xc74a9e86, 0x2b290df3), - TOBN(0xd3a1aa35, 0x43471a24), TOBN(0x239446be, 0xb8194511), - TOBN(0xbec2dd00, 0x81dcd44d), TOBN(0xca3d7f0f, 0xc42ac82d), - TOBN(0x1f3db085, 0xfdaf4520), TOBN(0xbb6d3e80, 0x4549daf2), - TOBN(0xf5969d8a, 0x19ad5c42), TOBN(0x7052b13d, 0xdbfd1511), - TOBN(0x11890d1b, 0x682b9060), TOBN(0xa71d3883, 0xac34452c), - TOBN(0xa438055b, 0x783805b4), TOBN(0x43241277, 0x4725b23e), - TOBN(0xf20cf96e, 0x4901bbed), TOBN(0x6419c710, 0xf432a2bb), - TOBN(0x57a0fbb9, 0xdfa9cd7d), TOBN(0x589111e4, 0x00daa249), - TOBN(0x19809a33, 0x7b60554e), TOBN(0xea5f8887, 0xede283a4), - TOBN(0x2d713802, 0x503bfd35), TOBN(0x151bb0af, 0x585d2a53), - TOBN(0x40b08f74, 0x43b30ca8), TOBN(0xe10b5bba, 0xd9934583), - TOBN(0xe8a546d6, 0xb51110ad), TOBN(0x1dd50e66, 0x28e0b6c5), - TOBN(0x292e9d54, 0xcff2b821), TOBN(0x3882555d, 0x47281760), - TOBN(0x134838f8, 0x3724d6e3), TOBN(0xf2c679e0, 0x22ddcda1), - TOBN(0x40ee8815, 0x6d2a5768), TOBN(0x7f227bd2, 0x1c1e7e2d), - TOBN(0x487ba134, 0xd04ff443), TOBN(0x76e2ff3d, 0xc614e54b), - TOBN(0x36b88d6f, 0xa3177ec7), TOBN(0xbf731d51, 0x2328fff5), - TOBN(0x758caea2, 0x49ba158e), TOBN(0x5ab8ff4c, 0x02938188), - TOBN(0x33e16056, 0x35edc56d), TOBN(0x5a69d349, 0x7e940d79), - TOBN(0x6c4fd001, 0x03866dcb), TOBN(0x20a38f57, 0x4893cdef), - TOBN(0xfbf3e790, 0xfac3a15b), TOBN(0x6ed7ea2e, 0x7a4f8e6b), - TOBN(0xa663eb4f, 0xbc3aca86), TOBN(0x22061ea5, 0x080d53f7), - TOBN(0x2480dfe6, 0xf546783f), TOBN(0xd38bc6da, 0x5a0a641e), - TOBN(0xfb093cd1, 0x2ede8965), TOBN(0x89654db4, 0xacb455cf), - TOBN(0x413cbf9a, 0x26e1adee), TOBN(0x291f3764, 0x373294d4), - TOBN(0x00797257, 0x648083fe), TOBN(0x25f504d3, 0x208cc341), - TOBN(0x635a8e5e, 0xc3a0ee43), TOBN(0x70aaebca, 0x679898ff), - TOBN(0x9ee9f547, 0x5dc63d56), TOBN(0xce987966, 0xffb34d00), - TOBN(0xf9f86b19, 0x5e26310a), TOBN(0x9e435484, 0x382a8ca8), - TOBN(0x253bcb81, 0xc2352fe4), TOBN(0xa4eac8b0, 0x4474b571), - TOBN(0xc1b97512, 0xc1ad8cf8), TOBN(0x193b4e9e, 0x99e0b697), - TOBN(0x939d2716, 0x01e85df0), TOBN(0x4fb265b3, 0xcd44eafd), - TOBN(0x321e7dcd, 0xe51e1ae2), TOBN(0x8e3a8ca6, 0xe3d8b096), - TOBN(0x8de46cb0, 0x52604998), TOBN(0x91099ad8, 0x39072aa7), - TOBN(0x2617f91c, 0x93aa96b8), TOBN(0x0fc8716b, 0x7fca2e13), - TOBN(0xa7106f5e, 0x95328723), TOBN(0xd1c9c40b, 0x262e6522), - TOBN(0xb9bafe86, 0x42b7c094), TOBN(0x1873439d, 0x1543c021), - TOBN(0xe1baa5de, 0x5cbefd5d), TOBN(0xa363fc5e, 0x521e8aff), - TOBN(0xefe6320d, 0xf862eaac), TOBN(0x14419c63, 0x22c647dc), - TOBN(0x0e06707c, 0x4e46d428), TOBN(0xcb6c834f, 0x4a178f8f), - TOBN(0x0f993a45, 0xd30f917c), TOBN(0xd4c4b049, 0x9879afee), - TOBN(0xb6142a1e, 0x70500063), TOBN(0x7c9b41c3, 0xa5d9d605), - TOBN(0xbc00fc2f, 0x2f8ba2c7), TOBN(0x0966eb2f, 0x7c67aa28), - TOBN(0x13f7b516, 0x5a786972), TOBN(0x3bfb7557, 0x8a2fbba0), - TOBN(0x131c4f23, 0x5a2b9620), TOBN(0xbff3ed27, 0x6faf46be), - TOBN(0x9b4473d1, 0x7e172323), TOBN(0x421e8878, 0x339f6246), - TOBN(0x0fa8587a, 0x25a41632), TOBN(0xc0814124, 0xa35b6c93), - TOBN(0x2b18a9f5, 0x59ebb8db), TOBN(0x264e3357, 0x76edb29c), - TOBN(0xaf245ccd, 0xc87c51e2), TOBN(0x16b3015b, 0x501e6214), - TOBN(0xbb31c560, 0x0a3882ce), TOBN(0x6961bb94, 0xfec11e04), - TOBN(0x3b825b8d, 0xeff7a3a0), TOBN(0xbec33738, 0xb1df7326), - TOBN(0x68ad747c, 0x99604a1f), TOBN(0xd154c934, 0x9a3bd499), - TOBN(0xac33506f, 0x1cc7a906), TOBN(0x73bb5392, 0x6c560e8f), - TOBN(0x6428fcbe, 0x263e3944), TOBN(0xc11828d5, 0x1c387434), - TOBN(0x3cd04be1, 0x3e4b12ff), TOBN(0xc3aad9f9, 0x2d88667c), - TOBN(0xc52ddcf8, 0x248120cf), TOBN(0x985a892e, 0x2a389532), - TOBN(0xfbb4b21b, 0x3bb85fa0), TOBN(0xf95375e0, 0x8dfc6269), - TOBN(0xfb4fb06c, 0x7ee2acea), TOBN(0x6785426e, 0x309c4d1f), - TOBN(0x659b17c8, 0xd8ceb147), TOBN(0x9b649eee, 0xb70a5554), - TOBN(0x6b7fa0b5, 0xac6bc634), TOBN(0xd99fe2c7, 0x1d6e732f), - TOBN(0x30e6e762, 0x8d3abba2), TOBN(0x18fee6e7, 0xa797b799), - TOBN(0x5c9d360d, 0xc696464d), TOBN(0xe3baeb48, 0x27bfde12), - TOBN(0x2bf5db47, 0xf23206d5), TOBN(0x2f6d3420, 0x1d260152), - TOBN(0x17b87653, 0x3f8ff89a), TOBN(0x5157c30c, 0x378fa458), - TOBN(0x7517c5c5, 0x2d4fb936), TOBN(0xef22f7ac, 0xe6518cdc), - TOBN(0xdeb483e6, 0xbf847a64), TOBN(0xf5084558, 0x92e0fa89)}, - {TOBN(0xab9659d8, 0xdf7304d4), TOBN(0xb71bcf1b, 0xff210e8e), - TOBN(0xa9a2438b, 0xd73fbd60), TOBN(0x4595cd1f, 0x5d11b4de), - TOBN(0x9c0d329a, 0x4835859d), TOBN(0x4a0f0d2d, 0x7dbb6e56), - TOBN(0xc6038e5e, 0xdf928a4e), TOBN(0xc9429621, 0x8f5ad154), - TOBN(0x91213462, 0xf23f2d92), TOBN(0x6cab71bd, 0x60b94078), - TOBN(0x6bdd0a63, 0x176cde20), TOBN(0x54c9b20c, 0xee4d54bc), - TOBN(0x3cd2d8aa, 0x9f2ac02f), TOBN(0x03f8e617, 0x206eedb0), - TOBN(0xc7f68e16, 0x93086434), TOBN(0x831469c5, 0x92dd3db9), - TOBN(0x8521df24, 0x8f981354), TOBN(0x587e23ec, 0x3588a259), - TOBN(0xcbedf281, 0xd7a0992c), TOBN(0x06930a55, 0x38961407), - TOBN(0x09320deb, 0xbe5bbe21), TOBN(0xa7ffa5b5, 0x2491817f), - TOBN(0xe6c8b4d9, 0x09065160), TOBN(0xac4f3992, 0xfff6d2a9), - TOBN(0x7aa7a158, 0x3ae9c1bd), TOBN(0xe0af6d98, 0xe37ce240), - TOBN(0xe54342d9, 0x28ab38b4), TOBN(0xe8b75007, 0x0a1c98ca), - TOBN(0xefce86af, 0xe02358f2), TOBN(0x31b8b856, 0xea921228), - TOBN(0x052a1912, 0x0a1c67fc), TOBN(0xb4069ea4, 0xe3aead59), - TOBN(0x3232d6e2, 0x7fa03cb3), TOBN(0xdb938e5b, 0x0fdd7d88), - TOBN(0x04c1d2cd, 0x2ccbfc5d), TOBN(0xd2f45c12, 0xaf3a580f), - TOBN(0x592620b5, 0x7883e614), TOBN(0x5fd27e68, 0xbe7c5f26), - TOBN(0x139e45a9, 0x1567e1e3), TOBN(0x2cc71d2d, 0x44d8aaaf), - TOBN(0x4a9090cd, 0xe36d0757), TOBN(0xf722d7b1, 0xd9a29382), - TOBN(0xfb7fb04c, 0x04b48ddf), TOBN(0x628ad2a7, 0xebe16f43), - TOBN(0xcd3fbfb5, 0x20226040), TOBN(0x6c34ecb1, 0x5104b6c4), - TOBN(0x30c0754e, 0xc903c188), TOBN(0xec336b08, 0x2d23cab0), - TOBN(0x473d62a2, 0x1e206ee5), TOBN(0xf1e27480, 0x8c49a633), - TOBN(0x87ab956c, 0xe9f6b2c3), TOBN(0x61830b48, 0x62b606ea), - TOBN(0x67cd6846, 0xe78e815f), TOBN(0xfe40139f, 0x4c02082a), - TOBN(0x52bbbfcb, 0x952ec365), TOBN(0x74c11642, 0x6b9836ab), - TOBN(0x9f51439e, 0x558df019), TOBN(0x230da4ba, 0xac712b27), - TOBN(0x518919e3, 0x55185a24), TOBN(0x4dcefcdd, 0x84b78f50), - TOBN(0xa7d90fb2, 0xa47d4c5a), TOBN(0x55ac9abf, 0xb30e009e), - TOBN(0xfd2fc359, 0x74eed273), TOBN(0xb72d824c, 0xdbea8faf), - TOBN(0xce721a74, 0x4513e2ca), TOBN(0x0b418612, 0x38240b2c), - TOBN(0x05199968, 0xd5baa450), TOBN(0xeb1757ed, 0x2b0e8c25), - TOBN(0x6ebc3e28, 0x3dfac6d5), TOBN(0xb2431e2e, 0x48a237f5), - TOBN(0x2acb5e23, 0x52f61499), TOBN(0x5558a2a7, 0xe06c936b), - TOBN(0xd213f923, 0xcbb13d1b), TOBN(0x98799f42, 0x5bfb9bfe), - TOBN(0x1ae8ddc9, 0x701144a9), TOBN(0x0b8b3bb6, 0x4c5595ee), - TOBN(0x0ea9ef2e, 0x3ecebb21), TOBN(0x17cb6c4b, 0x3671f9a7), - TOBN(0x47ef464f, 0x726f1d1f), TOBN(0x171b9484, 0x6943a276), - TOBN(0x51a4ae2d, 0x7ef0329c), TOBN(0x08509222, 0x91c4402a), - TOBN(0x64a61d35, 0xafd45bbc), TOBN(0x38f096fe, 0x3035a851), - TOBN(0xc7468b74, 0xa1dec027), TOBN(0xe8cf10e7, 0x4fc7dcba), - TOBN(0xea35ff40, 0xf4a06353), TOBN(0x0b4c0dfa, 0x8b77dd66), - TOBN(0x779b8552, 0xde7e5c19), TOBN(0xfab28609, 0xc1c0256c), - TOBN(0x64f58eee, 0xabd4743d), TOBN(0x4e8ef838, 0x7b6cc93b), - TOBN(0xee650d26, 0x4cb1bf3d), TOBN(0x4c1f9d09, 0x73dedf61), - TOBN(0xaef7c9d7, 0xbfb70ced), TOBN(0x1ec0507e, 0x1641de1e), - TOBN(0xcd7e5cc7, 0xcde45079), TOBN(0xde173c9a, 0x516ac9e4), - TOBN(0x517a8494, 0xc170315c), TOBN(0x438fd905, 0x91d8e8fb), - TOBN(0x5145c506, 0xc7d9630b), TOBN(0x6457a87b, 0xf47d4d75), - TOBN(0xd31646bf, 0x0d9a80e8), TOBN(0x453add2b, 0xcef3aabe), - TOBN(0xc9941109, 0xa607419d), TOBN(0xfaa71e62, 0xbb6bca80), - TOBN(0x34158c13, 0x07c431f3), TOBN(0x594abebc, 0x992bc47a), - TOBN(0x6dfea691, 0xeb78399f), TOBN(0x48aafb35, 0x3f42cba4), - TOBN(0xedcd65af, 0x077c04f0), TOBN(0x1a29a366, 0xe884491a), - TOBN(0x023a40e5, 0x1c21f2bf), TOBN(0xf99a513c, 0xa5057aee), - TOBN(0xa3fe7e25, 0xbcab072e), TOBN(0x8568d2e1, 0x40e32bcf), - TOBN(0x904594eb, 0xd3f69d9f), TOBN(0x181a9733, 0x07affab1), - TOBN(0xe4d68d76, 0xb6e330f4), TOBN(0x87a6dafb, 0xc75a7fc1), - TOBN(0x549db2b5, 0xef7d9289), TOBN(0x2480d4a8, 0x197f015a), - TOBN(0x61d5590b, 0xc40493b6), TOBN(0x3a55b52e, 0x6f780331), - TOBN(0x40eb8115, 0x309eadb0), TOBN(0xdea7de5a, 0x92e5c625), - TOBN(0x64d631f0, 0xcc6a3d5a), TOBN(0x9d5e9d7c, 0x93e8dd61), - TOBN(0xf297bef5, 0x206d3ffc), TOBN(0x23d5e033, 0x7d808bd4), - TOBN(0x4a4f6912, 0xd24cf5ba), TOBN(0xe4d8163b, 0x09cdaa8a), - TOBN(0x0e0de9ef, 0xd3082e8e), TOBN(0x4fe1246c, 0x0192f360), - TOBN(0x1f900150, 0x4b8eee0a), TOBN(0x5219da81, 0xf1da391b), - TOBN(0x7bf6a5c1, 0xf7ea25aa), TOBN(0xd165e6bf, 0xfbb07d5f), - TOBN(0xe3539361, 0x89e78671), TOBN(0xa3fcac89, 0x2bac4219), - TOBN(0xdfab6fd4, 0xf0baa8ab), TOBN(0x5a4adac1, 0xe2c1c2e5), - TOBN(0x6cd75e31, 0x40d85849), TOBN(0xce263fea, 0x19b39181), - TOBN(0xcb6803d3, 0x07032c72), TOBN(0x7f40d5ce, 0x790968c8), - TOBN(0xa6de86bd, 0xdce978f0), TOBN(0x25547c4f, 0x368f751c), - TOBN(0xb1e685fd, 0x65fb2a9e), TOBN(0xce69336f, 0x1eb9179c), - TOBN(0xb15d1c27, 0x12504442), TOBN(0xb7df465c, 0xb911a06b), - TOBN(0xb8d804a3, 0x315980cd), TOBN(0x693bc492, 0xfa3bebf7), - TOBN(0x3578aeee, 0x2253c504), TOBN(0x158de498, 0xcd2474a2), - TOBN(0x1331f5c7, 0xcfda8368), TOBN(0xd2d7bbb3, 0x78d7177e), - TOBN(0xdf61133a, 0xf3c1e46e), TOBN(0x5836ce7d, 0xd30e7be8), - TOBN(0x83084f19, 0x94f834cb), TOBN(0xd35653d4, 0x429ed782), - TOBN(0xa542f16f, 0x59e58243), TOBN(0xc2b52f65, 0x0470a22d), - TOBN(0xe3b6221b, 0x18f23d96), TOBN(0xcb05abac, 0x3f5252b4), - TOBN(0xca00938b, 0x87d61402), TOBN(0x2f186cdd, 0x411933e4), - TOBN(0xe042ece5, 0x9a29a5c5), TOBN(0xb19b3c07, 0x3b6c8402), - TOBN(0xc97667c7, 0x19d92684), TOBN(0xb5624622, 0xebc66372), - TOBN(0x0cb96e65, 0x3c04fa02), TOBN(0x83a7176c, 0x8eaa39aa), - TOBN(0x2033561d, 0xeaa1633f), TOBN(0x45a9d086, 0x4533df73), - TOBN(0xe0542c1d, 0x3dc090bc), TOBN(0x82c996ef, 0xaa59c167), - TOBN(0xe3f735e8, 0x0ee7fc4d), TOBN(0x7b179393, 0x7c35db79), - TOBN(0xb6419e25, 0xf8c5dbfd), TOBN(0x4d9d7a1e, 0x1f327b04), - TOBN(0x979f6f9b, 0x298dfca8), TOBN(0xc7c5dff1, 0x8de9366a), - TOBN(0x1b7a588d, 0x04c82bdd), TOBN(0x68005534, 0xf8319dfd), - TOBN(0xde8a55b5, 0xd8eb9580), TOBN(0x5ea886da, 0x8d5bca81), - TOBN(0xe8530a01, 0x252a0b4d), TOBN(0x1bffb4fe, 0x35eaa0a1), - TOBN(0x2ad828b1, 0xd8e99563), TOBN(0x7de96ef5, 0x95f9cd87), - TOBN(0x4abb2d0c, 0xd77d970c), TOBN(0x03cfb933, 0xd33ef9cb), - TOBN(0xb0547c01, 0x8b211fe9), TOBN(0x2fe64809, 0xa56ed1c6), - TOBN(0xcb7d5624, 0xc2ac98cc), TOBN(0x2a1372c0, 0x1a393e33), - TOBN(0xc8d1ec1c, 0x29660521), TOBN(0xf3d31b04, 0xb37ac3e9), - TOBN(0xa29ae9df, 0x5ece6e7c), TOBN(0x0603ac8f, 0x0facfb55), - TOBN(0xcfe85b7a, 0xdda233a5), TOBN(0xe618919f, 0xbd75f0b8), - TOBN(0xf555a3d2, 0x99bf1603), TOBN(0x1f43afc9, 0xf184255a), - TOBN(0xdcdaf341, 0x319a3e02), TOBN(0xd3b117ef, 0x03903a39), - TOBN(0xe095da13, 0x65d1d131), TOBN(0x86f16367, 0xc37ad03e), - TOBN(0x5f37389e, 0x462cd8dd), TOBN(0xc103fa04, 0xd67a60e6), - TOBN(0x57c34344, 0xf4b478f0), TOBN(0xce91edd8, 0xe117c98d), - TOBN(0x001777b0, 0x231fc12e), TOBN(0x11ae47f2, 0xb207bccb), - TOBN(0xd983cf8d, 0x20f8a242), TOBN(0x7aff5b1d, 0xf22e1ad8), - TOBN(0x68fd11d0, 0x7fc4feb3), TOBN(0x5d53ae90, 0xb0f1c3e1), - TOBN(0x50fb7905, 0xec041803), TOBN(0x85e3c977, 0x14404888), - TOBN(0x0e67faed, 0xac628d8f), TOBN(0x2e865150, 0x6668532c), - TOBN(0x15acaaa4, 0x6a67a6b0), TOBN(0xf4cdee25, 0xb25cec41), - TOBN(0x49ee565a, 0xe4c6701e), TOBN(0x2a04ca66, 0xfc7d63d8), - TOBN(0xeb105018, 0xef0543fb), TOBN(0xf709a4f5, 0xd1b0d81d), - TOBN(0x5b906ee6, 0x2915d333), TOBN(0xf4a87412, 0x96f1f0ab), - TOBN(0xb6b82fa7, 0x4d82f4c2), TOBN(0x90725a60, 0x6804efb3), - TOBN(0xbc82ec46, 0xadc3425e), TOBN(0xb7b80581, 0x2787843e), - TOBN(0xdf46d91c, 0xdd1fc74c), TOBN(0xdc1c62cb, 0xe783a6c4), - TOBN(0x59d1b9f3, 0x1a04cbba), TOBN(0xd87f6f72, 0x95e40764), - TOBN(0x02b4cfc1, 0x317f4a76), TOBN(0x8d2703eb, 0x91036bce), - TOBN(0x98206cc6, 0xa5e72a56), TOBN(0x57be9ed1, 0xcf53fb0f), - TOBN(0x09374571, 0xef0b17ac), TOBN(0x74b2655e, 0xd9181b38), - TOBN(0xc8f80ea8, 0x89935d0e), TOBN(0xc0d9e942, 0x91529936), - TOBN(0x19686041, 0x1e84e0e5), TOBN(0xa5db84d3, 0xaea34c93), - TOBN(0xf9d5bb19, 0x7073a732), TOBN(0xb8d2fe56, 0x6bcfd7c0), - TOBN(0x45775f36, 0xf3eb82fa), TOBN(0x8cb20ccc, 0xfdff8b58), - TOBN(0x1659b65f, 0x8374c110), TOBN(0xb8b4a422, 0x330c789a), - TOBN(0x75e3c3ea, 0x6fe8208b), TOBN(0xbd74b9e4, 0x286e78fe), - TOBN(0x0be2e81b, 0xd7d93a1a), TOBN(0x7ed06e27, 0xdd0a5aae), - TOBN(0x721f5a58, 0x6be8b800), TOBN(0x428299d1, 0xd846db28), - TOBN(0x95cb8e6b, 0x5be88ed3), TOBN(0xc3186b23, 0x1c034e11), - TOBN(0xa6312c9e, 0x8977d99b), TOBN(0xbe944331, 0x83f531e7), - TOBN(0x8232c0c2, 0x18d3b1d4), TOBN(0x617aae8b, 0xe1247b73), - TOBN(0x40153fc4, 0x282aec3b), TOBN(0xc6063d2f, 0xf7b8f823), - TOBN(0x68f10e58, 0x3304f94c), TOBN(0x31efae74, 0xee676346), - TOBN(0xbadb6c6d, 0x40a9b97c), TOBN(0x14702c63, 0x4f666256), - TOBN(0xdeb954f1, 0x5184b2e3), TOBN(0x5184a526, 0x94b6ca40), - TOBN(0xfff05337, 0x003c32ea), TOBN(0x5aa374dd, 0x205974c7), - TOBN(0x9a763854, 0x4b0dd71a), TOBN(0x459cd27f, 0xdeb947ec), - TOBN(0xa6e28161, 0x459c2b92), TOBN(0x2f020fa8, 0x75ee8ef5), - TOBN(0xb132ec2d, 0x30b06310), TOBN(0xc3e15899, 0xbc6a4530), - TOBN(0xdc5f53fe, 0xaa3f451a), TOBN(0x3a3c7f23, 0xc2d9acac), - TOBN(0x2ec2f892, 0x6b27e58b), TOBN(0x68466ee7, 0xd742799f), - TOBN(0x98324dd4, 0x1fa26613), TOBN(0xa2dc6dab, 0xbdc29d63), - TOBN(0xf9675faa, 0xd712d657), TOBN(0x813994be, 0x21fd8d15), - TOBN(0x5ccbb722, 0xfd4f7553), TOBN(0x5135ff8b, 0xf3a36b20), - TOBN(0x44be28af, 0x69559df5), TOBN(0x40b65bed, 0x9d41bf30), - TOBN(0xd98bf2a4, 0x3734e520), TOBN(0x5e3abbe3, 0x209bdcba), - TOBN(0x77c76553, 0xbc945b35), TOBN(0x5331c093, 0xc6ef14aa), - TOBN(0x518ffe29, 0x76b60c80), TOBN(0x2285593b, 0x7ace16f8), - TOBN(0xab1f64cc, 0xbe2b9784), TOBN(0xe8f2c0d9, 0xab2421b6), - TOBN(0x617d7174, 0xc1df065c), TOBN(0xafeeb5ab, 0x5f6578fa), - TOBN(0x16ff1329, 0x263b54a8), TOBN(0x45c55808, 0xc990dce3), - TOBN(0x42eab6c0, 0xecc8c177), TOBN(0x799ea9b5, 0x5982ecaa), - TOBN(0xf65da244, 0xb607ef8e), TOBN(0x8ab226ce, 0x32a3fc2c), - TOBN(0x745741e5, 0x7ea973dc), TOBN(0x5c00ca70, 0x20888f2e), - TOBN(0x7cdce3cf, 0x45fd9cf1), TOBN(0x8a741ef1, 0x5507f872), - TOBN(0x47c51c2f, 0x196b4cec), TOBN(0x70d08e43, 0xc97ea618), - TOBN(0x930da15c, 0x15b18a2b), TOBN(0x33b6c678, 0x2f610514), - TOBN(0xc662e4f8, 0x07ac9794), TOBN(0x1eccf050, 0xba06cb79), - TOBN(0x1ff08623, 0xe7d954e5), TOBN(0x6ef2c5fb, 0x24cf71c3), - TOBN(0xb2c063d2, 0x67978453), TOBN(0xa0cf3796, 0x1d654af8), - TOBN(0x7cb242ea, 0x7ebdaa37), TOBN(0x206e0b10, 0xb86747e0), - TOBN(0x481dae5f, 0xd5ecfefc), TOBN(0x07084fd8, 0xc2bff8fc), - TOBN(0x8040a01a, 0xea324596), TOBN(0x4c646980, 0xd4de4036), - TOBN(0x9eb8ab4e, 0xd65abfc3), TOBN(0xe01cb91f, 0x13541ec7), - TOBN(0x8f029adb, 0xfd695012), TOBN(0x9ae28483, 0x3c7569ec), - TOBN(0xa5614c9e, 0xa66d80a1), TOBN(0x680a3e44, 0x75f5f911), - TOBN(0x0c07b14d, 0xceba4fc1), TOBN(0x891c285b, 0xa13071c1), - TOBN(0xcac67ceb, 0x799ece3c), TOBN(0x29b910a9, 0x41e07e27), - TOBN(0x66bdb409, 0xf2e43123), TOBN(0x06f8b137, 0x7ac9ecbe), - TOBN(0x5981fafd, 0x38547090), TOBN(0x19ab8b9f, 0x85e3415d), - TOBN(0xfc28c194, 0xc7e31b27), TOBN(0x843be0aa, 0x6fbcbb42), - TOBN(0xf3b1ed43, 0xa6db836c), TOBN(0x2a1330e4, 0x01a45c05), - TOBN(0x4f19f3c5, 0x95c1a377), TOBN(0xa85f39d0, 0x44b5ee33), - TOBN(0x3da18e6d, 0x4ae52834), TOBN(0x5a403b39, 0x7423dcb0), - TOBN(0xbb555e0a, 0xf2374aef), TOBN(0x2ad599c4, 0x1e8ca111), - TOBN(0x1b3a2fb9, 0x014b3bf8), TOBN(0x73092684, 0xf66d5007), - TOBN(0x079f1426, 0xc4340102), TOBN(0x1827cf81, 0x8fddf4de), - TOBN(0xc83605f6, 0xf10ff927), TOBN(0xd3871451, 0x23739fc6), - TOBN(0x6d163450, 0xcac1c2cc), TOBN(0x6b521296, 0xa2ec1ac5), - TOBN(0x0606c4f9, 0x6e3cb4a5), TOBN(0xe47d3f41, 0x778abff7), - TOBN(0x425a8d5e, 0xbe8e3a45), TOBN(0x53ea9e97, 0xa6102160), - TOBN(0x477a106e, 0x39cbb688), TOBN(0x532401d2, 0xf3386d32), - TOBN(0x8e564f64, 0xb1b9b421), TOBN(0xca9b8388, 0x81dad33f), - TOBN(0xb1422b4e, 0x2093913e), TOBN(0x533d2f92, 0x69bc8112), - TOBN(0x3fa017be, 0xebe7b2c7), TOBN(0xb2767c4a, 0xcaf197c6), - TOBN(0xc925ff87, 0xaedbae9f), TOBN(0x7daf0eb9, 0x36880a54), - TOBN(0x9284ddf5, 0x9c4d0e71), TOBN(0x1581cf93, 0x316f8cf5), - TOBN(0x3eeca887, 0x3ac1f452), TOBN(0xb417fce9, 0xfb6aeffe), - TOBN(0xa5918046, 0xeefb8dc3), TOBN(0x73d318ac, 0x02209400), - TOBN(0xe800400f, 0x728693e5), TOBN(0xe87d814b, 0x339927ed), - TOBN(0x93e94d3b, 0x57ea9910), TOBN(0xff8a35b6, 0x2245fb69), - TOBN(0x043853d7, 0x7f200d34), TOBN(0x470f1e68, 0x0f653ce1), - TOBN(0x81ac05bd, 0x59a06379), TOBN(0xa14052c2, 0x03930c29), - TOBN(0x6b72fab5, 0x26bc2797), TOBN(0x13670d16, 0x99f16771), - TOBN(0x00170052, 0x1e3e48d1), TOBN(0x978fe401, 0xb7adf678), - TOBN(0x55ecfb92, 0xd41c5dd4), TOBN(0x5ff8e247, 0xc7b27da5), - TOBN(0xe7518272, 0x013fb606), TOBN(0x5768d7e5, 0x2f547a3c), - TOBN(0xbb24eaa3, 0x60017a5f), TOBN(0x6b18e6e4, 0x9c64ce9b), - TOBN(0xc225c655, 0x103dde07), TOBN(0xfc3672ae, 0x7592f7ea), - TOBN(0x9606ad77, 0xd06283a1), TOBN(0x542fc650, 0xe4d59d99), - TOBN(0xabb57c49, 0x2a40e7c2), TOBN(0xac948f13, 0xa8db9f55), - TOBN(0x6d4c9682, 0xb04465c3), TOBN(0xe3d062fa, 0x6468bd15), - TOBN(0xa51729ac, 0x5f318d7e), TOBN(0x1fc87df6, 0x9eb6fc95), - TOBN(0x63d146a8, 0x0591f652), TOBN(0xa861b8f7, 0x589621aa), - TOBN(0x59f5f15a, 0xce31348c), TOBN(0x8f663391, 0x440da6da), - TOBN(0xcfa778ac, 0xb591ffa3), TOBN(0x027ca9c5, 0x4cdfebce), - TOBN(0xbe8e05a5, 0x444ea6b3), TOBN(0x8aab4e69, 0xa78d8254), - TOBN(0x2437f04f, 0xb474d6b8), TOBN(0x6597ffd4, 0x045b3855), - TOBN(0xbb0aea4e, 0xca47ecaa), TOBN(0x568aae83, 0x85c7ebfc), - TOBN(0x0e966e64, 0xc73b2383), TOBN(0x49eb3447, 0xd17d8762), - TOBN(0xde107821, 0x8da05dab), TOBN(0x443d8baa, 0x016b7236), - TOBN(0x163b63a5, 0xea7610d6), TOBN(0xe47e4185, 0xce1ca979), - TOBN(0xae648b65, 0x80baa132), TOBN(0xebf53de2, 0x0e0d5b64), - TOBN(0x8d3bfcb4, 0xd3c8c1ca), TOBN(0x0d914ef3, 0x5d04b309), - TOBN(0x55ef6415, 0x3de7d395), TOBN(0xbde1666f, 0x26b850e8), - TOBN(0xdbe1ca6e, 0xd449ab19), TOBN(0x8902b322, 0xe89a2672), - TOBN(0xb1674b7e, 0xdacb7a53), TOBN(0x8e9faf6e, 0xf52523ff), - TOBN(0x6ba535da, 0x9a85788b), TOBN(0xd21f03ae, 0xbd0626d4), - TOBN(0x099f8c47, 0xe873dc64), TOBN(0xcda8564d, 0x018ec97e), - TOBN(0x3e8d7a5c, 0xde92c68c), TOBN(0x78e035a1, 0x73323cc4), - TOBN(0x3ef26275, 0xf880ff7c), TOBN(0xa4ee3dff, 0x273eedaa), - TOBN(0x58823507, 0xaf4e18f8), TOBN(0x967ec9b5, 0x0672f328), - TOBN(0x9ded19d9, 0x559d3186), TOBN(0x5e2ab3de, 0x6cdce39c), - TOBN(0xabad6e4d, 0x11c226df), TOBN(0xf9783f43, 0x87723014), - TOBN(0x9a49a0cf, 0x1a885719), TOBN(0xfc0c1a5a, 0x90da9dbf), - TOBN(0x8bbaec49, 0x571d92ac), TOBN(0x569e85fe, 0x4692517f), - TOBN(0x8333b014, 0xa14ea4af), TOBN(0x32f2a62f, 0x12e5c5ad), - TOBN(0x98c2ce3a, 0x06d89b85), TOBN(0xb90741aa, 0x2ff77a08), - TOBN(0x2530defc, 0x01f795a2), TOBN(0xd6e5ba0b, 0x84b3c199), - TOBN(0x7d8e8451, 0x12e4c936), TOBN(0xae419f7d, 0xbd0be17b), - TOBN(0xa583fc8c, 0x22262bc9), TOBN(0x6b842ac7, 0x91bfe2bd), - TOBN(0x33cef4e9, 0x440d6827), TOBN(0x5f69f4de, 0xef81fb14), - TOBN(0xf16cf6f6, 0x234fbb92), TOBN(0x76ae3fc3, 0xd9e7e158), - TOBN(0x4e89f6c2, 0xe9740b33), TOBN(0x677bc85d, 0x4962d6a1), - TOBN(0x6c6d8a7f, 0x68d10d15), TOBN(0x5f9a7224, 0x0257b1cd), - TOBN(0x7096b916, 0x4ad85961), TOBN(0x5f8c47f7, 0xe657ab4a), - TOBN(0xde57d7d0, 0xf7461d7e), TOBN(0x7eb6094d, 0x80ce5ee2), - TOBN(0x0b1e1dfd, 0x34190547), TOBN(0x8a394f43, 0xf05dd150), - TOBN(0x0a9eb24d, 0x97df44e6), TOBN(0x78ca06bf, 0x87675719), - TOBN(0x6f0b3462, 0x6ffeec22), TOBN(0x9d91bcea, 0x36cdd8fb), - TOBN(0xac83363c, 0xa105be47), TOBN(0x81ba76c1, 0x069710e3), - TOBN(0x3d1b24cb, 0x28c682c6), TOBN(0x27f25228, 0x8612575b), - TOBN(0xb587c779, 0xe8e66e98), TOBN(0x7b0c03e9, 0x405eb1fe), - TOBN(0xfdf0d030, 0x15b548e7), TOBN(0xa8be76e0, 0x38b36af7), - TOBN(0x4cdab04a, 0x4f310c40), TOBN(0x6287223e, 0xf47ecaec), - TOBN(0x678e6055, 0x8b399320), TOBN(0x61fe3fa6, 0xc01e4646), - TOBN(0xc482866b, 0x03261a5e), TOBN(0xdfcf45b8, 0x5c2f244a), - TOBN(0x8fab9a51, 0x2f684b43), TOBN(0xf796c654, 0xc7220a66), - TOBN(0x1d90707e, 0xf5afa58f), TOBN(0x2c421d97, 0x4fdbe0de), - TOBN(0xc4f4cda3, 0xaf2ebc2f), TOBN(0xa0af843d, 0xcb4efe24), - TOBN(0x53b857c1, 0x9ccd10b1), TOBN(0xddc9d1eb, 0x914d3e04), - TOBN(0x7bdec8bb, 0x62771deb), TOBN(0x829277aa, 0x91c5aa81), - TOBN(0x7af18dd6, 0x832391ae), TOBN(0x1740f316, 0xc71a84ca)}, - {TOBN(0x8928e99a, 0xeeaf8c49), TOBN(0xee7aa73d, 0x6e24d728), - TOBN(0x4c5007c2, 0xe72b156c), TOBN(0x5fcf57c5, 0xed408a1d), - TOBN(0x9f719e39, 0xb6057604), TOBN(0x7d343c01, 0xc2868bbf), - TOBN(0x2cca254b, 0x7e103e2d), TOBN(0xe6eb38a9, 0xf131bea2), - TOBN(0xb33e624f, 0x8be762b4), TOBN(0x2a9ee4d1, 0x058e3413), - TOBN(0x968e6369, 0x67d805fa), TOBN(0x9848949b, 0x7db8bfd7), - TOBN(0x5308d7e5, 0xd23a8417), TOBN(0x892f3b1d, 0xf3e29da5), - TOBN(0xc95c139e, 0x3dee471f), TOBN(0x8631594d, 0xd757e089), - TOBN(0xe0c82a3c, 0xde918dcc), TOBN(0x2e7b5994, 0x26fdcf4b), - TOBN(0x82c50249, 0x32cb1b2d), TOBN(0xea613a9d, 0x7657ae07), - TOBN(0xc2eb5f6c, 0xf1fdc9f7), TOBN(0xb6eae8b8, 0x879fe682), - TOBN(0x253dfee0, 0x591cbc7f), TOBN(0x000da713, 0x3e1290e6), - TOBN(0x1083e2ea, 0x1f095615), TOBN(0x0a28ad77, 0x14e68c33), - TOBN(0x6bfc0252, 0x3d8818be), TOBN(0xb585113a, 0xf35850cd), - TOBN(0x7d935f0b, 0x30df8aa1), TOBN(0xaddda07c, 0x4ab7e3ac), - TOBN(0x92c34299, 0x552f00cb), TOBN(0xc33ed1de, 0x2909df6c), - TOBN(0x22c2195d, 0x80e87766), TOBN(0x9e99e6d8, 0x9ddf4ac0), - TOBN(0x09642e4e, 0x65e74934), TOBN(0x2610ffa2, 0xff1ff241), - TOBN(0x4d1d47d4, 0x751c8159), TOBN(0x697b4985, 0xaf3a9363), - TOBN(0x0318ca46, 0x87477c33), TOBN(0xa90cb565, 0x9441eff3), - TOBN(0x58bb3848, 0x36f024cb), TOBN(0x85be1f77, 0x36016168), - TOBN(0x6c59587c, 0xdc7e07f1), TOBN(0x191be071, 0xaf1d8f02), - TOBN(0xbf169fa5, 0xcca5e55c), TOBN(0x3864ba3c, 0xf7d04eac), - TOBN(0x915e367f, 0x8d7d05db), TOBN(0xb48a876d, 0xa6549e5d), - TOBN(0xef89c656, 0x580e40a2), TOBN(0xf194ed8c, 0x728068bc), - TOBN(0x74528045, 0xa47990c9), TOBN(0xf53fc7d7, 0x5e1a4649), - TOBN(0xbec5ae9b, 0x78593e7d), TOBN(0x2cac4ee3, 0x41db65d7), - TOBN(0xa8c1eb24, 0x04a3d39b), TOBN(0x53b7d634, 0x03f8f3ef), - TOBN(0x2dc40d48, 0x3e07113c), TOBN(0x6e4a5d39, 0x7d8b63ae), - TOBN(0x5582a94b, 0x79684c2b), TOBN(0x932b33d4, 0x622da26c), - TOBN(0xf534f651, 0x0dbbf08d), TOBN(0x211d07c9, 0x64c23a52), - TOBN(0x0eeece0f, 0xee5bdc9b), TOBN(0xdf178168, 0xf7015558), - TOBN(0xd4294635, 0x0a712229), TOBN(0x93cbe448, 0x09273f8c), - TOBN(0x00b095ef, 0x8f13bc83), TOBN(0xbb741972, 0x8798978c), - TOBN(0x9d7309a2, 0x56dbe6e7), TOBN(0xe578ec56, 0x5a5d39ec), - TOBN(0x3961151b, 0x851f9a31), TOBN(0x2da7715d, 0xe5709eb4), - TOBN(0x867f3017, 0x53dfabf0), TOBN(0x728d2078, 0xb8e39259), - TOBN(0x5c75a0cd, 0x815d9958), TOBN(0xf84867a6, 0x16603be1), - TOBN(0xc865b13d, 0x70e35b1c), TOBN(0x02414468, 0x19b03e2c), - TOBN(0xe46041da, 0xac1f3121), TOBN(0x7c9017ad, 0x6f028a7c), - TOBN(0xabc96de9, 0x0a482873), TOBN(0x4265d6b1, 0xb77e54d4), - TOBN(0x68c38e79, 0xa57d88e7), TOBN(0xd461d766, 0x9ce82de3), - TOBN(0x817a9ec5, 0x64a7e489), TOBN(0xcc5675cd, 0xa0def5f2), - TOBN(0x9a00e785, 0x985d494e), TOBN(0xc626833f, 0x1b03514a), - TOBN(0xabe7905a, 0x83cdd60e), TOBN(0x50602fb5, 0xa1170184), - TOBN(0x689886cd, 0xb023642a), TOBN(0xd568d090, 0xa6e1fb00), - TOBN(0x5b1922c7, 0x0259217f), TOBN(0x93831cd9, 0xc43141e4), - TOBN(0xdfca3587, 0x0c95f86e), TOBN(0xdec2057a, 0x568ae828), - TOBN(0xc44ea599, 0xf98a759a), TOBN(0x55a0a7a2, 0xf7c23c1d), - TOBN(0xd5ffb6e6, 0x94c4f687), TOBN(0x3563cce2, 0x12848478), - TOBN(0x812b3517, 0xe7b1fbe1), TOBN(0x8a7dc979, 0x4f7338e0), - TOBN(0x211ecee9, 0x52d048db), TOBN(0x2eea4056, 0xc86ea3b8), - TOBN(0xd8cb68a7, 0xba772b34), TOBN(0xe16ed341, 0x5f4e2541), - TOBN(0x9b32f6a6, 0x0fec14db), TOBN(0xeee376f7, 0x391698be), - TOBN(0xe9a7aa17, 0x83674c02), TOBN(0x65832f97, 0x5843022a), - TOBN(0x29f3a8da, 0x5ba4990f), TOBN(0x79a59c3a, 0xfb8e3216), - TOBN(0x9cdc4d2e, 0xbd19bb16), TOBN(0xc6c7cfd0, 0xb3262d86), - TOBN(0xd4ce14d0, 0x969c0b47), TOBN(0x1fa352b7, 0x13e56128), - TOBN(0x383d55b8, 0x973db6d3), TOBN(0x71836850, 0xe8e5b7bf), - TOBN(0xc7714596, 0xe6bb571f), TOBN(0x259df31f, 0x2d5b2dd2), - TOBN(0x568f8925, 0x913cc16d), TOBN(0x18bc5b6d, 0xe1a26f5a), - TOBN(0xdfa413be, 0xf5f499ae), TOBN(0xf8835dec, 0xc3f0ae84), - TOBN(0xb6e60bd8, 0x65a40ab0), TOBN(0x65596439, 0x194b377e), - TOBN(0xbcd85625, 0x92084a69), TOBN(0x5ce433b9, 0x4f23ede0), - TOBN(0xe8e8f04f, 0x6ad65143), TOBN(0x11511827, 0xd6e14af6), - TOBN(0x3d390a10, 0x8295c0c7), TOBN(0x71e29ee4, 0x621eba16), - TOBN(0xa588fc09, 0x63717b46), TOBN(0x02be02fe, 0xe06ad4a2), - TOBN(0x931558c6, 0x04c22b22), TOBN(0xbb4d4bd6, 0x12f3c849), - TOBN(0x54a4f496, 0x20efd662), TOBN(0x92ba6d20, 0xc5952d14), - TOBN(0x2db8ea1e, 0xcc9784c2), TOBN(0x81cc10ca, 0x4b353644), - TOBN(0x40b570ad, 0x4b4d7f6c), TOBN(0x5c9f1d96, 0x84a1dcd2), - TOBN(0x01379f81, 0x3147e797), TOBN(0xe5c6097b, 0x2bd499f5), - TOBN(0x40dcafa6, 0x328e5e20), TOBN(0xf7b5244a, 0x54815550), - TOBN(0xb9a4f118, 0x47bfc978), TOBN(0x0ea0e79f, 0xd25825b1), - TOBN(0xa50f96eb, 0x646c7ecf), TOBN(0xeb811493, 0x446dea9d), - TOBN(0x2af04677, 0xdfabcf69), TOBN(0xbe3a068f, 0xc713f6e8), - TOBN(0x860d523d, 0x42e06189), TOBN(0xbf077941, 0x4e3aff13), - TOBN(0x0b616dca, 0xc1b20650), TOBN(0xe66dd6d1, 0x2131300d), - TOBN(0xd4a0fd67, 0xff99abde), TOBN(0xc9903550, 0xc7aac50d), - TOBN(0x022ecf8b, 0x7c46b2d7), TOBN(0x3333b1e8, 0x3abf92af), - TOBN(0x11cc113c, 0x6c491c14), TOBN(0x05976688, 0x80dd3f88), - TOBN(0xf5b4d9e7, 0x29d932ed), TOBN(0xe982aad8, 0xa2c38b6d), - TOBN(0x6f925347, 0x8be0dcf0), TOBN(0x700080ae, 0x65ca53f2), - TOBN(0xd8131156, 0x443ca77f), TOBN(0xe92d6942, 0xec51f984), - TOBN(0xd2a08af8, 0x85dfe9ae), TOBN(0xd825d9a5, 0x4d2a86ca), - TOBN(0x2c53988d, 0x39dff020), TOBN(0xf38b135a, 0x430cdc40), - TOBN(0x0c918ae0, 0x62a7150b), TOBN(0xf31fd8de, 0x0c340e9b), - TOBN(0xafa0e7ae, 0x4dbbf02e), TOBN(0x5847fb2a, 0x5eba6239), - TOBN(0x6b1647dc, 0xdccbac8b), TOBN(0xb642aa78, 0x06f485c8), - TOBN(0x873f3765, 0x7038ecdf), TOBN(0x2ce5e865, 0xfa49d3fe), - TOBN(0xea223788, 0xc98c4400), TOBN(0x8104a8cd, 0xf1fa5279), - TOBN(0xbcf7cc7a, 0x06becfd7), TOBN(0x49424316, 0xc8f974ae), - TOBN(0xc0da65e7, 0x84d6365d), TOBN(0xbcb7443f, 0x8f759fb8), - TOBN(0x35c712b1, 0x7ae81930), TOBN(0x80428dff, 0x4c6e08ab), - TOBN(0xf19dafef, 0xa4faf843), TOBN(0xced8538d, 0xffa9855f), - TOBN(0x20ac409c, 0xbe3ac7ce), TOBN(0x358c1fb6, 0x882da71e), - TOBN(0xafa9c0e5, 0xfd349961), TOBN(0x2b2cfa51, 0x8421c2fc), - TOBN(0x2a80db17, 0xf3a28d38), TOBN(0xa8aba539, 0x5d138e7e), - TOBN(0x52012d1d, 0x6e96eb8d), TOBN(0x65d8dea0, 0xcbaf9622), - TOBN(0x57735447, 0xb264f56c), TOBN(0xbeebef3f, 0x1b6c8da2), - TOBN(0xfc346d98, 0xce785254), TOBN(0xd50e8d72, 0xbb64a161), - TOBN(0xc03567c7, 0x49794add), TOBN(0x15a76065, 0x752c7ef6), - TOBN(0x59f3a222, 0x961f23d6), TOBN(0x378e4438, 0x73ecc0b0), - TOBN(0xc74be434, 0x5a82fde4), TOBN(0xae509af2, 0xd8b9cf34), - TOBN(0x4a61ee46, 0x577f44a1), TOBN(0xe09b748c, 0xb611deeb), - TOBN(0xc0481b2c, 0xf5f7b884), TOBN(0x35626678, 0x61acfa6b), - TOBN(0x37f4c518, 0xbf8d21e6), TOBN(0x22d96531, 0xb205a76d), - TOBN(0x37fb85e1, 0x954073c0), TOBN(0xbceafe4f, 0x65b3a567), - TOBN(0xefecdef7, 0xbe42a582), TOBN(0xd3fc6080, 0x65046be6), - TOBN(0xc9af13c8, 0x09e8dba9), TOBN(0x1e6c9847, 0x641491ff), - TOBN(0x3b574925, 0xd30c31f7), TOBN(0xb7eb72ba, 0xac2a2122), - TOBN(0x776a0dac, 0xef0859e7), TOBN(0x06fec314, 0x21900942), - TOBN(0x2464bc10, 0xf8c22049), TOBN(0x9bfbcce7, 0x875ebf69), - TOBN(0xd7a88e2a, 0x4336326b), TOBN(0xda05261c, 0x5bc2acfa), - TOBN(0xc29f5bdc, 0xeba7efc8), TOBN(0x471237ca, 0x25dbbf2e), - TOBN(0xa72773f2, 0x2975f127), TOBN(0xdc744e8e, 0x04d0b326), - TOBN(0x38a7ed16, 0xa56edb73), TOBN(0x64357e37, 0x2c007e70), - TOBN(0xa167d15b, 0x5080b400), TOBN(0x07b41164, 0x23de4be1), - TOBN(0xb2d91e32, 0x74c89883), TOBN(0x3c162821, 0x2882e7ed), - TOBN(0xad6b36ba, 0x7503e482), TOBN(0x48434e8e, 0x0ea34331), - TOBN(0x79f4f24f, 0x2c7ae0b9), TOBN(0xc46fbf81, 0x1939b44a), - TOBN(0x76fefae8, 0x56595eb1), TOBN(0x417b66ab, 0xcd5f29c7), - TOBN(0x5f2332b2, 0xc5ceec20), TOBN(0xd69661ff, 0xe1a1cae2), - TOBN(0x5ede7e52, 0x9b0286e6), TOBN(0x9d062529, 0xe276b993), - TOBN(0x324794b0, 0x7e50122b), TOBN(0xdd744f8b, 0x4af07ca5), - TOBN(0x30a12f08, 0xd63fc97b), TOBN(0x39650f1a, 0x76626d9d), - TOBN(0x101b47f7, 0x1fa38477), TOBN(0x3d815f19, 0xd4dc124f), - TOBN(0x1569ae95, 0xb26eb58a), TOBN(0xc3cde188, 0x95fb1887), - TOBN(0x54e9f37b, 0xf9539a48), TOBN(0xb0100e06, 0x7408c1a5), - TOBN(0x821d9811, 0xea580cbb), TOBN(0x8af52d35, 0x86e50c56), - TOBN(0xdfbd9d47, 0xdbbf698b), TOBN(0x2961a1ea, 0x03dc1c73), - TOBN(0x203d38f8, 0xe76a5df8), TOBN(0x08a53a68, 0x6def707a), - TOBN(0x26eefb48, 0x1bee45d4), TOBN(0xb3cee346, 0x3c688036), - TOBN(0x463c5315, 0xc42f2469), TOBN(0x19d84d2e, 0x81378162), - TOBN(0x22d7c3c5, 0x1c4d349f), TOBN(0x65965844, 0x163d59c5), - TOBN(0xcf198c56, 0xb8abceae), TOBN(0x6fb1fb1b, 0x628559d5), - TOBN(0x8bbffd06, 0x07bf8fe3), TOBN(0x46259c58, 0x3467734b), - TOBN(0xd8953cea, 0x35f7f0d3), TOBN(0x1f0bece2, 0xd65b0ff1), - TOBN(0xf7d5b4b3, 0xf3c72914), TOBN(0x29e8ea95, 0x3cb53389), - TOBN(0x4a365626, 0x836b6d46), TOBN(0xe849f910, 0xea174fde), - TOBN(0x7ec62fbb, 0xf4737f21), TOBN(0xd8dba5ab, 0x6209f5ac), - TOBN(0x24b5d7a9, 0xa5f9adbe), TOBN(0x707d28f7, 0xa61dc768), - TOBN(0x7711460b, 0xcaa999ea), TOBN(0xba7b174d, 0x1c92e4cc), - TOBN(0x3c4bab66, 0x18d4bf2d), TOBN(0xb8f0c980, 0xeb8bd279), - TOBN(0x024bea9a, 0x324b4737), TOBN(0xfba9e423, 0x32a83bca), - TOBN(0x6e635643, 0xa232dced), TOBN(0x99619367, 0x2571c8ba), - TOBN(0xe8c9f357, 0x54b7032b), TOBN(0xf936b3ba, 0x2442d54a), - TOBN(0x2263f0f0, 0x8290c65a), TOBN(0x48989780, 0xee2c7fdb), - TOBN(0xadc5d55a, 0x13d4f95e), TOBN(0x737cff85, 0xad9b8500), - TOBN(0x271c557b, 0x8a73f43d), TOBN(0xbed617a4, 0xe18bc476), - TOBN(0x66245401, 0x7dfd8ab2), TOBN(0xae7b89ae, 0x3a2870aa), - TOBN(0x1b555f53, 0x23a7e545), TOBN(0x6791e247, 0xbe057e4c), - TOBN(0x860136ad, 0x324fa34d), TOBN(0xea111447, 0x4cbeae28), - TOBN(0x023a4270, 0xbedd3299), TOBN(0x3d5c3a7f, 0xc1c35c34), - TOBN(0xb0f6db67, 0x8d0412d2), TOBN(0xd92625e2, 0xfcdc6b9a), - TOBN(0x92ae5ccc, 0x4e28a982), TOBN(0xea251c36, 0x47a3ce7e), - TOBN(0x9d658932, 0x790691bf), TOBN(0xed610589, 0x06b736ae), - TOBN(0x712c2f04, 0xc0d63b6e), TOBN(0x5cf06fd5, 0xc63d488f), - TOBN(0x97363fac, 0xd9588e41), TOBN(0x1f9bf762, 0x2b93257e), - TOBN(0xa9d1ffc4, 0x667acace), TOBN(0x1cf4a1aa, 0x0a061ecf), - TOBN(0x40e48a49, 0xdc1818d0), TOBN(0x0643ff39, 0xa3621ab0), - TOBN(0x5768640c, 0xe39ef639), TOBN(0x1fc099ea, 0x04d86854), - TOBN(0x9130b9c3, 0xeccd28fd), TOBN(0xd743cbd2, 0x7eec54ab), - TOBN(0x052b146f, 0xe5b475b6), TOBN(0x058d9a82, 0x900a7d1f), - TOBN(0x65e02292, 0x91262b72), TOBN(0x96f924f9, 0xbb0edf03), - TOBN(0x5cfa59c8, 0xfe206842), TOBN(0xf6037004, 0x5eafa720), - TOBN(0x5f30699e, 0x18d7dd96), TOBN(0x381e8782, 0xcbab2495), - TOBN(0x91669b46, 0xdd8be949), TOBN(0xb40606f5, 0x26aae8ef), - TOBN(0x2812b839, 0xfc6751a4), TOBN(0x16196214, 0xfba800ef), - TOBN(0x4398d5ca, 0x4c1a2875), TOBN(0x720c00ee, 0x653d8349), - TOBN(0xc2699eb0, 0xd820007c), TOBN(0x880ee660, 0xa39b5825), - TOBN(0x70694694, 0x471f6984), TOBN(0xf7d16ea8, 0xe3dda99a), - TOBN(0x28d675b2, 0xc0519a23), TOBN(0x9ebf94fe, 0x4f6952e3), - TOBN(0xf28bb767, 0xa2294a8a), TOBN(0x85512b4d, 0xfe0af3f5), - TOBN(0x18958ba8, 0x99b16a0d), TOBN(0x95c2430c, 0xba7548a7), - TOBN(0xb30d1b10, 0xa16be615), TOBN(0xe3ebbb97, 0x85bfb74c), - TOBN(0xa3273cfe, 0x18549fdb), TOBN(0xf6e200bf, 0x4fcdb792), - TOBN(0x54a76e18, 0x83aba56c), TOBN(0x73ec66f6, 0x89ef6aa2), - TOBN(0x8d17add7, 0xd1b9a305), TOBN(0xa959c5b9, 0xb7ae1b9d), - TOBN(0x88643522, 0x6bcc094a), TOBN(0xcc5616c4, 0xd7d429b9), - TOBN(0xa6dada01, 0xe6a33f7c), TOBN(0xc6217a07, 0x9d4e70ad), - TOBN(0xd619a818, 0x09c15b7c), TOBN(0xea06b329, 0x0e80c854), - TOBN(0x174811ce, 0xa5f5e7b9), TOBN(0x66dfc310, 0x787c65f4), - TOBN(0x4ea7bd69, 0x3316ab54), TOBN(0xc12c4acb, 0x1dcc0f70), - TOBN(0xe4308d1a, 0x1e407dd9), TOBN(0xe8a3587c, 0x91afa997), - TOBN(0xea296c12, 0xab77b7a5), TOBN(0xb5ad49e4, 0x673c0d52), - TOBN(0x40f9b2b2, 0x7006085a), TOBN(0xa88ff340, 0x87bf6ec2), - TOBN(0x978603b1, 0x4e3066a6), TOBN(0xb3f99fc2, 0xb5e486e2), - TOBN(0x07b53f5e, 0xb2e63645), TOBN(0xbe57e547, 0x84c84232), - TOBN(0xd779c216, 0x7214d5cf), TOBN(0x617969cd, 0x029a3aca), - TOBN(0xd17668cd, 0x8a7017a0), TOBN(0x77b4d19a, 0xbe9b7ee8), - TOBN(0x58fd0e93, 0x9c161776), TOBN(0xa8c4f4ef, 0xd5968a72), - TOBN(0x296071cc, 0x67b3de77), TOBN(0xae3c0b8e, 0x634f7905), - TOBN(0x67e440c2, 0x8a7100c9), TOBN(0xbb8c3c1b, 0xeb4b9b42), - TOBN(0x6d71e8ea, 0xc51b3583), TOBN(0x7591f5af, 0x9525e642), - TOBN(0xf73a2f7b, 0x13f509f3), TOBN(0x618487aa, 0x5619ac9b), - TOBN(0x3a72e5f7, 0x9d61718a), TOBN(0x00413bcc, 0x7592d28c), - TOBN(0x7d9b11d3, 0x963c35cf), TOBN(0x77623bcf, 0xb90a46ed), - TOBN(0xdeef273b, 0xdcdd2a50), TOBN(0x4a741f9b, 0x0601846e), - TOBN(0x33b89e51, 0x0ec6e929), TOBN(0xcb02319f, 0x8b7f22cd), - TOBN(0xbbe1500d, 0x084bae24), TOBN(0x2f0ae8d7, 0x343d2693), - TOBN(0xacffb5f2, 0x7cdef811), TOBN(0xaa0c030a, 0x263fb94f), - TOBN(0x6eef0d61, 0xa0f442de), TOBN(0xf92e1817, 0x27b139d3), - TOBN(0x1ae6deb7, 0x0ad8bc28), TOBN(0xa89e38dc, 0xc0514130), - TOBN(0x81eeb865, 0xd2fdca23), TOBN(0x5a15ee08, 0xcc8ef895), - TOBN(0x768fa10a, 0x01905614), TOBN(0xeff5b8ef, 0x880ee19b), - TOBN(0xf0c0cabb, 0xcb1c8a0e), TOBN(0x2e1ee9cd, 0xb8c838f9), - TOBN(0x0587d8b8, 0x8a4a14c0), TOBN(0xf6f27896, 0x2ff698e5), - TOBN(0xed38ef1c, 0x89ee6256), TOBN(0xf44ee1fe, 0x6b353b45), - TOBN(0x9115c0c7, 0x70e903b3), TOBN(0xc78ec0a1, 0x818f31df), - TOBN(0x6c003324, 0xb7dccbc6), TOBN(0xd96dd1f3, 0x163bbc25), - TOBN(0x33aa82dd, 0x5cedd805), TOBN(0x123aae4f, 0x7f7eb2f1), - TOBN(0x1723fcf5, 0xa26262cd), TOBN(0x1f7f4d5d, 0x0060ebd5), - TOBN(0xf19c5c01, 0xb2eaa3af), TOBN(0x2ccb9b14, 0x9790accf), - TOBN(0x1f9c1cad, 0x52324aa6), TOBN(0x63200526, 0x7247df54), - TOBN(0x5732fe42, 0xbac96f82), TOBN(0x52fe771f, 0x01a1c384), - TOBN(0x546ca13d, 0xb1001684), TOBN(0xb56b4eee, 0xa1709f75), - TOBN(0x266545a9, 0xd5db8672), TOBN(0xed971c90, 0x1e8f3cfb), - TOBN(0x4e7d8691, 0xe3a07b29), TOBN(0x7570d9ec, 0xe4b696b9), - TOBN(0xdc5fa067, 0x7bc7e9ae), TOBN(0x68b44caf, 0xc82c4844), - TOBN(0x519d34b3, 0xbf44da80), TOBN(0x283834f9, 0x5ab32e66), - TOBN(0x6e608797, 0x6278a000), TOBN(0x1e62960e, 0x627312f6), - TOBN(0x9b87b27b, 0xe6901c55), TOBN(0x80e78538, 0x24fdbc1f), - TOBN(0xbbbc0951, 0x2facc27d), TOBN(0x06394239, 0xac143b5a), - TOBN(0x35bb4a40, 0x376c1944), TOBN(0x7cb62694, 0x63da1511), - TOBN(0xafd29161, 0xb7148a3b), TOBN(0xa6f9d9ed, 0x4e2ea2ee), - TOBN(0x15dc2ca2, 0x880dd212), TOBN(0x903c3813, 0xa61139a9), - TOBN(0x2aa7b46d, 0x6c0f8785), TOBN(0x36ce2871, 0x901c60ff), - TOBN(0xc683b028, 0xe10d9c12), TOBN(0x7573baa2, 0x032f33d3), - TOBN(0x87a9b1f6, 0x67a31b58), TOBN(0xfd3ed11a, 0xf4ffae12), - TOBN(0x83dcaa9a, 0x0cb2748e), TOBN(0x8239f018, 0x5d6fdf16), - TOBN(0xba67b49c, 0x72753941), TOBN(0x2beec455, 0xc321cb36), - TOBN(0x88015606, 0x3f8b84ce), TOBN(0x76417083, 0x8d38c86f), - TOBN(0x054f1ca7, 0x598953dd), TOBN(0xc939e110, 0x4e8e7429), - TOBN(0x9b1ac2b3, 0x5a914f2f), TOBN(0x39e35ed3, 0xe74b8f9c), - TOBN(0xd0debdb2, 0x781b2fb0), TOBN(0x1585638f, 0x2d997ba2), - TOBN(0x9c4b646e, 0x9e2fce99), TOBN(0x68a21081, 0x1e80857f), - TOBN(0x06d54e44, 0x3643b52a), TOBN(0xde8d6d63, 0x0d8eb843), - TOBN(0x70321563, 0x42146a0a), TOBN(0x8ba826f2, 0x5eaa3622), - TOBN(0x227a58bd, 0x86138787), TOBN(0x43b6c03c, 0x10281d37), - TOBN(0x6326afbb, 0xb54dde39), TOBN(0x744e5e8a, 0xdb6f2d5f), - TOBN(0x48b2a99a, 0xcff158e1), TOBN(0xa93c8fa0, 0xef87918f), - TOBN(0x2182f956, 0xde058c5c), TOBN(0x216235d2, 0x936f9e7a), - TOBN(0xace0c0db, 0xd2e31e67), TOBN(0xc96449bf, 0xf23ac3e7), - TOBN(0x7e9a2874, 0x170693bd), TOBN(0xa28e14fd, 0xa45e6335), - TOBN(0x5757f6b3, 0x56427344), TOBN(0x822e4556, 0xacf8edf9), - TOBN(0x2b7a6ee2, 0xe6a285cd), TOBN(0x5866f211, 0xa9df3af0), - TOBN(0x40dde2dd, 0xf845b844), TOBN(0x986c3726, 0x110e5e49), - TOBN(0x73680c2a, 0xf7172277), TOBN(0x57b94f0f, 0x0cccb244), - TOBN(0xbdff7267, 0x2d438ca7), TOBN(0xbad1ce11, 0xcf4663fd), - TOBN(0x9813ed9d, 0xd8f71cae), TOBN(0xf43272a6, 0x961fdaa6), - TOBN(0xbeff0119, 0xbd6d1637), TOBN(0xfebc4f91, 0x30361978), - TOBN(0x02b37a95, 0x2f41deff), TOBN(0x0e44a59a, 0xe63b89b7), - TOBN(0x673257dc, 0x143ff951), TOBN(0x19c02205, 0xd752baf4), - TOBN(0x46c23069, 0xc4b7d692), TOBN(0x2e6392c3, 0xfd1502ac), - TOBN(0x6057b1a2, 0x1b220846), TOBN(0xe51ff946, 0x0c1b5b63)}, - {TOBN(0x6e85cb51, 0x566c5c43), TOBN(0xcff9c919, 0x3597f046), - TOBN(0x9354e90c, 0x4994d94a), TOBN(0xe0a39332, 0x2147927d), - TOBN(0x8427fac1, 0x0dc1eb2b), TOBN(0x88cfd8c2, 0x2ff319fa), - TOBN(0xe2d4e684, 0x01965274), TOBN(0xfa2e067d, 0x67aaa746), - TOBN(0xb6d92a7f, 0x3e5f9f11), TOBN(0x9afe153a, 0xd6cb3b8e), - TOBN(0x4d1a6dd7, 0xddf800bd), TOBN(0xf6c13cc0, 0xcaf17e19), - TOBN(0x15f6c58e, 0x325fc3ee), TOBN(0x71095400, 0xa31dc3b2), - TOBN(0x168e7c07, 0xafa3d3e7), TOBN(0x3f8417a1, 0x94c7ae2d), - TOBN(0xec234772, 0x813b230d), TOBN(0x634d0f5f, 0x17344427), - TOBN(0x11548ab1, 0xd77fc56a), TOBN(0x7fab1750, 0xce06af77), - TOBN(0xb62c10a7, 0x4f7c4f83), TOBN(0xa7d2edc4, 0x220a67d9), - TOBN(0x1c404170, 0x921209a0), TOBN(0x0b9815a0, 0xface59f0), - TOBN(0x2842589b, 0x319540c3), TOBN(0x18490f59, 0xa283d6f8), - TOBN(0xa2731f84, 0xdaae9fcb), TOBN(0x3db6d960, 0xc3683ba0), - TOBN(0xc85c63bb, 0x14611069), TOBN(0xb19436af, 0x0788bf05), - TOBN(0x905459df, 0x347460d2), TOBN(0x73f6e094, 0xe11a7db1), - TOBN(0xdc7f938e, 0xb6357f37), TOBN(0xc5d00f79, 0x2bd8aa62), - TOBN(0xc878dcb9, 0x2ca979fc), TOBN(0x37e83ed9, 0xeb023a99), - TOBN(0x6b23e273, 0x1560bf3d), TOBN(0x1086e459, 0x1d0fae61), - TOBN(0x78248316, 0x9a9414bd), TOBN(0x1b956bc0, 0xf0ea9ea1), - TOBN(0x7b85bb91, 0xc31b9c38), TOBN(0x0c5aa90b, 0x48ef57b5), - TOBN(0xdedeb169, 0xaf3bab6f), TOBN(0xe610ad73, 0x2d373685), - TOBN(0xf13870df, 0x02ba8e15), TOBN(0x0337edb6, 0x8ca7f771), - TOBN(0xe4acf747, 0xb62c036c), TOBN(0xd921d576, 0xb6b94e81), - TOBN(0xdbc86439, 0x2c422f7a), TOBN(0xfb635362, 0xed348898), - TOBN(0x83084668, 0xc45bfcd1), TOBN(0xc357c9e3, 0x2b315e11), - TOBN(0xb173b540, 0x5b2e5b8c), TOBN(0x7e946931, 0xe102b9a4), - TOBN(0x17c890eb, 0x7b0fb199), TOBN(0xec225a83, 0xd61b662b), - TOBN(0xf306a3c8, 0xee3c76cb), TOBN(0x3cf11623, 0xd32a1f6e), - TOBN(0xe6d5ab64, 0x6863e956), TOBN(0x3b8a4cbe, 0x5c005c26), - TOBN(0xdcd529a5, 0x9ce6bb27), TOBN(0xc4afaa52, 0x04d4b16f), - TOBN(0xb0624a26, 0x7923798d), TOBN(0x85e56df6, 0x6b307fab), - TOBN(0x0281893c, 0x2bf29698), TOBN(0x91fc19a4, 0xd7ce7603), - TOBN(0x75a5dca3, 0xad9a558f), TOBN(0x40ceb3fa, 0x4d50bf77), - TOBN(0x1baf6060, 0xbc9ba369), TOBN(0x927e1037, 0x597888c2), - TOBN(0xd936bf19, 0x86a34c07), TOBN(0xd4cf10c1, 0xc34ae980), - TOBN(0x3a3e5334, 0x859dd614), TOBN(0x9c475b5b, 0x18d0c8ee), - TOBN(0x63080d1f, 0x07cd51d5), TOBN(0xc9c0d0a6, 0xb88b4326), - TOBN(0x1ac98691, 0xc234296f), TOBN(0x2a0a83a4, 0x94887fb6), - TOBN(0x56511427, 0x0cea9cf2), TOBN(0x5230a6e8, 0xa24802f5), - TOBN(0xf7a2bf0f, 0x72e3d5c1), TOBN(0x37717446, 0x4f21439e), - TOBN(0xfedcbf25, 0x9ce30334), TOBN(0xe0030a78, 0x7ce202f9), - TOBN(0x6f2d9ebf, 0x1202e9ca), TOBN(0xe79dde6c, 0x75e6e591), - TOBN(0xf52072af, 0xf1dac4f8), TOBN(0x6c8d087e, 0xbb9b404d), - TOBN(0xad0fc73d, 0xbce913af), TOBN(0x909e587b, 0x458a07cb), - TOBN(0x1300da84, 0xd4f00c8a), TOBN(0x425cd048, 0xb54466ac), - TOBN(0xb59cb9be, 0x90e9d8bf), TOBN(0x991616db, 0x3e431b0e), - TOBN(0xd3aa117a, 0x531aecff), TOBN(0x91af92d3, 0x59f4dc3b), - TOBN(0x9b1ec292, 0xe93fda29), TOBN(0x76bb6c17, 0xe97d91bc), - TOBN(0x7509d95f, 0xaface1e6), TOBN(0x3653fe47, 0xbe855ae3), - TOBN(0x73180b28, 0x0f680e75), TOBN(0x75eefd1b, 0xeeb6c26c), - TOBN(0xa4cdf29f, 0xb66d4236), TOBN(0x2d70a997, 0x6b5821d8), - TOBN(0x7a3ee207, 0x20445c36), TOBN(0x71d1ac82, 0x59877174), - TOBN(0x0fc539f7, 0x949f73e9), TOBN(0xd05cf3d7, 0x982e3081), - TOBN(0x8758e20b, 0x7b1c7129), TOBN(0xffadcc20, 0x569e61f2), - TOBN(0xb05d3a2f, 0x59544c2d), TOBN(0xbe16f5c1, 0x9fff5e53), - TOBN(0x73cf65b8, 0xaad58135), TOBN(0x622c2119, 0x037aa5be), - TOBN(0x79373b3f, 0x646fd6a0), TOBN(0x0e029db5, 0x0d3978cf), - TOBN(0x8bdfc437, 0x94fba037), TOBN(0xaefbd687, 0x620797a6), - TOBN(0x3fa5382b, 0xbd30d38e), TOBN(0x7627cfbf, 0x585d7464), - TOBN(0xb2330fef, 0x4e4ca463), TOBN(0xbcef7287, 0x3566cc63), - TOBN(0xd161d2ca, 0xcf780900), TOBN(0x135dc539, 0x5b54827d), - TOBN(0x638f052e, 0x27bf1bc6), TOBN(0x10a224f0, 0x07dfa06c), - TOBN(0xe973586d, 0x6d3321da), TOBN(0x8b0c5738, 0x26152c8f), - TOBN(0x07ef4f2a, 0x34606074), TOBN(0x80fe7fe8, 0xa0f7047a), - TOBN(0x3d1a8152, 0xe1a0e306), TOBN(0x32cf43d8, 0x88da5222), - TOBN(0xbf89a95f, 0x5f02ffe6), TOBN(0x3d9eb9a4, 0x806ad3ea), - TOBN(0x012c17bb, 0x79c8e55e), TOBN(0xfdcd1a74, 0x99c81dac), - TOBN(0x7043178b, 0xb9556098), TOBN(0x4090a1df, 0x801c3886), - TOBN(0x759800ff, 0x9b67b912), TOBN(0x3e5c0304, 0x232620c8), - TOBN(0x4b9d3c4b, 0x70dceeca), TOBN(0xbb2d3c15, 0x181f648e), - TOBN(0xf981d837, 0x6e33345c), TOBN(0xb626289b, 0x0cf2297a), - TOBN(0x766ac659, 0x8baebdcf), TOBN(0x1a28ae09, 0x75df01e5), - TOBN(0xb71283da, 0x375876d8), TOBN(0x4865a96d, 0x607b9800), - TOBN(0x25dd1bcd, 0x237936b2), TOBN(0x332f4f4b, 0x60417494), - TOBN(0xd0923d68, 0x370a2147), TOBN(0x497f5dfb, 0xdc842203), - TOBN(0x9dc74cbd, 0x32be5e0f), TOBN(0x7475bcb7, 0x17a01375), - TOBN(0x438477c9, 0x50d872b1), TOBN(0xcec67879, 0xffe1d63d), - TOBN(0x9b006014, 0xd8578c70), TOBN(0xc9ad99a8, 0x78bb6b8b), - TOBN(0x6799008e, 0x11fb3806), TOBN(0xcfe81435, 0xcd44cab3), - TOBN(0xa2ee1582, 0x2f4fb344), TOBN(0xb8823450, 0x483fa6eb), - TOBN(0x622d323d, 0x652c7749), TOBN(0xd8474a98, 0xbeb0a15b), - TOBN(0xe43c154d, 0x5d1c00d0), TOBN(0x7fd581d9, 0x0e3e7aac), - TOBN(0x2b44c619, 0x2525ddf8), TOBN(0x67a033eb, 0xb8ae9739), - TOBN(0x113ffec1, 0x9ef2d2e4), TOBN(0x1bf6767e, 0xd5a0ea7f), - TOBN(0x57fff75e, 0x03714c0a), TOBN(0xa23c422e, 0x0a23e9ee), - TOBN(0xdd5f6b2d, 0x540f83af), TOBN(0xc2c2c27e, 0x55ea46a7), - TOBN(0xeb6b4246, 0x672a1208), TOBN(0xd13599f7, 0xae634f7a), - TOBN(0xcf914b5c, 0xd7b32c6e), TOBN(0x61a5a640, 0xeaf61814), - TOBN(0x8dc3df8b, 0x208a1bbb), TOBN(0xef627fd6, 0xb6d79aa5), - TOBN(0x44232ffc, 0xc4c86bc8), TOBN(0xe6f9231b, 0x061539fe), - TOBN(0x1d04f25a, 0x958b9533), TOBN(0x180cf934, 0x49e8c885), - TOBN(0x89689595, 0x9884aaf7), TOBN(0xb1959be3, 0x07b348a6), - TOBN(0x96250e57, 0x3c147c87), TOBN(0xae0efb3a, 0xdd0c61f8), - TOBN(0xed00745e, 0xca8c325e), TOBN(0x3c911696, 0xecff3f70), - TOBN(0x73acbc65, 0x319ad41d), TOBN(0x7b01a020, 0xf0b1c7ef), - TOBN(0xea32b293, 0x63a1483f), TOBN(0x89eabe71, 0x7a248f96), - TOBN(0x9c6231d3, 0x343157e5), TOBN(0x93a375e5, 0xdf3c546d), - TOBN(0xe76e9343, 0x6a2afe69), TOBN(0xc4f89100, 0xe166c88e), - TOBN(0x248efd0d, 0x4f872093), TOBN(0xae0eb3ea, 0x8fe0ea61), - TOBN(0xaf89790d, 0x9d79046e), TOBN(0x4d650f2d, 0x6cee0976), - TOBN(0xa3935d9a, 0x43071eca), TOBN(0x66fcd2c9, 0x283b0bfe), - TOBN(0x0e665eb5, 0x696605f1), TOBN(0xe77e5d07, 0xa54cd38d), - TOBN(0x90ee050a, 0x43d950cf), TOBN(0x86ddebda, 0xd32e69b5), - TOBN(0x6ad94a3d, 0xfddf7415), TOBN(0xf7fa1309, 0x3f6e8d5a), - TOBN(0xc4831d1d, 0xe9957f75), TOBN(0x7de28501, 0xd5817447), - TOBN(0x6f1d7078, 0x9e2aeb6b), TOBN(0xba2b9ff4, 0xf67a53c2), - TOBN(0x36963767, 0xdf9defc3), TOBN(0x479deed3, 0x0d38022c), - TOBN(0xd2edb89b, 0x3a8631e8), TOBN(0x8de855de, 0x7a213746), - TOBN(0xb2056cb7, 0xb00c5f11), TOBN(0xdeaefbd0, 0x2c9b85e4), - TOBN(0x03f39a8d, 0xd150892d), TOBN(0x37b84686, 0x218b7985), - TOBN(0x36296dd8, 0xb7375f1a), TOBN(0x472cd4b1, 0xb78e898e), - TOBN(0x15dff651, 0xe9f05de9), TOBN(0xd4045069, 0x2ce98ba9), - TOBN(0x8466a7ae, 0x9b38024c), TOBN(0xb910e700, 0xe5a6b5ef), - TOBN(0xae1c56ea, 0xb3aa8f0d), TOBN(0xbab2a507, 0x7eee74a6), - TOBN(0x0dca11e2, 0x4b4c4620), TOBN(0xfd896e2e, 0x4c47d1f4), - TOBN(0xeb45ae53, 0x308fbd93), TOBN(0x46cd5a2e, 0x02c36fda), - TOBN(0x6a3d4e90, 0xbaa48385), TOBN(0xdd55e62e, 0x9dbe9960), - TOBN(0xa1406aa0, 0x2a81ede7), TOBN(0x6860dd14, 0xf9274ea7), - TOBN(0xcfdcb0c2, 0x80414f86), TOBN(0xff410b10, 0x22f94327), - TOBN(0x5a33cc38, 0x49ad467b), TOBN(0xefb48b6c, 0x0a7335f1), - TOBN(0x14fb54a4, 0xb153a360), TOBN(0x604aa9d2, 0xb52469cc), - TOBN(0x5e9dc486, 0x754e48e9), TOBN(0x693cb455, 0x37471e8e), - TOBN(0xfb2fd7cd, 0x8d3b37b6), TOBN(0x63345e16, 0xcf09ff07), - TOBN(0x9910ba6b, 0x23a5d896), TOBN(0x1fe19e35, 0x7fe4364e), - TOBN(0x6e1da8c3, 0x9a33c677), TOBN(0x15b4488b, 0x29fd9fd0), - TOBN(0x1f439254, 0x1a1f22bf), TOBN(0x920a8a70, 0xab8163e8), - TOBN(0x3fd1b249, 0x07e5658e), TOBN(0xf2c4f79c, 0xb6ec839b), - TOBN(0x1abbc3d0, 0x4aa38d1b), TOBN(0x3b0db35c, 0xb5d9510e), - TOBN(0x1754ac78, 0x3e60dec0), TOBN(0x53272fd7, 0xea099b33), - TOBN(0x5fb0494f, 0x07a8e107), TOBN(0x4a89e137, 0x6a8191fa), - TOBN(0xa113b7f6, 0x3c4ad544), TOBN(0x88a2e909, 0x6cb9897b), - TOBN(0x17d55de3, 0xb44a3f84), TOBN(0xacb2f344, 0x17c6c690), - TOBN(0x32088168, 0x10232390), TOBN(0xf2e8a61f, 0x6c733bf7), - TOBN(0xa774aab6, 0x9c2d7652), TOBN(0xfb5307e3, 0xed95c5bc), - TOBN(0xa05c73c2, 0x4981f110), TOBN(0x1baae31c, 0xa39458c9), - TOBN(0x1def185b, 0xcbea62e7), TOBN(0xe8ac9eae, 0xeaf63059), - TOBN(0x098a8cfd, 0x9921851c), TOBN(0xd959c3f1, 0x3abe2f5b), - TOBN(0xa4f19525, 0x20e40ae5), TOBN(0x320789e3, 0x07a24aa1), - TOBN(0x259e6927, 0x7392b2bc), TOBN(0x58f6c667, 0x1918668b), - TOBN(0xce1db2bb, 0xc55d2d8b), TOBN(0x41d58bb7, 0xf4f6ca56), - TOBN(0x7650b680, 0x8f877614), TOBN(0x905e16ba, 0xf4c349ed), - TOBN(0xed415140, 0xf661acac), TOBN(0x3b8784f0, 0xcb2270af), - TOBN(0x3bc280ac, 0x8a402cba), TOBN(0xd53f7146, 0x0937921a), - TOBN(0xc03c8ee5, 0xe5681e83), TOBN(0x62126105, 0xf6ac9e4a), - TOBN(0x9503a53f, 0x936b1a38), TOBN(0x3d45e2d4, 0x782fecbd), - TOBN(0x69a5c439, 0x76e8ae98), TOBN(0xb53b2eeb, 0xbfb4b00e), - TOBN(0xf1674712, 0x72386c89), TOBN(0x30ca34a2, 0x4268bce4), - TOBN(0x7f1ed86c, 0x78341730), TOBN(0x8ef5beb8, 0xb525e248), - TOBN(0xbbc489fd, 0xb74fbf38), TOBN(0x38a92a0e, 0x91a0b382), - TOBN(0x7a77ba3f, 0x22433ccf), TOBN(0xde8362d6, 0xa29f05a9), - TOBN(0x7f6a30ea, 0x61189afc), TOBN(0x693b5505, 0x59ef114f), - TOBN(0x50266bc0, 0xcd1797a1), TOBN(0xea17b47e, 0xf4b7af2d), - TOBN(0xd6c4025c, 0x3df9483e), TOBN(0x8cbb9d9f, 0xa37b18c9), - TOBN(0x91cbfd9c, 0x4d8424cf), TOBN(0xdb7048f1, 0xab1c3506), - TOBN(0x9eaf641f, 0x028206a3), TOBN(0xf986f3f9, 0x25bdf6ce), - TOBN(0x262143b5, 0x224c08dc), TOBN(0x2bbb09b4, 0x81b50c91), - TOBN(0xc16ed709, 0xaca8c84f), TOBN(0xa6210d9d, 0xb2850ca8), - TOBN(0x6d8df67a, 0x09cb54d6), TOBN(0x91eef6e0, 0x500919a4), - TOBN(0x90f61381, 0x0f132857), TOBN(0x9acede47, 0xf8d5028b), - TOBN(0x844d1b71, 0x90b771c3), TOBN(0x563b71e4, 0xba6426be), - TOBN(0x2efa2e83, 0xbdb802ff), TOBN(0x3410cbab, 0xab5b4a41), - TOBN(0x555b2d26, 0x30da84dd), TOBN(0xd0711ae9, 0xee1cc29a), - TOBN(0xcf3e8c60, 0x2f547792), TOBN(0x03d7d5de, 0xdc678b35), - TOBN(0x071a2fa8, 0xced806b8), TOBN(0x222e6134, 0x697f1478), - TOBN(0xdc16fd5d, 0xabfcdbbf), TOBN(0x44912ebf, 0x121b53b8), - TOBN(0xac943674, 0x2496c27c), TOBN(0x8ea3176c, 0x1ffc26b0), - TOBN(0xb6e224ac, 0x13debf2c), TOBN(0x524cc235, 0xf372a832), - TOBN(0xd706e1d8, 0x9f6f1b18), TOBN(0x2552f005, 0x44cce35b), - TOBN(0x8c8326c2, 0xa88e31fc), TOBN(0xb5468b2c, 0xf9552047), - TOBN(0xce683e88, 0x3ff90f2b), TOBN(0x77947bdf, 0x2f0a5423), - TOBN(0xd0a1b28b, 0xed56e328), TOBN(0xaee35253, 0xc20134ac), - TOBN(0x7e98367d, 0x3567962f), TOBN(0x379ed61f, 0x8188bffb), - TOBN(0x73bba348, 0xfaf130a1), TOBN(0x6c1f75e1, 0x904ed734), - TOBN(0x18956642, 0x3b4a79fc), TOBN(0xf20bc83d, 0x54ef4493), - TOBN(0x836d425d, 0x9111eca1), TOBN(0xe5b5c318, 0x009a8dcf), - TOBN(0x3360b25d, 0x13221bc5), TOBN(0x707baad2, 0x6b3eeaf7), - TOBN(0xd7279ed8, 0x743a95a1), TOBN(0x7450a875, 0x969e809f), - TOBN(0x32b6bd53, 0xe5d0338f), TOBN(0x1e77f7af, 0x2b883bbc), - TOBN(0x90da12cc, 0x1063ecd0), TOBN(0xe2697b58, 0xc315be47), - TOBN(0x2771a5bd, 0xda85d534), TOBN(0x53e78c1f, 0xff980eea), - TOBN(0xadf1cf84, 0x900385e7), TOBN(0x7d3b14f6, 0xc9387b62), - TOBN(0x170e74b0, 0xcb8f2bd2), TOBN(0x2d50b486, 0x827fa993), - TOBN(0xcdbe8c9a, 0xf6f32bab), TOBN(0x55e906b0, 0xc3b93ab8), - TOBN(0x747f22fc, 0x8fe280d1), TOBN(0xcd8e0de5, 0xb2e114ab), - TOBN(0x5ab7dbeb, 0xe10b68b0), TOBN(0x9dc63a9c, 0xa480d4b2), - TOBN(0x78d4bc3b, 0x4be1495f), TOBN(0x25eb3db8, 0x9359122d), - TOBN(0x3f8ac05b, 0x0809cbdc), TOBN(0xbf4187bb, 0xd37c702f), - TOBN(0x84cea069, 0x1416a6a5), TOBN(0x8f860c79, 0x43ef881c), - TOBN(0x41311f8a, 0x38038a5d), TOBN(0xe78c2ec0, 0xfc612067), - TOBN(0x494d2e81, 0x5ad73581), TOBN(0xb4cc9e00, 0x59604097), - TOBN(0xff558aec, 0xf3612cba), TOBN(0x35beef7a, 0x9e36c39e), - TOBN(0x1845c7cf, 0xdbcf41b9), TOBN(0x5703662a, 0xaea997c0), - TOBN(0x8b925afe, 0xe402f6d8), TOBN(0xd0a1b1ae, 0x4dd72162), - TOBN(0x9f47b375, 0x03c41c4b), TOBN(0xa023829b, 0x0391d042), - TOBN(0x5f5045c3, 0x503b8b0a), TOBN(0x123c2688, 0x98c010e5), - TOBN(0x324ec0cc, 0x36ba06ee), TOBN(0xface3115, 0x3dd2cc0c), - TOBN(0xb364f3be, 0xf333e91f), TOBN(0xef8aff73, 0x28e832b0), - TOBN(0x1e9bad04, 0x2d05841b), TOBN(0x42f0e3df, 0x356a21e2), - TOBN(0xa3270bcb, 0x4add627e), TOBN(0xb09a8158, 0xd322e711), - TOBN(0x86e326a1, 0x0fee104a), TOBN(0xad7788f8, 0x3703f65d), - TOBN(0x7e765430, 0x47bc4833), TOBN(0x6cee582b, 0x2b9b893a), - TOBN(0x9cd2a167, 0xe8f55a7b), TOBN(0xefbee3c6, 0xd9e4190d), - TOBN(0x33ee7185, 0xd40c2e9d), TOBN(0x844cc9c5, 0xa380b548), - TOBN(0x323f8ecd, 0x66926e04), TOBN(0x0001e38f, 0x8110c1ba), - TOBN(0x8dbcac12, 0xfc6a7f07), TOBN(0xd65e1d58, 0x0cec0827), - TOBN(0xd2cd4141, 0xbe76ca2d), TOBN(0x7895cf5c, 0xe892f33a), - TOBN(0x956d230d, 0x367139d2), TOBN(0xa91abd3e, 0xd012c4c1), - TOBN(0x34fa4883, 0x87eb36bf), TOBN(0xc5f07102, 0x914b8fb4), - TOBN(0x90f0e579, 0xadb9c95f), TOBN(0xfe6ea8cb, 0x28888195), - TOBN(0x7b9b5065, 0xedfa9284), TOBN(0x6c510bd2, 0x2b8c8d65), - TOBN(0xd7b8ebef, 0xcbe8aafd), TOBN(0xedb3af98, 0x96b1da07), - TOBN(0x28ff779d, 0x6295d426), TOBN(0x0c4f6ac7, 0x3fa3ad7b), - TOBN(0xec44d054, 0x8b8e2604), TOBN(0x9b32a66d, 0x8b0050e1), - TOBN(0x1f943366, 0xf0476ce2), TOBN(0x7554d953, 0xa602c7b4), - TOBN(0xbe35aca6, 0x524f2809), TOBN(0xb6881229, 0xfd4edbea), - TOBN(0xe8cd0c8f, 0x508efb63), TOBN(0x9eb5b5c8, 0x6abcefc7), - TOBN(0xf5621f5f, 0xb441ab4f), TOBN(0x79e6c046, 0xb76a2b22), - TOBN(0x74a4792c, 0xe37a1f69), TOBN(0xcbd252cb, 0x03542b60), - TOBN(0x785f65d5, 0xb3c20bd3), TOBN(0x8dea6143, 0x4fabc60c), - TOBN(0x45e21446, 0xde673629), TOBN(0x57f7aa1e, 0x703c2d21), - TOBN(0xa0e99b7f, 0x98c868c7), TOBN(0x4e42f66d, 0x8b641676), - TOBN(0x602884dc, 0x91077896), TOBN(0xa0d690cf, 0xc2c9885b), - TOBN(0xfeb4da33, 0x3b9a5187), TOBN(0x5f789598, 0x153c87ee), - TOBN(0x2192dd47, 0x52b16dba), TOBN(0xdeefc0e6, 0x3524c1b1), - TOBN(0x465ea76e, 0xe4383693), TOBN(0x79401711, 0x361b8d98), - TOBN(0xa5f9ace9, 0xf21a15cb), TOBN(0x73d26163, 0xefee9aeb), - TOBN(0xcca844b3, 0xe677016c), TOBN(0x6c122b07, 0x57eaee06), - TOBN(0xb782dce7, 0x15f09690), TOBN(0x508b9b12, 0x2dfc0fc9), - TOBN(0x9015ab4b, 0x65d89fc6), TOBN(0x5e79dab7, 0xd6d5bb0f), - TOBN(0x64f021f0, 0x6c775aa2), TOBN(0xdf09d8cc, 0x37c7eca1), - TOBN(0x9a761367, 0xef2fa506), TOBN(0xed4ca476, 0x5b81eec6), - TOBN(0x262ede36, 0x10bbb8b5), TOBN(0x0737ce83, 0x0641ada3), - TOBN(0x4c94288a, 0xe9831ccc), TOBN(0x487fc1ce, 0x8065e635), - TOBN(0xb13d7ab3, 0xb8bb3659), TOBN(0xdea5df3e, 0x855e4120), - TOBN(0xb9a18573, 0x85eb0244), TOBN(0x1a1b8ea3, 0xa7cfe0a3), - TOBN(0x3b837119, 0x67b0867c), TOBN(0x8d5e0d08, 0x9d364520), - TOBN(0x52dccc1e, 0xd930f0e3), TOBN(0xefbbcec7, 0xbf20bbaf), - TOBN(0x99cffcab, 0x0263ad10), TOBN(0xd8199e6d, 0xfcd18f8a), - TOBN(0x64e2773f, 0xe9f10617), TOBN(0x0079e8e1, 0x08704848), - TOBN(0x1169989f, 0x8a342283), TOBN(0x8097799c, 0xa83012e6), - TOBN(0xece966cb, 0x8a6a9001), TOBN(0x93b3afef, 0x072ac7fc), - TOBN(0xe6893a2a, 0x2db3d5ba), TOBN(0x263dc462, 0x89bf4fdc), - TOBN(0x8852dfc9, 0xe0396673), TOBN(0x7ac70895, 0x3af362b6), - TOBN(0xbb9cce4d, 0x5c2f342b), TOBN(0xbf80907a, 0xb52d7aae), - TOBN(0x97f3d3cd, 0x2161bcd0), TOBN(0xb25b0834, 0x0962744d), - TOBN(0xc5b18ea5, 0x6c3a1dda), TOBN(0xfe4ec7eb, 0x06c92317), - TOBN(0xb787b890, 0xad1c4afe), TOBN(0xdccd9a92, 0x0ede801a), - TOBN(0x9ac6ddda, 0xdb58da1f), TOBN(0x22bbc12f, 0xb8cae6ee), - TOBN(0xc6f8bced, 0x815c4a43), TOBN(0x8105a92c, 0xf96480c7), - TOBN(0x0dc3dbf3, 0x7a859d51), TOBN(0xe3ec7ce6, 0x3041196b), - TOBN(0xd9f64b25, 0x0d1067c9), TOBN(0xf2321321, 0x3d1f8dd8), - TOBN(0x8b5c619c, 0x76497ee8), TOBN(0x5d2b0ac6, 0xc717370e), - TOBN(0x98204cb6, 0x4fcf68e1), TOBN(0x0bdec211, 0x62bc6792), - TOBN(0x6973ccef, 0xa63b1011), TOBN(0xf9e3fa97, 0xe0de1ac5), - TOBN(0x5efb693e, 0x3d0e0c8b), TOBN(0x037248e9, 0xd2d4fcb4)}, - {TOBN(0x80802dc9, 0x1ec34f9e), TOBN(0xd8772d35, 0x33810603), - TOBN(0x3f06d66c, 0x530cb4f3), TOBN(0x7be5ed0d, 0xc475c129), - TOBN(0xcb9e3c19, 0x31e82b10), TOBN(0xc63d2857, 0xc9ff6b4c), - TOBN(0xb92118c6, 0x92a1b45e), TOBN(0x0aec4414, 0x7285bbca), - TOBN(0xfc189ae7, 0x1e29a3ef), TOBN(0xcbe906f0, 0x4c93302e), - TOBN(0xd0107914, 0xceaae10e), TOBN(0xb7a23f34, 0xb68e19f8), - TOBN(0xe9d875c2, 0xefd2119d), TOBN(0x03198c6e, 0xfcadc9c8), - TOBN(0x65591bf6, 0x4da17113), TOBN(0x3cf0bbf8, 0x3d443038), - TOBN(0xae485bb7, 0x2b724759), TOBN(0x945353e1, 0xb2d4c63a), - TOBN(0x82159d07, 0xde7d6f2c), TOBN(0x389caef3, 0x4ec5b109), - TOBN(0x4a8ebb53, 0xdb65ef14), TOBN(0x2dc2cb7e, 0xdd99de43), - TOBN(0x816fa3ed, 0x83f2405f), TOBN(0x73429bb9, 0xc14208a3), - TOBN(0xb618d590, 0xb01e6e27), TOBN(0x047e2ccd, 0xe180b2dc), - TOBN(0xd1b299b5, 0x04aea4a9), TOBN(0x412c9e1e, 0x9fa403a4), - TOBN(0x88d28a36, 0x79407552), TOBN(0x49c50136, 0xf332b8e3), - TOBN(0x3a1b6fcc, 0xe668de19), TOBN(0x178851bc, 0x75122b97), - TOBN(0xb1e13752, 0xfb85fa4c), TOBN(0xd61257ce, 0x383c8ce9), - TOBN(0xd43da670, 0xd2f74dae), TOBN(0xa35aa23f, 0xbf846bbb), - TOBN(0x5e74235d, 0x4421fc83), TOBN(0xf6df8ee0, 0xc363473b), - TOBN(0x34d7f52a, 0x3c4aa158), TOBN(0x50d05aab, 0x9bc6d22e), - TOBN(0x8c56e735, 0xa64785f4), TOBN(0xbc56637b, 0x5f29cd07), - TOBN(0x53b2bb80, 0x3ee35067), TOBN(0x50235a0f, 0xdc919270), - TOBN(0x191ab6d8, 0xf2c4aa65), TOBN(0xc3475831, 0x8396023b), - TOBN(0x80400ba5, 0xf0f805ba), TOBN(0x8881065b, 0x5ec0f80f), - TOBN(0xc370e522, 0xcc1b5e83), TOBN(0xde2d4ad1, 0x860b8bfb), - TOBN(0xad364df0, 0x67b256df), TOBN(0x8f12502e, 0xe0138997), - TOBN(0x503fa0dc, 0x7783920a), TOBN(0xe80014ad, 0xc0bc866a), - TOBN(0x3f89b744, 0xd3064ba6), TOBN(0x03511dcd, 0xcba5dba5), - TOBN(0x197dd46d, 0x95a7b1a2), TOBN(0x9c4e7ad6, 0x3c6341fb), - TOBN(0x426eca29, 0x484c2ece), TOBN(0x9211e489, 0xde7f4f8a), - TOBN(0x14997f6e, 0xc78ef1f4), TOBN(0x2b2c0910, 0x06574586), - TOBN(0x17286a6e, 0x1c3eede8), TOBN(0x25f92e47, 0x0f60e018), - TOBN(0x805c5646, 0x31890a36), TOBN(0x703ef600, 0x57feea5b), - TOBN(0x389f747c, 0xaf3c3030), TOBN(0xe0e5daeb, 0x54dd3739), - TOBN(0xfe24a4c3, 0xc9c9f155), TOBN(0x7e4bf176, 0xb5393962), - TOBN(0x37183de2, 0xaf20bf29), TOBN(0x4a1bd7b5, 0xf95a8c3b), - TOBN(0xa83b9699, 0x46191d3d), TOBN(0x281fc8dd, 0x7b87f257), - TOBN(0xb18e2c13, 0x54107588), TOBN(0x6372def7, 0x9b2bafe8), - TOBN(0xdaf4bb48, 0x0d8972ca), TOBN(0x3f2dd4b7, 0x56167a3f), - TOBN(0x1eace32d, 0x84310cf4), TOBN(0xe3bcefaf, 0xe42700aa), - TOBN(0x5fe5691e, 0xd785e73d), TOBN(0xa5db5ab6, 0x2ea60467), - TOBN(0x02e23d41, 0xdfc6514a), TOBN(0x35e8048e, 0xe03c3665), - TOBN(0x3f8b118f, 0x1adaa0f8), TOBN(0x28ec3b45, 0x84ce1a5a), - TOBN(0xe8cacc6e, 0x2c6646b8), TOBN(0x1343d185, 0xdbd0e40f), - TOBN(0xe5d7f844, 0xcaaa358c), TOBN(0x1a1db7e4, 0x9924182a), - TOBN(0xd64cd42d, 0x9c875d9a), TOBN(0xb37b515f, 0x042eeec8), - TOBN(0x4d4dd409, 0x7b165fbe), TOBN(0xfc322ed9, 0xe206eff3), - TOBN(0x7dee4102, 0x59b7e17e), TOBN(0x55a481c0, 0x8236ca00), - TOBN(0x8c885312, 0xc23fc975), TOBN(0x15715806, 0x05d6297b), - TOBN(0xa078868e, 0xf78edd39), TOBN(0x956b31e0, 0x03c45e52), - TOBN(0x470275d5, 0xff7b33a6), TOBN(0xc8d5dc3a, 0x0c7e673f), - TOBN(0x419227b4, 0x7e2f2598), TOBN(0x8b37b634, 0x4c14a975), - TOBN(0xd0667ed6, 0x8b11888c), TOBN(0x5e0e8c3e, 0x803e25dc), - TOBN(0x34e5d0dc, 0xb987a24a), TOBN(0x9f40ac3b, 0xae920323), - TOBN(0x5463de95, 0x34e0f63a), TOBN(0xa128bf92, 0x6b6328f9), - TOBN(0x491ccd7c, 0xda64f1b7), TOBN(0x7ef1ec27, 0xc47bde35), - TOBN(0xa857240f, 0xa36a2737), TOBN(0x35dc1366, 0x63621bc1), - TOBN(0x7a3a6453, 0xd4fb6897), TOBN(0x80f1a439, 0xc929319d), - TOBN(0xfc18274b, 0xf8cb0ba0), TOBN(0xb0b53766, 0x8078c5eb), - TOBN(0xfb0d4924, 0x1e01d0ef), TOBN(0x50d7c67d, 0x372ab09c), - TOBN(0xb4e370af, 0x3aeac968), TOBN(0xe4f7fee9, 0xc4b63266), - TOBN(0xb4acd4c2, 0xe3ac5664), TOBN(0xf8910bd2, 0xceb38cbf), - TOBN(0x1c3ae50c, 0xc9c0726e), TOBN(0x15309569, 0xd97b40bf), - TOBN(0x70884b7f, 0xfd5a5a1b), TOBN(0x3890896a, 0xef8314cd), - TOBN(0x58e1515c, 0xa5618c93), TOBN(0xe665432b, 0x77d942d1), - TOBN(0xb32181bf, 0xb6f767a8), TOBN(0x753794e8, 0x3a604110), - TOBN(0x09afeb7c, 0xe8c0dbcc), TOBN(0x31e02613, 0x598673a3), - TOBN(0x5d98e557, 0x7d46db00), TOBN(0xfc21fb8c, 0x9d985b28), - TOBN(0xc9040116, 0xb0843e0b), TOBN(0x53b1b3a8, 0x69b04531), - TOBN(0xdd1649f0, 0x85d7d830), TOBN(0xbb3bcc87, 0xcb7427e8), - TOBN(0x77261100, 0xc93dce83), TOBN(0x7e79da61, 0xa1922a2a), - TOBN(0x587a2b02, 0xf3149ce8), TOBN(0x147e1384, 0xde92ec83), - TOBN(0x484c83d3, 0xaf077f30), TOBN(0xea78f844, 0x0658b53a), - TOBN(0x912076c2, 0x027aec53), TOBN(0xf34714e3, 0x93c8177d), - TOBN(0x37ef5d15, 0xc2376c84), TOBN(0x8315b659, 0x3d1aa783), - TOBN(0x3a75c484, 0xef852a90), TOBN(0x0ba0c58a, 0x16086bd4), - TOBN(0x29688d7a, 0x529a6d48), TOBN(0x9c7f250d, 0xc2f19203), - TOBN(0x123042fb, 0x682e2df9), TOBN(0x2b7587e7, 0xad8121bc), - TOBN(0x30fc0233, 0xe0182a65), TOBN(0xb82ecf87, 0xe3e1128a), - TOBN(0x71682861, 0x93fb098f), TOBN(0x043e21ae, 0x85e9e6a7), - TOBN(0xab5b49d6, 0x66c834ea), TOBN(0x3be43e18, 0x47414287), - TOBN(0xf40fb859, 0x219a2a47), TOBN(0x0e6559e9, 0xcc58df3c), - TOBN(0xfe1dfe8e, 0x0c6615b4), TOBN(0x14abc8fd, 0x56459d70), - TOBN(0x7be0fa8e, 0x05de0386), TOBN(0x8e63ef68, 0xe9035c7c), - TOBN(0x116401b4, 0x53b31e91), TOBN(0x0cba7ad4, 0x4436b4d8), - TOBN(0x9151f9a0, 0x107afd66), TOBN(0xafaca8d0, 0x1f0ee4c4), - TOBN(0x75fe5c1d, 0x9ee9761c), TOBN(0x3497a16b, 0xf0c0588f), - TOBN(0x3ee2bebd, 0x0304804c), TOBN(0xa8fb9a60, 0xc2c990b9), - TOBN(0xd14d32fe, 0x39251114), TOBN(0x36bf25bc, 0xcac73366), - TOBN(0xc9562c66, 0xdba7495c), TOBN(0x324d301b, 0x46ad348b), - TOBN(0x9f46620c, 0xd670407e), TOBN(0x0ea8d4f1, 0xe3733a01), - TOBN(0xd396d532, 0xb0c324e0), TOBN(0x5b211a0e, 0x03c317cd), - TOBN(0x090d7d20, 0x5ffe7b37), TOBN(0x3b7f3efb, 0x1747d2da), - TOBN(0xa2cb525f, 0xb54fc519), TOBN(0x6e220932, 0xf66a971e), - TOBN(0xddc160df, 0xb486d440), TOBN(0x7fcfec46, 0x3fe13465), - TOBN(0x83da7e4e, 0x76e4c151), TOBN(0xd6fa48a1, 0xd8d302b5), - TOBN(0xc6304f26, 0x5872cd88), TOBN(0x806c1d3c, 0x278b90a1), - TOBN(0x3553e725, 0xcaf0bc1c), TOBN(0xff59e603, 0xbb9d8d5c), - TOBN(0xa4550f32, 0x7a0b85dd), TOBN(0xdec5720a, 0x93ecc217), - TOBN(0x0b88b741, 0x69d62213), TOBN(0x7212f245, 0x5b365955), - TOBN(0x20764111, 0xb5cae787), TOBN(0x13cb7f58, 0x1dfd3124), - TOBN(0x2dca77da, 0x1175aefb), TOBN(0xeb75466b, 0xffaae775), - TOBN(0x74d76f3b, 0xdb6cff32), TOBN(0x7440f37a, 0x61fcda9a), - TOBN(0x1bb3ac92, 0xb525028b), TOBN(0x20fbf8f7, 0xa1975f29), - TOBN(0x982692e1, 0xdf83097f), TOBN(0x28738f6c, 0x554b0800), - TOBN(0xdc703717, 0xa2ce2f2f), TOBN(0x7913b93c, 0x40814194), - TOBN(0x04924593, 0x1fe89636), TOBN(0x7b98443f, 0xf78834a6), - TOBN(0x11c6ab01, 0x5114a5a1), TOBN(0x60deb383, 0xffba5f4c), - TOBN(0x4caa54c6, 0x01a982e6), TOBN(0x1dd35e11, 0x3491cd26), - TOBN(0x973c315f, 0x7cbd6b05), TOBN(0xcab00775, 0x52494724), - TOBN(0x04659b1f, 0x6565e15a), TOBN(0xbf30f529, 0x8c8fb026), - TOBN(0xfc21641b, 0xa8a0de37), TOBN(0xe9c7a366, 0xfa5e5114), - TOBN(0xdb849ca5, 0x52f03ad8), TOBN(0xc7e8dbe9, 0x024e35c0), - TOBN(0xa1a2bbac, 0xcfc3c789), TOBN(0xbf733e7d, 0x9c26f262), - TOBN(0x882ffbf5, 0xb8444823), TOBN(0xb7224e88, 0x6bf8483b), - TOBN(0x53023b8b, 0x65bef640), TOBN(0xaabfec91, 0xd4d5f8cd), - TOBN(0xa40e1510, 0x079ea1bd), TOBN(0x1ad9addc, 0xd05d5d26), - TOBN(0xdb3f2eab, 0x13e68d4f), TOBN(0x1cff1ae2, 0x640f803f), - TOBN(0xe0e7b749, 0xd4cee117), TOBN(0x8e9f275b, 0x4036d909), - TOBN(0xce34e31d, 0x8f4d4c38), TOBN(0x22b37f69, 0xd75130fc), - TOBN(0x83e0f1fd, 0xb4014604), TOBN(0xa8ce9919, 0x89415078), - TOBN(0x82375b75, 0x41792efe), TOBN(0x4f59bf5c, 0x97d4515b), - TOBN(0xac4f324f, 0x923a277d), TOBN(0xd9bc9b7d, 0x650f3406), - TOBN(0xc6fa87d1, 0x8a39bc51), TOBN(0x82588530, 0x5ccc108f), - TOBN(0x5ced3c9f, 0x82e4c634), TOBN(0x8efb8314, 0x3a4464f8), - TOBN(0xe706381b, 0x7a1dca25), TOBN(0x6cd15a3c, 0x5a2a412b), - TOBN(0x9347a8fd, 0xbfcd8fb5), TOBN(0x31db2eef, 0x6e54cd22), - TOBN(0xc4aeb11e, 0xf8d8932f), TOBN(0x11e7c1ed, 0x344411af), - TOBN(0x2653050c, 0xdc9a151e), TOBN(0x9edbfc08, 0x3bb0a859), - TOBN(0x926c81c7, 0xfd5691e7), TOBN(0x9c1b2342, 0x6f39019a), - TOBN(0x64a81c8b, 0x7f8474b9), TOBN(0x90657c07, 0x01761819), - TOBN(0x390b3331, 0x55e0375a), TOBN(0xc676c626, 0xb6ebc47d), - TOBN(0x51623247, 0xb7d6dee8), TOBN(0x0948d927, 0x79659313), - TOBN(0x99700161, 0xe9ab35ed), TOBN(0x06cc32b4, 0x8ddde408), - TOBN(0x6f2fd664, 0x061ef338), TOBN(0x1606fa02, 0xc202e9ed), - TOBN(0x55388bc1, 0x929ba99b), TOBN(0xc4428c5e, 0x1e81df69), - TOBN(0xce2028ae, 0xf91b0b2a), TOBN(0xce870a23, 0xf03dfd3f), - TOBN(0x66ec2c87, 0x0affe8ed), TOBN(0xb205fb46, 0x284d0c00), - TOBN(0xbf5dffe7, 0x44cefa48), TOBN(0xb6fc37a8, 0xa19876d7), - TOBN(0xbecfa84c, 0x08b72863), TOBN(0xd7205ff5, 0x2576374f), - TOBN(0x80330d32, 0x8887de41), TOBN(0x5de0df0c, 0x869ea534), - TOBN(0x13f42753, 0x3c56ea17), TOBN(0xeb1f6069, 0x452b1a78), - TOBN(0x50474396, 0xe30ea15c), TOBN(0x575816a1, 0xc1494125), - TOBN(0xbe1ce55b, 0xfe6bb38f), TOBN(0xb901a948, 0x96ae30f7), - TOBN(0xe5af0f08, 0xd8fc3548), TOBN(0x5010b5d0, 0xd73bfd08), - TOBN(0x993d2880, 0x53fe655a), TOBN(0x99f2630b, 0x1c1309fd), - TOBN(0xd8677baf, 0xb4e3b76f), TOBN(0x14e51ddc, 0xb840784b), - TOBN(0x326c750c, 0xbf0092ce), TOBN(0xc83d306b, 0xf528320f), - TOBN(0xc4456715, 0x77d4715c), TOBN(0xd30019f9, 0x6b703235), - TOBN(0x207ccb2e, 0xd669e986), TOBN(0x57c824af, 0xf6dbfc28), - TOBN(0xf0eb532f, 0xd8f92a23), TOBN(0x4a557fd4, 0x9bb98fd2), - TOBN(0xa57acea7, 0xc1e6199a), TOBN(0x0c663820, 0x8b94b1ed), - TOBN(0x9b42be8f, 0xf83a9266), TOBN(0xc7741c97, 0x0101bd45), - TOBN(0x95770c11, 0x07bd9ceb), TOBN(0x1f50250a, 0x8b2e0744), - TOBN(0xf762eec8, 0x1477b654), TOBN(0xc65b900e, 0x15efe59a), - TOBN(0x88c96148, 0x9546a897), TOBN(0x7e8025b3, 0xc30b4d7c), - TOBN(0xae4065ef, 0x12045cf9), TOBN(0x6fcb2caf, 0x9ccce8bd), - TOBN(0x1fa0ba4e, 0xf2cf6525), TOBN(0xf683125d, 0xcb72c312), - TOBN(0xa01da4ea, 0xe312410e), TOBN(0x67e28677, 0x6cd8e830), - TOBN(0xabd95752, 0x98fb3f07), TOBN(0x05f11e11, 0xeef649a5), - TOBN(0xba47faef, 0x9d3472c2), TOBN(0x3adff697, 0xc77d1345), - TOBN(0x4761fa04, 0xdd15afee), TOBN(0x64f1f61a, 0xb9e69462), - TOBN(0xfa691fab, 0x9bfb9093), TOBN(0x3df8ae8f, 0xa1133dfe), - TOBN(0xcd5f8967, 0x58cc710d), TOBN(0xfbb88d50, 0x16c7fe79), - TOBN(0x8e011b4c, 0xe88c50d1), TOBN(0x7532e807, 0xa8771c4f), - TOBN(0x64c78a48, 0xe2278ee4), TOBN(0x0b283e83, 0x3845072a), - TOBN(0x98a6f291, 0x49e69274), TOBN(0xb96e9668, 0x1868b21c), - TOBN(0x38f0adc2, 0xb1a8908e), TOBN(0x90afcff7, 0x1feb829d), - TOBN(0x9915a383, 0x210b0856), TOBN(0xa5a80602, 0xdef04889), - TOBN(0x800e9af9, 0x7c64d509), TOBN(0x81382d0b, 0xb8996f6f), - TOBN(0x490eba53, 0x81927e27), TOBN(0x46c63b32, 0x4af50182), - TOBN(0x784c5fd9, 0xd3ad62ce), TOBN(0xe4fa1870, 0xf8ae8736), - TOBN(0x4ec9d0bc, 0xd7466b25), TOBN(0x84ddbe1a, 0xdb235c65), - TOBN(0x5e2645ee, 0x163c1688), TOBN(0x570bd00e, 0x00eba747), - TOBN(0xfa51b629, 0x128bfa0f), TOBN(0x92fce1bd, 0x6c1d3b68), - TOBN(0x3e7361dc, 0xb66778b1), TOBN(0x9c7d249d, 0x5561d2bb), - TOBN(0xa40b28bf, 0x0bbc6229), TOBN(0x1c83c05e, 0xdfd91497), - TOBN(0x5f9f5154, 0xf083df05), TOBN(0xbac38b3c, 0xeee66c9d), - TOBN(0xf71db7e3, 0xec0dfcfd), TOBN(0xf2ecda8e, 0x8b0a8416), - TOBN(0x52fddd86, 0x7812aa66), TOBN(0x2896ef10, 0x4e6f4272), - TOBN(0xff27186a, 0x0fe9a745), TOBN(0x08249fcd, 0x49ca70db), - TOBN(0x7425a2e6, 0x441cac49), TOBN(0xf4a0885a, 0xece5ff57), - TOBN(0x6e2cb731, 0x7d7ead58), TOBN(0xf96cf7d6, 0x1898d104), - TOBN(0xafe67c9d, 0x4f2c9a89), TOBN(0x89895a50, 0x1c7bf5bc), - TOBN(0xdc7cb8e5, 0x573cecfa), TOBN(0x66497eae, 0xd15f03e6), - TOBN(0x6bc0de69, 0x3f084420), TOBN(0x323b9b36, 0xacd532b0), - TOBN(0xcfed390a, 0x0115a3c1), TOBN(0x9414c40b, 0x2d65ca0e), - TOBN(0x641406bd, 0x2f530c78), TOBN(0x29369a44, 0x833438f2), - TOBN(0x996884f5, 0x903fa271), TOBN(0xe6da0fd2, 0xb9da921e), - TOBN(0xa6f2f269, 0x5db01e54), TOBN(0x1ee3e9bd, 0x6876214e), - TOBN(0xa26e181c, 0xe27a9497), TOBN(0x36d254e4, 0x8e215e04), - TOBN(0x42f32a6c, 0x252cabca), TOBN(0x99481487, 0x80b57614), - TOBN(0x4c4dfe69, 0x40d9cae1), TOBN(0x05869580, 0x11a10f09), - TOBN(0xca287b57, 0x3491b64b), TOBN(0x77862d5d, 0x3fd4a53b), - TOBN(0xbf94856e, 0x50349126), TOBN(0x2be30bd1, 0x71c5268f), - TOBN(0x10393f19, 0xcbb650a6), TOBN(0x639531fe, 0x778cf9fd), - TOBN(0x02556a11, 0xb2935359), TOBN(0xda38aa96, 0xaf8c126e), - TOBN(0x47dbe6c2, 0x0960167f), TOBN(0x37bbabb6, 0x501901cd), - TOBN(0xb6e979e0, 0x2c947778), TOBN(0xd69a5175, 0x7a1a1dc6), - TOBN(0xc3ed5095, 0x9d9faf0c), TOBN(0x4dd9c096, 0x1d5fa5f0), - TOBN(0xa0c4304d, 0x64f16ea8), TOBN(0x8b1cac16, 0x7e718623), - TOBN(0x0b576546, 0x7c67f03e), TOBN(0x559cf5ad, 0xcbd88c01), - TOBN(0x074877bb, 0x0e2af19a), TOBN(0x1f717ec1, 0xa1228c92), - TOBN(0x70bcb800, 0x326e8920), TOBN(0xec6e2c5c, 0x4f312804), - TOBN(0x426aea7d, 0x3fca4752), TOBN(0xf12c0949, 0x2211f62a), - TOBN(0x24beecd8, 0x7be7b6b5), TOBN(0xb77eaf4c, 0x36d7a27d), - TOBN(0x154c2781, 0xfda78fd3), TOBN(0x848a83b0, 0x264eeabe), - TOBN(0x81287ef0, 0x4ffe2bc4), TOBN(0x7b6d88c6, 0xb6b6fc2a), - TOBN(0x805fb947, 0xce417d99), TOBN(0x4b93dcc3, 0x8b916cc4), - TOBN(0x72e65bb3, 0x21273323), TOBN(0xbcc1badd, 0x6ea9886e), - TOBN(0x0e223011, 0x4bc5ee85), TOBN(0xa561be74, 0xc18ee1e4), - TOBN(0x762fd2d4, 0xa6bcf1f1), TOBN(0x50e6a5a4, 0x95231489), - TOBN(0xca96001f, 0xa00b500b), TOBN(0x5c098cfc, 0x5d7dcdf5), - TOBN(0xa64e2d2e, 0x8c446a85), TOBN(0xbae9bcf1, 0x971f3c62), - TOBN(0x4ec22683, 0x8435a2c5), TOBN(0x8ceaed6c, 0x4bad4643), - TOBN(0xe9f8fb47, 0xccccf4e3), TOBN(0xbd4f3fa4, 0x1ce3b21e), - TOBN(0xd79fb110, 0xa3db3292), TOBN(0xe28a37da, 0xb536c66a), - TOBN(0x279ce87b, 0x8e49e6a9), TOBN(0x70ccfe8d, 0xfdcec8e3), - TOBN(0x2193e4e0, 0x3ba464b2), TOBN(0x0f39d60e, 0xaca9a398), - TOBN(0x7d7932af, 0xf82c12ab), TOBN(0xd8ff50ed, 0x91e7e0f7), - TOBN(0xea961058, 0xfa28a7e0), TOBN(0xc726cf25, 0x0bf5ec74), - TOBN(0xe74d55c8, 0xdb229666), TOBN(0x0bd9abbf, 0xa57f5799), - TOBN(0x7479ef07, 0x4dfc47b3), TOBN(0xd9c65fc3, 0x0c52f91d), - TOBN(0x8e0283fe, 0x36a8bde2), TOBN(0xa32a8b5e, 0x7d4b7280), - TOBN(0x6a677c61, 0x12e83233), TOBN(0x0fbb3512, 0xdcc9bf28), - TOBN(0x562e8ea5, 0x0d780f61), TOBN(0x0db8b22b, 0x1dc4e89c), - TOBN(0x0a6fd1fb, 0x89be0144), TOBN(0x8c77d246, 0xca57113b), - TOBN(0x4639075d, 0xff09c91c), TOBN(0x5b47b17f, 0x5060824c), - TOBN(0x58aea2b0, 0x16287b52), TOBN(0xa1343520, 0xd0cd8eb0), - TOBN(0x6148b4d0, 0xc5d58573), TOBN(0xdd2b6170, 0x291c68ae), - TOBN(0xa61b3929, 0x1da3b3b7), TOBN(0x5f946d79, 0x08c4ac10), - TOBN(0x4105d4a5, 0x7217d583), TOBN(0x5061da3d, 0x25e6de5e), - TOBN(0x3113940d, 0xec1b4991), TOBN(0xf12195e1, 0x36f485ae), - TOBN(0xa7507fb2, 0x731a2ee0), TOBN(0x95057a8e, 0x6e9e196e), - TOBN(0xa3c2c911, 0x2e130136), TOBN(0x97dfbb36, 0x33c60d15), - TOBN(0xcaf3c581, 0xb300ee2b), TOBN(0x77f25d90, 0xf4bac8b8), - TOBN(0xdb1c4f98, 0x6d840cd6), TOBN(0x471d62c0, 0xe634288c), - TOBN(0x8ec2f85e, 0xcec8a161), TOBN(0x41f37cbc, 0xfa6f4ae2), - TOBN(0x6793a20f, 0x4b709985), TOBN(0x7a7bd33b, 0xefa8985b), - TOBN(0x2c6a3fbd, 0x938e6446), TOBN(0x19042619, 0x2a8d47c1), - TOBN(0x16848667, 0xcc36975f), TOBN(0x02acf168, 0x9d5f1dfb), - TOBN(0x62d41ad4, 0x613baa94), TOBN(0xb56fbb92, 0x9f684670), - TOBN(0xce610d0d, 0xe9e40569), TOBN(0x7b99c65f, 0x35489fef), - TOBN(0x0c88ad1b, 0x3df18b97), TOBN(0x81b7d9be, 0x5d0e9edb), - TOBN(0xd85218c0, 0xc716cc0a), TOBN(0xf4b5ff90, 0x85691c49), - TOBN(0xa4fd666b, 0xce356ac6), TOBN(0x17c72895, 0x4b327a7a), - TOBN(0xf93d5085, 0xda6be7de), TOBN(0xff71530e, 0x3301d34e), - TOBN(0x4cd96442, 0xd8f448e8), TOBN(0x9283d331, 0x2ed18ffa), - TOBN(0x4d33dd99, 0x2a849870), TOBN(0xa716964b, 0x41576335), - TOBN(0xff5e3a9b, 0x179be0e5), TOBN(0x5b9d6b1b, 0x83b13632), - TOBN(0x3b8bd7d4, 0xa52f313b), TOBN(0xc9dd95a0, 0x637a4660), - TOBN(0x30035962, 0x0b3e218f), TOBN(0xce1481a3, 0xc7b28a3c), - TOBN(0xab41b43a, 0x43228d83), TOBN(0x24ae1c30, 0x4ad63f99), - TOBN(0x8e525f1a, 0x46a51229), TOBN(0x14af860f, 0xcd26d2b4), - TOBN(0xd6baef61, 0x3f714aa1), TOBN(0xf51865ad, 0xeb78795e), - TOBN(0xd3e21fce, 0xe6a9d694), TOBN(0x82ceb1dd, 0x8a37b527)}}; diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/ec/ecp_nistz384.h temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/ec/ecp_nistz384.h --- temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/ec/ecp_nistz384.h 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/ec/ecp_nistz384.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,34 +0,0 @@ -/* Copyright (c) 2014, Intel Corporation. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY - * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION - * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ - -#ifndef OPENSSL_HEADER_EC_ECP_NISTZ384_H -#define OPENSSL_HEADER_EC_ECP_NISTZ384_H - -#include "../../limbs/limbs.h" - -#define P384_LIMBS (384u / LIMB_BITS) - -typedef struct { - Limb X[P384_LIMBS]; - Limb Y[P384_LIMBS]; - Limb Z[P384_LIMBS]; -} P384_POINT; - -typedef struct { - Limb X[P384_LIMBS]; - Limb Y[P384_LIMBS]; -} P384_POINT_AFFINE; - - -#endif // OPENSSL_HEADER_EC_ECP_NISTZ384_H diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/ec/ecp_nistz384.inl temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/ec/ecp_nistz384.inl --- temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/ec/ecp_nistz384.inl 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/ec/ecp_nistz384.inl 1970-01-01 00:00:00.000000000 +0000 @@ -1,257 +0,0 @@ -/* Copyright (c) 2014, Intel Corporation. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY - * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION - * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ - -/* Developers and authors: - * Shay Gueron (1, 2), and Vlad Krasnov (1) - * (1) Intel Corporation, Israel Development Center - * (2) University of Haifa - * Reference: - * Shay Gueron and Vlad Krasnov - * "Fast Prime Field Elliptic Curve Cryptography with 256 Bit Primes" - * http://eprint.iacr.org/2013/816 */ - -#include "ecp_nistz.h" - -#if defined(__GNUC__) -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wsign-conversion" -#endif - -/* Point double: r = 2*a */ -void GFp_nistz384_point_double(P384_POINT *r, const P384_POINT *a) { - BN_ULONG S[P384_LIMBS]; - BN_ULONG M[P384_LIMBS]; - BN_ULONG Zsqr[P384_LIMBS]; - BN_ULONG tmp0[P384_LIMBS]; - - const BN_ULONG *in_x = a->X; - const BN_ULONG *in_y = a->Y; - const BN_ULONG *in_z = a->Z; - - BN_ULONG *res_x = r->X; - BN_ULONG *res_y = r->Y; - BN_ULONG *res_z = r->Z; - - elem_mul_by_2(S, in_y); - - elem_sqr_mont(Zsqr, in_z); - - elem_sqr_mont(S, S); - - elem_mul_mont(res_z, in_z, in_y); - elem_mul_by_2(res_z, res_z); - - elem_add(M, in_x, Zsqr); - elem_sub(Zsqr, in_x, Zsqr); - - elem_sqr_mont(res_y, S); - elem_div_by_2(res_y, res_y); - - elem_mul_mont(M, M, Zsqr); - elem_mul_by_3(M, M); - - elem_mul_mont(S, S, in_x); - elem_mul_by_2(tmp0, S); - - elem_sqr_mont(res_x, M); - - elem_sub(res_x, res_x, tmp0); - elem_sub(S, S, res_x); - - elem_mul_mont(S, S, M); - elem_sub(res_y, S, res_y); -} - -/* Point addition: r = a+b */ -void GFp_nistz384_point_add(P384_POINT *r, const P384_POINT *a, - const P384_POINT *b) { - BN_ULONG U2[P384_LIMBS], S2[P384_LIMBS]; - BN_ULONG U1[P384_LIMBS], S1[P384_LIMBS]; - BN_ULONG Z1sqr[P384_LIMBS]; - BN_ULONG Z2sqr[P384_LIMBS]; - BN_ULONG H[P384_LIMBS], R[P384_LIMBS]; - BN_ULONG Hsqr[P384_LIMBS]; - BN_ULONG Rsqr[P384_LIMBS]; - BN_ULONG Hcub[P384_LIMBS]; - - BN_ULONG res_x[P384_LIMBS]; - BN_ULONG res_y[P384_LIMBS]; - BN_ULONG res_z[P384_LIMBS]; - - const BN_ULONG *in1_x = a->X; - const BN_ULONG *in1_y = a->Y; - const BN_ULONG *in1_z = a->Z; - - const BN_ULONG *in2_x = b->X; - const BN_ULONG *in2_y = b->Y; - const BN_ULONG *in2_z = b->Z; - - BN_ULONG in1infty = is_zero(a->Z); - BN_ULONG in2infty = is_zero(b->Z); - - elem_sqr_mont(Z2sqr, in2_z); /* Z2^2 */ - elem_sqr_mont(Z1sqr, in1_z); /* Z1^2 */ - - elem_mul_mont(S1, Z2sqr, in2_z); /* S1 = Z2^3 */ - elem_mul_mont(S2, Z1sqr, in1_z); /* S2 = Z1^3 */ - - elem_mul_mont(S1, S1, in1_y); /* S1 = Y1*Z2^3 */ - elem_mul_mont(S2, S2, in2_y); /* S2 = Y2*Z1^3 */ - elem_sub(R, S2, S1); /* R = S2 - S1 */ - - elem_mul_mont(U1, in1_x, Z2sqr); /* U1 = X1*Z2^2 */ - elem_mul_mont(U2, in2_x, Z1sqr); /* U2 = X2*Z1^2 */ - elem_sub(H, U2, U1); /* H = U2 - U1 */ - - BN_ULONG is_exceptional = is_equal(U1, U2) & ~in1infty & ~in2infty; - if (is_exceptional) { - if (is_equal(S1, S2)) { - GFp_nistz384_point_double(r, a); - } else { - limbs_zero(r->X, P384_LIMBS); - limbs_zero(r->Y, P384_LIMBS); - limbs_zero(r->Z, P384_LIMBS); - } - return; - } - - elem_sqr_mont(Rsqr, R); /* R^2 */ - elem_mul_mont(res_z, H, in1_z); /* Z3 = H*Z1*Z2 */ - elem_sqr_mont(Hsqr, H); /* H^2 */ - elem_mul_mont(res_z, res_z, in2_z); /* Z3 = H*Z1*Z2 */ - elem_mul_mont(Hcub, Hsqr, H); /* H^3 */ - - elem_mul_mont(U2, U1, Hsqr); /* U1*H^2 */ - elem_mul_by_2(Hsqr, U2); /* 2*U1*H^2 */ - - elem_sub(res_x, Rsqr, Hsqr); - elem_sub(res_x, res_x, Hcub); - - elem_sub(res_y, U2, res_x); - - elem_mul_mont(S2, S1, Hcub); - elem_mul_mont(res_y, R, res_y); - elem_sub(res_y, res_y, S2); - - copy_conditional(res_x, in2_x, in1infty); - copy_conditional(res_y, in2_y, in1infty); - copy_conditional(res_z, in2_z, in1infty); - - copy_conditional(res_x, in1_x, in2infty); - copy_conditional(res_y, in1_y, in2infty); - copy_conditional(res_z, in1_z, in2infty); - - limbs_copy(r->X, res_x, P384_LIMBS); - limbs_copy(r->Y, res_y, P384_LIMBS); - limbs_copy(r->Z, res_z, P384_LIMBS); -} - -static void add_precomputed_w5(P384_POINT *r, crypto_word wvalue, - const P384_POINT table[16]) { - crypto_word recoded_is_negative; - crypto_word recoded; - booth_recode(&recoded_is_negative, &recoded, wvalue, 5); - - alignas(64) P384_POINT h; - gfp_p384_point_select_w5(&h, table, recoded); - - alignas(64) BN_ULONG tmp[P384_LIMBS]; - GFp_p384_elem_neg(tmp, h.Y); - copy_conditional(h.Y, tmp, recoded_is_negative); - - GFp_nistz384_point_add(r, r, &h); -} - -/* r = p * p_scalar */ -void GFp_nistz384_point_mul(P384_POINT *r, const BN_ULONG p_scalar[P384_LIMBS], - const BN_ULONG p_x[P384_LIMBS], - const BN_ULONG p_y[P384_LIMBS]) { - static const size_t kWindowSize = 5; - static const crypto_word kMask = (1 << (5 /* kWindowSize */ + 1)) - 1; - - uint8_t p_str[(P384_LIMBS * sizeof(Limb)) + 1]; - gfp_little_endian_bytes_from_scalar(p_str, sizeof(p_str) / sizeof(p_str[0]), - p_scalar, P384_LIMBS); - - /* A |P384_POINT| is (3 * 48) = 144 bytes, and the 64-byte alignment should - * add no more than 63 bytes of overhead. Thus, |table| should require - * ~2367 ((144 * 16) + 63) bytes of stack space. */ - alignas(64) P384_POINT table[16]; - - /* table[0] is implicitly (0,0,0) (the point at infinity), therefore it is - * not stored. All other values are actually stored with an offset of -1 in - * table. */ - P384_POINT *row = table; - - limbs_copy(row[1 - 1].X, p_x, P384_LIMBS); - limbs_copy(row[1 - 1].Y, p_y, P384_LIMBS); - limbs_copy(row[1 - 1].Z, ONE, P384_LIMBS); - - GFp_nistz384_point_double(&row[2 - 1], &row[1 - 1]); - GFp_nistz384_point_add(&row[3 - 1], &row[2 - 1], &row[1 - 1]); - GFp_nistz384_point_double(&row[4 - 1], &row[2 - 1]); - GFp_nistz384_point_double(&row[6 - 1], &row[3 - 1]); - GFp_nistz384_point_double(&row[8 - 1], &row[4 - 1]); - GFp_nistz384_point_double(&row[12 - 1], &row[6 - 1]); - GFp_nistz384_point_add(&row[5 - 1], &row[4 - 1], &row[1 - 1]); - GFp_nistz384_point_add(&row[7 - 1], &row[6 - 1], &row[1 - 1]); - GFp_nistz384_point_add(&row[9 - 1], &row[8 - 1], &row[1 - 1]); - GFp_nistz384_point_add(&row[13 - 1], &row[12 - 1], &row[1 - 1]); - GFp_nistz384_point_double(&row[14 - 1], &row[7 - 1]); - GFp_nistz384_point_double(&row[10 - 1], &row[5 - 1]); - GFp_nistz384_point_add(&row[15 - 1], &row[14 - 1], &row[1 - 1]); - GFp_nistz384_point_add(&row[11 - 1], &row[10 - 1], &row[1 - 1]); - GFp_nistz384_point_double(&row[16 - 1], &row[8 - 1]); - - static const size_t START_INDEX = 384 - 4; - size_t index = START_INDEX; - - BN_ULONG recoded_is_negative; - crypto_word recoded; - - crypto_word wvalue = p_str[(index - 1) / 8]; - wvalue = (wvalue >> ((index - 1) % 8)) & kMask; - - booth_recode(&recoded_is_negative, &recoded, wvalue, 5); - dev_assert_secret(!recoded_is_negative); - - gfp_p384_point_select_w5(r, table, recoded); - - while (index >= kWindowSize) { - if (index != START_INDEX) { - size_t off = (index - 1) / 8; - - wvalue = p_str[off] | p_str[off + 1] << 8; - wvalue = (wvalue >> ((index - 1) % 8)) & kMask; - add_precomputed_w5(r, wvalue, table); - } - - index -= kWindowSize; - - GFp_nistz384_point_double(r, r); - GFp_nistz384_point_double(r, r); - GFp_nistz384_point_double(r, r); - GFp_nistz384_point_double(r, r); - GFp_nistz384_point_double(r, r); - } - - /* Final window */ - wvalue = p_str[0]; - wvalue = (wvalue << 1) & kMask; - add_precomputed_w5(r, wvalue, table); -} - -#if defined(__GNUC__) -#pragma GCC diagnostic pop -#endif diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/ec/ecp_nistz.c temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/ec/ecp_nistz.c --- temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/ec/ecp_nistz.c 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/ec/ecp_nistz.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,52 +0,0 @@ -/* Copyright (c) 2014, Intel Corporation. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY - * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION - * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ - -#include "ecp_nistz.h" - -#if defined(__GNUC__) -#pragma GCC diagnostic ignored "-Wconversion" -#endif - -/* Fills |str| with the bytewise little-endian encoding of |scalar|, where - * |scalar| has |num_limbs| limbs. |str| is padded with zeros at the end up - * to |str_len| bytes. Actually, |str_len| must be exactly one byte more than - * needed to encode |num_limbs| losslessly, so that there is an extra byte at - * the end. The extra byte is useful because the caller will be breaking |str| - * up into windows of a number of bits (5 or 7) that isn't divisible by 8, and - * so it is useful for it to be able to read an extra zero byte. */ -void gfp_little_endian_bytes_from_scalar(uint8_t str[], size_t str_len, - const Limb scalar[], - size_t num_limbs) { - debug_assert_nonsecret(str_len == (num_limbs * sizeof(Limb)) + 1); - - size_t i; - for (i = 0; i < num_limbs * sizeof(Limb); i += sizeof(Limb)) { - Limb d = scalar[i / sizeof(Limb)]; - - str[i + 0] = d & 0xff; - str[i + 1] = (d >> 8) & 0xff; - str[i + 2] = (d >> 16) & 0xff; - str[i + 3] = (d >>= 24) & 0xff; - if (sizeof(Limb) == 8) { - d >>= 8; - str[i + 4] = d & 0xff; - str[i + 5] = (d >> 8) & 0xff; - str[i + 6] = (d >> 16) & 0xff; - str[i + 7] = (d >> 24) & 0xff; - } - } - for (; i < str_len; i++) { - str[i] = 0; - } -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/ec/ecp_nistz.h temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/ec/ecp_nistz.h --- temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/ec/ecp_nistz.h 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/ec/ecp_nistz.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,274 +0,0 @@ -/* Copyright (c) 2015, Google Inc. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY - * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION - * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ - -#ifndef OPENSSL_HEADER_EC_ECP_NISTZ_H -#define OPENSSL_HEADER_EC_ECP_NISTZ_H - -#include - -#include "../../limbs/limbs.h" - -#if defined(__GNUC__) -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wconversion" -#pragma GCC diagnostic ignored "-Wsign-conversion" -#endif - -// This function looks at `w + 1` scalar bits (`w` current, 1 adjacent less -// significant bit), and recodes them into a signed digit for use in fast point -// multiplication: the use of signed rather than unsigned digits means that -// fewer points need to be precomputed, given that point inversion is easy (a -// precomputed point dP makes -dP available as well). -// -// BACKGROUND: -// -// Signed digits for multiplication were introduced by Booth ("A signed binary -// multiplication technique", Quart. Journ. Mech. and Applied Math., vol. IV, -// pt. 2 (1951), pp. 236-240), in that case for multiplication of integers. -// Booth's original encoding did not generally improve the density of nonzero -// digits over the binary representation, and was merely meant to simplify the -// handling of signed factors given in two's complement; but it has since been -// shown to be the basis of various signed-digit representations that do have -// further advantages, including the wNAF, using the following general -// approach: -// -// (1) Given a binary representation -// -// b_k ... b_2 b_1 b_0, -// -// of a nonnegative integer (b_k in {0, 1}), rewrite it in digits 0, 1, -1 -// by using bit-wise subtraction as follows: -// -// b_k b_(k-1) ... b_2 b_1 b_0 -// - b_k ... b_3 b_2 b_1 b_0 -// ----------------------------------------- -// s_(k+1) s_k ... s_3 s_2 s_1 s_0 -// -// A left-shift followed by subtraction of the original value yields a new -// representation of the same value, using signed bits s_i = b_(i-1) - b_i. -// This representation from Booth's paper has since appeared in the -// literature under a variety of different names including "reversed binary -// form", "alternating greedy expansion", "mutual opposite form", and -// "sign-alternating {+-1}-representation". -// -// An interesting property is that among the nonzero bits, values 1 and -1 -// strictly alternate. -// -// (2) Various window schemes can be applied to the Booth representation of -// integers: for example, right-to-left sliding windows yield the wNAF -// (a signed-digit encoding independently discovered by various researchers -// in the 1990s), and left-to-right sliding windows yield a left-to-right -// equivalent of the wNAF (independently discovered by various researchers -// around 2004). -// -// To prevent leaking information through side channels in point multiplication, -// we need to recode the given integer into a regular pattern: sliding windows -// as in wNAFs won't do, we need their fixed-window equivalent -- which is a few -// decades older: we'll be using the so-called "modified Booth encoding" due to -// MacSorley ("High-speed arithmetic in binary computers", Proc. IRE, vol. 49 -// (1961), pp. 67-91), in a radix-2**w setting. That is, we always combine `w` -// signed bits into a signed digit, e.g. (for `w == 5`): -// -// s_(5j + 4) s_(5j + 3) s_(5j + 2) s_(5j + 1) s_(5j) -// -// The sign-alternating property implies that the resulting digit values are -// integers from `-2**(w-1)` to `2**(w-1)`, e.g. -16 to 16 for `w == 5`. -// -// Of course, we don't actually need to compute the signed digits s_i as an -// intermediate step (that's just a nice way to see how this scheme relates -// to the wNAF): a direct computation obtains the recoded digit from the -// six bits b_(5j + 4) ... b_(5j - 1). -// -// This function takes those `w` bits as an integer (e.g. 0 .. 63), writing the -// recoded digit to *sign (0 for positive, 1 for negative) and *digit (absolute -// value, in the range 0 .. 2**(w-1). Note that this integer essentially provides -// the input bits "shifted to the left" by one position: for example, the input -// to compute the least significant recoded digit, given that there's no bit -// b_-1, has to be b_4 b_3 b_2 b_1 b_0 0. -// -// DOUBLING CASE: -// -// Point addition formulas for short Weierstrass curves are often incomplete. -// Edge cases such as P + P or P + ∞ must be handled separately. This -// complicates constant-time requirements. P + ∞ cannot be avoided (any window -// may be zero) and is handled with constant-time selects. P + P (where P is not -// ∞) usually is not. Instead, windowing strategies are chosen to avoid this -// case. Whether this happens depends on the group order. -// -// Let w be the window width (in this function, w = 5). The non-trivial doubling -// case in single-point scalar multiplication may occur if and only if the -// 2^(w-1) bit of the group order is zero. -// -// Note the above only holds if the scalar is fully reduced and the group order -// is a prime that is much larger than 2^w. It also only holds when windows -// are applied from most significant to least significant, doubling between each -// window. It does not apply to more complex table strategies such as -// |EC_GFp_nistz256_method|. -// -// PROOF: -// -// Let n be the group order. Let l be the number of bits needed to represent n. -// Assume there exists some 0 <= k < n such that signed w-bit windowed -// multiplication hits the doubling case. -// -// Windowed multiplication consists of iterating over groups of s_i (defined -// above based on k's binary representation) from most to least significant. At -// iteration i (for i = ..., 3w, 2w, w, 0, starting from the most significant -// window), we: -// -// 1. Double the accumulator A, w times. Let A_i be the value of A at this -// point. -// -// 2. Set A to T_i + A_i, where T_i is a precomputed multiple of P -// corresponding to the window s_(i+w-1) ... s_i. -// -// Let j be the index such that A_j = T_j ≠ ∞. Looking at A_i and T_i as -// multiples of P, define a_i and t_i to be scalar coefficients of A_i and T_i. -// Thus a_j = t_j ≠ 0 (mod n). Note a_i and t_i may not be reduced mod n. t_i is -// the value of the w signed bits s_(i+w-1) ... s_i. a_i is computed as a_i = -// 2^w * (a_(i+w) + t_(i+w)). -// -// t_i is bounded by -2^(w-1) <= t_i <= 2^(w-1). Additionally, we may write it -// in terms of unsigned bits b_i. t_i consists of signed bits s_(i+w-1) ... s_i. -// This is computed as: -// -// b_(i+w-2) b_(i+w-3) ... b_i b_(i-1) -// - b_(i+w-1) b_(i+w-2) ... b_(i+1) b_i -// -------------------------------------------- -// t_i = s_(i+w-1) s_(i+w-2) ... s_(i+1) s_i -// -// Observe that b_(i+w-2) through b_i occur in both terms. Let x be the integer -// represented by that bit string, i.e. 2^(w-2)*b_(i+w-2) + ... + b_i. -// -// t_i = (2*x + b_(i-1)) - (2^(w-1)*b_(i+w-1) + x) -// = x - 2^(w-1)*b_(i+w-1) + b_(i-1) -// -// Or, using C notation for bit operations: -// -// t_i = (k>>i) & ((1<<(w-1)) - 1) - (k>>i) & (1<<(w-1)) + (k>>(i-1)) & 1 -// -// Note b_(i-1) is added in left-shifted by one (or doubled) from its place. -// This is compensated by t_(i-w)'s subtraction term. Thus, a_i may be computed -// by adding b_l b_(l-1) ... b_(i+1) b_i and an extra copy of b_(i-1). In C -// notation, this is: -// -// a_i = (k>>(i+w)) << w + ((k>>(i+w-1)) & 1) << w -// -// Observe that, while t_i may be positive or negative, a_i is bounded by -// 0 <= a_i < n + 2^w. Additionally, a_i can only be zero if b_(i+w-1) and up -// are all zero. (Note this implies a non-trivial P + (-P) is unreachable for -// all groups. That would imply the subsequent a_i is zero, which means all -// terms thus far were zero.) -// -// Returning to our doubling position, we have a_j = t_j (mod n). We now -// determine the value of a_j - t_j, which must be divisible by n. Our bounds on -// a_j and t_j imply a_j - t_j is 0 or n. If it is 0, a_j = t_j. However, 2^w -// divides a_j and -2^(w-1) <= t_j <= 2^(w-1), so this can only happen if -// a_j = t_j = 0, which is a trivial doubling. Therefore, a_j - t_j = n. -// -// Now we determine j. Suppose j > 0. w divides j, so j >= w. Then, -// -// n = a_j - t_j = (k>>(j+w)) << w + ((k>>(j+w-1)) & 1) << w - t_j -// <= k/2^j + 2^w - t_j -// < n/2^w + 2^w + 2^(w-1) -// -// n is much larger than 2^w, so this is impossible. Thus, j = 0: only the final -// addition may hit the doubling case. -// -// Finally, we consider bit patterns for n and k. Divide k into k_H + k_M + k_L -// such that k_H is the contribution from b_(l-1) .. b_w, k_M is the -// contribution from b_(w-1), and k_L is the contribution from b_(w-2) ... b_0. -// That is: -// -// - 2^w divides k_H -// - k_M is 0 or 2^(w-1) -// - 0 <= k_L < 2^(w-1) -// -// Divide n into n_H + n_M + n_L similarly. We thus have: -// -// t_0 = (k>>0) & ((1<<(w-1)) - 1) - (k>>0) & (1<<(w-1)) + (k>>(0-1)) & 1 -// = k & ((1<<(w-1)) - 1) - k & (1<<(w-1)) -// = k_L - k_M -// -// a_0 = (k>>(0+w)) << w + ((k>>(0+w-1)) & 1) << w -// = (k>>w) << w + ((k>>(w-1)) & 1) << w -// = k_H + 2*k_M -// -// n = a_0 - t_0 -// n_H + n_M + n_L = (k_H + 2*k_M) - (k_L - k_M) -// = k_H + 3*k_M - k_L -// -// k_H - k_L < k and k < n, so k_H - k_L ≠ n. Therefore k_M is not 0 and must be -// 2^(w-1). Now we consider k_H and n_H. We know k_H <= n_H. Suppose k_H = n_H. -// Then, -// -// n_M + n_L = 3*(2^(w-1)) - k_L -// > 3*(2^(w-1)) - 2^(w-1) -// = 2^w -// -// Contradiction (n_M + n_L is the bottom w bits of n). Thus k_H < n_H. Suppose -// k_H < n_H - 2*2^w. Then, -// -// n_H + n_M + n_L = k_H + 3*(2^(w-1)) - k_L -// < n_H - 2*2^w + 3*(2^(w-1)) - k_L -// n_M + n_L < -2^(w-1) - k_L -// -// Contradiction. Thus, k_H = n_H - 2^w. (Note 2^w divides n_H and k_H.) Thus, -// -// n_H + n_M + n_L = k_H + 3*(2^(w-1)) - k_L -// = n_H - 2^w + 3*(2^(w-1)) - k_L -// n_M + n_L = 2^(w-1) - k_L -// <= 2^(w-1) -// -// Equality would mean 2^(w-1) divides n, which is impossible if n is prime. -// Thus n_M + n_L < 2^(w-1), so n_M is zero, proving our condition. -// -// This proof constructs k, so, to show the converse, let k_H = n_H - 2^w, -// k_M = 2^(w-1), k_L = 2^(w-1) - n_L. This will result in a non-trivial point -// doubling in the final addition and is the only such scalar. -// -// COMMON CURVES: -// -// The group orders for common curves end in the following bit patterns: -// -// P-521: ...00001001; w = 4 is okay -// P-384: ...01110011; w = 2, 5, 6, 7 are okay -// P-256: ...01010001; w = 5, 7 are okay -// P-224: ...00111101; w = 3, 4, 5, 6 are okay -static inline void booth_recode(crypto_word *is_negative, crypto_word *digit, - crypto_word in, crypto_word w) { - debug_assert_nonsecret(w >= 2); - debug_assert_nonsecret(w <= 7); - - // Set all bits of `s` to MSB(in), similar to |constant_time_msb_s|, - // but 'in' seen as (`w+1`)-bit value. - crypto_word s = ~((in >> w) - 1); - crypto_word d; - d = ((crypto_word)1u << (w + 1)) - in - 1; - d = (d & s) | (in & ~s); - d = (d >> 1) + (d & 1); - - *is_negative = constant_time_is_nonzero_w(s & 1); - *digit = d; -} - -#if defined(__GNUC__) -#pragma GCC diagnostic pop -#endif - -void gfp_little_endian_bytes_from_scalar(uint8_t str[], size_t str_len, - const Limb scalar[], - size_t num_limbs); - -#endif // OPENSSL_HEADER_EC_ECP_NISTZ_H diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/ec/gfp_p256.c temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/ec/gfp_p256.c --- temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/ec/gfp_p256.c 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/ec/gfp_p256.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,108 +0,0 @@ -/* Copyright 2016 Brian Smith. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY - * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION - * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ - -#include "ecp_nistz256.h" -#include "../../limbs/limbs.h" - -#include "../../internal.h" -#include "../bn/internal.h" -#include "../../limbs/limbs.inl" - -typedef Limb Elem[P256_LIMBS]; -typedef Limb ScalarMont[P256_LIMBS]; -typedef Limb Scalar[P256_LIMBS]; - -void GFp_p256_scalar_sqr_rep_mont(ScalarMont r, const ScalarMont a, Limb rep); - -#if defined(OPENSSL_ARM) || defined(OPENSSL_X86) -void GFp_nistz256_sqr_mont(Elem r, const Elem a) { - /* XXX: Inefficient. TODO: optimize with dedicated squaring routine. */ - GFp_nistz256_mul_mont(r, a, a); -} -#endif - -#if !defined(OPENSSL_X86_64) -void GFp_p256_scalar_mul_mont(ScalarMont r, const ScalarMont a, - const ScalarMont b) { - static const BN_ULONG N[] = { - TOBN(0xf3b9cac2, 0xfc632551), - TOBN(0xbce6faad, 0xa7179e84), - TOBN(0xffffffff, 0xffffffff), - TOBN(0xffffffff, 0x00000000), - }; - static const BN_ULONG N_N0[] = { - BN_MONT_CTX_N0(0xccd1c8aa, 0xee00bc4f) - }; - /* XXX: Inefficient. TODO: optimize with dedicated multiplication routine. */ - GFp_bn_mul_mont(r, a, b, N, N_N0, P256_LIMBS); -} -#endif - -#if defined(OPENSSL_X86_64) -void GFp_p256_scalar_sqr_mont(ScalarMont r, const ScalarMont a) { - GFp_p256_scalar_sqr_rep_mont(r, a, 1); -} -#else -void GFp_p256_scalar_sqr_mont(ScalarMont r, const ScalarMont a) { - GFp_p256_scalar_mul_mont(r, a, a); -} - -void GFp_p256_scalar_sqr_rep_mont(ScalarMont r, const ScalarMont a, Limb rep) { - dev_assert_secret(rep >= 1); - GFp_p256_scalar_sqr_mont(r, a); - for (Limb i = 1; i < rep; ++i) { - GFp_p256_scalar_sqr_mont(r, r); - } -} -#endif - - -#if !defined(OPENSSL_X86_64) - -/* TODO(perf): Optimize these. */ - -void GFp_nistz256_select_w5(P256_POINT *out, const P256_POINT table[16], - crypto_word index) { - dev_assert_secret(index >= 0); - - alignas(32) Elem x; limbs_zero(x, P256_LIMBS); - alignas(32) Elem y; limbs_zero(y, P256_LIMBS); - alignas(32) Elem z; limbs_zero(z, P256_LIMBS); - - // TODO: Rewrite in terms of |limbs_select|. - for (size_t i = 0; i < 16; ++i) { - crypto_word equal = constant_time_eq_w(index, (crypto_word)i + 1); - for (size_t j = 0; j < P256_LIMBS; ++j) { - x[j] = constant_time_select_w(equal, table[i].X[j], x[j]); - y[j] = constant_time_select_w(equal, table[i].Y[j], y[j]); - z[j] = constant_time_select_w(equal, table[i].Z[j], z[j]); - } - } - - limbs_copy(out->X, x, P256_LIMBS); - limbs_copy(out->Y, y, P256_LIMBS); - limbs_copy(out->Z, z, P256_LIMBS); -} - -#if defined GFp_USE_LARGE_TABLE -void GFp_nistz256_select_w7(P256_POINT_AFFINE *out, - const PRECOMP256_ROW table, crypto_word index) { - alignas(32) Limb xy[P256_LIMBS * 2]; - limbs_select(xy, table, P256_LIMBS * 2, 64, index - 1); - limbs_copy(out->X, &xy[0], P256_LIMBS); - limbs_copy(out->Y, &xy[P256_LIMBS], P256_LIMBS); -} -#endif - -#endif diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/ec/gfp_p384.c temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/ec/gfp_p384.c --- temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/ec/gfp_p384.c 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/ec/gfp_p384.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,242 +0,0 @@ -/* Copyright 2016 Brian Smith. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY - * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION - * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ - -#include "../../limbs/limbs.h" - -#include "ecp_nistz384.h" -#include "../bn/internal.h" -#include "../../internal.h" - -#include "../../limbs/limbs.inl" - - /* XXX: Here we assume that the conversion from |Carry| to |Limb| is - * constant-time, but we haven't verified that assumption. TODO: Fix it so - * we don't need to make that assumption. */ - - -typedef Limb Elem[P384_LIMBS]; -typedef Limb ScalarMont[P384_LIMBS]; -typedef Limb Scalar[P384_LIMBS]; - - -static const BN_ULONG Q[P384_LIMBS] = { - TOBN(0x00000000, 0xffffffff), - TOBN(0xffffffff, 0x00000000), - TOBN(0xffffffff, 0xfffffffe), - TOBN(0xffffffff, 0xffffffff), - TOBN(0xffffffff, 0xffffffff), - TOBN(0xffffffff, 0xffffffff), -}; - -static const BN_ULONG N[P384_LIMBS] = { - TOBN(0xecec196a, 0xccc52973), - TOBN(0x581a0db2, 0x48b0a77a), - TOBN(0xc7634d81, 0xf4372ddf), - TOBN(0xffffffff, 0xffffffff), - TOBN(0xffffffff, 0xffffffff), - TOBN(0xffffffff, 0xffffffff), -}; - - -static const BN_ULONG ONE[P384_LIMBS] = { - TOBN(0xffffffff, 1), TOBN(0, 0xffffffff), TOBN(0, 1), TOBN(0, 0), TOBN(0, 0), - TOBN(0, 0), -}; - - -/* XXX: MSVC for x86 warns when it fails to inline these functions it should - * probably inline. */ -#if defined(_MSC_VER) && !defined(__clang__) && defined(OPENSSL_X86) -#define INLINE_IF_POSSIBLE __forceinline -#else -#define INLINE_IF_POSSIBLE inline -#endif - -static inline Limb is_equal(const Elem a, const Elem b) { - return LIMBS_equal(a, b, P384_LIMBS); -} - -static inline Limb is_zero(const BN_ULONG a[P384_LIMBS]) { - return LIMBS_are_zero(a, P384_LIMBS); -} - -static inline void copy_conditional(Elem r, const Elem a, - const Limb condition) { - for (size_t i = 0; i < P384_LIMBS; ++i) { - r[i] = constant_time_select_w(condition, a[i], r[i]); - } -} - - -static inline void elem_add(Elem r, const Elem a, const Elem b) { - LIMBS_add_mod(r, a, b, Q, P384_LIMBS); -} - -static inline void elem_sub(Elem r, const Elem a, const Elem b) { - LIMBS_sub_mod(r, a, b, Q, P384_LIMBS); -} - -static void elem_div_by_2(Elem r, const Elem a) { - /* Consider the case where `a` is even. Then we can shift `a` right one bit - * and the result will still be valid because we didn't lose any bits and so - * `(a >> 1) * 2 == a (mod q)`, which is the invariant we must satisfy. - * - * The remainder of this comment is considering the case where `a` is odd. - * - * Since `a` is odd, it isn't the case that `(a >> 1) * 2 == a (mod q)` - * because the lowest bit is lost during the shift. For example, consider: - * - * ```python - * q = 2**384 - 2**128 - 2**96 + 2**32 - 1 - * a = 2**383 - * two_a = a * 2 % q - * assert two_a == 0x100000000ffffffffffffffff00000001 - * ``` - * - * Notice there how `(2 * a) % q` wrapped around to a smaller odd value. When - * we divide `two_a` by two (mod q), we need to get the value `2**383`, which - * we obviously can't get with just a right shift. - * - * `q` is odd, and `a` is odd, so `a + q` is even. We could calculate - * `(a + q) >> 1` and then reduce it mod `q`. However, then we would have to - * keep track of an extra most significant bit. We can avoid that by instead - * calculating `(a >> 1) + ((q + 1) >> 1)`. The `1` in `q + 1` is the least - * significant bit of `a`. `q + 1` is even, which means it can be shifted - * without losing any bits. Since `q` is odd, `q - 1` is even, so the largest - * odd field element is `q - 2`. Thus we know that `a <= q - 2`. We know - * `(q + 1) >> 1` is `(q + 1) / 2` since (`q + 1`) is even. The value of - * `a >> 1` is `(a - 1)/2` since the shift will drop the least significant - * bit of `a`, which is 1. Thus: - * - * sum = ((q + 1) >> 1) + (a >> 1) - * sum = (q + 1)/2 + (a >> 1) (substituting (q + 1)/2) - * <= (q + 1)/2 + (q - 2 - 1)/2 (substituting a <= q - 2) - * <= (q + 1)/2 + (q - 3)/2 (simplifying) - * <= (q + 1 + q - 3)/2 (factoring out the common divisor) - * <= (2q - 2)/2 (simplifying) - * <= q - 1 (simplifying) - * - * Thus, no reduction of the sum mod `q` is necessary. */ - - Limb is_odd = constant_time_is_nonzero_w(a[0] & 1); - - /* r = a >> 1. */ - Limb carry = a[P384_LIMBS - 1] & 1; - r[P384_LIMBS - 1] = a[P384_LIMBS - 1] >> 1; - for (size_t i = 1; i < P384_LIMBS; ++i) { - Limb new_carry = a[P384_LIMBS - i - 1]; - r[P384_LIMBS - i - 1] = - (a[P384_LIMBS - i - 1] >> 1) | (carry << (LIMB_BITS - 1)); - carry = new_carry; - } - - static const Elem Q_PLUS_1_SHR_1 = { - TOBN(0x00000000, 0x80000000), TOBN(0x7fffffff, 0x80000000), - TOBN(0xffffffff, 0xffffffff), TOBN(0xffffffff, 0xffffffff), - TOBN(0xffffffff, 0xffffffff), TOBN(0x7fffffff, 0xffffffff), - }; - - Elem adjusted; - BN_ULONG carry2 = limbs_add(adjusted, r, Q_PLUS_1_SHR_1, P384_LIMBS); - dev_assert_secret(carry2 == 0); - (void)carry2; - copy_conditional(r, adjusted, is_odd); -} - -static inline void elem_mul_mont(Elem r, const Elem a, const Elem b) { - static const BN_ULONG Q_N0[] = { - BN_MONT_CTX_N0(0x1, 0x1) - }; - /* XXX: Not (clearly) constant-time; inefficient.*/ - GFp_bn_mul_mont(r, a, b, Q, Q_N0, P384_LIMBS); -} - -static inline void elem_mul_by_2(Elem r, const Elem a) { - LIMBS_shl_mod(r, a, Q, P384_LIMBS); -} - -static INLINE_IF_POSSIBLE void elem_mul_by_3(Elem r, const Elem a) { - /* XXX: inefficient. TODO: Replace with an integrated shift + add. */ - Elem doubled; - elem_add(doubled, a, a); - elem_add(r, doubled, a); -} - -static inline void elem_sqr_mont(Elem r, const Elem a) { - /* XXX: Inefficient. TODO: Add a dedicated squaring routine. */ - elem_mul_mont(r, a, a); -} - -void GFp_p384_elem_add(Elem r, const Elem a, const Elem b) { - elem_add(r, a, b); -} - -void GFp_p384_elem_sub(Elem r, const Elem a, const Elem b) { - elem_sub(r, a, b); -} - -void GFp_p384_elem_div_by_2(Elem r, const Elem a) { - elem_div_by_2(r, a); -} - -void GFp_p384_elem_mul_mont(Elem r, const Elem a, const Elem b) { - elem_mul_mont(r, a, b); -} - -void GFp_p384_elem_neg(Elem r, const Elem a) { - Limb is_zero = LIMBS_are_zero(a, P384_LIMBS); - Carry borrow = limbs_sub(r, Q, a, P384_LIMBS); - dev_assert_secret(borrow == 0); - (void)borrow; - for (size_t i = 0; i < P384_LIMBS; ++i) { - r[i] = constant_time_select_w(is_zero, 0, r[i]); - } -} - - -void GFp_p384_scalar_mul_mont(ScalarMont r, const ScalarMont a, - const ScalarMont b) { - static const BN_ULONG N_N0[] = { - BN_MONT_CTX_N0(0x6ed46089, 0xe88fdc45) - }; - /* XXX: Inefficient. TODO: Add dedicated multiplication routine. */ - GFp_bn_mul_mont(r, a, b, N, N_N0, P384_LIMBS); -} - - -/* TODO(perf): Optimize this. */ - -static void gfp_p384_point_select_w5(P384_POINT *out, - const P384_POINT table[16], size_t index) { - Elem x; limbs_zero(x, P384_LIMBS); - Elem y; limbs_zero(y, P384_LIMBS); - Elem z; limbs_zero(z, P384_LIMBS); - - // TODO: Rewrite in terms of |limbs_select|. - for (size_t i = 0; i < 16; ++i) { - crypto_word equal = constant_time_eq_w(index, (crypto_word)i + 1); - for (size_t j = 0; j < P384_LIMBS; ++j) { - x[j] = constant_time_select_w(equal, table[i].X[j], x[j]); - y[j] = constant_time_select_w(equal, table[i].Y[j], y[j]); - z[j] = constant_time_select_w(equal, table[i].Z[j], z[j]); - } - } - - limbs_copy(out->X, x, P384_LIMBS); - limbs_copy(out->Y, y, P384_LIMBS); - limbs_copy(out->Z, z, P384_LIMBS); -} - - -#include "ecp_nistz384.inl" diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/ecdsa/ecdsa_verify_tests.txt temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/ecdsa/ecdsa_verify_tests.txt --- temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/ecdsa/ecdsa_verify_tests.txt 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/ecdsa/ecdsa_verify_tests.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,1362 +0,0 @@ -# Tests from NIST CAVP 186-4 ECDSA2VS Test Vectors, Signature Verification Test -# http://csrc.nist.gov/groups/STM/cavp/documents/dss/186-3ecdsatestvectors.zip -# -# NIST's files provide message and digest pairs. Since this is a low-level test, -# the digests have been extracted. P-521 test vectors were fixed to have the -# right number of leading zeros. - -Curve = P-256 -X = 1198b3c409a8b47edb1347e0982d533cb1813e5cb2a92c824b2881b3cd2f3f4a -Y = 0bdbac5fa02e41e775f8d602446d58ecb2209b5a3d79ae69eef399016e992e87 -Digest = 01ed0c41d650479c47057f61433d7e8b24492649 -R = 9206d435f148f88c15b2effbf3c506e41b2c620102022b801e371d0767b54bea -S = cbc4e1674ae1af69873946ccf6275946e59e0107278749b2d0010795833d80fa -Invalid = Y - -Curve = P-256 -X = f7c6280aecd6b936513b0ca84e63346333dc41437a15442e605d46bba93ae101 -Y = 3c834cecc16167b07866a9478f9f2d882de7ef937da447cd837e60cb5ed65d81 -Digest = f91b4dfddd5eb33a875d2e50d1e949211ac819da -R = f615af212ab030c4bbf9362d9815a1462312df4beb4358a7ce80d820355420bf -S = d12ed715ef65cfe6fe6bf348364088a0e7f70927bbafe4c12fc4cb65c0cc51bc -Invalid = Y - -Curve = P-256 -X = 0e7632dbc4db879e10d1d80f2789d9fa414c1fe77a6c1e56d6667af43e36e610 -Y = 6f0dd2a5840e5a6f6ff7e23f656f5c945b7a493fbb0cfd5b9b531bf04435b1ef -Digest = 3905696f8bad8205fa1445df0e91ade3dbc413e6 -R = 2b0b9ab4a575732a168f28494b66a855fc1a757fb1177864bf3e4f0a000c4a86 -S = 54901ce2f92f55ac112afa0f8b62bc00b44c8c10fe0c863675bfd305d6dc0cd8 -Invalid = Y - -Curve = P-256 -X = 1613f12bae8e98d09b4bba53f5229596a0d417d2c625f41bb15f923b3c1e4b57 -Y = 411319fa85227997a4cf3b1756161485124d2cedc38c9c30d82f42dc2647d545 -Digest = 580d31ce22700a20c2db81bcdac37330b491c86f -R = ed058d476a77be99c1b0fc8502abe545541b4c0ff3eed3f558133ae2f02042b0 -S = c571b4895712a4f64f7220b0694cab767379b09f1824fe7874acd127deb2371e -Invalid = Y - -Curve = P-256 -X = 88bb041dcb1733a676a7f4ae8d3e407d72d5396547f07db77078485c1d5db077 -Y = 72cf2b55e596cd140c58228f1b0a19c34fca26ffac043528a417c5abb6fca9c9 -Digest = 7900a02f768b0718a13525c33adace583de15c50 -R = 87208734deb125dca68f0d33f9d369cf1b79cf5a021391b9c6c1727d2efe663a -S = b984f722de18f1ce407104342948f03f2b55413a096c4b5fca1e032a2c814a4a -Invalid = Y - -Curve = P-256 -X = 811eb5180def7fb60d632f8cb2cba831b88cee778aa2a82ec3a5fc3d80ff7fb6 -Y = db88d65b0fc35d9ba1f1ced0400434979ae895d371d1441d7c7a441a9fb1709b -Digest = 17b7451ea903125ccb293ffaa9d1a4ca1141a2c5 -R = c329fa28dac0018276c5af0cd770e60be50bc14e2562d5556991971edc7d4916 -S = 2d111d13837a02fa279fe835a7dc59a521864d92b26649ca4e24b36ae93878e8 -Invalid = Y - -Curve = P-256 -X = 4a6f1e7f7268174d23993b8b58aa60c2a87b18de79b36a750ec86dd6f9e12227 -Y = 572df22bd6487a863a51ca544b8c5de2b47f801372a881cb996a97d9a98aa825 -Digest = 54e9a048559f370425e9c8e54a460ec91bcc930a -R = 4a800e24de65e5c57d4cab4dd1ef7b6c38a2f0aa5cfd3a571a4b552fb1993e69 -S = d9c89fb983640a7e65edf632cacd1de0823b7efbc798fc1f7bbfacdda7398955 -Invalid = Y - -Curve = P-256 -X = f3033d1e548d245b5e45ff1147db8cd44db8a1f2823c3c164125be88f9a982c2 -Y = 3c078f6cee2f50e95e8916aa9c4e93de3fdf9b045abac6f707cfcb22d065638e -Digest = e8d38e4c6a905a814b04c2841d898ed6da023c34 -R = d4255db86a416a5a688de4e238071ef16e5f2a20e31b9490c03dee9ae6164c34 -S = 4e0ac1e1a6725bf7c6bd207439b2d370c5f2dea1ff4decf1650ab84c7769efc0 - -Curve = P-256 -X = 0ea0a6bb6c70966fad1a2307479c12de2322795bdecb70e4b286bd6200ba9c1a -Y = c40eda3947021348db691ac4086fb6c06b587ce37c155bb0a7d912b93226de81 -Digest = 3b08bf1b67abc03c1cd69b0e24743b5c2d49e506 -R = f5509deff7bfda3f3759800fa4033af6a84466b114ecb48eac37eff48d2ae1b3 -S = 8c4b62dce2082f80caf220cdbb1d02567bbdfab40564b90ef31d86e3e10ce80a -Invalid = Y - -Curve = P-256 -X = e7a57e0f6ec0fa9c7c34978034cf82f039f8fd62804070ad943573fc8efa5775 -Y = 87b2cc85dfff2dae5620fbe3e6256bd728de28fc9dc1b5eb6b5d7bd5d29186ad -Digest = a8c5dc0344b1442dfdb5f8836251893d6c4ecbe9 -R = 97642038932fdddbe2021ec1af53ae6b9af00ef9c8b9f26aea582892e80e6285 -S = 9cb14918359338041cf795cf6781e4905837fa5ce3b3e50ffafb5f13c73b5bc8 -Invalid = Y - -Curve = P-256 -X = be7a651be0c87278569987cf62d7fa1dd1b3d6e1b868d8f4dfb56135a9960eec -Y = b7a62c588a987760b915edbd7f95506870c60f042471de1d8b2d4cd9d6563391 -Digest = 2f93ee45db133a14c26d418c2ffd3470ae63bf50 -R = aa889fb608b6939f6eeacf2f64c3b2e3a6061f2834058c7e724321720b737a63 -S = 6cd6d0ef2b93a760daa914e11b9b414bd4d72457405f00a62ab63f36d76efb73 -Invalid = Y - -Curve = P-256 -X = 76ddc46d8db8d7ce2ce837f60cdabcee92b7c7817ee41c8f066f1ae65f85c318 -Y = bea47191f1c584c87250370ce337a1de1583bcfc20ccc23b7a82e83f19adaa88 -Digest = 2136a5470ff9d45214a0b2c300042efea8ff7266 -R = 84a42efbf7ec04166ad144d19cd98c120aa2e79d483b5eea6fbdfa7f1222e07b -S = e41531205e691e65668f69f518abc7b60f32c373434872a043b7358462babf83 -Invalid = Y - -Curve = P-256 -X = 2f71b932f770ba9daf7c1dd47444ab6cb8881f71a1c597e719845b15cb84ca35 -Y = ab928625b40ec0738d0fc8dbc4df4a1f65d20bc0447b69cfa13bb20b95bb41d4 -Digest = ae6093bb37c1264ca3ead439e4f678721912c8c4 -R = 63fca172bbca6197cd2802a9cb61d74c2b47cf35f6d35203e67ffbaa838be775 -S = e70ec283cd212df6ba3723e26b697501f112d7cf64e4f45185dae76055e09f1e - -Curve = P-256 -X = ce775648b928db82ac5edb3b009d32959a73b86c45e96d4b8d5b6e640b7c2790 -Y = 52455caf08ee94d86f0984e9ec9268d74823f2102dd97fced59638055f6af18e -Digest = 60054807acb29e3091a023c42b9885c4945249e1 -R = 2a64b29146588f3153fee1029a0131ac0a8a25ba2ecc494f697c166c7c91fc08 -S = 7b429bc12a72ca3d76c119eea9f4098633cc31c87831e54d5d93afd6e8d20f4f -Invalid = Y - -Curve = P-256 -X = cd2f29a53f0ce57e0e4a542c3256e65ebbdc30415f4de771d5d706d3aeacc852 -Y = dbbf2c129f30d11fe77d7816a24187764eae3fb2ff70c1ec745e876e26f5232f -Digest = 5f50e35b134942295c16d003742fd6bce5bdab45 -R = 2454c5ee84e4f77b554acd368dd412389db8c78429590a092f24db2da43cb761 -S = 63e870ce2fa4085d4ff1e360f7a5c101a1f8b288abe71cca56887e613ad034b7 - -Curve = P-256 -X = 843f6d83d777aac75b758d58c670f417c8deea8d339a440bb626114318c34f29 -Y = 83e0c70008521c8509044b724420463e3478e3c91874d424be44413d1ce555f3 -Digest = cda2c7ad9abb2a858c4981550f78974c69e41cc31fa33509e3e83dc2 -R = d08e9a5db411019d826b20ac889227ed245503a6d839494db1e8d7995a6b245b -S = 8d46a204054125d0dc776ab1055302ec4eb0f20b90bca6d205f21d3cefd29097 - -Curve = P-256 -X = f08b56f73f7a0e098444f6f0a02ad81ce0b914a11cafa15893d1c84704e1c564 -Y = bbee9aeb91cdc2d1d1437b4168df73acfd64e8b02962b14c85e67187e1ef80a4 -Digest = 5453c2656550e9b3dc6c40a3f1362a73522396bc35d383dd6451128f -R = 71b3ec982725a007ac18a5cf60587e1fd1beb57685a1f9df3cddd9df25dcbc18 -S = 407e41217325f92f8a031cfcc4eb64c1a4b17b0a7459c254af754a7ea9eac997 -Invalid = Y - -Curve = P-256 -X = 0b688e761e1ddda2305e002809da65bf5916dfe1356a5b99b61f5576a9b90efa -Y = 90ec958e2e3a676e7bbf8e9394f72742875836125a317b0ae38374953f746a91 -Digest = 7289573d6bb7486e428e086bec9da9d7ff3c5f8bd0db2ec209fed6ae -R = ef89df3bbf079fb250f7e882c4f85c0023fc3804e862d9ef4d9530a15f1013f0 -S = 4ba985e900e6737b8e07eac638f7b38277ead4faee6d2076a2eee90fd2a6bf0f -Invalid = Y - -Curve = P-256 -X = 0b64480783e260e1e9caef37b4cc9c650d2d57e2c594b1106314843d8d7ab74e -Y = 29d373d8522deffe40055aef539f53f38937eb799b44f05a8d8c0b381f12907f -Digest = 497656e780360ec3b4bd1be97570615e4a32467982cd9330bc6aa224 -R = c5c26b0b21eef0f7a0f1cff38d0079d890376759369b01d8d8e959c1c785e203 -S = fecc400bf0deab99d87da168b9d0dd31d2dfa3435b0fe9d38b5fb8efd45195a4 -Invalid = Y - -Curve = P-256 -X = 7f78a8fd880c509940e2b83de67c9ab553ab91489bae75cdc1d5b523b06ab7f5 -Y = 7786aee7032c373cdfad7d9ddb6fa09a026f6da30fd477ab014d30a289d542a1 -Digest = 6d88da9e83ae9457e233d7977172c062dfbdd17d365694515251e031 -R = c93ada69db326f76b1362d610cb8bcc6e7ef1dc03d3d11367e153c0e39d5dc86 -S = d0c02c71b14ef7a4af4e23bd207ce98449f5d6e7e5b3ec8cbbca9549e97d379d - -Curve = P-256 -X = e58cdc207c56f62e0bb7c0b55b7f7236a6b308f8fc4de3e61cdb3bf20ad2f62c -Y = 6056c0ee827e85ba284838954d0c6cc096df03b4611b1e0f7f9002bac86856d4 -Digest = 3f9a97b8ea807edc88788df8956c296b1daaed8dd12d50c712344091 -R = 2df3906527ad322000285bccdd11dd09130d633cf43534f5802604639eb847e0 -S = adaaad19b7c66836ef0f4afeff8ac5e898cd2523246a74a1a291a3a1ff583322 - -Curve = P-256 -X = 70b4bba10b7bbc6d4175ada8d485f3685b13916d0c992301f47e45b629c63d0e -Y = 257a93be31b09ff4cd22e3375e30b5a79f3bf3c74c80dde93e5d65e88c07c1c4 -Digest = cc3a0d3a5d4f28dc9144a3cdb276eb92265f1157a8d8192cf628673c -R = 6e714a737b07a4784d26bde0399d8eee81998a13363785e2e4fb527e6a5c9e4e -S = 94c0220f0f3fa66ff24f96717f464b66ae3a7b0f228ab6a0b5775038da13768a -Invalid = Y - -Curve = P-256 -X = 8b11b48d2397355000a5289d816b9892ae64dffc842abec02a2fb2db2bb34310 -Y = fc1a42528a0473cfc2c2e184b8bc5055096350fe1549d24b526d6536681026e8 -Digest = f340e491fa935be8945b8caa485d0699c66331e0e17c7407da1b018e -R = 61a91dd1c80049e70dc4aea84bda0efc6ec9c7b9dd16ecbccf687244c51184ce -S = e381e7b32bab49578c7e7ce7784ce19263e4a7dab4b614df411d20eaebfc391c -Invalid = Y - -Curve = P-256 -X = 7bad1b3d8bad4355a44511d2eb50daeae793af99418ada118327359936aa0e1d -Y = e7eff40334b7a5455f6b0d0ecdcdc513702857bb5bbb73c910c86746092bcd7d -Digest = 9cf84546c046b370c372c167ebba39af6aadd60463626453787bb058 -R = fd961b60b21be32b47abafa77e22197dc99af6825dcca46e0e3b1991a90aa202 -S = a0477f97b94a1c26a3b2d186791d7fc9dfa8130bbae79c28fa11ec93a3aeac0b -Invalid = Y - -Curve = P-256 -X = 407d92c9b28723602bf09f20f0de002afdf90e22cb709a8d38e3c51e82cba96c -Y = 4530659432e1dd74237768133e1f9808e62d0fbe5d1d979d1571baf645dcb84c -Digest = 0cf5cd48c93f45472d254196bebea4bddb272a2adff23bab8c3adf99 -R = a7dc65293ee3deb0008ae3e2d7ef9e9a4ebb8bf7b10d165f80ab8bed58d6fdef -S = 3e8300a3ee603a8d8234fe265c628e705015bf1903eb74c943323050626f701f -Invalid = Y - -Curve = P-256 -X = 26aea3dd5c53f984dbdaf415c7f26e1e73048658a548eb3b59dd5f721899919a -Y = dff15f57bd9b08644d49cbb214403647195725cd4d4511bc8a48b0770466ae9f -Digest = 75d6b6b575d0a2c89528b83c94ef864c825b66253ab662b36bb0e716 -R = 726af92afe53e8125b0b9f3659745be401a37ae658b7b1aa88c3cb97e9de22c3 -S = 794484c5837a419efe11a4e4293341a6fa36d21230925a0e5e135887302acca9 -Invalid = Y - -Curve = P-256 -X = e73418677ce044b331a6d60773cbae199221699d31e1bec4b68b9bc0b87e4cd0 -Y = 37215db4e3d9161f3351b385a61ddb2fcf1cec469d1659e7574610ed27fe879f -Digest = dcbb92e3be3951d37e37852d508f78da29c8183c5dbe59d6549f78ed -R = ac469290a8f61a2a8c6adc7533dd5cfe804e2e7bf101cc74e5f624f301bccd23 -S = 4c328c3bc259316641fff44753743afebe89b8627f904df7245e42adcff2dc76 -Invalid = Y - -Curve = P-256 -X = b0892b19c508b3543a5ae864ba9194084c8f7ae544760759550cc160972e87ff -Y = 9208e9b0c86ad6bc833e53026f233db9a42298cdb35d906326008377520b7d98 -Digest = 90333facb4f5068c1d05d1a478fb46d02f367e271a000474c06a5fec -R = a62dd0d1518c6b9c60de766b952312a8d8c6eaa36a68196d2a30a46fb17dc067 -S = b9ded660e978129277f74c1d436003d1e6d556dc8eed9d505bbaf4c67cb13d21 -Invalid = Y - -Curve = P-256 -X = 8c5c41cb07d828a6a86be4533aef791d3a70a95cb285aa2956b21feeac2f8c49 -Y = 84101581cad7a48b7d0596df7ffed47085d22e8a4af685cddbeeb32ea69ae190 -Digest = 8bb52bd045c985167f673c07b613a3402f435a54c122877bc0c5fe34 -R = 9812449df0a51f7a2a8f78aa9a589ca9644dce285f1e69658daaea759fa5bd7e -S = beb4c27c748a7944e37afe861576f76b5a749a8ccbbd7dec00838ba250ddfe1a -Invalid = Y - -Curve = P-256 -X = 788d7e54ab03020e4954f41259052ee5af68361492b180da31fbbe68d868aa95 -Y = 982a3ababa6d351649e56da3faeb7160b9de74e22fe93a06ead1bd9a8dffdf7e -Digest = 9870ae25b0f0403eff1079b94669cf95fb250fb098eeb885ff08f117 -R = 3ddea06bf8aa4a1b0c68674a2c4796def0bfb52236f4efb3332204a41fd8ea89 -S = 871237039431a41aeefcdd08f67848b2b09067e3a1344c8ed9b372d1b1c754a6 -Invalid = Y - -Curve = P-256 -X = 87f8f2b218f49845f6f10eec3877136269f5c1a54736dbdf69f89940cad41555 -Y = e15f369036f49842fac7a86c8a2b0557609776814448b8f5e84aa9f4395205e9 -Digest = a82c31412f537135d1c418bd7136fb5fde9426e70c70e7c2fb11f02f30fdeae2 -R = d19ff48b324915576416097d2544f7cbdf8768b1454ad20e0baac50e211f23b0 -S = a3e81e59311cdfff2d4784949f7a2cb50ba6c3a91fa54710568e61aca3e847c6 -Invalid = Y - -Curve = P-256 -X = 5cf02a00d205bdfee2016f7421807fc38ae69e6b7ccd064ee689fc1a94a9f7d2 -Y = ec530ce3cc5c9d1af463f264d685afe2b4db4b5828d7e61b748930f3ce622a85 -Digest = 5984eab8854d0a9aa5f0c70f96deeb510e5f9ff8c51befcdc3c41bac53577f22 -R = dc23d130c6117fb5751201455e99f36f59aba1a6a21cf2d0e7481a97451d6693 -S = d6ce7708c18dbf35d4f8aa7240922dc6823f2e7058cbc1484fcad1599db5018c -Invalid = Y - -Curve = P-256 -X = 2ddfd145767883ffbb0ac003ab4a44346d08fa2570b3120dcce94562422244cb -Y = 5f70c7d11ac2b7a435ccfbbae02c3df1ea6b532cc0e9db74f93fffca7c6f9a64 -Digest = 44b02ad3088076f997220a68ff0b27a58ecfa528b604427097cce5ca956274c5 -R = 9913111cff6f20c5bf453a99cd2c2019a4e749a49724a08774d14e4c113edda8 -S = 9467cd4cd21ecb56b0cab0a9a453b43386845459127a952421f5c6382866c5cc -Invalid = Y - -Curve = P-256 -X = e424dc61d4bb3cb7ef4344a7f8957a0c5134e16f7a67c074f82e6e12f49abf3c -Y = 970eed7aa2bc48651545949de1dddaf0127e5965ac85d1243d6f60e7dfaee927 -Digest = d1b8ef21eb4182ee270638061063a3f3c16c114e33937f69fb232cc833965a94 -R = bf96b99aa49c705c910be33142017c642ff540c76349b9dab72f981fd9347f4f -S = 17c55095819089c2e03b9cd415abdf12444e323075d98f31920b9e0f57ec871c - -Curve = P-256 -X = e0fc6a6f50e1c57475673ee54e3a57f9a49f3328e743bf52f335e3eeaa3d2864 -Y = 7f59d689c91e463607d9194d99faf316e25432870816dde63f5d4b373f12f22a -Digest = b9336a8d1f3e8ede001d19f41320bc7672d772a3d2cb0e435fff3c27d6804a2c -R = 1d75830cd36f4c9aa181b2c4221e87f176b7f05b7c87824e82e396c88315c407 -S = cb2acb01dac96efc53a32d4a0d85d0c2e48955214783ecf50a4f0414a319c05a - -Curve = P-256 -X = a849bef575cac3c6920fbce675c3b787136209f855de19ffe2e8d29b31a5ad86 -Y = bf5fe4f7858f9b805bd8dcc05ad5e7fb889de2f822f3d8b41694e6c55c16b471 -Digest = 640c13e290147a48c83e0ea75a0f92723cda125ee21a747e34c8d1b36f16cf2d -R = 25acc3aa9d9e84c7abf08f73fa4195acc506491d6fc37cb9074528a7db87b9d6 -S = 9b21d5b5259ed3f2ef07dfec6cc90d3a37855d1ce122a85ba6a333f307d31537 -Invalid = Y - -Curve = P-256 -X = 3dfb6f40f2471b29b77fdccba72d37c21bba019efa40c1c8f91ec405d7dcc5df -Y = f22f953f1e395a52ead7f3ae3fc47451b438117b1e04d613bc8555b7d6e6d1bb -Digest = 8a3e7ad7b9b1b0cdc48e58d1e651fe6d710fef1420addeb61582bdd982d2b44c -R = 548886278e5ec26bed811dbb72db1e154b6f17be70deb1b210107decb1ec2a5a -S = e93bfebd2f14f3d827ca32b464be6e69187f5edbd52def4f96599c37d58eee75 -Invalid = Y - -Curve = P-256 -X = 69b7667056e1e11d6caf6e45643f8b21e7a4bebda463c7fdbc13bc98efbd0214 -Y = d3f9b12eb46c7c6fda0da3fc85bc1fd831557f9abc902a3be3cb3e8be7d1aa2f -Digest = d80e9933e86769731ec16ff31e6821531bcf07fcbad9e2ac16ec9e6cb343a870 -R = 288f7a1cd391842cce21f00e6f15471c04dc182fe4b14d92dc18910879799790 -S = 247b3c4e89a3bcadfea73c7bfd361def43715fa382b8c3edf4ae15d6e55e9979 -Invalid = Y - -Curve = P-256 -X = bf02cbcf6d8cc26e91766d8af0b164fc5968535e84c158eb3bc4e2d79c3cc682 -Y = 069ba6cb06b49d60812066afa16ecf7b51352f2c03bd93ec220822b1f3dfba03 -Digest = 7c1048884558961c7e178b3a9b22583fca0d17f355a9887e2f96d363d2a776a3 -R = f5acb06c59c2b4927fb852faa07faf4b1852bbb5d06840935e849c4d293d1bad -S = 049dab79c89cc02f1484c437f523e080a75f134917fda752f2d5ca397addfe5d -Invalid = Y - -Curve = P-256 -X = 224a4d65b958f6d6afb2904863efd2a734b31798884801fcab5a590f4d6da9de -Y = 178d51fddada62806f097aa615d33b8f2404e6b1479f5fd4859d595734d6d2b9 -Digest = 4c8d1afb724ad0c2ec458d866ac1dbb4497e273bbf05f88153102987e376fa75 -R = 87b93ee2fecfda54deb8dff8e426f3c72c8864991f8ec2b3205bb3b416de93d2 -S = 4044a24df85be0cc76f21a4430b75b8e77b932a87f51e4eccbc45c263ebf8f66 -Invalid = Y - -Curve = P-256 -X = 43691c7795a57ead8c5c68536fe934538d46f12889680a9cb6d055a066228369 -Y = f8790110b3c3b281aa1eae037d4f1234aff587d903d93ba3af225c27ddc9ccac -Digest = 8581034ec7d7a6b163d71820923f616b362748f2846042c9896d8e4bf7577960 -R = 8acd62e8c262fa50dd9840480969f4ef70f218ebf8ef9584f199031132c6b1ce -S = cfca7ed3d4347fb2a29e526b43c348ae1ce6c60d44f3191b6d8ea3a2d9c92154 -Invalid = Y - -Curve = P-256 -X = 9157dbfcf8cf385f5bb1568ad5c6e2a8652ba6dfc63bc1753edf5268cb7eb596 -Y = 972570f4313d47fc96f7c02d5594d77d46f91e949808825b3d31f029e8296405 -Digest = e5b30e0041a33281210644938d9aaa15ef2c1247b4178f7ca1ee935ce23daabc -R = dfaea6f297fa320b707866125c2a7d5d515b51a503bee817de9faa343cc48eeb -S = 8f780ad713f9c3e5a4f7fa4c519833dfefc6a7432389b1e4af463961f09764f2 -Invalid = Y - -Curve = P-256 -X = 072b10c081a4c1713a294f248aef850e297991aca47fa96a7470abe3b8acfdda -Y = 9581145cca04a0fb94cedce752c8f0370861916d2a94e7c647c5373ce6a4c8f5 -Digest = edd72dc0aa91649e09e2489c37ec27efab3b61953762c6b4532a9b1cd08a500d -R = 09f5483eccec80f9d104815a1be9cc1a8e5b12b6eb482a65c6907b7480cf4f19 -S = a4f90e560c5e4eb8696cb276e5165b6a9d486345dedfb094a76e8442d026378d -Invalid = Y - -Curve = P-256 -X = 09308ea5bfad6e5adf408634b3d5ce9240d35442f7fe116452aaec0d25be8c24 -Y = f40c93e023ef494b1c3079b2d10ef67f3170740495ce2cc57f8ee4b0618b8ee5 -Digest = 0d06ba42d256062e16b319a0f3099109518a765f26bac3b9f56930d965617726 -R = 5cc8aa7c35743ec0c23dde88dabd5e4fcd0192d2116f6926fef788cddb754e73 -S = 9c9c045ebaa1b828c32f82ace0d18daebf5e156eb7cbfdc1eff4399a8a900ae7 -Invalid = Y - -Curve = P-256 -X = 2d98ea01f754d34bbc3003df5050200abf445ec728556d7ed7d5c54c55552b6d -Y = 9b52672742d637a32add056dfd6d8792f2a33c2e69dafabea09b960bc61e230a -Digest = 41007876926a20f821d72d9c6f2c9dae6c03954123ea6e6939d7e6e669438891 -R = 06108e525f845d0155bf60193222b3219c98e3d49424c2fb2a0987f825c17959 -S = 62b5cdd591e5b507e560167ba8f6f7cda74673eb315680cb89ccbc4eec477dce - -Curve = P-256 -X = 40ded13dbbe72c629c38f07f7f95cf75a50e2a524897604c84fafde5e4cafb9f -Y = a17202e92d7d6a37c438779349fd79567d75a40ef22b7d09ca21ccf4aec9a66c -Digest = 5aa8e8a6f0622b841416e1a70d79a54641d2c699a075b6960fe5dcf96301da8ca6f15b0948d4ededac30a42e00d3b310 -R = be34730c31730b4e412e6c52c23edbd36583ace2102b39afa11d24b6848cb77f -S = 03655202d5fd8c9e3ae971b6f080640c406112fd95e7015874e9b6ee77752b10 -Invalid = Y - -Curve = P-256 -X = 1f80e19ffeb51dd74f1c397ac3dfd3415ab16ebd0847ed119e6c3b15a1a884b8 -Y = 9b395787371dbfb55d1347d7bed1c261d2908121fb78de1d1bf2d00666a62aed -Digest = 244656186c11c2e67be88099d55e60f4b68e61fba0b214aac3399dc559cfccc02f9884e85623426dbdc3243f2b5374f7 -R = 249ca2c3eb6e04ac57334c2f75dc5e658bbb485bf187100774f5099dd13ef707 -S = 97363a05202b602d13166346694e38135bbce025be94950e9233f4c8013bf5bf -Invalid = Y - -Curve = P-256 -X = ce4dcfa7384c83443ace0fb82c4ac1adfa100a9b2c7bf09f093f8b6d084e50c2 -Y = d98ae7b91abee648d0bfde192703741ac21daad7262af418b50e406d825eb0d6 -Digest = adaeadda3f0e941fba1d3e206a84e6d7530d800e0f215b3ddd82022f27c5be44fed27bc73084c6f7ca55555532be2e3b -R = 597e1e04d93a6b444ccc447a48651f17657ff43fb65fe94461d2bf816b01af40 -S = 359fe3817963548e676d6da34c2d0866aa42499237b682002889eaf8893814d2 - -Curve = P-256 -X = 1b677f535ac69d1acd4592c0d12fac13c9131e5a6f8ab4f9d0afdcb3a3f327e0 -Y = 5dca2c73ec89e58ef8267cba2bb5eb0f551f412f9dc087c1a6944f0ce475277a -Digest = e34a541f87ff0eaa0c640f555caec6bf11a1320c74c47a8ff172c4e2ec902e48d499732b12a86189e750bbf4c0424c72 -R = df0b0cd76d2555d4c38b3d70bfdf964884d0beeb9f74385f0893e87d20c9642d -S = 128299aabf1f5496112be1fe04365f5f8215b08a040abdfeca4626f4d15c005b -Invalid = Y - -Curve = P-256 -X = 7ffc2853f3e17887dda13b0eb43f183ce50a5ac0f8bba75fb1921172484f9b94 -Y = 4cc523d14192f80bd5b27d30b3b41e064da87bfbae15572dd382b9a176c123a2 -Digest = 0689927a38486cccf28fe9454e08e0d74843424b89be4cdee8e48f39a69addec730184da72f914cea67231c765ee2574 -R = 3156176d52eb26f9391229de4251993a41b8172f78970bb70e32a245be4bb653 -S = 62827a29e12d2f29b00fb2d02dd5f2d5412e17a4455f4431a5c996881fdfc0ee -Invalid = Y - -Curve = P-256 -X = 5569f76dc94243cde819fb6fc85144ec67e2b5d49539f62e24d406d1b68f0058 -Y = 1208c38dbe25870deab53c486f793a1e250c9d1b8e7c147ea68b71196c440730 -Digest = 97f8f8cea435282ac746730ac744bf97d85d4e249c0b1d9c7b83c7e59aed172ffc3724d7e6fab7d6ab55ffb3a39c0775 -R = 706f2ba4025e7c06b66d6369a3f93b2fec46c51eceff42a158f7431919506cfb -S = b4e75ac34a96393237fc4337789e37168d79382705b248051c9c72bcbac5f516 -Invalid = Y - -Curve = P-256 -X = e4b470c65b2c04db060d7105ec6911589863d3c7f7ce48726ba3f369ea3467e8 -Y = 44c38d3ae098de05f5915a5868c17fee296a6e150beb1f000df5f3bec8fc4532 -Digest = 5b937a2af46dbf18b4a6fb042ea353a6878e0d4beac016002b3d91a42bcba52856c07a3f35c08dfecb4f03e1c0b9948e -R = c9c347ee5717e4c759ddaf09e86f4e1db2c8658593177cfda4e6514b5e3ecb87 -S = baae01e9e44a7b04d69c8eaaed77c9e3a36ce8962f95cc50a0db146b4e49eb40 -Invalid = Y - -Curve = P-256 -X = 96050c5fa2ddd1b2e5451d89ee74a0b7b54347364ddc0231715a6ef1146fe8dc -Y = e0888a9e78aeea87f6e1e9002b2651169f36c4ee53013cfc8c9912b7fd504858 -Digest = b123e07744f05ad523790ea5bfa3f848869a3bfdbf936a496c8606b577ed8427eb7ee888e0fe18d4e3cfac73baad883f -R = 2353d6cd3c21b8ea7dbc1cd940519812dbe365a3b15cd6aebba9d11cf269867a -S = 85f560273cd9e82e6801e4cb1c8cd29cdac34a020da211d77453756b604b8fa7 - -Curve = P-256 -X = 0c07bb79f44012299fbfd5a0f31397aaf7d757f8a38437407c1b09271c6551a0 -Y = 84fe7846d5d403dc92c0091fbd39f3c5cbca3f94c10b5cae44e2e96562131b13 -Digest = fb8d12652de59e63ef5297641dfbce084808de146720e9069c2ef814bcd80b6187f7422a6cd9c706f8d64ccf80e8bc54 -R = 49e9425f82d0a8c503009cead24e12adc9d48a08594094ca4f6d13ad1e3c571d -S = 1f1b70aaa30a8ff639aa0935944e9b88326a213ab8fce5194c1a9dec070eb433 -Invalid = Y - -Curve = P-256 -X = 71db1de1a1f38f356c91feaff5cfe395d1a5b9d23cf6aa19f38ae0bcc90a486d -Y = ecdd6ffb174a50f1cc792985c2f9608c399c98b8a64a69d2b5b7cdd9241f67e2 -Digest = 2d8c6585a3b6319a556e27b53d434f455f73e771c8fc6a115f5c92a8e9a81ce2b4336a5c3edf98910689d11f4c93632a -R = b0443b33a6f249470d2f943675009d21b9ccbead1525ae57815df86bb20470bf -S = 316dbee27d998e09128539c269e297ac8f34b9ef8249a0619168c3495c5c1198 -Invalid = Y - -Curve = P-256 -X = 8219b225aa15472262c648cac8de9aad4173d17a231ba24352a5a1c4eea70fad -Y = 0fee2b08ad39fbf0db0016ef2896ca99adc07efc8c415f640f3720498be26037 -Digest = a4cc3b23f54d9d48ba6b0ad3da3b2e3a0806f41348bd7844e9c9b8648753bdeef8a039e1fa4f5172c89148d65b14056f -R = 134fb689101aaad3954de2819d9fbd12072fe2bc36f496bbf0d13fa72114ab96 -S = e65c232bd915b59e087e7fd5ec90bf636cfa80526345c79a0adfd75003045d6f -Invalid = Y - -Curve = P-256 -X = c934195de33b60cf00461fc3c45dad068e9f5f7af5c7fa78591e95aeb04e2617 -Y = b588dd5f9965fdaa523b475c2812c251bc6973e2df21d9beaace976abf5728cb -Digest = b962b63a7743ad77f9072f2f08d277f6dda8cc3420ddd37d873746008895902bcce218fbfed1a8cb28406978dd8e5134 -R = 71f302440eb4ed2a939b69e33e905e6fdc545c743458d38f7e1a1d456e35f389 -S = 54eaa0eb9cd7503b19a9658f0a04955d9f0ab20ebc8a0877e33c89ee88ad068f -Invalid = Y - -Curve = P-256 -X = 9e1adcd48e2e3f0e4c213501808228e587c40558f52bb54ddbb6102d4048ea92 -Y = 34eff98704790938e7e0bdf87ae39807a6b77dfdc9ecdfe6dd0f241abae1aeb2 -Digest = 21b883fae159867731b123a2606e9b3320fb53a00e4a5dfe3bc3429dd53b8068197be3c7288c1e0bf28a4fc7b13bd70f -R = ce4f0d7480522c8dd1b02dd0eb382f22406642f038c1ede9411883d72b3e7ed0 -S = 8546e1ee3b77f9927cdaccbc2f1cf19d6b5576b0f738bb1b86a0c66b39ca56fb -Invalid = Y - -Curve = P-256 -X = 93edbecb0b019c2cc03060f54cb4904b920fdb34eb83badd752be9443036ae13 -Y = b494e9295e080a9080fe7e73249b3a5904aa84e1c028121eecd3e2cf1a55f598 -Digest = fcc17b88077570c053650e1de42ae6bb1522900b38996decc87704aab6a87ab01d52f83f6442875f378a262c22d23ab2 -R = eec2986d47b71995892b0915d3d5becc4dcb2ab55206d772e0189541b2184ddf -S = 8a6c1edeb6452627ad27c8319599c54ac44cdd831ea66f13f49d90affe6ad45b - -Curve = P-256 -X = 3205bae876f9bd50b0713959e72457165e826cbbe3895d67320909daa48b0ebc -Y = d1592562273e5e0f57bbfb92cedd9af7f133255684ee050af9b6f02019bbcafa -Digest = 299a6070d32a5557010753d7559dbd8d2bde8a8feae5417616ceb5b167997fd2fac0c2bd44264106d3a9720d5e805a04 -R = 0124f3f1c61ec458561a4eaa6c155bd29e59703d14556324924683db3a4cf43b -S = 688a5c5fc0c7ba92210c50cce5b512a468a880e05acc21ca56571d89f45f603a -Invalid = Y - -Curve = P-256 -X = 484e31e69ef70bb8527853c22c6b6b4cd2a51311dde66c7b63f097dbb6ab27bf -Y = e1ff8177f4061d4fbbacbbc70519f0fc8c8b6053d72af0fe4f048d615004f74e -Digest = f1e9cda2e096ece9a1fc57e55eeeb56b1c635380c0f9a1800a4a1a5f105d1fc0c60e776234daaa8a6f7c0f5286bb420b3f607e7cc0a7d840ad5dcbab26c797b0 -R = 91a303d8fe3ab4176070f6406267f6b79bfe5eb5f62ae6aeb374d90667858518 -S = e152119cefa26826ea07ec40a428869132d70812c5578c5a260e48d6800e046a -Invalid = Y - -Curve = P-256 -X = 8b75fc0129c9a78f8395c63ae9694b05cd6950665cf5da7d66118de451422624 -Y = b394171981d4896d6e1b4ef2336d9befe7d27e1eb87f1c14b8ddda622af379dc -Digest = 0527199fadea30f9e5e66166a3ebcdf6aedf906984535f48165e591eff36f1c0de6b0fa69aefb6399e8a213cc2ce53268fbe18c3471b7708bc27c426aaa769a4 -R = 17e298e67ad2af76f6892fdcead00a88256573868f79dc74431b55103058f0b0 -S = 881328cd91e43d30133f6e471e0b9b04353b17893fb7614fd7333d812a3df6b4 -Invalid = Y - -Curve = P-256 -X = 76e51086e078b2b116fd1e9c6fa3d53f675ae40252fb9f0cc62817bd9ce8831d -Y = ca7e609a0b1d14b7c9249b53da0b2050450e2a25cb6c8f81c5311974a7efb576 -Digest = c926a5026d8f83ffa2092caf863f2d8a886af391462969b13a11d3c6c5fa66bb4281bc6e60a1e99a2e1ae95d689a66282096a0f27aacc048f32d39297649a014 -R = 23b653faaa7d4552388771931803ce939dd5ee62d3fa72b019be1b2272c85592 -S = a03c6f5c54a10861d6b8922821708e9306fd6d5d10d566845a106539cbf4fadd -Invalid = Y - -Curve = P-256 -X = bc7c8e09bd093468f706740a4130c544374fdc924a535ef02e9d3be6c6d3bbfa -Y = af3f813ae6646f5b6dbfb0f261fd42537705c800bb1647386343428a9f2e10fc -Digest = 4d74631eb67fd1a6fa93ecb6e6112b6699e78c1d4c24ae81d0d5842efe5d93c2fd7a7863f8d45d1b2fafecbe41b7dc19c4b2bc208e014ffdc216e7eda0392a70 -R = 6bd7ce95af25abfbf14aef4b17392f1da877ab562eca38d785fe39682e9c9324 -S = 6688bea20c87bab34d420642da9bdd4c69456bdec50835887367bb4fb7cd8650 -Invalid = Y - -Curve = P-256 -X = 9cb0cf69303dafc761d4e4687b4ecf039e6d34ab964af80810d8d558a4a8d6f7 -Y = 2d51233a1788920a86ee08a1962c79efa317fb7879e297dad2146db995fa1c78 -Digest = 0250f93e6932887df519921f9a8dcff110be0768dc351ef73a940a579fae2d20061759e892e289c3e4ba5f7fe17d6ebb15c5931d48db55ebc81549f6637292fe -R = 4b9f91e4285287261a1d1c923cf619cd52c175cfe7f1be60a5258c610348ba3d -S = 28c45f901d71c41b298638ec0d6a85d7fcb0c33bbfec5a9c810846b639289a84 - -Curve = P-256 -X = e31096c2d512fbf84f81e9bdb16f33121702897605b43a3db546f8fb695b5f6f -Y = 6fbec6a04a8c59d61c900a851d8bf8522187d3ec2637b10fa8f377689e086bba -Digest = f91b09107d10904d3968ec29f85e456ac4e828f32e8da3db6a13f5566bfa625e2ad03f8dad5425a073c0d61d25de63dcafa9f4fcd206f29e9cb6b0fecd74aa57 -R = 1b244c21c08c0c0a10477fb7a21382d405b95c755088292859ca0e71bab68361 -S = 852f4cbfd346e90f404e1dd5c4b2c1debca3ea1abefe8400685d703aea6c5c7f -Invalid = Y - -Curve = P-256 -X = 633c2ee5630b62c9ce839efd4d485a6d35e8b9430d264ffe501d28dbace79123 -Y = 4b668a1a6d1a25b089f75c2bd8d8c6a9a14fe7b729f45a82565da2e866e2c490 -Digest = 575c64df58c8dc517ce65b388fa3ed69470163afecbabc3fa94b497ff7f3fe36ff12fabe2b84cebbf667744195091e4e2335a71d36414e0af0d0260fc8e8ea44 -R = bf2111c93ec055a7eda90c106fce494fd866045634fd2aa28d6e018f9106994e -S = 86b0341208a0aa55edecfd272f49cb34408ce54b7febc1d0a1c2ce77ab6988f8 -Invalid = Y - -Curve = P-256 -X = f78dce40d1cb8c4af2749bf22c6f8a9a470b1e41112796215dd017e57df1b38a -Y = 61b29b0bc03dff7fa00613b4de1e2317cfbf2badd50dee3376c032a887c5b865 -Digest = 4c097f2f5b2489c94258b34d529675bb5d77d4be083b51b01188dd42b4b5473982728763ee6fbad479375c5eacb5edaaec0b6583a10b19aad81ec88dde2d0e7f -R = 4a96169a5dea36a2594011537ee0dc19e8f9f74e82c07434079447155a830152 -S = a204eaa4e97d7553a1521d9f6baadc0b6d6183ba0f385d8593d6ca83607c4d82 -Invalid = Y - -Curve = P-256 -X = 3fcc3b3e1b103fe435ac214c756bdaad309389e1c803e6d84bbbc27039fcf900 -Y = 7f09edd1ec87a6d36dc81c1528d52a62776e666c274415a9f441d6a8df6b9237 -Digest = 1a3dd21cb6ac1fa7fc196319cf534b7608afb93805420fcb5250dff453564a5b22e22971a3ce6dd222405fea018cd0508d86c561eca15e1ac7d79c14e916b86a -R = 1cac13f277354456ae67ab09b09e07eb1af2a2bf45108da70f5c8c6a4cbcd538 -S = 5d83752e540525602ba7e6fee4d4263f3eda59e67df20aac79ca67e8899fed0d -Invalid = Y - -Curve = P-256 -X = 5ec702d43a67ada86efbfc136cf16d96078906954a3f1f9e440674cd907e4676 -Y = 05a62044fed8470dd4fca38d89d583ce36d50d28b66ab0b51922b21da92c56d9 -Digest = c5c016f6c9b525987dd835131def77cc72d8360d364eeccdd7af8b95712b6cd487c0b846201f3b64466fd140833514ae8d765da395fbd9d3c03ca410effa9a69 -R = 75f3037298f1457dba55743999976a1c2636b2b8ab2ed3df4736a6d2934acc83 -S = 19d43ad168dda1bb8ac423f8f08876515234b3d841e57faef1b5ab27359b27ef -Invalid = Y - -Curve = P-256 -X = f63afe99e1b5fc652782f86b59926af22e6072be93390fe41f541204f9c935d1 -Y = f6e19ce5935e336183c21becf66596b8f559d2d02ee282aa87a7d6f936f7260c -Digest = 9eb2f9fa96a1f3ffcef9600522730e86d26d328ec0c1bf2fbfe55a38754610341fda1b894fdcf10c9bc4f48819010fdcf0d24f27ff539e40c6855cafbd306386 -R = cef4831e4515c77ca062282614b54a11b7dc4057e6997685c2fbfa95b392bf72 -S = f20dc01bf38e1344ba675a22239d9893b3a3e33d9a403329a3d21650e9125b75 - -Curve = P-256 -X = 6d11b09d2767cf8d275faee746c203486259f66dd2bfa3a65c39371a66b23385 -Y = 4eb05c73e05261e979182833f20311e5366f72f4b949665ff294f959375534c6 -Digest = 0e71b28b0a1eac7aa881c09daec616c93d9a9286b5f5fdf2642d211021b125fa884b2595b73c7c3e649e61cd7157ef6660076a3b87ddf830db46533f3aa30afa -R = 15a697cdb614e11c0810e1e764cd501fcabc70874c957587bc4883d9438e177f -S = 7bf6244f92bc768063cecb5336c8eaacd23db930b28703560f241c7d93950dfd -Invalid = Y - -Curve = P-256 -X = f3899caba038efb534c4cea0bd276814ffd80194473c903b81af11c8c05cb6e6 -Y = 6ea6b17402fcf2e8e737d11ffc7c2ed3b2d0bc3b8f271a381f4294cff62682c3 -Digest = 104ace16689d785df09a81c5cf47a496db30fbd696aa4df080219487575a23641436e70329dd1c13290582c0d03aae200e51189d43666c86f38a5203c16cd7e4 -R = 57b99380452e1d37b133c49b9ba493dee8630940477ca3351a43d90b99871e6a -S = df599c3a37105af3ecc159b3b685ccb3e151b7d5cf2d97147974ae71f466b615 -Invalid = Y - -Curve = P-256 -X = 1fd6f4b98d0755291e7a230e9f81ecf909e6350aadb08e42a3262ff19200fbd2 -Y = 5578fef79bc477acfb8ed0dc10c4f5809c14dc5492405b3792a7940650b305d7 -Digest = 761a54f3718985b6d7bcfdd57d6c4823f854831bd29305fcb07e34e3f825d451fca28a62ce9582e3957d89ea7c1bc1afe3aa58fd2fa18566974600fc394cf2a8 -R = 97a99e96e407b3ada2c2dcf9ceeeb984d9a4d0aa66ddf0a74ca23cabfb1566cc -S = 0ecac315dc199cfea3c15348c130924a1f787019fe4cd3ae47ca8b111268754a -Invalid = Y - -Curve = P-256 -X = 2dcbd8790cee552e9f18f2b3149a2252dcd58b99ca7dc9680b92c8c43aa33874 -Y = 5dbc8bb8813c8e019d80e19acdb0792f537980fecde93db621aaf1f6d0e6ee34 -Digest = 45b082e804443b53a82229cdf13e4c5f8f31fe93170cc8a23f63eef506cb7748388e1a971a2f81e3daa324cf2bb69118f7418f40df66a24f50c34a55e1416c3a -R = 2bdbd8b0d759595662cc10b10236136ef6ce429641f68cf6480f472fcc77bc9f -S = 7e7df0c8b86f7db06caf1610166f7b9c4c75447f991d5aaf4dea720c25985c8c - -Curve = P-384 -X = 6881154cfe3f09affbee04cd387b27b7854326faf8906c4b9c9e6ac2c632e0d59717b3f33f6d747d7b7cbb4e4dc01fb8 -Y = ba295ae0966f06ad9d84b3bb4da7f99b56044c99f88d71082cfea6964ea3c63bb79806a6a41fcc314b55b3f64f82b68a -Digest = 8a6429d55885146f7aab582a1aa9360fa9591b0a -R = 2112385a75d4edda89ae2bc3c74524dc792544a3a52fdb588da3f0feaee6a11623db275e2ab8abdd998cc42a29c60856 -S = 8d308a3987b81c595f8cec19898b1a42da8eda97496af280033b0f915283f171fed7e2a221fa9c78927962189333f437 -Invalid = Y - -Curve = P-384 -X = 2f2f43f244ae027c3d2ec5c900393f80a8ad0e9b9a12a047195d29a39f2b7026b071688dd9a6764379d02a5ed8035ec1 -Y = e43d45851bc76c37d34dbed996a65ffcfbbaf0e2cbfbc9f62d2116bdf3b330bbef5acdbcd0aa6d949f771daa17cda1e3 -Digest = 5f41322db1a276042ae807f0f0d6f1e04cb5cd26 -R = c011c52e9cb02048957a233704ff9a2c1d4c56e08ebb083aa8ba351f041a23a7d0da19088ac6c60ea2ca117531c7cf35 -S = a66ca9bf06c35d129a8253a0f793acf681e482d9994868b275a230b215286e03a66a0de77c7a53174375137fd4688556 -Invalid = Y - -Curve = P-384 -X = 9a5e1932d318bfa7986f0dac4489c6f55775427bb60fb24bac7646b9994bbc3a9b5cd15e818cc4e832afc1c3fca9abae -Y = 64c89e7c3399c136b2718ab675944207157f0bf23d9e2a807ae7ac3bef81da7ec3c56c2d2c08afc53301af2a3cc71861 -Digest = d36ef9ee70a3b61ba31cdfcd0cac6e49331a407f -R = 4cf6c63fea6c80efc105cd99afe2b53da05ae16566ddb20b9d40a076575ffac419b6807fa336fc6e7c7416c59775ef09 -S = aec2d96054b4b23c49faaf9903ccf63bc96281fb7c1b9d14daa54bba51bb2b2f4d3a901f3b0b9cb2b62976459219350c -Invalid = Y - -Curve = P-384 -X = b3aeff27b65540c6da10a88008404b1d49239c87fbf47932518fb87a9bb132403d1f310f531d086340bb4a68c3e64b9b -Y = 567e75f442fcd81017b8adc4cce634f5ffa3cd497d38221d34dc1f43aef99133131ff1b197f7b9f37beecae5c438849a -Digest = dd0f9c326fb50593fd0a0df31abeeb00a22eb956 -R = 3b94a2514eb915b71e18c867ad7f508a35375c5bcd4b797b86054798569870b2477e2ac14406628017d829400efc63b2 -S = 179a10441a0beea3b375248e697e0d19e24bb68184c373fe4302839b97dd7353a5a25929c2733796b0c0d8211bd67c51 -Invalid = Y - -Curve = P-384 -X = 0874a2e0b8ff448f0e54321e27f4f1e64d064cdeb7d26f458c32e930120f4e57dc85c2693f977eed4a8ecc8db981b4d9 -Y = 1f69446df4f4c6f5de19003f45f891d0ebcd2fffdb5c81c040e8d6994c43c7feedb98a4a31edfb35e89a30013c3b9267 -Digest = a871caf9fff9856031a79a55b96753c1a34ccb73 -R = 8d9d3e3d0b2b2871ea2f03f27ba8699f214be8d875c0d770b0fff1c4ce341f0c834ac11f9ec12bfdb8320b1724c8c220 -S = 62150dfba8e65c0c7be7ef81c87241d2c37a83c27eb31ccc2b3c3957670a744c81be6d741340b5189cc0c547df81b0d2 - -Curve = P-384 -X = b4b92211edbd41c5468d2ba70810bc37b5e7c954c7bd0db80c4fa89ccba10bf07cdab953828a068bc0104d28e4040c14 -Y = 93ed318efce3dff98fc782b788d78658ea5ecde4f716e2d5d0ec2d87a2e761daa1f1658cfb857762caa567baaccf9924 -Digest = 765343d50541bc2c0e20193648048016a95e7588 -R = aa3978eabd196ddf9cab2815cc9cbab0b61cd639deaf70e093a10a58ddf9f410ee1ab965ff8fbb98efbe812421a613d3 -S = 02761a2947e1855806b8a25b9ebb0762be9f5517461a371e5783f34b184f32c4ea684b362119b1a2d8a3ff439f10291f - -Curve = P-384 -X = 63b4cc14f9efd3b8f29e65806591d1e9c54f34a3f5231339bcdbfa4109c42d946a59cdd7bbd2591fd1b2383a0819772f -Y = 55ab3d208109da6ef039c23cddd52a5af619266d8fe066dcabb1af885ad5501401a78c44ed3b5fff2892fdcb2a3ac8b2 -Digest = 4535ef8d7396b4f2af65660ebbb56f356cacefd9 -R = a3f9b840fd7201356f35b5dde39027410aad26ac61919c14fe7b0535bb74e7218cb3312bfa60aac63f14166f32ceff26 -S = 1b1bcbcb0237fad4e406c8d4e3e39b55642d8535afa9ccbc9c601cb4e01891df79f1bc792687cb3a5ee7703565c4a13b -Invalid = Y - -Curve = P-384 -X = f82f82f8f7454ce7a94a040ec0bbb52d49e3b9f8ddd095704973c760ee6067a5c28369656f22d70d8bb1cd70ef9bfea0 -Y = 0e36e256d02870ee5646a17aac4b280c9d1d2e1d4803eb3cb32e7f754cc889522120efd7c4d8a82e509a4d8f266d3ce4 -Digest = 26302c41e6da59e2df2e26c12382738880be94cc -R = 27a2332f3c59464f5dfe7bb1201a3936248d375bde603724c048eb8f7c0c2be3ed4b56c14b51d7d68bd2554526b36d9e -S = e1f90367b0cc530c545f95163d9ffb1208c943685d5ae221052b83ee40953397be581e5979c9855b20246e9d26d57acc -Invalid = Y - -Curve = P-384 -X = 7d40b51127cb1642dd8538d4124138a2f49c41b4d12f702c1b0cec8deba50c3712e01c2e1e693e00438af0e86025da33 -Y = e734b5939b673c45dd32baf20d234f01b7124b391d14beea231e9c604e813fc83b3a77b0cb1f2ce4873a69b0165e369d -Digest = 0b30b209147432207a72177997d28d6f1d03330f -R = abf16821b6657e0005071f78c679cbbb130bee6e7ca63526eef0f747fb721feefe6258dae1aa02064a700e963bd9dedf -S = 3f7e61c34a30cc5ff7a8be375fcc9c38a76dbc0c30a4356843421ca37a7bcf24edcd41d8235903bb522fb6e5a8033885 -Invalid = Y - -Curve = P-384 -X = a5b59d59599c105e39f61354da99c7c9135c749cf996cc2252eb83b008299cdafbcb44227d2d2c4a5ffa44823922893b -Y = 0399fb0edcbfd0b76b524f22b7b87ddbb4fa02f510661615312a4492eb3f2001e0fc0e479f77c33a88f9a7e20757373c -Digest = 44aa3083d111bbce7feb412af74a782cd320becd -R = a4c9cac2409a9bfea1ebe28fec4e19545f08cd18fdd31048f52a3f2d32b2ed859dcae4dc12fb2fecabe542c4f03191ba -S = b4d83f927ad1980d96cbb0ccc36aa640f786293b8b19e4dd97a797d192b420f630a5e42ac42d8736e7d42008f445dbc1 -Invalid = Y - -Curve = P-384 -X = 29178ce9127e1048ea70c7d435439e9ff9915387e51b7e5ca10bfdafe53565978eb3784d9a4226f443d4834f4d451685 -Y = 5cc2970589a453488649711bdf3cdac9a200519aae65b1c6bd54fed0d965755b36b74d978d674275bd71a03e8f054b0e -Digest = c679b4a0e61406c4869d721192bd314d77e1cb39 -R = 5d6f5e9a94d9c92a0890c558bc0408b3405cd04e33f663df16701e80520e4394f1c54d3c8225d36f4753a799aaf6ff90 -S = d895b1cc522ceec6a7867867b8f603245c6e4d48945dfc43af721ebae4683d40a3c21b905ca3bd4b974d36806825b2cd -Invalid = Y - -Curve = P-384 -X = 9f03569f8c6ca2c16d707f0ca36a8a8cf214a9d5c14034829d709e283cd675eb4e3090c6b973429efdf476c0782e0a7c -Y = e1b842536731e91596782787d57af17db85dc92fd2fb95ac65339174aee66775ce0a4721d1faeb29da968ea5eb705e59 -Digest = ae1a63f88a59c7da5d9f512d11bbd5d75dd1f583 -R = 31ccbe22a360b1786dac89394c6ef4ed6604943e50837395f96052821f6182914840096e90f2ad650917bd91d7bd4cfd -S = d97199a6b952dcaefb1defe23def92bf2ee236ad18046a2ccf8924d42ee10a62e70ffe7f3c909b11112278f160d98b7a - -Curve = P-384 -X = b85e78a935d169dd5ba8f558f964b21c07804464816f9231233184675f557463a8b00470ac0ca8278cd008f4642e7962 -Y = 8edf7be8584c5f207939d479e65173e2e69673090a8538fa93efb4432127895d92b4e4cf13b7632a830e9a33b37f75e1 -Digest = 811685f7ff2701e692f6830a33d8712d0432cd5a -R = fd2876b250a94ced71734aa7a0d32423b2c6f039c926c557e748f38e23bbdb46e17d1204832c6f76c3ea854e1da23979 -S = 76409e381799502c81194ba87540aec0b89fc4680dd683780d49f82a46a7191b40f5f06ccb02e45e704c31fcd59382b9 -Invalid = Y - -Curve = P-384 -X = 0c74aaa0527524cb6171ab741896b405a6ac4615e474cdc09c9457b18bed33c6383e1b92f2fa1306e8e5dcd1667e45fe -Y = 7b00d934dfd876f6e07dc0582b20ed650be104fa603a5a1255c62b6059d2685aa9773f1ba31254d213c815d0efc8ed93 -Digest = 328029316d73d1b8d2b8927d12332036e5671384 -R = 832c62b0f34986eda9d1ace5068a0c5318051b0d0166d3dacf137ac072cc359f109ad6e17059e700bb1958bcf4101246 -S = 6bb56f4eb550688ea66e5dd09aebe7e0b39e2716b4697ebb68f113e080f0ff26fd0fc947a34f3c5a8a2f10e07dc1405e -Invalid = Y - -Curve = P-384 -X = 4104de08b4108ee26ee239e0a5d340c1b1aa48b1b3b40717debd6ed3ff0d777923c106f857a3830ce7f3d08d0d6d7908 -Y = 00498c38393e6393edcf254804558f86e461df1f5a6557bc5144f8d2f3806413d372b6ce417d531c08a52d1e38e8b949 -Digest = a13ebaf4431c43b684d1e18e610a75fd7527200e -R = 9924a3273248db20db007309560a0e616572ac799d773529a5215786cf4a6e03cc73bea81d4810c1eee4b5e975652eee -S = 6cc8ea4c4c56da87c25946a198e86917227bcb90da7be1dcde7b6547bc45a98e8175dd54af15bb6ef955b4cb48b7bb0a -Invalid = Y - -Curve = P-384 -X = b6bc9418f3da0cce38a65f1b52bb3a9d22a0368e02f5f12fa1f1303ac67df1cffa55d049a782bf5bddb5e841b125aed6 -Y = 3b578a0560280a2958a14286e10faa7f5dec77fd8d90123aff5780efa8a636cee833fc9f10d7a164f1254a483b613746 -Digest = 7b44de2e448107197558cb071bb5bec9a5849467827d29b2c6625708 -R = 6602090aec001c16e5f6e7e3e488bed5d1702d36b258b6a8a2d8392a5ff30a6af12fbf4308d67eed6aaa8b7be8b831c5 -S = 65d0c3bb1910ba0b7cc108ae1ccaae63405ff01a8df91021e17cd46aa6f8ca8f4eaeac6d6fc26fc816a3ea537fd9576b -Invalid = Y - -Curve = P-384 -X = b4ab83a4ded7d76aa15eaecb1bafe59427d3cfc38564af9123cb707da2405184acd40a6c093ba29e321ba0f67c1e0c6a -Y = 26e2902499495f8550e798617a44ac9990c4c1cc3527dc0dd003a15aee3cbd3955151f7863de1692a94aafd3730e7665 -Digest = 8f902a34f36d7cd36748d5ddcc8fba6040be223a462842d506f185d1 -R = 61e48d5a100049578e820768ea57f30f27ffd1a1f839fabc55e8f4816c9b95d042619cd3bcc7180fd99834e344f53e7f -S = 977b81d43216f31d8bedc3ffe873047817de3441df8b80a321aa0a80931f25a15c6628f43cf8e48d5c6aeca7626b0a18 - -Curve = P-384 -X = f886f36fcf34e8df2a7e09220051b9981a3a6f693ec5999f28864e012c13896d633c9564f0118a95631cea8355b25b20 -Y = 746f9a77835325f18338dee5dc88a9b086b858ce15b4e4462a98844bb01811195f4fae0bee8f457c32823e142210dbb8 -Digest = 6a80377d3c7f0e6a50f6dc1656cef5a0d33cf7934441244f69f0062a -R = 665390653ed280b8f6bd3718d8423f26cb38d2d7faa10fc0f094295677d9dafad45fc64cfc22ded56afdd86a77cf3c33 -S = 864f0eb3a8d93c388d987cfcb60bba76098039d46bf4ff4be083961f70a29e724c25cf56685802b7b5be048107ad52e3 -Invalid = Y - -Curve = P-384 -X = 5fc835a2f5429adb719ed22f11dfcb02731da6759a8ea75c21d1af9631187626c31e191f4dcdc183df01c48e13dbbce6 -Y = 9ed2d03df1cbeaefd4478b8106e90f92e0b6e958145cb81b9648aef0b96b71d1d55918564694b1987d68cc8e7cbd7dd1 -Digest = 807f609592e2ededa12792a7006a6db641904e86a1df3cec477dfd3c -R = 94d9dedd27f2d014ba84ea58d2e88d68f3e86ba88b93750e50255211effe88b0a0e2f62017f22965726cdc77c55bca4f -S = 14814bd09d9b7ba81b2485777cc588b5c0a4064df95c63f18a8bfd57494cd0f40c5bda9dc6c01ea72540f57a354360ef -Invalid = Y - -Curve = P-384 -X = 0b86851d7c19f0f04a16e5e2903a36d09bf1863e152d87936fb2d74cf916bcf6dedf3c066d242f7dd327df0fcb42270a -Y = b0c93480740bb635e6c25fb61630fdfcc462a1418366a51b1265656f721e18ba89ebf754c7dfdad865a252c884a6c4fc -Digest = c34e896a31fc4de7596679e12bb2416a51e58e8942eabd5cb01f0737 -R = 33fa5fe3e495076e90f4b62753d3cdc7603aa7f5b407dbf89a854b9521d15e6c381d3cf28f103035dc4291ae318c5f82 -S = 30919a2a3fae71e1afe8378aedcaa08fadfab6c6bf954031452d4fe514969ede2acf0347a2f1e81abf1bfb9d8bd55a36 -Invalid = Y - -Curve = P-384 -X = 6f8f2fc40d1db28309c8850bf94d77c01c5449b4fc556e6bf50e5ee805209c4489d8ff9bd781699eb0e42f6a962d56fe -Y = a4c7c77271dbbe7e00d1c6e4287dddc5463c6803a577a18f89a5eea01c6addc12404353abbc128cb9cf2496732312d65 -Digest = c19cabc6141b2adf67fe4bd0a3fead50473dea8cb0276de1fdc467c5 -R = 327c4642019a635d80dab82f7dc22e3102a3c1ba684c2b6de67d3d3009a17d39ae3d58ca2caec9f6f03f5ba3b406178c -S = 6b1af807cc7265cc6d3049959cd7779ae0de819036647f9510b0e9f7e4c0e3fece5fc3741b68881145a2c944dc5c54d1 - -Curve = P-384 -X = e98ba8016a976dcc3c50127d2af792969835b1096b1644b37c004d1786f4fb1026233f33ad56cd9444ba0a332c92efb8 -Y = 54bbcb78ffa3c855dd24bf182376ff5d28dd7b7551e4b05a19549c9f59c83dcc12a43092d63c5967fc0256612475b7d4 -Digest = d8d9319d3f705d03dfc992e8e7596586200fb1574f2a918350deb268 -R = 3b76a0c0ece2348085f3554fc92b9e5b0fe84801ab2adf1d239d7c81c9697b62285e8e5667774559d1bbc6e86f2ade64 -S = 91d929e42f8223ccc74d4cb09ee7eb619d3a348886c21091ec55d36164ad3cc04e1da6edd88ad89710a908ca4bc00333 -Invalid = Y - -Curve = P-384 -X = b8d7a836715635a8b095d3712817aa9e6ffdd98d24be2db751bb0c1fad42b082542500ea255cde17525ec159afca7002 -Y = 1a526c876d4771157b4f66e3056485c95066d4bd1e73e991ce6d5d3642807efe80015c52ef3cf8c86e57ab9a510ec86a -Digest = fe23e8ab9dc934144247930a48babb0d8ba57703c2bef60e0e9a1e2b -R = 9e36f47ec1b7ffdc6e3472f3cbec913494c0bbaa0c073f597e01845b5a3107c0e23a4575de4f2b582e1c2fe3067ec048 -S = b013cf51008a89b379a2a6b519b8d229ff0374401eae21a8da350fe35756b94168e7fafbd81f0f681f21c056941a82eb -Invalid = Y - -Curve = P-384 -X = 4ffdecf5d5f7c1164297a93742c8a685bb425b97fdfe85f630dab2064ab29e52a0df34629c2531048c288216723fc9bf -Y = 84fcff3e7e478a6932ace6f6b0ab70e61d8a5137b76886c59e721d938e0e252e2f7e57c2ab7dab90493446ad85c3fe4c -Digest = 28d44c363bfb2e36bc59bb68c56e8b5d2587f149839fd3b8c05d9eb3 -R = 7d909d9aacf064c32d070c3149ace8b8f5d83b2006e8460b84c4bce664fc20e91c61ac8b415965b6155eddbe9238fe3d -S = 19d909e358e71985179dab9113941ecad21e4f3608cb3a32dd065868af1657df8e06aa86855ac7ad757a7f8fb568a953 -Invalid = Y - -Curve = P-384 -X = e805e0733fc156bd582faaf794e58d4630ce73fc383cdc964dd337728f774e4989a697d79665a3282ee6e0ee343d6c7b -Y = 43821b7b9a6ce1ddf0c59ada552668a0cfc85a87a610b5c36b7a691947116b49a4099340306e53494fc6b496cb8d12b0 -Digest = fd1bb27d666e3d40f5bd19d8c026a3614404b9edc11e582eb80b044c -R = 3d4fa4ec95b55feac607fddc618d6f4eed71da65dc49d732e64460e5c80c57dc4421c64bacf3ef1e22995fd19c2a3cf5 -S = b11898ba475f2b28402d038afc15f171b99aab93437b35a2f8a3b89f42fdb7f93a0469d9da7652882000dd5bb1e8b9a8 -Invalid = Y - -Curve = P-384 -X = e15c7ef9791b9392c3e97389f2597ee161545c267e584b94262870ef25fda348f72349f396c27ac884fa8d776387fdd8 -Y = 107b4a7da8be564a14f9c45e4df5cc9b62f0671b3f2c0573c33fa37f985fefd1ae3ff2640947ebb12dffda72757db6af -Digest = 3d9611421379fc93226fff23f5fe472a33f6bdc759d5705f7e9a2be3 -R = 9d715fd1a3668283fa83c407242e8d2a4f3fa1bf41919ca4101114bd0e0ac1b16c4379edb11de5210eee8618d42e9ed1 -S = 2dc37f453c8cfe01ea80c56d1865daf0f28847b12970132a1853c3ed80da6693e0da47a2476207947f29da34d68d604a -Invalid = Y - -Curve = P-384 -X = efcb97dd73106b0a2be4f665c496352f6938da9d0fa97690dc0e8d018b06dce2ba8d19b93ddfe889d549a33e64497c31 -Y = 66a0cb7e64f40470b6d09b9e12f217b59e9e6615af52fbdc4ddcb379e77809361eca2093a3e24c7103e971567018400f -Digest = 5598b06acf834ffbb2e50784fe2bc493fa51967f7ffadf1ece63f9b2 -R = 4ea5d4faf8ee52540db2f4c6283cea5302a3540a56e14c8a7533441c248465be99e10f23bba85be9634efaba7a8b172e -S = 4c98a2142ecaba7db44c78658efffc1175f810a147306ba2e6498553526adb1507d7a99a372e0f84c8dbd160ef7fd5bf - -Curve = P-384 -X = 4e916a3cf2561580b49ecc52321db7103292fd2fcce8dd4d6f86be6035808e0df51c3c4ac1894f0b08ef6ebf953e0d18 -Y = 4e6f28895d024b4c71220b27052ddd4bf6115a260825acade48c043b3e06d2b6b8e4ebdf465980f3b013cb575d475bbb -Digest = 1668ee6ae19c2d6f23b9184b6895ede8f55549b23095d53ef89487f6 -R = efce00544ebe0d98ba6015c07e3e9d09af808d49a0820c22ef572a3ef9c8a684b377bef1f8b3bbddb734b9b0bd0b1cd4 -S = e80d0e183b3f00098308e20e5b4ae393a07f1d1a8defda9a9d10f19b3e5236e42f593b1dc57f6718dd8d4583f0175ff7 -Invalid = Y - -Curve = P-384 -X = 3c6528c82d9d5e8dddf41a211c70f78604d81f49853bdc746270f1340a2a645dca3bc7844c3680268fa5973cd1758313 -Y = 4b9e697f1caf83d3224486bb0a8cd6a7c56e47c91043d8cba3aba51b6e504441d37abcc9b7b2d49b9126463703e514a0 -Digest = 1b39217bcc5dc841b32ddf00245623c581f19cac8a4ecd03eb2c07f0 -R = 848814c01c3d18534f39bcd53a8736db16f0f77a015a0e578cbb2f831739723e83b29cb6d4eee7822c76ff056d0f467d -S = 05beb19f766bd1d4ec5e65786042258298a2dc617e3f13d8e2f0f4b50d934565f3162c737fa791a81897397f29305943 -Invalid = Y - -Curve = P-384 -X = 80c3f6488dcd76f33cdb75e30f8452ab9a3bd6110f14e25179b0aefe4c19c60a07b4af10844b130b0b75a7024e341298 -Y = 6c85a17ad4bbefb33910250e05ac02a17c892c3380712d06dd070843dff0d040e219dae78679b774cd5eff0adb67189a -Digest = 23cd0066d1d88702c5d4461deff89aa5662b517806a04c4da30e0d82 -R = bc444deb0c7dd9f96f20a7ffd3ddb35a1189316655531860c39b5f87f09992106985e5562e083ee9f538c8e2d5363c52 -S = 91adde5d47eae80a98661f4347fd6e4778478c3d4aff3cff8aa92e2345a8e03cd4ab64adfd38e461bb98b496516439e7 -Invalid = Y - -Curve = P-384 -X = 97c3f446803a61a7014f61cb7f8b3f36486c7ea96d90ee1767f5c7e1d896dd5114255abb36c74be218c1f0a4e7ebba3d -Y = 553ed1fed72c62851e042f0171454f120029adba4ee26855ab881d9470355f1947aa1d2e806a7ff2583660fedbd037a0 -Digest = 647eb206a8477440b4bd048d00f37dca8635b15c2a8e79e2a9d74fb9a5553211 -R = 7b06d6c2b63f1cc3bfdaa897d07dc15a83bdf35d979f70c34578332b3f4920422bb24867c51bde10831324df424e04ec -S = 4bef715161f400dc98d4b63bd13ff4ad4a6c981ead44bfc662fe9bca4b56cd790698e4deddf9a4bd69327f26bfe801e6 -Invalid = Y - -Curve = P-384 -X = 08bd5c6cdc1f8c611df96485090e20e9188df6abb766bff3c1ba341ed209ad5dfd78b628ec60998ddfdd0dd029352fbd -Y = d9831d75dec760e9f405d1aa5e23aac506dc019fb64d44bd57f6c570d017e6609f8fdbb2dc7b28ca9e00e37cd32a3b73 -Digest = 9a4985f744dd6f2774cb6f20ad6b6969e212abf4ac035b72ad3f8b1955ae1862 -R = 8b372c86ed1eec2163d6f7152e53696b4a10958948d863eb622873b471702ac5b2e75ff852149a499e61510905f98e4c -S = b2ed728e8b30787a28f2a6d3740872e47348686c7cb426411379411310241d25f08a026b853789b1157f1fc1a7f6ff49 -Invalid = Y - -Curve = P-384 -X = 10a784abb3c549444a62c28df1c926b8aabb20c8d9aa4b1f7ca830258857cbe9718dbc9845fa9cbb78587a373baee80d -Y = a1ad0c10b5ab6780cad49c8cd3eebd27de8f1b382ddd7a604458cef8e76ca632a7e44e1c63141a742426cec598029e2e -Digest = f5b47101b4ff9baf64aca830b6afbc4f9620035d88a1d84a12cefa6f7f99faf2 -R = d9e52be2a3f7f566899cf6daaa38116d092473066f3a1bf91f3df44d81bca1deb438d9d25ce1632599c1d3576a30f128 -S = 0cad30bce4b3d7f40b3eef762a21bb1a3bad77439838b13024b7b2c70316875a99e80723a74a9e7a404715ca06a5d673 -Invalid = Y - -Curve = P-384 -X = 8760182393132d69011edfa127e36f92eeac8272641c27f52f3337ef8af7451e6d14f4e4590c7eb9fafb76e8c92865cf -Y = ebc2b123ed871ca570ead40ae8f6f32335393c569b21b38f626d09c064a3c8668e9fb10a4667e0f0c68bf25ca98fd6dc -Digest = 979131ca1d07e0b4ac6f27b20a978e0a230159eec4906db5dbd22b10ec71af87 -R = 1db957e5c2d294035d7f476a0cbc28a4aac2614d8212de5017076cd836bf04ffe237dce8fec91f2fb5ef82449ff1c65d -S = 3e3b9058d0a9c5b417f9c6f86557b9d50e7a902694a7012a1be6bb70708497e4d39fc1f6d6bc60dfa52d23cab173385f -Invalid = Y - -Curve = P-384 -X = 2b1f98d2acdda8347b9a68c75174408eae7de3d6b9c08c26e73ce9ed2ac147b8d90cd82e30ab43909d63f6b457de2071 -Y = 33f5e6f5f5793201991e014cce0045d04adc352298e32f45f4e374450111c8456b5c2efaec43d157949b5c191b2bc934 -Digest = a1daaf888d93a2a7e52bcd2a66cca3ff2e02916616d1919adefdd7257490e5b8 -R = 23d046402cbce807d232bcf0dc96d53c72992e0ba1ffce0d79050c0f4c5ad9bfbbdc1c96c730d67ff3aa3edaa3845da9 -S = 2cd46a4fe5d120b3af3a6d9ea63cc78f4079e8b5520a8fa96828334a4f182ff4d5e3d79470019e4eb8afc4f598b6becb -Invalid = Y - -Curve = P-384 -X = 86ac12dd0a7fe5b81fdae86b12435d316ef9392a3f50b307ab65d9c6079dd0d2d819dc09e22861459c2ed99fbab66fae -Y = ac8444077aaed6d6ccacbe67a4caacee0b5a094a3575ca12ea4b4774c030fe1c870c9249023f5dc4d9ad6e333668cc38 -Digest = e3bcded61cbb0bf6ec20d59f91e8e73e532f15b082b89c984c1b51fb0d1db8a9 -R = 798065f1d1cbd3a1897794f4a025ed47565df773843f4fa74c85fe4d30e3a394783ec5723b530fc5f57906f946ce15e8 -S = b57166044c57c7d9582066805b5885abc06e0bfc02433850c2b74973205ca357a2da94a65172086f5a1580baa697400b - -Curve = P-384 -X = 9e7553eab8cc7e2e7396128f42ab260c6dbb5457cbff2070ea7c0db21def1537939e3f02699e5dd460eca3798d08bd6d -Y = 892c0c8e47dddf858e89099a8fc1026e8b8333532b22f561f7647f63f9c79dbf5e8dd18fbfe6ff34902233119c5d5aa3 -Digest = 0f2a9b447ea5cfcfb9e67d661d7f0752befd3b4e3454fe40b9ae1eca47806025 -R = 2452da6a48c3749b66e576e0f1f768d51728be17aea149164c4e1654c5ce27f625a4610c4a2eeddb3a0626d3abc6c37c -S = 499504fb58c9db24a7ff5f7921e1312f8aa583c08a308e080f5ef1acf5cdae7927c4101573db069ab0b6de7f4f1cab38 -Invalid = Y - -Curve = P-384 -X = 0cf4dc51e71185a29c0c6fa3c075d9da5bd7ede085053344dce5dbbe8329e8ac9045f7246c9d0efed393b8e113c71429 -Y = fdb7917b73974b355cf9f3bef6a0a460c2d39fdf1fe32a7744be0a54ddd1cfa8d03914cff4b5ca536b40707ff2629aa4 -Digest = 331aefe2369b9c5ee6dd9f850259b3b8512f5934434e61573f97fe2c1cd2b147 -R = 3812c2dc2881d7ef7f621993b161672329b261ff100bbd19fb5826c9face09aec2017b6843d69336b813b673c5402527 -S = 5dc102fab9d6325131c556ec00309c2959d1031a63fbc1e2d5d04996d3234ed33875c0ab98e5878e9bc72742519ed398 -Invalid = Y - -Curve = P-384 -X = 6c590434988155236b43147389c6dbfdd27dcd3387e9b4c2587ece670753a542a13a736579887791cf53d31e5ce99994 -Y = 35a20194ff3f1b55f7ffb2758ddd4b98dd0d9e0cc213e10ed25e8e0430fe861066c1d4423c67f0c93f7ebd87fd3c561e -Digest = 153475076a003545d3ca3d4a772866f12cc85f6e69f8c486a91a80fd709206b1 -R = 89ff866889245e797926509e563b1746920b78c9370a6cdae52663730d131e558e327d1f5fef8faf9e6c802fa29504ed -S = 8dd68e2de2f788e598b3e5a60c18d81849a0cc14b3b0e3c931910639f3125e5d6045f00330b1fa989252a80f95419b04 -Invalid = Y - -Curve = P-384 -X = 499cbdf18ec4e69b88051543c7da80845fa2de8be2b9d9045fee7f104a8b5b7d04e69142de9955c5ab18c5a34ebff075 -Y = a29cb8d28836b201a389922b6f8f93870f09c80a00242d00d32656a43ac1440fc55bcb123551a73290f603c3469be9ed -Digest = 5f00b3b48c1ee8287abe6f3fbc3438b91f4268f318ae2aa1e7810369d6716020 -R = 25d4d243da6fd9b439a9242c3656fade7acb7a306e8cf23ea89e3ff4f9330be19c61aaa42d7b426d12c8e0f96b80dae5 -S = e7a99cf4b269bb4a6210d185e9654602523b5cfa1cddc94b1db92018aa557ecb6adda44c816975f5ec1756b6df3c44fd -Invalid = Y - -Curve = P-384 -X = 9a74ea00203c571bd91ae873ce0ed517f8f0a929c1854d68abd3b83a5051c0b686bb37d12958a54940cfa2de23902da7 -Y = 6f20ccf8fa360a9ec03d7bb79ff17ad885f714757ef62995f824908561dc0c3dffc49d873627936a2fff018b82879ced -Digest = 45c3a1b29a18780234f12f5e4b64e7af9de2acf0029ce55b706cc79a7e4df994 -R = acc1fcac98c593fb0a0765fce35a601c2e9570d63ea1e612fff8bc99ac2d4d877750bb44cfb1014e52e00b9235e350af -S = 7f53de3afa4146b1447e829ebac8f5645e948cc99e871c07280cc631613cfdaf52ccaeccbe93588a3fd12170a7ec79fa - -Curve = P-384 -X = e22f221809fb7a054ac799a70b3d24744eb7c5096c8671770399527c88ccf9ddaea0257a0ae9430d927ff5d9f109c533 -Y = af4101d60df9b306ae92da7592f4faf3df422a3e33f1c2ed2973b2b900eefc346b4cf024de650abf537cecd12ac77618 -Digest = ef1057d83a6e6481be7caf2c12c15f085ff971f02f0db8544352558e2b9fd61c -R = c39a8e79f0560b9f26504469a470c7b2230c0d25de07c206e87dfbde9aff0a5d85322f56dfb50d4c1fc67c67d615dad7 -S = 2ad94dd13a39cf4f4cb24c2c81d4c1181652363addd856dc9ba7455458e40ed047cd113129bc87f43949d5a98a0d5205 -Invalid = Y - -Curve = P-384 -X = fa8ebc3682d90ac7356f0b75b9e3376e76518676e0bedd176cfa7fa57fea4b3a399dbb2bf735ec90b9c1705cf9fa6f57 -Y = 18c3fbca0150ec10696b3851f31fb3ba62c0b6be509d249e0d4b374c7a08e49338e0922e2a8a9319999e6569ab8d292e -Digest = 0c7152ec620fe9b783625196b41192dd5d49df184ad26965c970ac5e28bb1c4b -R = fb58ab09b8a7ef7a6ec05b854eae11af9b713f7c7540e25115f609846e636ad4f88dcf4dd61e311273df23ccda474f03 -S = 485be4c21b7c3a9c6b39ffc9f0c39f4050f76d2a6b3fae203d016318c541c1b4ad6cfc0d0950636ff6883895dd49e4e9 - -Curve = P-384 -X = e5f331536a2940cd67234bedf813c12e15aefa9a1a68429f8754bf2769a47c9c2efb5c42135e7b01a110d7302e097eac -Y = 63b2398612c863febd482184e834d3acb51408c49aacbbd35d8719746f37cb13e013c9505ce034cd815aacd10d2f7a0d -Digest = d925955406f6b6dd4df05270a2539a5924830dfbcbf6a5a34f21354db246244b -R = 96c35f22d036785a392dc6abf9b3cfb0ad37b5c59caefcc0b5212e94e86739a2674020ff79258094d90d7d59f09d47a1 -S = 373cbc865384734c56952f7a35a1fdecd88e8b343ee3aa073d30f5f25b73506f1e5f5857f668b0080dec6edeb5e1be96 -Invalid = Y - -Curve = P-384 -X = c53ad865beb1e2b92764065f1a6bb465ee94aacabe43426a93c277d02e00fe36be1c859ba08a031fc518a0d007668979 -Y = 6728d42bae9bc097151748ffa0982964bdd16076fa0e7cc15837c1f773b08d02c3dbc57339091ccc34105b84781150b4 -Digest = 6d5fa5b492406a1e93df6bb6364d7b17a24ef43807a1159acc77486dd7b49b60 -R = d4f0dd94fc3b657dbd234767949207624082ff946de9ce0aeb0d9993b8c7d7935760e1bf9d8b233bc7d6cd34928f5218 -S = 0941df05062aa8849610f4b37d184db77ed1bc19ad2bb42f9a12c123017592bf4086bf424b3caad9a404b260a0f69efb -Invalid = Y - -Curve = P-384 -X = 1f94eb6f439a3806f8054dd79124847d138d14d4f52bac93b042f2ee3cdb7dc9e09925c2a5fee70d4ce08c61e3b19160 -Y = 1c4fd111f6e33303069421deb31e873126be35eeb436fe2034856a3ed1e897f26c846ee3233cd16240989a7990c19d8c -Digest = 8cf5e81c6858b8395421d8c913f1ac887e282b5818eab525fb79feb9bc64bca7eb98f94b9e48b705e6c28311bb0ca672 -R = 3c15c3cedf2a6fbff2f906e661f5932f2542f0ce68e2a8182e5ed3858f33bd3c5666f17ac39e52cb004b80a0d4ba73cd -S = 9de879083cbb0a97973c94f1963d84f581e4c6541b7d000f9850deb25154b23a37dd72267bdd72665cc7027f88164fab -Invalid = Y - -Curve = P-384 -X = cb908b1fd516a57b8ee1e14383579b33cb154fece20c5035e2b3765195d1951d75bd78fb23e00fef37d7d064fd9af144 -Y = cd99c46b5857401ddcff2cf7cf822121faf1cbad9a011bed8c551f6f59b2c360f79bfbe32adbcaa09583bdfdf7c374bb -Digest = 965b83f5d34f7443eb88e78fcc23479156c9cb0080dd68334dac0ad33ba8c774100e440063db28b40b51ac37705d4d70 -R = 33f64fb65cd6a8918523f23aea0bbcf56bba1daca7aff817c8791dc92428d605ac629de2e847d43cee55ba9e4a0e83ba -S = 4428bb478a43ac73ecd6de51ddf7c28ff3c2441625a081714337dd44fea8011bae71959a10947b6ea33f77e128d3c6ae - -Curve = P-384 -X = 9b3c48d924194146eca4172b6d7d618423682686f43e1dbc54ed909053d075ca53b68ae12f0f16a1633d5d9cb17011ec -Y = 695039f837b68e59330ee95d11d5315a8fb5602a7b60c15142dbba6e93b5e4aba8ae4469eac39fa6436323eccc60dcb6 -Digest = c68382d0641ffad850c41365a8ec68e3d55acba376d1bb941e7dcdf7b71f37b8288b023b942373a40be1dfaaf4aea633 -R = 202da4e4e9632bcb6bf0f6dafb7e348528d0b469d77e46b9f939e2fa946a608dd1f166bcbcde96cfad551701da69f6c2 -S = db595b49983882c48df8a396884cd98893a469c4d590e56c6a59b6150d9a0acdf142cf92151052644702ed857a5b7981 -Invalid = Y - -Curve = P-384 -X = 5140108b93b52d9ad572d6129ed6564766f8df3755e49fa53eba41a5a0d6c1d24a483c90070583a66e3cfa52b6fb1f31 -Y = ff52498446a40c61e60c97554256472625633eda0c1a8b4061481fecfbe9c4503e99dfc69e86c9e85c8cc53dca6b8dc4 -Digest = 4b945020c329a61221060e924ec682eceb842c09537fe26265ad084753b89f7650cee4e8df30b38126984d80fd25d246 -R = b2726b2ba9da02de35e9953fc283d1e78700860d4c33dce8db04dd41499d904866c1b8debb377f6c0dfcb0704252174f -S = 0775b027068d7ad55121a278a819f52099ace750d5e996eaec9dee7be72758736cf769650148fbd5c411beb9b88f979e -Invalid = Y - -Curve = P-384 -X = 31f4fc2fac3a163a5796f5e414af6f8107ab5e4a98c755d81efa9d5a83c10128c16c863190112fc29d3d5f3057a2edf1 -Y = fe208743f3e96c3a34b5fff78c9716c074a1ce3dc01c3f0e471ddfae91cd88e7dda38dd0e5e1f91b00b8539da3cc10bc -Digest = 2d6affdf541609f649dbe9fd5829059bf42021fcfefee42d8c9cd5c127015c06b4c3c13ef56d08767788955887752e44 -R = 706911812ec9e7370234efd57b2855975eab81e9c2fe783aa8e442dc6e7d681dab2dc0dfc6765f87ab67001108e3facf -S = 42c89efa22d853d32f619c9fe13e9852889ac98a9fed5d4fa47fed238e1cbe70d7970af9f7bdf84e51176af4885f2490 -Invalid = Y - -Curve = P-384 -X = 1f7911dcfe63a6f270cf75b8584d9b1b4a00afc1fa43543c945945b8a821ebeb37fbc705a000f9cc7c35f7d27027b7bb -Y = f11835ec80c4ac06d99247e73bf72522109ac255e6109262de4dfbf9619244f74fb6c9ee57694537d7e79c248db34dc4 -Digest = f4b0a912331e7fc59a7071e5f47c9dafa6dc09b32c5c3d05301b3833bbe0b9168e2b63f12248849572a322b2f5423b8d -R = 3587c9c6885adf3be1086825f9a41ccd2edfa0bd95e7fc4dba5a9710f41d539132de7772f14c18e318f8992b66d2a86c -S = 73a844d729599d4e3e3c1b63e9c4bf5a73d1f69e0160857fe63a56c381c051f5c37ea6b4cc4caacb6ff26ef9699efe30 -Invalid = Y - -Curve = P-384 -X = 2039661db813d494a9ecb2c4e0cdd7b54068aae8a5d0597009f67f4f36f32c8ee939abe03716e94970bba69f595fead6 -Y = e2d5236e7e357744514e66a3fb111073336de929598eb79fb4368c5bf80814e7584a3b94118faac9321df37452a846fc -Digest = cae50a424395e38bde9ba31fa5ea0c107ccceaff06663719162aac2c3e15f2b2cfd376f90d371326e1d29e0392a756ee -R = 164b8ac2b34c4c499b9d6727e130b5ef37c296bd22c306d1396c6aa54ca661f729aa6353b55d7cf1793b80b5a485115f -S = 4e7187f8f735b7272f2c0985315b5602bb9b1a09f32233aa10570c82d1ccedef6e725800336511e47f88ddbbbdc08f54 -Invalid = Y - -Curve = P-384 -X = 46dcf8ee848c6459fa66d1cae91ccd471401a5782cb2d3b9b9264189f0e9ddf7197b05c694931bde3306240cf9d24b7e -Y = 79d9508f82c5ead05c3f9392f3b1458f6d6c02f44420b9021d656e59402e2645bf3ba1a6b244ddb12edbb69516d5873b -Digest = 039fe89dfc54e7f2162545af700a8c49a1216b08854643656b07d74e7032516fd0c9368c5e5ce54655e4d08baa29b6f0 -R = 5ffba3b5bd7c3a89ec40b47884b0b3464e8abb78608c6d61e1e62c2ca98d44fcdf61825d69dffee8408d0849d0623bac -S = 0d2597b5fc3842ffce1957172253a8c9c0e4dbe770ce54f70f139e0545dc34ec639d609e14175bdb2b812ccfda00c9d4 -Invalid = Y - -Curve = P-384 -X = 097cea75f685cf4d54324ad2124ce3f77b1e490bbaa1ffacde40dd988f7591e1c5d158e6f232500d958762831914af7f -Y = 716d8bc056daf69ca2edd21b89a6ae9923cfcae87bfda5f9a6e514dd4b9d28d164fcc613ca2afb9660adfece59f09b66 -Digest = 02afb35f1df33b3d83df3391ca4184121ca52f520dd12ffc891aee77eab6503f232a5b1231bd997239751f46c4133edb -R = 1c5d4561d2a3af8835839b543098c101c715c545eb7d00300c5cb05bb08dac29e732ffdc31c50915e691999ad505104c -S = c3442f2fb1498fd47c2f959edff37a19783e3ccee80dc6955ca64db087fd188e67358e7b9223535bbb858d21ba6a978c -Invalid = Y - -Curve = P-384 -X = d2e2b3d262bb1105d914c32c007ea23d15a98197f0ed90b46a17f3d403e406a76c8f752be1a8cd01a94fd45157f6511a -Y = e585fba180017b9983b4c853ad3a5dd52e079c5f0ef792d1a0213b6085e390b073de1a4b01749ceab27806e5604980fe -Digest = e66b11b84f87c38526438e5e3c5b4521248c358eaab80e40526906a05fb29d14d4e5686681f03bc3f0025d45dfb83b5f -R = 49c001c47bbcee10c81c0cdfdb84c86e5b388510801e9c9dc7f81bf667e43f74b6a6769c4ac0a38863dc4f21c558f286 -S = 1fb4ff67340cc44f212404ba60f39a2cb8dcd3f354c81b7219289d32e849d4915e9d2f91969ba71e3dd4414f1e8f18f7 -Invalid = Y - -Curve = P-384 -X = cd887c65c01a1f0880bf58611bf360a8435573bc6704bfb249f1192793f6d3283637cd50f3911e5134b0d6130a1db60e -Y = f2b3cbf4fe475fd15a7897561e5c898f10caa6d9d73fef10d4345917b527ce30caeaef138e21ac6d0a49ef2fef14bee6 -Digest = f6325d6bcaaaf1aba1197a290b33974f2fe8af200d5d726e78705904e9894ec31988e35dc76b9976834b7cd1c4c67146 -R = addfa475b998f391144156c418561d323bdfd0c4f416a2f71a946712c349bb79ba1334c3de5b86c2567b8657fe4ca1f1 -S = 1c314b1339f73545ff457323470695e0474c4b6860b35d703784fbf66e9c665de6ca3acb60283df61413e0740906f19e -Invalid = Y - -Curve = P-384 -X = a370cdbef95d1df5bf68ec487122514a107db87df3f8852068fd4694abcadb9b14302c72491a76a64442fc07bd99f02c -Y = d397c25dc1a5781573d039f2520cf329bf65120fdbe964b6b80101160e533d5570e62125b9f3276c49244b8d0f3e44ec -Digest = 709d1bf45b5817f5a67b859651eb47133ebed2622fda09ab66d3467b5e95da50ecc2c74d8f4d289feebec29729a4bfa3 -R = c6c7bb516cc3f37a304328d136b2f44bb89d3dac78f1f5bcd36b412a8b4d879f6cdb75175292c696b58bfa9c91fe6391 -S = 6b711425e1b14f7224cd4b96717a84d65a60ec9951a30152ea1dd3b6ea66a0088d1fd3e9a1ef069804b7d969148c37a0 - -Curve = P-384 -X = d1cf635ca04f09b58879d29012f2025479a002bda590020e6a238bccc764478131cac7e6980c67027d92ece947fea5a6 -Y = 21f7675c2be60c0a5b7d6df2bcc89b56212a2849ec0210c59316200c59864fd86b9a19e1641d206fd8b29af7768b61d3 -Digest = 5d54d236db6ab4691b3d50dc81471c5d388e5735ebdd435e9742a5a8a0ad0e841bab57326c8535a680ada57d2b3a70fa -R = 6101d26e76690634b7294b6b162dcc1a5e6233813ba09edf8567fb57a8f707e024abe0eb3ce948675cd518bb3bfd4383 -S = 4e2a30f71c8f18b74184837f981a90485cd5943c7a184aba9ac787d179f170114a96ddbb8720860a213cc289ae340f1f -Invalid = Y - -Curve = P-384 -X = d15ca4b2d944d5539658a19be8ef85874f0c363b870f1cd1f2dc9cb68b2a43a10d37064697c84543e60982ab62bb32c8 -Y = 062fb7dfc379fc6465302ac5d8d11d3b957b594c9ef445cfe856765dd59e6f10f11809e115ac64969baa23543f2e5661 -Digest = 67cf9e6f9e9558a379ef7361771323a4f3925f2c7a5d94d9156bf2d9d45f9f8fc4d47322da622fbce92fc764a2ccc327 -R = e2cf123ce15ca4edad5f087778d483d9536e4a37d2d55599541c06f878e60354aa31df250b2fc4ed252b80219552c958 -S = 696707a7e3f9a4b918e7c994e7332103d8e816bbe6d0d1cf72877318e087ed0e230b0d1269902f369acb432b9e97a389 - -Curve = P-384 -X = c83d30de9c4e18167cb41c990781b34b9fceb52793b4627e696796c5803515dbc4d142977d914bc04c153261cc5b537f -Y = 42318e5c15d65c3f545189781619267d899250d80acc611fe7ed0943a0f5bfc9d4328ff7ccf675ae0aac069ccb4b4d6e -Digest = e8d6b550271b486e79f6975cff753d49519ed9393b207af7039b4c070cbc2fe7d49dd1bb87f7021e442fadd80ce8a5b0 -R = b567c37f7c84107ef72639e52065486c2e5bf4125b861d37ea3b44fc0b75bcd96dcea3e4dbb9e8f4f45923240b2b9e44 -S = d06266e0f27cfe4be1c6210734a8fa689a6cd1d63240cb19127961365e35890a5f1b464dcb4305f3e8295c6f842ef344 -Invalid = Y - -Curve = P-384 -X = d4e93c4bafb54c06814011309e9f3d8e68b76a5452e364ef05ccc3b44b271e576c9028106b1584f09271c886d467f41d -Y = db730ccfdeb6644362f4fb510d5254bfe6f23e891e936132f90f1913e93baa8b1f8c0613a0f0c61a760ce659f22babc6 -Digest = d5c82ff11f555ce21c3f20a9ecfa6047cb6895e32fa0fb379f49085a59f61b7c8fa05058ef144cf47db5738fa40f4890cb59695998a2358162bbbf6d7f53517b -R = 8d0fd14a59c24b0c2a34b438e162f1f536fe09a698cacfe0760d026d1593265d02f2668d2a5e49ac0b21e93807aa9c18 -S = 3162ffd2adc9dd5ec1bb1d97d2b0c27b8ae234235ffb374878d0b76382002ea505e885c178d56a2d7809bd1d83117ef1 -Invalid = Y - -Curve = P-384 -X = c665feccf51e6bca31593087df60f65b9fe14a12022814615deb892eedb99d86069a82aa91319310b66588185282dad6 -Y = 1e6e25bb8ae7714415b94f89def0f75dcb81d4af6b78d61f277b74b990c11aff51bd12fc88d691c99f2afde7fbd13e51 -Digest = ea056beb112fa9aad69c8dfe51ea947b772bf1c11287edcede43a98089d21492ed581edcb6d1823e2873aabba213b84291db3bffa6eac3ae43a92fc2da276a24 -R = 0e18c4063137468fe864fdc405ad4e120176eb91b4538b28ce43a22ae1a310cc22a2f7a2b3a0f3d15e0f82038b4a4301 -S = 5a1620e42041ce4357daf824befbb2ed65596bcd8214e88726149b26b1f416b9472a8877413f1c3705fc2edf4731943b - -Curve = P-384 -X = a6bbf85e8068151482ce855ccf0ed22988fcf4b162c4b811cb7243b849299e3390a083147fbd68683203ba33588b13ae -Y = 5c837ec9f2eda225c83ab2d5f10b1aa5bfb56387deebf27ecda779f6254a17968260247c75dd813ea0e1926887d46f86 -Digest = 81b1303e10f25d37877b09f9d82dbd894e40264992d86cc74656ebeef505b46fdf9dec312a7f0a26e3f56a7195d5b01d198c378fff9d049e00cbad9586da20c9 -R = 9c11879e59659848274fc1ef5a6a181af813d23708b09a24dc06c089b93b918828dd938a75a34d5a681b0af362dc19a0 -S = 9c362231962ba7579c4a874e87bdc60dc15cb2e0677149c8ea31162963e05a6614616f67a5269616071cf095be7ff44b -Invalid = Y - -Curve = P-384 -X = 9c1eb5cdb1a873e4c275b7ded8712b9058ee0d9ded06c96a2a8d7c652b82e894e2f918dd8e18138e5c34821744b97952 -Y = dd474c93619f02b5d4fe30ea7805c1a13fb80008a81bb5f3eeb95cd11f38841b8e34d64f2c6cc2d6cc2587365eed6b6e -Digest = c0f9ae90fe8aaf54962e7d47a832e4ca6e60355e4066cd2b08bff78650d4e4a5d1eb1de296f9f0ef92887e09f82e0db4411aa9c3c6b109159bd39feed40419a3 -R = f17b2f2fa3b5c8e9c62a633e5d417139ddf3dafba75b464fa156c99b3948a0aca532c7fd3e14a266eb17e7fa80881da2 -S = 01c246866983fa74d6dff38b1ea091f8afd218b5a42467761b147c19a3bb20cd24be8ed1f95f1e61863a709d2d0148e2 -Invalid = Y - -Curve = P-384 -X = 20622a293edc96d83fee77cf1ee8077c61d6f8ed0073d53cfb5ee9c68e764c553fa4fc35fe42dade3a7307179d6fc9c2 -Y = 710fa24383f78cc4568fe0f4ecbbe6b11f0dce5434f4483712a6d2befae975a2efb554907aa46356f29bf7c6c2707c65 -Digest = 5cb8ed471a4001e280a0927faf25183c857b9b2de21c8566e8a1bf04ee085c36db7fab9d8f627898b3bb23c10225305938b56a732659f2cab3fa857d80dfde19 -R = 45a6cf5cef06256139caa709292d1e0f963d176add188572e9c7be29af21a95853a98e23aef0a0850e58d44d60b6d780 -S = df8d71cd5ab22fc718070078103483e5258734872ab935435f21ea199018e49a69c064a63801beb0759fde6e2c4a85b8 -Invalid = Y - -Curve = P-384 -X = 83a4fecc0bf0a353b0acf6f54094b822f2b12564e172b296f3461cafa7315d7d31d0089b1b4c18ad3c86bd18f539774a -Y = e4fd57c5b2937e6fba1e7d72fc3f02352bd79c13611931935f4dfd073b9379f862f2277585137e996e212b5b6533dcba -Digest = cd7c623c3c3b52f46be0ebb2b353ff97db3cd7dfc1a059a57668fc50101aeeb37b8aee9ddda8ab611546999a120cc9acb0e2c3df48dee66d5c31a46a7be94bc7 -R = fb02804010a570d702ebfbcf3d6cc9d55ddac2bd4b4de56d325e9790571b1737f91d3fa1d4caeec6eea806195aed3187 -S = 1fd20fe383e907e77639c05594642798619b2742090919bedeefb672c5700881baf0df19b9529d64bc7bb02683226103 - -Curve = P-384 -X = 208a8c5a6b59458160c5b680116c8b23799c54a7ee8954a4869425a717739facfe4fe24540505cdc133fde8c74bfca78 -Y = 22aa7aba797bde1e8389c3c3f8d8d9aa2a914f4d2d7aaf7187ebed9b2761975718ef97660ba0b8a71dee17f2b982e2cf -Digest = 007b907b90fa60835d45d2f0201a4486d9782fea4f0a235d97d4968336c5369c6c2e82bded56288a10fd6741f4c15d1633bc92e0196308d9f0490fc2077d3b6c -R = 0b4e835ed83151d2bde96e201c54544ba5f301aca853957d3c538c9858fcce796b60fc50f5600a48dcdf13e5bc029827 -S = 0270adf02d31d5428d523e13d7d315c1929a1d89bbd0f61eec0b1186abe1c307cbba6b1067a68bc3947e6196d49719a0 -Invalid = Y - -Curve = P-384 -X = 80ae47e99107d6148b1088c6694df5c1273ff336b66e45b68a7c65fed735129dadcaf2b900e9f8ec50eff70a5ba89ea3 -Y = 47450efb5669bfacd7cbff1f801aafa0812ff88a6ae7b5a1f85e88e19129ed995f509fbf8dec15ce42bbbbd33814c09e -Digest = 1cacc8f609080e7b8339529f944850a700977ef9107f40956fb35645e15fdd54ef01755f07a2582d0bf2ca0cb84ee8ab154fe0914dfc9ad7ad5fe54b857d0f4e -R = bae6fba7b1485ecdca48219ead3c39295fa9c196b1f0941445b1ac768e33962f68d37f1f1749eaad7200064aa202fb41 -S = b411a38d02deb42d1015a7837b033c89d2f37d92c70fa8bb1f592223f7750520b950f30277abfb4155a3ab194b3beca0 -Invalid = Y - -Curve = P-384 -X = 45cb6dcca8d2e80ac04536a22f9d68ea2313245550108ddcd32799d154c0a55492e49463e826275bd9bf0d5e380205c1 -Y = 6fd124f5a6c745751ccfb3ba4dd9144ea8fd41a4d9a4b34820434da66aa7385e73ffe71e6c11ed1beb6c7af22ce00edf -Digest = dd7947a5b9a1c988dd7dff537e15335aacafd3e602adc8373765013f338334dd58aed4fb7144de0007c3410d79f5e78bcd4cf0dd63cc33ed3dd564882e299c7b -R = 2c782c4263eeee63657fbf20fa287a1a81fcd14b1d3bae333928ba4fc31abb20edebc130714380608e38ea74309eca9d -S = 716113d95bc9dba532bfb470112b0d43d9cd6560ad15e0de2e514994801ff339bcf19ad4ee2b8af573f57c038fbd70f0 - -Curve = P-384 -X = 36c1459d9e9f7b6c1598778c784cbf94661a2b11370c02ee092f6ea0ca20acf81f1ed5048a28a1466a91689df26bc291 -Y = d1367418c7b216bd32c6dafc8b2be99d02cab68df990758b2ddd543b7eb6ff6e285b649ffe588b1811b549cfb5f0289b -Digest = 242ff2713c03e3d5277652f8e7fb1e5a1f0422b6652e1bdd696e46c03cdd3aaac329b1d88e7aa345ff7224ce6dc6df05c7e9d7dc2665282c817d15a15b8288fd -R = 40c338adeb504193444bdb95336177362031aaadc5b7e151e42030df9dd8687f3cb8fe2292fd4f9206989c089d966dae -S = be4b2ba251094c24de006c89af2b5c77e6937f36d7bb703b4f8edcfe65d45f4b2fd2486222163ae0ed9e215c0a96f488 -Invalid = Y - -Curve = P-384 -X = b5eb6670bb0b0d3aef10e533d3660756b7372a2a081d9d920130034f48202cd43b9e2d1e5893d0cfb322db65ab839716 -Y = e28444770396041b489b302786a57fca9a98f19685cb4b455d219151e64645ad30dd3149ec96f3bc90879834b65e58aa -Digest = 8d2e653807e87962883956ee3705b2167c50370c3af12eb8f6c26f0f15ede56dddc7d0c9642a1c1c2444b06571fa1a4d47e7884acc7ea3884daaa50940f782e2 -R = 0887a13df940907864b425ec0d8f91ac719abcc62b276fa08c5122b38831c8930abd3c8454e98182bb588fc72843717a -S = a380284eacaa36a34e35f04fbf6e28ffb59176f41ea52d9c9bc1362eccd8e0d699c2e08111d93e9dc2785637b1f4f09e -Invalid = Y - -Curve = P-384 -X = 700e8f65e052e918a63a96fa57f4eda849f9f9faca3302d6ead66ebf85838f8145a6d6718a681b7bef73170d7254958f -Y = 9e9e10357658913007803859165926cd1e5e92c3a644d834098cb1cbfab466349bf4238a5154cf50ed77c77a78263e81 -Digest = cf885fa7a96db595f825a0ccc56b70b60e0e1c30d0a15af636d1f4957328aecb7eeb734d5874bd72ddaf15c357ca36bd42abf387f7b771ea6160e2e23a08652e -R = 59be870e0fd684b000cce95c616d9f34674354e9d20db15d204b8a6285ff55258e4eeb49da1573ef1030cd6b2626dcfb -S = c0bbbf71d87479d82575458be9f4d686921db7ea458d620271f51ec3f4d1afe3bf25ef9c0c400eb7b92cd7058fb17346 -Invalid = Y - -Curve = P-384 -X = a9de6f029445fffcf16349b44095cc83b11e3d0d9f08654b158014803b1cc31b8dfe00b1a8167c6f704d69cdd62c6512 -Y = 27336a503a669ba1d1f3619f51dc8aa2a44b2075c682a36f071be486e7dafba9adfac2ce74be0442b7251e99304ffc05 -Digest = b7e73f38767f253790e7fff019b4e0e61562aeb97b2b749afec2a61c87ab0e15916d4286c0a13989912f6bafdf3efc6f64ddc3b944f9041266e5abd4480c1606 -R = f93a4d2eb94d087f28572847e0099ae2ee944efacdad392ec268c9c1e632e6ccd670c36584e58aba52a4c2b07127d55a -S = 941ee89cea6e7ed20213a95482fae134707ddf4d292ab1952ed5464f1f1138669dedbfc9998b696eaf469be5fb240c80 -Invalid = Y - -Curve = P-384 -X = e63500d6d13069c01fafc4518f1d429661c5bb6ad1ff0383037ca6a469a5c20c453dce03bf6e4164f7e26f849016b3d0 -Y = 83b7b731c2531c3ac61b194cf3db6dc02ccdfa16d9eb49f97bc4ec3fe6c8bd865ea27f1538531ad07dc44fc5107af8e6 -Digest = afc0ed355377d0ab0c4f79d420dcf67ad4920c013d5c8afde2287525da4596672927540418a61568b21ae7799d7659f16b85f611bd6e8d2066a55903da0c48b9 -R = eb78733e73fd64a6a1f23eba5311af23d26816fb8847671e01fdbd8dc7d5fce1a0823b080ee99e8d75edb3f100e16077 -S = bcaedfe599f98b51542c0f94ae1010611c6767ac3abb2bd887399d62fd0f1b3a0e97deb24c95a76de44521bf24c8645e -Invalid = Y - -Curve = P-384 -X = 3ebd869be687f82d844416e6816d698d82e1e22a1f451d50b6c146134deb07f05204c0b04e7dc07ebdcfd916531dc7c3 -Y = 6e4d7bde063edb7254a82b9d9249d2a2b9ad8988c37a84ac9f7c09daed42b1fd28f7cca1ea8b4f91a66e878224800bdc -Digest = 56a61339a35750e95770f28846930e3f594e8d759e07423718734a82b2a80430b0fb3378e40bdcf5c12be135be9a9bec32916b4988a763091a6da7b44631414e -R = 575f87a8a7980555a198cfdec279cbb2f89551b5271d242397c29f6bc4bf413dc30312a7e626ef7fc77a9124a79bf9be -S = f0b7d759246ad36ba8240c537b1eeb5d148c38d324f48028c598eaef6e49d79ff3f6cfe3a32fbbf6f3ed3aaaec31d572 -Invalid = Y - -# The following tests use digests equal to the order and 2^n - 1, where n is -# the number of bits in the order. This is to test the truncated digest not -# being fully reduced. - -Curve = P-256 -X = e57231383637c82c1ac801724cf7e03e67198f467a9beb60ac13cb582d13afa8 -Y = 8f190e090155fcf63810b858bc88e259dc49afef8bdef6fd06d93dddb1991aed -Digest = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551 -R = 05cc6037bb021f4910ea2e489fab2bae6bb6a2769a97f42ba5736994102b7f10 -S = 5db54832ceabf8bccdb8be99b1a49cecff8feee045cb697dec43118e2695b1da - -Curve = P-256 -X = 6e0e2897b9a554ee287cdaf43bfbe25ca8404373971575a0e4b61c61aff5a2fe -Y = 23ea7823a411eb1b39f81bbde24c2cd6ac68be2c7eec3a0671c8676131b8905c -Digest = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -R = 16831feeceab2fab1c575e073e944d73ce7e6f3e9b06312088f06159c530ff50 -S = 870cb824692638538b1569c6093fcb693c054e8e3b9a919e3bb26798910f66e9 - -Curve = P-384 -X = f4a961c19f9cc4ebe4f43081110955f3cede085a08c1415d726e80b2eb774028c5fc96f092ba3ea7d1288dd57fe1db08 -Y = 981398eed0895e09b3b582a0616f3024e51cca7b1ecc347dbf0d24a5f6a222b0c31912f8f5e427d4dde5c6c45212bb10 -Digest = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973 -R = 0b77eaff05bbd922dd80525d2ab301cc119318f5a920a12c71c4b5ff5bb77d25a538983df9bdd5984b0d159daf21f1a2 -S = 73af85ad03a34b6b3993082bf719018d25d1555717b2d2f2535d0601af06a71ad020eff8232d065ab9d7fc4cd0c0ee42 - -Curve = P-384 -X = 54dd8d7cbf2ccdf1a42f5bbc615a372803b094f6040e3c7b651a61bc6912432c836cf2410ab7d67f543236751d81066f -Y = 2219d6257b1c80bf327c96786f2b5d0b5a9b9bf7eee9c853bf66a3bf09520494cb1f7823e4c566d79a617b7e201ead96 -Digest = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -R = 9d923e199d98272e44b8fba382bf3c19660ecb4a9aae3513ff6802a73fef510c15c202807c3f9334b0bce7d6c6a80839 -S = 520784e6290d04d9b61993ee5ebc6fa8ff527fb0777c43cdefc7586701e60edb399005a5648ff852de80208232849fbd - -# The following tests are intended to stress the final comparison in ECDSA. -# ECDSA verification computes some curve point (x, y), picking the fully-reduced -# representive of x mod p, and checking that x mod n is r. (n is the order of -# the group and p defines the underlying prime field.) -# -# This makes the computation sensitive to values near n and p, and which of n or -# p is larger. Additionally, there is an optimization that performs the -# comparison mod p rather than n and compensates for the difference. -# -# These tests were generated by picking a target value of r and x, adjusting -# both until x corresponded to a point on the curve, and then computing the -# public key by solving for P in ECDSA's (x, y) = u1*G + u2*P. The digest is the -# hash of "hello, world" with the suitably-sized SHA-2 hash, so the test vectors -# are suitable for both message- and digest-based APIs. -# -# "x" in the comments refer to the x-coordinate of the computed point, not that -# of the public key. - -# r = 5, x = 5 is valid. -Curve = P-256 -X = 264d796a0dab9b376d34eea6fe297dde1c7b73e53944bc96c8f1e8a6850bb6c9 -Y = cf5308020eed460c649ddae61d4ef8bb79958113f106befaf4f18876d12a5e64 -Digest = 09ca7e4eaa6e8ae9c7d261167129184883644d07dfba7cbfbc4c8a2e08360d5b -R = 0000000000000000000000000000000000000000000000000000000000000005 -S = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254e - -# r = 5 + n, x = 5 is invalid. r must already be reduced. -Curve = P-256 -X = 264d796a0dab9b376d34eea6fe297dde1c7b73e53944bc96c8f1e8a6850bb6c9 -Y = cf5308020eed460c649ddae61d4ef8bb79958113f106befaf4f18876d12a5e64 -Digest = 09ca7e4eaa6e8ae9c7d261167129184883644d07dfba7cbfbc4c8a2e08360d5b -R = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632556 -S = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254e -Invalid = Y - -# r = n-2, x = n-2 is the largest x without a reduction. -Curve = P-256 -X = 50a50c01132bf79e42b31fb278f7317b29515e9e1c973a41266b69048826fb8e -Y = aac53e7df37b5eb25ce4ddb705fc7135c6b1e00a7f56e30744f62f258afa5537 -Digest = 09ca7e4eaa6e8ae9c7d261167129184883644d07dfba7cbfbc4c8a2e08360d5b -R = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f -S = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254e - -# r = n-3, x = n-2 is incorrect. -Curve = P-256 -X = 50a50c01132bf79e42b31fb278f7317b29515e9e1c973a41266b69048826fb8e -Y = aac53e7df37b5eb25ce4ddb705fc7135c6b1e00a7f56e30744f62f258afa5537 -Digest = 09ca7e4eaa6e8ae9c7d261167129184883644d07dfba7cbfbc4c8a2e08360d5b -R = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254e -S = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254e -Invalid = Y - -# r = 3, x = n+3 is the smallest x with a reduction. -Curve = P-256 -X = ce24c99032d52ac6ead23c0ae3ec68ef41e51a281fd457808c83136d7dcce90e -Y = 8f7a154b551e9f39c59279357aa491b2a62bdebc2bb78613883fc72936c057e0 -Digest = 09ca7e4eaa6e8ae9c7d261167129184883644d07dfba7cbfbc4c8a2e08360d5b -R = 0000000000000000000000000000000000000000000000000000000000000003 -S = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254e - -# r = 4, x = n+3 is incorrect. -Curve = P-256 -X = ce24c99032d52ac6ead23c0ae3ec68ef41e51a281fd457808c83136d7dcce90e -Y = 8f7a154b551e9f39c59279357aa491b2a62bdebc2bb78613883fc72936c057e0 -Digest = 09ca7e4eaa6e8ae9c7d261167129184883644d07dfba7cbfbc4c8a2e08360d5b -R = 0000000000000000000000000000000000000000000000000000000000000004 -S = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254e -Invalid = Y - -# r = p-3-n, x = p-3 is the largest valid x. -Curve = P-256 -X = 768a0d300a595005a520130e50927d403395c8e1e40be997b48fc048410f7cdb -Y = 16f217d8e1c02bd887e5de388a17783b182e61b5d534152dc2c4be8d75fdd706 -Digest = 09ca7e4eaa6e8ae9c7d261167129184883644d07dfba7cbfbc4c8a2e08360d5b -R = 000000000000000000000000000000004319055358e8617b0c46353d039cdaab -S = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254e - -# r = p-n+5, x = 5 is incorrect. r is too large to compare r+n with x. -Curve = P-256 -X = 0ec505bc19b14a43e05678cccf07a443d3e871a2e19b68a4da91859a0650f324 -Y = 77300e4f64e9982d94dff5d294428bb37cc9be66117cae9c389d2d495f68b987 -Digest = 09ca7e4eaa6e8ae9c7d261167129184883644d07dfba7cbfbc4c8a2e08360d5b -R = 000000000000000000000000000000004319055358e8617b0c46353d039cdab3 -S = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254e -Invalid = Y - -# r = 2, x = 2 is valid. -Curve = P-384 -X = 016d2db67561bc126ad6c344d6eeb2713a9e2892c649af0f015c6b7617f160c8a3b3a88add669d7155025073c5ac5b4f -Y = 43bf2ed0088af08645c80aa0a24a567a94ba2d794e9689d3ad4b185bc5d2dd008333e2dd2ebb5069a9b32251a3cac71e -Digest = 1fcdb6059ce05172a26bbe2a3ccc88ed5a8cd5fc53edfd9053304d429296a6da23b1cd9e5c9ed3bb34f00418a70cdb7e -R = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002 -S = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52970 - -# r = 2 + n, x = 2 is invalid. r must already be reduced. -Curve = P-384 -X = 016d2db67561bc126ad6c344d6eeb2713a9e2892c649af0f015c6b7617f160c8a3b3a88add669d7155025073c5ac5b4f -Y = 43bf2ed0088af08645c80aa0a24a567a94ba2d794e9689d3ad4b185bc5d2dd008333e2dd2ebb5069a9b32251a3cac71e -Digest = 1fcdb6059ce05172a26bbe2a3ccc88ed5a8cd5fc53edfd9053304d429296a6da23b1cd9e5c9ed3bb34f00418a70cdb7e -R = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52975 -S = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52970 -Invalid = Y - -# r = n-1, x = n-1 is the largest x without a reduction. -Curve = P-384 -X = b5b375264c09acf145ca91d12ab10a096092a41ec43f4d718e129ea1c12b2dea62c7785efc52f46f009fb1dba133e811 -Y = bc0b2af172b4b3068d032a798080e76f4d56f72069519e3c19a43682a41794e52cb3ca139348d6bbc923e6a4f7945cb1 -Digest = 1fcdb6059ce05172a26bbe2a3ccc88ed5a8cd5fc53edfd9053304d429296a6da23b1cd9e5c9ed3bb34f00418a70cdb7e -R = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972 -S = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52970 - -# r = n-2, x = n-1 is incorrect. -Curve = P-384 -X = b5b375264c09acf145ca91d12ab10a096092a41ec43f4d718e129ea1c12b2dea62c7785efc52f46f009fb1dba133e811 -Y = bc0b2af172b4b3068d032a798080e76f4d56f72069519e3c19a43682a41794e52cb3ca139348d6bbc923e6a4f7945cb1 -Digest = 1fcdb6059ce05172a26bbe2a3ccc88ed5a8cd5fc53edfd9053304d429296a6da23b1cd9e5c9ed3bb34f00418a70cdb7e -R = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52971 -S = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52970 -Invalid = Y - -# r = 2, x = n+2 is the smallest x with a reduction. -Curve = P-384 -X = 01b54a697305092bac2939fb906d7471b411c4eba8654169166a5da3810e1fc96795df921f7abbf519be4a027435176c -Y = a19012a3518773d508106d4153adee43c3c384fa62ce36a4addea08f593ec9c76b09a6b9c69d29bd7d47eb48e167dd2f -Digest = 1fcdb6059ce05172a26bbe2a3ccc88ed5a8cd5fc53edfd9053304d429296a6da23b1cd9e5c9ed3bb34f00418a70cdb7e -R = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002 -S = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52970 - -# r = 3, x = n+2 is incorrect. -Curve = P-384 -X = 01b54a697305092bac2939fb906d7471b411c4eba8654169166a5da3810e1fc96795df921f7abbf519be4a027435176c -Y = a19012a3518773d508106d4153adee43c3c384fa62ce36a4addea08f593ec9c76b09a6b9c69d29bd7d47eb48e167dd2f -Digest = 1fcdb6059ce05172a26bbe2a3ccc88ed5a8cd5fc53edfd9053304d429296a6da23b1cd9e5c9ed3bb34f00418a70cdb7e -R = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003 -S = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52970 -Invalid = Y - -# r = p-1-n, x = p-1 is the largest valid x. -Curve = P-384 -X = c4fd8e68006b83f7b7b20b731ae405813aa05f6e57374589b36ae1cecd1d49cae1418c22f398188bcf4ef02e89fe7394 -Y = dd1164b3707f59e05129fa228b8448031db159985f035d93470dc42b3ab4129f0760c46cf201d42e73a7e33ba7402ea6 -Digest = 1fcdb6059ce05172a26bbe2a3ccc88ed5a8cd5fc53edfd9053304d429296a6da23b1cd9e5c9ed3bb34f00418a70cdb7e -R = 000000000000000000000000000000000000000000000000389cb27e0bc8d21fa7e5f24cb74f58851313e696333ad68b -S = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52970 - -# r = p-n+2, x = 2 is incorrect. r is too large to compare r+n with x. -Curve = P-384 -X = 4e5e4f1a6e97059a6cf2f4e8129e5c7c64cb84f9994a41ff5bf30b29c1bf5ba6898627c91a23c73e05cd1a43c8f908c0 -Y = 06a0aed7f1e63a728f87dbd5360a67571a076ab0b4cde81b10d499959814ddb3a8c7854b0bbfa87cc272f90bca2a2254 -Digest = 1fcdb6059ce05172a26bbe2a3ccc88ed5a8cd5fc53edfd9053304d429296a6da23b1cd9e5c9ed3bb34f00418a70cdb7e -R = 000000000000000000000000000000000000000000000000389cb27e0bc8d21fa7e5f24cb74f58851313e696333ad68e -S = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52970 -Invalid = Y diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/modes/asm/aesni-gcm-x86_64.pl temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/modes/asm/aesni-gcm-x86_64.pl --- temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/modes/asm/aesni-gcm-x86_64.pl 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/modes/asm/aesni-gcm-x86_64.pl 1970-01-01 00:00:00.000000000 +0000 @@ -1,1122 +0,0 @@ -#! /usr/bin/env perl -# Copyright 2013-2016 The OpenSSL Project Authors. All Rights Reserved. -# -# Licensed under the OpenSSL license (the "License"). You may not use -# this file except in compliance with the License. You can obtain a copy -# in the file LICENSE in the source distribution or at -# https://www.openssl.org/source/license.html - -# -# ==================================================================== -# Written by Andy Polyakov for the OpenSSL -# project. The module is, however, dual licensed under OpenSSL and -# CRYPTOGAMS licenses depending on where you obtain it. For further -# details see http://www.openssl.org/~appro/cryptogams/. -# ==================================================================== -# -# -# AES-NI-CTR+GHASH stitch. -# -# February 2013 -# -# OpenSSL GCM implementation is organized in such way that its -# performance is rather close to the sum of its streamed components, -# in the context parallelized AES-NI CTR and modulo-scheduled -# PCLMULQDQ-enabled GHASH. Unfortunately, as no stitch implementation -# was observed to perform significantly better than the sum of the -# components on contemporary CPUs, the effort was deemed impossible to -# justify. This module is based on combination of Intel submissions, -# [1] and [2], with MOVBE twist suggested by Ilya Albrekht and Max -# Locktyukhin of Intel Corp. who verified that it reduces shuffles -# pressure with notable relative improvement, achieving 1.0 cycle per -# byte processed with 128-bit key on Haswell processor, 0.74 - on -# Broadwell, 0.63 - on Skylake... [Mentioned results are raw profiled -# measurements for favourable packet size, one divisible by 96. -# Applications using the EVP interface will observe a few percent -# worse performance.] -# -# Knights Landing processes 1 byte in 1.25 cycles (measured with EVP). -# -# [1] http://rt.openssl.org/Ticket/Display.html?id=2900&user=guest&pass=guest -# [2] http://www.intel.com/content/dam/www/public/us/en/documents/software-support/enabling-high-performance-gcm.pdf - -$flavour = shift; -$output = shift; -if ($flavour =~ /\./) { $output = $flavour; undef $flavour; } - -$win64=0; $win64=1 if ($flavour =~ /[nm]asm|mingw64/ || $output =~ /\.asm$/); - -$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; -( $xlate="${dir}x86_64-xlate.pl" and -f $xlate ) or -( $xlate="${dir}../../../perlasm/x86_64-xlate.pl" and -f $xlate) or -die "can't locate x86_64-xlate.pl"; - -# |$avx| in ghash-x86_64.pl must be set to at least 1; otherwise tags will -# be computed incorrectly. -# -# In upstream, this is controlled by shelling out to the compiler to check -# versions, but BoringSSL is intended to be used with pre-generated perlasm -# output, so this isn't useful anyway. -# -# The upstream code uses the condition |$avx>1| even though no AVX2 -# instructions are used, because it assumes MOVBE is supported by the assembler -# if and only if AVX2 is also supported by the assembler; see -# https://marc.info/?l=openssl-dev&m=146567589526984&w=2. -$avx = 2; - -open OUT,"| \"$^X\" \"$xlate\" $flavour \"$output\""; -*STDOUT=*OUT; - -# See the comment above regarding why the condition is ($avx>1) when there are -# no AVX2 instructions being used. -if ($avx>1) {{{ - -($inp,$out,$len,$key,$ivp,$Xip)=("%rdi","%rsi","%rdx","%rcx","%r8","%r9"); - -($Ii,$T1,$T2,$Hkey, - $Z0,$Z1,$Z2,$Z3,$Xi) = map("%xmm$_",(0..8)); - -($inout0,$inout1,$inout2,$inout3,$inout4,$inout5,$rndkey) = map("%xmm$_",(9..15)); - -($counter,$rounds,$ret,$const,$in0,$end0)=("%ebx","%ebp","%r10","%r11","%r14","%r15"); - -$code=<<___; -.text - -.type _aesni_ctr32_ghash_6x,\@abi-omnipotent -.align 32 -_aesni_ctr32_ghash_6x: -.cfi_startproc - vmovdqu 0x20($const),$T2 # borrow $T2, .Lone_msb - sub \$6,$len - vpxor $Z0,$Z0,$Z0 # $Z0 = 0 - vmovdqu 0x00-0x80($key),$rndkey - vpaddb $T2,$T1,$inout1 - vpaddb $T2,$inout1,$inout2 - vpaddb $T2,$inout2,$inout3 - vpaddb $T2,$inout3,$inout4 - vpaddb $T2,$inout4,$inout5 - vpxor $rndkey,$T1,$inout0 - vmovdqu $Z0,16+8(%rsp) # "$Z3" = 0 - jmp .Loop6x - -.align 32 -.Loop6x: - add \$`6<<24`,$counter - jc .Lhandle_ctr32 # discard $inout[1-5]? - vmovdqu 0x00-0x20($Xip),$Hkey # $Hkey^1 - vpaddb $T2,$inout5,$T1 # next counter value - vpxor $rndkey,$inout1,$inout1 - vpxor $rndkey,$inout2,$inout2 - -.Lresume_ctr32: - vmovdqu $T1,($ivp) # save next counter value - vpclmulqdq \$0x10,$Hkey,$Z3,$Z1 - vpxor $rndkey,$inout3,$inout3 - vmovups 0x10-0x80($key),$T2 # borrow $T2 for $rndkey - vpclmulqdq \$0x01,$Hkey,$Z3,$Z2 - - # At this point, the current block of 96 (0x60) bytes has already been - # loaded into registers. Concurrently with processing it, we want to - # load the next 96 bytes of input for the next round. Obviously, we can - # only do this if there are at least 96 more bytes of input beyond the - # input we're currently processing, or else we'd read past the end of - # the input buffer. Here, we set |%r12| to 96 if there are at least 96 - # bytes of input beyond the 96 bytes we're already processing, and we - # set |%r12| to 0 otherwise. In the case where we set |%r12| to 96, - # we'll read in the next block so that it is in registers for the next - # loop iteration. In the case where we set |%r12| to 0, we'll re-read - # the current block and then ignore what we re-read. - # - # At this point, |$in0| points to the current (already read into - # registers) block, and |$end0| points to 2*96 bytes before the end of - # the input. Thus, |$in0| > |$end0| means that we do not have the next - # 96-byte block to read in, and |$in0| <= |$end0| means we do. - xor %r12,%r12 - cmp $in0,$end0 - - vaesenc $T2,$inout0,$inout0 - vmovdqu 0x30+8(%rsp),$Ii # I[4] - vpxor $rndkey,$inout4,$inout4 - vpclmulqdq \$0x00,$Hkey,$Z3,$T1 - vaesenc $T2,$inout1,$inout1 - vpxor $rndkey,$inout5,$inout5 - setnc %r12b - vpclmulqdq \$0x11,$Hkey,$Z3,$Z3 - vaesenc $T2,$inout2,$inout2 - vmovdqu 0x10-0x20($Xip),$Hkey # $Hkey^2 - neg %r12 - vaesenc $T2,$inout3,$inout3 - vpxor $Z1,$Z2,$Z2 - vpclmulqdq \$0x00,$Hkey,$Ii,$Z1 - vpxor $Z0,$Xi,$Xi # modulo-scheduled - vaesenc $T2,$inout4,$inout4 - vpxor $Z1,$T1,$Z0 - and \$0x60,%r12 - vmovups 0x20-0x80($key),$rndkey - vpclmulqdq \$0x10,$Hkey,$Ii,$T1 - vaesenc $T2,$inout5,$inout5 - - vpclmulqdq \$0x01,$Hkey,$Ii,$T2 - lea ($in0,%r12),$in0 - vaesenc $rndkey,$inout0,$inout0 - vpxor 16+8(%rsp),$Xi,$Xi # modulo-scheduled [vpxor $Z3,$Xi,$Xi] - vpclmulqdq \$0x11,$Hkey,$Ii,$Hkey - vmovdqu 0x40+8(%rsp),$Ii # I[3] - vaesenc $rndkey,$inout1,$inout1 - movbe 0x58($in0),%r13 - vaesenc $rndkey,$inout2,$inout2 - movbe 0x50($in0),%r12 - vaesenc $rndkey,$inout3,$inout3 - mov %r13,0x20+8(%rsp) - vaesenc $rndkey,$inout4,$inout4 - mov %r12,0x28+8(%rsp) - vmovdqu 0x30-0x20($Xip),$Z1 # borrow $Z1 for $Hkey^3 - vaesenc $rndkey,$inout5,$inout5 - - vmovups 0x30-0x80($key),$rndkey - vpxor $T1,$Z2,$Z2 - vpclmulqdq \$0x00,$Z1,$Ii,$T1 - vaesenc $rndkey,$inout0,$inout0 - vpxor $T2,$Z2,$Z2 - vpclmulqdq \$0x10,$Z1,$Ii,$T2 - vaesenc $rndkey,$inout1,$inout1 - vpxor $Hkey,$Z3,$Z3 - vpclmulqdq \$0x01,$Z1,$Ii,$Hkey - vaesenc $rndkey,$inout2,$inout2 - vpclmulqdq \$0x11,$Z1,$Ii,$Z1 - vmovdqu 0x50+8(%rsp),$Ii # I[2] - vaesenc $rndkey,$inout3,$inout3 - vaesenc $rndkey,$inout4,$inout4 - vpxor $T1,$Z0,$Z0 - vmovdqu 0x40-0x20($Xip),$T1 # borrow $T1 for $Hkey^4 - vaesenc $rndkey,$inout5,$inout5 - - vmovups 0x40-0x80($key),$rndkey - vpxor $T2,$Z2,$Z2 - vpclmulqdq \$0x00,$T1,$Ii,$T2 - vaesenc $rndkey,$inout0,$inout0 - vpxor $Hkey,$Z2,$Z2 - vpclmulqdq \$0x10,$T1,$Ii,$Hkey - vaesenc $rndkey,$inout1,$inout1 - movbe 0x48($in0),%r13 - vpxor $Z1,$Z3,$Z3 - vpclmulqdq \$0x01,$T1,$Ii,$Z1 - vaesenc $rndkey,$inout2,$inout2 - movbe 0x40($in0),%r12 - vpclmulqdq \$0x11,$T1,$Ii,$T1 - vmovdqu 0x60+8(%rsp),$Ii # I[1] - vaesenc $rndkey,$inout3,$inout3 - mov %r13,0x30+8(%rsp) - vaesenc $rndkey,$inout4,$inout4 - mov %r12,0x38+8(%rsp) - vpxor $T2,$Z0,$Z0 - vmovdqu 0x60-0x20($Xip),$T2 # borrow $T2 for $Hkey^5 - vaesenc $rndkey,$inout5,$inout5 - - vmovups 0x50-0x80($key),$rndkey - vpxor $Hkey,$Z2,$Z2 - vpclmulqdq \$0x00,$T2,$Ii,$Hkey - vaesenc $rndkey,$inout0,$inout0 - vpxor $Z1,$Z2,$Z2 - vpclmulqdq \$0x10,$T2,$Ii,$Z1 - vaesenc $rndkey,$inout1,$inout1 - movbe 0x38($in0),%r13 - vpxor $T1,$Z3,$Z3 - vpclmulqdq \$0x01,$T2,$Ii,$T1 - vpxor 0x70+8(%rsp),$Xi,$Xi # accumulate I[0] - vaesenc $rndkey,$inout2,$inout2 - movbe 0x30($in0),%r12 - vpclmulqdq \$0x11,$T2,$Ii,$T2 - vaesenc $rndkey,$inout3,$inout3 - mov %r13,0x40+8(%rsp) - vaesenc $rndkey,$inout4,$inout4 - mov %r12,0x48+8(%rsp) - vpxor $Hkey,$Z0,$Z0 - vmovdqu 0x70-0x20($Xip),$Hkey # $Hkey^6 - vaesenc $rndkey,$inout5,$inout5 - - vmovups 0x60-0x80($key),$rndkey - vpxor $Z1,$Z2,$Z2 - vpclmulqdq \$0x10,$Hkey,$Xi,$Z1 - vaesenc $rndkey,$inout0,$inout0 - vpxor $T1,$Z2,$Z2 - vpclmulqdq \$0x01,$Hkey,$Xi,$T1 - vaesenc $rndkey,$inout1,$inout1 - movbe 0x28($in0),%r13 - vpxor $T2,$Z3,$Z3 - vpclmulqdq \$0x00,$Hkey,$Xi,$T2 - vaesenc $rndkey,$inout2,$inout2 - movbe 0x20($in0),%r12 - vpclmulqdq \$0x11,$Hkey,$Xi,$Xi - vaesenc $rndkey,$inout3,$inout3 - mov %r13,0x50+8(%rsp) - vaesenc $rndkey,$inout4,$inout4 - mov %r12,0x58+8(%rsp) - vpxor $Z1,$Z2,$Z2 - vaesenc $rndkey,$inout5,$inout5 - vpxor $T1,$Z2,$Z2 - - vmovups 0x70-0x80($key),$rndkey - vpslldq \$8,$Z2,$Z1 - vpxor $T2,$Z0,$Z0 - vmovdqu 0x10($const),$Hkey # .Lpoly - - vaesenc $rndkey,$inout0,$inout0 - vpxor $Xi,$Z3,$Z3 - vaesenc $rndkey,$inout1,$inout1 - vpxor $Z1,$Z0,$Z0 - movbe 0x18($in0),%r13 - vaesenc $rndkey,$inout2,$inout2 - movbe 0x10($in0),%r12 - vpalignr \$8,$Z0,$Z0,$Ii # 1st phase - vpclmulqdq \$0x10,$Hkey,$Z0,$Z0 - mov %r13,0x60+8(%rsp) - vaesenc $rndkey,$inout3,$inout3 - mov %r12,0x68+8(%rsp) - vaesenc $rndkey,$inout4,$inout4 - vmovups 0x80-0x80($key),$T1 # borrow $T1 for $rndkey - vaesenc $rndkey,$inout5,$inout5 - - vaesenc $T1,$inout0,$inout0 - vmovups 0x90-0x80($key),$rndkey - vaesenc $T1,$inout1,$inout1 - vpsrldq \$8,$Z2,$Z2 - vaesenc $T1,$inout2,$inout2 - vpxor $Z2,$Z3,$Z3 - vaesenc $T1,$inout3,$inout3 - vpxor $Ii,$Z0,$Z0 - movbe 0x08($in0),%r13 - vaesenc $T1,$inout4,$inout4 - movbe 0x00($in0),%r12 - vaesenc $T1,$inout5,$inout5 - vmovups 0xa0-0x80($key),$T1 - cmp \$11,$rounds - jb .Lenc_tail # 128-bit key - - vaesenc $rndkey,$inout0,$inout0 - vaesenc $rndkey,$inout1,$inout1 - vaesenc $rndkey,$inout2,$inout2 - vaesenc $rndkey,$inout3,$inout3 - vaesenc $rndkey,$inout4,$inout4 - vaesenc $rndkey,$inout5,$inout5 - - vaesenc $T1,$inout0,$inout0 - vaesenc $T1,$inout1,$inout1 - vaesenc $T1,$inout2,$inout2 - vaesenc $T1,$inout3,$inout3 - vaesenc $T1,$inout4,$inout4 - vmovups 0xb0-0x80($key),$rndkey - vaesenc $T1,$inout5,$inout5 - vmovups 0xc0-0x80($key),$T1 - # 192-bit key support was removed. - - vaesenc $rndkey,$inout0,$inout0 - vaesenc $rndkey,$inout1,$inout1 - vaesenc $rndkey,$inout2,$inout2 - vaesenc $rndkey,$inout3,$inout3 - vaesenc $rndkey,$inout4,$inout4 - vaesenc $rndkey,$inout5,$inout5 - - vaesenc $T1,$inout0,$inout0 - vaesenc $T1,$inout1,$inout1 - vaesenc $T1,$inout2,$inout2 - vaesenc $T1,$inout3,$inout3 - vaesenc $T1,$inout4,$inout4 - vmovups 0xd0-0x80($key),$rndkey - vaesenc $T1,$inout5,$inout5 - vmovups 0xe0-0x80($key),$T1 - jmp .Lenc_tail # 256-bit key - -.align 32 -.Lhandle_ctr32: - vmovdqu ($const),$Ii # borrow $Ii for .Lbswap_mask - vpshufb $Ii,$T1,$Z2 # byte-swap counter - vmovdqu 0x30($const),$Z1 # borrow $Z1, .Ltwo_lsb - vpaddd 0x40($const),$Z2,$inout1 # .Lone_lsb - vpaddd $Z1,$Z2,$inout2 - vmovdqu 0x00-0x20($Xip),$Hkey # $Hkey^1 - vpaddd $Z1,$inout1,$inout3 - vpshufb $Ii,$inout1,$inout1 - vpaddd $Z1,$inout2,$inout4 - vpshufb $Ii,$inout2,$inout2 - vpxor $rndkey,$inout1,$inout1 - vpaddd $Z1,$inout3,$inout5 - vpshufb $Ii,$inout3,$inout3 - vpxor $rndkey,$inout2,$inout2 - vpaddd $Z1,$inout4,$T1 # byte-swapped next counter value - vpshufb $Ii,$inout4,$inout4 - vpshufb $Ii,$inout5,$inout5 - vpshufb $Ii,$T1,$T1 # next counter value - jmp .Lresume_ctr32 - -.align 32 -.Lenc_tail: - vaesenc $rndkey,$inout0,$inout0 - vmovdqu $Z3,16+8(%rsp) # postpone vpxor $Z3,$Xi,$Xi - vpalignr \$8,$Z0,$Z0,$Xi # 2nd phase - vaesenc $rndkey,$inout1,$inout1 - vpclmulqdq \$0x10,$Hkey,$Z0,$Z0 - vpxor 0x00($inp),$T1,$T2 - vaesenc $rndkey,$inout2,$inout2 - vpxor 0x10($inp),$T1,$Ii - vaesenc $rndkey,$inout3,$inout3 - vpxor 0x20($inp),$T1,$Z1 - vaesenc $rndkey,$inout4,$inout4 - vpxor 0x30($inp),$T1,$Z2 - vaesenc $rndkey,$inout5,$inout5 - vpxor 0x40($inp),$T1,$Z3 - vpxor 0x50($inp),$T1,$Hkey - vmovdqu ($ivp),$T1 # load next counter value - - vaesenclast $T2,$inout0,$inout0 - vmovdqu 0x20($const),$T2 # borrow $T2, .Lone_msb - vaesenclast $Ii,$inout1,$inout1 - vpaddb $T2,$T1,$Ii - mov %r13,0x70+8(%rsp) - lea 0x60($inp),$inp - vaesenclast $Z1,$inout2,$inout2 - vpaddb $T2,$Ii,$Z1 - mov %r12,0x78+8(%rsp) - lea 0x60($out),$out - vmovdqu 0x00-0x80($key),$rndkey - vaesenclast $Z2,$inout3,$inout3 - vpaddb $T2,$Z1,$Z2 - vaesenclast $Z3, $inout4,$inout4 - vpaddb $T2,$Z2,$Z3 - vaesenclast $Hkey,$inout5,$inout5 - vpaddb $T2,$Z3,$Hkey - - add \$0x60,$ret - sub \$0x6,$len - jc .L6x_done - - vmovups $inout0,-0x60($out) # save output - vpxor $rndkey,$T1,$inout0 - vmovups $inout1,-0x50($out) - vmovdqa $Ii,$inout1 # 0 latency - vmovups $inout2,-0x40($out) - vmovdqa $Z1,$inout2 # 0 latency - vmovups $inout3,-0x30($out) - vmovdqa $Z2,$inout3 # 0 latency - vmovups $inout4,-0x20($out) - vmovdqa $Z3,$inout4 # 0 latency - vmovups $inout5,-0x10($out) - vmovdqa $Hkey,$inout5 # 0 latency - vmovdqu 0x20+8(%rsp),$Z3 # I[5] - jmp .Loop6x - -.L6x_done: - vpxor 16+8(%rsp),$Xi,$Xi # modulo-scheduled - vpxor $Z0,$Xi,$Xi # modulo-scheduled - - ret -.cfi_endproc -.size _aesni_ctr32_ghash_6x,.-_aesni_ctr32_ghash_6x -___ -###################################################################### -# -# size_t GFp_aesni_gcm_[en|de]crypt(const void *inp, void *out, size_t len, -# const AES_KEY *key, unsigned char iv[16], -# struct { u128 Xi,H,Htbl[9]; } *Xip); -$code.=<<___; -.globl GFp_aesni_gcm_decrypt -.type GFp_aesni_gcm_decrypt,\@function,6 -.align 32 -GFp_aesni_gcm_decrypt: -.cfi_startproc - xor $ret,$ret - - # We call |_aesni_ctr32_ghash_6x|, which requires at least 96 (0x60) - # bytes of input. - cmp \$0x60,$len # minimal accepted length - jb .Lgcm_dec_abort - - lea (%rsp),%rax # save stack pointer -.cfi_def_cfa_register %rax - push %rbx -.cfi_push %rbx - push %rbp -.cfi_push %rbp - push %r12 -.cfi_push %r12 - push %r13 -.cfi_push %r13 - push %r14 -.cfi_push %r14 - push %r15 -.cfi_push %r15 -___ -$code.=<<___ if ($win64); - lea -0xa8(%rsp),%rsp - movaps %xmm6,-0xd8(%rax) - movaps %xmm7,-0xc8(%rax) - movaps %xmm8,-0xb8(%rax) - movaps %xmm9,-0xa8(%rax) - movaps %xmm10,-0x98(%rax) - movaps %xmm11,-0x88(%rax) - movaps %xmm12,-0x78(%rax) - movaps %xmm13,-0x68(%rax) - movaps %xmm14,-0x58(%rax) - movaps %xmm15,-0x48(%rax) -.Lgcm_dec_body: -___ -$code.=<<___; - vzeroupper - - vmovdqu ($ivp),$T1 # input counter value - add \$-128,%rsp - mov 12($ivp),$counter - lea .Lbswap_mask(%rip),$const - lea -0x80($key),$in0 # borrow $in0 - mov \$0xf80,$end0 # borrow $end0 - vmovdqu ($Xip),$Xi # load Xi - and \$-128,%rsp # ensure stack alignment - vmovdqu ($const),$Ii # borrow $Ii for .Lbswap_mask - lea 0x80($key),$key # size optimization - lea 0x20+0x20($Xip),$Xip # size optimization - mov 0xf0-0x80($key),$rounds - vpshufb $Ii,$Xi,$Xi - - and $end0,$in0 - and %rsp,$end0 - sub $in0,$end0 - jc .Ldec_no_key_aliasing - cmp \$768,$end0 - jnc .Ldec_no_key_aliasing - sub $end0,%rsp # avoid aliasing with key -.Ldec_no_key_aliasing: - - vmovdqu 0x50($inp),$Z3 # I[5] - lea ($inp),$in0 - vmovdqu 0x40($inp),$Z0 - - # |_aesni_ctr32_ghash_6x| requires |$end0| to point to 2*96 (0xc0) - # bytes before the end of the input. Note, in particular, that this is - # correct even if |$len| is not an even multiple of 96 or 16. XXX: This - # seems to require that |$inp| + |$len| >= 2*96 (0xc0); i.e. |$inp| must - # not be near the very beginning of the address space when |$len| < 2*96 - # (0xc0). - lea -0xc0($inp,$len),$end0 - - vmovdqu 0x30($inp),$Z1 - shr \$4,$len - xor $ret,$ret - vmovdqu 0x20($inp),$Z2 - vpshufb $Ii,$Z3,$Z3 # passed to _aesni_ctr32_ghash_6x - vmovdqu 0x10($inp),$T2 - vpshufb $Ii,$Z0,$Z0 - vmovdqu ($inp),$Hkey - vpshufb $Ii,$Z1,$Z1 - vmovdqu $Z0,0x30(%rsp) - vpshufb $Ii,$Z2,$Z2 - vmovdqu $Z1,0x40(%rsp) - vpshufb $Ii,$T2,$T2 - vmovdqu $Z2,0x50(%rsp) - vpshufb $Ii,$Hkey,$Hkey - vmovdqu $T2,0x60(%rsp) - vmovdqu $Hkey,0x70(%rsp) - - call _aesni_ctr32_ghash_6x - - vmovups $inout0,-0x60($out) # save output - vmovups $inout1,-0x50($out) - vmovups $inout2,-0x40($out) - vmovups $inout3,-0x30($out) - vmovups $inout4,-0x20($out) - vmovups $inout5,-0x10($out) - - vpshufb ($const),$Xi,$Xi # .Lbswap_mask - vmovdqu $Xi,-0x40($Xip) # output Xi - - vzeroupper -___ -$code.=<<___ if ($win64); - movaps -0xd8(%rax),%xmm6 - movaps -0xc8(%rax),%xmm7 - movaps -0xb8(%rax),%xmm8 - movaps -0xa8(%rax),%xmm9 - movaps -0x98(%rax),%xmm10 - movaps -0x88(%rax),%xmm11 - movaps -0x78(%rax),%xmm12 - movaps -0x68(%rax),%xmm13 - movaps -0x58(%rax),%xmm14 - movaps -0x48(%rax),%xmm15 -___ -$code.=<<___; - mov -48(%rax),%r15 -.cfi_restore %r15 - mov -40(%rax),%r14 -.cfi_restore %r14 - mov -32(%rax),%r13 -.cfi_restore %r13 - mov -24(%rax),%r12 -.cfi_restore %r12 - mov -16(%rax),%rbp -.cfi_restore %rbp - mov -8(%rax),%rbx -.cfi_restore %rbx - lea (%rax),%rsp # restore %rsp -.cfi_def_cfa_register %rsp -.Lgcm_dec_abort: - mov $ret,%rax # return value - ret -.cfi_endproc -.size GFp_aesni_gcm_decrypt,.-GFp_aesni_gcm_decrypt -___ - -$code.=<<___; -.type _aesni_ctr32_6x,\@abi-omnipotent -.align 32 -_aesni_ctr32_6x: -.cfi_startproc - vmovdqu 0x00-0x80($key),$Z0 # borrow $Z0 for $rndkey - vmovdqu 0x20($const),$T2 # borrow $T2, .Lone_msb - lea -1($rounds),%r13 - vmovups 0x10-0x80($key),$rndkey - lea 0x20-0x80($key),%r12 - vpxor $Z0,$T1,$inout0 - add \$`6<<24`,$counter - jc .Lhandle_ctr32_2 - vpaddb $T2,$T1,$inout1 - vpaddb $T2,$inout1,$inout2 - vpxor $Z0,$inout1,$inout1 - vpaddb $T2,$inout2,$inout3 - vpxor $Z0,$inout2,$inout2 - vpaddb $T2,$inout3,$inout4 - vpxor $Z0,$inout3,$inout3 - vpaddb $T2,$inout4,$inout5 - vpxor $Z0,$inout4,$inout4 - vpaddb $T2,$inout5,$T1 - vpxor $Z0,$inout5,$inout5 - jmp .Loop_ctr32 - -.align 16 -.Loop_ctr32: - vaesenc $rndkey,$inout0,$inout0 - vaesenc $rndkey,$inout1,$inout1 - vaesenc $rndkey,$inout2,$inout2 - vaesenc $rndkey,$inout3,$inout3 - vaesenc $rndkey,$inout4,$inout4 - vaesenc $rndkey,$inout5,$inout5 - vmovups (%r12),$rndkey - lea 0x10(%r12),%r12 - dec %r13d - jnz .Loop_ctr32 - - vmovdqu (%r12),$Hkey # last round key - vaesenc $rndkey,$inout0,$inout0 - vpxor 0x00($inp),$Hkey,$Z0 - vaesenc $rndkey,$inout1,$inout1 - vpxor 0x10($inp),$Hkey,$Z1 - vaesenc $rndkey,$inout2,$inout2 - vpxor 0x20($inp),$Hkey,$Z2 - vaesenc $rndkey,$inout3,$inout3 - vpxor 0x30($inp),$Hkey,$Xi - vaesenc $rndkey,$inout4,$inout4 - vpxor 0x40($inp),$Hkey,$T2 - vaesenc $rndkey,$inout5,$inout5 - vpxor 0x50($inp),$Hkey,$Hkey - lea 0x60($inp),$inp - - vaesenclast $Z0,$inout0,$inout0 - vaesenclast $Z1,$inout1,$inout1 - vaesenclast $Z2,$inout2,$inout2 - vaesenclast $Xi,$inout3,$inout3 - vaesenclast $T2,$inout4,$inout4 - vaesenclast $Hkey,$inout5,$inout5 - vmovups $inout0,0x00($out) - vmovups $inout1,0x10($out) - vmovups $inout2,0x20($out) - vmovups $inout3,0x30($out) - vmovups $inout4,0x40($out) - vmovups $inout5,0x50($out) - lea 0x60($out),$out - - ret -.align 32 -.Lhandle_ctr32_2: - vpshufb $Ii,$T1,$Z2 # byte-swap counter - vmovdqu 0x30($const),$Z1 # borrow $Z1, .Ltwo_lsb - vpaddd 0x40($const),$Z2,$inout1 # .Lone_lsb - vpaddd $Z1,$Z2,$inout2 - vpaddd $Z1,$inout1,$inout3 - vpshufb $Ii,$inout1,$inout1 - vpaddd $Z1,$inout2,$inout4 - vpshufb $Ii,$inout2,$inout2 - vpxor $Z0,$inout1,$inout1 - vpaddd $Z1,$inout3,$inout5 - vpshufb $Ii,$inout3,$inout3 - vpxor $Z0,$inout2,$inout2 - vpaddd $Z1,$inout4,$T1 # byte-swapped next counter value - vpshufb $Ii,$inout4,$inout4 - vpxor $Z0,$inout3,$inout3 - vpshufb $Ii,$inout5,$inout5 - vpxor $Z0,$inout4,$inout4 - vpshufb $Ii,$T1,$T1 # next counter value - vpxor $Z0,$inout5,$inout5 - jmp .Loop_ctr32 -.cfi_endproc -.size _aesni_ctr32_6x,.-_aesni_ctr32_6x - -.globl GFp_aesni_gcm_encrypt -.type GFp_aesni_gcm_encrypt,\@function,6 -.align 32 -GFp_aesni_gcm_encrypt: -.cfi_startproc - xor $ret,$ret - - # We call |_aesni_ctr32_6x| twice, each call consuming 96 bytes of - # input. Then we call |_aesni_ctr32_ghash_6x|, which requires at - # least 96 more bytes of input. - cmp \$0x60*3,$len # minimal accepted length - jb .Lgcm_enc_abort - - lea (%rsp),%rax # save stack pointer -.cfi_def_cfa_register %rax - push %rbx -.cfi_push %rbx - push %rbp -.cfi_push %rbp - push %r12 -.cfi_push %r12 - push %r13 -.cfi_push %r13 - push %r14 -.cfi_push %r14 - push %r15 -.cfi_push %r15 -___ -$code.=<<___ if ($win64); - lea -0xa8(%rsp),%rsp - movaps %xmm6,-0xd8(%rax) - movaps %xmm7,-0xc8(%rax) - movaps %xmm8,-0xb8(%rax) - movaps %xmm9,-0xa8(%rax) - movaps %xmm10,-0x98(%rax) - movaps %xmm11,-0x88(%rax) - movaps %xmm12,-0x78(%rax) - movaps %xmm13,-0x68(%rax) - movaps %xmm14,-0x58(%rax) - movaps %xmm15,-0x48(%rax) -.Lgcm_enc_body: -___ -$code.=<<___; - vzeroupper - - vmovdqu ($ivp),$T1 # input counter value - add \$-128,%rsp - mov 12($ivp),$counter - lea .Lbswap_mask(%rip),$const - lea -0x80($key),$in0 # borrow $in0 - mov \$0xf80,$end0 # borrow $end0 - lea 0x80($key),$key # size optimization - vmovdqu ($const),$Ii # borrow $Ii for .Lbswap_mask - and \$-128,%rsp # ensure stack alignment - mov 0xf0-0x80($key),$rounds - - and $end0,$in0 - and %rsp,$end0 - sub $in0,$end0 - jc .Lenc_no_key_aliasing - cmp \$768,$end0 - jnc .Lenc_no_key_aliasing - sub $end0,%rsp # avoid aliasing with key -.Lenc_no_key_aliasing: - - lea ($out),$in0 - - # |_aesni_ctr32_ghash_6x| requires |$end0| to point to 2*96 (0xc0) - # bytes before the end of the input. Note, in particular, that this is - # correct even if |$len| is not an even multiple of 96 or 16. Unlike in - # the decryption case, there's no caveat that |$out| must not be near - # the very beginning of the address space, because we know that - # |$len| >= 3*96 from the check above, and so we know - # |$out| + |$len| >= 2*96 (0xc0). - lea -0xc0($out,$len),$end0 - - shr \$4,$len - - call _aesni_ctr32_6x - vpshufb $Ii,$inout0,$Xi # save bswapped output on stack - vpshufb $Ii,$inout1,$T2 - vmovdqu $Xi,0x70(%rsp) - vpshufb $Ii,$inout2,$Z0 - vmovdqu $T2,0x60(%rsp) - vpshufb $Ii,$inout3,$Z1 - vmovdqu $Z0,0x50(%rsp) - vpshufb $Ii,$inout4,$Z2 - vmovdqu $Z1,0x40(%rsp) - vpshufb $Ii,$inout5,$Z3 # passed to _aesni_ctr32_ghash_6x - vmovdqu $Z2,0x30(%rsp) - - call _aesni_ctr32_6x - - vmovdqu ($Xip),$Xi # load Xi - lea 0x20+0x20($Xip),$Xip # size optimization - sub \$12,$len - mov \$0x60*2,$ret - vpshufb $Ii,$Xi,$Xi - - call _aesni_ctr32_ghash_6x - vmovdqu 0x20(%rsp),$Z3 # I[5] - vmovdqu ($const),$Ii # borrow $Ii for .Lbswap_mask - vmovdqu 0x00-0x20($Xip),$Hkey # $Hkey^1 - vpunpckhqdq $Z3,$Z3,$T1 - vmovdqu 0x20-0x20($Xip),$rndkey # borrow $rndkey for $HK - vmovups $inout0,-0x60($out) # save output - vpshufb $Ii,$inout0,$inout0 # but keep bswapped copy - vpxor $Z3,$T1,$T1 - vmovups $inout1,-0x50($out) - vpshufb $Ii,$inout1,$inout1 - vmovups $inout2,-0x40($out) - vpshufb $Ii,$inout2,$inout2 - vmovups $inout3,-0x30($out) - vpshufb $Ii,$inout3,$inout3 - vmovups $inout4,-0x20($out) - vpshufb $Ii,$inout4,$inout4 - vmovups $inout5,-0x10($out) - vpshufb $Ii,$inout5,$inout5 - vmovdqu $inout0,0x10(%rsp) # free $inout0 -___ -{ my ($HK,$T3)=($rndkey,$inout0); - -$code.=<<___; - vmovdqu 0x30(%rsp),$Z2 # I[4] - vmovdqu 0x10-0x20($Xip),$Ii # borrow $Ii for $Hkey^2 - vpunpckhqdq $Z2,$Z2,$T2 - vpclmulqdq \$0x00,$Hkey,$Z3,$Z1 - vpxor $Z2,$T2,$T2 - vpclmulqdq \$0x11,$Hkey,$Z3,$Z3 - vpclmulqdq \$0x00,$HK,$T1,$T1 - - vmovdqu 0x40(%rsp),$T3 # I[3] - vpclmulqdq \$0x00,$Ii,$Z2,$Z0 - vmovdqu 0x30-0x20($Xip),$Hkey # $Hkey^3 - vpxor $Z1,$Z0,$Z0 - vpunpckhqdq $T3,$T3,$Z1 - vpclmulqdq \$0x11,$Ii,$Z2,$Z2 - vpxor $T3,$Z1,$Z1 - vpxor $Z3,$Z2,$Z2 - vpclmulqdq \$0x10,$HK,$T2,$T2 - vmovdqu 0x50-0x20($Xip),$HK - vpxor $T1,$T2,$T2 - - vmovdqu 0x50(%rsp),$T1 # I[2] - vpclmulqdq \$0x00,$Hkey,$T3,$Z3 - vmovdqu 0x40-0x20($Xip),$Ii # borrow $Ii for $Hkey^4 - vpxor $Z0,$Z3,$Z3 - vpunpckhqdq $T1,$T1,$Z0 - vpclmulqdq \$0x11,$Hkey,$T3,$T3 - vpxor $T1,$Z0,$Z0 - vpxor $Z2,$T3,$T3 - vpclmulqdq \$0x00,$HK,$Z1,$Z1 - vpxor $T2,$Z1,$Z1 - - vmovdqu 0x60(%rsp),$T2 # I[1] - vpclmulqdq \$0x00,$Ii,$T1,$Z2 - vmovdqu 0x60-0x20($Xip),$Hkey # $Hkey^5 - vpxor $Z3,$Z2,$Z2 - vpunpckhqdq $T2,$T2,$Z3 - vpclmulqdq \$0x11,$Ii,$T1,$T1 - vpxor $T2,$Z3,$Z3 - vpxor $T3,$T1,$T1 - vpclmulqdq \$0x10,$HK,$Z0,$Z0 - vmovdqu 0x80-0x20($Xip),$HK - vpxor $Z1,$Z0,$Z0 - - vpxor 0x70(%rsp),$Xi,$Xi # accumulate I[0] - vpclmulqdq \$0x00,$Hkey,$T2,$Z1 - vmovdqu 0x70-0x20($Xip),$Ii # borrow $Ii for $Hkey^6 - vpunpckhqdq $Xi,$Xi,$T3 - vpxor $Z2,$Z1,$Z1 - vpclmulqdq \$0x11,$Hkey,$T2,$T2 - vpxor $Xi,$T3,$T3 - vpxor $T1,$T2,$T2 - vpclmulqdq \$0x00,$HK,$Z3,$Z3 - vpxor $Z0,$Z3,$Z0 - - vpclmulqdq \$0x00,$Ii,$Xi,$Z2 - vmovdqu 0x00-0x20($Xip),$Hkey # $Hkey^1 - vpunpckhqdq $inout5,$inout5,$T1 - vpclmulqdq \$0x11,$Ii,$Xi,$Xi - vpxor $inout5,$T1,$T1 - vpxor $Z1,$Z2,$Z1 - vpclmulqdq \$0x10,$HK,$T3,$T3 - vmovdqu 0x20-0x20($Xip),$HK - vpxor $T2,$Xi,$Z3 - vpxor $Z0,$T3,$Z2 - - vmovdqu 0x10-0x20($Xip),$Ii # borrow $Ii for $Hkey^2 - vpxor $Z1,$Z3,$T3 # aggregated Karatsuba post-processing - vpclmulqdq \$0x00,$Hkey,$inout5,$Z0 - vpxor $T3,$Z2,$Z2 - vpunpckhqdq $inout4,$inout4,$T2 - vpclmulqdq \$0x11,$Hkey,$inout5,$inout5 - vpxor $inout4,$T2,$T2 - vpslldq \$8,$Z2,$T3 - vpclmulqdq \$0x00,$HK,$T1,$T1 - vpxor $T3,$Z1,$Xi - vpsrldq \$8,$Z2,$Z2 - vpxor $Z2,$Z3,$Z3 - - vpclmulqdq \$0x00,$Ii,$inout4,$Z1 - vmovdqu 0x30-0x20($Xip),$Hkey # $Hkey^3 - vpxor $Z0,$Z1,$Z1 - vpunpckhqdq $inout3,$inout3,$T3 - vpclmulqdq \$0x11,$Ii,$inout4,$inout4 - vpxor $inout3,$T3,$T3 - vpxor $inout5,$inout4,$inout4 - vpalignr \$8,$Xi,$Xi,$inout5 # 1st phase - vpclmulqdq \$0x10,$HK,$T2,$T2 - vmovdqu 0x50-0x20($Xip),$HK - vpxor $T1,$T2,$T2 - - vpclmulqdq \$0x00,$Hkey,$inout3,$Z0 - vmovdqu 0x40-0x20($Xip),$Ii # borrow $Ii for $Hkey^4 - vpxor $Z1,$Z0,$Z0 - vpunpckhqdq $inout2,$inout2,$T1 - vpclmulqdq \$0x11,$Hkey,$inout3,$inout3 - vpxor $inout2,$T1,$T1 - vpxor $inout4,$inout3,$inout3 - vxorps 0x10(%rsp),$Z3,$Z3 # accumulate $inout0 - vpclmulqdq \$0x00,$HK,$T3,$T3 - vpxor $T2,$T3,$T3 - - vpclmulqdq \$0x10,0x10($const),$Xi,$Xi - vxorps $inout5,$Xi,$Xi - - vpclmulqdq \$0x00,$Ii,$inout2,$Z1 - vmovdqu 0x60-0x20($Xip),$Hkey # $Hkey^5 - vpxor $Z0,$Z1,$Z1 - vpunpckhqdq $inout1,$inout1,$T2 - vpclmulqdq \$0x11,$Ii,$inout2,$inout2 - vpxor $inout1,$T2,$T2 - vpalignr \$8,$Xi,$Xi,$inout5 # 2nd phase - vpxor $inout3,$inout2,$inout2 - vpclmulqdq \$0x10,$HK,$T1,$T1 - vmovdqu 0x80-0x20($Xip),$HK - vpxor $T3,$T1,$T1 - - vxorps $Z3,$inout5,$inout5 - vpclmulqdq \$0x10,0x10($const),$Xi,$Xi - vxorps $inout5,$Xi,$Xi - - vpclmulqdq \$0x00,$Hkey,$inout1,$Z0 - vmovdqu 0x70-0x20($Xip),$Ii # borrow $Ii for $Hkey^6 - vpxor $Z1,$Z0,$Z0 - vpunpckhqdq $Xi,$Xi,$T3 - vpclmulqdq \$0x11,$Hkey,$inout1,$inout1 - vpxor $Xi,$T3,$T3 - vpxor $inout2,$inout1,$inout1 - vpclmulqdq \$0x00,$HK,$T2,$T2 - vpxor $T1,$T2,$T2 - - vpclmulqdq \$0x00,$Ii,$Xi,$Z1 - vpclmulqdq \$0x11,$Ii,$Xi,$Z3 - vpxor $Z0,$Z1,$Z1 - vpclmulqdq \$0x10,$HK,$T3,$Z2 - vpxor $inout1,$Z3,$Z3 - vpxor $T2,$Z2,$Z2 - - vpxor $Z1,$Z3,$Z0 # aggregated Karatsuba post-processing - vpxor $Z0,$Z2,$Z2 - vpslldq \$8,$Z2,$T1 - vmovdqu 0x10($const),$Hkey # .Lpoly - vpsrldq \$8,$Z2,$Z2 - vpxor $T1,$Z1,$Xi - vpxor $Z2,$Z3,$Z3 - - vpalignr \$8,$Xi,$Xi,$T2 # 1st phase - vpclmulqdq \$0x10,$Hkey,$Xi,$Xi - vpxor $T2,$Xi,$Xi - - vpalignr \$8,$Xi,$Xi,$T2 # 2nd phase - vpclmulqdq \$0x10,$Hkey,$Xi,$Xi - vpxor $Z3,$T2,$T2 - vpxor $T2,$Xi,$Xi -___ -} -$code.=<<___; - vpshufb ($const),$Xi,$Xi # .Lbswap_mask - vmovdqu $Xi,-0x40($Xip) # output Xi - - vzeroupper -___ -$code.=<<___ if ($win64); - movaps -0xd8(%rax),%xmm6 - movaps -0xc8(%rax),%xmm7 - movaps -0xb8(%rax),%xmm8 - movaps -0xa8(%rax),%xmm9 - movaps -0x98(%rax),%xmm10 - movaps -0x88(%rax),%xmm11 - movaps -0x78(%rax),%xmm12 - movaps -0x68(%rax),%xmm13 - movaps -0x58(%rax),%xmm14 - movaps -0x48(%rax),%xmm15 -___ -$code.=<<___; - mov -48(%rax),%r15 -.cfi_restore %r15 - mov -40(%rax),%r14 -.cfi_restore %r14 - mov -32(%rax),%r13 -.cfi_restore %r13 - mov -24(%rax),%r12 -.cfi_restore %r12 - mov -16(%rax),%rbp -.cfi_restore %rbp - mov -8(%rax),%rbx -.cfi_restore %rbx - lea (%rax),%rsp # restore %rsp -.cfi_def_cfa_register %rsp -.Lgcm_enc_abort: - mov $ret,%rax # return value - ret -.cfi_endproc -.size GFp_aesni_gcm_encrypt,.-GFp_aesni_gcm_encrypt -___ - -$code.=<<___; -.align 64 -.Lbswap_mask: - .byte 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 -.Lpoly: - .byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xc2 -.Lone_msb: - .byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 -.Ltwo_lsb: - .byte 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -.Lone_lsb: - .byte 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -.asciz "AES-NI GCM module for x86_64, CRYPTOGAMS by " -.align 64 -___ -if ($win64) { -$rec="%rcx"; -$frame="%rdx"; -$context="%r8"; -$disp="%r9"; - -$code.=<<___ -.extern __imp_RtlVirtualUnwind -.type gcm_se_handler,\@abi-omnipotent -.align 16 -gcm_se_handler: - push %rsi - push %rdi - push %rbx - push %rbp - push %r12 - push %r13 - push %r14 - push %r15 - pushfq - sub \$64,%rsp - - mov 120($context),%rax # pull context->Rax - mov 248($context),%rbx # pull context->Rip - - mov 8($disp),%rsi # disp->ImageBase - mov 56($disp),%r11 # disp->HandlerData - - mov 0(%r11),%r10d # HandlerData[0] - lea (%rsi,%r10),%r10 # prologue label - cmp %r10,%rbx # context->RipRsp - - mov 4(%r11),%r10d # HandlerData[1] - lea (%rsi,%r10),%r10 # epilogue label - cmp %r10,%rbx # context->Rip>=epilogue label - jae .Lcommon_seh_tail - - mov 120($context),%rax # pull context->Rax - - mov -48(%rax),%r15 - mov -40(%rax),%r14 - mov -32(%rax),%r13 - mov -24(%rax),%r12 - mov -16(%rax),%rbp - mov -8(%rax),%rbx - mov %r15,240($context) - mov %r14,232($context) - mov %r13,224($context) - mov %r12,216($context) - mov %rbp,160($context) - mov %rbx,144($context) - - lea -0xd8(%rax),%rsi # %xmm save area - lea 512($context),%rdi # & context.Xmm6 - mov \$20,%ecx # 10*sizeof(%xmm0)/sizeof(%rax) - .long 0xa548f3fc # cld; rep movsq - -.Lcommon_seh_tail: - mov 8(%rax),%rdi - mov 16(%rax),%rsi - mov %rax,152($context) # restore context->Rsp - mov %rsi,168($context) # restore context->Rsi - mov %rdi,176($context) # restore context->Rdi - - mov 40($disp),%rdi # disp->ContextRecord - mov $context,%rsi # context - mov \$154,%ecx # sizeof(CONTEXT) - .long 0xa548f3fc # cld; rep movsq - - mov $disp,%rsi - xor %rcx,%rcx # arg1, UNW_FLAG_NHANDLER - mov 8(%rsi),%rdx # arg2, disp->ImageBase - mov 0(%rsi),%r8 # arg3, disp->ControlPc - mov 16(%rsi),%r9 # arg4, disp->FunctionEntry - mov 40(%rsi),%r10 # disp->ContextRecord - lea 56(%rsi),%r11 # &disp->HandlerData - lea 24(%rsi),%r12 # &disp->EstablisherFrame - mov %r10,32(%rsp) # arg5 - mov %r11,40(%rsp) # arg6 - mov %r12,48(%rsp) # arg7 - mov %rcx,56(%rsp) # arg8, (NULL) - call *__imp_RtlVirtualUnwind(%rip) - - mov \$1,%eax # ExceptionContinueSearch - add \$64,%rsp - popfq - pop %r15 - pop %r14 - pop %r13 - pop %r12 - pop %rbp - pop %rbx - pop %rdi - pop %rsi - ret -.size gcm_se_handler,.-gcm_se_handler - -.section .pdata -.align 4 - .rva .LSEH_begin_GFp_aesni_gcm_decrypt - .rva .LSEH_end_GFp_aesni_gcm_decrypt - .rva .LSEH_gcm_dec_info - - .rva .LSEH_begin_GFp_aesni_gcm_encrypt - .rva .LSEH_end_GFp_aesni_gcm_encrypt - .rva .LSEH_GFp_gcm_enc_info -.section .xdata -.align 8 -.LSEH_gcm_dec_info: - .byte 9,0,0,0 - .rva gcm_se_handler - .rva .Lgcm_dec_body,.Lgcm_dec_abort -.LSEH_GFp_gcm_enc_info: - .byte 9,0,0,0 - .rva gcm_se_handler - .rva .Lgcm_enc_body,.Lgcm_enc_abort -___ -} -}}} - -$code =~ s/\`([^\`]*)\`/eval($1)/gem; - -print $code; - -close STDOUT or die "error closing STDOUT"; diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/modes/asm/ghash-armv4.pl temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/modes/asm/ghash-armv4.pl --- temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/modes/asm/ghash-armv4.pl 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/modes/asm/ghash-armv4.pl 1970-01-01 00:00:00.000000000 +0000 @@ -1,300 +0,0 @@ -#! /usr/bin/env perl -# Copyright 2010-2018 The OpenSSL Project Authors. All Rights Reserved. -# -# Licensed under the OpenSSL license (the "License"). You may not use -# this file except in compliance with the License. You can obtain a copy -# in the file LICENSE in the source distribution or at -# https://www.openssl.org/source/license.html - -# -# ==================================================================== -# Written by Andy Polyakov for the OpenSSL -# project. The module is, however, dual licensed under OpenSSL and -# CRYPTOGAMS licenses depending on where you obtain it. For further -# details see http://www.openssl.org/~appro/cryptogams/. -# ==================================================================== -# -# April 2010 -# -# The module implements "4-bit" GCM GHASH function and underlying -# single multiplication operation in GF(2^128). "4-bit" means that it -# uses 256 bytes per-key table [+32 bytes shared table]. There is no -# experimental performance data available yet. The only approximation -# that can be made at this point is based on code size. Inner loop is -# 32 instructions long and on single-issue core should execute in <40 -# cycles. Having verified that gcc 3.4 didn't unroll corresponding -# loop, this assembler loop body was found to be ~3x smaller than -# compiler-generated one... -# -# July 2010 -# -# Rescheduling for dual-issue pipeline resulted in 8.5% improvement on -# Cortex A8 core and ~25 cycles per processed byte (which was observed -# to be ~3 times faster than gcc-generated code:-) -# -# February 2011 -# -# Profiler-assisted and platform-specific optimization resulted in 7% -# improvement on Cortex A8 core and ~23.5 cycles per byte. -# -# March 2011 -# -# Add NEON implementation featuring polynomial multiplication, i.e. no -# lookup tables involved. On Cortex A8 it was measured to process one -# byte in 15 cycles or 55% faster than integer-only code. -# -# April 2014 -# -# Switch to multiplication algorithm suggested in paper referred -# below and combine it with reduction algorithm from x86 module. -# Performance improvement over previous version varies from 65% on -# Snapdragon S4 to 110% on Cortex A9. In absolute terms Cortex A8 -# processes one byte in 8.45 cycles, A9 - in 10.2, A15 - in 7.63, -# Snapdragon S4 - in 9.33. -# -# Câmara, D.; Gouvêa, C. P. L.; López, J. & Dahab, R.: Fast Software -# Polynomial Multiplication on ARM Processors using the NEON Engine. -# -# http://conradoplg.cryptoland.net/files/2010/12/mocrysen13.pdf - -# ==================================================================== -# Note about "528B" variant. In ARM case it makes lesser sense to -# implement it for following reasons: -# -# - performance improvement won't be anywhere near 50%, because 128- -# bit shift operation is neatly fused with 128-bit xor here, and -# "538B" variant would eliminate only 4-5 instructions out of 32 -# in the inner loop (meaning that estimated improvement is ~15%); -# - ARM-based systems are often embedded ones and extra memory -# consumption might be unappreciated (for so little improvement); -# -# Byte order [in]dependence. ========================================= -# -# Caller is expected to maintain specific *dword* order in Htable, -# namely with *least* significant dword of 128-bit value at *lower* -# address. This differs completely from C code and has everything to -# do with ldm instruction and order in which dwords are "consumed" by -# algorithm. *Byte* order within these dwords in turn is whatever -# *native* byte order on current platform. See gcm128.c for working -# example... - -# This file was patched in BoringSSL to remove the variable-time 4-bit -# implementation. - -$flavour = shift; -if ($flavour=~/\w[\w\-]*\.\w+$/) { $output=$flavour; undef $flavour; } -else { while (($output=shift) && ($output!~/\w[\w\-]*\.\w+$/)) {} } - -if ($flavour && $flavour ne "void") { - $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; - ( $xlate="${dir}arm-xlate.pl" and -f $xlate ) or - ( $xlate="${dir}../../../perlasm/arm-xlate.pl" and -f $xlate) or - die "can't locate arm-xlate.pl"; - - open OUT,"| \"$^X\" $xlate $flavour $output"; - *STDOUT=*OUT; -} else { - open OUT,">$output"; - *STDOUT=*OUT; -} - -$Xi="r0"; # argument block -$Htbl="r1"; -$inp="r2"; -$len="r3"; - -$code=<<___; -#include - -@ Silence ARMv8 deprecated IT instruction warnings. This file is used by both -@ ARMv7 and ARMv8 processors and does not use ARMv8 instructions. (ARMv8 PMULL -@ instructions are in aesv8-armx.pl.) -.arch armv7-a - -.text -#if defined(__thumb2__) || defined(__clang__) -.syntax unified -#define ldrplb ldrbpl -#define ldrneb ldrbne -#endif -#if defined(__thumb2__) -.thumb -#else -.code 32 -#endif -___ -{ -my ($Xl,$Xm,$Xh,$IN)=map("q$_",(0..3)); -my ($t0,$t1,$t2,$t3)=map("q$_",(8..12)); -my ($Hlo,$Hhi,$Hhl,$k48,$k32,$k16)=map("d$_",(26..31)); - -sub clmul64x64 { -my ($r,$a,$b)=@_; -$code.=<<___; - vext.8 $t0#lo, $a, $a, #1 @ A1 - vmull.p8 $t0, $t0#lo, $b @ F = A1*B - vext.8 $r#lo, $b, $b, #1 @ B1 - vmull.p8 $r, $a, $r#lo @ E = A*B1 - vext.8 $t1#lo, $a, $a, #2 @ A2 - vmull.p8 $t1, $t1#lo, $b @ H = A2*B - vext.8 $t3#lo, $b, $b, #2 @ B2 - vmull.p8 $t3, $a, $t3#lo @ G = A*B2 - vext.8 $t2#lo, $a, $a, #3 @ A3 - veor $t0, $t0, $r @ L = E + F - vmull.p8 $t2, $t2#lo, $b @ J = A3*B - vext.8 $r#lo, $b, $b, #3 @ B3 - veor $t1, $t1, $t3 @ M = G + H - vmull.p8 $r, $a, $r#lo @ I = A*B3 - veor $t0#lo, $t0#lo, $t0#hi @ t0 = (L) (P0 + P1) << 8 - vand $t0#hi, $t0#hi, $k48 - vext.8 $t3#lo, $b, $b, #4 @ B4 - veor $t1#lo, $t1#lo, $t1#hi @ t1 = (M) (P2 + P3) << 16 - vand $t1#hi, $t1#hi, $k32 - vmull.p8 $t3, $a, $t3#lo @ K = A*B4 - veor $t2, $t2, $r @ N = I + J - veor $t0#lo, $t0#lo, $t0#hi - veor $t1#lo, $t1#lo, $t1#hi - veor $t2#lo, $t2#lo, $t2#hi @ t2 = (N) (P4 + P5) << 24 - vand $t2#hi, $t2#hi, $k16 - vext.8 $t0, $t0, $t0, #15 - veor $t3#lo, $t3#lo, $t3#hi @ t3 = (K) (P6 + P7) << 32 - vmov.i64 $t3#hi, #0 - vext.8 $t1, $t1, $t1, #14 - veor $t2#lo, $t2#lo, $t2#hi - vmull.p8 $r, $a, $b @ D = A*B - vext.8 $t3, $t3, $t3, #12 - vext.8 $t2, $t2, $t2, #13 - veor $t0, $t0, $t1 - veor $t2, $t2, $t3 - veor $r, $r, $t0 - veor $r, $r, $t2 -___ -} - -$code.=<<___; -#if __ARM_MAX_ARCH__>=7 -.arch armv7-a -.fpu neon - -.global GFp_gcm_init_neon -.type GFp_gcm_init_neon,%function -.align 4 -GFp_gcm_init_neon: - vld1.64 $IN#hi,[r1]! @ load H - vmov.i8 $t0,#0xe1 - vld1.64 $IN#lo,[r1] - vshl.i64 $t0#hi,#57 - vshr.u64 $t0#lo,#63 @ t0=0xc2....01 - vdup.8 $t1,$IN#hi[7] - vshr.u64 $Hlo,$IN#lo,#63 - vshr.s8 $t1,#7 @ broadcast carry bit - vshl.i64 $IN,$IN,#1 - vand $t0,$t0,$t1 - vorr $IN#hi,$Hlo @ H<<<=1 - veor $IN,$IN,$t0 @ twisted H - vstmia r0,{$IN} - - ret @ bx lr -.size GFp_gcm_init_neon,.-GFp_gcm_init_neon - -.global GFp_gcm_gmult_neon -.type GFp_gcm_gmult_neon,%function -.align 4 -GFp_gcm_gmult_neon: - vld1.64 $IN#hi,[$Xi]! @ load Xi - vld1.64 $IN#lo,[$Xi]! - vmov.i64 $k48,#0x0000ffffffffffff - vldmia $Htbl,{$Hlo-$Hhi} @ load twisted H - vmov.i64 $k32,#0x00000000ffffffff -#ifdef __ARMEL__ - vrev64.8 $IN,$IN -#endif - vmov.i64 $k16,#0x000000000000ffff - veor $Hhl,$Hlo,$Hhi @ Karatsuba pre-processing - mov $len,#16 - b .Lgmult_neon -.size GFp_gcm_gmult_neon,.-GFp_gcm_gmult_neon - -.global GFp_gcm_ghash_neon -.type GFp_gcm_ghash_neon,%function -.align 4 -GFp_gcm_ghash_neon: - vld1.64 $Xl#hi,[$Xi]! @ load Xi - vld1.64 $Xl#lo,[$Xi]! - vmov.i64 $k48,#0x0000ffffffffffff - vldmia $Htbl,{$Hlo-$Hhi} @ load twisted H - vmov.i64 $k32,#0x00000000ffffffff -#ifdef __ARMEL__ - vrev64.8 $Xl,$Xl -#endif - vmov.i64 $k16,#0x000000000000ffff - veor $Hhl,$Hlo,$Hhi @ Karatsuba pre-processing - -.Loop_neon: - vld1.64 $IN#hi,[$inp]! @ load inp - vld1.64 $IN#lo,[$inp]! -#ifdef __ARMEL__ - vrev64.8 $IN,$IN -#endif - veor $IN,$Xl @ inp^=Xi -.Lgmult_neon: -___ - &clmul64x64 ($Xl,$Hlo,"$IN#lo"); # H.lo·Xi.lo -$code.=<<___; - veor $IN#lo,$IN#lo,$IN#hi @ Karatsuba pre-processing -___ - &clmul64x64 ($Xm,$Hhl,"$IN#lo"); # (H.lo+H.hi)·(Xi.lo+Xi.hi) - &clmul64x64 ($Xh,$Hhi,"$IN#hi"); # H.hi·Xi.hi -$code.=<<___; - veor $Xm,$Xm,$Xl @ Karatsuba post-processing - veor $Xm,$Xm,$Xh - veor $Xl#hi,$Xl#hi,$Xm#lo - veor $Xh#lo,$Xh#lo,$Xm#hi @ Xh|Xl - 256-bit result - - @ equivalent of reduction_avx from ghash-x86_64.pl - vshl.i64 $t1,$Xl,#57 @ 1st phase - vshl.i64 $t2,$Xl,#62 - veor $t2,$t2,$t1 @ - vshl.i64 $t1,$Xl,#63 - veor $t2, $t2, $t1 @ - veor $Xl#hi,$Xl#hi,$t2#lo @ - veor $Xh#lo,$Xh#lo,$t2#hi - - vshr.u64 $t2,$Xl,#1 @ 2nd phase - veor $Xh,$Xh,$Xl - veor $Xl,$Xl,$t2 @ - vshr.u64 $t2,$t2,#6 - vshr.u64 $Xl,$Xl,#1 @ - veor $Xl,$Xl,$Xh @ - veor $Xl,$Xl,$t2 @ - - subs $len,#16 - bne .Loop_neon - -#ifdef __ARMEL__ - vrev64.8 $Xl,$Xl -#endif - sub $Xi,#16 - vst1.64 $Xl#hi,[$Xi]! @ write out Xi - vst1.64 $Xl#lo,[$Xi] - - ret @ bx lr -.size GFp_gcm_ghash_neon,.-GFp_gcm_ghash_neon -#endif -___ -} -$code.=<<___; -.asciz "GHASH for ARMv4/NEON, CRYPTOGAMS by " -.align 2 -___ - -foreach (split("\n",$code)) { - s/\`([^\`]*)\`/eval $1/geo; - - s/\bq([0-9]+)#(lo|hi)/sprintf "d%d",2*$1+($2 eq "hi")/geo or - s/\bret\b/bx lr/go or - s/\bbx\s+lr\b/.word\t0xe12fff1e/go; # make it possible to compile with -march=armv4 - - print $_,"\n"; -} -close STDOUT or die "error closing STDOUT"; # enforce flush diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/modes/asm/ghashv8-armx.pl temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/modes/asm/ghashv8-armx.pl --- temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/modes/asm/ghashv8-armx.pl 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/modes/asm/ghashv8-armx.pl 1970-01-01 00:00:00.000000000 +0000 @@ -1,432 +0,0 @@ -#! /usr/bin/env perl -# Copyright 2014-2016 The OpenSSL Project Authors. All Rights Reserved. -# -# Licensed under the OpenSSL license (the "License"). You may not use -# this file except in compliance with the License. You can obtain a copy -# in the file LICENSE in the source distribution or at -# https://www.openssl.org/source/license.html - -# -# ==================================================================== -# Written by Andy Polyakov for the OpenSSL -# project. The module is, however, dual licensed under OpenSSL and -# CRYPTOGAMS licenses depending on where you obtain it. For further -# details see http://www.openssl.org/~appro/cryptogams/. -# ==================================================================== -# -# GHASH for ARMv8 Crypto Extension, 64-bit polynomial multiplication. -# -# June 2014 -# Initial version was developed in tight cooperation with Ard Biesheuvel -# of Linaro from bits-n-pieces from other assembly modules. Just like -# aesv8-armx.pl this module supports both AArch32 and AArch64 execution modes. -# -# July 2014 -# Implement 2x aggregated reduction [see ghash-x86.pl for background -# information]. -# -# Current performance in cycles per processed byte: -# -# PMULL[2] 32-bit NEON(*) -# Apple A7 0.92 5.62 -# Cortex-A53 1.01 8.39 -# Cortex-A57 1.17 7.61 -# Denver 0.71 6.02 -# Mongoose 1.10 8.06 -# Kryo 1.16 8.00 -# -# (*) presented for reference/comparison purposes; - -$flavour = shift; -$output = shift; - -$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; -( $xlate="${dir}arm-xlate.pl" and -f $xlate ) or -( $xlate="${dir}../../../perlasm/arm-xlate.pl" and -f $xlate) or -die "can't locate arm-xlate.pl"; - -open OUT,"| \"$^X\" $xlate $flavour $output"; -*STDOUT=*OUT; - -$Xi="x0"; # argument block -$Htbl="x1"; -$inp="x2"; -$len="x3"; - -$inc="x12"; - -{ -my ($Xl,$Xm,$Xh,$IN)=map("q$_",(0..3)); -my ($t0,$t1,$t2,$xC2,$H,$Hhl,$H2)=map("q$_",(8..14)); - -$code=<<___; -#include - -.text -___ -$code.=".arch armv8-a+crypto\n" if ($flavour =~ /64/); -$code.=<<___ if ($flavour !~ /64/); -.fpu neon -.code 32 -#undef __thumb2__ -___ - -################################################################################ -# void GFp_gcm_init_clmul(u128 Htable[16],const u64 H[2]); -# -# input: 128-bit H - secret parameter E(K,0^128) -# output: precomputed table filled with degrees of twisted H; -# H is twisted to handle reverse bitness of GHASH; -# only few of 16 slots of Htable[16] are used; -# data is opaque to outside world (which allows to -# optimize the code independently); -# -$code.=<<___; -.global GFp_gcm_init_clmul -.type GFp_gcm_init_clmul,%function -.align 4 -GFp_gcm_init_clmul: - AARCH64_VALID_CALL_TARGET - vld1.64 {$t1},[x1] @ load input H - vmov.i8 $xC2,#0xe1 - vshl.i64 $xC2,$xC2,#57 @ 0xc2.0 - vext.8 $IN,$t1,$t1,#8 - vshr.u64 $t2,$xC2,#63 - vdup.32 $t1,${t1}[1] - vext.8 $t0,$t2,$xC2,#8 @ t0=0xc2....01 - vshr.u64 $t2,$IN,#63 - vshr.s32 $t1,$t1,#31 @ broadcast carry bit - vand $t2,$t2,$t0 - vshl.i64 $IN,$IN,#1 - vext.8 $t2,$t2,$t2,#8 - vand $t0,$t0,$t1 - vorr $IN,$IN,$t2 @ H<<<=1 - veor $H,$IN,$t0 @ twisted H - vst1.64 {$H},[x0],#16 @ store Htable[0] - - @ calculate H^2 - vext.8 $t0,$H,$H,#8 @ Karatsuba pre-processing - vpmull.p64 $Xl,$H,$H - veor $t0,$t0,$H - vpmull2.p64 $Xh,$H,$H - vpmull.p64 $Xm,$t0,$t0 - - vext.8 $t1,$Xl,$Xh,#8 @ Karatsuba post-processing - veor $t2,$Xl,$Xh - veor $Xm,$Xm,$t1 - veor $Xm,$Xm,$t2 - vpmull.p64 $t2,$Xl,$xC2 @ 1st phase - - vmov $Xh#lo,$Xm#hi @ Xh|Xm - 256-bit result - vmov $Xm#hi,$Xl#lo @ Xm is rotated Xl - veor $Xl,$Xm,$t2 - - vext.8 $t2,$Xl,$Xl,#8 @ 2nd phase - vpmull.p64 $Xl,$Xl,$xC2 - veor $t2,$t2,$Xh - veor $H2,$Xl,$t2 - - vext.8 $t1,$H2,$H2,#8 @ Karatsuba pre-processing - veor $t1,$t1,$H2 - vext.8 $Hhl,$t0,$t1,#8 @ pack Karatsuba pre-processed - vst1.64 {$Hhl-$H2},[x0] @ store Htable[1..2] - - ret -.size GFp_gcm_init_clmul,.-GFp_gcm_init_clmul -___ -################################################################################ -# void GFp_gcm_gmult_clmul(u64 Xi[2],const u128 Htable[16]); -# -# input: Xi - current hash value; -# Htable - table precomputed in GFp_gcm_init_clmul; -# output: Xi - next hash value Xi; -# -$code.=<<___; -.global GFp_gcm_gmult_clmul -.type GFp_gcm_gmult_clmul,%function -.align 4 -GFp_gcm_gmult_clmul: - AARCH64_VALID_CALL_TARGET - vld1.64 {$t1},[$Xi] @ load Xi - vmov.i8 $xC2,#0xe1 - vld1.64 {$H-$Hhl},[$Htbl] @ load twisted H, ... - vshl.u64 $xC2,$xC2,#57 -#ifndef __ARMEB__ - vrev64.8 $t1,$t1 -#endif - vext.8 $IN,$t1,$t1,#8 - - vpmull.p64 $Xl,$H,$IN @ H.lo·Xi.lo - veor $t1,$t1,$IN @ Karatsuba pre-processing - vpmull2.p64 $Xh,$H,$IN @ H.hi·Xi.hi - vpmull.p64 $Xm,$Hhl,$t1 @ (H.lo+H.hi)·(Xi.lo+Xi.hi) - - vext.8 $t1,$Xl,$Xh,#8 @ Karatsuba post-processing - veor $t2,$Xl,$Xh - veor $Xm,$Xm,$t1 - veor $Xm,$Xm,$t2 - vpmull.p64 $t2,$Xl,$xC2 @ 1st phase of reduction - - vmov $Xh#lo,$Xm#hi @ Xh|Xm - 256-bit result - vmov $Xm#hi,$Xl#lo @ Xm is rotated Xl - veor $Xl,$Xm,$t2 - - vext.8 $t2,$Xl,$Xl,#8 @ 2nd phase of reduction - vpmull.p64 $Xl,$Xl,$xC2 - veor $t2,$t2,$Xh - veor $Xl,$Xl,$t2 - -#ifndef __ARMEB__ - vrev64.8 $Xl,$Xl -#endif - vext.8 $Xl,$Xl,$Xl,#8 - vst1.64 {$Xl},[$Xi] @ write out Xi - - ret -.size GFp_gcm_gmult_clmul,.-GFp_gcm_gmult_clmul -___ -################################################################################ -# void GFp_gcm_ghash_clmul(u64 Xi[2], const u128 Htable[16], const u8 *inp, -# size_t len); -# -# input: table precomputed in GFp_gcm_init_clmul; -# current hash value Xi; -# pointer to input data; -# length of input data in bytes, but divisible by block size; -# output: next hash value Xi; -# -$code.=<<___; -.global GFp_gcm_ghash_clmul -.type GFp_gcm_ghash_clmul,%function -.align 4 -GFp_gcm_ghash_clmul: - AARCH64_VALID_CALL_TARGET -___ -$code.=<<___ if ($flavour !~ /64/); - vstmdb sp!,{d8-d15} @ 32-bit ABI says so -___ -$code.=<<___; - vld1.64 {$Xl},[$Xi] @ load [rotated] Xi - @ "[rotated]" means that - @ loaded value would have - @ to be rotated in order to - @ make it appear as in - @ algorithm specification - subs $len,$len,#32 @ see if $len is 32 or larger - mov $inc,#16 @ $inc is used as post- - @ increment for input pointer; - @ as loop is modulo-scheduled - @ $inc is zeroed just in time - @ to preclude overstepping - @ inp[len], which means that - @ last block[s] are actually - @ loaded twice, but last - @ copy is not processed - vld1.64 {$H-$Hhl},[$Htbl],#32 @ load twisted H, ..., H^2 - vmov.i8 $xC2,#0xe1 - vld1.64 {$H2},[$Htbl] - cclr $inc,eq @ is it time to zero $inc? - vext.8 $Xl,$Xl,$Xl,#8 @ rotate Xi - vld1.64 {$t0},[$inp],#16 @ load [rotated] I[0] - vshl.u64 $xC2,$xC2,#57 @ compose 0xc2.0 constant -#ifndef __ARMEB__ - vrev64.8 $t0,$t0 - vrev64.8 $Xl,$Xl -#endif - vext.8 $IN,$t0,$t0,#8 @ rotate I[0] - b.lo .Lodd_tail_v8 @ $len was less than 32 -___ -{ my ($Xln,$Xmn,$Xhn,$In) = map("q$_",(4..7)); - ####### - # Xi+2 =[H*(Ii+1 + Xi+1)] mod P = - # [(H*Ii+1) + (H*Xi+1)] mod P = - # [(H*Ii+1) + H^2*(Ii+Xi)] mod P - # -$code.=<<___; - vld1.64 {$t1},[$inp],$inc @ load [rotated] I[1] -#ifndef __ARMEB__ - vrev64.8 $t1,$t1 -#endif - vext.8 $In,$t1,$t1,#8 - veor $IN,$IN,$Xl @ I[i]^=Xi - vpmull.p64 $Xln,$H,$In @ H·Ii+1 - veor $t1,$t1,$In @ Karatsuba pre-processing - vpmull2.p64 $Xhn,$H,$In - b .Loop_mod2x_v8 - -.align 4 -.Loop_mod2x_v8: - vext.8 $t2,$IN,$IN,#8 - subs $len,$len,#32 @ is there more data? - vpmull.p64 $Xl,$H2,$IN @ H^2.lo·Xi.lo - cclr $inc,lo @ is it time to zero $inc? - - vpmull.p64 $Xmn,$Hhl,$t1 - veor $t2,$t2,$IN @ Karatsuba pre-processing - vpmull2.p64 $Xh,$H2,$IN @ H^2.hi·Xi.hi - veor $Xl,$Xl,$Xln @ accumulate - vpmull2.p64 $Xm,$Hhl,$t2 @ (H^2.lo+H^2.hi)·(Xi.lo+Xi.hi) - vld1.64 {$t0},[$inp],$inc @ load [rotated] I[i+2] - - veor $Xh,$Xh,$Xhn - cclr $inc,eq @ is it time to zero $inc? - veor $Xm,$Xm,$Xmn - - vext.8 $t1,$Xl,$Xh,#8 @ Karatsuba post-processing - veor $t2,$Xl,$Xh - veor $Xm,$Xm,$t1 - vld1.64 {$t1},[$inp],$inc @ load [rotated] I[i+3] -#ifndef __ARMEB__ - vrev64.8 $t0,$t0 -#endif - veor $Xm,$Xm,$t2 - vpmull.p64 $t2,$Xl,$xC2 @ 1st phase of reduction - -#ifndef __ARMEB__ - vrev64.8 $t1,$t1 -#endif - vmov $Xh#lo,$Xm#hi @ Xh|Xm - 256-bit result - vmov $Xm#hi,$Xl#lo @ Xm is rotated Xl - vext.8 $In,$t1,$t1,#8 - vext.8 $IN,$t0,$t0,#8 - veor $Xl,$Xm,$t2 - vpmull.p64 $Xln,$H,$In @ H·Ii+1 - veor $IN,$IN,$Xh @ accumulate $IN early - - vext.8 $t2,$Xl,$Xl,#8 @ 2nd phase of reduction - vpmull.p64 $Xl,$Xl,$xC2 - veor $IN,$IN,$t2 - veor $t1,$t1,$In @ Karatsuba pre-processing - veor $IN,$IN,$Xl - vpmull2.p64 $Xhn,$H,$In - b.hs .Loop_mod2x_v8 @ there was at least 32 more bytes - - veor $Xh,$Xh,$t2 - vext.8 $IN,$t0,$t0,#8 @ re-construct $IN - adds $len,$len,#32 @ re-construct $len - veor $Xl,$Xl,$Xh @ re-construct $Xl - b.eq .Ldone_v8 @ is $len zero? -___ -} -$code.=<<___; -.Lodd_tail_v8: - vext.8 $t2,$Xl,$Xl,#8 - veor $IN,$IN,$Xl @ inp^=Xi - veor $t1,$t0,$t2 @ $t1 is rotated inp^Xi - - vpmull.p64 $Xl,$H,$IN @ H.lo·Xi.lo - veor $t1,$t1,$IN @ Karatsuba pre-processing - vpmull2.p64 $Xh,$H,$IN @ H.hi·Xi.hi - vpmull.p64 $Xm,$Hhl,$t1 @ (H.lo+H.hi)·(Xi.lo+Xi.hi) - - vext.8 $t1,$Xl,$Xh,#8 @ Karatsuba post-processing - veor $t2,$Xl,$Xh - veor $Xm,$Xm,$t1 - veor $Xm,$Xm,$t2 - vpmull.p64 $t2,$Xl,$xC2 @ 1st phase of reduction - - vmov $Xh#lo,$Xm#hi @ Xh|Xm - 256-bit result - vmov $Xm#hi,$Xl#lo @ Xm is rotated Xl - veor $Xl,$Xm,$t2 - - vext.8 $t2,$Xl,$Xl,#8 @ 2nd phase of reduction - vpmull.p64 $Xl,$Xl,$xC2 - veor $t2,$t2,$Xh - veor $Xl,$Xl,$t2 - -.Ldone_v8: -#ifndef __ARMEB__ - vrev64.8 $Xl,$Xl -#endif - vext.8 $Xl,$Xl,$Xl,#8 - vst1.64 {$Xl},[$Xi] @ write out Xi - -___ -$code.=<<___ if ($flavour !~ /64/); - vldmia sp!,{d8-d15} @ 32-bit ABI says so -___ -$code.=<<___; - ret -.size GFp_gcm_ghash_clmul,.-GFp_gcm_ghash_clmul -___ -} -$code.=<<___; -.asciz "GHASH for ARMv8, CRYPTOGAMS by " -.align 2 -___ - -if ($flavour =~ /64/) { ######## 64-bit code - sub unvmov { - my $arg=shift; - - $arg =~ m/q([0-9]+)#(lo|hi),\s*q([0-9]+)#(lo|hi)/o && - sprintf "ins v%d.d[%d],v%d.d[%d]",$1,($2 eq "lo")?0:1,$3,($4 eq "lo")?0:1; - } - foreach(split("\n",$code)) { - s/cclr\s+([wx])([^,]+),\s*([a-z]+)/csel $1$2,$1zr,$1$2,$3/o or - s/vmov\.i8/movi/o or # fix up legacy mnemonics - s/vmov\s+(.*)/unvmov($1)/geo or - s/vext\.8/ext/o or - s/vshr\.s/sshr\.s/o or - s/vshr/ushr/o or - s/^(\s+)v/$1/o or # strip off v prefix - s/\bbx\s+lr\b/ret/o; - - s/\bq([0-9]+)\b/"v".($1<8?$1:$1+8).".16b"/geo; # old->new registers - s/@\s/\/\//o; # old->new style commentary - - # fix up remaining legacy suffixes - s/\.[ui]?8(\s)/$1/o; - s/\.[uis]?32//o and s/\.16b/\.4s/go; - m/\.p64/o and s/\.16b/\.1q/o; # 1st pmull argument - m/l\.p64/o and s/\.16b/\.1d/go; # 2nd and 3rd pmull arguments - s/\.[uisp]?64//o and s/\.16b/\.2d/go; - s/\.[42]([sd])\[([0-3])\]/\.$1\[$2\]/o; - - print $_,"\n"; - } -} else { ######## 32-bit code - sub unvdup32 { - my $arg=shift; - - $arg =~ m/q([0-9]+),\s*q([0-9]+)\[([0-3])\]/o && - sprintf "vdup.32 q%d,d%d[%d]",$1,2*$2+($3>>1),$3&1; - } - sub unvpmullp64 { - my ($mnemonic,$arg)=@_; - - if ($arg =~ m/q([0-9]+),\s*q([0-9]+),\s*q([0-9]+)/o) { - my $word = 0xf2a00e00|(($1&7)<<13)|(($1&8)<<19) - |(($2&7)<<17)|(($2&8)<<4) - |(($3&7)<<1) |(($3&8)<<2); - $word |= 0x00010001 if ($mnemonic =~ "2"); - # since ARMv7 instructions are always encoded little-endian. - # correct solution is to use .inst directive, but older - # assemblers don't implement it:-( - sprintf ".byte\t0x%02x,0x%02x,0x%02x,0x%02x\t@ %s %s", - $word&0xff,($word>>8)&0xff, - ($word>>16)&0xff,($word>>24)&0xff, - $mnemonic,$arg; - } - } - - foreach(split("\n",$code)) { - s/\b[wx]([0-9]+)\b/r$1/go; # new->old registers - s/\bv([0-9])\.[12468]+[bsd]\b/q$1/go; # new->old registers - s/\/\/\s?/@ /o; # new->old style commentary - - # fix up remaining new-style suffixes - s/\],#[0-9]+/]!/o; - - s/cclr\s+([^,]+),\s*([a-z]+)/mov$2 $1,#0/o or - s/vdup\.32\s+(.*)/unvdup32($1)/geo or - s/v?(pmull2?)\.p64\s+(.*)/unvpmullp64($1,$2)/geo or - s/\bq([0-9]+)#(lo|hi)/sprintf "d%d",2*$1+($2 eq "hi")/geo or - s/^(\s+)b\./$1b/o or - s/^(\s+)ret/$1bx\tlr/o; - - print $_,"\n"; - } -} - -close STDOUT or die "error closing STDOUT"; # enforce flush diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/modes/asm/ghash-x86_64.pl temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/modes/asm/ghash-x86_64.pl --- temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/modes/asm/ghash-x86_64.pl 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/modes/asm/ghash-x86_64.pl 1970-01-01 00:00:00.000000000 +0000 @@ -1,1328 +0,0 @@ -#! /usr/bin/env perl -# Copyright 2010-2016 The OpenSSL Project Authors. All Rights Reserved. -# -# Licensed under the OpenSSL license (the "License"). You may not use -# this file except in compliance with the License. You can obtain a copy -# in the file LICENSE in the source distribution or at -# https://www.openssl.org/source/license.html - -# -# ==================================================================== -# Written by Andy Polyakov for the OpenSSL -# project. The module is, however, dual licensed under OpenSSL and -# CRYPTOGAMS licenses depending on where you obtain it. For further -# details see http://www.openssl.org/~appro/cryptogams/. -# ==================================================================== -# -# March, June 2010 -# -# The module implements "4-bit" GCM GHASH function and underlying -# single multiplication operation in GF(2^128). "4-bit" means that -# it uses 256 bytes per-key table [+128 bytes shared table]. GHASH -# function features so called "528B" variant utilizing additional -# 256+16 bytes of per-key storage [+512 bytes shared table]. -# Performance results are for this streamed GHASH subroutine and are -# expressed in cycles per processed byte, less is better: -# -# gcc 3.4.x(*) assembler -# -# P4 28.6 14.0 +100% -# Opteron 19.3 7.7 +150% -# Core2 17.8 8.1(**) +120% -# Atom 31.6 16.8 +88% -# VIA Nano 21.8 10.1 +115% -# -# (*) comparison is not completely fair, because C results are -# for vanilla "256B" implementation, while assembler results -# are for "528B";-) -# (**) it's mystery [to me] why Core2 result is not same as for -# Opteron; - -# May 2010 -# -# Add PCLMULQDQ version performing at 2.02 cycles per processed byte. -# See ghash-x86.pl for background information and details about coding -# techniques. -# -# Special thanks to David Woodhouse for providing access to a -# Westmere-based system on behalf of Intel Open Source Technology Centre. - -# December 2012 -# -# Overhaul: aggregate Karatsuba post-processing, improve ILP in -# reduction_alg9, increase reduction aggregate factor to 4x. As for -# the latter. ghash-x86.pl discusses that it makes lesser sense to -# increase aggregate factor. Then why increase here? Critical path -# consists of 3 independent pclmulqdq instructions, Karatsuba post- -# processing and reduction. "On top" of this we lay down aggregated -# multiplication operations, triplets of independent pclmulqdq's. As -# issue rate for pclmulqdq is limited, it makes lesser sense to -# aggregate more multiplications than it takes to perform remaining -# non-multiplication operations. 2x is near-optimal coefficient for -# contemporary Intel CPUs (therefore modest improvement coefficient), -# but not for Bulldozer. Latter is because logical SIMD operations -# are twice as slow in comparison to Intel, so that critical path is -# longer. A CPU with higher pclmulqdq issue rate would also benefit -# from higher aggregate factor... -# -# Westmere 1.78(+13%) -# Sandy Bridge 1.80(+8%) -# Ivy Bridge 1.80(+7%) -# Haswell 0.55(+93%) (if system doesn't support AVX) -# Broadwell 0.45(+110%)(if system doesn't support AVX) -# Skylake 0.44(+110%)(if system doesn't support AVX) -# Bulldozer 1.49(+27%) -# Silvermont 2.88(+13%) -# Knights L 2.12(-) (if system doesn't support AVX) -# Goldmont 1.08(+24%) - -# March 2013 -# -# ... 8x aggregate factor AVX code path is using reduction algorithm -# suggested by Shay Gueron[1]. Even though contemporary AVX-capable -# CPUs such as Sandy and Ivy Bridge can execute it, the code performs -# sub-optimally in comparison to above mentioned version. But thanks -# to Ilya Albrekht and Max Locktyukhin of Intel Corp. we knew that -# it performs in 0.41 cycles per byte on Haswell processor, in -# 0.29 on Broadwell, and in 0.36 on Skylake. -# -# Knights Landing achieves 1.09 cpb. -# -# [1] http://rt.openssl.org/Ticket/Display.html?id=2900&user=guest&pass=guest - -# This file was patched in BoringSSL to remove the variable-time 4-bit -# implementation. - -$flavour = shift; -$output = shift; -if ($flavour =~ /\./) { $output = $flavour; undef $flavour; } - -$win64=0; $win64=1 if ($flavour =~ /[nm]asm|mingw64/ || $output =~ /\.asm$/); - -$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; -( $xlate="${dir}x86_64-xlate.pl" and -f $xlate ) or -( $xlate="${dir}../../../perlasm/x86_64-xlate.pl" and -f $xlate) or -die "can't locate x86_64-xlate.pl"; - -# See the notes about |$avx| in aesni-gcm-x86_64.pl; otherwise tags will be -# computed incorrectly. -# -# In upstream, this is controlled by shelling out to the compiler to check -# versions, but BoringSSL is intended to be used with pre-generated perlasm -# output, so this isn't useful anyway. -$avx = 1; - -open OUT,"| \"$^X\" \"$xlate\" $flavour \"$output\""; -*STDOUT=*OUT; - -$do4xaggr=1; - - -$code=<<___; -.text -.extern GFp_ia32cap_P -___ - - -###################################################################### -# PCLMULQDQ version. - -@_4args=$win64? ("%rcx","%rdx","%r8", "%r9") : # Win64 order - ("%rdi","%rsi","%rdx","%rcx"); # Unix order - -($Xi,$Xhi)=("%xmm0","%xmm1"); $Hkey="%xmm2"; -($T1,$T2,$T3)=("%xmm3","%xmm4","%xmm5"); - -sub clmul64x64_T2 { # minimal register pressure -my ($Xhi,$Xi,$Hkey,$HK)=@_; - -if (!defined($HK)) { $HK = $T2; -$code.=<<___; - movdqa $Xi,$Xhi # - pshufd \$0b01001110,$Xi,$T1 - pshufd \$0b01001110,$Hkey,$T2 - pxor $Xi,$T1 # - pxor $Hkey,$T2 -___ -} else { -$code.=<<___; - movdqa $Xi,$Xhi # - pshufd \$0b01001110,$Xi,$T1 - pxor $Xi,$T1 # -___ -} -$code.=<<___; - pclmulqdq \$0x00,$Hkey,$Xi ####### - pclmulqdq \$0x11,$Hkey,$Xhi ####### - pclmulqdq \$0x00,$HK,$T1 ####### - pxor $Xi,$T1 # - pxor $Xhi,$T1 # - - movdqa $T1,$T2 # - psrldq \$8,$T1 - pslldq \$8,$T2 # - pxor $T1,$Xhi - pxor $T2,$Xi # -___ -} - -sub reduction_alg9 { # 17/11 times faster than Intel version -my ($Xhi,$Xi) = @_; - -$code.=<<___; - # 1st phase - movdqa $Xi,$T2 # - movdqa $Xi,$T1 - psllq \$5,$Xi - pxor $Xi,$T1 # - psllq \$1,$Xi - pxor $T1,$Xi # - psllq \$57,$Xi # - movdqa $Xi,$T1 # - pslldq \$8,$Xi - psrldq \$8,$T1 # - pxor $T2,$Xi - pxor $T1,$Xhi # - - # 2nd phase - movdqa $Xi,$T2 - psrlq \$1,$Xi - pxor $T2,$Xhi # - pxor $Xi,$T2 - psrlq \$5,$Xi - pxor $T2,$Xi # - psrlq \$1,$Xi # - pxor $Xhi,$Xi # -___ -} - -{ my ($Htbl,$Xip)=@_4args; - my $HK="%xmm6"; - -$code.=<<___; -.globl GFp_gcm_init_clmul -.type GFp_gcm_init_clmul,\@abi-omnipotent -.align 16 -GFp_gcm_init_clmul: -.cfi_startproc -.L_init_clmul: -___ -$code.=<<___ if ($win64); -.LSEH_begin_GFp_gcm_init_clmul: - # I can't trust assembler to use specific encoding:-( - .byte 0x48,0x83,0xec,0x18 #sub $0x18,%rsp - .byte 0x0f,0x29,0x34,0x24 #movaps %xmm6,(%rsp) -___ -$code.=<<___; - movdqu ($Xip),$Hkey - pshufd \$0b01001110,$Hkey,$Hkey # dword swap - - # <<1 twist - pshufd \$0b11111111,$Hkey,$T2 # broadcast uppermost dword - movdqa $Hkey,$T1 - psllq \$1,$Hkey - pxor $T3,$T3 # - psrlq \$63,$T1 - pcmpgtd $T2,$T3 # broadcast carry bit - pslldq \$8,$T1 - por $T1,$Hkey # H<<=1 - - # magic reduction - pand .L0x1c2_polynomial(%rip),$T3 - pxor $T3,$Hkey # if(carry) H^=0x1c2_polynomial - - # calculate H^2 - pshufd \$0b01001110,$Hkey,$HK - movdqa $Hkey,$Xi - pxor $Hkey,$HK -___ - &clmul64x64_T2 ($Xhi,$Xi,$Hkey,$HK); - &reduction_alg9 ($Xhi,$Xi); -$code.=<<___; - pshufd \$0b01001110,$Hkey,$T1 - pshufd \$0b01001110,$Xi,$T2 - pxor $Hkey,$T1 # Karatsuba pre-processing - movdqu $Hkey,0x00($Htbl) # save H - pxor $Xi,$T2 # Karatsuba pre-processing - movdqu $Xi,0x10($Htbl) # save H^2 - palignr \$8,$T1,$T2 # low part is H.lo^H.hi... - movdqu $T2,0x20($Htbl) # save Karatsuba "salt" -___ -if ($do4xaggr) { - &clmul64x64_T2 ($Xhi,$Xi,$Hkey,$HK); # H^3 - &reduction_alg9 ($Xhi,$Xi); -$code.=<<___; - movdqa $Xi,$T3 -___ - &clmul64x64_T2 ($Xhi,$Xi,$Hkey,$HK); # H^4 - &reduction_alg9 ($Xhi,$Xi); -$code.=<<___; - pshufd \$0b01001110,$T3,$T1 - pshufd \$0b01001110,$Xi,$T2 - pxor $T3,$T1 # Karatsuba pre-processing - movdqu $T3,0x30($Htbl) # save H^3 - pxor $Xi,$T2 # Karatsuba pre-processing - movdqu $Xi,0x40($Htbl) # save H^4 - palignr \$8,$T1,$T2 # low part is H^3.lo^H^3.hi... - movdqu $T2,0x50($Htbl) # save Karatsuba "salt" -___ -} -$code.=<<___ if ($win64); - movaps (%rsp),%xmm6 - lea 0x18(%rsp),%rsp -.LSEH_end_GFp_gcm_init_clmul: -___ -$code.=<<___; - ret -.cfi_endproc -.size GFp_gcm_init_clmul,.-GFp_gcm_init_clmul -___ -} - -{ my ($Xip,$Htbl)=@_4args; - -$code.=<<___; -.globl GFp_gcm_gmult_clmul -.type GFp_gcm_gmult_clmul,\@abi-omnipotent -.align 16 -GFp_gcm_gmult_clmul: -.cfi_startproc -.L_gmult_clmul: - movdqu ($Xip),$Xi - movdqa .Lbswap_mask(%rip),$T3 - movdqu ($Htbl),$Hkey - movdqu 0x20($Htbl),$T2 - pshufb $T3,$Xi -___ - &clmul64x64_T2 ($Xhi,$Xi,$Hkey,$T2); -$code.=<<___ if (0 || (&reduction_alg9($Xhi,$Xi)&&0)); - # experimental alternative. special thing about is that there - # no dependency between the two multiplications... - mov \$`0xE1<<1`,%eax - mov \$0xA040608020C0E000,%r10 # ((7..0)·0xE0)&0xff - mov \$0x07,%r11d - movq %rax,$T1 - movq %r10,$T2 - movq %r11,$T3 # borrow $T3 - pand $Xi,$T3 - pshufb $T3,$T2 # ($Xi&7)·0xE0 - movq %rax,$T3 - pclmulqdq \$0x00,$Xi,$T1 # ·(0xE1<<1) - pxor $Xi,$T2 - pslldq \$15,$T2 - paddd $T2,$T2 # <<(64+56+1) - pxor $T2,$Xi - pclmulqdq \$0x01,$T3,$Xi - movdqa .Lbswap_mask(%rip),$T3 # reload $T3 - psrldq \$1,$T1 - pxor $T1,$Xhi - pslldq \$7,$Xi - pxor $Xhi,$Xi -___ -$code.=<<___; - pshufb $T3,$Xi - movdqu $Xi,($Xip) - ret -.cfi_endproc -.size GFp_gcm_gmult_clmul,.-GFp_gcm_gmult_clmul -___ -} - -{ my ($Xip,$Htbl,$inp,$len)=@_4args; - my ($Xln,$Xmn,$Xhn,$Hkey2,$HK) = map("%xmm$_",(3..7)); - my ($T1,$T2,$T3)=map("%xmm$_",(8..10)); - -$code.=<<___; -.globl GFp_gcm_ghash_clmul -.type GFp_gcm_ghash_clmul,\@abi-omnipotent -.align 32 -GFp_gcm_ghash_clmul: -.cfi_startproc -.L_ghash_clmul: -___ -$code.=<<___ if ($win64); - lea -0x88(%rsp),%rax -.LSEH_begin_GFp_gcm_ghash_clmul: - # I can't trust assembler to use specific encoding:-( - .byte 0x48,0x8d,0x60,0xe0 #lea -0x20(%rax),%rsp - .byte 0x0f,0x29,0x70,0xe0 #movaps %xmm6,-0x20(%rax) - .byte 0x0f,0x29,0x78,0xf0 #movaps %xmm7,-0x10(%rax) - .byte 0x44,0x0f,0x29,0x00 #movaps %xmm8,0(%rax) - .byte 0x44,0x0f,0x29,0x48,0x10 #movaps %xmm9,0x10(%rax) - .byte 0x44,0x0f,0x29,0x50,0x20 #movaps %xmm10,0x20(%rax) - .byte 0x44,0x0f,0x29,0x58,0x30 #movaps %xmm11,0x30(%rax) - .byte 0x44,0x0f,0x29,0x60,0x40 #movaps %xmm12,0x40(%rax) - .byte 0x44,0x0f,0x29,0x68,0x50 #movaps %xmm13,0x50(%rax) - .byte 0x44,0x0f,0x29,0x70,0x60 #movaps %xmm14,0x60(%rax) - .byte 0x44,0x0f,0x29,0x78,0x70 #movaps %xmm15,0x70(%rax) -___ -$code.=<<___; - movdqa .Lbswap_mask(%rip),$T3 - - movdqu ($Xip),$Xi - movdqu ($Htbl),$Hkey - movdqu 0x20($Htbl),$HK - pshufb $T3,$Xi - - sub \$0x10,$len - jz .Lodd_tail - - movdqu 0x10($Htbl),$Hkey2 -___ -if ($do4xaggr) { -my ($Xl,$Xm,$Xh,$Hkey3,$Hkey4)=map("%xmm$_",(11..15)); - -$code.=<<___; - leaq GFp_ia32cap_P(%rip),%rax - mov 4(%rax),%eax - cmp \$0x30,$len - jb .Lskip4x - - and \$`1<<26|1<<22`,%eax # isolate MOVBE+XSAVE - cmp \$`1<<22`,%eax # check for MOVBE without XSAVE - je .Lskip4x - - sub \$0x30,$len - mov \$0xA040608020C0E000,%rax # ((7..0)·0xE0)&0xff - movdqu 0x30($Htbl),$Hkey3 - movdqu 0x40($Htbl),$Hkey4 - - ####### - # Xi+4 =[(H*Ii+3) + (H^2*Ii+2) + (H^3*Ii+1) + H^4*(Ii+Xi)] mod P - # - movdqu 0x30($inp),$Xln - movdqu 0x20($inp),$Xl - pshufb $T3,$Xln - pshufb $T3,$Xl - movdqa $Xln,$Xhn - pshufd \$0b01001110,$Xln,$Xmn - pxor $Xln,$Xmn - pclmulqdq \$0x00,$Hkey,$Xln - pclmulqdq \$0x11,$Hkey,$Xhn - pclmulqdq \$0x00,$HK,$Xmn - - movdqa $Xl,$Xh - pshufd \$0b01001110,$Xl,$Xm - pxor $Xl,$Xm - pclmulqdq \$0x00,$Hkey2,$Xl - pclmulqdq \$0x11,$Hkey2,$Xh - pclmulqdq \$0x10,$HK,$Xm - xorps $Xl,$Xln - xorps $Xh,$Xhn - movups 0x50($Htbl),$HK - xorps $Xm,$Xmn - - movdqu 0x10($inp),$Xl - movdqu 0($inp),$T1 - pshufb $T3,$Xl - pshufb $T3,$T1 - movdqa $Xl,$Xh - pshufd \$0b01001110,$Xl,$Xm - pxor $T1,$Xi - pxor $Xl,$Xm - pclmulqdq \$0x00,$Hkey3,$Xl - movdqa $Xi,$Xhi - pshufd \$0b01001110,$Xi,$T1 - pxor $Xi,$T1 - pclmulqdq \$0x11,$Hkey3,$Xh - pclmulqdq \$0x00,$HK,$Xm - xorps $Xl,$Xln - xorps $Xh,$Xhn - - lea 0x40($inp),$inp - sub \$0x40,$len - jc .Ltail4x - - jmp .Lmod4_loop -.align 32 -.Lmod4_loop: - pclmulqdq \$0x00,$Hkey4,$Xi - xorps $Xm,$Xmn - movdqu 0x30($inp),$Xl - pshufb $T3,$Xl - pclmulqdq \$0x11,$Hkey4,$Xhi - xorps $Xln,$Xi - movdqu 0x20($inp),$Xln - movdqa $Xl,$Xh - pclmulqdq \$0x10,$HK,$T1 - pshufd \$0b01001110,$Xl,$Xm - xorps $Xhn,$Xhi - pxor $Xl,$Xm - pshufb $T3,$Xln - movups 0x20($Htbl),$HK - xorps $Xmn,$T1 - pclmulqdq \$0x00,$Hkey,$Xl - pshufd \$0b01001110,$Xln,$Xmn - - pxor $Xi,$T1 # aggregated Karatsuba post-processing - movdqa $Xln,$Xhn - pxor $Xhi,$T1 # - pxor $Xln,$Xmn - movdqa $T1,$T2 # - pclmulqdq \$0x11,$Hkey,$Xh - pslldq \$8,$T1 - psrldq \$8,$T2 # - pxor $T1,$Xi - movdqa .L7_mask(%rip),$T1 - pxor $T2,$Xhi # - movq %rax,$T2 - - pand $Xi,$T1 # 1st phase - pshufb $T1,$T2 # - pxor $Xi,$T2 # - pclmulqdq \$0x00,$HK,$Xm - psllq \$57,$T2 # - movdqa $T2,$T1 # - pslldq \$8,$T2 - pclmulqdq \$0x00,$Hkey2,$Xln - psrldq \$8,$T1 # - pxor $T2,$Xi - pxor $T1,$Xhi # - movdqu 0($inp),$T1 - - movdqa $Xi,$T2 # 2nd phase - psrlq \$1,$Xi - pclmulqdq \$0x11,$Hkey2,$Xhn - xorps $Xl,$Xln - movdqu 0x10($inp),$Xl - pshufb $T3,$Xl - pclmulqdq \$0x10,$HK,$Xmn - xorps $Xh,$Xhn - movups 0x50($Htbl),$HK - pshufb $T3,$T1 - pxor $T2,$Xhi # - pxor $Xi,$T2 - psrlq \$5,$Xi - - movdqa $Xl,$Xh - pxor $Xm,$Xmn - pshufd \$0b01001110,$Xl,$Xm - pxor $T2,$Xi # - pxor $T1,$Xhi - pxor $Xl,$Xm - pclmulqdq \$0x00,$Hkey3,$Xl - psrlq \$1,$Xi # - pxor $Xhi,$Xi # - movdqa $Xi,$Xhi - pclmulqdq \$0x11,$Hkey3,$Xh - xorps $Xl,$Xln - pshufd \$0b01001110,$Xi,$T1 - pxor $Xi,$T1 - - pclmulqdq \$0x00,$HK,$Xm - xorps $Xh,$Xhn - - lea 0x40($inp),$inp - sub \$0x40,$len - jnc .Lmod4_loop - -.Ltail4x: - pclmulqdq \$0x00,$Hkey4,$Xi - pclmulqdq \$0x11,$Hkey4,$Xhi - pclmulqdq \$0x10,$HK,$T1 - xorps $Xm,$Xmn - xorps $Xln,$Xi - xorps $Xhn,$Xhi - pxor $Xi,$Xhi # aggregated Karatsuba post-processing - pxor $Xmn,$T1 - - pxor $Xhi,$T1 # - pxor $Xi,$Xhi - - movdqa $T1,$T2 # - psrldq \$8,$T1 - pslldq \$8,$T2 # - pxor $T1,$Xhi - pxor $T2,$Xi # -___ - &reduction_alg9($Xhi,$Xi); -$code.=<<___; - add \$0x40,$len - jz .Ldone - movdqu 0x20($Htbl),$HK - sub \$0x10,$len - jz .Lodd_tail -.Lskip4x: -___ -} -$code.=<<___; - ####### - # Xi+2 =[H*(Ii+1 + Xi+1)] mod P = - # [(H*Ii+1) + (H*Xi+1)] mod P = - # [(H*Ii+1) + H^2*(Ii+Xi)] mod P - # - movdqu ($inp),$T1 # Ii - movdqu 16($inp),$Xln # Ii+1 - pshufb $T3,$T1 - pshufb $T3,$Xln - pxor $T1,$Xi # Ii+Xi - - movdqa $Xln,$Xhn - pshufd \$0b01001110,$Xln,$Xmn - pxor $Xln,$Xmn - pclmulqdq \$0x00,$Hkey,$Xln - pclmulqdq \$0x11,$Hkey,$Xhn - pclmulqdq \$0x00,$HK,$Xmn - - lea 32($inp),$inp # i+=2 - nop - sub \$0x20,$len - jbe .Leven_tail - nop - jmp .Lmod_loop - -.align 32 -.Lmod_loop: - movdqa $Xi,$Xhi - movdqa $Xmn,$T1 - pshufd \$0b01001110,$Xi,$Xmn # - pxor $Xi,$Xmn # - - pclmulqdq \$0x00,$Hkey2,$Xi - pclmulqdq \$0x11,$Hkey2,$Xhi - pclmulqdq \$0x10,$HK,$Xmn - - pxor $Xln,$Xi # (H*Ii+1) + H^2*(Ii+Xi) - pxor $Xhn,$Xhi - movdqu ($inp),$T2 # Ii - pxor $Xi,$T1 # aggregated Karatsuba post-processing - pshufb $T3,$T2 - movdqu 16($inp),$Xln # Ii+1 - - pxor $Xhi,$T1 - pxor $T2,$Xhi # "Ii+Xi", consume early - pxor $T1,$Xmn - pshufb $T3,$Xln - movdqa $Xmn,$T1 # - psrldq \$8,$T1 - pslldq \$8,$Xmn # - pxor $T1,$Xhi - pxor $Xmn,$Xi # - - movdqa $Xln,$Xhn # - - movdqa $Xi,$T2 # 1st phase - movdqa $Xi,$T1 - psllq \$5,$Xi - pxor $Xi,$T1 # - pclmulqdq \$0x00,$Hkey,$Xln ####### - psllq \$1,$Xi - pxor $T1,$Xi # - psllq \$57,$Xi # - movdqa $Xi,$T1 # - pslldq \$8,$Xi - psrldq \$8,$T1 # - pxor $T2,$Xi - pshufd \$0b01001110,$Xhn,$Xmn - pxor $T1,$Xhi # - pxor $Xhn,$Xmn # - - movdqa $Xi,$T2 # 2nd phase - psrlq \$1,$Xi - pclmulqdq \$0x11,$Hkey,$Xhn ####### - pxor $T2,$Xhi # - pxor $Xi,$T2 - psrlq \$5,$Xi - pxor $T2,$Xi # - lea 32($inp),$inp - psrlq \$1,$Xi # - pclmulqdq \$0x00,$HK,$Xmn ####### - pxor $Xhi,$Xi # - - sub \$0x20,$len - ja .Lmod_loop - -.Leven_tail: - movdqa $Xi,$Xhi - movdqa $Xmn,$T1 - pshufd \$0b01001110,$Xi,$Xmn # - pxor $Xi,$Xmn # - - pclmulqdq \$0x00,$Hkey2,$Xi - pclmulqdq \$0x11,$Hkey2,$Xhi - pclmulqdq \$0x10,$HK,$Xmn - - pxor $Xln,$Xi # (H*Ii+1) + H^2*(Ii+Xi) - pxor $Xhn,$Xhi - pxor $Xi,$T1 - pxor $Xhi,$T1 - pxor $T1,$Xmn - movdqa $Xmn,$T1 # - psrldq \$8,$T1 - pslldq \$8,$Xmn # - pxor $T1,$Xhi - pxor $Xmn,$Xi # -___ - &reduction_alg9 ($Xhi,$Xi); -$code.=<<___; - test $len,$len - jnz .Ldone - -.Lodd_tail: - movdqu ($inp),$T1 # Ii - pshufb $T3,$T1 - pxor $T1,$Xi # Ii+Xi -___ - &clmul64x64_T2 ($Xhi,$Xi,$Hkey,$HK); # H*(Ii+Xi) - &reduction_alg9 ($Xhi,$Xi); -$code.=<<___; -.Ldone: - pshufb $T3,$Xi - movdqu $Xi,($Xip) -___ -$code.=<<___ if ($win64); - movaps (%rsp),%xmm6 - movaps 0x10(%rsp),%xmm7 - movaps 0x20(%rsp),%xmm8 - movaps 0x30(%rsp),%xmm9 - movaps 0x40(%rsp),%xmm10 - movaps 0x50(%rsp),%xmm11 - movaps 0x60(%rsp),%xmm12 - movaps 0x70(%rsp),%xmm13 - movaps 0x80(%rsp),%xmm14 - movaps 0x90(%rsp),%xmm15 - lea 0xa8(%rsp),%rsp -.LSEH_end_GFp_gcm_ghash_clmul: -___ -$code.=<<___; - ret -.cfi_endproc -.size GFp_gcm_ghash_clmul,.-GFp_gcm_ghash_clmul -___ -} - -$code.=<<___; -.globl GFp_gcm_init_avx -.type GFp_gcm_init_avx,\@abi-omnipotent -.align 32 -GFp_gcm_init_avx: -.cfi_startproc -___ -if ($avx) { -my ($Htbl,$Xip)=@_4args; -my $HK="%xmm6"; - -$code.=<<___ if ($win64); -.LSEH_begin_GFp_gcm_init_avx: - # I can't trust assembler to use specific encoding:-( - .byte 0x48,0x83,0xec,0x18 #sub $0x18,%rsp - .byte 0x0f,0x29,0x34,0x24 #movaps %xmm6,(%rsp) -___ -$code.=<<___; - vzeroupper - - vmovdqu ($Xip),$Hkey - vpshufd \$0b01001110,$Hkey,$Hkey # dword swap - - # <<1 twist - vpshufd \$0b11111111,$Hkey,$T2 # broadcast uppermost dword - vpsrlq \$63,$Hkey,$T1 - vpsllq \$1,$Hkey,$Hkey - vpxor $T3,$T3,$T3 # - vpcmpgtd $T2,$T3,$T3 # broadcast carry bit - vpslldq \$8,$T1,$T1 - vpor $T1,$Hkey,$Hkey # H<<=1 - - # magic reduction - vpand .L0x1c2_polynomial(%rip),$T3,$T3 - vpxor $T3,$Hkey,$Hkey # if(carry) H^=0x1c2_polynomial - - vpunpckhqdq $Hkey,$Hkey,$HK - vmovdqa $Hkey,$Xi - vpxor $Hkey,$HK,$HK - mov \$4,%r10 # up to H^8 - jmp .Linit_start_avx -___ - -sub clmul64x64_avx { -my ($Xhi,$Xi,$Hkey,$HK)=@_; - -if (!defined($HK)) { $HK = $T2; -$code.=<<___; - vpunpckhqdq $Xi,$Xi,$T1 - vpunpckhqdq $Hkey,$Hkey,$T2 - vpxor $Xi,$T1,$T1 # - vpxor $Hkey,$T2,$T2 -___ -} else { -$code.=<<___; - vpunpckhqdq $Xi,$Xi,$T1 - vpxor $Xi,$T1,$T1 # -___ -} -$code.=<<___; - vpclmulqdq \$0x11,$Hkey,$Xi,$Xhi ####### - vpclmulqdq \$0x00,$Hkey,$Xi,$Xi ####### - vpclmulqdq \$0x00,$HK,$T1,$T1 ####### - vpxor $Xi,$Xhi,$T2 # - vpxor $T2,$T1,$T1 # - - vpslldq \$8,$T1,$T2 # - vpsrldq \$8,$T1,$T1 - vpxor $T2,$Xi,$Xi # - vpxor $T1,$Xhi,$Xhi -___ -} - -sub reduction_avx { -my ($Xhi,$Xi) = @_; - -$code.=<<___; - vpsllq \$57,$Xi,$T1 # 1st phase - vpsllq \$62,$Xi,$T2 - vpxor $T1,$T2,$T2 # - vpsllq \$63,$Xi,$T1 - vpxor $T1,$T2,$T2 # - vpslldq \$8,$T2,$T1 # - vpsrldq \$8,$T2,$T2 - vpxor $T1,$Xi,$Xi # - vpxor $T2,$Xhi,$Xhi - - vpsrlq \$1,$Xi,$T2 # 2nd phase - vpxor $Xi,$Xhi,$Xhi - vpxor $T2,$Xi,$Xi # - vpsrlq \$5,$T2,$T2 - vpxor $T2,$Xi,$Xi # - vpsrlq \$1,$Xi,$Xi # - vpxor $Xhi,$Xi,$Xi # -___ -} - -$code.=<<___; -.align 32 -.Linit_loop_avx: - vpalignr \$8,$T1,$T2,$T3 # low part is H.lo^H.hi... - vmovdqu $T3,-0x10($Htbl) # save Karatsuba "salt" -___ - &clmul64x64_avx ($Xhi,$Xi,$Hkey,$HK); # calculate H^3,5,7 - &reduction_avx ($Xhi,$Xi); -$code.=<<___; -.Linit_start_avx: - vmovdqa $Xi,$T3 -___ - &clmul64x64_avx ($Xhi,$Xi,$Hkey,$HK); # calculate H^2,4,6,8 - &reduction_avx ($Xhi,$Xi); -$code.=<<___; - vpshufd \$0b01001110,$T3,$T1 - vpshufd \$0b01001110,$Xi,$T2 - vpxor $T3,$T1,$T1 # Karatsuba pre-processing - vmovdqu $T3,0x00($Htbl) # save H^1,3,5,7 - vpxor $Xi,$T2,$T2 # Karatsuba pre-processing - vmovdqu $Xi,0x10($Htbl) # save H^2,4,6,8 - lea 0x30($Htbl),$Htbl - sub \$1,%r10 - jnz .Linit_loop_avx - - vpalignr \$8,$T2,$T1,$T3 # last "salt" is flipped - vmovdqu $T3,-0x10($Htbl) - - vzeroupper -___ -$code.=<<___ if ($win64); - movaps (%rsp),%xmm6 - lea 0x18(%rsp),%rsp -.LSEH_end_GFp_gcm_init_avx: -___ -$code.=<<___; - ret -.cfi_endproc -.size GFp_gcm_init_avx,.-GFp_gcm_init_avx -___ -} else { -$code.=<<___; - jmp .L_init_clmul -.size GFp_gcm_init_avx,.-GFp_gcm_init_avx -___ -} - -$code.=<<___; -.globl GFp_gcm_ghash_avx -.type GFp_gcm_ghash_avx,\@abi-omnipotent -.align 32 -GFp_gcm_ghash_avx: -.cfi_startproc -___ -if ($avx) { -my ($Xip,$Htbl,$inp,$len)=@_4args; -my ($Xlo,$Xhi,$Xmi, - $Zlo,$Zhi,$Zmi, - $Hkey,$HK,$T1,$T2, - $Xi,$Xo,$Tred,$bswap,$Ii,$Ij) = map("%xmm$_",(0..15)); - -$code.=<<___ if ($win64); - lea -0x88(%rsp),%rax -.LSEH_begin_GFp_gcm_ghash_avx: - # I can't trust assembler to use specific encoding:-( - .byte 0x48,0x8d,0x60,0xe0 #lea -0x20(%rax),%rsp - .byte 0x0f,0x29,0x70,0xe0 #movaps %xmm6,-0x20(%rax) - .byte 0x0f,0x29,0x78,0xf0 #movaps %xmm7,-0x10(%rax) - .byte 0x44,0x0f,0x29,0x00 #movaps %xmm8,0(%rax) - .byte 0x44,0x0f,0x29,0x48,0x10 #movaps %xmm9,0x10(%rax) - .byte 0x44,0x0f,0x29,0x50,0x20 #movaps %xmm10,0x20(%rax) - .byte 0x44,0x0f,0x29,0x58,0x30 #movaps %xmm11,0x30(%rax) - .byte 0x44,0x0f,0x29,0x60,0x40 #movaps %xmm12,0x40(%rax) - .byte 0x44,0x0f,0x29,0x68,0x50 #movaps %xmm13,0x50(%rax) - .byte 0x44,0x0f,0x29,0x70,0x60 #movaps %xmm14,0x60(%rax) - .byte 0x44,0x0f,0x29,0x78,0x70 #movaps %xmm15,0x70(%rax) -___ -$code.=<<___; - vzeroupper - - vmovdqu ($Xip),$Xi # load $Xi - lea .L0x1c2_polynomial(%rip),%r10 - lea 0x40($Htbl),$Htbl # size optimization - vmovdqu .Lbswap_mask(%rip),$bswap - vpshufb $bswap,$Xi,$Xi - cmp \$0x80,$len - jb .Lshort_avx - sub \$0x80,$len - - vmovdqu 0x70($inp),$Ii # I[7] - vmovdqu 0x00-0x40($Htbl),$Hkey # $Hkey^1 - vpshufb $bswap,$Ii,$Ii - vmovdqu 0x20-0x40($Htbl),$HK - - vpunpckhqdq $Ii,$Ii,$T2 - vmovdqu 0x60($inp),$Ij # I[6] - vpclmulqdq \$0x00,$Hkey,$Ii,$Xlo - vpxor $Ii,$T2,$T2 - vpshufb $bswap,$Ij,$Ij - vpclmulqdq \$0x11,$Hkey,$Ii,$Xhi - vmovdqu 0x10-0x40($Htbl),$Hkey # $Hkey^2 - vpunpckhqdq $Ij,$Ij,$T1 - vmovdqu 0x50($inp),$Ii # I[5] - vpclmulqdq \$0x00,$HK,$T2,$Xmi - vpxor $Ij,$T1,$T1 - - vpshufb $bswap,$Ii,$Ii - vpclmulqdq \$0x00,$Hkey,$Ij,$Zlo - vpunpckhqdq $Ii,$Ii,$T2 - vpclmulqdq \$0x11,$Hkey,$Ij,$Zhi - vmovdqu 0x30-0x40($Htbl),$Hkey # $Hkey^3 - vpxor $Ii,$T2,$T2 - vmovdqu 0x40($inp),$Ij # I[4] - vpclmulqdq \$0x10,$HK,$T1,$Zmi - vmovdqu 0x50-0x40($Htbl),$HK - - vpshufb $bswap,$Ij,$Ij - vpxor $Xlo,$Zlo,$Zlo - vpclmulqdq \$0x00,$Hkey,$Ii,$Xlo - vpxor $Xhi,$Zhi,$Zhi - vpunpckhqdq $Ij,$Ij,$T1 - vpclmulqdq \$0x11,$Hkey,$Ii,$Xhi - vmovdqu 0x40-0x40($Htbl),$Hkey # $Hkey^4 - vpxor $Xmi,$Zmi,$Zmi - vpclmulqdq \$0x00,$HK,$T2,$Xmi - vpxor $Ij,$T1,$T1 - - vmovdqu 0x30($inp),$Ii # I[3] - vpxor $Zlo,$Xlo,$Xlo - vpclmulqdq \$0x00,$Hkey,$Ij,$Zlo - vpxor $Zhi,$Xhi,$Xhi - vpshufb $bswap,$Ii,$Ii - vpclmulqdq \$0x11,$Hkey,$Ij,$Zhi - vmovdqu 0x60-0x40($Htbl),$Hkey # $Hkey^5 - vpxor $Zmi,$Xmi,$Xmi - vpunpckhqdq $Ii,$Ii,$T2 - vpclmulqdq \$0x10,$HK,$T1,$Zmi - vmovdqu 0x80-0x40($Htbl),$HK - vpxor $Ii,$T2,$T2 - - vmovdqu 0x20($inp),$Ij # I[2] - vpxor $Xlo,$Zlo,$Zlo - vpclmulqdq \$0x00,$Hkey,$Ii,$Xlo - vpxor $Xhi,$Zhi,$Zhi - vpshufb $bswap,$Ij,$Ij - vpclmulqdq \$0x11,$Hkey,$Ii,$Xhi - vmovdqu 0x70-0x40($Htbl),$Hkey # $Hkey^6 - vpxor $Xmi,$Zmi,$Zmi - vpunpckhqdq $Ij,$Ij,$T1 - vpclmulqdq \$0x00,$HK,$T2,$Xmi - vpxor $Ij,$T1,$T1 - - vmovdqu 0x10($inp),$Ii # I[1] - vpxor $Zlo,$Xlo,$Xlo - vpclmulqdq \$0x00,$Hkey,$Ij,$Zlo - vpxor $Zhi,$Xhi,$Xhi - vpshufb $bswap,$Ii,$Ii - vpclmulqdq \$0x11,$Hkey,$Ij,$Zhi - vmovdqu 0x90-0x40($Htbl),$Hkey # $Hkey^7 - vpxor $Zmi,$Xmi,$Xmi - vpunpckhqdq $Ii,$Ii,$T2 - vpclmulqdq \$0x10,$HK,$T1,$Zmi - vmovdqu 0xb0-0x40($Htbl),$HK - vpxor $Ii,$T2,$T2 - - vmovdqu ($inp),$Ij # I[0] - vpxor $Xlo,$Zlo,$Zlo - vpclmulqdq \$0x00,$Hkey,$Ii,$Xlo - vpxor $Xhi,$Zhi,$Zhi - vpshufb $bswap,$Ij,$Ij - vpclmulqdq \$0x11,$Hkey,$Ii,$Xhi - vmovdqu 0xa0-0x40($Htbl),$Hkey # $Hkey^8 - vpxor $Xmi,$Zmi,$Zmi - vpclmulqdq \$0x10,$HK,$T2,$Xmi - - lea 0x80($inp),$inp - cmp \$0x80,$len - jb .Ltail_avx - - vpxor $Xi,$Ij,$Ij # accumulate $Xi - sub \$0x80,$len - jmp .Loop8x_avx - -.align 32 -.Loop8x_avx: - vpunpckhqdq $Ij,$Ij,$T1 - vmovdqu 0x70($inp),$Ii # I[7] - vpxor $Xlo,$Zlo,$Zlo - vpxor $Ij,$T1,$T1 - vpclmulqdq \$0x00,$Hkey,$Ij,$Xi - vpshufb $bswap,$Ii,$Ii - vpxor $Xhi,$Zhi,$Zhi - vpclmulqdq \$0x11,$Hkey,$Ij,$Xo - vmovdqu 0x00-0x40($Htbl),$Hkey # $Hkey^1 - vpunpckhqdq $Ii,$Ii,$T2 - vpxor $Xmi,$Zmi,$Zmi - vpclmulqdq \$0x00,$HK,$T1,$Tred - vmovdqu 0x20-0x40($Htbl),$HK - vpxor $Ii,$T2,$T2 - - vmovdqu 0x60($inp),$Ij # I[6] - vpclmulqdq \$0x00,$Hkey,$Ii,$Xlo - vpxor $Zlo,$Xi,$Xi # collect result - vpshufb $bswap,$Ij,$Ij - vpclmulqdq \$0x11,$Hkey,$Ii,$Xhi - vxorps $Zhi,$Xo,$Xo - vmovdqu 0x10-0x40($Htbl),$Hkey # $Hkey^2 - vpunpckhqdq $Ij,$Ij,$T1 - vpclmulqdq \$0x00,$HK, $T2,$Xmi - vpxor $Zmi,$Tred,$Tred - vxorps $Ij,$T1,$T1 - - vmovdqu 0x50($inp),$Ii # I[5] - vpxor $Xi,$Tred,$Tred # aggregated Karatsuba post-processing - vpclmulqdq \$0x00,$Hkey,$Ij,$Zlo - vpxor $Xo,$Tred,$Tred - vpslldq \$8,$Tred,$T2 - vpxor $Xlo,$Zlo,$Zlo - vpclmulqdq \$0x11,$Hkey,$Ij,$Zhi - vpsrldq \$8,$Tred,$Tred - vpxor $T2, $Xi, $Xi - vmovdqu 0x30-0x40($Htbl),$Hkey # $Hkey^3 - vpshufb $bswap,$Ii,$Ii - vxorps $Tred,$Xo, $Xo - vpxor $Xhi,$Zhi,$Zhi - vpunpckhqdq $Ii,$Ii,$T2 - vpclmulqdq \$0x10,$HK, $T1,$Zmi - vmovdqu 0x50-0x40($Htbl),$HK - vpxor $Ii,$T2,$T2 - vpxor $Xmi,$Zmi,$Zmi - - vmovdqu 0x40($inp),$Ij # I[4] - vpalignr \$8,$Xi,$Xi,$Tred # 1st phase - vpclmulqdq \$0x00,$Hkey,$Ii,$Xlo - vpshufb $bswap,$Ij,$Ij - vpxor $Zlo,$Xlo,$Xlo - vpclmulqdq \$0x11,$Hkey,$Ii,$Xhi - vmovdqu 0x40-0x40($Htbl),$Hkey # $Hkey^4 - vpunpckhqdq $Ij,$Ij,$T1 - vpxor $Zhi,$Xhi,$Xhi - vpclmulqdq \$0x00,$HK, $T2,$Xmi - vxorps $Ij,$T1,$T1 - vpxor $Zmi,$Xmi,$Xmi - - vmovdqu 0x30($inp),$Ii # I[3] - vpclmulqdq \$0x10,(%r10),$Xi,$Xi - vpclmulqdq \$0x00,$Hkey,$Ij,$Zlo - vpshufb $bswap,$Ii,$Ii - vpxor $Xlo,$Zlo,$Zlo - vpclmulqdq \$0x11,$Hkey,$Ij,$Zhi - vmovdqu 0x60-0x40($Htbl),$Hkey # $Hkey^5 - vpunpckhqdq $Ii,$Ii,$T2 - vpxor $Xhi,$Zhi,$Zhi - vpclmulqdq \$0x10,$HK, $T1,$Zmi - vmovdqu 0x80-0x40($Htbl),$HK - vpxor $Ii,$T2,$T2 - vpxor $Xmi,$Zmi,$Zmi - - vmovdqu 0x20($inp),$Ij # I[2] - vpclmulqdq \$0x00,$Hkey,$Ii,$Xlo - vpshufb $bswap,$Ij,$Ij - vpxor $Zlo,$Xlo,$Xlo - vpclmulqdq \$0x11,$Hkey,$Ii,$Xhi - vmovdqu 0x70-0x40($Htbl),$Hkey # $Hkey^6 - vpunpckhqdq $Ij,$Ij,$T1 - vpxor $Zhi,$Xhi,$Xhi - vpclmulqdq \$0x00,$HK, $T2,$Xmi - vpxor $Ij,$T1,$T1 - vpxor $Zmi,$Xmi,$Xmi - vxorps $Tred,$Xi,$Xi - - vmovdqu 0x10($inp),$Ii # I[1] - vpalignr \$8,$Xi,$Xi,$Tred # 2nd phase - vpclmulqdq \$0x00,$Hkey,$Ij,$Zlo - vpshufb $bswap,$Ii,$Ii - vpxor $Xlo,$Zlo,$Zlo - vpclmulqdq \$0x11,$Hkey,$Ij,$Zhi - vmovdqu 0x90-0x40($Htbl),$Hkey # $Hkey^7 - vpclmulqdq \$0x10,(%r10),$Xi,$Xi - vxorps $Xo,$Tred,$Tred - vpunpckhqdq $Ii,$Ii,$T2 - vpxor $Xhi,$Zhi,$Zhi - vpclmulqdq \$0x10,$HK, $T1,$Zmi - vmovdqu 0xb0-0x40($Htbl),$HK - vpxor $Ii,$T2,$T2 - vpxor $Xmi,$Zmi,$Zmi - - vmovdqu ($inp),$Ij # I[0] - vpclmulqdq \$0x00,$Hkey,$Ii,$Xlo - vpshufb $bswap,$Ij,$Ij - vpclmulqdq \$0x11,$Hkey,$Ii,$Xhi - vmovdqu 0xa0-0x40($Htbl),$Hkey # $Hkey^8 - vpxor $Tred,$Ij,$Ij - vpclmulqdq \$0x10,$HK, $T2,$Xmi - vpxor $Xi,$Ij,$Ij # accumulate $Xi - - lea 0x80($inp),$inp - sub \$0x80,$len - jnc .Loop8x_avx - - add \$0x80,$len - jmp .Ltail_no_xor_avx - -.align 32 -.Lshort_avx: - vmovdqu -0x10($inp,$len),$Ii # very last word - lea ($inp,$len),$inp - vmovdqu 0x00-0x40($Htbl),$Hkey # $Hkey^1 - vmovdqu 0x20-0x40($Htbl),$HK - vpshufb $bswap,$Ii,$Ij - - vmovdqa $Xlo,$Zlo # subtle way to zero $Zlo, - vmovdqa $Xhi,$Zhi # $Zhi and - vmovdqa $Xmi,$Zmi # $Zmi - sub \$0x10,$len - jz .Ltail_avx - - vpunpckhqdq $Ij,$Ij,$T1 - vpxor $Xlo,$Zlo,$Zlo - vpclmulqdq \$0x00,$Hkey,$Ij,$Xlo - vpxor $Ij,$T1,$T1 - vmovdqu -0x20($inp),$Ii - vpxor $Xhi,$Zhi,$Zhi - vpclmulqdq \$0x11,$Hkey,$Ij,$Xhi - vmovdqu 0x10-0x40($Htbl),$Hkey # $Hkey^2 - vpshufb $bswap,$Ii,$Ij - vpxor $Xmi,$Zmi,$Zmi - vpclmulqdq \$0x00,$HK,$T1,$Xmi - vpsrldq \$8,$HK,$HK - sub \$0x10,$len - jz .Ltail_avx - - vpunpckhqdq $Ij,$Ij,$T1 - vpxor $Xlo,$Zlo,$Zlo - vpclmulqdq \$0x00,$Hkey,$Ij,$Xlo - vpxor $Ij,$T1,$T1 - vmovdqu -0x30($inp),$Ii - vpxor $Xhi,$Zhi,$Zhi - vpclmulqdq \$0x11,$Hkey,$Ij,$Xhi - vmovdqu 0x30-0x40($Htbl),$Hkey # $Hkey^3 - vpshufb $bswap,$Ii,$Ij - vpxor $Xmi,$Zmi,$Zmi - vpclmulqdq \$0x00,$HK,$T1,$Xmi - vmovdqu 0x50-0x40($Htbl),$HK - sub \$0x10,$len - jz .Ltail_avx - - vpunpckhqdq $Ij,$Ij,$T1 - vpxor $Xlo,$Zlo,$Zlo - vpclmulqdq \$0x00,$Hkey,$Ij,$Xlo - vpxor $Ij,$T1,$T1 - vmovdqu -0x40($inp),$Ii - vpxor $Xhi,$Zhi,$Zhi - vpclmulqdq \$0x11,$Hkey,$Ij,$Xhi - vmovdqu 0x40-0x40($Htbl),$Hkey # $Hkey^4 - vpshufb $bswap,$Ii,$Ij - vpxor $Xmi,$Zmi,$Zmi - vpclmulqdq \$0x00,$HK,$T1,$Xmi - vpsrldq \$8,$HK,$HK - sub \$0x10,$len - jz .Ltail_avx - - vpunpckhqdq $Ij,$Ij,$T1 - vpxor $Xlo,$Zlo,$Zlo - vpclmulqdq \$0x00,$Hkey,$Ij,$Xlo - vpxor $Ij,$T1,$T1 - vmovdqu -0x50($inp),$Ii - vpxor $Xhi,$Zhi,$Zhi - vpclmulqdq \$0x11,$Hkey,$Ij,$Xhi - vmovdqu 0x60-0x40($Htbl),$Hkey # $Hkey^5 - vpshufb $bswap,$Ii,$Ij - vpxor $Xmi,$Zmi,$Zmi - vpclmulqdq \$0x00,$HK,$T1,$Xmi - vmovdqu 0x80-0x40($Htbl),$HK - sub \$0x10,$len - jz .Ltail_avx - - vpunpckhqdq $Ij,$Ij,$T1 - vpxor $Xlo,$Zlo,$Zlo - vpclmulqdq \$0x00,$Hkey,$Ij,$Xlo - vpxor $Ij,$T1,$T1 - vmovdqu -0x60($inp),$Ii - vpxor $Xhi,$Zhi,$Zhi - vpclmulqdq \$0x11,$Hkey,$Ij,$Xhi - vmovdqu 0x70-0x40($Htbl),$Hkey # $Hkey^6 - vpshufb $bswap,$Ii,$Ij - vpxor $Xmi,$Zmi,$Zmi - vpclmulqdq \$0x00,$HK,$T1,$Xmi - vpsrldq \$8,$HK,$HK - sub \$0x10,$len - jz .Ltail_avx - - vpunpckhqdq $Ij,$Ij,$T1 - vpxor $Xlo,$Zlo,$Zlo - vpclmulqdq \$0x00,$Hkey,$Ij,$Xlo - vpxor $Ij,$T1,$T1 - vmovdqu -0x70($inp),$Ii - vpxor $Xhi,$Zhi,$Zhi - vpclmulqdq \$0x11,$Hkey,$Ij,$Xhi - vmovdqu 0x90-0x40($Htbl),$Hkey # $Hkey^7 - vpshufb $bswap,$Ii,$Ij - vpxor $Xmi,$Zmi,$Zmi - vpclmulqdq \$0x00,$HK,$T1,$Xmi - vmovq 0xb8-0x40($Htbl),$HK - sub \$0x10,$len - jmp .Ltail_avx - -.align 32 -.Ltail_avx: - vpxor $Xi,$Ij,$Ij # accumulate $Xi -.Ltail_no_xor_avx: - vpunpckhqdq $Ij,$Ij,$T1 - vpxor $Xlo,$Zlo,$Zlo - vpclmulqdq \$0x00,$Hkey,$Ij,$Xlo - vpxor $Ij,$T1,$T1 - vpxor $Xhi,$Zhi,$Zhi - vpclmulqdq \$0x11,$Hkey,$Ij,$Xhi - vpxor $Xmi,$Zmi,$Zmi - vpclmulqdq \$0x00,$HK,$T1,$Xmi - - vmovdqu (%r10),$Tred - - vpxor $Xlo,$Zlo,$Xi - vpxor $Xhi,$Zhi,$Xo - vpxor $Xmi,$Zmi,$Zmi - - vpxor $Xi, $Zmi,$Zmi # aggregated Karatsuba post-processing - vpxor $Xo, $Zmi,$Zmi - vpslldq \$8, $Zmi,$T2 - vpsrldq \$8, $Zmi,$Zmi - vpxor $T2, $Xi, $Xi - vpxor $Zmi,$Xo, $Xo - - vpclmulqdq \$0x10,$Tred,$Xi,$T2 # 1st phase - vpalignr \$8,$Xi,$Xi,$Xi - vpxor $T2,$Xi,$Xi - - vpclmulqdq \$0x10,$Tred,$Xi,$T2 # 2nd phase - vpalignr \$8,$Xi,$Xi,$Xi - vpxor $Xo,$Xi,$Xi - vpxor $T2,$Xi,$Xi - - cmp \$0,$len - jne .Lshort_avx - - vpshufb $bswap,$Xi,$Xi - vmovdqu $Xi,($Xip) - vzeroupper -___ -$code.=<<___ if ($win64); - movaps (%rsp),%xmm6 - movaps 0x10(%rsp),%xmm7 - movaps 0x20(%rsp),%xmm8 - movaps 0x30(%rsp),%xmm9 - movaps 0x40(%rsp),%xmm10 - movaps 0x50(%rsp),%xmm11 - movaps 0x60(%rsp),%xmm12 - movaps 0x70(%rsp),%xmm13 - movaps 0x80(%rsp),%xmm14 - movaps 0x90(%rsp),%xmm15 - lea 0xa8(%rsp),%rsp -.LSEH_end_GFp_gcm_ghash_avx: -___ -$code.=<<___; - ret -.cfi_endproc -.size GFp_gcm_ghash_avx,.-GFp_gcm_ghash_avx -___ -} else { -$code.=<<___; - jmp .L_ghash_clmul -.size GFp_gcm_ghash_avx,.-GFp_gcm_ghash_avx -___ -} - -$code.=<<___; -.align 64 -.Lbswap_mask: - .byte 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 -.L0x1c2_polynomial: - .byte 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xc2 -.L7_mask: - .long 7,0,7,0 -.align 64 - -.asciz "GHASH for x86_64, CRYPTOGAMS by " -.align 64 -___ - -if ($win64) { -$code.=<<___; -.section .pdata -.align 4 - .rva .LSEH_begin_GFp_gcm_init_clmul - .rva .LSEH_end_GFp_gcm_init_clmul - .rva .LSEH_info_GFp_gcm_init_clmul - - .rva .LSEH_begin_GFp_gcm_ghash_clmul - .rva .LSEH_end_GFp_gcm_ghash_clmul - .rva .LSEH_info_GFp_gcm_ghash_clmul -___ -$code.=<<___ if ($avx); - .rva .LSEH_begin_GFp_gcm_init_avx - .rva .LSEH_end_GFp_gcm_init_avx - .rva .LSEH_info_GFp_gcm_init_clmul - - .rva .LSEH_begin_GFp_gcm_ghash_avx - .rva .LSEH_end_GFp_gcm_ghash_avx - .rva .LSEH_info_GFp_gcm_ghash_clmul -___ -$code.=<<___; -.section .xdata -.align 8 -.LSEH_info_GFp_gcm_init_clmul: - .byte 0x01,0x08,0x03,0x00 - .byte 0x08,0x68,0x00,0x00 #movaps 0x00(rsp),xmm6 - .byte 0x04,0x22,0x00,0x00 #sub rsp,0x18 -.LSEH_info_GFp_gcm_ghash_clmul: - .byte 0x01,0x33,0x16,0x00 - .byte 0x33,0xf8,0x09,0x00 #movaps 0x90(rsp),xmm15 - .byte 0x2e,0xe8,0x08,0x00 #movaps 0x80(rsp),xmm14 - .byte 0x29,0xd8,0x07,0x00 #movaps 0x70(rsp),xmm13 - .byte 0x24,0xc8,0x06,0x00 #movaps 0x60(rsp),xmm12 - .byte 0x1f,0xb8,0x05,0x00 #movaps 0x50(rsp),xmm11 - .byte 0x1a,0xa8,0x04,0x00 #movaps 0x40(rsp),xmm10 - .byte 0x15,0x98,0x03,0x00 #movaps 0x30(rsp),xmm9 - .byte 0x10,0x88,0x02,0x00 #movaps 0x20(rsp),xmm8 - .byte 0x0c,0x78,0x01,0x00 #movaps 0x10(rsp),xmm7 - .byte 0x08,0x68,0x00,0x00 #movaps 0x00(rsp),xmm6 - .byte 0x04,0x01,0x15,0x00 #sub rsp,0xa8 -___ -} - -$code =~ s/\`([^\`]*)\`/eval($1)/gem; - -print $code; - -close STDOUT or die "error closing STDOUT"; diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/modes/asm/ghash-x86.pl temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/modes/asm/ghash-x86.pl --- temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/modes/asm/ghash-x86.pl 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/modes/asm/ghash-x86.pl 1970-01-01 00:00:00.000000000 +0000 @@ -1,714 +0,0 @@ -#! /usr/bin/env perl -# Copyright 2010-2016 The OpenSSL Project Authors. All Rights Reserved. -# -# Licensed under the OpenSSL license (the "License"). You may not use -# this file except in compliance with the License. You can obtain a copy -# in the file LICENSE in the source distribution or at -# https://www.openssl.org/source/license.html - -# -# ==================================================================== -# Written by Andy Polyakov for the OpenSSL -# project. The module is, however, dual licensed under OpenSSL and -# CRYPTOGAMS licenses depending on where you obtain it. For further -# details see http://www.openssl.org/~appro/cryptogams/. -# ==================================================================== -# -# March, May, June 2010 -# -# The module implements "4-bit" GCM GHASH function and underlying -# single multiplication operation in GF(2^128). "4-bit" means that it -# uses 256 bytes per-key table [+64/128 bytes fixed table]. It has two -# code paths: vanilla x86 and vanilla SSE. Former will be executed on -# 486 and Pentium, latter on all others. SSE GHASH features so called -# "528B" variant of "4-bit" method utilizing additional 256+16 bytes -# of per-key storage [+512 bytes shared table]. Performance results -# are for streamed GHASH subroutine and are expressed in cycles per -# processed byte, less is better: -# -# gcc 2.95.3(*) SSE assembler x86 assembler -# -# Pentium 105/111(**) - 50 -# PIII 68 /75 12.2 24 -# P4 125/125 17.8 84(***) -# Opteron 66 /70 10.1 30 -# Core2 54 /67 8.4 18 -# Atom 105/105 16.8 53 -# VIA Nano 69 /71 13.0 27 -# -# (*) gcc 3.4.x was observed to generate few percent slower code, -# which is one of reasons why 2.95.3 results were chosen, -# another reason is lack of 3.4.x results for older CPUs; -# comparison with SSE results is not completely fair, because C -# results are for vanilla "256B" implementation, while -# assembler results are for "528B";-) -# (**) second number is result for code compiled with -fPIC flag, -# which is actually more relevant, because assembler code is -# position-independent; -# (***) see comment in non-MMX routine for further details; -# -# To summarize, it's >2-5 times faster than gcc-generated code. To -# anchor it to something else SHA1 assembler processes one byte in -# ~7 cycles on contemporary x86 cores. As for choice of MMX/SSE -# in particular, see comment at the end of the file... - -# May 2010 -# -# Add PCLMULQDQ version performing at 2.10 cycles per processed byte. -# The question is how close is it to theoretical limit? The pclmulqdq -# instruction latency appears to be 14 cycles and there can't be more -# than 2 of them executing at any given time. This means that single -# Karatsuba multiplication would take 28 cycles *plus* few cycles for -# pre- and post-processing. Then multiplication has to be followed by -# modulo-reduction. Given that aggregated reduction method [see -# "Carry-less Multiplication and Its Usage for Computing the GCM Mode" -# white paper by Intel] allows you to perform reduction only once in -# a while we can assume that asymptotic performance can be estimated -# as (28+Tmod/Naggr)/16, where Tmod is time to perform reduction -# and Naggr is the aggregation factor. -# -# Before we proceed to this implementation let's have closer look at -# the best-performing code suggested by Intel in their white paper. -# By tracing inter-register dependencies Tmod is estimated as ~19 -# cycles and Naggr chosen by Intel is 4, resulting in 2.05 cycles per -# processed byte. As implied, this is quite optimistic estimate, -# because it does not account for Karatsuba pre- and post-processing, -# which for a single multiplication is ~5 cycles. Unfortunately Intel -# does not provide performance data for GHASH alone. But benchmarking -# AES_GCM_encrypt ripped out of Fig. 15 of the white paper with aadt -# alone resulted in 2.46 cycles per byte of out 16KB buffer. Note that -# the result accounts even for pre-computing of degrees of the hash -# key H, but its portion is negligible at 16KB buffer size. -# -# Moving on to the implementation in question. Tmod is estimated as -# ~13 cycles and Naggr is 2, giving asymptotic performance of ... -# 2.16. How is it possible that measured performance is better than -# optimistic theoretical estimate? There is one thing Intel failed -# to recognize. By serializing GHASH with CTR in same subroutine -# former's performance is really limited to above (Tmul + Tmod/Naggr) -# equation. But if GHASH procedure is detached, the modulo-reduction -# can be interleaved with Naggr-1 multiplications at instruction level -# and under ideal conditions even disappear from the equation. So that -# optimistic theoretical estimate for this implementation is ... -# 28/16=1.75, and not 2.16. Well, it's probably way too optimistic, -# at least for such small Naggr. I'd argue that (28+Tproc/Naggr), -# where Tproc is time required for Karatsuba pre- and post-processing, -# is more realistic estimate. In this case it gives ... 1.91 cycles. -# Or in other words, depending on how well we can interleave reduction -# and one of the two multiplications the performance should be between -# 1.91 and 2.16. As already mentioned, this implementation processes -# one byte out of 8KB buffer in 2.10 cycles, while x86_64 counterpart -# - in 2.02. x86_64 performance is better, because larger register -# bank allows to interleave reduction and multiplication better. -# -# Does it make sense to increase Naggr? To start with it's virtually -# impossible in 32-bit mode, because of limited register bank -# capacity. Otherwise improvement has to be weighed against slower -# setup, as well as code size and complexity increase. As even -# optimistic estimate doesn't promise 30% performance improvement, -# there are currently no plans to increase Naggr. -# -# Special thanks to David Woodhouse for providing access to a -# Westmere-based system on behalf of Intel Open Source Technology Centre. - -# January 2010 -# -# Tweaked to optimize transitions between integer and FP operations -# on same XMM register, PCLMULQDQ subroutine was measured to process -# one byte in 2.07 cycles on Sandy Bridge, and in 2.12 - on Westmere. -# The minor regression on Westmere is outweighed by ~15% improvement -# on Sandy Bridge. Strangely enough attempt to modify 64-bit code in -# similar manner resulted in almost 20% degradation on Sandy Bridge, -# where original 64-bit code processes one byte in 1.95 cycles. - -##################################################################### -# For reference, AMD Bulldozer processes one byte in 1.98 cycles in -# 32-bit mode and 1.89 in 64-bit. - -# February 2013 -# -# Overhaul: aggregate Karatsuba post-processing, improve ILP in -# reduction_alg9. Resulting performance is 1.96 cycles per byte on -# Westmere, 1.95 - on Sandy/Ivy Bridge, 1.76 - on Bulldozer. - -$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; -push(@INC,"${dir}","${dir}../../../perlasm"); -require "x86asm.pl"; - -$output=pop; -open STDOUT,">$output"; - -&asm_init($ARGV[0],$x86only = $ARGV[$#ARGV] eq "386"); - -$sse2=1; - - -if ($sse2) {{ -###################################################################### -# PCLMULQDQ version. - -$Xip="eax"; -$Htbl="edx"; -$const="ecx"; -$inp="esi"; -$len="ebx"; - -($Xi,$Xhi)=("xmm0","xmm1"); $Hkey="xmm2"; -($T1,$T2,$T3)=("xmm3","xmm4","xmm5"); -($Xn,$Xhn)=("xmm6","xmm7"); - -&static_label("bswap"); - -sub clmul64x64_T2 { # minimal "register" pressure -my ($Xhi,$Xi,$Hkey,$HK)=@_; - - &movdqa ($Xhi,$Xi); # - &pshufd ($T1,$Xi,0b01001110); - &pshufd ($T2,$Hkey,0b01001110) if (!defined($HK)); - &pxor ($T1,$Xi); # - &pxor ($T2,$Hkey) if (!defined($HK)); - $HK=$T2 if (!defined($HK)); - - &pclmulqdq ($Xi,$Hkey,0x00); ####### - &pclmulqdq ($Xhi,$Hkey,0x11); ####### - &pclmulqdq ($T1,$HK,0x00); ####### - &xorps ($T1,$Xi); # - &xorps ($T1,$Xhi); # - - &movdqa ($T2,$T1); # - &psrldq ($T1,8); - &pslldq ($T2,8); # - &pxor ($Xhi,$T1); - &pxor ($Xi,$T2); # -} - -sub clmul64x64_T3 { -# Even though this subroutine offers visually better ILP, it -# was empirically found to be a tad slower than above version. -# At least in GFp_gcm_ghash_clmul context. But it's just as well, -# because loop modulo-scheduling is possible only thanks to -# minimized "register" pressure... -my ($Xhi,$Xi,$Hkey)=@_; - - &movdqa ($T1,$Xi); # - &movdqa ($Xhi,$Xi); - &pclmulqdq ($Xi,$Hkey,0x00); ####### - &pclmulqdq ($Xhi,$Hkey,0x11); ####### - &pshufd ($T2,$T1,0b01001110); # - &pshufd ($T3,$Hkey,0b01001110); - &pxor ($T2,$T1); # - &pxor ($T3,$Hkey); - &pclmulqdq ($T2,$T3,0x00); ####### - &pxor ($T2,$Xi); # - &pxor ($T2,$Xhi); # - - &movdqa ($T3,$T2); # - &psrldq ($T2,8); - &pslldq ($T3,8); # - &pxor ($Xhi,$T2); - &pxor ($Xi,$T3); # -} - -if (1) { # Algorithm 9 with <<1 twist. - # Reduction is shorter and uses only two - # temporary registers, which makes it better - # candidate for interleaving with 64x64 - # multiplication. Pre-modulo-scheduled loop - # was found to be ~20% faster than Algorithm 5 - # below. Algorithm 9 was therefore chosen for - # further optimization... - -sub reduction_alg9 { # 17/11 times faster than Intel version -my ($Xhi,$Xi) = @_; - - # 1st phase - &movdqa ($T2,$Xi); # - &movdqa ($T1,$Xi); - &psllq ($Xi,5); - &pxor ($T1,$Xi); # - &psllq ($Xi,1); - &pxor ($Xi,$T1); # - &psllq ($Xi,57); # - &movdqa ($T1,$Xi); # - &pslldq ($Xi,8); - &psrldq ($T1,8); # - &pxor ($Xi,$T2); - &pxor ($Xhi,$T1); # - - # 2nd phase - &movdqa ($T2,$Xi); - &psrlq ($Xi,1); - &pxor ($Xhi,$T2); # - &pxor ($T2,$Xi); - &psrlq ($Xi,5); - &pxor ($Xi,$T2); # - &psrlq ($Xi,1); # - &pxor ($Xi,$Xhi) # -} - -&function_begin_B("GFp_gcm_init_clmul"); - &mov ($Htbl,&wparam(0)); - &mov ($Xip,&wparam(1)); - - &call (&label("pic")); -&set_label("pic"); - &blindpop ($const); - &lea ($const,&DWP(&label("bswap")."-".&label("pic"),$const)); - - &movdqu ($Hkey,&QWP(0,$Xip)); - &pshufd ($Hkey,$Hkey,0b01001110);# dword swap - - # <<1 twist - &pshufd ($T2,$Hkey,0b11111111); # broadcast uppermost dword - &movdqa ($T1,$Hkey); - &psllq ($Hkey,1); - &pxor ($T3,$T3); # - &psrlq ($T1,63); - &pcmpgtd ($T3,$T2); # broadcast carry bit - &pslldq ($T1,8); - &por ($Hkey,$T1); # H<<=1 - - # magic reduction - &pand ($T3,&QWP(16,$const)); # 0x1c2_polynomial - &pxor ($Hkey,$T3); # if(carry) H^=0x1c2_polynomial - - # calculate H^2 - &movdqa ($Xi,$Hkey); - &clmul64x64_T2 ($Xhi,$Xi,$Hkey); - &reduction_alg9 ($Xhi,$Xi); - - &pshufd ($T1,$Hkey,0b01001110); - &pshufd ($T2,$Xi,0b01001110); - &pxor ($T1,$Hkey); # Karatsuba pre-processing - &movdqu (&QWP(0,$Htbl),$Hkey); # save H - &pxor ($T2,$Xi); # Karatsuba pre-processing - &movdqu (&QWP(16,$Htbl),$Xi); # save H^2 - &palignr ($T2,$T1,8); # low part is H.lo^H.hi - &movdqu (&QWP(32,$Htbl),$T2); # save Karatsuba "salt" - - &ret (); -&function_end_B("GFp_gcm_init_clmul"); - -&function_begin_B("GFp_gcm_gmult_clmul"); - &mov ($Xip,&wparam(0)); - &mov ($Htbl,&wparam(1)); - - &call (&label("pic")); -&set_label("pic"); - &blindpop ($const); - &lea ($const,&DWP(&label("bswap")."-".&label("pic"),$const)); - - &movdqu ($Xi,&QWP(0,$Xip)); - &movdqa ($T3,&QWP(0,$const)); - &movups ($Hkey,&QWP(0,$Htbl)); - &pshufb ($Xi,$T3); - &movups ($T2,&QWP(32,$Htbl)); - - &clmul64x64_T2 ($Xhi,$Xi,$Hkey,$T2); - &reduction_alg9 ($Xhi,$Xi); - - &pshufb ($Xi,$T3); - &movdqu (&QWP(0,$Xip),$Xi); - - &ret (); -&function_end_B("GFp_gcm_gmult_clmul"); - -&function_begin("GFp_gcm_ghash_clmul"); - &mov ($Xip,&wparam(0)); - &mov ($Htbl,&wparam(1)); - &mov ($inp,&wparam(2)); - &mov ($len,&wparam(3)); - - &call (&label("pic")); -&set_label("pic"); - &blindpop ($const); - &lea ($const,&DWP(&label("bswap")."-".&label("pic"),$const)); - - &movdqu ($Xi,&QWP(0,$Xip)); - &movdqa ($T3,&QWP(0,$const)); - &movdqu ($Hkey,&QWP(0,$Htbl)); - &pshufb ($Xi,$T3); - - &sub ($len,0x10); - &jz (&label("odd_tail")); - - ####### - # Xi+2 =[H*(Ii+1 + Xi+1)] mod P = - # [(H*Ii+1) + (H*Xi+1)] mod P = - # [(H*Ii+1) + H^2*(Ii+Xi)] mod P - # - &movdqu ($T1,&QWP(0,$inp)); # Ii - &movdqu ($Xn,&QWP(16,$inp)); # Ii+1 - &pshufb ($T1,$T3); - &pshufb ($Xn,$T3); - &movdqu ($T3,&QWP(32,$Htbl)); - &pxor ($Xi,$T1); # Ii+Xi - - &pshufd ($T1,$Xn,0b01001110); # H*Ii+1 - &movdqa ($Xhn,$Xn); - &pxor ($T1,$Xn); # - &lea ($inp,&DWP(32,$inp)); # i+=2 - - &pclmulqdq ($Xn,$Hkey,0x00); ####### - &pclmulqdq ($Xhn,$Hkey,0x11); ####### - &pclmulqdq ($T1,$T3,0x00); ####### - &movups ($Hkey,&QWP(16,$Htbl)); # load H^2 - &nop (); - - &sub ($len,0x20); - &jbe (&label("even_tail")); - &jmp (&label("mod_loop")); - -&set_label("mod_loop",32); - &pshufd ($T2,$Xi,0b01001110); # H^2*(Ii+Xi) - &movdqa ($Xhi,$Xi); - &pxor ($T2,$Xi); # - &nop (); - - &pclmulqdq ($Xi,$Hkey,0x00); ####### - &pclmulqdq ($Xhi,$Hkey,0x11); ####### - &pclmulqdq ($T2,$T3,0x10); ####### - &movups ($Hkey,&QWP(0,$Htbl)); # load H - - &xorps ($Xi,$Xn); # (H*Ii+1) + H^2*(Ii+Xi) - &movdqa ($T3,&QWP(0,$const)); - &xorps ($Xhi,$Xhn); - &movdqu ($Xhn,&QWP(0,$inp)); # Ii - &pxor ($T1,$Xi); # aggregated Karatsuba post-processing - &movdqu ($Xn,&QWP(16,$inp)); # Ii+1 - &pxor ($T1,$Xhi); # - - &pshufb ($Xhn,$T3); - &pxor ($T2,$T1); # - - &movdqa ($T1,$T2); # - &psrldq ($T2,8); - &pslldq ($T1,8); # - &pxor ($Xhi,$T2); - &pxor ($Xi,$T1); # - &pshufb ($Xn,$T3); - &pxor ($Xhi,$Xhn); # "Ii+Xi", consume early - - &movdqa ($Xhn,$Xn); #&clmul64x64_TX ($Xhn,$Xn,$Hkey); H*Ii+1 - &movdqa ($T2,$Xi); #&reduction_alg9($Xhi,$Xi); 1st phase - &movdqa ($T1,$Xi); - &psllq ($Xi,5); - &pxor ($T1,$Xi); # - &psllq ($Xi,1); - &pxor ($Xi,$T1); # - &pclmulqdq ($Xn,$Hkey,0x00); ####### - &movups ($T3,&QWP(32,$Htbl)); - &psllq ($Xi,57); # - &movdqa ($T1,$Xi); # - &pslldq ($Xi,8); - &psrldq ($T1,8); # - &pxor ($Xi,$T2); - &pxor ($Xhi,$T1); # - &pshufd ($T1,$Xhn,0b01001110); - &movdqa ($T2,$Xi); # 2nd phase - &psrlq ($Xi,1); - &pxor ($T1,$Xhn); - &pxor ($Xhi,$T2); # - &pclmulqdq ($Xhn,$Hkey,0x11); ####### - &movups ($Hkey,&QWP(16,$Htbl)); # load H^2 - &pxor ($T2,$Xi); - &psrlq ($Xi,5); - &pxor ($Xi,$T2); # - &psrlq ($Xi,1); # - &pxor ($Xi,$Xhi) # - &pclmulqdq ($T1,$T3,0x00); ####### - - &lea ($inp,&DWP(32,$inp)); - &sub ($len,0x20); - &ja (&label("mod_loop")); - -&set_label("even_tail"); - &pshufd ($T2,$Xi,0b01001110); # H^2*(Ii+Xi) - &movdqa ($Xhi,$Xi); - &pxor ($T2,$Xi); # - - &pclmulqdq ($Xi,$Hkey,0x00); ####### - &pclmulqdq ($Xhi,$Hkey,0x11); ####### - &pclmulqdq ($T2,$T3,0x10); ####### - &movdqa ($T3,&QWP(0,$const)); - - &xorps ($Xi,$Xn); # (H*Ii+1) + H^2*(Ii+Xi) - &xorps ($Xhi,$Xhn); - &pxor ($T1,$Xi); # aggregated Karatsuba post-processing - &pxor ($T1,$Xhi); # - - &pxor ($T2,$T1); # - - &movdqa ($T1,$T2); # - &psrldq ($T2,8); - &pslldq ($T1,8); # - &pxor ($Xhi,$T2); - &pxor ($Xi,$T1); # - - &reduction_alg9 ($Xhi,$Xi); - - &test ($len,$len); - &jnz (&label("done")); - - &movups ($Hkey,&QWP(0,$Htbl)); # load H -&set_label("odd_tail"); - &movdqu ($T1,&QWP(0,$inp)); # Ii - &pshufb ($T1,$T3); - &pxor ($Xi,$T1); # Ii+Xi - - &clmul64x64_T2 ($Xhi,$Xi,$Hkey); # H*(Ii+Xi) - &reduction_alg9 ($Xhi,$Xi); - -&set_label("done"); - &pshufb ($Xi,$T3); - &movdqu (&QWP(0,$Xip),$Xi); -&function_end("GFp_gcm_ghash_clmul"); - -} else { # Algorithm 5. Kept for reference purposes. - -sub reduction_alg5 { # 19/16 times faster than Intel version -my ($Xhi,$Xi)=@_; - - # <<1 - &movdqa ($T1,$Xi); # - &movdqa ($T2,$Xhi); - &pslld ($Xi,1); - &pslld ($Xhi,1); # - &psrld ($T1,31); - &psrld ($T2,31); # - &movdqa ($T3,$T1); - &pslldq ($T1,4); - &psrldq ($T3,12); # - &pslldq ($T2,4); - &por ($Xhi,$T3); # - &por ($Xi,$T1); - &por ($Xhi,$T2); # - - # 1st phase - &movdqa ($T1,$Xi); - &movdqa ($T2,$Xi); - &movdqa ($T3,$Xi); # - &pslld ($T1,31); - &pslld ($T2,30); - &pslld ($Xi,25); # - &pxor ($T1,$T2); - &pxor ($T1,$Xi); # - &movdqa ($T2,$T1); # - &pslldq ($T1,12); - &psrldq ($T2,4); # - &pxor ($T3,$T1); - - # 2nd phase - &pxor ($Xhi,$T3); # - &movdqa ($Xi,$T3); - &movdqa ($T1,$T3); - &psrld ($Xi,1); # - &psrld ($T1,2); - &psrld ($T3,7); # - &pxor ($Xi,$T1); - &pxor ($Xhi,$T2); - &pxor ($Xi,$T3); # - &pxor ($Xi,$Xhi); # -} - -&function_begin_B("GFp_gcm_init_clmul"); - &mov ($Htbl,&wparam(0)); - &mov ($Xip,&wparam(1)); - - &call (&label("pic")); -&set_label("pic"); - &blindpop ($const); - &lea ($const,&DWP(&label("bswap")."-".&label("pic"),$const)); - - &movdqu ($Hkey,&QWP(0,$Xip)); - &pshufd ($Hkey,$Hkey,0b01001110);# dword swap - - # calculate H^2 - &movdqa ($Xi,$Hkey); - &clmul64x64_T3 ($Xhi,$Xi,$Hkey); - &reduction_alg5 ($Xhi,$Xi); - - &movdqu (&QWP(0,$Htbl),$Hkey); # save H - &movdqu (&QWP(16,$Htbl),$Xi); # save H^2 - - &ret (); -&function_end_B("GFp_gcm_init_clmul"); - -&function_begin_B("GFp_gcm_gmult_clmul"); - &mov ($Xip,&wparam(0)); - &mov ($Htbl,&wparam(1)); - - &call (&label("pic")); -&set_label("pic"); - &blindpop ($const); - &lea ($const,&DWP(&label("bswap")."-".&label("pic"),$const)); - - &movdqu ($Xi,&QWP(0,$Xip)); - &movdqa ($Xn,&QWP(0,$const)); - &movdqu ($Hkey,&QWP(0,$Htbl)); - &pshufb ($Xi,$Xn); - - &clmul64x64_T3 ($Xhi,$Xi,$Hkey); - &reduction_alg5 ($Xhi,$Xi); - - &pshufb ($Xi,$Xn); - &movdqu (&QWP(0,$Xip),$Xi); - - &ret (); -&function_end_B("GFp_gcm_gmult_clmul"); - -&function_begin("GFp_gcm_ghash_clmul"); - &mov ($Xip,&wparam(0)); - &mov ($Htbl,&wparam(1)); - &mov ($inp,&wparam(2)); - &mov ($len,&wparam(3)); - - &call (&label("pic")); -&set_label("pic"); - &blindpop ($const); - &lea ($const,&DWP(&label("bswap")."-".&label("pic"),$const)); - - &movdqu ($Xi,&QWP(0,$Xip)); - &movdqa ($T3,&QWP(0,$const)); - &movdqu ($Hkey,&QWP(0,$Htbl)); - &pshufb ($Xi,$T3); - - &sub ($len,0x10); - &jz (&label("odd_tail")); - - ####### - # Xi+2 =[H*(Ii+1 + Xi+1)] mod P = - # [(H*Ii+1) + (H*Xi+1)] mod P = - # [(H*Ii+1) + H^2*(Ii+Xi)] mod P - # - &movdqu ($T1,&QWP(0,$inp)); # Ii - &movdqu ($Xn,&QWP(16,$inp)); # Ii+1 - &pshufb ($T1,$T3); - &pshufb ($Xn,$T3); - &pxor ($Xi,$T1); # Ii+Xi - - &clmul64x64_T3 ($Xhn,$Xn,$Hkey); # H*Ii+1 - &movdqu ($Hkey,&QWP(16,$Htbl)); # load H^2 - - &sub ($len,0x20); - &lea ($inp,&DWP(32,$inp)); # i+=2 - &jbe (&label("even_tail")); - -&set_label("mod_loop"); - &clmul64x64_T3 ($Xhi,$Xi,$Hkey); # H^2*(Ii+Xi) - &movdqu ($Hkey,&QWP(0,$Htbl)); # load H - - &pxor ($Xi,$Xn); # (H*Ii+1) + H^2*(Ii+Xi) - &pxor ($Xhi,$Xhn); - - &reduction_alg5 ($Xhi,$Xi); - - ####### - &movdqa ($T3,&QWP(0,$const)); - &movdqu ($T1,&QWP(0,$inp)); # Ii - &movdqu ($Xn,&QWP(16,$inp)); # Ii+1 - &pshufb ($T1,$T3); - &pshufb ($Xn,$T3); - &pxor ($Xi,$T1); # Ii+Xi - - &clmul64x64_T3 ($Xhn,$Xn,$Hkey); # H*Ii+1 - &movdqu ($Hkey,&QWP(16,$Htbl)); # load H^2 - - &sub ($len,0x20); - &lea ($inp,&DWP(32,$inp)); - &ja (&label("mod_loop")); - -&set_label("even_tail"); - &clmul64x64_T3 ($Xhi,$Xi,$Hkey); # H^2*(Ii+Xi) - - &pxor ($Xi,$Xn); # (H*Ii+1) + H^2*(Ii+Xi) - &pxor ($Xhi,$Xhn); - - &reduction_alg5 ($Xhi,$Xi); - - &movdqa ($T3,&QWP(0,$const)); - &test ($len,$len); - &jnz (&label("done")); - - &movdqu ($Hkey,&QWP(0,$Htbl)); # load H -&set_label("odd_tail"); - &movdqu ($T1,&QWP(0,$inp)); # Ii - &pshufb ($T1,$T3); - &pxor ($Xi,$T1); # Ii+Xi - - &clmul64x64_T3 ($Xhi,$Xi,$Hkey); # H*(Ii+Xi) - &reduction_alg5 ($Xhi,$Xi); - - &movdqa ($T3,&QWP(0,$const)); -&set_label("done"); - &pshufb ($Xi,$T3); - &movdqu (&QWP(0,$Xip),$Xi); -&function_end("GFp_gcm_ghash_clmul"); - -} - -&set_label("bswap",64); - &data_byte(15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0); - &data_byte(1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xc2); # 0x1c2_polynomial -&set_label("rem_8bit",64); - &data_short(0x0000,0x01C2,0x0384,0x0246,0x0708,0x06CA,0x048C,0x054E); - &data_short(0x0E10,0x0FD2,0x0D94,0x0C56,0x0918,0x08DA,0x0A9C,0x0B5E); - &data_short(0x1C20,0x1DE2,0x1FA4,0x1E66,0x1B28,0x1AEA,0x18AC,0x196E); - &data_short(0x1230,0x13F2,0x11B4,0x1076,0x1538,0x14FA,0x16BC,0x177E); - &data_short(0x3840,0x3982,0x3BC4,0x3A06,0x3F48,0x3E8A,0x3CCC,0x3D0E); - &data_short(0x3650,0x3792,0x35D4,0x3416,0x3158,0x309A,0x32DC,0x331E); - &data_short(0x2460,0x25A2,0x27E4,0x2626,0x2368,0x22AA,0x20EC,0x212E); - &data_short(0x2A70,0x2BB2,0x29F4,0x2836,0x2D78,0x2CBA,0x2EFC,0x2F3E); - &data_short(0x7080,0x7142,0x7304,0x72C6,0x7788,0x764A,0x740C,0x75CE); - &data_short(0x7E90,0x7F52,0x7D14,0x7CD6,0x7998,0x785A,0x7A1C,0x7BDE); - &data_short(0x6CA0,0x6D62,0x6F24,0x6EE6,0x6BA8,0x6A6A,0x682C,0x69EE); - &data_short(0x62B0,0x6372,0x6134,0x60F6,0x65B8,0x647A,0x663C,0x67FE); - &data_short(0x48C0,0x4902,0x4B44,0x4A86,0x4FC8,0x4E0A,0x4C4C,0x4D8E); - &data_short(0x46D0,0x4712,0x4554,0x4496,0x41D8,0x401A,0x425C,0x439E); - &data_short(0x54E0,0x5522,0x5764,0x56A6,0x53E8,0x522A,0x506C,0x51AE); - &data_short(0x5AF0,0x5B32,0x5974,0x58B6,0x5DF8,0x5C3A,0x5E7C,0x5FBE); - &data_short(0xE100,0xE0C2,0xE284,0xE346,0xE608,0xE7CA,0xE58C,0xE44E); - &data_short(0xEF10,0xEED2,0xEC94,0xED56,0xE818,0xE9DA,0xEB9C,0xEA5E); - &data_short(0xFD20,0xFCE2,0xFEA4,0xFF66,0xFA28,0xFBEA,0xF9AC,0xF86E); - &data_short(0xF330,0xF2F2,0xF0B4,0xF176,0xF438,0xF5FA,0xF7BC,0xF67E); - &data_short(0xD940,0xD882,0xDAC4,0xDB06,0xDE48,0xDF8A,0xDDCC,0xDC0E); - &data_short(0xD750,0xD692,0xD4D4,0xD516,0xD058,0xD19A,0xD3DC,0xD21E); - &data_short(0xC560,0xC4A2,0xC6E4,0xC726,0xC268,0xC3AA,0xC1EC,0xC02E); - &data_short(0xCB70,0xCAB2,0xC8F4,0xC936,0xCC78,0xCDBA,0xCFFC,0xCE3E); - &data_short(0x9180,0x9042,0x9204,0x93C6,0x9688,0x974A,0x950C,0x94CE); - &data_short(0x9F90,0x9E52,0x9C14,0x9DD6,0x9898,0x995A,0x9B1C,0x9ADE); - &data_short(0x8DA0,0x8C62,0x8E24,0x8FE6,0x8AA8,0x8B6A,0x892C,0x88EE); - &data_short(0x83B0,0x8272,0x8034,0x81F6,0x84B8,0x857A,0x873C,0x86FE); - &data_short(0xA9C0,0xA802,0xAA44,0xAB86,0xAEC8,0xAF0A,0xAD4C,0xAC8E); - &data_short(0xA7D0,0xA612,0xA454,0xA596,0xA0D8,0xA11A,0xA35C,0xA29E); - &data_short(0xB5E0,0xB422,0xB664,0xB7A6,0xB2E8,0xB32A,0xB16C,0xB0AE); - &data_short(0xBBF0,0xBA32,0xB874,0xB9B6,0xBCF8,0xBD3A,0xBF7C,0xBEBE); -}} # $sse2 - -&asciz("GHASH for x86, CRYPTOGAMS by "); -&asm_finish(); - -close STDOUT or die "error closing STDOUT"; - -# A question was risen about choice of vanilla MMX. Or rather why wasn't -# SSE2 chosen instead? In addition to the fact that MMX runs on legacy -# CPUs such as PIII, "4-bit" MMX version was observed to provide better -# performance than *corresponding* SSE2 one even on contemporary CPUs. -# SSE2 results were provided by Peter-Michael Hager. He maintains SSE2 -# implementation featuring full range of lookup-table sizes, but with -# per-invocation lookup table setup. Latter means that table size is -# chosen depending on how much data is to be hashed in every given call, -# more data - larger table. Best reported result for Core2 is ~4 cycles -# per processed byte out of 64KB block. This number accounts even for -# 64KB table setup overhead. As discussed in gcm128.c we choose to be -# more conservative in respect to lookup table sizes, but how do the -# results compare? Minimalistic "256B" MMX version delivers ~11 cycles -# on same platform. As also discussed in gcm128.c, next in line "8-bit -# Shoup's" or "4KB" method should deliver twice the performance of -# "256B" one, in other words not worse than ~6 cycles per byte. It -# should be also be noted that in SSE2 case improvement can be "super- -# linear," i.e. more than twice, mostly because >>8 maps to single -# instruction on SSE2 register. This is unlike "4-bit" case when >>4 -# maps to same amount of instructions in both MMX and SSE2 cases. -# Bottom line is that switch to SSE2 is considered to be justifiable -# only in case we choose to implement "8-bit" method... diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/sha/asm/sha256-armv4.pl temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/sha/asm/sha256-armv4.pl --- temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/sha/asm/sha256-armv4.pl 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/sha/asm/sha256-armv4.pl 1970-01-01 00:00:00.000000000 +0000 @@ -1,736 +0,0 @@ -#! /usr/bin/env perl -# Copyright 2007-2016 The OpenSSL Project Authors. All Rights Reserved. -# -# Licensed under the OpenSSL license (the "License"). You may not use -# this file except in compliance with the License. You can obtain a copy -# in the file LICENSE in the source distribution or at -# https://www.openssl.org/source/license.html - - -# ==================================================================== -# Written by Andy Polyakov for the OpenSSL -# project. The module is, however, dual licensed under OpenSSL and -# CRYPTOGAMS licenses depending on where you obtain it. For further -# details see http://www.openssl.org/~appro/cryptogams/. -# -# Permission to use under GPL terms is granted. -# ==================================================================== - -# SHA256 block procedure for ARMv4. May 2007. - -# Performance is ~2x better than gcc 3.4 generated code and in "abso- -# lute" terms is ~2250 cycles per 64-byte block or ~35 cycles per -# byte [on single-issue Xscale PXA250 core]. - -# July 2010. -# -# Rescheduling for dual-issue pipeline resulted in 22% improvement on -# Cortex A8 core and ~20 cycles per processed byte. - -# February 2011. -# -# Profiler-assisted and platform-specific optimization resulted in 16% -# improvement on Cortex A8 core and ~15.4 cycles per processed byte. - -# September 2013. -# -# Add NEON implementation. On Cortex A8 it was measured to process one -# byte in 12.5 cycles or 23% faster than integer-only code. Snapdragon -# S4 does it in 12.5 cycles too, but it's 50% faster than integer-only -# code (meaning that latter performs sub-optimally, nothing was done -# about it). - -# May 2014. -# -# Add ARMv8 code path performing at 2.0 cpb on Apple A7. - -$flavour = shift; -if ($flavour=~/\w[\w\-]*\.\w+$/) { $output=$flavour; undef $flavour; } -else { while (($output=shift) && ($output!~/\w[\w\-]*\.\w+$/)) {} } - -if ($flavour && $flavour ne "void") { - $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; - ( $xlate="${dir}arm-xlate.pl" and -f $xlate ) or - ( $xlate="${dir}../../../perlasm/arm-xlate.pl" and -f $xlate) or - die "can't locate arm-xlate.pl"; - - open OUT,"| \"$^X\" $xlate $flavour $output"; - *STDOUT=*OUT; -} else { - open OUT,">$output"; - *STDOUT=*OUT; -} - -$ctx="r0"; $t0="r0"; -$inp="r1"; $t4="r1"; -$len="r2"; $t1="r2"; -$T1="r3"; $t3="r3"; -$A="r4"; -$B="r5"; -$C="r6"; -$D="r7"; -$E="r8"; -$F="r9"; -$G="r10"; -$H="r11"; -@V=($A,$B,$C,$D,$E,$F,$G,$H); -$t2="r12"; -$Ktbl="r14"; - -@Sigma0=( 2,13,22); -@Sigma1=( 6,11,25); -@sigma0=( 7,18, 3); -@sigma1=(17,19,10); - -sub BODY_00_15 { -my ($i,$a,$b,$c,$d,$e,$f,$g,$h) = @_; - -$code.=<<___ if ($i<16); -#if __ARM_ARCH__>=7 - @ ldr $t1,[$inp],#4 @ $i -# if $i==15 - str $inp,[sp,#17*4] @ make room for $t4 -# endif - eor $t0,$e,$e,ror#`$Sigma1[1]-$Sigma1[0]` - add $a,$a,$t2 @ h+=Maj(a,b,c) from the past - eor $t0,$t0,$e,ror#`$Sigma1[2]-$Sigma1[0]` @ Sigma1(e) -# ifndef __ARMEB__ - rev $t1,$t1 -# endif -#else - @ ldrb $t1,[$inp,#3] @ $i - add $a,$a,$t2 @ h+=Maj(a,b,c) from the past - ldrb $t2,[$inp,#2] - ldrb $t0,[$inp,#1] - orr $t1,$t1,$t2,lsl#8 - ldrb $t2,[$inp],#4 - orr $t1,$t1,$t0,lsl#16 -# if $i==15 - str $inp,[sp,#17*4] @ make room for $t4 -# endif - eor $t0,$e,$e,ror#`$Sigma1[1]-$Sigma1[0]` - orr $t1,$t1,$t2,lsl#24 - eor $t0,$t0,$e,ror#`$Sigma1[2]-$Sigma1[0]` @ Sigma1(e) -#endif -___ -$code.=<<___; - ldr $t2,[$Ktbl],#4 @ *K256++ - add $h,$h,$t1 @ h+=X[i] - str $t1,[sp,#`$i%16`*4] - eor $t1,$f,$g - add $h,$h,$t0,ror#$Sigma1[0] @ h+=Sigma1(e) - and $t1,$t1,$e - add $h,$h,$t2 @ h+=K256[i] - eor $t1,$t1,$g @ Ch(e,f,g) - eor $t0,$a,$a,ror#`$Sigma0[1]-$Sigma0[0]` - add $h,$h,$t1 @ h+=Ch(e,f,g) -#if $i==31 - and $t2,$t2,#0xff - cmp $t2,#0xf2 @ done? -#endif -#if $i<15 -# if __ARM_ARCH__>=7 - ldr $t1,[$inp],#4 @ prefetch -# else - ldrb $t1,[$inp,#3] -# endif - eor $t2,$a,$b @ a^b, b^c in next round -#else - ldr $t1,[sp,#`($i+2)%16`*4] @ from future BODY_16_xx - eor $t2,$a,$b @ a^b, b^c in next round - ldr $t4,[sp,#`($i+15)%16`*4] @ from future BODY_16_xx -#endif - eor $t0,$t0,$a,ror#`$Sigma0[2]-$Sigma0[0]` @ Sigma0(a) - and $t3,$t3,$t2 @ (b^c)&=(a^b) - add $d,$d,$h @ d+=h - eor $t3,$t3,$b @ Maj(a,b,c) - add $h,$h,$t0,ror#$Sigma0[0] @ h+=Sigma0(a) - @ add $h,$h,$t3 @ h+=Maj(a,b,c) -___ - ($t2,$t3)=($t3,$t2); -} - -sub BODY_16_XX { -my ($i,$a,$b,$c,$d,$e,$f,$g,$h) = @_; - -$code.=<<___; - @ ldr $t1,[sp,#`($i+1)%16`*4] @ $i - @ ldr $t4,[sp,#`($i+14)%16`*4] - mov $t0,$t1,ror#$sigma0[0] - add $a,$a,$t2 @ h+=Maj(a,b,c) from the past - mov $t2,$t4,ror#$sigma1[0] - eor $t0,$t0,$t1,ror#$sigma0[1] - eor $t2,$t2,$t4,ror#$sigma1[1] - eor $t0,$t0,$t1,lsr#$sigma0[2] @ sigma0(X[i+1]) - ldr $t1,[sp,#`($i+0)%16`*4] - eor $t2,$t2,$t4,lsr#$sigma1[2] @ sigma1(X[i+14]) - ldr $t4,[sp,#`($i+9)%16`*4] - - add $t2,$t2,$t0 - eor $t0,$e,$e,ror#`$Sigma1[1]-$Sigma1[0]` @ from BODY_00_15 - add $t1,$t1,$t2 - eor $t0,$t0,$e,ror#`$Sigma1[2]-$Sigma1[0]` @ Sigma1(e) - add $t1,$t1,$t4 @ X[i] -___ - &BODY_00_15(@_); -} - -$code=<<___; -#ifndef __KERNEL__ -# include -#else -# define __ARM_ARCH__ __LINUX_ARM_ARCH__ -# define __ARM_MAX_ARCH__ 7 -#endif - -@ Silence ARMv8 deprecated IT instruction warnings. This file is used by both -@ ARMv7 and ARMv8 processors. It does have ARMv8-only code, but those -@ instructions are manually-encoded. (See unsha256.) -.arch armv7-a - -.text -#if defined(__thumb2__) -.syntax unified -.thumb -#else -.code 32 -#endif - -.type K256,%object -.align 5 -K256: -.word 0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5 -.word 0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5 -.word 0xd807aa98,0x12835b01,0x243185be,0x550c7dc3 -.word 0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174 -.word 0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc -.word 0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da -.word 0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7 -.word 0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967 -.word 0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13 -.word 0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85 -.word 0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3 -.word 0xd192e819,0xd6990624,0xf40e3585,0x106aa070 -.word 0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5 -.word 0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3 -.word 0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208 -.word 0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2 -.size K256,.-K256 -.word 0 @ terminator -#if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__) -.extern GFp_armcap_P -.hidden GFp_armcap_P -.LOPENSSL_armcap: -.word GFp_armcap_P-.Lsha256_block_data_order -#endif -.align 5 - -.global GFp_sha256_block_data_order -.type GFp_sha256_block_data_order,%function -GFp_sha256_block_data_order: -.Lsha256_block_data_order: -#if __ARM_ARCH__<7 && !defined(__thumb2__) - sub r3,pc,#8 @ GFp_sha256_block_data_order -#else - adr r3,.Lsha256_block_data_order -#endif -#if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__) - ldr r12,.LOPENSSL_armcap - ldr r12,[r3,r12] @ GFp_armcap_P -#ifdef __APPLE__ - ldr r12,[r12] -#endif - tst r12,#ARMV8_SHA256 - bne .LARMv8 - tst r12,#ARMV7_NEON - bne .LNEON -#endif - add $len,$inp,$len,lsl#6 @ len to point at the end of inp - stmdb sp!,{$ctx,$inp,$len,r4-r11,lr} - ldmia $ctx,{$A,$B,$C,$D,$E,$F,$G,$H} - sub $Ktbl,r3,#256+32 @ K256 - sub sp,sp,#16*4 @ alloca(X[16]) -.Loop: -# if __ARM_ARCH__>=7 - ldr $t1,[$inp],#4 -# else - ldrb $t1,[$inp,#3] -# endif - eor $t3,$B,$C @ magic - eor $t2,$t2,$t2 -___ -for($i=0;$i<16;$i++) { &BODY_00_15($i,@V); unshift(@V,pop(@V)); } -$code.=".Lrounds_16_xx:\n"; -for (;$i<32;$i++) { &BODY_16_XX($i,@V); unshift(@V,pop(@V)); } -$code.=<<___; -#if __ARM_ARCH__>=7 - ite eq @ Thumb2 thing, sanity check in ARM -#endif - ldreq $t3,[sp,#16*4] @ pull ctx - bne .Lrounds_16_xx - - add $A,$A,$t2 @ h+=Maj(a,b,c) from the past - ldr $t0,[$t3,#0] - ldr $t1,[$t3,#4] - ldr $t2,[$t3,#8] - add $A,$A,$t0 - ldr $t0,[$t3,#12] - add $B,$B,$t1 - ldr $t1,[$t3,#16] - add $C,$C,$t2 - ldr $t2,[$t3,#20] - add $D,$D,$t0 - ldr $t0,[$t3,#24] - add $E,$E,$t1 - ldr $t1,[$t3,#28] - add $F,$F,$t2 - ldr $inp,[sp,#17*4] @ pull inp - ldr $t2,[sp,#18*4] @ pull inp+len - add $G,$G,$t0 - add $H,$H,$t1 - stmia $t3,{$A,$B,$C,$D,$E,$F,$G,$H} - cmp $inp,$t2 - sub $Ktbl,$Ktbl,#256 @ rewind Ktbl - bne .Loop - - add sp,sp,#`16+3`*4 @ destroy frame -#if __ARM_ARCH__>=5 - ldmia sp!,{r4-r11,pc} -#else - ldmia sp!,{r4-r11,lr} - tst lr,#1 - moveq pc,lr @ be binary compatible with V4, yet - bx lr @ interoperable with Thumb ISA:-) -#endif -.size GFp_sha256_block_data_order,.-GFp_sha256_block_data_order -___ -###################################################################### -# NEON stuff -# -{{{ -my @X=map("q$_",(0..3)); -my ($T0,$T1,$T2,$T3,$T4,$T5)=("q8","q9","q10","q11","d24","d25"); -my $Xfer=$t4; -my $j=0; - -sub Dlo() { shift=~m|q([1]?[0-9])|?"d".($1*2):""; } -sub Dhi() { shift=~m|q([1]?[0-9])|?"d".($1*2+1):""; } - -sub AUTOLOAD() # thunk [simplified] x86-style perlasm -{ my $opcode = $AUTOLOAD; $opcode =~ s/.*:://; $opcode =~ s/_/\./; - my $arg = pop; - $arg = "#$arg" if ($arg*1 eq $arg); - $code .= "\t$opcode\t".join(',',@_,$arg)."\n"; -} - -sub Xupdate() -{ use integer; - my $body = shift; - my @insns = (&$body,&$body,&$body,&$body); - my ($a,$b,$c,$d,$e,$f,$g,$h); - - &vext_8 ($T0,@X[0],@X[1],4); # X[1..4] - eval(shift(@insns)); - eval(shift(@insns)); - eval(shift(@insns)); - &vext_8 ($T1,@X[2],@X[3],4); # X[9..12] - eval(shift(@insns)); - eval(shift(@insns)); - eval(shift(@insns)); - &vshr_u32 ($T2,$T0,$sigma0[0]); - eval(shift(@insns)); - eval(shift(@insns)); - &vadd_i32 (@X[0],@X[0],$T1); # X[0..3] += X[9..12] - eval(shift(@insns)); - eval(shift(@insns)); - &vshr_u32 ($T1,$T0,$sigma0[2]); - eval(shift(@insns)); - eval(shift(@insns)); - &vsli_32 ($T2,$T0,32-$sigma0[0]); - eval(shift(@insns)); - eval(shift(@insns)); - &vshr_u32 ($T3,$T0,$sigma0[1]); - eval(shift(@insns)); - eval(shift(@insns)); - &veor ($T1,$T1,$T2); - eval(shift(@insns)); - eval(shift(@insns)); - &vsli_32 ($T3,$T0,32-$sigma0[1]); - eval(shift(@insns)); - eval(shift(@insns)); - &vshr_u32 ($T4,&Dhi(@X[3]),$sigma1[0]); - eval(shift(@insns)); - eval(shift(@insns)); - &veor ($T1,$T1,$T3); # sigma0(X[1..4]) - eval(shift(@insns)); - eval(shift(@insns)); - &vsli_32 ($T4,&Dhi(@X[3]),32-$sigma1[0]); - eval(shift(@insns)); - eval(shift(@insns)); - &vshr_u32 ($T5,&Dhi(@X[3]),$sigma1[2]); - eval(shift(@insns)); - eval(shift(@insns)); - &vadd_i32 (@X[0],@X[0],$T1); # X[0..3] += sigma0(X[1..4]) - eval(shift(@insns)); - eval(shift(@insns)); - &veor ($T5,$T5,$T4); - eval(shift(@insns)); - eval(shift(@insns)); - &vshr_u32 ($T4,&Dhi(@X[3]),$sigma1[1]); - eval(shift(@insns)); - eval(shift(@insns)); - &vsli_32 ($T4,&Dhi(@X[3]),32-$sigma1[1]); - eval(shift(@insns)); - eval(shift(@insns)); - &veor ($T5,$T5,$T4); # sigma1(X[14..15]) - eval(shift(@insns)); - eval(shift(@insns)); - &vadd_i32 (&Dlo(@X[0]),&Dlo(@X[0]),$T5);# X[0..1] += sigma1(X[14..15]) - eval(shift(@insns)); - eval(shift(@insns)); - &vshr_u32 ($T4,&Dlo(@X[0]),$sigma1[0]); - eval(shift(@insns)); - eval(shift(@insns)); - &vsli_32 ($T4,&Dlo(@X[0]),32-$sigma1[0]); - eval(shift(@insns)); - eval(shift(@insns)); - &vshr_u32 ($T5,&Dlo(@X[0]),$sigma1[2]); - eval(shift(@insns)); - eval(shift(@insns)); - &veor ($T5,$T5,$T4); - eval(shift(@insns)); - eval(shift(@insns)); - &vshr_u32 ($T4,&Dlo(@X[0]),$sigma1[1]); - eval(shift(@insns)); - eval(shift(@insns)); - &vld1_32 ("{$T0}","[$Ktbl,:128]!"); - eval(shift(@insns)); - eval(shift(@insns)); - &vsli_32 ($T4,&Dlo(@X[0]),32-$sigma1[1]); - eval(shift(@insns)); - eval(shift(@insns)); - &veor ($T5,$T5,$T4); # sigma1(X[16..17]) - eval(shift(@insns)); - eval(shift(@insns)); - &vadd_i32 (&Dhi(@X[0]),&Dhi(@X[0]),$T5);# X[2..3] += sigma1(X[16..17]) - eval(shift(@insns)); - eval(shift(@insns)); - &vadd_i32 ($T0,$T0,@X[0]); - while($#insns>=2) { eval(shift(@insns)); } - &vst1_32 ("{$T0}","[$Xfer,:128]!"); - eval(shift(@insns)); - eval(shift(@insns)); - - push(@X,shift(@X)); # "rotate" X[] -} - -sub Xpreload() -{ use integer; - my $body = shift; - my @insns = (&$body,&$body,&$body,&$body); - my ($a,$b,$c,$d,$e,$f,$g,$h); - - eval(shift(@insns)); - eval(shift(@insns)); - eval(shift(@insns)); - eval(shift(@insns)); - &vld1_32 ("{$T0}","[$Ktbl,:128]!"); - eval(shift(@insns)); - eval(shift(@insns)); - eval(shift(@insns)); - eval(shift(@insns)); - &vrev32_8 (@X[0],@X[0]); - eval(shift(@insns)); - eval(shift(@insns)); - eval(shift(@insns)); - eval(shift(@insns)); - &vadd_i32 ($T0,$T0,@X[0]); - foreach (@insns) { eval; } # remaining instructions - &vst1_32 ("{$T0}","[$Xfer,:128]!"); - - push(@X,shift(@X)); # "rotate" X[] -} - -sub body_00_15 () { - ( - '($a,$b,$c,$d,$e,$f,$g,$h)=@V;'. - '&add ($h,$h,$t1)', # h+=X[i]+K[i] - '&eor ($t1,$f,$g)', - '&eor ($t0,$e,$e,"ror#".($Sigma1[1]-$Sigma1[0]))', - '&add ($a,$a,$t2)', # h+=Maj(a,b,c) from the past - '&and ($t1,$t1,$e)', - '&eor ($t2,$t0,$e,"ror#".($Sigma1[2]-$Sigma1[0]))', # Sigma1(e) - '&eor ($t0,$a,$a,"ror#".($Sigma0[1]-$Sigma0[0]))', - '&eor ($t1,$t1,$g)', # Ch(e,f,g) - '&add ($h,$h,$t2,"ror#$Sigma1[0]")', # h+=Sigma1(e) - '&eor ($t2,$a,$b)', # a^b, b^c in next round - '&eor ($t0,$t0,$a,"ror#".($Sigma0[2]-$Sigma0[0]))', # Sigma0(a) - '&add ($h,$h,$t1)', # h+=Ch(e,f,g) - '&ldr ($t1,sprintf "[sp,#%d]",4*(($j+1)&15)) if (($j&15)!=15);'. - '&ldr ($t1,"[$Ktbl]") if ($j==15);'. - '&ldr ($t1,"[sp,#64]") if ($j==31)', - '&and ($t3,$t3,$t2)', # (b^c)&=(a^b) - '&add ($d,$d,$h)', # d+=h - '&add ($h,$h,$t0,"ror#$Sigma0[0]");'. # h+=Sigma0(a) - '&eor ($t3,$t3,$b)', # Maj(a,b,c) - '$j++; unshift(@V,pop(@V)); ($t2,$t3)=($t3,$t2);' - ) -} - -$code.=<<___; -#if __ARM_MAX_ARCH__>=7 -.arch armv7-a -.fpu neon - -.type sha256_block_data_order_neon,%function -.align 5 -.skip 16 -sha256_block_data_order_neon: -.LNEON: - stmdb sp!,{r4-r12,lr} - - sub $H,sp,#16*4+16 - adr $Ktbl,K256 - bic $H,$H,#15 @ align for 128-bit stores - mov $t2,sp - mov sp,$H @ alloca - add $len,$inp,$len,lsl#6 @ len to point at the end of inp - - vld1.8 {@X[0]},[$inp]! - vld1.8 {@X[1]},[$inp]! - vld1.8 {@X[2]},[$inp]! - vld1.8 {@X[3]},[$inp]! - vld1.32 {$T0},[$Ktbl,:128]! - vld1.32 {$T1},[$Ktbl,:128]! - vld1.32 {$T2},[$Ktbl,:128]! - vld1.32 {$T3},[$Ktbl,:128]! - vrev32.8 @X[0],@X[0] @ yes, even on - str $ctx,[sp,#64] - vrev32.8 @X[1],@X[1] @ big-endian - str $inp,[sp,#68] - mov $Xfer,sp - vrev32.8 @X[2],@X[2] - str $len,[sp,#72] - vrev32.8 @X[3],@X[3] - str $t2,[sp,#76] @ save original sp - vadd.i32 $T0,$T0,@X[0] - vadd.i32 $T1,$T1,@X[1] - vst1.32 {$T0},[$Xfer,:128]! - vadd.i32 $T2,$T2,@X[2] - vst1.32 {$T1},[$Xfer,:128]! - vadd.i32 $T3,$T3,@X[3] - vst1.32 {$T2},[$Xfer,:128]! - vst1.32 {$T3},[$Xfer,:128]! - - ldmia $ctx,{$A-$H} - sub $Xfer,$Xfer,#64 - ldr $t1,[sp,#0] - eor $t2,$t2,$t2 - eor $t3,$B,$C - b .L_00_48 - -.align 4 -.L_00_48: -___ - &Xupdate(\&body_00_15); - &Xupdate(\&body_00_15); - &Xupdate(\&body_00_15); - &Xupdate(\&body_00_15); -$code.=<<___; - teq $t1,#0 @ check for K256 terminator - ldr $t1,[sp,#0] - sub $Xfer,$Xfer,#64 - bne .L_00_48 - - ldr $inp,[sp,#68] - ldr $t0,[sp,#72] - sub $Ktbl,$Ktbl,#256 @ rewind $Ktbl - teq $inp,$t0 - it eq - subeq $inp,$inp,#64 @ avoid SEGV - vld1.8 {@X[0]},[$inp]! @ load next input block - vld1.8 {@X[1]},[$inp]! - vld1.8 {@X[2]},[$inp]! - vld1.8 {@X[3]},[$inp]! - it ne - strne $inp,[sp,#68] - mov $Xfer,sp -___ - &Xpreload(\&body_00_15); - &Xpreload(\&body_00_15); - &Xpreload(\&body_00_15); - &Xpreload(\&body_00_15); -$code.=<<___; - ldr $t0,[$t1,#0] - add $A,$A,$t2 @ h+=Maj(a,b,c) from the past - ldr $t2,[$t1,#4] - ldr $t3,[$t1,#8] - ldr $t4,[$t1,#12] - add $A,$A,$t0 @ accumulate - ldr $t0,[$t1,#16] - add $B,$B,$t2 - ldr $t2,[$t1,#20] - add $C,$C,$t3 - ldr $t3,[$t1,#24] - add $D,$D,$t4 - ldr $t4,[$t1,#28] - add $E,$E,$t0 - str $A,[$t1],#4 - add $F,$F,$t2 - str $B,[$t1],#4 - add $G,$G,$t3 - str $C,[$t1],#4 - add $H,$H,$t4 - str $D,[$t1],#4 - stmia $t1,{$E-$H} - - ittte ne - movne $Xfer,sp - ldrne $t1,[sp,#0] - eorne $t2,$t2,$t2 - ldreq sp,[sp,#76] @ restore original sp - itt ne - eorne $t3,$B,$C - bne .L_00_48 - - ldmia sp!,{r4-r12,pc} -.size sha256_block_data_order_neon,.-sha256_block_data_order_neon -#endif -___ -}}} -###################################################################### -# ARMv8 stuff -# -{{{ -my ($ABCD,$EFGH,$abcd)=map("q$_",(0..2)); -my @MSG=map("q$_",(8..11)); -my ($W0,$W1,$ABCD_SAVE,$EFGH_SAVE)=map("q$_",(12..15)); -my $Ktbl="r3"; - -$code.=<<___; -#if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__) - -# if defined(__thumb2__) -# define INST(a,b,c,d) .byte c,d|0xc,a,b -# else -# define INST(a,b,c,d) .byte a,b,c,d -# endif - -.type sha256_block_data_order_armv8,%function -.align 5 -sha256_block_data_order_armv8: -.LARMv8: - vld1.32 {$ABCD,$EFGH},[$ctx] - sub $Ktbl,$Ktbl,#256+32 - add $len,$inp,$len,lsl#6 @ len to point at the end of inp - b .Loop_v8 - -.align 4 -.Loop_v8: - vld1.8 {@MSG[0]-@MSG[1]},[$inp]! - vld1.8 {@MSG[2]-@MSG[3]},[$inp]! - vld1.32 {$W0},[$Ktbl]! - vrev32.8 @MSG[0],@MSG[0] - vrev32.8 @MSG[1],@MSG[1] - vrev32.8 @MSG[2],@MSG[2] - vrev32.8 @MSG[3],@MSG[3] - vmov $ABCD_SAVE,$ABCD @ offload - vmov $EFGH_SAVE,$EFGH - teq $inp,$len -___ -for($i=0;$i<12;$i++) { -$code.=<<___; - vld1.32 {$W1},[$Ktbl]! - vadd.i32 $W0,$W0,@MSG[0] - sha256su0 @MSG[0],@MSG[1] - vmov $abcd,$ABCD - sha256h $ABCD,$EFGH,$W0 - sha256h2 $EFGH,$abcd,$W0 - sha256su1 @MSG[0],@MSG[2],@MSG[3] -___ - ($W0,$W1)=($W1,$W0); push(@MSG,shift(@MSG)); -} -$code.=<<___; - vld1.32 {$W1},[$Ktbl]! - vadd.i32 $W0,$W0,@MSG[0] - vmov $abcd,$ABCD - sha256h $ABCD,$EFGH,$W0 - sha256h2 $EFGH,$abcd,$W0 - - vld1.32 {$W0},[$Ktbl]! - vadd.i32 $W1,$W1,@MSG[1] - vmov $abcd,$ABCD - sha256h $ABCD,$EFGH,$W1 - sha256h2 $EFGH,$abcd,$W1 - - vld1.32 {$W1},[$Ktbl] - vadd.i32 $W0,$W0,@MSG[2] - sub $Ktbl,$Ktbl,#256-16 @ rewind - vmov $abcd,$ABCD - sha256h $ABCD,$EFGH,$W0 - sha256h2 $EFGH,$abcd,$W0 - - vadd.i32 $W1,$W1,@MSG[3] - vmov $abcd,$ABCD - sha256h $ABCD,$EFGH,$W1 - sha256h2 $EFGH,$abcd,$W1 - - vadd.i32 $ABCD,$ABCD,$ABCD_SAVE - vadd.i32 $EFGH,$EFGH,$EFGH_SAVE - it ne - bne .Loop_v8 - - vst1.32 {$ABCD,$EFGH},[$ctx] - - ret @ bx lr -.size sha256_block_data_order_armv8,.-sha256_block_data_order_armv8 -#endif -___ -}}} -$code.=<<___; -.asciz "SHA256 block transform for ARMv4/NEON/ARMv8, CRYPTOGAMS by " -___ - -open SELF,$0; -while() { - next if (/^#!/); - last if (!s/^#/@/ and !/^$/); - print; -} -close SELF; - -{ my %opcode = ( - "sha256h" => 0xf3000c40, "sha256h2" => 0xf3100c40, - "sha256su0" => 0xf3ba03c0, "sha256su1" => 0xf3200c40 ); - - sub unsha256 { - my ($mnemonic,$arg)=@_; - - if ($arg =~ m/q([0-9]+)(?:,\s*q([0-9]+))?,\s*q([0-9]+)/o) { - my $word = $opcode{$mnemonic}|(($1&7)<<13)|(($1&8)<<19) - |(($2&7)<<17)|(($2&8)<<4) - |(($3&7)<<1) |(($3&8)<<2); - # since ARMv7 instructions are always encoded little-endian. - # correct solution is to use .inst directive, but older - # assemblers don't implement it:-( - sprintf "INST(0x%02x,0x%02x,0x%02x,0x%02x)\t@ %s %s", - $word&0xff,($word>>8)&0xff, - ($word>>16)&0xff,($word>>24)&0xff, - $mnemonic,$arg; - } - } -} - -foreach (split($/,$code)) { - - s/\`([^\`]*)\`/eval $1/geo; - - s/\b(sha256\w+)\s+(q.*)/unsha256($1,$2)/geo; - - s/\bret\b/bx lr/go or - s/\bbx\s+lr\b/.word\t0xe12fff1e/go; # make it possible to compile with -march=armv4 - - print $_,"\n"; -} - -close STDOUT or die "error closing STDOUT"; # enforce flush diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/sha/asm/sha512-armv4.pl temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/sha/asm/sha512-armv4.pl --- temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/sha/asm/sha512-armv4.pl 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/sha/asm/sha512-armv4.pl 1970-01-01 00:00:00.000000000 +0000 @@ -1,671 +0,0 @@ -#! /usr/bin/env perl -# Copyright 2007-2016 The OpenSSL Project Authors. All Rights Reserved. -# -# Licensed under the OpenSSL license (the "License"). You may not use -# this file except in compliance with the License. You can obtain a copy -# in the file LICENSE in the source distribution or at -# https://www.openssl.org/source/license.html - - -# ==================================================================== -# Written by Andy Polyakov for the OpenSSL -# project. The module is, however, dual licensed under OpenSSL and -# CRYPTOGAMS licenses depending on where you obtain it. For further -# details see http://www.openssl.org/~appro/cryptogams/. -# -# Permission to use under GPL terms is granted. -# ==================================================================== - -# SHA512 block procedure for ARMv4. September 2007. - -# This code is ~4.5 (four and a half) times faster than code generated -# by gcc 3.4 and it spends ~72 clock cycles per byte [on single-issue -# Xscale PXA250 core]. -# -# July 2010. -# -# Rescheduling for dual-issue pipeline resulted in 6% improvement on -# Cortex A8 core and ~40 cycles per processed byte. - -# February 2011. -# -# Profiler-assisted and platform-specific optimization resulted in 7% -# improvement on Coxtex A8 core and ~38 cycles per byte. - -# March 2011. -# -# Add NEON implementation. On Cortex A8 it was measured to process -# one byte in 23.3 cycles or ~60% faster than integer-only code. - -# August 2012. -# -# Improve NEON performance by 12% on Snapdragon S4. In absolute -# terms it's 22.6 cycles per byte, which is disappointing result. -# Technical writers asserted that 3-way S4 pipeline can sustain -# multiple NEON instructions per cycle, but dual NEON issue could -# not be observed, see http://www.openssl.org/~appro/Snapdragon-S4.html -# for further details. On side note Cortex-A15 processes one byte in -# 16 cycles. - -# Byte order [in]dependence. ========================================= -# -# Originally caller was expected to maintain specific *dword* order in -# h[0-7], namely with most significant dword at *lower* address, which -# was reflected in below two parameters as 0 and 4. Now caller is -# expected to maintain native byte order for whole 64-bit values. -$hi="HI"; -$lo="LO"; -# ==================================================================== - -$flavour = shift; -if ($flavour=~/\w[\w\-]*\.\w+$/) { $output=$flavour; undef $flavour; } -else { while (($output=shift) && ($output!~/\w[\w\-]*\.\w+$/)) {} } - -if ($flavour && $flavour ne "void") { - $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; - ( $xlate="${dir}arm-xlate.pl" and -f $xlate ) or - ( $xlate="${dir}../../../perlasm/arm-xlate.pl" and -f $xlate) or - die "can't locate arm-xlate.pl"; - - open OUT,"| \"$^X\" $xlate $flavour $output"; - *STDOUT=*OUT; -} else { - open OUT,">$output"; - *STDOUT=*OUT; -} - -$ctx="r0"; # parameter block -$inp="r1"; -$len="r2"; - -$Tlo="r3"; -$Thi="r4"; -$Alo="r5"; -$Ahi="r6"; -$Elo="r7"; -$Ehi="r8"; -$t0="r9"; -$t1="r10"; -$t2="r11"; -$t3="r12"; -############ r13 is stack pointer -$Ktbl="r14"; -############ r15 is program counter - -$Aoff=8*0; -$Boff=8*1; -$Coff=8*2; -$Doff=8*3; -$Eoff=8*4; -$Foff=8*5; -$Goff=8*6; -$Hoff=8*7; -$Xoff=8*8; - -sub BODY_00_15() { -my $magic = shift; -$code.=<<___; - @ Sigma1(x) (ROTR((x),14) ^ ROTR((x),18) ^ ROTR((x),41)) - @ LO lo>>14^hi<<18 ^ lo>>18^hi<<14 ^ hi>>9^lo<<23 - @ HI hi>>14^lo<<18 ^ hi>>18^lo<<14 ^ lo>>9^hi<<23 - mov $t0,$Elo,lsr#14 - str $Tlo,[sp,#$Xoff+0] - mov $t1,$Ehi,lsr#14 - str $Thi,[sp,#$Xoff+4] - eor $t0,$t0,$Ehi,lsl#18 - ldr $t2,[sp,#$Hoff+0] @ h.lo - eor $t1,$t1,$Elo,lsl#18 - ldr $t3,[sp,#$Hoff+4] @ h.hi - eor $t0,$t0,$Elo,lsr#18 - eor $t1,$t1,$Ehi,lsr#18 - eor $t0,$t0,$Ehi,lsl#14 - eor $t1,$t1,$Elo,lsl#14 - eor $t0,$t0,$Ehi,lsr#9 - eor $t1,$t1,$Elo,lsr#9 - eor $t0,$t0,$Elo,lsl#23 - eor $t1,$t1,$Ehi,lsl#23 @ Sigma1(e) - adds $Tlo,$Tlo,$t0 - ldr $t0,[sp,#$Foff+0] @ f.lo - adc $Thi,$Thi,$t1 @ T += Sigma1(e) - ldr $t1,[sp,#$Foff+4] @ f.hi - adds $Tlo,$Tlo,$t2 - ldr $t2,[sp,#$Goff+0] @ g.lo - adc $Thi,$Thi,$t3 @ T += h - ldr $t3,[sp,#$Goff+4] @ g.hi - - eor $t0,$t0,$t2 - str $Elo,[sp,#$Eoff+0] - eor $t1,$t1,$t3 - str $Ehi,[sp,#$Eoff+4] - and $t0,$t0,$Elo - str $Alo,[sp,#$Aoff+0] - and $t1,$t1,$Ehi - str $Ahi,[sp,#$Aoff+4] - eor $t0,$t0,$t2 - ldr $t2,[$Ktbl,#$lo] @ K[i].lo - eor $t1,$t1,$t3 @ Ch(e,f,g) - ldr $t3,[$Ktbl,#$hi] @ K[i].hi - - adds $Tlo,$Tlo,$t0 - ldr $Elo,[sp,#$Doff+0] @ d.lo - adc $Thi,$Thi,$t1 @ T += Ch(e,f,g) - ldr $Ehi,[sp,#$Doff+4] @ d.hi - adds $Tlo,$Tlo,$t2 - and $t0,$t2,#0xff - adc $Thi,$Thi,$t3 @ T += K[i] - adds $Elo,$Elo,$Tlo - ldr $t2,[sp,#$Boff+0] @ b.lo - adc $Ehi,$Ehi,$Thi @ d += T - teq $t0,#$magic - - ldr $t3,[sp,#$Coff+0] @ c.lo -#if __ARM_ARCH__>=7 - it eq @ Thumb2 thing, sanity check in ARM -#endif - orreq $Ktbl,$Ktbl,#1 - @ Sigma0(x) (ROTR((x),28) ^ ROTR((x),34) ^ ROTR((x),39)) - @ LO lo>>28^hi<<4 ^ hi>>2^lo<<30 ^ hi>>7^lo<<25 - @ HI hi>>28^lo<<4 ^ lo>>2^hi<<30 ^ lo>>7^hi<<25 - mov $t0,$Alo,lsr#28 - mov $t1,$Ahi,lsr#28 - eor $t0,$t0,$Ahi,lsl#4 - eor $t1,$t1,$Alo,lsl#4 - eor $t0,$t0,$Ahi,lsr#2 - eor $t1,$t1,$Alo,lsr#2 - eor $t0,$t0,$Alo,lsl#30 - eor $t1,$t1,$Ahi,lsl#30 - eor $t0,$t0,$Ahi,lsr#7 - eor $t1,$t1,$Alo,lsr#7 - eor $t0,$t0,$Alo,lsl#25 - eor $t1,$t1,$Ahi,lsl#25 @ Sigma0(a) - adds $Tlo,$Tlo,$t0 - and $t0,$Alo,$t2 - adc $Thi,$Thi,$t1 @ T += Sigma0(a) - - ldr $t1,[sp,#$Boff+4] @ b.hi - orr $Alo,$Alo,$t2 - ldr $t2,[sp,#$Coff+4] @ c.hi - and $Alo,$Alo,$t3 - and $t3,$Ahi,$t1 - orr $Ahi,$Ahi,$t1 - orr $Alo,$Alo,$t0 @ Maj(a,b,c).lo - and $Ahi,$Ahi,$t2 - adds $Alo,$Alo,$Tlo - orr $Ahi,$Ahi,$t3 @ Maj(a,b,c).hi - sub sp,sp,#8 - adc $Ahi,$Ahi,$Thi @ h += T - tst $Ktbl,#1 - add $Ktbl,$Ktbl,#8 -___ -} -$code=<<___; -#ifndef __KERNEL__ -# include -# define VFP_ABI_PUSH vstmdb sp!,{d8-d15} -# define VFP_ABI_POP vldmia sp!,{d8-d15} -#else -# define __ARM_ARCH__ __LINUX_ARM_ARCH__ -# define __ARM_MAX_ARCH__ 7 -# define VFP_ABI_PUSH -# define VFP_ABI_POP -#endif - -@ Silence ARMv8 deprecated IT instruction warnings. This file is used by both -@ ARMv7 and ARMv8 processors and does not use ARMv8 instructions. -.arch armv7-a - -#ifdef __ARMEL__ -# define LO 0 -# define HI 4 -# define WORD64(hi0,lo0,hi1,lo1) .word lo0,hi0, lo1,hi1 -#else -# define HI 0 -# define LO 4 -# define WORD64(hi0,lo0,hi1,lo1) .word hi0,lo0, hi1,lo1 -#endif - -.text -#if defined(__thumb2__) -.syntax unified -.thumb -# define adrl adr -#else -.code 32 -#endif - -.type K512,%object -.align 5 -K512: -WORD64(0x428a2f98,0xd728ae22, 0x71374491,0x23ef65cd) -WORD64(0xb5c0fbcf,0xec4d3b2f, 0xe9b5dba5,0x8189dbbc) -WORD64(0x3956c25b,0xf348b538, 0x59f111f1,0xb605d019) -WORD64(0x923f82a4,0xaf194f9b, 0xab1c5ed5,0xda6d8118) -WORD64(0xd807aa98,0xa3030242, 0x12835b01,0x45706fbe) -WORD64(0x243185be,0x4ee4b28c, 0x550c7dc3,0xd5ffb4e2) -WORD64(0x72be5d74,0xf27b896f, 0x80deb1fe,0x3b1696b1) -WORD64(0x9bdc06a7,0x25c71235, 0xc19bf174,0xcf692694) -WORD64(0xe49b69c1,0x9ef14ad2, 0xefbe4786,0x384f25e3) -WORD64(0x0fc19dc6,0x8b8cd5b5, 0x240ca1cc,0x77ac9c65) -WORD64(0x2de92c6f,0x592b0275, 0x4a7484aa,0x6ea6e483) -WORD64(0x5cb0a9dc,0xbd41fbd4, 0x76f988da,0x831153b5) -WORD64(0x983e5152,0xee66dfab, 0xa831c66d,0x2db43210) -WORD64(0xb00327c8,0x98fb213f, 0xbf597fc7,0xbeef0ee4) -WORD64(0xc6e00bf3,0x3da88fc2, 0xd5a79147,0x930aa725) -WORD64(0x06ca6351,0xe003826f, 0x14292967,0x0a0e6e70) -WORD64(0x27b70a85,0x46d22ffc, 0x2e1b2138,0x5c26c926) -WORD64(0x4d2c6dfc,0x5ac42aed, 0x53380d13,0x9d95b3df) -WORD64(0x650a7354,0x8baf63de, 0x766a0abb,0x3c77b2a8) -WORD64(0x81c2c92e,0x47edaee6, 0x92722c85,0x1482353b) -WORD64(0xa2bfe8a1,0x4cf10364, 0xa81a664b,0xbc423001) -WORD64(0xc24b8b70,0xd0f89791, 0xc76c51a3,0x0654be30) -WORD64(0xd192e819,0xd6ef5218, 0xd6990624,0x5565a910) -WORD64(0xf40e3585,0x5771202a, 0x106aa070,0x32bbd1b8) -WORD64(0x19a4c116,0xb8d2d0c8, 0x1e376c08,0x5141ab53) -WORD64(0x2748774c,0xdf8eeb99, 0x34b0bcb5,0xe19b48a8) -WORD64(0x391c0cb3,0xc5c95a63, 0x4ed8aa4a,0xe3418acb) -WORD64(0x5b9cca4f,0x7763e373, 0x682e6ff3,0xd6b2b8a3) -WORD64(0x748f82ee,0x5defb2fc, 0x78a5636f,0x43172f60) -WORD64(0x84c87814,0xa1f0ab72, 0x8cc70208,0x1a6439ec) -WORD64(0x90befffa,0x23631e28, 0xa4506ceb,0xde82bde9) -WORD64(0xbef9a3f7,0xb2c67915, 0xc67178f2,0xe372532b) -WORD64(0xca273ece,0xea26619c, 0xd186b8c7,0x21c0c207) -WORD64(0xeada7dd6,0xcde0eb1e, 0xf57d4f7f,0xee6ed178) -WORD64(0x06f067aa,0x72176fba, 0x0a637dc5,0xa2c898a6) -WORD64(0x113f9804,0xbef90dae, 0x1b710b35,0x131c471b) -WORD64(0x28db77f5,0x23047d84, 0x32caab7b,0x40c72493) -WORD64(0x3c9ebe0a,0x15c9bebc, 0x431d67c4,0x9c100d4c) -WORD64(0x4cc5d4be,0xcb3e42b6, 0x597f299c,0xfc657e2a) -WORD64(0x5fcb6fab,0x3ad6faec, 0x6c44198c,0x4a475817) -.size K512,.-K512 -#if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__) -.extern GFp_armcap_P -.hidden GFp_armcap_P -.LOPENSSL_armcap: -.word GFp_armcap_P-.Lsha512_block_data_order -.skip 32-4 -#else -.skip 32 -#endif - -.global GFp_sha512_block_data_order -.type GFp_sha512_block_data_order,%function -GFp_sha512_block_data_order: -.Lsha512_block_data_order: -#if __ARM_ARCH__<7 && !defined(__thumb2__) - sub r3,pc,#8 @ GFp_sha512_block_data_order -#else - adr r3,.Lsha512_block_data_order -#endif -#if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__) - ldr r12,.LOPENSSL_armcap - ldr r12,[r3,r12] @ GFp_armcap_P -#ifdef __APPLE__ - ldr r12,[r12] -#endif - tst r12,#ARMV7_NEON - bne .LNEON -#endif - add $len,$inp,$len,lsl#7 @ len to point at the end of inp - stmdb sp!,{r4-r12,lr} - sub $Ktbl,r3,#672 @ K512 - sub sp,sp,#9*8 - - ldr $Elo,[$ctx,#$Eoff+$lo] - ldr $Ehi,[$ctx,#$Eoff+$hi] - ldr $t0, [$ctx,#$Goff+$lo] - ldr $t1, [$ctx,#$Goff+$hi] - ldr $t2, [$ctx,#$Hoff+$lo] - ldr $t3, [$ctx,#$Hoff+$hi] -.Loop: - str $t0, [sp,#$Goff+0] - str $t1, [sp,#$Goff+4] - str $t2, [sp,#$Hoff+0] - str $t3, [sp,#$Hoff+4] - ldr $Alo,[$ctx,#$Aoff+$lo] - ldr $Ahi,[$ctx,#$Aoff+$hi] - ldr $Tlo,[$ctx,#$Boff+$lo] - ldr $Thi,[$ctx,#$Boff+$hi] - ldr $t0, [$ctx,#$Coff+$lo] - ldr $t1, [$ctx,#$Coff+$hi] - ldr $t2, [$ctx,#$Doff+$lo] - ldr $t3, [$ctx,#$Doff+$hi] - str $Tlo,[sp,#$Boff+0] - str $Thi,[sp,#$Boff+4] - str $t0, [sp,#$Coff+0] - str $t1, [sp,#$Coff+4] - str $t2, [sp,#$Doff+0] - str $t3, [sp,#$Doff+4] - ldr $Tlo,[$ctx,#$Foff+$lo] - ldr $Thi,[$ctx,#$Foff+$hi] - str $Tlo,[sp,#$Foff+0] - str $Thi,[sp,#$Foff+4] - -.L00_15: -#if __ARM_ARCH__<7 - ldrb $Tlo,[$inp,#7] - ldrb $t0, [$inp,#6] - ldrb $t1, [$inp,#5] - ldrb $t2, [$inp,#4] - ldrb $Thi,[$inp,#3] - ldrb $t3, [$inp,#2] - orr $Tlo,$Tlo,$t0,lsl#8 - ldrb $t0, [$inp,#1] - orr $Tlo,$Tlo,$t1,lsl#16 - ldrb $t1, [$inp],#8 - orr $Tlo,$Tlo,$t2,lsl#24 - orr $Thi,$Thi,$t3,lsl#8 - orr $Thi,$Thi,$t0,lsl#16 - orr $Thi,$Thi,$t1,lsl#24 -#else - ldr $Tlo,[$inp,#4] - ldr $Thi,[$inp],#8 -#ifdef __ARMEL__ - rev $Tlo,$Tlo - rev $Thi,$Thi -#endif -#endif -___ - &BODY_00_15(0x94); -$code.=<<___; - tst $Ktbl,#1 - beq .L00_15 - ldr $t0,[sp,#`$Xoff+8*(16-1)`+0] - ldr $t1,[sp,#`$Xoff+8*(16-1)`+4] - bic $Ktbl,$Ktbl,#1 -.L16_79: - @ sigma0(x) (ROTR((x),1) ^ ROTR((x),8) ^ ((x)>>7)) - @ LO lo>>1^hi<<31 ^ lo>>8^hi<<24 ^ lo>>7^hi<<25 - @ HI hi>>1^lo<<31 ^ hi>>8^lo<<24 ^ hi>>7 - mov $Tlo,$t0,lsr#1 - ldr $t2,[sp,#`$Xoff+8*(16-14)`+0] - mov $Thi,$t1,lsr#1 - ldr $t3,[sp,#`$Xoff+8*(16-14)`+4] - eor $Tlo,$Tlo,$t1,lsl#31 - eor $Thi,$Thi,$t0,lsl#31 - eor $Tlo,$Tlo,$t0,lsr#8 - eor $Thi,$Thi,$t1,lsr#8 - eor $Tlo,$Tlo,$t1,lsl#24 - eor $Thi,$Thi,$t0,lsl#24 - eor $Tlo,$Tlo,$t0,lsr#7 - eor $Thi,$Thi,$t1,lsr#7 - eor $Tlo,$Tlo,$t1,lsl#25 - - @ sigma1(x) (ROTR((x),19) ^ ROTR((x),61) ^ ((x)>>6)) - @ LO lo>>19^hi<<13 ^ hi>>29^lo<<3 ^ lo>>6^hi<<26 - @ HI hi>>19^lo<<13 ^ lo>>29^hi<<3 ^ hi>>6 - mov $t0,$t2,lsr#19 - mov $t1,$t3,lsr#19 - eor $t0,$t0,$t3,lsl#13 - eor $t1,$t1,$t2,lsl#13 - eor $t0,$t0,$t3,lsr#29 - eor $t1,$t1,$t2,lsr#29 - eor $t0,$t0,$t2,lsl#3 - eor $t1,$t1,$t3,lsl#3 - eor $t0,$t0,$t2,lsr#6 - eor $t1,$t1,$t3,lsr#6 - ldr $t2,[sp,#`$Xoff+8*(16-9)`+0] - eor $t0,$t0,$t3,lsl#26 - - ldr $t3,[sp,#`$Xoff+8*(16-9)`+4] - adds $Tlo,$Tlo,$t0 - ldr $t0,[sp,#`$Xoff+8*16`+0] - adc $Thi,$Thi,$t1 - - ldr $t1,[sp,#`$Xoff+8*16`+4] - adds $Tlo,$Tlo,$t2 - adc $Thi,$Thi,$t3 - adds $Tlo,$Tlo,$t0 - adc $Thi,$Thi,$t1 -___ - &BODY_00_15(0x17); -$code.=<<___; -#if __ARM_ARCH__>=7 - ittt eq @ Thumb2 thing, sanity check in ARM -#endif - ldreq $t0,[sp,#`$Xoff+8*(16-1)`+0] - ldreq $t1,[sp,#`$Xoff+8*(16-1)`+4] - beq .L16_79 - bic $Ktbl,$Ktbl,#1 - - ldr $Tlo,[sp,#$Boff+0] - ldr $Thi,[sp,#$Boff+4] - ldr $t0, [$ctx,#$Aoff+$lo] - ldr $t1, [$ctx,#$Aoff+$hi] - ldr $t2, [$ctx,#$Boff+$lo] - ldr $t3, [$ctx,#$Boff+$hi] - adds $t0,$Alo,$t0 - str $t0, [$ctx,#$Aoff+$lo] - adc $t1,$Ahi,$t1 - str $t1, [$ctx,#$Aoff+$hi] - adds $t2,$Tlo,$t2 - str $t2, [$ctx,#$Boff+$lo] - adc $t3,$Thi,$t3 - str $t3, [$ctx,#$Boff+$hi] - - ldr $Alo,[sp,#$Coff+0] - ldr $Ahi,[sp,#$Coff+4] - ldr $Tlo,[sp,#$Doff+0] - ldr $Thi,[sp,#$Doff+4] - ldr $t0, [$ctx,#$Coff+$lo] - ldr $t1, [$ctx,#$Coff+$hi] - ldr $t2, [$ctx,#$Doff+$lo] - ldr $t3, [$ctx,#$Doff+$hi] - adds $t0,$Alo,$t0 - str $t0, [$ctx,#$Coff+$lo] - adc $t1,$Ahi,$t1 - str $t1, [$ctx,#$Coff+$hi] - adds $t2,$Tlo,$t2 - str $t2, [$ctx,#$Doff+$lo] - adc $t3,$Thi,$t3 - str $t3, [$ctx,#$Doff+$hi] - - ldr $Tlo,[sp,#$Foff+0] - ldr $Thi,[sp,#$Foff+4] - ldr $t0, [$ctx,#$Eoff+$lo] - ldr $t1, [$ctx,#$Eoff+$hi] - ldr $t2, [$ctx,#$Foff+$lo] - ldr $t3, [$ctx,#$Foff+$hi] - adds $Elo,$Elo,$t0 - str $Elo,[$ctx,#$Eoff+$lo] - adc $Ehi,$Ehi,$t1 - str $Ehi,[$ctx,#$Eoff+$hi] - adds $t2,$Tlo,$t2 - str $t2, [$ctx,#$Foff+$lo] - adc $t3,$Thi,$t3 - str $t3, [$ctx,#$Foff+$hi] - - ldr $Alo,[sp,#$Goff+0] - ldr $Ahi,[sp,#$Goff+4] - ldr $Tlo,[sp,#$Hoff+0] - ldr $Thi,[sp,#$Hoff+4] - ldr $t0, [$ctx,#$Goff+$lo] - ldr $t1, [$ctx,#$Goff+$hi] - ldr $t2, [$ctx,#$Hoff+$lo] - ldr $t3, [$ctx,#$Hoff+$hi] - adds $t0,$Alo,$t0 - str $t0, [$ctx,#$Goff+$lo] - adc $t1,$Ahi,$t1 - str $t1, [$ctx,#$Goff+$hi] - adds $t2,$Tlo,$t2 - str $t2, [$ctx,#$Hoff+$lo] - adc $t3,$Thi,$t3 - str $t3, [$ctx,#$Hoff+$hi] - - add sp,sp,#640 - sub $Ktbl,$Ktbl,#640 - - teq $inp,$len - bne .Loop - - add sp,sp,#8*9 @ destroy frame -#if __ARM_ARCH__>=5 - ldmia sp!,{r4-r12,pc} -#else - ldmia sp!,{r4-r12,lr} - tst lr,#1 - moveq pc,lr @ be binary compatible with V4, yet - bx lr @ interoperable with Thumb ISA:-) -#endif -.size GFp_sha512_block_data_order,.-GFp_sha512_block_data_order -___ - -{ -my @Sigma0=(28,34,39); -my @Sigma1=(14,18,41); -my @sigma0=(1, 8, 7); -my @sigma1=(19,61,6); - -my $Ktbl="r3"; -my $cnt="r12"; # volatile register known as ip, intra-procedure-call scratch - -my @X=map("d$_",(0..15)); -my @V=($A,$B,$C,$D,$E,$F,$G,$H)=map("d$_",(16..23)); - -sub NEON_00_15() { -my $i=shift; -my ($a,$b,$c,$d,$e,$f,$g,$h)=@_; -my ($t0,$t1,$t2,$T1,$K,$Ch,$Maj)=map("d$_",(24..31)); # temps - -$code.=<<___ if ($i<16 || $i&1); - vshr.u64 $t0,$e,#@Sigma1[0] @ $i -#if $i<16 - vld1.64 {@X[$i%16]},[$inp]! @ handles unaligned -#endif - vshr.u64 $t1,$e,#@Sigma1[1] -#if $i>0 - vadd.i64 $a,$Maj @ h+=Maj from the past -#endif - vshr.u64 $t2,$e,#@Sigma1[2] -___ -$code.=<<___; - vld1.64 {$K},[$Ktbl,:64]! @ K[i++] - vsli.64 $t0,$e,#`64-@Sigma1[0]` - vsli.64 $t1,$e,#`64-@Sigma1[1]` - vmov $Ch,$e - vsli.64 $t2,$e,#`64-@Sigma1[2]` -#if $i<16 && defined(__ARMEL__) - vrev64.8 @X[$i],@X[$i] -#endif - veor $t1,$t0 - vbsl $Ch,$f,$g @ Ch(e,f,g) - vshr.u64 $t0,$a,#@Sigma0[0] - veor $t2,$t1 @ Sigma1(e) - vadd.i64 $T1,$Ch,$h - vshr.u64 $t1,$a,#@Sigma0[1] - vsli.64 $t0,$a,#`64-@Sigma0[0]` - vadd.i64 $T1,$t2 - vshr.u64 $t2,$a,#@Sigma0[2] - vadd.i64 $K,@X[$i%16] - vsli.64 $t1,$a,#`64-@Sigma0[1]` - veor $Maj,$a,$b - vsli.64 $t2,$a,#`64-@Sigma0[2]` - veor $h,$t0,$t1 - vadd.i64 $T1,$K - vbsl $Maj,$c,$b @ Maj(a,b,c) - veor $h,$t2 @ Sigma0(a) - vadd.i64 $d,$T1 - vadd.i64 $Maj,$T1 - @ vadd.i64 $h,$Maj -___ -} - -sub NEON_16_79() { -my $i=shift; - -if ($i&1) { &NEON_00_15($i,@_); return; } - -# 2x-vectorized, therefore runs every 2nd round -my @X=map("q$_",(0..7)); # view @X as 128-bit vector -my ($t0,$t1,$s0,$s1) = map("q$_",(12..15)); # temps -my ($d0,$d1,$d2) = map("d$_",(24..26)); # temps from NEON_00_15 -my $e=@_[4]; # $e from NEON_00_15 -$i /= 2; -$code.=<<___; - vshr.u64 $t0,@X[($i+7)%8],#@sigma1[0] - vshr.u64 $t1,@X[($i+7)%8],#@sigma1[1] - vadd.i64 @_[0],d30 @ h+=Maj from the past - vshr.u64 $s1,@X[($i+7)%8],#@sigma1[2] - vsli.64 $t0,@X[($i+7)%8],#`64-@sigma1[0]` - vext.8 $s0,@X[$i%8],@X[($i+1)%8],#8 @ X[i+1] - vsli.64 $t1,@X[($i+7)%8],#`64-@sigma1[1]` - veor $s1,$t0 - vshr.u64 $t0,$s0,#@sigma0[0] - veor $s1,$t1 @ sigma1(X[i+14]) - vshr.u64 $t1,$s0,#@sigma0[1] - vadd.i64 @X[$i%8],$s1 - vshr.u64 $s1,$s0,#@sigma0[2] - vsli.64 $t0,$s0,#`64-@sigma0[0]` - vsli.64 $t1,$s0,#`64-@sigma0[1]` - vext.8 $s0,@X[($i+4)%8],@X[($i+5)%8],#8 @ X[i+9] - veor $s1,$t0 - vshr.u64 $d0,$e,#@Sigma1[0] @ from NEON_00_15 - vadd.i64 @X[$i%8],$s0 - vshr.u64 $d1,$e,#@Sigma1[1] @ from NEON_00_15 - veor $s1,$t1 @ sigma0(X[i+1]) - vshr.u64 $d2,$e,#@Sigma1[2] @ from NEON_00_15 - vadd.i64 @X[$i%8],$s1 -___ - &NEON_00_15(2*$i,@_); -} - -$code.=<<___; -#if __ARM_MAX_ARCH__>=7 -.arch armv7-a -.fpu neon - -.type sha512_block_data_order_neon,%function -.align 4 -sha512_block_data_order_neon: -.LNEON: - dmb @ errata #451034 on early Cortex A8 - add $len,$inp,$len,lsl#7 @ len to point at the end of inp - adr $Ktbl,K512 - VFP_ABI_PUSH - vldmia $ctx,{$A-$H} @ load context -.Loop_neon: -___ -for($i=0;$i<16;$i++) { &NEON_00_15($i,@V); unshift(@V,pop(@V)); } -$code.=<<___; - mov $cnt,#4 -.L16_79_neon: - subs $cnt,#1 -___ -for(;$i<32;$i++) { &NEON_16_79($i,@V); unshift(@V,pop(@V)); } -$code.=<<___; - bne .L16_79_neon - - vadd.i64 $A,d30 @ h+=Maj from the past - vldmia $ctx,{d24-d31} @ load context to temp - vadd.i64 q8,q12 @ vectorized accumulate - vadd.i64 q9,q13 - vadd.i64 q10,q14 - vadd.i64 q11,q15 - vstmia $ctx,{$A-$H} @ save context - teq $inp,$len - sub $Ktbl,#640 @ rewind K512 - bne .Loop_neon - - VFP_ABI_POP - ret @ bx lr -.size sha512_block_data_order_neon,.-sha512_block_data_order_neon -#endif -___ -} -$code.=<<___; -.asciz "SHA512 block transform for ARMv4/NEON, CRYPTOGAMS by " -___ - -$code =~ s/\`([^\`]*)\`/eval $1/gem; -$code =~ s/\bbx\s+lr\b/.word\t0xe12fff1e/gm; # make it possible to compile with -march=armv4 -$code =~ s/\bret\b/bx lr/gm; - -open SELF,$0; -while() { - next if (/^#!/); - last if (!s/^#/@/ and !/^$/); - print; -} -close SELF; - -print $code; -close STDOUT or die "error closing STDOUT"; # enforce flush diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/sha/asm/sha512-armv8.pl temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/sha/asm/sha512-armv8.pl --- temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/sha/asm/sha512-armv8.pl 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/sha/asm/sha512-armv8.pl 1970-01-01 00:00:00.000000000 +0000 @@ -1,462 +0,0 @@ -#! /usr/bin/env perl -# Copyright 2014-2016 The OpenSSL Project Authors. All Rights Reserved. -# -# Licensed under the OpenSSL license (the "License"). You may not use -# this file except in compliance with the License. You can obtain a copy -# in the file LICENSE in the source distribution or at -# https://www.openssl.org/source/license.html - -# ==================================================================== -# Written by Andy Polyakov for the OpenSSL -# project. The module is, however, dual licensed under OpenSSL and -# CRYPTOGAMS licenses depending on where you obtain it. For further -# details see http://www.openssl.org/~appro/cryptogams/. -# -# Permission to use under GPLv2 terms is granted. -# ==================================================================== -# -# SHA256/512 for ARMv8. -# -# Performance in cycles per processed byte and improvement coefficient -# over code generated with "default" compiler: -# -# SHA256-hw SHA256(*) SHA512 -# Apple A7 1.97 10.5 (+33%) 6.73 (-1%(**)) -# Cortex-A53 2.38 15.5 (+115%) 10.0 (+150%(***)) -# Cortex-A57 2.31 11.6 (+86%) 7.51 (+260%(***)) -# Denver 2.01 10.5 (+26%) 6.70 (+8%) -# X-Gene 20.0 (+100%) 12.8 (+300%(***)) -# Mongoose 2.36 13.0 (+50%) 8.36 (+33%) -# -# (*) Software SHA256 results are of lesser relevance, presented -# mostly for informational purposes. -# (**) The result is a trade-off: it's possible to improve it by -# 10% (or by 1 cycle per round), but at the cost of 20% loss -# on Cortex-A53 (or by 4 cycles per round). -# (***) Super-impressive coefficients over gcc-generated code are -# indication of some compiler "pathology", most notably code -# generated with -mgeneral-regs-only is significanty faster -# and the gap is only 40-90%. - -$output=pop; -$flavour=pop; - -if ($flavour && $flavour ne "void") { - $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; - ( $xlate="${dir}arm-xlate.pl" and -f $xlate ) or - ( $xlate="${dir}../../../perlasm/arm-xlate.pl" and -f $xlate) or - die "can't locate arm-xlate.pl"; - - open OUT,"| \"$^X\" $xlate $flavour $output"; - *STDOUT=*OUT; -} else { - open OUT,">$output"; - *STDOUT=*OUT; -} - -if ($output =~ /sha512-armv8/) { - $BITS=512; - $SZ=8; - @Sigma0=(28,34,39); - @Sigma1=(14,18,41); - @sigma0=(1, 8, 7); - @sigma1=(19,61, 6); - $rounds=80; - $reg_t="x"; -} else { - $BITS=256; - $SZ=4; - @Sigma0=( 2,13,22); - @Sigma1=( 6,11,25); - @sigma0=( 7,18, 3); - @sigma1=(17,19,10); - $rounds=64; - $reg_t="w"; -} - -$func="GFp_sha${BITS}_block_data_order"; - -($ctx,$inp,$num,$Ktbl)=map("x$_",(0..2,30)); - -@X=map("$reg_t$_",(3..15,0..2)); -@V=($A,$B,$C,$D,$E,$F,$G,$H)=map("$reg_t$_",(20..27)); -($t0,$t1,$t2,$t3)=map("$reg_t$_",(16,17,19,28)); - -sub BODY_00_xx { -my ($i,$a,$b,$c,$d,$e,$f,$g,$h)=@_; -my $j=($i+1)&15; -my ($T0,$T1,$T2)=(@X[($i-8)&15],@X[($i-9)&15],@X[($i-10)&15]); - $T0=@X[$i+3] if ($i<11); - -$code.=<<___ if ($i<16); -#ifndef __ARMEB__ - rev @X[$i],@X[$i] // $i -#endif -___ -$code.=<<___ if ($i<13 && ($i&1)); - ldp @X[$i+1],@X[$i+2],[$inp],#2*$SZ -___ -$code.=<<___ if ($i==13); - ldp @X[14],@X[15],[$inp] -___ -$code.=<<___ if ($i>=14); - ldr @X[($i-11)&15],[sp,#`$SZ*(($i-11)%4)`] -___ -$code.=<<___ if ($i>0 && $i<16); - add $a,$a,$t1 // h+=Sigma0(a) -___ -$code.=<<___ if ($i>=11); - str @X[($i-8)&15],[sp,#`$SZ*(($i-8)%4)`] -___ -# While ARMv8 specifies merged rotate-n-logical operation such as -# 'eor x,y,z,ror#n', it was found to negatively affect performance -# on Apple A7. The reason seems to be that it requires even 'y' to -# be available earlier. This means that such merged instruction is -# not necessarily best choice on critical path... On the other hand -# Cortex-A5x handles merged instructions much better than disjoint -# rotate and logical... See (**) footnote above. -$code.=<<___ if ($i<15); - ror $t0,$e,#$Sigma1[0] - add $h,$h,$t2 // h+=K[i] - eor $T0,$e,$e,ror#`$Sigma1[2]-$Sigma1[1]` - and $t1,$f,$e - bic $t2,$g,$e - add $h,$h,@X[$i&15] // h+=X[i] - orr $t1,$t1,$t2 // Ch(e,f,g) - eor $t2,$a,$b // a^b, b^c in next round - eor $t0,$t0,$T0,ror#$Sigma1[1] // Sigma1(e) - ror $T0,$a,#$Sigma0[0] - add $h,$h,$t1 // h+=Ch(e,f,g) - eor $t1,$a,$a,ror#`$Sigma0[2]-$Sigma0[1]` - add $h,$h,$t0 // h+=Sigma1(e) - and $t3,$t3,$t2 // (b^c)&=(a^b) - add $d,$d,$h // d+=h - eor $t3,$t3,$b // Maj(a,b,c) - eor $t1,$T0,$t1,ror#$Sigma0[1] // Sigma0(a) - add $h,$h,$t3 // h+=Maj(a,b,c) - ldr $t3,[$Ktbl],#$SZ // *K++, $t2 in next round - //add $h,$h,$t1 // h+=Sigma0(a) -___ -$code.=<<___ if ($i>=15); - ror $t0,$e,#$Sigma1[0] - add $h,$h,$t2 // h+=K[i] - ror $T1,@X[($j+1)&15],#$sigma0[0] - and $t1,$f,$e - ror $T2,@X[($j+14)&15],#$sigma1[0] - bic $t2,$g,$e - ror $T0,$a,#$Sigma0[0] - add $h,$h,@X[$i&15] // h+=X[i] - eor $t0,$t0,$e,ror#$Sigma1[1] - eor $T1,$T1,@X[($j+1)&15],ror#$sigma0[1] - orr $t1,$t1,$t2 // Ch(e,f,g) - eor $t2,$a,$b // a^b, b^c in next round - eor $t0,$t0,$e,ror#$Sigma1[2] // Sigma1(e) - eor $T0,$T0,$a,ror#$Sigma0[1] - add $h,$h,$t1 // h+=Ch(e,f,g) - and $t3,$t3,$t2 // (b^c)&=(a^b) - eor $T2,$T2,@X[($j+14)&15],ror#$sigma1[1] - eor $T1,$T1,@X[($j+1)&15],lsr#$sigma0[2] // sigma0(X[i+1]) - add $h,$h,$t0 // h+=Sigma1(e) - eor $t3,$t3,$b // Maj(a,b,c) - eor $t1,$T0,$a,ror#$Sigma0[2] // Sigma0(a) - eor $T2,$T2,@X[($j+14)&15],lsr#$sigma1[2] // sigma1(X[i+14]) - add @X[$j],@X[$j],@X[($j+9)&15] - add $d,$d,$h // d+=h - add $h,$h,$t3 // h+=Maj(a,b,c) - ldr $t3,[$Ktbl],#$SZ // *K++, $t2 in next round - add @X[$j],@X[$j],$T1 - add $h,$h,$t1 // h+=Sigma0(a) - add @X[$j],@X[$j],$T2 -___ - ($t2,$t3)=($t3,$t2); -} - -$code.=<<___; -#ifndef __KERNEL__ -# include -#endif - -.text - -.extern GFp_armcap_P -.hidden GFp_armcap_P -.globl $func -.type $func,%function -.align 6 -$func: -___ -$code.=<<___ if ($SZ==4); - AARCH64_VALID_CALL_TARGET -#ifndef __KERNEL__ -#if __has_feature(hwaddress_sanitizer) && __clang_major__ >= 10 - adrp x16,:pg_hi21_nc:GFp_armcap_P -#else - adrp x16,:pg_hi21:GFp_armcap_P -#endif - ldr w16,[x16,:lo12:GFp_armcap_P] - tst w16,#ARMV8_SHA256 - b.ne .Lv8_entry -#endif -___ -$code.=<<___; - AARCH64_SIGN_LINK_REGISTER - stp x29,x30,[sp,#-128]! - add x29,sp,#0 - - stp x19,x20,[sp,#16] - stp x21,x22,[sp,#32] - stp x23,x24,[sp,#48] - stp x25,x26,[sp,#64] - stp x27,x28,[sp,#80] - sub sp,sp,#4*$SZ - - ldp $A,$B,[$ctx] // load context - ldp $C,$D,[$ctx,#2*$SZ] - ldp $E,$F,[$ctx,#4*$SZ] - add $num,$inp,$num,lsl#`log(16*$SZ)/log(2)` // end of input - ldp $G,$H,[$ctx,#6*$SZ] - adrp $Ktbl,:pg_hi21:.LK$BITS - add $Ktbl,$Ktbl,:lo12:.LK$BITS - stp $ctx,$num,[x29,#96] - -.Loop: - ldp @X[0],@X[1],[$inp],#2*$SZ - ldr $t2,[$Ktbl],#$SZ // *K++ - eor $t3,$B,$C // magic seed - str $inp,[x29,#112] -___ -for ($i=0;$i<16;$i++) { &BODY_00_xx($i,@V); unshift(@V,pop(@V)); } -$code.=".Loop_16_xx:\n"; -for (;$i<32;$i++) { &BODY_00_xx($i,@V); unshift(@V,pop(@V)); } -$code.=<<___; - cbnz $t2,.Loop_16_xx - - ldp $ctx,$num,[x29,#96] - ldr $inp,[x29,#112] - sub $Ktbl,$Ktbl,#`$SZ*($rounds+1)` // rewind - - ldp @X[0],@X[1],[$ctx] - ldp @X[2],@X[3],[$ctx,#2*$SZ] - add $inp,$inp,#14*$SZ // advance input pointer - ldp @X[4],@X[5],[$ctx,#4*$SZ] - add $A,$A,@X[0] - ldp @X[6],@X[7],[$ctx,#6*$SZ] - add $B,$B,@X[1] - add $C,$C,@X[2] - add $D,$D,@X[3] - stp $A,$B,[$ctx] - add $E,$E,@X[4] - add $F,$F,@X[5] - stp $C,$D,[$ctx,#2*$SZ] - add $G,$G,@X[6] - add $H,$H,@X[7] - cmp $inp,$num - stp $E,$F,[$ctx,#4*$SZ] - stp $G,$H,[$ctx,#6*$SZ] - b.ne .Loop - - ldp x19,x20,[x29,#16] - add sp,sp,#4*$SZ - ldp x21,x22,[x29,#32] - ldp x23,x24,[x29,#48] - ldp x25,x26,[x29,#64] - ldp x27,x28,[x29,#80] - ldp x29,x30,[sp],#128 - AARCH64_VALIDATE_LINK_REGISTER - ret -.size $func,.-$func - -.section .rodata -.align 6 -.type .LK$BITS,%object -.LK$BITS: -___ -$code.=<<___ if ($SZ==8); - .quad 0x428a2f98d728ae22,0x7137449123ef65cd - .quad 0xb5c0fbcfec4d3b2f,0xe9b5dba58189dbbc - .quad 0x3956c25bf348b538,0x59f111f1b605d019 - .quad 0x923f82a4af194f9b,0xab1c5ed5da6d8118 - .quad 0xd807aa98a3030242,0x12835b0145706fbe - .quad 0x243185be4ee4b28c,0x550c7dc3d5ffb4e2 - .quad 0x72be5d74f27b896f,0x80deb1fe3b1696b1 - .quad 0x9bdc06a725c71235,0xc19bf174cf692694 - .quad 0xe49b69c19ef14ad2,0xefbe4786384f25e3 - .quad 0x0fc19dc68b8cd5b5,0x240ca1cc77ac9c65 - .quad 0x2de92c6f592b0275,0x4a7484aa6ea6e483 - .quad 0x5cb0a9dcbd41fbd4,0x76f988da831153b5 - .quad 0x983e5152ee66dfab,0xa831c66d2db43210 - .quad 0xb00327c898fb213f,0xbf597fc7beef0ee4 - .quad 0xc6e00bf33da88fc2,0xd5a79147930aa725 - .quad 0x06ca6351e003826f,0x142929670a0e6e70 - .quad 0x27b70a8546d22ffc,0x2e1b21385c26c926 - .quad 0x4d2c6dfc5ac42aed,0x53380d139d95b3df - .quad 0x650a73548baf63de,0x766a0abb3c77b2a8 - .quad 0x81c2c92e47edaee6,0x92722c851482353b - .quad 0xa2bfe8a14cf10364,0xa81a664bbc423001 - .quad 0xc24b8b70d0f89791,0xc76c51a30654be30 - .quad 0xd192e819d6ef5218,0xd69906245565a910 - .quad 0xf40e35855771202a,0x106aa07032bbd1b8 - .quad 0x19a4c116b8d2d0c8,0x1e376c085141ab53 - .quad 0x2748774cdf8eeb99,0x34b0bcb5e19b48a8 - .quad 0x391c0cb3c5c95a63,0x4ed8aa4ae3418acb - .quad 0x5b9cca4f7763e373,0x682e6ff3d6b2b8a3 - .quad 0x748f82ee5defb2fc,0x78a5636f43172f60 - .quad 0x84c87814a1f0ab72,0x8cc702081a6439ec - .quad 0x90befffa23631e28,0xa4506cebde82bde9 - .quad 0xbef9a3f7b2c67915,0xc67178f2e372532b - .quad 0xca273eceea26619c,0xd186b8c721c0c207 - .quad 0xeada7dd6cde0eb1e,0xf57d4f7fee6ed178 - .quad 0x06f067aa72176fba,0x0a637dc5a2c898a6 - .quad 0x113f9804bef90dae,0x1b710b35131c471b - .quad 0x28db77f523047d84,0x32caab7b40c72493 - .quad 0x3c9ebe0a15c9bebc,0x431d67c49c100d4c - .quad 0x4cc5d4becb3e42b6,0x597f299cfc657e2a - .quad 0x5fcb6fab3ad6faec,0x6c44198c4a475817 - .quad 0 // terminator -___ -$code.=<<___ if ($SZ==4); - .long 0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5 - .long 0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5 - .long 0xd807aa98,0x12835b01,0x243185be,0x550c7dc3 - .long 0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174 - .long 0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc - .long 0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da - .long 0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7 - .long 0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967 - .long 0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13 - .long 0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85 - .long 0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3 - .long 0xd192e819,0xd6990624,0xf40e3585,0x106aa070 - .long 0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5 - .long 0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3 - .long 0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208 - .long 0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2 - .long 0 //terminator -___ -$code.=<<___; -.size .LK$BITS,.-.LK$BITS -.asciz "SHA$BITS block transform for ARMv8, CRYPTOGAMS by " -.align 2 -___ - -if ($SZ==4) { -my $Ktbl="x3"; - -my ($ABCD,$EFGH,$abcd)=map("v$_.16b",(0..2)); -my @MSG=map("v$_.16b",(4..7)); -my ($W0,$W1)=("v16.4s","v17.4s"); -my ($ABCD_SAVE,$EFGH_SAVE)=("v18.16b","v19.16b"); - -$code.=<<___; -.text -#ifndef __KERNEL__ -.type sha256_block_armv8,%function -.align 6 -sha256_block_armv8: -.Lv8_entry: - // Armv8.3-A PAuth: even though x30 is pushed to stack it is not popped later. - stp x29,x30,[sp,#-16]! - add x29,sp,#0 - - ld1.32 {$ABCD,$EFGH},[$ctx] - adrp $Ktbl,:pg_hi21:.LK256 - add $Ktbl,$Ktbl,:lo12:.LK256 - -.Loop_hw: - ld1 {@MSG[0]-@MSG[3]},[$inp],#64 - sub $num,$num,#1 - ld1.32 {$W0},[$Ktbl],#16 - rev32 @MSG[0],@MSG[0] - rev32 @MSG[1],@MSG[1] - rev32 @MSG[2],@MSG[2] - rev32 @MSG[3],@MSG[3] - orr $ABCD_SAVE,$ABCD,$ABCD // offload - orr $EFGH_SAVE,$EFGH,$EFGH -___ -for($i=0;$i<12;$i++) { -$code.=<<___; - ld1.32 {$W1},[$Ktbl],#16 - add.i32 $W0,$W0,@MSG[0] - sha256su0 @MSG[0],@MSG[1] - orr $abcd,$ABCD,$ABCD - sha256h $ABCD,$EFGH,$W0 - sha256h2 $EFGH,$abcd,$W0 - sha256su1 @MSG[0],@MSG[2],@MSG[3] -___ - ($W0,$W1)=($W1,$W0); push(@MSG,shift(@MSG)); -} -$code.=<<___; - ld1.32 {$W1},[$Ktbl],#16 - add.i32 $W0,$W0,@MSG[0] - orr $abcd,$ABCD,$ABCD - sha256h $ABCD,$EFGH,$W0 - sha256h2 $EFGH,$abcd,$W0 - - ld1.32 {$W0},[$Ktbl],#16 - add.i32 $W1,$W1,@MSG[1] - orr $abcd,$ABCD,$ABCD - sha256h $ABCD,$EFGH,$W1 - sha256h2 $EFGH,$abcd,$W1 - - ld1.32 {$W1},[$Ktbl] - add.i32 $W0,$W0,@MSG[2] - sub $Ktbl,$Ktbl,#$rounds*$SZ-16 // rewind - orr $abcd,$ABCD,$ABCD - sha256h $ABCD,$EFGH,$W0 - sha256h2 $EFGH,$abcd,$W0 - - add.i32 $W1,$W1,@MSG[3] - orr $abcd,$ABCD,$ABCD - sha256h $ABCD,$EFGH,$W1 - sha256h2 $EFGH,$abcd,$W1 - - add.i32 $ABCD,$ABCD,$ABCD_SAVE - add.i32 $EFGH,$EFGH,$EFGH_SAVE - - cbnz $num,.Loop_hw - - st1.32 {$ABCD,$EFGH},[$ctx] - - ldr x29,[sp],#16 - ret -.size sha256_block_armv8,.-sha256_block_armv8 -#endif -___ -} - -{ my %opcode = ( - "sha256h" => 0x5e004000, "sha256h2" => 0x5e005000, - "sha256su0" => 0x5e282800, "sha256su1" => 0x5e006000 ); - - sub unsha256 { - my ($mnemonic,$arg)=@_; - - $arg =~ m/[qv]([0-9]+)[^,]*,\s*[qv]([0-9]+)[^,]*(?:,\s*[qv]([0-9]+))?/o - && - sprintf ".inst\t0x%08x\t//%s %s", - $opcode{$mnemonic}|$1|($2<<5)|($3<<16), - $mnemonic,$arg; - } -} - -open SELF,$0; -while() { - next if (/^#!/); - last if (!s/^#/\/\// and !/^$/); - print; -} -close SELF; - -foreach(split("\n",$code)) { - - s/\`([^\`]*)\`/eval($1)/geo; - - s/\b(sha256\w+)\s+([qv].*)/unsha256($1,$2)/geo; - - s/\.\w?32\b//o and s/\.16b/\.4s/go; - m/(ld|st)1[^\[]+\[0\]/o and s/\.4s/\.s/go; - - print $_,"\n"; -} - -close STDOUT or die "error closing STDOUT"; diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/sha/asm/sha512-x86_64.pl temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/sha/asm/sha512-x86_64.pl --- temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/sha/asm/sha512-x86_64.pl 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/crypto/fipsmodule/sha/asm/sha512-x86_64.pl 1970-01-01 00:00:00.000000000 +0000 @@ -1,1675 +0,0 @@ -#! /usr/bin/env perl -# Copyright 2005-2016 The OpenSSL Project Authors. All Rights Reserved. -# -# Licensed under the OpenSSL license (the "License"). You may not use -# this file except in compliance with the License. You can obtain a copy -# in the file LICENSE in the source distribution or at -# https://www.openssl.org/source/license.html - -# -# ==================================================================== -# Written by Andy Polyakov for the OpenSSL -# project. Rights for redistribution and usage in source and binary -# forms are granted according to the OpenSSL license. -# ==================================================================== -# -# sha256/512_block procedure for x86_64. -# -# 40% improvement over compiler-generated code on Opteron. On EM64T -# sha256 was observed to run >80% faster and sha512 - >40%. No magical -# tricks, just straight implementation... I really wonder why gcc -# [being armed with inline assembler] fails to generate as fast code. -# The only thing which is cool about this module is that it's very -# same instruction sequence used for both SHA-256 and SHA-512. In -# former case the instructions operate on 32-bit operands, while in -# latter - on 64-bit ones. All I had to do is to get one flavor right, -# the other one passed the test right away:-) -# -# sha256_block runs in ~1005 cycles on Opteron, which gives you -# asymptotic performance of 64*1000/1005=63.7MBps times CPU clock -# frequency in GHz. sha512_block runs in ~1275 cycles, which results -# in 128*1000/1275=100MBps per GHz. Is there room for improvement? -# Well, if you compare it to IA-64 implementation, which maintains -# X[16] in register bank[!], tends to 4 instructions per CPU clock -# cycle and runs in 1003 cycles, 1275 is very good result for 3-way -# issue Opteron pipeline and X[16] maintained in memory. So that *if* -# there is a way to improve it, *then* the only way would be to try to -# offload X[16] updates to SSE unit, but that would require "deeper" -# loop unroll, which in turn would naturally cause size blow-up, not -# to mention increased complexity! And once again, only *if* it's -# actually possible to noticeably improve overall ILP, instruction -# level parallelism, on a given CPU implementation in this case. -# -# Special note on Intel EM64T. While Opteron CPU exhibits perfect -# performance ratio of 1.5 between 64- and 32-bit flavors [see above], -# [currently available] EM64T CPUs apparently are far from it. On the -# contrary, 64-bit version, sha512_block, is ~30% *slower* than 32-bit -# sha256_block:-( This is presumably because 64-bit shifts/rotates -# apparently are not atomic instructions, but implemented in microcode. -# -# May 2012. -# -# Optimization including one of Pavel Semjanov's ideas, alternative -# Maj, resulted in >=5% improvement on most CPUs, +20% SHA256 and -# unfortunately -2% SHA512 on P4 [which nobody should care about -# that much]. -# -# June 2012. -# -# Add SIMD code paths, see below for improvement coefficients. SSSE3 -# code path was not attempted for SHA512, because improvement is not -# estimated to be high enough, noticeably less than 9%, to justify -# the effort, not on pre-AVX processors. [Obviously with exclusion -# for VIA Nano, but it has SHA512 instruction that is faster and -# should be used instead.] For reference, corresponding estimated -# upper limit for improvement for SSSE3 SHA256 is 28%. The fact that -# higher coefficients are observed on VIA Nano and Bulldozer has more -# to do with specifics of their architecture [which is topic for -# separate discussion]. -# -# November 2012. -# -# Add AVX2 code path. Two consecutive input blocks are loaded to -# 256-bit %ymm registers, with data from first block to least -# significant 128-bit halves and data from second to most significant. -# The data is then processed with same SIMD instruction sequence as -# for AVX, but with %ymm as operands. Side effect is increased stack -# frame, 448 additional bytes in SHA256 and 1152 in SHA512, and 1.2KB -# code size increase. -# -# March 2014. -# -# Add support for Intel SHA Extensions. - -###################################################################### -# Current performance in cycles per processed byte (less is better): -# -# SHA256 SSSE3 AVX/XOP(*) SHA512 AVX/XOP(*) -# -# AMD K8 14.9 - - 9.57 - -# P4 17.3 - - 30.8 - -# Core 2 15.6 13.8(+13%) - 9.97 - -# Westmere 14.8 12.3(+19%) - 9.58 - -# Sandy Bridge 17.4 14.2(+23%) 11.6(+50%(**)) 11.2 8.10(+38%(**)) -# Ivy Bridge 12.6 10.5(+20%) 10.3(+22%) 8.17 7.22(+13%) -# Haswell 12.2 9.28(+31%) 7.80(+56%) 7.66 5.40(+42%) -# Skylake 11.4 9.03(+26%) 7.70(+48%) 7.25 5.20(+40%) -# Bulldozer 21.1 13.6(+54%) 13.6(+54%(***)) 13.5 8.58(+57%) -# Ryzen 11.0 9.02(+22%) 2.05(+440%) 7.05 5.67(+20%) -# VIA Nano 23.0 16.5(+39%) - 14.7 - -# Atom 23.0 18.9(+22%) - 14.7 - -# Silvermont 27.4 20.6(+33%) - 17.5 - -# Knights L 27.4 21.0(+30%) 19.6(+40%) 17.5 12.8(+37%) -# Goldmont 18.9 14.3(+32%) 4.16(+350%) 12.0 - -# -# (*) whichever best applicable, including SHAEXT; -# (**) switch from ror to shrd stands for fair share of improvement; -# (***) execution time is fully determined by remaining integer-only -# part, body_00_15; reducing the amount of SIMD instructions -# below certain limit makes no difference/sense; to conserve -# space SHA256 XOP code path is therefore omitted; -# -# Modified from upstream OpenSSL to remove the XOP code. - -$flavour = shift; -$output = shift; -if ($flavour =~ /\./) { $output = $flavour; undef $flavour; } - -$win64=0; $win64=1 if ($flavour =~ /[nm]asm|mingw64/ || $output =~ /\.asm$/); - -$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; -( $xlate="${dir}x86_64-xlate.pl" and -f $xlate ) or -( $xlate="${dir}../../../perlasm/x86_64-xlate.pl" and -f $xlate) or -die "can't locate x86_64-xlate.pl"; - -# In upstream, this is controlled by shelling out to the compiler to check -# versions, but BoringSSL is intended to be used with pre-generated perlasm -# output, so this isn't useful anyway. -# -# TODO(briansmith): Address davidben's concerns about the CFI annotations and -# Win64 ABI issues at https://github.com/openssl/openssl/issues/8853. -# TODO(davidben): Enable AVX2 code after testing by setting $avx to 2. Is it -# necessary to disable AVX2 code when SHA Extensions code is disabled? Upstream -# did not tie them together until after $shaext was added. -$avx = 1; - -# TODO(davidben): Consider enabling the Intel SHA Extensions code once it's -# been tested. -$shaext=0; ### set to zero if compiling for 1.0.1 -$avx=1 if (!$shaext && $avx); - -open OUT,"| \"$^X\" \"$xlate\" $flavour \"$output\""; -*STDOUT=*OUT; - -if ($output =~ /sha512-x86_64/) { - $func="GFp_sha512_block_data_order"; - $TABLE="K512"; - $SZ=8; - @ROT=($A,$B,$C,$D,$E,$F,$G,$H)=("%rax","%rbx","%rcx","%rdx", - "%r8", "%r9", "%r10","%r11"); - ($T1,$a0,$a1,$a2,$a3)=("%r12","%r13","%r14","%r15","%rdi"); - @Sigma0=(28,34,39); - @Sigma1=(14,18,41); - @sigma0=(1, 8, 7); - @sigma1=(19,61, 6); - $rounds=80; -} else { - $func="GFp_sha256_block_data_order"; - $TABLE="K256"; - $SZ=4; - @ROT=($A,$B,$C,$D,$E,$F,$G,$H)=("%eax","%ebx","%ecx","%edx", - "%r8d","%r9d","%r10d","%r11d"); - ($T1,$a0,$a1,$a2,$a3)=("%r12d","%r13d","%r14d","%r15d","%edi"); - @Sigma0=( 2,13,22); - @Sigma1=( 6,11,25); - @sigma0=( 7,18, 3); - @sigma1=(17,19,10); - $rounds=64; -} - -$ctx="%rdi"; # 1st arg, zapped by $a3 -$inp="%rsi"; # 2nd arg -$Tbl="%rbp"; - -$_ctx="16*$SZ+0*8(%rsp)"; -$_inp="16*$SZ+1*8(%rsp)"; -$_end="16*$SZ+2*8(%rsp)"; -$_rsp="`16*$SZ+3*8`(%rsp)"; -$framesz="16*$SZ+4*8"; - - -sub ROUND_00_15() -{ my ($i,$a,$b,$c,$d,$e,$f,$g,$h) = @_; - my $STRIDE=$SZ; - $STRIDE += 16 if ($i%(16/$SZ)==(16/$SZ-1)); - -$code.=<<___; - ror \$`$Sigma1[2]-$Sigma1[1]`,$a0 - mov $f,$a2 - - xor $e,$a0 - ror \$`$Sigma0[2]-$Sigma0[1]`,$a1 - xor $g,$a2 # f^g - - mov $T1,`$SZ*($i&0xf)`(%rsp) - xor $a,$a1 - and $e,$a2 # (f^g)&e - - ror \$`$Sigma1[1]-$Sigma1[0]`,$a0 - add $h,$T1 # T1+=h - xor $g,$a2 # Ch(e,f,g)=((f^g)&e)^g - - ror \$`$Sigma0[1]-$Sigma0[0]`,$a1 - xor $e,$a0 - add $a2,$T1 # T1+=Ch(e,f,g) - - mov $a,$a2 - add ($Tbl),$T1 # T1+=K[round] - xor $a,$a1 - - xor $b,$a2 # a^b, b^c in next round - ror \$$Sigma1[0],$a0 # Sigma1(e) - mov $b,$h - - and $a2,$a3 - ror \$$Sigma0[0],$a1 # Sigma0(a) - add $a0,$T1 # T1+=Sigma1(e) - - xor $a3,$h # h=Maj(a,b,c)=Ch(a^b,c,b) - add $T1,$d # d+=T1 - add $T1,$h # h+=T1 - - lea $STRIDE($Tbl),$Tbl # round++ -___ -$code.=<<___ if ($i<15); - add $a1,$h # h+=Sigma0(a) -___ - ($a2,$a3) = ($a3,$a2); -} - -sub ROUND_16_XX() -{ my ($i,$a,$b,$c,$d,$e,$f,$g,$h) = @_; - -$code.=<<___; - mov `$SZ*(($i+1)&0xf)`(%rsp),$a0 - mov `$SZ*(($i+14)&0xf)`(%rsp),$a2 - - mov $a0,$T1 - ror \$`$sigma0[1]-$sigma0[0]`,$a0 - add $a1,$a # modulo-scheduled h+=Sigma0(a) - mov $a2,$a1 - ror \$`$sigma1[1]-$sigma1[0]`,$a2 - - xor $T1,$a0 - shr \$$sigma0[2],$T1 - ror \$$sigma0[0],$a0 - xor $a1,$a2 - shr \$$sigma1[2],$a1 - - ror \$$sigma1[0],$a2 - xor $a0,$T1 # sigma0(X[(i+1)&0xf]) - xor $a1,$a2 # sigma1(X[(i+14)&0xf]) - add `$SZ*(($i+9)&0xf)`(%rsp),$T1 - - add `$SZ*($i&0xf)`(%rsp),$T1 - mov $e,$a0 - add $a2,$T1 - mov $a,$a1 -___ - &ROUND_00_15(@_); -} - -$code=<<___; -.text - -.extern GFp_ia32cap_P -.globl $func -.type $func,\@function,3 -.align 16 -$func: -.cfi_startproc -___ -$code.=<<___ if ($SZ==4 || $avx); - leaq GFp_ia32cap_P(%rip),%r11 - mov 0(%r11),%r9d - mov 4(%r11),%r10d - mov 8(%r11),%r11d -___ -$code.=<<___ if ($SZ==4 && $shaext); - test \$`1<<29`,%r11d # check for SHA - jnz _shaext_shortcut -___ - # XOP codepath removed. -$code.=<<___ if ($avx>1); - and \$`1<<8|1<<5|1<<3`,%r11d # check for BMI2+AVX2+BMI1 - cmp \$`1<<8|1<<5|1<<3`,%r11d - je .Lavx2_shortcut -___ -$code.=<<___ if ($avx); - and \$`1<<30`,%r9d # mask "Intel CPU" bit - and \$`1<<28|1<<9`,%r10d # mask AVX and SSSE3 bits - or %r9d,%r10d - cmp \$`1<<28|1<<9|1<<30`,%r10d - je .Lavx_shortcut -___ -$code.=<<___ if ($SZ==4); - test \$`1<<9`,%r10d - jnz .Lssse3_shortcut -___ -$code.=<<___; - mov %rsp,%rax # copy %rsp -.cfi_def_cfa_register %rax - push %rbx -.cfi_push %rbx - push %rbp -.cfi_push %rbp - push %r12 -.cfi_push %r12 - push %r13 -.cfi_push %r13 - push %r14 -.cfi_push %r14 - push %r15 -.cfi_push %r15 - shl \$4,%rdx # num*16 - sub \$$framesz,%rsp - lea ($inp,%rdx,$SZ),%rdx # inp+num*16*$SZ - and \$-64,%rsp # align stack frame - mov $ctx,$_ctx # save ctx, 1st arg - mov $inp,$_inp # save inp, 2nd arh - mov %rdx,$_end # save end pointer, "3rd" arg - mov %rax,$_rsp # save copy of %rsp -.cfi_cfa_expression $_rsp,deref,+8 -.Lprologue: - - mov $SZ*0($ctx),$A - mov $SZ*1($ctx),$B - mov $SZ*2($ctx),$C - mov $SZ*3($ctx),$D - mov $SZ*4($ctx),$E - mov $SZ*5($ctx),$F - mov $SZ*6($ctx),$G - mov $SZ*7($ctx),$H - jmp .Lloop - -.align 16 -.Lloop: - mov $B,$a3 - lea $TABLE(%rip),$Tbl - xor $C,$a3 # magic -___ - for($i=0;$i<16;$i++) { - $code.=" mov $SZ*$i($inp),$T1\n"; - $code.=" mov @ROT[4],$a0\n"; - $code.=" mov @ROT[0],$a1\n"; - $code.=" bswap $T1\n"; - &ROUND_00_15($i,@ROT); - unshift(@ROT,pop(@ROT)); - } -$code.=<<___; - jmp .Lrounds_16_xx -.align 16 -.Lrounds_16_xx: -___ - for(;$i<32;$i++) { - &ROUND_16_XX($i,@ROT); - unshift(@ROT,pop(@ROT)); - } - -$code.=<<___; - cmpb \$0,`$SZ-1`($Tbl) - jnz .Lrounds_16_xx - - mov $_ctx,$ctx - add $a1,$A # modulo-scheduled h+=Sigma0(a) - lea 16*$SZ($inp),$inp - - add $SZ*0($ctx),$A - add $SZ*1($ctx),$B - add $SZ*2($ctx),$C - add $SZ*3($ctx),$D - add $SZ*4($ctx),$E - add $SZ*5($ctx),$F - add $SZ*6($ctx),$G - add $SZ*7($ctx),$H - - cmp $_end,$inp - - mov $A,$SZ*0($ctx) - mov $B,$SZ*1($ctx) - mov $C,$SZ*2($ctx) - mov $D,$SZ*3($ctx) - mov $E,$SZ*4($ctx) - mov $F,$SZ*5($ctx) - mov $G,$SZ*6($ctx) - mov $H,$SZ*7($ctx) - jb .Lloop - - mov $_rsp,%rsi -.cfi_def_cfa %rsi,8 - mov -48(%rsi),%r15 -.cfi_restore %r15 - mov -40(%rsi),%r14 -.cfi_restore %r14 - mov -32(%rsi),%r13 -.cfi_restore %r13 - mov -24(%rsi),%r12 -.cfi_restore %r12 - mov -16(%rsi),%rbp -.cfi_restore %rbp - mov -8(%rsi),%rbx -.cfi_restore %rbx - lea (%rsi),%rsp -.cfi_def_cfa_register %rsp -.Lepilogue: - ret -.cfi_endproc -.size $func,.-$func -___ - -if ($SZ==4) { -$code.=<<___; -.align 64 -.type $TABLE,\@object -$TABLE: - .long 0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5 - .long 0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5 - .long 0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5 - .long 0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5 - .long 0xd807aa98,0x12835b01,0x243185be,0x550c7dc3 - .long 0xd807aa98,0x12835b01,0x243185be,0x550c7dc3 - .long 0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174 - .long 0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174 - .long 0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc - .long 0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc - .long 0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da - .long 0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da - .long 0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7 - .long 0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7 - .long 0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967 - .long 0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967 - .long 0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13 - .long 0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13 - .long 0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85 - .long 0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85 - .long 0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3 - .long 0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3 - .long 0xd192e819,0xd6990624,0xf40e3585,0x106aa070 - .long 0xd192e819,0xd6990624,0xf40e3585,0x106aa070 - .long 0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5 - .long 0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5 - .long 0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3 - .long 0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3 - .long 0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208 - .long 0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208 - .long 0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2 - .long 0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2 - - .long 0x00010203,0x04050607,0x08090a0b,0x0c0d0e0f - .long 0x00010203,0x04050607,0x08090a0b,0x0c0d0e0f - .long 0x03020100,0x0b0a0908,0xffffffff,0xffffffff - .long 0x03020100,0x0b0a0908,0xffffffff,0xffffffff - .long 0xffffffff,0xffffffff,0x03020100,0x0b0a0908 - .long 0xffffffff,0xffffffff,0x03020100,0x0b0a0908 - .asciz "SHA256 block transform for x86_64, CRYPTOGAMS by " -___ -} else { -$code.=<<___; -.align 64 -.type $TABLE,\@object -$TABLE: - .quad 0x428a2f98d728ae22,0x7137449123ef65cd - .quad 0x428a2f98d728ae22,0x7137449123ef65cd - .quad 0xb5c0fbcfec4d3b2f,0xe9b5dba58189dbbc - .quad 0xb5c0fbcfec4d3b2f,0xe9b5dba58189dbbc - .quad 0x3956c25bf348b538,0x59f111f1b605d019 - .quad 0x3956c25bf348b538,0x59f111f1b605d019 - .quad 0x923f82a4af194f9b,0xab1c5ed5da6d8118 - .quad 0x923f82a4af194f9b,0xab1c5ed5da6d8118 - .quad 0xd807aa98a3030242,0x12835b0145706fbe - .quad 0xd807aa98a3030242,0x12835b0145706fbe - .quad 0x243185be4ee4b28c,0x550c7dc3d5ffb4e2 - .quad 0x243185be4ee4b28c,0x550c7dc3d5ffb4e2 - .quad 0x72be5d74f27b896f,0x80deb1fe3b1696b1 - .quad 0x72be5d74f27b896f,0x80deb1fe3b1696b1 - .quad 0x9bdc06a725c71235,0xc19bf174cf692694 - .quad 0x9bdc06a725c71235,0xc19bf174cf692694 - .quad 0xe49b69c19ef14ad2,0xefbe4786384f25e3 - .quad 0xe49b69c19ef14ad2,0xefbe4786384f25e3 - .quad 0x0fc19dc68b8cd5b5,0x240ca1cc77ac9c65 - .quad 0x0fc19dc68b8cd5b5,0x240ca1cc77ac9c65 - .quad 0x2de92c6f592b0275,0x4a7484aa6ea6e483 - .quad 0x2de92c6f592b0275,0x4a7484aa6ea6e483 - .quad 0x5cb0a9dcbd41fbd4,0x76f988da831153b5 - .quad 0x5cb0a9dcbd41fbd4,0x76f988da831153b5 - .quad 0x983e5152ee66dfab,0xa831c66d2db43210 - .quad 0x983e5152ee66dfab,0xa831c66d2db43210 - .quad 0xb00327c898fb213f,0xbf597fc7beef0ee4 - .quad 0xb00327c898fb213f,0xbf597fc7beef0ee4 - .quad 0xc6e00bf33da88fc2,0xd5a79147930aa725 - .quad 0xc6e00bf33da88fc2,0xd5a79147930aa725 - .quad 0x06ca6351e003826f,0x142929670a0e6e70 - .quad 0x06ca6351e003826f,0x142929670a0e6e70 - .quad 0x27b70a8546d22ffc,0x2e1b21385c26c926 - .quad 0x27b70a8546d22ffc,0x2e1b21385c26c926 - .quad 0x4d2c6dfc5ac42aed,0x53380d139d95b3df - .quad 0x4d2c6dfc5ac42aed,0x53380d139d95b3df - .quad 0x650a73548baf63de,0x766a0abb3c77b2a8 - .quad 0x650a73548baf63de,0x766a0abb3c77b2a8 - .quad 0x81c2c92e47edaee6,0x92722c851482353b - .quad 0x81c2c92e47edaee6,0x92722c851482353b - .quad 0xa2bfe8a14cf10364,0xa81a664bbc423001 - .quad 0xa2bfe8a14cf10364,0xa81a664bbc423001 - .quad 0xc24b8b70d0f89791,0xc76c51a30654be30 - .quad 0xc24b8b70d0f89791,0xc76c51a30654be30 - .quad 0xd192e819d6ef5218,0xd69906245565a910 - .quad 0xd192e819d6ef5218,0xd69906245565a910 - .quad 0xf40e35855771202a,0x106aa07032bbd1b8 - .quad 0xf40e35855771202a,0x106aa07032bbd1b8 - .quad 0x19a4c116b8d2d0c8,0x1e376c085141ab53 - .quad 0x19a4c116b8d2d0c8,0x1e376c085141ab53 - .quad 0x2748774cdf8eeb99,0x34b0bcb5e19b48a8 - .quad 0x2748774cdf8eeb99,0x34b0bcb5e19b48a8 - .quad 0x391c0cb3c5c95a63,0x4ed8aa4ae3418acb - .quad 0x391c0cb3c5c95a63,0x4ed8aa4ae3418acb - .quad 0x5b9cca4f7763e373,0x682e6ff3d6b2b8a3 - .quad 0x5b9cca4f7763e373,0x682e6ff3d6b2b8a3 - .quad 0x748f82ee5defb2fc,0x78a5636f43172f60 - .quad 0x748f82ee5defb2fc,0x78a5636f43172f60 - .quad 0x84c87814a1f0ab72,0x8cc702081a6439ec - .quad 0x84c87814a1f0ab72,0x8cc702081a6439ec - .quad 0x90befffa23631e28,0xa4506cebde82bde9 - .quad 0x90befffa23631e28,0xa4506cebde82bde9 - .quad 0xbef9a3f7b2c67915,0xc67178f2e372532b - .quad 0xbef9a3f7b2c67915,0xc67178f2e372532b - .quad 0xca273eceea26619c,0xd186b8c721c0c207 - .quad 0xca273eceea26619c,0xd186b8c721c0c207 - .quad 0xeada7dd6cde0eb1e,0xf57d4f7fee6ed178 - .quad 0xeada7dd6cde0eb1e,0xf57d4f7fee6ed178 - .quad 0x06f067aa72176fba,0x0a637dc5a2c898a6 - .quad 0x06f067aa72176fba,0x0a637dc5a2c898a6 - .quad 0x113f9804bef90dae,0x1b710b35131c471b - .quad 0x113f9804bef90dae,0x1b710b35131c471b - .quad 0x28db77f523047d84,0x32caab7b40c72493 - .quad 0x28db77f523047d84,0x32caab7b40c72493 - .quad 0x3c9ebe0a15c9bebc,0x431d67c49c100d4c - .quad 0x3c9ebe0a15c9bebc,0x431d67c49c100d4c - .quad 0x4cc5d4becb3e42b6,0x597f299cfc657e2a - .quad 0x4cc5d4becb3e42b6,0x597f299cfc657e2a - .quad 0x5fcb6fab3ad6faec,0x6c44198c4a475817 - .quad 0x5fcb6fab3ad6faec,0x6c44198c4a475817 - - .quad 0x0001020304050607,0x08090a0b0c0d0e0f - .quad 0x0001020304050607,0x08090a0b0c0d0e0f - .asciz "SHA512 block transform for x86_64, CRYPTOGAMS by " -___ -} - -###################################################################### -# SIMD code paths -# -if ($SZ==4 && $shaext) {{{ -###################################################################### -# Intel SHA Extensions implementation of SHA256 update function. -# -my ($ctx,$inp,$num,$Tbl)=("%rdi","%rsi","%rdx","%rcx"); - -my ($Wi,$ABEF,$CDGH,$TMP,$BSWAP,$ABEF_SAVE,$CDGH_SAVE)=map("%xmm$_",(0..2,7..10)); -my @MSG=map("%xmm$_",(3..6)); - -$code.=<<___; -.type GFp_sha256_block_data_order_shaext,\@function,3 -.align 64 -GFp_sha256_block_data_order_shaext: -_shaext_shortcut: -___ -$code.=<<___ if ($win64); - lea `-8-5*16`(%rsp),%rsp - movaps %xmm6,-8-5*16(%rax) - movaps %xmm7,-8-4*16(%rax) - movaps %xmm8,-8-3*16(%rax) - movaps %xmm9,-8-2*16(%rax) - movaps %xmm10,-8-1*16(%rax) -.Lprologue_shaext: -___ -$code.=<<___; - lea K256+0x80(%rip),$Tbl - movdqu ($ctx),$ABEF # DCBA - movdqu 16($ctx),$CDGH # HGFE - movdqa 0x200-0x80($Tbl),$TMP # byte swap mask - - pshufd \$0x1b,$ABEF,$Wi # ABCD - pshufd \$0xb1,$ABEF,$ABEF # CDAB - pshufd \$0x1b,$CDGH,$CDGH # EFGH - movdqa $TMP,$BSWAP # offload - palignr \$8,$CDGH,$ABEF # ABEF - punpcklqdq $Wi,$CDGH # CDGH - jmp .Loop_shaext - -.align 16 -.Loop_shaext: - movdqu ($inp),@MSG[0] - movdqu 0x10($inp),@MSG[1] - movdqu 0x20($inp),@MSG[2] - pshufb $TMP,@MSG[0] - movdqu 0x30($inp),@MSG[3] - - movdqa 0*32-0x80($Tbl),$Wi - paddd @MSG[0],$Wi - pshufb $TMP,@MSG[1] - movdqa $CDGH,$CDGH_SAVE # offload - sha256rnds2 $ABEF,$CDGH # 0-3 - pshufd \$0x0e,$Wi,$Wi - nop - movdqa $ABEF,$ABEF_SAVE # offload - sha256rnds2 $CDGH,$ABEF - - movdqa 1*32-0x80($Tbl),$Wi - paddd @MSG[1],$Wi - pshufb $TMP,@MSG[2] - sha256rnds2 $ABEF,$CDGH # 4-7 - pshufd \$0x0e,$Wi,$Wi - lea 0x40($inp),$inp - sha256msg1 @MSG[1],@MSG[0] - sha256rnds2 $CDGH,$ABEF - - movdqa 2*32-0x80($Tbl),$Wi - paddd @MSG[2],$Wi - pshufb $TMP,@MSG[3] - sha256rnds2 $ABEF,$CDGH # 8-11 - pshufd \$0x0e,$Wi,$Wi - movdqa @MSG[3],$TMP - palignr \$4,@MSG[2],$TMP - nop - paddd $TMP,@MSG[0] - sha256msg1 @MSG[2],@MSG[1] - sha256rnds2 $CDGH,$ABEF - - movdqa 3*32-0x80($Tbl),$Wi - paddd @MSG[3],$Wi - sha256msg2 @MSG[3],@MSG[0] - sha256rnds2 $ABEF,$CDGH # 12-15 - pshufd \$0x0e,$Wi,$Wi - movdqa @MSG[0],$TMP - palignr \$4,@MSG[3],$TMP - nop - paddd $TMP,@MSG[1] - sha256msg1 @MSG[3],@MSG[2] - sha256rnds2 $CDGH,$ABEF -___ -for($i=4;$i<16-3;$i++) { -$code.=<<___; - movdqa $i*32-0x80($Tbl),$Wi - paddd @MSG[0],$Wi - sha256msg2 @MSG[0],@MSG[1] - sha256rnds2 $ABEF,$CDGH # 16-19... - pshufd \$0x0e,$Wi,$Wi - movdqa @MSG[1],$TMP - palignr \$4,@MSG[0],$TMP - nop - paddd $TMP,@MSG[2] - sha256msg1 @MSG[0],@MSG[3] - sha256rnds2 $CDGH,$ABEF -___ - push(@MSG,shift(@MSG)); -} -$code.=<<___; - movdqa 13*32-0x80($Tbl),$Wi - paddd @MSG[0],$Wi - sha256msg2 @MSG[0],@MSG[1] - sha256rnds2 $ABEF,$CDGH # 52-55 - pshufd \$0x0e,$Wi,$Wi - movdqa @MSG[1],$TMP - palignr \$4,@MSG[0],$TMP - sha256rnds2 $CDGH,$ABEF - paddd $TMP,@MSG[2] - - movdqa 14*32-0x80($Tbl),$Wi - paddd @MSG[1],$Wi - sha256rnds2 $ABEF,$CDGH # 56-59 - pshufd \$0x0e,$Wi,$Wi - sha256msg2 @MSG[1],@MSG[2] - movdqa $BSWAP,$TMP - sha256rnds2 $CDGH,$ABEF - - movdqa 15*32-0x80($Tbl),$Wi - paddd @MSG[2],$Wi - nop - sha256rnds2 $ABEF,$CDGH # 60-63 - pshufd \$0x0e,$Wi,$Wi - dec $num - nop - sha256rnds2 $CDGH,$ABEF - - paddd $CDGH_SAVE,$CDGH - paddd $ABEF_SAVE,$ABEF - jnz .Loop_shaext - - pshufd \$0xb1,$CDGH,$CDGH # DCHG - pshufd \$0x1b,$ABEF,$TMP # FEBA - pshufd \$0xb1,$ABEF,$ABEF # BAFE - punpckhqdq $CDGH,$ABEF # DCBA - palignr \$8,$TMP,$CDGH # HGFE - - movdqu $ABEF,($ctx) - movdqu $CDGH,16($ctx) -___ -$code.=<<___ if ($win64); - movaps -8-5*16(%rax),%xmm6 - movaps -8-4*16(%rax),%xmm7 - movaps -8-3*16(%rax),%xmm8 - movaps -8-2*16(%rax),%xmm9 - movaps -8-1*16(%rax),%xmm10 - mov %rax,%rsp -.Lepilogue_shaext: -___ -$code.=<<___; - ret -.size GFp_sha256_block_data_order_shaext,.-GFp_sha256_block_data_order_shaext -___ -}}} -{{{ - -my $a4=$T1; -my ($a,$b,$c,$d,$e,$f,$g,$h); - -sub AUTOLOAD() # thunk [simplified] 32-bit style perlasm -{ my $opcode = $AUTOLOAD; $opcode =~ s/.*:://; - my $arg = pop; - $arg = "\$$arg" if ($arg*1 eq $arg); - $code .= "\t$opcode\t".join(',',$arg,reverse @_)."\n"; -} - -sub body_00_15 () { - ( - '($a,$b,$c,$d,$e,$f,$g,$h)=@ROT;'. - - '&ror ($a0,$Sigma1[2]-$Sigma1[1])', - '&mov ($a,$a1)', - '&mov ($a4,$f)', - - '&ror ($a1,$Sigma0[2]-$Sigma0[1])', - '&xor ($a0,$e)', - '&xor ($a4,$g)', # f^g - - '&ror ($a0,$Sigma1[1]-$Sigma1[0])', - '&xor ($a1,$a)', - '&and ($a4,$e)', # (f^g)&e - - '&xor ($a0,$e)', - '&add ($h,$SZ*($i&15)."(%rsp)")', # h+=X[i]+K[i] - '&mov ($a2,$a)', - - '&xor ($a4,$g)', # Ch(e,f,g)=((f^g)&e)^g - '&ror ($a1,$Sigma0[1]-$Sigma0[0])', - '&xor ($a2,$b)', # a^b, b^c in next round - - '&add ($h,$a4)', # h+=Ch(e,f,g) - '&ror ($a0,$Sigma1[0])', # Sigma1(e) - '&and ($a3,$a2)', # (b^c)&(a^b) - - '&xor ($a1,$a)', - '&add ($h,$a0)', # h+=Sigma1(e) - '&xor ($a3,$b)', # Maj(a,b,c)=Ch(a^b,c,b) - - '&ror ($a1,$Sigma0[0])', # Sigma0(a) - '&add ($d,$h)', # d+=h - '&add ($h,$a3)', # h+=Maj(a,b,c) - - '&mov ($a0,$d)', - '&add ($a1,$h);'. # h+=Sigma0(a) - '($a2,$a3) = ($a3,$a2); unshift(@ROT,pop(@ROT)); $i++;' - ); -} - -###################################################################### -# SSSE3 code path -# -if ($SZ==4) { # SHA256 only -my @X = map("%xmm$_",(0..3)); -my ($t0,$t1,$t2,$t3, $t4,$t5) = map("%xmm$_",(4..9)); - -$code.=<<___; -.type ${func}_ssse3,\@function,3 -.align 64 -${func}_ssse3: -.cfi_startproc -.Lssse3_shortcut: - mov %rsp,%rax # copy %rsp -.cfi_def_cfa_register %rax - push %rbx -.cfi_push %rbx - push %rbp -.cfi_push %rbp - push %r12 -.cfi_push %r12 - push %r13 -.cfi_push %r13 - push %r14 -.cfi_push %r14 - push %r15 -.cfi_push %r15 - shl \$4,%rdx # num*16 - sub \$`$framesz+$win64*16*4`,%rsp - lea ($inp,%rdx,$SZ),%rdx # inp+num*16*$SZ - and \$-64,%rsp # align stack frame - mov $ctx,$_ctx # save ctx, 1st arg - mov $inp,$_inp # save inp, 2nd arh - mov %rdx,$_end # save end pointer, "3rd" arg - mov %rax,$_rsp # save copy of %rsp -.cfi_cfa_expression $_rsp,deref,+8 -___ -$code.=<<___ if ($win64); - movaps %xmm6,16*$SZ+32(%rsp) - movaps %xmm7,16*$SZ+48(%rsp) - movaps %xmm8,16*$SZ+64(%rsp) - movaps %xmm9,16*$SZ+80(%rsp) -___ -$code.=<<___; -.Lprologue_ssse3: - - mov $SZ*0($ctx),$A - mov $SZ*1($ctx),$B - mov $SZ*2($ctx),$C - mov $SZ*3($ctx),$D - mov $SZ*4($ctx),$E - mov $SZ*5($ctx),$F - mov $SZ*6($ctx),$G - mov $SZ*7($ctx),$H -___ - -$code.=<<___; - #movdqa $TABLE+`$SZ*2*$rounds`+32(%rip),$t4 - #movdqa $TABLE+`$SZ*2*$rounds`+64(%rip),$t5 - jmp .Lloop_ssse3 -.align 16 -.Lloop_ssse3: - movdqa $TABLE+`$SZ*2*$rounds`(%rip),$t3 - movdqu 0x00($inp),@X[0] - movdqu 0x10($inp),@X[1] - movdqu 0x20($inp),@X[2] - pshufb $t3,@X[0] - movdqu 0x30($inp),@X[3] - lea $TABLE(%rip),$Tbl - pshufb $t3,@X[1] - movdqa 0x00($Tbl),$t0 - movdqa 0x20($Tbl),$t1 - pshufb $t3,@X[2] - paddd @X[0],$t0 - movdqa 0x40($Tbl),$t2 - pshufb $t3,@X[3] - movdqa 0x60($Tbl),$t3 - paddd @X[1],$t1 - paddd @X[2],$t2 - paddd @X[3],$t3 - movdqa $t0,0x00(%rsp) - mov $A,$a1 - movdqa $t1,0x10(%rsp) - mov $B,$a3 - movdqa $t2,0x20(%rsp) - xor $C,$a3 # magic - movdqa $t3,0x30(%rsp) - mov $E,$a0 - jmp .Lssse3_00_47 - -.align 16 -.Lssse3_00_47: - sub \$`-16*2*$SZ`,$Tbl # size optimization -___ -sub Xupdate_256_SSSE3 () { - ( - '&movdqa ($t0,@X[1]);', - '&movdqa ($t3,@X[3])', - '&palignr ($t0,@X[0],$SZ)', # X[1..4] - '&palignr ($t3,@X[2],$SZ);', # X[9..12] - '&movdqa ($t1,$t0)', - '&movdqa ($t2,$t0);', - '&psrld ($t0,$sigma0[2])', - '&paddd (@X[0],$t3);', # X[0..3] += X[9..12] - '&psrld ($t2,$sigma0[0])', - '&pshufd ($t3,@X[3],0b11111010)',# X[14..15] - '&pslld ($t1,8*$SZ-$sigma0[1]);'. - '&pxor ($t0,$t2)', - '&psrld ($t2,$sigma0[1]-$sigma0[0]);'. - '&pxor ($t0,$t1)', - '&pslld ($t1,$sigma0[1]-$sigma0[0]);'. - '&pxor ($t0,$t2);', - '&movdqa ($t2,$t3)', - '&pxor ($t0,$t1);', # sigma0(X[1..4]) - '&psrld ($t3,$sigma1[2])', - '&paddd (@X[0],$t0);', # X[0..3] += sigma0(X[1..4]) - '&psrlq ($t2,$sigma1[0])', - '&pxor ($t3,$t2);', - '&psrlq ($t2,$sigma1[1]-$sigma1[0])', - '&pxor ($t3,$t2)', - '&pshufb ($t3,$t4)', # sigma1(X[14..15]) - '&paddd (@X[0],$t3)', # X[0..1] += sigma1(X[14..15]) - '&pshufd ($t3,@X[0],0b01010000)',# X[16..17] - '&movdqa ($t2,$t3);', - '&psrld ($t3,$sigma1[2])', - '&psrlq ($t2,$sigma1[0])', - '&pxor ($t3,$t2);', - '&psrlq ($t2,$sigma1[1]-$sigma1[0])', - '&pxor ($t3,$t2);', - '&movdqa ($t2,16*2*$j."($Tbl)")', - '&pshufb ($t3,$t5)', - '&paddd (@X[0],$t3)' # X[2..3] += sigma1(X[16..17]) - ); -} - -sub SSSE3_256_00_47 () { -my $j = shift; -my $body = shift; -my @X = @_; -my @insns = (&$body,&$body,&$body,&$body); # 104 instructions - - if (0) { - foreach (Xupdate_256_SSSE3()) { # 36 instructions - eval; - eval(shift(@insns)); - eval(shift(@insns)); - eval(shift(@insns)); - } - } else { # squeeze extra 4% on Westmere and 19% on Atom - eval(shift(@insns)); #@ - &movdqa ($t0,@X[1]); - eval(shift(@insns)); - eval(shift(@insns)); - &movdqa ($t3,@X[3]); - eval(shift(@insns)); #@ - eval(shift(@insns)); - eval(shift(@insns)); - eval(shift(@insns)); #@ - eval(shift(@insns)); - &palignr ($t0,@X[0],$SZ); # X[1..4] - eval(shift(@insns)); - eval(shift(@insns)); - &palignr ($t3,@X[2],$SZ); # X[9..12] - eval(shift(@insns)); - eval(shift(@insns)); - eval(shift(@insns)); - eval(shift(@insns)); #@ - &movdqa ($t1,$t0); - eval(shift(@insns)); - eval(shift(@insns)); - &movdqa ($t2,$t0); - eval(shift(@insns)); #@ - eval(shift(@insns)); - &psrld ($t0,$sigma0[2]); - eval(shift(@insns)); - eval(shift(@insns)); - eval(shift(@insns)); - &paddd (@X[0],$t3); # X[0..3] += X[9..12] - eval(shift(@insns)); #@ - eval(shift(@insns)); - &psrld ($t2,$sigma0[0]); - eval(shift(@insns)); - eval(shift(@insns)); - &pshufd ($t3,@X[3],0b11111010); # X[4..15] - eval(shift(@insns)); - eval(shift(@insns)); #@ - &pslld ($t1,8*$SZ-$sigma0[1]); - eval(shift(@insns)); - eval(shift(@insns)); - &pxor ($t0,$t2); - eval(shift(@insns)); #@ - eval(shift(@insns)); - eval(shift(@insns)); - eval(shift(@insns)); #@ - &psrld ($t2,$sigma0[1]-$sigma0[0]); - eval(shift(@insns)); - &pxor ($t0,$t1); - eval(shift(@insns)); - eval(shift(@insns)); - &pslld ($t1,$sigma0[1]-$sigma0[0]); - eval(shift(@insns)); - eval(shift(@insns)); - &pxor ($t0,$t2); - eval(shift(@insns)); - eval(shift(@insns)); #@ - &movdqa ($t2,$t3); - eval(shift(@insns)); - eval(shift(@insns)); - &pxor ($t0,$t1); # sigma0(X[1..4]) - eval(shift(@insns)); #@ - eval(shift(@insns)); - eval(shift(@insns)); - &psrld ($t3,$sigma1[2]); - eval(shift(@insns)); - eval(shift(@insns)); - &paddd (@X[0],$t0); # X[0..3] += sigma0(X[1..4]) - eval(shift(@insns)); #@ - eval(shift(@insns)); - &psrlq ($t2,$sigma1[0]); - eval(shift(@insns)); - eval(shift(@insns)); - eval(shift(@insns)); - &pxor ($t3,$t2); - eval(shift(@insns)); #@ - eval(shift(@insns)); - eval(shift(@insns)); - eval(shift(@insns)); #@ - &psrlq ($t2,$sigma1[1]-$sigma1[0]); - eval(shift(@insns)); - eval(shift(@insns)); - &pxor ($t3,$t2); - eval(shift(@insns)); #@ - eval(shift(@insns)); - eval(shift(@insns)); - #&pshufb ($t3,$t4); # sigma1(X[14..15]) - &pshufd ($t3,$t3,0b10000000); - eval(shift(@insns)); - eval(shift(@insns)); - eval(shift(@insns)); - &psrldq ($t3,8); - eval(shift(@insns)); - eval(shift(@insns)); #@ - eval(shift(@insns)); - eval(shift(@insns)); - eval(shift(@insns)); #@ - &paddd (@X[0],$t3); # X[0..1] += sigma1(X[14..15]) - eval(shift(@insns)); - eval(shift(@insns)); - eval(shift(@insns)); - &pshufd ($t3,@X[0],0b01010000); # X[16..17] - eval(shift(@insns)); - eval(shift(@insns)); #@ - eval(shift(@insns)); - &movdqa ($t2,$t3); - eval(shift(@insns)); - eval(shift(@insns)); - &psrld ($t3,$sigma1[2]); - eval(shift(@insns)); - eval(shift(@insns)); #@ - &psrlq ($t2,$sigma1[0]); - eval(shift(@insns)); - eval(shift(@insns)); - &pxor ($t3,$t2); - eval(shift(@insns)); #@ - eval(shift(@insns)); - eval(shift(@insns)); - eval(shift(@insns)); #@ - eval(shift(@insns)); - &psrlq ($t2,$sigma1[1]-$sigma1[0]); - eval(shift(@insns)); - eval(shift(@insns)); - eval(shift(@insns)); - &pxor ($t3,$t2); - eval(shift(@insns)); - eval(shift(@insns)); - eval(shift(@insns)); #@ - #&pshufb ($t3,$t5); - &pshufd ($t3,$t3,0b00001000); - eval(shift(@insns)); - eval(shift(@insns)); - &movdqa ($t2,16*2*$j."($Tbl)"); - eval(shift(@insns)); #@ - eval(shift(@insns)); - &pslldq ($t3,8); - eval(shift(@insns)); - eval(shift(@insns)); - eval(shift(@insns)); - &paddd (@X[0],$t3); # X[2..3] += sigma1(X[16..17]) - eval(shift(@insns)); #@ - eval(shift(@insns)); - eval(shift(@insns)); - } - &paddd ($t2,@X[0]); - foreach (@insns) { eval; } # remaining instructions - &movdqa (16*$j."(%rsp)",$t2); -} - - for ($i=0,$j=0; $j<4; $j++) { - &SSSE3_256_00_47($j,\&body_00_15,@X); - push(@X,shift(@X)); # rotate(@X) - } - &cmpb ($SZ-1+16*2*$SZ."($Tbl)",0); - &jne (".Lssse3_00_47"); - - for ($i=0; $i<16; ) { - foreach(body_00_15()) { eval; } - } -$code.=<<___; - mov $_ctx,$ctx - mov $a1,$A - - add $SZ*0($ctx),$A - lea 16*$SZ($inp),$inp - add $SZ*1($ctx),$B - add $SZ*2($ctx),$C - add $SZ*3($ctx),$D - add $SZ*4($ctx),$E - add $SZ*5($ctx),$F - add $SZ*6($ctx),$G - add $SZ*7($ctx),$H - - cmp $_end,$inp - - mov $A,$SZ*0($ctx) - mov $B,$SZ*1($ctx) - mov $C,$SZ*2($ctx) - mov $D,$SZ*3($ctx) - mov $E,$SZ*4($ctx) - mov $F,$SZ*5($ctx) - mov $G,$SZ*6($ctx) - mov $H,$SZ*7($ctx) - jb .Lloop_ssse3 - - mov $_rsp,%rsi -.cfi_def_cfa %rsi,8 -___ -$code.=<<___ if ($win64); - movaps 16*$SZ+32(%rsp),%xmm6 - movaps 16*$SZ+48(%rsp),%xmm7 - movaps 16*$SZ+64(%rsp),%xmm8 - movaps 16*$SZ+80(%rsp),%xmm9 -___ -$code.=<<___; - mov -48(%rsi),%r15 -.cfi_restore %r15 - mov -40(%rsi),%r14 -.cfi_restore %r14 - mov -32(%rsi),%r13 -.cfi_restore %r13 - mov -24(%rsi),%r12 -.cfi_restore %r12 - mov -16(%rsi),%rbp -.cfi_restore %rbp - mov -8(%rsi),%rbx -.cfi_restore %rbx - lea (%rsi),%rsp -.cfi_def_cfa_register %rsp -.Lepilogue_ssse3: - ret -.cfi_endproc -.size ${func}_ssse3,.-${func}_ssse3 -___ -} - -if ($avx) {{ -###################################################################### -# AVX+shrd code path -# -local *ror = sub { &shrd(@_[0],@_) }; - -$code.=<<___; -.type ${func}_avx,\@function,3 -.align 64 -${func}_avx: -.cfi_startproc -.Lavx_shortcut: - mov %rsp,%rax # copy %rsp -.cfi_def_cfa_register %rax - push %rbx -.cfi_push %rbx - push %rbp -.cfi_push %rbp - push %r12 -.cfi_push %r12 - push %r13 -.cfi_push %r13 - push %r14 -.cfi_push %r14 - push %r15 -.cfi_push %r15 - shl \$4,%rdx # num*16 - sub \$`$framesz+$win64*16*($SZ==4?4:6)`,%rsp - lea ($inp,%rdx,$SZ),%rdx # inp+num*16*$SZ - and \$-64,%rsp # align stack frame - mov $ctx,$_ctx # save ctx, 1st arg - mov $inp,$_inp # save inp, 2nd arh - mov %rdx,$_end # save end pointer, "3rd" arg - mov %rax,$_rsp # save copy of %rsp -.cfi_cfa_expression $_rsp,deref,+8 -___ -$code.=<<___ if ($win64); - movaps %xmm6,16*$SZ+32(%rsp) - movaps %xmm7,16*$SZ+48(%rsp) - movaps %xmm8,16*$SZ+64(%rsp) - movaps %xmm9,16*$SZ+80(%rsp) -___ -$code.=<<___ if ($win64 && $SZ>4); - movaps %xmm10,16*$SZ+96(%rsp) - movaps %xmm11,16*$SZ+112(%rsp) -___ -$code.=<<___; -.Lprologue_avx: - - vzeroupper - mov $SZ*0($ctx),$A - mov $SZ*1($ctx),$B - mov $SZ*2($ctx),$C - mov $SZ*3($ctx),$D - mov $SZ*4($ctx),$E - mov $SZ*5($ctx),$F - mov $SZ*6($ctx),$G - mov $SZ*7($ctx),$H -___ - if ($SZ==4) { # SHA256 - my @X = map("%xmm$_",(0..3)); - my ($t0,$t1,$t2,$t3, $t4,$t5) = map("%xmm$_",(4..9)); - -$code.=<<___; - vmovdqa $TABLE+`$SZ*2*$rounds`+32(%rip),$t4 - vmovdqa $TABLE+`$SZ*2*$rounds`+64(%rip),$t5 - jmp .Lloop_avx -.align 16 -.Lloop_avx: - vmovdqa $TABLE+`$SZ*2*$rounds`(%rip),$t3 - vmovdqu 0x00($inp),@X[0] - vmovdqu 0x10($inp),@X[1] - vmovdqu 0x20($inp),@X[2] - vmovdqu 0x30($inp),@X[3] - vpshufb $t3,@X[0],@X[0] - lea $TABLE(%rip),$Tbl - vpshufb $t3,@X[1],@X[1] - vpshufb $t3,@X[2],@X[2] - vpaddd 0x00($Tbl),@X[0],$t0 - vpshufb $t3,@X[3],@X[3] - vpaddd 0x20($Tbl),@X[1],$t1 - vpaddd 0x40($Tbl),@X[2],$t2 - vpaddd 0x60($Tbl),@X[3],$t3 - vmovdqa $t0,0x00(%rsp) - mov $A,$a1 - vmovdqa $t1,0x10(%rsp) - mov $B,$a3 - vmovdqa $t2,0x20(%rsp) - xor $C,$a3 # magic - vmovdqa $t3,0x30(%rsp) - mov $E,$a0 - jmp .Lavx_00_47 - -.align 16 -.Lavx_00_47: - sub \$`-16*2*$SZ`,$Tbl # size optimization -___ -sub Xupdate_256_AVX () { - ( - '&vpalignr ($t0,@X[1],@X[0],$SZ)', # X[1..4] - '&vpalignr ($t3,@X[3],@X[2],$SZ)', # X[9..12] - '&vpsrld ($t2,$t0,$sigma0[0]);', - '&vpaddd (@X[0],@X[0],$t3)', # X[0..3] += X[9..12] - '&vpsrld ($t3,$t0,$sigma0[2])', - '&vpslld ($t1,$t0,8*$SZ-$sigma0[1]);', - '&vpxor ($t0,$t3,$t2)', - '&vpshufd ($t3,@X[3],0b11111010)',# X[14..15] - '&vpsrld ($t2,$t2,$sigma0[1]-$sigma0[0]);', - '&vpxor ($t0,$t0,$t1)', - '&vpslld ($t1,$t1,$sigma0[1]-$sigma0[0]);', - '&vpxor ($t0,$t0,$t2)', - '&vpsrld ($t2,$t3,$sigma1[2]);', - '&vpxor ($t0,$t0,$t1)', # sigma0(X[1..4]) - '&vpsrlq ($t3,$t3,$sigma1[0]);', - '&vpaddd (@X[0],@X[0],$t0)', # X[0..3] += sigma0(X[1..4]) - '&vpxor ($t2,$t2,$t3);', - '&vpsrlq ($t3,$t3,$sigma1[1]-$sigma1[0])', - '&vpxor ($t2,$t2,$t3)', - '&vpshufb ($t2,$t2,$t4)', # sigma1(X[14..15]) - '&vpaddd (@X[0],@X[0],$t2)', # X[0..1] += sigma1(X[14..15]) - '&vpshufd ($t3,@X[0],0b01010000)',# X[16..17] - '&vpsrld ($t2,$t3,$sigma1[2])', - '&vpsrlq ($t3,$t3,$sigma1[0])', - '&vpxor ($t2,$t2,$t3);', - '&vpsrlq ($t3,$t3,$sigma1[1]-$sigma1[0])', - '&vpxor ($t2,$t2,$t3)', - '&vpshufb ($t2,$t2,$t5)', - '&vpaddd (@X[0],@X[0],$t2)' # X[2..3] += sigma1(X[16..17]) - ); -} - -sub AVX_256_00_47 () { -my $j = shift; -my $body = shift; -my @X = @_; -my @insns = (&$body,&$body,&$body,&$body); # 104 instructions - - foreach (Xupdate_256_AVX()) { # 29 instructions - eval; - eval(shift(@insns)); - eval(shift(@insns)); - eval(shift(@insns)); - } - &vpaddd ($t2,@X[0],16*2*$j."($Tbl)"); - foreach (@insns) { eval; } # remaining instructions - &vmovdqa (16*$j."(%rsp)",$t2); -} - - for ($i=0,$j=0; $j<4; $j++) { - &AVX_256_00_47($j,\&body_00_15,@X); - push(@X,shift(@X)); # rotate(@X) - } - &cmpb ($SZ-1+16*2*$SZ."($Tbl)",0); - &jne (".Lavx_00_47"); - - for ($i=0; $i<16; ) { - foreach(body_00_15()) { eval; } - } - - } else { # SHA512 - my @X = map("%xmm$_",(0..7)); - my ($t0,$t1,$t2,$t3) = map("%xmm$_",(8..11)); - -$code.=<<___; - jmp .Lloop_avx -.align 16 -.Lloop_avx: - vmovdqa $TABLE+`$SZ*2*$rounds`(%rip),$t3 - vmovdqu 0x00($inp),@X[0] - lea $TABLE+0x80(%rip),$Tbl # size optimization - vmovdqu 0x10($inp),@X[1] - vmovdqu 0x20($inp),@X[2] - vpshufb $t3,@X[0],@X[0] - vmovdqu 0x30($inp),@X[3] - vpshufb $t3,@X[1],@X[1] - vmovdqu 0x40($inp),@X[4] - vpshufb $t3,@X[2],@X[2] - vmovdqu 0x50($inp),@X[5] - vpshufb $t3,@X[3],@X[3] - vmovdqu 0x60($inp),@X[6] - vpshufb $t3,@X[4],@X[4] - vmovdqu 0x70($inp),@X[7] - vpshufb $t3,@X[5],@X[5] - vpaddq -0x80($Tbl),@X[0],$t0 - vpshufb $t3,@X[6],@X[6] - vpaddq -0x60($Tbl),@X[1],$t1 - vpshufb $t3,@X[7],@X[7] - vpaddq -0x40($Tbl),@X[2],$t2 - vpaddq -0x20($Tbl),@X[3],$t3 - vmovdqa $t0,0x00(%rsp) - vpaddq 0x00($Tbl),@X[4],$t0 - vmovdqa $t1,0x10(%rsp) - vpaddq 0x20($Tbl),@X[5],$t1 - vmovdqa $t2,0x20(%rsp) - vpaddq 0x40($Tbl),@X[6],$t2 - vmovdqa $t3,0x30(%rsp) - vpaddq 0x60($Tbl),@X[7],$t3 - vmovdqa $t0,0x40(%rsp) - mov $A,$a1 - vmovdqa $t1,0x50(%rsp) - mov $B,$a3 - vmovdqa $t2,0x60(%rsp) - xor $C,$a3 # magic - vmovdqa $t3,0x70(%rsp) - mov $E,$a0 - jmp .Lavx_00_47 - -.align 16 -.Lavx_00_47: - add \$`16*2*$SZ`,$Tbl -___ -sub Xupdate_512_AVX () { - ( - '&vpalignr ($t0,@X[1],@X[0],$SZ)', # X[1..2] - '&vpalignr ($t3,@X[5],@X[4],$SZ)', # X[9..10] - '&vpsrlq ($t2,$t0,$sigma0[0])', - '&vpaddq (@X[0],@X[0],$t3);', # X[0..1] += X[9..10] - '&vpsrlq ($t3,$t0,$sigma0[2])', - '&vpsllq ($t1,$t0,8*$SZ-$sigma0[1]);', - '&vpxor ($t0,$t3,$t2)', - '&vpsrlq ($t2,$t2,$sigma0[1]-$sigma0[0]);', - '&vpxor ($t0,$t0,$t1)', - '&vpsllq ($t1,$t1,$sigma0[1]-$sigma0[0]);', - '&vpxor ($t0,$t0,$t2)', - '&vpsrlq ($t3,@X[7],$sigma1[2]);', - '&vpxor ($t0,$t0,$t1)', # sigma0(X[1..2]) - '&vpsllq ($t2,@X[7],8*$SZ-$sigma1[1]);', - '&vpaddq (@X[0],@X[0],$t0)', # X[0..1] += sigma0(X[1..2]) - '&vpsrlq ($t1,@X[7],$sigma1[0]);', - '&vpxor ($t3,$t3,$t2)', - '&vpsllq ($t2,$t2,$sigma1[1]-$sigma1[0]);', - '&vpxor ($t3,$t3,$t1)', - '&vpsrlq ($t1,$t1,$sigma1[1]-$sigma1[0]);', - '&vpxor ($t3,$t3,$t2)', - '&vpxor ($t3,$t3,$t1)', # sigma1(X[14..15]) - '&vpaddq (@X[0],@X[0],$t3)', # X[0..1] += sigma1(X[14..15]) - ); -} - -sub AVX_512_00_47 () { -my $j = shift; -my $body = shift; -my @X = @_; -my @insns = (&$body,&$body); # 52 instructions - - foreach (Xupdate_512_AVX()) { # 23 instructions - eval; - eval(shift(@insns)); - eval(shift(@insns)); - } - &vpaddq ($t2,@X[0],16*2*$j-0x80."($Tbl)"); - foreach (@insns) { eval; } # remaining instructions - &vmovdqa (16*$j."(%rsp)",$t2); -} - - for ($i=0,$j=0; $j<8; $j++) { - &AVX_512_00_47($j,\&body_00_15,@X); - push(@X,shift(@X)); # rotate(@X) - } - &cmpb ($SZ-1+16*2*$SZ-0x80."($Tbl)",0); - &jne (".Lavx_00_47"); - - for ($i=0; $i<16; ) { - foreach(body_00_15()) { eval; } - } -} -$code.=<<___; - mov $_ctx,$ctx - mov $a1,$A - - add $SZ*0($ctx),$A - lea 16*$SZ($inp),$inp - add $SZ*1($ctx),$B - add $SZ*2($ctx),$C - add $SZ*3($ctx),$D - add $SZ*4($ctx),$E - add $SZ*5($ctx),$F - add $SZ*6($ctx),$G - add $SZ*7($ctx),$H - - cmp $_end,$inp - - mov $A,$SZ*0($ctx) - mov $B,$SZ*1($ctx) - mov $C,$SZ*2($ctx) - mov $D,$SZ*3($ctx) - mov $E,$SZ*4($ctx) - mov $F,$SZ*5($ctx) - mov $G,$SZ*6($ctx) - mov $H,$SZ*7($ctx) - jb .Lloop_avx - - mov $_rsp,%rsi -.cfi_def_cfa %rsi,8 - vzeroupper -___ -$code.=<<___ if ($win64); - movaps 16*$SZ+32(%rsp),%xmm6 - movaps 16*$SZ+48(%rsp),%xmm7 - movaps 16*$SZ+64(%rsp),%xmm8 - movaps 16*$SZ+80(%rsp),%xmm9 -___ -$code.=<<___ if ($win64 && $SZ>4); - movaps 16*$SZ+96(%rsp),%xmm10 - movaps 16*$SZ+112(%rsp),%xmm11 -___ -$code.=<<___; - mov -48(%rsi),%r15 -.cfi_restore %r15 - mov -40(%rsi),%r14 -.cfi_restore %r14 - mov -32(%rsi),%r13 -.cfi_restore %r13 - mov -24(%rsi),%r12 -.cfi_restore %r12 - mov -16(%rsi),%rbp -.cfi_restore %rbp - mov -8(%rsi),%rbx -.cfi_restore %rbx - lea (%rsi),%rsp -.cfi_def_cfa_register %rsp -.Lepilogue_avx: - ret -.cfi_endproc -.size ${func}_avx,.-${func}_avx -___ - -}}}}} - -# EXCEPTION_DISPOSITION handler (EXCEPTION_RECORD *rec,ULONG64 frame, -# CONTEXT *context,DISPATCHER_CONTEXT *disp) -if ($win64) { -$rec="%rcx"; -$frame="%rdx"; -$context="%r8"; -$disp="%r9"; - -$code.=<<___; -.extern __imp_RtlVirtualUnwind -.type se_handler,\@abi-omnipotent -.align 16 -se_handler: - push %rsi - push %rdi - push %rbx - push %rbp - push %r12 - push %r13 - push %r14 - push %r15 - pushfq - sub \$64,%rsp - - mov 120($context),%rax # pull context->Rax - mov 248($context),%rbx # pull context->Rip - - mov 8($disp),%rsi # disp->ImageBase - mov 56($disp),%r11 # disp->HanderlData - - mov 0(%r11),%r10d # HandlerData[0] - lea (%rsi,%r10),%r10 # prologue label - cmp %r10,%rbx # context->RipRsp - - mov 4(%r11),%r10d # HandlerData[1] - lea (%rsi,%r10),%r10 # epilogue label - cmp %r10,%rbx # context->Rip>=epilogue label - jae .Lin_prologue -___ -$code.=<<___; - mov %rax,%rsi # put aside Rsp - mov 16*$SZ+3*8(%rax),%rax # pull $_rsp - - mov -8(%rax),%rbx - mov -16(%rax),%rbp - mov -24(%rax),%r12 - mov -32(%rax),%r13 - mov -40(%rax),%r14 - mov -48(%rax),%r15 - mov %rbx,144($context) # restore context->Rbx - mov %rbp,160($context) # restore context->Rbp - mov %r12,216($context) # restore context->R12 - mov %r13,224($context) # restore context->R13 - mov %r14,232($context) # restore context->R14 - mov %r15,240($context) # restore context->R15 - - lea .Lepilogue(%rip),%r10 - cmp %r10,%rbx - jb .Lin_prologue # non-AVX code - - lea 16*$SZ+4*8(%rsi),%rsi # Xmm6- save area - lea 512($context),%rdi # &context.Xmm6 - mov \$`$SZ==4?8:12`,%ecx - .long 0xa548f3fc # cld; rep movsq - -.Lin_prologue: - mov 8(%rax),%rdi - mov 16(%rax),%rsi - mov %rax,152($context) # restore context->Rsp - mov %rsi,168($context) # restore context->Rsi - mov %rdi,176($context) # restore context->Rdi - - mov 40($disp),%rdi # disp->ContextRecord - mov $context,%rsi # context - mov \$154,%ecx # sizeof(CONTEXT) - .long 0xa548f3fc # cld; rep movsq - - mov $disp,%rsi - xor %rcx,%rcx # arg1, UNW_FLAG_NHANDLER - mov 8(%rsi),%rdx # arg2, disp->ImageBase - mov 0(%rsi),%r8 # arg3, disp->ControlPc - mov 16(%rsi),%r9 # arg4, disp->FunctionEntry - mov 40(%rsi),%r10 # disp->ContextRecord - lea 56(%rsi),%r11 # &disp->HandlerData - lea 24(%rsi),%r12 # &disp->EstablisherFrame - mov %r10,32(%rsp) # arg5 - mov %r11,40(%rsp) # arg6 - mov %r12,48(%rsp) # arg7 - mov %rcx,56(%rsp) # arg8, (NULL) - call *__imp_RtlVirtualUnwind(%rip) - - mov \$1,%eax # ExceptionContinueSearch - add \$64,%rsp - popfq - pop %r15 - pop %r14 - pop %r13 - pop %r12 - pop %rbp - pop %rbx - pop %rdi - pop %rsi - ret -.size se_handler,.-se_handler -___ - -$code.=<<___ if ($SZ==4 && $shaext); -.type shaext_handler,\@abi-omnipotent -.align 16 -shaext_handler: - push %rsi - push %rdi - push %rbx - push %rbp - push %r12 - push %r13 - push %r14 - push %r15 - pushfq - sub \$64,%rsp - - mov 120($context),%rax # pull context->Rax - mov 248($context),%rbx # pull context->Rip - - lea .Lprologue_shaext(%rip),%r10 - cmp %r10,%rbx # context->Rip<.Lprologue - jb .Lin_prologue - - lea .Lepilogue_shaext(%rip),%r10 - cmp %r10,%rbx # context->Rip>=.Lepilogue - jae .Lin_prologue - - lea -8-5*16(%rax),%rsi - lea 512($context),%rdi # &context.Xmm6 - mov \$10,%ecx - .long 0xa548f3fc # cld; rep movsq - - jmp .Lin_prologue -.size shaext_handler,.-shaext_handler -___ - -$code.=<<___; -.section .pdata -.align 4 - .rva .LSEH_begin_$func - .rva .LSEH_end_$func - .rva .LSEH_info_$func -___ -$code.=<<___ if ($SZ==4 && $shaext); - .rva .LSEH_begin_${func}_shaext - .rva .LSEH_end_${func}_shaext - .rva .LSEH_info_${func}_shaext -___ -$code.=<<___ if ($SZ==4); - .rva .LSEH_begin_${func}_ssse3 - .rva .LSEH_end_${func}_ssse3 - .rva .LSEH_info_${func}_ssse3 -___ -$code.=<<___ if ($avx); - .rva .LSEH_begin_${func}_avx - .rva .LSEH_end_${func}_avx - .rva .LSEH_info_${func}_avx -___ -$code.=<<___; -.section .xdata -.align 8 -.LSEH_info_$func: - .byte 9,0,0,0 - .rva se_handler - .rva .Lprologue,.Lepilogue # HandlerData[] -___ -$code.=<<___ if ($SZ==4 && $shaext); -.LSEH_info_${func}_shaext: - .byte 9,0,0,0 - .rva shaext_handler -___ -$code.=<<___ if ($SZ==4); -.LSEH_info_${func}_ssse3: - .byte 9,0,0,0 - .rva se_handler - .rva .Lprologue_ssse3,.Lepilogue_ssse3 # HandlerData[] -___ -$code.=<<___ if ($avx); -.LSEH_info_${func}_avx: - .byte 9,0,0,0 - .rva se_handler - .rva .Lprologue_avx,.Lepilogue_avx # HandlerData[] -___ -} - -sub sha256op38 { - my $instr = shift; - my %opcodelet = ( - "sha256rnds2" => 0xcb, - "sha256msg1" => 0xcc, - "sha256msg2" => 0xcd ); - - if (defined($opcodelet{$instr}) && @_[0] =~ /%xmm([0-7]),\s*%xmm([0-7])/) { - my @opcode=(0x0f,0x38); - push @opcode,$opcodelet{$instr}; - push @opcode,0xc0|($1&7)|(($2&7)<<3); # ModR/M - return ".byte\t".join(',',@opcode); - } else { - return $instr."\t".@_[0]; - } -} - -foreach (split("\n",$code)) { - s/\`([^\`]*)\`/eval $1/geo; - - s/\b(sha256[^\s]*)\s+(.*)/sha256op38($1,$2)/geo; - - print $_,"\n"; -} -close STDOUT or die "error closing STDOUT"; diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/crypto/internal.h temporalio-1.3.0/vendor/ring-0.16.20/crypto/internal.h --- temporalio-1.3.0/vendor/ring-0.16.20/crypto/internal.h 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/crypto/internal.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,297 +0,0 @@ -/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) - * All rights reserved. - * - * This package is an SSL implementation written - * by Eric Young (eay@cryptsoft.com). - * The implementation was written so as to conform with Netscapes SSL. - * - * This library is free for commercial and non-commercial use as long as - * the following conditions are aheared to. The following conditions - * apply to all code found in this distribution, be it the RC4, RSA, - * lhash, DES, etc., code; not just the SSL code. The SSL documentation - * included with this distribution is covered by the same copyright terms - * except that the holder is Tim Hudson (tjh@cryptsoft.com). - * - * Copyright remains Eric Young's, and as such any Copyright notices in - * the code are not to be removed. - * If this package is used in a product, Eric Young should be given attribution - * as the author of the parts of the library used. - * This can be in the form of a textual message at program startup or - * in documentation (online or textual) provided with the package. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * "This product includes cryptographic software written by - * Eric Young (eay@cryptsoft.com)" - * The word 'cryptographic' can be left out if the rouines from the library - * being used are not cryptographic related :-). - * 4. If you include any Windows specific code (or a derivative thereof) from - * the apps directory (application code) you must include an acknowledgement: - * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" - * - * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * The licence and distribution terms for any publically available version or - * derivative of this code cannot be changed. i.e. this code cannot simply be - * copied and put under another distribution licence - * [including the GNU Public Licence.] - */ -/* ==================================================================== - * Copyright (c) 1998-2001 The OpenSSL Project. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. All advertising materials mentioning features or use of this - * software must display the following acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" - * - * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to - * endorse or promote products derived from this software without - * prior written permission. For written permission, please contact - * openssl-core@openssl.org. - * - * 5. Products derived from this software may not be called "OpenSSL" - * nor may "OpenSSL" appear in their names without prior written - * permission of the OpenSSL Project. - * - * 6. Redistributions of any form whatsoever must retain the following - * acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit (http://www.openssl.org/)" - * - * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY - * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * ==================================================================== - * - * This product includes cryptographic software written by Eric Young - * (eay@cryptsoft.com). This product includes software written by Tim - * Hudson (tjh@cryptsoft.com). */ - -#ifndef OPENSSL_HEADER_CRYPTO_INTERNAL_H -#define OPENSSL_HEADER_CRYPTO_INTERNAL_H - -#include // Must be first. - -#include "GFp/check.h" - -#if defined(__GNUC__) && \ - (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) < 40800 -// |alignas| and |alignof| were added in C11. GCC added support in version 4.8. -// Testing for __STDC_VERSION__/__cplusplus doesn't work because 4.7 already -// reports support for C11. -#define alignas(x) __attribute__ ((aligned (x))) -#elif defined(_MSC_VER) && !defined(__clang__) -#define alignas(x) __declspec(align(x)) -#else -#include -#endif - -#if (!defined(_MSC_VER) || defined(__clang__)) && defined(OPENSSL_64_BIT) -#define BORINGSSL_HAS_UINT128 -typedef __int128_t int128_t; -typedef __uint128_t uint128_t; -#endif - - -// Constant-time utility functions. -// -// The following methods return a bitmask of all ones (0xff...f) for true and 0 -// for false. This is useful for choosing a value based on the result of a -// conditional in constant time. For example, -// -// if (a < b) { -// c = a; -// } else { -// c = b; -// } -// -// can be written as -// -// crypto_word lt = constant_time_lt_w(a, b); -// c = constant_time_select_w(lt, a, b); - -// crypto_word is the type that most constant-time functions use. Ideally we -// would like it to be |size_t|, but NaCl builds in 64-bit mode with 32-bit -// pointers, which means that |size_t| can be 32 bits when |crypto_word| is 64 -// bits. -#if defined(OPENSSL_64_BIT) -typedef uint64_t crypto_word; -#define CRYPTO_WORD_BITS (64u) -#elif defined(OPENSSL_32_BIT) -typedef uint32_t crypto_word; -#define CRYPTO_WORD_BITS (32u) -#else -#error "Must define either OPENSSL_32_BIT or OPENSSL_64_BIT" -#endif - -#define CONSTTIME_TRUE_W ~((crypto_word)0) -#define CONSTTIME_FALSE_W ((crypto_word)0) - -// value_barrier_w returns |a|, but prevents GCC and Clang from reasoning about -// the returned value. This is used to mitigate compilers undoing constant-time -// code, until we can express our requirements directly in the language. -// -// Note the compiler is aware that |value_barrier_w| has no side effects and -// always has the same output for a given input. This allows it to eliminate -// dead code, move computations across loops, and vectorize. -static inline crypto_word value_barrier_w(crypto_word a) { -#if !defined(OPENSSL_NO_ASM) && (defined(__GNUC__) || defined(__clang__)) - __asm__("" : "+r"(a) : /* no inputs */); -#endif - return a; -} - -// value_barrier_u32 behaves like |value_barrier_w| but takes a |uint32_t|. -static inline uint32_t value_barrier_u32(uint32_t a) { -#if !defined(OPENSSL_NO_ASM) && (defined(__GNUC__) || defined(__clang__)) - __asm__("" : "+r"(a) : /* no inputs */); -#endif - return a; -} - -// value_barrier_u64 behaves like |value_barrier_w| but takes a |uint64_t|. -static inline uint64_t value_barrier_u64(uint64_t a) { -#if !defined(OPENSSL_NO_ASM) && (defined(__GNUC__) || defined(__clang__)) - __asm__("" : "+r"(a) : /* no inputs */); -#endif - return a; -} - -// constant_time_msb_w returns the given value with the MSB copied to all the -// other bits. -static inline crypto_word constant_time_msb_w(crypto_word a) { - return 0u - (a >> (sizeof(a) * 8 - 1)); -} - -// constant_time_is_zero_w returns 0xff..f if a == 0 and 0 otherwise. -static inline crypto_word constant_time_is_zero_w(crypto_word a) { - // Here is an SMT-LIB verification of this formula: - // - // (define-fun is_zero ((a (_ BitVec 32))) (_ BitVec 32) - // (bvand (bvnot a) (bvsub a #x00000001)) - // ) - // - // (declare-fun a () (_ BitVec 32)) - // - // (assert (not (= (= #x00000001 (bvlshr (is_zero a) #x0000001f)) (= a #x00000000)))) - // (check-sat) - // (get-model) - return constant_time_msb_w(~a & (a - 1)); -} - -static inline crypto_word constant_time_is_nonzero_w(crypto_word a) { - return ~constant_time_is_zero_w(a); -} - -// constant_time_eq_w returns 0xff..f if a == b and 0 otherwise. -static inline crypto_word constant_time_eq_w(crypto_word a, - crypto_word b) { - return constant_time_is_zero_w(a ^ b); -} - -// constant_time_select_w returns (mask & a) | (~mask & b). When |mask| is all -// 1s or all 0s (as returned by the methods above), the select methods return -// either |a| (if |mask| is nonzero) or |b| (if |mask| is zero). -static inline crypto_word constant_time_select_w(crypto_word mask, - crypto_word a, - crypto_word b) { - // Clang recognizes this pattern as a select. While it usually transforms it - // to a cmov, it sometimes further transforms it into a branch, which we do - // not want. - // - // Adding barriers to both |mask| and |~mask| breaks the relationship between - // the two, which makes the compiler stick with bitmasks. - return (value_barrier_w(mask) & a) | (value_barrier_w(~mask) & b); -} - -// Endianness conversions. - -#if defined(__GNUC__) && __GNUC__ >= 2 -static inline uint32_t CRYPTO_bswap4(uint32_t x) { - return __builtin_bswap32(x); -} -#elif defined(_MSC_VER) -#pragma warning(push, 3) -#include -#pragma warning(pop) -#pragma intrinsic(_byteswap_uint64, _byteswap_ulong) -static inline uint32_t CRYPTO_bswap4(uint32_t x) { - return _byteswap_ulong(x); -} -#endif - -#if !defined(GFp_NOSTDLIBINC) -#include -#endif - -static inline void *GFp_memcpy(void *dst, const void *src, size_t n) { -#if !defined(GFp_NOSTDLIBINC) - if (n == 0) { - return dst; - } - return memcpy(dst, src, n); -#else - unsigned char *d = dst; - const unsigned char *s = src; - for (size_t i = 0; i < n; ++i) { - d[i] = s[i]; - } - return dst; -#endif -} - -static inline void *GFp_memset(void *dst, int c, size_t n) { -#if !defined(GFp_NOSTDLIBINC) - if (n == 0) { - return dst; - } - return memset(dst, c, n); -#else - unsigned char *d = dst; - for (size_t i = 0; i < n; ++i) { - d[i] = (unsigned char)c; - } - return dst; -#endif -} - -#endif // OPENSSL_HEADER_CRYPTO_INTERNAL_H diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/crypto/limbs/limbs.c temporalio-1.3.0/vendor/ring-0.16.20/crypto/limbs/limbs.c --- temporalio-1.3.0/vendor/ring-0.16.20/crypto/limbs/limbs.c 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/crypto/limbs/limbs.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,198 +0,0 @@ -/* Copyright 2016-2017 Brian Smith. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY - * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION - * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ - -#include "limbs.h" - -#include "../internal.h" -#include "../fipsmodule/bn/internal.h" -#include "limbs.inl" - - -/* XXX: We assume that the conversion from |Carry| to |Limb| is constant-time, - * but we haven't verified that assumption. TODO: Fix it so we don't need to - * make that assumption. */ - -/* Returns 0xfff..f if |a| is all zero limbs, and zero otherwise. |num_limbs| - * may be zero. */ -Limb LIMBS_are_zero(const Limb a[], size_t num_limbs) { - Limb is_zero = CONSTTIME_TRUE_W; - for (size_t i = 0; i < num_limbs; ++i) { - is_zero = constant_time_select_w(is_zero, constant_time_is_zero_w(a[i]), - is_zero); - } - return is_zero; -} - -/* Returns 0xffff..f if |a == b|, and zero otherwise. |num_limbs| may be zero. */ -Limb LIMBS_equal(const Limb a[], const Limb b[], size_t num_limbs) { - Limb eq = CONSTTIME_TRUE_W; - for (size_t i = 0; i < num_limbs; ++i) { - eq = constant_time_select_w(eq, constant_time_eq_w(a[i], b[i]), eq); - } - return eq; -} - -/* Returns 0xffff..f if |a == b|, and zero otherwise. |num_limbs| may be zero. */ -Limb LIMBS_equal_limb(const Limb a[], Limb b, size_t num_limbs) { - if (num_limbs == 0) { - return constant_time_is_zero_w(b); - } - debug_assert_nonsecret(num_limbs >= 1); - Limb lo_equal = constant_time_eq_w(a[0], b); - Limb hi_zero = LIMBS_are_zero(&a[1], num_limbs - 1); - return constant_time_select_w(lo_equal, hi_zero, 0); -} - -/* Returns 0xfff..f if |a| is all zero limbs, and zero otherwise. - * |num_limbs| may be zero. */ -Limb LIMBS_are_even(const Limb a[], size_t num_limbs) { - Limb lo; - if (num_limbs == 0) { - lo = 0; - } else { - lo = a[0]; - } - return constant_time_is_zero_w(lo & 1); -} - -/* Returns 0xffff...f if |a| is less than |b|, and zero otherwise. */ -Limb LIMBS_less_than(const Limb a[], const Limb b[], size_t num_limbs) { - debug_assert_nonsecret(num_limbs >= 1); - /* There are lots of ways to implement this. It is implemented this way to - * be consistent with |LIMBS_limbs_reduce_once| and other code that makes such - * comparisons as part of doing conditional reductions. */ - Limb dummy; - Carry borrow = limb_sub(&dummy, a[0], b[0]); - for (size_t i = 1; i < num_limbs; ++i) { - borrow = limb_sbb(&dummy, a[i], b[i], borrow); - } - return constant_time_is_nonzero_w(borrow); -} - -Limb LIMBS_less_than_limb(const Limb a[], Limb b, size_t num_limbs) { - debug_assert_nonsecret(num_limbs >= 1); - - Limb dummy; - Limb lo = constant_time_is_nonzero_w(limb_sub(&dummy, a[0], b)); - Limb hi = LIMBS_are_zero(&a[1], num_limbs - 1); - return constant_time_select_w(lo, hi, lo); -} - -/* if (r >= m) { r -= m; } */ -void LIMBS_reduce_once(Limb r[], const Limb m[], size_t num_limbs) { - debug_assert_nonsecret(num_limbs >= 1); - /* This could be done more efficiently if we had |num_limbs| of extra space - * available, by storing |r - m| and then doing a conditional copy of either - * |r| or |r - m|. But, in order to operate in constant space, with an eye - * towards this function being used in RSA in the future, we do things a - * slightly less efficient way. */ - Limb lt = LIMBS_less_than(r, m, num_limbs); - Carry borrow = - limb_sub(&r[0], r[0], constant_time_select_w(lt, 0, m[0])); - for (size_t i = 1; i < num_limbs; ++i) { - /* XXX: This is probably particularly inefficient because the operations in - * constant_time_select affect the carry flag, so there will likely be - * loads and stores of |borrow|. */ - borrow = - limb_sbb(&r[i], r[i], constant_time_select_w(lt, 0, m[i]), borrow); - } - dev_assert_secret(borrow == 0); -} - -void LIMBS_add_mod(Limb r[], const Limb a[], const Limb b[], const Limb m[], - size_t num_limbs) { - Limb overflow1 = - constant_time_is_nonzero_w(limbs_add(r, a, b, num_limbs)); - Limb overflow2 = ~LIMBS_less_than(r, m, num_limbs); - Limb overflow = overflow1 | overflow2; - Carry borrow = limb_sub(&r[0], r[0], m[0] & overflow); - for (size_t i = 1; i < num_limbs; ++i) { - borrow = limb_sbb(&r[i], r[i], m[i] & overflow, borrow); - } -} - -void LIMBS_sub_mod(Limb r[], const Limb a[], const Limb b[], const Limb m[], - size_t num_limbs) { - Limb underflow = - constant_time_is_nonzero_w(limbs_sub(r, a, b, num_limbs)); - Carry carry = limb_add(&r[0], r[0], m[0] & underflow); - for (size_t i = 1; i < num_limbs; ++i) { - carry = limb_adc(&r[i], r[i], m[i] & underflow, carry); - } -} - -void LIMBS_shl_mod(Limb r[], const Limb a[], const Limb m[], size_t num_limbs) { - Limb overflow1 = - constant_time_is_nonzero_w(a[num_limbs - 1] & LIMB_HIGH_BIT); - Limb carry = 0; - for (size_t i = 0; i < num_limbs; ++i) { - Limb limb = a[i]; - Limb new_carry = limb >> (LIMB_BITS - 1); - r[i] = (limb << 1) | carry; - carry = new_carry; - } - Limb overflow2 = ~LIMBS_less_than(r, m, num_limbs); - Limb overflow = overflow1 | overflow2; - Carry borrow = limb_sub(&r[0], r[0], m[0] & overflow); - for (size_t i = 1; i < num_limbs; ++i) { - borrow = limb_sbb(&r[i], r[i], m[i] & overflow, borrow); - } -} - -int LIMBS_select_512_32(Limb r[], const Limb table[], size_t num_limbs, - crypto_word index) { - if (num_limbs % (512 / LIMB_BITS) != 0) { - return 0; - } - limbs_select(r, table, num_limbs, 32, index); - return 1; -} - -static const Limb FIVE_BITS_MASK = 0x1f; - -crypto_word LIMBS_window5_split_window(Limb lower_limb, Limb higher_limb, size_t index_within_word) { - Limb high_bits = (higher_limb << (LIMB_BITS - index_within_word)) - & FIVE_BITS_MASK; - // There are no bits outside the window above |index_within_word| (if there - // were then this wouldn't be a split window), so we don't need to mask - // |low_bits|. - Limb low_bits = lower_limb >> index_within_word; - return low_bits | high_bits; -} - -crypto_word LIMBS_window5_unsplit_window(Limb limb, size_t index_within_word) { - return (limb >> index_within_word) & FIVE_BITS_MASK; -} - -Limb LIMB_shr(Limb a, size_t shift) { - return a >> shift; -} - -Limb GFp_limbs_mul_add_limb(Limb r[], const Limb a[], Limb b, size_t num_limbs) { - Limb carried = 0; - for (size_t i = 0; i < num_limbs; ++i) { - Limb lo; - Limb hi; - bn_umult_lohi(&lo, &hi, a[i], b); - Limb tmp; - Carry c = limb_add(&tmp, lo, carried); - c = limb_adc(&carried, hi, 0, c); - dev_assert_secret(c == 0); - c = limb_add(&r[i], r[i], tmp); - c = limb_adc(&carried, carried, 0, c); - // (A * B) + C + D never carries. - dev_assert_secret(c == 0); - } - return carried; -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/crypto/limbs/limbs.h temporalio-1.3.0/vendor/ring-0.16.20/crypto/limbs/limbs.h --- temporalio-1.3.0/vendor/ring-0.16.20/crypto/limbs/limbs.h 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/crypto/limbs/limbs.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,40 +0,0 @@ -/* Copyright 2016 Brian Smith. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY - * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION - * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ - -#ifndef RING_LIMBS_H -#define RING_LIMBS_H - -#include - -#include "../internal.h" - -typedef crypto_word Limb; - -#define LIMB_BITS CRYPTO_WORD_BITS -#define LIMB_HIGH_BIT ((Limb)(1) << (LIMB_BITS - 1)) - - -Limb LIMBS_are_zero(const Limb a[], size_t num_limbs); -Limb LIMBS_are_even(const Limb a[], size_t num_limbs); -Limb LIMBS_equal(const Limb a[], const Limb b[], size_t num_limbs); -Limb LIMBS_equal_limb(const Limb a[], Limb b, size_t num_limbs); -void LIMBS_reduce_once(Limb r[], const Limb m[], size_t num_limbs); -void LIMBS_add_mod(Limb r[], const Limb a[], const Limb b[], const Limb m[], - size_t num_limbs); -void LIMBS_sub_mod(Limb r[], const Limb a[], const Limb b[], const Limb m[], - size_t num_limbs); -void LIMBS_shl_mod(Limb r[], const Limb a[], const Limb m[], size_t num_limbs); -Limb GFp_limbs_mul_add_limb(Limb r[], const Limb a[], Limb b, size_t num_limbs); - -#endif /* RING_LIMBS_H */ diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/crypto/limbs/limbs.inl temporalio-1.3.0/vendor/ring-0.16.20/crypto/limbs/limbs.inl --- temporalio-1.3.0/vendor/ring-0.16.20/crypto/limbs/limbs.inl 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/crypto/limbs/limbs.inl 1970-01-01 00:00:00.000000000 +0000 @@ -1,162 +0,0 @@ -/* Copyright 2016 Brian Smith. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY - * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION - * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ - -#include "limbs.h" -#include "GFp/check.h" - -#if defined(_MSC_VER) && !defined(__clang__) -#pragma warning(push, 3) -#include -#pragma warning(pop) - -/* MSVC 2015 RC, when compiling for x86 with /Ox (at least), miscompiles - * _addcarry_u32(c, 0, prod_hi, &x) like so: - * - * add eax,esi ; The previous add that might have set the carry flag. - * xor esi,esi ; OOPS! Carry flag is now reset! - * mov dword ptr [edi-4],eax - * adc esi,dword ptr [prod_hi] - * - * We test with MSVC 2015 update 2, so make sure we're using a version at least - * as new as that. */ -#if _MSC_FULL_VER < 190023918 -#error "MSVC 2015 Update 2 or later is required." -#endif -typedef uint8_t Carry; -#if LIMB_BITS == 64 -#pragma intrinsic(_addcarry_u64, _subborrow_u64) -#define GFp_ADDCARRY_INTRINSIC _addcarry_u64 -#define GFp_SUBBORROW_INTRINSIC _subborrow_u64 -#elif LIMB_BITS == 32 -#pragma intrinsic(_addcarry_u32, _subborrow_u32) -#define GFp_ADDCARRY_INTRINSIC _addcarry_u32 -#define GFp_SUBBORROW_INTRINSIC _subborrow_u32 -typedef uint64_t DoubleLimb; -#endif -#else -typedef Limb Carry; -#if LIMB_BITS == 64 -typedef __uint128_t DoubleLimb; -#elif LIMB_BITS == 32 -typedef uint64_t DoubleLimb; -#endif -#endif - -/* |*r = a + b + carry_in|, returning carry out bit. |carry_in| must be 0 or 1. - */ -static inline Carry limb_adc(Limb *r, Limb a, Limb b, Carry carry_in) { - dev_assert_secret(carry_in == 0 || carry_in == 1); - Carry ret; -#if defined(GFp_ADDCARRY_INTRINSIC) - ret = GFp_ADDCARRY_INTRINSIC(carry_in, a, b, r); -#else - DoubleLimb x = (DoubleLimb)a + b + carry_in; - *r = (Limb)x; - ret = (Carry)(x >> LIMB_BITS); -#endif - dev_assert_secret(ret == 0 || ret == 1); - return ret; -} - -/* |*r = a + b|, returning carry bit. */ -static inline Carry limb_add(Limb *r, Limb a, Limb b) { - Carry ret; -#if defined(GFp_ADDCARRY_INTRINSIC) - ret = GFp_ADDCARRY_INTRINSIC(0, a, b, r); -#else - DoubleLimb x = (DoubleLimb)a + b; - *r = (Limb)x; - ret = (Carry)(x >> LIMB_BITS); -#endif - dev_assert_secret(ret == 0 || ret == 1); - return ret; -} - -/* |*r = a - b - borrow_in|, returning the borrow out bit. |borrow_in| must be - * 0 or 1. */ -static inline Carry limb_sbb(Limb *r, Limb a, Limb b, Carry borrow_in) { - dev_assert_secret(borrow_in == 0 || borrow_in == 1); - Carry ret; -#if defined(GFp_SUBBORROW_INTRINSIC) - ret = GFp_SUBBORROW_INTRINSIC(borrow_in, a, b, r); -#else - DoubleLimb x = (DoubleLimb)a - b - borrow_in; - *r = (Limb)x; - ret = (Carry)((x >> LIMB_BITS) & 1); -#endif - dev_assert_secret(ret == 0 || ret == 1); - return ret; -} - -/* |*r = a - b|, returning borrow bit. */ -static inline Carry limb_sub(Limb *r, Limb a, Limb b) { - Carry ret; -#if defined(GFp_SUBBORROW_INTRINSIC) - ret = GFp_SUBBORROW_INTRINSIC(0, a, b, r); -#else - DoubleLimb x = (DoubleLimb)a - b; - *r = (Limb)x; - ret = (Carry)((x >> LIMB_BITS) & 1); -#endif - dev_assert_secret(ret == 0 || ret == 1); - return ret; -} - -static inline Carry limbs_add(Limb r[], const Limb a[], const Limb b[], - size_t num_limbs) { - debug_assert_nonsecret(num_limbs >= 1); - Carry carry = limb_add(&r[0], a[0], b[0]); - for (size_t i = 1; i < num_limbs; ++i) { - carry = limb_adc(&r[i], a[i], b[i], carry); - } - return carry; -} - -/* |r -= s|, returning the borrow. */ -static inline Carry limbs_sub(Limb r[], const Limb a[], const Limb b[], - size_t num_limbs) { - debug_assert_nonsecret(num_limbs >= 1); - Carry borrow = limb_sub(&r[0], a[0], b[0]); - for (size_t i = 1; i < num_limbs; ++i) { - borrow = limb_sbb(&r[i], a[i], b[i], borrow); - } - return borrow; -} - -static inline void limbs_copy(Limb r[], const Limb a[], size_t num_limbs) { - for (size_t i = 0; i < num_limbs; ++i) { - r[i] = a[i]; - } -} - -static inline void limbs_select(Limb r[], const Limb table[], - size_t num_limbs, size_t num_entries, - crypto_word index) { - for (size_t i = 0; i < num_limbs; ++i) { - r[i] = 0; - } - - for (size_t e = 0; e < num_entries; ++e) { - Limb equal = constant_time_eq_w(index, e); - for (size_t i = 0; i < num_limbs; ++i) { - r[i] = constant_time_select_w(equal, table[(e * num_limbs) + i], r[i]); - } - } -} - -static inline void limbs_zero(Limb r[], size_t num_limbs) { - for (size_t i = 0; i < num_limbs; ++i) { - r[i] = 0; - } -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/crypto/mem.c temporalio-1.3.0/vendor/ring-0.16.20/crypto/mem.c --- temporalio-1.3.0/vendor/ring-0.16.20/crypto/mem.c 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/crypto/mem.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,66 +0,0 @@ -/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) - * All rights reserved. - * - * This package is an SSL implementation written - * by Eric Young (eay@cryptsoft.com). - * The implementation was written so as to conform with Netscapes SSL. - * - * This library is free for commercial and non-commercial use as long as - * the following conditions are aheared to. The following conditions - * apply to all code found in this distribution, be it the RC4, RSA, - * lhash, DES, etc., code; not just the SSL code. The SSL documentation - * included with this distribution is covered by the same copyright terms - * except that the holder is Tim Hudson (tjh@cryptsoft.com). - * - * Copyright remains Eric Young's, and as such any Copyright notices in - * the code are not to be removed. - * If this package is used in a product, Eric Young should be given attribution - * as the author of the parts of the library used. - * This can be in the form of a textual message at program startup or - * in documentation (online or textual) provided with the package. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * "This product includes cryptographic software written by - * Eric Young (eay@cryptsoft.com)" - * The word 'cryptographic' can be left out if the rouines from the library - * being used are not cryptographic related :-). - * 4. If you include any Windows specific code (or a derivative thereof) from - * the apps directory (application code) you must include an acknowledgement: - * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" - * - * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * The licence and distribution terms for any publically available version or - * derivative of this code cannot be changed. i.e. this code cannot simply be - * copied and put under another distribution licence - * [including the GNU Public Licence.] */ - -#include - -int GFp_memcmp(const uint8_t *a, const uint8_t *b, size_t len) { - uint8_t x = 0; - for (size_t i = 0; i < len; i++) { - x |= a[i] ^ b[i]; - } - - return x; -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/crypto/perlasm/arm-xlate.pl temporalio-1.3.0/vendor/ring-0.16.20/crypto/perlasm/arm-xlate.pl --- temporalio-1.3.0/vendor/ring-0.16.20/crypto/perlasm/arm-xlate.pl 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/crypto/perlasm/arm-xlate.pl 1970-01-01 00:00:00.000000000 +0000 @@ -1,233 +0,0 @@ -#! /usr/bin/env perl -# Copyright 2015-2016 The OpenSSL Project Authors. All Rights Reserved. -# -# Licensed under the OpenSSL license (the "License"). You may not use -# this file except in compliance with the License. You can obtain a copy -# in the file LICENSE in the source distribution or at -# https://www.openssl.org/source/license.html - -use strict; - -my $flavour = shift; -my $output = shift; -open STDOUT,">$output" || die "can't open $output: $!"; - -$flavour = "linux32" if (!$flavour or $flavour eq "void"); - -my %GLOBALS; -my $dotinlocallabels=($flavour=~/linux/)?1:0; - -################################################################ -# directives which need special treatment on different platforms -################################################################ -my $arch = sub { - if ($flavour =~ /linux/) { ".arch\t".join(',',@_); } - else { ""; } -}; -my $fpu = sub { - if ($flavour =~ /linux/) { ".fpu\t".join(',',@_); } - else { ""; } -}; -my $hidden = sub { - if ($flavour =~ /ios/) { ".private_extern\t".join(',',@_); } - else { ".hidden\t".join(',',@_); } -}; -my $comm = sub { - my @args = split(/,\s*/,shift); - my $name = @args[0]; - my $global = \$GLOBALS{$name}; - my $ret; - - if ($flavour =~ /ios32/) { - $ret = ".comm\t_$name,@args[1]\n"; - $ret .= ".non_lazy_symbol_pointer\n"; - $ret .= "$name:\n"; - $ret .= ".indirect_symbol\t_$name\n"; - $ret .= ".long\t0"; - $name = "_$name"; - } else { $ret = ".comm\t".join(',',@args); } - - $$global = $name; - $ret; -}; -my $globl = sub { - my $name = shift; - my $global = \$GLOBALS{$name}; - my $ret; - - SWITCH: for ($flavour) { - /ios/ && do { $name = "_$name"; - last; - }; - } - - $ret = ".globl $name\n"; - # All symbols in assembly files are hidden. - $ret .= &$hidden($name); - $$global = $name; - $ret; -}; -my $global = $globl; -my $extern = sub { - &$globl(@_); - return; # return nothing -}; -my $type = sub { - if ($flavour =~ /linux/) { ".type\t".join(',',@_); } - elsif ($flavour =~ /ios32/) { if (join(',',@_) =~ /(\w+),%function/) { - "#ifdef __thumb2__\n". - ".thumb_func $1\n". - "#endif"; - } - } - else { ""; } -}; -my $size = sub { - if ($flavour =~ /linux/) { ".size\t".join(',',@_); } - else { ""; } -}; -my $inst = sub { - if ($flavour =~ /linux/) { ".inst\t".join(',',@_); } - else { ".long\t".join(',',@_); } -}; -my $asciz = sub { - my $line = join(",",@_); - if ($line =~ /^"(.*)"$/) - { ".byte " . join(",",unpack("C*",$1),0) . "\n.align 2"; } - else - { ""; } -}; -my $section = sub { - if ($flavour =~ /ios/) { - if ($_[0] eq ".rodata") { - return ".section\t__TEXT,__const"; - } - die "Unknown section name $_[0]"; - } else { - return ".section\t" . join(",", @_); - } -}; - -sub range { - my ($r,$sfx,$start,$end) = @_; - - join(",",map("$r$_$sfx",($start..$end))); -} - -sub expand_line { - my $line = shift; - my @ret = (); - - pos($line)=0; - - while ($line =~ m/\G[^@\/\{\"]*/g) { - if ($line =~ m/\G(@|\/\/|$)/gc) { - last; - } - elsif ($line =~ m/\G\{/gc) { - my $saved_pos = pos($line); - $line =~ s/\G([rdqv])([0-9]+)([^\-]*)\-\1([0-9]+)\3/range($1,$3,$2,$4)/e; - pos($line) = $saved_pos; - $line =~ m/\G[^\}]*\}/g; - } - elsif ($line =~ m/\G\"/gc) { - $line =~ m/\G[^\"]*\"/g; - } - } - - $line =~ s/\b(\w+)/$GLOBALS{$1} or $1/ge; - - return $line; -} - -print <<___; -// This file is generated from a similarly-named Perl script in the BoringSSL -// source tree. Do not edit by hand. - -#if !defined(__has_feature) -#define __has_feature(x) 0 -#endif -#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) -#define OPENSSL_NO_ASM -#endif - -#if !defined(OPENSSL_NO_ASM) -___ - -print "#if defined(__arm__)\n" if ($flavour eq "linux32"); -print "#if defined(__aarch64__)\n" if ($flavour eq "linux64"); - -while(my $line=<>) { - - if ($line =~ m/^\s*(#|@|\/\/)/) { print $line; next; } - - $line =~ s|/\*.*\*/||; # get rid of C-style comments... - $line =~ s|^\s+||; # ... and skip white spaces in beginning... - $line =~ s|\s+$||; # ... and at the end - - if ($flavour =~ /64/) { - my $copy = $line; - # Also remove line comments. - $copy =~ s|//.*||; - if ($copy =~ /\b[wx]18\b/) { - die "r18 is reserved by the platform and may not be used."; - } - } - - { - $line =~ s|[\b\.]L(\w{2,})|L$1|g; # common denominator for Locallabel - $line =~ s|\bL(\w{2,})|\.L$1|g if ($dotinlocallabels); - } - - { - $line =~ s|(^[\.\w]+)\:\s*||; - my $label = $1; - if ($label) { - printf "%s:",($GLOBALS{$label} or $label); - } - } - - if ($line !~ m/^[#@]/) { - $line =~ s|^\s*(\.?)(\S+)\s*||; - my $c = $1; $c = "\t" if ($c eq ""); - my $mnemonic = $2; - my $opcode; - if ($mnemonic =~ m/([^\.]+)\.([^\.]+)/) { - $opcode = eval("\$$1_$2"); - } else { - $opcode = eval("\$$mnemonic"); - } - - if ($flavour =~ /ios/) { - # Mach-O and ELF use different syntax for these relocations. Note - # that we require :pg_hi21: to be explicitly listed. It is normally - # optional with adrp instructions. - $line =~ s|:pg_hi21:(\w+)|\1\@PAGE|; - $line =~ s|:lo12:(\w+)|\1\@PAGEOFF|; - } else { - # Clang's integrated assembly does not support the optional - # :pg_hi21: markers, so erase them. - $line =~ s|:pg_hi21:||; - } - - my $arg=expand_line($line); - - if (ref($opcode) eq 'CODE') { - $line = &$opcode($arg); - } elsif ($mnemonic) { - $line = $c.$mnemonic; - $line.= "\t$arg" if ($arg ne ""); - } - } - - print $line if ($line); - print "\n"; -} - -print "#endif\n" if ($flavour eq "linux32" || $flavour eq "linux64"); -print "#endif // !OPENSSL_NO_ASM\n"; - -# See https://www.airs.com/blog/archives/518. -print ".section\t.note.GNU-stack,\"\",\%progbits\n" if ($flavour =~ /linux/); - -close STDOUT; diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/crypto/perlasm/x86_64-xlate.pl temporalio-1.3.0/vendor/ring-0.16.20/crypto/perlasm/x86_64-xlate.pl --- temporalio-1.3.0/vendor/ring-0.16.20/crypto/perlasm/x86_64-xlate.pl 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/crypto/perlasm/x86_64-xlate.pl 1970-01-01 00:00:00.000000000 +0000 @@ -1,1488 +0,0 @@ -#! /usr/bin/env perl -# Copyright 2005-2016 The OpenSSL Project Authors. All Rights Reserved. -# -# Licensed under the OpenSSL license (the "License"). You may not use -# this file except in compliance with the License. You can obtain a copy -# in the file LICENSE in the source distribution or at -# https://www.openssl.org/source/license.html - - -# Ascetic x86_64 AT&T to MASM/NASM assembler translator by . -# -# Why AT&T to MASM and not vice versa? Several reasons. Because AT&T -# format is way easier to parse. Because it's simpler to "gear" from -# Unix ABI to Windows one [see cross-reference "card" at the end of -# file]. Because Linux targets were available first... -# -# In addition the script also "distills" code suitable for GNU -# assembler, so that it can be compiled with more rigid assemblers, -# such as Solaris /usr/ccs/bin/as. -# -# This translator is not designed to convert *arbitrary* assembler -# code from AT&T format to MASM one. It's designed to convert just -# enough to provide for dual-ABI OpenSSL modules development... -# There *are* limitations and you might have to modify your assembler -# code or this script to achieve the desired result... -# -# Currently recognized limitations: -# -# - can't use multiple ops per line; -# -# Dual-ABI styling rules. -# -# 1. Adhere to Unix register and stack layout [see cross-reference -# ABI "card" at the end for explanation]. -# 2. Forget about "red zone," stick to more traditional blended -# stack frame allocation. If volatile storage is actually required -# that is. If not, just leave the stack as is. -# 3. Functions tagged with ".type name,@function" get crafted with -# unified Win64 prologue and epilogue automatically. If you want -# to take care of ABI differences yourself, tag functions as -# ".type name,@abi-omnipotent" instead. -# 4. To optimize the Win64 prologue you can specify number of input -# arguments as ".type name,@function,N." Keep in mind that if N is -# larger than 6, then you *have to* write "abi-omnipotent" code, -# because >6 cases can't be addressed with unified prologue. -# 5. Name local labels as .L*, do *not* use dynamic labels such as 1: -# (sorry about latter). -# 6. Don't use [or hand-code with .byte] "rep ret." "ret" mnemonic is -# required to identify the spots, where to inject Win64 epilogue! -# But on the pros, it's then prefixed with rep automatically:-) -# 7. Stick to explicit ip-relative addressing. If you have to use -# GOTPCREL addressing, stick to mov symbol@GOTPCREL(%rip),%r??. -# Both are recognized and translated to proper Win64 addressing -# modes. -# -# 8. In order to provide for structured exception handling unified -# Win64 prologue copies %rsp value to %rax. For further details -# see SEH paragraph at the end. -# 9. .init segment is allowed to contain calls to functions only. -# a. If function accepts more than 4 arguments *and* >4th argument -# is declared as non 64-bit value, do clear its upper part. - - -use strict; - -my $flavour = shift; -my $output = shift; -if ($flavour =~ /\./) { $output = $flavour; undef $flavour; } - -open STDOUT,">$output" || die "can't open $output: $!" - if (defined($output)); - -my $gas=1; $gas=0 if ($output =~ /\.asm$/); -my $elf=1; $elf=0 if (!$gas); -my $win64=0; -my $prefix=""; -my $decor=".L"; - -my $masmref=8 + 50727*2**-32; # 8.00.50727 shipped with VS2005 -my $masm=0; -my $PTR=" PTR"; - -my $nasmref=2.03; -my $nasm=0; - -if ($flavour eq "mingw64") { $gas=1; $elf=0; $win64=1; - # TODO(davidben): Before supporting the - # mingw64 perlasm flavour, do away with this - # environment variable check. - die "mingw64 not supported"; - $prefix=`echo __USER_LABEL_PREFIX__ | $ENV{CC} -E -P -`; - $prefix =~ s|\R$||; # Better chomp - } -elsif ($flavour eq "macosx") { $gas=1; $elf=0; $prefix="_"; $decor="L\$"; } -elsif ($flavour eq "masm") { $gas=0; $elf=0; $masm=$masmref; $win64=1; $decor="\$L\$"; } -elsif ($flavour eq "nasm") { $gas=0; $elf=0; $nasm=$nasmref; $win64=1; $decor="\$L\$"; $PTR=""; } -elsif (!$gas) { die "unknown flavour $flavour"; } - -my $current_segment; -my $current_function; -my %globals; - -{ package opcode; # pick up opcodes - sub re { - my ($class, $line) = @_; - my $self = {}; - my $ret; - - if ($$line =~ /^([a-z][a-z0-9]*)/i) { - bless $self,$class; - $self->{op} = $1; - $ret = $self; - $$line = substr($$line,@+[0]); $$line =~ s/^\s+//; - - undef $self->{sz}; - if ($self->{op} =~ /^(movz)x?([bw]).*/) { # movz is pain... - $self->{op} = $1; - $self->{sz} = $2; - } elsif ($self->{op} =~ /call|jmp/) { - $self->{sz} = ""; - } elsif ($self->{op} =~ /^p/ && $' !~ /^(ush|op|insrw)/) { # SSEn - $self->{sz} = ""; - } elsif ($self->{op} =~ /^[vk]/) { # VEX or k* such as kmov - $self->{sz} = ""; - } elsif ($self->{op} =~ /mov[dq]/ && $$line =~ /%xmm/) { - $self->{sz} = ""; - } elsif ($self->{op} =~ /^or([qlwb])$/) { - $self->{op} = "or"; - $self->{sz} = $1; - } elsif ($self->{op} =~ /([a-z]{3,})([qlwb])$/) { - $self->{op} = $1; - $self->{sz} = $2; - } - } - $ret; - } - sub size { - my ($self, $sz) = @_; - $self->{sz} = $sz if (defined($sz) && !defined($self->{sz})); - $self->{sz}; - } - sub out { - my $self = shift; - if ($gas) { - if ($self->{op} eq "movz") { # movz is pain... - sprintf "%s%s%s",$self->{op},$self->{sz},shift; - } elsif ($self->{op} =~ /^set/) { - "$self->{op}"; - } elsif ($self->{op} eq "ret") { - my $epilogue = ""; - if ($win64 && $current_function->{abi} eq "svr4") { - $epilogue = "movq 8(%rsp),%rdi\n\t" . - "movq 16(%rsp),%rsi\n\t"; - } - $epilogue . ".byte 0xf3,0xc3"; - } elsif ($self->{op} eq "call" && !$elf && $current_segment eq ".init") { - ".p2align\t3\n\t.quad"; - } else { - "$self->{op}$self->{sz}"; - } - } else { - $self->{op} =~ s/^movz/movzx/; - if ($self->{op} eq "ret") { - $self->{op} = ""; - if ($win64 && $current_function->{abi} eq "svr4") { - $self->{op} = "mov rdi,QWORD$PTR\[8+rsp\]\t;WIN64 epilogue\n\t". - "mov rsi,QWORD$PTR\[16+rsp\]\n\t"; - } - $self->{op} .= "DB\t0F3h,0C3h\t\t;repret"; - } elsif ($self->{op} =~ /^(pop|push)f/) { - $self->{op} .= $self->{sz}; - } elsif ($self->{op} eq "call" && $current_segment eq ".CRT\$XCU") { - $self->{op} = "\tDQ"; - } - $self->{op}; - } - } - sub mnemonic { - my ($self, $op) = @_; - $self->{op}=$op if (defined($op)); - $self->{op}; - } -} -{ package const; # pick up constants, which start with $ - sub re { - my ($class, $line) = @_; - my $self = {}; - my $ret; - - if ($$line =~ /^\$([^,]+)/) { - bless $self, $class; - $self->{value} = $1; - $ret = $self; - $$line = substr($$line,@+[0]); $$line =~ s/^\s+//; - } - $ret; - } - sub out { - my $self = shift; - - $self->{value} =~ s/\b(0b[0-1]+)/oct($1)/eig; - if ($gas) { - # Solaris /usr/ccs/bin/as can't handle multiplications - # in $self->{value} - my $value = $self->{value}; - no warnings; # oct might complain about overflow, ignore here... - $value =~ s/(?{value} = $value; - } - sprintf "\$%s",$self->{value}; - } else { - my $value = $self->{value}; - $value =~ s/0x([0-9a-f]+)/0$1h/ig if ($masm); - sprintf "%s",$value; - } - } -} -{ package ea; # pick up effective addresses: expr(%reg,%reg,scale) - - my %szmap = ( b=>"BYTE$PTR", w=>"WORD$PTR", - l=>"DWORD$PTR", d=>"DWORD$PTR", - q=>"QWORD$PTR", o=>"OWORD$PTR", - x=>"XMMWORD$PTR", y=>"YMMWORD$PTR", - z=>"ZMMWORD$PTR" ) if (!$gas); - - sub re { - my ($class, $line, $opcode) = @_; - my $self = {}; - my $ret; - - # optional * ----vvv--- appears in indirect jmp/call - if ($$line =~ /^(\*?)([^\(,]*)\(([%\w,]+)\)((?:{[^}]+})*)/) { - bless $self, $class; - $self->{asterisk} = $1; - $self->{label} = $2; - ($self->{base},$self->{index},$self->{scale})=split(/,/,$3); - $self->{scale} = 1 if (!defined($self->{scale})); - $self->{opmask} = $4; - $ret = $self; - $$line = substr($$line,@+[0]); $$line =~ s/^\s+//; - - if ($win64 && $self->{label} =~ s/\@GOTPCREL//) { - die if ($opcode->mnemonic() ne "mov"); - $opcode->mnemonic("lea"); - } - $self->{base} =~ s/^%//; - $self->{index} =~ s/^%// if (defined($self->{index})); - $self->{opcode} = $opcode; - } - $ret; - } - sub size {} - sub out { - my ($self, $sz) = @_; - - $self->{label} =~ s/([_a-z][_a-z0-9]*)/$globals{$1} or $1/gei; - $self->{label} =~ s/\.L/$decor/g; - - # Silently convert all EAs to 64-bit. This is required for - # elder GNU assembler and results in more compact code, - # *but* most importantly AES module depends on this feature! - $self->{index} =~ s/^[er](.?[0-9xpi])[d]?$/r\1/; - $self->{base} =~ s/^[er](.?[0-9xpi])[d]?$/r\1/; - - # Solaris /usr/ccs/bin/as can't handle multiplications - # in $self->{label}... - use integer; - $self->{label} =~ s/(?{label} =~ s/\b([0-9]+\s*[\*\/\%]\s*[0-9]+)\b/eval($1)/eg; - - # Some assemblers insist on signed presentation of 32-bit - # offsets, but sign extension is a tricky business in perl... - if ((1<<31)<<1) { - $self->{label} =~ s/\b([0-9]+)\b/$1<<32>>32/eg; - } else { - $self->{label} =~ s/\b([0-9]+)\b/$1>>0/eg; - } - - # if base register is %rbp or %r13, see if it's possible to - # flip base and index registers [for better performance] - if (!$self->{label} && $self->{index} && $self->{scale}==1 && - $self->{base} =~ /(rbp|r13)/) { - $self->{base} = $self->{index}; $self->{index} = $1; - } - - if ($gas) { - $self->{label} =~ s/^___imp_/__imp__/ if ($flavour eq "mingw64"); - - if (defined($self->{index})) { - sprintf "%s%s(%s,%%%s,%d)%s", - $self->{asterisk},$self->{label}, - $self->{base}?"%$self->{base}":"", - $self->{index},$self->{scale}, - $self->{opmask}; - } else { - sprintf "%s%s(%%%s)%s", $self->{asterisk},$self->{label}, - $self->{base},$self->{opmask}; - } - } else { - $self->{label} =~ s/\./\$/g; - $self->{label} =~ s/(?{label} = "($self->{label})" if ($self->{label} =~ /[\*\+\-\/]/); - - my $mnemonic = $self->{opcode}->mnemonic(); - ($self->{asterisk}) && ($sz="q") || - ($mnemonic =~ /^v?mov([qd])$/) && ($sz=$1) || - ($mnemonic =~ /^v?pinsr([qdwb])$/) && ($sz=$1) || - ($mnemonic =~ /^vpbroadcast([qdwb])$/) && ($sz=$1) || - ($mnemonic =~ /^v(?!perm)[a-z]+[fi]128$/) && ($sz="x"); - - $self->{opmask} =~ s/%(k[0-7])/$1/; - - if (defined($self->{index})) { - sprintf "%s[%s%s*%d%s]%s",$szmap{$sz}, - $self->{label}?"$self->{label}+":"", - $self->{index},$self->{scale}, - $self->{base}?"+$self->{base}":"", - $self->{opmask}; - } elsif ($self->{base} eq "rip") { - sprintf "%s[%s]",$szmap{$sz},$self->{label}; - } else { - sprintf "%s[%s%s]%s", $szmap{$sz}, - $self->{label}?"$self->{label}+":"", - $self->{base},$self->{opmask}; - } - } - } -} -{ package register; # pick up registers, which start with %. - sub re { - my ($class, $line, $opcode) = @_; - my $self = {}; - my $ret; - - # optional * ----vvv--- appears in indirect jmp/call - if ($$line =~ /^(\*?)%(\w+)((?:{[^}]+})*)/) { - bless $self,$class; - $self->{asterisk} = $1; - $self->{value} = $2; - $self->{opmask} = $3; - $opcode->size($self->size()); - $ret = $self; - $$line = substr($$line,@+[0]); $$line =~ s/^\s+//; - } - $ret; - } - sub size { - my $self = shift; - my $ret; - - if ($self->{value} =~ /^r[\d]+b$/i) { $ret="b"; } - elsif ($self->{value} =~ /^r[\d]+w$/i) { $ret="w"; } - elsif ($self->{value} =~ /^r[\d]+d$/i) { $ret="l"; } - elsif ($self->{value} =~ /^r[\w]+$/i) { $ret="q"; } - elsif ($self->{value} =~ /^[a-d][hl]$/i){ $ret="b"; } - elsif ($self->{value} =~ /^[\w]{2}l$/i) { $ret="b"; } - elsif ($self->{value} =~ /^[\w]{2}$/i) { $ret="w"; } - elsif ($self->{value} =~ /^e[a-z]{2}$/i){ $ret="l"; } - - $ret; - } - sub out { - my $self = shift; - if ($gas) { sprintf "%s%%%s%s", $self->{asterisk}, - $self->{value}, - $self->{opmask}; } - else { $self->{opmask} =~ s/%(k[0-7])/$1/; - $self->{value}.$self->{opmask}; } - } -} -{ package label; # pick up labels, which end with : - sub re { - my ($class, $line) = @_; - my $self = {}; - my $ret; - - if ($$line =~ /(^[\.\w]+)\:/) { - bless $self,$class; - $self->{value} = $1; - $ret = $self; - $$line = substr($$line,@+[0]); $$line =~ s/^\s+//; - - $self->{value} =~ s/^\.L/$decor/; - } - $ret; - } - sub out { - my $self = shift; - - if ($gas) { - my $func = ($globals{$self->{value}} or $self->{value}) . ":"; - if ($win64 && $current_function->{name} eq $self->{value} - && $current_function->{abi} eq "svr4") { - $func .= "\n"; - $func .= " movq %rdi,8(%rsp)\n"; - $func .= " movq %rsi,16(%rsp)\n"; - $func .= " movq %rsp,%rax\n"; - $func .= "${decor}SEH_begin_$current_function->{name}:\n"; - my $narg = $current_function->{narg}; - $narg=6 if (!defined($narg)); - $func .= " movq %rcx,%rdi\n" if ($narg>0); - $func .= " movq %rdx,%rsi\n" if ($narg>1); - $func .= " movq %r8,%rdx\n" if ($narg>2); - $func .= " movq %r9,%rcx\n" if ($narg>3); - $func .= " movq 40(%rsp),%r8\n" if ($narg>4); - $func .= " movq 48(%rsp),%r9\n" if ($narg>5); - } - $func; - } elsif ($self->{value} ne "$current_function->{name}") { - # Make all labels in masm global. - $self->{value} .= ":" if ($masm); - $self->{value} . ":"; - } elsif ($win64 && $current_function->{abi} eq "svr4") { - my $func = "$current_function->{name}" . - ($nasm ? ":" : "\tPROC $current_function->{scope}") . - "\n"; - $func .= " mov QWORD$PTR\[8+rsp\],rdi\t;WIN64 prologue\n"; - $func .= " mov QWORD$PTR\[16+rsp\],rsi\n"; - $func .= " mov rax,rsp\n"; - $func .= "${decor}SEH_begin_$current_function->{name}:"; - $func .= ":" if ($masm); - $func .= "\n"; - my $narg = $current_function->{narg}; - $narg=6 if (!defined($narg)); - $func .= " mov rdi,rcx\n" if ($narg>0); - $func .= " mov rsi,rdx\n" if ($narg>1); - $func .= " mov rdx,r8\n" if ($narg>2); - $func .= " mov rcx,r9\n" if ($narg>3); - $func .= " mov r8,QWORD$PTR\[40+rsp\]\n" if ($narg>4); - $func .= " mov r9,QWORD$PTR\[48+rsp\]\n" if ($narg>5); - $func .= "\n"; - } else { - "$current_function->{name}". - ($nasm ? ":" : "\tPROC $current_function->{scope}"); - } - } -} -{ package expr; # pick up expressions - sub re { - my ($class, $line, $opcode) = @_; - my $self = {}; - my $ret; - - if ($$line =~ /(^[^,]+)/) { - bless $self,$class; - $self->{value} = $1; - $ret = $self; - $$line = substr($$line,@+[0]); $$line =~ s/^\s+//; - - $self->{value} =~ s/\@PLT// if (!$elf); - $self->{value} =~ s/([_a-z][_a-z0-9]*)/$globals{$1} or $1/gei; - $self->{value} =~ s/\.L/$decor/g; - $self->{opcode} = $opcode; - } - $ret; - } - sub out { - my $self = shift; - if ($nasm && $self->{opcode}->mnemonic()=~m/^j(?![re]cxz)/) { - "NEAR ".$self->{value}; - } else { - $self->{value}; - } - } -} -{ package cfi_directive; - # CFI directives annotate instructions that are significant for - # stack unwinding procedure compliant with DWARF specification, - # see http://dwarfstd.org/. Besides naturally expected for this - # script platform-specific filtering function, this module adds - # three auxiliary synthetic directives not recognized by [GNU] - # assembler: - # - # - .cfi_push to annotate push instructions in prologue, which - # translates to .cfi_adjust_cfa_offset (if needed) and - # .cfi_offset; - # - .cfi_pop to annotate pop instructions in epilogue, which - # translates to .cfi_adjust_cfa_offset (if needed) and - # .cfi_restore; - # - [and most notably] .cfi_cfa_expression which encodes - # DW_CFA_def_cfa_expression and passes it to .cfi_escape as - # byte vector; - # - # CFA expressions were introduced in DWARF specification version - # 3 and describe how to deduce CFA, Canonical Frame Address. This - # becomes handy if your stack frame is variable and you can't - # spare register for [previous] frame pointer. Suggested directive - # syntax is made-up mix of DWARF operator suffixes [subset of] - # and references to registers with optional bias. Following example - # describes offloaded *original* stack pointer at specific offset - # from *current* stack pointer: - # - # .cfi_cfa_expression %rsp+40,deref,+8 - # - # Final +8 has everything to do with the fact that CFA is defined - # as reference to top of caller's stack, and on x86_64 call to - # subroutine pushes 8-byte return address. In other words original - # stack pointer upon entry to a subroutine is 8 bytes off from CFA. - - # Below constants are taken from "DWARF Expressions" section of the - # DWARF specification, section is numbered 7.7 in versions 3 and 4. - my %DW_OP_simple = ( # no-arg operators, mapped directly - deref => 0x06, dup => 0x12, - drop => 0x13, over => 0x14, - pick => 0x15, swap => 0x16, - rot => 0x17, xderef => 0x18, - - abs => 0x19, and => 0x1a, - div => 0x1b, minus => 0x1c, - mod => 0x1d, mul => 0x1e, - neg => 0x1f, not => 0x20, - or => 0x21, plus => 0x22, - shl => 0x24, shr => 0x25, - shra => 0x26, xor => 0x27, - ); - - my %DW_OP_complex = ( # used in specific subroutines - constu => 0x10, # uleb128 - consts => 0x11, # sleb128 - plus_uconst => 0x23, # uleb128 - lit0 => 0x30, # add 0-31 to opcode - reg0 => 0x50, # add 0-31 to opcode - breg0 => 0x70, # add 0-31 to opcole, sleb128 - regx => 0x90, # uleb28 - fbreg => 0x91, # sleb128 - bregx => 0x92, # uleb128, sleb128 - piece => 0x93, # uleb128 - ); - - # Following constants are defined in x86_64 ABI supplement, for - # example available at https://www.uclibc.org/docs/psABI-x86_64.pdf, - # see section 3.7 "Stack Unwind Algorithm". - my %DW_reg_idx = ( - "%rax"=>0, "%rdx"=>1, "%rcx"=>2, "%rbx"=>3, - "%rsi"=>4, "%rdi"=>5, "%rbp"=>6, "%rsp"=>7, - "%r8" =>8, "%r9" =>9, "%r10"=>10, "%r11"=>11, - "%r12"=>12, "%r13"=>13, "%r14"=>14, "%r15"=>15 - ); - - my ($cfa_reg, $cfa_rsp); - my @cfa_stack; - - # [us]leb128 format is variable-length integer representation base - # 2^128, with most significant bit of each byte being 0 denoting - # *last* most significant digit. See "Variable Length Data" in the - # DWARF specification, numbered 7.6 at least in versions 3 and 4. - sub sleb128 { - use integer; # get right shift extend sign - - my $val = shift; - my $sign = ($val < 0) ? -1 : 0; - my @ret = (); - - while(1) { - push @ret, $val&0x7f; - - # see if remaining bits are same and equal to most - # significant bit of the current digit, if so, it's - # last digit... - last if (($val>>6) == $sign); - - @ret[-1] |= 0x80; - $val >>= 7; - } - - return @ret; - } - sub uleb128 { - my $val = shift; - my @ret = (); - - while(1) { - push @ret, $val&0x7f; - - # see if it's last significant digit... - last if (($val >>= 7) == 0); - - @ret[-1] |= 0x80; - } - - return @ret; - } - sub const { - my $val = shift; - - if ($val >= 0 && $val < 32) { - return ($DW_OP_complex{lit0}+$val); - } - return ($DW_OP_complex{consts}, sleb128($val)); - } - sub reg { - my $val = shift; - - return if ($val !~ m/^(%r\w+)(?:([\+\-])((?:0x)?[0-9a-f]+))?/); - - my $reg = $DW_reg_idx{$1}; - my $off = eval ("0 $2 $3"); - - return (($DW_OP_complex{breg0} + $reg), sleb128($off)); - # Yes, we use DW_OP_bregX+0 to push register value and not - # DW_OP_regX, because latter would require even DW_OP_piece, - # which would be a waste under the circumstances. If you have - # to use DWP_OP_reg, use "regx:N"... - } - sub cfa_expression { - my $line = shift; - my @ret; - - foreach my $token (split(/,\s*/,$line)) { - if ($token =~ /^%r/) { - push @ret,reg($token); - } elsif ($token =~ /((?:0x)?[0-9a-f]+)\((%r\w+)\)/) { - push @ret,reg("$2+$1"); - } elsif ($token =~ /(\w+):(\-?(?:0x)?[0-9a-f]+)(U?)/i) { - my $i = 1*eval($2); - push @ret,$DW_OP_complex{$1}, ($3 ? uleb128($i) : sleb128($i)); - } elsif (my $i = 1*eval($token) or $token eq "0") { - if ($token =~ /^\+/) { - push @ret,$DW_OP_complex{plus_uconst},uleb128($i); - } else { - push @ret,const($i); - } - } else { - push @ret,$DW_OP_simple{$token}; - } - } - - # Finally we return DW_CFA_def_cfa_expression, 15, followed by - # length of the expression and of course the expression itself. - return (15,scalar(@ret),@ret); - } - sub re { - my ($class, $line) = @_; - my $self = {}; - my $ret; - - if ($$line =~ s/^\s*\.cfi_(\w+)\s*//) { - bless $self,$class; - $ret = $self; - undef $self->{value}; - my $dir = $1; - - SWITCH: for ($dir) { - # What is $cfa_rsp? Effectively it's difference between %rsp - # value and current CFA, Canonical Frame Address, which is - # why it starts with -8. Recall that CFA is top of caller's - # stack... - /startproc/ && do { ($cfa_reg, $cfa_rsp) = ("%rsp", -8); last; }; - /endproc/ && do { ($cfa_reg, $cfa_rsp) = ("%rsp", 0); last; }; - /def_cfa_register/ - && do { $cfa_reg = $$line; last; }; - /def_cfa_offset/ - && do { $cfa_rsp = -1*eval($$line) if ($cfa_reg eq "%rsp"); - last; - }; - /adjust_cfa_offset/ - && do { $cfa_rsp -= 1*eval($$line) if ($cfa_reg eq "%rsp"); - last; - }; - /def_cfa/ && do { if ($$line =~ /(%r\w+)\s*,\s*(.+)/) { - $cfa_reg = $1; - $cfa_rsp = -1*eval($2) if ($cfa_reg eq "%rsp"); - } - last; - }; - /push/ && do { $dir = undef; - $cfa_rsp -= 8; - if ($cfa_reg eq "%rsp") { - $self->{value} = ".cfi_adjust_cfa_offset\t8\n"; - } - $self->{value} .= ".cfi_offset\t$$line,$cfa_rsp"; - last; - }; - /pop/ && do { $dir = undef; - $cfa_rsp += 8; - if ($cfa_reg eq "%rsp") { - $self->{value} = ".cfi_adjust_cfa_offset\t-8\n"; - } - $self->{value} .= ".cfi_restore\t$$line"; - last; - }; - /cfa_expression/ - && do { $dir = undef; - $self->{value} = ".cfi_escape\t" . - join(",", map(sprintf("0x%02x", $_), - cfa_expression($$line))); - last; - }; - /remember_state/ - && do { push @cfa_stack, [$cfa_reg, $cfa_rsp]; - last; - }; - /restore_state/ - && do { ($cfa_reg, $cfa_rsp) = @{pop @cfa_stack}; - last; - }; - } - - $self->{value} = ".cfi_$dir\t$$line" if ($dir); - - $$line = ""; - } - - return $ret; - } - sub out { - my $self = shift; - return ($elf ? $self->{value} : undef); - } -} -{ package directive; # pick up directives, which start with . - sub re { - my ($class, $line) = @_; - my $self = {}; - my $ret; - my $dir; - - # chain-call to cfi_directive - $ret = cfi_directive->re($line) and return $ret; - - if ($$line =~ /^\s*(\.\w+)/) { - bless $self,$class; - $dir = $1; - $ret = $self; - undef $self->{value}; - $$line = substr($$line,@+[0]); $$line =~ s/^\s+//; - - SWITCH: for ($dir) { - /\.global|\.globl|\.extern/ - && do { $globals{$$line} = $prefix . $$line; - $$line = $globals{$$line} if ($prefix); - last; - }; - /\.type/ && do { my ($sym,$type,$narg) = split(/\s*,\s*/,$$line); - if ($type eq "\@function") { - undef $current_function; - $current_function->{name} = $sym; - $current_function->{abi} = "svr4"; - $current_function->{narg} = $narg; - $current_function->{scope} = defined($globals{$sym})?"PUBLIC":"PRIVATE"; - } elsif ($type eq "\@abi-omnipotent") { - undef $current_function; - $current_function->{name} = $sym; - $current_function->{scope} = defined($globals{$sym})?"PUBLIC":"PRIVATE"; - } - $$line =~ s/\@abi\-omnipotent/\@function/; - $$line =~ s/\@function.*/\@function/; - last; - }; - /\.asciz/ && do { if ($$line =~ /^"(.*)"$/) { - $dir = ".byte"; - $$line = join(",",unpack("C*",$1),0); - } - last; - }; - /\.rva|\.long|\.quad|\.byte/ - && do { $$line =~ s/([_a-z][_a-z0-9]*)/$globals{$1} or $1/gei; - $$line =~ s/\.L/$decor/g; - last; - }; - } - - if ($gas) { - $self->{value} = $dir . "\t" . $$line; - - if ($dir =~ /\.extern/) { - if ($flavour eq "elf") { - $self->{value} .= "\n.hidden $$line"; - } else { - $self->{value} = ""; - } - } elsif (!$elf && $dir =~ /\.type/) { - $self->{value} = ""; - $self->{value} = ".def\t" . ($globals{$1} or $1) . ";\t" . - (defined($globals{$1})?".scl 2;":".scl 3;") . - "\t.type 32;\t.endef" - if ($win64 && $$line =~ /([^,]+),\@function/); - } elsif (!$elf && $dir =~ /\.size/) { - $self->{value} = ""; - if (defined($current_function)) { - $self->{value} .= "${decor}SEH_end_$current_function->{name}:" - if ($win64 && $current_function->{abi} eq "svr4"); - undef $current_function; - } - } elsif (!$elf && $dir =~ /\.align/) { - $self->{value} = ".p2align\t" . (log($$line)/log(2)); - } elsif ($dir eq ".section") { - $current_segment=$$line; - if (!$elf && $current_segment eq ".init") { - if ($flavour eq "macosx") { $self->{value} = ".mod_init_func"; } - elsif ($flavour eq "mingw64") { $self->{value} = ".section\t.ctors"; } - } - } elsif ($dir =~ /\.(text|data)/) { - $current_segment=".$1"; - } elsif ($dir =~ /\.global|\.globl|\.extern/) { - if ($flavour eq "macosx") { - $self->{value} .= "\n.private_extern $$line"; - } else { - $self->{value} .= "\n.hidden $$line"; - } - } elsif ($dir =~ /\.hidden/) { - if ($flavour eq "macosx") { $self->{value} = ".private_extern\t$prefix$$line"; } - elsif ($flavour eq "mingw64") { $self->{value} = ""; } - } elsif ($dir =~ /\.comm/) { - $self->{value} = "$dir\t$prefix$$line"; - $self->{value} =~ s|,([0-9]+),([0-9]+)$|",$1,".log($2)/log(2)|e if ($flavour eq "macosx"); - } - $$line = ""; - return $self; - } - - # non-gas case or nasm/masm - SWITCH: for ($dir) { - /\.text/ && do { my $v=undef; - if ($nasm) { - $v="section .text code align=64\n"; - } else { - $v="$current_segment\tENDS\n" if ($current_segment); - $current_segment = ".text\$"; - $v.="$current_segment\tSEGMENT "; - $v.=$masm>=$masmref ? "ALIGN(256)" : "PAGE"; - $v.=" 'CODE'"; - } - $self->{value} = $v; - last; - }; - /\.data/ && do { my $v=undef; - if ($nasm) { - $v="section .data data align=8\n"; - } else { - $v="$current_segment\tENDS\n" if ($current_segment); - $current_segment = "_DATA"; - $v.="$current_segment\tSEGMENT"; - } - $self->{value} = $v; - last; - }; - /\.section/ && do { my $v=undef; - $$line =~ s/([^,]*).*/$1/; - $$line = ".CRT\$XCU" if ($$line eq ".init"); - if ($nasm) { - $v="section $$line"; - if ($$line=~/\.([px])data/) { - $v.=" rdata align="; - $v.=$1 eq "p"? 4 : 8; - } elsif ($$line=~/\.CRT\$/i) { - $v.=" rdata align=8"; - } - } else { - $v="$current_segment\tENDS\n" if ($current_segment); - $v.="$$line\tSEGMENT"; - if ($$line=~/\.([px])data/) { - $v.=" READONLY"; - $v.=" ALIGN(".($1 eq "p" ? 4 : 8).")" if ($masm>=$masmref); - } elsif ($$line=~/\.CRT\$/i) { - $v.=" READONLY "; - $v.=$masm>=$masmref ? "ALIGN(8)" : "DWORD"; - } - } - $current_segment = $$line; - $self->{value} = $v; - last; - }; - /\.extern/ && do { $self->{value} = "EXTERN\t".$$line; - $self->{value} .= ":NEAR" if ($masm); - last; - }; - /\.globl|.global/ - && do { $self->{value} = $masm?"PUBLIC":"global"; - $self->{value} .= "\t".$$line; - last; - }; - /\.size/ && do { if (defined($current_function)) { - undef $self->{value}; - if ($current_function->{abi} eq "svr4") { - $self->{value}="${decor}SEH_end_$current_function->{name}:"; - $self->{value}.=":\n" if($masm); - } - $self->{value}.="$current_function->{name}\tENDP" if($masm && $current_function->{name}); - undef $current_function; - } - last; - }; - /\.align/ && do { my $max = ($masm && $masm>=$masmref) ? 256 : 4096; - $self->{value} = "ALIGN\t".($$line>$max?$max:$$line); - last; - }; - /\.(value|long|rva|quad)/ - && do { my $sz = substr($1,0,1); - my @arr = split(/,\s*/,$$line); - my $last = pop(@arr); - my $conv = sub { my $var=shift; - $var=~s/^(0b[0-1]+)/oct($1)/eig; - $var=~s/^0x([0-9a-f]+)/0$1h/ig if ($masm); - if ($sz eq "D" && ($current_segment=~/.[px]data/ || $dir eq ".rva")) - { $var=~s/^([_a-z\$\@][_a-z0-9\$\@]*)/$nasm?"$1 wrt ..imagebase":"imagerel $1"/egi; } - $var; - }; - - $sz =~ tr/bvlrq/BWDDQ/; - $self->{value} = "\tD$sz\t"; - for (@arr) { $self->{value} .= &$conv($_).","; } - $self->{value} .= &$conv($last); - last; - }; - /\.byte/ && do { my @str=split(/,\s*/,$$line); - map(s/(0b[0-1]+)/oct($1)/eig,@str); - map(s/0x([0-9a-f]+)/0$1h/ig,@str) if ($masm); - while ($#str>15) { - $self->{value}.="DB\t" - .join(",",@str[0..15])."\n"; - foreach (0..15) { shift @str; } - } - $self->{value}.="DB\t" - .join(",",@str) if (@str); - last; - }; - /\.comm/ && do { my @str=split(/,\s*/,$$line); - my $v=undef; - if ($nasm) { - $v.="common $prefix@str[0] @str[1]"; - } else { - $v="$current_segment\tENDS\n" if ($current_segment); - $current_segment = "_DATA"; - $v.="$current_segment\tSEGMENT\n"; - $v.="COMM @str[0]:DWORD:".@str[1]/4; - } - $self->{value} = $v; - last; - }; - } - $$line = ""; - } - - $ret; - } - sub out { - my $self = shift; - $self->{value}; - } -} - -# Upon initial x86_64 introduction SSE>2 extensions were not introduced -# yet. In order not to be bothered by tracing exact assembler versions, -# but at the same time to provide a bare security minimum of AES-NI, we -# hard-code some instructions. Extensions past AES-NI on the other hand -# are traced by examining assembler version in individual perlasm -# modules... - -my %regrm = ( "%eax"=>0, "%ecx"=>1, "%edx"=>2, "%ebx"=>3, - "%esp"=>4, "%ebp"=>5, "%esi"=>6, "%edi"=>7 ); - -sub rex { - my $opcode=shift; - my ($dst,$src,$rex)=@_; - - $rex|=0x04 if($dst>=8); - $rex|=0x01 if($src>=8); - push @$opcode,($rex|0x40) if ($rex); -} - -my $movq = sub { # elderly gas can't handle inter-register movq - my $arg = shift; - my @opcode=(0x66); - if ($arg =~ /%xmm([0-9]+),\s*%r(\w+)/) { - my ($src,$dst)=($1,$2); - if ($dst !~ /[0-9]+/) { $dst = $regrm{"%e$dst"}; } - rex(\@opcode,$src,$dst,0x8); - push @opcode,0x0f,0x7e; - push @opcode,0xc0|(($src&7)<<3)|($dst&7); # ModR/M - @opcode; - } elsif ($arg =~ /%r(\w+),\s*%xmm([0-9]+)/) { - my ($src,$dst)=($2,$1); - if ($dst !~ /[0-9]+/) { $dst = $regrm{"%e$dst"}; } - rex(\@opcode,$src,$dst,0x8); - push @opcode,0x0f,0x6e; - push @opcode,0xc0|(($src&7)<<3)|($dst&7); # ModR/M - @opcode; - } else { - (); - } -}; - -my $pextrd = sub { - if (shift =~ /\$([0-9]+),\s*%xmm([0-9]+),\s*(%\w+)/) { - my @opcode=(0x66); - my $imm=$1; - my $src=$2; - my $dst=$3; - if ($dst =~ /%r([0-9]+)d/) { $dst = $1; } - elsif ($dst =~ /%e/) { $dst = $regrm{$dst}; } - rex(\@opcode,$src,$dst); - push @opcode,0x0f,0x3a,0x16; - push @opcode,0xc0|(($src&7)<<3)|($dst&7); # ModR/M - push @opcode,$imm; - @opcode; - } else { - (); - } -}; - -my $pinsrd = sub { - if (shift =~ /\$([0-9]+),\s*(%\w+),\s*%xmm([0-9]+)/) { - my @opcode=(0x66); - my $imm=$1; - my $src=$2; - my $dst=$3; - if ($src =~ /%r([0-9]+)/) { $src = $1; } - elsif ($src =~ /%e/) { $src = $regrm{$src}; } - rex(\@opcode,$dst,$src); - push @opcode,0x0f,0x3a,0x22; - push @opcode,0xc0|(($dst&7)<<3)|($src&7); # ModR/M - push @opcode,$imm; - @opcode; - } else { - (); - } -}; - -my $pshufb = sub { - if (shift =~ /%xmm([0-9]+),\s*%xmm([0-9]+)/) { - my @opcode=(0x66); - rex(\@opcode,$2,$1); - push @opcode,0x0f,0x38,0x00; - push @opcode,0xc0|($1&7)|(($2&7)<<3); # ModR/M - @opcode; - } else { - (); - } -}; - -my $palignr = sub { - if (shift =~ /\$([0-9]+),\s*%xmm([0-9]+),\s*%xmm([0-9]+)/) { - my @opcode=(0x66); - rex(\@opcode,$3,$2); - push @opcode,0x0f,0x3a,0x0f; - push @opcode,0xc0|($2&7)|(($3&7)<<3); # ModR/M - push @opcode,$1; - @opcode; - } else { - (); - } -}; - -my $pclmulqdq = sub { - if (shift =~ /\$([x0-9a-f]+),\s*%xmm([0-9]+),\s*%xmm([0-9]+)/) { - my @opcode=(0x66); - rex(\@opcode,$3,$2); - push @opcode,0x0f,0x3a,0x44; - push @opcode,0xc0|($2&7)|(($3&7)<<3); # ModR/M - my $c=$1; - push @opcode,$c=~/^0/?oct($c):$c; - @opcode; - } else { - (); - } -}; - -my $rdrand = sub { - if (shift =~ /%[er](\w+)/) { - my @opcode=(); - my $dst=$1; - if ($dst !~ /[0-9]+/) { $dst = $regrm{"%e$dst"}; } - rex(\@opcode,0,$dst,8); - push @opcode,0x0f,0xc7,0xf0|($dst&7); - @opcode; - } else { - (); - } -}; - -my $rdseed = sub { - if (shift =~ /%[er](\w+)/) { - my @opcode=(); - my $dst=$1; - if ($dst !~ /[0-9]+/) { $dst = $regrm{"%e$dst"}; } - rex(\@opcode,0,$dst,8); - push @opcode,0x0f,0xc7,0xf8|($dst&7); - @opcode; - } else { - (); - } -}; - -# Not all AVX-capable assemblers recognize AMD XOP extension. Since we -# are using only two instructions hand-code them in order to be excused -# from chasing assembler versions... - -sub rxb { - my $opcode=shift; - my ($dst,$src1,$src2,$rxb)=@_; - - $rxb|=0x7<<5; - $rxb&=~(0x04<<5) if($dst>=8); - $rxb&=~(0x01<<5) if($src1>=8); - $rxb&=~(0x02<<5) if($src2>=8); - push @$opcode,$rxb; -} - -my $vprotd = sub { - if (shift =~ /\$([x0-9a-f]+),\s*%xmm([0-9]+),\s*%xmm([0-9]+)/) { - my @opcode=(0x8f); - rxb(\@opcode,$3,$2,-1,0x08); - push @opcode,0x78,0xc2; - push @opcode,0xc0|($2&7)|(($3&7)<<3); # ModR/M - my $c=$1; - push @opcode,$c=~/^0/?oct($c):$c; - @opcode; - } else { - (); - } -}; - -my $vprotq = sub { - if (shift =~ /\$([x0-9a-f]+),\s*%xmm([0-9]+),\s*%xmm([0-9]+)/) { - my @opcode=(0x8f); - rxb(\@opcode,$3,$2,-1,0x08); - push @opcode,0x78,0xc3; - push @opcode,0xc0|($2&7)|(($3&7)<<3); # ModR/M - my $c=$1; - push @opcode,$c=~/^0/?oct($c):$c; - @opcode; - } else { - (); - } -}; - -# Intel Control-flow Enforcement Technology extension. All functions and -# indirect branch targets will have to start with this instruction... - -my $endbranch = sub { - (0xf3,0x0f,0x1e,0xfa); -}; - -######################################################################## - -{ - my $comment = "#"; - $comment = ";" if ($masm || $nasm); - print <<___; -$comment This file is generated from a similarly-named Perl script in the BoringSSL -$comment source tree. Do not edit by hand. - -___ -} - -if ($nasm) { - print <<___; -default rel -%define XMMWORD -%define YMMWORD -%define ZMMWORD -___ -} elsif ($masm) { - print <<___; -OPTION DOTNAME -___ -} - -if ($gas) { - print <<___; -#if defined(__has_feature) -#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) -#define OPENSSL_NO_ASM -#endif -#endif - -#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) -___ -} - -while(defined(my $line=<>)) { - - $line =~ s|\R$||; # Better chomp - - if ($nasm) { - $line =~ s|^#ifdef |%ifdef |; - $line =~ s|^#ifndef |%ifndef |; - $line =~ s|^#endif|%endif|; - $line =~ s|[#!].*$||; # get rid of asm-style comments... - } else { - # Get rid of asm-style comments but not preprocessor directives. The - # former are identified by having a letter after the '#' and starting in - # the first column. - $line =~ s|!.*$||; - $line =~ s|(?<=.)#.*$||; - $line =~ s|^#([^a-z].*)?$||; - } - - $line =~ s|/\*.*\*/||; # ... and C-style comments... - $line =~ s|^\s+||; # ... and skip white spaces in beginning - $line =~ s|\s+$||; # ... and at the end - - if (my $label=label->re(\$line)) { print $label->out(); } - - if (my $directive=directive->re(\$line)) { - printf "%s",$directive->out(); - } elsif (my $opcode=opcode->re(\$line)) { - my $asm = eval("\$".$opcode->mnemonic()); - - if ((ref($asm) eq 'CODE') && scalar(my @bytes=&$asm($line))) { - print $gas?".byte\t":"DB\t",join(',',@bytes),"\n"; - next; - } - - my @args; - ARGUMENT: while (1) { - my $arg; - - ($arg=register->re(\$line, $opcode))|| - ($arg=const->re(\$line)) || - ($arg=ea->re(\$line, $opcode)) || - ($arg=expr->re(\$line, $opcode)) || - last ARGUMENT; - - push @args,$arg; - - last ARGUMENT if ($line !~ /^,/); - - $line =~ s/^,\s*//; - } # ARGUMENT: - - if ($#args>=0) { - my $insn; - my $sz=$opcode->size(); - - if ($gas) { - $insn = $opcode->out($#args>=1?$args[$#args]->size():$sz); - @args = map($_->out($sz),@args); - printf "\t%s\t%s",$insn,join(",",@args); - } else { - $insn = $opcode->out(); - foreach (@args) { - my $arg = $_->out(); - # $insn.=$sz compensates for movq, pinsrw, ... - if ($arg =~ /^xmm[0-9]+$/) { $insn.=$sz; $sz="x" if(!$sz); last; } - if ($arg =~ /^ymm[0-9]+$/) { $insn.=$sz; $sz="y" if(!$sz); last; } - if ($arg =~ /^zmm[0-9]+$/) { $insn.=$sz; $sz="z" if(!$sz); last; } - if ($arg =~ /^mm[0-9]+$/) { $insn.=$sz; $sz="q" if(!$sz); last; } - } - @args = reverse(@args); - undef $sz if ($nasm && $opcode->mnemonic() eq "lea"); - printf "\t%s\t%s",$insn,join(",",map($_->out($sz),@args)); - } - } else { - printf "\t%s",$opcode->out(); - } - } - - print $line,"\n"; -} - -print "\n$current_segment\tENDS\n" if ($current_segment && $masm); -print "END\n" if ($masm); -print "#endif\n" if ($gas); -# See https://www.airs.com/blog/archives/518. -print ".section\t.note.GNU-stack,\"\",\@progbits\n" if ($elf); - -close STDOUT or die "error closing STDOUT"; - - ################################################# -# Cross-reference x86_64 ABI "card" -# -# Unix Win64 -# %rax * * -# %rbx - - -# %rcx #4 #1 -# %rdx #3 #2 -# %rsi #2 - -# %rdi #1 - -# %rbp - - -# %rsp - - -# %r8 #5 #3 -# %r9 #6 #4 -# %r10 * * -# %r11 * * -# %r12 - - -# %r13 - - -# %r14 - - -# %r15 - - -# -# (*) volatile register -# (-) preserved by callee -# (#) Nth argument, volatile -# -# In Unix terms top of stack is argument transfer area for arguments -# which could not be accommodated in registers. Or in other words 7th -# [integer] argument resides at 8(%rsp) upon function entry point. -# 128 bytes above %rsp constitute a "red zone" which is not touched -# by signal handlers and can be used as temporal storage without -# allocating a frame. -# -# In Win64 terms N*8 bytes on top of stack is argument transfer area, -# which belongs to/can be overwritten by callee. N is the number of -# arguments passed to callee, *but* not less than 4! This means that -# upon function entry point 5th argument resides at 40(%rsp), as well -# as that 32 bytes from 8(%rsp) can always be used as temporal -# storage [without allocating a frame]. One can actually argue that -# one can assume a "red zone" above stack pointer under Win64 as well. -# Point is that at apparently no occasion Windows kernel would alter -# the area above user stack pointer in true asynchronous manner... -# -# All the above means that if assembler programmer adheres to Unix -# register and stack layout, but disregards the "red zone" existence, -# it's possible to use following prologue and epilogue to "gear" from -# Unix to Win64 ABI in leaf functions with not more than 6 arguments. -# -# omnipotent_function: -# ifdef WIN64 -# movq %rdi,8(%rsp) -# movq %rsi,16(%rsp) -# movq %rcx,%rdi ; if 1st argument is actually present -# movq %rdx,%rsi ; if 2nd argument is actually ... -# movq %r8,%rdx ; if 3rd argument is ... -# movq %r9,%rcx ; if 4th argument ... -# movq 40(%rsp),%r8 ; if 5th ... -# movq 48(%rsp),%r9 ; if 6th ... -# endif -# ... -# ifdef WIN64 -# movq 8(%rsp),%rdi -# movq 16(%rsp),%rsi -# endif -# ret -# - ################################################# -# Win64 SEH, Structured Exception Handling. -# -# Unlike on Unix systems(*) lack of Win64 stack unwinding information -# has undesired side-effect at run-time: if an exception is raised in -# assembler subroutine such as those in question (basically we're -# referring to segmentation violations caused by malformed input -# parameters), the application is briskly terminated without invoking -# any exception handlers, most notably without generating memory dump -# or any user notification whatsoever. This poses a problem. It's -# possible to address it by registering custom language-specific -# handler that would restore processor context to the state at -# subroutine entry point and return "exception is not handled, keep -# unwinding" code. Writing such handler can be a challenge... But it's -# doable, though requires certain coding convention. Consider following -# snippet: -# -# .type function,@function -# function: -# movq %rsp,%rax # copy rsp to volatile register -# pushq %r15 # save non-volatile registers -# pushq %rbx -# pushq %rbp -# movq %rsp,%r11 -# subq %rdi,%r11 # prepare [variable] stack frame -# andq $-64,%r11 -# movq %rax,0(%r11) # check for exceptions -# movq %r11,%rsp # allocate [variable] stack frame -# movq %rax,0(%rsp) # save original rsp value -# magic_point: -# ... -# movq 0(%rsp),%rcx # pull original rsp value -# movq -24(%rcx),%rbp # restore non-volatile registers -# movq -16(%rcx),%rbx -# movq -8(%rcx),%r15 -# movq %rcx,%rsp # restore original rsp -# magic_epilogue: -# ret -# .size function,.-function -# -# The key is that up to magic_point copy of original rsp value remains -# in chosen volatile register and no non-volatile register, except for -# rsp, is modified. While past magic_point rsp remains constant till -# the very end of the function. In this case custom language-specific -# exception handler would look like this: -# -# EXCEPTION_DISPOSITION handler (EXCEPTION_RECORD *rec,ULONG64 frame, -# CONTEXT *context,DISPATCHER_CONTEXT *disp) -# { ULONG64 *rsp = (ULONG64 *)context->Rax; -# ULONG64 rip = context->Rip; -# -# if (rip >= magic_point) -# { rsp = (ULONG64 *)context->Rsp; -# if (rip < magic_epilogue) -# { rsp = (ULONG64 *)rsp[0]; -# context->Rbp = rsp[-3]; -# context->Rbx = rsp[-2]; -# context->R15 = rsp[-1]; -# } -# } -# context->Rsp = (ULONG64)rsp; -# context->Rdi = rsp[1]; -# context->Rsi = rsp[2]; -# -# memcpy (disp->ContextRecord,context,sizeof(CONTEXT)); -# RtlVirtualUnwind(UNW_FLAG_NHANDLER,disp->ImageBase, -# dips->ControlPc,disp->FunctionEntry,disp->ContextRecord, -# &disp->HandlerData,&disp->EstablisherFrame,NULL); -# return ExceptionContinueSearch; -# } -# -# It's appropriate to implement this handler in assembler, directly in -# function's module. In order to do that one has to know members' -# offsets in CONTEXT and DISPATCHER_CONTEXT structures and some constant -# values. Here they are: -# -# CONTEXT.Rax 120 -# CONTEXT.Rcx 128 -# CONTEXT.Rdx 136 -# CONTEXT.Rbx 144 -# CONTEXT.Rsp 152 -# CONTEXT.Rbp 160 -# CONTEXT.Rsi 168 -# CONTEXT.Rdi 176 -# CONTEXT.R8 184 -# CONTEXT.R9 192 -# CONTEXT.R10 200 -# CONTEXT.R11 208 -# CONTEXT.R12 216 -# CONTEXT.R13 224 -# CONTEXT.R14 232 -# CONTEXT.R15 240 -# CONTEXT.Rip 248 -# CONTEXT.Xmm6 512 -# sizeof(CONTEXT) 1232 -# DISPATCHER_CONTEXT.ControlPc 0 -# DISPATCHER_CONTEXT.ImageBase 8 -# DISPATCHER_CONTEXT.FunctionEntry 16 -# DISPATCHER_CONTEXT.EstablisherFrame 24 -# DISPATCHER_CONTEXT.TargetIp 32 -# DISPATCHER_CONTEXT.ContextRecord 40 -# DISPATCHER_CONTEXT.LanguageHandler 48 -# DISPATCHER_CONTEXT.HandlerData 56 -# UNW_FLAG_NHANDLER 0 -# ExceptionContinueSearch 1 -# -# In order to tie the handler to the function one has to compose -# couple of structures: one for .xdata segment and one for .pdata. -# -# UNWIND_INFO structure for .xdata segment would be -# -# function_unwind_info: -# .byte 9,0,0,0 -# .rva handler -# -# This structure designates exception handler for a function with -# zero-length prologue, no stack frame or frame register. -# -# To facilitate composing of .pdata structures, auto-generated "gear" -# prologue copies rsp value to rax and denotes next instruction with -# .LSEH_begin_{function_name} label. This essentially defines the SEH -# styling rule mentioned in the beginning. Position of this label is -# chosen in such manner that possible exceptions raised in the "gear" -# prologue would be accounted to caller and unwound from latter's frame. -# End of function is marked with respective .LSEH_end_{function_name} -# label. To summarize, .pdata segment would contain -# -# .rva .LSEH_begin_function -# .rva .LSEH_end_function -# .rva function_unwind_info -# -# Reference to function_unwind_info from .xdata segment is the anchor. -# In case you wonder why references are 32-bit .rvas and not 64-bit -# .quads. References put into these two segments are required to be -# *relative* to the base address of the current binary module, a.k.a. -# image base. No Win64 module, be it .exe or .dll, can be larger than -# 2GB and thus such relative references can be and are accommodated in -# 32 bits. -# -# Having reviewed the example function code, one can argue that "movq -# %rsp,%rax" above is redundant. It is not! Keep in mind that on Unix -# rax would contain an undefined value. If this "offends" you, use -# another register and refrain from modifying rax till magic_point is -# reached, i.e. as if it was a non-volatile register. If more registers -# are required prior [variable] frame setup is completed, note that -# nobody says that you can have only one "magic point." You can -# "liberate" non-volatile registers by denoting last stack off-load -# instruction and reflecting it in finer grade unwind logic in handler. -# After all, isn't it why it's called *language-specific* handler... -# -# SE handlers are also involved in unwinding stack when executable is -# profiled or debugged. Profiling implies additional limitations that -# are too subtle to discuss here. For now it's sufficient to say that -# in order to simplify handlers one should either a) offload original -# %rsp to stack (like discussed above); or b) if you have a register to -# spare for frame pointer, choose volatile one. -# -# (*) Note that we're talking about run-time, not debug-time. Lack of -# unwind information makes debugging hard on both Windows and -# Unix. "Unlike" refers to the fact that on Unix signal handler -# will always be invoked, core dumped and appropriate exit code -# returned to parent (for user notification). diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/crypto/perlasm/x86asm.pl temporalio-1.3.0/vendor/ring-0.16.20/crypto/perlasm/x86asm.pl --- temporalio-1.3.0/vendor/ring-0.16.20/crypto/perlasm/x86asm.pl 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/crypto/perlasm/x86asm.pl 1970-01-01 00:00:00.000000000 +0000 @@ -1,327 +0,0 @@ -#! /usr/bin/env perl -# Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved. -# -# Licensed under the OpenSSL license (the "License"). You may not use -# this file except in compliance with the License. You can obtain a copy -# in the file LICENSE in the source distribution or at -# https://www.openssl.org/source/license.html - - -# require 'x86asm.pl'; -# &asm_init([,$i386only]); -# &function_begin("foo"); -# ... -# &function_end("foo"); -# &asm_finish - -$out=(); -$i386=0; - -# AUTOLOAD is this context has quite unpleasant side effect, namely -# that typos in function calls effectively go to assembler output, -# but on the pros side we don't have to implement one subroutine per -# each opcode... -sub ::AUTOLOAD -{ my $opcode = $AUTOLOAD; - - die "more than 4 arguments passed to $opcode" if ($#_>3); - - $opcode =~ s/.*:://; - if ($opcode =~ /^push/) { $stack+=4; } - elsif ($opcode =~ /^pop/) { $stack-=4; } - - &generic($opcode,@_) or die "undefined subroutine \&$AUTOLOAD"; -} - -sub ::emit -{ my $opcode=shift; - - if ($#_==-1) { push(@out,"\t$opcode\n"); } - else { push(@out,"\t$opcode\t".join(',',@_)."\n"); } -} - -sub ::LB -{ $_[0] =~ m/^e?([a-d])x$/o or die "$_[0] does not have a 'low byte'"; - $1."l"; -} -sub ::HB -{ $_[0] =~ m/^e?([a-d])x$/o or die "$_[0] does not have a 'high byte'"; - $1."h"; -} -sub ::stack_push{ my $num=$_[0]*4; $stack+=$num; &sub("esp",$num); } -sub ::stack_pop { my $num=$_[0]*4; $stack-=$num; &add("esp",$num); } -sub ::blindpop { &pop($_[0]); $stack+=4; } -sub ::wparam { &DWP($stack+4*$_[0],"esp"); } -sub ::swtmp { &DWP(4*$_[0],"esp"); } - -sub ::bswap -{ if ($i386) # emulate bswap for i386 - { &comment("bswap @_"); - &xchg(&HB(@_),&LB(@_)); - &ror (@_,16); - &xchg(&HB(@_),&LB(@_)); - } - else - { &generic("bswap",@_); } -} -# These are made-up opcodes introduced over the years essentially -# by ignorance, just alias them to real ones... -sub ::movb { &mov(@_); } -sub ::xorb { &xor(@_); } -sub ::rotl { &rol(@_); } -sub ::rotr { &ror(@_); } -sub ::exch { &xchg(@_); } -sub ::halt { &hlt; } -sub ::movz { &movzx(@_); } -sub ::pushf { &pushfd; } -sub ::popf { &popfd; } - -# 3 argument instructions -sub ::movq -{ my($p1,$p2,$optimize)=@_; - - if ($optimize && $p1=~/^mm[0-7]$/ && $p2=~/^mm[0-7]$/) - # movq between mmx registers can sink Intel CPUs - { &::pshufw($p1,$p2,0xe4); } - else - { &::generic("movq",@_); } -} - -# SSE>2 instructions -my %regrm = ( "eax"=>0, "ecx"=>1, "edx"=>2, "ebx"=>3, - "esp"=>4, "ebp"=>5, "esi"=>6, "edi"=>7 ); -sub ::pextrd -{ my($dst,$src,$imm)=@_; - if ("$dst:$src" =~ /(e[a-dsd][ixp]):xmm([0-7])/) - { &::data_byte(0x66,0x0f,0x3a,0x16,0xc0|($2<<3)|$regrm{$1},$imm); } - else - { &::generic("pextrd",@_); } -} - -sub ::pinsrd -{ my($dst,$src,$imm)=@_; - if ("$dst:$src" =~ /xmm([0-7]):(e[a-dsd][ixp])/) - { &::data_byte(0x66,0x0f,0x3a,0x22,0xc0|($1<<3)|$regrm{$2},$imm); } - else - { &::generic("pinsrd",@_); } -} - -sub ::pshufb -{ my($dst,$src)=@_; - if ("$dst:$src" =~ /xmm([0-7]):xmm([0-7])/) - { &data_byte(0x66,0x0f,0x38,0x00,0xc0|($1<<3)|$2); } - else - { &::generic("pshufb",@_); } -} - -sub ::palignr -{ my($dst,$src,$imm)=@_; - if ("$dst:$src" =~ /xmm([0-7]):xmm([0-7])/) - { &::data_byte(0x66,0x0f,0x3a,0x0f,0xc0|($1<<3)|$2,$imm); } - else - { &::generic("palignr",@_); } -} - -sub ::pclmulqdq -{ my($dst,$src,$imm)=@_; - if ("$dst:$src" =~ /xmm([0-7]):xmm([0-7])/) - { &::data_byte(0x66,0x0f,0x3a,0x44,0xc0|($1<<3)|$2,$imm); } - else - { &::generic("pclmulqdq",@_); } -} - -sub ::rdrand -{ my ($dst)=@_; - if ($dst =~ /(e[a-dsd][ixp])/) - { &::data_byte(0x0f,0xc7,0xf0|$regrm{$dst}); } - else - { &::generic("rdrand",@_); } -} - -sub ::rdseed -{ my ($dst)=@_; - if ($dst =~ /(e[a-dsd][ixp])/) - { &::data_byte(0x0f,0xc7,0xf8|$regrm{$dst}); } - else - { &::generic("rdrand",@_); } -} - -sub rxb { - local *opcode=shift; - my ($dst,$src1,$src2,$rxb)=@_; - - $rxb|=0x7<<5; - $rxb&=~(0x04<<5) if($dst>=8); - $rxb&=~(0x01<<5) if($src1>=8); - $rxb&=~(0x02<<5) if($src2>=8); - push @opcode,$rxb; -} - -sub ::vprotd -{ my $args=join(',',@_); - if ($args =~ /xmm([0-7]),xmm([0-7]),([x0-9a-f]+)/) - { my @opcode=(0x8f); - rxb(\@opcode,$1,$2,-1,0x08); - push @opcode,0x78,0xc2; - push @opcode,0xc0|($2&7)|(($1&7)<<3); # ModR/M - my $c=$3; - push @opcode,$c=~/^0/?oct($c):$c; - &::data_byte(@opcode); - } - else - { &::generic("vprotd",@_); } -} - -sub ::endbranch -{ - &::data_byte(0xf3,0x0f,0x1e,0xfb); -} - -# label management -$lbdecor="L"; # local label decoration, set by package -$label="000"; - -sub ::islabel # see is argument is a known label -{ my $i; - foreach $i (values %label) { return $i if ($i eq $_[0]); } - $label{$_[0]}; # can be undef -} - -sub ::label # instantiate a function-scope label -{ if (!defined($label{$_[0]})) - { $label{$_[0]}="${lbdecor}${label}${_[0]}"; $label++; } - $label{$_[0]}; -} - -sub ::LABEL # instantiate a file-scope label -{ $label{$_[0]}=$_[1] if (!defined($label{$_[0]})); - $label{$_[0]}; -} - -sub ::static_label { &::LABEL($_[0],$lbdecor.$_[0]); } - -sub ::set_label_B { push(@out,"@_:\n"); } -sub ::set_label -{ my $label=&::label($_[0]); - &::align($_[1]) if ($_[1]>1); - &::set_label_B($label); - $label; -} - -sub ::wipe_labels # wipes function-scope labels -{ foreach $i (keys %label) - { delete $label{$i} if ($label{$i} =~ /^\Q${lbdecor}\E[0-9]{3}/); } -} - -# subroutine management -sub ::function_begin -{ &function_begin_B(@_); - $stack=4; - &push("ebp"); - &push("ebx"); - &push("esi"); - &push("edi"); -} - -sub ::function_end -{ &pop("edi"); - &pop("esi"); - &pop("ebx"); - &pop("ebp"); - &ret(); - &function_end_B(@_); - $stack=0; - &wipe_labels(); -} - -sub ::function_end_A -{ &pop("edi"); - &pop("esi"); - &pop("ebx"); - &pop("ebp"); - &ret(); - $stack+=16; # readjust esp as if we didn't pop anything -} - -sub ::asciz -{ my @str=unpack("C*",shift); - push @str,0; - while ($#str>15) { - &data_byte(@str[0..15]); - foreach (0..15) { shift @str; } - } - &data_byte(@str) if (@str); -} - -sub ::asm_finish -{ &file_end(); - my $comment = "#"; - $comment = ";" if ($win32); - print <<___; -$comment This file is generated from a similarly-named Perl script in the BoringSSL -$comment source tree. Do not edit by hand. - -___ - if ($win32) { - print <<___ unless $masm; -%ifdef BORINGSSL_PREFIX -%include "boringssl_prefix_symbols_nasm.inc" -%endif -___ - } else { - print <<___; -#if defined(__i386__) -#if defined(BORINGSSL_PREFIX) -#include -#endif -___ - } - print @out; - print "#endif\n" unless ($win32); - # See https://www.airs.com/blog/archives/518. - print ".section\t.note.GNU-stack,\"\",\@progbits\n" if ($elf); -} - -sub ::asm_init -{ my ($type,$cpu)=@_; - - $i386=$cpu; - - $elf=$cpp=$coff=$aout=$macosx=$win32=$mwerks=$android=0; - if (($type eq "elf")) - { $elf=1; require "x86gas.pl"; } - elsif (($type eq "elf-1")) - { $elf=-1; require "x86gas.pl"; } - elsif (($type eq "a\.out")) - { $aout=1; require "x86gas.pl"; } - elsif (($type eq "coff" or $type eq "gaswin")) - { $coff=1; require "x86gas.pl"; } - elsif (($type eq "win32n")) - { $win32=1; require "x86nasm.pl"; } - elsif (($type eq "win32")) - { $win32=1; $masm=1; require "x86masm.pl"; } - elsif (($type eq "macosx")) - { $aout=1; $macosx=1; require "x86gas.pl"; } - elsif (($type eq "android")) - { $elf=1; $android=1; require "x86gas.pl"; } - else - { print STDERR <<"EOF"; -Pick one target type from - elf - Linux, FreeBSD, Solaris x86, etc. - a.out - DJGPP, elder OpenBSD, etc. - coff - GAS/COFF such as Win32 targets - win32n - Windows 95/Windows NT NASM format - macosx - Mac OS X -EOF - exit(1); - } - - $pic=0; - for (@ARGV) { $pic=1 if (/\-[fK]PIC/i); } - - &file(); -} - -sub ::hidden {} - -1; diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/crypto/perlasm/x86gas.pl temporalio-1.3.0/vendor/ring-0.16.20/crypto/perlasm/x86gas.pl --- temporalio-1.3.0/vendor/ring-0.16.20/crypto/perlasm/x86gas.pl 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/crypto/perlasm/x86gas.pl 1970-01-01 00:00:00.000000000 +0000 @@ -1,270 +0,0 @@ -#! /usr/bin/env perl -# Copyright 2007-2016 The OpenSSL Project Authors. All Rights Reserved. -# -# Licensed under the OpenSSL license (the "License"). You may not use -# this file except in compliance with the License. You can obtain a copy -# in the file LICENSE in the source distribution or at -# https://www.openssl.org/source/license.html - - -package x86gas; - -*out=\@::out; - -$::lbdecor=$::aout?"L":".L"; # local label decoration -$nmdecor=($::aout or $::coff)?"_":""; # external name decoration - -$initseg=""; - -$align=16; -$align=log($align)/log(2) if ($::aout); -$com_start="#" if ($::aout or $::coff); - -sub opsize() -{ my $reg=shift; - if ($reg =~ m/^%e/o) { "l"; } - elsif ($reg =~ m/^%[a-d][hl]$/o) { "b"; } - elsif ($reg =~ m/^%[yxm]/o) { undef; } - else { "w"; } -} - -# swap arguments; -# expand opcode with size suffix; -# prefix numeric constants with $; -sub ::generic -{ my($opcode,@arg)=@_; - my($suffix,$dst,$src); - - @arg=reverse(@arg); - - for (@arg) - { s/^(\*?)(e?[a-dsixphl]{2})$/$1%$2/o; # gp registers - s/^([xy]?mm[0-7])$/%$1/o; # xmm/mmx registers - s/^(\-?[0-9]+)$/\$$1/o; # constants - s/^(\-?0x[0-9a-f]+)$/\$$1/o; # constants - } - - $dst = $arg[$#arg] if ($#arg>=0); - $src = $arg[$#arg-1] if ($#arg>=1); - if ($dst =~ m/^%/o) { $suffix=&opsize($dst); } - elsif ($src =~ m/^%/o) { $suffix=&opsize($src); } - else { $suffix="l"; } - undef $suffix if ($dst =~ m/^%[xm]/o || $src =~ m/^%[xm]/o); - - if ($#_==0) { &::emit($opcode); } - elsif ($#_==1 && $opcode =~ m/^(call|clflush|j|loop|set)/o) - { &::emit($opcode,@arg); } - else { &::emit($opcode.$suffix,@arg);} - - 1; -} -# -# opcodes not covered by ::generic above, mostly inconsistent namings... -# -sub ::movzx { &::movzb(@_); } -sub ::pushfd { &::pushfl; } -sub ::popfd { &::popfl; } -sub ::cpuid { &::emit(".byte\t0x0f,0xa2"); } -sub ::rdtsc { &::emit(".byte\t0x0f,0x31"); } - -sub ::call { &::emit("call",(&::islabel($_[0]) or "$nmdecor$_[0]")); } -sub ::call_ptr { &::generic("call","*$_[0]"); } -sub ::jmp_ptr { &::generic("jmp","*$_[0]"); } - -*::bswap = sub { &::emit("bswap","%$_[0]"); } if (!$::i386); - -sub ::DWP -{ my($addr,$reg1,$reg2,$idx)=@_; - my $ret=""; - - if (!defined($idx) && 1*$reg2) { $idx=$reg2; $reg2=$reg1; undef $reg1; } - - $addr =~ s/^\s+//; - # prepend global references with optional underscore - $addr =~ s/^([^\+\-0-9][^\+\-]*)/&::islabel($1) or "$nmdecor$1"/ige; - - $reg1 = "%$reg1" if ($reg1); - $reg2 = "%$reg2" if ($reg2); - - $ret .= $addr if (($addr ne "") && ($addr ne 0)); - - if ($reg2) - { $idx!= 0 or $idx=1; - $ret .= "($reg1,$reg2,$idx)"; - } - elsif ($reg1) - { $ret .= "($reg1)"; } - - $ret; -} -sub ::QWP { &::DWP(@_); } -sub ::BP { &::DWP(@_); } -sub ::WP { &::DWP(@_); } -sub ::BC { @_; } -sub ::DWC { @_; } - -sub ::file -{ push(@out,".text\n"); } - -sub ::function_begin_B -{ my $func=shift; - my $global=($func !~ /^_/); - my $begin="${::lbdecor}_${func}_begin"; - - &::LABEL($func,$global?"$begin":"$nmdecor$func"); - $func=$nmdecor.$func; - - push(@out,".globl\t$func\n") if ($global); - if ($::macosx) { - push(@out,".private_extern\t$func\n"); - } else { - push(@out,".hidden\t$func\n"); - } - if ($::coff) - { push(@out,".def\t$func;\t.scl\t".(3-$global).";\t.type\t32;\t.endef\n"); } - elsif (($::aout and !$::pic) or $::macosx) - { } - else - { push(@out,".type $func,\@function\n"); } - push(@out,".align\t$align\n"); - push(@out,"$func:\n"); - push(@out,"$begin:\n") if ($global); - $::stack=4; -} - -sub ::function_end_B -{ my $func=shift; - push(@out,".size\t$nmdecor$func,.-".&::LABEL($func)."\n") if ($::elf); - $::stack=0; - &::wipe_labels(); -} - -sub ::comment - { - if (!defined($com_start) or $::elf) - { # Regarding $::elf above... - # GNU and SVR4 as'es use different comment delimiters, - push(@out,"\n"); # so we just skip ELF comments... - return; - } - foreach (@_) - { - if (/^\s*$/) - { push(@out,"\n"); } - else - { push(@out,"\t$com_start $_ $com_end\n"); } - } - } - -sub ::external_label -{ foreach(@_) { &::LABEL($_,$nmdecor.$_); } } - -sub ::public_label -{ push(@out,".globl\t".&::LABEL($_[0],$nmdecor.$_[0])."\n"); } - -sub ::file_end -{ if ($::macosx) - { if (%non_lazy_ptr) - { push(@out,".section __IMPORT,__pointers,non_lazy_symbol_pointers\n"); - foreach $i (keys %non_lazy_ptr) - { push(@out,"$non_lazy_ptr{$i}:\n.indirect_symbol\t$i\n.long\t0\n"); } - } - } - if (0 && grep {/\b${nmdecor}GFp_ia32cap_P\b/i} @out) { - my $tmp=".comm\t${nmdecor}GFp_ia32cap_P,16"; - if ($::macosx) { push (@out,"$tmp,2\n"); } - elsif ($::elf) { push (@out,"$tmp,4\n"); } - else { push (@out,"$tmp\n"); } - } - push(@out,$initseg) if ($initseg); -} - -sub ::data_byte { push(@out,".byte\t".join(',',@_)."\n"); } -sub ::data_short{ push(@out,".value\t".join(',',@_)."\n"); } -sub ::data_word { push(@out,".long\t".join(',',@_)."\n"); } - -sub ::align -{ my $val=$_[0]; - if ($::aout) - { $val=int(log($val)/log(2)); - $val.=",0x90"; - } - push(@out,".align\t$val\n"); -} - -sub ::picmeup -{ my($dst,$sym,$base,$reflabel)=@_; - - if (($::pic && ($::elf || $::aout)) || $::macosx) - { if (!defined($base)) - { &::call(&::label("PIC_me_up")); - &::set_label("PIC_me_up"); - &::blindpop($dst); - $base=$dst; - $reflabel=&::label("PIC_me_up"); - } - if ($::macosx) - { my $indirect=&::static_label("$nmdecor$sym\$non_lazy_ptr"); - &::mov($dst,&::DWP("$indirect-$reflabel",$base)); - $non_lazy_ptr{"$nmdecor$sym"}=$indirect; - } - elsif ($sym eq "GFp_ia32cap_P" && $::elf>0) - { &::lea($dst,&::DWP("$sym-$reflabel",$base)); } - else - { &::lea($dst,&::DWP("_GLOBAL_OFFSET_TABLE_+[.-$reflabel]", - $base)); - &::mov($dst,&::DWP("$sym\@GOT",$dst)); - } - } - else - { &::lea($dst,&::DWP($sym)); } -} - -sub ::initseg -{ my $f=$nmdecor.shift; - - if ($::android) - { $initseg.=<<___; -.section .init_array -.align 4 -.long $f -___ - } - elsif ($::elf) - { $initseg.=<<___; -.section .init - call $f -___ - } - elsif ($::coff) - { $initseg.=<<___; # applies to both Cygwin and Mingw -.section .ctors -.long $f -___ - } - elsif ($::macosx) - { $initseg.=<<___; -.mod_init_func -.align 2 -.long $f -___ - } - elsif ($::aout) - { my $ctor="${nmdecor}_GLOBAL_\$I\$$f"; - $initseg.=".text\n"; - $initseg.=".type $ctor,\@function\n" if ($::pic); - $initseg.=<<___; # OpenBSD way... -.globl $ctor -.align 2 -$ctor: - jmp $f -___ - } -} - -sub ::dataseg -{ push(@out,".data\n"); } - -*::hidden = sub { push(@out,".hidden\t$nmdecor$_[0]\n"); } if ($::elf); - -1; diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/crypto/perlasm/x86nasm.pl temporalio-1.3.0/vendor/ring-0.16.20/crypto/perlasm/x86nasm.pl --- temporalio-1.3.0/vendor/ring-0.16.20/crypto/perlasm/x86nasm.pl 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/crypto/perlasm/x86nasm.pl 1970-01-01 00:00:00.000000000 +0000 @@ -1,186 +0,0 @@ -#! /usr/bin/env perl -# Copyright 1999-2018 The OpenSSL Project Authors. All Rights Reserved. -# -# Licensed under the OpenSSL license (the "License"). You may not use -# this file except in compliance with the License. You can obtain a copy -# in the file LICENSE in the source distribution or at -# https://www.openssl.org/source/license.html - - -package x86nasm; - -*out=\@::out; - -$::lbdecor="L\$"; # local label decoration -$nmdecor="_"; # external name decoration -$drdecor=$::mwerks?".":""; # directive decoration - -$initseg=""; - -sub ::generic -{ my $opcode=shift; - my $tmp; - - if (!$::mwerks) - { if ($opcode =~ m/^j/o && $#_==0) # optimize jumps - { $_[0] = "NEAR $_[0]"; } - elsif ($opcode eq "lea" && $#_==1) # wipe storage qualifier from lea - { $_[1] =~ s/^[^\[]*\[/\[/o; } - elsif ($opcode eq "clflush" && $#_==0) - { $_[0] =~ s/^[^\[]*\[/\[/o; } - } - &::emit($opcode,@_); - 1; -} -# -# opcodes not covered by ::generic above, mostly inconsistent namings... -# -sub ::call { &::emit("call",(&::islabel($_[0]) or "$nmdecor$_[0]")); } -sub ::call_ptr { &::emit("call",@_); } -sub ::jmp_ptr { &::emit("jmp",@_); } - -sub get_mem -{ my($size,$addr,$reg1,$reg2,$idx)=@_; - my($post,$ret); - - if (!defined($idx) && 1*$reg2) { $idx=$reg2; $reg2=$reg1; undef $reg1; } - - if ($size ne "") - { $ret .= "$size"; - $ret .= " PTR" if ($::mwerks); - $ret .= " "; - } - $ret .= "["; - - $addr =~ s/^\s+//; - # prepend global references with optional underscore - $addr =~ s/^([^\+\-0-9][^\+\-]*)/::islabel($1) or "$nmdecor$1"/ige; - # put address arithmetic expression in parenthesis - $addr="($addr)" if ($addr =~ /^.+[\-\+].+$/); - - if (($addr ne "") && ($addr ne 0)) - { if ($addr !~ /^-/) { $ret .= "$addr+"; } - else { $post=$addr; } - } - - if ($reg2 ne "") - { $idx!=0 or $idx=1; - $ret .= "$reg2*$idx"; - $ret .= "+$reg1" if ($reg1 ne ""); - } - else - { $ret .= "$reg1"; } - - $ret .= "$post]"; - $ret =~ s/\+\]/]/; # in case $addr was the only argument - - $ret; -} -sub ::BP { &get_mem("BYTE",@_); } -sub ::DWP { &get_mem("DWORD",@_); } -sub ::WP { &get_mem("WORD",@_); } -sub ::QWP { &get_mem("",@_); } -sub ::BC { (($::mwerks)?"":"BYTE ")."@_"; } -sub ::DWC { (($::mwerks)?"":"DWORD ")."@_"; } - -sub ::file -{ if ($::mwerks) { push(@out,".section\t.text,64\n"); } - else - { my $tmp=<<___; -%ifidn __OUTPUT_FORMAT__,obj -section code use32 class=code align=64 -%elifidn __OUTPUT_FORMAT__,win32 -\$\@feat.00 equ 1 -section .text code align=64 -%else -section .text code -%endif -___ - push(@out,$tmp); - } -} - -sub ::function_begin_B -{ my $func=shift; - my $global=($func !~ /^_/); - my $begin="${::lbdecor}_${func}_begin"; - - $begin =~ s/^\@/./ if ($::mwerks); # the torture never stops - - &::LABEL($func,$global?"$begin":"$nmdecor$func"); - $func=$nmdecor.$func; - - push(@out,"${drdecor}global $func\n") if ($global); - push(@out,"${drdecor}align 16\n"); - push(@out,"$func:\n"); - push(@out,"$begin:\n") if ($global); - $::stack=4; -} - -sub ::function_end_B -{ $::stack=0; - &::wipe_labels(); -} - -sub ::file_end -{ if (grep {/\b${nmdecor}GFp_ia32cap_P\b/i} @out) - { my $comm=<<___; -${drdecor}segment .bss -${drdecor}common ${nmdecor}GFp_ia32cap_P 16 -___ - # comment out GFp_ia32cap_P declarations - grep {s/(^extern\s+${nmdecor}GFp_ia32cap_P)/\;$1/} @out; - push (@out,$comm) - } - push (@out,$initseg) if ($initseg); -} - -sub ::comment { foreach (@_) { push(@out,"\t; $_\n"); } } - -sub ::external_label -{ foreach(@_) - { push(@out,"${drdecor}extern\t".&::LABEL($_,$nmdecor.$_)."\n"); } -} - -sub ::public_label -{ push(@out,"${drdecor}global\t".&::LABEL($_[0],$nmdecor.$_[0])."\n"); } - -sub ::data_byte -{ push(@out,(($::mwerks)?".byte\t":"db\t").join(',',@_)."\n"); } -sub ::data_short -{ push(@out,(($::mwerks)?".word\t":"dw\t").join(',',@_)."\n"); } -sub ::data_word -{ push(@out,(($::mwerks)?".long\t":"dd\t").join(',',@_)."\n"); } - -sub ::align -{ push(@out,"${drdecor}align\t$_[0]\n"); } - -sub ::picmeup -{ my($dst,$sym)=@_; - &::lea($dst,&::DWP($sym)); -} - -sub ::initseg -{ my $f=$nmdecor.shift; - if ($::win32) - { $initseg=<<___; -segment .CRT\$XCU data align=4 -extern $f -dd $f -___ - } -} - -sub ::dataseg -{ if ($mwerks) { push(@out,".section\t.data,4\n"); } - else { push(@out,"section\t.data align=4\n"); } -} - -sub ::safeseh -{ my $nm=shift; - push(@out,"%if __NASM_VERSION_ID__ >= 0x02030000\n"); - push(@out,"safeseh ".&::LABEL($nm,$nmdecor.$nm)."\n"); - push(@out,"%endif\n"); -} - -1; diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/crypto/poly1305/internal.h temporalio-1.3.0/vendor/ring-0.16.20/crypto/poly1305/internal.h --- temporalio-1.3.0/vendor/ring-0.16.20/crypto/poly1305/internal.h 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/crypto/poly1305/internal.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -/* Copyright (c) 2016, Google Inc. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY - * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION - * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ - -#ifndef OPENSSL_HEADER_POLY1305_INTERNAL_H -#define OPENSSL_HEADER_POLY1305_INTERNAL_H - -#include -#include - -#if defined(OPENSSL_ARM) && !defined(OPENSSL_NO_ASM) && !defined(OPENSSL_APPLE) -#define OPENSSL_POLY1305_NEON -#endif - -#endif // OPENSSL_HEADER_POLY1305_INTERNAL_H diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/crypto/poly1305/poly1305_arm_asm.S temporalio-1.3.0/vendor/ring-0.16.20/crypto/poly1305/poly1305_arm_asm.S --- temporalio-1.3.0/vendor/ring-0.16.20/crypto/poly1305/poly1305_arm_asm.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/crypto/poly1305/poly1305_arm_asm.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,2031 +0,0 @@ -#if defined(__has_feature) -#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) -#define OPENSSL_NO_ASM -#endif -#endif - -#if defined(__arm__) && !defined(OPENSSL_NO_ASM) && !defined(__APPLE__) - -#pragma GCC diagnostic ignored "-Wlanguage-extension-token" - -#if defined(BORINGSSL_PREFIX) -#include -#endif - -# This implementation was taken from the public domain, neon2 version in -# SUPERCOP by D. J. Bernstein and Peter Schwabe. - -# qhasm: int32 input_0 - -# qhasm: int32 input_1 - -# qhasm: int32 input_2 - -# qhasm: int32 input_3 - -# qhasm: stack32 input_4 - -# qhasm: stack32 input_5 - -# qhasm: stack32 input_6 - -# qhasm: stack32 input_7 - -# qhasm: int32 caller_r4 - -# qhasm: int32 caller_r5 - -# qhasm: int32 caller_r6 - -# qhasm: int32 caller_r7 - -# qhasm: int32 caller_r8 - -# qhasm: int32 caller_r9 - -# qhasm: int32 caller_r10 - -# qhasm: int32 caller_r11 - -# qhasm: int32 caller_r12 - -# qhasm: int32 caller_r14 - -# qhasm: reg128 caller_q4 - -# qhasm: reg128 caller_q5 - -# qhasm: reg128 caller_q6 - -# qhasm: reg128 caller_q7 - -# qhasm: startcode -.fpu neon -.text - -# qhasm: reg128 r0 - -# qhasm: reg128 r1 - -# qhasm: reg128 r2 - -# qhasm: reg128 r3 - -# qhasm: reg128 r4 - -# qhasm: reg128 x01 - -# qhasm: reg128 x23 - -# qhasm: reg128 x4 - -# qhasm: reg128 y0 - -# qhasm: reg128 y12 - -# qhasm: reg128 y34 - -# qhasm: reg128 5y12 - -# qhasm: reg128 5y34 - -# qhasm: stack128 y0_stack - -# qhasm: stack128 y12_stack - -# qhasm: stack128 y34_stack - -# qhasm: stack128 5y12_stack - -# qhasm: stack128 5y34_stack - -# qhasm: reg128 z0 - -# qhasm: reg128 z12 - -# qhasm: reg128 z34 - -# qhasm: reg128 5z12 - -# qhasm: reg128 5z34 - -# qhasm: stack128 z0_stack - -# qhasm: stack128 z12_stack - -# qhasm: stack128 z34_stack - -# qhasm: stack128 5z12_stack - -# qhasm: stack128 5z34_stack - -# qhasm: stack128 two24 - -# qhasm: int32 ptr - -# qhasm: reg128 c01 - -# qhasm: reg128 c23 - -# qhasm: reg128 d01 - -# qhasm: reg128 d23 - -# qhasm: reg128 t0 - -# qhasm: reg128 t1 - -# qhasm: reg128 t2 - -# qhasm: reg128 t3 - -# qhasm: reg128 t4 - -# qhasm: reg128 mask - -# qhasm: reg128 u0 - -# qhasm: reg128 u1 - -# qhasm: reg128 u2 - -# qhasm: reg128 u3 - -# qhasm: reg128 u4 - -# qhasm: reg128 v01 - -# qhasm: reg128 mid - -# qhasm: reg128 v23 - -# qhasm: reg128 v4 - -# qhasm: int32 len - -# qhasm: qpushenter crypto_onetimeauth_poly1305_neon2_blocks -.align 4 -.global GFp_poly1305_neon2_blocks -.hidden GFp_poly1305_neon2_blocks -.type GFp_poly1305_neon2_blocks STT_FUNC -GFp_poly1305_neon2_blocks: -vpush {q4,q5,q6,q7} -mov r12,sp -sub sp,sp,#192 -bic sp,sp,#31 - -# qhasm: len = input_3 -# asm 1: mov >len=int32#4,len=r3,y12=reg128#2%bot->y12=reg128#2%top},[y12=d2->y12=d3},[y34=reg128#3%bot->y34=reg128#3%top},[y34=d4->y34=d5},[input_1=int32#2,input_1=r1,z12=reg128#5%bot->z12=reg128#5%top},[z12=d8->z12=d9},[z34=reg128#6%bot->z34=reg128#6%top},[z34=d10->z34=d11},[mask=reg128#7,#0xffffffff -# asm 2: vmov.i64 >mask=q6,#0xffffffff -vmov.i64 q6,#0xffffffff - -# qhasm: 2x u4 = 0xff -# asm 1: vmov.i64 >u4=reg128#8,#0xff -# asm 2: vmov.i64 >u4=q7,#0xff -vmov.i64 q7,#0xff - -# qhasm: x01 aligned= mem128[input_0];input_0+=16 -# asm 1: vld1.8 {>x01=reg128#9%bot->x01=reg128#9%top},[x01=d16->x01=d17},[x23=reg128#10%bot->x23=reg128#10%top},[x23=d18->x23=d19},[input_0=int32#1,input_0=r0,>=6 -# asm 1: vshr.u64 >mask=reg128#7,mask=q6,>= 7 -# asm 1: vshr.u64 >u4=reg128#8,u4=q7,5y12=reg128#12,5y12=q11,5y34=reg128#13,5y34=q12,5y12=reg128#12,<5y12=reg128#12,5y12=q11,<5y12=q11,5y34=reg128#13,<5y34=reg128#13,5y34=q12,<5y34=q12,u4=reg128#8,u4=q7,5z12=reg128#14,5z12=q13,5z34=reg128#15,5z34=q14,5z12=reg128#14,<5z12=reg128#14,5z12=q13,<5z12=q13,5z34=reg128#15,<5z34=reg128#15,5z34=q14,<5z34=q14,ptr=int32#2,ptr=r1,r4=reg128#16,r4=q15,r0=reg128#8,r0=q7,ptr=int32#2,ptr=r1,ptr=int32#2,ptr=r1,ptr=int32#2,ptr=r1,ptr=int32#2,ptr=r1,ptr=int32#2,ptr=r1,ptr=int32#2,ptr=r1,ptr=int32#2,<5y12_stack=stack128#5 -# asm 2: lea >ptr=r1,<5y12_stack=[sp,#64] -add r1,sp,#64 - -# qhasm: mem128[ptr] aligned= 5y12 -# asm 1: vst1.8 {<5y12=reg128#12%bot-<5y12=reg128#12%top},[ptr=int32#2,<5y34_stack=stack128#6 -# asm 2: lea >ptr=r1,<5y34_stack=[sp,#80] -add r1,sp,#80 - -# qhasm: mem128[ptr] aligned= 5y34 -# asm 1: vst1.8 {<5y34=reg128#13%bot-<5y34=reg128#13%top},[ptr=int32#2,<5z12_stack=stack128#10 -# asm 2: lea >ptr=r1,<5z12_stack=[sp,#144] -add r1,sp,#144 - -# qhasm: mem128[ptr] aligned= 5z12 -# asm 1: vst1.8 {<5z12=reg128#14%bot-<5z12=reg128#14%top},[ptr=int32#2,<5z34_stack=stack128#11 -# asm 2: lea >ptr=r1,<5z34_stack=[sp,#160] -add r1,sp,#160 - -# qhasm: mem128[ptr] aligned= 5z34 -# asm 1: vst1.8 {<5z34=reg128#15%bot-<5z34=reg128#15%top},[? len - 64 -# asm 1: cmp -bls ._below64bytes - -# qhasm: input_2 += 32 -# asm 1: add >input_2=int32#2,input_2=r1,c01=reg128#1%bot->c01=reg128#1%top},[c01=d0->c01=d1},[c23=reg128#2%bot->c23=reg128#2%top},[c23=d2->c23=d3},[ptr=int32#3,ptr=r2,z12=reg128#3%bot->z12=reg128#3%top},[z12=d4->z12=d5},[ptr=int32#3,ptr=r2,z0=reg128#4%bot->z0=reg128#4%top},[z0=d6->z0=d7},[r3=reg128#5,r3=q4,input_2=int32#2,input_2=r1,ptr=int32#3,<5z34_stack=stack128#11 -# asm 2: lea >ptr=r2,<5z34_stack=[sp,#160] -add r2,sp,#160 - -# qhasm: 5z34 aligned= mem128[ptr] -# asm 1: vld1.8 {>5z34=reg128#6%bot->5z34=reg128#6%top},[5z34=d10->5z34=d11},[r0=reg128#8,r0=q7,r2=reg128#14,r2=q13,d01=reg128#12%bot->d01=reg128#12%top},[d01=d22->d01=d23},[r1=reg128#15,r1=q14,ptr=int32#3,<5z12_stack=stack128#10 -# asm 2: lea >ptr=r2,<5z12_stack=[sp,#144] -add r2,sp,#144 - -# qhasm: 5z12 aligned= mem128[ptr] -# asm 1: vld1.8 {>5z12=reg128#1%bot->5z12=reg128#1%top},[5z12=d0->5z12=d1},[d23=reg128#2%bot->d23=reg128#2%top},[d23=d2->d23=d3},[input_2=int32#2,input_2=r1,> 40 -# asm 1: vshr.u64 >v4=reg128#4,v4=q3,> 14; v23[3] = d23[2,3] unsigned>> 14 -# asm 1: vshrn.u64 > 26; v01[3] = d01[2,3] unsigned>> 26 -# asm 1: vshrn.u64 > 20; v23[1] = mid[2,3] unsigned>> 20 -# asm 1: vshrn.u64 ptr=int32#3,ptr=r2,y34=reg128#3%bot->y34=reg128#3%top},[y34=d4->y34=d5},[ptr=int32#3,ptr=r2,y12=reg128#2%bot->y12=reg128#2%top},[y12=d2->y12=d3},[ptr=int32#3,ptr=r2,y0=reg128#1%bot->y0=reg128#1%top},[y0=d0->y0=d1},[ptr=int32#3,<5y34_stack=stack128#6 -# asm 2: lea >ptr=r2,<5y34_stack=[sp,#80] -add r2,sp,#80 - -# qhasm: 5y34 aligned= mem128[ptr] -# asm 1: vld1.8 {>5y34=reg128#13%bot->5y34=reg128#13%top},[5y34=d24->5y34=d25},[ptr=int32#3,<5y12_stack=stack128#5 -# asm 2: lea >ptr=r2,<5y12_stack=[sp,#64] -add r2,sp,#64 - -# qhasm: 5y12 aligned= mem128[ptr] -# asm 1: vld1.8 {>5y12=reg128#12%bot->5y12=reg128#12%top},[5y12=d22->5y12=d23},[ptr=int32#3,ptr=r2,> 26 -# asm 1: vshr.u64 >t1=reg128#4,t1=q3,len=int32#4,len=r3,r0=reg128#6,r0=q5,r1=reg128#4,r1=q3,> 26 -# asm 1: vshr.u64 >t4=reg128#8,t4=q7,r3=reg128#5,r3=q4,x4=reg128#8,x4=q7,r4=reg128#16%bot->r4=reg128#16%top},[r4=d30->r4=d31},[> 26 -# asm 1: vshr.u64 >t2=reg128#9,t2=q8,r1=reg128#4,r1=q3,> 26 -# asm 1: vshr.u64 >t0=reg128#10,t0=q9,r2=reg128#9,r2=q8,x4=reg128#11,x4=q10,x01=reg128#6,x01=q5,r0=reg128#8%bot->r0=reg128#8%top},[r0=d14->r0=d15},[ptr=int32#3,ptr=r2,t0=reg128#10,t0=q9,> 26 -# asm 1: vshr.u64 >t3=reg128#14,t3=q13,x01=reg128#15,x01=q14,z34=reg128#6%bot->z34=reg128#6%top},[z34=d10->z34=d11},[x23=reg128#10,x23=q9,r3=reg128#5,r3=q4,input_2=int32#2,input_2=r1,> 26 -# asm 1: vshr.u64 >t1=reg128#14,t1=q13,x01=reg128#9,x01=q8,r1=reg128#4,r1=q3,> 26 -# asm 1: vshr.u64 >t4=reg128#14,t4=q13,r3=reg128#5,r3=q4,x4=reg128#11,x4=q10,? len - 64 -# asm 1: cmp -bhi ._mainloop2 - -# qhasm: input_2 -= 32 -# asm 1: sub >input_2=int32#3,input_2=r2,? len - 32 -# asm 1: cmp -bls ._end - -# qhasm: mainloop: -._mainloop: - -# qhasm: new r0 - -# qhasm: ptr = &two24 -# asm 1: lea >ptr=int32#2,ptr=r1,r4=reg128#5%bot->r4=reg128#5%top},[r4=d8->r4=d9},[u4=reg128#6%bot->u4=reg128#6%top},[u4=d10->u4=d11},[c01=reg128#8%bot->c01=reg128#8%top},[c01=d14->c01=d15},[c23=reg128#14%bot->c23=reg128#14%top},[c23=d26->c23=d27},[r0=reg128#4,r0=q3,r3=reg128#6,r3=q5,r1=reg128#14,r1=q13,r2=reg128#8,r2=q7,> 26 -# asm 1: vshr.u64 >t1=reg128#9,t1=q8,r0=reg128#4,r0=q3,r1=reg128#9,r1=q8,> 26 -# asm 1: vshr.u64 >t4=reg128#10,t4=q9,r3=reg128#6,r3=q5,r4=reg128#5,r4=q4,> 26 -# asm 1: vshr.u64 >t2=reg128#10,t2=q9,r1=reg128#11,r1=q10,> 26 -# asm 1: vshr.u64 >t0=reg128#9,t0=q8,r2=reg128#8,r2=q7,r4=reg128#5,r4=q4,r0=reg128#4,r0=q3,t0=reg128#9,t0=q8,> 26 -# asm 1: vshr.u64 >t3=reg128#14,t3=q13,r0=reg128#4,r0=q3,x23=reg128#10,x23=q9,r3=reg128#6,r3=q5,> 26 -# asm 1: vshr.u64 >t1=reg128#8,t1=q7,x01=reg128#9,x01=q8,r1=reg128#4,r1=q3,> 26 -# asm 1: vshr.u64 >t4=reg128#8,t4=q7,r3=reg128#6,r3=q5,x4=reg128#11,x4=q10,len=int32#4,len=r3,? len - 32 -# asm 1: cmp -bhi ._mainloop - -# qhasm: end: -._end: - -# qhasm: mem128[input_0] = x01;input_0+=16 -# asm 1: vst1.8 {len=int32#1,len=r0,mask=reg128#1,#0xffffffff -# asm 2: vmov.i64 >mask=q0,#0xffffffff -vmov.i64 q0,#0xffffffff - -# qhasm: y01 aligned= mem128[input_2];input_2+=16 -# asm 1: vld1.8 {>y01=reg128#2%bot->y01=reg128#2%top},[y01=d2->y01=d3},[_5y01=reg128#3,_5y01=q2,y23=reg128#4%bot->y23=reg128#4%top},[y23=d6->y23=d7},[_5y23=reg128#9,_5y23=q8,_5y4=reg128#11,_5y4=q10,x01=reg128#12%bot->x01=reg128#12%top},[x01=d22->x01=d23},[_5y01=reg128#3,<_5y01=reg128#3,_5y01=q2,<_5y01=q2,x23=reg128#13%bot->x23=reg128#13%top},[x23=d24->x23=d25},[_5y23=reg128#9,<_5y23=reg128#9,_5y23=q8,<_5y23=q8,_5y4=reg128#11,<_5y4=reg128#11,_5y4=q10,<_5y4=q10,c01=reg128#14%bot->c01=reg128#14%top},[c01=d26->c01=d27},[x01=reg128#12,x01=q11,c23=reg128#14%bot->c23=reg128#14%top},[c23=d26->c23=d27},[x23=reg128#13,x23=q12,>=6 -# asm 1: vshr.u64 >mask=reg128#1,mask=q0,x4=reg128#14,x4=q13,r0=reg128#15,r0=q14,r1=reg128#3,r1=q2,r2=reg128#16,r2=q15,r3=reg128#9,r3=q8,r4=reg128#10,r4=q9,> 26 -# asm 1: vshr.u64 >t1=reg128#2,t1=q1,r0=reg128#4,r0=q3,r1=reg128#2,r1=q1,> 26 -# asm 1: vshr.u64 >t4=reg128#3,t4=q2,r3=reg128#9,r3=q8,r4=reg128#3,r4=q2,> 26 -# asm 1: vshr.u64 >t2=reg128#10,t2=q9,r1=reg128#2,r1=q1,> 26 -# asm 1: vshr.u64 >t0=reg128#11,t0=q10,r2=reg128#10,r2=q9,r4=reg128#3,r4=q2,r0=reg128#4,r0=q3,t0=reg128#11,t0=q10,> 26 -# asm 1: vshr.u64 >t3=reg128#12,t3=q11,r0=reg128#4,r0=q3,x23=reg128#10,x23=q9,r3=reg128#9,r3=q8,> 26 -# asm 1: vshr.u64 >t1=reg128#11,t1=q10,x01=reg128#4,x01=q3,r1=reg128#2,r1=q1,> 26 -# asm 1: vshr.u64 >t4=reg128#11,t4=q10,r3=reg128#1,r3=q0,x4=reg128#3,x4=q2, - -#include "internal.h" -#include "../internal.h" - - -#if defined(OPENSSL_POLY1305_NEON) - -#pragma GCC diagnostic ignored "-Wsign-conversion" -#pragma GCC diagnostic ignored "-Wcast-align" - -typedef struct { - uint32_t v[12]; // for alignment; only using 10 -} fe1305x2; - -#define addmulmod GFp_poly1305_neon2_addmulmod -#define blocks GFp_poly1305_neon2_blocks - -extern void addmulmod(fe1305x2 *r, const fe1305x2 *x, const fe1305x2 *y, - const fe1305x2 *c); - -extern int blocks(fe1305x2 *h, const fe1305x2 *precomp, const uint8_t *in, - size_t inlen); - -static void freeze(fe1305x2 *r) { - int i; - - uint32_t x0 = r->v[0]; - uint32_t x1 = r->v[2]; - uint32_t x2 = r->v[4]; - uint32_t x3 = r->v[6]; - uint32_t x4 = r->v[8]; - uint32_t y0; - uint32_t y1; - uint32_t y2; - uint32_t y3; - uint32_t y4; - uint32_t swap; - - for (i = 0; i < 3; ++i) { - x1 += x0 >> 26; - x0 &= 0x3ffffff; - x2 += x1 >> 26; - x1 &= 0x3ffffff; - x3 += x2 >> 26; - x2 &= 0x3ffffff; - x4 += x3 >> 26; - x3 &= 0x3ffffff; - x0 += 5 * (x4 >> 26); - x4 &= 0x3ffffff; - } - - y0 = x0 + 5; - y1 = x1 + (y0 >> 26); - y0 &= 0x3ffffff; - y2 = x2 + (y1 >> 26); - y1 &= 0x3ffffff; - y3 = x3 + (y2 >> 26); - y2 &= 0x3ffffff; - y4 = x4 + (y3 >> 26); - y3 &= 0x3ffffff; - swap = -(y4 >> 26); - y4 &= 0x3ffffff; - - y0 ^= x0; - y1 ^= x1; - y2 ^= x2; - y3 ^= x3; - y4 ^= x4; - - y0 &= swap; - y1 &= swap; - y2 &= swap; - y3 &= swap; - y4 &= swap; - - y0 ^= x0; - y1 ^= x1; - y2 ^= x2; - y3 ^= x3; - y4 ^= x4; - - r->v[0] = y0; - r->v[2] = y1; - r->v[4] = y2; - r->v[6] = y3; - r->v[8] = y4; -} - -static void store32(uint8_t out[4], uint32_t v) { GFp_memcpy(out, &v, 4); } - -// load32 exists to avoid breaking strict aliasing rules in -// fe1305x2_frombytearray. -static uint32_t load32(const uint8_t t[4]) { - uint32_t tmp; - GFp_memcpy(&tmp, t, sizeof(tmp)); - return tmp; -} - -static void fe1305x2_tobytearray(uint8_t r[16], fe1305x2 *x) { - uint32_t x0 = x->v[0]; - uint32_t x1 = x->v[2]; - uint32_t x2 = x->v[4]; - uint32_t x3 = x->v[6]; - uint32_t x4 = x->v[8]; - - x1 += x0 >> 26; - x0 &= 0x3ffffff; - x2 += x1 >> 26; - x1 &= 0x3ffffff; - x3 += x2 >> 26; - x2 &= 0x3ffffff; - x4 += x3 >> 26; - x3 &= 0x3ffffff; - - store32(r, x0 + (x1 << 26)); - store32(r + 4, (x1 >> 6) + (x2 << 20)); - store32(r + 8, (x2 >> 12) + (x3 << 14)); - store32(r + 12, (x3 >> 18) + (x4 << 8)); -} - -static void fe1305x2_frombytearray(fe1305x2 *r, const uint8_t *x, size_t xlen) { - size_t i; - uint8_t t[17]; - - for (i = 0; (i < 16) && (i < xlen); i++) { - t[i] = x[i]; - } - xlen -= i; - x += i; - t[i++] = 1; - for (; i < 17; i++) { - t[i] = 0; - } - - r->v[0] = 0x3ffffff & load32(t); - r->v[2] = 0x3ffffff & (load32(t + 3) >> 2); - r->v[4] = 0x3ffffff & (load32(t + 6) >> 4); - r->v[6] = 0x3ffffff & (load32(t + 9) >> 6); - r->v[8] = load32(t + 13); - - if (xlen) { - for (i = 0; (i < 16) && (i < xlen); i++) { - t[i] = x[i]; - } - t[i++] = 1; - for (; i < 17; i++) { - t[i] = 0; - } - - r->v[1] = 0x3ffffff & load32(t); - r->v[3] = 0x3ffffff & (load32(t + 3) >> 2); - r->v[5] = 0x3ffffff & (load32(t + 6) >> 4); - r->v[7] = 0x3ffffff & (load32(t + 9) >> 6); - r->v[9] = load32(t + 13); - } else { - r->v[1] = r->v[3] = r->v[5] = r->v[7] = r->v[9] = 0; - } -} - -static const alignas(16) fe1305x2 zero; - -struct poly1305_state_st { - uint8_t data[sizeof(fe1305x2[5]) + 128]; - uint8_t buf[32]; - size_t buf_used; - uint8_t key[16]; -}; - -OPENSSL_STATIC_ASSERT(sizeof(struct poly1305_state_st) <= sizeof(poly1305_state), - "poly1305_state isn't large enough to hold aligned poly1305_state_st"); - -void GFp_poly1305_init_neon(poly1305_state *state, const uint8_t key[32]) { - struct poly1305_state_st *st = (struct poly1305_state_st *)(state); - fe1305x2 *const r = (fe1305x2 *)(st->data + (15 & (-(int)st->data))); - fe1305x2 *const h = r + 1; - fe1305x2 *const c = h + 1; - fe1305x2 *const precomp = c + 1; - - r->v[1] = r->v[0] = 0x3ffffff & load32(key); - r->v[3] = r->v[2] = 0x3ffff03 & (load32(key + 3) >> 2); - r->v[5] = r->v[4] = 0x3ffc0ff & (load32(key + 6) >> 4); - r->v[7] = r->v[6] = 0x3f03fff & (load32(key + 9) >> 6); - r->v[9] = r->v[8] = 0x00fffff & (load32(key + 12) >> 8); - - for (size_t j = 0; j < 10; j++) { - h->v[j] = 0; // XXX: should fast-forward a bit - } - - addmulmod(precomp, r, r, &zero); // precompute r^2 - addmulmod(precomp + 1, precomp, precomp, &zero); // precompute r^4 - - GFp_memcpy(st->key, key + 16, 16); - st->buf_used = 0; -} - -void GFp_poly1305_update_neon(poly1305_state *state, const uint8_t *in, - size_t in_len) { - struct poly1305_state_st *st = (struct poly1305_state_st *)(state); - fe1305x2 *const r = (fe1305x2 *)(st->data + (15 & (-(int)st->data))); - fe1305x2 *const h = r + 1; - fe1305x2 *const c = h + 1; - fe1305x2 *const precomp = c + 1; - - if (st->buf_used) { - size_t todo = 32 - st->buf_used; - if (todo > in_len) { - todo = in_len; - } - for (size_t i = 0; i < todo; i++) { - st->buf[st->buf_used + i] = in[i]; - } - st->buf_used += todo; - in_len -= todo; - in += todo; - - if (st->buf_used == sizeof(st->buf) && in_len) { - addmulmod(h, h, precomp, &zero); - fe1305x2_frombytearray(c, st->buf, sizeof(st->buf)); - for (size_t i = 0; i < 10; i++) { - h->v[i] += c->v[i]; - } - st->buf_used = 0; - } - } - - while (in_len > 32) { - size_t tlen = 1048576; - if (in_len < tlen) { - tlen = in_len; - } - tlen -= blocks(h, precomp, in, tlen); - in_len -= tlen; - in += tlen; - } - - if (in_len) { - for (size_t i = 0; i < in_len; i++) { - st->buf[i] = in[i]; - } - st->buf_used = in_len; - } -} - -void GFp_poly1305_finish_neon(poly1305_state *state, uint8_t mac[16]) { - struct poly1305_state_st *st = (struct poly1305_state_st *)(state); - fe1305x2 *const r = (fe1305x2 *)(st->data + (15 & (-(int)st->data))); - fe1305x2 *const h = r + 1; - fe1305x2 *const c = h + 1; - fe1305x2 *const precomp = c + 1; - - addmulmod(h, h, precomp, &zero); - - if (st->buf_used > 16) { - fe1305x2_frombytearray(c, st->buf, st->buf_used); - precomp->v[1] = r->v[1]; - precomp->v[3] = r->v[3]; - precomp->v[5] = r->v[5]; - precomp->v[7] = r->v[7]; - precomp->v[9] = r->v[9]; - addmulmod(h, h, precomp, c); - } else if (st->buf_used > 0) { - fe1305x2_frombytearray(c, st->buf, st->buf_used); - r->v[1] = 1; - r->v[3] = 0; - r->v[5] = 0; - r->v[7] = 0; - r->v[9] = 0; - addmulmod(h, h, r, c); - } - - h->v[0] += h->v[1]; - h->v[2] += h->v[3]; - h->v[4] += h->v[5]; - h->v[6] += h->v[7]; - h->v[8] += h->v[9]; - freeze(h); - - fe1305x2_frombytearray(c, st->key, 16); - c->v[8] ^= (1 << 24); - - h->v[0] += c->v[0]; - h->v[2] += c->v[2]; - h->v[4] += c->v[4]; - h->v[6] += c->v[6]; - h->v[8] += c->v[8]; - fe1305x2_tobytearray(mac, h); -} - -#endif // OPENSSL_POLY1305_NEON diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/crypto/poly1305/poly1305.c temporalio-1.3.0/vendor/ring-0.16.20/crypto/poly1305/poly1305.c --- temporalio-1.3.0/vendor/ring-0.16.20/crypto/poly1305/poly1305.c 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/crypto/poly1305/poly1305.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,301 +0,0 @@ -/* Copyright (c) 2014, Google Inc. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY - * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION - * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ - -// This implementation of poly1305 is by Andrew Moon -// (https://github.com/floodyberry/poly1305-donna) and released as public -// domain. - -#include - -#include "internal.h" -#include "../internal.h" - - -#if !defined(BORINGSSL_HAS_UINT128) || !defined(OPENSSL_X86_64) - -#if defined(__GNUC__) -#pragma GCC diagnostic ignored "-Wsign-conversion" -#pragma GCC diagnostic ignored "-Wconversion" -#endif - -// We can assume little-endian. -static uint32_t U8TO32_LE(const uint8_t *m) { - uint32_t r; - GFp_memcpy(&r, m, sizeof(r)); - return r; -} - -static void U32TO8_LE(uint8_t *m, uint32_t v) { - GFp_memcpy(m, &v, sizeof(v)); -} - -static uint64_t mul32x32_64(uint32_t a, uint32_t b) { return (uint64_t)a * b; } - -struct poly1305_state_st { - uint32_t r0, r1, r2, r3, r4; - uint32_t s1, s2, s3, s4; - uint32_t h0, h1, h2, h3, h4; - uint8_t buf[16]; - size_t buf_used; - uint8_t key[16]; -}; - -OPENSSL_STATIC_ASSERT(sizeof(struct poly1305_state_st) <= sizeof(poly1305_state), - "poly1305_state isn't large enough to hold aligned poly1305_state_st"); - -static inline struct poly1305_state_st *poly1305_aligned_state( - poly1305_state *state) { - dev_assert_secret(((uintptr_t)state & 63) == 0); - return (struct poly1305_state_st *)(((uintptr_t)state + 63) & ~63); -} - -// poly1305_blocks updates |state| given some amount of input data. This -// function may only be called with a |len| that is not a multiple of 16 at the -// end of the data. Otherwise the input must be buffered into 16 byte blocks. -static void poly1305_update(struct poly1305_state_st *state, const uint8_t *in, - size_t len) { - uint32_t t0, t1, t2, t3; - uint64_t t[5]; - uint32_t b; - uint64_t c; - size_t j; - uint8_t mp[16]; - - if (len < 16) { - goto poly1305_donna_atmost15bytes; - } - -poly1305_donna_16bytes: - t0 = U8TO32_LE(in); - t1 = U8TO32_LE(in + 4); - t2 = U8TO32_LE(in + 8); - t3 = U8TO32_LE(in + 12); - - in += 16; - len -= 16; - - state->h0 += t0 & 0x3ffffff; - state->h1 += ((((uint64_t)t1 << 32) | t0) >> 26) & 0x3ffffff; - state->h2 += ((((uint64_t)t2 << 32) | t1) >> 20) & 0x3ffffff; - state->h3 += ((((uint64_t)t3 << 32) | t2) >> 14) & 0x3ffffff; - state->h4 += (t3 >> 8) | (1 << 24); - -poly1305_donna_mul: - t[0] = mul32x32_64(state->h0, state->r0) + mul32x32_64(state->h1, state->s4) + - mul32x32_64(state->h2, state->s3) + mul32x32_64(state->h3, state->s2) + - mul32x32_64(state->h4, state->s1); - t[1] = mul32x32_64(state->h0, state->r1) + mul32x32_64(state->h1, state->r0) + - mul32x32_64(state->h2, state->s4) + mul32x32_64(state->h3, state->s3) + - mul32x32_64(state->h4, state->s2); - t[2] = mul32x32_64(state->h0, state->r2) + mul32x32_64(state->h1, state->r1) + - mul32x32_64(state->h2, state->r0) + mul32x32_64(state->h3, state->s4) + - mul32x32_64(state->h4, state->s3); - t[3] = mul32x32_64(state->h0, state->r3) + mul32x32_64(state->h1, state->r2) + - mul32x32_64(state->h2, state->r1) + mul32x32_64(state->h3, state->r0) + - mul32x32_64(state->h4, state->s4); - t[4] = mul32x32_64(state->h0, state->r4) + mul32x32_64(state->h1, state->r3) + - mul32x32_64(state->h2, state->r2) + mul32x32_64(state->h3, state->r1) + - mul32x32_64(state->h4, state->r0); - - state->h0 = (uint32_t)t[0] & 0x3ffffff; - c = (t[0] >> 26); - t[1] += c; - state->h1 = (uint32_t)t[1] & 0x3ffffff; - b = (uint32_t)(t[1] >> 26); - t[2] += b; - state->h2 = (uint32_t)t[2] & 0x3ffffff; - b = (uint32_t)(t[2] >> 26); - t[3] += b; - state->h3 = (uint32_t)t[3] & 0x3ffffff; - b = (uint32_t)(t[3] >> 26); - t[4] += b; - state->h4 = (uint32_t)t[4] & 0x3ffffff; - b = (uint32_t)(t[4] >> 26); - state->h0 += b * 5; - - if (len >= 16) { - goto poly1305_donna_16bytes; - } - -// final bytes -poly1305_donna_atmost15bytes: - if (!len) { - return; - } - - for (j = 0; j < len; j++) { - mp[j] = in[j]; - } - mp[j++] = 1; - for (; j < 16; j++) { - mp[j] = 0; - } - len = 0; - - t0 = U8TO32_LE(mp + 0); - t1 = U8TO32_LE(mp + 4); - t2 = U8TO32_LE(mp + 8); - t3 = U8TO32_LE(mp + 12); - - state->h0 += t0 & 0x3ffffff; - state->h1 += ((((uint64_t)t1 << 32) | t0) >> 26) & 0x3ffffff; - state->h2 += ((((uint64_t)t2 << 32) | t1) >> 20) & 0x3ffffff; - state->h3 += ((((uint64_t)t3 << 32) | t2) >> 14) & 0x3ffffff; - state->h4 += (t3 >> 8); - - goto poly1305_donna_mul; -} - -void GFp_poly1305_init(poly1305_state *statep, const uint8_t key[32]) { - struct poly1305_state_st *state = poly1305_aligned_state(statep); - uint32_t t0, t1, t2, t3; - - t0 = U8TO32_LE(key + 0); - t1 = U8TO32_LE(key + 4); - t2 = U8TO32_LE(key + 8); - t3 = U8TO32_LE(key + 12); - - // precompute multipliers - state->r0 = t0 & 0x3ffffff; - t0 >>= 26; - t0 |= t1 << 6; - state->r1 = t0 & 0x3ffff03; - t1 >>= 20; - t1 |= t2 << 12; - state->r2 = t1 & 0x3ffc0ff; - t2 >>= 14; - t2 |= t3 << 18; - state->r3 = t2 & 0x3f03fff; - t3 >>= 8; - state->r4 = t3 & 0x00fffff; - - state->s1 = state->r1 * 5; - state->s2 = state->r2 * 5; - state->s3 = state->r3 * 5; - state->s4 = state->r4 * 5; - - // init state - state->h0 = 0; - state->h1 = 0; - state->h2 = 0; - state->h3 = 0; - state->h4 = 0; - - state->buf_used = 0; - GFp_memcpy(state->key, key + 16, sizeof(state->key)); -} - -void GFp_poly1305_update(poly1305_state *statep, const uint8_t *in, - size_t in_len) { - struct poly1305_state_st *state = poly1305_aligned_state(statep); - - if (state->buf_used) { - size_t todo = 16 - state->buf_used; - if (todo > in_len) { - todo = in_len; - } - for (size_t i = 0; i < todo; i++) { - state->buf[state->buf_used + i] = in[i]; - } - state->buf_used += todo; - in_len -= todo; - in += todo; - - if (state->buf_used == 16) { - poly1305_update(state, state->buf, 16); - state->buf_used = 0; - } - } - - if (in_len >= 16) { - size_t todo = in_len & ~0xf; - poly1305_update(state, in, todo); - in += todo; - in_len &= 0xf; - } - - if (in_len) { - for (size_t i = 0; i < in_len; i++) { - state->buf[i] = in[i]; - } - state->buf_used = in_len; - } -} - -void GFp_poly1305_finish(poly1305_state *statep, uint8_t mac[16]) { - struct poly1305_state_st *state = poly1305_aligned_state(statep); - uint64_t f0, f1, f2, f3; - uint32_t g0, g1, g2, g3, g4; - uint32_t b, nb; - - if (state->buf_used) { - poly1305_update(state, state->buf, state->buf_used); - } - - b = state->h0 >> 26; - state->h0 = state->h0 & 0x3ffffff; - state->h1 += b; - b = state->h1 >> 26; - state->h1 = state->h1 & 0x3ffffff; - state->h2 += b; - b = state->h2 >> 26; - state->h2 = state->h2 & 0x3ffffff; - state->h3 += b; - b = state->h3 >> 26; - state->h3 = state->h3 & 0x3ffffff; - state->h4 += b; - b = state->h4 >> 26; - state->h4 = state->h4 & 0x3ffffff; - state->h0 += b * 5; - - g0 = state->h0 + 5; - b = g0 >> 26; - g0 &= 0x3ffffff; - g1 = state->h1 + b; - b = g1 >> 26; - g1 &= 0x3ffffff; - g2 = state->h2 + b; - b = g2 >> 26; - g2 &= 0x3ffffff; - g3 = state->h3 + b; - b = g3 >> 26; - g3 &= 0x3ffffff; - g4 = state->h4 + b - (1 << 26); - - b = (g4 >> 31) - 1; - nb = ~b; - state->h0 = (state->h0 & nb) | (g0 & b); - state->h1 = (state->h1 & nb) | (g1 & b); - state->h2 = (state->h2 & nb) | (g2 & b); - state->h3 = (state->h3 & nb) | (g3 & b); - state->h4 = (state->h4 & nb) | (g4 & b); - - f0 = ((state->h0) | (state->h1 << 26)) + (uint64_t)U8TO32_LE(&state->key[0]); - f1 = ((state->h1 >> 6) | (state->h2 << 20)) + - (uint64_t)U8TO32_LE(&state->key[4]); - f2 = ((state->h2 >> 12) | (state->h3 << 14)) + - (uint64_t)U8TO32_LE(&state->key[8]); - f3 = ((state->h3 >> 18) | (state->h4 << 8)) + - (uint64_t)U8TO32_LE(&state->key[12]); - - U32TO8_LE(&mac[0], (uint32_t)f0); - f1 += (f0 >> 32); - U32TO8_LE(&mac[4], (uint32_t)f1); - f2 += (f1 >> 32); - U32TO8_LE(&mac[8], (uint32_t)f2); - f3 += (f2 >> 32); - U32TO8_LE(&mac[12], (uint32_t)f3); -} - -#endif // !BORINGSSL_HAS_UINT128 || !OPENSSL_X86_64 diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/crypto/poly1305/poly1305_vec.c temporalio-1.3.0/vendor/ring-0.16.20/crypto/poly1305/poly1305_vec.c --- temporalio-1.3.0/vendor/ring-0.16.20/crypto/poly1305/poly1305_vec.c 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/crypto/poly1305/poly1305_vec.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,864 +0,0 @@ -/* Copyright (c) 2014, Google Inc. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY - * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION - * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ - -// This implementation of poly1305 is by Andrew Moon -// (https://github.com/floodyberry/poly1305-donna) and released as public -// domain. It implements SIMD vectorization based on the algorithm described in -// http://cr.yp.to/papers.html#neoncrypto. Unrolled to 2 powers, i.e. 64 byte -// block size - -#include - -#include "internal.h" -#include "../internal.h" - - -#if defined(BORINGSSL_HAS_UINT128) && defined(OPENSSL_X86_64) - -#pragma GCC diagnostic ignored "-Wcast-align" -#pragma GCC diagnostic ignored "-Wsign-conversion" - -#include - -static uint32_t load_u32_le(const uint8_t in[4]) { - uint32_t ret; - GFp_memcpy(&ret, in, 4); - return ret; -} - -static uint64_t load_u64_le(const uint8_t in[8]) { - uint64_t ret; - GFp_memcpy(&ret, in, 8); - return ret; -} - -static void store_u64_le(uint8_t out[8], uint64_t v) { - GFp_memcpy(out, &v, 8); -} - -typedef __m128i xmmi; - -static const alignas(16) uint32_t poly1305_x64_sse2_message_mask[4] = { - (1 << 26) - 1, 0, (1 << 26) - 1, 0}; -static const alignas(16) uint32_t poly1305_x64_sse2_5[4] = {5, 0, 5, 0}; -static const alignas(16) uint32_t poly1305_x64_sse2_1shl128[4] = { - (1 << 24), 0, (1 << 24), 0}; - -static inline uint128_t add128(uint128_t a, uint128_t b) { return a + b; } - -static inline uint128_t add128_64(uint128_t a, uint64_t b) { return a + b; } - -static inline uint128_t mul64x64_128(uint64_t a, uint64_t b) { - return (uint128_t)a * b; -} - -static inline uint64_t lo128(uint128_t a) { return (uint64_t)a; } - -static inline uint64_t shr128(uint128_t v, const int shift) { - return (uint64_t)(v >> shift); -} - -static inline uint64_t shr128_pair(uint64_t hi, uint64_t lo, const int shift) { - return (uint64_t)((((uint128_t)hi << 64) | lo) >> shift); -} - -typedef struct poly1305_power_t { - union { - xmmi v; - uint64_t u[2]; - uint32_t d[4]; - } R20, R21, R22, R23, R24, S21, S22, S23, S24; -} poly1305_power; - -typedef struct poly1305_state_internal_t { - poly1305_power P[2]; /* 288 bytes, top 32 bit halves unused = 144 - bytes of free storage */ - union { - xmmi H[5]; // 80 bytes - uint64_t HH[10]; - }; - // uint64_t r0,r1,r2; [24 bytes] - // uint64_t pad0,pad1; [16 bytes] - uint64_t started; // 8 bytes - uint64_t leftover; // 8 bytes - uint8_t buffer[64]; // 64 bytes -} poly1305_state_internal; /* 448 bytes total + 63 bytes for - alignment = 511 bytes raw */ - -OPENSSL_STATIC_ASSERT(sizeof(poly1305_state_internal) <= sizeof(poly1305_state), - "poly1305_state isn't large enough to hold aligned poly1305_state_internal"); - -static inline poly1305_state_internal *poly1305_aligned_state( - poly1305_state *state) { - dev_assert_secret(((uintptr_t)state & 63) == 0); - return (poly1305_state_internal *)(((uint64_t)state + 63) & ~63); -} - -static inline size_t poly1305_min(size_t a, size_t b) { - return (a < b) ? a : b; -} - -void GFp_poly1305_init(poly1305_state *state, const uint8_t key[32]) { - poly1305_state_internal *st = poly1305_aligned_state(state); - poly1305_power *p; - uint64_t r0, r1, r2; - uint64_t t0, t1; - - // clamp key - t0 = load_u64_le(key + 0); - t1 = load_u64_le(key + 8); - r0 = t0 & 0xffc0fffffff; - t0 >>= 44; - t0 |= t1 << 20; - r1 = t0 & 0xfffffc0ffff; - t1 >>= 24; - r2 = t1 & 0x00ffffffc0f; - - // store r in un-used space of st->P[1] - p = &st->P[1]; - p->R20.d[1] = (uint32_t)(r0); - p->R20.d[3] = (uint32_t)(r0 >> 32); - p->R21.d[1] = (uint32_t)(r1); - p->R21.d[3] = (uint32_t)(r1 >> 32); - p->R22.d[1] = (uint32_t)(r2); - p->R22.d[3] = (uint32_t)(r2 >> 32); - - // store pad - p->R23.d[1] = load_u32_le(key + 16); - p->R23.d[3] = load_u32_le(key + 20); - p->R24.d[1] = load_u32_le(key + 24); - p->R24.d[3] = load_u32_le(key + 28); - - // H = 0 - st->H[0] = _mm_setzero_si128(); - st->H[1] = _mm_setzero_si128(); - st->H[2] = _mm_setzero_si128(); - st->H[3] = _mm_setzero_si128(); - st->H[4] = _mm_setzero_si128(); - - st->started = 0; - st->leftover = 0; -} - -static void poly1305_first_block(poly1305_state_internal *st, - const uint8_t *m) { - const xmmi MMASK = _mm_load_si128((const xmmi *)poly1305_x64_sse2_message_mask); - const xmmi FIVE = _mm_load_si128((const xmmi *)poly1305_x64_sse2_5); - const xmmi HIBIT = _mm_load_si128((const xmmi *)poly1305_x64_sse2_1shl128); - xmmi T5, T6; - poly1305_power *p; - uint128_t d[3]; - uint64_t r0, r1, r2; - uint64_t r20, r21, r22, s22; - uint64_t pad0, pad1; - uint64_t c; - uint64_t i; - - // pull out stored info - p = &st->P[1]; - - r0 = ((uint64_t)p->R20.d[3] << 32) | (uint64_t)p->R20.d[1]; - r1 = ((uint64_t)p->R21.d[3] << 32) | (uint64_t)p->R21.d[1]; - r2 = ((uint64_t)p->R22.d[3] << 32) | (uint64_t)p->R22.d[1]; - pad0 = ((uint64_t)p->R23.d[3] << 32) | (uint64_t)p->R23.d[1]; - pad1 = ((uint64_t)p->R24.d[3] << 32) | (uint64_t)p->R24.d[1]; - - // compute powers r^2,r^4 - r20 = r0; - r21 = r1; - r22 = r2; - for (i = 0; i < 2; i++) { - s22 = r22 * (5 << 2); - - d[0] = add128(mul64x64_128(r20, r20), mul64x64_128(r21 * 2, s22)); - d[1] = add128(mul64x64_128(r22, s22), mul64x64_128(r20 * 2, r21)); - d[2] = add128(mul64x64_128(r21, r21), mul64x64_128(r22 * 2, r20)); - - r20 = lo128(d[0]) & 0xfffffffffff; - c = shr128(d[0], 44); - d[1] = add128_64(d[1], c); - r21 = lo128(d[1]) & 0xfffffffffff; - c = shr128(d[1], 44); - d[2] = add128_64(d[2], c); - r22 = lo128(d[2]) & 0x3ffffffffff; - c = shr128(d[2], 42); - r20 += c * 5; - c = (r20 >> 44); - r20 = r20 & 0xfffffffffff; - r21 += c; - - p->R20.v = _mm_shuffle_epi32(_mm_cvtsi32_si128((uint32_t)(r20)&0x3ffffff), - _MM_SHUFFLE(1, 0, 1, 0)); - p->R21.v = _mm_shuffle_epi32( - _mm_cvtsi32_si128((uint32_t)((r20 >> 26) | (r21 << 18)) & 0x3ffffff), - _MM_SHUFFLE(1, 0, 1, 0)); - p->R22.v = - _mm_shuffle_epi32(_mm_cvtsi32_si128((uint32_t)((r21 >> 8)) & 0x3ffffff), - _MM_SHUFFLE(1, 0, 1, 0)); - p->R23.v = _mm_shuffle_epi32( - _mm_cvtsi32_si128((uint32_t)((r21 >> 34) | (r22 << 10)) & 0x3ffffff), - _MM_SHUFFLE(1, 0, 1, 0)); - p->R24.v = _mm_shuffle_epi32(_mm_cvtsi32_si128((uint32_t)((r22 >> 16))), - _MM_SHUFFLE(1, 0, 1, 0)); - p->S21.v = _mm_mul_epu32(p->R21.v, FIVE); - p->S22.v = _mm_mul_epu32(p->R22.v, FIVE); - p->S23.v = _mm_mul_epu32(p->R23.v, FIVE); - p->S24.v = _mm_mul_epu32(p->R24.v, FIVE); - p--; - } - - // put saved info back - p = &st->P[1]; - p->R20.d[1] = (uint32_t)(r0); - p->R20.d[3] = (uint32_t)(r0 >> 32); - p->R21.d[1] = (uint32_t)(r1); - p->R21.d[3] = (uint32_t)(r1 >> 32); - p->R22.d[1] = (uint32_t)(r2); - p->R22.d[3] = (uint32_t)(r2 >> 32); - p->R23.d[1] = (uint32_t)(pad0); - p->R23.d[3] = (uint32_t)(pad0 >> 32); - p->R24.d[1] = (uint32_t)(pad1); - p->R24.d[3] = (uint32_t)(pad1 >> 32); - - // H = [Mx,My] - T5 = _mm_unpacklo_epi64(_mm_loadl_epi64((const xmmi *)(m + 0)), - _mm_loadl_epi64((const xmmi *)(m + 16))); - T6 = _mm_unpacklo_epi64(_mm_loadl_epi64((const xmmi *)(m + 8)), - _mm_loadl_epi64((const xmmi *)(m + 24))); - st->H[0] = _mm_and_si128(MMASK, T5); - st->H[1] = _mm_and_si128(MMASK, _mm_srli_epi64(T5, 26)); - T5 = _mm_or_si128(_mm_srli_epi64(T5, 52), _mm_slli_epi64(T6, 12)); - st->H[2] = _mm_and_si128(MMASK, T5); - st->H[3] = _mm_and_si128(MMASK, _mm_srli_epi64(T5, 26)); - st->H[4] = _mm_or_si128(_mm_srli_epi64(T6, 40), HIBIT); -} - -static void poly1305_blocks(poly1305_state_internal *st, const uint8_t *m, - size_t bytes) { - const xmmi MMASK = _mm_load_si128((const xmmi *)poly1305_x64_sse2_message_mask); - const xmmi FIVE = _mm_load_si128((const xmmi *)poly1305_x64_sse2_5); - const xmmi HIBIT = _mm_load_si128((const xmmi *)poly1305_x64_sse2_1shl128); - - poly1305_power *p; - xmmi H0, H1, H2, H3, H4; - xmmi T0, T1, T2, T3, T4, T5, T6; - xmmi M0, M1, M2, M3, M4; - xmmi C1, C2; - - H0 = st->H[0]; - H1 = st->H[1]; - H2 = st->H[2]; - H3 = st->H[3]; - H4 = st->H[4]; - - while (bytes >= 64) { - // H *= [r^4,r^4] - p = &st->P[0]; - T0 = _mm_mul_epu32(H0, p->R20.v); - T1 = _mm_mul_epu32(H0, p->R21.v); - T2 = _mm_mul_epu32(H0, p->R22.v); - T3 = _mm_mul_epu32(H0, p->R23.v); - T4 = _mm_mul_epu32(H0, p->R24.v); - T5 = _mm_mul_epu32(H1, p->S24.v); - T6 = _mm_mul_epu32(H1, p->R20.v); - T0 = _mm_add_epi64(T0, T5); - T1 = _mm_add_epi64(T1, T6); - T5 = _mm_mul_epu32(H2, p->S23.v); - T6 = _mm_mul_epu32(H2, p->S24.v); - T0 = _mm_add_epi64(T0, T5); - T1 = _mm_add_epi64(T1, T6); - T5 = _mm_mul_epu32(H3, p->S22.v); - T6 = _mm_mul_epu32(H3, p->S23.v); - T0 = _mm_add_epi64(T0, T5); - T1 = _mm_add_epi64(T1, T6); - T5 = _mm_mul_epu32(H4, p->S21.v); - T6 = _mm_mul_epu32(H4, p->S22.v); - T0 = _mm_add_epi64(T0, T5); - T1 = _mm_add_epi64(T1, T6); - T5 = _mm_mul_epu32(H1, p->R21.v); - T6 = _mm_mul_epu32(H1, p->R22.v); - T2 = _mm_add_epi64(T2, T5); - T3 = _mm_add_epi64(T3, T6); - T5 = _mm_mul_epu32(H2, p->R20.v); - T6 = _mm_mul_epu32(H2, p->R21.v); - T2 = _mm_add_epi64(T2, T5); - T3 = _mm_add_epi64(T3, T6); - T5 = _mm_mul_epu32(H3, p->S24.v); - T6 = _mm_mul_epu32(H3, p->R20.v); - T2 = _mm_add_epi64(T2, T5); - T3 = _mm_add_epi64(T3, T6); - T5 = _mm_mul_epu32(H4, p->S23.v); - T6 = _mm_mul_epu32(H4, p->S24.v); - T2 = _mm_add_epi64(T2, T5); - T3 = _mm_add_epi64(T3, T6); - T5 = _mm_mul_epu32(H1, p->R23.v); - T4 = _mm_add_epi64(T4, T5); - T5 = _mm_mul_epu32(H2, p->R22.v); - T4 = _mm_add_epi64(T4, T5); - T5 = _mm_mul_epu32(H3, p->R21.v); - T4 = _mm_add_epi64(T4, T5); - T5 = _mm_mul_epu32(H4, p->R20.v); - T4 = _mm_add_epi64(T4, T5); - - // H += [Mx,My]*[r^2,r^2] - T5 = _mm_unpacklo_epi64(_mm_loadl_epi64((const xmmi *)(m + 0)), - _mm_loadl_epi64((const xmmi *)(m + 16))); - T6 = _mm_unpacklo_epi64(_mm_loadl_epi64((const xmmi *)(m + 8)), - _mm_loadl_epi64((const xmmi *)(m + 24))); - M0 = _mm_and_si128(MMASK, T5); - M1 = _mm_and_si128(MMASK, _mm_srli_epi64(T5, 26)); - T5 = _mm_or_si128(_mm_srli_epi64(T5, 52), _mm_slli_epi64(T6, 12)); - M2 = _mm_and_si128(MMASK, T5); - M3 = _mm_and_si128(MMASK, _mm_srli_epi64(T5, 26)); - M4 = _mm_or_si128(_mm_srli_epi64(T6, 40), HIBIT); - - p = &st->P[1]; - T5 = _mm_mul_epu32(M0, p->R20.v); - T6 = _mm_mul_epu32(M0, p->R21.v); - T0 = _mm_add_epi64(T0, T5); - T1 = _mm_add_epi64(T1, T6); - T5 = _mm_mul_epu32(M1, p->S24.v); - T6 = _mm_mul_epu32(M1, p->R20.v); - T0 = _mm_add_epi64(T0, T5); - T1 = _mm_add_epi64(T1, T6); - T5 = _mm_mul_epu32(M2, p->S23.v); - T6 = _mm_mul_epu32(M2, p->S24.v); - T0 = _mm_add_epi64(T0, T5); - T1 = _mm_add_epi64(T1, T6); - T5 = _mm_mul_epu32(M3, p->S22.v); - T6 = _mm_mul_epu32(M3, p->S23.v); - T0 = _mm_add_epi64(T0, T5); - T1 = _mm_add_epi64(T1, T6); - T5 = _mm_mul_epu32(M4, p->S21.v); - T6 = _mm_mul_epu32(M4, p->S22.v); - T0 = _mm_add_epi64(T0, T5); - T1 = _mm_add_epi64(T1, T6); - T5 = _mm_mul_epu32(M0, p->R22.v); - T6 = _mm_mul_epu32(M0, p->R23.v); - T2 = _mm_add_epi64(T2, T5); - T3 = _mm_add_epi64(T3, T6); - T5 = _mm_mul_epu32(M1, p->R21.v); - T6 = _mm_mul_epu32(M1, p->R22.v); - T2 = _mm_add_epi64(T2, T5); - T3 = _mm_add_epi64(T3, T6); - T5 = _mm_mul_epu32(M2, p->R20.v); - T6 = _mm_mul_epu32(M2, p->R21.v); - T2 = _mm_add_epi64(T2, T5); - T3 = _mm_add_epi64(T3, T6); - T5 = _mm_mul_epu32(M3, p->S24.v); - T6 = _mm_mul_epu32(M3, p->R20.v); - T2 = _mm_add_epi64(T2, T5); - T3 = _mm_add_epi64(T3, T6); - T5 = _mm_mul_epu32(M4, p->S23.v); - T6 = _mm_mul_epu32(M4, p->S24.v); - T2 = _mm_add_epi64(T2, T5); - T3 = _mm_add_epi64(T3, T6); - T5 = _mm_mul_epu32(M0, p->R24.v); - T4 = _mm_add_epi64(T4, T5); - T5 = _mm_mul_epu32(M1, p->R23.v); - T4 = _mm_add_epi64(T4, T5); - T5 = _mm_mul_epu32(M2, p->R22.v); - T4 = _mm_add_epi64(T4, T5); - T5 = _mm_mul_epu32(M3, p->R21.v); - T4 = _mm_add_epi64(T4, T5); - T5 = _mm_mul_epu32(M4, p->R20.v); - T4 = _mm_add_epi64(T4, T5); - - // H += [Mx,My] - T5 = _mm_unpacklo_epi64(_mm_loadl_epi64((const xmmi *)(m + 32)), - _mm_loadl_epi64((const xmmi *)(m + 48))); - T6 = _mm_unpacklo_epi64(_mm_loadl_epi64((const xmmi *)(m + 40)), - _mm_loadl_epi64((const xmmi *)(m + 56))); - M0 = _mm_and_si128(MMASK, T5); - M1 = _mm_and_si128(MMASK, _mm_srli_epi64(T5, 26)); - T5 = _mm_or_si128(_mm_srli_epi64(T5, 52), _mm_slli_epi64(T6, 12)); - M2 = _mm_and_si128(MMASK, T5); - M3 = _mm_and_si128(MMASK, _mm_srli_epi64(T5, 26)); - M4 = _mm_or_si128(_mm_srli_epi64(T6, 40), HIBIT); - - T0 = _mm_add_epi64(T0, M0); - T1 = _mm_add_epi64(T1, M1); - T2 = _mm_add_epi64(T2, M2); - T3 = _mm_add_epi64(T3, M3); - T4 = _mm_add_epi64(T4, M4); - - // reduce - C1 = _mm_srli_epi64(T0, 26); - C2 = _mm_srli_epi64(T3, 26); - T0 = _mm_and_si128(T0, MMASK); - T3 = _mm_and_si128(T3, MMASK); - T1 = _mm_add_epi64(T1, C1); - T4 = _mm_add_epi64(T4, C2); - C1 = _mm_srli_epi64(T1, 26); - C2 = _mm_srli_epi64(T4, 26); - T1 = _mm_and_si128(T1, MMASK); - T4 = _mm_and_si128(T4, MMASK); - T2 = _mm_add_epi64(T2, C1); - T0 = _mm_add_epi64(T0, _mm_mul_epu32(C2, FIVE)); - C1 = _mm_srli_epi64(T2, 26); - C2 = _mm_srli_epi64(T0, 26); - T2 = _mm_and_si128(T2, MMASK); - T0 = _mm_and_si128(T0, MMASK); - T3 = _mm_add_epi64(T3, C1); - T1 = _mm_add_epi64(T1, C2); - C1 = _mm_srli_epi64(T3, 26); - T3 = _mm_and_si128(T3, MMASK); - T4 = _mm_add_epi64(T4, C1); - - // H = (H*[r^4,r^4] + [Mx,My]*[r^2,r^2] + [Mx,My]) - H0 = T0; - H1 = T1; - H2 = T2; - H3 = T3; - H4 = T4; - - m += 64; - bytes -= 64; - } - - st->H[0] = H0; - st->H[1] = H1; - st->H[2] = H2; - st->H[3] = H3; - st->H[4] = H4; -} - -static size_t poly1305_combine(poly1305_state_internal *st, const uint8_t *m, - size_t bytes) { - const xmmi MMASK = _mm_load_si128((const xmmi *)poly1305_x64_sse2_message_mask); - const xmmi HIBIT = _mm_load_si128((const xmmi *)poly1305_x64_sse2_1shl128); - const xmmi FIVE = _mm_load_si128((const xmmi *)poly1305_x64_sse2_5); - - poly1305_power *p; - xmmi H0, H1, H2, H3, H4; - xmmi M0, M1, M2, M3, M4; - xmmi T0, T1, T2, T3, T4, T5, T6; - xmmi C1, C2; - - uint64_t r0, r1, r2; - uint64_t t0, t1, t2, t3, t4; - uint64_t c; - size_t consumed = 0; - - H0 = st->H[0]; - H1 = st->H[1]; - H2 = st->H[2]; - H3 = st->H[3]; - H4 = st->H[4]; - - // p = [r^2,r^2] - p = &st->P[1]; - - if (bytes >= 32) { - // H *= [r^2,r^2] - T0 = _mm_mul_epu32(H0, p->R20.v); - T1 = _mm_mul_epu32(H0, p->R21.v); - T2 = _mm_mul_epu32(H0, p->R22.v); - T3 = _mm_mul_epu32(H0, p->R23.v); - T4 = _mm_mul_epu32(H0, p->R24.v); - T5 = _mm_mul_epu32(H1, p->S24.v); - T6 = _mm_mul_epu32(H1, p->R20.v); - T0 = _mm_add_epi64(T0, T5); - T1 = _mm_add_epi64(T1, T6); - T5 = _mm_mul_epu32(H2, p->S23.v); - T6 = _mm_mul_epu32(H2, p->S24.v); - T0 = _mm_add_epi64(T0, T5); - T1 = _mm_add_epi64(T1, T6); - T5 = _mm_mul_epu32(H3, p->S22.v); - T6 = _mm_mul_epu32(H3, p->S23.v); - T0 = _mm_add_epi64(T0, T5); - T1 = _mm_add_epi64(T1, T6); - T5 = _mm_mul_epu32(H4, p->S21.v); - T6 = _mm_mul_epu32(H4, p->S22.v); - T0 = _mm_add_epi64(T0, T5); - T1 = _mm_add_epi64(T1, T6); - T5 = _mm_mul_epu32(H1, p->R21.v); - T6 = _mm_mul_epu32(H1, p->R22.v); - T2 = _mm_add_epi64(T2, T5); - T3 = _mm_add_epi64(T3, T6); - T5 = _mm_mul_epu32(H2, p->R20.v); - T6 = _mm_mul_epu32(H2, p->R21.v); - T2 = _mm_add_epi64(T2, T5); - T3 = _mm_add_epi64(T3, T6); - T5 = _mm_mul_epu32(H3, p->S24.v); - T6 = _mm_mul_epu32(H3, p->R20.v); - T2 = _mm_add_epi64(T2, T5); - T3 = _mm_add_epi64(T3, T6); - T5 = _mm_mul_epu32(H4, p->S23.v); - T6 = _mm_mul_epu32(H4, p->S24.v); - T2 = _mm_add_epi64(T2, T5); - T3 = _mm_add_epi64(T3, T6); - T5 = _mm_mul_epu32(H1, p->R23.v); - T4 = _mm_add_epi64(T4, T5); - T5 = _mm_mul_epu32(H2, p->R22.v); - T4 = _mm_add_epi64(T4, T5); - T5 = _mm_mul_epu32(H3, p->R21.v); - T4 = _mm_add_epi64(T4, T5); - T5 = _mm_mul_epu32(H4, p->R20.v); - T4 = _mm_add_epi64(T4, T5); - - // H += [Mx,My] - T5 = _mm_unpacklo_epi64(_mm_loadl_epi64((const xmmi *)(m + 0)), - _mm_loadl_epi64((const xmmi *)(m + 16))); - T6 = _mm_unpacklo_epi64(_mm_loadl_epi64((const xmmi *)(m + 8)), - _mm_loadl_epi64((const xmmi *)(m + 24))); - M0 = _mm_and_si128(MMASK, T5); - M1 = _mm_and_si128(MMASK, _mm_srli_epi64(T5, 26)); - T5 = _mm_or_si128(_mm_srli_epi64(T5, 52), _mm_slli_epi64(T6, 12)); - M2 = _mm_and_si128(MMASK, T5); - M3 = _mm_and_si128(MMASK, _mm_srli_epi64(T5, 26)); - M4 = _mm_or_si128(_mm_srli_epi64(T6, 40), HIBIT); - - T0 = _mm_add_epi64(T0, M0); - T1 = _mm_add_epi64(T1, M1); - T2 = _mm_add_epi64(T2, M2); - T3 = _mm_add_epi64(T3, M3); - T4 = _mm_add_epi64(T4, M4); - - // reduce - C1 = _mm_srli_epi64(T0, 26); - C2 = _mm_srli_epi64(T3, 26); - T0 = _mm_and_si128(T0, MMASK); - T3 = _mm_and_si128(T3, MMASK); - T1 = _mm_add_epi64(T1, C1); - T4 = _mm_add_epi64(T4, C2); - C1 = _mm_srli_epi64(T1, 26); - C2 = _mm_srli_epi64(T4, 26); - T1 = _mm_and_si128(T1, MMASK); - T4 = _mm_and_si128(T4, MMASK); - T2 = _mm_add_epi64(T2, C1); - T0 = _mm_add_epi64(T0, _mm_mul_epu32(C2, FIVE)); - C1 = _mm_srli_epi64(T2, 26); - C2 = _mm_srli_epi64(T0, 26); - T2 = _mm_and_si128(T2, MMASK); - T0 = _mm_and_si128(T0, MMASK); - T3 = _mm_add_epi64(T3, C1); - T1 = _mm_add_epi64(T1, C2); - C1 = _mm_srli_epi64(T3, 26); - T3 = _mm_and_si128(T3, MMASK); - T4 = _mm_add_epi64(T4, C1); - - // H = (H*[r^2,r^2] + [Mx,My]) - H0 = T0; - H1 = T1; - H2 = T2; - H3 = T3; - H4 = T4; - - consumed = 32; - } - - // finalize, H *= [r^2,r] - r0 = ((uint64_t)p->R20.d[3] << 32) | (uint64_t)p->R20.d[1]; - r1 = ((uint64_t)p->R21.d[3] << 32) | (uint64_t)p->R21.d[1]; - r2 = ((uint64_t)p->R22.d[3] << 32) | (uint64_t)p->R22.d[1]; - - p->R20.d[2] = (uint32_t)(r0)&0x3ffffff; - p->R21.d[2] = (uint32_t)((r0 >> 26) | (r1 << 18)) & 0x3ffffff; - p->R22.d[2] = (uint32_t)((r1 >> 8)) & 0x3ffffff; - p->R23.d[2] = (uint32_t)((r1 >> 34) | (r2 << 10)) & 0x3ffffff; - p->R24.d[2] = (uint32_t)((r2 >> 16)); - p->S21.d[2] = p->R21.d[2] * 5; - p->S22.d[2] = p->R22.d[2] * 5; - p->S23.d[2] = p->R23.d[2] * 5; - p->S24.d[2] = p->R24.d[2] * 5; - - // H *= [r^2,r] - T0 = _mm_mul_epu32(H0, p->R20.v); - T1 = _mm_mul_epu32(H0, p->R21.v); - T2 = _mm_mul_epu32(H0, p->R22.v); - T3 = _mm_mul_epu32(H0, p->R23.v); - T4 = _mm_mul_epu32(H0, p->R24.v); - T5 = _mm_mul_epu32(H1, p->S24.v); - T6 = _mm_mul_epu32(H1, p->R20.v); - T0 = _mm_add_epi64(T0, T5); - T1 = _mm_add_epi64(T1, T6); - T5 = _mm_mul_epu32(H2, p->S23.v); - T6 = _mm_mul_epu32(H2, p->S24.v); - T0 = _mm_add_epi64(T0, T5); - T1 = _mm_add_epi64(T1, T6); - T5 = _mm_mul_epu32(H3, p->S22.v); - T6 = _mm_mul_epu32(H3, p->S23.v); - T0 = _mm_add_epi64(T0, T5); - T1 = _mm_add_epi64(T1, T6); - T5 = _mm_mul_epu32(H4, p->S21.v); - T6 = _mm_mul_epu32(H4, p->S22.v); - T0 = _mm_add_epi64(T0, T5); - T1 = _mm_add_epi64(T1, T6); - T5 = _mm_mul_epu32(H1, p->R21.v); - T6 = _mm_mul_epu32(H1, p->R22.v); - T2 = _mm_add_epi64(T2, T5); - T3 = _mm_add_epi64(T3, T6); - T5 = _mm_mul_epu32(H2, p->R20.v); - T6 = _mm_mul_epu32(H2, p->R21.v); - T2 = _mm_add_epi64(T2, T5); - T3 = _mm_add_epi64(T3, T6); - T5 = _mm_mul_epu32(H3, p->S24.v); - T6 = _mm_mul_epu32(H3, p->R20.v); - T2 = _mm_add_epi64(T2, T5); - T3 = _mm_add_epi64(T3, T6); - T5 = _mm_mul_epu32(H4, p->S23.v); - T6 = _mm_mul_epu32(H4, p->S24.v); - T2 = _mm_add_epi64(T2, T5); - T3 = _mm_add_epi64(T3, T6); - T5 = _mm_mul_epu32(H1, p->R23.v); - T4 = _mm_add_epi64(T4, T5); - T5 = _mm_mul_epu32(H2, p->R22.v); - T4 = _mm_add_epi64(T4, T5); - T5 = _mm_mul_epu32(H3, p->R21.v); - T4 = _mm_add_epi64(T4, T5); - T5 = _mm_mul_epu32(H4, p->R20.v); - T4 = _mm_add_epi64(T4, T5); - - C1 = _mm_srli_epi64(T0, 26); - C2 = _mm_srli_epi64(T3, 26); - T0 = _mm_and_si128(T0, MMASK); - T3 = _mm_and_si128(T3, MMASK); - T1 = _mm_add_epi64(T1, C1); - T4 = _mm_add_epi64(T4, C2); - C1 = _mm_srli_epi64(T1, 26); - C2 = _mm_srli_epi64(T4, 26); - T1 = _mm_and_si128(T1, MMASK); - T4 = _mm_and_si128(T4, MMASK); - T2 = _mm_add_epi64(T2, C1); - T0 = _mm_add_epi64(T0, _mm_mul_epu32(C2, FIVE)); - C1 = _mm_srli_epi64(T2, 26); - C2 = _mm_srli_epi64(T0, 26); - T2 = _mm_and_si128(T2, MMASK); - T0 = _mm_and_si128(T0, MMASK); - T3 = _mm_add_epi64(T3, C1); - T1 = _mm_add_epi64(T1, C2); - C1 = _mm_srli_epi64(T3, 26); - T3 = _mm_and_si128(T3, MMASK); - T4 = _mm_add_epi64(T4, C1); - - // H = H[0]+H[1] - H0 = _mm_add_epi64(T0, _mm_srli_si128(T0, 8)); - H1 = _mm_add_epi64(T1, _mm_srli_si128(T1, 8)); - H2 = _mm_add_epi64(T2, _mm_srli_si128(T2, 8)); - H3 = _mm_add_epi64(T3, _mm_srli_si128(T3, 8)); - H4 = _mm_add_epi64(T4, _mm_srli_si128(T4, 8)); - - t0 = _mm_cvtsi128_si32(H0); - c = (t0 >> 26); - t0 &= 0x3ffffff; - t1 = _mm_cvtsi128_si32(H1) + c; - c = (t1 >> 26); - t1 &= 0x3ffffff; - t2 = _mm_cvtsi128_si32(H2) + c; - c = (t2 >> 26); - t2 &= 0x3ffffff; - t3 = _mm_cvtsi128_si32(H3) + c; - c = (t3 >> 26); - t3 &= 0x3ffffff; - t4 = _mm_cvtsi128_si32(H4) + c; - c = (t4 >> 26); - t4 &= 0x3ffffff; - t0 = t0 + (c * 5); - c = (t0 >> 26); - t0 &= 0x3ffffff; - t1 = t1 + c; - - st->HH[0] = ((t0) | (t1 << 26)) & UINT64_C(0xfffffffffff); - st->HH[1] = ((t1 >> 18) | (t2 << 8) | (t3 << 34)) & UINT64_C(0xfffffffffff); - st->HH[2] = ((t3 >> 10) | (t4 << 16)) & UINT64_C(0x3ffffffffff); - - return consumed; -} - -void GFp_poly1305_update(poly1305_state *state, const uint8_t *m, - size_t bytes) { - poly1305_state_internal *st = poly1305_aligned_state(state); - size_t want; - - // Work around a C language bug. See https://crbug.com/1019588. - if (bytes == 0) { - return; - } - - // need at least 32 initial bytes to start the accelerated branch - if (!st->started) { - if ((st->leftover == 0) && (bytes > 32)) { - poly1305_first_block(st, m); - m += 32; - bytes -= 32; - } else { - want = poly1305_min(32 - st->leftover, bytes); - GFp_memcpy(st->buffer + st->leftover, m, want); - bytes -= want; - m += want; - st->leftover += want; - if ((st->leftover < 32) || (bytes == 0)) { - return; - } - poly1305_first_block(st, st->buffer); - st->leftover = 0; - } - st->started = 1; - } - - // handle leftover - if (st->leftover) { - want = poly1305_min(64 - st->leftover, bytes); - GFp_memcpy(st->buffer + st->leftover, m, want); - bytes -= want; - m += want; - st->leftover += want; - if (st->leftover < 64) { - return; - } - poly1305_blocks(st, st->buffer, 64); - st->leftover = 0; - } - - // process 64 byte blocks - if (bytes >= 64) { - want = (bytes & ~63); - poly1305_blocks(st, m, want); - m += want; - bytes -= want; - } - - if (bytes) { - GFp_memcpy(st->buffer + st->leftover, m, bytes); - st->leftover += bytes; - } -} - -void GFp_poly1305_finish(poly1305_state *state, uint8_t mac[16]) { - poly1305_state_internal *st = poly1305_aligned_state(state); - size_t leftover = st->leftover; - uint8_t *m = st->buffer; - uint128_t d[3]; - uint64_t h0, h1, h2; - uint64_t t0, t1; - uint64_t g0, g1, g2, c, nc; - uint64_t r0, r1, r2, s1, s2; - poly1305_power *p; - - if (st->started) { - size_t consumed = poly1305_combine(st, m, leftover); - leftover -= consumed; - m += consumed; - } - - // st->HH will either be 0 or have the combined result - h0 = st->HH[0]; - h1 = st->HH[1]; - h2 = st->HH[2]; - - p = &st->P[1]; - r0 = ((uint64_t)p->R20.d[3] << 32) | (uint64_t)p->R20.d[1]; - r1 = ((uint64_t)p->R21.d[3] << 32) | (uint64_t)p->R21.d[1]; - r2 = ((uint64_t)p->R22.d[3] << 32) | (uint64_t)p->R22.d[1]; - s1 = r1 * (5 << 2); - s2 = r2 * (5 << 2); - - if (leftover < 16) { - goto poly1305_donna_atmost15bytes; - } - -poly1305_donna_atleast16bytes: - t0 = load_u64_le(m + 0); - t1 = load_u64_le(m + 8); - h0 += t0 & 0xfffffffffff; - t0 = shr128_pair(t1, t0, 44); - h1 += t0 & 0xfffffffffff; - h2 += (t1 >> 24) | ((uint64_t)1 << 40); - -poly1305_donna_mul: - d[0] = add128(add128(mul64x64_128(h0, r0), mul64x64_128(h1, s2)), - mul64x64_128(h2, s1)); - d[1] = add128(add128(mul64x64_128(h0, r1), mul64x64_128(h1, r0)), - mul64x64_128(h2, s2)); - d[2] = add128(add128(mul64x64_128(h0, r2), mul64x64_128(h1, r1)), - mul64x64_128(h2, r0)); - h0 = lo128(d[0]) & 0xfffffffffff; - c = shr128(d[0], 44); - d[1] = add128_64(d[1], c); - h1 = lo128(d[1]) & 0xfffffffffff; - c = shr128(d[1], 44); - d[2] = add128_64(d[2], c); - h2 = lo128(d[2]) & 0x3ffffffffff; - c = shr128(d[2], 42); - h0 += c * 5; - - m += 16; - leftover -= 16; - if (leftover >= 16) { - goto poly1305_donna_atleast16bytes; - } - -// final bytes -poly1305_donna_atmost15bytes: - if (!leftover) { - goto poly1305_donna_finish; - } - - m[leftover++] = 1; - GFp_memset(m + leftover, 0, 16 - leftover); - leftover = 16; - - t0 = load_u64_le(m + 0); - t1 = load_u64_le(m + 8); - h0 += t0 & 0xfffffffffff; - t0 = shr128_pair(t1, t0, 44); - h1 += t0 & 0xfffffffffff; - h2 += (t1 >> 24); - - goto poly1305_donna_mul; - -poly1305_donna_finish: - c = (h0 >> 44); - h0 &= 0xfffffffffff; - h1 += c; - c = (h1 >> 44); - h1 &= 0xfffffffffff; - h2 += c; - c = (h2 >> 42); - h2 &= 0x3ffffffffff; - h0 += c * 5; - - g0 = h0 + 5; - c = (g0 >> 44); - g0 &= 0xfffffffffff; - g1 = h1 + c; - c = (g1 >> 44); - g1 &= 0xfffffffffff; - g2 = h2 + c - ((uint64_t)1 << 42); - - c = (g2 >> 63) - 1; - nc = ~c; - h0 = (h0 & nc) | (g0 & c); - h1 = (h1 & nc) | (g1 & c); - h2 = (h2 & nc) | (g2 & c); - - // pad - t0 = ((uint64_t)p->R23.d[3] << 32) | (uint64_t)p->R23.d[1]; - t1 = ((uint64_t)p->R24.d[3] << 32) | (uint64_t)p->R24.d[1]; - h0 += (t0 & 0xfffffffffff); - c = (h0 >> 44); - h0 &= 0xfffffffffff; - t0 = shr128_pair(t1, t0, 44); - h1 += (t0 & 0xfffffffffff) + c; - c = (h1 >> 44); - h1 &= 0xfffffffffff; - t1 = (t1 >> 24); - h2 += (t1)+c; - - store_u64_le(mac + 0, ((h0) | (h1 << 44))); - store_u64_le(mac + 8, ((h1 >> 20) | (h2 << 24))); -} - -#endif // BORINGSSL_HAS_UINT128 && OPENSSL_X86_64 diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/doc/link-to-readme.md temporalio-1.3.0/vendor/ring-0.16.20/doc/link-to-readme.md --- temporalio-1.3.0/vendor/ring-0.16.20/doc/link-to-readme.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/doc/link-to-readme.md 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -See https://github.com/briansmith/ring. diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/include/GFp/aes.h temporalio-1.3.0/vendor/ring-0.16.20/include/GFp/aes.h --- temporalio-1.3.0/vendor/ring-0.16.20/include/GFp/aes.h 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/include/GFp/aes.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,68 +0,0 @@ -/* ==================================================================== - * Copyright (c) 2002-2006 The OpenSSL Project. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. All advertising materials mentioning features or use of this - * software must display the following acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" - * - * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to - * endorse or promote products derived from this software without - * prior written permission. For written permission, please contact - * openssl-core@openssl.org. - * - * 5. Products derived from this software may not be called "OpenSSL" - * nor may "OpenSSL" appear in their names without prior written - * permission of the OpenSSL Project. - * - * 6. Redistributions of any form whatsoever must retain the following - * acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit (http://www.openssl.org/)" - * - * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY - * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * ==================================================================== */ - -#ifndef OPENSSL_HEADER_AES_H -#define OPENSSL_HEADER_AES_H - -#include - -// Raw AES functions. - - -// AES_MAXNR is the maximum number of AES rounds. -#define AES_MAXNR 14 - -// aes_key_st should be an opaque type, but EVP requires that the size be -// known. -struct aes_key_st { - uint32_t rd_key[4 * (AES_MAXNR + 1)]; - unsigned rounds; -}; -typedef struct aes_key_st AES_KEY; - -#endif // OPENSSL_HEADER_AES_H diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/include/GFp/arm_arch.h temporalio-1.3.0/vendor/ring-0.16.20/include/GFp/arm_arch.h --- temporalio-1.3.0/vendor/ring-0.16.20/include/GFp/arm_arch.h 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/include/GFp/arm_arch.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,177 +0,0 @@ -/* ==================================================================== - * Copyright (c) 1998-2011 The OpenSSL Project. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. All advertising materials mentioning features or use of this - * software must display the following acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" - * - * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to - * endorse or promote products derived from this software without - * prior written permission. For written permission, please contact - * openssl-core@openssl.org. - * - * 5. Products derived from this software may not be called "OpenSSL" - * nor may "OpenSSL" appear in their names without prior written - * permission of the OpenSSL Project. - * - * 6. Redistributions of any form whatsoever must retain the following - * acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit (http://www.openssl.org/)" - * - * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY - * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * ==================================================================== - * - * This product includes cryptographic software written by Eric Young - * (eay@cryptsoft.com). This product includes software written by Tim - * Hudson (tjh@cryptsoft.com). */ - -#ifndef OPENSSL_HEADER_ARM_ARCH_H -#define OPENSSL_HEADER_ARM_ARCH_H - -#if !defined(__ARM_ARCH__) -# if defined(__CC_ARM) -# define __ARM_ARCH__ __TARGET_ARCH_ARM -# if defined(__BIG_ENDIAN) -# define __ARMEB__ -# else -# define __ARMEL__ -# endif -# elif defined(__GNUC__) -# if defined(__aarch64__) -# define __ARM_ARCH__ 8 -# if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ -# define __ARMEB__ -# else -# define __ARMEL__ -# endif - // Why doesn't gcc define __ARM_ARCH__? Instead it defines - // bunch of below macros. See all_architectires[] table in - // gcc/config/arm/arm.c. On a side note it defines - // __ARMEL__/__ARMEB__ for little-/big-endian. -# elif defined(__ARM_ARCH) -# define __ARM_ARCH__ __ARM_ARCH -# elif defined(__ARM_ARCH_8A__) -# define __ARM_ARCH__ 8 -# elif defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || \ - defined(__ARM_ARCH_7R__)|| defined(__ARM_ARCH_7M__) || \ - defined(__ARM_ARCH_7EM__) -# define __ARM_ARCH__ 7 -# elif defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || \ - defined(__ARM_ARCH_6K__)|| defined(__ARM_ARCH_6M__) || \ - defined(__ARM_ARCH_6Z__)|| defined(__ARM_ARCH_6ZK__) || \ - defined(__ARM_ARCH_6T2__) -# define __ARM_ARCH__ 6 -# elif defined(__ARM_ARCH_5__) || defined(__ARM_ARCH_5T__) || \ - defined(__ARM_ARCH_5E__)|| defined(__ARM_ARCH_5TE__) || \ - defined(__ARM_ARCH_5TEJ__) -# define __ARM_ARCH__ 5 -# elif defined(__ARM_ARCH_4__) || defined(__ARM_ARCH_4T__) -# define __ARM_ARCH__ 4 -# else -# error "unsupported ARM architecture" -# endif -# endif -#endif - -// Even when building for 32-bit ARM, support for aarch64 crypto instructions -// will be included. -#if !defined(__ARM_MAX_ARCH__) -#define __ARM_MAX_ARCH__ 8 -#endif - -// ARMV7_NEON is true when a NEON unit is present in the current CPU. -#define ARMV7_NEON (1 << 0) - -// ARMV8_SHA256 indicates support for hardware SHA-256 instructions. -#define ARMV8_SHA256 (1 << 4) - -#if defined(__ASSEMBLER__) - -#if defined(__GNUC__) -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wundef" -#endif - -// Support macros for -// - Armv8.3-A Pointer Authentication and -// - Armv8.5-A Branch Target Identification -// features which require emitting a .note.gnu.property section with the -// appropriate architecture-dependent feature bits set. -// Read more: "ELF for the Arm® 64-bit Architecture" - -#if defined(__ARM_FEATURE_BTI_DEFAULT) && __ARM_FEATURE_BTI_DEFAULT == 1 -#define GNU_PROPERTY_AARCH64_BTI (1 << 0) // Has Branch Target Identification -#define AARCH64_VALID_CALL_TARGET hint #34 // BTI 'c' -#else -#define GNU_PROPERTY_AARCH64_BTI 0 // No Branch Target Identification -#define AARCH64_VALID_CALL_TARGET -#endif - -#if defined(__ARM_FEATURE_PAC_DEFAULT) && \ - (__ARM_FEATURE_PAC_DEFAULT & 1) == 1 // Signed with A-key -#define GNU_PROPERTY_AARCH64_POINTER_AUTH \ - (1 << 1) // Has Pointer Authentication -#define AARCH64_SIGN_LINK_REGISTER hint #25 // PACIASP -#define AARCH64_VALIDATE_LINK_REGISTER hint #29 // AUTIASP -#elif defined(__ARM_FEATURE_PAC_DEFAULT) && \ - (__ARM_FEATURE_PAC_DEFAULT & 2) == 2 // Signed with B-key -#define GNU_PROPERTY_AARCH64_POINTER_AUTH \ - (1 << 1) // Has Pointer Authentication -#define AARCH64_SIGN_LINK_REGISTER hint #27 // PACIBSP -#define AARCH64_VALIDATE_LINK_REGISTER hint #31 // AUTIBSP -#else -#define GNU_PROPERTY_AARCH64_POINTER_AUTH 0 // No Pointer Authentication -#if GNU_PROPERTY_AARCH64_BTI != 0 -#define AARCH64_SIGN_LINK_REGISTER AARCH64_VALID_CALL_TARGET -#else -#define AARCH64_SIGN_LINK_REGISTER -#endif -#define AARCH64_VALIDATE_LINK_REGISTER -#endif - -#if GNU_PROPERTY_AARCH64_POINTER_AUTH != 0 || GNU_PROPERTY_AARCH64_BTI != 0 -.pushsection .note.gnu.property, "a"; -.balign 8; -.long 4; -.long 0x10; -.long 0x5; -.asciz "GNU"; -.long 0xc0000000; /* GNU_PROPERTY_AARCH64_FEATURE_1_AND */ -.long 4; -.long (GNU_PROPERTY_AARCH64_POINTER_AUTH | GNU_PROPERTY_AARCH64_BTI); -.long 0; -.popsection; -#endif - -#if defined(__GNUC__) -#pragma GCC diagnostic pop -#endif - -#endif /* defined __ASSEMBLER__ */ - -#endif // OPENSSL_HEADER_ARM_ARCH_H diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/include/GFp/base.h temporalio-1.3.0/vendor/ring-0.16.20/include/GFp/base.h --- temporalio-1.3.0/vendor/ring-0.16.20/include/GFp/base.h 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/include/GFp/base.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,121 +0,0 @@ -/* ==================================================================== - * Copyright (c) 1998-2001 The OpenSSL Project. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. All advertising materials mentioning features or use of this - * software must display the following acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" - * - * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to - * endorse or promote products derived from this software without - * prior written permission. For written permission, please contact - * openssl-core@openssl.org. - * - * 5. Products derived from this software may not be called "OpenSSL" - * nor may "OpenSSL" appear in their names without prior written - * permission of the OpenSSL Project. - * - * 6. Redistributions of any form whatsoever must retain the following - * acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit (http://www.openssl.org/)" - * - * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY - * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * ==================================================================== - * - * This product includes cryptographic software written by Eric Young - * (eay@cryptsoft.com). This product includes software written by Tim - * Hudson (tjh@cryptsoft.com). */ - -#ifndef OPENSSL_HEADER_BASE_H -#define OPENSSL_HEADER_BASE_H - - -// This file should be the first included by all BoringSSL headers. - -#include - -#if defined(_MSC_VER) && !defined(__clang__) -#pragma warning(push, 3) -#endif - -#include -#include - -#if defined(_MSC_VER) && !defined(__clang__) -#pragma warning(pop) -#endif - -#if defined(__x86_64) || defined(_M_AMD64) || defined(_M_X64) -#define OPENSSL_64_BIT -#define OPENSSL_X86_64 -#elif defined(__x86) || defined(__i386) || defined(__i386__) || defined(_M_IX86) -#define OPENSSL_32_BIT -#define OPENSSL_X86 -#elif defined(__AARCH64EL__) || defined(_M_ARM64) -#define OPENSSL_64_BIT -#define OPENSSL_AARCH64 -#elif defined(__ARMEL__) || defined(_M_ARM) -#define OPENSSL_32_BIT -#define OPENSSL_ARM -#elif defined(__MIPSEL__) && !defined(__LP64__) -#define OPENSSL_32_BIT -#define OPENSSL_MIPS -#elif defined(__MIPSEL__) && defined(__LP64__) -#define OPENSSL_64_BIT -#define OPENSSL_MIPS64 -#elif defined(__wasm__) -#define OPENSSL_32_BIT -#else -// Note BoringSSL only supports standard 32-bit and 64-bit two's-complement, -// little-endian architectures. Functions will not produce the correct answer -// on other systems. Run the crypto_test binary, notably -// crypto/compiler_test.cc, before adding a new architecture. -#error "Unknown target CPU" -#endif - -#if defined(__APPLE__) -#define OPENSSL_APPLE -#endif - -#if defined(_WIN32) -#define OPENSSL_WINDOWS -#endif - -// *ring* doesn't support the `BORINGSSL_SHARED_LIBRARY` configuration, so -// the default (usually "hidden") visibility is always used, even for exported -// items. -#define OPENSSL_EXPORT - -// `ring::c` would need to be customized on any platform where these assertions -// fail. Keep in sync with `ring::c`. -OPENSSL_STATIC_ASSERT(sizeof(int32_t) == sizeof(int), "int isn't 32 bits."); -OPENSSL_STATIC_ASSERT(sizeof(uint32_t) == sizeof(unsigned int), "unsigned int isn't 32 bits."); -OPENSSL_STATIC_ASSERT(sizeof(size_t) == sizeof(uintptr_t), "uintptr_t and size_t differ."); -OPENSSL_STATIC_ASSERT(sizeof(size_t) <= sizeof(uint64_t), "size_t is larger than uint64_t."); -OPENSSL_STATIC_ASSERT(sizeof(size_t) >= sizeof(uint32_t), "size_t is smaller than uint32_t."); - -#endif // OPENSSL_HEADER_BASE_H diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/include/GFp/check.h temporalio-1.3.0/vendor/ring-0.16.20/include/GFp/check.h --- temporalio-1.3.0/vendor/ring-0.16.20/include/GFp/check.h 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/include/GFp/check.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,52 +0,0 @@ -// Copyright 2020 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -#ifndef RING_CHECK_H -#define RING_CHECK_H - -// |debug_assert_nonsecret| is like |assert| and should be used (only) when the -// assertion does not have any potential to leak a secret. |NDEBUG| controls this -// exactly like |assert|. It is emulated when there is no assert.h to make -// cross-building easier. -// -// When reviewing uses of |debug_assert_nonsecret|, verify that the check -// really does not have potential to leak a secret. - -#if !defined(GFp_NOSTDLIBINC) -# include -# define debug_assert_nonsecret(x) assert(x) -#else -# if !defined(NDEBUG) -# define debug_assert_nonsecret(x) ((x) ? ((void)0) : __builtin_trap()) -# else -# define debug_assert_nonsecret(x) ((void)0) -# endif -#endif - -// |dev_assert_secret| is like |assert| and should be used (only) when the -// assertion operates on secret data in a way that has the potential to leak -// the secret. |dev_assert_secret| can only be enabled by changing the |#if 0| -// here to |#if 1| (or equivalent) when |NDEBUG| is not defined. This is not -// controlled only through |NDEBUG| so that such checks do not leak into debug -// builds that may make it into production use. -// -// When reviewing uses of |dev_assert_secret|, verify that the check really -// does have the potential to leak a secret. -#if 0 // DO NOT COMMIT CHANGES TO THIS LINE. -# define dev_assert_secret debug_assert_nonsecret -#else -# define dev_assert_secret(x) ((void)0) -#endif - -#endif // RING_CHECK_H diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/include/GFp/cpu.h temporalio-1.3.0/vendor/ring-0.16.20/include/GFp/cpu.h --- temporalio-1.3.0/vendor/ring-0.16.20/include/GFp/cpu.h 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/include/GFp/cpu.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,92 +0,0 @@ -/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) - * All rights reserved. - * - * This package is an SSL implementation written - * by Eric Young (eay@cryptsoft.com). - * The implementation was written so as to conform with Netscapes SSL. - * - * This library is free for commercial and non-commercial use as long as - * the following conditions are aheared to. The following conditions - * apply to all code found in this distribution, be it the RC4, RSA, - * lhash, DES, etc., code; not just the SSL code. The SSL documentation - * included with this distribution is covered by the same copyright terms - * except that the holder is Tim Hudson (tjh@cryptsoft.com). - * - * Copyright remains Eric Young's, and as such any Copyright notices in - * the code are not to be removed. - * If this package is used in a product, Eric Young should be given attribution - * as the author of the parts of the library used. - * This can be in the form of a textual message at program startup or - * in documentation (online or textual) provided with the package. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * "This product includes cryptographic software written by - * Eric Young (eay@cryptsoft.com)" - * The word 'cryptographic' can be left out if the rouines from the library - * being used are not cryptographic related :-). - * 4. If you include any Windows specific code (or a derivative thereof) from - * the apps directory (application code) you must include an acknowledgement: - * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" - * - * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * The licence and distribution terms for any publically available version or - * derivative of this code cannot be changed. i.e. this code cannot simply be - * copied and put under another distribution licence - * [including the GNU Public Licence.] - * - * This product includes cryptographic software written by Eric Young - * (eay@cryptsoft.com). This product includes software written by Tim - * Hudson (tjh@cryptsoft.com). */ - -#ifndef OPENSSL_HEADER_CPU_H -#define OPENSSL_HEADER_CPU_H - -#include - -// Runtime CPU feature support - - -#if defined(OPENSSL_X86) || defined(OPENSSL_X86_64) -// GFp_ia32cap_P contains the Intel CPUID bits when running on an x86 or -// x86-64 system. -// -// Index 0: -// EDX for CPUID where EAX = 1 -// Bit 20 is always zero -// Bit 28 is adjusted to reflect whether the data cache is shared between -// multiple logical cores -// Bit 30 is used to indicate an Intel CPU -// Index 1: -// ECX for CPUID where EAX = 1 -// Bit 11 is used to indicate AMD XOP support, not SDBG -// Index 2: -// EBX for CPUID where EAX = 7 -// Index 3: -// ECX for CPUID where EAX = 7 -// -// Note: the CPUID bits are pre-adjusted for the OSXSAVE bit and the YMM and XMM -// bits in XCR0, so it is not necessary to check those. -extern uint32_t GFp_ia32cap_P[4]; -#endif - -#endif // OPENSSL_HEADER_CPU_H diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/include/GFp/mem.h temporalio-1.3.0/vendor/ring-0.16.20/include/GFp/mem.h --- temporalio-1.3.0/vendor/ring-0.16.20/include/GFp/mem.h 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/include/GFp/mem.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,69 +0,0 @@ -/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) - * All rights reserved. - * - * This package is an SSL implementation written - * by Eric Young (eay@cryptsoft.com). - * The implementation was written so as to conform with Netscapes SSL. - * - * This library is free for commercial and non-commercial use as long as - * the following conditions are aheared to. The following conditions - * apply to all code found in this distribution, be it the RC4, RSA, - * lhash, DES, etc., code; not just the SSL code. The SSL documentation - * included with this distribution is covered by the same copyright terms - * except that the holder is Tim Hudson (tjh@cryptsoft.com). - * - * Copyright remains Eric Young's, and as such any Copyright notices in - * the code are not to be removed. - * If this package is used in a product, Eric Young should be given attribution - * as the author of the parts of the library used. - * This can be in the form of a textual message at program startup or - * in documentation (online or textual) provided with the package. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * "This product includes cryptographic software written by - * Eric Young (eay@cryptsoft.com)" - * The word 'cryptographic' can be left out if the rouines from the library - * being used are not cryptographic related :-). - * 4. If you include any Windows specific code (or a derivative thereof) from - * the apps directory (application code) you must include an acknowledgement: - * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" - * - * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * The licence and distribution terms for any publically available version or - * derivative of this code cannot be changed. i.e. this code cannot simply be - * copied and put under another distribution licence - * [including the GNU Public Licence.] */ - -#ifndef OPENSSL_HEADER_MEM_H -#define OPENSSL_HEADER_MEM_H - -#include - -// GFp_memcmp returns zero iff the |len| bytes at |a| and |b| are equal. It -// takes an amount of time dependent on |len|, but independent of the contents -// of |a| and |b|. Unlike memcmp, it cannot be used to put elements into a -// defined order as the return value when a != b is undefined, other than to be -// non-zero. -OPENSSL_EXPORT int GFp_memcmp(const uint8_t *a, const uint8_t *b, size_t len); - -#endif // OPENSSL_HEADER_MEM_H diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/include/GFp/poly1305.h temporalio-1.3.0/vendor/ring-0.16.20/include/GFp/poly1305.h --- temporalio-1.3.0/vendor/ring-0.16.20/include/GFp/poly1305.h 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/include/GFp/poly1305.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,23 +0,0 @@ -/* Copyright (c) 2014, Google Inc. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY - * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION - * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ - -#ifndef OPENSSL_HEADER_POLY1305_H -#define OPENSSL_HEADER_POLY1305_H - -#include - -// Keep in sync with `poly1305_state` in poly1305.rs. -typedef uint8_t poly1305_state[512]; - -#endif // OPENSSL_HEADER_POLY1305_H diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/include/GFp/type_check.h temporalio-1.3.0/vendor/ring-0.16.20/include/GFp/type_check.h --- temporalio-1.3.0/vendor/ring-0.16.20/include/GFp/type_check.h 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/include/GFp/type_check.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,75 +0,0 @@ -/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) - * All rights reserved. - * - * This package is an SSL implementation written - * by Eric Young (eay@cryptsoft.com). - * The implementation was written so as to conform with Netscapes SSL. - * - * This library is free for commercial and non-commercial use as long as - * the following conditions are aheared to. The following conditions - * apply to all code found in this distribution, be it the RC4, RSA, - * lhash, DES, etc., code; not just the SSL code. The SSL documentation - * included with this distribution is covered by the same copyright terms - * except that the holder is Tim Hudson (tjh@cryptsoft.com). - * - * Copyright remains Eric Young's, and as such any Copyright notices in - * the code are not to be removed. - * If this package is used in a product, Eric Young should be given attribution - * as the author of the parts of the library used. - * This can be in the form of a textual message at program startup or - * in documentation (online or textual) provided with the package. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * "This product includes cryptographic software written by - * Eric Young (eay@cryptsoft.com)" - * The word 'cryptographic' can be left out if the rouines from the library - * being used are not cryptographic related :-). - * 4. If you include any Windows specific code (or a derivative thereof) from - * the apps directory (application code) you must include an acknowledgement: - * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" - * - * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * The licence and distribution terms for any publically available version or - * derivative of this code cannot be changed. i.e. this code cannot simply be - * copied and put under another distribution licence - * [including the GNU Public Licence.] */ - -#ifndef OPENSSL_HEADER_TYPE_CHECK_H -#define OPENSSL_HEADER_TYPE_CHECK_H - -#include - - -#if defined(__cplusplus) || (defined(_MSC_VER) && !defined(__clang__)) -// In C++ and non-clang MSVC, |static_assert| is a keyword. -#define OPENSSL_STATIC_ASSERT(cond, msg) static_assert(cond, msg) -#else -// C11 defines the |_Static_assert| keyword and the |static_assert| macro in -// assert.h. While the former is available at all versions in Clang and GCC, the -// later depends on libc and, in glibc, depends on being built in C11 mode. We -// do not require this, for now, so use |_Static_assert| directly. -#define OPENSSL_STATIC_ASSERT(cond, msg) _Static_assert(cond, msg) -#endif - - -#endif // OPENSSL_HEADER_TYPE_CHECK_H diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/LICENSE temporalio-1.3.0/vendor/ring-0.16.20/LICENSE --- temporalio-1.3.0/vendor/ring-0.16.20/LICENSE 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/LICENSE 1970-01-01 00:00:00.000000000 +0000 @@ -1,204 +0,0 @@ -Note that it is easy for this file to get out of sync with the licenses in the -source code files. It's recommended to compare the licenses in the source code -with what's mentioned here. - -*ring* is derived from BoringSSL, so the licensing situation in *ring* is -similar to BoringSSL. - -*ring* uses an ISC-style license like BoringSSL for code in new files, -including in particular all the Rust code: - - Copyright 2015-2016 Brian Smith. - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY - SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION - OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -BoringSSL is a fork of OpenSSL. As such, large parts of it fall under OpenSSL -licensing. Files that are completely new have a Google copyright and an ISC -license. This license is reproduced at the bottom of this file. - -Contributors to BoringSSL are required to follow the CLA rules for Chromium: -https://cla.developers.google.com/clas - -Files in third_party/ have their own licenses, as described therein. The MIT -license, for third_party/fiat, which, unlike other third_party directories, is -compiled into non-test libraries, is included below. - -The OpenSSL toolkit stays under a dual license, i.e. both the conditions of the -OpenSSL License and the original SSLeay license apply to the toolkit. See below -for the actual license texts. Actually both licenses are BSD-style Open Source -licenses. In case of any license issues related to OpenSSL please contact -openssl-core@openssl.org. - -The following are Google-internal bug numbers where explicit permission from -some authors is recorded for use of their work: - 27287199 - 27287880 - 27287883 - - OpenSSL License - --------------- - -/* ==================================================================== - * Copyright (c) 1998-2011 The OpenSSL Project. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. All advertising materials mentioning features or use of this - * software must display the following acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" - * - * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to - * endorse or promote products derived from this software without - * prior written permission. For written permission, please contact - * openssl-core@openssl.org. - * - * 5. Products derived from this software may not be called "OpenSSL" - * nor may "OpenSSL" appear in their names without prior written - * permission of the OpenSSL Project. - * - * 6. Redistributions of any form whatsoever must retain the following - * acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit (http://www.openssl.org/)" - * - * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY - * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * ==================================================================== - * - * This product includes cryptographic software written by Eric Young - * (eay@cryptsoft.com). This product includes software written by Tim - * Hudson (tjh@cryptsoft.com). - * - */ - - Original SSLeay License - ----------------------- - -/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) - * All rights reserved. - * - * This package is an SSL implementation written - * by Eric Young (eay@cryptsoft.com). - * The implementation was written so as to conform with Netscapes SSL. - * - * This library is free for commercial and non-commercial use as long as - * the following conditions are aheared to. The following conditions - * apply to all code found in this distribution, be it the RC4, RSA, - * lhash, DES, etc., code; not just the SSL code. The SSL documentation - * included with this distribution is covered by the same copyright terms - * except that the holder is Tim Hudson (tjh@cryptsoft.com). - * - * Copyright remains Eric Young's, and as such any Copyright notices in - * the code are not to be removed. - * If this package is used in a product, Eric Young should be given attribution - * as the author of the parts of the library used. - * This can be in the form of a textual message at program startup or - * in documentation (online or textual) provided with the package. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * "This product includes cryptographic software written by - * Eric Young (eay@cryptsoft.com)" - * The word 'cryptographic' can be left out if the rouines from the library - * being used are not cryptographic related :-). - * 4. If you include any Windows specific code (or a derivative thereof) from - * the apps directory (application code) you must include an acknowledgement: - * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" - * - * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * The licence and distribution terms for any publically available version or - * derivative of this code cannot be changed. i.e. this code cannot simply be - * copied and put under another distribution licence - * [including the GNU Public Licence.] - */ - - -ISC license used for completely new code in BoringSSL: - -/* Copyright (c) 2015, Google Inc. - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY - * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION - * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ - - -The code in third_party/fiat carries the MIT license: - -Copyright (c) 2015-2016 the fiat-crypto authors (see -https://github.com/mit-plv/fiat-crypto/blob/master/AUTHORS). - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/aesni-gcm-x86_64-elf.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/aesni-gcm-x86_64-elf.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/aesni-gcm-x86_64-elf.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/aesni-gcm-x86_64-elf.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,844 +0,0 @@ -# This file is generated from a similarly-named Perl script in the BoringSSL -# source tree. Do not edit by hand. - -#if defined(__has_feature) -#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) -#define OPENSSL_NO_ASM -#endif -#endif - -#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) -.text - -.type _aesni_ctr32_ghash_6x,@function -.align 32 -_aesni_ctr32_ghash_6x: -.cfi_startproc - vmovdqu 32(%r11),%xmm2 - subq $6,%rdx - vpxor %xmm4,%xmm4,%xmm4 - vmovdqu 0-128(%rcx),%xmm15 - vpaddb %xmm2,%xmm1,%xmm10 - vpaddb %xmm2,%xmm10,%xmm11 - vpaddb %xmm2,%xmm11,%xmm12 - vpaddb %xmm2,%xmm12,%xmm13 - vpaddb %xmm2,%xmm13,%xmm14 - vpxor %xmm15,%xmm1,%xmm9 - vmovdqu %xmm4,16+8(%rsp) - jmp .Loop6x - -.align 32 -.Loop6x: - addl $100663296,%ebx - jc .Lhandle_ctr32 - vmovdqu 0-32(%r9),%xmm3 - vpaddb %xmm2,%xmm14,%xmm1 - vpxor %xmm15,%xmm10,%xmm10 - vpxor %xmm15,%xmm11,%xmm11 - -.Lresume_ctr32: - vmovdqu %xmm1,(%r8) - vpclmulqdq $0x10,%xmm3,%xmm7,%xmm5 - vpxor %xmm15,%xmm12,%xmm12 - vmovups 16-128(%rcx),%xmm2 - vpclmulqdq $0x01,%xmm3,%xmm7,%xmm6 - - - - - - - - - - - - - - - - - - xorq %r12,%r12 - cmpq %r14,%r15 - - vaesenc %xmm2,%xmm9,%xmm9 - vmovdqu 48+8(%rsp),%xmm0 - vpxor %xmm15,%xmm13,%xmm13 - vpclmulqdq $0x00,%xmm3,%xmm7,%xmm1 - vaesenc %xmm2,%xmm10,%xmm10 - vpxor %xmm15,%xmm14,%xmm14 - setnc %r12b - vpclmulqdq $0x11,%xmm3,%xmm7,%xmm7 - vaesenc %xmm2,%xmm11,%xmm11 - vmovdqu 16-32(%r9),%xmm3 - negq %r12 - vaesenc %xmm2,%xmm12,%xmm12 - vpxor %xmm5,%xmm6,%xmm6 - vpclmulqdq $0x00,%xmm3,%xmm0,%xmm5 - vpxor %xmm4,%xmm8,%xmm8 - vaesenc %xmm2,%xmm13,%xmm13 - vpxor %xmm5,%xmm1,%xmm4 - andq $0x60,%r12 - vmovups 32-128(%rcx),%xmm15 - vpclmulqdq $0x10,%xmm3,%xmm0,%xmm1 - vaesenc %xmm2,%xmm14,%xmm14 - - vpclmulqdq $0x01,%xmm3,%xmm0,%xmm2 - leaq (%r14,%r12,1),%r14 - vaesenc %xmm15,%xmm9,%xmm9 - vpxor 16+8(%rsp),%xmm8,%xmm8 - vpclmulqdq $0x11,%xmm3,%xmm0,%xmm3 - vmovdqu 64+8(%rsp),%xmm0 - vaesenc %xmm15,%xmm10,%xmm10 - movbeq 88(%r14),%r13 - vaesenc %xmm15,%xmm11,%xmm11 - movbeq 80(%r14),%r12 - vaesenc %xmm15,%xmm12,%xmm12 - movq %r13,32+8(%rsp) - vaesenc %xmm15,%xmm13,%xmm13 - movq %r12,40+8(%rsp) - vmovdqu 48-32(%r9),%xmm5 - vaesenc %xmm15,%xmm14,%xmm14 - - vmovups 48-128(%rcx),%xmm15 - vpxor %xmm1,%xmm6,%xmm6 - vpclmulqdq $0x00,%xmm5,%xmm0,%xmm1 - vaesenc %xmm15,%xmm9,%xmm9 - vpxor %xmm2,%xmm6,%xmm6 - vpclmulqdq $0x10,%xmm5,%xmm0,%xmm2 - vaesenc %xmm15,%xmm10,%xmm10 - vpxor %xmm3,%xmm7,%xmm7 - vpclmulqdq $0x01,%xmm5,%xmm0,%xmm3 - vaesenc %xmm15,%xmm11,%xmm11 - vpclmulqdq $0x11,%xmm5,%xmm0,%xmm5 - vmovdqu 80+8(%rsp),%xmm0 - vaesenc %xmm15,%xmm12,%xmm12 - vaesenc %xmm15,%xmm13,%xmm13 - vpxor %xmm1,%xmm4,%xmm4 - vmovdqu 64-32(%r9),%xmm1 - vaesenc %xmm15,%xmm14,%xmm14 - - vmovups 64-128(%rcx),%xmm15 - vpxor %xmm2,%xmm6,%xmm6 - vpclmulqdq $0x00,%xmm1,%xmm0,%xmm2 - vaesenc %xmm15,%xmm9,%xmm9 - vpxor %xmm3,%xmm6,%xmm6 - vpclmulqdq $0x10,%xmm1,%xmm0,%xmm3 - vaesenc %xmm15,%xmm10,%xmm10 - movbeq 72(%r14),%r13 - vpxor %xmm5,%xmm7,%xmm7 - vpclmulqdq $0x01,%xmm1,%xmm0,%xmm5 - vaesenc %xmm15,%xmm11,%xmm11 - movbeq 64(%r14),%r12 - vpclmulqdq $0x11,%xmm1,%xmm0,%xmm1 - vmovdqu 96+8(%rsp),%xmm0 - vaesenc %xmm15,%xmm12,%xmm12 - movq %r13,48+8(%rsp) - vaesenc %xmm15,%xmm13,%xmm13 - movq %r12,56+8(%rsp) - vpxor %xmm2,%xmm4,%xmm4 - vmovdqu 96-32(%r9),%xmm2 - vaesenc %xmm15,%xmm14,%xmm14 - - vmovups 80-128(%rcx),%xmm15 - vpxor %xmm3,%xmm6,%xmm6 - vpclmulqdq $0x00,%xmm2,%xmm0,%xmm3 - vaesenc %xmm15,%xmm9,%xmm9 - vpxor %xmm5,%xmm6,%xmm6 - vpclmulqdq $0x10,%xmm2,%xmm0,%xmm5 - vaesenc %xmm15,%xmm10,%xmm10 - movbeq 56(%r14),%r13 - vpxor %xmm1,%xmm7,%xmm7 - vpclmulqdq $0x01,%xmm2,%xmm0,%xmm1 - vpxor 112+8(%rsp),%xmm8,%xmm8 - vaesenc %xmm15,%xmm11,%xmm11 - movbeq 48(%r14),%r12 - vpclmulqdq $0x11,%xmm2,%xmm0,%xmm2 - vaesenc %xmm15,%xmm12,%xmm12 - movq %r13,64+8(%rsp) - vaesenc %xmm15,%xmm13,%xmm13 - movq %r12,72+8(%rsp) - vpxor %xmm3,%xmm4,%xmm4 - vmovdqu 112-32(%r9),%xmm3 - vaesenc %xmm15,%xmm14,%xmm14 - - vmovups 96-128(%rcx),%xmm15 - vpxor %xmm5,%xmm6,%xmm6 - vpclmulqdq $0x10,%xmm3,%xmm8,%xmm5 - vaesenc %xmm15,%xmm9,%xmm9 - vpxor %xmm1,%xmm6,%xmm6 - vpclmulqdq $0x01,%xmm3,%xmm8,%xmm1 - vaesenc %xmm15,%xmm10,%xmm10 - movbeq 40(%r14),%r13 - vpxor %xmm2,%xmm7,%xmm7 - vpclmulqdq $0x00,%xmm3,%xmm8,%xmm2 - vaesenc %xmm15,%xmm11,%xmm11 - movbeq 32(%r14),%r12 - vpclmulqdq $0x11,%xmm3,%xmm8,%xmm8 - vaesenc %xmm15,%xmm12,%xmm12 - movq %r13,80+8(%rsp) - vaesenc %xmm15,%xmm13,%xmm13 - movq %r12,88+8(%rsp) - vpxor %xmm5,%xmm6,%xmm6 - vaesenc %xmm15,%xmm14,%xmm14 - vpxor %xmm1,%xmm6,%xmm6 - - vmovups 112-128(%rcx),%xmm15 - vpslldq $8,%xmm6,%xmm5 - vpxor %xmm2,%xmm4,%xmm4 - vmovdqu 16(%r11),%xmm3 - - vaesenc %xmm15,%xmm9,%xmm9 - vpxor %xmm8,%xmm7,%xmm7 - vaesenc %xmm15,%xmm10,%xmm10 - vpxor %xmm5,%xmm4,%xmm4 - movbeq 24(%r14),%r13 - vaesenc %xmm15,%xmm11,%xmm11 - movbeq 16(%r14),%r12 - vpalignr $8,%xmm4,%xmm4,%xmm0 - vpclmulqdq $0x10,%xmm3,%xmm4,%xmm4 - movq %r13,96+8(%rsp) - vaesenc %xmm15,%xmm12,%xmm12 - movq %r12,104+8(%rsp) - vaesenc %xmm15,%xmm13,%xmm13 - vmovups 128-128(%rcx),%xmm1 - vaesenc %xmm15,%xmm14,%xmm14 - - vaesenc %xmm1,%xmm9,%xmm9 - vmovups 144-128(%rcx),%xmm15 - vaesenc %xmm1,%xmm10,%xmm10 - vpsrldq $8,%xmm6,%xmm6 - vaesenc %xmm1,%xmm11,%xmm11 - vpxor %xmm6,%xmm7,%xmm7 - vaesenc %xmm1,%xmm12,%xmm12 - vpxor %xmm0,%xmm4,%xmm4 - movbeq 8(%r14),%r13 - vaesenc %xmm1,%xmm13,%xmm13 - movbeq 0(%r14),%r12 - vaesenc %xmm1,%xmm14,%xmm14 - vmovups 160-128(%rcx),%xmm1 - cmpl $11,%ebp - jb .Lenc_tail - - vaesenc %xmm15,%xmm9,%xmm9 - vaesenc %xmm15,%xmm10,%xmm10 - vaesenc %xmm15,%xmm11,%xmm11 - vaesenc %xmm15,%xmm12,%xmm12 - vaesenc %xmm15,%xmm13,%xmm13 - vaesenc %xmm15,%xmm14,%xmm14 - - vaesenc %xmm1,%xmm9,%xmm9 - vaesenc %xmm1,%xmm10,%xmm10 - vaesenc %xmm1,%xmm11,%xmm11 - vaesenc %xmm1,%xmm12,%xmm12 - vaesenc %xmm1,%xmm13,%xmm13 - vmovups 176-128(%rcx),%xmm15 - vaesenc %xmm1,%xmm14,%xmm14 - vmovups 192-128(%rcx),%xmm1 - - - vaesenc %xmm15,%xmm9,%xmm9 - vaesenc %xmm15,%xmm10,%xmm10 - vaesenc %xmm15,%xmm11,%xmm11 - vaesenc %xmm15,%xmm12,%xmm12 - vaesenc %xmm15,%xmm13,%xmm13 - vaesenc %xmm15,%xmm14,%xmm14 - - vaesenc %xmm1,%xmm9,%xmm9 - vaesenc %xmm1,%xmm10,%xmm10 - vaesenc %xmm1,%xmm11,%xmm11 - vaesenc %xmm1,%xmm12,%xmm12 - vaesenc %xmm1,%xmm13,%xmm13 - vmovups 208-128(%rcx),%xmm15 - vaesenc %xmm1,%xmm14,%xmm14 - vmovups 224-128(%rcx),%xmm1 - jmp .Lenc_tail - -.align 32 -.Lhandle_ctr32: - vmovdqu (%r11),%xmm0 - vpshufb %xmm0,%xmm1,%xmm6 - vmovdqu 48(%r11),%xmm5 - vpaddd 64(%r11),%xmm6,%xmm10 - vpaddd %xmm5,%xmm6,%xmm11 - vmovdqu 0-32(%r9),%xmm3 - vpaddd %xmm5,%xmm10,%xmm12 - vpshufb %xmm0,%xmm10,%xmm10 - vpaddd %xmm5,%xmm11,%xmm13 - vpshufb %xmm0,%xmm11,%xmm11 - vpxor %xmm15,%xmm10,%xmm10 - vpaddd %xmm5,%xmm12,%xmm14 - vpshufb %xmm0,%xmm12,%xmm12 - vpxor %xmm15,%xmm11,%xmm11 - vpaddd %xmm5,%xmm13,%xmm1 - vpshufb %xmm0,%xmm13,%xmm13 - vpshufb %xmm0,%xmm14,%xmm14 - vpshufb %xmm0,%xmm1,%xmm1 - jmp .Lresume_ctr32 - -.align 32 -.Lenc_tail: - vaesenc %xmm15,%xmm9,%xmm9 - vmovdqu %xmm7,16+8(%rsp) - vpalignr $8,%xmm4,%xmm4,%xmm8 - vaesenc %xmm15,%xmm10,%xmm10 - vpclmulqdq $0x10,%xmm3,%xmm4,%xmm4 - vpxor 0(%rdi),%xmm1,%xmm2 - vaesenc %xmm15,%xmm11,%xmm11 - vpxor 16(%rdi),%xmm1,%xmm0 - vaesenc %xmm15,%xmm12,%xmm12 - vpxor 32(%rdi),%xmm1,%xmm5 - vaesenc %xmm15,%xmm13,%xmm13 - vpxor 48(%rdi),%xmm1,%xmm6 - vaesenc %xmm15,%xmm14,%xmm14 - vpxor 64(%rdi),%xmm1,%xmm7 - vpxor 80(%rdi),%xmm1,%xmm3 - vmovdqu (%r8),%xmm1 - - vaesenclast %xmm2,%xmm9,%xmm9 - vmovdqu 32(%r11),%xmm2 - vaesenclast %xmm0,%xmm10,%xmm10 - vpaddb %xmm2,%xmm1,%xmm0 - movq %r13,112+8(%rsp) - leaq 96(%rdi),%rdi - vaesenclast %xmm5,%xmm11,%xmm11 - vpaddb %xmm2,%xmm0,%xmm5 - movq %r12,120+8(%rsp) - leaq 96(%rsi),%rsi - vmovdqu 0-128(%rcx),%xmm15 - vaesenclast %xmm6,%xmm12,%xmm12 - vpaddb %xmm2,%xmm5,%xmm6 - vaesenclast %xmm7,%xmm13,%xmm13 - vpaddb %xmm2,%xmm6,%xmm7 - vaesenclast %xmm3,%xmm14,%xmm14 - vpaddb %xmm2,%xmm7,%xmm3 - - addq $0x60,%r10 - subq $0x6,%rdx - jc .L6x_done - - vmovups %xmm9,-96(%rsi) - vpxor %xmm15,%xmm1,%xmm9 - vmovups %xmm10,-80(%rsi) - vmovdqa %xmm0,%xmm10 - vmovups %xmm11,-64(%rsi) - vmovdqa %xmm5,%xmm11 - vmovups %xmm12,-48(%rsi) - vmovdqa %xmm6,%xmm12 - vmovups %xmm13,-32(%rsi) - vmovdqa %xmm7,%xmm13 - vmovups %xmm14,-16(%rsi) - vmovdqa %xmm3,%xmm14 - vmovdqu 32+8(%rsp),%xmm7 - jmp .Loop6x - -.L6x_done: - vpxor 16+8(%rsp),%xmm8,%xmm8 - vpxor %xmm4,%xmm8,%xmm8 - - .byte 0xf3,0xc3 -.cfi_endproc -.size _aesni_ctr32_ghash_6x,.-_aesni_ctr32_ghash_6x -.globl GFp_aesni_gcm_decrypt -.hidden GFp_aesni_gcm_decrypt -.type GFp_aesni_gcm_decrypt,@function -.align 32 -GFp_aesni_gcm_decrypt: -.cfi_startproc - xorq %r10,%r10 - - - - cmpq $0x60,%rdx - jb .Lgcm_dec_abort - - leaq (%rsp),%rax -.cfi_def_cfa_register %rax - pushq %rbx -.cfi_offset %rbx,-16 - pushq %rbp -.cfi_offset %rbp,-24 - pushq %r12 -.cfi_offset %r12,-32 - pushq %r13 -.cfi_offset %r13,-40 - pushq %r14 -.cfi_offset %r14,-48 - pushq %r15 -.cfi_offset %r15,-56 - vzeroupper - - vmovdqu (%r8),%xmm1 - addq $-128,%rsp - movl 12(%r8),%ebx - leaq .Lbswap_mask(%rip),%r11 - leaq -128(%rcx),%r14 - movq $0xf80,%r15 - vmovdqu (%r9),%xmm8 - andq $-128,%rsp - vmovdqu (%r11),%xmm0 - leaq 128(%rcx),%rcx - leaq 32+32(%r9),%r9 - movl 240-128(%rcx),%ebp - vpshufb %xmm0,%xmm8,%xmm8 - - andq %r15,%r14 - andq %rsp,%r15 - subq %r14,%r15 - jc .Ldec_no_key_aliasing - cmpq $768,%r15 - jnc .Ldec_no_key_aliasing - subq %r15,%rsp -.Ldec_no_key_aliasing: - - vmovdqu 80(%rdi),%xmm7 - leaq (%rdi),%r14 - vmovdqu 64(%rdi),%xmm4 - - - - - - - - leaq -192(%rdi,%rdx,1),%r15 - - vmovdqu 48(%rdi),%xmm5 - shrq $4,%rdx - xorq %r10,%r10 - vmovdqu 32(%rdi),%xmm6 - vpshufb %xmm0,%xmm7,%xmm7 - vmovdqu 16(%rdi),%xmm2 - vpshufb %xmm0,%xmm4,%xmm4 - vmovdqu (%rdi),%xmm3 - vpshufb %xmm0,%xmm5,%xmm5 - vmovdqu %xmm4,48(%rsp) - vpshufb %xmm0,%xmm6,%xmm6 - vmovdqu %xmm5,64(%rsp) - vpshufb %xmm0,%xmm2,%xmm2 - vmovdqu %xmm6,80(%rsp) - vpshufb %xmm0,%xmm3,%xmm3 - vmovdqu %xmm2,96(%rsp) - vmovdqu %xmm3,112(%rsp) - - call _aesni_ctr32_ghash_6x - - vmovups %xmm9,-96(%rsi) - vmovups %xmm10,-80(%rsi) - vmovups %xmm11,-64(%rsi) - vmovups %xmm12,-48(%rsi) - vmovups %xmm13,-32(%rsi) - vmovups %xmm14,-16(%rsi) - - vpshufb (%r11),%xmm8,%xmm8 - vmovdqu %xmm8,-64(%r9) - - vzeroupper - movq -48(%rax),%r15 -.cfi_restore %r15 - movq -40(%rax),%r14 -.cfi_restore %r14 - movq -32(%rax),%r13 -.cfi_restore %r13 - movq -24(%rax),%r12 -.cfi_restore %r12 - movq -16(%rax),%rbp -.cfi_restore %rbp - movq -8(%rax),%rbx -.cfi_restore %rbx - leaq (%rax),%rsp -.cfi_def_cfa_register %rsp -.Lgcm_dec_abort: - movq %r10,%rax - .byte 0xf3,0xc3 -.cfi_endproc -.size GFp_aesni_gcm_decrypt,.-GFp_aesni_gcm_decrypt -.type _aesni_ctr32_6x,@function -.align 32 -_aesni_ctr32_6x: -.cfi_startproc - vmovdqu 0-128(%rcx),%xmm4 - vmovdqu 32(%r11),%xmm2 - leaq -1(%rbp),%r13 - vmovups 16-128(%rcx),%xmm15 - leaq 32-128(%rcx),%r12 - vpxor %xmm4,%xmm1,%xmm9 - addl $100663296,%ebx - jc .Lhandle_ctr32_2 - vpaddb %xmm2,%xmm1,%xmm10 - vpaddb %xmm2,%xmm10,%xmm11 - vpxor %xmm4,%xmm10,%xmm10 - vpaddb %xmm2,%xmm11,%xmm12 - vpxor %xmm4,%xmm11,%xmm11 - vpaddb %xmm2,%xmm12,%xmm13 - vpxor %xmm4,%xmm12,%xmm12 - vpaddb %xmm2,%xmm13,%xmm14 - vpxor %xmm4,%xmm13,%xmm13 - vpaddb %xmm2,%xmm14,%xmm1 - vpxor %xmm4,%xmm14,%xmm14 - jmp .Loop_ctr32 - -.align 16 -.Loop_ctr32: - vaesenc %xmm15,%xmm9,%xmm9 - vaesenc %xmm15,%xmm10,%xmm10 - vaesenc %xmm15,%xmm11,%xmm11 - vaesenc %xmm15,%xmm12,%xmm12 - vaesenc %xmm15,%xmm13,%xmm13 - vaesenc %xmm15,%xmm14,%xmm14 - vmovups (%r12),%xmm15 - leaq 16(%r12),%r12 - decl %r13d - jnz .Loop_ctr32 - - vmovdqu (%r12),%xmm3 - vaesenc %xmm15,%xmm9,%xmm9 - vpxor 0(%rdi),%xmm3,%xmm4 - vaesenc %xmm15,%xmm10,%xmm10 - vpxor 16(%rdi),%xmm3,%xmm5 - vaesenc %xmm15,%xmm11,%xmm11 - vpxor 32(%rdi),%xmm3,%xmm6 - vaesenc %xmm15,%xmm12,%xmm12 - vpxor 48(%rdi),%xmm3,%xmm8 - vaesenc %xmm15,%xmm13,%xmm13 - vpxor 64(%rdi),%xmm3,%xmm2 - vaesenc %xmm15,%xmm14,%xmm14 - vpxor 80(%rdi),%xmm3,%xmm3 - leaq 96(%rdi),%rdi - - vaesenclast %xmm4,%xmm9,%xmm9 - vaesenclast %xmm5,%xmm10,%xmm10 - vaesenclast %xmm6,%xmm11,%xmm11 - vaesenclast %xmm8,%xmm12,%xmm12 - vaesenclast %xmm2,%xmm13,%xmm13 - vaesenclast %xmm3,%xmm14,%xmm14 - vmovups %xmm9,0(%rsi) - vmovups %xmm10,16(%rsi) - vmovups %xmm11,32(%rsi) - vmovups %xmm12,48(%rsi) - vmovups %xmm13,64(%rsi) - vmovups %xmm14,80(%rsi) - leaq 96(%rsi),%rsi - - .byte 0xf3,0xc3 -.align 32 -.Lhandle_ctr32_2: - vpshufb %xmm0,%xmm1,%xmm6 - vmovdqu 48(%r11),%xmm5 - vpaddd 64(%r11),%xmm6,%xmm10 - vpaddd %xmm5,%xmm6,%xmm11 - vpaddd %xmm5,%xmm10,%xmm12 - vpshufb %xmm0,%xmm10,%xmm10 - vpaddd %xmm5,%xmm11,%xmm13 - vpshufb %xmm0,%xmm11,%xmm11 - vpxor %xmm4,%xmm10,%xmm10 - vpaddd %xmm5,%xmm12,%xmm14 - vpshufb %xmm0,%xmm12,%xmm12 - vpxor %xmm4,%xmm11,%xmm11 - vpaddd %xmm5,%xmm13,%xmm1 - vpshufb %xmm0,%xmm13,%xmm13 - vpxor %xmm4,%xmm12,%xmm12 - vpshufb %xmm0,%xmm14,%xmm14 - vpxor %xmm4,%xmm13,%xmm13 - vpshufb %xmm0,%xmm1,%xmm1 - vpxor %xmm4,%xmm14,%xmm14 - jmp .Loop_ctr32 -.cfi_endproc -.size _aesni_ctr32_6x,.-_aesni_ctr32_6x - -.globl GFp_aesni_gcm_encrypt -.hidden GFp_aesni_gcm_encrypt -.type GFp_aesni_gcm_encrypt,@function -.align 32 -GFp_aesni_gcm_encrypt: -.cfi_startproc - xorq %r10,%r10 - - - - - cmpq $288,%rdx - jb .Lgcm_enc_abort - - leaq (%rsp),%rax -.cfi_def_cfa_register %rax - pushq %rbx -.cfi_offset %rbx,-16 - pushq %rbp -.cfi_offset %rbp,-24 - pushq %r12 -.cfi_offset %r12,-32 - pushq %r13 -.cfi_offset %r13,-40 - pushq %r14 -.cfi_offset %r14,-48 - pushq %r15 -.cfi_offset %r15,-56 - vzeroupper - - vmovdqu (%r8),%xmm1 - addq $-128,%rsp - movl 12(%r8),%ebx - leaq .Lbswap_mask(%rip),%r11 - leaq -128(%rcx),%r14 - movq $0xf80,%r15 - leaq 128(%rcx),%rcx - vmovdqu (%r11),%xmm0 - andq $-128,%rsp - movl 240-128(%rcx),%ebp - - andq %r15,%r14 - andq %rsp,%r15 - subq %r14,%r15 - jc .Lenc_no_key_aliasing - cmpq $768,%r15 - jnc .Lenc_no_key_aliasing - subq %r15,%rsp -.Lenc_no_key_aliasing: - - leaq (%rsi),%r14 - - - - - - - - - leaq -192(%rsi,%rdx,1),%r15 - - shrq $4,%rdx - - call _aesni_ctr32_6x - vpshufb %xmm0,%xmm9,%xmm8 - vpshufb %xmm0,%xmm10,%xmm2 - vmovdqu %xmm8,112(%rsp) - vpshufb %xmm0,%xmm11,%xmm4 - vmovdqu %xmm2,96(%rsp) - vpshufb %xmm0,%xmm12,%xmm5 - vmovdqu %xmm4,80(%rsp) - vpshufb %xmm0,%xmm13,%xmm6 - vmovdqu %xmm5,64(%rsp) - vpshufb %xmm0,%xmm14,%xmm7 - vmovdqu %xmm6,48(%rsp) - - call _aesni_ctr32_6x - - vmovdqu (%r9),%xmm8 - leaq 32+32(%r9),%r9 - subq $12,%rdx - movq $192,%r10 - vpshufb %xmm0,%xmm8,%xmm8 - - call _aesni_ctr32_ghash_6x - vmovdqu 32(%rsp),%xmm7 - vmovdqu (%r11),%xmm0 - vmovdqu 0-32(%r9),%xmm3 - vpunpckhqdq %xmm7,%xmm7,%xmm1 - vmovdqu 32-32(%r9),%xmm15 - vmovups %xmm9,-96(%rsi) - vpshufb %xmm0,%xmm9,%xmm9 - vpxor %xmm7,%xmm1,%xmm1 - vmovups %xmm10,-80(%rsi) - vpshufb %xmm0,%xmm10,%xmm10 - vmovups %xmm11,-64(%rsi) - vpshufb %xmm0,%xmm11,%xmm11 - vmovups %xmm12,-48(%rsi) - vpshufb %xmm0,%xmm12,%xmm12 - vmovups %xmm13,-32(%rsi) - vpshufb %xmm0,%xmm13,%xmm13 - vmovups %xmm14,-16(%rsi) - vpshufb %xmm0,%xmm14,%xmm14 - vmovdqu %xmm9,16(%rsp) - vmovdqu 48(%rsp),%xmm6 - vmovdqu 16-32(%r9),%xmm0 - vpunpckhqdq %xmm6,%xmm6,%xmm2 - vpclmulqdq $0x00,%xmm3,%xmm7,%xmm5 - vpxor %xmm6,%xmm2,%xmm2 - vpclmulqdq $0x11,%xmm3,%xmm7,%xmm7 - vpclmulqdq $0x00,%xmm15,%xmm1,%xmm1 - - vmovdqu 64(%rsp),%xmm9 - vpclmulqdq $0x00,%xmm0,%xmm6,%xmm4 - vmovdqu 48-32(%r9),%xmm3 - vpxor %xmm5,%xmm4,%xmm4 - vpunpckhqdq %xmm9,%xmm9,%xmm5 - vpclmulqdq $0x11,%xmm0,%xmm6,%xmm6 - vpxor %xmm9,%xmm5,%xmm5 - vpxor %xmm7,%xmm6,%xmm6 - vpclmulqdq $0x10,%xmm15,%xmm2,%xmm2 - vmovdqu 80-32(%r9),%xmm15 - vpxor %xmm1,%xmm2,%xmm2 - - vmovdqu 80(%rsp),%xmm1 - vpclmulqdq $0x00,%xmm3,%xmm9,%xmm7 - vmovdqu 64-32(%r9),%xmm0 - vpxor %xmm4,%xmm7,%xmm7 - vpunpckhqdq %xmm1,%xmm1,%xmm4 - vpclmulqdq $0x11,%xmm3,%xmm9,%xmm9 - vpxor %xmm1,%xmm4,%xmm4 - vpxor %xmm6,%xmm9,%xmm9 - vpclmulqdq $0x00,%xmm15,%xmm5,%xmm5 - vpxor %xmm2,%xmm5,%xmm5 - - vmovdqu 96(%rsp),%xmm2 - vpclmulqdq $0x00,%xmm0,%xmm1,%xmm6 - vmovdqu 96-32(%r9),%xmm3 - vpxor %xmm7,%xmm6,%xmm6 - vpunpckhqdq %xmm2,%xmm2,%xmm7 - vpclmulqdq $0x11,%xmm0,%xmm1,%xmm1 - vpxor %xmm2,%xmm7,%xmm7 - vpxor %xmm9,%xmm1,%xmm1 - vpclmulqdq $0x10,%xmm15,%xmm4,%xmm4 - vmovdqu 128-32(%r9),%xmm15 - vpxor %xmm5,%xmm4,%xmm4 - - vpxor 112(%rsp),%xmm8,%xmm8 - vpclmulqdq $0x00,%xmm3,%xmm2,%xmm5 - vmovdqu 112-32(%r9),%xmm0 - vpunpckhqdq %xmm8,%xmm8,%xmm9 - vpxor %xmm6,%xmm5,%xmm5 - vpclmulqdq $0x11,%xmm3,%xmm2,%xmm2 - vpxor %xmm8,%xmm9,%xmm9 - vpxor %xmm1,%xmm2,%xmm2 - vpclmulqdq $0x00,%xmm15,%xmm7,%xmm7 - vpxor %xmm4,%xmm7,%xmm4 - - vpclmulqdq $0x00,%xmm0,%xmm8,%xmm6 - vmovdqu 0-32(%r9),%xmm3 - vpunpckhqdq %xmm14,%xmm14,%xmm1 - vpclmulqdq $0x11,%xmm0,%xmm8,%xmm8 - vpxor %xmm14,%xmm1,%xmm1 - vpxor %xmm5,%xmm6,%xmm5 - vpclmulqdq $0x10,%xmm15,%xmm9,%xmm9 - vmovdqu 32-32(%r9),%xmm15 - vpxor %xmm2,%xmm8,%xmm7 - vpxor %xmm4,%xmm9,%xmm6 - - vmovdqu 16-32(%r9),%xmm0 - vpxor %xmm5,%xmm7,%xmm9 - vpclmulqdq $0x00,%xmm3,%xmm14,%xmm4 - vpxor %xmm9,%xmm6,%xmm6 - vpunpckhqdq %xmm13,%xmm13,%xmm2 - vpclmulqdq $0x11,%xmm3,%xmm14,%xmm14 - vpxor %xmm13,%xmm2,%xmm2 - vpslldq $8,%xmm6,%xmm9 - vpclmulqdq $0x00,%xmm15,%xmm1,%xmm1 - vpxor %xmm9,%xmm5,%xmm8 - vpsrldq $8,%xmm6,%xmm6 - vpxor %xmm6,%xmm7,%xmm7 - - vpclmulqdq $0x00,%xmm0,%xmm13,%xmm5 - vmovdqu 48-32(%r9),%xmm3 - vpxor %xmm4,%xmm5,%xmm5 - vpunpckhqdq %xmm12,%xmm12,%xmm9 - vpclmulqdq $0x11,%xmm0,%xmm13,%xmm13 - vpxor %xmm12,%xmm9,%xmm9 - vpxor %xmm14,%xmm13,%xmm13 - vpalignr $8,%xmm8,%xmm8,%xmm14 - vpclmulqdq $0x10,%xmm15,%xmm2,%xmm2 - vmovdqu 80-32(%r9),%xmm15 - vpxor %xmm1,%xmm2,%xmm2 - - vpclmulqdq $0x00,%xmm3,%xmm12,%xmm4 - vmovdqu 64-32(%r9),%xmm0 - vpxor %xmm5,%xmm4,%xmm4 - vpunpckhqdq %xmm11,%xmm11,%xmm1 - vpclmulqdq $0x11,%xmm3,%xmm12,%xmm12 - vpxor %xmm11,%xmm1,%xmm1 - vpxor %xmm13,%xmm12,%xmm12 - vxorps 16(%rsp),%xmm7,%xmm7 - vpclmulqdq $0x00,%xmm15,%xmm9,%xmm9 - vpxor %xmm2,%xmm9,%xmm9 - - vpclmulqdq $0x10,16(%r11),%xmm8,%xmm8 - vxorps %xmm14,%xmm8,%xmm8 - - vpclmulqdq $0x00,%xmm0,%xmm11,%xmm5 - vmovdqu 96-32(%r9),%xmm3 - vpxor %xmm4,%xmm5,%xmm5 - vpunpckhqdq %xmm10,%xmm10,%xmm2 - vpclmulqdq $0x11,%xmm0,%xmm11,%xmm11 - vpxor %xmm10,%xmm2,%xmm2 - vpalignr $8,%xmm8,%xmm8,%xmm14 - vpxor %xmm12,%xmm11,%xmm11 - vpclmulqdq $0x10,%xmm15,%xmm1,%xmm1 - vmovdqu 128-32(%r9),%xmm15 - vpxor %xmm9,%xmm1,%xmm1 - - vxorps %xmm7,%xmm14,%xmm14 - vpclmulqdq $0x10,16(%r11),%xmm8,%xmm8 - vxorps %xmm14,%xmm8,%xmm8 - - vpclmulqdq $0x00,%xmm3,%xmm10,%xmm4 - vmovdqu 112-32(%r9),%xmm0 - vpxor %xmm5,%xmm4,%xmm4 - vpunpckhqdq %xmm8,%xmm8,%xmm9 - vpclmulqdq $0x11,%xmm3,%xmm10,%xmm10 - vpxor %xmm8,%xmm9,%xmm9 - vpxor %xmm11,%xmm10,%xmm10 - vpclmulqdq $0x00,%xmm15,%xmm2,%xmm2 - vpxor %xmm1,%xmm2,%xmm2 - - vpclmulqdq $0x00,%xmm0,%xmm8,%xmm5 - vpclmulqdq $0x11,%xmm0,%xmm8,%xmm7 - vpxor %xmm4,%xmm5,%xmm5 - vpclmulqdq $0x10,%xmm15,%xmm9,%xmm6 - vpxor %xmm10,%xmm7,%xmm7 - vpxor %xmm2,%xmm6,%xmm6 - - vpxor %xmm5,%xmm7,%xmm4 - vpxor %xmm4,%xmm6,%xmm6 - vpslldq $8,%xmm6,%xmm1 - vmovdqu 16(%r11),%xmm3 - vpsrldq $8,%xmm6,%xmm6 - vpxor %xmm1,%xmm5,%xmm8 - vpxor %xmm6,%xmm7,%xmm7 - - vpalignr $8,%xmm8,%xmm8,%xmm2 - vpclmulqdq $0x10,%xmm3,%xmm8,%xmm8 - vpxor %xmm2,%xmm8,%xmm8 - - vpalignr $8,%xmm8,%xmm8,%xmm2 - vpclmulqdq $0x10,%xmm3,%xmm8,%xmm8 - vpxor %xmm7,%xmm2,%xmm2 - vpxor %xmm2,%xmm8,%xmm8 - vpshufb (%r11),%xmm8,%xmm8 - vmovdqu %xmm8,-64(%r9) - - vzeroupper - movq -48(%rax),%r15 -.cfi_restore %r15 - movq -40(%rax),%r14 -.cfi_restore %r14 - movq -32(%rax),%r13 -.cfi_restore %r13 - movq -24(%rax),%r12 -.cfi_restore %r12 - movq -16(%rax),%rbp -.cfi_restore %rbp - movq -8(%rax),%rbx -.cfi_restore %rbx - leaq (%rax),%rsp -.cfi_def_cfa_register %rsp -.Lgcm_enc_abort: - movq %r10,%rax - .byte 0xf3,0xc3 -.cfi_endproc -.size GFp_aesni_gcm_encrypt,.-GFp_aesni_gcm_encrypt -.align 64 -.Lbswap_mask: -.byte 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 -.Lpoly: -.byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xc2 -.Lone_msb: -.byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 -.Ltwo_lsb: -.byte 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -.Lone_lsb: -.byte 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -.byte 65,69,83,45,78,73,32,71,67,77,32,109,111,100,117,108,101,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 -.align 64 -#endif -.section .note.GNU-stack,"",@progbits diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/aesni-gcm-x86_64-macosx.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/aesni-gcm-x86_64-macosx.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/aesni-gcm-x86_64-macosx.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/aesni-gcm-x86_64-macosx.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,843 +0,0 @@ -# This file is generated from a similarly-named Perl script in the BoringSSL -# source tree. Do not edit by hand. - -#if defined(__has_feature) -#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) -#define OPENSSL_NO_ASM -#endif -#endif - -#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) -.text - - -.p2align 5 -_aesni_ctr32_ghash_6x: - - vmovdqu 32(%r11),%xmm2 - subq $6,%rdx - vpxor %xmm4,%xmm4,%xmm4 - vmovdqu 0-128(%rcx),%xmm15 - vpaddb %xmm2,%xmm1,%xmm10 - vpaddb %xmm2,%xmm10,%xmm11 - vpaddb %xmm2,%xmm11,%xmm12 - vpaddb %xmm2,%xmm12,%xmm13 - vpaddb %xmm2,%xmm13,%xmm14 - vpxor %xmm15,%xmm1,%xmm9 - vmovdqu %xmm4,16+8(%rsp) - jmp L$oop6x - -.p2align 5 -L$oop6x: - addl $100663296,%ebx - jc L$handle_ctr32 - vmovdqu 0-32(%r9),%xmm3 - vpaddb %xmm2,%xmm14,%xmm1 - vpxor %xmm15,%xmm10,%xmm10 - vpxor %xmm15,%xmm11,%xmm11 - -L$resume_ctr32: - vmovdqu %xmm1,(%r8) - vpclmulqdq $0x10,%xmm3,%xmm7,%xmm5 - vpxor %xmm15,%xmm12,%xmm12 - vmovups 16-128(%rcx),%xmm2 - vpclmulqdq $0x01,%xmm3,%xmm7,%xmm6 - - - - - - - - - - - - - - - - - - xorq %r12,%r12 - cmpq %r14,%r15 - - vaesenc %xmm2,%xmm9,%xmm9 - vmovdqu 48+8(%rsp),%xmm0 - vpxor %xmm15,%xmm13,%xmm13 - vpclmulqdq $0x00,%xmm3,%xmm7,%xmm1 - vaesenc %xmm2,%xmm10,%xmm10 - vpxor %xmm15,%xmm14,%xmm14 - setnc %r12b - vpclmulqdq $0x11,%xmm3,%xmm7,%xmm7 - vaesenc %xmm2,%xmm11,%xmm11 - vmovdqu 16-32(%r9),%xmm3 - negq %r12 - vaesenc %xmm2,%xmm12,%xmm12 - vpxor %xmm5,%xmm6,%xmm6 - vpclmulqdq $0x00,%xmm3,%xmm0,%xmm5 - vpxor %xmm4,%xmm8,%xmm8 - vaesenc %xmm2,%xmm13,%xmm13 - vpxor %xmm5,%xmm1,%xmm4 - andq $0x60,%r12 - vmovups 32-128(%rcx),%xmm15 - vpclmulqdq $0x10,%xmm3,%xmm0,%xmm1 - vaesenc %xmm2,%xmm14,%xmm14 - - vpclmulqdq $0x01,%xmm3,%xmm0,%xmm2 - leaq (%r14,%r12,1),%r14 - vaesenc %xmm15,%xmm9,%xmm9 - vpxor 16+8(%rsp),%xmm8,%xmm8 - vpclmulqdq $0x11,%xmm3,%xmm0,%xmm3 - vmovdqu 64+8(%rsp),%xmm0 - vaesenc %xmm15,%xmm10,%xmm10 - movbeq 88(%r14),%r13 - vaesenc %xmm15,%xmm11,%xmm11 - movbeq 80(%r14),%r12 - vaesenc %xmm15,%xmm12,%xmm12 - movq %r13,32+8(%rsp) - vaesenc %xmm15,%xmm13,%xmm13 - movq %r12,40+8(%rsp) - vmovdqu 48-32(%r9),%xmm5 - vaesenc %xmm15,%xmm14,%xmm14 - - vmovups 48-128(%rcx),%xmm15 - vpxor %xmm1,%xmm6,%xmm6 - vpclmulqdq $0x00,%xmm5,%xmm0,%xmm1 - vaesenc %xmm15,%xmm9,%xmm9 - vpxor %xmm2,%xmm6,%xmm6 - vpclmulqdq $0x10,%xmm5,%xmm0,%xmm2 - vaesenc %xmm15,%xmm10,%xmm10 - vpxor %xmm3,%xmm7,%xmm7 - vpclmulqdq $0x01,%xmm5,%xmm0,%xmm3 - vaesenc %xmm15,%xmm11,%xmm11 - vpclmulqdq $0x11,%xmm5,%xmm0,%xmm5 - vmovdqu 80+8(%rsp),%xmm0 - vaesenc %xmm15,%xmm12,%xmm12 - vaesenc %xmm15,%xmm13,%xmm13 - vpxor %xmm1,%xmm4,%xmm4 - vmovdqu 64-32(%r9),%xmm1 - vaesenc %xmm15,%xmm14,%xmm14 - - vmovups 64-128(%rcx),%xmm15 - vpxor %xmm2,%xmm6,%xmm6 - vpclmulqdq $0x00,%xmm1,%xmm0,%xmm2 - vaesenc %xmm15,%xmm9,%xmm9 - vpxor %xmm3,%xmm6,%xmm6 - vpclmulqdq $0x10,%xmm1,%xmm0,%xmm3 - vaesenc %xmm15,%xmm10,%xmm10 - movbeq 72(%r14),%r13 - vpxor %xmm5,%xmm7,%xmm7 - vpclmulqdq $0x01,%xmm1,%xmm0,%xmm5 - vaesenc %xmm15,%xmm11,%xmm11 - movbeq 64(%r14),%r12 - vpclmulqdq $0x11,%xmm1,%xmm0,%xmm1 - vmovdqu 96+8(%rsp),%xmm0 - vaesenc %xmm15,%xmm12,%xmm12 - movq %r13,48+8(%rsp) - vaesenc %xmm15,%xmm13,%xmm13 - movq %r12,56+8(%rsp) - vpxor %xmm2,%xmm4,%xmm4 - vmovdqu 96-32(%r9),%xmm2 - vaesenc %xmm15,%xmm14,%xmm14 - - vmovups 80-128(%rcx),%xmm15 - vpxor %xmm3,%xmm6,%xmm6 - vpclmulqdq $0x00,%xmm2,%xmm0,%xmm3 - vaesenc %xmm15,%xmm9,%xmm9 - vpxor %xmm5,%xmm6,%xmm6 - vpclmulqdq $0x10,%xmm2,%xmm0,%xmm5 - vaesenc %xmm15,%xmm10,%xmm10 - movbeq 56(%r14),%r13 - vpxor %xmm1,%xmm7,%xmm7 - vpclmulqdq $0x01,%xmm2,%xmm0,%xmm1 - vpxor 112+8(%rsp),%xmm8,%xmm8 - vaesenc %xmm15,%xmm11,%xmm11 - movbeq 48(%r14),%r12 - vpclmulqdq $0x11,%xmm2,%xmm0,%xmm2 - vaesenc %xmm15,%xmm12,%xmm12 - movq %r13,64+8(%rsp) - vaesenc %xmm15,%xmm13,%xmm13 - movq %r12,72+8(%rsp) - vpxor %xmm3,%xmm4,%xmm4 - vmovdqu 112-32(%r9),%xmm3 - vaesenc %xmm15,%xmm14,%xmm14 - - vmovups 96-128(%rcx),%xmm15 - vpxor %xmm5,%xmm6,%xmm6 - vpclmulqdq $0x10,%xmm3,%xmm8,%xmm5 - vaesenc %xmm15,%xmm9,%xmm9 - vpxor %xmm1,%xmm6,%xmm6 - vpclmulqdq $0x01,%xmm3,%xmm8,%xmm1 - vaesenc %xmm15,%xmm10,%xmm10 - movbeq 40(%r14),%r13 - vpxor %xmm2,%xmm7,%xmm7 - vpclmulqdq $0x00,%xmm3,%xmm8,%xmm2 - vaesenc %xmm15,%xmm11,%xmm11 - movbeq 32(%r14),%r12 - vpclmulqdq $0x11,%xmm3,%xmm8,%xmm8 - vaesenc %xmm15,%xmm12,%xmm12 - movq %r13,80+8(%rsp) - vaesenc %xmm15,%xmm13,%xmm13 - movq %r12,88+8(%rsp) - vpxor %xmm5,%xmm6,%xmm6 - vaesenc %xmm15,%xmm14,%xmm14 - vpxor %xmm1,%xmm6,%xmm6 - - vmovups 112-128(%rcx),%xmm15 - vpslldq $8,%xmm6,%xmm5 - vpxor %xmm2,%xmm4,%xmm4 - vmovdqu 16(%r11),%xmm3 - - vaesenc %xmm15,%xmm9,%xmm9 - vpxor %xmm8,%xmm7,%xmm7 - vaesenc %xmm15,%xmm10,%xmm10 - vpxor %xmm5,%xmm4,%xmm4 - movbeq 24(%r14),%r13 - vaesenc %xmm15,%xmm11,%xmm11 - movbeq 16(%r14),%r12 - vpalignr $8,%xmm4,%xmm4,%xmm0 - vpclmulqdq $0x10,%xmm3,%xmm4,%xmm4 - movq %r13,96+8(%rsp) - vaesenc %xmm15,%xmm12,%xmm12 - movq %r12,104+8(%rsp) - vaesenc %xmm15,%xmm13,%xmm13 - vmovups 128-128(%rcx),%xmm1 - vaesenc %xmm15,%xmm14,%xmm14 - - vaesenc %xmm1,%xmm9,%xmm9 - vmovups 144-128(%rcx),%xmm15 - vaesenc %xmm1,%xmm10,%xmm10 - vpsrldq $8,%xmm6,%xmm6 - vaesenc %xmm1,%xmm11,%xmm11 - vpxor %xmm6,%xmm7,%xmm7 - vaesenc %xmm1,%xmm12,%xmm12 - vpxor %xmm0,%xmm4,%xmm4 - movbeq 8(%r14),%r13 - vaesenc %xmm1,%xmm13,%xmm13 - movbeq 0(%r14),%r12 - vaesenc %xmm1,%xmm14,%xmm14 - vmovups 160-128(%rcx),%xmm1 - cmpl $11,%ebp - jb L$enc_tail - - vaesenc %xmm15,%xmm9,%xmm9 - vaesenc %xmm15,%xmm10,%xmm10 - vaesenc %xmm15,%xmm11,%xmm11 - vaesenc %xmm15,%xmm12,%xmm12 - vaesenc %xmm15,%xmm13,%xmm13 - vaesenc %xmm15,%xmm14,%xmm14 - - vaesenc %xmm1,%xmm9,%xmm9 - vaesenc %xmm1,%xmm10,%xmm10 - vaesenc %xmm1,%xmm11,%xmm11 - vaesenc %xmm1,%xmm12,%xmm12 - vaesenc %xmm1,%xmm13,%xmm13 - vmovups 176-128(%rcx),%xmm15 - vaesenc %xmm1,%xmm14,%xmm14 - vmovups 192-128(%rcx),%xmm1 - - - vaesenc %xmm15,%xmm9,%xmm9 - vaesenc %xmm15,%xmm10,%xmm10 - vaesenc %xmm15,%xmm11,%xmm11 - vaesenc %xmm15,%xmm12,%xmm12 - vaesenc %xmm15,%xmm13,%xmm13 - vaesenc %xmm15,%xmm14,%xmm14 - - vaesenc %xmm1,%xmm9,%xmm9 - vaesenc %xmm1,%xmm10,%xmm10 - vaesenc %xmm1,%xmm11,%xmm11 - vaesenc %xmm1,%xmm12,%xmm12 - vaesenc %xmm1,%xmm13,%xmm13 - vmovups 208-128(%rcx),%xmm15 - vaesenc %xmm1,%xmm14,%xmm14 - vmovups 224-128(%rcx),%xmm1 - jmp L$enc_tail - -.p2align 5 -L$handle_ctr32: - vmovdqu (%r11),%xmm0 - vpshufb %xmm0,%xmm1,%xmm6 - vmovdqu 48(%r11),%xmm5 - vpaddd 64(%r11),%xmm6,%xmm10 - vpaddd %xmm5,%xmm6,%xmm11 - vmovdqu 0-32(%r9),%xmm3 - vpaddd %xmm5,%xmm10,%xmm12 - vpshufb %xmm0,%xmm10,%xmm10 - vpaddd %xmm5,%xmm11,%xmm13 - vpshufb %xmm0,%xmm11,%xmm11 - vpxor %xmm15,%xmm10,%xmm10 - vpaddd %xmm5,%xmm12,%xmm14 - vpshufb %xmm0,%xmm12,%xmm12 - vpxor %xmm15,%xmm11,%xmm11 - vpaddd %xmm5,%xmm13,%xmm1 - vpshufb %xmm0,%xmm13,%xmm13 - vpshufb %xmm0,%xmm14,%xmm14 - vpshufb %xmm0,%xmm1,%xmm1 - jmp L$resume_ctr32 - -.p2align 5 -L$enc_tail: - vaesenc %xmm15,%xmm9,%xmm9 - vmovdqu %xmm7,16+8(%rsp) - vpalignr $8,%xmm4,%xmm4,%xmm8 - vaesenc %xmm15,%xmm10,%xmm10 - vpclmulqdq $0x10,%xmm3,%xmm4,%xmm4 - vpxor 0(%rdi),%xmm1,%xmm2 - vaesenc %xmm15,%xmm11,%xmm11 - vpxor 16(%rdi),%xmm1,%xmm0 - vaesenc %xmm15,%xmm12,%xmm12 - vpxor 32(%rdi),%xmm1,%xmm5 - vaesenc %xmm15,%xmm13,%xmm13 - vpxor 48(%rdi),%xmm1,%xmm6 - vaesenc %xmm15,%xmm14,%xmm14 - vpxor 64(%rdi),%xmm1,%xmm7 - vpxor 80(%rdi),%xmm1,%xmm3 - vmovdqu (%r8),%xmm1 - - vaesenclast %xmm2,%xmm9,%xmm9 - vmovdqu 32(%r11),%xmm2 - vaesenclast %xmm0,%xmm10,%xmm10 - vpaddb %xmm2,%xmm1,%xmm0 - movq %r13,112+8(%rsp) - leaq 96(%rdi),%rdi - vaesenclast %xmm5,%xmm11,%xmm11 - vpaddb %xmm2,%xmm0,%xmm5 - movq %r12,120+8(%rsp) - leaq 96(%rsi),%rsi - vmovdqu 0-128(%rcx),%xmm15 - vaesenclast %xmm6,%xmm12,%xmm12 - vpaddb %xmm2,%xmm5,%xmm6 - vaesenclast %xmm7,%xmm13,%xmm13 - vpaddb %xmm2,%xmm6,%xmm7 - vaesenclast %xmm3,%xmm14,%xmm14 - vpaddb %xmm2,%xmm7,%xmm3 - - addq $0x60,%r10 - subq $0x6,%rdx - jc L$6x_done - - vmovups %xmm9,-96(%rsi) - vpxor %xmm15,%xmm1,%xmm9 - vmovups %xmm10,-80(%rsi) - vmovdqa %xmm0,%xmm10 - vmovups %xmm11,-64(%rsi) - vmovdqa %xmm5,%xmm11 - vmovups %xmm12,-48(%rsi) - vmovdqa %xmm6,%xmm12 - vmovups %xmm13,-32(%rsi) - vmovdqa %xmm7,%xmm13 - vmovups %xmm14,-16(%rsi) - vmovdqa %xmm3,%xmm14 - vmovdqu 32+8(%rsp),%xmm7 - jmp L$oop6x - -L$6x_done: - vpxor 16+8(%rsp),%xmm8,%xmm8 - vpxor %xmm4,%xmm8,%xmm8 - - .byte 0xf3,0xc3 - - -.globl _GFp_aesni_gcm_decrypt -.private_extern _GFp_aesni_gcm_decrypt - -.p2align 5 -_GFp_aesni_gcm_decrypt: - - xorq %r10,%r10 - - - - cmpq $0x60,%rdx - jb L$gcm_dec_abort - - leaq (%rsp),%rax - - pushq %rbx - - pushq %rbp - - pushq %r12 - - pushq %r13 - - pushq %r14 - - pushq %r15 - - vzeroupper - - vmovdqu (%r8),%xmm1 - addq $-128,%rsp - movl 12(%r8),%ebx - leaq L$bswap_mask(%rip),%r11 - leaq -128(%rcx),%r14 - movq $0xf80,%r15 - vmovdqu (%r9),%xmm8 - andq $-128,%rsp - vmovdqu (%r11),%xmm0 - leaq 128(%rcx),%rcx - leaq 32+32(%r9),%r9 - movl 240-128(%rcx),%ebp - vpshufb %xmm0,%xmm8,%xmm8 - - andq %r15,%r14 - andq %rsp,%r15 - subq %r14,%r15 - jc L$dec_no_key_aliasing - cmpq $768,%r15 - jnc L$dec_no_key_aliasing - subq %r15,%rsp -L$dec_no_key_aliasing: - - vmovdqu 80(%rdi),%xmm7 - leaq (%rdi),%r14 - vmovdqu 64(%rdi),%xmm4 - - - - - - - - leaq -192(%rdi,%rdx,1),%r15 - - vmovdqu 48(%rdi),%xmm5 - shrq $4,%rdx - xorq %r10,%r10 - vmovdqu 32(%rdi),%xmm6 - vpshufb %xmm0,%xmm7,%xmm7 - vmovdqu 16(%rdi),%xmm2 - vpshufb %xmm0,%xmm4,%xmm4 - vmovdqu (%rdi),%xmm3 - vpshufb %xmm0,%xmm5,%xmm5 - vmovdqu %xmm4,48(%rsp) - vpshufb %xmm0,%xmm6,%xmm6 - vmovdqu %xmm5,64(%rsp) - vpshufb %xmm0,%xmm2,%xmm2 - vmovdqu %xmm6,80(%rsp) - vpshufb %xmm0,%xmm3,%xmm3 - vmovdqu %xmm2,96(%rsp) - vmovdqu %xmm3,112(%rsp) - - call _aesni_ctr32_ghash_6x - - vmovups %xmm9,-96(%rsi) - vmovups %xmm10,-80(%rsi) - vmovups %xmm11,-64(%rsi) - vmovups %xmm12,-48(%rsi) - vmovups %xmm13,-32(%rsi) - vmovups %xmm14,-16(%rsi) - - vpshufb (%r11),%xmm8,%xmm8 - vmovdqu %xmm8,-64(%r9) - - vzeroupper - movq -48(%rax),%r15 - - movq -40(%rax),%r14 - - movq -32(%rax),%r13 - - movq -24(%rax),%r12 - - movq -16(%rax),%rbp - - movq -8(%rax),%rbx - - leaq (%rax),%rsp - -L$gcm_dec_abort: - movq %r10,%rax - .byte 0xf3,0xc3 - - - -.p2align 5 -_aesni_ctr32_6x: - - vmovdqu 0-128(%rcx),%xmm4 - vmovdqu 32(%r11),%xmm2 - leaq -1(%rbp),%r13 - vmovups 16-128(%rcx),%xmm15 - leaq 32-128(%rcx),%r12 - vpxor %xmm4,%xmm1,%xmm9 - addl $100663296,%ebx - jc L$handle_ctr32_2 - vpaddb %xmm2,%xmm1,%xmm10 - vpaddb %xmm2,%xmm10,%xmm11 - vpxor %xmm4,%xmm10,%xmm10 - vpaddb %xmm2,%xmm11,%xmm12 - vpxor %xmm4,%xmm11,%xmm11 - vpaddb %xmm2,%xmm12,%xmm13 - vpxor %xmm4,%xmm12,%xmm12 - vpaddb %xmm2,%xmm13,%xmm14 - vpxor %xmm4,%xmm13,%xmm13 - vpaddb %xmm2,%xmm14,%xmm1 - vpxor %xmm4,%xmm14,%xmm14 - jmp L$oop_ctr32 - -.p2align 4 -L$oop_ctr32: - vaesenc %xmm15,%xmm9,%xmm9 - vaesenc %xmm15,%xmm10,%xmm10 - vaesenc %xmm15,%xmm11,%xmm11 - vaesenc %xmm15,%xmm12,%xmm12 - vaesenc %xmm15,%xmm13,%xmm13 - vaesenc %xmm15,%xmm14,%xmm14 - vmovups (%r12),%xmm15 - leaq 16(%r12),%r12 - decl %r13d - jnz L$oop_ctr32 - - vmovdqu (%r12),%xmm3 - vaesenc %xmm15,%xmm9,%xmm9 - vpxor 0(%rdi),%xmm3,%xmm4 - vaesenc %xmm15,%xmm10,%xmm10 - vpxor 16(%rdi),%xmm3,%xmm5 - vaesenc %xmm15,%xmm11,%xmm11 - vpxor 32(%rdi),%xmm3,%xmm6 - vaesenc %xmm15,%xmm12,%xmm12 - vpxor 48(%rdi),%xmm3,%xmm8 - vaesenc %xmm15,%xmm13,%xmm13 - vpxor 64(%rdi),%xmm3,%xmm2 - vaesenc %xmm15,%xmm14,%xmm14 - vpxor 80(%rdi),%xmm3,%xmm3 - leaq 96(%rdi),%rdi - - vaesenclast %xmm4,%xmm9,%xmm9 - vaesenclast %xmm5,%xmm10,%xmm10 - vaesenclast %xmm6,%xmm11,%xmm11 - vaesenclast %xmm8,%xmm12,%xmm12 - vaesenclast %xmm2,%xmm13,%xmm13 - vaesenclast %xmm3,%xmm14,%xmm14 - vmovups %xmm9,0(%rsi) - vmovups %xmm10,16(%rsi) - vmovups %xmm11,32(%rsi) - vmovups %xmm12,48(%rsi) - vmovups %xmm13,64(%rsi) - vmovups %xmm14,80(%rsi) - leaq 96(%rsi),%rsi - - .byte 0xf3,0xc3 -.p2align 5 -L$handle_ctr32_2: - vpshufb %xmm0,%xmm1,%xmm6 - vmovdqu 48(%r11),%xmm5 - vpaddd 64(%r11),%xmm6,%xmm10 - vpaddd %xmm5,%xmm6,%xmm11 - vpaddd %xmm5,%xmm10,%xmm12 - vpshufb %xmm0,%xmm10,%xmm10 - vpaddd %xmm5,%xmm11,%xmm13 - vpshufb %xmm0,%xmm11,%xmm11 - vpxor %xmm4,%xmm10,%xmm10 - vpaddd %xmm5,%xmm12,%xmm14 - vpshufb %xmm0,%xmm12,%xmm12 - vpxor %xmm4,%xmm11,%xmm11 - vpaddd %xmm5,%xmm13,%xmm1 - vpshufb %xmm0,%xmm13,%xmm13 - vpxor %xmm4,%xmm12,%xmm12 - vpshufb %xmm0,%xmm14,%xmm14 - vpxor %xmm4,%xmm13,%xmm13 - vpshufb %xmm0,%xmm1,%xmm1 - vpxor %xmm4,%xmm14,%xmm14 - jmp L$oop_ctr32 - - - -.globl _GFp_aesni_gcm_encrypt -.private_extern _GFp_aesni_gcm_encrypt - -.p2align 5 -_GFp_aesni_gcm_encrypt: - - xorq %r10,%r10 - - - - - cmpq $288,%rdx - jb L$gcm_enc_abort - - leaq (%rsp),%rax - - pushq %rbx - - pushq %rbp - - pushq %r12 - - pushq %r13 - - pushq %r14 - - pushq %r15 - - vzeroupper - - vmovdqu (%r8),%xmm1 - addq $-128,%rsp - movl 12(%r8),%ebx - leaq L$bswap_mask(%rip),%r11 - leaq -128(%rcx),%r14 - movq $0xf80,%r15 - leaq 128(%rcx),%rcx - vmovdqu (%r11),%xmm0 - andq $-128,%rsp - movl 240-128(%rcx),%ebp - - andq %r15,%r14 - andq %rsp,%r15 - subq %r14,%r15 - jc L$enc_no_key_aliasing - cmpq $768,%r15 - jnc L$enc_no_key_aliasing - subq %r15,%rsp -L$enc_no_key_aliasing: - - leaq (%rsi),%r14 - - - - - - - - - leaq -192(%rsi,%rdx,1),%r15 - - shrq $4,%rdx - - call _aesni_ctr32_6x - vpshufb %xmm0,%xmm9,%xmm8 - vpshufb %xmm0,%xmm10,%xmm2 - vmovdqu %xmm8,112(%rsp) - vpshufb %xmm0,%xmm11,%xmm4 - vmovdqu %xmm2,96(%rsp) - vpshufb %xmm0,%xmm12,%xmm5 - vmovdqu %xmm4,80(%rsp) - vpshufb %xmm0,%xmm13,%xmm6 - vmovdqu %xmm5,64(%rsp) - vpshufb %xmm0,%xmm14,%xmm7 - vmovdqu %xmm6,48(%rsp) - - call _aesni_ctr32_6x - - vmovdqu (%r9),%xmm8 - leaq 32+32(%r9),%r9 - subq $12,%rdx - movq $192,%r10 - vpshufb %xmm0,%xmm8,%xmm8 - - call _aesni_ctr32_ghash_6x - vmovdqu 32(%rsp),%xmm7 - vmovdqu (%r11),%xmm0 - vmovdqu 0-32(%r9),%xmm3 - vpunpckhqdq %xmm7,%xmm7,%xmm1 - vmovdqu 32-32(%r9),%xmm15 - vmovups %xmm9,-96(%rsi) - vpshufb %xmm0,%xmm9,%xmm9 - vpxor %xmm7,%xmm1,%xmm1 - vmovups %xmm10,-80(%rsi) - vpshufb %xmm0,%xmm10,%xmm10 - vmovups %xmm11,-64(%rsi) - vpshufb %xmm0,%xmm11,%xmm11 - vmovups %xmm12,-48(%rsi) - vpshufb %xmm0,%xmm12,%xmm12 - vmovups %xmm13,-32(%rsi) - vpshufb %xmm0,%xmm13,%xmm13 - vmovups %xmm14,-16(%rsi) - vpshufb %xmm0,%xmm14,%xmm14 - vmovdqu %xmm9,16(%rsp) - vmovdqu 48(%rsp),%xmm6 - vmovdqu 16-32(%r9),%xmm0 - vpunpckhqdq %xmm6,%xmm6,%xmm2 - vpclmulqdq $0x00,%xmm3,%xmm7,%xmm5 - vpxor %xmm6,%xmm2,%xmm2 - vpclmulqdq $0x11,%xmm3,%xmm7,%xmm7 - vpclmulqdq $0x00,%xmm15,%xmm1,%xmm1 - - vmovdqu 64(%rsp),%xmm9 - vpclmulqdq $0x00,%xmm0,%xmm6,%xmm4 - vmovdqu 48-32(%r9),%xmm3 - vpxor %xmm5,%xmm4,%xmm4 - vpunpckhqdq %xmm9,%xmm9,%xmm5 - vpclmulqdq $0x11,%xmm0,%xmm6,%xmm6 - vpxor %xmm9,%xmm5,%xmm5 - vpxor %xmm7,%xmm6,%xmm6 - vpclmulqdq $0x10,%xmm15,%xmm2,%xmm2 - vmovdqu 80-32(%r9),%xmm15 - vpxor %xmm1,%xmm2,%xmm2 - - vmovdqu 80(%rsp),%xmm1 - vpclmulqdq $0x00,%xmm3,%xmm9,%xmm7 - vmovdqu 64-32(%r9),%xmm0 - vpxor %xmm4,%xmm7,%xmm7 - vpunpckhqdq %xmm1,%xmm1,%xmm4 - vpclmulqdq $0x11,%xmm3,%xmm9,%xmm9 - vpxor %xmm1,%xmm4,%xmm4 - vpxor %xmm6,%xmm9,%xmm9 - vpclmulqdq $0x00,%xmm15,%xmm5,%xmm5 - vpxor %xmm2,%xmm5,%xmm5 - - vmovdqu 96(%rsp),%xmm2 - vpclmulqdq $0x00,%xmm0,%xmm1,%xmm6 - vmovdqu 96-32(%r9),%xmm3 - vpxor %xmm7,%xmm6,%xmm6 - vpunpckhqdq %xmm2,%xmm2,%xmm7 - vpclmulqdq $0x11,%xmm0,%xmm1,%xmm1 - vpxor %xmm2,%xmm7,%xmm7 - vpxor %xmm9,%xmm1,%xmm1 - vpclmulqdq $0x10,%xmm15,%xmm4,%xmm4 - vmovdqu 128-32(%r9),%xmm15 - vpxor %xmm5,%xmm4,%xmm4 - - vpxor 112(%rsp),%xmm8,%xmm8 - vpclmulqdq $0x00,%xmm3,%xmm2,%xmm5 - vmovdqu 112-32(%r9),%xmm0 - vpunpckhqdq %xmm8,%xmm8,%xmm9 - vpxor %xmm6,%xmm5,%xmm5 - vpclmulqdq $0x11,%xmm3,%xmm2,%xmm2 - vpxor %xmm8,%xmm9,%xmm9 - vpxor %xmm1,%xmm2,%xmm2 - vpclmulqdq $0x00,%xmm15,%xmm7,%xmm7 - vpxor %xmm4,%xmm7,%xmm4 - - vpclmulqdq $0x00,%xmm0,%xmm8,%xmm6 - vmovdqu 0-32(%r9),%xmm3 - vpunpckhqdq %xmm14,%xmm14,%xmm1 - vpclmulqdq $0x11,%xmm0,%xmm8,%xmm8 - vpxor %xmm14,%xmm1,%xmm1 - vpxor %xmm5,%xmm6,%xmm5 - vpclmulqdq $0x10,%xmm15,%xmm9,%xmm9 - vmovdqu 32-32(%r9),%xmm15 - vpxor %xmm2,%xmm8,%xmm7 - vpxor %xmm4,%xmm9,%xmm6 - - vmovdqu 16-32(%r9),%xmm0 - vpxor %xmm5,%xmm7,%xmm9 - vpclmulqdq $0x00,%xmm3,%xmm14,%xmm4 - vpxor %xmm9,%xmm6,%xmm6 - vpunpckhqdq %xmm13,%xmm13,%xmm2 - vpclmulqdq $0x11,%xmm3,%xmm14,%xmm14 - vpxor %xmm13,%xmm2,%xmm2 - vpslldq $8,%xmm6,%xmm9 - vpclmulqdq $0x00,%xmm15,%xmm1,%xmm1 - vpxor %xmm9,%xmm5,%xmm8 - vpsrldq $8,%xmm6,%xmm6 - vpxor %xmm6,%xmm7,%xmm7 - - vpclmulqdq $0x00,%xmm0,%xmm13,%xmm5 - vmovdqu 48-32(%r9),%xmm3 - vpxor %xmm4,%xmm5,%xmm5 - vpunpckhqdq %xmm12,%xmm12,%xmm9 - vpclmulqdq $0x11,%xmm0,%xmm13,%xmm13 - vpxor %xmm12,%xmm9,%xmm9 - vpxor %xmm14,%xmm13,%xmm13 - vpalignr $8,%xmm8,%xmm8,%xmm14 - vpclmulqdq $0x10,%xmm15,%xmm2,%xmm2 - vmovdqu 80-32(%r9),%xmm15 - vpxor %xmm1,%xmm2,%xmm2 - - vpclmulqdq $0x00,%xmm3,%xmm12,%xmm4 - vmovdqu 64-32(%r9),%xmm0 - vpxor %xmm5,%xmm4,%xmm4 - vpunpckhqdq %xmm11,%xmm11,%xmm1 - vpclmulqdq $0x11,%xmm3,%xmm12,%xmm12 - vpxor %xmm11,%xmm1,%xmm1 - vpxor %xmm13,%xmm12,%xmm12 - vxorps 16(%rsp),%xmm7,%xmm7 - vpclmulqdq $0x00,%xmm15,%xmm9,%xmm9 - vpxor %xmm2,%xmm9,%xmm9 - - vpclmulqdq $0x10,16(%r11),%xmm8,%xmm8 - vxorps %xmm14,%xmm8,%xmm8 - - vpclmulqdq $0x00,%xmm0,%xmm11,%xmm5 - vmovdqu 96-32(%r9),%xmm3 - vpxor %xmm4,%xmm5,%xmm5 - vpunpckhqdq %xmm10,%xmm10,%xmm2 - vpclmulqdq $0x11,%xmm0,%xmm11,%xmm11 - vpxor %xmm10,%xmm2,%xmm2 - vpalignr $8,%xmm8,%xmm8,%xmm14 - vpxor %xmm12,%xmm11,%xmm11 - vpclmulqdq $0x10,%xmm15,%xmm1,%xmm1 - vmovdqu 128-32(%r9),%xmm15 - vpxor %xmm9,%xmm1,%xmm1 - - vxorps %xmm7,%xmm14,%xmm14 - vpclmulqdq $0x10,16(%r11),%xmm8,%xmm8 - vxorps %xmm14,%xmm8,%xmm8 - - vpclmulqdq $0x00,%xmm3,%xmm10,%xmm4 - vmovdqu 112-32(%r9),%xmm0 - vpxor %xmm5,%xmm4,%xmm4 - vpunpckhqdq %xmm8,%xmm8,%xmm9 - vpclmulqdq $0x11,%xmm3,%xmm10,%xmm10 - vpxor %xmm8,%xmm9,%xmm9 - vpxor %xmm11,%xmm10,%xmm10 - vpclmulqdq $0x00,%xmm15,%xmm2,%xmm2 - vpxor %xmm1,%xmm2,%xmm2 - - vpclmulqdq $0x00,%xmm0,%xmm8,%xmm5 - vpclmulqdq $0x11,%xmm0,%xmm8,%xmm7 - vpxor %xmm4,%xmm5,%xmm5 - vpclmulqdq $0x10,%xmm15,%xmm9,%xmm6 - vpxor %xmm10,%xmm7,%xmm7 - vpxor %xmm2,%xmm6,%xmm6 - - vpxor %xmm5,%xmm7,%xmm4 - vpxor %xmm4,%xmm6,%xmm6 - vpslldq $8,%xmm6,%xmm1 - vmovdqu 16(%r11),%xmm3 - vpsrldq $8,%xmm6,%xmm6 - vpxor %xmm1,%xmm5,%xmm8 - vpxor %xmm6,%xmm7,%xmm7 - - vpalignr $8,%xmm8,%xmm8,%xmm2 - vpclmulqdq $0x10,%xmm3,%xmm8,%xmm8 - vpxor %xmm2,%xmm8,%xmm8 - - vpalignr $8,%xmm8,%xmm8,%xmm2 - vpclmulqdq $0x10,%xmm3,%xmm8,%xmm8 - vpxor %xmm7,%xmm2,%xmm2 - vpxor %xmm2,%xmm8,%xmm8 - vpshufb (%r11),%xmm8,%xmm8 - vmovdqu %xmm8,-64(%r9) - - vzeroupper - movq -48(%rax),%r15 - - movq -40(%rax),%r14 - - movq -32(%rax),%r13 - - movq -24(%rax),%r12 - - movq -16(%rax),%rbp - - movq -8(%rax),%rbx - - leaq (%rax),%rsp - -L$gcm_enc_abort: - movq %r10,%rax - .byte 0xf3,0xc3 - - -.p2align 6 -L$bswap_mask: -.byte 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 -L$poly: -.byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xc2 -L$one_msb: -.byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 -L$two_lsb: -.byte 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -L$one_lsb: -.byte 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -.byte 65,69,83,45,78,73,32,71,67,77,32,109,111,100,117,108,101,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 -.p2align 6 -#endif Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/aesni-gcm-x86_64-nasm.obj and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/aesni-gcm-x86_64-nasm.obj differ diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/aesni-x86_64-elf.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/aesni-x86_64-elf.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/aesni-x86_64-elf.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/aesni-x86_64-elf.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,1181 +0,0 @@ -# This file is generated from a similarly-named Perl script in the BoringSSL -# source tree. Do not edit by hand. - -#if defined(__has_feature) -#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) -#define OPENSSL_NO_ASM -#endif -#endif - -#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) -.text -.extern GFp_ia32cap_P -.hidden GFp_ia32cap_P -.globl GFp_aes_hw_encrypt -.hidden GFp_aes_hw_encrypt -.type GFp_aes_hw_encrypt,@function -.align 16 -GFp_aes_hw_encrypt: -.cfi_startproc - movups (%rdi),%xmm2 - movl 240(%rdx),%eax - movups (%rdx),%xmm0 - movups 16(%rdx),%xmm1 - leaq 32(%rdx),%rdx - xorps %xmm0,%xmm2 -.Loop_enc1_1: -.byte 102,15,56,220,209 - decl %eax - movups (%rdx),%xmm1 - leaq 16(%rdx),%rdx - jnz .Loop_enc1_1 -.byte 102,15,56,221,209 - pxor %xmm0,%xmm0 - pxor %xmm1,%xmm1 - movups %xmm2,(%rsi) - pxor %xmm2,%xmm2 - .byte 0xf3,0xc3 -.cfi_endproc -.size GFp_aes_hw_encrypt,.-GFp_aes_hw_encrypt -.type _aesni_encrypt2,@function -.align 16 -_aesni_encrypt2: -.cfi_startproc - movups (%rcx),%xmm0 - shll $4,%eax - movups 16(%rcx),%xmm1 - xorps %xmm0,%xmm2 - xorps %xmm0,%xmm3 - movups 32(%rcx),%xmm0 - leaq 32(%rcx,%rax,1),%rcx - negq %rax - addq $16,%rax - -.Lenc_loop2: -.byte 102,15,56,220,209 -.byte 102,15,56,220,217 - movups (%rcx,%rax,1),%xmm1 - addq $32,%rax -.byte 102,15,56,220,208 -.byte 102,15,56,220,216 - movups -16(%rcx,%rax,1),%xmm0 - jnz .Lenc_loop2 - -.byte 102,15,56,220,209 -.byte 102,15,56,220,217 -.byte 102,15,56,221,208 -.byte 102,15,56,221,216 - .byte 0xf3,0xc3 -.cfi_endproc -.size _aesni_encrypt2,.-_aesni_encrypt2 -.type _aesni_encrypt3,@function -.align 16 -_aesni_encrypt3: -.cfi_startproc - movups (%rcx),%xmm0 - shll $4,%eax - movups 16(%rcx),%xmm1 - xorps %xmm0,%xmm2 - xorps %xmm0,%xmm3 - xorps %xmm0,%xmm4 - movups 32(%rcx),%xmm0 - leaq 32(%rcx,%rax,1),%rcx - negq %rax - addq $16,%rax - -.Lenc_loop3: -.byte 102,15,56,220,209 -.byte 102,15,56,220,217 -.byte 102,15,56,220,225 - movups (%rcx,%rax,1),%xmm1 - addq $32,%rax -.byte 102,15,56,220,208 -.byte 102,15,56,220,216 -.byte 102,15,56,220,224 - movups -16(%rcx,%rax,1),%xmm0 - jnz .Lenc_loop3 - -.byte 102,15,56,220,209 -.byte 102,15,56,220,217 -.byte 102,15,56,220,225 -.byte 102,15,56,221,208 -.byte 102,15,56,221,216 -.byte 102,15,56,221,224 - .byte 0xf3,0xc3 -.cfi_endproc -.size _aesni_encrypt3,.-_aesni_encrypt3 -.type _aesni_encrypt4,@function -.align 16 -_aesni_encrypt4: -.cfi_startproc - movups (%rcx),%xmm0 - shll $4,%eax - movups 16(%rcx),%xmm1 - xorps %xmm0,%xmm2 - xorps %xmm0,%xmm3 - xorps %xmm0,%xmm4 - xorps %xmm0,%xmm5 - movups 32(%rcx),%xmm0 - leaq 32(%rcx,%rax,1),%rcx - negq %rax -.byte 0x0f,0x1f,0x00 - addq $16,%rax - -.Lenc_loop4: -.byte 102,15,56,220,209 -.byte 102,15,56,220,217 -.byte 102,15,56,220,225 -.byte 102,15,56,220,233 - movups (%rcx,%rax,1),%xmm1 - addq $32,%rax -.byte 102,15,56,220,208 -.byte 102,15,56,220,216 -.byte 102,15,56,220,224 -.byte 102,15,56,220,232 - movups -16(%rcx,%rax,1),%xmm0 - jnz .Lenc_loop4 - -.byte 102,15,56,220,209 -.byte 102,15,56,220,217 -.byte 102,15,56,220,225 -.byte 102,15,56,220,233 -.byte 102,15,56,221,208 -.byte 102,15,56,221,216 -.byte 102,15,56,221,224 -.byte 102,15,56,221,232 - .byte 0xf3,0xc3 -.cfi_endproc -.size _aesni_encrypt4,.-_aesni_encrypt4 -.type _aesni_encrypt6,@function -.align 16 -_aesni_encrypt6: -.cfi_startproc - movups (%rcx),%xmm0 - shll $4,%eax - movups 16(%rcx),%xmm1 - xorps %xmm0,%xmm2 - pxor %xmm0,%xmm3 - pxor %xmm0,%xmm4 -.byte 102,15,56,220,209 - leaq 32(%rcx,%rax,1),%rcx - negq %rax -.byte 102,15,56,220,217 - pxor %xmm0,%xmm5 - pxor %xmm0,%xmm6 -.byte 102,15,56,220,225 - pxor %xmm0,%xmm7 - movups (%rcx,%rax,1),%xmm0 - addq $16,%rax - jmp .Lenc_loop6_enter -.align 16 -.Lenc_loop6: -.byte 102,15,56,220,209 -.byte 102,15,56,220,217 -.byte 102,15,56,220,225 -.Lenc_loop6_enter: -.byte 102,15,56,220,233 -.byte 102,15,56,220,241 -.byte 102,15,56,220,249 - movups (%rcx,%rax,1),%xmm1 - addq $32,%rax -.byte 102,15,56,220,208 -.byte 102,15,56,220,216 -.byte 102,15,56,220,224 -.byte 102,15,56,220,232 -.byte 102,15,56,220,240 -.byte 102,15,56,220,248 - movups -16(%rcx,%rax,1),%xmm0 - jnz .Lenc_loop6 - -.byte 102,15,56,220,209 -.byte 102,15,56,220,217 -.byte 102,15,56,220,225 -.byte 102,15,56,220,233 -.byte 102,15,56,220,241 -.byte 102,15,56,220,249 -.byte 102,15,56,221,208 -.byte 102,15,56,221,216 -.byte 102,15,56,221,224 -.byte 102,15,56,221,232 -.byte 102,15,56,221,240 -.byte 102,15,56,221,248 - .byte 0xf3,0xc3 -.cfi_endproc -.size _aesni_encrypt6,.-_aesni_encrypt6 -.type _aesni_encrypt8,@function -.align 16 -_aesni_encrypt8: -.cfi_startproc - movups (%rcx),%xmm0 - shll $4,%eax - movups 16(%rcx),%xmm1 - xorps %xmm0,%xmm2 - xorps %xmm0,%xmm3 - pxor %xmm0,%xmm4 - pxor %xmm0,%xmm5 - pxor %xmm0,%xmm6 - leaq 32(%rcx,%rax,1),%rcx - negq %rax -.byte 102,15,56,220,209 - pxor %xmm0,%xmm7 - pxor %xmm0,%xmm8 -.byte 102,15,56,220,217 - pxor %xmm0,%xmm9 - movups (%rcx,%rax,1),%xmm0 - addq $16,%rax - jmp .Lenc_loop8_inner -.align 16 -.Lenc_loop8: -.byte 102,15,56,220,209 -.byte 102,15,56,220,217 -.Lenc_loop8_inner: -.byte 102,15,56,220,225 -.byte 102,15,56,220,233 -.byte 102,15,56,220,241 -.byte 102,15,56,220,249 -.byte 102,68,15,56,220,193 -.byte 102,68,15,56,220,201 -.Lenc_loop8_enter: - movups (%rcx,%rax,1),%xmm1 - addq $32,%rax -.byte 102,15,56,220,208 -.byte 102,15,56,220,216 -.byte 102,15,56,220,224 -.byte 102,15,56,220,232 -.byte 102,15,56,220,240 -.byte 102,15,56,220,248 -.byte 102,68,15,56,220,192 -.byte 102,68,15,56,220,200 - movups -16(%rcx,%rax,1),%xmm0 - jnz .Lenc_loop8 - -.byte 102,15,56,220,209 -.byte 102,15,56,220,217 -.byte 102,15,56,220,225 -.byte 102,15,56,220,233 -.byte 102,15,56,220,241 -.byte 102,15,56,220,249 -.byte 102,68,15,56,220,193 -.byte 102,68,15,56,220,201 -.byte 102,15,56,221,208 -.byte 102,15,56,221,216 -.byte 102,15,56,221,224 -.byte 102,15,56,221,232 -.byte 102,15,56,221,240 -.byte 102,15,56,221,248 -.byte 102,68,15,56,221,192 -.byte 102,68,15,56,221,200 - .byte 0xf3,0xc3 -.cfi_endproc -.size _aesni_encrypt8,.-_aesni_encrypt8 -.globl GFp_aes_hw_ctr32_encrypt_blocks -.hidden GFp_aes_hw_ctr32_encrypt_blocks -.type GFp_aes_hw_ctr32_encrypt_blocks,@function -.align 16 -GFp_aes_hw_ctr32_encrypt_blocks: -.cfi_startproc - cmpq $1,%rdx - jne .Lctr32_bulk - - - - movups (%r8),%xmm2 - movups (%rdi),%xmm3 - movl 240(%rcx),%edx - movups (%rcx),%xmm0 - movups 16(%rcx),%xmm1 - leaq 32(%rcx),%rcx - xorps %xmm0,%xmm2 -.Loop_enc1_2: -.byte 102,15,56,220,209 - decl %edx - movups (%rcx),%xmm1 - leaq 16(%rcx),%rcx - jnz .Loop_enc1_2 -.byte 102,15,56,221,209 - pxor %xmm0,%xmm0 - pxor %xmm1,%xmm1 - xorps %xmm3,%xmm2 - pxor %xmm3,%xmm3 - movups %xmm2,(%rsi) - xorps %xmm2,%xmm2 - jmp .Lctr32_epilogue - -.align 16 -.Lctr32_bulk: - leaq (%rsp),%r11 -.cfi_def_cfa_register %r11 - pushq %rbp -.cfi_offset %rbp,-16 - subq $128,%rsp - andq $-16,%rsp - - - - - movdqu (%r8),%xmm2 - movdqu (%rcx),%xmm0 - movl 12(%r8),%r8d - pxor %xmm0,%xmm2 - movl 12(%rcx),%ebp - movdqa %xmm2,0(%rsp) - bswapl %r8d - movdqa %xmm2,%xmm3 - movdqa %xmm2,%xmm4 - movdqa %xmm2,%xmm5 - movdqa %xmm2,64(%rsp) - movdqa %xmm2,80(%rsp) - movdqa %xmm2,96(%rsp) - movq %rdx,%r10 - movdqa %xmm2,112(%rsp) - - leaq 1(%r8),%rax - leaq 2(%r8),%rdx - bswapl %eax - bswapl %edx - xorl %ebp,%eax - xorl %ebp,%edx -.byte 102,15,58,34,216,3 - leaq 3(%r8),%rax - movdqa %xmm3,16(%rsp) -.byte 102,15,58,34,226,3 - bswapl %eax - movq %r10,%rdx - leaq 4(%r8),%r10 - movdqa %xmm4,32(%rsp) - xorl %ebp,%eax - bswapl %r10d -.byte 102,15,58,34,232,3 - xorl %ebp,%r10d - movdqa %xmm5,48(%rsp) - leaq 5(%r8),%r9 - movl %r10d,64+12(%rsp) - bswapl %r9d - leaq 6(%r8),%r10 - movl 240(%rcx),%eax - xorl %ebp,%r9d - bswapl %r10d - movl %r9d,80+12(%rsp) - xorl %ebp,%r10d - leaq 7(%r8),%r9 - movl %r10d,96+12(%rsp) - bswapl %r9d - leaq GFp_ia32cap_P(%rip),%r10 - movl 4(%r10),%r10d - xorl %ebp,%r9d - andl $71303168,%r10d - movl %r9d,112+12(%rsp) - - movups 16(%rcx),%xmm1 - - movdqa 64(%rsp),%xmm6 - movdqa 80(%rsp),%xmm7 - - cmpq $8,%rdx - jb .Lctr32_tail - - subq $6,%rdx - cmpl $4194304,%r10d - je .Lctr32_6x - - leaq 128(%rcx),%rcx - subq $2,%rdx - jmp .Lctr32_loop8 - -.align 16 -.Lctr32_6x: - shll $4,%eax - movl $48,%r10d - bswapl %ebp - leaq 32(%rcx,%rax,1),%rcx - subq %rax,%r10 - jmp .Lctr32_loop6 - -.align 16 -.Lctr32_loop6: - addl $6,%r8d - movups -48(%rcx,%r10,1),%xmm0 -.byte 102,15,56,220,209 - movl %r8d,%eax - xorl %ebp,%eax -.byte 102,15,56,220,217 -.byte 0x0f,0x38,0xf1,0x44,0x24,12 - leal 1(%r8),%eax -.byte 102,15,56,220,225 - xorl %ebp,%eax -.byte 0x0f,0x38,0xf1,0x44,0x24,28 -.byte 102,15,56,220,233 - leal 2(%r8),%eax - xorl %ebp,%eax -.byte 102,15,56,220,241 -.byte 0x0f,0x38,0xf1,0x44,0x24,44 - leal 3(%r8),%eax -.byte 102,15,56,220,249 - movups -32(%rcx,%r10,1),%xmm1 - xorl %ebp,%eax - -.byte 102,15,56,220,208 -.byte 0x0f,0x38,0xf1,0x44,0x24,60 - leal 4(%r8),%eax -.byte 102,15,56,220,216 - xorl %ebp,%eax -.byte 0x0f,0x38,0xf1,0x44,0x24,76 -.byte 102,15,56,220,224 - leal 5(%r8),%eax - xorl %ebp,%eax -.byte 102,15,56,220,232 -.byte 0x0f,0x38,0xf1,0x44,0x24,92 - movq %r10,%rax -.byte 102,15,56,220,240 -.byte 102,15,56,220,248 - movups -16(%rcx,%r10,1),%xmm0 - - call .Lenc_loop6 - - movdqu (%rdi),%xmm8 - movdqu 16(%rdi),%xmm9 - movdqu 32(%rdi),%xmm10 - movdqu 48(%rdi),%xmm11 - movdqu 64(%rdi),%xmm12 - movdqu 80(%rdi),%xmm13 - leaq 96(%rdi),%rdi - movups -64(%rcx,%r10,1),%xmm1 - pxor %xmm2,%xmm8 - movaps 0(%rsp),%xmm2 - pxor %xmm3,%xmm9 - movaps 16(%rsp),%xmm3 - pxor %xmm4,%xmm10 - movaps 32(%rsp),%xmm4 - pxor %xmm5,%xmm11 - movaps 48(%rsp),%xmm5 - pxor %xmm6,%xmm12 - movaps 64(%rsp),%xmm6 - pxor %xmm7,%xmm13 - movaps 80(%rsp),%xmm7 - movdqu %xmm8,(%rsi) - movdqu %xmm9,16(%rsi) - movdqu %xmm10,32(%rsi) - movdqu %xmm11,48(%rsi) - movdqu %xmm12,64(%rsi) - movdqu %xmm13,80(%rsi) - leaq 96(%rsi),%rsi - - subq $6,%rdx - jnc .Lctr32_loop6 - - addq $6,%rdx - jz .Lctr32_done - - leal -48(%r10),%eax - leaq -80(%rcx,%r10,1),%rcx - negl %eax - shrl $4,%eax - jmp .Lctr32_tail - -.align 32 -.Lctr32_loop8: - addl $8,%r8d - movdqa 96(%rsp),%xmm8 -.byte 102,15,56,220,209 - movl %r8d,%r9d - movdqa 112(%rsp),%xmm9 -.byte 102,15,56,220,217 - bswapl %r9d - movups 32-128(%rcx),%xmm0 -.byte 102,15,56,220,225 - xorl %ebp,%r9d - nop -.byte 102,15,56,220,233 - movl %r9d,0+12(%rsp) - leaq 1(%r8),%r9 -.byte 102,15,56,220,241 -.byte 102,15,56,220,249 -.byte 102,68,15,56,220,193 -.byte 102,68,15,56,220,201 - movups 48-128(%rcx),%xmm1 - bswapl %r9d -.byte 102,15,56,220,208 -.byte 102,15,56,220,216 - xorl %ebp,%r9d -.byte 0x66,0x90 -.byte 102,15,56,220,224 -.byte 102,15,56,220,232 - movl %r9d,16+12(%rsp) - leaq 2(%r8),%r9 -.byte 102,15,56,220,240 -.byte 102,15,56,220,248 -.byte 102,68,15,56,220,192 -.byte 102,68,15,56,220,200 - movups 64-128(%rcx),%xmm0 - bswapl %r9d -.byte 102,15,56,220,209 -.byte 102,15,56,220,217 - xorl %ebp,%r9d -.byte 0x66,0x90 -.byte 102,15,56,220,225 -.byte 102,15,56,220,233 - movl %r9d,32+12(%rsp) - leaq 3(%r8),%r9 -.byte 102,15,56,220,241 -.byte 102,15,56,220,249 -.byte 102,68,15,56,220,193 -.byte 102,68,15,56,220,201 - movups 80-128(%rcx),%xmm1 - bswapl %r9d -.byte 102,15,56,220,208 -.byte 102,15,56,220,216 - xorl %ebp,%r9d -.byte 0x66,0x90 -.byte 102,15,56,220,224 -.byte 102,15,56,220,232 - movl %r9d,48+12(%rsp) - leaq 4(%r8),%r9 -.byte 102,15,56,220,240 -.byte 102,15,56,220,248 -.byte 102,68,15,56,220,192 -.byte 102,68,15,56,220,200 - movups 96-128(%rcx),%xmm0 - bswapl %r9d -.byte 102,15,56,220,209 -.byte 102,15,56,220,217 - xorl %ebp,%r9d -.byte 0x66,0x90 -.byte 102,15,56,220,225 -.byte 102,15,56,220,233 - movl %r9d,64+12(%rsp) - leaq 5(%r8),%r9 -.byte 102,15,56,220,241 -.byte 102,15,56,220,249 -.byte 102,68,15,56,220,193 -.byte 102,68,15,56,220,201 - movups 112-128(%rcx),%xmm1 - bswapl %r9d -.byte 102,15,56,220,208 -.byte 102,15,56,220,216 - xorl %ebp,%r9d -.byte 0x66,0x90 -.byte 102,15,56,220,224 -.byte 102,15,56,220,232 - movl %r9d,80+12(%rsp) - leaq 6(%r8),%r9 -.byte 102,15,56,220,240 -.byte 102,15,56,220,248 -.byte 102,68,15,56,220,192 -.byte 102,68,15,56,220,200 - movups 128-128(%rcx),%xmm0 - bswapl %r9d -.byte 102,15,56,220,209 -.byte 102,15,56,220,217 - xorl %ebp,%r9d -.byte 0x66,0x90 -.byte 102,15,56,220,225 -.byte 102,15,56,220,233 - movl %r9d,96+12(%rsp) - leaq 7(%r8),%r9 -.byte 102,15,56,220,241 -.byte 102,15,56,220,249 -.byte 102,68,15,56,220,193 -.byte 102,68,15,56,220,201 - movups 144-128(%rcx),%xmm1 - bswapl %r9d -.byte 102,15,56,220,208 -.byte 102,15,56,220,216 -.byte 102,15,56,220,224 - xorl %ebp,%r9d - movdqu 0(%rdi),%xmm10 -.byte 102,15,56,220,232 - movl %r9d,112+12(%rsp) - cmpl $11,%eax -.byte 102,15,56,220,240 -.byte 102,15,56,220,248 -.byte 102,68,15,56,220,192 -.byte 102,68,15,56,220,200 - movups 160-128(%rcx),%xmm0 - - jb .Lctr32_enc_done - -.byte 102,15,56,220,209 -.byte 102,15,56,220,217 -.byte 102,15,56,220,225 -.byte 102,15,56,220,233 -.byte 102,15,56,220,241 -.byte 102,15,56,220,249 -.byte 102,68,15,56,220,193 -.byte 102,68,15,56,220,201 - movups 176-128(%rcx),%xmm1 - -.byte 102,15,56,220,208 -.byte 102,15,56,220,216 -.byte 102,15,56,220,224 -.byte 102,15,56,220,232 -.byte 102,15,56,220,240 -.byte 102,15,56,220,248 -.byte 102,68,15,56,220,192 -.byte 102,68,15,56,220,200 - movups 192-128(%rcx),%xmm0 - - - -.byte 102,15,56,220,209 -.byte 102,15,56,220,217 -.byte 102,15,56,220,225 -.byte 102,15,56,220,233 -.byte 102,15,56,220,241 -.byte 102,15,56,220,249 -.byte 102,68,15,56,220,193 -.byte 102,68,15,56,220,201 - movups 208-128(%rcx),%xmm1 - -.byte 102,15,56,220,208 -.byte 102,15,56,220,216 -.byte 102,15,56,220,224 -.byte 102,15,56,220,232 -.byte 102,15,56,220,240 -.byte 102,15,56,220,248 -.byte 102,68,15,56,220,192 -.byte 102,68,15,56,220,200 - movups 224-128(%rcx),%xmm0 - jmp .Lctr32_enc_done - -.align 16 -.Lctr32_enc_done: - movdqu 16(%rdi),%xmm11 - pxor %xmm0,%xmm10 - movdqu 32(%rdi),%xmm12 - pxor %xmm0,%xmm11 - movdqu 48(%rdi),%xmm13 - pxor %xmm0,%xmm12 - movdqu 64(%rdi),%xmm14 - pxor %xmm0,%xmm13 - movdqu 80(%rdi),%xmm15 - pxor %xmm0,%xmm14 - pxor %xmm0,%xmm15 -.byte 102,15,56,220,209 -.byte 102,15,56,220,217 -.byte 102,15,56,220,225 -.byte 102,15,56,220,233 -.byte 102,15,56,220,241 -.byte 102,15,56,220,249 -.byte 102,68,15,56,220,193 -.byte 102,68,15,56,220,201 - movdqu 96(%rdi),%xmm1 - leaq 128(%rdi),%rdi - -.byte 102,65,15,56,221,210 - pxor %xmm0,%xmm1 - movdqu 112-128(%rdi),%xmm10 -.byte 102,65,15,56,221,219 - pxor %xmm0,%xmm10 - movdqa 0(%rsp),%xmm11 -.byte 102,65,15,56,221,228 -.byte 102,65,15,56,221,237 - movdqa 16(%rsp),%xmm12 - movdqa 32(%rsp),%xmm13 -.byte 102,65,15,56,221,246 -.byte 102,65,15,56,221,255 - movdqa 48(%rsp),%xmm14 - movdqa 64(%rsp),%xmm15 -.byte 102,68,15,56,221,193 - movdqa 80(%rsp),%xmm0 - movups 16-128(%rcx),%xmm1 -.byte 102,69,15,56,221,202 - - movups %xmm2,(%rsi) - movdqa %xmm11,%xmm2 - movups %xmm3,16(%rsi) - movdqa %xmm12,%xmm3 - movups %xmm4,32(%rsi) - movdqa %xmm13,%xmm4 - movups %xmm5,48(%rsi) - movdqa %xmm14,%xmm5 - movups %xmm6,64(%rsi) - movdqa %xmm15,%xmm6 - movups %xmm7,80(%rsi) - movdqa %xmm0,%xmm7 - movups %xmm8,96(%rsi) - movups %xmm9,112(%rsi) - leaq 128(%rsi),%rsi - - subq $8,%rdx - jnc .Lctr32_loop8 - - addq $8,%rdx - jz .Lctr32_done - leaq -128(%rcx),%rcx - -.Lctr32_tail: - - - leaq 16(%rcx),%rcx - cmpq $4,%rdx - jb .Lctr32_loop3 - je .Lctr32_loop4 - - - shll $4,%eax - movdqa 96(%rsp),%xmm8 - pxor %xmm9,%xmm9 - - movups 16(%rcx),%xmm0 -.byte 102,15,56,220,209 -.byte 102,15,56,220,217 - leaq 32-16(%rcx,%rax,1),%rcx - negq %rax -.byte 102,15,56,220,225 - addq $16,%rax - movups (%rdi),%xmm10 -.byte 102,15,56,220,233 -.byte 102,15,56,220,241 - movups 16(%rdi),%xmm11 - movups 32(%rdi),%xmm12 -.byte 102,15,56,220,249 -.byte 102,68,15,56,220,193 - - call .Lenc_loop8_enter - - movdqu 48(%rdi),%xmm13 - pxor %xmm10,%xmm2 - movdqu 64(%rdi),%xmm10 - pxor %xmm11,%xmm3 - movdqu %xmm2,(%rsi) - pxor %xmm12,%xmm4 - movdqu %xmm3,16(%rsi) - pxor %xmm13,%xmm5 - movdqu %xmm4,32(%rsi) - pxor %xmm10,%xmm6 - movdqu %xmm5,48(%rsi) - movdqu %xmm6,64(%rsi) - cmpq $6,%rdx - jb .Lctr32_done - - movups 80(%rdi),%xmm11 - xorps %xmm11,%xmm7 - movups %xmm7,80(%rsi) - je .Lctr32_done - - movups 96(%rdi),%xmm12 - xorps %xmm12,%xmm8 - movups %xmm8,96(%rsi) - jmp .Lctr32_done - -.align 32 -.Lctr32_loop4: -.byte 102,15,56,220,209 - leaq 16(%rcx),%rcx - decl %eax -.byte 102,15,56,220,217 -.byte 102,15,56,220,225 -.byte 102,15,56,220,233 - movups (%rcx),%xmm1 - jnz .Lctr32_loop4 -.byte 102,15,56,221,209 -.byte 102,15,56,221,217 - movups (%rdi),%xmm10 - movups 16(%rdi),%xmm11 -.byte 102,15,56,221,225 -.byte 102,15,56,221,233 - movups 32(%rdi),%xmm12 - movups 48(%rdi),%xmm13 - - xorps %xmm10,%xmm2 - movups %xmm2,(%rsi) - xorps %xmm11,%xmm3 - movups %xmm3,16(%rsi) - pxor %xmm12,%xmm4 - movdqu %xmm4,32(%rsi) - pxor %xmm13,%xmm5 - movdqu %xmm5,48(%rsi) - jmp .Lctr32_done - -.align 32 -.Lctr32_loop3: -.byte 102,15,56,220,209 - leaq 16(%rcx),%rcx - decl %eax -.byte 102,15,56,220,217 -.byte 102,15,56,220,225 - movups (%rcx),%xmm1 - jnz .Lctr32_loop3 -.byte 102,15,56,221,209 -.byte 102,15,56,221,217 -.byte 102,15,56,221,225 - - movups (%rdi),%xmm10 - xorps %xmm10,%xmm2 - movups %xmm2,(%rsi) - cmpq $2,%rdx - jb .Lctr32_done - - movups 16(%rdi),%xmm11 - xorps %xmm11,%xmm3 - movups %xmm3,16(%rsi) - je .Lctr32_done - - movups 32(%rdi),%xmm12 - xorps %xmm12,%xmm4 - movups %xmm4,32(%rsi) - -.Lctr32_done: - xorps %xmm0,%xmm0 - xorl %ebp,%ebp - pxor %xmm1,%xmm1 - pxor %xmm2,%xmm2 - pxor %xmm3,%xmm3 - pxor %xmm4,%xmm4 - pxor %xmm5,%xmm5 - pxor %xmm6,%xmm6 - pxor %xmm7,%xmm7 - movaps %xmm0,0(%rsp) - pxor %xmm8,%xmm8 - movaps %xmm0,16(%rsp) - pxor %xmm9,%xmm9 - movaps %xmm0,32(%rsp) - pxor %xmm10,%xmm10 - movaps %xmm0,48(%rsp) - pxor %xmm11,%xmm11 - movaps %xmm0,64(%rsp) - pxor %xmm12,%xmm12 - movaps %xmm0,80(%rsp) - pxor %xmm13,%xmm13 - movaps %xmm0,96(%rsp) - pxor %xmm14,%xmm14 - movaps %xmm0,112(%rsp) - pxor %xmm15,%xmm15 - movq -8(%r11),%rbp -.cfi_restore %rbp - leaq (%r11),%rsp -.cfi_def_cfa_register %rsp -.Lctr32_epilogue: - .byte 0xf3,0xc3 -.cfi_endproc -.size GFp_aes_hw_ctr32_encrypt_blocks,.-GFp_aes_hw_ctr32_encrypt_blocks -.globl GFp_aes_hw_set_encrypt_key -.hidden GFp_aes_hw_set_encrypt_key -.type GFp_aes_hw_set_encrypt_key,@function -.align 16 -GFp_aes_hw_set_encrypt_key: -__aesni_set_encrypt_key: -.cfi_startproc -.byte 0x48,0x83,0xEC,0x08 -.cfi_adjust_cfa_offset 8 - movq $-1,%rax - testq %rdi,%rdi - jz .Lenc_key_ret - testq %rdx,%rdx - jz .Lenc_key_ret - - movups (%rdi),%xmm0 - xorps %xmm4,%xmm4 - leaq GFp_ia32cap_P(%rip),%r10 - movl 4(%r10),%r10d - andl $268437504,%r10d - leaq 16(%rdx),%rax - cmpl $256,%esi - je .L14rounds - - cmpl $128,%esi - jne .Lbad_keybits - -.L10rounds: - movl $9,%esi - cmpl $268435456,%r10d - je .L10rounds_alt - - movups %xmm0,(%rdx) -.byte 102,15,58,223,200,1 - call .Lkey_expansion_128_cold -.byte 102,15,58,223,200,2 - call .Lkey_expansion_128 -.byte 102,15,58,223,200,4 - call .Lkey_expansion_128 -.byte 102,15,58,223,200,8 - call .Lkey_expansion_128 -.byte 102,15,58,223,200,16 - call .Lkey_expansion_128 -.byte 102,15,58,223,200,32 - call .Lkey_expansion_128 -.byte 102,15,58,223,200,64 - call .Lkey_expansion_128 -.byte 102,15,58,223,200,128 - call .Lkey_expansion_128 -.byte 102,15,58,223,200,27 - call .Lkey_expansion_128 -.byte 102,15,58,223,200,54 - call .Lkey_expansion_128 - movups %xmm0,(%rax) - movl %esi,80(%rax) - xorl %eax,%eax - jmp .Lenc_key_ret - -.align 16 -.L10rounds_alt: - movdqa .Lkey_rotate(%rip),%xmm5 - movl $8,%r10d - movdqa .Lkey_rcon1(%rip),%xmm4 - movdqa %xmm0,%xmm2 - movdqu %xmm0,(%rdx) - jmp .Loop_key128 - -.align 16 -.Loop_key128: -.byte 102,15,56,0,197 -.byte 102,15,56,221,196 - pslld $1,%xmm4 - leaq 16(%rax),%rax - - movdqa %xmm2,%xmm3 - pslldq $4,%xmm2 - pxor %xmm2,%xmm3 - pslldq $4,%xmm2 - pxor %xmm2,%xmm3 - pslldq $4,%xmm2 - pxor %xmm3,%xmm2 - - pxor %xmm2,%xmm0 - movdqu %xmm0,-16(%rax) - movdqa %xmm0,%xmm2 - - decl %r10d - jnz .Loop_key128 - - movdqa .Lkey_rcon1b(%rip),%xmm4 - -.byte 102,15,56,0,197 -.byte 102,15,56,221,196 - pslld $1,%xmm4 - - movdqa %xmm2,%xmm3 - pslldq $4,%xmm2 - pxor %xmm2,%xmm3 - pslldq $4,%xmm2 - pxor %xmm2,%xmm3 - pslldq $4,%xmm2 - pxor %xmm3,%xmm2 - - pxor %xmm2,%xmm0 - movdqu %xmm0,(%rax) - - movdqa %xmm0,%xmm2 -.byte 102,15,56,0,197 -.byte 102,15,56,221,196 - - movdqa %xmm2,%xmm3 - pslldq $4,%xmm2 - pxor %xmm2,%xmm3 - pslldq $4,%xmm2 - pxor %xmm2,%xmm3 - pslldq $4,%xmm2 - pxor %xmm3,%xmm2 - - pxor %xmm2,%xmm0 - movdqu %xmm0,16(%rax) - - movl %esi,96(%rax) - xorl %eax,%eax - jmp .Lenc_key_ret - - - -.align 16 -.L14rounds: - movups 16(%rdi),%xmm2 - movl $13,%esi - leaq 16(%rax),%rax - cmpl $268435456,%r10d - je .L14rounds_alt - - movups %xmm0,(%rdx) - movups %xmm2,16(%rdx) -.byte 102,15,58,223,202,1 - call .Lkey_expansion_256a_cold -.byte 102,15,58,223,200,1 - call .Lkey_expansion_256b -.byte 102,15,58,223,202,2 - call .Lkey_expansion_256a -.byte 102,15,58,223,200,2 - call .Lkey_expansion_256b -.byte 102,15,58,223,202,4 - call .Lkey_expansion_256a -.byte 102,15,58,223,200,4 - call .Lkey_expansion_256b -.byte 102,15,58,223,202,8 - call .Lkey_expansion_256a -.byte 102,15,58,223,200,8 - call .Lkey_expansion_256b -.byte 102,15,58,223,202,16 - call .Lkey_expansion_256a -.byte 102,15,58,223,200,16 - call .Lkey_expansion_256b -.byte 102,15,58,223,202,32 - call .Lkey_expansion_256a -.byte 102,15,58,223,200,32 - call .Lkey_expansion_256b -.byte 102,15,58,223,202,64 - call .Lkey_expansion_256a - movups %xmm0,(%rax) - movl %esi,16(%rax) - xorq %rax,%rax - jmp .Lenc_key_ret - -.align 16 -.L14rounds_alt: - movdqa .Lkey_rotate(%rip),%xmm5 - movdqa .Lkey_rcon1(%rip),%xmm4 - movl $7,%r10d - movdqu %xmm0,0(%rdx) - movdqa %xmm2,%xmm1 - movdqu %xmm2,16(%rdx) - jmp .Loop_key256 - -.align 16 -.Loop_key256: -.byte 102,15,56,0,213 -.byte 102,15,56,221,212 - - movdqa %xmm0,%xmm3 - pslldq $4,%xmm0 - pxor %xmm0,%xmm3 - pslldq $4,%xmm0 - pxor %xmm0,%xmm3 - pslldq $4,%xmm0 - pxor %xmm3,%xmm0 - pslld $1,%xmm4 - - pxor %xmm2,%xmm0 - movdqu %xmm0,(%rax) - - decl %r10d - jz .Ldone_key256 - - pshufd $0xff,%xmm0,%xmm2 - pxor %xmm3,%xmm3 -.byte 102,15,56,221,211 - - movdqa %xmm1,%xmm3 - pslldq $4,%xmm1 - pxor %xmm1,%xmm3 - pslldq $4,%xmm1 - pxor %xmm1,%xmm3 - pslldq $4,%xmm1 - pxor %xmm3,%xmm1 - - pxor %xmm1,%xmm2 - movdqu %xmm2,16(%rax) - leaq 32(%rax),%rax - movdqa %xmm2,%xmm1 - - jmp .Loop_key256 - -.Ldone_key256: - movl %esi,16(%rax) - xorl %eax,%eax - jmp .Lenc_key_ret - -.align 16 -.Lbad_keybits: - movq $-2,%rax -.Lenc_key_ret: - pxor %xmm0,%xmm0 - pxor %xmm1,%xmm1 - pxor %xmm2,%xmm2 - pxor %xmm3,%xmm3 - pxor %xmm4,%xmm4 - pxor %xmm5,%xmm5 - addq $8,%rsp -.cfi_adjust_cfa_offset -8 - .byte 0xf3,0xc3 -.cfi_endproc -.LSEH_end_GFp_set_encrypt_key: - -.align 16 -.Lkey_expansion_128: - movups %xmm0,(%rax) - leaq 16(%rax),%rax -.Lkey_expansion_128_cold: - shufps $16,%xmm0,%xmm4 - xorps %xmm4,%xmm0 - shufps $140,%xmm0,%xmm4 - xorps %xmm4,%xmm0 - shufps $255,%xmm1,%xmm1 - xorps %xmm1,%xmm0 - .byte 0xf3,0xc3 - -.align 16 -.Lkey_expansion_192a: - movups %xmm0,(%rax) - leaq 16(%rax),%rax -.Lkey_expansion_192a_cold: - movaps %xmm2,%xmm5 -.Lkey_expansion_192b_warm: - shufps $16,%xmm0,%xmm4 - movdqa %xmm2,%xmm3 - xorps %xmm4,%xmm0 - shufps $140,%xmm0,%xmm4 - pslldq $4,%xmm3 - xorps %xmm4,%xmm0 - pshufd $85,%xmm1,%xmm1 - pxor %xmm3,%xmm2 - pxor %xmm1,%xmm0 - pshufd $255,%xmm0,%xmm3 - pxor %xmm3,%xmm2 - .byte 0xf3,0xc3 - -.align 16 -.Lkey_expansion_192b: - movaps %xmm0,%xmm3 - shufps $68,%xmm0,%xmm5 - movups %xmm5,(%rax) - shufps $78,%xmm2,%xmm3 - movups %xmm3,16(%rax) - leaq 32(%rax),%rax - jmp .Lkey_expansion_192b_warm - -.align 16 -.Lkey_expansion_256a: - movups %xmm2,(%rax) - leaq 16(%rax),%rax -.Lkey_expansion_256a_cold: - shufps $16,%xmm0,%xmm4 - xorps %xmm4,%xmm0 - shufps $140,%xmm0,%xmm4 - xorps %xmm4,%xmm0 - shufps $255,%xmm1,%xmm1 - xorps %xmm1,%xmm0 - .byte 0xf3,0xc3 - -.align 16 -.Lkey_expansion_256b: - movups %xmm0,(%rax) - leaq 16(%rax),%rax - - shufps $16,%xmm2,%xmm4 - xorps %xmm4,%xmm2 - shufps $140,%xmm2,%xmm4 - xorps %xmm4,%xmm2 - shufps $170,%xmm1,%xmm1 - xorps %xmm1,%xmm2 - .byte 0xf3,0xc3 -.size GFp_aes_hw_set_encrypt_key,.-GFp_aes_hw_set_encrypt_key -.size __aesni_set_encrypt_key,.-__aesni_set_encrypt_key -.align 64 -.Lbswap_mask: -.byte 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 -.Lincrement32: -.long 6,6,6,0 -.Lincrement64: -.long 1,0,0,0 -.Lincrement1: -.byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 -.Lkey_rotate: -.long 0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d -.Lkey_rotate192: -.long 0x04070605,0x04070605,0x04070605,0x04070605 -.Lkey_rcon1: -.long 1,1,1,1 -.Lkey_rcon1b: -.long 0x1b,0x1b,0x1b,0x1b - -.byte 65,69,83,32,102,111,114,32,73,110,116,101,108,32,65,69,83,45,78,73,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 -.align 64 -#endif -.section .note.GNU-stack,"",@progbits diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/aesni-x86_64-macosx.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/aesni-x86_64-macosx.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/aesni-x86_64-macosx.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/aesni-x86_64-macosx.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,1179 +0,0 @@ -# This file is generated from a similarly-named Perl script in the BoringSSL -# source tree. Do not edit by hand. - -#if defined(__has_feature) -#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) -#define OPENSSL_NO_ASM -#endif -#endif - -#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) -.text - -.globl _GFp_aes_hw_encrypt -.private_extern _GFp_aes_hw_encrypt - -.p2align 4 -_GFp_aes_hw_encrypt: - - movups (%rdi),%xmm2 - movl 240(%rdx),%eax - movups (%rdx),%xmm0 - movups 16(%rdx),%xmm1 - leaq 32(%rdx),%rdx - xorps %xmm0,%xmm2 -L$oop_enc1_1: -.byte 102,15,56,220,209 - decl %eax - movups (%rdx),%xmm1 - leaq 16(%rdx),%rdx - jnz L$oop_enc1_1 -.byte 102,15,56,221,209 - pxor %xmm0,%xmm0 - pxor %xmm1,%xmm1 - movups %xmm2,(%rsi) - pxor %xmm2,%xmm2 - .byte 0xf3,0xc3 - - - -.p2align 4 -_aesni_encrypt2: - - movups (%rcx),%xmm0 - shll $4,%eax - movups 16(%rcx),%xmm1 - xorps %xmm0,%xmm2 - xorps %xmm0,%xmm3 - movups 32(%rcx),%xmm0 - leaq 32(%rcx,%rax,1),%rcx - negq %rax - addq $16,%rax - -L$enc_loop2: -.byte 102,15,56,220,209 -.byte 102,15,56,220,217 - movups (%rcx,%rax,1),%xmm1 - addq $32,%rax -.byte 102,15,56,220,208 -.byte 102,15,56,220,216 - movups -16(%rcx,%rax,1),%xmm0 - jnz L$enc_loop2 - -.byte 102,15,56,220,209 -.byte 102,15,56,220,217 -.byte 102,15,56,221,208 -.byte 102,15,56,221,216 - .byte 0xf3,0xc3 - - - -.p2align 4 -_aesni_encrypt3: - - movups (%rcx),%xmm0 - shll $4,%eax - movups 16(%rcx),%xmm1 - xorps %xmm0,%xmm2 - xorps %xmm0,%xmm3 - xorps %xmm0,%xmm4 - movups 32(%rcx),%xmm0 - leaq 32(%rcx,%rax,1),%rcx - negq %rax - addq $16,%rax - -L$enc_loop3: -.byte 102,15,56,220,209 -.byte 102,15,56,220,217 -.byte 102,15,56,220,225 - movups (%rcx,%rax,1),%xmm1 - addq $32,%rax -.byte 102,15,56,220,208 -.byte 102,15,56,220,216 -.byte 102,15,56,220,224 - movups -16(%rcx,%rax,1),%xmm0 - jnz L$enc_loop3 - -.byte 102,15,56,220,209 -.byte 102,15,56,220,217 -.byte 102,15,56,220,225 -.byte 102,15,56,221,208 -.byte 102,15,56,221,216 -.byte 102,15,56,221,224 - .byte 0xf3,0xc3 - - - -.p2align 4 -_aesni_encrypt4: - - movups (%rcx),%xmm0 - shll $4,%eax - movups 16(%rcx),%xmm1 - xorps %xmm0,%xmm2 - xorps %xmm0,%xmm3 - xorps %xmm0,%xmm4 - xorps %xmm0,%xmm5 - movups 32(%rcx),%xmm0 - leaq 32(%rcx,%rax,1),%rcx - negq %rax -.byte 0x0f,0x1f,0x00 - addq $16,%rax - -L$enc_loop4: -.byte 102,15,56,220,209 -.byte 102,15,56,220,217 -.byte 102,15,56,220,225 -.byte 102,15,56,220,233 - movups (%rcx,%rax,1),%xmm1 - addq $32,%rax -.byte 102,15,56,220,208 -.byte 102,15,56,220,216 -.byte 102,15,56,220,224 -.byte 102,15,56,220,232 - movups -16(%rcx,%rax,1),%xmm0 - jnz L$enc_loop4 - -.byte 102,15,56,220,209 -.byte 102,15,56,220,217 -.byte 102,15,56,220,225 -.byte 102,15,56,220,233 -.byte 102,15,56,221,208 -.byte 102,15,56,221,216 -.byte 102,15,56,221,224 -.byte 102,15,56,221,232 - .byte 0xf3,0xc3 - - - -.p2align 4 -_aesni_encrypt6: - - movups (%rcx),%xmm0 - shll $4,%eax - movups 16(%rcx),%xmm1 - xorps %xmm0,%xmm2 - pxor %xmm0,%xmm3 - pxor %xmm0,%xmm4 -.byte 102,15,56,220,209 - leaq 32(%rcx,%rax,1),%rcx - negq %rax -.byte 102,15,56,220,217 - pxor %xmm0,%xmm5 - pxor %xmm0,%xmm6 -.byte 102,15,56,220,225 - pxor %xmm0,%xmm7 - movups (%rcx,%rax,1),%xmm0 - addq $16,%rax - jmp L$enc_loop6_enter -.p2align 4 -L$enc_loop6: -.byte 102,15,56,220,209 -.byte 102,15,56,220,217 -.byte 102,15,56,220,225 -L$enc_loop6_enter: -.byte 102,15,56,220,233 -.byte 102,15,56,220,241 -.byte 102,15,56,220,249 - movups (%rcx,%rax,1),%xmm1 - addq $32,%rax -.byte 102,15,56,220,208 -.byte 102,15,56,220,216 -.byte 102,15,56,220,224 -.byte 102,15,56,220,232 -.byte 102,15,56,220,240 -.byte 102,15,56,220,248 - movups -16(%rcx,%rax,1),%xmm0 - jnz L$enc_loop6 - -.byte 102,15,56,220,209 -.byte 102,15,56,220,217 -.byte 102,15,56,220,225 -.byte 102,15,56,220,233 -.byte 102,15,56,220,241 -.byte 102,15,56,220,249 -.byte 102,15,56,221,208 -.byte 102,15,56,221,216 -.byte 102,15,56,221,224 -.byte 102,15,56,221,232 -.byte 102,15,56,221,240 -.byte 102,15,56,221,248 - .byte 0xf3,0xc3 - - - -.p2align 4 -_aesni_encrypt8: - - movups (%rcx),%xmm0 - shll $4,%eax - movups 16(%rcx),%xmm1 - xorps %xmm0,%xmm2 - xorps %xmm0,%xmm3 - pxor %xmm0,%xmm4 - pxor %xmm0,%xmm5 - pxor %xmm0,%xmm6 - leaq 32(%rcx,%rax,1),%rcx - negq %rax -.byte 102,15,56,220,209 - pxor %xmm0,%xmm7 - pxor %xmm0,%xmm8 -.byte 102,15,56,220,217 - pxor %xmm0,%xmm9 - movups (%rcx,%rax,1),%xmm0 - addq $16,%rax - jmp L$enc_loop8_inner -.p2align 4 -L$enc_loop8: -.byte 102,15,56,220,209 -.byte 102,15,56,220,217 -L$enc_loop8_inner: -.byte 102,15,56,220,225 -.byte 102,15,56,220,233 -.byte 102,15,56,220,241 -.byte 102,15,56,220,249 -.byte 102,68,15,56,220,193 -.byte 102,68,15,56,220,201 -L$enc_loop8_enter: - movups (%rcx,%rax,1),%xmm1 - addq $32,%rax -.byte 102,15,56,220,208 -.byte 102,15,56,220,216 -.byte 102,15,56,220,224 -.byte 102,15,56,220,232 -.byte 102,15,56,220,240 -.byte 102,15,56,220,248 -.byte 102,68,15,56,220,192 -.byte 102,68,15,56,220,200 - movups -16(%rcx,%rax,1),%xmm0 - jnz L$enc_loop8 - -.byte 102,15,56,220,209 -.byte 102,15,56,220,217 -.byte 102,15,56,220,225 -.byte 102,15,56,220,233 -.byte 102,15,56,220,241 -.byte 102,15,56,220,249 -.byte 102,68,15,56,220,193 -.byte 102,68,15,56,220,201 -.byte 102,15,56,221,208 -.byte 102,15,56,221,216 -.byte 102,15,56,221,224 -.byte 102,15,56,221,232 -.byte 102,15,56,221,240 -.byte 102,15,56,221,248 -.byte 102,68,15,56,221,192 -.byte 102,68,15,56,221,200 - .byte 0xf3,0xc3 - - -.globl _GFp_aes_hw_ctr32_encrypt_blocks -.private_extern _GFp_aes_hw_ctr32_encrypt_blocks - -.p2align 4 -_GFp_aes_hw_ctr32_encrypt_blocks: - - cmpq $1,%rdx - jne L$ctr32_bulk - - - - movups (%r8),%xmm2 - movups (%rdi),%xmm3 - movl 240(%rcx),%edx - movups (%rcx),%xmm0 - movups 16(%rcx),%xmm1 - leaq 32(%rcx),%rcx - xorps %xmm0,%xmm2 -L$oop_enc1_2: -.byte 102,15,56,220,209 - decl %edx - movups (%rcx),%xmm1 - leaq 16(%rcx),%rcx - jnz L$oop_enc1_2 -.byte 102,15,56,221,209 - pxor %xmm0,%xmm0 - pxor %xmm1,%xmm1 - xorps %xmm3,%xmm2 - pxor %xmm3,%xmm3 - movups %xmm2,(%rsi) - xorps %xmm2,%xmm2 - jmp L$ctr32_epilogue - -.p2align 4 -L$ctr32_bulk: - leaq (%rsp),%r11 - - pushq %rbp - - subq $128,%rsp - andq $-16,%rsp - - - - - movdqu (%r8),%xmm2 - movdqu (%rcx),%xmm0 - movl 12(%r8),%r8d - pxor %xmm0,%xmm2 - movl 12(%rcx),%ebp - movdqa %xmm2,0(%rsp) - bswapl %r8d - movdqa %xmm2,%xmm3 - movdqa %xmm2,%xmm4 - movdqa %xmm2,%xmm5 - movdqa %xmm2,64(%rsp) - movdqa %xmm2,80(%rsp) - movdqa %xmm2,96(%rsp) - movq %rdx,%r10 - movdqa %xmm2,112(%rsp) - - leaq 1(%r8),%rax - leaq 2(%r8),%rdx - bswapl %eax - bswapl %edx - xorl %ebp,%eax - xorl %ebp,%edx -.byte 102,15,58,34,216,3 - leaq 3(%r8),%rax - movdqa %xmm3,16(%rsp) -.byte 102,15,58,34,226,3 - bswapl %eax - movq %r10,%rdx - leaq 4(%r8),%r10 - movdqa %xmm4,32(%rsp) - xorl %ebp,%eax - bswapl %r10d -.byte 102,15,58,34,232,3 - xorl %ebp,%r10d - movdqa %xmm5,48(%rsp) - leaq 5(%r8),%r9 - movl %r10d,64+12(%rsp) - bswapl %r9d - leaq 6(%r8),%r10 - movl 240(%rcx),%eax - xorl %ebp,%r9d - bswapl %r10d - movl %r9d,80+12(%rsp) - xorl %ebp,%r10d - leaq 7(%r8),%r9 - movl %r10d,96+12(%rsp) - bswapl %r9d - leaq _GFp_ia32cap_P(%rip),%r10 - movl 4(%r10),%r10d - xorl %ebp,%r9d - andl $71303168,%r10d - movl %r9d,112+12(%rsp) - - movups 16(%rcx),%xmm1 - - movdqa 64(%rsp),%xmm6 - movdqa 80(%rsp),%xmm7 - - cmpq $8,%rdx - jb L$ctr32_tail - - subq $6,%rdx - cmpl $4194304,%r10d - je L$ctr32_6x - - leaq 128(%rcx),%rcx - subq $2,%rdx - jmp L$ctr32_loop8 - -.p2align 4 -L$ctr32_6x: - shll $4,%eax - movl $48,%r10d - bswapl %ebp - leaq 32(%rcx,%rax,1),%rcx - subq %rax,%r10 - jmp L$ctr32_loop6 - -.p2align 4 -L$ctr32_loop6: - addl $6,%r8d - movups -48(%rcx,%r10,1),%xmm0 -.byte 102,15,56,220,209 - movl %r8d,%eax - xorl %ebp,%eax -.byte 102,15,56,220,217 -.byte 0x0f,0x38,0xf1,0x44,0x24,12 - leal 1(%r8),%eax -.byte 102,15,56,220,225 - xorl %ebp,%eax -.byte 0x0f,0x38,0xf1,0x44,0x24,28 -.byte 102,15,56,220,233 - leal 2(%r8),%eax - xorl %ebp,%eax -.byte 102,15,56,220,241 -.byte 0x0f,0x38,0xf1,0x44,0x24,44 - leal 3(%r8),%eax -.byte 102,15,56,220,249 - movups -32(%rcx,%r10,1),%xmm1 - xorl %ebp,%eax - -.byte 102,15,56,220,208 -.byte 0x0f,0x38,0xf1,0x44,0x24,60 - leal 4(%r8),%eax -.byte 102,15,56,220,216 - xorl %ebp,%eax -.byte 0x0f,0x38,0xf1,0x44,0x24,76 -.byte 102,15,56,220,224 - leal 5(%r8),%eax - xorl %ebp,%eax -.byte 102,15,56,220,232 -.byte 0x0f,0x38,0xf1,0x44,0x24,92 - movq %r10,%rax -.byte 102,15,56,220,240 -.byte 102,15,56,220,248 - movups -16(%rcx,%r10,1),%xmm0 - - call L$enc_loop6 - - movdqu (%rdi),%xmm8 - movdqu 16(%rdi),%xmm9 - movdqu 32(%rdi),%xmm10 - movdqu 48(%rdi),%xmm11 - movdqu 64(%rdi),%xmm12 - movdqu 80(%rdi),%xmm13 - leaq 96(%rdi),%rdi - movups -64(%rcx,%r10,1),%xmm1 - pxor %xmm2,%xmm8 - movaps 0(%rsp),%xmm2 - pxor %xmm3,%xmm9 - movaps 16(%rsp),%xmm3 - pxor %xmm4,%xmm10 - movaps 32(%rsp),%xmm4 - pxor %xmm5,%xmm11 - movaps 48(%rsp),%xmm5 - pxor %xmm6,%xmm12 - movaps 64(%rsp),%xmm6 - pxor %xmm7,%xmm13 - movaps 80(%rsp),%xmm7 - movdqu %xmm8,(%rsi) - movdqu %xmm9,16(%rsi) - movdqu %xmm10,32(%rsi) - movdqu %xmm11,48(%rsi) - movdqu %xmm12,64(%rsi) - movdqu %xmm13,80(%rsi) - leaq 96(%rsi),%rsi - - subq $6,%rdx - jnc L$ctr32_loop6 - - addq $6,%rdx - jz L$ctr32_done - - leal -48(%r10),%eax - leaq -80(%rcx,%r10,1),%rcx - negl %eax - shrl $4,%eax - jmp L$ctr32_tail - -.p2align 5 -L$ctr32_loop8: - addl $8,%r8d - movdqa 96(%rsp),%xmm8 -.byte 102,15,56,220,209 - movl %r8d,%r9d - movdqa 112(%rsp),%xmm9 -.byte 102,15,56,220,217 - bswapl %r9d - movups 32-128(%rcx),%xmm0 -.byte 102,15,56,220,225 - xorl %ebp,%r9d - nop -.byte 102,15,56,220,233 - movl %r9d,0+12(%rsp) - leaq 1(%r8),%r9 -.byte 102,15,56,220,241 -.byte 102,15,56,220,249 -.byte 102,68,15,56,220,193 -.byte 102,68,15,56,220,201 - movups 48-128(%rcx),%xmm1 - bswapl %r9d -.byte 102,15,56,220,208 -.byte 102,15,56,220,216 - xorl %ebp,%r9d -.byte 0x66,0x90 -.byte 102,15,56,220,224 -.byte 102,15,56,220,232 - movl %r9d,16+12(%rsp) - leaq 2(%r8),%r9 -.byte 102,15,56,220,240 -.byte 102,15,56,220,248 -.byte 102,68,15,56,220,192 -.byte 102,68,15,56,220,200 - movups 64-128(%rcx),%xmm0 - bswapl %r9d -.byte 102,15,56,220,209 -.byte 102,15,56,220,217 - xorl %ebp,%r9d -.byte 0x66,0x90 -.byte 102,15,56,220,225 -.byte 102,15,56,220,233 - movl %r9d,32+12(%rsp) - leaq 3(%r8),%r9 -.byte 102,15,56,220,241 -.byte 102,15,56,220,249 -.byte 102,68,15,56,220,193 -.byte 102,68,15,56,220,201 - movups 80-128(%rcx),%xmm1 - bswapl %r9d -.byte 102,15,56,220,208 -.byte 102,15,56,220,216 - xorl %ebp,%r9d -.byte 0x66,0x90 -.byte 102,15,56,220,224 -.byte 102,15,56,220,232 - movl %r9d,48+12(%rsp) - leaq 4(%r8),%r9 -.byte 102,15,56,220,240 -.byte 102,15,56,220,248 -.byte 102,68,15,56,220,192 -.byte 102,68,15,56,220,200 - movups 96-128(%rcx),%xmm0 - bswapl %r9d -.byte 102,15,56,220,209 -.byte 102,15,56,220,217 - xorl %ebp,%r9d -.byte 0x66,0x90 -.byte 102,15,56,220,225 -.byte 102,15,56,220,233 - movl %r9d,64+12(%rsp) - leaq 5(%r8),%r9 -.byte 102,15,56,220,241 -.byte 102,15,56,220,249 -.byte 102,68,15,56,220,193 -.byte 102,68,15,56,220,201 - movups 112-128(%rcx),%xmm1 - bswapl %r9d -.byte 102,15,56,220,208 -.byte 102,15,56,220,216 - xorl %ebp,%r9d -.byte 0x66,0x90 -.byte 102,15,56,220,224 -.byte 102,15,56,220,232 - movl %r9d,80+12(%rsp) - leaq 6(%r8),%r9 -.byte 102,15,56,220,240 -.byte 102,15,56,220,248 -.byte 102,68,15,56,220,192 -.byte 102,68,15,56,220,200 - movups 128-128(%rcx),%xmm0 - bswapl %r9d -.byte 102,15,56,220,209 -.byte 102,15,56,220,217 - xorl %ebp,%r9d -.byte 0x66,0x90 -.byte 102,15,56,220,225 -.byte 102,15,56,220,233 - movl %r9d,96+12(%rsp) - leaq 7(%r8),%r9 -.byte 102,15,56,220,241 -.byte 102,15,56,220,249 -.byte 102,68,15,56,220,193 -.byte 102,68,15,56,220,201 - movups 144-128(%rcx),%xmm1 - bswapl %r9d -.byte 102,15,56,220,208 -.byte 102,15,56,220,216 -.byte 102,15,56,220,224 - xorl %ebp,%r9d - movdqu 0(%rdi),%xmm10 -.byte 102,15,56,220,232 - movl %r9d,112+12(%rsp) - cmpl $11,%eax -.byte 102,15,56,220,240 -.byte 102,15,56,220,248 -.byte 102,68,15,56,220,192 -.byte 102,68,15,56,220,200 - movups 160-128(%rcx),%xmm0 - - jb L$ctr32_enc_done - -.byte 102,15,56,220,209 -.byte 102,15,56,220,217 -.byte 102,15,56,220,225 -.byte 102,15,56,220,233 -.byte 102,15,56,220,241 -.byte 102,15,56,220,249 -.byte 102,68,15,56,220,193 -.byte 102,68,15,56,220,201 - movups 176-128(%rcx),%xmm1 - -.byte 102,15,56,220,208 -.byte 102,15,56,220,216 -.byte 102,15,56,220,224 -.byte 102,15,56,220,232 -.byte 102,15,56,220,240 -.byte 102,15,56,220,248 -.byte 102,68,15,56,220,192 -.byte 102,68,15,56,220,200 - movups 192-128(%rcx),%xmm0 - - - -.byte 102,15,56,220,209 -.byte 102,15,56,220,217 -.byte 102,15,56,220,225 -.byte 102,15,56,220,233 -.byte 102,15,56,220,241 -.byte 102,15,56,220,249 -.byte 102,68,15,56,220,193 -.byte 102,68,15,56,220,201 - movups 208-128(%rcx),%xmm1 - -.byte 102,15,56,220,208 -.byte 102,15,56,220,216 -.byte 102,15,56,220,224 -.byte 102,15,56,220,232 -.byte 102,15,56,220,240 -.byte 102,15,56,220,248 -.byte 102,68,15,56,220,192 -.byte 102,68,15,56,220,200 - movups 224-128(%rcx),%xmm0 - jmp L$ctr32_enc_done - -.p2align 4 -L$ctr32_enc_done: - movdqu 16(%rdi),%xmm11 - pxor %xmm0,%xmm10 - movdqu 32(%rdi),%xmm12 - pxor %xmm0,%xmm11 - movdqu 48(%rdi),%xmm13 - pxor %xmm0,%xmm12 - movdqu 64(%rdi),%xmm14 - pxor %xmm0,%xmm13 - movdqu 80(%rdi),%xmm15 - pxor %xmm0,%xmm14 - pxor %xmm0,%xmm15 -.byte 102,15,56,220,209 -.byte 102,15,56,220,217 -.byte 102,15,56,220,225 -.byte 102,15,56,220,233 -.byte 102,15,56,220,241 -.byte 102,15,56,220,249 -.byte 102,68,15,56,220,193 -.byte 102,68,15,56,220,201 - movdqu 96(%rdi),%xmm1 - leaq 128(%rdi),%rdi - -.byte 102,65,15,56,221,210 - pxor %xmm0,%xmm1 - movdqu 112-128(%rdi),%xmm10 -.byte 102,65,15,56,221,219 - pxor %xmm0,%xmm10 - movdqa 0(%rsp),%xmm11 -.byte 102,65,15,56,221,228 -.byte 102,65,15,56,221,237 - movdqa 16(%rsp),%xmm12 - movdqa 32(%rsp),%xmm13 -.byte 102,65,15,56,221,246 -.byte 102,65,15,56,221,255 - movdqa 48(%rsp),%xmm14 - movdqa 64(%rsp),%xmm15 -.byte 102,68,15,56,221,193 - movdqa 80(%rsp),%xmm0 - movups 16-128(%rcx),%xmm1 -.byte 102,69,15,56,221,202 - - movups %xmm2,(%rsi) - movdqa %xmm11,%xmm2 - movups %xmm3,16(%rsi) - movdqa %xmm12,%xmm3 - movups %xmm4,32(%rsi) - movdqa %xmm13,%xmm4 - movups %xmm5,48(%rsi) - movdqa %xmm14,%xmm5 - movups %xmm6,64(%rsi) - movdqa %xmm15,%xmm6 - movups %xmm7,80(%rsi) - movdqa %xmm0,%xmm7 - movups %xmm8,96(%rsi) - movups %xmm9,112(%rsi) - leaq 128(%rsi),%rsi - - subq $8,%rdx - jnc L$ctr32_loop8 - - addq $8,%rdx - jz L$ctr32_done - leaq -128(%rcx),%rcx - -L$ctr32_tail: - - - leaq 16(%rcx),%rcx - cmpq $4,%rdx - jb L$ctr32_loop3 - je L$ctr32_loop4 - - - shll $4,%eax - movdqa 96(%rsp),%xmm8 - pxor %xmm9,%xmm9 - - movups 16(%rcx),%xmm0 -.byte 102,15,56,220,209 -.byte 102,15,56,220,217 - leaq 32-16(%rcx,%rax,1),%rcx - negq %rax -.byte 102,15,56,220,225 - addq $16,%rax - movups (%rdi),%xmm10 -.byte 102,15,56,220,233 -.byte 102,15,56,220,241 - movups 16(%rdi),%xmm11 - movups 32(%rdi),%xmm12 -.byte 102,15,56,220,249 -.byte 102,68,15,56,220,193 - - call L$enc_loop8_enter - - movdqu 48(%rdi),%xmm13 - pxor %xmm10,%xmm2 - movdqu 64(%rdi),%xmm10 - pxor %xmm11,%xmm3 - movdqu %xmm2,(%rsi) - pxor %xmm12,%xmm4 - movdqu %xmm3,16(%rsi) - pxor %xmm13,%xmm5 - movdqu %xmm4,32(%rsi) - pxor %xmm10,%xmm6 - movdqu %xmm5,48(%rsi) - movdqu %xmm6,64(%rsi) - cmpq $6,%rdx - jb L$ctr32_done - - movups 80(%rdi),%xmm11 - xorps %xmm11,%xmm7 - movups %xmm7,80(%rsi) - je L$ctr32_done - - movups 96(%rdi),%xmm12 - xorps %xmm12,%xmm8 - movups %xmm8,96(%rsi) - jmp L$ctr32_done - -.p2align 5 -L$ctr32_loop4: -.byte 102,15,56,220,209 - leaq 16(%rcx),%rcx - decl %eax -.byte 102,15,56,220,217 -.byte 102,15,56,220,225 -.byte 102,15,56,220,233 - movups (%rcx),%xmm1 - jnz L$ctr32_loop4 -.byte 102,15,56,221,209 -.byte 102,15,56,221,217 - movups (%rdi),%xmm10 - movups 16(%rdi),%xmm11 -.byte 102,15,56,221,225 -.byte 102,15,56,221,233 - movups 32(%rdi),%xmm12 - movups 48(%rdi),%xmm13 - - xorps %xmm10,%xmm2 - movups %xmm2,(%rsi) - xorps %xmm11,%xmm3 - movups %xmm3,16(%rsi) - pxor %xmm12,%xmm4 - movdqu %xmm4,32(%rsi) - pxor %xmm13,%xmm5 - movdqu %xmm5,48(%rsi) - jmp L$ctr32_done - -.p2align 5 -L$ctr32_loop3: -.byte 102,15,56,220,209 - leaq 16(%rcx),%rcx - decl %eax -.byte 102,15,56,220,217 -.byte 102,15,56,220,225 - movups (%rcx),%xmm1 - jnz L$ctr32_loop3 -.byte 102,15,56,221,209 -.byte 102,15,56,221,217 -.byte 102,15,56,221,225 - - movups (%rdi),%xmm10 - xorps %xmm10,%xmm2 - movups %xmm2,(%rsi) - cmpq $2,%rdx - jb L$ctr32_done - - movups 16(%rdi),%xmm11 - xorps %xmm11,%xmm3 - movups %xmm3,16(%rsi) - je L$ctr32_done - - movups 32(%rdi),%xmm12 - xorps %xmm12,%xmm4 - movups %xmm4,32(%rsi) - -L$ctr32_done: - xorps %xmm0,%xmm0 - xorl %ebp,%ebp - pxor %xmm1,%xmm1 - pxor %xmm2,%xmm2 - pxor %xmm3,%xmm3 - pxor %xmm4,%xmm4 - pxor %xmm5,%xmm5 - pxor %xmm6,%xmm6 - pxor %xmm7,%xmm7 - movaps %xmm0,0(%rsp) - pxor %xmm8,%xmm8 - movaps %xmm0,16(%rsp) - pxor %xmm9,%xmm9 - movaps %xmm0,32(%rsp) - pxor %xmm10,%xmm10 - movaps %xmm0,48(%rsp) - pxor %xmm11,%xmm11 - movaps %xmm0,64(%rsp) - pxor %xmm12,%xmm12 - movaps %xmm0,80(%rsp) - pxor %xmm13,%xmm13 - movaps %xmm0,96(%rsp) - pxor %xmm14,%xmm14 - movaps %xmm0,112(%rsp) - pxor %xmm15,%xmm15 - movq -8(%r11),%rbp - - leaq (%r11),%rsp - -L$ctr32_epilogue: - .byte 0xf3,0xc3 - - -.globl _GFp_aes_hw_set_encrypt_key -.private_extern _GFp_aes_hw_set_encrypt_key - -.p2align 4 -_GFp_aes_hw_set_encrypt_key: -__aesni_set_encrypt_key: - -.byte 0x48,0x83,0xEC,0x08 - - movq $-1,%rax - testq %rdi,%rdi - jz L$enc_key_ret - testq %rdx,%rdx - jz L$enc_key_ret - - movups (%rdi),%xmm0 - xorps %xmm4,%xmm4 - leaq _GFp_ia32cap_P(%rip),%r10 - movl 4(%r10),%r10d - andl $268437504,%r10d - leaq 16(%rdx),%rax - cmpl $256,%esi - je L$14rounds - - cmpl $128,%esi - jne L$bad_keybits - -L$10rounds: - movl $9,%esi - cmpl $268435456,%r10d - je L$10rounds_alt - - movups %xmm0,(%rdx) -.byte 102,15,58,223,200,1 - call L$key_expansion_128_cold -.byte 102,15,58,223,200,2 - call L$key_expansion_128 -.byte 102,15,58,223,200,4 - call L$key_expansion_128 -.byte 102,15,58,223,200,8 - call L$key_expansion_128 -.byte 102,15,58,223,200,16 - call L$key_expansion_128 -.byte 102,15,58,223,200,32 - call L$key_expansion_128 -.byte 102,15,58,223,200,64 - call L$key_expansion_128 -.byte 102,15,58,223,200,128 - call L$key_expansion_128 -.byte 102,15,58,223,200,27 - call L$key_expansion_128 -.byte 102,15,58,223,200,54 - call L$key_expansion_128 - movups %xmm0,(%rax) - movl %esi,80(%rax) - xorl %eax,%eax - jmp L$enc_key_ret - -.p2align 4 -L$10rounds_alt: - movdqa L$key_rotate(%rip),%xmm5 - movl $8,%r10d - movdqa L$key_rcon1(%rip),%xmm4 - movdqa %xmm0,%xmm2 - movdqu %xmm0,(%rdx) - jmp L$oop_key128 - -.p2align 4 -L$oop_key128: -.byte 102,15,56,0,197 -.byte 102,15,56,221,196 - pslld $1,%xmm4 - leaq 16(%rax),%rax - - movdqa %xmm2,%xmm3 - pslldq $4,%xmm2 - pxor %xmm2,%xmm3 - pslldq $4,%xmm2 - pxor %xmm2,%xmm3 - pslldq $4,%xmm2 - pxor %xmm3,%xmm2 - - pxor %xmm2,%xmm0 - movdqu %xmm0,-16(%rax) - movdqa %xmm0,%xmm2 - - decl %r10d - jnz L$oop_key128 - - movdqa L$key_rcon1b(%rip),%xmm4 - -.byte 102,15,56,0,197 -.byte 102,15,56,221,196 - pslld $1,%xmm4 - - movdqa %xmm2,%xmm3 - pslldq $4,%xmm2 - pxor %xmm2,%xmm3 - pslldq $4,%xmm2 - pxor %xmm2,%xmm3 - pslldq $4,%xmm2 - pxor %xmm3,%xmm2 - - pxor %xmm2,%xmm0 - movdqu %xmm0,(%rax) - - movdqa %xmm0,%xmm2 -.byte 102,15,56,0,197 -.byte 102,15,56,221,196 - - movdqa %xmm2,%xmm3 - pslldq $4,%xmm2 - pxor %xmm2,%xmm3 - pslldq $4,%xmm2 - pxor %xmm2,%xmm3 - pslldq $4,%xmm2 - pxor %xmm3,%xmm2 - - pxor %xmm2,%xmm0 - movdqu %xmm0,16(%rax) - - movl %esi,96(%rax) - xorl %eax,%eax - jmp L$enc_key_ret - - - -.p2align 4 -L$14rounds: - movups 16(%rdi),%xmm2 - movl $13,%esi - leaq 16(%rax),%rax - cmpl $268435456,%r10d - je L$14rounds_alt - - movups %xmm0,(%rdx) - movups %xmm2,16(%rdx) -.byte 102,15,58,223,202,1 - call L$key_expansion_256a_cold -.byte 102,15,58,223,200,1 - call L$key_expansion_256b -.byte 102,15,58,223,202,2 - call L$key_expansion_256a -.byte 102,15,58,223,200,2 - call L$key_expansion_256b -.byte 102,15,58,223,202,4 - call L$key_expansion_256a -.byte 102,15,58,223,200,4 - call L$key_expansion_256b -.byte 102,15,58,223,202,8 - call L$key_expansion_256a -.byte 102,15,58,223,200,8 - call L$key_expansion_256b -.byte 102,15,58,223,202,16 - call L$key_expansion_256a -.byte 102,15,58,223,200,16 - call L$key_expansion_256b -.byte 102,15,58,223,202,32 - call L$key_expansion_256a -.byte 102,15,58,223,200,32 - call L$key_expansion_256b -.byte 102,15,58,223,202,64 - call L$key_expansion_256a - movups %xmm0,(%rax) - movl %esi,16(%rax) - xorq %rax,%rax - jmp L$enc_key_ret - -.p2align 4 -L$14rounds_alt: - movdqa L$key_rotate(%rip),%xmm5 - movdqa L$key_rcon1(%rip),%xmm4 - movl $7,%r10d - movdqu %xmm0,0(%rdx) - movdqa %xmm2,%xmm1 - movdqu %xmm2,16(%rdx) - jmp L$oop_key256 - -.p2align 4 -L$oop_key256: -.byte 102,15,56,0,213 -.byte 102,15,56,221,212 - - movdqa %xmm0,%xmm3 - pslldq $4,%xmm0 - pxor %xmm0,%xmm3 - pslldq $4,%xmm0 - pxor %xmm0,%xmm3 - pslldq $4,%xmm0 - pxor %xmm3,%xmm0 - pslld $1,%xmm4 - - pxor %xmm2,%xmm0 - movdqu %xmm0,(%rax) - - decl %r10d - jz L$done_key256 - - pshufd $0xff,%xmm0,%xmm2 - pxor %xmm3,%xmm3 -.byte 102,15,56,221,211 - - movdqa %xmm1,%xmm3 - pslldq $4,%xmm1 - pxor %xmm1,%xmm3 - pslldq $4,%xmm1 - pxor %xmm1,%xmm3 - pslldq $4,%xmm1 - pxor %xmm3,%xmm1 - - pxor %xmm1,%xmm2 - movdqu %xmm2,16(%rax) - leaq 32(%rax),%rax - movdqa %xmm2,%xmm1 - - jmp L$oop_key256 - -L$done_key256: - movl %esi,16(%rax) - xorl %eax,%eax - jmp L$enc_key_ret - -.p2align 4 -L$bad_keybits: - movq $-2,%rax -L$enc_key_ret: - pxor %xmm0,%xmm0 - pxor %xmm1,%xmm1 - pxor %xmm2,%xmm2 - pxor %xmm3,%xmm3 - pxor %xmm4,%xmm4 - pxor %xmm5,%xmm5 - addq $8,%rsp - - .byte 0xf3,0xc3 - -L$SEH_end_GFp_set_encrypt_key: - -.p2align 4 -L$key_expansion_128: - movups %xmm0,(%rax) - leaq 16(%rax),%rax -L$key_expansion_128_cold: - shufps $16,%xmm0,%xmm4 - xorps %xmm4,%xmm0 - shufps $140,%xmm0,%xmm4 - xorps %xmm4,%xmm0 - shufps $255,%xmm1,%xmm1 - xorps %xmm1,%xmm0 - .byte 0xf3,0xc3 - -.p2align 4 -L$key_expansion_192a: - movups %xmm0,(%rax) - leaq 16(%rax),%rax -L$key_expansion_192a_cold: - movaps %xmm2,%xmm5 -L$key_expansion_192b_warm: - shufps $16,%xmm0,%xmm4 - movdqa %xmm2,%xmm3 - xorps %xmm4,%xmm0 - shufps $140,%xmm0,%xmm4 - pslldq $4,%xmm3 - xorps %xmm4,%xmm0 - pshufd $85,%xmm1,%xmm1 - pxor %xmm3,%xmm2 - pxor %xmm1,%xmm0 - pshufd $255,%xmm0,%xmm3 - pxor %xmm3,%xmm2 - .byte 0xf3,0xc3 - -.p2align 4 -L$key_expansion_192b: - movaps %xmm0,%xmm3 - shufps $68,%xmm0,%xmm5 - movups %xmm5,(%rax) - shufps $78,%xmm2,%xmm3 - movups %xmm3,16(%rax) - leaq 32(%rax),%rax - jmp L$key_expansion_192b_warm - -.p2align 4 -L$key_expansion_256a: - movups %xmm2,(%rax) - leaq 16(%rax),%rax -L$key_expansion_256a_cold: - shufps $16,%xmm0,%xmm4 - xorps %xmm4,%xmm0 - shufps $140,%xmm0,%xmm4 - xorps %xmm4,%xmm0 - shufps $255,%xmm1,%xmm1 - xorps %xmm1,%xmm0 - .byte 0xf3,0xc3 - -.p2align 4 -L$key_expansion_256b: - movups %xmm0,(%rax) - leaq 16(%rax),%rax - - shufps $16,%xmm2,%xmm4 - xorps %xmm4,%xmm2 - shufps $140,%xmm2,%xmm4 - xorps %xmm4,%xmm2 - shufps $170,%xmm1,%xmm1 - xorps %xmm1,%xmm2 - .byte 0xf3,0xc3 - - -.p2align 6 -L$bswap_mask: -.byte 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 -L$increment32: -.long 6,6,6,0 -L$increment64: -.long 1,0,0,0 -L$increment1: -.byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 -L$key_rotate: -.long 0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d -L$key_rotate192: -.long 0x04070605,0x04070605,0x04070605,0x04070605 -L$key_rcon1: -.long 1,1,1,1 -L$key_rcon1b: -.long 0x1b,0x1b,0x1b,0x1b - -.byte 65,69,83,32,102,111,114,32,73,110,116,101,108,32,65,69,83,45,78,73,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 -.p2align 6 -#endif Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/aesni-x86_64-nasm.obj and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/aesni-x86_64-nasm.obj differ diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/aesni-x86-elf.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/aesni-x86-elf.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/aesni-x86-elf.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/aesni-x86-elf.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,699 +0,0 @@ -# This file is generated from a similarly-named Perl script in the BoringSSL -# source tree. Do not edit by hand. - -#if defined(__i386__) -#if defined(BORINGSSL_PREFIX) -#include -#endif -.text -.globl GFp_aes_hw_encrypt -.hidden GFp_aes_hw_encrypt -.type GFp_aes_hw_encrypt,@function -.align 16 -GFp_aes_hw_encrypt: -.L_GFp_aes_hw_encrypt_begin: - movl 4(%esp),%eax - movl 12(%esp),%edx - movups (%eax),%xmm2 - movl 240(%edx),%ecx - movl 8(%esp),%eax - movups (%edx),%xmm0 - movups 16(%edx),%xmm1 - leal 32(%edx),%edx - xorps %xmm0,%xmm2 -.L000enc1_loop_1: -.byte 102,15,56,220,209 - decl %ecx - movups (%edx),%xmm1 - leal 16(%edx),%edx - jnz .L000enc1_loop_1 -.byte 102,15,56,221,209 - pxor %xmm0,%xmm0 - pxor %xmm1,%xmm1 - movups %xmm2,(%eax) - pxor %xmm2,%xmm2 - ret -.size GFp_aes_hw_encrypt,.-.L_GFp_aes_hw_encrypt_begin -.hidden _aesni_encrypt2 -.type _aesni_encrypt2,@function -.align 16 -_aesni_encrypt2: - movups (%edx),%xmm0 - shll $4,%ecx - movups 16(%edx),%xmm1 - xorps %xmm0,%xmm2 - pxor %xmm0,%xmm3 - movups 32(%edx),%xmm0 - leal 32(%edx,%ecx,1),%edx - negl %ecx - addl $16,%ecx -.L001enc2_loop: -.byte 102,15,56,220,209 -.byte 102,15,56,220,217 - movups (%edx,%ecx,1),%xmm1 - addl $32,%ecx -.byte 102,15,56,220,208 -.byte 102,15,56,220,216 - movups -16(%edx,%ecx,1),%xmm0 - jnz .L001enc2_loop -.byte 102,15,56,220,209 -.byte 102,15,56,220,217 -.byte 102,15,56,221,208 -.byte 102,15,56,221,216 - ret -.size _aesni_encrypt2,.-_aesni_encrypt2 -.hidden _aesni_encrypt3 -.type _aesni_encrypt3,@function -.align 16 -_aesni_encrypt3: - movups (%edx),%xmm0 - shll $4,%ecx - movups 16(%edx),%xmm1 - xorps %xmm0,%xmm2 - pxor %xmm0,%xmm3 - pxor %xmm0,%xmm4 - movups 32(%edx),%xmm0 - leal 32(%edx,%ecx,1),%edx - negl %ecx - addl $16,%ecx -.L002enc3_loop: -.byte 102,15,56,220,209 -.byte 102,15,56,220,217 -.byte 102,15,56,220,225 - movups (%edx,%ecx,1),%xmm1 - addl $32,%ecx -.byte 102,15,56,220,208 -.byte 102,15,56,220,216 -.byte 102,15,56,220,224 - movups -16(%edx,%ecx,1),%xmm0 - jnz .L002enc3_loop -.byte 102,15,56,220,209 -.byte 102,15,56,220,217 -.byte 102,15,56,220,225 -.byte 102,15,56,221,208 -.byte 102,15,56,221,216 -.byte 102,15,56,221,224 - ret -.size _aesni_encrypt3,.-_aesni_encrypt3 -.hidden _aesni_encrypt4 -.type _aesni_encrypt4,@function -.align 16 -_aesni_encrypt4: - movups (%edx),%xmm0 - movups 16(%edx),%xmm1 - shll $4,%ecx - xorps %xmm0,%xmm2 - pxor %xmm0,%xmm3 - pxor %xmm0,%xmm4 - pxor %xmm0,%xmm5 - movups 32(%edx),%xmm0 - leal 32(%edx,%ecx,1),%edx - negl %ecx -.byte 15,31,64,0 - addl $16,%ecx -.L003enc4_loop: -.byte 102,15,56,220,209 -.byte 102,15,56,220,217 -.byte 102,15,56,220,225 -.byte 102,15,56,220,233 - movups (%edx,%ecx,1),%xmm1 - addl $32,%ecx -.byte 102,15,56,220,208 -.byte 102,15,56,220,216 -.byte 102,15,56,220,224 -.byte 102,15,56,220,232 - movups -16(%edx,%ecx,1),%xmm0 - jnz .L003enc4_loop -.byte 102,15,56,220,209 -.byte 102,15,56,220,217 -.byte 102,15,56,220,225 -.byte 102,15,56,220,233 -.byte 102,15,56,221,208 -.byte 102,15,56,221,216 -.byte 102,15,56,221,224 -.byte 102,15,56,221,232 - ret -.size _aesni_encrypt4,.-_aesni_encrypt4 -.hidden _aesni_encrypt6 -.type _aesni_encrypt6,@function -.align 16 -_aesni_encrypt6: - movups (%edx),%xmm0 - shll $4,%ecx - movups 16(%edx),%xmm1 - xorps %xmm0,%xmm2 - pxor %xmm0,%xmm3 - pxor %xmm0,%xmm4 -.byte 102,15,56,220,209 - pxor %xmm0,%xmm5 - pxor %xmm0,%xmm6 -.byte 102,15,56,220,217 - leal 32(%edx,%ecx,1),%edx - negl %ecx -.byte 102,15,56,220,225 - pxor %xmm0,%xmm7 - movups (%edx,%ecx,1),%xmm0 - addl $16,%ecx - jmp .L004_aesni_encrypt6_inner -.align 16 -.L005enc6_loop: -.byte 102,15,56,220,209 -.byte 102,15,56,220,217 -.byte 102,15,56,220,225 -.L004_aesni_encrypt6_inner: -.byte 102,15,56,220,233 -.byte 102,15,56,220,241 -.byte 102,15,56,220,249 -.L_aesni_encrypt6_enter: - movups (%edx,%ecx,1),%xmm1 - addl $32,%ecx -.byte 102,15,56,220,208 -.byte 102,15,56,220,216 -.byte 102,15,56,220,224 -.byte 102,15,56,220,232 -.byte 102,15,56,220,240 -.byte 102,15,56,220,248 - movups -16(%edx,%ecx,1),%xmm0 - jnz .L005enc6_loop -.byte 102,15,56,220,209 -.byte 102,15,56,220,217 -.byte 102,15,56,220,225 -.byte 102,15,56,220,233 -.byte 102,15,56,220,241 -.byte 102,15,56,220,249 -.byte 102,15,56,221,208 -.byte 102,15,56,221,216 -.byte 102,15,56,221,224 -.byte 102,15,56,221,232 -.byte 102,15,56,221,240 -.byte 102,15,56,221,248 - ret -.size _aesni_encrypt6,.-_aesni_encrypt6 -.globl GFp_aes_hw_ctr32_encrypt_blocks -.hidden GFp_aes_hw_ctr32_encrypt_blocks -.type GFp_aes_hw_ctr32_encrypt_blocks,@function -.align 16 -GFp_aes_hw_ctr32_encrypt_blocks: -.L_GFp_aes_hw_ctr32_encrypt_blocks_begin: - pushl %ebp - pushl %ebx - pushl %esi - pushl %edi - movl 20(%esp),%esi - movl 24(%esp),%edi - movl 28(%esp),%eax - movl 32(%esp),%edx - movl 36(%esp),%ebx - movl %esp,%ebp - subl $88,%esp - andl $-16,%esp - movl %ebp,80(%esp) - cmpl $1,%eax - je .L006ctr32_one_shortcut - movdqu (%ebx),%xmm7 - movl $202182159,(%esp) - movl $134810123,4(%esp) - movl $67438087,8(%esp) - movl $66051,12(%esp) - movl $6,%ecx - xorl %ebp,%ebp - movl %ecx,16(%esp) - movl %ecx,20(%esp) - movl %ecx,24(%esp) - movl %ebp,28(%esp) -.byte 102,15,58,22,251,3 -.byte 102,15,58,34,253,3 - movl 240(%edx),%ecx - bswap %ebx - pxor %xmm0,%xmm0 - pxor %xmm1,%xmm1 - movdqa (%esp),%xmm2 -.byte 102,15,58,34,195,0 - leal 3(%ebx),%ebp -.byte 102,15,58,34,205,0 - incl %ebx -.byte 102,15,58,34,195,1 - incl %ebp -.byte 102,15,58,34,205,1 - incl %ebx -.byte 102,15,58,34,195,2 - incl %ebp -.byte 102,15,58,34,205,2 - movdqa %xmm0,48(%esp) -.byte 102,15,56,0,194 - movdqu (%edx),%xmm6 - movdqa %xmm1,64(%esp) -.byte 102,15,56,0,202 - pshufd $192,%xmm0,%xmm2 - pshufd $128,%xmm0,%xmm3 - cmpl $6,%eax - jb .L007ctr32_tail - pxor %xmm6,%xmm7 - shll $4,%ecx - movl $16,%ebx - movdqa %xmm7,32(%esp) - movl %edx,%ebp - subl %ecx,%ebx - leal 32(%edx,%ecx,1),%edx - subl $6,%eax - jmp .L008ctr32_loop6 -.align 16 -.L008ctr32_loop6: - pshufd $64,%xmm0,%xmm4 - movdqa 32(%esp),%xmm0 - pshufd $192,%xmm1,%xmm5 - pxor %xmm0,%xmm2 - pshufd $128,%xmm1,%xmm6 - pxor %xmm0,%xmm3 - pshufd $64,%xmm1,%xmm7 - movups 16(%ebp),%xmm1 - pxor %xmm0,%xmm4 - pxor %xmm0,%xmm5 -.byte 102,15,56,220,209 - pxor %xmm0,%xmm6 - pxor %xmm0,%xmm7 -.byte 102,15,56,220,217 - movups 32(%ebp),%xmm0 - movl %ebx,%ecx -.byte 102,15,56,220,225 -.byte 102,15,56,220,233 -.byte 102,15,56,220,241 -.byte 102,15,56,220,249 - call .L_aesni_encrypt6_enter - movups (%esi),%xmm1 - movups 16(%esi),%xmm0 - xorps %xmm1,%xmm2 - movups 32(%esi),%xmm1 - xorps %xmm0,%xmm3 - movups %xmm2,(%edi) - movdqa 16(%esp),%xmm0 - xorps %xmm1,%xmm4 - movdqa 64(%esp),%xmm1 - movups %xmm3,16(%edi) - movups %xmm4,32(%edi) - paddd %xmm0,%xmm1 - paddd 48(%esp),%xmm0 - movdqa (%esp),%xmm2 - movups 48(%esi),%xmm3 - movups 64(%esi),%xmm4 - xorps %xmm3,%xmm5 - movups 80(%esi),%xmm3 - leal 96(%esi),%esi - movdqa %xmm0,48(%esp) -.byte 102,15,56,0,194 - xorps %xmm4,%xmm6 - movups %xmm5,48(%edi) - xorps %xmm3,%xmm7 - movdqa %xmm1,64(%esp) -.byte 102,15,56,0,202 - movups %xmm6,64(%edi) - pshufd $192,%xmm0,%xmm2 - movups %xmm7,80(%edi) - leal 96(%edi),%edi - pshufd $128,%xmm0,%xmm3 - subl $6,%eax - jnc .L008ctr32_loop6 - addl $6,%eax - jz .L009ctr32_ret - movdqu (%ebp),%xmm7 - movl %ebp,%edx - pxor 32(%esp),%xmm7 - movl 240(%ebp),%ecx -.L007ctr32_tail: - por %xmm7,%xmm2 - cmpl $2,%eax - jb .L010ctr32_one - pshufd $64,%xmm0,%xmm4 - por %xmm7,%xmm3 - je .L011ctr32_two - pshufd $192,%xmm1,%xmm5 - por %xmm7,%xmm4 - cmpl $4,%eax - jb .L012ctr32_three - pshufd $128,%xmm1,%xmm6 - por %xmm7,%xmm5 - je .L013ctr32_four - por %xmm7,%xmm6 - call _aesni_encrypt6 - movups (%esi),%xmm1 - movups 16(%esi),%xmm0 - xorps %xmm1,%xmm2 - movups 32(%esi),%xmm1 - xorps %xmm0,%xmm3 - movups 48(%esi),%xmm0 - xorps %xmm1,%xmm4 - movups 64(%esi),%xmm1 - xorps %xmm0,%xmm5 - movups %xmm2,(%edi) - xorps %xmm1,%xmm6 - movups %xmm3,16(%edi) - movups %xmm4,32(%edi) - movups %xmm5,48(%edi) - movups %xmm6,64(%edi) - jmp .L009ctr32_ret -.align 16 -.L006ctr32_one_shortcut: - movups (%ebx),%xmm2 - movl 240(%edx),%ecx -.L010ctr32_one: - movups (%edx),%xmm0 - movups 16(%edx),%xmm1 - leal 32(%edx),%edx - xorps %xmm0,%xmm2 -.L014enc1_loop_2: -.byte 102,15,56,220,209 - decl %ecx - movups (%edx),%xmm1 - leal 16(%edx),%edx - jnz .L014enc1_loop_2 -.byte 102,15,56,221,209 - movups (%esi),%xmm6 - xorps %xmm2,%xmm6 - movups %xmm6,(%edi) - jmp .L009ctr32_ret -.align 16 -.L011ctr32_two: - call _aesni_encrypt2 - movups (%esi),%xmm5 - movups 16(%esi),%xmm6 - xorps %xmm5,%xmm2 - xorps %xmm6,%xmm3 - movups %xmm2,(%edi) - movups %xmm3,16(%edi) - jmp .L009ctr32_ret -.align 16 -.L012ctr32_three: - call _aesni_encrypt3 - movups (%esi),%xmm5 - movups 16(%esi),%xmm6 - xorps %xmm5,%xmm2 - movups 32(%esi),%xmm7 - xorps %xmm6,%xmm3 - movups %xmm2,(%edi) - xorps %xmm7,%xmm4 - movups %xmm3,16(%edi) - movups %xmm4,32(%edi) - jmp .L009ctr32_ret -.align 16 -.L013ctr32_four: - call _aesni_encrypt4 - movups (%esi),%xmm6 - movups 16(%esi),%xmm7 - movups 32(%esi),%xmm1 - xorps %xmm6,%xmm2 - movups 48(%esi),%xmm0 - xorps %xmm7,%xmm3 - movups %xmm2,(%edi) - xorps %xmm1,%xmm4 - movups %xmm3,16(%edi) - xorps %xmm0,%xmm5 - movups %xmm4,32(%edi) - movups %xmm5,48(%edi) -.L009ctr32_ret: - pxor %xmm0,%xmm0 - pxor %xmm1,%xmm1 - pxor %xmm2,%xmm2 - pxor %xmm3,%xmm3 - pxor %xmm4,%xmm4 - movdqa %xmm0,32(%esp) - pxor %xmm5,%xmm5 - movdqa %xmm0,48(%esp) - pxor %xmm6,%xmm6 - movdqa %xmm0,64(%esp) - pxor %xmm7,%xmm7 - movl 80(%esp),%esp - popl %edi - popl %esi - popl %ebx - popl %ebp - ret -.size GFp_aes_hw_ctr32_encrypt_blocks,.-.L_GFp_aes_hw_ctr32_encrypt_blocks_begin -.hidden _aesni_set_encrypt_key -.type _aesni_set_encrypt_key,@function -.align 16 -_aesni_set_encrypt_key: - pushl %ebp - pushl %ebx - testl %eax,%eax - jz .L015bad_pointer - testl %edx,%edx - jz .L015bad_pointer - call .L016pic -.L016pic: - popl %ebx - leal .Lkey_const-.L016pic(%ebx),%ebx - leal GFp_ia32cap_P-.Lkey_const(%ebx),%ebp - movups (%eax),%xmm0 - xorps %xmm4,%xmm4 - movl 4(%ebp),%ebp - leal 16(%edx),%edx - andl $268437504,%ebp - cmpl $256,%ecx - je .L01714rounds - cmpl $128,%ecx - jne .L018bad_keybits -.align 16 -.L01910rounds: - cmpl $268435456,%ebp - je .L02010rounds_alt - movl $9,%ecx - movups %xmm0,-16(%edx) -.byte 102,15,58,223,200,1 - call .L021key_128_cold -.byte 102,15,58,223,200,2 - call .L022key_128 -.byte 102,15,58,223,200,4 - call .L022key_128 -.byte 102,15,58,223,200,8 - call .L022key_128 -.byte 102,15,58,223,200,16 - call .L022key_128 -.byte 102,15,58,223,200,32 - call .L022key_128 -.byte 102,15,58,223,200,64 - call .L022key_128 -.byte 102,15,58,223,200,128 - call .L022key_128 -.byte 102,15,58,223,200,27 - call .L022key_128 -.byte 102,15,58,223,200,54 - call .L022key_128 - movups %xmm0,(%edx) - movl %ecx,80(%edx) - jmp .L023good_key -.align 16 -.L022key_128: - movups %xmm0,(%edx) - leal 16(%edx),%edx -.L021key_128_cold: - shufps $16,%xmm0,%xmm4 - xorps %xmm4,%xmm0 - shufps $140,%xmm0,%xmm4 - xorps %xmm4,%xmm0 - shufps $255,%xmm1,%xmm1 - xorps %xmm1,%xmm0 - ret -.align 16 -.L02010rounds_alt: - movdqa (%ebx),%xmm5 - movl $8,%ecx - movdqa 32(%ebx),%xmm4 - movdqa %xmm0,%xmm2 - movdqu %xmm0,-16(%edx) -.L024loop_key128: -.byte 102,15,56,0,197 -.byte 102,15,56,221,196 - pslld $1,%xmm4 - leal 16(%edx),%edx - movdqa %xmm2,%xmm3 - pslldq $4,%xmm2 - pxor %xmm2,%xmm3 - pslldq $4,%xmm2 - pxor %xmm2,%xmm3 - pslldq $4,%xmm2 - pxor %xmm3,%xmm2 - pxor %xmm2,%xmm0 - movdqu %xmm0,-16(%edx) - movdqa %xmm0,%xmm2 - decl %ecx - jnz .L024loop_key128 - movdqa 48(%ebx),%xmm4 -.byte 102,15,56,0,197 -.byte 102,15,56,221,196 - pslld $1,%xmm4 - movdqa %xmm2,%xmm3 - pslldq $4,%xmm2 - pxor %xmm2,%xmm3 - pslldq $4,%xmm2 - pxor %xmm2,%xmm3 - pslldq $4,%xmm2 - pxor %xmm3,%xmm2 - pxor %xmm2,%xmm0 - movdqu %xmm0,(%edx) - movdqa %xmm0,%xmm2 -.byte 102,15,56,0,197 -.byte 102,15,56,221,196 - movdqa %xmm2,%xmm3 - pslldq $4,%xmm2 - pxor %xmm2,%xmm3 - pslldq $4,%xmm2 - pxor %xmm2,%xmm3 - pslldq $4,%xmm2 - pxor %xmm3,%xmm2 - pxor %xmm2,%xmm0 - movdqu %xmm0,16(%edx) - movl $9,%ecx - movl %ecx,96(%edx) - jmp .L023good_key -.align 16 -.L01714rounds: - movups 16(%eax),%xmm2 - leal 16(%edx),%edx - cmpl $268435456,%ebp - je .L02514rounds_alt - movl $13,%ecx - movups %xmm0,-32(%edx) - movups %xmm2,-16(%edx) -.byte 102,15,58,223,202,1 - call .L026key_256a_cold -.byte 102,15,58,223,200,1 - call .L027key_256b -.byte 102,15,58,223,202,2 - call .L028key_256a -.byte 102,15,58,223,200,2 - call .L027key_256b -.byte 102,15,58,223,202,4 - call .L028key_256a -.byte 102,15,58,223,200,4 - call .L027key_256b -.byte 102,15,58,223,202,8 - call .L028key_256a -.byte 102,15,58,223,200,8 - call .L027key_256b -.byte 102,15,58,223,202,16 - call .L028key_256a -.byte 102,15,58,223,200,16 - call .L027key_256b -.byte 102,15,58,223,202,32 - call .L028key_256a -.byte 102,15,58,223,200,32 - call .L027key_256b -.byte 102,15,58,223,202,64 - call .L028key_256a - movups %xmm0,(%edx) - movl %ecx,16(%edx) - xorl %eax,%eax - jmp .L023good_key -.align 16 -.L028key_256a: - movups %xmm2,(%edx) - leal 16(%edx),%edx -.L026key_256a_cold: - shufps $16,%xmm0,%xmm4 - xorps %xmm4,%xmm0 - shufps $140,%xmm0,%xmm4 - xorps %xmm4,%xmm0 - shufps $255,%xmm1,%xmm1 - xorps %xmm1,%xmm0 - ret -.align 16 -.L027key_256b: - movups %xmm0,(%edx) - leal 16(%edx),%edx - shufps $16,%xmm2,%xmm4 - xorps %xmm4,%xmm2 - shufps $140,%xmm2,%xmm4 - xorps %xmm4,%xmm2 - shufps $170,%xmm1,%xmm1 - xorps %xmm1,%xmm2 - ret -.align 16 -.L02514rounds_alt: - movdqa (%ebx),%xmm5 - movdqa 32(%ebx),%xmm4 - movl $7,%ecx - movdqu %xmm0,-32(%edx) - movdqa %xmm2,%xmm1 - movdqu %xmm2,-16(%edx) -.L029loop_key256: -.byte 102,15,56,0,213 -.byte 102,15,56,221,212 - movdqa %xmm0,%xmm3 - pslldq $4,%xmm0 - pxor %xmm0,%xmm3 - pslldq $4,%xmm0 - pxor %xmm0,%xmm3 - pslldq $4,%xmm0 - pxor %xmm3,%xmm0 - pslld $1,%xmm4 - pxor %xmm2,%xmm0 - movdqu %xmm0,(%edx) - decl %ecx - jz .L030done_key256 - pshufd $255,%xmm0,%xmm2 - pxor %xmm3,%xmm3 -.byte 102,15,56,221,211 - movdqa %xmm1,%xmm3 - pslldq $4,%xmm1 - pxor %xmm1,%xmm3 - pslldq $4,%xmm1 - pxor %xmm1,%xmm3 - pslldq $4,%xmm1 - pxor %xmm3,%xmm1 - pxor %xmm1,%xmm2 - movdqu %xmm2,16(%edx) - leal 32(%edx),%edx - movdqa %xmm2,%xmm1 - jmp .L029loop_key256 -.L030done_key256: - movl $13,%ecx - movl %ecx,16(%edx) -.L023good_key: - pxor %xmm0,%xmm0 - pxor %xmm1,%xmm1 - pxor %xmm2,%xmm2 - pxor %xmm3,%xmm3 - pxor %xmm4,%xmm4 - pxor %xmm5,%xmm5 - xorl %eax,%eax - popl %ebx - popl %ebp - ret -.align 4 -.L015bad_pointer: - movl $-1,%eax - popl %ebx - popl %ebp - ret -.align 4 -.L018bad_keybits: - pxor %xmm0,%xmm0 - movl $-2,%eax - popl %ebx - popl %ebp - ret -.size _aesni_set_encrypt_key,.-_aesni_set_encrypt_key -.globl GFp_aes_hw_set_encrypt_key -.hidden GFp_aes_hw_set_encrypt_key -.type GFp_aes_hw_set_encrypt_key,@function -.align 16 -GFp_aes_hw_set_encrypt_key: -.L_GFp_aes_hw_set_encrypt_key_begin: - movl 4(%esp),%eax - movl 8(%esp),%ecx - movl 12(%esp),%edx - call _aesni_set_encrypt_key - ret -.size GFp_aes_hw_set_encrypt_key,.-.L_GFp_aes_hw_set_encrypt_key_begin -.align 64 -.Lkey_const: -.long 202313229,202313229,202313229,202313229 -.long 67569157,67569157,67569157,67569157 -.long 1,1,1,1 -.long 27,27,27,27 -.byte 65,69,83,32,102,111,114,32,73,110,116,101,108,32,65,69 -.byte 83,45,78,73,44,32,67,82,89,80,84,79,71,65,77,83 -.byte 32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115 -.byte 115,108,46,111,114,103,62,0 -#endif -.section .note.GNU-stack,"",@progbits diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/aesni-x86-macosx.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/aesni-x86-macosx.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/aesni-x86-macosx.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/aesni-x86-macosx.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,686 +0,0 @@ -# This file is generated from a similarly-named Perl script in the BoringSSL -# source tree. Do not edit by hand. - -#if defined(__i386__) -#if defined(BORINGSSL_PREFIX) -#include -#endif -.text -.globl _GFp_aes_hw_encrypt -.private_extern _GFp_aes_hw_encrypt -.align 4 -_GFp_aes_hw_encrypt: -L_GFp_aes_hw_encrypt_begin: - movl 4(%esp),%eax - movl 12(%esp),%edx - movups (%eax),%xmm2 - movl 240(%edx),%ecx - movl 8(%esp),%eax - movups (%edx),%xmm0 - movups 16(%edx),%xmm1 - leal 32(%edx),%edx - xorps %xmm0,%xmm2 -L000enc1_loop_1: -.byte 102,15,56,220,209 - decl %ecx - movups (%edx),%xmm1 - leal 16(%edx),%edx - jnz L000enc1_loop_1 -.byte 102,15,56,221,209 - pxor %xmm0,%xmm0 - pxor %xmm1,%xmm1 - movups %xmm2,(%eax) - pxor %xmm2,%xmm2 - ret -.private_extern __aesni_encrypt2 -.align 4 -__aesni_encrypt2: - movups (%edx),%xmm0 - shll $4,%ecx - movups 16(%edx),%xmm1 - xorps %xmm0,%xmm2 - pxor %xmm0,%xmm3 - movups 32(%edx),%xmm0 - leal 32(%edx,%ecx,1),%edx - negl %ecx - addl $16,%ecx -L001enc2_loop: -.byte 102,15,56,220,209 -.byte 102,15,56,220,217 - movups (%edx,%ecx,1),%xmm1 - addl $32,%ecx -.byte 102,15,56,220,208 -.byte 102,15,56,220,216 - movups -16(%edx,%ecx,1),%xmm0 - jnz L001enc2_loop -.byte 102,15,56,220,209 -.byte 102,15,56,220,217 -.byte 102,15,56,221,208 -.byte 102,15,56,221,216 - ret -.private_extern __aesni_encrypt3 -.align 4 -__aesni_encrypt3: - movups (%edx),%xmm0 - shll $4,%ecx - movups 16(%edx),%xmm1 - xorps %xmm0,%xmm2 - pxor %xmm0,%xmm3 - pxor %xmm0,%xmm4 - movups 32(%edx),%xmm0 - leal 32(%edx,%ecx,1),%edx - negl %ecx - addl $16,%ecx -L002enc3_loop: -.byte 102,15,56,220,209 -.byte 102,15,56,220,217 -.byte 102,15,56,220,225 - movups (%edx,%ecx,1),%xmm1 - addl $32,%ecx -.byte 102,15,56,220,208 -.byte 102,15,56,220,216 -.byte 102,15,56,220,224 - movups -16(%edx,%ecx,1),%xmm0 - jnz L002enc3_loop -.byte 102,15,56,220,209 -.byte 102,15,56,220,217 -.byte 102,15,56,220,225 -.byte 102,15,56,221,208 -.byte 102,15,56,221,216 -.byte 102,15,56,221,224 - ret -.private_extern __aesni_encrypt4 -.align 4 -__aesni_encrypt4: - movups (%edx),%xmm0 - movups 16(%edx),%xmm1 - shll $4,%ecx - xorps %xmm0,%xmm2 - pxor %xmm0,%xmm3 - pxor %xmm0,%xmm4 - pxor %xmm0,%xmm5 - movups 32(%edx),%xmm0 - leal 32(%edx,%ecx,1),%edx - negl %ecx -.byte 15,31,64,0 - addl $16,%ecx -L003enc4_loop: -.byte 102,15,56,220,209 -.byte 102,15,56,220,217 -.byte 102,15,56,220,225 -.byte 102,15,56,220,233 - movups (%edx,%ecx,1),%xmm1 - addl $32,%ecx -.byte 102,15,56,220,208 -.byte 102,15,56,220,216 -.byte 102,15,56,220,224 -.byte 102,15,56,220,232 - movups -16(%edx,%ecx,1),%xmm0 - jnz L003enc4_loop -.byte 102,15,56,220,209 -.byte 102,15,56,220,217 -.byte 102,15,56,220,225 -.byte 102,15,56,220,233 -.byte 102,15,56,221,208 -.byte 102,15,56,221,216 -.byte 102,15,56,221,224 -.byte 102,15,56,221,232 - ret -.private_extern __aesni_encrypt6 -.align 4 -__aesni_encrypt6: - movups (%edx),%xmm0 - shll $4,%ecx - movups 16(%edx),%xmm1 - xorps %xmm0,%xmm2 - pxor %xmm0,%xmm3 - pxor %xmm0,%xmm4 -.byte 102,15,56,220,209 - pxor %xmm0,%xmm5 - pxor %xmm0,%xmm6 -.byte 102,15,56,220,217 - leal 32(%edx,%ecx,1),%edx - negl %ecx -.byte 102,15,56,220,225 - pxor %xmm0,%xmm7 - movups (%edx,%ecx,1),%xmm0 - addl $16,%ecx - jmp L004_aesni_encrypt6_inner -.align 4,0x90 -L005enc6_loop: -.byte 102,15,56,220,209 -.byte 102,15,56,220,217 -.byte 102,15,56,220,225 -L004_aesni_encrypt6_inner: -.byte 102,15,56,220,233 -.byte 102,15,56,220,241 -.byte 102,15,56,220,249 -L_aesni_encrypt6_enter: - movups (%edx,%ecx,1),%xmm1 - addl $32,%ecx -.byte 102,15,56,220,208 -.byte 102,15,56,220,216 -.byte 102,15,56,220,224 -.byte 102,15,56,220,232 -.byte 102,15,56,220,240 -.byte 102,15,56,220,248 - movups -16(%edx,%ecx,1),%xmm0 - jnz L005enc6_loop -.byte 102,15,56,220,209 -.byte 102,15,56,220,217 -.byte 102,15,56,220,225 -.byte 102,15,56,220,233 -.byte 102,15,56,220,241 -.byte 102,15,56,220,249 -.byte 102,15,56,221,208 -.byte 102,15,56,221,216 -.byte 102,15,56,221,224 -.byte 102,15,56,221,232 -.byte 102,15,56,221,240 -.byte 102,15,56,221,248 - ret -.globl _GFp_aes_hw_ctr32_encrypt_blocks -.private_extern _GFp_aes_hw_ctr32_encrypt_blocks -.align 4 -_GFp_aes_hw_ctr32_encrypt_blocks: -L_GFp_aes_hw_ctr32_encrypt_blocks_begin: - pushl %ebp - pushl %ebx - pushl %esi - pushl %edi - movl 20(%esp),%esi - movl 24(%esp),%edi - movl 28(%esp),%eax - movl 32(%esp),%edx - movl 36(%esp),%ebx - movl %esp,%ebp - subl $88,%esp - andl $-16,%esp - movl %ebp,80(%esp) - cmpl $1,%eax - je L006ctr32_one_shortcut - movdqu (%ebx),%xmm7 - movl $202182159,(%esp) - movl $134810123,4(%esp) - movl $67438087,8(%esp) - movl $66051,12(%esp) - movl $6,%ecx - xorl %ebp,%ebp - movl %ecx,16(%esp) - movl %ecx,20(%esp) - movl %ecx,24(%esp) - movl %ebp,28(%esp) -.byte 102,15,58,22,251,3 -.byte 102,15,58,34,253,3 - movl 240(%edx),%ecx - bswap %ebx - pxor %xmm0,%xmm0 - pxor %xmm1,%xmm1 - movdqa (%esp),%xmm2 -.byte 102,15,58,34,195,0 - leal 3(%ebx),%ebp -.byte 102,15,58,34,205,0 - incl %ebx -.byte 102,15,58,34,195,1 - incl %ebp -.byte 102,15,58,34,205,1 - incl %ebx -.byte 102,15,58,34,195,2 - incl %ebp -.byte 102,15,58,34,205,2 - movdqa %xmm0,48(%esp) -.byte 102,15,56,0,194 - movdqu (%edx),%xmm6 - movdqa %xmm1,64(%esp) -.byte 102,15,56,0,202 - pshufd $192,%xmm0,%xmm2 - pshufd $128,%xmm0,%xmm3 - cmpl $6,%eax - jb L007ctr32_tail - pxor %xmm6,%xmm7 - shll $4,%ecx - movl $16,%ebx - movdqa %xmm7,32(%esp) - movl %edx,%ebp - subl %ecx,%ebx - leal 32(%edx,%ecx,1),%edx - subl $6,%eax - jmp L008ctr32_loop6 -.align 4,0x90 -L008ctr32_loop6: - pshufd $64,%xmm0,%xmm4 - movdqa 32(%esp),%xmm0 - pshufd $192,%xmm1,%xmm5 - pxor %xmm0,%xmm2 - pshufd $128,%xmm1,%xmm6 - pxor %xmm0,%xmm3 - pshufd $64,%xmm1,%xmm7 - movups 16(%ebp),%xmm1 - pxor %xmm0,%xmm4 - pxor %xmm0,%xmm5 -.byte 102,15,56,220,209 - pxor %xmm0,%xmm6 - pxor %xmm0,%xmm7 -.byte 102,15,56,220,217 - movups 32(%ebp),%xmm0 - movl %ebx,%ecx -.byte 102,15,56,220,225 -.byte 102,15,56,220,233 -.byte 102,15,56,220,241 -.byte 102,15,56,220,249 - call L_aesni_encrypt6_enter - movups (%esi),%xmm1 - movups 16(%esi),%xmm0 - xorps %xmm1,%xmm2 - movups 32(%esi),%xmm1 - xorps %xmm0,%xmm3 - movups %xmm2,(%edi) - movdqa 16(%esp),%xmm0 - xorps %xmm1,%xmm4 - movdqa 64(%esp),%xmm1 - movups %xmm3,16(%edi) - movups %xmm4,32(%edi) - paddd %xmm0,%xmm1 - paddd 48(%esp),%xmm0 - movdqa (%esp),%xmm2 - movups 48(%esi),%xmm3 - movups 64(%esi),%xmm4 - xorps %xmm3,%xmm5 - movups 80(%esi),%xmm3 - leal 96(%esi),%esi - movdqa %xmm0,48(%esp) -.byte 102,15,56,0,194 - xorps %xmm4,%xmm6 - movups %xmm5,48(%edi) - xorps %xmm3,%xmm7 - movdqa %xmm1,64(%esp) -.byte 102,15,56,0,202 - movups %xmm6,64(%edi) - pshufd $192,%xmm0,%xmm2 - movups %xmm7,80(%edi) - leal 96(%edi),%edi - pshufd $128,%xmm0,%xmm3 - subl $6,%eax - jnc L008ctr32_loop6 - addl $6,%eax - jz L009ctr32_ret - movdqu (%ebp),%xmm7 - movl %ebp,%edx - pxor 32(%esp),%xmm7 - movl 240(%ebp),%ecx -L007ctr32_tail: - por %xmm7,%xmm2 - cmpl $2,%eax - jb L010ctr32_one - pshufd $64,%xmm0,%xmm4 - por %xmm7,%xmm3 - je L011ctr32_two - pshufd $192,%xmm1,%xmm5 - por %xmm7,%xmm4 - cmpl $4,%eax - jb L012ctr32_three - pshufd $128,%xmm1,%xmm6 - por %xmm7,%xmm5 - je L013ctr32_four - por %xmm7,%xmm6 - call __aesni_encrypt6 - movups (%esi),%xmm1 - movups 16(%esi),%xmm0 - xorps %xmm1,%xmm2 - movups 32(%esi),%xmm1 - xorps %xmm0,%xmm3 - movups 48(%esi),%xmm0 - xorps %xmm1,%xmm4 - movups 64(%esi),%xmm1 - xorps %xmm0,%xmm5 - movups %xmm2,(%edi) - xorps %xmm1,%xmm6 - movups %xmm3,16(%edi) - movups %xmm4,32(%edi) - movups %xmm5,48(%edi) - movups %xmm6,64(%edi) - jmp L009ctr32_ret -.align 4,0x90 -L006ctr32_one_shortcut: - movups (%ebx),%xmm2 - movl 240(%edx),%ecx -L010ctr32_one: - movups (%edx),%xmm0 - movups 16(%edx),%xmm1 - leal 32(%edx),%edx - xorps %xmm0,%xmm2 -L014enc1_loop_2: -.byte 102,15,56,220,209 - decl %ecx - movups (%edx),%xmm1 - leal 16(%edx),%edx - jnz L014enc1_loop_2 -.byte 102,15,56,221,209 - movups (%esi),%xmm6 - xorps %xmm2,%xmm6 - movups %xmm6,(%edi) - jmp L009ctr32_ret -.align 4,0x90 -L011ctr32_two: - call __aesni_encrypt2 - movups (%esi),%xmm5 - movups 16(%esi),%xmm6 - xorps %xmm5,%xmm2 - xorps %xmm6,%xmm3 - movups %xmm2,(%edi) - movups %xmm3,16(%edi) - jmp L009ctr32_ret -.align 4,0x90 -L012ctr32_three: - call __aesni_encrypt3 - movups (%esi),%xmm5 - movups 16(%esi),%xmm6 - xorps %xmm5,%xmm2 - movups 32(%esi),%xmm7 - xorps %xmm6,%xmm3 - movups %xmm2,(%edi) - xorps %xmm7,%xmm4 - movups %xmm3,16(%edi) - movups %xmm4,32(%edi) - jmp L009ctr32_ret -.align 4,0x90 -L013ctr32_four: - call __aesni_encrypt4 - movups (%esi),%xmm6 - movups 16(%esi),%xmm7 - movups 32(%esi),%xmm1 - xorps %xmm6,%xmm2 - movups 48(%esi),%xmm0 - xorps %xmm7,%xmm3 - movups %xmm2,(%edi) - xorps %xmm1,%xmm4 - movups %xmm3,16(%edi) - xorps %xmm0,%xmm5 - movups %xmm4,32(%edi) - movups %xmm5,48(%edi) -L009ctr32_ret: - pxor %xmm0,%xmm0 - pxor %xmm1,%xmm1 - pxor %xmm2,%xmm2 - pxor %xmm3,%xmm3 - pxor %xmm4,%xmm4 - movdqa %xmm0,32(%esp) - pxor %xmm5,%xmm5 - movdqa %xmm0,48(%esp) - pxor %xmm6,%xmm6 - movdqa %xmm0,64(%esp) - pxor %xmm7,%xmm7 - movl 80(%esp),%esp - popl %edi - popl %esi - popl %ebx - popl %ebp - ret -.private_extern __aesni_set_encrypt_key -.align 4 -__aesni_set_encrypt_key: - pushl %ebp - pushl %ebx - testl %eax,%eax - jz L015bad_pointer - testl %edx,%edx - jz L015bad_pointer - call L016pic -L016pic: - popl %ebx - leal Lkey_const-L016pic(%ebx),%ebx - movl L_GFp_ia32cap_P$non_lazy_ptr-Lkey_const(%ebx),%ebp - movups (%eax),%xmm0 - xorps %xmm4,%xmm4 - movl 4(%ebp),%ebp - leal 16(%edx),%edx - andl $268437504,%ebp - cmpl $256,%ecx - je L01714rounds - cmpl $128,%ecx - jne L018bad_keybits -.align 4,0x90 -L01910rounds: - cmpl $268435456,%ebp - je L02010rounds_alt - movl $9,%ecx - movups %xmm0,-16(%edx) -.byte 102,15,58,223,200,1 - call L021key_128_cold -.byte 102,15,58,223,200,2 - call L022key_128 -.byte 102,15,58,223,200,4 - call L022key_128 -.byte 102,15,58,223,200,8 - call L022key_128 -.byte 102,15,58,223,200,16 - call L022key_128 -.byte 102,15,58,223,200,32 - call L022key_128 -.byte 102,15,58,223,200,64 - call L022key_128 -.byte 102,15,58,223,200,128 - call L022key_128 -.byte 102,15,58,223,200,27 - call L022key_128 -.byte 102,15,58,223,200,54 - call L022key_128 - movups %xmm0,(%edx) - movl %ecx,80(%edx) - jmp L023good_key -.align 4,0x90 -L022key_128: - movups %xmm0,(%edx) - leal 16(%edx),%edx -L021key_128_cold: - shufps $16,%xmm0,%xmm4 - xorps %xmm4,%xmm0 - shufps $140,%xmm0,%xmm4 - xorps %xmm4,%xmm0 - shufps $255,%xmm1,%xmm1 - xorps %xmm1,%xmm0 - ret -.align 4,0x90 -L02010rounds_alt: - movdqa (%ebx),%xmm5 - movl $8,%ecx - movdqa 32(%ebx),%xmm4 - movdqa %xmm0,%xmm2 - movdqu %xmm0,-16(%edx) -L024loop_key128: -.byte 102,15,56,0,197 -.byte 102,15,56,221,196 - pslld $1,%xmm4 - leal 16(%edx),%edx - movdqa %xmm2,%xmm3 - pslldq $4,%xmm2 - pxor %xmm2,%xmm3 - pslldq $4,%xmm2 - pxor %xmm2,%xmm3 - pslldq $4,%xmm2 - pxor %xmm3,%xmm2 - pxor %xmm2,%xmm0 - movdqu %xmm0,-16(%edx) - movdqa %xmm0,%xmm2 - decl %ecx - jnz L024loop_key128 - movdqa 48(%ebx),%xmm4 -.byte 102,15,56,0,197 -.byte 102,15,56,221,196 - pslld $1,%xmm4 - movdqa %xmm2,%xmm3 - pslldq $4,%xmm2 - pxor %xmm2,%xmm3 - pslldq $4,%xmm2 - pxor %xmm2,%xmm3 - pslldq $4,%xmm2 - pxor %xmm3,%xmm2 - pxor %xmm2,%xmm0 - movdqu %xmm0,(%edx) - movdqa %xmm0,%xmm2 -.byte 102,15,56,0,197 -.byte 102,15,56,221,196 - movdqa %xmm2,%xmm3 - pslldq $4,%xmm2 - pxor %xmm2,%xmm3 - pslldq $4,%xmm2 - pxor %xmm2,%xmm3 - pslldq $4,%xmm2 - pxor %xmm3,%xmm2 - pxor %xmm2,%xmm0 - movdqu %xmm0,16(%edx) - movl $9,%ecx - movl %ecx,96(%edx) - jmp L023good_key -.align 4,0x90 -L01714rounds: - movups 16(%eax),%xmm2 - leal 16(%edx),%edx - cmpl $268435456,%ebp - je L02514rounds_alt - movl $13,%ecx - movups %xmm0,-32(%edx) - movups %xmm2,-16(%edx) -.byte 102,15,58,223,202,1 - call L026key_256a_cold -.byte 102,15,58,223,200,1 - call L027key_256b -.byte 102,15,58,223,202,2 - call L028key_256a -.byte 102,15,58,223,200,2 - call L027key_256b -.byte 102,15,58,223,202,4 - call L028key_256a -.byte 102,15,58,223,200,4 - call L027key_256b -.byte 102,15,58,223,202,8 - call L028key_256a -.byte 102,15,58,223,200,8 - call L027key_256b -.byte 102,15,58,223,202,16 - call L028key_256a -.byte 102,15,58,223,200,16 - call L027key_256b -.byte 102,15,58,223,202,32 - call L028key_256a -.byte 102,15,58,223,200,32 - call L027key_256b -.byte 102,15,58,223,202,64 - call L028key_256a - movups %xmm0,(%edx) - movl %ecx,16(%edx) - xorl %eax,%eax - jmp L023good_key -.align 4,0x90 -L028key_256a: - movups %xmm2,(%edx) - leal 16(%edx),%edx -L026key_256a_cold: - shufps $16,%xmm0,%xmm4 - xorps %xmm4,%xmm0 - shufps $140,%xmm0,%xmm4 - xorps %xmm4,%xmm0 - shufps $255,%xmm1,%xmm1 - xorps %xmm1,%xmm0 - ret -.align 4,0x90 -L027key_256b: - movups %xmm0,(%edx) - leal 16(%edx),%edx - shufps $16,%xmm2,%xmm4 - xorps %xmm4,%xmm2 - shufps $140,%xmm2,%xmm4 - xorps %xmm4,%xmm2 - shufps $170,%xmm1,%xmm1 - xorps %xmm1,%xmm2 - ret -.align 4,0x90 -L02514rounds_alt: - movdqa (%ebx),%xmm5 - movdqa 32(%ebx),%xmm4 - movl $7,%ecx - movdqu %xmm0,-32(%edx) - movdqa %xmm2,%xmm1 - movdqu %xmm2,-16(%edx) -L029loop_key256: -.byte 102,15,56,0,213 -.byte 102,15,56,221,212 - movdqa %xmm0,%xmm3 - pslldq $4,%xmm0 - pxor %xmm0,%xmm3 - pslldq $4,%xmm0 - pxor %xmm0,%xmm3 - pslldq $4,%xmm0 - pxor %xmm3,%xmm0 - pslld $1,%xmm4 - pxor %xmm2,%xmm0 - movdqu %xmm0,(%edx) - decl %ecx - jz L030done_key256 - pshufd $255,%xmm0,%xmm2 - pxor %xmm3,%xmm3 -.byte 102,15,56,221,211 - movdqa %xmm1,%xmm3 - pslldq $4,%xmm1 - pxor %xmm1,%xmm3 - pslldq $4,%xmm1 - pxor %xmm1,%xmm3 - pslldq $4,%xmm1 - pxor %xmm3,%xmm1 - pxor %xmm1,%xmm2 - movdqu %xmm2,16(%edx) - leal 32(%edx),%edx - movdqa %xmm2,%xmm1 - jmp L029loop_key256 -L030done_key256: - movl $13,%ecx - movl %ecx,16(%edx) -L023good_key: - pxor %xmm0,%xmm0 - pxor %xmm1,%xmm1 - pxor %xmm2,%xmm2 - pxor %xmm3,%xmm3 - pxor %xmm4,%xmm4 - pxor %xmm5,%xmm5 - xorl %eax,%eax - popl %ebx - popl %ebp - ret -.align 2,0x90 -L015bad_pointer: - movl $-1,%eax - popl %ebx - popl %ebp - ret -.align 2,0x90 -L018bad_keybits: - pxor %xmm0,%xmm0 - movl $-2,%eax - popl %ebx - popl %ebp - ret -.globl _GFp_aes_hw_set_encrypt_key -.private_extern _GFp_aes_hw_set_encrypt_key -.align 4 -_GFp_aes_hw_set_encrypt_key: -L_GFp_aes_hw_set_encrypt_key_begin: - movl 4(%esp),%eax - movl 8(%esp),%ecx - movl 12(%esp),%edx - call __aesni_set_encrypt_key - ret -.align 6,0x90 -Lkey_const: -.long 202313229,202313229,202313229,202313229 -.long 67569157,67569157,67569157,67569157 -.long 1,1,1,1 -.long 27,27,27,27 -.byte 65,69,83,32,102,111,114,32,73,110,116,101,108,32,65,69 -.byte 83,45,78,73,44,32,67,82,89,80,84,79,71,65,77,83 -.byte 32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115 -.byte 115,108,46,111,114,103,62,0 -.section __IMPORT,__pointers,non_lazy_symbol_pointers -L_GFp_ia32cap_P$non_lazy_ptr: -.indirect_symbol _GFp_ia32cap_P -.long 0 -#endif Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/aesni-x86-win32n.obj and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/aesni-x86-win32n.obj differ diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/aesv8-armx-ios32.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/aesv8-armx-ios32.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/aesv8-armx-ios32.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/aesv8-armx-ios32.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,436 +0,0 @@ -// This file is generated from a similarly-named Perl script in the BoringSSL -// source tree. Do not edit by hand. - -#if !defined(__has_feature) -#define __has_feature(x) 0 -#endif -#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) -#define OPENSSL_NO_ASM -#endif - -#if !defined(OPENSSL_NO_ASM) -#include - -#if __ARM_MAX_ARCH__>=7 -.text - - -.code 32 -#undef __thumb2__ -.align 5 -Lrcon: -.long 0x01,0x01,0x01,0x01 -.long 0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d @ rotate-n-splat -.long 0x1b,0x1b,0x1b,0x1b - -.text - -.globl _GFp_aes_hw_set_encrypt_key -.private_extern _GFp_aes_hw_set_encrypt_key -#ifdef __thumb2__ -.thumb_func _GFp_aes_hw_set_encrypt_key -#endif -.align 5 -_GFp_aes_hw_set_encrypt_key: -Lenc_key: - mov r3,#-1 - cmp r0,#0 - beq Lenc_key_abort - cmp r2,#0 - beq Lenc_key_abort - mov r3,#-2 - cmp r1,#128 - blt Lenc_key_abort - cmp r1,#256 - bgt Lenc_key_abort - tst r1,#0x3f - bne Lenc_key_abort - - adr r3,Lrcon - cmp r1,#192 - - veor q0,q0,q0 - vld1.8 {q3},[r0]! - mov r1,#8 @ reuse r1 - vld1.32 {q1,q2},[r3]! - - blt Loop128 - @ 192-bit key support was removed. - b L256 - -.align 4 -Loop128: - vtbl.8 d20,{q3},d4 - vtbl.8 d21,{q3},d5 - vext.8 q9,q0,q3,#12 - vst1.32 {q3},[r2]! -.byte 0x00,0x43,0xf0,0xf3 @ aese q10,q0 - subs r1,r1,#1 - - veor q3,q3,q9 - vext.8 q9,q0,q9,#12 - veor q3,q3,q9 - vext.8 q9,q0,q9,#12 - veor q10,q10,q1 - veor q3,q3,q9 - vshl.u8 q1,q1,#1 - veor q3,q3,q10 - bne Loop128 - - vld1.32 {q1},[r3] - - vtbl.8 d20,{q3},d4 - vtbl.8 d21,{q3},d5 - vext.8 q9,q0,q3,#12 - vst1.32 {q3},[r2]! -.byte 0x00,0x43,0xf0,0xf3 @ aese q10,q0 - - veor q3,q3,q9 - vext.8 q9,q0,q9,#12 - veor q3,q3,q9 - vext.8 q9,q0,q9,#12 - veor q10,q10,q1 - veor q3,q3,q9 - vshl.u8 q1,q1,#1 - veor q3,q3,q10 - - vtbl.8 d20,{q3},d4 - vtbl.8 d21,{q3},d5 - vext.8 q9,q0,q3,#12 - vst1.32 {q3},[r2]! -.byte 0x00,0x43,0xf0,0xf3 @ aese q10,q0 - - veor q3,q3,q9 - vext.8 q9,q0,q9,#12 - veor q3,q3,q9 - vext.8 q9,q0,q9,#12 - veor q10,q10,q1 - veor q3,q3,q9 - veor q3,q3,q10 - vst1.32 {q3},[r2] - add r2,r2,#0x50 - - mov r12,#10 - b Ldone - -@ 192-bit key support was removed. - -.align 4 -L256: - vld1.8 {q8},[r0] - mov r1,#7 - mov r12,#14 - vst1.32 {q3},[r2]! - -Loop256: - vtbl.8 d20,{q8},d4 - vtbl.8 d21,{q8},d5 - vext.8 q9,q0,q3,#12 - vst1.32 {q8},[r2]! -.byte 0x00,0x43,0xf0,0xf3 @ aese q10,q0 - subs r1,r1,#1 - - veor q3,q3,q9 - vext.8 q9,q0,q9,#12 - veor q3,q3,q9 - vext.8 q9,q0,q9,#12 - veor q10,q10,q1 - veor q3,q3,q9 - vshl.u8 q1,q1,#1 - veor q3,q3,q10 - vst1.32 {q3},[r2]! - beq Ldone - - vdup.32 q10,d7[1] - vext.8 q9,q0,q8,#12 -.byte 0x00,0x43,0xf0,0xf3 @ aese q10,q0 - - veor q8,q8,q9 - vext.8 q9,q0,q9,#12 - veor q8,q8,q9 - vext.8 q9,q0,q9,#12 - veor q8,q8,q9 - - veor q8,q8,q10 - b Loop256 - -Ldone: - str r12,[r2] - mov r3,#0 - -Lenc_key_abort: - mov r0,r3 @ return value - - bx lr - -.globl _GFp_aes_hw_encrypt -.private_extern _GFp_aes_hw_encrypt -#ifdef __thumb2__ -.thumb_func _GFp_aes_hw_encrypt -#endif -.align 5 -_GFp_aes_hw_encrypt: - AARCH64_VALID_CALL_TARGET - ldr r3,[r2,#240] - vld1.32 {q0},[r2]! - vld1.8 {q2},[r0] - sub r3,r3,#2 - vld1.32 {q1},[r2]! - -Loop_enc: -.byte 0x00,0x43,0xb0,0xf3 @ aese q2,q0 -.byte 0x84,0x43,0xb0,0xf3 @ aesmc q2,q2 - vld1.32 {q0},[r2]! - subs r3,r3,#2 -.byte 0x02,0x43,0xb0,0xf3 @ aese q2,q1 -.byte 0x84,0x43,0xb0,0xf3 @ aesmc q2,q2 - vld1.32 {q1},[r2]! - bgt Loop_enc - -.byte 0x00,0x43,0xb0,0xf3 @ aese q2,q0 -.byte 0x84,0x43,0xb0,0xf3 @ aesmc q2,q2 - vld1.32 {q0},[r2] -.byte 0x02,0x43,0xb0,0xf3 @ aese q2,q1 - veor q2,q2,q0 - - vst1.8 {q2},[r1] - bx lr - -.globl _GFp_aes_hw_decrypt -.private_extern _GFp_aes_hw_decrypt -#ifdef __thumb2__ -.thumb_func _GFp_aes_hw_decrypt -#endif -.align 5 -_GFp_aes_hw_decrypt: - AARCH64_VALID_CALL_TARGET - ldr r3,[r2,#240] - vld1.32 {q0},[r2]! - vld1.8 {q2},[r0] - sub r3,r3,#2 - vld1.32 {q1},[r2]! - -Loop_dec: -.byte 0x40,0x43,0xb0,0xf3 @ aesd q2,q0 -.byte 0xc4,0x43,0xb0,0xf3 @ aesimc q2,q2 - vld1.32 {q0},[r2]! - subs r3,r3,#2 -.byte 0x42,0x43,0xb0,0xf3 @ aesd q2,q1 -.byte 0xc4,0x43,0xb0,0xf3 @ aesimc q2,q2 - vld1.32 {q1},[r2]! - bgt Loop_dec - -.byte 0x40,0x43,0xb0,0xf3 @ aesd q2,q0 -.byte 0xc4,0x43,0xb0,0xf3 @ aesimc q2,q2 - vld1.32 {q0},[r2] -.byte 0x42,0x43,0xb0,0xf3 @ aesd q2,q1 - veor q2,q2,q0 - - vst1.8 {q2},[r1] - bx lr - -.globl _GFp_aes_hw_ctr32_encrypt_blocks -.private_extern _GFp_aes_hw_ctr32_encrypt_blocks -#ifdef __thumb2__ -.thumb_func _GFp_aes_hw_ctr32_encrypt_blocks -#endif -.align 5 -_GFp_aes_hw_ctr32_encrypt_blocks: - mov ip,sp - stmdb sp!,{r4,r5,r6,r7,r8,r9,r10,lr} - vstmdb sp!,{d8,d9,d10,d11,d12,d13,d14,d15} @ ABI specification says so - ldr r4, [ip] @ load remaining arg - ldr r5,[r3,#240] - - ldr r8, [r4, #12] - vld1.32 {q0},[r4] - - vld1.32 {q8,q9},[r3] @ load key schedule... - sub r5,r5,#4 - mov r12,#16 - cmp r2,#2 - add r7,r3,r5,lsl#4 @ pointer to last 5 round keys - sub r5,r5,#2 - vld1.32 {q12,q13},[r7]! - vld1.32 {q14,q15},[r7]! - vld1.32 {q7},[r7] - add r7,r3,#32 - mov r6,r5 - movlo r12,#0 - - @ ARM Cortex-A57 and Cortex-A72 cores running in 32-bit mode are - @ affected by silicon errata #1742098 [0] and #1655431 [1], - @ respectively, where the second instruction of an aese/aesmc - @ instruction pair may execute twice if an interrupt is taken right - @ after the first instruction consumes an input register of which a - @ single 32-bit lane has been updated the last time it was modified. - @ - @ This function uses a counter in one 32-bit lane. The - @ could write to q1 and q10 directly, but that trips this bugs. - @ We write to q6 and copy to the final register as a workaround. - @ - @ [0] ARM-EPM-049219 v23 Cortex-A57 MPCore Software Developers Errata Notice - @ [1] ARM-EPM-012079 v11.0 Cortex-A72 MPCore Software Developers Errata Notice -#ifndef __ARMEB__ - rev r8, r8 -#endif - add r10, r8, #1 - vorr q6,q0,q0 - rev r10, r10 - vmov.32 d13[1],r10 - add r8, r8, #2 - vorr q1,q6,q6 - bls Lctr32_tail - rev r12, r8 - vmov.32 d13[1],r12 - sub r2,r2,#3 @ bias - vorr q10,q6,q6 - b Loop3x_ctr32 - -.align 4 -Loop3x_ctr32: -.byte 0x20,0x03,0xb0,0xf3 @ aese q0,q8 -.byte 0x80,0x03,0xb0,0xf3 @ aesmc q0,q0 -.byte 0x20,0x23,0xb0,0xf3 @ aese q1,q8 -.byte 0x82,0x23,0xb0,0xf3 @ aesmc q1,q1 -.byte 0x20,0x43,0xf0,0xf3 @ aese q10,q8 -.byte 0xa4,0x43,0xf0,0xf3 @ aesmc q10,q10 - vld1.32 {q8},[r7]! - subs r6,r6,#2 -.byte 0x22,0x03,0xb0,0xf3 @ aese q0,q9 -.byte 0x80,0x03,0xb0,0xf3 @ aesmc q0,q0 -.byte 0x22,0x23,0xb0,0xf3 @ aese q1,q9 -.byte 0x82,0x23,0xb0,0xf3 @ aesmc q1,q1 -.byte 0x22,0x43,0xf0,0xf3 @ aese q10,q9 -.byte 0xa4,0x43,0xf0,0xf3 @ aesmc q10,q10 - vld1.32 {q9},[r7]! - bgt Loop3x_ctr32 - -.byte 0x20,0x03,0xb0,0xf3 @ aese q0,q8 -.byte 0x80,0x83,0xb0,0xf3 @ aesmc q4,q0 -.byte 0x20,0x23,0xb0,0xf3 @ aese q1,q8 -.byte 0x82,0xa3,0xb0,0xf3 @ aesmc q5,q1 - vld1.8 {q2},[r0]! - add r9,r8,#1 -.byte 0x20,0x43,0xf0,0xf3 @ aese q10,q8 -.byte 0xa4,0x43,0xf0,0xf3 @ aesmc q10,q10 - vld1.8 {q3},[r0]! - rev r9,r9 -.byte 0x22,0x83,0xb0,0xf3 @ aese q4,q9 -.byte 0x88,0x83,0xb0,0xf3 @ aesmc q4,q4 -.byte 0x22,0xa3,0xb0,0xf3 @ aese q5,q9 -.byte 0x8a,0xa3,0xb0,0xf3 @ aesmc q5,q5 - vld1.8 {q11},[r0]! - mov r7,r3 -.byte 0x22,0x43,0xf0,0xf3 @ aese q10,q9 -.byte 0xa4,0x23,0xf0,0xf3 @ aesmc q9,q10 -.byte 0x28,0x83,0xb0,0xf3 @ aese q4,q12 -.byte 0x88,0x83,0xb0,0xf3 @ aesmc q4,q4 -.byte 0x28,0xa3,0xb0,0xf3 @ aese q5,q12 -.byte 0x8a,0xa3,0xb0,0xf3 @ aesmc q5,q5 - veor q2,q2,q7 - add r10,r8,#2 -.byte 0x28,0x23,0xf0,0xf3 @ aese q9,q12 -.byte 0xa2,0x23,0xf0,0xf3 @ aesmc q9,q9 - veor q3,q3,q7 - add r8,r8,#3 -.byte 0x2a,0x83,0xb0,0xf3 @ aese q4,q13 -.byte 0x88,0x83,0xb0,0xf3 @ aesmc q4,q4 -.byte 0x2a,0xa3,0xb0,0xf3 @ aese q5,q13 -.byte 0x8a,0xa3,0xb0,0xf3 @ aesmc q5,q5 - @ Note the logic to update q0, q1, and q1 is written to work - @ around a bug in ARM Cortex-A57 and Cortex-A72 cores running in - @ 32-bit mode. See the comment above. - veor q11,q11,q7 - vmov.32 d13[1], r9 -.byte 0x2a,0x23,0xf0,0xf3 @ aese q9,q13 -.byte 0xa2,0x23,0xf0,0xf3 @ aesmc q9,q9 - vorr q0,q6,q6 - rev r10,r10 -.byte 0x2c,0x83,0xb0,0xf3 @ aese q4,q14 -.byte 0x88,0x83,0xb0,0xf3 @ aesmc q4,q4 - vmov.32 d13[1], r10 - rev r12,r8 -.byte 0x2c,0xa3,0xb0,0xf3 @ aese q5,q14 -.byte 0x8a,0xa3,0xb0,0xf3 @ aesmc q5,q5 - vorr q1,q6,q6 - vmov.32 d13[1], r12 -.byte 0x2c,0x23,0xf0,0xf3 @ aese q9,q14 -.byte 0xa2,0x23,0xf0,0xf3 @ aesmc q9,q9 - vorr q10,q6,q6 - subs r2,r2,#3 -.byte 0x2e,0x83,0xb0,0xf3 @ aese q4,q15 -.byte 0x2e,0xa3,0xb0,0xf3 @ aese q5,q15 -.byte 0x2e,0x23,0xf0,0xf3 @ aese q9,q15 - - veor q2,q2,q4 - vld1.32 {q8},[r7]! @ re-pre-load rndkey[0] - vst1.8 {q2},[r1]! - veor q3,q3,q5 - mov r6,r5 - vst1.8 {q3},[r1]! - veor q11,q11,q9 - vld1.32 {q9},[r7]! @ re-pre-load rndkey[1] - vst1.8 {q11},[r1]! - bhs Loop3x_ctr32 - - adds r2,r2,#3 - beq Lctr32_done - cmp r2,#1 - mov r12,#16 - moveq r12,#0 - -Lctr32_tail: -.byte 0x20,0x03,0xb0,0xf3 @ aese q0,q8 -.byte 0x80,0x03,0xb0,0xf3 @ aesmc q0,q0 -.byte 0x20,0x23,0xb0,0xf3 @ aese q1,q8 -.byte 0x82,0x23,0xb0,0xf3 @ aesmc q1,q1 - vld1.32 {q8},[r7]! - subs r6,r6,#2 -.byte 0x22,0x03,0xb0,0xf3 @ aese q0,q9 -.byte 0x80,0x03,0xb0,0xf3 @ aesmc q0,q0 -.byte 0x22,0x23,0xb0,0xf3 @ aese q1,q9 -.byte 0x82,0x23,0xb0,0xf3 @ aesmc q1,q1 - vld1.32 {q9},[r7]! - bgt Lctr32_tail - -.byte 0x20,0x03,0xb0,0xf3 @ aese q0,q8 -.byte 0x80,0x03,0xb0,0xf3 @ aesmc q0,q0 -.byte 0x20,0x23,0xb0,0xf3 @ aese q1,q8 -.byte 0x82,0x23,0xb0,0xf3 @ aesmc q1,q1 -.byte 0x22,0x03,0xb0,0xf3 @ aese q0,q9 -.byte 0x80,0x03,0xb0,0xf3 @ aesmc q0,q0 -.byte 0x22,0x23,0xb0,0xf3 @ aese q1,q9 -.byte 0x82,0x23,0xb0,0xf3 @ aesmc q1,q1 - vld1.8 {q2},[r0],r12 -.byte 0x28,0x03,0xb0,0xf3 @ aese q0,q12 -.byte 0x80,0x03,0xb0,0xf3 @ aesmc q0,q0 -.byte 0x28,0x23,0xb0,0xf3 @ aese q1,q12 -.byte 0x82,0x23,0xb0,0xf3 @ aesmc q1,q1 - vld1.8 {q3},[r0] -.byte 0x2a,0x03,0xb0,0xf3 @ aese q0,q13 -.byte 0x80,0x03,0xb0,0xf3 @ aesmc q0,q0 -.byte 0x2a,0x23,0xb0,0xf3 @ aese q1,q13 -.byte 0x82,0x23,0xb0,0xf3 @ aesmc q1,q1 - veor q2,q2,q7 -.byte 0x2c,0x03,0xb0,0xf3 @ aese q0,q14 -.byte 0x80,0x03,0xb0,0xf3 @ aesmc q0,q0 -.byte 0x2c,0x23,0xb0,0xf3 @ aese q1,q14 -.byte 0x82,0x23,0xb0,0xf3 @ aesmc q1,q1 - veor q3,q3,q7 -.byte 0x2e,0x03,0xb0,0xf3 @ aese q0,q15 -.byte 0x2e,0x23,0xb0,0xf3 @ aese q1,q15 - - cmp r2,#1 - veor q2,q2,q0 - veor q3,q3,q1 - vst1.8 {q2},[r1]! - beq Lctr32_done - vst1.8 {q3},[r1] - -Lctr32_done: - vldmia sp!,{d8,d9,d10,d11,d12,d13,d14,d15} - ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,pc} - -#endif -#endif // !OPENSSL_NO_ASM diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/aesv8-armx-ios64.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/aesv8-armx-ios64.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/aesv8-armx-ios64.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/aesv8-armx-ios64.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,427 +0,0 @@ -// This file is generated from a similarly-named Perl script in the BoringSSL -// source tree. Do not edit by hand. - -#if !defined(__has_feature) -#define __has_feature(x) 0 -#endif -#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) -#define OPENSSL_NO_ASM -#endif - -#if !defined(OPENSSL_NO_ASM) -#include - -#if __ARM_MAX_ARCH__>=7 -.text - -.section __TEXT,__const -.align 5 -Lrcon: -.long 0x01,0x01,0x01,0x01 -.long 0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d // rotate-n-splat -.long 0x1b,0x1b,0x1b,0x1b - -.text - -.globl _GFp_aes_hw_set_encrypt_key -.private_extern _GFp_aes_hw_set_encrypt_key - -.align 5 -_GFp_aes_hw_set_encrypt_key: -Lenc_key: - // Armv8.3-A PAuth: even though x30 is pushed to stack it is not popped later. - AARCH64_VALID_CALL_TARGET - stp x29,x30,[sp,#-16]! - add x29,sp,#0 - mov x3,#-1 - cmp x0,#0 - b.eq Lenc_key_abort - cmp x2,#0 - b.eq Lenc_key_abort - mov x3,#-2 - cmp w1,#128 - b.lt Lenc_key_abort - cmp w1,#256 - b.gt Lenc_key_abort - tst w1,#0x3f - b.ne Lenc_key_abort - - adrp x3,Lrcon@PAGE - add x3,x3,Lrcon@PAGEOFF - cmp w1,#192 - - eor v0.16b,v0.16b,v0.16b - ld1 {v3.16b},[x0],#16 - mov w1,#8 // reuse w1 - ld1 {v1.4s,v2.4s},[x3],#32 - - b.lt Loop128 - // 192-bit key support was removed. - b L256 - -.align 4 -Loop128: - tbl v6.16b,{v3.16b},v2.16b - ext v5.16b,v0.16b,v3.16b,#12 - st1 {v3.4s},[x2],#16 - aese v6.16b,v0.16b - subs w1,w1,#1 - - eor v3.16b,v3.16b,v5.16b - ext v5.16b,v0.16b,v5.16b,#12 - eor v3.16b,v3.16b,v5.16b - ext v5.16b,v0.16b,v5.16b,#12 - eor v6.16b,v6.16b,v1.16b - eor v3.16b,v3.16b,v5.16b - shl v1.16b,v1.16b,#1 - eor v3.16b,v3.16b,v6.16b - b.ne Loop128 - - ld1 {v1.4s},[x3] - - tbl v6.16b,{v3.16b},v2.16b - ext v5.16b,v0.16b,v3.16b,#12 - st1 {v3.4s},[x2],#16 - aese v6.16b,v0.16b - - eor v3.16b,v3.16b,v5.16b - ext v5.16b,v0.16b,v5.16b,#12 - eor v3.16b,v3.16b,v5.16b - ext v5.16b,v0.16b,v5.16b,#12 - eor v6.16b,v6.16b,v1.16b - eor v3.16b,v3.16b,v5.16b - shl v1.16b,v1.16b,#1 - eor v3.16b,v3.16b,v6.16b - - tbl v6.16b,{v3.16b},v2.16b - ext v5.16b,v0.16b,v3.16b,#12 - st1 {v3.4s},[x2],#16 - aese v6.16b,v0.16b - - eor v3.16b,v3.16b,v5.16b - ext v5.16b,v0.16b,v5.16b,#12 - eor v3.16b,v3.16b,v5.16b - ext v5.16b,v0.16b,v5.16b,#12 - eor v6.16b,v6.16b,v1.16b - eor v3.16b,v3.16b,v5.16b - eor v3.16b,v3.16b,v6.16b - st1 {v3.4s},[x2] - add x2,x2,#0x50 - - mov w12,#10 - b Ldone - -// 192-bit key support was removed. - -.align 4 -L256: - ld1 {v4.16b},[x0] - mov w1,#7 - mov w12,#14 - st1 {v3.4s},[x2],#16 - -Loop256: - tbl v6.16b,{v4.16b},v2.16b - ext v5.16b,v0.16b,v3.16b,#12 - st1 {v4.4s},[x2],#16 - aese v6.16b,v0.16b - subs w1,w1,#1 - - eor v3.16b,v3.16b,v5.16b - ext v5.16b,v0.16b,v5.16b,#12 - eor v3.16b,v3.16b,v5.16b - ext v5.16b,v0.16b,v5.16b,#12 - eor v6.16b,v6.16b,v1.16b - eor v3.16b,v3.16b,v5.16b - shl v1.16b,v1.16b,#1 - eor v3.16b,v3.16b,v6.16b - st1 {v3.4s},[x2],#16 - b.eq Ldone - - dup v6.4s,v3.s[3] // just splat - ext v5.16b,v0.16b,v4.16b,#12 - aese v6.16b,v0.16b - - eor v4.16b,v4.16b,v5.16b - ext v5.16b,v0.16b,v5.16b,#12 - eor v4.16b,v4.16b,v5.16b - ext v5.16b,v0.16b,v5.16b,#12 - eor v4.16b,v4.16b,v5.16b - - eor v4.16b,v4.16b,v6.16b - b Loop256 - -Ldone: - str w12,[x2] - mov x3,#0 - -Lenc_key_abort: - mov x0,x3 // return value - ldr x29,[sp],#16 - ret - -.globl _GFp_aes_hw_encrypt -.private_extern _GFp_aes_hw_encrypt - -.align 5 -_GFp_aes_hw_encrypt: - AARCH64_VALID_CALL_TARGET - ldr w3,[x2,#240] - ld1 {v0.4s},[x2],#16 - ld1 {v2.16b},[x0] - sub w3,w3,#2 - ld1 {v1.4s},[x2],#16 - -Loop_enc: - aese v2.16b,v0.16b - aesmc v2.16b,v2.16b - ld1 {v0.4s},[x2],#16 - subs w3,w3,#2 - aese v2.16b,v1.16b - aesmc v2.16b,v2.16b - ld1 {v1.4s},[x2],#16 - b.gt Loop_enc - - aese v2.16b,v0.16b - aesmc v2.16b,v2.16b - ld1 {v0.4s},[x2] - aese v2.16b,v1.16b - eor v2.16b,v2.16b,v0.16b - - st1 {v2.16b},[x1] - ret - -.globl _GFp_aes_hw_decrypt -.private_extern _GFp_aes_hw_decrypt - -.align 5 -_GFp_aes_hw_decrypt: - AARCH64_VALID_CALL_TARGET - ldr w3,[x2,#240] - ld1 {v0.4s},[x2],#16 - ld1 {v2.16b},[x0] - sub w3,w3,#2 - ld1 {v1.4s},[x2],#16 - -Loop_dec: - aesd v2.16b,v0.16b - aesimc v2.16b,v2.16b - ld1 {v0.4s},[x2],#16 - subs w3,w3,#2 - aesd v2.16b,v1.16b - aesimc v2.16b,v2.16b - ld1 {v1.4s},[x2],#16 - b.gt Loop_dec - - aesd v2.16b,v0.16b - aesimc v2.16b,v2.16b - ld1 {v0.4s},[x2] - aesd v2.16b,v1.16b - eor v2.16b,v2.16b,v0.16b - - st1 {v2.16b},[x1] - ret - -.globl _GFp_aes_hw_ctr32_encrypt_blocks -.private_extern _GFp_aes_hw_ctr32_encrypt_blocks - -.align 5 -_GFp_aes_hw_ctr32_encrypt_blocks: - // Armv8.3-A PAuth: even though x30 is pushed to stack it is not popped later. - AARCH64_VALID_CALL_TARGET - stp x29,x30,[sp,#-16]! - add x29,sp,#0 - ldr w5,[x3,#240] - - ldr w8, [x4, #12] - ld1 {v0.4s},[x4] - - ld1 {v16.4s,v17.4s},[x3] // load key schedule... - sub w5,w5,#4 - mov x12,#16 - cmp x2,#2 - add x7,x3,x5,lsl#4 // pointer to last 5 round keys - sub w5,w5,#2 - ld1 {v20.4s,v21.4s},[x7],#32 - ld1 {v22.4s,v23.4s},[x7],#32 - ld1 {v7.4s},[x7] - add x7,x3,#32 - mov w6,w5 - csel x12,xzr,x12,lo - - // ARM Cortex-A57 and Cortex-A72 cores running in 32-bit mode are - // affected by silicon errata #1742098 [0] and #1655431 [1], - // respectively, where the second instruction of an aese/aesmc - // instruction pair may execute twice if an interrupt is taken right - // after the first instruction consumes an input register of which a - // single 32-bit lane has been updated the last time it was modified. - // - // This function uses a counter in one 32-bit lane. The vmov lines - // could write to v1.16b and v18.16b directly, but that trips this bugs. - // We write to v6.16b and copy to the final register as a workaround. - // - // [0] ARM-EPM-049219 v23 Cortex-A57 MPCore Software Developers Errata Notice - // [1] ARM-EPM-012079 v11.0 Cortex-A72 MPCore Software Developers Errata Notice -#ifndef __ARMEB__ - rev w8, w8 -#endif - add w10, w8, #1 - orr v6.16b,v0.16b,v0.16b - rev w10, w10 - mov v6.s[3],w10 - add w8, w8, #2 - orr v1.16b,v6.16b,v6.16b - b.ls Lctr32_tail - rev w12, w8 - mov v6.s[3],w12 - sub x2,x2,#3 // bias - orr v18.16b,v6.16b,v6.16b - b Loop3x_ctr32 - -.align 4 -Loop3x_ctr32: - aese v0.16b,v16.16b - aesmc v0.16b,v0.16b - aese v1.16b,v16.16b - aesmc v1.16b,v1.16b - aese v18.16b,v16.16b - aesmc v18.16b,v18.16b - ld1 {v16.4s},[x7],#16 - subs w6,w6,#2 - aese v0.16b,v17.16b - aesmc v0.16b,v0.16b - aese v1.16b,v17.16b - aesmc v1.16b,v1.16b - aese v18.16b,v17.16b - aesmc v18.16b,v18.16b - ld1 {v17.4s},[x7],#16 - b.gt Loop3x_ctr32 - - aese v0.16b,v16.16b - aesmc v4.16b,v0.16b - aese v1.16b,v16.16b - aesmc v5.16b,v1.16b - ld1 {v2.16b},[x0],#16 - add w9,w8,#1 - aese v18.16b,v16.16b - aesmc v18.16b,v18.16b - ld1 {v3.16b},[x0],#16 - rev w9,w9 - aese v4.16b,v17.16b - aesmc v4.16b,v4.16b - aese v5.16b,v17.16b - aesmc v5.16b,v5.16b - ld1 {v19.16b},[x0],#16 - mov x7,x3 - aese v18.16b,v17.16b - aesmc v17.16b,v18.16b - aese v4.16b,v20.16b - aesmc v4.16b,v4.16b - aese v5.16b,v20.16b - aesmc v5.16b,v5.16b - eor v2.16b,v2.16b,v7.16b - add w10,w8,#2 - aese v17.16b,v20.16b - aesmc v17.16b,v17.16b - eor v3.16b,v3.16b,v7.16b - add w8,w8,#3 - aese v4.16b,v21.16b - aesmc v4.16b,v4.16b - aese v5.16b,v21.16b - aesmc v5.16b,v5.16b - // Note the logic to update v0.16b, v1.16b, and v1.16b is written to work - // around a bug in ARM Cortex-A57 and Cortex-A72 cores running in - // 32-bit mode. See the comment above. - eor v19.16b,v19.16b,v7.16b - mov v6.s[3], w9 - aese v17.16b,v21.16b - aesmc v17.16b,v17.16b - orr v0.16b,v6.16b,v6.16b - rev w10,w10 - aese v4.16b,v22.16b - aesmc v4.16b,v4.16b - mov v6.s[3], w10 - rev w12,w8 - aese v5.16b,v22.16b - aesmc v5.16b,v5.16b - orr v1.16b,v6.16b,v6.16b - mov v6.s[3], w12 - aese v17.16b,v22.16b - aesmc v17.16b,v17.16b - orr v18.16b,v6.16b,v6.16b - subs x2,x2,#3 - aese v4.16b,v23.16b - aese v5.16b,v23.16b - aese v17.16b,v23.16b - - eor v2.16b,v2.16b,v4.16b - ld1 {v16.4s},[x7],#16 // re-pre-load rndkey[0] - st1 {v2.16b},[x1],#16 - eor v3.16b,v3.16b,v5.16b - mov w6,w5 - st1 {v3.16b},[x1],#16 - eor v19.16b,v19.16b,v17.16b - ld1 {v17.4s},[x7],#16 // re-pre-load rndkey[1] - st1 {v19.16b},[x1],#16 - b.hs Loop3x_ctr32 - - adds x2,x2,#3 - b.eq Lctr32_done - cmp x2,#1 - mov x12,#16 - csel x12,xzr,x12,eq - -Lctr32_tail: - aese v0.16b,v16.16b - aesmc v0.16b,v0.16b - aese v1.16b,v16.16b - aesmc v1.16b,v1.16b - ld1 {v16.4s},[x7],#16 - subs w6,w6,#2 - aese v0.16b,v17.16b - aesmc v0.16b,v0.16b - aese v1.16b,v17.16b - aesmc v1.16b,v1.16b - ld1 {v17.4s},[x7],#16 - b.gt Lctr32_tail - - aese v0.16b,v16.16b - aesmc v0.16b,v0.16b - aese v1.16b,v16.16b - aesmc v1.16b,v1.16b - aese v0.16b,v17.16b - aesmc v0.16b,v0.16b - aese v1.16b,v17.16b - aesmc v1.16b,v1.16b - ld1 {v2.16b},[x0],x12 - aese v0.16b,v20.16b - aesmc v0.16b,v0.16b - aese v1.16b,v20.16b - aesmc v1.16b,v1.16b - ld1 {v3.16b},[x0] - aese v0.16b,v21.16b - aesmc v0.16b,v0.16b - aese v1.16b,v21.16b - aesmc v1.16b,v1.16b - eor v2.16b,v2.16b,v7.16b - aese v0.16b,v22.16b - aesmc v0.16b,v0.16b - aese v1.16b,v22.16b - aesmc v1.16b,v1.16b - eor v3.16b,v3.16b,v7.16b - aese v0.16b,v23.16b - aese v1.16b,v23.16b - - cmp x2,#1 - eor v2.16b,v2.16b,v0.16b - eor v3.16b,v3.16b,v1.16b - st1 {v2.16b},[x1],#16 - b.eq Lctr32_done - st1 {v3.16b},[x1] - -Lctr32_done: - ldr x29,[sp],#16 - ret - -#endif -#endif // !OPENSSL_NO_ASM diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/aesv8-armx-linux32.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/aesv8-armx-linux32.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/aesv8-armx-linux32.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/aesv8-armx-linux32.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,431 +0,0 @@ -// This file is generated from a similarly-named Perl script in the BoringSSL -// source tree. Do not edit by hand. - -#if !defined(__has_feature) -#define __has_feature(x) 0 -#endif -#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) -#define OPENSSL_NO_ASM -#endif - -#if !defined(OPENSSL_NO_ASM) -#if defined(__arm__) -#include - -#if __ARM_MAX_ARCH__>=7 -.text -.arch armv7-a @ don't confuse not-so-latest binutils with argv8 :-) -.fpu neon -.code 32 -#undef __thumb2__ -.align 5 -.Lrcon: -.long 0x01,0x01,0x01,0x01 -.long 0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d @ rotate-n-splat -.long 0x1b,0x1b,0x1b,0x1b - -.text - -.globl GFp_aes_hw_set_encrypt_key -.hidden GFp_aes_hw_set_encrypt_key -.type GFp_aes_hw_set_encrypt_key,%function -.align 5 -GFp_aes_hw_set_encrypt_key: -.Lenc_key: - mov r3,#-1 - cmp r0,#0 - beq .Lenc_key_abort - cmp r2,#0 - beq .Lenc_key_abort - mov r3,#-2 - cmp r1,#128 - blt .Lenc_key_abort - cmp r1,#256 - bgt .Lenc_key_abort - tst r1,#0x3f - bne .Lenc_key_abort - - adr r3,.Lrcon - cmp r1,#192 - - veor q0,q0,q0 - vld1.8 {q3},[r0]! - mov r1,#8 @ reuse r1 - vld1.32 {q1,q2},[r3]! - - blt .Loop128 - @ 192-bit key support was removed. - b .L256 - -.align 4 -.Loop128: - vtbl.8 d20,{q3},d4 - vtbl.8 d21,{q3},d5 - vext.8 q9,q0,q3,#12 - vst1.32 {q3},[r2]! -.byte 0x00,0x43,0xf0,0xf3 @ aese q10,q0 - subs r1,r1,#1 - - veor q3,q3,q9 - vext.8 q9,q0,q9,#12 - veor q3,q3,q9 - vext.8 q9,q0,q9,#12 - veor q10,q10,q1 - veor q3,q3,q9 - vshl.u8 q1,q1,#1 - veor q3,q3,q10 - bne .Loop128 - - vld1.32 {q1},[r3] - - vtbl.8 d20,{q3},d4 - vtbl.8 d21,{q3},d5 - vext.8 q9,q0,q3,#12 - vst1.32 {q3},[r2]! -.byte 0x00,0x43,0xf0,0xf3 @ aese q10,q0 - - veor q3,q3,q9 - vext.8 q9,q0,q9,#12 - veor q3,q3,q9 - vext.8 q9,q0,q9,#12 - veor q10,q10,q1 - veor q3,q3,q9 - vshl.u8 q1,q1,#1 - veor q3,q3,q10 - - vtbl.8 d20,{q3},d4 - vtbl.8 d21,{q3},d5 - vext.8 q9,q0,q3,#12 - vst1.32 {q3},[r2]! -.byte 0x00,0x43,0xf0,0xf3 @ aese q10,q0 - - veor q3,q3,q9 - vext.8 q9,q0,q9,#12 - veor q3,q3,q9 - vext.8 q9,q0,q9,#12 - veor q10,q10,q1 - veor q3,q3,q9 - veor q3,q3,q10 - vst1.32 {q3},[r2] - add r2,r2,#0x50 - - mov r12,#10 - b .Ldone - -@ 192-bit key support was removed. - -.align 4 -.L256: - vld1.8 {q8},[r0] - mov r1,#7 - mov r12,#14 - vst1.32 {q3},[r2]! - -.Loop256: - vtbl.8 d20,{q8},d4 - vtbl.8 d21,{q8},d5 - vext.8 q9,q0,q3,#12 - vst1.32 {q8},[r2]! -.byte 0x00,0x43,0xf0,0xf3 @ aese q10,q0 - subs r1,r1,#1 - - veor q3,q3,q9 - vext.8 q9,q0,q9,#12 - veor q3,q3,q9 - vext.8 q9,q0,q9,#12 - veor q10,q10,q1 - veor q3,q3,q9 - vshl.u8 q1,q1,#1 - veor q3,q3,q10 - vst1.32 {q3},[r2]! - beq .Ldone - - vdup.32 q10,d7[1] - vext.8 q9,q0,q8,#12 -.byte 0x00,0x43,0xf0,0xf3 @ aese q10,q0 - - veor q8,q8,q9 - vext.8 q9,q0,q9,#12 - veor q8,q8,q9 - vext.8 q9,q0,q9,#12 - veor q8,q8,q9 - - veor q8,q8,q10 - b .Loop256 - -.Ldone: - str r12,[r2] - mov r3,#0 - -.Lenc_key_abort: - mov r0,r3 @ return value - - bx lr -.size GFp_aes_hw_set_encrypt_key,.-GFp_aes_hw_set_encrypt_key -.globl GFp_aes_hw_encrypt -.hidden GFp_aes_hw_encrypt -.type GFp_aes_hw_encrypt,%function -.align 5 -GFp_aes_hw_encrypt: - AARCH64_VALID_CALL_TARGET - ldr r3,[r2,#240] - vld1.32 {q0},[r2]! - vld1.8 {q2},[r0] - sub r3,r3,#2 - vld1.32 {q1},[r2]! - -.Loop_enc: -.byte 0x00,0x43,0xb0,0xf3 @ aese q2,q0 -.byte 0x84,0x43,0xb0,0xf3 @ aesmc q2,q2 - vld1.32 {q0},[r2]! - subs r3,r3,#2 -.byte 0x02,0x43,0xb0,0xf3 @ aese q2,q1 -.byte 0x84,0x43,0xb0,0xf3 @ aesmc q2,q2 - vld1.32 {q1},[r2]! - bgt .Loop_enc - -.byte 0x00,0x43,0xb0,0xf3 @ aese q2,q0 -.byte 0x84,0x43,0xb0,0xf3 @ aesmc q2,q2 - vld1.32 {q0},[r2] -.byte 0x02,0x43,0xb0,0xf3 @ aese q2,q1 - veor q2,q2,q0 - - vst1.8 {q2},[r1] - bx lr -.size GFp_aes_hw_encrypt,.-GFp_aes_hw_encrypt -.globl GFp_aes_hw_decrypt -.hidden GFp_aes_hw_decrypt -.type GFp_aes_hw_decrypt,%function -.align 5 -GFp_aes_hw_decrypt: - AARCH64_VALID_CALL_TARGET - ldr r3,[r2,#240] - vld1.32 {q0},[r2]! - vld1.8 {q2},[r0] - sub r3,r3,#2 - vld1.32 {q1},[r2]! - -.Loop_dec: -.byte 0x40,0x43,0xb0,0xf3 @ aesd q2,q0 -.byte 0xc4,0x43,0xb0,0xf3 @ aesimc q2,q2 - vld1.32 {q0},[r2]! - subs r3,r3,#2 -.byte 0x42,0x43,0xb0,0xf3 @ aesd q2,q1 -.byte 0xc4,0x43,0xb0,0xf3 @ aesimc q2,q2 - vld1.32 {q1},[r2]! - bgt .Loop_dec - -.byte 0x40,0x43,0xb0,0xf3 @ aesd q2,q0 -.byte 0xc4,0x43,0xb0,0xf3 @ aesimc q2,q2 - vld1.32 {q0},[r2] -.byte 0x42,0x43,0xb0,0xf3 @ aesd q2,q1 - veor q2,q2,q0 - - vst1.8 {q2},[r1] - bx lr -.size GFp_aes_hw_decrypt,.-GFp_aes_hw_decrypt -.globl GFp_aes_hw_ctr32_encrypt_blocks -.hidden GFp_aes_hw_ctr32_encrypt_blocks -.type GFp_aes_hw_ctr32_encrypt_blocks,%function -.align 5 -GFp_aes_hw_ctr32_encrypt_blocks: - mov ip,sp - stmdb sp!,{r4,r5,r6,r7,r8,r9,r10,lr} - vstmdb sp!,{d8,d9,d10,d11,d12,d13,d14,d15} @ ABI specification says so - ldr r4, [ip] @ load remaining arg - ldr r5,[r3,#240] - - ldr r8, [r4, #12] - vld1.32 {q0},[r4] - - vld1.32 {q8,q9},[r3] @ load key schedule... - sub r5,r5,#4 - mov r12,#16 - cmp r2,#2 - add r7,r3,r5,lsl#4 @ pointer to last 5 round keys - sub r5,r5,#2 - vld1.32 {q12,q13},[r7]! - vld1.32 {q14,q15},[r7]! - vld1.32 {q7},[r7] - add r7,r3,#32 - mov r6,r5 - movlo r12,#0 - - @ ARM Cortex-A57 and Cortex-A72 cores running in 32-bit mode are - @ affected by silicon errata #1742098 [0] and #1655431 [1], - @ respectively, where the second instruction of an aese/aesmc - @ instruction pair may execute twice if an interrupt is taken right - @ after the first instruction consumes an input register of which a - @ single 32-bit lane has been updated the last time it was modified. - @ - @ This function uses a counter in one 32-bit lane. The - @ could write to q1 and q10 directly, but that trips this bugs. - @ We write to q6 and copy to the final register as a workaround. - @ - @ [0] ARM-EPM-049219 v23 Cortex-A57 MPCore Software Developers Errata Notice - @ [1] ARM-EPM-012079 v11.0 Cortex-A72 MPCore Software Developers Errata Notice -#ifndef __ARMEB__ - rev r8, r8 -#endif - add r10, r8, #1 - vorr q6,q0,q0 - rev r10, r10 - vmov.32 d13[1],r10 - add r8, r8, #2 - vorr q1,q6,q6 - bls .Lctr32_tail - rev r12, r8 - vmov.32 d13[1],r12 - sub r2,r2,#3 @ bias - vorr q10,q6,q6 - b .Loop3x_ctr32 - -.align 4 -.Loop3x_ctr32: -.byte 0x20,0x03,0xb0,0xf3 @ aese q0,q8 -.byte 0x80,0x03,0xb0,0xf3 @ aesmc q0,q0 -.byte 0x20,0x23,0xb0,0xf3 @ aese q1,q8 -.byte 0x82,0x23,0xb0,0xf3 @ aesmc q1,q1 -.byte 0x20,0x43,0xf0,0xf3 @ aese q10,q8 -.byte 0xa4,0x43,0xf0,0xf3 @ aesmc q10,q10 - vld1.32 {q8},[r7]! - subs r6,r6,#2 -.byte 0x22,0x03,0xb0,0xf3 @ aese q0,q9 -.byte 0x80,0x03,0xb0,0xf3 @ aesmc q0,q0 -.byte 0x22,0x23,0xb0,0xf3 @ aese q1,q9 -.byte 0x82,0x23,0xb0,0xf3 @ aesmc q1,q1 -.byte 0x22,0x43,0xf0,0xf3 @ aese q10,q9 -.byte 0xa4,0x43,0xf0,0xf3 @ aesmc q10,q10 - vld1.32 {q9},[r7]! - bgt .Loop3x_ctr32 - -.byte 0x20,0x03,0xb0,0xf3 @ aese q0,q8 -.byte 0x80,0x83,0xb0,0xf3 @ aesmc q4,q0 -.byte 0x20,0x23,0xb0,0xf3 @ aese q1,q8 -.byte 0x82,0xa3,0xb0,0xf3 @ aesmc q5,q1 - vld1.8 {q2},[r0]! - add r9,r8,#1 -.byte 0x20,0x43,0xf0,0xf3 @ aese q10,q8 -.byte 0xa4,0x43,0xf0,0xf3 @ aesmc q10,q10 - vld1.8 {q3},[r0]! - rev r9,r9 -.byte 0x22,0x83,0xb0,0xf3 @ aese q4,q9 -.byte 0x88,0x83,0xb0,0xf3 @ aesmc q4,q4 -.byte 0x22,0xa3,0xb0,0xf3 @ aese q5,q9 -.byte 0x8a,0xa3,0xb0,0xf3 @ aesmc q5,q5 - vld1.8 {q11},[r0]! - mov r7,r3 -.byte 0x22,0x43,0xf0,0xf3 @ aese q10,q9 -.byte 0xa4,0x23,0xf0,0xf3 @ aesmc q9,q10 -.byte 0x28,0x83,0xb0,0xf3 @ aese q4,q12 -.byte 0x88,0x83,0xb0,0xf3 @ aesmc q4,q4 -.byte 0x28,0xa3,0xb0,0xf3 @ aese q5,q12 -.byte 0x8a,0xa3,0xb0,0xf3 @ aesmc q5,q5 - veor q2,q2,q7 - add r10,r8,#2 -.byte 0x28,0x23,0xf0,0xf3 @ aese q9,q12 -.byte 0xa2,0x23,0xf0,0xf3 @ aesmc q9,q9 - veor q3,q3,q7 - add r8,r8,#3 -.byte 0x2a,0x83,0xb0,0xf3 @ aese q4,q13 -.byte 0x88,0x83,0xb0,0xf3 @ aesmc q4,q4 -.byte 0x2a,0xa3,0xb0,0xf3 @ aese q5,q13 -.byte 0x8a,0xa3,0xb0,0xf3 @ aesmc q5,q5 - @ Note the logic to update q0, q1, and q1 is written to work - @ around a bug in ARM Cortex-A57 and Cortex-A72 cores running in - @ 32-bit mode. See the comment above. - veor q11,q11,q7 - vmov.32 d13[1], r9 -.byte 0x2a,0x23,0xf0,0xf3 @ aese q9,q13 -.byte 0xa2,0x23,0xf0,0xf3 @ aesmc q9,q9 - vorr q0,q6,q6 - rev r10,r10 -.byte 0x2c,0x83,0xb0,0xf3 @ aese q4,q14 -.byte 0x88,0x83,0xb0,0xf3 @ aesmc q4,q4 - vmov.32 d13[1], r10 - rev r12,r8 -.byte 0x2c,0xa3,0xb0,0xf3 @ aese q5,q14 -.byte 0x8a,0xa3,0xb0,0xf3 @ aesmc q5,q5 - vorr q1,q6,q6 - vmov.32 d13[1], r12 -.byte 0x2c,0x23,0xf0,0xf3 @ aese q9,q14 -.byte 0xa2,0x23,0xf0,0xf3 @ aesmc q9,q9 - vorr q10,q6,q6 - subs r2,r2,#3 -.byte 0x2e,0x83,0xb0,0xf3 @ aese q4,q15 -.byte 0x2e,0xa3,0xb0,0xf3 @ aese q5,q15 -.byte 0x2e,0x23,0xf0,0xf3 @ aese q9,q15 - - veor q2,q2,q4 - vld1.32 {q8},[r7]! @ re-pre-load rndkey[0] - vst1.8 {q2},[r1]! - veor q3,q3,q5 - mov r6,r5 - vst1.8 {q3},[r1]! - veor q11,q11,q9 - vld1.32 {q9},[r7]! @ re-pre-load rndkey[1] - vst1.8 {q11},[r1]! - bhs .Loop3x_ctr32 - - adds r2,r2,#3 - beq .Lctr32_done - cmp r2,#1 - mov r12,#16 - moveq r12,#0 - -.Lctr32_tail: -.byte 0x20,0x03,0xb0,0xf3 @ aese q0,q8 -.byte 0x80,0x03,0xb0,0xf3 @ aesmc q0,q0 -.byte 0x20,0x23,0xb0,0xf3 @ aese q1,q8 -.byte 0x82,0x23,0xb0,0xf3 @ aesmc q1,q1 - vld1.32 {q8},[r7]! - subs r6,r6,#2 -.byte 0x22,0x03,0xb0,0xf3 @ aese q0,q9 -.byte 0x80,0x03,0xb0,0xf3 @ aesmc q0,q0 -.byte 0x22,0x23,0xb0,0xf3 @ aese q1,q9 -.byte 0x82,0x23,0xb0,0xf3 @ aesmc q1,q1 - vld1.32 {q9},[r7]! - bgt .Lctr32_tail - -.byte 0x20,0x03,0xb0,0xf3 @ aese q0,q8 -.byte 0x80,0x03,0xb0,0xf3 @ aesmc q0,q0 -.byte 0x20,0x23,0xb0,0xf3 @ aese q1,q8 -.byte 0x82,0x23,0xb0,0xf3 @ aesmc q1,q1 -.byte 0x22,0x03,0xb0,0xf3 @ aese q0,q9 -.byte 0x80,0x03,0xb0,0xf3 @ aesmc q0,q0 -.byte 0x22,0x23,0xb0,0xf3 @ aese q1,q9 -.byte 0x82,0x23,0xb0,0xf3 @ aesmc q1,q1 - vld1.8 {q2},[r0],r12 -.byte 0x28,0x03,0xb0,0xf3 @ aese q0,q12 -.byte 0x80,0x03,0xb0,0xf3 @ aesmc q0,q0 -.byte 0x28,0x23,0xb0,0xf3 @ aese q1,q12 -.byte 0x82,0x23,0xb0,0xf3 @ aesmc q1,q1 - vld1.8 {q3},[r0] -.byte 0x2a,0x03,0xb0,0xf3 @ aese q0,q13 -.byte 0x80,0x03,0xb0,0xf3 @ aesmc q0,q0 -.byte 0x2a,0x23,0xb0,0xf3 @ aese q1,q13 -.byte 0x82,0x23,0xb0,0xf3 @ aesmc q1,q1 - veor q2,q2,q7 -.byte 0x2c,0x03,0xb0,0xf3 @ aese q0,q14 -.byte 0x80,0x03,0xb0,0xf3 @ aesmc q0,q0 -.byte 0x2c,0x23,0xb0,0xf3 @ aese q1,q14 -.byte 0x82,0x23,0xb0,0xf3 @ aesmc q1,q1 - veor q3,q3,q7 -.byte 0x2e,0x03,0xb0,0xf3 @ aese q0,q15 -.byte 0x2e,0x23,0xb0,0xf3 @ aese q1,q15 - - cmp r2,#1 - veor q2,q2,q0 - veor q3,q3,q1 - vst1.8 {q2},[r1]! - beq .Lctr32_done - vst1.8 {q3},[r1] - -.Lctr32_done: - vldmia sp!,{d8,d9,d10,d11,d12,d13,d14,d15} - ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,pc} -.size GFp_aes_hw_ctr32_encrypt_blocks,.-GFp_aes_hw_ctr32_encrypt_blocks -#endif -#endif -#endif // !OPENSSL_NO_ASM -.section .note.GNU-stack,"",%progbits diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/aesv8-armx-linux64.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/aesv8-armx-linux64.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/aesv8-armx-linux64.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/aesv8-armx-linux64.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,430 +0,0 @@ -// This file is generated from a similarly-named Perl script in the BoringSSL -// source tree. Do not edit by hand. - -#if !defined(__has_feature) -#define __has_feature(x) 0 -#endif -#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) -#define OPENSSL_NO_ASM -#endif - -#if !defined(OPENSSL_NO_ASM) -#if defined(__aarch64__) -#include - -#if __ARM_MAX_ARCH__>=7 -.text -.arch armv8-a+crypto -.section .rodata -.align 5 -.Lrcon: -.long 0x01,0x01,0x01,0x01 -.long 0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d // rotate-n-splat -.long 0x1b,0x1b,0x1b,0x1b - -.text - -.globl GFp_aes_hw_set_encrypt_key -.hidden GFp_aes_hw_set_encrypt_key -.type GFp_aes_hw_set_encrypt_key,%function -.align 5 -GFp_aes_hw_set_encrypt_key: -.Lenc_key: - // Armv8.3-A PAuth: even though x30 is pushed to stack it is not popped later. - AARCH64_VALID_CALL_TARGET - stp x29,x30,[sp,#-16]! - add x29,sp,#0 - mov x3,#-1 - cmp x0,#0 - b.eq .Lenc_key_abort - cmp x2,#0 - b.eq .Lenc_key_abort - mov x3,#-2 - cmp w1,#128 - b.lt .Lenc_key_abort - cmp w1,#256 - b.gt .Lenc_key_abort - tst w1,#0x3f - b.ne .Lenc_key_abort - - adrp x3,.Lrcon - add x3,x3,:lo12:.Lrcon - cmp w1,#192 - - eor v0.16b,v0.16b,v0.16b - ld1 {v3.16b},[x0],#16 - mov w1,#8 // reuse w1 - ld1 {v1.4s,v2.4s},[x3],#32 - - b.lt .Loop128 - // 192-bit key support was removed. - b .L256 - -.align 4 -.Loop128: - tbl v6.16b,{v3.16b},v2.16b - ext v5.16b,v0.16b,v3.16b,#12 - st1 {v3.4s},[x2],#16 - aese v6.16b,v0.16b - subs w1,w1,#1 - - eor v3.16b,v3.16b,v5.16b - ext v5.16b,v0.16b,v5.16b,#12 - eor v3.16b,v3.16b,v5.16b - ext v5.16b,v0.16b,v5.16b,#12 - eor v6.16b,v6.16b,v1.16b - eor v3.16b,v3.16b,v5.16b - shl v1.16b,v1.16b,#1 - eor v3.16b,v3.16b,v6.16b - b.ne .Loop128 - - ld1 {v1.4s},[x3] - - tbl v6.16b,{v3.16b},v2.16b - ext v5.16b,v0.16b,v3.16b,#12 - st1 {v3.4s},[x2],#16 - aese v6.16b,v0.16b - - eor v3.16b,v3.16b,v5.16b - ext v5.16b,v0.16b,v5.16b,#12 - eor v3.16b,v3.16b,v5.16b - ext v5.16b,v0.16b,v5.16b,#12 - eor v6.16b,v6.16b,v1.16b - eor v3.16b,v3.16b,v5.16b - shl v1.16b,v1.16b,#1 - eor v3.16b,v3.16b,v6.16b - - tbl v6.16b,{v3.16b},v2.16b - ext v5.16b,v0.16b,v3.16b,#12 - st1 {v3.4s},[x2],#16 - aese v6.16b,v0.16b - - eor v3.16b,v3.16b,v5.16b - ext v5.16b,v0.16b,v5.16b,#12 - eor v3.16b,v3.16b,v5.16b - ext v5.16b,v0.16b,v5.16b,#12 - eor v6.16b,v6.16b,v1.16b - eor v3.16b,v3.16b,v5.16b - eor v3.16b,v3.16b,v6.16b - st1 {v3.4s},[x2] - add x2,x2,#0x50 - - mov w12,#10 - b .Ldone - -// 192-bit key support was removed. - -.align 4 -.L256: - ld1 {v4.16b},[x0] - mov w1,#7 - mov w12,#14 - st1 {v3.4s},[x2],#16 - -.Loop256: - tbl v6.16b,{v4.16b},v2.16b - ext v5.16b,v0.16b,v3.16b,#12 - st1 {v4.4s},[x2],#16 - aese v6.16b,v0.16b - subs w1,w1,#1 - - eor v3.16b,v3.16b,v5.16b - ext v5.16b,v0.16b,v5.16b,#12 - eor v3.16b,v3.16b,v5.16b - ext v5.16b,v0.16b,v5.16b,#12 - eor v6.16b,v6.16b,v1.16b - eor v3.16b,v3.16b,v5.16b - shl v1.16b,v1.16b,#1 - eor v3.16b,v3.16b,v6.16b - st1 {v3.4s},[x2],#16 - b.eq .Ldone - - dup v6.4s,v3.s[3] // just splat - ext v5.16b,v0.16b,v4.16b,#12 - aese v6.16b,v0.16b - - eor v4.16b,v4.16b,v5.16b - ext v5.16b,v0.16b,v5.16b,#12 - eor v4.16b,v4.16b,v5.16b - ext v5.16b,v0.16b,v5.16b,#12 - eor v4.16b,v4.16b,v5.16b - - eor v4.16b,v4.16b,v6.16b - b .Loop256 - -.Ldone: - str w12,[x2] - mov x3,#0 - -.Lenc_key_abort: - mov x0,x3 // return value - ldr x29,[sp],#16 - ret -.size GFp_aes_hw_set_encrypt_key,.-GFp_aes_hw_set_encrypt_key -.globl GFp_aes_hw_encrypt -.hidden GFp_aes_hw_encrypt -.type GFp_aes_hw_encrypt,%function -.align 5 -GFp_aes_hw_encrypt: - AARCH64_VALID_CALL_TARGET - ldr w3,[x2,#240] - ld1 {v0.4s},[x2],#16 - ld1 {v2.16b},[x0] - sub w3,w3,#2 - ld1 {v1.4s},[x2],#16 - -.Loop_enc: - aese v2.16b,v0.16b - aesmc v2.16b,v2.16b - ld1 {v0.4s},[x2],#16 - subs w3,w3,#2 - aese v2.16b,v1.16b - aesmc v2.16b,v2.16b - ld1 {v1.4s},[x2],#16 - b.gt .Loop_enc - - aese v2.16b,v0.16b - aesmc v2.16b,v2.16b - ld1 {v0.4s},[x2] - aese v2.16b,v1.16b - eor v2.16b,v2.16b,v0.16b - - st1 {v2.16b},[x1] - ret -.size GFp_aes_hw_encrypt,.-GFp_aes_hw_encrypt -.globl GFp_aes_hw_decrypt -.hidden GFp_aes_hw_decrypt -.type GFp_aes_hw_decrypt,%function -.align 5 -GFp_aes_hw_decrypt: - AARCH64_VALID_CALL_TARGET - ldr w3,[x2,#240] - ld1 {v0.4s},[x2],#16 - ld1 {v2.16b},[x0] - sub w3,w3,#2 - ld1 {v1.4s},[x2],#16 - -.Loop_dec: - aesd v2.16b,v0.16b - aesimc v2.16b,v2.16b - ld1 {v0.4s},[x2],#16 - subs w3,w3,#2 - aesd v2.16b,v1.16b - aesimc v2.16b,v2.16b - ld1 {v1.4s},[x2],#16 - b.gt .Loop_dec - - aesd v2.16b,v0.16b - aesimc v2.16b,v2.16b - ld1 {v0.4s},[x2] - aesd v2.16b,v1.16b - eor v2.16b,v2.16b,v0.16b - - st1 {v2.16b},[x1] - ret -.size GFp_aes_hw_decrypt,.-GFp_aes_hw_decrypt -.globl GFp_aes_hw_ctr32_encrypt_blocks -.hidden GFp_aes_hw_ctr32_encrypt_blocks -.type GFp_aes_hw_ctr32_encrypt_blocks,%function -.align 5 -GFp_aes_hw_ctr32_encrypt_blocks: - // Armv8.3-A PAuth: even though x30 is pushed to stack it is not popped later. - AARCH64_VALID_CALL_TARGET - stp x29,x30,[sp,#-16]! - add x29,sp,#0 - ldr w5,[x3,#240] - - ldr w8, [x4, #12] - ld1 {v0.4s},[x4] - - ld1 {v16.4s,v17.4s},[x3] // load key schedule... - sub w5,w5,#4 - mov x12,#16 - cmp x2,#2 - add x7,x3,x5,lsl#4 // pointer to last 5 round keys - sub w5,w5,#2 - ld1 {v20.4s,v21.4s},[x7],#32 - ld1 {v22.4s,v23.4s},[x7],#32 - ld1 {v7.4s},[x7] - add x7,x3,#32 - mov w6,w5 - csel x12,xzr,x12,lo - - // ARM Cortex-A57 and Cortex-A72 cores running in 32-bit mode are - // affected by silicon errata #1742098 [0] and #1655431 [1], - // respectively, where the second instruction of an aese/aesmc - // instruction pair may execute twice if an interrupt is taken right - // after the first instruction consumes an input register of which a - // single 32-bit lane has been updated the last time it was modified. - // - // This function uses a counter in one 32-bit lane. The vmov lines - // could write to v1.16b and v18.16b directly, but that trips this bugs. - // We write to v6.16b and copy to the final register as a workaround. - // - // [0] ARM-EPM-049219 v23 Cortex-A57 MPCore Software Developers Errata Notice - // [1] ARM-EPM-012079 v11.0 Cortex-A72 MPCore Software Developers Errata Notice -#ifndef __ARMEB__ - rev w8, w8 -#endif - add w10, w8, #1 - orr v6.16b,v0.16b,v0.16b - rev w10, w10 - mov v6.s[3],w10 - add w8, w8, #2 - orr v1.16b,v6.16b,v6.16b - b.ls .Lctr32_tail - rev w12, w8 - mov v6.s[3],w12 - sub x2,x2,#3 // bias - orr v18.16b,v6.16b,v6.16b - b .Loop3x_ctr32 - -.align 4 -.Loop3x_ctr32: - aese v0.16b,v16.16b - aesmc v0.16b,v0.16b - aese v1.16b,v16.16b - aesmc v1.16b,v1.16b - aese v18.16b,v16.16b - aesmc v18.16b,v18.16b - ld1 {v16.4s},[x7],#16 - subs w6,w6,#2 - aese v0.16b,v17.16b - aesmc v0.16b,v0.16b - aese v1.16b,v17.16b - aesmc v1.16b,v1.16b - aese v18.16b,v17.16b - aesmc v18.16b,v18.16b - ld1 {v17.4s},[x7],#16 - b.gt .Loop3x_ctr32 - - aese v0.16b,v16.16b - aesmc v4.16b,v0.16b - aese v1.16b,v16.16b - aesmc v5.16b,v1.16b - ld1 {v2.16b},[x0],#16 - add w9,w8,#1 - aese v18.16b,v16.16b - aesmc v18.16b,v18.16b - ld1 {v3.16b},[x0],#16 - rev w9,w9 - aese v4.16b,v17.16b - aesmc v4.16b,v4.16b - aese v5.16b,v17.16b - aesmc v5.16b,v5.16b - ld1 {v19.16b},[x0],#16 - mov x7,x3 - aese v18.16b,v17.16b - aesmc v17.16b,v18.16b - aese v4.16b,v20.16b - aesmc v4.16b,v4.16b - aese v5.16b,v20.16b - aesmc v5.16b,v5.16b - eor v2.16b,v2.16b,v7.16b - add w10,w8,#2 - aese v17.16b,v20.16b - aesmc v17.16b,v17.16b - eor v3.16b,v3.16b,v7.16b - add w8,w8,#3 - aese v4.16b,v21.16b - aesmc v4.16b,v4.16b - aese v5.16b,v21.16b - aesmc v5.16b,v5.16b - // Note the logic to update v0.16b, v1.16b, and v1.16b is written to work - // around a bug in ARM Cortex-A57 and Cortex-A72 cores running in - // 32-bit mode. See the comment above. - eor v19.16b,v19.16b,v7.16b - mov v6.s[3], w9 - aese v17.16b,v21.16b - aesmc v17.16b,v17.16b - orr v0.16b,v6.16b,v6.16b - rev w10,w10 - aese v4.16b,v22.16b - aesmc v4.16b,v4.16b - mov v6.s[3], w10 - rev w12,w8 - aese v5.16b,v22.16b - aesmc v5.16b,v5.16b - orr v1.16b,v6.16b,v6.16b - mov v6.s[3], w12 - aese v17.16b,v22.16b - aesmc v17.16b,v17.16b - orr v18.16b,v6.16b,v6.16b - subs x2,x2,#3 - aese v4.16b,v23.16b - aese v5.16b,v23.16b - aese v17.16b,v23.16b - - eor v2.16b,v2.16b,v4.16b - ld1 {v16.4s},[x7],#16 // re-pre-load rndkey[0] - st1 {v2.16b},[x1],#16 - eor v3.16b,v3.16b,v5.16b - mov w6,w5 - st1 {v3.16b},[x1],#16 - eor v19.16b,v19.16b,v17.16b - ld1 {v17.4s},[x7],#16 // re-pre-load rndkey[1] - st1 {v19.16b},[x1],#16 - b.hs .Loop3x_ctr32 - - adds x2,x2,#3 - b.eq .Lctr32_done - cmp x2,#1 - mov x12,#16 - csel x12,xzr,x12,eq - -.Lctr32_tail: - aese v0.16b,v16.16b - aesmc v0.16b,v0.16b - aese v1.16b,v16.16b - aesmc v1.16b,v1.16b - ld1 {v16.4s},[x7],#16 - subs w6,w6,#2 - aese v0.16b,v17.16b - aesmc v0.16b,v0.16b - aese v1.16b,v17.16b - aesmc v1.16b,v1.16b - ld1 {v17.4s},[x7],#16 - b.gt .Lctr32_tail - - aese v0.16b,v16.16b - aesmc v0.16b,v0.16b - aese v1.16b,v16.16b - aesmc v1.16b,v1.16b - aese v0.16b,v17.16b - aesmc v0.16b,v0.16b - aese v1.16b,v17.16b - aesmc v1.16b,v1.16b - ld1 {v2.16b},[x0],x12 - aese v0.16b,v20.16b - aesmc v0.16b,v0.16b - aese v1.16b,v20.16b - aesmc v1.16b,v1.16b - ld1 {v3.16b},[x0] - aese v0.16b,v21.16b - aesmc v0.16b,v0.16b - aese v1.16b,v21.16b - aesmc v1.16b,v1.16b - eor v2.16b,v2.16b,v7.16b - aese v0.16b,v22.16b - aesmc v0.16b,v0.16b - aese v1.16b,v22.16b - aesmc v1.16b,v1.16b - eor v3.16b,v3.16b,v7.16b - aese v0.16b,v23.16b - aese v1.16b,v23.16b - - cmp x2,#1 - eor v2.16b,v2.16b,v0.16b - eor v3.16b,v3.16b,v1.16b - st1 {v2.16b},[x1],#16 - b.eq .Lctr32_done - st1 {v3.16b},[x1] - -.Lctr32_done: - ldr x29,[sp],#16 - ret -.size GFp_aes_hw_ctr32_encrypt_blocks,.-GFp_aes_hw_ctr32_encrypt_blocks -#endif -#endif -#endif // !OPENSSL_NO_ASM -.section .note.GNU-stack,"",%progbits diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/armv4-mont-ios32.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/armv4-mont-ios32.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/armv4-mont-ios32.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/armv4-mont-ios32.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,972 +0,0 @@ -// This file is generated from a similarly-named Perl script in the BoringSSL -// source tree. Do not edit by hand. - -#if !defined(__has_feature) -#define __has_feature(x) 0 -#endif -#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) -#define OPENSSL_NO_ASM -#endif - -#if !defined(OPENSSL_NO_ASM) -#include - -@ Silence ARMv8 deprecated IT instruction warnings. This file is used by both -@ ARMv7 and ARMv8 processors and does not use ARMv8 instructions. - - -.text -#if defined(__thumb2__) -.syntax unified -.thumb -#else -.code 32 -#endif - -#if __ARM_MAX_ARCH__>=7 - -.private_extern _GFp_armcap_P -.align 5 -LOPENSSL_armcap: -.word _GFp_armcap_P-Lbn_mul_mont -#endif - -.globl _GFp_bn_mul_mont -.private_extern _GFp_bn_mul_mont -#ifdef __thumb2__ -.thumb_func _GFp_bn_mul_mont -#endif - -.align 5 -_GFp_bn_mul_mont: -Lbn_mul_mont: - ldr ip,[sp,#4] @ load num - stmdb sp!,{r0,r2} @ sp points at argument block -#if __ARM_MAX_ARCH__>=7 - tst ip,#7 - bne Lialu - adr r0,Lbn_mul_mont - ldr r2,LOPENSSL_armcap - ldr r0,[r0,r2] -#ifdef __APPLE__ - ldr r0,[r0] -#endif - tst r0,#ARMV7_NEON @ NEON available? - ldmia sp, {r0,r2} - beq Lialu - add sp,sp,#8 - b bn_mul8x_mont_neon -.align 4 -Lialu: -#endif - cmp ip,#2 - mov r0,ip @ load num -#ifdef __thumb2__ - ittt lt -#endif - movlt r0,#0 - addlt sp,sp,#2*4 - blt Labrt - - stmdb sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} @ save 10 registers - - mov r0,r0,lsl#2 @ rescale r0 for byte count - sub sp,sp,r0 @ alloca(4*num) - sub sp,sp,#4 @ +extra dword - sub r0,r0,#4 @ "num=num-1" - add r4,r2,r0 @ &bp[num-1] - - add r0,sp,r0 @ r0 to point at &tp[num-1] - ldr r8,[r0,#14*4] @ &n0 - ldr r2,[r2] @ bp[0] - ldr r5,[r1],#4 @ ap[0],ap++ - ldr r6,[r3],#4 @ np[0],np++ - ldr r8,[r8] @ *n0 - str r4,[r0,#15*4] @ save &bp[num] - - umull r10,r11,r5,r2 @ ap[0]*bp[0] - str r8,[r0,#14*4] @ save n0 value - mul r8,r10,r8 @ "tp[0]"*n0 - mov r12,#0 - umlal r10,r12,r6,r8 @ np[0]*n0+"t[0]" - mov r4,sp - -L1st: - ldr r5,[r1],#4 @ ap[j],ap++ - mov r10,r11 - ldr r6,[r3],#4 @ np[j],np++ - mov r11,#0 - umlal r10,r11,r5,r2 @ ap[j]*bp[0] - mov r14,#0 - umlal r12,r14,r6,r8 @ np[j]*n0 - adds r12,r12,r10 - str r12,[r4],#4 @ tp[j-1]=,tp++ - adc r12,r14,#0 - cmp r4,r0 - bne L1st - - adds r12,r12,r11 - ldr r4,[r0,#13*4] @ restore bp - mov r14,#0 - ldr r8,[r0,#14*4] @ restore n0 - adc r14,r14,#0 - str r12,[r0] @ tp[num-1]= - mov r7,sp - str r14,[r0,#4] @ tp[num]= - -Louter: - sub r7,r0,r7 @ "original" r0-1 value - sub r1,r1,r7 @ "rewind" ap to &ap[1] - ldr r2,[r4,#4]! @ *(++bp) - sub r3,r3,r7 @ "rewind" np to &np[1] - ldr r5,[r1,#-4] @ ap[0] - ldr r10,[sp] @ tp[0] - ldr r6,[r3,#-4] @ np[0] - ldr r7,[sp,#4] @ tp[1] - - mov r11,#0 - umlal r10,r11,r5,r2 @ ap[0]*bp[i]+tp[0] - str r4,[r0,#13*4] @ save bp - mul r8,r10,r8 - mov r12,#0 - umlal r10,r12,r6,r8 @ np[0]*n0+"tp[0]" - mov r4,sp - -Linner: - ldr r5,[r1],#4 @ ap[j],ap++ - adds r10,r11,r7 @ +=tp[j] - ldr r6,[r3],#4 @ np[j],np++ - mov r11,#0 - umlal r10,r11,r5,r2 @ ap[j]*bp[i] - mov r14,#0 - umlal r12,r14,r6,r8 @ np[j]*n0 - adc r11,r11,#0 - ldr r7,[r4,#8] @ tp[j+1] - adds r12,r12,r10 - str r12,[r4],#4 @ tp[j-1]=,tp++ - adc r12,r14,#0 - cmp r4,r0 - bne Linner - - adds r12,r12,r11 - mov r14,#0 - ldr r4,[r0,#13*4] @ restore bp - adc r14,r14,#0 - ldr r8,[r0,#14*4] @ restore n0 - adds r12,r12,r7 - ldr r7,[r0,#15*4] @ restore &bp[num] - adc r14,r14,#0 - str r12,[r0] @ tp[num-1]= - str r14,[r0,#4] @ tp[num]= - - cmp r4,r7 -#ifdef __thumb2__ - itt ne -#endif - movne r7,sp - bne Louter - - ldr r2,[r0,#12*4] @ pull rp - mov r5,sp - add r0,r0,#4 @ r0 to point at &tp[num] - sub r5,r0,r5 @ "original" num value - mov r4,sp @ "rewind" r4 - mov r1,r4 @ "borrow" r1 - sub r3,r3,r5 @ "rewind" r3 to &np[0] - - subs r7,r7,r7 @ "clear" carry flag -Lsub: ldr r7,[r4],#4 - ldr r6,[r3],#4 - sbcs r7,r7,r6 @ tp[j]-np[j] - str r7,[r2],#4 @ rp[j]= - teq r4,r0 @ preserve carry - bne Lsub - sbcs r14,r14,#0 @ upmost carry - mov r4,sp @ "rewind" r4 - sub r2,r2,r5 @ "rewind" r2 - -Lcopy: ldr r7,[r4] @ conditional copy - ldr r5,[r2] - str sp,[r4],#4 @ zap tp -#ifdef __thumb2__ - it cc -#endif - movcc r5,r7 - str r5,[r2],#4 - teq r4,r0 @ preserve carry - bne Lcopy - - mov sp,r0 - add sp,sp,#4 @ skip over tp[num+1] - ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} @ restore registers - add sp,sp,#2*4 @ skip over {r0,r2} - mov r0,#1 -Labrt: -#if __ARM_ARCH__>=5 - bx lr @ bx lr -#else - tst lr,#1 - moveq pc,lr @ be binary compatible with V4, yet -.word 0xe12fff1e @ interoperable with Thumb ISA:-) -#endif - -#if __ARM_MAX_ARCH__>=7 - - - -#ifdef __thumb2__ -.thumb_func bn_mul8x_mont_neon -#endif -.align 5 -bn_mul8x_mont_neon: - mov ip,sp - stmdb sp!,{r4,r5,r6,r7,r8,r9,r10,r11} - vstmdb sp!,{d8,d9,d10,d11,d12,d13,d14,d15} @ ABI specification says so - ldmia ip,{r4,r5} @ load rest of parameter block - mov ip,sp - - cmp r5,#8 - bhi LNEON_8n - - @ special case for r5==8, everything is in register bank... - - vld1.32 {d28[0]}, [r2,:32]! - veor d8,d8,d8 - sub r7,sp,r5,lsl#4 - vld1.32 {d0,d1,d2,d3}, [r1]! @ can't specify :32 :-( - and r7,r7,#-64 - vld1.32 {d30[0]}, [r4,:32] - mov sp,r7 @ alloca - vzip.16 d28,d8 - - vmull.u32 q6,d28,d0[0] - vmull.u32 q7,d28,d0[1] - vmull.u32 q8,d28,d1[0] - vshl.i64 d29,d13,#16 - vmull.u32 q9,d28,d1[1] - - vadd.u64 d29,d29,d12 - veor d8,d8,d8 - vmul.u32 d29,d29,d30 - - vmull.u32 q10,d28,d2[0] - vld1.32 {d4,d5,d6,d7}, [r3]! - vmull.u32 q11,d28,d2[1] - vmull.u32 q12,d28,d3[0] - vzip.16 d29,d8 - vmull.u32 q13,d28,d3[1] - - vmlal.u32 q6,d29,d4[0] - sub r9,r5,#1 - vmlal.u32 q7,d29,d4[1] - vmlal.u32 q8,d29,d5[0] - vmlal.u32 q9,d29,d5[1] - - vmlal.u32 q10,d29,d6[0] - vmov q5,q6 - vmlal.u32 q11,d29,d6[1] - vmov q6,q7 - vmlal.u32 q12,d29,d7[0] - vmov q7,q8 - vmlal.u32 q13,d29,d7[1] - vmov q8,q9 - vmov q9,q10 - vshr.u64 d10,d10,#16 - vmov q10,q11 - vmov q11,q12 - vadd.u64 d10,d10,d11 - vmov q12,q13 - veor q13,q13 - vshr.u64 d10,d10,#16 - - b LNEON_outer8 - -.align 4 -LNEON_outer8: - vld1.32 {d28[0]}, [r2,:32]! - veor d8,d8,d8 - vzip.16 d28,d8 - vadd.u64 d12,d12,d10 - - vmlal.u32 q6,d28,d0[0] - vmlal.u32 q7,d28,d0[1] - vmlal.u32 q8,d28,d1[0] - vshl.i64 d29,d13,#16 - vmlal.u32 q9,d28,d1[1] - - vadd.u64 d29,d29,d12 - veor d8,d8,d8 - subs r9,r9,#1 - vmul.u32 d29,d29,d30 - - vmlal.u32 q10,d28,d2[0] - vmlal.u32 q11,d28,d2[1] - vmlal.u32 q12,d28,d3[0] - vzip.16 d29,d8 - vmlal.u32 q13,d28,d3[1] - - vmlal.u32 q6,d29,d4[0] - vmlal.u32 q7,d29,d4[1] - vmlal.u32 q8,d29,d5[0] - vmlal.u32 q9,d29,d5[1] - - vmlal.u32 q10,d29,d6[0] - vmov q5,q6 - vmlal.u32 q11,d29,d6[1] - vmov q6,q7 - vmlal.u32 q12,d29,d7[0] - vmov q7,q8 - vmlal.u32 q13,d29,d7[1] - vmov q8,q9 - vmov q9,q10 - vshr.u64 d10,d10,#16 - vmov q10,q11 - vmov q11,q12 - vadd.u64 d10,d10,d11 - vmov q12,q13 - veor q13,q13 - vshr.u64 d10,d10,#16 - - bne LNEON_outer8 - - vadd.u64 d12,d12,d10 - mov r7,sp - vshr.u64 d10,d12,#16 - mov r8,r5 - vadd.u64 d13,d13,d10 - add r6,sp,#96 - vshr.u64 d10,d13,#16 - vzip.16 d12,d13 - - b LNEON_tail_entry - -.align 4 -LNEON_8n: - veor q6,q6,q6 - sub r7,sp,#128 - veor q7,q7,q7 - sub r7,r7,r5,lsl#4 - veor q8,q8,q8 - and r7,r7,#-64 - veor q9,q9,q9 - mov sp,r7 @ alloca - veor q10,q10,q10 - add r7,r7,#256 - veor q11,q11,q11 - sub r8,r5,#8 - veor q12,q12,q12 - veor q13,q13,q13 - -LNEON_8n_init: - vst1.64 {q6,q7},[r7,:256]! - subs r8,r8,#8 - vst1.64 {q8,q9},[r7,:256]! - vst1.64 {q10,q11},[r7,:256]! - vst1.64 {q12,q13},[r7,:256]! - bne LNEON_8n_init - - add r6,sp,#256 - vld1.32 {d0,d1,d2,d3},[r1]! - add r10,sp,#8 - vld1.32 {d30[0]},[r4,:32] - mov r9,r5 - b LNEON_8n_outer - -.align 4 -LNEON_8n_outer: - vld1.32 {d28[0]},[r2,:32]! @ *b++ - veor d8,d8,d8 - vzip.16 d28,d8 - add r7,sp,#128 - vld1.32 {d4,d5,d6,d7},[r3]! - - vmlal.u32 q6,d28,d0[0] - vmlal.u32 q7,d28,d0[1] - veor d8,d8,d8 - vmlal.u32 q8,d28,d1[0] - vshl.i64 d29,d13,#16 - vmlal.u32 q9,d28,d1[1] - vadd.u64 d29,d29,d12 - vmlal.u32 q10,d28,d2[0] - vmul.u32 d29,d29,d30 - vmlal.u32 q11,d28,d2[1] - vst1.32 {d28},[sp,:64] @ put aside smashed b[8*i+0] - vmlal.u32 q12,d28,d3[0] - vzip.16 d29,d8 - vmlal.u32 q13,d28,d3[1] - vld1.32 {d28[0]},[r2,:32]! @ *b++ - vmlal.u32 q6,d29,d4[0] - veor d10,d10,d10 - vmlal.u32 q7,d29,d4[1] - vzip.16 d28,d10 - vmlal.u32 q8,d29,d5[0] - vshr.u64 d12,d12,#16 - vmlal.u32 q9,d29,d5[1] - vmlal.u32 q10,d29,d6[0] - vadd.u64 d12,d12,d13 - vmlal.u32 q11,d29,d6[1] - vshr.u64 d12,d12,#16 - vmlal.u32 q12,d29,d7[0] - vmlal.u32 q13,d29,d7[1] - vadd.u64 d14,d14,d12 - vst1.32 {d29},[r10,:64]! @ put aside smashed m[8*i+0] - vmlal.u32 q7,d28,d0[0] - vld1.64 {q6},[r6,:128]! - vmlal.u32 q8,d28,d0[1] - veor d8,d8,d8 - vmlal.u32 q9,d28,d1[0] - vshl.i64 d29,d15,#16 - vmlal.u32 q10,d28,d1[1] - vadd.u64 d29,d29,d14 - vmlal.u32 q11,d28,d2[0] - vmul.u32 d29,d29,d30 - vmlal.u32 q12,d28,d2[1] - vst1.32 {d28},[r10,:64]! @ put aside smashed b[8*i+1] - vmlal.u32 q13,d28,d3[0] - vzip.16 d29,d8 - vmlal.u32 q6,d28,d3[1] - vld1.32 {d28[0]},[r2,:32]! @ *b++ - vmlal.u32 q7,d29,d4[0] - veor d10,d10,d10 - vmlal.u32 q8,d29,d4[1] - vzip.16 d28,d10 - vmlal.u32 q9,d29,d5[0] - vshr.u64 d14,d14,#16 - vmlal.u32 q10,d29,d5[1] - vmlal.u32 q11,d29,d6[0] - vadd.u64 d14,d14,d15 - vmlal.u32 q12,d29,d6[1] - vshr.u64 d14,d14,#16 - vmlal.u32 q13,d29,d7[0] - vmlal.u32 q6,d29,d7[1] - vadd.u64 d16,d16,d14 - vst1.32 {d29},[r10,:64]! @ put aside smashed m[8*i+1] - vmlal.u32 q8,d28,d0[0] - vld1.64 {q7},[r6,:128]! - vmlal.u32 q9,d28,d0[1] - veor d8,d8,d8 - vmlal.u32 q10,d28,d1[0] - vshl.i64 d29,d17,#16 - vmlal.u32 q11,d28,d1[1] - vadd.u64 d29,d29,d16 - vmlal.u32 q12,d28,d2[0] - vmul.u32 d29,d29,d30 - vmlal.u32 q13,d28,d2[1] - vst1.32 {d28},[r10,:64]! @ put aside smashed b[8*i+2] - vmlal.u32 q6,d28,d3[0] - vzip.16 d29,d8 - vmlal.u32 q7,d28,d3[1] - vld1.32 {d28[0]},[r2,:32]! @ *b++ - vmlal.u32 q8,d29,d4[0] - veor d10,d10,d10 - vmlal.u32 q9,d29,d4[1] - vzip.16 d28,d10 - vmlal.u32 q10,d29,d5[0] - vshr.u64 d16,d16,#16 - vmlal.u32 q11,d29,d5[1] - vmlal.u32 q12,d29,d6[0] - vadd.u64 d16,d16,d17 - vmlal.u32 q13,d29,d6[1] - vshr.u64 d16,d16,#16 - vmlal.u32 q6,d29,d7[0] - vmlal.u32 q7,d29,d7[1] - vadd.u64 d18,d18,d16 - vst1.32 {d29},[r10,:64]! @ put aside smashed m[8*i+2] - vmlal.u32 q9,d28,d0[0] - vld1.64 {q8},[r6,:128]! - vmlal.u32 q10,d28,d0[1] - veor d8,d8,d8 - vmlal.u32 q11,d28,d1[0] - vshl.i64 d29,d19,#16 - vmlal.u32 q12,d28,d1[1] - vadd.u64 d29,d29,d18 - vmlal.u32 q13,d28,d2[0] - vmul.u32 d29,d29,d30 - vmlal.u32 q6,d28,d2[1] - vst1.32 {d28},[r10,:64]! @ put aside smashed b[8*i+3] - vmlal.u32 q7,d28,d3[0] - vzip.16 d29,d8 - vmlal.u32 q8,d28,d3[1] - vld1.32 {d28[0]},[r2,:32]! @ *b++ - vmlal.u32 q9,d29,d4[0] - veor d10,d10,d10 - vmlal.u32 q10,d29,d4[1] - vzip.16 d28,d10 - vmlal.u32 q11,d29,d5[0] - vshr.u64 d18,d18,#16 - vmlal.u32 q12,d29,d5[1] - vmlal.u32 q13,d29,d6[0] - vadd.u64 d18,d18,d19 - vmlal.u32 q6,d29,d6[1] - vshr.u64 d18,d18,#16 - vmlal.u32 q7,d29,d7[0] - vmlal.u32 q8,d29,d7[1] - vadd.u64 d20,d20,d18 - vst1.32 {d29},[r10,:64]! @ put aside smashed m[8*i+3] - vmlal.u32 q10,d28,d0[0] - vld1.64 {q9},[r6,:128]! - vmlal.u32 q11,d28,d0[1] - veor d8,d8,d8 - vmlal.u32 q12,d28,d1[0] - vshl.i64 d29,d21,#16 - vmlal.u32 q13,d28,d1[1] - vadd.u64 d29,d29,d20 - vmlal.u32 q6,d28,d2[0] - vmul.u32 d29,d29,d30 - vmlal.u32 q7,d28,d2[1] - vst1.32 {d28},[r10,:64]! @ put aside smashed b[8*i+4] - vmlal.u32 q8,d28,d3[0] - vzip.16 d29,d8 - vmlal.u32 q9,d28,d3[1] - vld1.32 {d28[0]},[r2,:32]! @ *b++ - vmlal.u32 q10,d29,d4[0] - veor d10,d10,d10 - vmlal.u32 q11,d29,d4[1] - vzip.16 d28,d10 - vmlal.u32 q12,d29,d5[0] - vshr.u64 d20,d20,#16 - vmlal.u32 q13,d29,d5[1] - vmlal.u32 q6,d29,d6[0] - vadd.u64 d20,d20,d21 - vmlal.u32 q7,d29,d6[1] - vshr.u64 d20,d20,#16 - vmlal.u32 q8,d29,d7[0] - vmlal.u32 q9,d29,d7[1] - vadd.u64 d22,d22,d20 - vst1.32 {d29},[r10,:64]! @ put aside smashed m[8*i+4] - vmlal.u32 q11,d28,d0[0] - vld1.64 {q10},[r6,:128]! - vmlal.u32 q12,d28,d0[1] - veor d8,d8,d8 - vmlal.u32 q13,d28,d1[0] - vshl.i64 d29,d23,#16 - vmlal.u32 q6,d28,d1[1] - vadd.u64 d29,d29,d22 - vmlal.u32 q7,d28,d2[0] - vmul.u32 d29,d29,d30 - vmlal.u32 q8,d28,d2[1] - vst1.32 {d28},[r10,:64]! @ put aside smashed b[8*i+5] - vmlal.u32 q9,d28,d3[0] - vzip.16 d29,d8 - vmlal.u32 q10,d28,d3[1] - vld1.32 {d28[0]},[r2,:32]! @ *b++ - vmlal.u32 q11,d29,d4[0] - veor d10,d10,d10 - vmlal.u32 q12,d29,d4[1] - vzip.16 d28,d10 - vmlal.u32 q13,d29,d5[0] - vshr.u64 d22,d22,#16 - vmlal.u32 q6,d29,d5[1] - vmlal.u32 q7,d29,d6[0] - vadd.u64 d22,d22,d23 - vmlal.u32 q8,d29,d6[1] - vshr.u64 d22,d22,#16 - vmlal.u32 q9,d29,d7[0] - vmlal.u32 q10,d29,d7[1] - vadd.u64 d24,d24,d22 - vst1.32 {d29},[r10,:64]! @ put aside smashed m[8*i+5] - vmlal.u32 q12,d28,d0[0] - vld1.64 {q11},[r6,:128]! - vmlal.u32 q13,d28,d0[1] - veor d8,d8,d8 - vmlal.u32 q6,d28,d1[0] - vshl.i64 d29,d25,#16 - vmlal.u32 q7,d28,d1[1] - vadd.u64 d29,d29,d24 - vmlal.u32 q8,d28,d2[0] - vmul.u32 d29,d29,d30 - vmlal.u32 q9,d28,d2[1] - vst1.32 {d28},[r10,:64]! @ put aside smashed b[8*i+6] - vmlal.u32 q10,d28,d3[0] - vzip.16 d29,d8 - vmlal.u32 q11,d28,d3[1] - vld1.32 {d28[0]},[r2,:32]! @ *b++ - vmlal.u32 q12,d29,d4[0] - veor d10,d10,d10 - vmlal.u32 q13,d29,d4[1] - vzip.16 d28,d10 - vmlal.u32 q6,d29,d5[0] - vshr.u64 d24,d24,#16 - vmlal.u32 q7,d29,d5[1] - vmlal.u32 q8,d29,d6[0] - vadd.u64 d24,d24,d25 - vmlal.u32 q9,d29,d6[1] - vshr.u64 d24,d24,#16 - vmlal.u32 q10,d29,d7[0] - vmlal.u32 q11,d29,d7[1] - vadd.u64 d26,d26,d24 - vst1.32 {d29},[r10,:64]! @ put aside smashed m[8*i+6] - vmlal.u32 q13,d28,d0[0] - vld1.64 {q12},[r6,:128]! - vmlal.u32 q6,d28,d0[1] - veor d8,d8,d8 - vmlal.u32 q7,d28,d1[0] - vshl.i64 d29,d27,#16 - vmlal.u32 q8,d28,d1[1] - vadd.u64 d29,d29,d26 - vmlal.u32 q9,d28,d2[0] - vmul.u32 d29,d29,d30 - vmlal.u32 q10,d28,d2[1] - vst1.32 {d28},[r10,:64]! @ put aside smashed b[8*i+7] - vmlal.u32 q11,d28,d3[0] - vzip.16 d29,d8 - vmlal.u32 q12,d28,d3[1] - vld1.32 {d28},[sp,:64] @ pull smashed b[8*i+0] - vmlal.u32 q13,d29,d4[0] - vld1.32 {d0,d1,d2,d3},[r1]! - vmlal.u32 q6,d29,d4[1] - vmlal.u32 q7,d29,d5[0] - vshr.u64 d26,d26,#16 - vmlal.u32 q8,d29,d5[1] - vmlal.u32 q9,d29,d6[0] - vadd.u64 d26,d26,d27 - vmlal.u32 q10,d29,d6[1] - vshr.u64 d26,d26,#16 - vmlal.u32 q11,d29,d7[0] - vmlal.u32 q12,d29,d7[1] - vadd.u64 d12,d12,d26 - vst1.32 {d29},[r10,:64] @ put aside smashed m[8*i+7] - add r10,sp,#8 @ rewind - sub r8,r5,#8 - b LNEON_8n_inner - -.align 4 -LNEON_8n_inner: - subs r8,r8,#8 - vmlal.u32 q6,d28,d0[0] - vld1.64 {q13},[r6,:128] - vmlal.u32 q7,d28,d0[1] - vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+0] - vmlal.u32 q8,d28,d1[0] - vld1.32 {d4,d5,d6,d7},[r3]! - vmlal.u32 q9,d28,d1[1] - it ne - addne r6,r6,#16 @ don't advance in last iteration - vmlal.u32 q10,d28,d2[0] - vmlal.u32 q11,d28,d2[1] - vmlal.u32 q12,d28,d3[0] - vmlal.u32 q13,d28,d3[1] - vld1.32 {d28},[r10,:64]! @ pull smashed b[8*i+1] - vmlal.u32 q6,d29,d4[0] - vmlal.u32 q7,d29,d4[1] - vmlal.u32 q8,d29,d5[0] - vmlal.u32 q9,d29,d5[1] - vmlal.u32 q10,d29,d6[0] - vmlal.u32 q11,d29,d6[1] - vmlal.u32 q12,d29,d7[0] - vmlal.u32 q13,d29,d7[1] - vst1.64 {q6},[r7,:128]! - vmlal.u32 q7,d28,d0[0] - vld1.64 {q6},[r6,:128] - vmlal.u32 q8,d28,d0[1] - vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+1] - vmlal.u32 q9,d28,d1[0] - it ne - addne r6,r6,#16 @ don't advance in last iteration - vmlal.u32 q10,d28,d1[1] - vmlal.u32 q11,d28,d2[0] - vmlal.u32 q12,d28,d2[1] - vmlal.u32 q13,d28,d3[0] - vmlal.u32 q6,d28,d3[1] - vld1.32 {d28},[r10,:64]! @ pull smashed b[8*i+2] - vmlal.u32 q7,d29,d4[0] - vmlal.u32 q8,d29,d4[1] - vmlal.u32 q9,d29,d5[0] - vmlal.u32 q10,d29,d5[1] - vmlal.u32 q11,d29,d6[0] - vmlal.u32 q12,d29,d6[1] - vmlal.u32 q13,d29,d7[0] - vmlal.u32 q6,d29,d7[1] - vst1.64 {q7},[r7,:128]! - vmlal.u32 q8,d28,d0[0] - vld1.64 {q7},[r6,:128] - vmlal.u32 q9,d28,d0[1] - vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+2] - vmlal.u32 q10,d28,d1[0] - it ne - addne r6,r6,#16 @ don't advance in last iteration - vmlal.u32 q11,d28,d1[1] - vmlal.u32 q12,d28,d2[0] - vmlal.u32 q13,d28,d2[1] - vmlal.u32 q6,d28,d3[0] - vmlal.u32 q7,d28,d3[1] - vld1.32 {d28},[r10,:64]! @ pull smashed b[8*i+3] - vmlal.u32 q8,d29,d4[0] - vmlal.u32 q9,d29,d4[1] - vmlal.u32 q10,d29,d5[0] - vmlal.u32 q11,d29,d5[1] - vmlal.u32 q12,d29,d6[0] - vmlal.u32 q13,d29,d6[1] - vmlal.u32 q6,d29,d7[0] - vmlal.u32 q7,d29,d7[1] - vst1.64 {q8},[r7,:128]! - vmlal.u32 q9,d28,d0[0] - vld1.64 {q8},[r6,:128] - vmlal.u32 q10,d28,d0[1] - vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+3] - vmlal.u32 q11,d28,d1[0] - it ne - addne r6,r6,#16 @ don't advance in last iteration - vmlal.u32 q12,d28,d1[1] - vmlal.u32 q13,d28,d2[0] - vmlal.u32 q6,d28,d2[1] - vmlal.u32 q7,d28,d3[0] - vmlal.u32 q8,d28,d3[1] - vld1.32 {d28},[r10,:64]! @ pull smashed b[8*i+4] - vmlal.u32 q9,d29,d4[0] - vmlal.u32 q10,d29,d4[1] - vmlal.u32 q11,d29,d5[0] - vmlal.u32 q12,d29,d5[1] - vmlal.u32 q13,d29,d6[0] - vmlal.u32 q6,d29,d6[1] - vmlal.u32 q7,d29,d7[0] - vmlal.u32 q8,d29,d7[1] - vst1.64 {q9},[r7,:128]! - vmlal.u32 q10,d28,d0[0] - vld1.64 {q9},[r6,:128] - vmlal.u32 q11,d28,d0[1] - vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+4] - vmlal.u32 q12,d28,d1[0] - it ne - addne r6,r6,#16 @ don't advance in last iteration - vmlal.u32 q13,d28,d1[1] - vmlal.u32 q6,d28,d2[0] - vmlal.u32 q7,d28,d2[1] - vmlal.u32 q8,d28,d3[0] - vmlal.u32 q9,d28,d3[1] - vld1.32 {d28},[r10,:64]! @ pull smashed b[8*i+5] - vmlal.u32 q10,d29,d4[0] - vmlal.u32 q11,d29,d4[1] - vmlal.u32 q12,d29,d5[0] - vmlal.u32 q13,d29,d5[1] - vmlal.u32 q6,d29,d6[0] - vmlal.u32 q7,d29,d6[1] - vmlal.u32 q8,d29,d7[0] - vmlal.u32 q9,d29,d7[1] - vst1.64 {q10},[r7,:128]! - vmlal.u32 q11,d28,d0[0] - vld1.64 {q10},[r6,:128] - vmlal.u32 q12,d28,d0[1] - vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+5] - vmlal.u32 q13,d28,d1[0] - it ne - addne r6,r6,#16 @ don't advance in last iteration - vmlal.u32 q6,d28,d1[1] - vmlal.u32 q7,d28,d2[0] - vmlal.u32 q8,d28,d2[1] - vmlal.u32 q9,d28,d3[0] - vmlal.u32 q10,d28,d3[1] - vld1.32 {d28},[r10,:64]! @ pull smashed b[8*i+6] - vmlal.u32 q11,d29,d4[0] - vmlal.u32 q12,d29,d4[1] - vmlal.u32 q13,d29,d5[0] - vmlal.u32 q6,d29,d5[1] - vmlal.u32 q7,d29,d6[0] - vmlal.u32 q8,d29,d6[1] - vmlal.u32 q9,d29,d7[0] - vmlal.u32 q10,d29,d7[1] - vst1.64 {q11},[r7,:128]! - vmlal.u32 q12,d28,d0[0] - vld1.64 {q11},[r6,:128] - vmlal.u32 q13,d28,d0[1] - vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+6] - vmlal.u32 q6,d28,d1[0] - it ne - addne r6,r6,#16 @ don't advance in last iteration - vmlal.u32 q7,d28,d1[1] - vmlal.u32 q8,d28,d2[0] - vmlal.u32 q9,d28,d2[1] - vmlal.u32 q10,d28,d3[0] - vmlal.u32 q11,d28,d3[1] - vld1.32 {d28},[r10,:64]! @ pull smashed b[8*i+7] - vmlal.u32 q12,d29,d4[0] - vmlal.u32 q13,d29,d4[1] - vmlal.u32 q6,d29,d5[0] - vmlal.u32 q7,d29,d5[1] - vmlal.u32 q8,d29,d6[0] - vmlal.u32 q9,d29,d6[1] - vmlal.u32 q10,d29,d7[0] - vmlal.u32 q11,d29,d7[1] - vst1.64 {q12},[r7,:128]! - vmlal.u32 q13,d28,d0[0] - vld1.64 {q12},[r6,:128] - vmlal.u32 q6,d28,d0[1] - vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+7] - vmlal.u32 q7,d28,d1[0] - it ne - addne r6,r6,#16 @ don't advance in last iteration - vmlal.u32 q8,d28,d1[1] - vmlal.u32 q9,d28,d2[0] - vmlal.u32 q10,d28,d2[1] - vmlal.u32 q11,d28,d3[0] - vmlal.u32 q12,d28,d3[1] - it eq - subeq r1,r1,r5,lsl#2 @ rewind - vmlal.u32 q13,d29,d4[0] - vld1.32 {d28},[sp,:64] @ pull smashed b[8*i+0] - vmlal.u32 q6,d29,d4[1] - vld1.32 {d0,d1,d2,d3},[r1]! - vmlal.u32 q7,d29,d5[0] - add r10,sp,#8 @ rewind - vmlal.u32 q8,d29,d5[1] - vmlal.u32 q9,d29,d6[0] - vmlal.u32 q10,d29,d6[1] - vmlal.u32 q11,d29,d7[0] - vst1.64 {q13},[r7,:128]! - vmlal.u32 q12,d29,d7[1] - - bne LNEON_8n_inner - add r6,sp,#128 - vst1.64 {q6,q7},[r7,:256]! - veor q2,q2,q2 @ d4-d5 - vst1.64 {q8,q9},[r7,:256]! - veor q3,q3,q3 @ d6-d7 - vst1.64 {q10,q11},[r7,:256]! - vst1.64 {q12},[r7,:128] - - subs r9,r9,#8 - vld1.64 {q6,q7},[r6,:256]! - vld1.64 {q8,q9},[r6,:256]! - vld1.64 {q10,q11},[r6,:256]! - vld1.64 {q12,q13},[r6,:256]! - - itt ne - subne r3,r3,r5,lsl#2 @ rewind - bne LNEON_8n_outer - - add r7,sp,#128 - vst1.64 {q2,q3}, [sp,:256]! @ start wiping stack frame - vshr.u64 d10,d12,#16 - vst1.64 {q2,q3},[sp,:256]! - vadd.u64 d13,d13,d10 - vst1.64 {q2,q3}, [sp,:256]! - vshr.u64 d10,d13,#16 - vst1.64 {q2,q3}, [sp,:256]! - vzip.16 d12,d13 - - mov r8,r5 - b LNEON_tail_entry - -.align 4 -LNEON_tail: - vadd.u64 d12,d12,d10 - vshr.u64 d10,d12,#16 - vld1.64 {q8,q9}, [r6, :256]! - vadd.u64 d13,d13,d10 - vld1.64 {q10,q11}, [r6, :256]! - vshr.u64 d10,d13,#16 - vld1.64 {q12,q13}, [r6, :256]! - vzip.16 d12,d13 - -LNEON_tail_entry: - vadd.u64 d14,d14,d10 - vst1.32 {d12[0]}, [r7, :32]! - vshr.u64 d10,d14,#16 - vadd.u64 d15,d15,d10 - vshr.u64 d10,d15,#16 - vzip.16 d14,d15 - vadd.u64 d16,d16,d10 - vst1.32 {d14[0]}, [r7, :32]! - vshr.u64 d10,d16,#16 - vadd.u64 d17,d17,d10 - vshr.u64 d10,d17,#16 - vzip.16 d16,d17 - vadd.u64 d18,d18,d10 - vst1.32 {d16[0]}, [r7, :32]! - vshr.u64 d10,d18,#16 - vadd.u64 d19,d19,d10 - vshr.u64 d10,d19,#16 - vzip.16 d18,d19 - vadd.u64 d20,d20,d10 - vst1.32 {d18[0]}, [r7, :32]! - vshr.u64 d10,d20,#16 - vadd.u64 d21,d21,d10 - vshr.u64 d10,d21,#16 - vzip.16 d20,d21 - vadd.u64 d22,d22,d10 - vst1.32 {d20[0]}, [r7, :32]! - vshr.u64 d10,d22,#16 - vadd.u64 d23,d23,d10 - vshr.u64 d10,d23,#16 - vzip.16 d22,d23 - vadd.u64 d24,d24,d10 - vst1.32 {d22[0]}, [r7, :32]! - vshr.u64 d10,d24,#16 - vadd.u64 d25,d25,d10 - vshr.u64 d10,d25,#16 - vzip.16 d24,d25 - vadd.u64 d26,d26,d10 - vst1.32 {d24[0]}, [r7, :32]! - vshr.u64 d10,d26,#16 - vadd.u64 d27,d27,d10 - vshr.u64 d10,d27,#16 - vzip.16 d26,d27 - vld1.64 {q6,q7}, [r6, :256]! - subs r8,r8,#8 - vst1.32 {d26[0]}, [r7, :32]! - bne LNEON_tail - - vst1.32 {d10[0]}, [r7, :32] @ top-most bit - sub r3,r3,r5,lsl#2 @ rewind r3 - subs r1,sp,#0 @ clear carry flag - add r2,sp,r5,lsl#2 - -LNEON_sub: - ldmia r1!, {r4,r5,r6,r7} - ldmia r3!, {r8,r9,r10,r11} - sbcs r8, r4,r8 - sbcs r9, r5,r9 - sbcs r10,r6,r10 - sbcs r11,r7,r11 - teq r1,r2 @ preserves carry - stmia r0!, {r8,r9,r10,r11} - bne LNEON_sub - - ldr r10, [r1] @ load top-most bit - mov r11,sp - veor q0,q0,q0 - sub r11,r2,r11 @ this is num*4 - veor q1,q1,q1 - mov r1,sp - sub r0,r0,r11 @ rewind r0 - mov r3,r2 @ second 3/4th of frame - sbcs r10,r10,#0 @ result is carry flag - -LNEON_copy_n_zap: - ldmia r1!, {r4,r5,r6,r7} - ldmia r0, {r8,r9,r10,r11} - it cc - movcc r8, r4 - vst1.64 {q0,q1}, [r3,:256]! @ wipe - itt cc - movcc r9, r5 - movcc r10,r6 - vst1.64 {q0,q1}, [r3,:256]! @ wipe - it cc - movcc r11,r7 - ldmia r1, {r4,r5,r6,r7} - stmia r0!, {r8,r9,r10,r11} - sub r1,r1,#16 - ldmia r0, {r8,r9,r10,r11} - it cc - movcc r8, r4 - vst1.64 {q0,q1}, [r1,:256]! @ wipe - itt cc - movcc r9, r5 - movcc r10,r6 - vst1.64 {q0,q1}, [r3,:256]! @ wipe - it cc - movcc r11,r7 - teq r1,r2 @ preserves carry - stmia r0!, {r8,r9,r10,r11} - bne LNEON_copy_n_zap - - mov sp,ip - vldmia sp!,{d8,d9,d10,d11,d12,d13,d14,d15} - ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11} - bx lr @ bx lr - -#endif -.byte 77,111,110,116,103,111,109,101,114,121,32,109,117,108,116,105,112,108,105,99,97,116,105,111,110,32,102,111,114,32,65,82,77,118,52,47,78,69,79,78,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 -.align 2 -#endif // !OPENSSL_NO_ASM diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/armv4-mont-linux32.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/armv4-mont-linux32.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/armv4-mont-linux32.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/armv4-mont-linux32.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,971 +0,0 @@ -// This file is generated from a similarly-named Perl script in the BoringSSL -// source tree. Do not edit by hand. - -#if !defined(__has_feature) -#define __has_feature(x) 0 -#endif -#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) -#define OPENSSL_NO_ASM -#endif - -#if !defined(OPENSSL_NO_ASM) -#if defined(__arm__) -#include - -@ Silence ARMv8 deprecated IT instruction warnings. This file is used by both -@ ARMv7 and ARMv8 processors and does not use ARMv8 instructions. -.arch armv7-a - -.text -#if defined(__thumb2__) -.syntax unified -.thumb -#else -.code 32 -#endif - -#if __ARM_MAX_ARCH__>=7 - -.hidden GFp_armcap_P -.align 5 -.LOPENSSL_armcap: -.word GFp_armcap_P-.Lbn_mul_mont -#endif - -.globl GFp_bn_mul_mont -.hidden GFp_bn_mul_mont -.type GFp_bn_mul_mont,%function - -.align 5 -GFp_bn_mul_mont: -.Lbn_mul_mont: - ldr ip,[sp,#4] @ load num - stmdb sp!,{r0,r2} @ sp points at argument block -#if __ARM_MAX_ARCH__>=7 - tst ip,#7 - bne .Lialu - adr r0,.Lbn_mul_mont - ldr r2,.LOPENSSL_armcap - ldr r0,[r0,r2] -#ifdef __APPLE__ - ldr r0,[r0] -#endif - tst r0,#ARMV7_NEON @ NEON available? - ldmia sp, {r0,r2} - beq .Lialu - add sp,sp,#8 - b bn_mul8x_mont_neon -.align 4 -.Lialu: -#endif - cmp ip,#2 - mov r0,ip @ load num -#ifdef __thumb2__ - ittt lt -#endif - movlt r0,#0 - addlt sp,sp,#2*4 - blt .Labrt - - stmdb sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} @ save 10 registers - - mov r0,r0,lsl#2 @ rescale r0 for byte count - sub sp,sp,r0 @ alloca(4*num) - sub sp,sp,#4 @ +extra dword - sub r0,r0,#4 @ "num=num-1" - add r4,r2,r0 @ &bp[num-1] - - add r0,sp,r0 @ r0 to point at &tp[num-1] - ldr r8,[r0,#14*4] @ &n0 - ldr r2,[r2] @ bp[0] - ldr r5,[r1],#4 @ ap[0],ap++ - ldr r6,[r3],#4 @ np[0],np++ - ldr r8,[r8] @ *n0 - str r4,[r0,#15*4] @ save &bp[num] - - umull r10,r11,r5,r2 @ ap[0]*bp[0] - str r8,[r0,#14*4] @ save n0 value - mul r8,r10,r8 @ "tp[0]"*n0 - mov r12,#0 - umlal r10,r12,r6,r8 @ np[0]*n0+"t[0]" - mov r4,sp - -.L1st: - ldr r5,[r1],#4 @ ap[j],ap++ - mov r10,r11 - ldr r6,[r3],#4 @ np[j],np++ - mov r11,#0 - umlal r10,r11,r5,r2 @ ap[j]*bp[0] - mov r14,#0 - umlal r12,r14,r6,r8 @ np[j]*n0 - adds r12,r12,r10 - str r12,[r4],#4 @ tp[j-1]=,tp++ - adc r12,r14,#0 - cmp r4,r0 - bne .L1st - - adds r12,r12,r11 - ldr r4,[r0,#13*4] @ restore bp - mov r14,#0 - ldr r8,[r0,#14*4] @ restore n0 - adc r14,r14,#0 - str r12,[r0] @ tp[num-1]= - mov r7,sp - str r14,[r0,#4] @ tp[num]= - -.Louter: - sub r7,r0,r7 @ "original" r0-1 value - sub r1,r1,r7 @ "rewind" ap to &ap[1] - ldr r2,[r4,#4]! @ *(++bp) - sub r3,r3,r7 @ "rewind" np to &np[1] - ldr r5,[r1,#-4] @ ap[0] - ldr r10,[sp] @ tp[0] - ldr r6,[r3,#-4] @ np[0] - ldr r7,[sp,#4] @ tp[1] - - mov r11,#0 - umlal r10,r11,r5,r2 @ ap[0]*bp[i]+tp[0] - str r4,[r0,#13*4] @ save bp - mul r8,r10,r8 - mov r12,#0 - umlal r10,r12,r6,r8 @ np[0]*n0+"tp[0]" - mov r4,sp - -.Linner: - ldr r5,[r1],#4 @ ap[j],ap++ - adds r10,r11,r7 @ +=tp[j] - ldr r6,[r3],#4 @ np[j],np++ - mov r11,#0 - umlal r10,r11,r5,r2 @ ap[j]*bp[i] - mov r14,#0 - umlal r12,r14,r6,r8 @ np[j]*n0 - adc r11,r11,#0 - ldr r7,[r4,#8] @ tp[j+1] - adds r12,r12,r10 - str r12,[r4],#4 @ tp[j-1]=,tp++ - adc r12,r14,#0 - cmp r4,r0 - bne .Linner - - adds r12,r12,r11 - mov r14,#0 - ldr r4,[r0,#13*4] @ restore bp - adc r14,r14,#0 - ldr r8,[r0,#14*4] @ restore n0 - adds r12,r12,r7 - ldr r7,[r0,#15*4] @ restore &bp[num] - adc r14,r14,#0 - str r12,[r0] @ tp[num-1]= - str r14,[r0,#4] @ tp[num]= - - cmp r4,r7 -#ifdef __thumb2__ - itt ne -#endif - movne r7,sp - bne .Louter - - ldr r2,[r0,#12*4] @ pull rp - mov r5,sp - add r0,r0,#4 @ r0 to point at &tp[num] - sub r5,r0,r5 @ "original" num value - mov r4,sp @ "rewind" r4 - mov r1,r4 @ "borrow" r1 - sub r3,r3,r5 @ "rewind" r3 to &np[0] - - subs r7,r7,r7 @ "clear" carry flag -.Lsub: ldr r7,[r4],#4 - ldr r6,[r3],#4 - sbcs r7,r7,r6 @ tp[j]-np[j] - str r7,[r2],#4 @ rp[j]= - teq r4,r0 @ preserve carry - bne .Lsub - sbcs r14,r14,#0 @ upmost carry - mov r4,sp @ "rewind" r4 - sub r2,r2,r5 @ "rewind" r2 - -.Lcopy: ldr r7,[r4] @ conditional copy - ldr r5,[r2] - str sp,[r4],#4 @ zap tp -#ifdef __thumb2__ - it cc -#endif - movcc r5,r7 - str r5,[r2],#4 - teq r4,r0 @ preserve carry - bne .Lcopy - - mov sp,r0 - add sp,sp,#4 @ skip over tp[num+1] - ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} @ restore registers - add sp,sp,#2*4 @ skip over {r0,r2} - mov r0,#1 -.Labrt: -#if __ARM_ARCH__>=5 - bx lr @ bx lr -#else - tst lr,#1 - moveq pc,lr @ be binary compatible with V4, yet -.word 0xe12fff1e @ interoperable with Thumb ISA:-) -#endif -.size GFp_bn_mul_mont,.-GFp_bn_mul_mont -#if __ARM_MAX_ARCH__>=7 -.arch armv7-a -.fpu neon - -.type bn_mul8x_mont_neon,%function -.align 5 -bn_mul8x_mont_neon: - mov ip,sp - stmdb sp!,{r4,r5,r6,r7,r8,r9,r10,r11} - vstmdb sp!,{d8,d9,d10,d11,d12,d13,d14,d15} @ ABI specification says so - ldmia ip,{r4,r5} @ load rest of parameter block - mov ip,sp - - cmp r5,#8 - bhi .LNEON_8n - - @ special case for r5==8, everything is in register bank... - - vld1.32 {d28[0]}, [r2,:32]! - veor d8,d8,d8 - sub r7,sp,r5,lsl#4 - vld1.32 {d0,d1,d2,d3}, [r1]! @ can't specify :32 :-( - and r7,r7,#-64 - vld1.32 {d30[0]}, [r4,:32] - mov sp,r7 @ alloca - vzip.16 d28,d8 - - vmull.u32 q6,d28,d0[0] - vmull.u32 q7,d28,d0[1] - vmull.u32 q8,d28,d1[0] - vshl.i64 d29,d13,#16 - vmull.u32 q9,d28,d1[1] - - vadd.u64 d29,d29,d12 - veor d8,d8,d8 - vmul.u32 d29,d29,d30 - - vmull.u32 q10,d28,d2[0] - vld1.32 {d4,d5,d6,d7}, [r3]! - vmull.u32 q11,d28,d2[1] - vmull.u32 q12,d28,d3[0] - vzip.16 d29,d8 - vmull.u32 q13,d28,d3[1] - - vmlal.u32 q6,d29,d4[0] - sub r9,r5,#1 - vmlal.u32 q7,d29,d4[1] - vmlal.u32 q8,d29,d5[0] - vmlal.u32 q9,d29,d5[1] - - vmlal.u32 q10,d29,d6[0] - vmov q5,q6 - vmlal.u32 q11,d29,d6[1] - vmov q6,q7 - vmlal.u32 q12,d29,d7[0] - vmov q7,q8 - vmlal.u32 q13,d29,d7[1] - vmov q8,q9 - vmov q9,q10 - vshr.u64 d10,d10,#16 - vmov q10,q11 - vmov q11,q12 - vadd.u64 d10,d10,d11 - vmov q12,q13 - veor q13,q13 - vshr.u64 d10,d10,#16 - - b .LNEON_outer8 - -.align 4 -.LNEON_outer8: - vld1.32 {d28[0]}, [r2,:32]! - veor d8,d8,d8 - vzip.16 d28,d8 - vadd.u64 d12,d12,d10 - - vmlal.u32 q6,d28,d0[0] - vmlal.u32 q7,d28,d0[1] - vmlal.u32 q8,d28,d1[0] - vshl.i64 d29,d13,#16 - vmlal.u32 q9,d28,d1[1] - - vadd.u64 d29,d29,d12 - veor d8,d8,d8 - subs r9,r9,#1 - vmul.u32 d29,d29,d30 - - vmlal.u32 q10,d28,d2[0] - vmlal.u32 q11,d28,d2[1] - vmlal.u32 q12,d28,d3[0] - vzip.16 d29,d8 - vmlal.u32 q13,d28,d3[1] - - vmlal.u32 q6,d29,d4[0] - vmlal.u32 q7,d29,d4[1] - vmlal.u32 q8,d29,d5[0] - vmlal.u32 q9,d29,d5[1] - - vmlal.u32 q10,d29,d6[0] - vmov q5,q6 - vmlal.u32 q11,d29,d6[1] - vmov q6,q7 - vmlal.u32 q12,d29,d7[0] - vmov q7,q8 - vmlal.u32 q13,d29,d7[1] - vmov q8,q9 - vmov q9,q10 - vshr.u64 d10,d10,#16 - vmov q10,q11 - vmov q11,q12 - vadd.u64 d10,d10,d11 - vmov q12,q13 - veor q13,q13 - vshr.u64 d10,d10,#16 - - bne .LNEON_outer8 - - vadd.u64 d12,d12,d10 - mov r7,sp - vshr.u64 d10,d12,#16 - mov r8,r5 - vadd.u64 d13,d13,d10 - add r6,sp,#96 - vshr.u64 d10,d13,#16 - vzip.16 d12,d13 - - b .LNEON_tail_entry - -.align 4 -.LNEON_8n: - veor q6,q6,q6 - sub r7,sp,#128 - veor q7,q7,q7 - sub r7,r7,r5,lsl#4 - veor q8,q8,q8 - and r7,r7,#-64 - veor q9,q9,q9 - mov sp,r7 @ alloca - veor q10,q10,q10 - add r7,r7,#256 - veor q11,q11,q11 - sub r8,r5,#8 - veor q12,q12,q12 - veor q13,q13,q13 - -.LNEON_8n_init: - vst1.64 {q6,q7},[r7,:256]! - subs r8,r8,#8 - vst1.64 {q8,q9},[r7,:256]! - vst1.64 {q10,q11},[r7,:256]! - vst1.64 {q12,q13},[r7,:256]! - bne .LNEON_8n_init - - add r6,sp,#256 - vld1.32 {d0,d1,d2,d3},[r1]! - add r10,sp,#8 - vld1.32 {d30[0]},[r4,:32] - mov r9,r5 - b .LNEON_8n_outer - -.align 4 -.LNEON_8n_outer: - vld1.32 {d28[0]},[r2,:32]! @ *b++ - veor d8,d8,d8 - vzip.16 d28,d8 - add r7,sp,#128 - vld1.32 {d4,d5,d6,d7},[r3]! - - vmlal.u32 q6,d28,d0[0] - vmlal.u32 q7,d28,d0[1] - veor d8,d8,d8 - vmlal.u32 q8,d28,d1[0] - vshl.i64 d29,d13,#16 - vmlal.u32 q9,d28,d1[1] - vadd.u64 d29,d29,d12 - vmlal.u32 q10,d28,d2[0] - vmul.u32 d29,d29,d30 - vmlal.u32 q11,d28,d2[1] - vst1.32 {d28},[sp,:64] @ put aside smashed b[8*i+0] - vmlal.u32 q12,d28,d3[0] - vzip.16 d29,d8 - vmlal.u32 q13,d28,d3[1] - vld1.32 {d28[0]},[r2,:32]! @ *b++ - vmlal.u32 q6,d29,d4[0] - veor d10,d10,d10 - vmlal.u32 q7,d29,d4[1] - vzip.16 d28,d10 - vmlal.u32 q8,d29,d5[0] - vshr.u64 d12,d12,#16 - vmlal.u32 q9,d29,d5[1] - vmlal.u32 q10,d29,d6[0] - vadd.u64 d12,d12,d13 - vmlal.u32 q11,d29,d6[1] - vshr.u64 d12,d12,#16 - vmlal.u32 q12,d29,d7[0] - vmlal.u32 q13,d29,d7[1] - vadd.u64 d14,d14,d12 - vst1.32 {d29},[r10,:64]! @ put aside smashed m[8*i+0] - vmlal.u32 q7,d28,d0[0] - vld1.64 {q6},[r6,:128]! - vmlal.u32 q8,d28,d0[1] - veor d8,d8,d8 - vmlal.u32 q9,d28,d1[0] - vshl.i64 d29,d15,#16 - vmlal.u32 q10,d28,d1[1] - vadd.u64 d29,d29,d14 - vmlal.u32 q11,d28,d2[0] - vmul.u32 d29,d29,d30 - vmlal.u32 q12,d28,d2[1] - vst1.32 {d28},[r10,:64]! @ put aside smashed b[8*i+1] - vmlal.u32 q13,d28,d3[0] - vzip.16 d29,d8 - vmlal.u32 q6,d28,d3[1] - vld1.32 {d28[0]},[r2,:32]! @ *b++ - vmlal.u32 q7,d29,d4[0] - veor d10,d10,d10 - vmlal.u32 q8,d29,d4[1] - vzip.16 d28,d10 - vmlal.u32 q9,d29,d5[0] - vshr.u64 d14,d14,#16 - vmlal.u32 q10,d29,d5[1] - vmlal.u32 q11,d29,d6[0] - vadd.u64 d14,d14,d15 - vmlal.u32 q12,d29,d6[1] - vshr.u64 d14,d14,#16 - vmlal.u32 q13,d29,d7[0] - vmlal.u32 q6,d29,d7[1] - vadd.u64 d16,d16,d14 - vst1.32 {d29},[r10,:64]! @ put aside smashed m[8*i+1] - vmlal.u32 q8,d28,d0[0] - vld1.64 {q7},[r6,:128]! - vmlal.u32 q9,d28,d0[1] - veor d8,d8,d8 - vmlal.u32 q10,d28,d1[0] - vshl.i64 d29,d17,#16 - vmlal.u32 q11,d28,d1[1] - vadd.u64 d29,d29,d16 - vmlal.u32 q12,d28,d2[0] - vmul.u32 d29,d29,d30 - vmlal.u32 q13,d28,d2[1] - vst1.32 {d28},[r10,:64]! @ put aside smashed b[8*i+2] - vmlal.u32 q6,d28,d3[0] - vzip.16 d29,d8 - vmlal.u32 q7,d28,d3[1] - vld1.32 {d28[0]},[r2,:32]! @ *b++ - vmlal.u32 q8,d29,d4[0] - veor d10,d10,d10 - vmlal.u32 q9,d29,d4[1] - vzip.16 d28,d10 - vmlal.u32 q10,d29,d5[0] - vshr.u64 d16,d16,#16 - vmlal.u32 q11,d29,d5[1] - vmlal.u32 q12,d29,d6[0] - vadd.u64 d16,d16,d17 - vmlal.u32 q13,d29,d6[1] - vshr.u64 d16,d16,#16 - vmlal.u32 q6,d29,d7[0] - vmlal.u32 q7,d29,d7[1] - vadd.u64 d18,d18,d16 - vst1.32 {d29},[r10,:64]! @ put aside smashed m[8*i+2] - vmlal.u32 q9,d28,d0[0] - vld1.64 {q8},[r6,:128]! - vmlal.u32 q10,d28,d0[1] - veor d8,d8,d8 - vmlal.u32 q11,d28,d1[0] - vshl.i64 d29,d19,#16 - vmlal.u32 q12,d28,d1[1] - vadd.u64 d29,d29,d18 - vmlal.u32 q13,d28,d2[0] - vmul.u32 d29,d29,d30 - vmlal.u32 q6,d28,d2[1] - vst1.32 {d28},[r10,:64]! @ put aside smashed b[8*i+3] - vmlal.u32 q7,d28,d3[0] - vzip.16 d29,d8 - vmlal.u32 q8,d28,d3[1] - vld1.32 {d28[0]},[r2,:32]! @ *b++ - vmlal.u32 q9,d29,d4[0] - veor d10,d10,d10 - vmlal.u32 q10,d29,d4[1] - vzip.16 d28,d10 - vmlal.u32 q11,d29,d5[0] - vshr.u64 d18,d18,#16 - vmlal.u32 q12,d29,d5[1] - vmlal.u32 q13,d29,d6[0] - vadd.u64 d18,d18,d19 - vmlal.u32 q6,d29,d6[1] - vshr.u64 d18,d18,#16 - vmlal.u32 q7,d29,d7[0] - vmlal.u32 q8,d29,d7[1] - vadd.u64 d20,d20,d18 - vst1.32 {d29},[r10,:64]! @ put aside smashed m[8*i+3] - vmlal.u32 q10,d28,d0[0] - vld1.64 {q9},[r6,:128]! - vmlal.u32 q11,d28,d0[1] - veor d8,d8,d8 - vmlal.u32 q12,d28,d1[0] - vshl.i64 d29,d21,#16 - vmlal.u32 q13,d28,d1[1] - vadd.u64 d29,d29,d20 - vmlal.u32 q6,d28,d2[0] - vmul.u32 d29,d29,d30 - vmlal.u32 q7,d28,d2[1] - vst1.32 {d28},[r10,:64]! @ put aside smashed b[8*i+4] - vmlal.u32 q8,d28,d3[0] - vzip.16 d29,d8 - vmlal.u32 q9,d28,d3[1] - vld1.32 {d28[0]},[r2,:32]! @ *b++ - vmlal.u32 q10,d29,d4[0] - veor d10,d10,d10 - vmlal.u32 q11,d29,d4[1] - vzip.16 d28,d10 - vmlal.u32 q12,d29,d5[0] - vshr.u64 d20,d20,#16 - vmlal.u32 q13,d29,d5[1] - vmlal.u32 q6,d29,d6[0] - vadd.u64 d20,d20,d21 - vmlal.u32 q7,d29,d6[1] - vshr.u64 d20,d20,#16 - vmlal.u32 q8,d29,d7[0] - vmlal.u32 q9,d29,d7[1] - vadd.u64 d22,d22,d20 - vst1.32 {d29},[r10,:64]! @ put aside smashed m[8*i+4] - vmlal.u32 q11,d28,d0[0] - vld1.64 {q10},[r6,:128]! - vmlal.u32 q12,d28,d0[1] - veor d8,d8,d8 - vmlal.u32 q13,d28,d1[0] - vshl.i64 d29,d23,#16 - vmlal.u32 q6,d28,d1[1] - vadd.u64 d29,d29,d22 - vmlal.u32 q7,d28,d2[0] - vmul.u32 d29,d29,d30 - vmlal.u32 q8,d28,d2[1] - vst1.32 {d28},[r10,:64]! @ put aside smashed b[8*i+5] - vmlal.u32 q9,d28,d3[0] - vzip.16 d29,d8 - vmlal.u32 q10,d28,d3[1] - vld1.32 {d28[0]},[r2,:32]! @ *b++ - vmlal.u32 q11,d29,d4[0] - veor d10,d10,d10 - vmlal.u32 q12,d29,d4[1] - vzip.16 d28,d10 - vmlal.u32 q13,d29,d5[0] - vshr.u64 d22,d22,#16 - vmlal.u32 q6,d29,d5[1] - vmlal.u32 q7,d29,d6[0] - vadd.u64 d22,d22,d23 - vmlal.u32 q8,d29,d6[1] - vshr.u64 d22,d22,#16 - vmlal.u32 q9,d29,d7[0] - vmlal.u32 q10,d29,d7[1] - vadd.u64 d24,d24,d22 - vst1.32 {d29},[r10,:64]! @ put aside smashed m[8*i+5] - vmlal.u32 q12,d28,d0[0] - vld1.64 {q11},[r6,:128]! - vmlal.u32 q13,d28,d0[1] - veor d8,d8,d8 - vmlal.u32 q6,d28,d1[0] - vshl.i64 d29,d25,#16 - vmlal.u32 q7,d28,d1[1] - vadd.u64 d29,d29,d24 - vmlal.u32 q8,d28,d2[0] - vmul.u32 d29,d29,d30 - vmlal.u32 q9,d28,d2[1] - vst1.32 {d28},[r10,:64]! @ put aside smashed b[8*i+6] - vmlal.u32 q10,d28,d3[0] - vzip.16 d29,d8 - vmlal.u32 q11,d28,d3[1] - vld1.32 {d28[0]},[r2,:32]! @ *b++ - vmlal.u32 q12,d29,d4[0] - veor d10,d10,d10 - vmlal.u32 q13,d29,d4[1] - vzip.16 d28,d10 - vmlal.u32 q6,d29,d5[0] - vshr.u64 d24,d24,#16 - vmlal.u32 q7,d29,d5[1] - vmlal.u32 q8,d29,d6[0] - vadd.u64 d24,d24,d25 - vmlal.u32 q9,d29,d6[1] - vshr.u64 d24,d24,#16 - vmlal.u32 q10,d29,d7[0] - vmlal.u32 q11,d29,d7[1] - vadd.u64 d26,d26,d24 - vst1.32 {d29},[r10,:64]! @ put aside smashed m[8*i+6] - vmlal.u32 q13,d28,d0[0] - vld1.64 {q12},[r6,:128]! - vmlal.u32 q6,d28,d0[1] - veor d8,d8,d8 - vmlal.u32 q7,d28,d1[0] - vshl.i64 d29,d27,#16 - vmlal.u32 q8,d28,d1[1] - vadd.u64 d29,d29,d26 - vmlal.u32 q9,d28,d2[0] - vmul.u32 d29,d29,d30 - vmlal.u32 q10,d28,d2[1] - vst1.32 {d28},[r10,:64]! @ put aside smashed b[8*i+7] - vmlal.u32 q11,d28,d3[0] - vzip.16 d29,d8 - vmlal.u32 q12,d28,d3[1] - vld1.32 {d28},[sp,:64] @ pull smashed b[8*i+0] - vmlal.u32 q13,d29,d4[0] - vld1.32 {d0,d1,d2,d3},[r1]! - vmlal.u32 q6,d29,d4[1] - vmlal.u32 q7,d29,d5[0] - vshr.u64 d26,d26,#16 - vmlal.u32 q8,d29,d5[1] - vmlal.u32 q9,d29,d6[0] - vadd.u64 d26,d26,d27 - vmlal.u32 q10,d29,d6[1] - vshr.u64 d26,d26,#16 - vmlal.u32 q11,d29,d7[0] - vmlal.u32 q12,d29,d7[1] - vadd.u64 d12,d12,d26 - vst1.32 {d29},[r10,:64] @ put aside smashed m[8*i+7] - add r10,sp,#8 @ rewind - sub r8,r5,#8 - b .LNEON_8n_inner - -.align 4 -.LNEON_8n_inner: - subs r8,r8,#8 - vmlal.u32 q6,d28,d0[0] - vld1.64 {q13},[r6,:128] - vmlal.u32 q7,d28,d0[1] - vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+0] - vmlal.u32 q8,d28,d1[0] - vld1.32 {d4,d5,d6,d7},[r3]! - vmlal.u32 q9,d28,d1[1] - it ne - addne r6,r6,#16 @ don't advance in last iteration - vmlal.u32 q10,d28,d2[0] - vmlal.u32 q11,d28,d2[1] - vmlal.u32 q12,d28,d3[0] - vmlal.u32 q13,d28,d3[1] - vld1.32 {d28},[r10,:64]! @ pull smashed b[8*i+1] - vmlal.u32 q6,d29,d4[0] - vmlal.u32 q7,d29,d4[1] - vmlal.u32 q8,d29,d5[0] - vmlal.u32 q9,d29,d5[1] - vmlal.u32 q10,d29,d6[0] - vmlal.u32 q11,d29,d6[1] - vmlal.u32 q12,d29,d7[0] - vmlal.u32 q13,d29,d7[1] - vst1.64 {q6},[r7,:128]! - vmlal.u32 q7,d28,d0[0] - vld1.64 {q6},[r6,:128] - vmlal.u32 q8,d28,d0[1] - vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+1] - vmlal.u32 q9,d28,d1[0] - it ne - addne r6,r6,#16 @ don't advance in last iteration - vmlal.u32 q10,d28,d1[1] - vmlal.u32 q11,d28,d2[0] - vmlal.u32 q12,d28,d2[1] - vmlal.u32 q13,d28,d3[0] - vmlal.u32 q6,d28,d3[1] - vld1.32 {d28},[r10,:64]! @ pull smashed b[8*i+2] - vmlal.u32 q7,d29,d4[0] - vmlal.u32 q8,d29,d4[1] - vmlal.u32 q9,d29,d5[0] - vmlal.u32 q10,d29,d5[1] - vmlal.u32 q11,d29,d6[0] - vmlal.u32 q12,d29,d6[1] - vmlal.u32 q13,d29,d7[0] - vmlal.u32 q6,d29,d7[1] - vst1.64 {q7},[r7,:128]! - vmlal.u32 q8,d28,d0[0] - vld1.64 {q7},[r6,:128] - vmlal.u32 q9,d28,d0[1] - vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+2] - vmlal.u32 q10,d28,d1[0] - it ne - addne r6,r6,#16 @ don't advance in last iteration - vmlal.u32 q11,d28,d1[1] - vmlal.u32 q12,d28,d2[0] - vmlal.u32 q13,d28,d2[1] - vmlal.u32 q6,d28,d3[0] - vmlal.u32 q7,d28,d3[1] - vld1.32 {d28},[r10,:64]! @ pull smashed b[8*i+3] - vmlal.u32 q8,d29,d4[0] - vmlal.u32 q9,d29,d4[1] - vmlal.u32 q10,d29,d5[0] - vmlal.u32 q11,d29,d5[1] - vmlal.u32 q12,d29,d6[0] - vmlal.u32 q13,d29,d6[1] - vmlal.u32 q6,d29,d7[0] - vmlal.u32 q7,d29,d7[1] - vst1.64 {q8},[r7,:128]! - vmlal.u32 q9,d28,d0[0] - vld1.64 {q8},[r6,:128] - vmlal.u32 q10,d28,d0[1] - vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+3] - vmlal.u32 q11,d28,d1[0] - it ne - addne r6,r6,#16 @ don't advance in last iteration - vmlal.u32 q12,d28,d1[1] - vmlal.u32 q13,d28,d2[0] - vmlal.u32 q6,d28,d2[1] - vmlal.u32 q7,d28,d3[0] - vmlal.u32 q8,d28,d3[1] - vld1.32 {d28},[r10,:64]! @ pull smashed b[8*i+4] - vmlal.u32 q9,d29,d4[0] - vmlal.u32 q10,d29,d4[1] - vmlal.u32 q11,d29,d5[0] - vmlal.u32 q12,d29,d5[1] - vmlal.u32 q13,d29,d6[0] - vmlal.u32 q6,d29,d6[1] - vmlal.u32 q7,d29,d7[0] - vmlal.u32 q8,d29,d7[1] - vst1.64 {q9},[r7,:128]! - vmlal.u32 q10,d28,d0[0] - vld1.64 {q9},[r6,:128] - vmlal.u32 q11,d28,d0[1] - vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+4] - vmlal.u32 q12,d28,d1[0] - it ne - addne r6,r6,#16 @ don't advance in last iteration - vmlal.u32 q13,d28,d1[1] - vmlal.u32 q6,d28,d2[0] - vmlal.u32 q7,d28,d2[1] - vmlal.u32 q8,d28,d3[0] - vmlal.u32 q9,d28,d3[1] - vld1.32 {d28},[r10,:64]! @ pull smashed b[8*i+5] - vmlal.u32 q10,d29,d4[0] - vmlal.u32 q11,d29,d4[1] - vmlal.u32 q12,d29,d5[0] - vmlal.u32 q13,d29,d5[1] - vmlal.u32 q6,d29,d6[0] - vmlal.u32 q7,d29,d6[1] - vmlal.u32 q8,d29,d7[0] - vmlal.u32 q9,d29,d7[1] - vst1.64 {q10},[r7,:128]! - vmlal.u32 q11,d28,d0[0] - vld1.64 {q10},[r6,:128] - vmlal.u32 q12,d28,d0[1] - vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+5] - vmlal.u32 q13,d28,d1[0] - it ne - addne r6,r6,#16 @ don't advance in last iteration - vmlal.u32 q6,d28,d1[1] - vmlal.u32 q7,d28,d2[0] - vmlal.u32 q8,d28,d2[1] - vmlal.u32 q9,d28,d3[0] - vmlal.u32 q10,d28,d3[1] - vld1.32 {d28},[r10,:64]! @ pull smashed b[8*i+6] - vmlal.u32 q11,d29,d4[0] - vmlal.u32 q12,d29,d4[1] - vmlal.u32 q13,d29,d5[0] - vmlal.u32 q6,d29,d5[1] - vmlal.u32 q7,d29,d6[0] - vmlal.u32 q8,d29,d6[1] - vmlal.u32 q9,d29,d7[0] - vmlal.u32 q10,d29,d7[1] - vst1.64 {q11},[r7,:128]! - vmlal.u32 q12,d28,d0[0] - vld1.64 {q11},[r6,:128] - vmlal.u32 q13,d28,d0[1] - vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+6] - vmlal.u32 q6,d28,d1[0] - it ne - addne r6,r6,#16 @ don't advance in last iteration - vmlal.u32 q7,d28,d1[1] - vmlal.u32 q8,d28,d2[0] - vmlal.u32 q9,d28,d2[1] - vmlal.u32 q10,d28,d3[0] - vmlal.u32 q11,d28,d3[1] - vld1.32 {d28},[r10,:64]! @ pull smashed b[8*i+7] - vmlal.u32 q12,d29,d4[0] - vmlal.u32 q13,d29,d4[1] - vmlal.u32 q6,d29,d5[0] - vmlal.u32 q7,d29,d5[1] - vmlal.u32 q8,d29,d6[0] - vmlal.u32 q9,d29,d6[1] - vmlal.u32 q10,d29,d7[0] - vmlal.u32 q11,d29,d7[1] - vst1.64 {q12},[r7,:128]! - vmlal.u32 q13,d28,d0[0] - vld1.64 {q12},[r6,:128] - vmlal.u32 q6,d28,d0[1] - vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+7] - vmlal.u32 q7,d28,d1[0] - it ne - addne r6,r6,#16 @ don't advance in last iteration - vmlal.u32 q8,d28,d1[1] - vmlal.u32 q9,d28,d2[0] - vmlal.u32 q10,d28,d2[1] - vmlal.u32 q11,d28,d3[0] - vmlal.u32 q12,d28,d3[1] - it eq - subeq r1,r1,r5,lsl#2 @ rewind - vmlal.u32 q13,d29,d4[0] - vld1.32 {d28},[sp,:64] @ pull smashed b[8*i+0] - vmlal.u32 q6,d29,d4[1] - vld1.32 {d0,d1,d2,d3},[r1]! - vmlal.u32 q7,d29,d5[0] - add r10,sp,#8 @ rewind - vmlal.u32 q8,d29,d5[1] - vmlal.u32 q9,d29,d6[0] - vmlal.u32 q10,d29,d6[1] - vmlal.u32 q11,d29,d7[0] - vst1.64 {q13},[r7,:128]! - vmlal.u32 q12,d29,d7[1] - - bne .LNEON_8n_inner - add r6,sp,#128 - vst1.64 {q6,q7},[r7,:256]! - veor q2,q2,q2 @ d4-d5 - vst1.64 {q8,q9},[r7,:256]! - veor q3,q3,q3 @ d6-d7 - vst1.64 {q10,q11},[r7,:256]! - vst1.64 {q12},[r7,:128] - - subs r9,r9,#8 - vld1.64 {q6,q7},[r6,:256]! - vld1.64 {q8,q9},[r6,:256]! - vld1.64 {q10,q11},[r6,:256]! - vld1.64 {q12,q13},[r6,:256]! - - itt ne - subne r3,r3,r5,lsl#2 @ rewind - bne .LNEON_8n_outer - - add r7,sp,#128 - vst1.64 {q2,q3}, [sp,:256]! @ start wiping stack frame - vshr.u64 d10,d12,#16 - vst1.64 {q2,q3},[sp,:256]! - vadd.u64 d13,d13,d10 - vst1.64 {q2,q3}, [sp,:256]! - vshr.u64 d10,d13,#16 - vst1.64 {q2,q3}, [sp,:256]! - vzip.16 d12,d13 - - mov r8,r5 - b .LNEON_tail_entry - -.align 4 -.LNEON_tail: - vadd.u64 d12,d12,d10 - vshr.u64 d10,d12,#16 - vld1.64 {q8,q9}, [r6, :256]! - vadd.u64 d13,d13,d10 - vld1.64 {q10,q11}, [r6, :256]! - vshr.u64 d10,d13,#16 - vld1.64 {q12,q13}, [r6, :256]! - vzip.16 d12,d13 - -.LNEON_tail_entry: - vadd.u64 d14,d14,d10 - vst1.32 {d12[0]}, [r7, :32]! - vshr.u64 d10,d14,#16 - vadd.u64 d15,d15,d10 - vshr.u64 d10,d15,#16 - vzip.16 d14,d15 - vadd.u64 d16,d16,d10 - vst1.32 {d14[0]}, [r7, :32]! - vshr.u64 d10,d16,#16 - vadd.u64 d17,d17,d10 - vshr.u64 d10,d17,#16 - vzip.16 d16,d17 - vadd.u64 d18,d18,d10 - vst1.32 {d16[0]}, [r7, :32]! - vshr.u64 d10,d18,#16 - vadd.u64 d19,d19,d10 - vshr.u64 d10,d19,#16 - vzip.16 d18,d19 - vadd.u64 d20,d20,d10 - vst1.32 {d18[0]}, [r7, :32]! - vshr.u64 d10,d20,#16 - vadd.u64 d21,d21,d10 - vshr.u64 d10,d21,#16 - vzip.16 d20,d21 - vadd.u64 d22,d22,d10 - vst1.32 {d20[0]}, [r7, :32]! - vshr.u64 d10,d22,#16 - vadd.u64 d23,d23,d10 - vshr.u64 d10,d23,#16 - vzip.16 d22,d23 - vadd.u64 d24,d24,d10 - vst1.32 {d22[0]}, [r7, :32]! - vshr.u64 d10,d24,#16 - vadd.u64 d25,d25,d10 - vshr.u64 d10,d25,#16 - vzip.16 d24,d25 - vadd.u64 d26,d26,d10 - vst1.32 {d24[0]}, [r7, :32]! - vshr.u64 d10,d26,#16 - vadd.u64 d27,d27,d10 - vshr.u64 d10,d27,#16 - vzip.16 d26,d27 - vld1.64 {q6,q7}, [r6, :256]! - subs r8,r8,#8 - vst1.32 {d26[0]}, [r7, :32]! - bne .LNEON_tail - - vst1.32 {d10[0]}, [r7, :32] @ top-most bit - sub r3,r3,r5,lsl#2 @ rewind r3 - subs r1,sp,#0 @ clear carry flag - add r2,sp,r5,lsl#2 - -.LNEON_sub: - ldmia r1!, {r4,r5,r6,r7} - ldmia r3!, {r8,r9,r10,r11} - sbcs r8, r4,r8 - sbcs r9, r5,r9 - sbcs r10,r6,r10 - sbcs r11,r7,r11 - teq r1,r2 @ preserves carry - stmia r0!, {r8,r9,r10,r11} - bne .LNEON_sub - - ldr r10, [r1] @ load top-most bit - mov r11,sp - veor q0,q0,q0 - sub r11,r2,r11 @ this is num*4 - veor q1,q1,q1 - mov r1,sp - sub r0,r0,r11 @ rewind r0 - mov r3,r2 @ second 3/4th of frame - sbcs r10,r10,#0 @ result is carry flag - -.LNEON_copy_n_zap: - ldmia r1!, {r4,r5,r6,r7} - ldmia r0, {r8,r9,r10,r11} - it cc - movcc r8, r4 - vst1.64 {q0,q1}, [r3,:256]! @ wipe - itt cc - movcc r9, r5 - movcc r10,r6 - vst1.64 {q0,q1}, [r3,:256]! @ wipe - it cc - movcc r11,r7 - ldmia r1, {r4,r5,r6,r7} - stmia r0!, {r8,r9,r10,r11} - sub r1,r1,#16 - ldmia r0, {r8,r9,r10,r11} - it cc - movcc r8, r4 - vst1.64 {q0,q1}, [r1,:256]! @ wipe - itt cc - movcc r9, r5 - movcc r10,r6 - vst1.64 {q0,q1}, [r3,:256]! @ wipe - it cc - movcc r11,r7 - teq r1,r2 @ preserves carry - stmia r0!, {r8,r9,r10,r11} - bne .LNEON_copy_n_zap - - mov sp,ip - vldmia sp!,{d8,d9,d10,d11,d12,d13,d14,d15} - ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11} - bx lr @ bx lr -.size bn_mul8x_mont_neon,.-bn_mul8x_mont_neon -#endif -.byte 77,111,110,116,103,111,109,101,114,121,32,109,117,108,116,105,112,108,105,99,97,116,105,111,110,32,102,111,114,32,65,82,77,118,52,47,78,69,79,78,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 -.align 2 -#endif -#endif // !OPENSSL_NO_ASM -.section .note.GNU-stack,"",%progbits diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/armv8-mont-ios64.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/armv8-mont-ios64.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/armv8-mont-ios64.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/armv8-mont-ios64.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,1430 +0,0 @@ -// This file is generated from a similarly-named Perl script in the BoringSSL -// source tree. Do not edit by hand. - -#if !defined(__has_feature) -#define __has_feature(x) 0 -#endif -#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) -#define OPENSSL_NO_ASM -#endif - -#if !defined(OPENSSL_NO_ASM) -#include - -.text - -.globl _GFp_bn_mul_mont -.private_extern _GFp_bn_mul_mont - -.align 5 -_GFp_bn_mul_mont: - AARCH64_SIGN_LINK_REGISTER - tst x5,#7 - b.eq __bn_sqr8x_mont - tst x5,#3 - b.eq __bn_mul4x_mont -Lmul_mont: - stp x29,x30,[sp,#-64]! - add x29,sp,#0 - stp x19,x20,[sp,#16] - stp x21,x22,[sp,#32] - stp x23,x24,[sp,#48] - - ldr x9,[x2],#8 // bp[0] - sub x22,sp,x5,lsl#3 - ldp x7,x8,[x1],#16 // ap[0..1] - lsl x5,x5,#3 - ldr x4,[x4] // *n0 - and x22,x22,#-16 // ABI says so - ldp x13,x14,[x3],#16 // np[0..1] - - mul x6,x7,x9 // ap[0]*bp[0] - sub x21,x5,#16 // j=num-2 - umulh x7,x7,x9 - mul x10,x8,x9 // ap[1]*bp[0] - umulh x11,x8,x9 - - mul x15,x6,x4 // "tp[0]"*n0 - mov sp,x22 // alloca - - // (*) mul x12,x13,x15 // np[0]*m1 - umulh x13,x13,x15 - mul x16,x14,x15 // np[1]*m1 - // (*) adds x12,x12,x6 // discarded - // (*) As for removal of first multiplication and addition - // instructions. The outcome of first addition is - // guaranteed to be zero, which leaves two computationally - // significant outcomes: it either carries or not. Then - // question is when does it carry? Is there alternative - // way to deduce it? If you follow operations, you can - // observe that condition for carry is quite simple: - // x6 being non-zero. So that carry can be calculated - // by adding -1 to x6. That's what next instruction does. - subs xzr,x6,#1 // (*) - umulh x17,x14,x15 - adc x13,x13,xzr - cbz x21,L1st_skip - -L1st: - ldr x8,[x1],#8 - adds x6,x10,x7 - sub x21,x21,#8 // j-- - adc x7,x11,xzr - - ldr x14,[x3],#8 - adds x12,x16,x13 - mul x10,x8,x9 // ap[j]*bp[0] - adc x13,x17,xzr - umulh x11,x8,x9 - - adds x12,x12,x6 - mul x16,x14,x15 // np[j]*m1 - adc x13,x13,xzr - umulh x17,x14,x15 - str x12,[x22],#8 // tp[j-1] - cbnz x21,L1st - -L1st_skip: - adds x6,x10,x7 - sub x1,x1,x5 // rewind x1 - adc x7,x11,xzr - - adds x12,x16,x13 - sub x3,x3,x5 // rewind x3 - adc x13,x17,xzr - - adds x12,x12,x6 - sub x20,x5,#8 // i=num-1 - adcs x13,x13,x7 - - adc x19,xzr,xzr // upmost overflow bit - stp x12,x13,[x22] - -Louter: - ldr x9,[x2],#8 // bp[i] - ldp x7,x8,[x1],#16 - ldr x23,[sp] // tp[0] - add x22,sp,#8 - - mul x6,x7,x9 // ap[0]*bp[i] - sub x21,x5,#16 // j=num-2 - umulh x7,x7,x9 - ldp x13,x14,[x3],#16 - mul x10,x8,x9 // ap[1]*bp[i] - adds x6,x6,x23 - umulh x11,x8,x9 - adc x7,x7,xzr - - mul x15,x6,x4 - sub x20,x20,#8 // i-- - - // (*) mul x12,x13,x15 // np[0]*m1 - umulh x13,x13,x15 - mul x16,x14,x15 // np[1]*m1 - // (*) adds x12,x12,x6 - subs xzr,x6,#1 // (*) - umulh x17,x14,x15 - cbz x21,Linner_skip - -Linner: - ldr x8,[x1],#8 - adc x13,x13,xzr - ldr x23,[x22],#8 // tp[j] - adds x6,x10,x7 - sub x21,x21,#8 // j-- - adc x7,x11,xzr - - adds x12,x16,x13 - ldr x14,[x3],#8 - adc x13,x17,xzr - - mul x10,x8,x9 // ap[j]*bp[i] - adds x6,x6,x23 - umulh x11,x8,x9 - adc x7,x7,xzr - - mul x16,x14,x15 // np[j]*m1 - adds x12,x12,x6 - umulh x17,x14,x15 - str x12,[x22,#-16] // tp[j-1] - cbnz x21,Linner - -Linner_skip: - ldr x23,[x22],#8 // tp[j] - adc x13,x13,xzr - adds x6,x10,x7 - sub x1,x1,x5 // rewind x1 - adc x7,x11,xzr - - adds x12,x16,x13 - sub x3,x3,x5 // rewind x3 - adcs x13,x17,x19 - adc x19,xzr,xzr - - adds x6,x6,x23 - adc x7,x7,xzr - - adds x12,x12,x6 - adcs x13,x13,x7 - adc x19,x19,xzr // upmost overflow bit - stp x12,x13,[x22,#-16] - - cbnz x20,Louter - - // Final step. We see if result is larger than modulus, and - // if it is, subtract the modulus. But comparison implies - // subtraction. So we subtract modulus, see if it borrowed, - // and conditionally copy original value. - ldr x23,[sp] // tp[0] - add x22,sp,#8 - ldr x14,[x3],#8 // np[0] - subs x21,x5,#8 // j=num-1 and clear borrow - mov x1,x0 -Lsub: - sbcs x8,x23,x14 // tp[j]-np[j] - ldr x23,[x22],#8 - sub x21,x21,#8 // j-- - ldr x14,[x3],#8 - str x8,[x1],#8 // rp[j]=tp[j]-np[j] - cbnz x21,Lsub - - sbcs x8,x23,x14 - sbcs x19,x19,xzr // did it borrow? - str x8,[x1],#8 // rp[num-1] - - ldr x23,[sp] // tp[0] - add x22,sp,#8 - ldr x8,[x0],#8 // rp[0] - sub x5,x5,#8 // num-- - nop -Lcond_copy: - sub x5,x5,#8 // num-- - csel x14,x23,x8,lo // did it borrow? - ldr x23,[x22],#8 - ldr x8,[x0],#8 - str xzr,[x22,#-16] // wipe tp - str x14,[x0,#-16] - cbnz x5,Lcond_copy - - csel x14,x23,x8,lo - str xzr,[x22,#-8] // wipe tp - str x14,[x0,#-8] - - ldp x19,x20,[x29,#16] - mov sp,x29 - ldp x21,x22,[x29,#32] - mov x0,#1 - ldp x23,x24,[x29,#48] - ldr x29,[sp],#64 - AARCH64_VALIDATE_LINK_REGISTER - ret - - -.align 5 -__bn_sqr8x_mont: - // Not adding AARCH64_SIGN_LINK_REGISTER here because __bn_sqr8x_mont is jumped to - // only from bn_mul_mont which has already signed the return address. - cmp x1,x2 - b.ne __bn_mul4x_mont -Lsqr8x_mont: - stp x29,x30,[sp,#-128]! - add x29,sp,#0 - stp x19,x20,[sp,#16] - stp x21,x22,[sp,#32] - stp x23,x24,[sp,#48] - stp x25,x26,[sp,#64] - stp x27,x28,[sp,#80] - stp x0,x3,[sp,#96] // offload rp and np - - ldp x6,x7,[x1,#8*0] - ldp x8,x9,[x1,#8*2] - ldp x10,x11,[x1,#8*4] - ldp x12,x13,[x1,#8*6] - - sub x2,sp,x5,lsl#4 - lsl x5,x5,#3 - ldr x4,[x4] // *n0 - mov sp,x2 // alloca - sub x27,x5,#8*8 - b Lsqr8x_zero_start - -Lsqr8x_zero: - sub x27,x27,#8*8 - stp xzr,xzr,[x2,#8*0] - stp xzr,xzr,[x2,#8*2] - stp xzr,xzr,[x2,#8*4] - stp xzr,xzr,[x2,#8*6] -Lsqr8x_zero_start: - stp xzr,xzr,[x2,#8*8] - stp xzr,xzr,[x2,#8*10] - stp xzr,xzr,[x2,#8*12] - stp xzr,xzr,[x2,#8*14] - add x2,x2,#8*16 - cbnz x27,Lsqr8x_zero - - add x3,x1,x5 - add x1,x1,#8*8 - mov x19,xzr - mov x20,xzr - mov x21,xzr - mov x22,xzr - mov x23,xzr - mov x24,xzr - mov x25,xzr - mov x26,xzr - mov x2,sp - str x4,[x29,#112] // offload n0 - - // Multiply everything but a[i]*a[i] -.align 4 -Lsqr8x_outer_loop: - // a[1]a[0] (i) - // a[2]a[0] - // a[3]a[0] - // a[4]a[0] - // a[5]a[0] - // a[6]a[0] - // a[7]a[0] - // a[2]a[1] (ii) - // a[3]a[1] - // a[4]a[1] - // a[5]a[1] - // a[6]a[1] - // a[7]a[1] - // a[3]a[2] (iii) - // a[4]a[2] - // a[5]a[2] - // a[6]a[2] - // a[7]a[2] - // a[4]a[3] (iv) - // a[5]a[3] - // a[6]a[3] - // a[7]a[3] - // a[5]a[4] (v) - // a[6]a[4] - // a[7]a[4] - // a[6]a[5] (vi) - // a[7]a[5] - // a[7]a[6] (vii) - - mul x14,x7,x6 // lo(a[1..7]*a[0]) (i) - mul x15,x8,x6 - mul x16,x9,x6 - mul x17,x10,x6 - adds x20,x20,x14 // t[1]+lo(a[1]*a[0]) - mul x14,x11,x6 - adcs x21,x21,x15 - mul x15,x12,x6 - adcs x22,x22,x16 - mul x16,x13,x6 - adcs x23,x23,x17 - umulh x17,x7,x6 // hi(a[1..7]*a[0]) - adcs x24,x24,x14 - umulh x14,x8,x6 - adcs x25,x25,x15 - umulh x15,x9,x6 - adcs x26,x26,x16 - umulh x16,x10,x6 - stp x19,x20,[x2],#8*2 // t[0..1] - adc x19,xzr,xzr // t[8] - adds x21,x21,x17 // t[2]+lo(a[1]*a[0]) - umulh x17,x11,x6 - adcs x22,x22,x14 - umulh x14,x12,x6 - adcs x23,x23,x15 - umulh x15,x13,x6 - adcs x24,x24,x16 - mul x16,x8,x7 // lo(a[2..7]*a[1]) (ii) - adcs x25,x25,x17 - mul x17,x9,x7 - adcs x26,x26,x14 - mul x14,x10,x7 - adc x19,x19,x15 - - mul x15,x11,x7 - adds x22,x22,x16 - mul x16,x12,x7 - adcs x23,x23,x17 - mul x17,x13,x7 - adcs x24,x24,x14 - umulh x14,x8,x7 // hi(a[2..7]*a[1]) - adcs x25,x25,x15 - umulh x15,x9,x7 - adcs x26,x26,x16 - umulh x16,x10,x7 - adcs x19,x19,x17 - umulh x17,x11,x7 - stp x21,x22,[x2],#8*2 // t[2..3] - adc x20,xzr,xzr // t[9] - adds x23,x23,x14 - umulh x14,x12,x7 - adcs x24,x24,x15 - umulh x15,x13,x7 - adcs x25,x25,x16 - mul x16,x9,x8 // lo(a[3..7]*a[2]) (iii) - adcs x26,x26,x17 - mul x17,x10,x8 - adcs x19,x19,x14 - mul x14,x11,x8 - adc x20,x20,x15 - - mul x15,x12,x8 - adds x24,x24,x16 - mul x16,x13,x8 - adcs x25,x25,x17 - umulh x17,x9,x8 // hi(a[3..7]*a[2]) - adcs x26,x26,x14 - umulh x14,x10,x8 - adcs x19,x19,x15 - umulh x15,x11,x8 - adcs x20,x20,x16 - umulh x16,x12,x8 - stp x23,x24,[x2],#8*2 // t[4..5] - adc x21,xzr,xzr // t[10] - adds x25,x25,x17 - umulh x17,x13,x8 - adcs x26,x26,x14 - mul x14,x10,x9 // lo(a[4..7]*a[3]) (iv) - adcs x19,x19,x15 - mul x15,x11,x9 - adcs x20,x20,x16 - mul x16,x12,x9 - adc x21,x21,x17 - - mul x17,x13,x9 - adds x26,x26,x14 - umulh x14,x10,x9 // hi(a[4..7]*a[3]) - adcs x19,x19,x15 - umulh x15,x11,x9 - adcs x20,x20,x16 - umulh x16,x12,x9 - adcs x21,x21,x17 - umulh x17,x13,x9 - stp x25,x26,[x2],#8*2 // t[6..7] - adc x22,xzr,xzr // t[11] - adds x19,x19,x14 - mul x14,x11,x10 // lo(a[5..7]*a[4]) (v) - adcs x20,x20,x15 - mul x15,x12,x10 - adcs x21,x21,x16 - mul x16,x13,x10 - adc x22,x22,x17 - - umulh x17,x11,x10 // hi(a[5..7]*a[4]) - adds x20,x20,x14 - umulh x14,x12,x10 - adcs x21,x21,x15 - umulh x15,x13,x10 - adcs x22,x22,x16 - mul x16,x12,x11 // lo(a[6..7]*a[5]) (vi) - adc x23,xzr,xzr // t[12] - adds x21,x21,x17 - mul x17,x13,x11 - adcs x22,x22,x14 - umulh x14,x12,x11 // hi(a[6..7]*a[5]) - adc x23,x23,x15 - - umulh x15,x13,x11 - adds x22,x22,x16 - mul x16,x13,x12 // lo(a[7]*a[6]) (vii) - adcs x23,x23,x17 - umulh x17,x13,x12 // hi(a[7]*a[6]) - adc x24,xzr,xzr // t[13] - adds x23,x23,x14 - sub x27,x3,x1 // done yet? - adc x24,x24,x15 - - adds x24,x24,x16 - sub x14,x3,x5 // rewinded ap - adc x25,xzr,xzr // t[14] - add x25,x25,x17 - - cbz x27,Lsqr8x_outer_break - - mov x4,x6 - ldp x6,x7,[x2,#8*0] - ldp x8,x9,[x2,#8*2] - ldp x10,x11,[x2,#8*4] - ldp x12,x13,[x2,#8*6] - adds x19,x19,x6 - adcs x20,x20,x7 - ldp x6,x7,[x1,#8*0] - adcs x21,x21,x8 - adcs x22,x22,x9 - ldp x8,x9,[x1,#8*2] - adcs x23,x23,x10 - adcs x24,x24,x11 - ldp x10,x11,[x1,#8*4] - adcs x25,x25,x12 - mov x0,x1 - adcs x26,xzr,x13 - ldp x12,x13,[x1,#8*6] - add x1,x1,#8*8 - //adc x28,xzr,xzr // moved below - mov x27,#-8*8 - - // a[8]a[0] - // a[9]a[0] - // a[a]a[0] - // a[b]a[0] - // a[c]a[0] - // a[d]a[0] - // a[e]a[0] - // a[f]a[0] - // a[8]a[1] - // a[f]a[1]........................ - // a[8]a[2] - // a[f]a[2]........................ - // a[8]a[3] - // a[f]a[3]........................ - // a[8]a[4] - // a[f]a[4]........................ - // a[8]a[5] - // a[f]a[5]........................ - // a[8]a[6] - // a[f]a[6]........................ - // a[8]a[7] - // a[f]a[7]........................ -Lsqr8x_mul: - mul x14,x6,x4 - adc x28,xzr,xzr // carry bit, modulo-scheduled - mul x15,x7,x4 - add x27,x27,#8 - mul x16,x8,x4 - mul x17,x9,x4 - adds x19,x19,x14 - mul x14,x10,x4 - adcs x20,x20,x15 - mul x15,x11,x4 - adcs x21,x21,x16 - mul x16,x12,x4 - adcs x22,x22,x17 - mul x17,x13,x4 - adcs x23,x23,x14 - umulh x14,x6,x4 - adcs x24,x24,x15 - umulh x15,x7,x4 - adcs x25,x25,x16 - umulh x16,x8,x4 - adcs x26,x26,x17 - umulh x17,x9,x4 - adc x28,x28,xzr - str x19,[x2],#8 - adds x19,x20,x14 - umulh x14,x10,x4 - adcs x20,x21,x15 - umulh x15,x11,x4 - adcs x21,x22,x16 - umulh x16,x12,x4 - adcs x22,x23,x17 - umulh x17,x13,x4 - ldr x4,[x0,x27] - adcs x23,x24,x14 - adcs x24,x25,x15 - adcs x25,x26,x16 - adcs x26,x28,x17 - //adc x28,xzr,xzr // moved above - cbnz x27,Lsqr8x_mul - // note that carry flag is guaranteed - // to be zero at this point - cmp x1,x3 // done yet? - b.eq Lsqr8x_break - - ldp x6,x7,[x2,#8*0] - ldp x8,x9,[x2,#8*2] - ldp x10,x11,[x2,#8*4] - ldp x12,x13,[x2,#8*6] - adds x19,x19,x6 - ldr x4,[x0,#-8*8] - adcs x20,x20,x7 - ldp x6,x7,[x1,#8*0] - adcs x21,x21,x8 - adcs x22,x22,x9 - ldp x8,x9,[x1,#8*2] - adcs x23,x23,x10 - adcs x24,x24,x11 - ldp x10,x11,[x1,#8*4] - adcs x25,x25,x12 - mov x27,#-8*8 - adcs x26,x26,x13 - ldp x12,x13,[x1,#8*6] - add x1,x1,#8*8 - //adc x28,xzr,xzr // moved above - b Lsqr8x_mul - -.align 4 -Lsqr8x_break: - ldp x6,x7,[x0,#8*0] - add x1,x0,#8*8 - ldp x8,x9,[x0,#8*2] - sub x14,x3,x1 // is it last iteration? - ldp x10,x11,[x0,#8*4] - sub x15,x2,x14 - ldp x12,x13,[x0,#8*6] - cbz x14,Lsqr8x_outer_loop - - stp x19,x20,[x2,#8*0] - ldp x19,x20,[x15,#8*0] - stp x21,x22,[x2,#8*2] - ldp x21,x22,[x15,#8*2] - stp x23,x24,[x2,#8*4] - ldp x23,x24,[x15,#8*4] - stp x25,x26,[x2,#8*6] - mov x2,x15 - ldp x25,x26,[x15,#8*6] - b Lsqr8x_outer_loop - -.align 4 -Lsqr8x_outer_break: - // Now multiply above result by 2 and add a[n-1]*a[n-1]|...|a[0]*a[0] - ldp x7,x9,[x14,#8*0] // recall that x14 is &a[0] - ldp x15,x16,[sp,#8*1] - ldp x11,x13,[x14,#8*2] - add x1,x14,#8*4 - ldp x17,x14,[sp,#8*3] - - stp x19,x20,[x2,#8*0] - mul x19,x7,x7 - stp x21,x22,[x2,#8*2] - umulh x7,x7,x7 - stp x23,x24,[x2,#8*4] - mul x8,x9,x9 - stp x25,x26,[x2,#8*6] - mov x2,sp - umulh x9,x9,x9 - adds x20,x7,x15,lsl#1 - extr x15,x16,x15,#63 - sub x27,x5,#8*4 - -Lsqr4x_shift_n_add: - adcs x21,x8,x15 - extr x16,x17,x16,#63 - sub x27,x27,#8*4 - adcs x22,x9,x16 - ldp x15,x16,[x2,#8*5] - mul x10,x11,x11 - ldp x7,x9,[x1],#8*2 - umulh x11,x11,x11 - mul x12,x13,x13 - umulh x13,x13,x13 - extr x17,x14,x17,#63 - stp x19,x20,[x2,#8*0] - adcs x23,x10,x17 - extr x14,x15,x14,#63 - stp x21,x22,[x2,#8*2] - adcs x24,x11,x14 - ldp x17,x14,[x2,#8*7] - extr x15,x16,x15,#63 - adcs x25,x12,x15 - extr x16,x17,x16,#63 - adcs x26,x13,x16 - ldp x15,x16,[x2,#8*9] - mul x6,x7,x7 - ldp x11,x13,[x1],#8*2 - umulh x7,x7,x7 - mul x8,x9,x9 - umulh x9,x9,x9 - stp x23,x24,[x2,#8*4] - extr x17,x14,x17,#63 - stp x25,x26,[x2,#8*6] - add x2,x2,#8*8 - adcs x19,x6,x17 - extr x14,x15,x14,#63 - adcs x20,x7,x14 - ldp x17,x14,[x2,#8*3] - extr x15,x16,x15,#63 - cbnz x27,Lsqr4x_shift_n_add - ldp x1,x4,[x29,#104] // pull np and n0 - - adcs x21,x8,x15 - extr x16,x17,x16,#63 - adcs x22,x9,x16 - ldp x15,x16,[x2,#8*5] - mul x10,x11,x11 - umulh x11,x11,x11 - stp x19,x20,[x2,#8*0] - mul x12,x13,x13 - umulh x13,x13,x13 - stp x21,x22,[x2,#8*2] - extr x17,x14,x17,#63 - adcs x23,x10,x17 - extr x14,x15,x14,#63 - ldp x19,x20,[sp,#8*0] - adcs x24,x11,x14 - extr x15,x16,x15,#63 - ldp x6,x7,[x1,#8*0] - adcs x25,x12,x15 - extr x16,xzr,x16,#63 - ldp x8,x9,[x1,#8*2] - adc x26,x13,x16 - ldp x10,x11,[x1,#8*4] - - // Reduce by 512 bits per iteration - mul x28,x4,x19 // t[0]*n0 - ldp x12,x13,[x1,#8*6] - add x3,x1,x5 - ldp x21,x22,[sp,#8*2] - stp x23,x24,[x2,#8*4] - ldp x23,x24,[sp,#8*4] - stp x25,x26,[x2,#8*6] - ldp x25,x26,[sp,#8*6] - add x1,x1,#8*8 - mov x30,xzr // initial top-most carry - mov x2,sp - mov x27,#8 - -Lsqr8x_reduction: - // (*) mul x14,x6,x28 // lo(n[0-7])*lo(t[0]*n0) - mul x15,x7,x28 - sub x27,x27,#1 - mul x16,x8,x28 - str x28,[x2],#8 // put aside t[0]*n0 for tail processing - mul x17,x9,x28 - // (*) adds xzr,x19,x14 - subs xzr,x19,#1 // (*) - mul x14,x10,x28 - adcs x19,x20,x15 - mul x15,x11,x28 - adcs x20,x21,x16 - mul x16,x12,x28 - adcs x21,x22,x17 - mul x17,x13,x28 - adcs x22,x23,x14 - umulh x14,x6,x28 // hi(n[0-7])*lo(t[0]*n0) - adcs x23,x24,x15 - umulh x15,x7,x28 - adcs x24,x25,x16 - umulh x16,x8,x28 - adcs x25,x26,x17 - umulh x17,x9,x28 - adc x26,xzr,xzr - adds x19,x19,x14 - umulh x14,x10,x28 - adcs x20,x20,x15 - umulh x15,x11,x28 - adcs x21,x21,x16 - umulh x16,x12,x28 - adcs x22,x22,x17 - umulh x17,x13,x28 - mul x28,x4,x19 // next t[0]*n0 - adcs x23,x23,x14 - adcs x24,x24,x15 - adcs x25,x25,x16 - adc x26,x26,x17 - cbnz x27,Lsqr8x_reduction - - ldp x14,x15,[x2,#8*0] - ldp x16,x17,[x2,#8*2] - mov x0,x2 - sub x27,x3,x1 // done yet? - adds x19,x19,x14 - adcs x20,x20,x15 - ldp x14,x15,[x2,#8*4] - adcs x21,x21,x16 - adcs x22,x22,x17 - ldp x16,x17,[x2,#8*6] - adcs x23,x23,x14 - adcs x24,x24,x15 - adcs x25,x25,x16 - adcs x26,x26,x17 - //adc x28,xzr,xzr // moved below - cbz x27,Lsqr8x8_post_condition - - ldr x4,[x2,#-8*8] - ldp x6,x7,[x1,#8*0] - ldp x8,x9,[x1,#8*2] - ldp x10,x11,[x1,#8*4] - mov x27,#-8*8 - ldp x12,x13,[x1,#8*6] - add x1,x1,#8*8 - -Lsqr8x_tail: - mul x14,x6,x4 - adc x28,xzr,xzr // carry bit, modulo-scheduled - mul x15,x7,x4 - add x27,x27,#8 - mul x16,x8,x4 - mul x17,x9,x4 - adds x19,x19,x14 - mul x14,x10,x4 - adcs x20,x20,x15 - mul x15,x11,x4 - adcs x21,x21,x16 - mul x16,x12,x4 - adcs x22,x22,x17 - mul x17,x13,x4 - adcs x23,x23,x14 - umulh x14,x6,x4 - adcs x24,x24,x15 - umulh x15,x7,x4 - adcs x25,x25,x16 - umulh x16,x8,x4 - adcs x26,x26,x17 - umulh x17,x9,x4 - adc x28,x28,xzr - str x19,[x2],#8 - adds x19,x20,x14 - umulh x14,x10,x4 - adcs x20,x21,x15 - umulh x15,x11,x4 - adcs x21,x22,x16 - umulh x16,x12,x4 - adcs x22,x23,x17 - umulh x17,x13,x4 - ldr x4,[x0,x27] - adcs x23,x24,x14 - adcs x24,x25,x15 - adcs x25,x26,x16 - adcs x26,x28,x17 - //adc x28,xzr,xzr // moved above - cbnz x27,Lsqr8x_tail - // note that carry flag is guaranteed - // to be zero at this point - ldp x6,x7,[x2,#8*0] - sub x27,x3,x1 // done yet? - sub x16,x3,x5 // rewinded np - ldp x8,x9,[x2,#8*2] - ldp x10,x11,[x2,#8*4] - ldp x12,x13,[x2,#8*6] - cbz x27,Lsqr8x_tail_break - - ldr x4,[x0,#-8*8] - adds x19,x19,x6 - adcs x20,x20,x7 - ldp x6,x7,[x1,#8*0] - adcs x21,x21,x8 - adcs x22,x22,x9 - ldp x8,x9,[x1,#8*2] - adcs x23,x23,x10 - adcs x24,x24,x11 - ldp x10,x11,[x1,#8*4] - adcs x25,x25,x12 - mov x27,#-8*8 - adcs x26,x26,x13 - ldp x12,x13,[x1,#8*6] - add x1,x1,#8*8 - //adc x28,xzr,xzr // moved above - b Lsqr8x_tail - -.align 4 -Lsqr8x_tail_break: - ldr x4,[x29,#112] // pull n0 - add x27,x2,#8*8 // end of current t[num] window - - subs xzr,x30,#1 // "move" top-most carry to carry bit - adcs x14,x19,x6 - adcs x15,x20,x7 - ldp x19,x20,[x0,#8*0] - adcs x21,x21,x8 - ldp x6,x7,[x16,#8*0] // recall that x16 is &n[0] - adcs x22,x22,x9 - ldp x8,x9,[x16,#8*2] - adcs x23,x23,x10 - adcs x24,x24,x11 - ldp x10,x11,[x16,#8*4] - adcs x25,x25,x12 - adcs x26,x26,x13 - ldp x12,x13,[x16,#8*6] - add x1,x16,#8*8 - adc x30,xzr,xzr // top-most carry - mul x28,x4,x19 - stp x14,x15,[x2,#8*0] - stp x21,x22,[x2,#8*2] - ldp x21,x22,[x0,#8*2] - stp x23,x24,[x2,#8*4] - ldp x23,x24,[x0,#8*4] - cmp x27,x29 // did we hit the bottom? - stp x25,x26,[x2,#8*6] - mov x2,x0 // slide the window - ldp x25,x26,[x0,#8*6] - mov x27,#8 - b.ne Lsqr8x_reduction - - // Final step. We see if result is larger than modulus, and - // if it is, subtract the modulus. But comparison implies - // subtraction. So we subtract modulus, see if it borrowed, - // and conditionally copy original value. - ldr x0,[x29,#96] // pull rp - add x2,x2,#8*8 - subs x14,x19,x6 - sbcs x15,x20,x7 - sub x27,x5,#8*8 - mov x3,x0 // x0 copy - -Lsqr8x_sub: - sbcs x16,x21,x8 - ldp x6,x7,[x1,#8*0] - sbcs x17,x22,x9 - stp x14,x15,[x0,#8*0] - sbcs x14,x23,x10 - ldp x8,x9,[x1,#8*2] - sbcs x15,x24,x11 - stp x16,x17,[x0,#8*2] - sbcs x16,x25,x12 - ldp x10,x11,[x1,#8*4] - sbcs x17,x26,x13 - ldp x12,x13,[x1,#8*6] - add x1,x1,#8*8 - ldp x19,x20,[x2,#8*0] - sub x27,x27,#8*8 - ldp x21,x22,[x2,#8*2] - ldp x23,x24,[x2,#8*4] - ldp x25,x26,[x2,#8*6] - add x2,x2,#8*8 - stp x14,x15,[x0,#8*4] - sbcs x14,x19,x6 - stp x16,x17,[x0,#8*6] - add x0,x0,#8*8 - sbcs x15,x20,x7 - cbnz x27,Lsqr8x_sub - - sbcs x16,x21,x8 - mov x2,sp - add x1,sp,x5 - ldp x6,x7,[x3,#8*0] - sbcs x17,x22,x9 - stp x14,x15,[x0,#8*0] - sbcs x14,x23,x10 - ldp x8,x9,[x3,#8*2] - sbcs x15,x24,x11 - stp x16,x17,[x0,#8*2] - sbcs x16,x25,x12 - ldp x19,x20,[x1,#8*0] - sbcs x17,x26,x13 - ldp x21,x22,[x1,#8*2] - sbcs xzr,x30,xzr // did it borrow? - ldr x30,[x29,#8] // pull return address - stp x14,x15,[x0,#8*4] - stp x16,x17,[x0,#8*6] - - sub x27,x5,#8*4 -Lsqr4x_cond_copy: - sub x27,x27,#8*4 - csel x14,x19,x6,lo - stp xzr,xzr,[x2,#8*0] - csel x15,x20,x7,lo - ldp x6,x7,[x3,#8*4] - ldp x19,x20,[x1,#8*4] - csel x16,x21,x8,lo - stp xzr,xzr,[x2,#8*2] - add x2,x2,#8*4 - csel x17,x22,x9,lo - ldp x8,x9,[x3,#8*6] - ldp x21,x22,[x1,#8*6] - add x1,x1,#8*4 - stp x14,x15,[x3,#8*0] - stp x16,x17,[x3,#8*2] - add x3,x3,#8*4 - stp xzr,xzr,[x1,#8*0] - stp xzr,xzr,[x1,#8*2] - cbnz x27,Lsqr4x_cond_copy - - csel x14,x19,x6,lo - stp xzr,xzr,[x2,#8*0] - csel x15,x20,x7,lo - stp xzr,xzr,[x2,#8*2] - csel x16,x21,x8,lo - csel x17,x22,x9,lo - stp x14,x15,[x3,#8*0] - stp x16,x17,[x3,#8*2] - - b Lsqr8x_done - -.align 4 -Lsqr8x8_post_condition: - adc x28,xzr,xzr - ldr x30,[x29,#8] // pull return address - // x19-7,x28 hold result, x6-7 hold modulus - subs x6,x19,x6 - ldr x1,[x29,#96] // pull rp - sbcs x7,x20,x7 - stp xzr,xzr,[sp,#8*0] - sbcs x8,x21,x8 - stp xzr,xzr,[sp,#8*2] - sbcs x9,x22,x9 - stp xzr,xzr,[sp,#8*4] - sbcs x10,x23,x10 - stp xzr,xzr,[sp,#8*6] - sbcs x11,x24,x11 - stp xzr,xzr,[sp,#8*8] - sbcs x12,x25,x12 - stp xzr,xzr,[sp,#8*10] - sbcs x13,x26,x13 - stp xzr,xzr,[sp,#8*12] - sbcs x28,x28,xzr // did it borrow? - stp xzr,xzr,[sp,#8*14] - - // x6-7 hold result-modulus - csel x6,x19,x6,lo - csel x7,x20,x7,lo - csel x8,x21,x8,lo - csel x9,x22,x9,lo - stp x6,x7,[x1,#8*0] - csel x10,x23,x10,lo - csel x11,x24,x11,lo - stp x8,x9,[x1,#8*2] - csel x12,x25,x12,lo - csel x13,x26,x13,lo - stp x10,x11,[x1,#8*4] - stp x12,x13,[x1,#8*6] - -Lsqr8x_done: - ldp x19,x20,[x29,#16] - mov sp,x29 - ldp x21,x22,[x29,#32] - mov x0,#1 - ldp x23,x24,[x29,#48] - ldp x25,x26,[x29,#64] - ldp x27,x28,[x29,#80] - ldr x29,[sp],#128 - // x30 is popped earlier - AARCH64_VALIDATE_LINK_REGISTER - ret - - -.align 5 -__bn_mul4x_mont: - // Not adding AARCH64_SIGN_LINK_REGISTER here because __bn_mul4x_mont is jumped to - // only from bn_mul_mont or __bn_mul8x_mont which have already signed the - // return address. - stp x29,x30,[sp,#-128]! - add x29,sp,#0 - stp x19,x20,[sp,#16] - stp x21,x22,[sp,#32] - stp x23,x24,[sp,#48] - stp x25,x26,[sp,#64] - stp x27,x28,[sp,#80] - - sub x26,sp,x5,lsl#3 - lsl x5,x5,#3 - ldr x4,[x4] // *n0 - sub sp,x26,#8*4 // alloca - - add x10,x2,x5 - add x27,x1,x5 - stp x0,x10,[x29,#96] // offload rp and &b[num] - - ldr x24,[x2,#8*0] // b[0] - ldp x6,x7,[x1,#8*0] // a[0..3] - ldp x8,x9,[x1,#8*2] - add x1,x1,#8*4 - mov x19,xzr - mov x20,xzr - mov x21,xzr - mov x22,xzr - ldp x14,x15,[x3,#8*0] // n[0..3] - ldp x16,x17,[x3,#8*2] - adds x3,x3,#8*4 // clear carry bit - mov x0,xzr - mov x28,#0 - mov x26,sp - -Loop_mul4x_1st_reduction: - mul x10,x6,x24 // lo(a[0..3]*b[0]) - adc x0,x0,xzr // modulo-scheduled - mul x11,x7,x24 - add x28,x28,#8 - mul x12,x8,x24 - and x28,x28,#31 - mul x13,x9,x24 - adds x19,x19,x10 - umulh x10,x6,x24 // hi(a[0..3]*b[0]) - adcs x20,x20,x11 - mul x25,x19,x4 // t[0]*n0 - adcs x21,x21,x12 - umulh x11,x7,x24 - adcs x22,x22,x13 - umulh x12,x8,x24 - adc x23,xzr,xzr - umulh x13,x9,x24 - ldr x24,[x2,x28] // next b[i] (or b[0]) - adds x20,x20,x10 - // (*) mul x10,x14,x25 // lo(n[0..3]*t[0]*n0) - str x25,[x26],#8 // put aside t[0]*n0 for tail processing - adcs x21,x21,x11 - mul x11,x15,x25 - adcs x22,x22,x12 - mul x12,x16,x25 - adc x23,x23,x13 // can't overflow - mul x13,x17,x25 - // (*) adds xzr,x19,x10 - subs xzr,x19,#1 // (*) - umulh x10,x14,x25 // hi(n[0..3]*t[0]*n0) - adcs x19,x20,x11 - umulh x11,x15,x25 - adcs x20,x21,x12 - umulh x12,x16,x25 - adcs x21,x22,x13 - umulh x13,x17,x25 - adcs x22,x23,x0 - adc x0,xzr,xzr - adds x19,x19,x10 - sub x10,x27,x1 - adcs x20,x20,x11 - adcs x21,x21,x12 - adcs x22,x22,x13 - //adc x0,x0,xzr - cbnz x28,Loop_mul4x_1st_reduction - - cbz x10,Lmul4x4_post_condition - - ldp x6,x7,[x1,#8*0] // a[4..7] - ldp x8,x9,[x1,#8*2] - add x1,x1,#8*4 - ldr x25,[sp] // a[0]*n0 - ldp x14,x15,[x3,#8*0] // n[4..7] - ldp x16,x17,[x3,#8*2] - add x3,x3,#8*4 - -Loop_mul4x_1st_tail: - mul x10,x6,x24 // lo(a[4..7]*b[i]) - adc x0,x0,xzr // modulo-scheduled - mul x11,x7,x24 - add x28,x28,#8 - mul x12,x8,x24 - and x28,x28,#31 - mul x13,x9,x24 - adds x19,x19,x10 - umulh x10,x6,x24 // hi(a[4..7]*b[i]) - adcs x20,x20,x11 - umulh x11,x7,x24 - adcs x21,x21,x12 - umulh x12,x8,x24 - adcs x22,x22,x13 - umulh x13,x9,x24 - adc x23,xzr,xzr - ldr x24,[x2,x28] // next b[i] (or b[0]) - adds x20,x20,x10 - mul x10,x14,x25 // lo(n[4..7]*a[0]*n0) - adcs x21,x21,x11 - mul x11,x15,x25 - adcs x22,x22,x12 - mul x12,x16,x25 - adc x23,x23,x13 // can't overflow - mul x13,x17,x25 - adds x19,x19,x10 - umulh x10,x14,x25 // hi(n[4..7]*a[0]*n0) - adcs x20,x20,x11 - umulh x11,x15,x25 - adcs x21,x21,x12 - umulh x12,x16,x25 - adcs x22,x22,x13 - adcs x23,x23,x0 - umulh x13,x17,x25 - adc x0,xzr,xzr - ldr x25,[sp,x28] // next t[0]*n0 - str x19,[x26],#8 // result!!! - adds x19,x20,x10 - sub x10,x27,x1 // done yet? - adcs x20,x21,x11 - adcs x21,x22,x12 - adcs x22,x23,x13 - //adc x0,x0,xzr - cbnz x28,Loop_mul4x_1st_tail - - sub x11,x27,x5 // rewinded x1 - cbz x10,Lmul4x_proceed - - ldp x6,x7,[x1,#8*0] - ldp x8,x9,[x1,#8*2] - add x1,x1,#8*4 - ldp x14,x15,[x3,#8*0] - ldp x16,x17,[x3,#8*2] - add x3,x3,#8*4 - b Loop_mul4x_1st_tail - -.align 5 -Lmul4x_proceed: - ldr x24,[x2,#8*4]! // *++b - adc x30,x0,xzr - ldp x6,x7,[x11,#8*0] // a[0..3] - sub x3,x3,x5 // rewind np - ldp x8,x9,[x11,#8*2] - add x1,x11,#8*4 - - stp x19,x20,[x26,#8*0] // result!!! - ldp x19,x20,[sp,#8*4] // t[0..3] - stp x21,x22,[x26,#8*2] // result!!! - ldp x21,x22,[sp,#8*6] - - ldp x14,x15,[x3,#8*0] // n[0..3] - mov x26,sp - ldp x16,x17,[x3,#8*2] - adds x3,x3,#8*4 // clear carry bit - mov x0,xzr - -.align 4 -Loop_mul4x_reduction: - mul x10,x6,x24 // lo(a[0..3]*b[4]) - adc x0,x0,xzr // modulo-scheduled - mul x11,x7,x24 - add x28,x28,#8 - mul x12,x8,x24 - and x28,x28,#31 - mul x13,x9,x24 - adds x19,x19,x10 - umulh x10,x6,x24 // hi(a[0..3]*b[4]) - adcs x20,x20,x11 - mul x25,x19,x4 // t[0]*n0 - adcs x21,x21,x12 - umulh x11,x7,x24 - adcs x22,x22,x13 - umulh x12,x8,x24 - adc x23,xzr,xzr - umulh x13,x9,x24 - ldr x24,[x2,x28] // next b[i] - adds x20,x20,x10 - // (*) mul x10,x14,x25 - str x25,[x26],#8 // put aside t[0]*n0 for tail processing - adcs x21,x21,x11 - mul x11,x15,x25 // lo(n[0..3]*t[0]*n0 - adcs x22,x22,x12 - mul x12,x16,x25 - adc x23,x23,x13 // can't overflow - mul x13,x17,x25 - // (*) adds xzr,x19,x10 - subs xzr,x19,#1 // (*) - umulh x10,x14,x25 // hi(n[0..3]*t[0]*n0 - adcs x19,x20,x11 - umulh x11,x15,x25 - adcs x20,x21,x12 - umulh x12,x16,x25 - adcs x21,x22,x13 - umulh x13,x17,x25 - adcs x22,x23,x0 - adc x0,xzr,xzr - adds x19,x19,x10 - adcs x20,x20,x11 - adcs x21,x21,x12 - adcs x22,x22,x13 - //adc x0,x0,xzr - cbnz x28,Loop_mul4x_reduction - - adc x0,x0,xzr - ldp x10,x11,[x26,#8*4] // t[4..7] - ldp x12,x13,[x26,#8*6] - ldp x6,x7,[x1,#8*0] // a[4..7] - ldp x8,x9,[x1,#8*2] - add x1,x1,#8*4 - adds x19,x19,x10 - adcs x20,x20,x11 - adcs x21,x21,x12 - adcs x22,x22,x13 - //adc x0,x0,xzr - - ldr x25,[sp] // t[0]*n0 - ldp x14,x15,[x3,#8*0] // n[4..7] - ldp x16,x17,[x3,#8*2] - add x3,x3,#8*4 - -.align 4 -Loop_mul4x_tail: - mul x10,x6,x24 // lo(a[4..7]*b[4]) - adc x0,x0,xzr // modulo-scheduled - mul x11,x7,x24 - add x28,x28,#8 - mul x12,x8,x24 - and x28,x28,#31 - mul x13,x9,x24 - adds x19,x19,x10 - umulh x10,x6,x24 // hi(a[4..7]*b[4]) - adcs x20,x20,x11 - umulh x11,x7,x24 - adcs x21,x21,x12 - umulh x12,x8,x24 - adcs x22,x22,x13 - umulh x13,x9,x24 - adc x23,xzr,xzr - ldr x24,[x2,x28] // next b[i] - adds x20,x20,x10 - mul x10,x14,x25 // lo(n[4..7]*t[0]*n0) - adcs x21,x21,x11 - mul x11,x15,x25 - adcs x22,x22,x12 - mul x12,x16,x25 - adc x23,x23,x13 // can't overflow - mul x13,x17,x25 - adds x19,x19,x10 - umulh x10,x14,x25 // hi(n[4..7]*t[0]*n0) - adcs x20,x20,x11 - umulh x11,x15,x25 - adcs x21,x21,x12 - umulh x12,x16,x25 - adcs x22,x22,x13 - umulh x13,x17,x25 - adcs x23,x23,x0 - ldr x25,[sp,x28] // next a[0]*n0 - adc x0,xzr,xzr - str x19,[x26],#8 // result!!! - adds x19,x20,x10 - sub x10,x27,x1 // done yet? - adcs x20,x21,x11 - adcs x21,x22,x12 - adcs x22,x23,x13 - //adc x0,x0,xzr - cbnz x28,Loop_mul4x_tail - - sub x11,x3,x5 // rewinded np? - adc x0,x0,xzr - cbz x10,Loop_mul4x_break - - ldp x10,x11,[x26,#8*4] - ldp x12,x13,[x26,#8*6] - ldp x6,x7,[x1,#8*0] - ldp x8,x9,[x1,#8*2] - add x1,x1,#8*4 - adds x19,x19,x10 - adcs x20,x20,x11 - adcs x21,x21,x12 - adcs x22,x22,x13 - //adc x0,x0,xzr - ldp x14,x15,[x3,#8*0] - ldp x16,x17,[x3,#8*2] - add x3,x3,#8*4 - b Loop_mul4x_tail - -.align 4 -Loop_mul4x_break: - ldp x12,x13,[x29,#96] // pull rp and &b[num] - adds x19,x19,x30 - add x2,x2,#8*4 // bp++ - adcs x20,x20,xzr - sub x1,x1,x5 // rewind ap - adcs x21,x21,xzr - stp x19,x20,[x26,#8*0] // result!!! - adcs x22,x22,xzr - ldp x19,x20,[sp,#8*4] // t[0..3] - adc x30,x0,xzr - stp x21,x22,[x26,#8*2] // result!!! - cmp x2,x13 // done yet? - ldp x21,x22,[sp,#8*6] - ldp x14,x15,[x11,#8*0] // n[0..3] - ldp x16,x17,[x11,#8*2] - add x3,x11,#8*4 - b.eq Lmul4x_post - - ldr x24,[x2] - ldp x6,x7,[x1,#8*0] // a[0..3] - ldp x8,x9,[x1,#8*2] - adds x1,x1,#8*4 // clear carry bit - mov x0,xzr - mov x26,sp - b Loop_mul4x_reduction - -.align 4 -Lmul4x_post: - // Final step. We see if result is larger than modulus, and - // if it is, subtract the modulus. But comparison implies - // subtraction. So we subtract modulus, see if it borrowed, - // and conditionally copy original value. - mov x0,x12 - mov x27,x12 // x0 copy - subs x10,x19,x14 - add x26,sp,#8*8 - sbcs x11,x20,x15 - sub x28,x5,#8*4 - -Lmul4x_sub: - sbcs x12,x21,x16 - ldp x14,x15,[x3,#8*0] - sub x28,x28,#8*4 - ldp x19,x20,[x26,#8*0] - sbcs x13,x22,x17 - ldp x16,x17,[x3,#8*2] - add x3,x3,#8*4 - ldp x21,x22,[x26,#8*2] - add x26,x26,#8*4 - stp x10,x11,[x0,#8*0] - sbcs x10,x19,x14 - stp x12,x13,[x0,#8*2] - add x0,x0,#8*4 - sbcs x11,x20,x15 - cbnz x28,Lmul4x_sub - - sbcs x12,x21,x16 - mov x26,sp - add x1,sp,#8*4 - ldp x6,x7,[x27,#8*0] - sbcs x13,x22,x17 - stp x10,x11,[x0,#8*0] - ldp x8,x9,[x27,#8*2] - stp x12,x13,[x0,#8*2] - ldp x19,x20,[x1,#8*0] - ldp x21,x22,[x1,#8*2] - sbcs xzr,x30,xzr // did it borrow? - ldr x30,[x29,#8] // pull return address - - sub x28,x5,#8*4 -Lmul4x_cond_copy: - sub x28,x28,#8*4 - csel x10,x19,x6,lo - stp xzr,xzr,[x26,#8*0] - csel x11,x20,x7,lo - ldp x6,x7,[x27,#8*4] - ldp x19,x20,[x1,#8*4] - csel x12,x21,x8,lo - stp xzr,xzr,[x26,#8*2] - add x26,x26,#8*4 - csel x13,x22,x9,lo - ldp x8,x9,[x27,#8*6] - ldp x21,x22,[x1,#8*6] - add x1,x1,#8*4 - stp x10,x11,[x27,#8*0] - stp x12,x13,[x27,#8*2] - add x27,x27,#8*4 - cbnz x28,Lmul4x_cond_copy - - csel x10,x19,x6,lo - stp xzr,xzr,[x26,#8*0] - csel x11,x20,x7,lo - stp xzr,xzr,[x26,#8*2] - csel x12,x21,x8,lo - stp xzr,xzr,[x26,#8*3] - csel x13,x22,x9,lo - stp xzr,xzr,[x26,#8*4] - stp x10,x11,[x27,#8*0] - stp x12,x13,[x27,#8*2] - - b Lmul4x_done - -.align 4 -Lmul4x4_post_condition: - adc x0,x0,xzr - ldr x1,[x29,#96] // pull rp - // x19-3,x0 hold result, x14-7 hold modulus - subs x6,x19,x14 - ldr x30,[x29,#8] // pull return address - sbcs x7,x20,x15 - stp xzr,xzr,[sp,#8*0] - sbcs x8,x21,x16 - stp xzr,xzr,[sp,#8*2] - sbcs x9,x22,x17 - stp xzr,xzr,[sp,#8*4] - sbcs xzr,x0,xzr // did it borrow? - stp xzr,xzr,[sp,#8*6] - - // x6-3 hold result-modulus - csel x6,x19,x6,lo - csel x7,x20,x7,lo - csel x8,x21,x8,lo - csel x9,x22,x9,lo - stp x6,x7,[x1,#8*0] - stp x8,x9,[x1,#8*2] - -Lmul4x_done: - ldp x19,x20,[x29,#16] - mov sp,x29 - ldp x21,x22,[x29,#32] - mov x0,#1 - ldp x23,x24,[x29,#48] - ldp x25,x26,[x29,#64] - ldp x27,x28,[x29,#80] - ldr x29,[sp],#128 - // x30 is popped earlier - AARCH64_VALIDATE_LINK_REGISTER - ret - -.byte 77,111,110,116,103,111,109,101,114,121,32,77,117,108,116,105,112,108,105,99,97,116,105,111,110,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 -.align 2 -.align 4 -#endif // !OPENSSL_NO_ASM diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/armv8-mont-linux64.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/armv8-mont-linux64.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/armv8-mont-linux64.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/armv8-mont-linux64.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,1433 +0,0 @@ -// This file is generated from a similarly-named Perl script in the BoringSSL -// source tree. Do not edit by hand. - -#if !defined(__has_feature) -#define __has_feature(x) 0 -#endif -#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) -#define OPENSSL_NO_ASM -#endif - -#if !defined(OPENSSL_NO_ASM) -#if defined(__aarch64__) -#include - -.text - -.globl GFp_bn_mul_mont -.hidden GFp_bn_mul_mont -.type GFp_bn_mul_mont,%function -.align 5 -GFp_bn_mul_mont: - AARCH64_SIGN_LINK_REGISTER - tst x5,#7 - b.eq __bn_sqr8x_mont - tst x5,#3 - b.eq __bn_mul4x_mont -.Lmul_mont: - stp x29,x30,[sp,#-64]! - add x29,sp,#0 - stp x19,x20,[sp,#16] - stp x21,x22,[sp,#32] - stp x23,x24,[sp,#48] - - ldr x9,[x2],#8 // bp[0] - sub x22,sp,x5,lsl#3 - ldp x7,x8,[x1],#16 // ap[0..1] - lsl x5,x5,#3 - ldr x4,[x4] // *n0 - and x22,x22,#-16 // ABI says so - ldp x13,x14,[x3],#16 // np[0..1] - - mul x6,x7,x9 // ap[0]*bp[0] - sub x21,x5,#16 // j=num-2 - umulh x7,x7,x9 - mul x10,x8,x9 // ap[1]*bp[0] - umulh x11,x8,x9 - - mul x15,x6,x4 // "tp[0]"*n0 - mov sp,x22 // alloca - - // (*) mul x12,x13,x15 // np[0]*m1 - umulh x13,x13,x15 - mul x16,x14,x15 // np[1]*m1 - // (*) adds x12,x12,x6 // discarded - // (*) As for removal of first multiplication and addition - // instructions. The outcome of first addition is - // guaranteed to be zero, which leaves two computationally - // significant outcomes: it either carries or not. Then - // question is when does it carry? Is there alternative - // way to deduce it? If you follow operations, you can - // observe that condition for carry is quite simple: - // x6 being non-zero. So that carry can be calculated - // by adding -1 to x6. That's what next instruction does. - subs xzr,x6,#1 // (*) - umulh x17,x14,x15 - adc x13,x13,xzr - cbz x21,.L1st_skip - -.L1st: - ldr x8,[x1],#8 - adds x6,x10,x7 - sub x21,x21,#8 // j-- - adc x7,x11,xzr - - ldr x14,[x3],#8 - adds x12,x16,x13 - mul x10,x8,x9 // ap[j]*bp[0] - adc x13,x17,xzr - umulh x11,x8,x9 - - adds x12,x12,x6 - mul x16,x14,x15 // np[j]*m1 - adc x13,x13,xzr - umulh x17,x14,x15 - str x12,[x22],#8 // tp[j-1] - cbnz x21,.L1st - -.L1st_skip: - adds x6,x10,x7 - sub x1,x1,x5 // rewind x1 - adc x7,x11,xzr - - adds x12,x16,x13 - sub x3,x3,x5 // rewind x3 - adc x13,x17,xzr - - adds x12,x12,x6 - sub x20,x5,#8 // i=num-1 - adcs x13,x13,x7 - - adc x19,xzr,xzr // upmost overflow bit - stp x12,x13,[x22] - -.Louter: - ldr x9,[x2],#8 // bp[i] - ldp x7,x8,[x1],#16 - ldr x23,[sp] // tp[0] - add x22,sp,#8 - - mul x6,x7,x9 // ap[0]*bp[i] - sub x21,x5,#16 // j=num-2 - umulh x7,x7,x9 - ldp x13,x14,[x3],#16 - mul x10,x8,x9 // ap[1]*bp[i] - adds x6,x6,x23 - umulh x11,x8,x9 - adc x7,x7,xzr - - mul x15,x6,x4 - sub x20,x20,#8 // i-- - - // (*) mul x12,x13,x15 // np[0]*m1 - umulh x13,x13,x15 - mul x16,x14,x15 // np[1]*m1 - // (*) adds x12,x12,x6 - subs xzr,x6,#1 // (*) - umulh x17,x14,x15 - cbz x21,.Linner_skip - -.Linner: - ldr x8,[x1],#8 - adc x13,x13,xzr - ldr x23,[x22],#8 // tp[j] - adds x6,x10,x7 - sub x21,x21,#8 // j-- - adc x7,x11,xzr - - adds x12,x16,x13 - ldr x14,[x3],#8 - adc x13,x17,xzr - - mul x10,x8,x9 // ap[j]*bp[i] - adds x6,x6,x23 - umulh x11,x8,x9 - adc x7,x7,xzr - - mul x16,x14,x15 // np[j]*m1 - adds x12,x12,x6 - umulh x17,x14,x15 - str x12,[x22,#-16] // tp[j-1] - cbnz x21,.Linner - -.Linner_skip: - ldr x23,[x22],#8 // tp[j] - adc x13,x13,xzr - adds x6,x10,x7 - sub x1,x1,x5 // rewind x1 - adc x7,x11,xzr - - adds x12,x16,x13 - sub x3,x3,x5 // rewind x3 - adcs x13,x17,x19 - adc x19,xzr,xzr - - adds x6,x6,x23 - adc x7,x7,xzr - - adds x12,x12,x6 - adcs x13,x13,x7 - adc x19,x19,xzr // upmost overflow bit - stp x12,x13,[x22,#-16] - - cbnz x20,.Louter - - // Final step. We see if result is larger than modulus, and - // if it is, subtract the modulus. But comparison implies - // subtraction. So we subtract modulus, see if it borrowed, - // and conditionally copy original value. - ldr x23,[sp] // tp[0] - add x22,sp,#8 - ldr x14,[x3],#8 // np[0] - subs x21,x5,#8 // j=num-1 and clear borrow - mov x1,x0 -.Lsub: - sbcs x8,x23,x14 // tp[j]-np[j] - ldr x23,[x22],#8 - sub x21,x21,#8 // j-- - ldr x14,[x3],#8 - str x8,[x1],#8 // rp[j]=tp[j]-np[j] - cbnz x21,.Lsub - - sbcs x8,x23,x14 - sbcs x19,x19,xzr // did it borrow? - str x8,[x1],#8 // rp[num-1] - - ldr x23,[sp] // tp[0] - add x22,sp,#8 - ldr x8,[x0],#8 // rp[0] - sub x5,x5,#8 // num-- - nop -.Lcond_copy: - sub x5,x5,#8 // num-- - csel x14,x23,x8,lo // did it borrow? - ldr x23,[x22],#8 - ldr x8,[x0],#8 - str xzr,[x22,#-16] // wipe tp - str x14,[x0,#-16] - cbnz x5,.Lcond_copy - - csel x14,x23,x8,lo - str xzr,[x22,#-8] // wipe tp - str x14,[x0,#-8] - - ldp x19,x20,[x29,#16] - mov sp,x29 - ldp x21,x22,[x29,#32] - mov x0,#1 - ldp x23,x24,[x29,#48] - ldr x29,[sp],#64 - AARCH64_VALIDATE_LINK_REGISTER - ret -.size GFp_bn_mul_mont,.-GFp_bn_mul_mont -.type __bn_sqr8x_mont,%function -.align 5 -__bn_sqr8x_mont: - // Not adding AARCH64_SIGN_LINK_REGISTER here because __bn_sqr8x_mont is jumped to - // only from bn_mul_mont which has already signed the return address. - cmp x1,x2 - b.ne __bn_mul4x_mont -.Lsqr8x_mont: - stp x29,x30,[sp,#-128]! - add x29,sp,#0 - stp x19,x20,[sp,#16] - stp x21,x22,[sp,#32] - stp x23,x24,[sp,#48] - stp x25,x26,[sp,#64] - stp x27,x28,[sp,#80] - stp x0,x3,[sp,#96] // offload rp and np - - ldp x6,x7,[x1,#8*0] - ldp x8,x9,[x1,#8*2] - ldp x10,x11,[x1,#8*4] - ldp x12,x13,[x1,#8*6] - - sub x2,sp,x5,lsl#4 - lsl x5,x5,#3 - ldr x4,[x4] // *n0 - mov sp,x2 // alloca - sub x27,x5,#8*8 - b .Lsqr8x_zero_start - -.Lsqr8x_zero: - sub x27,x27,#8*8 - stp xzr,xzr,[x2,#8*0] - stp xzr,xzr,[x2,#8*2] - stp xzr,xzr,[x2,#8*4] - stp xzr,xzr,[x2,#8*6] -.Lsqr8x_zero_start: - stp xzr,xzr,[x2,#8*8] - stp xzr,xzr,[x2,#8*10] - stp xzr,xzr,[x2,#8*12] - stp xzr,xzr,[x2,#8*14] - add x2,x2,#8*16 - cbnz x27,.Lsqr8x_zero - - add x3,x1,x5 - add x1,x1,#8*8 - mov x19,xzr - mov x20,xzr - mov x21,xzr - mov x22,xzr - mov x23,xzr - mov x24,xzr - mov x25,xzr - mov x26,xzr - mov x2,sp - str x4,[x29,#112] // offload n0 - - // Multiply everything but a[i]*a[i] -.align 4 -.Lsqr8x_outer_loop: - // a[1]a[0] (i) - // a[2]a[0] - // a[3]a[0] - // a[4]a[0] - // a[5]a[0] - // a[6]a[0] - // a[7]a[0] - // a[2]a[1] (ii) - // a[3]a[1] - // a[4]a[1] - // a[5]a[1] - // a[6]a[1] - // a[7]a[1] - // a[3]a[2] (iii) - // a[4]a[2] - // a[5]a[2] - // a[6]a[2] - // a[7]a[2] - // a[4]a[3] (iv) - // a[5]a[3] - // a[6]a[3] - // a[7]a[3] - // a[5]a[4] (v) - // a[6]a[4] - // a[7]a[4] - // a[6]a[5] (vi) - // a[7]a[5] - // a[7]a[6] (vii) - - mul x14,x7,x6 // lo(a[1..7]*a[0]) (i) - mul x15,x8,x6 - mul x16,x9,x6 - mul x17,x10,x6 - adds x20,x20,x14 // t[1]+lo(a[1]*a[0]) - mul x14,x11,x6 - adcs x21,x21,x15 - mul x15,x12,x6 - adcs x22,x22,x16 - mul x16,x13,x6 - adcs x23,x23,x17 - umulh x17,x7,x6 // hi(a[1..7]*a[0]) - adcs x24,x24,x14 - umulh x14,x8,x6 - adcs x25,x25,x15 - umulh x15,x9,x6 - adcs x26,x26,x16 - umulh x16,x10,x6 - stp x19,x20,[x2],#8*2 // t[0..1] - adc x19,xzr,xzr // t[8] - adds x21,x21,x17 // t[2]+lo(a[1]*a[0]) - umulh x17,x11,x6 - adcs x22,x22,x14 - umulh x14,x12,x6 - adcs x23,x23,x15 - umulh x15,x13,x6 - adcs x24,x24,x16 - mul x16,x8,x7 // lo(a[2..7]*a[1]) (ii) - adcs x25,x25,x17 - mul x17,x9,x7 - adcs x26,x26,x14 - mul x14,x10,x7 - adc x19,x19,x15 - - mul x15,x11,x7 - adds x22,x22,x16 - mul x16,x12,x7 - adcs x23,x23,x17 - mul x17,x13,x7 - adcs x24,x24,x14 - umulh x14,x8,x7 // hi(a[2..7]*a[1]) - adcs x25,x25,x15 - umulh x15,x9,x7 - adcs x26,x26,x16 - umulh x16,x10,x7 - adcs x19,x19,x17 - umulh x17,x11,x7 - stp x21,x22,[x2],#8*2 // t[2..3] - adc x20,xzr,xzr // t[9] - adds x23,x23,x14 - umulh x14,x12,x7 - adcs x24,x24,x15 - umulh x15,x13,x7 - adcs x25,x25,x16 - mul x16,x9,x8 // lo(a[3..7]*a[2]) (iii) - adcs x26,x26,x17 - mul x17,x10,x8 - adcs x19,x19,x14 - mul x14,x11,x8 - adc x20,x20,x15 - - mul x15,x12,x8 - adds x24,x24,x16 - mul x16,x13,x8 - adcs x25,x25,x17 - umulh x17,x9,x8 // hi(a[3..7]*a[2]) - adcs x26,x26,x14 - umulh x14,x10,x8 - adcs x19,x19,x15 - umulh x15,x11,x8 - adcs x20,x20,x16 - umulh x16,x12,x8 - stp x23,x24,[x2],#8*2 // t[4..5] - adc x21,xzr,xzr // t[10] - adds x25,x25,x17 - umulh x17,x13,x8 - adcs x26,x26,x14 - mul x14,x10,x9 // lo(a[4..7]*a[3]) (iv) - adcs x19,x19,x15 - mul x15,x11,x9 - adcs x20,x20,x16 - mul x16,x12,x9 - adc x21,x21,x17 - - mul x17,x13,x9 - adds x26,x26,x14 - umulh x14,x10,x9 // hi(a[4..7]*a[3]) - adcs x19,x19,x15 - umulh x15,x11,x9 - adcs x20,x20,x16 - umulh x16,x12,x9 - adcs x21,x21,x17 - umulh x17,x13,x9 - stp x25,x26,[x2],#8*2 // t[6..7] - adc x22,xzr,xzr // t[11] - adds x19,x19,x14 - mul x14,x11,x10 // lo(a[5..7]*a[4]) (v) - adcs x20,x20,x15 - mul x15,x12,x10 - adcs x21,x21,x16 - mul x16,x13,x10 - adc x22,x22,x17 - - umulh x17,x11,x10 // hi(a[5..7]*a[4]) - adds x20,x20,x14 - umulh x14,x12,x10 - adcs x21,x21,x15 - umulh x15,x13,x10 - adcs x22,x22,x16 - mul x16,x12,x11 // lo(a[6..7]*a[5]) (vi) - adc x23,xzr,xzr // t[12] - adds x21,x21,x17 - mul x17,x13,x11 - adcs x22,x22,x14 - umulh x14,x12,x11 // hi(a[6..7]*a[5]) - adc x23,x23,x15 - - umulh x15,x13,x11 - adds x22,x22,x16 - mul x16,x13,x12 // lo(a[7]*a[6]) (vii) - adcs x23,x23,x17 - umulh x17,x13,x12 // hi(a[7]*a[6]) - adc x24,xzr,xzr // t[13] - adds x23,x23,x14 - sub x27,x3,x1 // done yet? - adc x24,x24,x15 - - adds x24,x24,x16 - sub x14,x3,x5 // rewinded ap - adc x25,xzr,xzr // t[14] - add x25,x25,x17 - - cbz x27,.Lsqr8x_outer_break - - mov x4,x6 - ldp x6,x7,[x2,#8*0] - ldp x8,x9,[x2,#8*2] - ldp x10,x11,[x2,#8*4] - ldp x12,x13,[x2,#8*6] - adds x19,x19,x6 - adcs x20,x20,x7 - ldp x6,x7,[x1,#8*0] - adcs x21,x21,x8 - adcs x22,x22,x9 - ldp x8,x9,[x1,#8*2] - adcs x23,x23,x10 - adcs x24,x24,x11 - ldp x10,x11,[x1,#8*4] - adcs x25,x25,x12 - mov x0,x1 - adcs x26,xzr,x13 - ldp x12,x13,[x1,#8*6] - add x1,x1,#8*8 - //adc x28,xzr,xzr // moved below - mov x27,#-8*8 - - // a[8]a[0] - // a[9]a[0] - // a[a]a[0] - // a[b]a[0] - // a[c]a[0] - // a[d]a[0] - // a[e]a[0] - // a[f]a[0] - // a[8]a[1] - // a[f]a[1]........................ - // a[8]a[2] - // a[f]a[2]........................ - // a[8]a[3] - // a[f]a[3]........................ - // a[8]a[4] - // a[f]a[4]........................ - // a[8]a[5] - // a[f]a[5]........................ - // a[8]a[6] - // a[f]a[6]........................ - // a[8]a[7] - // a[f]a[7]........................ -.Lsqr8x_mul: - mul x14,x6,x4 - adc x28,xzr,xzr // carry bit, modulo-scheduled - mul x15,x7,x4 - add x27,x27,#8 - mul x16,x8,x4 - mul x17,x9,x4 - adds x19,x19,x14 - mul x14,x10,x4 - adcs x20,x20,x15 - mul x15,x11,x4 - adcs x21,x21,x16 - mul x16,x12,x4 - adcs x22,x22,x17 - mul x17,x13,x4 - adcs x23,x23,x14 - umulh x14,x6,x4 - adcs x24,x24,x15 - umulh x15,x7,x4 - adcs x25,x25,x16 - umulh x16,x8,x4 - adcs x26,x26,x17 - umulh x17,x9,x4 - adc x28,x28,xzr - str x19,[x2],#8 - adds x19,x20,x14 - umulh x14,x10,x4 - adcs x20,x21,x15 - umulh x15,x11,x4 - adcs x21,x22,x16 - umulh x16,x12,x4 - adcs x22,x23,x17 - umulh x17,x13,x4 - ldr x4,[x0,x27] - adcs x23,x24,x14 - adcs x24,x25,x15 - adcs x25,x26,x16 - adcs x26,x28,x17 - //adc x28,xzr,xzr // moved above - cbnz x27,.Lsqr8x_mul - // note that carry flag is guaranteed - // to be zero at this point - cmp x1,x3 // done yet? - b.eq .Lsqr8x_break - - ldp x6,x7,[x2,#8*0] - ldp x8,x9,[x2,#8*2] - ldp x10,x11,[x2,#8*4] - ldp x12,x13,[x2,#8*6] - adds x19,x19,x6 - ldr x4,[x0,#-8*8] - adcs x20,x20,x7 - ldp x6,x7,[x1,#8*0] - adcs x21,x21,x8 - adcs x22,x22,x9 - ldp x8,x9,[x1,#8*2] - adcs x23,x23,x10 - adcs x24,x24,x11 - ldp x10,x11,[x1,#8*4] - adcs x25,x25,x12 - mov x27,#-8*8 - adcs x26,x26,x13 - ldp x12,x13,[x1,#8*6] - add x1,x1,#8*8 - //adc x28,xzr,xzr // moved above - b .Lsqr8x_mul - -.align 4 -.Lsqr8x_break: - ldp x6,x7,[x0,#8*0] - add x1,x0,#8*8 - ldp x8,x9,[x0,#8*2] - sub x14,x3,x1 // is it last iteration? - ldp x10,x11,[x0,#8*4] - sub x15,x2,x14 - ldp x12,x13,[x0,#8*6] - cbz x14,.Lsqr8x_outer_loop - - stp x19,x20,[x2,#8*0] - ldp x19,x20,[x15,#8*0] - stp x21,x22,[x2,#8*2] - ldp x21,x22,[x15,#8*2] - stp x23,x24,[x2,#8*4] - ldp x23,x24,[x15,#8*4] - stp x25,x26,[x2,#8*6] - mov x2,x15 - ldp x25,x26,[x15,#8*6] - b .Lsqr8x_outer_loop - -.align 4 -.Lsqr8x_outer_break: - // Now multiply above result by 2 and add a[n-1]*a[n-1]|...|a[0]*a[0] - ldp x7,x9,[x14,#8*0] // recall that x14 is &a[0] - ldp x15,x16,[sp,#8*1] - ldp x11,x13,[x14,#8*2] - add x1,x14,#8*4 - ldp x17,x14,[sp,#8*3] - - stp x19,x20,[x2,#8*0] - mul x19,x7,x7 - stp x21,x22,[x2,#8*2] - umulh x7,x7,x7 - stp x23,x24,[x2,#8*4] - mul x8,x9,x9 - stp x25,x26,[x2,#8*6] - mov x2,sp - umulh x9,x9,x9 - adds x20,x7,x15,lsl#1 - extr x15,x16,x15,#63 - sub x27,x5,#8*4 - -.Lsqr4x_shift_n_add: - adcs x21,x8,x15 - extr x16,x17,x16,#63 - sub x27,x27,#8*4 - adcs x22,x9,x16 - ldp x15,x16,[x2,#8*5] - mul x10,x11,x11 - ldp x7,x9,[x1],#8*2 - umulh x11,x11,x11 - mul x12,x13,x13 - umulh x13,x13,x13 - extr x17,x14,x17,#63 - stp x19,x20,[x2,#8*0] - adcs x23,x10,x17 - extr x14,x15,x14,#63 - stp x21,x22,[x2,#8*2] - adcs x24,x11,x14 - ldp x17,x14,[x2,#8*7] - extr x15,x16,x15,#63 - adcs x25,x12,x15 - extr x16,x17,x16,#63 - adcs x26,x13,x16 - ldp x15,x16,[x2,#8*9] - mul x6,x7,x7 - ldp x11,x13,[x1],#8*2 - umulh x7,x7,x7 - mul x8,x9,x9 - umulh x9,x9,x9 - stp x23,x24,[x2,#8*4] - extr x17,x14,x17,#63 - stp x25,x26,[x2,#8*6] - add x2,x2,#8*8 - adcs x19,x6,x17 - extr x14,x15,x14,#63 - adcs x20,x7,x14 - ldp x17,x14,[x2,#8*3] - extr x15,x16,x15,#63 - cbnz x27,.Lsqr4x_shift_n_add - ldp x1,x4,[x29,#104] // pull np and n0 - - adcs x21,x8,x15 - extr x16,x17,x16,#63 - adcs x22,x9,x16 - ldp x15,x16,[x2,#8*5] - mul x10,x11,x11 - umulh x11,x11,x11 - stp x19,x20,[x2,#8*0] - mul x12,x13,x13 - umulh x13,x13,x13 - stp x21,x22,[x2,#8*2] - extr x17,x14,x17,#63 - adcs x23,x10,x17 - extr x14,x15,x14,#63 - ldp x19,x20,[sp,#8*0] - adcs x24,x11,x14 - extr x15,x16,x15,#63 - ldp x6,x7,[x1,#8*0] - adcs x25,x12,x15 - extr x16,xzr,x16,#63 - ldp x8,x9,[x1,#8*2] - adc x26,x13,x16 - ldp x10,x11,[x1,#8*4] - - // Reduce by 512 bits per iteration - mul x28,x4,x19 // t[0]*n0 - ldp x12,x13,[x1,#8*6] - add x3,x1,x5 - ldp x21,x22,[sp,#8*2] - stp x23,x24,[x2,#8*4] - ldp x23,x24,[sp,#8*4] - stp x25,x26,[x2,#8*6] - ldp x25,x26,[sp,#8*6] - add x1,x1,#8*8 - mov x30,xzr // initial top-most carry - mov x2,sp - mov x27,#8 - -.Lsqr8x_reduction: - // (*) mul x14,x6,x28 // lo(n[0-7])*lo(t[0]*n0) - mul x15,x7,x28 - sub x27,x27,#1 - mul x16,x8,x28 - str x28,[x2],#8 // put aside t[0]*n0 for tail processing - mul x17,x9,x28 - // (*) adds xzr,x19,x14 - subs xzr,x19,#1 // (*) - mul x14,x10,x28 - adcs x19,x20,x15 - mul x15,x11,x28 - adcs x20,x21,x16 - mul x16,x12,x28 - adcs x21,x22,x17 - mul x17,x13,x28 - adcs x22,x23,x14 - umulh x14,x6,x28 // hi(n[0-7])*lo(t[0]*n0) - adcs x23,x24,x15 - umulh x15,x7,x28 - adcs x24,x25,x16 - umulh x16,x8,x28 - adcs x25,x26,x17 - umulh x17,x9,x28 - adc x26,xzr,xzr - adds x19,x19,x14 - umulh x14,x10,x28 - adcs x20,x20,x15 - umulh x15,x11,x28 - adcs x21,x21,x16 - umulh x16,x12,x28 - adcs x22,x22,x17 - umulh x17,x13,x28 - mul x28,x4,x19 // next t[0]*n0 - adcs x23,x23,x14 - adcs x24,x24,x15 - adcs x25,x25,x16 - adc x26,x26,x17 - cbnz x27,.Lsqr8x_reduction - - ldp x14,x15,[x2,#8*0] - ldp x16,x17,[x2,#8*2] - mov x0,x2 - sub x27,x3,x1 // done yet? - adds x19,x19,x14 - adcs x20,x20,x15 - ldp x14,x15,[x2,#8*4] - adcs x21,x21,x16 - adcs x22,x22,x17 - ldp x16,x17,[x2,#8*6] - adcs x23,x23,x14 - adcs x24,x24,x15 - adcs x25,x25,x16 - adcs x26,x26,x17 - //adc x28,xzr,xzr // moved below - cbz x27,.Lsqr8x8_post_condition - - ldr x4,[x2,#-8*8] - ldp x6,x7,[x1,#8*0] - ldp x8,x9,[x1,#8*2] - ldp x10,x11,[x1,#8*4] - mov x27,#-8*8 - ldp x12,x13,[x1,#8*6] - add x1,x1,#8*8 - -.Lsqr8x_tail: - mul x14,x6,x4 - adc x28,xzr,xzr // carry bit, modulo-scheduled - mul x15,x7,x4 - add x27,x27,#8 - mul x16,x8,x4 - mul x17,x9,x4 - adds x19,x19,x14 - mul x14,x10,x4 - adcs x20,x20,x15 - mul x15,x11,x4 - adcs x21,x21,x16 - mul x16,x12,x4 - adcs x22,x22,x17 - mul x17,x13,x4 - adcs x23,x23,x14 - umulh x14,x6,x4 - adcs x24,x24,x15 - umulh x15,x7,x4 - adcs x25,x25,x16 - umulh x16,x8,x4 - adcs x26,x26,x17 - umulh x17,x9,x4 - adc x28,x28,xzr - str x19,[x2],#8 - adds x19,x20,x14 - umulh x14,x10,x4 - adcs x20,x21,x15 - umulh x15,x11,x4 - adcs x21,x22,x16 - umulh x16,x12,x4 - adcs x22,x23,x17 - umulh x17,x13,x4 - ldr x4,[x0,x27] - adcs x23,x24,x14 - adcs x24,x25,x15 - adcs x25,x26,x16 - adcs x26,x28,x17 - //adc x28,xzr,xzr // moved above - cbnz x27,.Lsqr8x_tail - // note that carry flag is guaranteed - // to be zero at this point - ldp x6,x7,[x2,#8*0] - sub x27,x3,x1 // done yet? - sub x16,x3,x5 // rewinded np - ldp x8,x9,[x2,#8*2] - ldp x10,x11,[x2,#8*4] - ldp x12,x13,[x2,#8*6] - cbz x27,.Lsqr8x_tail_break - - ldr x4,[x0,#-8*8] - adds x19,x19,x6 - adcs x20,x20,x7 - ldp x6,x7,[x1,#8*0] - adcs x21,x21,x8 - adcs x22,x22,x9 - ldp x8,x9,[x1,#8*2] - adcs x23,x23,x10 - adcs x24,x24,x11 - ldp x10,x11,[x1,#8*4] - adcs x25,x25,x12 - mov x27,#-8*8 - adcs x26,x26,x13 - ldp x12,x13,[x1,#8*6] - add x1,x1,#8*8 - //adc x28,xzr,xzr // moved above - b .Lsqr8x_tail - -.align 4 -.Lsqr8x_tail_break: - ldr x4,[x29,#112] // pull n0 - add x27,x2,#8*8 // end of current t[num] window - - subs xzr,x30,#1 // "move" top-most carry to carry bit - adcs x14,x19,x6 - adcs x15,x20,x7 - ldp x19,x20,[x0,#8*0] - adcs x21,x21,x8 - ldp x6,x7,[x16,#8*0] // recall that x16 is &n[0] - adcs x22,x22,x9 - ldp x8,x9,[x16,#8*2] - adcs x23,x23,x10 - adcs x24,x24,x11 - ldp x10,x11,[x16,#8*4] - adcs x25,x25,x12 - adcs x26,x26,x13 - ldp x12,x13,[x16,#8*6] - add x1,x16,#8*8 - adc x30,xzr,xzr // top-most carry - mul x28,x4,x19 - stp x14,x15,[x2,#8*0] - stp x21,x22,[x2,#8*2] - ldp x21,x22,[x0,#8*2] - stp x23,x24,[x2,#8*4] - ldp x23,x24,[x0,#8*4] - cmp x27,x29 // did we hit the bottom? - stp x25,x26,[x2,#8*6] - mov x2,x0 // slide the window - ldp x25,x26,[x0,#8*6] - mov x27,#8 - b.ne .Lsqr8x_reduction - - // Final step. We see if result is larger than modulus, and - // if it is, subtract the modulus. But comparison implies - // subtraction. So we subtract modulus, see if it borrowed, - // and conditionally copy original value. - ldr x0,[x29,#96] // pull rp - add x2,x2,#8*8 - subs x14,x19,x6 - sbcs x15,x20,x7 - sub x27,x5,#8*8 - mov x3,x0 // x0 copy - -.Lsqr8x_sub: - sbcs x16,x21,x8 - ldp x6,x7,[x1,#8*0] - sbcs x17,x22,x9 - stp x14,x15,[x0,#8*0] - sbcs x14,x23,x10 - ldp x8,x9,[x1,#8*2] - sbcs x15,x24,x11 - stp x16,x17,[x0,#8*2] - sbcs x16,x25,x12 - ldp x10,x11,[x1,#8*4] - sbcs x17,x26,x13 - ldp x12,x13,[x1,#8*6] - add x1,x1,#8*8 - ldp x19,x20,[x2,#8*0] - sub x27,x27,#8*8 - ldp x21,x22,[x2,#8*2] - ldp x23,x24,[x2,#8*4] - ldp x25,x26,[x2,#8*6] - add x2,x2,#8*8 - stp x14,x15,[x0,#8*4] - sbcs x14,x19,x6 - stp x16,x17,[x0,#8*6] - add x0,x0,#8*8 - sbcs x15,x20,x7 - cbnz x27,.Lsqr8x_sub - - sbcs x16,x21,x8 - mov x2,sp - add x1,sp,x5 - ldp x6,x7,[x3,#8*0] - sbcs x17,x22,x9 - stp x14,x15,[x0,#8*0] - sbcs x14,x23,x10 - ldp x8,x9,[x3,#8*2] - sbcs x15,x24,x11 - stp x16,x17,[x0,#8*2] - sbcs x16,x25,x12 - ldp x19,x20,[x1,#8*0] - sbcs x17,x26,x13 - ldp x21,x22,[x1,#8*2] - sbcs xzr,x30,xzr // did it borrow? - ldr x30,[x29,#8] // pull return address - stp x14,x15,[x0,#8*4] - stp x16,x17,[x0,#8*6] - - sub x27,x5,#8*4 -.Lsqr4x_cond_copy: - sub x27,x27,#8*4 - csel x14,x19,x6,lo - stp xzr,xzr,[x2,#8*0] - csel x15,x20,x7,lo - ldp x6,x7,[x3,#8*4] - ldp x19,x20,[x1,#8*4] - csel x16,x21,x8,lo - stp xzr,xzr,[x2,#8*2] - add x2,x2,#8*4 - csel x17,x22,x9,lo - ldp x8,x9,[x3,#8*6] - ldp x21,x22,[x1,#8*6] - add x1,x1,#8*4 - stp x14,x15,[x3,#8*0] - stp x16,x17,[x3,#8*2] - add x3,x3,#8*4 - stp xzr,xzr,[x1,#8*0] - stp xzr,xzr,[x1,#8*2] - cbnz x27,.Lsqr4x_cond_copy - - csel x14,x19,x6,lo - stp xzr,xzr,[x2,#8*0] - csel x15,x20,x7,lo - stp xzr,xzr,[x2,#8*2] - csel x16,x21,x8,lo - csel x17,x22,x9,lo - stp x14,x15,[x3,#8*0] - stp x16,x17,[x3,#8*2] - - b .Lsqr8x_done - -.align 4 -.Lsqr8x8_post_condition: - adc x28,xzr,xzr - ldr x30,[x29,#8] // pull return address - // x19-7,x28 hold result, x6-7 hold modulus - subs x6,x19,x6 - ldr x1,[x29,#96] // pull rp - sbcs x7,x20,x7 - stp xzr,xzr,[sp,#8*0] - sbcs x8,x21,x8 - stp xzr,xzr,[sp,#8*2] - sbcs x9,x22,x9 - stp xzr,xzr,[sp,#8*4] - sbcs x10,x23,x10 - stp xzr,xzr,[sp,#8*6] - sbcs x11,x24,x11 - stp xzr,xzr,[sp,#8*8] - sbcs x12,x25,x12 - stp xzr,xzr,[sp,#8*10] - sbcs x13,x26,x13 - stp xzr,xzr,[sp,#8*12] - sbcs x28,x28,xzr // did it borrow? - stp xzr,xzr,[sp,#8*14] - - // x6-7 hold result-modulus - csel x6,x19,x6,lo - csel x7,x20,x7,lo - csel x8,x21,x8,lo - csel x9,x22,x9,lo - stp x6,x7,[x1,#8*0] - csel x10,x23,x10,lo - csel x11,x24,x11,lo - stp x8,x9,[x1,#8*2] - csel x12,x25,x12,lo - csel x13,x26,x13,lo - stp x10,x11,[x1,#8*4] - stp x12,x13,[x1,#8*6] - -.Lsqr8x_done: - ldp x19,x20,[x29,#16] - mov sp,x29 - ldp x21,x22,[x29,#32] - mov x0,#1 - ldp x23,x24,[x29,#48] - ldp x25,x26,[x29,#64] - ldp x27,x28,[x29,#80] - ldr x29,[sp],#128 - // x30 is popped earlier - AARCH64_VALIDATE_LINK_REGISTER - ret -.size __bn_sqr8x_mont,.-__bn_sqr8x_mont -.type __bn_mul4x_mont,%function -.align 5 -__bn_mul4x_mont: - // Not adding AARCH64_SIGN_LINK_REGISTER here because __bn_mul4x_mont is jumped to - // only from bn_mul_mont or __bn_mul8x_mont which have already signed the - // return address. - stp x29,x30,[sp,#-128]! - add x29,sp,#0 - stp x19,x20,[sp,#16] - stp x21,x22,[sp,#32] - stp x23,x24,[sp,#48] - stp x25,x26,[sp,#64] - stp x27,x28,[sp,#80] - - sub x26,sp,x5,lsl#3 - lsl x5,x5,#3 - ldr x4,[x4] // *n0 - sub sp,x26,#8*4 // alloca - - add x10,x2,x5 - add x27,x1,x5 - stp x0,x10,[x29,#96] // offload rp and &b[num] - - ldr x24,[x2,#8*0] // b[0] - ldp x6,x7,[x1,#8*0] // a[0..3] - ldp x8,x9,[x1,#8*2] - add x1,x1,#8*4 - mov x19,xzr - mov x20,xzr - mov x21,xzr - mov x22,xzr - ldp x14,x15,[x3,#8*0] // n[0..3] - ldp x16,x17,[x3,#8*2] - adds x3,x3,#8*4 // clear carry bit - mov x0,xzr - mov x28,#0 - mov x26,sp - -.Loop_mul4x_1st_reduction: - mul x10,x6,x24 // lo(a[0..3]*b[0]) - adc x0,x0,xzr // modulo-scheduled - mul x11,x7,x24 - add x28,x28,#8 - mul x12,x8,x24 - and x28,x28,#31 - mul x13,x9,x24 - adds x19,x19,x10 - umulh x10,x6,x24 // hi(a[0..3]*b[0]) - adcs x20,x20,x11 - mul x25,x19,x4 // t[0]*n0 - adcs x21,x21,x12 - umulh x11,x7,x24 - adcs x22,x22,x13 - umulh x12,x8,x24 - adc x23,xzr,xzr - umulh x13,x9,x24 - ldr x24,[x2,x28] // next b[i] (or b[0]) - adds x20,x20,x10 - // (*) mul x10,x14,x25 // lo(n[0..3]*t[0]*n0) - str x25,[x26],#8 // put aside t[0]*n0 for tail processing - adcs x21,x21,x11 - mul x11,x15,x25 - adcs x22,x22,x12 - mul x12,x16,x25 - adc x23,x23,x13 // can't overflow - mul x13,x17,x25 - // (*) adds xzr,x19,x10 - subs xzr,x19,#1 // (*) - umulh x10,x14,x25 // hi(n[0..3]*t[0]*n0) - adcs x19,x20,x11 - umulh x11,x15,x25 - adcs x20,x21,x12 - umulh x12,x16,x25 - adcs x21,x22,x13 - umulh x13,x17,x25 - adcs x22,x23,x0 - adc x0,xzr,xzr - adds x19,x19,x10 - sub x10,x27,x1 - adcs x20,x20,x11 - adcs x21,x21,x12 - adcs x22,x22,x13 - //adc x0,x0,xzr - cbnz x28,.Loop_mul4x_1st_reduction - - cbz x10,.Lmul4x4_post_condition - - ldp x6,x7,[x1,#8*0] // a[4..7] - ldp x8,x9,[x1,#8*2] - add x1,x1,#8*4 - ldr x25,[sp] // a[0]*n0 - ldp x14,x15,[x3,#8*0] // n[4..7] - ldp x16,x17,[x3,#8*2] - add x3,x3,#8*4 - -.Loop_mul4x_1st_tail: - mul x10,x6,x24 // lo(a[4..7]*b[i]) - adc x0,x0,xzr // modulo-scheduled - mul x11,x7,x24 - add x28,x28,#8 - mul x12,x8,x24 - and x28,x28,#31 - mul x13,x9,x24 - adds x19,x19,x10 - umulh x10,x6,x24 // hi(a[4..7]*b[i]) - adcs x20,x20,x11 - umulh x11,x7,x24 - adcs x21,x21,x12 - umulh x12,x8,x24 - adcs x22,x22,x13 - umulh x13,x9,x24 - adc x23,xzr,xzr - ldr x24,[x2,x28] // next b[i] (or b[0]) - adds x20,x20,x10 - mul x10,x14,x25 // lo(n[4..7]*a[0]*n0) - adcs x21,x21,x11 - mul x11,x15,x25 - adcs x22,x22,x12 - mul x12,x16,x25 - adc x23,x23,x13 // can't overflow - mul x13,x17,x25 - adds x19,x19,x10 - umulh x10,x14,x25 // hi(n[4..7]*a[0]*n0) - adcs x20,x20,x11 - umulh x11,x15,x25 - adcs x21,x21,x12 - umulh x12,x16,x25 - adcs x22,x22,x13 - adcs x23,x23,x0 - umulh x13,x17,x25 - adc x0,xzr,xzr - ldr x25,[sp,x28] // next t[0]*n0 - str x19,[x26],#8 // result!!! - adds x19,x20,x10 - sub x10,x27,x1 // done yet? - adcs x20,x21,x11 - adcs x21,x22,x12 - adcs x22,x23,x13 - //adc x0,x0,xzr - cbnz x28,.Loop_mul4x_1st_tail - - sub x11,x27,x5 // rewinded x1 - cbz x10,.Lmul4x_proceed - - ldp x6,x7,[x1,#8*0] - ldp x8,x9,[x1,#8*2] - add x1,x1,#8*4 - ldp x14,x15,[x3,#8*0] - ldp x16,x17,[x3,#8*2] - add x3,x3,#8*4 - b .Loop_mul4x_1st_tail - -.align 5 -.Lmul4x_proceed: - ldr x24,[x2,#8*4]! // *++b - adc x30,x0,xzr - ldp x6,x7,[x11,#8*0] // a[0..3] - sub x3,x3,x5 // rewind np - ldp x8,x9,[x11,#8*2] - add x1,x11,#8*4 - - stp x19,x20,[x26,#8*0] // result!!! - ldp x19,x20,[sp,#8*4] // t[0..3] - stp x21,x22,[x26,#8*2] // result!!! - ldp x21,x22,[sp,#8*6] - - ldp x14,x15,[x3,#8*0] // n[0..3] - mov x26,sp - ldp x16,x17,[x3,#8*2] - adds x3,x3,#8*4 // clear carry bit - mov x0,xzr - -.align 4 -.Loop_mul4x_reduction: - mul x10,x6,x24 // lo(a[0..3]*b[4]) - adc x0,x0,xzr // modulo-scheduled - mul x11,x7,x24 - add x28,x28,#8 - mul x12,x8,x24 - and x28,x28,#31 - mul x13,x9,x24 - adds x19,x19,x10 - umulh x10,x6,x24 // hi(a[0..3]*b[4]) - adcs x20,x20,x11 - mul x25,x19,x4 // t[0]*n0 - adcs x21,x21,x12 - umulh x11,x7,x24 - adcs x22,x22,x13 - umulh x12,x8,x24 - adc x23,xzr,xzr - umulh x13,x9,x24 - ldr x24,[x2,x28] // next b[i] - adds x20,x20,x10 - // (*) mul x10,x14,x25 - str x25,[x26],#8 // put aside t[0]*n0 for tail processing - adcs x21,x21,x11 - mul x11,x15,x25 // lo(n[0..3]*t[0]*n0 - adcs x22,x22,x12 - mul x12,x16,x25 - adc x23,x23,x13 // can't overflow - mul x13,x17,x25 - // (*) adds xzr,x19,x10 - subs xzr,x19,#1 // (*) - umulh x10,x14,x25 // hi(n[0..3]*t[0]*n0 - adcs x19,x20,x11 - umulh x11,x15,x25 - adcs x20,x21,x12 - umulh x12,x16,x25 - adcs x21,x22,x13 - umulh x13,x17,x25 - adcs x22,x23,x0 - adc x0,xzr,xzr - adds x19,x19,x10 - adcs x20,x20,x11 - adcs x21,x21,x12 - adcs x22,x22,x13 - //adc x0,x0,xzr - cbnz x28,.Loop_mul4x_reduction - - adc x0,x0,xzr - ldp x10,x11,[x26,#8*4] // t[4..7] - ldp x12,x13,[x26,#8*6] - ldp x6,x7,[x1,#8*0] // a[4..7] - ldp x8,x9,[x1,#8*2] - add x1,x1,#8*4 - adds x19,x19,x10 - adcs x20,x20,x11 - adcs x21,x21,x12 - adcs x22,x22,x13 - //adc x0,x0,xzr - - ldr x25,[sp] // t[0]*n0 - ldp x14,x15,[x3,#8*0] // n[4..7] - ldp x16,x17,[x3,#8*2] - add x3,x3,#8*4 - -.align 4 -.Loop_mul4x_tail: - mul x10,x6,x24 // lo(a[4..7]*b[4]) - adc x0,x0,xzr // modulo-scheduled - mul x11,x7,x24 - add x28,x28,#8 - mul x12,x8,x24 - and x28,x28,#31 - mul x13,x9,x24 - adds x19,x19,x10 - umulh x10,x6,x24 // hi(a[4..7]*b[4]) - adcs x20,x20,x11 - umulh x11,x7,x24 - adcs x21,x21,x12 - umulh x12,x8,x24 - adcs x22,x22,x13 - umulh x13,x9,x24 - adc x23,xzr,xzr - ldr x24,[x2,x28] // next b[i] - adds x20,x20,x10 - mul x10,x14,x25 // lo(n[4..7]*t[0]*n0) - adcs x21,x21,x11 - mul x11,x15,x25 - adcs x22,x22,x12 - mul x12,x16,x25 - adc x23,x23,x13 // can't overflow - mul x13,x17,x25 - adds x19,x19,x10 - umulh x10,x14,x25 // hi(n[4..7]*t[0]*n0) - adcs x20,x20,x11 - umulh x11,x15,x25 - adcs x21,x21,x12 - umulh x12,x16,x25 - adcs x22,x22,x13 - umulh x13,x17,x25 - adcs x23,x23,x0 - ldr x25,[sp,x28] // next a[0]*n0 - adc x0,xzr,xzr - str x19,[x26],#8 // result!!! - adds x19,x20,x10 - sub x10,x27,x1 // done yet? - adcs x20,x21,x11 - adcs x21,x22,x12 - adcs x22,x23,x13 - //adc x0,x0,xzr - cbnz x28,.Loop_mul4x_tail - - sub x11,x3,x5 // rewinded np? - adc x0,x0,xzr - cbz x10,.Loop_mul4x_break - - ldp x10,x11,[x26,#8*4] - ldp x12,x13,[x26,#8*6] - ldp x6,x7,[x1,#8*0] - ldp x8,x9,[x1,#8*2] - add x1,x1,#8*4 - adds x19,x19,x10 - adcs x20,x20,x11 - adcs x21,x21,x12 - adcs x22,x22,x13 - //adc x0,x0,xzr - ldp x14,x15,[x3,#8*0] - ldp x16,x17,[x3,#8*2] - add x3,x3,#8*4 - b .Loop_mul4x_tail - -.align 4 -.Loop_mul4x_break: - ldp x12,x13,[x29,#96] // pull rp and &b[num] - adds x19,x19,x30 - add x2,x2,#8*4 // bp++ - adcs x20,x20,xzr - sub x1,x1,x5 // rewind ap - adcs x21,x21,xzr - stp x19,x20,[x26,#8*0] // result!!! - adcs x22,x22,xzr - ldp x19,x20,[sp,#8*4] // t[0..3] - adc x30,x0,xzr - stp x21,x22,[x26,#8*2] // result!!! - cmp x2,x13 // done yet? - ldp x21,x22,[sp,#8*6] - ldp x14,x15,[x11,#8*0] // n[0..3] - ldp x16,x17,[x11,#8*2] - add x3,x11,#8*4 - b.eq .Lmul4x_post - - ldr x24,[x2] - ldp x6,x7,[x1,#8*0] // a[0..3] - ldp x8,x9,[x1,#8*2] - adds x1,x1,#8*4 // clear carry bit - mov x0,xzr - mov x26,sp - b .Loop_mul4x_reduction - -.align 4 -.Lmul4x_post: - // Final step. We see if result is larger than modulus, and - // if it is, subtract the modulus. But comparison implies - // subtraction. So we subtract modulus, see if it borrowed, - // and conditionally copy original value. - mov x0,x12 - mov x27,x12 // x0 copy - subs x10,x19,x14 - add x26,sp,#8*8 - sbcs x11,x20,x15 - sub x28,x5,#8*4 - -.Lmul4x_sub: - sbcs x12,x21,x16 - ldp x14,x15,[x3,#8*0] - sub x28,x28,#8*4 - ldp x19,x20,[x26,#8*0] - sbcs x13,x22,x17 - ldp x16,x17,[x3,#8*2] - add x3,x3,#8*4 - ldp x21,x22,[x26,#8*2] - add x26,x26,#8*4 - stp x10,x11,[x0,#8*0] - sbcs x10,x19,x14 - stp x12,x13,[x0,#8*2] - add x0,x0,#8*4 - sbcs x11,x20,x15 - cbnz x28,.Lmul4x_sub - - sbcs x12,x21,x16 - mov x26,sp - add x1,sp,#8*4 - ldp x6,x7,[x27,#8*0] - sbcs x13,x22,x17 - stp x10,x11,[x0,#8*0] - ldp x8,x9,[x27,#8*2] - stp x12,x13,[x0,#8*2] - ldp x19,x20,[x1,#8*0] - ldp x21,x22,[x1,#8*2] - sbcs xzr,x30,xzr // did it borrow? - ldr x30,[x29,#8] // pull return address - - sub x28,x5,#8*4 -.Lmul4x_cond_copy: - sub x28,x28,#8*4 - csel x10,x19,x6,lo - stp xzr,xzr,[x26,#8*0] - csel x11,x20,x7,lo - ldp x6,x7,[x27,#8*4] - ldp x19,x20,[x1,#8*4] - csel x12,x21,x8,lo - stp xzr,xzr,[x26,#8*2] - add x26,x26,#8*4 - csel x13,x22,x9,lo - ldp x8,x9,[x27,#8*6] - ldp x21,x22,[x1,#8*6] - add x1,x1,#8*4 - stp x10,x11,[x27,#8*0] - stp x12,x13,[x27,#8*2] - add x27,x27,#8*4 - cbnz x28,.Lmul4x_cond_copy - - csel x10,x19,x6,lo - stp xzr,xzr,[x26,#8*0] - csel x11,x20,x7,lo - stp xzr,xzr,[x26,#8*2] - csel x12,x21,x8,lo - stp xzr,xzr,[x26,#8*3] - csel x13,x22,x9,lo - stp xzr,xzr,[x26,#8*4] - stp x10,x11,[x27,#8*0] - stp x12,x13,[x27,#8*2] - - b .Lmul4x_done - -.align 4 -.Lmul4x4_post_condition: - adc x0,x0,xzr - ldr x1,[x29,#96] // pull rp - // x19-3,x0 hold result, x14-7 hold modulus - subs x6,x19,x14 - ldr x30,[x29,#8] // pull return address - sbcs x7,x20,x15 - stp xzr,xzr,[sp,#8*0] - sbcs x8,x21,x16 - stp xzr,xzr,[sp,#8*2] - sbcs x9,x22,x17 - stp xzr,xzr,[sp,#8*4] - sbcs xzr,x0,xzr // did it borrow? - stp xzr,xzr,[sp,#8*6] - - // x6-3 hold result-modulus - csel x6,x19,x6,lo - csel x7,x20,x7,lo - csel x8,x21,x8,lo - csel x9,x22,x9,lo - stp x6,x7,[x1,#8*0] - stp x8,x9,[x1,#8*2] - -.Lmul4x_done: - ldp x19,x20,[x29,#16] - mov sp,x29 - ldp x21,x22,[x29,#32] - mov x0,#1 - ldp x23,x24,[x29,#48] - ldp x25,x26,[x29,#64] - ldp x27,x28,[x29,#80] - ldr x29,[sp],#128 - // x30 is popped earlier - AARCH64_VALIDATE_LINK_REGISTER - ret -.size __bn_mul4x_mont,.-__bn_mul4x_mont -.byte 77,111,110,116,103,111,109,101,114,121,32,77,117,108,116,105,112,108,105,99,97,116,105,111,110,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 -.align 2 -.align 4 -#endif -#endif // !OPENSSL_NO_ASM -.section .note.GNU-stack,"",%progbits diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/bsaes-armv7-ios32.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/bsaes-armv7-ios32.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/bsaes-armv7-ios32.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/bsaes-armv7-ios32.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,805 +0,0 @@ -// This file is generated from a similarly-named Perl script in the BoringSSL -// source tree. Do not edit by hand. - -#if !defined(__has_feature) -#define __has_feature(x) 0 -#endif -#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) -#define OPENSSL_NO_ASM -#endif - -#if !defined(OPENSSL_NO_ASM) -@ Copyright 2012-2016 The OpenSSL Project Authors. All Rights Reserved. -@ -@ Licensed under the OpenSSL license (the "License"). You may not use -@ this file except in compliance with the License. You can obtain a copy -@ in the file LICENSE in the source distribution or at -@ https://www.openssl.org/source/license.html - - -@ ==================================================================== -@ Written by Andy Polyakov for the OpenSSL -@ project. The module is, however, dual licensed under OpenSSL and -@ CRYPTOGAMS licenses depending on where you obtain it. For further -@ details see http://www.openssl.org/~appro/cryptogams/. -@ -@ Specific modes and adaptation for Linux kernel by Ard Biesheuvel -@ of Linaro. Permission to use under GPL terms is granted. -@ ==================================================================== - -@ Bit-sliced AES for ARM NEON -@ -@ February 2012. -@ -@ This implementation is direct adaptation of bsaes-x86_64 module for -@ ARM NEON. Except that this module is endian-neutral [in sense that -@ it can be compiled for either endianness] by courtesy of vld1.8's -@ neutrality. Initial version doesn't implement interface to OpenSSL, -@ only low-level primitives and unsupported entry points, just enough -@ to collect performance results, which for Cortex-A8 core are: -@ -@ encrypt 19.5 cycles per byte processed with 128-bit key -@ decrypt 22.1 cycles per byte processed with 128-bit key -@ key conv. 440 cycles per 128-bit key/0.18 of 8x block -@ -@ Snapdragon S4 encrypts byte in 17.6 cycles and decrypts in 19.7, -@ which is [much] worse than anticipated (for further details see -@ http://www.openssl.org/~appro/Snapdragon-S4.html). -@ -@ Cortex-A15 manages in 14.2/16.1 cycles [when integer-only code -@ manages in 20.0 cycles]. -@ -@ When comparing to x86_64 results keep in mind that NEON unit is -@ [mostly] single-issue and thus can't [fully] benefit from -@ instruction-level parallelism. And when comparing to aes-armv4 -@ results keep in mind key schedule conversion overhead (see -@ bsaes-x86_64.pl for further details)... -@ -@ - -@ April-August 2013 -@ Add CBC, CTR and XTS subroutines and adapt for kernel use; courtesy of Ard. - -#ifndef __KERNEL__ -# include - -# define VFP_ABI_PUSH vstmdb sp!,{d8-d15} -# define VFP_ABI_POP vldmia sp!,{d8-d15} -# define VFP_ABI_FRAME 0x40 -#else -# define VFP_ABI_PUSH -# define VFP_ABI_POP -# define VFP_ABI_FRAME 0 -# define BSAES_ASM_EXTENDED_KEY -# define __ARM_ARCH__ __LINUX_ARM_ARCH__ -# define __ARM_MAX_ARCH__ 7 -#endif - -#ifdef __thumb__ -# define adrl adr -#endif - -#if __ARM_MAX_ARCH__>=7 - - - -.text -.syntax unified @ ARMv7-capable assembler is expected to handle this -#if defined(__thumb2__) && !defined(__APPLE__) -.thumb -#else -.code 32 -# undef __thumb2__ -#endif - - -.align 6 -_bsaes_const: -LM0ISR:@ InvShiftRows constants -.quad 0x0a0e0206070b0f03, 0x0004080c0d010509 -LISR: -.quad 0x0504070602010003, 0x0f0e0d0c080b0a09 -LISRM0: -.quad 0x01040b0e0205080f, 0x0306090c00070a0d -LM0SR:@ ShiftRows constants -.quad 0x0a0e02060f03070b, 0x0004080c05090d01 -LSR: -.quad 0x0504070600030201, 0x0f0e0d0c0a09080b -LSRM0: -.quad 0x0304090e00050a0f, 0x01060b0c0207080d -LM0: -.quad 0x02060a0e03070b0f, 0x0004080c0105090d -LREVM0SR: -.quad 0x090d01050c000408, 0x03070b0f060a0e02 -.byte 66,105,116,45,115,108,105,99,101,100,32,65,69,83,32,102,111,114,32,78,69,79,78,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 -.align 2 -.align 6 - - -#ifdef __thumb2__ -.thumb_func _bsaes_encrypt8 -#endif -.align 4 -_bsaes_encrypt8: - adr r6,. - vldmia r4!, {q9} @ round 0 key -#if defined(__thumb2__) || defined(__APPLE__) - adr r6,LM0SR -#else - sub r6,r6,#_bsaes_encrypt8-LM0SR -#endif - - vldmia r6!, {q8} @ LM0SR -_bsaes_encrypt8_alt: - veor q10, q0, q9 @ xor with round0 key - veor q11, q1, q9 - vtbl.8 d0, {q10}, d16 - vtbl.8 d1, {q10}, d17 - veor q12, q2, q9 - vtbl.8 d2, {q11}, d16 - vtbl.8 d3, {q11}, d17 - veor q13, q3, q9 - vtbl.8 d4, {q12}, d16 - vtbl.8 d5, {q12}, d17 - veor q14, q4, q9 - vtbl.8 d6, {q13}, d16 - vtbl.8 d7, {q13}, d17 - veor q15, q5, q9 - vtbl.8 d8, {q14}, d16 - vtbl.8 d9, {q14}, d17 - veor q10, q6, q9 - vtbl.8 d10, {q15}, d16 - vtbl.8 d11, {q15}, d17 - veor q11, q7, q9 - vtbl.8 d12, {q10}, d16 - vtbl.8 d13, {q10}, d17 - vtbl.8 d14, {q11}, d16 - vtbl.8 d15, {q11}, d17 -_bsaes_encrypt8_bitslice: - vmov.i8 q8,#0x55 @ compose LBS0 - vmov.i8 q9,#0x33 @ compose LBS1 - vshr.u64 q10, q6, #1 - vshr.u64 q11, q4, #1 - veor q10, q10, q7 - veor q11, q11, q5 - vand q10, q10, q8 - vand q11, q11, q8 - veor q7, q7, q10 - vshl.u64 q10, q10, #1 - veor q5, q5, q11 - vshl.u64 q11, q11, #1 - veor q6, q6, q10 - veor q4, q4, q11 - vshr.u64 q10, q2, #1 - vshr.u64 q11, q0, #1 - veor q10, q10, q3 - veor q11, q11, q1 - vand q10, q10, q8 - vand q11, q11, q8 - veor q3, q3, q10 - vshl.u64 q10, q10, #1 - veor q1, q1, q11 - vshl.u64 q11, q11, #1 - veor q2, q2, q10 - veor q0, q0, q11 - vmov.i8 q8,#0x0f @ compose LBS2 - vshr.u64 q10, q5, #2 - vshr.u64 q11, q4, #2 - veor q10, q10, q7 - veor q11, q11, q6 - vand q10, q10, q9 - vand q11, q11, q9 - veor q7, q7, q10 - vshl.u64 q10, q10, #2 - veor q6, q6, q11 - vshl.u64 q11, q11, #2 - veor q5, q5, q10 - veor q4, q4, q11 - vshr.u64 q10, q1, #2 - vshr.u64 q11, q0, #2 - veor q10, q10, q3 - veor q11, q11, q2 - vand q10, q10, q9 - vand q11, q11, q9 - veor q3, q3, q10 - vshl.u64 q10, q10, #2 - veor q2, q2, q11 - vshl.u64 q11, q11, #2 - veor q1, q1, q10 - veor q0, q0, q11 - vshr.u64 q10, q3, #4 - vshr.u64 q11, q2, #4 - veor q10, q10, q7 - veor q11, q11, q6 - vand q10, q10, q8 - vand q11, q11, q8 - veor q7, q7, q10 - vshl.u64 q10, q10, #4 - veor q6, q6, q11 - vshl.u64 q11, q11, #4 - veor q3, q3, q10 - veor q2, q2, q11 - vshr.u64 q10, q1, #4 - vshr.u64 q11, q0, #4 - veor q10, q10, q5 - veor q11, q11, q4 - vand q10, q10, q8 - vand q11, q11, q8 - veor q5, q5, q10 - vshl.u64 q10, q10, #4 - veor q4, q4, q11 - vshl.u64 q11, q11, #4 - veor q1, q1, q10 - veor q0, q0, q11 - sub r5,r5,#1 - b Lenc_sbox -.align 4 -Lenc_loop: - vldmia r4!, {q8,q9,q10,q11} - veor q8, q8, q0 - veor q9, q9, q1 - vtbl.8 d0, {q8}, d24 - vtbl.8 d1, {q8}, d25 - vldmia r4!, {q8} - veor q10, q10, q2 - vtbl.8 d2, {q9}, d24 - vtbl.8 d3, {q9}, d25 - vldmia r4!, {q9} - veor q11, q11, q3 - vtbl.8 d4, {q10}, d24 - vtbl.8 d5, {q10}, d25 - vldmia r4!, {q10} - vtbl.8 d6, {q11}, d24 - vtbl.8 d7, {q11}, d25 - vldmia r4!, {q11} - veor q8, q8, q4 - veor q9, q9, q5 - vtbl.8 d8, {q8}, d24 - vtbl.8 d9, {q8}, d25 - veor q10, q10, q6 - vtbl.8 d10, {q9}, d24 - vtbl.8 d11, {q9}, d25 - veor q11, q11, q7 - vtbl.8 d12, {q10}, d24 - vtbl.8 d13, {q10}, d25 - vtbl.8 d14, {q11}, d24 - vtbl.8 d15, {q11}, d25 -Lenc_sbox: - veor q2, q2, q1 - veor q5, q5, q6 - veor q3, q3, q0 - veor q6, q6, q2 - veor q5, q5, q0 - - veor q6, q6, q3 - veor q3, q3, q7 - veor q7, q7, q5 - veor q3, q3, q4 - veor q4, q4, q5 - - veor q2, q2, q7 - veor q3, q3, q1 - veor q1, q1, q5 - veor q11, q7, q4 - veor q10, q1, q2 - veor q9, q5, q3 - veor q13, q2, q4 - vmov q8, q10 - veor q12, q6, q0 - - vorr q10, q10, q9 - veor q15, q11, q8 - vand q14, q11, q12 - vorr q11, q11, q12 - veor q12, q12, q9 - vand q8, q8, q9 - veor q9, q3, q0 - vand q15, q15, q12 - vand q13, q13, q9 - veor q9, q7, q1 - veor q12, q5, q6 - veor q11, q11, q13 - veor q10, q10, q13 - vand q13, q9, q12 - vorr q9, q9, q12 - veor q11, q11, q15 - veor q8, q8, q13 - veor q10, q10, q14 - veor q9, q9, q15 - veor q8, q8, q14 - vand q12, q2, q3 - veor q9, q9, q14 - vand q13, q4, q0 - vand q14, q1, q5 - vorr q15, q7, q6 - veor q11, q11, q12 - veor q9, q9, q14 - veor q8, q8, q15 - veor q10, q10, q13 - - @ Inv_GF16 0, 1, 2, 3, s0, s1, s2, s3 - - @ new smaller inversion - - vand q14, q11, q9 - vmov q12, q8 - - veor q13, q10, q14 - veor q15, q8, q14 - veor q14, q8, q14 @ q14=q15 - - vbsl q13, q9, q8 - vbsl q15, q11, q10 - veor q11, q11, q10 - - vbsl q12, q13, q14 - vbsl q8, q14, q13 - - vand q14, q12, q15 - veor q9, q9, q8 - - veor q14, q14, q11 - veor q12, q6, q0 - veor q8, q5, q3 - veor q10, q15, q14 - vand q10, q10, q6 - veor q6, q6, q5 - vand q11, q5, q15 - vand q6, q6, q14 - veor q5, q11, q10 - veor q6, q6, q11 - veor q15, q15, q13 - veor q14, q14, q9 - veor q11, q15, q14 - veor q10, q13, q9 - vand q11, q11, q12 - vand q10, q10, q0 - veor q12, q12, q8 - veor q0, q0, q3 - vand q8, q8, q15 - vand q3, q3, q13 - vand q12, q12, q14 - vand q0, q0, q9 - veor q8, q8, q12 - veor q0, q0, q3 - veor q12, q12, q11 - veor q3, q3, q10 - veor q6, q6, q12 - veor q0, q0, q12 - veor q5, q5, q8 - veor q3, q3, q8 - - veor q12, q7, q4 - veor q8, q1, q2 - veor q11, q15, q14 - veor q10, q13, q9 - vand q11, q11, q12 - vand q10, q10, q4 - veor q12, q12, q8 - veor q4, q4, q2 - vand q8, q8, q15 - vand q2, q2, q13 - vand q12, q12, q14 - vand q4, q4, q9 - veor q8, q8, q12 - veor q4, q4, q2 - veor q12, q12, q11 - veor q2, q2, q10 - veor q15, q15, q13 - veor q14, q14, q9 - veor q10, q15, q14 - vand q10, q10, q7 - veor q7, q7, q1 - vand q11, q1, q15 - vand q7, q7, q14 - veor q1, q11, q10 - veor q7, q7, q11 - veor q7, q7, q12 - veor q4, q4, q12 - veor q1, q1, q8 - veor q2, q2, q8 - veor q7, q7, q0 - veor q1, q1, q6 - veor q6, q6, q0 - veor q4, q4, q7 - veor q0, q0, q1 - - veor q1, q1, q5 - veor q5, q5, q2 - veor q2, q2, q3 - veor q3, q3, q5 - veor q4, q4, q5 - - veor q6, q6, q3 - subs r5,r5,#1 - bcc Lenc_done - vext.8 q8, q0, q0, #12 @ x0 <<< 32 - vext.8 q9, q1, q1, #12 - veor q0, q0, q8 @ x0 ^ (x0 <<< 32) - vext.8 q10, q4, q4, #12 - veor q1, q1, q9 - vext.8 q11, q6, q6, #12 - veor q4, q4, q10 - vext.8 q12, q3, q3, #12 - veor q6, q6, q11 - vext.8 q13, q7, q7, #12 - veor q3, q3, q12 - vext.8 q14, q2, q2, #12 - veor q7, q7, q13 - vext.8 q15, q5, q5, #12 - veor q2, q2, q14 - - veor q9, q9, q0 - veor q5, q5, q15 - vext.8 q0, q0, q0, #8 @ (x0 ^ (x0 <<< 32)) <<< 64) - veor q10, q10, q1 - veor q8, q8, q5 - veor q9, q9, q5 - vext.8 q1, q1, q1, #8 - veor q13, q13, q3 - veor q0, q0, q8 - veor q14, q14, q7 - veor q1, q1, q9 - vext.8 q8, q3, q3, #8 - veor q12, q12, q6 - vext.8 q9, q7, q7, #8 - veor q15, q15, q2 - vext.8 q3, q6, q6, #8 - veor q11, q11, q4 - vext.8 q7, q5, q5, #8 - veor q12, q12, q5 - vext.8 q6, q2, q2, #8 - veor q11, q11, q5 - vext.8 q2, q4, q4, #8 - veor q5, q9, q13 - veor q4, q8, q12 - veor q3, q3, q11 - veor q7, q7, q15 - veor q6, q6, q14 - @ vmov q4, q8 - veor q2, q2, q10 - @ vmov q5, q9 - vldmia r6, {q12} @ LSR - ite eq @ Thumb2 thing, samity check in ARM - addeq r6,r6,#0x10 - bne Lenc_loop - vldmia r6, {q12} @ LSRM0 - b Lenc_loop -.align 4 -Lenc_done: - vmov.i8 q8,#0x55 @ compose LBS0 - vmov.i8 q9,#0x33 @ compose LBS1 - vshr.u64 q10, q2, #1 - vshr.u64 q11, q3, #1 - veor q10, q10, q5 - veor q11, q11, q7 - vand q10, q10, q8 - vand q11, q11, q8 - veor q5, q5, q10 - vshl.u64 q10, q10, #1 - veor q7, q7, q11 - vshl.u64 q11, q11, #1 - veor q2, q2, q10 - veor q3, q3, q11 - vshr.u64 q10, q4, #1 - vshr.u64 q11, q0, #1 - veor q10, q10, q6 - veor q11, q11, q1 - vand q10, q10, q8 - vand q11, q11, q8 - veor q6, q6, q10 - vshl.u64 q10, q10, #1 - veor q1, q1, q11 - vshl.u64 q11, q11, #1 - veor q4, q4, q10 - veor q0, q0, q11 - vmov.i8 q8,#0x0f @ compose LBS2 - vshr.u64 q10, q7, #2 - vshr.u64 q11, q3, #2 - veor q10, q10, q5 - veor q11, q11, q2 - vand q10, q10, q9 - vand q11, q11, q9 - veor q5, q5, q10 - vshl.u64 q10, q10, #2 - veor q2, q2, q11 - vshl.u64 q11, q11, #2 - veor q7, q7, q10 - veor q3, q3, q11 - vshr.u64 q10, q1, #2 - vshr.u64 q11, q0, #2 - veor q10, q10, q6 - veor q11, q11, q4 - vand q10, q10, q9 - vand q11, q11, q9 - veor q6, q6, q10 - vshl.u64 q10, q10, #2 - veor q4, q4, q11 - vshl.u64 q11, q11, #2 - veor q1, q1, q10 - veor q0, q0, q11 - vshr.u64 q10, q6, #4 - vshr.u64 q11, q4, #4 - veor q10, q10, q5 - veor q11, q11, q2 - vand q10, q10, q8 - vand q11, q11, q8 - veor q5, q5, q10 - vshl.u64 q10, q10, #4 - veor q2, q2, q11 - vshl.u64 q11, q11, #4 - veor q6, q6, q10 - veor q4, q4, q11 - vshr.u64 q10, q1, #4 - vshr.u64 q11, q0, #4 - veor q10, q10, q7 - veor q11, q11, q3 - vand q10, q10, q8 - vand q11, q11, q8 - veor q7, q7, q10 - vshl.u64 q10, q10, #4 - veor q3, q3, q11 - vshl.u64 q11, q11, #4 - veor q1, q1, q10 - veor q0, q0, q11 - vldmia r4, {q8} @ last round key - veor q4, q4, q8 - veor q6, q6, q8 - veor q3, q3, q8 - veor q7, q7, q8 - veor q2, q2, q8 - veor q5, q5, q8 - veor q0, q0, q8 - veor q1, q1, q8 - bx lr - -#ifdef __thumb2__ -.thumb_func _bsaes_key_convert -#endif -.align 4 -_bsaes_key_convert: - adr r6,. - vld1.8 {q7}, [r4]! @ load round 0 key -#if defined(__thumb2__) || defined(__APPLE__) - adr r6,LM0 -#else - sub r6,r6,#_bsaes_key_convert-LM0 -#endif - vld1.8 {q15}, [r4]! @ load round 1 key - - vmov.i8 q8, #0x01 @ bit masks - vmov.i8 q9, #0x02 - vmov.i8 q10, #0x04 - vmov.i8 q11, #0x08 - vmov.i8 q12, #0x10 - vmov.i8 q13, #0x20 - vldmia r6, {q14} @ LM0 - -#ifdef __ARMEL__ - vrev32.8 q7, q7 - vrev32.8 q15, q15 -#endif - sub r5,r5,#1 - vstmia r12!, {q7} @ save round 0 key - b Lkey_loop - -.align 4 -Lkey_loop: - vtbl.8 d14,{q15},d28 - vtbl.8 d15,{q15},d29 - vmov.i8 q6, #0x40 - vmov.i8 q15, #0x80 - - vtst.8 q0, q7, q8 - vtst.8 q1, q7, q9 - vtst.8 q2, q7, q10 - vtst.8 q3, q7, q11 - vtst.8 q4, q7, q12 - vtst.8 q5, q7, q13 - vtst.8 q6, q7, q6 - vtst.8 q7, q7, q15 - vld1.8 {q15}, [r4]! @ load next round key - vmvn q0, q0 @ "pnot" - vmvn q1, q1 - vmvn q5, q5 - vmvn q6, q6 -#ifdef __ARMEL__ - vrev32.8 q15, q15 -#endif - subs r5,r5,#1 - vstmia r12!,{q0,q1,q2,q3,q4,q5,q6,q7} @ write bit-sliced round key - bne Lkey_loop - - vmov.i8 q7,#0x63 @ compose L63 - @ don't save last round key - bx lr - -.globl _GFp_bsaes_ctr32_encrypt_blocks -.private_extern _GFp_bsaes_ctr32_encrypt_blocks -#ifdef __thumb2__ -.thumb_func _GFp_bsaes_ctr32_encrypt_blocks -#endif -.align 5 -_GFp_bsaes_ctr32_encrypt_blocks: - @ In OpenSSL, short inputs fall back to aes_nohw_* here. We patch this - @ out to retain a constant-time implementation. - mov ip, sp - stmdb sp!, {r4,r5,r6,r7,r8,r9,r10, lr} - VFP_ABI_PUSH - ldr r8, [ip] @ ctr is 1st arg on the stack - sub sp, sp, #0x10 @ scratch space to carry over the ctr - mov r9, sp @ save sp - - ldr r10, [r3, #240] @ get # of rounds -#ifndef BSAES_ASM_EXTENDED_KEY - @ allocate the key schedule on the stack - sub r12, sp, r10, lsl#7 @ 128 bytes per inner round key - add r12, #96 @ size of bit-sliced key schedule - - @ populate the key schedule - mov r4, r3 @ pass key - mov r5, r10 @ pass # of rounds - mov sp, r12 @ sp is sp - bl _bsaes_key_convert - veor q7,q7,q15 @ fix up last round key - vstmia r12, {q7} @ save last round key - - vld1.8 {q0}, [r8] @ load counter -#ifdef __APPLE__ - mov r8, #:lower16:(LREVM0SR-LM0) - add r8, r6, r8 -#else - add r8, r6, #LREVM0SR-LM0 @ borrow r8 -#endif - vldmia sp, {q4} @ load round0 key -#else - ldr r12, [r3, #244] - eors r12, #1 - beq 0f - - @ populate the key schedule - str r12, [r3, #244] - mov r4, r3 @ pass key - mov r5, r10 @ pass # of rounds - add r12, r3, #248 @ pass key schedule - bl _bsaes_key_convert - veor q7,q7,q15 @ fix up last round key - vstmia r12, {q7} @ save last round key - -.align 2 - add r12, r3, #248 - vld1.8 {q0}, [r8] @ load counter - adrl r8, LREVM0SR @ borrow r8 - vldmia r12, {q4} @ load round0 key - sub sp, #0x10 @ place for adjusted round0 key -#endif - - vmov.i32 q8,#1 @ compose 1<<96 - veor q9,q9,q9 - vrev32.8 q0,q0 - vext.8 q8,q9,q8,#4 - vrev32.8 q4,q4 - vadd.u32 q9,q8,q8 @ compose 2<<96 - vstmia sp, {q4} @ save adjusted round0 key - b Lctr_enc_loop - -.align 4 -Lctr_enc_loop: - vadd.u32 q10, q8, q9 @ compose 3<<96 - vadd.u32 q1, q0, q8 @ +1 - vadd.u32 q2, q0, q9 @ +2 - vadd.u32 q3, q0, q10 @ +3 - vadd.u32 q4, q1, q10 - vadd.u32 q5, q2, q10 - vadd.u32 q6, q3, q10 - vadd.u32 q7, q4, q10 - vadd.u32 q10, q5, q10 @ next counter - - @ Borrow prologue from _bsaes_encrypt8 to use the opportunity - @ to flip byte order in 32-bit counter - - vldmia sp, {q9} @ load round0 key -#ifndef BSAES_ASM_EXTENDED_KEY - add r4, sp, #0x10 @ pass next round key -#else - add r4, r3, #264 -#endif - vldmia r8, {q8} @ LREVM0SR - mov r5, r10 @ pass rounds - vstmia r9, {q10} @ save next counter -#ifdef __APPLE__ - mov r6, #:lower16:(LREVM0SR-LSR) - sub r6, r8, r6 -#else - sub r6, r8, #LREVM0SR-LSR @ pass constants -#endif - - bl _bsaes_encrypt8_alt - - subs r2, r2, #8 - blo Lctr_enc_loop_done - - vld1.8 {q8,q9}, [r0]! @ load input - vld1.8 {q10,q11}, [r0]! - veor q0, q8 - veor q1, q9 - vld1.8 {q12,q13}, [r0]! - veor q4, q10 - veor q6, q11 - vld1.8 {q14,q15}, [r0]! - veor q3, q12 - vst1.8 {q0,q1}, [r1]! @ write output - veor q7, q13 - veor q2, q14 - vst1.8 {q4}, [r1]! - veor q5, q15 - vst1.8 {q6}, [r1]! - vmov.i32 q8, #1 @ compose 1<<96 - vst1.8 {q3}, [r1]! - veor q9, q9, q9 - vst1.8 {q7}, [r1]! - vext.8 q8, q9, q8, #4 - vst1.8 {q2}, [r1]! - vadd.u32 q9,q8,q8 @ compose 2<<96 - vst1.8 {q5}, [r1]! - vldmia r9, {q0} @ load counter - - bne Lctr_enc_loop - b Lctr_enc_done - -.align 4 -Lctr_enc_loop_done: - add r2, r2, #8 - vld1.8 {q8}, [r0]! @ load input - veor q0, q8 - vst1.8 {q0}, [r1]! @ write output - cmp r2, #2 - blo Lctr_enc_done - vld1.8 {q9}, [r0]! - veor q1, q9 - vst1.8 {q1}, [r1]! - beq Lctr_enc_done - vld1.8 {q10}, [r0]! - veor q4, q10 - vst1.8 {q4}, [r1]! - cmp r2, #4 - blo Lctr_enc_done - vld1.8 {q11}, [r0]! - veor q6, q11 - vst1.8 {q6}, [r1]! - beq Lctr_enc_done - vld1.8 {q12}, [r0]! - veor q3, q12 - vst1.8 {q3}, [r1]! - cmp r2, #6 - blo Lctr_enc_done - vld1.8 {q13}, [r0]! - veor q7, q13 - vst1.8 {q7}, [r1]! - beq Lctr_enc_done - vld1.8 {q14}, [r0] - veor q2, q14 - vst1.8 {q2}, [r1]! - -Lctr_enc_done: - vmov.i32 q0, #0 - vmov.i32 q1, #0 -#ifndef BSAES_ASM_EXTENDED_KEY -Lctr_enc_bzero:@ wipe key schedule [if any] - vstmia sp!, {q0,q1} - cmp sp, r9 - bne Lctr_enc_bzero -#else - vstmia sp, {q0,q1} -#endif - - mov sp, r9 - add sp, #0x10 @ add sp,r9,#0x10 is no good for thumb - VFP_ABI_POP - ldmia sp!, {r4,r5,r6,r7,r8,r9,r10, pc} @ return - - @ OpenSSL contains aes_nohw_* fallback code here. We patch this - @ out to retain a constant-time implementation. - -#endif -#endif // !OPENSSL_NO_ASM diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/bsaes-armv7-linux32.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/bsaes-armv7-linux32.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/bsaes-armv7-linux32.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/bsaes-armv7-linux32.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,802 +0,0 @@ -// This file is generated from a similarly-named Perl script in the BoringSSL -// source tree. Do not edit by hand. - -#if !defined(__has_feature) -#define __has_feature(x) 0 -#endif -#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) -#define OPENSSL_NO_ASM -#endif - -#if !defined(OPENSSL_NO_ASM) -#if defined(__arm__) -@ Copyright 2012-2016 The OpenSSL Project Authors. All Rights Reserved. -@ -@ Licensed under the OpenSSL license (the "License"). You may not use -@ this file except in compliance with the License. You can obtain a copy -@ in the file LICENSE in the source distribution or at -@ https://www.openssl.org/source/license.html - - -@ ==================================================================== -@ Written by Andy Polyakov for the OpenSSL -@ project. The module is, however, dual licensed under OpenSSL and -@ CRYPTOGAMS licenses depending on where you obtain it. For further -@ details see http://www.openssl.org/~appro/cryptogams/. -@ -@ Specific modes and adaptation for Linux kernel by Ard Biesheuvel -@ of Linaro. Permission to use under GPL terms is granted. -@ ==================================================================== - -@ Bit-sliced AES for ARM NEON -@ -@ February 2012. -@ -@ This implementation is direct adaptation of bsaes-x86_64 module for -@ ARM NEON. Except that this module is endian-neutral [in sense that -@ it can be compiled for either endianness] by courtesy of vld1.8's -@ neutrality. Initial version doesn't implement interface to OpenSSL, -@ only low-level primitives and unsupported entry points, just enough -@ to collect performance results, which for Cortex-A8 core are: -@ -@ encrypt 19.5 cycles per byte processed with 128-bit key -@ decrypt 22.1 cycles per byte processed with 128-bit key -@ key conv. 440 cycles per 128-bit key/0.18 of 8x block -@ -@ Snapdragon S4 encrypts byte in 17.6 cycles and decrypts in 19.7, -@ which is [much] worse than anticipated (for further details see -@ http://www.openssl.org/~appro/Snapdragon-S4.html). -@ -@ Cortex-A15 manages in 14.2/16.1 cycles [when integer-only code -@ manages in 20.0 cycles]. -@ -@ When comparing to x86_64 results keep in mind that NEON unit is -@ [mostly] single-issue and thus can't [fully] benefit from -@ instruction-level parallelism. And when comparing to aes-armv4 -@ results keep in mind key schedule conversion overhead (see -@ bsaes-x86_64.pl for further details)... -@ -@ - -@ April-August 2013 -@ Add CBC, CTR and XTS subroutines and adapt for kernel use; courtesy of Ard. - -#ifndef __KERNEL__ -# include - -# define VFP_ABI_PUSH vstmdb sp!,{d8-d15} -# define VFP_ABI_POP vldmia sp!,{d8-d15} -# define VFP_ABI_FRAME 0x40 -#else -# define VFP_ABI_PUSH -# define VFP_ABI_POP -# define VFP_ABI_FRAME 0 -# define BSAES_ASM_EXTENDED_KEY -# define __ARM_ARCH__ __LINUX_ARM_ARCH__ -# define __ARM_MAX_ARCH__ 7 -#endif - -#ifdef __thumb__ -# define adrl adr -#endif - -#if __ARM_MAX_ARCH__>=7 -.arch armv7-a -.fpu neon - -.text -.syntax unified @ ARMv7-capable assembler is expected to handle this -#if defined(__thumb2__) && !defined(__APPLE__) -.thumb -#else -.code 32 -# undef __thumb2__ -#endif - -.type _bsaes_const,%object -.align 6 -_bsaes_const: -.LM0ISR:@ InvShiftRows constants -.quad 0x0a0e0206070b0f03, 0x0004080c0d010509 -.LISR: -.quad 0x0504070602010003, 0x0f0e0d0c080b0a09 -.LISRM0: -.quad 0x01040b0e0205080f, 0x0306090c00070a0d -.LM0SR:@ ShiftRows constants -.quad 0x0a0e02060f03070b, 0x0004080c05090d01 -.LSR: -.quad 0x0504070600030201, 0x0f0e0d0c0a09080b -.LSRM0: -.quad 0x0304090e00050a0f, 0x01060b0c0207080d -.LM0: -.quad 0x02060a0e03070b0f, 0x0004080c0105090d -.LREVM0SR: -.quad 0x090d01050c000408, 0x03070b0f060a0e02 -.byte 66,105,116,45,115,108,105,99,101,100,32,65,69,83,32,102,111,114,32,78,69,79,78,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 -.align 2 -.align 6 -.size _bsaes_const,.-_bsaes_const - -.type _bsaes_encrypt8,%function -.align 4 -_bsaes_encrypt8: - adr r6,. - vldmia r4!, {q9} @ round 0 key -#if defined(__thumb2__) || defined(__APPLE__) - adr r6,.LM0SR -#else - sub r6,r6,#_bsaes_encrypt8-.LM0SR -#endif - - vldmia r6!, {q8} @ .LM0SR -_bsaes_encrypt8_alt: - veor q10, q0, q9 @ xor with round0 key - veor q11, q1, q9 - vtbl.8 d0, {q10}, d16 - vtbl.8 d1, {q10}, d17 - veor q12, q2, q9 - vtbl.8 d2, {q11}, d16 - vtbl.8 d3, {q11}, d17 - veor q13, q3, q9 - vtbl.8 d4, {q12}, d16 - vtbl.8 d5, {q12}, d17 - veor q14, q4, q9 - vtbl.8 d6, {q13}, d16 - vtbl.8 d7, {q13}, d17 - veor q15, q5, q9 - vtbl.8 d8, {q14}, d16 - vtbl.8 d9, {q14}, d17 - veor q10, q6, q9 - vtbl.8 d10, {q15}, d16 - vtbl.8 d11, {q15}, d17 - veor q11, q7, q9 - vtbl.8 d12, {q10}, d16 - vtbl.8 d13, {q10}, d17 - vtbl.8 d14, {q11}, d16 - vtbl.8 d15, {q11}, d17 -_bsaes_encrypt8_bitslice: - vmov.i8 q8,#0x55 @ compose .LBS0 - vmov.i8 q9,#0x33 @ compose .LBS1 - vshr.u64 q10, q6, #1 - vshr.u64 q11, q4, #1 - veor q10, q10, q7 - veor q11, q11, q5 - vand q10, q10, q8 - vand q11, q11, q8 - veor q7, q7, q10 - vshl.u64 q10, q10, #1 - veor q5, q5, q11 - vshl.u64 q11, q11, #1 - veor q6, q6, q10 - veor q4, q4, q11 - vshr.u64 q10, q2, #1 - vshr.u64 q11, q0, #1 - veor q10, q10, q3 - veor q11, q11, q1 - vand q10, q10, q8 - vand q11, q11, q8 - veor q3, q3, q10 - vshl.u64 q10, q10, #1 - veor q1, q1, q11 - vshl.u64 q11, q11, #1 - veor q2, q2, q10 - veor q0, q0, q11 - vmov.i8 q8,#0x0f @ compose .LBS2 - vshr.u64 q10, q5, #2 - vshr.u64 q11, q4, #2 - veor q10, q10, q7 - veor q11, q11, q6 - vand q10, q10, q9 - vand q11, q11, q9 - veor q7, q7, q10 - vshl.u64 q10, q10, #2 - veor q6, q6, q11 - vshl.u64 q11, q11, #2 - veor q5, q5, q10 - veor q4, q4, q11 - vshr.u64 q10, q1, #2 - vshr.u64 q11, q0, #2 - veor q10, q10, q3 - veor q11, q11, q2 - vand q10, q10, q9 - vand q11, q11, q9 - veor q3, q3, q10 - vshl.u64 q10, q10, #2 - veor q2, q2, q11 - vshl.u64 q11, q11, #2 - veor q1, q1, q10 - veor q0, q0, q11 - vshr.u64 q10, q3, #4 - vshr.u64 q11, q2, #4 - veor q10, q10, q7 - veor q11, q11, q6 - vand q10, q10, q8 - vand q11, q11, q8 - veor q7, q7, q10 - vshl.u64 q10, q10, #4 - veor q6, q6, q11 - vshl.u64 q11, q11, #4 - veor q3, q3, q10 - veor q2, q2, q11 - vshr.u64 q10, q1, #4 - vshr.u64 q11, q0, #4 - veor q10, q10, q5 - veor q11, q11, q4 - vand q10, q10, q8 - vand q11, q11, q8 - veor q5, q5, q10 - vshl.u64 q10, q10, #4 - veor q4, q4, q11 - vshl.u64 q11, q11, #4 - veor q1, q1, q10 - veor q0, q0, q11 - sub r5,r5,#1 - b .Lenc_sbox -.align 4 -.Lenc_loop: - vldmia r4!, {q8,q9,q10,q11} - veor q8, q8, q0 - veor q9, q9, q1 - vtbl.8 d0, {q8}, d24 - vtbl.8 d1, {q8}, d25 - vldmia r4!, {q8} - veor q10, q10, q2 - vtbl.8 d2, {q9}, d24 - vtbl.8 d3, {q9}, d25 - vldmia r4!, {q9} - veor q11, q11, q3 - vtbl.8 d4, {q10}, d24 - vtbl.8 d5, {q10}, d25 - vldmia r4!, {q10} - vtbl.8 d6, {q11}, d24 - vtbl.8 d7, {q11}, d25 - vldmia r4!, {q11} - veor q8, q8, q4 - veor q9, q9, q5 - vtbl.8 d8, {q8}, d24 - vtbl.8 d9, {q8}, d25 - veor q10, q10, q6 - vtbl.8 d10, {q9}, d24 - vtbl.8 d11, {q9}, d25 - veor q11, q11, q7 - vtbl.8 d12, {q10}, d24 - vtbl.8 d13, {q10}, d25 - vtbl.8 d14, {q11}, d24 - vtbl.8 d15, {q11}, d25 -.Lenc_sbox: - veor q2, q2, q1 - veor q5, q5, q6 - veor q3, q3, q0 - veor q6, q6, q2 - veor q5, q5, q0 - - veor q6, q6, q3 - veor q3, q3, q7 - veor q7, q7, q5 - veor q3, q3, q4 - veor q4, q4, q5 - - veor q2, q2, q7 - veor q3, q3, q1 - veor q1, q1, q5 - veor q11, q7, q4 - veor q10, q1, q2 - veor q9, q5, q3 - veor q13, q2, q4 - vmov q8, q10 - veor q12, q6, q0 - - vorr q10, q10, q9 - veor q15, q11, q8 - vand q14, q11, q12 - vorr q11, q11, q12 - veor q12, q12, q9 - vand q8, q8, q9 - veor q9, q3, q0 - vand q15, q15, q12 - vand q13, q13, q9 - veor q9, q7, q1 - veor q12, q5, q6 - veor q11, q11, q13 - veor q10, q10, q13 - vand q13, q9, q12 - vorr q9, q9, q12 - veor q11, q11, q15 - veor q8, q8, q13 - veor q10, q10, q14 - veor q9, q9, q15 - veor q8, q8, q14 - vand q12, q2, q3 - veor q9, q9, q14 - vand q13, q4, q0 - vand q14, q1, q5 - vorr q15, q7, q6 - veor q11, q11, q12 - veor q9, q9, q14 - veor q8, q8, q15 - veor q10, q10, q13 - - @ Inv_GF16 0, 1, 2, 3, s0, s1, s2, s3 - - @ new smaller inversion - - vand q14, q11, q9 - vmov q12, q8 - - veor q13, q10, q14 - veor q15, q8, q14 - veor q14, q8, q14 @ q14=q15 - - vbsl q13, q9, q8 - vbsl q15, q11, q10 - veor q11, q11, q10 - - vbsl q12, q13, q14 - vbsl q8, q14, q13 - - vand q14, q12, q15 - veor q9, q9, q8 - - veor q14, q14, q11 - veor q12, q6, q0 - veor q8, q5, q3 - veor q10, q15, q14 - vand q10, q10, q6 - veor q6, q6, q5 - vand q11, q5, q15 - vand q6, q6, q14 - veor q5, q11, q10 - veor q6, q6, q11 - veor q15, q15, q13 - veor q14, q14, q9 - veor q11, q15, q14 - veor q10, q13, q9 - vand q11, q11, q12 - vand q10, q10, q0 - veor q12, q12, q8 - veor q0, q0, q3 - vand q8, q8, q15 - vand q3, q3, q13 - vand q12, q12, q14 - vand q0, q0, q9 - veor q8, q8, q12 - veor q0, q0, q3 - veor q12, q12, q11 - veor q3, q3, q10 - veor q6, q6, q12 - veor q0, q0, q12 - veor q5, q5, q8 - veor q3, q3, q8 - - veor q12, q7, q4 - veor q8, q1, q2 - veor q11, q15, q14 - veor q10, q13, q9 - vand q11, q11, q12 - vand q10, q10, q4 - veor q12, q12, q8 - veor q4, q4, q2 - vand q8, q8, q15 - vand q2, q2, q13 - vand q12, q12, q14 - vand q4, q4, q9 - veor q8, q8, q12 - veor q4, q4, q2 - veor q12, q12, q11 - veor q2, q2, q10 - veor q15, q15, q13 - veor q14, q14, q9 - veor q10, q15, q14 - vand q10, q10, q7 - veor q7, q7, q1 - vand q11, q1, q15 - vand q7, q7, q14 - veor q1, q11, q10 - veor q7, q7, q11 - veor q7, q7, q12 - veor q4, q4, q12 - veor q1, q1, q8 - veor q2, q2, q8 - veor q7, q7, q0 - veor q1, q1, q6 - veor q6, q6, q0 - veor q4, q4, q7 - veor q0, q0, q1 - - veor q1, q1, q5 - veor q5, q5, q2 - veor q2, q2, q3 - veor q3, q3, q5 - veor q4, q4, q5 - - veor q6, q6, q3 - subs r5,r5,#1 - bcc .Lenc_done - vext.8 q8, q0, q0, #12 @ x0 <<< 32 - vext.8 q9, q1, q1, #12 - veor q0, q0, q8 @ x0 ^ (x0 <<< 32) - vext.8 q10, q4, q4, #12 - veor q1, q1, q9 - vext.8 q11, q6, q6, #12 - veor q4, q4, q10 - vext.8 q12, q3, q3, #12 - veor q6, q6, q11 - vext.8 q13, q7, q7, #12 - veor q3, q3, q12 - vext.8 q14, q2, q2, #12 - veor q7, q7, q13 - vext.8 q15, q5, q5, #12 - veor q2, q2, q14 - - veor q9, q9, q0 - veor q5, q5, q15 - vext.8 q0, q0, q0, #8 @ (x0 ^ (x0 <<< 32)) <<< 64) - veor q10, q10, q1 - veor q8, q8, q5 - veor q9, q9, q5 - vext.8 q1, q1, q1, #8 - veor q13, q13, q3 - veor q0, q0, q8 - veor q14, q14, q7 - veor q1, q1, q9 - vext.8 q8, q3, q3, #8 - veor q12, q12, q6 - vext.8 q9, q7, q7, #8 - veor q15, q15, q2 - vext.8 q3, q6, q6, #8 - veor q11, q11, q4 - vext.8 q7, q5, q5, #8 - veor q12, q12, q5 - vext.8 q6, q2, q2, #8 - veor q11, q11, q5 - vext.8 q2, q4, q4, #8 - veor q5, q9, q13 - veor q4, q8, q12 - veor q3, q3, q11 - veor q7, q7, q15 - veor q6, q6, q14 - @ vmov q4, q8 - veor q2, q2, q10 - @ vmov q5, q9 - vldmia r6, {q12} @ .LSR - ite eq @ Thumb2 thing, samity check in ARM - addeq r6,r6,#0x10 - bne .Lenc_loop - vldmia r6, {q12} @ .LSRM0 - b .Lenc_loop -.align 4 -.Lenc_done: - vmov.i8 q8,#0x55 @ compose .LBS0 - vmov.i8 q9,#0x33 @ compose .LBS1 - vshr.u64 q10, q2, #1 - vshr.u64 q11, q3, #1 - veor q10, q10, q5 - veor q11, q11, q7 - vand q10, q10, q8 - vand q11, q11, q8 - veor q5, q5, q10 - vshl.u64 q10, q10, #1 - veor q7, q7, q11 - vshl.u64 q11, q11, #1 - veor q2, q2, q10 - veor q3, q3, q11 - vshr.u64 q10, q4, #1 - vshr.u64 q11, q0, #1 - veor q10, q10, q6 - veor q11, q11, q1 - vand q10, q10, q8 - vand q11, q11, q8 - veor q6, q6, q10 - vshl.u64 q10, q10, #1 - veor q1, q1, q11 - vshl.u64 q11, q11, #1 - veor q4, q4, q10 - veor q0, q0, q11 - vmov.i8 q8,#0x0f @ compose .LBS2 - vshr.u64 q10, q7, #2 - vshr.u64 q11, q3, #2 - veor q10, q10, q5 - veor q11, q11, q2 - vand q10, q10, q9 - vand q11, q11, q9 - veor q5, q5, q10 - vshl.u64 q10, q10, #2 - veor q2, q2, q11 - vshl.u64 q11, q11, #2 - veor q7, q7, q10 - veor q3, q3, q11 - vshr.u64 q10, q1, #2 - vshr.u64 q11, q0, #2 - veor q10, q10, q6 - veor q11, q11, q4 - vand q10, q10, q9 - vand q11, q11, q9 - veor q6, q6, q10 - vshl.u64 q10, q10, #2 - veor q4, q4, q11 - vshl.u64 q11, q11, #2 - veor q1, q1, q10 - veor q0, q0, q11 - vshr.u64 q10, q6, #4 - vshr.u64 q11, q4, #4 - veor q10, q10, q5 - veor q11, q11, q2 - vand q10, q10, q8 - vand q11, q11, q8 - veor q5, q5, q10 - vshl.u64 q10, q10, #4 - veor q2, q2, q11 - vshl.u64 q11, q11, #4 - veor q6, q6, q10 - veor q4, q4, q11 - vshr.u64 q10, q1, #4 - vshr.u64 q11, q0, #4 - veor q10, q10, q7 - veor q11, q11, q3 - vand q10, q10, q8 - vand q11, q11, q8 - veor q7, q7, q10 - vshl.u64 q10, q10, #4 - veor q3, q3, q11 - vshl.u64 q11, q11, #4 - veor q1, q1, q10 - veor q0, q0, q11 - vldmia r4, {q8} @ last round key - veor q4, q4, q8 - veor q6, q6, q8 - veor q3, q3, q8 - veor q7, q7, q8 - veor q2, q2, q8 - veor q5, q5, q8 - veor q0, q0, q8 - veor q1, q1, q8 - bx lr -.size _bsaes_encrypt8,.-_bsaes_encrypt8 -.type _bsaes_key_convert,%function -.align 4 -_bsaes_key_convert: - adr r6,. - vld1.8 {q7}, [r4]! @ load round 0 key -#if defined(__thumb2__) || defined(__APPLE__) - adr r6,.LM0 -#else - sub r6,r6,#_bsaes_key_convert-.LM0 -#endif - vld1.8 {q15}, [r4]! @ load round 1 key - - vmov.i8 q8, #0x01 @ bit masks - vmov.i8 q9, #0x02 - vmov.i8 q10, #0x04 - vmov.i8 q11, #0x08 - vmov.i8 q12, #0x10 - vmov.i8 q13, #0x20 - vldmia r6, {q14} @ .LM0 - -#ifdef __ARMEL__ - vrev32.8 q7, q7 - vrev32.8 q15, q15 -#endif - sub r5,r5,#1 - vstmia r12!, {q7} @ save round 0 key - b .Lkey_loop - -.align 4 -.Lkey_loop: - vtbl.8 d14,{q15},d28 - vtbl.8 d15,{q15},d29 - vmov.i8 q6, #0x40 - vmov.i8 q15, #0x80 - - vtst.8 q0, q7, q8 - vtst.8 q1, q7, q9 - vtst.8 q2, q7, q10 - vtst.8 q3, q7, q11 - vtst.8 q4, q7, q12 - vtst.8 q5, q7, q13 - vtst.8 q6, q7, q6 - vtst.8 q7, q7, q15 - vld1.8 {q15}, [r4]! @ load next round key - vmvn q0, q0 @ "pnot" - vmvn q1, q1 - vmvn q5, q5 - vmvn q6, q6 -#ifdef __ARMEL__ - vrev32.8 q15, q15 -#endif - subs r5,r5,#1 - vstmia r12!,{q0,q1,q2,q3,q4,q5,q6,q7} @ write bit-sliced round key - bne .Lkey_loop - - vmov.i8 q7,#0x63 @ compose .L63 - @ don't save last round key - bx lr -.size _bsaes_key_convert,.-_bsaes_key_convert -.globl GFp_bsaes_ctr32_encrypt_blocks -.hidden GFp_bsaes_ctr32_encrypt_blocks -.type GFp_bsaes_ctr32_encrypt_blocks,%function -.align 5 -GFp_bsaes_ctr32_encrypt_blocks: - @ In OpenSSL, short inputs fall back to aes_nohw_* here. We patch this - @ out to retain a constant-time implementation. - mov ip, sp - stmdb sp!, {r4,r5,r6,r7,r8,r9,r10, lr} - VFP_ABI_PUSH - ldr r8, [ip] @ ctr is 1st arg on the stack - sub sp, sp, #0x10 @ scratch space to carry over the ctr - mov r9, sp @ save sp - - ldr r10, [r3, #240] @ get # of rounds -#ifndef BSAES_ASM_EXTENDED_KEY - @ allocate the key schedule on the stack - sub r12, sp, r10, lsl#7 @ 128 bytes per inner round key - add r12, #96 @ size of bit-sliced key schedule - - @ populate the key schedule - mov r4, r3 @ pass key - mov r5, r10 @ pass # of rounds - mov sp, r12 @ sp is sp - bl _bsaes_key_convert - veor q7,q7,q15 @ fix up last round key - vstmia r12, {q7} @ save last round key - - vld1.8 {q0}, [r8] @ load counter -#ifdef __APPLE__ - mov r8, #:lower16:(.LREVM0SR-.LM0) - add r8, r6, r8 -#else - add r8, r6, #.LREVM0SR-.LM0 @ borrow r8 -#endif - vldmia sp, {q4} @ load round0 key -#else - ldr r12, [r3, #244] - eors r12, #1 - beq 0f - - @ populate the key schedule - str r12, [r3, #244] - mov r4, r3 @ pass key - mov r5, r10 @ pass # of rounds - add r12, r3, #248 @ pass key schedule - bl _bsaes_key_convert - veor q7,q7,q15 @ fix up last round key - vstmia r12, {q7} @ save last round key - -.align 2 - add r12, r3, #248 - vld1.8 {q0}, [r8] @ load counter - adrl r8, .LREVM0SR @ borrow r8 - vldmia r12, {q4} @ load round0 key - sub sp, #0x10 @ place for adjusted round0 key -#endif - - vmov.i32 q8,#1 @ compose 1<<96 - veor q9,q9,q9 - vrev32.8 q0,q0 - vext.8 q8,q9,q8,#4 - vrev32.8 q4,q4 - vadd.u32 q9,q8,q8 @ compose 2<<96 - vstmia sp, {q4} @ save adjusted round0 key - b .Lctr_enc_loop - -.align 4 -.Lctr_enc_loop: - vadd.u32 q10, q8, q9 @ compose 3<<96 - vadd.u32 q1, q0, q8 @ +1 - vadd.u32 q2, q0, q9 @ +2 - vadd.u32 q3, q0, q10 @ +3 - vadd.u32 q4, q1, q10 - vadd.u32 q5, q2, q10 - vadd.u32 q6, q3, q10 - vadd.u32 q7, q4, q10 - vadd.u32 q10, q5, q10 @ next counter - - @ Borrow prologue from _bsaes_encrypt8 to use the opportunity - @ to flip byte order in 32-bit counter - - vldmia sp, {q9} @ load round0 key -#ifndef BSAES_ASM_EXTENDED_KEY - add r4, sp, #0x10 @ pass next round key -#else - add r4, r3, #264 -#endif - vldmia r8, {q8} @ .LREVM0SR - mov r5, r10 @ pass rounds - vstmia r9, {q10} @ save next counter -#ifdef __APPLE__ - mov r6, #:lower16:(.LREVM0SR-.LSR) - sub r6, r8, r6 -#else - sub r6, r8, #.LREVM0SR-.LSR @ pass constants -#endif - - bl _bsaes_encrypt8_alt - - subs r2, r2, #8 - blo .Lctr_enc_loop_done - - vld1.8 {q8,q9}, [r0]! @ load input - vld1.8 {q10,q11}, [r0]! - veor q0, q8 - veor q1, q9 - vld1.8 {q12,q13}, [r0]! - veor q4, q10 - veor q6, q11 - vld1.8 {q14,q15}, [r0]! - veor q3, q12 - vst1.8 {q0,q1}, [r1]! @ write output - veor q7, q13 - veor q2, q14 - vst1.8 {q4}, [r1]! - veor q5, q15 - vst1.8 {q6}, [r1]! - vmov.i32 q8, #1 @ compose 1<<96 - vst1.8 {q3}, [r1]! - veor q9, q9, q9 - vst1.8 {q7}, [r1]! - vext.8 q8, q9, q8, #4 - vst1.8 {q2}, [r1]! - vadd.u32 q9,q8,q8 @ compose 2<<96 - vst1.8 {q5}, [r1]! - vldmia r9, {q0} @ load counter - - bne .Lctr_enc_loop - b .Lctr_enc_done - -.align 4 -.Lctr_enc_loop_done: - add r2, r2, #8 - vld1.8 {q8}, [r0]! @ load input - veor q0, q8 - vst1.8 {q0}, [r1]! @ write output - cmp r2, #2 - blo .Lctr_enc_done - vld1.8 {q9}, [r0]! - veor q1, q9 - vst1.8 {q1}, [r1]! - beq .Lctr_enc_done - vld1.8 {q10}, [r0]! - veor q4, q10 - vst1.8 {q4}, [r1]! - cmp r2, #4 - blo .Lctr_enc_done - vld1.8 {q11}, [r0]! - veor q6, q11 - vst1.8 {q6}, [r1]! - beq .Lctr_enc_done - vld1.8 {q12}, [r0]! - veor q3, q12 - vst1.8 {q3}, [r1]! - cmp r2, #6 - blo .Lctr_enc_done - vld1.8 {q13}, [r0]! - veor q7, q13 - vst1.8 {q7}, [r1]! - beq .Lctr_enc_done - vld1.8 {q14}, [r0] - veor q2, q14 - vst1.8 {q2}, [r1]! - -.Lctr_enc_done: - vmov.i32 q0, #0 - vmov.i32 q1, #0 -#ifndef BSAES_ASM_EXTENDED_KEY -.Lctr_enc_bzero:@ wipe key schedule [if any] - vstmia sp!, {q0,q1} - cmp sp, r9 - bne .Lctr_enc_bzero -#else - vstmia sp, {q0,q1} -#endif - - mov sp, r9 - add sp, #0x10 @ add sp,r9,#0x10 is no good for thumb - VFP_ABI_POP - ldmia sp!, {r4,r5,r6,r7,r8,r9,r10, pc} @ return - - @ OpenSSL contains aes_nohw_* fallback code here. We patch this - @ out to retain a constant-time implementation. -.size GFp_bsaes_ctr32_encrypt_blocks,.-GFp_bsaes_ctr32_encrypt_blocks -#endif -#endif -#endif // !OPENSSL_NO_ASM -.section .note.GNU-stack,"",%progbits diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/chacha20_poly1305_x86_64-elf.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/chacha20_poly1305_x86_64-elf.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/chacha20_poly1305_x86_64-elf.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/chacha20_poly1305_x86_64-elf.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,8918 +0,0 @@ -# This file is generated from a similarly-named Perl script in the BoringSSL -# source tree. Do not edit by hand. - -#if defined(__has_feature) -#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) -#define OPENSSL_NO_ASM -#endif -#endif - -#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) -.text -.extern GFp_ia32cap_P -.hidden GFp_ia32cap_P - -chacha20_poly1305_constants: - -.align 64 -.Lchacha20_consts: -.byte 'e','x','p','a','n','d',' ','3','2','-','b','y','t','e',' ','k' -.byte 'e','x','p','a','n','d',' ','3','2','-','b','y','t','e',' ','k' -.Lrol8: -.byte 3,0,1,2, 7,4,5,6, 11,8,9,10, 15,12,13,14 -.byte 3,0,1,2, 7,4,5,6, 11,8,9,10, 15,12,13,14 -.Lrol16: -.byte 2,3,0,1, 6,7,4,5, 10,11,8,9, 14,15,12,13 -.byte 2,3,0,1, 6,7,4,5, 10,11,8,9, 14,15,12,13 -.Lavx2_init: -.long 0,0,0,0 -.Lsse_inc: -.long 1,0,0,0 -.Lavx2_inc: -.long 2,0,0,0,2,0,0,0 -.Lclamp: -.quad 0x0FFFFFFC0FFFFFFF, 0x0FFFFFFC0FFFFFFC -.quad 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF -.align 16 -.Land_masks: -.byte 0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 -.byte 0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 -.byte 0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 -.byte 0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 -.byte 0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 -.byte 0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 -.byte 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 -.byte 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 -.byte 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00 -.byte 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00 -.byte 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00 -.byte 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00 -.byte 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00 -.byte 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00 -.byte 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00 -.byte 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff - -.type poly_hash_ad_internal,@function -.align 64 -poly_hash_ad_internal: -.cfi_startproc -.cfi_def_cfa rsp, 8 - xorq %r10,%r10 - xorq %r11,%r11 - xorq %r12,%r12 - cmpq $13,%r8 - jne .Lhash_ad_loop -.Lpoly_fast_tls_ad: - - movq (%rcx),%r10 - movq 5(%rcx),%r11 - shrq $24,%r11 - movq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - .byte 0xf3,0xc3 -.Lhash_ad_loop: - - cmpq $16,%r8 - jb .Lhash_ad_tail - addq 0+0(%rcx),%r10 - adcq 8+0(%rcx),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - leaq 16(%rcx),%rcx - subq $16,%r8 - jmp .Lhash_ad_loop -.Lhash_ad_tail: - cmpq $0,%r8 - je .Lhash_ad_done - - xorq %r13,%r13 - xorq %r14,%r14 - xorq %r15,%r15 - addq %r8,%rcx -.Lhash_ad_tail_loop: - shldq $8,%r13,%r14 - shlq $8,%r13 - movzbq -1(%rcx),%r15 - xorq %r15,%r13 - decq %rcx - decq %r8 - jne .Lhash_ad_tail_loop - - addq %r13,%r10 - adcq %r14,%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - -.Lhash_ad_done: - .byte 0xf3,0xc3 -.cfi_endproc -.size poly_hash_ad_internal, .-poly_hash_ad_internal - -.globl GFp_chacha20_poly1305_open -.hidden GFp_chacha20_poly1305_open -.type GFp_chacha20_poly1305_open,@function -.align 64 -GFp_chacha20_poly1305_open: -.cfi_startproc - pushq %rbp -.cfi_adjust_cfa_offset 8 -.cfi_offset %rbp,-16 - pushq %rbx -.cfi_adjust_cfa_offset 8 -.cfi_offset %rbx,-24 - pushq %r12 -.cfi_adjust_cfa_offset 8 -.cfi_offset %r12,-32 - pushq %r13 -.cfi_adjust_cfa_offset 8 -.cfi_offset %r13,-40 - pushq %r14 -.cfi_adjust_cfa_offset 8 -.cfi_offset %r14,-48 - pushq %r15 -.cfi_adjust_cfa_offset 8 -.cfi_offset %r15,-56 - - - pushq %r9 -.cfi_adjust_cfa_offset 8 -.cfi_offset %r9,-64 - subq $288 + 0 + 32,%rsp -.cfi_adjust_cfa_offset 288 + 32 - - leaq 32(%rsp),%rbp - andq $-32,%rbp - - movq %rdx,%rbx - movq %r8,0+0+32(%rbp) - movq %rbx,8+0+32(%rbp) - - movl GFp_ia32cap_P+8(%rip),%eax - andl $288,%eax - xorl $288,%eax - jz chacha20_poly1305_open_avx2 - - cmpq $128,%rbx - jbe .Lopen_sse_128 - - movdqa .Lchacha20_consts(%rip),%xmm0 - movdqu 0(%r9),%xmm4 - movdqu 16(%r9),%xmm8 - movdqu 32(%r9),%xmm12 - - movdqa %xmm12,%xmm7 - - movdqa %xmm4,0+48(%rbp) - movdqa %xmm8,0+64(%rbp) - movdqa %xmm12,0+96(%rbp) - movq $10,%r10 -.Lopen_sse_init_rounds: - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb .Lrol16(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm4 - pxor %xmm3,%xmm4 - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb .Lrol8(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm4 - pxor %xmm3,%xmm4 -.byte 102,15,58,15,228,4 -.byte 102,69,15,58,15,192,8 -.byte 102,69,15,58,15,228,12 - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb .Lrol16(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm4 - pxor %xmm3,%xmm4 - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb .Lrol8(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm4 - pxor %xmm3,%xmm4 -.byte 102,15,58,15,228,12 -.byte 102,69,15,58,15,192,8 -.byte 102,69,15,58,15,228,4 - - decq %r10 - jne .Lopen_sse_init_rounds - - paddd .Lchacha20_consts(%rip),%xmm0 - paddd 0+48(%rbp),%xmm4 - - pand .Lclamp(%rip),%xmm0 - movdqa %xmm0,0+0(%rbp) - movdqa %xmm4,0+16(%rbp) - - movq %r8,%r8 - call poly_hash_ad_internal -.Lopen_sse_main_loop: - cmpq $256,%rbx - jb .Lopen_sse_tail - - movdqa .Lchacha20_consts(%rip),%xmm0 - movdqa 0+48(%rbp),%xmm4 - movdqa 0+64(%rbp),%xmm8 - movdqa %xmm0,%xmm1 - movdqa %xmm4,%xmm5 - movdqa %xmm8,%xmm9 - movdqa %xmm0,%xmm2 - movdqa %xmm4,%xmm6 - movdqa %xmm8,%xmm10 - movdqa %xmm0,%xmm3 - movdqa %xmm4,%xmm7 - movdqa %xmm8,%xmm11 - movdqa 0+96(%rbp),%xmm15 - paddd .Lsse_inc(%rip),%xmm15 - movdqa %xmm15,%xmm14 - paddd .Lsse_inc(%rip),%xmm14 - movdqa %xmm14,%xmm13 - paddd .Lsse_inc(%rip),%xmm13 - movdqa %xmm13,%xmm12 - paddd .Lsse_inc(%rip),%xmm12 - movdqa %xmm12,0+96(%rbp) - movdqa %xmm13,0+112(%rbp) - movdqa %xmm14,0+128(%rbp) - movdqa %xmm15,0+144(%rbp) - - - - movq $4,%rcx - movq %rsi,%r8 -.Lopen_sse_main_loop_rounds: - movdqa %xmm8,0+80(%rbp) - movdqa .Lrol16(%rip),%xmm8 - paddd %xmm7,%xmm3 - paddd %xmm6,%xmm2 - paddd %xmm5,%xmm1 - paddd %xmm4,%xmm0 - pxor %xmm3,%xmm15 - pxor %xmm2,%xmm14 - pxor %xmm1,%xmm13 - pxor %xmm0,%xmm12 -.byte 102,69,15,56,0,248 -.byte 102,69,15,56,0,240 -.byte 102,69,15,56,0,232 -.byte 102,69,15,56,0,224 - movdqa 0+80(%rbp),%xmm8 - paddd %xmm15,%xmm11 - paddd %xmm14,%xmm10 - paddd %xmm13,%xmm9 - paddd %xmm12,%xmm8 - pxor %xmm11,%xmm7 - addq 0+0(%r8),%r10 - adcq 8+0(%r8),%r11 - adcq $1,%r12 - - leaq 16(%r8),%r8 - pxor %xmm10,%xmm6 - pxor %xmm9,%xmm5 - pxor %xmm8,%xmm4 - movdqa %xmm8,0+80(%rbp) - movdqa %xmm7,%xmm8 - psrld $20,%xmm8 - pslld $32-20,%xmm7 - pxor %xmm8,%xmm7 - movdqa %xmm6,%xmm8 - psrld $20,%xmm8 - pslld $32-20,%xmm6 - pxor %xmm8,%xmm6 - movdqa %xmm5,%xmm8 - psrld $20,%xmm8 - pslld $32-20,%xmm5 - pxor %xmm8,%xmm5 - movdqa %xmm4,%xmm8 - psrld $20,%xmm8 - pslld $32-20,%xmm4 - pxor %xmm8,%xmm4 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movdqa .Lrol8(%rip),%xmm8 - paddd %xmm7,%xmm3 - paddd %xmm6,%xmm2 - paddd %xmm5,%xmm1 - paddd %xmm4,%xmm0 - pxor %xmm3,%xmm15 - pxor %xmm2,%xmm14 - pxor %xmm1,%xmm13 - pxor %xmm0,%xmm12 -.byte 102,69,15,56,0,248 -.byte 102,69,15,56,0,240 -.byte 102,69,15,56,0,232 -.byte 102,69,15,56,0,224 - movdqa 0+80(%rbp),%xmm8 - paddd %xmm15,%xmm11 - paddd %xmm14,%xmm10 - paddd %xmm13,%xmm9 - paddd %xmm12,%xmm8 - pxor %xmm11,%xmm7 - pxor %xmm10,%xmm6 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - pxor %xmm9,%xmm5 - pxor %xmm8,%xmm4 - movdqa %xmm8,0+80(%rbp) - movdqa %xmm7,%xmm8 - psrld $25,%xmm8 - pslld $32-25,%xmm7 - pxor %xmm8,%xmm7 - movdqa %xmm6,%xmm8 - psrld $25,%xmm8 - pslld $32-25,%xmm6 - pxor %xmm8,%xmm6 - movdqa %xmm5,%xmm8 - psrld $25,%xmm8 - pslld $32-25,%xmm5 - pxor %xmm8,%xmm5 - movdqa %xmm4,%xmm8 - psrld $25,%xmm8 - pslld $32-25,%xmm4 - pxor %xmm8,%xmm4 - movdqa 0+80(%rbp),%xmm8 - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 -.byte 102,15,58,15,255,4 -.byte 102,69,15,58,15,219,8 -.byte 102,69,15,58,15,255,12 -.byte 102,15,58,15,246,4 -.byte 102,69,15,58,15,210,8 -.byte 102,69,15,58,15,246,12 -.byte 102,15,58,15,237,4 -.byte 102,69,15,58,15,201,8 -.byte 102,69,15,58,15,237,12 -.byte 102,15,58,15,228,4 -.byte 102,69,15,58,15,192,8 -.byte 102,69,15,58,15,228,12 - movdqa %xmm8,0+80(%rbp) - movdqa .Lrol16(%rip),%xmm8 - paddd %xmm7,%xmm3 - paddd %xmm6,%xmm2 - paddd %xmm5,%xmm1 - paddd %xmm4,%xmm0 - pxor %xmm3,%xmm15 - pxor %xmm2,%xmm14 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - pxor %xmm1,%xmm13 - pxor %xmm0,%xmm12 -.byte 102,69,15,56,0,248 -.byte 102,69,15,56,0,240 -.byte 102,69,15,56,0,232 -.byte 102,69,15,56,0,224 - movdqa 0+80(%rbp),%xmm8 - paddd %xmm15,%xmm11 - paddd %xmm14,%xmm10 - paddd %xmm13,%xmm9 - paddd %xmm12,%xmm8 - pxor %xmm11,%xmm7 - pxor %xmm10,%xmm6 - pxor %xmm9,%xmm5 - pxor %xmm8,%xmm4 - movdqa %xmm8,0+80(%rbp) - movdqa %xmm7,%xmm8 - psrld $20,%xmm8 - pslld $32-20,%xmm7 - pxor %xmm8,%xmm7 - movdqa %xmm6,%xmm8 - psrld $20,%xmm8 - pslld $32-20,%xmm6 - pxor %xmm8,%xmm6 - movdqa %xmm5,%xmm8 - psrld $20,%xmm8 - pslld $32-20,%xmm5 - pxor %xmm8,%xmm5 - movdqa %xmm4,%xmm8 - psrld $20,%xmm8 - pslld $32-20,%xmm4 - pxor %xmm8,%xmm4 - movdqa .Lrol8(%rip),%xmm8 - paddd %xmm7,%xmm3 - paddd %xmm6,%xmm2 - paddd %xmm5,%xmm1 - paddd %xmm4,%xmm0 - pxor %xmm3,%xmm15 - pxor %xmm2,%xmm14 - pxor %xmm1,%xmm13 - pxor %xmm0,%xmm12 -.byte 102,69,15,56,0,248 -.byte 102,69,15,56,0,240 -.byte 102,69,15,56,0,232 -.byte 102,69,15,56,0,224 - movdqa 0+80(%rbp),%xmm8 - paddd %xmm15,%xmm11 - paddd %xmm14,%xmm10 - paddd %xmm13,%xmm9 - paddd %xmm12,%xmm8 - pxor %xmm11,%xmm7 - pxor %xmm10,%xmm6 - pxor %xmm9,%xmm5 - pxor %xmm8,%xmm4 - movdqa %xmm8,0+80(%rbp) - movdqa %xmm7,%xmm8 - psrld $25,%xmm8 - pslld $32-25,%xmm7 - pxor %xmm8,%xmm7 - movdqa %xmm6,%xmm8 - psrld $25,%xmm8 - pslld $32-25,%xmm6 - pxor %xmm8,%xmm6 - movdqa %xmm5,%xmm8 - psrld $25,%xmm8 - pslld $32-25,%xmm5 - pxor %xmm8,%xmm5 - movdqa %xmm4,%xmm8 - psrld $25,%xmm8 - pslld $32-25,%xmm4 - pxor %xmm8,%xmm4 - movdqa 0+80(%rbp),%xmm8 -.byte 102,15,58,15,255,12 -.byte 102,69,15,58,15,219,8 -.byte 102,69,15,58,15,255,4 -.byte 102,15,58,15,246,12 -.byte 102,69,15,58,15,210,8 -.byte 102,69,15,58,15,246,4 -.byte 102,15,58,15,237,12 -.byte 102,69,15,58,15,201,8 -.byte 102,69,15,58,15,237,4 -.byte 102,15,58,15,228,12 -.byte 102,69,15,58,15,192,8 -.byte 102,69,15,58,15,228,4 - - decq %rcx - jge .Lopen_sse_main_loop_rounds - addq 0+0(%r8),%r10 - adcq 8+0(%r8),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - leaq 16(%r8),%r8 - cmpq $-6,%rcx - jg .Lopen_sse_main_loop_rounds - paddd .Lchacha20_consts(%rip),%xmm3 - paddd 0+48(%rbp),%xmm7 - paddd 0+64(%rbp),%xmm11 - paddd 0+144(%rbp),%xmm15 - paddd .Lchacha20_consts(%rip),%xmm2 - paddd 0+48(%rbp),%xmm6 - paddd 0+64(%rbp),%xmm10 - paddd 0+128(%rbp),%xmm14 - paddd .Lchacha20_consts(%rip),%xmm1 - paddd 0+48(%rbp),%xmm5 - paddd 0+64(%rbp),%xmm9 - paddd 0+112(%rbp),%xmm13 - paddd .Lchacha20_consts(%rip),%xmm0 - paddd 0+48(%rbp),%xmm4 - paddd 0+64(%rbp),%xmm8 - paddd 0+96(%rbp),%xmm12 - movdqa %xmm12,0+80(%rbp) - movdqu 0 + 0(%rsi),%xmm12 - pxor %xmm3,%xmm12 - movdqu %xmm12,0 + 0(%rdi) - movdqu 16 + 0(%rsi),%xmm12 - pxor %xmm7,%xmm12 - movdqu %xmm12,16 + 0(%rdi) - movdqu 32 + 0(%rsi),%xmm12 - pxor %xmm11,%xmm12 - movdqu %xmm12,32 + 0(%rdi) - movdqu 48 + 0(%rsi),%xmm12 - pxor %xmm15,%xmm12 - movdqu %xmm12,48 + 0(%rdi) - movdqu 0 + 64(%rsi),%xmm3 - movdqu 16 + 64(%rsi),%xmm7 - movdqu 32 + 64(%rsi),%xmm11 - movdqu 48 + 64(%rsi),%xmm15 - pxor %xmm3,%xmm2 - pxor %xmm7,%xmm6 - pxor %xmm11,%xmm10 - pxor %xmm14,%xmm15 - movdqu %xmm2,0 + 64(%rdi) - movdqu %xmm6,16 + 64(%rdi) - movdqu %xmm10,32 + 64(%rdi) - movdqu %xmm15,48 + 64(%rdi) - movdqu 0 + 128(%rsi),%xmm3 - movdqu 16 + 128(%rsi),%xmm7 - movdqu 32 + 128(%rsi),%xmm11 - movdqu 48 + 128(%rsi),%xmm15 - pxor %xmm3,%xmm1 - pxor %xmm7,%xmm5 - pxor %xmm11,%xmm9 - pxor %xmm13,%xmm15 - movdqu %xmm1,0 + 128(%rdi) - movdqu %xmm5,16 + 128(%rdi) - movdqu %xmm9,32 + 128(%rdi) - movdqu %xmm15,48 + 128(%rdi) - movdqu 0 + 192(%rsi),%xmm3 - movdqu 16 + 192(%rsi),%xmm7 - movdqu 32 + 192(%rsi),%xmm11 - movdqu 48 + 192(%rsi),%xmm15 - pxor %xmm3,%xmm0 - pxor %xmm7,%xmm4 - pxor %xmm11,%xmm8 - pxor 0+80(%rbp),%xmm15 - movdqu %xmm0,0 + 192(%rdi) - movdqu %xmm4,16 + 192(%rdi) - movdqu %xmm8,32 + 192(%rdi) - movdqu %xmm15,48 + 192(%rdi) - - leaq 256(%rsi),%rsi - leaq 256(%rdi),%rdi - subq $256,%rbx - jmp .Lopen_sse_main_loop -.Lopen_sse_tail: - - testq %rbx,%rbx - jz .Lopen_sse_finalize - cmpq $192,%rbx - ja .Lopen_sse_tail_256 - cmpq $128,%rbx - ja .Lopen_sse_tail_192 - cmpq $64,%rbx - ja .Lopen_sse_tail_128 - movdqa .Lchacha20_consts(%rip),%xmm0 - movdqa 0+48(%rbp),%xmm4 - movdqa 0+64(%rbp),%xmm8 - movdqa 0+96(%rbp),%xmm12 - paddd .Lsse_inc(%rip),%xmm12 - movdqa %xmm12,0+96(%rbp) - - xorq %r8,%r8 - movq %rbx,%rcx - cmpq $16,%rcx - jb .Lopen_sse_tail_64_rounds -.Lopen_sse_tail_64_rounds_and_x1hash: - addq 0+0(%rsi,%r8,1),%r10 - adcq 8+0(%rsi,%r8,1),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - subq $16,%rcx -.Lopen_sse_tail_64_rounds: - addq $16,%r8 - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb .Lrol16(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm4 - pxor %xmm3,%xmm4 - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb .Lrol8(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm4 - pxor %xmm3,%xmm4 -.byte 102,15,58,15,228,4 -.byte 102,69,15,58,15,192,8 -.byte 102,69,15,58,15,228,12 - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb .Lrol16(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm4 - pxor %xmm3,%xmm4 - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb .Lrol8(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm4 - pxor %xmm3,%xmm4 -.byte 102,15,58,15,228,12 -.byte 102,69,15,58,15,192,8 -.byte 102,69,15,58,15,228,4 - - cmpq $16,%rcx - jae .Lopen_sse_tail_64_rounds_and_x1hash - cmpq $160,%r8 - jne .Lopen_sse_tail_64_rounds - paddd .Lchacha20_consts(%rip),%xmm0 - paddd 0+48(%rbp),%xmm4 - paddd 0+64(%rbp),%xmm8 - paddd 0+96(%rbp),%xmm12 - - jmp .Lopen_sse_tail_64_dec_loop - -.Lopen_sse_tail_128: - movdqa .Lchacha20_consts(%rip),%xmm0 - movdqa 0+48(%rbp),%xmm4 - movdqa 0+64(%rbp),%xmm8 - movdqa %xmm0,%xmm1 - movdqa %xmm4,%xmm5 - movdqa %xmm8,%xmm9 - movdqa 0+96(%rbp),%xmm13 - paddd .Lsse_inc(%rip),%xmm13 - movdqa %xmm13,%xmm12 - paddd .Lsse_inc(%rip),%xmm12 - movdqa %xmm12,0+96(%rbp) - movdqa %xmm13,0+112(%rbp) - - movq %rbx,%rcx - andq $-16,%rcx - xorq %r8,%r8 -.Lopen_sse_tail_128_rounds_and_x1hash: - addq 0+0(%rsi,%r8,1),%r10 - adcq 8+0(%rsi,%r8,1),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - -.Lopen_sse_tail_128_rounds: - addq $16,%r8 - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb .Lrol16(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm4 - pxor %xmm3,%xmm4 - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb .Lrol8(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm4 - pxor %xmm3,%xmm4 -.byte 102,15,58,15,228,4 -.byte 102,69,15,58,15,192,8 -.byte 102,69,15,58,15,228,12 - paddd %xmm5,%xmm1 - pxor %xmm1,%xmm13 - pshufb .Lrol16(%rip),%xmm13 - paddd %xmm13,%xmm9 - pxor %xmm9,%xmm5 - movdqa %xmm5,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm5 - pxor %xmm3,%xmm5 - paddd %xmm5,%xmm1 - pxor %xmm1,%xmm13 - pshufb .Lrol8(%rip),%xmm13 - paddd %xmm13,%xmm9 - pxor %xmm9,%xmm5 - movdqa %xmm5,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm5 - pxor %xmm3,%xmm5 -.byte 102,15,58,15,237,4 -.byte 102,69,15,58,15,201,8 -.byte 102,69,15,58,15,237,12 - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb .Lrol16(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm4 - pxor %xmm3,%xmm4 - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb .Lrol8(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm4 - pxor %xmm3,%xmm4 -.byte 102,15,58,15,228,12 -.byte 102,69,15,58,15,192,8 -.byte 102,69,15,58,15,228,4 - paddd %xmm5,%xmm1 - pxor %xmm1,%xmm13 - pshufb .Lrol16(%rip),%xmm13 - paddd %xmm13,%xmm9 - pxor %xmm9,%xmm5 - movdqa %xmm5,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm5 - pxor %xmm3,%xmm5 - paddd %xmm5,%xmm1 - pxor %xmm1,%xmm13 - pshufb .Lrol8(%rip),%xmm13 - paddd %xmm13,%xmm9 - pxor %xmm9,%xmm5 - movdqa %xmm5,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm5 - pxor %xmm3,%xmm5 -.byte 102,15,58,15,237,12 -.byte 102,69,15,58,15,201,8 -.byte 102,69,15,58,15,237,4 - - cmpq %rcx,%r8 - jb .Lopen_sse_tail_128_rounds_and_x1hash - cmpq $160,%r8 - jne .Lopen_sse_tail_128_rounds - paddd .Lchacha20_consts(%rip),%xmm1 - paddd 0+48(%rbp),%xmm5 - paddd 0+64(%rbp),%xmm9 - paddd 0+112(%rbp),%xmm13 - paddd .Lchacha20_consts(%rip),%xmm0 - paddd 0+48(%rbp),%xmm4 - paddd 0+64(%rbp),%xmm8 - paddd 0+96(%rbp),%xmm12 - movdqu 0 + 0(%rsi),%xmm3 - movdqu 16 + 0(%rsi),%xmm7 - movdqu 32 + 0(%rsi),%xmm11 - movdqu 48 + 0(%rsi),%xmm15 - pxor %xmm3,%xmm1 - pxor %xmm7,%xmm5 - pxor %xmm11,%xmm9 - pxor %xmm13,%xmm15 - movdqu %xmm1,0 + 0(%rdi) - movdqu %xmm5,16 + 0(%rdi) - movdqu %xmm9,32 + 0(%rdi) - movdqu %xmm15,48 + 0(%rdi) - - subq $64,%rbx - leaq 64(%rsi),%rsi - leaq 64(%rdi),%rdi - jmp .Lopen_sse_tail_64_dec_loop - -.Lopen_sse_tail_192: - movdqa .Lchacha20_consts(%rip),%xmm0 - movdqa 0+48(%rbp),%xmm4 - movdqa 0+64(%rbp),%xmm8 - movdqa %xmm0,%xmm1 - movdqa %xmm4,%xmm5 - movdqa %xmm8,%xmm9 - movdqa %xmm0,%xmm2 - movdqa %xmm4,%xmm6 - movdqa %xmm8,%xmm10 - movdqa 0+96(%rbp),%xmm14 - paddd .Lsse_inc(%rip),%xmm14 - movdqa %xmm14,%xmm13 - paddd .Lsse_inc(%rip),%xmm13 - movdqa %xmm13,%xmm12 - paddd .Lsse_inc(%rip),%xmm12 - movdqa %xmm12,0+96(%rbp) - movdqa %xmm13,0+112(%rbp) - movdqa %xmm14,0+128(%rbp) - - movq %rbx,%rcx - movq $160,%r8 - cmpq $160,%rcx - cmovgq %r8,%rcx - andq $-16,%rcx - xorq %r8,%r8 -.Lopen_sse_tail_192_rounds_and_x1hash: - addq 0+0(%rsi,%r8,1),%r10 - adcq 8+0(%rsi,%r8,1),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - -.Lopen_sse_tail_192_rounds: - addq $16,%r8 - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb .Lrol16(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm4 - pxor %xmm3,%xmm4 - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb .Lrol8(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm4 - pxor %xmm3,%xmm4 -.byte 102,15,58,15,228,4 -.byte 102,69,15,58,15,192,8 -.byte 102,69,15,58,15,228,12 - paddd %xmm5,%xmm1 - pxor %xmm1,%xmm13 - pshufb .Lrol16(%rip),%xmm13 - paddd %xmm13,%xmm9 - pxor %xmm9,%xmm5 - movdqa %xmm5,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm5 - pxor %xmm3,%xmm5 - paddd %xmm5,%xmm1 - pxor %xmm1,%xmm13 - pshufb .Lrol8(%rip),%xmm13 - paddd %xmm13,%xmm9 - pxor %xmm9,%xmm5 - movdqa %xmm5,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm5 - pxor %xmm3,%xmm5 -.byte 102,15,58,15,237,4 -.byte 102,69,15,58,15,201,8 -.byte 102,69,15,58,15,237,12 - paddd %xmm6,%xmm2 - pxor %xmm2,%xmm14 - pshufb .Lrol16(%rip),%xmm14 - paddd %xmm14,%xmm10 - pxor %xmm10,%xmm6 - movdqa %xmm6,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm6 - pxor %xmm3,%xmm6 - paddd %xmm6,%xmm2 - pxor %xmm2,%xmm14 - pshufb .Lrol8(%rip),%xmm14 - paddd %xmm14,%xmm10 - pxor %xmm10,%xmm6 - movdqa %xmm6,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm6 - pxor %xmm3,%xmm6 -.byte 102,15,58,15,246,4 -.byte 102,69,15,58,15,210,8 -.byte 102,69,15,58,15,246,12 - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb .Lrol16(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm4 - pxor %xmm3,%xmm4 - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb .Lrol8(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm4 - pxor %xmm3,%xmm4 -.byte 102,15,58,15,228,12 -.byte 102,69,15,58,15,192,8 -.byte 102,69,15,58,15,228,4 - paddd %xmm5,%xmm1 - pxor %xmm1,%xmm13 - pshufb .Lrol16(%rip),%xmm13 - paddd %xmm13,%xmm9 - pxor %xmm9,%xmm5 - movdqa %xmm5,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm5 - pxor %xmm3,%xmm5 - paddd %xmm5,%xmm1 - pxor %xmm1,%xmm13 - pshufb .Lrol8(%rip),%xmm13 - paddd %xmm13,%xmm9 - pxor %xmm9,%xmm5 - movdqa %xmm5,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm5 - pxor %xmm3,%xmm5 -.byte 102,15,58,15,237,12 -.byte 102,69,15,58,15,201,8 -.byte 102,69,15,58,15,237,4 - paddd %xmm6,%xmm2 - pxor %xmm2,%xmm14 - pshufb .Lrol16(%rip),%xmm14 - paddd %xmm14,%xmm10 - pxor %xmm10,%xmm6 - movdqa %xmm6,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm6 - pxor %xmm3,%xmm6 - paddd %xmm6,%xmm2 - pxor %xmm2,%xmm14 - pshufb .Lrol8(%rip),%xmm14 - paddd %xmm14,%xmm10 - pxor %xmm10,%xmm6 - movdqa %xmm6,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm6 - pxor %xmm3,%xmm6 -.byte 102,15,58,15,246,12 -.byte 102,69,15,58,15,210,8 -.byte 102,69,15,58,15,246,4 - - cmpq %rcx,%r8 - jb .Lopen_sse_tail_192_rounds_and_x1hash - cmpq $160,%r8 - jne .Lopen_sse_tail_192_rounds - cmpq $176,%rbx - jb .Lopen_sse_tail_192_finish - addq 0+160(%rsi),%r10 - adcq 8+160(%rsi),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - cmpq $192,%rbx - jb .Lopen_sse_tail_192_finish - addq 0+176(%rsi),%r10 - adcq 8+176(%rsi),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - -.Lopen_sse_tail_192_finish: - paddd .Lchacha20_consts(%rip),%xmm2 - paddd 0+48(%rbp),%xmm6 - paddd 0+64(%rbp),%xmm10 - paddd 0+128(%rbp),%xmm14 - paddd .Lchacha20_consts(%rip),%xmm1 - paddd 0+48(%rbp),%xmm5 - paddd 0+64(%rbp),%xmm9 - paddd 0+112(%rbp),%xmm13 - paddd .Lchacha20_consts(%rip),%xmm0 - paddd 0+48(%rbp),%xmm4 - paddd 0+64(%rbp),%xmm8 - paddd 0+96(%rbp),%xmm12 - movdqu 0 + 0(%rsi),%xmm3 - movdqu 16 + 0(%rsi),%xmm7 - movdqu 32 + 0(%rsi),%xmm11 - movdqu 48 + 0(%rsi),%xmm15 - pxor %xmm3,%xmm2 - pxor %xmm7,%xmm6 - pxor %xmm11,%xmm10 - pxor %xmm14,%xmm15 - movdqu %xmm2,0 + 0(%rdi) - movdqu %xmm6,16 + 0(%rdi) - movdqu %xmm10,32 + 0(%rdi) - movdqu %xmm15,48 + 0(%rdi) - movdqu 0 + 64(%rsi),%xmm3 - movdqu 16 + 64(%rsi),%xmm7 - movdqu 32 + 64(%rsi),%xmm11 - movdqu 48 + 64(%rsi),%xmm15 - pxor %xmm3,%xmm1 - pxor %xmm7,%xmm5 - pxor %xmm11,%xmm9 - pxor %xmm13,%xmm15 - movdqu %xmm1,0 + 64(%rdi) - movdqu %xmm5,16 + 64(%rdi) - movdqu %xmm9,32 + 64(%rdi) - movdqu %xmm15,48 + 64(%rdi) - - subq $128,%rbx - leaq 128(%rsi),%rsi - leaq 128(%rdi),%rdi - jmp .Lopen_sse_tail_64_dec_loop - -.Lopen_sse_tail_256: - movdqa .Lchacha20_consts(%rip),%xmm0 - movdqa 0+48(%rbp),%xmm4 - movdqa 0+64(%rbp),%xmm8 - movdqa %xmm0,%xmm1 - movdqa %xmm4,%xmm5 - movdqa %xmm8,%xmm9 - movdqa %xmm0,%xmm2 - movdqa %xmm4,%xmm6 - movdqa %xmm8,%xmm10 - movdqa %xmm0,%xmm3 - movdqa %xmm4,%xmm7 - movdqa %xmm8,%xmm11 - movdqa 0+96(%rbp),%xmm15 - paddd .Lsse_inc(%rip),%xmm15 - movdqa %xmm15,%xmm14 - paddd .Lsse_inc(%rip),%xmm14 - movdqa %xmm14,%xmm13 - paddd .Lsse_inc(%rip),%xmm13 - movdqa %xmm13,%xmm12 - paddd .Lsse_inc(%rip),%xmm12 - movdqa %xmm12,0+96(%rbp) - movdqa %xmm13,0+112(%rbp) - movdqa %xmm14,0+128(%rbp) - movdqa %xmm15,0+144(%rbp) - - xorq %r8,%r8 -.Lopen_sse_tail_256_rounds_and_x1hash: - addq 0+0(%rsi,%r8,1),%r10 - adcq 8+0(%rsi,%r8,1),%r11 - adcq $1,%r12 - movdqa %xmm11,0+80(%rbp) - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb .Lrol16(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm11 - pslld $12,%xmm11 - psrld $20,%xmm4 - pxor %xmm11,%xmm4 - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb .Lrol8(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm11 - pslld $7,%xmm11 - psrld $25,%xmm4 - pxor %xmm11,%xmm4 -.byte 102,15,58,15,228,4 -.byte 102,69,15,58,15,192,8 -.byte 102,69,15,58,15,228,12 - paddd %xmm5,%xmm1 - pxor %xmm1,%xmm13 - pshufb .Lrol16(%rip),%xmm13 - paddd %xmm13,%xmm9 - pxor %xmm9,%xmm5 - movdqa %xmm5,%xmm11 - pslld $12,%xmm11 - psrld $20,%xmm5 - pxor %xmm11,%xmm5 - paddd %xmm5,%xmm1 - pxor %xmm1,%xmm13 - pshufb .Lrol8(%rip),%xmm13 - paddd %xmm13,%xmm9 - pxor %xmm9,%xmm5 - movdqa %xmm5,%xmm11 - pslld $7,%xmm11 - psrld $25,%xmm5 - pxor %xmm11,%xmm5 -.byte 102,15,58,15,237,4 -.byte 102,69,15,58,15,201,8 -.byte 102,69,15,58,15,237,12 - paddd %xmm6,%xmm2 - pxor %xmm2,%xmm14 - pshufb .Lrol16(%rip),%xmm14 - paddd %xmm14,%xmm10 - pxor %xmm10,%xmm6 - movdqa %xmm6,%xmm11 - pslld $12,%xmm11 - psrld $20,%xmm6 - pxor %xmm11,%xmm6 - paddd %xmm6,%xmm2 - pxor %xmm2,%xmm14 - pshufb .Lrol8(%rip),%xmm14 - paddd %xmm14,%xmm10 - pxor %xmm10,%xmm6 - movdqa %xmm6,%xmm11 - pslld $7,%xmm11 - psrld $25,%xmm6 - pxor %xmm11,%xmm6 -.byte 102,15,58,15,246,4 -.byte 102,69,15,58,15,210,8 -.byte 102,69,15,58,15,246,12 - movdqa 0+80(%rbp),%xmm11 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movdqa %xmm9,0+80(%rbp) - paddd %xmm7,%xmm3 - pxor %xmm3,%xmm15 - pshufb .Lrol16(%rip),%xmm15 - paddd %xmm15,%xmm11 - pxor %xmm11,%xmm7 - movdqa %xmm7,%xmm9 - pslld $12,%xmm9 - psrld $20,%xmm7 - pxor %xmm9,%xmm7 - paddd %xmm7,%xmm3 - pxor %xmm3,%xmm15 - pshufb .Lrol8(%rip),%xmm15 - paddd %xmm15,%xmm11 - pxor %xmm11,%xmm7 - movdqa %xmm7,%xmm9 - pslld $7,%xmm9 - psrld $25,%xmm7 - pxor %xmm9,%xmm7 -.byte 102,15,58,15,255,4 -.byte 102,69,15,58,15,219,8 -.byte 102,69,15,58,15,255,12 - movdqa 0+80(%rbp),%xmm9 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - movdqa %xmm11,0+80(%rbp) - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb .Lrol16(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm11 - pslld $12,%xmm11 - psrld $20,%xmm4 - pxor %xmm11,%xmm4 - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb .Lrol8(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm11 - pslld $7,%xmm11 - psrld $25,%xmm4 - pxor %xmm11,%xmm4 -.byte 102,15,58,15,228,12 -.byte 102,69,15,58,15,192,8 -.byte 102,69,15,58,15,228,4 - paddd %xmm5,%xmm1 - pxor %xmm1,%xmm13 - pshufb .Lrol16(%rip),%xmm13 - paddd %xmm13,%xmm9 - pxor %xmm9,%xmm5 - movdqa %xmm5,%xmm11 - pslld $12,%xmm11 - psrld $20,%xmm5 - pxor %xmm11,%xmm5 - paddd %xmm5,%xmm1 - pxor %xmm1,%xmm13 - pshufb .Lrol8(%rip),%xmm13 - paddd %xmm13,%xmm9 - pxor %xmm9,%xmm5 - movdqa %xmm5,%xmm11 - pslld $7,%xmm11 - psrld $25,%xmm5 - pxor %xmm11,%xmm5 -.byte 102,15,58,15,237,12 -.byte 102,69,15,58,15,201,8 -.byte 102,69,15,58,15,237,4 - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - paddd %xmm6,%xmm2 - pxor %xmm2,%xmm14 - pshufb .Lrol16(%rip),%xmm14 - paddd %xmm14,%xmm10 - pxor %xmm10,%xmm6 - movdqa %xmm6,%xmm11 - pslld $12,%xmm11 - psrld $20,%xmm6 - pxor %xmm11,%xmm6 - paddd %xmm6,%xmm2 - pxor %xmm2,%xmm14 - pshufb .Lrol8(%rip),%xmm14 - paddd %xmm14,%xmm10 - pxor %xmm10,%xmm6 - movdqa %xmm6,%xmm11 - pslld $7,%xmm11 - psrld $25,%xmm6 - pxor %xmm11,%xmm6 -.byte 102,15,58,15,246,12 -.byte 102,69,15,58,15,210,8 -.byte 102,69,15,58,15,246,4 - movdqa 0+80(%rbp),%xmm11 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - movdqa %xmm9,0+80(%rbp) - paddd %xmm7,%xmm3 - pxor %xmm3,%xmm15 - pshufb .Lrol16(%rip),%xmm15 - paddd %xmm15,%xmm11 - pxor %xmm11,%xmm7 - movdqa %xmm7,%xmm9 - pslld $12,%xmm9 - psrld $20,%xmm7 - pxor %xmm9,%xmm7 - paddd %xmm7,%xmm3 - pxor %xmm3,%xmm15 - pshufb .Lrol8(%rip),%xmm15 - paddd %xmm15,%xmm11 - pxor %xmm11,%xmm7 - movdqa %xmm7,%xmm9 - pslld $7,%xmm9 - psrld $25,%xmm7 - pxor %xmm9,%xmm7 -.byte 102,15,58,15,255,12 -.byte 102,69,15,58,15,219,8 -.byte 102,69,15,58,15,255,4 - movdqa 0+80(%rbp),%xmm9 - - addq $16,%r8 - cmpq $160,%r8 - jb .Lopen_sse_tail_256_rounds_and_x1hash - - movq %rbx,%rcx - andq $-16,%rcx -.Lopen_sse_tail_256_hash: - addq 0+0(%rsi,%r8,1),%r10 - adcq 8+0(%rsi,%r8,1),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - addq $16,%r8 - cmpq %rcx,%r8 - jb .Lopen_sse_tail_256_hash - paddd .Lchacha20_consts(%rip),%xmm3 - paddd 0+48(%rbp),%xmm7 - paddd 0+64(%rbp),%xmm11 - paddd 0+144(%rbp),%xmm15 - paddd .Lchacha20_consts(%rip),%xmm2 - paddd 0+48(%rbp),%xmm6 - paddd 0+64(%rbp),%xmm10 - paddd 0+128(%rbp),%xmm14 - paddd .Lchacha20_consts(%rip),%xmm1 - paddd 0+48(%rbp),%xmm5 - paddd 0+64(%rbp),%xmm9 - paddd 0+112(%rbp),%xmm13 - paddd .Lchacha20_consts(%rip),%xmm0 - paddd 0+48(%rbp),%xmm4 - paddd 0+64(%rbp),%xmm8 - paddd 0+96(%rbp),%xmm12 - movdqa %xmm12,0+80(%rbp) - movdqu 0 + 0(%rsi),%xmm12 - pxor %xmm3,%xmm12 - movdqu %xmm12,0 + 0(%rdi) - movdqu 16 + 0(%rsi),%xmm12 - pxor %xmm7,%xmm12 - movdqu %xmm12,16 + 0(%rdi) - movdqu 32 + 0(%rsi),%xmm12 - pxor %xmm11,%xmm12 - movdqu %xmm12,32 + 0(%rdi) - movdqu 48 + 0(%rsi),%xmm12 - pxor %xmm15,%xmm12 - movdqu %xmm12,48 + 0(%rdi) - movdqu 0 + 64(%rsi),%xmm3 - movdqu 16 + 64(%rsi),%xmm7 - movdqu 32 + 64(%rsi),%xmm11 - movdqu 48 + 64(%rsi),%xmm15 - pxor %xmm3,%xmm2 - pxor %xmm7,%xmm6 - pxor %xmm11,%xmm10 - pxor %xmm14,%xmm15 - movdqu %xmm2,0 + 64(%rdi) - movdqu %xmm6,16 + 64(%rdi) - movdqu %xmm10,32 + 64(%rdi) - movdqu %xmm15,48 + 64(%rdi) - movdqu 0 + 128(%rsi),%xmm3 - movdqu 16 + 128(%rsi),%xmm7 - movdqu 32 + 128(%rsi),%xmm11 - movdqu 48 + 128(%rsi),%xmm15 - pxor %xmm3,%xmm1 - pxor %xmm7,%xmm5 - pxor %xmm11,%xmm9 - pxor %xmm13,%xmm15 - movdqu %xmm1,0 + 128(%rdi) - movdqu %xmm5,16 + 128(%rdi) - movdqu %xmm9,32 + 128(%rdi) - movdqu %xmm15,48 + 128(%rdi) - - movdqa 0+80(%rbp),%xmm12 - subq $192,%rbx - leaq 192(%rsi),%rsi - leaq 192(%rdi),%rdi - - -.Lopen_sse_tail_64_dec_loop: - cmpq $16,%rbx - jb .Lopen_sse_tail_16_init - subq $16,%rbx - movdqu (%rsi),%xmm3 - pxor %xmm3,%xmm0 - movdqu %xmm0,(%rdi) - leaq 16(%rsi),%rsi - leaq 16(%rdi),%rdi - movdqa %xmm4,%xmm0 - movdqa %xmm8,%xmm4 - movdqa %xmm12,%xmm8 - jmp .Lopen_sse_tail_64_dec_loop -.Lopen_sse_tail_16_init: - movdqa %xmm0,%xmm1 - - -.Lopen_sse_tail_16: - testq %rbx,%rbx - jz .Lopen_sse_finalize - - - - pxor %xmm3,%xmm3 - leaq -1(%rsi,%rbx,1),%rsi - movq %rbx,%r8 -.Lopen_sse_tail_16_compose: - pslldq $1,%xmm3 - pinsrb $0,(%rsi),%xmm3 - subq $1,%rsi - subq $1,%r8 - jnz .Lopen_sse_tail_16_compose - -.byte 102,73,15,126,221 - pextrq $1,%xmm3,%r14 - - pxor %xmm1,%xmm3 - - -.Lopen_sse_tail_16_extract: - pextrb $0,%xmm3,(%rdi) - psrldq $1,%xmm3 - addq $1,%rdi - subq $1,%rbx - jne .Lopen_sse_tail_16_extract - - addq %r13,%r10 - adcq %r14,%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - -.Lopen_sse_finalize: - addq 0+0+32(%rbp),%r10 - adcq 8+0+32(%rbp),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - - movq %r10,%r13 - movq %r11,%r14 - movq %r12,%r15 - subq $-5,%r10 - sbbq $-1,%r11 - sbbq $3,%r12 - cmovcq %r13,%r10 - cmovcq %r14,%r11 - cmovcq %r15,%r12 - - addq 0+0+16(%rbp),%r10 - adcq 8+0+16(%rbp),%r11 - -.cfi_remember_state - addq $288 + 0 + 32,%rsp -.cfi_adjust_cfa_offset -(288 + 32) - - popq %r9 -.cfi_adjust_cfa_offset -8 -.cfi_restore %r9 - movq %r10,(%r9) - movq %r11,8(%r9) - popq %r15 -.cfi_adjust_cfa_offset -8 -.cfi_restore %r15 - popq %r14 -.cfi_adjust_cfa_offset -8 -.cfi_restore %r14 - popq %r13 -.cfi_adjust_cfa_offset -8 -.cfi_restore %r13 - popq %r12 -.cfi_adjust_cfa_offset -8 -.cfi_restore %r12 - popq %rbx -.cfi_adjust_cfa_offset -8 -.cfi_restore %rbx - popq %rbp -.cfi_adjust_cfa_offset -8 -.cfi_restore %rbp - .byte 0xf3,0xc3 - -.Lopen_sse_128: -.cfi_restore_state - movdqu .Lchacha20_consts(%rip),%xmm0 - movdqa %xmm0,%xmm1 - movdqa %xmm0,%xmm2 - movdqu 0(%r9),%xmm4 - movdqa %xmm4,%xmm5 - movdqa %xmm4,%xmm6 - movdqu 16(%r9),%xmm8 - movdqa %xmm8,%xmm9 - movdqa %xmm8,%xmm10 - movdqu 32(%r9),%xmm12 - movdqa %xmm12,%xmm13 - paddd .Lsse_inc(%rip),%xmm13 - movdqa %xmm13,%xmm14 - paddd .Lsse_inc(%rip),%xmm14 - movdqa %xmm4,%xmm7 - movdqa %xmm8,%xmm11 - movdqa %xmm13,%xmm15 - movq $10,%r10 - -.Lopen_sse_128_rounds: - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb .Lrol16(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm4 - pxor %xmm3,%xmm4 - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb .Lrol8(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm4 - pxor %xmm3,%xmm4 -.byte 102,15,58,15,228,4 -.byte 102,69,15,58,15,192,8 -.byte 102,69,15,58,15,228,12 - paddd %xmm5,%xmm1 - pxor %xmm1,%xmm13 - pshufb .Lrol16(%rip),%xmm13 - paddd %xmm13,%xmm9 - pxor %xmm9,%xmm5 - movdqa %xmm5,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm5 - pxor %xmm3,%xmm5 - paddd %xmm5,%xmm1 - pxor %xmm1,%xmm13 - pshufb .Lrol8(%rip),%xmm13 - paddd %xmm13,%xmm9 - pxor %xmm9,%xmm5 - movdqa %xmm5,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm5 - pxor %xmm3,%xmm5 -.byte 102,15,58,15,237,4 -.byte 102,69,15,58,15,201,8 -.byte 102,69,15,58,15,237,12 - paddd %xmm6,%xmm2 - pxor %xmm2,%xmm14 - pshufb .Lrol16(%rip),%xmm14 - paddd %xmm14,%xmm10 - pxor %xmm10,%xmm6 - movdqa %xmm6,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm6 - pxor %xmm3,%xmm6 - paddd %xmm6,%xmm2 - pxor %xmm2,%xmm14 - pshufb .Lrol8(%rip),%xmm14 - paddd %xmm14,%xmm10 - pxor %xmm10,%xmm6 - movdqa %xmm6,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm6 - pxor %xmm3,%xmm6 -.byte 102,15,58,15,246,4 -.byte 102,69,15,58,15,210,8 -.byte 102,69,15,58,15,246,12 - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb .Lrol16(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm4 - pxor %xmm3,%xmm4 - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb .Lrol8(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm4 - pxor %xmm3,%xmm4 -.byte 102,15,58,15,228,12 -.byte 102,69,15,58,15,192,8 -.byte 102,69,15,58,15,228,4 - paddd %xmm5,%xmm1 - pxor %xmm1,%xmm13 - pshufb .Lrol16(%rip),%xmm13 - paddd %xmm13,%xmm9 - pxor %xmm9,%xmm5 - movdqa %xmm5,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm5 - pxor %xmm3,%xmm5 - paddd %xmm5,%xmm1 - pxor %xmm1,%xmm13 - pshufb .Lrol8(%rip),%xmm13 - paddd %xmm13,%xmm9 - pxor %xmm9,%xmm5 - movdqa %xmm5,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm5 - pxor %xmm3,%xmm5 -.byte 102,15,58,15,237,12 -.byte 102,69,15,58,15,201,8 -.byte 102,69,15,58,15,237,4 - paddd %xmm6,%xmm2 - pxor %xmm2,%xmm14 - pshufb .Lrol16(%rip),%xmm14 - paddd %xmm14,%xmm10 - pxor %xmm10,%xmm6 - movdqa %xmm6,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm6 - pxor %xmm3,%xmm6 - paddd %xmm6,%xmm2 - pxor %xmm2,%xmm14 - pshufb .Lrol8(%rip),%xmm14 - paddd %xmm14,%xmm10 - pxor %xmm10,%xmm6 - movdqa %xmm6,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm6 - pxor %xmm3,%xmm6 -.byte 102,15,58,15,246,12 -.byte 102,69,15,58,15,210,8 -.byte 102,69,15,58,15,246,4 - - decq %r10 - jnz .Lopen_sse_128_rounds - paddd .Lchacha20_consts(%rip),%xmm0 - paddd .Lchacha20_consts(%rip),%xmm1 - paddd .Lchacha20_consts(%rip),%xmm2 - paddd %xmm7,%xmm4 - paddd %xmm7,%xmm5 - paddd %xmm7,%xmm6 - paddd %xmm11,%xmm9 - paddd %xmm11,%xmm10 - paddd %xmm15,%xmm13 - paddd .Lsse_inc(%rip),%xmm15 - paddd %xmm15,%xmm14 - - pand .Lclamp(%rip),%xmm0 - movdqa %xmm0,0+0(%rbp) - movdqa %xmm4,0+16(%rbp) - - movq %r8,%r8 - call poly_hash_ad_internal -.Lopen_sse_128_xor_hash: - cmpq $16,%rbx - jb .Lopen_sse_tail_16 - subq $16,%rbx - addq 0+0(%rsi),%r10 - adcq 8+0(%rsi),%r11 - adcq $1,%r12 - - - movdqu 0(%rsi),%xmm3 - pxor %xmm3,%xmm1 - movdqu %xmm1,0(%rdi) - leaq 16(%rsi),%rsi - leaq 16(%rdi),%rdi - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - - movdqa %xmm5,%xmm1 - movdqa %xmm9,%xmm5 - movdqa %xmm13,%xmm9 - movdqa %xmm2,%xmm13 - movdqa %xmm6,%xmm2 - movdqa %xmm10,%xmm6 - movdqa %xmm14,%xmm10 - jmp .Lopen_sse_128_xor_hash -.size GFp_chacha20_poly1305_open, .-GFp_chacha20_poly1305_open -.cfi_endproc - - - - - - -.globl GFp_chacha20_poly1305_seal -.hidden GFp_chacha20_poly1305_seal -.type GFp_chacha20_poly1305_seal,@function -.align 64 -GFp_chacha20_poly1305_seal: -.cfi_startproc - pushq %rbp -.cfi_adjust_cfa_offset 8 -.cfi_offset %rbp,-16 - pushq %rbx -.cfi_adjust_cfa_offset 8 -.cfi_offset %rbx,-24 - pushq %r12 -.cfi_adjust_cfa_offset 8 -.cfi_offset %r12,-32 - pushq %r13 -.cfi_adjust_cfa_offset 8 -.cfi_offset %r13,-40 - pushq %r14 -.cfi_adjust_cfa_offset 8 -.cfi_offset %r14,-48 - pushq %r15 -.cfi_adjust_cfa_offset 8 -.cfi_offset %r15,-56 - - - pushq %r9 -.cfi_adjust_cfa_offset 8 -.cfi_offset %r9,-64 - subq $288 + 0 + 32,%rsp -.cfi_adjust_cfa_offset 288 + 32 - leaq 32(%rsp),%rbp - andq $-32,%rbp - - movq 56(%r9),%rbx - addq %rdx,%rbx - movq %r8,0+0+32(%rbp) - movq %rbx,8+0+32(%rbp) - movq %rdx,%rbx - - movl GFp_ia32cap_P+8(%rip),%eax - andl $288,%eax - xorl $288,%eax - jz chacha20_poly1305_seal_avx2 - - cmpq $128,%rbx - jbe .Lseal_sse_128 - - movdqa .Lchacha20_consts(%rip),%xmm0 - movdqu 0(%r9),%xmm4 - movdqu 16(%r9),%xmm8 - movdqu 32(%r9),%xmm12 - - movdqa %xmm0,%xmm1 - movdqa %xmm0,%xmm2 - movdqa %xmm0,%xmm3 - movdqa %xmm4,%xmm5 - movdqa %xmm4,%xmm6 - movdqa %xmm4,%xmm7 - movdqa %xmm8,%xmm9 - movdqa %xmm8,%xmm10 - movdqa %xmm8,%xmm11 - movdqa %xmm12,%xmm15 - paddd .Lsse_inc(%rip),%xmm12 - movdqa %xmm12,%xmm14 - paddd .Lsse_inc(%rip),%xmm12 - movdqa %xmm12,%xmm13 - paddd .Lsse_inc(%rip),%xmm12 - - movdqa %xmm4,0+48(%rbp) - movdqa %xmm8,0+64(%rbp) - movdqa %xmm12,0+96(%rbp) - movdqa %xmm13,0+112(%rbp) - movdqa %xmm14,0+128(%rbp) - movdqa %xmm15,0+144(%rbp) - movq $10,%r10 -.Lseal_sse_init_rounds: - movdqa %xmm8,0+80(%rbp) - movdqa .Lrol16(%rip),%xmm8 - paddd %xmm7,%xmm3 - paddd %xmm6,%xmm2 - paddd %xmm5,%xmm1 - paddd %xmm4,%xmm0 - pxor %xmm3,%xmm15 - pxor %xmm2,%xmm14 - pxor %xmm1,%xmm13 - pxor %xmm0,%xmm12 -.byte 102,69,15,56,0,248 -.byte 102,69,15,56,0,240 -.byte 102,69,15,56,0,232 -.byte 102,69,15,56,0,224 - movdqa 0+80(%rbp),%xmm8 - paddd %xmm15,%xmm11 - paddd %xmm14,%xmm10 - paddd %xmm13,%xmm9 - paddd %xmm12,%xmm8 - pxor %xmm11,%xmm7 - pxor %xmm10,%xmm6 - pxor %xmm9,%xmm5 - pxor %xmm8,%xmm4 - movdqa %xmm8,0+80(%rbp) - movdqa %xmm7,%xmm8 - psrld $20,%xmm8 - pslld $32-20,%xmm7 - pxor %xmm8,%xmm7 - movdqa %xmm6,%xmm8 - psrld $20,%xmm8 - pslld $32-20,%xmm6 - pxor %xmm8,%xmm6 - movdqa %xmm5,%xmm8 - psrld $20,%xmm8 - pslld $32-20,%xmm5 - pxor %xmm8,%xmm5 - movdqa %xmm4,%xmm8 - psrld $20,%xmm8 - pslld $32-20,%xmm4 - pxor %xmm8,%xmm4 - movdqa .Lrol8(%rip),%xmm8 - paddd %xmm7,%xmm3 - paddd %xmm6,%xmm2 - paddd %xmm5,%xmm1 - paddd %xmm4,%xmm0 - pxor %xmm3,%xmm15 - pxor %xmm2,%xmm14 - pxor %xmm1,%xmm13 - pxor %xmm0,%xmm12 -.byte 102,69,15,56,0,248 -.byte 102,69,15,56,0,240 -.byte 102,69,15,56,0,232 -.byte 102,69,15,56,0,224 - movdqa 0+80(%rbp),%xmm8 - paddd %xmm15,%xmm11 - paddd %xmm14,%xmm10 - paddd %xmm13,%xmm9 - paddd %xmm12,%xmm8 - pxor %xmm11,%xmm7 - pxor %xmm10,%xmm6 - pxor %xmm9,%xmm5 - pxor %xmm8,%xmm4 - movdqa %xmm8,0+80(%rbp) - movdqa %xmm7,%xmm8 - psrld $25,%xmm8 - pslld $32-25,%xmm7 - pxor %xmm8,%xmm7 - movdqa %xmm6,%xmm8 - psrld $25,%xmm8 - pslld $32-25,%xmm6 - pxor %xmm8,%xmm6 - movdqa %xmm5,%xmm8 - psrld $25,%xmm8 - pslld $32-25,%xmm5 - pxor %xmm8,%xmm5 - movdqa %xmm4,%xmm8 - psrld $25,%xmm8 - pslld $32-25,%xmm4 - pxor %xmm8,%xmm4 - movdqa 0+80(%rbp),%xmm8 -.byte 102,15,58,15,255,4 -.byte 102,69,15,58,15,219,8 -.byte 102,69,15,58,15,255,12 -.byte 102,15,58,15,246,4 -.byte 102,69,15,58,15,210,8 -.byte 102,69,15,58,15,246,12 -.byte 102,15,58,15,237,4 -.byte 102,69,15,58,15,201,8 -.byte 102,69,15,58,15,237,12 -.byte 102,15,58,15,228,4 -.byte 102,69,15,58,15,192,8 -.byte 102,69,15,58,15,228,12 - movdqa %xmm8,0+80(%rbp) - movdqa .Lrol16(%rip),%xmm8 - paddd %xmm7,%xmm3 - paddd %xmm6,%xmm2 - paddd %xmm5,%xmm1 - paddd %xmm4,%xmm0 - pxor %xmm3,%xmm15 - pxor %xmm2,%xmm14 - pxor %xmm1,%xmm13 - pxor %xmm0,%xmm12 -.byte 102,69,15,56,0,248 -.byte 102,69,15,56,0,240 -.byte 102,69,15,56,0,232 -.byte 102,69,15,56,0,224 - movdqa 0+80(%rbp),%xmm8 - paddd %xmm15,%xmm11 - paddd %xmm14,%xmm10 - paddd %xmm13,%xmm9 - paddd %xmm12,%xmm8 - pxor %xmm11,%xmm7 - pxor %xmm10,%xmm6 - pxor %xmm9,%xmm5 - pxor %xmm8,%xmm4 - movdqa %xmm8,0+80(%rbp) - movdqa %xmm7,%xmm8 - psrld $20,%xmm8 - pslld $32-20,%xmm7 - pxor %xmm8,%xmm7 - movdqa %xmm6,%xmm8 - psrld $20,%xmm8 - pslld $32-20,%xmm6 - pxor %xmm8,%xmm6 - movdqa %xmm5,%xmm8 - psrld $20,%xmm8 - pslld $32-20,%xmm5 - pxor %xmm8,%xmm5 - movdqa %xmm4,%xmm8 - psrld $20,%xmm8 - pslld $32-20,%xmm4 - pxor %xmm8,%xmm4 - movdqa .Lrol8(%rip),%xmm8 - paddd %xmm7,%xmm3 - paddd %xmm6,%xmm2 - paddd %xmm5,%xmm1 - paddd %xmm4,%xmm0 - pxor %xmm3,%xmm15 - pxor %xmm2,%xmm14 - pxor %xmm1,%xmm13 - pxor %xmm0,%xmm12 -.byte 102,69,15,56,0,248 -.byte 102,69,15,56,0,240 -.byte 102,69,15,56,0,232 -.byte 102,69,15,56,0,224 - movdqa 0+80(%rbp),%xmm8 - paddd %xmm15,%xmm11 - paddd %xmm14,%xmm10 - paddd %xmm13,%xmm9 - paddd %xmm12,%xmm8 - pxor %xmm11,%xmm7 - pxor %xmm10,%xmm6 - pxor %xmm9,%xmm5 - pxor %xmm8,%xmm4 - movdqa %xmm8,0+80(%rbp) - movdqa %xmm7,%xmm8 - psrld $25,%xmm8 - pslld $32-25,%xmm7 - pxor %xmm8,%xmm7 - movdqa %xmm6,%xmm8 - psrld $25,%xmm8 - pslld $32-25,%xmm6 - pxor %xmm8,%xmm6 - movdqa %xmm5,%xmm8 - psrld $25,%xmm8 - pslld $32-25,%xmm5 - pxor %xmm8,%xmm5 - movdqa %xmm4,%xmm8 - psrld $25,%xmm8 - pslld $32-25,%xmm4 - pxor %xmm8,%xmm4 - movdqa 0+80(%rbp),%xmm8 -.byte 102,15,58,15,255,12 -.byte 102,69,15,58,15,219,8 -.byte 102,69,15,58,15,255,4 -.byte 102,15,58,15,246,12 -.byte 102,69,15,58,15,210,8 -.byte 102,69,15,58,15,246,4 -.byte 102,15,58,15,237,12 -.byte 102,69,15,58,15,201,8 -.byte 102,69,15,58,15,237,4 -.byte 102,15,58,15,228,12 -.byte 102,69,15,58,15,192,8 -.byte 102,69,15,58,15,228,4 - - decq %r10 - jnz .Lseal_sse_init_rounds - paddd .Lchacha20_consts(%rip),%xmm3 - paddd 0+48(%rbp),%xmm7 - paddd 0+64(%rbp),%xmm11 - paddd 0+144(%rbp),%xmm15 - paddd .Lchacha20_consts(%rip),%xmm2 - paddd 0+48(%rbp),%xmm6 - paddd 0+64(%rbp),%xmm10 - paddd 0+128(%rbp),%xmm14 - paddd .Lchacha20_consts(%rip),%xmm1 - paddd 0+48(%rbp),%xmm5 - paddd 0+64(%rbp),%xmm9 - paddd 0+112(%rbp),%xmm13 - paddd .Lchacha20_consts(%rip),%xmm0 - paddd 0+48(%rbp),%xmm4 - paddd 0+64(%rbp),%xmm8 - paddd 0+96(%rbp),%xmm12 - - - pand .Lclamp(%rip),%xmm3 - movdqa %xmm3,0+0(%rbp) - movdqa %xmm7,0+16(%rbp) - - movq %r8,%r8 - call poly_hash_ad_internal - movdqu 0 + 0(%rsi),%xmm3 - movdqu 16 + 0(%rsi),%xmm7 - movdqu 32 + 0(%rsi),%xmm11 - movdqu 48 + 0(%rsi),%xmm15 - pxor %xmm3,%xmm2 - pxor %xmm7,%xmm6 - pxor %xmm11,%xmm10 - pxor %xmm14,%xmm15 - movdqu %xmm2,0 + 0(%rdi) - movdqu %xmm6,16 + 0(%rdi) - movdqu %xmm10,32 + 0(%rdi) - movdqu %xmm15,48 + 0(%rdi) - movdqu 0 + 64(%rsi),%xmm3 - movdqu 16 + 64(%rsi),%xmm7 - movdqu 32 + 64(%rsi),%xmm11 - movdqu 48 + 64(%rsi),%xmm15 - pxor %xmm3,%xmm1 - pxor %xmm7,%xmm5 - pxor %xmm11,%xmm9 - pxor %xmm13,%xmm15 - movdqu %xmm1,0 + 64(%rdi) - movdqu %xmm5,16 + 64(%rdi) - movdqu %xmm9,32 + 64(%rdi) - movdqu %xmm15,48 + 64(%rdi) - - cmpq $192,%rbx - ja .Lseal_sse_main_init - movq $128,%rcx - subq $128,%rbx - leaq 128(%rsi),%rsi - jmp .Lseal_sse_128_tail_hash -.Lseal_sse_main_init: - movdqu 0 + 128(%rsi),%xmm3 - movdqu 16 + 128(%rsi),%xmm7 - movdqu 32 + 128(%rsi),%xmm11 - movdqu 48 + 128(%rsi),%xmm15 - pxor %xmm3,%xmm0 - pxor %xmm7,%xmm4 - pxor %xmm11,%xmm8 - pxor %xmm12,%xmm15 - movdqu %xmm0,0 + 128(%rdi) - movdqu %xmm4,16 + 128(%rdi) - movdqu %xmm8,32 + 128(%rdi) - movdqu %xmm15,48 + 128(%rdi) - - movq $192,%rcx - subq $192,%rbx - leaq 192(%rsi),%rsi - movq $2,%rcx - movq $8,%r8 - cmpq $64,%rbx - jbe .Lseal_sse_tail_64 - cmpq $128,%rbx - jbe .Lseal_sse_tail_128 - cmpq $192,%rbx - jbe .Lseal_sse_tail_192 - -.Lseal_sse_main_loop: - movdqa .Lchacha20_consts(%rip),%xmm0 - movdqa 0+48(%rbp),%xmm4 - movdqa 0+64(%rbp),%xmm8 - movdqa %xmm0,%xmm1 - movdqa %xmm4,%xmm5 - movdqa %xmm8,%xmm9 - movdqa %xmm0,%xmm2 - movdqa %xmm4,%xmm6 - movdqa %xmm8,%xmm10 - movdqa %xmm0,%xmm3 - movdqa %xmm4,%xmm7 - movdqa %xmm8,%xmm11 - movdqa 0+96(%rbp),%xmm15 - paddd .Lsse_inc(%rip),%xmm15 - movdqa %xmm15,%xmm14 - paddd .Lsse_inc(%rip),%xmm14 - movdqa %xmm14,%xmm13 - paddd .Lsse_inc(%rip),%xmm13 - movdqa %xmm13,%xmm12 - paddd .Lsse_inc(%rip),%xmm12 - movdqa %xmm12,0+96(%rbp) - movdqa %xmm13,0+112(%rbp) - movdqa %xmm14,0+128(%rbp) - movdqa %xmm15,0+144(%rbp) - -.align 32 -.Lseal_sse_main_rounds: - movdqa %xmm8,0+80(%rbp) - movdqa .Lrol16(%rip),%xmm8 - paddd %xmm7,%xmm3 - paddd %xmm6,%xmm2 - paddd %xmm5,%xmm1 - paddd %xmm4,%xmm0 - pxor %xmm3,%xmm15 - pxor %xmm2,%xmm14 - pxor %xmm1,%xmm13 - pxor %xmm0,%xmm12 -.byte 102,69,15,56,0,248 -.byte 102,69,15,56,0,240 -.byte 102,69,15,56,0,232 -.byte 102,69,15,56,0,224 - movdqa 0+80(%rbp),%xmm8 - paddd %xmm15,%xmm11 - paddd %xmm14,%xmm10 - paddd %xmm13,%xmm9 - paddd %xmm12,%xmm8 - pxor %xmm11,%xmm7 - addq 0+0(%rdi),%r10 - adcq 8+0(%rdi),%r11 - adcq $1,%r12 - pxor %xmm10,%xmm6 - pxor %xmm9,%xmm5 - pxor %xmm8,%xmm4 - movdqa %xmm8,0+80(%rbp) - movdqa %xmm7,%xmm8 - psrld $20,%xmm8 - pslld $32-20,%xmm7 - pxor %xmm8,%xmm7 - movdqa %xmm6,%xmm8 - psrld $20,%xmm8 - pslld $32-20,%xmm6 - pxor %xmm8,%xmm6 - movdqa %xmm5,%xmm8 - psrld $20,%xmm8 - pslld $32-20,%xmm5 - pxor %xmm8,%xmm5 - movdqa %xmm4,%xmm8 - psrld $20,%xmm8 - pslld $32-20,%xmm4 - pxor %xmm8,%xmm4 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movdqa .Lrol8(%rip),%xmm8 - paddd %xmm7,%xmm3 - paddd %xmm6,%xmm2 - paddd %xmm5,%xmm1 - paddd %xmm4,%xmm0 - pxor %xmm3,%xmm15 - pxor %xmm2,%xmm14 - pxor %xmm1,%xmm13 - pxor %xmm0,%xmm12 -.byte 102,69,15,56,0,248 -.byte 102,69,15,56,0,240 -.byte 102,69,15,56,0,232 -.byte 102,69,15,56,0,224 - movdqa 0+80(%rbp),%xmm8 - paddd %xmm15,%xmm11 - paddd %xmm14,%xmm10 - paddd %xmm13,%xmm9 - paddd %xmm12,%xmm8 - pxor %xmm11,%xmm7 - pxor %xmm10,%xmm6 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - pxor %xmm9,%xmm5 - pxor %xmm8,%xmm4 - movdqa %xmm8,0+80(%rbp) - movdqa %xmm7,%xmm8 - psrld $25,%xmm8 - pslld $32-25,%xmm7 - pxor %xmm8,%xmm7 - movdqa %xmm6,%xmm8 - psrld $25,%xmm8 - pslld $32-25,%xmm6 - pxor %xmm8,%xmm6 - movdqa %xmm5,%xmm8 - psrld $25,%xmm8 - pslld $32-25,%xmm5 - pxor %xmm8,%xmm5 - movdqa %xmm4,%xmm8 - psrld $25,%xmm8 - pslld $32-25,%xmm4 - pxor %xmm8,%xmm4 - movdqa 0+80(%rbp),%xmm8 - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 -.byte 102,15,58,15,255,4 -.byte 102,69,15,58,15,219,8 -.byte 102,69,15,58,15,255,12 -.byte 102,15,58,15,246,4 -.byte 102,69,15,58,15,210,8 -.byte 102,69,15,58,15,246,12 -.byte 102,15,58,15,237,4 -.byte 102,69,15,58,15,201,8 -.byte 102,69,15,58,15,237,12 -.byte 102,15,58,15,228,4 -.byte 102,69,15,58,15,192,8 -.byte 102,69,15,58,15,228,12 - movdqa %xmm8,0+80(%rbp) - movdqa .Lrol16(%rip),%xmm8 - paddd %xmm7,%xmm3 - paddd %xmm6,%xmm2 - paddd %xmm5,%xmm1 - paddd %xmm4,%xmm0 - pxor %xmm3,%xmm15 - pxor %xmm2,%xmm14 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - pxor %xmm1,%xmm13 - pxor %xmm0,%xmm12 -.byte 102,69,15,56,0,248 -.byte 102,69,15,56,0,240 -.byte 102,69,15,56,0,232 -.byte 102,69,15,56,0,224 - movdqa 0+80(%rbp),%xmm8 - paddd %xmm15,%xmm11 - paddd %xmm14,%xmm10 - paddd %xmm13,%xmm9 - paddd %xmm12,%xmm8 - pxor %xmm11,%xmm7 - pxor %xmm10,%xmm6 - pxor %xmm9,%xmm5 - pxor %xmm8,%xmm4 - movdqa %xmm8,0+80(%rbp) - movdqa %xmm7,%xmm8 - psrld $20,%xmm8 - pslld $32-20,%xmm7 - pxor %xmm8,%xmm7 - movdqa %xmm6,%xmm8 - psrld $20,%xmm8 - pslld $32-20,%xmm6 - pxor %xmm8,%xmm6 - movdqa %xmm5,%xmm8 - psrld $20,%xmm8 - pslld $32-20,%xmm5 - pxor %xmm8,%xmm5 - movdqa %xmm4,%xmm8 - psrld $20,%xmm8 - pslld $32-20,%xmm4 - pxor %xmm8,%xmm4 - movdqa .Lrol8(%rip),%xmm8 - paddd %xmm7,%xmm3 - paddd %xmm6,%xmm2 - paddd %xmm5,%xmm1 - paddd %xmm4,%xmm0 - pxor %xmm3,%xmm15 - pxor %xmm2,%xmm14 - pxor %xmm1,%xmm13 - pxor %xmm0,%xmm12 -.byte 102,69,15,56,0,248 -.byte 102,69,15,56,0,240 -.byte 102,69,15,56,0,232 -.byte 102,69,15,56,0,224 - movdqa 0+80(%rbp),%xmm8 - paddd %xmm15,%xmm11 - paddd %xmm14,%xmm10 - paddd %xmm13,%xmm9 - paddd %xmm12,%xmm8 - pxor %xmm11,%xmm7 - pxor %xmm10,%xmm6 - pxor %xmm9,%xmm5 - pxor %xmm8,%xmm4 - movdqa %xmm8,0+80(%rbp) - movdqa %xmm7,%xmm8 - psrld $25,%xmm8 - pslld $32-25,%xmm7 - pxor %xmm8,%xmm7 - movdqa %xmm6,%xmm8 - psrld $25,%xmm8 - pslld $32-25,%xmm6 - pxor %xmm8,%xmm6 - movdqa %xmm5,%xmm8 - psrld $25,%xmm8 - pslld $32-25,%xmm5 - pxor %xmm8,%xmm5 - movdqa %xmm4,%xmm8 - psrld $25,%xmm8 - pslld $32-25,%xmm4 - pxor %xmm8,%xmm4 - movdqa 0+80(%rbp),%xmm8 -.byte 102,15,58,15,255,12 -.byte 102,69,15,58,15,219,8 -.byte 102,69,15,58,15,255,4 -.byte 102,15,58,15,246,12 -.byte 102,69,15,58,15,210,8 -.byte 102,69,15,58,15,246,4 -.byte 102,15,58,15,237,12 -.byte 102,69,15,58,15,201,8 -.byte 102,69,15,58,15,237,4 -.byte 102,15,58,15,228,12 -.byte 102,69,15,58,15,192,8 -.byte 102,69,15,58,15,228,4 - - leaq 16(%rdi),%rdi - decq %r8 - jge .Lseal_sse_main_rounds - addq 0+0(%rdi),%r10 - adcq 8+0(%rdi),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - leaq 16(%rdi),%rdi - decq %rcx - jg .Lseal_sse_main_rounds - paddd .Lchacha20_consts(%rip),%xmm3 - paddd 0+48(%rbp),%xmm7 - paddd 0+64(%rbp),%xmm11 - paddd 0+144(%rbp),%xmm15 - paddd .Lchacha20_consts(%rip),%xmm2 - paddd 0+48(%rbp),%xmm6 - paddd 0+64(%rbp),%xmm10 - paddd 0+128(%rbp),%xmm14 - paddd .Lchacha20_consts(%rip),%xmm1 - paddd 0+48(%rbp),%xmm5 - paddd 0+64(%rbp),%xmm9 - paddd 0+112(%rbp),%xmm13 - paddd .Lchacha20_consts(%rip),%xmm0 - paddd 0+48(%rbp),%xmm4 - paddd 0+64(%rbp),%xmm8 - paddd 0+96(%rbp),%xmm12 - - movdqa %xmm14,0+80(%rbp) - movdqa %xmm14,0+80(%rbp) - movdqu 0 + 0(%rsi),%xmm14 - pxor %xmm3,%xmm14 - movdqu %xmm14,0 + 0(%rdi) - movdqu 16 + 0(%rsi),%xmm14 - pxor %xmm7,%xmm14 - movdqu %xmm14,16 + 0(%rdi) - movdqu 32 + 0(%rsi),%xmm14 - pxor %xmm11,%xmm14 - movdqu %xmm14,32 + 0(%rdi) - movdqu 48 + 0(%rsi),%xmm14 - pxor %xmm15,%xmm14 - movdqu %xmm14,48 + 0(%rdi) - - movdqa 0+80(%rbp),%xmm14 - movdqu 0 + 64(%rsi),%xmm3 - movdqu 16 + 64(%rsi),%xmm7 - movdqu 32 + 64(%rsi),%xmm11 - movdqu 48 + 64(%rsi),%xmm15 - pxor %xmm3,%xmm2 - pxor %xmm7,%xmm6 - pxor %xmm11,%xmm10 - pxor %xmm14,%xmm15 - movdqu %xmm2,0 + 64(%rdi) - movdqu %xmm6,16 + 64(%rdi) - movdqu %xmm10,32 + 64(%rdi) - movdqu %xmm15,48 + 64(%rdi) - movdqu 0 + 128(%rsi),%xmm3 - movdqu 16 + 128(%rsi),%xmm7 - movdqu 32 + 128(%rsi),%xmm11 - movdqu 48 + 128(%rsi),%xmm15 - pxor %xmm3,%xmm1 - pxor %xmm7,%xmm5 - pxor %xmm11,%xmm9 - pxor %xmm13,%xmm15 - movdqu %xmm1,0 + 128(%rdi) - movdqu %xmm5,16 + 128(%rdi) - movdqu %xmm9,32 + 128(%rdi) - movdqu %xmm15,48 + 128(%rdi) - - cmpq $256,%rbx - ja .Lseal_sse_main_loop_xor - - movq $192,%rcx - subq $192,%rbx - leaq 192(%rsi),%rsi - jmp .Lseal_sse_128_tail_hash -.Lseal_sse_main_loop_xor: - movdqu 0 + 192(%rsi),%xmm3 - movdqu 16 + 192(%rsi),%xmm7 - movdqu 32 + 192(%rsi),%xmm11 - movdqu 48 + 192(%rsi),%xmm15 - pxor %xmm3,%xmm0 - pxor %xmm7,%xmm4 - pxor %xmm11,%xmm8 - pxor %xmm12,%xmm15 - movdqu %xmm0,0 + 192(%rdi) - movdqu %xmm4,16 + 192(%rdi) - movdqu %xmm8,32 + 192(%rdi) - movdqu %xmm15,48 + 192(%rdi) - - leaq 256(%rsi),%rsi - subq $256,%rbx - movq $6,%rcx - movq $4,%r8 - cmpq $192,%rbx - jg .Lseal_sse_main_loop - movq %rbx,%rcx - testq %rbx,%rbx - je .Lseal_sse_128_tail_hash - movq $6,%rcx - cmpq $128,%rbx - ja .Lseal_sse_tail_192 - cmpq $64,%rbx - ja .Lseal_sse_tail_128 - -.Lseal_sse_tail_64: - movdqa .Lchacha20_consts(%rip),%xmm0 - movdqa 0+48(%rbp),%xmm4 - movdqa 0+64(%rbp),%xmm8 - movdqa 0+96(%rbp),%xmm12 - paddd .Lsse_inc(%rip),%xmm12 - movdqa %xmm12,0+96(%rbp) - -.Lseal_sse_tail_64_rounds_and_x2hash: - addq 0+0(%rdi),%r10 - adcq 8+0(%rdi),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - leaq 16(%rdi),%rdi -.Lseal_sse_tail_64_rounds_and_x1hash: - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb .Lrol16(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm4 - pxor %xmm3,%xmm4 - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb .Lrol8(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm4 - pxor %xmm3,%xmm4 -.byte 102,15,58,15,228,4 -.byte 102,69,15,58,15,192,8 -.byte 102,69,15,58,15,228,12 - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb .Lrol16(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm4 - pxor %xmm3,%xmm4 - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb .Lrol8(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm4 - pxor %xmm3,%xmm4 -.byte 102,15,58,15,228,12 -.byte 102,69,15,58,15,192,8 -.byte 102,69,15,58,15,228,4 - addq 0+0(%rdi),%r10 - adcq 8+0(%rdi),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - leaq 16(%rdi),%rdi - decq %rcx - jg .Lseal_sse_tail_64_rounds_and_x2hash - decq %r8 - jge .Lseal_sse_tail_64_rounds_and_x1hash - paddd .Lchacha20_consts(%rip),%xmm0 - paddd 0+48(%rbp),%xmm4 - paddd 0+64(%rbp),%xmm8 - paddd 0+96(%rbp),%xmm12 - - jmp .Lseal_sse_128_tail_xor - -.Lseal_sse_tail_128: - movdqa .Lchacha20_consts(%rip),%xmm0 - movdqa 0+48(%rbp),%xmm4 - movdqa 0+64(%rbp),%xmm8 - movdqa %xmm0,%xmm1 - movdqa %xmm4,%xmm5 - movdqa %xmm8,%xmm9 - movdqa 0+96(%rbp),%xmm13 - paddd .Lsse_inc(%rip),%xmm13 - movdqa %xmm13,%xmm12 - paddd .Lsse_inc(%rip),%xmm12 - movdqa %xmm12,0+96(%rbp) - movdqa %xmm13,0+112(%rbp) - -.Lseal_sse_tail_128_rounds_and_x2hash: - addq 0+0(%rdi),%r10 - adcq 8+0(%rdi),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - leaq 16(%rdi),%rdi -.Lseal_sse_tail_128_rounds_and_x1hash: - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb .Lrol16(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm4 - pxor %xmm3,%xmm4 - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb .Lrol8(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm4 - pxor %xmm3,%xmm4 -.byte 102,15,58,15,228,4 -.byte 102,69,15,58,15,192,8 -.byte 102,69,15,58,15,228,12 - paddd %xmm5,%xmm1 - pxor %xmm1,%xmm13 - pshufb .Lrol16(%rip),%xmm13 - paddd %xmm13,%xmm9 - pxor %xmm9,%xmm5 - movdqa %xmm5,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm5 - pxor %xmm3,%xmm5 - paddd %xmm5,%xmm1 - pxor %xmm1,%xmm13 - pshufb .Lrol8(%rip),%xmm13 - paddd %xmm13,%xmm9 - pxor %xmm9,%xmm5 - movdqa %xmm5,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm5 - pxor %xmm3,%xmm5 -.byte 102,15,58,15,237,4 -.byte 102,69,15,58,15,201,8 -.byte 102,69,15,58,15,237,12 - addq 0+0(%rdi),%r10 - adcq 8+0(%rdi),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb .Lrol16(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm4 - pxor %xmm3,%xmm4 - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb .Lrol8(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm4 - pxor %xmm3,%xmm4 -.byte 102,15,58,15,228,12 -.byte 102,69,15,58,15,192,8 -.byte 102,69,15,58,15,228,4 - paddd %xmm5,%xmm1 - pxor %xmm1,%xmm13 - pshufb .Lrol16(%rip),%xmm13 - paddd %xmm13,%xmm9 - pxor %xmm9,%xmm5 - movdqa %xmm5,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm5 - pxor %xmm3,%xmm5 - paddd %xmm5,%xmm1 - pxor %xmm1,%xmm13 - pshufb .Lrol8(%rip),%xmm13 - paddd %xmm13,%xmm9 - pxor %xmm9,%xmm5 - movdqa %xmm5,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm5 - pxor %xmm3,%xmm5 -.byte 102,15,58,15,237,12 -.byte 102,69,15,58,15,201,8 -.byte 102,69,15,58,15,237,4 - - leaq 16(%rdi),%rdi - decq %rcx - jg .Lseal_sse_tail_128_rounds_and_x2hash - decq %r8 - jge .Lseal_sse_tail_128_rounds_and_x1hash - paddd .Lchacha20_consts(%rip),%xmm1 - paddd 0+48(%rbp),%xmm5 - paddd 0+64(%rbp),%xmm9 - paddd 0+112(%rbp),%xmm13 - paddd .Lchacha20_consts(%rip),%xmm0 - paddd 0+48(%rbp),%xmm4 - paddd 0+64(%rbp),%xmm8 - paddd 0+96(%rbp),%xmm12 - movdqu 0 + 0(%rsi),%xmm3 - movdqu 16 + 0(%rsi),%xmm7 - movdqu 32 + 0(%rsi),%xmm11 - movdqu 48 + 0(%rsi),%xmm15 - pxor %xmm3,%xmm1 - pxor %xmm7,%xmm5 - pxor %xmm11,%xmm9 - pxor %xmm13,%xmm15 - movdqu %xmm1,0 + 0(%rdi) - movdqu %xmm5,16 + 0(%rdi) - movdqu %xmm9,32 + 0(%rdi) - movdqu %xmm15,48 + 0(%rdi) - - movq $64,%rcx - subq $64,%rbx - leaq 64(%rsi),%rsi - jmp .Lseal_sse_128_tail_hash - -.Lseal_sse_tail_192: - movdqa .Lchacha20_consts(%rip),%xmm0 - movdqa 0+48(%rbp),%xmm4 - movdqa 0+64(%rbp),%xmm8 - movdqa %xmm0,%xmm1 - movdqa %xmm4,%xmm5 - movdqa %xmm8,%xmm9 - movdqa %xmm0,%xmm2 - movdqa %xmm4,%xmm6 - movdqa %xmm8,%xmm10 - movdqa 0+96(%rbp),%xmm14 - paddd .Lsse_inc(%rip),%xmm14 - movdqa %xmm14,%xmm13 - paddd .Lsse_inc(%rip),%xmm13 - movdqa %xmm13,%xmm12 - paddd .Lsse_inc(%rip),%xmm12 - movdqa %xmm12,0+96(%rbp) - movdqa %xmm13,0+112(%rbp) - movdqa %xmm14,0+128(%rbp) - -.Lseal_sse_tail_192_rounds_and_x2hash: - addq 0+0(%rdi),%r10 - adcq 8+0(%rdi),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - leaq 16(%rdi),%rdi -.Lseal_sse_tail_192_rounds_and_x1hash: - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb .Lrol16(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm4 - pxor %xmm3,%xmm4 - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb .Lrol8(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm4 - pxor %xmm3,%xmm4 -.byte 102,15,58,15,228,4 -.byte 102,69,15,58,15,192,8 -.byte 102,69,15,58,15,228,12 - paddd %xmm5,%xmm1 - pxor %xmm1,%xmm13 - pshufb .Lrol16(%rip),%xmm13 - paddd %xmm13,%xmm9 - pxor %xmm9,%xmm5 - movdqa %xmm5,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm5 - pxor %xmm3,%xmm5 - paddd %xmm5,%xmm1 - pxor %xmm1,%xmm13 - pshufb .Lrol8(%rip),%xmm13 - paddd %xmm13,%xmm9 - pxor %xmm9,%xmm5 - movdqa %xmm5,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm5 - pxor %xmm3,%xmm5 -.byte 102,15,58,15,237,4 -.byte 102,69,15,58,15,201,8 -.byte 102,69,15,58,15,237,12 - paddd %xmm6,%xmm2 - pxor %xmm2,%xmm14 - pshufb .Lrol16(%rip),%xmm14 - paddd %xmm14,%xmm10 - pxor %xmm10,%xmm6 - movdqa %xmm6,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm6 - pxor %xmm3,%xmm6 - paddd %xmm6,%xmm2 - pxor %xmm2,%xmm14 - pshufb .Lrol8(%rip),%xmm14 - paddd %xmm14,%xmm10 - pxor %xmm10,%xmm6 - movdqa %xmm6,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm6 - pxor %xmm3,%xmm6 -.byte 102,15,58,15,246,4 -.byte 102,69,15,58,15,210,8 -.byte 102,69,15,58,15,246,12 - addq 0+0(%rdi),%r10 - adcq 8+0(%rdi),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb .Lrol16(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm4 - pxor %xmm3,%xmm4 - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb .Lrol8(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm4 - pxor %xmm3,%xmm4 -.byte 102,15,58,15,228,12 -.byte 102,69,15,58,15,192,8 -.byte 102,69,15,58,15,228,4 - paddd %xmm5,%xmm1 - pxor %xmm1,%xmm13 - pshufb .Lrol16(%rip),%xmm13 - paddd %xmm13,%xmm9 - pxor %xmm9,%xmm5 - movdqa %xmm5,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm5 - pxor %xmm3,%xmm5 - paddd %xmm5,%xmm1 - pxor %xmm1,%xmm13 - pshufb .Lrol8(%rip),%xmm13 - paddd %xmm13,%xmm9 - pxor %xmm9,%xmm5 - movdqa %xmm5,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm5 - pxor %xmm3,%xmm5 -.byte 102,15,58,15,237,12 -.byte 102,69,15,58,15,201,8 -.byte 102,69,15,58,15,237,4 - paddd %xmm6,%xmm2 - pxor %xmm2,%xmm14 - pshufb .Lrol16(%rip),%xmm14 - paddd %xmm14,%xmm10 - pxor %xmm10,%xmm6 - movdqa %xmm6,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm6 - pxor %xmm3,%xmm6 - paddd %xmm6,%xmm2 - pxor %xmm2,%xmm14 - pshufb .Lrol8(%rip),%xmm14 - paddd %xmm14,%xmm10 - pxor %xmm10,%xmm6 - movdqa %xmm6,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm6 - pxor %xmm3,%xmm6 -.byte 102,15,58,15,246,12 -.byte 102,69,15,58,15,210,8 -.byte 102,69,15,58,15,246,4 - - leaq 16(%rdi),%rdi - decq %rcx - jg .Lseal_sse_tail_192_rounds_and_x2hash - decq %r8 - jge .Lseal_sse_tail_192_rounds_and_x1hash - paddd .Lchacha20_consts(%rip),%xmm2 - paddd 0+48(%rbp),%xmm6 - paddd 0+64(%rbp),%xmm10 - paddd 0+128(%rbp),%xmm14 - paddd .Lchacha20_consts(%rip),%xmm1 - paddd 0+48(%rbp),%xmm5 - paddd 0+64(%rbp),%xmm9 - paddd 0+112(%rbp),%xmm13 - paddd .Lchacha20_consts(%rip),%xmm0 - paddd 0+48(%rbp),%xmm4 - paddd 0+64(%rbp),%xmm8 - paddd 0+96(%rbp),%xmm12 - movdqu 0 + 0(%rsi),%xmm3 - movdqu 16 + 0(%rsi),%xmm7 - movdqu 32 + 0(%rsi),%xmm11 - movdqu 48 + 0(%rsi),%xmm15 - pxor %xmm3,%xmm2 - pxor %xmm7,%xmm6 - pxor %xmm11,%xmm10 - pxor %xmm14,%xmm15 - movdqu %xmm2,0 + 0(%rdi) - movdqu %xmm6,16 + 0(%rdi) - movdqu %xmm10,32 + 0(%rdi) - movdqu %xmm15,48 + 0(%rdi) - movdqu 0 + 64(%rsi),%xmm3 - movdqu 16 + 64(%rsi),%xmm7 - movdqu 32 + 64(%rsi),%xmm11 - movdqu 48 + 64(%rsi),%xmm15 - pxor %xmm3,%xmm1 - pxor %xmm7,%xmm5 - pxor %xmm11,%xmm9 - pxor %xmm13,%xmm15 - movdqu %xmm1,0 + 64(%rdi) - movdqu %xmm5,16 + 64(%rdi) - movdqu %xmm9,32 + 64(%rdi) - movdqu %xmm15,48 + 64(%rdi) - - movq $128,%rcx - subq $128,%rbx - leaq 128(%rsi),%rsi - -.Lseal_sse_128_tail_hash: - cmpq $16,%rcx - jb .Lseal_sse_128_tail_xor - addq 0+0(%rdi),%r10 - adcq 8+0(%rdi),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - subq $16,%rcx - leaq 16(%rdi),%rdi - jmp .Lseal_sse_128_tail_hash - -.Lseal_sse_128_tail_xor: - cmpq $16,%rbx - jb .Lseal_sse_tail_16 - subq $16,%rbx - - movdqu 0(%rsi),%xmm3 - pxor %xmm3,%xmm0 - movdqu %xmm0,0(%rdi) - - addq 0(%rdi),%r10 - adcq 8(%rdi),%r11 - adcq $1,%r12 - leaq 16(%rsi),%rsi - leaq 16(%rdi),%rdi - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - - movdqa %xmm4,%xmm0 - movdqa %xmm8,%xmm4 - movdqa %xmm12,%xmm8 - movdqa %xmm1,%xmm12 - movdqa %xmm5,%xmm1 - movdqa %xmm9,%xmm5 - movdqa %xmm13,%xmm9 - jmp .Lseal_sse_128_tail_xor - -.Lseal_sse_tail_16: - testq %rbx,%rbx - jz .Lprocess_blocks_of_extra_in - - movq %rbx,%r8 - movq %rbx,%rcx - leaq -1(%rsi,%rbx,1),%rsi - pxor %xmm15,%xmm15 -.Lseal_sse_tail_16_compose: - pslldq $1,%xmm15 - pinsrb $0,(%rsi),%xmm15 - leaq -1(%rsi),%rsi - decq %rcx - jne .Lseal_sse_tail_16_compose - - - pxor %xmm0,%xmm15 - - - movq %rbx,%rcx - movdqu %xmm15,%xmm0 -.Lseal_sse_tail_16_extract: - pextrb $0,%xmm0,(%rdi) - psrldq $1,%xmm0 - addq $1,%rdi - subq $1,%rcx - jnz .Lseal_sse_tail_16_extract - - - - - - - - - movq 288 + 0 + 32(%rsp),%r9 - movq 56(%r9),%r14 - movq 48(%r9),%r13 - testq %r14,%r14 - jz .Lprocess_partial_block - - movq $16,%r15 - subq %rbx,%r15 - cmpq %r15,%r14 - - jge .Lload_extra_in - movq %r14,%r15 - -.Lload_extra_in: - - - leaq -1(%r13,%r15,1),%rsi - - - addq %r15,%r13 - subq %r15,%r14 - movq %r13,48(%r9) - movq %r14,56(%r9) - - - - addq %r15,%r8 - - - pxor %xmm11,%xmm11 -.Lload_extra_load_loop: - pslldq $1,%xmm11 - pinsrb $0,(%rsi),%xmm11 - leaq -1(%rsi),%rsi - subq $1,%r15 - jnz .Lload_extra_load_loop - - - - - movq %rbx,%r15 - -.Lload_extra_shift_loop: - pslldq $1,%xmm11 - subq $1,%r15 - jnz .Lload_extra_shift_loop - - - - - leaq .Land_masks(%rip),%r15 - shlq $4,%rbx - pand -16(%r15,%rbx,1),%xmm15 - - - por %xmm11,%xmm15 - - - -.byte 102,77,15,126,253 - pextrq $1,%xmm15,%r14 - addq %r13,%r10 - adcq %r14,%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - -.Lprocess_blocks_of_extra_in: - - movq 288+32+0 (%rsp),%r9 - movq 48(%r9),%rsi - movq 56(%r9),%r8 - movq %r8,%rcx - shrq $4,%r8 - -.Lprocess_extra_hash_loop: - jz process_extra_in_trailer - addq 0+0(%rsi),%r10 - adcq 8+0(%rsi),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - leaq 16(%rsi),%rsi - subq $1,%r8 - jmp .Lprocess_extra_hash_loop -process_extra_in_trailer: - andq $15,%rcx - movq %rcx,%rbx - jz .Ldo_length_block - leaq -1(%rsi,%rcx,1),%rsi - -.Lprocess_extra_in_trailer_load: - pslldq $1,%xmm15 - pinsrb $0,(%rsi),%xmm15 - leaq -1(%rsi),%rsi - subq $1,%rcx - jnz .Lprocess_extra_in_trailer_load - -.Lprocess_partial_block: - - leaq .Land_masks(%rip),%r15 - shlq $4,%rbx - pand -16(%r15,%rbx,1),%xmm15 -.byte 102,77,15,126,253 - pextrq $1,%xmm15,%r14 - addq %r13,%r10 - adcq %r14,%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - -.Ldo_length_block: - addq 0+0+32(%rbp),%r10 - adcq 8+0+32(%rbp),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - - movq %r10,%r13 - movq %r11,%r14 - movq %r12,%r15 - subq $-5,%r10 - sbbq $-1,%r11 - sbbq $3,%r12 - cmovcq %r13,%r10 - cmovcq %r14,%r11 - cmovcq %r15,%r12 - - addq 0+0+16(%rbp),%r10 - adcq 8+0+16(%rbp),%r11 - -.cfi_remember_state - addq $288 + 0 + 32,%rsp -.cfi_adjust_cfa_offset -(288 + 32) - - popq %r9 -.cfi_adjust_cfa_offset -8 -.cfi_restore %r9 - movq %r10,(%r9) - movq %r11,8(%r9) - popq %r15 -.cfi_adjust_cfa_offset -8 -.cfi_restore %r15 - popq %r14 -.cfi_adjust_cfa_offset -8 -.cfi_restore %r14 - popq %r13 -.cfi_adjust_cfa_offset -8 -.cfi_restore %r13 - popq %r12 -.cfi_adjust_cfa_offset -8 -.cfi_restore %r12 - popq %rbx -.cfi_adjust_cfa_offset -8 -.cfi_restore %rbx - popq %rbp -.cfi_adjust_cfa_offset -8 -.cfi_restore %rbp - .byte 0xf3,0xc3 - -.Lseal_sse_128: -.cfi_restore_state - movdqu .Lchacha20_consts(%rip),%xmm0 - movdqa %xmm0,%xmm1 - movdqa %xmm0,%xmm2 - movdqu 0(%r9),%xmm4 - movdqa %xmm4,%xmm5 - movdqa %xmm4,%xmm6 - movdqu 16(%r9),%xmm8 - movdqa %xmm8,%xmm9 - movdqa %xmm8,%xmm10 - movdqu 32(%r9),%xmm14 - movdqa %xmm14,%xmm12 - paddd .Lsse_inc(%rip),%xmm12 - movdqa %xmm12,%xmm13 - paddd .Lsse_inc(%rip),%xmm13 - movdqa %xmm4,%xmm7 - movdqa %xmm8,%xmm11 - movdqa %xmm12,%xmm15 - movq $10,%r10 - -.Lseal_sse_128_rounds: - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb .Lrol16(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm4 - pxor %xmm3,%xmm4 - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb .Lrol8(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm4 - pxor %xmm3,%xmm4 -.byte 102,15,58,15,228,4 -.byte 102,69,15,58,15,192,8 -.byte 102,69,15,58,15,228,12 - paddd %xmm5,%xmm1 - pxor %xmm1,%xmm13 - pshufb .Lrol16(%rip),%xmm13 - paddd %xmm13,%xmm9 - pxor %xmm9,%xmm5 - movdqa %xmm5,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm5 - pxor %xmm3,%xmm5 - paddd %xmm5,%xmm1 - pxor %xmm1,%xmm13 - pshufb .Lrol8(%rip),%xmm13 - paddd %xmm13,%xmm9 - pxor %xmm9,%xmm5 - movdqa %xmm5,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm5 - pxor %xmm3,%xmm5 -.byte 102,15,58,15,237,4 -.byte 102,69,15,58,15,201,8 -.byte 102,69,15,58,15,237,12 - paddd %xmm6,%xmm2 - pxor %xmm2,%xmm14 - pshufb .Lrol16(%rip),%xmm14 - paddd %xmm14,%xmm10 - pxor %xmm10,%xmm6 - movdqa %xmm6,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm6 - pxor %xmm3,%xmm6 - paddd %xmm6,%xmm2 - pxor %xmm2,%xmm14 - pshufb .Lrol8(%rip),%xmm14 - paddd %xmm14,%xmm10 - pxor %xmm10,%xmm6 - movdqa %xmm6,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm6 - pxor %xmm3,%xmm6 -.byte 102,15,58,15,246,4 -.byte 102,69,15,58,15,210,8 -.byte 102,69,15,58,15,246,12 - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb .Lrol16(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm4 - pxor %xmm3,%xmm4 - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb .Lrol8(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm4 - pxor %xmm3,%xmm4 -.byte 102,15,58,15,228,12 -.byte 102,69,15,58,15,192,8 -.byte 102,69,15,58,15,228,4 - paddd %xmm5,%xmm1 - pxor %xmm1,%xmm13 - pshufb .Lrol16(%rip),%xmm13 - paddd %xmm13,%xmm9 - pxor %xmm9,%xmm5 - movdqa %xmm5,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm5 - pxor %xmm3,%xmm5 - paddd %xmm5,%xmm1 - pxor %xmm1,%xmm13 - pshufb .Lrol8(%rip),%xmm13 - paddd %xmm13,%xmm9 - pxor %xmm9,%xmm5 - movdqa %xmm5,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm5 - pxor %xmm3,%xmm5 -.byte 102,15,58,15,237,12 -.byte 102,69,15,58,15,201,8 -.byte 102,69,15,58,15,237,4 - paddd %xmm6,%xmm2 - pxor %xmm2,%xmm14 - pshufb .Lrol16(%rip),%xmm14 - paddd %xmm14,%xmm10 - pxor %xmm10,%xmm6 - movdqa %xmm6,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm6 - pxor %xmm3,%xmm6 - paddd %xmm6,%xmm2 - pxor %xmm2,%xmm14 - pshufb .Lrol8(%rip),%xmm14 - paddd %xmm14,%xmm10 - pxor %xmm10,%xmm6 - movdqa %xmm6,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm6 - pxor %xmm3,%xmm6 -.byte 102,15,58,15,246,12 -.byte 102,69,15,58,15,210,8 -.byte 102,69,15,58,15,246,4 - - decq %r10 - jnz .Lseal_sse_128_rounds - paddd .Lchacha20_consts(%rip),%xmm0 - paddd .Lchacha20_consts(%rip),%xmm1 - paddd .Lchacha20_consts(%rip),%xmm2 - paddd %xmm7,%xmm4 - paddd %xmm7,%xmm5 - paddd %xmm7,%xmm6 - paddd %xmm11,%xmm8 - paddd %xmm11,%xmm9 - paddd %xmm15,%xmm12 - paddd .Lsse_inc(%rip),%xmm15 - paddd %xmm15,%xmm13 - - pand .Lclamp(%rip),%xmm2 - movdqa %xmm2,0+0(%rbp) - movdqa %xmm6,0+16(%rbp) - - movq %r8,%r8 - call poly_hash_ad_internal - jmp .Lseal_sse_128_tail_xor -.size GFp_chacha20_poly1305_seal, .-GFp_chacha20_poly1305_seal -.cfi_endproc - - -.type chacha20_poly1305_open_avx2,@function -.align 64 -chacha20_poly1305_open_avx2: -.cfi_startproc - - -.cfi_adjust_cfa_offset 8 -.cfi_offset %rbp,-16 -.cfi_adjust_cfa_offset 8 -.cfi_offset %rbx,-24 -.cfi_adjust_cfa_offset 8 -.cfi_offset %r12,-32 -.cfi_adjust_cfa_offset 8 -.cfi_offset %r13,-40 -.cfi_adjust_cfa_offset 8 -.cfi_offset %r14,-48 -.cfi_adjust_cfa_offset 8 -.cfi_offset %r15,-56 -.cfi_adjust_cfa_offset 8 -.cfi_offset %r9,-64 -.cfi_adjust_cfa_offset 288 + 32 - - vzeroupper - vmovdqa .Lchacha20_consts(%rip),%ymm0 - vbroadcasti128 0(%r9),%ymm4 - vbroadcasti128 16(%r9),%ymm8 - vbroadcasti128 32(%r9),%ymm12 - vpaddd .Lavx2_init(%rip),%ymm12,%ymm12 - cmpq $192,%rbx - jbe .Lopen_avx2_192 - cmpq $320,%rbx - jbe .Lopen_avx2_320 - - vmovdqa %ymm4,0+64(%rbp) - vmovdqa %ymm8,0+96(%rbp) - vmovdqa %ymm12,0+160(%rbp) - movq $10,%r10 -.Lopen_avx2_init_rounds: - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb .Lrol16(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpsrld $20,%ymm4,%ymm3 - vpslld $12,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb .Lrol8(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpslld $7,%ymm4,%ymm3 - vpsrld $25,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpalignr $12,%ymm12,%ymm12,%ymm12 - vpalignr $8,%ymm8,%ymm8,%ymm8 - vpalignr $4,%ymm4,%ymm4,%ymm4 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb .Lrol16(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpsrld $20,%ymm4,%ymm3 - vpslld $12,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb .Lrol8(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpslld $7,%ymm4,%ymm3 - vpsrld $25,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpalignr $4,%ymm12,%ymm12,%ymm12 - vpalignr $8,%ymm8,%ymm8,%ymm8 - vpalignr $12,%ymm4,%ymm4,%ymm4 - - decq %r10 - jne .Lopen_avx2_init_rounds - vpaddd .Lchacha20_consts(%rip),%ymm0,%ymm0 - vpaddd 0+64(%rbp),%ymm4,%ymm4 - vpaddd 0+96(%rbp),%ymm8,%ymm8 - vpaddd 0+160(%rbp),%ymm12,%ymm12 - - vperm2i128 $0x02,%ymm0,%ymm4,%ymm3 - - vpand .Lclamp(%rip),%ymm3,%ymm3 - vmovdqa %ymm3,0+0(%rbp) - - vperm2i128 $0x13,%ymm0,%ymm4,%ymm0 - vperm2i128 $0x13,%ymm8,%ymm12,%ymm4 - - movq %r8,%r8 - call poly_hash_ad_internal - - xorq %rcx,%rcx -.Lopen_avx2_init_hash: - addq 0+0(%rsi,%rcx,1),%r10 - adcq 8+0(%rsi,%rcx,1),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - addq $16,%rcx - cmpq $64,%rcx - jne .Lopen_avx2_init_hash - - vpxor 0(%rsi),%ymm0,%ymm0 - vpxor 32(%rsi),%ymm4,%ymm4 - - vmovdqu %ymm0,0(%rdi) - vmovdqu %ymm4,32(%rdi) - leaq 64(%rsi),%rsi - leaq 64(%rdi),%rdi - subq $64,%rbx -.Lopen_avx2_main_loop: - - cmpq $512,%rbx - jb .Lopen_avx2_main_loop_done - vmovdqa .Lchacha20_consts(%rip),%ymm0 - vmovdqa 0+64(%rbp),%ymm4 - vmovdqa 0+96(%rbp),%ymm8 - vmovdqa %ymm0,%ymm1 - vmovdqa %ymm4,%ymm5 - vmovdqa %ymm8,%ymm9 - vmovdqa %ymm0,%ymm2 - vmovdqa %ymm4,%ymm6 - vmovdqa %ymm8,%ymm10 - vmovdqa %ymm0,%ymm3 - vmovdqa %ymm4,%ymm7 - vmovdqa %ymm8,%ymm11 - vmovdqa .Lavx2_inc(%rip),%ymm12 - vpaddd 0+160(%rbp),%ymm12,%ymm15 - vpaddd %ymm15,%ymm12,%ymm14 - vpaddd %ymm14,%ymm12,%ymm13 - vpaddd %ymm13,%ymm12,%ymm12 - vmovdqa %ymm15,0+256(%rbp) - vmovdqa %ymm14,0+224(%rbp) - vmovdqa %ymm13,0+192(%rbp) - vmovdqa %ymm12,0+160(%rbp) - - xorq %rcx,%rcx -.Lopen_avx2_main_loop_rounds: - addq 0+0(%rsi,%rcx,1),%r10 - adcq 8+0(%rsi,%rcx,1),%r11 - adcq $1,%r12 - vmovdqa %ymm8,0+128(%rbp) - vmovdqa .Lrol16(%rip),%ymm8 - vpaddd %ymm7,%ymm3,%ymm3 - vpaddd %ymm6,%ymm2,%ymm2 - vpaddd %ymm5,%ymm1,%ymm1 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm3,%ymm15,%ymm15 - vpxor %ymm2,%ymm14,%ymm14 - vpxor %ymm1,%ymm13,%ymm13 - vpxor %ymm0,%ymm12,%ymm12 - movq 0+0+0(%rbp),%rdx - movq %rdx,%r15 - mulxq %r10,%r13,%r14 - mulxq %r11,%rax,%rdx - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - vpshufb %ymm8,%ymm15,%ymm15 - vpshufb %ymm8,%ymm14,%ymm14 - vpshufb %ymm8,%ymm13,%ymm13 - vpshufb %ymm8,%ymm12,%ymm12 - vpaddd %ymm15,%ymm11,%ymm11 - vpaddd %ymm14,%ymm10,%ymm10 - vpaddd %ymm13,%ymm9,%ymm9 - vpaddd 0+128(%rbp),%ymm12,%ymm8 - vpxor %ymm11,%ymm7,%ymm7 - movq 8+0+0(%rbp),%rdx - mulxq %r10,%r10,%rax - addq %r10,%r14 - mulxq %r11,%r11,%r9 - adcq %r11,%r15 - adcq $0,%r9 - imulq %r12,%rdx - vpxor %ymm10,%ymm6,%ymm6 - vpxor %ymm9,%ymm5,%ymm5 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa %ymm8,0+128(%rbp) - vpsrld $20,%ymm7,%ymm8 - vpslld $32-20,%ymm7,%ymm7 - vpxor %ymm8,%ymm7,%ymm7 - vpsrld $20,%ymm6,%ymm8 - vpslld $32-20,%ymm6,%ymm6 - vpxor %ymm8,%ymm6,%ymm6 - vpsrld $20,%ymm5,%ymm8 - vpslld $32-20,%ymm5,%ymm5 - addq %rax,%r15 - adcq %rdx,%r9 - vpxor %ymm8,%ymm5,%ymm5 - vpsrld $20,%ymm4,%ymm8 - vpslld $32-20,%ymm4,%ymm4 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa .Lrol8(%rip),%ymm8 - vpaddd %ymm7,%ymm3,%ymm3 - vpaddd %ymm6,%ymm2,%ymm2 - vpaddd %ymm5,%ymm1,%ymm1 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm3,%ymm15,%ymm15 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - vpxor %ymm2,%ymm14,%ymm14 - vpxor %ymm1,%ymm13,%ymm13 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb %ymm8,%ymm15,%ymm15 - vpshufb %ymm8,%ymm14,%ymm14 - vpshufb %ymm8,%ymm13,%ymm13 - vpshufb %ymm8,%ymm12,%ymm12 - vpaddd %ymm15,%ymm11,%ymm11 - vpaddd %ymm14,%ymm10,%ymm10 - addq 0+16(%rsi,%rcx,1),%r10 - adcq 8+16(%rsi,%rcx,1),%r11 - adcq $1,%r12 - vpaddd %ymm13,%ymm9,%ymm9 - vpaddd 0+128(%rbp),%ymm12,%ymm8 - vpxor %ymm11,%ymm7,%ymm7 - vpxor %ymm10,%ymm6,%ymm6 - vpxor %ymm9,%ymm5,%ymm5 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa %ymm8,0+128(%rbp) - vpsrld $25,%ymm7,%ymm8 - movq 0+0+0(%rbp),%rdx - movq %rdx,%r15 - mulxq %r10,%r13,%r14 - mulxq %r11,%rax,%rdx - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - vpslld $32-25,%ymm7,%ymm7 - vpxor %ymm8,%ymm7,%ymm7 - vpsrld $25,%ymm6,%ymm8 - vpslld $32-25,%ymm6,%ymm6 - vpxor %ymm8,%ymm6,%ymm6 - vpsrld $25,%ymm5,%ymm8 - vpslld $32-25,%ymm5,%ymm5 - vpxor %ymm8,%ymm5,%ymm5 - vpsrld $25,%ymm4,%ymm8 - vpslld $32-25,%ymm4,%ymm4 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa 0+128(%rbp),%ymm8 - vpalignr $4,%ymm7,%ymm7,%ymm7 - vpalignr $8,%ymm11,%ymm11,%ymm11 - vpalignr $12,%ymm15,%ymm15,%ymm15 - vpalignr $4,%ymm6,%ymm6,%ymm6 - vpalignr $8,%ymm10,%ymm10,%ymm10 - vpalignr $12,%ymm14,%ymm14,%ymm14 - movq 8+0+0(%rbp),%rdx - mulxq %r10,%r10,%rax - addq %r10,%r14 - mulxq %r11,%r11,%r9 - adcq %r11,%r15 - adcq $0,%r9 - imulq %r12,%rdx - vpalignr $4,%ymm5,%ymm5,%ymm5 - vpalignr $8,%ymm9,%ymm9,%ymm9 - vpalignr $12,%ymm13,%ymm13,%ymm13 - vpalignr $4,%ymm4,%ymm4,%ymm4 - vpalignr $8,%ymm8,%ymm8,%ymm8 - vpalignr $12,%ymm12,%ymm12,%ymm12 - vmovdqa %ymm8,0+128(%rbp) - vmovdqa .Lrol16(%rip),%ymm8 - vpaddd %ymm7,%ymm3,%ymm3 - vpaddd %ymm6,%ymm2,%ymm2 - vpaddd %ymm5,%ymm1,%ymm1 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm3,%ymm15,%ymm15 - vpxor %ymm2,%ymm14,%ymm14 - vpxor %ymm1,%ymm13,%ymm13 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb %ymm8,%ymm15,%ymm15 - vpshufb %ymm8,%ymm14,%ymm14 - addq %rax,%r15 - adcq %rdx,%r9 - vpshufb %ymm8,%ymm13,%ymm13 - vpshufb %ymm8,%ymm12,%ymm12 - vpaddd %ymm15,%ymm11,%ymm11 - vpaddd %ymm14,%ymm10,%ymm10 - vpaddd %ymm13,%ymm9,%ymm9 - vpaddd 0+128(%rbp),%ymm12,%ymm8 - vpxor %ymm11,%ymm7,%ymm7 - vpxor %ymm10,%ymm6,%ymm6 - vpxor %ymm9,%ymm5,%ymm5 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa %ymm8,0+128(%rbp) - vpsrld $20,%ymm7,%ymm8 - vpslld $32-20,%ymm7,%ymm7 - vpxor %ymm8,%ymm7,%ymm7 - vpsrld $20,%ymm6,%ymm8 - vpslld $32-20,%ymm6,%ymm6 - vpxor %ymm8,%ymm6,%ymm6 - addq 0+32(%rsi,%rcx,1),%r10 - adcq 8+32(%rsi,%rcx,1),%r11 - adcq $1,%r12 - - leaq 48(%rcx),%rcx - vpsrld $20,%ymm5,%ymm8 - vpslld $32-20,%ymm5,%ymm5 - vpxor %ymm8,%ymm5,%ymm5 - vpsrld $20,%ymm4,%ymm8 - vpslld $32-20,%ymm4,%ymm4 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa .Lrol8(%rip),%ymm8 - vpaddd %ymm7,%ymm3,%ymm3 - vpaddd %ymm6,%ymm2,%ymm2 - vpaddd %ymm5,%ymm1,%ymm1 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm3,%ymm15,%ymm15 - vpxor %ymm2,%ymm14,%ymm14 - vpxor %ymm1,%ymm13,%ymm13 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb %ymm8,%ymm15,%ymm15 - vpshufb %ymm8,%ymm14,%ymm14 - vpshufb %ymm8,%ymm13,%ymm13 - movq 0+0+0(%rbp),%rdx - movq %rdx,%r15 - mulxq %r10,%r13,%r14 - mulxq %r11,%rax,%rdx - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - vpshufb %ymm8,%ymm12,%ymm12 - vpaddd %ymm15,%ymm11,%ymm11 - vpaddd %ymm14,%ymm10,%ymm10 - vpaddd %ymm13,%ymm9,%ymm9 - vpaddd 0+128(%rbp),%ymm12,%ymm8 - vpxor %ymm11,%ymm7,%ymm7 - vpxor %ymm10,%ymm6,%ymm6 - vpxor %ymm9,%ymm5,%ymm5 - movq 8+0+0(%rbp),%rdx - mulxq %r10,%r10,%rax - addq %r10,%r14 - mulxq %r11,%r11,%r9 - adcq %r11,%r15 - adcq $0,%r9 - imulq %r12,%rdx - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa %ymm8,0+128(%rbp) - vpsrld $25,%ymm7,%ymm8 - vpslld $32-25,%ymm7,%ymm7 - vpxor %ymm8,%ymm7,%ymm7 - vpsrld $25,%ymm6,%ymm8 - vpslld $32-25,%ymm6,%ymm6 - vpxor %ymm8,%ymm6,%ymm6 - addq %rax,%r15 - adcq %rdx,%r9 - vpsrld $25,%ymm5,%ymm8 - vpslld $32-25,%ymm5,%ymm5 - vpxor %ymm8,%ymm5,%ymm5 - vpsrld $25,%ymm4,%ymm8 - vpslld $32-25,%ymm4,%ymm4 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa 0+128(%rbp),%ymm8 - vpalignr $12,%ymm7,%ymm7,%ymm7 - vpalignr $8,%ymm11,%ymm11,%ymm11 - vpalignr $4,%ymm15,%ymm15,%ymm15 - vpalignr $12,%ymm6,%ymm6,%ymm6 - vpalignr $8,%ymm10,%ymm10,%ymm10 - vpalignr $4,%ymm14,%ymm14,%ymm14 - vpalignr $12,%ymm5,%ymm5,%ymm5 - vpalignr $8,%ymm9,%ymm9,%ymm9 - vpalignr $4,%ymm13,%ymm13,%ymm13 - vpalignr $12,%ymm4,%ymm4,%ymm4 - vpalignr $8,%ymm8,%ymm8,%ymm8 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - vpalignr $4,%ymm12,%ymm12,%ymm12 - - cmpq $60*8,%rcx - jne .Lopen_avx2_main_loop_rounds - vpaddd .Lchacha20_consts(%rip),%ymm3,%ymm3 - vpaddd 0+64(%rbp),%ymm7,%ymm7 - vpaddd 0+96(%rbp),%ymm11,%ymm11 - vpaddd 0+256(%rbp),%ymm15,%ymm15 - vpaddd .Lchacha20_consts(%rip),%ymm2,%ymm2 - vpaddd 0+64(%rbp),%ymm6,%ymm6 - vpaddd 0+96(%rbp),%ymm10,%ymm10 - vpaddd 0+224(%rbp),%ymm14,%ymm14 - vpaddd .Lchacha20_consts(%rip),%ymm1,%ymm1 - vpaddd 0+64(%rbp),%ymm5,%ymm5 - vpaddd 0+96(%rbp),%ymm9,%ymm9 - vpaddd 0+192(%rbp),%ymm13,%ymm13 - vpaddd .Lchacha20_consts(%rip),%ymm0,%ymm0 - vpaddd 0+64(%rbp),%ymm4,%ymm4 - vpaddd 0+96(%rbp),%ymm8,%ymm8 - vpaddd 0+160(%rbp),%ymm12,%ymm12 - - vmovdqa %ymm0,0+128(%rbp) - addq 0+60*8(%rsi),%r10 - adcq 8+60*8(%rsi),%r11 - adcq $1,%r12 - vperm2i128 $0x02,%ymm3,%ymm7,%ymm0 - vperm2i128 $0x13,%ymm3,%ymm7,%ymm7 - vperm2i128 $0x02,%ymm11,%ymm15,%ymm3 - vperm2i128 $0x13,%ymm11,%ymm15,%ymm11 - vpxor 0+0(%rsi),%ymm0,%ymm0 - vpxor 32+0(%rsi),%ymm3,%ymm3 - vpxor 64+0(%rsi),%ymm7,%ymm7 - vpxor 96+0(%rsi),%ymm11,%ymm11 - vmovdqu %ymm0,0+0(%rdi) - vmovdqu %ymm3,32+0(%rdi) - vmovdqu %ymm7,64+0(%rdi) - vmovdqu %ymm11,96+0(%rdi) - - vmovdqa 0+128(%rbp),%ymm0 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - vperm2i128 $0x02,%ymm2,%ymm6,%ymm3 - vperm2i128 $0x13,%ymm2,%ymm6,%ymm6 - vperm2i128 $0x02,%ymm10,%ymm14,%ymm2 - vperm2i128 $0x13,%ymm10,%ymm14,%ymm10 - vpxor 0+128(%rsi),%ymm3,%ymm3 - vpxor 32+128(%rsi),%ymm2,%ymm2 - vpxor 64+128(%rsi),%ymm6,%ymm6 - vpxor 96+128(%rsi),%ymm10,%ymm10 - vmovdqu %ymm3,0+128(%rdi) - vmovdqu %ymm2,32+128(%rdi) - vmovdqu %ymm6,64+128(%rdi) - vmovdqu %ymm10,96+128(%rdi) - addq 0+60*8+16(%rsi),%r10 - adcq 8+60*8+16(%rsi),%r11 - adcq $1,%r12 - vperm2i128 $0x02,%ymm1,%ymm5,%ymm3 - vperm2i128 $0x13,%ymm1,%ymm5,%ymm5 - vperm2i128 $0x02,%ymm9,%ymm13,%ymm1 - vperm2i128 $0x13,%ymm9,%ymm13,%ymm9 - vpxor 0+256(%rsi),%ymm3,%ymm3 - vpxor 32+256(%rsi),%ymm1,%ymm1 - vpxor 64+256(%rsi),%ymm5,%ymm5 - vpxor 96+256(%rsi),%ymm9,%ymm9 - vmovdqu %ymm3,0+256(%rdi) - vmovdqu %ymm1,32+256(%rdi) - vmovdqu %ymm5,64+256(%rdi) - vmovdqu %ymm9,96+256(%rdi) - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - vperm2i128 $0x02,%ymm0,%ymm4,%ymm3 - vperm2i128 $0x13,%ymm0,%ymm4,%ymm4 - vperm2i128 $0x02,%ymm8,%ymm12,%ymm0 - vperm2i128 $0x13,%ymm8,%ymm12,%ymm8 - vpxor 0+384(%rsi),%ymm3,%ymm3 - vpxor 32+384(%rsi),%ymm0,%ymm0 - vpxor 64+384(%rsi),%ymm4,%ymm4 - vpxor 96+384(%rsi),%ymm8,%ymm8 - vmovdqu %ymm3,0+384(%rdi) - vmovdqu %ymm0,32+384(%rdi) - vmovdqu %ymm4,64+384(%rdi) - vmovdqu %ymm8,96+384(%rdi) - - leaq 512(%rsi),%rsi - leaq 512(%rdi),%rdi - subq $512,%rbx - jmp .Lopen_avx2_main_loop -.Lopen_avx2_main_loop_done: - testq %rbx,%rbx - vzeroupper - je .Lopen_sse_finalize - - cmpq $384,%rbx - ja .Lopen_avx2_tail_512 - cmpq $256,%rbx - ja .Lopen_avx2_tail_384 - cmpq $128,%rbx - ja .Lopen_avx2_tail_256 - vmovdqa .Lchacha20_consts(%rip),%ymm0 - vmovdqa 0+64(%rbp),%ymm4 - vmovdqa 0+96(%rbp),%ymm8 - vmovdqa .Lavx2_inc(%rip),%ymm12 - vpaddd 0+160(%rbp),%ymm12,%ymm12 - vmovdqa %ymm12,0+160(%rbp) - - xorq %r8,%r8 - movq %rbx,%rcx - andq $-16,%rcx - testq %rcx,%rcx - je .Lopen_avx2_tail_128_rounds -.Lopen_avx2_tail_128_rounds_and_x1hash: - addq 0+0(%rsi,%r8,1),%r10 - adcq 8+0(%rsi,%r8,1),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - -.Lopen_avx2_tail_128_rounds: - addq $16,%r8 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb .Lrol16(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpsrld $20,%ymm4,%ymm3 - vpslld $12,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb .Lrol8(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpslld $7,%ymm4,%ymm3 - vpsrld $25,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpalignr $12,%ymm12,%ymm12,%ymm12 - vpalignr $8,%ymm8,%ymm8,%ymm8 - vpalignr $4,%ymm4,%ymm4,%ymm4 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb .Lrol16(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpsrld $20,%ymm4,%ymm3 - vpslld $12,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb .Lrol8(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpslld $7,%ymm4,%ymm3 - vpsrld $25,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpalignr $4,%ymm12,%ymm12,%ymm12 - vpalignr $8,%ymm8,%ymm8,%ymm8 - vpalignr $12,%ymm4,%ymm4,%ymm4 - - cmpq %rcx,%r8 - jb .Lopen_avx2_tail_128_rounds_and_x1hash - cmpq $160,%r8 - jne .Lopen_avx2_tail_128_rounds - vpaddd .Lchacha20_consts(%rip),%ymm0,%ymm0 - vpaddd 0+64(%rbp),%ymm4,%ymm4 - vpaddd 0+96(%rbp),%ymm8,%ymm8 - vpaddd 0+160(%rbp),%ymm12,%ymm12 - vperm2i128 $0x13,%ymm0,%ymm4,%ymm3 - vperm2i128 $0x02,%ymm0,%ymm4,%ymm0 - vperm2i128 $0x02,%ymm8,%ymm12,%ymm4 - vperm2i128 $0x13,%ymm8,%ymm12,%ymm12 - vmovdqa %ymm3,%ymm8 - - jmp .Lopen_avx2_tail_128_xor - -.Lopen_avx2_tail_256: - vmovdqa .Lchacha20_consts(%rip),%ymm0 - vmovdqa 0+64(%rbp),%ymm4 - vmovdqa 0+96(%rbp),%ymm8 - vmovdqa %ymm0,%ymm1 - vmovdqa %ymm4,%ymm5 - vmovdqa %ymm8,%ymm9 - vmovdqa .Lavx2_inc(%rip),%ymm12 - vpaddd 0+160(%rbp),%ymm12,%ymm13 - vpaddd %ymm13,%ymm12,%ymm12 - vmovdqa %ymm12,0+160(%rbp) - vmovdqa %ymm13,0+192(%rbp) - - movq %rbx,0+128(%rbp) - movq %rbx,%rcx - subq $128,%rcx - shrq $4,%rcx - movq $10,%r8 - cmpq $10,%rcx - cmovgq %r8,%rcx - movq %rsi,%rbx - xorq %r8,%r8 -.Lopen_avx2_tail_256_rounds_and_x1hash: - addq 0+0(%rbx),%r10 - adcq 8+0(%rbx),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rdx - movq %rdx,%r15 - mulxq %r10,%r13,%r14 - mulxq %r11,%rax,%rdx - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rdx - mulxq %r10,%r10,%rax - addq %r10,%r14 - mulxq %r11,%r11,%r9 - adcq %r11,%r15 - adcq $0,%r9 - imulq %r12,%rdx - addq %rax,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - leaq 16(%rbx),%rbx -.Lopen_avx2_tail_256_rounds: - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb .Lrol16(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpsrld $20,%ymm4,%ymm3 - vpslld $12,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb .Lrol8(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpslld $7,%ymm4,%ymm3 - vpsrld $25,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpalignr $12,%ymm12,%ymm12,%ymm12 - vpalignr $8,%ymm8,%ymm8,%ymm8 - vpalignr $4,%ymm4,%ymm4,%ymm4 - vpaddd %ymm5,%ymm1,%ymm1 - vpxor %ymm1,%ymm13,%ymm13 - vpshufb .Lrol16(%rip),%ymm13,%ymm13 - vpaddd %ymm13,%ymm9,%ymm9 - vpxor %ymm9,%ymm5,%ymm5 - vpsrld $20,%ymm5,%ymm3 - vpslld $12,%ymm5,%ymm5 - vpxor %ymm3,%ymm5,%ymm5 - vpaddd %ymm5,%ymm1,%ymm1 - vpxor %ymm1,%ymm13,%ymm13 - vpshufb .Lrol8(%rip),%ymm13,%ymm13 - vpaddd %ymm13,%ymm9,%ymm9 - vpxor %ymm9,%ymm5,%ymm5 - vpslld $7,%ymm5,%ymm3 - vpsrld $25,%ymm5,%ymm5 - vpxor %ymm3,%ymm5,%ymm5 - vpalignr $12,%ymm13,%ymm13,%ymm13 - vpalignr $8,%ymm9,%ymm9,%ymm9 - vpalignr $4,%ymm5,%ymm5,%ymm5 - - incq %r8 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb .Lrol16(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpsrld $20,%ymm4,%ymm3 - vpslld $12,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb .Lrol8(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpslld $7,%ymm4,%ymm3 - vpsrld $25,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpalignr $4,%ymm12,%ymm12,%ymm12 - vpalignr $8,%ymm8,%ymm8,%ymm8 - vpalignr $12,%ymm4,%ymm4,%ymm4 - vpaddd %ymm5,%ymm1,%ymm1 - vpxor %ymm1,%ymm13,%ymm13 - vpshufb .Lrol16(%rip),%ymm13,%ymm13 - vpaddd %ymm13,%ymm9,%ymm9 - vpxor %ymm9,%ymm5,%ymm5 - vpsrld $20,%ymm5,%ymm3 - vpslld $12,%ymm5,%ymm5 - vpxor %ymm3,%ymm5,%ymm5 - vpaddd %ymm5,%ymm1,%ymm1 - vpxor %ymm1,%ymm13,%ymm13 - vpshufb .Lrol8(%rip),%ymm13,%ymm13 - vpaddd %ymm13,%ymm9,%ymm9 - vpxor %ymm9,%ymm5,%ymm5 - vpslld $7,%ymm5,%ymm3 - vpsrld $25,%ymm5,%ymm5 - vpxor %ymm3,%ymm5,%ymm5 - vpalignr $4,%ymm13,%ymm13,%ymm13 - vpalignr $8,%ymm9,%ymm9,%ymm9 - vpalignr $12,%ymm5,%ymm5,%ymm5 - vpaddd %ymm6,%ymm2,%ymm2 - vpxor %ymm2,%ymm14,%ymm14 - vpshufb .Lrol16(%rip),%ymm14,%ymm14 - vpaddd %ymm14,%ymm10,%ymm10 - vpxor %ymm10,%ymm6,%ymm6 - vpsrld $20,%ymm6,%ymm3 - vpslld $12,%ymm6,%ymm6 - vpxor %ymm3,%ymm6,%ymm6 - vpaddd %ymm6,%ymm2,%ymm2 - vpxor %ymm2,%ymm14,%ymm14 - vpshufb .Lrol8(%rip),%ymm14,%ymm14 - vpaddd %ymm14,%ymm10,%ymm10 - vpxor %ymm10,%ymm6,%ymm6 - vpslld $7,%ymm6,%ymm3 - vpsrld $25,%ymm6,%ymm6 - vpxor %ymm3,%ymm6,%ymm6 - vpalignr $4,%ymm14,%ymm14,%ymm14 - vpalignr $8,%ymm10,%ymm10,%ymm10 - vpalignr $12,%ymm6,%ymm6,%ymm6 - - cmpq %rcx,%r8 - jb .Lopen_avx2_tail_256_rounds_and_x1hash - cmpq $10,%r8 - jne .Lopen_avx2_tail_256_rounds - movq %rbx,%r8 - subq %rsi,%rbx - movq %rbx,%rcx - movq 0+128(%rbp),%rbx -.Lopen_avx2_tail_256_hash: - addq $16,%rcx - cmpq %rbx,%rcx - jg .Lopen_avx2_tail_256_done - addq 0+0(%r8),%r10 - adcq 8+0(%r8),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rdx - movq %rdx,%r15 - mulxq %r10,%r13,%r14 - mulxq %r11,%rax,%rdx - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rdx - mulxq %r10,%r10,%rax - addq %r10,%r14 - mulxq %r11,%r11,%r9 - adcq %r11,%r15 - adcq $0,%r9 - imulq %r12,%rdx - addq %rax,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - leaq 16(%r8),%r8 - jmp .Lopen_avx2_tail_256_hash -.Lopen_avx2_tail_256_done: - vpaddd .Lchacha20_consts(%rip),%ymm1,%ymm1 - vpaddd 0+64(%rbp),%ymm5,%ymm5 - vpaddd 0+96(%rbp),%ymm9,%ymm9 - vpaddd 0+192(%rbp),%ymm13,%ymm13 - vpaddd .Lchacha20_consts(%rip),%ymm0,%ymm0 - vpaddd 0+64(%rbp),%ymm4,%ymm4 - vpaddd 0+96(%rbp),%ymm8,%ymm8 - vpaddd 0+160(%rbp),%ymm12,%ymm12 - vperm2i128 $0x02,%ymm1,%ymm5,%ymm3 - vperm2i128 $0x13,%ymm1,%ymm5,%ymm5 - vperm2i128 $0x02,%ymm9,%ymm13,%ymm1 - vperm2i128 $0x13,%ymm9,%ymm13,%ymm9 - vpxor 0+0(%rsi),%ymm3,%ymm3 - vpxor 32+0(%rsi),%ymm1,%ymm1 - vpxor 64+0(%rsi),%ymm5,%ymm5 - vpxor 96+0(%rsi),%ymm9,%ymm9 - vmovdqu %ymm3,0+0(%rdi) - vmovdqu %ymm1,32+0(%rdi) - vmovdqu %ymm5,64+0(%rdi) - vmovdqu %ymm9,96+0(%rdi) - vperm2i128 $0x13,%ymm0,%ymm4,%ymm3 - vperm2i128 $0x02,%ymm0,%ymm4,%ymm0 - vperm2i128 $0x02,%ymm8,%ymm12,%ymm4 - vperm2i128 $0x13,%ymm8,%ymm12,%ymm12 - vmovdqa %ymm3,%ymm8 - - leaq 128(%rsi),%rsi - leaq 128(%rdi),%rdi - subq $128,%rbx - jmp .Lopen_avx2_tail_128_xor - -.Lopen_avx2_tail_384: - vmovdqa .Lchacha20_consts(%rip),%ymm0 - vmovdqa 0+64(%rbp),%ymm4 - vmovdqa 0+96(%rbp),%ymm8 - vmovdqa %ymm0,%ymm1 - vmovdqa %ymm4,%ymm5 - vmovdqa %ymm8,%ymm9 - vmovdqa %ymm0,%ymm2 - vmovdqa %ymm4,%ymm6 - vmovdqa %ymm8,%ymm10 - vmovdqa .Lavx2_inc(%rip),%ymm12 - vpaddd 0+160(%rbp),%ymm12,%ymm14 - vpaddd %ymm14,%ymm12,%ymm13 - vpaddd %ymm13,%ymm12,%ymm12 - vmovdqa %ymm12,0+160(%rbp) - vmovdqa %ymm13,0+192(%rbp) - vmovdqa %ymm14,0+224(%rbp) - - movq %rbx,0+128(%rbp) - movq %rbx,%rcx - subq $256,%rcx - shrq $4,%rcx - addq $6,%rcx - movq $10,%r8 - cmpq $10,%rcx - cmovgq %r8,%rcx - movq %rsi,%rbx - xorq %r8,%r8 -.Lopen_avx2_tail_384_rounds_and_x2hash: - addq 0+0(%rbx),%r10 - adcq 8+0(%rbx),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rdx - movq %rdx,%r15 - mulxq %r10,%r13,%r14 - mulxq %r11,%rax,%rdx - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rdx - mulxq %r10,%r10,%rax - addq %r10,%r14 - mulxq %r11,%r11,%r9 - adcq %r11,%r15 - adcq $0,%r9 - imulq %r12,%rdx - addq %rax,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - leaq 16(%rbx),%rbx -.Lopen_avx2_tail_384_rounds_and_x1hash: - vpaddd %ymm6,%ymm2,%ymm2 - vpxor %ymm2,%ymm14,%ymm14 - vpshufb .Lrol16(%rip),%ymm14,%ymm14 - vpaddd %ymm14,%ymm10,%ymm10 - vpxor %ymm10,%ymm6,%ymm6 - vpsrld $20,%ymm6,%ymm3 - vpslld $12,%ymm6,%ymm6 - vpxor %ymm3,%ymm6,%ymm6 - vpaddd %ymm6,%ymm2,%ymm2 - vpxor %ymm2,%ymm14,%ymm14 - vpshufb .Lrol8(%rip),%ymm14,%ymm14 - vpaddd %ymm14,%ymm10,%ymm10 - vpxor %ymm10,%ymm6,%ymm6 - vpslld $7,%ymm6,%ymm3 - vpsrld $25,%ymm6,%ymm6 - vpxor %ymm3,%ymm6,%ymm6 - vpalignr $12,%ymm14,%ymm14,%ymm14 - vpalignr $8,%ymm10,%ymm10,%ymm10 - vpalignr $4,%ymm6,%ymm6,%ymm6 - vpaddd %ymm5,%ymm1,%ymm1 - vpxor %ymm1,%ymm13,%ymm13 - vpshufb .Lrol16(%rip),%ymm13,%ymm13 - vpaddd %ymm13,%ymm9,%ymm9 - vpxor %ymm9,%ymm5,%ymm5 - vpsrld $20,%ymm5,%ymm3 - vpslld $12,%ymm5,%ymm5 - vpxor %ymm3,%ymm5,%ymm5 - vpaddd %ymm5,%ymm1,%ymm1 - vpxor %ymm1,%ymm13,%ymm13 - vpshufb .Lrol8(%rip),%ymm13,%ymm13 - vpaddd %ymm13,%ymm9,%ymm9 - vpxor %ymm9,%ymm5,%ymm5 - vpslld $7,%ymm5,%ymm3 - vpsrld $25,%ymm5,%ymm5 - vpxor %ymm3,%ymm5,%ymm5 - vpalignr $12,%ymm13,%ymm13,%ymm13 - vpalignr $8,%ymm9,%ymm9,%ymm9 - vpalignr $4,%ymm5,%ymm5,%ymm5 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb .Lrol16(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpsrld $20,%ymm4,%ymm3 - vpslld $12,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb .Lrol8(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpslld $7,%ymm4,%ymm3 - vpsrld $25,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpalignr $12,%ymm12,%ymm12,%ymm12 - vpalignr $8,%ymm8,%ymm8,%ymm8 - vpalignr $4,%ymm4,%ymm4,%ymm4 - addq 0+0(%rbx),%r10 - adcq 8+0(%rbx),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - leaq 16(%rbx),%rbx - incq %r8 - vpaddd %ymm6,%ymm2,%ymm2 - vpxor %ymm2,%ymm14,%ymm14 - vpshufb .Lrol16(%rip),%ymm14,%ymm14 - vpaddd %ymm14,%ymm10,%ymm10 - vpxor %ymm10,%ymm6,%ymm6 - vpsrld $20,%ymm6,%ymm3 - vpslld $12,%ymm6,%ymm6 - vpxor %ymm3,%ymm6,%ymm6 - vpaddd %ymm6,%ymm2,%ymm2 - vpxor %ymm2,%ymm14,%ymm14 - vpshufb .Lrol8(%rip),%ymm14,%ymm14 - vpaddd %ymm14,%ymm10,%ymm10 - vpxor %ymm10,%ymm6,%ymm6 - vpslld $7,%ymm6,%ymm3 - vpsrld $25,%ymm6,%ymm6 - vpxor %ymm3,%ymm6,%ymm6 - vpalignr $4,%ymm14,%ymm14,%ymm14 - vpalignr $8,%ymm10,%ymm10,%ymm10 - vpalignr $12,%ymm6,%ymm6,%ymm6 - vpaddd %ymm5,%ymm1,%ymm1 - vpxor %ymm1,%ymm13,%ymm13 - vpshufb .Lrol16(%rip),%ymm13,%ymm13 - vpaddd %ymm13,%ymm9,%ymm9 - vpxor %ymm9,%ymm5,%ymm5 - vpsrld $20,%ymm5,%ymm3 - vpslld $12,%ymm5,%ymm5 - vpxor %ymm3,%ymm5,%ymm5 - vpaddd %ymm5,%ymm1,%ymm1 - vpxor %ymm1,%ymm13,%ymm13 - vpshufb .Lrol8(%rip),%ymm13,%ymm13 - vpaddd %ymm13,%ymm9,%ymm9 - vpxor %ymm9,%ymm5,%ymm5 - vpslld $7,%ymm5,%ymm3 - vpsrld $25,%ymm5,%ymm5 - vpxor %ymm3,%ymm5,%ymm5 - vpalignr $4,%ymm13,%ymm13,%ymm13 - vpalignr $8,%ymm9,%ymm9,%ymm9 - vpalignr $12,%ymm5,%ymm5,%ymm5 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb .Lrol16(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpsrld $20,%ymm4,%ymm3 - vpslld $12,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb .Lrol8(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpslld $7,%ymm4,%ymm3 - vpsrld $25,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpalignr $4,%ymm12,%ymm12,%ymm12 - vpalignr $8,%ymm8,%ymm8,%ymm8 - vpalignr $12,%ymm4,%ymm4,%ymm4 - - cmpq %rcx,%r8 - jb .Lopen_avx2_tail_384_rounds_and_x2hash - cmpq $10,%r8 - jne .Lopen_avx2_tail_384_rounds_and_x1hash - movq %rbx,%r8 - subq %rsi,%rbx - movq %rbx,%rcx - movq 0+128(%rbp),%rbx -.Lopen_avx2_384_tail_hash: - addq $16,%rcx - cmpq %rbx,%rcx - jg .Lopen_avx2_384_tail_done - addq 0+0(%r8),%r10 - adcq 8+0(%r8),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rdx - movq %rdx,%r15 - mulxq %r10,%r13,%r14 - mulxq %r11,%rax,%rdx - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rdx - mulxq %r10,%r10,%rax - addq %r10,%r14 - mulxq %r11,%r11,%r9 - adcq %r11,%r15 - adcq $0,%r9 - imulq %r12,%rdx - addq %rax,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - leaq 16(%r8),%r8 - jmp .Lopen_avx2_384_tail_hash -.Lopen_avx2_384_tail_done: - vpaddd .Lchacha20_consts(%rip),%ymm2,%ymm2 - vpaddd 0+64(%rbp),%ymm6,%ymm6 - vpaddd 0+96(%rbp),%ymm10,%ymm10 - vpaddd 0+224(%rbp),%ymm14,%ymm14 - vpaddd .Lchacha20_consts(%rip),%ymm1,%ymm1 - vpaddd 0+64(%rbp),%ymm5,%ymm5 - vpaddd 0+96(%rbp),%ymm9,%ymm9 - vpaddd 0+192(%rbp),%ymm13,%ymm13 - vpaddd .Lchacha20_consts(%rip),%ymm0,%ymm0 - vpaddd 0+64(%rbp),%ymm4,%ymm4 - vpaddd 0+96(%rbp),%ymm8,%ymm8 - vpaddd 0+160(%rbp),%ymm12,%ymm12 - vperm2i128 $0x02,%ymm2,%ymm6,%ymm3 - vperm2i128 $0x13,%ymm2,%ymm6,%ymm6 - vperm2i128 $0x02,%ymm10,%ymm14,%ymm2 - vperm2i128 $0x13,%ymm10,%ymm14,%ymm10 - vpxor 0+0(%rsi),%ymm3,%ymm3 - vpxor 32+0(%rsi),%ymm2,%ymm2 - vpxor 64+0(%rsi),%ymm6,%ymm6 - vpxor 96+0(%rsi),%ymm10,%ymm10 - vmovdqu %ymm3,0+0(%rdi) - vmovdqu %ymm2,32+0(%rdi) - vmovdqu %ymm6,64+0(%rdi) - vmovdqu %ymm10,96+0(%rdi) - vperm2i128 $0x02,%ymm1,%ymm5,%ymm3 - vperm2i128 $0x13,%ymm1,%ymm5,%ymm5 - vperm2i128 $0x02,%ymm9,%ymm13,%ymm1 - vperm2i128 $0x13,%ymm9,%ymm13,%ymm9 - vpxor 0+128(%rsi),%ymm3,%ymm3 - vpxor 32+128(%rsi),%ymm1,%ymm1 - vpxor 64+128(%rsi),%ymm5,%ymm5 - vpxor 96+128(%rsi),%ymm9,%ymm9 - vmovdqu %ymm3,0+128(%rdi) - vmovdqu %ymm1,32+128(%rdi) - vmovdqu %ymm5,64+128(%rdi) - vmovdqu %ymm9,96+128(%rdi) - vperm2i128 $0x13,%ymm0,%ymm4,%ymm3 - vperm2i128 $0x02,%ymm0,%ymm4,%ymm0 - vperm2i128 $0x02,%ymm8,%ymm12,%ymm4 - vperm2i128 $0x13,%ymm8,%ymm12,%ymm12 - vmovdqa %ymm3,%ymm8 - - leaq 256(%rsi),%rsi - leaq 256(%rdi),%rdi - subq $256,%rbx - jmp .Lopen_avx2_tail_128_xor - -.Lopen_avx2_tail_512: - vmovdqa .Lchacha20_consts(%rip),%ymm0 - vmovdqa 0+64(%rbp),%ymm4 - vmovdqa 0+96(%rbp),%ymm8 - vmovdqa %ymm0,%ymm1 - vmovdqa %ymm4,%ymm5 - vmovdqa %ymm8,%ymm9 - vmovdqa %ymm0,%ymm2 - vmovdqa %ymm4,%ymm6 - vmovdqa %ymm8,%ymm10 - vmovdqa %ymm0,%ymm3 - vmovdqa %ymm4,%ymm7 - vmovdqa %ymm8,%ymm11 - vmovdqa .Lavx2_inc(%rip),%ymm12 - vpaddd 0+160(%rbp),%ymm12,%ymm15 - vpaddd %ymm15,%ymm12,%ymm14 - vpaddd %ymm14,%ymm12,%ymm13 - vpaddd %ymm13,%ymm12,%ymm12 - vmovdqa %ymm15,0+256(%rbp) - vmovdqa %ymm14,0+224(%rbp) - vmovdqa %ymm13,0+192(%rbp) - vmovdqa %ymm12,0+160(%rbp) - - xorq %rcx,%rcx - movq %rsi,%r8 -.Lopen_avx2_tail_512_rounds_and_x2hash: - addq 0+0(%r8),%r10 - adcq 8+0(%r8),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - leaq 16(%r8),%r8 -.Lopen_avx2_tail_512_rounds_and_x1hash: - vmovdqa %ymm8,0+128(%rbp) - vmovdqa .Lrol16(%rip),%ymm8 - vpaddd %ymm7,%ymm3,%ymm3 - vpaddd %ymm6,%ymm2,%ymm2 - vpaddd %ymm5,%ymm1,%ymm1 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm3,%ymm15,%ymm15 - vpxor %ymm2,%ymm14,%ymm14 - vpxor %ymm1,%ymm13,%ymm13 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb %ymm8,%ymm15,%ymm15 - vpshufb %ymm8,%ymm14,%ymm14 - vpshufb %ymm8,%ymm13,%ymm13 - vpshufb %ymm8,%ymm12,%ymm12 - vpaddd %ymm15,%ymm11,%ymm11 - vpaddd %ymm14,%ymm10,%ymm10 - vpaddd %ymm13,%ymm9,%ymm9 - vpaddd 0+128(%rbp),%ymm12,%ymm8 - vpxor %ymm11,%ymm7,%ymm7 - vpxor %ymm10,%ymm6,%ymm6 - vpxor %ymm9,%ymm5,%ymm5 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa %ymm8,0+128(%rbp) - vpsrld $20,%ymm7,%ymm8 - vpslld $32-20,%ymm7,%ymm7 - vpxor %ymm8,%ymm7,%ymm7 - vpsrld $20,%ymm6,%ymm8 - vpslld $32-20,%ymm6,%ymm6 - vpxor %ymm8,%ymm6,%ymm6 - vpsrld $20,%ymm5,%ymm8 - vpslld $32-20,%ymm5,%ymm5 - vpxor %ymm8,%ymm5,%ymm5 - vpsrld $20,%ymm4,%ymm8 - vpslld $32-20,%ymm4,%ymm4 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa .Lrol8(%rip),%ymm8 - vpaddd %ymm7,%ymm3,%ymm3 - addq 0+0(%r8),%r10 - adcq 8+0(%r8),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rdx - movq %rdx,%r15 - mulxq %r10,%r13,%r14 - mulxq %r11,%rax,%rdx - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rdx - mulxq %r10,%r10,%rax - addq %r10,%r14 - mulxq %r11,%r11,%r9 - adcq %r11,%r15 - adcq $0,%r9 - imulq %r12,%rdx - addq %rax,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - vpaddd %ymm6,%ymm2,%ymm2 - vpaddd %ymm5,%ymm1,%ymm1 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm3,%ymm15,%ymm15 - vpxor %ymm2,%ymm14,%ymm14 - vpxor %ymm1,%ymm13,%ymm13 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb %ymm8,%ymm15,%ymm15 - vpshufb %ymm8,%ymm14,%ymm14 - vpshufb %ymm8,%ymm13,%ymm13 - vpshufb %ymm8,%ymm12,%ymm12 - vpaddd %ymm15,%ymm11,%ymm11 - vpaddd %ymm14,%ymm10,%ymm10 - vpaddd %ymm13,%ymm9,%ymm9 - vpaddd 0+128(%rbp),%ymm12,%ymm8 - vpxor %ymm11,%ymm7,%ymm7 - vpxor %ymm10,%ymm6,%ymm6 - vpxor %ymm9,%ymm5,%ymm5 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa %ymm8,0+128(%rbp) - vpsrld $25,%ymm7,%ymm8 - vpslld $32-25,%ymm7,%ymm7 - vpxor %ymm8,%ymm7,%ymm7 - vpsrld $25,%ymm6,%ymm8 - vpslld $32-25,%ymm6,%ymm6 - vpxor %ymm8,%ymm6,%ymm6 - vpsrld $25,%ymm5,%ymm8 - vpslld $32-25,%ymm5,%ymm5 - vpxor %ymm8,%ymm5,%ymm5 - vpsrld $25,%ymm4,%ymm8 - vpslld $32-25,%ymm4,%ymm4 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa 0+128(%rbp),%ymm8 - vpalignr $4,%ymm7,%ymm7,%ymm7 - vpalignr $8,%ymm11,%ymm11,%ymm11 - vpalignr $12,%ymm15,%ymm15,%ymm15 - vpalignr $4,%ymm6,%ymm6,%ymm6 - vpalignr $8,%ymm10,%ymm10,%ymm10 - vpalignr $12,%ymm14,%ymm14,%ymm14 - vpalignr $4,%ymm5,%ymm5,%ymm5 - vpalignr $8,%ymm9,%ymm9,%ymm9 - vpalignr $12,%ymm13,%ymm13,%ymm13 - vpalignr $4,%ymm4,%ymm4,%ymm4 - vpalignr $8,%ymm8,%ymm8,%ymm8 - vpalignr $12,%ymm12,%ymm12,%ymm12 - vmovdqa %ymm8,0+128(%rbp) - vmovdqa .Lrol16(%rip),%ymm8 - vpaddd %ymm7,%ymm3,%ymm3 - addq 0+16(%r8),%r10 - adcq 8+16(%r8),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rdx - movq %rdx,%r15 - mulxq %r10,%r13,%r14 - mulxq %r11,%rax,%rdx - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rdx - mulxq %r10,%r10,%rax - addq %r10,%r14 - mulxq %r11,%r11,%r9 - adcq %r11,%r15 - adcq $0,%r9 - imulq %r12,%rdx - addq %rax,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - leaq 32(%r8),%r8 - vpaddd %ymm6,%ymm2,%ymm2 - vpaddd %ymm5,%ymm1,%ymm1 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm3,%ymm15,%ymm15 - vpxor %ymm2,%ymm14,%ymm14 - vpxor %ymm1,%ymm13,%ymm13 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb %ymm8,%ymm15,%ymm15 - vpshufb %ymm8,%ymm14,%ymm14 - vpshufb %ymm8,%ymm13,%ymm13 - vpshufb %ymm8,%ymm12,%ymm12 - vpaddd %ymm15,%ymm11,%ymm11 - vpaddd %ymm14,%ymm10,%ymm10 - vpaddd %ymm13,%ymm9,%ymm9 - vpaddd 0+128(%rbp),%ymm12,%ymm8 - vpxor %ymm11,%ymm7,%ymm7 - vpxor %ymm10,%ymm6,%ymm6 - vpxor %ymm9,%ymm5,%ymm5 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa %ymm8,0+128(%rbp) - vpsrld $20,%ymm7,%ymm8 - vpslld $32-20,%ymm7,%ymm7 - vpxor %ymm8,%ymm7,%ymm7 - vpsrld $20,%ymm6,%ymm8 - vpslld $32-20,%ymm6,%ymm6 - vpxor %ymm8,%ymm6,%ymm6 - vpsrld $20,%ymm5,%ymm8 - vpslld $32-20,%ymm5,%ymm5 - vpxor %ymm8,%ymm5,%ymm5 - vpsrld $20,%ymm4,%ymm8 - vpslld $32-20,%ymm4,%ymm4 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa .Lrol8(%rip),%ymm8 - vpaddd %ymm7,%ymm3,%ymm3 - vpaddd %ymm6,%ymm2,%ymm2 - vpaddd %ymm5,%ymm1,%ymm1 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm3,%ymm15,%ymm15 - vpxor %ymm2,%ymm14,%ymm14 - vpxor %ymm1,%ymm13,%ymm13 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb %ymm8,%ymm15,%ymm15 - vpshufb %ymm8,%ymm14,%ymm14 - vpshufb %ymm8,%ymm13,%ymm13 - vpshufb %ymm8,%ymm12,%ymm12 - vpaddd %ymm15,%ymm11,%ymm11 - vpaddd %ymm14,%ymm10,%ymm10 - vpaddd %ymm13,%ymm9,%ymm9 - vpaddd 0+128(%rbp),%ymm12,%ymm8 - vpxor %ymm11,%ymm7,%ymm7 - vpxor %ymm10,%ymm6,%ymm6 - vpxor %ymm9,%ymm5,%ymm5 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa %ymm8,0+128(%rbp) - vpsrld $25,%ymm7,%ymm8 - vpslld $32-25,%ymm7,%ymm7 - vpxor %ymm8,%ymm7,%ymm7 - vpsrld $25,%ymm6,%ymm8 - vpslld $32-25,%ymm6,%ymm6 - vpxor %ymm8,%ymm6,%ymm6 - vpsrld $25,%ymm5,%ymm8 - vpslld $32-25,%ymm5,%ymm5 - vpxor %ymm8,%ymm5,%ymm5 - vpsrld $25,%ymm4,%ymm8 - vpslld $32-25,%ymm4,%ymm4 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa 0+128(%rbp),%ymm8 - vpalignr $12,%ymm7,%ymm7,%ymm7 - vpalignr $8,%ymm11,%ymm11,%ymm11 - vpalignr $4,%ymm15,%ymm15,%ymm15 - vpalignr $12,%ymm6,%ymm6,%ymm6 - vpalignr $8,%ymm10,%ymm10,%ymm10 - vpalignr $4,%ymm14,%ymm14,%ymm14 - vpalignr $12,%ymm5,%ymm5,%ymm5 - vpalignr $8,%ymm9,%ymm9,%ymm9 - vpalignr $4,%ymm13,%ymm13,%ymm13 - vpalignr $12,%ymm4,%ymm4,%ymm4 - vpalignr $8,%ymm8,%ymm8,%ymm8 - vpalignr $4,%ymm12,%ymm12,%ymm12 - - incq %rcx - cmpq $4,%rcx - jl .Lopen_avx2_tail_512_rounds_and_x2hash - cmpq $10,%rcx - jne .Lopen_avx2_tail_512_rounds_and_x1hash - movq %rbx,%rcx - subq $384,%rcx - andq $-16,%rcx -.Lopen_avx2_tail_512_hash: - testq %rcx,%rcx - je .Lopen_avx2_tail_512_done - addq 0+0(%r8),%r10 - adcq 8+0(%r8),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rdx - movq %rdx,%r15 - mulxq %r10,%r13,%r14 - mulxq %r11,%rax,%rdx - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rdx - mulxq %r10,%r10,%rax - addq %r10,%r14 - mulxq %r11,%r11,%r9 - adcq %r11,%r15 - adcq $0,%r9 - imulq %r12,%rdx - addq %rax,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - leaq 16(%r8),%r8 - subq $16,%rcx - jmp .Lopen_avx2_tail_512_hash -.Lopen_avx2_tail_512_done: - vpaddd .Lchacha20_consts(%rip),%ymm3,%ymm3 - vpaddd 0+64(%rbp),%ymm7,%ymm7 - vpaddd 0+96(%rbp),%ymm11,%ymm11 - vpaddd 0+256(%rbp),%ymm15,%ymm15 - vpaddd .Lchacha20_consts(%rip),%ymm2,%ymm2 - vpaddd 0+64(%rbp),%ymm6,%ymm6 - vpaddd 0+96(%rbp),%ymm10,%ymm10 - vpaddd 0+224(%rbp),%ymm14,%ymm14 - vpaddd .Lchacha20_consts(%rip),%ymm1,%ymm1 - vpaddd 0+64(%rbp),%ymm5,%ymm5 - vpaddd 0+96(%rbp),%ymm9,%ymm9 - vpaddd 0+192(%rbp),%ymm13,%ymm13 - vpaddd .Lchacha20_consts(%rip),%ymm0,%ymm0 - vpaddd 0+64(%rbp),%ymm4,%ymm4 - vpaddd 0+96(%rbp),%ymm8,%ymm8 - vpaddd 0+160(%rbp),%ymm12,%ymm12 - - vmovdqa %ymm0,0+128(%rbp) - vperm2i128 $0x02,%ymm3,%ymm7,%ymm0 - vperm2i128 $0x13,%ymm3,%ymm7,%ymm7 - vperm2i128 $0x02,%ymm11,%ymm15,%ymm3 - vperm2i128 $0x13,%ymm11,%ymm15,%ymm11 - vpxor 0+0(%rsi),%ymm0,%ymm0 - vpxor 32+0(%rsi),%ymm3,%ymm3 - vpxor 64+0(%rsi),%ymm7,%ymm7 - vpxor 96+0(%rsi),%ymm11,%ymm11 - vmovdqu %ymm0,0+0(%rdi) - vmovdqu %ymm3,32+0(%rdi) - vmovdqu %ymm7,64+0(%rdi) - vmovdqu %ymm11,96+0(%rdi) - - vmovdqa 0+128(%rbp),%ymm0 - vperm2i128 $0x02,%ymm2,%ymm6,%ymm3 - vperm2i128 $0x13,%ymm2,%ymm6,%ymm6 - vperm2i128 $0x02,%ymm10,%ymm14,%ymm2 - vperm2i128 $0x13,%ymm10,%ymm14,%ymm10 - vpxor 0+128(%rsi),%ymm3,%ymm3 - vpxor 32+128(%rsi),%ymm2,%ymm2 - vpxor 64+128(%rsi),%ymm6,%ymm6 - vpxor 96+128(%rsi),%ymm10,%ymm10 - vmovdqu %ymm3,0+128(%rdi) - vmovdqu %ymm2,32+128(%rdi) - vmovdqu %ymm6,64+128(%rdi) - vmovdqu %ymm10,96+128(%rdi) - vperm2i128 $0x02,%ymm1,%ymm5,%ymm3 - vperm2i128 $0x13,%ymm1,%ymm5,%ymm5 - vperm2i128 $0x02,%ymm9,%ymm13,%ymm1 - vperm2i128 $0x13,%ymm9,%ymm13,%ymm9 - vpxor 0+256(%rsi),%ymm3,%ymm3 - vpxor 32+256(%rsi),%ymm1,%ymm1 - vpxor 64+256(%rsi),%ymm5,%ymm5 - vpxor 96+256(%rsi),%ymm9,%ymm9 - vmovdqu %ymm3,0+256(%rdi) - vmovdqu %ymm1,32+256(%rdi) - vmovdqu %ymm5,64+256(%rdi) - vmovdqu %ymm9,96+256(%rdi) - vperm2i128 $0x13,%ymm0,%ymm4,%ymm3 - vperm2i128 $0x02,%ymm0,%ymm4,%ymm0 - vperm2i128 $0x02,%ymm8,%ymm12,%ymm4 - vperm2i128 $0x13,%ymm8,%ymm12,%ymm12 - vmovdqa %ymm3,%ymm8 - - leaq 384(%rsi),%rsi - leaq 384(%rdi),%rdi - subq $384,%rbx -.Lopen_avx2_tail_128_xor: - cmpq $32,%rbx - jb .Lopen_avx2_tail_32_xor - subq $32,%rbx - vpxor (%rsi),%ymm0,%ymm0 - vmovdqu %ymm0,(%rdi) - leaq 32(%rsi),%rsi - leaq 32(%rdi),%rdi - vmovdqa %ymm4,%ymm0 - vmovdqa %ymm8,%ymm4 - vmovdqa %ymm12,%ymm8 - jmp .Lopen_avx2_tail_128_xor -.Lopen_avx2_tail_32_xor: - cmpq $16,%rbx - vmovdqa %xmm0,%xmm1 - jb .Lopen_avx2_exit - subq $16,%rbx - - vpxor (%rsi),%xmm0,%xmm1 - vmovdqu %xmm1,(%rdi) - leaq 16(%rsi),%rsi - leaq 16(%rdi),%rdi - vperm2i128 $0x11,%ymm0,%ymm0,%ymm0 - vmovdqa %xmm0,%xmm1 -.Lopen_avx2_exit: - vzeroupper - jmp .Lopen_sse_tail_16 - -.Lopen_avx2_192: - vmovdqa %ymm0,%ymm1 - vmovdqa %ymm0,%ymm2 - vmovdqa %ymm4,%ymm5 - vmovdqa %ymm4,%ymm6 - vmovdqa %ymm8,%ymm9 - vmovdqa %ymm8,%ymm10 - vpaddd .Lavx2_inc(%rip),%ymm12,%ymm13 - vmovdqa %ymm12,%ymm11 - vmovdqa %ymm13,%ymm15 - movq $10,%r10 -.Lopen_avx2_192_rounds: - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb .Lrol16(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpsrld $20,%ymm4,%ymm3 - vpslld $12,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb .Lrol8(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpslld $7,%ymm4,%ymm3 - vpsrld $25,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpalignr $12,%ymm12,%ymm12,%ymm12 - vpalignr $8,%ymm8,%ymm8,%ymm8 - vpalignr $4,%ymm4,%ymm4,%ymm4 - vpaddd %ymm5,%ymm1,%ymm1 - vpxor %ymm1,%ymm13,%ymm13 - vpshufb .Lrol16(%rip),%ymm13,%ymm13 - vpaddd %ymm13,%ymm9,%ymm9 - vpxor %ymm9,%ymm5,%ymm5 - vpsrld $20,%ymm5,%ymm3 - vpslld $12,%ymm5,%ymm5 - vpxor %ymm3,%ymm5,%ymm5 - vpaddd %ymm5,%ymm1,%ymm1 - vpxor %ymm1,%ymm13,%ymm13 - vpshufb .Lrol8(%rip),%ymm13,%ymm13 - vpaddd %ymm13,%ymm9,%ymm9 - vpxor %ymm9,%ymm5,%ymm5 - vpslld $7,%ymm5,%ymm3 - vpsrld $25,%ymm5,%ymm5 - vpxor %ymm3,%ymm5,%ymm5 - vpalignr $12,%ymm13,%ymm13,%ymm13 - vpalignr $8,%ymm9,%ymm9,%ymm9 - vpalignr $4,%ymm5,%ymm5,%ymm5 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb .Lrol16(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpsrld $20,%ymm4,%ymm3 - vpslld $12,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb .Lrol8(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpslld $7,%ymm4,%ymm3 - vpsrld $25,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpalignr $4,%ymm12,%ymm12,%ymm12 - vpalignr $8,%ymm8,%ymm8,%ymm8 - vpalignr $12,%ymm4,%ymm4,%ymm4 - vpaddd %ymm5,%ymm1,%ymm1 - vpxor %ymm1,%ymm13,%ymm13 - vpshufb .Lrol16(%rip),%ymm13,%ymm13 - vpaddd %ymm13,%ymm9,%ymm9 - vpxor %ymm9,%ymm5,%ymm5 - vpsrld $20,%ymm5,%ymm3 - vpslld $12,%ymm5,%ymm5 - vpxor %ymm3,%ymm5,%ymm5 - vpaddd %ymm5,%ymm1,%ymm1 - vpxor %ymm1,%ymm13,%ymm13 - vpshufb .Lrol8(%rip),%ymm13,%ymm13 - vpaddd %ymm13,%ymm9,%ymm9 - vpxor %ymm9,%ymm5,%ymm5 - vpslld $7,%ymm5,%ymm3 - vpsrld $25,%ymm5,%ymm5 - vpxor %ymm3,%ymm5,%ymm5 - vpalignr $4,%ymm13,%ymm13,%ymm13 - vpalignr $8,%ymm9,%ymm9,%ymm9 - vpalignr $12,%ymm5,%ymm5,%ymm5 - - decq %r10 - jne .Lopen_avx2_192_rounds - vpaddd %ymm2,%ymm0,%ymm0 - vpaddd %ymm2,%ymm1,%ymm1 - vpaddd %ymm6,%ymm4,%ymm4 - vpaddd %ymm6,%ymm5,%ymm5 - vpaddd %ymm10,%ymm8,%ymm8 - vpaddd %ymm10,%ymm9,%ymm9 - vpaddd %ymm11,%ymm12,%ymm12 - vpaddd %ymm15,%ymm13,%ymm13 - vperm2i128 $0x02,%ymm0,%ymm4,%ymm3 - - vpand .Lclamp(%rip),%ymm3,%ymm3 - vmovdqa %ymm3,0+0(%rbp) - - vperm2i128 $0x13,%ymm0,%ymm4,%ymm0 - vperm2i128 $0x13,%ymm8,%ymm12,%ymm4 - vperm2i128 $0x02,%ymm1,%ymm5,%ymm8 - vperm2i128 $0x02,%ymm9,%ymm13,%ymm12 - vperm2i128 $0x13,%ymm1,%ymm5,%ymm1 - vperm2i128 $0x13,%ymm9,%ymm13,%ymm5 -.Lopen_avx2_short: - movq %r8,%r8 - call poly_hash_ad_internal -.Lopen_avx2_short_hash_and_xor_loop: - cmpq $32,%rbx - jb .Lopen_avx2_short_tail_32 - subq $32,%rbx - addq 0+0(%rsi),%r10 - adcq 8+0(%rsi),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - addq 0+16(%rsi),%r10 - adcq 8+16(%rsi),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - - vpxor (%rsi),%ymm0,%ymm0 - vmovdqu %ymm0,(%rdi) - leaq 32(%rsi),%rsi - leaq 32(%rdi),%rdi - - vmovdqa %ymm4,%ymm0 - vmovdqa %ymm8,%ymm4 - vmovdqa %ymm12,%ymm8 - vmovdqa %ymm1,%ymm12 - vmovdqa %ymm5,%ymm1 - vmovdqa %ymm9,%ymm5 - vmovdqa %ymm13,%ymm9 - vmovdqa %ymm2,%ymm13 - vmovdqa %ymm6,%ymm2 - jmp .Lopen_avx2_short_hash_and_xor_loop -.Lopen_avx2_short_tail_32: - cmpq $16,%rbx - vmovdqa %xmm0,%xmm1 - jb .Lopen_avx2_short_tail_32_exit - subq $16,%rbx - addq 0+0(%rsi),%r10 - adcq 8+0(%rsi),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - vpxor (%rsi),%xmm0,%xmm3 - vmovdqu %xmm3,(%rdi) - leaq 16(%rsi),%rsi - leaq 16(%rdi),%rdi - vextracti128 $1,%ymm0,%xmm1 -.Lopen_avx2_short_tail_32_exit: - vzeroupper - jmp .Lopen_sse_tail_16 - -.Lopen_avx2_320: - vmovdqa %ymm0,%ymm1 - vmovdqa %ymm0,%ymm2 - vmovdqa %ymm4,%ymm5 - vmovdqa %ymm4,%ymm6 - vmovdqa %ymm8,%ymm9 - vmovdqa %ymm8,%ymm10 - vpaddd .Lavx2_inc(%rip),%ymm12,%ymm13 - vpaddd .Lavx2_inc(%rip),%ymm13,%ymm14 - vmovdqa %ymm4,%ymm7 - vmovdqa %ymm8,%ymm11 - vmovdqa %ymm12,0+160(%rbp) - vmovdqa %ymm13,0+192(%rbp) - vmovdqa %ymm14,0+224(%rbp) - movq $10,%r10 -.Lopen_avx2_320_rounds: - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb .Lrol16(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpsrld $20,%ymm4,%ymm3 - vpslld $12,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb .Lrol8(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpslld $7,%ymm4,%ymm3 - vpsrld $25,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpalignr $12,%ymm12,%ymm12,%ymm12 - vpalignr $8,%ymm8,%ymm8,%ymm8 - vpalignr $4,%ymm4,%ymm4,%ymm4 - vpaddd %ymm5,%ymm1,%ymm1 - vpxor %ymm1,%ymm13,%ymm13 - vpshufb .Lrol16(%rip),%ymm13,%ymm13 - vpaddd %ymm13,%ymm9,%ymm9 - vpxor %ymm9,%ymm5,%ymm5 - vpsrld $20,%ymm5,%ymm3 - vpslld $12,%ymm5,%ymm5 - vpxor %ymm3,%ymm5,%ymm5 - vpaddd %ymm5,%ymm1,%ymm1 - vpxor %ymm1,%ymm13,%ymm13 - vpshufb .Lrol8(%rip),%ymm13,%ymm13 - vpaddd %ymm13,%ymm9,%ymm9 - vpxor %ymm9,%ymm5,%ymm5 - vpslld $7,%ymm5,%ymm3 - vpsrld $25,%ymm5,%ymm5 - vpxor %ymm3,%ymm5,%ymm5 - vpalignr $12,%ymm13,%ymm13,%ymm13 - vpalignr $8,%ymm9,%ymm9,%ymm9 - vpalignr $4,%ymm5,%ymm5,%ymm5 - vpaddd %ymm6,%ymm2,%ymm2 - vpxor %ymm2,%ymm14,%ymm14 - vpshufb .Lrol16(%rip),%ymm14,%ymm14 - vpaddd %ymm14,%ymm10,%ymm10 - vpxor %ymm10,%ymm6,%ymm6 - vpsrld $20,%ymm6,%ymm3 - vpslld $12,%ymm6,%ymm6 - vpxor %ymm3,%ymm6,%ymm6 - vpaddd %ymm6,%ymm2,%ymm2 - vpxor %ymm2,%ymm14,%ymm14 - vpshufb .Lrol8(%rip),%ymm14,%ymm14 - vpaddd %ymm14,%ymm10,%ymm10 - vpxor %ymm10,%ymm6,%ymm6 - vpslld $7,%ymm6,%ymm3 - vpsrld $25,%ymm6,%ymm6 - vpxor %ymm3,%ymm6,%ymm6 - vpalignr $12,%ymm14,%ymm14,%ymm14 - vpalignr $8,%ymm10,%ymm10,%ymm10 - vpalignr $4,%ymm6,%ymm6,%ymm6 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb .Lrol16(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpsrld $20,%ymm4,%ymm3 - vpslld $12,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb .Lrol8(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpslld $7,%ymm4,%ymm3 - vpsrld $25,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpalignr $4,%ymm12,%ymm12,%ymm12 - vpalignr $8,%ymm8,%ymm8,%ymm8 - vpalignr $12,%ymm4,%ymm4,%ymm4 - vpaddd %ymm5,%ymm1,%ymm1 - vpxor %ymm1,%ymm13,%ymm13 - vpshufb .Lrol16(%rip),%ymm13,%ymm13 - vpaddd %ymm13,%ymm9,%ymm9 - vpxor %ymm9,%ymm5,%ymm5 - vpsrld $20,%ymm5,%ymm3 - vpslld $12,%ymm5,%ymm5 - vpxor %ymm3,%ymm5,%ymm5 - vpaddd %ymm5,%ymm1,%ymm1 - vpxor %ymm1,%ymm13,%ymm13 - vpshufb .Lrol8(%rip),%ymm13,%ymm13 - vpaddd %ymm13,%ymm9,%ymm9 - vpxor %ymm9,%ymm5,%ymm5 - vpslld $7,%ymm5,%ymm3 - vpsrld $25,%ymm5,%ymm5 - vpxor %ymm3,%ymm5,%ymm5 - vpalignr $4,%ymm13,%ymm13,%ymm13 - vpalignr $8,%ymm9,%ymm9,%ymm9 - vpalignr $12,%ymm5,%ymm5,%ymm5 - vpaddd %ymm6,%ymm2,%ymm2 - vpxor %ymm2,%ymm14,%ymm14 - vpshufb .Lrol16(%rip),%ymm14,%ymm14 - vpaddd %ymm14,%ymm10,%ymm10 - vpxor %ymm10,%ymm6,%ymm6 - vpsrld $20,%ymm6,%ymm3 - vpslld $12,%ymm6,%ymm6 - vpxor %ymm3,%ymm6,%ymm6 - vpaddd %ymm6,%ymm2,%ymm2 - vpxor %ymm2,%ymm14,%ymm14 - vpshufb .Lrol8(%rip),%ymm14,%ymm14 - vpaddd %ymm14,%ymm10,%ymm10 - vpxor %ymm10,%ymm6,%ymm6 - vpslld $7,%ymm6,%ymm3 - vpsrld $25,%ymm6,%ymm6 - vpxor %ymm3,%ymm6,%ymm6 - vpalignr $4,%ymm14,%ymm14,%ymm14 - vpalignr $8,%ymm10,%ymm10,%ymm10 - vpalignr $12,%ymm6,%ymm6,%ymm6 - - decq %r10 - jne .Lopen_avx2_320_rounds - vpaddd .Lchacha20_consts(%rip),%ymm0,%ymm0 - vpaddd .Lchacha20_consts(%rip),%ymm1,%ymm1 - vpaddd .Lchacha20_consts(%rip),%ymm2,%ymm2 - vpaddd %ymm7,%ymm4,%ymm4 - vpaddd %ymm7,%ymm5,%ymm5 - vpaddd %ymm7,%ymm6,%ymm6 - vpaddd %ymm11,%ymm8,%ymm8 - vpaddd %ymm11,%ymm9,%ymm9 - vpaddd %ymm11,%ymm10,%ymm10 - vpaddd 0+160(%rbp),%ymm12,%ymm12 - vpaddd 0+192(%rbp),%ymm13,%ymm13 - vpaddd 0+224(%rbp),%ymm14,%ymm14 - vperm2i128 $0x02,%ymm0,%ymm4,%ymm3 - - vpand .Lclamp(%rip),%ymm3,%ymm3 - vmovdqa %ymm3,0+0(%rbp) - - vperm2i128 $0x13,%ymm0,%ymm4,%ymm0 - vperm2i128 $0x13,%ymm8,%ymm12,%ymm4 - vperm2i128 $0x02,%ymm1,%ymm5,%ymm8 - vperm2i128 $0x02,%ymm9,%ymm13,%ymm12 - vperm2i128 $0x13,%ymm1,%ymm5,%ymm1 - vperm2i128 $0x13,%ymm9,%ymm13,%ymm5 - vperm2i128 $0x02,%ymm2,%ymm6,%ymm9 - vperm2i128 $0x02,%ymm10,%ymm14,%ymm13 - vperm2i128 $0x13,%ymm2,%ymm6,%ymm2 - vperm2i128 $0x13,%ymm10,%ymm14,%ymm6 - jmp .Lopen_avx2_short -.size chacha20_poly1305_open_avx2, .-chacha20_poly1305_open_avx2 -.cfi_endproc - - -.type chacha20_poly1305_seal_avx2,@function -.align 64 -chacha20_poly1305_seal_avx2: -.cfi_startproc - - -.cfi_adjust_cfa_offset 8 -.cfi_offset %rbp,-16 -.cfi_adjust_cfa_offset 8 -.cfi_offset %rbx,-24 -.cfi_adjust_cfa_offset 8 -.cfi_offset %r12,-32 -.cfi_adjust_cfa_offset 8 -.cfi_offset %r13,-40 -.cfi_adjust_cfa_offset 8 -.cfi_offset %r14,-48 -.cfi_adjust_cfa_offset 8 -.cfi_offset %r15,-56 -.cfi_adjust_cfa_offset 8 -.cfi_offset %r9,-64 -.cfi_adjust_cfa_offset 288 + 32 - - vzeroupper - vmovdqa .Lchacha20_consts(%rip),%ymm0 - vbroadcasti128 0(%r9),%ymm4 - vbroadcasti128 16(%r9),%ymm8 - vbroadcasti128 32(%r9),%ymm12 - vpaddd .Lavx2_init(%rip),%ymm12,%ymm12 - cmpq $192,%rbx - jbe .Lseal_avx2_192 - cmpq $320,%rbx - jbe .Lseal_avx2_320 - vmovdqa %ymm0,%ymm1 - vmovdqa %ymm0,%ymm2 - vmovdqa %ymm0,%ymm3 - vmovdqa %ymm4,%ymm5 - vmovdqa %ymm4,%ymm6 - vmovdqa %ymm4,%ymm7 - vmovdqa %ymm4,0+64(%rbp) - vmovdqa %ymm8,%ymm9 - vmovdqa %ymm8,%ymm10 - vmovdqa %ymm8,%ymm11 - vmovdqa %ymm8,0+96(%rbp) - vmovdqa %ymm12,%ymm15 - vpaddd .Lavx2_inc(%rip),%ymm15,%ymm14 - vpaddd .Lavx2_inc(%rip),%ymm14,%ymm13 - vpaddd .Lavx2_inc(%rip),%ymm13,%ymm12 - vmovdqa %ymm12,0+160(%rbp) - vmovdqa %ymm13,0+192(%rbp) - vmovdqa %ymm14,0+224(%rbp) - vmovdqa %ymm15,0+256(%rbp) - movq $10,%r10 -.Lseal_avx2_init_rounds: - vmovdqa %ymm8,0+128(%rbp) - vmovdqa .Lrol16(%rip),%ymm8 - vpaddd %ymm7,%ymm3,%ymm3 - vpaddd %ymm6,%ymm2,%ymm2 - vpaddd %ymm5,%ymm1,%ymm1 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm3,%ymm15,%ymm15 - vpxor %ymm2,%ymm14,%ymm14 - vpxor %ymm1,%ymm13,%ymm13 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb %ymm8,%ymm15,%ymm15 - vpshufb %ymm8,%ymm14,%ymm14 - vpshufb %ymm8,%ymm13,%ymm13 - vpshufb %ymm8,%ymm12,%ymm12 - vpaddd %ymm15,%ymm11,%ymm11 - vpaddd %ymm14,%ymm10,%ymm10 - vpaddd %ymm13,%ymm9,%ymm9 - vpaddd 0+128(%rbp),%ymm12,%ymm8 - vpxor %ymm11,%ymm7,%ymm7 - vpxor %ymm10,%ymm6,%ymm6 - vpxor %ymm9,%ymm5,%ymm5 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa %ymm8,0+128(%rbp) - vpsrld $20,%ymm7,%ymm8 - vpslld $32-20,%ymm7,%ymm7 - vpxor %ymm8,%ymm7,%ymm7 - vpsrld $20,%ymm6,%ymm8 - vpslld $32-20,%ymm6,%ymm6 - vpxor %ymm8,%ymm6,%ymm6 - vpsrld $20,%ymm5,%ymm8 - vpslld $32-20,%ymm5,%ymm5 - vpxor %ymm8,%ymm5,%ymm5 - vpsrld $20,%ymm4,%ymm8 - vpslld $32-20,%ymm4,%ymm4 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa .Lrol8(%rip),%ymm8 - vpaddd %ymm7,%ymm3,%ymm3 - vpaddd %ymm6,%ymm2,%ymm2 - vpaddd %ymm5,%ymm1,%ymm1 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm3,%ymm15,%ymm15 - vpxor %ymm2,%ymm14,%ymm14 - vpxor %ymm1,%ymm13,%ymm13 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb %ymm8,%ymm15,%ymm15 - vpshufb %ymm8,%ymm14,%ymm14 - vpshufb %ymm8,%ymm13,%ymm13 - vpshufb %ymm8,%ymm12,%ymm12 - vpaddd %ymm15,%ymm11,%ymm11 - vpaddd %ymm14,%ymm10,%ymm10 - vpaddd %ymm13,%ymm9,%ymm9 - vpaddd 0+128(%rbp),%ymm12,%ymm8 - vpxor %ymm11,%ymm7,%ymm7 - vpxor %ymm10,%ymm6,%ymm6 - vpxor %ymm9,%ymm5,%ymm5 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa %ymm8,0+128(%rbp) - vpsrld $25,%ymm7,%ymm8 - vpslld $32-25,%ymm7,%ymm7 - vpxor %ymm8,%ymm7,%ymm7 - vpsrld $25,%ymm6,%ymm8 - vpslld $32-25,%ymm6,%ymm6 - vpxor %ymm8,%ymm6,%ymm6 - vpsrld $25,%ymm5,%ymm8 - vpslld $32-25,%ymm5,%ymm5 - vpxor %ymm8,%ymm5,%ymm5 - vpsrld $25,%ymm4,%ymm8 - vpslld $32-25,%ymm4,%ymm4 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa 0+128(%rbp),%ymm8 - vpalignr $4,%ymm7,%ymm7,%ymm7 - vpalignr $8,%ymm11,%ymm11,%ymm11 - vpalignr $12,%ymm15,%ymm15,%ymm15 - vpalignr $4,%ymm6,%ymm6,%ymm6 - vpalignr $8,%ymm10,%ymm10,%ymm10 - vpalignr $12,%ymm14,%ymm14,%ymm14 - vpalignr $4,%ymm5,%ymm5,%ymm5 - vpalignr $8,%ymm9,%ymm9,%ymm9 - vpalignr $12,%ymm13,%ymm13,%ymm13 - vpalignr $4,%ymm4,%ymm4,%ymm4 - vpalignr $8,%ymm8,%ymm8,%ymm8 - vpalignr $12,%ymm12,%ymm12,%ymm12 - vmovdqa %ymm8,0+128(%rbp) - vmovdqa .Lrol16(%rip),%ymm8 - vpaddd %ymm7,%ymm3,%ymm3 - vpaddd %ymm6,%ymm2,%ymm2 - vpaddd %ymm5,%ymm1,%ymm1 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm3,%ymm15,%ymm15 - vpxor %ymm2,%ymm14,%ymm14 - vpxor %ymm1,%ymm13,%ymm13 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb %ymm8,%ymm15,%ymm15 - vpshufb %ymm8,%ymm14,%ymm14 - vpshufb %ymm8,%ymm13,%ymm13 - vpshufb %ymm8,%ymm12,%ymm12 - vpaddd %ymm15,%ymm11,%ymm11 - vpaddd %ymm14,%ymm10,%ymm10 - vpaddd %ymm13,%ymm9,%ymm9 - vpaddd 0+128(%rbp),%ymm12,%ymm8 - vpxor %ymm11,%ymm7,%ymm7 - vpxor %ymm10,%ymm6,%ymm6 - vpxor %ymm9,%ymm5,%ymm5 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa %ymm8,0+128(%rbp) - vpsrld $20,%ymm7,%ymm8 - vpslld $32-20,%ymm7,%ymm7 - vpxor %ymm8,%ymm7,%ymm7 - vpsrld $20,%ymm6,%ymm8 - vpslld $32-20,%ymm6,%ymm6 - vpxor %ymm8,%ymm6,%ymm6 - vpsrld $20,%ymm5,%ymm8 - vpslld $32-20,%ymm5,%ymm5 - vpxor %ymm8,%ymm5,%ymm5 - vpsrld $20,%ymm4,%ymm8 - vpslld $32-20,%ymm4,%ymm4 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa .Lrol8(%rip),%ymm8 - vpaddd %ymm7,%ymm3,%ymm3 - vpaddd %ymm6,%ymm2,%ymm2 - vpaddd %ymm5,%ymm1,%ymm1 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm3,%ymm15,%ymm15 - vpxor %ymm2,%ymm14,%ymm14 - vpxor %ymm1,%ymm13,%ymm13 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb %ymm8,%ymm15,%ymm15 - vpshufb %ymm8,%ymm14,%ymm14 - vpshufb %ymm8,%ymm13,%ymm13 - vpshufb %ymm8,%ymm12,%ymm12 - vpaddd %ymm15,%ymm11,%ymm11 - vpaddd %ymm14,%ymm10,%ymm10 - vpaddd %ymm13,%ymm9,%ymm9 - vpaddd 0+128(%rbp),%ymm12,%ymm8 - vpxor %ymm11,%ymm7,%ymm7 - vpxor %ymm10,%ymm6,%ymm6 - vpxor %ymm9,%ymm5,%ymm5 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa %ymm8,0+128(%rbp) - vpsrld $25,%ymm7,%ymm8 - vpslld $32-25,%ymm7,%ymm7 - vpxor %ymm8,%ymm7,%ymm7 - vpsrld $25,%ymm6,%ymm8 - vpslld $32-25,%ymm6,%ymm6 - vpxor %ymm8,%ymm6,%ymm6 - vpsrld $25,%ymm5,%ymm8 - vpslld $32-25,%ymm5,%ymm5 - vpxor %ymm8,%ymm5,%ymm5 - vpsrld $25,%ymm4,%ymm8 - vpslld $32-25,%ymm4,%ymm4 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa 0+128(%rbp),%ymm8 - vpalignr $12,%ymm7,%ymm7,%ymm7 - vpalignr $8,%ymm11,%ymm11,%ymm11 - vpalignr $4,%ymm15,%ymm15,%ymm15 - vpalignr $12,%ymm6,%ymm6,%ymm6 - vpalignr $8,%ymm10,%ymm10,%ymm10 - vpalignr $4,%ymm14,%ymm14,%ymm14 - vpalignr $12,%ymm5,%ymm5,%ymm5 - vpalignr $8,%ymm9,%ymm9,%ymm9 - vpalignr $4,%ymm13,%ymm13,%ymm13 - vpalignr $12,%ymm4,%ymm4,%ymm4 - vpalignr $8,%ymm8,%ymm8,%ymm8 - vpalignr $4,%ymm12,%ymm12,%ymm12 - - decq %r10 - jnz .Lseal_avx2_init_rounds - vpaddd .Lchacha20_consts(%rip),%ymm3,%ymm3 - vpaddd 0+64(%rbp),%ymm7,%ymm7 - vpaddd 0+96(%rbp),%ymm11,%ymm11 - vpaddd 0+256(%rbp),%ymm15,%ymm15 - vpaddd .Lchacha20_consts(%rip),%ymm2,%ymm2 - vpaddd 0+64(%rbp),%ymm6,%ymm6 - vpaddd 0+96(%rbp),%ymm10,%ymm10 - vpaddd 0+224(%rbp),%ymm14,%ymm14 - vpaddd .Lchacha20_consts(%rip),%ymm1,%ymm1 - vpaddd 0+64(%rbp),%ymm5,%ymm5 - vpaddd 0+96(%rbp),%ymm9,%ymm9 - vpaddd 0+192(%rbp),%ymm13,%ymm13 - vpaddd .Lchacha20_consts(%rip),%ymm0,%ymm0 - vpaddd 0+64(%rbp),%ymm4,%ymm4 - vpaddd 0+96(%rbp),%ymm8,%ymm8 - vpaddd 0+160(%rbp),%ymm12,%ymm12 - - vperm2i128 $0x13,%ymm11,%ymm15,%ymm11 - vperm2i128 $0x02,%ymm3,%ymm7,%ymm15 - vperm2i128 $0x13,%ymm3,%ymm7,%ymm3 - vpand .Lclamp(%rip),%ymm15,%ymm15 - vmovdqa %ymm15,0+0(%rbp) - movq %r8,%r8 - call poly_hash_ad_internal - - vpxor 0(%rsi),%ymm3,%ymm3 - vpxor 32(%rsi),%ymm11,%ymm11 - vmovdqu %ymm3,0(%rdi) - vmovdqu %ymm11,32(%rdi) - vperm2i128 $0x02,%ymm2,%ymm6,%ymm15 - vperm2i128 $0x13,%ymm2,%ymm6,%ymm6 - vperm2i128 $0x02,%ymm10,%ymm14,%ymm2 - vperm2i128 $0x13,%ymm10,%ymm14,%ymm10 - vpxor 0+64(%rsi),%ymm15,%ymm15 - vpxor 32+64(%rsi),%ymm2,%ymm2 - vpxor 64+64(%rsi),%ymm6,%ymm6 - vpxor 96+64(%rsi),%ymm10,%ymm10 - vmovdqu %ymm15,0+64(%rdi) - vmovdqu %ymm2,32+64(%rdi) - vmovdqu %ymm6,64+64(%rdi) - vmovdqu %ymm10,96+64(%rdi) - vperm2i128 $0x02,%ymm1,%ymm5,%ymm15 - vperm2i128 $0x13,%ymm1,%ymm5,%ymm5 - vperm2i128 $0x02,%ymm9,%ymm13,%ymm1 - vperm2i128 $0x13,%ymm9,%ymm13,%ymm9 - vpxor 0+192(%rsi),%ymm15,%ymm15 - vpxor 32+192(%rsi),%ymm1,%ymm1 - vpxor 64+192(%rsi),%ymm5,%ymm5 - vpxor 96+192(%rsi),%ymm9,%ymm9 - vmovdqu %ymm15,0+192(%rdi) - vmovdqu %ymm1,32+192(%rdi) - vmovdqu %ymm5,64+192(%rdi) - vmovdqu %ymm9,96+192(%rdi) - vperm2i128 $0x13,%ymm0,%ymm4,%ymm15 - vperm2i128 $0x02,%ymm0,%ymm4,%ymm0 - vperm2i128 $0x02,%ymm8,%ymm12,%ymm4 - vperm2i128 $0x13,%ymm8,%ymm12,%ymm12 - vmovdqa %ymm15,%ymm8 - - leaq 320(%rsi),%rsi - subq $320,%rbx - movq $320,%rcx - cmpq $128,%rbx - jbe .Lseal_avx2_short_hash_remainder - vpxor 0(%rsi),%ymm0,%ymm0 - vpxor 32(%rsi),%ymm4,%ymm4 - vpxor 64(%rsi),%ymm8,%ymm8 - vpxor 96(%rsi),%ymm12,%ymm12 - vmovdqu %ymm0,320(%rdi) - vmovdqu %ymm4,352(%rdi) - vmovdqu %ymm8,384(%rdi) - vmovdqu %ymm12,416(%rdi) - leaq 128(%rsi),%rsi - subq $128,%rbx - movq $8,%rcx - movq $2,%r8 - cmpq $128,%rbx - jbe .Lseal_avx2_tail_128 - cmpq $256,%rbx - jbe .Lseal_avx2_tail_256 - cmpq $384,%rbx - jbe .Lseal_avx2_tail_384 - cmpq $512,%rbx - jbe .Lseal_avx2_tail_512 - vmovdqa .Lchacha20_consts(%rip),%ymm0 - vmovdqa 0+64(%rbp),%ymm4 - vmovdqa 0+96(%rbp),%ymm8 - vmovdqa %ymm0,%ymm1 - vmovdqa %ymm4,%ymm5 - vmovdqa %ymm8,%ymm9 - vmovdqa %ymm0,%ymm2 - vmovdqa %ymm4,%ymm6 - vmovdqa %ymm8,%ymm10 - vmovdqa %ymm0,%ymm3 - vmovdqa %ymm4,%ymm7 - vmovdqa %ymm8,%ymm11 - vmovdqa .Lavx2_inc(%rip),%ymm12 - vpaddd 0+160(%rbp),%ymm12,%ymm15 - vpaddd %ymm15,%ymm12,%ymm14 - vpaddd %ymm14,%ymm12,%ymm13 - vpaddd %ymm13,%ymm12,%ymm12 - vmovdqa %ymm15,0+256(%rbp) - vmovdqa %ymm14,0+224(%rbp) - vmovdqa %ymm13,0+192(%rbp) - vmovdqa %ymm12,0+160(%rbp) - vmovdqa %ymm8,0+128(%rbp) - vmovdqa .Lrol16(%rip),%ymm8 - vpaddd %ymm7,%ymm3,%ymm3 - vpaddd %ymm6,%ymm2,%ymm2 - vpaddd %ymm5,%ymm1,%ymm1 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm3,%ymm15,%ymm15 - vpxor %ymm2,%ymm14,%ymm14 - vpxor %ymm1,%ymm13,%ymm13 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb %ymm8,%ymm15,%ymm15 - vpshufb %ymm8,%ymm14,%ymm14 - vpshufb %ymm8,%ymm13,%ymm13 - vpshufb %ymm8,%ymm12,%ymm12 - vpaddd %ymm15,%ymm11,%ymm11 - vpaddd %ymm14,%ymm10,%ymm10 - vpaddd %ymm13,%ymm9,%ymm9 - vpaddd 0+128(%rbp),%ymm12,%ymm8 - vpxor %ymm11,%ymm7,%ymm7 - vpxor %ymm10,%ymm6,%ymm6 - vpxor %ymm9,%ymm5,%ymm5 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa %ymm8,0+128(%rbp) - vpsrld $20,%ymm7,%ymm8 - vpslld $32-20,%ymm7,%ymm7 - vpxor %ymm8,%ymm7,%ymm7 - vpsrld $20,%ymm6,%ymm8 - vpslld $32-20,%ymm6,%ymm6 - vpxor %ymm8,%ymm6,%ymm6 - vpsrld $20,%ymm5,%ymm8 - vpslld $32-20,%ymm5,%ymm5 - vpxor %ymm8,%ymm5,%ymm5 - vpsrld $20,%ymm4,%ymm8 - vpslld $32-20,%ymm4,%ymm4 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa .Lrol8(%rip),%ymm8 - vpaddd %ymm7,%ymm3,%ymm3 - vpaddd %ymm6,%ymm2,%ymm2 - vpaddd %ymm5,%ymm1,%ymm1 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm3,%ymm15,%ymm15 - vpxor %ymm2,%ymm14,%ymm14 - vpxor %ymm1,%ymm13,%ymm13 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb %ymm8,%ymm15,%ymm15 - vpshufb %ymm8,%ymm14,%ymm14 - vpshufb %ymm8,%ymm13,%ymm13 - vpshufb %ymm8,%ymm12,%ymm12 - vpaddd %ymm15,%ymm11,%ymm11 - vpaddd %ymm14,%ymm10,%ymm10 - vpaddd %ymm13,%ymm9,%ymm9 - vpaddd 0+128(%rbp),%ymm12,%ymm8 - vpxor %ymm11,%ymm7,%ymm7 - vpxor %ymm10,%ymm6,%ymm6 - vpxor %ymm9,%ymm5,%ymm5 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa %ymm8,0+128(%rbp) - vpsrld $25,%ymm7,%ymm8 - vpslld $32-25,%ymm7,%ymm7 - vpxor %ymm8,%ymm7,%ymm7 - vpsrld $25,%ymm6,%ymm8 - vpslld $32-25,%ymm6,%ymm6 - vpxor %ymm8,%ymm6,%ymm6 - vpsrld $25,%ymm5,%ymm8 - vpslld $32-25,%ymm5,%ymm5 - vpxor %ymm8,%ymm5,%ymm5 - vpsrld $25,%ymm4,%ymm8 - vpslld $32-25,%ymm4,%ymm4 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa 0+128(%rbp),%ymm8 - vpalignr $4,%ymm7,%ymm7,%ymm7 - vpalignr $8,%ymm11,%ymm11,%ymm11 - vpalignr $12,%ymm15,%ymm15,%ymm15 - vpalignr $4,%ymm6,%ymm6,%ymm6 - vpalignr $8,%ymm10,%ymm10,%ymm10 - vpalignr $12,%ymm14,%ymm14,%ymm14 - vpalignr $4,%ymm5,%ymm5,%ymm5 - vpalignr $8,%ymm9,%ymm9,%ymm9 - vpalignr $12,%ymm13,%ymm13,%ymm13 - vpalignr $4,%ymm4,%ymm4,%ymm4 - vpalignr $8,%ymm8,%ymm8,%ymm8 - vpalignr $12,%ymm12,%ymm12,%ymm12 - vmovdqa %ymm8,0+128(%rbp) - vmovdqa .Lrol16(%rip),%ymm8 - vpaddd %ymm7,%ymm3,%ymm3 - vpaddd %ymm6,%ymm2,%ymm2 - vpaddd %ymm5,%ymm1,%ymm1 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm3,%ymm15,%ymm15 - vpxor %ymm2,%ymm14,%ymm14 - vpxor %ymm1,%ymm13,%ymm13 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb %ymm8,%ymm15,%ymm15 - vpshufb %ymm8,%ymm14,%ymm14 - vpshufb %ymm8,%ymm13,%ymm13 - vpshufb %ymm8,%ymm12,%ymm12 - vpaddd %ymm15,%ymm11,%ymm11 - vpaddd %ymm14,%ymm10,%ymm10 - vpaddd %ymm13,%ymm9,%ymm9 - vpaddd 0+128(%rbp),%ymm12,%ymm8 - vpxor %ymm11,%ymm7,%ymm7 - vpxor %ymm10,%ymm6,%ymm6 - vpxor %ymm9,%ymm5,%ymm5 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa %ymm8,0+128(%rbp) - vpsrld $20,%ymm7,%ymm8 - vpslld $32-20,%ymm7,%ymm7 - vpxor %ymm8,%ymm7,%ymm7 - vpsrld $20,%ymm6,%ymm8 - vpslld $32-20,%ymm6,%ymm6 - vpxor %ymm8,%ymm6,%ymm6 - vpsrld $20,%ymm5,%ymm8 - vpslld $32-20,%ymm5,%ymm5 - vpxor %ymm8,%ymm5,%ymm5 - vpsrld $20,%ymm4,%ymm8 - vpslld $32-20,%ymm4,%ymm4 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa .Lrol8(%rip),%ymm8 - vpaddd %ymm7,%ymm3,%ymm3 - vpaddd %ymm6,%ymm2,%ymm2 - vpaddd %ymm5,%ymm1,%ymm1 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm3,%ymm15,%ymm15 - vpxor %ymm2,%ymm14,%ymm14 - vpxor %ymm1,%ymm13,%ymm13 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb %ymm8,%ymm15,%ymm15 - vpshufb %ymm8,%ymm14,%ymm14 - vpshufb %ymm8,%ymm13,%ymm13 - vpshufb %ymm8,%ymm12,%ymm12 - vpaddd %ymm15,%ymm11,%ymm11 - vpaddd %ymm14,%ymm10,%ymm10 - vpaddd %ymm13,%ymm9,%ymm9 - vpaddd 0+128(%rbp),%ymm12,%ymm8 - vpxor %ymm11,%ymm7,%ymm7 - vpxor %ymm10,%ymm6,%ymm6 - vpxor %ymm9,%ymm5,%ymm5 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa %ymm8,0+128(%rbp) - vpsrld $25,%ymm7,%ymm8 - vpslld $32-25,%ymm7,%ymm7 - vpxor %ymm8,%ymm7,%ymm7 - vpsrld $25,%ymm6,%ymm8 - vpslld $32-25,%ymm6,%ymm6 - vpxor %ymm8,%ymm6,%ymm6 - vpsrld $25,%ymm5,%ymm8 - vpslld $32-25,%ymm5,%ymm5 - vpxor %ymm8,%ymm5,%ymm5 - vpsrld $25,%ymm4,%ymm8 - vpslld $32-25,%ymm4,%ymm4 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa 0+128(%rbp),%ymm8 - vpalignr $12,%ymm7,%ymm7,%ymm7 - vpalignr $8,%ymm11,%ymm11,%ymm11 - vpalignr $4,%ymm15,%ymm15,%ymm15 - vpalignr $12,%ymm6,%ymm6,%ymm6 - vpalignr $8,%ymm10,%ymm10,%ymm10 - vpalignr $4,%ymm14,%ymm14,%ymm14 - vpalignr $12,%ymm5,%ymm5,%ymm5 - vpalignr $8,%ymm9,%ymm9,%ymm9 - vpalignr $4,%ymm13,%ymm13,%ymm13 - vpalignr $12,%ymm4,%ymm4,%ymm4 - vpalignr $8,%ymm8,%ymm8,%ymm8 - vpalignr $4,%ymm12,%ymm12,%ymm12 - vmovdqa %ymm8,0+128(%rbp) - vmovdqa .Lrol16(%rip),%ymm8 - vpaddd %ymm7,%ymm3,%ymm3 - vpaddd %ymm6,%ymm2,%ymm2 - vpaddd %ymm5,%ymm1,%ymm1 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm3,%ymm15,%ymm15 - vpxor %ymm2,%ymm14,%ymm14 - vpxor %ymm1,%ymm13,%ymm13 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb %ymm8,%ymm15,%ymm15 - vpshufb %ymm8,%ymm14,%ymm14 - vpshufb %ymm8,%ymm13,%ymm13 - vpshufb %ymm8,%ymm12,%ymm12 - vpaddd %ymm15,%ymm11,%ymm11 - vpaddd %ymm14,%ymm10,%ymm10 - vpaddd %ymm13,%ymm9,%ymm9 - vpaddd 0+128(%rbp),%ymm12,%ymm8 - vpxor %ymm11,%ymm7,%ymm7 - vpxor %ymm10,%ymm6,%ymm6 - vpxor %ymm9,%ymm5,%ymm5 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa %ymm8,0+128(%rbp) - vpsrld $20,%ymm7,%ymm8 - vpslld $32-20,%ymm7,%ymm7 - vpxor %ymm8,%ymm7,%ymm7 - vpsrld $20,%ymm6,%ymm8 - vpslld $32-20,%ymm6,%ymm6 - vpxor %ymm8,%ymm6,%ymm6 - vpsrld $20,%ymm5,%ymm8 - vpslld $32-20,%ymm5,%ymm5 - vpxor %ymm8,%ymm5,%ymm5 - vpsrld $20,%ymm4,%ymm8 - vpslld $32-20,%ymm4,%ymm4 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa .Lrol8(%rip),%ymm8 - vpaddd %ymm7,%ymm3,%ymm3 - vpaddd %ymm6,%ymm2,%ymm2 - vpaddd %ymm5,%ymm1,%ymm1 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm3,%ymm15,%ymm15 - - subq $16,%rdi - movq $9,%rcx - jmp .Lseal_avx2_main_loop_rounds_entry -.align 32 -.Lseal_avx2_main_loop: - vmovdqa .Lchacha20_consts(%rip),%ymm0 - vmovdqa 0+64(%rbp),%ymm4 - vmovdqa 0+96(%rbp),%ymm8 - vmovdqa %ymm0,%ymm1 - vmovdqa %ymm4,%ymm5 - vmovdqa %ymm8,%ymm9 - vmovdqa %ymm0,%ymm2 - vmovdqa %ymm4,%ymm6 - vmovdqa %ymm8,%ymm10 - vmovdqa %ymm0,%ymm3 - vmovdqa %ymm4,%ymm7 - vmovdqa %ymm8,%ymm11 - vmovdqa .Lavx2_inc(%rip),%ymm12 - vpaddd 0+160(%rbp),%ymm12,%ymm15 - vpaddd %ymm15,%ymm12,%ymm14 - vpaddd %ymm14,%ymm12,%ymm13 - vpaddd %ymm13,%ymm12,%ymm12 - vmovdqa %ymm15,0+256(%rbp) - vmovdqa %ymm14,0+224(%rbp) - vmovdqa %ymm13,0+192(%rbp) - vmovdqa %ymm12,0+160(%rbp) - - movq $10,%rcx -.align 32 -.Lseal_avx2_main_loop_rounds: - addq 0+0(%rdi),%r10 - adcq 8+0(%rdi),%r11 - adcq $1,%r12 - vmovdqa %ymm8,0+128(%rbp) - vmovdqa .Lrol16(%rip),%ymm8 - vpaddd %ymm7,%ymm3,%ymm3 - vpaddd %ymm6,%ymm2,%ymm2 - vpaddd %ymm5,%ymm1,%ymm1 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm3,%ymm15,%ymm15 - vpxor %ymm2,%ymm14,%ymm14 - vpxor %ymm1,%ymm13,%ymm13 - vpxor %ymm0,%ymm12,%ymm12 - movq 0+0+0(%rbp),%rdx - movq %rdx,%r15 - mulxq %r10,%r13,%r14 - mulxq %r11,%rax,%rdx - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - vpshufb %ymm8,%ymm15,%ymm15 - vpshufb %ymm8,%ymm14,%ymm14 - vpshufb %ymm8,%ymm13,%ymm13 - vpshufb %ymm8,%ymm12,%ymm12 - vpaddd %ymm15,%ymm11,%ymm11 - vpaddd %ymm14,%ymm10,%ymm10 - vpaddd %ymm13,%ymm9,%ymm9 - vpaddd 0+128(%rbp),%ymm12,%ymm8 - vpxor %ymm11,%ymm7,%ymm7 - movq 8+0+0(%rbp),%rdx - mulxq %r10,%r10,%rax - addq %r10,%r14 - mulxq %r11,%r11,%r9 - adcq %r11,%r15 - adcq $0,%r9 - imulq %r12,%rdx - vpxor %ymm10,%ymm6,%ymm6 - vpxor %ymm9,%ymm5,%ymm5 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa %ymm8,0+128(%rbp) - vpsrld $20,%ymm7,%ymm8 - vpslld $32-20,%ymm7,%ymm7 - vpxor %ymm8,%ymm7,%ymm7 - vpsrld $20,%ymm6,%ymm8 - vpslld $32-20,%ymm6,%ymm6 - vpxor %ymm8,%ymm6,%ymm6 - vpsrld $20,%ymm5,%ymm8 - vpslld $32-20,%ymm5,%ymm5 - addq %rax,%r15 - adcq %rdx,%r9 - vpxor %ymm8,%ymm5,%ymm5 - vpsrld $20,%ymm4,%ymm8 - vpslld $32-20,%ymm4,%ymm4 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa .Lrol8(%rip),%ymm8 - vpaddd %ymm7,%ymm3,%ymm3 - vpaddd %ymm6,%ymm2,%ymm2 - vpaddd %ymm5,%ymm1,%ymm1 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm3,%ymm15,%ymm15 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - -.Lseal_avx2_main_loop_rounds_entry: - vpxor %ymm2,%ymm14,%ymm14 - vpxor %ymm1,%ymm13,%ymm13 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb %ymm8,%ymm15,%ymm15 - vpshufb %ymm8,%ymm14,%ymm14 - vpshufb %ymm8,%ymm13,%ymm13 - vpshufb %ymm8,%ymm12,%ymm12 - vpaddd %ymm15,%ymm11,%ymm11 - vpaddd %ymm14,%ymm10,%ymm10 - addq 0+16(%rdi),%r10 - adcq 8+16(%rdi),%r11 - adcq $1,%r12 - vpaddd %ymm13,%ymm9,%ymm9 - vpaddd 0+128(%rbp),%ymm12,%ymm8 - vpxor %ymm11,%ymm7,%ymm7 - vpxor %ymm10,%ymm6,%ymm6 - vpxor %ymm9,%ymm5,%ymm5 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa %ymm8,0+128(%rbp) - vpsrld $25,%ymm7,%ymm8 - movq 0+0+0(%rbp),%rdx - movq %rdx,%r15 - mulxq %r10,%r13,%r14 - mulxq %r11,%rax,%rdx - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - vpslld $32-25,%ymm7,%ymm7 - vpxor %ymm8,%ymm7,%ymm7 - vpsrld $25,%ymm6,%ymm8 - vpslld $32-25,%ymm6,%ymm6 - vpxor %ymm8,%ymm6,%ymm6 - vpsrld $25,%ymm5,%ymm8 - vpslld $32-25,%ymm5,%ymm5 - vpxor %ymm8,%ymm5,%ymm5 - vpsrld $25,%ymm4,%ymm8 - vpslld $32-25,%ymm4,%ymm4 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa 0+128(%rbp),%ymm8 - vpalignr $4,%ymm7,%ymm7,%ymm7 - vpalignr $8,%ymm11,%ymm11,%ymm11 - vpalignr $12,%ymm15,%ymm15,%ymm15 - vpalignr $4,%ymm6,%ymm6,%ymm6 - vpalignr $8,%ymm10,%ymm10,%ymm10 - vpalignr $12,%ymm14,%ymm14,%ymm14 - movq 8+0+0(%rbp),%rdx - mulxq %r10,%r10,%rax - addq %r10,%r14 - mulxq %r11,%r11,%r9 - adcq %r11,%r15 - adcq $0,%r9 - imulq %r12,%rdx - vpalignr $4,%ymm5,%ymm5,%ymm5 - vpalignr $8,%ymm9,%ymm9,%ymm9 - vpalignr $12,%ymm13,%ymm13,%ymm13 - vpalignr $4,%ymm4,%ymm4,%ymm4 - vpalignr $8,%ymm8,%ymm8,%ymm8 - vpalignr $12,%ymm12,%ymm12,%ymm12 - vmovdqa %ymm8,0+128(%rbp) - vmovdqa .Lrol16(%rip),%ymm8 - vpaddd %ymm7,%ymm3,%ymm3 - vpaddd %ymm6,%ymm2,%ymm2 - vpaddd %ymm5,%ymm1,%ymm1 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm3,%ymm15,%ymm15 - vpxor %ymm2,%ymm14,%ymm14 - vpxor %ymm1,%ymm13,%ymm13 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb %ymm8,%ymm15,%ymm15 - vpshufb %ymm8,%ymm14,%ymm14 - addq %rax,%r15 - adcq %rdx,%r9 - vpshufb %ymm8,%ymm13,%ymm13 - vpshufb %ymm8,%ymm12,%ymm12 - vpaddd %ymm15,%ymm11,%ymm11 - vpaddd %ymm14,%ymm10,%ymm10 - vpaddd %ymm13,%ymm9,%ymm9 - vpaddd 0+128(%rbp),%ymm12,%ymm8 - vpxor %ymm11,%ymm7,%ymm7 - vpxor %ymm10,%ymm6,%ymm6 - vpxor %ymm9,%ymm5,%ymm5 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa %ymm8,0+128(%rbp) - vpsrld $20,%ymm7,%ymm8 - vpslld $32-20,%ymm7,%ymm7 - vpxor %ymm8,%ymm7,%ymm7 - vpsrld $20,%ymm6,%ymm8 - vpslld $32-20,%ymm6,%ymm6 - vpxor %ymm8,%ymm6,%ymm6 - addq 0+32(%rdi),%r10 - adcq 8+32(%rdi),%r11 - adcq $1,%r12 - - leaq 48(%rdi),%rdi - vpsrld $20,%ymm5,%ymm8 - vpslld $32-20,%ymm5,%ymm5 - vpxor %ymm8,%ymm5,%ymm5 - vpsrld $20,%ymm4,%ymm8 - vpslld $32-20,%ymm4,%ymm4 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa .Lrol8(%rip),%ymm8 - vpaddd %ymm7,%ymm3,%ymm3 - vpaddd %ymm6,%ymm2,%ymm2 - vpaddd %ymm5,%ymm1,%ymm1 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm3,%ymm15,%ymm15 - vpxor %ymm2,%ymm14,%ymm14 - vpxor %ymm1,%ymm13,%ymm13 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb %ymm8,%ymm15,%ymm15 - vpshufb %ymm8,%ymm14,%ymm14 - vpshufb %ymm8,%ymm13,%ymm13 - movq 0+0+0(%rbp),%rdx - movq %rdx,%r15 - mulxq %r10,%r13,%r14 - mulxq %r11,%rax,%rdx - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - vpshufb %ymm8,%ymm12,%ymm12 - vpaddd %ymm15,%ymm11,%ymm11 - vpaddd %ymm14,%ymm10,%ymm10 - vpaddd %ymm13,%ymm9,%ymm9 - vpaddd 0+128(%rbp),%ymm12,%ymm8 - vpxor %ymm11,%ymm7,%ymm7 - vpxor %ymm10,%ymm6,%ymm6 - vpxor %ymm9,%ymm5,%ymm5 - movq 8+0+0(%rbp),%rdx - mulxq %r10,%r10,%rax - addq %r10,%r14 - mulxq %r11,%r11,%r9 - adcq %r11,%r15 - adcq $0,%r9 - imulq %r12,%rdx - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa %ymm8,0+128(%rbp) - vpsrld $25,%ymm7,%ymm8 - vpslld $32-25,%ymm7,%ymm7 - vpxor %ymm8,%ymm7,%ymm7 - vpsrld $25,%ymm6,%ymm8 - vpslld $32-25,%ymm6,%ymm6 - vpxor %ymm8,%ymm6,%ymm6 - addq %rax,%r15 - adcq %rdx,%r9 - vpsrld $25,%ymm5,%ymm8 - vpslld $32-25,%ymm5,%ymm5 - vpxor %ymm8,%ymm5,%ymm5 - vpsrld $25,%ymm4,%ymm8 - vpslld $32-25,%ymm4,%ymm4 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa 0+128(%rbp),%ymm8 - vpalignr $12,%ymm7,%ymm7,%ymm7 - vpalignr $8,%ymm11,%ymm11,%ymm11 - vpalignr $4,%ymm15,%ymm15,%ymm15 - vpalignr $12,%ymm6,%ymm6,%ymm6 - vpalignr $8,%ymm10,%ymm10,%ymm10 - vpalignr $4,%ymm14,%ymm14,%ymm14 - vpalignr $12,%ymm5,%ymm5,%ymm5 - vpalignr $8,%ymm9,%ymm9,%ymm9 - vpalignr $4,%ymm13,%ymm13,%ymm13 - vpalignr $12,%ymm4,%ymm4,%ymm4 - vpalignr $8,%ymm8,%ymm8,%ymm8 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - vpalignr $4,%ymm12,%ymm12,%ymm12 - - decq %rcx - jne .Lseal_avx2_main_loop_rounds - vpaddd .Lchacha20_consts(%rip),%ymm3,%ymm3 - vpaddd 0+64(%rbp),%ymm7,%ymm7 - vpaddd 0+96(%rbp),%ymm11,%ymm11 - vpaddd 0+256(%rbp),%ymm15,%ymm15 - vpaddd .Lchacha20_consts(%rip),%ymm2,%ymm2 - vpaddd 0+64(%rbp),%ymm6,%ymm6 - vpaddd 0+96(%rbp),%ymm10,%ymm10 - vpaddd 0+224(%rbp),%ymm14,%ymm14 - vpaddd .Lchacha20_consts(%rip),%ymm1,%ymm1 - vpaddd 0+64(%rbp),%ymm5,%ymm5 - vpaddd 0+96(%rbp),%ymm9,%ymm9 - vpaddd 0+192(%rbp),%ymm13,%ymm13 - vpaddd .Lchacha20_consts(%rip),%ymm0,%ymm0 - vpaddd 0+64(%rbp),%ymm4,%ymm4 - vpaddd 0+96(%rbp),%ymm8,%ymm8 - vpaddd 0+160(%rbp),%ymm12,%ymm12 - - vmovdqa %ymm0,0+128(%rbp) - addq 0+0(%rdi),%r10 - adcq 8+0(%rdi),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rdx - movq %rdx,%r15 - mulxq %r10,%r13,%r14 - mulxq %r11,%rax,%rdx - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rdx - mulxq %r10,%r10,%rax - addq %r10,%r14 - mulxq %r11,%r11,%r9 - adcq %r11,%r15 - adcq $0,%r9 - imulq %r12,%rdx - addq %rax,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - addq 0+16(%rdi),%r10 - adcq 8+16(%rdi),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rdx - movq %rdx,%r15 - mulxq %r10,%r13,%r14 - mulxq %r11,%rax,%rdx - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rdx - mulxq %r10,%r10,%rax - addq %r10,%r14 - mulxq %r11,%r11,%r9 - adcq %r11,%r15 - adcq $0,%r9 - imulq %r12,%rdx - addq %rax,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - leaq 32(%rdi),%rdi - vperm2i128 $0x02,%ymm3,%ymm7,%ymm0 - vperm2i128 $0x13,%ymm3,%ymm7,%ymm7 - vperm2i128 $0x02,%ymm11,%ymm15,%ymm3 - vperm2i128 $0x13,%ymm11,%ymm15,%ymm11 - vpxor 0+0(%rsi),%ymm0,%ymm0 - vpxor 32+0(%rsi),%ymm3,%ymm3 - vpxor 64+0(%rsi),%ymm7,%ymm7 - vpxor 96+0(%rsi),%ymm11,%ymm11 - vmovdqu %ymm0,0+0(%rdi) - vmovdqu %ymm3,32+0(%rdi) - vmovdqu %ymm7,64+0(%rdi) - vmovdqu %ymm11,96+0(%rdi) - - vmovdqa 0+128(%rbp),%ymm0 - vperm2i128 $0x02,%ymm2,%ymm6,%ymm3 - vperm2i128 $0x13,%ymm2,%ymm6,%ymm6 - vperm2i128 $0x02,%ymm10,%ymm14,%ymm2 - vperm2i128 $0x13,%ymm10,%ymm14,%ymm10 - vpxor 0+128(%rsi),%ymm3,%ymm3 - vpxor 32+128(%rsi),%ymm2,%ymm2 - vpxor 64+128(%rsi),%ymm6,%ymm6 - vpxor 96+128(%rsi),%ymm10,%ymm10 - vmovdqu %ymm3,0+128(%rdi) - vmovdqu %ymm2,32+128(%rdi) - vmovdqu %ymm6,64+128(%rdi) - vmovdqu %ymm10,96+128(%rdi) - vperm2i128 $0x02,%ymm1,%ymm5,%ymm3 - vperm2i128 $0x13,%ymm1,%ymm5,%ymm5 - vperm2i128 $0x02,%ymm9,%ymm13,%ymm1 - vperm2i128 $0x13,%ymm9,%ymm13,%ymm9 - vpxor 0+256(%rsi),%ymm3,%ymm3 - vpxor 32+256(%rsi),%ymm1,%ymm1 - vpxor 64+256(%rsi),%ymm5,%ymm5 - vpxor 96+256(%rsi),%ymm9,%ymm9 - vmovdqu %ymm3,0+256(%rdi) - vmovdqu %ymm1,32+256(%rdi) - vmovdqu %ymm5,64+256(%rdi) - vmovdqu %ymm9,96+256(%rdi) - vperm2i128 $0x02,%ymm0,%ymm4,%ymm3 - vperm2i128 $0x13,%ymm0,%ymm4,%ymm4 - vperm2i128 $0x02,%ymm8,%ymm12,%ymm0 - vperm2i128 $0x13,%ymm8,%ymm12,%ymm8 - vpxor 0+384(%rsi),%ymm3,%ymm3 - vpxor 32+384(%rsi),%ymm0,%ymm0 - vpxor 64+384(%rsi),%ymm4,%ymm4 - vpxor 96+384(%rsi),%ymm8,%ymm8 - vmovdqu %ymm3,0+384(%rdi) - vmovdqu %ymm0,32+384(%rdi) - vmovdqu %ymm4,64+384(%rdi) - vmovdqu %ymm8,96+384(%rdi) - - leaq 512(%rsi),%rsi - subq $512,%rbx - cmpq $512,%rbx - jg .Lseal_avx2_main_loop - - addq 0+0(%rdi),%r10 - adcq 8+0(%rdi),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rdx - movq %rdx,%r15 - mulxq %r10,%r13,%r14 - mulxq %r11,%rax,%rdx - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rdx - mulxq %r10,%r10,%rax - addq %r10,%r14 - mulxq %r11,%r11,%r9 - adcq %r11,%r15 - adcq $0,%r9 - imulq %r12,%rdx - addq %rax,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - addq 0+16(%rdi),%r10 - adcq 8+16(%rdi),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rdx - movq %rdx,%r15 - mulxq %r10,%r13,%r14 - mulxq %r11,%rax,%rdx - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rdx - mulxq %r10,%r10,%rax - addq %r10,%r14 - mulxq %r11,%r11,%r9 - adcq %r11,%r15 - adcq $0,%r9 - imulq %r12,%rdx - addq %rax,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - leaq 32(%rdi),%rdi - movq $10,%rcx - xorq %r8,%r8 - - cmpq $384,%rbx - ja .Lseal_avx2_tail_512 - cmpq $256,%rbx - ja .Lseal_avx2_tail_384 - cmpq $128,%rbx - ja .Lseal_avx2_tail_256 - -.Lseal_avx2_tail_128: - vmovdqa .Lchacha20_consts(%rip),%ymm0 - vmovdqa 0+64(%rbp),%ymm4 - vmovdqa 0+96(%rbp),%ymm8 - vmovdqa .Lavx2_inc(%rip),%ymm12 - vpaddd 0+160(%rbp),%ymm12,%ymm12 - vmovdqa %ymm12,0+160(%rbp) - -.Lseal_avx2_tail_128_rounds_and_3xhash: - addq 0+0(%rdi),%r10 - adcq 8+0(%rdi),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rdx - movq %rdx,%r15 - mulxq %r10,%r13,%r14 - mulxq %r11,%rax,%rdx - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rdx - mulxq %r10,%r10,%rax - addq %r10,%r14 - mulxq %r11,%r11,%r9 - adcq %r11,%r15 - adcq $0,%r9 - imulq %r12,%rdx - addq %rax,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - leaq 16(%rdi),%rdi -.Lseal_avx2_tail_128_rounds_and_2xhash: - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb .Lrol16(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpsrld $20,%ymm4,%ymm3 - vpslld $12,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb .Lrol8(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpslld $7,%ymm4,%ymm3 - vpsrld $25,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpalignr $12,%ymm12,%ymm12,%ymm12 - vpalignr $8,%ymm8,%ymm8,%ymm8 - vpalignr $4,%ymm4,%ymm4,%ymm4 - addq 0+0(%rdi),%r10 - adcq 8+0(%rdi),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rdx - movq %rdx,%r15 - mulxq %r10,%r13,%r14 - mulxq %r11,%rax,%rdx - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rdx - mulxq %r10,%r10,%rax - addq %r10,%r14 - mulxq %r11,%r11,%r9 - adcq %r11,%r15 - adcq $0,%r9 - imulq %r12,%rdx - addq %rax,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb .Lrol16(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpsrld $20,%ymm4,%ymm3 - vpslld $12,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb .Lrol8(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpslld $7,%ymm4,%ymm3 - vpsrld $25,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpalignr $4,%ymm12,%ymm12,%ymm12 - vpalignr $8,%ymm8,%ymm8,%ymm8 - vpalignr $12,%ymm4,%ymm4,%ymm4 - addq 0+16(%rdi),%r10 - adcq 8+16(%rdi),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rdx - movq %rdx,%r15 - mulxq %r10,%r13,%r14 - mulxq %r11,%rax,%rdx - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rdx - mulxq %r10,%r10,%rax - addq %r10,%r14 - mulxq %r11,%r11,%r9 - adcq %r11,%r15 - adcq $0,%r9 - imulq %r12,%rdx - addq %rax,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - leaq 32(%rdi),%rdi - decq %rcx - jg .Lseal_avx2_tail_128_rounds_and_3xhash - decq %r8 - jge .Lseal_avx2_tail_128_rounds_and_2xhash - vpaddd .Lchacha20_consts(%rip),%ymm0,%ymm0 - vpaddd 0+64(%rbp),%ymm4,%ymm4 - vpaddd 0+96(%rbp),%ymm8,%ymm8 - vpaddd 0+160(%rbp),%ymm12,%ymm12 - vperm2i128 $0x13,%ymm0,%ymm4,%ymm3 - vperm2i128 $0x02,%ymm0,%ymm4,%ymm0 - vperm2i128 $0x02,%ymm8,%ymm12,%ymm4 - vperm2i128 $0x13,%ymm8,%ymm12,%ymm12 - vmovdqa %ymm3,%ymm8 - - jmp .Lseal_avx2_short_loop - -.Lseal_avx2_tail_256: - vmovdqa .Lchacha20_consts(%rip),%ymm0 - vmovdqa 0+64(%rbp),%ymm4 - vmovdqa 0+96(%rbp),%ymm8 - vmovdqa %ymm0,%ymm1 - vmovdqa %ymm4,%ymm5 - vmovdqa %ymm8,%ymm9 - vmovdqa .Lavx2_inc(%rip),%ymm12 - vpaddd 0+160(%rbp),%ymm12,%ymm13 - vpaddd %ymm13,%ymm12,%ymm12 - vmovdqa %ymm12,0+160(%rbp) - vmovdqa %ymm13,0+192(%rbp) - -.Lseal_avx2_tail_256_rounds_and_3xhash: - addq 0+0(%rdi),%r10 - adcq 8+0(%rdi),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - leaq 16(%rdi),%rdi -.Lseal_avx2_tail_256_rounds_and_2xhash: - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb .Lrol16(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpsrld $20,%ymm4,%ymm3 - vpslld $12,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb .Lrol8(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpslld $7,%ymm4,%ymm3 - vpsrld $25,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpalignr $12,%ymm12,%ymm12,%ymm12 - vpalignr $8,%ymm8,%ymm8,%ymm8 - vpalignr $4,%ymm4,%ymm4,%ymm4 - vpaddd %ymm5,%ymm1,%ymm1 - vpxor %ymm1,%ymm13,%ymm13 - vpshufb .Lrol16(%rip),%ymm13,%ymm13 - vpaddd %ymm13,%ymm9,%ymm9 - vpxor %ymm9,%ymm5,%ymm5 - vpsrld $20,%ymm5,%ymm3 - vpslld $12,%ymm5,%ymm5 - vpxor %ymm3,%ymm5,%ymm5 - vpaddd %ymm5,%ymm1,%ymm1 - vpxor %ymm1,%ymm13,%ymm13 - vpshufb .Lrol8(%rip),%ymm13,%ymm13 - vpaddd %ymm13,%ymm9,%ymm9 - vpxor %ymm9,%ymm5,%ymm5 - vpslld $7,%ymm5,%ymm3 - vpsrld $25,%ymm5,%ymm5 - vpxor %ymm3,%ymm5,%ymm5 - vpalignr $12,%ymm13,%ymm13,%ymm13 - vpalignr $8,%ymm9,%ymm9,%ymm9 - vpalignr $4,%ymm5,%ymm5,%ymm5 - addq 0+0(%rdi),%r10 - adcq 8+0(%rdi),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb .Lrol16(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpsrld $20,%ymm4,%ymm3 - vpslld $12,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb .Lrol8(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpslld $7,%ymm4,%ymm3 - vpsrld $25,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpalignr $4,%ymm12,%ymm12,%ymm12 - vpalignr $8,%ymm8,%ymm8,%ymm8 - vpalignr $12,%ymm4,%ymm4,%ymm4 - vpaddd %ymm5,%ymm1,%ymm1 - vpxor %ymm1,%ymm13,%ymm13 - vpshufb .Lrol16(%rip),%ymm13,%ymm13 - vpaddd %ymm13,%ymm9,%ymm9 - vpxor %ymm9,%ymm5,%ymm5 - vpsrld $20,%ymm5,%ymm3 - vpslld $12,%ymm5,%ymm5 - vpxor %ymm3,%ymm5,%ymm5 - vpaddd %ymm5,%ymm1,%ymm1 - vpxor %ymm1,%ymm13,%ymm13 - vpshufb .Lrol8(%rip),%ymm13,%ymm13 - vpaddd %ymm13,%ymm9,%ymm9 - vpxor %ymm9,%ymm5,%ymm5 - vpslld $7,%ymm5,%ymm3 - vpsrld $25,%ymm5,%ymm5 - vpxor %ymm3,%ymm5,%ymm5 - vpalignr $4,%ymm13,%ymm13,%ymm13 - vpalignr $8,%ymm9,%ymm9,%ymm9 - vpalignr $12,%ymm5,%ymm5,%ymm5 - addq 0+16(%rdi),%r10 - adcq 8+16(%rdi),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - leaq 32(%rdi),%rdi - decq %rcx - jg .Lseal_avx2_tail_256_rounds_and_3xhash - decq %r8 - jge .Lseal_avx2_tail_256_rounds_and_2xhash - vpaddd .Lchacha20_consts(%rip),%ymm1,%ymm1 - vpaddd 0+64(%rbp),%ymm5,%ymm5 - vpaddd 0+96(%rbp),%ymm9,%ymm9 - vpaddd 0+192(%rbp),%ymm13,%ymm13 - vpaddd .Lchacha20_consts(%rip),%ymm0,%ymm0 - vpaddd 0+64(%rbp),%ymm4,%ymm4 - vpaddd 0+96(%rbp),%ymm8,%ymm8 - vpaddd 0+160(%rbp),%ymm12,%ymm12 - vperm2i128 $0x02,%ymm1,%ymm5,%ymm3 - vperm2i128 $0x13,%ymm1,%ymm5,%ymm5 - vperm2i128 $0x02,%ymm9,%ymm13,%ymm1 - vperm2i128 $0x13,%ymm9,%ymm13,%ymm9 - vpxor 0+0(%rsi),%ymm3,%ymm3 - vpxor 32+0(%rsi),%ymm1,%ymm1 - vpxor 64+0(%rsi),%ymm5,%ymm5 - vpxor 96+0(%rsi),%ymm9,%ymm9 - vmovdqu %ymm3,0+0(%rdi) - vmovdqu %ymm1,32+0(%rdi) - vmovdqu %ymm5,64+0(%rdi) - vmovdqu %ymm9,96+0(%rdi) - vperm2i128 $0x13,%ymm0,%ymm4,%ymm3 - vperm2i128 $0x02,%ymm0,%ymm4,%ymm0 - vperm2i128 $0x02,%ymm8,%ymm12,%ymm4 - vperm2i128 $0x13,%ymm8,%ymm12,%ymm12 - vmovdqa %ymm3,%ymm8 - - movq $128,%rcx - leaq 128(%rsi),%rsi - subq $128,%rbx - jmp .Lseal_avx2_short_hash_remainder - -.Lseal_avx2_tail_384: - vmovdqa .Lchacha20_consts(%rip),%ymm0 - vmovdqa 0+64(%rbp),%ymm4 - vmovdqa 0+96(%rbp),%ymm8 - vmovdqa %ymm0,%ymm1 - vmovdqa %ymm4,%ymm5 - vmovdqa %ymm8,%ymm9 - vmovdqa %ymm0,%ymm2 - vmovdqa %ymm4,%ymm6 - vmovdqa %ymm8,%ymm10 - vmovdqa .Lavx2_inc(%rip),%ymm12 - vpaddd 0+160(%rbp),%ymm12,%ymm14 - vpaddd %ymm14,%ymm12,%ymm13 - vpaddd %ymm13,%ymm12,%ymm12 - vmovdqa %ymm12,0+160(%rbp) - vmovdqa %ymm13,0+192(%rbp) - vmovdqa %ymm14,0+224(%rbp) - -.Lseal_avx2_tail_384_rounds_and_3xhash: - addq 0+0(%rdi),%r10 - adcq 8+0(%rdi),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - leaq 16(%rdi),%rdi -.Lseal_avx2_tail_384_rounds_and_2xhash: - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb .Lrol16(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpsrld $20,%ymm4,%ymm3 - vpslld $12,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb .Lrol8(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpslld $7,%ymm4,%ymm3 - vpsrld $25,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpalignr $12,%ymm12,%ymm12,%ymm12 - vpalignr $8,%ymm8,%ymm8,%ymm8 - vpalignr $4,%ymm4,%ymm4,%ymm4 - vpaddd %ymm5,%ymm1,%ymm1 - vpxor %ymm1,%ymm13,%ymm13 - vpshufb .Lrol16(%rip),%ymm13,%ymm13 - vpaddd %ymm13,%ymm9,%ymm9 - vpxor %ymm9,%ymm5,%ymm5 - vpsrld $20,%ymm5,%ymm3 - vpslld $12,%ymm5,%ymm5 - vpxor %ymm3,%ymm5,%ymm5 - vpaddd %ymm5,%ymm1,%ymm1 - vpxor %ymm1,%ymm13,%ymm13 - vpshufb .Lrol8(%rip),%ymm13,%ymm13 - vpaddd %ymm13,%ymm9,%ymm9 - vpxor %ymm9,%ymm5,%ymm5 - vpslld $7,%ymm5,%ymm3 - vpsrld $25,%ymm5,%ymm5 - vpxor %ymm3,%ymm5,%ymm5 - vpalignr $12,%ymm13,%ymm13,%ymm13 - vpalignr $8,%ymm9,%ymm9,%ymm9 - vpalignr $4,%ymm5,%ymm5,%ymm5 - addq 0+0(%rdi),%r10 - adcq 8+0(%rdi),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - vpaddd %ymm6,%ymm2,%ymm2 - vpxor %ymm2,%ymm14,%ymm14 - vpshufb .Lrol16(%rip),%ymm14,%ymm14 - vpaddd %ymm14,%ymm10,%ymm10 - vpxor %ymm10,%ymm6,%ymm6 - vpsrld $20,%ymm6,%ymm3 - vpslld $12,%ymm6,%ymm6 - vpxor %ymm3,%ymm6,%ymm6 - vpaddd %ymm6,%ymm2,%ymm2 - vpxor %ymm2,%ymm14,%ymm14 - vpshufb .Lrol8(%rip),%ymm14,%ymm14 - vpaddd %ymm14,%ymm10,%ymm10 - vpxor %ymm10,%ymm6,%ymm6 - vpslld $7,%ymm6,%ymm3 - vpsrld $25,%ymm6,%ymm6 - vpxor %ymm3,%ymm6,%ymm6 - vpalignr $12,%ymm14,%ymm14,%ymm14 - vpalignr $8,%ymm10,%ymm10,%ymm10 - vpalignr $4,%ymm6,%ymm6,%ymm6 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb .Lrol16(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpsrld $20,%ymm4,%ymm3 - vpslld $12,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb .Lrol8(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpslld $7,%ymm4,%ymm3 - vpsrld $25,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpalignr $4,%ymm12,%ymm12,%ymm12 - vpalignr $8,%ymm8,%ymm8,%ymm8 - vpalignr $12,%ymm4,%ymm4,%ymm4 - addq 0+16(%rdi),%r10 - adcq 8+16(%rdi),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - vpaddd %ymm5,%ymm1,%ymm1 - vpxor %ymm1,%ymm13,%ymm13 - vpshufb .Lrol16(%rip),%ymm13,%ymm13 - vpaddd %ymm13,%ymm9,%ymm9 - vpxor %ymm9,%ymm5,%ymm5 - vpsrld $20,%ymm5,%ymm3 - vpslld $12,%ymm5,%ymm5 - vpxor %ymm3,%ymm5,%ymm5 - vpaddd %ymm5,%ymm1,%ymm1 - vpxor %ymm1,%ymm13,%ymm13 - vpshufb .Lrol8(%rip),%ymm13,%ymm13 - vpaddd %ymm13,%ymm9,%ymm9 - vpxor %ymm9,%ymm5,%ymm5 - vpslld $7,%ymm5,%ymm3 - vpsrld $25,%ymm5,%ymm5 - vpxor %ymm3,%ymm5,%ymm5 - vpalignr $4,%ymm13,%ymm13,%ymm13 - vpalignr $8,%ymm9,%ymm9,%ymm9 - vpalignr $12,%ymm5,%ymm5,%ymm5 - vpaddd %ymm6,%ymm2,%ymm2 - vpxor %ymm2,%ymm14,%ymm14 - vpshufb .Lrol16(%rip),%ymm14,%ymm14 - vpaddd %ymm14,%ymm10,%ymm10 - vpxor %ymm10,%ymm6,%ymm6 - vpsrld $20,%ymm6,%ymm3 - vpslld $12,%ymm6,%ymm6 - vpxor %ymm3,%ymm6,%ymm6 - vpaddd %ymm6,%ymm2,%ymm2 - vpxor %ymm2,%ymm14,%ymm14 - vpshufb .Lrol8(%rip),%ymm14,%ymm14 - vpaddd %ymm14,%ymm10,%ymm10 - vpxor %ymm10,%ymm6,%ymm6 - vpslld $7,%ymm6,%ymm3 - vpsrld $25,%ymm6,%ymm6 - vpxor %ymm3,%ymm6,%ymm6 - vpalignr $4,%ymm14,%ymm14,%ymm14 - vpalignr $8,%ymm10,%ymm10,%ymm10 - vpalignr $12,%ymm6,%ymm6,%ymm6 - - leaq 32(%rdi),%rdi - decq %rcx - jg .Lseal_avx2_tail_384_rounds_and_3xhash - decq %r8 - jge .Lseal_avx2_tail_384_rounds_and_2xhash - vpaddd .Lchacha20_consts(%rip),%ymm2,%ymm2 - vpaddd 0+64(%rbp),%ymm6,%ymm6 - vpaddd 0+96(%rbp),%ymm10,%ymm10 - vpaddd 0+224(%rbp),%ymm14,%ymm14 - vpaddd .Lchacha20_consts(%rip),%ymm1,%ymm1 - vpaddd 0+64(%rbp),%ymm5,%ymm5 - vpaddd 0+96(%rbp),%ymm9,%ymm9 - vpaddd 0+192(%rbp),%ymm13,%ymm13 - vpaddd .Lchacha20_consts(%rip),%ymm0,%ymm0 - vpaddd 0+64(%rbp),%ymm4,%ymm4 - vpaddd 0+96(%rbp),%ymm8,%ymm8 - vpaddd 0+160(%rbp),%ymm12,%ymm12 - vperm2i128 $0x02,%ymm2,%ymm6,%ymm3 - vperm2i128 $0x13,%ymm2,%ymm6,%ymm6 - vperm2i128 $0x02,%ymm10,%ymm14,%ymm2 - vperm2i128 $0x13,%ymm10,%ymm14,%ymm10 - vpxor 0+0(%rsi),%ymm3,%ymm3 - vpxor 32+0(%rsi),%ymm2,%ymm2 - vpxor 64+0(%rsi),%ymm6,%ymm6 - vpxor 96+0(%rsi),%ymm10,%ymm10 - vmovdqu %ymm3,0+0(%rdi) - vmovdqu %ymm2,32+0(%rdi) - vmovdqu %ymm6,64+0(%rdi) - vmovdqu %ymm10,96+0(%rdi) - vperm2i128 $0x02,%ymm1,%ymm5,%ymm3 - vperm2i128 $0x13,%ymm1,%ymm5,%ymm5 - vperm2i128 $0x02,%ymm9,%ymm13,%ymm1 - vperm2i128 $0x13,%ymm9,%ymm13,%ymm9 - vpxor 0+128(%rsi),%ymm3,%ymm3 - vpxor 32+128(%rsi),%ymm1,%ymm1 - vpxor 64+128(%rsi),%ymm5,%ymm5 - vpxor 96+128(%rsi),%ymm9,%ymm9 - vmovdqu %ymm3,0+128(%rdi) - vmovdqu %ymm1,32+128(%rdi) - vmovdqu %ymm5,64+128(%rdi) - vmovdqu %ymm9,96+128(%rdi) - vperm2i128 $0x13,%ymm0,%ymm4,%ymm3 - vperm2i128 $0x02,%ymm0,%ymm4,%ymm0 - vperm2i128 $0x02,%ymm8,%ymm12,%ymm4 - vperm2i128 $0x13,%ymm8,%ymm12,%ymm12 - vmovdqa %ymm3,%ymm8 - - movq $256,%rcx - leaq 256(%rsi),%rsi - subq $256,%rbx - jmp .Lseal_avx2_short_hash_remainder - -.Lseal_avx2_tail_512: - vmovdqa .Lchacha20_consts(%rip),%ymm0 - vmovdqa 0+64(%rbp),%ymm4 - vmovdqa 0+96(%rbp),%ymm8 - vmovdqa %ymm0,%ymm1 - vmovdqa %ymm4,%ymm5 - vmovdqa %ymm8,%ymm9 - vmovdqa %ymm0,%ymm2 - vmovdqa %ymm4,%ymm6 - vmovdqa %ymm8,%ymm10 - vmovdqa %ymm0,%ymm3 - vmovdqa %ymm4,%ymm7 - vmovdqa %ymm8,%ymm11 - vmovdqa .Lavx2_inc(%rip),%ymm12 - vpaddd 0+160(%rbp),%ymm12,%ymm15 - vpaddd %ymm15,%ymm12,%ymm14 - vpaddd %ymm14,%ymm12,%ymm13 - vpaddd %ymm13,%ymm12,%ymm12 - vmovdqa %ymm15,0+256(%rbp) - vmovdqa %ymm14,0+224(%rbp) - vmovdqa %ymm13,0+192(%rbp) - vmovdqa %ymm12,0+160(%rbp) - -.Lseal_avx2_tail_512_rounds_and_3xhash: - addq 0+0(%rdi),%r10 - adcq 8+0(%rdi),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rdx - movq %rdx,%r15 - mulxq %r10,%r13,%r14 - mulxq %r11,%rax,%rdx - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rdx - mulxq %r10,%r10,%rax - addq %r10,%r14 - mulxq %r11,%r11,%r9 - adcq %r11,%r15 - adcq $0,%r9 - imulq %r12,%rdx - addq %rax,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - leaq 16(%rdi),%rdi -.Lseal_avx2_tail_512_rounds_and_2xhash: - vmovdqa %ymm8,0+128(%rbp) - vmovdqa .Lrol16(%rip),%ymm8 - vpaddd %ymm7,%ymm3,%ymm3 - vpaddd %ymm6,%ymm2,%ymm2 - vpaddd %ymm5,%ymm1,%ymm1 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm3,%ymm15,%ymm15 - vpxor %ymm2,%ymm14,%ymm14 - vpxor %ymm1,%ymm13,%ymm13 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb %ymm8,%ymm15,%ymm15 - vpshufb %ymm8,%ymm14,%ymm14 - vpshufb %ymm8,%ymm13,%ymm13 - vpshufb %ymm8,%ymm12,%ymm12 - vpaddd %ymm15,%ymm11,%ymm11 - vpaddd %ymm14,%ymm10,%ymm10 - vpaddd %ymm13,%ymm9,%ymm9 - vpaddd 0+128(%rbp),%ymm12,%ymm8 - vpxor %ymm11,%ymm7,%ymm7 - vpxor %ymm10,%ymm6,%ymm6 - addq 0+0(%rdi),%r10 - adcq 8+0(%rdi),%r11 - adcq $1,%r12 - vpxor %ymm9,%ymm5,%ymm5 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa %ymm8,0+128(%rbp) - vpsrld $20,%ymm7,%ymm8 - vpslld $32-20,%ymm7,%ymm7 - vpxor %ymm8,%ymm7,%ymm7 - vpsrld $20,%ymm6,%ymm8 - vpslld $32-20,%ymm6,%ymm6 - vpxor %ymm8,%ymm6,%ymm6 - vpsrld $20,%ymm5,%ymm8 - vpslld $32-20,%ymm5,%ymm5 - vpxor %ymm8,%ymm5,%ymm5 - vpsrld $20,%ymm4,%ymm8 - vpslld $32-20,%ymm4,%ymm4 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa .Lrol8(%rip),%ymm8 - vpaddd %ymm7,%ymm3,%ymm3 - vpaddd %ymm6,%ymm2,%ymm2 - vpaddd %ymm5,%ymm1,%ymm1 - vpaddd %ymm4,%ymm0,%ymm0 - movq 0+0+0(%rbp),%rdx - movq %rdx,%r15 - mulxq %r10,%r13,%r14 - mulxq %r11,%rax,%rdx - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - vpxor %ymm3,%ymm15,%ymm15 - vpxor %ymm2,%ymm14,%ymm14 - vpxor %ymm1,%ymm13,%ymm13 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb %ymm8,%ymm15,%ymm15 - vpshufb %ymm8,%ymm14,%ymm14 - vpshufb %ymm8,%ymm13,%ymm13 - vpshufb %ymm8,%ymm12,%ymm12 - vpaddd %ymm15,%ymm11,%ymm11 - vpaddd %ymm14,%ymm10,%ymm10 - vpaddd %ymm13,%ymm9,%ymm9 - vpaddd 0+128(%rbp),%ymm12,%ymm8 - vpxor %ymm11,%ymm7,%ymm7 - vpxor %ymm10,%ymm6,%ymm6 - vpxor %ymm9,%ymm5,%ymm5 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa %ymm8,0+128(%rbp) - vpsrld $25,%ymm7,%ymm8 - vpslld $32-25,%ymm7,%ymm7 - vpxor %ymm8,%ymm7,%ymm7 - movq 8+0+0(%rbp),%rdx - mulxq %r10,%r10,%rax - addq %r10,%r14 - mulxq %r11,%r11,%r9 - adcq %r11,%r15 - adcq $0,%r9 - imulq %r12,%rdx - vpsrld $25,%ymm6,%ymm8 - vpslld $32-25,%ymm6,%ymm6 - vpxor %ymm8,%ymm6,%ymm6 - vpsrld $25,%ymm5,%ymm8 - vpslld $32-25,%ymm5,%ymm5 - vpxor %ymm8,%ymm5,%ymm5 - vpsrld $25,%ymm4,%ymm8 - vpslld $32-25,%ymm4,%ymm4 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa 0+128(%rbp),%ymm8 - vpalignr $4,%ymm7,%ymm7,%ymm7 - vpalignr $8,%ymm11,%ymm11,%ymm11 - vpalignr $12,%ymm15,%ymm15,%ymm15 - vpalignr $4,%ymm6,%ymm6,%ymm6 - vpalignr $8,%ymm10,%ymm10,%ymm10 - vpalignr $12,%ymm14,%ymm14,%ymm14 - vpalignr $4,%ymm5,%ymm5,%ymm5 - vpalignr $8,%ymm9,%ymm9,%ymm9 - vpalignr $12,%ymm13,%ymm13,%ymm13 - vpalignr $4,%ymm4,%ymm4,%ymm4 - addq %rax,%r15 - adcq %rdx,%r9 - vpalignr $8,%ymm8,%ymm8,%ymm8 - vpalignr $12,%ymm12,%ymm12,%ymm12 - vmovdqa %ymm8,0+128(%rbp) - vmovdqa .Lrol16(%rip),%ymm8 - vpaddd %ymm7,%ymm3,%ymm3 - vpaddd %ymm6,%ymm2,%ymm2 - vpaddd %ymm5,%ymm1,%ymm1 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm3,%ymm15,%ymm15 - vpxor %ymm2,%ymm14,%ymm14 - vpxor %ymm1,%ymm13,%ymm13 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb %ymm8,%ymm15,%ymm15 - vpshufb %ymm8,%ymm14,%ymm14 - vpshufb %ymm8,%ymm13,%ymm13 - vpshufb %ymm8,%ymm12,%ymm12 - vpaddd %ymm15,%ymm11,%ymm11 - vpaddd %ymm14,%ymm10,%ymm10 - vpaddd %ymm13,%ymm9,%ymm9 - vpaddd 0+128(%rbp),%ymm12,%ymm8 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - vpxor %ymm11,%ymm7,%ymm7 - vpxor %ymm10,%ymm6,%ymm6 - vpxor %ymm9,%ymm5,%ymm5 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa %ymm8,0+128(%rbp) - vpsrld $20,%ymm7,%ymm8 - vpslld $32-20,%ymm7,%ymm7 - vpxor %ymm8,%ymm7,%ymm7 - vpsrld $20,%ymm6,%ymm8 - vpslld $32-20,%ymm6,%ymm6 - vpxor %ymm8,%ymm6,%ymm6 - vpsrld $20,%ymm5,%ymm8 - vpslld $32-20,%ymm5,%ymm5 - vpxor %ymm8,%ymm5,%ymm5 - vpsrld $20,%ymm4,%ymm8 - vpslld $32-20,%ymm4,%ymm4 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa .Lrol8(%rip),%ymm8 - vpaddd %ymm7,%ymm3,%ymm3 - vpaddd %ymm6,%ymm2,%ymm2 - addq 0+16(%rdi),%r10 - adcq 8+16(%rdi),%r11 - adcq $1,%r12 - vpaddd %ymm5,%ymm1,%ymm1 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm3,%ymm15,%ymm15 - vpxor %ymm2,%ymm14,%ymm14 - vpxor %ymm1,%ymm13,%ymm13 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb %ymm8,%ymm15,%ymm15 - vpshufb %ymm8,%ymm14,%ymm14 - vpshufb %ymm8,%ymm13,%ymm13 - vpshufb %ymm8,%ymm12,%ymm12 - vpaddd %ymm15,%ymm11,%ymm11 - vpaddd %ymm14,%ymm10,%ymm10 - vpaddd %ymm13,%ymm9,%ymm9 - vpaddd 0+128(%rbp),%ymm12,%ymm8 - vpxor %ymm11,%ymm7,%ymm7 - vpxor %ymm10,%ymm6,%ymm6 - vpxor %ymm9,%ymm5,%ymm5 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa %ymm8,0+128(%rbp) - vpsrld $25,%ymm7,%ymm8 - movq 0+0+0(%rbp),%rdx - movq %rdx,%r15 - mulxq %r10,%r13,%r14 - mulxq %r11,%rax,%rdx - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - vpslld $32-25,%ymm7,%ymm7 - vpxor %ymm8,%ymm7,%ymm7 - vpsrld $25,%ymm6,%ymm8 - vpslld $32-25,%ymm6,%ymm6 - vpxor %ymm8,%ymm6,%ymm6 - vpsrld $25,%ymm5,%ymm8 - vpslld $32-25,%ymm5,%ymm5 - vpxor %ymm8,%ymm5,%ymm5 - vpsrld $25,%ymm4,%ymm8 - vpslld $32-25,%ymm4,%ymm4 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa 0+128(%rbp),%ymm8 - vpalignr $12,%ymm7,%ymm7,%ymm7 - vpalignr $8,%ymm11,%ymm11,%ymm11 - vpalignr $4,%ymm15,%ymm15,%ymm15 - vpalignr $12,%ymm6,%ymm6,%ymm6 - vpalignr $8,%ymm10,%ymm10,%ymm10 - vpalignr $4,%ymm14,%ymm14,%ymm14 - vpalignr $12,%ymm5,%ymm5,%ymm5 - vpalignr $8,%ymm9,%ymm9,%ymm9 - movq 8+0+0(%rbp),%rdx - mulxq %r10,%r10,%rax - addq %r10,%r14 - mulxq %r11,%r11,%r9 - adcq %r11,%r15 - adcq $0,%r9 - imulq %r12,%rdx - vpalignr $4,%ymm13,%ymm13,%ymm13 - vpalignr $12,%ymm4,%ymm4,%ymm4 - vpalignr $8,%ymm8,%ymm8,%ymm8 - vpalignr $4,%ymm12,%ymm12,%ymm12 - - - - - - - - - - - - - - - - - addq %rax,%r15 - adcq %rdx,%r9 - - - - - - - - - - - - - - - - - - - - - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - leaq 32(%rdi),%rdi - decq %rcx - jg .Lseal_avx2_tail_512_rounds_and_3xhash - decq %r8 - jge .Lseal_avx2_tail_512_rounds_and_2xhash - vpaddd .Lchacha20_consts(%rip),%ymm3,%ymm3 - vpaddd 0+64(%rbp),%ymm7,%ymm7 - vpaddd 0+96(%rbp),%ymm11,%ymm11 - vpaddd 0+256(%rbp),%ymm15,%ymm15 - vpaddd .Lchacha20_consts(%rip),%ymm2,%ymm2 - vpaddd 0+64(%rbp),%ymm6,%ymm6 - vpaddd 0+96(%rbp),%ymm10,%ymm10 - vpaddd 0+224(%rbp),%ymm14,%ymm14 - vpaddd .Lchacha20_consts(%rip),%ymm1,%ymm1 - vpaddd 0+64(%rbp),%ymm5,%ymm5 - vpaddd 0+96(%rbp),%ymm9,%ymm9 - vpaddd 0+192(%rbp),%ymm13,%ymm13 - vpaddd .Lchacha20_consts(%rip),%ymm0,%ymm0 - vpaddd 0+64(%rbp),%ymm4,%ymm4 - vpaddd 0+96(%rbp),%ymm8,%ymm8 - vpaddd 0+160(%rbp),%ymm12,%ymm12 - - vmovdqa %ymm0,0+128(%rbp) - vperm2i128 $0x02,%ymm3,%ymm7,%ymm0 - vperm2i128 $0x13,%ymm3,%ymm7,%ymm7 - vperm2i128 $0x02,%ymm11,%ymm15,%ymm3 - vperm2i128 $0x13,%ymm11,%ymm15,%ymm11 - vpxor 0+0(%rsi),%ymm0,%ymm0 - vpxor 32+0(%rsi),%ymm3,%ymm3 - vpxor 64+0(%rsi),%ymm7,%ymm7 - vpxor 96+0(%rsi),%ymm11,%ymm11 - vmovdqu %ymm0,0+0(%rdi) - vmovdqu %ymm3,32+0(%rdi) - vmovdqu %ymm7,64+0(%rdi) - vmovdqu %ymm11,96+0(%rdi) - - vmovdqa 0+128(%rbp),%ymm0 - vperm2i128 $0x02,%ymm2,%ymm6,%ymm3 - vperm2i128 $0x13,%ymm2,%ymm6,%ymm6 - vperm2i128 $0x02,%ymm10,%ymm14,%ymm2 - vperm2i128 $0x13,%ymm10,%ymm14,%ymm10 - vpxor 0+128(%rsi),%ymm3,%ymm3 - vpxor 32+128(%rsi),%ymm2,%ymm2 - vpxor 64+128(%rsi),%ymm6,%ymm6 - vpxor 96+128(%rsi),%ymm10,%ymm10 - vmovdqu %ymm3,0+128(%rdi) - vmovdqu %ymm2,32+128(%rdi) - vmovdqu %ymm6,64+128(%rdi) - vmovdqu %ymm10,96+128(%rdi) - vperm2i128 $0x02,%ymm1,%ymm5,%ymm3 - vperm2i128 $0x13,%ymm1,%ymm5,%ymm5 - vperm2i128 $0x02,%ymm9,%ymm13,%ymm1 - vperm2i128 $0x13,%ymm9,%ymm13,%ymm9 - vpxor 0+256(%rsi),%ymm3,%ymm3 - vpxor 32+256(%rsi),%ymm1,%ymm1 - vpxor 64+256(%rsi),%ymm5,%ymm5 - vpxor 96+256(%rsi),%ymm9,%ymm9 - vmovdqu %ymm3,0+256(%rdi) - vmovdqu %ymm1,32+256(%rdi) - vmovdqu %ymm5,64+256(%rdi) - vmovdqu %ymm9,96+256(%rdi) - vperm2i128 $0x13,%ymm0,%ymm4,%ymm3 - vperm2i128 $0x02,%ymm0,%ymm4,%ymm0 - vperm2i128 $0x02,%ymm8,%ymm12,%ymm4 - vperm2i128 $0x13,%ymm8,%ymm12,%ymm12 - vmovdqa %ymm3,%ymm8 - - movq $384,%rcx - leaq 384(%rsi),%rsi - subq $384,%rbx - jmp .Lseal_avx2_short_hash_remainder - -.Lseal_avx2_320: - vmovdqa %ymm0,%ymm1 - vmovdqa %ymm0,%ymm2 - vmovdqa %ymm4,%ymm5 - vmovdqa %ymm4,%ymm6 - vmovdqa %ymm8,%ymm9 - vmovdqa %ymm8,%ymm10 - vpaddd .Lavx2_inc(%rip),%ymm12,%ymm13 - vpaddd .Lavx2_inc(%rip),%ymm13,%ymm14 - vmovdqa %ymm4,%ymm7 - vmovdqa %ymm8,%ymm11 - vmovdqa %ymm12,0+160(%rbp) - vmovdqa %ymm13,0+192(%rbp) - vmovdqa %ymm14,0+224(%rbp) - movq $10,%r10 -.Lseal_avx2_320_rounds: - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb .Lrol16(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpsrld $20,%ymm4,%ymm3 - vpslld $12,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb .Lrol8(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpslld $7,%ymm4,%ymm3 - vpsrld $25,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpalignr $12,%ymm12,%ymm12,%ymm12 - vpalignr $8,%ymm8,%ymm8,%ymm8 - vpalignr $4,%ymm4,%ymm4,%ymm4 - vpaddd %ymm5,%ymm1,%ymm1 - vpxor %ymm1,%ymm13,%ymm13 - vpshufb .Lrol16(%rip),%ymm13,%ymm13 - vpaddd %ymm13,%ymm9,%ymm9 - vpxor %ymm9,%ymm5,%ymm5 - vpsrld $20,%ymm5,%ymm3 - vpslld $12,%ymm5,%ymm5 - vpxor %ymm3,%ymm5,%ymm5 - vpaddd %ymm5,%ymm1,%ymm1 - vpxor %ymm1,%ymm13,%ymm13 - vpshufb .Lrol8(%rip),%ymm13,%ymm13 - vpaddd %ymm13,%ymm9,%ymm9 - vpxor %ymm9,%ymm5,%ymm5 - vpslld $7,%ymm5,%ymm3 - vpsrld $25,%ymm5,%ymm5 - vpxor %ymm3,%ymm5,%ymm5 - vpalignr $12,%ymm13,%ymm13,%ymm13 - vpalignr $8,%ymm9,%ymm9,%ymm9 - vpalignr $4,%ymm5,%ymm5,%ymm5 - vpaddd %ymm6,%ymm2,%ymm2 - vpxor %ymm2,%ymm14,%ymm14 - vpshufb .Lrol16(%rip),%ymm14,%ymm14 - vpaddd %ymm14,%ymm10,%ymm10 - vpxor %ymm10,%ymm6,%ymm6 - vpsrld $20,%ymm6,%ymm3 - vpslld $12,%ymm6,%ymm6 - vpxor %ymm3,%ymm6,%ymm6 - vpaddd %ymm6,%ymm2,%ymm2 - vpxor %ymm2,%ymm14,%ymm14 - vpshufb .Lrol8(%rip),%ymm14,%ymm14 - vpaddd %ymm14,%ymm10,%ymm10 - vpxor %ymm10,%ymm6,%ymm6 - vpslld $7,%ymm6,%ymm3 - vpsrld $25,%ymm6,%ymm6 - vpxor %ymm3,%ymm6,%ymm6 - vpalignr $12,%ymm14,%ymm14,%ymm14 - vpalignr $8,%ymm10,%ymm10,%ymm10 - vpalignr $4,%ymm6,%ymm6,%ymm6 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb .Lrol16(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpsrld $20,%ymm4,%ymm3 - vpslld $12,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb .Lrol8(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpslld $7,%ymm4,%ymm3 - vpsrld $25,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpalignr $4,%ymm12,%ymm12,%ymm12 - vpalignr $8,%ymm8,%ymm8,%ymm8 - vpalignr $12,%ymm4,%ymm4,%ymm4 - vpaddd %ymm5,%ymm1,%ymm1 - vpxor %ymm1,%ymm13,%ymm13 - vpshufb .Lrol16(%rip),%ymm13,%ymm13 - vpaddd %ymm13,%ymm9,%ymm9 - vpxor %ymm9,%ymm5,%ymm5 - vpsrld $20,%ymm5,%ymm3 - vpslld $12,%ymm5,%ymm5 - vpxor %ymm3,%ymm5,%ymm5 - vpaddd %ymm5,%ymm1,%ymm1 - vpxor %ymm1,%ymm13,%ymm13 - vpshufb .Lrol8(%rip),%ymm13,%ymm13 - vpaddd %ymm13,%ymm9,%ymm9 - vpxor %ymm9,%ymm5,%ymm5 - vpslld $7,%ymm5,%ymm3 - vpsrld $25,%ymm5,%ymm5 - vpxor %ymm3,%ymm5,%ymm5 - vpalignr $4,%ymm13,%ymm13,%ymm13 - vpalignr $8,%ymm9,%ymm9,%ymm9 - vpalignr $12,%ymm5,%ymm5,%ymm5 - vpaddd %ymm6,%ymm2,%ymm2 - vpxor %ymm2,%ymm14,%ymm14 - vpshufb .Lrol16(%rip),%ymm14,%ymm14 - vpaddd %ymm14,%ymm10,%ymm10 - vpxor %ymm10,%ymm6,%ymm6 - vpsrld $20,%ymm6,%ymm3 - vpslld $12,%ymm6,%ymm6 - vpxor %ymm3,%ymm6,%ymm6 - vpaddd %ymm6,%ymm2,%ymm2 - vpxor %ymm2,%ymm14,%ymm14 - vpshufb .Lrol8(%rip),%ymm14,%ymm14 - vpaddd %ymm14,%ymm10,%ymm10 - vpxor %ymm10,%ymm6,%ymm6 - vpslld $7,%ymm6,%ymm3 - vpsrld $25,%ymm6,%ymm6 - vpxor %ymm3,%ymm6,%ymm6 - vpalignr $4,%ymm14,%ymm14,%ymm14 - vpalignr $8,%ymm10,%ymm10,%ymm10 - vpalignr $12,%ymm6,%ymm6,%ymm6 - - decq %r10 - jne .Lseal_avx2_320_rounds - vpaddd .Lchacha20_consts(%rip),%ymm0,%ymm0 - vpaddd .Lchacha20_consts(%rip),%ymm1,%ymm1 - vpaddd .Lchacha20_consts(%rip),%ymm2,%ymm2 - vpaddd %ymm7,%ymm4,%ymm4 - vpaddd %ymm7,%ymm5,%ymm5 - vpaddd %ymm7,%ymm6,%ymm6 - vpaddd %ymm11,%ymm8,%ymm8 - vpaddd %ymm11,%ymm9,%ymm9 - vpaddd %ymm11,%ymm10,%ymm10 - vpaddd 0+160(%rbp),%ymm12,%ymm12 - vpaddd 0+192(%rbp),%ymm13,%ymm13 - vpaddd 0+224(%rbp),%ymm14,%ymm14 - vperm2i128 $0x02,%ymm0,%ymm4,%ymm3 - - vpand .Lclamp(%rip),%ymm3,%ymm3 - vmovdqa %ymm3,0+0(%rbp) - - vperm2i128 $0x13,%ymm0,%ymm4,%ymm0 - vperm2i128 $0x13,%ymm8,%ymm12,%ymm4 - vperm2i128 $0x02,%ymm1,%ymm5,%ymm8 - vperm2i128 $0x02,%ymm9,%ymm13,%ymm12 - vperm2i128 $0x13,%ymm1,%ymm5,%ymm1 - vperm2i128 $0x13,%ymm9,%ymm13,%ymm5 - vperm2i128 $0x02,%ymm2,%ymm6,%ymm9 - vperm2i128 $0x02,%ymm10,%ymm14,%ymm13 - vperm2i128 $0x13,%ymm2,%ymm6,%ymm2 - vperm2i128 $0x13,%ymm10,%ymm14,%ymm6 - jmp .Lseal_avx2_short - -.Lseal_avx2_192: - vmovdqa %ymm0,%ymm1 - vmovdqa %ymm0,%ymm2 - vmovdqa %ymm4,%ymm5 - vmovdqa %ymm4,%ymm6 - vmovdqa %ymm8,%ymm9 - vmovdqa %ymm8,%ymm10 - vpaddd .Lavx2_inc(%rip),%ymm12,%ymm13 - vmovdqa %ymm12,%ymm11 - vmovdqa %ymm13,%ymm15 - movq $10,%r10 -.Lseal_avx2_192_rounds: - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb .Lrol16(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpsrld $20,%ymm4,%ymm3 - vpslld $12,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb .Lrol8(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpslld $7,%ymm4,%ymm3 - vpsrld $25,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpalignr $12,%ymm12,%ymm12,%ymm12 - vpalignr $8,%ymm8,%ymm8,%ymm8 - vpalignr $4,%ymm4,%ymm4,%ymm4 - vpaddd %ymm5,%ymm1,%ymm1 - vpxor %ymm1,%ymm13,%ymm13 - vpshufb .Lrol16(%rip),%ymm13,%ymm13 - vpaddd %ymm13,%ymm9,%ymm9 - vpxor %ymm9,%ymm5,%ymm5 - vpsrld $20,%ymm5,%ymm3 - vpslld $12,%ymm5,%ymm5 - vpxor %ymm3,%ymm5,%ymm5 - vpaddd %ymm5,%ymm1,%ymm1 - vpxor %ymm1,%ymm13,%ymm13 - vpshufb .Lrol8(%rip),%ymm13,%ymm13 - vpaddd %ymm13,%ymm9,%ymm9 - vpxor %ymm9,%ymm5,%ymm5 - vpslld $7,%ymm5,%ymm3 - vpsrld $25,%ymm5,%ymm5 - vpxor %ymm3,%ymm5,%ymm5 - vpalignr $12,%ymm13,%ymm13,%ymm13 - vpalignr $8,%ymm9,%ymm9,%ymm9 - vpalignr $4,%ymm5,%ymm5,%ymm5 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb .Lrol16(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpsrld $20,%ymm4,%ymm3 - vpslld $12,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb .Lrol8(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpslld $7,%ymm4,%ymm3 - vpsrld $25,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpalignr $4,%ymm12,%ymm12,%ymm12 - vpalignr $8,%ymm8,%ymm8,%ymm8 - vpalignr $12,%ymm4,%ymm4,%ymm4 - vpaddd %ymm5,%ymm1,%ymm1 - vpxor %ymm1,%ymm13,%ymm13 - vpshufb .Lrol16(%rip),%ymm13,%ymm13 - vpaddd %ymm13,%ymm9,%ymm9 - vpxor %ymm9,%ymm5,%ymm5 - vpsrld $20,%ymm5,%ymm3 - vpslld $12,%ymm5,%ymm5 - vpxor %ymm3,%ymm5,%ymm5 - vpaddd %ymm5,%ymm1,%ymm1 - vpxor %ymm1,%ymm13,%ymm13 - vpshufb .Lrol8(%rip),%ymm13,%ymm13 - vpaddd %ymm13,%ymm9,%ymm9 - vpxor %ymm9,%ymm5,%ymm5 - vpslld $7,%ymm5,%ymm3 - vpsrld $25,%ymm5,%ymm5 - vpxor %ymm3,%ymm5,%ymm5 - vpalignr $4,%ymm13,%ymm13,%ymm13 - vpalignr $8,%ymm9,%ymm9,%ymm9 - vpalignr $12,%ymm5,%ymm5,%ymm5 - - decq %r10 - jne .Lseal_avx2_192_rounds - vpaddd %ymm2,%ymm0,%ymm0 - vpaddd %ymm2,%ymm1,%ymm1 - vpaddd %ymm6,%ymm4,%ymm4 - vpaddd %ymm6,%ymm5,%ymm5 - vpaddd %ymm10,%ymm8,%ymm8 - vpaddd %ymm10,%ymm9,%ymm9 - vpaddd %ymm11,%ymm12,%ymm12 - vpaddd %ymm15,%ymm13,%ymm13 - vperm2i128 $0x02,%ymm0,%ymm4,%ymm3 - - vpand .Lclamp(%rip),%ymm3,%ymm3 - vmovdqa %ymm3,0+0(%rbp) - - vperm2i128 $0x13,%ymm0,%ymm4,%ymm0 - vperm2i128 $0x13,%ymm8,%ymm12,%ymm4 - vperm2i128 $0x02,%ymm1,%ymm5,%ymm8 - vperm2i128 $0x02,%ymm9,%ymm13,%ymm12 - vperm2i128 $0x13,%ymm1,%ymm5,%ymm1 - vperm2i128 $0x13,%ymm9,%ymm13,%ymm5 -.Lseal_avx2_short: - movq %r8,%r8 - call poly_hash_ad_internal - xorq %rcx,%rcx -.Lseal_avx2_short_hash_remainder: - cmpq $16,%rcx - jb .Lseal_avx2_short_loop - addq 0+0(%rdi),%r10 - adcq 8+0(%rdi),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - subq $16,%rcx - addq $16,%rdi - jmp .Lseal_avx2_short_hash_remainder -.Lseal_avx2_short_loop: - cmpq $32,%rbx - jb .Lseal_avx2_short_tail - subq $32,%rbx - - vpxor (%rsi),%ymm0,%ymm0 - vmovdqu %ymm0,(%rdi) - leaq 32(%rsi),%rsi - - addq 0+0(%rdi),%r10 - adcq 8+0(%rdi),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - addq 0+16(%rdi),%r10 - adcq 8+16(%rdi),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - leaq 32(%rdi),%rdi - - vmovdqa %ymm4,%ymm0 - vmovdqa %ymm8,%ymm4 - vmovdqa %ymm12,%ymm8 - vmovdqa %ymm1,%ymm12 - vmovdqa %ymm5,%ymm1 - vmovdqa %ymm9,%ymm5 - vmovdqa %ymm13,%ymm9 - vmovdqa %ymm2,%ymm13 - vmovdqa %ymm6,%ymm2 - jmp .Lseal_avx2_short_loop -.Lseal_avx2_short_tail: - cmpq $16,%rbx - jb .Lseal_avx2_exit - subq $16,%rbx - vpxor (%rsi),%xmm0,%xmm3 - vmovdqu %xmm3,(%rdi) - leaq 16(%rsi),%rsi - addq 0+0(%rdi),%r10 - adcq 8+0(%rdi),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - leaq 16(%rdi),%rdi - vextracti128 $1,%ymm0,%xmm0 -.Lseal_avx2_exit: - vzeroupper - jmp .Lseal_sse_tail_16 -.cfi_endproc -.size chacha20_poly1305_seal_avx2, .-chacha20_poly1305_seal_avx2 -#endif -.section .note.GNU-stack,"",@progbits diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/chacha20_poly1305_x86_64-macosx.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/chacha20_poly1305_x86_64-macosx.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/chacha20_poly1305_x86_64-macosx.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/chacha20_poly1305_x86_64-macosx.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,8874 +0,0 @@ -# This file is generated from a similarly-named Perl script in the BoringSSL -# source tree. Do not edit by hand. - -#if defined(__has_feature) -#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) -#define OPENSSL_NO_ASM -#endif -#endif - -#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) -.text - - -chacha20_poly1305_constants: - -.p2align 6 -L$chacha20_consts: -.byte 'e','x','p','a','n','d',' ','3','2','-','b','y','t','e',' ','k' -.byte 'e','x','p','a','n','d',' ','3','2','-','b','y','t','e',' ','k' -L$rol8: -.byte 3,0,1,2, 7,4,5,6, 11,8,9,10, 15,12,13,14 -.byte 3,0,1,2, 7,4,5,6, 11,8,9,10, 15,12,13,14 -L$rol16: -.byte 2,3,0,1, 6,7,4,5, 10,11,8,9, 14,15,12,13 -.byte 2,3,0,1, 6,7,4,5, 10,11,8,9, 14,15,12,13 -L$avx2_init: -.long 0,0,0,0 -L$sse_inc: -.long 1,0,0,0 -L$avx2_inc: -.long 2,0,0,0,2,0,0,0 -L$clamp: -.quad 0x0FFFFFFC0FFFFFFF, 0x0FFFFFFC0FFFFFFC -.quad 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF -.p2align 4 -L$and_masks: -.byte 0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 -.byte 0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 -.byte 0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 -.byte 0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 -.byte 0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 -.byte 0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 -.byte 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 -.byte 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 -.byte 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00 -.byte 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00 -.byte 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00 -.byte 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00 -.byte 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00 -.byte 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00 -.byte 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00 -.byte 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff - - -.p2align 6 -poly_hash_ad_internal: - - - xorq %r10,%r10 - xorq %r11,%r11 - xorq %r12,%r12 - cmpq $13,%r8 - jne L$hash_ad_loop -L$poly_fast_tls_ad: - - movq (%rcx),%r10 - movq 5(%rcx),%r11 - shrq $24,%r11 - movq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - .byte 0xf3,0xc3 -L$hash_ad_loop: - - cmpq $16,%r8 - jb L$hash_ad_tail - addq 0+0(%rcx),%r10 - adcq 8+0(%rcx),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - leaq 16(%rcx),%rcx - subq $16,%r8 - jmp L$hash_ad_loop -L$hash_ad_tail: - cmpq $0,%r8 - je L$hash_ad_done - - xorq %r13,%r13 - xorq %r14,%r14 - xorq %r15,%r15 - addq %r8,%rcx -L$hash_ad_tail_loop: - shldq $8,%r13,%r14 - shlq $8,%r13 - movzbq -1(%rcx),%r15 - xorq %r15,%r13 - decq %rcx - decq %r8 - jne L$hash_ad_tail_loop - - addq %r13,%r10 - adcq %r14,%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - -L$hash_ad_done: - .byte 0xf3,0xc3 - - - -.globl _GFp_chacha20_poly1305_open -.private_extern _GFp_chacha20_poly1305_open - -.p2align 6 -_GFp_chacha20_poly1305_open: - - pushq %rbp - - pushq %rbx - - pushq %r12 - - pushq %r13 - - pushq %r14 - - pushq %r15 - - - - pushq %r9 - - subq $288 + 0 + 32,%rsp - - - leaq 32(%rsp),%rbp - andq $-32,%rbp - - movq %rdx,%rbx - movq %r8,0+0+32(%rbp) - movq %rbx,8+0+32(%rbp) - - movl _GFp_ia32cap_P+8(%rip),%eax - andl $288,%eax - xorl $288,%eax - jz chacha20_poly1305_open_avx2 - - cmpq $128,%rbx - jbe L$open_sse_128 - - movdqa L$chacha20_consts(%rip),%xmm0 - movdqu 0(%r9),%xmm4 - movdqu 16(%r9),%xmm8 - movdqu 32(%r9),%xmm12 - - movdqa %xmm12,%xmm7 - - movdqa %xmm4,0+48(%rbp) - movdqa %xmm8,0+64(%rbp) - movdqa %xmm12,0+96(%rbp) - movq $10,%r10 -L$open_sse_init_rounds: - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb L$rol16(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm4 - pxor %xmm3,%xmm4 - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb L$rol8(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm4 - pxor %xmm3,%xmm4 -.byte 102,15,58,15,228,4 -.byte 102,69,15,58,15,192,8 -.byte 102,69,15,58,15,228,12 - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb L$rol16(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm4 - pxor %xmm3,%xmm4 - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb L$rol8(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm4 - pxor %xmm3,%xmm4 -.byte 102,15,58,15,228,12 -.byte 102,69,15,58,15,192,8 -.byte 102,69,15,58,15,228,4 - - decq %r10 - jne L$open_sse_init_rounds - - paddd L$chacha20_consts(%rip),%xmm0 - paddd 0+48(%rbp),%xmm4 - - pand L$clamp(%rip),%xmm0 - movdqa %xmm0,0+0(%rbp) - movdqa %xmm4,0+16(%rbp) - - movq %r8,%r8 - call poly_hash_ad_internal -L$open_sse_main_loop: - cmpq $256,%rbx - jb L$open_sse_tail - - movdqa L$chacha20_consts(%rip),%xmm0 - movdqa 0+48(%rbp),%xmm4 - movdqa 0+64(%rbp),%xmm8 - movdqa %xmm0,%xmm1 - movdqa %xmm4,%xmm5 - movdqa %xmm8,%xmm9 - movdqa %xmm0,%xmm2 - movdqa %xmm4,%xmm6 - movdqa %xmm8,%xmm10 - movdqa %xmm0,%xmm3 - movdqa %xmm4,%xmm7 - movdqa %xmm8,%xmm11 - movdqa 0+96(%rbp),%xmm15 - paddd L$sse_inc(%rip),%xmm15 - movdqa %xmm15,%xmm14 - paddd L$sse_inc(%rip),%xmm14 - movdqa %xmm14,%xmm13 - paddd L$sse_inc(%rip),%xmm13 - movdqa %xmm13,%xmm12 - paddd L$sse_inc(%rip),%xmm12 - movdqa %xmm12,0+96(%rbp) - movdqa %xmm13,0+112(%rbp) - movdqa %xmm14,0+128(%rbp) - movdqa %xmm15,0+144(%rbp) - - - - movq $4,%rcx - movq %rsi,%r8 -L$open_sse_main_loop_rounds: - movdqa %xmm8,0+80(%rbp) - movdqa L$rol16(%rip),%xmm8 - paddd %xmm7,%xmm3 - paddd %xmm6,%xmm2 - paddd %xmm5,%xmm1 - paddd %xmm4,%xmm0 - pxor %xmm3,%xmm15 - pxor %xmm2,%xmm14 - pxor %xmm1,%xmm13 - pxor %xmm0,%xmm12 -.byte 102,69,15,56,0,248 -.byte 102,69,15,56,0,240 -.byte 102,69,15,56,0,232 -.byte 102,69,15,56,0,224 - movdqa 0+80(%rbp),%xmm8 - paddd %xmm15,%xmm11 - paddd %xmm14,%xmm10 - paddd %xmm13,%xmm9 - paddd %xmm12,%xmm8 - pxor %xmm11,%xmm7 - addq 0+0(%r8),%r10 - adcq 8+0(%r8),%r11 - adcq $1,%r12 - - leaq 16(%r8),%r8 - pxor %xmm10,%xmm6 - pxor %xmm9,%xmm5 - pxor %xmm8,%xmm4 - movdqa %xmm8,0+80(%rbp) - movdqa %xmm7,%xmm8 - psrld $20,%xmm8 - pslld $32-20,%xmm7 - pxor %xmm8,%xmm7 - movdqa %xmm6,%xmm8 - psrld $20,%xmm8 - pslld $32-20,%xmm6 - pxor %xmm8,%xmm6 - movdqa %xmm5,%xmm8 - psrld $20,%xmm8 - pslld $32-20,%xmm5 - pxor %xmm8,%xmm5 - movdqa %xmm4,%xmm8 - psrld $20,%xmm8 - pslld $32-20,%xmm4 - pxor %xmm8,%xmm4 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movdqa L$rol8(%rip),%xmm8 - paddd %xmm7,%xmm3 - paddd %xmm6,%xmm2 - paddd %xmm5,%xmm1 - paddd %xmm4,%xmm0 - pxor %xmm3,%xmm15 - pxor %xmm2,%xmm14 - pxor %xmm1,%xmm13 - pxor %xmm0,%xmm12 -.byte 102,69,15,56,0,248 -.byte 102,69,15,56,0,240 -.byte 102,69,15,56,0,232 -.byte 102,69,15,56,0,224 - movdqa 0+80(%rbp),%xmm8 - paddd %xmm15,%xmm11 - paddd %xmm14,%xmm10 - paddd %xmm13,%xmm9 - paddd %xmm12,%xmm8 - pxor %xmm11,%xmm7 - pxor %xmm10,%xmm6 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - pxor %xmm9,%xmm5 - pxor %xmm8,%xmm4 - movdqa %xmm8,0+80(%rbp) - movdqa %xmm7,%xmm8 - psrld $25,%xmm8 - pslld $32-25,%xmm7 - pxor %xmm8,%xmm7 - movdqa %xmm6,%xmm8 - psrld $25,%xmm8 - pslld $32-25,%xmm6 - pxor %xmm8,%xmm6 - movdqa %xmm5,%xmm8 - psrld $25,%xmm8 - pslld $32-25,%xmm5 - pxor %xmm8,%xmm5 - movdqa %xmm4,%xmm8 - psrld $25,%xmm8 - pslld $32-25,%xmm4 - pxor %xmm8,%xmm4 - movdqa 0+80(%rbp),%xmm8 - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 -.byte 102,15,58,15,255,4 -.byte 102,69,15,58,15,219,8 -.byte 102,69,15,58,15,255,12 -.byte 102,15,58,15,246,4 -.byte 102,69,15,58,15,210,8 -.byte 102,69,15,58,15,246,12 -.byte 102,15,58,15,237,4 -.byte 102,69,15,58,15,201,8 -.byte 102,69,15,58,15,237,12 -.byte 102,15,58,15,228,4 -.byte 102,69,15,58,15,192,8 -.byte 102,69,15,58,15,228,12 - movdqa %xmm8,0+80(%rbp) - movdqa L$rol16(%rip),%xmm8 - paddd %xmm7,%xmm3 - paddd %xmm6,%xmm2 - paddd %xmm5,%xmm1 - paddd %xmm4,%xmm0 - pxor %xmm3,%xmm15 - pxor %xmm2,%xmm14 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - pxor %xmm1,%xmm13 - pxor %xmm0,%xmm12 -.byte 102,69,15,56,0,248 -.byte 102,69,15,56,0,240 -.byte 102,69,15,56,0,232 -.byte 102,69,15,56,0,224 - movdqa 0+80(%rbp),%xmm8 - paddd %xmm15,%xmm11 - paddd %xmm14,%xmm10 - paddd %xmm13,%xmm9 - paddd %xmm12,%xmm8 - pxor %xmm11,%xmm7 - pxor %xmm10,%xmm6 - pxor %xmm9,%xmm5 - pxor %xmm8,%xmm4 - movdqa %xmm8,0+80(%rbp) - movdqa %xmm7,%xmm8 - psrld $20,%xmm8 - pslld $32-20,%xmm7 - pxor %xmm8,%xmm7 - movdqa %xmm6,%xmm8 - psrld $20,%xmm8 - pslld $32-20,%xmm6 - pxor %xmm8,%xmm6 - movdqa %xmm5,%xmm8 - psrld $20,%xmm8 - pslld $32-20,%xmm5 - pxor %xmm8,%xmm5 - movdqa %xmm4,%xmm8 - psrld $20,%xmm8 - pslld $32-20,%xmm4 - pxor %xmm8,%xmm4 - movdqa L$rol8(%rip),%xmm8 - paddd %xmm7,%xmm3 - paddd %xmm6,%xmm2 - paddd %xmm5,%xmm1 - paddd %xmm4,%xmm0 - pxor %xmm3,%xmm15 - pxor %xmm2,%xmm14 - pxor %xmm1,%xmm13 - pxor %xmm0,%xmm12 -.byte 102,69,15,56,0,248 -.byte 102,69,15,56,0,240 -.byte 102,69,15,56,0,232 -.byte 102,69,15,56,0,224 - movdqa 0+80(%rbp),%xmm8 - paddd %xmm15,%xmm11 - paddd %xmm14,%xmm10 - paddd %xmm13,%xmm9 - paddd %xmm12,%xmm8 - pxor %xmm11,%xmm7 - pxor %xmm10,%xmm6 - pxor %xmm9,%xmm5 - pxor %xmm8,%xmm4 - movdqa %xmm8,0+80(%rbp) - movdqa %xmm7,%xmm8 - psrld $25,%xmm8 - pslld $32-25,%xmm7 - pxor %xmm8,%xmm7 - movdqa %xmm6,%xmm8 - psrld $25,%xmm8 - pslld $32-25,%xmm6 - pxor %xmm8,%xmm6 - movdqa %xmm5,%xmm8 - psrld $25,%xmm8 - pslld $32-25,%xmm5 - pxor %xmm8,%xmm5 - movdqa %xmm4,%xmm8 - psrld $25,%xmm8 - pslld $32-25,%xmm4 - pxor %xmm8,%xmm4 - movdqa 0+80(%rbp),%xmm8 -.byte 102,15,58,15,255,12 -.byte 102,69,15,58,15,219,8 -.byte 102,69,15,58,15,255,4 -.byte 102,15,58,15,246,12 -.byte 102,69,15,58,15,210,8 -.byte 102,69,15,58,15,246,4 -.byte 102,15,58,15,237,12 -.byte 102,69,15,58,15,201,8 -.byte 102,69,15,58,15,237,4 -.byte 102,15,58,15,228,12 -.byte 102,69,15,58,15,192,8 -.byte 102,69,15,58,15,228,4 - - decq %rcx - jge L$open_sse_main_loop_rounds - addq 0+0(%r8),%r10 - adcq 8+0(%r8),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - leaq 16(%r8),%r8 - cmpq $-6,%rcx - jg L$open_sse_main_loop_rounds - paddd L$chacha20_consts(%rip),%xmm3 - paddd 0+48(%rbp),%xmm7 - paddd 0+64(%rbp),%xmm11 - paddd 0+144(%rbp),%xmm15 - paddd L$chacha20_consts(%rip),%xmm2 - paddd 0+48(%rbp),%xmm6 - paddd 0+64(%rbp),%xmm10 - paddd 0+128(%rbp),%xmm14 - paddd L$chacha20_consts(%rip),%xmm1 - paddd 0+48(%rbp),%xmm5 - paddd 0+64(%rbp),%xmm9 - paddd 0+112(%rbp),%xmm13 - paddd L$chacha20_consts(%rip),%xmm0 - paddd 0+48(%rbp),%xmm4 - paddd 0+64(%rbp),%xmm8 - paddd 0+96(%rbp),%xmm12 - movdqa %xmm12,0+80(%rbp) - movdqu 0 + 0(%rsi),%xmm12 - pxor %xmm3,%xmm12 - movdqu %xmm12,0 + 0(%rdi) - movdqu 16 + 0(%rsi),%xmm12 - pxor %xmm7,%xmm12 - movdqu %xmm12,16 + 0(%rdi) - movdqu 32 + 0(%rsi),%xmm12 - pxor %xmm11,%xmm12 - movdqu %xmm12,32 + 0(%rdi) - movdqu 48 + 0(%rsi),%xmm12 - pxor %xmm15,%xmm12 - movdqu %xmm12,48 + 0(%rdi) - movdqu 0 + 64(%rsi),%xmm3 - movdqu 16 + 64(%rsi),%xmm7 - movdqu 32 + 64(%rsi),%xmm11 - movdqu 48 + 64(%rsi),%xmm15 - pxor %xmm3,%xmm2 - pxor %xmm7,%xmm6 - pxor %xmm11,%xmm10 - pxor %xmm14,%xmm15 - movdqu %xmm2,0 + 64(%rdi) - movdqu %xmm6,16 + 64(%rdi) - movdqu %xmm10,32 + 64(%rdi) - movdqu %xmm15,48 + 64(%rdi) - movdqu 0 + 128(%rsi),%xmm3 - movdqu 16 + 128(%rsi),%xmm7 - movdqu 32 + 128(%rsi),%xmm11 - movdqu 48 + 128(%rsi),%xmm15 - pxor %xmm3,%xmm1 - pxor %xmm7,%xmm5 - pxor %xmm11,%xmm9 - pxor %xmm13,%xmm15 - movdqu %xmm1,0 + 128(%rdi) - movdqu %xmm5,16 + 128(%rdi) - movdqu %xmm9,32 + 128(%rdi) - movdqu %xmm15,48 + 128(%rdi) - movdqu 0 + 192(%rsi),%xmm3 - movdqu 16 + 192(%rsi),%xmm7 - movdqu 32 + 192(%rsi),%xmm11 - movdqu 48 + 192(%rsi),%xmm15 - pxor %xmm3,%xmm0 - pxor %xmm7,%xmm4 - pxor %xmm11,%xmm8 - pxor 0+80(%rbp),%xmm15 - movdqu %xmm0,0 + 192(%rdi) - movdqu %xmm4,16 + 192(%rdi) - movdqu %xmm8,32 + 192(%rdi) - movdqu %xmm15,48 + 192(%rdi) - - leaq 256(%rsi),%rsi - leaq 256(%rdi),%rdi - subq $256,%rbx - jmp L$open_sse_main_loop -L$open_sse_tail: - - testq %rbx,%rbx - jz L$open_sse_finalize - cmpq $192,%rbx - ja L$open_sse_tail_256 - cmpq $128,%rbx - ja L$open_sse_tail_192 - cmpq $64,%rbx - ja L$open_sse_tail_128 - movdqa L$chacha20_consts(%rip),%xmm0 - movdqa 0+48(%rbp),%xmm4 - movdqa 0+64(%rbp),%xmm8 - movdqa 0+96(%rbp),%xmm12 - paddd L$sse_inc(%rip),%xmm12 - movdqa %xmm12,0+96(%rbp) - - xorq %r8,%r8 - movq %rbx,%rcx - cmpq $16,%rcx - jb L$open_sse_tail_64_rounds -L$open_sse_tail_64_rounds_and_x1hash: - addq 0+0(%rsi,%r8,1),%r10 - adcq 8+0(%rsi,%r8,1),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - subq $16,%rcx -L$open_sse_tail_64_rounds: - addq $16,%r8 - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb L$rol16(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm4 - pxor %xmm3,%xmm4 - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb L$rol8(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm4 - pxor %xmm3,%xmm4 -.byte 102,15,58,15,228,4 -.byte 102,69,15,58,15,192,8 -.byte 102,69,15,58,15,228,12 - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb L$rol16(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm4 - pxor %xmm3,%xmm4 - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb L$rol8(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm4 - pxor %xmm3,%xmm4 -.byte 102,15,58,15,228,12 -.byte 102,69,15,58,15,192,8 -.byte 102,69,15,58,15,228,4 - - cmpq $16,%rcx - jae L$open_sse_tail_64_rounds_and_x1hash - cmpq $160,%r8 - jne L$open_sse_tail_64_rounds - paddd L$chacha20_consts(%rip),%xmm0 - paddd 0+48(%rbp),%xmm4 - paddd 0+64(%rbp),%xmm8 - paddd 0+96(%rbp),%xmm12 - - jmp L$open_sse_tail_64_dec_loop - -L$open_sse_tail_128: - movdqa L$chacha20_consts(%rip),%xmm0 - movdqa 0+48(%rbp),%xmm4 - movdqa 0+64(%rbp),%xmm8 - movdqa %xmm0,%xmm1 - movdqa %xmm4,%xmm5 - movdqa %xmm8,%xmm9 - movdqa 0+96(%rbp),%xmm13 - paddd L$sse_inc(%rip),%xmm13 - movdqa %xmm13,%xmm12 - paddd L$sse_inc(%rip),%xmm12 - movdqa %xmm12,0+96(%rbp) - movdqa %xmm13,0+112(%rbp) - - movq %rbx,%rcx - andq $-16,%rcx - xorq %r8,%r8 -L$open_sse_tail_128_rounds_and_x1hash: - addq 0+0(%rsi,%r8,1),%r10 - adcq 8+0(%rsi,%r8,1),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - -L$open_sse_tail_128_rounds: - addq $16,%r8 - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb L$rol16(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm4 - pxor %xmm3,%xmm4 - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb L$rol8(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm4 - pxor %xmm3,%xmm4 -.byte 102,15,58,15,228,4 -.byte 102,69,15,58,15,192,8 -.byte 102,69,15,58,15,228,12 - paddd %xmm5,%xmm1 - pxor %xmm1,%xmm13 - pshufb L$rol16(%rip),%xmm13 - paddd %xmm13,%xmm9 - pxor %xmm9,%xmm5 - movdqa %xmm5,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm5 - pxor %xmm3,%xmm5 - paddd %xmm5,%xmm1 - pxor %xmm1,%xmm13 - pshufb L$rol8(%rip),%xmm13 - paddd %xmm13,%xmm9 - pxor %xmm9,%xmm5 - movdqa %xmm5,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm5 - pxor %xmm3,%xmm5 -.byte 102,15,58,15,237,4 -.byte 102,69,15,58,15,201,8 -.byte 102,69,15,58,15,237,12 - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb L$rol16(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm4 - pxor %xmm3,%xmm4 - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb L$rol8(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm4 - pxor %xmm3,%xmm4 -.byte 102,15,58,15,228,12 -.byte 102,69,15,58,15,192,8 -.byte 102,69,15,58,15,228,4 - paddd %xmm5,%xmm1 - pxor %xmm1,%xmm13 - pshufb L$rol16(%rip),%xmm13 - paddd %xmm13,%xmm9 - pxor %xmm9,%xmm5 - movdqa %xmm5,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm5 - pxor %xmm3,%xmm5 - paddd %xmm5,%xmm1 - pxor %xmm1,%xmm13 - pshufb L$rol8(%rip),%xmm13 - paddd %xmm13,%xmm9 - pxor %xmm9,%xmm5 - movdqa %xmm5,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm5 - pxor %xmm3,%xmm5 -.byte 102,15,58,15,237,12 -.byte 102,69,15,58,15,201,8 -.byte 102,69,15,58,15,237,4 - - cmpq %rcx,%r8 - jb L$open_sse_tail_128_rounds_and_x1hash - cmpq $160,%r8 - jne L$open_sse_tail_128_rounds - paddd L$chacha20_consts(%rip),%xmm1 - paddd 0+48(%rbp),%xmm5 - paddd 0+64(%rbp),%xmm9 - paddd 0+112(%rbp),%xmm13 - paddd L$chacha20_consts(%rip),%xmm0 - paddd 0+48(%rbp),%xmm4 - paddd 0+64(%rbp),%xmm8 - paddd 0+96(%rbp),%xmm12 - movdqu 0 + 0(%rsi),%xmm3 - movdqu 16 + 0(%rsi),%xmm7 - movdqu 32 + 0(%rsi),%xmm11 - movdqu 48 + 0(%rsi),%xmm15 - pxor %xmm3,%xmm1 - pxor %xmm7,%xmm5 - pxor %xmm11,%xmm9 - pxor %xmm13,%xmm15 - movdqu %xmm1,0 + 0(%rdi) - movdqu %xmm5,16 + 0(%rdi) - movdqu %xmm9,32 + 0(%rdi) - movdqu %xmm15,48 + 0(%rdi) - - subq $64,%rbx - leaq 64(%rsi),%rsi - leaq 64(%rdi),%rdi - jmp L$open_sse_tail_64_dec_loop - -L$open_sse_tail_192: - movdqa L$chacha20_consts(%rip),%xmm0 - movdqa 0+48(%rbp),%xmm4 - movdqa 0+64(%rbp),%xmm8 - movdqa %xmm0,%xmm1 - movdqa %xmm4,%xmm5 - movdqa %xmm8,%xmm9 - movdqa %xmm0,%xmm2 - movdqa %xmm4,%xmm6 - movdqa %xmm8,%xmm10 - movdqa 0+96(%rbp),%xmm14 - paddd L$sse_inc(%rip),%xmm14 - movdqa %xmm14,%xmm13 - paddd L$sse_inc(%rip),%xmm13 - movdqa %xmm13,%xmm12 - paddd L$sse_inc(%rip),%xmm12 - movdqa %xmm12,0+96(%rbp) - movdqa %xmm13,0+112(%rbp) - movdqa %xmm14,0+128(%rbp) - - movq %rbx,%rcx - movq $160,%r8 - cmpq $160,%rcx - cmovgq %r8,%rcx - andq $-16,%rcx - xorq %r8,%r8 -L$open_sse_tail_192_rounds_and_x1hash: - addq 0+0(%rsi,%r8,1),%r10 - adcq 8+0(%rsi,%r8,1),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - -L$open_sse_tail_192_rounds: - addq $16,%r8 - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb L$rol16(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm4 - pxor %xmm3,%xmm4 - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb L$rol8(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm4 - pxor %xmm3,%xmm4 -.byte 102,15,58,15,228,4 -.byte 102,69,15,58,15,192,8 -.byte 102,69,15,58,15,228,12 - paddd %xmm5,%xmm1 - pxor %xmm1,%xmm13 - pshufb L$rol16(%rip),%xmm13 - paddd %xmm13,%xmm9 - pxor %xmm9,%xmm5 - movdqa %xmm5,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm5 - pxor %xmm3,%xmm5 - paddd %xmm5,%xmm1 - pxor %xmm1,%xmm13 - pshufb L$rol8(%rip),%xmm13 - paddd %xmm13,%xmm9 - pxor %xmm9,%xmm5 - movdqa %xmm5,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm5 - pxor %xmm3,%xmm5 -.byte 102,15,58,15,237,4 -.byte 102,69,15,58,15,201,8 -.byte 102,69,15,58,15,237,12 - paddd %xmm6,%xmm2 - pxor %xmm2,%xmm14 - pshufb L$rol16(%rip),%xmm14 - paddd %xmm14,%xmm10 - pxor %xmm10,%xmm6 - movdqa %xmm6,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm6 - pxor %xmm3,%xmm6 - paddd %xmm6,%xmm2 - pxor %xmm2,%xmm14 - pshufb L$rol8(%rip),%xmm14 - paddd %xmm14,%xmm10 - pxor %xmm10,%xmm6 - movdqa %xmm6,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm6 - pxor %xmm3,%xmm6 -.byte 102,15,58,15,246,4 -.byte 102,69,15,58,15,210,8 -.byte 102,69,15,58,15,246,12 - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb L$rol16(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm4 - pxor %xmm3,%xmm4 - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb L$rol8(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm4 - pxor %xmm3,%xmm4 -.byte 102,15,58,15,228,12 -.byte 102,69,15,58,15,192,8 -.byte 102,69,15,58,15,228,4 - paddd %xmm5,%xmm1 - pxor %xmm1,%xmm13 - pshufb L$rol16(%rip),%xmm13 - paddd %xmm13,%xmm9 - pxor %xmm9,%xmm5 - movdqa %xmm5,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm5 - pxor %xmm3,%xmm5 - paddd %xmm5,%xmm1 - pxor %xmm1,%xmm13 - pshufb L$rol8(%rip),%xmm13 - paddd %xmm13,%xmm9 - pxor %xmm9,%xmm5 - movdqa %xmm5,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm5 - pxor %xmm3,%xmm5 -.byte 102,15,58,15,237,12 -.byte 102,69,15,58,15,201,8 -.byte 102,69,15,58,15,237,4 - paddd %xmm6,%xmm2 - pxor %xmm2,%xmm14 - pshufb L$rol16(%rip),%xmm14 - paddd %xmm14,%xmm10 - pxor %xmm10,%xmm6 - movdqa %xmm6,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm6 - pxor %xmm3,%xmm6 - paddd %xmm6,%xmm2 - pxor %xmm2,%xmm14 - pshufb L$rol8(%rip),%xmm14 - paddd %xmm14,%xmm10 - pxor %xmm10,%xmm6 - movdqa %xmm6,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm6 - pxor %xmm3,%xmm6 -.byte 102,15,58,15,246,12 -.byte 102,69,15,58,15,210,8 -.byte 102,69,15,58,15,246,4 - - cmpq %rcx,%r8 - jb L$open_sse_tail_192_rounds_and_x1hash - cmpq $160,%r8 - jne L$open_sse_tail_192_rounds - cmpq $176,%rbx - jb L$open_sse_tail_192_finish - addq 0+160(%rsi),%r10 - adcq 8+160(%rsi),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - cmpq $192,%rbx - jb L$open_sse_tail_192_finish - addq 0+176(%rsi),%r10 - adcq 8+176(%rsi),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - -L$open_sse_tail_192_finish: - paddd L$chacha20_consts(%rip),%xmm2 - paddd 0+48(%rbp),%xmm6 - paddd 0+64(%rbp),%xmm10 - paddd 0+128(%rbp),%xmm14 - paddd L$chacha20_consts(%rip),%xmm1 - paddd 0+48(%rbp),%xmm5 - paddd 0+64(%rbp),%xmm9 - paddd 0+112(%rbp),%xmm13 - paddd L$chacha20_consts(%rip),%xmm0 - paddd 0+48(%rbp),%xmm4 - paddd 0+64(%rbp),%xmm8 - paddd 0+96(%rbp),%xmm12 - movdqu 0 + 0(%rsi),%xmm3 - movdqu 16 + 0(%rsi),%xmm7 - movdqu 32 + 0(%rsi),%xmm11 - movdqu 48 + 0(%rsi),%xmm15 - pxor %xmm3,%xmm2 - pxor %xmm7,%xmm6 - pxor %xmm11,%xmm10 - pxor %xmm14,%xmm15 - movdqu %xmm2,0 + 0(%rdi) - movdqu %xmm6,16 + 0(%rdi) - movdqu %xmm10,32 + 0(%rdi) - movdqu %xmm15,48 + 0(%rdi) - movdqu 0 + 64(%rsi),%xmm3 - movdqu 16 + 64(%rsi),%xmm7 - movdqu 32 + 64(%rsi),%xmm11 - movdqu 48 + 64(%rsi),%xmm15 - pxor %xmm3,%xmm1 - pxor %xmm7,%xmm5 - pxor %xmm11,%xmm9 - pxor %xmm13,%xmm15 - movdqu %xmm1,0 + 64(%rdi) - movdqu %xmm5,16 + 64(%rdi) - movdqu %xmm9,32 + 64(%rdi) - movdqu %xmm15,48 + 64(%rdi) - - subq $128,%rbx - leaq 128(%rsi),%rsi - leaq 128(%rdi),%rdi - jmp L$open_sse_tail_64_dec_loop - -L$open_sse_tail_256: - movdqa L$chacha20_consts(%rip),%xmm0 - movdqa 0+48(%rbp),%xmm4 - movdqa 0+64(%rbp),%xmm8 - movdqa %xmm0,%xmm1 - movdqa %xmm4,%xmm5 - movdqa %xmm8,%xmm9 - movdqa %xmm0,%xmm2 - movdqa %xmm4,%xmm6 - movdqa %xmm8,%xmm10 - movdqa %xmm0,%xmm3 - movdqa %xmm4,%xmm7 - movdqa %xmm8,%xmm11 - movdqa 0+96(%rbp),%xmm15 - paddd L$sse_inc(%rip),%xmm15 - movdqa %xmm15,%xmm14 - paddd L$sse_inc(%rip),%xmm14 - movdqa %xmm14,%xmm13 - paddd L$sse_inc(%rip),%xmm13 - movdqa %xmm13,%xmm12 - paddd L$sse_inc(%rip),%xmm12 - movdqa %xmm12,0+96(%rbp) - movdqa %xmm13,0+112(%rbp) - movdqa %xmm14,0+128(%rbp) - movdqa %xmm15,0+144(%rbp) - - xorq %r8,%r8 -L$open_sse_tail_256_rounds_and_x1hash: - addq 0+0(%rsi,%r8,1),%r10 - adcq 8+0(%rsi,%r8,1),%r11 - adcq $1,%r12 - movdqa %xmm11,0+80(%rbp) - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb L$rol16(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm11 - pslld $12,%xmm11 - psrld $20,%xmm4 - pxor %xmm11,%xmm4 - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb L$rol8(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm11 - pslld $7,%xmm11 - psrld $25,%xmm4 - pxor %xmm11,%xmm4 -.byte 102,15,58,15,228,4 -.byte 102,69,15,58,15,192,8 -.byte 102,69,15,58,15,228,12 - paddd %xmm5,%xmm1 - pxor %xmm1,%xmm13 - pshufb L$rol16(%rip),%xmm13 - paddd %xmm13,%xmm9 - pxor %xmm9,%xmm5 - movdqa %xmm5,%xmm11 - pslld $12,%xmm11 - psrld $20,%xmm5 - pxor %xmm11,%xmm5 - paddd %xmm5,%xmm1 - pxor %xmm1,%xmm13 - pshufb L$rol8(%rip),%xmm13 - paddd %xmm13,%xmm9 - pxor %xmm9,%xmm5 - movdqa %xmm5,%xmm11 - pslld $7,%xmm11 - psrld $25,%xmm5 - pxor %xmm11,%xmm5 -.byte 102,15,58,15,237,4 -.byte 102,69,15,58,15,201,8 -.byte 102,69,15,58,15,237,12 - paddd %xmm6,%xmm2 - pxor %xmm2,%xmm14 - pshufb L$rol16(%rip),%xmm14 - paddd %xmm14,%xmm10 - pxor %xmm10,%xmm6 - movdqa %xmm6,%xmm11 - pslld $12,%xmm11 - psrld $20,%xmm6 - pxor %xmm11,%xmm6 - paddd %xmm6,%xmm2 - pxor %xmm2,%xmm14 - pshufb L$rol8(%rip),%xmm14 - paddd %xmm14,%xmm10 - pxor %xmm10,%xmm6 - movdqa %xmm6,%xmm11 - pslld $7,%xmm11 - psrld $25,%xmm6 - pxor %xmm11,%xmm6 -.byte 102,15,58,15,246,4 -.byte 102,69,15,58,15,210,8 -.byte 102,69,15,58,15,246,12 - movdqa 0+80(%rbp),%xmm11 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movdqa %xmm9,0+80(%rbp) - paddd %xmm7,%xmm3 - pxor %xmm3,%xmm15 - pshufb L$rol16(%rip),%xmm15 - paddd %xmm15,%xmm11 - pxor %xmm11,%xmm7 - movdqa %xmm7,%xmm9 - pslld $12,%xmm9 - psrld $20,%xmm7 - pxor %xmm9,%xmm7 - paddd %xmm7,%xmm3 - pxor %xmm3,%xmm15 - pshufb L$rol8(%rip),%xmm15 - paddd %xmm15,%xmm11 - pxor %xmm11,%xmm7 - movdqa %xmm7,%xmm9 - pslld $7,%xmm9 - psrld $25,%xmm7 - pxor %xmm9,%xmm7 -.byte 102,15,58,15,255,4 -.byte 102,69,15,58,15,219,8 -.byte 102,69,15,58,15,255,12 - movdqa 0+80(%rbp),%xmm9 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - movdqa %xmm11,0+80(%rbp) - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb L$rol16(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm11 - pslld $12,%xmm11 - psrld $20,%xmm4 - pxor %xmm11,%xmm4 - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb L$rol8(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm11 - pslld $7,%xmm11 - psrld $25,%xmm4 - pxor %xmm11,%xmm4 -.byte 102,15,58,15,228,12 -.byte 102,69,15,58,15,192,8 -.byte 102,69,15,58,15,228,4 - paddd %xmm5,%xmm1 - pxor %xmm1,%xmm13 - pshufb L$rol16(%rip),%xmm13 - paddd %xmm13,%xmm9 - pxor %xmm9,%xmm5 - movdqa %xmm5,%xmm11 - pslld $12,%xmm11 - psrld $20,%xmm5 - pxor %xmm11,%xmm5 - paddd %xmm5,%xmm1 - pxor %xmm1,%xmm13 - pshufb L$rol8(%rip),%xmm13 - paddd %xmm13,%xmm9 - pxor %xmm9,%xmm5 - movdqa %xmm5,%xmm11 - pslld $7,%xmm11 - psrld $25,%xmm5 - pxor %xmm11,%xmm5 -.byte 102,15,58,15,237,12 -.byte 102,69,15,58,15,201,8 -.byte 102,69,15,58,15,237,4 - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - paddd %xmm6,%xmm2 - pxor %xmm2,%xmm14 - pshufb L$rol16(%rip),%xmm14 - paddd %xmm14,%xmm10 - pxor %xmm10,%xmm6 - movdqa %xmm6,%xmm11 - pslld $12,%xmm11 - psrld $20,%xmm6 - pxor %xmm11,%xmm6 - paddd %xmm6,%xmm2 - pxor %xmm2,%xmm14 - pshufb L$rol8(%rip),%xmm14 - paddd %xmm14,%xmm10 - pxor %xmm10,%xmm6 - movdqa %xmm6,%xmm11 - pslld $7,%xmm11 - psrld $25,%xmm6 - pxor %xmm11,%xmm6 -.byte 102,15,58,15,246,12 -.byte 102,69,15,58,15,210,8 -.byte 102,69,15,58,15,246,4 - movdqa 0+80(%rbp),%xmm11 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - movdqa %xmm9,0+80(%rbp) - paddd %xmm7,%xmm3 - pxor %xmm3,%xmm15 - pshufb L$rol16(%rip),%xmm15 - paddd %xmm15,%xmm11 - pxor %xmm11,%xmm7 - movdqa %xmm7,%xmm9 - pslld $12,%xmm9 - psrld $20,%xmm7 - pxor %xmm9,%xmm7 - paddd %xmm7,%xmm3 - pxor %xmm3,%xmm15 - pshufb L$rol8(%rip),%xmm15 - paddd %xmm15,%xmm11 - pxor %xmm11,%xmm7 - movdqa %xmm7,%xmm9 - pslld $7,%xmm9 - psrld $25,%xmm7 - pxor %xmm9,%xmm7 -.byte 102,15,58,15,255,12 -.byte 102,69,15,58,15,219,8 -.byte 102,69,15,58,15,255,4 - movdqa 0+80(%rbp),%xmm9 - - addq $16,%r8 - cmpq $160,%r8 - jb L$open_sse_tail_256_rounds_and_x1hash - - movq %rbx,%rcx - andq $-16,%rcx -L$open_sse_tail_256_hash: - addq 0+0(%rsi,%r8,1),%r10 - adcq 8+0(%rsi,%r8,1),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - addq $16,%r8 - cmpq %rcx,%r8 - jb L$open_sse_tail_256_hash - paddd L$chacha20_consts(%rip),%xmm3 - paddd 0+48(%rbp),%xmm7 - paddd 0+64(%rbp),%xmm11 - paddd 0+144(%rbp),%xmm15 - paddd L$chacha20_consts(%rip),%xmm2 - paddd 0+48(%rbp),%xmm6 - paddd 0+64(%rbp),%xmm10 - paddd 0+128(%rbp),%xmm14 - paddd L$chacha20_consts(%rip),%xmm1 - paddd 0+48(%rbp),%xmm5 - paddd 0+64(%rbp),%xmm9 - paddd 0+112(%rbp),%xmm13 - paddd L$chacha20_consts(%rip),%xmm0 - paddd 0+48(%rbp),%xmm4 - paddd 0+64(%rbp),%xmm8 - paddd 0+96(%rbp),%xmm12 - movdqa %xmm12,0+80(%rbp) - movdqu 0 + 0(%rsi),%xmm12 - pxor %xmm3,%xmm12 - movdqu %xmm12,0 + 0(%rdi) - movdqu 16 + 0(%rsi),%xmm12 - pxor %xmm7,%xmm12 - movdqu %xmm12,16 + 0(%rdi) - movdqu 32 + 0(%rsi),%xmm12 - pxor %xmm11,%xmm12 - movdqu %xmm12,32 + 0(%rdi) - movdqu 48 + 0(%rsi),%xmm12 - pxor %xmm15,%xmm12 - movdqu %xmm12,48 + 0(%rdi) - movdqu 0 + 64(%rsi),%xmm3 - movdqu 16 + 64(%rsi),%xmm7 - movdqu 32 + 64(%rsi),%xmm11 - movdqu 48 + 64(%rsi),%xmm15 - pxor %xmm3,%xmm2 - pxor %xmm7,%xmm6 - pxor %xmm11,%xmm10 - pxor %xmm14,%xmm15 - movdqu %xmm2,0 + 64(%rdi) - movdqu %xmm6,16 + 64(%rdi) - movdqu %xmm10,32 + 64(%rdi) - movdqu %xmm15,48 + 64(%rdi) - movdqu 0 + 128(%rsi),%xmm3 - movdqu 16 + 128(%rsi),%xmm7 - movdqu 32 + 128(%rsi),%xmm11 - movdqu 48 + 128(%rsi),%xmm15 - pxor %xmm3,%xmm1 - pxor %xmm7,%xmm5 - pxor %xmm11,%xmm9 - pxor %xmm13,%xmm15 - movdqu %xmm1,0 + 128(%rdi) - movdqu %xmm5,16 + 128(%rdi) - movdqu %xmm9,32 + 128(%rdi) - movdqu %xmm15,48 + 128(%rdi) - - movdqa 0+80(%rbp),%xmm12 - subq $192,%rbx - leaq 192(%rsi),%rsi - leaq 192(%rdi),%rdi - - -L$open_sse_tail_64_dec_loop: - cmpq $16,%rbx - jb L$open_sse_tail_16_init - subq $16,%rbx - movdqu (%rsi),%xmm3 - pxor %xmm3,%xmm0 - movdqu %xmm0,(%rdi) - leaq 16(%rsi),%rsi - leaq 16(%rdi),%rdi - movdqa %xmm4,%xmm0 - movdqa %xmm8,%xmm4 - movdqa %xmm12,%xmm8 - jmp L$open_sse_tail_64_dec_loop -L$open_sse_tail_16_init: - movdqa %xmm0,%xmm1 - - -L$open_sse_tail_16: - testq %rbx,%rbx - jz L$open_sse_finalize - - - - pxor %xmm3,%xmm3 - leaq -1(%rsi,%rbx,1),%rsi - movq %rbx,%r8 -L$open_sse_tail_16_compose: - pslldq $1,%xmm3 - pinsrb $0,(%rsi),%xmm3 - subq $1,%rsi - subq $1,%r8 - jnz L$open_sse_tail_16_compose - -.byte 102,73,15,126,221 - pextrq $1,%xmm3,%r14 - - pxor %xmm1,%xmm3 - - -L$open_sse_tail_16_extract: - pextrb $0,%xmm3,(%rdi) - psrldq $1,%xmm3 - addq $1,%rdi - subq $1,%rbx - jne L$open_sse_tail_16_extract - - addq %r13,%r10 - adcq %r14,%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - -L$open_sse_finalize: - addq 0+0+32(%rbp),%r10 - adcq 8+0+32(%rbp),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - - movq %r10,%r13 - movq %r11,%r14 - movq %r12,%r15 - subq $-5,%r10 - sbbq $-1,%r11 - sbbq $3,%r12 - cmovcq %r13,%r10 - cmovcq %r14,%r11 - cmovcq %r15,%r12 - - addq 0+0+16(%rbp),%r10 - adcq 8+0+16(%rbp),%r11 - - - addq $288 + 0 + 32,%rsp - - - popq %r9 - - movq %r10,(%r9) - movq %r11,8(%r9) - popq %r15 - - popq %r14 - - popq %r13 - - popq %r12 - - popq %rbx - - popq %rbp - - .byte 0xf3,0xc3 - -L$open_sse_128: - - movdqu L$chacha20_consts(%rip),%xmm0 - movdqa %xmm0,%xmm1 - movdqa %xmm0,%xmm2 - movdqu 0(%r9),%xmm4 - movdqa %xmm4,%xmm5 - movdqa %xmm4,%xmm6 - movdqu 16(%r9),%xmm8 - movdqa %xmm8,%xmm9 - movdqa %xmm8,%xmm10 - movdqu 32(%r9),%xmm12 - movdqa %xmm12,%xmm13 - paddd L$sse_inc(%rip),%xmm13 - movdqa %xmm13,%xmm14 - paddd L$sse_inc(%rip),%xmm14 - movdqa %xmm4,%xmm7 - movdqa %xmm8,%xmm11 - movdqa %xmm13,%xmm15 - movq $10,%r10 - -L$open_sse_128_rounds: - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb L$rol16(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm4 - pxor %xmm3,%xmm4 - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb L$rol8(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm4 - pxor %xmm3,%xmm4 -.byte 102,15,58,15,228,4 -.byte 102,69,15,58,15,192,8 -.byte 102,69,15,58,15,228,12 - paddd %xmm5,%xmm1 - pxor %xmm1,%xmm13 - pshufb L$rol16(%rip),%xmm13 - paddd %xmm13,%xmm9 - pxor %xmm9,%xmm5 - movdqa %xmm5,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm5 - pxor %xmm3,%xmm5 - paddd %xmm5,%xmm1 - pxor %xmm1,%xmm13 - pshufb L$rol8(%rip),%xmm13 - paddd %xmm13,%xmm9 - pxor %xmm9,%xmm5 - movdqa %xmm5,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm5 - pxor %xmm3,%xmm5 -.byte 102,15,58,15,237,4 -.byte 102,69,15,58,15,201,8 -.byte 102,69,15,58,15,237,12 - paddd %xmm6,%xmm2 - pxor %xmm2,%xmm14 - pshufb L$rol16(%rip),%xmm14 - paddd %xmm14,%xmm10 - pxor %xmm10,%xmm6 - movdqa %xmm6,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm6 - pxor %xmm3,%xmm6 - paddd %xmm6,%xmm2 - pxor %xmm2,%xmm14 - pshufb L$rol8(%rip),%xmm14 - paddd %xmm14,%xmm10 - pxor %xmm10,%xmm6 - movdqa %xmm6,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm6 - pxor %xmm3,%xmm6 -.byte 102,15,58,15,246,4 -.byte 102,69,15,58,15,210,8 -.byte 102,69,15,58,15,246,12 - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb L$rol16(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm4 - pxor %xmm3,%xmm4 - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb L$rol8(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm4 - pxor %xmm3,%xmm4 -.byte 102,15,58,15,228,12 -.byte 102,69,15,58,15,192,8 -.byte 102,69,15,58,15,228,4 - paddd %xmm5,%xmm1 - pxor %xmm1,%xmm13 - pshufb L$rol16(%rip),%xmm13 - paddd %xmm13,%xmm9 - pxor %xmm9,%xmm5 - movdqa %xmm5,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm5 - pxor %xmm3,%xmm5 - paddd %xmm5,%xmm1 - pxor %xmm1,%xmm13 - pshufb L$rol8(%rip),%xmm13 - paddd %xmm13,%xmm9 - pxor %xmm9,%xmm5 - movdqa %xmm5,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm5 - pxor %xmm3,%xmm5 -.byte 102,15,58,15,237,12 -.byte 102,69,15,58,15,201,8 -.byte 102,69,15,58,15,237,4 - paddd %xmm6,%xmm2 - pxor %xmm2,%xmm14 - pshufb L$rol16(%rip),%xmm14 - paddd %xmm14,%xmm10 - pxor %xmm10,%xmm6 - movdqa %xmm6,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm6 - pxor %xmm3,%xmm6 - paddd %xmm6,%xmm2 - pxor %xmm2,%xmm14 - pshufb L$rol8(%rip),%xmm14 - paddd %xmm14,%xmm10 - pxor %xmm10,%xmm6 - movdqa %xmm6,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm6 - pxor %xmm3,%xmm6 -.byte 102,15,58,15,246,12 -.byte 102,69,15,58,15,210,8 -.byte 102,69,15,58,15,246,4 - - decq %r10 - jnz L$open_sse_128_rounds - paddd L$chacha20_consts(%rip),%xmm0 - paddd L$chacha20_consts(%rip),%xmm1 - paddd L$chacha20_consts(%rip),%xmm2 - paddd %xmm7,%xmm4 - paddd %xmm7,%xmm5 - paddd %xmm7,%xmm6 - paddd %xmm11,%xmm9 - paddd %xmm11,%xmm10 - paddd %xmm15,%xmm13 - paddd L$sse_inc(%rip),%xmm15 - paddd %xmm15,%xmm14 - - pand L$clamp(%rip),%xmm0 - movdqa %xmm0,0+0(%rbp) - movdqa %xmm4,0+16(%rbp) - - movq %r8,%r8 - call poly_hash_ad_internal -L$open_sse_128_xor_hash: - cmpq $16,%rbx - jb L$open_sse_tail_16 - subq $16,%rbx - addq 0+0(%rsi),%r10 - adcq 8+0(%rsi),%r11 - adcq $1,%r12 - - - movdqu 0(%rsi),%xmm3 - pxor %xmm3,%xmm1 - movdqu %xmm1,0(%rdi) - leaq 16(%rsi),%rsi - leaq 16(%rdi),%rdi - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - - movdqa %xmm5,%xmm1 - movdqa %xmm9,%xmm5 - movdqa %xmm13,%xmm9 - movdqa %xmm2,%xmm13 - movdqa %xmm6,%xmm2 - movdqa %xmm10,%xmm6 - movdqa %xmm14,%xmm10 - jmp L$open_sse_128_xor_hash - - - - - - - - -.globl _GFp_chacha20_poly1305_seal -.private_extern _GFp_chacha20_poly1305_seal - -.p2align 6 -_GFp_chacha20_poly1305_seal: - - pushq %rbp - - pushq %rbx - - pushq %r12 - - pushq %r13 - - pushq %r14 - - pushq %r15 - - - - pushq %r9 - - subq $288 + 0 + 32,%rsp - - leaq 32(%rsp),%rbp - andq $-32,%rbp - - movq 56(%r9),%rbx - addq %rdx,%rbx - movq %r8,0+0+32(%rbp) - movq %rbx,8+0+32(%rbp) - movq %rdx,%rbx - - movl _GFp_ia32cap_P+8(%rip),%eax - andl $288,%eax - xorl $288,%eax - jz chacha20_poly1305_seal_avx2 - - cmpq $128,%rbx - jbe L$seal_sse_128 - - movdqa L$chacha20_consts(%rip),%xmm0 - movdqu 0(%r9),%xmm4 - movdqu 16(%r9),%xmm8 - movdqu 32(%r9),%xmm12 - - movdqa %xmm0,%xmm1 - movdqa %xmm0,%xmm2 - movdqa %xmm0,%xmm3 - movdqa %xmm4,%xmm5 - movdqa %xmm4,%xmm6 - movdqa %xmm4,%xmm7 - movdqa %xmm8,%xmm9 - movdqa %xmm8,%xmm10 - movdqa %xmm8,%xmm11 - movdqa %xmm12,%xmm15 - paddd L$sse_inc(%rip),%xmm12 - movdqa %xmm12,%xmm14 - paddd L$sse_inc(%rip),%xmm12 - movdqa %xmm12,%xmm13 - paddd L$sse_inc(%rip),%xmm12 - - movdqa %xmm4,0+48(%rbp) - movdqa %xmm8,0+64(%rbp) - movdqa %xmm12,0+96(%rbp) - movdqa %xmm13,0+112(%rbp) - movdqa %xmm14,0+128(%rbp) - movdqa %xmm15,0+144(%rbp) - movq $10,%r10 -L$seal_sse_init_rounds: - movdqa %xmm8,0+80(%rbp) - movdqa L$rol16(%rip),%xmm8 - paddd %xmm7,%xmm3 - paddd %xmm6,%xmm2 - paddd %xmm5,%xmm1 - paddd %xmm4,%xmm0 - pxor %xmm3,%xmm15 - pxor %xmm2,%xmm14 - pxor %xmm1,%xmm13 - pxor %xmm0,%xmm12 -.byte 102,69,15,56,0,248 -.byte 102,69,15,56,0,240 -.byte 102,69,15,56,0,232 -.byte 102,69,15,56,0,224 - movdqa 0+80(%rbp),%xmm8 - paddd %xmm15,%xmm11 - paddd %xmm14,%xmm10 - paddd %xmm13,%xmm9 - paddd %xmm12,%xmm8 - pxor %xmm11,%xmm7 - pxor %xmm10,%xmm6 - pxor %xmm9,%xmm5 - pxor %xmm8,%xmm4 - movdqa %xmm8,0+80(%rbp) - movdqa %xmm7,%xmm8 - psrld $20,%xmm8 - pslld $32-20,%xmm7 - pxor %xmm8,%xmm7 - movdqa %xmm6,%xmm8 - psrld $20,%xmm8 - pslld $32-20,%xmm6 - pxor %xmm8,%xmm6 - movdqa %xmm5,%xmm8 - psrld $20,%xmm8 - pslld $32-20,%xmm5 - pxor %xmm8,%xmm5 - movdqa %xmm4,%xmm8 - psrld $20,%xmm8 - pslld $32-20,%xmm4 - pxor %xmm8,%xmm4 - movdqa L$rol8(%rip),%xmm8 - paddd %xmm7,%xmm3 - paddd %xmm6,%xmm2 - paddd %xmm5,%xmm1 - paddd %xmm4,%xmm0 - pxor %xmm3,%xmm15 - pxor %xmm2,%xmm14 - pxor %xmm1,%xmm13 - pxor %xmm0,%xmm12 -.byte 102,69,15,56,0,248 -.byte 102,69,15,56,0,240 -.byte 102,69,15,56,0,232 -.byte 102,69,15,56,0,224 - movdqa 0+80(%rbp),%xmm8 - paddd %xmm15,%xmm11 - paddd %xmm14,%xmm10 - paddd %xmm13,%xmm9 - paddd %xmm12,%xmm8 - pxor %xmm11,%xmm7 - pxor %xmm10,%xmm6 - pxor %xmm9,%xmm5 - pxor %xmm8,%xmm4 - movdqa %xmm8,0+80(%rbp) - movdqa %xmm7,%xmm8 - psrld $25,%xmm8 - pslld $32-25,%xmm7 - pxor %xmm8,%xmm7 - movdqa %xmm6,%xmm8 - psrld $25,%xmm8 - pslld $32-25,%xmm6 - pxor %xmm8,%xmm6 - movdqa %xmm5,%xmm8 - psrld $25,%xmm8 - pslld $32-25,%xmm5 - pxor %xmm8,%xmm5 - movdqa %xmm4,%xmm8 - psrld $25,%xmm8 - pslld $32-25,%xmm4 - pxor %xmm8,%xmm4 - movdqa 0+80(%rbp),%xmm8 -.byte 102,15,58,15,255,4 -.byte 102,69,15,58,15,219,8 -.byte 102,69,15,58,15,255,12 -.byte 102,15,58,15,246,4 -.byte 102,69,15,58,15,210,8 -.byte 102,69,15,58,15,246,12 -.byte 102,15,58,15,237,4 -.byte 102,69,15,58,15,201,8 -.byte 102,69,15,58,15,237,12 -.byte 102,15,58,15,228,4 -.byte 102,69,15,58,15,192,8 -.byte 102,69,15,58,15,228,12 - movdqa %xmm8,0+80(%rbp) - movdqa L$rol16(%rip),%xmm8 - paddd %xmm7,%xmm3 - paddd %xmm6,%xmm2 - paddd %xmm5,%xmm1 - paddd %xmm4,%xmm0 - pxor %xmm3,%xmm15 - pxor %xmm2,%xmm14 - pxor %xmm1,%xmm13 - pxor %xmm0,%xmm12 -.byte 102,69,15,56,0,248 -.byte 102,69,15,56,0,240 -.byte 102,69,15,56,0,232 -.byte 102,69,15,56,0,224 - movdqa 0+80(%rbp),%xmm8 - paddd %xmm15,%xmm11 - paddd %xmm14,%xmm10 - paddd %xmm13,%xmm9 - paddd %xmm12,%xmm8 - pxor %xmm11,%xmm7 - pxor %xmm10,%xmm6 - pxor %xmm9,%xmm5 - pxor %xmm8,%xmm4 - movdqa %xmm8,0+80(%rbp) - movdqa %xmm7,%xmm8 - psrld $20,%xmm8 - pslld $32-20,%xmm7 - pxor %xmm8,%xmm7 - movdqa %xmm6,%xmm8 - psrld $20,%xmm8 - pslld $32-20,%xmm6 - pxor %xmm8,%xmm6 - movdqa %xmm5,%xmm8 - psrld $20,%xmm8 - pslld $32-20,%xmm5 - pxor %xmm8,%xmm5 - movdqa %xmm4,%xmm8 - psrld $20,%xmm8 - pslld $32-20,%xmm4 - pxor %xmm8,%xmm4 - movdqa L$rol8(%rip),%xmm8 - paddd %xmm7,%xmm3 - paddd %xmm6,%xmm2 - paddd %xmm5,%xmm1 - paddd %xmm4,%xmm0 - pxor %xmm3,%xmm15 - pxor %xmm2,%xmm14 - pxor %xmm1,%xmm13 - pxor %xmm0,%xmm12 -.byte 102,69,15,56,0,248 -.byte 102,69,15,56,0,240 -.byte 102,69,15,56,0,232 -.byte 102,69,15,56,0,224 - movdqa 0+80(%rbp),%xmm8 - paddd %xmm15,%xmm11 - paddd %xmm14,%xmm10 - paddd %xmm13,%xmm9 - paddd %xmm12,%xmm8 - pxor %xmm11,%xmm7 - pxor %xmm10,%xmm6 - pxor %xmm9,%xmm5 - pxor %xmm8,%xmm4 - movdqa %xmm8,0+80(%rbp) - movdqa %xmm7,%xmm8 - psrld $25,%xmm8 - pslld $32-25,%xmm7 - pxor %xmm8,%xmm7 - movdqa %xmm6,%xmm8 - psrld $25,%xmm8 - pslld $32-25,%xmm6 - pxor %xmm8,%xmm6 - movdqa %xmm5,%xmm8 - psrld $25,%xmm8 - pslld $32-25,%xmm5 - pxor %xmm8,%xmm5 - movdqa %xmm4,%xmm8 - psrld $25,%xmm8 - pslld $32-25,%xmm4 - pxor %xmm8,%xmm4 - movdqa 0+80(%rbp),%xmm8 -.byte 102,15,58,15,255,12 -.byte 102,69,15,58,15,219,8 -.byte 102,69,15,58,15,255,4 -.byte 102,15,58,15,246,12 -.byte 102,69,15,58,15,210,8 -.byte 102,69,15,58,15,246,4 -.byte 102,15,58,15,237,12 -.byte 102,69,15,58,15,201,8 -.byte 102,69,15,58,15,237,4 -.byte 102,15,58,15,228,12 -.byte 102,69,15,58,15,192,8 -.byte 102,69,15,58,15,228,4 - - decq %r10 - jnz L$seal_sse_init_rounds - paddd L$chacha20_consts(%rip),%xmm3 - paddd 0+48(%rbp),%xmm7 - paddd 0+64(%rbp),%xmm11 - paddd 0+144(%rbp),%xmm15 - paddd L$chacha20_consts(%rip),%xmm2 - paddd 0+48(%rbp),%xmm6 - paddd 0+64(%rbp),%xmm10 - paddd 0+128(%rbp),%xmm14 - paddd L$chacha20_consts(%rip),%xmm1 - paddd 0+48(%rbp),%xmm5 - paddd 0+64(%rbp),%xmm9 - paddd 0+112(%rbp),%xmm13 - paddd L$chacha20_consts(%rip),%xmm0 - paddd 0+48(%rbp),%xmm4 - paddd 0+64(%rbp),%xmm8 - paddd 0+96(%rbp),%xmm12 - - - pand L$clamp(%rip),%xmm3 - movdqa %xmm3,0+0(%rbp) - movdqa %xmm7,0+16(%rbp) - - movq %r8,%r8 - call poly_hash_ad_internal - movdqu 0 + 0(%rsi),%xmm3 - movdqu 16 + 0(%rsi),%xmm7 - movdqu 32 + 0(%rsi),%xmm11 - movdqu 48 + 0(%rsi),%xmm15 - pxor %xmm3,%xmm2 - pxor %xmm7,%xmm6 - pxor %xmm11,%xmm10 - pxor %xmm14,%xmm15 - movdqu %xmm2,0 + 0(%rdi) - movdqu %xmm6,16 + 0(%rdi) - movdqu %xmm10,32 + 0(%rdi) - movdqu %xmm15,48 + 0(%rdi) - movdqu 0 + 64(%rsi),%xmm3 - movdqu 16 + 64(%rsi),%xmm7 - movdqu 32 + 64(%rsi),%xmm11 - movdqu 48 + 64(%rsi),%xmm15 - pxor %xmm3,%xmm1 - pxor %xmm7,%xmm5 - pxor %xmm11,%xmm9 - pxor %xmm13,%xmm15 - movdqu %xmm1,0 + 64(%rdi) - movdqu %xmm5,16 + 64(%rdi) - movdqu %xmm9,32 + 64(%rdi) - movdqu %xmm15,48 + 64(%rdi) - - cmpq $192,%rbx - ja L$seal_sse_main_init - movq $128,%rcx - subq $128,%rbx - leaq 128(%rsi),%rsi - jmp L$seal_sse_128_tail_hash -L$seal_sse_main_init: - movdqu 0 + 128(%rsi),%xmm3 - movdqu 16 + 128(%rsi),%xmm7 - movdqu 32 + 128(%rsi),%xmm11 - movdqu 48 + 128(%rsi),%xmm15 - pxor %xmm3,%xmm0 - pxor %xmm7,%xmm4 - pxor %xmm11,%xmm8 - pxor %xmm12,%xmm15 - movdqu %xmm0,0 + 128(%rdi) - movdqu %xmm4,16 + 128(%rdi) - movdqu %xmm8,32 + 128(%rdi) - movdqu %xmm15,48 + 128(%rdi) - - movq $192,%rcx - subq $192,%rbx - leaq 192(%rsi),%rsi - movq $2,%rcx - movq $8,%r8 - cmpq $64,%rbx - jbe L$seal_sse_tail_64 - cmpq $128,%rbx - jbe L$seal_sse_tail_128 - cmpq $192,%rbx - jbe L$seal_sse_tail_192 - -L$seal_sse_main_loop: - movdqa L$chacha20_consts(%rip),%xmm0 - movdqa 0+48(%rbp),%xmm4 - movdqa 0+64(%rbp),%xmm8 - movdqa %xmm0,%xmm1 - movdqa %xmm4,%xmm5 - movdqa %xmm8,%xmm9 - movdqa %xmm0,%xmm2 - movdqa %xmm4,%xmm6 - movdqa %xmm8,%xmm10 - movdqa %xmm0,%xmm3 - movdqa %xmm4,%xmm7 - movdqa %xmm8,%xmm11 - movdqa 0+96(%rbp),%xmm15 - paddd L$sse_inc(%rip),%xmm15 - movdqa %xmm15,%xmm14 - paddd L$sse_inc(%rip),%xmm14 - movdqa %xmm14,%xmm13 - paddd L$sse_inc(%rip),%xmm13 - movdqa %xmm13,%xmm12 - paddd L$sse_inc(%rip),%xmm12 - movdqa %xmm12,0+96(%rbp) - movdqa %xmm13,0+112(%rbp) - movdqa %xmm14,0+128(%rbp) - movdqa %xmm15,0+144(%rbp) - -.p2align 5 -L$seal_sse_main_rounds: - movdqa %xmm8,0+80(%rbp) - movdqa L$rol16(%rip),%xmm8 - paddd %xmm7,%xmm3 - paddd %xmm6,%xmm2 - paddd %xmm5,%xmm1 - paddd %xmm4,%xmm0 - pxor %xmm3,%xmm15 - pxor %xmm2,%xmm14 - pxor %xmm1,%xmm13 - pxor %xmm0,%xmm12 -.byte 102,69,15,56,0,248 -.byte 102,69,15,56,0,240 -.byte 102,69,15,56,0,232 -.byte 102,69,15,56,0,224 - movdqa 0+80(%rbp),%xmm8 - paddd %xmm15,%xmm11 - paddd %xmm14,%xmm10 - paddd %xmm13,%xmm9 - paddd %xmm12,%xmm8 - pxor %xmm11,%xmm7 - addq 0+0(%rdi),%r10 - adcq 8+0(%rdi),%r11 - adcq $1,%r12 - pxor %xmm10,%xmm6 - pxor %xmm9,%xmm5 - pxor %xmm8,%xmm4 - movdqa %xmm8,0+80(%rbp) - movdqa %xmm7,%xmm8 - psrld $20,%xmm8 - pslld $32-20,%xmm7 - pxor %xmm8,%xmm7 - movdqa %xmm6,%xmm8 - psrld $20,%xmm8 - pslld $32-20,%xmm6 - pxor %xmm8,%xmm6 - movdqa %xmm5,%xmm8 - psrld $20,%xmm8 - pslld $32-20,%xmm5 - pxor %xmm8,%xmm5 - movdqa %xmm4,%xmm8 - psrld $20,%xmm8 - pslld $32-20,%xmm4 - pxor %xmm8,%xmm4 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movdqa L$rol8(%rip),%xmm8 - paddd %xmm7,%xmm3 - paddd %xmm6,%xmm2 - paddd %xmm5,%xmm1 - paddd %xmm4,%xmm0 - pxor %xmm3,%xmm15 - pxor %xmm2,%xmm14 - pxor %xmm1,%xmm13 - pxor %xmm0,%xmm12 -.byte 102,69,15,56,0,248 -.byte 102,69,15,56,0,240 -.byte 102,69,15,56,0,232 -.byte 102,69,15,56,0,224 - movdqa 0+80(%rbp),%xmm8 - paddd %xmm15,%xmm11 - paddd %xmm14,%xmm10 - paddd %xmm13,%xmm9 - paddd %xmm12,%xmm8 - pxor %xmm11,%xmm7 - pxor %xmm10,%xmm6 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - pxor %xmm9,%xmm5 - pxor %xmm8,%xmm4 - movdqa %xmm8,0+80(%rbp) - movdqa %xmm7,%xmm8 - psrld $25,%xmm8 - pslld $32-25,%xmm7 - pxor %xmm8,%xmm7 - movdqa %xmm6,%xmm8 - psrld $25,%xmm8 - pslld $32-25,%xmm6 - pxor %xmm8,%xmm6 - movdqa %xmm5,%xmm8 - psrld $25,%xmm8 - pslld $32-25,%xmm5 - pxor %xmm8,%xmm5 - movdqa %xmm4,%xmm8 - psrld $25,%xmm8 - pslld $32-25,%xmm4 - pxor %xmm8,%xmm4 - movdqa 0+80(%rbp),%xmm8 - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 -.byte 102,15,58,15,255,4 -.byte 102,69,15,58,15,219,8 -.byte 102,69,15,58,15,255,12 -.byte 102,15,58,15,246,4 -.byte 102,69,15,58,15,210,8 -.byte 102,69,15,58,15,246,12 -.byte 102,15,58,15,237,4 -.byte 102,69,15,58,15,201,8 -.byte 102,69,15,58,15,237,12 -.byte 102,15,58,15,228,4 -.byte 102,69,15,58,15,192,8 -.byte 102,69,15,58,15,228,12 - movdqa %xmm8,0+80(%rbp) - movdqa L$rol16(%rip),%xmm8 - paddd %xmm7,%xmm3 - paddd %xmm6,%xmm2 - paddd %xmm5,%xmm1 - paddd %xmm4,%xmm0 - pxor %xmm3,%xmm15 - pxor %xmm2,%xmm14 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - pxor %xmm1,%xmm13 - pxor %xmm0,%xmm12 -.byte 102,69,15,56,0,248 -.byte 102,69,15,56,0,240 -.byte 102,69,15,56,0,232 -.byte 102,69,15,56,0,224 - movdqa 0+80(%rbp),%xmm8 - paddd %xmm15,%xmm11 - paddd %xmm14,%xmm10 - paddd %xmm13,%xmm9 - paddd %xmm12,%xmm8 - pxor %xmm11,%xmm7 - pxor %xmm10,%xmm6 - pxor %xmm9,%xmm5 - pxor %xmm8,%xmm4 - movdqa %xmm8,0+80(%rbp) - movdqa %xmm7,%xmm8 - psrld $20,%xmm8 - pslld $32-20,%xmm7 - pxor %xmm8,%xmm7 - movdqa %xmm6,%xmm8 - psrld $20,%xmm8 - pslld $32-20,%xmm6 - pxor %xmm8,%xmm6 - movdqa %xmm5,%xmm8 - psrld $20,%xmm8 - pslld $32-20,%xmm5 - pxor %xmm8,%xmm5 - movdqa %xmm4,%xmm8 - psrld $20,%xmm8 - pslld $32-20,%xmm4 - pxor %xmm8,%xmm4 - movdqa L$rol8(%rip),%xmm8 - paddd %xmm7,%xmm3 - paddd %xmm6,%xmm2 - paddd %xmm5,%xmm1 - paddd %xmm4,%xmm0 - pxor %xmm3,%xmm15 - pxor %xmm2,%xmm14 - pxor %xmm1,%xmm13 - pxor %xmm0,%xmm12 -.byte 102,69,15,56,0,248 -.byte 102,69,15,56,0,240 -.byte 102,69,15,56,0,232 -.byte 102,69,15,56,0,224 - movdqa 0+80(%rbp),%xmm8 - paddd %xmm15,%xmm11 - paddd %xmm14,%xmm10 - paddd %xmm13,%xmm9 - paddd %xmm12,%xmm8 - pxor %xmm11,%xmm7 - pxor %xmm10,%xmm6 - pxor %xmm9,%xmm5 - pxor %xmm8,%xmm4 - movdqa %xmm8,0+80(%rbp) - movdqa %xmm7,%xmm8 - psrld $25,%xmm8 - pslld $32-25,%xmm7 - pxor %xmm8,%xmm7 - movdqa %xmm6,%xmm8 - psrld $25,%xmm8 - pslld $32-25,%xmm6 - pxor %xmm8,%xmm6 - movdqa %xmm5,%xmm8 - psrld $25,%xmm8 - pslld $32-25,%xmm5 - pxor %xmm8,%xmm5 - movdqa %xmm4,%xmm8 - psrld $25,%xmm8 - pslld $32-25,%xmm4 - pxor %xmm8,%xmm4 - movdqa 0+80(%rbp),%xmm8 -.byte 102,15,58,15,255,12 -.byte 102,69,15,58,15,219,8 -.byte 102,69,15,58,15,255,4 -.byte 102,15,58,15,246,12 -.byte 102,69,15,58,15,210,8 -.byte 102,69,15,58,15,246,4 -.byte 102,15,58,15,237,12 -.byte 102,69,15,58,15,201,8 -.byte 102,69,15,58,15,237,4 -.byte 102,15,58,15,228,12 -.byte 102,69,15,58,15,192,8 -.byte 102,69,15,58,15,228,4 - - leaq 16(%rdi),%rdi - decq %r8 - jge L$seal_sse_main_rounds - addq 0+0(%rdi),%r10 - adcq 8+0(%rdi),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - leaq 16(%rdi),%rdi - decq %rcx - jg L$seal_sse_main_rounds - paddd L$chacha20_consts(%rip),%xmm3 - paddd 0+48(%rbp),%xmm7 - paddd 0+64(%rbp),%xmm11 - paddd 0+144(%rbp),%xmm15 - paddd L$chacha20_consts(%rip),%xmm2 - paddd 0+48(%rbp),%xmm6 - paddd 0+64(%rbp),%xmm10 - paddd 0+128(%rbp),%xmm14 - paddd L$chacha20_consts(%rip),%xmm1 - paddd 0+48(%rbp),%xmm5 - paddd 0+64(%rbp),%xmm9 - paddd 0+112(%rbp),%xmm13 - paddd L$chacha20_consts(%rip),%xmm0 - paddd 0+48(%rbp),%xmm4 - paddd 0+64(%rbp),%xmm8 - paddd 0+96(%rbp),%xmm12 - - movdqa %xmm14,0+80(%rbp) - movdqa %xmm14,0+80(%rbp) - movdqu 0 + 0(%rsi),%xmm14 - pxor %xmm3,%xmm14 - movdqu %xmm14,0 + 0(%rdi) - movdqu 16 + 0(%rsi),%xmm14 - pxor %xmm7,%xmm14 - movdqu %xmm14,16 + 0(%rdi) - movdqu 32 + 0(%rsi),%xmm14 - pxor %xmm11,%xmm14 - movdqu %xmm14,32 + 0(%rdi) - movdqu 48 + 0(%rsi),%xmm14 - pxor %xmm15,%xmm14 - movdqu %xmm14,48 + 0(%rdi) - - movdqa 0+80(%rbp),%xmm14 - movdqu 0 + 64(%rsi),%xmm3 - movdqu 16 + 64(%rsi),%xmm7 - movdqu 32 + 64(%rsi),%xmm11 - movdqu 48 + 64(%rsi),%xmm15 - pxor %xmm3,%xmm2 - pxor %xmm7,%xmm6 - pxor %xmm11,%xmm10 - pxor %xmm14,%xmm15 - movdqu %xmm2,0 + 64(%rdi) - movdqu %xmm6,16 + 64(%rdi) - movdqu %xmm10,32 + 64(%rdi) - movdqu %xmm15,48 + 64(%rdi) - movdqu 0 + 128(%rsi),%xmm3 - movdqu 16 + 128(%rsi),%xmm7 - movdqu 32 + 128(%rsi),%xmm11 - movdqu 48 + 128(%rsi),%xmm15 - pxor %xmm3,%xmm1 - pxor %xmm7,%xmm5 - pxor %xmm11,%xmm9 - pxor %xmm13,%xmm15 - movdqu %xmm1,0 + 128(%rdi) - movdqu %xmm5,16 + 128(%rdi) - movdqu %xmm9,32 + 128(%rdi) - movdqu %xmm15,48 + 128(%rdi) - - cmpq $256,%rbx - ja L$seal_sse_main_loop_xor - - movq $192,%rcx - subq $192,%rbx - leaq 192(%rsi),%rsi - jmp L$seal_sse_128_tail_hash -L$seal_sse_main_loop_xor: - movdqu 0 + 192(%rsi),%xmm3 - movdqu 16 + 192(%rsi),%xmm7 - movdqu 32 + 192(%rsi),%xmm11 - movdqu 48 + 192(%rsi),%xmm15 - pxor %xmm3,%xmm0 - pxor %xmm7,%xmm4 - pxor %xmm11,%xmm8 - pxor %xmm12,%xmm15 - movdqu %xmm0,0 + 192(%rdi) - movdqu %xmm4,16 + 192(%rdi) - movdqu %xmm8,32 + 192(%rdi) - movdqu %xmm15,48 + 192(%rdi) - - leaq 256(%rsi),%rsi - subq $256,%rbx - movq $6,%rcx - movq $4,%r8 - cmpq $192,%rbx - jg L$seal_sse_main_loop - movq %rbx,%rcx - testq %rbx,%rbx - je L$seal_sse_128_tail_hash - movq $6,%rcx - cmpq $128,%rbx - ja L$seal_sse_tail_192 - cmpq $64,%rbx - ja L$seal_sse_tail_128 - -L$seal_sse_tail_64: - movdqa L$chacha20_consts(%rip),%xmm0 - movdqa 0+48(%rbp),%xmm4 - movdqa 0+64(%rbp),%xmm8 - movdqa 0+96(%rbp),%xmm12 - paddd L$sse_inc(%rip),%xmm12 - movdqa %xmm12,0+96(%rbp) - -L$seal_sse_tail_64_rounds_and_x2hash: - addq 0+0(%rdi),%r10 - adcq 8+0(%rdi),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - leaq 16(%rdi),%rdi -L$seal_sse_tail_64_rounds_and_x1hash: - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb L$rol16(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm4 - pxor %xmm3,%xmm4 - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb L$rol8(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm4 - pxor %xmm3,%xmm4 -.byte 102,15,58,15,228,4 -.byte 102,69,15,58,15,192,8 -.byte 102,69,15,58,15,228,12 - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb L$rol16(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm4 - pxor %xmm3,%xmm4 - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb L$rol8(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm4 - pxor %xmm3,%xmm4 -.byte 102,15,58,15,228,12 -.byte 102,69,15,58,15,192,8 -.byte 102,69,15,58,15,228,4 - addq 0+0(%rdi),%r10 - adcq 8+0(%rdi),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - leaq 16(%rdi),%rdi - decq %rcx - jg L$seal_sse_tail_64_rounds_and_x2hash - decq %r8 - jge L$seal_sse_tail_64_rounds_and_x1hash - paddd L$chacha20_consts(%rip),%xmm0 - paddd 0+48(%rbp),%xmm4 - paddd 0+64(%rbp),%xmm8 - paddd 0+96(%rbp),%xmm12 - - jmp L$seal_sse_128_tail_xor - -L$seal_sse_tail_128: - movdqa L$chacha20_consts(%rip),%xmm0 - movdqa 0+48(%rbp),%xmm4 - movdqa 0+64(%rbp),%xmm8 - movdqa %xmm0,%xmm1 - movdqa %xmm4,%xmm5 - movdqa %xmm8,%xmm9 - movdqa 0+96(%rbp),%xmm13 - paddd L$sse_inc(%rip),%xmm13 - movdqa %xmm13,%xmm12 - paddd L$sse_inc(%rip),%xmm12 - movdqa %xmm12,0+96(%rbp) - movdqa %xmm13,0+112(%rbp) - -L$seal_sse_tail_128_rounds_and_x2hash: - addq 0+0(%rdi),%r10 - adcq 8+0(%rdi),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - leaq 16(%rdi),%rdi -L$seal_sse_tail_128_rounds_and_x1hash: - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb L$rol16(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm4 - pxor %xmm3,%xmm4 - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb L$rol8(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm4 - pxor %xmm3,%xmm4 -.byte 102,15,58,15,228,4 -.byte 102,69,15,58,15,192,8 -.byte 102,69,15,58,15,228,12 - paddd %xmm5,%xmm1 - pxor %xmm1,%xmm13 - pshufb L$rol16(%rip),%xmm13 - paddd %xmm13,%xmm9 - pxor %xmm9,%xmm5 - movdqa %xmm5,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm5 - pxor %xmm3,%xmm5 - paddd %xmm5,%xmm1 - pxor %xmm1,%xmm13 - pshufb L$rol8(%rip),%xmm13 - paddd %xmm13,%xmm9 - pxor %xmm9,%xmm5 - movdqa %xmm5,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm5 - pxor %xmm3,%xmm5 -.byte 102,15,58,15,237,4 -.byte 102,69,15,58,15,201,8 -.byte 102,69,15,58,15,237,12 - addq 0+0(%rdi),%r10 - adcq 8+0(%rdi),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb L$rol16(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm4 - pxor %xmm3,%xmm4 - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb L$rol8(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm4 - pxor %xmm3,%xmm4 -.byte 102,15,58,15,228,12 -.byte 102,69,15,58,15,192,8 -.byte 102,69,15,58,15,228,4 - paddd %xmm5,%xmm1 - pxor %xmm1,%xmm13 - pshufb L$rol16(%rip),%xmm13 - paddd %xmm13,%xmm9 - pxor %xmm9,%xmm5 - movdqa %xmm5,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm5 - pxor %xmm3,%xmm5 - paddd %xmm5,%xmm1 - pxor %xmm1,%xmm13 - pshufb L$rol8(%rip),%xmm13 - paddd %xmm13,%xmm9 - pxor %xmm9,%xmm5 - movdqa %xmm5,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm5 - pxor %xmm3,%xmm5 -.byte 102,15,58,15,237,12 -.byte 102,69,15,58,15,201,8 -.byte 102,69,15,58,15,237,4 - - leaq 16(%rdi),%rdi - decq %rcx - jg L$seal_sse_tail_128_rounds_and_x2hash - decq %r8 - jge L$seal_sse_tail_128_rounds_and_x1hash - paddd L$chacha20_consts(%rip),%xmm1 - paddd 0+48(%rbp),%xmm5 - paddd 0+64(%rbp),%xmm9 - paddd 0+112(%rbp),%xmm13 - paddd L$chacha20_consts(%rip),%xmm0 - paddd 0+48(%rbp),%xmm4 - paddd 0+64(%rbp),%xmm8 - paddd 0+96(%rbp),%xmm12 - movdqu 0 + 0(%rsi),%xmm3 - movdqu 16 + 0(%rsi),%xmm7 - movdqu 32 + 0(%rsi),%xmm11 - movdqu 48 + 0(%rsi),%xmm15 - pxor %xmm3,%xmm1 - pxor %xmm7,%xmm5 - pxor %xmm11,%xmm9 - pxor %xmm13,%xmm15 - movdqu %xmm1,0 + 0(%rdi) - movdqu %xmm5,16 + 0(%rdi) - movdqu %xmm9,32 + 0(%rdi) - movdqu %xmm15,48 + 0(%rdi) - - movq $64,%rcx - subq $64,%rbx - leaq 64(%rsi),%rsi - jmp L$seal_sse_128_tail_hash - -L$seal_sse_tail_192: - movdqa L$chacha20_consts(%rip),%xmm0 - movdqa 0+48(%rbp),%xmm4 - movdqa 0+64(%rbp),%xmm8 - movdqa %xmm0,%xmm1 - movdqa %xmm4,%xmm5 - movdqa %xmm8,%xmm9 - movdqa %xmm0,%xmm2 - movdqa %xmm4,%xmm6 - movdqa %xmm8,%xmm10 - movdqa 0+96(%rbp),%xmm14 - paddd L$sse_inc(%rip),%xmm14 - movdqa %xmm14,%xmm13 - paddd L$sse_inc(%rip),%xmm13 - movdqa %xmm13,%xmm12 - paddd L$sse_inc(%rip),%xmm12 - movdqa %xmm12,0+96(%rbp) - movdqa %xmm13,0+112(%rbp) - movdqa %xmm14,0+128(%rbp) - -L$seal_sse_tail_192_rounds_and_x2hash: - addq 0+0(%rdi),%r10 - adcq 8+0(%rdi),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - leaq 16(%rdi),%rdi -L$seal_sse_tail_192_rounds_and_x1hash: - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb L$rol16(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm4 - pxor %xmm3,%xmm4 - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb L$rol8(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm4 - pxor %xmm3,%xmm4 -.byte 102,15,58,15,228,4 -.byte 102,69,15,58,15,192,8 -.byte 102,69,15,58,15,228,12 - paddd %xmm5,%xmm1 - pxor %xmm1,%xmm13 - pshufb L$rol16(%rip),%xmm13 - paddd %xmm13,%xmm9 - pxor %xmm9,%xmm5 - movdqa %xmm5,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm5 - pxor %xmm3,%xmm5 - paddd %xmm5,%xmm1 - pxor %xmm1,%xmm13 - pshufb L$rol8(%rip),%xmm13 - paddd %xmm13,%xmm9 - pxor %xmm9,%xmm5 - movdqa %xmm5,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm5 - pxor %xmm3,%xmm5 -.byte 102,15,58,15,237,4 -.byte 102,69,15,58,15,201,8 -.byte 102,69,15,58,15,237,12 - paddd %xmm6,%xmm2 - pxor %xmm2,%xmm14 - pshufb L$rol16(%rip),%xmm14 - paddd %xmm14,%xmm10 - pxor %xmm10,%xmm6 - movdqa %xmm6,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm6 - pxor %xmm3,%xmm6 - paddd %xmm6,%xmm2 - pxor %xmm2,%xmm14 - pshufb L$rol8(%rip),%xmm14 - paddd %xmm14,%xmm10 - pxor %xmm10,%xmm6 - movdqa %xmm6,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm6 - pxor %xmm3,%xmm6 -.byte 102,15,58,15,246,4 -.byte 102,69,15,58,15,210,8 -.byte 102,69,15,58,15,246,12 - addq 0+0(%rdi),%r10 - adcq 8+0(%rdi),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb L$rol16(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm4 - pxor %xmm3,%xmm4 - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb L$rol8(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm4 - pxor %xmm3,%xmm4 -.byte 102,15,58,15,228,12 -.byte 102,69,15,58,15,192,8 -.byte 102,69,15,58,15,228,4 - paddd %xmm5,%xmm1 - pxor %xmm1,%xmm13 - pshufb L$rol16(%rip),%xmm13 - paddd %xmm13,%xmm9 - pxor %xmm9,%xmm5 - movdqa %xmm5,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm5 - pxor %xmm3,%xmm5 - paddd %xmm5,%xmm1 - pxor %xmm1,%xmm13 - pshufb L$rol8(%rip),%xmm13 - paddd %xmm13,%xmm9 - pxor %xmm9,%xmm5 - movdqa %xmm5,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm5 - pxor %xmm3,%xmm5 -.byte 102,15,58,15,237,12 -.byte 102,69,15,58,15,201,8 -.byte 102,69,15,58,15,237,4 - paddd %xmm6,%xmm2 - pxor %xmm2,%xmm14 - pshufb L$rol16(%rip),%xmm14 - paddd %xmm14,%xmm10 - pxor %xmm10,%xmm6 - movdqa %xmm6,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm6 - pxor %xmm3,%xmm6 - paddd %xmm6,%xmm2 - pxor %xmm2,%xmm14 - pshufb L$rol8(%rip),%xmm14 - paddd %xmm14,%xmm10 - pxor %xmm10,%xmm6 - movdqa %xmm6,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm6 - pxor %xmm3,%xmm6 -.byte 102,15,58,15,246,12 -.byte 102,69,15,58,15,210,8 -.byte 102,69,15,58,15,246,4 - - leaq 16(%rdi),%rdi - decq %rcx - jg L$seal_sse_tail_192_rounds_and_x2hash - decq %r8 - jge L$seal_sse_tail_192_rounds_and_x1hash - paddd L$chacha20_consts(%rip),%xmm2 - paddd 0+48(%rbp),%xmm6 - paddd 0+64(%rbp),%xmm10 - paddd 0+128(%rbp),%xmm14 - paddd L$chacha20_consts(%rip),%xmm1 - paddd 0+48(%rbp),%xmm5 - paddd 0+64(%rbp),%xmm9 - paddd 0+112(%rbp),%xmm13 - paddd L$chacha20_consts(%rip),%xmm0 - paddd 0+48(%rbp),%xmm4 - paddd 0+64(%rbp),%xmm8 - paddd 0+96(%rbp),%xmm12 - movdqu 0 + 0(%rsi),%xmm3 - movdqu 16 + 0(%rsi),%xmm7 - movdqu 32 + 0(%rsi),%xmm11 - movdqu 48 + 0(%rsi),%xmm15 - pxor %xmm3,%xmm2 - pxor %xmm7,%xmm6 - pxor %xmm11,%xmm10 - pxor %xmm14,%xmm15 - movdqu %xmm2,0 + 0(%rdi) - movdqu %xmm6,16 + 0(%rdi) - movdqu %xmm10,32 + 0(%rdi) - movdqu %xmm15,48 + 0(%rdi) - movdqu 0 + 64(%rsi),%xmm3 - movdqu 16 + 64(%rsi),%xmm7 - movdqu 32 + 64(%rsi),%xmm11 - movdqu 48 + 64(%rsi),%xmm15 - pxor %xmm3,%xmm1 - pxor %xmm7,%xmm5 - pxor %xmm11,%xmm9 - pxor %xmm13,%xmm15 - movdqu %xmm1,0 + 64(%rdi) - movdqu %xmm5,16 + 64(%rdi) - movdqu %xmm9,32 + 64(%rdi) - movdqu %xmm15,48 + 64(%rdi) - - movq $128,%rcx - subq $128,%rbx - leaq 128(%rsi),%rsi - -L$seal_sse_128_tail_hash: - cmpq $16,%rcx - jb L$seal_sse_128_tail_xor - addq 0+0(%rdi),%r10 - adcq 8+0(%rdi),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - subq $16,%rcx - leaq 16(%rdi),%rdi - jmp L$seal_sse_128_tail_hash - -L$seal_sse_128_tail_xor: - cmpq $16,%rbx - jb L$seal_sse_tail_16 - subq $16,%rbx - - movdqu 0(%rsi),%xmm3 - pxor %xmm3,%xmm0 - movdqu %xmm0,0(%rdi) - - addq 0(%rdi),%r10 - adcq 8(%rdi),%r11 - adcq $1,%r12 - leaq 16(%rsi),%rsi - leaq 16(%rdi),%rdi - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - - movdqa %xmm4,%xmm0 - movdqa %xmm8,%xmm4 - movdqa %xmm12,%xmm8 - movdqa %xmm1,%xmm12 - movdqa %xmm5,%xmm1 - movdqa %xmm9,%xmm5 - movdqa %xmm13,%xmm9 - jmp L$seal_sse_128_tail_xor - -L$seal_sse_tail_16: - testq %rbx,%rbx - jz L$process_blocks_of_extra_in - - movq %rbx,%r8 - movq %rbx,%rcx - leaq -1(%rsi,%rbx,1),%rsi - pxor %xmm15,%xmm15 -L$seal_sse_tail_16_compose: - pslldq $1,%xmm15 - pinsrb $0,(%rsi),%xmm15 - leaq -1(%rsi),%rsi - decq %rcx - jne L$seal_sse_tail_16_compose - - - pxor %xmm0,%xmm15 - - - movq %rbx,%rcx - movdqu %xmm15,%xmm0 -L$seal_sse_tail_16_extract: - pextrb $0,%xmm0,(%rdi) - psrldq $1,%xmm0 - addq $1,%rdi - subq $1,%rcx - jnz L$seal_sse_tail_16_extract - - - - - - - - - movq 288 + 0 + 32(%rsp),%r9 - movq 56(%r9),%r14 - movq 48(%r9),%r13 - testq %r14,%r14 - jz L$process_partial_block - - movq $16,%r15 - subq %rbx,%r15 - cmpq %r15,%r14 - - jge L$load_extra_in - movq %r14,%r15 - -L$load_extra_in: - - - leaq -1(%r13,%r15,1),%rsi - - - addq %r15,%r13 - subq %r15,%r14 - movq %r13,48(%r9) - movq %r14,56(%r9) - - - - addq %r15,%r8 - - - pxor %xmm11,%xmm11 -L$load_extra_load_loop: - pslldq $1,%xmm11 - pinsrb $0,(%rsi),%xmm11 - leaq -1(%rsi),%rsi - subq $1,%r15 - jnz L$load_extra_load_loop - - - - - movq %rbx,%r15 - -L$load_extra_shift_loop: - pslldq $1,%xmm11 - subq $1,%r15 - jnz L$load_extra_shift_loop - - - - - leaq L$and_masks(%rip),%r15 - shlq $4,%rbx - pand -16(%r15,%rbx,1),%xmm15 - - - por %xmm11,%xmm15 - - - -.byte 102,77,15,126,253 - pextrq $1,%xmm15,%r14 - addq %r13,%r10 - adcq %r14,%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - -L$process_blocks_of_extra_in: - - movq 288+32+0 (%rsp),%r9 - movq 48(%r9),%rsi - movq 56(%r9),%r8 - movq %r8,%rcx - shrq $4,%r8 - -L$process_extra_hash_loop: - jz process_extra_in_trailer - addq 0+0(%rsi),%r10 - adcq 8+0(%rsi),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - leaq 16(%rsi),%rsi - subq $1,%r8 - jmp L$process_extra_hash_loop -process_extra_in_trailer: - andq $15,%rcx - movq %rcx,%rbx - jz L$do_length_block - leaq -1(%rsi,%rcx,1),%rsi - -L$process_extra_in_trailer_load: - pslldq $1,%xmm15 - pinsrb $0,(%rsi),%xmm15 - leaq -1(%rsi),%rsi - subq $1,%rcx - jnz L$process_extra_in_trailer_load - -L$process_partial_block: - - leaq L$and_masks(%rip),%r15 - shlq $4,%rbx - pand -16(%r15,%rbx,1),%xmm15 -.byte 102,77,15,126,253 - pextrq $1,%xmm15,%r14 - addq %r13,%r10 - adcq %r14,%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - -L$do_length_block: - addq 0+0+32(%rbp),%r10 - adcq 8+0+32(%rbp),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - - movq %r10,%r13 - movq %r11,%r14 - movq %r12,%r15 - subq $-5,%r10 - sbbq $-1,%r11 - sbbq $3,%r12 - cmovcq %r13,%r10 - cmovcq %r14,%r11 - cmovcq %r15,%r12 - - addq 0+0+16(%rbp),%r10 - adcq 8+0+16(%rbp),%r11 - - - addq $288 + 0 + 32,%rsp - - - popq %r9 - - movq %r10,(%r9) - movq %r11,8(%r9) - popq %r15 - - popq %r14 - - popq %r13 - - popq %r12 - - popq %rbx - - popq %rbp - - .byte 0xf3,0xc3 - -L$seal_sse_128: - - movdqu L$chacha20_consts(%rip),%xmm0 - movdqa %xmm0,%xmm1 - movdqa %xmm0,%xmm2 - movdqu 0(%r9),%xmm4 - movdqa %xmm4,%xmm5 - movdqa %xmm4,%xmm6 - movdqu 16(%r9),%xmm8 - movdqa %xmm8,%xmm9 - movdqa %xmm8,%xmm10 - movdqu 32(%r9),%xmm14 - movdqa %xmm14,%xmm12 - paddd L$sse_inc(%rip),%xmm12 - movdqa %xmm12,%xmm13 - paddd L$sse_inc(%rip),%xmm13 - movdqa %xmm4,%xmm7 - movdqa %xmm8,%xmm11 - movdqa %xmm12,%xmm15 - movq $10,%r10 - -L$seal_sse_128_rounds: - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb L$rol16(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm4 - pxor %xmm3,%xmm4 - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb L$rol8(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm4 - pxor %xmm3,%xmm4 -.byte 102,15,58,15,228,4 -.byte 102,69,15,58,15,192,8 -.byte 102,69,15,58,15,228,12 - paddd %xmm5,%xmm1 - pxor %xmm1,%xmm13 - pshufb L$rol16(%rip),%xmm13 - paddd %xmm13,%xmm9 - pxor %xmm9,%xmm5 - movdqa %xmm5,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm5 - pxor %xmm3,%xmm5 - paddd %xmm5,%xmm1 - pxor %xmm1,%xmm13 - pshufb L$rol8(%rip),%xmm13 - paddd %xmm13,%xmm9 - pxor %xmm9,%xmm5 - movdqa %xmm5,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm5 - pxor %xmm3,%xmm5 -.byte 102,15,58,15,237,4 -.byte 102,69,15,58,15,201,8 -.byte 102,69,15,58,15,237,12 - paddd %xmm6,%xmm2 - pxor %xmm2,%xmm14 - pshufb L$rol16(%rip),%xmm14 - paddd %xmm14,%xmm10 - pxor %xmm10,%xmm6 - movdqa %xmm6,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm6 - pxor %xmm3,%xmm6 - paddd %xmm6,%xmm2 - pxor %xmm2,%xmm14 - pshufb L$rol8(%rip),%xmm14 - paddd %xmm14,%xmm10 - pxor %xmm10,%xmm6 - movdqa %xmm6,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm6 - pxor %xmm3,%xmm6 -.byte 102,15,58,15,246,4 -.byte 102,69,15,58,15,210,8 -.byte 102,69,15,58,15,246,12 - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb L$rol16(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm4 - pxor %xmm3,%xmm4 - paddd %xmm4,%xmm0 - pxor %xmm0,%xmm12 - pshufb L$rol8(%rip),%xmm12 - paddd %xmm12,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm4 - pxor %xmm3,%xmm4 -.byte 102,15,58,15,228,12 -.byte 102,69,15,58,15,192,8 -.byte 102,69,15,58,15,228,4 - paddd %xmm5,%xmm1 - pxor %xmm1,%xmm13 - pshufb L$rol16(%rip),%xmm13 - paddd %xmm13,%xmm9 - pxor %xmm9,%xmm5 - movdqa %xmm5,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm5 - pxor %xmm3,%xmm5 - paddd %xmm5,%xmm1 - pxor %xmm1,%xmm13 - pshufb L$rol8(%rip),%xmm13 - paddd %xmm13,%xmm9 - pxor %xmm9,%xmm5 - movdqa %xmm5,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm5 - pxor %xmm3,%xmm5 -.byte 102,15,58,15,237,12 -.byte 102,69,15,58,15,201,8 -.byte 102,69,15,58,15,237,4 - paddd %xmm6,%xmm2 - pxor %xmm2,%xmm14 - pshufb L$rol16(%rip),%xmm14 - paddd %xmm14,%xmm10 - pxor %xmm10,%xmm6 - movdqa %xmm6,%xmm3 - pslld $12,%xmm3 - psrld $20,%xmm6 - pxor %xmm3,%xmm6 - paddd %xmm6,%xmm2 - pxor %xmm2,%xmm14 - pshufb L$rol8(%rip),%xmm14 - paddd %xmm14,%xmm10 - pxor %xmm10,%xmm6 - movdqa %xmm6,%xmm3 - pslld $7,%xmm3 - psrld $25,%xmm6 - pxor %xmm3,%xmm6 -.byte 102,15,58,15,246,12 -.byte 102,69,15,58,15,210,8 -.byte 102,69,15,58,15,246,4 - - decq %r10 - jnz L$seal_sse_128_rounds - paddd L$chacha20_consts(%rip),%xmm0 - paddd L$chacha20_consts(%rip),%xmm1 - paddd L$chacha20_consts(%rip),%xmm2 - paddd %xmm7,%xmm4 - paddd %xmm7,%xmm5 - paddd %xmm7,%xmm6 - paddd %xmm11,%xmm8 - paddd %xmm11,%xmm9 - paddd %xmm15,%xmm12 - paddd L$sse_inc(%rip),%xmm15 - paddd %xmm15,%xmm13 - - pand L$clamp(%rip),%xmm2 - movdqa %xmm2,0+0(%rbp) - movdqa %xmm6,0+16(%rbp) - - movq %r8,%r8 - call poly_hash_ad_internal - jmp L$seal_sse_128_tail_xor - - - - - -.p2align 6 -chacha20_poly1305_open_avx2: - - - - - - - - - - - - - vzeroupper - vmovdqa L$chacha20_consts(%rip),%ymm0 - vbroadcasti128 0(%r9),%ymm4 - vbroadcasti128 16(%r9),%ymm8 - vbroadcasti128 32(%r9),%ymm12 - vpaddd L$avx2_init(%rip),%ymm12,%ymm12 - cmpq $192,%rbx - jbe L$open_avx2_192 - cmpq $320,%rbx - jbe L$open_avx2_320 - - vmovdqa %ymm4,0+64(%rbp) - vmovdqa %ymm8,0+96(%rbp) - vmovdqa %ymm12,0+160(%rbp) - movq $10,%r10 -L$open_avx2_init_rounds: - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb L$rol16(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpsrld $20,%ymm4,%ymm3 - vpslld $12,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb L$rol8(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpslld $7,%ymm4,%ymm3 - vpsrld $25,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpalignr $12,%ymm12,%ymm12,%ymm12 - vpalignr $8,%ymm8,%ymm8,%ymm8 - vpalignr $4,%ymm4,%ymm4,%ymm4 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb L$rol16(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpsrld $20,%ymm4,%ymm3 - vpslld $12,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb L$rol8(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpslld $7,%ymm4,%ymm3 - vpsrld $25,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpalignr $4,%ymm12,%ymm12,%ymm12 - vpalignr $8,%ymm8,%ymm8,%ymm8 - vpalignr $12,%ymm4,%ymm4,%ymm4 - - decq %r10 - jne L$open_avx2_init_rounds - vpaddd L$chacha20_consts(%rip),%ymm0,%ymm0 - vpaddd 0+64(%rbp),%ymm4,%ymm4 - vpaddd 0+96(%rbp),%ymm8,%ymm8 - vpaddd 0+160(%rbp),%ymm12,%ymm12 - - vperm2i128 $0x02,%ymm0,%ymm4,%ymm3 - - vpand L$clamp(%rip),%ymm3,%ymm3 - vmovdqa %ymm3,0+0(%rbp) - - vperm2i128 $0x13,%ymm0,%ymm4,%ymm0 - vperm2i128 $0x13,%ymm8,%ymm12,%ymm4 - - movq %r8,%r8 - call poly_hash_ad_internal - - xorq %rcx,%rcx -L$open_avx2_init_hash: - addq 0+0(%rsi,%rcx,1),%r10 - adcq 8+0(%rsi,%rcx,1),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - addq $16,%rcx - cmpq $64,%rcx - jne L$open_avx2_init_hash - - vpxor 0(%rsi),%ymm0,%ymm0 - vpxor 32(%rsi),%ymm4,%ymm4 - - vmovdqu %ymm0,0(%rdi) - vmovdqu %ymm4,32(%rdi) - leaq 64(%rsi),%rsi - leaq 64(%rdi),%rdi - subq $64,%rbx -L$open_avx2_main_loop: - - cmpq $512,%rbx - jb L$open_avx2_main_loop_done - vmovdqa L$chacha20_consts(%rip),%ymm0 - vmovdqa 0+64(%rbp),%ymm4 - vmovdqa 0+96(%rbp),%ymm8 - vmovdqa %ymm0,%ymm1 - vmovdqa %ymm4,%ymm5 - vmovdqa %ymm8,%ymm9 - vmovdqa %ymm0,%ymm2 - vmovdqa %ymm4,%ymm6 - vmovdqa %ymm8,%ymm10 - vmovdqa %ymm0,%ymm3 - vmovdqa %ymm4,%ymm7 - vmovdqa %ymm8,%ymm11 - vmovdqa L$avx2_inc(%rip),%ymm12 - vpaddd 0+160(%rbp),%ymm12,%ymm15 - vpaddd %ymm15,%ymm12,%ymm14 - vpaddd %ymm14,%ymm12,%ymm13 - vpaddd %ymm13,%ymm12,%ymm12 - vmovdqa %ymm15,0+256(%rbp) - vmovdqa %ymm14,0+224(%rbp) - vmovdqa %ymm13,0+192(%rbp) - vmovdqa %ymm12,0+160(%rbp) - - xorq %rcx,%rcx -L$open_avx2_main_loop_rounds: - addq 0+0(%rsi,%rcx,1),%r10 - adcq 8+0(%rsi,%rcx,1),%r11 - adcq $1,%r12 - vmovdqa %ymm8,0+128(%rbp) - vmovdqa L$rol16(%rip),%ymm8 - vpaddd %ymm7,%ymm3,%ymm3 - vpaddd %ymm6,%ymm2,%ymm2 - vpaddd %ymm5,%ymm1,%ymm1 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm3,%ymm15,%ymm15 - vpxor %ymm2,%ymm14,%ymm14 - vpxor %ymm1,%ymm13,%ymm13 - vpxor %ymm0,%ymm12,%ymm12 - movq 0+0+0(%rbp),%rdx - movq %rdx,%r15 - mulxq %r10,%r13,%r14 - mulxq %r11,%rax,%rdx - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - vpshufb %ymm8,%ymm15,%ymm15 - vpshufb %ymm8,%ymm14,%ymm14 - vpshufb %ymm8,%ymm13,%ymm13 - vpshufb %ymm8,%ymm12,%ymm12 - vpaddd %ymm15,%ymm11,%ymm11 - vpaddd %ymm14,%ymm10,%ymm10 - vpaddd %ymm13,%ymm9,%ymm9 - vpaddd 0+128(%rbp),%ymm12,%ymm8 - vpxor %ymm11,%ymm7,%ymm7 - movq 8+0+0(%rbp),%rdx - mulxq %r10,%r10,%rax - addq %r10,%r14 - mulxq %r11,%r11,%r9 - adcq %r11,%r15 - adcq $0,%r9 - imulq %r12,%rdx - vpxor %ymm10,%ymm6,%ymm6 - vpxor %ymm9,%ymm5,%ymm5 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa %ymm8,0+128(%rbp) - vpsrld $20,%ymm7,%ymm8 - vpslld $32-20,%ymm7,%ymm7 - vpxor %ymm8,%ymm7,%ymm7 - vpsrld $20,%ymm6,%ymm8 - vpslld $32-20,%ymm6,%ymm6 - vpxor %ymm8,%ymm6,%ymm6 - vpsrld $20,%ymm5,%ymm8 - vpslld $32-20,%ymm5,%ymm5 - addq %rax,%r15 - adcq %rdx,%r9 - vpxor %ymm8,%ymm5,%ymm5 - vpsrld $20,%ymm4,%ymm8 - vpslld $32-20,%ymm4,%ymm4 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa L$rol8(%rip),%ymm8 - vpaddd %ymm7,%ymm3,%ymm3 - vpaddd %ymm6,%ymm2,%ymm2 - vpaddd %ymm5,%ymm1,%ymm1 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm3,%ymm15,%ymm15 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - vpxor %ymm2,%ymm14,%ymm14 - vpxor %ymm1,%ymm13,%ymm13 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb %ymm8,%ymm15,%ymm15 - vpshufb %ymm8,%ymm14,%ymm14 - vpshufb %ymm8,%ymm13,%ymm13 - vpshufb %ymm8,%ymm12,%ymm12 - vpaddd %ymm15,%ymm11,%ymm11 - vpaddd %ymm14,%ymm10,%ymm10 - addq 0+16(%rsi,%rcx,1),%r10 - adcq 8+16(%rsi,%rcx,1),%r11 - adcq $1,%r12 - vpaddd %ymm13,%ymm9,%ymm9 - vpaddd 0+128(%rbp),%ymm12,%ymm8 - vpxor %ymm11,%ymm7,%ymm7 - vpxor %ymm10,%ymm6,%ymm6 - vpxor %ymm9,%ymm5,%ymm5 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa %ymm8,0+128(%rbp) - vpsrld $25,%ymm7,%ymm8 - movq 0+0+0(%rbp),%rdx - movq %rdx,%r15 - mulxq %r10,%r13,%r14 - mulxq %r11,%rax,%rdx - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - vpslld $32-25,%ymm7,%ymm7 - vpxor %ymm8,%ymm7,%ymm7 - vpsrld $25,%ymm6,%ymm8 - vpslld $32-25,%ymm6,%ymm6 - vpxor %ymm8,%ymm6,%ymm6 - vpsrld $25,%ymm5,%ymm8 - vpslld $32-25,%ymm5,%ymm5 - vpxor %ymm8,%ymm5,%ymm5 - vpsrld $25,%ymm4,%ymm8 - vpslld $32-25,%ymm4,%ymm4 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa 0+128(%rbp),%ymm8 - vpalignr $4,%ymm7,%ymm7,%ymm7 - vpalignr $8,%ymm11,%ymm11,%ymm11 - vpalignr $12,%ymm15,%ymm15,%ymm15 - vpalignr $4,%ymm6,%ymm6,%ymm6 - vpalignr $8,%ymm10,%ymm10,%ymm10 - vpalignr $12,%ymm14,%ymm14,%ymm14 - movq 8+0+0(%rbp),%rdx - mulxq %r10,%r10,%rax - addq %r10,%r14 - mulxq %r11,%r11,%r9 - adcq %r11,%r15 - adcq $0,%r9 - imulq %r12,%rdx - vpalignr $4,%ymm5,%ymm5,%ymm5 - vpalignr $8,%ymm9,%ymm9,%ymm9 - vpalignr $12,%ymm13,%ymm13,%ymm13 - vpalignr $4,%ymm4,%ymm4,%ymm4 - vpalignr $8,%ymm8,%ymm8,%ymm8 - vpalignr $12,%ymm12,%ymm12,%ymm12 - vmovdqa %ymm8,0+128(%rbp) - vmovdqa L$rol16(%rip),%ymm8 - vpaddd %ymm7,%ymm3,%ymm3 - vpaddd %ymm6,%ymm2,%ymm2 - vpaddd %ymm5,%ymm1,%ymm1 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm3,%ymm15,%ymm15 - vpxor %ymm2,%ymm14,%ymm14 - vpxor %ymm1,%ymm13,%ymm13 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb %ymm8,%ymm15,%ymm15 - vpshufb %ymm8,%ymm14,%ymm14 - addq %rax,%r15 - adcq %rdx,%r9 - vpshufb %ymm8,%ymm13,%ymm13 - vpshufb %ymm8,%ymm12,%ymm12 - vpaddd %ymm15,%ymm11,%ymm11 - vpaddd %ymm14,%ymm10,%ymm10 - vpaddd %ymm13,%ymm9,%ymm9 - vpaddd 0+128(%rbp),%ymm12,%ymm8 - vpxor %ymm11,%ymm7,%ymm7 - vpxor %ymm10,%ymm6,%ymm6 - vpxor %ymm9,%ymm5,%ymm5 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa %ymm8,0+128(%rbp) - vpsrld $20,%ymm7,%ymm8 - vpslld $32-20,%ymm7,%ymm7 - vpxor %ymm8,%ymm7,%ymm7 - vpsrld $20,%ymm6,%ymm8 - vpslld $32-20,%ymm6,%ymm6 - vpxor %ymm8,%ymm6,%ymm6 - addq 0+32(%rsi,%rcx,1),%r10 - adcq 8+32(%rsi,%rcx,1),%r11 - adcq $1,%r12 - - leaq 48(%rcx),%rcx - vpsrld $20,%ymm5,%ymm8 - vpslld $32-20,%ymm5,%ymm5 - vpxor %ymm8,%ymm5,%ymm5 - vpsrld $20,%ymm4,%ymm8 - vpslld $32-20,%ymm4,%ymm4 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa L$rol8(%rip),%ymm8 - vpaddd %ymm7,%ymm3,%ymm3 - vpaddd %ymm6,%ymm2,%ymm2 - vpaddd %ymm5,%ymm1,%ymm1 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm3,%ymm15,%ymm15 - vpxor %ymm2,%ymm14,%ymm14 - vpxor %ymm1,%ymm13,%ymm13 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb %ymm8,%ymm15,%ymm15 - vpshufb %ymm8,%ymm14,%ymm14 - vpshufb %ymm8,%ymm13,%ymm13 - movq 0+0+0(%rbp),%rdx - movq %rdx,%r15 - mulxq %r10,%r13,%r14 - mulxq %r11,%rax,%rdx - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - vpshufb %ymm8,%ymm12,%ymm12 - vpaddd %ymm15,%ymm11,%ymm11 - vpaddd %ymm14,%ymm10,%ymm10 - vpaddd %ymm13,%ymm9,%ymm9 - vpaddd 0+128(%rbp),%ymm12,%ymm8 - vpxor %ymm11,%ymm7,%ymm7 - vpxor %ymm10,%ymm6,%ymm6 - vpxor %ymm9,%ymm5,%ymm5 - movq 8+0+0(%rbp),%rdx - mulxq %r10,%r10,%rax - addq %r10,%r14 - mulxq %r11,%r11,%r9 - adcq %r11,%r15 - adcq $0,%r9 - imulq %r12,%rdx - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa %ymm8,0+128(%rbp) - vpsrld $25,%ymm7,%ymm8 - vpslld $32-25,%ymm7,%ymm7 - vpxor %ymm8,%ymm7,%ymm7 - vpsrld $25,%ymm6,%ymm8 - vpslld $32-25,%ymm6,%ymm6 - vpxor %ymm8,%ymm6,%ymm6 - addq %rax,%r15 - adcq %rdx,%r9 - vpsrld $25,%ymm5,%ymm8 - vpslld $32-25,%ymm5,%ymm5 - vpxor %ymm8,%ymm5,%ymm5 - vpsrld $25,%ymm4,%ymm8 - vpslld $32-25,%ymm4,%ymm4 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa 0+128(%rbp),%ymm8 - vpalignr $12,%ymm7,%ymm7,%ymm7 - vpalignr $8,%ymm11,%ymm11,%ymm11 - vpalignr $4,%ymm15,%ymm15,%ymm15 - vpalignr $12,%ymm6,%ymm6,%ymm6 - vpalignr $8,%ymm10,%ymm10,%ymm10 - vpalignr $4,%ymm14,%ymm14,%ymm14 - vpalignr $12,%ymm5,%ymm5,%ymm5 - vpalignr $8,%ymm9,%ymm9,%ymm9 - vpalignr $4,%ymm13,%ymm13,%ymm13 - vpalignr $12,%ymm4,%ymm4,%ymm4 - vpalignr $8,%ymm8,%ymm8,%ymm8 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - vpalignr $4,%ymm12,%ymm12,%ymm12 - - cmpq $60*8,%rcx - jne L$open_avx2_main_loop_rounds - vpaddd L$chacha20_consts(%rip),%ymm3,%ymm3 - vpaddd 0+64(%rbp),%ymm7,%ymm7 - vpaddd 0+96(%rbp),%ymm11,%ymm11 - vpaddd 0+256(%rbp),%ymm15,%ymm15 - vpaddd L$chacha20_consts(%rip),%ymm2,%ymm2 - vpaddd 0+64(%rbp),%ymm6,%ymm6 - vpaddd 0+96(%rbp),%ymm10,%ymm10 - vpaddd 0+224(%rbp),%ymm14,%ymm14 - vpaddd L$chacha20_consts(%rip),%ymm1,%ymm1 - vpaddd 0+64(%rbp),%ymm5,%ymm5 - vpaddd 0+96(%rbp),%ymm9,%ymm9 - vpaddd 0+192(%rbp),%ymm13,%ymm13 - vpaddd L$chacha20_consts(%rip),%ymm0,%ymm0 - vpaddd 0+64(%rbp),%ymm4,%ymm4 - vpaddd 0+96(%rbp),%ymm8,%ymm8 - vpaddd 0+160(%rbp),%ymm12,%ymm12 - - vmovdqa %ymm0,0+128(%rbp) - addq 0+60*8(%rsi),%r10 - adcq 8+60*8(%rsi),%r11 - adcq $1,%r12 - vperm2i128 $0x02,%ymm3,%ymm7,%ymm0 - vperm2i128 $0x13,%ymm3,%ymm7,%ymm7 - vperm2i128 $0x02,%ymm11,%ymm15,%ymm3 - vperm2i128 $0x13,%ymm11,%ymm15,%ymm11 - vpxor 0+0(%rsi),%ymm0,%ymm0 - vpxor 32+0(%rsi),%ymm3,%ymm3 - vpxor 64+0(%rsi),%ymm7,%ymm7 - vpxor 96+0(%rsi),%ymm11,%ymm11 - vmovdqu %ymm0,0+0(%rdi) - vmovdqu %ymm3,32+0(%rdi) - vmovdqu %ymm7,64+0(%rdi) - vmovdqu %ymm11,96+0(%rdi) - - vmovdqa 0+128(%rbp),%ymm0 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - vperm2i128 $0x02,%ymm2,%ymm6,%ymm3 - vperm2i128 $0x13,%ymm2,%ymm6,%ymm6 - vperm2i128 $0x02,%ymm10,%ymm14,%ymm2 - vperm2i128 $0x13,%ymm10,%ymm14,%ymm10 - vpxor 0+128(%rsi),%ymm3,%ymm3 - vpxor 32+128(%rsi),%ymm2,%ymm2 - vpxor 64+128(%rsi),%ymm6,%ymm6 - vpxor 96+128(%rsi),%ymm10,%ymm10 - vmovdqu %ymm3,0+128(%rdi) - vmovdqu %ymm2,32+128(%rdi) - vmovdqu %ymm6,64+128(%rdi) - vmovdqu %ymm10,96+128(%rdi) - addq 0+60*8+16(%rsi),%r10 - adcq 8+60*8+16(%rsi),%r11 - adcq $1,%r12 - vperm2i128 $0x02,%ymm1,%ymm5,%ymm3 - vperm2i128 $0x13,%ymm1,%ymm5,%ymm5 - vperm2i128 $0x02,%ymm9,%ymm13,%ymm1 - vperm2i128 $0x13,%ymm9,%ymm13,%ymm9 - vpxor 0+256(%rsi),%ymm3,%ymm3 - vpxor 32+256(%rsi),%ymm1,%ymm1 - vpxor 64+256(%rsi),%ymm5,%ymm5 - vpxor 96+256(%rsi),%ymm9,%ymm9 - vmovdqu %ymm3,0+256(%rdi) - vmovdqu %ymm1,32+256(%rdi) - vmovdqu %ymm5,64+256(%rdi) - vmovdqu %ymm9,96+256(%rdi) - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - vperm2i128 $0x02,%ymm0,%ymm4,%ymm3 - vperm2i128 $0x13,%ymm0,%ymm4,%ymm4 - vperm2i128 $0x02,%ymm8,%ymm12,%ymm0 - vperm2i128 $0x13,%ymm8,%ymm12,%ymm8 - vpxor 0+384(%rsi),%ymm3,%ymm3 - vpxor 32+384(%rsi),%ymm0,%ymm0 - vpxor 64+384(%rsi),%ymm4,%ymm4 - vpxor 96+384(%rsi),%ymm8,%ymm8 - vmovdqu %ymm3,0+384(%rdi) - vmovdqu %ymm0,32+384(%rdi) - vmovdqu %ymm4,64+384(%rdi) - vmovdqu %ymm8,96+384(%rdi) - - leaq 512(%rsi),%rsi - leaq 512(%rdi),%rdi - subq $512,%rbx - jmp L$open_avx2_main_loop -L$open_avx2_main_loop_done: - testq %rbx,%rbx - vzeroupper - je L$open_sse_finalize - - cmpq $384,%rbx - ja L$open_avx2_tail_512 - cmpq $256,%rbx - ja L$open_avx2_tail_384 - cmpq $128,%rbx - ja L$open_avx2_tail_256 - vmovdqa L$chacha20_consts(%rip),%ymm0 - vmovdqa 0+64(%rbp),%ymm4 - vmovdqa 0+96(%rbp),%ymm8 - vmovdqa L$avx2_inc(%rip),%ymm12 - vpaddd 0+160(%rbp),%ymm12,%ymm12 - vmovdqa %ymm12,0+160(%rbp) - - xorq %r8,%r8 - movq %rbx,%rcx - andq $-16,%rcx - testq %rcx,%rcx - je L$open_avx2_tail_128_rounds -L$open_avx2_tail_128_rounds_and_x1hash: - addq 0+0(%rsi,%r8,1),%r10 - adcq 8+0(%rsi,%r8,1),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - -L$open_avx2_tail_128_rounds: - addq $16,%r8 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb L$rol16(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpsrld $20,%ymm4,%ymm3 - vpslld $12,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb L$rol8(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpslld $7,%ymm4,%ymm3 - vpsrld $25,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpalignr $12,%ymm12,%ymm12,%ymm12 - vpalignr $8,%ymm8,%ymm8,%ymm8 - vpalignr $4,%ymm4,%ymm4,%ymm4 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb L$rol16(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpsrld $20,%ymm4,%ymm3 - vpslld $12,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb L$rol8(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpslld $7,%ymm4,%ymm3 - vpsrld $25,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpalignr $4,%ymm12,%ymm12,%ymm12 - vpalignr $8,%ymm8,%ymm8,%ymm8 - vpalignr $12,%ymm4,%ymm4,%ymm4 - - cmpq %rcx,%r8 - jb L$open_avx2_tail_128_rounds_and_x1hash - cmpq $160,%r8 - jne L$open_avx2_tail_128_rounds - vpaddd L$chacha20_consts(%rip),%ymm0,%ymm0 - vpaddd 0+64(%rbp),%ymm4,%ymm4 - vpaddd 0+96(%rbp),%ymm8,%ymm8 - vpaddd 0+160(%rbp),%ymm12,%ymm12 - vperm2i128 $0x13,%ymm0,%ymm4,%ymm3 - vperm2i128 $0x02,%ymm0,%ymm4,%ymm0 - vperm2i128 $0x02,%ymm8,%ymm12,%ymm4 - vperm2i128 $0x13,%ymm8,%ymm12,%ymm12 - vmovdqa %ymm3,%ymm8 - - jmp L$open_avx2_tail_128_xor - -L$open_avx2_tail_256: - vmovdqa L$chacha20_consts(%rip),%ymm0 - vmovdqa 0+64(%rbp),%ymm4 - vmovdqa 0+96(%rbp),%ymm8 - vmovdqa %ymm0,%ymm1 - vmovdqa %ymm4,%ymm5 - vmovdqa %ymm8,%ymm9 - vmovdqa L$avx2_inc(%rip),%ymm12 - vpaddd 0+160(%rbp),%ymm12,%ymm13 - vpaddd %ymm13,%ymm12,%ymm12 - vmovdqa %ymm12,0+160(%rbp) - vmovdqa %ymm13,0+192(%rbp) - - movq %rbx,0+128(%rbp) - movq %rbx,%rcx - subq $128,%rcx - shrq $4,%rcx - movq $10,%r8 - cmpq $10,%rcx - cmovgq %r8,%rcx - movq %rsi,%rbx - xorq %r8,%r8 -L$open_avx2_tail_256_rounds_and_x1hash: - addq 0+0(%rbx),%r10 - adcq 8+0(%rbx),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rdx - movq %rdx,%r15 - mulxq %r10,%r13,%r14 - mulxq %r11,%rax,%rdx - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rdx - mulxq %r10,%r10,%rax - addq %r10,%r14 - mulxq %r11,%r11,%r9 - adcq %r11,%r15 - adcq $0,%r9 - imulq %r12,%rdx - addq %rax,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - leaq 16(%rbx),%rbx -L$open_avx2_tail_256_rounds: - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb L$rol16(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpsrld $20,%ymm4,%ymm3 - vpslld $12,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb L$rol8(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpslld $7,%ymm4,%ymm3 - vpsrld $25,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpalignr $12,%ymm12,%ymm12,%ymm12 - vpalignr $8,%ymm8,%ymm8,%ymm8 - vpalignr $4,%ymm4,%ymm4,%ymm4 - vpaddd %ymm5,%ymm1,%ymm1 - vpxor %ymm1,%ymm13,%ymm13 - vpshufb L$rol16(%rip),%ymm13,%ymm13 - vpaddd %ymm13,%ymm9,%ymm9 - vpxor %ymm9,%ymm5,%ymm5 - vpsrld $20,%ymm5,%ymm3 - vpslld $12,%ymm5,%ymm5 - vpxor %ymm3,%ymm5,%ymm5 - vpaddd %ymm5,%ymm1,%ymm1 - vpxor %ymm1,%ymm13,%ymm13 - vpshufb L$rol8(%rip),%ymm13,%ymm13 - vpaddd %ymm13,%ymm9,%ymm9 - vpxor %ymm9,%ymm5,%ymm5 - vpslld $7,%ymm5,%ymm3 - vpsrld $25,%ymm5,%ymm5 - vpxor %ymm3,%ymm5,%ymm5 - vpalignr $12,%ymm13,%ymm13,%ymm13 - vpalignr $8,%ymm9,%ymm9,%ymm9 - vpalignr $4,%ymm5,%ymm5,%ymm5 - - incq %r8 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb L$rol16(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpsrld $20,%ymm4,%ymm3 - vpslld $12,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb L$rol8(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpslld $7,%ymm4,%ymm3 - vpsrld $25,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpalignr $4,%ymm12,%ymm12,%ymm12 - vpalignr $8,%ymm8,%ymm8,%ymm8 - vpalignr $12,%ymm4,%ymm4,%ymm4 - vpaddd %ymm5,%ymm1,%ymm1 - vpxor %ymm1,%ymm13,%ymm13 - vpshufb L$rol16(%rip),%ymm13,%ymm13 - vpaddd %ymm13,%ymm9,%ymm9 - vpxor %ymm9,%ymm5,%ymm5 - vpsrld $20,%ymm5,%ymm3 - vpslld $12,%ymm5,%ymm5 - vpxor %ymm3,%ymm5,%ymm5 - vpaddd %ymm5,%ymm1,%ymm1 - vpxor %ymm1,%ymm13,%ymm13 - vpshufb L$rol8(%rip),%ymm13,%ymm13 - vpaddd %ymm13,%ymm9,%ymm9 - vpxor %ymm9,%ymm5,%ymm5 - vpslld $7,%ymm5,%ymm3 - vpsrld $25,%ymm5,%ymm5 - vpxor %ymm3,%ymm5,%ymm5 - vpalignr $4,%ymm13,%ymm13,%ymm13 - vpalignr $8,%ymm9,%ymm9,%ymm9 - vpalignr $12,%ymm5,%ymm5,%ymm5 - vpaddd %ymm6,%ymm2,%ymm2 - vpxor %ymm2,%ymm14,%ymm14 - vpshufb L$rol16(%rip),%ymm14,%ymm14 - vpaddd %ymm14,%ymm10,%ymm10 - vpxor %ymm10,%ymm6,%ymm6 - vpsrld $20,%ymm6,%ymm3 - vpslld $12,%ymm6,%ymm6 - vpxor %ymm3,%ymm6,%ymm6 - vpaddd %ymm6,%ymm2,%ymm2 - vpxor %ymm2,%ymm14,%ymm14 - vpshufb L$rol8(%rip),%ymm14,%ymm14 - vpaddd %ymm14,%ymm10,%ymm10 - vpxor %ymm10,%ymm6,%ymm6 - vpslld $7,%ymm6,%ymm3 - vpsrld $25,%ymm6,%ymm6 - vpxor %ymm3,%ymm6,%ymm6 - vpalignr $4,%ymm14,%ymm14,%ymm14 - vpalignr $8,%ymm10,%ymm10,%ymm10 - vpalignr $12,%ymm6,%ymm6,%ymm6 - - cmpq %rcx,%r8 - jb L$open_avx2_tail_256_rounds_and_x1hash - cmpq $10,%r8 - jne L$open_avx2_tail_256_rounds - movq %rbx,%r8 - subq %rsi,%rbx - movq %rbx,%rcx - movq 0+128(%rbp),%rbx -L$open_avx2_tail_256_hash: - addq $16,%rcx - cmpq %rbx,%rcx - jg L$open_avx2_tail_256_done - addq 0+0(%r8),%r10 - adcq 8+0(%r8),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rdx - movq %rdx,%r15 - mulxq %r10,%r13,%r14 - mulxq %r11,%rax,%rdx - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rdx - mulxq %r10,%r10,%rax - addq %r10,%r14 - mulxq %r11,%r11,%r9 - adcq %r11,%r15 - adcq $0,%r9 - imulq %r12,%rdx - addq %rax,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - leaq 16(%r8),%r8 - jmp L$open_avx2_tail_256_hash -L$open_avx2_tail_256_done: - vpaddd L$chacha20_consts(%rip),%ymm1,%ymm1 - vpaddd 0+64(%rbp),%ymm5,%ymm5 - vpaddd 0+96(%rbp),%ymm9,%ymm9 - vpaddd 0+192(%rbp),%ymm13,%ymm13 - vpaddd L$chacha20_consts(%rip),%ymm0,%ymm0 - vpaddd 0+64(%rbp),%ymm4,%ymm4 - vpaddd 0+96(%rbp),%ymm8,%ymm8 - vpaddd 0+160(%rbp),%ymm12,%ymm12 - vperm2i128 $0x02,%ymm1,%ymm5,%ymm3 - vperm2i128 $0x13,%ymm1,%ymm5,%ymm5 - vperm2i128 $0x02,%ymm9,%ymm13,%ymm1 - vperm2i128 $0x13,%ymm9,%ymm13,%ymm9 - vpxor 0+0(%rsi),%ymm3,%ymm3 - vpxor 32+0(%rsi),%ymm1,%ymm1 - vpxor 64+0(%rsi),%ymm5,%ymm5 - vpxor 96+0(%rsi),%ymm9,%ymm9 - vmovdqu %ymm3,0+0(%rdi) - vmovdqu %ymm1,32+0(%rdi) - vmovdqu %ymm5,64+0(%rdi) - vmovdqu %ymm9,96+0(%rdi) - vperm2i128 $0x13,%ymm0,%ymm4,%ymm3 - vperm2i128 $0x02,%ymm0,%ymm4,%ymm0 - vperm2i128 $0x02,%ymm8,%ymm12,%ymm4 - vperm2i128 $0x13,%ymm8,%ymm12,%ymm12 - vmovdqa %ymm3,%ymm8 - - leaq 128(%rsi),%rsi - leaq 128(%rdi),%rdi - subq $128,%rbx - jmp L$open_avx2_tail_128_xor - -L$open_avx2_tail_384: - vmovdqa L$chacha20_consts(%rip),%ymm0 - vmovdqa 0+64(%rbp),%ymm4 - vmovdqa 0+96(%rbp),%ymm8 - vmovdqa %ymm0,%ymm1 - vmovdqa %ymm4,%ymm5 - vmovdqa %ymm8,%ymm9 - vmovdqa %ymm0,%ymm2 - vmovdqa %ymm4,%ymm6 - vmovdqa %ymm8,%ymm10 - vmovdqa L$avx2_inc(%rip),%ymm12 - vpaddd 0+160(%rbp),%ymm12,%ymm14 - vpaddd %ymm14,%ymm12,%ymm13 - vpaddd %ymm13,%ymm12,%ymm12 - vmovdqa %ymm12,0+160(%rbp) - vmovdqa %ymm13,0+192(%rbp) - vmovdqa %ymm14,0+224(%rbp) - - movq %rbx,0+128(%rbp) - movq %rbx,%rcx - subq $256,%rcx - shrq $4,%rcx - addq $6,%rcx - movq $10,%r8 - cmpq $10,%rcx - cmovgq %r8,%rcx - movq %rsi,%rbx - xorq %r8,%r8 -L$open_avx2_tail_384_rounds_and_x2hash: - addq 0+0(%rbx),%r10 - adcq 8+0(%rbx),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rdx - movq %rdx,%r15 - mulxq %r10,%r13,%r14 - mulxq %r11,%rax,%rdx - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rdx - mulxq %r10,%r10,%rax - addq %r10,%r14 - mulxq %r11,%r11,%r9 - adcq %r11,%r15 - adcq $0,%r9 - imulq %r12,%rdx - addq %rax,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - leaq 16(%rbx),%rbx -L$open_avx2_tail_384_rounds_and_x1hash: - vpaddd %ymm6,%ymm2,%ymm2 - vpxor %ymm2,%ymm14,%ymm14 - vpshufb L$rol16(%rip),%ymm14,%ymm14 - vpaddd %ymm14,%ymm10,%ymm10 - vpxor %ymm10,%ymm6,%ymm6 - vpsrld $20,%ymm6,%ymm3 - vpslld $12,%ymm6,%ymm6 - vpxor %ymm3,%ymm6,%ymm6 - vpaddd %ymm6,%ymm2,%ymm2 - vpxor %ymm2,%ymm14,%ymm14 - vpshufb L$rol8(%rip),%ymm14,%ymm14 - vpaddd %ymm14,%ymm10,%ymm10 - vpxor %ymm10,%ymm6,%ymm6 - vpslld $7,%ymm6,%ymm3 - vpsrld $25,%ymm6,%ymm6 - vpxor %ymm3,%ymm6,%ymm6 - vpalignr $12,%ymm14,%ymm14,%ymm14 - vpalignr $8,%ymm10,%ymm10,%ymm10 - vpalignr $4,%ymm6,%ymm6,%ymm6 - vpaddd %ymm5,%ymm1,%ymm1 - vpxor %ymm1,%ymm13,%ymm13 - vpshufb L$rol16(%rip),%ymm13,%ymm13 - vpaddd %ymm13,%ymm9,%ymm9 - vpxor %ymm9,%ymm5,%ymm5 - vpsrld $20,%ymm5,%ymm3 - vpslld $12,%ymm5,%ymm5 - vpxor %ymm3,%ymm5,%ymm5 - vpaddd %ymm5,%ymm1,%ymm1 - vpxor %ymm1,%ymm13,%ymm13 - vpshufb L$rol8(%rip),%ymm13,%ymm13 - vpaddd %ymm13,%ymm9,%ymm9 - vpxor %ymm9,%ymm5,%ymm5 - vpslld $7,%ymm5,%ymm3 - vpsrld $25,%ymm5,%ymm5 - vpxor %ymm3,%ymm5,%ymm5 - vpalignr $12,%ymm13,%ymm13,%ymm13 - vpalignr $8,%ymm9,%ymm9,%ymm9 - vpalignr $4,%ymm5,%ymm5,%ymm5 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb L$rol16(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpsrld $20,%ymm4,%ymm3 - vpslld $12,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb L$rol8(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpslld $7,%ymm4,%ymm3 - vpsrld $25,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpalignr $12,%ymm12,%ymm12,%ymm12 - vpalignr $8,%ymm8,%ymm8,%ymm8 - vpalignr $4,%ymm4,%ymm4,%ymm4 - addq 0+0(%rbx),%r10 - adcq 8+0(%rbx),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - leaq 16(%rbx),%rbx - incq %r8 - vpaddd %ymm6,%ymm2,%ymm2 - vpxor %ymm2,%ymm14,%ymm14 - vpshufb L$rol16(%rip),%ymm14,%ymm14 - vpaddd %ymm14,%ymm10,%ymm10 - vpxor %ymm10,%ymm6,%ymm6 - vpsrld $20,%ymm6,%ymm3 - vpslld $12,%ymm6,%ymm6 - vpxor %ymm3,%ymm6,%ymm6 - vpaddd %ymm6,%ymm2,%ymm2 - vpxor %ymm2,%ymm14,%ymm14 - vpshufb L$rol8(%rip),%ymm14,%ymm14 - vpaddd %ymm14,%ymm10,%ymm10 - vpxor %ymm10,%ymm6,%ymm6 - vpslld $7,%ymm6,%ymm3 - vpsrld $25,%ymm6,%ymm6 - vpxor %ymm3,%ymm6,%ymm6 - vpalignr $4,%ymm14,%ymm14,%ymm14 - vpalignr $8,%ymm10,%ymm10,%ymm10 - vpalignr $12,%ymm6,%ymm6,%ymm6 - vpaddd %ymm5,%ymm1,%ymm1 - vpxor %ymm1,%ymm13,%ymm13 - vpshufb L$rol16(%rip),%ymm13,%ymm13 - vpaddd %ymm13,%ymm9,%ymm9 - vpxor %ymm9,%ymm5,%ymm5 - vpsrld $20,%ymm5,%ymm3 - vpslld $12,%ymm5,%ymm5 - vpxor %ymm3,%ymm5,%ymm5 - vpaddd %ymm5,%ymm1,%ymm1 - vpxor %ymm1,%ymm13,%ymm13 - vpshufb L$rol8(%rip),%ymm13,%ymm13 - vpaddd %ymm13,%ymm9,%ymm9 - vpxor %ymm9,%ymm5,%ymm5 - vpslld $7,%ymm5,%ymm3 - vpsrld $25,%ymm5,%ymm5 - vpxor %ymm3,%ymm5,%ymm5 - vpalignr $4,%ymm13,%ymm13,%ymm13 - vpalignr $8,%ymm9,%ymm9,%ymm9 - vpalignr $12,%ymm5,%ymm5,%ymm5 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb L$rol16(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpsrld $20,%ymm4,%ymm3 - vpslld $12,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb L$rol8(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpslld $7,%ymm4,%ymm3 - vpsrld $25,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpalignr $4,%ymm12,%ymm12,%ymm12 - vpalignr $8,%ymm8,%ymm8,%ymm8 - vpalignr $12,%ymm4,%ymm4,%ymm4 - - cmpq %rcx,%r8 - jb L$open_avx2_tail_384_rounds_and_x2hash - cmpq $10,%r8 - jne L$open_avx2_tail_384_rounds_and_x1hash - movq %rbx,%r8 - subq %rsi,%rbx - movq %rbx,%rcx - movq 0+128(%rbp),%rbx -L$open_avx2_384_tail_hash: - addq $16,%rcx - cmpq %rbx,%rcx - jg L$open_avx2_384_tail_done - addq 0+0(%r8),%r10 - adcq 8+0(%r8),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rdx - movq %rdx,%r15 - mulxq %r10,%r13,%r14 - mulxq %r11,%rax,%rdx - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rdx - mulxq %r10,%r10,%rax - addq %r10,%r14 - mulxq %r11,%r11,%r9 - adcq %r11,%r15 - adcq $0,%r9 - imulq %r12,%rdx - addq %rax,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - leaq 16(%r8),%r8 - jmp L$open_avx2_384_tail_hash -L$open_avx2_384_tail_done: - vpaddd L$chacha20_consts(%rip),%ymm2,%ymm2 - vpaddd 0+64(%rbp),%ymm6,%ymm6 - vpaddd 0+96(%rbp),%ymm10,%ymm10 - vpaddd 0+224(%rbp),%ymm14,%ymm14 - vpaddd L$chacha20_consts(%rip),%ymm1,%ymm1 - vpaddd 0+64(%rbp),%ymm5,%ymm5 - vpaddd 0+96(%rbp),%ymm9,%ymm9 - vpaddd 0+192(%rbp),%ymm13,%ymm13 - vpaddd L$chacha20_consts(%rip),%ymm0,%ymm0 - vpaddd 0+64(%rbp),%ymm4,%ymm4 - vpaddd 0+96(%rbp),%ymm8,%ymm8 - vpaddd 0+160(%rbp),%ymm12,%ymm12 - vperm2i128 $0x02,%ymm2,%ymm6,%ymm3 - vperm2i128 $0x13,%ymm2,%ymm6,%ymm6 - vperm2i128 $0x02,%ymm10,%ymm14,%ymm2 - vperm2i128 $0x13,%ymm10,%ymm14,%ymm10 - vpxor 0+0(%rsi),%ymm3,%ymm3 - vpxor 32+0(%rsi),%ymm2,%ymm2 - vpxor 64+0(%rsi),%ymm6,%ymm6 - vpxor 96+0(%rsi),%ymm10,%ymm10 - vmovdqu %ymm3,0+0(%rdi) - vmovdqu %ymm2,32+0(%rdi) - vmovdqu %ymm6,64+0(%rdi) - vmovdqu %ymm10,96+0(%rdi) - vperm2i128 $0x02,%ymm1,%ymm5,%ymm3 - vperm2i128 $0x13,%ymm1,%ymm5,%ymm5 - vperm2i128 $0x02,%ymm9,%ymm13,%ymm1 - vperm2i128 $0x13,%ymm9,%ymm13,%ymm9 - vpxor 0+128(%rsi),%ymm3,%ymm3 - vpxor 32+128(%rsi),%ymm1,%ymm1 - vpxor 64+128(%rsi),%ymm5,%ymm5 - vpxor 96+128(%rsi),%ymm9,%ymm9 - vmovdqu %ymm3,0+128(%rdi) - vmovdqu %ymm1,32+128(%rdi) - vmovdqu %ymm5,64+128(%rdi) - vmovdqu %ymm9,96+128(%rdi) - vperm2i128 $0x13,%ymm0,%ymm4,%ymm3 - vperm2i128 $0x02,%ymm0,%ymm4,%ymm0 - vperm2i128 $0x02,%ymm8,%ymm12,%ymm4 - vperm2i128 $0x13,%ymm8,%ymm12,%ymm12 - vmovdqa %ymm3,%ymm8 - - leaq 256(%rsi),%rsi - leaq 256(%rdi),%rdi - subq $256,%rbx - jmp L$open_avx2_tail_128_xor - -L$open_avx2_tail_512: - vmovdqa L$chacha20_consts(%rip),%ymm0 - vmovdqa 0+64(%rbp),%ymm4 - vmovdqa 0+96(%rbp),%ymm8 - vmovdqa %ymm0,%ymm1 - vmovdqa %ymm4,%ymm5 - vmovdqa %ymm8,%ymm9 - vmovdqa %ymm0,%ymm2 - vmovdqa %ymm4,%ymm6 - vmovdqa %ymm8,%ymm10 - vmovdqa %ymm0,%ymm3 - vmovdqa %ymm4,%ymm7 - vmovdqa %ymm8,%ymm11 - vmovdqa L$avx2_inc(%rip),%ymm12 - vpaddd 0+160(%rbp),%ymm12,%ymm15 - vpaddd %ymm15,%ymm12,%ymm14 - vpaddd %ymm14,%ymm12,%ymm13 - vpaddd %ymm13,%ymm12,%ymm12 - vmovdqa %ymm15,0+256(%rbp) - vmovdqa %ymm14,0+224(%rbp) - vmovdqa %ymm13,0+192(%rbp) - vmovdqa %ymm12,0+160(%rbp) - - xorq %rcx,%rcx - movq %rsi,%r8 -L$open_avx2_tail_512_rounds_and_x2hash: - addq 0+0(%r8),%r10 - adcq 8+0(%r8),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - leaq 16(%r8),%r8 -L$open_avx2_tail_512_rounds_and_x1hash: - vmovdqa %ymm8,0+128(%rbp) - vmovdqa L$rol16(%rip),%ymm8 - vpaddd %ymm7,%ymm3,%ymm3 - vpaddd %ymm6,%ymm2,%ymm2 - vpaddd %ymm5,%ymm1,%ymm1 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm3,%ymm15,%ymm15 - vpxor %ymm2,%ymm14,%ymm14 - vpxor %ymm1,%ymm13,%ymm13 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb %ymm8,%ymm15,%ymm15 - vpshufb %ymm8,%ymm14,%ymm14 - vpshufb %ymm8,%ymm13,%ymm13 - vpshufb %ymm8,%ymm12,%ymm12 - vpaddd %ymm15,%ymm11,%ymm11 - vpaddd %ymm14,%ymm10,%ymm10 - vpaddd %ymm13,%ymm9,%ymm9 - vpaddd 0+128(%rbp),%ymm12,%ymm8 - vpxor %ymm11,%ymm7,%ymm7 - vpxor %ymm10,%ymm6,%ymm6 - vpxor %ymm9,%ymm5,%ymm5 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa %ymm8,0+128(%rbp) - vpsrld $20,%ymm7,%ymm8 - vpslld $32-20,%ymm7,%ymm7 - vpxor %ymm8,%ymm7,%ymm7 - vpsrld $20,%ymm6,%ymm8 - vpslld $32-20,%ymm6,%ymm6 - vpxor %ymm8,%ymm6,%ymm6 - vpsrld $20,%ymm5,%ymm8 - vpslld $32-20,%ymm5,%ymm5 - vpxor %ymm8,%ymm5,%ymm5 - vpsrld $20,%ymm4,%ymm8 - vpslld $32-20,%ymm4,%ymm4 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa L$rol8(%rip),%ymm8 - vpaddd %ymm7,%ymm3,%ymm3 - addq 0+0(%r8),%r10 - adcq 8+0(%r8),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rdx - movq %rdx,%r15 - mulxq %r10,%r13,%r14 - mulxq %r11,%rax,%rdx - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rdx - mulxq %r10,%r10,%rax - addq %r10,%r14 - mulxq %r11,%r11,%r9 - adcq %r11,%r15 - adcq $0,%r9 - imulq %r12,%rdx - addq %rax,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - vpaddd %ymm6,%ymm2,%ymm2 - vpaddd %ymm5,%ymm1,%ymm1 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm3,%ymm15,%ymm15 - vpxor %ymm2,%ymm14,%ymm14 - vpxor %ymm1,%ymm13,%ymm13 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb %ymm8,%ymm15,%ymm15 - vpshufb %ymm8,%ymm14,%ymm14 - vpshufb %ymm8,%ymm13,%ymm13 - vpshufb %ymm8,%ymm12,%ymm12 - vpaddd %ymm15,%ymm11,%ymm11 - vpaddd %ymm14,%ymm10,%ymm10 - vpaddd %ymm13,%ymm9,%ymm9 - vpaddd 0+128(%rbp),%ymm12,%ymm8 - vpxor %ymm11,%ymm7,%ymm7 - vpxor %ymm10,%ymm6,%ymm6 - vpxor %ymm9,%ymm5,%ymm5 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa %ymm8,0+128(%rbp) - vpsrld $25,%ymm7,%ymm8 - vpslld $32-25,%ymm7,%ymm7 - vpxor %ymm8,%ymm7,%ymm7 - vpsrld $25,%ymm6,%ymm8 - vpslld $32-25,%ymm6,%ymm6 - vpxor %ymm8,%ymm6,%ymm6 - vpsrld $25,%ymm5,%ymm8 - vpslld $32-25,%ymm5,%ymm5 - vpxor %ymm8,%ymm5,%ymm5 - vpsrld $25,%ymm4,%ymm8 - vpslld $32-25,%ymm4,%ymm4 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa 0+128(%rbp),%ymm8 - vpalignr $4,%ymm7,%ymm7,%ymm7 - vpalignr $8,%ymm11,%ymm11,%ymm11 - vpalignr $12,%ymm15,%ymm15,%ymm15 - vpalignr $4,%ymm6,%ymm6,%ymm6 - vpalignr $8,%ymm10,%ymm10,%ymm10 - vpalignr $12,%ymm14,%ymm14,%ymm14 - vpalignr $4,%ymm5,%ymm5,%ymm5 - vpalignr $8,%ymm9,%ymm9,%ymm9 - vpalignr $12,%ymm13,%ymm13,%ymm13 - vpalignr $4,%ymm4,%ymm4,%ymm4 - vpalignr $8,%ymm8,%ymm8,%ymm8 - vpalignr $12,%ymm12,%ymm12,%ymm12 - vmovdqa %ymm8,0+128(%rbp) - vmovdqa L$rol16(%rip),%ymm8 - vpaddd %ymm7,%ymm3,%ymm3 - addq 0+16(%r8),%r10 - adcq 8+16(%r8),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rdx - movq %rdx,%r15 - mulxq %r10,%r13,%r14 - mulxq %r11,%rax,%rdx - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rdx - mulxq %r10,%r10,%rax - addq %r10,%r14 - mulxq %r11,%r11,%r9 - adcq %r11,%r15 - adcq $0,%r9 - imulq %r12,%rdx - addq %rax,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - leaq 32(%r8),%r8 - vpaddd %ymm6,%ymm2,%ymm2 - vpaddd %ymm5,%ymm1,%ymm1 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm3,%ymm15,%ymm15 - vpxor %ymm2,%ymm14,%ymm14 - vpxor %ymm1,%ymm13,%ymm13 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb %ymm8,%ymm15,%ymm15 - vpshufb %ymm8,%ymm14,%ymm14 - vpshufb %ymm8,%ymm13,%ymm13 - vpshufb %ymm8,%ymm12,%ymm12 - vpaddd %ymm15,%ymm11,%ymm11 - vpaddd %ymm14,%ymm10,%ymm10 - vpaddd %ymm13,%ymm9,%ymm9 - vpaddd 0+128(%rbp),%ymm12,%ymm8 - vpxor %ymm11,%ymm7,%ymm7 - vpxor %ymm10,%ymm6,%ymm6 - vpxor %ymm9,%ymm5,%ymm5 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa %ymm8,0+128(%rbp) - vpsrld $20,%ymm7,%ymm8 - vpslld $32-20,%ymm7,%ymm7 - vpxor %ymm8,%ymm7,%ymm7 - vpsrld $20,%ymm6,%ymm8 - vpslld $32-20,%ymm6,%ymm6 - vpxor %ymm8,%ymm6,%ymm6 - vpsrld $20,%ymm5,%ymm8 - vpslld $32-20,%ymm5,%ymm5 - vpxor %ymm8,%ymm5,%ymm5 - vpsrld $20,%ymm4,%ymm8 - vpslld $32-20,%ymm4,%ymm4 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa L$rol8(%rip),%ymm8 - vpaddd %ymm7,%ymm3,%ymm3 - vpaddd %ymm6,%ymm2,%ymm2 - vpaddd %ymm5,%ymm1,%ymm1 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm3,%ymm15,%ymm15 - vpxor %ymm2,%ymm14,%ymm14 - vpxor %ymm1,%ymm13,%ymm13 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb %ymm8,%ymm15,%ymm15 - vpshufb %ymm8,%ymm14,%ymm14 - vpshufb %ymm8,%ymm13,%ymm13 - vpshufb %ymm8,%ymm12,%ymm12 - vpaddd %ymm15,%ymm11,%ymm11 - vpaddd %ymm14,%ymm10,%ymm10 - vpaddd %ymm13,%ymm9,%ymm9 - vpaddd 0+128(%rbp),%ymm12,%ymm8 - vpxor %ymm11,%ymm7,%ymm7 - vpxor %ymm10,%ymm6,%ymm6 - vpxor %ymm9,%ymm5,%ymm5 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa %ymm8,0+128(%rbp) - vpsrld $25,%ymm7,%ymm8 - vpslld $32-25,%ymm7,%ymm7 - vpxor %ymm8,%ymm7,%ymm7 - vpsrld $25,%ymm6,%ymm8 - vpslld $32-25,%ymm6,%ymm6 - vpxor %ymm8,%ymm6,%ymm6 - vpsrld $25,%ymm5,%ymm8 - vpslld $32-25,%ymm5,%ymm5 - vpxor %ymm8,%ymm5,%ymm5 - vpsrld $25,%ymm4,%ymm8 - vpslld $32-25,%ymm4,%ymm4 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa 0+128(%rbp),%ymm8 - vpalignr $12,%ymm7,%ymm7,%ymm7 - vpalignr $8,%ymm11,%ymm11,%ymm11 - vpalignr $4,%ymm15,%ymm15,%ymm15 - vpalignr $12,%ymm6,%ymm6,%ymm6 - vpalignr $8,%ymm10,%ymm10,%ymm10 - vpalignr $4,%ymm14,%ymm14,%ymm14 - vpalignr $12,%ymm5,%ymm5,%ymm5 - vpalignr $8,%ymm9,%ymm9,%ymm9 - vpalignr $4,%ymm13,%ymm13,%ymm13 - vpalignr $12,%ymm4,%ymm4,%ymm4 - vpalignr $8,%ymm8,%ymm8,%ymm8 - vpalignr $4,%ymm12,%ymm12,%ymm12 - - incq %rcx - cmpq $4,%rcx - jl L$open_avx2_tail_512_rounds_and_x2hash - cmpq $10,%rcx - jne L$open_avx2_tail_512_rounds_and_x1hash - movq %rbx,%rcx - subq $384,%rcx - andq $-16,%rcx -L$open_avx2_tail_512_hash: - testq %rcx,%rcx - je L$open_avx2_tail_512_done - addq 0+0(%r8),%r10 - adcq 8+0(%r8),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rdx - movq %rdx,%r15 - mulxq %r10,%r13,%r14 - mulxq %r11,%rax,%rdx - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rdx - mulxq %r10,%r10,%rax - addq %r10,%r14 - mulxq %r11,%r11,%r9 - adcq %r11,%r15 - adcq $0,%r9 - imulq %r12,%rdx - addq %rax,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - leaq 16(%r8),%r8 - subq $16,%rcx - jmp L$open_avx2_tail_512_hash -L$open_avx2_tail_512_done: - vpaddd L$chacha20_consts(%rip),%ymm3,%ymm3 - vpaddd 0+64(%rbp),%ymm7,%ymm7 - vpaddd 0+96(%rbp),%ymm11,%ymm11 - vpaddd 0+256(%rbp),%ymm15,%ymm15 - vpaddd L$chacha20_consts(%rip),%ymm2,%ymm2 - vpaddd 0+64(%rbp),%ymm6,%ymm6 - vpaddd 0+96(%rbp),%ymm10,%ymm10 - vpaddd 0+224(%rbp),%ymm14,%ymm14 - vpaddd L$chacha20_consts(%rip),%ymm1,%ymm1 - vpaddd 0+64(%rbp),%ymm5,%ymm5 - vpaddd 0+96(%rbp),%ymm9,%ymm9 - vpaddd 0+192(%rbp),%ymm13,%ymm13 - vpaddd L$chacha20_consts(%rip),%ymm0,%ymm0 - vpaddd 0+64(%rbp),%ymm4,%ymm4 - vpaddd 0+96(%rbp),%ymm8,%ymm8 - vpaddd 0+160(%rbp),%ymm12,%ymm12 - - vmovdqa %ymm0,0+128(%rbp) - vperm2i128 $0x02,%ymm3,%ymm7,%ymm0 - vperm2i128 $0x13,%ymm3,%ymm7,%ymm7 - vperm2i128 $0x02,%ymm11,%ymm15,%ymm3 - vperm2i128 $0x13,%ymm11,%ymm15,%ymm11 - vpxor 0+0(%rsi),%ymm0,%ymm0 - vpxor 32+0(%rsi),%ymm3,%ymm3 - vpxor 64+0(%rsi),%ymm7,%ymm7 - vpxor 96+0(%rsi),%ymm11,%ymm11 - vmovdqu %ymm0,0+0(%rdi) - vmovdqu %ymm3,32+0(%rdi) - vmovdqu %ymm7,64+0(%rdi) - vmovdqu %ymm11,96+0(%rdi) - - vmovdqa 0+128(%rbp),%ymm0 - vperm2i128 $0x02,%ymm2,%ymm6,%ymm3 - vperm2i128 $0x13,%ymm2,%ymm6,%ymm6 - vperm2i128 $0x02,%ymm10,%ymm14,%ymm2 - vperm2i128 $0x13,%ymm10,%ymm14,%ymm10 - vpxor 0+128(%rsi),%ymm3,%ymm3 - vpxor 32+128(%rsi),%ymm2,%ymm2 - vpxor 64+128(%rsi),%ymm6,%ymm6 - vpxor 96+128(%rsi),%ymm10,%ymm10 - vmovdqu %ymm3,0+128(%rdi) - vmovdqu %ymm2,32+128(%rdi) - vmovdqu %ymm6,64+128(%rdi) - vmovdqu %ymm10,96+128(%rdi) - vperm2i128 $0x02,%ymm1,%ymm5,%ymm3 - vperm2i128 $0x13,%ymm1,%ymm5,%ymm5 - vperm2i128 $0x02,%ymm9,%ymm13,%ymm1 - vperm2i128 $0x13,%ymm9,%ymm13,%ymm9 - vpxor 0+256(%rsi),%ymm3,%ymm3 - vpxor 32+256(%rsi),%ymm1,%ymm1 - vpxor 64+256(%rsi),%ymm5,%ymm5 - vpxor 96+256(%rsi),%ymm9,%ymm9 - vmovdqu %ymm3,0+256(%rdi) - vmovdqu %ymm1,32+256(%rdi) - vmovdqu %ymm5,64+256(%rdi) - vmovdqu %ymm9,96+256(%rdi) - vperm2i128 $0x13,%ymm0,%ymm4,%ymm3 - vperm2i128 $0x02,%ymm0,%ymm4,%ymm0 - vperm2i128 $0x02,%ymm8,%ymm12,%ymm4 - vperm2i128 $0x13,%ymm8,%ymm12,%ymm12 - vmovdqa %ymm3,%ymm8 - - leaq 384(%rsi),%rsi - leaq 384(%rdi),%rdi - subq $384,%rbx -L$open_avx2_tail_128_xor: - cmpq $32,%rbx - jb L$open_avx2_tail_32_xor - subq $32,%rbx - vpxor (%rsi),%ymm0,%ymm0 - vmovdqu %ymm0,(%rdi) - leaq 32(%rsi),%rsi - leaq 32(%rdi),%rdi - vmovdqa %ymm4,%ymm0 - vmovdqa %ymm8,%ymm4 - vmovdqa %ymm12,%ymm8 - jmp L$open_avx2_tail_128_xor -L$open_avx2_tail_32_xor: - cmpq $16,%rbx - vmovdqa %xmm0,%xmm1 - jb L$open_avx2_exit - subq $16,%rbx - - vpxor (%rsi),%xmm0,%xmm1 - vmovdqu %xmm1,(%rdi) - leaq 16(%rsi),%rsi - leaq 16(%rdi),%rdi - vperm2i128 $0x11,%ymm0,%ymm0,%ymm0 - vmovdqa %xmm0,%xmm1 -L$open_avx2_exit: - vzeroupper - jmp L$open_sse_tail_16 - -L$open_avx2_192: - vmovdqa %ymm0,%ymm1 - vmovdqa %ymm0,%ymm2 - vmovdqa %ymm4,%ymm5 - vmovdqa %ymm4,%ymm6 - vmovdqa %ymm8,%ymm9 - vmovdqa %ymm8,%ymm10 - vpaddd L$avx2_inc(%rip),%ymm12,%ymm13 - vmovdqa %ymm12,%ymm11 - vmovdqa %ymm13,%ymm15 - movq $10,%r10 -L$open_avx2_192_rounds: - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb L$rol16(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpsrld $20,%ymm4,%ymm3 - vpslld $12,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb L$rol8(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpslld $7,%ymm4,%ymm3 - vpsrld $25,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpalignr $12,%ymm12,%ymm12,%ymm12 - vpalignr $8,%ymm8,%ymm8,%ymm8 - vpalignr $4,%ymm4,%ymm4,%ymm4 - vpaddd %ymm5,%ymm1,%ymm1 - vpxor %ymm1,%ymm13,%ymm13 - vpshufb L$rol16(%rip),%ymm13,%ymm13 - vpaddd %ymm13,%ymm9,%ymm9 - vpxor %ymm9,%ymm5,%ymm5 - vpsrld $20,%ymm5,%ymm3 - vpslld $12,%ymm5,%ymm5 - vpxor %ymm3,%ymm5,%ymm5 - vpaddd %ymm5,%ymm1,%ymm1 - vpxor %ymm1,%ymm13,%ymm13 - vpshufb L$rol8(%rip),%ymm13,%ymm13 - vpaddd %ymm13,%ymm9,%ymm9 - vpxor %ymm9,%ymm5,%ymm5 - vpslld $7,%ymm5,%ymm3 - vpsrld $25,%ymm5,%ymm5 - vpxor %ymm3,%ymm5,%ymm5 - vpalignr $12,%ymm13,%ymm13,%ymm13 - vpalignr $8,%ymm9,%ymm9,%ymm9 - vpalignr $4,%ymm5,%ymm5,%ymm5 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb L$rol16(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpsrld $20,%ymm4,%ymm3 - vpslld $12,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb L$rol8(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpslld $7,%ymm4,%ymm3 - vpsrld $25,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpalignr $4,%ymm12,%ymm12,%ymm12 - vpalignr $8,%ymm8,%ymm8,%ymm8 - vpalignr $12,%ymm4,%ymm4,%ymm4 - vpaddd %ymm5,%ymm1,%ymm1 - vpxor %ymm1,%ymm13,%ymm13 - vpshufb L$rol16(%rip),%ymm13,%ymm13 - vpaddd %ymm13,%ymm9,%ymm9 - vpxor %ymm9,%ymm5,%ymm5 - vpsrld $20,%ymm5,%ymm3 - vpslld $12,%ymm5,%ymm5 - vpxor %ymm3,%ymm5,%ymm5 - vpaddd %ymm5,%ymm1,%ymm1 - vpxor %ymm1,%ymm13,%ymm13 - vpshufb L$rol8(%rip),%ymm13,%ymm13 - vpaddd %ymm13,%ymm9,%ymm9 - vpxor %ymm9,%ymm5,%ymm5 - vpslld $7,%ymm5,%ymm3 - vpsrld $25,%ymm5,%ymm5 - vpxor %ymm3,%ymm5,%ymm5 - vpalignr $4,%ymm13,%ymm13,%ymm13 - vpalignr $8,%ymm9,%ymm9,%ymm9 - vpalignr $12,%ymm5,%ymm5,%ymm5 - - decq %r10 - jne L$open_avx2_192_rounds - vpaddd %ymm2,%ymm0,%ymm0 - vpaddd %ymm2,%ymm1,%ymm1 - vpaddd %ymm6,%ymm4,%ymm4 - vpaddd %ymm6,%ymm5,%ymm5 - vpaddd %ymm10,%ymm8,%ymm8 - vpaddd %ymm10,%ymm9,%ymm9 - vpaddd %ymm11,%ymm12,%ymm12 - vpaddd %ymm15,%ymm13,%ymm13 - vperm2i128 $0x02,%ymm0,%ymm4,%ymm3 - - vpand L$clamp(%rip),%ymm3,%ymm3 - vmovdqa %ymm3,0+0(%rbp) - - vperm2i128 $0x13,%ymm0,%ymm4,%ymm0 - vperm2i128 $0x13,%ymm8,%ymm12,%ymm4 - vperm2i128 $0x02,%ymm1,%ymm5,%ymm8 - vperm2i128 $0x02,%ymm9,%ymm13,%ymm12 - vperm2i128 $0x13,%ymm1,%ymm5,%ymm1 - vperm2i128 $0x13,%ymm9,%ymm13,%ymm5 -L$open_avx2_short: - movq %r8,%r8 - call poly_hash_ad_internal -L$open_avx2_short_hash_and_xor_loop: - cmpq $32,%rbx - jb L$open_avx2_short_tail_32 - subq $32,%rbx - addq 0+0(%rsi),%r10 - adcq 8+0(%rsi),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - addq 0+16(%rsi),%r10 - adcq 8+16(%rsi),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - - vpxor (%rsi),%ymm0,%ymm0 - vmovdqu %ymm0,(%rdi) - leaq 32(%rsi),%rsi - leaq 32(%rdi),%rdi - - vmovdqa %ymm4,%ymm0 - vmovdqa %ymm8,%ymm4 - vmovdqa %ymm12,%ymm8 - vmovdqa %ymm1,%ymm12 - vmovdqa %ymm5,%ymm1 - vmovdqa %ymm9,%ymm5 - vmovdqa %ymm13,%ymm9 - vmovdqa %ymm2,%ymm13 - vmovdqa %ymm6,%ymm2 - jmp L$open_avx2_short_hash_and_xor_loop -L$open_avx2_short_tail_32: - cmpq $16,%rbx - vmovdqa %xmm0,%xmm1 - jb L$open_avx2_short_tail_32_exit - subq $16,%rbx - addq 0+0(%rsi),%r10 - adcq 8+0(%rsi),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - vpxor (%rsi),%xmm0,%xmm3 - vmovdqu %xmm3,(%rdi) - leaq 16(%rsi),%rsi - leaq 16(%rdi),%rdi - vextracti128 $1,%ymm0,%xmm1 -L$open_avx2_short_tail_32_exit: - vzeroupper - jmp L$open_sse_tail_16 - -L$open_avx2_320: - vmovdqa %ymm0,%ymm1 - vmovdqa %ymm0,%ymm2 - vmovdqa %ymm4,%ymm5 - vmovdqa %ymm4,%ymm6 - vmovdqa %ymm8,%ymm9 - vmovdqa %ymm8,%ymm10 - vpaddd L$avx2_inc(%rip),%ymm12,%ymm13 - vpaddd L$avx2_inc(%rip),%ymm13,%ymm14 - vmovdqa %ymm4,%ymm7 - vmovdqa %ymm8,%ymm11 - vmovdqa %ymm12,0+160(%rbp) - vmovdqa %ymm13,0+192(%rbp) - vmovdqa %ymm14,0+224(%rbp) - movq $10,%r10 -L$open_avx2_320_rounds: - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb L$rol16(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpsrld $20,%ymm4,%ymm3 - vpslld $12,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb L$rol8(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpslld $7,%ymm4,%ymm3 - vpsrld $25,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpalignr $12,%ymm12,%ymm12,%ymm12 - vpalignr $8,%ymm8,%ymm8,%ymm8 - vpalignr $4,%ymm4,%ymm4,%ymm4 - vpaddd %ymm5,%ymm1,%ymm1 - vpxor %ymm1,%ymm13,%ymm13 - vpshufb L$rol16(%rip),%ymm13,%ymm13 - vpaddd %ymm13,%ymm9,%ymm9 - vpxor %ymm9,%ymm5,%ymm5 - vpsrld $20,%ymm5,%ymm3 - vpslld $12,%ymm5,%ymm5 - vpxor %ymm3,%ymm5,%ymm5 - vpaddd %ymm5,%ymm1,%ymm1 - vpxor %ymm1,%ymm13,%ymm13 - vpshufb L$rol8(%rip),%ymm13,%ymm13 - vpaddd %ymm13,%ymm9,%ymm9 - vpxor %ymm9,%ymm5,%ymm5 - vpslld $7,%ymm5,%ymm3 - vpsrld $25,%ymm5,%ymm5 - vpxor %ymm3,%ymm5,%ymm5 - vpalignr $12,%ymm13,%ymm13,%ymm13 - vpalignr $8,%ymm9,%ymm9,%ymm9 - vpalignr $4,%ymm5,%ymm5,%ymm5 - vpaddd %ymm6,%ymm2,%ymm2 - vpxor %ymm2,%ymm14,%ymm14 - vpshufb L$rol16(%rip),%ymm14,%ymm14 - vpaddd %ymm14,%ymm10,%ymm10 - vpxor %ymm10,%ymm6,%ymm6 - vpsrld $20,%ymm6,%ymm3 - vpslld $12,%ymm6,%ymm6 - vpxor %ymm3,%ymm6,%ymm6 - vpaddd %ymm6,%ymm2,%ymm2 - vpxor %ymm2,%ymm14,%ymm14 - vpshufb L$rol8(%rip),%ymm14,%ymm14 - vpaddd %ymm14,%ymm10,%ymm10 - vpxor %ymm10,%ymm6,%ymm6 - vpslld $7,%ymm6,%ymm3 - vpsrld $25,%ymm6,%ymm6 - vpxor %ymm3,%ymm6,%ymm6 - vpalignr $12,%ymm14,%ymm14,%ymm14 - vpalignr $8,%ymm10,%ymm10,%ymm10 - vpalignr $4,%ymm6,%ymm6,%ymm6 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb L$rol16(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpsrld $20,%ymm4,%ymm3 - vpslld $12,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb L$rol8(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpslld $7,%ymm4,%ymm3 - vpsrld $25,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpalignr $4,%ymm12,%ymm12,%ymm12 - vpalignr $8,%ymm8,%ymm8,%ymm8 - vpalignr $12,%ymm4,%ymm4,%ymm4 - vpaddd %ymm5,%ymm1,%ymm1 - vpxor %ymm1,%ymm13,%ymm13 - vpshufb L$rol16(%rip),%ymm13,%ymm13 - vpaddd %ymm13,%ymm9,%ymm9 - vpxor %ymm9,%ymm5,%ymm5 - vpsrld $20,%ymm5,%ymm3 - vpslld $12,%ymm5,%ymm5 - vpxor %ymm3,%ymm5,%ymm5 - vpaddd %ymm5,%ymm1,%ymm1 - vpxor %ymm1,%ymm13,%ymm13 - vpshufb L$rol8(%rip),%ymm13,%ymm13 - vpaddd %ymm13,%ymm9,%ymm9 - vpxor %ymm9,%ymm5,%ymm5 - vpslld $7,%ymm5,%ymm3 - vpsrld $25,%ymm5,%ymm5 - vpxor %ymm3,%ymm5,%ymm5 - vpalignr $4,%ymm13,%ymm13,%ymm13 - vpalignr $8,%ymm9,%ymm9,%ymm9 - vpalignr $12,%ymm5,%ymm5,%ymm5 - vpaddd %ymm6,%ymm2,%ymm2 - vpxor %ymm2,%ymm14,%ymm14 - vpshufb L$rol16(%rip),%ymm14,%ymm14 - vpaddd %ymm14,%ymm10,%ymm10 - vpxor %ymm10,%ymm6,%ymm6 - vpsrld $20,%ymm6,%ymm3 - vpslld $12,%ymm6,%ymm6 - vpxor %ymm3,%ymm6,%ymm6 - vpaddd %ymm6,%ymm2,%ymm2 - vpxor %ymm2,%ymm14,%ymm14 - vpshufb L$rol8(%rip),%ymm14,%ymm14 - vpaddd %ymm14,%ymm10,%ymm10 - vpxor %ymm10,%ymm6,%ymm6 - vpslld $7,%ymm6,%ymm3 - vpsrld $25,%ymm6,%ymm6 - vpxor %ymm3,%ymm6,%ymm6 - vpalignr $4,%ymm14,%ymm14,%ymm14 - vpalignr $8,%ymm10,%ymm10,%ymm10 - vpalignr $12,%ymm6,%ymm6,%ymm6 - - decq %r10 - jne L$open_avx2_320_rounds - vpaddd L$chacha20_consts(%rip),%ymm0,%ymm0 - vpaddd L$chacha20_consts(%rip),%ymm1,%ymm1 - vpaddd L$chacha20_consts(%rip),%ymm2,%ymm2 - vpaddd %ymm7,%ymm4,%ymm4 - vpaddd %ymm7,%ymm5,%ymm5 - vpaddd %ymm7,%ymm6,%ymm6 - vpaddd %ymm11,%ymm8,%ymm8 - vpaddd %ymm11,%ymm9,%ymm9 - vpaddd %ymm11,%ymm10,%ymm10 - vpaddd 0+160(%rbp),%ymm12,%ymm12 - vpaddd 0+192(%rbp),%ymm13,%ymm13 - vpaddd 0+224(%rbp),%ymm14,%ymm14 - vperm2i128 $0x02,%ymm0,%ymm4,%ymm3 - - vpand L$clamp(%rip),%ymm3,%ymm3 - vmovdqa %ymm3,0+0(%rbp) - - vperm2i128 $0x13,%ymm0,%ymm4,%ymm0 - vperm2i128 $0x13,%ymm8,%ymm12,%ymm4 - vperm2i128 $0x02,%ymm1,%ymm5,%ymm8 - vperm2i128 $0x02,%ymm9,%ymm13,%ymm12 - vperm2i128 $0x13,%ymm1,%ymm5,%ymm1 - vperm2i128 $0x13,%ymm9,%ymm13,%ymm5 - vperm2i128 $0x02,%ymm2,%ymm6,%ymm9 - vperm2i128 $0x02,%ymm10,%ymm14,%ymm13 - vperm2i128 $0x13,%ymm2,%ymm6,%ymm2 - vperm2i128 $0x13,%ymm10,%ymm14,%ymm6 - jmp L$open_avx2_short - - - - - -.p2align 6 -chacha20_poly1305_seal_avx2: - - - - - - - - - - - - - vzeroupper - vmovdqa L$chacha20_consts(%rip),%ymm0 - vbroadcasti128 0(%r9),%ymm4 - vbroadcasti128 16(%r9),%ymm8 - vbroadcasti128 32(%r9),%ymm12 - vpaddd L$avx2_init(%rip),%ymm12,%ymm12 - cmpq $192,%rbx - jbe L$seal_avx2_192 - cmpq $320,%rbx - jbe L$seal_avx2_320 - vmovdqa %ymm0,%ymm1 - vmovdqa %ymm0,%ymm2 - vmovdqa %ymm0,%ymm3 - vmovdqa %ymm4,%ymm5 - vmovdqa %ymm4,%ymm6 - vmovdqa %ymm4,%ymm7 - vmovdqa %ymm4,0+64(%rbp) - vmovdqa %ymm8,%ymm9 - vmovdqa %ymm8,%ymm10 - vmovdqa %ymm8,%ymm11 - vmovdqa %ymm8,0+96(%rbp) - vmovdqa %ymm12,%ymm15 - vpaddd L$avx2_inc(%rip),%ymm15,%ymm14 - vpaddd L$avx2_inc(%rip),%ymm14,%ymm13 - vpaddd L$avx2_inc(%rip),%ymm13,%ymm12 - vmovdqa %ymm12,0+160(%rbp) - vmovdqa %ymm13,0+192(%rbp) - vmovdqa %ymm14,0+224(%rbp) - vmovdqa %ymm15,0+256(%rbp) - movq $10,%r10 -L$seal_avx2_init_rounds: - vmovdqa %ymm8,0+128(%rbp) - vmovdqa L$rol16(%rip),%ymm8 - vpaddd %ymm7,%ymm3,%ymm3 - vpaddd %ymm6,%ymm2,%ymm2 - vpaddd %ymm5,%ymm1,%ymm1 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm3,%ymm15,%ymm15 - vpxor %ymm2,%ymm14,%ymm14 - vpxor %ymm1,%ymm13,%ymm13 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb %ymm8,%ymm15,%ymm15 - vpshufb %ymm8,%ymm14,%ymm14 - vpshufb %ymm8,%ymm13,%ymm13 - vpshufb %ymm8,%ymm12,%ymm12 - vpaddd %ymm15,%ymm11,%ymm11 - vpaddd %ymm14,%ymm10,%ymm10 - vpaddd %ymm13,%ymm9,%ymm9 - vpaddd 0+128(%rbp),%ymm12,%ymm8 - vpxor %ymm11,%ymm7,%ymm7 - vpxor %ymm10,%ymm6,%ymm6 - vpxor %ymm9,%ymm5,%ymm5 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa %ymm8,0+128(%rbp) - vpsrld $20,%ymm7,%ymm8 - vpslld $32-20,%ymm7,%ymm7 - vpxor %ymm8,%ymm7,%ymm7 - vpsrld $20,%ymm6,%ymm8 - vpslld $32-20,%ymm6,%ymm6 - vpxor %ymm8,%ymm6,%ymm6 - vpsrld $20,%ymm5,%ymm8 - vpslld $32-20,%ymm5,%ymm5 - vpxor %ymm8,%ymm5,%ymm5 - vpsrld $20,%ymm4,%ymm8 - vpslld $32-20,%ymm4,%ymm4 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa L$rol8(%rip),%ymm8 - vpaddd %ymm7,%ymm3,%ymm3 - vpaddd %ymm6,%ymm2,%ymm2 - vpaddd %ymm5,%ymm1,%ymm1 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm3,%ymm15,%ymm15 - vpxor %ymm2,%ymm14,%ymm14 - vpxor %ymm1,%ymm13,%ymm13 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb %ymm8,%ymm15,%ymm15 - vpshufb %ymm8,%ymm14,%ymm14 - vpshufb %ymm8,%ymm13,%ymm13 - vpshufb %ymm8,%ymm12,%ymm12 - vpaddd %ymm15,%ymm11,%ymm11 - vpaddd %ymm14,%ymm10,%ymm10 - vpaddd %ymm13,%ymm9,%ymm9 - vpaddd 0+128(%rbp),%ymm12,%ymm8 - vpxor %ymm11,%ymm7,%ymm7 - vpxor %ymm10,%ymm6,%ymm6 - vpxor %ymm9,%ymm5,%ymm5 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa %ymm8,0+128(%rbp) - vpsrld $25,%ymm7,%ymm8 - vpslld $32-25,%ymm7,%ymm7 - vpxor %ymm8,%ymm7,%ymm7 - vpsrld $25,%ymm6,%ymm8 - vpslld $32-25,%ymm6,%ymm6 - vpxor %ymm8,%ymm6,%ymm6 - vpsrld $25,%ymm5,%ymm8 - vpslld $32-25,%ymm5,%ymm5 - vpxor %ymm8,%ymm5,%ymm5 - vpsrld $25,%ymm4,%ymm8 - vpslld $32-25,%ymm4,%ymm4 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa 0+128(%rbp),%ymm8 - vpalignr $4,%ymm7,%ymm7,%ymm7 - vpalignr $8,%ymm11,%ymm11,%ymm11 - vpalignr $12,%ymm15,%ymm15,%ymm15 - vpalignr $4,%ymm6,%ymm6,%ymm6 - vpalignr $8,%ymm10,%ymm10,%ymm10 - vpalignr $12,%ymm14,%ymm14,%ymm14 - vpalignr $4,%ymm5,%ymm5,%ymm5 - vpalignr $8,%ymm9,%ymm9,%ymm9 - vpalignr $12,%ymm13,%ymm13,%ymm13 - vpalignr $4,%ymm4,%ymm4,%ymm4 - vpalignr $8,%ymm8,%ymm8,%ymm8 - vpalignr $12,%ymm12,%ymm12,%ymm12 - vmovdqa %ymm8,0+128(%rbp) - vmovdqa L$rol16(%rip),%ymm8 - vpaddd %ymm7,%ymm3,%ymm3 - vpaddd %ymm6,%ymm2,%ymm2 - vpaddd %ymm5,%ymm1,%ymm1 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm3,%ymm15,%ymm15 - vpxor %ymm2,%ymm14,%ymm14 - vpxor %ymm1,%ymm13,%ymm13 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb %ymm8,%ymm15,%ymm15 - vpshufb %ymm8,%ymm14,%ymm14 - vpshufb %ymm8,%ymm13,%ymm13 - vpshufb %ymm8,%ymm12,%ymm12 - vpaddd %ymm15,%ymm11,%ymm11 - vpaddd %ymm14,%ymm10,%ymm10 - vpaddd %ymm13,%ymm9,%ymm9 - vpaddd 0+128(%rbp),%ymm12,%ymm8 - vpxor %ymm11,%ymm7,%ymm7 - vpxor %ymm10,%ymm6,%ymm6 - vpxor %ymm9,%ymm5,%ymm5 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa %ymm8,0+128(%rbp) - vpsrld $20,%ymm7,%ymm8 - vpslld $32-20,%ymm7,%ymm7 - vpxor %ymm8,%ymm7,%ymm7 - vpsrld $20,%ymm6,%ymm8 - vpslld $32-20,%ymm6,%ymm6 - vpxor %ymm8,%ymm6,%ymm6 - vpsrld $20,%ymm5,%ymm8 - vpslld $32-20,%ymm5,%ymm5 - vpxor %ymm8,%ymm5,%ymm5 - vpsrld $20,%ymm4,%ymm8 - vpslld $32-20,%ymm4,%ymm4 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa L$rol8(%rip),%ymm8 - vpaddd %ymm7,%ymm3,%ymm3 - vpaddd %ymm6,%ymm2,%ymm2 - vpaddd %ymm5,%ymm1,%ymm1 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm3,%ymm15,%ymm15 - vpxor %ymm2,%ymm14,%ymm14 - vpxor %ymm1,%ymm13,%ymm13 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb %ymm8,%ymm15,%ymm15 - vpshufb %ymm8,%ymm14,%ymm14 - vpshufb %ymm8,%ymm13,%ymm13 - vpshufb %ymm8,%ymm12,%ymm12 - vpaddd %ymm15,%ymm11,%ymm11 - vpaddd %ymm14,%ymm10,%ymm10 - vpaddd %ymm13,%ymm9,%ymm9 - vpaddd 0+128(%rbp),%ymm12,%ymm8 - vpxor %ymm11,%ymm7,%ymm7 - vpxor %ymm10,%ymm6,%ymm6 - vpxor %ymm9,%ymm5,%ymm5 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa %ymm8,0+128(%rbp) - vpsrld $25,%ymm7,%ymm8 - vpslld $32-25,%ymm7,%ymm7 - vpxor %ymm8,%ymm7,%ymm7 - vpsrld $25,%ymm6,%ymm8 - vpslld $32-25,%ymm6,%ymm6 - vpxor %ymm8,%ymm6,%ymm6 - vpsrld $25,%ymm5,%ymm8 - vpslld $32-25,%ymm5,%ymm5 - vpxor %ymm8,%ymm5,%ymm5 - vpsrld $25,%ymm4,%ymm8 - vpslld $32-25,%ymm4,%ymm4 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa 0+128(%rbp),%ymm8 - vpalignr $12,%ymm7,%ymm7,%ymm7 - vpalignr $8,%ymm11,%ymm11,%ymm11 - vpalignr $4,%ymm15,%ymm15,%ymm15 - vpalignr $12,%ymm6,%ymm6,%ymm6 - vpalignr $8,%ymm10,%ymm10,%ymm10 - vpalignr $4,%ymm14,%ymm14,%ymm14 - vpalignr $12,%ymm5,%ymm5,%ymm5 - vpalignr $8,%ymm9,%ymm9,%ymm9 - vpalignr $4,%ymm13,%ymm13,%ymm13 - vpalignr $12,%ymm4,%ymm4,%ymm4 - vpalignr $8,%ymm8,%ymm8,%ymm8 - vpalignr $4,%ymm12,%ymm12,%ymm12 - - decq %r10 - jnz L$seal_avx2_init_rounds - vpaddd L$chacha20_consts(%rip),%ymm3,%ymm3 - vpaddd 0+64(%rbp),%ymm7,%ymm7 - vpaddd 0+96(%rbp),%ymm11,%ymm11 - vpaddd 0+256(%rbp),%ymm15,%ymm15 - vpaddd L$chacha20_consts(%rip),%ymm2,%ymm2 - vpaddd 0+64(%rbp),%ymm6,%ymm6 - vpaddd 0+96(%rbp),%ymm10,%ymm10 - vpaddd 0+224(%rbp),%ymm14,%ymm14 - vpaddd L$chacha20_consts(%rip),%ymm1,%ymm1 - vpaddd 0+64(%rbp),%ymm5,%ymm5 - vpaddd 0+96(%rbp),%ymm9,%ymm9 - vpaddd 0+192(%rbp),%ymm13,%ymm13 - vpaddd L$chacha20_consts(%rip),%ymm0,%ymm0 - vpaddd 0+64(%rbp),%ymm4,%ymm4 - vpaddd 0+96(%rbp),%ymm8,%ymm8 - vpaddd 0+160(%rbp),%ymm12,%ymm12 - - vperm2i128 $0x13,%ymm11,%ymm15,%ymm11 - vperm2i128 $0x02,%ymm3,%ymm7,%ymm15 - vperm2i128 $0x13,%ymm3,%ymm7,%ymm3 - vpand L$clamp(%rip),%ymm15,%ymm15 - vmovdqa %ymm15,0+0(%rbp) - movq %r8,%r8 - call poly_hash_ad_internal - - vpxor 0(%rsi),%ymm3,%ymm3 - vpxor 32(%rsi),%ymm11,%ymm11 - vmovdqu %ymm3,0(%rdi) - vmovdqu %ymm11,32(%rdi) - vperm2i128 $0x02,%ymm2,%ymm6,%ymm15 - vperm2i128 $0x13,%ymm2,%ymm6,%ymm6 - vperm2i128 $0x02,%ymm10,%ymm14,%ymm2 - vperm2i128 $0x13,%ymm10,%ymm14,%ymm10 - vpxor 0+64(%rsi),%ymm15,%ymm15 - vpxor 32+64(%rsi),%ymm2,%ymm2 - vpxor 64+64(%rsi),%ymm6,%ymm6 - vpxor 96+64(%rsi),%ymm10,%ymm10 - vmovdqu %ymm15,0+64(%rdi) - vmovdqu %ymm2,32+64(%rdi) - vmovdqu %ymm6,64+64(%rdi) - vmovdqu %ymm10,96+64(%rdi) - vperm2i128 $0x02,%ymm1,%ymm5,%ymm15 - vperm2i128 $0x13,%ymm1,%ymm5,%ymm5 - vperm2i128 $0x02,%ymm9,%ymm13,%ymm1 - vperm2i128 $0x13,%ymm9,%ymm13,%ymm9 - vpxor 0+192(%rsi),%ymm15,%ymm15 - vpxor 32+192(%rsi),%ymm1,%ymm1 - vpxor 64+192(%rsi),%ymm5,%ymm5 - vpxor 96+192(%rsi),%ymm9,%ymm9 - vmovdqu %ymm15,0+192(%rdi) - vmovdqu %ymm1,32+192(%rdi) - vmovdqu %ymm5,64+192(%rdi) - vmovdqu %ymm9,96+192(%rdi) - vperm2i128 $0x13,%ymm0,%ymm4,%ymm15 - vperm2i128 $0x02,%ymm0,%ymm4,%ymm0 - vperm2i128 $0x02,%ymm8,%ymm12,%ymm4 - vperm2i128 $0x13,%ymm8,%ymm12,%ymm12 - vmovdqa %ymm15,%ymm8 - - leaq 320(%rsi),%rsi - subq $320,%rbx - movq $320,%rcx - cmpq $128,%rbx - jbe L$seal_avx2_short_hash_remainder - vpxor 0(%rsi),%ymm0,%ymm0 - vpxor 32(%rsi),%ymm4,%ymm4 - vpxor 64(%rsi),%ymm8,%ymm8 - vpxor 96(%rsi),%ymm12,%ymm12 - vmovdqu %ymm0,320(%rdi) - vmovdqu %ymm4,352(%rdi) - vmovdqu %ymm8,384(%rdi) - vmovdqu %ymm12,416(%rdi) - leaq 128(%rsi),%rsi - subq $128,%rbx - movq $8,%rcx - movq $2,%r8 - cmpq $128,%rbx - jbe L$seal_avx2_tail_128 - cmpq $256,%rbx - jbe L$seal_avx2_tail_256 - cmpq $384,%rbx - jbe L$seal_avx2_tail_384 - cmpq $512,%rbx - jbe L$seal_avx2_tail_512 - vmovdqa L$chacha20_consts(%rip),%ymm0 - vmovdqa 0+64(%rbp),%ymm4 - vmovdqa 0+96(%rbp),%ymm8 - vmovdqa %ymm0,%ymm1 - vmovdqa %ymm4,%ymm5 - vmovdqa %ymm8,%ymm9 - vmovdqa %ymm0,%ymm2 - vmovdqa %ymm4,%ymm6 - vmovdqa %ymm8,%ymm10 - vmovdqa %ymm0,%ymm3 - vmovdqa %ymm4,%ymm7 - vmovdqa %ymm8,%ymm11 - vmovdqa L$avx2_inc(%rip),%ymm12 - vpaddd 0+160(%rbp),%ymm12,%ymm15 - vpaddd %ymm15,%ymm12,%ymm14 - vpaddd %ymm14,%ymm12,%ymm13 - vpaddd %ymm13,%ymm12,%ymm12 - vmovdqa %ymm15,0+256(%rbp) - vmovdqa %ymm14,0+224(%rbp) - vmovdqa %ymm13,0+192(%rbp) - vmovdqa %ymm12,0+160(%rbp) - vmovdqa %ymm8,0+128(%rbp) - vmovdqa L$rol16(%rip),%ymm8 - vpaddd %ymm7,%ymm3,%ymm3 - vpaddd %ymm6,%ymm2,%ymm2 - vpaddd %ymm5,%ymm1,%ymm1 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm3,%ymm15,%ymm15 - vpxor %ymm2,%ymm14,%ymm14 - vpxor %ymm1,%ymm13,%ymm13 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb %ymm8,%ymm15,%ymm15 - vpshufb %ymm8,%ymm14,%ymm14 - vpshufb %ymm8,%ymm13,%ymm13 - vpshufb %ymm8,%ymm12,%ymm12 - vpaddd %ymm15,%ymm11,%ymm11 - vpaddd %ymm14,%ymm10,%ymm10 - vpaddd %ymm13,%ymm9,%ymm9 - vpaddd 0+128(%rbp),%ymm12,%ymm8 - vpxor %ymm11,%ymm7,%ymm7 - vpxor %ymm10,%ymm6,%ymm6 - vpxor %ymm9,%ymm5,%ymm5 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa %ymm8,0+128(%rbp) - vpsrld $20,%ymm7,%ymm8 - vpslld $32-20,%ymm7,%ymm7 - vpxor %ymm8,%ymm7,%ymm7 - vpsrld $20,%ymm6,%ymm8 - vpslld $32-20,%ymm6,%ymm6 - vpxor %ymm8,%ymm6,%ymm6 - vpsrld $20,%ymm5,%ymm8 - vpslld $32-20,%ymm5,%ymm5 - vpxor %ymm8,%ymm5,%ymm5 - vpsrld $20,%ymm4,%ymm8 - vpslld $32-20,%ymm4,%ymm4 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa L$rol8(%rip),%ymm8 - vpaddd %ymm7,%ymm3,%ymm3 - vpaddd %ymm6,%ymm2,%ymm2 - vpaddd %ymm5,%ymm1,%ymm1 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm3,%ymm15,%ymm15 - vpxor %ymm2,%ymm14,%ymm14 - vpxor %ymm1,%ymm13,%ymm13 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb %ymm8,%ymm15,%ymm15 - vpshufb %ymm8,%ymm14,%ymm14 - vpshufb %ymm8,%ymm13,%ymm13 - vpshufb %ymm8,%ymm12,%ymm12 - vpaddd %ymm15,%ymm11,%ymm11 - vpaddd %ymm14,%ymm10,%ymm10 - vpaddd %ymm13,%ymm9,%ymm9 - vpaddd 0+128(%rbp),%ymm12,%ymm8 - vpxor %ymm11,%ymm7,%ymm7 - vpxor %ymm10,%ymm6,%ymm6 - vpxor %ymm9,%ymm5,%ymm5 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa %ymm8,0+128(%rbp) - vpsrld $25,%ymm7,%ymm8 - vpslld $32-25,%ymm7,%ymm7 - vpxor %ymm8,%ymm7,%ymm7 - vpsrld $25,%ymm6,%ymm8 - vpslld $32-25,%ymm6,%ymm6 - vpxor %ymm8,%ymm6,%ymm6 - vpsrld $25,%ymm5,%ymm8 - vpslld $32-25,%ymm5,%ymm5 - vpxor %ymm8,%ymm5,%ymm5 - vpsrld $25,%ymm4,%ymm8 - vpslld $32-25,%ymm4,%ymm4 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa 0+128(%rbp),%ymm8 - vpalignr $4,%ymm7,%ymm7,%ymm7 - vpalignr $8,%ymm11,%ymm11,%ymm11 - vpalignr $12,%ymm15,%ymm15,%ymm15 - vpalignr $4,%ymm6,%ymm6,%ymm6 - vpalignr $8,%ymm10,%ymm10,%ymm10 - vpalignr $12,%ymm14,%ymm14,%ymm14 - vpalignr $4,%ymm5,%ymm5,%ymm5 - vpalignr $8,%ymm9,%ymm9,%ymm9 - vpalignr $12,%ymm13,%ymm13,%ymm13 - vpalignr $4,%ymm4,%ymm4,%ymm4 - vpalignr $8,%ymm8,%ymm8,%ymm8 - vpalignr $12,%ymm12,%ymm12,%ymm12 - vmovdqa %ymm8,0+128(%rbp) - vmovdqa L$rol16(%rip),%ymm8 - vpaddd %ymm7,%ymm3,%ymm3 - vpaddd %ymm6,%ymm2,%ymm2 - vpaddd %ymm5,%ymm1,%ymm1 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm3,%ymm15,%ymm15 - vpxor %ymm2,%ymm14,%ymm14 - vpxor %ymm1,%ymm13,%ymm13 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb %ymm8,%ymm15,%ymm15 - vpshufb %ymm8,%ymm14,%ymm14 - vpshufb %ymm8,%ymm13,%ymm13 - vpshufb %ymm8,%ymm12,%ymm12 - vpaddd %ymm15,%ymm11,%ymm11 - vpaddd %ymm14,%ymm10,%ymm10 - vpaddd %ymm13,%ymm9,%ymm9 - vpaddd 0+128(%rbp),%ymm12,%ymm8 - vpxor %ymm11,%ymm7,%ymm7 - vpxor %ymm10,%ymm6,%ymm6 - vpxor %ymm9,%ymm5,%ymm5 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa %ymm8,0+128(%rbp) - vpsrld $20,%ymm7,%ymm8 - vpslld $32-20,%ymm7,%ymm7 - vpxor %ymm8,%ymm7,%ymm7 - vpsrld $20,%ymm6,%ymm8 - vpslld $32-20,%ymm6,%ymm6 - vpxor %ymm8,%ymm6,%ymm6 - vpsrld $20,%ymm5,%ymm8 - vpslld $32-20,%ymm5,%ymm5 - vpxor %ymm8,%ymm5,%ymm5 - vpsrld $20,%ymm4,%ymm8 - vpslld $32-20,%ymm4,%ymm4 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa L$rol8(%rip),%ymm8 - vpaddd %ymm7,%ymm3,%ymm3 - vpaddd %ymm6,%ymm2,%ymm2 - vpaddd %ymm5,%ymm1,%ymm1 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm3,%ymm15,%ymm15 - vpxor %ymm2,%ymm14,%ymm14 - vpxor %ymm1,%ymm13,%ymm13 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb %ymm8,%ymm15,%ymm15 - vpshufb %ymm8,%ymm14,%ymm14 - vpshufb %ymm8,%ymm13,%ymm13 - vpshufb %ymm8,%ymm12,%ymm12 - vpaddd %ymm15,%ymm11,%ymm11 - vpaddd %ymm14,%ymm10,%ymm10 - vpaddd %ymm13,%ymm9,%ymm9 - vpaddd 0+128(%rbp),%ymm12,%ymm8 - vpxor %ymm11,%ymm7,%ymm7 - vpxor %ymm10,%ymm6,%ymm6 - vpxor %ymm9,%ymm5,%ymm5 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa %ymm8,0+128(%rbp) - vpsrld $25,%ymm7,%ymm8 - vpslld $32-25,%ymm7,%ymm7 - vpxor %ymm8,%ymm7,%ymm7 - vpsrld $25,%ymm6,%ymm8 - vpslld $32-25,%ymm6,%ymm6 - vpxor %ymm8,%ymm6,%ymm6 - vpsrld $25,%ymm5,%ymm8 - vpslld $32-25,%ymm5,%ymm5 - vpxor %ymm8,%ymm5,%ymm5 - vpsrld $25,%ymm4,%ymm8 - vpslld $32-25,%ymm4,%ymm4 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa 0+128(%rbp),%ymm8 - vpalignr $12,%ymm7,%ymm7,%ymm7 - vpalignr $8,%ymm11,%ymm11,%ymm11 - vpalignr $4,%ymm15,%ymm15,%ymm15 - vpalignr $12,%ymm6,%ymm6,%ymm6 - vpalignr $8,%ymm10,%ymm10,%ymm10 - vpalignr $4,%ymm14,%ymm14,%ymm14 - vpalignr $12,%ymm5,%ymm5,%ymm5 - vpalignr $8,%ymm9,%ymm9,%ymm9 - vpalignr $4,%ymm13,%ymm13,%ymm13 - vpalignr $12,%ymm4,%ymm4,%ymm4 - vpalignr $8,%ymm8,%ymm8,%ymm8 - vpalignr $4,%ymm12,%ymm12,%ymm12 - vmovdqa %ymm8,0+128(%rbp) - vmovdqa L$rol16(%rip),%ymm8 - vpaddd %ymm7,%ymm3,%ymm3 - vpaddd %ymm6,%ymm2,%ymm2 - vpaddd %ymm5,%ymm1,%ymm1 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm3,%ymm15,%ymm15 - vpxor %ymm2,%ymm14,%ymm14 - vpxor %ymm1,%ymm13,%ymm13 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb %ymm8,%ymm15,%ymm15 - vpshufb %ymm8,%ymm14,%ymm14 - vpshufb %ymm8,%ymm13,%ymm13 - vpshufb %ymm8,%ymm12,%ymm12 - vpaddd %ymm15,%ymm11,%ymm11 - vpaddd %ymm14,%ymm10,%ymm10 - vpaddd %ymm13,%ymm9,%ymm9 - vpaddd 0+128(%rbp),%ymm12,%ymm8 - vpxor %ymm11,%ymm7,%ymm7 - vpxor %ymm10,%ymm6,%ymm6 - vpxor %ymm9,%ymm5,%ymm5 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa %ymm8,0+128(%rbp) - vpsrld $20,%ymm7,%ymm8 - vpslld $32-20,%ymm7,%ymm7 - vpxor %ymm8,%ymm7,%ymm7 - vpsrld $20,%ymm6,%ymm8 - vpslld $32-20,%ymm6,%ymm6 - vpxor %ymm8,%ymm6,%ymm6 - vpsrld $20,%ymm5,%ymm8 - vpslld $32-20,%ymm5,%ymm5 - vpxor %ymm8,%ymm5,%ymm5 - vpsrld $20,%ymm4,%ymm8 - vpslld $32-20,%ymm4,%ymm4 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa L$rol8(%rip),%ymm8 - vpaddd %ymm7,%ymm3,%ymm3 - vpaddd %ymm6,%ymm2,%ymm2 - vpaddd %ymm5,%ymm1,%ymm1 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm3,%ymm15,%ymm15 - - subq $16,%rdi - movq $9,%rcx - jmp L$seal_avx2_main_loop_rounds_entry -.p2align 5 -L$seal_avx2_main_loop: - vmovdqa L$chacha20_consts(%rip),%ymm0 - vmovdqa 0+64(%rbp),%ymm4 - vmovdqa 0+96(%rbp),%ymm8 - vmovdqa %ymm0,%ymm1 - vmovdqa %ymm4,%ymm5 - vmovdqa %ymm8,%ymm9 - vmovdqa %ymm0,%ymm2 - vmovdqa %ymm4,%ymm6 - vmovdqa %ymm8,%ymm10 - vmovdqa %ymm0,%ymm3 - vmovdqa %ymm4,%ymm7 - vmovdqa %ymm8,%ymm11 - vmovdqa L$avx2_inc(%rip),%ymm12 - vpaddd 0+160(%rbp),%ymm12,%ymm15 - vpaddd %ymm15,%ymm12,%ymm14 - vpaddd %ymm14,%ymm12,%ymm13 - vpaddd %ymm13,%ymm12,%ymm12 - vmovdqa %ymm15,0+256(%rbp) - vmovdqa %ymm14,0+224(%rbp) - vmovdqa %ymm13,0+192(%rbp) - vmovdqa %ymm12,0+160(%rbp) - - movq $10,%rcx -.p2align 5 -L$seal_avx2_main_loop_rounds: - addq 0+0(%rdi),%r10 - adcq 8+0(%rdi),%r11 - adcq $1,%r12 - vmovdqa %ymm8,0+128(%rbp) - vmovdqa L$rol16(%rip),%ymm8 - vpaddd %ymm7,%ymm3,%ymm3 - vpaddd %ymm6,%ymm2,%ymm2 - vpaddd %ymm5,%ymm1,%ymm1 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm3,%ymm15,%ymm15 - vpxor %ymm2,%ymm14,%ymm14 - vpxor %ymm1,%ymm13,%ymm13 - vpxor %ymm0,%ymm12,%ymm12 - movq 0+0+0(%rbp),%rdx - movq %rdx,%r15 - mulxq %r10,%r13,%r14 - mulxq %r11,%rax,%rdx - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - vpshufb %ymm8,%ymm15,%ymm15 - vpshufb %ymm8,%ymm14,%ymm14 - vpshufb %ymm8,%ymm13,%ymm13 - vpshufb %ymm8,%ymm12,%ymm12 - vpaddd %ymm15,%ymm11,%ymm11 - vpaddd %ymm14,%ymm10,%ymm10 - vpaddd %ymm13,%ymm9,%ymm9 - vpaddd 0+128(%rbp),%ymm12,%ymm8 - vpxor %ymm11,%ymm7,%ymm7 - movq 8+0+0(%rbp),%rdx - mulxq %r10,%r10,%rax - addq %r10,%r14 - mulxq %r11,%r11,%r9 - adcq %r11,%r15 - adcq $0,%r9 - imulq %r12,%rdx - vpxor %ymm10,%ymm6,%ymm6 - vpxor %ymm9,%ymm5,%ymm5 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa %ymm8,0+128(%rbp) - vpsrld $20,%ymm7,%ymm8 - vpslld $32-20,%ymm7,%ymm7 - vpxor %ymm8,%ymm7,%ymm7 - vpsrld $20,%ymm6,%ymm8 - vpslld $32-20,%ymm6,%ymm6 - vpxor %ymm8,%ymm6,%ymm6 - vpsrld $20,%ymm5,%ymm8 - vpslld $32-20,%ymm5,%ymm5 - addq %rax,%r15 - adcq %rdx,%r9 - vpxor %ymm8,%ymm5,%ymm5 - vpsrld $20,%ymm4,%ymm8 - vpslld $32-20,%ymm4,%ymm4 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa L$rol8(%rip),%ymm8 - vpaddd %ymm7,%ymm3,%ymm3 - vpaddd %ymm6,%ymm2,%ymm2 - vpaddd %ymm5,%ymm1,%ymm1 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm3,%ymm15,%ymm15 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - -L$seal_avx2_main_loop_rounds_entry: - vpxor %ymm2,%ymm14,%ymm14 - vpxor %ymm1,%ymm13,%ymm13 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb %ymm8,%ymm15,%ymm15 - vpshufb %ymm8,%ymm14,%ymm14 - vpshufb %ymm8,%ymm13,%ymm13 - vpshufb %ymm8,%ymm12,%ymm12 - vpaddd %ymm15,%ymm11,%ymm11 - vpaddd %ymm14,%ymm10,%ymm10 - addq 0+16(%rdi),%r10 - adcq 8+16(%rdi),%r11 - adcq $1,%r12 - vpaddd %ymm13,%ymm9,%ymm9 - vpaddd 0+128(%rbp),%ymm12,%ymm8 - vpxor %ymm11,%ymm7,%ymm7 - vpxor %ymm10,%ymm6,%ymm6 - vpxor %ymm9,%ymm5,%ymm5 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa %ymm8,0+128(%rbp) - vpsrld $25,%ymm7,%ymm8 - movq 0+0+0(%rbp),%rdx - movq %rdx,%r15 - mulxq %r10,%r13,%r14 - mulxq %r11,%rax,%rdx - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - vpslld $32-25,%ymm7,%ymm7 - vpxor %ymm8,%ymm7,%ymm7 - vpsrld $25,%ymm6,%ymm8 - vpslld $32-25,%ymm6,%ymm6 - vpxor %ymm8,%ymm6,%ymm6 - vpsrld $25,%ymm5,%ymm8 - vpslld $32-25,%ymm5,%ymm5 - vpxor %ymm8,%ymm5,%ymm5 - vpsrld $25,%ymm4,%ymm8 - vpslld $32-25,%ymm4,%ymm4 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa 0+128(%rbp),%ymm8 - vpalignr $4,%ymm7,%ymm7,%ymm7 - vpalignr $8,%ymm11,%ymm11,%ymm11 - vpalignr $12,%ymm15,%ymm15,%ymm15 - vpalignr $4,%ymm6,%ymm6,%ymm6 - vpalignr $8,%ymm10,%ymm10,%ymm10 - vpalignr $12,%ymm14,%ymm14,%ymm14 - movq 8+0+0(%rbp),%rdx - mulxq %r10,%r10,%rax - addq %r10,%r14 - mulxq %r11,%r11,%r9 - adcq %r11,%r15 - adcq $0,%r9 - imulq %r12,%rdx - vpalignr $4,%ymm5,%ymm5,%ymm5 - vpalignr $8,%ymm9,%ymm9,%ymm9 - vpalignr $12,%ymm13,%ymm13,%ymm13 - vpalignr $4,%ymm4,%ymm4,%ymm4 - vpalignr $8,%ymm8,%ymm8,%ymm8 - vpalignr $12,%ymm12,%ymm12,%ymm12 - vmovdqa %ymm8,0+128(%rbp) - vmovdqa L$rol16(%rip),%ymm8 - vpaddd %ymm7,%ymm3,%ymm3 - vpaddd %ymm6,%ymm2,%ymm2 - vpaddd %ymm5,%ymm1,%ymm1 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm3,%ymm15,%ymm15 - vpxor %ymm2,%ymm14,%ymm14 - vpxor %ymm1,%ymm13,%ymm13 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb %ymm8,%ymm15,%ymm15 - vpshufb %ymm8,%ymm14,%ymm14 - addq %rax,%r15 - adcq %rdx,%r9 - vpshufb %ymm8,%ymm13,%ymm13 - vpshufb %ymm8,%ymm12,%ymm12 - vpaddd %ymm15,%ymm11,%ymm11 - vpaddd %ymm14,%ymm10,%ymm10 - vpaddd %ymm13,%ymm9,%ymm9 - vpaddd 0+128(%rbp),%ymm12,%ymm8 - vpxor %ymm11,%ymm7,%ymm7 - vpxor %ymm10,%ymm6,%ymm6 - vpxor %ymm9,%ymm5,%ymm5 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa %ymm8,0+128(%rbp) - vpsrld $20,%ymm7,%ymm8 - vpslld $32-20,%ymm7,%ymm7 - vpxor %ymm8,%ymm7,%ymm7 - vpsrld $20,%ymm6,%ymm8 - vpslld $32-20,%ymm6,%ymm6 - vpxor %ymm8,%ymm6,%ymm6 - addq 0+32(%rdi),%r10 - adcq 8+32(%rdi),%r11 - adcq $1,%r12 - - leaq 48(%rdi),%rdi - vpsrld $20,%ymm5,%ymm8 - vpslld $32-20,%ymm5,%ymm5 - vpxor %ymm8,%ymm5,%ymm5 - vpsrld $20,%ymm4,%ymm8 - vpslld $32-20,%ymm4,%ymm4 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa L$rol8(%rip),%ymm8 - vpaddd %ymm7,%ymm3,%ymm3 - vpaddd %ymm6,%ymm2,%ymm2 - vpaddd %ymm5,%ymm1,%ymm1 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm3,%ymm15,%ymm15 - vpxor %ymm2,%ymm14,%ymm14 - vpxor %ymm1,%ymm13,%ymm13 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb %ymm8,%ymm15,%ymm15 - vpshufb %ymm8,%ymm14,%ymm14 - vpshufb %ymm8,%ymm13,%ymm13 - movq 0+0+0(%rbp),%rdx - movq %rdx,%r15 - mulxq %r10,%r13,%r14 - mulxq %r11,%rax,%rdx - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - vpshufb %ymm8,%ymm12,%ymm12 - vpaddd %ymm15,%ymm11,%ymm11 - vpaddd %ymm14,%ymm10,%ymm10 - vpaddd %ymm13,%ymm9,%ymm9 - vpaddd 0+128(%rbp),%ymm12,%ymm8 - vpxor %ymm11,%ymm7,%ymm7 - vpxor %ymm10,%ymm6,%ymm6 - vpxor %ymm9,%ymm5,%ymm5 - movq 8+0+0(%rbp),%rdx - mulxq %r10,%r10,%rax - addq %r10,%r14 - mulxq %r11,%r11,%r9 - adcq %r11,%r15 - adcq $0,%r9 - imulq %r12,%rdx - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa %ymm8,0+128(%rbp) - vpsrld $25,%ymm7,%ymm8 - vpslld $32-25,%ymm7,%ymm7 - vpxor %ymm8,%ymm7,%ymm7 - vpsrld $25,%ymm6,%ymm8 - vpslld $32-25,%ymm6,%ymm6 - vpxor %ymm8,%ymm6,%ymm6 - addq %rax,%r15 - adcq %rdx,%r9 - vpsrld $25,%ymm5,%ymm8 - vpslld $32-25,%ymm5,%ymm5 - vpxor %ymm8,%ymm5,%ymm5 - vpsrld $25,%ymm4,%ymm8 - vpslld $32-25,%ymm4,%ymm4 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa 0+128(%rbp),%ymm8 - vpalignr $12,%ymm7,%ymm7,%ymm7 - vpalignr $8,%ymm11,%ymm11,%ymm11 - vpalignr $4,%ymm15,%ymm15,%ymm15 - vpalignr $12,%ymm6,%ymm6,%ymm6 - vpalignr $8,%ymm10,%ymm10,%ymm10 - vpalignr $4,%ymm14,%ymm14,%ymm14 - vpalignr $12,%ymm5,%ymm5,%ymm5 - vpalignr $8,%ymm9,%ymm9,%ymm9 - vpalignr $4,%ymm13,%ymm13,%ymm13 - vpalignr $12,%ymm4,%ymm4,%ymm4 - vpalignr $8,%ymm8,%ymm8,%ymm8 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - vpalignr $4,%ymm12,%ymm12,%ymm12 - - decq %rcx - jne L$seal_avx2_main_loop_rounds - vpaddd L$chacha20_consts(%rip),%ymm3,%ymm3 - vpaddd 0+64(%rbp),%ymm7,%ymm7 - vpaddd 0+96(%rbp),%ymm11,%ymm11 - vpaddd 0+256(%rbp),%ymm15,%ymm15 - vpaddd L$chacha20_consts(%rip),%ymm2,%ymm2 - vpaddd 0+64(%rbp),%ymm6,%ymm6 - vpaddd 0+96(%rbp),%ymm10,%ymm10 - vpaddd 0+224(%rbp),%ymm14,%ymm14 - vpaddd L$chacha20_consts(%rip),%ymm1,%ymm1 - vpaddd 0+64(%rbp),%ymm5,%ymm5 - vpaddd 0+96(%rbp),%ymm9,%ymm9 - vpaddd 0+192(%rbp),%ymm13,%ymm13 - vpaddd L$chacha20_consts(%rip),%ymm0,%ymm0 - vpaddd 0+64(%rbp),%ymm4,%ymm4 - vpaddd 0+96(%rbp),%ymm8,%ymm8 - vpaddd 0+160(%rbp),%ymm12,%ymm12 - - vmovdqa %ymm0,0+128(%rbp) - addq 0+0(%rdi),%r10 - adcq 8+0(%rdi),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rdx - movq %rdx,%r15 - mulxq %r10,%r13,%r14 - mulxq %r11,%rax,%rdx - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rdx - mulxq %r10,%r10,%rax - addq %r10,%r14 - mulxq %r11,%r11,%r9 - adcq %r11,%r15 - adcq $0,%r9 - imulq %r12,%rdx - addq %rax,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - addq 0+16(%rdi),%r10 - adcq 8+16(%rdi),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rdx - movq %rdx,%r15 - mulxq %r10,%r13,%r14 - mulxq %r11,%rax,%rdx - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rdx - mulxq %r10,%r10,%rax - addq %r10,%r14 - mulxq %r11,%r11,%r9 - adcq %r11,%r15 - adcq $0,%r9 - imulq %r12,%rdx - addq %rax,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - leaq 32(%rdi),%rdi - vperm2i128 $0x02,%ymm3,%ymm7,%ymm0 - vperm2i128 $0x13,%ymm3,%ymm7,%ymm7 - vperm2i128 $0x02,%ymm11,%ymm15,%ymm3 - vperm2i128 $0x13,%ymm11,%ymm15,%ymm11 - vpxor 0+0(%rsi),%ymm0,%ymm0 - vpxor 32+0(%rsi),%ymm3,%ymm3 - vpxor 64+0(%rsi),%ymm7,%ymm7 - vpxor 96+0(%rsi),%ymm11,%ymm11 - vmovdqu %ymm0,0+0(%rdi) - vmovdqu %ymm3,32+0(%rdi) - vmovdqu %ymm7,64+0(%rdi) - vmovdqu %ymm11,96+0(%rdi) - - vmovdqa 0+128(%rbp),%ymm0 - vperm2i128 $0x02,%ymm2,%ymm6,%ymm3 - vperm2i128 $0x13,%ymm2,%ymm6,%ymm6 - vperm2i128 $0x02,%ymm10,%ymm14,%ymm2 - vperm2i128 $0x13,%ymm10,%ymm14,%ymm10 - vpxor 0+128(%rsi),%ymm3,%ymm3 - vpxor 32+128(%rsi),%ymm2,%ymm2 - vpxor 64+128(%rsi),%ymm6,%ymm6 - vpxor 96+128(%rsi),%ymm10,%ymm10 - vmovdqu %ymm3,0+128(%rdi) - vmovdqu %ymm2,32+128(%rdi) - vmovdqu %ymm6,64+128(%rdi) - vmovdqu %ymm10,96+128(%rdi) - vperm2i128 $0x02,%ymm1,%ymm5,%ymm3 - vperm2i128 $0x13,%ymm1,%ymm5,%ymm5 - vperm2i128 $0x02,%ymm9,%ymm13,%ymm1 - vperm2i128 $0x13,%ymm9,%ymm13,%ymm9 - vpxor 0+256(%rsi),%ymm3,%ymm3 - vpxor 32+256(%rsi),%ymm1,%ymm1 - vpxor 64+256(%rsi),%ymm5,%ymm5 - vpxor 96+256(%rsi),%ymm9,%ymm9 - vmovdqu %ymm3,0+256(%rdi) - vmovdqu %ymm1,32+256(%rdi) - vmovdqu %ymm5,64+256(%rdi) - vmovdqu %ymm9,96+256(%rdi) - vperm2i128 $0x02,%ymm0,%ymm4,%ymm3 - vperm2i128 $0x13,%ymm0,%ymm4,%ymm4 - vperm2i128 $0x02,%ymm8,%ymm12,%ymm0 - vperm2i128 $0x13,%ymm8,%ymm12,%ymm8 - vpxor 0+384(%rsi),%ymm3,%ymm3 - vpxor 32+384(%rsi),%ymm0,%ymm0 - vpxor 64+384(%rsi),%ymm4,%ymm4 - vpxor 96+384(%rsi),%ymm8,%ymm8 - vmovdqu %ymm3,0+384(%rdi) - vmovdqu %ymm0,32+384(%rdi) - vmovdqu %ymm4,64+384(%rdi) - vmovdqu %ymm8,96+384(%rdi) - - leaq 512(%rsi),%rsi - subq $512,%rbx - cmpq $512,%rbx - jg L$seal_avx2_main_loop - - addq 0+0(%rdi),%r10 - adcq 8+0(%rdi),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rdx - movq %rdx,%r15 - mulxq %r10,%r13,%r14 - mulxq %r11,%rax,%rdx - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rdx - mulxq %r10,%r10,%rax - addq %r10,%r14 - mulxq %r11,%r11,%r9 - adcq %r11,%r15 - adcq $0,%r9 - imulq %r12,%rdx - addq %rax,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - addq 0+16(%rdi),%r10 - adcq 8+16(%rdi),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rdx - movq %rdx,%r15 - mulxq %r10,%r13,%r14 - mulxq %r11,%rax,%rdx - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rdx - mulxq %r10,%r10,%rax - addq %r10,%r14 - mulxq %r11,%r11,%r9 - adcq %r11,%r15 - adcq $0,%r9 - imulq %r12,%rdx - addq %rax,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - leaq 32(%rdi),%rdi - movq $10,%rcx - xorq %r8,%r8 - - cmpq $384,%rbx - ja L$seal_avx2_tail_512 - cmpq $256,%rbx - ja L$seal_avx2_tail_384 - cmpq $128,%rbx - ja L$seal_avx2_tail_256 - -L$seal_avx2_tail_128: - vmovdqa L$chacha20_consts(%rip),%ymm0 - vmovdqa 0+64(%rbp),%ymm4 - vmovdqa 0+96(%rbp),%ymm8 - vmovdqa L$avx2_inc(%rip),%ymm12 - vpaddd 0+160(%rbp),%ymm12,%ymm12 - vmovdqa %ymm12,0+160(%rbp) - -L$seal_avx2_tail_128_rounds_and_3xhash: - addq 0+0(%rdi),%r10 - adcq 8+0(%rdi),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rdx - movq %rdx,%r15 - mulxq %r10,%r13,%r14 - mulxq %r11,%rax,%rdx - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rdx - mulxq %r10,%r10,%rax - addq %r10,%r14 - mulxq %r11,%r11,%r9 - adcq %r11,%r15 - adcq $0,%r9 - imulq %r12,%rdx - addq %rax,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - leaq 16(%rdi),%rdi -L$seal_avx2_tail_128_rounds_and_2xhash: - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb L$rol16(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpsrld $20,%ymm4,%ymm3 - vpslld $12,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb L$rol8(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpslld $7,%ymm4,%ymm3 - vpsrld $25,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpalignr $12,%ymm12,%ymm12,%ymm12 - vpalignr $8,%ymm8,%ymm8,%ymm8 - vpalignr $4,%ymm4,%ymm4,%ymm4 - addq 0+0(%rdi),%r10 - adcq 8+0(%rdi),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rdx - movq %rdx,%r15 - mulxq %r10,%r13,%r14 - mulxq %r11,%rax,%rdx - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rdx - mulxq %r10,%r10,%rax - addq %r10,%r14 - mulxq %r11,%r11,%r9 - adcq %r11,%r15 - adcq $0,%r9 - imulq %r12,%rdx - addq %rax,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb L$rol16(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpsrld $20,%ymm4,%ymm3 - vpslld $12,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb L$rol8(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpslld $7,%ymm4,%ymm3 - vpsrld $25,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpalignr $4,%ymm12,%ymm12,%ymm12 - vpalignr $8,%ymm8,%ymm8,%ymm8 - vpalignr $12,%ymm4,%ymm4,%ymm4 - addq 0+16(%rdi),%r10 - adcq 8+16(%rdi),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rdx - movq %rdx,%r15 - mulxq %r10,%r13,%r14 - mulxq %r11,%rax,%rdx - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rdx - mulxq %r10,%r10,%rax - addq %r10,%r14 - mulxq %r11,%r11,%r9 - adcq %r11,%r15 - adcq $0,%r9 - imulq %r12,%rdx - addq %rax,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - leaq 32(%rdi),%rdi - decq %rcx - jg L$seal_avx2_tail_128_rounds_and_3xhash - decq %r8 - jge L$seal_avx2_tail_128_rounds_and_2xhash - vpaddd L$chacha20_consts(%rip),%ymm0,%ymm0 - vpaddd 0+64(%rbp),%ymm4,%ymm4 - vpaddd 0+96(%rbp),%ymm8,%ymm8 - vpaddd 0+160(%rbp),%ymm12,%ymm12 - vperm2i128 $0x13,%ymm0,%ymm4,%ymm3 - vperm2i128 $0x02,%ymm0,%ymm4,%ymm0 - vperm2i128 $0x02,%ymm8,%ymm12,%ymm4 - vperm2i128 $0x13,%ymm8,%ymm12,%ymm12 - vmovdqa %ymm3,%ymm8 - - jmp L$seal_avx2_short_loop - -L$seal_avx2_tail_256: - vmovdqa L$chacha20_consts(%rip),%ymm0 - vmovdqa 0+64(%rbp),%ymm4 - vmovdqa 0+96(%rbp),%ymm8 - vmovdqa %ymm0,%ymm1 - vmovdqa %ymm4,%ymm5 - vmovdqa %ymm8,%ymm9 - vmovdqa L$avx2_inc(%rip),%ymm12 - vpaddd 0+160(%rbp),%ymm12,%ymm13 - vpaddd %ymm13,%ymm12,%ymm12 - vmovdqa %ymm12,0+160(%rbp) - vmovdqa %ymm13,0+192(%rbp) - -L$seal_avx2_tail_256_rounds_and_3xhash: - addq 0+0(%rdi),%r10 - adcq 8+0(%rdi),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - leaq 16(%rdi),%rdi -L$seal_avx2_tail_256_rounds_and_2xhash: - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb L$rol16(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpsrld $20,%ymm4,%ymm3 - vpslld $12,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb L$rol8(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpslld $7,%ymm4,%ymm3 - vpsrld $25,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpalignr $12,%ymm12,%ymm12,%ymm12 - vpalignr $8,%ymm8,%ymm8,%ymm8 - vpalignr $4,%ymm4,%ymm4,%ymm4 - vpaddd %ymm5,%ymm1,%ymm1 - vpxor %ymm1,%ymm13,%ymm13 - vpshufb L$rol16(%rip),%ymm13,%ymm13 - vpaddd %ymm13,%ymm9,%ymm9 - vpxor %ymm9,%ymm5,%ymm5 - vpsrld $20,%ymm5,%ymm3 - vpslld $12,%ymm5,%ymm5 - vpxor %ymm3,%ymm5,%ymm5 - vpaddd %ymm5,%ymm1,%ymm1 - vpxor %ymm1,%ymm13,%ymm13 - vpshufb L$rol8(%rip),%ymm13,%ymm13 - vpaddd %ymm13,%ymm9,%ymm9 - vpxor %ymm9,%ymm5,%ymm5 - vpslld $7,%ymm5,%ymm3 - vpsrld $25,%ymm5,%ymm5 - vpxor %ymm3,%ymm5,%ymm5 - vpalignr $12,%ymm13,%ymm13,%ymm13 - vpalignr $8,%ymm9,%ymm9,%ymm9 - vpalignr $4,%ymm5,%ymm5,%ymm5 - addq 0+0(%rdi),%r10 - adcq 8+0(%rdi),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb L$rol16(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpsrld $20,%ymm4,%ymm3 - vpslld $12,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb L$rol8(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpslld $7,%ymm4,%ymm3 - vpsrld $25,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpalignr $4,%ymm12,%ymm12,%ymm12 - vpalignr $8,%ymm8,%ymm8,%ymm8 - vpalignr $12,%ymm4,%ymm4,%ymm4 - vpaddd %ymm5,%ymm1,%ymm1 - vpxor %ymm1,%ymm13,%ymm13 - vpshufb L$rol16(%rip),%ymm13,%ymm13 - vpaddd %ymm13,%ymm9,%ymm9 - vpxor %ymm9,%ymm5,%ymm5 - vpsrld $20,%ymm5,%ymm3 - vpslld $12,%ymm5,%ymm5 - vpxor %ymm3,%ymm5,%ymm5 - vpaddd %ymm5,%ymm1,%ymm1 - vpxor %ymm1,%ymm13,%ymm13 - vpshufb L$rol8(%rip),%ymm13,%ymm13 - vpaddd %ymm13,%ymm9,%ymm9 - vpxor %ymm9,%ymm5,%ymm5 - vpslld $7,%ymm5,%ymm3 - vpsrld $25,%ymm5,%ymm5 - vpxor %ymm3,%ymm5,%ymm5 - vpalignr $4,%ymm13,%ymm13,%ymm13 - vpalignr $8,%ymm9,%ymm9,%ymm9 - vpalignr $12,%ymm5,%ymm5,%ymm5 - addq 0+16(%rdi),%r10 - adcq 8+16(%rdi),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - leaq 32(%rdi),%rdi - decq %rcx - jg L$seal_avx2_tail_256_rounds_and_3xhash - decq %r8 - jge L$seal_avx2_tail_256_rounds_and_2xhash - vpaddd L$chacha20_consts(%rip),%ymm1,%ymm1 - vpaddd 0+64(%rbp),%ymm5,%ymm5 - vpaddd 0+96(%rbp),%ymm9,%ymm9 - vpaddd 0+192(%rbp),%ymm13,%ymm13 - vpaddd L$chacha20_consts(%rip),%ymm0,%ymm0 - vpaddd 0+64(%rbp),%ymm4,%ymm4 - vpaddd 0+96(%rbp),%ymm8,%ymm8 - vpaddd 0+160(%rbp),%ymm12,%ymm12 - vperm2i128 $0x02,%ymm1,%ymm5,%ymm3 - vperm2i128 $0x13,%ymm1,%ymm5,%ymm5 - vperm2i128 $0x02,%ymm9,%ymm13,%ymm1 - vperm2i128 $0x13,%ymm9,%ymm13,%ymm9 - vpxor 0+0(%rsi),%ymm3,%ymm3 - vpxor 32+0(%rsi),%ymm1,%ymm1 - vpxor 64+0(%rsi),%ymm5,%ymm5 - vpxor 96+0(%rsi),%ymm9,%ymm9 - vmovdqu %ymm3,0+0(%rdi) - vmovdqu %ymm1,32+0(%rdi) - vmovdqu %ymm5,64+0(%rdi) - vmovdqu %ymm9,96+0(%rdi) - vperm2i128 $0x13,%ymm0,%ymm4,%ymm3 - vperm2i128 $0x02,%ymm0,%ymm4,%ymm0 - vperm2i128 $0x02,%ymm8,%ymm12,%ymm4 - vperm2i128 $0x13,%ymm8,%ymm12,%ymm12 - vmovdqa %ymm3,%ymm8 - - movq $128,%rcx - leaq 128(%rsi),%rsi - subq $128,%rbx - jmp L$seal_avx2_short_hash_remainder - -L$seal_avx2_tail_384: - vmovdqa L$chacha20_consts(%rip),%ymm0 - vmovdqa 0+64(%rbp),%ymm4 - vmovdqa 0+96(%rbp),%ymm8 - vmovdqa %ymm0,%ymm1 - vmovdqa %ymm4,%ymm5 - vmovdqa %ymm8,%ymm9 - vmovdqa %ymm0,%ymm2 - vmovdqa %ymm4,%ymm6 - vmovdqa %ymm8,%ymm10 - vmovdqa L$avx2_inc(%rip),%ymm12 - vpaddd 0+160(%rbp),%ymm12,%ymm14 - vpaddd %ymm14,%ymm12,%ymm13 - vpaddd %ymm13,%ymm12,%ymm12 - vmovdqa %ymm12,0+160(%rbp) - vmovdqa %ymm13,0+192(%rbp) - vmovdqa %ymm14,0+224(%rbp) - -L$seal_avx2_tail_384_rounds_and_3xhash: - addq 0+0(%rdi),%r10 - adcq 8+0(%rdi),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - leaq 16(%rdi),%rdi -L$seal_avx2_tail_384_rounds_and_2xhash: - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb L$rol16(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpsrld $20,%ymm4,%ymm3 - vpslld $12,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb L$rol8(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpslld $7,%ymm4,%ymm3 - vpsrld $25,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpalignr $12,%ymm12,%ymm12,%ymm12 - vpalignr $8,%ymm8,%ymm8,%ymm8 - vpalignr $4,%ymm4,%ymm4,%ymm4 - vpaddd %ymm5,%ymm1,%ymm1 - vpxor %ymm1,%ymm13,%ymm13 - vpshufb L$rol16(%rip),%ymm13,%ymm13 - vpaddd %ymm13,%ymm9,%ymm9 - vpxor %ymm9,%ymm5,%ymm5 - vpsrld $20,%ymm5,%ymm3 - vpslld $12,%ymm5,%ymm5 - vpxor %ymm3,%ymm5,%ymm5 - vpaddd %ymm5,%ymm1,%ymm1 - vpxor %ymm1,%ymm13,%ymm13 - vpshufb L$rol8(%rip),%ymm13,%ymm13 - vpaddd %ymm13,%ymm9,%ymm9 - vpxor %ymm9,%ymm5,%ymm5 - vpslld $7,%ymm5,%ymm3 - vpsrld $25,%ymm5,%ymm5 - vpxor %ymm3,%ymm5,%ymm5 - vpalignr $12,%ymm13,%ymm13,%ymm13 - vpalignr $8,%ymm9,%ymm9,%ymm9 - vpalignr $4,%ymm5,%ymm5,%ymm5 - addq 0+0(%rdi),%r10 - adcq 8+0(%rdi),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - vpaddd %ymm6,%ymm2,%ymm2 - vpxor %ymm2,%ymm14,%ymm14 - vpshufb L$rol16(%rip),%ymm14,%ymm14 - vpaddd %ymm14,%ymm10,%ymm10 - vpxor %ymm10,%ymm6,%ymm6 - vpsrld $20,%ymm6,%ymm3 - vpslld $12,%ymm6,%ymm6 - vpxor %ymm3,%ymm6,%ymm6 - vpaddd %ymm6,%ymm2,%ymm2 - vpxor %ymm2,%ymm14,%ymm14 - vpshufb L$rol8(%rip),%ymm14,%ymm14 - vpaddd %ymm14,%ymm10,%ymm10 - vpxor %ymm10,%ymm6,%ymm6 - vpslld $7,%ymm6,%ymm3 - vpsrld $25,%ymm6,%ymm6 - vpxor %ymm3,%ymm6,%ymm6 - vpalignr $12,%ymm14,%ymm14,%ymm14 - vpalignr $8,%ymm10,%ymm10,%ymm10 - vpalignr $4,%ymm6,%ymm6,%ymm6 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb L$rol16(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpsrld $20,%ymm4,%ymm3 - vpslld $12,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb L$rol8(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpslld $7,%ymm4,%ymm3 - vpsrld $25,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpalignr $4,%ymm12,%ymm12,%ymm12 - vpalignr $8,%ymm8,%ymm8,%ymm8 - vpalignr $12,%ymm4,%ymm4,%ymm4 - addq 0+16(%rdi),%r10 - adcq 8+16(%rdi),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - vpaddd %ymm5,%ymm1,%ymm1 - vpxor %ymm1,%ymm13,%ymm13 - vpshufb L$rol16(%rip),%ymm13,%ymm13 - vpaddd %ymm13,%ymm9,%ymm9 - vpxor %ymm9,%ymm5,%ymm5 - vpsrld $20,%ymm5,%ymm3 - vpslld $12,%ymm5,%ymm5 - vpxor %ymm3,%ymm5,%ymm5 - vpaddd %ymm5,%ymm1,%ymm1 - vpxor %ymm1,%ymm13,%ymm13 - vpshufb L$rol8(%rip),%ymm13,%ymm13 - vpaddd %ymm13,%ymm9,%ymm9 - vpxor %ymm9,%ymm5,%ymm5 - vpslld $7,%ymm5,%ymm3 - vpsrld $25,%ymm5,%ymm5 - vpxor %ymm3,%ymm5,%ymm5 - vpalignr $4,%ymm13,%ymm13,%ymm13 - vpalignr $8,%ymm9,%ymm9,%ymm9 - vpalignr $12,%ymm5,%ymm5,%ymm5 - vpaddd %ymm6,%ymm2,%ymm2 - vpxor %ymm2,%ymm14,%ymm14 - vpshufb L$rol16(%rip),%ymm14,%ymm14 - vpaddd %ymm14,%ymm10,%ymm10 - vpxor %ymm10,%ymm6,%ymm6 - vpsrld $20,%ymm6,%ymm3 - vpslld $12,%ymm6,%ymm6 - vpxor %ymm3,%ymm6,%ymm6 - vpaddd %ymm6,%ymm2,%ymm2 - vpxor %ymm2,%ymm14,%ymm14 - vpshufb L$rol8(%rip),%ymm14,%ymm14 - vpaddd %ymm14,%ymm10,%ymm10 - vpxor %ymm10,%ymm6,%ymm6 - vpslld $7,%ymm6,%ymm3 - vpsrld $25,%ymm6,%ymm6 - vpxor %ymm3,%ymm6,%ymm6 - vpalignr $4,%ymm14,%ymm14,%ymm14 - vpalignr $8,%ymm10,%ymm10,%ymm10 - vpalignr $12,%ymm6,%ymm6,%ymm6 - - leaq 32(%rdi),%rdi - decq %rcx - jg L$seal_avx2_tail_384_rounds_and_3xhash - decq %r8 - jge L$seal_avx2_tail_384_rounds_and_2xhash - vpaddd L$chacha20_consts(%rip),%ymm2,%ymm2 - vpaddd 0+64(%rbp),%ymm6,%ymm6 - vpaddd 0+96(%rbp),%ymm10,%ymm10 - vpaddd 0+224(%rbp),%ymm14,%ymm14 - vpaddd L$chacha20_consts(%rip),%ymm1,%ymm1 - vpaddd 0+64(%rbp),%ymm5,%ymm5 - vpaddd 0+96(%rbp),%ymm9,%ymm9 - vpaddd 0+192(%rbp),%ymm13,%ymm13 - vpaddd L$chacha20_consts(%rip),%ymm0,%ymm0 - vpaddd 0+64(%rbp),%ymm4,%ymm4 - vpaddd 0+96(%rbp),%ymm8,%ymm8 - vpaddd 0+160(%rbp),%ymm12,%ymm12 - vperm2i128 $0x02,%ymm2,%ymm6,%ymm3 - vperm2i128 $0x13,%ymm2,%ymm6,%ymm6 - vperm2i128 $0x02,%ymm10,%ymm14,%ymm2 - vperm2i128 $0x13,%ymm10,%ymm14,%ymm10 - vpxor 0+0(%rsi),%ymm3,%ymm3 - vpxor 32+0(%rsi),%ymm2,%ymm2 - vpxor 64+0(%rsi),%ymm6,%ymm6 - vpxor 96+0(%rsi),%ymm10,%ymm10 - vmovdqu %ymm3,0+0(%rdi) - vmovdqu %ymm2,32+0(%rdi) - vmovdqu %ymm6,64+0(%rdi) - vmovdqu %ymm10,96+0(%rdi) - vperm2i128 $0x02,%ymm1,%ymm5,%ymm3 - vperm2i128 $0x13,%ymm1,%ymm5,%ymm5 - vperm2i128 $0x02,%ymm9,%ymm13,%ymm1 - vperm2i128 $0x13,%ymm9,%ymm13,%ymm9 - vpxor 0+128(%rsi),%ymm3,%ymm3 - vpxor 32+128(%rsi),%ymm1,%ymm1 - vpxor 64+128(%rsi),%ymm5,%ymm5 - vpxor 96+128(%rsi),%ymm9,%ymm9 - vmovdqu %ymm3,0+128(%rdi) - vmovdqu %ymm1,32+128(%rdi) - vmovdqu %ymm5,64+128(%rdi) - vmovdqu %ymm9,96+128(%rdi) - vperm2i128 $0x13,%ymm0,%ymm4,%ymm3 - vperm2i128 $0x02,%ymm0,%ymm4,%ymm0 - vperm2i128 $0x02,%ymm8,%ymm12,%ymm4 - vperm2i128 $0x13,%ymm8,%ymm12,%ymm12 - vmovdqa %ymm3,%ymm8 - - movq $256,%rcx - leaq 256(%rsi),%rsi - subq $256,%rbx - jmp L$seal_avx2_short_hash_remainder - -L$seal_avx2_tail_512: - vmovdqa L$chacha20_consts(%rip),%ymm0 - vmovdqa 0+64(%rbp),%ymm4 - vmovdqa 0+96(%rbp),%ymm8 - vmovdqa %ymm0,%ymm1 - vmovdqa %ymm4,%ymm5 - vmovdqa %ymm8,%ymm9 - vmovdqa %ymm0,%ymm2 - vmovdqa %ymm4,%ymm6 - vmovdqa %ymm8,%ymm10 - vmovdqa %ymm0,%ymm3 - vmovdqa %ymm4,%ymm7 - vmovdqa %ymm8,%ymm11 - vmovdqa L$avx2_inc(%rip),%ymm12 - vpaddd 0+160(%rbp),%ymm12,%ymm15 - vpaddd %ymm15,%ymm12,%ymm14 - vpaddd %ymm14,%ymm12,%ymm13 - vpaddd %ymm13,%ymm12,%ymm12 - vmovdqa %ymm15,0+256(%rbp) - vmovdqa %ymm14,0+224(%rbp) - vmovdqa %ymm13,0+192(%rbp) - vmovdqa %ymm12,0+160(%rbp) - -L$seal_avx2_tail_512_rounds_and_3xhash: - addq 0+0(%rdi),%r10 - adcq 8+0(%rdi),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rdx - movq %rdx,%r15 - mulxq %r10,%r13,%r14 - mulxq %r11,%rax,%rdx - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rdx - mulxq %r10,%r10,%rax - addq %r10,%r14 - mulxq %r11,%r11,%r9 - adcq %r11,%r15 - adcq $0,%r9 - imulq %r12,%rdx - addq %rax,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - leaq 16(%rdi),%rdi -L$seal_avx2_tail_512_rounds_and_2xhash: - vmovdqa %ymm8,0+128(%rbp) - vmovdqa L$rol16(%rip),%ymm8 - vpaddd %ymm7,%ymm3,%ymm3 - vpaddd %ymm6,%ymm2,%ymm2 - vpaddd %ymm5,%ymm1,%ymm1 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm3,%ymm15,%ymm15 - vpxor %ymm2,%ymm14,%ymm14 - vpxor %ymm1,%ymm13,%ymm13 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb %ymm8,%ymm15,%ymm15 - vpshufb %ymm8,%ymm14,%ymm14 - vpshufb %ymm8,%ymm13,%ymm13 - vpshufb %ymm8,%ymm12,%ymm12 - vpaddd %ymm15,%ymm11,%ymm11 - vpaddd %ymm14,%ymm10,%ymm10 - vpaddd %ymm13,%ymm9,%ymm9 - vpaddd 0+128(%rbp),%ymm12,%ymm8 - vpxor %ymm11,%ymm7,%ymm7 - vpxor %ymm10,%ymm6,%ymm6 - addq 0+0(%rdi),%r10 - adcq 8+0(%rdi),%r11 - adcq $1,%r12 - vpxor %ymm9,%ymm5,%ymm5 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa %ymm8,0+128(%rbp) - vpsrld $20,%ymm7,%ymm8 - vpslld $32-20,%ymm7,%ymm7 - vpxor %ymm8,%ymm7,%ymm7 - vpsrld $20,%ymm6,%ymm8 - vpslld $32-20,%ymm6,%ymm6 - vpxor %ymm8,%ymm6,%ymm6 - vpsrld $20,%ymm5,%ymm8 - vpslld $32-20,%ymm5,%ymm5 - vpxor %ymm8,%ymm5,%ymm5 - vpsrld $20,%ymm4,%ymm8 - vpslld $32-20,%ymm4,%ymm4 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa L$rol8(%rip),%ymm8 - vpaddd %ymm7,%ymm3,%ymm3 - vpaddd %ymm6,%ymm2,%ymm2 - vpaddd %ymm5,%ymm1,%ymm1 - vpaddd %ymm4,%ymm0,%ymm0 - movq 0+0+0(%rbp),%rdx - movq %rdx,%r15 - mulxq %r10,%r13,%r14 - mulxq %r11,%rax,%rdx - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - vpxor %ymm3,%ymm15,%ymm15 - vpxor %ymm2,%ymm14,%ymm14 - vpxor %ymm1,%ymm13,%ymm13 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb %ymm8,%ymm15,%ymm15 - vpshufb %ymm8,%ymm14,%ymm14 - vpshufb %ymm8,%ymm13,%ymm13 - vpshufb %ymm8,%ymm12,%ymm12 - vpaddd %ymm15,%ymm11,%ymm11 - vpaddd %ymm14,%ymm10,%ymm10 - vpaddd %ymm13,%ymm9,%ymm9 - vpaddd 0+128(%rbp),%ymm12,%ymm8 - vpxor %ymm11,%ymm7,%ymm7 - vpxor %ymm10,%ymm6,%ymm6 - vpxor %ymm9,%ymm5,%ymm5 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa %ymm8,0+128(%rbp) - vpsrld $25,%ymm7,%ymm8 - vpslld $32-25,%ymm7,%ymm7 - vpxor %ymm8,%ymm7,%ymm7 - movq 8+0+0(%rbp),%rdx - mulxq %r10,%r10,%rax - addq %r10,%r14 - mulxq %r11,%r11,%r9 - adcq %r11,%r15 - adcq $0,%r9 - imulq %r12,%rdx - vpsrld $25,%ymm6,%ymm8 - vpslld $32-25,%ymm6,%ymm6 - vpxor %ymm8,%ymm6,%ymm6 - vpsrld $25,%ymm5,%ymm8 - vpslld $32-25,%ymm5,%ymm5 - vpxor %ymm8,%ymm5,%ymm5 - vpsrld $25,%ymm4,%ymm8 - vpslld $32-25,%ymm4,%ymm4 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa 0+128(%rbp),%ymm8 - vpalignr $4,%ymm7,%ymm7,%ymm7 - vpalignr $8,%ymm11,%ymm11,%ymm11 - vpalignr $12,%ymm15,%ymm15,%ymm15 - vpalignr $4,%ymm6,%ymm6,%ymm6 - vpalignr $8,%ymm10,%ymm10,%ymm10 - vpalignr $12,%ymm14,%ymm14,%ymm14 - vpalignr $4,%ymm5,%ymm5,%ymm5 - vpalignr $8,%ymm9,%ymm9,%ymm9 - vpalignr $12,%ymm13,%ymm13,%ymm13 - vpalignr $4,%ymm4,%ymm4,%ymm4 - addq %rax,%r15 - adcq %rdx,%r9 - vpalignr $8,%ymm8,%ymm8,%ymm8 - vpalignr $12,%ymm12,%ymm12,%ymm12 - vmovdqa %ymm8,0+128(%rbp) - vmovdqa L$rol16(%rip),%ymm8 - vpaddd %ymm7,%ymm3,%ymm3 - vpaddd %ymm6,%ymm2,%ymm2 - vpaddd %ymm5,%ymm1,%ymm1 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm3,%ymm15,%ymm15 - vpxor %ymm2,%ymm14,%ymm14 - vpxor %ymm1,%ymm13,%ymm13 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb %ymm8,%ymm15,%ymm15 - vpshufb %ymm8,%ymm14,%ymm14 - vpshufb %ymm8,%ymm13,%ymm13 - vpshufb %ymm8,%ymm12,%ymm12 - vpaddd %ymm15,%ymm11,%ymm11 - vpaddd %ymm14,%ymm10,%ymm10 - vpaddd %ymm13,%ymm9,%ymm9 - vpaddd 0+128(%rbp),%ymm12,%ymm8 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - vpxor %ymm11,%ymm7,%ymm7 - vpxor %ymm10,%ymm6,%ymm6 - vpxor %ymm9,%ymm5,%ymm5 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa %ymm8,0+128(%rbp) - vpsrld $20,%ymm7,%ymm8 - vpslld $32-20,%ymm7,%ymm7 - vpxor %ymm8,%ymm7,%ymm7 - vpsrld $20,%ymm6,%ymm8 - vpslld $32-20,%ymm6,%ymm6 - vpxor %ymm8,%ymm6,%ymm6 - vpsrld $20,%ymm5,%ymm8 - vpslld $32-20,%ymm5,%ymm5 - vpxor %ymm8,%ymm5,%ymm5 - vpsrld $20,%ymm4,%ymm8 - vpslld $32-20,%ymm4,%ymm4 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa L$rol8(%rip),%ymm8 - vpaddd %ymm7,%ymm3,%ymm3 - vpaddd %ymm6,%ymm2,%ymm2 - addq 0+16(%rdi),%r10 - adcq 8+16(%rdi),%r11 - adcq $1,%r12 - vpaddd %ymm5,%ymm1,%ymm1 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm3,%ymm15,%ymm15 - vpxor %ymm2,%ymm14,%ymm14 - vpxor %ymm1,%ymm13,%ymm13 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb %ymm8,%ymm15,%ymm15 - vpshufb %ymm8,%ymm14,%ymm14 - vpshufb %ymm8,%ymm13,%ymm13 - vpshufb %ymm8,%ymm12,%ymm12 - vpaddd %ymm15,%ymm11,%ymm11 - vpaddd %ymm14,%ymm10,%ymm10 - vpaddd %ymm13,%ymm9,%ymm9 - vpaddd 0+128(%rbp),%ymm12,%ymm8 - vpxor %ymm11,%ymm7,%ymm7 - vpxor %ymm10,%ymm6,%ymm6 - vpxor %ymm9,%ymm5,%ymm5 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa %ymm8,0+128(%rbp) - vpsrld $25,%ymm7,%ymm8 - movq 0+0+0(%rbp),%rdx - movq %rdx,%r15 - mulxq %r10,%r13,%r14 - mulxq %r11,%rax,%rdx - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - vpslld $32-25,%ymm7,%ymm7 - vpxor %ymm8,%ymm7,%ymm7 - vpsrld $25,%ymm6,%ymm8 - vpslld $32-25,%ymm6,%ymm6 - vpxor %ymm8,%ymm6,%ymm6 - vpsrld $25,%ymm5,%ymm8 - vpslld $32-25,%ymm5,%ymm5 - vpxor %ymm8,%ymm5,%ymm5 - vpsrld $25,%ymm4,%ymm8 - vpslld $32-25,%ymm4,%ymm4 - vpxor %ymm8,%ymm4,%ymm4 - vmovdqa 0+128(%rbp),%ymm8 - vpalignr $12,%ymm7,%ymm7,%ymm7 - vpalignr $8,%ymm11,%ymm11,%ymm11 - vpalignr $4,%ymm15,%ymm15,%ymm15 - vpalignr $12,%ymm6,%ymm6,%ymm6 - vpalignr $8,%ymm10,%ymm10,%ymm10 - vpalignr $4,%ymm14,%ymm14,%ymm14 - vpalignr $12,%ymm5,%ymm5,%ymm5 - vpalignr $8,%ymm9,%ymm9,%ymm9 - movq 8+0+0(%rbp),%rdx - mulxq %r10,%r10,%rax - addq %r10,%r14 - mulxq %r11,%r11,%r9 - adcq %r11,%r15 - adcq $0,%r9 - imulq %r12,%rdx - vpalignr $4,%ymm13,%ymm13,%ymm13 - vpalignr $12,%ymm4,%ymm4,%ymm4 - vpalignr $8,%ymm8,%ymm8,%ymm8 - vpalignr $4,%ymm12,%ymm12,%ymm12 - - - - - - - - - - - - - - - - - addq %rax,%r15 - adcq %rdx,%r9 - - - - - - - - - - - - - - - - - - - - - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - leaq 32(%rdi),%rdi - decq %rcx - jg L$seal_avx2_tail_512_rounds_and_3xhash - decq %r8 - jge L$seal_avx2_tail_512_rounds_and_2xhash - vpaddd L$chacha20_consts(%rip),%ymm3,%ymm3 - vpaddd 0+64(%rbp),%ymm7,%ymm7 - vpaddd 0+96(%rbp),%ymm11,%ymm11 - vpaddd 0+256(%rbp),%ymm15,%ymm15 - vpaddd L$chacha20_consts(%rip),%ymm2,%ymm2 - vpaddd 0+64(%rbp),%ymm6,%ymm6 - vpaddd 0+96(%rbp),%ymm10,%ymm10 - vpaddd 0+224(%rbp),%ymm14,%ymm14 - vpaddd L$chacha20_consts(%rip),%ymm1,%ymm1 - vpaddd 0+64(%rbp),%ymm5,%ymm5 - vpaddd 0+96(%rbp),%ymm9,%ymm9 - vpaddd 0+192(%rbp),%ymm13,%ymm13 - vpaddd L$chacha20_consts(%rip),%ymm0,%ymm0 - vpaddd 0+64(%rbp),%ymm4,%ymm4 - vpaddd 0+96(%rbp),%ymm8,%ymm8 - vpaddd 0+160(%rbp),%ymm12,%ymm12 - - vmovdqa %ymm0,0+128(%rbp) - vperm2i128 $0x02,%ymm3,%ymm7,%ymm0 - vperm2i128 $0x13,%ymm3,%ymm7,%ymm7 - vperm2i128 $0x02,%ymm11,%ymm15,%ymm3 - vperm2i128 $0x13,%ymm11,%ymm15,%ymm11 - vpxor 0+0(%rsi),%ymm0,%ymm0 - vpxor 32+0(%rsi),%ymm3,%ymm3 - vpxor 64+0(%rsi),%ymm7,%ymm7 - vpxor 96+0(%rsi),%ymm11,%ymm11 - vmovdqu %ymm0,0+0(%rdi) - vmovdqu %ymm3,32+0(%rdi) - vmovdqu %ymm7,64+0(%rdi) - vmovdqu %ymm11,96+0(%rdi) - - vmovdqa 0+128(%rbp),%ymm0 - vperm2i128 $0x02,%ymm2,%ymm6,%ymm3 - vperm2i128 $0x13,%ymm2,%ymm6,%ymm6 - vperm2i128 $0x02,%ymm10,%ymm14,%ymm2 - vperm2i128 $0x13,%ymm10,%ymm14,%ymm10 - vpxor 0+128(%rsi),%ymm3,%ymm3 - vpxor 32+128(%rsi),%ymm2,%ymm2 - vpxor 64+128(%rsi),%ymm6,%ymm6 - vpxor 96+128(%rsi),%ymm10,%ymm10 - vmovdqu %ymm3,0+128(%rdi) - vmovdqu %ymm2,32+128(%rdi) - vmovdqu %ymm6,64+128(%rdi) - vmovdqu %ymm10,96+128(%rdi) - vperm2i128 $0x02,%ymm1,%ymm5,%ymm3 - vperm2i128 $0x13,%ymm1,%ymm5,%ymm5 - vperm2i128 $0x02,%ymm9,%ymm13,%ymm1 - vperm2i128 $0x13,%ymm9,%ymm13,%ymm9 - vpxor 0+256(%rsi),%ymm3,%ymm3 - vpxor 32+256(%rsi),%ymm1,%ymm1 - vpxor 64+256(%rsi),%ymm5,%ymm5 - vpxor 96+256(%rsi),%ymm9,%ymm9 - vmovdqu %ymm3,0+256(%rdi) - vmovdqu %ymm1,32+256(%rdi) - vmovdqu %ymm5,64+256(%rdi) - vmovdqu %ymm9,96+256(%rdi) - vperm2i128 $0x13,%ymm0,%ymm4,%ymm3 - vperm2i128 $0x02,%ymm0,%ymm4,%ymm0 - vperm2i128 $0x02,%ymm8,%ymm12,%ymm4 - vperm2i128 $0x13,%ymm8,%ymm12,%ymm12 - vmovdqa %ymm3,%ymm8 - - movq $384,%rcx - leaq 384(%rsi),%rsi - subq $384,%rbx - jmp L$seal_avx2_short_hash_remainder - -L$seal_avx2_320: - vmovdqa %ymm0,%ymm1 - vmovdqa %ymm0,%ymm2 - vmovdqa %ymm4,%ymm5 - vmovdqa %ymm4,%ymm6 - vmovdqa %ymm8,%ymm9 - vmovdqa %ymm8,%ymm10 - vpaddd L$avx2_inc(%rip),%ymm12,%ymm13 - vpaddd L$avx2_inc(%rip),%ymm13,%ymm14 - vmovdqa %ymm4,%ymm7 - vmovdqa %ymm8,%ymm11 - vmovdqa %ymm12,0+160(%rbp) - vmovdqa %ymm13,0+192(%rbp) - vmovdqa %ymm14,0+224(%rbp) - movq $10,%r10 -L$seal_avx2_320_rounds: - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb L$rol16(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpsrld $20,%ymm4,%ymm3 - vpslld $12,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb L$rol8(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpslld $7,%ymm4,%ymm3 - vpsrld $25,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpalignr $12,%ymm12,%ymm12,%ymm12 - vpalignr $8,%ymm8,%ymm8,%ymm8 - vpalignr $4,%ymm4,%ymm4,%ymm4 - vpaddd %ymm5,%ymm1,%ymm1 - vpxor %ymm1,%ymm13,%ymm13 - vpshufb L$rol16(%rip),%ymm13,%ymm13 - vpaddd %ymm13,%ymm9,%ymm9 - vpxor %ymm9,%ymm5,%ymm5 - vpsrld $20,%ymm5,%ymm3 - vpslld $12,%ymm5,%ymm5 - vpxor %ymm3,%ymm5,%ymm5 - vpaddd %ymm5,%ymm1,%ymm1 - vpxor %ymm1,%ymm13,%ymm13 - vpshufb L$rol8(%rip),%ymm13,%ymm13 - vpaddd %ymm13,%ymm9,%ymm9 - vpxor %ymm9,%ymm5,%ymm5 - vpslld $7,%ymm5,%ymm3 - vpsrld $25,%ymm5,%ymm5 - vpxor %ymm3,%ymm5,%ymm5 - vpalignr $12,%ymm13,%ymm13,%ymm13 - vpalignr $8,%ymm9,%ymm9,%ymm9 - vpalignr $4,%ymm5,%ymm5,%ymm5 - vpaddd %ymm6,%ymm2,%ymm2 - vpxor %ymm2,%ymm14,%ymm14 - vpshufb L$rol16(%rip),%ymm14,%ymm14 - vpaddd %ymm14,%ymm10,%ymm10 - vpxor %ymm10,%ymm6,%ymm6 - vpsrld $20,%ymm6,%ymm3 - vpslld $12,%ymm6,%ymm6 - vpxor %ymm3,%ymm6,%ymm6 - vpaddd %ymm6,%ymm2,%ymm2 - vpxor %ymm2,%ymm14,%ymm14 - vpshufb L$rol8(%rip),%ymm14,%ymm14 - vpaddd %ymm14,%ymm10,%ymm10 - vpxor %ymm10,%ymm6,%ymm6 - vpslld $7,%ymm6,%ymm3 - vpsrld $25,%ymm6,%ymm6 - vpxor %ymm3,%ymm6,%ymm6 - vpalignr $12,%ymm14,%ymm14,%ymm14 - vpalignr $8,%ymm10,%ymm10,%ymm10 - vpalignr $4,%ymm6,%ymm6,%ymm6 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb L$rol16(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpsrld $20,%ymm4,%ymm3 - vpslld $12,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb L$rol8(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpslld $7,%ymm4,%ymm3 - vpsrld $25,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpalignr $4,%ymm12,%ymm12,%ymm12 - vpalignr $8,%ymm8,%ymm8,%ymm8 - vpalignr $12,%ymm4,%ymm4,%ymm4 - vpaddd %ymm5,%ymm1,%ymm1 - vpxor %ymm1,%ymm13,%ymm13 - vpshufb L$rol16(%rip),%ymm13,%ymm13 - vpaddd %ymm13,%ymm9,%ymm9 - vpxor %ymm9,%ymm5,%ymm5 - vpsrld $20,%ymm5,%ymm3 - vpslld $12,%ymm5,%ymm5 - vpxor %ymm3,%ymm5,%ymm5 - vpaddd %ymm5,%ymm1,%ymm1 - vpxor %ymm1,%ymm13,%ymm13 - vpshufb L$rol8(%rip),%ymm13,%ymm13 - vpaddd %ymm13,%ymm9,%ymm9 - vpxor %ymm9,%ymm5,%ymm5 - vpslld $7,%ymm5,%ymm3 - vpsrld $25,%ymm5,%ymm5 - vpxor %ymm3,%ymm5,%ymm5 - vpalignr $4,%ymm13,%ymm13,%ymm13 - vpalignr $8,%ymm9,%ymm9,%ymm9 - vpalignr $12,%ymm5,%ymm5,%ymm5 - vpaddd %ymm6,%ymm2,%ymm2 - vpxor %ymm2,%ymm14,%ymm14 - vpshufb L$rol16(%rip),%ymm14,%ymm14 - vpaddd %ymm14,%ymm10,%ymm10 - vpxor %ymm10,%ymm6,%ymm6 - vpsrld $20,%ymm6,%ymm3 - vpslld $12,%ymm6,%ymm6 - vpxor %ymm3,%ymm6,%ymm6 - vpaddd %ymm6,%ymm2,%ymm2 - vpxor %ymm2,%ymm14,%ymm14 - vpshufb L$rol8(%rip),%ymm14,%ymm14 - vpaddd %ymm14,%ymm10,%ymm10 - vpxor %ymm10,%ymm6,%ymm6 - vpslld $7,%ymm6,%ymm3 - vpsrld $25,%ymm6,%ymm6 - vpxor %ymm3,%ymm6,%ymm6 - vpalignr $4,%ymm14,%ymm14,%ymm14 - vpalignr $8,%ymm10,%ymm10,%ymm10 - vpalignr $12,%ymm6,%ymm6,%ymm6 - - decq %r10 - jne L$seal_avx2_320_rounds - vpaddd L$chacha20_consts(%rip),%ymm0,%ymm0 - vpaddd L$chacha20_consts(%rip),%ymm1,%ymm1 - vpaddd L$chacha20_consts(%rip),%ymm2,%ymm2 - vpaddd %ymm7,%ymm4,%ymm4 - vpaddd %ymm7,%ymm5,%ymm5 - vpaddd %ymm7,%ymm6,%ymm6 - vpaddd %ymm11,%ymm8,%ymm8 - vpaddd %ymm11,%ymm9,%ymm9 - vpaddd %ymm11,%ymm10,%ymm10 - vpaddd 0+160(%rbp),%ymm12,%ymm12 - vpaddd 0+192(%rbp),%ymm13,%ymm13 - vpaddd 0+224(%rbp),%ymm14,%ymm14 - vperm2i128 $0x02,%ymm0,%ymm4,%ymm3 - - vpand L$clamp(%rip),%ymm3,%ymm3 - vmovdqa %ymm3,0+0(%rbp) - - vperm2i128 $0x13,%ymm0,%ymm4,%ymm0 - vperm2i128 $0x13,%ymm8,%ymm12,%ymm4 - vperm2i128 $0x02,%ymm1,%ymm5,%ymm8 - vperm2i128 $0x02,%ymm9,%ymm13,%ymm12 - vperm2i128 $0x13,%ymm1,%ymm5,%ymm1 - vperm2i128 $0x13,%ymm9,%ymm13,%ymm5 - vperm2i128 $0x02,%ymm2,%ymm6,%ymm9 - vperm2i128 $0x02,%ymm10,%ymm14,%ymm13 - vperm2i128 $0x13,%ymm2,%ymm6,%ymm2 - vperm2i128 $0x13,%ymm10,%ymm14,%ymm6 - jmp L$seal_avx2_short - -L$seal_avx2_192: - vmovdqa %ymm0,%ymm1 - vmovdqa %ymm0,%ymm2 - vmovdqa %ymm4,%ymm5 - vmovdqa %ymm4,%ymm6 - vmovdqa %ymm8,%ymm9 - vmovdqa %ymm8,%ymm10 - vpaddd L$avx2_inc(%rip),%ymm12,%ymm13 - vmovdqa %ymm12,%ymm11 - vmovdqa %ymm13,%ymm15 - movq $10,%r10 -L$seal_avx2_192_rounds: - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb L$rol16(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpsrld $20,%ymm4,%ymm3 - vpslld $12,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb L$rol8(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpslld $7,%ymm4,%ymm3 - vpsrld $25,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpalignr $12,%ymm12,%ymm12,%ymm12 - vpalignr $8,%ymm8,%ymm8,%ymm8 - vpalignr $4,%ymm4,%ymm4,%ymm4 - vpaddd %ymm5,%ymm1,%ymm1 - vpxor %ymm1,%ymm13,%ymm13 - vpshufb L$rol16(%rip),%ymm13,%ymm13 - vpaddd %ymm13,%ymm9,%ymm9 - vpxor %ymm9,%ymm5,%ymm5 - vpsrld $20,%ymm5,%ymm3 - vpslld $12,%ymm5,%ymm5 - vpxor %ymm3,%ymm5,%ymm5 - vpaddd %ymm5,%ymm1,%ymm1 - vpxor %ymm1,%ymm13,%ymm13 - vpshufb L$rol8(%rip),%ymm13,%ymm13 - vpaddd %ymm13,%ymm9,%ymm9 - vpxor %ymm9,%ymm5,%ymm5 - vpslld $7,%ymm5,%ymm3 - vpsrld $25,%ymm5,%ymm5 - vpxor %ymm3,%ymm5,%ymm5 - vpalignr $12,%ymm13,%ymm13,%ymm13 - vpalignr $8,%ymm9,%ymm9,%ymm9 - vpalignr $4,%ymm5,%ymm5,%ymm5 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb L$rol16(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpsrld $20,%ymm4,%ymm3 - vpslld $12,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpaddd %ymm4,%ymm0,%ymm0 - vpxor %ymm0,%ymm12,%ymm12 - vpshufb L$rol8(%rip),%ymm12,%ymm12 - vpaddd %ymm12,%ymm8,%ymm8 - vpxor %ymm8,%ymm4,%ymm4 - vpslld $7,%ymm4,%ymm3 - vpsrld $25,%ymm4,%ymm4 - vpxor %ymm3,%ymm4,%ymm4 - vpalignr $4,%ymm12,%ymm12,%ymm12 - vpalignr $8,%ymm8,%ymm8,%ymm8 - vpalignr $12,%ymm4,%ymm4,%ymm4 - vpaddd %ymm5,%ymm1,%ymm1 - vpxor %ymm1,%ymm13,%ymm13 - vpshufb L$rol16(%rip),%ymm13,%ymm13 - vpaddd %ymm13,%ymm9,%ymm9 - vpxor %ymm9,%ymm5,%ymm5 - vpsrld $20,%ymm5,%ymm3 - vpslld $12,%ymm5,%ymm5 - vpxor %ymm3,%ymm5,%ymm5 - vpaddd %ymm5,%ymm1,%ymm1 - vpxor %ymm1,%ymm13,%ymm13 - vpshufb L$rol8(%rip),%ymm13,%ymm13 - vpaddd %ymm13,%ymm9,%ymm9 - vpxor %ymm9,%ymm5,%ymm5 - vpslld $7,%ymm5,%ymm3 - vpsrld $25,%ymm5,%ymm5 - vpxor %ymm3,%ymm5,%ymm5 - vpalignr $4,%ymm13,%ymm13,%ymm13 - vpalignr $8,%ymm9,%ymm9,%ymm9 - vpalignr $12,%ymm5,%ymm5,%ymm5 - - decq %r10 - jne L$seal_avx2_192_rounds - vpaddd %ymm2,%ymm0,%ymm0 - vpaddd %ymm2,%ymm1,%ymm1 - vpaddd %ymm6,%ymm4,%ymm4 - vpaddd %ymm6,%ymm5,%ymm5 - vpaddd %ymm10,%ymm8,%ymm8 - vpaddd %ymm10,%ymm9,%ymm9 - vpaddd %ymm11,%ymm12,%ymm12 - vpaddd %ymm15,%ymm13,%ymm13 - vperm2i128 $0x02,%ymm0,%ymm4,%ymm3 - - vpand L$clamp(%rip),%ymm3,%ymm3 - vmovdqa %ymm3,0+0(%rbp) - - vperm2i128 $0x13,%ymm0,%ymm4,%ymm0 - vperm2i128 $0x13,%ymm8,%ymm12,%ymm4 - vperm2i128 $0x02,%ymm1,%ymm5,%ymm8 - vperm2i128 $0x02,%ymm9,%ymm13,%ymm12 - vperm2i128 $0x13,%ymm1,%ymm5,%ymm1 - vperm2i128 $0x13,%ymm9,%ymm13,%ymm5 -L$seal_avx2_short: - movq %r8,%r8 - call poly_hash_ad_internal - xorq %rcx,%rcx -L$seal_avx2_short_hash_remainder: - cmpq $16,%rcx - jb L$seal_avx2_short_loop - addq 0+0(%rdi),%r10 - adcq 8+0(%rdi),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - subq $16,%rcx - addq $16,%rdi - jmp L$seal_avx2_short_hash_remainder -L$seal_avx2_short_loop: - cmpq $32,%rbx - jb L$seal_avx2_short_tail - subq $32,%rbx - - vpxor (%rsi),%ymm0,%ymm0 - vmovdqu %ymm0,(%rdi) - leaq 32(%rsi),%rsi - - addq 0+0(%rdi),%r10 - adcq 8+0(%rdi),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - addq 0+16(%rdi),%r10 - adcq 8+16(%rdi),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - leaq 32(%rdi),%rdi - - vmovdqa %ymm4,%ymm0 - vmovdqa %ymm8,%ymm4 - vmovdqa %ymm12,%ymm8 - vmovdqa %ymm1,%ymm12 - vmovdqa %ymm5,%ymm1 - vmovdqa %ymm9,%ymm5 - vmovdqa %ymm13,%ymm9 - vmovdqa %ymm2,%ymm13 - vmovdqa %ymm6,%ymm2 - jmp L$seal_avx2_short_loop -L$seal_avx2_short_tail: - cmpq $16,%rbx - jb L$seal_avx2_exit - subq $16,%rbx - vpxor (%rsi),%xmm0,%xmm3 - vmovdqu %xmm3,(%rdi) - leaq 16(%rsi),%rsi - addq 0+0(%rdi),%r10 - adcq 8+0(%rdi),%r11 - adcq $1,%r12 - movq 0+0+0(%rbp),%rax - movq %rax,%r15 - mulq %r10 - movq %rax,%r13 - movq %rdx,%r14 - movq 0+0+0(%rbp),%rax - mulq %r11 - imulq %r12,%r15 - addq %rax,%r14 - adcq %rdx,%r15 - movq 8+0+0(%rbp),%rax - movq %rax,%r9 - mulq %r10 - addq %rax,%r14 - adcq $0,%rdx - movq %rdx,%r10 - movq 8+0+0(%rbp),%rax - mulq %r11 - addq %rax,%r15 - adcq $0,%rdx - imulq %r12,%r9 - addq %r10,%r15 - adcq %rdx,%r9 - movq %r13,%r10 - movq %r14,%r11 - movq %r15,%r12 - andq $3,%r12 - movq %r15,%r13 - andq $-4,%r13 - movq %r9,%r14 - shrdq $2,%r9,%r15 - shrq $2,%r9 - addq %r13,%r15 - adcq %r14,%r9 - addq %r15,%r10 - adcq %r9,%r11 - adcq $0,%r12 - - leaq 16(%rdi),%rdi - vextracti128 $1,%ymm0,%xmm0 -L$seal_avx2_exit: - vzeroupper - jmp L$seal_sse_tail_16 - - -#endif Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/chacha20_poly1305_x86_64-nasm.obj and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/chacha20_poly1305_x86_64-nasm.obj differ diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/chacha-armv4-ios32.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/chacha-armv4-ios32.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/chacha-armv4-ios32.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/chacha-armv4-ios32.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,1492 +0,0 @@ -// This file is generated from a similarly-named Perl script in the BoringSSL -// source tree. Do not edit by hand. - -#if !defined(__has_feature) -#define __has_feature(x) 0 -#endif -#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) -#define OPENSSL_NO_ASM -#endif - -#if !defined(OPENSSL_NO_ASM) -#include - -@ Silence ARMv8 deprecated IT instruction warnings. This file is used by both -@ ARMv7 and ARMv8 processors and does not use ARMv8 instructions. - - -.text -#if defined(__thumb2__) || defined(__clang__) -.syntax unified -#endif -#if defined(__thumb2__) -.thumb -#else -.code 32 -#endif - -#if defined(__thumb2__) || defined(__clang__) -#define ldrhsb ldrbhs -#endif - -.align 5 -Lsigma: -.long 0x61707865,0x3320646e,0x79622d32,0x6b206574 @ endian-neutral -Lone: -.long 1,0,0,0 -#if __ARM_MAX_ARCH__>=7 - -.private_extern _GFp_armcap_P -LOPENSSL_armcap: -.word _GFp_armcap_P-LChaCha20_ctr32 -#else -.word -1 -#endif - -.globl _GFp_ChaCha20_ctr32 -.private_extern _GFp_ChaCha20_ctr32 -#ifdef __thumb2__ -.thumb_func _GFp_ChaCha20_ctr32 -#endif -.align 5 -_GFp_ChaCha20_ctr32: -LChaCha20_ctr32: - ldr r12,[sp,#0] @ pull pointer to counter and nonce - stmdb sp!,{r0,r1,r2,r4-r11,lr} -#if __ARM_ARCH__<7 && !defined(__thumb2__) - sub r14,pc,#16 @ ChaCha20_ctr32 -#else - adr r14,LChaCha20_ctr32 -#endif - cmp r2,#0 @ len==0? -#ifdef __thumb2__ - itt eq -#endif - addeq sp,sp,#4*3 - beq Lno_data -#if __ARM_MAX_ARCH__>=7 - cmp r2,#192 @ test len - bls Lshort - ldr r4,[r14,#-32] - ldr r4,[r14,r4] -# ifdef __APPLE__ - ldr r4,[r4] -# endif - tst r4,#ARMV7_NEON - bne LChaCha20_neon -Lshort: -#endif - ldmia r12,{r4,r5,r6,r7} @ load counter and nonce - sub sp,sp,#4*(16) @ off-load area - sub r14,r14,#64 @ Lsigma - stmdb sp!,{r4,r5,r6,r7} @ copy counter and nonce - ldmia r3,{r4,r5,r6,r7,r8,r9,r10,r11} @ load key - ldmia r14,{r0,r1,r2,r3} @ load sigma - stmdb sp!,{r4,r5,r6,r7,r8,r9,r10,r11} @ copy key - stmdb sp!,{r0,r1,r2,r3} @ copy sigma - str r10,[sp,#4*(16+10)] @ off-load "rx" - str r11,[sp,#4*(16+11)] @ off-load "rx" - b Loop_outer_enter - -.align 4 -Loop_outer: - ldmia sp,{r0,r1,r2,r3,r4,r5,r6,r7,r8,r9} @ load key material - str r11,[sp,#4*(32+2)] @ save len - str r12, [sp,#4*(32+1)] @ save inp - str r14, [sp,#4*(32+0)] @ save out -Loop_outer_enter: - ldr r11, [sp,#4*(15)] - ldr r12,[sp,#4*(12)] @ modulo-scheduled load - ldr r10, [sp,#4*(13)] - ldr r14,[sp,#4*(14)] - str r11, [sp,#4*(16+15)] - mov r11,#10 - b Loop - -.align 4 -Loop: - subs r11,r11,#1 - add r0,r0,r4 - mov r12,r12,ror#16 - add r1,r1,r5 - mov r10,r10,ror#16 - eor r12,r12,r0,ror#16 - eor r10,r10,r1,ror#16 - add r8,r8,r12 - mov r4,r4,ror#20 - add r9,r9,r10 - mov r5,r5,ror#20 - eor r4,r4,r8,ror#20 - eor r5,r5,r9,ror#20 - add r0,r0,r4 - mov r12,r12,ror#24 - add r1,r1,r5 - mov r10,r10,ror#24 - eor r12,r12,r0,ror#24 - eor r10,r10,r1,ror#24 - add r8,r8,r12 - mov r4,r4,ror#25 - add r9,r9,r10 - mov r5,r5,ror#25 - str r10,[sp,#4*(16+13)] - ldr r10,[sp,#4*(16+15)] - eor r4,r4,r8,ror#25 - eor r5,r5,r9,ror#25 - str r8,[sp,#4*(16+8)] - ldr r8,[sp,#4*(16+10)] - add r2,r2,r6 - mov r14,r14,ror#16 - str r9,[sp,#4*(16+9)] - ldr r9,[sp,#4*(16+11)] - add r3,r3,r7 - mov r10,r10,ror#16 - eor r14,r14,r2,ror#16 - eor r10,r10,r3,ror#16 - add r8,r8,r14 - mov r6,r6,ror#20 - add r9,r9,r10 - mov r7,r7,ror#20 - eor r6,r6,r8,ror#20 - eor r7,r7,r9,ror#20 - add r2,r2,r6 - mov r14,r14,ror#24 - add r3,r3,r7 - mov r10,r10,ror#24 - eor r14,r14,r2,ror#24 - eor r10,r10,r3,ror#24 - add r8,r8,r14 - mov r6,r6,ror#25 - add r9,r9,r10 - mov r7,r7,ror#25 - eor r6,r6,r8,ror#25 - eor r7,r7,r9,ror#25 - add r0,r0,r5 - mov r10,r10,ror#16 - add r1,r1,r6 - mov r12,r12,ror#16 - eor r10,r10,r0,ror#16 - eor r12,r12,r1,ror#16 - add r8,r8,r10 - mov r5,r5,ror#20 - add r9,r9,r12 - mov r6,r6,ror#20 - eor r5,r5,r8,ror#20 - eor r6,r6,r9,ror#20 - add r0,r0,r5 - mov r10,r10,ror#24 - add r1,r1,r6 - mov r12,r12,ror#24 - eor r10,r10,r0,ror#24 - eor r12,r12,r1,ror#24 - add r8,r8,r10 - mov r5,r5,ror#25 - str r10,[sp,#4*(16+15)] - ldr r10,[sp,#4*(16+13)] - add r9,r9,r12 - mov r6,r6,ror#25 - eor r5,r5,r8,ror#25 - eor r6,r6,r9,ror#25 - str r8,[sp,#4*(16+10)] - ldr r8,[sp,#4*(16+8)] - add r2,r2,r7 - mov r10,r10,ror#16 - str r9,[sp,#4*(16+11)] - ldr r9,[sp,#4*(16+9)] - add r3,r3,r4 - mov r14,r14,ror#16 - eor r10,r10,r2,ror#16 - eor r14,r14,r3,ror#16 - add r8,r8,r10 - mov r7,r7,ror#20 - add r9,r9,r14 - mov r4,r4,ror#20 - eor r7,r7,r8,ror#20 - eor r4,r4,r9,ror#20 - add r2,r2,r7 - mov r10,r10,ror#24 - add r3,r3,r4 - mov r14,r14,ror#24 - eor r10,r10,r2,ror#24 - eor r14,r14,r3,ror#24 - add r8,r8,r10 - mov r7,r7,ror#25 - add r9,r9,r14 - mov r4,r4,ror#25 - eor r7,r7,r8,ror#25 - eor r4,r4,r9,ror#25 - bne Loop - - ldr r11,[sp,#4*(32+2)] @ load len - - str r8, [sp,#4*(16+8)] @ modulo-scheduled store - str r9, [sp,#4*(16+9)] - str r12,[sp,#4*(16+12)] - str r10, [sp,#4*(16+13)] - str r14,[sp,#4*(16+14)] - - @ at this point we have first half of 512-bit result in - @ rx and second half at sp+4*(16+8) - - cmp r11,#64 @ done yet? -#ifdef __thumb2__ - itete lo -#endif - addlo r12,sp,#4*(0) @ shortcut or ... - ldrhs r12,[sp,#4*(32+1)] @ ... load inp - addlo r14,sp,#4*(0) @ shortcut or ... - ldrhs r14,[sp,#4*(32+0)] @ ... load out - - ldr r8,[sp,#4*(0)] @ load key material - ldr r9,[sp,#4*(1)] - -#if __ARM_ARCH__>=6 || !defined(__ARMEB__) -# if __ARM_ARCH__<7 - orr r10,r12,r14 - tst r10,#3 @ are input and output aligned? - ldr r10,[sp,#4*(2)] - bne Lunaligned - cmp r11,#64 @ restore flags -# else - ldr r10,[sp,#4*(2)] -# endif - ldr r11,[sp,#4*(3)] - - add r0,r0,r8 @ accumulate key material - add r1,r1,r9 -# ifdef __thumb2__ - itt hs -# endif - ldrhs r8,[r12],#16 @ load input - ldrhs r9,[r12,#-12] - - add r2,r2,r10 - add r3,r3,r11 -# ifdef __thumb2__ - itt hs -# endif - ldrhs r10,[r12,#-8] - ldrhs r11,[r12,#-4] -# if __ARM_ARCH__>=6 && defined(__ARMEB__) - rev r0,r0 - rev r1,r1 - rev r2,r2 - rev r3,r3 -# endif -# ifdef __thumb2__ - itt hs -# endif - eorhs r0,r0,r8 @ xor with input - eorhs r1,r1,r9 - add r8,sp,#4*(4) - str r0,[r14],#16 @ store output -# ifdef __thumb2__ - itt hs -# endif - eorhs r2,r2,r10 - eorhs r3,r3,r11 - ldmia r8,{r8,r9,r10,r11} @ load key material - str r1,[r14,#-12] - str r2,[r14,#-8] - str r3,[r14,#-4] - - add r4,r4,r8 @ accumulate key material - add r5,r5,r9 -# ifdef __thumb2__ - itt hs -# endif - ldrhs r8,[r12],#16 @ load input - ldrhs r9,[r12,#-12] - add r6,r6,r10 - add r7,r7,r11 -# ifdef __thumb2__ - itt hs -# endif - ldrhs r10,[r12,#-8] - ldrhs r11,[r12,#-4] -# if __ARM_ARCH__>=6 && defined(__ARMEB__) - rev r4,r4 - rev r5,r5 - rev r6,r6 - rev r7,r7 -# endif -# ifdef __thumb2__ - itt hs -# endif - eorhs r4,r4,r8 - eorhs r5,r5,r9 - add r8,sp,#4*(8) - str r4,[r14],#16 @ store output -# ifdef __thumb2__ - itt hs -# endif - eorhs r6,r6,r10 - eorhs r7,r7,r11 - str r5,[r14,#-12] - ldmia r8,{r8,r9,r10,r11} @ load key material - str r6,[r14,#-8] - add r0,sp,#4*(16+8) - str r7,[r14,#-4] - - ldmia r0,{r0,r1,r2,r3,r4,r5,r6,r7} @ load second half - - add r0,r0,r8 @ accumulate key material - add r1,r1,r9 -# ifdef __thumb2__ - itt hs -# endif - ldrhs r8,[r12],#16 @ load input - ldrhs r9,[r12,#-12] -# ifdef __thumb2__ - itt hi -# endif - strhi r10,[sp,#4*(16+10)] @ copy "rx" while at it - strhi r11,[sp,#4*(16+11)] @ copy "rx" while at it - add r2,r2,r10 - add r3,r3,r11 -# ifdef __thumb2__ - itt hs -# endif - ldrhs r10,[r12,#-8] - ldrhs r11,[r12,#-4] -# if __ARM_ARCH__>=6 && defined(__ARMEB__) - rev r0,r0 - rev r1,r1 - rev r2,r2 - rev r3,r3 -# endif -# ifdef __thumb2__ - itt hs -# endif - eorhs r0,r0,r8 - eorhs r1,r1,r9 - add r8,sp,#4*(12) - str r0,[r14],#16 @ store output -# ifdef __thumb2__ - itt hs -# endif - eorhs r2,r2,r10 - eorhs r3,r3,r11 - str r1,[r14,#-12] - ldmia r8,{r8,r9,r10,r11} @ load key material - str r2,[r14,#-8] - str r3,[r14,#-4] - - add r4,r4,r8 @ accumulate key material - add r5,r5,r9 -# ifdef __thumb2__ - itt hi -# endif - addhi r8,r8,#1 @ next counter value - strhi r8,[sp,#4*(12)] @ save next counter value -# ifdef __thumb2__ - itt hs -# endif - ldrhs r8,[r12],#16 @ load input - ldrhs r9,[r12,#-12] - add r6,r6,r10 - add r7,r7,r11 -# ifdef __thumb2__ - itt hs -# endif - ldrhs r10,[r12,#-8] - ldrhs r11,[r12,#-4] -# if __ARM_ARCH__>=6 && defined(__ARMEB__) - rev r4,r4 - rev r5,r5 - rev r6,r6 - rev r7,r7 -# endif -# ifdef __thumb2__ - itt hs -# endif - eorhs r4,r4,r8 - eorhs r5,r5,r9 -# ifdef __thumb2__ - it ne -# endif - ldrne r8,[sp,#4*(32+2)] @ re-load len -# ifdef __thumb2__ - itt hs -# endif - eorhs r6,r6,r10 - eorhs r7,r7,r11 - str r4,[r14],#16 @ store output - str r5,[r14,#-12] -# ifdef __thumb2__ - it hs -# endif - subhs r11,r8,#64 @ len-=64 - str r6,[r14,#-8] - str r7,[r14,#-4] - bhi Loop_outer - - beq Ldone -# if __ARM_ARCH__<7 - b Ltail - -.align 4 -Lunaligned:@ unaligned endian-neutral path - cmp r11,#64 @ restore flags -# endif -#endif -#if __ARM_ARCH__<7 - ldr r11,[sp,#4*(3)] - add r0,r0,r8 @ accumulate key material - add r1,r1,r9 - add r2,r2,r10 -# ifdef __thumb2__ - itete lo -# endif - eorlo r8,r8,r8 @ zero or ... - ldrhsb r8,[r12],#16 @ ... load input - eorlo r9,r9,r9 - ldrhsb r9,[r12,#-12] - - add r3,r3,r11 -# ifdef __thumb2__ - itete lo -# endif - eorlo r10,r10,r10 - ldrhsb r10,[r12,#-8] - eorlo r11,r11,r11 - ldrhsb r11,[r12,#-4] - - eor r0,r8,r0 @ xor with input (or zero) - eor r1,r9,r1 -# ifdef __thumb2__ - itt hs -# endif - ldrhsb r8,[r12,#-15] @ load more input - ldrhsb r9,[r12,#-11] - eor r2,r10,r2 - strb r0,[r14],#16 @ store output - eor r3,r11,r3 -# ifdef __thumb2__ - itt hs -# endif - ldrhsb r10,[r12,#-7] - ldrhsb r11,[r12,#-3] - strb r1,[r14,#-12] - eor r0,r8,r0,lsr#8 - strb r2,[r14,#-8] - eor r1,r9,r1,lsr#8 -# ifdef __thumb2__ - itt hs -# endif - ldrhsb r8,[r12,#-14] @ load more input - ldrhsb r9,[r12,#-10] - strb r3,[r14,#-4] - eor r2,r10,r2,lsr#8 - strb r0,[r14,#-15] - eor r3,r11,r3,lsr#8 -# ifdef __thumb2__ - itt hs -# endif - ldrhsb r10,[r12,#-6] - ldrhsb r11,[r12,#-2] - strb r1,[r14,#-11] - eor r0,r8,r0,lsr#8 - strb r2,[r14,#-7] - eor r1,r9,r1,lsr#8 -# ifdef __thumb2__ - itt hs -# endif - ldrhsb r8,[r12,#-13] @ load more input - ldrhsb r9,[r12,#-9] - strb r3,[r14,#-3] - eor r2,r10,r2,lsr#8 - strb r0,[r14,#-14] - eor r3,r11,r3,lsr#8 -# ifdef __thumb2__ - itt hs -# endif - ldrhsb r10,[r12,#-5] - ldrhsb r11,[r12,#-1] - strb r1,[r14,#-10] - strb r2,[r14,#-6] - eor r0,r8,r0,lsr#8 - strb r3,[r14,#-2] - eor r1,r9,r1,lsr#8 - strb r0,[r14,#-13] - eor r2,r10,r2,lsr#8 - strb r1,[r14,#-9] - eor r3,r11,r3,lsr#8 - strb r2,[r14,#-5] - strb r3,[r14,#-1] - add r8,sp,#4*(4+0) - ldmia r8,{r8,r9,r10,r11} @ load key material - add r0,sp,#4*(16+8) - add r4,r4,r8 @ accumulate key material - add r5,r5,r9 - add r6,r6,r10 -# ifdef __thumb2__ - itete lo -# endif - eorlo r8,r8,r8 @ zero or ... - ldrhsb r8,[r12],#16 @ ... load input - eorlo r9,r9,r9 - ldrhsb r9,[r12,#-12] - - add r7,r7,r11 -# ifdef __thumb2__ - itete lo -# endif - eorlo r10,r10,r10 - ldrhsb r10,[r12,#-8] - eorlo r11,r11,r11 - ldrhsb r11,[r12,#-4] - - eor r4,r8,r4 @ xor with input (or zero) - eor r5,r9,r5 -# ifdef __thumb2__ - itt hs -# endif - ldrhsb r8,[r12,#-15] @ load more input - ldrhsb r9,[r12,#-11] - eor r6,r10,r6 - strb r4,[r14],#16 @ store output - eor r7,r11,r7 -# ifdef __thumb2__ - itt hs -# endif - ldrhsb r10,[r12,#-7] - ldrhsb r11,[r12,#-3] - strb r5,[r14,#-12] - eor r4,r8,r4,lsr#8 - strb r6,[r14,#-8] - eor r5,r9,r5,lsr#8 -# ifdef __thumb2__ - itt hs -# endif - ldrhsb r8,[r12,#-14] @ load more input - ldrhsb r9,[r12,#-10] - strb r7,[r14,#-4] - eor r6,r10,r6,lsr#8 - strb r4,[r14,#-15] - eor r7,r11,r7,lsr#8 -# ifdef __thumb2__ - itt hs -# endif - ldrhsb r10,[r12,#-6] - ldrhsb r11,[r12,#-2] - strb r5,[r14,#-11] - eor r4,r8,r4,lsr#8 - strb r6,[r14,#-7] - eor r5,r9,r5,lsr#8 -# ifdef __thumb2__ - itt hs -# endif - ldrhsb r8,[r12,#-13] @ load more input - ldrhsb r9,[r12,#-9] - strb r7,[r14,#-3] - eor r6,r10,r6,lsr#8 - strb r4,[r14,#-14] - eor r7,r11,r7,lsr#8 -# ifdef __thumb2__ - itt hs -# endif - ldrhsb r10,[r12,#-5] - ldrhsb r11,[r12,#-1] - strb r5,[r14,#-10] - strb r6,[r14,#-6] - eor r4,r8,r4,lsr#8 - strb r7,[r14,#-2] - eor r5,r9,r5,lsr#8 - strb r4,[r14,#-13] - eor r6,r10,r6,lsr#8 - strb r5,[r14,#-9] - eor r7,r11,r7,lsr#8 - strb r6,[r14,#-5] - strb r7,[r14,#-1] - add r8,sp,#4*(4+4) - ldmia r8,{r8,r9,r10,r11} @ load key material - ldmia r0,{r0,r1,r2,r3,r4,r5,r6,r7} @ load second half -# ifdef __thumb2__ - itt hi -# endif - strhi r10,[sp,#4*(16+10)] @ copy "rx" - strhi r11,[sp,#4*(16+11)] @ copy "rx" - add r0,r0,r8 @ accumulate key material - add r1,r1,r9 - add r2,r2,r10 -# ifdef __thumb2__ - itete lo -# endif - eorlo r8,r8,r8 @ zero or ... - ldrhsb r8,[r12],#16 @ ... load input - eorlo r9,r9,r9 - ldrhsb r9,[r12,#-12] - - add r3,r3,r11 -# ifdef __thumb2__ - itete lo -# endif - eorlo r10,r10,r10 - ldrhsb r10,[r12,#-8] - eorlo r11,r11,r11 - ldrhsb r11,[r12,#-4] - - eor r0,r8,r0 @ xor with input (or zero) - eor r1,r9,r1 -# ifdef __thumb2__ - itt hs -# endif - ldrhsb r8,[r12,#-15] @ load more input - ldrhsb r9,[r12,#-11] - eor r2,r10,r2 - strb r0,[r14],#16 @ store output - eor r3,r11,r3 -# ifdef __thumb2__ - itt hs -# endif - ldrhsb r10,[r12,#-7] - ldrhsb r11,[r12,#-3] - strb r1,[r14,#-12] - eor r0,r8,r0,lsr#8 - strb r2,[r14,#-8] - eor r1,r9,r1,lsr#8 -# ifdef __thumb2__ - itt hs -# endif - ldrhsb r8,[r12,#-14] @ load more input - ldrhsb r9,[r12,#-10] - strb r3,[r14,#-4] - eor r2,r10,r2,lsr#8 - strb r0,[r14,#-15] - eor r3,r11,r3,lsr#8 -# ifdef __thumb2__ - itt hs -# endif - ldrhsb r10,[r12,#-6] - ldrhsb r11,[r12,#-2] - strb r1,[r14,#-11] - eor r0,r8,r0,lsr#8 - strb r2,[r14,#-7] - eor r1,r9,r1,lsr#8 -# ifdef __thumb2__ - itt hs -# endif - ldrhsb r8,[r12,#-13] @ load more input - ldrhsb r9,[r12,#-9] - strb r3,[r14,#-3] - eor r2,r10,r2,lsr#8 - strb r0,[r14,#-14] - eor r3,r11,r3,lsr#8 -# ifdef __thumb2__ - itt hs -# endif - ldrhsb r10,[r12,#-5] - ldrhsb r11,[r12,#-1] - strb r1,[r14,#-10] - strb r2,[r14,#-6] - eor r0,r8,r0,lsr#8 - strb r3,[r14,#-2] - eor r1,r9,r1,lsr#8 - strb r0,[r14,#-13] - eor r2,r10,r2,lsr#8 - strb r1,[r14,#-9] - eor r3,r11,r3,lsr#8 - strb r2,[r14,#-5] - strb r3,[r14,#-1] - add r8,sp,#4*(4+8) - ldmia r8,{r8,r9,r10,r11} @ load key material - add r4,r4,r8 @ accumulate key material -# ifdef __thumb2__ - itt hi -# endif - addhi r8,r8,#1 @ next counter value - strhi r8,[sp,#4*(12)] @ save next counter value - add r5,r5,r9 - add r6,r6,r10 -# ifdef __thumb2__ - itete lo -# endif - eorlo r8,r8,r8 @ zero or ... - ldrhsb r8,[r12],#16 @ ... load input - eorlo r9,r9,r9 - ldrhsb r9,[r12,#-12] - - add r7,r7,r11 -# ifdef __thumb2__ - itete lo -# endif - eorlo r10,r10,r10 - ldrhsb r10,[r12,#-8] - eorlo r11,r11,r11 - ldrhsb r11,[r12,#-4] - - eor r4,r8,r4 @ xor with input (or zero) - eor r5,r9,r5 -# ifdef __thumb2__ - itt hs -# endif - ldrhsb r8,[r12,#-15] @ load more input - ldrhsb r9,[r12,#-11] - eor r6,r10,r6 - strb r4,[r14],#16 @ store output - eor r7,r11,r7 -# ifdef __thumb2__ - itt hs -# endif - ldrhsb r10,[r12,#-7] - ldrhsb r11,[r12,#-3] - strb r5,[r14,#-12] - eor r4,r8,r4,lsr#8 - strb r6,[r14,#-8] - eor r5,r9,r5,lsr#8 -# ifdef __thumb2__ - itt hs -# endif - ldrhsb r8,[r12,#-14] @ load more input - ldrhsb r9,[r12,#-10] - strb r7,[r14,#-4] - eor r6,r10,r6,lsr#8 - strb r4,[r14,#-15] - eor r7,r11,r7,lsr#8 -# ifdef __thumb2__ - itt hs -# endif - ldrhsb r10,[r12,#-6] - ldrhsb r11,[r12,#-2] - strb r5,[r14,#-11] - eor r4,r8,r4,lsr#8 - strb r6,[r14,#-7] - eor r5,r9,r5,lsr#8 -# ifdef __thumb2__ - itt hs -# endif - ldrhsb r8,[r12,#-13] @ load more input - ldrhsb r9,[r12,#-9] - strb r7,[r14,#-3] - eor r6,r10,r6,lsr#8 - strb r4,[r14,#-14] - eor r7,r11,r7,lsr#8 -# ifdef __thumb2__ - itt hs -# endif - ldrhsb r10,[r12,#-5] - ldrhsb r11,[r12,#-1] - strb r5,[r14,#-10] - strb r6,[r14,#-6] - eor r4,r8,r4,lsr#8 - strb r7,[r14,#-2] - eor r5,r9,r5,lsr#8 - strb r4,[r14,#-13] - eor r6,r10,r6,lsr#8 - strb r5,[r14,#-9] - eor r7,r11,r7,lsr#8 - strb r6,[r14,#-5] - strb r7,[r14,#-1] -# ifdef __thumb2__ - it ne -# endif - ldrne r8,[sp,#4*(32+2)] @ re-load len -# ifdef __thumb2__ - it hs -# endif - subhs r11,r8,#64 @ len-=64 - bhi Loop_outer - - beq Ldone -#endif - -Ltail: - ldr r12,[sp,#4*(32+1)] @ load inp - add r9,sp,#4*(0) - ldr r14,[sp,#4*(32+0)] @ load out - -Loop_tail: - ldrb r10,[r9],#1 @ read buffer on stack - ldrb r11,[r12],#1 @ read input - subs r8,r8,#1 - eor r11,r11,r10 - strb r11,[r14],#1 @ store output - bne Loop_tail - -Ldone: - add sp,sp,#4*(32+3) -Lno_data: - ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,pc} - -#if __ARM_MAX_ARCH__>=7 - - - -#ifdef __thumb2__ -.thumb_func ChaCha20_neon -#endif -.align 5 -ChaCha20_neon: - ldr r12,[sp,#0] @ pull pointer to counter and nonce - stmdb sp!,{r0,r1,r2,r4-r11,lr} -LChaCha20_neon: - adr r14,Lsigma - vstmdb sp!,{d8,d9,d10,d11,d12,d13,d14,d15} @ ABI spec says so - stmdb sp!,{r0,r1,r2,r3} - - vld1.32 {q1,q2},[r3] @ load key - ldmia r3,{r4,r5,r6,r7,r8,r9,r10,r11} @ load key - - sub sp,sp,#4*(16+16) - vld1.32 {q3},[r12] @ load counter and nonce - add r12,sp,#4*8 - ldmia r14,{r0,r1,r2,r3} @ load sigma - vld1.32 {q0},[r14]! @ load sigma - vld1.32 {q12},[r14] @ one - vst1.32 {q2,q3},[r12] @ copy 1/2key|counter|nonce - vst1.32 {q0,q1},[sp] @ copy sigma|1/2key - - str r10,[sp,#4*(16+10)] @ off-load "rx" - str r11,[sp,#4*(16+11)] @ off-load "rx" - vshl.i32 d26,d24,#1 @ two - vstr d24,[sp,#4*(16+0)] - vshl.i32 d28,d24,#2 @ four - vstr d26,[sp,#4*(16+2)] - vmov q4,q0 - vstr d28,[sp,#4*(16+4)] - vmov q8,q0 - vmov q5,q1 - vmov q9,q1 - b Loop_neon_enter - -.align 4 -Loop_neon_outer: - ldmia sp,{r0,r1,r2,r3,r4,r5,r6,r7,r8,r9} @ load key material - cmp r11,#64*2 @ if len<=64*2 - bls Lbreak_neon @ switch to integer-only - vmov q4,q0 - str r11,[sp,#4*(32+2)] @ save len - vmov q8,q0 - str r12, [sp,#4*(32+1)] @ save inp - vmov q5,q1 - str r14, [sp,#4*(32+0)] @ save out - vmov q9,q1 -Loop_neon_enter: - ldr r11, [sp,#4*(15)] - vadd.i32 q7,q3,q12 @ counter+1 - ldr r12,[sp,#4*(12)] @ modulo-scheduled load - vmov q6,q2 - ldr r10, [sp,#4*(13)] - vmov q10,q2 - ldr r14,[sp,#4*(14)] - vadd.i32 q11,q7,q12 @ counter+2 - str r11, [sp,#4*(16+15)] - mov r11,#10 - add r12,r12,#3 @ counter+3 - b Loop_neon - -.align 4 -Loop_neon: - subs r11,r11,#1 - vadd.i32 q0,q0,q1 - add r0,r0,r4 - vadd.i32 q4,q4,q5 - mov r12,r12,ror#16 - vadd.i32 q8,q8,q9 - add r1,r1,r5 - veor q3,q3,q0 - mov r10,r10,ror#16 - veor q7,q7,q4 - eor r12,r12,r0,ror#16 - veor q11,q11,q8 - eor r10,r10,r1,ror#16 - vrev32.16 q3,q3 - add r8,r8,r12 - vrev32.16 q7,q7 - mov r4,r4,ror#20 - vrev32.16 q11,q11 - add r9,r9,r10 - vadd.i32 q2,q2,q3 - mov r5,r5,ror#20 - vadd.i32 q6,q6,q7 - eor r4,r4,r8,ror#20 - vadd.i32 q10,q10,q11 - eor r5,r5,r9,ror#20 - veor q12,q1,q2 - add r0,r0,r4 - veor q13,q5,q6 - mov r12,r12,ror#24 - veor q14,q9,q10 - add r1,r1,r5 - vshr.u32 q1,q12,#20 - mov r10,r10,ror#24 - vshr.u32 q5,q13,#20 - eor r12,r12,r0,ror#24 - vshr.u32 q9,q14,#20 - eor r10,r10,r1,ror#24 - vsli.32 q1,q12,#12 - add r8,r8,r12 - vsli.32 q5,q13,#12 - mov r4,r4,ror#25 - vsli.32 q9,q14,#12 - add r9,r9,r10 - vadd.i32 q0,q0,q1 - mov r5,r5,ror#25 - vadd.i32 q4,q4,q5 - str r10,[sp,#4*(16+13)] - vadd.i32 q8,q8,q9 - ldr r10,[sp,#4*(16+15)] - veor q12,q3,q0 - eor r4,r4,r8,ror#25 - veor q13,q7,q4 - eor r5,r5,r9,ror#25 - veor q14,q11,q8 - str r8,[sp,#4*(16+8)] - vshr.u32 q3,q12,#24 - ldr r8,[sp,#4*(16+10)] - vshr.u32 q7,q13,#24 - add r2,r2,r6 - vshr.u32 q11,q14,#24 - mov r14,r14,ror#16 - vsli.32 q3,q12,#8 - str r9,[sp,#4*(16+9)] - vsli.32 q7,q13,#8 - ldr r9,[sp,#4*(16+11)] - vsli.32 q11,q14,#8 - add r3,r3,r7 - vadd.i32 q2,q2,q3 - mov r10,r10,ror#16 - vadd.i32 q6,q6,q7 - eor r14,r14,r2,ror#16 - vadd.i32 q10,q10,q11 - eor r10,r10,r3,ror#16 - veor q12,q1,q2 - add r8,r8,r14 - veor q13,q5,q6 - mov r6,r6,ror#20 - veor q14,q9,q10 - add r9,r9,r10 - vshr.u32 q1,q12,#25 - mov r7,r7,ror#20 - vshr.u32 q5,q13,#25 - eor r6,r6,r8,ror#20 - vshr.u32 q9,q14,#25 - eor r7,r7,r9,ror#20 - vsli.32 q1,q12,#7 - add r2,r2,r6 - vsli.32 q5,q13,#7 - mov r14,r14,ror#24 - vsli.32 q9,q14,#7 - add r3,r3,r7 - vext.8 q2,q2,q2,#8 - mov r10,r10,ror#24 - vext.8 q6,q6,q6,#8 - eor r14,r14,r2,ror#24 - vext.8 q10,q10,q10,#8 - eor r10,r10,r3,ror#24 - vext.8 q1,q1,q1,#4 - add r8,r8,r14 - vext.8 q5,q5,q5,#4 - mov r6,r6,ror#25 - vext.8 q9,q9,q9,#4 - add r9,r9,r10 - vext.8 q3,q3,q3,#12 - mov r7,r7,ror#25 - vext.8 q7,q7,q7,#12 - eor r6,r6,r8,ror#25 - vext.8 q11,q11,q11,#12 - eor r7,r7,r9,ror#25 - vadd.i32 q0,q0,q1 - add r0,r0,r5 - vadd.i32 q4,q4,q5 - mov r10,r10,ror#16 - vadd.i32 q8,q8,q9 - add r1,r1,r6 - veor q3,q3,q0 - mov r12,r12,ror#16 - veor q7,q7,q4 - eor r10,r10,r0,ror#16 - veor q11,q11,q8 - eor r12,r12,r1,ror#16 - vrev32.16 q3,q3 - add r8,r8,r10 - vrev32.16 q7,q7 - mov r5,r5,ror#20 - vrev32.16 q11,q11 - add r9,r9,r12 - vadd.i32 q2,q2,q3 - mov r6,r6,ror#20 - vadd.i32 q6,q6,q7 - eor r5,r5,r8,ror#20 - vadd.i32 q10,q10,q11 - eor r6,r6,r9,ror#20 - veor q12,q1,q2 - add r0,r0,r5 - veor q13,q5,q6 - mov r10,r10,ror#24 - veor q14,q9,q10 - add r1,r1,r6 - vshr.u32 q1,q12,#20 - mov r12,r12,ror#24 - vshr.u32 q5,q13,#20 - eor r10,r10,r0,ror#24 - vshr.u32 q9,q14,#20 - eor r12,r12,r1,ror#24 - vsli.32 q1,q12,#12 - add r8,r8,r10 - vsli.32 q5,q13,#12 - mov r5,r5,ror#25 - vsli.32 q9,q14,#12 - str r10,[sp,#4*(16+15)] - vadd.i32 q0,q0,q1 - ldr r10,[sp,#4*(16+13)] - vadd.i32 q4,q4,q5 - add r9,r9,r12 - vadd.i32 q8,q8,q9 - mov r6,r6,ror#25 - veor q12,q3,q0 - eor r5,r5,r8,ror#25 - veor q13,q7,q4 - eor r6,r6,r9,ror#25 - veor q14,q11,q8 - str r8,[sp,#4*(16+10)] - vshr.u32 q3,q12,#24 - ldr r8,[sp,#4*(16+8)] - vshr.u32 q7,q13,#24 - add r2,r2,r7 - vshr.u32 q11,q14,#24 - mov r10,r10,ror#16 - vsli.32 q3,q12,#8 - str r9,[sp,#4*(16+11)] - vsli.32 q7,q13,#8 - ldr r9,[sp,#4*(16+9)] - vsli.32 q11,q14,#8 - add r3,r3,r4 - vadd.i32 q2,q2,q3 - mov r14,r14,ror#16 - vadd.i32 q6,q6,q7 - eor r10,r10,r2,ror#16 - vadd.i32 q10,q10,q11 - eor r14,r14,r3,ror#16 - veor q12,q1,q2 - add r8,r8,r10 - veor q13,q5,q6 - mov r7,r7,ror#20 - veor q14,q9,q10 - add r9,r9,r14 - vshr.u32 q1,q12,#25 - mov r4,r4,ror#20 - vshr.u32 q5,q13,#25 - eor r7,r7,r8,ror#20 - vshr.u32 q9,q14,#25 - eor r4,r4,r9,ror#20 - vsli.32 q1,q12,#7 - add r2,r2,r7 - vsli.32 q5,q13,#7 - mov r10,r10,ror#24 - vsli.32 q9,q14,#7 - add r3,r3,r4 - vext.8 q2,q2,q2,#8 - mov r14,r14,ror#24 - vext.8 q6,q6,q6,#8 - eor r10,r10,r2,ror#24 - vext.8 q10,q10,q10,#8 - eor r14,r14,r3,ror#24 - vext.8 q1,q1,q1,#12 - add r8,r8,r10 - vext.8 q5,q5,q5,#12 - mov r7,r7,ror#25 - vext.8 q9,q9,q9,#12 - add r9,r9,r14 - vext.8 q3,q3,q3,#4 - mov r4,r4,ror#25 - vext.8 q7,q7,q7,#4 - eor r7,r7,r8,ror#25 - vext.8 q11,q11,q11,#4 - eor r4,r4,r9,ror#25 - bne Loop_neon - - add r11,sp,#32 - vld1.32 {q12,q13},[sp] @ load key material - vld1.32 {q14,q15},[r11] - - ldr r11,[sp,#4*(32+2)] @ load len - - str r8, [sp,#4*(16+8)] @ modulo-scheduled store - str r9, [sp,#4*(16+9)] - str r12,[sp,#4*(16+12)] - str r10, [sp,#4*(16+13)] - str r14,[sp,#4*(16+14)] - - @ at this point we have first half of 512-bit result in - @ rx and second half at sp+4*(16+8) - - ldr r12,[sp,#4*(32+1)] @ load inp - ldr r14,[sp,#4*(32+0)] @ load out - - vadd.i32 q0,q0,q12 @ accumulate key material - vadd.i32 q4,q4,q12 - vadd.i32 q8,q8,q12 - vldr d24,[sp,#4*(16+0)] @ one - - vadd.i32 q1,q1,q13 - vadd.i32 q5,q5,q13 - vadd.i32 q9,q9,q13 - vldr d26,[sp,#4*(16+2)] @ two - - vadd.i32 q2,q2,q14 - vadd.i32 q6,q6,q14 - vadd.i32 q10,q10,q14 - vadd.i32 d14,d14,d24 @ counter+1 - vadd.i32 d22,d22,d26 @ counter+2 - - vadd.i32 q3,q3,q15 - vadd.i32 q7,q7,q15 - vadd.i32 q11,q11,q15 - - cmp r11,#64*4 - blo Ltail_neon - - vld1.8 {q12,q13},[r12]! @ load input - mov r11,sp - vld1.8 {q14,q15},[r12]! - veor q0,q0,q12 @ xor with input - veor q1,q1,q13 - vld1.8 {q12,q13},[r12]! - veor q2,q2,q14 - veor q3,q3,q15 - vld1.8 {q14,q15},[r12]! - - veor q4,q4,q12 - vst1.8 {q0,q1},[r14]! @ store output - veor q5,q5,q13 - vld1.8 {q12,q13},[r12]! - veor q6,q6,q14 - vst1.8 {q2,q3},[r14]! - veor q7,q7,q15 - vld1.8 {q14,q15},[r12]! - - veor q8,q8,q12 - vld1.32 {q0,q1},[r11]! @ load for next iteration - veor d25,d25,d25 - vldr d24,[sp,#4*(16+4)] @ four - veor q9,q9,q13 - vld1.32 {q2,q3},[r11] - veor q10,q10,q14 - vst1.8 {q4,q5},[r14]! - veor q11,q11,q15 - vst1.8 {q6,q7},[r14]! - - vadd.i32 d6,d6,d24 @ next counter value - vldr d24,[sp,#4*(16+0)] @ one - - ldmia sp,{r8,r9,r10,r11} @ load key material - add r0,r0,r8 @ accumulate key material - ldr r8,[r12],#16 @ load input - vst1.8 {q8,q9},[r14]! - add r1,r1,r9 - ldr r9,[r12,#-12] - vst1.8 {q10,q11},[r14]! - add r2,r2,r10 - ldr r10,[r12,#-8] - add r3,r3,r11 - ldr r11,[r12,#-4] -# ifdef __ARMEB__ - rev r0,r0 - rev r1,r1 - rev r2,r2 - rev r3,r3 -# endif - eor r0,r0,r8 @ xor with input - add r8,sp,#4*(4) - eor r1,r1,r9 - str r0,[r14],#16 @ store output - eor r2,r2,r10 - str r1,[r14,#-12] - eor r3,r3,r11 - ldmia r8,{r8,r9,r10,r11} @ load key material - str r2,[r14,#-8] - str r3,[r14,#-4] - - add r4,r4,r8 @ accumulate key material - ldr r8,[r12],#16 @ load input - add r5,r5,r9 - ldr r9,[r12,#-12] - add r6,r6,r10 - ldr r10,[r12,#-8] - add r7,r7,r11 - ldr r11,[r12,#-4] -# ifdef __ARMEB__ - rev r4,r4 - rev r5,r5 - rev r6,r6 - rev r7,r7 -# endif - eor r4,r4,r8 - add r8,sp,#4*(8) - eor r5,r5,r9 - str r4,[r14],#16 @ store output - eor r6,r6,r10 - str r5,[r14,#-12] - eor r7,r7,r11 - ldmia r8,{r8,r9,r10,r11} @ load key material - str r6,[r14,#-8] - add r0,sp,#4*(16+8) - str r7,[r14,#-4] - - ldmia r0,{r0,r1,r2,r3,r4,r5,r6,r7} @ load second half - - add r0,r0,r8 @ accumulate key material - ldr r8,[r12],#16 @ load input - add r1,r1,r9 - ldr r9,[r12,#-12] -# ifdef __thumb2__ - it hi -# endif - strhi r10,[sp,#4*(16+10)] @ copy "rx" while at it - add r2,r2,r10 - ldr r10,[r12,#-8] -# ifdef __thumb2__ - it hi -# endif - strhi r11,[sp,#4*(16+11)] @ copy "rx" while at it - add r3,r3,r11 - ldr r11,[r12,#-4] -# ifdef __ARMEB__ - rev r0,r0 - rev r1,r1 - rev r2,r2 - rev r3,r3 -# endif - eor r0,r0,r8 - add r8,sp,#4*(12) - eor r1,r1,r9 - str r0,[r14],#16 @ store output - eor r2,r2,r10 - str r1,[r14,#-12] - eor r3,r3,r11 - ldmia r8,{r8,r9,r10,r11} @ load key material - str r2,[r14,#-8] - str r3,[r14,#-4] - - add r4,r4,r8 @ accumulate key material - add r8,r8,#4 @ next counter value - add r5,r5,r9 - str r8,[sp,#4*(12)] @ save next counter value - ldr r8,[r12],#16 @ load input - add r6,r6,r10 - add r4,r4,#3 @ counter+3 - ldr r9,[r12,#-12] - add r7,r7,r11 - ldr r10,[r12,#-8] - ldr r11,[r12,#-4] -# ifdef __ARMEB__ - rev r4,r4 - rev r5,r5 - rev r6,r6 - rev r7,r7 -# endif - eor r4,r4,r8 -# ifdef __thumb2__ - it hi -# endif - ldrhi r8,[sp,#4*(32+2)] @ re-load len - eor r5,r5,r9 - eor r6,r6,r10 - str r4,[r14],#16 @ store output - eor r7,r7,r11 - str r5,[r14,#-12] - sub r11,r8,#64*4 @ len-=64*4 - str r6,[r14,#-8] - str r7,[r14,#-4] - bhi Loop_neon_outer - - b Ldone_neon - -.align 4 -Lbreak_neon: - @ harmonize NEON and integer-only stack frames: load data - @ from NEON frame, but save to integer-only one; distance - @ between the two is 4*(32+4+16-32)=4*(20). - - str r11, [sp,#4*(20+32+2)] @ save len - add r11,sp,#4*(32+4) - str r12, [sp,#4*(20+32+1)] @ save inp - str r14, [sp,#4*(20+32+0)] @ save out - - ldr r12,[sp,#4*(16+10)] - ldr r14,[sp,#4*(16+11)] - vldmia r11,{d8,d9,d10,d11,d12,d13,d14,d15} @ fulfill ABI requirement - str r12,[sp,#4*(20+16+10)] @ copy "rx" - str r14,[sp,#4*(20+16+11)] @ copy "rx" - - ldr r11, [sp,#4*(15)] - ldr r12,[sp,#4*(12)] @ modulo-scheduled load - ldr r10, [sp,#4*(13)] - ldr r14,[sp,#4*(14)] - str r11, [sp,#4*(20+16+15)] - add r11,sp,#4*(20) - vst1.32 {q0,q1},[r11]! @ copy key - add sp,sp,#4*(20) @ switch frame - vst1.32 {q2,q3},[r11] - mov r11,#10 - b Loop @ go integer-only - -.align 4 -Ltail_neon: - cmp r11,#64*3 - bhs L192_or_more_neon - cmp r11,#64*2 - bhs L128_or_more_neon - cmp r11,#64*1 - bhs L64_or_more_neon - - add r8,sp,#4*(8) - vst1.8 {q0,q1},[sp] - add r10,sp,#4*(0) - vst1.8 {q2,q3},[r8] - b Loop_tail_neon - -.align 4 -L64_or_more_neon: - vld1.8 {q12,q13},[r12]! - vld1.8 {q14,q15},[r12]! - veor q0,q0,q12 - veor q1,q1,q13 - veor q2,q2,q14 - veor q3,q3,q15 - vst1.8 {q0,q1},[r14]! - vst1.8 {q2,q3},[r14]! - - beq Ldone_neon - - add r8,sp,#4*(8) - vst1.8 {q4,q5},[sp] - add r10,sp,#4*(0) - vst1.8 {q6,q7},[r8] - sub r11,r11,#64*1 @ len-=64*1 - b Loop_tail_neon - -.align 4 -L128_or_more_neon: - vld1.8 {q12,q13},[r12]! - vld1.8 {q14,q15},[r12]! - veor q0,q0,q12 - veor q1,q1,q13 - vld1.8 {q12,q13},[r12]! - veor q2,q2,q14 - veor q3,q3,q15 - vld1.8 {q14,q15},[r12]! - - veor q4,q4,q12 - veor q5,q5,q13 - vst1.8 {q0,q1},[r14]! - veor q6,q6,q14 - vst1.8 {q2,q3},[r14]! - veor q7,q7,q15 - vst1.8 {q4,q5},[r14]! - vst1.8 {q6,q7},[r14]! - - beq Ldone_neon - - add r8,sp,#4*(8) - vst1.8 {q8,q9},[sp] - add r10,sp,#4*(0) - vst1.8 {q10,q11},[r8] - sub r11,r11,#64*2 @ len-=64*2 - b Loop_tail_neon - -.align 4 -L192_or_more_neon: - vld1.8 {q12,q13},[r12]! - vld1.8 {q14,q15},[r12]! - veor q0,q0,q12 - veor q1,q1,q13 - vld1.8 {q12,q13},[r12]! - veor q2,q2,q14 - veor q3,q3,q15 - vld1.8 {q14,q15},[r12]! - - veor q4,q4,q12 - veor q5,q5,q13 - vld1.8 {q12,q13},[r12]! - veor q6,q6,q14 - vst1.8 {q0,q1},[r14]! - veor q7,q7,q15 - vld1.8 {q14,q15},[r12]! - - veor q8,q8,q12 - vst1.8 {q2,q3},[r14]! - veor q9,q9,q13 - vst1.8 {q4,q5},[r14]! - veor q10,q10,q14 - vst1.8 {q6,q7},[r14]! - veor q11,q11,q15 - vst1.8 {q8,q9},[r14]! - vst1.8 {q10,q11},[r14]! - - beq Ldone_neon - - ldmia sp,{r8,r9,r10,r11} @ load key material - add r0,r0,r8 @ accumulate key material - add r8,sp,#4*(4) - add r1,r1,r9 - add r2,r2,r10 - add r3,r3,r11 - ldmia r8,{r8,r9,r10,r11} @ load key material - - add r4,r4,r8 @ accumulate key material - add r8,sp,#4*(8) - add r5,r5,r9 - add r6,r6,r10 - add r7,r7,r11 - ldmia r8,{r8,r9,r10,r11} @ load key material -# ifdef __ARMEB__ - rev r0,r0 - rev r1,r1 - rev r2,r2 - rev r3,r3 - rev r4,r4 - rev r5,r5 - rev r6,r6 - rev r7,r7 -# endif - stmia sp,{r0,r1,r2,r3,r4,r5,r6,r7} - add r0,sp,#4*(16+8) - - ldmia r0,{r0,r1,r2,r3,r4,r5,r6,r7} @ load second half - - add r0,r0,r8 @ accumulate key material - add r8,sp,#4*(12) - add r1,r1,r9 - add r2,r2,r10 - add r3,r3,r11 - ldmia r8,{r8,r9,r10,r11} @ load key material - - add r4,r4,r8 @ accumulate key material - add r8,sp,#4*(8) - add r5,r5,r9 - add r4,r4,#3 @ counter+3 - add r6,r6,r10 - add r7,r7,r11 - ldr r11,[sp,#4*(32+2)] @ re-load len -# ifdef __ARMEB__ - rev r0,r0 - rev r1,r1 - rev r2,r2 - rev r3,r3 - rev r4,r4 - rev r5,r5 - rev r6,r6 - rev r7,r7 -# endif - stmia r8,{r0,r1,r2,r3,r4,r5,r6,r7} - add r10,sp,#4*(0) - sub r11,r11,#64*3 @ len-=64*3 - -Loop_tail_neon: - ldrb r8,[r10],#1 @ read buffer on stack - ldrb r9,[r12],#1 @ read input - subs r11,r11,#1 - eor r8,r8,r9 - strb r8,[r14],#1 @ store output - bne Loop_tail_neon - -Ldone_neon: - add sp,sp,#4*(32+4) - vldmia sp,{d8,d9,d10,d11,d12,d13,d14,d15} - add sp,sp,#4*(16+3) - ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,pc} - -#endif -#endif // !OPENSSL_NO_ASM diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/chacha-armv4-linux32.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/chacha-armv4-linux32.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/chacha-armv4-linux32.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/chacha-armv4-linux32.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,1491 +0,0 @@ -// This file is generated from a similarly-named Perl script in the BoringSSL -// source tree. Do not edit by hand. - -#if !defined(__has_feature) -#define __has_feature(x) 0 -#endif -#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) -#define OPENSSL_NO_ASM -#endif - -#if !defined(OPENSSL_NO_ASM) -#if defined(__arm__) -#include - -@ Silence ARMv8 deprecated IT instruction warnings. This file is used by both -@ ARMv7 and ARMv8 processors and does not use ARMv8 instructions. -.arch armv7-a - -.text -#if defined(__thumb2__) || defined(__clang__) -.syntax unified -#endif -#if defined(__thumb2__) -.thumb -#else -.code 32 -#endif - -#if defined(__thumb2__) || defined(__clang__) -#define ldrhsb ldrbhs -#endif - -.align 5 -.Lsigma: -.long 0x61707865,0x3320646e,0x79622d32,0x6b206574 @ endian-neutral -.Lone: -.long 1,0,0,0 -#if __ARM_MAX_ARCH__>=7 - -.hidden GFp_armcap_P -.LOPENSSL_armcap: -.word GFp_armcap_P-.LChaCha20_ctr32 -#else -.word -1 -#endif - -.globl GFp_ChaCha20_ctr32 -.hidden GFp_ChaCha20_ctr32 -.type GFp_ChaCha20_ctr32,%function -.align 5 -GFp_ChaCha20_ctr32: -.LChaCha20_ctr32: - ldr r12,[sp,#0] @ pull pointer to counter and nonce - stmdb sp!,{r0,r1,r2,r4-r11,lr} -#if __ARM_ARCH__<7 && !defined(__thumb2__) - sub r14,pc,#16 @ ChaCha20_ctr32 -#else - adr r14,.LChaCha20_ctr32 -#endif - cmp r2,#0 @ len==0? -#ifdef __thumb2__ - itt eq -#endif - addeq sp,sp,#4*3 - beq .Lno_data -#if __ARM_MAX_ARCH__>=7 - cmp r2,#192 @ test len - bls .Lshort - ldr r4,[r14,#-32] - ldr r4,[r14,r4] -# ifdef __APPLE__ - ldr r4,[r4] -# endif - tst r4,#ARMV7_NEON - bne .LChaCha20_neon -.Lshort: -#endif - ldmia r12,{r4,r5,r6,r7} @ load counter and nonce - sub sp,sp,#4*(16) @ off-load area - sub r14,r14,#64 @ .Lsigma - stmdb sp!,{r4,r5,r6,r7} @ copy counter and nonce - ldmia r3,{r4,r5,r6,r7,r8,r9,r10,r11} @ load key - ldmia r14,{r0,r1,r2,r3} @ load sigma - stmdb sp!,{r4,r5,r6,r7,r8,r9,r10,r11} @ copy key - stmdb sp!,{r0,r1,r2,r3} @ copy sigma - str r10,[sp,#4*(16+10)] @ off-load "rx" - str r11,[sp,#4*(16+11)] @ off-load "rx" - b .Loop_outer_enter - -.align 4 -.Loop_outer: - ldmia sp,{r0,r1,r2,r3,r4,r5,r6,r7,r8,r9} @ load key material - str r11,[sp,#4*(32+2)] @ save len - str r12, [sp,#4*(32+1)] @ save inp - str r14, [sp,#4*(32+0)] @ save out -.Loop_outer_enter: - ldr r11, [sp,#4*(15)] - ldr r12,[sp,#4*(12)] @ modulo-scheduled load - ldr r10, [sp,#4*(13)] - ldr r14,[sp,#4*(14)] - str r11, [sp,#4*(16+15)] - mov r11,#10 - b .Loop - -.align 4 -.Loop: - subs r11,r11,#1 - add r0,r0,r4 - mov r12,r12,ror#16 - add r1,r1,r5 - mov r10,r10,ror#16 - eor r12,r12,r0,ror#16 - eor r10,r10,r1,ror#16 - add r8,r8,r12 - mov r4,r4,ror#20 - add r9,r9,r10 - mov r5,r5,ror#20 - eor r4,r4,r8,ror#20 - eor r5,r5,r9,ror#20 - add r0,r0,r4 - mov r12,r12,ror#24 - add r1,r1,r5 - mov r10,r10,ror#24 - eor r12,r12,r0,ror#24 - eor r10,r10,r1,ror#24 - add r8,r8,r12 - mov r4,r4,ror#25 - add r9,r9,r10 - mov r5,r5,ror#25 - str r10,[sp,#4*(16+13)] - ldr r10,[sp,#4*(16+15)] - eor r4,r4,r8,ror#25 - eor r5,r5,r9,ror#25 - str r8,[sp,#4*(16+8)] - ldr r8,[sp,#4*(16+10)] - add r2,r2,r6 - mov r14,r14,ror#16 - str r9,[sp,#4*(16+9)] - ldr r9,[sp,#4*(16+11)] - add r3,r3,r7 - mov r10,r10,ror#16 - eor r14,r14,r2,ror#16 - eor r10,r10,r3,ror#16 - add r8,r8,r14 - mov r6,r6,ror#20 - add r9,r9,r10 - mov r7,r7,ror#20 - eor r6,r6,r8,ror#20 - eor r7,r7,r9,ror#20 - add r2,r2,r6 - mov r14,r14,ror#24 - add r3,r3,r7 - mov r10,r10,ror#24 - eor r14,r14,r2,ror#24 - eor r10,r10,r3,ror#24 - add r8,r8,r14 - mov r6,r6,ror#25 - add r9,r9,r10 - mov r7,r7,ror#25 - eor r6,r6,r8,ror#25 - eor r7,r7,r9,ror#25 - add r0,r0,r5 - mov r10,r10,ror#16 - add r1,r1,r6 - mov r12,r12,ror#16 - eor r10,r10,r0,ror#16 - eor r12,r12,r1,ror#16 - add r8,r8,r10 - mov r5,r5,ror#20 - add r9,r9,r12 - mov r6,r6,ror#20 - eor r5,r5,r8,ror#20 - eor r6,r6,r9,ror#20 - add r0,r0,r5 - mov r10,r10,ror#24 - add r1,r1,r6 - mov r12,r12,ror#24 - eor r10,r10,r0,ror#24 - eor r12,r12,r1,ror#24 - add r8,r8,r10 - mov r5,r5,ror#25 - str r10,[sp,#4*(16+15)] - ldr r10,[sp,#4*(16+13)] - add r9,r9,r12 - mov r6,r6,ror#25 - eor r5,r5,r8,ror#25 - eor r6,r6,r9,ror#25 - str r8,[sp,#4*(16+10)] - ldr r8,[sp,#4*(16+8)] - add r2,r2,r7 - mov r10,r10,ror#16 - str r9,[sp,#4*(16+11)] - ldr r9,[sp,#4*(16+9)] - add r3,r3,r4 - mov r14,r14,ror#16 - eor r10,r10,r2,ror#16 - eor r14,r14,r3,ror#16 - add r8,r8,r10 - mov r7,r7,ror#20 - add r9,r9,r14 - mov r4,r4,ror#20 - eor r7,r7,r8,ror#20 - eor r4,r4,r9,ror#20 - add r2,r2,r7 - mov r10,r10,ror#24 - add r3,r3,r4 - mov r14,r14,ror#24 - eor r10,r10,r2,ror#24 - eor r14,r14,r3,ror#24 - add r8,r8,r10 - mov r7,r7,ror#25 - add r9,r9,r14 - mov r4,r4,ror#25 - eor r7,r7,r8,ror#25 - eor r4,r4,r9,ror#25 - bne .Loop - - ldr r11,[sp,#4*(32+2)] @ load len - - str r8, [sp,#4*(16+8)] @ modulo-scheduled store - str r9, [sp,#4*(16+9)] - str r12,[sp,#4*(16+12)] - str r10, [sp,#4*(16+13)] - str r14,[sp,#4*(16+14)] - - @ at this point we have first half of 512-bit result in - @ rx and second half at sp+4*(16+8) - - cmp r11,#64 @ done yet? -#ifdef __thumb2__ - itete lo -#endif - addlo r12,sp,#4*(0) @ shortcut or ... - ldrhs r12,[sp,#4*(32+1)] @ ... load inp - addlo r14,sp,#4*(0) @ shortcut or ... - ldrhs r14,[sp,#4*(32+0)] @ ... load out - - ldr r8,[sp,#4*(0)] @ load key material - ldr r9,[sp,#4*(1)] - -#if __ARM_ARCH__>=6 || !defined(__ARMEB__) -# if __ARM_ARCH__<7 - orr r10,r12,r14 - tst r10,#3 @ are input and output aligned? - ldr r10,[sp,#4*(2)] - bne .Lunaligned - cmp r11,#64 @ restore flags -# else - ldr r10,[sp,#4*(2)] -# endif - ldr r11,[sp,#4*(3)] - - add r0,r0,r8 @ accumulate key material - add r1,r1,r9 -# ifdef __thumb2__ - itt hs -# endif - ldrhs r8,[r12],#16 @ load input - ldrhs r9,[r12,#-12] - - add r2,r2,r10 - add r3,r3,r11 -# ifdef __thumb2__ - itt hs -# endif - ldrhs r10,[r12,#-8] - ldrhs r11,[r12,#-4] -# if __ARM_ARCH__>=6 && defined(__ARMEB__) - rev r0,r0 - rev r1,r1 - rev r2,r2 - rev r3,r3 -# endif -# ifdef __thumb2__ - itt hs -# endif - eorhs r0,r0,r8 @ xor with input - eorhs r1,r1,r9 - add r8,sp,#4*(4) - str r0,[r14],#16 @ store output -# ifdef __thumb2__ - itt hs -# endif - eorhs r2,r2,r10 - eorhs r3,r3,r11 - ldmia r8,{r8,r9,r10,r11} @ load key material - str r1,[r14,#-12] - str r2,[r14,#-8] - str r3,[r14,#-4] - - add r4,r4,r8 @ accumulate key material - add r5,r5,r9 -# ifdef __thumb2__ - itt hs -# endif - ldrhs r8,[r12],#16 @ load input - ldrhs r9,[r12,#-12] - add r6,r6,r10 - add r7,r7,r11 -# ifdef __thumb2__ - itt hs -# endif - ldrhs r10,[r12,#-8] - ldrhs r11,[r12,#-4] -# if __ARM_ARCH__>=6 && defined(__ARMEB__) - rev r4,r4 - rev r5,r5 - rev r6,r6 - rev r7,r7 -# endif -# ifdef __thumb2__ - itt hs -# endif - eorhs r4,r4,r8 - eorhs r5,r5,r9 - add r8,sp,#4*(8) - str r4,[r14],#16 @ store output -# ifdef __thumb2__ - itt hs -# endif - eorhs r6,r6,r10 - eorhs r7,r7,r11 - str r5,[r14,#-12] - ldmia r8,{r8,r9,r10,r11} @ load key material - str r6,[r14,#-8] - add r0,sp,#4*(16+8) - str r7,[r14,#-4] - - ldmia r0,{r0,r1,r2,r3,r4,r5,r6,r7} @ load second half - - add r0,r0,r8 @ accumulate key material - add r1,r1,r9 -# ifdef __thumb2__ - itt hs -# endif - ldrhs r8,[r12],#16 @ load input - ldrhs r9,[r12,#-12] -# ifdef __thumb2__ - itt hi -# endif - strhi r10,[sp,#4*(16+10)] @ copy "rx" while at it - strhi r11,[sp,#4*(16+11)] @ copy "rx" while at it - add r2,r2,r10 - add r3,r3,r11 -# ifdef __thumb2__ - itt hs -# endif - ldrhs r10,[r12,#-8] - ldrhs r11,[r12,#-4] -# if __ARM_ARCH__>=6 && defined(__ARMEB__) - rev r0,r0 - rev r1,r1 - rev r2,r2 - rev r3,r3 -# endif -# ifdef __thumb2__ - itt hs -# endif - eorhs r0,r0,r8 - eorhs r1,r1,r9 - add r8,sp,#4*(12) - str r0,[r14],#16 @ store output -# ifdef __thumb2__ - itt hs -# endif - eorhs r2,r2,r10 - eorhs r3,r3,r11 - str r1,[r14,#-12] - ldmia r8,{r8,r9,r10,r11} @ load key material - str r2,[r14,#-8] - str r3,[r14,#-4] - - add r4,r4,r8 @ accumulate key material - add r5,r5,r9 -# ifdef __thumb2__ - itt hi -# endif - addhi r8,r8,#1 @ next counter value - strhi r8,[sp,#4*(12)] @ save next counter value -# ifdef __thumb2__ - itt hs -# endif - ldrhs r8,[r12],#16 @ load input - ldrhs r9,[r12,#-12] - add r6,r6,r10 - add r7,r7,r11 -# ifdef __thumb2__ - itt hs -# endif - ldrhs r10,[r12,#-8] - ldrhs r11,[r12,#-4] -# if __ARM_ARCH__>=6 && defined(__ARMEB__) - rev r4,r4 - rev r5,r5 - rev r6,r6 - rev r7,r7 -# endif -# ifdef __thumb2__ - itt hs -# endif - eorhs r4,r4,r8 - eorhs r5,r5,r9 -# ifdef __thumb2__ - it ne -# endif - ldrne r8,[sp,#4*(32+2)] @ re-load len -# ifdef __thumb2__ - itt hs -# endif - eorhs r6,r6,r10 - eorhs r7,r7,r11 - str r4,[r14],#16 @ store output - str r5,[r14,#-12] -# ifdef __thumb2__ - it hs -# endif - subhs r11,r8,#64 @ len-=64 - str r6,[r14,#-8] - str r7,[r14,#-4] - bhi .Loop_outer - - beq .Ldone -# if __ARM_ARCH__<7 - b .Ltail - -.align 4 -.Lunaligned:@ unaligned endian-neutral path - cmp r11,#64 @ restore flags -# endif -#endif -#if __ARM_ARCH__<7 - ldr r11,[sp,#4*(3)] - add r0,r0,r8 @ accumulate key material - add r1,r1,r9 - add r2,r2,r10 -# ifdef __thumb2__ - itete lo -# endif - eorlo r8,r8,r8 @ zero or ... - ldrhsb r8,[r12],#16 @ ... load input - eorlo r9,r9,r9 - ldrhsb r9,[r12,#-12] - - add r3,r3,r11 -# ifdef __thumb2__ - itete lo -# endif - eorlo r10,r10,r10 - ldrhsb r10,[r12,#-8] - eorlo r11,r11,r11 - ldrhsb r11,[r12,#-4] - - eor r0,r8,r0 @ xor with input (or zero) - eor r1,r9,r1 -# ifdef __thumb2__ - itt hs -# endif - ldrhsb r8,[r12,#-15] @ load more input - ldrhsb r9,[r12,#-11] - eor r2,r10,r2 - strb r0,[r14],#16 @ store output - eor r3,r11,r3 -# ifdef __thumb2__ - itt hs -# endif - ldrhsb r10,[r12,#-7] - ldrhsb r11,[r12,#-3] - strb r1,[r14,#-12] - eor r0,r8,r0,lsr#8 - strb r2,[r14,#-8] - eor r1,r9,r1,lsr#8 -# ifdef __thumb2__ - itt hs -# endif - ldrhsb r8,[r12,#-14] @ load more input - ldrhsb r9,[r12,#-10] - strb r3,[r14,#-4] - eor r2,r10,r2,lsr#8 - strb r0,[r14,#-15] - eor r3,r11,r3,lsr#8 -# ifdef __thumb2__ - itt hs -# endif - ldrhsb r10,[r12,#-6] - ldrhsb r11,[r12,#-2] - strb r1,[r14,#-11] - eor r0,r8,r0,lsr#8 - strb r2,[r14,#-7] - eor r1,r9,r1,lsr#8 -# ifdef __thumb2__ - itt hs -# endif - ldrhsb r8,[r12,#-13] @ load more input - ldrhsb r9,[r12,#-9] - strb r3,[r14,#-3] - eor r2,r10,r2,lsr#8 - strb r0,[r14,#-14] - eor r3,r11,r3,lsr#8 -# ifdef __thumb2__ - itt hs -# endif - ldrhsb r10,[r12,#-5] - ldrhsb r11,[r12,#-1] - strb r1,[r14,#-10] - strb r2,[r14,#-6] - eor r0,r8,r0,lsr#8 - strb r3,[r14,#-2] - eor r1,r9,r1,lsr#8 - strb r0,[r14,#-13] - eor r2,r10,r2,lsr#8 - strb r1,[r14,#-9] - eor r3,r11,r3,lsr#8 - strb r2,[r14,#-5] - strb r3,[r14,#-1] - add r8,sp,#4*(4+0) - ldmia r8,{r8,r9,r10,r11} @ load key material - add r0,sp,#4*(16+8) - add r4,r4,r8 @ accumulate key material - add r5,r5,r9 - add r6,r6,r10 -# ifdef __thumb2__ - itete lo -# endif - eorlo r8,r8,r8 @ zero or ... - ldrhsb r8,[r12],#16 @ ... load input - eorlo r9,r9,r9 - ldrhsb r9,[r12,#-12] - - add r7,r7,r11 -# ifdef __thumb2__ - itete lo -# endif - eorlo r10,r10,r10 - ldrhsb r10,[r12,#-8] - eorlo r11,r11,r11 - ldrhsb r11,[r12,#-4] - - eor r4,r8,r4 @ xor with input (or zero) - eor r5,r9,r5 -# ifdef __thumb2__ - itt hs -# endif - ldrhsb r8,[r12,#-15] @ load more input - ldrhsb r9,[r12,#-11] - eor r6,r10,r6 - strb r4,[r14],#16 @ store output - eor r7,r11,r7 -# ifdef __thumb2__ - itt hs -# endif - ldrhsb r10,[r12,#-7] - ldrhsb r11,[r12,#-3] - strb r5,[r14,#-12] - eor r4,r8,r4,lsr#8 - strb r6,[r14,#-8] - eor r5,r9,r5,lsr#8 -# ifdef __thumb2__ - itt hs -# endif - ldrhsb r8,[r12,#-14] @ load more input - ldrhsb r9,[r12,#-10] - strb r7,[r14,#-4] - eor r6,r10,r6,lsr#8 - strb r4,[r14,#-15] - eor r7,r11,r7,lsr#8 -# ifdef __thumb2__ - itt hs -# endif - ldrhsb r10,[r12,#-6] - ldrhsb r11,[r12,#-2] - strb r5,[r14,#-11] - eor r4,r8,r4,lsr#8 - strb r6,[r14,#-7] - eor r5,r9,r5,lsr#8 -# ifdef __thumb2__ - itt hs -# endif - ldrhsb r8,[r12,#-13] @ load more input - ldrhsb r9,[r12,#-9] - strb r7,[r14,#-3] - eor r6,r10,r6,lsr#8 - strb r4,[r14,#-14] - eor r7,r11,r7,lsr#8 -# ifdef __thumb2__ - itt hs -# endif - ldrhsb r10,[r12,#-5] - ldrhsb r11,[r12,#-1] - strb r5,[r14,#-10] - strb r6,[r14,#-6] - eor r4,r8,r4,lsr#8 - strb r7,[r14,#-2] - eor r5,r9,r5,lsr#8 - strb r4,[r14,#-13] - eor r6,r10,r6,lsr#8 - strb r5,[r14,#-9] - eor r7,r11,r7,lsr#8 - strb r6,[r14,#-5] - strb r7,[r14,#-1] - add r8,sp,#4*(4+4) - ldmia r8,{r8,r9,r10,r11} @ load key material - ldmia r0,{r0,r1,r2,r3,r4,r5,r6,r7} @ load second half -# ifdef __thumb2__ - itt hi -# endif - strhi r10,[sp,#4*(16+10)] @ copy "rx" - strhi r11,[sp,#4*(16+11)] @ copy "rx" - add r0,r0,r8 @ accumulate key material - add r1,r1,r9 - add r2,r2,r10 -# ifdef __thumb2__ - itete lo -# endif - eorlo r8,r8,r8 @ zero or ... - ldrhsb r8,[r12],#16 @ ... load input - eorlo r9,r9,r9 - ldrhsb r9,[r12,#-12] - - add r3,r3,r11 -# ifdef __thumb2__ - itete lo -# endif - eorlo r10,r10,r10 - ldrhsb r10,[r12,#-8] - eorlo r11,r11,r11 - ldrhsb r11,[r12,#-4] - - eor r0,r8,r0 @ xor with input (or zero) - eor r1,r9,r1 -# ifdef __thumb2__ - itt hs -# endif - ldrhsb r8,[r12,#-15] @ load more input - ldrhsb r9,[r12,#-11] - eor r2,r10,r2 - strb r0,[r14],#16 @ store output - eor r3,r11,r3 -# ifdef __thumb2__ - itt hs -# endif - ldrhsb r10,[r12,#-7] - ldrhsb r11,[r12,#-3] - strb r1,[r14,#-12] - eor r0,r8,r0,lsr#8 - strb r2,[r14,#-8] - eor r1,r9,r1,lsr#8 -# ifdef __thumb2__ - itt hs -# endif - ldrhsb r8,[r12,#-14] @ load more input - ldrhsb r9,[r12,#-10] - strb r3,[r14,#-4] - eor r2,r10,r2,lsr#8 - strb r0,[r14,#-15] - eor r3,r11,r3,lsr#8 -# ifdef __thumb2__ - itt hs -# endif - ldrhsb r10,[r12,#-6] - ldrhsb r11,[r12,#-2] - strb r1,[r14,#-11] - eor r0,r8,r0,lsr#8 - strb r2,[r14,#-7] - eor r1,r9,r1,lsr#8 -# ifdef __thumb2__ - itt hs -# endif - ldrhsb r8,[r12,#-13] @ load more input - ldrhsb r9,[r12,#-9] - strb r3,[r14,#-3] - eor r2,r10,r2,lsr#8 - strb r0,[r14,#-14] - eor r3,r11,r3,lsr#8 -# ifdef __thumb2__ - itt hs -# endif - ldrhsb r10,[r12,#-5] - ldrhsb r11,[r12,#-1] - strb r1,[r14,#-10] - strb r2,[r14,#-6] - eor r0,r8,r0,lsr#8 - strb r3,[r14,#-2] - eor r1,r9,r1,lsr#8 - strb r0,[r14,#-13] - eor r2,r10,r2,lsr#8 - strb r1,[r14,#-9] - eor r3,r11,r3,lsr#8 - strb r2,[r14,#-5] - strb r3,[r14,#-1] - add r8,sp,#4*(4+8) - ldmia r8,{r8,r9,r10,r11} @ load key material - add r4,r4,r8 @ accumulate key material -# ifdef __thumb2__ - itt hi -# endif - addhi r8,r8,#1 @ next counter value - strhi r8,[sp,#4*(12)] @ save next counter value - add r5,r5,r9 - add r6,r6,r10 -# ifdef __thumb2__ - itete lo -# endif - eorlo r8,r8,r8 @ zero or ... - ldrhsb r8,[r12],#16 @ ... load input - eorlo r9,r9,r9 - ldrhsb r9,[r12,#-12] - - add r7,r7,r11 -# ifdef __thumb2__ - itete lo -# endif - eorlo r10,r10,r10 - ldrhsb r10,[r12,#-8] - eorlo r11,r11,r11 - ldrhsb r11,[r12,#-4] - - eor r4,r8,r4 @ xor with input (or zero) - eor r5,r9,r5 -# ifdef __thumb2__ - itt hs -# endif - ldrhsb r8,[r12,#-15] @ load more input - ldrhsb r9,[r12,#-11] - eor r6,r10,r6 - strb r4,[r14],#16 @ store output - eor r7,r11,r7 -# ifdef __thumb2__ - itt hs -# endif - ldrhsb r10,[r12,#-7] - ldrhsb r11,[r12,#-3] - strb r5,[r14,#-12] - eor r4,r8,r4,lsr#8 - strb r6,[r14,#-8] - eor r5,r9,r5,lsr#8 -# ifdef __thumb2__ - itt hs -# endif - ldrhsb r8,[r12,#-14] @ load more input - ldrhsb r9,[r12,#-10] - strb r7,[r14,#-4] - eor r6,r10,r6,lsr#8 - strb r4,[r14,#-15] - eor r7,r11,r7,lsr#8 -# ifdef __thumb2__ - itt hs -# endif - ldrhsb r10,[r12,#-6] - ldrhsb r11,[r12,#-2] - strb r5,[r14,#-11] - eor r4,r8,r4,lsr#8 - strb r6,[r14,#-7] - eor r5,r9,r5,lsr#8 -# ifdef __thumb2__ - itt hs -# endif - ldrhsb r8,[r12,#-13] @ load more input - ldrhsb r9,[r12,#-9] - strb r7,[r14,#-3] - eor r6,r10,r6,lsr#8 - strb r4,[r14,#-14] - eor r7,r11,r7,lsr#8 -# ifdef __thumb2__ - itt hs -# endif - ldrhsb r10,[r12,#-5] - ldrhsb r11,[r12,#-1] - strb r5,[r14,#-10] - strb r6,[r14,#-6] - eor r4,r8,r4,lsr#8 - strb r7,[r14,#-2] - eor r5,r9,r5,lsr#8 - strb r4,[r14,#-13] - eor r6,r10,r6,lsr#8 - strb r5,[r14,#-9] - eor r7,r11,r7,lsr#8 - strb r6,[r14,#-5] - strb r7,[r14,#-1] -# ifdef __thumb2__ - it ne -# endif - ldrne r8,[sp,#4*(32+2)] @ re-load len -# ifdef __thumb2__ - it hs -# endif - subhs r11,r8,#64 @ len-=64 - bhi .Loop_outer - - beq .Ldone -#endif - -.Ltail: - ldr r12,[sp,#4*(32+1)] @ load inp - add r9,sp,#4*(0) - ldr r14,[sp,#4*(32+0)] @ load out - -.Loop_tail: - ldrb r10,[r9],#1 @ read buffer on stack - ldrb r11,[r12],#1 @ read input - subs r8,r8,#1 - eor r11,r11,r10 - strb r11,[r14],#1 @ store output - bne .Loop_tail - -.Ldone: - add sp,sp,#4*(32+3) -.Lno_data: - ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,pc} -.size GFp_ChaCha20_ctr32,.-GFp_ChaCha20_ctr32 -#if __ARM_MAX_ARCH__>=7 -.arch armv7-a -.fpu neon - -.type ChaCha20_neon,%function -.align 5 -ChaCha20_neon: - ldr r12,[sp,#0] @ pull pointer to counter and nonce - stmdb sp!,{r0,r1,r2,r4-r11,lr} -.LChaCha20_neon: - adr r14,.Lsigma - vstmdb sp!,{d8,d9,d10,d11,d12,d13,d14,d15} @ ABI spec says so - stmdb sp!,{r0,r1,r2,r3} - - vld1.32 {q1,q2},[r3] @ load key - ldmia r3,{r4,r5,r6,r7,r8,r9,r10,r11} @ load key - - sub sp,sp,#4*(16+16) - vld1.32 {q3},[r12] @ load counter and nonce - add r12,sp,#4*8 - ldmia r14,{r0,r1,r2,r3} @ load sigma - vld1.32 {q0},[r14]! @ load sigma - vld1.32 {q12},[r14] @ one - vst1.32 {q2,q3},[r12] @ copy 1/2key|counter|nonce - vst1.32 {q0,q1},[sp] @ copy sigma|1/2key - - str r10,[sp,#4*(16+10)] @ off-load "rx" - str r11,[sp,#4*(16+11)] @ off-load "rx" - vshl.i32 d26,d24,#1 @ two - vstr d24,[sp,#4*(16+0)] - vshl.i32 d28,d24,#2 @ four - vstr d26,[sp,#4*(16+2)] - vmov q4,q0 - vstr d28,[sp,#4*(16+4)] - vmov q8,q0 - vmov q5,q1 - vmov q9,q1 - b .Loop_neon_enter - -.align 4 -.Loop_neon_outer: - ldmia sp,{r0,r1,r2,r3,r4,r5,r6,r7,r8,r9} @ load key material - cmp r11,#64*2 @ if len<=64*2 - bls .Lbreak_neon @ switch to integer-only - vmov q4,q0 - str r11,[sp,#4*(32+2)] @ save len - vmov q8,q0 - str r12, [sp,#4*(32+1)] @ save inp - vmov q5,q1 - str r14, [sp,#4*(32+0)] @ save out - vmov q9,q1 -.Loop_neon_enter: - ldr r11, [sp,#4*(15)] - vadd.i32 q7,q3,q12 @ counter+1 - ldr r12,[sp,#4*(12)] @ modulo-scheduled load - vmov q6,q2 - ldr r10, [sp,#4*(13)] - vmov q10,q2 - ldr r14,[sp,#4*(14)] - vadd.i32 q11,q7,q12 @ counter+2 - str r11, [sp,#4*(16+15)] - mov r11,#10 - add r12,r12,#3 @ counter+3 - b .Loop_neon - -.align 4 -.Loop_neon: - subs r11,r11,#1 - vadd.i32 q0,q0,q1 - add r0,r0,r4 - vadd.i32 q4,q4,q5 - mov r12,r12,ror#16 - vadd.i32 q8,q8,q9 - add r1,r1,r5 - veor q3,q3,q0 - mov r10,r10,ror#16 - veor q7,q7,q4 - eor r12,r12,r0,ror#16 - veor q11,q11,q8 - eor r10,r10,r1,ror#16 - vrev32.16 q3,q3 - add r8,r8,r12 - vrev32.16 q7,q7 - mov r4,r4,ror#20 - vrev32.16 q11,q11 - add r9,r9,r10 - vadd.i32 q2,q2,q3 - mov r5,r5,ror#20 - vadd.i32 q6,q6,q7 - eor r4,r4,r8,ror#20 - vadd.i32 q10,q10,q11 - eor r5,r5,r9,ror#20 - veor q12,q1,q2 - add r0,r0,r4 - veor q13,q5,q6 - mov r12,r12,ror#24 - veor q14,q9,q10 - add r1,r1,r5 - vshr.u32 q1,q12,#20 - mov r10,r10,ror#24 - vshr.u32 q5,q13,#20 - eor r12,r12,r0,ror#24 - vshr.u32 q9,q14,#20 - eor r10,r10,r1,ror#24 - vsli.32 q1,q12,#12 - add r8,r8,r12 - vsli.32 q5,q13,#12 - mov r4,r4,ror#25 - vsli.32 q9,q14,#12 - add r9,r9,r10 - vadd.i32 q0,q0,q1 - mov r5,r5,ror#25 - vadd.i32 q4,q4,q5 - str r10,[sp,#4*(16+13)] - vadd.i32 q8,q8,q9 - ldr r10,[sp,#4*(16+15)] - veor q12,q3,q0 - eor r4,r4,r8,ror#25 - veor q13,q7,q4 - eor r5,r5,r9,ror#25 - veor q14,q11,q8 - str r8,[sp,#4*(16+8)] - vshr.u32 q3,q12,#24 - ldr r8,[sp,#4*(16+10)] - vshr.u32 q7,q13,#24 - add r2,r2,r6 - vshr.u32 q11,q14,#24 - mov r14,r14,ror#16 - vsli.32 q3,q12,#8 - str r9,[sp,#4*(16+9)] - vsli.32 q7,q13,#8 - ldr r9,[sp,#4*(16+11)] - vsli.32 q11,q14,#8 - add r3,r3,r7 - vadd.i32 q2,q2,q3 - mov r10,r10,ror#16 - vadd.i32 q6,q6,q7 - eor r14,r14,r2,ror#16 - vadd.i32 q10,q10,q11 - eor r10,r10,r3,ror#16 - veor q12,q1,q2 - add r8,r8,r14 - veor q13,q5,q6 - mov r6,r6,ror#20 - veor q14,q9,q10 - add r9,r9,r10 - vshr.u32 q1,q12,#25 - mov r7,r7,ror#20 - vshr.u32 q5,q13,#25 - eor r6,r6,r8,ror#20 - vshr.u32 q9,q14,#25 - eor r7,r7,r9,ror#20 - vsli.32 q1,q12,#7 - add r2,r2,r6 - vsli.32 q5,q13,#7 - mov r14,r14,ror#24 - vsli.32 q9,q14,#7 - add r3,r3,r7 - vext.8 q2,q2,q2,#8 - mov r10,r10,ror#24 - vext.8 q6,q6,q6,#8 - eor r14,r14,r2,ror#24 - vext.8 q10,q10,q10,#8 - eor r10,r10,r3,ror#24 - vext.8 q1,q1,q1,#4 - add r8,r8,r14 - vext.8 q5,q5,q5,#4 - mov r6,r6,ror#25 - vext.8 q9,q9,q9,#4 - add r9,r9,r10 - vext.8 q3,q3,q3,#12 - mov r7,r7,ror#25 - vext.8 q7,q7,q7,#12 - eor r6,r6,r8,ror#25 - vext.8 q11,q11,q11,#12 - eor r7,r7,r9,ror#25 - vadd.i32 q0,q0,q1 - add r0,r0,r5 - vadd.i32 q4,q4,q5 - mov r10,r10,ror#16 - vadd.i32 q8,q8,q9 - add r1,r1,r6 - veor q3,q3,q0 - mov r12,r12,ror#16 - veor q7,q7,q4 - eor r10,r10,r0,ror#16 - veor q11,q11,q8 - eor r12,r12,r1,ror#16 - vrev32.16 q3,q3 - add r8,r8,r10 - vrev32.16 q7,q7 - mov r5,r5,ror#20 - vrev32.16 q11,q11 - add r9,r9,r12 - vadd.i32 q2,q2,q3 - mov r6,r6,ror#20 - vadd.i32 q6,q6,q7 - eor r5,r5,r8,ror#20 - vadd.i32 q10,q10,q11 - eor r6,r6,r9,ror#20 - veor q12,q1,q2 - add r0,r0,r5 - veor q13,q5,q6 - mov r10,r10,ror#24 - veor q14,q9,q10 - add r1,r1,r6 - vshr.u32 q1,q12,#20 - mov r12,r12,ror#24 - vshr.u32 q5,q13,#20 - eor r10,r10,r0,ror#24 - vshr.u32 q9,q14,#20 - eor r12,r12,r1,ror#24 - vsli.32 q1,q12,#12 - add r8,r8,r10 - vsli.32 q5,q13,#12 - mov r5,r5,ror#25 - vsli.32 q9,q14,#12 - str r10,[sp,#4*(16+15)] - vadd.i32 q0,q0,q1 - ldr r10,[sp,#4*(16+13)] - vadd.i32 q4,q4,q5 - add r9,r9,r12 - vadd.i32 q8,q8,q9 - mov r6,r6,ror#25 - veor q12,q3,q0 - eor r5,r5,r8,ror#25 - veor q13,q7,q4 - eor r6,r6,r9,ror#25 - veor q14,q11,q8 - str r8,[sp,#4*(16+10)] - vshr.u32 q3,q12,#24 - ldr r8,[sp,#4*(16+8)] - vshr.u32 q7,q13,#24 - add r2,r2,r7 - vshr.u32 q11,q14,#24 - mov r10,r10,ror#16 - vsli.32 q3,q12,#8 - str r9,[sp,#4*(16+11)] - vsli.32 q7,q13,#8 - ldr r9,[sp,#4*(16+9)] - vsli.32 q11,q14,#8 - add r3,r3,r4 - vadd.i32 q2,q2,q3 - mov r14,r14,ror#16 - vadd.i32 q6,q6,q7 - eor r10,r10,r2,ror#16 - vadd.i32 q10,q10,q11 - eor r14,r14,r3,ror#16 - veor q12,q1,q2 - add r8,r8,r10 - veor q13,q5,q6 - mov r7,r7,ror#20 - veor q14,q9,q10 - add r9,r9,r14 - vshr.u32 q1,q12,#25 - mov r4,r4,ror#20 - vshr.u32 q5,q13,#25 - eor r7,r7,r8,ror#20 - vshr.u32 q9,q14,#25 - eor r4,r4,r9,ror#20 - vsli.32 q1,q12,#7 - add r2,r2,r7 - vsli.32 q5,q13,#7 - mov r10,r10,ror#24 - vsli.32 q9,q14,#7 - add r3,r3,r4 - vext.8 q2,q2,q2,#8 - mov r14,r14,ror#24 - vext.8 q6,q6,q6,#8 - eor r10,r10,r2,ror#24 - vext.8 q10,q10,q10,#8 - eor r14,r14,r3,ror#24 - vext.8 q1,q1,q1,#12 - add r8,r8,r10 - vext.8 q5,q5,q5,#12 - mov r7,r7,ror#25 - vext.8 q9,q9,q9,#12 - add r9,r9,r14 - vext.8 q3,q3,q3,#4 - mov r4,r4,ror#25 - vext.8 q7,q7,q7,#4 - eor r7,r7,r8,ror#25 - vext.8 q11,q11,q11,#4 - eor r4,r4,r9,ror#25 - bne .Loop_neon - - add r11,sp,#32 - vld1.32 {q12,q13},[sp] @ load key material - vld1.32 {q14,q15},[r11] - - ldr r11,[sp,#4*(32+2)] @ load len - - str r8, [sp,#4*(16+8)] @ modulo-scheduled store - str r9, [sp,#4*(16+9)] - str r12,[sp,#4*(16+12)] - str r10, [sp,#4*(16+13)] - str r14,[sp,#4*(16+14)] - - @ at this point we have first half of 512-bit result in - @ rx and second half at sp+4*(16+8) - - ldr r12,[sp,#4*(32+1)] @ load inp - ldr r14,[sp,#4*(32+0)] @ load out - - vadd.i32 q0,q0,q12 @ accumulate key material - vadd.i32 q4,q4,q12 - vadd.i32 q8,q8,q12 - vldr d24,[sp,#4*(16+0)] @ one - - vadd.i32 q1,q1,q13 - vadd.i32 q5,q5,q13 - vadd.i32 q9,q9,q13 - vldr d26,[sp,#4*(16+2)] @ two - - vadd.i32 q2,q2,q14 - vadd.i32 q6,q6,q14 - vadd.i32 q10,q10,q14 - vadd.i32 d14,d14,d24 @ counter+1 - vadd.i32 d22,d22,d26 @ counter+2 - - vadd.i32 q3,q3,q15 - vadd.i32 q7,q7,q15 - vadd.i32 q11,q11,q15 - - cmp r11,#64*4 - blo .Ltail_neon - - vld1.8 {q12,q13},[r12]! @ load input - mov r11,sp - vld1.8 {q14,q15},[r12]! - veor q0,q0,q12 @ xor with input - veor q1,q1,q13 - vld1.8 {q12,q13},[r12]! - veor q2,q2,q14 - veor q3,q3,q15 - vld1.8 {q14,q15},[r12]! - - veor q4,q4,q12 - vst1.8 {q0,q1},[r14]! @ store output - veor q5,q5,q13 - vld1.8 {q12,q13},[r12]! - veor q6,q6,q14 - vst1.8 {q2,q3},[r14]! - veor q7,q7,q15 - vld1.8 {q14,q15},[r12]! - - veor q8,q8,q12 - vld1.32 {q0,q1},[r11]! @ load for next iteration - veor d25,d25,d25 - vldr d24,[sp,#4*(16+4)] @ four - veor q9,q9,q13 - vld1.32 {q2,q3},[r11] - veor q10,q10,q14 - vst1.8 {q4,q5},[r14]! - veor q11,q11,q15 - vst1.8 {q6,q7},[r14]! - - vadd.i32 d6,d6,d24 @ next counter value - vldr d24,[sp,#4*(16+0)] @ one - - ldmia sp,{r8,r9,r10,r11} @ load key material - add r0,r0,r8 @ accumulate key material - ldr r8,[r12],#16 @ load input - vst1.8 {q8,q9},[r14]! - add r1,r1,r9 - ldr r9,[r12,#-12] - vst1.8 {q10,q11},[r14]! - add r2,r2,r10 - ldr r10,[r12,#-8] - add r3,r3,r11 - ldr r11,[r12,#-4] -# ifdef __ARMEB__ - rev r0,r0 - rev r1,r1 - rev r2,r2 - rev r3,r3 -# endif - eor r0,r0,r8 @ xor with input - add r8,sp,#4*(4) - eor r1,r1,r9 - str r0,[r14],#16 @ store output - eor r2,r2,r10 - str r1,[r14,#-12] - eor r3,r3,r11 - ldmia r8,{r8,r9,r10,r11} @ load key material - str r2,[r14,#-8] - str r3,[r14,#-4] - - add r4,r4,r8 @ accumulate key material - ldr r8,[r12],#16 @ load input - add r5,r5,r9 - ldr r9,[r12,#-12] - add r6,r6,r10 - ldr r10,[r12,#-8] - add r7,r7,r11 - ldr r11,[r12,#-4] -# ifdef __ARMEB__ - rev r4,r4 - rev r5,r5 - rev r6,r6 - rev r7,r7 -# endif - eor r4,r4,r8 - add r8,sp,#4*(8) - eor r5,r5,r9 - str r4,[r14],#16 @ store output - eor r6,r6,r10 - str r5,[r14,#-12] - eor r7,r7,r11 - ldmia r8,{r8,r9,r10,r11} @ load key material - str r6,[r14,#-8] - add r0,sp,#4*(16+8) - str r7,[r14,#-4] - - ldmia r0,{r0,r1,r2,r3,r4,r5,r6,r7} @ load second half - - add r0,r0,r8 @ accumulate key material - ldr r8,[r12],#16 @ load input - add r1,r1,r9 - ldr r9,[r12,#-12] -# ifdef __thumb2__ - it hi -# endif - strhi r10,[sp,#4*(16+10)] @ copy "rx" while at it - add r2,r2,r10 - ldr r10,[r12,#-8] -# ifdef __thumb2__ - it hi -# endif - strhi r11,[sp,#4*(16+11)] @ copy "rx" while at it - add r3,r3,r11 - ldr r11,[r12,#-4] -# ifdef __ARMEB__ - rev r0,r0 - rev r1,r1 - rev r2,r2 - rev r3,r3 -# endif - eor r0,r0,r8 - add r8,sp,#4*(12) - eor r1,r1,r9 - str r0,[r14],#16 @ store output - eor r2,r2,r10 - str r1,[r14,#-12] - eor r3,r3,r11 - ldmia r8,{r8,r9,r10,r11} @ load key material - str r2,[r14,#-8] - str r3,[r14,#-4] - - add r4,r4,r8 @ accumulate key material - add r8,r8,#4 @ next counter value - add r5,r5,r9 - str r8,[sp,#4*(12)] @ save next counter value - ldr r8,[r12],#16 @ load input - add r6,r6,r10 - add r4,r4,#3 @ counter+3 - ldr r9,[r12,#-12] - add r7,r7,r11 - ldr r10,[r12,#-8] - ldr r11,[r12,#-4] -# ifdef __ARMEB__ - rev r4,r4 - rev r5,r5 - rev r6,r6 - rev r7,r7 -# endif - eor r4,r4,r8 -# ifdef __thumb2__ - it hi -# endif - ldrhi r8,[sp,#4*(32+2)] @ re-load len - eor r5,r5,r9 - eor r6,r6,r10 - str r4,[r14],#16 @ store output - eor r7,r7,r11 - str r5,[r14,#-12] - sub r11,r8,#64*4 @ len-=64*4 - str r6,[r14,#-8] - str r7,[r14,#-4] - bhi .Loop_neon_outer - - b .Ldone_neon - -.align 4 -.Lbreak_neon: - @ harmonize NEON and integer-only stack frames: load data - @ from NEON frame, but save to integer-only one; distance - @ between the two is 4*(32+4+16-32)=4*(20). - - str r11, [sp,#4*(20+32+2)] @ save len - add r11,sp,#4*(32+4) - str r12, [sp,#4*(20+32+1)] @ save inp - str r14, [sp,#4*(20+32+0)] @ save out - - ldr r12,[sp,#4*(16+10)] - ldr r14,[sp,#4*(16+11)] - vldmia r11,{d8,d9,d10,d11,d12,d13,d14,d15} @ fulfill ABI requirement - str r12,[sp,#4*(20+16+10)] @ copy "rx" - str r14,[sp,#4*(20+16+11)] @ copy "rx" - - ldr r11, [sp,#4*(15)] - ldr r12,[sp,#4*(12)] @ modulo-scheduled load - ldr r10, [sp,#4*(13)] - ldr r14,[sp,#4*(14)] - str r11, [sp,#4*(20+16+15)] - add r11,sp,#4*(20) - vst1.32 {q0,q1},[r11]! @ copy key - add sp,sp,#4*(20) @ switch frame - vst1.32 {q2,q3},[r11] - mov r11,#10 - b .Loop @ go integer-only - -.align 4 -.Ltail_neon: - cmp r11,#64*3 - bhs .L192_or_more_neon - cmp r11,#64*2 - bhs .L128_or_more_neon - cmp r11,#64*1 - bhs .L64_or_more_neon - - add r8,sp,#4*(8) - vst1.8 {q0,q1},[sp] - add r10,sp,#4*(0) - vst1.8 {q2,q3},[r8] - b .Loop_tail_neon - -.align 4 -.L64_or_more_neon: - vld1.8 {q12,q13},[r12]! - vld1.8 {q14,q15},[r12]! - veor q0,q0,q12 - veor q1,q1,q13 - veor q2,q2,q14 - veor q3,q3,q15 - vst1.8 {q0,q1},[r14]! - vst1.8 {q2,q3},[r14]! - - beq .Ldone_neon - - add r8,sp,#4*(8) - vst1.8 {q4,q5},[sp] - add r10,sp,#4*(0) - vst1.8 {q6,q7},[r8] - sub r11,r11,#64*1 @ len-=64*1 - b .Loop_tail_neon - -.align 4 -.L128_or_more_neon: - vld1.8 {q12,q13},[r12]! - vld1.8 {q14,q15},[r12]! - veor q0,q0,q12 - veor q1,q1,q13 - vld1.8 {q12,q13},[r12]! - veor q2,q2,q14 - veor q3,q3,q15 - vld1.8 {q14,q15},[r12]! - - veor q4,q4,q12 - veor q5,q5,q13 - vst1.8 {q0,q1},[r14]! - veor q6,q6,q14 - vst1.8 {q2,q3},[r14]! - veor q7,q7,q15 - vst1.8 {q4,q5},[r14]! - vst1.8 {q6,q7},[r14]! - - beq .Ldone_neon - - add r8,sp,#4*(8) - vst1.8 {q8,q9},[sp] - add r10,sp,#4*(0) - vst1.8 {q10,q11},[r8] - sub r11,r11,#64*2 @ len-=64*2 - b .Loop_tail_neon - -.align 4 -.L192_or_more_neon: - vld1.8 {q12,q13},[r12]! - vld1.8 {q14,q15},[r12]! - veor q0,q0,q12 - veor q1,q1,q13 - vld1.8 {q12,q13},[r12]! - veor q2,q2,q14 - veor q3,q3,q15 - vld1.8 {q14,q15},[r12]! - - veor q4,q4,q12 - veor q5,q5,q13 - vld1.8 {q12,q13},[r12]! - veor q6,q6,q14 - vst1.8 {q0,q1},[r14]! - veor q7,q7,q15 - vld1.8 {q14,q15},[r12]! - - veor q8,q8,q12 - vst1.8 {q2,q3},[r14]! - veor q9,q9,q13 - vst1.8 {q4,q5},[r14]! - veor q10,q10,q14 - vst1.8 {q6,q7},[r14]! - veor q11,q11,q15 - vst1.8 {q8,q9},[r14]! - vst1.8 {q10,q11},[r14]! - - beq .Ldone_neon - - ldmia sp,{r8,r9,r10,r11} @ load key material - add r0,r0,r8 @ accumulate key material - add r8,sp,#4*(4) - add r1,r1,r9 - add r2,r2,r10 - add r3,r3,r11 - ldmia r8,{r8,r9,r10,r11} @ load key material - - add r4,r4,r8 @ accumulate key material - add r8,sp,#4*(8) - add r5,r5,r9 - add r6,r6,r10 - add r7,r7,r11 - ldmia r8,{r8,r9,r10,r11} @ load key material -# ifdef __ARMEB__ - rev r0,r0 - rev r1,r1 - rev r2,r2 - rev r3,r3 - rev r4,r4 - rev r5,r5 - rev r6,r6 - rev r7,r7 -# endif - stmia sp,{r0,r1,r2,r3,r4,r5,r6,r7} - add r0,sp,#4*(16+8) - - ldmia r0,{r0,r1,r2,r3,r4,r5,r6,r7} @ load second half - - add r0,r0,r8 @ accumulate key material - add r8,sp,#4*(12) - add r1,r1,r9 - add r2,r2,r10 - add r3,r3,r11 - ldmia r8,{r8,r9,r10,r11} @ load key material - - add r4,r4,r8 @ accumulate key material - add r8,sp,#4*(8) - add r5,r5,r9 - add r4,r4,#3 @ counter+3 - add r6,r6,r10 - add r7,r7,r11 - ldr r11,[sp,#4*(32+2)] @ re-load len -# ifdef __ARMEB__ - rev r0,r0 - rev r1,r1 - rev r2,r2 - rev r3,r3 - rev r4,r4 - rev r5,r5 - rev r6,r6 - rev r7,r7 -# endif - stmia r8,{r0,r1,r2,r3,r4,r5,r6,r7} - add r10,sp,#4*(0) - sub r11,r11,#64*3 @ len-=64*3 - -.Loop_tail_neon: - ldrb r8,[r10],#1 @ read buffer on stack - ldrb r9,[r12],#1 @ read input - subs r11,r11,#1 - eor r8,r8,r9 - strb r8,[r14],#1 @ store output - bne .Loop_tail_neon - -.Ldone_neon: - add sp,sp,#4*(32+4) - vldmia sp,{d8,d9,d10,d11,d12,d13,d14,d15} - add sp,sp,#4*(16+3) - ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,pc} -.size ChaCha20_neon,.-ChaCha20_neon -#endif -#endif -#endif // !OPENSSL_NO_ASM -.section .note.GNU-stack,"",%progbits diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/chacha-armv8-ios64.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/chacha-armv8-ios64.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/chacha-armv8-ios64.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/chacha-armv8-ios64.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,1989 +0,0 @@ -// This file is generated from a similarly-named Perl script in the BoringSSL -// source tree. Do not edit by hand. - -#if !defined(__has_feature) -#define __has_feature(x) 0 -#endif -#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) -#define OPENSSL_NO_ASM -#endif - -#if !defined(OPENSSL_NO_ASM) -#include - - -.private_extern _GFp_armcap_P - -.section __TEXT,__const - -.align 5 -Lsigma: -.quad 0x3320646e61707865,0x6b20657479622d32 // endian-neutral -Lone: -.long 1,0,0,0 -.byte 67,104,97,67,104,97,50,48,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 -.align 2 - -.text - -.globl _GFp_ChaCha20_ctr32 -.private_extern _GFp_ChaCha20_ctr32 - -.align 5 -_GFp_ChaCha20_ctr32: - AARCH64_VALID_CALL_TARGET - cbz x2,Labort -#if __has_feature(hwaddress_sanitizer) && __clang_major__ >= 10 - adrp x5,:pg_hi21_nc:_GFp_armcap_P -#else - adrp x5,_GFp_armcap_P@PAGE -#endif - cmp x2,#192 - b.lo Lshort - ldr w17,[x5,_GFp_armcap_P@PAGEOFF] - tst w17,#ARMV7_NEON - b.ne ChaCha20_neon - -Lshort: - AARCH64_SIGN_LINK_REGISTER - stp x29,x30,[sp,#-96]! - add x29,sp,#0 - - adrp x5,Lsigma@PAGE - add x5,x5,Lsigma@PAGEOFF - stp x19,x20,[sp,#16] - stp x21,x22,[sp,#32] - stp x23,x24,[sp,#48] - stp x25,x26,[sp,#64] - stp x27,x28,[sp,#80] - sub sp,sp,#64 - - ldp x22,x23,[x5] // load sigma - ldp x24,x25,[x3] // load key - ldp x26,x27,[x3,#16] - ldp x28,x30,[x4] // load counter -#ifdef __ARMEB__ - ror x24,x24,#32 - ror x25,x25,#32 - ror x26,x26,#32 - ror x27,x27,#32 - ror x28,x28,#32 - ror x30,x30,#32 -#endif - -Loop_outer: - mov w5,w22 // unpack key block - lsr x6,x22,#32 - mov w7,w23 - lsr x8,x23,#32 - mov w9,w24 - lsr x10,x24,#32 - mov w11,w25 - lsr x12,x25,#32 - mov w13,w26 - lsr x14,x26,#32 - mov w15,w27 - lsr x16,x27,#32 - mov w17,w28 - lsr x19,x28,#32 - mov w20,w30 - lsr x21,x30,#32 - - mov x4,#10 - subs x2,x2,#64 -Loop: - sub x4,x4,#1 - add w5,w5,w9 - add w6,w6,w10 - add w7,w7,w11 - add w8,w8,w12 - eor w17,w17,w5 - eor w19,w19,w6 - eor w20,w20,w7 - eor w21,w21,w8 - ror w17,w17,#16 - ror w19,w19,#16 - ror w20,w20,#16 - ror w21,w21,#16 - add w13,w13,w17 - add w14,w14,w19 - add w15,w15,w20 - add w16,w16,w21 - eor w9,w9,w13 - eor w10,w10,w14 - eor w11,w11,w15 - eor w12,w12,w16 - ror w9,w9,#20 - ror w10,w10,#20 - ror w11,w11,#20 - ror w12,w12,#20 - add w5,w5,w9 - add w6,w6,w10 - add w7,w7,w11 - add w8,w8,w12 - eor w17,w17,w5 - eor w19,w19,w6 - eor w20,w20,w7 - eor w21,w21,w8 - ror w17,w17,#24 - ror w19,w19,#24 - ror w20,w20,#24 - ror w21,w21,#24 - add w13,w13,w17 - add w14,w14,w19 - add w15,w15,w20 - add w16,w16,w21 - eor w9,w9,w13 - eor w10,w10,w14 - eor w11,w11,w15 - eor w12,w12,w16 - ror w9,w9,#25 - ror w10,w10,#25 - ror w11,w11,#25 - ror w12,w12,#25 - add w5,w5,w10 - add w6,w6,w11 - add w7,w7,w12 - add w8,w8,w9 - eor w21,w21,w5 - eor w17,w17,w6 - eor w19,w19,w7 - eor w20,w20,w8 - ror w21,w21,#16 - ror w17,w17,#16 - ror w19,w19,#16 - ror w20,w20,#16 - add w15,w15,w21 - add w16,w16,w17 - add w13,w13,w19 - add w14,w14,w20 - eor w10,w10,w15 - eor w11,w11,w16 - eor w12,w12,w13 - eor w9,w9,w14 - ror w10,w10,#20 - ror w11,w11,#20 - ror w12,w12,#20 - ror w9,w9,#20 - add w5,w5,w10 - add w6,w6,w11 - add w7,w7,w12 - add w8,w8,w9 - eor w21,w21,w5 - eor w17,w17,w6 - eor w19,w19,w7 - eor w20,w20,w8 - ror w21,w21,#24 - ror w17,w17,#24 - ror w19,w19,#24 - ror w20,w20,#24 - add w15,w15,w21 - add w16,w16,w17 - add w13,w13,w19 - add w14,w14,w20 - eor w10,w10,w15 - eor w11,w11,w16 - eor w12,w12,w13 - eor w9,w9,w14 - ror w10,w10,#25 - ror w11,w11,#25 - ror w12,w12,#25 - ror w9,w9,#25 - cbnz x4,Loop - - add w5,w5,w22 // accumulate key block - add x6,x6,x22,lsr#32 - add w7,w7,w23 - add x8,x8,x23,lsr#32 - add w9,w9,w24 - add x10,x10,x24,lsr#32 - add w11,w11,w25 - add x12,x12,x25,lsr#32 - add w13,w13,w26 - add x14,x14,x26,lsr#32 - add w15,w15,w27 - add x16,x16,x27,lsr#32 - add w17,w17,w28 - add x19,x19,x28,lsr#32 - add w20,w20,w30 - add x21,x21,x30,lsr#32 - - b.lo Ltail - - add x5,x5,x6,lsl#32 // pack - add x7,x7,x8,lsl#32 - ldp x6,x8,[x1,#0] // load input - add x9,x9,x10,lsl#32 - add x11,x11,x12,lsl#32 - ldp x10,x12,[x1,#16] - add x13,x13,x14,lsl#32 - add x15,x15,x16,lsl#32 - ldp x14,x16,[x1,#32] - add x17,x17,x19,lsl#32 - add x20,x20,x21,lsl#32 - ldp x19,x21,[x1,#48] - add x1,x1,#64 -#ifdef __ARMEB__ - rev x5,x5 - rev x7,x7 - rev x9,x9 - rev x11,x11 - rev x13,x13 - rev x15,x15 - rev x17,x17 - rev x20,x20 -#endif - eor x5,x5,x6 - eor x7,x7,x8 - eor x9,x9,x10 - eor x11,x11,x12 - eor x13,x13,x14 - eor x15,x15,x16 - eor x17,x17,x19 - eor x20,x20,x21 - - stp x5,x7,[x0,#0] // store output - add x28,x28,#1 // increment counter - stp x9,x11,[x0,#16] - stp x13,x15,[x0,#32] - stp x17,x20,[x0,#48] - add x0,x0,#64 - - b.hi Loop_outer - - ldp x19,x20,[x29,#16] - add sp,sp,#64 - ldp x21,x22,[x29,#32] - ldp x23,x24,[x29,#48] - ldp x25,x26,[x29,#64] - ldp x27,x28,[x29,#80] - ldp x29,x30,[sp],#96 - AARCH64_VALIDATE_LINK_REGISTER -Labort: - ret - -.align 4 -Ltail: - add x2,x2,#64 -Less_than_64: - sub x0,x0,#1 - add x1,x1,x2 - add x0,x0,x2 - add x4,sp,x2 - neg x2,x2 - - add x5,x5,x6,lsl#32 // pack - add x7,x7,x8,lsl#32 - add x9,x9,x10,lsl#32 - add x11,x11,x12,lsl#32 - add x13,x13,x14,lsl#32 - add x15,x15,x16,lsl#32 - add x17,x17,x19,lsl#32 - add x20,x20,x21,lsl#32 -#ifdef __ARMEB__ - rev x5,x5 - rev x7,x7 - rev x9,x9 - rev x11,x11 - rev x13,x13 - rev x15,x15 - rev x17,x17 - rev x20,x20 -#endif - stp x5,x7,[sp,#0] - stp x9,x11,[sp,#16] - stp x13,x15,[sp,#32] - stp x17,x20,[sp,#48] - -Loop_tail: - ldrb w10,[x1,x2] - ldrb w11,[x4,x2] - add x2,x2,#1 - eor w10,w10,w11 - strb w10,[x0,x2] - cbnz x2,Loop_tail - - stp xzr,xzr,[sp,#0] - stp xzr,xzr,[sp,#16] - stp xzr,xzr,[sp,#32] - stp xzr,xzr,[sp,#48] - - ldp x19,x20,[x29,#16] - add sp,sp,#64 - ldp x21,x22,[x29,#32] - ldp x23,x24,[x29,#48] - ldp x25,x26,[x29,#64] - ldp x27,x28,[x29,#80] - ldp x29,x30,[sp],#96 - AARCH64_VALIDATE_LINK_REGISTER - ret - - - -.align 5 -ChaCha20_neon: - AARCH64_SIGN_LINK_REGISTER - stp x29,x30,[sp,#-96]! - add x29,sp,#0 - - adrp x5,Lsigma@PAGE - add x5,x5,Lsigma@PAGEOFF - stp x19,x20,[sp,#16] - stp x21,x22,[sp,#32] - stp x23,x24,[sp,#48] - stp x25,x26,[sp,#64] - stp x27,x28,[sp,#80] - cmp x2,#512 - b.hs L512_or_more_neon - - sub sp,sp,#64 - - ldp x22,x23,[x5] // load sigma - ld1 {v24.4s},[x5],#16 - ldp x24,x25,[x3] // load key - ldp x26,x27,[x3,#16] - ld1 {v25.4s,v26.4s},[x3] - ldp x28,x30,[x4] // load counter - ld1 {v27.4s},[x4] - ld1 {v31.4s},[x5] -#ifdef __ARMEB__ - rev64 v24.4s,v24.4s - ror x24,x24,#32 - ror x25,x25,#32 - ror x26,x26,#32 - ror x27,x27,#32 - ror x28,x28,#32 - ror x30,x30,#32 -#endif - add v27.4s,v27.4s,v31.4s // += 1 - add v28.4s,v27.4s,v31.4s - add v29.4s,v28.4s,v31.4s - shl v31.4s,v31.4s,#2 // 1 -> 4 - -Loop_outer_neon: - mov w5,w22 // unpack key block - lsr x6,x22,#32 - mov v0.16b,v24.16b - mov w7,w23 - lsr x8,x23,#32 - mov v4.16b,v24.16b - mov w9,w24 - lsr x10,x24,#32 - mov v16.16b,v24.16b - mov w11,w25 - mov v1.16b,v25.16b - lsr x12,x25,#32 - mov v5.16b,v25.16b - mov w13,w26 - mov v17.16b,v25.16b - lsr x14,x26,#32 - mov v3.16b,v27.16b - mov w15,w27 - mov v7.16b,v28.16b - lsr x16,x27,#32 - mov v19.16b,v29.16b - mov w17,w28 - mov v2.16b,v26.16b - lsr x19,x28,#32 - mov v6.16b,v26.16b - mov w20,w30 - mov v18.16b,v26.16b - lsr x21,x30,#32 - - mov x4,#10 - subs x2,x2,#256 -Loop_neon: - sub x4,x4,#1 - add v0.4s,v0.4s,v1.4s - add w5,w5,w9 - add v4.4s,v4.4s,v5.4s - add w6,w6,w10 - add v16.4s,v16.4s,v17.4s - add w7,w7,w11 - eor v3.16b,v3.16b,v0.16b - add w8,w8,w12 - eor v7.16b,v7.16b,v4.16b - eor w17,w17,w5 - eor v19.16b,v19.16b,v16.16b - eor w19,w19,w6 - rev32 v3.8h,v3.8h - eor w20,w20,w7 - rev32 v7.8h,v7.8h - eor w21,w21,w8 - rev32 v19.8h,v19.8h - ror w17,w17,#16 - add v2.4s,v2.4s,v3.4s - ror w19,w19,#16 - add v6.4s,v6.4s,v7.4s - ror w20,w20,#16 - add v18.4s,v18.4s,v19.4s - ror w21,w21,#16 - eor v20.16b,v1.16b,v2.16b - add w13,w13,w17 - eor v21.16b,v5.16b,v6.16b - add w14,w14,w19 - eor v22.16b,v17.16b,v18.16b - add w15,w15,w20 - ushr v1.4s,v20.4s,#20 - add w16,w16,w21 - ushr v5.4s,v21.4s,#20 - eor w9,w9,w13 - ushr v17.4s,v22.4s,#20 - eor w10,w10,w14 - sli v1.4s,v20.4s,#12 - eor w11,w11,w15 - sli v5.4s,v21.4s,#12 - eor w12,w12,w16 - sli v17.4s,v22.4s,#12 - ror w9,w9,#20 - add v0.4s,v0.4s,v1.4s - ror w10,w10,#20 - add v4.4s,v4.4s,v5.4s - ror w11,w11,#20 - add v16.4s,v16.4s,v17.4s - ror w12,w12,#20 - eor v20.16b,v3.16b,v0.16b - add w5,w5,w9 - eor v21.16b,v7.16b,v4.16b - add w6,w6,w10 - eor v22.16b,v19.16b,v16.16b - add w7,w7,w11 - ushr v3.4s,v20.4s,#24 - add w8,w8,w12 - ushr v7.4s,v21.4s,#24 - eor w17,w17,w5 - ushr v19.4s,v22.4s,#24 - eor w19,w19,w6 - sli v3.4s,v20.4s,#8 - eor w20,w20,w7 - sli v7.4s,v21.4s,#8 - eor w21,w21,w8 - sli v19.4s,v22.4s,#8 - ror w17,w17,#24 - add v2.4s,v2.4s,v3.4s - ror w19,w19,#24 - add v6.4s,v6.4s,v7.4s - ror w20,w20,#24 - add v18.4s,v18.4s,v19.4s - ror w21,w21,#24 - eor v20.16b,v1.16b,v2.16b - add w13,w13,w17 - eor v21.16b,v5.16b,v6.16b - add w14,w14,w19 - eor v22.16b,v17.16b,v18.16b - add w15,w15,w20 - ushr v1.4s,v20.4s,#25 - add w16,w16,w21 - ushr v5.4s,v21.4s,#25 - eor w9,w9,w13 - ushr v17.4s,v22.4s,#25 - eor w10,w10,w14 - sli v1.4s,v20.4s,#7 - eor w11,w11,w15 - sli v5.4s,v21.4s,#7 - eor w12,w12,w16 - sli v17.4s,v22.4s,#7 - ror w9,w9,#25 - ext v2.16b,v2.16b,v2.16b,#8 - ror w10,w10,#25 - ext v6.16b,v6.16b,v6.16b,#8 - ror w11,w11,#25 - ext v18.16b,v18.16b,v18.16b,#8 - ror w12,w12,#25 - ext v3.16b,v3.16b,v3.16b,#12 - ext v7.16b,v7.16b,v7.16b,#12 - ext v19.16b,v19.16b,v19.16b,#12 - ext v1.16b,v1.16b,v1.16b,#4 - ext v5.16b,v5.16b,v5.16b,#4 - ext v17.16b,v17.16b,v17.16b,#4 - add v0.4s,v0.4s,v1.4s - add w5,w5,w10 - add v4.4s,v4.4s,v5.4s - add w6,w6,w11 - add v16.4s,v16.4s,v17.4s - add w7,w7,w12 - eor v3.16b,v3.16b,v0.16b - add w8,w8,w9 - eor v7.16b,v7.16b,v4.16b - eor w21,w21,w5 - eor v19.16b,v19.16b,v16.16b - eor w17,w17,w6 - rev32 v3.8h,v3.8h - eor w19,w19,w7 - rev32 v7.8h,v7.8h - eor w20,w20,w8 - rev32 v19.8h,v19.8h - ror w21,w21,#16 - add v2.4s,v2.4s,v3.4s - ror w17,w17,#16 - add v6.4s,v6.4s,v7.4s - ror w19,w19,#16 - add v18.4s,v18.4s,v19.4s - ror w20,w20,#16 - eor v20.16b,v1.16b,v2.16b - add w15,w15,w21 - eor v21.16b,v5.16b,v6.16b - add w16,w16,w17 - eor v22.16b,v17.16b,v18.16b - add w13,w13,w19 - ushr v1.4s,v20.4s,#20 - add w14,w14,w20 - ushr v5.4s,v21.4s,#20 - eor w10,w10,w15 - ushr v17.4s,v22.4s,#20 - eor w11,w11,w16 - sli v1.4s,v20.4s,#12 - eor w12,w12,w13 - sli v5.4s,v21.4s,#12 - eor w9,w9,w14 - sli v17.4s,v22.4s,#12 - ror w10,w10,#20 - add v0.4s,v0.4s,v1.4s - ror w11,w11,#20 - add v4.4s,v4.4s,v5.4s - ror w12,w12,#20 - add v16.4s,v16.4s,v17.4s - ror w9,w9,#20 - eor v20.16b,v3.16b,v0.16b - add w5,w5,w10 - eor v21.16b,v7.16b,v4.16b - add w6,w6,w11 - eor v22.16b,v19.16b,v16.16b - add w7,w7,w12 - ushr v3.4s,v20.4s,#24 - add w8,w8,w9 - ushr v7.4s,v21.4s,#24 - eor w21,w21,w5 - ushr v19.4s,v22.4s,#24 - eor w17,w17,w6 - sli v3.4s,v20.4s,#8 - eor w19,w19,w7 - sli v7.4s,v21.4s,#8 - eor w20,w20,w8 - sli v19.4s,v22.4s,#8 - ror w21,w21,#24 - add v2.4s,v2.4s,v3.4s - ror w17,w17,#24 - add v6.4s,v6.4s,v7.4s - ror w19,w19,#24 - add v18.4s,v18.4s,v19.4s - ror w20,w20,#24 - eor v20.16b,v1.16b,v2.16b - add w15,w15,w21 - eor v21.16b,v5.16b,v6.16b - add w16,w16,w17 - eor v22.16b,v17.16b,v18.16b - add w13,w13,w19 - ushr v1.4s,v20.4s,#25 - add w14,w14,w20 - ushr v5.4s,v21.4s,#25 - eor w10,w10,w15 - ushr v17.4s,v22.4s,#25 - eor w11,w11,w16 - sli v1.4s,v20.4s,#7 - eor w12,w12,w13 - sli v5.4s,v21.4s,#7 - eor w9,w9,w14 - sli v17.4s,v22.4s,#7 - ror w10,w10,#25 - ext v2.16b,v2.16b,v2.16b,#8 - ror w11,w11,#25 - ext v6.16b,v6.16b,v6.16b,#8 - ror w12,w12,#25 - ext v18.16b,v18.16b,v18.16b,#8 - ror w9,w9,#25 - ext v3.16b,v3.16b,v3.16b,#4 - ext v7.16b,v7.16b,v7.16b,#4 - ext v19.16b,v19.16b,v19.16b,#4 - ext v1.16b,v1.16b,v1.16b,#12 - ext v5.16b,v5.16b,v5.16b,#12 - ext v17.16b,v17.16b,v17.16b,#12 - cbnz x4,Loop_neon - - add w5,w5,w22 // accumulate key block - add v0.4s,v0.4s,v24.4s - add x6,x6,x22,lsr#32 - add v4.4s,v4.4s,v24.4s - add w7,w7,w23 - add v16.4s,v16.4s,v24.4s - add x8,x8,x23,lsr#32 - add v2.4s,v2.4s,v26.4s - add w9,w9,w24 - add v6.4s,v6.4s,v26.4s - add x10,x10,x24,lsr#32 - add v18.4s,v18.4s,v26.4s - add w11,w11,w25 - add v3.4s,v3.4s,v27.4s - add x12,x12,x25,lsr#32 - add w13,w13,w26 - add v7.4s,v7.4s,v28.4s - add x14,x14,x26,lsr#32 - add w15,w15,w27 - add v19.4s,v19.4s,v29.4s - add x16,x16,x27,lsr#32 - add w17,w17,w28 - add v1.4s,v1.4s,v25.4s - add x19,x19,x28,lsr#32 - add w20,w20,w30 - add v5.4s,v5.4s,v25.4s - add x21,x21,x30,lsr#32 - add v17.4s,v17.4s,v25.4s - - b.lo Ltail_neon - - add x5,x5,x6,lsl#32 // pack - add x7,x7,x8,lsl#32 - ldp x6,x8,[x1,#0] // load input - add x9,x9,x10,lsl#32 - add x11,x11,x12,lsl#32 - ldp x10,x12,[x1,#16] - add x13,x13,x14,lsl#32 - add x15,x15,x16,lsl#32 - ldp x14,x16,[x1,#32] - add x17,x17,x19,lsl#32 - add x20,x20,x21,lsl#32 - ldp x19,x21,[x1,#48] - add x1,x1,#64 -#ifdef __ARMEB__ - rev x5,x5 - rev x7,x7 - rev x9,x9 - rev x11,x11 - rev x13,x13 - rev x15,x15 - rev x17,x17 - rev x20,x20 -#endif - ld1 {v20.16b,v21.16b,v22.16b,v23.16b},[x1],#64 - eor x5,x5,x6 - eor x7,x7,x8 - eor x9,x9,x10 - eor x11,x11,x12 - eor x13,x13,x14 - eor v0.16b,v0.16b,v20.16b - eor x15,x15,x16 - eor v1.16b,v1.16b,v21.16b - eor x17,x17,x19 - eor v2.16b,v2.16b,v22.16b - eor x20,x20,x21 - eor v3.16b,v3.16b,v23.16b - ld1 {v20.16b,v21.16b,v22.16b,v23.16b},[x1],#64 - - stp x5,x7,[x0,#0] // store output - add x28,x28,#4 // increment counter - stp x9,x11,[x0,#16] - add v27.4s,v27.4s,v31.4s // += 4 - stp x13,x15,[x0,#32] - add v28.4s,v28.4s,v31.4s - stp x17,x20,[x0,#48] - add v29.4s,v29.4s,v31.4s - add x0,x0,#64 - - st1 {v0.16b,v1.16b,v2.16b,v3.16b},[x0],#64 - ld1 {v0.16b,v1.16b,v2.16b,v3.16b},[x1],#64 - - eor v4.16b,v4.16b,v20.16b - eor v5.16b,v5.16b,v21.16b - eor v6.16b,v6.16b,v22.16b - eor v7.16b,v7.16b,v23.16b - st1 {v4.16b,v5.16b,v6.16b,v7.16b},[x0],#64 - - eor v16.16b,v16.16b,v0.16b - eor v17.16b,v17.16b,v1.16b - eor v18.16b,v18.16b,v2.16b - eor v19.16b,v19.16b,v3.16b - st1 {v16.16b,v17.16b,v18.16b,v19.16b},[x0],#64 - - b.hi Loop_outer_neon - - ldp x19,x20,[x29,#16] - add sp,sp,#64 - ldp x21,x22,[x29,#32] - ldp x23,x24,[x29,#48] - ldp x25,x26,[x29,#64] - ldp x27,x28,[x29,#80] - ldp x29,x30,[sp],#96 - AARCH64_VALIDATE_LINK_REGISTER - ret - -Ltail_neon: - add x2,x2,#256 - cmp x2,#64 - b.lo Less_than_64 - - add x5,x5,x6,lsl#32 // pack - add x7,x7,x8,lsl#32 - ldp x6,x8,[x1,#0] // load input - add x9,x9,x10,lsl#32 - add x11,x11,x12,lsl#32 - ldp x10,x12,[x1,#16] - add x13,x13,x14,lsl#32 - add x15,x15,x16,lsl#32 - ldp x14,x16,[x1,#32] - add x17,x17,x19,lsl#32 - add x20,x20,x21,lsl#32 - ldp x19,x21,[x1,#48] - add x1,x1,#64 -#ifdef __ARMEB__ - rev x5,x5 - rev x7,x7 - rev x9,x9 - rev x11,x11 - rev x13,x13 - rev x15,x15 - rev x17,x17 - rev x20,x20 -#endif - eor x5,x5,x6 - eor x7,x7,x8 - eor x9,x9,x10 - eor x11,x11,x12 - eor x13,x13,x14 - eor x15,x15,x16 - eor x17,x17,x19 - eor x20,x20,x21 - - stp x5,x7,[x0,#0] // store output - add x28,x28,#4 // increment counter - stp x9,x11,[x0,#16] - stp x13,x15,[x0,#32] - stp x17,x20,[x0,#48] - add x0,x0,#64 - b.eq Ldone_neon - sub x2,x2,#64 - cmp x2,#64 - b.lo Less_than_128 - - ld1 {v20.16b,v21.16b,v22.16b,v23.16b},[x1],#64 - eor v0.16b,v0.16b,v20.16b - eor v1.16b,v1.16b,v21.16b - eor v2.16b,v2.16b,v22.16b - eor v3.16b,v3.16b,v23.16b - st1 {v0.16b,v1.16b,v2.16b,v3.16b},[x0],#64 - b.eq Ldone_neon - sub x2,x2,#64 - cmp x2,#64 - b.lo Less_than_192 - - ld1 {v20.16b,v21.16b,v22.16b,v23.16b},[x1],#64 - eor v4.16b,v4.16b,v20.16b - eor v5.16b,v5.16b,v21.16b - eor v6.16b,v6.16b,v22.16b - eor v7.16b,v7.16b,v23.16b - st1 {v4.16b,v5.16b,v6.16b,v7.16b},[x0],#64 - b.eq Ldone_neon - sub x2,x2,#64 - - st1 {v16.16b,v17.16b,v18.16b,v19.16b},[sp] - b Last_neon - -Less_than_128: - st1 {v0.16b,v1.16b,v2.16b,v3.16b},[sp] - b Last_neon -Less_than_192: - st1 {v4.16b,v5.16b,v6.16b,v7.16b},[sp] - b Last_neon - -.align 4 -Last_neon: - sub x0,x0,#1 - add x1,x1,x2 - add x0,x0,x2 - add x4,sp,x2 - neg x2,x2 - -Loop_tail_neon: - ldrb w10,[x1,x2] - ldrb w11,[x4,x2] - add x2,x2,#1 - eor w10,w10,w11 - strb w10,[x0,x2] - cbnz x2,Loop_tail_neon - - stp xzr,xzr,[sp,#0] - stp xzr,xzr,[sp,#16] - stp xzr,xzr,[sp,#32] - stp xzr,xzr,[sp,#48] - -Ldone_neon: - ldp x19,x20,[x29,#16] - add sp,sp,#64 - ldp x21,x22,[x29,#32] - ldp x23,x24,[x29,#48] - ldp x25,x26,[x29,#64] - ldp x27,x28,[x29,#80] - ldp x29,x30,[sp],#96 - AARCH64_VALIDATE_LINK_REGISTER - ret - - -.align 5 -ChaCha20_512_neon: - AARCH64_SIGN_LINK_REGISTER - stp x29,x30,[sp,#-96]! - add x29,sp,#0 - - adrp x5,Lsigma@PAGE - add x5,x5,Lsigma@PAGEOFF - stp x19,x20,[sp,#16] - stp x21,x22,[sp,#32] - stp x23,x24,[sp,#48] - stp x25,x26,[sp,#64] - stp x27,x28,[sp,#80] - -L512_or_more_neon: - sub sp,sp,#128+64 - - ldp x22,x23,[x5] // load sigma - ld1 {v24.4s},[x5],#16 - ldp x24,x25,[x3] // load key - ldp x26,x27,[x3,#16] - ld1 {v25.4s,v26.4s},[x3] - ldp x28,x30,[x4] // load counter - ld1 {v27.4s},[x4] - ld1 {v31.4s},[x5] -#ifdef __ARMEB__ - rev64 v24.4s,v24.4s - ror x24,x24,#32 - ror x25,x25,#32 - ror x26,x26,#32 - ror x27,x27,#32 - ror x28,x28,#32 - ror x30,x30,#32 -#endif - add v27.4s,v27.4s,v31.4s // += 1 - stp q24,q25,[sp,#0] // off-load key block, invariant part - add v27.4s,v27.4s,v31.4s // not typo - str q26,[sp,#32] - add v28.4s,v27.4s,v31.4s - add v29.4s,v28.4s,v31.4s - add v30.4s,v29.4s,v31.4s - shl v31.4s,v31.4s,#2 // 1 -> 4 - - stp d8,d9,[sp,#128+0] // meet ABI requirements - stp d10,d11,[sp,#128+16] - stp d12,d13,[sp,#128+32] - stp d14,d15,[sp,#128+48] - - sub x2,x2,#512 // not typo - -Loop_outer_512_neon: - mov v0.16b,v24.16b - mov v4.16b,v24.16b - mov v8.16b,v24.16b - mov v12.16b,v24.16b - mov v16.16b,v24.16b - mov v20.16b,v24.16b - mov v1.16b,v25.16b - mov w5,w22 // unpack key block - mov v5.16b,v25.16b - lsr x6,x22,#32 - mov v9.16b,v25.16b - mov w7,w23 - mov v13.16b,v25.16b - lsr x8,x23,#32 - mov v17.16b,v25.16b - mov w9,w24 - mov v21.16b,v25.16b - lsr x10,x24,#32 - mov v3.16b,v27.16b - mov w11,w25 - mov v7.16b,v28.16b - lsr x12,x25,#32 - mov v11.16b,v29.16b - mov w13,w26 - mov v15.16b,v30.16b - lsr x14,x26,#32 - mov v2.16b,v26.16b - mov w15,w27 - mov v6.16b,v26.16b - lsr x16,x27,#32 - add v19.4s,v3.4s,v31.4s // +4 - mov w17,w28 - add v23.4s,v7.4s,v31.4s // +4 - lsr x19,x28,#32 - mov v10.16b,v26.16b - mov w20,w30 - mov v14.16b,v26.16b - lsr x21,x30,#32 - mov v18.16b,v26.16b - stp q27,q28,[sp,#48] // off-load key block, variable part - mov v22.16b,v26.16b - str q29,[sp,#80] - - mov x4,#5 - subs x2,x2,#512 -Loop_upper_neon: - sub x4,x4,#1 - add v0.4s,v0.4s,v1.4s - add w5,w5,w9 - add v4.4s,v4.4s,v5.4s - add w6,w6,w10 - add v8.4s,v8.4s,v9.4s - add w7,w7,w11 - add v12.4s,v12.4s,v13.4s - add w8,w8,w12 - add v16.4s,v16.4s,v17.4s - eor w17,w17,w5 - add v20.4s,v20.4s,v21.4s - eor w19,w19,w6 - eor v3.16b,v3.16b,v0.16b - eor w20,w20,w7 - eor v7.16b,v7.16b,v4.16b - eor w21,w21,w8 - eor v11.16b,v11.16b,v8.16b - ror w17,w17,#16 - eor v15.16b,v15.16b,v12.16b - ror w19,w19,#16 - eor v19.16b,v19.16b,v16.16b - ror w20,w20,#16 - eor v23.16b,v23.16b,v20.16b - ror w21,w21,#16 - rev32 v3.8h,v3.8h - add w13,w13,w17 - rev32 v7.8h,v7.8h - add w14,w14,w19 - rev32 v11.8h,v11.8h - add w15,w15,w20 - rev32 v15.8h,v15.8h - add w16,w16,w21 - rev32 v19.8h,v19.8h - eor w9,w9,w13 - rev32 v23.8h,v23.8h - eor w10,w10,w14 - add v2.4s,v2.4s,v3.4s - eor w11,w11,w15 - add v6.4s,v6.4s,v7.4s - eor w12,w12,w16 - add v10.4s,v10.4s,v11.4s - ror w9,w9,#20 - add v14.4s,v14.4s,v15.4s - ror w10,w10,#20 - add v18.4s,v18.4s,v19.4s - ror w11,w11,#20 - add v22.4s,v22.4s,v23.4s - ror w12,w12,#20 - eor v24.16b,v1.16b,v2.16b - add w5,w5,w9 - eor v25.16b,v5.16b,v6.16b - add w6,w6,w10 - eor v26.16b,v9.16b,v10.16b - add w7,w7,w11 - eor v27.16b,v13.16b,v14.16b - add w8,w8,w12 - eor v28.16b,v17.16b,v18.16b - eor w17,w17,w5 - eor v29.16b,v21.16b,v22.16b - eor w19,w19,w6 - ushr v1.4s,v24.4s,#20 - eor w20,w20,w7 - ushr v5.4s,v25.4s,#20 - eor w21,w21,w8 - ushr v9.4s,v26.4s,#20 - ror w17,w17,#24 - ushr v13.4s,v27.4s,#20 - ror w19,w19,#24 - ushr v17.4s,v28.4s,#20 - ror w20,w20,#24 - ushr v21.4s,v29.4s,#20 - ror w21,w21,#24 - sli v1.4s,v24.4s,#12 - add w13,w13,w17 - sli v5.4s,v25.4s,#12 - add w14,w14,w19 - sli v9.4s,v26.4s,#12 - add w15,w15,w20 - sli v13.4s,v27.4s,#12 - add w16,w16,w21 - sli v17.4s,v28.4s,#12 - eor w9,w9,w13 - sli v21.4s,v29.4s,#12 - eor w10,w10,w14 - add v0.4s,v0.4s,v1.4s - eor w11,w11,w15 - add v4.4s,v4.4s,v5.4s - eor w12,w12,w16 - add v8.4s,v8.4s,v9.4s - ror w9,w9,#25 - add v12.4s,v12.4s,v13.4s - ror w10,w10,#25 - add v16.4s,v16.4s,v17.4s - ror w11,w11,#25 - add v20.4s,v20.4s,v21.4s - ror w12,w12,#25 - eor v24.16b,v3.16b,v0.16b - add w5,w5,w10 - eor v25.16b,v7.16b,v4.16b - add w6,w6,w11 - eor v26.16b,v11.16b,v8.16b - add w7,w7,w12 - eor v27.16b,v15.16b,v12.16b - add w8,w8,w9 - eor v28.16b,v19.16b,v16.16b - eor w21,w21,w5 - eor v29.16b,v23.16b,v20.16b - eor w17,w17,w6 - ushr v3.4s,v24.4s,#24 - eor w19,w19,w7 - ushr v7.4s,v25.4s,#24 - eor w20,w20,w8 - ushr v11.4s,v26.4s,#24 - ror w21,w21,#16 - ushr v15.4s,v27.4s,#24 - ror w17,w17,#16 - ushr v19.4s,v28.4s,#24 - ror w19,w19,#16 - ushr v23.4s,v29.4s,#24 - ror w20,w20,#16 - sli v3.4s,v24.4s,#8 - add w15,w15,w21 - sli v7.4s,v25.4s,#8 - add w16,w16,w17 - sli v11.4s,v26.4s,#8 - add w13,w13,w19 - sli v15.4s,v27.4s,#8 - add w14,w14,w20 - sli v19.4s,v28.4s,#8 - eor w10,w10,w15 - sli v23.4s,v29.4s,#8 - eor w11,w11,w16 - add v2.4s,v2.4s,v3.4s - eor w12,w12,w13 - add v6.4s,v6.4s,v7.4s - eor w9,w9,w14 - add v10.4s,v10.4s,v11.4s - ror w10,w10,#20 - add v14.4s,v14.4s,v15.4s - ror w11,w11,#20 - add v18.4s,v18.4s,v19.4s - ror w12,w12,#20 - add v22.4s,v22.4s,v23.4s - ror w9,w9,#20 - eor v24.16b,v1.16b,v2.16b - add w5,w5,w10 - eor v25.16b,v5.16b,v6.16b - add w6,w6,w11 - eor v26.16b,v9.16b,v10.16b - add w7,w7,w12 - eor v27.16b,v13.16b,v14.16b - add w8,w8,w9 - eor v28.16b,v17.16b,v18.16b - eor w21,w21,w5 - eor v29.16b,v21.16b,v22.16b - eor w17,w17,w6 - ushr v1.4s,v24.4s,#25 - eor w19,w19,w7 - ushr v5.4s,v25.4s,#25 - eor w20,w20,w8 - ushr v9.4s,v26.4s,#25 - ror w21,w21,#24 - ushr v13.4s,v27.4s,#25 - ror w17,w17,#24 - ushr v17.4s,v28.4s,#25 - ror w19,w19,#24 - ushr v21.4s,v29.4s,#25 - ror w20,w20,#24 - sli v1.4s,v24.4s,#7 - add w15,w15,w21 - sli v5.4s,v25.4s,#7 - add w16,w16,w17 - sli v9.4s,v26.4s,#7 - add w13,w13,w19 - sli v13.4s,v27.4s,#7 - add w14,w14,w20 - sli v17.4s,v28.4s,#7 - eor w10,w10,w15 - sli v21.4s,v29.4s,#7 - eor w11,w11,w16 - ext v2.16b,v2.16b,v2.16b,#8 - eor w12,w12,w13 - ext v6.16b,v6.16b,v6.16b,#8 - eor w9,w9,w14 - ext v10.16b,v10.16b,v10.16b,#8 - ror w10,w10,#25 - ext v14.16b,v14.16b,v14.16b,#8 - ror w11,w11,#25 - ext v18.16b,v18.16b,v18.16b,#8 - ror w12,w12,#25 - ext v22.16b,v22.16b,v22.16b,#8 - ror w9,w9,#25 - ext v3.16b,v3.16b,v3.16b,#12 - ext v7.16b,v7.16b,v7.16b,#12 - ext v11.16b,v11.16b,v11.16b,#12 - ext v15.16b,v15.16b,v15.16b,#12 - ext v19.16b,v19.16b,v19.16b,#12 - ext v23.16b,v23.16b,v23.16b,#12 - ext v1.16b,v1.16b,v1.16b,#4 - ext v5.16b,v5.16b,v5.16b,#4 - ext v9.16b,v9.16b,v9.16b,#4 - ext v13.16b,v13.16b,v13.16b,#4 - ext v17.16b,v17.16b,v17.16b,#4 - ext v21.16b,v21.16b,v21.16b,#4 - add v0.4s,v0.4s,v1.4s - add w5,w5,w9 - add v4.4s,v4.4s,v5.4s - add w6,w6,w10 - add v8.4s,v8.4s,v9.4s - add w7,w7,w11 - add v12.4s,v12.4s,v13.4s - add w8,w8,w12 - add v16.4s,v16.4s,v17.4s - eor w17,w17,w5 - add v20.4s,v20.4s,v21.4s - eor w19,w19,w6 - eor v3.16b,v3.16b,v0.16b - eor w20,w20,w7 - eor v7.16b,v7.16b,v4.16b - eor w21,w21,w8 - eor v11.16b,v11.16b,v8.16b - ror w17,w17,#16 - eor v15.16b,v15.16b,v12.16b - ror w19,w19,#16 - eor v19.16b,v19.16b,v16.16b - ror w20,w20,#16 - eor v23.16b,v23.16b,v20.16b - ror w21,w21,#16 - rev32 v3.8h,v3.8h - add w13,w13,w17 - rev32 v7.8h,v7.8h - add w14,w14,w19 - rev32 v11.8h,v11.8h - add w15,w15,w20 - rev32 v15.8h,v15.8h - add w16,w16,w21 - rev32 v19.8h,v19.8h - eor w9,w9,w13 - rev32 v23.8h,v23.8h - eor w10,w10,w14 - add v2.4s,v2.4s,v3.4s - eor w11,w11,w15 - add v6.4s,v6.4s,v7.4s - eor w12,w12,w16 - add v10.4s,v10.4s,v11.4s - ror w9,w9,#20 - add v14.4s,v14.4s,v15.4s - ror w10,w10,#20 - add v18.4s,v18.4s,v19.4s - ror w11,w11,#20 - add v22.4s,v22.4s,v23.4s - ror w12,w12,#20 - eor v24.16b,v1.16b,v2.16b - add w5,w5,w9 - eor v25.16b,v5.16b,v6.16b - add w6,w6,w10 - eor v26.16b,v9.16b,v10.16b - add w7,w7,w11 - eor v27.16b,v13.16b,v14.16b - add w8,w8,w12 - eor v28.16b,v17.16b,v18.16b - eor w17,w17,w5 - eor v29.16b,v21.16b,v22.16b - eor w19,w19,w6 - ushr v1.4s,v24.4s,#20 - eor w20,w20,w7 - ushr v5.4s,v25.4s,#20 - eor w21,w21,w8 - ushr v9.4s,v26.4s,#20 - ror w17,w17,#24 - ushr v13.4s,v27.4s,#20 - ror w19,w19,#24 - ushr v17.4s,v28.4s,#20 - ror w20,w20,#24 - ushr v21.4s,v29.4s,#20 - ror w21,w21,#24 - sli v1.4s,v24.4s,#12 - add w13,w13,w17 - sli v5.4s,v25.4s,#12 - add w14,w14,w19 - sli v9.4s,v26.4s,#12 - add w15,w15,w20 - sli v13.4s,v27.4s,#12 - add w16,w16,w21 - sli v17.4s,v28.4s,#12 - eor w9,w9,w13 - sli v21.4s,v29.4s,#12 - eor w10,w10,w14 - add v0.4s,v0.4s,v1.4s - eor w11,w11,w15 - add v4.4s,v4.4s,v5.4s - eor w12,w12,w16 - add v8.4s,v8.4s,v9.4s - ror w9,w9,#25 - add v12.4s,v12.4s,v13.4s - ror w10,w10,#25 - add v16.4s,v16.4s,v17.4s - ror w11,w11,#25 - add v20.4s,v20.4s,v21.4s - ror w12,w12,#25 - eor v24.16b,v3.16b,v0.16b - add w5,w5,w10 - eor v25.16b,v7.16b,v4.16b - add w6,w6,w11 - eor v26.16b,v11.16b,v8.16b - add w7,w7,w12 - eor v27.16b,v15.16b,v12.16b - add w8,w8,w9 - eor v28.16b,v19.16b,v16.16b - eor w21,w21,w5 - eor v29.16b,v23.16b,v20.16b - eor w17,w17,w6 - ushr v3.4s,v24.4s,#24 - eor w19,w19,w7 - ushr v7.4s,v25.4s,#24 - eor w20,w20,w8 - ushr v11.4s,v26.4s,#24 - ror w21,w21,#16 - ushr v15.4s,v27.4s,#24 - ror w17,w17,#16 - ushr v19.4s,v28.4s,#24 - ror w19,w19,#16 - ushr v23.4s,v29.4s,#24 - ror w20,w20,#16 - sli v3.4s,v24.4s,#8 - add w15,w15,w21 - sli v7.4s,v25.4s,#8 - add w16,w16,w17 - sli v11.4s,v26.4s,#8 - add w13,w13,w19 - sli v15.4s,v27.4s,#8 - add w14,w14,w20 - sli v19.4s,v28.4s,#8 - eor w10,w10,w15 - sli v23.4s,v29.4s,#8 - eor w11,w11,w16 - add v2.4s,v2.4s,v3.4s - eor w12,w12,w13 - add v6.4s,v6.4s,v7.4s - eor w9,w9,w14 - add v10.4s,v10.4s,v11.4s - ror w10,w10,#20 - add v14.4s,v14.4s,v15.4s - ror w11,w11,#20 - add v18.4s,v18.4s,v19.4s - ror w12,w12,#20 - add v22.4s,v22.4s,v23.4s - ror w9,w9,#20 - eor v24.16b,v1.16b,v2.16b - add w5,w5,w10 - eor v25.16b,v5.16b,v6.16b - add w6,w6,w11 - eor v26.16b,v9.16b,v10.16b - add w7,w7,w12 - eor v27.16b,v13.16b,v14.16b - add w8,w8,w9 - eor v28.16b,v17.16b,v18.16b - eor w21,w21,w5 - eor v29.16b,v21.16b,v22.16b - eor w17,w17,w6 - ushr v1.4s,v24.4s,#25 - eor w19,w19,w7 - ushr v5.4s,v25.4s,#25 - eor w20,w20,w8 - ushr v9.4s,v26.4s,#25 - ror w21,w21,#24 - ushr v13.4s,v27.4s,#25 - ror w17,w17,#24 - ushr v17.4s,v28.4s,#25 - ror w19,w19,#24 - ushr v21.4s,v29.4s,#25 - ror w20,w20,#24 - sli v1.4s,v24.4s,#7 - add w15,w15,w21 - sli v5.4s,v25.4s,#7 - add w16,w16,w17 - sli v9.4s,v26.4s,#7 - add w13,w13,w19 - sli v13.4s,v27.4s,#7 - add w14,w14,w20 - sli v17.4s,v28.4s,#7 - eor w10,w10,w15 - sli v21.4s,v29.4s,#7 - eor w11,w11,w16 - ext v2.16b,v2.16b,v2.16b,#8 - eor w12,w12,w13 - ext v6.16b,v6.16b,v6.16b,#8 - eor w9,w9,w14 - ext v10.16b,v10.16b,v10.16b,#8 - ror w10,w10,#25 - ext v14.16b,v14.16b,v14.16b,#8 - ror w11,w11,#25 - ext v18.16b,v18.16b,v18.16b,#8 - ror w12,w12,#25 - ext v22.16b,v22.16b,v22.16b,#8 - ror w9,w9,#25 - ext v3.16b,v3.16b,v3.16b,#4 - ext v7.16b,v7.16b,v7.16b,#4 - ext v11.16b,v11.16b,v11.16b,#4 - ext v15.16b,v15.16b,v15.16b,#4 - ext v19.16b,v19.16b,v19.16b,#4 - ext v23.16b,v23.16b,v23.16b,#4 - ext v1.16b,v1.16b,v1.16b,#12 - ext v5.16b,v5.16b,v5.16b,#12 - ext v9.16b,v9.16b,v9.16b,#12 - ext v13.16b,v13.16b,v13.16b,#12 - ext v17.16b,v17.16b,v17.16b,#12 - ext v21.16b,v21.16b,v21.16b,#12 - cbnz x4,Loop_upper_neon - - add w5,w5,w22 // accumulate key block - add x6,x6,x22,lsr#32 - add w7,w7,w23 - add x8,x8,x23,lsr#32 - add w9,w9,w24 - add x10,x10,x24,lsr#32 - add w11,w11,w25 - add x12,x12,x25,lsr#32 - add w13,w13,w26 - add x14,x14,x26,lsr#32 - add w15,w15,w27 - add x16,x16,x27,lsr#32 - add w17,w17,w28 - add x19,x19,x28,lsr#32 - add w20,w20,w30 - add x21,x21,x30,lsr#32 - - add x5,x5,x6,lsl#32 // pack - add x7,x7,x8,lsl#32 - ldp x6,x8,[x1,#0] // load input - add x9,x9,x10,lsl#32 - add x11,x11,x12,lsl#32 - ldp x10,x12,[x1,#16] - add x13,x13,x14,lsl#32 - add x15,x15,x16,lsl#32 - ldp x14,x16,[x1,#32] - add x17,x17,x19,lsl#32 - add x20,x20,x21,lsl#32 - ldp x19,x21,[x1,#48] - add x1,x1,#64 -#ifdef __ARMEB__ - rev x5,x5 - rev x7,x7 - rev x9,x9 - rev x11,x11 - rev x13,x13 - rev x15,x15 - rev x17,x17 - rev x20,x20 -#endif - eor x5,x5,x6 - eor x7,x7,x8 - eor x9,x9,x10 - eor x11,x11,x12 - eor x13,x13,x14 - eor x15,x15,x16 - eor x17,x17,x19 - eor x20,x20,x21 - - stp x5,x7,[x0,#0] // store output - add x28,x28,#1 // increment counter - mov w5,w22 // unpack key block - lsr x6,x22,#32 - stp x9,x11,[x0,#16] - mov w7,w23 - lsr x8,x23,#32 - stp x13,x15,[x0,#32] - mov w9,w24 - lsr x10,x24,#32 - stp x17,x20,[x0,#48] - add x0,x0,#64 - mov w11,w25 - lsr x12,x25,#32 - mov w13,w26 - lsr x14,x26,#32 - mov w15,w27 - lsr x16,x27,#32 - mov w17,w28 - lsr x19,x28,#32 - mov w20,w30 - lsr x21,x30,#32 - - mov x4,#5 -Loop_lower_neon: - sub x4,x4,#1 - add v0.4s,v0.4s,v1.4s - add w5,w5,w9 - add v4.4s,v4.4s,v5.4s - add w6,w6,w10 - add v8.4s,v8.4s,v9.4s - add w7,w7,w11 - add v12.4s,v12.4s,v13.4s - add w8,w8,w12 - add v16.4s,v16.4s,v17.4s - eor w17,w17,w5 - add v20.4s,v20.4s,v21.4s - eor w19,w19,w6 - eor v3.16b,v3.16b,v0.16b - eor w20,w20,w7 - eor v7.16b,v7.16b,v4.16b - eor w21,w21,w8 - eor v11.16b,v11.16b,v8.16b - ror w17,w17,#16 - eor v15.16b,v15.16b,v12.16b - ror w19,w19,#16 - eor v19.16b,v19.16b,v16.16b - ror w20,w20,#16 - eor v23.16b,v23.16b,v20.16b - ror w21,w21,#16 - rev32 v3.8h,v3.8h - add w13,w13,w17 - rev32 v7.8h,v7.8h - add w14,w14,w19 - rev32 v11.8h,v11.8h - add w15,w15,w20 - rev32 v15.8h,v15.8h - add w16,w16,w21 - rev32 v19.8h,v19.8h - eor w9,w9,w13 - rev32 v23.8h,v23.8h - eor w10,w10,w14 - add v2.4s,v2.4s,v3.4s - eor w11,w11,w15 - add v6.4s,v6.4s,v7.4s - eor w12,w12,w16 - add v10.4s,v10.4s,v11.4s - ror w9,w9,#20 - add v14.4s,v14.4s,v15.4s - ror w10,w10,#20 - add v18.4s,v18.4s,v19.4s - ror w11,w11,#20 - add v22.4s,v22.4s,v23.4s - ror w12,w12,#20 - eor v24.16b,v1.16b,v2.16b - add w5,w5,w9 - eor v25.16b,v5.16b,v6.16b - add w6,w6,w10 - eor v26.16b,v9.16b,v10.16b - add w7,w7,w11 - eor v27.16b,v13.16b,v14.16b - add w8,w8,w12 - eor v28.16b,v17.16b,v18.16b - eor w17,w17,w5 - eor v29.16b,v21.16b,v22.16b - eor w19,w19,w6 - ushr v1.4s,v24.4s,#20 - eor w20,w20,w7 - ushr v5.4s,v25.4s,#20 - eor w21,w21,w8 - ushr v9.4s,v26.4s,#20 - ror w17,w17,#24 - ushr v13.4s,v27.4s,#20 - ror w19,w19,#24 - ushr v17.4s,v28.4s,#20 - ror w20,w20,#24 - ushr v21.4s,v29.4s,#20 - ror w21,w21,#24 - sli v1.4s,v24.4s,#12 - add w13,w13,w17 - sli v5.4s,v25.4s,#12 - add w14,w14,w19 - sli v9.4s,v26.4s,#12 - add w15,w15,w20 - sli v13.4s,v27.4s,#12 - add w16,w16,w21 - sli v17.4s,v28.4s,#12 - eor w9,w9,w13 - sli v21.4s,v29.4s,#12 - eor w10,w10,w14 - add v0.4s,v0.4s,v1.4s - eor w11,w11,w15 - add v4.4s,v4.4s,v5.4s - eor w12,w12,w16 - add v8.4s,v8.4s,v9.4s - ror w9,w9,#25 - add v12.4s,v12.4s,v13.4s - ror w10,w10,#25 - add v16.4s,v16.4s,v17.4s - ror w11,w11,#25 - add v20.4s,v20.4s,v21.4s - ror w12,w12,#25 - eor v24.16b,v3.16b,v0.16b - add w5,w5,w10 - eor v25.16b,v7.16b,v4.16b - add w6,w6,w11 - eor v26.16b,v11.16b,v8.16b - add w7,w7,w12 - eor v27.16b,v15.16b,v12.16b - add w8,w8,w9 - eor v28.16b,v19.16b,v16.16b - eor w21,w21,w5 - eor v29.16b,v23.16b,v20.16b - eor w17,w17,w6 - ushr v3.4s,v24.4s,#24 - eor w19,w19,w7 - ushr v7.4s,v25.4s,#24 - eor w20,w20,w8 - ushr v11.4s,v26.4s,#24 - ror w21,w21,#16 - ushr v15.4s,v27.4s,#24 - ror w17,w17,#16 - ushr v19.4s,v28.4s,#24 - ror w19,w19,#16 - ushr v23.4s,v29.4s,#24 - ror w20,w20,#16 - sli v3.4s,v24.4s,#8 - add w15,w15,w21 - sli v7.4s,v25.4s,#8 - add w16,w16,w17 - sli v11.4s,v26.4s,#8 - add w13,w13,w19 - sli v15.4s,v27.4s,#8 - add w14,w14,w20 - sli v19.4s,v28.4s,#8 - eor w10,w10,w15 - sli v23.4s,v29.4s,#8 - eor w11,w11,w16 - add v2.4s,v2.4s,v3.4s - eor w12,w12,w13 - add v6.4s,v6.4s,v7.4s - eor w9,w9,w14 - add v10.4s,v10.4s,v11.4s - ror w10,w10,#20 - add v14.4s,v14.4s,v15.4s - ror w11,w11,#20 - add v18.4s,v18.4s,v19.4s - ror w12,w12,#20 - add v22.4s,v22.4s,v23.4s - ror w9,w9,#20 - eor v24.16b,v1.16b,v2.16b - add w5,w5,w10 - eor v25.16b,v5.16b,v6.16b - add w6,w6,w11 - eor v26.16b,v9.16b,v10.16b - add w7,w7,w12 - eor v27.16b,v13.16b,v14.16b - add w8,w8,w9 - eor v28.16b,v17.16b,v18.16b - eor w21,w21,w5 - eor v29.16b,v21.16b,v22.16b - eor w17,w17,w6 - ushr v1.4s,v24.4s,#25 - eor w19,w19,w7 - ushr v5.4s,v25.4s,#25 - eor w20,w20,w8 - ushr v9.4s,v26.4s,#25 - ror w21,w21,#24 - ushr v13.4s,v27.4s,#25 - ror w17,w17,#24 - ushr v17.4s,v28.4s,#25 - ror w19,w19,#24 - ushr v21.4s,v29.4s,#25 - ror w20,w20,#24 - sli v1.4s,v24.4s,#7 - add w15,w15,w21 - sli v5.4s,v25.4s,#7 - add w16,w16,w17 - sli v9.4s,v26.4s,#7 - add w13,w13,w19 - sli v13.4s,v27.4s,#7 - add w14,w14,w20 - sli v17.4s,v28.4s,#7 - eor w10,w10,w15 - sli v21.4s,v29.4s,#7 - eor w11,w11,w16 - ext v2.16b,v2.16b,v2.16b,#8 - eor w12,w12,w13 - ext v6.16b,v6.16b,v6.16b,#8 - eor w9,w9,w14 - ext v10.16b,v10.16b,v10.16b,#8 - ror w10,w10,#25 - ext v14.16b,v14.16b,v14.16b,#8 - ror w11,w11,#25 - ext v18.16b,v18.16b,v18.16b,#8 - ror w12,w12,#25 - ext v22.16b,v22.16b,v22.16b,#8 - ror w9,w9,#25 - ext v3.16b,v3.16b,v3.16b,#12 - ext v7.16b,v7.16b,v7.16b,#12 - ext v11.16b,v11.16b,v11.16b,#12 - ext v15.16b,v15.16b,v15.16b,#12 - ext v19.16b,v19.16b,v19.16b,#12 - ext v23.16b,v23.16b,v23.16b,#12 - ext v1.16b,v1.16b,v1.16b,#4 - ext v5.16b,v5.16b,v5.16b,#4 - ext v9.16b,v9.16b,v9.16b,#4 - ext v13.16b,v13.16b,v13.16b,#4 - ext v17.16b,v17.16b,v17.16b,#4 - ext v21.16b,v21.16b,v21.16b,#4 - add v0.4s,v0.4s,v1.4s - add w5,w5,w9 - add v4.4s,v4.4s,v5.4s - add w6,w6,w10 - add v8.4s,v8.4s,v9.4s - add w7,w7,w11 - add v12.4s,v12.4s,v13.4s - add w8,w8,w12 - add v16.4s,v16.4s,v17.4s - eor w17,w17,w5 - add v20.4s,v20.4s,v21.4s - eor w19,w19,w6 - eor v3.16b,v3.16b,v0.16b - eor w20,w20,w7 - eor v7.16b,v7.16b,v4.16b - eor w21,w21,w8 - eor v11.16b,v11.16b,v8.16b - ror w17,w17,#16 - eor v15.16b,v15.16b,v12.16b - ror w19,w19,#16 - eor v19.16b,v19.16b,v16.16b - ror w20,w20,#16 - eor v23.16b,v23.16b,v20.16b - ror w21,w21,#16 - rev32 v3.8h,v3.8h - add w13,w13,w17 - rev32 v7.8h,v7.8h - add w14,w14,w19 - rev32 v11.8h,v11.8h - add w15,w15,w20 - rev32 v15.8h,v15.8h - add w16,w16,w21 - rev32 v19.8h,v19.8h - eor w9,w9,w13 - rev32 v23.8h,v23.8h - eor w10,w10,w14 - add v2.4s,v2.4s,v3.4s - eor w11,w11,w15 - add v6.4s,v6.4s,v7.4s - eor w12,w12,w16 - add v10.4s,v10.4s,v11.4s - ror w9,w9,#20 - add v14.4s,v14.4s,v15.4s - ror w10,w10,#20 - add v18.4s,v18.4s,v19.4s - ror w11,w11,#20 - add v22.4s,v22.4s,v23.4s - ror w12,w12,#20 - eor v24.16b,v1.16b,v2.16b - add w5,w5,w9 - eor v25.16b,v5.16b,v6.16b - add w6,w6,w10 - eor v26.16b,v9.16b,v10.16b - add w7,w7,w11 - eor v27.16b,v13.16b,v14.16b - add w8,w8,w12 - eor v28.16b,v17.16b,v18.16b - eor w17,w17,w5 - eor v29.16b,v21.16b,v22.16b - eor w19,w19,w6 - ushr v1.4s,v24.4s,#20 - eor w20,w20,w7 - ushr v5.4s,v25.4s,#20 - eor w21,w21,w8 - ushr v9.4s,v26.4s,#20 - ror w17,w17,#24 - ushr v13.4s,v27.4s,#20 - ror w19,w19,#24 - ushr v17.4s,v28.4s,#20 - ror w20,w20,#24 - ushr v21.4s,v29.4s,#20 - ror w21,w21,#24 - sli v1.4s,v24.4s,#12 - add w13,w13,w17 - sli v5.4s,v25.4s,#12 - add w14,w14,w19 - sli v9.4s,v26.4s,#12 - add w15,w15,w20 - sli v13.4s,v27.4s,#12 - add w16,w16,w21 - sli v17.4s,v28.4s,#12 - eor w9,w9,w13 - sli v21.4s,v29.4s,#12 - eor w10,w10,w14 - add v0.4s,v0.4s,v1.4s - eor w11,w11,w15 - add v4.4s,v4.4s,v5.4s - eor w12,w12,w16 - add v8.4s,v8.4s,v9.4s - ror w9,w9,#25 - add v12.4s,v12.4s,v13.4s - ror w10,w10,#25 - add v16.4s,v16.4s,v17.4s - ror w11,w11,#25 - add v20.4s,v20.4s,v21.4s - ror w12,w12,#25 - eor v24.16b,v3.16b,v0.16b - add w5,w5,w10 - eor v25.16b,v7.16b,v4.16b - add w6,w6,w11 - eor v26.16b,v11.16b,v8.16b - add w7,w7,w12 - eor v27.16b,v15.16b,v12.16b - add w8,w8,w9 - eor v28.16b,v19.16b,v16.16b - eor w21,w21,w5 - eor v29.16b,v23.16b,v20.16b - eor w17,w17,w6 - ushr v3.4s,v24.4s,#24 - eor w19,w19,w7 - ushr v7.4s,v25.4s,#24 - eor w20,w20,w8 - ushr v11.4s,v26.4s,#24 - ror w21,w21,#16 - ushr v15.4s,v27.4s,#24 - ror w17,w17,#16 - ushr v19.4s,v28.4s,#24 - ror w19,w19,#16 - ushr v23.4s,v29.4s,#24 - ror w20,w20,#16 - sli v3.4s,v24.4s,#8 - add w15,w15,w21 - sli v7.4s,v25.4s,#8 - add w16,w16,w17 - sli v11.4s,v26.4s,#8 - add w13,w13,w19 - sli v15.4s,v27.4s,#8 - add w14,w14,w20 - sli v19.4s,v28.4s,#8 - eor w10,w10,w15 - sli v23.4s,v29.4s,#8 - eor w11,w11,w16 - add v2.4s,v2.4s,v3.4s - eor w12,w12,w13 - add v6.4s,v6.4s,v7.4s - eor w9,w9,w14 - add v10.4s,v10.4s,v11.4s - ror w10,w10,#20 - add v14.4s,v14.4s,v15.4s - ror w11,w11,#20 - add v18.4s,v18.4s,v19.4s - ror w12,w12,#20 - add v22.4s,v22.4s,v23.4s - ror w9,w9,#20 - eor v24.16b,v1.16b,v2.16b - add w5,w5,w10 - eor v25.16b,v5.16b,v6.16b - add w6,w6,w11 - eor v26.16b,v9.16b,v10.16b - add w7,w7,w12 - eor v27.16b,v13.16b,v14.16b - add w8,w8,w9 - eor v28.16b,v17.16b,v18.16b - eor w21,w21,w5 - eor v29.16b,v21.16b,v22.16b - eor w17,w17,w6 - ushr v1.4s,v24.4s,#25 - eor w19,w19,w7 - ushr v5.4s,v25.4s,#25 - eor w20,w20,w8 - ushr v9.4s,v26.4s,#25 - ror w21,w21,#24 - ushr v13.4s,v27.4s,#25 - ror w17,w17,#24 - ushr v17.4s,v28.4s,#25 - ror w19,w19,#24 - ushr v21.4s,v29.4s,#25 - ror w20,w20,#24 - sli v1.4s,v24.4s,#7 - add w15,w15,w21 - sli v5.4s,v25.4s,#7 - add w16,w16,w17 - sli v9.4s,v26.4s,#7 - add w13,w13,w19 - sli v13.4s,v27.4s,#7 - add w14,w14,w20 - sli v17.4s,v28.4s,#7 - eor w10,w10,w15 - sli v21.4s,v29.4s,#7 - eor w11,w11,w16 - ext v2.16b,v2.16b,v2.16b,#8 - eor w12,w12,w13 - ext v6.16b,v6.16b,v6.16b,#8 - eor w9,w9,w14 - ext v10.16b,v10.16b,v10.16b,#8 - ror w10,w10,#25 - ext v14.16b,v14.16b,v14.16b,#8 - ror w11,w11,#25 - ext v18.16b,v18.16b,v18.16b,#8 - ror w12,w12,#25 - ext v22.16b,v22.16b,v22.16b,#8 - ror w9,w9,#25 - ext v3.16b,v3.16b,v3.16b,#4 - ext v7.16b,v7.16b,v7.16b,#4 - ext v11.16b,v11.16b,v11.16b,#4 - ext v15.16b,v15.16b,v15.16b,#4 - ext v19.16b,v19.16b,v19.16b,#4 - ext v23.16b,v23.16b,v23.16b,#4 - ext v1.16b,v1.16b,v1.16b,#12 - ext v5.16b,v5.16b,v5.16b,#12 - ext v9.16b,v9.16b,v9.16b,#12 - ext v13.16b,v13.16b,v13.16b,#12 - ext v17.16b,v17.16b,v17.16b,#12 - ext v21.16b,v21.16b,v21.16b,#12 - cbnz x4,Loop_lower_neon - - add w5,w5,w22 // accumulate key block - ldp q24,q25,[sp,#0] - add x6,x6,x22,lsr#32 - ldp q26,q27,[sp,#32] - add w7,w7,w23 - ldp q28,q29,[sp,#64] - add x8,x8,x23,lsr#32 - add v0.4s,v0.4s,v24.4s - add w9,w9,w24 - add v4.4s,v4.4s,v24.4s - add x10,x10,x24,lsr#32 - add v8.4s,v8.4s,v24.4s - add w11,w11,w25 - add v12.4s,v12.4s,v24.4s - add x12,x12,x25,lsr#32 - add v16.4s,v16.4s,v24.4s - add w13,w13,w26 - add v20.4s,v20.4s,v24.4s - add x14,x14,x26,lsr#32 - add v2.4s,v2.4s,v26.4s - add w15,w15,w27 - add v6.4s,v6.4s,v26.4s - add x16,x16,x27,lsr#32 - add v10.4s,v10.4s,v26.4s - add w17,w17,w28 - add v14.4s,v14.4s,v26.4s - add x19,x19,x28,lsr#32 - add v18.4s,v18.4s,v26.4s - add w20,w20,w30 - add v22.4s,v22.4s,v26.4s - add x21,x21,x30,lsr#32 - add v19.4s,v19.4s,v31.4s // +4 - add x5,x5,x6,lsl#32 // pack - add v23.4s,v23.4s,v31.4s // +4 - add x7,x7,x8,lsl#32 - add v3.4s,v3.4s,v27.4s - ldp x6,x8,[x1,#0] // load input - add v7.4s,v7.4s,v28.4s - add x9,x9,x10,lsl#32 - add v11.4s,v11.4s,v29.4s - add x11,x11,x12,lsl#32 - add v15.4s,v15.4s,v30.4s - ldp x10,x12,[x1,#16] - add v19.4s,v19.4s,v27.4s - add x13,x13,x14,lsl#32 - add v23.4s,v23.4s,v28.4s - add x15,x15,x16,lsl#32 - add v1.4s,v1.4s,v25.4s - ldp x14,x16,[x1,#32] - add v5.4s,v5.4s,v25.4s - add x17,x17,x19,lsl#32 - add v9.4s,v9.4s,v25.4s - add x20,x20,x21,lsl#32 - add v13.4s,v13.4s,v25.4s - ldp x19,x21,[x1,#48] - add v17.4s,v17.4s,v25.4s - add x1,x1,#64 - add v21.4s,v21.4s,v25.4s - -#ifdef __ARMEB__ - rev x5,x5 - rev x7,x7 - rev x9,x9 - rev x11,x11 - rev x13,x13 - rev x15,x15 - rev x17,x17 - rev x20,x20 -#endif - ld1 {v24.16b,v25.16b,v26.16b,v27.16b},[x1],#64 - eor x5,x5,x6 - eor x7,x7,x8 - eor x9,x9,x10 - eor x11,x11,x12 - eor x13,x13,x14 - eor v0.16b,v0.16b,v24.16b - eor x15,x15,x16 - eor v1.16b,v1.16b,v25.16b - eor x17,x17,x19 - eor v2.16b,v2.16b,v26.16b - eor x20,x20,x21 - eor v3.16b,v3.16b,v27.16b - ld1 {v24.16b,v25.16b,v26.16b,v27.16b},[x1],#64 - - stp x5,x7,[x0,#0] // store output - add x28,x28,#7 // increment counter - stp x9,x11,[x0,#16] - stp x13,x15,[x0,#32] - stp x17,x20,[x0,#48] - add x0,x0,#64 - st1 {v0.16b,v1.16b,v2.16b,v3.16b},[x0],#64 - - ld1 {v0.16b,v1.16b,v2.16b,v3.16b},[x1],#64 - eor v4.16b,v4.16b,v24.16b - eor v5.16b,v5.16b,v25.16b - eor v6.16b,v6.16b,v26.16b - eor v7.16b,v7.16b,v27.16b - st1 {v4.16b,v5.16b,v6.16b,v7.16b},[x0],#64 - - ld1 {v4.16b,v5.16b,v6.16b,v7.16b},[x1],#64 - eor v8.16b,v8.16b,v0.16b - ldp q24,q25,[sp,#0] - eor v9.16b,v9.16b,v1.16b - ldp q26,q27,[sp,#32] - eor v10.16b,v10.16b,v2.16b - eor v11.16b,v11.16b,v3.16b - st1 {v8.16b,v9.16b,v10.16b,v11.16b},[x0],#64 - - ld1 {v8.16b,v9.16b,v10.16b,v11.16b},[x1],#64 - eor v12.16b,v12.16b,v4.16b - eor v13.16b,v13.16b,v5.16b - eor v14.16b,v14.16b,v6.16b - eor v15.16b,v15.16b,v7.16b - st1 {v12.16b,v13.16b,v14.16b,v15.16b},[x0],#64 - - ld1 {v12.16b,v13.16b,v14.16b,v15.16b},[x1],#64 - eor v16.16b,v16.16b,v8.16b - eor v17.16b,v17.16b,v9.16b - eor v18.16b,v18.16b,v10.16b - eor v19.16b,v19.16b,v11.16b - st1 {v16.16b,v17.16b,v18.16b,v19.16b},[x0],#64 - - shl v0.4s,v31.4s,#1 // 4 -> 8 - eor v20.16b,v20.16b,v12.16b - eor v21.16b,v21.16b,v13.16b - eor v22.16b,v22.16b,v14.16b - eor v23.16b,v23.16b,v15.16b - st1 {v20.16b,v21.16b,v22.16b,v23.16b},[x0],#64 - - add v27.4s,v27.4s,v0.4s // += 8 - add v28.4s,v28.4s,v0.4s - add v29.4s,v29.4s,v0.4s - add v30.4s,v30.4s,v0.4s - - b.hs Loop_outer_512_neon - - adds x2,x2,#512 - ushr v0.4s,v31.4s,#2 // 4 -> 1 - - ldp d8,d9,[sp,#128+0] // meet ABI requirements - ldp d10,d11,[sp,#128+16] - ldp d12,d13,[sp,#128+32] - ldp d14,d15,[sp,#128+48] - - stp q24,q31,[sp,#0] // wipe off-load area - stp q24,q31,[sp,#32] - stp q24,q31,[sp,#64] - - b.eq Ldone_512_neon - - cmp x2,#192 - sub v27.4s,v27.4s,v0.4s // -= 1 - sub v28.4s,v28.4s,v0.4s - sub v29.4s,v29.4s,v0.4s - add sp,sp,#128 - b.hs Loop_outer_neon - - eor v25.16b,v25.16b,v25.16b - eor v26.16b,v26.16b,v26.16b - eor v27.16b,v27.16b,v27.16b - eor v28.16b,v28.16b,v28.16b - eor v29.16b,v29.16b,v29.16b - eor v30.16b,v30.16b,v30.16b - b Loop_outer - -Ldone_512_neon: - ldp x19,x20,[x29,#16] - add sp,sp,#128+64 - ldp x21,x22,[x29,#32] - ldp x23,x24,[x29,#48] - ldp x25,x26,[x29,#64] - ldp x27,x28,[x29,#80] - ldp x29,x30,[sp],#96 - AARCH64_VALIDATE_LINK_REGISTER - ret - -#endif // !OPENSSL_NO_ASM diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/chacha-armv8-linux64.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/chacha-armv8-linux64.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/chacha-armv8-linux64.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/chacha-armv8-linux64.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,1992 +0,0 @@ -// This file is generated from a similarly-named Perl script in the BoringSSL -// source tree. Do not edit by hand. - -#if !defined(__has_feature) -#define __has_feature(x) 0 -#endif -#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) -#define OPENSSL_NO_ASM -#endif - -#if !defined(OPENSSL_NO_ASM) -#if defined(__aarch64__) -#include - - -.hidden GFp_armcap_P - -.section .rodata - -.align 5 -.Lsigma: -.quad 0x3320646e61707865,0x6b20657479622d32 // endian-neutral -.Lone: -.long 1,0,0,0 -.byte 67,104,97,67,104,97,50,48,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 -.align 2 - -.text - -.globl GFp_ChaCha20_ctr32 -.hidden GFp_ChaCha20_ctr32 -.type GFp_ChaCha20_ctr32,%function -.align 5 -GFp_ChaCha20_ctr32: - AARCH64_VALID_CALL_TARGET - cbz x2,.Labort -#if __has_feature(hwaddress_sanitizer) && __clang_major__ >= 10 - adrp x5,:pg_hi21_nc:GFp_armcap_P -#else - adrp x5,GFp_armcap_P -#endif - cmp x2,#192 - b.lo .Lshort - ldr w17,[x5,:lo12:GFp_armcap_P] - tst w17,#ARMV7_NEON - b.ne ChaCha20_neon - -.Lshort: - AARCH64_SIGN_LINK_REGISTER - stp x29,x30,[sp,#-96]! - add x29,sp,#0 - - adrp x5,.Lsigma - add x5,x5,:lo12:.Lsigma - stp x19,x20,[sp,#16] - stp x21,x22,[sp,#32] - stp x23,x24,[sp,#48] - stp x25,x26,[sp,#64] - stp x27,x28,[sp,#80] - sub sp,sp,#64 - - ldp x22,x23,[x5] // load sigma - ldp x24,x25,[x3] // load key - ldp x26,x27,[x3,#16] - ldp x28,x30,[x4] // load counter -#ifdef __ARMEB__ - ror x24,x24,#32 - ror x25,x25,#32 - ror x26,x26,#32 - ror x27,x27,#32 - ror x28,x28,#32 - ror x30,x30,#32 -#endif - -.Loop_outer: - mov w5,w22 // unpack key block - lsr x6,x22,#32 - mov w7,w23 - lsr x8,x23,#32 - mov w9,w24 - lsr x10,x24,#32 - mov w11,w25 - lsr x12,x25,#32 - mov w13,w26 - lsr x14,x26,#32 - mov w15,w27 - lsr x16,x27,#32 - mov w17,w28 - lsr x19,x28,#32 - mov w20,w30 - lsr x21,x30,#32 - - mov x4,#10 - subs x2,x2,#64 -.Loop: - sub x4,x4,#1 - add w5,w5,w9 - add w6,w6,w10 - add w7,w7,w11 - add w8,w8,w12 - eor w17,w17,w5 - eor w19,w19,w6 - eor w20,w20,w7 - eor w21,w21,w8 - ror w17,w17,#16 - ror w19,w19,#16 - ror w20,w20,#16 - ror w21,w21,#16 - add w13,w13,w17 - add w14,w14,w19 - add w15,w15,w20 - add w16,w16,w21 - eor w9,w9,w13 - eor w10,w10,w14 - eor w11,w11,w15 - eor w12,w12,w16 - ror w9,w9,#20 - ror w10,w10,#20 - ror w11,w11,#20 - ror w12,w12,#20 - add w5,w5,w9 - add w6,w6,w10 - add w7,w7,w11 - add w8,w8,w12 - eor w17,w17,w5 - eor w19,w19,w6 - eor w20,w20,w7 - eor w21,w21,w8 - ror w17,w17,#24 - ror w19,w19,#24 - ror w20,w20,#24 - ror w21,w21,#24 - add w13,w13,w17 - add w14,w14,w19 - add w15,w15,w20 - add w16,w16,w21 - eor w9,w9,w13 - eor w10,w10,w14 - eor w11,w11,w15 - eor w12,w12,w16 - ror w9,w9,#25 - ror w10,w10,#25 - ror w11,w11,#25 - ror w12,w12,#25 - add w5,w5,w10 - add w6,w6,w11 - add w7,w7,w12 - add w8,w8,w9 - eor w21,w21,w5 - eor w17,w17,w6 - eor w19,w19,w7 - eor w20,w20,w8 - ror w21,w21,#16 - ror w17,w17,#16 - ror w19,w19,#16 - ror w20,w20,#16 - add w15,w15,w21 - add w16,w16,w17 - add w13,w13,w19 - add w14,w14,w20 - eor w10,w10,w15 - eor w11,w11,w16 - eor w12,w12,w13 - eor w9,w9,w14 - ror w10,w10,#20 - ror w11,w11,#20 - ror w12,w12,#20 - ror w9,w9,#20 - add w5,w5,w10 - add w6,w6,w11 - add w7,w7,w12 - add w8,w8,w9 - eor w21,w21,w5 - eor w17,w17,w6 - eor w19,w19,w7 - eor w20,w20,w8 - ror w21,w21,#24 - ror w17,w17,#24 - ror w19,w19,#24 - ror w20,w20,#24 - add w15,w15,w21 - add w16,w16,w17 - add w13,w13,w19 - add w14,w14,w20 - eor w10,w10,w15 - eor w11,w11,w16 - eor w12,w12,w13 - eor w9,w9,w14 - ror w10,w10,#25 - ror w11,w11,#25 - ror w12,w12,#25 - ror w9,w9,#25 - cbnz x4,.Loop - - add w5,w5,w22 // accumulate key block - add x6,x6,x22,lsr#32 - add w7,w7,w23 - add x8,x8,x23,lsr#32 - add w9,w9,w24 - add x10,x10,x24,lsr#32 - add w11,w11,w25 - add x12,x12,x25,lsr#32 - add w13,w13,w26 - add x14,x14,x26,lsr#32 - add w15,w15,w27 - add x16,x16,x27,lsr#32 - add w17,w17,w28 - add x19,x19,x28,lsr#32 - add w20,w20,w30 - add x21,x21,x30,lsr#32 - - b.lo .Ltail - - add x5,x5,x6,lsl#32 // pack - add x7,x7,x8,lsl#32 - ldp x6,x8,[x1,#0] // load input - add x9,x9,x10,lsl#32 - add x11,x11,x12,lsl#32 - ldp x10,x12,[x1,#16] - add x13,x13,x14,lsl#32 - add x15,x15,x16,lsl#32 - ldp x14,x16,[x1,#32] - add x17,x17,x19,lsl#32 - add x20,x20,x21,lsl#32 - ldp x19,x21,[x1,#48] - add x1,x1,#64 -#ifdef __ARMEB__ - rev x5,x5 - rev x7,x7 - rev x9,x9 - rev x11,x11 - rev x13,x13 - rev x15,x15 - rev x17,x17 - rev x20,x20 -#endif - eor x5,x5,x6 - eor x7,x7,x8 - eor x9,x9,x10 - eor x11,x11,x12 - eor x13,x13,x14 - eor x15,x15,x16 - eor x17,x17,x19 - eor x20,x20,x21 - - stp x5,x7,[x0,#0] // store output - add x28,x28,#1 // increment counter - stp x9,x11,[x0,#16] - stp x13,x15,[x0,#32] - stp x17,x20,[x0,#48] - add x0,x0,#64 - - b.hi .Loop_outer - - ldp x19,x20,[x29,#16] - add sp,sp,#64 - ldp x21,x22,[x29,#32] - ldp x23,x24,[x29,#48] - ldp x25,x26,[x29,#64] - ldp x27,x28,[x29,#80] - ldp x29,x30,[sp],#96 - AARCH64_VALIDATE_LINK_REGISTER -.Labort: - ret - -.align 4 -.Ltail: - add x2,x2,#64 -.Less_than_64: - sub x0,x0,#1 - add x1,x1,x2 - add x0,x0,x2 - add x4,sp,x2 - neg x2,x2 - - add x5,x5,x6,lsl#32 // pack - add x7,x7,x8,lsl#32 - add x9,x9,x10,lsl#32 - add x11,x11,x12,lsl#32 - add x13,x13,x14,lsl#32 - add x15,x15,x16,lsl#32 - add x17,x17,x19,lsl#32 - add x20,x20,x21,lsl#32 -#ifdef __ARMEB__ - rev x5,x5 - rev x7,x7 - rev x9,x9 - rev x11,x11 - rev x13,x13 - rev x15,x15 - rev x17,x17 - rev x20,x20 -#endif - stp x5,x7,[sp,#0] - stp x9,x11,[sp,#16] - stp x13,x15,[sp,#32] - stp x17,x20,[sp,#48] - -.Loop_tail: - ldrb w10,[x1,x2] - ldrb w11,[x4,x2] - add x2,x2,#1 - eor w10,w10,w11 - strb w10,[x0,x2] - cbnz x2,.Loop_tail - - stp xzr,xzr,[sp,#0] - stp xzr,xzr,[sp,#16] - stp xzr,xzr,[sp,#32] - stp xzr,xzr,[sp,#48] - - ldp x19,x20,[x29,#16] - add sp,sp,#64 - ldp x21,x22,[x29,#32] - ldp x23,x24,[x29,#48] - ldp x25,x26,[x29,#64] - ldp x27,x28,[x29,#80] - ldp x29,x30,[sp],#96 - AARCH64_VALIDATE_LINK_REGISTER - ret -.size GFp_ChaCha20_ctr32,.-GFp_ChaCha20_ctr32 - -.type ChaCha20_neon,%function -.align 5 -ChaCha20_neon: - AARCH64_SIGN_LINK_REGISTER - stp x29,x30,[sp,#-96]! - add x29,sp,#0 - - adrp x5,.Lsigma - add x5,x5,:lo12:.Lsigma - stp x19,x20,[sp,#16] - stp x21,x22,[sp,#32] - stp x23,x24,[sp,#48] - stp x25,x26,[sp,#64] - stp x27,x28,[sp,#80] - cmp x2,#512 - b.hs .L512_or_more_neon - - sub sp,sp,#64 - - ldp x22,x23,[x5] // load sigma - ld1 {v24.4s},[x5],#16 - ldp x24,x25,[x3] // load key - ldp x26,x27,[x3,#16] - ld1 {v25.4s,v26.4s},[x3] - ldp x28,x30,[x4] // load counter - ld1 {v27.4s},[x4] - ld1 {v31.4s},[x5] -#ifdef __ARMEB__ - rev64 v24.4s,v24.4s - ror x24,x24,#32 - ror x25,x25,#32 - ror x26,x26,#32 - ror x27,x27,#32 - ror x28,x28,#32 - ror x30,x30,#32 -#endif - add v27.4s,v27.4s,v31.4s // += 1 - add v28.4s,v27.4s,v31.4s - add v29.4s,v28.4s,v31.4s - shl v31.4s,v31.4s,#2 // 1 -> 4 - -.Loop_outer_neon: - mov w5,w22 // unpack key block - lsr x6,x22,#32 - mov v0.16b,v24.16b - mov w7,w23 - lsr x8,x23,#32 - mov v4.16b,v24.16b - mov w9,w24 - lsr x10,x24,#32 - mov v16.16b,v24.16b - mov w11,w25 - mov v1.16b,v25.16b - lsr x12,x25,#32 - mov v5.16b,v25.16b - mov w13,w26 - mov v17.16b,v25.16b - lsr x14,x26,#32 - mov v3.16b,v27.16b - mov w15,w27 - mov v7.16b,v28.16b - lsr x16,x27,#32 - mov v19.16b,v29.16b - mov w17,w28 - mov v2.16b,v26.16b - lsr x19,x28,#32 - mov v6.16b,v26.16b - mov w20,w30 - mov v18.16b,v26.16b - lsr x21,x30,#32 - - mov x4,#10 - subs x2,x2,#256 -.Loop_neon: - sub x4,x4,#1 - add v0.4s,v0.4s,v1.4s - add w5,w5,w9 - add v4.4s,v4.4s,v5.4s - add w6,w6,w10 - add v16.4s,v16.4s,v17.4s - add w7,w7,w11 - eor v3.16b,v3.16b,v0.16b - add w8,w8,w12 - eor v7.16b,v7.16b,v4.16b - eor w17,w17,w5 - eor v19.16b,v19.16b,v16.16b - eor w19,w19,w6 - rev32 v3.8h,v3.8h - eor w20,w20,w7 - rev32 v7.8h,v7.8h - eor w21,w21,w8 - rev32 v19.8h,v19.8h - ror w17,w17,#16 - add v2.4s,v2.4s,v3.4s - ror w19,w19,#16 - add v6.4s,v6.4s,v7.4s - ror w20,w20,#16 - add v18.4s,v18.4s,v19.4s - ror w21,w21,#16 - eor v20.16b,v1.16b,v2.16b - add w13,w13,w17 - eor v21.16b,v5.16b,v6.16b - add w14,w14,w19 - eor v22.16b,v17.16b,v18.16b - add w15,w15,w20 - ushr v1.4s,v20.4s,#20 - add w16,w16,w21 - ushr v5.4s,v21.4s,#20 - eor w9,w9,w13 - ushr v17.4s,v22.4s,#20 - eor w10,w10,w14 - sli v1.4s,v20.4s,#12 - eor w11,w11,w15 - sli v5.4s,v21.4s,#12 - eor w12,w12,w16 - sli v17.4s,v22.4s,#12 - ror w9,w9,#20 - add v0.4s,v0.4s,v1.4s - ror w10,w10,#20 - add v4.4s,v4.4s,v5.4s - ror w11,w11,#20 - add v16.4s,v16.4s,v17.4s - ror w12,w12,#20 - eor v20.16b,v3.16b,v0.16b - add w5,w5,w9 - eor v21.16b,v7.16b,v4.16b - add w6,w6,w10 - eor v22.16b,v19.16b,v16.16b - add w7,w7,w11 - ushr v3.4s,v20.4s,#24 - add w8,w8,w12 - ushr v7.4s,v21.4s,#24 - eor w17,w17,w5 - ushr v19.4s,v22.4s,#24 - eor w19,w19,w6 - sli v3.4s,v20.4s,#8 - eor w20,w20,w7 - sli v7.4s,v21.4s,#8 - eor w21,w21,w8 - sli v19.4s,v22.4s,#8 - ror w17,w17,#24 - add v2.4s,v2.4s,v3.4s - ror w19,w19,#24 - add v6.4s,v6.4s,v7.4s - ror w20,w20,#24 - add v18.4s,v18.4s,v19.4s - ror w21,w21,#24 - eor v20.16b,v1.16b,v2.16b - add w13,w13,w17 - eor v21.16b,v5.16b,v6.16b - add w14,w14,w19 - eor v22.16b,v17.16b,v18.16b - add w15,w15,w20 - ushr v1.4s,v20.4s,#25 - add w16,w16,w21 - ushr v5.4s,v21.4s,#25 - eor w9,w9,w13 - ushr v17.4s,v22.4s,#25 - eor w10,w10,w14 - sli v1.4s,v20.4s,#7 - eor w11,w11,w15 - sli v5.4s,v21.4s,#7 - eor w12,w12,w16 - sli v17.4s,v22.4s,#7 - ror w9,w9,#25 - ext v2.16b,v2.16b,v2.16b,#8 - ror w10,w10,#25 - ext v6.16b,v6.16b,v6.16b,#8 - ror w11,w11,#25 - ext v18.16b,v18.16b,v18.16b,#8 - ror w12,w12,#25 - ext v3.16b,v3.16b,v3.16b,#12 - ext v7.16b,v7.16b,v7.16b,#12 - ext v19.16b,v19.16b,v19.16b,#12 - ext v1.16b,v1.16b,v1.16b,#4 - ext v5.16b,v5.16b,v5.16b,#4 - ext v17.16b,v17.16b,v17.16b,#4 - add v0.4s,v0.4s,v1.4s - add w5,w5,w10 - add v4.4s,v4.4s,v5.4s - add w6,w6,w11 - add v16.4s,v16.4s,v17.4s - add w7,w7,w12 - eor v3.16b,v3.16b,v0.16b - add w8,w8,w9 - eor v7.16b,v7.16b,v4.16b - eor w21,w21,w5 - eor v19.16b,v19.16b,v16.16b - eor w17,w17,w6 - rev32 v3.8h,v3.8h - eor w19,w19,w7 - rev32 v7.8h,v7.8h - eor w20,w20,w8 - rev32 v19.8h,v19.8h - ror w21,w21,#16 - add v2.4s,v2.4s,v3.4s - ror w17,w17,#16 - add v6.4s,v6.4s,v7.4s - ror w19,w19,#16 - add v18.4s,v18.4s,v19.4s - ror w20,w20,#16 - eor v20.16b,v1.16b,v2.16b - add w15,w15,w21 - eor v21.16b,v5.16b,v6.16b - add w16,w16,w17 - eor v22.16b,v17.16b,v18.16b - add w13,w13,w19 - ushr v1.4s,v20.4s,#20 - add w14,w14,w20 - ushr v5.4s,v21.4s,#20 - eor w10,w10,w15 - ushr v17.4s,v22.4s,#20 - eor w11,w11,w16 - sli v1.4s,v20.4s,#12 - eor w12,w12,w13 - sli v5.4s,v21.4s,#12 - eor w9,w9,w14 - sli v17.4s,v22.4s,#12 - ror w10,w10,#20 - add v0.4s,v0.4s,v1.4s - ror w11,w11,#20 - add v4.4s,v4.4s,v5.4s - ror w12,w12,#20 - add v16.4s,v16.4s,v17.4s - ror w9,w9,#20 - eor v20.16b,v3.16b,v0.16b - add w5,w5,w10 - eor v21.16b,v7.16b,v4.16b - add w6,w6,w11 - eor v22.16b,v19.16b,v16.16b - add w7,w7,w12 - ushr v3.4s,v20.4s,#24 - add w8,w8,w9 - ushr v7.4s,v21.4s,#24 - eor w21,w21,w5 - ushr v19.4s,v22.4s,#24 - eor w17,w17,w6 - sli v3.4s,v20.4s,#8 - eor w19,w19,w7 - sli v7.4s,v21.4s,#8 - eor w20,w20,w8 - sli v19.4s,v22.4s,#8 - ror w21,w21,#24 - add v2.4s,v2.4s,v3.4s - ror w17,w17,#24 - add v6.4s,v6.4s,v7.4s - ror w19,w19,#24 - add v18.4s,v18.4s,v19.4s - ror w20,w20,#24 - eor v20.16b,v1.16b,v2.16b - add w15,w15,w21 - eor v21.16b,v5.16b,v6.16b - add w16,w16,w17 - eor v22.16b,v17.16b,v18.16b - add w13,w13,w19 - ushr v1.4s,v20.4s,#25 - add w14,w14,w20 - ushr v5.4s,v21.4s,#25 - eor w10,w10,w15 - ushr v17.4s,v22.4s,#25 - eor w11,w11,w16 - sli v1.4s,v20.4s,#7 - eor w12,w12,w13 - sli v5.4s,v21.4s,#7 - eor w9,w9,w14 - sli v17.4s,v22.4s,#7 - ror w10,w10,#25 - ext v2.16b,v2.16b,v2.16b,#8 - ror w11,w11,#25 - ext v6.16b,v6.16b,v6.16b,#8 - ror w12,w12,#25 - ext v18.16b,v18.16b,v18.16b,#8 - ror w9,w9,#25 - ext v3.16b,v3.16b,v3.16b,#4 - ext v7.16b,v7.16b,v7.16b,#4 - ext v19.16b,v19.16b,v19.16b,#4 - ext v1.16b,v1.16b,v1.16b,#12 - ext v5.16b,v5.16b,v5.16b,#12 - ext v17.16b,v17.16b,v17.16b,#12 - cbnz x4,.Loop_neon - - add w5,w5,w22 // accumulate key block - add v0.4s,v0.4s,v24.4s - add x6,x6,x22,lsr#32 - add v4.4s,v4.4s,v24.4s - add w7,w7,w23 - add v16.4s,v16.4s,v24.4s - add x8,x8,x23,lsr#32 - add v2.4s,v2.4s,v26.4s - add w9,w9,w24 - add v6.4s,v6.4s,v26.4s - add x10,x10,x24,lsr#32 - add v18.4s,v18.4s,v26.4s - add w11,w11,w25 - add v3.4s,v3.4s,v27.4s - add x12,x12,x25,lsr#32 - add w13,w13,w26 - add v7.4s,v7.4s,v28.4s - add x14,x14,x26,lsr#32 - add w15,w15,w27 - add v19.4s,v19.4s,v29.4s - add x16,x16,x27,lsr#32 - add w17,w17,w28 - add v1.4s,v1.4s,v25.4s - add x19,x19,x28,lsr#32 - add w20,w20,w30 - add v5.4s,v5.4s,v25.4s - add x21,x21,x30,lsr#32 - add v17.4s,v17.4s,v25.4s - - b.lo .Ltail_neon - - add x5,x5,x6,lsl#32 // pack - add x7,x7,x8,lsl#32 - ldp x6,x8,[x1,#0] // load input - add x9,x9,x10,lsl#32 - add x11,x11,x12,lsl#32 - ldp x10,x12,[x1,#16] - add x13,x13,x14,lsl#32 - add x15,x15,x16,lsl#32 - ldp x14,x16,[x1,#32] - add x17,x17,x19,lsl#32 - add x20,x20,x21,lsl#32 - ldp x19,x21,[x1,#48] - add x1,x1,#64 -#ifdef __ARMEB__ - rev x5,x5 - rev x7,x7 - rev x9,x9 - rev x11,x11 - rev x13,x13 - rev x15,x15 - rev x17,x17 - rev x20,x20 -#endif - ld1 {v20.16b,v21.16b,v22.16b,v23.16b},[x1],#64 - eor x5,x5,x6 - eor x7,x7,x8 - eor x9,x9,x10 - eor x11,x11,x12 - eor x13,x13,x14 - eor v0.16b,v0.16b,v20.16b - eor x15,x15,x16 - eor v1.16b,v1.16b,v21.16b - eor x17,x17,x19 - eor v2.16b,v2.16b,v22.16b - eor x20,x20,x21 - eor v3.16b,v3.16b,v23.16b - ld1 {v20.16b,v21.16b,v22.16b,v23.16b},[x1],#64 - - stp x5,x7,[x0,#0] // store output - add x28,x28,#4 // increment counter - stp x9,x11,[x0,#16] - add v27.4s,v27.4s,v31.4s // += 4 - stp x13,x15,[x0,#32] - add v28.4s,v28.4s,v31.4s - stp x17,x20,[x0,#48] - add v29.4s,v29.4s,v31.4s - add x0,x0,#64 - - st1 {v0.16b,v1.16b,v2.16b,v3.16b},[x0],#64 - ld1 {v0.16b,v1.16b,v2.16b,v3.16b},[x1],#64 - - eor v4.16b,v4.16b,v20.16b - eor v5.16b,v5.16b,v21.16b - eor v6.16b,v6.16b,v22.16b - eor v7.16b,v7.16b,v23.16b - st1 {v4.16b,v5.16b,v6.16b,v7.16b},[x0],#64 - - eor v16.16b,v16.16b,v0.16b - eor v17.16b,v17.16b,v1.16b - eor v18.16b,v18.16b,v2.16b - eor v19.16b,v19.16b,v3.16b - st1 {v16.16b,v17.16b,v18.16b,v19.16b},[x0],#64 - - b.hi .Loop_outer_neon - - ldp x19,x20,[x29,#16] - add sp,sp,#64 - ldp x21,x22,[x29,#32] - ldp x23,x24,[x29,#48] - ldp x25,x26,[x29,#64] - ldp x27,x28,[x29,#80] - ldp x29,x30,[sp],#96 - AARCH64_VALIDATE_LINK_REGISTER - ret - -.Ltail_neon: - add x2,x2,#256 - cmp x2,#64 - b.lo .Less_than_64 - - add x5,x5,x6,lsl#32 // pack - add x7,x7,x8,lsl#32 - ldp x6,x8,[x1,#0] // load input - add x9,x9,x10,lsl#32 - add x11,x11,x12,lsl#32 - ldp x10,x12,[x1,#16] - add x13,x13,x14,lsl#32 - add x15,x15,x16,lsl#32 - ldp x14,x16,[x1,#32] - add x17,x17,x19,lsl#32 - add x20,x20,x21,lsl#32 - ldp x19,x21,[x1,#48] - add x1,x1,#64 -#ifdef __ARMEB__ - rev x5,x5 - rev x7,x7 - rev x9,x9 - rev x11,x11 - rev x13,x13 - rev x15,x15 - rev x17,x17 - rev x20,x20 -#endif - eor x5,x5,x6 - eor x7,x7,x8 - eor x9,x9,x10 - eor x11,x11,x12 - eor x13,x13,x14 - eor x15,x15,x16 - eor x17,x17,x19 - eor x20,x20,x21 - - stp x5,x7,[x0,#0] // store output - add x28,x28,#4 // increment counter - stp x9,x11,[x0,#16] - stp x13,x15,[x0,#32] - stp x17,x20,[x0,#48] - add x0,x0,#64 - b.eq .Ldone_neon - sub x2,x2,#64 - cmp x2,#64 - b.lo .Less_than_128 - - ld1 {v20.16b,v21.16b,v22.16b,v23.16b},[x1],#64 - eor v0.16b,v0.16b,v20.16b - eor v1.16b,v1.16b,v21.16b - eor v2.16b,v2.16b,v22.16b - eor v3.16b,v3.16b,v23.16b - st1 {v0.16b,v1.16b,v2.16b,v3.16b},[x0],#64 - b.eq .Ldone_neon - sub x2,x2,#64 - cmp x2,#64 - b.lo .Less_than_192 - - ld1 {v20.16b,v21.16b,v22.16b,v23.16b},[x1],#64 - eor v4.16b,v4.16b,v20.16b - eor v5.16b,v5.16b,v21.16b - eor v6.16b,v6.16b,v22.16b - eor v7.16b,v7.16b,v23.16b - st1 {v4.16b,v5.16b,v6.16b,v7.16b},[x0],#64 - b.eq .Ldone_neon - sub x2,x2,#64 - - st1 {v16.16b,v17.16b,v18.16b,v19.16b},[sp] - b .Last_neon - -.Less_than_128: - st1 {v0.16b,v1.16b,v2.16b,v3.16b},[sp] - b .Last_neon -.Less_than_192: - st1 {v4.16b,v5.16b,v6.16b,v7.16b},[sp] - b .Last_neon - -.align 4 -.Last_neon: - sub x0,x0,#1 - add x1,x1,x2 - add x0,x0,x2 - add x4,sp,x2 - neg x2,x2 - -.Loop_tail_neon: - ldrb w10,[x1,x2] - ldrb w11,[x4,x2] - add x2,x2,#1 - eor w10,w10,w11 - strb w10,[x0,x2] - cbnz x2,.Loop_tail_neon - - stp xzr,xzr,[sp,#0] - stp xzr,xzr,[sp,#16] - stp xzr,xzr,[sp,#32] - stp xzr,xzr,[sp,#48] - -.Ldone_neon: - ldp x19,x20,[x29,#16] - add sp,sp,#64 - ldp x21,x22,[x29,#32] - ldp x23,x24,[x29,#48] - ldp x25,x26,[x29,#64] - ldp x27,x28,[x29,#80] - ldp x29,x30,[sp],#96 - AARCH64_VALIDATE_LINK_REGISTER - ret -.size ChaCha20_neon,.-ChaCha20_neon -.type ChaCha20_512_neon,%function -.align 5 -ChaCha20_512_neon: - AARCH64_SIGN_LINK_REGISTER - stp x29,x30,[sp,#-96]! - add x29,sp,#0 - - adrp x5,.Lsigma - add x5,x5,:lo12:.Lsigma - stp x19,x20,[sp,#16] - stp x21,x22,[sp,#32] - stp x23,x24,[sp,#48] - stp x25,x26,[sp,#64] - stp x27,x28,[sp,#80] - -.L512_or_more_neon: - sub sp,sp,#128+64 - - ldp x22,x23,[x5] // load sigma - ld1 {v24.4s},[x5],#16 - ldp x24,x25,[x3] // load key - ldp x26,x27,[x3,#16] - ld1 {v25.4s,v26.4s},[x3] - ldp x28,x30,[x4] // load counter - ld1 {v27.4s},[x4] - ld1 {v31.4s},[x5] -#ifdef __ARMEB__ - rev64 v24.4s,v24.4s - ror x24,x24,#32 - ror x25,x25,#32 - ror x26,x26,#32 - ror x27,x27,#32 - ror x28,x28,#32 - ror x30,x30,#32 -#endif - add v27.4s,v27.4s,v31.4s // += 1 - stp q24,q25,[sp,#0] // off-load key block, invariant part - add v27.4s,v27.4s,v31.4s // not typo - str q26,[sp,#32] - add v28.4s,v27.4s,v31.4s - add v29.4s,v28.4s,v31.4s - add v30.4s,v29.4s,v31.4s - shl v31.4s,v31.4s,#2 // 1 -> 4 - - stp d8,d9,[sp,#128+0] // meet ABI requirements - stp d10,d11,[sp,#128+16] - stp d12,d13,[sp,#128+32] - stp d14,d15,[sp,#128+48] - - sub x2,x2,#512 // not typo - -.Loop_outer_512_neon: - mov v0.16b,v24.16b - mov v4.16b,v24.16b - mov v8.16b,v24.16b - mov v12.16b,v24.16b - mov v16.16b,v24.16b - mov v20.16b,v24.16b - mov v1.16b,v25.16b - mov w5,w22 // unpack key block - mov v5.16b,v25.16b - lsr x6,x22,#32 - mov v9.16b,v25.16b - mov w7,w23 - mov v13.16b,v25.16b - lsr x8,x23,#32 - mov v17.16b,v25.16b - mov w9,w24 - mov v21.16b,v25.16b - lsr x10,x24,#32 - mov v3.16b,v27.16b - mov w11,w25 - mov v7.16b,v28.16b - lsr x12,x25,#32 - mov v11.16b,v29.16b - mov w13,w26 - mov v15.16b,v30.16b - lsr x14,x26,#32 - mov v2.16b,v26.16b - mov w15,w27 - mov v6.16b,v26.16b - lsr x16,x27,#32 - add v19.4s,v3.4s,v31.4s // +4 - mov w17,w28 - add v23.4s,v7.4s,v31.4s // +4 - lsr x19,x28,#32 - mov v10.16b,v26.16b - mov w20,w30 - mov v14.16b,v26.16b - lsr x21,x30,#32 - mov v18.16b,v26.16b - stp q27,q28,[sp,#48] // off-load key block, variable part - mov v22.16b,v26.16b - str q29,[sp,#80] - - mov x4,#5 - subs x2,x2,#512 -.Loop_upper_neon: - sub x4,x4,#1 - add v0.4s,v0.4s,v1.4s - add w5,w5,w9 - add v4.4s,v4.4s,v5.4s - add w6,w6,w10 - add v8.4s,v8.4s,v9.4s - add w7,w7,w11 - add v12.4s,v12.4s,v13.4s - add w8,w8,w12 - add v16.4s,v16.4s,v17.4s - eor w17,w17,w5 - add v20.4s,v20.4s,v21.4s - eor w19,w19,w6 - eor v3.16b,v3.16b,v0.16b - eor w20,w20,w7 - eor v7.16b,v7.16b,v4.16b - eor w21,w21,w8 - eor v11.16b,v11.16b,v8.16b - ror w17,w17,#16 - eor v15.16b,v15.16b,v12.16b - ror w19,w19,#16 - eor v19.16b,v19.16b,v16.16b - ror w20,w20,#16 - eor v23.16b,v23.16b,v20.16b - ror w21,w21,#16 - rev32 v3.8h,v3.8h - add w13,w13,w17 - rev32 v7.8h,v7.8h - add w14,w14,w19 - rev32 v11.8h,v11.8h - add w15,w15,w20 - rev32 v15.8h,v15.8h - add w16,w16,w21 - rev32 v19.8h,v19.8h - eor w9,w9,w13 - rev32 v23.8h,v23.8h - eor w10,w10,w14 - add v2.4s,v2.4s,v3.4s - eor w11,w11,w15 - add v6.4s,v6.4s,v7.4s - eor w12,w12,w16 - add v10.4s,v10.4s,v11.4s - ror w9,w9,#20 - add v14.4s,v14.4s,v15.4s - ror w10,w10,#20 - add v18.4s,v18.4s,v19.4s - ror w11,w11,#20 - add v22.4s,v22.4s,v23.4s - ror w12,w12,#20 - eor v24.16b,v1.16b,v2.16b - add w5,w5,w9 - eor v25.16b,v5.16b,v6.16b - add w6,w6,w10 - eor v26.16b,v9.16b,v10.16b - add w7,w7,w11 - eor v27.16b,v13.16b,v14.16b - add w8,w8,w12 - eor v28.16b,v17.16b,v18.16b - eor w17,w17,w5 - eor v29.16b,v21.16b,v22.16b - eor w19,w19,w6 - ushr v1.4s,v24.4s,#20 - eor w20,w20,w7 - ushr v5.4s,v25.4s,#20 - eor w21,w21,w8 - ushr v9.4s,v26.4s,#20 - ror w17,w17,#24 - ushr v13.4s,v27.4s,#20 - ror w19,w19,#24 - ushr v17.4s,v28.4s,#20 - ror w20,w20,#24 - ushr v21.4s,v29.4s,#20 - ror w21,w21,#24 - sli v1.4s,v24.4s,#12 - add w13,w13,w17 - sli v5.4s,v25.4s,#12 - add w14,w14,w19 - sli v9.4s,v26.4s,#12 - add w15,w15,w20 - sli v13.4s,v27.4s,#12 - add w16,w16,w21 - sli v17.4s,v28.4s,#12 - eor w9,w9,w13 - sli v21.4s,v29.4s,#12 - eor w10,w10,w14 - add v0.4s,v0.4s,v1.4s - eor w11,w11,w15 - add v4.4s,v4.4s,v5.4s - eor w12,w12,w16 - add v8.4s,v8.4s,v9.4s - ror w9,w9,#25 - add v12.4s,v12.4s,v13.4s - ror w10,w10,#25 - add v16.4s,v16.4s,v17.4s - ror w11,w11,#25 - add v20.4s,v20.4s,v21.4s - ror w12,w12,#25 - eor v24.16b,v3.16b,v0.16b - add w5,w5,w10 - eor v25.16b,v7.16b,v4.16b - add w6,w6,w11 - eor v26.16b,v11.16b,v8.16b - add w7,w7,w12 - eor v27.16b,v15.16b,v12.16b - add w8,w8,w9 - eor v28.16b,v19.16b,v16.16b - eor w21,w21,w5 - eor v29.16b,v23.16b,v20.16b - eor w17,w17,w6 - ushr v3.4s,v24.4s,#24 - eor w19,w19,w7 - ushr v7.4s,v25.4s,#24 - eor w20,w20,w8 - ushr v11.4s,v26.4s,#24 - ror w21,w21,#16 - ushr v15.4s,v27.4s,#24 - ror w17,w17,#16 - ushr v19.4s,v28.4s,#24 - ror w19,w19,#16 - ushr v23.4s,v29.4s,#24 - ror w20,w20,#16 - sli v3.4s,v24.4s,#8 - add w15,w15,w21 - sli v7.4s,v25.4s,#8 - add w16,w16,w17 - sli v11.4s,v26.4s,#8 - add w13,w13,w19 - sli v15.4s,v27.4s,#8 - add w14,w14,w20 - sli v19.4s,v28.4s,#8 - eor w10,w10,w15 - sli v23.4s,v29.4s,#8 - eor w11,w11,w16 - add v2.4s,v2.4s,v3.4s - eor w12,w12,w13 - add v6.4s,v6.4s,v7.4s - eor w9,w9,w14 - add v10.4s,v10.4s,v11.4s - ror w10,w10,#20 - add v14.4s,v14.4s,v15.4s - ror w11,w11,#20 - add v18.4s,v18.4s,v19.4s - ror w12,w12,#20 - add v22.4s,v22.4s,v23.4s - ror w9,w9,#20 - eor v24.16b,v1.16b,v2.16b - add w5,w5,w10 - eor v25.16b,v5.16b,v6.16b - add w6,w6,w11 - eor v26.16b,v9.16b,v10.16b - add w7,w7,w12 - eor v27.16b,v13.16b,v14.16b - add w8,w8,w9 - eor v28.16b,v17.16b,v18.16b - eor w21,w21,w5 - eor v29.16b,v21.16b,v22.16b - eor w17,w17,w6 - ushr v1.4s,v24.4s,#25 - eor w19,w19,w7 - ushr v5.4s,v25.4s,#25 - eor w20,w20,w8 - ushr v9.4s,v26.4s,#25 - ror w21,w21,#24 - ushr v13.4s,v27.4s,#25 - ror w17,w17,#24 - ushr v17.4s,v28.4s,#25 - ror w19,w19,#24 - ushr v21.4s,v29.4s,#25 - ror w20,w20,#24 - sli v1.4s,v24.4s,#7 - add w15,w15,w21 - sli v5.4s,v25.4s,#7 - add w16,w16,w17 - sli v9.4s,v26.4s,#7 - add w13,w13,w19 - sli v13.4s,v27.4s,#7 - add w14,w14,w20 - sli v17.4s,v28.4s,#7 - eor w10,w10,w15 - sli v21.4s,v29.4s,#7 - eor w11,w11,w16 - ext v2.16b,v2.16b,v2.16b,#8 - eor w12,w12,w13 - ext v6.16b,v6.16b,v6.16b,#8 - eor w9,w9,w14 - ext v10.16b,v10.16b,v10.16b,#8 - ror w10,w10,#25 - ext v14.16b,v14.16b,v14.16b,#8 - ror w11,w11,#25 - ext v18.16b,v18.16b,v18.16b,#8 - ror w12,w12,#25 - ext v22.16b,v22.16b,v22.16b,#8 - ror w9,w9,#25 - ext v3.16b,v3.16b,v3.16b,#12 - ext v7.16b,v7.16b,v7.16b,#12 - ext v11.16b,v11.16b,v11.16b,#12 - ext v15.16b,v15.16b,v15.16b,#12 - ext v19.16b,v19.16b,v19.16b,#12 - ext v23.16b,v23.16b,v23.16b,#12 - ext v1.16b,v1.16b,v1.16b,#4 - ext v5.16b,v5.16b,v5.16b,#4 - ext v9.16b,v9.16b,v9.16b,#4 - ext v13.16b,v13.16b,v13.16b,#4 - ext v17.16b,v17.16b,v17.16b,#4 - ext v21.16b,v21.16b,v21.16b,#4 - add v0.4s,v0.4s,v1.4s - add w5,w5,w9 - add v4.4s,v4.4s,v5.4s - add w6,w6,w10 - add v8.4s,v8.4s,v9.4s - add w7,w7,w11 - add v12.4s,v12.4s,v13.4s - add w8,w8,w12 - add v16.4s,v16.4s,v17.4s - eor w17,w17,w5 - add v20.4s,v20.4s,v21.4s - eor w19,w19,w6 - eor v3.16b,v3.16b,v0.16b - eor w20,w20,w7 - eor v7.16b,v7.16b,v4.16b - eor w21,w21,w8 - eor v11.16b,v11.16b,v8.16b - ror w17,w17,#16 - eor v15.16b,v15.16b,v12.16b - ror w19,w19,#16 - eor v19.16b,v19.16b,v16.16b - ror w20,w20,#16 - eor v23.16b,v23.16b,v20.16b - ror w21,w21,#16 - rev32 v3.8h,v3.8h - add w13,w13,w17 - rev32 v7.8h,v7.8h - add w14,w14,w19 - rev32 v11.8h,v11.8h - add w15,w15,w20 - rev32 v15.8h,v15.8h - add w16,w16,w21 - rev32 v19.8h,v19.8h - eor w9,w9,w13 - rev32 v23.8h,v23.8h - eor w10,w10,w14 - add v2.4s,v2.4s,v3.4s - eor w11,w11,w15 - add v6.4s,v6.4s,v7.4s - eor w12,w12,w16 - add v10.4s,v10.4s,v11.4s - ror w9,w9,#20 - add v14.4s,v14.4s,v15.4s - ror w10,w10,#20 - add v18.4s,v18.4s,v19.4s - ror w11,w11,#20 - add v22.4s,v22.4s,v23.4s - ror w12,w12,#20 - eor v24.16b,v1.16b,v2.16b - add w5,w5,w9 - eor v25.16b,v5.16b,v6.16b - add w6,w6,w10 - eor v26.16b,v9.16b,v10.16b - add w7,w7,w11 - eor v27.16b,v13.16b,v14.16b - add w8,w8,w12 - eor v28.16b,v17.16b,v18.16b - eor w17,w17,w5 - eor v29.16b,v21.16b,v22.16b - eor w19,w19,w6 - ushr v1.4s,v24.4s,#20 - eor w20,w20,w7 - ushr v5.4s,v25.4s,#20 - eor w21,w21,w8 - ushr v9.4s,v26.4s,#20 - ror w17,w17,#24 - ushr v13.4s,v27.4s,#20 - ror w19,w19,#24 - ushr v17.4s,v28.4s,#20 - ror w20,w20,#24 - ushr v21.4s,v29.4s,#20 - ror w21,w21,#24 - sli v1.4s,v24.4s,#12 - add w13,w13,w17 - sli v5.4s,v25.4s,#12 - add w14,w14,w19 - sli v9.4s,v26.4s,#12 - add w15,w15,w20 - sli v13.4s,v27.4s,#12 - add w16,w16,w21 - sli v17.4s,v28.4s,#12 - eor w9,w9,w13 - sli v21.4s,v29.4s,#12 - eor w10,w10,w14 - add v0.4s,v0.4s,v1.4s - eor w11,w11,w15 - add v4.4s,v4.4s,v5.4s - eor w12,w12,w16 - add v8.4s,v8.4s,v9.4s - ror w9,w9,#25 - add v12.4s,v12.4s,v13.4s - ror w10,w10,#25 - add v16.4s,v16.4s,v17.4s - ror w11,w11,#25 - add v20.4s,v20.4s,v21.4s - ror w12,w12,#25 - eor v24.16b,v3.16b,v0.16b - add w5,w5,w10 - eor v25.16b,v7.16b,v4.16b - add w6,w6,w11 - eor v26.16b,v11.16b,v8.16b - add w7,w7,w12 - eor v27.16b,v15.16b,v12.16b - add w8,w8,w9 - eor v28.16b,v19.16b,v16.16b - eor w21,w21,w5 - eor v29.16b,v23.16b,v20.16b - eor w17,w17,w6 - ushr v3.4s,v24.4s,#24 - eor w19,w19,w7 - ushr v7.4s,v25.4s,#24 - eor w20,w20,w8 - ushr v11.4s,v26.4s,#24 - ror w21,w21,#16 - ushr v15.4s,v27.4s,#24 - ror w17,w17,#16 - ushr v19.4s,v28.4s,#24 - ror w19,w19,#16 - ushr v23.4s,v29.4s,#24 - ror w20,w20,#16 - sli v3.4s,v24.4s,#8 - add w15,w15,w21 - sli v7.4s,v25.4s,#8 - add w16,w16,w17 - sli v11.4s,v26.4s,#8 - add w13,w13,w19 - sli v15.4s,v27.4s,#8 - add w14,w14,w20 - sli v19.4s,v28.4s,#8 - eor w10,w10,w15 - sli v23.4s,v29.4s,#8 - eor w11,w11,w16 - add v2.4s,v2.4s,v3.4s - eor w12,w12,w13 - add v6.4s,v6.4s,v7.4s - eor w9,w9,w14 - add v10.4s,v10.4s,v11.4s - ror w10,w10,#20 - add v14.4s,v14.4s,v15.4s - ror w11,w11,#20 - add v18.4s,v18.4s,v19.4s - ror w12,w12,#20 - add v22.4s,v22.4s,v23.4s - ror w9,w9,#20 - eor v24.16b,v1.16b,v2.16b - add w5,w5,w10 - eor v25.16b,v5.16b,v6.16b - add w6,w6,w11 - eor v26.16b,v9.16b,v10.16b - add w7,w7,w12 - eor v27.16b,v13.16b,v14.16b - add w8,w8,w9 - eor v28.16b,v17.16b,v18.16b - eor w21,w21,w5 - eor v29.16b,v21.16b,v22.16b - eor w17,w17,w6 - ushr v1.4s,v24.4s,#25 - eor w19,w19,w7 - ushr v5.4s,v25.4s,#25 - eor w20,w20,w8 - ushr v9.4s,v26.4s,#25 - ror w21,w21,#24 - ushr v13.4s,v27.4s,#25 - ror w17,w17,#24 - ushr v17.4s,v28.4s,#25 - ror w19,w19,#24 - ushr v21.4s,v29.4s,#25 - ror w20,w20,#24 - sli v1.4s,v24.4s,#7 - add w15,w15,w21 - sli v5.4s,v25.4s,#7 - add w16,w16,w17 - sli v9.4s,v26.4s,#7 - add w13,w13,w19 - sli v13.4s,v27.4s,#7 - add w14,w14,w20 - sli v17.4s,v28.4s,#7 - eor w10,w10,w15 - sli v21.4s,v29.4s,#7 - eor w11,w11,w16 - ext v2.16b,v2.16b,v2.16b,#8 - eor w12,w12,w13 - ext v6.16b,v6.16b,v6.16b,#8 - eor w9,w9,w14 - ext v10.16b,v10.16b,v10.16b,#8 - ror w10,w10,#25 - ext v14.16b,v14.16b,v14.16b,#8 - ror w11,w11,#25 - ext v18.16b,v18.16b,v18.16b,#8 - ror w12,w12,#25 - ext v22.16b,v22.16b,v22.16b,#8 - ror w9,w9,#25 - ext v3.16b,v3.16b,v3.16b,#4 - ext v7.16b,v7.16b,v7.16b,#4 - ext v11.16b,v11.16b,v11.16b,#4 - ext v15.16b,v15.16b,v15.16b,#4 - ext v19.16b,v19.16b,v19.16b,#4 - ext v23.16b,v23.16b,v23.16b,#4 - ext v1.16b,v1.16b,v1.16b,#12 - ext v5.16b,v5.16b,v5.16b,#12 - ext v9.16b,v9.16b,v9.16b,#12 - ext v13.16b,v13.16b,v13.16b,#12 - ext v17.16b,v17.16b,v17.16b,#12 - ext v21.16b,v21.16b,v21.16b,#12 - cbnz x4,.Loop_upper_neon - - add w5,w5,w22 // accumulate key block - add x6,x6,x22,lsr#32 - add w7,w7,w23 - add x8,x8,x23,lsr#32 - add w9,w9,w24 - add x10,x10,x24,lsr#32 - add w11,w11,w25 - add x12,x12,x25,lsr#32 - add w13,w13,w26 - add x14,x14,x26,lsr#32 - add w15,w15,w27 - add x16,x16,x27,lsr#32 - add w17,w17,w28 - add x19,x19,x28,lsr#32 - add w20,w20,w30 - add x21,x21,x30,lsr#32 - - add x5,x5,x6,lsl#32 // pack - add x7,x7,x8,lsl#32 - ldp x6,x8,[x1,#0] // load input - add x9,x9,x10,lsl#32 - add x11,x11,x12,lsl#32 - ldp x10,x12,[x1,#16] - add x13,x13,x14,lsl#32 - add x15,x15,x16,lsl#32 - ldp x14,x16,[x1,#32] - add x17,x17,x19,lsl#32 - add x20,x20,x21,lsl#32 - ldp x19,x21,[x1,#48] - add x1,x1,#64 -#ifdef __ARMEB__ - rev x5,x5 - rev x7,x7 - rev x9,x9 - rev x11,x11 - rev x13,x13 - rev x15,x15 - rev x17,x17 - rev x20,x20 -#endif - eor x5,x5,x6 - eor x7,x7,x8 - eor x9,x9,x10 - eor x11,x11,x12 - eor x13,x13,x14 - eor x15,x15,x16 - eor x17,x17,x19 - eor x20,x20,x21 - - stp x5,x7,[x0,#0] // store output - add x28,x28,#1 // increment counter - mov w5,w22 // unpack key block - lsr x6,x22,#32 - stp x9,x11,[x0,#16] - mov w7,w23 - lsr x8,x23,#32 - stp x13,x15,[x0,#32] - mov w9,w24 - lsr x10,x24,#32 - stp x17,x20,[x0,#48] - add x0,x0,#64 - mov w11,w25 - lsr x12,x25,#32 - mov w13,w26 - lsr x14,x26,#32 - mov w15,w27 - lsr x16,x27,#32 - mov w17,w28 - lsr x19,x28,#32 - mov w20,w30 - lsr x21,x30,#32 - - mov x4,#5 -.Loop_lower_neon: - sub x4,x4,#1 - add v0.4s,v0.4s,v1.4s - add w5,w5,w9 - add v4.4s,v4.4s,v5.4s - add w6,w6,w10 - add v8.4s,v8.4s,v9.4s - add w7,w7,w11 - add v12.4s,v12.4s,v13.4s - add w8,w8,w12 - add v16.4s,v16.4s,v17.4s - eor w17,w17,w5 - add v20.4s,v20.4s,v21.4s - eor w19,w19,w6 - eor v3.16b,v3.16b,v0.16b - eor w20,w20,w7 - eor v7.16b,v7.16b,v4.16b - eor w21,w21,w8 - eor v11.16b,v11.16b,v8.16b - ror w17,w17,#16 - eor v15.16b,v15.16b,v12.16b - ror w19,w19,#16 - eor v19.16b,v19.16b,v16.16b - ror w20,w20,#16 - eor v23.16b,v23.16b,v20.16b - ror w21,w21,#16 - rev32 v3.8h,v3.8h - add w13,w13,w17 - rev32 v7.8h,v7.8h - add w14,w14,w19 - rev32 v11.8h,v11.8h - add w15,w15,w20 - rev32 v15.8h,v15.8h - add w16,w16,w21 - rev32 v19.8h,v19.8h - eor w9,w9,w13 - rev32 v23.8h,v23.8h - eor w10,w10,w14 - add v2.4s,v2.4s,v3.4s - eor w11,w11,w15 - add v6.4s,v6.4s,v7.4s - eor w12,w12,w16 - add v10.4s,v10.4s,v11.4s - ror w9,w9,#20 - add v14.4s,v14.4s,v15.4s - ror w10,w10,#20 - add v18.4s,v18.4s,v19.4s - ror w11,w11,#20 - add v22.4s,v22.4s,v23.4s - ror w12,w12,#20 - eor v24.16b,v1.16b,v2.16b - add w5,w5,w9 - eor v25.16b,v5.16b,v6.16b - add w6,w6,w10 - eor v26.16b,v9.16b,v10.16b - add w7,w7,w11 - eor v27.16b,v13.16b,v14.16b - add w8,w8,w12 - eor v28.16b,v17.16b,v18.16b - eor w17,w17,w5 - eor v29.16b,v21.16b,v22.16b - eor w19,w19,w6 - ushr v1.4s,v24.4s,#20 - eor w20,w20,w7 - ushr v5.4s,v25.4s,#20 - eor w21,w21,w8 - ushr v9.4s,v26.4s,#20 - ror w17,w17,#24 - ushr v13.4s,v27.4s,#20 - ror w19,w19,#24 - ushr v17.4s,v28.4s,#20 - ror w20,w20,#24 - ushr v21.4s,v29.4s,#20 - ror w21,w21,#24 - sli v1.4s,v24.4s,#12 - add w13,w13,w17 - sli v5.4s,v25.4s,#12 - add w14,w14,w19 - sli v9.4s,v26.4s,#12 - add w15,w15,w20 - sli v13.4s,v27.4s,#12 - add w16,w16,w21 - sli v17.4s,v28.4s,#12 - eor w9,w9,w13 - sli v21.4s,v29.4s,#12 - eor w10,w10,w14 - add v0.4s,v0.4s,v1.4s - eor w11,w11,w15 - add v4.4s,v4.4s,v5.4s - eor w12,w12,w16 - add v8.4s,v8.4s,v9.4s - ror w9,w9,#25 - add v12.4s,v12.4s,v13.4s - ror w10,w10,#25 - add v16.4s,v16.4s,v17.4s - ror w11,w11,#25 - add v20.4s,v20.4s,v21.4s - ror w12,w12,#25 - eor v24.16b,v3.16b,v0.16b - add w5,w5,w10 - eor v25.16b,v7.16b,v4.16b - add w6,w6,w11 - eor v26.16b,v11.16b,v8.16b - add w7,w7,w12 - eor v27.16b,v15.16b,v12.16b - add w8,w8,w9 - eor v28.16b,v19.16b,v16.16b - eor w21,w21,w5 - eor v29.16b,v23.16b,v20.16b - eor w17,w17,w6 - ushr v3.4s,v24.4s,#24 - eor w19,w19,w7 - ushr v7.4s,v25.4s,#24 - eor w20,w20,w8 - ushr v11.4s,v26.4s,#24 - ror w21,w21,#16 - ushr v15.4s,v27.4s,#24 - ror w17,w17,#16 - ushr v19.4s,v28.4s,#24 - ror w19,w19,#16 - ushr v23.4s,v29.4s,#24 - ror w20,w20,#16 - sli v3.4s,v24.4s,#8 - add w15,w15,w21 - sli v7.4s,v25.4s,#8 - add w16,w16,w17 - sli v11.4s,v26.4s,#8 - add w13,w13,w19 - sli v15.4s,v27.4s,#8 - add w14,w14,w20 - sli v19.4s,v28.4s,#8 - eor w10,w10,w15 - sli v23.4s,v29.4s,#8 - eor w11,w11,w16 - add v2.4s,v2.4s,v3.4s - eor w12,w12,w13 - add v6.4s,v6.4s,v7.4s - eor w9,w9,w14 - add v10.4s,v10.4s,v11.4s - ror w10,w10,#20 - add v14.4s,v14.4s,v15.4s - ror w11,w11,#20 - add v18.4s,v18.4s,v19.4s - ror w12,w12,#20 - add v22.4s,v22.4s,v23.4s - ror w9,w9,#20 - eor v24.16b,v1.16b,v2.16b - add w5,w5,w10 - eor v25.16b,v5.16b,v6.16b - add w6,w6,w11 - eor v26.16b,v9.16b,v10.16b - add w7,w7,w12 - eor v27.16b,v13.16b,v14.16b - add w8,w8,w9 - eor v28.16b,v17.16b,v18.16b - eor w21,w21,w5 - eor v29.16b,v21.16b,v22.16b - eor w17,w17,w6 - ushr v1.4s,v24.4s,#25 - eor w19,w19,w7 - ushr v5.4s,v25.4s,#25 - eor w20,w20,w8 - ushr v9.4s,v26.4s,#25 - ror w21,w21,#24 - ushr v13.4s,v27.4s,#25 - ror w17,w17,#24 - ushr v17.4s,v28.4s,#25 - ror w19,w19,#24 - ushr v21.4s,v29.4s,#25 - ror w20,w20,#24 - sli v1.4s,v24.4s,#7 - add w15,w15,w21 - sli v5.4s,v25.4s,#7 - add w16,w16,w17 - sli v9.4s,v26.4s,#7 - add w13,w13,w19 - sli v13.4s,v27.4s,#7 - add w14,w14,w20 - sli v17.4s,v28.4s,#7 - eor w10,w10,w15 - sli v21.4s,v29.4s,#7 - eor w11,w11,w16 - ext v2.16b,v2.16b,v2.16b,#8 - eor w12,w12,w13 - ext v6.16b,v6.16b,v6.16b,#8 - eor w9,w9,w14 - ext v10.16b,v10.16b,v10.16b,#8 - ror w10,w10,#25 - ext v14.16b,v14.16b,v14.16b,#8 - ror w11,w11,#25 - ext v18.16b,v18.16b,v18.16b,#8 - ror w12,w12,#25 - ext v22.16b,v22.16b,v22.16b,#8 - ror w9,w9,#25 - ext v3.16b,v3.16b,v3.16b,#12 - ext v7.16b,v7.16b,v7.16b,#12 - ext v11.16b,v11.16b,v11.16b,#12 - ext v15.16b,v15.16b,v15.16b,#12 - ext v19.16b,v19.16b,v19.16b,#12 - ext v23.16b,v23.16b,v23.16b,#12 - ext v1.16b,v1.16b,v1.16b,#4 - ext v5.16b,v5.16b,v5.16b,#4 - ext v9.16b,v9.16b,v9.16b,#4 - ext v13.16b,v13.16b,v13.16b,#4 - ext v17.16b,v17.16b,v17.16b,#4 - ext v21.16b,v21.16b,v21.16b,#4 - add v0.4s,v0.4s,v1.4s - add w5,w5,w9 - add v4.4s,v4.4s,v5.4s - add w6,w6,w10 - add v8.4s,v8.4s,v9.4s - add w7,w7,w11 - add v12.4s,v12.4s,v13.4s - add w8,w8,w12 - add v16.4s,v16.4s,v17.4s - eor w17,w17,w5 - add v20.4s,v20.4s,v21.4s - eor w19,w19,w6 - eor v3.16b,v3.16b,v0.16b - eor w20,w20,w7 - eor v7.16b,v7.16b,v4.16b - eor w21,w21,w8 - eor v11.16b,v11.16b,v8.16b - ror w17,w17,#16 - eor v15.16b,v15.16b,v12.16b - ror w19,w19,#16 - eor v19.16b,v19.16b,v16.16b - ror w20,w20,#16 - eor v23.16b,v23.16b,v20.16b - ror w21,w21,#16 - rev32 v3.8h,v3.8h - add w13,w13,w17 - rev32 v7.8h,v7.8h - add w14,w14,w19 - rev32 v11.8h,v11.8h - add w15,w15,w20 - rev32 v15.8h,v15.8h - add w16,w16,w21 - rev32 v19.8h,v19.8h - eor w9,w9,w13 - rev32 v23.8h,v23.8h - eor w10,w10,w14 - add v2.4s,v2.4s,v3.4s - eor w11,w11,w15 - add v6.4s,v6.4s,v7.4s - eor w12,w12,w16 - add v10.4s,v10.4s,v11.4s - ror w9,w9,#20 - add v14.4s,v14.4s,v15.4s - ror w10,w10,#20 - add v18.4s,v18.4s,v19.4s - ror w11,w11,#20 - add v22.4s,v22.4s,v23.4s - ror w12,w12,#20 - eor v24.16b,v1.16b,v2.16b - add w5,w5,w9 - eor v25.16b,v5.16b,v6.16b - add w6,w6,w10 - eor v26.16b,v9.16b,v10.16b - add w7,w7,w11 - eor v27.16b,v13.16b,v14.16b - add w8,w8,w12 - eor v28.16b,v17.16b,v18.16b - eor w17,w17,w5 - eor v29.16b,v21.16b,v22.16b - eor w19,w19,w6 - ushr v1.4s,v24.4s,#20 - eor w20,w20,w7 - ushr v5.4s,v25.4s,#20 - eor w21,w21,w8 - ushr v9.4s,v26.4s,#20 - ror w17,w17,#24 - ushr v13.4s,v27.4s,#20 - ror w19,w19,#24 - ushr v17.4s,v28.4s,#20 - ror w20,w20,#24 - ushr v21.4s,v29.4s,#20 - ror w21,w21,#24 - sli v1.4s,v24.4s,#12 - add w13,w13,w17 - sli v5.4s,v25.4s,#12 - add w14,w14,w19 - sli v9.4s,v26.4s,#12 - add w15,w15,w20 - sli v13.4s,v27.4s,#12 - add w16,w16,w21 - sli v17.4s,v28.4s,#12 - eor w9,w9,w13 - sli v21.4s,v29.4s,#12 - eor w10,w10,w14 - add v0.4s,v0.4s,v1.4s - eor w11,w11,w15 - add v4.4s,v4.4s,v5.4s - eor w12,w12,w16 - add v8.4s,v8.4s,v9.4s - ror w9,w9,#25 - add v12.4s,v12.4s,v13.4s - ror w10,w10,#25 - add v16.4s,v16.4s,v17.4s - ror w11,w11,#25 - add v20.4s,v20.4s,v21.4s - ror w12,w12,#25 - eor v24.16b,v3.16b,v0.16b - add w5,w5,w10 - eor v25.16b,v7.16b,v4.16b - add w6,w6,w11 - eor v26.16b,v11.16b,v8.16b - add w7,w7,w12 - eor v27.16b,v15.16b,v12.16b - add w8,w8,w9 - eor v28.16b,v19.16b,v16.16b - eor w21,w21,w5 - eor v29.16b,v23.16b,v20.16b - eor w17,w17,w6 - ushr v3.4s,v24.4s,#24 - eor w19,w19,w7 - ushr v7.4s,v25.4s,#24 - eor w20,w20,w8 - ushr v11.4s,v26.4s,#24 - ror w21,w21,#16 - ushr v15.4s,v27.4s,#24 - ror w17,w17,#16 - ushr v19.4s,v28.4s,#24 - ror w19,w19,#16 - ushr v23.4s,v29.4s,#24 - ror w20,w20,#16 - sli v3.4s,v24.4s,#8 - add w15,w15,w21 - sli v7.4s,v25.4s,#8 - add w16,w16,w17 - sli v11.4s,v26.4s,#8 - add w13,w13,w19 - sli v15.4s,v27.4s,#8 - add w14,w14,w20 - sli v19.4s,v28.4s,#8 - eor w10,w10,w15 - sli v23.4s,v29.4s,#8 - eor w11,w11,w16 - add v2.4s,v2.4s,v3.4s - eor w12,w12,w13 - add v6.4s,v6.4s,v7.4s - eor w9,w9,w14 - add v10.4s,v10.4s,v11.4s - ror w10,w10,#20 - add v14.4s,v14.4s,v15.4s - ror w11,w11,#20 - add v18.4s,v18.4s,v19.4s - ror w12,w12,#20 - add v22.4s,v22.4s,v23.4s - ror w9,w9,#20 - eor v24.16b,v1.16b,v2.16b - add w5,w5,w10 - eor v25.16b,v5.16b,v6.16b - add w6,w6,w11 - eor v26.16b,v9.16b,v10.16b - add w7,w7,w12 - eor v27.16b,v13.16b,v14.16b - add w8,w8,w9 - eor v28.16b,v17.16b,v18.16b - eor w21,w21,w5 - eor v29.16b,v21.16b,v22.16b - eor w17,w17,w6 - ushr v1.4s,v24.4s,#25 - eor w19,w19,w7 - ushr v5.4s,v25.4s,#25 - eor w20,w20,w8 - ushr v9.4s,v26.4s,#25 - ror w21,w21,#24 - ushr v13.4s,v27.4s,#25 - ror w17,w17,#24 - ushr v17.4s,v28.4s,#25 - ror w19,w19,#24 - ushr v21.4s,v29.4s,#25 - ror w20,w20,#24 - sli v1.4s,v24.4s,#7 - add w15,w15,w21 - sli v5.4s,v25.4s,#7 - add w16,w16,w17 - sli v9.4s,v26.4s,#7 - add w13,w13,w19 - sli v13.4s,v27.4s,#7 - add w14,w14,w20 - sli v17.4s,v28.4s,#7 - eor w10,w10,w15 - sli v21.4s,v29.4s,#7 - eor w11,w11,w16 - ext v2.16b,v2.16b,v2.16b,#8 - eor w12,w12,w13 - ext v6.16b,v6.16b,v6.16b,#8 - eor w9,w9,w14 - ext v10.16b,v10.16b,v10.16b,#8 - ror w10,w10,#25 - ext v14.16b,v14.16b,v14.16b,#8 - ror w11,w11,#25 - ext v18.16b,v18.16b,v18.16b,#8 - ror w12,w12,#25 - ext v22.16b,v22.16b,v22.16b,#8 - ror w9,w9,#25 - ext v3.16b,v3.16b,v3.16b,#4 - ext v7.16b,v7.16b,v7.16b,#4 - ext v11.16b,v11.16b,v11.16b,#4 - ext v15.16b,v15.16b,v15.16b,#4 - ext v19.16b,v19.16b,v19.16b,#4 - ext v23.16b,v23.16b,v23.16b,#4 - ext v1.16b,v1.16b,v1.16b,#12 - ext v5.16b,v5.16b,v5.16b,#12 - ext v9.16b,v9.16b,v9.16b,#12 - ext v13.16b,v13.16b,v13.16b,#12 - ext v17.16b,v17.16b,v17.16b,#12 - ext v21.16b,v21.16b,v21.16b,#12 - cbnz x4,.Loop_lower_neon - - add w5,w5,w22 // accumulate key block - ldp q24,q25,[sp,#0] - add x6,x6,x22,lsr#32 - ldp q26,q27,[sp,#32] - add w7,w7,w23 - ldp q28,q29,[sp,#64] - add x8,x8,x23,lsr#32 - add v0.4s,v0.4s,v24.4s - add w9,w9,w24 - add v4.4s,v4.4s,v24.4s - add x10,x10,x24,lsr#32 - add v8.4s,v8.4s,v24.4s - add w11,w11,w25 - add v12.4s,v12.4s,v24.4s - add x12,x12,x25,lsr#32 - add v16.4s,v16.4s,v24.4s - add w13,w13,w26 - add v20.4s,v20.4s,v24.4s - add x14,x14,x26,lsr#32 - add v2.4s,v2.4s,v26.4s - add w15,w15,w27 - add v6.4s,v6.4s,v26.4s - add x16,x16,x27,lsr#32 - add v10.4s,v10.4s,v26.4s - add w17,w17,w28 - add v14.4s,v14.4s,v26.4s - add x19,x19,x28,lsr#32 - add v18.4s,v18.4s,v26.4s - add w20,w20,w30 - add v22.4s,v22.4s,v26.4s - add x21,x21,x30,lsr#32 - add v19.4s,v19.4s,v31.4s // +4 - add x5,x5,x6,lsl#32 // pack - add v23.4s,v23.4s,v31.4s // +4 - add x7,x7,x8,lsl#32 - add v3.4s,v3.4s,v27.4s - ldp x6,x8,[x1,#0] // load input - add v7.4s,v7.4s,v28.4s - add x9,x9,x10,lsl#32 - add v11.4s,v11.4s,v29.4s - add x11,x11,x12,lsl#32 - add v15.4s,v15.4s,v30.4s - ldp x10,x12,[x1,#16] - add v19.4s,v19.4s,v27.4s - add x13,x13,x14,lsl#32 - add v23.4s,v23.4s,v28.4s - add x15,x15,x16,lsl#32 - add v1.4s,v1.4s,v25.4s - ldp x14,x16,[x1,#32] - add v5.4s,v5.4s,v25.4s - add x17,x17,x19,lsl#32 - add v9.4s,v9.4s,v25.4s - add x20,x20,x21,lsl#32 - add v13.4s,v13.4s,v25.4s - ldp x19,x21,[x1,#48] - add v17.4s,v17.4s,v25.4s - add x1,x1,#64 - add v21.4s,v21.4s,v25.4s - -#ifdef __ARMEB__ - rev x5,x5 - rev x7,x7 - rev x9,x9 - rev x11,x11 - rev x13,x13 - rev x15,x15 - rev x17,x17 - rev x20,x20 -#endif - ld1 {v24.16b,v25.16b,v26.16b,v27.16b},[x1],#64 - eor x5,x5,x6 - eor x7,x7,x8 - eor x9,x9,x10 - eor x11,x11,x12 - eor x13,x13,x14 - eor v0.16b,v0.16b,v24.16b - eor x15,x15,x16 - eor v1.16b,v1.16b,v25.16b - eor x17,x17,x19 - eor v2.16b,v2.16b,v26.16b - eor x20,x20,x21 - eor v3.16b,v3.16b,v27.16b - ld1 {v24.16b,v25.16b,v26.16b,v27.16b},[x1],#64 - - stp x5,x7,[x0,#0] // store output - add x28,x28,#7 // increment counter - stp x9,x11,[x0,#16] - stp x13,x15,[x0,#32] - stp x17,x20,[x0,#48] - add x0,x0,#64 - st1 {v0.16b,v1.16b,v2.16b,v3.16b},[x0],#64 - - ld1 {v0.16b,v1.16b,v2.16b,v3.16b},[x1],#64 - eor v4.16b,v4.16b,v24.16b - eor v5.16b,v5.16b,v25.16b - eor v6.16b,v6.16b,v26.16b - eor v7.16b,v7.16b,v27.16b - st1 {v4.16b,v5.16b,v6.16b,v7.16b},[x0],#64 - - ld1 {v4.16b,v5.16b,v6.16b,v7.16b},[x1],#64 - eor v8.16b,v8.16b,v0.16b - ldp q24,q25,[sp,#0] - eor v9.16b,v9.16b,v1.16b - ldp q26,q27,[sp,#32] - eor v10.16b,v10.16b,v2.16b - eor v11.16b,v11.16b,v3.16b - st1 {v8.16b,v9.16b,v10.16b,v11.16b},[x0],#64 - - ld1 {v8.16b,v9.16b,v10.16b,v11.16b},[x1],#64 - eor v12.16b,v12.16b,v4.16b - eor v13.16b,v13.16b,v5.16b - eor v14.16b,v14.16b,v6.16b - eor v15.16b,v15.16b,v7.16b - st1 {v12.16b,v13.16b,v14.16b,v15.16b},[x0],#64 - - ld1 {v12.16b,v13.16b,v14.16b,v15.16b},[x1],#64 - eor v16.16b,v16.16b,v8.16b - eor v17.16b,v17.16b,v9.16b - eor v18.16b,v18.16b,v10.16b - eor v19.16b,v19.16b,v11.16b - st1 {v16.16b,v17.16b,v18.16b,v19.16b},[x0],#64 - - shl v0.4s,v31.4s,#1 // 4 -> 8 - eor v20.16b,v20.16b,v12.16b - eor v21.16b,v21.16b,v13.16b - eor v22.16b,v22.16b,v14.16b - eor v23.16b,v23.16b,v15.16b - st1 {v20.16b,v21.16b,v22.16b,v23.16b},[x0],#64 - - add v27.4s,v27.4s,v0.4s // += 8 - add v28.4s,v28.4s,v0.4s - add v29.4s,v29.4s,v0.4s - add v30.4s,v30.4s,v0.4s - - b.hs .Loop_outer_512_neon - - adds x2,x2,#512 - ushr v0.4s,v31.4s,#2 // 4 -> 1 - - ldp d8,d9,[sp,#128+0] // meet ABI requirements - ldp d10,d11,[sp,#128+16] - ldp d12,d13,[sp,#128+32] - ldp d14,d15,[sp,#128+48] - - stp q24,q31,[sp,#0] // wipe off-load area - stp q24,q31,[sp,#32] - stp q24,q31,[sp,#64] - - b.eq .Ldone_512_neon - - cmp x2,#192 - sub v27.4s,v27.4s,v0.4s // -= 1 - sub v28.4s,v28.4s,v0.4s - sub v29.4s,v29.4s,v0.4s - add sp,sp,#128 - b.hs .Loop_outer_neon - - eor v25.16b,v25.16b,v25.16b - eor v26.16b,v26.16b,v26.16b - eor v27.16b,v27.16b,v27.16b - eor v28.16b,v28.16b,v28.16b - eor v29.16b,v29.16b,v29.16b - eor v30.16b,v30.16b,v30.16b - b .Loop_outer - -.Ldone_512_neon: - ldp x19,x20,[x29,#16] - add sp,sp,#128+64 - ldp x21,x22,[x29,#32] - ldp x23,x24,[x29,#48] - ldp x25,x26,[x29,#64] - ldp x27,x28,[x29,#80] - ldp x29,x30,[sp],#96 - AARCH64_VALIDATE_LINK_REGISTER - ret -.size ChaCha20_512_neon,.-ChaCha20_512_neon -#endif -#endif // !OPENSSL_NO_ASM -.section .note.GNU-stack,"",%progbits diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/chacha-x86_64-elf.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/chacha-x86_64-elf.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/chacha-x86_64-elf.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/chacha-x86_64-elf.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,1630 +0,0 @@ -# This file is generated from a similarly-named Perl script in the BoringSSL -# source tree. Do not edit by hand. - -#if defined(__has_feature) -#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) -#define OPENSSL_NO_ASM -#endif -#endif - -#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) -.text - -.extern GFp_ia32cap_P -.hidden GFp_ia32cap_P - -.align 64 -.Lzero: -.long 0,0,0,0 -.Lone: -.long 1,0,0,0 -.Linc: -.long 0,1,2,3 -.Lfour: -.long 4,4,4,4 -.Lincy: -.long 0,2,4,6,1,3,5,7 -.Leight: -.long 8,8,8,8,8,8,8,8 -.Lrot16: -.byte 0x2,0x3,0x0,0x1, 0x6,0x7,0x4,0x5, 0xa,0xb,0x8,0x9, 0xe,0xf,0xc,0xd -.Lrot24: -.byte 0x3,0x0,0x1,0x2, 0x7,0x4,0x5,0x6, 0xb,0x8,0x9,0xa, 0xf,0xc,0xd,0xe -.Lsigma: -.byte 101,120,112,97,110,100,32,51,50,45,98,121,116,101,32,107,0 -.align 64 -.Lzeroz: -.long 0,0,0,0, 1,0,0,0, 2,0,0,0, 3,0,0,0 -.Lfourz: -.long 4,0,0,0, 4,0,0,0, 4,0,0,0, 4,0,0,0 -.Lincz: -.long 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 -.Lsixteen: -.long 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16 -.byte 67,104,97,67,104,97,50,48,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 -.globl GFp_ChaCha20_ctr32 -.hidden GFp_ChaCha20_ctr32 -.type GFp_ChaCha20_ctr32,@function -.align 64 -GFp_ChaCha20_ctr32: -.cfi_startproc - cmpq $0,%rdx - je .Lno_data - movq GFp_ia32cap_P+4(%rip),%r10 - testl $512,%r10d - jnz .LChaCha20_ssse3 - - pushq %rbx -.cfi_adjust_cfa_offset 8 -.cfi_offset rbx,-16 - pushq %rbp -.cfi_adjust_cfa_offset 8 -.cfi_offset rbp,-24 - pushq %r12 -.cfi_adjust_cfa_offset 8 -.cfi_offset r12,-32 - pushq %r13 -.cfi_adjust_cfa_offset 8 -.cfi_offset r13,-40 - pushq %r14 -.cfi_adjust_cfa_offset 8 -.cfi_offset r14,-48 - pushq %r15 -.cfi_adjust_cfa_offset 8 -.cfi_offset r15,-56 - subq $64+24,%rsp -.cfi_adjust_cfa_offset 88 -.Lctr32_body: - - - movdqu (%rcx),%xmm1 - movdqu 16(%rcx),%xmm2 - movdqu (%r8),%xmm3 - movdqa .Lone(%rip),%xmm4 - - - movdqa %xmm1,16(%rsp) - movdqa %xmm2,32(%rsp) - movdqa %xmm3,48(%rsp) - movq %rdx,%rbp - jmp .Loop_outer - -.align 32 -.Loop_outer: - movl $0x61707865,%eax - movl $0x3320646e,%ebx - movl $0x79622d32,%ecx - movl $0x6b206574,%edx - movl 16(%rsp),%r8d - movl 20(%rsp),%r9d - movl 24(%rsp),%r10d - movl 28(%rsp),%r11d - movd %xmm3,%r12d - movl 52(%rsp),%r13d - movl 56(%rsp),%r14d - movl 60(%rsp),%r15d - - movq %rbp,64+0(%rsp) - movl $10,%ebp - movq %rsi,64+8(%rsp) -.byte 102,72,15,126,214 - movq %rdi,64+16(%rsp) - movq %rsi,%rdi - shrq $32,%rdi - jmp .Loop - -.align 32 -.Loop: - addl %r8d,%eax - xorl %eax,%r12d - roll $16,%r12d - addl %r9d,%ebx - xorl %ebx,%r13d - roll $16,%r13d - addl %r12d,%esi - xorl %esi,%r8d - roll $12,%r8d - addl %r13d,%edi - xorl %edi,%r9d - roll $12,%r9d - addl %r8d,%eax - xorl %eax,%r12d - roll $8,%r12d - addl %r9d,%ebx - xorl %ebx,%r13d - roll $8,%r13d - addl %r12d,%esi - xorl %esi,%r8d - roll $7,%r8d - addl %r13d,%edi - xorl %edi,%r9d - roll $7,%r9d - movl %esi,32(%rsp) - movl %edi,36(%rsp) - movl 40(%rsp),%esi - movl 44(%rsp),%edi - addl %r10d,%ecx - xorl %ecx,%r14d - roll $16,%r14d - addl %r11d,%edx - xorl %edx,%r15d - roll $16,%r15d - addl %r14d,%esi - xorl %esi,%r10d - roll $12,%r10d - addl %r15d,%edi - xorl %edi,%r11d - roll $12,%r11d - addl %r10d,%ecx - xorl %ecx,%r14d - roll $8,%r14d - addl %r11d,%edx - xorl %edx,%r15d - roll $8,%r15d - addl %r14d,%esi - xorl %esi,%r10d - roll $7,%r10d - addl %r15d,%edi - xorl %edi,%r11d - roll $7,%r11d - addl %r9d,%eax - xorl %eax,%r15d - roll $16,%r15d - addl %r10d,%ebx - xorl %ebx,%r12d - roll $16,%r12d - addl %r15d,%esi - xorl %esi,%r9d - roll $12,%r9d - addl %r12d,%edi - xorl %edi,%r10d - roll $12,%r10d - addl %r9d,%eax - xorl %eax,%r15d - roll $8,%r15d - addl %r10d,%ebx - xorl %ebx,%r12d - roll $8,%r12d - addl %r15d,%esi - xorl %esi,%r9d - roll $7,%r9d - addl %r12d,%edi - xorl %edi,%r10d - roll $7,%r10d - movl %esi,40(%rsp) - movl %edi,44(%rsp) - movl 32(%rsp),%esi - movl 36(%rsp),%edi - addl %r11d,%ecx - xorl %ecx,%r13d - roll $16,%r13d - addl %r8d,%edx - xorl %edx,%r14d - roll $16,%r14d - addl %r13d,%esi - xorl %esi,%r11d - roll $12,%r11d - addl %r14d,%edi - xorl %edi,%r8d - roll $12,%r8d - addl %r11d,%ecx - xorl %ecx,%r13d - roll $8,%r13d - addl %r8d,%edx - xorl %edx,%r14d - roll $8,%r14d - addl %r13d,%esi - xorl %esi,%r11d - roll $7,%r11d - addl %r14d,%edi - xorl %edi,%r8d - roll $7,%r8d - decl %ebp - jnz .Loop - movl %edi,36(%rsp) - movl %esi,32(%rsp) - movq 64(%rsp),%rbp - movdqa %xmm2,%xmm1 - movq 64+8(%rsp),%rsi - paddd %xmm4,%xmm3 - movq 64+16(%rsp),%rdi - - addl $0x61707865,%eax - addl $0x3320646e,%ebx - addl $0x79622d32,%ecx - addl $0x6b206574,%edx - addl 16(%rsp),%r8d - addl 20(%rsp),%r9d - addl 24(%rsp),%r10d - addl 28(%rsp),%r11d - addl 48(%rsp),%r12d - addl 52(%rsp),%r13d - addl 56(%rsp),%r14d - addl 60(%rsp),%r15d - paddd 32(%rsp),%xmm1 - - cmpq $64,%rbp - jb .Ltail - - xorl 0(%rsi),%eax - xorl 4(%rsi),%ebx - xorl 8(%rsi),%ecx - xorl 12(%rsi),%edx - xorl 16(%rsi),%r8d - xorl 20(%rsi),%r9d - xorl 24(%rsi),%r10d - xorl 28(%rsi),%r11d - movdqu 32(%rsi),%xmm0 - xorl 48(%rsi),%r12d - xorl 52(%rsi),%r13d - xorl 56(%rsi),%r14d - xorl 60(%rsi),%r15d - leaq 64(%rsi),%rsi - pxor %xmm1,%xmm0 - - movdqa %xmm2,32(%rsp) - movd %xmm3,48(%rsp) - - movl %eax,0(%rdi) - movl %ebx,4(%rdi) - movl %ecx,8(%rdi) - movl %edx,12(%rdi) - movl %r8d,16(%rdi) - movl %r9d,20(%rdi) - movl %r10d,24(%rdi) - movl %r11d,28(%rdi) - movdqu %xmm0,32(%rdi) - movl %r12d,48(%rdi) - movl %r13d,52(%rdi) - movl %r14d,56(%rdi) - movl %r15d,60(%rdi) - leaq 64(%rdi),%rdi - - subq $64,%rbp - jnz .Loop_outer - - jmp .Ldone - -.align 16 -.Ltail: - movl %eax,0(%rsp) - movl %ebx,4(%rsp) - xorq %rbx,%rbx - movl %ecx,8(%rsp) - movl %edx,12(%rsp) - movl %r8d,16(%rsp) - movl %r9d,20(%rsp) - movl %r10d,24(%rsp) - movl %r11d,28(%rsp) - movdqa %xmm1,32(%rsp) - movl %r12d,48(%rsp) - movl %r13d,52(%rsp) - movl %r14d,56(%rsp) - movl %r15d,60(%rsp) - -.Loop_tail: - movzbl (%rsi,%rbx,1),%eax - movzbl (%rsp,%rbx,1),%edx - leaq 1(%rbx),%rbx - xorl %edx,%eax - movb %al,-1(%rdi,%rbx,1) - decq %rbp - jnz .Loop_tail - -.Ldone: - leaq 64+24+48(%rsp),%rsi - movq -48(%rsi),%r15 -.cfi_restore r15 - movq -40(%rsi),%r14 -.cfi_restore r14 - movq -32(%rsi),%r13 -.cfi_restore r13 - movq -24(%rsi),%r12 -.cfi_restore r12 - movq -16(%rsi),%rbp -.cfi_restore rbp - movq -8(%rsi),%rbx -.cfi_restore rbx - leaq (%rsi),%rsp -.cfi_adjust_cfa_offset -136 -.Lno_data: - .byte 0xf3,0xc3 -.cfi_endproc -.size GFp_ChaCha20_ctr32,.-GFp_ChaCha20_ctr32 -.type ChaCha20_ssse3,@function -.align 32 -ChaCha20_ssse3: -.LChaCha20_ssse3: -.cfi_startproc - movq %rsp,%r9 -.cfi_def_cfa_register r9 - cmpq $128,%rdx - ja .LChaCha20_4x - -.Ldo_sse3_after_all: - subq $64+8,%rsp - movdqa .Lsigma(%rip),%xmm0 - movdqu (%rcx),%xmm1 - movdqu 16(%rcx),%xmm2 - movdqu (%r8),%xmm3 - movdqa .Lrot16(%rip),%xmm6 - movdqa .Lrot24(%rip),%xmm7 - - movdqa %xmm0,0(%rsp) - movdqa %xmm1,16(%rsp) - movdqa %xmm2,32(%rsp) - movdqa %xmm3,48(%rsp) - movq $10,%r8 - jmp .Loop_ssse3 - -.align 32 -.Loop_outer_ssse3: - movdqa .Lone(%rip),%xmm3 - movdqa 0(%rsp),%xmm0 - movdqa 16(%rsp),%xmm1 - movdqa 32(%rsp),%xmm2 - paddd 48(%rsp),%xmm3 - movq $10,%r8 - movdqa %xmm3,48(%rsp) - jmp .Loop_ssse3 - -.align 32 -.Loop_ssse3: - paddd %xmm1,%xmm0 - pxor %xmm0,%xmm3 -.byte 102,15,56,0,222 - paddd %xmm3,%xmm2 - pxor %xmm2,%xmm1 - movdqa %xmm1,%xmm4 - psrld $20,%xmm1 - pslld $12,%xmm4 - por %xmm4,%xmm1 - paddd %xmm1,%xmm0 - pxor %xmm0,%xmm3 -.byte 102,15,56,0,223 - paddd %xmm3,%xmm2 - pxor %xmm2,%xmm1 - movdqa %xmm1,%xmm4 - psrld $25,%xmm1 - pslld $7,%xmm4 - por %xmm4,%xmm1 - pshufd $78,%xmm2,%xmm2 - pshufd $57,%xmm1,%xmm1 - pshufd $147,%xmm3,%xmm3 - nop - paddd %xmm1,%xmm0 - pxor %xmm0,%xmm3 -.byte 102,15,56,0,222 - paddd %xmm3,%xmm2 - pxor %xmm2,%xmm1 - movdqa %xmm1,%xmm4 - psrld $20,%xmm1 - pslld $12,%xmm4 - por %xmm4,%xmm1 - paddd %xmm1,%xmm0 - pxor %xmm0,%xmm3 -.byte 102,15,56,0,223 - paddd %xmm3,%xmm2 - pxor %xmm2,%xmm1 - movdqa %xmm1,%xmm4 - psrld $25,%xmm1 - pslld $7,%xmm4 - por %xmm4,%xmm1 - pshufd $78,%xmm2,%xmm2 - pshufd $147,%xmm1,%xmm1 - pshufd $57,%xmm3,%xmm3 - decq %r8 - jnz .Loop_ssse3 - paddd 0(%rsp),%xmm0 - paddd 16(%rsp),%xmm1 - paddd 32(%rsp),%xmm2 - paddd 48(%rsp),%xmm3 - - cmpq $64,%rdx - jb .Ltail_ssse3 - - movdqu 0(%rsi),%xmm4 - movdqu 16(%rsi),%xmm5 - pxor %xmm4,%xmm0 - movdqu 32(%rsi),%xmm4 - pxor %xmm5,%xmm1 - movdqu 48(%rsi),%xmm5 - leaq 64(%rsi),%rsi - pxor %xmm4,%xmm2 - pxor %xmm5,%xmm3 - - movdqu %xmm0,0(%rdi) - movdqu %xmm1,16(%rdi) - movdqu %xmm2,32(%rdi) - movdqu %xmm3,48(%rdi) - leaq 64(%rdi),%rdi - - subq $64,%rdx - jnz .Loop_outer_ssse3 - - jmp .Ldone_ssse3 - -.align 16 -.Ltail_ssse3: - movdqa %xmm0,0(%rsp) - movdqa %xmm1,16(%rsp) - movdqa %xmm2,32(%rsp) - movdqa %xmm3,48(%rsp) - xorq %r8,%r8 - -.Loop_tail_ssse3: - movzbl (%rsi,%r8,1),%eax - movzbl (%rsp,%r8,1),%ecx - leaq 1(%r8),%r8 - xorl %ecx,%eax - movb %al,-1(%rdi,%r8,1) - decq %rdx - jnz .Loop_tail_ssse3 - -.Ldone_ssse3: - leaq (%r9),%rsp -.cfi_def_cfa_register rsp -.Lssse3_epilogue: - .byte 0xf3,0xc3 -.cfi_endproc -.size ChaCha20_ssse3,.-ChaCha20_ssse3 -.type ChaCha20_4x,@function -.align 32 -ChaCha20_4x: -.LChaCha20_4x: -.cfi_startproc - movq %rsp,%r9 -.cfi_def_cfa_register r9 - movq %r10,%r11 - shrq $32,%r10 - testq $32,%r10 - jnz .LChaCha20_8x - cmpq $192,%rdx - ja .Lproceed4x - - andq $71303168,%r11 - cmpq $4194304,%r11 - je .Ldo_sse3_after_all - -.Lproceed4x: - subq $0x140+8,%rsp - movdqa .Lsigma(%rip),%xmm11 - movdqu (%rcx),%xmm15 - movdqu 16(%rcx),%xmm7 - movdqu (%r8),%xmm3 - leaq 256(%rsp),%rcx - leaq .Lrot16(%rip),%r10 - leaq .Lrot24(%rip),%r11 - - pshufd $0x00,%xmm11,%xmm8 - pshufd $0x55,%xmm11,%xmm9 - movdqa %xmm8,64(%rsp) - pshufd $0xaa,%xmm11,%xmm10 - movdqa %xmm9,80(%rsp) - pshufd $0xff,%xmm11,%xmm11 - movdqa %xmm10,96(%rsp) - movdqa %xmm11,112(%rsp) - - pshufd $0x00,%xmm15,%xmm12 - pshufd $0x55,%xmm15,%xmm13 - movdqa %xmm12,128-256(%rcx) - pshufd $0xaa,%xmm15,%xmm14 - movdqa %xmm13,144-256(%rcx) - pshufd $0xff,%xmm15,%xmm15 - movdqa %xmm14,160-256(%rcx) - movdqa %xmm15,176-256(%rcx) - - pshufd $0x00,%xmm7,%xmm4 - pshufd $0x55,%xmm7,%xmm5 - movdqa %xmm4,192-256(%rcx) - pshufd $0xaa,%xmm7,%xmm6 - movdqa %xmm5,208-256(%rcx) - pshufd $0xff,%xmm7,%xmm7 - movdqa %xmm6,224-256(%rcx) - movdqa %xmm7,240-256(%rcx) - - pshufd $0x00,%xmm3,%xmm0 - pshufd $0x55,%xmm3,%xmm1 - paddd .Linc(%rip),%xmm0 - pshufd $0xaa,%xmm3,%xmm2 - movdqa %xmm1,272-256(%rcx) - pshufd $0xff,%xmm3,%xmm3 - movdqa %xmm2,288-256(%rcx) - movdqa %xmm3,304-256(%rcx) - - jmp .Loop_enter4x - -.align 32 -.Loop_outer4x: - movdqa 64(%rsp),%xmm8 - movdqa 80(%rsp),%xmm9 - movdqa 96(%rsp),%xmm10 - movdqa 112(%rsp),%xmm11 - movdqa 128-256(%rcx),%xmm12 - movdqa 144-256(%rcx),%xmm13 - movdqa 160-256(%rcx),%xmm14 - movdqa 176-256(%rcx),%xmm15 - movdqa 192-256(%rcx),%xmm4 - movdqa 208-256(%rcx),%xmm5 - movdqa 224-256(%rcx),%xmm6 - movdqa 240-256(%rcx),%xmm7 - movdqa 256-256(%rcx),%xmm0 - movdqa 272-256(%rcx),%xmm1 - movdqa 288-256(%rcx),%xmm2 - movdqa 304-256(%rcx),%xmm3 - paddd .Lfour(%rip),%xmm0 - -.Loop_enter4x: - movdqa %xmm6,32(%rsp) - movdqa %xmm7,48(%rsp) - movdqa (%r10),%xmm7 - movl $10,%eax - movdqa %xmm0,256-256(%rcx) - jmp .Loop4x - -.align 32 -.Loop4x: - paddd %xmm12,%xmm8 - paddd %xmm13,%xmm9 - pxor %xmm8,%xmm0 - pxor %xmm9,%xmm1 -.byte 102,15,56,0,199 -.byte 102,15,56,0,207 - paddd %xmm0,%xmm4 - paddd %xmm1,%xmm5 - pxor %xmm4,%xmm12 - pxor %xmm5,%xmm13 - movdqa %xmm12,%xmm6 - pslld $12,%xmm12 - psrld $20,%xmm6 - movdqa %xmm13,%xmm7 - pslld $12,%xmm13 - por %xmm6,%xmm12 - psrld $20,%xmm7 - movdqa (%r11),%xmm6 - por %xmm7,%xmm13 - paddd %xmm12,%xmm8 - paddd %xmm13,%xmm9 - pxor %xmm8,%xmm0 - pxor %xmm9,%xmm1 -.byte 102,15,56,0,198 -.byte 102,15,56,0,206 - paddd %xmm0,%xmm4 - paddd %xmm1,%xmm5 - pxor %xmm4,%xmm12 - pxor %xmm5,%xmm13 - movdqa %xmm12,%xmm7 - pslld $7,%xmm12 - psrld $25,%xmm7 - movdqa %xmm13,%xmm6 - pslld $7,%xmm13 - por %xmm7,%xmm12 - psrld $25,%xmm6 - movdqa (%r10),%xmm7 - por %xmm6,%xmm13 - movdqa %xmm4,0(%rsp) - movdqa %xmm5,16(%rsp) - movdqa 32(%rsp),%xmm4 - movdqa 48(%rsp),%xmm5 - paddd %xmm14,%xmm10 - paddd %xmm15,%xmm11 - pxor %xmm10,%xmm2 - pxor %xmm11,%xmm3 -.byte 102,15,56,0,215 -.byte 102,15,56,0,223 - paddd %xmm2,%xmm4 - paddd %xmm3,%xmm5 - pxor %xmm4,%xmm14 - pxor %xmm5,%xmm15 - movdqa %xmm14,%xmm6 - pslld $12,%xmm14 - psrld $20,%xmm6 - movdqa %xmm15,%xmm7 - pslld $12,%xmm15 - por %xmm6,%xmm14 - psrld $20,%xmm7 - movdqa (%r11),%xmm6 - por %xmm7,%xmm15 - paddd %xmm14,%xmm10 - paddd %xmm15,%xmm11 - pxor %xmm10,%xmm2 - pxor %xmm11,%xmm3 -.byte 102,15,56,0,214 -.byte 102,15,56,0,222 - paddd %xmm2,%xmm4 - paddd %xmm3,%xmm5 - pxor %xmm4,%xmm14 - pxor %xmm5,%xmm15 - movdqa %xmm14,%xmm7 - pslld $7,%xmm14 - psrld $25,%xmm7 - movdqa %xmm15,%xmm6 - pslld $7,%xmm15 - por %xmm7,%xmm14 - psrld $25,%xmm6 - movdqa (%r10),%xmm7 - por %xmm6,%xmm15 - paddd %xmm13,%xmm8 - paddd %xmm14,%xmm9 - pxor %xmm8,%xmm3 - pxor %xmm9,%xmm0 -.byte 102,15,56,0,223 -.byte 102,15,56,0,199 - paddd %xmm3,%xmm4 - paddd %xmm0,%xmm5 - pxor %xmm4,%xmm13 - pxor %xmm5,%xmm14 - movdqa %xmm13,%xmm6 - pslld $12,%xmm13 - psrld $20,%xmm6 - movdqa %xmm14,%xmm7 - pslld $12,%xmm14 - por %xmm6,%xmm13 - psrld $20,%xmm7 - movdqa (%r11),%xmm6 - por %xmm7,%xmm14 - paddd %xmm13,%xmm8 - paddd %xmm14,%xmm9 - pxor %xmm8,%xmm3 - pxor %xmm9,%xmm0 -.byte 102,15,56,0,222 -.byte 102,15,56,0,198 - paddd %xmm3,%xmm4 - paddd %xmm0,%xmm5 - pxor %xmm4,%xmm13 - pxor %xmm5,%xmm14 - movdqa %xmm13,%xmm7 - pslld $7,%xmm13 - psrld $25,%xmm7 - movdqa %xmm14,%xmm6 - pslld $7,%xmm14 - por %xmm7,%xmm13 - psrld $25,%xmm6 - movdqa (%r10),%xmm7 - por %xmm6,%xmm14 - movdqa %xmm4,32(%rsp) - movdqa %xmm5,48(%rsp) - movdqa 0(%rsp),%xmm4 - movdqa 16(%rsp),%xmm5 - paddd %xmm15,%xmm10 - paddd %xmm12,%xmm11 - pxor %xmm10,%xmm1 - pxor %xmm11,%xmm2 -.byte 102,15,56,0,207 -.byte 102,15,56,0,215 - paddd %xmm1,%xmm4 - paddd %xmm2,%xmm5 - pxor %xmm4,%xmm15 - pxor %xmm5,%xmm12 - movdqa %xmm15,%xmm6 - pslld $12,%xmm15 - psrld $20,%xmm6 - movdqa %xmm12,%xmm7 - pslld $12,%xmm12 - por %xmm6,%xmm15 - psrld $20,%xmm7 - movdqa (%r11),%xmm6 - por %xmm7,%xmm12 - paddd %xmm15,%xmm10 - paddd %xmm12,%xmm11 - pxor %xmm10,%xmm1 - pxor %xmm11,%xmm2 -.byte 102,15,56,0,206 -.byte 102,15,56,0,214 - paddd %xmm1,%xmm4 - paddd %xmm2,%xmm5 - pxor %xmm4,%xmm15 - pxor %xmm5,%xmm12 - movdqa %xmm15,%xmm7 - pslld $7,%xmm15 - psrld $25,%xmm7 - movdqa %xmm12,%xmm6 - pslld $7,%xmm12 - por %xmm7,%xmm15 - psrld $25,%xmm6 - movdqa (%r10),%xmm7 - por %xmm6,%xmm12 - decl %eax - jnz .Loop4x - - paddd 64(%rsp),%xmm8 - paddd 80(%rsp),%xmm9 - paddd 96(%rsp),%xmm10 - paddd 112(%rsp),%xmm11 - - movdqa %xmm8,%xmm6 - punpckldq %xmm9,%xmm8 - movdqa %xmm10,%xmm7 - punpckldq %xmm11,%xmm10 - punpckhdq %xmm9,%xmm6 - punpckhdq %xmm11,%xmm7 - movdqa %xmm8,%xmm9 - punpcklqdq %xmm10,%xmm8 - movdqa %xmm6,%xmm11 - punpcklqdq %xmm7,%xmm6 - punpckhqdq %xmm10,%xmm9 - punpckhqdq %xmm7,%xmm11 - paddd 128-256(%rcx),%xmm12 - paddd 144-256(%rcx),%xmm13 - paddd 160-256(%rcx),%xmm14 - paddd 176-256(%rcx),%xmm15 - - movdqa %xmm8,0(%rsp) - movdqa %xmm9,16(%rsp) - movdqa 32(%rsp),%xmm8 - movdqa 48(%rsp),%xmm9 - - movdqa %xmm12,%xmm10 - punpckldq %xmm13,%xmm12 - movdqa %xmm14,%xmm7 - punpckldq %xmm15,%xmm14 - punpckhdq %xmm13,%xmm10 - punpckhdq %xmm15,%xmm7 - movdqa %xmm12,%xmm13 - punpcklqdq %xmm14,%xmm12 - movdqa %xmm10,%xmm15 - punpcklqdq %xmm7,%xmm10 - punpckhqdq %xmm14,%xmm13 - punpckhqdq %xmm7,%xmm15 - paddd 192-256(%rcx),%xmm4 - paddd 208-256(%rcx),%xmm5 - paddd 224-256(%rcx),%xmm8 - paddd 240-256(%rcx),%xmm9 - - movdqa %xmm6,32(%rsp) - movdqa %xmm11,48(%rsp) - - movdqa %xmm4,%xmm14 - punpckldq %xmm5,%xmm4 - movdqa %xmm8,%xmm7 - punpckldq %xmm9,%xmm8 - punpckhdq %xmm5,%xmm14 - punpckhdq %xmm9,%xmm7 - movdqa %xmm4,%xmm5 - punpcklqdq %xmm8,%xmm4 - movdqa %xmm14,%xmm9 - punpcklqdq %xmm7,%xmm14 - punpckhqdq %xmm8,%xmm5 - punpckhqdq %xmm7,%xmm9 - paddd 256-256(%rcx),%xmm0 - paddd 272-256(%rcx),%xmm1 - paddd 288-256(%rcx),%xmm2 - paddd 304-256(%rcx),%xmm3 - - movdqa %xmm0,%xmm8 - punpckldq %xmm1,%xmm0 - movdqa %xmm2,%xmm7 - punpckldq %xmm3,%xmm2 - punpckhdq %xmm1,%xmm8 - punpckhdq %xmm3,%xmm7 - movdqa %xmm0,%xmm1 - punpcklqdq %xmm2,%xmm0 - movdqa %xmm8,%xmm3 - punpcklqdq %xmm7,%xmm8 - punpckhqdq %xmm2,%xmm1 - punpckhqdq %xmm7,%xmm3 - cmpq $256,%rdx - jb .Ltail4x - - movdqu 0(%rsi),%xmm6 - movdqu 16(%rsi),%xmm11 - movdqu 32(%rsi),%xmm2 - movdqu 48(%rsi),%xmm7 - pxor 0(%rsp),%xmm6 - pxor %xmm12,%xmm11 - pxor %xmm4,%xmm2 - pxor %xmm0,%xmm7 - - movdqu %xmm6,0(%rdi) - movdqu 64(%rsi),%xmm6 - movdqu %xmm11,16(%rdi) - movdqu 80(%rsi),%xmm11 - movdqu %xmm2,32(%rdi) - movdqu 96(%rsi),%xmm2 - movdqu %xmm7,48(%rdi) - movdqu 112(%rsi),%xmm7 - leaq 128(%rsi),%rsi - pxor 16(%rsp),%xmm6 - pxor %xmm13,%xmm11 - pxor %xmm5,%xmm2 - pxor %xmm1,%xmm7 - - movdqu %xmm6,64(%rdi) - movdqu 0(%rsi),%xmm6 - movdqu %xmm11,80(%rdi) - movdqu 16(%rsi),%xmm11 - movdqu %xmm2,96(%rdi) - movdqu 32(%rsi),%xmm2 - movdqu %xmm7,112(%rdi) - leaq 128(%rdi),%rdi - movdqu 48(%rsi),%xmm7 - pxor 32(%rsp),%xmm6 - pxor %xmm10,%xmm11 - pxor %xmm14,%xmm2 - pxor %xmm8,%xmm7 - - movdqu %xmm6,0(%rdi) - movdqu 64(%rsi),%xmm6 - movdqu %xmm11,16(%rdi) - movdqu 80(%rsi),%xmm11 - movdqu %xmm2,32(%rdi) - movdqu 96(%rsi),%xmm2 - movdqu %xmm7,48(%rdi) - movdqu 112(%rsi),%xmm7 - leaq 128(%rsi),%rsi - pxor 48(%rsp),%xmm6 - pxor %xmm15,%xmm11 - pxor %xmm9,%xmm2 - pxor %xmm3,%xmm7 - movdqu %xmm6,64(%rdi) - movdqu %xmm11,80(%rdi) - movdqu %xmm2,96(%rdi) - movdqu %xmm7,112(%rdi) - leaq 128(%rdi),%rdi - - subq $256,%rdx - jnz .Loop_outer4x - - jmp .Ldone4x - -.Ltail4x: - cmpq $192,%rdx - jae .L192_or_more4x - cmpq $128,%rdx - jae .L128_or_more4x - cmpq $64,%rdx - jae .L64_or_more4x - - - xorq %r10,%r10 - - movdqa %xmm12,16(%rsp) - movdqa %xmm4,32(%rsp) - movdqa %xmm0,48(%rsp) - jmp .Loop_tail4x - -.align 32 -.L64_or_more4x: - movdqu 0(%rsi),%xmm6 - movdqu 16(%rsi),%xmm11 - movdqu 32(%rsi),%xmm2 - movdqu 48(%rsi),%xmm7 - pxor 0(%rsp),%xmm6 - pxor %xmm12,%xmm11 - pxor %xmm4,%xmm2 - pxor %xmm0,%xmm7 - movdqu %xmm6,0(%rdi) - movdqu %xmm11,16(%rdi) - movdqu %xmm2,32(%rdi) - movdqu %xmm7,48(%rdi) - je .Ldone4x - - movdqa 16(%rsp),%xmm6 - leaq 64(%rsi),%rsi - xorq %r10,%r10 - movdqa %xmm6,0(%rsp) - movdqa %xmm13,16(%rsp) - leaq 64(%rdi),%rdi - movdqa %xmm5,32(%rsp) - subq $64,%rdx - movdqa %xmm1,48(%rsp) - jmp .Loop_tail4x - -.align 32 -.L128_or_more4x: - movdqu 0(%rsi),%xmm6 - movdqu 16(%rsi),%xmm11 - movdqu 32(%rsi),%xmm2 - movdqu 48(%rsi),%xmm7 - pxor 0(%rsp),%xmm6 - pxor %xmm12,%xmm11 - pxor %xmm4,%xmm2 - pxor %xmm0,%xmm7 - - movdqu %xmm6,0(%rdi) - movdqu 64(%rsi),%xmm6 - movdqu %xmm11,16(%rdi) - movdqu 80(%rsi),%xmm11 - movdqu %xmm2,32(%rdi) - movdqu 96(%rsi),%xmm2 - movdqu %xmm7,48(%rdi) - movdqu 112(%rsi),%xmm7 - pxor 16(%rsp),%xmm6 - pxor %xmm13,%xmm11 - pxor %xmm5,%xmm2 - pxor %xmm1,%xmm7 - movdqu %xmm6,64(%rdi) - movdqu %xmm11,80(%rdi) - movdqu %xmm2,96(%rdi) - movdqu %xmm7,112(%rdi) - je .Ldone4x - - movdqa 32(%rsp),%xmm6 - leaq 128(%rsi),%rsi - xorq %r10,%r10 - movdqa %xmm6,0(%rsp) - movdqa %xmm10,16(%rsp) - leaq 128(%rdi),%rdi - movdqa %xmm14,32(%rsp) - subq $128,%rdx - movdqa %xmm8,48(%rsp) - jmp .Loop_tail4x - -.align 32 -.L192_or_more4x: - movdqu 0(%rsi),%xmm6 - movdqu 16(%rsi),%xmm11 - movdqu 32(%rsi),%xmm2 - movdqu 48(%rsi),%xmm7 - pxor 0(%rsp),%xmm6 - pxor %xmm12,%xmm11 - pxor %xmm4,%xmm2 - pxor %xmm0,%xmm7 - - movdqu %xmm6,0(%rdi) - movdqu 64(%rsi),%xmm6 - movdqu %xmm11,16(%rdi) - movdqu 80(%rsi),%xmm11 - movdqu %xmm2,32(%rdi) - movdqu 96(%rsi),%xmm2 - movdqu %xmm7,48(%rdi) - movdqu 112(%rsi),%xmm7 - leaq 128(%rsi),%rsi - pxor 16(%rsp),%xmm6 - pxor %xmm13,%xmm11 - pxor %xmm5,%xmm2 - pxor %xmm1,%xmm7 - - movdqu %xmm6,64(%rdi) - movdqu 0(%rsi),%xmm6 - movdqu %xmm11,80(%rdi) - movdqu 16(%rsi),%xmm11 - movdqu %xmm2,96(%rdi) - movdqu 32(%rsi),%xmm2 - movdqu %xmm7,112(%rdi) - leaq 128(%rdi),%rdi - movdqu 48(%rsi),%xmm7 - pxor 32(%rsp),%xmm6 - pxor %xmm10,%xmm11 - pxor %xmm14,%xmm2 - pxor %xmm8,%xmm7 - movdqu %xmm6,0(%rdi) - movdqu %xmm11,16(%rdi) - movdqu %xmm2,32(%rdi) - movdqu %xmm7,48(%rdi) - je .Ldone4x - - movdqa 48(%rsp),%xmm6 - leaq 64(%rsi),%rsi - xorq %r10,%r10 - movdqa %xmm6,0(%rsp) - movdqa %xmm15,16(%rsp) - leaq 64(%rdi),%rdi - movdqa %xmm9,32(%rsp) - subq $192,%rdx - movdqa %xmm3,48(%rsp) - -.Loop_tail4x: - movzbl (%rsi,%r10,1),%eax - movzbl (%rsp,%r10,1),%ecx - leaq 1(%r10),%r10 - xorl %ecx,%eax - movb %al,-1(%rdi,%r10,1) - decq %rdx - jnz .Loop_tail4x - -.Ldone4x: - leaq (%r9),%rsp -.cfi_def_cfa_register rsp -.L4x_epilogue: - .byte 0xf3,0xc3 -.cfi_endproc -.size ChaCha20_4x,.-ChaCha20_4x -.type ChaCha20_8x,@function -.align 32 -ChaCha20_8x: -.LChaCha20_8x: -.cfi_startproc - movq %rsp,%r9 -.cfi_def_cfa_register r9 - subq $0x280+8,%rsp - andq $-32,%rsp - vzeroupper - - - - - - - - - - - vbroadcasti128 .Lsigma(%rip),%ymm11 - vbroadcasti128 (%rcx),%ymm3 - vbroadcasti128 16(%rcx),%ymm15 - vbroadcasti128 (%r8),%ymm7 - leaq 256(%rsp),%rcx - leaq 512(%rsp),%rax - leaq .Lrot16(%rip),%r10 - leaq .Lrot24(%rip),%r11 - - vpshufd $0x00,%ymm11,%ymm8 - vpshufd $0x55,%ymm11,%ymm9 - vmovdqa %ymm8,128-256(%rcx) - vpshufd $0xaa,%ymm11,%ymm10 - vmovdqa %ymm9,160-256(%rcx) - vpshufd $0xff,%ymm11,%ymm11 - vmovdqa %ymm10,192-256(%rcx) - vmovdqa %ymm11,224-256(%rcx) - - vpshufd $0x00,%ymm3,%ymm0 - vpshufd $0x55,%ymm3,%ymm1 - vmovdqa %ymm0,256-256(%rcx) - vpshufd $0xaa,%ymm3,%ymm2 - vmovdqa %ymm1,288-256(%rcx) - vpshufd $0xff,%ymm3,%ymm3 - vmovdqa %ymm2,320-256(%rcx) - vmovdqa %ymm3,352-256(%rcx) - - vpshufd $0x00,%ymm15,%ymm12 - vpshufd $0x55,%ymm15,%ymm13 - vmovdqa %ymm12,384-512(%rax) - vpshufd $0xaa,%ymm15,%ymm14 - vmovdqa %ymm13,416-512(%rax) - vpshufd $0xff,%ymm15,%ymm15 - vmovdqa %ymm14,448-512(%rax) - vmovdqa %ymm15,480-512(%rax) - - vpshufd $0x00,%ymm7,%ymm4 - vpshufd $0x55,%ymm7,%ymm5 - vpaddd .Lincy(%rip),%ymm4,%ymm4 - vpshufd $0xaa,%ymm7,%ymm6 - vmovdqa %ymm5,544-512(%rax) - vpshufd $0xff,%ymm7,%ymm7 - vmovdqa %ymm6,576-512(%rax) - vmovdqa %ymm7,608-512(%rax) - - jmp .Loop_enter8x - -.align 32 -.Loop_outer8x: - vmovdqa 128-256(%rcx),%ymm8 - vmovdqa 160-256(%rcx),%ymm9 - vmovdqa 192-256(%rcx),%ymm10 - vmovdqa 224-256(%rcx),%ymm11 - vmovdqa 256-256(%rcx),%ymm0 - vmovdqa 288-256(%rcx),%ymm1 - vmovdqa 320-256(%rcx),%ymm2 - vmovdqa 352-256(%rcx),%ymm3 - vmovdqa 384-512(%rax),%ymm12 - vmovdqa 416-512(%rax),%ymm13 - vmovdqa 448-512(%rax),%ymm14 - vmovdqa 480-512(%rax),%ymm15 - vmovdqa 512-512(%rax),%ymm4 - vmovdqa 544-512(%rax),%ymm5 - vmovdqa 576-512(%rax),%ymm6 - vmovdqa 608-512(%rax),%ymm7 - vpaddd .Leight(%rip),%ymm4,%ymm4 - -.Loop_enter8x: - vmovdqa %ymm14,64(%rsp) - vmovdqa %ymm15,96(%rsp) - vbroadcasti128 (%r10),%ymm15 - vmovdqa %ymm4,512-512(%rax) - movl $10,%eax - jmp .Loop8x - -.align 32 -.Loop8x: - vpaddd %ymm0,%ymm8,%ymm8 - vpxor %ymm4,%ymm8,%ymm4 - vpshufb %ymm15,%ymm4,%ymm4 - vpaddd %ymm1,%ymm9,%ymm9 - vpxor %ymm5,%ymm9,%ymm5 - vpshufb %ymm15,%ymm5,%ymm5 - vpaddd %ymm4,%ymm12,%ymm12 - vpxor %ymm0,%ymm12,%ymm0 - vpslld $12,%ymm0,%ymm14 - vpsrld $20,%ymm0,%ymm0 - vpor %ymm0,%ymm14,%ymm0 - vbroadcasti128 (%r11),%ymm14 - vpaddd %ymm5,%ymm13,%ymm13 - vpxor %ymm1,%ymm13,%ymm1 - vpslld $12,%ymm1,%ymm15 - vpsrld $20,%ymm1,%ymm1 - vpor %ymm1,%ymm15,%ymm1 - vpaddd %ymm0,%ymm8,%ymm8 - vpxor %ymm4,%ymm8,%ymm4 - vpshufb %ymm14,%ymm4,%ymm4 - vpaddd %ymm1,%ymm9,%ymm9 - vpxor %ymm5,%ymm9,%ymm5 - vpshufb %ymm14,%ymm5,%ymm5 - vpaddd %ymm4,%ymm12,%ymm12 - vpxor %ymm0,%ymm12,%ymm0 - vpslld $7,%ymm0,%ymm15 - vpsrld $25,%ymm0,%ymm0 - vpor %ymm0,%ymm15,%ymm0 - vbroadcasti128 (%r10),%ymm15 - vpaddd %ymm5,%ymm13,%ymm13 - vpxor %ymm1,%ymm13,%ymm1 - vpslld $7,%ymm1,%ymm14 - vpsrld $25,%ymm1,%ymm1 - vpor %ymm1,%ymm14,%ymm1 - vmovdqa %ymm12,0(%rsp) - vmovdqa %ymm13,32(%rsp) - vmovdqa 64(%rsp),%ymm12 - vmovdqa 96(%rsp),%ymm13 - vpaddd %ymm2,%ymm10,%ymm10 - vpxor %ymm6,%ymm10,%ymm6 - vpshufb %ymm15,%ymm6,%ymm6 - vpaddd %ymm3,%ymm11,%ymm11 - vpxor %ymm7,%ymm11,%ymm7 - vpshufb %ymm15,%ymm7,%ymm7 - vpaddd %ymm6,%ymm12,%ymm12 - vpxor %ymm2,%ymm12,%ymm2 - vpslld $12,%ymm2,%ymm14 - vpsrld $20,%ymm2,%ymm2 - vpor %ymm2,%ymm14,%ymm2 - vbroadcasti128 (%r11),%ymm14 - vpaddd %ymm7,%ymm13,%ymm13 - vpxor %ymm3,%ymm13,%ymm3 - vpslld $12,%ymm3,%ymm15 - vpsrld $20,%ymm3,%ymm3 - vpor %ymm3,%ymm15,%ymm3 - vpaddd %ymm2,%ymm10,%ymm10 - vpxor %ymm6,%ymm10,%ymm6 - vpshufb %ymm14,%ymm6,%ymm6 - vpaddd %ymm3,%ymm11,%ymm11 - vpxor %ymm7,%ymm11,%ymm7 - vpshufb %ymm14,%ymm7,%ymm7 - vpaddd %ymm6,%ymm12,%ymm12 - vpxor %ymm2,%ymm12,%ymm2 - vpslld $7,%ymm2,%ymm15 - vpsrld $25,%ymm2,%ymm2 - vpor %ymm2,%ymm15,%ymm2 - vbroadcasti128 (%r10),%ymm15 - vpaddd %ymm7,%ymm13,%ymm13 - vpxor %ymm3,%ymm13,%ymm3 - vpslld $7,%ymm3,%ymm14 - vpsrld $25,%ymm3,%ymm3 - vpor %ymm3,%ymm14,%ymm3 - vpaddd %ymm1,%ymm8,%ymm8 - vpxor %ymm7,%ymm8,%ymm7 - vpshufb %ymm15,%ymm7,%ymm7 - vpaddd %ymm2,%ymm9,%ymm9 - vpxor %ymm4,%ymm9,%ymm4 - vpshufb %ymm15,%ymm4,%ymm4 - vpaddd %ymm7,%ymm12,%ymm12 - vpxor %ymm1,%ymm12,%ymm1 - vpslld $12,%ymm1,%ymm14 - vpsrld $20,%ymm1,%ymm1 - vpor %ymm1,%ymm14,%ymm1 - vbroadcasti128 (%r11),%ymm14 - vpaddd %ymm4,%ymm13,%ymm13 - vpxor %ymm2,%ymm13,%ymm2 - vpslld $12,%ymm2,%ymm15 - vpsrld $20,%ymm2,%ymm2 - vpor %ymm2,%ymm15,%ymm2 - vpaddd %ymm1,%ymm8,%ymm8 - vpxor %ymm7,%ymm8,%ymm7 - vpshufb %ymm14,%ymm7,%ymm7 - vpaddd %ymm2,%ymm9,%ymm9 - vpxor %ymm4,%ymm9,%ymm4 - vpshufb %ymm14,%ymm4,%ymm4 - vpaddd %ymm7,%ymm12,%ymm12 - vpxor %ymm1,%ymm12,%ymm1 - vpslld $7,%ymm1,%ymm15 - vpsrld $25,%ymm1,%ymm1 - vpor %ymm1,%ymm15,%ymm1 - vbroadcasti128 (%r10),%ymm15 - vpaddd %ymm4,%ymm13,%ymm13 - vpxor %ymm2,%ymm13,%ymm2 - vpslld $7,%ymm2,%ymm14 - vpsrld $25,%ymm2,%ymm2 - vpor %ymm2,%ymm14,%ymm2 - vmovdqa %ymm12,64(%rsp) - vmovdqa %ymm13,96(%rsp) - vmovdqa 0(%rsp),%ymm12 - vmovdqa 32(%rsp),%ymm13 - vpaddd %ymm3,%ymm10,%ymm10 - vpxor %ymm5,%ymm10,%ymm5 - vpshufb %ymm15,%ymm5,%ymm5 - vpaddd %ymm0,%ymm11,%ymm11 - vpxor %ymm6,%ymm11,%ymm6 - vpshufb %ymm15,%ymm6,%ymm6 - vpaddd %ymm5,%ymm12,%ymm12 - vpxor %ymm3,%ymm12,%ymm3 - vpslld $12,%ymm3,%ymm14 - vpsrld $20,%ymm3,%ymm3 - vpor %ymm3,%ymm14,%ymm3 - vbroadcasti128 (%r11),%ymm14 - vpaddd %ymm6,%ymm13,%ymm13 - vpxor %ymm0,%ymm13,%ymm0 - vpslld $12,%ymm0,%ymm15 - vpsrld $20,%ymm0,%ymm0 - vpor %ymm0,%ymm15,%ymm0 - vpaddd %ymm3,%ymm10,%ymm10 - vpxor %ymm5,%ymm10,%ymm5 - vpshufb %ymm14,%ymm5,%ymm5 - vpaddd %ymm0,%ymm11,%ymm11 - vpxor %ymm6,%ymm11,%ymm6 - vpshufb %ymm14,%ymm6,%ymm6 - vpaddd %ymm5,%ymm12,%ymm12 - vpxor %ymm3,%ymm12,%ymm3 - vpslld $7,%ymm3,%ymm15 - vpsrld $25,%ymm3,%ymm3 - vpor %ymm3,%ymm15,%ymm3 - vbroadcasti128 (%r10),%ymm15 - vpaddd %ymm6,%ymm13,%ymm13 - vpxor %ymm0,%ymm13,%ymm0 - vpslld $7,%ymm0,%ymm14 - vpsrld $25,%ymm0,%ymm0 - vpor %ymm0,%ymm14,%ymm0 - decl %eax - jnz .Loop8x - - leaq 512(%rsp),%rax - vpaddd 128-256(%rcx),%ymm8,%ymm8 - vpaddd 160-256(%rcx),%ymm9,%ymm9 - vpaddd 192-256(%rcx),%ymm10,%ymm10 - vpaddd 224-256(%rcx),%ymm11,%ymm11 - - vpunpckldq %ymm9,%ymm8,%ymm14 - vpunpckldq %ymm11,%ymm10,%ymm15 - vpunpckhdq %ymm9,%ymm8,%ymm8 - vpunpckhdq %ymm11,%ymm10,%ymm10 - vpunpcklqdq %ymm15,%ymm14,%ymm9 - vpunpckhqdq %ymm15,%ymm14,%ymm14 - vpunpcklqdq %ymm10,%ymm8,%ymm11 - vpunpckhqdq %ymm10,%ymm8,%ymm8 - vpaddd 256-256(%rcx),%ymm0,%ymm0 - vpaddd 288-256(%rcx),%ymm1,%ymm1 - vpaddd 320-256(%rcx),%ymm2,%ymm2 - vpaddd 352-256(%rcx),%ymm3,%ymm3 - - vpunpckldq %ymm1,%ymm0,%ymm10 - vpunpckldq %ymm3,%ymm2,%ymm15 - vpunpckhdq %ymm1,%ymm0,%ymm0 - vpunpckhdq %ymm3,%ymm2,%ymm2 - vpunpcklqdq %ymm15,%ymm10,%ymm1 - vpunpckhqdq %ymm15,%ymm10,%ymm10 - vpunpcklqdq %ymm2,%ymm0,%ymm3 - vpunpckhqdq %ymm2,%ymm0,%ymm0 - vperm2i128 $0x20,%ymm1,%ymm9,%ymm15 - vperm2i128 $0x31,%ymm1,%ymm9,%ymm1 - vperm2i128 $0x20,%ymm10,%ymm14,%ymm9 - vperm2i128 $0x31,%ymm10,%ymm14,%ymm10 - vperm2i128 $0x20,%ymm3,%ymm11,%ymm14 - vperm2i128 $0x31,%ymm3,%ymm11,%ymm3 - vperm2i128 $0x20,%ymm0,%ymm8,%ymm11 - vperm2i128 $0x31,%ymm0,%ymm8,%ymm0 - vmovdqa %ymm15,0(%rsp) - vmovdqa %ymm9,32(%rsp) - vmovdqa 64(%rsp),%ymm15 - vmovdqa 96(%rsp),%ymm9 - - vpaddd 384-512(%rax),%ymm12,%ymm12 - vpaddd 416-512(%rax),%ymm13,%ymm13 - vpaddd 448-512(%rax),%ymm15,%ymm15 - vpaddd 480-512(%rax),%ymm9,%ymm9 - - vpunpckldq %ymm13,%ymm12,%ymm2 - vpunpckldq %ymm9,%ymm15,%ymm8 - vpunpckhdq %ymm13,%ymm12,%ymm12 - vpunpckhdq %ymm9,%ymm15,%ymm15 - vpunpcklqdq %ymm8,%ymm2,%ymm13 - vpunpckhqdq %ymm8,%ymm2,%ymm2 - vpunpcklqdq %ymm15,%ymm12,%ymm9 - vpunpckhqdq %ymm15,%ymm12,%ymm12 - vpaddd 512-512(%rax),%ymm4,%ymm4 - vpaddd 544-512(%rax),%ymm5,%ymm5 - vpaddd 576-512(%rax),%ymm6,%ymm6 - vpaddd 608-512(%rax),%ymm7,%ymm7 - - vpunpckldq %ymm5,%ymm4,%ymm15 - vpunpckldq %ymm7,%ymm6,%ymm8 - vpunpckhdq %ymm5,%ymm4,%ymm4 - vpunpckhdq %ymm7,%ymm6,%ymm6 - vpunpcklqdq %ymm8,%ymm15,%ymm5 - vpunpckhqdq %ymm8,%ymm15,%ymm15 - vpunpcklqdq %ymm6,%ymm4,%ymm7 - vpunpckhqdq %ymm6,%ymm4,%ymm4 - vperm2i128 $0x20,%ymm5,%ymm13,%ymm8 - vperm2i128 $0x31,%ymm5,%ymm13,%ymm5 - vperm2i128 $0x20,%ymm15,%ymm2,%ymm13 - vperm2i128 $0x31,%ymm15,%ymm2,%ymm15 - vperm2i128 $0x20,%ymm7,%ymm9,%ymm2 - vperm2i128 $0x31,%ymm7,%ymm9,%ymm7 - vperm2i128 $0x20,%ymm4,%ymm12,%ymm9 - vperm2i128 $0x31,%ymm4,%ymm12,%ymm4 - vmovdqa 0(%rsp),%ymm6 - vmovdqa 32(%rsp),%ymm12 - - cmpq $512,%rdx - jb .Ltail8x - - vpxor 0(%rsi),%ymm6,%ymm6 - vpxor 32(%rsi),%ymm8,%ymm8 - vpxor 64(%rsi),%ymm1,%ymm1 - vpxor 96(%rsi),%ymm5,%ymm5 - leaq 128(%rsi),%rsi - vmovdqu %ymm6,0(%rdi) - vmovdqu %ymm8,32(%rdi) - vmovdqu %ymm1,64(%rdi) - vmovdqu %ymm5,96(%rdi) - leaq 128(%rdi),%rdi - - vpxor 0(%rsi),%ymm12,%ymm12 - vpxor 32(%rsi),%ymm13,%ymm13 - vpxor 64(%rsi),%ymm10,%ymm10 - vpxor 96(%rsi),%ymm15,%ymm15 - leaq 128(%rsi),%rsi - vmovdqu %ymm12,0(%rdi) - vmovdqu %ymm13,32(%rdi) - vmovdqu %ymm10,64(%rdi) - vmovdqu %ymm15,96(%rdi) - leaq 128(%rdi),%rdi - - vpxor 0(%rsi),%ymm14,%ymm14 - vpxor 32(%rsi),%ymm2,%ymm2 - vpxor 64(%rsi),%ymm3,%ymm3 - vpxor 96(%rsi),%ymm7,%ymm7 - leaq 128(%rsi),%rsi - vmovdqu %ymm14,0(%rdi) - vmovdqu %ymm2,32(%rdi) - vmovdqu %ymm3,64(%rdi) - vmovdqu %ymm7,96(%rdi) - leaq 128(%rdi),%rdi - - vpxor 0(%rsi),%ymm11,%ymm11 - vpxor 32(%rsi),%ymm9,%ymm9 - vpxor 64(%rsi),%ymm0,%ymm0 - vpxor 96(%rsi),%ymm4,%ymm4 - leaq 128(%rsi),%rsi - vmovdqu %ymm11,0(%rdi) - vmovdqu %ymm9,32(%rdi) - vmovdqu %ymm0,64(%rdi) - vmovdqu %ymm4,96(%rdi) - leaq 128(%rdi),%rdi - - subq $512,%rdx - jnz .Loop_outer8x - - jmp .Ldone8x - -.Ltail8x: - cmpq $448,%rdx - jae .L448_or_more8x - cmpq $384,%rdx - jae .L384_or_more8x - cmpq $320,%rdx - jae .L320_or_more8x - cmpq $256,%rdx - jae .L256_or_more8x - cmpq $192,%rdx - jae .L192_or_more8x - cmpq $128,%rdx - jae .L128_or_more8x - cmpq $64,%rdx - jae .L64_or_more8x - - xorq %r10,%r10 - vmovdqa %ymm6,0(%rsp) - vmovdqa %ymm8,32(%rsp) - jmp .Loop_tail8x - -.align 32 -.L64_or_more8x: - vpxor 0(%rsi),%ymm6,%ymm6 - vpxor 32(%rsi),%ymm8,%ymm8 - vmovdqu %ymm6,0(%rdi) - vmovdqu %ymm8,32(%rdi) - je .Ldone8x - - leaq 64(%rsi),%rsi - xorq %r10,%r10 - vmovdqa %ymm1,0(%rsp) - leaq 64(%rdi),%rdi - subq $64,%rdx - vmovdqa %ymm5,32(%rsp) - jmp .Loop_tail8x - -.align 32 -.L128_or_more8x: - vpxor 0(%rsi),%ymm6,%ymm6 - vpxor 32(%rsi),%ymm8,%ymm8 - vpxor 64(%rsi),%ymm1,%ymm1 - vpxor 96(%rsi),%ymm5,%ymm5 - vmovdqu %ymm6,0(%rdi) - vmovdqu %ymm8,32(%rdi) - vmovdqu %ymm1,64(%rdi) - vmovdqu %ymm5,96(%rdi) - je .Ldone8x - - leaq 128(%rsi),%rsi - xorq %r10,%r10 - vmovdqa %ymm12,0(%rsp) - leaq 128(%rdi),%rdi - subq $128,%rdx - vmovdqa %ymm13,32(%rsp) - jmp .Loop_tail8x - -.align 32 -.L192_or_more8x: - vpxor 0(%rsi),%ymm6,%ymm6 - vpxor 32(%rsi),%ymm8,%ymm8 - vpxor 64(%rsi),%ymm1,%ymm1 - vpxor 96(%rsi),%ymm5,%ymm5 - vpxor 128(%rsi),%ymm12,%ymm12 - vpxor 160(%rsi),%ymm13,%ymm13 - vmovdqu %ymm6,0(%rdi) - vmovdqu %ymm8,32(%rdi) - vmovdqu %ymm1,64(%rdi) - vmovdqu %ymm5,96(%rdi) - vmovdqu %ymm12,128(%rdi) - vmovdqu %ymm13,160(%rdi) - je .Ldone8x - - leaq 192(%rsi),%rsi - xorq %r10,%r10 - vmovdqa %ymm10,0(%rsp) - leaq 192(%rdi),%rdi - subq $192,%rdx - vmovdqa %ymm15,32(%rsp) - jmp .Loop_tail8x - -.align 32 -.L256_or_more8x: - vpxor 0(%rsi),%ymm6,%ymm6 - vpxor 32(%rsi),%ymm8,%ymm8 - vpxor 64(%rsi),%ymm1,%ymm1 - vpxor 96(%rsi),%ymm5,%ymm5 - vpxor 128(%rsi),%ymm12,%ymm12 - vpxor 160(%rsi),%ymm13,%ymm13 - vpxor 192(%rsi),%ymm10,%ymm10 - vpxor 224(%rsi),%ymm15,%ymm15 - vmovdqu %ymm6,0(%rdi) - vmovdqu %ymm8,32(%rdi) - vmovdqu %ymm1,64(%rdi) - vmovdqu %ymm5,96(%rdi) - vmovdqu %ymm12,128(%rdi) - vmovdqu %ymm13,160(%rdi) - vmovdqu %ymm10,192(%rdi) - vmovdqu %ymm15,224(%rdi) - je .Ldone8x - - leaq 256(%rsi),%rsi - xorq %r10,%r10 - vmovdqa %ymm14,0(%rsp) - leaq 256(%rdi),%rdi - subq $256,%rdx - vmovdqa %ymm2,32(%rsp) - jmp .Loop_tail8x - -.align 32 -.L320_or_more8x: - vpxor 0(%rsi),%ymm6,%ymm6 - vpxor 32(%rsi),%ymm8,%ymm8 - vpxor 64(%rsi),%ymm1,%ymm1 - vpxor 96(%rsi),%ymm5,%ymm5 - vpxor 128(%rsi),%ymm12,%ymm12 - vpxor 160(%rsi),%ymm13,%ymm13 - vpxor 192(%rsi),%ymm10,%ymm10 - vpxor 224(%rsi),%ymm15,%ymm15 - vpxor 256(%rsi),%ymm14,%ymm14 - vpxor 288(%rsi),%ymm2,%ymm2 - vmovdqu %ymm6,0(%rdi) - vmovdqu %ymm8,32(%rdi) - vmovdqu %ymm1,64(%rdi) - vmovdqu %ymm5,96(%rdi) - vmovdqu %ymm12,128(%rdi) - vmovdqu %ymm13,160(%rdi) - vmovdqu %ymm10,192(%rdi) - vmovdqu %ymm15,224(%rdi) - vmovdqu %ymm14,256(%rdi) - vmovdqu %ymm2,288(%rdi) - je .Ldone8x - - leaq 320(%rsi),%rsi - xorq %r10,%r10 - vmovdqa %ymm3,0(%rsp) - leaq 320(%rdi),%rdi - subq $320,%rdx - vmovdqa %ymm7,32(%rsp) - jmp .Loop_tail8x - -.align 32 -.L384_or_more8x: - vpxor 0(%rsi),%ymm6,%ymm6 - vpxor 32(%rsi),%ymm8,%ymm8 - vpxor 64(%rsi),%ymm1,%ymm1 - vpxor 96(%rsi),%ymm5,%ymm5 - vpxor 128(%rsi),%ymm12,%ymm12 - vpxor 160(%rsi),%ymm13,%ymm13 - vpxor 192(%rsi),%ymm10,%ymm10 - vpxor 224(%rsi),%ymm15,%ymm15 - vpxor 256(%rsi),%ymm14,%ymm14 - vpxor 288(%rsi),%ymm2,%ymm2 - vpxor 320(%rsi),%ymm3,%ymm3 - vpxor 352(%rsi),%ymm7,%ymm7 - vmovdqu %ymm6,0(%rdi) - vmovdqu %ymm8,32(%rdi) - vmovdqu %ymm1,64(%rdi) - vmovdqu %ymm5,96(%rdi) - vmovdqu %ymm12,128(%rdi) - vmovdqu %ymm13,160(%rdi) - vmovdqu %ymm10,192(%rdi) - vmovdqu %ymm15,224(%rdi) - vmovdqu %ymm14,256(%rdi) - vmovdqu %ymm2,288(%rdi) - vmovdqu %ymm3,320(%rdi) - vmovdqu %ymm7,352(%rdi) - je .Ldone8x - - leaq 384(%rsi),%rsi - xorq %r10,%r10 - vmovdqa %ymm11,0(%rsp) - leaq 384(%rdi),%rdi - subq $384,%rdx - vmovdqa %ymm9,32(%rsp) - jmp .Loop_tail8x - -.align 32 -.L448_or_more8x: - vpxor 0(%rsi),%ymm6,%ymm6 - vpxor 32(%rsi),%ymm8,%ymm8 - vpxor 64(%rsi),%ymm1,%ymm1 - vpxor 96(%rsi),%ymm5,%ymm5 - vpxor 128(%rsi),%ymm12,%ymm12 - vpxor 160(%rsi),%ymm13,%ymm13 - vpxor 192(%rsi),%ymm10,%ymm10 - vpxor 224(%rsi),%ymm15,%ymm15 - vpxor 256(%rsi),%ymm14,%ymm14 - vpxor 288(%rsi),%ymm2,%ymm2 - vpxor 320(%rsi),%ymm3,%ymm3 - vpxor 352(%rsi),%ymm7,%ymm7 - vpxor 384(%rsi),%ymm11,%ymm11 - vpxor 416(%rsi),%ymm9,%ymm9 - vmovdqu %ymm6,0(%rdi) - vmovdqu %ymm8,32(%rdi) - vmovdqu %ymm1,64(%rdi) - vmovdqu %ymm5,96(%rdi) - vmovdqu %ymm12,128(%rdi) - vmovdqu %ymm13,160(%rdi) - vmovdqu %ymm10,192(%rdi) - vmovdqu %ymm15,224(%rdi) - vmovdqu %ymm14,256(%rdi) - vmovdqu %ymm2,288(%rdi) - vmovdqu %ymm3,320(%rdi) - vmovdqu %ymm7,352(%rdi) - vmovdqu %ymm11,384(%rdi) - vmovdqu %ymm9,416(%rdi) - je .Ldone8x - - leaq 448(%rsi),%rsi - xorq %r10,%r10 - vmovdqa %ymm0,0(%rsp) - leaq 448(%rdi),%rdi - subq $448,%rdx - vmovdqa %ymm4,32(%rsp) - -.Loop_tail8x: - movzbl (%rsi,%r10,1),%eax - movzbl (%rsp,%r10,1),%ecx - leaq 1(%r10),%r10 - xorl %ecx,%eax - movb %al,-1(%rdi,%r10,1) - decq %rdx - jnz .Loop_tail8x - -.Ldone8x: - vzeroall - leaq (%r9),%rsp -.cfi_def_cfa_register rsp -.L8x_epilogue: - .byte 0xf3,0xc3 -.cfi_endproc -.size ChaCha20_8x,.-ChaCha20_8x -#endif -.section .note.GNU-stack,"",@progbits diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/chacha-x86_64-macosx.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/chacha-x86_64-macosx.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/chacha-x86_64-macosx.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/chacha-x86_64-macosx.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,1622 +0,0 @@ -# This file is generated from a similarly-named Perl script in the BoringSSL -# source tree. Do not edit by hand. - -#if defined(__has_feature) -#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) -#define OPENSSL_NO_ASM -#endif -#endif - -#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) -.text - - - -.p2align 6 -L$zero: -.long 0,0,0,0 -L$one: -.long 1,0,0,0 -L$inc: -.long 0,1,2,3 -L$four: -.long 4,4,4,4 -L$incy: -.long 0,2,4,6,1,3,5,7 -L$eight: -.long 8,8,8,8,8,8,8,8 -L$rot16: -.byte 0x2,0x3,0x0,0x1, 0x6,0x7,0x4,0x5, 0xa,0xb,0x8,0x9, 0xe,0xf,0xc,0xd -L$rot24: -.byte 0x3,0x0,0x1,0x2, 0x7,0x4,0x5,0x6, 0xb,0x8,0x9,0xa, 0xf,0xc,0xd,0xe -L$sigma: -.byte 101,120,112,97,110,100,32,51,50,45,98,121,116,101,32,107,0 -.p2align 6 -L$zeroz: -.long 0,0,0,0, 1,0,0,0, 2,0,0,0, 3,0,0,0 -L$fourz: -.long 4,0,0,0, 4,0,0,0, 4,0,0,0, 4,0,0,0 -L$incz: -.long 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 -L$sixteen: -.long 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16 -.byte 67,104,97,67,104,97,50,48,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 -.globl _GFp_ChaCha20_ctr32 -.private_extern _GFp_ChaCha20_ctr32 - -.p2align 6 -_GFp_ChaCha20_ctr32: - - cmpq $0,%rdx - je L$no_data - movq _GFp_ia32cap_P+4(%rip),%r10 - testl $512,%r10d - jnz L$ChaCha20_ssse3 - - pushq %rbx - - pushq %rbp - - pushq %r12 - - pushq %r13 - - pushq %r14 - - pushq %r15 - - subq $64+24,%rsp - -L$ctr32_body: - - - movdqu (%rcx),%xmm1 - movdqu 16(%rcx),%xmm2 - movdqu (%r8),%xmm3 - movdqa L$one(%rip),%xmm4 - - - movdqa %xmm1,16(%rsp) - movdqa %xmm2,32(%rsp) - movdqa %xmm3,48(%rsp) - movq %rdx,%rbp - jmp L$oop_outer - -.p2align 5 -L$oop_outer: - movl $0x61707865,%eax - movl $0x3320646e,%ebx - movl $0x79622d32,%ecx - movl $0x6b206574,%edx - movl 16(%rsp),%r8d - movl 20(%rsp),%r9d - movl 24(%rsp),%r10d - movl 28(%rsp),%r11d - movd %xmm3,%r12d - movl 52(%rsp),%r13d - movl 56(%rsp),%r14d - movl 60(%rsp),%r15d - - movq %rbp,64+0(%rsp) - movl $10,%ebp - movq %rsi,64+8(%rsp) -.byte 102,72,15,126,214 - movq %rdi,64+16(%rsp) - movq %rsi,%rdi - shrq $32,%rdi - jmp L$oop - -.p2align 5 -L$oop: - addl %r8d,%eax - xorl %eax,%r12d - roll $16,%r12d - addl %r9d,%ebx - xorl %ebx,%r13d - roll $16,%r13d - addl %r12d,%esi - xorl %esi,%r8d - roll $12,%r8d - addl %r13d,%edi - xorl %edi,%r9d - roll $12,%r9d - addl %r8d,%eax - xorl %eax,%r12d - roll $8,%r12d - addl %r9d,%ebx - xorl %ebx,%r13d - roll $8,%r13d - addl %r12d,%esi - xorl %esi,%r8d - roll $7,%r8d - addl %r13d,%edi - xorl %edi,%r9d - roll $7,%r9d - movl %esi,32(%rsp) - movl %edi,36(%rsp) - movl 40(%rsp),%esi - movl 44(%rsp),%edi - addl %r10d,%ecx - xorl %ecx,%r14d - roll $16,%r14d - addl %r11d,%edx - xorl %edx,%r15d - roll $16,%r15d - addl %r14d,%esi - xorl %esi,%r10d - roll $12,%r10d - addl %r15d,%edi - xorl %edi,%r11d - roll $12,%r11d - addl %r10d,%ecx - xorl %ecx,%r14d - roll $8,%r14d - addl %r11d,%edx - xorl %edx,%r15d - roll $8,%r15d - addl %r14d,%esi - xorl %esi,%r10d - roll $7,%r10d - addl %r15d,%edi - xorl %edi,%r11d - roll $7,%r11d - addl %r9d,%eax - xorl %eax,%r15d - roll $16,%r15d - addl %r10d,%ebx - xorl %ebx,%r12d - roll $16,%r12d - addl %r15d,%esi - xorl %esi,%r9d - roll $12,%r9d - addl %r12d,%edi - xorl %edi,%r10d - roll $12,%r10d - addl %r9d,%eax - xorl %eax,%r15d - roll $8,%r15d - addl %r10d,%ebx - xorl %ebx,%r12d - roll $8,%r12d - addl %r15d,%esi - xorl %esi,%r9d - roll $7,%r9d - addl %r12d,%edi - xorl %edi,%r10d - roll $7,%r10d - movl %esi,40(%rsp) - movl %edi,44(%rsp) - movl 32(%rsp),%esi - movl 36(%rsp),%edi - addl %r11d,%ecx - xorl %ecx,%r13d - roll $16,%r13d - addl %r8d,%edx - xorl %edx,%r14d - roll $16,%r14d - addl %r13d,%esi - xorl %esi,%r11d - roll $12,%r11d - addl %r14d,%edi - xorl %edi,%r8d - roll $12,%r8d - addl %r11d,%ecx - xorl %ecx,%r13d - roll $8,%r13d - addl %r8d,%edx - xorl %edx,%r14d - roll $8,%r14d - addl %r13d,%esi - xorl %esi,%r11d - roll $7,%r11d - addl %r14d,%edi - xorl %edi,%r8d - roll $7,%r8d - decl %ebp - jnz L$oop - movl %edi,36(%rsp) - movl %esi,32(%rsp) - movq 64(%rsp),%rbp - movdqa %xmm2,%xmm1 - movq 64+8(%rsp),%rsi - paddd %xmm4,%xmm3 - movq 64+16(%rsp),%rdi - - addl $0x61707865,%eax - addl $0x3320646e,%ebx - addl $0x79622d32,%ecx - addl $0x6b206574,%edx - addl 16(%rsp),%r8d - addl 20(%rsp),%r9d - addl 24(%rsp),%r10d - addl 28(%rsp),%r11d - addl 48(%rsp),%r12d - addl 52(%rsp),%r13d - addl 56(%rsp),%r14d - addl 60(%rsp),%r15d - paddd 32(%rsp),%xmm1 - - cmpq $64,%rbp - jb L$tail - - xorl 0(%rsi),%eax - xorl 4(%rsi),%ebx - xorl 8(%rsi),%ecx - xorl 12(%rsi),%edx - xorl 16(%rsi),%r8d - xorl 20(%rsi),%r9d - xorl 24(%rsi),%r10d - xorl 28(%rsi),%r11d - movdqu 32(%rsi),%xmm0 - xorl 48(%rsi),%r12d - xorl 52(%rsi),%r13d - xorl 56(%rsi),%r14d - xorl 60(%rsi),%r15d - leaq 64(%rsi),%rsi - pxor %xmm1,%xmm0 - - movdqa %xmm2,32(%rsp) - movd %xmm3,48(%rsp) - - movl %eax,0(%rdi) - movl %ebx,4(%rdi) - movl %ecx,8(%rdi) - movl %edx,12(%rdi) - movl %r8d,16(%rdi) - movl %r9d,20(%rdi) - movl %r10d,24(%rdi) - movl %r11d,28(%rdi) - movdqu %xmm0,32(%rdi) - movl %r12d,48(%rdi) - movl %r13d,52(%rdi) - movl %r14d,56(%rdi) - movl %r15d,60(%rdi) - leaq 64(%rdi),%rdi - - subq $64,%rbp - jnz L$oop_outer - - jmp L$done - -.p2align 4 -L$tail: - movl %eax,0(%rsp) - movl %ebx,4(%rsp) - xorq %rbx,%rbx - movl %ecx,8(%rsp) - movl %edx,12(%rsp) - movl %r8d,16(%rsp) - movl %r9d,20(%rsp) - movl %r10d,24(%rsp) - movl %r11d,28(%rsp) - movdqa %xmm1,32(%rsp) - movl %r12d,48(%rsp) - movl %r13d,52(%rsp) - movl %r14d,56(%rsp) - movl %r15d,60(%rsp) - -L$oop_tail: - movzbl (%rsi,%rbx,1),%eax - movzbl (%rsp,%rbx,1),%edx - leaq 1(%rbx),%rbx - xorl %edx,%eax - movb %al,-1(%rdi,%rbx,1) - decq %rbp - jnz L$oop_tail - -L$done: - leaq 64+24+48(%rsp),%rsi - movq -48(%rsi),%r15 - - movq -40(%rsi),%r14 - - movq -32(%rsi),%r13 - - movq -24(%rsi),%r12 - - movq -16(%rsi),%rbp - - movq -8(%rsi),%rbx - - leaq (%rsi),%rsp - -L$no_data: - .byte 0xf3,0xc3 - - - -.p2align 5 -ChaCha20_ssse3: -L$ChaCha20_ssse3: - - movq %rsp,%r9 - - cmpq $128,%rdx - ja L$ChaCha20_4x - -L$do_sse3_after_all: - subq $64+8,%rsp - movdqa L$sigma(%rip),%xmm0 - movdqu (%rcx),%xmm1 - movdqu 16(%rcx),%xmm2 - movdqu (%r8),%xmm3 - movdqa L$rot16(%rip),%xmm6 - movdqa L$rot24(%rip),%xmm7 - - movdqa %xmm0,0(%rsp) - movdqa %xmm1,16(%rsp) - movdqa %xmm2,32(%rsp) - movdqa %xmm3,48(%rsp) - movq $10,%r8 - jmp L$oop_ssse3 - -.p2align 5 -L$oop_outer_ssse3: - movdqa L$one(%rip),%xmm3 - movdqa 0(%rsp),%xmm0 - movdqa 16(%rsp),%xmm1 - movdqa 32(%rsp),%xmm2 - paddd 48(%rsp),%xmm3 - movq $10,%r8 - movdqa %xmm3,48(%rsp) - jmp L$oop_ssse3 - -.p2align 5 -L$oop_ssse3: - paddd %xmm1,%xmm0 - pxor %xmm0,%xmm3 -.byte 102,15,56,0,222 - paddd %xmm3,%xmm2 - pxor %xmm2,%xmm1 - movdqa %xmm1,%xmm4 - psrld $20,%xmm1 - pslld $12,%xmm4 - por %xmm4,%xmm1 - paddd %xmm1,%xmm0 - pxor %xmm0,%xmm3 -.byte 102,15,56,0,223 - paddd %xmm3,%xmm2 - pxor %xmm2,%xmm1 - movdqa %xmm1,%xmm4 - psrld $25,%xmm1 - pslld $7,%xmm4 - por %xmm4,%xmm1 - pshufd $78,%xmm2,%xmm2 - pshufd $57,%xmm1,%xmm1 - pshufd $147,%xmm3,%xmm3 - nop - paddd %xmm1,%xmm0 - pxor %xmm0,%xmm3 -.byte 102,15,56,0,222 - paddd %xmm3,%xmm2 - pxor %xmm2,%xmm1 - movdqa %xmm1,%xmm4 - psrld $20,%xmm1 - pslld $12,%xmm4 - por %xmm4,%xmm1 - paddd %xmm1,%xmm0 - pxor %xmm0,%xmm3 -.byte 102,15,56,0,223 - paddd %xmm3,%xmm2 - pxor %xmm2,%xmm1 - movdqa %xmm1,%xmm4 - psrld $25,%xmm1 - pslld $7,%xmm4 - por %xmm4,%xmm1 - pshufd $78,%xmm2,%xmm2 - pshufd $147,%xmm1,%xmm1 - pshufd $57,%xmm3,%xmm3 - decq %r8 - jnz L$oop_ssse3 - paddd 0(%rsp),%xmm0 - paddd 16(%rsp),%xmm1 - paddd 32(%rsp),%xmm2 - paddd 48(%rsp),%xmm3 - - cmpq $64,%rdx - jb L$tail_ssse3 - - movdqu 0(%rsi),%xmm4 - movdqu 16(%rsi),%xmm5 - pxor %xmm4,%xmm0 - movdqu 32(%rsi),%xmm4 - pxor %xmm5,%xmm1 - movdqu 48(%rsi),%xmm5 - leaq 64(%rsi),%rsi - pxor %xmm4,%xmm2 - pxor %xmm5,%xmm3 - - movdqu %xmm0,0(%rdi) - movdqu %xmm1,16(%rdi) - movdqu %xmm2,32(%rdi) - movdqu %xmm3,48(%rdi) - leaq 64(%rdi),%rdi - - subq $64,%rdx - jnz L$oop_outer_ssse3 - - jmp L$done_ssse3 - -.p2align 4 -L$tail_ssse3: - movdqa %xmm0,0(%rsp) - movdqa %xmm1,16(%rsp) - movdqa %xmm2,32(%rsp) - movdqa %xmm3,48(%rsp) - xorq %r8,%r8 - -L$oop_tail_ssse3: - movzbl (%rsi,%r8,1),%eax - movzbl (%rsp,%r8,1),%ecx - leaq 1(%r8),%r8 - xorl %ecx,%eax - movb %al,-1(%rdi,%r8,1) - decq %rdx - jnz L$oop_tail_ssse3 - -L$done_ssse3: - leaq (%r9),%rsp - -L$ssse3_epilogue: - .byte 0xf3,0xc3 - - - -.p2align 5 -ChaCha20_4x: -L$ChaCha20_4x: - - movq %rsp,%r9 - - movq %r10,%r11 - shrq $32,%r10 - testq $32,%r10 - jnz L$ChaCha20_8x - cmpq $192,%rdx - ja L$proceed4x - - andq $71303168,%r11 - cmpq $4194304,%r11 - je L$do_sse3_after_all - -L$proceed4x: - subq $0x140+8,%rsp - movdqa L$sigma(%rip),%xmm11 - movdqu (%rcx),%xmm15 - movdqu 16(%rcx),%xmm7 - movdqu (%r8),%xmm3 - leaq 256(%rsp),%rcx - leaq L$rot16(%rip),%r10 - leaq L$rot24(%rip),%r11 - - pshufd $0x00,%xmm11,%xmm8 - pshufd $0x55,%xmm11,%xmm9 - movdqa %xmm8,64(%rsp) - pshufd $0xaa,%xmm11,%xmm10 - movdqa %xmm9,80(%rsp) - pshufd $0xff,%xmm11,%xmm11 - movdqa %xmm10,96(%rsp) - movdqa %xmm11,112(%rsp) - - pshufd $0x00,%xmm15,%xmm12 - pshufd $0x55,%xmm15,%xmm13 - movdqa %xmm12,128-256(%rcx) - pshufd $0xaa,%xmm15,%xmm14 - movdqa %xmm13,144-256(%rcx) - pshufd $0xff,%xmm15,%xmm15 - movdqa %xmm14,160-256(%rcx) - movdqa %xmm15,176-256(%rcx) - - pshufd $0x00,%xmm7,%xmm4 - pshufd $0x55,%xmm7,%xmm5 - movdqa %xmm4,192-256(%rcx) - pshufd $0xaa,%xmm7,%xmm6 - movdqa %xmm5,208-256(%rcx) - pshufd $0xff,%xmm7,%xmm7 - movdqa %xmm6,224-256(%rcx) - movdqa %xmm7,240-256(%rcx) - - pshufd $0x00,%xmm3,%xmm0 - pshufd $0x55,%xmm3,%xmm1 - paddd L$inc(%rip),%xmm0 - pshufd $0xaa,%xmm3,%xmm2 - movdqa %xmm1,272-256(%rcx) - pshufd $0xff,%xmm3,%xmm3 - movdqa %xmm2,288-256(%rcx) - movdqa %xmm3,304-256(%rcx) - - jmp L$oop_enter4x - -.p2align 5 -L$oop_outer4x: - movdqa 64(%rsp),%xmm8 - movdqa 80(%rsp),%xmm9 - movdqa 96(%rsp),%xmm10 - movdqa 112(%rsp),%xmm11 - movdqa 128-256(%rcx),%xmm12 - movdqa 144-256(%rcx),%xmm13 - movdqa 160-256(%rcx),%xmm14 - movdqa 176-256(%rcx),%xmm15 - movdqa 192-256(%rcx),%xmm4 - movdqa 208-256(%rcx),%xmm5 - movdqa 224-256(%rcx),%xmm6 - movdqa 240-256(%rcx),%xmm7 - movdqa 256-256(%rcx),%xmm0 - movdqa 272-256(%rcx),%xmm1 - movdqa 288-256(%rcx),%xmm2 - movdqa 304-256(%rcx),%xmm3 - paddd L$four(%rip),%xmm0 - -L$oop_enter4x: - movdqa %xmm6,32(%rsp) - movdqa %xmm7,48(%rsp) - movdqa (%r10),%xmm7 - movl $10,%eax - movdqa %xmm0,256-256(%rcx) - jmp L$oop4x - -.p2align 5 -L$oop4x: - paddd %xmm12,%xmm8 - paddd %xmm13,%xmm9 - pxor %xmm8,%xmm0 - pxor %xmm9,%xmm1 -.byte 102,15,56,0,199 -.byte 102,15,56,0,207 - paddd %xmm0,%xmm4 - paddd %xmm1,%xmm5 - pxor %xmm4,%xmm12 - pxor %xmm5,%xmm13 - movdqa %xmm12,%xmm6 - pslld $12,%xmm12 - psrld $20,%xmm6 - movdqa %xmm13,%xmm7 - pslld $12,%xmm13 - por %xmm6,%xmm12 - psrld $20,%xmm7 - movdqa (%r11),%xmm6 - por %xmm7,%xmm13 - paddd %xmm12,%xmm8 - paddd %xmm13,%xmm9 - pxor %xmm8,%xmm0 - pxor %xmm9,%xmm1 -.byte 102,15,56,0,198 -.byte 102,15,56,0,206 - paddd %xmm0,%xmm4 - paddd %xmm1,%xmm5 - pxor %xmm4,%xmm12 - pxor %xmm5,%xmm13 - movdqa %xmm12,%xmm7 - pslld $7,%xmm12 - psrld $25,%xmm7 - movdqa %xmm13,%xmm6 - pslld $7,%xmm13 - por %xmm7,%xmm12 - psrld $25,%xmm6 - movdqa (%r10),%xmm7 - por %xmm6,%xmm13 - movdqa %xmm4,0(%rsp) - movdqa %xmm5,16(%rsp) - movdqa 32(%rsp),%xmm4 - movdqa 48(%rsp),%xmm5 - paddd %xmm14,%xmm10 - paddd %xmm15,%xmm11 - pxor %xmm10,%xmm2 - pxor %xmm11,%xmm3 -.byte 102,15,56,0,215 -.byte 102,15,56,0,223 - paddd %xmm2,%xmm4 - paddd %xmm3,%xmm5 - pxor %xmm4,%xmm14 - pxor %xmm5,%xmm15 - movdqa %xmm14,%xmm6 - pslld $12,%xmm14 - psrld $20,%xmm6 - movdqa %xmm15,%xmm7 - pslld $12,%xmm15 - por %xmm6,%xmm14 - psrld $20,%xmm7 - movdqa (%r11),%xmm6 - por %xmm7,%xmm15 - paddd %xmm14,%xmm10 - paddd %xmm15,%xmm11 - pxor %xmm10,%xmm2 - pxor %xmm11,%xmm3 -.byte 102,15,56,0,214 -.byte 102,15,56,0,222 - paddd %xmm2,%xmm4 - paddd %xmm3,%xmm5 - pxor %xmm4,%xmm14 - pxor %xmm5,%xmm15 - movdqa %xmm14,%xmm7 - pslld $7,%xmm14 - psrld $25,%xmm7 - movdqa %xmm15,%xmm6 - pslld $7,%xmm15 - por %xmm7,%xmm14 - psrld $25,%xmm6 - movdqa (%r10),%xmm7 - por %xmm6,%xmm15 - paddd %xmm13,%xmm8 - paddd %xmm14,%xmm9 - pxor %xmm8,%xmm3 - pxor %xmm9,%xmm0 -.byte 102,15,56,0,223 -.byte 102,15,56,0,199 - paddd %xmm3,%xmm4 - paddd %xmm0,%xmm5 - pxor %xmm4,%xmm13 - pxor %xmm5,%xmm14 - movdqa %xmm13,%xmm6 - pslld $12,%xmm13 - psrld $20,%xmm6 - movdqa %xmm14,%xmm7 - pslld $12,%xmm14 - por %xmm6,%xmm13 - psrld $20,%xmm7 - movdqa (%r11),%xmm6 - por %xmm7,%xmm14 - paddd %xmm13,%xmm8 - paddd %xmm14,%xmm9 - pxor %xmm8,%xmm3 - pxor %xmm9,%xmm0 -.byte 102,15,56,0,222 -.byte 102,15,56,0,198 - paddd %xmm3,%xmm4 - paddd %xmm0,%xmm5 - pxor %xmm4,%xmm13 - pxor %xmm5,%xmm14 - movdqa %xmm13,%xmm7 - pslld $7,%xmm13 - psrld $25,%xmm7 - movdqa %xmm14,%xmm6 - pslld $7,%xmm14 - por %xmm7,%xmm13 - psrld $25,%xmm6 - movdqa (%r10),%xmm7 - por %xmm6,%xmm14 - movdqa %xmm4,32(%rsp) - movdqa %xmm5,48(%rsp) - movdqa 0(%rsp),%xmm4 - movdqa 16(%rsp),%xmm5 - paddd %xmm15,%xmm10 - paddd %xmm12,%xmm11 - pxor %xmm10,%xmm1 - pxor %xmm11,%xmm2 -.byte 102,15,56,0,207 -.byte 102,15,56,0,215 - paddd %xmm1,%xmm4 - paddd %xmm2,%xmm5 - pxor %xmm4,%xmm15 - pxor %xmm5,%xmm12 - movdqa %xmm15,%xmm6 - pslld $12,%xmm15 - psrld $20,%xmm6 - movdqa %xmm12,%xmm7 - pslld $12,%xmm12 - por %xmm6,%xmm15 - psrld $20,%xmm7 - movdqa (%r11),%xmm6 - por %xmm7,%xmm12 - paddd %xmm15,%xmm10 - paddd %xmm12,%xmm11 - pxor %xmm10,%xmm1 - pxor %xmm11,%xmm2 -.byte 102,15,56,0,206 -.byte 102,15,56,0,214 - paddd %xmm1,%xmm4 - paddd %xmm2,%xmm5 - pxor %xmm4,%xmm15 - pxor %xmm5,%xmm12 - movdqa %xmm15,%xmm7 - pslld $7,%xmm15 - psrld $25,%xmm7 - movdqa %xmm12,%xmm6 - pslld $7,%xmm12 - por %xmm7,%xmm15 - psrld $25,%xmm6 - movdqa (%r10),%xmm7 - por %xmm6,%xmm12 - decl %eax - jnz L$oop4x - - paddd 64(%rsp),%xmm8 - paddd 80(%rsp),%xmm9 - paddd 96(%rsp),%xmm10 - paddd 112(%rsp),%xmm11 - - movdqa %xmm8,%xmm6 - punpckldq %xmm9,%xmm8 - movdqa %xmm10,%xmm7 - punpckldq %xmm11,%xmm10 - punpckhdq %xmm9,%xmm6 - punpckhdq %xmm11,%xmm7 - movdqa %xmm8,%xmm9 - punpcklqdq %xmm10,%xmm8 - movdqa %xmm6,%xmm11 - punpcklqdq %xmm7,%xmm6 - punpckhqdq %xmm10,%xmm9 - punpckhqdq %xmm7,%xmm11 - paddd 128-256(%rcx),%xmm12 - paddd 144-256(%rcx),%xmm13 - paddd 160-256(%rcx),%xmm14 - paddd 176-256(%rcx),%xmm15 - - movdqa %xmm8,0(%rsp) - movdqa %xmm9,16(%rsp) - movdqa 32(%rsp),%xmm8 - movdqa 48(%rsp),%xmm9 - - movdqa %xmm12,%xmm10 - punpckldq %xmm13,%xmm12 - movdqa %xmm14,%xmm7 - punpckldq %xmm15,%xmm14 - punpckhdq %xmm13,%xmm10 - punpckhdq %xmm15,%xmm7 - movdqa %xmm12,%xmm13 - punpcklqdq %xmm14,%xmm12 - movdqa %xmm10,%xmm15 - punpcklqdq %xmm7,%xmm10 - punpckhqdq %xmm14,%xmm13 - punpckhqdq %xmm7,%xmm15 - paddd 192-256(%rcx),%xmm4 - paddd 208-256(%rcx),%xmm5 - paddd 224-256(%rcx),%xmm8 - paddd 240-256(%rcx),%xmm9 - - movdqa %xmm6,32(%rsp) - movdqa %xmm11,48(%rsp) - - movdqa %xmm4,%xmm14 - punpckldq %xmm5,%xmm4 - movdqa %xmm8,%xmm7 - punpckldq %xmm9,%xmm8 - punpckhdq %xmm5,%xmm14 - punpckhdq %xmm9,%xmm7 - movdqa %xmm4,%xmm5 - punpcklqdq %xmm8,%xmm4 - movdqa %xmm14,%xmm9 - punpcklqdq %xmm7,%xmm14 - punpckhqdq %xmm8,%xmm5 - punpckhqdq %xmm7,%xmm9 - paddd 256-256(%rcx),%xmm0 - paddd 272-256(%rcx),%xmm1 - paddd 288-256(%rcx),%xmm2 - paddd 304-256(%rcx),%xmm3 - - movdqa %xmm0,%xmm8 - punpckldq %xmm1,%xmm0 - movdqa %xmm2,%xmm7 - punpckldq %xmm3,%xmm2 - punpckhdq %xmm1,%xmm8 - punpckhdq %xmm3,%xmm7 - movdqa %xmm0,%xmm1 - punpcklqdq %xmm2,%xmm0 - movdqa %xmm8,%xmm3 - punpcklqdq %xmm7,%xmm8 - punpckhqdq %xmm2,%xmm1 - punpckhqdq %xmm7,%xmm3 - cmpq $256,%rdx - jb L$tail4x - - movdqu 0(%rsi),%xmm6 - movdqu 16(%rsi),%xmm11 - movdqu 32(%rsi),%xmm2 - movdqu 48(%rsi),%xmm7 - pxor 0(%rsp),%xmm6 - pxor %xmm12,%xmm11 - pxor %xmm4,%xmm2 - pxor %xmm0,%xmm7 - - movdqu %xmm6,0(%rdi) - movdqu 64(%rsi),%xmm6 - movdqu %xmm11,16(%rdi) - movdqu 80(%rsi),%xmm11 - movdqu %xmm2,32(%rdi) - movdqu 96(%rsi),%xmm2 - movdqu %xmm7,48(%rdi) - movdqu 112(%rsi),%xmm7 - leaq 128(%rsi),%rsi - pxor 16(%rsp),%xmm6 - pxor %xmm13,%xmm11 - pxor %xmm5,%xmm2 - pxor %xmm1,%xmm7 - - movdqu %xmm6,64(%rdi) - movdqu 0(%rsi),%xmm6 - movdqu %xmm11,80(%rdi) - movdqu 16(%rsi),%xmm11 - movdqu %xmm2,96(%rdi) - movdqu 32(%rsi),%xmm2 - movdqu %xmm7,112(%rdi) - leaq 128(%rdi),%rdi - movdqu 48(%rsi),%xmm7 - pxor 32(%rsp),%xmm6 - pxor %xmm10,%xmm11 - pxor %xmm14,%xmm2 - pxor %xmm8,%xmm7 - - movdqu %xmm6,0(%rdi) - movdqu 64(%rsi),%xmm6 - movdqu %xmm11,16(%rdi) - movdqu 80(%rsi),%xmm11 - movdqu %xmm2,32(%rdi) - movdqu 96(%rsi),%xmm2 - movdqu %xmm7,48(%rdi) - movdqu 112(%rsi),%xmm7 - leaq 128(%rsi),%rsi - pxor 48(%rsp),%xmm6 - pxor %xmm15,%xmm11 - pxor %xmm9,%xmm2 - pxor %xmm3,%xmm7 - movdqu %xmm6,64(%rdi) - movdqu %xmm11,80(%rdi) - movdqu %xmm2,96(%rdi) - movdqu %xmm7,112(%rdi) - leaq 128(%rdi),%rdi - - subq $256,%rdx - jnz L$oop_outer4x - - jmp L$done4x - -L$tail4x: - cmpq $192,%rdx - jae L$192_or_more4x - cmpq $128,%rdx - jae L$128_or_more4x - cmpq $64,%rdx - jae L$64_or_more4x - - - xorq %r10,%r10 - - movdqa %xmm12,16(%rsp) - movdqa %xmm4,32(%rsp) - movdqa %xmm0,48(%rsp) - jmp L$oop_tail4x - -.p2align 5 -L$64_or_more4x: - movdqu 0(%rsi),%xmm6 - movdqu 16(%rsi),%xmm11 - movdqu 32(%rsi),%xmm2 - movdqu 48(%rsi),%xmm7 - pxor 0(%rsp),%xmm6 - pxor %xmm12,%xmm11 - pxor %xmm4,%xmm2 - pxor %xmm0,%xmm7 - movdqu %xmm6,0(%rdi) - movdqu %xmm11,16(%rdi) - movdqu %xmm2,32(%rdi) - movdqu %xmm7,48(%rdi) - je L$done4x - - movdqa 16(%rsp),%xmm6 - leaq 64(%rsi),%rsi - xorq %r10,%r10 - movdqa %xmm6,0(%rsp) - movdqa %xmm13,16(%rsp) - leaq 64(%rdi),%rdi - movdqa %xmm5,32(%rsp) - subq $64,%rdx - movdqa %xmm1,48(%rsp) - jmp L$oop_tail4x - -.p2align 5 -L$128_or_more4x: - movdqu 0(%rsi),%xmm6 - movdqu 16(%rsi),%xmm11 - movdqu 32(%rsi),%xmm2 - movdqu 48(%rsi),%xmm7 - pxor 0(%rsp),%xmm6 - pxor %xmm12,%xmm11 - pxor %xmm4,%xmm2 - pxor %xmm0,%xmm7 - - movdqu %xmm6,0(%rdi) - movdqu 64(%rsi),%xmm6 - movdqu %xmm11,16(%rdi) - movdqu 80(%rsi),%xmm11 - movdqu %xmm2,32(%rdi) - movdqu 96(%rsi),%xmm2 - movdqu %xmm7,48(%rdi) - movdqu 112(%rsi),%xmm7 - pxor 16(%rsp),%xmm6 - pxor %xmm13,%xmm11 - pxor %xmm5,%xmm2 - pxor %xmm1,%xmm7 - movdqu %xmm6,64(%rdi) - movdqu %xmm11,80(%rdi) - movdqu %xmm2,96(%rdi) - movdqu %xmm7,112(%rdi) - je L$done4x - - movdqa 32(%rsp),%xmm6 - leaq 128(%rsi),%rsi - xorq %r10,%r10 - movdqa %xmm6,0(%rsp) - movdqa %xmm10,16(%rsp) - leaq 128(%rdi),%rdi - movdqa %xmm14,32(%rsp) - subq $128,%rdx - movdqa %xmm8,48(%rsp) - jmp L$oop_tail4x - -.p2align 5 -L$192_or_more4x: - movdqu 0(%rsi),%xmm6 - movdqu 16(%rsi),%xmm11 - movdqu 32(%rsi),%xmm2 - movdqu 48(%rsi),%xmm7 - pxor 0(%rsp),%xmm6 - pxor %xmm12,%xmm11 - pxor %xmm4,%xmm2 - pxor %xmm0,%xmm7 - - movdqu %xmm6,0(%rdi) - movdqu 64(%rsi),%xmm6 - movdqu %xmm11,16(%rdi) - movdqu 80(%rsi),%xmm11 - movdqu %xmm2,32(%rdi) - movdqu 96(%rsi),%xmm2 - movdqu %xmm7,48(%rdi) - movdqu 112(%rsi),%xmm7 - leaq 128(%rsi),%rsi - pxor 16(%rsp),%xmm6 - pxor %xmm13,%xmm11 - pxor %xmm5,%xmm2 - pxor %xmm1,%xmm7 - - movdqu %xmm6,64(%rdi) - movdqu 0(%rsi),%xmm6 - movdqu %xmm11,80(%rdi) - movdqu 16(%rsi),%xmm11 - movdqu %xmm2,96(%rdi) - movdqu 32(%rsi),%xmm2 - movdqu %xmm7,112(%rdi) - leaq 128(%rdi),%rdi - movdqu 48(%rsi),%xmm7 - pxor 32(%rsp),%xmm6 - pxor %xmm10,%xmm11 - pxor %xmm14,%xmm2 - pxor %xmm8,%xmm7 - movdqu %xmm6,0(%rdi) - movdqu %xmm11,16(%rdi) - movdqu %xmm2,32(%rdi) - movdqu %xmm7,48(%rdi) - je L$done4x - - movdqa 48(%rsp),%xmm6 - leaq 64(%rsi),%rsi - xorq %r10,%r10 - movdqa %xmm6,0(%rsp) - movdqa %xmm15,16(%rsp) - leaq 64(%rdi),%rdi - movdqa %xmm9,32(%rsp) - subq $192,%rdx - movdqa %xmm3,48(%rsp) - -L$oop_tail4x: - movzbl (%rsi,%r10,1),%eax - movzbl (%rsp,%r10,1),%ecx - leaq 1(%r10),%r10 - xorl %ecx,%eax - movb %al,-1(%rdi,%r10,1) - decq %rdx - jnz L$oop_tail4x - -L$done4x: - leaq (%r9),%rsp - -L$4x_epilogue: - .byte 0xf3,0xc3 - - - -.p2align 5 -ChaCha20_8x: -L$ChaCha20_8x: - - movq %rsp,%r9 - - subq $0x280+8,%rsp - andq $-32,%rsp - vzeroupper - - - - - - - - - - - vbroadcasti128 L$sigma(%rip),%ymm11 - vbroadcasti128 (%rcx),%ymm3 - vbroadcasti128 16(%rcx),%ymm15 - vbroadcasti128 (%r8),%ymm7 - leaq 256(%rsp),%rcx - leaq 512(%rsp),%rax - leaq L$rot16(%rip),%r10 - leaq L$rot24(%rip),%r11 - - vpshufd $0x00,%ymm11,%ymm8 - vpshufd $0x55,%ymm11,%ymm9 - vmovdqa %ymm8,128-256(%rcx) - vpshufd $0xaa,%ymm11,%ymm10 - vmovdqa %ymm9,160-256(%rcx) - vpshufd $0xff,%ymm11,%ymm11 - vmovdqa %ymm10,192-256(%rcx) - vmovdqa %ymm11,224-256(%rcx) - - vpshufd $0x00,%ymm3,%ymm0 - vpshufd $0x55,%ymm3,%ymm1 - vmovdqa %ymm0,256-256(%rcx) - vpshufd $0xaa,%ymm3,%ymm2 - vmovdqa %ymm1,288-256(%rcx) - vpshufd $0xff,%ymm3,%ymm3 - vmovdqa %ymm2,320-256(%rcx) - vmovdqa %ymm3,352-256(%rcx) - - vpshufd $0x00,%ymm15,%ymm12 - vpshufd $0x55,%ymm15,%ymm13 - vmovdqa %ymm12,384-512(%rax) - vpshufd $0xaa,%ymm15,%ymm14 - vmovdqa %ymm13,416-512(%rax) - vpshufd $0xff,%ymm15,%ymm15 - vmovdqa %ymm14,448-512(%rax) - vmovdqa %ymm15,480-512(%rax) - - vpshufd $0x00,%ymm7,%ymm4 - vpshufd $0x55,%ymm7,%ymm5 - vpaddd L$incy(%rip),%ymm4,%ymm4 - vpshufd $0xaa,%ymm7,%ymm6 - vmovdqa %ymm5,544-512(%rax) - vpshufd $0xff,%ymm7,%ymm7 - vmovdqa %ymm6,576-512(%rax) - vmovdqa %ymm7,608-512(%rax) - - jmp L$oop_enter8x - -.p2align 5 -L$oop_outer8x: - vmovdqa 128-256(%rcx),%ymm8 - vmovdqa 160-256(%rcx),%ymm9 - vmovdqa 192-256(%rcx),%ymm10 - vmovdqa 224-256(%rcx),%ymm11 - vmovdqa 256-256(%rcx),%ymm0 - vmovdqa 288-256(%rcx),%ymm1 - vmovdqa 320-256(%rcx),%ymm2 - vmovdqa 352-256(%rcx),%ymm3 - vmovdqa 384-512(%rax),%ymm12 - vmovdqa 416-512(%rax),%ymm13 - vmovdqa 448-512(%rax),%ymm14 - vmovdqa 480-512(%rax),%ymm15 - vmovdqa 512-512(%rax),%ymm4 - vmovdqa 544-512(%rax),%ymm5 - vmovdqa 576-512(%rax),%ymm6 - vmovdqa 608-512(%rax),%ymm7 - vpaddd L$eight(%rip),%ymm4,%ymm4 - -L$oop_enter8x: - vmovdqa %ymm14,64(%rsp) - vmovdqa %ymm15,96(%rsp) - vbroadcasti128 (%r10),%ymm15 - vmovdqa %ymm4,512-512(%rax) - movl $10,%eax - jmp L$oop8x - -.p2align 5 -L$oop8x: - vpaddd %ymm0,%ymm8,%ymm8 - vpxor %ymm4,%ymm8,%ymm4 - vpshufb %ymm15,%ymm4,%ymm4 - vpaddd %ymm1,%ymm9,%ymm9 - vpxor %ymm5,%ymm9,%ymm5 - vpshufb %ymm15,%ymm5,%ymm5 - vpaddd %ymm4,%ymm12,%ymm12 - vpxor %ymm0,%ymm12,%ymm0 - vpslld $12,%ymm0,%ymm14 - vpsrld $20,%ymm0,%ymm0 - vpor %ymm0,%ymm14,%ymm0 - vbroadcasti128 (%r11),%ymm14 - vpaddd %ymm5,%ymm13,%ymm13 - vpxor %ymm1,%ymm13,%ymm1 - vpslld $12,%ymm1,%ymm15 - vpsrld $20,%ymm1,%ymm1 - vpor %ymm1,%ymm15,%ymm1 - vpaddd %ymm0,%ymm8,%ymm8 - vpxor %ymm4,%ymm8,%ymm4 - vpshufb %ymm14,%ymm4,%ymm4 - vpaddd %ymm1,%ymm9,%ymm9 - vpxor %ymm5,%ymm9,%ymm5 - vpshufb %ymm14,%ymm5,%ymm5 - vpaddd %ymm4,%ymm12,%ymm12 - vpxor %ymm0,%ymm12,%ymm0 - vpslld $7,%ymm0,%ymm15 - vpsrld $25,%ymm0,%ymm0 - vpor %ymm0,%ymm15,%ymm0 - vbroadcasti128 (%r10),%ymm15 - vpaddd %ymm5,%ymm13,%ymm13 - vpxor %ymm1,%ymm13,%ymm1 - vpslld $7,%ymm1,%ymm14 - vpsrld $25,%ymm1,%ymm1 - vpor %ymm1,%ymm14,%ymm1 - vmovdqa %ymm12,0(%rsp) - vmovdqa %ymm13,32(%rsp) - vmovdqa 64(%rsp),%ymm12 - vmovdqa 96(%rsp),%ymm13 - vpaddd %ymm2,%ymm10,%ymm10 - vpxor %ymm6,%ymm10,%ymm6 - vpshufb %ymm15,%ymm6,%ymm6 - vpaddd %ymm3,%ymm11,%ymm11 - vpxor %ymm7,%ymm11,%ymm7 - vpshufb %ymm15,%ymm7,%ymm7 - vpaddd %ymm6,%ymm12,%ymm12 - vpxor %ymm2,%ymm12,%ymm2 - vpslld $12,%ymm2,%ymm14 - vpsrld $20,%ymm2,%ymm2 - vpor %ymm2,%ymm14,%ymm2 - vbroadcasti128 (%r11),%ymm14 - vpaddd %ymm7,%ymm13,%ymm13 - vpxor %ymm3,%ymm13,%ymm3 - vpslld $12,%ymm3,%ymm15 - vpsrld $20,%ymm3,%ymm3 - vpor %ymm3,%ymm15,%ymm3 - vpaddd %ymm2,%ymm10,%ymm10 - vpxor %ymm6,%ymm10,%ymm6 - vpshufb %ymm14,%ymm6,%ymm6 - vpaddd %ymm3,%ymm11,%ymm11 - vpxor %ymm7,%ymm11,%ymm7 - vpshufb %ymm14,%ymm7,%ymm7 - vpaddd %ymm6,%ymm12,%ymm12 - vpxor %ymm2,%ymm12,%ymm2 - vpslld $7,%ymm2,%ymm15 - vpsrld $25,%ymm2,%ymm2 - vpor %ymm2,%ymm15,%ymm2 - vbroadcasti128 (%r10),%ymm15 - vpaddd %ymm7,%ymm13,%ymm13 - vpxor %ymm3,%ymm13,%ymm3 - vpslld $7,%ymm3,%ymm14 - vpsrld $25,%ymm3,%ymm3 - vpor %ymm3,%ymm14,%ymm3 - vpaddd %ymm1,%ymm8,%ymm8 - vpxor %ymm7,%ymm8,%ymm7 - vpshufb %ymm15,%ymm7,%ymm7 - vpaddd %ymm2,%ymm9,%ymm9 - vpxor %ymm4,%ymm9,%ymm4 - vpshufb %ymm15,%ymm4,%ymm4 - vpaddd %ymm7,%ymm12,%ymm12 - vpxor %ymm1,%ymm12,%ymm1 - vpslld $12,%ymm1,%ymm14 - vpsrld $20,%ymm1,%ymm1 - vpor %ymm1,%ymm14,%ymm1 - vbroadcasti128 (%r11),%ymm14 - vpaddd %ymm4,%ymm13,%ymm13 - vpxor %ymm2,%ymm13,%ymm2 - vpslld $12,%ymm2,%ymm15 - vpsrld $20,%ymm2,%ymm2 - vpor %ymm2,%ymm15,%ymm2 - vpaddd %ymm1,%ymm8,%ymm8 - vpxor %ymm7,%ymm8,%ymm7 - vpshufb %ymm14,%ymm7,%ymm7 - vpaddd %ymm2,%ymm9,%ymm9 - vpxor %ymm4,%ymm9,%ymm4 - vpshufb %ymm14,%ymm4,%ymm4 - vpaddd %ymm7,%ymm12,%ymm12 - vpxor %ymm1,%ymm12,%ymm1 - vpslld $7,%ymm1,%ymm15 - vpsrld $25,%ymm1,%ymm1 - vpor %ymm1,%ymm15,%ymm1 - vbroadcasti128 (%r10),%ymm15 - vpaddd %ymm4,%ymm13,%ymm13 - vpxor %ymm2,%ymm13,%ymm2 - vpslld $7,%ymm2,%ymm14 - vpsrld $25,%ymm2,%ymm2 - vpor %ymm2,%ymm14,%ymm2 - vmovdqa %ymm12,64(%rsp) - vmovdqa %ymm13,96(%rsp) - vmovdqa 0(%rsp),%ymm12 - vmovdqa 32(%rsp),%ymm13 - vpaddd %ymm3,%ymm10,%ymm10 - vpxor %ymm5,%ymm10,%ymm5 - vpshufb %ymm15,%ymm5,%ymm5 - vpaddd %ymm0,%ymm11,%ymm11 - vpxor %ymm6,%ymm11,%ymm6 - vpshufb %ymm15,%ymm6,%ymm6 - vpaddd %ymm5,%ymm12,%ymm12 - vpxor %ymm3,%ymm12,%ymm3 - vpslld $12,%ymm3,%ymm14 - vpsrld $20,%ymm3,%ymm3 - vpor %ymm3,%ymm14,%ymm3 - vbroadcasti128 (%r11),%ymm14 - vpaddd %ymm6,%ymm13,%ymm13 - vpxor %ymm0,%ymm13,%ymm0 - vpslld $12,%ymm0,%ymm15 - vpsrld $20,%ymm0,%ymm0 - vpor %ymm0,%ymm15,%ymm0 - vpaddd %ymm3,%ymm10,%ymm10 - vpxor %ymm5,%ymm10,%ymm5 - vpshufb %ymm14,%ymm5,%ymm5 - vpaddd %ymm0,%ymm11,%ymm11 - vpxor %ymm6,%ymm11,%ymm6 - vpshufb %ymm14,%ymm6,%ymm6 - vpaddd %ymm5,%ymm12,%ymm12 - vpxor %ymm3,%ymm12,%ymm3 - vpslld $7,%ymm3,%ymm15 - vpsrld $25,%ymm3,%ymm3 - vpor %ymm3,%ymm15,%ymm3 - vbroadcasti128 (%r10),%ymm15 - vpaddd %ymm6,%ymm13,%ymm13 - vpxor %ymm0,%ymm13,%ymm0 - vpslld $7,%ymm0,%ymm14 - vpsrld $25,%ymm0,%ymm0 - vpor %ymm0,%ymm14,%ymm0 - decl %eax - jnz L$oop8x - - leaq 512(%rsp),%rax - vpaddd 128-256(%rcx),%ymm8,%ymm8 - vpaddd 160-256(%rcx),%ymm9,%ymm9 - vpaddd 192-256(%rcx),%ymm10,%ymm10 - vpaddd 224-256(%rcx),%ymm11,%ymm11 - - vpunpckldq %ymm9,%ymm8,%ymm14 - vpunpckldq %ymm11,%ymm10,%ymm15 - vpunpckhdq %ymm9,%ymm8,%ymm8 - vpunpckhdq %ymm11,%ymm10,%ymm10 - vpunpcklqdq %ymm15,%ymm14,%ymm9 - vpunpckhqdq %ymm15,%ymm14,%ymm14 - vpunpcklqdq %ymm10,%ymm8,%ymm11 - vpunpckhqdq %ymm10,%ymm8,%ymm8 - vpaddd 256-256(%rcx),%ymm0,%ymm0 - vpaddd 288-256(%rcx),%ymm1,%ymm1 - vpaddd 320-256(%rcx),%ymm2,%ymm2 - vpaddd 352-256(%rcx),%ymm3,%ymm3 - - vpunpckldq %ymm1,%ymm0,%ymm10 - vpunpckldq %ymm3,%ymm2,%ymm15 - vpunpckhdq %ymm1,%ymm0,%ymm0 - vpunpckhdq %ymm3,%ymm2,%ymm2 - vpunpcklqdq %ymm15,%ymm10,%ymm1 - vpunpckhqdq %ymm15,%ymm10,%ymm10 - vpunpcklqdq %ymm2,%ymm0,%ymm3 - vpunpckhqdq %ymm2,%ymm0,%ymm0 - vperm2i128 $0x20,%ymm1,%ymm9,%ymm15 - vperm2i128 $0x31,%ymm1,%ymm9,%ymm1 - vperm2i128 $0x20,%ymm10,%ymm14,%ymm9 - vperm2i128 $0x31,%ymm10,%ymm14,%ymm10 - vperm2i128 $0x20,%ymm3,%ymm11,%ymm14 - vperm2i128 $0x31,%ymm3,%ymm11,%ymm3 - vperm2i128 $0x20,%ymm0,%ymm8,%ymm11 - vperm2i128 $0x31,%ymm0,%ymm8,%ymm0 - vmovdqa %ymm15,0(%rsp) - vmovdqa %ymm9,32(%rsp) - vmovdqa 64(%rsp),%ymm15 - vmovdqa 96(%rsp),%ymm9 - - vpaddd 384-512(%rax),%ymm12,%ymm12 - vpaddd 416-512(%rax),%ymm13,%ymm13 - vpaddd 448-512(%rax),%ymm15,%ymm15 - vpaddd 480-512(%rax),%ymm9,%ymm9 - - vpunpckldq %ymm13,%ymm12,%ymm2 - vpunpckldq %ymm9,%ymm15,%ymm8 - vpunpckhdq %ymm13,%ymm12,%ymm12 - vpunpckhdq %ymm9,%ymm15,%ymm15 - vpunpcklqdq %ymm8,%ymm2,%ymm13 - vpunpckhqdq %ymm8,%ymm2,%ymm2 - vpunpcklqdq %ymm15,%ymm12,%ymm9 - vpunpckhqdq %ymm15,%ymm12,%ymm12 - vpaddd 512-512(%rax),%ymm4,%ymm4 - vpaddd 544-512(%rax),%ymm5,%ymm5 - vpaddd 576-512(%rax),%ymm6,%ymm6 - vpaddd 608-512(%rax),%ymm7,%ymm7 - - vpunpckldq %ymm5,%ymm4,%ymm15 - vpunpckldq %ymm7,%ymm6,%ymm8 - vpunpckhdq %ymm5,%ymm4,%ymm4 - vpunpckhdq %ymm7,%ymm6,%ymm6 - vpunpcklqdq %ymm8,%ymm15,%ymm5 - vpunpckhqdq %ymm8,%ymm15,%ymm15 - vpunpcklqdq %ymm6,%ymm4,%ymm7 - vpunpckhqdq %ymm6,%ymm4,%ymm4 - vperm2i128 $0x20,%ymm5,%ymm13,%ymm8 - vperm2i128 $0x31,%ymm5,%ymm13,%ymm5 - vperm2i128 $0x20,%ymm15,%ymm2,%ymm13 - vperm2i128 $0x31,%ymm15,%ymm2,%ymm15 - vperm2i128 $0x20,%ymm7,%ymm9,%ymm2 - vperm2i128 $0x31,%ymm7,%ymm9,%ymm7 - vperm2i128 $0x20,%ymm4,%ymm12,%ymm9 - vperm2i128 $0x31,%ymm4,%ymm12,%ymm4 - vmovdqa 0(%rsp),%ymm6 - vmovdqa 32(%rsp),%ymm12 - - cmpq $512,%rdx - jb L$tail8x - - vpxor 0(%rsi),%ymm6,%ymm6 - vpxor 32(%rsi),%ymm8,%ymm8 - vpxor 64(%rsi),%ymm1,%ymm1 - vpxor 96(%rsi),%ymm5,%ymm5 - leaq 128(%rsi),%rsi - vmovdqu %ymm6,0(%rdi) - vmovdqu %ymm8,32(%rdi) - vmovdqu %ymm1,64(%rdi) - vmovdqu %ymm5,96(%rdi) - leaq 128(%rdi),%rdi - - vpxor 0(%rsi),%ymm12,%ymm12 - vpxor 32(%rsi),%ymm13,%ymm13 - vpxor 64(%rsi),%ymm10,%ymm10 - vpxor 96(%rsi),%ymm15,%ymm15 - leaq 128(%rsi),%rsi - vmovdqu %ymm12,0(%rdi) - vmovdqu %ymm13,32(%rdi) - vmovdqu %ymm10,64(%rdi) - vmovdqu %ymm15,96(%rdi) - leaq 128(%rdi),%rdi - - vpxor 0(%rsi),%ymm14,%ymm14 - vpxor 32(%rsi),%ymm2,%ymm2 - vpxor 64(%rsi),%ymm3,%ymm3 - vpxor 96(%rsi),%ymm7,%ymm7 - leaq 128(%rsi),%rsi - vmovdqu %ymm14,0(%rdi) - vmovdqu %ymm2,32(%rdi) - vmovdqu %ymm3,64(%rdi) - vmovdqu %ymm7,96(%rdi) - leaq 128(%rdi),%rdi - - vpxor 0(%rsi),%ymm11,%ymm11 - vpxor 32(%rsi),%ymm9,%ymm9 - vpxor 64(%rsi),%ymm0,%ymm0 - vpxor 96(%rsi),%ymm4,%ymm4 - leaq 128(%rsi),%rsi - vmovdqu %ymm11,0(%rdi) - vmovdqu %ymm9,32(%rdi) - vmovdqu %ymm0,64(%rdi) - vmovdqu %ymm4,96(%rdi) - leaq 128(%rdi),%rdi - - subq $512,%rdx - jnz L$oop_outer8x - - jmp L$done8x - -L$tail8x: - cmpq $448,%rdx - jae L$448_or_more8x - cmpq $384,%rdx - jae L$384_or_more8x - cmpq $320,%rdx - jae L$320_or_more8x - cmpq $256,%rdx - jae L$256_or_more8x - cmpq $192,%rdx - jae L$192_or_more8x - cmpq $128,%rdx - jae L$128_or_more8x - cmpq $64,%rdx - jae L$64_or_more8x - - xorq %r10,%r10 - vmovdqa %ymm6,0(%rsp) - vmovdqa %ymm8,32(%rsp) - jmp L$oop_tail8x - -.p2align 5 -L$64_or_more8x: - vpxor 0(%rsi),%ymm6,%ymm6 - vpxor 32(%rsi),%ymm8,%ymm8 - vmovdqu %ymm6,0(%rdi) - vmovdqu %ymm8,32(%rdi) - je L$done8x - - leaq 64(%rsi),%rsi - xorq %r10,%r10 - vmovdqa %ymm1,0(%rsp) - leaq 64(%rdi),%rdi - subq $64,%rdx - vmovdqa %ymm5,32(%rsp) - jmp L$oop_tail8x - -.p2align 5 -L$128_or_more8x: - vpxor 0(%rsi),%ymm6,%ymm6 - vpxor 32(%rsi),%ymm8,%ymm8 - vpxor 64(%rsi),%ymm1,%ymm1 - vpxor 96(%rsi),%ymm5,%ymm5 - vmovdqu %ymm6,0(%rdi) - vmovdqu %ymm8,32(%rdi) - vmovdqu %ymm1,64(%rdi) - vmovdqu %ymm5,96(%rdi) - je L$done8x - - leaq 128(%rsi),%rsi - xorq %r10,%r10 - vmovdqa %ymm12,0(%rsp) - leaq 128(%rdi),%rdi - subq $128,%rdx - vmovdqa %ymm13,32(%rsp) - jmp L$oop_tail8x - -.p2align 5 -L$192_or_more8x: - vpxor 0(%rsi),%ymm6,%ymm6 - vpxor 32(%rsi),%ymm8,%ymm8 - vpxor 64(%rsi),%ymm1,%ymm1 - vpxor 96(%rsi),%ymm5,%ymm5 - vpxor 128(%rsi),%ymm12,%ymm12 - vpxor 160(%rsi),%ymm13,%ymm13 - vmovdqu %ymm6,0(%rdi) - vmovdqu %ymm8,32(%rdi) - vmovdqu %ymm1,64(%rdi) - vmovdqu %ymm5,96(%rdi) - vmovdqu %ymm12,128(%rdi) - vmovdqu %ymm13,160(%rdi) - je L$done8x - - leaq 192(%rsi),%rsi - xorq %r10,%r10 - vmovdqa %ymm10,0(%rsp) - leaq 192(%rdi),%rdi - subq $192,%rdx - vmovdqa %ymm15,32(%rsp) - jmp L$oop_tail8x - -.p2align 5 -L$256_or_more8x: - vpxor 0(%rsi),%ymm6,%ymm6 - vpxor 32(%rsi),%ymm8,%ymm8 - vpxor 64(%rsi),%ymm1,%ymm1 - vpxor 96(%rsi),%ymm5,%ymm5 - vpxor 128(%rsi),%ymm12,%ymm12 - vpxor 160(%rsi),%ymm13,%ymm13 - vpxor 192(%rsi),%ymm10,%ymm10 - vpxor 224(%rsi),%ymm15,%ymm15 - vmovdqu %ymm6,0(%rdi) - vmovdqu %ymm8,32(%rdi) - vmovdqu %ymm1,64(%rdi) - vmovdqu %ymm5,96(%rdi) - vmovdqu %ymm12,128(%rdi) - vmovdqu %ymm13,160(%rdi) - vmovdqu %ymm10,192(%rdi) - vmovdqu %ymm15,224(%rdi) - je L$done8x - - leaq 256(%rsi),%rsi - xorq %r10,%r10 - vmovdqa %ymm14,0(%rsp) - leaq 256(%rdi),%rdi - subq $256,%rdx - vmovdqa %ymm2,32(%rsp) - jmp L$oop_tail8x - -.p2align 5 -L$320_or_more8x: - vpxor 0(%rsi),%ymm6,%ymm6 - vpxor 32(%rsi),%ymm8,%ymm8 - vpxor 64(%rsi),%ymm1,%ymm1 - vpxor 96(%rsi),%ymm5,%ymm5 - vpxor 128(%rsi),%ymm12,%ymm12 - vpxor 160(%rsi),%ymm13,%ymm13 - vpxor 192(%rsi),%ymm10,%ymm10 - vpxor 224(%rsi),%ymm15,%ymm15 - vpxor 256(%rsi),%ymm14,%ymm14 - vpxor 288(%rsi),%ymm2,%ymm2 - vmovdqu %ymm6,0(%rdi) - vmovdqu %ymm8,32(%rdi) - vmovdqu %ymm1,64(%rdi) - vmovdqu %ymm5,96(%rdi) - vmovdqu %ymm12,128(%rdi) - vmovdqu %ymm13,160(%rdi) - vmovdqu %ymm10,192(%rdi) - vmovdqu %ymm15,224(%rdi) - vmovdqu %ymm14,256(%rdi) - vmovdqu %ymm2,288(%rdi) - je L$done8x - - leaq 320(%rsi),%rsi - xorq %r10,%r10 - vmovdqa %ymm3,0(%rsp) - leaq 320(%rdi),%rdi - subq $320,%rdx - vmovdqa %ymm7,32(%rsp) - jmp L$oop_tail8x - -.p2align 5 -L$384_or_more8x: - vpxor 0(%rsi),%ymm6,%ymm6 - vpxor 32(%rsi),%ymm8,%ymm8 - vpxor 64(%rsi),%ymm1,%ymm1 - vpxor 96(%rsi),%ymm5,%ymm5 - vpxor 128(%rsi),%ymm12,%ymm12 - vpxor 160(%rsi),%ymm13,%ymm13 - vpxor 192(%rsi),%ymm10,%ymm10 - vpxor 224(%rsi),%ymm15,%ymm15 - vpxor 256(%rsi),%ymm14,%ymm14 - vpxor 288(%rsi),%ymm2,%ymm2 - vpxor 320(%rsi),%ymm3,%ymm3 - vpxor 352(%rsi),%ymm7,%ymm7 - vmovdqu %ymm6,0(%rdi) - vmovdqu %ymm8,32(%rdi) - vmovdqu %ymm1,64(%rdi) - vmovdqu %ymm5,96(%rdi) - vmovdqu %ymm12,128(%rdi) - vmovdqu %ymm13,160(%rdi) - vmovdqu %ymm10,192(%rdi) - vmovdqu %ymm15,224(%rdi) - vmovdqu %ymm14,256(%rdi) - vmovdqu %ymm2,288(%rdi) - vmovdqu %ymm3,320(%rdi) - vmovdqu %ymm7,352(%rdi) - je L$done8x - - leaq 384(%rsi),%rsi - xorq %r10,%r10 - vmovdqa %ymm11,0(%rsp) - leaq 384(%rdi),%rdi - subq $384,%rdx - vmovdqa %ymm9,32(%rsp) - jmp L$oop_tail8x - -.p2align 5 -L$448_or_more8x: - vpxor 0(%rsi),%ymm6,%ymm6 - vpxor 32(%rsi),%ymm8,%ymm8 - vpxor 64(%rsi),%ymm1,%ymm1 - vpxor 96(%rsi),%ymm5,%ymm5 - vpxor 128(%rsi),%ymm12,%ymm12 - vpxor 160(%rsi),%ymm13,%ymm13 - vpxor 192(%rsi),%ymm10,%ymm10 - vpxor 224(%rsi),%ymm15,%ymm15 - vpxor 256(%rsi),%ymm14,%ymm14 - vpxor 288(%rsi),%ymm2,%ymm2 - vpxor 320(%rsi),%ymm3,%ymm3 - vpxor 352(%rsi),%ymm7,%ymm7 - vpxor 384(%rsi),%ymm11,%ymm11 - vpxor 416(%rsi),%ymm9,%ymm9 - vmovdqu %ymm6,0(%rdi) - vmovdqu %ymm8,32(%rdi) - vmovdqu %ymm1,64(%rdi) - vmovdqu %ymm5,96(%rdi) - vmovdqu %ymm12,128(%rdi) - vmovdqu %ymm13,160(%rdi) - vmovdqu %ymm10,192(%rdi) - vmovdqu %ymm15,224(%rdi) - vmovdqu %ymm14,256(%rdi) - vmovdqu %ymm2,288(%rdi) - vmovdqu %ymm3,320(%rdi) - vmovdqu %ymm7,352(%rdi) - vmovdqu %ymm11,384(%rdi) - vmovdqu %ymm9,416(%rdi) - je L$done8x - - leaq 448(%rsi),%rsi - xorq %r10,%r10 - vmovdqa %ymm0,0(%rsp) - leaq 448(%rdi),%rdi - subq $448,%rdx - vmovdqa %ymm4,32(%rsp) - -L$oop_tail8x: - movzbl (%rsi,%r10,1),%eax - movzbl (%rsp,%r10,1),%ecx - leaq 1(%r10),%r10 - xorl %ecx,%eax - movb %al,-1(%rdi,%r10,1) - decq %rdx - jnz L$oop_tail8x - -L$done8x: - vzeroall - leaq (%r9),%rsp - -L$8x_epilogue: - .byte 0xf3,0xc3 - - -#endif Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/chacha-x86_64-nasm.obj and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/chacha-x86_64-nasm.obj differ diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/chacha-x86-elf.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/chacha-x86-elf.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/chacha-x86-elf.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/chacha-x86-elf.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,973 +0,0 @@ -# This file is generated from a similarly-named Perl script in the BoringSSL -# source tree. Do not edit by hand. - -#if defined(__i386__) -#if defined(BORINGSSL_PREFIX) -#include -#endif -.text -.globl GFp_ChaCha20_ctr32 -.hidden GFp_ChaCha20_ctr32 -.type GFp_ChaCha20_ctr32,@function -.align 16 -GFp_ChaCha20_ctr32: -.L_GFp_ChaCha20_ctr32_begin: - pushl %ebp - pushl %ebx - pushl %esi - pushl %edi - xorl %eax,%eax - cmpl 28(%esp),%eax - je .L000no_data - call .Lpic_point -.Lpic_point: - popl %eax - leal GFp_ia32cap_P-.Lpic_point(%eax),%ebp - testl $16777216,(%ebp) - jz .L001x86 - testl $512,4(%ebp) - jz .L001x86 - jmp .Lssse3_shortcut -.L001x86: - movl 32(%esp),%esi - movl 36(%esp),%edi - subl $132,%esp - movl (%esi),%eax - movl 4(%esi),%ebx - movl 8(%esi),%ecx - movl 12(%esi),%edx - movl %eax,80(%esp) - movl %ebx,84(%esp) - movl %ecx,88(%esp) - movl %edx,92(%esp) - movl 16(%esi),%eax - movl 20(%esi),%ebx - movl 24(%esi),%ecx - movl 28(%esi),%edx - movl %eax,96(%esp) - movl %ebx,100(%esp) - movl %ecx,104(%esp) - movl %edx,108(%esp) - movl (%edi),%eax - movl 4(%edi),%ebx - movl 8(%edi),%ecx - movl 12(%edi),%edx - subl $1,%eax - movl %eax,112(%esp) - movl %ebx,116(%esp) - movl %ecx,120(%esp) - movl %edx,124(%esp) - jmp .L002entry -.align 16 -.L003outer_loop: - movl %ebx,156(%esp) - movl %eax,152(%esp) - movl %ecx,160(%esp) -.L002entry: - movl $1634760805,%eax - movl $857760878,4(%esp) - movl $2036477234,8(%esp) - movl $1797285236,12(%esp) - movl 84(%esp),%ebx - movl 88(%esp),%ebp - movl 104(%esp),%ecx - movl 108(%esp),%esi - movl 116(%esp),%edx - movl 120(%esp),%edi - movl %ebx,20(%esp) - movl %ebp,24(%esp) - movl %ecx,40(%esp) - movl %esi,44(%esp) - movl %edx,52(%esp) - movl %edi,56(%esp) - movl 92(%esp),%ebx - movl 124(%esp),%edi - movl 112(%esp),%edx - movl 80(%esp),%ebp - movl 96(%esp),%ecx - movl 100(%esp),%esi - addl $1,%edx - movl %ebx,28(%esp) - movl %edi,60(%esp) - movl %edx,112(%esp) - movl $10,%ebx - jmp .L004loop -.align 16 -.L004loop: - addl %ebp,%eax - movl %ebx,128(%esp) - movl %ebp,%ebx - xorl %eax,%edx - roll $16,%edx - addl %edx,%ecx - xorl %ecx,%ebx - movl 52(%esp),%edi - roll $12,%ebx - movl 20(%esp),%ebp - addl %ebx,%eax - xorl %eax,%edx - movl %eax,(%esp) - roll $8,%edx - movl 4(%esp),%eax - addl %edx,%ecx - movl %edx,48(%esp) - xorl %ecx,%ebx - addl %ebp,%eax - roll $7,%ebx - xorl %eax,%edi - movl %ecx,32(%esp) - roll $16,%edi - movl %ebx,16(%esp) - addl %edi,%esi - movl 40(%esp),%ecx - xorl %esi,%ebp - movl 56(%esp),%edx - roll $12,%ebp - movl 24(%esp),%ebx - addl %ebp,%eax - xorl %eax,%edi - movl %eax,4(%esp) - roll $8,%edi - movl 8(%esp),%eax - addl %edi,%esi - movl %edi,52(%esp) - xorl %esi,%ebp - addl %ebx,%eax - roll $7,%ebp - xorl %eax,%edx - movl %esi,36(%esp) - roll $16,%edx - movl %ebp,20(%esp) - addl %edx,%ecx - movl 44(%esp),%esi - xorl %ecx,%ebx - movl 60(%esp),%edi - roll $12,%ebx - movl 28(%esp),%ebp - addl %ebx,%eax - xorl %eax,%edx - movl %eax,8(%esp) - roll $8,%edx - movl 12(%esp),%eax - addl %edx,%ecx - movl %edx,56(%esp) - xorl %ecx,%ebx - addl %ebp,%eax - roll $7,%ebx - xorl %eax,%edi - roll $16,%edi - movl %ebx,24(%esp) - addl %edi,%esi - xorl %esi,%ebp - roll $12,%ebp - movl 20(%esp),%ebx - addl %ebp,%eax - xorl %eax,%edi - movl %eax,12(%esp) - roll $8,%edi - movl (%esp),%eax - addl %edi,%esi - movl %edi,%edx - xorl %esi,%ebp - addl %ebx,%eax - roll $7,%ebp - xorl %eax,%edx - roll $16,%edx - movl %ebp,28(%esp) - addl %edx,%ecx - xorl %ecx,%ebx - movl 48(%esp),%edi - roll $12,%ebx - movl 24(%esp),%ebp - addl %ebx,%eax - xorl %eax,%edx - movl %eax,(%esp) - roll $8,%edx - movl 4(%esp),%eax - addl %edx,%ecx - movl %edx,60(%esp) - xorl %ecx,%ebx - addl %ebp,%eax - roll $7,%ebx - xorl %eax,%edi - movl %ecx,40(%esp) - roll $16,%edi - movl %ebx,20(%esp) - addl %edi,%esi - movl 32(%esp),%ecx - xorl %esi,%ebp - movl 52(%esp),%edx - roll $12,%ebp - movl 28(%esp),%ebx - addl %ebp,%eax - xorl %eax,%edi - movl %eax,4(%esp) - roll $8,%edi - movl 8(%esp),%eax - addl %edi,%esi - movl %edi,48(%esp) - xorl %esi,%ebp - addl %ebx,%eax - roll $7,%ebp - xorl %eax,%edx - movl %esi,44(%esp) - roll $16,%edx - movl %ebp,24(%esp) - addl %edx,%ecx - movl 36(%esp),%esi - xorl %ecx,%ebx - movl 56(%esp),%edi - roll $12,%ebx - movl 16(%esp),%ebp - addl %ebx,%eax - xorl %eax,%edx - movl %eax,8(%esp) - roll $8,%edx - movl 12(%esp),%eax - addl %edx,%ecx - movl %edx,52(%esp) - xorl %ecx,%ebx - addl %ebp,%eax - roll $7,%ebx - xorl %eax,%edi - roll $16,%edi - movl %ebx,28(%esp) - addl %edi,%esi - xorl %esi,%ebp - movl 48(%esp),%edx - roll $12,%ebp - movl 128(%esp),%ebx - addl %ebp,%eax - xorl %eax,%edi - movl %eax,12(%esp) - roll $8,%edi - movl (%esp),%eax - addl %edi,%esi - movl %edi,56(%esp) - xorl %esi,%ebp - roll $7,%ebp - decl %ebx - jnz .L004loop - movl 160(%esp),%ebx - addl $1634760805,%eax - addl 80(%esp),%ebp - addl 96(%esp),%ecx - addl 100(%esp),%esi - cmpl $64,%ebx - jb .L005tail - movl 156(%esp),%ebx - addl 112(%esp),%edx - addl 120(%esp),%edi - xorl (%ebx),%eax - xorl 16(%ebx),%ebp - movl %eax,(%esp) - movl 152(%esp),%eax - xorl 32(%ebx),%ecx - xorl 36(%ebx),%esi - xorl 48(%ebx),%edx - xorl 56(%ebx),%edi - movl %ebp,16(%eax) - movl %ecx,32(%eax) - movl %esi,36(%eax) - movl %edx,48(%eax) - movl %edi,56(%eax) - movl 4(%esp),%ebp - movl 8(%esp),%ecx - movl 12(%esp),%esi - movl 20(%esp),%edx - movl 24(%esp),%edi - addl $857760878,%ebp - addl $2036477234,%ecx - addl $1797285236,%esi - addl 84(%esp),%edx - addl 88(%esp),%edi - xorl 4(%ebx),%ebp - xorl 8(%ebx),%ecx - xorl 12(%ebx),%esi - xorl 20(%ebx),%edx - xorl 24(%ebx),%edi - movl %ebp,4(%eax) - movl %ecx,8(%eax) - movl %esi,12(%eax) - movl %edx,20(%eax) - movl %edi,24(%eax) - movl 28(%esp),%ebp - movl 40(%esp),%ecx - movl 44(%esp),%esi - movl 52(%esp),%edx - movl 60(%esp),%edi - addl 92(%esp),%ebp - addl 104(%esp),%ecx - addl 108(%esp),%esi - addl 116(%esp),%edx - addl 124(%esp),%edi - xorl 28(%ebx),%ebp - xorl 40(%ebx),%ecx - xorl 44(%ebx),%esi - xorl 52(%ebx),%edx - xorl 60(%ebx),%edi - leal 64(%ebx),%ebx - movl %ebp,28(%eax) - movl (%esp),%ebp - movl %ecx,40(%eax) - movl 160(%esp),%ecx - movl %esi,44(%eax) - movl %edx,52(%eax) - movl %edi,60(%eax) - movl %ebp,(%eax) - leal 64(%eax),%eax - subl $64,%ecx - jnz .L003outer_loop - jmp .L006done -.L005tail: - addl 112(%esp),%edx - addl 120(%esp),%edi - movl %eax,(%esp) - movl %ebp,16(%esp) - movl %ecx,32(%esp) - movl %esi,36(%esp) - movl %edx,48(%esp) - movl %edi,56(%esp) - movl 4(%esp),%ebp - movl 8(%esp),%ecx - movl 12(%esp),%esi - movl 20(%esp),%edx - movl 24(%esp),%edi - addl $857760878,%ebp - addl $2036477234,%ecx - addl $1797285236,%esi - addl 84(%esp),%edx - addl 88(%esp),%edi - movl %ebp,4(%esp) - movl %ecx,8(%esp) - movl %esi,12(%esp) - movl %edx,20(%esp) - movl %edi,24(%esp) - movl 28(%esp),%ebp - movl 40(%esp),%ecx - movl 44(%esp),%esi - movl 52(%esp),%edx - movl 60(%esp),%edi - addl 92(%esp),%ebp - addl 104(%esp),%ecx - addl 108(%esp),%esi - addl 116(%esp),%edx - addl 124(%esp),%edi - movl %ebp,28(%esp) - movl 156(%esp),%ebp - movl %ecx,40(%esp) - movl 152(%esp),%ecx - movl %esi,44(%esp) - xorl %esi,%esi - movl %edx,52(%esp) - movl %edi,60(%esp) - xorl %eax,%eax - xorl %edx,%edx -.L007tail_loop: - movb (%esi,%ebp,1),%al - movb (%esp,%esi,1),%dl - leal 1(%esi),%esi - xorb %dl,%al - movb %al,-1(%ecx,%esi,1) - decl %ebx - jnz .L007tail_loop -.L006done: - addl $132,%esp -.L000no_data: - popl %edi - popl %esi - popl %ebx - popl %ebp - ret -.size GFp_ChaCha20_ctr32,.-.L_GFp_ChaCha20_ctr32_begin -.hidden _ChaCha20_ssse3 -.type _ChaCha20_ssse3,@function -.align 16 -_ChaCha20_ssse3: - pushl %ebp - pushl %ebx - pushl %esi - pushl %edi -.Lssse3_shortcut: - movl 20(%esp),%edi - movl 24(%esp),%esi - movl 28(%esp),%ecx - movl 32(%esp),%edx - movl 36(%esp),%ebx - movl %esp,%ebp - subl $524,%esp - andl $-64,%esp - movl %ebp,512(%esp) - leal .Lssse3_data-.Lpic_point(%eax),%eax - movdqu (%ebx),%xmm3 - cmpl $256,%ecx - jb .L0081x - movl %edx,516(%esp) - movl %ebx,520(%esp) - subl $256,%ecx - leal 384(%esp),%ebp - movdqu (%edx),%xmm7 - pshufd $0,%xmm3,%xmm0 - pshufd $85,%xmm3,%xmm1 - pshufd $170,%xmm3,%xmm2 - pshufd $255,%xmm3,%xmm3 - paddd 48(%eax),%xmm0 - pshufd $0,%xmm7,%xmm4 - pshufd $85,%xmm7,%xmm5 - psubd 64(%eax),%xmm0 - pshufd $170,%xmm7,%xmm6 - pshufd $255,%xmm7,%xmm7 - movdqa %xmm0,64(%ebp) - movdqa %xmm1,80(%ebp) - movdqa %xmm2,96(%ebp) - movdqa %xmm3,112(%ebp) - movdqu 16(%edx),%xmm3 - movdqa %xmm4,-64(%ebp) - movdqa %xmm5,-48(%ebp) - movdqa %xmm6,-32(%ebp) - movdqa %xmm7,-16(%ebp) - movdqa 32(%eax),%xmm7 - leal 128(%esp),%ebx - pshufd $0,%xmm3,%xmm0 - pshufd $85,%xmm3,%xmm1 - pshufd $170,%xmm3,%xmm2 - pshufd $255,%xmm3,%xmm3 - pshufd $0,%xmm7,%xmm4 - pshufd $85,%xmm7,%xmm5 - pshufd $170,%xmm7,%xmm6 - pshufd $255,%xmm7,%xmm7 - movdqa %xmm0,(%ebp) - movdqa %xmm1,16(%ebp) - movdqa %xmm2,32(%ebp) - movdqa %xmm3,48(%ebp) - movdqa %xmm4,-128(%ebp) - movdqa %xmm5,-112(%ebp) - movdqa %xmm6,-96(%ebp) - movdqa %xmm7,-80(%ebp) - leal 128(%esi),%esi - leal 128(%edi),%edi - jmp .L009outer_loop -.align 16 -.L009outer_loop: - movdqa -112(%ebp),%xmm1 - movdqa -96(%ebp),%xmm2 - movdqa -80(%ebp),%xmm3 - movdqa -48(%ebp),%xmm5 - movdqa -32(%ebp),%xmm6 - movdqa -16(%ebp),%xmm7 - movdqa %xmm1,-112(%ebx) - movdqa %xmm2,-96(%ebx) - movdqa %xmm3,-80(%ebx) - movdqa %xmm5,-48(%ebx) - movdqa %xmm6,-32(%ebx) - movdqa %xmm7,-16(%ebx) - movdqa 32(%ebp),%xmm2 - movdqa 48(%ebp),%xmm3 - movdqa 64(%ebp),%xmm4 - movdqa 80(%ebp),%xmm5 - movdqa 96(%ebp),%xmm6 - movdqa 112(%ebp),%xmm7 - paddd 64(%eax),%xmm4 - movdqa %xmm2,32(%ebx) - movdqa %xmm3,48(%ebx) - movdqa %xmm4,64(%ebx) - movdqa %xmm5,80(%ebx) - movdqa %xmm6,96(%ebx) - movdqa %xmm7,112(%ebx) - movdqa %xmm4,64(%ebp) - movdqa -128(%ebp),%xmm0 - movdqa %xmm4,%xmm6 - movdqa -64(%ebp),%xmm3 - movdqa (%ebp),%xmm4 - movdqa 16(%ebp),%xmm5 - movl $10,%edx - nop -.align 16 -.L010loop: - paddd %xmm3,%xmm0 - movdqa %xmm3,%xmm2 - pxor %xmm0,%xmm6 - pshufb (%eax),%xmm6 - paddd %xmm6,%xmm4 - pxor %xmm4,%xmm2 - movdqa -48(%ebx),%xmm3 - movdqa %xmm2,%xmm1 - pslld $12,%xmm2 - psrld $20,%xmm1 - por %xmm1,%xmm2 - movdqa -112(%ebx),%xmm1 - paddd %xmm2,%xmm0 - movdqa 80(%ebx),%xmm7 - pxor %xmm0,%xmm6 - movdqa %xmm0,-128(%ebx) - pshufb 16(%eax),%xmm6 - paddd %xmm6,%xmm4 - movdqa %xmm6,64(%ebx) - pxor %xmm4,%xmm2 - paddd %xmm3,%xmm1 - movdqa %xmm2,%xmm0 - pslld $7,%xmm2 - psrld $25,%xmm0 - pxor %xmm1,%xmm7 - por %xmm0,%xmm2 - movdqa %xmm4,(%ebx) - pshufb (%eax),%xmm7 - movdqa %xmm2,-64(%ebx) - paddd %xmm7,%xmm5 - movdqa 32(%ebx),%xmm4 - pxor %xmm5,%xmm3 - movdqa -32(%ebx),%xmm2 - movdqa %xmm3,%xmm0 - pslld $12,%xmm3 - psrld $20,%xmm0 - por %xmm0,%xmm3 - movdqa -96(%ebx),%xmm0 - paddd %xmm3,%xmm1 - movdqa 96(%ebx),%xmm6 - pxor %xmm1,%xmm7 - movdqa %xmm1,-112(%ebx) - pshufb 16(%eax),%xmm7 - paddd %xmm7,%xmm5 - movdqa %xmm7,80(%ebx) - pxor %xmm5,%xmm3 - paddd %xmm2,%xmm0 - movdqa %xmm3,%xmm1 - pslld $7,%xmm3 - psrld $25,%xmm1 - pxor %xmm0,%xmm6 - por %xmm1,%xmm3 - movdqa %xmm5,16(%ebx) - pshufb (%eax),%xmm6 - movdqa %xmm3,-48(%ebx) - paddd %xmm6,%xmm4 - movdqa 48(%ebx),%xmm5 - pxor %xmm4,%xmm2 - movdqa -16(%ebx),%xmm3 - movdqa %xmm2,%xmm1 - pslld $12,%xmm2 - psrld $20,%xmm1 - por %xmm1,%xmm2 - movdqa -80(%ebx),%xmm1 - paddd %xmm2,%xmm0 - movdqa 112(%ebx),%xmm7 - pxor %xmm0,%xmm6 - movdqa %xmm0,-96(%ebx) - pshufb 16(%eax),%xmm6 - paddd %xmm6,%xmm4 - movdqa %xmm6,96(%ebx) - pxor %xmm4,%xmm2 - paddd %xmm3,%xmm1 - movdqa %xmm2,%xmm0 - pslld $7,%xmm2 - psrld $25,%xmm0 - pxor %xmm1,%xmm7 - por %xmm0,%xmm2 - pshufb (%eax),%xmm7 - movdqa %xmm2,-32(%ebx) - paddd %xmm7,%xmm5 - pxor %xmm5,%xmm3 - movdqa -48(%ebx),%xmm2 - movdqa %xmm3,%xmm0 - pslld $12,%xmm3 - psrld $20,%xmm0 - por %xmm0,%xmm3 - movdqa -128(%ebx),%xmm0 - paddd %xmm3,%xmm1 - pxor %xmm1,%xmm7 - movdqa %xmm1,-80(%ebx) - pshufb 16(%eax),%xmm7 - paddd %xmm7,%xmm5 - movdqa %xmm7,%xmm6 - pxor %xmm5,%xmm3 - paddd %xmm2,%xmm0 - movdqa %xmm3,%xmm1 - pslld $7,%xmm3 - psrld $25,%xmm1 - pxor %xmm0,%xmm6 - por %xmm1,%xmm3 - pshufb (%eax),%xmm6 - movdqa %xmm3,-16(%ebx) - paddd %xmm6,%xmm4 - pxor %xmm4,%xmm2 - movdqa -32(%ebx),%xmm3 - movdqa %xmm2,%xmm1 - pslld $12,%xmm2 - psrld $20,%xmm1 - por %xmm1,%xmm2 - movdqa -112(%ebx),%xmm1 - paddd %xmm2,%xmm0 - movdqa 64(%ebx),%xmm7 - pxor %xmm0,%xmm6 - movdqa %xmm0,-128(%ebx) - pshufb 16(%eax),%xmm6 - paddd %xmm6,%xmm4 - movdqa %xmm6,112(%ebx) - pxor %xmm4,%xmm2 - paddd %xmm3,%xmm1 - movdqa %xmm2,%xmm0 - pslld $7,%xmm2 - psrld $25,%xmm0 - pxor %xmm1,%xmm7 - por %xmm0,%xmm2 - movdqa %xmm4,32(%ebx) - pshufb (%eax),%xmm7 - movdqa %xmm2,-48(%ebx) - paddd %xmm7,%xmm5 - movdqa (%ebx),%xmm4 - pxor %xmm5,%xmm3 - movdqa -16(%ebx),%xmm2 - movdqa %xmm3,%xmm0 - pslld $12,%xmm3 - psrld $20,%xmm0 - por %xmm0,%xmm3 - movdqa -96(%ebx),%xmm0 - paddd %xmm3,%xmm1 - movdqa 80(%ebx),%xmm6 - pxor %xmm1,%xmm7 - movdqa %xmm1,-112(%ebx) - pshufb 16(%eax),%xmm7 - paddd %xmm7,%xmm5 - movdqa %xmm7,64(%ebx) - pxor %xmm5,%xmm3 - paddd %xmm2,%xmm0 - movdqa %xmm3,%xmm1 - pslld $7,%xmm3 - psrld $25,%xmm1 - pxor %xmm0,%xmm6 - por %xmm1,%xmm3 - movdqa %xmm5,48(%ebx) - pshufb (%eax),%xmm6 - movdqa %xmm3,-32(%ebx) - paddd %xmm6,%xmm4 - movdqa 16(%ebx),%xmm5 - pxor %xmm4,%xmm2 - movdqa -64(%ebx),%xmm3 - movdqa %xmm2,%xmm1 - pslld $12,%xmm2 - psrld $20,%xmm1 - por %xmm1,%xmm2 - movdqa -80(%ebx),%xmm1 - paddd %xmm2,%xmm0 - movdqa 96(%ebx),%xmm7 - pxor %xmm0,%xmm6 - movdqa %xmm0,-96(%ebx) - pshufb 16(%eax),%xmm6 - paddd %xmm6,%xmm4 - movdqa %xmm6,80(%ebx) - pxor %xmm4,%xmm2 - paddd %xmm3,%xmm1 - movdqa %xmm2,%xmm0 - pslld $7,%xmm2 - psrld $25,%xmm0 - pxor %xmm1,%xmm7 - por %xmm0,%xmm2 - pshufb (%eax),%xmm7 - movdqa %xmm2,-16(%ebx) - paddd %xmm7,%xmm5 - pxor %xmm5,%xmm3 - movdqa %xmm3,%xmm0 - pslld $12,%xmm3 - psrld $20,%xmm0 - por %xmm0,%xmm3 - movdqa -128(%ebx),%xmm0 - paddd %xmm3,%xmm1 - movdqa 64(%ebx),%xmm6 - pxor %xmm1,%xmm7 - movdqa %xmm1,-80(%ebx) - pshufb 16(%eax),%xmm7 - paddd %xmm7,%xmm5 - movdqa %xmm7,96(%ebx) - pxor %xmm5,%xmm3 - movdqa %xmm3,%xmm1 - pslld $7,%xmm3 - psrld $25,%xmm1 - por %xmm1,%xmm3 - decl %edx - jnz .L010loop - movdqa %xmm3,-64(%ebx) - movdqa %xmm4,(%ebx) - movdqa %xmm5,16(%ebx) - movdqa %xmm6,64(%ebx) - movdqa %xmm7,96(%ebx) - movdqa -112(%ebx),%xmm1 - movdqa -96(%ebx),%xmm2 - movdqa -80(%ebx),%xmm3 - paddd -128(%ebp),%xmm0 - paddd -112(%ebp),%xmm1 - paddd -96(%ebp),%xmm2 - paddd -80(%ebp),%xmm3 - movdqa %xmm0,%xmm6 - punpckldq %xmm1,%xmm0 - movdqa %xmm2,%xmm7 - punpckldq %xmm3,%xmm2 - punpckhdq %xmm1,%xmm6 - punpckhdq %xmm3,%xmm7 - movdqa %xmm0,%xmm1 - punpcklqdq %xmm2,%xmm0 - movdqa %xmm6,%xmm3 - punpcklqdq %xmm7,%xmm6 - punpckhqdq %xmm2,%xmm1 - punpckhqdq %xmm7,%xmm3 - movdqu -128(%esi),%xmm4 - movdqu -64(%esi),%xmm5 - movdqu (%esi),%xmm2 - movdqu 64(%esi),%xmm7 - leal 16(%esi),%esi - pxor %xmm0,%xmm4 - movdqa -64(%ebx),%xmm0 - pxor %xmm1,%xmm5 - movdqa -48(%ebx),%xmm1 - pxor %xmm2,%xmm6 - movdqa -32(%ebx),%xmm2 - pxor %xmm3,%xmm7 - movdqa -16(%ebx),%xmm3 - movdqu %xmm4,-128(%edi) - movdqu %xmm5,-64(%edi) - movdqu %xmm6,(%edi) - movdqu %xmm7,64(%edi) - leal 16(%edi),%edi - paddd -64(%ebp),%xmm0 - paddd -48(%ebp),%xmm1 - paddd -32(%ebp),%xmm2 - paddd -16(%ebp),%xmm3 - movdqa %xmm0,%xmm6 - punpckldq %xmm1,%xmm0 - movdqa %xmm2,%xmm7 - punpckldq %xmm3,%xmm2 - punpckhdq %xmm1,%xmm6 - punpckhdq %xmm3,%xmm7 - movdqa %xmm0,%xmm1 - punpcklqdq %xmm2,%xmm0 - movdqa %xmm6,%xmm3 - punpcklqdq %xmm7,%xmm6 - punpckhqdq %xmm2,%xmm1 - punpckhqdq %xmm7,%xmm3 - movdqu -128(%esi),%xmm4 - movdqu -64(%esi),%xmm5 - movdqu (%esi),%xmm2 - movdqu 64(%esi),%xmm7 - leal 16(%esi),%esi - pxor %xmm0,%xmm4 - movdqa (%ebx),%xmm0 - pxor %xmm1,%xmm5 - movdqa 16(%ebx),%xmm1 - pxor %xmm2,%xmm6 - movdqa 32(%ebx),%xmm2 - pxor %xmm3,%xmm7 - movdqa 48(%ebx),%xmm3 - movdqu %xmm4,-128(%edi) - movdqu %xmm5,-64(%edi) - movdqu %xmm6,(%edi) - movdqu %xmm7,64(%edi) - leal 16(%edi),%edi - paddd (%ebp),%xmm0 - paddd 16(%ebp),%xmm1 - paddd 32(%ebp),%xmm2 - paddd 48(%ebp),%xmm3 - movdqa %xmm0,%xmm6 - punpckldq %xmm1,%xmm0 - movdqa %xmm2,%xmm7 - punpckldq %xmm3,%xmm2 - punpckhdq %xmm1,%xmm6 - punpckhdq %xmm3,%xmm7 - movdqa %xmm0,%xmm1 - punpcklqdq %xmm2,%xmm0 - movdqa %xmm6,%xmm3 - punpcklqdq %xmm7,%xmm6 - punpckhqdq %xmm2,%xmm1 - punpckhqdq %xmm7,%xmm3 - movdqu -128(%esi),%xmm4 - movdqu -64(%esi),%xmm5 - movdqu (%esi),%xmm2 - movdqu 64(%esi),%xmm7 - leal 16(%esi),%esi - pxor %xmm0,%xmm4 - movdqa 64(%ebx),%xmm0 - pxor %xmm1,%xmm5 - movdqa 80(%ebx),%xmm1 - pxor %xmm2,%xmm6 - movdqa 96(%ebx),%xmm2 - pxor %xmm3,%xmm7 - movdqa 112(%ebx),%xmm3 - movdqu %xmm4,-128(%edi) - movdqu %xmm5,-64(%edi) - movdqu %xmm6,(%edi) - movdqu %xmm7,64(%edi) - leal 16(%edi),%edi - paddd 64(%ebp),%xmm0 - paddd 80(%ebp),%xmm1 - paddd 96(%ebp),%xmm2 - paddd 112(%ebp),%xmm3 - movdqa %xmm0,%xmm6 - punpckldq %xmm1,%xmm0 - movdqa %xmm2,%xmm7 - punpckldq %xmm3,%xmm2 - punpckhdq %xmm1,%xmm6 - punpckhdq %xmm3,%xmm7 - movdqa %xmm0,%xmm1 - punpcklqdq %xmm2,%xmm0 - movdqa %xmm6,%xmm3 - punpcklqdq %xmm7,%xmm6 - punpckhqdq %xmm2,%xmm1 - punpckhqdq %xmm7,%xmm3 - movdqu -128(%esi),%xmm4 - movdqu -64(%esi),%xmm5 - movdqu (%esi),%xmm2 - movdqu 64(%esi),%xmm7 - leal 208(%esi),%esi - pxor %xmm0,%xmm4 - pxor %xmm1,%xmm5 - pxor %xmm2,%xmm6 - pxor %xmm3,%xmm7 - movdqu %xmm4,-128(%edi) - movdqu %xmm5,-64(%edi) - movdqu %xmm6,(%edi) - movdqu %xmm7,64(%edi) - leal 208(%edi),%edi - subl $256,%ecx - jnc .L009outer_loop - addl $256,%ecx - jz .L011done - movl 520(%esp),%ebx - leal -128(%esi),%esi - movl 516(%esp),%edx - leal -128(%edi),%edi - movd 64(%ebp),%xmm2 - movdqu (%ebx),%xmm3 - paddd 96(%eax),%xmm2 - pand 112(%eax),%xmm3 - por %xmm2,%xmm3 -.L0081x: - movdqa 32(%eax),%xmm0 - movdqu (%edx),%xmm1 - movdqu 16(%edx),%xmm2 - movdqa (%eax),%xmm6 - movdqa 16(%eax),%xmm7 - movl %ebp,48(%esp) - movdqa %xmm0,(%esp) - movdqa %xmm1,16(%esp) - movdqa %xmm2,32(%esp) - movdqa %xmm3,48(%esp) - movl $10,%edx - jmp .L012loop1x -.align 16 -.L013outer1x: - movdqa 80(%eax),%xmm3 - movdqa (%esp),%xmm0 - movdqa 16(%esp),%xmm1 - movdqa 32(%esp),%xmm2 - paddd 48(%esp),%xmm3 - movl $10,%edx - movdqa %xmm3,48(%esp) - jmp .L012loop1x -.align 16 -.L012loop1x: - paddd %xmm1,%xmm0 - pxor %xmm0,%xmm3 -.byte 102,15,56,0,222 - paddd %xmm3,%xmm2 - pxor %xmm2,%xmm1 - movdqa %xmm1,%xmm4 - psrld $20,%xmm1 - pslld $12,%xmm4 - por %xmm4,%xmm1 - paddd %xmm1,%xmm0 - pxor %xmm0,%xmm3 -.byte 102,15,56,0,223 - paddd %xmm3,%xmm2 - pxor %xmm2,%xmm1 - movdqa %xmm1,%xmm4 - psrld $25,%xmm1 - pslld $7,%xmm4 - por %xmm4,%xmm1 - pshufd $78,%xmm2,%xmm2 - pshufd $57,%xmm1,%xmm1 - pshufd $147,%xmm3,%xmm3 - nop - paddd %xmm1,%xmm0 - pxor %xmm0,%xmm3 -.byte 102,15,56,0,222 - paddd %xmm3,%xmm2 - pxor %xmm2,%xmm1 - movdqa %xmm1,%xmm4 - psrld $20,%xmm1 - pslld $12,%xmm4 - por %xmm4,%xmm1 - paddd %xmm1,%xmm0 - pxor %xmm0,%xmm3 -.byte 102,15,56,0,223 - paddd %xmm3,%xmm2 - pxor %xmm2,%xmm1 - movdqa %xmm1,%xmm4 - psrld $25,%xmm1 - pslld $7,%xmm4 - por %xmm4,%xmm1 - pshufd $78,%xmm2,%xmm2 - pshufd $147,%xmm1,%xmm1 - pshufd $57,%xmm3,%xmm3 - decl %edx - jnz .L012loop1x - paddd (%esp),%xmm0 - paddd 16(%esp),%xmm1 - paddd 32(%esp),%xmm2 - paddd 48(%esp),%xmm3 - cmpl $64,%ecx - jb .L014tail - movdqu (%esi),%xmm4 - movdqu 16(%esi),%xmm5 - pxor %xmm4,%xmm0 - movdqu 32(%esi),%xmm4 - pxor %xmm5,%xmm1 - movdqu 48(%esi),%xmm5 - pxor %xmm4,%xmm2 - pxor %xmm5,%xmm3 - leal 64(%esi),%esi - movdqu %xmm0,(%edi) - movdqu %xmm1,16(%edi) - movdqu %xmm2,32(%edi) - movdqu %xmm3,48(%edi) - leal 64(%edi),%edi - subl $64,%ecx - jnz .L013outer1x - jmp .L011done -.L014tail: - movdqa %xmm0,(%esp) - movdqa %xmm1,16(%esp) - movdqa %xmm2,32(%esp) - movdqa %xmm3,48(%esp) - xorl %eax,%eax - xorl %edx,%edx - xorl %ebp,%ebp -.L015tail_loop: - movb (%esp,%ebp,1),%al - movb (%esi,%ebp,1),%dl - leal 1(%ebp),%ebp - xorb %dl,%al - movb %al,-1(%edi,%ebp,1) - decl %ecx - jnz .L015tail_loop -.L011done: - movl 512(%esp),%esp - popl %edi - popl %esi - popl %ebx - popl %ebp - ret -.size _ChaCha20_ssse3,.-_ChaCha20_ssse3 -.align 64 -.Lssse3_data: -.byte 2,3,0,1,6,7,4,5,10,11,8,9,14,15,12,13 -.byte 3,0,1,2,7,4,5,6,11,8,9,10,15,12,13,14 -.long 1634760805,857760878,2036477234,1797285236 -.long 0,1,2,3 -.long 4,4,4,4 -.long 1,0,0,0 -.long 4,0,0,0 -.long 0,-1,-1,-1 -.align 64 -.byte 67,104,97,67,104,97,50,48,32,102,111,114,32,120,56,54 -.byte 44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32 -.byte 60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111 -.byte 114,103,62,0 -#endif -.section .note.GNU-stack,"",@progbits diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/chacha-x86-macosx.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/chacha-x86-macosx.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/chacha-x86-macosx.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/chacha-x86-macosx.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,972 +0,0 @@ -# This file is generated from a similarly-named Perl script in the BoringSSL -# source tree. Do not edit by hand. - -#if defined(__i386__) -#if defined(BORINGSSL_PREFIX) -#include -#endif -.text -.globl _GFp_ChaCha20_ctr32 -.private_extern _GFp_ChaCha20_ctr32 -.align 4 -_GFp_ChaCha20_ctr32: -L_GFp_ChaCha20_ctr32_begin: - pushl %ebp - pushl %ebx - pushl %esi - pushl %edi - xorl %eax,%eax - cmpl 28(%esp),%eax - je L000no_data - call Lpic_point -Lpic_point: - popl %eax - movl L_GFp_ia32cap_P$non_lazy_ptr-Lpic_point(%eax),%ebp - testl $16777216,(%ebp) - jz L001x86 - testl $512,4(%ebp) - jz L001x86 - jmp Lssse3_shortcut -L001x86: - movl 32(%esp),%esi - movl 36(%esp),%edi - subl $132,%esp - movl (%esi),%eax - movl 4(%esi),%ebx - movl 8(%esi),%ecx - movl 12(%esi),%edx - movl %eax,80(%esp) - movl %ebx,84(%esp) - movl %ecx,88(%esp) - movl %edx,92(%esp) - movl 16(%esi),%eax - movl 20(%esi),%ebx - movl 24(%esi),%ecx - movl 28(%esi),%edx - movl %eax,96(%esp) - movl %ebx,100(%esp) - movl %ecx,104(%esp) - movl %edx,108(%esp) - movl (%edi),%eax - movl 4(%edi),%ebx - movl 8(%edi),%ecx - movl 12(%edi),%edx - subl $1,%eax - movl %eax,112(%esp) - movl %ebx,116(%esp) - movl %ecx,120(%esp) - movl %edx,124(%esp) - jmp L002entry -.align 4,0x90 -L003outer_loop: - movl %ebx,156(%esp) - movl %eax,152(%esp) - movl %ecx,160(%esp) -L002entry: - movl $1634760805,%eax - movl $857760878,4(%esp) - movl $2036477234,8(%esp) - movl $1797285236,12(%esp) - movl 84(%esp),%ebx - movl 88(%esp),%ebp - movl 104(%esp),%ecx - movl 108(%esp),%esi - movl 116(%esp),%edx - movl 120(%esp),%edi - movl %ebx,20(%esp) - movl %ebp,24(%esp) - movl %ecx,40(%esp) - movl %esi,44(%esp) - movl %edx,52(%esp) - movl %edi,56(%esp) - movl 92(%esp),%ebx - movl 124(%esp),%edi - movl 112(%esp),%edx - movl 80(%esp),%ebp - movl 96(%esp),%ecx - movl 100(%esp),%esi - addl $1,%edx - movl %ebx,28(%esp) - movl %edi,60(%esp) - movl %edx,112(%esp) - movl $10,%ebx - jmp L004loop -.align 4,0x90 -L004loop: - addl %ebp,%eax - movl %ebx,128(%esp) - movl %ebp,%ebx - xorl %eax,%edx - roll $16,%edx - addl %edx,%ecx - xorl %ecx,%ebx - movl 52(%esp),%edi - roll $12,%ebx - movl 20(%esp),%ebp - addl %ebx,%eax - xorl %eax,%edx - movl %eax,(%esp) - roll $8,%edx - movl 4(%esp),%eax - addl %edx,%ecx - movl %edx,48(%esp) - xorl %ecx,%ebx - addl %ebp,%eax - roll $7,%ebx - xorl %eax,%edi - movl %ecx,32(%esp) - roll $16,%edi - movl %ebx,16(%esp) - addl %edi,%esi - movl 40(%esp),%ecx - xorl %esi,%ebp - movl 56(%esp),%edx - roll $12,%ebp - movl 24(%esp),%ebx - addl %ebp,%eax - xorl %eax,%edi - movl %eax,4(%esp) - roll $8,%edi - movl 8(%esp),%eax - addl %edi,%esi - movl %edi,52(%esp) - xorl %esi,%ebp - addl %ebx,%eax - roll $7,%ebp - xorl %eax,%edx - movl %esi,36(%esp) - roll $16,%edx - movl %ebp,20(%esp) - addl %edx,%ecx - movl 44(%esp),%esi - xorl %ecx,%ebx - movl 60(%esp),%edi - roll $12,%ebx - movl 28(%esp),%ebp - addl %ebx,%eax - xorl %eax,%edx - movl %eax,8(%esp) - roll $8,%edx - movl 12(%esp),%eax - addl %edx,%ecx - movl %edx,56(%esp) - xorl %ecx,%ebx - addl %ebp,%eax - roll $7,%ebx - xorl %eax,%edi - roll $16,%edi - movl %ebx,24(%esp) - addl %edi,%esi - xorl %esi,%ebp - roll $12,%ebp - movl 20(%esp),%ebx - addl %ebp,%eax - xorl %eax,%edi - movl %eax,12(%esp) - roll $8,%edi - movl (%esp),%eax - addl %edi,%esi - movl %edi,%edx - xorl %esi,%ebp - addl %ebx,%eax - roll $7,%ebp - xorl %eax,%edx - roll $16,%edx - movl %ebp,28(%esp) - addl %edx,%ecx - xorl %ecx,%ebx - movl 48(%esp),%edi - roll $12,%ebx - movl 24(%esp),%ebp - addl %ebx,%eax - xorl %eax,%edx - movl %eax,(%esp) - roll $8,%edx - movl 4(%esp),%eax - addl %edx,%ecx - movl %edx,60(%esp) - xorl %ecx,%ebx - addl %ebp,%eax - roll $7,%ebx - xorl %eax,%edi - movl %ecx,40(%esp) - roll $16,%edi - movl %ebx,20(%esp) - addl %edi,%esi - movl 32(%esp),%ecx - xorl %esi,%ebp - movl 52(%esp),%edx - roll $12,%ebp - movl 28(%esp),%ebx - addl %ebp,%eax - xorl %eax,%edi - movl %eax,4(%esp) - roll $8,%edi - movl 8(%esp),%eax - addl %edi,%esi - movl %edi,48(%esp) - xorl %esi,%ebp - addl %ebx,%eax - roll $7,%ebp - xorl %eax,%edx - movl %esi,44(%esp) - roll $16,%edx - movl %ebp,24(%esp) - addl %edx,%ecx - movl 36(%esp),%esi - xorl %ecx,%ebx - movl 56(%esp),%edi - roll $12,%ebx - movl 16(%esp),%ebp - addl %ebx,%eax - xorl %eax,%edx - movl %eax,8(%esp) - roll $8,%edx - movl 12(%esp),%eax - addl %edx,%ecx - movl %edx,52(%esp) - xorl %ecx,%ebx - addl %ebp,%eax - roll $7,%ebx - xorl %eax,%edi - roll $16,%edi - movl %ebx,28(%esp) - addl %edi,%esi - xorl %esi,%ebp - movl 48(%esp),%edx - roll $12,%ebp - movl 128(%esp),%ebx - addl %ebp,%eax - xorl %eax,%edi - movl %eax,12(%esp) - roll $8,%edi - movl (%esp),%eax - addl %edi,%esi - movl %edi,56(%esp) - xorl %esi,%ebp - roll $7,%ebp - decl %ebx - jnz L004loop - movl 160(%esp),%ebx - addl $1634760805,%eax - addl 80(%esp),%ebp - addl 96(%esp),%ecx - addl 100(%esp),%esi - cmpl $64,%ebx - jb L005tail - movl 156(%esp),%ebx - addl 112(%esp),%edx - addl 120(%esp),%edi - xorl (%ebx),%eax - xorl 16(%ebx),%ebp - movl %eax,(%esp) - movl 152(%esp),%eax - xorl 32(%ebx),%ecx - xorl 36(%ebx),%esi - xorl 48(%ebx),%edx - xorl 56(%ebx),%edi - movl %ebp,16(%eax) - movl %ecx,32(%eax) - movl %esi,36(%eax) - movl %edx,48(%eax) - movl %edi,56(%eax) - movl 4(%esp),%ebp - movl 8(%esp),%ecx - movl 12(%esp),%esi - movl 20(%esp),%edx - movl 24(%esp),%edi - addl $857760878,%ebp - addl $2036477234,%ecx - addl $1797285236,%esi - addl 84(%esp),%edx - addl 88(%esp),%edi - xorl 4(%ebx),%ebp - xorl 8(%ebx),%ecx - xorl 12(%ebx),%esi - xorl 20(%ebx),%edx - xorl 24(%ebx),%edi - movl %ebp,4(%eax) - movl %ecx,8(%eax) - movl %esi,12(%eax) - movl %edx,20(%eax) - movl %edi,24(%eax) - movl 28(%esp),%ebp - movl 40(%esp),%ecx - movl 44(%esp),%esi - movl 52(%esp),%edx - movl 60(%esp),%edi - addl 92(%esp),%ebp - addl 104(%esp),%ecx - addl 108(%esp),%esi - addl 116(%esp),%edx - addl 124(%esp),%edi - xorl 28(%ebx),%ebp - xorl 40(%ebx),%ecx - xorl 44(%ebx),%esi - xorl 52(%ebx),%edx - xorl 60(%ebx),%edi - leal 64(%ebx),%ebx - movl %ebp,28(%eax) - movl (%esp),%ebp - movl %ecx,40(%eax) - movl 160(%esp),%ecx - movl %esi,44(%eax) - movl %edx,52(%eax) - movl %edi,60(%eax) - movl %ebp,(%eax) - leal 64(%eax),%eax - subl $64,%ecx - jnz L003outer_loop - jmp L006done -L005tail: - addl 112(%esp),%edx - addl 120(%esp),%edi - movl %eax,(%esp) - movl %ebp,16(%esp) - movl %ecx,32(%esp) - movl %esi,36(%esp) - movl %edx,48(%esp) - movl %edi,56(%esp) - movl 4(%esp),%ebp - movl 8(%esp),%ecx - movl 12(%esp),%esi - movl 20(%esp),%edx - movl 24(%esp),%edi - addl $857760878,%ebp - addl $2036477234,%ecx - addl $1797285236,%esi - addl 84(%esp),%edx - addl 88(%esp),%edi - movl %ebp,4(%esp) - movl %ecx,8(%esp) - movl %esi,12(%esp) - movl %edx,20(%esp) - movl %edi,24(%esp) - movl 28(%esp),%ebp - movl 40(%esp),%ecx - movl 44(%esp),%esi - movl 52(%esp),%edx - movl 60(%esp),%edi - addl 92(%esp),%ebp - addl 104(%esp),%ecx - addl 108(%esp),%esi - addl 116(%esp),%edx - addl 124(%esp),%edi - movl %ebp,28(%esp) - movl 156(%esp),%ebp - movl %ecx,40(%esp) - movl 152(%esp),%ecx - movl %esi,44(%esp) - xorl %esi,%esi - movl %edx,52(%esp) - movl %edi,60(%esp) - xorl %eax,%eax - xorl %edx,%edx -L007tail_loop: - movb (%esi,%ebp,1),%al - movb (%esp,%esi,1),%dl - leal 1(%esi),%esi - xorb %dl,%al - movb %al,-1(%ecx,%esi,1) - decl %ebx - jnz L007tail_loop -L006done: - addl $132,%esp -L000no_data: - popl %edi - popl %esi - popl %ebx - popl %ebp - ret -.private_extern __ChaCha20_ssse3 -.align 4 -__ChaCha20_ssse3: - pushl %ebp - pushl %ebx - pushl %esi - pushl %edi -Lssse3_shortcut: - movl 20(%esp),%edi - movl 24(%esp),%esi - movl 28(%esp),%ecx - movl 32(%esp),%edx - movl 36(%esp),%ebx - movl %esp,%ebp - subl $524,%esp - andl $-64,%esp - movl %ebp,512(%esp) - leal Lssse3_data-Lpic_point(%eax),%eax - movdqu (%ebx),%xmm3 - cmpl $256,%ecx - jb L0081x - movl %edx,516(%esp) - movl %ebx,520(%esp) - subl $256,%ecx - leal 384(%esp),%ebp - movdqu (%edx),%xmm7 - pshufd $0,%xmm3,%xmm0 - pshufd $85,%xmm3,%xmm1 - pshufd $170,%xmm3,%xmm2 - pshufd $255,%xmm3,%xmm3 - paddd 48(%eax),%xmm0 - pshufd $0,%xmm7,%xmm4 - pshufd $85,%xmm7,%xmm5 - psubd 64(%eax),%xmm0 - pshufd $170,%xmm7,%xmm6 - pshufd $255,%xmm7,%xmm7 - movdqa %xmm0,64(%ebp) - movdqa %xmm1,80(%ebp) - movdqa %xmm2,96(%ebp) - movdqa %xmm3,112(%ebp) - movdqu 16(%edx),%xmm3 - movdqa %xmm4,-64(%ebp) - movdqa %xmm5,-48(%ebp) - movdqa %xmm6,-32(%ebp) - movdqa %xmm7,-16(%ebp) - movdqa 32(%eax),%xmm7 - leal 128(%esp),%ebx - pshufd $0,%xmm3,%xmm0 - pshufd $85,%xmm3,%xmm1 - pshufd $170,%xmm3,%xmm2 - pshufd $255,%xmm3,%xmm3 - pshufd $0,%xmm7,%xmm4 - pshufd $85,%xmm7,%xmm5 - pshufd $170,%xmm7,%xmm6 - pshufd $255,%xmm7,%xmm7 - movdqa %xmm0,(%ebp) - movdqa %xmm1,16(%ebp) - movdqa %xmm2,32(%ebp) - movdqa %xmm3,48(%ebp) - movdqa %xmm4,-128(%ebp) - movdqa %xmm5,-112(%ebp) - movdqa %xmm6,-96(%ebp) - movdqa %xmm7,-80(%ebp) - leal 128(%esi),%esi - leal 128(%edi),%edi - jmp L009outer_loop -.align 4,0x90 -L009outer_loop: - movdqa -112(%ebp),%xmm1 - movdqa -96(%ebp),%xmm2 - movdqa -80(%ebp),%xmm3 - movdqa -48(%ebp),%xmm5 - movdqa -32(%ebp),%xmm6 - movdqa -16(%ebp),%xmm7 - movdqa %xmm1,-112(%ebx) - movdqa %xmm2,-96(%ebx) - movdqa %xmm3,-80(%ebx) - movdqa %xmm5,-48(%ebx) - movdqa %xmm6,-32(%ebx) - movdqa %xmm7,-16(%ebx) - movdqa 32(%ebp),%xmm2 - movdqa 48(%ebp),%xmm3 - movdqa 64(%ebp),%xmm4 - movdqa 80(%ebp),%xmm5 - movdqa 96(%ebp),%xmm6 - movdqa 112(%ebp),%xmm7 - paddd 64(%eax),%xmm4 - movdqa %xmm2,32(%ebx) - movdqa %xmm3,48(%ebx) - movdqa %xmm4,64(%ebx) - movdqa %xmm5,80(%ebx) - movdqa %xmm6,96(%ebx) - movdqa %xmm7,112(%ebx) - movdqa %xmm4,64(%ebp) - movdqa -128(%ebp),%xmm0 - movdqa %xmm4,%xmm6 - movdqa -64(%ebp),%xmm3 - movdqa (%ebp),%xmm4 - movdqa 16(%ebp),%xmm5 - movl $10,%edx - nop -.align 4,0x90 -L010loop: - paddd %xmm3,%xmm0 - movdqa %xmm3,%xmm2 - pxor %xmm0,%xmm6 - pshufb (%eax),%xmm6 - paddd %xmm6,%xmm4 - pxor %xmm4,%xmm2 - movdqa -48(%ebx),%xmm3 - movdqa %xmm2,%xmm1 - pslld $12,%xmm2 - psrld $20,%xmm1 - por %xmm1,%xmm2 - movdqa -112(%ebx),%xmm1 - paddd %xmm2,%xmm0 - movdqa 80(%ebx),%xmm7 - pxor %xmm0,%xmm6 - movdqa %xmm0,-128(%ebx) - pshufb 16(%eax),%xmm6 - paddd %xmm6,%xmm4 - movdqa %xmm6,64(%ebx) - pxor %xmm4,%xmm2 - paddd %xmm3,%xmm1 - movdqa %xmm2,%xmm0 - pslld $7,%xmm2 - psrld $25,%xmm0 - pxor %xmm1,%xmm7 - por %xmm0,%xmm2 - movdqa %xmm4,(%ebx) - pshufb (%eax),%xmm7 - movdqa %xmm2,-64(%ebx) - paddd %xmm7,%xmm5 - movdqa 32(%ebx),%xmm4 - pxor %xmm5,%xmm3 - movdqa -32(%ebx),%xmm2 - movdqa %xmm3,%xmm0 - pslld $12,%xmm3 - psrld $20,%xmm0 - por %xmm0,%xmm3 - movdqa -96(%ebx),%xmm0 - paddd %xmm3,%xmm1 - movdqa 96(%ebx),%xmm6 - pxor %xmm1,%xmm7 - movdqa %xmm1,-112(%ebx) - pshufb 16(%eax),%xmm7 - paddd %xmm7,%xmm5 - movdqa %xmm7,80(%ebx) - pxor %xmm5,%xmm3 - paddd %xmm2,%xmm0 - movdqa %xmm3,%xmm1 - pslld $7,%xmm3 - psrld $25,%xmm1 - pxor %xmm0,%xmm6 - por %xmm1,%xmm3 - movdqa %xmm5,16(%ebx) - pshufb (%eax),%xmm6 - movdqa %xmm3,-48(%ebx) - paddd %xmm6,%xmm4 - movdqa 48(%ebx),%xmm5 - pxor %xmm4,%xmm2 - movdqa -16(%ebx),%xmm3 - movdqa %xmm2,%xmm1 - pslld $12,%xmm2 - psrld $20,%xmm1 - por %xmm1,%xmm2 - movdqa -80(%ebx),%xmm1 - paddd %xmm2,%xmm0 - movdqa 112(%ebx),%xmm7 - pxor %xmm0,%xmm6 - movdqa %xmm0,-96(%ebx) - pshufb 16(%eax),%xmm6 - paddd %xmm6,%xmm4 - movdqa %xmm6,96(%ebx) - pxor %xmm4,%xmm2 - paddd %xmm3,%xmm1 - movdqa %xmm2,%xmm0 - pslld $7,%xmm2 - psrld $25,%xmm0 - pxor %xmm1,%xmm7 - por %xmm0,%xmm2 - pshufb (%eax),%xmm7 - movdqa %xmm2,-32(%ebx) - paddd %xmm7,%xmm5 - pxor %xmm5,%xmm3 - movdqa -48(%ebx),%xmm2 - movdqa %xmm3,%xmm0 - pslld $12,%xmm3 - psrld $20,%xmm0 - por %xmm0,%xmm3 - movdqa -128(%ebx),%xmm0 - paddd %xmm3,%xmm1 - pxor %xmm1,%xmm7 - movdqa %xmm1,-80(%ebx) - pshufb 16(%eax),%xmm7 - paddd %xmm7,%xmm5 - movdqa %xmm7,%xmm6 - pxor %xmm5,%xmm3 - paddd %xmm2,%xmm0 - movdqa %xmm3,%xmm1 - pslld $7,%xmm3 - psrld $25,%xmm1 - pxor %xmm0,%xmm6 - por %xmm1,%xmm3 - pshufb (%eax),%xmm6 - movdqa %xmm3,-16(%ebx) - paddd %xmm6,%xmm4 - pxor %xmm4,%xmm2 - movdqa -32(%ebx),%xmm3 - movdqa %xmm2,%xmm1 - pslld $12,%xmm2 - psrld $20,%xmm1 - por %xmm1,%xmm2 - movdqa -112(%ebx),%xmm1 - paddd %xmm2,%xmm0 - movdqa 64(%ebx),%xmm7 - pxor %xmm0,%xmm6 - movdqa %xmm0,-128(%ebx) - pshufb 16(%eax),%xmm6 - paddd %xmm6,%xmm4 - movdqa %xmm6,112(%ebx) - pxor %xmm4,%xmm2 - paddd %xmm3,%xmm1 - movdqa %xmm2,%xmm0 - pslld $7,%xmm2 - psrld $25,%xmm0 - pxor %xmm1,%xmm7 - por %xmm0,%xmm2 - movdqa %xmm4,32(%ebx) - pshufb (%eax),%xmm7 - movdqa %xmm2,-48(%ebx) - paddd %xmm7,%xmm5 - movdqa (%ebx),%xmm4 - pxor %xmm5,%xmm3 - movdqa -16(%ebx),%xmm2 - movdqa %xmm3,%xmm0 - pslld $12,%xmm3 - psrld $20,%xmm0 - por %xmm0,%xmm3 - movdqa -96(%ebx),%xmm0 - paddd %xmm3,%xmm1 - movdqa 80(%ebx),%xmm6 - pxor %xmm1,%xmm7 - movdqa %xmm1,-112(%ebx) - pshufb 16(%eax),%xmm7 - paddd %xmm7,%xmm5 - movdqa %xmm7,64(%ebx) - pxor %xmm5,%xmm3 - paddd %xmm2,%xmm0 - movdqa %xmm3,%xmm1 - pslld $7,%xmm3 - psrld $25,%xmm1 - pxor %xmm0,%xmm6 - por %xmm1,%xmm3 - movdqa %xmm5,48(%ebx) - pshufb (%eax),%xmm6 - movdqa %xmm3,-32(%ebx) - paddd %xmm6,%xmm4 - movdqa 16(%ebx),%xmm5 - pxor %xmm4,%xmm2 - movdqa -64(%ebx),%xmm3 - movdqa %xmm2,%xmm1 - pslld $12,%xmm2 - psrld $20,%xmm1 - por %xmm1,%xmm2 - movdqa -80(%ebx),%xmm1 - paddd %xmm2,%xmm0 - movdqa 96(%ebx),%xmm7 - pxor %xmm0,%xmm6 - movdqa %xmm0,-96(%ebx) - pshufb 16(%eax),%xmm6 - paddd %xmm6,%xmm4 - movdqa %xmm6,80(%ebx) - pxor %xmm4,%xmm2 - paddd %xmm3,%xmm1 - movdqa %xmm2,%xmm0 - pslld $7,%xmm2 - psrld $25,%xmm0 - pxor %xmm1,%xmm7 - por %xmm0,%xmm2 - pshufb (%eax),%xmm7 - movdqa %xmm2,-16(%ebx) - paddd %xmm7,%xmm5 - pxor %xmm5,%xmm3 - movdqa %xmm3,%xmm0 - pslld $12,%xmm3 - psrld $20,%xmm0 - por %xmm0,%xmm3 - movdqa -128(%ebx),%xmm0 - paddd %xmm3,%xmm1 - movdqa 64(%ebx),%xmm6 - pxor %xmm1,%xmm7 - movdqa %xmm1,-80(%ebx) - pshufb 16(%eax),%xmm7 - paddd %xmm7,%xmm5 - movdqa %xmm7,96(%ebx) - pxor %xmm5,%xmm3 - movdqa %xmm3,%xmm1 - pslld $7,%xmm3 - psrld $25,%xmm1 - por %xmm1,%xmm3 - decl %edx - jnz L010loop - movdqa %xmm3,-64(%ebx) - movdqa %xmm4,(%ebx) - movdqa %xmm5,16(%ebx) - movdqa %xmm6,64(%ebx) - movdqa %xmm7,96(%ebx) - movdqa -112(%ebx),%xmm1 - movdqa -96(%ebx),%xmm2 - movdqa -80(%ebx),%xmm3 - paddd -128(%ebp),%xmm0 - paddd -112(%ebp),%xmm1 - paddd -96(%ebp),%xmm2 - paddd -80(%ebp),%xmm3 - movdqa %xmm0,%xmm6 - punpckldq %xmm1,%xmm0 - movdqa %xmm2,%xmm7 - punpckldq %xmm3,%xmm2 - punpckhdq %xmm1,%xmm6 - punpckhdq %xmm3,%xmm7 - movdqa %xmm0,%xmm1 - punpcklqdq %xmm2,%xmm0 - movdqa %xmm6,%xmm3 - punpcklqdq %xmm7,%xmm6 - punpckhqdq %xmm2,%xmm1 - punpckhqdq %xmm7,%xmm3 - movdqu -128(%esi),%xmm4 - movdqu -64(%esi),%xmm5 - movdqu (%esi),%xmm2 - movdqu 64(%esi),%xmm7 - leal 16(%esi),%esi - pxor %xmm0,%xmm4 - movdqa -64(%ebx),%xmm0 - pxor %xmm1,%xmm5 - movdqa -48(%ebx),%xmm1 - pxor %xmm2,%xmm6 - movdqa -32(%ebx),%xmm2 - pxor %xmm3,%xmm7 - movdqa -16(%ebx),%xmm3 - movdqu %xmm4,-128(%edi) - movdqu %xmm5,-64(%edi) - movdqu %xmm6,(%edi) - movdqu %xmm7,64(%edi) - leal 16(%edi),%edi - paddd -64(%ebp),%xmm0 - paddd -48(%ebp),%xmm1 - paddd -32(%ebp),%xmm2 - paddd -16(%ebp),%xmm3 - movdqa %xmm0,%xmm6 - punpckldq %xmm1,%xmm0 - movdqa %xmm2,%xmm7 - punpckldq %xmm3,%xmm2 - punpckhdq %xmm1,%xmm6 - punpckhdq %xmm3,%xmm7 - movdqa %xmm0,%xmm1 - punpcklqdq %xmm2,%xmm0 - movdqa %xmm6,%xmm3 - punpcklqdq %xmm7,%xmm6 - punpckhqdq %xmm2,%xmm1 - punpckhqdq %xmm7,%xmm3 - movdqu -128(%esi),%xmm4 - movdqu -64(%esi),%xmm5 - movdqu (%esi),%xmm2 - movdqu 64(%esi),%xmm7 - leal 16(%esi),%esi - pxor %xmm0,%xmm4 - movdqa (%ebx),%xmm0 - pxor %xmm1,%xmm5 - movdqa 16(%ebx),%xmm1 - pxor %xmm2,%xmm6 - movdqa 32(%ebx),%xmm2 - pxor %xmm3,%xmm7 - movdqa 48(%ebx),%xmm3 - movdqu %xmm4,-128(%edi) - movdqu %xmm5,-64(%edi) - movdqu %xmm6,(%edi) - movdqu %xmm7,64(%edi) - leal 16(%edi),%edi - paddd (%ebp),%xmm0 - paddd 16(%ebp),%xmm1 - paddd 32(%ebp),%xmm2 - paddd 48(%ebp),%xmm3 - movdqa %xmm0,%xmm6 - punpckldq %xmm1,%xmm0 - movdqa %xmm2,%xmm7 - punpckldq %xmm3,%xmm2 - punpckhdq %xmm1,%xmm6 - punpckhdq %xmm3,%xmm7 - movdqa %xmm0,%xmm1 - punpcklqdq %xmm2,%xmm0 - movdqa %xmm6,%xmm3 - punpcklqdq %xmm7,%xmm6 - punpckhqdq %xmm2,%xmm1 - punpckhqdq %xmm7,%xmm3 - movdqu -128(%esi),%xmm4 - movdqu -64(%esi),%xmm5 - movdqu (%esi),%xmm2 - movdqu 64(%esi),%xmm7 - leal 16(%esi),%esi - pxor %xmm0,%xmm4 - movdqa 64(%ebx),%xmm0 - pxor %xmm1,%xmm5 - movdqa 80(%ebx),%xmm1 - pxor %xmm2,%xmm6 - movdqa 96(%ebx),%xmm2 - pxor %xmm3,%xmm7 - movdqa 112(%ebx),%xmm3 - movdqu %xmm4,-128(%edi) - movdqu %xmm5,-64(%edi) - movdqu %xmm6,(%edi) - movdqu %xmm7,64(%edi) - leal 16(%edi),%edi - paddd 64(%ebp),%xmm0 - paddd 80(%ebp),%xmm1 - paddd 96(%ebp),%xmm2 - paddd 112(%ebp),%xmm3 - movdqa %xmm0,%xmm6 - punpckldq %xmm1,%xmm0 - movdqa %xmm2,%xmm7 - punpckldq %xmm3,%xmm2 - punpckhdq %xmm1,%xmm6 - punpckhdq %xmm3,%xmm7 - movdqa %xmm0,%xmm1 - punpcklqdq %xmm2,%xmm0 - movdqa %xmm6,%xmm3 - punpcklqdq %xmm7,%xmm6 - punpckhqdq %xmm2,%xmm1 - punpckhqdq %xmm7,%xmm3 - movdqu -128(%esi),%xmm4 - movdqu -64(%esi),%xmm5 - movdqu (%esi),%xmm2 - movdqu 64(%esi),%xmm7 - leal 208(%esi),%esi - pxor %xmm0,%xmm4 - pxor %xmm1,%xmm5 - pxor %xmm2,%xmm6 - pxor %xmm3,%xmm7 - movdqu %xmm4,-128(%edi) - movdqu %xmm5,-64(%edi) - movdqu %xmm6,(%edi) - movdqu %xmm7,64(%edi) - leal 208(%edi),%edi - subl $256,%ecx - jnc L009outer_loop - addl $256,%ecx - jz L011done - movl 520(%esp),%ebx - leal -128(%esi),%esi - movl 516(%esp),%edx - leal -128(%edi),%edi - movd 64(%ebp),%xmm2 - movdqu (%ebx),%xmm3 - paddd 96(%eax),%xmm2 - pand 112(%eax),%xmm3 - por %xmm2,%xmm3 -L0081x: - movdqa 32(%eax),%xmm0 - movdqu (%edx),%xmm1 - movdqu 16(%edx),%xmm2 - movdqa (%eax),%xmm6 - movdqa 16(%eax),%xmm7 - movl %ebp,48(%esp) - movdqa %xmm0,(%esp) - movdqa %xmm1,16(%esp) - movdqa %xmm2,32(%esp) - movdqa %xmm3,48(%esp) - movl $10,%edx - jmp L012loop1x -.align 4,0x90 -L013outer1x: - movdqa 80(%eax),%xmm3 - movdqa (%esp),%xmm0 - movdqa 16(%esp),%xmm1 - movdqa 32(%esp),%xmm2 - paddd 48(%esp),%xmm3 - movl $10,%edx - movdqa %xmm3,48(%esp) - jmp L012loop1x -.align 4,0x90 -L012loop1x: - paddd %xmm1,%xmm0 - pxor %xmm0,%xmm3 -.byte 102,15,56,0,222 - paddd %xmm3,%xmm2 - pxor %xmm2,%xmm1 - movdqa %xmm1,%xmm4 - psrld $20,%xmm1 - pslld $12,%xmm4 - por %xmm4,%xmm1 - paddd %xmm1,%xmm0 - pxor %xmm0,%xmm3 -.byte 102,15,56,0,223 - paddd %xmm3,%xmm2 - pxor %xmm2,%xmm1 - movdqa %xmm1,%xmm4 - psrld $25,%xmm1 - pslld $7,%xmm4 - por %xmm4,%xmm1 - pshufd $78,%xmm2,%xmm2 - pshufd $57,%xmm1,%xmm1 - pshufd $147,%xmm3,%xmm3 - nop - paddd %xmm1,%xmm0 - pxor %xmm0,%xmm3 -.byte 102,15,56,0,222 - paddd %xmm3,%xmm2 - pxor %xmm2,%xmm1 - movdqa %xmm1,%xmm4 - psrld $20,%xmm1 - pslld $12,%xmm4 - por %xmm4,%xmm1 - paddd %xmm1,%xmm0 - pxor %xmm0,%xmm3 -.byte 102,15,56,0,223 - paddd %xmm3,%xmm2 - pxor %xmm2,%xmm1 - movdqa %xmm1,%xmm4 - psrld $25,%xmm1 - pslld $7,%xmm4 - por %xmm4,%xmm1 - pshufd $78,%xmm2,%xmm2 - pshufd $147,%xmm1,%xmm1 - pshufd $57,%xmm3,%xmm3 - decl %edx - jnz L012loop1x - paddd (%esp),%xmm0 - paddd 16(%esp),%xmm1 - paddd 32(%esp),%xmm2 - paddd 48(%esp),%xmm3 - cmpl $64,%ecx - jb L014tail - movdqu (%esi),%xmm4 - movdqu 16(%esi),%xmm5 - pxor %xmm4,%xmm0 - movdqu 32(%esi),%xmm4 - pxor %xmm5,%xmm1 - movdqu 48(%esi),%xmm5 - pxor %xmm4,%xmm2 - pxor %xmm5,%xmm3 - leal 64(%esi),%esi - movdqu %xmm0,(%edi) - movdqu %xmm1,16(%edi) - movdqu %xmm2,32(%edi) - movdqu %xmm3,48(%edi) - leal 64(%edi),%edi - subl $64,%ecx - jnz L013outer1x - jmp L011done -L014tail: - movdqa %xmm0,(%esp) - movdqa %xmm1,16(%esp) - movdqa %xmm2,32(%esp) - movdqa %xmm3,48(%esp) - xorl %eax,%eax - xorl %edx,%edx - xorl %ebp,%ebp -L015tail_loop: - movb (%esp,%ebp,1),%al - movb (%esi,%ebp,1),%dl - leal 1(%ebp),%ebp - xorb %dl,%al - movb %al,-1(%edi,%ebp,1) - decl %ecx - jnz L015tail_loop -L011done: - movl 512(%esp),%esp - popl %edi - popl %esi - popl %ebx - popl %ebp - ret -.align 6,0x90 -Lssse3_data: -.byte 2,3,0,1,6,7,4,5,10,11,8,9,14,15,12,13 -.byte 3,0,1,2,7,4,5,6,11,8,9,10,15,12,13,14 -.long 1634760805,857760878,2036477234,1797285236 -.long 0,1,2,3 -.long 4,4,4,4 -.long 1,0,0,0 -.long 4,0,0,0 -.long 0,-1,-1,-1 -.align 6,0x90 -.byte 67,104,97,67,104,97,50,48,32,102,111,114,32,120,56,54 -.byte 44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32 -.byte 60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111 -.byte 114,103,62,0 -.section __IMPORT,__pointers,non_lazy_symbol_pointers -L_GFp_ia32cap_P$non_lazy_ptr: -.indirect_symbol _GFp_ia32cap_P -.long 0 -#endif Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/chacha-x86-win32n.obj and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/chacha-x86-win32n.obj differ diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ecp_nistz256-armv4-ios32.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ecp_nistz256-armv4-ios32.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ecp_nistz256-armv4-ios32.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ecp_nistz256-armv4-ios32.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,1114 +0,0 @@ -// This file is generated from a similarly-named Perl script in the BoringSSL -// source tree. Do not edit by hand. - -#if !defined(__has_feature) -#define __has_feature(x) 0 -#endif -#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) -#define OPENSSL_NO_ASM -#endif - -#if !defined(OPENSSL_NO_ASM) -#include - -.text -#if defined(__thumb2__) -.syntax unified -.thumb -#else -.code 32 -#endif - -.byte 69,67,80,95,78,73,83,84,90,50,53,54,32,102,111,114,32,65,82,77,118,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 -.align 2 -.align 6 -#ifdef __thumb2__ -.thumb_func __ecp_nistz256_mul_by_2 -#endif -.align 4 -__ecp_nistz256_mul_by_2: - ldr r4,[r1,#0] - ldr r5,[r1,#4] - ldr r6,[r1,#8] - adds r4,r4,r4 @ a[0:7]+=a[0:7], i.e. add with itself - ldr r7,[r1,#12] - adcs r5,r5,r5 - ldr r8,[r1,#16] - adcs r6,r6,r6 - ldr r9,[r1,#20] - adcs r7,r7,r7 - ldr r10,[r1,#24] - adcs r8,r8,r8 - ldr r11,[r1,#28] - adcs r9,r9,r9 - adcs r10,r10,r10 - mov r3,#0 - adcs r11,r11,r11 - adc r3,r3,#0 - - b Lreduce_by_sub - - -@ void GFp_nistz256_add(BN_ULONG r0[8],const BN_ULONG r1[8], -@ const BN_ULONG r2[8]); -.globl _GFp_nistz256_add -.private_extern _GFp_nistz256_add -#ifdef __thumb2__ -.thumb_func _GFp_nistz256_add -#endif -.align 4 -_GFp_nistz256_add: - stmdb sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} - bl __ecp_nistz256_add -#if __ARM_ARCH__>=5 || !defined(__thumb__) - ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,pc} -#else - ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} - bx lr @ interoperable with Thumb ISA:-) -#endif - - -#ifdef __thumb2__ -.thumb_func __ecp_nistz256_add -#endif -.align 4 -__ecp_nistz256_add: - str lr,[sp,#-4]! @ push lr - - ldr r4,[r1,#0] - ldr r5,[r1,#4] - ldr r6,[r1,#8] - ldr r7,[r1,#12] - ldr r8,[r1,#16] - ldr r3,[r2,#0] - ldr r9,[r1,#20] - ldr r12,[r2,#4] - ldr r10,[r1,#24] - ldr r14,[r2,#8] - ldr r11,[r1,#28] - ldr r1,[r2,#12] - adds r4,r4,r3 - ldr r3,[r2,#16] - adcs r5,r5,r12 - ldr r12,[r2,#20] - adcs r6,r6,r14 - ldr r14,[r2,#24] - adcs r7,r7,r1 - ldr r1,[r2,#28] - adcs r8,r8,r3 - adcs r9,r9,r12 - adcs r10,r10,r14 - mov r3,#0 - adcs r11,r11,r1 - adc r3,r3,#0 - ldr lr,[sp],#4 @ pop lr - -Lreduce_by_sub: - - @ if a+b >= modulus, subtract modulus. - @ - @ But since comparison implies subtraction, we subtract - @ modulus and then add it back if subtraction borrowed. - - subs r4,r4,#-1 - sbcs r5,r5,#-1 - sbcs r6,r6,#-1 - sbcs r7,r7,#0 - sbcs r8,r8,#0 - sbcs r9,r9,#0 - sbcs r10,r10,#1 - sbcs r11,r11,#-1 - sbc r3,r3,#0 - - @ Note that because mod has special form, i.e. consists of - @ 0xffffffff, 1 and 0s, we can conditionally synthesize it by - @ using value of borrow as a whole or extracting single bit. - @ Follow r3 register... - - adds r4,r4,r3 @ add synthesized modulus - adcs r5,r5,r3 - str r4,[r0,#0] - adcs r6,r6,r3 - str r5,[r0,#4] - adcs r7,r7,#0 - str r6,[r0,#8] - adcs r8,r8,#0 - str r7,[r0,#12] - adcs r9,r9,#0 - str r8,[r0,#16] - adcs r10,r10,r3,lsr#31 - str r9,[r0,#20] - adcs r11,r11,r3 - str r10,[r0,#24] - str r11,[r0,#28] - - mov pc,lr - - -#ifdef __thumb2__ -.thumb_func __ecp_nistz256_mul_by_3 -#endif -.align 4 -__ecp_nistz256_mul_by_3: - str lr,[sp,#-4]! @ push lr - - @ As multiplication by 3 is performed as 2*n+n, below are inline - @ copies of __ecp_nistz256_mul_by_2 and __ecp_nistz256_add, see - @ corresponding subroutines for details. - - ldr r4,[r1,#0] - ldr r5,[r1,#4] - ldr r6,[r1,#8] - adds r4,r4,r4 @ a[0:7]+=a[0:7] - ldr r7,[r1,#12] - adcs r5,r5,r5 - ldr r8,[r1,#16] - adcs r6,r6,r6 - ldr r9,[r1,#20] - adcs r7,r7,r7 - ldr r10,[r1,#24] - adcs r8,r8,r8 - ldr r11,[r1,#28] - adcs r9,r9,r9 - adcs r10,r10,r10 - mov r3,#0 - adcs r11,r11,r11 - adc r3,r3,#0 - - subs r4,r4,#-1 @ Lreduce_by_sub but without stores - sbcs r5,r5,#-1 - sbcs r6,r6,#-1 - sbcs r7,r7,#0 - sbcs r8,r8,#0 - sbcs r9,r9,#0 - sbcs r10,r10,#1 - sbcs r11,r11,#-1 - sbc r3,r3,#0 - - adds r4,r4,r3 @ add synthesized modulus - adcs r5,r5,r3 - adcs r6,r6,r3 - adcs r7,r7,#0 - adcs r8,r8,#0 - ldr r2,[r1,#0] - adcs r9,r9,#0 - ldr r12,[r1,#4] - adcs r10,r10,r3,lsr#31 - ldr r14,[r1,#8] - adc r11,r11,r3 - - ldr r3,[r1,#12] - adds r4,r4,r2 @ 2*a[0:7]+=a[0:7] - ldr r2,[r1,#16] - adcs r5,r5,r12 - ldr r12,[r1,#20] - adcs r6,r6,r14 - ldr r14,[r1,#24] - adcs r7,r7,r3 - ldr r1,[r1,#28] - adcs r8,r8,r2 - adcs r9,r9,r12 - adcs r10,r10,r14 - mov r3,#0 - adcs r11,r11,r1 - adc r3,r3,#0 - ldr lr,[sp],#4 @ pop lr - - b Lreduce_by_sub - - -#ifdef __thumb2__ -.thumb_func __ecp_nistz256_div_by_2 -#endif -.align 4 -__ecp_nistz256_div_by_2: - @ ret = (a is odd ? a+mod : a) >> 1 - - ldr r4,[r1,#0] - ldr r5,[r1,#4] - ldr r6,[r1,#8] - mov r3,r4,lsl#31 @ place least significant bit to most - @ significant position, now arithmetic - @ right shift by 31 will produce -1 or - @ 0, while logical right shift 1 or 0, - @ this is how modulus is conditionally - @ synthesized in this case... - ldr r7,[r1,#12] - adds r4,r4,r3,asr#31 - ldr r8,[r1,#16] - adcs r5,r5,r3,asr#31 - ldr r9,[r1,#20] - adcs r6,r6,r3,asr#31 - ldr r10,[r1,#24] - adcs r7,r7,#0 - ldr r11,[r1,#28] - adcs r8,r8,#0 - mov r4,r4,lsr#1 @ a[0:7]>>=1, we can start early - @ because it doesn't affect flags - adcs r9,r9,#0 - orr r4,r4,r5,lsl#31 - adcs r10,r10,r3,lsr#31 - mov r2,#0 - adcs r11,r11,r3,asr#31 - mov r5,r5,lsr#1 - adc r2,r2,#0 @ top-most carry bit from addition - - orr r5,r5,r6,lsl#31 - mov r6,r6,lsr#1 - str r4,[r0,#0] - orr r6,r6,r7,lsl#31 - mov r7,r7,lsr#1 - str r5,[r0,#4] - orr r7,r7,r8,lsl#31 - mov r8,r8,lsr#1 - str r6,[r0,#8] - orr r8,r8,r9,lsl#31 - mov r9,r9,lsr#1 - str r7,[r0,#12] - orr r9,r9,r10,lsl#31 - mov r10,r10,lsr#1 - str r8,[r0,#16] - orr r10,r10,r11,lsl#31 - mov r11,r11,lsr#1 - str r9,[r0,#20] - orr r11,r11,r2,lsl#31 @ don't forget the top-most carry bit - str r10,[r0,#24] - str r11,[r0,#28] - - mov pc,lr - - -#ifdef __thumb2__ -.thumb_func __ecp_nistz256_sub -#endif -.align 4 -__ecp_nistz256_sub: - str lr,[sp,#-4]! @ push lr - - ldr r4,[r1,#0] - ldr r5,[r1,#4] - ldr r6,[r1,#8] - ldr r7,[r1,#12] - ldr r8,[r1,#16] - ldr r3,[r2,#0] - ldr r9,[r1,#20] - ldr r12,[r2,#4] - ldr r10,[r1,#24] - ldr r14,[r2,#8] - ldr r11,[r1,#28] - ldr r1,[r2,#12] - subs r4,r4,r3 - ldr r3,[r2,#16] - sbcs r5,r5,r12 - ldr r12,[r2,#20] - sbcs r6,r6,r14 - ldr r14,[r2,#24] - sbcs r7,r7,r1 - ldr r1,[r2,#28] - sbcs r8,r8,r3 - sbcs r9,r9,r12 - sbcs r10,r10,r14 - sbcs r11,r11,r1 - sbc r3,r3,r3 @ broadcast borrow bit - ldr lr,[sp],#4 @ pop lr - -Lreduce_by_add: - - @ if a-b borrows, add modulus. - @ - @ Note that because mod has special form, i.e. consists of - @ 0xffffffff, 1 and 0s, we can conditionally synthesize it by - @ broadcasting borrow bit to a register, r3, and using it as - @ a whole or extracting single bit. - - adds r4,r4,r3 @ add synthesized modulus - adcs r5,r5,r3 - str r4,[r0,#0] - adcs r6,r6,r3 - str r5,[r0,#4] - adcs r7,r7,#0 - str r6,[r0,#8] - adcs r8,r8,#0 - str r7,[r0,#12] - adcs r9,r9,#0 - str r8,[r0,#16] - adcs r10,r10,r3,lsr#31 - str r9,[r0,#20] - adcs r11,r11,r3 - str r10,[r0,#24] - str r11,[r0,#28] - - mov pc,lr - - -@ void GFp_nistz256_neg(BN_ULONG r0[8],const BN_ULONG r1[8]); -.globl _GFp_nistz256_neg -.private_extern _GFp_nistz256_neg -#ifdef __thumb2__ -.thumb_func _GFp_nistz256_neg -#endif -.align 4 -_GFp_nistz256_neg: - stmdb sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} - bl __ecp_nistz256_neg -#if __ARM_ARCH__>=5 || !defined(__thumb__) - ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,pc} -#else - ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} - bx lr @ interoperable with Thumb ISA:-) -#endif - - -#ifdef __thumb2__ -.thumb_func __ecp_nistz256_neg -#endif -.align 4 -__ecp_nistz256_neg: - ldr r4,[r1,#0] - eor r3,r3,r3 - ldr r5,[r1,#4] - ldr r6,[r1,#8] - subs r4,r3,r4 - ldr r7,[r1,#12] - sbcs r5,r3,r5 - ldr r8,[r1,#16] - sbcs r6,r3,r6 - ldr r9,[r1,#20] - sbcs r7,r3,r7 - ldr r10,[r1,#24] - sbcs r8,r3,r8 - ldr r11,[r1,#28] - sbcs r9,r3,r9 - sbcs r10,r3,r10 - sbcs r11,r3,r11 - sbc r3,r3,r3 - - b Lreduce_by_add - -@ void GFp_nistz256_mul_mont(BN_ULONG r0[8],const BN_ULONG r1[8], -@ const BN_ULONG r2[8]); -.globl _GFp_nistz256_mul_mont -.private_extern _GFp_nistz256_mul_mont -#ifdef __thumb2__ -.thumb_func _GFp_nistz256_mul_mont -#endif -.align 4 -_GFp_nistz256_mul_mont: - stmdb sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} - bl __ecp_nistz256_mul_mont -#if __ARM_ARCH__>=5 || !defined(__thumb__) - ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,pc} -#else - ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} - bx lr @ interoperable with Thumb ISA:-) -#endif - - -#ifdef __thumb2__ -.thumb_func __ecp_nistz256_mul_mont -#endif -.align 4 -__ecp_nistz256_mul_mont: - stmdb sp!,{r0,r1,r2,lr} @ make a copy of arguments too - - ldr r2,[r2,#0] @ b[0] - ldmia r1,{r4,r5,r6,r7,r8,r9,r10,r11} - - umull r3,r14,r4,r2 @ r[0]=a[0]*b[0] - stmdb sp!,{r4,r5,r6,r7,r8,r9,r10,r11} @ copy a[0-7] to stack, so - @ that it can be addressed - @ without spending register - @ on address - umull r4,r0,r5,r2 @ r[1]=a[1]*b[0] - umull r5,r1,r6,r2 - adds r4,r4,r14 @ accumulate high part of mult - umull r6,r12,r7,r2 - adcs r5,r5,r0 - umull r7,r14,r8,r2 - adcs r6,r6,r1 - umull r8,r0,r9,r2 - adcs r7,r7,r12 - umull r9,r1,r10,r2 - adcs r8,r8,r14 - umull r10,r12,r11,r2 - adcs r9,r9,r0 - adcs r10,r10,r1 - eor r14,r14,r14 @ first overflow bit is zero - adc r11,r12,#0 - @ multiplication-less reduction 1 - adds r6,r6,r3 @ r[3]+=r[0] - ldr r2,[sp,#40] @ restore b_ptr - adcs r7,r7,#0 @ r[4]+=0 - adcs r8,r8,#0 @ r[5]+=0 - adcs r9,r9,r3 @ r[6]+=r[0] - ldr r1,[sp,#0] @ load a[0] - adcs r10,r10,#0 @ r[7]+=0 - ldr r2,[r2,#4*1] @ load b[i] - adcs r11,r11,r3 @ r[8]+=r[0] - eor r0,r0,r0 - adc r14,r14,#0 @ overflow bit - subs r10,r10,r3 @ r[7]-=r[0] - ldr r12,[sp,#4] @ a[1] - sbcs r11,r11,#0 @ r[8]-=0 - umlal r4,r0,r1,r2 @ "r[0]"+=a[0]*b[i] - eor r1,r1,r1 - sbc r3,r14,#0 @ overflow bit, keep in mind - @ that netto result is - @ addition of a value which - @ makes underflow impossible - - ldr r14,[sp,#8] @ a[2] - umlal r5,r1,r12,r2 @ "r[1]"+=a[1]*b[i] - str r3,[sp,#36] @ temporarily offload overflow - eor r12,r12,r12 - ldr r3,[sp,#12] @ a[3], r3 is alias r3 - umlal r6,r12,r14,r2 @ "r[2]"+=a[2]*b[i] - eor r14,r14,r14 - adds r5,r5,r0 @ accumulate high part of mult - ldr r0,[sp,#16] @ a[4] - umlal r7,r14,r3,r2 @ "r[3]"+=a[3]*b[i] - eor r3,r3,r3 - adcs r6,r6,r1 - ldr r1,[sp,#20] @ a[5] - umlal r8,r3,r0,r2 @ "r[4]"+=a[4]*b[i] - eor r0,r0,r0 - adcs r7,r7,r12 - ldr r12,[sp,#24] @ a[6] - umlal r9,r0,r1,r2 @ "r[5]"+=a[5]*b[i] - eor r1,r1,r1 - adcs r8,r8,r14 - ldr r14,[sp,#28] @ a[7] - umlal r10,r1,r12,r2 @ "r[6]"+=a[6]*b[i] - eor r12,r12,r12 - adcs r9,r9,r3 - ldr r3,[sp,#36] @ restore overflow bit - umlal r11,r12,r14,r2 @ "r[7]"+=a[7]*b[i] - eor r14,r14,r14 - adcs r10,r10,r0 - adcs r11,r11,r1 - adcs r3,r3,r12 - adc r14,r14,#0 @ new overflow bit - @ multiplication-less reduction 2 - adds r7,r7,r4 @ r[3]+=r[0] - ldr r2,[sp,#40] @ restore b_ptr - adcs r8,r8,#0 @ r[4]+=0 - adcs r9,r9,#0 @ r[5]+=0 - adcs r10,r10,r4 @ r[6]+=r[0] - ldr r1,[sp,#0] @ load a[0] - adcs r11,r11,#0 @ r[7]+=0 - ldr r2,[r2,#4*2] @ load b[i] - adcs r3,r3,r4 @ r[8]+=r[0] - eor r0,r0,r0 - adc r14,r14,#0 @ overflow bit - subs r11,r11,r4 @ r[7]-=r[0] - ldr r12,[sp,#4] @ a[1] - sbcs r3,r3,#0 @ r[8]-=0 - umlal r5,r0,r1,r2 @ "r[0]"+=a[0]*b[i] - eor r1,r1,r1 - sbc r4,r14,#0 @ overflow bit, keep in mind - @ that netto result is - @ addition of a value which - @ makes underflow impossible - - ldr r14,[sp,#8] @ a[2] - umlal r6,r1,r12,r2 @ "r[1]"+=a[1]*b[i] - str r4,[sp,#36] @ temporarily offload overflow - eor r12,r12,r12 - ldr r4,[sp,#12] @ a[3], r4 is alias r4 - umlal r7,r12,r14,r2 @ "r[2]"+=a[2]*b[i] - eor r14,r14,r14 - adds r6,r6,r0 @ accumulate high part of mult - ldr r0,[sp,#16] @ a[4] - umlal r8,r14,r4,r2 @ "r[3]"+=a[3]*b[i] - eor r4,r4,r4 - adcs r7,r7,r1 - ldr r1,[sp,#20] @ a[5] - umlal r9,r4,r0,r2 @ "r[4]"+=a[4]*b[i] - eor r0,r0,r0 - adcs r8,r8,r12 - ldr r12,[sp,#24] @ a[6] - umlal r10,r0,r1,r2 @ "r[5]"+=a[5]*b[i] - eor r1,r1,r1 - adcs r9,r9,r14 - ldr r14,[sp,#28] @ a[7] - umlal r11,r1,r12,r2 @ "r[6]"+=a[6]*b[i] - eor r12,r12,r12 - adcs r10,r10,r4 - ldr r4,[sp,#36] @ restore overflow bit - umlal r3,r12,r14,r2 @ "r[7]"+=a[7]*b[i] - eor r14,r14,r14 - adcs r11,r11,r0 - adcs r3,r3,r1 - adcs r4,r4,r12 - adc r14,r14,#0 @ new overflow bit - @ multiplication-less reduction 3 - adds r8,r8,r5 @ r[3]+=r[0] - ldr r2,[sp,#40] @ restore b_ptr - adcs r9,r9,#0 @ r[4]+=0 - adcs r10,r10,#0 @ r[5]+=0 - adcs r11,r11,r5 @ r[6]+=r[0] - ldr r1,[sp,#0] @ load a[0] - adcs r3,r3,#0 @ r[7]+=0 - ldr r2,[r2,#4*3] @ load b[i] - adcs r4,r4,r5 @ r[8]+=r[0] - eor r0,r0,r0 - adc r14,r14,#0 @ overflow bit - subs r3,r3,r5 @ r[7]-=r[0] - ldr r12,[sp,#4] @ a[1] - sbcs r4,r4,#0 @ r[8]-=0 - umlal r6,r0,r1,r2 @ "r[0]"+=a[0]*b[i] - eor r1,r1,r1 - sbc r5,r14,#0 @ overflow bit, keep in mind - @ that netto result is - @ addition of a value which - @ makes underflow impossible - - ldr r14,[sp,#8] @ a[2] - umlal r7,r1,r12,r2 @ "r[1]"+=a[1]*b[i] - str r5,[sp,#36] @ temporarily offload overflow - eor r12,r12,r12 - ldr r5,[sp,#12] @ a[3], r5 is alias r5 - umlal r8,r12,r14,r2 @ "r[2]"+=a[2]*b[i] - eor r14,r14,r14 - adds r7,r7,r0 @ accumulate high part of mult - ldr r0,[sp,#16] @ a[4] - umlal r9,r14,r5,r2 @ "r[3]"+=a[3]*b[i] - eor r5,r5,r5 - adcs r8,r8,r1 - ldr r1,[sp,#20] @ a[5] - umlal r10,r5,r0,r2 @ "r[4]"+=a[4]*b[i] - eor r0,r0,r0 - adcs r9,r9,r12 - ldr r12,[sp,#24] @ a[6] - umlal r11,r0,r1,r2 @ "r[5]"+=a[5]*b[i] - eor r1,r1,r1 - adcs r10,r10,r14 - ldr r14,[sp,#28] @ a[7] - umlal r3,r1,r12,r2 @ "r[6]"+=a[6]*b[i] - eor r12,r12,r12 - adcs r11,r11,r5 - ldr r5,[sp,#36] @ restore overflow bit - umlal r4,r12,r14,r2 @ "r[7]"+=a[7]*b[i] - eor r14,r14,r14 - adcs r3,r3,r0 - adcs r4,r4,r1 - adcs r5,r5,r12 - adc r14,r14,#0 @ new overflow bit - @ multiplication-less reduction 4 - adds r9,r9,r6 @ r[3]+=r[0] - ldr r2,[sp,#40] @ restore b_ptr - adcs r10,r10,#0 @ r[4]+=0 - adcs r11,r11,#0 @ r[5]+=0 - adcs r3,r3,r6 @ r[6]+=r[0] - ldr r1,[sp,#0] @ load a[0] - adcs r4,r4,#0 @ r[7]+=0 - ldr r2,[r2,#4*4] @ load b[i] - adcs r5,r5,r6 @ r[8]+=r[0] - eor r0,r0,r0 - adc r14,r14,#0 @ overflow bit - subs r4,r4,r6 @ r[7]-=r[0] - ldr r12,[sp,#4] @ a[1] - sbcs r5,r5,#0 @ r[8]-=0 - umlal r7,r0,r1,r2 @ "r[0]"+=a[0]*b[i] - eor r1,r1,r1 - sbc r6,r14,#0 @ overflow bit, keep in mind - @ that netto result is - @ addition of a value which - @ makes underflow impossible - - ldr r14,[sp,#8] @ a[2] - umlal r8,r1,r12,r2 @ "r[1]"+=a[1]*b[i] - str r6,[sp,#36] @ temporarily offload overflow - eor r12,r12,r12 - ldr r6,[sp,#12] @ a[3], r6 is alias r6 - umlal r9,r12,r14,r2 @ "r[2]"+=a[2]*b[i] - eor r14,r14,r14 - adds r8,r8,r0 @ accumulate high part of mult - ldr r0,[sp,#16] @ a[4] - umlal r10,r14,r6,r2 @ "r[3]"+=a[3]*b[i] - eor r6,r6,r6 - adcs r9,r9,r1 - ldr r1,[sp,#20] @ a[5] - umlal r11,r6,r0,r2 @ "r[4]"+=a[4]*b[i] - eor r0,r0,r0 - adcs r10,r10,r12 - ldr r12,[sp,#24] @ a[6] - umlal r3,r0,r1,r2 @ "r[5]"+=a[5]*b[i] - eor r1,r1,r1 - adcs r11,r11,r14 - ldr r14,[sp,#28] @ a[7] - umlal r4,r1,r12,r2 @ "r[6]"+=a[6]*b[i] - eor r12,r12,r12 - adcs r3,r3,r6 - ldr r6,[sp,#36] @ restore overflow bit - umlal r5,r12,r14,r2 @ "r[7]"+=a[7]*b[i] - eor r14,r14,r14 - adcs r4,r4,r0 - adcs r5,r5,r1 - adcs r6,r6,r12 - adc r14,r14,#0 @ new overflow bit - @ multiplication-less reduction 5 - adds r10,r10,r7 @ r[3]+=r[0] - ldr r2,[sp,#40] @ restore b_ptr - adcs r11,r11,#0 @ r[4]+=0 - adcs r3,r3,#0 @ r[5]+=0 - adcs r4,r4,r7 @ r[6]+=r[0] - ldr r1,[sp,#0] @ load a[0] - adcs r5,r5,#0 @ r[7]+=0 - ldr r2,[r2,#4*5] @ load b[i] - adcs r6,r6,r7 @ r[8]+=r[0] - eor r0,r0,r0 - adc r14,r14,#0 @ overflow bit - subs r5,r5,r7 @ r[7]-=r[0] - ldr r12,[sp,#4] @ a[1] - sbcs r6,r6,#0 @ r[8]-=0 - umlal r8,r0,r1,r2 @ "r[0]"+=a[0]*b[i] - eor r1,r1,r1 - sbc r7,r14,#0 @ overflow bit, keep in mind - @ that netto result is - @ addition of a value which - @ makes underflow impossible - - ldr r14,[sp,#8] @ a[2] - umlal r9,r1,r12,r2 @ "r[1]"+=a[1]*b[i] - str r7,[sp,#36] @ temporarily offload overflow - eor r12,r12,r12 - ldr r7,[sp,#12] @ a[3], r7 is alias r7 - umlal r10,r12,r14,r2 @ "r[2]"+=a[2]*b[i] - eor r14,r14,r14 - adds r9,r9,r0 @ accumulate high part of mult - ldr r0,[sp,#16] @ a[4] - umlal r11,r14,r7,r2 @ "r[3]"+=a[3]*b[i] - eor r7,r7,r7 - adcs r10,r10,r1 - ldr r1,[sp,#20] @ a[5] - umlal r3,r7,r0,r2 @ "r[4]"+=a[4]*b[i] - eor r0,r0,r0 - adcs r11,r11,r12 - ldr r12,[sp,#24] @ a[6] - umlal r4,r0,r1,r2 @ "r[5]"+=a[5]*b[i] - eor r1,r1,r1 - adcs r3,r3,r14 - ldr r14,[sp,#28] @ a[7] - umlal r5,r1,r12,r2 @ "r[6]"+=a[6]*b[i] - eor r12,r12,r12 - adcs r4,r4,r7 - ldr r7,[sp,#36] @ restore overflow bit - umlal r6,r12,r14,r2 @ "r[7]"+=a[7]*b[i] - eor r14,r14,r14 - adcs r5,r5,r0 - adcs r6,r6,r1 - adcs r7,r7,r12 - adc r14,r14,#0 @ new overflow bit - @ multiplication-less reduction 6 - adds r11,r11,r8 @ r[3]+=r[0] - ldr r2,[sp,#40] @ restore b_ptr - adcs r3,r3,#0 @ r[4]+=0 - adcs r4,r4,#0 @ r[5]+=0 - adcs r5,r5,r8 @ r[6]+=r[0] - ldr r1,[sp,#0] @ load a[0] - adcs r6,r6,#0 @ r[7]+=0 - ldr r2,[r2,#4*6] @ load b[i] - adcs r7,r7,r8 @ r[8]+=r[0] - eor r0,r0,r0 - adc r14,r14,#0 @ overflow bit - subs r6,r6,r8 @ r[7]-=r[0] - ldr r12,[sp,#4] @ a[1] - sbcs r7,r7,#0 @ r[8]-=0 - umlal r9,r0,r1,r2 @ "r[0]"+=a[0]*b[i] - eor r1,r1,r1 - sbc r8,r14,#0 @ overflow bit, keep in mind - @ that netto result is - @ addition of a value which - @ makes underflow impossible - - ldr r14,[sp,#8] @ a[2] - umlal r10,r1,r12,r2 @ "r[1]"+=a[1]*b[i] - str r8,[sp,#36] @ temporarily offload overflow - eor r12,r12,r12 - ldr r8,[sp,#12] @ a[3], r8 is alias r8 - umlal r11,r12,r14,r2 @ "r[2]"+=a[2]*b[i] - eor r14,r14,r14 - adds r10,r10,r0 @ accumulate high part of mult - ldr r0,[sp,#16] @ a[4] - umlal r3,r14,r8,r2 @ "r[3]"+=a[3]*b[i] - eor r8,r8,r8 - adcs r11,r11,r1 - ldr r1,[sp,#20] @ a[5] - umlal r4,r8,r0,r2 @ "r[4]"+=a[4]*b[i] - eor r0,r0,r0 - adcs r3,r3,r12 - ldr r12,[sp,#24] @ a[6] - umlal r5,r0,r1,r2 @ "r[5]"+=a[5]*b[i] - eor r1,r1,r1 - adcs r4,r4,r14 - ldr r14,[sp,#28] @ a[7] - umlal r6,r1,r12,r2 @ "r[6]"+=a[6]*b[i] - eor r12,r12,r12 - adcs r5,r5,r8 - ldr r8,[sp,#36] @ restore overflow bit - umlal r7,r12,r14,r2 @ "r[7]"+=a[7]*b[i] - eor r14,r14,r14 - adcs r6,r6,r0 - adcs r7,r7,r1 - adcs r8,r8,r12 - adc r14,r14,#0 @ new overflow bit - @ multiplication-less reduction 7 - adds r3,r3,r9 @ r[3]+=r[0] - ldr r2,[sp,#40] @ restore b_ptr - adcs r4,r4,#0 @ r[4]+=0 - adcs r5,r5,#0 @ r[5]+=0 - adcs r6,r6,r9 @ r[6]+=r[0] - ldr r1,[sp,#0] @ load a[0] - adcs r7,r7,#0 @ r[7]+=0 - ldr r2,[r2,#4*7] @ load b[i] - adcs r8,r8,r9 @ r[8]+=r[0] - eor r0,r0,r0 - adc r14,r14,#0 @ overflow bit - subs r7,r7,r9 @ r[7]-=r[0] - ldr r12,[sp,#4] @ a[1] - sbcs r8,r8,#0 @ r[8]-=0 - umlal r10,r0,r1,r2 @ "r[0]"+=a[0]*b[i] - eor r1,r1,r1 - sbc r9,r14,#0 @ overflow bit, keep in mind - @ that netto result is - @ addition of a value which - @ makes underflow impossible - - ldr r14,[sp,#8] @ a[2] - umlal r11,r1,r12,r2 @ "r[1]"+=a[1]*b[i] - str r9,[sp,#36] @ temporarily offload overflow - eor r12,r12,r12 - ldr r9,[sp,#12] @ a[3], r9 is alias r9 - umlal r3,r12,r14,r2 @ "r[2]"+=a[2]*b[i] - eor r14,r14,r14 - adds r11,r11,r0 @ accumulate high part of mult - ldr r0,[sp,#16] @ a[4] - umlal r4,r14,r9,r2 @ "r[3]"+=a[3]*b[i] - eor r9,r9,r9 - adcs r3,r3,r1 - ldr r1,[sp,#20] @ a[5] - umlal r5,r9,r0,r2 @ "r[4]"+=a[4]*b[i] - eor r0,r0,r0 - adcs r4,r4,r12 - ldr r12,[sp,#24] @ a[6] - umlal r6,r0,r1,r2 @ "r[5]"+=a[5]*b[i] - eor r1,r1,r1 - adcs r5,r5,r14 - ldr r14,[sp,#28] @ a[7] - umlal r7,r1,r12,r2 @ "r[6]"+=a[6]*b[i] - eor r12,r12,r12 - adcs r6,r6,r9 - ldr r9,[sp,#36] @ restore overflow bit - umlal r8,r12,r14,r2 @ "r[7]"+=a[7]*b[i] - eor r14,r14,r14 - adcs r7,r7,r0 - adcs r8,r8,r1 - adcs r9,r9,r12 - adc r14,r14,#0 @ new overflow bit - @ last multiplication-less reduction - adds r4,r4,r10 - ldr r0,[sp,#32] @ restore r_ptr - adcs r5,r5,#0 - adcs r6,r6,#0 - adcs r7,r7,r10 - adcs r8,r8,#0 - adcs r9,r9,r10 - adc r14,r14,#0 - subs r8,r8,r10 - sbcs r9,r9,#0 - sbc r10,r14,#0 @ overflow bit - - @ Final step is "if result > mod, subtract mod", but we do it - @ "other way around", namely subtract modulus from result - @ and if it borrowed, add modulus back. - - adds r11,r11,#1 @ subs r11,r11,#-1 - adcs r3,r3,#0 @ sbcs r3,r3,#-1 - adcs r4,r4,#0 @ sbcs r4,r4,#-1 - sbcs r5,r5,#0 - sbcs r6,r6,#0 - sbcs r7,r7,#0 - sbcs r8,r8,#1 - adcs r9,r9,#0 @ sbcs r9,r9,#-1 - ldr lr,[sp,#44] @ restore lr - sbc r10,r10,#0 @ broadcast borrow bit - add sp,sp,#48 - - @ Note that because mod has special form, i.e. consists of - @ 0xffffffff, 1 and 0s, we can conditionally synthesize it by - @ broadcasting borrow bit to a register, r10, and using it as - @ a whole or extracting single bit. - - adds r11,r11,r10 @ add modulus or zero - adcs r3,r3,r10 - str r11,[r0,#0] - adcs r4,r4,r10 - str r3,[r0,#4] - adcs r5,r5,#0 - str r4,[r0,#8] - adcs r6,r6,#0 - str r5,[r0,#12] - adcs r7,r7,#0 - str r6,[r0,#16] - adcs r8,r8,r10,lsr#31 - str r7,[r0,#20] - adc r9,r9,r10 - str r8,[r0,#24] - str r9,[r0,#28] - - mov pc,lr - -#ifdef __thumb2__ -.thumb_func __ecp_nistz256_sub_from -#endif -.align 5 -__ecp_nistz256_sub_from: - str lr,[sp,#-4]! @ push lr - - ldr r10,[r2,#0] - ldr r12,[r2,#4] - ldr r14,[r2,#8] - ldr r1,[r2,#12] - subs r11,r11,r10 - ldr r10,[r2,#16] - sbcs r3,r3,r12 - ldr r12,[r2,#20] - sbcs r4,r4,r14 - ldr r14,[r2,#24] - sbcs r5,r5,r1 - ldr r1,[r2,#28] - sbcs r6,r6,r10 - sbcs r7,r7,r12 - sbcs r8,r8,r14 - sbcs r9,r9,r1 - sbc r2,r2,r2 @ broadcast borrow bit - ldr lr,[sp],#4 @ pop lr - - adds r11,r11,r2 @ add synthesized modulus - adcs r3,r3,r2 - str r11,[r0,#0] - adcs r4,r4,r2 - str r3,[r0,#4] - adcs r5,r5,#0 - str r4,[r0,#8] - adcs r6,r6,#0 - str r5,[r0,#12] - adcs r7,r7,#0 - str r6,[r0,#16] - adcs r8,r8,r2,lsr#31 - str r7,[r0,#20] - adcs r9,r9,r2 - str r8,[r0,#24] - str r9,[r0,#28] - - mov pc,lr - - -#ifdef __thumb2__ -.thumb_func __ecp_nistz256_sub_morf -#endif -.align 5 -__ecp_nistz256_sub_morf: - str lr,[sp,#-4]! @ push lr - - ldr r10,[r2,#0] - ldr r12,[r2,#4] - ldr r14,[r2,#8] - ldr r1,[r2,#12] - subs r11,r10,r11 - ldr r10,[r2,#16] - sbcs r3,r12,r3 - ldr r12,[r2,#20] - sbcs r4,r14,r4 - ldr r14,[r2,#24] - sbcs r5,r1,r5 - ldr r1,[r2,#28] - sbcs r6,r10,r6 - sbcs r7,r12,r7 - sbcs r8,r14,r8 - sbcs r9,r1,r9 - sbc r2,r2,r2 @ broadcast borrow bit - ldr lr,[sp],#4 @ pop lr - - adds r11,r11,r2 @ add synthesized modulus - adcs r3,r3,r2 - str r11,[r0,#0] - adcs r4,r4,r2 - str r3,[r0,#4] - adcs r5,r5,#0 - str r4,[r0,#8] - adcs r6,r6,#0 - str r5,[r0,#12] - adcs r7,r7,#0 - str r6,[r0,#16] - adcs r8,r8,r2,lsr#31 - str r7,[r0,#20] - adcs r9,r9,r2 - str r8,[r0,#24] - str r9,[r0,#28] - - mov pc,lr - - -#ifdef __thumb2__ -.thumb_func __ecp_nistz256_add_self -#endif -.align 4 -__ecp_nistz256_add_self: - adds r11,r11,r11 @ a[0:7]+=a[0:7] - adcs r3,r3,r3 - adcs r4,r4,r4 - adcs r5,r5,r5 - adcs r6,r6,r6 - adcs r7,r7,r7 - adcs r8,r8,r8 - mov r2,#0 - adcs r9,r9,r9 - adc r2,r2,#0 - - @ if a+b >= modulus, subtract modulus. - @ - @ But since comparison implies subtraction, we subtract - @ modulus and then add it back if subtraction borrowed. - - subs r11,r11,#-1 - sbcs r3,r3,#-1 - sbcs r4,r4,#-1 - sbcs r5,r5,#0 - sbcs r6,r6,#0 - sbcs r7,r7,#0 - sbcs r8,r8,#1 - sbcs r9,r9,#-1 - sbc r2,r2,#0 - - @ Note that because mod has special form, i.e. consists of - @ 0xffffffff, 1 and 0s, we can conditionally synthesize it by - @ using value of borrow as a whole or extracting single bit. - @ Follow r2 register... - - adds r11,r11,r2 @ add synthesized modulus - adcs r3,r3,r2 - str r11,[r0,#0] - adcs r4,r4,r2 - str r3,[r0,#4] - adcs r5,r5,#0 - str r4,[r0,#8] - adcs r6,r6,#0 - str r5,[r0,#12] - adcs r7,r7,#0 - str r6,[r0,#16] - adcs r8,r8,r2,lsr#31 - str r7,[r0,#20] - adcs r9,r9,r2 - str r8,[r0,#24] - str r9,[r0,#28] - - mov pc,lr - - -.globl _GFp_nistz256_point_double -.private_extern _GFp_nistz256_point_double -#ifdef __thumb2__ -.thumb_func _GFp_nistz256_point_double -#endif -.align 5 -_GFp_nistz256_point_double: - stmdb sp!,{r0,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} @ push from r0, unusual, but intentional - sub sp,sp,#32*5 - -Lpoint_double_shortcut: - add r3,sp,#96 - ldmia r1!,{r4,r5,r6,r7,r8,r9,r10,r11} @ copy in_x - stmia r3,{r4,r5,r6,r7,r8,r9,r10,r11} - - add r0,sp,#0 - bl __ecp_nistz256_mul_by_2 @ p256_mul_by_2(S, in_y); - - add r2,r1,#32 - add r1,r1,#32 - add r0,sp,#64 - bl __ecp_nistz256_mul_mont @ p256_sqr_mont(Zsqr, in_z); - - add r1,sp,#0 - add r2,sp,#0 - add r0,sp,#0 - bl __ecp_nistz256_mul_mont @ p256_sqr_mont(S, S); - - ldr r2,[sp,#32*5+4] - add r1,r2,#32 - add r2,r2,#64 - add r0,sp,#128 - bl __ecp_nistz256_mul_mont @ p256_mul_mont(tmp0, in_z, in_y); - - ldr r0,[sp,#32*5] - add r0,r0,#64 - bl __ecp_nistz256_add_self @ p256_mul_by_2(res_z, tmp0); - - add r1,sp,#96 - add r2,sp,#64 - add r0,sp,#32 - bl __ecp_nistz256_add @ p256_add(M, in_x, Zsqr); - - add r1,sp,#96 - add r2,sp,#64 - add r0,sp,#64 - bl __ecp_nistz256_sub @ p256_sub(Zsqr, in_x, Zsqr); - - add r1,sp,#0 - add r2,sp,#0 - add r0,sp,#128 - bl __ecp_nistz256_mul_mont @ p256_sqr_mont(tmp0, S); - - add r1,sp,#64 - add r2,sp,#32 - add r0,sp,#32 - bl __ecp_nistz256_mul_mont @ p256_mul_mont(M, M, Zsqr); - - ldr r0,[sp,#32*5] - add r1,sp,#128 - add r0,r0,#32 - bl __ecp_nistz256_div_by_2 @ p256_div_by_2(res_y, tmp0); - - add r1,sp,#32 - add r0,sp,#32 - bl __ecp_nistz256_mul_by_3 @ p256_mul_by_3(M, M); - - add r1,sp,#96 - add r2,sp,#0 - add r0,sp,#0 - bl __ecp_nistz256_mul_mont @ p256_mul_mont(S, S, in_x); - - add r0,sp,#128 - bl __ecp_nistz256_add_self @ p256_mul_by_2(tmp0, S); - - ldr r0,[sp,#32*5] - add r1,sp,#32 - add r2,sp,#32 - bl __ecp_nistz256_mul_mont @ p256_sqr_mont(res_x, M); - - add r2,sp,#128 - bl __ecp_nistz256_sub_from @ p256_sub(res_x, res_x, tmp0); - - add r2,sp,#0 - add r0,sp,#0 - bl __ecp_nistz256_sub_morf @ p256_sub(S, S, res_x); - - add r1,sp,#32 - add r2,sp,#0 - bl __ecp_nistz256_mul_mont @ p256_mul_mont(S, S, M); - - ldr r0,[sp,#32*5] - add r2,r0,#32 - add r0,r0,#32 - bl __ecp_nistz256_sub_from @ p256_sub(res_y, S, res_y); - - add sp,sp,#32*5+16 @ +16 means "skip even over saved r0-r3" -#if __ARM_ARCH__>=5 || !defined(__thumb__) - ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,pc} -#else - ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} - bx lr @ interoperable with Thumb ISA:-) -#endif - -#endif // !OPENSSL_NO_ASM diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ecp_nistz256-armv4-linux32.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ecp_nistz256-armv4-linux32.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ecp_nistz256-armv4-linux32.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ecp_nistz256-armv4-linux32.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,1089 +0,0 @@ -// This file is generated from a similarly-named Perl script in the BoringSSL -// source tree. Do not edit by hand. - -#if !defined(__has_feature) -#define __has_feature(x) 0 -#endif -#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) -#define OPENSSL_NO_ASM -#endif - -#if !defined(OPENSSL_NO_ASM) -#if defined(__arm__) -#include - -.text -#if defined(__thumb2__) -.syntax unified -.thumb -#else -.code 32 -#endif - -.byte 69,67,80,95,78,73,83,84,90,50,53,54,32,102,111,114,32,65,82,77,118,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 -.align 2 -.align 6 -.type __ecp_nistz256_mul_by_2,%function -.align 4 -__ecp_nistz256_mul_by_2: - ldr r4,[r1,#0] - ldr r5,[r1,#4] - ldr r6,[r1,#8] - adds r4,r4,r4 @ a[0:7]+=a[0:7], i.e. add with itself - ldr r7,[r1,#12] - adcs r5,r5,r5 - ldr r8,[r1,#16] - adcs r6,r6,r6 - ldr r9,[r1,#20] - adcs r7,r7,r7 - ldr r10,[r1,#24] - adcs r8,r8,r8 - ldr r11,[r1,#28] - adcs r9,r9,r9 - adcs r10,r10,r10 - mov r3,#0 - adcs r11,r11,r11 - adc r3,r3,#0 - - b .Lreduce_by_sub -.size __ecp_nistz256_mul_by_2,.-__ecp_nistz256_mul_by_2 - -@ void GFp_nistz256_add(BN_ULONG r0[8],const BN_ULONG r1[8], -@ const BN_ULONG r2[8]); -.globl GFp_nistz256_add -.hidden GFp_nistz256_add -.type GFp_nistz256_add,%function -.align 4 -GFp_nistz256_add: - stmdb sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} - bl __ecp_nistz256_add -#if __ARM_ARCH__>=5 || !defined(__thumb__) - ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,pc} -#else - ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} - bx lr @ interoperable with Thumb ISA:-) -#endif -.size GFp_nistz256_add,.-GFp_nistz256_add - -.type __ecp_nistz256_add,%function -.align 4 -__ecp_nistz256_add: - str lr,[sp,#-4]! @ push lr - - ldr r4,[r1,#0] - ldr r5,[r1,#4] - ldr r6,[r1,#8] - ldr r7,[r1,#12] - ldr r8,[r1,#16] - ldr r3,[r2,#0] - ldr r9,[r1,#20] - ldr r12,[r2,#4] - ldr r10,[r1,#24] - ldr r14,[r2,#8] - ldr r11,[r1,#28] - ldr r1,[r2,#12] - adds r4,r4,r3 - ldr r3,[r2,#16] - adcs r5,r5,r12 - ldr r12,[r2,#20] - adcs r6,r6,r14 - ldr r14,[r2,#24] - adcs r7,r7,r1 - ldr r1,[r2,#28] - adcs r8,r8,r3 - adcs r9,r9,r12 - adcs r10,r10,r14 - mov r3,#0 - adcs r11,r11,r1 - adc r3,r3,#0 - ldr lr,[sp],#4 @ pop lr - -.Lreduce_by_sub: - - @ if a+b >= modulus, subtract modulus. - @ - @ But since comparison implies subtraction, we subtract - @ modulus and then add it back if subtraction borrowed. - - subs r4,r4,#-1 - sbcs r5,r5,#-1 - sbcs r6,r6,#-1 - sbcs r7,r7,#0 - sbcs r8,r8,#0 - sbcs r9,r9,#0 - sbcs r10,r10,#1 - sbcs r11,r11,#-1 - sbc r3,r3,#0 - - @ Note that because mod has special form, i.e. consists of - @ 0xffffffff, 1 and 0s, we can conditionally synthesize it by - @ using value of borrow as a whole or extracting single bit. - @ Follow r3 register... - - adds r4,r4,r3 @ add synthesized modulus - adcs r5,r5,r3 - str r4,[r0,#0] - adcs r6,r6,r3 - str r5,[r0,#4] - adcs r7,r7,#0 - str r6,[r0,#8] - adcs r8,r8,#0 - str r7,[r0,#12] - adcs r9,r9,#0 - str r8,[r0,#16] - adcs r10,r10,r3,lsr#31 - str r9,[r0,#20] - adcs r11,r11,r3 - str r10,[r0,#24] - str r11,[r0,#28] - - mov pc,lr -.size __ecp_nistz256_add,.-__ecp_nistz256_add - -.type __ecp_nistz256_mul_by_3,%function -.align 4 -__ecp_nistz256_mul_by_3: - str lr,[sp,#-4]! @ push lr - - @ As multiplication by 3 is performed as 2*n+n, below are inline - @ copies of __ecp_nistz256_mul_by_2 and __ecp_nistz256_add, see - @ corresponding subroutines for details. - - ldr r4,[r1,#0] - ldr r5,[r1,#4] - ldr r6,[r1,#8] - adds r4,r4,r4 @ a[0:7]+=a[0:7] - ldr r7,[r1,#12] - adcs r5,r5,r5 - ldr r8,[r1,#16] - adcs r6,r6,r6 - ldr r9,[r1,#20] - adcs r7,r7,r7 - ldr r10,[r1,#24] - adcs r8,r8,r8 - ldr r11,[r1,#28] - adcs r9,r9,r9 - adcs r10,r10,r10 - mov r3,#0 - adcs r11,r11,r11 - adc r3,r3,#0 - - subs r4,r4,#-1 @ .Lreduce_by_sub but without stores - sbcs r5,r5,#-1 - sbcs r6,r6,#-1 - sbcs r7,r7,#0 - sbcs r8,r8,#0 - sbcs r9,r9,#0 - sbcs r10,r10,#1 - sbcs r11,r11,#-1 - sbc r3,r3,#0 - - adds r4,r4,r3 @ add synthesized modulus - adcs r5,r5,r3 - adcs r6,r6,r3 - adcs r7,r7,#0 - adcs r8,r8,#0 - ldr r2,[r1,#0] - adcs r9,r9,#0 - ldr r12,[r1,#4] - adcs r10,r10,r3,lsr#31 - ldr r14,[r1,#8] - adc r11,r11,r3 - - ldr r3,[r1,#12] - adds r4,r4,r2 @ 2*a[0:7]+=a[0:7] - ldr r2,[r1,#16] - adcs r5,r5,r12 - ldr r12,[r1,#20] - adcs r6,r6,r14 - ldr r14,[r1,#24] - adcs r7,r7,r3 - ldr r1,[r1,#28] - adcs r8,r8,r2 - adcs r9,r9,r12 - adcs r10,r10,r14 - mov r3,#0 - adcs r11,r11,r1 - adc r3,r3,#0 - ldr lr,[sp],#4 @ pop lr - - b .Lreduce_by_sub -.size __ecp_nistz256_mul_by_3,.-__ecp_nistz256_mul_by_3 - -.type __ecp_nistz256_div_by_2,%function -.align 4 -__ecp_nistz256_div_by_2: - @ ret = (a is odd ? a+mod : a) >> 1 - - ldr r4,[r1,#0] - ldr r5,[r1,#4] - ldr r6,[r1,#8] - mov r3,r4,lsl#31 @ place least significant bit to most - @ significant position, now arithmetic - @ right shift by 31 will produce -1 or - @ 0, while logical right shift 1 or 0, - @ this is how modulus is conditionally - @ synthesized in this case... - ldr r7,[r1,#12] - adds r4,r4,r3,asr#31 - ldr r8,[r1,#16] - adcs r5,r5,r3,asr#31 - ldr r9,[r1,#20] - adcs r6,r6,r3,asr#31 - ldr r10,[r1,#24] - adcs r7,r7,#0 - ldr r11,[r1,#28] - adcs r8,r8,#0 - mov r4,r4,lsr#1 @ a[0:7]>>=1, we can start early - @ because it doesn't affect flags - adcs r9,r9,#0 - orr r4,r4,r5,lsl#31 - adcs r10,r10,r3,lsr#31 - mov r2,#0 - adcs r11,r11,r3,asr#31 - mov r5,r5,lsr#1 - adc r2,r2,#0 @ top-most carry bit from addition - - orr r5,r5,r6,lsl#31 - mov r6,r6,lsr#1 - str r4,[r0,#0] - orr r6,r6,r7,lsl#31 - mov r7,r7,lsr#1 - str r5,[r0,#4] - orr r7,r7,r8,lsl#31 - mov r8,r8,lsr#1 - str r6,[r0,#8] - orr r8,r8,r9,lsl#31 - mov r9,r9,lsr#1 - str r7,[r0,#12] - orr r9,r9,r10,lsl#31 - mov r10,r10,lsr#1 - str r8,[r0,#16] - orr r10,r10,r11,lsl#31 - mov r11,r11,lsr#1 - str r9,[r0,#20] - orr r11,r11,r2,lsl#31 @ don't forget the top-most carry bit - str r10,[r0,#24] - str r11,[r0,#28] - - mov pc,lr -.size __ecp_nistz256_div_by_2,.-__ecp_nistz256_div_by_2 - -.type __ecp_nistz256_sub,%function -.align 4 -__ecp_nistz256_sub: - str lr,[sp,#-4]! @ push lr - - ldr r4,[r1,#0] - ldr r5,[r1,#4] - ldr r6,[r1,#8] - ldr r7,[r1,#12] - ldr r8,[r1,#16] - ldr r3,[r2,#0] - ldr r9,[r1,#20] - ldr r12,[r2,#4] - ldr r10,[r1,#24] - ldr r14,[r2,#8] - ldr r11,[r1,#28] - ldr r1,[r2,#12] - subs r4,r4,r3 - ldr r3,[r2,#16] - sbcs r5,r5,r12 - ldr r12,[r2,#20] - sbcs r6,r6,r14 - ldr r14,[r2,#24] - sbcs r7,r7,r1 - ldr r1,[r2,#28] - sbcs r8,r8,r3 - sbcs r9,r9,r12 - sbcs r10,r10,r14 - sbcs r11,r11,r1 - sbc r3,r3,r3 @ broadcast borrow bit - ldr lr,[sp],#4 @ pop lr - -.Lreduce_by_add: - - @ if a-b borrows, add modulus. - @ - @ Note that because mod has special form, i.e. consists of - @ 0xffffffff, 1 and 0s, we can conditionally synthesize it by - @ broadcasting borrow bit to a register, r3, and using it as - @ a whole or extracting single bit. - - adds r4,r4,r3 @ add synthesized modulus - adcs r5,r5,r3 - str r4,[r0,#0] - adcs r6,r6,r3 - str r5,[r0,#4] - adcs r7,r7,#0 - str r6,[r0,#8] - adcs r8,r8,#0 - str r7,[r0,#12] - adcs r9,r9,#0 - str r8,[r0,#16] - adcs r10,r10,r3,lsr#31 - str r9,[r0,#20] - adcs r11,r11,r3 - str r10,[r0,#24] - str r11,[r0,#28] - - mov pc,lr -.size __ecp_nistz256_sub,.-__ecp_nistz256_sub - -@ void GFp_nistz256_neg(BN_ULONG r0[8],const BN_ULONG r1[8]); -.globl GFp_nistz256_neg -.hidden GFp_nistz256_neg -.type GFp_nistz256_neg,%function -.align 4 -GFp_nistz256_neg: - stmdb sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} - bl __ecp_nistz256_neg -#if __ARM_ARCH__>=5 || !defined(__thumb__) - ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,pc} -#else - ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} - bx lr @ interoperable with Thumb ISA:-) -#endif -.size GFp_nistz256_neg,.-GFp_nistz256_neg - -.type __ecp_nistz256_neg,%function -.align 4 -__ecp_nistz256_neg: - ldr r4,[r1,#0] - eor r3,r3,r3 - ldr r5,[r1,#4] - ldr r6,[r1,#8] - subs r4,r3,r4 - ldr r7,[r1,#12] - sbcs r5,r3,r5 - ldr r8,[r1,#16] - sbcs r6,r3,r6 - ldr r9,[r1,#20] - sbcs r7,r3,r7 - ldr r10,[r1,#24] - sbcs r8,r3,r8 - ldr r11,[r1,#28] - sbcs r9,r3,r9 - sbcs r10,r3,r10 - sbcs r11,r3,r11 - sbc r3,r3,r3 - - b .Lreduce_by_add -.size __ecp_nistz256_neg,.-__ecp_nistz256_neg -@ void GFp_nistz256_mul_mont(BN_ULONG r0[8],const BN_ULONG r1[8], -@ const BN_ULONG r2[8]); -.globl GFp_nistz256_mul_mont -.hidden GFp_nistz256_mul_mont -.type GFp_nistz256_mul_mont,%function -.align 4 -GFp_nistz256_mul_mont: - stmdb sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} - bl __ecp_nistz256_mul_mont -#if __ARM_ARCH__>=5 || !defined(__thumb__) - ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,pc} -#else - ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} - bx lr @ interoperable with Thumb ISA:-) -#endif -.size GFp_nistz256_mul_mont,.-GFp_nistz256_mul_mont - -.type __ecp_nistz256_mul_mont,%function -.align 4 -__ecp_nistz256_mul_mont: - stmdb sp!,{r0,r1,r2,lr} @ make a copy of arguments too - - ldr r2,[r2,#0] @ b[0] - ldmia r1,{r4,r5,r6,r7,r8,r9,r10,r11} - - umull r3,r14,r4,r2 @ r[0]=a[0]*b[0] - stmdb sp!,{r4,r5,r6,r7,r8,r9,r10,r11} @ copy a[0-7] to stack, so - @ that it can be addressed - @ without spending register - @ on address - umull r4,r0,r5,r2 @ r[1]=a[1]*b[0] - umull r5,r1,r6,r2 - adds r4,r4,r14 @ accumulate high part of mult - umull r6,r12,r7,r2 - adcs r5,r5,r0 - umull r7,r14,r8,r2 - adcs r6,r6,r1 - umull r8,r0,r9,r2 - adcs r7,r7,r12 - umull r9,r1,r10,r2 - adcs r8,r8,r14 - umull r10,r12,r11,r2 - adcs r9,r9,r0 - adcs r10,r10,r1 - eor r14,r14,r14 @ first overflow bit is zero - adc r11,r12,#0 - @ multiplication-less reduction 1 - adds r6,r6,r3 @ r[3]+=r[0] - ldr r2,[sp,#40] @ restore b_ptr - adcs r7,r7,#0 @ r[4]+=0 - adcs r8,r8,#0 @ r[5]+=0 - adcs r9,r9,r3 @ r[6]+=r[0] - ldr r1,[sp,#0] @ load a[0] - adcs r10,r10,#0 @ r[7]+=0 - ldr r2,[r2,#4*1] @ load b[i] - adcs r11,r11,r3 @ r[8]+=r[0] - eor r0,r0,r0 - adc r14,r14,#0 @ overflow bit - subs r10,r10,r3 @ r[7]-=r[0] - ldr r12,[sp,#4] @ a[1] - sbcs r11,r11,#0 @ r[8]-=0 - umlal r4,r0,r1,r2 @ "r[0]"+=a[0]*b[i] - eor r1,r1,r1 - sbc r3,r14,#0 @ overflow bit, keep in mind - @ that netto result is - @ addition of a value which - @ makes underflow impossible - - ldr r14,[sp,#8] @ a[2] - umlal r5,r1,r12,r2 @ "r[1]"+=a[1]*b[i] - str r3,[sp,#36] @ temporarily offload overflow - eor r12,r12,r12 - ldr r3,[sp,#12] @ a[3], r3 is alias r3 - umlal r6,r12,r14,r2 @ "r[2]"+=a[2]*b[i] - eor r14,r14,r14 - adds r5,r5,r0 @ accumulate high part of mult - ldr r0,[sp,#16] @ a[4] - umlal r7,r14,r3,r2 @ "r[3]"+=a[3]*b[i] - eor r3,r3,r3 - adcs r6,r6,r1 - ldr r1,[sp,#20] @ a[5] - umlal r8,r3,r0,r2 @ "r[4]"+=a[4]*b[i] - eor r0,r0,r0 - adcs r7,r7,r12 - ldr r12,[sp,#24] @ a[6] - umlal r9,r0,r1,r2 @ "r[5]"+=a[5]*b[i] - eor r1,r1,r1 - adcs r8,r8,r14 - ldr r14,[sp,#28] @ a[7] - umlal r10,r1,r12,r2 @ "r[6]"+=a[6]*b[i] - eor r12,r12,r12 - adcs r9,r9,r3 - ldr r3,[sp,#36] @ restore overflow bit - umlal r11,r12,r14,r2 @ "r[7]"+=a[7]*b[i] - eor r14,r14,r14 - adcs r10,r10,r0 - adcs r11,r11,r1 - adcs r3,r3,r12 - adc r14,r14,#0 @ new overflow bit - @ multiplication-less reduction 2 - adds r7,r7,r4 @ r[3]+=r[0] - ldr r2,[sp,#40] @ restore b_ptr - adcs r8,r8,#0 @ r[4]+=0 - adcs r9,r9,#0 @ r[5]+=0 - adcs r10,r10,r4 @ r[6]+=r[0] - ldr r1,[sp,#0] @ load a[0] - adcs r11,r11,#0 @ r[7]+=0 - ldr r2,[r2,#4*2] @ load b[i] - adcs r3,r3,r4 @ r[8]+=r[0] - eor r0,r0,r0 - adc r14,r14,#0 @ overflow bit - subs r11,r11,r4 @ r[7]-=r[0] - ldr r12,[sp,#4] @ a[1] - sbcs r3,r3,#0 @ r[8]-=0 - umlal r5,r0,r1,r2 @ "r[0]"+=a[0]*b[i] - eor r1,r1,r1 - sbc r4,r14,#0 @ overflow bit, keep in mind - @ that netto result is - @ addition of a value which - @ makes underflow impossible - - ldr r14,[sp,#8] @ a[2] - umlal r6,r1,r12,r2 @ "r[1]"+=a[1]*b[i] - str r4,[sp,#36] @ temporarily offload overflow - eor r12,r12,r12 - ldr r4,[sp,#12] @ a[3], r4 is alias r4 - umlal r7,r12,r14,r2 @ "r[2]"+=a[2]*b[i] - eor r14,r14,r14 - adds r6,r6,r0 @ accumulate high part of mult - ldr r0,[sp,#16] @ a[4] - umlal r8,r14,r4,r2 @ "r[3]"+=a[3]*b[i] - eor r4,r4,r4 - adcs r7,r7,r1 - ldr r1,[sp,#20] @ a[5] - umlal r9,r4,r0,r2 @ "r[4]"+=a[4]*b[i] - eor r0,r0,r0 - adcs r8,r8,r12 - ldr r12,[sp,#24] @ a[6] - umlal r10,r0,r1,r2 @ "r[5]"+=a[5]*b[i] - eor r1,r1,r1 - adcs r9,r9,r14 - ldr r14,[sp,#28] @ a[7] - umlal r11,r1,r12,r2 @ "r[6]"+=a[6]*b[i] - eor r12,r12,r12 - adcs r10,r10,r4 - ldr r4,[sp,#36] @ restore overflow bit - umlal r3,r12,r14,r2 @ "r[7]"+=a[7]*b[i] - eor r14,r14,r14 - adcs r11,r11,r0 - adcs r3,r3,r1 - adcs r4,r4,r12 - adc r14,r14,#0 @ new overflow bit - @ multiplication-less reduction 3 - adds r8,r8,r5 @ r[3]+=r[0] - ldr r2,[sp,#40] @ restore b_ptr - adcs r9,r9,#0 @ r[4]+=0 - adcs r10,r10,#0 @ r[5]+=0 - adcs r11,r11,r5 @ r[6]+=r[0] - ldr r1,[sp,#0] @ load a[0] - adcs r3,r3,#0 @ r[7]+=0 - ldr r2,[r2,#4*3] @ load b[i] - adcs r4,r4,r5 @ r[8]+=r[0] - eor r0,r0,r0 - adc r14,r14,#0 @ overflow bit - subs r3,r3,r5 @ r[7]-=r[0] - ldr r12,[sp,#4] @ a[1] - sbcs r4,r4,#0 @ r[8]-=0 - umlal r6,r0,r1,r2 @ "r[0]"+=a[0]*b[i] - eor r1,r1,r1 - sbc r5,r14,#0 @ overflow bit, keep in mind - @ that netto result is - @ addition of a value which - @ makes underflow impossible - - ldr r14,[sp,#8] @ a[2] - umlal r7,r1,r12,r2 @ "r[1]"+=a[1]*b[i] - str r5,[sp,#36] @ temporarily offload overflow - eor r12,r12,r12 - ldr r5,[sp,#12] @ a[3], r5 is alias r5 - umlal r8,r12,r14,r2 @ "r[2]"+=a[2]*b[i] - eor r14,r14,r14 - adds r7,r7,r0 @ accumulate high part of mult - ldr r0,[sp,#16] @ a[4] - umlal r9,r14,r5,r2 @ "r[3]"+=a[3]*b[i] - eor r5,r5,r5 - adcs r8,r8,r1 - ldr r1,[sp,#20] @ a[5] - umlal r10,r5,r0,r2 @ "r[4]"+=a[4]*b[i] - eor r0,r0,r0 - adcs r9,r9,r12 - ldr r12,[sp,#24] @ a[6] - umlal r11,r0,r1,r2 @ "r[5]"+=a[5]*b[i] - eor r1,r1,r1 - adcs r10,r10,r14 - ldr r14,[sp,#28] @ a[7] - umlal r3,r1,r12,r2 @ "r[6]"+=a[6]*b[i] - eor r12,r12,r12 - adcs r11,r11,r5 - ldr r5,[sp,#36] @ restore overflow bit - umlal r4,r12,r14,r2 @ "r[7]"+=a[7]*b[i] - eor r14,r14,r14 - adcs r3,r3,r0 - adcs r4,r4,r1 - adcs r5,r5,r12 - adc r14,r14,#0 @ new overflow bit - @ multiplication-less reduction 4 - adds r9,r9,r6 @ r[3]+=r[0] - ldr r2,[sp,#40] @ restore b_ptr - adcs r10,r10,#0 @ r[4]+=0 - adcs r11,r11,#0 @ r[5]+=0 - adcs r3,r3,r6 @ r[6]+=r[0] - ldr r1,[sp,#0] @ load a[0] - adcs r4,r4,#0 @ r[7]+=0 - ldr r2,[r2,#4*4] @ load b[i] - adcs r5,r5,r6 @ r[8]+=r[0] - eor r0,r0,r0 - adc r14,r14,#0 @ overflow bit - subs r4,r4,r6 @ r[7]-=r[0] - ldr r12,[sp,#4] @ a[1] - sbcs r5,r5,#0 @ r[8]-=0 - umlal r7,r0,r1,r2 @ "r[0]"+=a[0]*b[i] - eor r1,r1,r1 - sbc r6,r14,#0 @ overflow bit, keep in mind - @ that netto result is - @ addition of a value which - @ makes underflow impossible - - ldr r14,[sp,#8] @ a[2] - umlal r8,r1,r12,r2 @ "r[1]"+=a[1]*b[i] - str r6,[sp,#36] @ temporarily offload overflow - eor r12,r12,r12 - ldr r6,[sp,#12] @ a[3], r6 is alias r6 - umlal r9,r12,r14,r2 @ "r[2]"+=a[2]*b[i] - eor r14,r14,r14 - adds r8,r8,r0 @ accumulate high part of mult - ldr r0,[sp,#16] @ a[4] - umlal r10,r14,r6,r2 @ "r[3]"+=a[3]*b[i] - eor r6,r6,r6 - adcs r9,r9,r1 - ldr r1,[sp,#20] @ a[5] - umlal r11,r6,r0,r2 @ "r[4]"+=a[4]*b[i] - eor r0,r0,r0 - adcs r10,r10,r12 - ldr r12,[sp,#24] @ a[6] - umlal r3,r0,r1,r2 @ "r[5]"+=a[5]*b[i] - eor r1,r1,r1 - adcs r11,r11,r14 - ldr r14,[sp,#28] @ a[7] - umlal r4,r1,r12,r2 @ "r[6]"+=a[6]*b[i] - eor r12,r12,r12 - adcs r3,r3,r6 - ldr r6,[sp,#36] @ restore overflow bit - umlal r5,r12,r14,r2 @ "r[7]"+=a[7]*b[i] - eor r14,r14,r14 - adcs r4,r4,r0 - adcs r5,r5,r1 - adcs r6,r6,r12 - adc r14,r14,#0 @ new overflow bit - @ multiplication-less reduction 5 - adds r10,r10,r7 @ r[3]+=r[0] - ldr r2,[sp,#40] @ restore b_ptr - adcs r11,r11,#0 @ r[4]+=0 - adcs r3,r3,#0 @ r[5]+=0 - adcs r4,r4,r7 @ r[6]+=r[0] - ldr r1,[sp,#0] @ load a[0] - adcs r5,r5,#0 @ r[7]+=0 - ldr r2,[r2,#4*5] @ load b[i] - adcs r6,r6,r7 @ r[8]+=r[0] - eor r0,r0,r0 - adc r14,r14,#0 @ overflow bit - subs r5,r5,r7 @ r[7]-=r[0] - ldr r12,[sp,#4] @ a[1] - sbcs r6,r6,#0 @ r[8]-=0 - umlal r8,r0,r1,r2 @ "r[0]"+=a[0]*b[i] - eor r1,r1,r1 - sbc r7,r14,#0 @ overflow bit, keep in mind - @ that netto result is - @ addition of a value which - @ makes underflow impossible - - ldr r14,[sp,#8] @ a[2] - umlal r9,r1,r12,r2 @ "r[1]"+=a[1]*b[i] - str r7,[sp,#36] @ temporarily offload overflow - eor r12,r12,r12 - ldr r7,[sp,#12] @ a[3], r7 is alias r7 - umlal r10,r12,r14,r2 @ "r[2]"+=a[2]*b[i] - eor r14,r14,r14 - adds r9,r9,r0 @ accumulate high part of mult - ldr r0,[sp,#16] @ a[4] - umlal r11,r14,r7,r2 @ "r[3]"+=a[3]*b[i] - eor r7,r7,r7 - adcs r10,r10,r1 - ldr r1,[sp,#20] @ a[5] - umlal r3,r7,r0,r2 @ "r[4]"+=a[4]*b[i] - eor r0,r0,r0 - adcs r11,r11,r12 - ldr r12,[sp,#24] @ a[6] - umlal r4,r0,r1,r2 @ "r[5]"+=a[5]*b[i] - eor r1,r1,r1 - adcs r3,r3,r14 - ldr r14,[sp,#28] @ a[7] - umlal r5,r1,r12,r2 @ "r[6]"+=a[6]*b[i] - eor r12,r12,r12 - adcs r4,r4,r7 - ldr r7,[sp,#36] @ restore overflow bit - umlal r6,r12,r14,r2 @ "r[7]"+=a[7]*b[i] - eor r14,r14,r14 - adcs r5,r5,r0 - adcs r6,r6,r1 - adcs r7,r7,r12 - adc r14,r14,#0 @ new overflow bit - @ multiplication-less reduction 6 - adds r11,r11,r8 @ r[3]+=r[0] - ldr r2,[sp,#40] @ restore b_ptr - adcs r3,r3,#0 @ r[4]+=0 - adcs r4,r4,#0 @ r[5]+=0 - adcs r5,r5,r8 @ r[6]+=r[0] - ldr r1,[sp,#0] @ load a[0] - adcs r6,r6,#0 @ r[7]+=0 - ldr r2,[r2,#4*6] @ load b[i] - adcs r7,r7,r8 @ r[8]+=r[0] - eor r0,r0,r0 - adc r14,r14,#0 @ overflow bit - subs r6,r6,r8 @ r[7]-=r[0] - ldr r12,[sp,#4] @ a[1] - sbcs r7,r7,#0 @ r[8]-=0 - umlal r9,r0,r1,r2 @ "r[0]"+=a[0]*b[i] - eor r1,r1,r1 - sbc r8,r14,#0 @ overflow bit, keep in mind - @ that netto result is - @ addition of a value which - @ makes underflow impossible - - ldr r14,[sp,#8] @ a[2] - umlal r10,r1,r12,r2 @ "r[1]"+=a[1]*b[i] - str r8,[sp,#36] @ temporarily offload overflow - eor r12,r12,r12 - ldr r8,[sp,#12] @ a[3], r8 is alias r8 - umlal r11,r12,r14,r2 @ "r[2]"+=a[2]*b[i] - eor r14,r14,r14 - adds r10,r10,r0 @ accumulate high part of mult - ldr r0,[sp,#16] @ a[4] - umlal r3,r14,r8,r2 @ "r[3]"+=a[3]*b[i] - eor r8,r8,r8 - adcs r11,r11,r1 - ldr r1,[sp,#20] @ a[5] - umlal r4,r8,r0,r2 @ "r[4]"+=a[4]*b[i] - eor r0,r0,r0 - adcs r3,r3,r12 - ldr r12,[sp,#24] @ a[6] - umlal r5,r0,r1,r2 @ "r[5]"+=a[5]*b[i] - eor r1,r1,r1 - adcs r4,r4,r14 - ldr r14,[sp,#28] @ a[7] - umlal r6,r1,r12,r2 @ "r[6]"+=a[6]*b[i] - eor r12,r12,r12 - adcs r5,r5,r8 - ldr r8,[sp,#36] @ restore overflow bit - umlal r7,r12,r14,r2 @ "r[7]"+=a[7]*b[i] - eor r14,r14,r14 - adcs r6,r6,r0 - adcs r7,r7,r1 - adcs r8,r8,r12 - adc r14,r14,#0 @ new overflow bit - @ multiplication-less reduction 7 - adds r3,r3,r9 @ r[3]+=r[0] - ldr r2,[sp,#40] @ restore b_ptr - adcs r4,r4,#0 @ r[4]+=0 - adcs r5,r5,#0 @ r[5]+=0 - adcs r6,r6,r9 @ r[6]+=r[0] - ldr r1,[sp,#0] @ load a[0] - adcs r7,r7,#0 @ r[7]+=0 - ldr r2,[r2,#4*7] @ load b[i] - adcs r8,r8,r9 @ r[8]+=r[0] - eor r0,r0,r0 - adc r14,r14,#0 @ overflow bit - subs r7,r7,r9 @ r[7]-=r[0] - ldr r12,[sp,#4] @ a[1] - sbcs r8,r8,#0 @ r[8]-=0 - umlal r10,r0,r1,r2 @ "r[0]"+=a[0]*b[i] - eor r1,r1,r1 - sbc r9,r14,#0 @ overflow bit, keep in mind - @ that netto result is - @ addition of a value which - @ makes underflow impossible - - ldr r14,[sp,#8] @ a[2] - umlal r11,r1,r12,r2 @ "r[1]"+=a[1]*b[i] - str r9,[sp,#36] @ temporarily offload overflow - eor r12,r12,r12 - ldr r9,[sp,#12] @ a[3], r9 is alias r9 - umlal r3,r12,r14,r2 @ "r[2]"+=a[2]*b[i] - eor r14,r14,r14 - adds r11,r11,r0 @ accumulate high part of mult - ldr r0,[sp,#16] @ a[4] - umlal r4,r14,r9,r2 @ "r[3]"+=a[3]*b[i] - eor r9,r9,r9 - adcs r3,r3,r1 - ldr r1,[sp,#20] @ a[5] - umlal r5,r9,r0,r2 @ "r[4]"+=a[4]*b[i] - eor r0,r0,r0 - adcs r4,r4,r12 - ldr r12,[sp,#24] @ a[6] - umlal r6,r0,r1,r2 @ "r[5]"+=a[5]*b[i] - eor r1,r1,r1 - adcs r5,r5,r14 - ldr r14,[sp,#28] @ a[7] - umlal r7,r1,r12,r2 @ "r[6]"+=a[6]*b[i] - eor r12,r12,r12 - adcs r6,r6,r9 - ldr r9,[sp,#36] @ restore overflow bit - umlal r8,r12,r14,r2 @ "r[7]"+=a[7]*b[i] - eor r14,r14,r14 - adcs r7,r7,r0 - adcs r8,r8,r1 - adcs r9,r9,r12 - adc r14,r14,#0 @ new overflow bit - @ last multiplication-less reduction - adds r4,r4,r10 - ldr r0,[sp,#32] @ restore r_ptr - adcs r5,r5,#0 - adcs r6,r6,#0 - adcs r7,r7,r10 - adcs r8,r8,#0 - adcs r9,r9,r10 - adc r14,r14,#0 - subs r8,r8,r10 - sbcs r9,r9,#0 - sbc r10,r14,#0 @ overflow bit - - @ Final step is "if result > mod, subtract mod", but we do it - @ "other way around", namely subtract modulus from result - @ and if it borrowed, add modulus back. - - adds r11,r11,#1 @ subs r11,r11,#-1 - adcs r3,r3,#0 @ sbcs r3,r3,#-1 - adcs r4,r4,#0 @ sbcs r4,r4,#-1 - sbcs r5,r5,#0 - sbcs r6,r6,#0 - sbcs r7,r7,#0 - sbcs r8,r8,#1 - adcs r9,r9,#0 @ sbcs r9,r9,#-1 - ldr lr,[sp,#44] @ restore lr - sbc r10,r10,#0 @ broadcast borrow bit - add sp,sp,#48 - - @ Note that because mod has special form, i.e. consists of - @ 0xffffffff, 1 and 0s, we can conditionally synthesize it by - @ broadcasting borrow bit to a register, r10, and using it as - @ a whole or extracting single bit. - - adds r11,r11,r10 @ add modulus or zero - adcs r3,r3,r10 - str r11,[r0,#0] - adcs r4,r4,r10 - str r3,[r0,#4] - adcs r5,r5,#0 - str r4,[r0,#8] - adcs r6,r6,#0 - str r5,[r0,#12] - adcs r7,r7,#0 - str r6,[r0,#16] - adcs r8,r8,r10,lsr#31 - str r7,[r0,#20] - adc r9,r9,r10 - str r8,[r0,#24] - str r9,[r0,#28] - - mov pc,lr -.size __ecp_nistz256_mul_mont,.-__ecp_nistz256_mul_mont -.type __ecp_nistz256_sub_from,%function -.align 5 -__ecp_nistz256_sub_from: - str lr,[sp,#-4]! @ push lr - - ldr r10,[r2,#0] - ldr r12,[r2,#4] - ldr r14,[r2,#8] - ldr r1,[r2,#12] - subs r11,r11,r10 - ldr r10,[r2,#16] - sbcs r3,r3,r12 - ldr r12,[r2,#20] - sbcs r4,r4,r14 - ldr r14,[r2,#24] - sbcs r5,r5,r1 - ldr r1,[r2,#28] - sbcs r6,r6,r10 - sbcs r7,r7,r12 - sbcs r8,r8,r14 - sbcs r9,r9,r1 - sbc r2,r2,r2 @ broadcast borrow bit - ldr lr,[sp],#4 @ pop lr - - adds r11,r11,r2 @ add synthesized modulus - adcs r3,r3,r2 - str r11,[r0,#0] - adcs r4,r4,r2 - str r3,[r0,#4] - adcs r5,r5,#0 - str r4,[r0,#8] - adcs r6,r6,#0 - str r5,[r0,#12] - adcs r7,r7,#0 - str r6,[r0,#16] - adcs r8,r8,r2,lsr#31 - str r7,[r0,#20] - adcs r9,r9,r2 - str r8,[r0,#24] - str r9,[r0,#28] - - mov pc,lr -.size __ecp_nistz256_sub_from,.-__ecp_nistz256_sub_from - -.type __ecp_nistz256_sub_morf,%function -.align 5 -__ecp_nistz256_sub_morf: - str lr,[sp,#-4]! @ push lr - - ldr r10,[r2,#0] - ldr r12,[r2,#4] - ldr r14,[r2,#8] - ldr r1,[r2,#12] - subs r11,r10,r11 - ldr r10,[r2,#16] - sbcs r3,r12,r3 - ldr r12,[r2,#20] - sbcs r4,r14,r4 - ldr r14,[r2,#24] - sbcs r5,r1,r5 - ldr r1,[r2,#28] - sbcs r6,r10,r6 - sbcs r7,r12,r7 - sbcs r8,r14,r8 - sbcs r9,r1,r9 - sbc r2,r2,r2 @ broadcast borrow bit - ldr lr,[sp],#4 @ pop lr - - adds r11,r11,r2 @ add synthesized modulus - adcs r3,r3,r2 - str r11,[r0,#0] - adcs r4,r4,r2 - str r3,[r0,#4] - adcs r5,r5,#0 - str r4,[r0,#8] - adcs r6,r6,#0 - str r5,[r0,#12] - adcs r7,r7,#0 - str r6,[r0,#16] - adcs r8,r8,r2,lsr#31 - str r7,[r0,#20] - adcs r9,r9,r2 - str r8,[r0,#24] - str r9,[r0,#28] - - mov pc,lr -.size __ecp_nistz256_sub_morf,.-__ecp_nistz256_sub_morf - -.type __ecp_nistz256_add_self,%function -.align 4 -__ecp_nistz256_add_self: - adds r11,r11,r11 @ a[0:7]+=a[0:7] - adcs r3,r3,r3 - adcs r4,r4,r4 - adcs r5,r5,r5 - adcs r6,r6,r6 - adcs r7,r7,r7 - adcs r8,r8,r8 - mov r2,#0 - adcs r9,r9,r9 - adc r2,r2,#0 - - @ if a+b >= modulus, subtract modulus. - @ - @ But since comparison implies subtraction, we subtract - @ modulus and then add it back if subtraction borrowed. - - subs r11,r11,#-1 - sbcs r3,r3,#-1 - sbcs r4,r4,#-1 - sbcs r5,r5,#0 - sbcs r6,r6,#0 - sbcs r7,r7,#0 - sbcs r8,r8,#1 - sbcs r9,r9,#-1 - sbc r2,r2,#0 - - @ Note that because mod has special form, i.e. consists of - @ 0xffffffff, 1 and 0s, we can conditionally synthesize it by - @ using value of borrow as a whole or extracting single bit. - @ Follow r2 register... - - adds r11,r11,r2 @ add synthesized modulus - adcs r3,r3,r2 - str r11,[r0,#0] - adcs r4,r4,r2 - str r3,[r0,#4] - adcs r5,r5,#0 - str r4,[r0,#8] - adcs r6,r6,#0 - str r5,[r0,#12] - adcs r7,r7,#0 - str r6,[r0,#16] - adcs r8,r8,r2,lsr#31 - str r7,[r0,#20] - adcs r9,r9,r2 - str r8,[r0,#24] - str r9,[r0,#28] - - mov pc,lr -.size __ecp_nistz256_add_self,.-__ecp_nistz256_add_self - -.globl GFp_nistz256_point_double -.hidden GFp_nistz256_point_double -.type GFp_nistz256_point_double,%function -.align 5 -GFp_nistz256_point_double: - stmdb sp!,{r0,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} @ push from r0, unusual, but intentional - sub sp,sp,#32*5 - -.Lpoint_double_shortcut: - add r3,sp,#96 - ldmia r1!,{r4,r5,r6,r7,r8,r9,r10,r11} @ copy in_x - stmia r3,{r4,r5,r6,r7,r8,r9,r10,r11} - - add r0,sp,#0 - bl __ecp_nistz256_mul_by_2 @ p256_mul_by_2(S, in_y); - - add r2,r1,#32 - add r1,r1,#32 - add r0,sp,#64 - bl __ecp_nistz256_mul_mont @ p256_sqr_mont(Zsqr, in_z); - - add r1,sp,#0 - add r2,sp,#0 - add r0,sp,#0 - bl __ecp_nistz256_mul_mont @ p256_sqr_mont(S, S); - - ldr r2,[sp,#32*5+4] - add r1,r2,#32 - add r2,r2,#64 - add r0,sp,#128 - bl __ecp_nistz256_mul_mont @ p256_mul_mont(tmp0, in_z, in_y); - - ldr r0,[sp,#32*5] - add r0,r0,#64 - bl __ecp_nistz256_add_self @ p256_mul_by_2(res_z, tmp0); - - add r1,sp,#96 - add r2,sp,#64 - add r0,sp,#32 - bl __ecp_nistz256_add @ p256_add(M, in_x, Zsqr); - - add r1,sp,#96 - add r2,sp,#64 - add r0,sp,#64 - bl __ecp_nistz256_sub @ p256_sub(Zsqr, in_x, Zsqr); - - add r1,sp,#0 - add r2,sp,#0 - add r0,sp,#128 - bl __ecp_nistz256_mul_mont @ p256_sqr_mont(tmp0, S); - - add r1,sp,#64 - add r2,sp,#32 - add r0,sp,#32 - bl __ecp_nistz256_mul_mont @ p256_mul_mont(M, M, Zsqr); - - ldr r0,[sp,#32*5] - add r1,sp,#128 - add r0,r0,#32 - bl __ecp_nistz256_div_by_2 @ p256_div_by_2(res_y, tmp0); - - add r1,sp,#32 - add r0,sp,#32 - bl __ecp_nistz256_mul_by_3 @ p256_mul_by_3(M, M); - - add r1,sp,#96 - add r2,sp,#0 - add r0,sp,#0 - bl __ecp_nistz256_mul_mont @ p256_mul_mont(S, S, in_x); - - add r0,sp,#128 - bl __ecp_nistz256_add_self @ p256_mul_by_2(tmp0, S); - - ldr r0,[sp,#32*5] - add r1,sp,#32 - add r2,sp,#32 - bl __ecp_nistz256_mul_mont @ p256_sqr_mont(res_x, M); - - add r2,sp,#128 - bl __ecp_nistz256_sub_from @ p256_sub(res_x, res_x, tmp0); - - add r2,sp,#0 - add r0,sp,#0 - bl __ecp_nistz256_sub_morf @ p256_sub(S, S, res_x); - - add r1,sp,#32 - add r2,sp,#0 - bl __ecp_nistz256_mul_mont @ p256_mul_mont(S, S, M); - - ldr r0,[sp,#32*5] - add r2,r0,#32 - add r0,r0,#32 - bl __ecp_nistz256_sub_from @ p256_sub(res_y, S, res_y); - - add sp,sp,#32*5+16 @ +16 means "skip even over saved r0-r3" -#if __ARM_ARCH__>=5 || !defined(__thumb__) - ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,pc} -#else - ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} - bx lr @ interoperable with Thumb ISA:-) -#endif -.size GFp_nistz256_point_double,.-GFp_nistz256_point_double -#endif -#endif // !OPENSSL_NO_ASM -.section .note.GNU-stack,"",%progbits diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ecp_nistz256-armv8-ios64.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ecp_nistz256-armv8-ios64.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ecp_nistz256-armv8-ios64.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ecp_nistz256-armv8-ios64.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,833 +0,0 @@ -// This file is generated from a similarly-named Perl script in the BoringSSL -// source tree. Do not edit by hand. - -#if !defined(__has_feature) -#define __has_feature(x) 0 -#endif -#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) -#define OPENSSL_NO_ASM -#endif - -#if !defined(OPENSSL_NO_ASM) -#include - -.text -.align 5 -Lpoly: -.quad 0xffffffffffffffff,0x00000000ffffffff,0x0000000000000000,0xffffffff00000001 -Lone_mont: -.quad 0x0000000000000001,0xffffffff00000000,0xffffffffffffffff,0x00000000fffffffe -Lone: -.quad 1,0,0,0 -.byte 69,67,80,95,78,73,83,84,90,50,53,54,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 -.align 2 - -// void GFp_nistz256_mul_mont(BN_ULONG x0[4],const BN_ULONG x1[4], -// const BN_ULONG x2[4]); -.globl _GFp_nistz256_mul_mont -.private_extern _GFp_nistz256_mul_mont - -.align 4 -_GFp_nistz256_mul_mont: - stp x29,x30,[sp,#-32]! - add x29,sp,#0 - stp x19,x20,[sp,#16] - - ldr x3,[x2] // bp[0] - ldp x4,x5,[x1] - ldp x6,x7,[x1,#16] - ldr x12,Lpoly+8 - ldr x13,Lpoly+24 - - bl __ecp_nistz256_mul_mont - - ldp x19,x20,[sp,#16] - ldp x29,x30,[sp],#32 - ret - - -// void GFp_nistz256_sqr_mont(BN_ULONG x0[4],const BN_ULONG x1[4]); -.globl _GFp_nistz256_sqr_mont -.private_extern _GFp_nistz256_sqr_mont - -.align 4 -_GFp_nistz256_sqr_mont: - stp x29,x30,[sp,#-32]! - add x29,sp,#0 - stp x19,x20,[sp,#16] - - ldp x4,x5,[x1] - ldp x6,x7,[x1,#16] - ldr x12,Lpoly+8 - ldr x13,Lpoly+24 - - bl __ecp_nistz256_sqr_mont - - ldp x19,x20,[sp,#16] - ldp x29,x30,[sp],#32 - ret - - -// void GFp_nistz256_add(BN_ULONG x0[4],const BN_ULONG x1[4], -// const BN_ULONG x2[4]); -.globl _GFp_nistz256_add -.private_extern _GFp_nistz256_add - -.align 4 -_GFp_nistz256_add: - stp x29,x30,[sp,#-16]! - add x29,sp,#0 - - ldp x14,x15,[x1] - ldp x8,x9,[x2] - ldp x16,x17,[x1,#16] - ldp x10,x11,[x2,#16] - ldr x12,Lpoly+8 - ldr x13,Lpoly+24 - - bl __ecp_nistz256_add - - ldp x29,x30,[sp],#16 - ret - - -// void GFp_nistz256_neg(BN_ULONG x0[4],const BN_ULONG x1[4]); -.globl _GFp_nistz256_neg -.private_extern _GFp_nistz256_neg - -.align 4 -_GFp_nistz256_neg: - stp x29,x30,[sp,#-16]! - add x29,sp,#0 - - mov x2,x1 - mov x14,xzr // a = 0 - mov x15,xzr - mov x16,xzr - mov x17,xzr - ldr x12,Lpoly+8 - ldr x13,Lpoly+24 - - bl __ecp_nistz256_sub_from - - ldp x29,x30,[sp],#16 - ret - - -// note that __ecp_nistz256_mul_mont expects a[0-3] input pre-loaded -// to x4-x7 and b[0] - to x3 - -.align 4 -__ecp_nistz256_mul_mont: - mul x14,x4,x3 // a[0]*b[0] - umulh x8,x4,x3 - - mul x15,x5,x3 // a[1]*b[0] - umulh x9,x5,x3 - - mul x16,x6,x3 // a[2]*b[0] - umulh x10,x6,x3 - - mul x17,x7,x3 // a[3]*b[0] - umulh x11,x7,x3 - ldr x3,[x2,#8] // b[1] - - adds x15,x15,x8 // accumulate high parts of multiplication - lsl x8,x14,#32 - adcs x16,x16,x9 - lsr x9,x14,#32 - adcs x17,x17,x10 - adc x19,xzr,x11 - mov x20,xzr - subs x10,x14,x8 // "*0xffff0001" - sbc x11,x14,x9 - adds x14,x15,x8 // +=acc[0]<<96 and omit acc[0] - mul x8,x4,x3 // lo(a[0]*b[i]) - adcs x15,x16,x9 - mul x9,x5,x3 // lo(a[1]*b[i]) - adcs x16,x17,x10 // +=acc[0]*0xffff0001 - mul x10,x6,x3 // lo(a[2]*b[i]) - adcs x17,x19,x11 - mul x11,x7,x3 // lo(a[3]*b[i]) - adc x19,x20,xzr - - adds x14,x14,x8 // accumulate low parts of multiplication - umulh x8,x4,x3 // hi(a[0]*b[i]) - adcs x15,x15,x9 - umulh x9,x5,x3 // hi(a[1]*b[i]) - adcs x16,x16,x10 - umulh x10,x6,x3 // hi(a[2]*b[i]) - adcs x17,x17,x11 - umulh x11,x7,x3 // hi(a[3]*b[i]) - adc x19,x19,xzr - ldr x3,[x2,#8*(1+1)] // b[1+1] - adds x15,x15,x8 // accumulate high parts of multiplication - lsl x8,x14,#32 - adcs x16,x16,x9 - lsr x9,x14,#32 - adcs x17,x17,x10 - adcs x19,x19,x11 - adc x20,xzr,xzr - subs x10,x14,x8 // "*0xffff0001" - sbc x11,x14,x9 - adds x14,x15,x8 // +=acc[0]<<96 and omit acc[0] - mul x8,x4,x3 // lo(a[0]*b[i]) - adcs x15,x16,x9 - mul x9,x5,x3 // lo(a[1]*b[i]) - adcs x16,x17,x10 // +=acc[0]*0xffff0001 - mul x10,x6,x3 // lo(a[2]*b[i]) - adcs x17,x19,x11 - mul x11,x7,x3 // lo(a[3]*b[i]) - adc x19,x20,xzr - - adds x14,x14,x8 // accumulate low parts of multiplication - umulh x8,x4,x3 // hi(a[0]*b[i]) - adcs x15,x15,x9 - umulh x9,x5,x3 // hi(a[1]*b[i]) - adcs x16,x16,x10 - umulh x10,x6,x3 // hi(a[2]*b[i]) - adcs x17,x17,x11 - umulh x11,x7,x3 // hi(a[3]*b[i]) - adc x19,x19,xzr - ldr x3,[x2,#8*(2+1)] // b[2+1] - adds x15,x15,x8 // accumulate high parts of multiplication - lsl x8,x14,#32 - adcs x16,x16,x9 - lsr x9,x14,#32 - adcs x17,x17,x10 - adcs x19,x19,x11 - adc x20,xzr,xzr - subs x10,x14,x8 // "*0xffff0001" - sbc x11,x14,x9 - adds x14,x15,x8 // +=acc[0]<<96 and omit acc[0] - mul x8,x4,x3 // lo(a[0]*b[i]) - adcs x15,x16,x9 - mul x9,x5,x3 // lo(a[1]*b[i]) - adcs x16,x17,x10 // +=acc[0]*0xffff0001 - mul x10,x6,x3 // lo(a[2]*b[i]) - adcs x17,x19,x11 - mul x11,x7,x3 // lo(a[3]*b[i]) - adc x19,x20,xzr - - adds x14,x14,x8 // accumulate low parts of multiplication - umulh x8,x4,x3 // hi(a[0]*b[i]) - adcs x15,x15,x9 - umulh x9,x5,x3 // hi(a[1]*b[i]) - adcs x16,x16,x10 - umulh x10,x6,x3 // hi(a[2]*b[i]) - adcs x17,x17,x11 - umulh x11,x7,x3 // hi(a[3]*b[i]) - adc x19,x19,xzr - adds x15,x15,x8 // accumulate high parts of multiplication - lsl x8,x14,#32 - adcs x16,x16,x9 - lsr x9,x14,#32 - adcs x17,x17,x10 - adcs x19,x19,x11 - adc x20,xzr,xzr - // last reduction - subs x10,x14,x8 // "*0xffff0001" - sbc x11,x14,x9 - adds x14,x15,x8 // +=acc[0]<<96 and omit acc[0] - adcs x15,x16,x9 - adcs x16,x17,x10 // +=acc[0]*0xffff0001 - adcs x17,x19,x11 - adc x19,x20,xzr - - adds x8,x14,#1 // subs x8,x14,#-1 // tmp = ret-modulus - sbcs x9,x15,x12 - sbcs x10,x16,xzr - sbcs x11,x17,x13 - sbcs xzr,x19,xzr // did it borrow? - - csel x14,x14,x8,lo // ret = borrow ? ret : ret-modulus - csel x15,x15,x9,lo - csel x16,x16,x10,lo - stp x14,x15,[x0] - csel x17,x17,x11,lo - stp x16,x17,[x0,#16] - - ret - - -// note that __ecp_nistz256_sqr_mont expects a[0-3] input pre-loaded -// to x4-x7 - -.align 4 -__ecp_nistz256_sqr_mont: - // | | | | | |a1*a0| | - // | | | | |a2*a0| | | - // | |a3*a2|a3*a0| | | | - // | | | |a2*a1| | | | - // | | |a3*a1| | | | | - // *| | | | | | | | 2| - // +|a3*a3|a2*a2|a1*a1|a0*a0| - // |--+--+--+--+--+--+--+--| - // |A7|A6|A5|A4|A3|A2|A1|A0|, where Ax is , i.e. follow - // - // "can't overflow" below mark carrying into high part of - // multiplication result, which can't overflow, because it - // can never be all ones. - - mul x15,x5,x4 // a[1]*a[0] - umulh x9,x5,x4 - mul x16,x6,x4 // a[2]*a[0] - umulh x10,x6,x4 - mul x17,x7,x4 // a[3]*a[0] - umulh x19,x7,x4 - - adds x16,x16,x9 // accumulate high parts of multiplication - mul x8,x6,x5 // a[2]*a[1] - umulh x9,x6,x5 - adcs x17,x17,x10 - mul x10,x7,x5 // a[3]*a[1] - umulh x11,x7,x5 - adc x19,x19,xzr // can't overflow - - mul x20,x7,x6 // a[3]*a[2] - umulh x1,x7,x6 - - adds x9,x9,x10 // accumulate high parts of multiplication - mul x14,x4,x4 // a[0]*a[0] - adc x10,x11,xzr // can't overflow - - adds x17,x17,x8 // accumulate low parts of multiplication - umulh x4,x4,x4 - adcs x19,x19,x9 - mul x9,x5,x5 // a[1]*a[1] - adcs x20,x20,x10 - umulh x5,x5,x5 - adc x1,x1,xzr // can't overflow - - adds x15,x15,x15 // acc[1-6]*=2 - mul x10,x6,x6 // a[2]*a[2] - adcs x16,x16,x16 - umulh x6,x6,x6 - adcs x17,x17,x17 - mul x11,x7,x7 // a[3]*a[3] - adcs x19,x19,x19 - umulh x7,x7,x7 - adcs x20,x20,x20 - adcs x1,x1,x1 - adc x2,xzr,xzr - - adds x15,x15,x4 // +a[i]*a[i] - adcs x16,x16,x9 - adcs x17,x17,x5 - adcs x19,x19,x10 - adcs x20,x20,x6 - lsl x8,x14,#32 - adcs x1,x1,x11 - lsr x9,x14,#32 - adc x2,x2,x7 - subs x10,x14,x8 // "*0xffff0001" - sbc x11,x14,x9 - adds x14,x15,x8 // +=acc[0]<<96 and omit acc[0] - adcs x15,x16,x9 - lsl x8,x14,#32 - adcs x16,x17,x10 // +=acc[0]*0xffff0001 - lsr x9,x14,#32 - adc x17,x11,xzr // can't overflow - subs x10,x14,x8 // "*0xffff0001" - sbc x11,x14,x9 - adds x14,x15,x8 // +=acc[0]<<96 and omit acc[0] - adcs x15,x16,x9 - lsl x8,x14,#32 - adcs x16,x17,x10 // +=acc[0]*0xffff0001 - lsr x9,x14,#32 - adc x17,x11,xzr // can't overflow - subs x10,x14,x8 // "*0xffff0001" - sbc x11,x14,x9 - adds x14,x15,x8 // +=acc[0]<<96 and omit acc[0] - adcs x15,x16,x9 - lsl x8,x14,#32 - adcs x16,x17,x10 // +=acc[0]*0xffff0001 - lsr x9,x14,#32 - adc x17,x11,xzr // can't overflow - subs x10,x14,x8 // "*0xffff0001" - sbc x11,x14,x9 - adds x14,x15,x8 // +=acc[0]<<96 and omit acc[0] - adcs x15,x16,x9 - adcs x16,x17,x10 // +=acc[0]*0xffff0001 - adc x17,x11,xzr // can't overflow - - adds x14,x14,x19 // accumulate upper half - adcs x15,x15,x20 - adcs x16,x16,x1 - adcs x17,x17,x2 - adc x19,xzr,xzr - - adds x8,x14,#1 // subs x8,x14,#-1 // tmp = ret-modulus - sbcs x9,x15,x12 - sbcs x10,x16,xzr - sbcs x11,x17,x13 - sbcs xzr,x19,xzr // did it borrow? - - csel x14,x14,x8,lo // ret = borrow ? ret : ret-modulus - csel x15,x15,x9,lo - csel x16,x16,x10,lo - stp x14,x15,[x0] - csel x17,x17,x11,lo - stp x16,x17,[x0,#16] - - ret - - -// Note that __ecp_nistz256_add expects both input vectors pre-loaded to -// x4-x7 and x8-x11. This is done because it's used in multiple -// contexts, e.g. in multiplication by 2 and 3... - -.align 4 -__ecp_nistz256_add: - adds x14,x14,x8 // ret = a+b - adcs x15,x15,x9 - adcs x16,x16,x10 - adcs x17,x17,x11 - adc x1,xzr,xzr // zap x1 - - adds x8,x14,#1 // subs x8,x4,#-1 // tmp = ret-modulus - sbcs x9,x15,x12 - sbcs x10,x16,xzr - sbcs x11,x17,x13 - sbcs xzr,x1,xzr // did subtraction borrow? - - csel x14,x14,x8,lo // ret = borrow ? ret : ret-modulus - csel x15,x15,x9,lo - csel x16,x16,x10,lo - stp x14,x15,[x0] - csel x17,x17,x11,lo - stp x16,x17,[x0,#16] - - ret - - - -.align 4 -__ecp_nistz256_sub_from: - ldp x8,x9,[x2] - ldp x10,x11,[x2,#16] - subs x14,x14,x8 // ret = a-b - sbcs x15,x15,x9 - sbcs x16,x16,x10 - sbcs x17,x17,x11 - sbc x1,xzr,xzr // zap x1 - - subs x8,x14,#1 // adds x8,x4,#-1 // tmp = ret+modulus - adcs x9,x15,x12 - adcs x10,x16,xzr - adc x11,x17,x13 - cmp x1,xzr // did subtraction borrow? - - csel x14,x14,x8,eq // ret = borrow ? ret+modulus : ret - csel x15,x15,x9,eq - csel x16,x16,x10,eq - stp x14,x15,[x0] - csel x17,x17,x11,eq - stp x16,x17,[x0,#16] - - ret - - - -.align 4 -__ecp_nistz256_sub_morf: - ldp x8,x9,[x2] - ldp x10,x11,[x2,#16] - subs x14,x8,x14 // ret = b-a - sbcs x15,x9,x15 - sbcs x16,x10,x16 - sbcs x17,x11,x17 - sbc x1,xzr,xzr // zap x1 - - subs x8,x14,#1 // adds x8,x4,#-1 // tmp = ret+modulus - adcs x9,x15,x12 - adcs x10,x16,xzr - adc x11,x17,x13 - cmp x1,xzr // did subtraction borrow? - - csel x14,x14,x8,eq // ret = borrow ? ret+modulus : ret - csel x15,x15,x9,eq - csel x16,x16,x10,eq - stp x14,x15,[x0] - csel x17,x17,x11,eq - stp x16,x17,[x0,#16] - - ret - - - -.align 4 -__ecp_nistz256_div_by_2: - subs x8,x14,#1 // adds x8,x4,#-1 // tmp = a+modulus - adcs x9,x15,x12 - adcs x10,x16,xzr - adcs x11,x17,x13 - adc x1,xzr,xzr // zap x1 - tst x14,#1 // is a even? - - csel x14,x14,x8,eq // ret = even ? a : a+modulus - csel x15,x15,x9,eq - csel x16,x16,x10,eq - csel x17,x17,x11,eq - csel x1,xzr,x1,eq - - lsr x14,x14,#1 // ret >>= 1 - orr x14,x14,x15,lsl#63 - lsr x15,x15,#1 - orr x15,x15,x16,lsl#63 - lsr x16,x16,#1 - orr x16,x16,x17,lsl#63 - lsr x17,x17,#1 - stp x14,x15,[x0] - orr x17,x17,x1,lsl#63 - stp x16,x17,[x0,#16] - - ret - -.globl _GFp_nistz256_point_double -.private_extern _GFp_nistz256_point_double - -.align 5 -_GFp_nistz256_point_double: - stp x29,x30,[sp,#-80]! - add x29,sp,#0 - stp x19,x20,[sp,#16] - stp x21,x22,[sp,#32] - sub sp,sp,#32*4 - -Ldouble_shortcut: - ldp x14,x15,[x1,#32] - mov x21,x0 - ldp x16,x17,[x1,#48] - mov x22,x1 - ldr x12,Lpoly+8 - mov x8,x14 - ldr x13,Lpoly+24 - mov x9,x15 - ldp x4,x5,[x22,#64] // forward load for p256_sqr_mont - mov x10,x16 - mov x11,x17 - ldp x6,x7,[x22,#64+16] - add x0,sp,#0 - bl __ecp_nistz256_add // p256_mul_by_2(S, in_y); - - add x0,sp,#64 - bl __ecp_nistz256_sqr_mont // p256_sqr_mont(Zsqr, in_z); - - ldp x8,x9,[x22] - ldp x10,x11,[x22,#16] - mov x4,x14 // put Zsqr aside for p256_sub - mov x5,x15 - mov x6,x16 - mov x7,x17 - add x0,sp,#32 - bl __ecp_nistz256_add // p256_add(M, Zsqr, in_x); - - add x2,x22,#0 - mov x14,x4 // restore Zsqr - mov x15,x5 - ldp x4,x5,[sp,#0] // forward load for p256_sqr_mont - mov x16,x6 - mov x17,x7 - ldp x6,x7,[sp,#0+16] - add x0,sp,#64 - bl __ecp_nistz256_sub_morf // p256_sub(Zsqr, in_x, Zsqr); - - add x0,sp,#0 - bl __ecp_nistz256_sqr_mont // p256_sqr_mont(S, S); - - ldr x3,[x22,#32] - ldp x4,x5,[x22,#64] - ldp x6,x7,[x22,#64+16] - add x2,x22,#32 - add x0,sp,#96 - bl __ecp_nistz256_mul_mont // p256_mul_mont(tmp0, in_z, in_y); - - mov x8,x14 - mov x9,x15 - ldp x4,x5,[sp,#0] // forward load for p256_sqr_mont - mov x10,x16 - mov x11,x17 - ldp x6,x7,[sp,#0+16] - add x0,x21,#64 - bl __ecp_nistz256_add // p256_mul_by_2(res_z, tmp0); - - add x0,sp,#96 - bl __ecp_nistz256_sqr_mont // p256_sqr_mont(tmp0, S); - - ldr x3,[sp,#64] // forward load for p256_mul_mont - ldp x4,x5,[sp,#32] - ldp x6,x7,[sp,#32+16] - add x0,x21,#32 - bl __ecp_nistz256_div_by_2 // p256_div_by_2(res_y, tmp0); - - add x2,sp,#64 - add x0,sp,#32 - bl __ecp_nistz256_mul_mont // p256_mul_mont(M, M, Zsqr); - - mov x8,x14 // duplicate M - mov x9,x15 - mov x10,x16 - mov x11,x17 - mov x4,x14 // put M aside - mov x5,x15 - mov x6,x16 - mov x7,x17 - add x0,sp,#32 - bl __ecp_nistz256_add - mov x8,x4 // restore M - mov x9,x5 - ldr x3,[x22] // forward load for p256_mul_mont - mov x10,x6 - ldp x4,x5,[sp,#0] - mov x11,x7 - ldp x6,x7,[sp,#0+16] - bl __ecp_nistz256_add // p256_mul_by_3(M, M); - - add x2,x22,#0 - add x0,sp,#0 - bl __ecp_nistz256_mul_mont // p256_mul_mont(S, S, in_x); - - mov x8,x14 - mov x9,x15 - ldp x4,x5,[sp,#32] // forward load for p256_sqr_mont - mov x10,x16 - mov x11,x17 - ldp x6,x7,[sp,#32+16] - add x0,sp,#96 - bl __ecp_nistz256_add // p256_mul_by_2(tmp0, S); - - add x0,x21,#0 - bl __ecp_nistz256_sqr_mont // p256_sqr_mont(res_x, M); - - add x2,sp,#96 - bl __ecp_nistz256_sub_from // p256_sub(res_x, res_x, tmp0); - - add x2,sp,#0 - add x0,sp,#0 - bl __ecp_nistz256_sub_morf // p256_sub(S, S, res_x); - - ldr x3,[sp,#32] - mov x4,x14 // copy S - mov x5,x15 - mov x6,x16 - mov x7,x17 - add x2,sp,#32 - bl __ecp_nistz256_mul_mont // p256_mul_mont(S, S, M); - - add x2,x21,#32 - add x0,x21,#32 - bl __ecp_nistz256_sub_from // p256_sub(res_y, S, res_y); - - add sp,x29,#0 // destroy frame - ldp x19,x20,[x29,#16] - ldp x21,x22,[x29,#32] - ldp x29,x30,[sp],#80 - ret - -.globl _GFp_nistz256_point_add_affine -.private_extern _GFp_nistz256_point_add_affine - -.align 5 -_GFp_nistz256_point_add_affine: - stp x29,x30,[sp,#-80]! - add x29,sp,#0 - stp x19,x20,[sp,#16] - stp x21,x22,[sp,#32] - stp x23,x24,[sp,#48] - stp x25,x26,[sp,#64] - sub sp,sp,#32*10 - - mov x21,x0 - mov x22,x1 - mov x23,x2 - ldr x12,Lpoly+8 - ldr x13,Lpoly+24 - - ldp x4,x5,[x1,#64] // in1_z - ldp x6,x7,[x1,#64+16] - orr x8,x4,x5 - orr x10,x6,x7 - orr x24,x8,x10 - cmp x24,#0 - csetm x24,ne // !in1infty - - ldp x14,x15,[x2] // in2_x - ldp x16,x17,[x2,#16] - ldp x8,x9,[x2,#32] // in2_y - ldp x10,x11,[x2,#48] - orr x14,x14,x15 - orr x16,x16,x17 - orr x8,x8,x9 - orr x10,x10,x11 - orr x14,x14,x16 - orr x8,x8,x10 - orr x25,x14,x8 - cmp x25,#0 - csetm x25,ne // !in2infty - - add x0,sp,#128 - bl __ecp_nistz256_sqr_mont // p256_sqr_mont(Z1sqr, in1_z); - - mov x4,x14 - mov x5,x15 - mov x6,x16 - mov x7,x17 - ldr x3,[x23] - add x2,x23,#0 - add x0,sp,#96 - bl __ecp_nistz256_mul_mont // p256_mul_mont(U2, Z1sqr, in2_x); - - add x2,x22,#0 - ldr x3,[x22,#64] // forward load for p256_mul_mont - ldp x4,x5,[sp,#128] - ldp x6,x7,[sp,#128+16] - add x0,sp,#160 - bl __ecp_nistz256_sub_from // p256_sub(H, U2, in1_x); - - add x2,x22,#64 - add x0,sp,#128 - bl __ecp_nistz256_mul_mont // p256_mul_mont(S2, Z1sqr, in1_z); - - ldr x3,[x22,#64] - ldp x4,x5,[sp,#160] - ldp x6,x7,[sp,#160+16] - add x2,x22,#64 - add x0,sp,#64 - bl __ecp_nistz256_mul_mont // p256_mul_mont(res_z, H, in1_z); - - ldr x3,[x23,#32] - ldp x4,x5,[sp,#128] - ldp x6,x7,[sp,#128+16] - add x2,x23,#32 - add x0,sp,#128 - bl __ecp_nistz256_mul_mont // p256_mul_mont(S2, S2, in2_y); - - add x2,x22,#32 - ldp x4,x5,[sp,#160] // forward load for p256_sqr_mont - ldp x6,x7,[sp,#160+16] - add x0,sp,#192 - bl __ecp_nistz256_sub_from // p256_sub(R, S2, in1_y); - - add x0,sp,#224 - bl __ecp_nistz256_sqr_mont // p256_sqr_mont(Hsqr, H); - - ldp x4,x5,[sp,#192] - ldp x6,x7,[sp,#192+16] - add x0,sp,#288 - bl __ecp_nistz256_sqr_mont // p256_sqr_mont(Rsqr, R); - - ldr x3,[sp,#160] - ldp x4,x5,[sp,#224] - ldp x6,x7,[sp,#224+16] - add x2,sp,#160 - add x0,sp,#256 - bl __ecp_nistz256_mul_mont // p256_mul_mont(Hcub, Hsqr, H); - - ldr x3,[x22] - ldp x4,x5,[sp,#224] - ldp x6,x7,[sp,#224+16] - add x2,x22,#0 - add x0,sp,#96 - bl __ecp_nistz256_mul_mont // p256_mul_mont(U2, in1_x, Hsqr); - - mov x8,x14 - mov x9,x15 - mov x10,x16 - mov x11,x17 - add x0,sp,#224 - bl __ecp_nistz256_add // p256_mul_by_2(Hsqr, U2); - - add x2,sp,#288 - add x0,sp,#0 - bl __ecp_nistz256_sub_morf // p256_sub(res_x, Rsqr, Hsqr); - - add x2,sp,#256 - bl __ecp_nistz256_sub_from // p256_sub(res_x, res_x, Hcub); - - add x2,sp,#96 - ldr x3,[x22,#32] // forward load for p256_mul_mont - ldp x4,x5,[sp,#256] - ldp x6,x7,[sp,#256+16] - add x0,sp,#32 - bl __ecp_nistz256_sub_morf // p256_sub(res_y, U2, res_x); - - add x2,x22,#32 - add x0,sp,#128 - bl __ecp_nistz256_mul_mont // p256_mul_mont(S2, in1_y, Hcub); - - ldr x3,[sp,#192] - ldp x4,x5,[sp,#32] - ldp x6,x7,[sp,#32+16] - add x2,sp,#192 - add x0,sp,#32 - bl __ecp_nistz256_mul_mont // p256_mul_mont(res_y, res_y, R); - - add x2,sp,#128 - bl __ecp_nistz256_sub_from // p256_sub(res_y, res_y, S2); - - ldp x4,x5,[sp,#0] // res - ldp x6,x7,[sp,#0+16] - ldp x8,x9,[x23] // in2 - ldp x10,x11,[x23,#16] - ldp x14,x15,[x22,#0] // in1 - cmp x24,#0 // !, remember? - ldp x16,x17,[x22,#0+16] - csel x8,x4,x8,ne - csel x9,x5,x9,ne - ldp x4,x5,[sp,#0+0+32] // res - csel x10,x6,x10,ne - csel x11,x7,x11,ne - cmp x25,#0 // !, remember? - ldp x6,x7,[sp,#0+0+48] - csel x14,x8,x14,ne - csel x15,x9,x15,ne - ldp x8,x9,[x23,#0+32] // in2 - csel x16,x10,x16,ne - csel x17,x11,x17,ne - ldp x10,x11,[x23,#0+48] - stp x14,x15,[x21,#0] - stp x16,x17,[x21,#0+16] - adr x23,Lone_mont-64 - ldp x14,x15,[x22,#32] // in1 - cmp x24,#0 // !, remember? - ldp x16,x17,[x22,#32+16] - csel x8,x4,x8,ne - csel x9,x5,x9,ne - ldp x4,x5,[sp,#0+32+32] // res - csel x10,x6,x10,ne - csel x11,x7,x11,ne - cmp x25,#0 // !, remember? - ldp x6,x7,[sp,#0+32+48] - csel x14,x8,x14,ne - csel x15,x9,x15,ne - ldp x8,x9,[x23,#32+32] // in2 - csel x16,x10,x16,ne - csel x17,x11,x17,ne - ldp x10,x11,[x23,#32+48] - stp x14,x15,[x21,#32] - stp x16,x17,[x21,#32+16] - ldp x14,x15,[x22,#64] // in1 - cmp x24,#0 // !, remember? - ldp x16,x17,[x22,#64+16] - csel x8,x4,x8,ne - csel x9,x5,x9,ne - csel x10,x6,x10,ne - csel x11,x7,x11,ne - cmp x25,#0 // !, remember? - csel x14,x8,x14,ne - csel x15,x9,x15,ne - csel x16,x10,x16,ne - csel x17,x11,x17,ne - stp x14,x15,[x21,#64] - stp x16,x17,[x21,#64+16] - - add sp,x29,#0 // destroy frame - ldp x19,x20,[x29,#16] - ldp x21,x22,[x29,#32] - ldp x23,x24,[x29,#48] - ldp x25,x26,[x29,#64] - ldp x29,x30,[sp],#80 - ret - -#endif // !OPENSSL_NO_ASM diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ecp_nistz256-armv8-linux64.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ecp_nistz256-armv8-linux64.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ecp_nistz256-armv8-linux64.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ecp_nistz256-armv8-linux64.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,836 +0,0 @@ -// This file is generated from a similarly-named Perl script in the BoringSSL -// source tree. Do not edit by hand. - -#if !defined(__has_feature) -#define __has_feature(x) 0 -#endif -#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) -#define OPENSSL_NO_ASM -#endif - -#if !defined(OPENSSL_NO_ASM) -#if defined(__aarch64__) -#include - -.text -.align 5 -.Lpoly: -.quad 0xffffffffffffffff,0x00000000ffffffff,0x0000000000000000,0xffffffff00000001 -.Lone_mont: -.quad 0x0000000000000001,0xffffffff00000000,0xffffffffffffffff,0x00000000fffffffe -.Lone: -.quad 1,0,0,0 -.byte 69,67,80,95,78,73,83,84,90,50,53,54,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 -.align 2 - -// void GFp_nistz256_mul_mont(BN_ULONG x0[4],const BN_ULONG x1[4], -// const BN_ULONG x2[4]); -.globl GFp_nistz256_mul_mont -.hidden GFp_nistz256_mul_mont -.type GFp_nistz256_mul_mont,%function -.align 4 -GFp_nistz256_mul_mont: - stp x29,x30,[sp,#-32]! - add x29,sp,#0 - stp x19,x20,[sp,#16] - - ldr x3,[x2] // bp[0] - ldp x4,x5,[x1] - ldp x6,x7,[x1,#16] - ldr x12,.Lpoly+8 - ldr x13,.Lpoly+24 - - bl __ecp_nistz256_mul_mont - - ldp x19,x20,[sp,#16] - ldp x29,x30,[sp],#32 - ret -.size GFp_nistz256_mul_mont,.-GFp_nistz256_mul_mont - -// void GFp_nistz256_sqr_mont(BN_ULONG x0[4],const BN_ULONG x1[4]); -.globl GFp_nistz256_sqr_mont -.hidden GFp_nistz256_sqr_mont -.type GFp_nistz256_sqr_mont,%function -.align 4 -GFp_nistz256_sqr_mont: - stp x29,x30,[sp,#-32]! - add x29,sp,#0 - stp x19,x20,[sp,#16] - - ldp x4,x5,[x1] - ldp x6,x7,[x1,#16] - ldr x12,.Lpoly+8 - ldr x13,.Lpoly+24 - - bl __ecp_nistz256_sqr_mont - - ldp x19,x20,[sp,#16] - ldp x29,x30,[sp],#32 - ret -.size GFp_nistz256_sqr_mont,.-GFp_nistz256_sqr_mont - -// void GFp_nistz256_add(BN_ULONG x0[4],const BN_ULONG x1[4], -// const BN_ULONG x2[4]); -.globl GFp_nistz256_add -.hidden GFp_nistz256_add -.type GFp_nistz256_add,%function -.align 4 -GFp_nistz256_add: - stp x29,x30,[sp,#-16]! - add x29,sp,#0 - - ldp x14,x15,[x1] - ldp x8,x9,[x2] - ldp x16,x17,[x1,#16] - ldp x10,x11,[x2,#16] - ldr x12,.Lpoly+8 - ldr x13,.Lpoly+24 - - bl __ecp_nistz256_add - - ldp x29,x30,[sp],#16 - ret -.size GFp_nistz256_add,.-GFp_nistz256_add - -// void GFp_nistz256_neg(BN_ULONG x0[4],const BN_ULONG x1[4]); -.globl GFp_nistz256_neg -.hidden GFp_nistz256_neg -.type GFp_nistz256_neg,%function -.align 4 -GFp_nistz256_neg: - stp x29,x30,[sp,#-16]! - add x29,sp,#0 - - mov x2,x1 - mov x14,xzr // a = 0 - mov x15,xzr - mov x16,xzr - mov x17,xzr - ldr x12,.Lpoly+8 - ldr x13,.Lpoly+24 - - bl __ecp_nistz256_sub_from - - ldp x29,x30,[sp],#16 - ret -.size GFp_nistz256_neg,.-GFp_nistz256_neg - -// note that __ecp_nistz256_mul_mont expects a[0-3] input pre-loaded -// to x4-x7 and b[0] - to x3 -.type __ecp_nistz256_mul_mont,%function -.align 4 -__ecp_nistz256_mul_mont: - mul x14,x4,x3 // a[0]*b[0] - umulh x8,x4,x3 - - mul x15,x5,x3 // a[1]*b[0] - umulh x9,x5,x3 - - mul x16,x6,x3 // a[2]*b[0] - umulh x10,x6,x3 - - mul x17,x7,x3 // a[3]*b[0] - umulh x11,x7,x3 - ldr x3,[x2,#8] // b[1] - - adds x15,x15,x8 // accumulate high parts of multiplication - lsl x8,x14,#32 - adcs x16,x16,x9 - lsr x9,x14,#32 - adcs x17,x17,x10 - adc x19,xzr,x11 - mov x20,xzr - subs x10,x14,x8 // "*0xffff0001" - sbc x11,x14,x9 - adds x14,x15,x8 // +=acc[0]<<96 and omit acc[0] - mul x8,x4,x3 // lo(a[0]*b[i]) - adcs x15,x16,x9 - mul x9,x5,x3 // lo(a[1]*b[i]) - adcs x16,x17,x10 // +=acc[0]*0xffff0001 - mul x10,x6,x3 // lo(a[2]*b[i]) - adcs x17,x19,x11 - mul x11,x7,x3 // lo(a[3]*b[i]) - adc x19,x20,xzr - - adds x14,x14,x8 // accumulate low parts of multiplication - umulh x8,x4,x3 // hi(a[0]*b[i]) - adcs x15,x15,x9 - umulh x9,x5,x3 // hi(a[1]*b[i]) - adcs x16,x16,x10 - umulh x10,x6,x3 // hi(a[2]*b[i]) - adcs x17,x17,x11 - umulh x11,x7,x3 // hi(a[3]*b[i]) - adc x19,x19,xzr - ldr x3,[x2,#8*(1+1)] // b[1+1] - adds x15,x15,x8 // accumulate high parts of multiplication - lsl x8,x14,#32 - adcs x16,x16,x9 - lsr x9,x14,#32 - adcs x17,x17,x10 - adcs x19,x19,x11 - adc x20,xzr,xzr - subs x10,x14,x8 // "*0xffff0001" - sbc x11,x14,x9 - adds x14,x15,x8 // +=acc[0]<<96 and omit acc[0] - mul x8,x4,x3 // lo(a[0]*b[i]) - adcs x15,x16,x9 - mul x9,x5,x3 // lo(a[1]*b[i]) - adcs x16,x17,x10 // +=acc[0]*0xffff0001 - mul x10,x6,x3 // lo(a[2]*b[i]) - adcs x17,x19,x11 - mul x11,x7,x3 // lo(a[3]*b[i]) - adc x19,x20,xzr - - adds x14,x14,x8 // accumulate low parts of multiplication - umulh x8,x4,x3 // hi(a[0]*b[i]) - adcs x15,x15,x9 - umulh x9,x5,x3 // hi(a[1]*b[i]) - adcs x16,x16,x10 - umulh x10,x6,x3 // hi(a[2]*b[i]) - adcs x17,x17,x11 - umulh x11,x7,x3 // hi(a[3]*b[i]) - adc x19,x19,xzr - ldr x3,[x2,#8*(2+1)] // b[2+1] - adds x15,x15,x8 // accumulate high parts of multiplication - lsl x8,x14,#32 - adcs x16,x16,x9 - lsr x9,x14,#32 - adcs x17,x17,x10 - adcs x19,x19,x11 - adc x20,xzr,xzr - subs x10,x14,x8 // "*0xffff0001" - sbc x11,x14,x9 - adds x14,x15,x8 // +=acc[0]<<96 and omit acc[0] - mul x8,x4,x3 // lo(a[0]*b[i]) - adcs x15,x16,x9 - mul x9,x5,x3 // lo(a[1]*b[i]) - adcs x16,x17,x10 // +=acc[0]*0xffff0001 - mul x10,x6,x3 // lo(a[2]*b[i]) - adcs x17,x19,x11 - mul x11,x7,x3 // lo(a[3]*b[i]) - adc x19,x20,xzr - - adds x14,x14,x8 // accumulate low parts of multiplication - umulh x8,x4,x3 // hi(a[0]*b[i]) - adcs x15,x15,x9 - umulh x9,x5,x3 // hi(a[1]*b[i]) - adcs x16,x16,x10 - umulh x10,x6,x3 // hi(a[2]*b[i]) - adcs x17,x17,x11 - umulh x11,x7,x3 // hi(a[3]*b[i]) - adc x19,x19,xzr - adds x15,x15,x8 // accumulate high parts of multiplication - lsl x8,x14,#32 - adcs x16,x16,x9 - lsr x9,x14,#32 - adcs x17,x17,x10 - adcs x19,x19,x11 - adc x20,xzr,xzr - // last reduction - subs x10,x14,x8 // "*0xffff0001" - sbc x11,x14,x9 - adds x14,x15,x8 // +=acc[0]<<96 and omit acc[0] - adcs x15,x16,x9 - adcs x16,x17,x10 // +=acc[0]*0xffff0001 - adcs x17,x19,x11 - adc x19,x20,xzr - - adds x8,x14,#1 // subs x8,x14,#-1 // tmp = ret-modulus - sbcs x9,x15,x12 - sbcs x10,x16,xzr - sbcs x11,x17,x13 - sbcs xzr,x19,xzr // did it borrow? - - csel x14,x14,x8,lo // ret = borrow ? ret : ret-modulus - csel x15,x15,x9,lo - csel x16,x16,x10,lo - stp x14,x15,[x0] - csel x17,x17,x11,lo - stp x16,x17,[x0,#16] - - ret -.size __ecp_nistz256_mul_mont,.-__ecp_nistz256_mul_mont - -// note that __ecp_nistz256_sqr_mont expects a[0-3] input pre-loaded -// to x4-x7 -.type __ecp_nistz256_sqr_mont,%function -.align 4 -__ecp_nistz256_sqr_mont: - // | | | | | |a1*a0| | - // | | | | |a2*a0| | | - // | |a3*a2|a3*a0| | | | - // | | | |a2*a1| | | | - // | | |a3*a1| | | | | - // *| | | | | | | | 2| - // +|a3*a3|a2*a2|a1*a1|a0*a0| - // |--+--+--+--+--+--+--+--| - // |A7|A6|A5|A4|A3|A2|A1|A0|, where Ax is , i.e. follow - // - // "can't overflow" below mark carrying into high part of - // multiplication result, which can't overflow, because it - // can never be all ones. - - mul x15,x5,x4 // a[1]*a[0] - umulh x9,x5,x4 - mul x16,x6,x4 // a[2]*a[0] - umulh x10,x6,x4 - mul x17,x7,x4 // a[3]*a[0] - umulh x19,x7,x4 - - adds x16,x16,x9 // accumulate high parts of multiplication - mul x8,x6,x5 // a[2]*a[1] - umulh x9,x6,x5 - adcs x17,x17,x10 - mul x10,x7,x5 // a[3]*a[1] - umulh x11,x7,x5 - adc x19,x19,xzr // can't overflow - - mul x20,x7,x6 // a[3]*a[2] - umulh x1,x7,x6 - - adds x9,x9,x10 // accumulate high parts of multiplication - mul x14,x4,x4 // a[0]*a[0] - adc x10,x11,xzr // can't overflow - - adds x17,x17,x8 // accumulate low parts of multiplication - umulh x4,x4,x4 - adcs x19,x19,x9 - mul x9,x5,x5 // a[1]*a[1] - adcs x20,x20,x10 - umulh x5,x5,x5 - adc x1,x1,xzr // can't overflow - - adds x15,x15,x15 // acc[1-6]*=2 - mul x10,x6,x6 // a[2]*a[2] - adcs x16,x16,x16 - umulh x6,x6,x6 - adcs x17,x17,x17 - mul x11,x7,x7 // a[3]*a[3] - adcs x19,x19,x19 - umulh x7,x7,x7 - adcs x20,x20,x20 - adcs x1,x1,x1 - adc x2,xzr,xzr - - adds x15,x15,x4 // +a[i]*a[i] - adcs x16,x16,x9 - adcs x17,x17,x5 - adcs x19,x19,x10 - adcs x20,x20,x6 - lsl x8,x14,#32 - adcs x1,x1,x11 - lsr x9,x14,#32 - adc x2,x2,x7 - subs x10,x14,x8 // "*0xffff0001" - sbc x11,x14,x9 - adds x14,x15,x8 // +=acc[0]<<96 and omit acc[0] - adcs x15,x16,x9 - lsl x8,x14,#32 - adcs x16,x17,x10 // +=acc[0]*0xffff0001 - lsr x9,x14,#32 - adc x17,x11,xzr // can't overflow - subs x10,x14,x8 // "*0xffff0001" - sbc x11,x14,x9 - adds x14,x15,x8 // +=acc[0]<<96 and omit acc[0] - adcs x15,x16,x9 - lsl x8,x14,#32 - adcs x16,x17,x10 // +=acc[0]*0xffff0001 - lsr x9,x14,#32 - adc x17,x11,xzr // can't overflow - subs x10,x14,x8 // "*0xffff0001" - sbc x11,x14,x9 - adds x14,x15,x8 // +=acc[0]<<96 and omit acc[0] - adcs x15,x16,x9 - lsl x8,x14,#32 - adcs x16,x17,x10 // +=acc[0]*0xffff0001 - lsr x9,x14,#32 - adc x17,x11,xzr // can't overflow - subs x10,x14,x8 // "*0xffff0001" - sbc x11,x14,x9 - adds x14,x15,x8 // +=acc[0]<<96 and omit acc[0] - adcs x15,x16,x9 - adcs x16,x17,x10 // +=acc[0]*0xffff0001 - adc x17,x11,xzr // can't overflow - - adds x14,x14,x19 // accumulate upper half - adcs x15,x15,x20 - adcs x16,x16,x1 - adcs x17,x17,x2 - adc x19,xzr,xzr - - adds x8,x14,#1 // subs x8,x14,#-1 // tmp = ret-modulus - sbcs x9,x15,x12 - sbcs x10,x16,xzr - sbcs x11,x17,x13 - sbcs xzr,x19,xzr // did it borrow? - - csel x14,x14,x8,lo // ret = borrow ? ret : ret-modulus - csel x15,x15,x9,lo - csel x16,x16,x10,lo - stp x14,x15,[x0] - csel x17,x17,x11,lo - stp x16,x17,[x0,#16] - - ret -.size __ecp_nistz256_sqr_mont,.-__ecp_nistz256_sqr_mont - -// Note that __ecp_nistz256_add expects both input vectors pre-loaded to -// x4-x7 and x8-x11. This is done because it's used in multiple -// contexts, e.g. in multiplication by 2 and 3... -.type __ecp_nistz256_add,%function -.align 4 -__ecp_nistz256_add: - adds x14,x14,x8 // ret = a+b - adcs x15,x15,x9 - adcs x16,x16,x10 - adcs x17,x17,x11 - adc x1,xzr,xzr // zap x1 - - adds x8,x14,#1 // subs x8,x4,#-1 // tmp = ret-modulus - sbcs x9,x15,x12 - sbcs x10,x16,xzr - sbcs x11,x17,x13 - sbcs xzr,x1,xzr // did subtraction borrow? - - csel x14,x14,x8,lo // ret = borrow ? ret : ret-modulus - csel x15,x15,x9,lo - csel x16,x16,x10,lo - stp x14,x15,[x0] - csel x17,x17,x11,lo - stp x16,x17,[x0,#16] - - ret -.size __ecp_nistz256_add,.-__ecp_nistz256_add - -.type __ecp_nistz256_sub_from,%function -.align 4 -__ecp_nistz256_sub_from: - ldp x8,x9,[x2] - ldp x10,x11,[x2,#16] - subs x14,x14,x8 // ret = a-b - sbcs x15,x15,x9 - sbcs x16,x16,x10 - sbcs x17,x17,x11 - sbc x1,xzr,xzr // zap x1 - - subs x8,x14,#1 // adds x8,x4,#-1 // tmp = ret+modulus - adcs x9,x15,x12 - adcs x10,x16,xzr - adc x11,x17,x13 - cmp x1,xzr // did subtraction borrow? - - csel x14,x14,x8,eq // ret = borrow ? ret+modulus : ret - csel x15,x15,x9,eq - csel x16,x16,x10,eq - stp x14,x15,[x0] - csel x17,x17,x11,eq - stp x16,x17,[x0,#16] - - ret -.size __ecp_nistz256_sub_from,.-__ecp_nistz256_sub_from - -.type __ecp_nistz256_sub_morf,%function -.align 4 -__ecp_nistz256_sub_morf: - ldp x8,x9,[x2] - ldp x10,x11,[x2,#16] - subs x14,x8,x14 // ret = b-a - sbcs x15,x9,x15 - sbcs x16,x10,x16 - sbcs x17,x11,x17 - sbc x1,xzr,xzr // zap x1 - - subs x8,x14,#1 // adds x8,x4,#-1 // tmp = ret+modulus - adcs x9,x15,x12 - adcs x10,x16,xzr - adc x11,x17,x13 - cmp x1,xzr // did subtraction borrow? - - csel x14,x14,x8,eq // ret = borrow ? ret+modulus : ret - csel x15,x15,x9,eq - csel x16,x16,x10,eq - stp x14,x15,[x0] - csel x17,x17,x11,eq - stp x16,x17,[x0,#16] - - ret -.size __ecp_nistz256_sub_morf,.-__ecp_nistz256_sub_morf - -.type __ecp_nistz256_div_by_2,%function -.align 4 -__ecp_nistz256_div_by_2: - subs x8,x14,#1 // adds x8,x4,#-1 // tmp = a+modulus - adcs x9,x15,x12 - adcs x10,x16,xzr - adcs x11,x17,x13 - adc x1,xzr,xzr // zap x1 - tst x14,#1 // is a even? - - csel x14,x14,x8,eq // ret = even ? a : a+modulus - csel x15,x15,x9,eq - csel x16,x16,x10,eq - csel x17,x17,x11,eq - csel x1,xzr,x1,eq - - lsr x14,x14,#1 // ret >>= 1 - orr x14,x14,x15,lsl#63 - lsr x15,x15,#1 - orr x15,x15,x16,lsl#63 - lsr x16,x16,#1 - orr x16,x16,x17,lsl#63 - lsr x17,x17,#1 - stp x14,x15,[x0] - orr x17,x17,x1,lsl#63 - stp x16,x17,[x0,#16] - - ret -.size __ecp_nistz256_div_by_2,.-__ecp_nistz256_div_by_2 -.globl GFp_nistz256_point_double -.hidden GFp_nistz256_point_double -.type GFp_nistz256_point_double,%function -.align 5 -GFp_nistz256_point_double: - stp x29,x30,[sp,#-80]! - add x29,sp,#0 - stp x19,x20,[sp,#16] - stp x21,x22,[sp,#32] - sub sp,sp,#32*4 - -.Ldouble_shortcut: - ldp x14,x15,[x1,#32] - mov x21,x0 - ldp x16,x17,[x1,#48] - mov x22,x1 - ldr x12,.Lpoly+8 - mov x8,x14 - ldr x13,.Lpoly+24 - mov x9,x15 - ldp x4,x5,[x22,#64] // forward load for p256_sqr_mont - mov x10,x16 - mov x11,x17 - ldp x6,x7,[x22,#64+16] - add x0,sp,#0 - bl __ecp_nistz256_add // p256_mul_by_2(S, in_y); - - add x0,sp,#64 - bl __ecp_nistz256_sqr_mont // p256_sqr_mont(Zsqr, in_z); - - ldp x8,x9,[x22] - ldp x10,x11,[x22,#16] - mov x4,x14 // put Zsqr aside for p256_sub - mov x5,x15 - mov x6,x16 - mov x7,x17 - add x0,sp,#32 - bl __ecp_nistz256_add // p256_add(M, Zsqr, in_x); - - add x2,x22,#0 - mov x14,x4 // restore Zsqr - mov x15,x5 - ldp x4,x5,[sp,#0] // forward load for p256_sqr_mont - mov x16,x6 - mov x17,x7 - ldp x6,x7,[sp,#0+16] - add x0,sp,#64 - bl __ecp_nistz256_sub_morf // p256_sub(Zsqr, in_x, Zsqr); - - add x0,sp,#0 - bl __ecp_nistz256_sqr_mont // p256_sqr_mont(S, S); - - ldr x3,[x22,#32] - ldp x4,x5,[x22,#64] - ldp x6,x7,[x22,#64+16] - add x2,x22,#32 - add x0,sp,#96 - bl __ecp_nistz256_mul_mont // p256_mul_mont(tmp0, in_z, in_y); - - mov x8,x14 - mov x9,x15 - ldp x4,x5,[sp,#0] // forward load for p256_sqr_mont - mov x10,x16 - mov x11,x17 - ldp x6,x7,[sp,#0+16] - add x0,x21,#64 - bl __ecp_nistz256_add // p256_mul_by_2(res_z, tmp0); - - add x0,sp,#96 - bl __ecp_nistz256_sqr_mont // p256_sqr_mont(tmp0, S); - - ldr x3,[sp,#64] // forward load for p256_mul_mont - ldp x4,x5,[sp,#32] - ldp x6,x7,[sp,#32+16] - add x0,x21,#32 - bl __ecp_nistz256_div_by_2 // p256_div_by_2(res_y, tmp0); - - add x2,sp,#64 - add x0,sp,#32 - bl __ecp_nistz256_mul_mont // p256_mul_mont(M, M, Zsqr); - - mov x8,x14 // duplicate M - mov x9,x15 - mov x10,x16 - mov x11,x17 - mov x4,x14 // put M aside - mov x5,x15 - mov x6,x16 - mov x7,x17 - add x0,sp,#32 - bl __ecp_nistz256_add - mov x8,x4 // restore M - mov x9,x5 - ldr x3,[x22] // forward load for p256_mul_mont - mov x10,x6 - ldp x4,x5,[sp,#0] - mov x11,x7 - ldp x6,x7,[sp,#0+16] - bl __ecp_nistz256_add // p256_mul_by_3(M, M); - - add x2,x22,#0 - add x0,sp,#0 - bl __ecp_nistz256_mul_mont // p256_mul_mont(S, S, in_x); - - mov x8,x14 - mov x9,x15 - ldp x4,x5,[sp,#32] // forward load for p256_sqr_mont - mov x10,x16 - mov x11,x17 - ldp x6,x7,[sp,#32+16] - add x0,sp,#96 - bl __ecp_nistz256_add // p256_mul_by_2(tmp0, S); - - add x0,x21,#0 - bl __ecp_nistz256_sqr_mont // p256_sqr_mont(res_x, M); - - add x2,sp,#96 - bl __ecp_nistz256_sub_from // p256_sub(res_x, res_x, tmp0); - - add x2,sp,#0 - add x0,sp,#0 - bl __ecp_nistz256_sub_morf // p256_sub(S, S, res_x); - - ldr x3,[sp,#32] - mov x4,x14 // copy S - mov x5,x15 - mov x6,x16 - mov x7,x17 - add x2,sp,#32 - bl __ecp_nistz256_mul_mont // p256_mul_mont(S, S, M); - - add x2,x21,#32 - add x0,x21,#32 - bl __ecp_nistz256_sub_from // p256_sub(res_y, S, res_y); - - add sp,x29,#0 // destroy frame - ldp x19,x20,[x29,#16] - ldp x21,x22,[x29,#32] - ldp x29,x30,[sp],#80 - ret -.size GFp_nistz256_point_double,.-GFp_nistz256_point_double -.globl GFp_nistz256_point_add_affine -.hidden GFp_nistz256_point_add_affine -.type GFp_nistz256_point_add_affine,%function -.align 5 -GFp_nistz256_point_add_affine: - stp x29,x30,[sp,#-80]! - add x29,sp,#0 - stp x19,x20,[sp,#16] - stp x21,x22,[sp,#32] - stp x23,x24,[sp,#48] - stp x25,x26,[sp,#64] - sub sp,sp,#32*10 - - mov x21,x0 - mov x22,x1 - mov x23,x2 - ldr x12,.Lpoly+8 - ldr x13,.Lpoly+24 - - ldp x4,x5,[x1,#64] // in1_z - ldp x6,x7,[x1,#64+16] - orr x8,x4,x5 - orr x10,x6,x7 - orr x24,x8,x10 - cmp x24,#0 - csetm x24,ne // !in1infty - - ldp x14,x15,[x2] // in2_x - ldp x16,x17,[x2,#16] - ldp x8,x9,[x2,#32] // in2_y - ldp x10,x11,[x2,#48] - orr x14,x14,x15 - orr x16,x16,x17 - orr x8,x8,x9 - orr x10,x10,x11 - orr x14,x14,x16 - orr x8,x8,x10 - orr x25,x14,x8 - cmp x25,#0 - csetm x25,ne // !in2infty - - add x0,sp,#128 - bl __ecp_nistz256_sqr_mont // p256_sqr_mont(Z1sqr, in1_z); - - mov x4,x14 - mov x5,x15 - mov x6,x16 - mov x7,x17 - ldr x3,[x23] - add x2,x23,#0 - add x0,sp,#96 - bl __ecp_nistz256_mul_mont // p256_mul_mont(U2, Z1sqr, in2_x); - - add x2,x22,#0 - ldr x3,[x22,#64] // forward load for p256_mul_mont - ldp x4,x5,[sp,#128] - ldp x6,x7,[sp,#128+16] - add x0,sp,#160 - bl __ecp_nistz256_sub_from // p256_sub(H, U2, in1_x); - - add x2,x22,#64 - add x0,sp,#128 - bl __ecp_nistz256_mul_mont // p256_mul_mont(S2, Z1sqr, in1_z); - - ldr x3,[x22,#64] - ldp x4,x5,[sp,#160] - ldp x6,x7,[sp,#160+16] - add x2,x22,#64 - add x0,sp,#64 - bl __ecp_nistz256_mul_mont // p256_mul_mont(res_z, H, in1_z); - - ldr x3,[x23,#32] - ldp x4,x5,[sp,#128] - ldp x6,x7,[sp,#128+16] - add x2,x23,#32 - add x0,sp,#128 - bl __ecp_nistz256_mul_mont // p256_mul_mont(S2, S2, in2_y); - - add x2,x22,#32 - ldp x4,x5,[sp,#160] // forward load for p256_sqr_mont - ldp x6,x7,[sp,#160+16] - add x0,sp,#192 - bl __ecp_nistz256_sub_from // p256_sub(R, S2, in1_y); - - add x0,sp,#224 - bl __ecp_nistz256_sqr_mont // p256_sqr_mont(Hsqr, H); - - ldp x4,x5,[sp,#192] - ldp x6,x7,[sp,#192+16] - add x0,sp,#288 - bl __ecp_nistz256_sqr_mont // p256_sqr_mont(Rsqr, R); - - ldr x3,[sp,#160] - ldp x4,x5,[sp,#224] - ldp x6,x7,[sp,#224+16] - add x2,sp,#160 - add x0,sp,#256 - bl __ecp_nistz256_mul_mont // p256_mul_mont(Hcub, Hsqr, H); - - ldr x3,[x22] - ldp x4,x5,[sp,#224] - ldp x6,x7,[sp,#224+16] - add x2,x22,#0 - add x0,sp,#96 - bl __ecp_nistz256_mul_mont // p256_mul_mont(U2, in1_x, Hsqr); - - mov x8,x14 - mov x9,x15 - mov x10,x16 - mov x11,x17 - add x0,sp,#224 - bl __ecp_nistz256_add // p256_mul_by_2(Hsqr, U2); - - add x2,sp,#288 - add x0,sp,#0 - bl __ecp_nistz256_sub_morf // p256_sub(res_x, Rsqr, Hsqr); - - add x2,sp,#256 - bl __ecp_nistz256_sub_from // p256_sub(res_x, res_x, Hcub); - - add x2,sp,#96 - ldr x3,[x22,#32] // forward load for p256_mul_mont - ldp x4,x5,[sp,#256] - ldp x6,x7,[sp,#256+16] - add x0,sp,#32 - bl __ecp_nistz256_sub_morf // p256_sub(res_y, U2, res_x); - - add x2,x22,#32 - add x0,sp,#128 - bl __ecp_nistz256_mul_mont // p256_mul_mont(S2, in1_y, Hcub); - - ldr x3,[sp,#192] - ldp x4,x5,[sp,#32] - ldp x6,x7,[sp,#32+16] - add x2,sp,#192 - add x0,sp,#32 - bl __ecp_nistz256_mul_mont // p256_mul_mont(res_y, res_y, R); - - add x2,sp,#128 - bl __ecp_nistz256_sub_from // p256_sub(res_y, res_y, S2); - - ldp x4,x5,[sp,#0] // res - ldp x6,x7,[sp,#0+16] - ldp x8,x9,[x23] // in2 - ldp x10,x11,[x23,#16] - ldp x14,x15,[x22,#0] // in1 - cmp x24,#0 // !, remember? - ldp x16,x17,[x22,#0+16] - csel x8,x4,x8,ne - csel x9,x5,x9,ne - ldp x4,x5,[sp,#0+0+32] // res - csel x10,x6,x10,ne - csel x11,x7,x11,ne - cmp x25,#0 // !, remember? - ldp x6,x7,[sp,#0+0+48] - csel x14,x8,x14,ne - csel x15,x9,x15,ne - ldp x8,x9,[x23,#0+32] // in2 - csel x16,x10,x16,ne - csel x17,x11,x17,ne - ldp x10,x11,[x23,#0+48] - stp x14,x15,[x21,#0] - stp x16,x17,[x21,#0+16] - adr x23,.Lone_mont-64 - ldp x14,x15,[x22,#32] // in1 - cmp x24,#0 // !, remember? - ldp x16,x17,[x22,#32+16] - csel x8,x4,x8,ne - csel x9,x5,x9,ne - ldp x4,x5,[sp,#0+32+32] // res - csel x10,x6,x10,ne - csel x11,x7,x11,ne - cmp x25,#0 // !, remember? - ldp x6,x7,[sp,#0+32+48] - csel x14,x8,x14,ne - csel x15,x9,x15,ne - ldp x8,x9,[x23,#32+32] // in2 - csel x16,x10,x16,ne - csel x17,x11,x17,ne - ldp x10,x11,[x23,#32+48] - stp x14,x15,[x21,#32] - stp x16,x17,[x21,#32+16] - ldp x14,x15,[x22,#64] // in1 - cmp x24,#0 // !, remember? - ldp x16,x17,[x22,#64+16] - csel x8,x4,x8,ne - csel x9,x5,x9,ne - csel x10,x6,x10,ne - csel x11,x7,x11,ne - cmp x25,#0 // !, remember? - csel x14,x8,x14,ne - csel x15,x9,x15,ne - csel x16,x10,x16,ne - csel x17,x11,x17,ne - stp x14,x15,[x21,#64] - stp x16,x17,[x21,#64+16] - - add sp,x29,#0 // destroy frame - ldp x19,x20,[x29,#16] - ldp x21,x22,[x29,#32] - ldp x23,x24,[x29,#48] - ldp x25,x26,[x29,#64] - ldp x29,x30,[sp],#80 - ret -.size GFp_nistz256_point_add_affine,.-GFp_nistz256_point_add_affine -#endif -#endif // !OPENSSL_NO_ASM -.section .note.GNU-stack,"",%progbits diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ecp_nistz256-x86-elf.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ecp_nistz256-x86-elf.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ecp_nistz256-x86-elf.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ecp_nistz256-x86-elf.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,1128 +0,0 @@ -# This file is generated from a similarly-named Perl script in the BoringSSL -# source tree. Do not edit by hand. - -#if defined(__i386__) -#if defined(BORINGSSL_PREFIX) -#include -#endif -.text -.LONE_mont: -.long 1,0,0,-1,-1,-1,-2,0 -.hidden _ecp_nistz256_div_by_2 -.type _ecp_nistz256_div_by_2,@function -.align 16 -_ecp_nistz256_div_by_2: - movl (%esi),%ebp - xorl %edx,%edx - movl 4(%esi),%ebx - movl %ebp,%eax - andl $1,%ebp - movl 8(%esi),%ecx - subl %ebp,%edx - addl %edx,%eax - adcl %edx,%ebx - movl %eax,(%edi) - adcl %edx,%ecx - movl %ebx,4(%edi) - movl %ecx,8(%edi) - movl 12(%esi),%eax - movl 16(%esi),%ebx - adcl $0,%eax - movl 20(%esi),%ecx - adcl $0,%ebx - movl %eax,12(%edi) - adcl $0,%ecx - movl %ebx,16(%edi) - movl %ecx,20(%edi) - movl 24(%esi),%eax - movl 28(%esi),%ebx - adcl %ebp,%eax - adcl %edx,%ebx - movl %eax,24(%edi) - sbbl %esi,%esi - movl %ebx,28(%edi) - movl (%edi),%eax - movl 4(%edi),%ebx - movl 8(%edi),%ecx - movl 12(%edi),%edx - shrl $1,%eax - movl %ebx,%ebp - shll $31,%ebx - orl %ebx,%eax - shrl $1,%ebp - movl %ecx,%ebx - shll $31,%ecx - movl %eax,(%edi) - orl %ecx,%ebp - movl 16(%edi),%eax - shrl $1,%ebx - movl %edx,%ecx - shll $31,%edx - movl %ebp,4(%edi) - orl %edx,%ebx - movl 20(%edi),%ebp - shrl $1,%ecx - movl %eax,%edx - shll $31,%eax - movl %ebx,8(%edi) - orl %eax,%ecx - movl 24(%edi),%ebx - shrl $1,%edx - movl %ebp,%eax - shll $31,%ebp - movl %ecx,12(%edi) - orl %ebp,%edx - movl 28(%edi),%ecx - shrl $1,%eax - movl %ebx,%ebp - shll $31,%ebx - movl %edx,16(%edi) - orl %ebx,%eax - shrl $1,%ebp - movl %ecx,%ebx - shll $31,%ecx - movl %eax,20(%edi) - orl %ecx,%ebp - shrl $1,%ebx - shll $31,%esi - movl %ebp,24(%edi) - orl %esi,%ebx - movl %ebx,28(%edi) - ret -.size _ecp_nistz256_div_by_2,.-_ecp_nistz256_div_by_2 -.globl GFp_nistz256_add -.hidden GFp_nistz256_add -.type GFp_nistz256_add,@function -.align 16 -GFp_nistz256_add: -.L_GFp_nistz256_add_begin: - pushl %ebp - pushl %ebx - pushl %esi - pushl %edi - movl 24(%esp),%esi - movl 28(%esp),%ebp - movl 20(%esp),%edi - call _ecp_nistz256_add - popl %edi - popl %esi - popl %ebx - popl %ebp - ret -.size GFp_nistz256_add,.-.L_GFp_nistz256_add_begin -.hidden _ecp_nistz256_add -.type _ecp_nistz256_add,@function -.align 16 -_ecp_nistz256_add: - movl (%esi),%eax - movl 4(%esi),%ebx - movl 8(%esi),%ecx - addl (%ebp),%eax - movl 12(%esi),%edx - adcl 4(%ebp),%ebx - movl %eax,(%edi) - adcl 8(%ebp),%ecx - movl %ebx,4(%edi) - adcl 12(%ebp),%edx - movl %ecx,8(%edi) - movl %edx,12(%edi) - movl 16(%esi),%eax - movl 20(%esi),%ebx - movl 24(%esi),%ecx - adcl 16(%ebp),%eax - movl 28(%esi),%edx - adcl 20(%ebp),%ebx - movl %eax,16(%edi) - adcl 24(%ebp),%ecx - movl %ebx,20(%edi) - movl $0,%esi - adcl 28(%ebp),%edx - movl %ecx,24(%edi) - adcl $0,%esi - movl %edx,28(%edi) - movl (%edi),%eax - movl 4(%edi),%ebx - movl 8(%edi),%ecx - subl $-1,%eax - movl 12(%edi),%edx - sbbl $-1,%ebx - movl 16(%edi),%eax - sbbl $-1,%ecx - movl 20(%edi),%ebx - sbbl $0,%edx - movl 24(%edi),%ecx - sbbl $0,%eax - movl 28(%edi),%edx - sbbl $0,%ebx - sbbl $1,%ecx - sbbl $-1,%edx - sbbl $0,%esi - notl %esi - movl (%edi),%eax - movl %esi,%ebp - movl 4(%edi),%ebx - shrl $31,%ebp - movl 8(%edi),%ecx - subl %esi,%eax - movl 12(%edi),%edx - sbbl %esi,%ebx - movl %eax,(%edi) - sbbl %esi,%ecx - movl %ebx,4(%edi) - sbbl $0,%edx - movl %ecx,8(%edi) - movl %edx,12(%edi) - movl 16(%edi),%eax - movl 20(%edi),%ebx - movl 24(%edi),%ecx - sbbl $0,%eax - movl 28(%edi),%edx - sbbl $0,%ebx - movl %eax,16(%edi) - sbbl %ebp,%ecx - movl %ebx,20(%edi) - sbbl %esi,%edx - movl %ecx,24(%edi) - movl %edx,28(%edi) - ret -.size _ecp_nistz256_add,.-_ecp_nistz256_add -.hidden _ecp_nistz256_sub -.type _ecp_nistz256_sub,@function -.align 16 -_ecp_nistz256_sub: - movl (%esi),%eax - movl 4(%esi),%ebx - movl 8(%esi),%ecx - subl (%ebp),%eax - movl 12(%esi),%edx - sbbl 4(%ebp),%ebx - movl %eax,(%edi) - sbbl 8(%ebp),%ecx - movl %ebx,4(%edi) - sbbl 12(%ebp),%edx - movl %ecx,8(%edi) - movl %edx,12(%edi) - movl 16(%esi),%eax - movl 20(%esi),%ebx - movl 24(%esi),%ecx - sbbl 16(%ebp),%eax - movl 28(%esi),%edx - sbbl 20(%ebp),%ebx - sbbl 24(%ebp),%ecx - movl %eax,16(%edi) - sbbl 28(%ebp),%edx - movl %ebx,20(%edi) - sbbl %esi,%esi - movl %ecx,24(%edi) - movl %edx,28(%edi) - movl (%edi),%eax - movl %esi,%ebp - movl 4(%edi),%ebx - shrl $31,%ebp - movl 8(%edi),%ecx - addl %esi,%eax - movl 12(%edi),%edx - adcl %esi,%ebx - movl %eax,(%edi) - adcl %esi,%ecx - movl %ebx,4(%edi) - adcl $0,%edx - movl %ecx,8(%edi) - movl %edx,12(%edi) - movl 16(%edi),%eax - movl 20(%edi),%ebx - movl 24(%edi),%ecx - adcl $0,%eax - movl 28(%edi),%edx - adcl $0,%ebx - movl %eax,16(%edi) - adcl %ebp,%ecx - movl %ebx,20(%edi) - adcl %esi,%edx - movl %ecx,24(%edi) - movl %edx,28(%edi) - ret -.size _ecp_nistz256_sub,.-_ecp_nistz256_sub -.globl GFp_nistz256_neg -.hidden GFp_nistz256_neg -.type GFp_nistz256_neg,@function -.align 16 -GFp_nistz256_neg: -.L_GFp_nistz256_neg_begin: - pushl %ebp - pushl %ebx - pushl %esi - pushl %edi - movl 24(%esp),%ebp - movl 20(%esp),%edi - xorl %eax,%eax - subl $32,%esp - movl %eax,(%esp) - movl %esp,%esi - movl %eax,4(%esp) - movl %eax,8(%esp) - movl %eax,12(%esp) - movl %eax,16(%esp) - movl %eax,20(%esp) - movl %eax,24(%esp) - movl %eax,28(%esp) - call _ecp_nistz256_sub - addl $32,%esp - popl %edi - popl %esi - popl %ebx - popl %ebp - ret -.size GFp_nistz256_neg,.-.L_GFp_nistz256_neg_begin -.hidden _picup_eax -.type _picup_eax,@function -.align 16 -_picup_eax: - movl (%esp),%eax - ret -.size _picup_eax,.-_picup_eax -.globl GFp_nistz256_mul_mont -.hidden GFp_nistz256_mul_mont -.type GFp_nistz256_mul_mont,@function -.align 16 -GFp_nistz256_mul_mont: -.L_GFp_nistz256_mul_mont_begin: - pushl %ebp - pushl %ebx - pushl %esi - pushl %edi - movl 24(%esp),%esi - movl 28(%esp),%ebp - call _picup_eax -.L000pic: - leal GFp_ia32cap_P-.L000pic(%eax),%eax - movl (%eax),%eax - movl 20(%esp),%edi - call _ecp_nistz256_mul_mont - popl %edi - popl %esi - popl %ebx - popl %ebp - ret -.size GFp_nistz256_mul_mont,.-.L_GFp_nistz256_mul_mont_begin -.hidden _ecp_nistz256_mul_mont -.type _ecp_nistz256_mul_mont,@function -.align 16 -_ecp_nistz256_mul_mont: - movl %esp,%edx - subl $256,%esp - movd (%ebp),%xmm7 - leal 4(%ebp),%ebp - pcmpeqd %xmm6,%xmm6 - psrlq $48,%xmm6 - pshuflw $220,%xmm7,%xmm7 - andl $-64,%esp - pshufd $220,%xmm7,%xmm7 - leal 128(%esp),%ebx - movd (%esi),%xmm0 - pshufd $204,%xmm0,%xmm0 - movd 4(%esi),%xmm1 - movdqa %xmm0,(%ebx) - pmuludq %xmm7,%xmm0 - movd 8(%esi),%xmm2 - pshufd $204,%xmm1,%xmm1 - movdqa %xmm1,16(%ebx) - pmuludq %xmm7,%xmm1 - movq %xmm0,%xmm4 - pslldq $6,%xmm4 - paddq %xmm0,%xmm4 - movdqa %xmm4,%xmm5 - psrldq $10,%xmm4 - pand %xmm6,%xmm5 - movd 12(%esi),%xmm3 - pshufd $204,%xmm2,%xmm2 - movdqa %xmm2,32(%ebx) - pmuludq %xmm7,%xmm2 - paddq %xmm4,%xmm1 - movdqa %xmm1,(%esp) - movd 16(%esi),%xmm0 - pshufd $204,%xmm3,%xmm3 - movdqa %xmm3,48(%ebx) - pmuludq %xmm7,%xmm3 - movdqa %xmm2,16(%esp) - movd 20(%esi),%xmm1 - pshufd $204,%xmm0,%xmm0 - movdqa %xmm0,64(%ebx) - pmuludq %xmm7,%xmm0 - paddq %xmm5,%xmm3 - movdqa %xmm3,32(%esp) - movd 24(%esi),%xmm2 - pshufd $204,%xmm1,%xmm1 - movdqa %xmm1,80(%ebx) - pmuludq %xmm7,%xmm1 - movdqa %xmm0,48(%esp) - pshufd $177,%xmm5,%xmm4 - movd 28(%esi),%xmm3 - pshufd $204,%xmm2,%xmm2 - movdqa %xmm2,96(%ebx) - pmuludq %xmm7,%xmm2 - movdqa %xmm1,64(%esp) - psubq %xmm5,%xmm4 - movd (%ebp),%xmm0 - pshufd $204,%xmm3,%xmm3 - movdqa %xmm3,112(%ebx) - pmuludq %xmm7,%xmm3 - pshuflw $220,%xmm0,%xmm7 - movdqa (%ebx),%xmm0 - pshufd $220,%xmm7,%xmm7 - movl $6,%ecx - leal 4(%ebp),%ebp - jmp .L001madd_sse2 -.align 16 -.L001madd_sse2: - paddq %xmm5,%xmm2 - paddq %xmm4,%xmm3 - movdqa 16(%ebx),%xmm1 - pmuludq %xmm7,%xmm0 - movdqa %xmm2,80(%esp) - movdqa 32(%ebx),%xmm2 - pmuludq %xmm7,%xmm1 - movdqa %xmm3,96(%esp) - paddq (%esp),%xmm0 - movdqa 48(%ebx),%xmm3 - pmuludq %xmm7,%xmm2 - movq %xmm0,%xmm4 - pslldq $6,%xmm4 - paddq 16(%esp),%xmm1 - paddq %xmm0,%xmm4 - movdqa %xmm4,%xmm5 - psrldq $10,%xmm4 - movdqa 64(%ebx),%xmm0 - pmuludq %xmm7,%xmm3 - paddq %xmm4,%xmm1 - paddq 32(%esp),%xmm2 - movdqa %xmm1,(%esp) - movdqa 80(%ebx),%xmm1 - pmuludq %xmm7,%xmm0 - paddq 48(%esp),%xmm3 - movdqa %xmm2,16(%esp) - pand %xmm6,%xmm5 - movdqa 96(%ebx),%xmm2 - pmuludq %xmm7,%xmm1 - paddq %xmm5,%xmm3 - paddq 64(%esp),%xmm0 - movdqa %xmm3,32(%esp) - pshufd $177,%xmm5,%xmm4 - movdqa %xmm7,%xmm3 - pmuludq %xmm7,%xmm2 - movd (%ebp),%xmm7 - leal 4(%ebp),%ebp - paddq 80(%esp),%xmm1 - psubq %xmm5,%xmm4 - movdqa %xmm0,48(%esp) - pshuflw $220,%xmm7,%xmm7 - pmuludq 112(%ebx),%xmm3 - pshufd $220,%xmm7,%xmm7 - movdqa (%ebx),%xmm0 - movdqa %xmm1,64(%esp) - paddq 96(%esp),%xmm2 - decl %ecx - jnz .L001madd_sse2 - paddq %xmm5,%xmm2 - paddq %xmm4,%xmm3 - movdqa 16(%ebx),%xmm1 - pmuludq %xmm7,%xmm0 - movdqa %xmm2,80(%esp) - movdqa 32(%ebx),%xmm2 - pmuludq %xmm7,%xmm1 - movdqa %xmm3,96(%esp) - paddq (%esp),%xmm0 - movdqa 48(%ebx),%xmm3 - pmuludq %xmm7,%xmm2 - movq %xmm0,%xmm4 - pslldq $6,%xmm4 - paddq 16(%esp),%xmm1 - paddq %xmm0,%xmm4 - movdqa %xmm4,%xmm5 - psrldq $10,%xmm4 - movdqa 64(%ebx),%xmm0 - pmuludq %xmm7,%xmm3 - paddq %xmm4,%xmm1 - paddq 32(%esp),%xmm2 - movdqa %xmm1,(%esp) - movdqa 80(%ebx),%xmm1 - pmuludq %xmm7,%xmm0 - paddq 48(%esp),%xmm3 - movdqa %xmm2,16(%esp) - pand %xmm6,%xmm5 - movdqa 96(%ebx),%xmm2 - pmuludq %xmm7,%xmm1 - paddq %xmm5,%xmm3 - paddq 64(%esp),%xmm0 - movdqa %xmm3,32(%esp) - pshufd $177,%xmm5,%xmm4 - movdqa 112(%ebx),%xmm3 - pmuludq %xmm7,%xmm2 - paddq 80(%esp),%xmm1 - psubq %xmm5,%xmm4 - movdqa %xmm0,48(%esp) - pmuludq %xmm7,%xmm3 - pcmpeqd %xmm7,%xmm7 - movdqa (%esp),%xmm0 - pslldq $8,%xmm7 - movdqa %xmm1,64(%esp) - paddq 96(%esp),%xmm2 - paddq %xmm5,%xmm2 - paddq %xmm4,%xmm3 - movdqa %xmm2,80(%esp) - movdqa %xmm3,96(%esp) - movdqa 16(%esp),%xmm1 - movdqa 32(%esp),%xmm2 - movdqa 48(%esp),%xmm3 - movq %xmm0,%xmm4 - pand %xmm7,%xmm0 - xorl %ebp,%ebp - pslldq $6,%xmm4 - movq %xmm1,%xmm5 - paddq %xmm4,%xmm0 - pand %xmm7,%xmm1 - psrldq $6,%xmm0 - movd %xmm0,%eax - psrldq $4,%xmm0 - paddq %xmm0,%xmm5 - movdqa 64(%esp),%xmm0 - subl $-1,%eax - pslldq $6,%xmm5 - movq %xmm2,%xmm4 - paddq %xmm5,%xmm1 - pand %xmm7,%xmm2 - psrldq $6,%xmm1 - movl %eax,(%edi) - movd %xmm1,%eax - psrldq $4,%xmm1 - paddq %xmm1,%xmm4 - movdqa 80(%esp),%xmm1 - sbbl $-1,%eax - pslldq $6,%xmm4 - movq %xmm3,%xmm5 - paddq %xmm4,%xmm2 - pand %xmm7,%xmm3 - psrldq $6,%xmm2 - movl %eax,4(%edi) - movd %xmm2,%eax - psrldq $4,%xmm2 - paddq %xmm2,%xmm5 - movdqa 96(%esp),%xmm2 - sbbl $-1,%eax - pslldq $6,%xmm5 - movq %xmm0,%xmm4 - paddq %xmm5,%xmm3 - pand %xmm7,%xmm0 - psrldq $6,%xmm3 - movl %eax,8(%edi) - movd %xmm3,%eax - psrldq $4,%xmm3 - paddq %xmm3,%xmm4 - sbbl $0,%eax - pslldq $6,%xmm4 - movq %xmm1,%xmm5 - paddq %xmm4,%xmm0 - pand %xmm7,%xmm1 - psrldq $6,%xmm0 - movl %eax,12(%edi) - movd %xmm0,%eax - psrldq $4,%xmm0 - paddq %xmm0,%xmm5 - sbbl $0,%eax - pslldq $6,%xmm5 - movq %xmm2,%xmm4 - paddq %xmm5,%xmm1 - pand %xmm7,%xmm2 - psrldq $6,%xmm1 - movd %xmm1,%ebx - psrldq $4,%xmm1 - movl %edx,%esp - paddq %xmm1,%xmm4 - pslldq $6,%xmm4 - paddq %xmm4,%xmm2 - psrldq $6,%xmm2 - movd %xmm2,%ecx - psrldq $4,%xmm2 - sbbl $0,%ebx - movd %xmm2,%edx - pextrw $2,%xmm2,%esi - sbbl $1,%ecx - sbbl $-1,%edx - sbbl $0,%esi - subl %esi,%ebp - addl %esi,(%edi) - adcl %esi,4(%edi) - adcl %esi,8(%edi) - adcl $0,12(%edi) - adcl $0,%eax - adcl $0,%ebx - movl %eax,16(%edi) - adcl %ebp,%ecx - movl %ebx,20(%edi) - adcl %esi,%edx - movl %ecx,24(%edi) - movl %edx,28(%edi) - ret -.size _ecp_nistz256_mul_mont,.-_ecp_nistz256_mul_mont -.globl GFp_nistz256_point_double -.hidden GFp_nistz256_point_double -.type GFp_nistz256_point_double,@function -.align 16 -GFp_nistz256_point_double: -.L_GFp_nistz256_point_double_begin: - pushl %ebp - pushl %ebx - pushl %esi - pushl %edi - movl 24(%esp),%esi - subl $164,%esp - call _picup_eax -.L002pic: - leal GFp_ia32cap_P-.L002pic(%eax),%edx - movl (%edx),%ebp -.Lpoint_double_shortcut: - movl (%esi),%eax - movl 4(%esi),%ebx - movl 8(%esi),%ecx - movl 12(%esi),%edx - movl %eax,96(%esp) - movl %ebx,100(%esp) - movl %ecx,104(%esp) - movl %edx,108(%esp) - movl 16(%esi),%eax - movl 20(%esi),%ebx - movl 24(%esi),%ecx - movl 28(%esi),%edx - movl %eax,112(%esp) - movl %ebx,116(%esp) - movl %ecx,120(%esp) - movl %edx,124(%esp) - movl %ebp,160(%esp) - leal 32(%esi),%ebp - leal 32(%esi),%esi - leal (%esp),%edi - call _ecp_nistz256_add - movl 160(%esp),%eax - movl $64,%esi - addl 188(%esp),%esi - leal 64(%esp),%edi - movl %esi,%ebp - call _ecp_nistz256_mul_mont - movl 160(%esp),%eax - leal (%esp),%esi - leal (%esp),%ebp - leal (%esp),%edi - call _ecp_nistz256_mul_mont - movl 160(%esp),%eax - movl 188(%esp),%ebp - leal 32(%ebp),%esi - leal 64(%ebp),%ebp - leal 128(%esp),%edi - call _ecp_nistz256_mul_mont - leal 96(%esp),%esi - leal 64(%esp),%ebp - leal 32(%esp),%edi - call _ecp_nistz256_add - movl $64,%edi - leal 128(%esp),%esi - leal 128(%esp),%ebp - addl 184(%esp),%edi - call _ecp_nistz256_add - leal 96(%esp),%esi - leal 64(%esp),%ebp - leal 64(%esp),%edi - call _ecp_nistz256_sub - movl 160(%esp),%eax - leal (%esp),%esi - leal (%esp),%ebp - leal 128(%esp),%edi - call _ecp_nistz256_mul_mont - movl 160(%esp),%eax - leal 32(%esp),%esi - leal 64(%esp),%ebp - leal 32(%esp),%edi - call _ecp_nistz256_mul_mont - movl $32,%edi - leal 128(%esp),%esi - addl 184(%esp),%edi - call _ecp_nistz256_div_by_2 - leal 32(%esp),%esi - leal 32(%esp),%ebp - leal 128(%esp),%edi - call _ecp_nistz256_add - movl 160(%esp),%eax - leal 96(%esp),%esi - leal (%esp),%ebp - leal (%esp),%edi - call _ecp_nistz256_mul_mont - leal 128(%esp),%esi - leal 32(%esp),%ebp - leal 32(%esp),%edi - call _ecp_nistz256_add - leal (%esp),%esi - leal (%esp),%ebp - leal 128(%esp),%edi - call _ecp_nistz256_add - movl 160(%esp),%eax - leal 32(%esp),%esi - leal 32(%esp),%ebp - movl 184(%esp),%edi - call _ecp_nistz256_mul_mont - movl %edi,%esi - leal 128(%esp),%ebp - call _ecp_nistz256_sub - leal (%esp),%esi - movl %edi,%ebp - leal (%esp),%edi - call _ecp_nistz256_sub - movl 160(%esp),%eax - movl %edi,%esi - leal 32(%esp),%ebp - call _ecp_nistz256_mul_mont - movl $32,%ebp - leal (%esp),%esi - addl 184(%esp),%ebp - movl %ebp,%edi - call _ecp_nistz256_sub - addl $164,%esp - popl %edi - popl %esi - popl %ebx - popl %ebp - ret -.size GFp_nistz256_point_double,.-.L_GFp_nistz256_point_double_begin -.globl GFp_nistz256_point_add_affine -.hidden GFp_nistz256_point_add_affine -.type GFp_nistz256_point_add_affine,@function -.align 16 -GFp_nistz256_point_add_affine: -.L_GFp_nistz256_point_add_affine_begin: - pushl %ebp - pushl %ebx - pushl %esi - pushl %edi - movl 24(%esp),%esi - subl $492,%esp - call _picup_eax -.L003pic: - leal GFp_ia32cap_P-.L003pic(%eax),%edx - movl (%edx),%ebp - leal 96(%esp),%edi - movl (%esi),%eax - movl 4(%esi),%ebx - movl 8(%esi),%ecx - movl 12(%esi),%edx - movl %eax,(%edi) - movl %ebp,488(%esp) - movl %ebx,4(%edi) - movl %ecx,8(%edi) - movl %edx,12(%edi) - movl 16(%esi),%eax - movl 20(%esi),%ebx - movl 24(%esi),%ecx - movl 28(%esi),%edx - movl %eax,16(%edi) - movl %ebx,20(%edi) - movl %ecx,24(%edi) - movl %edx,28(%edi) - movl 32(%esi),%eax - movl 36(%esi),%ebx - movl 40(%esi),%ecx - movl 44(%esi),%edx - movl %eax,32(%edi) - movl %ebx,36(%edi) - movl %ecx,40(%edi) - movl %edx,44(%edi) - movl 48(%esi),%eax - movl 52(%esi),%ebx - movl 56(%esi),%ecx - movl 60(%esi),%edx - movl %eax,48(%edi) - movl %ebx,52(%edi) - movl %ecx,56(%edi) - movl %edx,60(%edi) - movl 64(%esi),%eax - movl 68(%esi),%ebx - movl 72(%esi),%ecx - movl 76(%esi),%edx - movl %eax,64(%edi) - movl %eax,%ebp - movl %ebx,68(%edi) - orl %ebx,%ebp - movl %ecx,72(%edi) - orl %ecx,%ebp - movl %edx,76(%edi) - orl %edx,%ebp - movl 80(%esi),%eax - movl 84(%esi),%ebx - movl 88(%esi),%ecx - movl 92(%esi),%edx - movl %eax,80(%edi) - orl %eax,%ebp - movl %ebx,84(%edi) - orl %ebx,%ebp - movl %ecx,88(%edi) - orl %ecx,%ebp - movl %edx,92(%edi) - orl %edx,%ebp - xorl %eax,%eax - movl 520(%esp),%esi - subl %ebp,%eax - orl %eax,%ebp - sarl $31,%ebp - movl %ebp,480(%esp) - leal 192(%esp),%edi - movl (%esi),%eax - movl 4(%esi),%ebx - movl 8(%esi),%ecx - movl 12(%esi),%edx - movl %eax,(%edi) - movl %eax,%ebp - movl %ebx,4(%edi) - orl %ebx,%ebp - movl %ecx,8(%edi) - orl %ecx,%ebp - movl %edx,12(%edi) - orl %edx,%ebp - movl 16(%esi),%eax - movl 20(%esi),%ebx - movl 24(%esi),%ecx - movl 28(%esi),%edx - movl %eax,16(%edi) - orl %eax,%ebp - movl %ebx,20(%edi) - orl %ebx,%ebp - movl %ecx,24(%edi) - orl %ecx,%ebp - movl %edx,28(%edi) - orl %edx,%ebp - movl 32(%esi),%eax - movl 36(%esi),%ebx - movl 40(%esi),%ecx - movl 44(%esi),%edx - movl %eax,32(%edi) - orl %eax,%ebp - movl %ebx,36(%edi) - orl %ebx,%ebp - movl %ecx,40(%edi) - orl %ecx,%ebp - movl %edx,44(%edi) - orl %edx,%ebp - movl 48(%esi),%eax - movl 52(%esi),%ebx - movl 56(%esi),%ecx - movl 60(%esi),%edx - movl %eax,48(%edi) - orl %eax,%ebp - movl %ebx,52(%edi) - orl %ebx,%ebp - movl %ecx,56(%edi) - orl %ecx,%ebp - movl %edx,60(%edi) - orl %edx,%ebp - xorl %ebx,%ebx - movl 488(%esp),%eax - subl %ebp,%ebx - leal 160(%esp),%esi - orl %ebp,%ebx - leal 160(%esp),%ebp - sarl $31,%ebx - leal 288(%esp),%edi - movl %ebx,484(%esp) - call _ecp_nistz256_mul_mont - movl 488(%esp),%eax - leal 192(%esp),%esi - movl %edi,%ebp - leal 256(%esp),%edi - call _ecp_nistz256_mul_mont - movl 488(%esp),%eax - leal 160(%esp),%esi - leal 288(%esp),%ebp - leal 288(%esp),%edi - call _ecp_nistz256_mul_mont - leal 256(%esp),%esi - leal 96(%esp),%ebp - leal 320(%esp),%edi - call _ecp_nistz256_sub - movl 488(%esp),%eax - leal 224(%esp),%esi - leal 288(%esp),%ebp - leal 288(%esp),%edi - call _ecp_nistz256_mul_mont - movl 488(%esp),%eax - leal 160(%esp),%esi - leal 320(%esp),%ebp - leal 64(%esp),%edi - call _ecp_nistz256_mul_mont - leal 288(%esp),%esi - leal 128(%esp),%ebp - leal 352(%esp),%edi - call _ecp_nistz256_sub - movl 488(%esp),%eax - leal 320(%esp),%esi - leal 320(%esp),%ebp - leal 384(%esp),%edi - call _ecp_nistz256_mul_mont - movl 488(%esp),%eax - leal 352(%esp),%esi - leal 352(%esp),%ebp - leal 448(%esp),%edi - call _ecp_nistz256_mul_mont - movl 488(%esp),%eax - leal 96(%esp),%esi - leal 384(%esp),%ebp - leal 256(%esp),%edi - call _ecp_nistz256_mul_mont - movl 488(%esp),%eax - leal 320(%esp),%esi - leal 384(%esp),%ebp - leal 416(%esp),%edi - call _ecp_nistz256_mul_mont - leal 256(%esp),%esi - leal 256(%esp),%ebp - leal 384(%esp),%edi - call _ecp_nistz256_add - leal 448(%esp),%esi - leal 384(%esp),%ebp - leal (%esp),%edi - call _ecp_nistz256_sub - leal (%esp),%esi - leal 416(%esp),%ebp - leal (%esp),%edi - call _ecp_nistz256_sub - leal 256(%esp),%esi - leal (%esp),%ebp - leal 32(%esp),%edi - call _ecp_nistz256_sub - movl 488(%esp),%eax - leal 416(%esp),%esi - leal 128(%esp),%ebp - leal 288(%esp),%edi - call _ecp_nistz256_mul_mont - movl 488(%esp),%eax - leal 352(%esp),%esi - leal 32(%esp),%ebp - leal 32(%esp),%edi - call _ecp_nistz256_mul_mont - leal 32(%esp),%esi - leal 288(%esp),%ebp - leal 32(%esp),%edi - call _ecp_nistz256_sub - movl 480(%esp),%ebp - movl 484(%esp),%esi - movl 512(%esp),%edi - movl %ebp,%edx - notl %ebp - andl %esi,%edx - andl %esi,%ebp - notl %esi - movl %edx,%eax - andl 64(%esp),%eax - movl %ebp,%ebx - andl $1,%ebx - movl %esi,%ecx - andl 160(%esp),%ecx - orl %ebx,%eax - orl %ecx,%eax - movl %eax,64(%edi) - movl %edx,%eax - andl 68(%esp),%eax - movl %esi,%ecx - andl 164(%esp),%ecx - orl %ecx,%eax - movl %eax,68(%edi) - movl %edx,%eax - andl 72(%esp),%eax - movl %esi,%ecx - andl 168(%esp),%ecx - orl %ecx,%eax - movl %eax,72(%edi) - movl %edx,%eax - andl 76(%esp),%eax - movl %esi,%ecx - andl 172(%esp),%ecx - orl %ebp,%eax - orl %ecx,%eax - movl %eax,76(%edi) - movl %edx,%eax - andl 80(%esp),%eax - movl %esi,%ecx - andl 176(%esp),%ecx - orl %ebp,%eax - orl %ecx,%eax - movl %eax,80(%edi) - movl %edx,%eax - andl 84(%esp),%eax - movl %esi,%ecx - andl 180(%esp),%ecx - orl %ebp,%eax - orl %ecx,%eax - movl %eax,84(%edi) - movl %edx,%eax - andl 88(%esp),%eax - movl %ebp,%ebx - andl $-2,%ebx - movl %esi,%ecx - andl 184(%esp),%ecx - orl %ebx,%eax - orl %ecx,%eax - movl %eax,88(%edi) - movl %edx,%eax - andl 92(%esp),%eax - movl %esi,%ecx - andl 188(%esp),%ecx - orl %ecx,%eax - movl %eax,92(%edi) - movl %edx,%eax - andl (%esp),%eax - movl %ebp,%ebx - andl 192(%esp),%ebx - movl %esi,%ecx - andl 96(%esp),%ecx - orl %ebx,%eax - orl %ecx,%eax - movl %eax,(%edi) - movl %edx,%eax - andl 4(%esp),%eax - movl %ebp,%ebx - andl 196(%esp),%ebx - movl %esi,%ecx - andl 100(%esp),%ecx - orl %ebx,%eax - orl %ecx,%eax - movl %eax,4(%edi) - movl %edx,%eax - andl 8(%esp),%eax - movl %ebp,%ebx - andl 200(%esp),%ebx - movl %esi,%ecx - andl 104(%esp),%ecx - orl %ebx,%eax - orl %ecx,%eax - movl %eax,8(%edi) - movl %edx,%eax - andl 12(%esp),%eax - movl %ebp,%ebx - andl 204(%esp),%ebx - movl %esi,%ecx - andl 108(%esp),%ecx - orl %ebx,%eax - orl %ecx,%eax - movl %eax,12(%edi) - movl %edx,%eax - andl 16(%esp),%eax - movl %ebp,%ebx - andl 208(%esp),%ebx - movl %esi,%ecx - andl 112(%esp),%ecx - orl %ebx,%eax - orl %ecx,%eax - movl %eax,16(%edi) - movl %edx,%eax - andl 20(%esp),%eax - movl %ebp,%ebx - andl 212(%esp),%ebx - movl %esi,%ecx - andl 116(%esp),%ecx - orl %ebx,%eax - orl %ecx,%eax - movl %eax,20(%edi) - movl %edx,%eax - andl 24(%esp),%eax - movl %ebp,%ebx - andl 216(%esp),%ebx - movl %esi,%ecx - andl 120(%esp),%ecx - orl %ebx,%eax - orl %ecx,%eax - movl %eax,24(%edi) - movl %edx,%eax - andl 28(%esp),%eax - movl %ebp,%ebx - andl 220(%esp),%ebx - movl %esi,%ecx - andl 124(%esp),%ecx - orl %ebx,%eax - orl %ecx,%eax - movl %eax,28(%edi) - movl %edx,%eax - andl 32(%esp),%eax - movl %ebp,%ebx - andl 224(%esp),%ebx - movl %esi,%ecx - andl 128(%esp),%ecx - orl %ebx,%eax - orl %ecx,%eax - movl %eax,32(%edi) - movl %edx,%eax - andl 36(%esp),%eax - movl %ebp,%ebx - andl 228(%esp),%ebx - movl %esi,%ecx - andl 132(%esp),%ecx - orl %ebx,%eax - orl %ecx,%eax - movl %eax,36(%edi) - movl %edx,%eax - andl 40(%esp),%eax - movl %ebp,%ebx - andl 232(%esp),%ebx - movl %esi,%ecx - andl 136(%esp),%ecx - orl %ebx,%eax - orl %ecx,%eax - movl %eax,40(%edi) - movl %edx,%eax - andl 44(%esp),%eax - movl %ebp,%ebx - andl 236(%esp),%ebx - movl %esi,%ecx - andl 140(%esp),%ecx - orl %ebx,%eax - orl %ecx,%eax - movl %eax,44(%edi) - movl %edx,%eax - andl 48(%esp),%eax - movl %ebp,%ebx - andl 240(%esp),%ebx - movl %esi,%ecx - andl 144(%esp),%ecx - orl %ebx,%eax - orl %ecx,%eax - movl %eax,48(%edi) - movl %edx,%eax - andl 52(%esp),%eax - movl %ebp,%ebx - andl 244(%esp),%ebx - movl %esi,%ecx - andl 148(%esp),%ecx - orl %ebx,%eax - orl %ecx,%eax - movl %eax,52(%edi) - movl %edx,%eax - andl 56(%esp),%eax - movl %ebp,%ebx - andl 248(%esp),%ebx - movl %esi,%ecx - andl 152(%esp),%ecx - orl %ebx,%eax - orl %ecx,%eax - movl %eax,56(%edi) - movl %edx,%eax - andl 60(%esp),%eax - movl %ebp,%ebx - andl 252(%esp),%ebx - movl %esi,%ecx - andl 156(%esp),%ecx - orl %ebx,%eax - orl %ecx,%eax - movl %eax,60(%edi) - addl $492,%esp - popl %edi - popl %esi - popl %ebx - popl %ebp - ret -.size GFp_nistz256_point_add_affine,.-.L_GFp_nistz256_point_add_affine_begin -#endif -.section .note.GNU-stack,"",@progbits diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ecp_nistz256-x86-macosx.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ecp_nistz256-x86-macosx.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ecp_nistz256-x86-macosx.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ecp_nistz256-x86-macosx.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,1111 +0,0 @@ -# This file is generated from a similarly-named Perl script in the BoringSSL -# source tree. Do not edit by hand. - -#if defined(__i386__) -#if defined(BORINGSSL_PREFIX) -#include -#endif -.text -LONE_mont: -.long 1,0,0,-1,-1,-1,-2,0 -.private_extern __ecp_nistz256_div_by_2 -.align 4 -__ecp_nistz256_div_by_2: - movl (%esi),%ebp - xorl %edx,%edx - movl 4(%esi),%ebx - movl %ebp,%eax - andl $1,%ebp - movl 8(%esi),%ecx - subl %ebp,%edx - addl %edx,%eax - adcl %edx,%ebx - movl %eax,(%edi) - adcl %edx,%ecx - movl %ebx,4(%edi) - movl %ecx,8(%edi) - movl 12(%esi),%eax - movl 16(%esi),%ebx - adcl $0,%eax - movl 20(%esi),%ecx - adcl $0,%ebx - movl %eax,12(%edi) - adcl $0,%ecx - movl %ebx,16(%edi) - movl %ecx,20(%edi) - movl 24(%esi),%eax - movl 28(%esi),%ebx - adcl %ebp,%eax - adcl %edx,%ebx - movl %eax,24(%edi) - sbbl %esi,%esi - movl %ebx,28(%edi) - movl (%edi),%eax - movl 4(%edi),%ebx - movl 8(%edi),%ecx - movl 12(%edi),%edx - shrl $1,%eax - movl %ebx,%ebp - shll $31,%ebx - orl %ebx,%eax - shrl $1,%ebp - movl %ecx,%ebx - shll $31,%ecx - movl %eax,(%edi) - orl %ecx,%ebp - movl 16(%edi),%eax - shrl $1,%ebx - movl %edx,%ecx - shll $31,%edx - movl %ebp,4(%edi) - orl %edx,%ebx - movl 20(%edi),%ebp - shrl $1,%ecx - movl %eax,%edx - shll $31,%eax - movl %ebx,8(%edi) - orl %eax,%ecx - movl 24(%edi),%ebx - shrl $1,%edx - movl %ebp,%eax - shll $31,%ebp - movl %ecx,12(%edi) - orl %ebp,%edx - movl 28(%edi),%ecx - shrl $1,%eax - movl %ebx,%ebp - shll $31,%ebx - movl %edx,16(%edi) - orl %ebx,%eax - shrl $1,%ebp - movl %ecx,%ebx - shll $31,%ecx - movl %eax,20(%edi) - orl %ecx,%ebp - shrl $1,%ebx - shll $31,%esi - movl %ebp,24(%edi) - orl %esi,%ebx - movl %ebx,28(%edi) - ret -.globl _GFp_nistz256_add -.private_extern _GFp_nistz256_add -.align 4 -_GFp_nistz256_add: -L_GFp_nistz256_add_begin: - pushl %ebp - pushl %ebx - pushl %esi - pushl %edi - movl 24(%esp),%esi - movl 28(%esp),%ebp - movl 20(%esp),%edi - call __ecp_nistz256_add - popl %edi - popl %esi - popl %ebx - popl %ebp - ret -.private_extern __ecp_nistz256_add -.align 4 -__ecp_nistz256_add: - movl (%esi),%eax - movl 4(%esi),%ebx - movl 8(%esi),%ecx - addl (%ebp),%eax - movl 12(%esi),%edx - adcl 4(%ebp),%ebx - movl %eax,(%edi) - adcl 8(%ebp),%ecx - movl %ebx,4(%edi) - adcl 12(%ebp),%edx - movl %ecx,8(%edi) - movl %edx,12(%edi) - movl 16(%esi),%eax - movl 20(%esi),%ebx - movl 24(%esi),%ecx - adcl 16(%ebp),%eax - movl 28(%esi),%edx - adcl 20(%ebp),%ebx - movl %eax,16(%edi) - adcl 24(%ebp),%ecx - movl %ebx,20(%edi) - movl $0,%esi - adcl 28(%ebp),%edx - movl %ecx,24(%edi) - adcl $0,%esi - movl %edx,28(%edi) - movl (%edi),%eax - movl 4(%edi),%ebx - movl 8(%edi),%ecx - subl $-1,%eax - movl 12(%edi),%edx - sbbl $-1,%ebx - movl 16(%edi),%eax - sbbl $-1,%ecx - movl 20(%edi),%ebx - sbbl $0,%edx - movl 24(%edi),%ecx - sbbl $0,%eax - movl 28(%edi),%edx - sbbl $0,%ebx - sbbl $1,%ecx - sbbl $-1,%edx - sbbl $0,%esi - notl %esi - movl (%edi),%eax - movl %esi,%ebp - movl 4(%edi),%ebx - shrl $31,%ebp - movl 8(%edi),%ecx - subl %esi,%eax - movl 12(%edi),%edx - sbbl %esi,%ebx - movl %eax,(%edi) - sbbl %esi,%ecx - movl %ebx,4(%edi) - sbbl $0,%edx - movl %ecx,8(%edi) - movl %edx,12(%edi) - movl 16(%edi),%eax - movl 20(%edi),%ebx - movl 24(%edi),%ecx - sbbl $0,%eax - movl 28(%edi),%edx - sbbl $0,%ebx - movl %eax,16(%edi) - sbbl %ebp,%ecx - movl %ebx,20(%edi) - sbbl %esi,%edx - movl %ecx,24(%edi) - movl %edx,28(%edi) - ret -.private_extern __ecp_nistz256_sub -.align 4 -__ecp_nistz256_sub: - movl (%esi),%eax - movl 4(%esi),%ebx - movl 8(%esi),%ecx - subl (%ebp),%eax - movl 12(%esi),%edx - sbbl 4(%ebp),%ebx - movl %eax,(%edi) - sbbl 8(%ebp),%ecx - movl %ebx,4(%edi) - sbbl 12(%ebp),%edx - movl %ecx,8(%edi) - movl %edx,12(%edi) - movl 16(%esi),%eax - movl 20(%esi),%ebx - movl 24(%esi),%ecx - sbbl 16(%ebp),%eax - movl 28(%esi),%edx - sbbl 20(%ebp),%ebx - sbbl 24(%ebp),%ecx - movl %eax,16(%edi) - sbbl 28(%ebp),%edx - movl %ebx,20(%edi) - sbbl %esi,%esi - movl %ecx,24(%edi) - movl %edx,28(%edi) - movl (%edi),%eax - movl %esi,%ebp - movl 4(%edi),%ebx - shrl $31,%ebp - movl 8(%edi),%ecx - addl %esi,%eax - movl 12(%edi),%edx - adcl %esi,%ebx - movl %eax,(%edi) - adcl %esi,%ecx - movl %ebx,4(%edi) - adcl $0,%edx - movl %ecx,8(%edi) - movl %edx,12(%edi) - movl 16(%edi),%eax - movl 20(%edi),%ebx - movl 24(%edi),%ecx - adcl $0,%eax - movl 28(%edi),%edx - adcl $0,%ebx - movl %eax,16(%edi) - adcl %ebp,%ecx - movl %ebx,20(%edi) - adcl %esi,%edx - movl %ecx,24(%edi) - movl %edx,28(%edi) - ret -.globl _GFp_nistz256_neg -.private_extern _GFp_nistz256_neg -.align 4 -_GFp_nistz256_neg: -L_GFp_nistz256_neg_begin: - pushl %ebp - pushl %ebx - pushl %esi - pushl %edi - movl 24(%esp),%ebp - movl 20(%esp),%edi - xorl %eax,%eax - subl $32,%esp - movl %eax,(%esp) - movl %esp,%esi - movl %eax,4(%esp) - movl %eax,8(%esp) - movl %eax,12(%esp) - movl %eax,16(%esp) - movl %eax,20(%esp) - movl %eax,24(%esp) - movl %eax,28(%esp) - call __ecp_nistz256_sub - addl $32,%esp - popl %edi - popl %esi - popl %ebx - popl %ebp - ret -.private_extern __picup_eax -.align 4 -__picup_eax: - movl (%esp),%eax - ret -.globl _GFp_nistz256_mul_mont -.private_extern _GFp_nistz256_mul_mont -.align 4 -_GFp_nistz256_mul_mont: -L_GFp_nistz256_mul_mont_begin: - pushl %ebp - pushl %ebx - pushl %esi - pushl %edi - movl 24(%esp),%esi - movl 28(%esp),%ebp - call __picup_eax -L000pic: - movl L_GFp_ia32cap_P$non_lazy_ptr-L000pic(%eax),%eax - movl (%eax),%eax - movl 20(%esp),%edi - call __ecp_nistz256_mul_mont - popl %edi - popl %esi - popl %ebx - popl %ebp - ret -.private_extern __ecp_nistz256_mul_mont -.align 4 -__ecp_nistz256_mul_mont: - movl %esp,%edx - subl $256,%esp - movd (%ebp),%xmm7 - leal 4(%ebp),%ebp - pcmpeqd %xmm6,%xmm6 - psrlq $48,%xmm6 - pshuflw $220,%xmm7,%xmm7 - andl $-64,%esp - pshufd $220,%xmm7,%xmm7 - leal 128(%esp),%ebx - movd (%esi),%xmm0 - pshufd $204,%xmm0,%xmm0 - movd 4(%esi),%xmm1 - movdqa %xmm0,(%ebx) - pmuludq %xmm7,%xmm0 - movd 8(%esi),%xmm2 - pshufd $204,%xmm1,%xmm1 - movdqa %xmm1,16(%ebx) - pmuludq %xmm7,%xmm1 - movq %xmm0,%xmm4 - pslldq $6,%xmm4 - paddq %xmm0,%xmm4 - movdqa %xmm4,%xmm5 - psrldq $10,%xmm4 - pand %xmm6,%xmm5 - movd 12(%esi),%xmm3 - pshufd $204,%xmm2,%xmm2 - movdqa %xmm2,32(%ebx) - pmuludq %xmm7,%xmm2 - paddq %xmm4,%xmm1 - movdqa %xmm1,(%esp) - movd 16(%esi),%xmm0 - pshufd $204,%xmm3,%xmm3 - movdqa %xmm3,48(%ebx) - pmuludq %xmm7,%xmm3 - movdqa %xmm2,16(%esp) - movd 20(%esi),%xmm1 - pshufd $204,%xmm0,%xmm0 - movdqa %xmm0,64(%ebx) - pmuludq %xmm7,%xmm0 - paddq %xmm5,%xmm3 - movdqa %xmm3,32(%esp) - movd 24(%esi),%xmm2 - pshufd $204,%xmm1,%xmm1 - movdqa %xmm1,80(%ebx) - pmuludq %xmm7,%xmm1 - movdqa %xmm0,48(%esp) - pshufd $177,%xmm5,%xmm4 - movd 28(%esi),%xmm3 - pshufd $204,%xmm2,%xmm2 - movdqa %xmm2,96(%ebx) - pmuludq %xmm7,%xmm2 - movdqa %xmm1,64(%esp) - psubq %xmm5,%xmm4 - movd (%ebp),%xmm0 - pshufd $204,%xmm3,%xmm3 - movdqa %xmm3,112(%ebx) - pmuludq %xmm7,%xmm3 - pshuflw $220,%xmm0,%xmm7 - movdqa (%ebx),%xmm0 - pshufd $220,%xmm7,%xmm7 - movl $6,%ecx - leal 4(%ebp),%ebp - jmp L001madd_sse2 -.align 4,0x90 -L001madd_sse2: - paddq %xmm5,%xmm2 - paddq %xmm4,%xmm3 - movdqa 16(%ebx),%xmm1 - pmuludq %xmm7,%xmm0 - movdqa %xmm2,80(%esp) - movdqa 32(%ebx),%xmm2 - pmuludq %xmm7,%xmm1 - movdqa %xmm3,96(%esp) - paddq (%esp),%xmm0 - movdqa 48(%ebx),%xmm3 - pmuludq %xmm7,%xmm2 - movq %xmm0,%xmm4 - pslldq $6,%xmm4 - paddq 16(%esp),%xmm1 - paddq %xmm0,%xmm4 - movdqa %xmm4,%xmm5 - psrldq $10,%xmm4 - movdqa 64(%ebx),%xmm0 - pmuludq %xmm7,%xmm3 - paddq %xmm4,%xmm1 - paddq 32(%esp),%xmm2 - movdqa %xmm1,(%esp) - movdqa 80(%ebx),%xmm1 - pmuludq %xmm7,%xmm0 - paddq 48(%esp),%xmm3 - movdqa %xmm2,16(%esp) - pand %xmm6,%xmm5 - movdqa 96(%ebx),%xmm2 - pmuludq %xmm7,%xmm1 - paddq %xmm5,%xmm3 - paddq 64(%esp),%xmm0 - movdqa %xmm3,32(%esp) - pshufd $177,%xmm5,%xmm4 - movdqa %xmm7,%xmm3 - pmuludq %xmm7,%xmm2 - movd (%ebp),%xmm7 - leal 4(%ebp),%ebp - paddq 80(%esp),%xmm1 - psubq %xmm5,%xmm4 - movdqa %xmm0,48(%esp) - pshuflw $220,%xmm7,%xmm7 - pmuludq 112(%ebx),%xmm3 - pshufd $220,%xmm7,%xmm7 - movdqa (%ebx),%xmm0 - movdqa %xmm1,64(%esp) - paddq 96(%esp),%xmm2 - decl %ecx - jnz L001madd_sse2 - paddq %xmm5,%xmm2 - paddq %xmm4,%xmm3 - movdqa 16(%ebx),%xmm1 - pmuludq %xmm7,%xmm0 - movdqa %xmm2,80(%esp) - movdqa 32(%ebx),%xmm2 - pmuludq %xmm7,%xmm1 - movdqa %xmm3,96(%esp) - paddq (%esp),%xmm0 - movdqa 48(%ebx),%xmm3 - pmuludq %xmm7,%xmm2 - movq %xmm0,%xmm4 - pslldq $6,%xmm4 - paddq 16(%esp),%xmm1 - paddq %xmm0,%xmm4 - movdqa %xmm4,%xmm5 - psrldq $10,%xmm4 - movdqa 64(%ebx),%xmm0 - pmuludq %xmm7,%xmm3 - paddq %xmm4,%xmm1 - paddq 32(%esp),%xmm2 - movdqa %xmm1,(%esp) - movdqa 80(%ebx),%xmm1 - pmuludq %xmm7,%xmm0 - paddq 48(%esp),%xmm3 - movdqa %xmm2,16(%esp) - pand %xmm6,%xmm5 - movdqa 96(%ebx),%xmm2 - pmuludq %xmm7,%xmm1 - paddq %xmm5,%xmm3 - paddq 64(%esp),%xmm0 - movdqa %xmm3,32(%esp) - pshufd $177,%xmm5,%xmm4 - movdqa 112(%ebx),%xmm3 - pmuludq %xmm7,%xmm2 - paddq 80(%esp),%xmm1 - psubq %xmm5,%xmm4 - movdqa %xmm0,48(%esp) - pmuludq %xmm7,%xmm3 - pcmpeqd %xmm7,%xmm7 - movdqa (%esp),%xmm0 - pslldq $8,%xmm7 - movdqa %xmm1,64(%esp) - paddq 96(%esp),%xmm2 - paddq %xmm5,%xmm2 - paddq %xmm4,%xmm3 - movdqa %xmm2,80(%esp) - movdqa %xmm3,96(%esp) - movdqa 16(%esp),%xmm1 - movdqa 32(%esp),%xmm2 - movdqa 48(%esp),%xmm3 - movq %xmm0,%xmm4 - pand %xmm7,%xmm0 - xorl %ebp,%ebp - pslldq $6,%xmm4 - movq %xmm1,%xmm5 - paddq %xmm4,%xmm0 - pand %xmm7,%xmm1 - psrldq $6,%xmm0 - movd %xmm0,%eax - psrldq $4,%xmm0 - paddq %xmm0,%xmm5 - movdqa 64(%esp),%xmm0 - subl $-1,%eax - pslldq $6,%xmm5 - movq %xmm2,%xmm4 - paddq %xmm5,%xmm1 - pand %xmm7,%xmm2 - psrldq $6,%xmm1 - movl %eax,(%edi) - movd %xmm1,%eax - psrldq $4,%xmm1 - paddq %xmm1,%xmm4 - movdqa 80(%esp),%xmm1 - sbbl $-1,%eax - pslldq $6,%xmm4 - movq %xmm3,%xmm5 - paddq %xmm4,%xmm2 - pand %xmm7,%xmm3 - psrldq $6,%xmm2 - movl %eax,4(%edi) - movd %xmm2,%eax - psrldq $4,%xmm2 - paddq %xmm2,%xmm5 - movdqa 96(%esp),%xmm2 - sbbl $-1,%eax - pslldq $6,%xmm5 - movq %xmm0,%xmm4 - paddq %xmm5,%xmm3 - pand %xmm7,%xmm0 - psrldq $6,%xmm3 - movl %eax,8(%edi) - movd %xmm3,%eax - psrldq $4,%xmm3 - paddq %xmm3,%xmm4 - sbbl $0,%eax - pslldq $6,%xmm4 - movq %xmm1,%xmm5 - paddq %xmm4,%xmm0 - pand %xmm7,%xmm1 - psrldq $6,%xmm0 - movl %eax,12(%edi) - movd %xmm0,%eax - psrldq $4,%xmm0 - paddq %xmm0,%xmm5 - sbbl $0,%eax - pslldq $6,%xmm5 - movq %xmm2,%xmm4 - paddq %xmm5,%xmm1 - pand %xmm7,%xmm2 - psrldq $6,%xmm1 - movd %xmm1,%ebx - psrldq $4,%xmm1 - movl %edx,%esp - paddq %xmm1,%xmm4 - pslldq $6,%xmm4 - paddq %xmm4,%xmm2 - psrldq $6,%xmm2 - movd %xmm2,%ecx - psrldq $4,%xmm2 - sbbl $0,%ebx - movd %xmm2,%edx - pextrw $2,%xmm2,%esi - sbbl $1,%ecx - sbbl $-1,%edx - sbbl $0,%esi - subl %esi,%ebp - addl %esi,(%edi) - adcl %esi,4(%edi) - adcl %esi,8(%edi) - adcl $0,12(%edi) - adcl $0,%eax - adcl $0,%ebx - movl %eax,16(%edi) - adcl %ebp,%ecx - movl %ebx,20(%edi) - adcl %esi,%edx - movl %ecx,24(%edi) - movl %edx,28(%edi) - ret -.globl _GFp_nistz256_point_double -.private_extern _GFp_nistz256_point_double -.align 4 -_GFp_nistz256_point_double: -L_GFp_nistz256_point_double_begin: - pushl %ebp - pushl %ebx - pushl %esi - pushl %edi - movl 24(%esp),%esi - subl $164,%esp - call __picup_eax -L002pic: - movl L_GFp_ia32cap_P$non_lazy_ptr-L002pic(%eax),%edx - movl (%edx),%ebp -Lpoint_double_shortcut: - movl (%esi),%eax - movl 4(%esi),%ebx - movl 8(%esi),%ecx - movl 12(%esi),%edx - movl %eax,96(%esp) - movl %ebx,100(%esp) - movl %ecx,104(%esp) - movl %edx,108(%esp) - movl 16(%esi),%eax - movl 20(%esi),%ebx - movl 24(%esi),%ecx - movl 28(%esi),%edx - movl %eax,112(%esp) - movl %ebx,116(%esp) - movl %ecx,120(%esp) - movl %edx,124(%esp) - movl %ebp,160(%esp) - leal 32(%esi),%ebp - leal 32(%esi),%esi - leal (%esp),%edi - call __ecp_nistz256_add - movl 160(%esp),%eax - movl $64,%esi - addl 188(%esp),%esi - leal 64(%esp),%edi - movl %esi,%ebp - call __ecp_nistz256_mul_mont - movl 160(%esp),%eax - leal (%esp),%esi - leal (%esp),%ebp - leal (%esp),%edi - call __ecp_nistz256_mul_mont - movl 160(%esp),%eax - movl 188(%esp),%ebp - leal 32(%ebp),%esi - leal 64(%ebp),%ebp - leal 128(%esp),%edi - call __ecp_nistz256_mul_mont - leal 96(%esp),%esi - leal 64(%esp),%ebp - leal 32(%esp),%edi - call __ecp_nistz256_add - movl $64,%edi - leal 128(%esp),%esi - leal 128(%esp),%ebp - addl 184(%esp),%edi - call __ecp_nistz256_add - leal 96(%esp),%esi - leal 64(%esp),%ebp - leal 64(%esp),%edi - call __ecp_nistz256_sub - movl 160(%esp),%eax - leal (%esp),%esi - leal (%esp),%ebp - leal 128(%esp),%edi - call __ecp_nistz256_mul_mont - movl 160(%esp),%eax - leal 32(%esp),%esi - leal 64(%esp),%ebp - leal 32(%esp),%edi - call __ecp_nistz256_mul_mont - movl $32,%edi - leal 128(%esp),%esi - addl 184(%esp),%edi - call __ecp_nistz256_div_by_2 - leal 32(%esp),%esi - leal 32(%esp),%ebp - leal 128(%esp),%edi - call __ecp_nistz256_add - movl 160(%esp),%eax - leal 96(%esp),%esi - leal (%esp),%ebp - leal (%esp),%edi - call __ecp_nistz256_mul_mont - leal 128(%esp),%esi - leal 32(%esp),%ebp - leal 32(%esp),%edi - call __ecp_nistz256_add - leal (%esp),%esi - leal (%esp),%ebp - leal 128(%esp),%edi - call __ecp_nistz256_add - movl 160(%esp),%eax - leal 32(%esp),%esi - leal 32(%esp),%ebp - movl 184(%esp),%edi - call __ecp_nistz256_mul_mont - movl %edi,%esi - leal 128(%esp),%ebp - call __ecp_nistz256_sub - leal (%esp),%esi - movl %edi,%ebp - leal (%esp),%edi - call __ecp_nistz256_sub - movl 160(%esp),%eax - movl %edi,%esi - leal 32(%esp),%ebp - call __ecp_nistz256_mul_mont - movl $32,%ebp - leal (%esp),%esi - addl 184(%esp),%ebp - movl %ebp,%edi - call __ecp_nistz256_sub - addl $164,%esp - popl %edi - popl %esi - popl %ebx - popl %ebp - ret -.globl _GFp_nistz256_point_add_affine -.private_extern _GFp_nistz256_point_add_affine -.align 4 -_GFp_nistz256_point_add_affine: -L_GFp_nistz256_point_add_affine_begin: - pushl %ebp - pushl %ebx - pushl %esi - pushl %edi - movl 24(%esp),%esi - subl $492,%esp - call __picup_eax -L003pic: - movl L_GFp_ia32cap_P$non_lazy_ptr-L003pic(%eax),%edx - movl (%edx),%ebp - leal 96(%esp),%edi - movl (%esi),%eax - movl 4(%esi),%ebx - movl 8(%esi),%ecx - movl 12(%esi),%edx - movl %eax,(%edi) - movl %ebp,488(%esp) - movl %ebx,4(%edi) - movl %ecx,8(%edi) - movl %edx,12(%edi) - movl 16(%esi),%eax - movl 20(%esi),%ebx - movl 24(%esi),%ecx - movl 28(%esi),%edx - movl %eax,16(%edi) - movl %ebx,20(%edi) - movl %ecx,24(%edi) - movl %edx,28(%edi) - movl 32(%esi),%eax - movl 36(%esi),%ebx - movl 40(%esi),%ecx - movl 44(%esi),%edx - movl %eax,32(%edi) - movl %ebx,36(%edi) - movl %ecx,40(%edi) - movl %edx,44(%edi) - movl 48(%esi),%eax - movl 52(%esi),%ebx - movl 56(%esi),%ecx - movl 60(%esi),%edx - movl %eax,48(%edi) - movl %ebx,52(%edi) - movl %ecx,56(%edi) - movl %edx,60(%edi) - movl 64(%esi),%eax - movl 68(%esi),%ebx - movl 72(%esi),%ecx - movl 76(%esi),%edx - movl %eax,64(%edi) - movl %eax,%ebp - movl %ebx,68(%edi) - orl %ebx,%ebp - movl %ecx,72(%edi) - orl %ecx,%ebp - movl %edx,76(%edi) - orl %edx,%ebp - movl 80(%esi),%eax - movl 84(%esi),%ebx - movl 88(%esi),%ecx - movl 92(%esi),%edx - movl %eax,80(%edi) - orl %eax,%ebp - movl %ebx,84(%edi) - orl %ebx,%ebp - movl %ecx,88(%edi) - orl %ecx,%ebp - movl %edx,92(%edi) - orl %edx,%ebp - xorl %eax,%eax - movl 520(%esp),%esi - subl %ebp,%eax - orl %eax,%ebp - sarl $31,%ebp - movl %ebp,480(%esp) - leal 192(%esp),%edi - movl (%esi),%eax - movl 4(%esi),%ebx - movl 8(%esi),%ecx - movl 12(%esi),%edx - movl %eax,(%edi) - movl %eax,%ebp - movl %ebx,4(%edi) - orl %ebx,%ebp - movl %ecx,8(%edi) - orl %ecx,%ebp - movl %edx,12(%edi) - orl %edx,%ebp - movl 16(%esi),%eax - movl 20(%esi),%ebx - movl 24(%esi),%ecx - movl 28(%esi),%edx - movl %eax,16(%edi) - orl %eax,%ebp - movl %ebx,20(%edi) - orl %ebx,%ebp - movl %ecx,24(%edi) - orl %ecx,%ebp - movl %edx,28(%edi) - orl %edx,%ebp - movl 32(%esi),%eax - movl 36(%esi),%ebx - movl 40(%esi),%ecx - movl 44(%esi),%edx - movl %eax,32(%edi) - orl %eax,%ebp - movl %ebx,36(%edi) - orl %ebx,%ebp - movl %ecx,40(%edi) - orl %ecx,%ebp - movl %edx,44(%edi) - orl %edx,%ebp - movl 48(%esi),%eax - movl 52(%esi),%ebx - movl 56(%esi),%ecx - movl 60(%esi),%edx - movl %eax,48(%edi) - orl %eax,%ebp - movl %ebx,52(%edi) - orl %ebx,%ebp - movl %ecx,56(%edi) - orl %ecx,%ebp - movl %edx,60(%edi) - orl %edx,%ebp - xorl %ebx,%ebx - movl 488(%esp),%eax - subl %ebp,%ebx - leal 160(%esp),%esi - orl %ebp,%ebx - leal 160(%esp),%ebp - sarl $31,%ebx - leal 288(%esp),%edi - movl %ebx,484(%esp) - call __ecp_nistz256_mul_mont - movl 488(%esp),%eax - leal 192(%esp),%esi - movl %edi,%ebp - leal 256(%esp),%edi - call __ecp_nistz256_mul_mont - movl 488(%esp),%eax - leal 160(%esp),%esi - leal 288(%esp),%ebp - leal 288(%esp),%edi - call __ecp_nistz256_mul_mont - leal 256(%esp),%esi - leal 96(%esp),%ebp - leal 320(%esp),%edi - call __ecp_nistz256_sub - movl 488(%esp),%eax - leal 224(%esp),%esi - leal 288(%esp),%ebp - leal 288(%esp),%edi - call __ecp_nistz256_mul_mont - movl 488(%esp),%eax - leal 160(%esp),%esi - leal 320(%esp),%ebp - leal 64(%esp),%edi - call __ecp_nistz256_mul_mont - leal 288(%esp),%esi - leal 128(%esp),%ebp - leal 352(%esp),%edi - call __ecp_nistz256_sub - movl 488(%esp),%eax - leal 320(%esp),%esi - leal 320(%esp),%ebp - leal 384(%esp),%edi - call __ecp_nistz256_mul_mont - movl 488(%esp),%eax - leal 352(%esp),%esi - leal 352(%esp),%ebp - leal 448(%esp),%edi - call __ecp_nistz256_mul_mont - movl 488(%esp),%eax - leal 96(%esp),%esi - leal 384(%esp),%ebp - leal 256(%esp),%edi - call __ecp_nistz256_mul_mont - movl 488(%esp),%eax - leal 320(%esp),%esi - leal 384(%esp),%ebp - leal 416(%esp),%edi - call __ecp_nistz256_mul_mont - leal 256(%esp),%esi - leal 256(%esp),%ebp - leal 384(%esp),%edi - call __ecp_nistz256_add - leal 448(%esp),%esi - leal 384(%esp),%ebp - leal (%esp),%edi - call __ecp_nistz256_sub - leal (%esp),%esi - leal 416(%esp),%ebp - leal (%esp),%edi - call __ecp_nistz256_sub - leal 256(%esp),%esi - leal (%esp),%ebp - leal 32(%esp),%edi - call __ecp_nistz256_sub - movl 488(%esp),%eax - leal 416(%esp),%esi - leal 128(%esp),%ebp - leal 288(%esp),%edi - call __ecp_nistz256_mul_mont - movl 488(%esp),%eax - leal 352(%esp),%esi - leal 32(%esp),%ebp - leal 32(%esp),%edi - call __ecp_nistz256_mul_mont - leal 32(%esp),%esi - leal 288(%esp),%ebp - leal 32(%esp),%edi - call __ecp_nistz256_sub - movl 480(%esp),%ebp - movl 484(%esp),%esi - movl 512(%esp),%edi - movl %ebp,%edx - notl %ebp - andl %esi,%edx - andl %esi,%ebp - notl %esi - movl %edx,%eax - andl 64(%esp),%eax - movl %ebp,%ebx - andl $1,%ebx - movl %esi,%ecx - andl 160(%esp),%ecx - orl %ebx,%eax - orl %ecx,%eax - movl %eax,64(%edi) - movl %edx,%eax - andl 68(%esp),%eax - movl %esi,%ecx - andl 164(%esp),%ecx - orl %ecx,%eax - movl %eax,68(%edi) - movl %edx,%eax - andl 72(%esp),%eax - movl %esi,%ecx - andl 168(%esp),%ecx - orl %ecx,%eax - movl %eax,72(%edi) - movl %edx,%eax - andl 76(%esp),%eax - movl %esi,%ecx - andl 172(%esp),%ecx - orl %ebp,%eax - orl %ecx,%eax - movl %eax,76(%edi) - movl %edx,%eax - andl 80(%esp),%eax - movl %esi,%ecx - andl 176(%esp),%ecx - orl %ebp,%eax - orl %ecx,%eax - movl %eax,80(%edi) - movl %edx,%eax - andl 84(%esp),%eax - movl %esi,%ecx - andl 180(%esp),%ecx - orl %ebp,%eax - orl %ecx,%eax - movl %eax,84(%edi) - movl %edx,%eax - andl 88(%esp),%eax - movl %ebp,%ebx - andl $-2,%ebx - movl %esi,%ecx - andl 184(%esp),%ecx - orl %ebx,%eax - orl %ecx,%eax - movl %eax,88(%edi) - movl %edx,%eax - andl 92(%esp),%eax - movl %esi,%ecx - andl 188(%esp),%ecx - orl %ecx,%eax - movl %eax,92(%edi) - movl %edx,%eax - andl (%esp),%eax - movl %ebp,%ebx - andl 192(%esp),%ebx - movl %esi,%ecx - andl 96(%esp),%ecx - orl %ebx,%eax - orl %ecx,%eax - movl %eax,(%edi) - movl %edx,%eax - andl 4(%esp),%eax - movl %ebp,%ebx - andl 196(%esp),%ebx - movl %esi,%ecx - andl 100(%esp),%ecx - orl %ebx,%eax - orl %ecx,%eax - movl %eax,4(%edi) - movl %edx,%eax - andl 8(%esp),%eax - movl %ebp,%ebx - andl 200(%esp),%ebx - movl %esi,%ecx - andl 104(%esp),%ecx - orl %ebx,%eax - orl %ecx,%eax - movl %eax,8(%edi) - movl %edx,%eax - andl 12(%esp),%eax - movl %ebp,%ebx - andl 204(%esp),%ebx - movl %esi,%ecx - andl 108(%esp),%ecx - orl %ebx,%eax - orl %ecx,%eax - movl %eax,12(%edi) - movl %edx,%eax - andl 16(%esp),%eax - movl %ebp,%ebx - andl 208(%esp),%ebx - movl %esi,%ecx - andl 112(%esp),%ecx - orl %ebx,%eax - orl %ecx,%eax - movl %eax,16(%edi) - movl %edx,%eax - andl 20(%esp),%eax - movl %ebp,%ebx - andl 212(%esp),%ebx - movl %esi,%ecx - andl 116(%esp),%ecx - orl %ebx,%eax - orl %ecx,%eax - movl %eax,20(%edi) - movl %edx,%eax - andl 24(%esp),%eax - movl %ebp,%ebx - andl 216(%esp),%ebx - movl %esi,%ecx - andl 120(%esp),%ecx - orl %ebx,%eax - orl %ecx,%eax - movl %eax,24(%edi) - movl %edx,%eax - andl 28(%esp),%eax - movl %ebp,%ebx - andl 220(%esp),%ebx - movl %esi,%ecx - andl 124(%esp),%ecx - orl %ebx,%eax - orl %ecx,%eax - movl %eax,28(%edi) - movl %edx,%eax - andl 32(%esp),%eax - movl %ebp,%ebx - andl 224(%esp),%ebx - movl %esi,%ecx - andl 128(%esp),%ecx - orl %ebx,%eax - orl %ecx,%eax - movl %eax,32(%edi) - movl %edx,%eax - andl 36(%esp),%eax - movl %ebp,%ebx - andl 228(%esp),%ebx - movl %esi,%ecx - andl 132(%esp),%ecx - orl %ebx,%eax - orl %ecx,%eax - movl %eax,36(%edi) - movl %edx,%eax - andl 40(%esp),%eax - movl %ebp,%ebx - andl 232(%esp),%ebx - movl %esi,%ecx - andl 136(%esp),%ecx - orl %ebx,%eax - orl %ecx,%eax - movl %eax,40(%edi) - movl %edx,%eax - andl 44(%esp),%eax - movl %ebp,%ebx - andl 236(%esp),%ebx - movl %esi,%ecx - andl 140(%esp),%ecx - orl %ebx,%eax - orl %ecx,%eax - movl %eax,44(%edi) - movl %edx,%eax - andl 48(%esp),%eax - movl %ebp,%ebx - andl 240(%esp),%ebx - movl %esi,%ecx - andl 144(%esp),%ecx - orl %ebx,%eax - orl %ecx,%eax - movl %eax,48(%edi) - movl %edx,%eax - andl 52(%esp),%eax - movl %ebp,%ebx - andl 244(%esp),%ebx - movl %esi,%ecx - andl 148(%esp),%ecx - orl %ebx,%eax - orl %ecx,%eax - movl %eax,52(%edi) - movl %edx,%eax - andl 56(%esp),%eax - movl %ebp,%ebx - andl 248(%esp),%ebx - movl %esi,%ecx - andl 152(%esp),%ecx - orl %ebx,%eax - orl %ecx,%eax - movl %eax,56(%edi) - movl %edx,%eax - andl 60(%esp),%eax - movl %ebp,%ebx - andl 252(%esp),%ebx - movl %esi,%ecx - andl 156(%esp),%ecx - orl %ebx,%eax - orl %ecx,%eax - movl %eax,60(%edi) - addl $492,%esp - popl %edi - popl %esi - popl %ebx - popl %ebp - ret -.section __IMPORT,__pointers,non_lazy_symbol_pointers -L_GFp_ia32cap_P$non_lazy_ptr: -.indirect_symbol _GFp_ia32cap_P -.long 0 -#endif Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ecp_nistz256-x86-win32n.obj and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ecp_nistz256-x86-win32n.obj differ diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ghash-armv4-ios32.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ghash-armv4-ios32.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ghash-armv4-ios32.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ghash-armv4-ios32.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,255 +0,0 @@ -// This file is generated from a similarly-named Perl script in the BoringSSL -// source tree. Do not edit by hand. - -#if !defined(__has_feature) -#define __has_feature(x) 0 -#endif -#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) -#define OPENSSL_NO_ASM -#endif - -#if !defined(OPENSSL_NO_ASM) -#include - -@ Silence ARMv8 deprecated IT instruction warnings. This file is used by both -@ ARMv7 and ARMv8 processors and does not use ARMv8 instructions. (ARMv8 PMULL -@ instructions are in aesv8-armx.pl.) - - -.text -#if defined(__thumb2__) || defined(__clang__) -.syntax unified -#define ldrplb ldrbpl -#define ldrneb ldrbne -#endif -#if defined(__thumb2__) -.thumb -#else -.code 32 -#endif -#if __ARM_MAX_ARCH__>=7 - - - -.globl _GFp_gcm_init_neon -.private_extern _GFp_gcm_init_neon -#ifdef __thumb2__ -.thumb_func _GFp_gcm_init_neon -#endif -.align 4 -_GFp_gcm_init_neon: - vld1.64 d7,[r1]! @ load H - vmov.i8 q8,#0xe1 - vld1.64 d6,[r1] - vshl.i64 d17,#57 - vshr.u64 d16,#63 @ t0=0xc2....01 - vdup.8 q9,d7[7] - vshr.u64 d26,d6,#63 - vshr.s8 q9,#7 @ broadcast carry bit - vshl.i64 q3,q3,#1 - vand q8,q8,q9 - vorr d7,d26 @ H<<<=1 - veor q3,q3,q8 @ twisted H - vstmia r0,{q3} - - bx lr @ bx lr - - -.globl _GFp_gcm_gmult_neon -.private_extern _GFp_gcm_gmult_neon -#ifdef __thumb2__ -.thumb_func _GFp_gcm_gmult_neon -#endif -.align 4 -_GFp_gcm_gmult_neon: - vld1.64 d7,[r0]! @ load Xi - vld1.64 d6,[r0]! - vmov.i64 d29,#0x0000ffffffffffff - vldmia r1,{d26,d27} @ load twisted H - vmov.i64 d30,#0x00000000ffffffff -#ifdef __ARMEL__ - vrev64.8 q3,q3 -#endif - vmov.i64 d31,#0x000000000000ffff - veor d28,d26,d27 @ Karatsuba pre-processing - mov r3,#16 - b Lgmult_neon - - -.globl _GFp_gcm_ghash_neon -.private_extern _GFp_gcm_ghash_neon -#ifdef __thumb2__ -.thumb_func _GFp_gcm_ghash_neon -#endif -.align 4 -_GFp_gcm_ghash_neon: - vld1.64 d1,[r0]! @ load Xi - vld1.64 d0,[r0]! - vmov.i64 d29,#0x0000ffffffffffff - vldmia r1,{d26,d27} @ load twisted H - vmov.i64 d30,#0x00000000ffffffff -#ifdef __ARMEL__ - vrev64.8 q0,q0 -#endif - vmov.i64 d31,#0x000000000000ffff - veor d28,d26,d27 @ Karatsuba pre-processing - -Loop_neon: - vld1.64 d7,[r2]! @ load inp - vld1.64 d6,[r2]! -#ifdef __ARMEL__ - vrev64.8 q3,q3 -#endif - veor q3,q0 @ inp^=Xi -Lgmult_neon: - vext.8 d16, d26, d26, #1 @ A1 - vmull.p8 q8, d16, d6 @ F = A1*B - vext.8 d0, d6, d6, #1 @ B1 - vmull.p8 q0, d26, d0 @ E = A*B1 - vext.8 d18, d26, d26, #2 @ A2 - vmull.p8 q9, d18, d6 @ H = A2*B - vext.8 d22, d6, d6, #2 @ B2 - vmull.p8 q11, d26, d22 @ G = A*B2 - vext.8 d20, d26, d26, #3 @ A3 - veor q8, q8, q0 @ L = E + F - vmull.p8 q10, d20, d6 @ J = A3*B - vext.8 d0, d6, d6, #3 @ B3 - veor q9, q9, q11 @ M = G + H - vmull.p8 q0, d26, d0 @ I = A*B3 - veor d16, d16, d17 @ t0 = (L) (P0 + P1) << 8 - vand d17, d17, d29 - vext.8 d22, d6, d6, #4 @ B4 - veor d18, d18, d19 @ t1 = (M) (P2 + P3) << 16 - vand d19, d19, d30 - vmull.p8 q11, d26, d22 @ K = A*B4 - veor q10, q10, q0 @ N = I + J - veor d16, d16, d17 - veor d18, d18, d19 - veor d20, d20, d21 @ t2 = (N) (P4 + P5) << 24 - vand d21, d21, d31 - vext.8 q8, q8, q8, #15 - veor d22, d22, d23 @ t3 = (K) (P6 + P7) << 32 - vmov.i64 d23, #0 - vext.8 q9, q9, q9, #14 - veor d20, d20, d21 - vmull.p8 q0, d26, d6 @ D = A*B - vext.8 q11, q11, q11, #12 - vext.8 q10, q10, q10, #13 - veor q8, q8, q9 - veor q10, q10, q11 - veor q0, q0, q8 - veor q0, q0, q10 - veor d6,d6,d7 @ Karatsuba pre-processing - vext.8 d16, d28, d28, #1 @ A1 - vmull.p8 q8, d16, d6 @ F = A1*B - vext.8 d2, d6, d6, #1 @ B1 - vmull.p8 q1, d28, d2 @ E = A*B1 - vext.8 d18, d28, d28, #2 @ A2 - vmull.p8 q9, d18, d6 @ H = A2*B - vext.8 d22, d6, d6, #2 @ B2 - vmull.p8 q11, d28, d22 @ G = A*B2 - vext.8 d20, d28, d28, #3 @ A3 - veor q8, q8, q1 @ L = E + F - vmull.p8 q10, d20, d6 @ J = A3*B - vext.8 d2, d6, d6, #3 @ B3 - veor q9, q9, q11 @ M = G + H - vmull.p8 q1, d28, d2 @ I = A*B3 - veor d16, d16, d17 @ t0 = (L) (P0 + P1) << 8 - vand d17, d17, d29 - vext.8 d22, d6, d6, #4 @ B4 - veor d18, d18, d19 @ t1 = (M) (P2 + P3) << 16 - vand d19, d19, d30 - vmull.p8 q11, d28, d22 @ K = A*B4 - veor q10, q10, q1 @ N = I + J - veor d16, d16, d17 - veor d18, d18, d19 - veor d20, d20, d21 @ t2 = (N) (P4 + P5) << 24 - vand d21, d21, d31 - vext.8 q8, q8, q8, #15 - veor d22, d22, d23 @ t3 = (K) (P6 + P7) << 32 - vmov.i64 d23, #0 - vext.8 q9, q9, q9, #14 - veor d20, d20, d21 - vmull.p8 q1, d28, d6 @ D = A*B - vext.8 q11, q11, q11, #12 - vext.8 q10, q10, q10, #13 - veor q8, q8, q9 - veor q10, q10, q11 - veor q1, q1, q8 - veor q1, q1, q10 - vext.8 d16, d27, d27, #1 @ A1 - vmull.p8 q8, d16, d7 @ F = A1*B - vext.8 d4, d7, d7, #1 @ B1 - vmull.p8 q2, d27, d4 @ E = A*B1 - vext.8 d18, d27, d27, #2 @ A2 - vmull.p8 q9, d18, d7 @ H = A2*B - vext.8 d22, d7, d7, #2 @ B2 - vmull.p8 q11, d27, d22 @ G = A*B2 - vext.8 d20, d27, d27, #3 @ A3 - veor q8, q8, q2 @ L = E + F - vmull.p8 q10, d20, d7 @ J = A3*B - vext.8 d4, d7, d7, #3 @ B3 - veor q9, q9, q11 @ M = G + H - vmull.p8 q2, d27, d4 @ I = A*B3 - veor d16, d16, d17 @ t0 = (L) (P0 + P1) << 8 - vand d17, d17, d29 - vext.8 d22, d7, d7, #4 @ B4 - veor d18, d18, d19 @ t1 = (M) (P2 + P3) << 16 - vand d19, d19, d30 - vmull.p8 q11, d27, d22 @ K = A*B4 - veor q10, q10, q2 @ N = I + J - veor d16, d16, d17 - veor d18, d18, d19 - veor d20, d20, d21 @ t2 = (N) (P4 + P5) << 24 - vand d21, d21, d31 - vext.8 q8, q8, q8, #15 - veor d22, d22, d23 @ t3 = (K) (P6 + P7) << 32 - vmov.i64 d23, #0 - vext.8 q9, q9, q9, #14 - veor d20, d20, d21 - vmull.p8 q2, d27, d7 @ D = A*B - vext.8 q11, q11, q11, #12 - vext.8 q10, q10, q10, #13 - veor q8, q8, q9 - veor q10, q10, q11 - veor q2, q2, q8 - veor q2, q2, q10 - veor q1,q1,q0 @ Karatsuba post-processing - veor q1,q1,q2 - veor d1,d1,d2 - veor d4,d4,d3 @ Xh|Xl - 256-bit result - - @ equivalent of reduction_avx from ghash-x86_64.pl - vshl.i64 q9,q0,#57 @ 1st phase - vshl.i64 q10,q0,#62 - veor q10,q10,q9 @ - vshl.i64 q9,q0,#63 - veor q10, q10, q9 @ - veor d1,d1,d20 @ - veor d4,d4,d21 - - vshr.u64 q10,q0,#1 @ 2nd phase - veor q2,q2,q0 - veor q0,q0,q10 @ - vshr.u64 q10,q10,#6 - vshr.u64 q0,q0,#1 @ - veor q0,q0,q2 @ - veor q0,q0,q10 @ - - subs r3,#16 - bne Loop_neon - -#ifdef __ARMEL__ - vrev64.8 q0,q0 -#endif - sub r0,#16 - vst1.64 d1,[r0]! @ write out Xi - vst1.64 d0,[r0] - - bx lr @ bx lr - -#endif -.byte 71,72,65,83,72,32,102,111,114,32,65,82,77,118,52,47,78,69,79,78,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 -.align 2 -.align 2 -#endif // !OPENSSL_NO_ASM diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ghash-armv4-linux32.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ghash-armv4-linux32.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ghash-armv4-linux32.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ghash-armv4-linux32.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,252 +0,0 @@ -// This file is generated from a similarly-named Perl script in the BoringSSL -// source tree. Do not edit by hand. - -#if !defined(__has_feature) -#define __has_feature(x) 0 -#endif -#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) -#define OPENSSL_NO_ASM -#endif - -#if !defined(OPENSSL_NO_ASM) -#if defined(__arm__) -#include - -@ Silence ARMv8 deprecated IT instruction warnings. This file is used by both -@ ARMv7 and ARMv8 processors and does not use ARMv8 instructions. (ARMv8 PMULL -@ instructions are in aesv8-armx.pl.) -.arch armv7-a - -.text -#if defined(__thumb2__) || defined(__clang__) -.syntax unified -#define ldrplb ldrbpl -#define ldrneb ldrbne -#endif -#if defined(__thumb2__) -.thumb -#else -.code 32 -#endif -#if __ARM_MAX_ARCH__>=7 -.arch armv7-a -.fpu neon - -.globl GFp_gcm_init_neon -.hidden GFp_gcm_init_neon -.type GFp_gcm_init_neon,%function -.align 4 -GFp_gcm_init_neon: - vld1.64 d7,[r1]! @ load H - vmov.i8 q8,#0xe1 - vld1.64 d6,[r1] - vshl.i64 d17,#57 - vshr.u64 d16,#63 @ t0=0xc2....01 - vdup.8 q9,d7[7] - vshr.u64 d26,d6,#63 - vshr.s8 q9,#7 @ broadcast carry bit - vshl.i64 q3,q3,#1 - vand q8,q8,q9 - vorr d7,d26 @ H<<<=1 - veor q3,q3,q8 @ twisted H - vstmia r0,{q3} - - bx lr @ bx lr -.size GFp_gcm_init_neon,.-GFp_gcm_init_neon - -.globl GFp_gcm_gmult_neon -.hidden GFp_gcm_gmult_neon -.type GFp_gcm_gmult_neon,%function -.align 4 -GFp_gcm_gmult_neon: - vld1.64 d7,[r0]! @ load Xi - vld1.64 d6,[r0]! - vmov.i64 d29,#0x0000ffffffffffff - vldmia r1,{d26,d27} @ load twisted H - vmov.i64 d30,#0x00000000ffffffff -#ifdef __ARMEL__ - vrev64.8 q3,q3 -#endif - vmov.i64 d31,#0x000000000000ffff - veor d28,d26,d27 @ Karatsuba pre-processing - mov r3,#16 - b .Lgmult_neon -.size GFp_gcm_gmult_neon,.-GFp_gcm_gmult_neon - -.globl GFp_gcm_ghash_neon -.hidden GFp_gcm_ghash_neon -.type GFp_gcm_ghash_neon,%function -.align 4 -GFp_gcm_ghash_neon: - vld1.64 d1,[r0]! @ load Xi - vld1.64 d0,[r0]! - vmov.i64 d29,#0x0000ffffffffffff - vldmia r1,{d26,d27} @ load twisted H - vmov.i64 d30,#0x00000000ffffffff -#ifdef __ARMEL__ - vrev64.8 q0,q0 -#endif - vmov.i64 d31,#0x000000000000ffff - veor d28,d26,d27 @ Karatsuba pre-processing - -.Loop_neon: - vld1.64 d7,[r2]! @ load inp - vld1.64 d6,[r2]! -#ifdef __ARMEL__ - vrev64.8 q3,q3 -#endif - veor q3,q0 @ inp^=Xi -.Lgmult_neon: - vext.8 d16, d26, d26, #1 @ A1 - vmull.p8 q8, d16, d6 @ F = A1*B - vext.8 d0, d6, d6, #1 @ B1 - vmull.p8 q0, d26, d0 @ E = A*B1 - vext.8 d18, d26, d26, #2 @ A2 - vmull.p8 q9, d18, d6 @ H = A2*B - vext.8 d22, d6, d6, #2 @ B2 - vmull.p8 q11, d26, d22 @ G = A*B2 - vext.8 d20, d26, d26, #3 @ A3 - veor q8, q8, q0 @ L = E + F - vmull.p8 q10, d20, d6 @ J = A3*B - vext.8 d0, d6, d6, #3 @ B3 - veor q9, q9, q11 @ M = G + H - vmull.p8 q0, d26, d0 @ I = A*B3 - veor d16, d16, d17 @ t0 = (L) (P0 + P1) << 8 - vand d17, d17, d29 - vext.8 d22, d6, d6, #4 @ B4 - veor d18, d18, d19 @ t1 = (M) (P2 + P3) << 16 - vand d19, d19, d30 - vmull.p8 q11, d26, d22 @ K = A*B4 - veor q10, q10, q0 @ N = I + J - veor d16, d16, d17 - veor d18, d18, d19 - veor d20, d20, d21 @ t2 = (N) (P4 + P5) << 24 - vand d21, d21, d31 - vext.8 q8, q8, q8, #15 - veor d22, d22, d23 @ t3 = (K) (P6 + P7) << 32 - vmov.i64 d23, #0 - vext.8 q9, q9, q9, #14 - veor d20, d20, d21 - vmull.p8 q0, d26, d6 @ D = A*B - vext.8 q11, q11, q11, #12 - vext.8 q10, q10, q10, #13 - veor q8, q8, q9 - veor q10, q10, q11 - veor q0, q0, q8 - veor q0, q0, q10 - veor d6,d6,d7 @ Karatsuba pre-processing - vext.8 d16, d28, d28, #1 @ A1 - vmull.p8 q8, d16, d6 @ F = A1*B - vext.8 d2, d6, d6, #1 @ B1 - vmull.p8 q1, d28, d2 @ E = A*B1 - vext.8 d18, d28, d28, #2 @ A2 - vmull.p8 q9, d18, d6 @ H = A2*B - vext.8 d22, d6, d6, #2 @ B2 - vmull.p8 q11, d28, d22 @ G = A*B2 - vext.8 d20, d28, d28, #3 @ A3 - veor q8, q8, q1 @ L = E + F - vmull.p8 q10, d20, d6 @ J = A3*B - vext.8 d2, d6, d6, #3 @ B3 - veor q9, q9, q11 @ M = G + H - vmull.p8 q1, d28, d2 @ I = A*B3 - veor d16, d16, d17 @ t0 = (L) (P0 + P1) << 8 - vand d17, d17, d29 - vext.8 d22, d6, d6, #4 @ B4 - veor d18, d18, d19 @ t1 = (M) (P2 + P3) << 16 - vand d19, d19, d30 - vmull.p8 q11, d28, d22 @ K = A*B4 - veor q10, q10, q1 @ N = I + J - veor d16, d16, d17 - veor d18, d18, d19 - veor d20, d20, d21 @ t2 = (N) (P4 + P5) << 24 - vand d21, d21, d31 - vext.8 q8, q8, q8, #15 - veor d22, d22, d23 @ t3 = (K) (P6 + P7) << 32 - vmov.i64 d23, #0 - vext.8 q9, q9, q9, #14 - veor d20, d20, d21 - vmull.p8 q1, d28, d6 @ D = A*B - vext.8 q11, q11, q11, #12 - vext.8 q10, q10, q10, #13 - veor q8, q8, q9 - veor q10, q10, q11 - veor q1, q1, q8 - veor q1, q1, q10 - vext.8 d16, d27, d27, #1 @ A1 - vmull.p8 q8, d16, d7 @ F = A1*B - vext.8 d4, d7, d7, #1 @ B1 - vmull.p8 q2, d27, d4 @ E = A*B1 - vext.8 d18, d27, d27, #2 @ A2 - vmull.p8 q9, d18, d7 @ H = A2*B - vext.8 d22, d7, d7, #2 @ B2 - vmull.p8 q11, d27, d22 @ G = A*B2 - vext.8 d20, d27, d27, #3 @ A3 - veor q8, q8, q2 @ L = E + F - vmull.p8 q10, d20, d7 @ J = A3*B - vext.8 d4, d7, d7, #3 @ B3 - veor q9, q9, q11 @ M = G + H - vmull.p8 q2, d27, d4 @ I = A*B3 - veor d16, d16, d17 @ t0 = (L) (P0 + P1) << 8 - vand d17, d17, d29 - vext.8 d22, d7, d7, #4 @ B4 - veor d18, d18, d19 @ t1 = (M) (P2 + P3) << 16 - vand d19, d19, d30 - vmull.p8 q11, d27, d22 @ K = A*B4 - veor q10, q10, q2 @ N = I + J - veor d16, d16, d17 - veor d18, d18, d19 - veor d20, d20, d21 @ t2 = (N) (P4 + P5) << 24 - vand d21, d21, d31 - vext.8 q8, q8, q8, #15 - veor d22, d22, d23 @ t3 = (K) (P6 + P7) << 32 - vmov.i64 d23, #0 - vext.8 q9, q9, q9, #14 - veor d20, d20, d21 - vmull.p8 q2, d27, d7 @ D = A*B - vext.8 q11, q11, q11, #12 - vext.8 q10, q10, q10, #13 - veor q8, q8, q9 - veor q10, q10, q11 - veor q2, q2, q8 - veor q2, q2, q10 - veor q1,q1,q0 @ Karatsuba post-processing - veor q1,q1,q2 - veor d1,d1,d2 - veor d4,d4,d3 @ Xh|Xl - 256-bit result - - @ equivalent of reduction_avx from ghash-x86_64.pl - vshl.i64 q9,q0,#57 @ 1st phase - vshl.i64 q10,q0,#62 - veor q10,q10,q9 @ - vshl.i64 q9,q0,#63 - veor q10, q10, q9 @ - veor d1,d1,d20 @ - veor d4,d4,d21 - - vshr.u64 q10,q0,#1 @ 2nd phase - veor q2,q2,q0 - veor q0,q0,q10 @ - vshr.u64 q10,q10,#6 - vshr.u64 q0,q0,#1 @ - veor q0,q0,q2 @ - veor q0,q0,q10 @ - - subs r3,#16 - bne .Loop_neon - -#ifdef __ARMEL__ - vrev64.8 q0,q0 -#endif - sub r0,#16 - vst1.64 d1,[r0]! @ write out Xi - vst1.64 d0,[r0] - - bx lr @ bx lr -.size GFp_gcm_ghash_neon,.-GFp_gcm_ghash_neon -#endif -.byte 71,72,65,83,72,32,102,111,114,32,65,82,77,118,52,47,78,69,79,78,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 -.align 2 -.align 2 -#endif -#endif // !OPENSSL_NO_ASM -.section .note.GNU-stack,"",%progbits diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ghash-neon-armv8-ios64.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ghash-neon-armv8-ios64.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ghash-neon-armv8-ios64.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ghash-neon-armv8-ios64.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,340 +0,0 @@ -// This file is generated from a similarly-named Perl script in the BoringSSL -// source tree. Do not edit by hand. - -#if !defined(__has_feature) -#define __has_feature(x) 0 -#endif -#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) -#define OPENSSL_NO_ASM -#endif - -#if !defined(OPENSSL_NO_ASM) -#include - -.text - -.globl _GFp_gcm_init_neon -.private_extern _GFp_gcm_init_neon - -.align 4 -_GFp_gcm_init_neon: - AARCH64_VALID_CALL_TARGET - // This function is adapted from gcm_init_v8. xC2 is t3. - ld1 {v17.2d}, [x1] // load H - movi v19.16b, #0xe1 - shl v19.2d, v19.2d, #57 // 0xc2.0 - ext v3.16b, v17.16b, v17.16b, #8 - ushr v18.2d, v19.2d, #63 - dup v17.4s, v17.s[1] - ext v16.16b, v18.16b, v19.16b, #8 // t0=0xc2....01 - ushr v18.2d, v3.2d, #63 - sshr v17.4s, v17.4s, #31 // broadcast carry bit - and v18.16b, v18.16b, v16.16b - shl v3.2d, v3.2d, #1 - ext v18.16b, v18.16b, v18.16b, #8 - and v16.16b, v16.16b, v17.16b - orr v3.16b, v3.16b, v18.16b // H<<<=1 - eor v5.16b, v3.16b, v16.16b // twisted H - st1 {v5.2d}, [x0] // store Htable[0] - ret - - -.globl _GFp_gcm_gmult_neon -.private_extern _GFp_gcm_gmult_neon - -.align 4 -_GFp_gcm_gmult_neon: - AARCH64_VALID_CALL_TARGET - ld1 {v3.16b}, [x0] // load Xi - ld1 {v5.1d}, [x1], #8 // load twisted H - ld1 {v6.1d}, [x1] - adrp x9, Lmasks@PAGE // load constants - add x9, x9, Lmasks@PAGEOFF - ld1 {v24.2d, v25.2d}, [x9] - rev64 v3.16b, v3.16b // byteswap Xi - ext v3.16b, v3.16b, v3.16b, #8 - eor v7.8b, v5.8b, v6.8b // Karatsuba pre-processing - - mov x3, #16 - b Lgmult_neon - - -.globl _GFp_gcm_ghash_neon -.private_extern _GFp_gcm_ghash_neon - -.align 4 -_GFp_gcm_ghash_neon: - AARCH64_VALID_CALL_TARGET - ld1 {v0.16b}, [x0] // load Xi - ld1 {v5.1d}, [x1], #8 // load twisted H - ld1 {v6.1d}, [x1] - adrp x9, Lmasks@PAGE // load constants - add x9, x9, Lmasks@PAGEOFF - ld1 {v24.2d, v25.2d}, [x9] - rev64 v0.16b, v0.16b // byteswap Xi - ext v0.16b, v0.16b, v0.16b, #8 - eor v7.8b, v5.8b, v6.8b // Karatsuba pre-processing - -Loop_neon: - ld1 {v3.16b}, [x2], #16 // load inp - rev64 v3.16b, v3.16b // byteswap inp - ext v3.16b, v3.16b, v3.16b, #8 - eor v3.16b, v3.16b, v0.16b // inp ^= Xi - -Lgmult_neon: - // Split the input into v3 and v4. (The upper halves are unused, - // so it is okay to leave them alone.) - ins v4.d[0], v3.d[1] - ext v16.8b, v5.8b, v5.8b, #1 // A1 - pmull v16.8h, v16.8b, v3.8b // F = A1*B - ext v0.8b, v3.8b, v3.8b, #1 // B1 - pmull v0.8h, v5.8b, v0.8b // E = A*B1 - ext v17.8b, v5.8b, v5.8b, #2 // A2 - pmull v17.8h, v17.8b, v3.8b // H = A2*B - ext v19.8b, v3.8b, v3.8b, #2 // B2 - pmull v19.8h, v5.8b, v19.8b // G = A*B2 - ext v18.8b, v5.8b, v5.8b, #3 // A3 - eor v16.16b, v16.16b, v0.16b // L = E + F - pmull v18.8h, v18.8b, v3.8b // J = A3*B - ext v0.8b, v3.8b, v3.8b, #3 // B3 - eor v17.16b, v17.16b, v19.16b // M = G + H - pmull v0.8h, v5.8b, v0.8b // I = A*B3 - - // Here we diverge from the 32-bit version. It computes the following - // (instructions reordered for clarity): - // - // veor $t0#lo, $t0#lo, $t0#hi @ t0 = P0 + P1 (L) - // vand $t0#hi, $t0#hi, $k48 - // veor $t0#lo, $t0#lo, $t0#hi - // - // veor $t1#lo, $t1#lo, $t1#hi @ t1 = P2 + P3 (M) - // vand $t1#hi, $t1#hi, $k32 - // veor $t1#lo, $t1#lo, $t1#hi - // - // veor $t2#lo, $t2#lo, $t2#hi @ t2 = P4 + P5 (N) - // vand $t2#hi, $t2#hi, $k16 - // veor $t2#lo, $t2#lo, $t2#hi - // - // veor $t3#lo, $t3#lo, $t3#hi @ t3 = P6 + P7 (K) - // vmov.i64 $t3#hi, #0 - // - // $kN is a mask with the bottom N bits set. AArch64 cannot compute on - // upper halves of SIMD registers, so we must split each half into - // separate registers. To compensate, we pair computations up and - // parallelize. - - ext v19.8b, v3.8b, v3.8b, #4 // B4 - eor v18.16b, v18.16b, v0.16b // N = I + J - pmull v19.8h, v5.8b, v19.8b // K = A*B4 - - // This can probably be scheduled more efficiently. For now, we just - // pair up independent instructions. - zip1 v20.2d, v16.2d, v17.2d - zip1 v22.2d, v18.2d, v19.2d - zip2 v21.2d, v16.2d, v17.2d - zip2 v23.2d, v18.2d, v19.2d - eor v20.16b, v20.16b, v21.16b - eor v22.16b, v22.16b, v23.16b - and v21.16b, v21.16b, v24.16b - and v23.16b, v23.16b, v25.16b - eor v20.16b, v20.16b, v21.16b - eor v22.16b, v22.16b, v23.16b - zip1 v16.2d, v20.2d, v21.2d - zip1 v18.2d, v22.2d, v23.2d - zip2 v17.2d, v20.2d, v21.2d - zip2 v19.2d, v22.2d, v23.2d - - ext v16.16b, v16.16b, v16.16b, #15 // t0 = t0 << 8 - ext v17.16b, v17.16b, v17.16b, #14 // t1 = t1 << 16 - pmull v0.8h, v5.8b, v3.8b // D = A*B - ext v19.16b, v19.16b, v19.16b, #12 // t3 = t3 << 32 - ext v18.16b, v18.16b, v18.16b, #13 // t2 = t2 << 24 - eor v16.16b, v16.16b, v17.16b - eor v18.16b, v18.16b, v19.16b - eor v0.16b, v0.16b, v16.16b - eor v0.16b, v0.16b, v18.16b - eor v3.8b, v3.8b, v4.8b // Karatsuba pre-processing - ext v16.8b, v7.8b, v7.8b, #1 // A1 - pmull v16.8h, v16.8b, v3.8b // F = A1*B - ext v1.8b, v3.8b, v3.8b, #1 // B1 - pmull v1.8h, v7.8b, v1.8b // E = A*B1 - ext v17.8b, v7.8b, v7.8b, #2 // A2 - pmull v17.8h, v17.8b, v3.8b // H = A2*B - ext v19.8b, v3.8b, v3.8b, #2 // B2 - pmull v19.8h, v7.8b, v19.8b // G = A*B2 - ext v18.8b, v7.8b, v7.8b, #3 // A3 - eor v16.16b, v16.16b, v1.16b // L = E + F - pmull v18.8h, v18.8b, v3.8b // J = A3*B - ext v1.8b, v3.8b, v3.8b, #3 // B3 - eor v17.16b, v17.16b, v19.16b // M = G + H - pmull v1.8h, v7.8b, v1.8b // I = A*B3 - - // Here we diverge from the 32-bit version. It computes the following - // (instructions reordered for clarity): - // - // veor $t0#lo, $t0#lo, $t0#hi @ t0 = P0 + P1 (L) - // vand $t0#hi, $t0#hi, $k48 - // veor $t0#lo, $t0#lo, $t0#hi - // - // veor $t1#lo, $t1#lo, $t1#hi @ t1 = P2 + P3 (M) - // vand $t1#hi, $t1#hi, $k32 - // veor $t1#lo, $t1#lo, $t1#hi - // - // veor $t2#lo, $t2#lo, $t2#hi @ t2 = P4 + P5 (N) - // vand $t2#hi, $t2#hi, $k16 - // veor $t2#lo, $t2#lo, $t2#hi - // - // veor $t3#lo, $t3#lo, $t3#hi @ t3 = P6 + P7 (K) - // vmov.i64 $t3#hi, #0 - // - // $kN is a mask with the bottom N bits set. AArch64 cannot compute on - // upper halves of SIMD registers, so we must split each half into - // separate registers. To compensate, we pair computations up and - // parallelize. - - ext v19.8b, v3.8b, v3.8b, #4 // B4 - eor v18.16b, v18.16b, v1.16b // N = I + J - pmull v19.8h, v7.8b, v19.8b // K = A*B4 - - // This can probably be scheduled more efficiently. For now, we just - // pair up independent instructions. - zip1 v20.2d, v16.2d, v17.2d - zip1 v22.2d, v18.2d, v19.2d - zip2 v21.2d, v16.2d, v17.2d - zip2 v23.2d, v18.2d, v19.2d - eor v20.16b, v20.16b, v21.16b - eor v22.16b, v22.16b, v23.16b - and v21.16b, v21.16b, v24.16b - and v23.16b, v23.16b, v25.16b - eor v20.16b, v20.16b, v21.16b - eor v22.16b, v22.16b, v23.16b - zip1 v16.2d, v20.2d, v21.2d - zip1 v18.2d, v22.2d, v23.2d - zip2 v17.2d, v20.2d, v21.2d - zip2 v19.2d, v22.2d, v23.2d - - ext v16.16b, v16.16b, v16.16b, #15 // t0 = t0 << 8 - ext v17.16b, v17.16b, v17.16b, #14 // t1 = t1 << 16 - pmull v1.8h, v7.8b, v3.8b // D = A*B - ext v19.16b, v19.16b, v19.16b, #12 // t3 = t3 << 32 - ext v18.16b, v18.16b, v18.16b, #13 // t2 = t2 << 24 - eor v16.16b, v16.16b, v17.16b - eor v18.16b, v18.16b, v19.16b - eor v1.16b, v1.16b, v16.16b - eor v1.16b, v1.16b, v18.16b - ext v16.8b, v6.8b, v6.8b, #1 // A1 - pmull v16.8h, v16.8b, v4.8b // F = A1*B - ext v2.8b, v4.8b, v4.8b, #1 // B1 - pmull v2.8h, v6.8b, v2.8b // E = A*B1 - ext v17.8b, v6.8b, v6.8b, #2 // A2 - pmull v17.8h, v17.8b, v4.8b // H = A2*B - ext v19.8b, v4.8b, v4.8b, #2 // B2 - pmull v19.8h, v6.8b, v19.8b // G = A*B2 - ext v18.8b, v6.8b, v6.8b, #3 // A3 - eor v16.16b, v16.16b, v2.16b // L = E + F - pmull v18.8h, v18.8b, v4.8b // J = A3*B - ext v2.8b, v4.8b, v4.8b, #3 // B3 - eor v17.16b, v17.16b, v19.16b // M = G + H - pmull v2.8h, v6.8b, v2.8b // I = A*B3 - - // Here we diverge from the 32-bit version. It computes the following - // (instructions reordered for clarity): - // - // veor $t0#lo, $t0#lo, $t0#hi @ t0 = P0 + P1 (L) - // vand $t0#hi, $t0#hi, $k48 - // veor $t0#lo, $t0#lo, $t0#hi - // - // veor $t1#lo, $t1#lo, $t1#hi @ t1 = P2 + P3 (M) - // vand $t1#hi, $t1#hi, $k32 - // veor $t1#lo, $t1#lo, $t1#hi - // - // veor $t2#lo, $t2#lo, $t2#hi @ t2 = P4 + P5 (N) - // vand $t2#hi, $t2#hi, $k16 - // veor $t2#lo, $t2#lo, $t2#hi - // - // veor $t3#lo, $t3#lo, $t3#hi @ t3 = P6 + P7 (K) - // vmov.i64 $t3#hi, #0 - // - // $kN is a mask with the bottom N bits set. AArch64 cannot compute on - // upper halves of SIMD registers, so we must split each half into - // separate registers. To compensate, we pair computations up and - // parallelize. - - ext v19.8b, v4.8b, v4.8b, #4 // B4 - eor v18.16b, v18.16b, v2.16b // N = I + J - pmull v19.8h, v6.8b, v19.8b // K = A*B4 - - // This can probably be scheduled more efficiently. For now, we just - // pair up independent instructions. - zip1 v20.2d, v16.2d, v17.2d - zip1 v22.2d, v18.2d, v19.2d - zip2 v21.2d, v16.2d, v17.2d - zip2 v23.2d, v18.2d, v19.2d - eor v20.16b, v20.16b, v21.16b - eor v22.16b, v22.16b, v23.16b - and v21.16b, v21.16b, v24.16b - and v23.16b, v23.16b, v25.16b - eor v20.16b, v20.16b, v21.16b - eor v22.16b, v22.16b, v23.16b - zip1 v16.2d, v20.2d, v21.2d - zip1 v18.2d, v22.2d, v23.2d - zip2 v17.2d, v20.2d, v21.2d - zip2 v19.2d, v22.2d, v23.2d - - ext v16.16b, v16.16b, v16.16b, #15 // t0 = t0 << 8 - ext v17.16b, v17.16b, v17.16b, #14 // t1 = t1 << 16 - pmull v2.8h, v6.8b, v4.8b // D = A*B - ext v19.16b, v19.16b, v19.16b, #12 // t3 = t3 << 32 - ext v18.16b, v18.16b, v18.16b, #13 // t2 = t2 << 24 - eor v16.16b, v16.16b, v17.16b - eor v18.16b, v18.16b, v19.16b - eor v2.16b, v2.16b, v16.16b - eor v2.16b, v2.16b, v18.16b - ext v16.16b, v0.16b, v2.16b, #8 - eor v1.16b, v1.16b, v0.16b // Karatsuba post-processing - eor v1.16b, v1.16b, v2.16b - eor v1.16b, v1.16b, v16.16b // Xm overlaps Xh.lo and Xl.hi - ins v0.d[1], v1.d[0] // Xh|Xl - 256-bit result - // This is a no-op due to the ins instruction below. - // ins v2.d[0], v1.d[1] - - // equivalent of reduction_avx from ghash-x86_64.pl - shl v17.2d, v0.2d, #57 // 1st phase - shl v18.2d, v0.2d, #62 - eor v18.16b, v18.16b, v17.16b // - shl v17.2d, v0.2d, #63 - eor v18.16b, v18.16b, v17.16b // - // Note Xm contains {Xl.d[1], Xh.d[0]}. - eor v18.16b, v18.16b, v1.16b - ins v0.d[1], v18.d[0] // Xl.d[1] ^= t2.d[0] - ins v2.d[0], v18.d[1] // Xh.d[0] ^= t2.d[1] - - ushr v18.2d, v0.2d, #1 // 2nd phase - eor v2.16b, v2.16b,v0.16b - eor v0.16b, v0.16b,v18.16b // - ushr v18.2d, v18.2d, #6 - ushr v0.2d, v0.2d, #1 // - eor v0.16b, v0.16b, v2.16b // - eor v0.16b, v0.16b, v18.16b // - - subs x3, x3, #16 - bne Loop_neon - - rev64 v0.16b, v0.16b // byteswap Xi and write - ext v0.16b, v0.16b, v0.16b, #8 - st1 {v0.16b}, [x0] - - ret - - -.section __TEXT,__const -.align 4 -Lmasks: -.quad 0x0000ffffffffffff // k48 -.quad 0x00000000ffffffff // k32 -.quad 0x000000000000ffff // k16 -.quad 0x0000000000000000 // k0 -.byte 71,72,65,83,72,32,102,111,114,32,65,82,77,118,56,44,32,100,101,114,105,118,101,100,32,102,114,111,109,32,65,82,77,118,52,32,118,101,114,115,105,111,110,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 -.align 2 -.align 2 -#endif // !OPENSSL_NO_ASM diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ghash-neon-armv8-linux64.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ghash-neon-armv8-linux64.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ghash-neon-armv8-linux64.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ghash-neon-armv8-linux64.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,343 +0,0 @@ -// This file is generated from a similarly-named Perl script in the BoringSSL -// source tree. Do not edit by hand. - -#if !defined(__has_feature) -#define __has_feature(x) 0 -#endif -#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) -#define OPENSSL_NO_ASM -#endif - -#if !defined(OPENSSL_NO_ASM) -#if defined(__aarch64__) -#include - -.text - -.globl GFp_gcm_init_neon -.hidden GFp_gcm_init_neon -.type GFp_gcm_init_neon,%function -.align 4 -GFp_gcm_init_neon: - AARCH64_VALID_CALL_TARGET - // This function is adapted from gcm_init_v8. xC2 is t3. - ld1 {v17.2d}, [x1] // load H - movi v19.16b, #0xe1 - shl v19.2d, v19.2d, #57 // 0xc2.0 - ext v3.16b, v17.16b, v17.16b, #8 - ushr v18.2d, v19.2d, #63 - dup v17.4s, v17.s[1] - ext v16.16b, v18.16b, v19.16b, #8 // t0=0xc2....01 - ushr v18.2d, v3.2d, #63 - sshr v17.4s, v17.4s, #31 // broadcast carry bit - and v18.16b, v18.16b, v16.16b - shl v3.2d, v3.2d, #1 - ext v18.16b, v18.16b, v18.16b, #8 - and v16.16b, v16.16b, v17.16b - orr v3.16b, v3.16b, v18.16b // H<<<=1 - eor v5.16b, v3.16b, v16.16b // twisted H - st1 {v5.2d}, [x0] // store Htable[0] - ret -.size GFp_gcm_init_neon,.-GFp_gcm_init_neon - -.globl GFp_gcm_gmult_neon -.hidden GFp_gcm_gmult_neon -.type GFp_gcm_gmult_neon,%function -.align 4 -GFp_gcm_gmult_neon: - AARCH64_VALID_CALL_TARGET - ld1 {v3.16b}, [x0] // load Xi - ld1 {v5.1d}, [x1], #8 // load twisted H - ld1 {v6.1d}, [x1] - adrp x9, .Lmasks // load constants - add x9, x9, :lo12:.Lmasks - ld1 {v24.2d, v25.2d}, [x9] - rev64 v3.16b, v3.16b // byteswap Xi - ext v3.16b, v3.16b, v3.16b, #8 - eor v7.8b, v5.8b, v6.8b // Karatsuba pre-processing - - mov x3, #16 - b .Lgmult_neon -.size GFp_gcm_gmult_neon,.-GFp_gcm_gmult_neon - -.globl GFp_gcm_ghash_neon -.hidden GFp_gcm_ghash_neon -.type GFp_gcm_ghash_neon,%function -.align 4 -GFp_gcm_ghash_neon: - AARCH64_VALID_CALL_TARGET - ld1 {v0.16b}, [x0] // load Xi - ld1 {v5.1d}, [x1], #8 // load twisted H - ld1 {v6.1d}, [x1] - adrp x9, .Lmasks // load constants - add x9, x9, :lo12:.Lmasks - ld1 {v24.2d, v25.2d}, [x9] - rev64 v0.16b, v0.16b // byteswap Xi - ext v0.16b, v0.16b, v0.16b, #8 - eor v7.8b, v5.8b, v6.8b // Karatsuba pre-processing - -.Loop_neon: - ld1 {v3.16b}, [x2], #16 // load inp - rev64 v3.16b, v3.16b // byteswap inp - ext v3.16b, v3.16b, v3.16b, #8 - eor v3.16b, v3.16b, v0.16b // inp ^= Xi - -.Lgmult_neon: - // Split the input into v3 and v4. (The upper halves are unused, - // so it is okay to leave them alone.) - ins v4.d[0], v3.d[1] - ext v16.8b, v5.8b, v5.8b, #1 // A1 - pmull v16.8h, v16.8b, v3.8b // F = A1*B - ext v0.8b, v3.8b, v3.8b, #1 // B1 - pmull v0.8h, v5.8b, v0.8b // E = A*B1 - ext v17.8b, v5.8b, v5.8b, #2 // A2 - pmull v17.8h, v17.8b, v3.8b // H = A2*B - ext v19.8b, v3.8b, v3.8b, #2 // B2 - pmull v19.8h, v5.8b, v19.8b // G = A*B2 - ext v18.8b, v5.8b, v5.8b, #3 // A3 - eor v16.16b, v16.16b, v0.16b // L = E + F - pmull v18.8h, v18.8b, v3.8b // J = A3*B - ext v0.8b, v3.8b, v3.8b, #3 // B3 - eor v17.16b, v17.16b, v19.16b // M = G + H - pmull v0.8h, v5.8b, v0.8b // I = A*B3 - - // Here we diverge from the 32-bit version. It computes the following - // (instructions reordered for clarity): - // - // veor $t0#lo, $t0#lo, $t0#hi @ t0 = P0 + P1 (L) - // vand $t0#hi, $t0#hi, $k48 - // veor $t0#lo, $t0#lo, $t0#hi - // - // veor $t1#lo, $t1#lo, $t1#hi @ t1 = P2 + P3 (M) - // vand $t1#hi, $t1#hi, $k32 - // veor $t1#lo, $t1#lo, $t1#hi - // - // veor $t2#lo, $t2#lo, $t2#hi @ t2 = P4 + P5 (N) - // vand $t2#hi, $t2#hi, $k16 - // veor $t2#lo, $t2#lo, $t2#hi - // - // veor $t3#lo, $t3#lo, $t3#hi @ t3 = P6 + P7 (K) - // vmov.i64 $t3#hi, #0 - // - // $kN is a mask with the bottom N bits set. AArch64 cannot compute on - // upper halves of SIMD registers, so we must split each half into - // separate registers. To compensate, we pair computations up and - // parallelize. - - ext v19.8b, v3.8b, v3.8b, #4 // B4 - eor v18.16b, v18.16b, v0.16b // N = I + J - pmull v19.8h, v5.8b, v19.8b // K = A*B4 - - // This can probably be scheduled more efficiently. For now, we just - // pair up independent instructions. - zip1 v20.2d, v16.2d, v17.2d - zip1 v22.2d, v18.2d, v19.2d - zip2 v21.2d, v16.2d, v17.2d - zip2 v23.2d, v18.2d, v19.2d - eor v20.16b, v20.16b, v21.16b - eor v22.16b, v22.16b, v23.16b - and v21.16b, v21.16b, v24.16b - and v23.16b, v23.16b, v25.16b - eor v20.16b, v20.16b, v21.16b - eor v22.16b, v22.16b, v23.16b - zip1 v16.2d, v20.2d, v21.2d - zip1 v18.2d, v22.2d, v23.2d - zip2 v17.2d, v20.2d, v21.2d - zip2 v19.2d, v22.2d, v23.2d - - ext v16.16b, v16.16b, v16.16b, #15 // t0 = t0 << 8 - ext v17.16b, v17.16b, v17.16b, #14 // t1 = t1 << 16 - pmull v0.8h, v5.8b, v3.8b // D = A*B - ext v19.16b, v19.16b, v19.16b, #12 // t3 = t3 << 32 - ext v18.16b, v18.16b, v18.16b, #13 // t2 = t2 << 24 - eor v16.16b, v16.16b, v17.16b - eor v18.16b, v18.16b, v19.16b - eor v0.16b, v0.16b, v16.16b - eor v0.16b, v0.16b, v18.16b - eor v3.8b, v3.8b, v4.8b // Karatsuba pre-processing - ext v16.8b, v7.8b, v7.8b, #1 // A1 - pmull v16.8h, v16.8b, v3.8b // F = A1*B - ext v1.8b, v3.8b, v3.8b, #1 // B1 - pmull v1.8h, v7.8b, v1.8b // E = A*B1 - ext v17.8b, v7.8b, v7.8b, #2 // A2 - pmull v17.8h, v17.8b, v3.8b // H = A2*B - ext v19.8b, v3.8b, v3.8b, #2 // B2 - pmull v19.8h, v7.8b, v19.8b // G = A*B2 - ext v18.8b, v7.8b, v7.8b, #3 // A3 - eor v16.16b, v16.16b, v1.16b // L = E + F - pmull v18.8h, v18.8b, v3.8b // J = A3*B - ext v1.8b, v3.8b, v3.8b, #3 // B3 - eor v17.16b, v17.16b, v19.16b // M = G + H - pmull v1.8h, v7.8b, v1.8b // I = A*B3 - - // Here we diverge from the 32-bit version. It computes the following - // (instructions reordered for clarity): - // - // veor $t0#lo, $t0#lo, $t0#hi @ t0 = P0 + P1 (L) - // vand $t0#hi, $t0#hi, $k48 - // veor $t0#lo, $t0#lo, $t0#hi - // - // veor $t1#lo, $t1#lo, $t1#hi @ t1 = P2 + P3 (M) - // vand $t1#hi, $t1#hi, $k32 - // veor $t1#lo, $t1#lo, $t1#hi - // - // veor $t2#lo, $t2#lo, $t2#hi @ t2 = P4 + P5 (N) - // vand $t2#hi, $t2#hi, $k16 - // veor $t2#lo, $t2#lo, $t2#hi - // - // veor $t3#lo, $t3#lo, $t3#hi @ t3 = P6 + P7 (K) - // vmov.i64 $t3#hi, #0 - // - // $kN is a mask with the bottom N bits set. AArch64 cannot compute on - // upper halves of SIMD registers, so we must split each half into - // separate registers. To compensate, we pair computations up and - // parallelize. - - ext v19.8b, v3.8b, v3.8b, #4 // B4 - eor v18.16b, v18.16b, v1.16b // N = I + J - pmull v19.8h, v7.8b, v19.8b // K = A*B4 - - // This can probably be scheduled more efficiently. For now, we just - // pair up independent instructions. - zip1 v20.2d, v16.2d, v17.2d - zip1 v22.2d, v18.2d, v19.2d - zip2 v21.2d, v16.2d, v17.2d - zip2 v23.2d, v18.2d, v19.2d - eor v20.16b, v20.16b, v21.16b - eor v22.16b, v22.16b, v23.16b - and v21.16b, v21.16b, v24.16b - and v23.16b, v23.16b, v25.16b - eor v20.16b, v20.16b, v21.16b - eor v22.16b, v22.16b, v23.16b - zip1 v16.2d, v20.2d, v21.2d - zip1 v18.2d, v22.2d, v23.2d - zip2 v17.2d, v20.2d, v21.2d - zip2 v19.2d, v22.2d, v23.2d - - ext v16.16b, v16.16b, v16.16b, #15 // t0 = t0 << 8 - ext v17.16b, v17.16b, v17.16b, #14 // t1 = t1 << 16 - pmull v1.8h, v7.8b, v3.8b // D = A*B - ext v19.16b, v19.16b, v19.16b, #12 // t3 = t3 << 32 - ext v18.16b, v18.16b, v18.16b, #13 // t2 = t2 << 24 - eor v16.16b, v16.16b, v17.16b - eor v18.16b, v18.16b, v19.16b - eor v1.16b, v1.16b, v16.16b - eor v1.16b, v1.16b, v18.16b - ext v16.8b, v6.8b, v6.8b, #1 // A1 - pmull v16.8h, v16.8b, v4.8b // F = A1*B - ext v2.8b, v4.8b, v4.8b, #1 // B1 - pmull v2.8h, v6.8b, v2.8b // E = A*B1 - ext v17.8b, v6.8b, v6.8b, #2 // A2 - pmull v17.8h, v17.8b, v4.8b // H = A2*B - ext v19.8b, v4.8b, v4.8b, #2 // B2 - pmull v19.8h, v6.8b, v19.8b // G = A*B2 - ext v18.8b, v6.8b, v6.8b, #3 // A3 - eor v16.16b, v16.16b, v2.16b // L = E + F - pmull v18.8h, v18.8b, v4.8b // J = A3*B - ext v2.8b, v4.8b, v4.8b, #3 // B3 - eor v17.16b, v17.16b, v19.16b // M = G + H - pmull v2.8h, v6.8b, v2.8b // I = A*B3 - - // Here we diverge from the 32-bit version. It computes the following - // (instructions reordered for clarity): - // - // veor $t0#lo, $t0#lo, $t0#hi @ t0 = P0 + P1 (L) - // vand $t0#hi, $t0#hi, $k48 - // veor $t0#lo, $t0#lo, $t0#hi - // - // veor $t1#lo, $t1#lo, $t1#hi @ t1 = P2 + P3 (M) - // vand $t1#hi, $t1#hi, $k32 - // veor $t1#lo, $t1#lo, $t1#hi - // - // veor $t2#lo, $t2#lo, $t2#hi @ t2 = P4 + P5 (N) - // vand $t2#hi, $t2#hi, $k16 - // veor $t2#lo, $t2#lo, $t2#hi - // - // veor $t3#lo, $t3#lo, $t3#hi @ t3 = P6 + P7 (K) - // vmov.i64 $t3#hi, #0 - // - // $kN is a mask with the bottom N bits set. AArch64 cannot compute on - // upper halves of SIMD registers, so we must split each half into - // separate registers. To compensate, we pair computations up and - // parallelize. - - ext v19.8b, v4.8b, v4.8b, #4 // B4 - eor v18.16b, v18.16b, v2.16b // N = I + J - pmull v19.8h, v6.8b, v19.8b // K = A*B4 - - // This can probably be scheduled more efficiently. For now, we just - // pair up independent instructions. - zip1 v20.2d, v16.2d, v17.2d - zip1 v22.2d, v18.2d, v19.2d - zip2 v21.2d, v16.2d, v17.2d - zip2 v23.2d, v18.2d, v19.2d - eor v20.16b, v20.16b, v21.16b - eor v22.16b, v22.16b, v23.16b - and v21.16b, v21.16b, v24.16b - and v23.16b, v23.16b, v25.16b - eor v20.16b, v20.16b, v21.16b - eor v22.16b, v22.16b, v23.16b - zip1 v16.2d, v20.2d, v21.2d - zip1 v18.2d, v22.2d, v23.2d - zip2 v17.2d, v20.2d, v21.2d - zip2 v19.2d, v22.2d, v23.2d - - ext v16.16b, v16.16b, v16.16b, #15 // t0 = t0 << 8 - ext v17.16b, v17.16b, v17.16b, #14 // t1 = t1 << 16 - pmull v2.8h, v6.8b, v4.8b // D = A*B - ext v19.16b, v19.16b, v19.16b, #12 // t3 = t3 << 32 - ext v18.16b, v18.16b, v18.16b, #13 // t2 = t2 << 24 - eor v16.16b, v16.16b, v17.16b - eor v18.16b, v18.16b, v19.16b - eor v2.16b, v2.16b, v16.16b - eor v2.16b, v2.16b, v18.16b - ext v16.16b, v0.16b, v2.16b, #8 - eor v1.16b, v1.16b, v0.16b // Karatsuba post-processing - eor v1.16b, v1.16b, v2.16b - eor v1.16b, v1.16b, v16.16b // Xm overlaps Xh.lo and Xl.hi - ins v0.d[1], v1.d[0] // Xh|Xl - 256-bit result - // This is a no-op due to the ins instruction below. - // ins v2.d[0], v1.d[1] - - // equivalent of reduction_avx from ghash-x86_64.pl - shl v17.2d, v0.2d, #57 // 1st phase - shl v18.2d, v0.2d, #62 - eor v18.16b, v18.16b, v17.16b // - shl v17.2d, v0.2d, #63 - eor v18.16b, v18.16b, v17.16b // - // Note Xm contains {Xl.d[1], Xh.d[0]}. - eor v18.16b, v18.16b, v1.16b - ins v0.d[1], v18.d[0] // Xl.d[1] ^= t2.d[0] - ins v2.d[0], v18.d[1] // Xh.d[0] ^= t2.d[1] - - ushr v18.2d, v0.2d, #1 // 2nd phase - eor v2.16b, v2.16b,v0.16b - eor v0.16b, v0.16b,v18.16b // - ushr v18.2d, v18.2d, #6 - ushr v0.2d, v0.2d, #1 // - eor v0.16b, v0.16b, v2.16b // - eor v0.16b, v0.16b, v18.16b // - - subs x3, x3, #16 - bne .Loop_neon - - rev64 v0.16b, v0.16b // byteswap Xi and write - ext v0.16b, v0.16b, v0.16b, #8 - st1 {v0.16b}, [x0] - - ret -.size GFp_gcm_ghash_neon,.-GFp_gcm_ghash_neon - -.section .rodata -.align 4 -.Lmasks: -.quad 0x0000ffffffffffff // k48 -.quad 0x00000000ffffffff // k32 -.quad 0x000000000000ffff // k16 -.quad 0x0000000000000000 // k0 -.byte 71,72,65,83,72,32,102,111,114,32,65,82,77,118,56,44,32,100,101,114,105,118,101,100,32,102,114,111,109,32,65,82,77,118,52,32,118,101,114,115,105,111,110,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 -.align 2 -.align 2 -#endif -#endif // !OPENSSL_NO_ASM -.section .note.GNU-stack,"",%progbits diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ghashv8-armx-ios32.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ghashv8-armx-ios32.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ghashv8-armx-ios32.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ghashv8-armx-ios32.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,256 +0,0 @@ -// This file is generated from a similarly-named Perl script in the BoringSSL -// source tree. Do not edit by hand. - -#if !defined(__has_feature) -#define __has_feature(x) 0 -#endif -#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) -#define OPENSSL_NO_ASM -#endif - -#if !defined(OPENSSL_NO_ASM) -#include - -.text - -.code 32 -#undef __thumb2__ -.globl _GFp_gcm_init_clmul -.private_extern _GFp_gcm_init_clmul -#ifdef __thumb2__ -.thumb_func _GFp_gcm_init_clmul -#endif -.align 4 -_GFp_gcm_init_clmul: - AARCH64_VALID_CALL_TARGET - vld1.64 {q9},[r1] @ load input H - vmov.i8 q11,#0xe1 - vshl.i64 q11,q11,#57 @ 0xc2.0 - vext.8 q3,q9,q9,#8 - vshr.u64 q10,q11,#63 - vdup.32 q9,d18[1] - vext.8 q8,q10,q11,#8 @ t0=0xc2....01 - vshr.u64 q10,q3,#63 - vshr.s32 q9,q9,#31 @ broadcast carry bit - vand q10,q10,q8 - vshl.i64 q3,q3,#1 - vext.8 q10,q10,q10,#8 - vand q8,q8,q9 - vorr q3,q3,q10 @ H<<<=1 - veor q12,q3,q8 @ twisted H - vst1.64 {q12},[r0]! @ store Htable[0] - - @ calculate H^2 - vext.8 q8,q12,q12,#8 @ Karatsuba pre-processing -.byte 0xa8,0x0e,0xa8,0xf2 @ pmull q0,q12,q12 - veor q8,q8,q12 -.byte 0xa9,0x4e,0xa9,0xf2 @ pmull2 q2,q12,q12 -.byte 0xa0,0x2e,0xa0,0xf2 @ pmull q1,q8,q8 - - vext.8 q9,q0,q2,#8 @ Karatsuba post-processing - veor q10,q0,q2 - veor q1,q1,q9 - veor q1,q1,q10 -.byte 0x26,0x4e,0xe0,0xf2 @ pmull q10,q0,q11 @ 1st phase - - vmov d4,d3 @ Xh|Xm - 256-bit result - vmov d3,d0 @ Xm is rotated Xl - veor q0,q1,q10 - - vext.8 q10,q0,q0,#8 @ 2nd phase -.byte 0x26,0x0e,0xa0,0xf2 @ pmull q0,q0,q11 - veor q10,q10,q2 - veor q14,q0,q10 - - vext.8 q9,q14,q14,#8 @ Karatsuba pre-processing - veor q9,q9,q14 - vext.8 q13,q8,q9,#8 @ pack Karatsuba pre-processed - vst1.64 {q13,q14},[r0] @ store Htable[1..2] - - bx lr - -.globl _GFp_gcm_gmult_clmul -.private_extern _GFp_gcm_gmult_clmul -#ifdef __thumb2__ -.thumb_func _GFp_gcm_gmult_clmul -#endif -.align 4 -_GFp_gcm_gmult_clmul: - AARCH64_VALID_CALL_TARGET - vld1.64 {q9},[r0] @ load Xi - vmov.i8 q11,#0xe1 - vld1.64 {q12,q13},[r1] @ load twisted H, ... - vshl.u64 q11,q11,#57 -#ifndef __ARMEB__ - vrev64.8 q9,q9 -#endif - vext.8 q3,q9,q9,#8 - -.byte 0x86,0x0e,0xa8,0xf2 @ pmull q0,q12,q3 @ H.lo·Xi.lo - veor q9,q9,q3 @ Karatsuba pre-processing -.byte 0x87,0x4e,0xa9,0xf2 @ pmull2 q2,q12,q3 @ H.hi·Xi.hi -.byte 0xa2,0x2e,0xaa,0xf2 @ pmull q1,q13,q9 @ (H.lo+H.hi)·(Xi.lo+Xi.hi) - - vext.8 q9,q0,q2,#8 @ Karatsuba post-processing - veor q10,q0,q2 - veor q1,q1,q9 - veor q1,q1,q10 -.byte 0x26,0x4e,0xe0,0xf2 @ pmull q10,q0,q11 @ 1st phase of reduction - - vmov d4,d3 @ Xh|Xm - 256-bit result - vmov d3,d0 @ Xm is rotated Xl - veor q0,q1,q10 - - vext.8 q10,q0,q0,#8 @ 2nd phase of reduction -.byte 0x26,0x0e,0xa0,0xf2 @ pmull q0,q0,q11 - veor q10,q10,q2 - veor q0,q0,q10 - -#ifndef __ARMEB__ - vrev64.8 q0,q0 -#endif - vext.8 q0,q0,q0,#8 - vst1.64 {q0},[r0] @ write out Xi - - bx lr - -.globl _GFp_gcm_ghash_clmul -.private_extern _GFp_gcm_ghash_clmul -#ifdef __thumb2__ -.thumb_func _GFp_gcm_ghash_clmul -#endif -.align 4 -_GFp_gcm_ghash_clmul: - AARCH64_VALID_CALL_TARGET - vstmdb sp!,{d8,d9,d10,d11,d12,d13,d14,d15} @ 32-bit ABI says so - vld1.64 {q0},[r0] @ load [rotated] Xi - @ "[rotated]" means that - @ loaded value would have - @ to be rotated in order to - @ make it appear as in - @ algorithm specification - subs r3,r3,#32 @ see if r3 is 32 or larger - mov r12,#16 @ r12 is used as post- - @ increment for input pointer; - @ as loop is modulo-scheduled - @ r12 is zeroed just in time - @ to preclude overstepping - @ inp[len], which means that - @ last block[s] are actually - @ loaded twice, but last - @ copy is not processed - vld1.64 {q12,q13},[r1]! @ load twisted H, ..., H^2 - vmov.i8 q11,#0xe1 - vld1.64 {q14},[r1] - moveq r12,#0 @ is it time to zero r12? - vext.8 q0,q0,q0,#8 @ rotate Xi - vld1.64 {q8},[r2]! @ load [rotated] I[0] - vshl.u64 q11,q11,#57 @ compose 0xc2.0 constant -#ifndef __ARMEB__ - vrev64.8 q8,q8 - vrev64.8 q0,q0 -#endif - vext.8 q3,q8,q8,#8 @ rotate I[0] - blo Lodd_tail_v8 @ r3 was less than 32 - vld1.64 {q9},[r2],r12 @ load [rotated] I[1] -#ifndef __ARMEB__ - vrev64.8 q9,q9 -#endif - vext.8 q7,q9,q9,#8 - veor q3,q3,q0 @ I[i]^=Xi -.byte 0x8e,0x8e,0xa8,0xf2 @ pmull q4,q12,q7 @ H·Ii+1 - veor q9,q9,q7 @ Karatsuba pre-processing -.byte 0x8f,0xce,0xa9,0xf2 @ pmull2 q6,q12,q7 - b Loop_mod2x_v8 - -.align 4 -Loop_mod2x_v8: - vext.8 q10,q3,q3,#8 - subs r3,r3,#32 @ is there more data? -.byte 0x86,0x0e,0xac,0xf2 @ pmull q0,q14,q3 @ H^2.lo·Xi.lo - movlo r12,#0 @ is it time to zero r12? - -.byte 0xa2,0xae,0xaa,0xf2 @ pmull q5,q13,q9 - veor q10,q10,q3 @ Karatsuba pre-processing -.byte 0x87,0x4e,0xad,0xf2 @ pmull2 q2,q14,q3 @ H^2.hi·Xi.hi - veor q0,q0,q4 @ accumulate -.byte 0xa5,0x2e,0xab,0xf2 @ pmull2 q1,q13,q10 @ (H^2.lo+H^2.hi)·(Xi.lo+Xi.hi) - vld1.64 {q8},[r2],r12 @ load [rotated] I[i+2] - - veor q2,q2,q6 - moveq r12,#0 @ is it time to zero r12? - veor q1,q1,q5 - - vext.8 q9,q0,q2,#8 @ Karatsuba post-processing - veor q10,q0,q2 - veor q1,q1,q9 - vld1.64 {q9},[r2],r12 @ load [rotated] I[i+3] -#ifndef __ARMEB__ - vrev64.8 q8,q8 -#endif - veor q1,q1,q10 -.byte 0x26,0x4e,0xe0,0xf2 @ pmull q10,q0,q11 @ 1st phase of reduction - -#ifndef __ARMEB__ - vrev64.8 q9,q9 -#endif - vmov d4,d3 @ Xh|Xm - 256-bit result - vmov d3,d0 @ Xm is rotated Xl - vext.8 q7,q9,q9,#8 - vext.8 q3,q8,q8,#8 - veor q0,q1,q10 -.byte 0x8e,0x8e,0xa8,0xf2 @ pmull q4,q12,q7 @ H·Ii+1 - veor q3,q3,q2 @ accumulate q3 early - - vext.8 q10,q0,q0,#8 @ 2nd phase of reduction -.byte 0x26,0x0e,0xa0,0xf2 @ pmull q0,q0,q11 - veor q3,q3,q10 - veor q9,q9,q7 @ Karatsuba pre-processing - veor q3,q3,q0 -.byte 0x8f,0xce,0xa9,0xf2 @ pmull2 q6,q12,q7 - bhs Loop_mod2x_v8 @ there was at least 32 more bytes - - veor q2,q2,q10 - vext.8 q3,q8,q8,#8 @ re-construct q3 - adds r3,r3,#32 @ re-construct r3 - veor q0,q0,q2 @ re-construct q0 - beq Ldone_v8 @ is r3 zero? -Lodd_tail_v8: - vext.8 q10,q0,q0,#8 - veor q3,q3,q0 @ inp^=Xi - veor q9,q8,q10 @ q9 is rotated inp^Xi - -.byte 0x86,0x0e,0xa8,0xf2 @ pmull q0,q12,q3 @ H.lo·Xi.lo - veor q9,q9,q3 @ Karatsuba pre-processing -.byte 0x87,0x4e,0xa9,0xf2 @ pmull2 q2,q12,q3 @ H.hi·Xi.hi -.byte 0xa2,0x2e,0xaa,0xf2 @ pmull q1,q13,q9 @ (H.lo+H.hi)·(Xi.lo+Xi.hi) - - vext.8 q9,q0,q2,#8 @ Karatsuba post-processing - veor q10,q0,q2 - veor q1,q1,q9 - veor q1,q1,q10 -.byte 0x26,0x4e,0xe0,0xf2 @ pmull q10,q0,q11 @ 1st phase of reduction - - vmov d4,d3 @ Xh|Xm - 256-bit result - vmov d3,d0 @ Xm is rotated Xl - veor q0,q1,q10 - - vext.8 q10,q0,q0,#8 @ 2nd phase of reduction -.byte 0x26,0x0e,0xa0,0xf2 @ pmull q0,q0,q11 - veor q10,q10,q2 - veor q0,q0,q10 - -Ldone_v8: -#ifndef __ARMEB__ - vrev64.8 q0,q0 -#endif - vext.8 q0,q0,q0,#8 - vst1.64 {q0},[r0] @ write out Xi - - vldmia sp!,{d8,d9,d10,d11,d12,d13,d14,d15} @ 32-bit ABI says so - bx lr - -.byte 71,72,65,83,72,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 -.align 2 -.align 2 -#endif // !OPENSSL_NO_ASM diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ghashv8-armx-ios64.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ghashv8-armx-ios64.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ghashv8-armx-ios64.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ghashv8-armx-ios64.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,246 +0,0 @@ -// This file is generated from a similarly-named Perl script in the BoringSSL -// source tree. Do not edit by hand. - -#if !defined(__has_feature) -#define __has_feature(x) 0 -#endif -#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) -#define OPENSSL_NO_ASM -#endif - -#if !defined(OPENSSL_NO_ASM) -#include - -.text - -.globl _GFp_gcm_init_clmul -.private_extern _GFp_gcm_init_clmul - -.align 4 -_GFp_gcm_init_clmul: - AARCH64_VALID_CALL_TARGET - ld1 {v17.2d},[x1] //load input H - movi v19.16b,#0xe1 - shl v19.2d,v19.2d,#57 //0xc2.0 - ext v3.16b,v17.16b,v17.16b,#8 - ushr v18.2d,v19.2d,#63 - dup v17.4s,v17.s[1] - ext v16.16b,v18.16b,v19.16b,#8 //t0=0xc2....01 - ushr v18.2d,v3.2d,#63 - sshr v17.4s,v17.4s,#31 //broadcast carry bit - and v18.16b,v18.16b,v16.16b - shl v3.2d,v3.2d,#1 - ext v18.16b,v18.16b,v18.16b,#8 - and v16.16b,v16.16b,v17.16b - orr v3.16b,v3.16b,v18.16b //H<<<=1 - eor v20.16b,v3.16b,v16.16b //twisted H - st1 {v20.2d},[x0],#16 //store Htable[0] - - //calculate H^2 - ext v16.16b,v20.16b,v20.16b,#8 //Karatsuba pre-processing - pmull v0.1q,v20.1d,v20.1d - eor v16.16b,v16.16b,v20.16b - pmull2 v2.1q,v20.2d,v20.2d - pmull v1.1q,v16.1d,v16.1d - - ext v17.16b,v0.16b,v2.16b,#8 //Karatsuba post-processing - eor v18.16b,v0.16b,v2.16b - eor v1.16b,v1.16b,v17.16b - eor v1.16b,v1.16b,v18.16b - pmull v18.1q,v0.1d,v19.1d //1st phase - - ins v2.d[0],v1.d[1] - ins v1.d[1],v0.d[0] - eor v0.16b,v1.16b,v18.16b - - ext v18.16b,v0.16b,v0.16b,#8 //2nd phase - pmull v0.1q,v0.1d,v19.1d - eor v18.16b,v18.16b,v2.16b - eor v22.16b,v0.16b,v18.16b - - ext v17.16b,v22.16b,v22.16b,#8 //Karatsuba pre-processing - eor v17.16b,v17.16b,v22.16b - ext v21.16b,v16.16b,v17.16b,#8 //pack Karatsuba pre-processed - st1 {v21.2d,v22.2d},[x0] //store Htable[1..2] - - ret - -.globl _GFp_gcm_gmult_clmul -.private_extern _GFp_gcm_gmult_clmul - -.align 4 -_GFp_gcm_gmult_clmul: - AARCH64_VALID_CALL_TARGET - ld1 {v17.2d},[x0] //load Xi - movi v19.16b,#0xe1 - ld1 {v20.2d,v21.2d},[x1] //load twisted H, ... - shl v19.2d,v19.2d,#57 -#ifndef __ARMEB__ - rev64 v17.16b,v17.16b -#endif - ext v3.16b,v17.16b,v17.16b,#8 - - pmull v0.1q,v20.1d,v3.1d //H.lo·Xi.lo - eor v17.16b,v17.16b,v3.16b //Karatsuba pre-processing - pmull2 v2.1q,v20.2d,v3.2d //H.hi·Xi.hi - pmull v1.1q,v21.1d,v17.1d //(H.lo+H.hi)·(Xi.lo+Xi.hi) - - ext v17.16b,v0.16b,v2.16b,#8 //Karatsuba post-processing - eor v18.16b,v0.16b,v2.16b - eor v1.16b,v1.16b,v17.16b - eor v1.16b,v1.16b,v18.16b - pmull v18.1q,v0.1d,v19.1d //1st phase of reduction - - ins v2.d[0],v1.d[1] - ins v1.d[1],v0.d[0] - eor v0.16b,v1.16b,v18.16b - - ext v18.16b,v0.16b,v0.16b,#8 //2nd phase of reduction - pmull v0.1q,v0.1d,v19.1d - eor v18.16b,v18.16b,v2.16b - eor v0.16b,v0.16b,v18.16b - -#ifndef __ARMEB__ - rev64 v0.16b,v0.16b -#endif - ext v0.16b,v0.16b,v0.16b,#8 - st1 {v0.2d},[x0] //write out Xi - - ret - -.globl _GFp_gcm_ghash_clmul -.private_extern _GFp_gcm_ghash_clmul - -.align 4 -_GFp_gcm_ghash_clmul: - AARCH64_VALID_CALL_TARGET - ld1 {v0.2d},[x0] //load [rotated] Xi - //"[rotated]" means that - //loaded value would have - //to be rotated in order to - //make it appear as in - //algorithm specification - subs x3,x3,#32 //see if x3 is 32 or larger - mov x12,#16 //x12 is used as post- - //increment for input pointer; - //as loop is modulo-scheduled - //x12 is zeroed just in time - //to preclude overstepping - //inp[len], which means that - //last block[s] are actually - //loaded twice, but last - //copy is not processed - ld1 {v20.2d,v21.2d},[x1],#32 //load twisted H, ..., H^2 - movi v19.16b,#0xe1 - ld1 {v22.2d},[x1] - csel x12,xzr,x12,eq //is it time to zero x12? - ext v0.16b,v0.16b,v0.16b,#8 //rotate Xi - ld1 {v16.2d},[x2],#16 //load [rotated] I[0] - shl v19.2d,v19.2d,#57 //compose 0xc2.0 constant -#ifndef __ARMEB__ - rev64 v16.16b,v16.16b - rev64 v0.16b,v0.16b -#endif - ext v3.16b,v16.16b,v16.16b,#8 //rotate I[0] - b.lo Lodd_tail_v8 //x3 was less than 32 - ld1 {v17.2d},[x2],x12 //load [rotated] I[1] -#ifndef __ARMEB__ - rev64 v17.16b,v17.16b -#endif - ext v7.16b,v17.16b,v17.16b,#8 - eor v3.16b,v3.16b,v0.16b //I[i]^=Xi - pmull v4.1q,v20.1d,v7.1d //H·Ii+1 - eor v17.16b,v17.16b,v7.16b //Karatsuba pre-processing - pmull2 v6.1q,v20.2d,v7.2d - b Loop_mod2x_v8 - -.align 4 -Loop_mod2x_v8: - ext v18.16b,v3.16b,v3.16b,#8 - subs x3,x3,#32 //is there more data? - pmull v0.1q,v22.1d,v3.1d //H^2.lo·Xi.lo - csel x12,xzr,x12,lo //is it time to zero x12? - - pmull v5.1q,v21.1d,v17.1d - eor v18.16b,v18.16b,v3.16b //Karatsuba pre-processing - pmull2 v2.1q,v22.2d,v3.2d //H^2.hi·Xi.hi - eor v0.16b,v0.16b,v4.16b //accumulate - pmull2 v1.1q,v21.2d,v18.2d //(H^2.lo+H^2.hi)·(Xi.lo+Xi.hi) - ld1 {v16.2d},[x2],x12 //load [rotated] I[i+2] - - eor v2.16b,v2.16b,v6.16b - csel x12,xzr,x12,eq //is it time to zero x12? - eor v1.16b,v1.16b,v5.16b - - ext v17.16b,v0.16b,v2.16b,#8 //Karatsuba post-processing - eor v18.16b,v0.16b,v2.16b - eor v1.16b,v1.16b,v17.16b - ld1 {v17.2d},[x2],x12 //load [rotated] I[i+3] -#ifndef __ARMEB__ - rev64 v16.16b,v16.16b -#endif - eor v1.16b,v1.16b,v18.16b - pmull v18.1q,v0.1d,v19.1d //1st phase of reduction - -#ifndef __ARMEB__ - rev64 v17.16b,v17.16b -#endif - ins v2.d[0],v1.d[1] - ins v1.d[1],v0.d[0] - ext v7.16b,v17.16b,v17.16b,#8 - ext v3.16b,v16.16b,v16.16b,#8 - eor v0.16b,v1.16b,v18.16b - pmull v4.1q,v20.1d,v7.1d //H·Ii+1 - eor v3.16b,v3.16b,v2.16b //accumulate v3.16b early - - ext v18.16b,v0.16b,v0.16b,#8 //2nd phase of reduction - pmull v0.1q,v0.1d,v19.1d - eor v3.16b,v3.16b,v18.16b - eor v17.16b,v17.16b,v7.16b //Karatsuba pre-processing - eor v3.16b,v3.16b,v0.16b - pmull2 v6.1q,v20.2d,v7.2d - b.hs Loop_mod2x_v8 //there was at least 32 more bytes - - eor v2.16b,v2.16b,v18.16b - ext v3.16b,v16.16b,v16.16b,#8 //re-construct v3.16b - adds x3,x3,#32 //re-construct x3 - eor v0.16b,v0.16b,v2.16b //re-construct v0.16b - b.eq Ldone_v8 //is x3 zero? -Lodd_tail_v8: - ext v18.16b,v0.16b,v0.16b,#8 - eor v3.16b,v3.16b,v0.16b //inp^=Xi - eor v17.16b,v16.16b,v18.16b //v17.16b is rotated inp^Xi - - pmull v0.1q,v20.1d,v3.1d //H.lo·Xi.lo - eor v17.16b,v17.16b,v3.16b //Karatsuba pre-processing - pmull2 v2.1q,v20.2d,v3.2d //H.hi·Xi.hi - pmull v1.1q,v21.1d,v17.1d //(H.lo+H.hi)·(Xi.lo+Xi.hi) - - ext v17.16b,v0.16b,v2.16b,#8 //Karatsuba post-processing - eor v18.16b,v0.16b,v2.16b - eor v1.16b,v1.16b,v17.16b - eor v1.16b,v1.16b,v18.16b - pmull v18.1q,v0.1d,v19.1d //1st phase of reduction - - ins v2.d[0],v1.d[1] - ins v1.d[1],v0.d[0] - eor v0.16b,v1.16b,v18.16b - - ext v18.16b,v0.16b,v0.16b,#8 //2nd phase of reduction - pmull v0.1q,v0.1d,v19.1d - eor v18.16b,v18.16b,v2.16b - eor v0.16b,v0.16b,v18.16b - -Ldone_v8: -#ifndef __ARMEB__ - rev64 v0.16b,v0.16b -#endif - ext v0.16b,v0.16b,v0.16b,#8 - st1 {v0.2d},[x0] //write out Xi - - ret - -.byte 71,72,65,83,72,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 -.align 2 -.align 2 -#endif // !OPENSSL_NO_ASM diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ghashv8-armx-linux32.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ghashv8-armx-linux32.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ghashv8-armx-linux32.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ghashv8-armx-linux32.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,253 +0,0 @@ -// This file is generated from a similarly-named Perl script in the BoringSSL -// source tree. Do not edit by hand. - -#if !defined(__has_feature) -#define __has_feature(x) 0 -#endif -#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) -#define OPENSSL_NO_ASM -#endif - -#if !defined(OPENSSL_NO_ASM) -#if defined(__arm__) -#include - -.text -.fpu neon -.code 32 -#undef __thumb2__ -.globl GFp_gcm_init_clmul -.hidden GFp_gcm_init_clmul -.type GFp_gcm_init_clmul,%function -.align 4 -GFp_gcm_init_clmul: - AARCH64_VALID_CALL_TARGET - vld1.64 {q9},[r1] @ load input H - vmov.i8 q11,#0xe1 - vshl.i64 q11,q11,#57 @ 0xc2.0 - vext.8 q3,q9,q9,#8 - vshr.u64 q10,q11,#63 - vdup.32 q9,d18[1] - vext.8 q8,q10,q11,#8 @ t0=0xc2....01 - vshr.u64 q10,q3,#63 - vshr.s32 q9,q9,#31 @ broadcast carry bit - vand q10,q10,q8 - vshl.i64 q3,q3,#1 - vext.8 q10,q10,q10,#8 - vand q8,q8,q9 - vorr q3,q3,q10 @ H<<<=1 - veor q12,q3,q8 @ twisted H - vst1.64 {q12},[r0]! @ store Htable[0] - - @ calculate H^2 - vext.8 q8,q12,q12,#8 @ Karatsuba pre-processing -.byte 0xa8,0x0e,0xa8,0xf2 @ pmull q0,q12,q12 - veor q8,q8,q12 -.byte 0xa9,0x4e,0xa9,0xf2 @ pmull2 q2,q12,q12 -.byte 0xa0,0x2e,0xa0,0xf2 @ pmull q1,q8,q8 - - vext.8 q9,q0,q2,#8 @ Karatsuba post-processing - veor q10,q0,q2 - veor q1,q1,q9 - veor q1,q1,q10 -.byte 0x26,0x4e,0xe0,0xf2 @ pmull q10,q0,q11 @ 1st phase - - vmov d4,d3 @ Xh|Xm - 256-bit result - vmov d3,d0 @ Xm is rotated Xl - veor q0,q1,q10 - - vext.8 q10,q0,q0,#8 @ 2nd phase -.byte 0x26,0x0e,0xa0,0xf2 @ pmull q0,q0,q11 - veor q10,q10,q2 - veor q14,q0,q10 - - vext.8 q9,q14,q14,#8 @ Karatsuba pre-processing - veor q9,q9,q14 - vext.8 q13,q8,q9,#8 @ pack Karatsuba pre-processed - vst1.64 {q13,q14},[r0] @ store Htable[1..2] - - bx lr -.size GFp_gcm_init_clmul,.-GFp_gcm_init_clmul -.globl GFp_gcm_gmult_clmul -.hidden GFp_gcm_gmult_clmul -.type GFp_gcm_gmult_clmul,%function -.align 4 -GFp_gcm_gmult_clmul: - AARCH64_VALID_CALL_TARGET - vld1.64 {q9},[r0] @ load Xi - vmov.i8 q11,#0xe1 - vld1.64 {q12,q13},[r1] @ load twisted H, ... - vshl.u64 q11,q11,#57 -#ifndef __ARMEB__ - vrev64.8 q9,q9 -#endif - vext.8 q3,q9,q9,#8 - -.byte 0x86,0x0e,0xa8,0xf2 @ pmull q0,q12,q3 @ H.lo·Xi.lo - veor q9,q9,q3 @ Karatsuba pre-processing -.byte 0x87,0x4e,0xa9,0xf2 @ pmull2 q2,q12,q3 @ H.hi·Xi.hi -.byte 0xa2,0x2e,0xaa,0xf2 @ pmull q1,q13,q9 @ (H.lo+H.hi)·(Xi.lo+Xi.hi) - - vext.8 q9,q0,q2,#8 @ Karatsuba post-processing - veor q10,q0,q2 - veor q1,q1,q9 - veor q1,q1,q10 -.byte 0x26,0x4e,0xe0,0xf2 @ pmull q10,q0,q11 @ 1st phase of reduction - - vmov d4,d3 @ Xh|Xm - 256-bit result - vmov d3,d0 @ Xm is rotated Xl - veor q0,q1,q10 - - vext.8 q10,q0,q0,#8 @ 2nd phase of reduction -.byte 0x26,0x0e,0xa0,0xf2 @ pmull q0,q0,q11 - veor q10,q10,q2 - veor q0,q0,q10 - -#ifndef __ARMEB__ - vrev64.8 q0,q0 -#endif - vext.8 q0,q0,q0,#8 - vst1.64 {q0},[r0] @ write out Xi - - bx lr -.size GFp_gcm_gmult_clmul,.-GFp_gcm_gmult_clmul -.globl GFp_gcm_ghash_clmul -.hidden GFp_gcm_ghash_clmul -.type GFp_gcm_ghash_clmul,%function -.align 4 -GFp_gcm_ghash_clmul: - AARCH64_VALID_CALL_TARGET - vstmdb sp!,{d8,d9,d10,d11,d12,d13,d14,d15} @ 32-bit ABI says so - vld1.64 {q0},[r0] @ load [rotated] Xi - @ "[rotated]" means that - @ loaded value would have - @ to be rotated in order to - @ make it appear as in - @ algorithm specification - subs r3,r3,#32 @ see if r3 is 32 or larger - mov r12,#16 @ r12 is used as post- - @ increment for input pointer; - @ as loop is modulo-scheduled - @ r12 is zeroed just in time - @ to preclude overstepping - @ inp[len], which means that - @ last block[s] are actually - @ loaded twice, but last - @ copy is not processed - vld1.64 {q12,q13},[r1]! @ load twisted H, ..., H^2 - vmov.i8 q11,#0xe1 - vld1.64 {q14},[r1] - moveq r12,#0 @ is it time to zero r12? - vext.8 q0,q0,q0,#8 @ rotate Xi - vld1.64 {q8},[r2]! @ load [rotated] I[0] - vshl.u64 q11,q11,#57 @ compose 0xc2.0 constant -#ifndef __ARMEB__ - vrev64.8 q8,q8 - vrev64.8 q0,q0 -#endif - vext.8 q3,q8,q8,#8 @ rotate I[0] - blo .Lodd_tail_v8 @ r3 was less than 32 - vld1.64 {q9},[r2],r12 @ load [rotated] I[1] -#ifndef __ARMEB__ - vrev64.8 q9,q9 -#endif - vext.8 q7,q9,q9,#8 - veor q3,q3,q0 @ I[i]^=Xi -.byte 0x8e,0x8e,0xa8,0xf2 @ pmull q4,q12,q7 @ H·Ii+1 - veor q9,q9,q7 @ Karatsuba pre-processing -.byte 0x8f,0xce,0xa9,0xf2 @ pmull2 q6,q12,q7 - b .Loop_mod2x_v8 - -.align 4 -.Loop_mod2x_v8: - vext.8 q10,q3,q3,#8 - subs r3,r3,#32 @ is there more data? -.byte 0x86,0x0e,0xac,0xf2 @ pmull q0,q14,q3 @ H^2.lo·Xi.lo - movlo r12,#0 @ is it time to zero r12? - -.byte 0xa2,0xae,0xaa,0xf2 @ pmull q5,q13,q9 - veor q10,q10,q3 @ Karatsuba pre-processing -.byte 0x87,0x4e,0xad,0xf2 @ pmull2 q2,q14,q3 @ H^2.hi·Xi.hi - veor q0,q0,q4 @ accumulate -.byte 0xa5,0x2e,0xab,0xf2 @ pmull2 q1,q13,q10 @ (H^2.lo+H^2.hi)·(Xi.lo+Xi.hi) - vld1.64 {q8},[r2],r12 @ load [rotated] I[i+2] - - veor q2,q2,q6 - moveq r12,#0 @ is it time to zero r12? - veor q1,q1,q5 - - vext.8 q9,q0,q2,#8 @ Karatsuba post-processing - veor q10,q0,q2 - veor q1,q1,q9 - vld1.64 {q9},[r2],r12 @ load [rotated] I[i+3] -#ifndef __ARMEB__ - vrev64.8 q8,q8 -#endif - veor q1,q1,q10 -.byte 0x26,0x4e,0xe0,0xf2 @ pmull q10,q0,q11 @ 1st phase of reduction - -#ifndef __ARMEB__ - vrev64.8 q9,q9 -#endif - vmov d4,d3 @ Xh|Xm - 256-bit result - vmov d3,d0 @ Xm is rotated Xl - vext.8 q7,q9,q9,#8 - vext.8 q3,q8,q8,#8 - veor q0,q1,q10 -.byte 0x8e,0x8e,0xa8,0xf2 @ pmull q4,q12,q7 @ H·Ii+1 - veor q3,q3,q2 @ accumulate q3 early - - vext.8 q10,q0,q0,#8 @ 2nd phase of reduction -.byte 0x26,0x0e,0xa0,0xf2 @ pmull q0,q0,q11 - veor q3,q3,q10 - veor q9,q9,q7 @ Karatsuba pre-processing - veor q3,q3,q0 -.byte 0x8f,0xce,0xa9,0xf2 @ pmull2 q6,q12,q7 - bhs .Loop_mod2x_v8 @ there was at least 32 more bytes - - veor q2,q2,q10 - vext.8 q3,q8,q8,#8 @ re-construct q3 - adds r3,r3,#32 @ re-construct r3 - veor q0,q0,q2 @ re-construct q0 - beq .Ldone_v8 @ is r3 zero? -.Lodd_tail_v8: - vext.8 q10,q0,q0,#8 - veor q3,q3,q0 @ inp^=Xi - veor q9,q8,q10 @ q9 is rotated inp^Xi - -.byte 0x86,0x0e,0xa8,0xf2 @ pmull q0,q12,q3 @ H.lo·Xi.lo - veor q9,q9,q3 @ Karatsuba pre-processing -.byte 0x87,0x4e,0xa9,0xf2 @ pmull2 q2,q12,q3 @ H.hi·Xi.hi -.byte 0xa2,0x2e,0xaa,0xf2 @ pmull q1,q13,q9 @ (H.lo+H.hi)·(Xi.lo+Xi.hi) - - vext.8 q9,q0,q2,#8 @ Karatsuba post-processing - veor q10,q0,q2 - veor q1,q1,q9 - veor q1,q1,q10 -.byte 0x26,0x4e,0xe0,0xf2 @ pmull q10,q0,q11 @ 1st phase of reduction - - vmov d4,d3 @ Xh|Xm - 256-bit result - vmov d3,d0 @ Xm is rotated Xl - veor q0,q1,q10 - - vext.8 q10,q0,q0,#8 @ 2nd phase of reduction -.byte 0x26,0x0e,0xa0,0xf2 @ pmull q0,q0,q11 - veor q10,q10,q2 - veor q0,q0,q10 - -.Ldone_v8: -#ifndef __ARMEB__ - vrev64.8 q0,q0 -#endif - vext.8 q0,q0,q0,#8 - vst1.64 {q0},[r0] @ write out Xi - - vldmia sp!,{d8,d9,d10,d11,d12,d13,d14,d15} @ 32-bit ABI says so - bx lr -.size GFp_gcm_ghash_clmul,.-GFp_gcm_ghash_clmul -.byte 71,72,65,83,72,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 -.align 2 -.align 2 -#endif -#endif // !OPENSSL_NO_ASM -.section .note.GNU-stack,"",%progbits diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ghashv8-armx-linux64.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ghashv8-armx-linux64.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ghashv8-armx-linux64.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ghashv8-armx-linux64.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,249 +0,0 @@ -// This file is generated from a similarly-named Perl script in the BoringSSL -// source tree. Do not edit by hand. - -#if !defined(__has_feature) -#define __has_feature(x) 0 -#endif -#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) -#define OPENSSL_NO_ASM -#endif - -#if !defined(OPENSSL_NO_ASM) -#if defined(__aarch64__) -#include - -.text -.arch armv8-a+crypto -.globl GFp_gcm_init_clmul -.hidden GFp_gcm_init_clmul -.type GFp_gcm_init_clmul,%function -.align 4 -GFp_gcm_init_clmul: - AARCH64_VALID_CALL_TARGET - ld1 {v17.2d},[x1] //load input H - movi v19.16b,#0xe1 - shl v19.2d,v19.2d,#57 //0xc2.0 - ext v3.16b,v17.16b,v17.16b,#8 - ushr v18.2d,v19.2d,#63 - dup v17.4s,v17.s[1] - ext v16.16b,v18.16b,v19.16b,#8 //t0=0xc2....01 - ushr v18.2d,v3.2d,#63 - sshr v17.4s,v17.4s,#31 //broadcast carry bit - and v18.16b,v18.16b,v16.16b - shl v3.2d,v3.2d,#1 - ext v18.16b,v18.16b,v18.16b,#8 - and v16.16b,v16.16b,v17.16b - orr v3.16b,v3.16b,v18.16b //H<<<=1 - eor v20.16b,v3.16b,v16.16b //twisted H - st1 {v20.2d},[x0],#16 //store Htable[0] - - //calculate H^2 - ext v16.16b,v20.16b,v20.16b,#8 //Karatsuba pre-processing - pmull v0.1q,v20.1d,v20.1d - eor v16.16b,v16.16b,v20.16b - pmull2 v2.1q,v20.2d,v20.2d - pmull v1.1q,v16.1d,v16.1d - - ext v17.16b,v0.16b,v2.16b,#8 //Karatsuba post-processing - eor v18.16b,v0.16b,v2.16b - eor v1.16b,v1.16b,v17.16b - eor v1.16b,v1.16b,v18.16b - pmull v18.1q,v0.1d,v19.1d //1st phase - - ins v2.d[0],v1.d[1] - ins v1.d[1],v0.d[0] - eor v0.16b,v1.16b,v18.16b - - ext v18.16b,v0.16b,v0.16b,#8 //2nd phase - pmull v0.1q,v0.1d,v19.1d - eor v18.16b,v18.16b,v2.16b - eor v22.16b,v0.16b,v18.16b - - ext v17.16b,v22.16b,v22.16b,#8 //Karatsuba pre-processing - eor v17.16b,v17.16b,v22.16b - ext v21.16b,v16.16b,v17.16b,#8 //pack Karatsuba pre-processed - st1 {v21.2d,v22.2d},[x0] //store Htable[1..2] - - ret -.size GFp_gcm_init_clmul,.-GFp_gcm_init_clmul -.globl GFp_gcm_gmult_clmul -.hidden GFp_gcm_gmult_clmul -.type GFp_gcm_gmult_clmul,%function -.align 4 -GFp_gcm_gmult_clmul: - AARCH64_VALID_CALL_TARGET - ld1 {v17.2d},[x0] //load Xi - movi v19.16b,#0xe1 - ld1 {v20.2d,v21.2d},[x1] //load twisted H, ... - shl v19.2d,v19.2d,#57 -#ifndef __ARMEB__ - rev64 v17.16b,v17.16b -#endif - ext v3.16b,v17.16b,v17.16b,#8 - - pmull v0.1q,v20.1d,v3.1d //H.lo·Xi.lo - eor v17.16b,v17.16b,v3.16b //Karatsuba pre-processing - pmull2 v2.1q,v20.2d,v3.2d //H.hi·Xi.hi - pmull v1.1q,v21.1d,v17.1d //(H.lo+H.hi)·(Xi.lo+Xi.hi) - - ext v17.16b,v0.16b,v2.16b,#8 //Karatsuba post-processing - eor v18.16b,v0.16b,v2.16b - eor v1.16b,v1.16b,v17.16b - eor v1.16b,v1.16b,v18.16b - pmull v18.1q,v0.1d,v19.1d //1st phase of reduction - - ins v2.d[0],v1.d[1] - ins v1.d[1],v0.d[0] - eor v0.16b,v1.16b,v18.16b - - ext v18.16b,v0.16b,v0.16b,#8 //2nd phase of reduction - pmull v0.1q,v0.1d,v19.1d - eor v18.16b,v18.16b,v2.16b - eor v0.16b,v0.16b,v18.16b - -#ifndef __ARMEB__ - rev64 v0.16b,v0.16b -#endif - ext v0.16b,v0.16b,v0.16b,#8 - st1 {v0.2d},[x0] //write out Xi - - ret -.size GFp_gcm_gmult_clmul,.-GFp_gcm_gmult_clmul -.globl GFp_gcm_ghash_clmul -.hidden GFp_gcm_ghash_clmul -.type GFp_gcm_ghash_clmul,%function -.align 4 -GFp_gcm_ghash_clmul: - AARCH64_VALID_CALL_TARGET - ld1 {v0.2d},[x0] //load [rotated] Xi - //"[rotated]" means that - //loaded value would have - //to be rotated in order to - //make it appear as in - //algorithm specification - subs x3,x3,#32 //see if x3 is 32 or larger - mov x12,#16 //x12 is used as post- - //increment for input pointer; - //as loop is modulo-scheduled - //x12 is zeroed just in time - //to preclude overstepping - //inp[len], which means that - //last block[s] are actually - //loaded twice, but last - //copy is not processed - ld1 {v20.2d,v21.2d},[x1],#32 //load twisted H, ..., H^2 - movi v19.16b,#0xe1 - ld1 {v22.2d},[x1] - csel x12,xzr,x12,eq //is it time to zero x12? - ext v0.16b,v0.16b,v0.16b,#8 //rotate Xi - ld1 {v16.2d},[x2],#16 //load [rotated] I[0] - shl v19.2d,v19.2d,#57 //compose 0xc2.0 constant -#ifndef __ARMEB__ - rev64 v16.16b,v16.16b - rev64 v0.16b,v0.16b -#endif - ext v3.16b,v16.16b,v16.16b,#8 //rotate I[0] - b.lo .Lodd_tail_v8 //x3 was less than 32 - ld1 {v17.2d},[x2],x12 //load [rotated] I[1] -#ifndef __ARMEB__ - rev64 v17.16b,v17.16b -#endif - ext v7.16b,v17.16b,v17.16b,#8 - eor v3.16b,v3.16b,v0.16b //I[i]^=Xi - pmull v4.1q,v20.1d,v7.1d //H·Ii+1 - eor v17.16b,v17.16b,v7.16b //Karatsuba pre-processing - pmull2 v6.1q,v20.2d,v7.2d - b .Loop_mod2x_v8 - -.align 4 -.Loop_mod2x_v8: - ext v18.16b,v3.16b,v3.16b,#8 - subs x3,x3,#32 //is there more data? - pmull v0.1q,v22.1d,v3.1d //H^2.lo·Xi.lo - csel x12,xzr,x12,lo //is it time to zero x12? - - pmull v5.1q,v21.1d,v17.1d - eor v18.16b,v18.16b,v3.16b //Karatsuba pre-processing - pmull2 v2.1q,v22.2d,v3.2d //H^2.hi·Xi.hi - eor v0.16b,v0.16b,v4.16b //accumulate - pmull2 v1.1q,v21.2d,v18.2d //(H^2.lo+H^2.hi)·(Xi.lo+Xi.hi) - ld1 {v16.2d},[x2],x12 //load [rotated] I[i+2] - - eor v2.16b,v2.16b,v6.16b - csel x12,xzr,x12,eq //is it time to zero x12? - eor v1.16b,v1.16b,v5.16b - - ext v17.16b,v0.16b,v2.16b,#8 //Karatsuba post-processing - eor v18.16b,v0.16b,v2.16b - eor v1.16b,v1.16b,v17.16b - ld1 {v17.2d},[x2],x12 //load [rotated] I[i+3] -#ifndef __ARMEB__ - rev64 v16.16b,v16.16b -#endif - eor v1.16b,v1.16b,v18.16b - pmull v18.1q,v0.1d,v19.1d //1st phase of reduction - -#ifndef __ARMEB__ - rev64 v17.16b,v17.16b -#endif - ins v2.d[0],v1.d[1] - ins v1.d[1],v0.d[0] - ext v7.16b,v17.16b,v17.16b,#8 - ext v3.16b,v16.16b,v16.16b,#8 - eor v0.16b,v1.16b,v18.16b - pmull v4.1q,v20.1d,v7.1d //H·Ii+1 - eor v3.16b,v3.16b,v2.16b //accumulate v3.16b early - - ext v18.16b,v0.16b,v0.16b,#8 //2nd phase of reduction - pmull v0.1q,v0.1d,v19.1d - eor v3.16b,v3.16b,v18.16b - eor v17.16b,v17.16b,v7.16b //Karatsuba pre-processing - eor v3.16b,v3.16b,v0.16b - pmull2 v6.1q,v20.2d,v7.2d - b.hs .Loop_mod2x_v8 //there was at least 32 more bytes - - eor v2.16b,v2.16b,v18.16b - ext v3.16b,v16.16b,v16.16b,#8 //re-construct v3.16b - adds x3,x3,#32 //re-construct x3 - eor v0.16b,v0.16b,v2.16b //re-construct v0.16b - b.eq .Ldone_v8 //is x3 zero? -.Lodd_tail_v8: - ext v18.16b,v0.16b,v0.16b,#8 - eor v3.16b,v3.16b,v0.16b //inp^=Xi - eor v17.16b,v16.16b,v18.16b //v17.16b is rotated inp^Xi - - pmull v0.1q,v20.1d,v3.1d //H.lo·Xi.lo - eor v17.16b,v17.16b,v3.16b //Karatsuba pre-processing - pmull2 v2.1q,v20.2d,v3.2d //H.hi·Xi.hi - pmull v1.1q,v21.1d,v17.1d //(H.lo+H.hi)·(Xi.lo+Xi.hi) - - ext v17.16b,v0.16b,v2.16b,#8 //Karatsuba post-processing - eor v18.16b,v0.16b,v2.16b - eor v1.16b,v1.16b,v17.16b - eor v1.16b,v1.16b,v18.16b - pmull v18.1q,v0.1d,v19.1d //1st phase of reduction - - ins v2.d[0],v1.d[1] - ins v1.d[1],v0.d[0] - eor v0.16b,v1.16b,v18.16b - - ext v18.16b,v0.16b,v0.16b,#8 //2nd phase of reduction - pmull v0.1q,v0.1d,v19.1d - eor v18.16b,v18.16b,v2.16b - eor v0.16b,v0.16b,v18.16b - -.Ldone_v8: -#ifndef __ARMEB__ - rev64 v0.16b,v0.16b -#endif - ext v0.16b,v0.16b,v0.16b,#8 - st1 {v0.2d},[x0] //write out Xi - - ret -.size GFp_gcm_ghash_clmul,.-GFp_gcm_ghash_clmul -.byte 71,72,65,83,72,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 -.align 2 -.align 2 -#endif -#endif // !OPENSSL_NO_ASM -.section .note.GNU-stack,"",%progbits diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ghash-x86_64-elf.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ghash-x86_64-elf.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ghash-x86_64-elf.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ghash-x86_64-elf.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,1115 +0,0 @@ -# This file is generated from a similarly-named Perl script in the BoringSSL -# source tree. Do not edit by hand. - -#if defined(__has_feature) -#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) -#define OPENSSL_NO_ASM -#endif -#endif - -#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) -.text -.extern GFp_ia32cap_P -.hidden GFp_ia32cap_P -.globl GFp_gcm_init_clmul -.hidden GFp_gcm_init_clmul -.type GFp_gcm_init_clmul,@function -.align 16 -GFp_gcm_init_clmul: -.cfi_startproc -.L_init_clmul: - movdqu (%rsi),%xmm2 - pshufd $78,%xmm2,%xmm2 - - - pshufd $255,%xmm2,%xmm4 - movdqa %xmm2,%xmm3 - psllq $1,%xmm2 - pxor %xmm5,%xmm5 - psrlq $63,%xmm3 - pcmpgtd %xmm4,%xmm5 - pslldq $8,%xmm3 - por %xmm3,%xmm2 - - - pand .L0x1c2_polynomial(%rip),%xmm5 - pxor %xmm5,%xmm2 - - - pshufd $78,%xmm2,%xmm6 - movdqa %xmm2,%xmm0 - pxor %xmm2,%xmm6 - movdqa %xmm0,%xmm1 - pshufd $78,%xmm0,%xmm3 - pxor %xmm0,%xmm3 -.byte 102,15,58,68,194,0 -.byte 102,15,58,68,202,17 -.byte 102,15,58,68,222,0 - pxor %xmm0,%xmm3 - pxor %xmm1,%xmm3 - - movdqa %xmm3,%xmm4 - psrldq $8,%xmm3 - pslldq $8,%xmm4 - pxor %xmm3,%xmm1 - pxor %xmm4,%xmm0 - - movdqa %xmm0,%xmm4 - movdqa %xmm0,%xmm3 - psllq $5,%xmm0 - pxor %xmm0,%xmm3 - psllq $1,%xmm0 - pxor %xmm3,%xmm0 - psllq $57,%xmm0 - movdqa %xmm0,%xmm3 - pslldq $8,%xmm0 - psrldq $8,%xmm3 - pxor %xmm4,%xmm0 - pxor %xmm3,%xmm1 - - - movdqa %xmm0,%xmm4 - psrlq $1,%xmm0 - pxor %xmm4,%xmm1 - pxor %xmm0,%xmm4 - psrlq $5,%xmm0 - pxor %xmm4,%xmm0 - psrlq $1,%xmm0 - pxor %xmm1,%xmm0 - pshufd $78,%xmm2,%xmm3 - pshufd $78,%xmm0,%xmm4 - pxor %xmm2,%xmm3 - movdqu %xmm2,0(%rdi) - pxor %xmm0,%xmm4 - movdqu %xmm0,16(%rdi) -.byte 102,15,58,15,227,8 - movdqu %xmm4,32(%rdi) - movdqa %xmm0,%xmm1 - pshufd $78,%xmm0,%xmm3 - pxor %xmm0,%xmm3 -.byte 102,15,58,68,194,0 -.byte 102,15,58,68,202,17 -.byte 102,15,58,68,222,0 - pxor %xmm0,%xmm3 - pxor %xmm1,%xmm3 - - movdqa %xmm3,%xmm4 - psrldq $8,%xmm3 - pslldq $8,%xmm4 - pxor %xmm3,%xmm1 - pxor %xmm4,%xmm0 - - movdqa %xmm0,%xmm4 - movdqa %xmm0,%xmm3 - psllq $5,%xmm0 - pxor %xmm0,%xmm3 - psllq $1,%xmm0 - pxor %xmm3,%xmm0 - psllq $57,%xmm0 - movdqa %xmm0,%xmm3 - pslldq $8,%xmm0 - psrldq $8,%xmm3 - pxor %xmm4,%xmm0 - pxor %xmm3,%xmm1 - - - movdqa %xmm0,%xmm4 - psrlq $1,%xmm0 - pxor %xmm4,%xmm1 - pxor %xmm0,%xmm4 - psrlq $5,%xmm0 - pxor %xmm4,%xmm0 - psrlq $1,%xmm0 - pxor %xmm1,%xmm0 - movdqa %xmm0,%xmm5 - movdqa %xmm0,%xmm1 - pshufd $78,%xmm0,%xmm3 - pxor %xmm0,%xmm3 -.byte 102,15,58,68,194,0 -.byte 102,15,58,68,202,17 -.byte 102,15,58,68,222,0 - pxor %xmm0,%xmm3 - pxor %xmm1,%xmm3 - - movdqa %xmm3,%xmm4 - psrldq $8,%xmm3 - pslldq $8,%xmm4 - pxor %xmm3,%xmm1 - pxor %xmm4,%xmm0 - - movdqa %xmm0,%xmm4 - movdqa %xmm0,%xmm3 - psllq $5,%xmm0 - pxor %xmm0,%xmm3 - psllq $1,%xmm0 - pxor %xmm3,%xmm0 - psllq $57,%xmm0 - movdqa %xmm0,%xmm3 - pslldq $8,%xmm0 - psrldq $8,%xmm3 - pxor %xmm4,%xmm0 - pxor %xmm3,%xmm1 - - - movdqa %xmm0,%xmm4 - psrlq $1,%xmm0 - pxor %xmm4,%xmm1 - pxor %xmm0,%xmm4 - psrlq $5,%xmm0 - pxor %xmm4,%xmm0 - psrlq $1,%xmm0 - pxor %xmm1,%xmm0 - pshufd $78,%xmm5,%xmm3 - pshufd $78,%xmm0,%xmm4 - pxor %xmm5,%xmm3 - movdqu %xmm5,48(%rdi) - pxor %xmm0,%xmm4 - movdqu %xmm0,64(%rdi) -.byte 102,15,58,15,227,8 - movdqu %xmm4,80(%rdi) - .byte 0xf3,0xc3 -.cfi_endproc -.size GFp_gcm_init_clmul,.-GFp_gcm_init_clmul -.globl GFp_gcm_gmult_clmul -.hidden GFp_gcm_gmult_clmul -.type GFp_gcm_gmult_clmul,@function -.align 16 -GFp_gcm_gmult_clmul: -.cfi_startproc -.L_gmult_clmul: - movdqu (%rdi),%xmm0 - movdqa .Lbswap_mask(%rip),%xmm5 - movdqu (%rsi),%xmm2 - movdqu 32(%rsi),%xmm4 -.byte 102,15,56,0,197 - movdqa %xmm0,%xmm1 - pshufd $78,%xmm0,%xmm3 - pxor %xmm0,%xmm3 -.byte 102,15,58,68,194,0 -.byte 102,15,58,68,202,17 -.byte 102,15,58,68,220,0 - pxor %xmm0,%xmm3 - pxor %xmm1,%xmm3 - - movdqa %xmm3,%xmm4 - psrldq $8,%xmm3 - pslldq $8,%xmm4 - pxor %xmm3,%xmm1 - pxor %xmm4,%xmm0 - - movdqa %xmm0,%xmm4 - movdqa %xmm0,%xmm3 - psllq $5,%xmm0 - pxor %xmm0,%xmm3 - psllq $1,%xmm0 - pxor %xmm3,%xmm0 - psllq $57,%xmm0 - movdqa %xmm0,%xmm3 - pslldq $8,%xmm0 - psrldq $8,%xmm3 - pxor %xmm4,%xmm0 - pxor %xmm3,%xmm1 - - - movdqa %xmm0,%xmm4 - psrlq $1,%xmm0 - pxor %xmm4,%xmm1 - pxor %xmm0,%xmm4 - psrlq $5,%xmm0 - pxor %xmm4,%xmm0 - psrlq $1,%xmm0 - pxor %xmm1,%xmm0 -.byte 102,15,56,0,197 - movdqu %xmm0,(%rdi) - .byte 0xf3,0xc3 -.cfi_endproc -.size GFp_gcm_gmult_clmul,.-GFp_gcm_gmult_clmul -.globl GFp_gcm_ghash_clmul -.hidden GFp_gcm_ghash_clmul -.type GFp_gcm_ghash_clmul,@function -.align 32 -GFp_gcm_ghash_clmul: -.cfi_startproc -.L_ghash_clmul: - movdqa .Lbswap_mask(%rip),%xmm10 - - movdqu (%rdi),%xmm0 - movdqu (%rsi),%xmm2 - movdqu 32(%rsi),%xmm7 -.byte 102,65,15,56,0,194 - - subq $0x10,%rcx - jz .Lodd_tail - - movdqu 16(%rsi),%xmm6 - leaq GFp_ia32cap_P(%rip),%rax - movl 4(%rax),%eax - cmpq $0x30,%rcx - jb .Lskip4x - - andl $71303168,%eax - cmpl $4194304,%eax - je .Lskip4x - - subq $0x30,%rcx - movq $0xA040608020C0E000,%rax - movdqu 48(%rsi),%xmm14 - movdqu 64(%rsi),%xmm15 - - - - - movdqu 48(%rdx),%xmm3 - movdqu 32(%rdx),%xmm11 -.byte 102,65,15,56,0,218 -.byte 102,69,15,56,0,218 - movdqa %xmm3,%xmm5 - pshufd $78,%xmm3,%xmm4 - pxor %xmm3,%xmm4 -.byte 102,15,58,68,218,0 -.byte 102,15,58,68,234,17 -.byte 102,15,58,68,231,0 - - movdqa %xmm11,%xmm13 - pshufd $78,%xmm11,%xmm12 - pxor %xmm11,%xmm12 -.byte 102,68,15,58,68,222,0 -.byte 102,68,15,58,68,238,17 -.byte 102,68,15,58,68,231,16 - xorps %xmm11,%xmm3 - xorps %xmm13,%xmm5 - movups 80(%rsi),%xmm7 - xorps %xmm12,%xmm4 - - movdqu 16(%rdx),%xmm11 - movdqu 0(%rdx),%xmm8 -.byte 102,69,15,56,0,218 -.byte 102,69,15,56,0,194 - movdqa %xmm11,%xmm13 - pshufd $78,%xmm11,%xmm12 - pxor %xmm8,%xmm0 - pxor %xmm11,%xmm12 -.byte 102,69,15,58,68,222,0 - movdqa %xmm0,%xmm1 - pshufd $78,%xmm0,%xmm8 - pxor %xmm0,%xmm8 -.byte 102,69,15,58,68,238,17 -.byte 102,68,15,58,68,231,0 - xorps %xmm11,%xmm3 - xorps %xmm13,%xmm5 - - leaq 64(%rdx),%rdx - subq $0x40,%rcx - jc .Ltail4x - - jmp .Lmod4_loop -.align 32 -.Lmod4_loop: -.byte 102,65,15,58,68,199,0 - xorps %xmm12,%xmm4 - movdqu 48(%rdx),%xmm11 -.byte 102,69,15,56,0,218 -.byte 102,65,15,58,68,207,17 - xorps %xmm3,%xmm0 - movdqu 32(%rdx),%xmm3 - movdqa %xmm11,%xmm13 -.byte 102,68,15,58,68,199,16 - pshufd $78,%xmm11,%xmm12 - xorps %xmm5,%xmm1 - pxor %xmm11,%xmm12 -.byte 102,65,15,56,0,218 - movups 32(%rsi),%xmm7 - xorps %xmm4,%xmm8 -.byte 102,68,15,58,68,218,0 - pshufd $78,%xmm3,%xmm4 - - pxor %xmm0,%xmm8 - movdqa %xmm3,%xmm5 - pxor %xmm1,%xmm8 - pxor %xmm3,%xmm4 - movdqa %xmm8,%xmm9 -.byte 102,68,15,58,68,234,17 - pslldq $8,%xmm8 - psrldq $8,%xmm9 - pxor %xmm8,%xmm0 - movdqa .L7_mask(%rip),%xmm8 - pxor %xmm9,%xmm1 -.byte 102,76,15,110,200 - - pand %xmm0,%xmm8 -.byte 102,69,15,56,0,200 - pxor %xmm0,%xmm9 -.byte 102,68,15,58,68,231,0 - psllq $57,%xmm9 - movdqa %xmm9,%xmm8 - pslldq $8,%xmm9 -.byte 102,15,58,68,222,0 - psrldq $8,%xmm8 - pxor %xmm9,%xmm0 - pxor %xmm8,%xmm1 - movdqu 0(%rdx),%xmm8 - - movdqa %xmm0,%xmm9 - psrlq $1,%xmm0 -.byte 102,15,58,68,238,17 - xorps %xmm11,%xmm3 - movdqu 16(%rdx),%xmm11 -.byte 102,69,15,56,0,218 -.byte 102,15,58,68,231,16 - xorps %xmm13,%xmm5 - movups 80(%rsi),%xmm7 -.byte 102,69,15,56,0,194 - pxor %xmm9,%xmm1 - pxor %xmm0,%xmm9 - psrlq $5,%xmm0 - - movdqa %xmm11,%xmm13 - pxor %xmm12,%xmm4 - pshufd $78,%xmm11,%xmm12 - pxor %xmm9,%xmm0 - pxor %xmm8,%xmm1 - pxor %xmm11,%xmm12 -.byte 102,69,15,58,68,222,0 - psrlq $1,%xmm0 - pxor %xmm1,%xmm0 - movdqa %xmm0,%xmm1 -.byte 102,69,15,58,68,238,17 - xorps %xmm11,%xmm3 - pshufd $78,%xmm0,%xmm8 - pxor %xmm0,%xmm8 - -.byte 102,68,15,58,68,231,0 - xorps %xmm13,%xmm5 - - leaq 64(%rdx),%rdx - subq $0x40,%rcx - jnc .Lmod4_loop - -.Ltail4x: -.byte 102,65,15,58,68,199,0 -.byte 102,65,15,58,68,207,17 -.byte 102,68,15,58,68,199,16 - xorps %xmm12,%xmm4 - xorps %xmm3,%xmm0 - xorps %xmm5,%xmm1 - pxor %xmm0,%xmm1 - pxor %xmm4,%xmm8 - - pxor %xmm1,%xmm8 - pxor %xmm0,%xmm1 - - movdqa %xmm8,%xmm9 - psrldq $8,%xmm8 - pslldq $8,%xmm9 - pxor %xmm8,%xmm1 - pxor %xmm9,%xmm0 - - movdqa %xmm0,%xmm4 - movdqa %xmm0,%xmm3 - psllq $5,%xmm0 - pxor %xmm0,%xmm3 - psllq $1,%xmm0 - pxor %xmm3,%xmm0 - psllq $57,%xmm0 - movdqa %xmm0,%xmm3 - pslldq $8,%xmm0 - psrldq $8,%xmm3 - pxor %xmm4,%xmm0 - pxor %xmm3,%xmm1 - - - movdqa %xmm0,%xmm4 - psrlq $1,%xmm0 - pxor %xmm4,%xmm1 - pxor %xmm0,%xmm4 - psrlq $5,%xmm0 - pxor %xmm4,%xmm0 - psrlq $1,%xmm0 - pxor %xmm1,%xmm0 - addq $0x40,%rcx - jz .Ldone - movdqu 32(%rsi),%xmm7 - subq $0x10,%rcx - jz .Lodd_tail -.Lskip4x: - - - - - - movdqu (%rdx),%xmm8 - movdqu 16(%rdx),%xmm3 -.byte 102,69,15,56,0,194 -.byte 102,65,15,56,0,218 - pxor %xmm8,%xmm0 - - movdqa %xmm3,%xmm5 - pshufd $78,%xmm3,%xmm4 - pxor %xmm3,%xmm4 -.byte 102,15,58,68,218,0 -.byte 102,15,58,68,234,17 -.byte 102,15,58,68,231,0 - - leaq 32(%rdx),%rdx - nop - subq $0x20,%rcx - jbe .Leven_tail - nop - jmp .Lmod_loop - -.align 32 -.Lmod_loop: - movdqa %xmm0,%xmm1 - movdqa %xmm4,%xmm8 - pshufd $78,%xmm0,%xmm4 - pxor %xmm0,%xmm4 - -.byte 102,15,58,68,198,0 -.byte 102,15,58,68,206,17 -.byte 102,15,58,68,231,16 - - pxor %xmm3,%xmm0 - pxor %xmm5,%xmm1 - movdqu (%rdx),%xmm9 - pxor %xmm0,%xmm8 -.byte 102,69,15,56,0,202 - movdqu 16(%rdx),%xmm3 - - pxor %xmm1,%xmm8 - pxor %xmm9,%xmm1 - pxor %xmm8,%xmm4 -.byte 102,65,15,56,0,218 - movdqa %xmm4,%xmm8 - psrldq $8,%xmm8 - pslldq $8,%xmm4 - pxor %xmm8,%xmm1 - pxor %xmm4,%xmm0 - - movdqa %xmm3,%xmm5 - - movdqa %xmm0,%xmm9 - movdqa %xmm0,%xmm8 - psllq $5,%xmm0 - pxor %xmm0,%xmm8 -.byte 102,15,58,68,218,0 - psllq $1,%xmm0 - pxor %xmm8,%xmm0 - psllq $57,%xmm0 - movdqa %xmm0,%xmm8 - pslldq $8,%xmm0 - psrldq $8,%xmm8 - pxor %xmm9,%xmm0 - pshufd $78,%xmm5,%xmm4 - pxor %xmm8,%xmm1 - pxor %xmm5,%xmm4 - - movdqa %xmm0,%xmm9 - psrlq $1,%xmm0 -.byte 102,15,58,68,234,17 - pxor %xmm9,%xmm1 - pxor %xmm0,%xmm9 - psrlq $5,%xmm0 - pxor %xmm9,%xmm0 - leaq 32(%rdx),%rdx - psrlq $1,%xmm0 -.byte 102,15,58,68,231,0 - pxor %xmm1,%xmm0 - - subq $0x20,%rcx - ja .Lmod_loop - -.Leven_tail: - movdqa %xmm0,%xmm1 - movdqa %xmm4,%xmm8 - pshufd $78,%xmm0,%xmm4 - pxor %xmm0,%xmm4 - -.byte 102,15,58,68,198,0 -.byte 102,15,58,68,206,17 -.byte 102,15,58,68,231,16 - - pxor %xmm3,%xmm0 - pxor %xmm5,%xmm1 - pxor %xmm0,%xmm8 - pxor %xmm1,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm8 - psrldq $8,%xmm8 - pslldq $8,%xmm4 - pxor %xmm8,%xmm1 - pxor %xmm4,%xmm0 - - movdqa %xmm0,%xmm4 - movdqa %xmm0,%xmm3 - psllq $5,%xmm0 - pxor %xmm0,%xmm3 - psllq $1,%xmm0 - pxor %xmm3,%xmm0 - psllq $57,%xmm0 - movdqa %xmm0,%xmm3 - pslldq $8,%xmm0 - psrldq $8,%xmm3 - pxor %xmm4,%xmm0 - pxor %xmm3,%xmm1 - - - movdqa %xmm0,%xmm4 - psrlq $1,%xmm0 - pxor %xmm4,%xmm1 - pxor %xmm0,%xmm4 - psrlq $5,%xmm0 - pxor %xmm4,%xmm0 - psrlq $1,%xmm0 - pxor %xmm1,%xmm0 - testq %rcx,%rcx - jnz .Ldone - -.Lodd_tail: - movdqu (%rdx),%xmm8 -.byte 102,69,15,56,0,194 - pxor %xmm8,%xmm0 - movdqa %xmm0,%xmm1 - pshufd $78,%xmm0,%xmm3 - pxor %xmm0,%xmm3 -.byte 102,15,58,68,194,0 -.byte 102,15,58,68,202,17 -.byte 102,15,58,68,223,0 - pxor %xmm0,%xmm3 - pxor %xmm1,%xmm3 - - movdqa %xmm3,%xmm4 - psrldq $8,%xmm3 - pslldq $8,%xmm4 - pxor %xmm3,%xmm1 - pxor %xmm4,%xmm0 - - movdqa %xmm0,%xmm4 - movdqa %xmm0,%xmm3 - psllq $5,%xmm0 - pxor %xmm0,%xmm3 - psllq $1,%xmm0 - pxor %xmm3,%xmm0 - psllq $57,%xmm0 - movdqa %xmm0,%xmm3 - pslldq $8,%xmm0 - psrldq $8,%xmm3 - pxor %xmm4,%xmm0 - pxor %xmm3,%xmm1 - - - movdqa %xmm0,%xmm4 - psrlq $1,%xmm0 - pxor %xmm4,%xmm1 - pxor %xmm0,%xmm4 - psrlq $5,%xmm0 - pxor %xmm4,%xmm0 - psrlq $1,%xmm0 - pxor %xmm1,%xmm0 -.Ldone: -.byte 102,65,15,56,0,194 - movdqu %xmm0,(%rdi) - .byte 0xf3,0xc3 -.cfi_endproc -.size GFp_gcm_ghash_clmul,.-GFp_gcm_ghash_clmul -.globl GFp_gcm_init_avx -.hidden GFp_gcm_init_avx -.type GFp_gcm_init_avx,@function -.align 32 -GFp_gcm_init_avx: -.cfi_startproc - vzeroupper - - vmovdqu (%rsi),%xmm2 - vpshufd $78,%xmm2,%xmm2 - - - vpshufd $255,%xmm2,%xmm4 - vpsrlq $63,%xmm2,%xmm3 - vpsllq $1,%xmm2,%xmm2 - vpxor %xmm5,%xmm5,%xmm5 - vpcmpgtd %xmm4,%xmm5,%xmm5 - vpslldq $8,%xmm3,%xmm3 - vpor %xmm3,%xmm2,%xmm2 - - - vpand .L0x1c2_polynomial(%rip),%xmm5,%xmm5 - vpxor %xmm5,%xmm2,%xmm2 - - vpunpckhqdq %xmm2,%xmm2,%xmm6 - vmovdqa %xmm2,%xmm0 - vpxor %xmm2,%xmm6,%xmm6 - movq $4,%r10 - jmp .Linit_start_avx -.align 32 -.Linit_loop_avx: - vpalignr $8,%xmm3,%xmm4,%xmm5 - vmovdqu %xmm5,-16(%rdi) - vpunpckhqdq %xmm0,%xmm0,%xmm3 - vpxor %xmm0,%xmm3,%xmm3 - vpclmulqdq $0x11,%xmm2,%xmm0,%xmm1 - vpclmulqdq $0x00,%xmm2,%xmm0,%xmm0 - vpclmulqdq $0x00,%xmm6,%xmm3,%xmm3 - vpxor %xmm0,%xmm1,%xmm4 - vpxor %xmm4,%xmm3,%xmm3 - - vpslldq $8,%xmm3,%xmm4 - vpsrldq $8,%xmm3,%xmm3 - vpxor %xmm4,%xmm0,%xmm0 - vpxor %xmm3,%xmm1,%xmm1 - vpsllq $57,%xmm0,%xmm3 - vpsllq $62,%xmm0,%xmm4 - vpxor %xmm3,%xmm4,%xmm4 - vpsllq $63,%xmm0,%xmm3 - vpxor %xmm3,%xmm4,%xmm4 - vpslldq $8,%xmm4,%xmm3 - vpsrldq $8,%xmm4,%xmm4 - vpxor %xmm3,%xmm0,%xmm0 - vpxor %xmm4,%xmm1,%xmm1 - - vpsrlq $1,%xmm0,%xmm4 - vpxor %xmm0,%xmm1,%xmm1 - vpxor %xmm4,%xmm0,%xmm0 - vpsrlq $5,%xmm4,%xmm4 - vpxor %xmm4,%xmm0,%xmm0 - vpsrlq $1,%xmm0,%xmm0 - vpxor %xmm1,%xmm0,%xmm0 -.Linit_start_avx: - vmovdqa %xmm0,%xmm5 - vpunpckhqdq %xmm0,%xmm0,%xmm3 - vpxor %xmm0,%xmm3,%xmm3 - vpclmulqdq $0x11,%xmm2,%xmm0,%xmm1 - vpclmulqdq $0x00,%xmm2,%xmm0,%xmm0 - vpclmulqdq $0x00,%xmm6,%xmm3,%xmm3 - vpxor %xmm0,%xmm1,%xmm4 - vpxor %xmm4,%xmm3,%xmm3 - - vpslldq $8,%xmm3,%xmm4 - vpsrldq $8,%xmm3,%xmm3 - vpxor %xmm4,%xmm0,%xmm0 - vpxor %xmm3,%xmm1,%xmm1 - vpsllq $57,%xmm0,%xmm3 - vpsllq $62,%xmm0,%xmm4 - vpxor %xmm3,%xmm4,%xmm4 - vpsllq $63,%xmm0,%xmm3 - vpxor %xmm3,%xmm4,%xmm4 - vpslldq $8,%xmm4,%xmm3 - vpsrldq $8,%xmm4,%xmm4 - vpxor %xmm3,%xmm0,%xmm0 - vpxor %xmm4,%xmm1,%xmm1 - - vpsrlq $1,%xmm0,%xmm4 - vpxor %xmm0,%xmm1,%xmm1 - vpxor %xmm4,%xmm0,%xmm0 - vpsrlq $5,%xmm4,%xmm4 - vpxor %xmm4,%xmm0,%xmm0 - vpsrlq $1,%xmm0,%xmm0 - vpxor %xmm1,%xmm0,%xmm0 - vpshufd $78,%xmm5,%xmm3 - vpshufd $78,%xmm0,%xmm4 - vpxor %xmm5,%xmm3,%xmm3 - vmovdqu %xmm5,0(%rdi) - vpxor %xmm0,%xmm4,%xmm4 - vmovdqu %xmm0,16(%rdi) - leaq 48(%rdi),%rdi - subq $1,%r10 - jnz .Linit_loop_avx - - vpalignr $8,%xmm4,%xmm3,%xmm5 - vmovdqu %xmm5,-16(%rdi) - - vzeroupper - .byte 0xf3,0xc3 -.cfi_endproc -.size GFp_gcm_init_avx,.-GFp_gcm_init_avx -.globl GFp_gcm_ghash_avx -.hidden GFp_gcm_ghash_avx -.type GFp_gcm_ghash_avx,@function -.align 32 -GFp_gcm_ghash_avx: -.cfi_startproc - vzeroupper - - vmovdqu (%rdi),%xmm10 - leaq .L0x1c2_polynomial(%rip),%r10 - leaq 64(%rsi),%rsi - vmovdqu .Lbswap_mask(%rip),%xmm13 - vpshufb %xmm13,%xmm10,%xmm10 - cmpq $0x80,%rcx - jb .Lshort_avx - subq $0x80,%rcx - - vmovdqu 112(%rdx),%xmm14 - vmovdqu 0-64(%rsi),%xmm6 - vpshufb %xmm13,%xmm14,%xmm14 - vmovdqu 32-64(%rsi),%xmm7 - - vpunpckhqdq %xmm14,%xmm14,%xmm9 - vmovdqu 96(%rdx),%xmm15 - vpclmulqdq $0x00,%xmm6,%xmm14,%xmm0 - vpxor %xmm14,%xmm9,%xmm9 - vpshufb %xmm13,%xmm15,%xmm15 - vpclmulqdq $0x11,%xmm6,%xmm14,%xmm1 - vmovdqu 16-64(%rsi),%xmm6 - vpunpckhqdq %xmm15,%xmm15,%xmm8 - vmovdqu 80(%rdx),%xmm14 - vpclmulqdq $0x00,%xmm7,%xmm9,%xmm2 - vpxor %xmm15,%xmm8,%xmm8 - - vpshufb %xmm13,%xmm14,%xmm14 - vpclmulqdq $0x00,%xmm6,%xmm15,%xmm3 - vpunpckhqdq %xmm14,%xmm14,%xmm9 - vpclmulqdq $0x11,%xmm6,%xmm15,%xmm4 - vmovdqu 48-64(%rsi),%xmm6 - vpxor %xmm14,%xmm9,%xmm9 - vmovdqu 64(%rdx),%xmm15 - vpclmulqdq $0x10,%xmm7,%xmm8,%xmm5 - vmovdqu 80-64(%rsi),%xmm7 - - vpshufb %xmm13,%xmm15,%xmm15 - vpxor %xmm0,%xmm3,%xmm3 - vpclmulqdq $0x00,%xmm6,%xmm14,%xmm0 - vpxor %xmm1,%xmm4,%xmm4 - vpunpckhqdq %xmm15,%xmm15,%xmm8 - vpclmulqdq $0x11,%xmm6,%xmm14,%xmm1 - vmovdqu 64-64(%rsi),%xmm6 - vpxor %xmm2,%xmm5,%xmm5 - vpclmulqdq $0x00,%xmm7,%xmm9,%xmm2 - vpxor %xmm15,%xmm8,%xmm8 - - vmovdqu 48(%rdx),%xmm14 - vpxor %xmm3,%xmm0,%xmm0 - vpclmulqdq $0x00,%xmm6,%xmm15,%xmm3 - vpxor %xmm4,%xmm1,%xmm1 - vpshufb %xmm13,%xmm14,%xmm14 - vpclmulqdq $0x11,%xmm6,%xmm15,%xmm4 - vmovdqu 96-64(%rsi),%xmm6 - vpxor %xmm5,%xmm2,%xmm2 - vpunpckhqdq %xmm14,%xmm14,%xmm9 - vpclmulqdq $0x10,%xmm7,%xmm8,%xmm5 - vmovdqu 128-64(%rsi),%xmm7 - vpxor %xmm14,%xmm9,%xmm9 - - vmovdqu 32(%rdx),%xmm15 - vpxor %xmm0,%xmm3,%xmm3 - vpclmulqdq $0x00,%xmm6,%xmm14,%xmm0 - vpxor %xmm1,%xmm4,%xmm4 - vpshufb %xmm13,%xmm15,%xmm15 - vpclmulqdq $0x11,%xmm6,%xmm14,%xmm1 - vmovdqu 112-64(%rsi),%xmm6 - vpxor %xmm2,%xmm5,%xmm5 - vpunpckhqdq %xmm15,%xmm15,%xmm8 - vpclmulqdq $0x00,%xmm7,%xmm9,%xmm2 - vpxor %xmm15,%xmm8,%xmm8 - - vmovdqu 16(%rdx),%xmm14 - vpxor %xmm3,%xmm0,%xmm0 - vpclmulqdq $0x00,%xmm6,%xmm15,%xmm3 - vpxor %xmm4,%xmm1,%xmm1 - vpshufb %xmm13,%xmm14,%xmm14 - vpclmulqdq $0x11,%xmm6,%xmm15,%xmm4 - vmovdqu 144-64(%rsi),%xmm6 - vpxor %xmm5,%xmm2,%xmm2 - vpunpckhqdq %xmm14,%xmm14,%xmm9 - vpclmulqdq $0x10,%xmm7,%xmm8,%xmm5 - vmovdqu 176-64(%rsi),%xmm7 - vpxor %xmm14,%xmm9,%xmm9 - - vmovdqu (%rdx),%xmm15 - vpxor %xmm0,%xmm3,%xmm3 - vpclmulqdq $0x00,%xmm6,%xmm14,%xmm0 - vpxor %xmm1,%xmm4,%xmm4 - vpshufb %xmm13,%xmm15,%xmm15 - vpclmulqdq $0x11,%xmm6,%xmm14,%xmm1 - vmovdqu 160-64(%rsi),%xmm6 - vpxor %xmm2,%xmm5,%xmm5 - vpclmulqdq $0x10,%xmm7,%xmm9,%xmm2 - - leaq 128(%rdx),%rdx - cmpq $0x80,%rcx - jb .Ltail_avx - - vpxor %xmm10,%xmm15,%xmm15 - subq $0x80,%rcx - jmp .Loop8x_avx - -.align 32 -.Loop8x_avx: - vpunpckhqdq %xmm15,%xmm15,%xmm8 - vmovdqu 112(%rdx),%xmm14 - vpxor %xmm0,%xmm3,%xmm3 - vpxor %xmm15,%xmm8,%xmm8 - vpclmulqdq $0x00,%xmm6,%xmm15,%xmm10 - vpshufb %xmm13,%xmm14,%xmm14 - vpxor %xmm1,%xmm4,%xmm4 - vpclmulqdq $0x11,%xmm6,%xmm15,%xmm11 - vmovdqu 0-64(%rsi),%xmm6 - vpunpckhqdq %xmm14,%xmm14,%xmm9 - vpxor %xmm2,%xmm5,%xmm5 - vpclmulqdq $0x00,%xmm7,%xmm8,%xmm12 - vmovdqu 32-64(%rsi),%xmm7 - vpxor %xmm14,%xmm9,%xmm9 - - vmovdqu 96(%rdx),%xmm15 - vpclmulqdq $0x00,%xmm6,%xmm14,%xmm0 - vpxor %xmm3,%xmm10,%xmm10 - vpshufb %xmm13,%xmm15,%xmm15 - vpclmulqdq $0x11,%xmm6,%xmm14,%xmm1 - vxorps %xmm4,%xmm11,%xmm11 - vmovdqu 16-64(%rsi),%xmm6 - vpunpckhqdq %xmm15,%xmm15,%xmm8 - vpclmulqdq $0x00,%xmm7,%xmm9,%xmm2 - vpxor %xmm5,%xmm12,%xmm12 - vxorps %xmm15,%xmm8,%xmm8 - - vmovdqu 80(%rdx),%xmm14 - vpxor %xmm10,%xmm12,%xmm12 - vpclmulqdq $0x00,%xmm6,%xmm15,%xmm3 - vpxor %xmm11,%xmm12,%xmm12 - vpslldq $8,%xmm12,%xmm9 - vpxor %xmm0,%xmm3,%xmm3 - vpclmulqdq $0x11,%xmm6,%xmm15,%xmm4 - vpsrldq $8,%xmm12,%xmm12 - vpxor %xmm9,%xmm10,%xmm10 - vmovdqu 48-64(%rsi),%xmm6 - vpshufb %xmm13,%xmm14,%xmm14 - vxorps %xmm12,%xmm11,%xmm11 - vpxor %xmm1,%xmm4,%xmm4 - vpunpckhqdq %xmm14,%xmm14,%xmm9 - vpclmulqdq $0x10,%xmm7,%xmm8,%xmm5 - vmovdqu 80-64(%rsi),%xmm7 - vpxor %xmm14,%xmm9,%xmm9 - vpxor %xmm2,%xmm5,%xmm5 - - vmovdqu 64(%rdx),%xmm15 - vpalignr $8,%xmm10,%xmm10,%xmm12 - vpclmulqdq $0x00,%xmm6,%xmm14,%xmm0 - vpshufb %xmm13,%xmm15,%xmm15 - vpxor %xmm3,%xmm0,%xmm0 - vpclmulqdq $0x11,%xmm6,%xmm14,%xmm1 - vmovdqu 64-64(%rsi),%xmm6 - vpunpckhqdq %xmm15,%xmm15,%xmm8 - vpxor %xmm4,%xmm1,%xmm1 - vpclmulqdq $0x00,%xmm7,%xmm9,%xmm2 - vxorps %xmm15,%xmm8,%xmm8 - vpxor %xmm5,%xmm2,%xmm2 - - vmovdqu 48(%rdx),%xmm14 - vpclmulqdq $0x10,(%r10),%xmm10,%xmm10 - vpclmulqdq $0x00,%xmm6,%xmm15,%xmm3 - vpshufb %xmm13,%xmm14,%xmm14 - vpxor %xmm0,%xmm3,%xmm3 - vpclmulqdq $0x11,%xmm6,%xmm15,%xmm4 - vmovdqu 96-64(%rsi),%xmm6 - vpunpckhqdq %xmm14,%xmm14,%xmm9 - vpxor %xmm1,%xmm4,%xmm4 - vpclmulqdq $0x10,%xmm7,%xmm8,%xmm5 - vmovdqu 128-64(%rsi),%xmm7 - vpxor %xmm14,%xmm9,%xmm9 - vpxor %xmm2,%xmm5,%xmm5 - - vmovdqu 32(%rdx),%xmm15 - vpclmulqdq $0x00,%xmm6,%xmm14,%xmm0 - vpshufb %xmm13,%xmm15,%xmm15 - vpxor %xmm3,%xmm0,%xmm0 - vpclmulqdq $0x11,%xmm6,%xmm14,%xmm1 - vmovdqu 112-64(%rsi),%xmm6 - vpunpckhqdq %xmm15,%xmm15,%xmm8 - vpxor %xmm4,%xmm1,%xmm1 - vpclmulqdq $0x00,%xmm7,%xmm9,%xmm2 - vpxor %xmm15,%xmm8,%xmm8 - vpxor %xmm5,%xmm2,%xmm2 - vxorps %xmm12,%xmm10,%xmm10 - - vmovdqu 16(%rdx),%xmm14 - vpalignr $8,%xmm10,%xmm10,%xmm12 - vpclmulqdq $0x00,%xmm6,%xmm15,%xmm3 - vpshufb %xmm13,%xmm14,%xmm14 - vpxor %xmm0,%xmm3,%xmm3 - vpclmulqdq $0x11,%xmm6,%xmm15,%xmm4 - vmovdqu 144-64(%rsi),%xmm6 - vpclmulqdq $0x10,(%r10),%xmm10,%xmm10 - vxorps %xmm11,%xmm12,%xmm12 - vpunpckhqdq %xmm14,%xmm14,%xmm9 - vpxor %xmm1,%xmm4,%xmm4 - vpclmulqdq $0x10,%xmm7,%xmm8,%xmm5 - vmovdqu 176-64(%rsi),%xmm7 - vpxor %xmm14,%xmm9,%xmm9 - vpxor %xmm2,%xmm5,%xmm5 - - vmovdqu (%rdx),%xmm15 - vpclmulqdq $0x00,%xmm6,%xmm14,%xmm0 - vpshufb %xmm13,%xmm15,%xmm15 - vpclmulqdq $0x11,%xmm6,%xmm14,%xmm1 - vmovdqu 160-64(%rsi),%xmm6 - vpxor %xmm12,%xmm15,%xmm15 - vpclmulqdq $0x10,%xmm7,%xmm9,%xmm2 - vpxor %xmm10,%xmm15,%xmm15 - - leaq 128(%rdx),%rdx - subq $0x80,%rcx - jnc .Loop8x_avx - - addq $0x80,%rcx - jmp .Ltail_no_xor_avx - -.align 32 -.Lshort_avx: - vmovdqu -16(%rdx,%rcx,1),%xmm14 - leaq (%rdx,%rcx,1),%rdx - vmovdqu 0-64(%rsi),%xmm6 - vmovdqu 32-64(%rsi),%xmm7 - vpshufb %xmm13,%xmm14,%xmm15 - - vmovdqa %xmm0,%xmm3 - vmovdqa %xmm1,%xmm4 - vmovdqa %xmm2,%xmm5 - subq $0x10,%rcx - jz .Ltail_avx - - vpunpckhqdq %xmm15,%xmm15,%xmm8 - vpxor %xmm0,%xmm3,%xmm3 - vpclmulqdq $0x00,%xmm6,%xmm15,%xmm0 - vpxor %xmm15,%xmm8,%xmm8 - vmovdqu -32(%rdx),%xmm14 - vpxor %xmm1,%xmm4,%xmm4 - vpclmulqdq $0x11,%xmm6,%xmm15,%xmm1 - vmovdqu 16-64(%rsi),%xmm6 - vpshufb %xmm13,%xmm14,%xmm15 - vpxor %xmm2,%xmm5,%xmm5 - vpclmulqdq $0x00,%xmm7,%xmm8,%xmm2 - vpsrldq $8,%xmm7,%xmm7 - subq $0x10,%rcx - jz .Ltail_avx - - vpunpckhqdq %xmm15,%xmm15,%xmm8 - vpxor %xmm0,%xmm3,%xmm3 - vpclmulqdq $0x00,%xmm6,%xmm15,%xmm0 - vpxor %xmm15,%xmm8,%xmm8 - vmovdqu -48(%rdx),%xmm14 - vpxor %xmm1,%xmm4,%xmm4 - vpclmulqdq $0x11,%xmm6,%xmm15,%xmm1 - vmovdqu 48-64(%rsi),%xmm6 - vpshufb %xmm13,%xmm14,%xmm15 - vpxor %xmm2,%xmm5,%xmm5 - vpclmulqdq $0x00,%xmm7,%xmm8,%xmm2 - vmovdqu 80-64(%rsi),%xmm7 - subq $0x10,%rcx - jz .Ltail_avx - - vpunpckhqdq %xmm15,%xmm15,%xmm8 - vpxor %xmm0,%xmm3,%xmm3 - vpclmulqdq $0x00,%xmm6,%xmm15,%xmm0 - vpxor %xmm15,%xmm8,%xmm8 - vmovdqu -64(%rdx),%xmm14 - vpxor %xmm1,%xmm4,%xmm4 - vpclmulqdq $0x11,%xmm6,%xmm15,%xmm1 - vmovdqu 64-64(%rsi),%xmm6 - vpshufb %xmm13,%xmm14,%xmm15 - vpxor %xmm2,%xmm5,%xmm5 - vpclmulqdq $0x00,%xmm7,%xmm8,%xmm2 - vpsrldq $8,%xmm7,%xmm7 - subq $0x10,%rcx - jz .Ltail_avx - - vpunpckhqdq %xmm15,%xmm15,%xmm8 - vpxor %xmm0,%xmm3,%xmm3 - vpclmulqdq $0x00,%xmm6,%xmm15,%xmm0 - vpxor %xmm15,%xmm8,%xmm8 - vmovdqu -80(%rdx),%xmm14 - vpxor %xmm1,%xmm4,%xmm4 - vpclmulqdq $0x11,%xmm6,%xmm15,%xmm1 - vmovdqu 96-64(%rsi),%xmm6 - vpshufb %xmm13,%xmm14,%xmm15 - vpxor %xmm2,%xmm5,%xmm5 - vpclmulqdq $0x00,%xmm7,%xmm8,%xmm2 - vmovdqu 128-64(%rsi),%xmm7 - subq $0x10,%rcx - jz .Ltail_avx - - vpunpckhqdq %xmm15,%xmm15,%xmm8 - vpxor %xmm0,%xmm3,%xmm3 - vpclmulqdq $0x00,%xmm6,%xmm15,%xmm0 - vpxor %xmm15,%xmm8,%xmm8 - vmovdqu -96(%rdx),%xmm14 - vpxor %xmm1,%xmm4,%xmm4 - vpclmulqdq $0x11,%xmm6,%xmm15,%xmm1 - vmovdqu 112-64(%rsi),%xmm6 - vpshufb %xmm13,%xmm14,%xmm15 - vpxor %xmm2,%xmm5,%xmm5 - vpclmulqdq $0x00,%xmm7,%xmm8,%xmm2 - vpsrldq $8,%xmm7,%xmm7 - subq $0x10,%rcx - jz .Ltail_avx - - vpunpckhqdq %xmm15,%xmm15,%xmm8 - vpxor %xmm0,%xmm3,%xmm3 - vpclmulqdq $0x00,%xmm6,%xmm15,%xmm0 - vpxor %xmm15,%xmm8,%xmm8 - vmovdqu -112(%rdx),%xmm14 - vpxor %xmm1,%xmm4,%xmm4 - vpclmulqdq $0x11,%xmm6,%xmm15,%xmm1 - vmovdqu 144-64(%rsi),%xmm6 - vpshufb %xmm13,%xmm14,%xmm15 - vpxor %xmm2,%xmm5,%xmm5 - vpclmulqdq $0x00,%xmm7,%xmm8,%xmm2 - vmovq 184-64(%rsi),%xmm7 - subq $0x10,%rcx - jmp .Ltail_avx - -.align 32 -.Ltail_avx: - vpxor %xmm10,%xmm15,%xmm15 -.Ltail_no_xor_avx: - vpunpckhqdq %xmm15,%xmm15,%xmm8 - vpxor %xmm0,%xmm3,%xmm3 - vpclmulqdq $0x00,%xmm6,%xmm15,%xmm0 - vpxor %xmm15,%xmm8,%xmm8 - vpxor %xmm1,%xmm4,%xmm4 - vpclmulqdq $0x11,%xmm6,%xmm15,%xmm1 - vpxor %xmm2,%xmm5,%xmm5 - vpclmulqdq $0x00,%xmm7,%xmm8,%xmm2 - - vmovdqu (%r10),%xmm12 - - vpxor %xmm0,%xmm3,%xmm10 - vpxor %xmm1,%xmm4,%xmm11 - vpxor %xmm2,%xmm5,%xmm5 - - vpxor %xmm10,%xmm5,%xmm5 - vpxor %xmm11,%xmm5,%xmm5 - vpslldq $8,%xmm5,%xmm9 - vpsrldq $8,%xmm5,%xmm5 - vpxor %xmm9,%xmm10,%xmm10 - vpxor %xmm5,%xmm11,%xmm11 - - vpclmulqdq $0x10,%xmm12,%xmm10,%xmm9 - vpalignr $8,%xmm10,%xmm10,%xmm10 - vpxor %xmm9,%xmm10,%xmm10 - - vpclmulqdq $0x10,%xmm12,%xmm10,%xmm9 - vpalignr $8,%xmm10,%xmm10,%xmm10 - vpxor %xmm11,%xmm10,%xmm10 - vpxor %xmm9,%xmm10,%xmm10 - - cmpq $0,%rcx - jne .Lshort_avx - - vpshufb %xmm13,%xmm10,%xmm10 - vmovdqu %xmm10,(%rdi) - vzeroupper - .byte 0xf3,0xc3 -.cfi_endproc -.size GFp_gcm_ghash_avx,.-GFp_gcm_ghash_avx -.align 64 -.Lbswap_mask: -.byte 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 -.L0x1c2_polynomial: -.byte 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xc2 -.L7_mask: -.long 7,0,7,0 -.align 64 - -.byte 71,72,65,83,72,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 -.align 64 -#endif -.section .note.GNU-stack,"",@progbits diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ghash-x86_64-macosx.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ghash-x86_64-macosx.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ghash-x86_64-macosx.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ghash-x86_64-macosx.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,1113 +0,0 @@ -# This file is generated from a similarly-named Perl script in the BoringSSL -# source tree. Do not edit by hand. - -#if defined(__has_feature) -#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) -#define OPENSSL_NO_ASM -#endif -#endif - -#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) -.text - -.globl _GFp_gcm_init_clmul -.private_extern _GFp_gcm_init_clmul - -.p2align 4 -_GFp_gcm_init_clmul: - -L$_init_clmul: - movdqu (%rsi),%xmm2 - pshufd $78,%xmm2,%xmm2 - - - pshufd $255,%xmm2,%xmm4 - movdqa %xmm2,%xmm3 - psllq $1,%xmm2 - pxor %xmm5,%xmm5 - psrlq $63,%xmm3 - pcmpgtd %xmm4,%xmm5 - pslldq $8,%xmm3 - por %xmm3,%xmm2 - - - pand L$0x1c2_polynomial(%rip),%xmm5 - pxor %xmm5,%xmm2 - - - pshufd $78,%xmm2,%xmm6 - movdqa %xmm2,%xmm0 - pxor %xmm2,%xmm6 - movdqa %xmm0,%xmm1 - pshufd $78,%xmm0,%xmm3 - pxor %xmm0,%xmm3 -.byte 102,15,58,68,194,0 -.byte 102,15,58,68,202,17 -.byte 102,15,58,68,222,0 - pxor %xmm0,%xmm3 - pxor %xmm1,%xmm3 - - movdqa %xmm3,%xmm4 - psrldq $8,%xmm3 - pslldq $8,%xmm4 - pxor %xmm3,%xmm1 - pxor %xmm4,%xmm0 - - movdqa %xmm0,%xmm4 - movdqa %xmm0,%xmm3 - psllq $5,%xmm0 - pxor %xmm0,%xmm3 - psllq $1,%xmm0 - pxor %xmm3,%xmm0 - psllq $57,%xmm0 - movdqa %xmm0,%xmm3 - pslldq $8,%xmm0 - psrldq $8,%xmm3 - pxor %xmm4,%xmm0 - pxor %xmm3,%xmm1 - - - movdqa %xmm0,%xmm4 - psrlq $1,%xmm0 - pxor %xmm4,%xmm1 - pxor %xmm0,%xmm4 - psrlq $5,%xmm0 - pxor %xmm4,%xmm0 - psrlq $1,%xmm0 - pxor %xmm1,%xmm0 - pshufd $78,%xmm2,%xmm3 - pshufd $78,%xmm0,%xmm4 - pxor %xmm2,%xmm3 - movdqu %xmm2,0(%rdi) - pxor %xmm0,%xmm4 - movdqu %xmm0,16(%rdi) -.byte 102,15,58,15,227,8 - movdqu %xmm4,32(%rdi) - movdqa %xmm0,%xmm1 - pshufd $78,%xmm0,%xmm3 - pxor %xmm0,%xmm3 -.byte 102,15,58,68,194,0 -.byte 102,15,58,68,202,17 -.byte 102,15,58,68,222,0 - pxor %xmm0,%xmm3 - pxor %xmm1,%xmm3 - - movdqa %xmm3,%xmm4 - psrldq $8,%xmm3 - pslldq $8,%xmm4 - pxor %xmm3,%xmm1 - pxor %xmm4,%xmm0 - - movdqa %xmm0,%xmm4 - movdqa %xmm0,%xmm3 - psllq $5,%xmm0 - pxor %xmm0,%xmm3 - psllq $1,%xmm0 - pxor %xmm3,%xmm0 - psllq $57,%xmm0 - movdqa %xmm0,%xmm3 - pslldq $8,%xmm0 - psrldq $8,%xmm3 - pxor %xmm4,%xmm0 - pxor %xmm3,%xmm1 - - - movdqa %xmm0,%xmm4 - psrlq $1,%xmm0 - pxor %xmm4,%xmm1 - pxor %xmm0,%xmm4 - psrlq $5,%xmm0 - pxor %xmm4,%xmm0 - psrlq $1,%xmm0 - pxor %xmm1,%xmm0 - movdqa %xmm0,%xmm5 - movdqa %xmm0,%xmm1 - pshufd $78,%xmm0,%xmm3 - pxor %xmm0,%xmm3 -.byte 102,15,58,68,194,0 -.byte 102,15,58,68,202,17 -.byte 102,15,58,68,222,0 - pxor %xmm0,%xmm3 - pxor %xmm1,%xmm3 - - movdqa %xmm3,%xmm4 - psrldq $8,%xmm3 - pslldq $8,%xmm4 - pxor %xmm3,%xmm1 - pxor %xmm4,%xmm0 - - movdqa %xmm0,%xmm4 - movdqa %xmm0,%xmm3 - psllq $5,%xmm0 - pxor %xmm0,%xmm3 - psllq $1,%xmm0 - pxor %xmm3,%xmm0 - psllq $57,%xmm0 - movdqa %xmm0,%xmm3 - pslldq $8,%xmm0 - psrldq $8,%xmm3 - pxor %xmm4,%xmm0 - pxor %xmm3,%xmm1 - - - movdqa %xmm0,%xmm4 - psrlq $1,%xmm0 - pxor %xmm4,%xmm1 - pxor %xmm0,%xmm4 - psrlq $5,%xmm0 - pxor %xmm4,%xmm0 - psrlq $1,%xmm0 - pxor %xmm1,%xmm0 - pshufd $78,%xmm5,%xmm3 - pshufd $78,%xmm0,%xmm4 - pxor %xmm5,%xmm3 - movdqu %xmm5,48(%rdi) - pxor %xmm0,%xmm4 - movdqu %xmm0,64(%rdi) -.byte 102,15,58,15,227,8 - movdqu %xmm4,80(%rdi) - .byte 0xf3,0xc3 - - -.globl _GFp_gcm_gmult_clmul -.private_extern _GFp_gcm_gmult_clmul - -.p2align 4 -_GFp_gcm_gmult_clmul: - -L$_gmult_clmul: - movdqu (%rdi),%xmm0 - movdqa L$bswap_mask(%rip),%xmm5 - movdqu (%rsi),%xmm2 - movdqu 32(%rsi),%xmm4 -.byte 102,15,56,0,197 - movdqa %xmm0,%xmm1 - pshufd $78,%xmm0,%xmm3 - pxor %xmm0,%xmm3 -.byte 102,15,58,68,194,0 -.byte 102,15,58,68,202,17 -.byte 102,15,58,68,220,0 - pxor %xmm0,%xmm3 - pxor %xmm1,%xmm3 - - movdqa %xmm3,%xmm4 - psrldq $8,%xmm3 - pslldq $8,%xmm4 - pxor %xmm3,%xmm1 - pxor %xmm4,%xmm0 - - movdqa %xmm0,%xmm4 - movdqa %xmm0,%xmm3 - psllq $5,%xmm0 - pxor %xmm0,%xmm3 - psllq $1,%xmm0 - pxor %xmm3,%xmm0 - psllq $57,%xmm0 - movdqa %xmm0,%xmm3 - pslldq $8,%xmm0 - psrldq $8,%xmm3 - pxor %xmm4,%xmm0 - pxor %xmm3,%xmm1 - - - movdqa %xmm0,%xmm4 - psrlq $1,%xmm0 - pxor %xmm4,%xmm1 - pxor %xmm0,%xmm4 - psrlq $5,%xmm0 - pxor %xmm4,%xmm0 - psrlq $1,%xmm0 - pxor %xmm1,%xmm0 -.byte 102,15,56,0,197 - movdqu %xmm0,(%rdi) - .byte 0xf3,0xc3 - - -.globl _GFp_gcm_ghash_clmul -.private_extern _GFp_gcm_ghash_clmul - -.p2align 5 -_GFp_gcm_ghash_clmul: - -L$_ghash_clmul: - movdqa L$bswap_mask(%rip),%xmm10 - - movdqu (%rdi),%xmm0 - movdqu (%rsi),%xmm2 - movdqu 32(%rsi),%xmm7 -.byte 102,65,15,56,0,194 - - subq $0x10,%rcx - jz L$odd_tail - - movdqu 16(%rsi),%xmm6 - leaq _GFp_ia32cap_P(%rip),%rax - movl 4(%rax),%eax - cmpq $0x30,%rcx - jb L$skip4x - - andl $71303168,%eax - cmpl $4194304,%eax - je L$skip4x - - subq $0x30,%rcx - movq $0xA040608020C0E000,%rax - movdqu 48(%rsi),%xmm14 - movdqu 64(%rsi),%xmm15 - - - - - movdqu 48(%rdx),%xmm3 - movdqu 32(%rdx),%xmm11 -.byte 102,65,15,56,0,218 -.byte 102,69,15,56,0,218 - movdqa %xmm3,%xmm5 - pshufd $78,%xmm3,%xmm4 - pxor %xmm3,%xmm4 -.byte 102,15,58,68,218,0 -.byte 102,15,58,68,234,17 -.byte 102,15,58,68,231,0 - - movdqa %xmm11,%xmm13 - pshufd $78,%xmm11,%xmm12 - pxor %xmm11,%xmm12 -.byte 102,68,15,58,68,222,0 -.byte 102,68,15,58,68,238,17 -.byte 102,68,15,58,68,231,16 - xorps %xmm11,%xmm3 - xorps %xmm13,%xmm5 - movups 80(%rsi),%xmm7 - xorps %xmm12,%xmm4 - - movdqu 16(%rdx),%xmm11 - movdqu 0(%rdx),%xmm8 -.byte 102,69,15,56,0,218 -.byte 102,69,15,56,0,194 - movdqa %xmm11,%xmm13 - pshufd $78,%xmm11,%xmm12 - pxor %xmm8,%xmm0 - pxor %xmm11,%xmm12 -.byte 102,69,15,58,68,222,0 - movdqa %xmm0,%xmm1 - pshufd $78,%xmm0,%xmm8 - pxor %xmm0,%xmm8 -.byte 102,69,15,58,68,238,17 -.byte 102,68,15,58,68,231,0 - xorps %xmm11,%xmm3 - xorps %xmm13,%xmm5 - - leaq 64(%rdx),%rdx - subq $0x40,%rcx - jc L$tail4x - - jmp L$mod4_loop -.p2align 5 -L$mod4_loop: -.byte 102,65,15,58,68,199,0 - xorps %xmm12,%xmm4 - movdqu 48(%rdx),%xmm11 -.byte 102,69,15,56,0,218 -.byte 102,65,15,58,68,207,17 - xorps %xmm3,%xmm0 - movdqu 32(%rdx),%xmm3 - movdqa %xmm11,%xmm13 -.byte 102,68,15,58,68,199,16 - pshufd $78,%xmm11,%xmm12 - xorps %xmm5,%xmm1 - pxor %xmm11,%xmm12 -.byte 102,65,15,56,0,218 - movups 32(%rsi),%xmm7 - xorps %xmm4,%xmm8 -.byte 102,68,15,58,68,218,0 - pshufd $78,%xmm3,%xmm4 - - pxor %xmm0,%xmm8 - movdqa %xmm3,%xmm5 - pxor %xmm1,%xmm8 - pxor %xmm3,%xmm4 - movdqa %xmm8,%xmm9 -.byte 102,68,15,58,68,234,17 - pslldq $8,%xmm8 - psrldq $8,%xmm9 - pxor %xmm8,%xmm0 - movdqa L$7_mask(%rip),%xmm8 - pxor %xmm9,%xmm1 -.byte 102,76,15,110,200 - - pand %xmm0,%xmm8 -.byte 102,69,15,56,0,200 - pxor %xmm0,%xmm9 -.byte 102,68,15,58,68,231,0 - psllq $57,%xmm9 - movdqa %xmm9,%xmm8 - pslldq $8,%xmm9 -.byte 102,15,58,68,222,0 - psrldq $8,%xmm8 - pxor %xmm9,%xmm0 - pxor %xmm8,%xmm1 - movdqu 0(%rdx),%xmm8 - - movdqa %xmm0,%xmm9 - psrlq $1,%xmm0 -.byte 102,15,58,68,238,17 - xorps %xmm11,%xmm3 - movdqu 16(%rdx),%xmm11 -.byte 102,69,15,56,0,218 -.byte 102,15,58,68,231,16 - xorps %xmm13,%xmm5 - movups 80(%rsi),%xmm7 -.byte 102,69,15,56,0,194 - pxor %xmm9,%xmm1 - pxor %xmm0,%xmm9 - psrlq $5,%xmm0 - - movdqa %xmm11,%xmm13 - pxor %xmm12,%xmm4 - pshufd $78,%xmm11,%xmm12 - pxor %xmm9,%xmm0 - pxor %xmm8,%xmm1 - pxor %xmm11,%xmm12 -.byte 102,69,15,58,68,222,0 - psrlq $1,%xmm0 - pxor %xmm1,%xmm0 - movdqa %xmm0,%xmm1 -.byte 102,69,15,58,68,238,17 - xorps %xmm11,%xmm3 - pshufd $78,%xmm0,%xmm8 - pxor %xmm0,%xmm8 - -.byte 102,68,15,58,68,231,0 - xorps %xmm13,%xmm5 - - leaq 64(%rdx),%rdx - subq $0x40,%rcx - jnc L$mod4_loop - -L$tail4x: -.byte 102,65,15,58,68,199,0 -.byte 102,65,15,58,68,207,17 -.byte 102,68,15,58,68,199,16 - xorps %xmm12,%xmm4 - xorps %xmm3,%xmm0 - xorps %xmm5,%xmm1 - pxor %xmm0,%xmm1 - pxor %xmm4,%xmm8 - - pxor %xmm1,%xmm8 - pxor %xmm0,%xmm1 - - movdqa %xmm8,%xmm9 - psrldq $8,%xmm8 - pslldq $8,%xmm9 - pxor %xmm8,%xmm1 - pxor %xmm9,%xmm0 - - movdqa %xmm0,%xmm4 - movdqa %xmm0,%xmm3 - psllq $5,%xmm0 - pxor %xmm0,%xmm3 - psllq $1,%xmm0 - pxor %xmm3,%xmm0 - psllq $57,%xmm0 - movdqa %xmm0,%xmm3 - pslldq $8,%xmm0 - psrldq $8,%xmm3 - pxor %xmm4,%xmm0 - pxor %xmm3,%xmm1 - - - movdqa %xmm0,%xmm4 - psrlq $1,%xmm0 - pxor %xmm4,%xmm1 - pxor %xmm0,%xmm4 - psrlq $5,%xmm0 - pxor %xmm4,%xmm0 - psrlq $1,%xmm0 - pxor %xmm1,%xmm0 - addq $0x40,%rcx - jz L$done - movdqu 32(%rsi),%xmm7 - subq $0x10,%rcx - jz L$odd_tail -L$skip4x: - - - - - - movdqu (%rdx),%xmm8 - movdqu 16(%rdx),%xmm3 -.byte 102,69,15,56,0,194 -.byte 102,65,15,56,0,218 - pxor %xmm8,%xmm0 - - movdqa %xmm3,%xmm5 - pshufd $78,%xmm3,%xmm4 - pxor %xmm3,%xmm4 -.byte 102,15,58,68,218,0 -.byte 102,15,58,68,234,17 -.byte 102,15,58,68,231,0 - - leaq 32(%rdx),%rdx - nop - subq $0x20,%rcx - jbe L$even_tail - nop - jmp L$mod_loop - -.p2align 5 -L$mod_loop: - movdqa %xmm0,%xmm1 - movdqa %xmm4,%xmm8 - pshufd $78,%xmm0,%xmm4 - pxor %xmm0,%xmm4 - -.byte 102,15,58,68,198,0 -.byte 102,15,58,68,206,17 -.byte 102,15,58,68,231,16 - - pxor %xmm3,%xmm0 - pxor %xmm5,%xmm1 - movdqu (%rdx),%xmm9 - pxor %xmm0,%xmm8 -.byte 102,69,15,56,0,202 - movdqu 16(%rdx),%xmm3 - - pxor %xmm1,%xmm8 - pxor %xmm9,%xmm1 - pxor %xmm8,%xmm4 -.byte 102,65,15,56,0,218 - movdqa %xmm4,%xmm8 - psrldq $8,%xmm8 - pslldq $8,%xmm4 - pxor %xmm8,%xmm1 - pxor %xmm4,%xmm0 - - movdqa %xmm3,%xmm5 - - movdqa %xmm0,%xmm9 - movdqa %xmm0,%xmm8 - psllq $5,%xmm0 - pxor %xmm0,%xmm8 -.byte 102,15,58,68,218,0 - psllq $1,%xmm0 - pxor %xmm8,%xmm0 - psllq $57,%xmm0 - movdqa %xmm0,%xmm8 - pslldq $8,%xmm0 - psrldq $8,%xmm8 - pxor %xmm9,%xmm0 - pshufd $78,%xmm5,%xmm4 - pxor %xmm8,%xmm1 - pxor %xmm5,%xmm4 - - movdqa %xmm0,%xmm9 - psrlq $1,%xmm0 -.byte 102,15,58,68,234,17 - pxor %xmm9,%xmm1 - pxor %xmm0,%xmm9 - psrlq $5,%xmm0 - pxor %xmm9,%xmm0 - leaq 32(%rdx),%rdx - psrlq $1,%xmm0 -.byte 102,15,58,68,231,0 - pxor %xmm1,%xmm0 - - subq $0x20,%rcx - ja L$mod_loop - -L$even_tail: - movdqa %xmm0,%xmm1 - movdqa %xmm4,%xmm8 - pshufd $78,%xmm0,%xmm4 - pxor %xmm0,%xmm4 - -.byte 102,15,58,68,198,0 -.byte 102,15,58,68,206,17 -.byte 102,15,58,68,231,16 - - pxor %xmm3,%xmm0 - pxor %xmm5,%xmm1 - pxor %xmm0,%xmm8 - pxor %xmm1,%xmm8 - pxor %xmm8,%xmm4 - movdqa %xmm4,%xmm8 - psrldq $8,%xmm8 - pslldq $8,%xmm4 - pxor %xmm8,%xmm1 - pxor %xmm4,%xmm0 - - movdqa %xmm0,%xmm4 - movdqa %xmm0,%xmm3 - psllq $5,%xmm0 - pxor %xmm0,%xmm3 - psllq $1,%xmm0 - pxor %xmm3,%xmm0 - psllq $57,%xmm0 - movdqa %xmm0,%xmm3 - pslldq $8,%xmm0 - psrldq $8,%xmm3 - pxor %xmm4,%xmm0 - pxor %xmm3,%xmm1 - - - movdqa %xmm0,%xmm4 - psrlq $1,%xmm0 - pxor %xmm4,%xmm1 - pxor %xmm0,%xmm4 - psrlq $5,%xmm0 - pxor %xmm4,%xmm0 - psrlq $1,%xmm0 - pxor %xmm1,%xmm0 - testq %rcx,%rcx - jnz L$done - -L$odd_tail: - movdqu (%rdx),%xmm8 -.byte 102,69,15,56,0,194 - pxor %xmm8,%xmm0 - movdqa %xmm0,%xmm1 - pshufd $78,%xmm0,%xmm3 - pxor %xmm0,%xmm3 -.byte 102,15,58,68,194,0 -.byte 102,15,58,68,202,17 -.byte 102,15,58,68,223,0 - pxor %xmm0,%xmm3 - pxor %xmm1,%xmm3 - - movdqa %xmm3,%xmm4 - psrldq $8,%xmm3 - pslldq $8,%xmm4 - pxor %xmm3,%xmm1 - pxor %xmm4,%xmm0 - - movdqa %xmm0,%xmm4 - movdqa %xmm0,%xmm3 - psllq $5,%xmm0 - pxor %xmm0,%xmm3 - psllq $1,%xmm0 - pxor %xmm3,%xmm0 - psllq $57,%xmm0 - movdqa %xmm0,%xmm3 - pslldq $8,%xmm0 - psrldq $8,%xmm3 - pxor %xmm4,%xmm0 - pxor %xmm3,%xmm1 - - - movdqa %xmm0,%xmm4 - psrlq $1,%xmm0 - pxor %xmm4,%xmm1 - pxor %xmm0,%xmm4 - psrlq $5,%xmm0 - pxor %xmm4,%xmm0 - psrlq $1,%xmm0 - pxor %xmm1,%xmm0 -L$done: -.byte 102,65,15,56,0,194 - movdqu %xmm0,(%rdi) - .byte 0xf3,0xc3 - - -.globl _GFp_gcm_init_avx -.private_extern _GFp_gcm_init_avx - -.p2align 5 -_GFp_gcm_init_avx: - - vzeroupper - - vmovdqu (%rsi),%xmm2 - vpshufd $78,%xmm2,%xmm2 - - - vpshufd $255,%xmm2,%xmm4 - vpsrlq $63,%xmm2,%xmm3 - vpsllq $1,%xmm2,%xmm2 - vpxor %xmm5,%xmm5,%xmm5 - vpcmpgtd %xmm4,%xmm5,%xmm5 - vpslldq $8,%xmm3,%xmm3 - vpor %xmm3,%xmm2,%xmm2 - - - vpand L$0x1c2_polynomial(%rip),%xmm5,%xmm5 - vpxor %xmm5,%xmm2,%xmm2 - - vpunpckhqdq %xmm2,%xmm2,%xmm6 - vmovdqa %xmm2,%xmm0 - vpxor %xmm2,%xmm6,%xmm6 - movq $4,%r10 - jmp L$init_start_avx -.p2align 5 -L$init_loop_avx: - vpalignr $8,%xmm3,%xmm4,%xmm5 - vmovdqu %xmm5,-16(%rdi) - vpunpckhqdq %xmm0,%xmm0,%xmm3 - vpxor %xmm0,%xmm3,%xmm3 - vpclmulqdq $0x11,%xmm2,%xmm0,%xmm1 - vpclmulqdq $0x00,%xmm2,%xmm0,%xmm0 - vpclmulqdq $0x00,%xmm6,%xmm3,%xmm3 - vpxor %xmm0,%xmm1,%xmm4 - vpxor %xmm4,%xmm3,%xmm3 - - vpslldq $8,%xmm3,%xmm4 - vpsrldq $8,%xmm3,%xmm3 - vpxor %xmm4,%xmm0,%xmm0 - vpxor %xmm3,%xmm1,%xmm1 - vpsllq $57,%xmm0,%xmm3 - vpsllq $62,%xmm0,%xmm4 - vpxor %xmm3,%xmm4,%xmm4 - vpsllq $63,%xmm0,%xmm3 - vpxor %xmm3,%xmm4,%xmm4 - vpslldq $8,%xmm4,%xmm3 - vpsrldq $8,%xmm4,%xmm4 - vpxor %xmm3,%xmm0,%xmm0 - vpxor %xmm4,%xmm1,%xmm1 - - vpsrlq $1,%xmm0,%xmm4 - vpxor %xmm0,%xmm1,%xmm1 - vpxor %xmm4,%xmm0,%xmm0 - vpsrlq $5,%xmm4,%xmm4 - vpxor %xmm4,%xmm0,%xmm0 - vpsrlq $1,%xmm0,%xmm0 - vpxor %xmm1,%xmm0,%xmm0 -L$init_start_avx: - vmovdqa %xmm0,%xmm5 - vpunpckhqdq %xmm0,%xmm0,%xmm3 - vpxor %xmm0,%xmm3,%xmm3 - vpclmulqdq $0x11,%xmm2,%xmm0,%xmm1 - vpclmulqdq $0x00,%xmm2,%xmm0,%xmm0 - vpclmulqdq $0x00,%xmm6,%xmm3,%xmm3 - vpxor %xmm0,%xmm1,%xmm4 - vpxor %xmm4,%xmm3,%xmm3 - - vpslldq $8,%xmm3,%xmm4 - vpsrldq $8,%xmm3,%xmm3 - vpxor %xmm4,%xmm0,%xmm0 - vpxor %xmm3,%xmm1,%xmm1 - vpsllq $57,%xmm0,%xmm3 - vpsllq $62,%xmm0,%xmm4 - vpxor %xmm3,%xmm4,%xmm4 - vpsllq $63,%xmm0,%xmm3 - vpxor %xmm3,%xmm4,%xmm4 - vpslldq $8,%xmm4,%xmm3 - vpsrldq $8,%xmm4,%xmm4 - vpxor %xmm3,%xmm0,%xmm0 - vpxor %xmm4,%xmm1,%xmm1 - - vpsrlq $1,%xmm0,%xmm4 - vpxor %xmm0,%xmm1,%xmm1 - vpxor %xmm4,%xmm0,%xmm0 - vpsrlq $5,%xmm4,%xmm4 - vpxor %xmm4,%xmm0,%xmm0 - vpsrlq $1,%xmm0,%xmm0 - vpxor %xmm1,%xmm0,%xmm0 - vpshufd $78,%xmm5,%xmm3 - vpshufd $78,%xmm0,%xmm4 - vpxor %xmm5,%xmm3,%xmm3 - vmovdqu %xmm5,0(%rdi) - vpxor %xmm0,%xmm4,%xmm4 - vmovdqu %xmm0,16(%rdi) - leaq 48(%rdi),%rdi - subq $1,%r10 - jnz L$init_loop_avx - - vpalignr $8,%xmm4,%xmm3,%xmm5 - vmovdqu %xmm5,-16(%rdi) - - vzeroupper - .byte 0xf3,0xc3 - - -.globl _GFp_gcm_ghash_avx -.private_extern _GFp_gcm_ghash_avx - -.p2align 5 -_GFp_gcm_ghash_avx: - - vzeroupper - - vmovdqu (%rdi),%xmm10 - leaq L$0x1c2_polynomial(%rip),%r10 - leaq 64(%rsi),%rsi - vmovdqu L$bswap_mask(%rip),%xmm13 - vpshufb %xmm13,%xmm10,%xmm10 - cmpq $0x80,%rcx - jb L$short_avx - subq $0x80,%rcx - - vmovdqu 112(%rdx),%xmm14 - vmovdqu 0-64(%rsi),%xmm6 - vpshufb %xmm13,%xmm14,%xmm14 - vmovdqu 32-64(%rsi),%xmm7 - - vpunpckhqdq %xmm14,%xmm14,%xmm9 - vmovdqu 96(%rdx),%xmm15 - vpclmulqdq $0x00,%xmm6,%xmm14,%xmm0 - vpxor %xmm14,%xmm9,%xmm9 - vpshufb %xmm13,%xmm15,%xmm15 - vpclmulqdq $0x11,%xmm6,%xmm14,%xmm1 - vmovdqu 16-64(%rsi),%xmm6 - vpunpckhqdq %xmm15,%xmm15,%xmm8 - vmovdqu 80(%rdx),%xmm14 - vpclmulqdq $0x00,%xmm7,%xmm9,%xmm2 - vpxor %xmm15,%xmm8,%xmm8 - - vpshufb %xmm13,%xmm14,%xmm14 - vpclmulqdq $0x00,%xmm6,%xmm15,%xmm3 - vpunpckhqdq %xmm14,%xmm14,%xmm9 - vpclmulqdq $0x11,%xmm6,%xmm15,%xmm4 - vmovdqu 48-64(%rsi),%xmm6 - vpxor %xmm14,%xmm9,%xmm9 - vmovdqu 64(%rdx),%xmm15 - vpclmulqdq $0x10,%xmm7,%xmm8,%xmm5 - vmovdqu 80-64(%rsi),%xmm7 - - vpshufb %xmm13,%xmm15,%xmm15 - vpxor %xmm0,%xmm3,%xmm3 - vpclmulqdq $0x00,%xmm6,%xmm14,%xmm0 - vpxor %xmm1,%xmm4,%xmm4 - vpunpckhqdq %xmm15,%xmm15,%xmm8 - vpclmulqdq $0x11,%xmm6,%xmm14,%xmm1 - vmovdqu 64-64(%rsi),%xmm6 - vpxor %xmm2,%xmm5,%xmm5 - vpclmulqdq $0x00,%xmm7,%xmm9,%xmm2 - vpxor %xmm15,%xmm8,%xmm8 - - vmovdqu 48(%rdx),%xmm14 - vpxor %xmm3,%xmm0,%xmm0 - vpclmulqdq $0x00,%xmm6,%xmm15,%xmm3 - vpxor %xmm4,%xmm1,%xmm1 - vpshufb %xmm13,%xmm14,%xmm14 - vpclmulqdq $0x11,%xmm6,%xmm15,%xmm4 - vmovdqu 96-64(%rsi),%xmm6 - vpxor %xmm5,%xmm2,%xmm2 - vpunpckhqdq %xmm14,%xmm14,%xmm9 - vpclmulqdq $0x10,%xmm7,%xmm8,%xmm5 - vmovdqu 128-64(%rsi),%xmm7 - vpxor %xmm14,%xmm9,%xmm9 - - vmovdqu 32(%rdx),%xmm15 - vpxor %xmm0,%xmm3,%xmm3 - vpclmulqdq $0x00,%xmm6,%xmm14,%xmm0 - vpxor %xmm1,%xmm4,%xmm4 - vpshufb %xmm13,%xmm15,%xmm15 - vpclmulqdq $0x11,%xmm6,%xmm14,%xmm1 - vmovdqu 112-64(%rsi),%xmm6 - vpxor %xmm2,%xmm5,%xmm5 - vpunpckhqdq %xmm15,%xmm15,%xmm8 - vpclmulqdq $0x00,%xmm7,%xmm9,%xmm2 - vpxor %xmm15,%xmm8,%xmm8 - - vmovdqu 16(%rdx),%xmm14 - vpxor %xmm3,%xmm0,%xmm0 - vpclmulqdq $0x00,%xmm6,%xmm15,%xmm3 - vpxor %xmm4,%xmm1,%xmm1 - vpshufb %xmm13,%xmm14,%xmm14 - vpclmulqdq $0x11,%xmm6,%xmm15,%xmm4 - vmovdqu 144-64(%rsi),%xmm6 - vpxor %xmm5,%xmm2,%xmm2 - vpunpckhqdq %xmm14,%xmm14,%xmm9 - vpclmulqdq $0x10,%xmm7,%xmm8,%xmm5 - vmovdqu 176-64(%rsi),%xmm7 - vpxor %xmm14,%xmm9,%xmm9 - - vmovdqu (%rdx),%xmm15 - vpxor %xmm0,%xmm3,%xmm3 - vpclmulqdq $0x00,%xmm6,%xmm14,%xmm0 - vpxor %xmm1,%xmm4,%xmm4 - vpshufb %xmm13,%xmm15,%xmm15 - vpclmulqdq $0x11,%xmm6,%xmm14,%xmm1 - vmovdqu 160-64(%rsi),%xmm6 - vpxor %xmm2,%xmm5,%xmm5 - vpclmulqdq $0x10,%xmm7,%xmm9,%xmm2 - - leaq 128(%rdx),%rdx - cmpq $0x80,%rcx - jb L$tail_avx - - vpxor %xmm10,%xmm15,%xmm15 - subq $0x80,%rcx - jmp L$oop8x_avx - -.p2align 5 -L$oop8x_avx: - vpunpckhqdq %xmm15,%xmm15,%xmm8 - vmovdqu 112(%rdx),%xmm14 - vpxor %xmm0,%xmm3,%xmm3 - vpxor %xmm15,%xmm8,%xmm8 - vpclmulqdq $0x00,%xmm6,%xmm15,%xmm10 - vpshufb %xmm13,%xmm14,%xmm14 - vpxor %xmm1,%xmm4,%xmm4 - vpclmulqdq $0x11,%xmm6,%xmm15,%xmm11 - vmovdqu 0-64(%rsi),%xmm6 - vpunpckhqdq %xmm14,%xmm14,%xmm9 - vpxor %xmm2,%xmm5,%xmm5 - vpclmulqdq $0x00,%xmm7,%xmm8,%xmm12 - vmovdqu 32-64(%rsi),%xmm7 - vpxor %xmm14,%xmm9,%xmm9 - - vmovdqu 96(%rdx),%xmm15 - vpclmulqdq $0x00,%xmm6,%xmm14,%xmm0 - vpxor %xmm3,%xmm10,%xmm10 - vpshufb %xmm13,%xmm15,%xmm15 - vpclmulqdq $0x11,%xmm6,%xmm14,%xmm1 - vxorps %xmm4,%xmm11,%xmm11 - vmovdqu 16-64(%rsi),%xmm6 - vpunpckhqdq %xmm15,%xmm15,%xmm8 - vpclmulqdq $0x00,%xmm7,%xmm9,%xmm2 - vpxor %xmm5,%xmm12,%xmm12 - vxorps %xmm15,%xmm8,%xmm8 - - vmovdqu 80(%rdx),%xmm14 - vpxor %xmm10,%xmm12,%xmm12 - vpclmulqdq $0x00,%xmm6,%xmm15,%xmm3 - vpxor %xmm11,%xmm12,%xmm12 - vpslldq $8,%xmm12,%xmm9 - vpxor %xmm0,%xmm3,%xmm3 - vpclmulqdq $0x11,%xmm6,%xmm15,%xmm4 - vpsrldq $8,%xmm12,%xmm12 - vpxor %xmm9,%xmm10,%xmm10 - vmovdqu 48-64(%rsi),%xmm6 - vpshufb %xmm13,%xmm14,%xmm14 - vxorps %xmm12,%xmm11,%xmm11 - vpxor %xmm1,%xmm4,%xmm4 - vpunpckhqdq %xmm14,%xmm14,%xmm9 - vpclmulqdq $0x10,%xmm7,%xmm8,%xmm5 - vmovdqu 80-64(%rsi),%xmm7 - vpxor %xmm14,%xmm9,%xmm9 - vpxor %xmm2,%xmm5,%xmm5 - - vmovdqu 64(%rdx),%xmm15 - vpalignr $8,%xmm10,%xmm10,%xmm12 - vpclmulqdq $0x00,%xmm6,%xmm14,%xmm0 - vpshufb %xmm13,%xmm15,%xmm15 - vpxor %xmm3,%xmm0,%xmm0 - vpclmulqdq $0x11,%xmm6,%xmm14,%xmm1 - vmovdqu 64-64(%rsi),%xmm6 - vpunpckhqdq %xmm15,%xmm15,%xmm8 - vpxor %xmm4,%xmm1,%xmm1 - vpclmulqdq $0x00,%xmm7,%xmm9,%xmm2 - vxorps %xmm15,%xmm8,%xmm8 - vpxor %xmm5,%xmm2,%xmm2 - - vmovdqu 48(%rdx),%xmm14 - vpclmulqdq $0x10,(%r10),%xmm10,%xmm10 - vpclmulqdq $0x00,%xmm6,%xmm15,%xmm3 - vpshufb %xmm13,%xmm14,%xmm14 - vpxor %xmm0,%xmm3,%xmm3 - vpclmulqdq $0x11,%xmm6,%xmm15,%xmm4 - vmovdqu 96-64(%rsi),%xmm6 - vpunpckhqdq %xmm14,%xmm14,%xmm9 - vpxor %xmm1,%xmm4,%xmm4 - vpclmulqdq $0x10,%xmm7,%xmm8,%xmm5 - vmovdqu 128-64(%rsi),%xmm7 - vpxor %xmm14,%xmm9,%xmm9 - vpxor %xmm2,%xmm5,%xmm5 - - vmovdqu 32(%rdx),%xmm15 - vpclmulqdq $0x00,%xmm6,%xmm14,%xmm0 - vpshufb %xmm13,%xmm15,%xmm15 - vpxor %xmm3,%xmm0,%xmm0 - vpclmulqdq $0x11,%xmm6,%xmm14,%xmm1 - vmovdqu 112-64(%rsi),%xmm6 - vpunpckhqdq %xmm15,%xmm15,%xmm8 - vpxor %xmm4,%xmm1,%xmm1 - vpclmulqdq $0x00,%xmm7,%xmm9,%xmm2 - vpxor %xmm15,%xmm8,%xmm8 - vpxor %xmm5,%xmm2,%xmm2 - vxorps %xmm12,%xmm10,%xmm10 - - vmovdqu 16(%rdx),%xmm14 - vpalignr $8,%xmm10,%xmm10,%xmm12 - vpclmulqdq $0x00,%xmm6,%xmm15,%xmm3 - vpshufb %xmm13,%xmm14,%xmm14 - vpxor %xmm0,%xmm3,%xmm3 - vpclmulqdq $0x11,%xmm6,%xmm15,%xmm4 - vmovdqu 144-64(%rsi),%xmm6 - vpclmulqdq $0x10,(%r10),%xmm10,%xmm10 - vxorps %xmm11,%xmm12,%xmm12 - vpunpckhqdq %xmm14,%xmm14,%xmm9 - vpxor %xmm1,%xmm4,%xmm4 - vpclmulqdq $0x10,%xmm7,%xmm8,%xmm5 - vmovdqu 176-64(%rsi),%xmm7 - vpxor %xmm14,%xmm9,%xmm9 - vpxor %xmm2,%xmm5,%xmm5 - - vmovdqu (%rdx),%xmm15 - vpclmulqdq $0x00,%xmm6,%xmm14,%xmm0 - vpshufb %xmm13,%xmm15,%xmm15 - vpclmulqdq $0x11,%xmm6,%xmm14,%xmm1 - vmovdqu 160-64(%rsi),%xmm6 - vpxor %xmm12,%xmm15,%xmm15 - vpclmulqdq $0x10,%xmm7,%xmm9,%xmm2 - vpxor %xmm10,%xmm15,%xmm15 - - leaq 128(%rdx),%rdx - subq $0x80,%rcx - jnc L$oop8x_avx - - addq $0x80,%rcx - jmp L$tail_no_xor_avx - -.p2align 5 -L$short_avx: - vmovdqu -16(%rdx,%rcx,1),%xmm14 - leaq (%rdx,%rcx,1),%rdx - vmovdqu 0-64(%rsi),%xmm6 - vmovdqu 32-64(%rsi),%xmm7 - vpshufb %xmm13,%xmm14,%xmm15 - - vmovdqa %xmm0,%xmm3 - vmovdqa %xmm1,%xmm4 - vmovdqa %xmm2,%xmm5 - subq $0x10,%rcx - jz L$tail_avx - - vpunpckhqdq %xmm15,%xmm15,%xmm8 - vpxor %xmm0,%xmm3,%xmm3 - vpclmulqdq $0x00,%xmm6,%xmm15,%xmm0 - vpxor %xmm15,%xmm8,%xmm8 - vmovdqu -32(%rdx),%xmm14 - vpxor %xmm1,%xmm4,%xmm4 - vpclmulqdq $0x11,%xmm6,%xmm15,%xmm1 - vmovdqu 16-64(%rsi),%xmm6 - vpshufb %xmm13,%xmm14,%xmm15 - vpxor %xmm2,%xmm5,%xmm5 - vpclmulqdq $0x00,%xmm7,%xmm8,%xmm2 - vpsrldq $8,%xmm7,%xmm7 - subq $0x10,%rcx - jz L$tail_avx - - vpunpckhqdq %xmm15,%xmm15,%xmm8 - vpxor %xmm0,%xmm3,%xmm3 - vpclmulqdq $0x00,%xmm6,%xmm15,%xmm0 - vpxor %xmm15,%xmm8,%xmm8 - vmovdqu -48(%rdx),%xmm14 - vpxor %xmm1,%xmm4,%xmm4 - vpclmulqdq $0x11,%xmm6,%xmm15,%xmm1 - vmovdqu 48-64(%rsi),%xmm6 - vpshufb %xmm13,%xmm14,%xmm15 - vpxor %xmm2,%xmm5,%xmm5 - vpclmulqdq $0x00,%xmm7,%xmm8,%xmm2 - vmovdqu 80-64(%rsi),%xmm7 - subq $0x10,%rcx - jz L$tail_avx - - vpunpckhqdq %xmm15,%xmm15,%xmm8 - vpxor %xmm0,%xmm3,%xmm3 - vpclmulqdq $0x00,%xmm6,%xmm15,%xmm0 - vpxor %xmm15,%xmm8,%xmm8 - vmovdqu -64(%rdx),%xmm14 - vpxor %xmm1,%xmm4,%xmm4 - vpclmulqdq $0x11,%xmm6,%xmm15,%xmm1 - vmovdqu 64-64(%rsi),%xmm6 - vpshufb %xmm13,%xmm14,%xmm15 - vpxor %xmm2,%xmm5,%xmm5 - vpclmulqdq $0x00,%xmm7,%xmm8,%xmm2 - vpsrldq $8,%xmm7,%xmm7 - subq $0x10,%rcx - jz L$tail_avx - - vpunpckhqdq %xmm15,%xmm15,%xmm8 - vpxor %xmm0,%xmm3,%xmm3 - vpclmulqdq $0x00,%xmm6,%xmm15,%xmm0 - vpxor %xmm15,%xmm8,%xmm8 - vmovdqu -80(%rdx),%xmm14 - vpxor %xmm1,%xmm4,%xmm4 - vpclmulqdq $0x11,%xmm6,%xmm15,%xmm1 - vmovdqu 96-64(%rsi),%xmm6 - vpshufb %xmm13,%xmm14,%xmm15 - vpxor %xmm2,%xmm5,%xmm5 - vpclmulqdq $0x00,%xmm7,%xmm8,%xmm2 - vmovdqu 128-64(%rsi),%xmm7 - subq $0x10,%rcx - jz L$tail_avx - - vpunpckhqdq %xmm15,%xmm15,%xmm8 - vpxor %xmm0,%xmm3,%xmm3 - vpclmulqdq $0x00,%xmm6,%xmm15,%xmm0 - vpxor %xmm15,%xmm8,%xmm8 - vmovdqu -96(%rdx),%xmm14 - vpxor %xmm1,%xmm4,%xmm4 - vpclmulqdq $0x11,%xmm6,%xmm15,%xmm1 - vmovdqu 112-64(%rsi),%xmm6 - vpshufb %xmm13,%xmm14,%xmm15 - vpxor %xmm2,%xmm5,%xmm5 - vpclmulqdq $0x00,%xmm7,%xmm8,%xmm2 - vpsrldq $8,%xmm7,%xmm7 - subq $0x10,%rcx - jz L$tail_avx - - vpunpckhqdq %xmm15,%xmm15,%xmm8 - vpxor %xmm0,%xmm3,%xmm3 - vpclmulqdq $0x00,%xmm6,%xmm15,%xmm0 - vpxor %xmm15,%xmm8,%xmm8 - vmovdqu -112(%rdx),%xmm14 - vpxor %xmm1,%xmm4,%xmm4 - vpclmulqdq $0x11,%xmm6,%xmm15,%xmm1 - vmovdqu 144-64(%rsi),%xmm6 - vpshufb %xmm13,%xmm14,%xmm15 - vpxor %xmm2,%xmm5,%xmm5 - vpclmulqdq $0x00,%xmm7,%xmm8,%xmm2 - vmovq 184-64(%rsi),%xmm7 - subq $0x10,%rcx - jmp L$tail_avx - -.p2align 5 -L$tail_avx: - vpxor %xmm10,%xmm15,%xmm15 -L$tail_no_xor_avx: - vpunpckhqdq %xmm15,%xmm15,%xmm8 - vpxor %xmm0,%xmm3,%xmm3 - vpclmulqdq $0x00,%xmm6,%xmm15,%xmm0 - vpxor %xmm15,%xmm8,%xmm8 - vpxor %xmm1,%xmm4,%xmm4 - vpclmulqdq $0x11,%xmm6,%xmm15,%xmm1 - vpxor %xmm2,%xmm5,%xmm5 - vpclmulqdq $0x00,%xmm7,%xmm8,%xmm2 - - vmovdqu (%r10),%xmm12 - - vpxor %xmm0,%xmm3,%xmm10 - vpxor %xmm1,%xmm4,%xmm11 - vpxor %xmm2,%xmm5,%xmm5 - - vpxor %xmm10,%xmm5,%xmm5 - vpxor %xmm11,%xmm5,%xmm5 - vpslldq $8,%xmm5,%xmm9 - vpsrldq $8,%xmm5,%xmm5 - vpxor %xmm9,%xmm10,%xmm10 - vpxor %xmm5,%xmm11,%xmm11 - - vpclmulqdq $0x10,%xmm12,%xmm10,%xmm9 - vpalignr $8,%xmm10,%xmm10,%xmm10 - vpxor %xmm9,%xmm10,%xmm10 - - vpclmulqdq $0x10,%xmm12,%xmm10,%xmm9 - vpalignr $8,%xmm10,%xmm10,%xmm10 - vpxor %xmm11,%xmm10,%xmm10 - vpxor %xmm9,%xmm10,%xmm10 - - cmpq $0,%rcx - jne L$short_avx - - vpshufb %xmm13,%xmm10,%xmm10 - vmovdqu %xmm10,(%rdi) - vzeroupper - .byte 0xf3,0xc3 - - -.p2align 6 -L$bswap_mask: -.byte 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 -L$0x1c2_polynomial: -.byte 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xc2 -L$7_mask: -.long 7,0,7,0 -.p2align 6 - -.byte 71,72,65,83,72,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 -.p2align 6 -#endif Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ghash-x86_64-nasm.obj and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ghash-x86_64-nasm.obj differ diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ghash-x86-elf.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ghash-x86-elf.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ghash-x86-elf.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ghash-x86-elf.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,364 +0,0 @@ -# This file is generated from a similarly-named Perl script in the BoringSSL -# source tree. Do not edit by hand. - -#if defined(__i386__) -#if defined(BORINGSSL_PREFIX) -#include -#endif -.text -.globl GFp_gcm_init_clmul -.hidden GFp_gcm_init_clmul -.type GFp_gcm_init_clmul,@function -.align 16 -GFp_gcm_init_clmul: -.L_GFp_gcm_init_clmul_begin: - movl 4(%esp),%edx - movl 8(%esp),%eax - call .L000pic -.L000pic: - popl %ecx - leal .Lbswap-.L000pic(%ecx),%ecx - movdqu (%eax),%xmm2 - pshufd $78,%xmm2,%xmm2 - pshufd $255,%xmm2,%xmm4 - movdqa %xmm2,%xmm3 - psllq $1,%xmm2 - pxor %xmm5,%xmm5 - psrlq $63,%xmm3 - pcmpgtd %xmm4,%xmm5 - pslldq $8,%xmm3 - por %xmm3,%xmm2 - pand 16(%ecx),%xmm5 - pxor %xmm5,%xmm2 - movdqa %xmm2,%xmm0 - movdqa %xmm0,%xmm1 - pshufd $78,%xmm0,%xmm3 - pshufd $78,%xmm2,%xmm4 - pxor %xmm0,%xmm3 - pxor %xmm2,%xmm4 -.byte 102,15,58,68,194,0 -.byte 102,15,58,68,202,17 -.byte 102,15,58,68,220,0 - xorps %xmm0,%xmm3 - xorps %xmm1,%xmm3 - movdqa %xmm3,%xmm4 - psrldq $8,%xmm3 - pslldq $8,%xmm4 - pxor %xmm3,%xmm1 - pxor %xmm4,%xmm0 - movdqa %xmm0,%xmm4 - movdqa %xmm0,%xmm3 - psllq $5,%xmm0 - pxor %xmm0,%xmm3 - psllq $1,%xmm0 - pxor %xmm3,%xmm0 - psllq $57,%xmm0 - movdqa %xmm0,%xmm3 - pslldq $8,%xmm0 - psrldq $8,%xmm3 - pxor %xmm4,%xmm0 - pxor %xmm3,%xmm1 - movdqa %xmm0,%xmm4 - psrlq $1,%xmm0 - pxor %xmm4,%xmm1 - pxor %xmm0,%xmm4 - psrlq $5,%xmm0 - pxor %xmm4,%xmm0 - psrlq $1,%xmm0 - pxor %xmm1,%xmm0 - pshufd $78,%xmm2,%xmm3 - pshufd $78,%xmm0,%xmm4 - pxor %xmm2,%xmm3 - movdqu %xmm2,(%edx) - pxor %xmm0,%xmm4 - movdqu %xmm0,16(%edx) -.byte 102,15,58,15,227,8 - movdqu %xmm4,32(%edx) - ret -.size GFp_gcm_init_clmul,.-.L_GFp_gcm_init_clmul_begin -.globl GFp_gcm_gmult_clmul -.hidden GFp_gcm_gmult_clmul -.type GFp_gcm_gmult_clmul,@function -.align 16 -GFp_gcm_gmult_clmul: -.L_GFp_gcm_gmult_clmul_begin: - movl 4(%esp),%eax - movl 8(%esp),%edx - call .L001pic -.L001pic: - popl %ecx - leal .Lbswap-.L001pic(%ecx),%ecx - movdqu (%eax),%xmm0 - movdqa (%ecx),%xmm5 - movups (%edx),%xmm2 -.byte 102,15,56,0,197 - movups 32(%edx),%xmm4 - movdqa %xmm0,%xmm1 - pshufd $78,%xmm0,%xmm3 - pxor %xmm0,%xmm3 -.byte 102,15,58,68,194,0 -.byte 102,15,58,68,202,17 -.byte 102,15,58,68,220,0 - xorps %xmm0,%xmm3 - xorps %xmm1,%xmm3 - movdqa %xmm3,%xmm4 - psrldq $8,%xmm3 - pslldq $8,%xmm4 - pxor %xmm3,%xmm1 - pxor %xmm4,%xmm0 - movdqa %xmm0,%xmm4 - movdqa %xmm0,%xmm3 - psllq $5,%xmm0 - pxor %xmm0,%xmm3 - psllq $1,%xmm0 - pxor %xmm3,%xmm0 - psllq $57,%xmm0 - movdqa %xmm0,%xmm3 - pslldq $8,%xmm0 - psrldq $8,%xmm3 - pxor %xmm4,%xmm0 - pxor %xmm3,%xmm1 - movdqa %xmm0,%xmm4 - psrlq $1,%xmm0 - pxor %xmm4,%xmm1 - pxor %xmm0,%xmm4 - psrlq $5,%xmm0 - pxor %xmm4,%xmm0 - psrlq $1,%xmm0 - pxor %xmm1,%xmm0 -.byte 102,15,56,0,197 - movdqu %xmm0,(%eax) - ret -.size GFp_gcm_gmult_clmul,.-.L_GFp_gcm_gmult_clmul_begin -.globl GFp_gcm_ghash_clmul -.hidden GFp_gcm_ghash_clmul -.type GFp_gcm_ghash_clmul,@function -.align 16 -GFp_gcm_ghash_clmul: -.L_GFp_gcm_ghash_clmul_begin: - pushl %ebp - pushl %ebx - pushl %esi - pushl %edi - movl 20(%esp),%eax - movl 24(%esp),%edx - movl 28(%esp),%esi - movl 32(%esp),%ebx - call .L002pic -.L002pic: - popl %ecx - leal .Lbswap-.L002pic(%ecx),%ecx - movdqu (%eax),%xmm0 - movdqa (%ecx),%xmm5 - movdqu (%edx),%xmm2 -.byte 102,15,56,0,197 - subl $16,%ebx - jz .L003odd_tail - movdqu (%esi),%xmm3 - movdqu 16(%esi),%xmm6 -.byte 102,15,56,0,221 -.byte 102,15,56,0,245 - movdqu 32(%edx),%xmm5 - pxor %xmm3,%xmm0 - pshufd $78,%xmm6,%xmm3 - movdqa %xmm6,%xmm7 - pxor %xmm6,%xmm3 - leal 32(%esi),%esi -.byte 102,15,58,68,242,0 -.byte 102,15,58,68,250,17 -.byte 102,15,58,68,221,0 - movups 16(%edx),%xmm2 - nop - subl $32,%ebx - jbe .L004even_tail - jmp .L005mod_loop -.align 32 -.L005mod_loop: - pshufd $78,%xmm0,%xmm4 - movdqa %xmm0,%xmm1 - pxor %xmm0,%xmm4 - nop -.byte 102,15,58,68,194,0 -.byte 102,15,58,68,202,17 -.byte 102,15,58,68,229,16 - movups (%edx),%xmm2 - xorps %xmm6,%xmm0 - movdqa (%ecx),%xmm5 - xorps %xmm7,%xmm1 - movdqu (%esi),%xmm7 - pxor %xmm0,%xmm3 - movdqu 16(%esi),%xmm6 - pxor %xmm1,%xmm3 -.byte 102,15,56,0,253 - pxor %xmm3,%xmm4 - movdqa %xmm4,%xmm3 - psrldq $8,%xmm4 - pslldq $8,%xmm3 - pxor %xmm4,%xmm1 - pxor %xmm3,%xmm0 -.byte 102,15,56,0,245 - pxor %xmm7,%xmm1 - movdqa %xmm6,%xmm7 - movdqa %xmm0,%xmm4 - movdqa %xmm0,%xmm3 - psllq $5,%xmm0 - pxor %xmm0,%xmm3 - psllq $1,%xmm0 - pxor %xmm3,%xmm0 -.byte 102,15,58,68,242,0 - movups 32(%edx),%xmm5 - psllq $57,%xmm0 - movdqa %xmm0,%xmm3 - pslldq $8,%xmm0 - psrldq $8,%xmm3 - pxor %xmm4,%xmm0 - pxor %xmm3,%xmm1 - pshufd $78,%xmm7,%xmm3 - movdqa %xmm0,%xmm4 - psrlq $1,%xmm0 - pxor %xmm7,%xmm3 - pxor %xmm4,%xmm1 -.byte 102,15,58,68,250,17 - movups 16(%edx),%xmm2 - pxor %xmm0,%xmm4 - psrlq $5,%xmm0 - pxor %xmm4,%xmm0 - psrlq $1,%xmm0 - pxor %xmm1,%xmm0 -.byte 102,15,58,68,221,0 - leal 32(%esi),%esi - subl $32,%ebx - ja .L005mod_loop -.L004even_tail: - pshufd $78,%xmm0,%xmm4 - movdqa %xmm0,%xmm1 - pxor %xmm0,%xmm4 -.byte 102,15,58,68,194,0 -.byte 102,15,58,68,202,17 -.byte 102,15,58,68,229,16 - movdqa (%ecx),%xmm5 - xorps %xmm6,%xmm0 - xorps %xmm7,%xmm1 - pxor %xmm0,%xmm3 - pxor %xmm1,%xmm3 - pxor %xmm3,%xmm4 - movdqa %xmm4,%xmm3 - psrldq $8,%xmm4 - pslldq $8,%xmm3 - pxor %xmm4,%xmm1 - pxor %xmm3,%xmm0 - movdqa %xmm0,%xmm4 - movdqa %xmm0,%xmm3 - psllq $5,%xmm0 - pxor %xmm0,%xmm3 - psllq $1,%xmm0 - pxor %xmm3,%xmm0 - psllq $57,%xmm0 - movdqa %xmm0,%xmm3 - pslldq $8,%xmm0 - psrldq $8,%xmm3 - pxor %xmm4,%xmm0 - pxor %xmm3,%xmm1 - movdqa %xmm0,%xmm4 - psrlq $1,%xmm0 - pxor %xmm4,%xmm1 - pxor %xmm0,%xmm4 - psrlq $5,%xmm0 - pxor %xmm4,%xmm0 - psrlq $1,%xmm0 - pxor %xmm1,%xmm0 - testl %ebx,%ebx - jnz .L006done - movups (%edx),%xmm2 -.L003odd_tail: - movdqu (%esi),%xmm3 -.byte 102,15,56,0,221 - pxor %xmm3,%xmm0 - movdqa %xmm0,%xmm1 - pshufd $78,%xmm0,%xmm3 - pshufd $78,%xmm2,%xmm4 - pxor %xmm0,%xmm3 - pxor %xmm2,%xmm4 -.byte 102,15,58,68,194,0 -.byte 102,15,58,68,202,17 -.byte 102,15,58,68,220,0 - xorps %xmm0,%xmm3 - xorps %xmm1,%xmm3 - movdqa %xmm3,%xmm4 - psrldq $8,%xmm3 - pslldq $8,%xmm4 - pxor %xmm3,%xmm1 - pxor %xmm4,%xmm0 - movdqa %xmm0,%xmm4 - movdqa %xmm0,%xmm3 - psllq $5,%xmm0 - pxor %xmm0,%xmm3 - psllq $1,%xmm0 - pxor %xmm3,%xmm0 - psllq $57,%xmm0 - movdqa %xmm0,%xmm3 - pslldq $8,%xmm0 - psrldq $8,%xmm3 - pxor %xmm4,%xmm0 - pxor %xmm3,%xmm1 - movdqa %xmm0,%xmm4 - psrlq $1,%xmm0 - pxor %xmm4,%xmm1 - pxor %xmm0,%xmm4 - psrlq $5,%xmm0 - pxor %xmm4,%xmm0 - psrlq $1,%xmm0 - pxor %xmm1,%xmm0 -.L006done: -.byte 102,15,56,0,197 - movdqu %xmm0,(%eax) - popl %edi - popl %esi - popl %ebx - popl %ebp - ret -.size GFp_gcm_ghash_clmul,.-.L_GFp_gcm_ghash_clmul_begin -.align 64 -.Lbswap: -.byte 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 -.byte 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,194 -.align 64 -.L007rem_8bit: -.value 0,450,900,582,1800,1738,1164,1358 -.value 3600,4050,3476,3158,2328,2266,2716,2910 -.value 7200,7650,8100,7782,6952,6890,6316,6510 -.value 4656,5106,4532,4214,5432,5370,5820,6014 -.value 14400,14722,15300,14854,16200,16010,15564,15630 -.value 13904,14226,13780,13334,12632,12442,13020,13086 -.value 9312,9634,10212,9766,9064,8874,8428,8494 -.value 10864,11186,10740,10294,11640,11450,12028,12094 -.value 28800,28994,29444,29382,30600,30282,29708,30158 -.value 32400,32594,32020,31958,31128,30810,31260,31710 -.value 27808,28002,28452,28390,27560,27242,26668,27118 -.value 25264,25458,24884,24822,26040,25722,26172,26622 -.value 18624,18690,19268,19078,20424,19978,19532,19854 -.value 18128,18194,17748,17558,16856,16410,16988,17310 -.value 21728,21794,22372,22182,21480,21034,20588,20910 -.value 23280,23346,22900,22710,24056,23610,24188,24510 -.value 57600,57538,57988,58182,58888,59338,58764,58446 -.value 61200,61138,60564,60758,59416,59866,60316,59998 -.value 64800,64738,65188,65382,64040,64490,63916,63598 -.value 62256,62194,61620,61814,62520,62970,63420,63102 -.value 55616,55426,56004,56070,56904,57226,56780,56334 -.value 55120,54930,54484,54550,53336,53658,54236,53790 -.value 50528,50338,50916,50982,49768,50090,49644,49198 -.value 52080,51890,51444,51510,52344,52666,53244,52798 -.value 37248,36930,37380,37830,38536,38730,38156,38094 -.value 40848,40530,39956,40406,39064,39258,39708,39646 -.value 36256,35938,36388,36838,35496,35690,35116,35054 -.value 33712,33394,32820,33270,33976,34170,34620,34558 -.value 43456,43010,43588,43910,44744,44810,44364,44174 -.value 42960,42514,42068,42390,41176,41242,41820,41630 -.value 46560,46114,46692,47014,45800,45866,45420,45230 -.value 48112,47666,47220,47542,48376,48442,49020,48830 -.byte 71,72,65,83,72,32,102,111,114,32,120,56,54,44,32,67 -.byte 82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112 -.byte 112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62 -.byte 0 -#endif -.section .note.GNU-stack,"",@progbits diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ghash-x86-macosx.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ghash-x86-macosx.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ghash-x86-macosx.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ghash-x86-macosx.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,357 +0,0 @@ -# This file is generated from a similarly-named Perl script in the BoringSSL -# source tree. Do not edit by hand. - -#if defined(__i386__) -#if defined(BORINGSSL_PREFIX) -#include -#endif -.text -.globl _GFp_gcm_init_clmul -.private_extern _GFp_gcm_init_clmul -.align 4 -_GFp_gcm_init_clmul: -L_GFp_gcm_init_clmul_begin: - movl 4(%esp),%edx - movl 8(%esp),%eax - call L000pic -L000pic: - popl %ecx - leal Lbswap-L000pic(%ecx),%ecx - movdqu (%eax),%xmm2 - pshufd $78,%xmm2,%xmm2 - pshufd $255,%xmm2,%xmm4 - movdqa %xmm2,%xmm3 - psllq $1,%xmm2 - pxor %xmm5,%xmm5 - psrlq $63,%xmm3 - pcmpgtd %xmm4,%xmm5 - pslldq $8,%xmm3 - por %xmm3,%xmm2 - pand 16(%ecx),%xmm5 - pxor %xmm5,%xmm2 - movdqa %xmm2,%xmm0 - movdqa %xmm0,%xmm1 - pshufd $78,%xmm0,%xmm3 - pshufd $78,%xmm2,%xmm4 - pxor %xmm0,%xmm3 - pxor %xmm2,%xmm4 -.byte 102,15,58,68,194,0 -.byte 102,15,58,68,202,17 -.byte 102,15,58,68,220,0 - xorps %xmm0,%xmm3 - xorps %xmm1,%xmm3 - movdqa %xmm3,%xmm4 - psrldq $8,%xmm3 - pslldq $8,%xmm4 - pxor %xmm3,%xmm1 - pxor %xmm4,%xmm0 - movdqa %xmm0,%xmm4 - movdqa %xmm0,%xmm3 - psllq $5,%xmm0 - pxor %xmm0,%xmm3 - psllq $1,%xmm0 - pxor %xmm3,%xmm0 - psllq $57,%xmm0 - movdqa %xmm0,%xmm3 - pslldq $8,%xmm0 - psrldq $8,%xmm3 - pxor %xmm4,%xmm0 - pxor %xmm3,%xmm1 - movdqa %xmm0,%xmm4 - psrlq $1,%xmm0 - pxor %xmm4,%xmm1 - pxor %xmm0,%xmm4 - psrlq $5,%xmm0 - pxor %xmm4,%xmm0 - psrlq $1,%xmm0 - pxor %xmm1,%xmm0 - pshufd $78,%xmm2,%xmm3 - pshufd $78,%xmm0,%xmm4 - pxor %xmm2,%xmm3 - movdqu %xmm2,(%edx) - pxor %xmm0,%xmm4 - movdqu %xmm0,16(%edx) -.byte 102,15,58,15,227,8 - movdqu %xmm4,32(%edx) - ret -.globl _GFp_gcm_gmult_clmul -.private_extern _GFp_gcm_gmult_clmul -.align 4 -_GFp_gcm_gmult_clmul: -L_GFp_gcm_gmult_clmul_begin: - movl 4(%esp),%eax - movl 8(%esp),%edx - call L001pic -L001pic: - popl %ecx - leal Lbswap-L001pic(%ecx),%ecx - movdqu (%eax),%xmm0 - movdqa (%ecx),%xmm5 - movups (%edx),%xmm2 -.byte 102,15,56,0,197 - movups 32(%edx),%xmm4 - movdqa %xmm0,%xmm1 - pshufd $78,%xmm0,%xmm3 - pxor %xmm0,%xmm3 -.byte 102,15,58,68,194,0 -.byte 102,15,58,68,202,17 -.byte 102,15,58,68,220,0 - xorps %xmm0,%xmm3 - xorps %xmm1,%xmm3 - movdqa %xmm3,%xmm4 - psrldq $8,%xmm3 - pslldq $8,%xmm4 - pxor %xmm3,%xmm1 - pxor %xmm4,%xmm0 - movdqa %xmm0,%xmm4 - movdqa %xmm0,%xmm3 - psllq $5,%xmm0 - pxor %xmm0,%xmm3 - psllq $1,%xmm0 - pxor %xmm3,%xmm0 - psllq $57,%xmm0 - movdqa %xmm0,%xmm3 - pslldq $8,%xmm0 - psrldq $8,%xmm3 - pxor %xmm4,%xmm0 - pxor %xmm3,%xmm1 - movdqa %xmm0,%xmm4 - psrlq $1,%xmm0 - pxor %xmm4,%xmm1 - pxor %xmm0,%xmm4 - psrlq $5,%xmm0 - pxor %xmm4,%xmm0 - psrlq $1,%xmm0 - pxor %xmm1,%xmm0 -.byte 102,15,56,0,197 - movdqu %xmm0,(%eax) - ret -.globl _GFp_gcm_ghash_clmul -.private_extern _GFp_gcm_ghash_clmul -.align 4 -_GFp_gcm_ghash_clmul: -L_GFp_gcm_ghash_clmul_begin: - pushl %ebp - pushl %ebx - pushl %esi - pushl %edi - movl 20(%esp),%eax - movl 24(%esp),%edx - movl 28(%esp),%esi - movl 32(%esp),%ebx - call L002pic -L002pic: - popl %ecx - leal Lbswap-L002pic(%ecx),%ecx - movdqu (%eax),%xmm0 - movdqa (%ecx),%xmm5 - movdqu (%edx),%xmm2 -.byte 102,15,56,0,197 - subl $16,%ebx - jz L003odd_tail - movdqu (%esi),%xmm3 - movdqu 16(%esi),%xmm6 -.byte 102,15,56,0,221 -.byte 102,15,56,0,245 - movdqu 32(%edx),%xmm5 - pxor %xmm3,%xmm0 - pshufd $78,%xmm6,%xmm3 - movdqa %xmm6,%xmm7 - pxor %xmm6,%xmm3 - leal 32(%esi),%esi -.byte 102,15,58,68,242,0 -.byte 102,15,58,68,250,17 -.byte 102,15,58,68,221,0 - movups 16(%edx),%xmm2 - nop - subl $32,%ebx - jbe L004even_tail - jmp L005mod_loop -.align 5,0x90 -L005mod_loop: - pshufd $78,%xmm0,%xmm4 - movdqa %xmm0,%xmm1 - pxor %xmm0,%xmm4 - nop -.byte 102,15,58,68,194,0 -.byte 102,15,58,68,202,17 -.byte 102,15,58,68,229,16 - movups (%edx),%xmm2 - xorps %xmm6,%xmm0 - movdqa (%ecx),%xmm5 - xorps %xmm7,%xmm1 - movdqu (%esi),%xmm7 - pxor %xmm0,%xmm3 - movdqu 16(%esi),%xmm6 - pxor %xmm1,%xmm3 -.byte 102,15,56,0,253 - pxor %xmm3,%xmm4 - movdqa %xmm4,%xmm3 - psrldq $8,%xmm4 - pslldq $8,%xmm3 - pxor %xmm4,%xmm1 - pxor %xmm3,%xmm0 -.byte 102,15,56,0,245 - pxor %xmm7,%xmm1 - movdqa %xmm6,%xmm7 - movdqa %xmm0,%xmm4 - movdqa %xmm0,%xmm3 - psllq $5,%xmm0 - pxor %xmm0,%xmm3 - psllq $1,%xmm0 - pxor %xmm3,%xmm0 -.byte 102,15,58,68,242,0 - movups 32(%edx),%xmm5 - psllq $57,%xmm0 - movdqa %xmm0,%xmm3 - pslldq $8,%xmm0 - psrldq $8,%xmm3 - pxor %xmm4,%xmm0 - pxor %xmm3,%xmm1 - pshufd $78,%xmm7,%xmm3 - movdqa %xmm0,%xmm4 - psrlq $1,%xmm0 - pxor %xmm7,%xmm3 - pxor %xmm4,%xmm1 -.byte 102,15,58,68,250,17 - movups 16(%edx),%xmm2 - pxor %xmm0,%xmm4 - psrlq $5,%xmm0 - pxor %xmm4,%xmm0 - psrlq $1,%xmm0 - pxor %xmm1,%xmm0 -.byte 102,15,58,68,221,0 - leal 32(%esi),%esi - subl $32,%ebx - ja L005mod_loop -L004even_tail: - pshufd $78,%xmm0,%xmm4 - movdqa %xmm0,%xmm1 - pxor %xmm0,%xmm4 -.byte 102,15,58,68,194,0 -.byte 102,15,58,68,202,17 -.byte 102,15,58,68,229,16 - movdqa (%ecx),%xmm5 - xorps %xmm6,%xmm0 - xorps %xmm7,%xmm1 - pxor %xmm0,%xmm3 - pxor %xmm1,%xmm3 - pxor %xmm3,%xmm4 - movdqa %xmm4,%xmm3 - psrldq $8,%xmm4 - pslldq $8,%xmm3 - pxor %xmm4,%xmm1 - pxor %xmm3,%xmm0 - movdqa %xmm0,%xmm4 - movdqa %xmm0,%xmm3 - psllq $5,%xmm0 - pxor %xmm0,%xmm3 - psllq $1,%xmm0 - pxor %xmm3,%xmm0 - psllq $57,%xmm0 - movdqa %xmm0,%xmm3 - pslldq $8,%xmm0 - psrldq $8,%xmm3 - pxor %xmm4,%xmm0 - pxor %xmm3,%xmm1 - movdqa %xmm0,%xmm4 - psrlq $1,%xmm0 - pxor %xmm4,%xmm1 - pxor %xmm0,%xmm4 - psrlq $5,%xmm0 - pxor %xmm4,%xmm0 - psrlq $1,%xmm0 - pxor %xmm1,%xmm0 - testl %ebx,%ebx - jnz L006done - movups (%edx),%xmm2 -L003odd_tail: - movdqu (%esi),%xmm3 -.byte 102,15,56,0,221 - pxor %xmm3,%xmm0 - movdqa %xmm0,%xmm1 - pshufd $78,%xmm0,%xmm3 - pshufd $78,%xmm2,%xmm4 - pxor %xmm0,%xmm3 - pxor %xmm2,%xmm4 -.byte 102,15,58,68,194,0 -.byte 102,15,58,68,202,17 -.byte 102,15,58,68,220,0 - xorps %xmm0,%xmm3 - xorps %xmm1,%xmm3 - movdqa %xmm3,%xmm4 - psrldq $8,%xmm3 - pslldq $8,%xmm4 - pxor %xmm3,%xmm1 - pxor %xmm4,%xmm0 - movdqa %xmm0,%xmm4 - movdqa %xmm0,%xmm3 - psllq $5,%xmm0 - pxor %xmm0,%xmm3 - psllq $1,%xmm0 - pxor %xmm3,%xmm0 - psllq $57,%xmm0 - movdqa %xmm0,%xmm3 - pslldq $8,%xmm0 - psrldq $8,%xmm3 - pxor %xmm4,%xmm0 - pxor %xmm3,%xmm1 - movdqa %xmm0,%xmm4 - psrlq $1,%xmm0 - pxor %xmm4,%xmm1 - pxor %xmm0,%xmm4 - psrlq $5,%xmm0 - pxor %xmm4,%xmm0 - psrlq $1,%xmm0 - pxor %xmm1,%xmm0 -L006done: -.byte 102,15,56,0,197 - movdqu %xmm0,(%eax) - popl %edi - popl %esi - popl %ebx - popl %ebp - ret -.align 6,0x90 -Lbswap: -.byte 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 -.byte 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,194 -.align 6,0x90 -L007rem_8bit: -.value 0,450,900,582,1800,1738,1164,1358 -.value 3600,4050,3476,3158,2328,2266,2716,2910 -.value 7200,7650,8100,7782,6952,6890,6316,6510 -.value 4656,5106,4532,4214,5432,5370,5820,6014 -.value 14400,14722,15300,14854,16200,16010,15564,15630 -.value 13904,14226,13780,13334,12632,12442,13020,13086 -.value 9312,9634,10212,9766,9064,8874,8428,8494 -.value 10864,11186,10740,10294,11640,11450,12028,12094 -.value 28800,28994,29444,29382,30600,30282,29708,30158 -.value 32400,32594,32020,31958,31128,30810,31260,31710 -.value 27808,28002,28452,28390,27560,27242,26668,27118 -.value 25264,25458,24884,24822,26040,25722,26172,26622 -.value 18624,18690,19268,19078,20424,19978,19532,19854 -.value 18128,18194,17748,17558,16856,16410,16988,17310 -.value 21728,21794,22372,22182,21480,21034,20588,20910 -.value 23280,23346,22900,22710,24056,23610,24188,24510 -.value 57600,57538,57988,58182,58888,59338,58764,58446 -.value 61200,61138,60564,60758,59416,59866,60316,59998 -.value 64800,64738,65188,65382,64040,64490,63916,63598 -.value 62256,62194,61620,61814,62520,62970,63420,63102 -.value 55616,55426,56004,56070,56904,57226,56780,56334 -.value 55120,54930,54484,54550,53336,53658,54236,53790 -.value 50528,50338,50916,50982,49768,50090,49644,49198 -.value 52080,51890,51444,51510,52344,52666,53244,52798 -.value 37248,36930,37380,37830,38536,38730,38156,38094 -.value 40848,40530,39956,40406,39064,39258,39708,39646 -.value 36256,35938,36388,36838,35496,35690,35116,35054 -.value 33712,33394,32820,33270,33976,34170,34620,34558 -.value 43456,43010,43588,43910,44744,44810,44364,44174 -.value 42960,42514,42068,42390,41176,41242,41820,41630 -.value 46560,46114,46692,47014,45800,45866,45420,45230 -.value 48112,47666,47220,47542,48376,48442,49020,48830 -.byte 71,72,65,83,72,32,102,111,114,32,120,56,54,44,32,67 -.byte 82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112 -.byte 112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62 -.byte 0 -#endif Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ghash-x86-win32n.obj and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/ghash-x86-win32n.obj differ diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/p256-x86_64-asm-elf.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/p256-x86_64-asm-elf.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/p256-x86_64-asm-elf.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/p256-x86_64-asm-elf.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,4587 +0,0 @@ -# This file is generated from a similarly-named Perl script in the BoringSSL -# source tree. Do not edit by hand. - -#if defined(__has_feature) -#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) -#define OPENSSL_NO_ASM -#endif -#endif - -#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) -.text -.extern GFp_ia32cap_P -.hidden GFp_ia32cap_P - - -.align 64 -.Lpoly: -.quad 0xffffffffffffffff, 0x00000000ffffffff, 0x0000000000000000, 0xffffffff00000001 - -.LOne: -.long 1,1,1,1,1,1,1,1 -.LTwo: -.long 2,2,2,2,2,2,2,2 -.LThree: -.long 3,3,3,3,3,3,3,3 -.LONE_mont: -.quad 0x0000000000000001, 0xffffffff00000000, 0xffffffffffffffff, 0x00000000fffffffe - - -.Lord: -.quad 0xf3b9cac2fc632551, 0xbce6faada7179e84, 0xffffffffffffffff, 0xffffffff00000000 -.LordK: -.quad 0xccd1c8aaee00bc4f - - - -.globl GFp_nistz256_add -.hidden GFp_nistz256_add -.type GFp_nistz256_add,@function -.align 32 -GFp_nistz256_add: - pushq %r12 - pushq %r13 - - movq 0(%rsi),%r8 - xorq %r13,%r13 - movq 8(%rsi),%r9 - movq 16(%rsi),%r10 - movq 24(%rsi),%r11 - leaq .Lpoly(%rip),%rsi - - addq 0(%rdx),%r8 - adcq 8(%rdx),%r9 - movq %r8,%rax - adcq 16(%rdx),%r10 - adcq 24(%rdx),%r11 - movq %r9,%rdx - adcq $0,%r13 - - subq 0(%rsi),%r8 - movq %r10,%rcx - sbbq 8(%rsi),%r9 - sbbq 16(%rsi),%r10 - movq %r11,%r12 - sbbq 24(%rsi),%r11 - sbbq $0,%r13 - - cmovcq %rax,%r8 - cmovcq %rdx,%r9 - movq %r8,0(%rdi) - cmovcq %rcx,%r10 - movq %r9,8(%rdi) - cmovcq %r12,%r11 - movq %r10,16(%rdi) - movq %r11,24(%rdi) - - popq %r13 - popq %r12 - .byte 0xf3,0xc3 -.size GFp_nistz256_add,.-GFp_nistz256_add - - - -.globl GFp_nistz256_neg -.hidden GFp_nistz256_neg -.type GFp_nistz256_neg,@function -.align 32 -GFp_nistz256_neg: -.cfi_startproc - pushq %r12 -.cfi_adjust_cfa_offset 8 -.cfi_offset %r12,-16 - pushq %r13 -.cfi_adjust_cfa_offset 8 -.cfi_offset %r13,-24 -.Lneg_body: - - xorq %r8,%r8 - xorq %r9,%r9 - xorq %r10,%r10 - xorq %r11,%r11 - xorq %r13,%r13 - - subq 0(%rsi),%r8 - sbbq 8(%rsi),%r9 - sbbq 16(%rsi),%r10 - movq %r8,%rax - sbbq 24(%rsi),%r11 - leaq .Lpoly(%rip),%rsi - movq %r9,%rdx - sbbq $0,%r13 - - addq 0(%rsi),%r8 - movq %r10,%rcx - adcq 8(%rsi),%r9 - adcq 16(%rsi),%r10 - movq %r11,%r12 - adcq 24(%rsi),%r11 - testq %r13,%r13 - - cmovzq %rax,%r8 - cmovzq %rdx,%r9 - movq %r8,0(%rdi) - cmovzq %rcx,%r10 - movq %r9,8(%rdi) - cmovzq %r12,%r11 - movq %r10,16(%rdi) - movq %r11,24(%rdi) - - movq 0(%rsp),%r13 -.cfi_restore %r13 - movq 8(%rsp),%r12 -.cfi_restore %r12 - leaq 16(%rsp),%rsp -.cfi_adjust_cfa_offset -16 -.Lneg_epilogue: - .byte 0xf3,0xc3 -.cfi_endproc -.size GFp_nistz256_neg,.-GFp_nistz256_neg - - - - - - -.globl GFp_p256_scalar_mul_mont -.hidden GFp_p256_scalar_mul_mont -.type GFp_p256_scalar_mul_mont,@function -.align 32 -GFp_p256_scalar_mul_mont: -.cfi_startproc - leaq GFp_ia32cap_P(%rip),%rcx - movq 8(%rcx),%rcx - andl $0x80100,%ecx - cmpl $0x80100,%ecx - je .Lecp_nistz256_ord_mul_montx - pushq %rbp -.cfi_adjust_cfa_offset 8 -.cfi_offset %rbp,-16 - pushq %rbx -.cfi_adjust_cfa_offset 8 -.cfi_offset %rbx,-24 - pushq %r12 -.cfi_adjust_cfa_offset 8 -.cfi_offset %r12,-32 - pushq %r13 -.cfi_adjust_cfa_offset 8 -.cfi_offset %r13,-40 - pushq %r14 -.cfi_adjust_cfa_offset 8 -.cfi_offset %r14,-48 - pushq %r15 -.cfi_adjust_cfa_offset 8 -.cfi_offset %r15,-56 -.Lord_mul_body: - - movq 0(%rdx),%rax - movq %rdx,%rbx - leaq .Lord(%rip),%r14 - movq .LordK(%rip),%r15 - - - movq %rax,%rcx - mulq 0(%rsi) - movq %rax,%r8 - movq %rcx,%rax - movq %rdx,%r9 - - mulq 8(%rsi) - addq %rax,%r9 - movq %rcx,%rax - adcq $0,%rdx - movq %rdx,%r10 - - mulq 16(%rsi) - addq %rax,%r10 - movq %rcx,%rax - adcq $0,%rdx - - movq %r8,%r13 - imulq %r15,%r8 - - movq %rdx,%r11 - mulq 24(%rsi) - addq %rax,%r11 - movq %r8,%rax - adcq $0,%rdx - movq %rdx,%r12 - - - mulq 0(%r14) - movq %r8,%rbp - addq %rax,%r13 - movq %r8,%rax - adcq $0,%rdx - movq %rdx,%rcx - - subq %r8,%r10 - sbbq $0,%r8 - - mulq 8(%r14) - addq %rcx,%r9 - adcq $0,%rdx - addq %rax,%r9 - movq %rbp,%rax - adcq %rdx,%r10 - movq %rbp,%rdx - adcq $0,%r8 - - shlq $32,%rax - shrq $32,%rdx - subq %rax,%r11 - movq 8(%rbx),%rax - sbbq %rdx,%rbp - - addq %r8,%r11 - adcq %rbp,%r12 - adcq $0,%r13 - - - movq %rax,%rcx - mulq 0(%rsi) - addq %rax,%r9 - movq %rcx,%rax - adcq $0,%rdx - movq %rdx,%rbp - - mulq 8(%rsi) - addq %rbp,%r10 - adcq $0,%rdx - addq %rax,%r10 - movq %rcx,%rax - adcq $0,%rdx - movq %rdx,%rbp - - mulq 16(%rsi) - addq %rbp,%r11 - adcq $0,%rdx - addq %rax,%r11 - movq %rcx,%rax - adcq $0,%rdx - - movq %r9,%rcx - imulq %r15,%r9 - - movq %rdx,%rbp - mulq 24(%rsi) - addq %rbp,%r12 - adcq $0,%rdx - xorq %r8,%r8 - addq %rax,%r12 - movq %r9,%rax - adcq %rdx,%r13 - adcq $0,%r8 - - - mulq 0(%r14) - movq %r9,%rbp - addq %rax,%rcx - movq %r9,%rax - adcq %rdx,%rcx - - subq %r9,%r11 - sbbq $0,%r9 - - mulq 8(%r14) - addq %rcx,%r10 - adcq $0,%rdx - addq %rax,%r10 - movq %rbp,%rax - adcq %rdx,%r11 - movq %rbp,%rdx - adcq $0,%r9 - - shlq $32,%rax - shrq $32,%rdx - subq %rax,%r12 - movq 16(%rbx),%rax - sbbq %rdx,%rbp - - addq %r9,%r12 - adcq %rbp,%r13 - adcq $0,%r8 - - - movq %rax,%rcx - mulq 0(%rsi) - addq %rax,%r10 - movq %rcx,%rax - adcq $0,%rdx - movq %rdx,%rbp - - mulq 8(%rsi) - addq %rbp,%r11 - adcq $0,%rdx - addq %rax,%r11 - movq %rcx,%rax - adcq $0,%rdx - movq %rdx,%rbp - - mulq 16(%rsi) - addq %rbp,%r12 - adcq $0,%rdx - addq %rax,%r12 - movq %rcx,%rax - adcq $0,%rdx - - movq %r10,%rcx - imulq %r15,%r10 - - movq %rdx,%rbp - mulq 24(%rsi) - addq %rbp,%r13 - adcq $0,%rdx - xorq %r9,%r9 - addq %rax,%r13 - movq %r10,%rax - adcq %rdx,%r8 - adcq $0,%r9 - - - mulq 0(%r14) - movq %r10,%rbp - addq %rax,%rcx - movq %r10,%rax - adcq %rdx,%rcx - - subq %r10,%r12 - sbbq $0,%r10 - - mulq 8(%r14) - addq %rcx,%r11 - adcq $0,%rdx - addq %rax,%r11 - movq %rbp,%rax - adcq %rdx,%r12 - movq %rbp,%rdx - adcq $0,%r10 - - shlq $32,%rax - shrq $32,%rdx - subq %rax,%r13 - movq 24(%rbx),%rax - sbbq %rdx,%rbp - - addq %r10,%r13 - adcq %rbp,%r8 - adcq $0,%r9 - - - movq %rax,%rcx - mulq 0(%rsi) - addq %rax,%r11 - movq %rcx,%rax - adcq $0,%rdx - movq %rdx,%rbp - - mulq 8(%rsi) - addq %rbp,%r12 - adcq $0,%rdx - addq %rax,%r12 - movq %rcx,%rax - adcq $0,%rdx - movq %rdx,%rbp - - mulq 16(%rsi) - addq %rbp,%r13 - adcq $0,%rdx - addq %rax,%r13 - movq %rcx,%rax - adcq $0,%rdx - - movq %r11,%rcx - imulq %r15,%r11 - - movq %rdx,%rbp - mulq 24(%rsi) - addq %rbp,%r8 - adcq $0,%rdx - xorq %r10,%r10 - addq %rax,%r8 - movq %r11,%rax - adcq %rdx,%r9 - adcq $0,%r10 - - - mulq 0(%r14) - movq %r11,%rbp - addq %rax,%rcx - movq %r11,%rax - adcq %rdx,%rcx - - subq %r11,%r13 - sbbq $0,%r11 - - mulq 8(%r14) - addq %rcx,%r12 - adcq $0,%rdx - addq %rax,%r12 - movq %rbp,%rax - adcq %rdx,%r13 - movq %rbp,%rdx - adcq $0,%r11 - - shlq $32,%rax - shrq $32,%rdx - subq %rax,%r8 - sbbq %rdx,%rbp - - addq %r11,%r8 - adcq %rbp,%r9 - adcq $0,%r10 - - - movq %r12,%rsi - subq 0(%r14),%r12 - movq %r13,%r11 - sbbq 8(%r14),%r13 - movq %r8,%rcx - sbbq 16(%r14),%r8 - movq %r9,%rbp - sbbq 24(%r14),%r9 - sbbq $0,%r10 - - cmovcq %rsi,%r12 - cmovcq %r11,%r13 - cmovcq %rcx,%r8 - cmovcq %rbp,%r9 - - movq %r12,0(%rdi) - movq %r13,8(%rdi) - movq %r8,16(%rdi) - movq %r9,24(%rdi) - - movq 0(%rsp),%r15 -.cfi_restore %r15 - movq 8(%rsp),%r14 -.cfi_restore %r14 - movq 16(%rsp),%r13 -.cfi_restore %r13 - movq 24(%rsp),%r12 -.cfi_restore %r12 - movq 32(%rsp),%rbx -.cfi_restore %rbx - movq 40(%rsp),%rbp -.cfi_restore %rbp - leaq 48(%rsp),%rsp -.cfi_adjust_cfa_offset -48 -.Lord_mul_epilogue: - .byte 0xf3,0xc3 -.cfi_endproc -.size GFp_p256_scalar_mul_mont,.-GFp_p256_scalar_mul_mont - - - - - - - -.globl GFp_p256_scalar_sqr_rep_mont -.hidden GFp_p256_scalar_sqr_rep_mont -.type GFp_p256_scalar_sqr_rep_mont,@function -.align 32 -GFp_p256_scalar_sqr_rep_mont: -.cfi_startproc - leaq GFp_ia32cap_P(%rip),%rcx - movq 8(%rcx),%rcx - andl $0x80100,%ecx - cmpl $0x80100,%ecx - je .Lecp_nistz256_ord_sqr_montx - pushq %rbp -.cfi_adjust_cfa_offset 8 -.cfi_offset %rbp,-16 - pushq %rbx -.cfi_adjust_cfa_offset 8 -.cfi_offset %rbx,-24 - pushq %r12 -.cfi_adjust_cfa_offset 8 -.cfi_offset %r12,-32 - pushq %r13 -.cfi_adjust_cfa_offset 8 -.cfi_offset %r13,-40 - pushq %r14 -.cfi_adjust_cfa_offset 8 -.cfi_offset %r14,-48 - pushq %r15 -.cfi_adjust_cfa_offset 8 -.cfi_offset %r15,-56 -.Lord_sqr_body: - - movq 0(%rsi),%r8 - movq 8(%rsi),%rax - movq 16(%rsi),%r14 - movq 24(%rsi),%r15 - leaq .Lord(%rip),%rsi - movq %rdx,%rbx - jmp .Loop_ord_sqr - -.align 32 -.Loop_ord_sqr: - - movq %rax,%rbp - mulq %r8 - movq %rax,%r9 -.byte 102,72,15,110,205 - movq %r14,%rax - movq %rdx,%r10 - - mulq %r8 - addq %rax,%r10 - movq %r15,%rax -.byte 102,73,15,110,214 - adcq $0,%rdx - movq %rdx,%r11 - - mulq %r8 - addq %rax,%r11 - movq %r15,%rax -.byte 102,73,15,110,223 - adcq $0,%rdx - movq %rdx,%r12 - - - mulq %r14 - movq %rax,%r13 - movq %r14,%rax - movq %rdx,%r14 - - - mulq %rbp - addq %rax,%r11 - movq %r15,%rax - adcq $0,%rdx - movq %rdx,%r15 - - mulq %rbp - addq %rax,%r12 - adcq $0,%rdx - - addq %r15,%r12 - adcq %rdx,%r13 - adcq $0,%r14 - - - xorq %r15,%r15 - movq %r8,%rax - addq %r9,%r9 - adcq %r10,%r10 - adcq %r11,%r11 - adcq %r12,%r12 - adcq %r13,%r13 - adcq %r14,%r14 - adcq $0,%r15 - - - mulq %rax - movq %rax,%r8 -.byte 102,72,15,126,200 - movq %rdx,%rbp - - mulq %rax - addq %rbp,%r9 - adcq %rax,%r10 -.byte 102,72,15,126,208 - adcq $0,%rdx - movq %rdx,%rbp - - mulq %rax - addq %rbp,%r11 - adcq %rax,%r12 -.byte 102,72,15,126,216 - adcq $0,%rdx - movq %rdx,%rbp - - movq %r8,%rcx - imulq 32(%rsi),%r8 - - mulq %rax - addq %rbp,%r13 - adcq %rax,%r14 - movq 0(%rsi),%rax - adcq %rdx,%r15 - - - mulq %r8 - movq %r8,%rbp - addq %rax,%rcx - movq 8(%rsi),%rax - adcq %rdx,%rcx - - subq %r8,%r10 - sbbq $0,%rbp - - mulq %r8 - addq %rcx,%r9 - adcq $0,%rdx - addq %rax,%r9 - movq %r8,%rax - adcq %rdx,%r10 - movq %r8,%rdx - adcq $0,%rbp - - movq %r9,%rcx - imulq 32(%rsi),%r9 - - shlq $32,%rax - shrq $32,%rdx - subq %rax,%r11 - movq 0(%rsi),%rax - sbbq %rdx,%r8 - - addq %rbp,%r11 - adcq $0,%r8 - - - mulq %r9 - movq %r9,%rbp - addq %rax,%rcx - movq 8(%rsi),%rax - adcq %rdx,%rcx - - subq %r9,%r11 - sbbq $0,%rbp - - mulq %r9 - addq %rcx,%r10 - adcq $0,%rdx - addq %rax,%r10 - movq %r9,%rax - adcq %rdx,%r11 - movq %r9,%rdx - adcq $0,%rbp - - movq %r10,%rcx - imulq 32(%rsi),%r10 - - shlq $32,%rax - shrq $32,%rdx - subq %rax,%r8 - movq 0(%rsi),%rax - sbbq %rdx,%r9 - - addq %rbp,%r8 - adcq $0,%r9 - - - mulq %r10 - movq %r10,%rbp - addq %rax,%rcx - movq 8(%rsi),%rax - adcq %rdx,%rcx - - subq %r10,%r8 - sbbq $0,%rbp - - mulq %r10 - addq %rcx,%r11 - adcq $0,%rdx - addq %rax,%r11 - movq %r10,%rax - adcq %rdx,%r8 - movq %r10,%rdx - adcq $0,%rbp - - movq %r11,%rcx - imulq 32(%rsi),%r11 - - shlq $32,%rax - shrq $32,%rdx - subq %rax,%r9 - movq 0(%rsi),%rax - sbbq %rdx,%r10 - - addq %rbp,%r9 - adcq $0,%r10 - - - mulq %r11 - movq %r11,%rbp - addq %rax,%rcx - movq 8(%rsi),%rax - adcq %rdx,%rcx - - subq %r11,%r9 - sbbq $0,%rbp - - mulq %r11 - addq %rcx,%r8 - adcq $0,%rdx - addq %rax,%r8 - movq %r11,%rax - adcq %rdx,%r9 - movq %r11,%rdx - adcq $0,%rbp - - shlq $32,%rax - shrq $32,%rdx - subq %rax,%r10 - sbbq %rdx,%r11 - - addq %rbp,%r10 - adcq $0,%r11 - - - xorq %rdx,%rdx - addq %r12,%r8 - adcq %r13,%r9 - movq %r8,%r12 - adcq %r14,%r10 - adcq %r15,%r11 - movq %r9,%rax - adcq $0,%rdx - - - subq 0(%rsi),%r8 - movq %r10,%r14 - sbbq 8(%rsi),%r9 - sbbq 16(%rsi),%r10 - movq %r11,%r15 - sbbq 24(%rsi),%r11 - sbbq $0,%rdx - - cmovcq %r12,%r8 - cmovncq %r9,%rax - cmovncq %r10,%r14 - cmovncq %r11,%r15 - - decq %rbx - jnz .Loop_ord_sqr - - movq %r8,0(%rdi) - movq %rax,8(%rdi) - pxor %xmm1,%xmm1 - movq %r14,16(%rdi) - pxor %xmm2,%xmm2 - movq %r15,24(%rdi) - pxor %xmm3,%xmm3 - - movq 0(%rsp),%r15 -.cfi_restore %r15 - movq 8(%rsp),%r14 -.cfi_restore %r14 - movq 16(%rsp),%r13 -.cfi_restore %r13 - movq 24(%rsp),%r12 -.cfi_restore %r12 - movq 32(%rsp),%rbx -.cfi_restore %rbx - movq 40(%rsp),%rbp -.cfi_restore %rbp - leaq 48(%rsp),%rsp -.cfi_adjust_cfa_offset -48 -.Lord_sqr_epilogue: - .byte 0xf3,0xc3 -.cfi_endproc -.size GFp_p256_scalar_sqr_rep_mont,.-GFp_p256_scalar_sqr_rep_mont - -.type ecp_nistz256_ord_mul_montx,@function -.align 32 -ecp_nistz256_ord_mul_montx: -.cfi_startproc -.Lecp_nistz256_ord_mul_montx: - pushq %rbp -.cfi_adjust_cfa_offset 8 -.cfi_offset %rbp,-16 - pushq %rbx -.cfi_adjust_cfa_offset 8 -.cfi_offset %rbx,-24 - pushq %r12 -.cfi_adjust_cfa_offset 8 -.cfi_offset %r12,-32 - pushq %r13 -.cfi_adjust_cfa_offset 8 -.cfi_offset %r13,-40 - pushq %r14 -.cfi_adjust_cfa_offset 8 -.cfi_offset %r14,-48 - pushq %r15 -.cfi_adjust_cfa_offset 8 -.cfi_offset %r15,-56 -.Lord_mulx_body: - - movq %rdx,%rbx - movq 0(%rdx),%rdx - movq 0(%rsi),%r9 - movq 8(%rsi),%r10 - movq 16(%rsi),%r11 - movq 24(%rsi),%r12 - leaq -128(%rsi),%rsi - leaq .Lord-128(%rip),%r14 - movq .LordK(%rip),%r15 - - - mulxq %r9,%r8,%r9 - mulxq %r10,%rcx,%r10 - mulxq %r11,%rbp,%r11 - addq %rcx,%r9 - mulxq %r12,%rcx,%r12 - movq %r8,%rdx - mulxq %r15,%rdx,%rax - adcq %rbp,%r10 - adcq %rcx,%r11 - adcq $0,%r12 - - - xorq %r13,%r13 - mulxq 0+128(%r14),%rcx,%rbp - adcxq %rcx,%r8 - adoxq %rbp,%r9 - - mulxq 8+128(%r14),%rcx,%rbp - adcxq %rcx,%r9 - adoxq %rbp,%r10 - - mulxq 16+128(%r14),%rcx,%rbp - adcxq %rcx,%r10 - adoxq %rbp,%r11 - - mulxq 24+128(%r14),%rcx,%rbp - movq 8(%rbx),%rdx - adcxq %rcx,%r11 - adoxq %rbp,%r12 - adcxq %r8,%r12 - adoxq %r8,%r13 - adcq $0,%r13 - - - mulxq 0+128(%rsi),%rcx,%rbp - adcxq %rcx,%r9 - adoxq %rbp,%r10 - - mulxq 8+128(%rsi),%rcx,%rbp - adcxq %rcx,%r10 - adoxq %rbp,%r11 - - mulxq 16+128(%rsi),%rcx,%rbp - adcxq %rcx,%r11 - adoxq %rbp,%r12 - - mulxq 24+128(%rsi),%rcx,%rbp - movq %r9,%rdx - mulxq %r15,%rdx,%rax - adcxq %rcx,%r12 - adoxq %rbp,%r13 - - adcxq %r8,%r13 - adoxq %r8,%r8 - adcq $0,%r8 - - - mulxq 0+128(%r14),%rcx,%rbp - adcxq %rcx,%r9 - adoxq %rbp,%r10 - - mulxq 8+128(%r14),%rcx,%rbp - adcxq %rcx,%r10 - adoxq %rbp,%r11 - - mulxq 16+128(%r14),%rcx,%rbp - adcxq %rcx,%r11 - adoxq %rbp,%r12 - - mulxq 24+128(%r14),%rcx,%rbp - movq 16(%rbx),%rdx - adcxq %rcx,%r12 - adoxq %rbp,%r13 - adcxq %r9,%r13 - adoxq %r9,%r8 - adcq $0,%r8 - - - mulxq 0+128(%rsi),%rcx,%rbp - adcxq %rcx,%r10 - adoxq %rbp,%r11 - - mulxq 8+128(%rsi),%rcx,%rbp - adcxq %rcx,%r11 - adoxq %rbp,%r12 - - mulxq 16+128(%rsi),%rcx,%rbp - adcxq %rcx,%r12 - adoxq %rbp,%r13 - - mulxq 24+128(%rsi),%rcx,%rbp - movq %r10,%rdx - mulxq %r15,%rdx,%rax - adcxq %rcx,%r13 - adoxq %rbp,%r8 - - adcxq %r9,%r8 - adoxq %r9,%r9 - adcq $0,%r9 - - - mulxq 0+128(%r14),%rcx,%rbp - adcxq %rcx,%r10 - adoxq %rbp,%r11 - - mulxq 8+128(%r14),%rcx,%rbp - adcxq %rcx,%r11 - adoxq %rbp,%r12 - - mulxq 16+128(%r14),%rcx,%rbp - adcxq %rcx,%r12 - adoxq %rbp,%r13 - - mulxq 24+128(%r14),%rcx,%rbp - movq 24(%rbx),%rdx - adcxq %rcx,%r13 - adoxq %rbp,%r8 - adcxq %r10,%r8 - adoxq %r10,%r9 - adcq $0,%r9 - - - mulxq 0+128(%rsi),%rcx,%rbp - adcxq %rcx,%r11 - adoxq %rbp,%r12 - - mulxq 8+128(%rsi),%rcx,%rbp - adcxq %rcx,%r12 - adoxq %rbp,%r13 - - mulxq 16+128(%rsi),%rcx,%rbp - adcxq %rcx,%r13 - adoxq %rbp,%r8 - - mulxq 24+128(%rsi),%rcx,%rbp - movq %r11,%rdx - mulxq %r15,%rdx,%rax - adcxq %rcx,%r8 - adoxq %rbp,%r9 - - adcxq %r10,%r9 - adoxq %r10,%r10 - adcq $0,%r10 - - - mulxq 0+128(%r14),%rcx,%rbp - adcxq %rcx,%r11 - adoxq %rbp,%r12 - - mulxq 8+128(%r14),%rcx,%rbp - adcxq %rcx,%r12 - adoxq %rbp,%r13 - - mulxq 16+128(%r14),%rcx,%rbp - adcxq %rcx,%r13 - adoxq %rbp,%r8 - - mulxq 24+128(%r14),%rcx,%rbp - leaq 128(%r14),%r14 - movq %r12,%rbx - adcxq %rcx,%r8 - adoxq %rbp,%r9 - movq %r13,%rdx - adcxq %r11,%r9 - adoxq %r11,%r10 - adcq $0,%r10 - - - - movq %r8,%rcx - subq 0(%r14),%r12 - sbbq 8(%r14),%r13 - sbbq 16(%r14),%r8 - movq %r9,%rbp - sbbq 24(%r14),%r9 - sbbq $0,%r10 - - cmovcq %rbx,%r12 - cmovcq %rdx,%r13 - cmovcq %rcx,%r8 - cmovcq %rbp,%r9 - - movq %r12,0(%rdi) - movq %r13,8(%rdi) - movq %r8,16(%rdi) - movq %r9,24(%rdi) - - movq 0(%rsp),%r15 -.cfi_restore %r15 - movq 8(%rsp),%r14 -.cfi_restore %r14 - movq 16(%rsp),%r13 -.cfi_restore %r13 - movq 24(%rsp),%r12 -.cfi_restore %r12 - movq 32(%rsp),%rbx -.cfi_restore %rbx - movq 40(%rsp),%rbp -.cfi_restore %rbp - leaq 48(%rsp),%rsp -.cfi_adjust_cfa_offset -48 -.Lord_mulx_epilogue: - .byte 0xf3,0xc3 -.cfi_endproc -.size ecp_nistz256_ord_mul_montx,.-ecp_nistz256_ord_mul_montx - -.type ecp_nistz256_ord_sqr_montx,@function -.align 32 -ecp_nistz256_ord_sqr_montx: -.cfi_startproc -.Lecp_nistz256_ord_sqr_montx: - pushq %rbp -.cfi_adjust_cfa_offset 8 -.cfi_offset %rbp,-16 - pushq %rbx -.cfi_adjust_cfa_offset 8 -.cfi_offset %rbx,-24 - pushq %r12 -.cfi_adjust_cfa_offset 8 -.cfi_offset %r12,-32 - pushq %r13 -.cfi_adjust_cfa_offset 8 -.cfi_offset %r13,-40 - pushq %r14 -.cfi_adjust_cfa_offset 8 -.cfi_offset %r14,-48 - pushq %r15 -.cfi_adjust_cfa_offset 8 -.cfi_offset %r15,-56 -.Lord_sqrx_body: - - movq %rdx,%rbx - movq 0(%rsi),%rdx - movq 8(%rsi),%r14 - movq 16(%rsi),%r15 - movq 24(%rsi),%r8 - leaq .Lord(%rip),%rsi - jmp .Loop_ord_sqrx - -.align 32 -.Loop_ord_sqrx: - mulxq %r14,%r9,%r10 - mulxq %r15,%rcx,%r11 - movq %rdx,%rax -.byte 102,73,15,110,206 - mulxq %r8,%rbp,%r12 - movq %r14,%rdx - addq %rcx,%r10 -.byte 102,73,15,110,215 - adcq %rbp,%r11 - adcq $0,%r12 - xorq %r13,%r13 - - mulxq %r15,%rcx,%rbp - adcxq %rcx,%r11 - adoxq %rbp,%r12 - - mulxq %r8,%rcx,%rbp - movq %r15,%rdx - adcxq %rcx,%r12 - adoxq %rbp,%r13 - adcq $0,%r13 - - mulxq %r8,%rcx,%r14 - movq %rax,%rdx -.byte 102,73,15,110,216 - xorq %r15,%r15 - adcxq %r9,%r9 - adoxq %rcx,%r13 - adcxq %r10,%r10 - adoxq %r15,%r14 - - - mulxq %rdx,%r8,%rbp -.byte 102,72,15,126,202 - adcxq %r11,%r11 - adoxq %rbp,%r9 - adcxq %r12,%r12 - mulxq %rdx,%rcx,%rax -.byte 102,72,15,126,210 - adcxq %r13,%r13 - adoxq %rcx,%r10 - adcxq %r14,%r14 - mulxq %rdx,%rcx,%rbp -.byte 0x67 -.byte 102,72,15,126,218 - adoxq %rax,%r11 - adcxq %r15,%r15 - adoxq %rcx,%r12 - adoxq %rbp,%r13 - mulxq %rdx,%rcx,%rax - adoxq %rcx,%r14 - adoxq %rax,%r15 - - - movq %r8,%rdx - mulxq 32(%rsi),%rdx,%rcx - - xorq %rax,%rax - mulxq 0(%rsi),%rcx,%rbp - adcxq %rcx,%r8 - adoxq %rbp,%r9 - mulxq 8(%rsi),%rcx,%rbp - adcxq %rcx,%r9 - adoxq %rbp,%r10 - mulxq 16(%rsi),%rcx,%rbp - adcxq %rcx,%r10 - adoxq %rbp,%r11 - mulxq 24(%rsi),%rcx,%rbp - adcxq %rcx,%r11 - adoxq %rbp,%r8 - adcxq %rax,%r8 - - - movq %r9,%rdx - mulxq 32(%rsi),%rdx,%rcx - - mulxq 0(%rsi),%rcx,%rbp - adoxq %rcx,%r9 - adcxq %rbp,%r10 - mulxq 8(%rsi),%rcx,%rbp - adoxq %rcx,%r10 - adcxq %rbp,%r11 - mulxq 16(%rsi),%rcx,%rbp - adoxq %rcx,%r11 - adcxq %rbp,%r8 - mulxq 24(%rsi),%rcx,%rbp - adoxq %rcx,%r8 - adcxq %rbp,%r9 - adoxq %rax,%r9 - - - movq %r10,%rdx - mulxq 32(%rsi),%rdx,%rcx - - mulxq 0(%rsi),%rcx,%rbp - adcxq %rcx,%r10 - adoxq %rbp,%r11 - mulxq 8(%rsi),%rcx,%rbp - adcxq %rcx,%r11 - adoxq %rbp,%r8 - mulxq 16(%rsi),%rcx,%rbp - adcxq %rcx,%r8 - adoxq %rbp,%r9 - mulxq 24(%rsi),%rcx,%rbp - adcxq %rcx,%r9 - adoxq %rbp,%r10 - adcxq %rax,%r10 - - - movq %r11,%rdx - mulxq 32(%rsi),%rdx,%rcx - - mulxq 0(%rsi),%rcx,%rbp - adoxq %rcx,%r11 - adcxq %rbp,%r8 - mulxq 8(%rsi),%rcx,%rbp - adoxq %rcx,%r8 - adcxq %rbp,%r9 - mulxq 16(%rsi),%rcx,%rbp - adoxq %rcx,%r9 - adcxq %rbp,%r10 - mulxq 24(%rsi),%rcx,%rbp - adoxq %rcx,%r10 - adcxq %rbp,%r11 - adoxq %rax,%r11 - - - addq %r8,%r12 - adcq %r13,%r9 - movq %r12,%rdx - adcq %r14,%r10 - adcq %r15,%r11 - movq %r9,%r14 - adcq $0,%rax - - - subq 0(%rsi),%r12 - movq %r10,%r15 - sbbq 8(%rsi),%r9 - sbbq 16(%rsi),%r10 - movq %r11,%r8 - sbbq 24(%rsi),%r11 - sbbq $0,%rax - - cmovncq %r12,%rdx - cmovncq %r9,%r14 - cmovncq %r10,%r15 - cmovncq %r11,%r8 - - decq %rbx - jnz .Loop_ord_sqrx - - movq %rdx,0(%rdi) - movq %r14,8(%rdi) - pxor %xmm1,%xmm1 - movq %r15,16(%rdi) - pxor %xmm2,%xmm2 - movq %r8,24(%rdi) - pxor %xmm3,%xmm3 - - movq 0(%rsp),%r15 -.cfi_restore %r15 - movq 8(%rsp),%r14 -.cfi_restore %r14 - movq 16(%rsp),%r13 -.cfi_restore %r13 - movq 24(%rsp),%r12 -.cfi_restore %r12 - movq 32(%rsp),%rbx -.cfi_restore %rbx - movq 40(%rsp),%rbp -.cfi_restore %rbp - leaq 48(%rsp),%rsp -.cfi_adjust_cfa_offset -48 -.Lord_sqrx_epilogue: - .byte 0xf3,0xc3 -.cfi_endproc -.size ecp_nistz256_ord_sqr_montx,.-ecp_nistz256_ord_sqr_montx - - - - - - -.globl GFp_nistz256_mul_mont -.hidden GFp_nistz256_mul_mont -.type GFp_nistz256_mul_mont,@function -.align 32 -GFp_nistz256_mul_mont: -.cfi_startproc - leaq GFp_ia32cap_P(%rip),%rcx - movq 8(%rcx),%rcx - andl $0x80100,%ecx -.Lmul_mont: - pushq %rbp -.cfi_adjust_cfa_offset 8 -.cfi_offset %rbp,-16 - pushq %rbx -.cfi_adjust_cfa_offset 8 -.cfi_offset %rbx,-24 - pushq %r12 -.cfi_adjust_cfa_offset 8 -.cfi_offset %r12,-32 - pushq %r13 -.cfi_adjust_cfa_offset 8 -.cfi_offset %r13,-40 - pushq %r14 -.cfi_adjust_cfa_offset 8 -.cfi_offset %r14,-48 - pushq %r15 -.cfi_adjust_cfa_offset 8 -.cfi_offset %r15,-56 -.Lmul_body: - cmpl $0x80100,%ecx - je .Lmul_montx - movq %rdx,%rbx - movq 0(%rdx),%rax - movq 0(%rsi),%r9 - movq 8(%rsi),%r10 - movq 16(%rsi),%r11 - movq 24(%rsi),%r12 - - call __ecp_nistz256_mul_montq - jmp .Lmul_mont_done - -.align 32 -.Lmul_montx: - movq %rdx,%rbx - movq 0(%rdx),%rdx - movq 0(%rsi),%r9 - movq 8(%rsi),%r10 - movq 16(%rsi),%r11 - movq 24(%rsi),%r12 - leaq -128(%rsi),%rsi - - call __ecp_nistz256_mul_montx -.Lmul_mont_done: - movq 0(%rsp),%r15 -.cfi_restore %r15 - movq 8(%rsp),%r14 -.cfi_restore %r14 - movq 16(%rsp),%r13 -.cfi_restore %r13 - movq 24(%rsp),%r12 -.cfi_restore %r12 - movq 32(%rsp),%rbx -.cfi_restore %rbx - movq 40(%rsp),%rbp -.cfi_restore %rbp - leaq 48(%rsp),%rsp -.cfi_adjust_cfa_offset -48 -.Lmul_epilogue: - .byte 0xf3,0xc3 -.cfi_endproc -.size GFp_nistz256_mul_mont,.-GFp_nistz256_mul_mont - -.type __ecp_nistz256_mul_montq,@function -.align 32 -__ecp_nistz256_mul_montq: -.cfi_startproc - - - movq %rax,%rbp - mulq %r9 - movq .Lpoly+8(%rip),%r14 - movq %rax,%r8 - movq %rbp,%rax - movq %rdx,%r9 - - mulq %r10 - movq .Lpoly+24(%rip),%r15 - addq %rax,%r9 - movq %rbp,%rax - adcq $0,%rdx - movq %rdx,%r10 - - mulq %r11 - addq %rax,%r10 - movq %rbp,%rax - adcq $0,%rdx - movq %rdx,%r11 - - mulq %r12 - addq %rax,%r11 - movq %r8,%rax - adcq $0,%rdx - xorq %r13,%r13 - movq %rdx,%r12 - - - - - - - - - - - movq %r8,%rbp - shlq $32,%r8 - mulq %r15 - shrq $32,%rbp - addq %r8,%r9 - adcq %rbp,%r10 - adcq %rax,%r11 - movq 8(%rbx),%rax - adcq %rdx,%r12 - adcq $0,%r13 - xorq %r8,%r8 - - - - movq %rax,%rbp - mulq 0(%rsi) - addq %rax,%r9 - movq %rbp,%rax - adcq $0,%rdx - movq %rdx,%rcx - - mulq 8(%rsi) - addq %rcx,%r10 - adcq $0,%rdx - addq %rax,%r10 - movq %rbp,%rax - adcq $0,%rdx - movq %rdx,%rcx - - mulq 16(%rsi) - addq %rcx,%r11 - adcq $0,%rdx - addq %rax,%r11 - movq %rbp,%rax - adcq $0,%rdx - movq %rdx,%rcx - - mulq 24(%rsi) - addq %rcx,%r12 - adcq $0,%rdx - addq %rax,%r12 - movq %r9,%rax - adcq %rdx,%r13 - adcq $0,%r8 - - - - movq %r9,%rbp - shlq $32,%r9 - mulq %r15 - shrq $32,%rbp - addq %r9,%r10 - adcq %rbp,%r11 - adcq %rax,%r12 - movq 16(%rbx),%rax - adcq %rdx,%r13 - adcq $0,%r8 - xorq %r9,%r9 - - - - movq %rax,%rbp - mulq 0(%rsi) - addq %rax,%r10 - movq %rbp,%rax - adcq $0,%rdx - movq %rdx,%rcx - - mulq 8(%rsi) - addq %rcx,%r11 - adcq $0,%rdx - addq %rax,%r11 - movq %rbp,%rax - adcq $0,%rdx - movq %rdx,%rcx - - mulq 16(%rsi) - addq %rcx,%r12 - adcq $0,%rdx - addq %rax,%r12 - movq %rbp,%rax - adcq $0,%rdx - movq %rdx,%rcx - - mulq 24(%rsi) - addq %rcx,%r13 - adcq $0,%rdx - addq %rax,%r13 - movq %r10,%rax - adcq %rdx,%r8 - adcq $0,%r9 - - - - movq %r10,%rbp - shlq $32,%r10 - mulq %r15 - shrq $32,%rbp - addq %r10,%r11 - adcq %rbp,%r12 - adcq %rax,%r13 - movq 24(%rbx),%rax - adcq %rdx,%r8 - adcq $0,%r9 - xorq %r10,%r10 - - - - movq %rax,%rbp - mulq 0(%rsi) - addq %rax,%r11 - movq %rbp,%rax - adcq $0,%rdx - movq %rdx,%rcx - - mulq 8(%rsi) - addq %rcx,%r12 - adcq $0,%rdx - addq %rax,%r12 - movq %rbp,%rax - adcq $0,%rdx - movq %rdx,%rcx - - mulq 16(%rsi) - addq %rcx,%r13 - adcq $0,%rdx - addq %rax,%r13 - movq %rbp,%rax - adcq $0,%rdx - movq %rdx,%rcx - - mulq 24(%rsi) - addq %rcx,%r8 - adcq $0,%rdx - addq %rax,%r8 - movq %r11,%rax - adcq %rdx,%r9 - adcq $0,%r10 - - - - movq %r11,%rbp - shlq $32,%r11 - mulq %r15 - shrq $32,%rbp - addq %r11,%r12 - adcq %rbp,%r13 - movq %r12,%rcx - adcq %rax,%r8 - adcq %rdx,%r9 - movq %r13,%rbp - adcq $0,%r10 - - - - subq $-1,%r12 - movq %r8,%rbx - sbbq %r14,%r13 - sbbq $0,%r8 - movq %r9,%rdx - sbbq %r15,%r9 - sbbq $0,%r10 - - cmovcq %rcx,%r12 - cmovcq %rbp,%r13 - movq %r12,0(%rdi) - cmovcq %rbx,%r8 - movq %r13,8(%rdi) - cmovcq %rdx,%r9 - movq %r8,16(%rdi) - movq %r9,24(%rdi) - - .byte 0xf3,0xc3 -.cfi_endproc -.size __ecp_nistz256_mul_montq,.-__ecp_nistz256_mul_montq - - - - - - - - -.globl GFp_nistz256_sqr_mont -.hidden GFp_nistz256_sqr_mont -.type GFp_nistz256_sqr_mont,@function -.align 32 -GFp_nistz256_sqr_mont: -.cfi_startproc - leaq GFp_ia32cap_P(%rip),%rcx - movq 8(%rcx),%rcx - andl $0x80100,%ecx - pushq %rbp -.cfi_adjust_cfa_offset 8 -.cfi_offset %rbp,-16 - pushq %rbx -.cfi_adjust_cfa_offset 8 -.cfi_offset %rbx,-24 - pushq %r12 -.cfi_adjust_cfa_offset 8 -.cfi_offset %r12,-32 - pushq %r13 -.cfi_adjust_cfa_offset 8 -.cfi_offset %r13,-40 - pushq %r14 -.cfi_adjust_cfa_offset 8 -.cfi_offset %r14,-48 - pushq %r15 -.cfi_adjust_cfa_offset 8 -.cfi_offset %r15,-56 -.Lsqr_body: - cmpl $0x80100,%ecx - je .Lsqr_montx - movq 0(%rsi),%rax - movq 8(%rsi),%r14 - movq 16(%rsi),%r15 - movq 24(%rsi),%r8 - - call __ecp_nistz256_sqr_montq - jmp .Lsqr_mont_done - -.align 32 -.Lsqr_montx: - movq 0(%rsi),%rdx - movq 8(%rsi),%r14 - movq 16(%rsi),%r15 - movq 24(%rsi),%r8 - leaq -128(%rsi),%rsi - - call __ecp_nistz256_sqr_montx -.Lsqr_mont_done: - movq 0(%rsp),%r15 -.cfi_restore %r15 - movq 8(%rsp),%r14 -.cfi_restore %r14 - movq 16(%rsp),%r13 -.cfi_restore %r13 - movq 24(%rsp),%r12 -.cfi_restore %r12 - movq 32(%rsp),%rbx -.cfi_restore %rbx - movq 40(%rsp),%rbp -.cfi_restore %rbp - leaq 48(%rsp),%rsp -.cfi_adjust_cfa_offset -48 -.Lsqr_epilogue: - .byte 0xf3,0xc3 -.cfi_endproc -.size GFp_nistz256_sqr_mont,.-GFp_nistz256_sqr_mont - -.type __ecp_nistz256_sqr_montq,@function -.align 32 -__ecp_nistz256_sqr_montq: -.cfi_startproc - movq %rax,%r13 - mulq %r14 - movq %rax,%r9 - movq %r15,%rax - movq %rdx,%r10 - - mulq %r13 - addq %rax,%r10 - movq %r8,%rax - adcq $0,%rdx - movq %rdx,%r11 - - mulq %r13 - addq %rax,%r11 - movq %r15,%rax - adcq $0,%rdx - movq %rdx,%r12 - - - mulq %r14 - addq %rax,%r11 - movq %r8,%rax - adcq $0,%rdx - movq %rdx,%rbp - - mulq %r14 - addq %rax,%r12 - movq %r8,%rax - adcq $0,%rdx - addq %rbp,%r12 - movq %rdx,%r13 - adcq $0,%r13 - - - mulq %r15 - xorq %r15,%r15 - addq %rax,%r13 - movq 0(%rsi),%rax - movq %rdx,%r14 - adcq $0,%r14 - - addq %r9,%r9 - adcq %r10,%r10 - adcq %r11,%r11 - adcq %r12,%r12 - adcq %r13,%r13 - adcq %r14,%r14 - adcq $0,%r15 - - mulq %rax - movq %rax,%r8 - movq 8(%rsi),%rax - movq %rdx,%rcx - - mulq %rax - addq %rcx,%r9 - adcq %rax,%r10 - movq 16(%rsi),%rax - adcq $0,%rdx - movq %rdx,%rcx - - mulq %rax - addq %rcx,%r11 - adcq %rax,%r12 - movq 24(%rsi),%rax - adcq $0,%rdx - movq %rdx,%rcx - - mulq %rax - addq %rcx,%r13 - adcq %rax,%r14 - movq %r8,%rax - adcq %rdx,%r15 - - movq .Lpoly+8(%rip),%rsi - movq .Lpoly+24(%rip),%rbp - - - - - movq %r8,%rcx - shlq $32,%r8 - mulq %rbp - shrq $32,%rcx - addq %r8,%r9 - adcq %rcx,%r10 - adcq %rax,%r11 - movq %r9,%rax - adcq $0,%rdx - - - - movq %r9,%rcx - shlq $32,%r9 - movq %rdx,%r8 - mulq %rbp - shrq $32,%rcx - addq %r9,%r10 - adcq %rcx,%r11 - adcq %rax,%r8 - movq %r10,%rax - adcq $0,%rdx - - - - movq %r10,%rcx - shlq $32,%r10 - movq %rdx,%r9 - mulq %rbp - shrq $32,%rcx - addq %r10,%r11 - adcq %rcx,%r8 - adcq %rax,%r9 - movq %r11,%rax - adcq $0,%rdx - - - - movq %r11,%rcx - shlq $32,%r11 - movq %rdx,%r10 - mulq %rbp - shrq $32,%rcx - addq %r11,%r8 - adcq %rcx,%r9 - adcq %rax,%r10 - adcq $0,%rdx - xorq %r11,%r11 - - - - addq %r8,%r12 - adcq %r9,%r13 - movq %r12,%r8 - adcq %r10,%r14 - adcq %rdx,%r15 - movq %r13,%r9 - adcq $0,%r11 - - subq $-1,%r12 - movq %r14,%r10 - sbbq %rsi,%r13 - sbbq $0,%r14 - movq %r15,%rcx - sbbq %rbp,%r15 - sbbq $0,%r11 - - cmovcq %r8,%r12 - cmovcq %r9,%r13 - movq %r12,0(%rdi) - cmovcq %r10,%r14 - movq %r13,8(%rdi) - cmovcq %rcx,%r15 - movq %r14,16(%rdi) - movq %r15,24(%rdi) - - .byte 0xf3,0xc3 -.cfi_endproc -.size __ecp_nistz256_sqr_montq,.-__ecp_nistz256_sqr_montq -.type __ecp_nistz256_mul_montx,@function -.align 32 -__ecp_nistz256_mul_montx: -.cfi_startproc - - - mulxq %r9,%r8,%r9 - mulxq %r10,%rcx,%r10 - movq $32,%r14 - xorq %r13,%r13 - mulxq %r11,%rbp,%r11 - movq .Lpoly+24(%rip),%r15 - adcq %rcx,%r9 - mulxq %r12,%rcx,%r12 - movq %r8,%rdx - adcq %rbp,%r10 - shlxq %r14,%r8,%rbp - adcq %rcx,%r11 - shrxq %r14,%r8,%rcx - adcq $0,%r12 - - - - addq %rbp,%r9 - adcq %rcx,%r10 - - mulxq %r15,%rcx,%rbp - movq 8(%rbx),%rdx - adcq %rcx,%r11 - adcq %rbp,%r12 - adcq $0,%r13 - xorq %r8,%r8 - - - - mulxq 0+128(%rsi),%rcx,%rbp - adcxq %rcx,%r9 - adoxq %rbp,%r10 - - mulxq 8+128(%rsi),%rcx,%rbp - adcxq %rcx,%r10 - adoxq %rbp,%r11 - - mulxq 16+128(%rsi),%rcx,%rbp - adcxq %rcx,%r11 - adoxq %rbp,%r12 - - mulxq 24+128(%rsi),%rcx,%rbp - movq %r9,%rdx - adcxq %rcx,%r12 - shlxq %r14,%r9,%rcx - adoxq %rbp,%r13 - shrxq %r14,%r9,%rbp - - adcxq %r8,%r13 - adoxq %r8,%r8 - adcq $0,%r8 - - - - addq %rcx,%r10 - adcq %rbp,%r11 - - mulxq %r15,%rcx,%rbp - movq 16(%rbx),%rdx - adcq %rcx,%r12 - adcq %rbp,%r13 - adcq $0,%r8 - xorq %r9,%r9 - - - - mulxq 0+128(%rsi),%rcx,%rbp - adcxq %rcx,%r10 - adoxq %rbp,%r11 - - mulxq 8+128(%rsi),%rcx,%rbp - adcxq %rcx,%r11 - adoxq %rbp,%r12 - - mulxq 16+128(%rsi),%rcx,%rbp - adcxq %rcx,%r12 - adoxq %rbp,%r13 - - mulxq 24+128(%rsi),%rcx,%rbp - movq %r10,%rdx - adcxq %rcx,%r13 - shlxq %r14,%r10,%rcx - adoxq %rbp,%r8 - shrxq %r14,%r10,%rbp - - adcxq %r9,%r8 - adoxq %r9,%r9 - adcq $0,%r9 - - - - addq %rcx,%r11 - adcq %rbp,%r12 - - mulxq %r15,%rcx,%rbp - movq 24(%rbx),%rdx - adcq %rcx,%r13 - adcq %rbp,%r8 - adcq $0,%r9 - xorq %r10,%r10 - - - - mulxq 0+128(%rsi),%rcx,%rbp - adcxq %rcx,%r11 - adoxq %rbp,%r12 - - mulxq 8+128(%rsi),%rcx,%rbp - adcxq %rcx,%r12 - adoxq %rbp,%r13 - - mulxq 16+128(%rsi),%rcx,%rbp - adcxq %rcx,%r13 - adoxq %rbp,%r8 - - mulxq 24+128(%rsi),%rcx,%rbp - movq %r11,%rdx - adcxq %rcx,%r8 - shlxq %r14,%r11,%rcx - adoxq %rbp,%r9 - shrxq %r14,%r11,%rbp - - adcxq %r10,%r9 - adoxq %r10,%r10 - adcq $0,%r10 - - - - addq %rcx,%r12 - adcq %rbp,%r13 - - mulxq %r15,%rcx,%rbp - movq %r12,%rbx - movq .Lpoly+8(%rip),%r14 - adcq %rcx,%r8 - movq %r13,%rdx - adcq %rbp,%r9 - adcq $0,%r10 - - - - xorl %eax,%eax - movq %r8,%rcx - sbbq $-1,%r12 - sbbq %r14,%r13 - sbbq $0,%r8 - movq %r9,%rbp - sbbq %r15,%r9 - sbbq $0,%r10 - - cmovcq %rbx,%r12 - cmovcq %rdx,%r13 - movq %r12,0(%rdi) - cmovcq %rcx,%r8 - movq %r13,8(%rdi) - cmovcq %rbp,%r9 - movq %r8,16(%rdi) - movq %r9,24(%rdi) - - .byte 0xf3,0xc3 -.cfi_endproc -.size __ecp_nistz256_mul_montx,.-__ecp_nistz256_mul_montx - -.type __ecp_nistz256_sqr_montx,@function -.align 32 -__ecp_nistz256_sqr_montx: -.cfi_startproc - mulxq %r14,%r9,%r10 - mulxq %r15,%rcx,%r11 - xorl %eax,%eax - adcq %rcx,%r10 - mulxq %r8,%rbp,%r12 - movq %r14,%rdx - adcq %rbp,%r11 - adcq $0,%r12 - xorq %r13,%r13 - - - mulxq %r15,%rcx,%rbp - adcxq %rcx,%r11 - adoxq %rbp,%r12 - - mulxq %r8,%rcx,%rbp - movq %r15,%rdx - adcxq %rcx,%r12 - adoxq %rbp,%r13 - adcq $0,%r13 - - - mulxq %r8,%rcx,%r14 - movq 0+128(%rsi),%rdx - xorq %r15,%r15 - adcxq %r9,%r9 - adoxq %rcx,%r13 - adcxq %r10,%r10 - adoxq %r15,%r14 - - mulxq %rdx,%r8,%rbp - movq 8+128(%rsi),%rdx - adcxq %r11,%r11 - adoxq %rbp,%r9 - adcxq %r12,%r12 - mulxq %rdx,%rcx,%rax - movq 16+128(%rsi),%rdx - adcxq %r13,%r13 - adoxq %rcx,%r10 - adcxq %r14,%r14 -.byte 0x67 - mulxq %rdx,%rcx,%rbp - movq 24+128(%rsi),%rdx - adoxq %rax,%r11 - adcxq %r15,%r15 - adoxq %rcx,%r12 - movq $32,%rsi - adoxq %rbp,%r13 -.byte 0x67,0x67 - mulxq %rdx,%rcx,%rax - movq .Lpoly+24(%rip),%rdx - adoxq %rcx,%r14 - shlxq %rsi,%r8,%rcx - adoxq %rax,%r15 - shrxq %rsi,%r8,%rax - movq %rdx,%rbp - - - addq %rcx,%r9 - adcq %rax,%r10 - - mulxq %r8,%rcx,%r8 - adcq %rcx,%r11 - shlxq %rsi,%r9,%rcx - adcq $0,%r8 - shrxq %rsi,%r9,%rax - - - addq %rcx,%r10 - adcq %rax,%r11 - - mulxq %r9,%rcx,%r9 - adcq %rcx,%r8 - shlxq %rsi,%r10,%rcx - adcq $0,%r9 - shrxq %rsi,%r10,%rax - - - addq %rcx,%r11 - adcq %rax,%r8 - - mulxq %r10,%rcx,%r10 - adcq %rcx,%r9 - shlxq %rsi,%r11,%rcx - adcq $0,%r10 - shrxq %rsi,%r11,%rax - - - addq %rcx,%r8 - adcq %rax,%r9 - - mulxq %r11,%rcx,%r11 - adcq %rcx,%r10 - adcq $0,%r11 - - xorq %rdx,%rdx - addq %r8,%r12 - movq .Lpoly+8(%rip),%rsi - adcq %r9,%r13 - movq %r12,%r8 - adcq %r10,%r14 - adcq %r11,%r15 - movq %r13,%r9 - adcq $0,%rdx - - subq $-1,%r12 - movq %r14,%r10 - sbbq %rsi,%r13 - sbbq $0,%r14 - movq %r15,%r11 - sbbq %rbp,%r15 - sbbq $0,%rdx - - cmovcq %r8,%r12 - cmovcq %r9,%r13 - movq %r12,0(%rdi) - cmovcq %r10,%r14 - movq %r13,8(%rdi) - cmovcq %r11,%r15 - movq %r14,16(%rdi) - movq %r15,24(%rdi) - - .byte 0xf3,0xc3 -.cfi_endproc -.size __ecp_nistz256_sqr_montx,.-__ecp_nistz256_sqr_montx - - -.globl GFp_nistz256_select_w5 -.hidden GFp_nistz256_select_w5 -.type GFp_nistz256_select_w5,@function -.align 32 -GFp_nistz256_select_w5: -.cfi_startproc - leaq GFp_ia32cap_P(%rip),%rax - movq 8(%rax),%rax - testl $32,%eax - jnz .Lavx2_select_w5 - movdqa .LOne(%rip),%xmm0 - movd %edx,%xmm1 - - pxor %xmm2,%xmm2 - pxor %xmm3,%xmm3 - pxor %xmm4,%xmm4 - pxor %xmm5,%xmm5 - pxor %xmm6,%xmm6 - pxor %xmm7,%xmm7 - - movdqa %xmm0,%xmm8 - pshufd $0,%xmm1,%xmm1 - - movq $16,%rax -.Lselect_loop_sse_w5: - - movdqa %xmm8,%xmm15 - paddd %xmm0,%xmm8 - pcmpeqd %xmm1,%xmm15 - - movdqa 0(%rsi),%xmm9 - movdqa 16(%rsi),%xmm10 - movdqa 32(%rsi),%xmm11 - movdqa 48(%rsi),%xmm12 - movdqa 64(%rsi),%xmm13 - movdqa 80(%rsi),%xmm14 - leaq 96(%rsi),%rsi - - pand %xmm15,%xmm9 - pand %xmm15,%xmm10 - por %xmm9,%xmm2 - pand %xmm15,%xmm11 - por %xmm10,%xmm3 - pand %xmm15,%xmm12 - por %xmm11,%xmm4 - pand %xmm15,%xmm13 - por %xmm12,%xmm5 - pand %xmm15,%xmm14 - por %xmm13,%xmm6 - por %xmm14,%xmm7 - - decq %rax - jnz .Lselect_loop_sse_w5 - - movdqu %xmm2,0(%rdi) - movdqu %xmm3,16(%rdi) - movdqu %xmm4,32(%rdi) - movdqu %xmm5,48(%rdi) - movdqu %xmm6,64(%rdi) - movdqu %xmm7,80(%rdi) - .byte 0xf3,0xc3 -.cfi_endproc -.LSEH_end_GFp_nistz256_select_w5: -.size GFp_nistz256_select_w5,.-GFp_nistz256_select_w5 - - - -.globl GFp_nistz256_select_w7 -.hidden GFp_nistz256_select_w7 -.type GFp_nistz256_select_w7,@function -.align 32 -GFp_nistz256_select_w7: -.cfi_startproc - leaq GFp_ia32cap_P(%rip),%rax - movq 8(%rax),%rax - testl $32,%eax - jnz .Lavx2_select_w7 - movdqa .LOne(%rip),%xmm8 - movd %edx,%xmm1 - - pxor %xmm2,%xmm2 - pxor %xmm3,%xmm3 - pxor %xmm4,%xmm4 - pxor %xmm5,%xmm5 - - movdqa %xmm8,%xmm0 - pshufd $0,%xmm1,%xmm1 - movq $64,%rax - -.Lselect_loop_sse_w7: - movdqa %xmm8,%xmm15 - paddd %xmm0,%xmm8 - movdqa 0(%rsi),%xmm9 - movdqa 16(%rsi),%xmm10 - pcmpeqd %xmm1,%xmm15 - movdqa 32(%rsi),%xmm11 - movdqa 48(%rsi),%xmm12 - leaq 64(%rsi),%rsi - - pand %xmm15,%xmm9 - pand %xmm15,%xmm10 - por %xmm9,%xmm2 - pand %xmm15,%xmm11 - por %xmm10,%xmm3 - pand %xmm15,%xmm12 - por %xmm11,%xmm4 - prefetcht0 255(%rsi) - por %xmm12,%xmm5 - - decq %rax - jnz .Lselect_loop_sse_w7 - - movdqu %xmm2,0(%rdi) - movdqu %xmm3,16(%rdi) - movdqu %xmm4,32(%rdi) - movdqu %xmm5,48(%rdi) - .byte 0xf3,0xc3 -.cfi_endproc -.LSEH_end_GFp_nistz256_select_w7: -.size GFp_nistz256_select_w7,.-GFp_nistz256_select_w7 - - -.type GFp_nistz256_avx2_select_w5,@function -.align 32 -GFp_nistz256_avx2_select_w5: -.cfi_startproc -.Lavx2_select_w5: - vzeroupper - vmovdqa .LTwo(%rip),%ymm0 - - vpxor %ymm2,%ymm2,%ymm2 - vpxor %ymm3,%ymm3,%ymm3 - vpxor %ymm4,%ymm4,%ymm4 - - vmovdqa .LOne(%rip),%ymm5 - vmovdqa .LTwo(%rip),%ymm10 - - vmovd %edx,%xmm1 - vpermd %ymm1,%ymm2,%ymm1 - - movq $8,%rax -.Lselect_loop_avx2_w5: - - vmovdqa 0(%rsi),%ymm6 - vmovdqa 32(%rsi),%ymm7 - vmovdqa 64(%rsi),%ymm8 - - vmovdqa 96(%rsi),%ymm11 - vmovdqa 128(%rsi),%ymm12 - vmovdqa 160(%rsi),%ymm13 - - vpcmpeqd %ymm1,%ymm5,%ymm9 - vpcmpeqd %ymm1,%ymm10,%ymm14 - - vpaddd %ymm0,%ymm5,%ymm5 - vpaddd %ymm0,%ymm10,%ymm10 - leaq 192(%rsi),%rsi - - vpand %ymm9,%ymm6,%ymm6 - vpand %ymm9,%ymm7,%ymm7 - vpand %ymm9,%ymm8,%ymm8 - vpand %ymm14,%ymm11,%ymm11 - vpand %ymm14,%ymm12,%ymm12 - vpand %ymm14,%ymm13,%ymm13 - - vpxor %ymm6,%ymm2,%ymm2 - vpxor %ymm7,%ymm3,%ymm3 - vpxor %ymm8,%ymm4,%ymm4 - vpxor %ymm11,%ymm2,%ymm2 - vpxor %ymm12,%ymm3,%ymm3 - vpxor %ymm13,%ymm4,%ymm4 - - decq %rax - jnz .Lselect_loop_avx2_w5 - - vmovdqu %ymm2,0(%rdi) - vmovdqu %ymm3,32(%rdi) - vmovdqu %ymm4,64(%rdi) - vzeroupper - .byte 0xf3,0xc3 -.cfi_endproc -.LSEH_end_GFp_nistz256_avx2_select_w5: -.size GFp_nistz256_avx2_select_w5,.-GFp_nistz256_avx2_select_w5 - - - -.globl GFp_nistz256_avx2_select_w7 -.hidden GFp_nistz256_avx2_select_w7 -.type GFp_nistz256_avx2_select_w7,@function -.align 32 -GFp_nistz256_avx2_select_w7: -.cfi_startproc -.Lavx2_select_w7: - vzeroupper - vmovdqa .LThree(%rip),%ymm0 - - vpxor %ymm2,%ymm2,%ymm2 - vpxor %ymm3,%ymm3,%ymm3 - - vmovdqa .LOne(%rip),%ymm4 - vmovdqa .LTwo(%rip),%ymm8 - vmovdqa .LThree(%rip),%ymm12 - - vmovd %edx,%xmm1 - vpermd %ymm1,%ymm2,%ymm1 - - - movq $21,%rax -.Lselect_loop_avx2_w7: - - vmovdqa 0(%rsi),%ymm5 - vmovdqa 32(%rsi),%ymm6 - - vmovdqa 64(%rsi),%ymm9 - vmovdqa 96(%rsi),%ymm10 - - vmovdqa 128(%rsi),%ymm13 - vmovdqa 160(%rsi),%ymm14 - - vpcmpeqd %ymm1,%ymm4,%ymm7 - vpcmpeqd %ymm1,%ymm8,%ymm11 - vpcmpeqd %ymm1,%ymm12,%ymm15 - - vpaddd %ymm0,%ymm4,%ymm4 - vpaddd %ymm0,%ymm8,%ymm8 - vpaddd %ymm0,%ymm12,%ymm12 - leaq 192(%rsi),%rsi - - vpand %ymm7,%ymm5,%ymm5 - vpand %ymm7,%ymm6,%ymm6 - vpand %ymm11,%ymm9,%ymm9 - vpand %ymm11,%ymm10,%ymm10 - vpand %ymm15,%ymm13,%ymm13 - vpand %ymm15,%ymm14,%ymm14 - - vpxor %ymm5,%ymm2,%ymm2 - vpxor %ymm6,%ymm3,%ymm3 - vpxor %ymm9,%ymm2,%ymm2 - vpxor %ymm10,%ymm3,%ymm3 - vpxor %ymm13,%ymm2,%ymm2 - vpxor %ymm14,%ymm3,%ymm3 - - decq %rax - jnz .Lselect_loop_avx2_w7 - - - vmovdqa 0(%rsi),%ymm5 - vmovdqa 32(%rsi),%ymm6 - - vpcmpeqd %ymm1,%ymm4,%ymm7 - - vpand %ymm7,%ymm5,%ymm5 - vpand %ymm7,%ymm6,%ymm6 - - vpxor %ymm5,%ymm2,%ymm2 - vpxor %ymm6,%ymm3,%ymm3 - - vmovdqu %ymm2,0(%rdi) - vmovdqu %ymm3,32(%rdi) - vzeroupper - .byte 0xf3,0xc3 -.cfi_endproc -.LSEH_end_GFp_nistz256_avx2_select_w7: -.size GFp_nistz256_avx2_select_w7,.-GFp_nistz256_avx2_select_w7 -.type __ecp_nistz256_add_toq,@function -.align 32 -__ecp_nistz256_add_toq: -.cfi_startproc - xorq %r11,%r11 - addq 0(%rbx),%r12 - adcq 8(%rbx),%r13 - movq %r12,%rax - adcq 16(%rbx),%r8 - adcq 24(%rbx),%r9 - movq %r13,%rbp - adcq $0,%r11 - - subq $-1,%r12 - movq %r8,%rcx - sbbq %r14,%r13 - sbbq $0,%r8 - movq %r9,%r10 - sbbq %r15,%r9 - sbbq $0,%r11 - - cmovcq %rax,%r12 - cmovcq %rbp,%r13 - movq %r12,0(%rdi) - cmovcq %rcx,%r8 - movq %r13,8(%rdi) - cmovcq %r10,%r9 - movq %r8,16(%rdi) - movq %r9,24(%rdi) - - .byte 0xf3,0xc3 -.cfi_endproc -.size __ecp_nistz256_add_toq,.-__ecp_nistz256_add_toq - -.type __ecp_nistz256_sub_fromq,@function -.align 32 -__ecp_nistz256_sub_fromq: -.cfi_startproc - subq 0(%rbx),%r12 - sbbq 8(%rbx),%r13 - movq %r12,%rax - sbbq 16(%rbx),%r8 - sbbq 24(%rbx),%r9 - movq %r13,%rbp - sbbq %r11,%r11 - - addq $-1,%r12 - movq %r8,%rcx - adcq %r14,%r13 - adcq $0,%r8 - movq %r9,%r10 - adcq %r15,%r9 - testq %r11,%r11 - - cmovzq %rax,%r12 - cmovzq %rbp,%r13 - movq %r12,0(%rdi) - cmovzq %rcx,%r8 - movq %r13,8(%rdi) - cmovzq %r10,%r9 - movq %r8,16(%rdi) - movq %r9,24(%rdi) - - .byte 0xf3,0xc3 -.cfi_endproc -.size __ecp_nistz256_sub_fromq,.-__ecp_nistz256_sub_fromq - -.type __ecp_nistz256_subq,@function -.align 32 -__ecp_nistz256_subq: -.cfi_startproc - subq %r12,%rax - sbbq %r13,%rbp - movq %rax,%r12 - sbbq %r8,%rcx - sbbq %r9,%r10 - movq %rbp,%r13 - sbbq %r11,%r11 - - addq $-1,%rax - movq %rcx,%r8 - adcq %r14,%rbp - adcq $0,%rcx - movq %r10,%r9 - adcq %r15,%r10 - testq %r11,%r11 - - cmovnzq %rax,%r12 - cmovnzq %rbp,%r13 - cmovnzq %rcx,%r8 - cmovnzq %r10,%r9 - - .byte 0xf3,0xc3 -.cfi_endproc -.size __ecp_nistz256_subq,.-__ecp_nistz256_subq - -.type __ecp_nistz256_mul_by_2q,@function -.align 32 -__ecp_nistz256_mul_by_2q: -.cfi_startproc - xorq %r11,%r11 - addq %r12,%r12 - adcq %r13,%r13 - movq %r12,%rax - adcq %r8,%r8 - adcq %r9,%r9 - movq %r13,%rbp - adcq $0,%r11 - - subq $-1,%r12 - movq %r8,%rcx - sbbq %r14,%r13 - sbbq $0,%r8 - movq %r9,%r10 - sbbq %r15,%r9 - sbbq $0,%r11 - - cmovcq %rax,%r12 - cmovcq %rbp,%r13 - movq %r12,0(%rdi) - cmovcq %rcx,%r8 - movq %r13,8(%rdi) - cmovcq %r10,%r9 - movq %r8,16(%rdi) - movq %r9,24(%rdi) - - .byte 0xf3,0xc3 -.cfi_endproc -.size __ecp_nistz256_mul_by_2q,.-__ecp_nistz256_mul_by_2q -.globl GFp_nistz256_point_double -.hidden GFp_nistz256_point_double -.type GFp_nistz256_point_double,@function -.align 32 -GFp_nistz256_point_double: -.cfi_startproc - leaq GFp_ia32cap_P(%rip),%rcx - movq 8(%rcx),%rcx - andl $0x80100,%ecx - cmpl $0x80100,%ecx - je .Lpoint_doublex - pushq %rbp -.cfi_adjust_cfa_offset 8 -.cfi_offset %rbp,-16 - pushq %rbx -.cfi_adjust_cfa_offset 8 -.cfi_offset %rbx,-24 - pushq %r12 -.cfi_adjust_cfa_offset 8 -.cfi_offset %r12,-32 - pushq %r13 -.cfi_adjust_cfa_offset 8 -.cfi_offset %r13,-40 - pushq %r14 -.cfi_adjust_cfa_offset 8 -.cfi_offset %r14,-48 - pushq %r15 -.cfi_adjust_cfa_offset 8 -.cfi_offset %r15,-56 - subq $160+8,%rsp -.cfi_adjust_cfa_offset 32*5+8 -.Lpoint_doubleq_body: - -.Lpoint_double_shortcutq: - movdqu 0(%rsi),%xmm0 - movq %rsi,%rbx - movdqu 16(%rsi),%xmm1 - movq 32+0(%rsi),%r12 - movq 32+8(%rsi),%r13 - movq 32+16(%rsi),%r8 - movq 32+24(%rsi),%r9 - movq .Lpoly+8(%rip),%r14 - movq .Lpoly+24(%rip),%r15 - movdqa %xmm0,96(%rsp) - movdqa %xmm1,96+16(%rsp) - leaq 32(%rdi),%r10 - leaq 64(%rdi),%r11 -.byte 102,72,15,110,199 -.byte 102,73,15,110,202 -.byte 102,73,15,110,211 - - leaq 0(%rsp),%rdi - call __ecp_nistz256_mul_by_2q - - movq 64+0(%rsi),%rax - movq 64+8(%rsi),%r14 - movq 64+16(%rsi),%r15 - movq 64+24(%rsi),%r8 - leaq 64-0(%rsi),%rsi - leaq 64(%rsp),%rdi - call __ecp_nistz256_sqr_montq - - movq 0+0(%rsp),%rax - movq 8+0(%rsp),%r14 - leaq 0+0(%rsp),%rsi - movq 16+0(%rsp),%r15 - movq 24+0(%rsp),%r8 - leaq 0(%rsp),%rdi - call __ecp_nistz256_sqr_montq - - movq 32(%rbx),%rax - movq 64+0(%rbx),%r9 - movq 64+8(%rbx),%r10 - movq 64+16(%rbx),%r11 - movq 64+24(%rbx),%r12 - leaq 64-0(%rbx),%rsi - leaq 32(%rbx),%rbx -.byte 102,72,15,126,215 - call __ecp_nistz256_mul_montq - call __ecp_nistz256_mul_by_2q - - movq 96+0(%rsp),%r12 - movq 96+8(%rsp),%r13 - leaq 64(%rsp),%rbx - movq 96+16(%rsp),%r8 - movq 96+24(%rsp),%r9 - leaq 32(%rsp),%rdi - call __ecp_nistz256_add_toq - - movq 96+0(%rsp),%r12 - movq 96+8(%rsp),%r13 - leaq 64(%rsp),%rbx - movq 96+16(%rsp),%r8 - movq 96+24(%rsp),%r9 - leaq 64(%rsp),%rdi - call __ecp_nistz256_sub_fromq - - movq 0+0(%rsp),%rax - movq 8+0(%rsp),%r14 - leaq 0+0(%rsp),%rsi - movq 16+0(%rsp),%r15 - movq 24+0(%rsp),%r8 -.byte 102,72,15,126,207 - call __ecp_nistz256_sqr_montq - xorq %r9,%r9 - movq %r12,%rax - addq $-1,%r12 - movq %r13,%r10 - adcq %rsi,%r13 - movq %r14,%rcx - adcq $0,%r14 - movq %r15,%r8 - adcq %rbp,%r15 - adcq $0,%r9 - xorq %rsi,%rsi - testq $1,%rax - - cmovzq %rax,%r12 - cmovzq %r10,%r13 - cmovzq %rcx,%r14 - cmovzq %r8,%r15 - cmovzq %rsi,%r9 - - movq %r13,%rax - shrq $1,%r12 - shlq $63,%rax - movq %r14,%r10 - shrq $1,%r13 - orq %rax,%r12 - shlq $63,%r10 - movq %r15,%rcx - shrq $1,%r14 - orq %r10,%r13 - shlq $63,%rcx - movq %r12,0(%rdi) - shrq $1,%r15 - movq %r13,8(%rdi) - shlq $63,%r9 - orq %rcx,%r14 - orq %r9,%r15 - movq %r14,16(%rdi) - movq %r15,24(%rdi) - movq 64(%rsp),%rax - leaq 64(%rsp),%rbx - movq 0+32(%rsp),%r9 - movq 8+32(%rsp),%r10 - leaq 0+32(%rsp),%rsi - movq 16+32(%rsp),%r11 - movq 24+32(%rsp),%r12 - leaq 32(%rsp),%rdi - call __ecp_nistz256_mul_montq - - leaq 128(%rsp),%rdi - call __ecp_nistz256_mul_by_2q - - leaq 32(%rsp),%rbx - leaq 32(%rsp),%rdi - call __ecp_nistz256_add_toq - - movq 96(%rsp),%rax - leaq 96(%rsp),%rbx - movq 0+0(%rsp),%r9 - movq 8+0(%rsp),%r10 - leaq 0+0(%rsp),%rsi - movq 16+0(%rsp),%r11 - movq 24+0(%rsp),%r12 - leaq 0(%rsp),%rdi - call __ecp_nistz256_mul_montq - - leaq 128(%rsp),%rdi - call __ecp_nistz256_mul_by_2q - - movq 0+32(%rsp),%rax - movq 8+32(%rsp),%r14 - leaq 0+32(%rsp),%rsi - movq 16+32(%rsp),%r15 - movq 24+32(%rsp),%r8 -.byte 102,72,15,126,199 - call __ecp_nistz256_sqr_montq - - leaq 128(%rsp),%rbx - movq %r14,%r8 - movq %r15,%r9 - movq %rsi,%r14 - movq %rbp,%r15 - call __ecp_nistz256_sub_fromq - - movq 0+0(%rsp),%rax - movq 0+8(%rsp),%rbp - movq 0+16(%rsp),%rcx - movq 0+24(%rsp),%r10 - leaq 0(%rsp),%rdi - call __ecp_nistz256_subq - - movq 32(%rsp),%rax - leaq 32(%rsp),%rbx - movq %r12,%r14 - xorl %ecx,%ecx - movq %r12,0+0(%rsp) - movq %r13,%r10 - movq %r13,0+8(%rsp) - cmovzq %r8,%r11 - movq %r8,0+16(%rsp) - leaq 0-0(%rsp),%rsi - cmovzq %r9,%r12 - movq %r9,0+24(%rsp) - movq %r14,%r9 - leaq 0(%rsp),%rdi - call __ecp_nistz256_mul_montq - -.byte 102,72,15,126,203 -.byte 102,72,15,126,207 - call __ecp_nistz256_sub_fromq - - leaq 160+56(%rsp),%rsi -.cfi_def_cfa %rsi,8 - movq -48(%rsi),%r15 -.cfi_restore %r15 - movq -40(%rsi),%r14 -.cfi_restore %r14 - movq -32(%rsi),%r13 -.cfi_restore %r13 - movq -24(%rsi),%r12 -.cfi_restore %r12 - movq -16(%rsi),%rbx -.cfi_restore %rbx - movq -8(%rsi),%rbp -.cfi_restore %rbp - leaq (%rsi),%rsp -.cfi_def_cfa_register %rsp -.Lpoint_doubleq_epilogue: - .byte 0xf3,0xc3 -.cfi_endproc -.size GFp_nistz256_point_double,.-GFp_nistz256_point_double -.globl GFp_nistz256_point_add -.hidden GFp_nistz256_point_add -.type GFp_nistz256_point_add,@function -.align 32 -GFp_nistz256_point_add: -.cfi_startproc - leaq GFp_ia32cap_P(%rip),%rcx - movq 8(%rcx),%rcx - andl $0x80100,%ecx - cmpl $0x80100,%ecx - je .Lpoint_addx - pushq %rbp -.cfi_adjust_cfa_offset 8 -.cfi_offset %rbp,-16 - pushq %rbx -.cfi_adjust_cfa_offset 8 -.cfi_offset %rbx,-24 - pushq %r12 -.cfi_adjust_cfa_offset 8 -.cfi_offset %r12,-32 - pushq %r13 -.cfi_adjust_cfa_offset 8 -.cfi_offset %r13,-40 - pushq %r14 -.cfi_adjust_cfa_offset 8 -.cfi_offset %r14,-48 - pushq %r15 -.cfi_adjust_cfa_offset 8 -.cfi_offset %r15,-56 - subq $576+8,%rsp -.cfi_adjust_cfa_offset 32*18+8 -.Lpoint_addq_body: - - movdqu 0(%rsi),%xmm0 - movdqu 16(%rsi),%xmm1 - movdqu 32(%rsi),%xmm2 - movdqu 48(%rsi),%xmm3 - movdqu 64(%rsi),%xmm4 - movdqu 80(%rsi),%xmm5 - movq %rsi,%rbx - movq %rdx,%rsi - movdqa %xmm0,384(%rsp) - movdqa %xmm1,384+16(%rsp) - movdqa %xmm2,416(%rsp) - movdqa %xmm3,416+16(%rsp) - movdqa %xmm4,448(%rsp) - movdqa %xmm5,448+16(%rsp) - por %xmm4,%xmm5 - - movdqu 0(%rsi),%xmm0 - pshufd $0xb1,%xmm5,%xmm3 - movdqu 16(%rsi),%xmm1 - movdqu 32(%rsi),%xmm2 - por %xmm3,%xmm5 - movdqu 48(%rsi),%xmm3 - movq 64+0(%rsi),%rax - movq 64+8(%rsi),%r14 - movq 64+16(%rsi),%r15 - movq 64+24(%rsi),%r8 - movdqa %xmm0,480(%rsp) - pshufd $0x1e,%xmm5,%xmm4 - movdqa %xmm1,480+16(%rsp) - movdqu 64(%rsi),%xmm0 - movdqu 80(%rsi),%xmm1 - movdqa %xmm2,512(%rsp) - movdqa %xmm3,512+16(%rsp) - por %xmm4,%xmm5 - pxor %xmm4,%xmm4 - por %xmm0,%xmm1 -.byte 102,72,15,110,199 - - leaq 64-0(%rsi),%rsi - movq %rax,544+0(%rsp) - movq %r14,544+8(%rsp) - movq %r15,544+16(%rsp) - movq %r8,544+24(%rsp) - leaq 96(%rsp),%rdi - call __ecp_nistz256_sqr_montq - - pcmpeqd %xmm4,%xmm5 - pshufd $0xb1,%xmm1,%xmm4 - por %xmm1,%xmm4 - pshufd $0,%xmm5,%xmm5 - pshufd $0x1e,%xmm4,%xmm3 - por %xmm3,%xmm4 - pxor %xmm3,%xmm3 - pcmpeqd %xmm3,%xmm4 - pshufd $0,%xmm4,%xmm4 - movq 64+0(%rbx),%rax - movq 64+8(%rbx),%r14 - movq 64+16(%rbx),%r15 - movq 64+24(%rbx),%r8 -.byte 102,72,15,110,203 - - leaq 64-0(%rbx),%rsi - leaq 32(%rsp),%rdi - call __ecp_nistz256_sqr_montq - - movq 544(%rsp),%rax - leaq 544(%rsp),%rbx - movq 0+96(%rsp),%r9 - movq 8+96(%rsp),%r10 - leaq 0+96(%rsp),%rsi - movq 16+96(%rsp),%r11 - movq 24+96(%rsp),%r12 - leaq 224(%rsp),%rdi - call __ecp_nistz256_mul_montq - - movq 448(%rsp),%rax - leaq 448(%rsp),%rbx - movq 0+32(%rsp),%r9 - movq 8+32(%rsp),%r10 - leaq 0+32(%rsp),%rsi - movq 16+32(%rsp),%r11 - movq 24+32(%rsp),%r12 - leaq 256(%rsp),%rdi - call __ecp_nistz256_mul_montq - - movq 416(%rsp),%rax - leaq 416(%rsp),%rbx - movq 0+224(%rsp),%r9 - movq 8+224(%rsp),%r10 - leaq 0+224(%rsp),%rsi - movq 16+224(%rsp),%r11 - movq 24+224(%rsp),%r12 - leaq 224(%rsp),%rdi - call __ecp_nistz256_mul_montq - - movq 512(%rsp),%rax - leaq 512(%rsp),%rbx - movq 0+256(%rsp),%r9 - movq 8+256(%rsp),%r10 - leaq 0+256(%rsp),%rsi - movq 16+256(%rsp),%r11 - movq 24+256(%rsp),%r12 - leaq 256(%rsp),%rdi - call __ecp_nistz256_mul_montq - - leaq 224(%rsp),%rbx - leaq 64(%rsp),%rdi - call __ecp_nistz256_sub_fromq - - orq %r13,%r12 - movdqa %xmm4,%xmm2 - orq %r8,%r12 - orq %r9,%r12 - por %xmm5,%xmm2 -.byte 102,73,15,110,220 - - movq 384(%rsp),%rax - leaq 384(%rsp),%rbx - movq 0+96(%rsp),%r9 - movq 8+96(%rsp),%r10 - leaq 0+96(%rsp),%rsi - movq 16+96(%rsp),%r11 - movq 24+96(%rsp),%r12 - leaq 160(%rsp),%rdi - call __ecp_nistz256_mul_montq - - movq 480(%rsp),%rax - leaq 480(%rsp),%rbx - movq 0+32(%rsp),%r9 - movq 8+32(%rsp),%r10 - leaq 0+32(%rsp),%rsi - movq 16+32(%rsp),%r11 - movq 24+32(%rsp),%r12 - leaq 192(%rsp),%rdi - call __ecp_nistz256_mul_montq - - leaq 160(%rsp),%rbx - leaq 0(%rsp),%rdi - call __ecp_nistz256_sub_fromq - - orq %r13,%r12 - orq %r8,%r12 - orq %r9,%r12 - -.byte 102,73,15,126,208 -.byte 102,73,15,126,217 - orq %r8,%r12 -.byte 0x3e - jnz .Ladd_proceedq - - - - testq %r9,%r9 - jz .Ladd_doubleq - - - - - - -.byte 102,72,15,126,199 - pxor %xmm0,%xmm0 - movdqu %xmm0,0(%rdi) - movdqu %xmm0,16(%rdi) - movdqu %xmm0,32(%rdi) - movdqu %xmm0,48(%rdi) - movdqu %xmm0,64(%rdi) - movdqu %xmm0,80(%rdi) - jmp .Ladd_doneq - -.align 32 -.Ladd_doubleq: -.byte 102,72,15,126,206 -.byte 102,72,15,126,199 - addq $416,%rsp -.cfi_adjust_cfa_offset -416 - jmp .Lpoint_double_shortcutq -.cfi_adjust_cfa_offset 416 - -.align 32 -.Ladd_proceedq: - movq 0+64(%rsp),%rax - movq 8+64(%rsp),%r14 - leaq 0+64(%rsp),%rsi - movq 16+64(%rsp),%r15 - movq 24+64(%rsp),%r8 - leaq 96(%rsp),%rdi - call __ecp_nistz256_sqr_montq - - movq 448(%rsp),%rax - leaq 448(%rsp),%rbx - movq 0+0(%rsp),%r9 - movq 8+0(%rsp),%r10 - leaq 0+0(%rsp),%rsi - movq 16+0(%rsp),%r11 - movq 24+0(%rsp),%r12 - leaq 352(%rsp),%rdi - call __ecp_nistz256_mul_montq - - movq 0+0(%rsp),%rax - movq 8+0(%rsp),%r14 - leaq 0+0(%rsp),%rsi - movq 16+0(%rsp),%r15 - movq 24+0(%rsp),%r8 - leaq 32(%rsp),%rdi - call __ecp_nistz256_sqr_montq - - movq 544(%rsp),%rax - leaq 544(%rsp),%rbx - movq 0+352(%rsp),%r9 - movq 8+352(%rsp),%r10 - leaq 0+352(%rsp),%rsi - movq 16+352(%rsp),%r11 - movq 24+352(%rsp),%r12 - leaq 352(%rsp),%rdi - call __ecp_nistz256_mul_montq - - movq 0(%rsp),%rax - leaq 0(%rsp),%rbx - movq 0+32(%rsp),%r9 - movq 8+32(%rsp),%r10 - leaq 0+32(%rsp),%rsi - movq 16+32(%rsp),%r11 - movq 24+32(%rsp),%r12 - leaq 128(%rsp),%rdi - call __ecp_nistz256_mul_montq - - movq 160(%rsp),%rax - leaq 160(%rsp),%rbx - movq 0+32(%rsp),%r9 - movq 8+32(%rsp),%r10 - leaq 0+32(%rsp),%rsi - movq 16+32(%rsp),%r11 - movq 24+32(%rsp),%r12 - leaq 192(%rsp),%rdi - call __ecp_nistz256_mul_montq - - - - - xorq %r11,%r11 - addq %r12,%r12 - leaq 96(%rsp),%rsi - adcq %r13,%r13 - movq %r12,%rax - adcq %r8,%r8 - adcq %r9,%r9 - movq %r13,%rbp - adcq $0,%r11 - - subq $-1,%r12 - movq %r8,%rcx - sbbq %r14,%r13 - sbbq $0,%r8 - movq %r9,%r10 - sbbq %r15,%r9 - sbbq $0,%r11 - - cmovcq %rax,%r12 - movq 0(%rsi),%rax - cmovcq %rbp,%r13 - movq 8(%rsi),%rbp - cmovcq %rcx,%r8 - movq 16(%rsi),%rcx - cmovcq %r10,%r9 - movq 24(%rsi),%r10 - - call __ecp_nistz256_subq - - leaq 128(%rsp),%rbx - leaq 288(%rsp),%rdi - call __ecp_nistz256_sub_fromq - - movq 192+0(%rsp),%rax - movq 192+8(%rsp),%rbp - movq 192+16(%rsp),%rcx - movq 192+24(%rsp),%r10 - leaq 320(%rsp),%rdi - - call __ecp_nistz256_subq - - movq %r12,0(%rdi) - movq %r13,8(%rdi) - movq %r8,16(%rdi) - movq %r9,24(%rdi) - movq 128(%rsp),%rax - leaq 128(%rsp),%rbx - movq 0+224(%rsp),%r9 - movq 8+224(%rsp),%r10 - leaq 0+224(%rsp),%rsi - movq 16+224(%rsp),%r11 - movq 24+224(%rsp),%r12 - leaq 256(%rsp),%rdi - call __ecp_nistz256_mul_montq - - movq 320(%rsp),%rax - leaq 320(%rsp),%rbx - movq 0+64(%rsp),%r9 - movq 8+64(%rsp),%r10 - leaq 0+64(%rsp),%rsi - movq 16+64(%rsp),%r11 - movq 24+64(%rsp),%r12 - leaq 320(%rsp),%rdi - call __ecp_nistz256_mul_montq - - leaq 256(%rsp),%rbx - leaq 320(%rsp),%rdi - call __ecp_nistz256_sub_fromq - -.byte 102,72,15,126,199 - - movdqa %xmm5,%xmm0 - movdqa %xmm5,%xmm1 - pandn 352(%rsp),%xmm0 - movdqa %xmm5,%xmm2 - pandn 352+16(%rsp),%xmm1 - movdqa %xmm5,%xmm3 - pand 544(%rsp),%xmm2 - pand 544+16(%rsp),%xmm3 - por %xmm0,%xmm2 - por %xmm1,%xmm3 - - movdqa %xmm4,%xmm0 - movdqa %xmm4,%xmm1 - pandn %xmm2,%xmm0 - movdqa %xmm4,%xmm2 - pandn %xmm3,%xmm1 - movdqa %xmm4,%xmm3 - pand 448(%rsp),%xmm2 - pand 448+16(%rsp),%xmm3 - por %xmm0,%xmm2 - por %xmm1,%xmm3 - movdqu %xmm2,64(%rdi) - movdqu %xmm3,80(%rdi) - - movdqa %xmm5,%xmm0 - movdqa %xmm5,%xmm1 - pandn 288(%rsp),%xmm0 - movdqa %xmm5,%xmm2 - pandn 288+16(%rsp),%xmm1 - movdqa %xmm5,%xmm3 - pand 480(%rsp),%xmm2 - pand 480+16(%rsp),%xmm3 - por %xmm0,%xmm2 - por %xmm1,%xmm3 - - movdqa %xmm4,%xmm0 - movdqa %xmm4,%xmm1 - pandn %xmm2,%xmm0 - movdqa %xmm4,%xmm2 - pandn %xmm3,%xmm1 - movdqa %xmm4,%xmm3 - pand 384(%rsp),%xmm2 - pand 384+16(%rsp),%xmm3 - por %xmm0,%xmm2 - por %xmm1,%xmm3 - movdqu %xmm2,0(%rdi) - movdqu %xmm3,16(%rdi) - - movdqa %xmm5,%xmm0 - movdqa %xmm5,%xmm1 - pandn 320(%rsp),%xmm0 - movdqa %xmm5,%xmm2 - pandn 320+16(%rsp),%xmm1 - movdqa %xmm5,%xmm3 - pand 512(%rsp),%xmm2 - pand 512+16(%rsp),%xmm3 - por %xmm0,%xmm2 - por %xmm1,%xmm3 - - movdqa %xmm4,%xmm0 - movdqa %xmm4,%xmm1 - pandn %xmm2,%xmm0 - movdqa %xmm4,%xmm2 - pandn %xmm3,%xmm1 - movdqa %xmm4,%xmm3 - pand 416(%rsp),%xmm2 - pand 416+16(%rsp),%xmm3 - por %xmm0,%xmm2 - por %xmm1,%xmm3 - movdqu %xmm2,32(%rdi) - movdqu %xmm3,48(%rdi) - -.Ladd_doneq: - leaq 576+56(%rsp),%rsi -.cfi_def_cfa %rsi,8 - movq -48(%rsi),%r15 -.cfi_restore %r15 - movq -40(%rsi),%r14 -.cfi_restore %r14 - movq -32(%rsi),%r13 -.cfi_restore %r13 - movq -24(%rsi),%r12 -.cfi_restore %r12 - movq -16(%rsi),%rbx -.cfi_restore %rbx - movq -8(%rsi),%rbp -.cfi_restore %rbp - leaq (%rsi),%rsp -.cfi_def_cfa_register %rsp -.Lpoint_addq_epilogue: - .byte 0xf3,0xc3 -.cfi_endproc -.size GFp_nistz256_point_add,.-GFp_nistz256_point_add -.globl GFp_nistz256_point_add_affine -.hidden GFp_nistz256_point_add_affine -.type GFp_nistz256_point_add_affine,@function -.align 32 -GFp_nistz256_point_add_affine: -.cfi_startproc - leaq GFp_ia32cap_P(%rip),%rcx - movq 8(%rcx),%rcx - andl $0x80100,%ecx - cmpl $0x80100,%ecx - je .Lpoint_add_affinex - pushq %rbp -.cfi_adjust_cfa_offset 8 -.cfi_offset %rbp,-16 - pushq %rbx -.cfi_adjust_cfa_offset 8 -.cfi_offset %rbx,-24 - pushq %r12 -.cfi_adjust_cfa_offset 8 -.cfi_offset %r12,-32 - pushq %r13 -.cfi_adjust_cfa_offset 8 -.cfi_offset %r13,-40 - pushq %r14 -.cfi_adjust_cfa_offset 8 -.cfi_offset %r14,-48 - pushq %r15 -.cfi_adjust_cfa_offset 8 -.cfi_offset %r15,-56 - subq $480+8,%rsp -.cfi_adjust_cfa_offset 32*15+8 -.Ladd_affineq_body: - - movdqu 0(%rsi),%xmm0 - movq %rdx,%rbx - movdqu 16(%rsi),%xmm1 - movdqu 32(%rsi),%xmm2 - movdqu 48(%rsi),%xmm3 - movdqu 64(%rsi),%xmm4 - movdqu 80(%rsi),%xmm5 - movq 64+0(%rsi),%rax - movq 64+8(%rsi),%r14 - movq 64+16(%rsi),%r15 - movq 64+24(%rsi),%r8 - movdqa %xmm0,320(%rsp) - movdqa %xmm1,320+16(%rsp) - movdqa %xmm2,352(%rsp) - movdqa %xmm3,352+16(%rsp) - movdqa %xmm4,384(%rsp) - movdqa %xmm5,384+16(%rsp) - por %xmm4,%xmm5 - - movdqu 0(%rbx),%xmm0 - pshufd $0xb1,%xmm5,%xmm3 - movdqu 16(%rbx),%xmm1 - movdqu 32(%rbx),%xmm2 - por %xmm3,%xmm5 - movdqu 48(%rbx),%xmm3 - movdqa %xmm0,416(%rsp) - pshufd $0x1e,%xmm5,%xmm4 - movdqa %xmm1,416+16(%rsp) - por %xmm0,%xmm1 -.byte 102,72,15,110,199 - movdqa %xmm2,448(%rsp) - movdqa %xmm3,448+16(%rsp) - por %xmm2,%xmm3 - por %xmm4,%xmm5 - pxor %xmm4,%xmm4 - por %xmm1,%xmm3 - - leaq 64-0(%rsi),%rsi - leaq 32(%rsp),%rdi - call __ecp_nistz256_sqr_montq - - pcmpeqd %xmm4,%xmm5 - pshufd $0xb1,%xmm3,%xmm4 - movq 0(%rbx),%rax - - movq %r12,%r9 - por %xmm3,%xmm4 - pshufd $0,%xmm5,%xmm5 - pshufd $0x1e,%xmm4,%xmm3 - movq %r13,%r10 - por %xmm3,%xmm4 - pxor %xmm3,%xmm3 - movq %r14,%r11 - pcmpeqd %xmm3,%xmm4 - pshufd $0,%xmm4,%xmm4 - - leaq 32-0(%rsp),%rsi - movq %r15,%r12 - leaq 0(%rsp),%rdi - call __ecp_nistz256_mul_montq - - leaq 320(%rsp),%rbx - leaq 64(%rsp),%rdi - call __ecp_nistz256_sub_fromq - - movq 384(%rsp),%rax - leaq 384(%rsp),%rbx - movq 0+32(%rsp),%r9 - movq 8+32(%rsp),%r10 - leaq 0+32(%rsp),%rsi - movq 16+32(%rsp),%r11 - movq 24+32(%rsp),%r12 - leaq 32(%rsp),%rdi - call __ecp_nistz256_mul_montq - - movq 384(%rsp),%rax - leaq 384(%rsp),%rbx - movq 0+64(%rsp),%r9 - movq 8+64(%rsp),%r10 - leaq 0+64(%rsp),%rsi - movq 16+64(%rsp),%r11 - movq 24+64(%rsp),%r12 - leaq 288(%rsp),%rdi - call __ecp_nistz256_mul_montq - - movq 448(%rsp),%rax - leaq 448(%rsp),%rbx - movq 0+32(%rsp),%r9 - movq 8+32(%rsp),%r10 - leaq 0+32(%rsp),%rsi - movq 16+32(%rsp),%r11 - movq 24+32(%rsp),%r12 - leaq 32(%rsp),%rdi - call __ecp_nistz256_mul_montq - - leaq 352(%rsp),%rbx - leaq 96(%rsp),%rdi - call __ecp_nistz256_sub_fromq - - movq 0+64(%rsp),%rax - movq 8+64(%rsp),%r14 - leaq 0+64(%rsp),%rsi - movq 16+64(%rsp),%r15 - movq 24+64(%rsp),%r8 - leaq 128(%rsp),%rdi - call __ecp_nistz256_sqr_montq - - movq 0+96(%rsp),%rax - movq 8+96(%rsp),%r14 - leaq 0+96(%rsp),%rsi - movq 16+96(%rsp),%r15 - movq 24+96(%rsp),%r8 - leaq 192(%rsp),%rdi - call __ecp_nistz256_sqr_montq - - movq 128(%rsp),%rax - leaq 128(%rsp),%rbx - movq 0+64(%rsp),%r9 - movq 8+64(%rsp),%r10 - leaq 0+64(%rsp),%rsi - movq 16+64(%rsp),%r11 - movq 24+64(%rsp),%r12 - leaq 160(%rsp),%rdi - call __ecp_nistz256_mul_montq - - movq 320(%rsp),%rax - leaq 320(%rsp),%rbx - movq 0+128(%rsp),%r9 - movq 8+128(%rsp),%r10 - leaq 0+128(%rsp),%rsi - movq 16+128(%rsp),%r11 - movq 24+128(%rsp),%r12 - leaq 0(%rsp),%rdi - call __ecp_nistz256_mul_montq - - - - - xorq %r11,%r11 - addq %r12,%r12 - leaq 192(%rsp),%rsi - adcq %r13,%r13 - movq %r12,%rax - adcq %r8,%r8 - adcq %r9,%r9 - movq %r13,%rbp - adcq $0,%r11 - - subq $-1,%r12 - movq %r8,%rcx - sbbq %r14,%r13 - sbbq $0,%r8 - movq %r9,%r10 - sbbq %r15,%r9 - sbbq $0,%r11 - - cmovcq %rax,%r12 - movq 0(%rsi),%rax - cmovcq %rbp,%r13 - movq 8(%rsi),%rbp - cmovcq %rcx,%r8 - movq 16(%rsi),%rcx - cmovcq %r10,%r9 - movq 24(%rsi),%r10 - - call __ecp_nistz256_subq - - leaq 160(%rsp),%rbx - leaq 224(%rsp),%rdi - call __ecp_nistz256_sub_fromq - - movq 0+0(%rsp),%rax - movq 0+8(%rsp),%rbp - movq 0+16(%rsp),%rcx - movq 0+24(%rsp),%r10 - leaq 64(%rsp),%rdi - - call __ecp_nistz256_subq - - movq %r12,0(%rdi) - movq %r13,8(%rdi) - movq %r8,16(%rdi) - movq %r9,24(%rdi) - movq 352(%rsp),%rax - leaq 352(%rsp),%rbx - movq 0+160(%rsp),%r9 - movq 8+160(%rsp),%r10 - leaq 0+160(%rsp),%rsi - movq 16+160(%rsp),%r11 - movq 24+160(%rsp),%r12 - leaq 32(%rsp),%rdi - call __ecp_nistz256_mul_montq - - movq 96(%rsp),%rax - leaq 96(%rsp),%rbx - movq 0+64(%rsp),%r9 - movq 8+64(%rsp),%r10 - leaq 0+64(%rsp),%rsi - movq 16+64(%rsp),%r11 - movq 24+64(%rsp),%r12 - leaq 64(%rsp),%rdi - call __ecp_nistz256_mul_montq - - leaq 32(%rsp),%rbx - leaq 256(%rsp),%rdi - call __ecp_nistz256_sub_fromq - -.byte 102,72,15,126,199 - - movdqa %xmm5,%xmm0 - movdqa %xmm5,%xmm1 - pandn 288(%rsp),%xmm0 - movdqa %xmm5,%xmm2 - pandn 288+16(%rsp),%xmm1 - movdqa %xmm5,%xmm3 - pand .LONE_mont(%rip),%xmm2 - pand .LONE_mont+16(%rip),%xmm3 - por %xmm0,%xmm2 - por %xmm1,%xmm3 - - movdqa %xmm4,%xmm0 - movdqa %xmm4,%xmm1 - pandn %xmm2,%xmm0 - movdqa %xmm4,%xmm2 - pandn %xmm3,%xmm1 - movdqa %xmm4,%xmm3 - pand 384(%rsp),%xmm2 - pand 384+16(%rsp),%xmm3 - por %xmm0,%xmm2 - por %xmm1,%xmm3 - movdqu %xmm2,64(%rdi) - movdqu %xmm3,80(%rdi) - - movdqa %xmm5,%xmm0 - movdqa %xmm5,%xmm1 - pandn 224(%rsp),%xmm0 - movdqa %xmm5,%xmm2 - pandn 224+16(%rsp),%xmm1 - movdqa %xmm5,%xmm3 - pand 416(%rsp),%xmm2 - pand 416+16(%rsp),%xmm3 - por %xmm0,%xmm2 - por %xmm1,%xmm3 - - movdqa %xmm4,%xmm0 - movdqa %xmm4,%xmm1 - pandn %xmm2,%xmm0 - movdqa %xmm4,%xmm2 - pandn %xmm3,%xmm1 - movdqa %xmm4,%xmm3 - pand 320(%rsp),%xmm2 - pand 320+16(%rsp),%xmm3 - por %xmm0,%xmm2 - por %xmm1,%xmm3 - movdqu %xmm2,0(%rdi) - movdqu %xmm3,16(%rdi) - - movdqa %xmm5,%xmm0 - movdqa %xmm5,%xmm1 - pandn 256(%rsp),%xmm0 - movdqa %xmm5,%xmm2 - pandn 256+16(%rsp),%xmm1 - movdqa %xmm5,%xmm3 - pand 448(%rsp),%xmm2 - pand 448+16(%rsp),%xmm3 - por %xmm0,%xmm2 - por %xmm1,%xmm3 - - movdqa %xmm4,%xmm0 - movdqa %xmm4,%xmm1 - pandn %xmm2,%xmm0 - movdqa %xmm4,%xmm2 - pandn %xmm3,%xmm1 - movdqa %xmm4,%xmm3 - pand 352(%rsp),%xmm2 - pand 352+16(%rsp),%xmm3 - por %xmm0,%xmm2 - por %xmm1,%xmm3 - movdqu %xmm2,32(%rdi) - movdqu %xmm3,48(%rdi) - - leaq 480+56(%rsp),%rsi -.cfi_def_cfa %rsi,8 - movq -48(%rsi),%r15 -.cfi_restore %r15 - movq -40(%rsi),%r14 -.cfi_restore %r14 - movq -32(%rsi),%r13 -.cfi_restore %r13 - movq -24(%rsi),%r12 -.cfi_restore %r12 - movq -16(%rsi),%rbx -.cfi_restore %rbx - movq -8(%rsi),%rbp -.cfi_restore %rbp - leaq (%rsi),%rsp -.cfi_def_cfa_register %rsp -.Ladd_affineq_epilogue: - .byte 0xf3,0xc3 -.cfi_endproc -.size GFp_nistz256_point_add_affine,.-GFp_nistz256_point_add_affine -.type __ecp_nistz256_add_tox,@function -.align 32 -__ecp_nistz256_add_tox: -.cfi_startproc - xorq %r11,%r11 - adcq 0(%rbx),%r12 - adcq 8(%rbx),%r13 - movq %r12,%rax - adcq 16(%rbx),%r8 - adcq 24(%rbx),%r9 - movq %r13,%rbp - adcq $0,%r11 - - xorq %r10,%r10 - sbbq $-1,%r12 - movq %r8,%rcx - sbbq %r14,%r13 - sbbq $0,%r8 - movq %r9,%r10 - sbbq %r15,%r9 - sbbq $0,%r11 - - cmovcq %rax,%r12 - cmovcq %rbp,%r13 - movq %r12,0(%rdi) - cmovcq %rcx,%r8 - movq %r13,8(%rdi) - cmovcq %r10,%r9 - movq %r8,16(%rdi) - movq %r9,24(%rdi) - - .byte 0xf3,0xc3 -.cfi_endproc -.size __ecp_nistz256_add_tox,.-__ecp_nistz256_add_tox - -.type __ecp_nistz256_sub_fromx,@function -.align 32 -__ecp_nistz256_sub_fromx: -.cfi_startproc - xorq %r11,%r11 - sbbq 0(%rbx),%r12 - sbbq 8(%rbx),%r13 - movq %r12,%rax - sbbq 16(%rbx),%r8 - sbbq 24(%rbx),%r9 - movq %r13,%rbp - sbbq $0,%r11 - - xorq %r10,%r10 - adcq $-1,%r12 - movq %r8,%rcx - adcq %r14,%r13 - adcq $0,%r8 - movq %r9,%r10 - adcq %r15,%r9 - - btq $0,%r11 - cmovncq %rax,%r12 - cmovncq %rbp,%r13 - movq %r12,0(%rdi) - cmovncq %rcx,%r8 - movq %r13,8(%rdi) - cmovncq %r10,%r9 - movq %r8,16(%rdi) - movq %r9,24(%rdi) - - .byte 0xf3,0xc3 -.cfi_endproc -.size __ecp_nistz256_sub_fromx,.-__ecp_nistz256_sub_fromx - -.type __ecp_nistz256_subx,@function -.align 32 -__ecp_nistz256_subx: -.cfi_startproc - xorq %r11,%r11 - sbbq %r12,%rax - sbbq %r13,%rbp - movq %rax,%r12 - sbbq %r8,%rcx - sbbq %r9,%r10 - movq %rbp,%r13 - sbbq $0,%r11 - - xorq %r9,%r9 - adcq $-1,%rax - movq %rcx,%r8 - adcq %r14,%rbp - adcq $0,%rcx - movq %r10,%r9 - adcq %r15,%r10 - - btq $0,%r11 - cmovcq %rax,%r12 - cmovcq %rbp,%r13 - cmovcq %rcx,%r8 - cmovcq %r10,%r9 - - .byte 0xf3,0xc3 -.cfi_endproc -.size __ecp_nistz256_subx,.-__ecp_nistz256_subx - -.type __ecp_nistz256_mul_by_2x,@function -.align 32 -__ecp_nistz256_mul_by_2x: -.cfi_startproc - xorq %r11,%r11 - adcq %r12,%r12 - adcq %r13,%r13 - movq %r12,%rax - adcq %r8,%r8 - adcq %r9,%r9 - movq %r13,%rbp - adcq $0,%r11 - - xorq %r10,%r10 - sbbq $-1,%r12 - movq %r8,%rcx - sbbq %r14,%r13 - sbbq $0,%r8 - movq %r9,%r10 - sbbq %r15,%r9 - sbbq $0,%r11 - - cmovcq %rax,%r12 - cmovcq %rbp,%r13 - movq %r12,0(%rdi) - cmovcq %rcx,%r8 - movq %r13,8(%rdi) - cmovcq %r10,%r9 - movq %r8,16(%rdi) - movq %r9,24(%rdi) - - .byte 0xf3,0xc3 -.cfi_endproc -.size __ecp_nistz256_mul_by_2x,.-__ecp_nistz256_mul_by_2x -.type GFp_nistz256_point_doublex,@function -.align 32 -GFp_nistz256_point_doublex: -.cfi_startproc -.Lpoint_doublex: - pushq %rbp -.cfi_adjust_cfa_offset 8 -.cfi_offset %rbp,-16 - pushq %rbx -.cfi_adjust_cfa_offset 8 -.cfi_offset %rbx,-24 - pushq %r12 -.cfi_adjust_cfa_offset 8 -.cfi_offset %r12,-32 - pushq %r13 -.cfi_adjust_cfa_offset 8 -.cfi_offset %r13,-40 - pushq %r14 -.cfi_adjust_cfa_offset 8 -.cfi_offset %r14,-48 - pushq %r15 -.cfi_adjust_cfa_offset 8 -.cfi_offset %r15,-56 - subq $160+8,%rsp -.cfi_adjust_cfa_offset 32*5+8 -.Lpoint_doublex_body: - -.Lpoint_double_shortcutx: - movdqu 0(%rsi),%xmm0 - movq %rsi,%rbx - movdqu 16(%rsi),%xmm1 - movq 32+0(%rsi),%r12 - movq 32+8(%rsi),%r13 - movq 32+16(%rsi),%r8 - movq 32+24(%rsi),%r9 - movq .Lpoly+8(%rip),%r14 - movq .Lpoly+24(%rip),%r15 - movdqa %xmm0,96(%rsp) - movdqa %xmm1,96+16(%rsp) - leaq 32(%rdi),%r10 - leaq 64(%rdi),%r11 -.byte 102,72,15,110,199 -.byte 102,73,15,110,202 -.byte 102,73,15,110,211 - - leaq 0(%rsp),%rdi - call __ecp_nistz256_mul_by_2x - - movq 64+0(%rsi),%rdx - movq 64+8(%rsi),%r14 - movq 64+16(%rsi),%r15 - movq 64+24(%rsi),%r8 - leaq 64-128(%rsi),%rsi - leaq 64(%rsp),%rdi - call __ecp_nistz256_sqr_montx - - movq 0+0(%rsp),%rdx - movq 8+0(%rsp),%r14 - leaq -128+0(%rsp),%rsi - movq 16+0(%rsp),%r15 - movq 24+0(%rsp),%r8 - leaq 0(%rsp),%rdi - call __ecp_nistz256_sqr_montx - - movq 32(%rbx),%rdx - movq 64+0(%rbx),%r9 - movq 64+8(%rbx),%r10 - movq 64+16(%rbx),%r11 - movq 64+24(%rbx),%r12 - leaq 64-128(%rbx),%rsi - leaq 32(%rbx),%rbx -.byte 102,72,15,126,215 - call __ecp_nistz256_mul_montx - call __ecp_nistz256_mul_by_2x - - movq 96+0(%rsp),%r12 - movq 96+8(%rsp),%r13 - leaq 64(%rsp),%rbx - movq 96+16(%rsp),%r8 - movq 96+24(%rsp),%r9 - leaq 32(%rsp),%rdi - call __ecp_nistz256_add_tox - - movq 96+0(%rsp),%r12 - movq 96+8(%rsp),%r13 - leaq 64(%rsp),%rbx - movq 96+16(%rsp),%r8 - movq 96+24(%rsp),%r9 - leaq 64(%rsp),%rdi - call __ecp_nistz256_sub_fromx - - movq 0+0(%rsp),%rdx - movq 8+0(%rsp),%r14 - leaq -128+0(%rsp),%rsi - movq 16+0(%rsp),%r15 - movq 24+0(%rsp),%r8 -.byte 102,72,15,126,207 - call __ecp_nistz256_sqr_montx - xorq %r9,%r9 - movq %r12,%rax - addq $-1,%r12 - movq %r13,%r10 - adcq %rsi,%r13 - movq %r14,%rcx - adcq $0,%r14 - movq %r15,%r8 - adcq %rbp,%r15 - adcq $0,%r9 - xorq %rsi,%rsi - testq $1,%rax - - cmovzq %rax,%r12 - cmovzq %r10,%r13 - cmovzq %rcx,%r14 - cmovzq %r8,%r15 - cmovzq %rsi,%r9 - - movq %r13,%rax - shrq $1,%r12 - shlq $63,%rax - movq %r14,%r10 - shrq $1,%r13 - orq %rax,%r12 - shlq $63,%r10 - movq %r15,%rcx - shrq $1,%r14 - orq %r10,%r13 - shlq $63,%rcx - movq %r12,0(%rdi) - shrq $1,%r15 - movq %r13,8(%rdi) - shlq $63,%r9 - orq %rcx,%r14 - orq %r9,%r15 - movq %r14,16(%rdi) - movq %r15,24(%rdi) - movq 64(%rsp),%rdx - leaq 64(%rsp),%rbx - movq 0+32(%rsp),%r9 - movq 8+32(%rsp),%r10 - leaq -128+32(%rsp),%rsi - movq 16+32(%rsp),%r11 - movq 24+32(%rsp),%r12 - leaq 32(%rsp),%rdi - call __ecp_nistz256_mul_montx - - leaq 128(%rsp),%rdi - call __ecp_nistz256_mul_by_2x - - leaq 32(%rsp),%rbx - leaq 32(%rsp),%rdi - call __ecp_nistz256_add_tox - - movq 96(%rsp),%rdx - leaq 96(%rsp),%rbx - movq 0+0(%rsp),%r9 - movq 8+0(%rsp),%r10 - leaq -128+0(%rsp),%rsi - movq 16+0(%rsp),%r11 - movq 24+0(%rsp),%r12 - leaq 0(%rsp),%rdi - call __ecp_nistz256_mul_montx - - leaq 128(%rsp),%rdi - call __ecp_nistz256_mul_by_2x - - movq 0+32(%rsp),%rdx - movq 8+32(%rsp),%r14 - leaq -128+32(%rsp),%rsi - movq 16+32(%rsp),%r15 - movq 24+32(%rsp),%r8 -.byte 102,72,15,126,199 - call __ecp_nistz256_sqr_montx - - leaq 128(%rsp),%rbx - movq %r14,%r8 - movq %r15,%r9 - movq %rsi,%r14 - movq %rbp,%r15 - call __ecp_nistz256_sub_fromx - - movq 0+0(%rsp),%rax - movq 0+8(%rsp),%rbp - movq 0+16(%rsp),%rcx - movq 0+24(%rsp),%r10 - leaq 0(%rsp),%rdi - call __ecp_nistz256_subx - - movq 32(%rsp),%rdx - leaq 32(%rsp),%rbx - movq %r12,%r14 - xorl %ecx,%ecx - movq %r12,0+0(%rsp) - movq %r13,%r10 - movq %r13,0+8(%rsp) - cmovzq %r8,%r11 - movq %r8,0+16(%rsp) - leaq 0-128(%rsp),%rsi - cmovzq %r9,%r12 - movq %r9,0+24(%rsp) - movq %r14,%r9 - leaq 0(%rsp),%rdi - call __ecp_nistz256_mul_montx - -.byte 102,72,15,126,203 -.byte 102,72,15,126,207 - call __ecp_nistz256_sub_fromx - - leaq 160+56(%rsp),%rsi -.cfi_def_cfa %rsi,8 - movq -48(%rsi),%r15 -.cfi_restore %r15 - movq -40(%rsi),%r14 -.cfi_restore %r14 - movq -32(%rsi),%r13 -.cfi_restore %r13 - movq -24(%rsi),%r12 -.cfi_restore %r12 - movq -16(%rsi),%rbx -.cfi_restore %rbx - movq -8(%rsi),%rbp -.cfi_restore %rbp - leaq (%rsi),%rsp -.cfi_def_cfa_register %rsp -.Lpoint_doublex_epilogue: - .byte 0xf3,0xc3 -.cfi_endproc -.size GFp_nistz256_point_doublex,.-GFp_nistz256_point_doublex -.type GFp_nistz256_point_addx,@function -.align 32 -GFp_nistz256_point_addx: -.cfi_startproc -.Lpoint_addx: - pushq %rbp -.cfi_adjust_cfa_offset 8 -.cfi_offset %rbp,-16 - pushq %rbx -.cfi_adjust_cfa_offset 8 -.cfi_offset %rbx,-24 - pushq %r12 -.cfi_adjust_cfa_offset 8 -.cfi_offset %r12,-32 - pushq %r13 -.cfi_adjust_cfa_offset 8 -.cfi_offset %r13,-40 - pushq %r14 -.cfi_adjust_cfa_offset 8 -.cfi_offset %r14,-48 - pushq %r15 -.cfi_adjust_cfa_offset 8 -.cfi_offset %r15,-56 - subq $576+8,%rsp -.cfi_adjust_cfa_offset 32*18+8 -.Lpoint_addx_body: - - movdqu 0(%rsi),%xmm0 - movdqu 16(%rsi),%xmm1 - movdqu 32(%rsi),%xmm2 - movdqu 48(%rsi),%xmm3 - movdqu 64(%rsi),%xmm4 - movdqu 80(%rsi),%xmm5 - movq %rsi,%rbx - movq %rdx,%rsi - movdqa %xmm0,384(%rsp) - movdqa %xmm1,384+16(%rsp) - movdqa %xmm2,416(%rsp) - movdqa %xmm3,416+16(%rsp) - movdqa %xmm4,448(%rsp) - movdqa %xmm5,448+16(%rsp) - por %xmm4,%xmm5 - - movdqu 0(%rsi),%xmm0 - pshufd $0xb1,%xmm5,%xmm3 - movdqu 16(%rsi),%xmm1 - movdqu 32(%rsi),%xmm2 - por %xmm3,%xmm5 - movdqu 48(%rsi),%xmm3 - movq 64+0(%rsi),%rdx - movq 64+8(%rsi),%r14 - movq 64+16(%rsi),%r15 - movq 64+24(%rsi),%r8 - movdqa %xmm0,480(%rsp) - pshufd $0x1e,%xmm5,%xmm4 - movdqa %xmm1,480+16(%rsp) - movdqu 64(%rsi),%xmm0 - movdqu 80(%rsi),%xmm1 - movdqa %xmm2,512(%rsp) - movdqa %xmm3,512+16(%rsp) - por %xmm4,%xmm5 - pxor %xmm4,%xmm4 - por %xmm0,%xmm1 -.byte 102,72,15,110,199 - - leaq 64-128(%rsi),%rsi - movq %rdx,544+0(%rsp) - movq %r14,544+8(%rsp) - movq %r15,544+16(%rsp) - movq %r8,544+24(%rsp) - leaq 96(%rsp),%rdi - call __ecp_nistz256_sqr_montx - - pcmpeqd %xmm4,%xmm5 - pshufd $0xb1,%xmm1,%xmm4 - por %xmm1,%xmm4 - pshufd $0,%xmm5,%xmm5 - pshufd $0x1e,%xmm4,%xmm3 - por %xmm3,%xmm4 - pxor %xmm3,%xmm3 - pcmpeqd %xmm3,%xmm4 - pshufd $0,%xmm4,%xmm4 - movq 64+0(%rbx),%rdx - movq 64+8(%rbx),%r14 - movq 64+16(%rbx),%r15 - movq 64+24(%rbx),%r8 -.byte 102,72,15,110,203 - - leaq 64-128(%rbx),%rsi - leaq 32(%rsp),%rdi - call __ecp_nistz256_sqr_montx - - movq 544(%rsp),%rdx - leaq 544(%rsp),%rbx - movq 0+96(%rsp),%r9 - movq 8+96(%rsp),%r10 - leaq -128+96(%rsp),%rsi - movq 16+96(%rsp),%r11 - movq 24+96(%rsp),%r12 - leaq 224(%rsp),%rdi - call __ecp_nistz256_mul_montx - - movq 448(%rsp),%rdx - leaq 448(%rsp),%rbx - movq 0+32(%rsp),%r9 - movq 8+32(%rsp),%r10 - leaq -128+32(%rsp),%rsi - movq 16+32(%rsp),%r11 - movq 24+32(%rsp),%r12 - leaq 256(%rsp),%rdi - call __ecp_nistz256_mul_montx - - movq 416(%rsp),%rdx - leaq 416(%rsp),%rbx - movq 0+224(%rsp),%r9 - movq 8+224(%rsp),%r10 - leaq -128+224(%rsp),%rsi - movq 16+224(%rsp),%r11 - movq 24+224(%rsp),%r12 - leaq 224(%rsp),%rdi - call __ecp_nistz256_mul_montx - - movq 512(%rsp),%rdx - leaq 512(%rsp),%rbx - movq 0+256(%rsp),%r9 - movq 8+256(%rsp),%r10 - leaq -128+256(%rsp),%rsi - movq 16+256(%rsp),%r11 - movq 24+256(%rsp),%r12 - leaq 256(%rsp),%rdi - call __ecp_nistz256_mul_montx - - leaq 224(%rsp),%rbx - leaq 64(%rsp),%rdi - call __ecp_nistz256_sub_fromx - - orq %r13,%r12 - movdqa %xmm4,%xmm2 - orq %r8,%r12 - orq %r9,%r12 - por %xmm5,%xmm2 -.byte 102,73,15,110,220 - - movq 384(%rsp),%rdx - leaq 384(%rsp),%rbx - movq 0+96(%rsp),%r9 - movq 8+96(%rsp),%r10 - leaq -128+96(%rsp),%rsi - movq 16+96(%rsp),%r11 - movq 24+96(%rsp),%r12 - leaq 160(%rsp),%rdi - call __ecp_nistz256_mul_montx - - movq 480(%rsp),%rdx - leaq 480(%rsp),%rbx - movq 0+32(%rsp),%r9 - movq 8+32(%rsp),%r10 - leaq -128+32(%rsp),%rsi - movq 16+32(%rsp),%r11 - movq 24+32(%rsp),%r12 - leaq 192(%rsp),%rdi - call __ecp_nistz256_mul_montx - - leaq 160(%rsp),%rbx - leaq 0(%rsp),%rdi - call __ecp_nistz256_sub_fromx - - orq %r13,%r12 - orq %r8,%r12 - orq %r9,%r12 - -.byte 102,73,15,126,208 -.byte 102,73,15,126,217 - orq %r8,%r12 -.byte 0x3e - jnz .Ladd_proceedx - - - - testq %r9,%r9 - jz .Ladd_doublex - - - - - - -.byte 102,72,15,126,199 - pxor %xmm0,%xmm0 - movdqu %xmm0,0(%rdi) - movdqu %xmm0,16(%rdi) - movdqu %xmm0,32(%rdi) - movdqu %xmm0,48(%rdi) - movdqu %xmm0,64(%rdi) - movdqu %xmm0,80(%rdi) - jmp .Ladd_donex - -.align 32 -.Ladd_doublex: -.byte 102,72,15,126,206 -.byte 102,72,15,126,199 - addq $416,%rsp -.cfi_adjust_cfa_offset -416 - jmp .Lpoint_double_shortcutx -.cfi_adjust_cfa_offset 416 - -.align 32 -.Ladd_proceedx: - movq 0+64(%rsp),%rdx - movq 8+64(%rsp),%r14 - leaq -128+64(%rsp),%rsi - movq 16+64(%rsp),%r15 - movq 24+64(%rsp),%r8 - leaq 96(%rsp),%rdi - call __ecp_nistz256_sqr_montx - - movq 448(%rsp),%rdx - leaq 448(%rsp),%rbx - movq 0+0(%rsp),%r9 - movq 8+0(%rsp),%r10 - leaq -128+0(%rsp),%rsi - movq 16+0(%rsp),%r11 - movq 24+0(%rsp),%r12 - leaq 352(%rsp),%rdi - call __ecp_nistz256_mul_montx - - movq 0+0(%rsp),%rdx - movq 8+0(%rsp),%r14 - leaq -128+0(%rsp),%rsi - movq 16+0(%rsp),%r15 - movq 24+0(%rsp),%r8 - leaq 32(%rsp),%rdi - call __ecp_nistz256_sqr_montx - - movq 544(%rsp),%rdx - leaq 544(%rsp),%rbx - movq 0+352(%rsp),%r9 - movq 8+352(%rsp),%r10 - leaq -128+352(%rsp),%rsi - movq 16+352(%rsp),%r11 - movq 24+352(%rsp),%r12 - leaq 352(%rsp),%rdi - call __ecp_nistz256_mul_montx - - movq 0(%rsp),%rdx - leaq 0(%rsp),%rbx - movq 0+32(%rsp),%r9 - movq 8+32(%rsp),%r10 - leaq -128+32(%rsp),%rsi - movq 16+32(%rsp),%r11 - movq 24+32(%rsp),%r12 - leaq 128(%rsp),%rdi - call __ecp_nistz256_mul_montx - - movq 160(%rsp),%rdx - leaq 160(%rsp),%rbx - movq 0+32(%rsp),%r9 - movq 8+32(%rsp),%r10 - leaq -128+32(%rsp),%rsi - movq 16+32(%rsp),%r11 - movq 24+32(%rsp),%r12 - leaq 192(%rsp),%rdi - call __ecp_nistz256_mul_montx - - - - - xorq %r11,%r11 - addq %r12,%r12 - leaq 96(%rsp),%rsi - adcq %r13,%r13 - movq %r12,%rax - adcq %r8,%r8 - adcq %r9,%r9 - movq %r13,%rbp - adcq $0,%r11 - - subq $-1,%r12 - movq %r8,%rcx - sbbq %r14,%r13 - sbbq $0,%r8 - movq %r9,%r10 - sbbq %r15,%r9 - sbbq $0,%r11 - - cmovcq %rax,%r12 - movq 0(%rsi),%rax - cmovcq %rbp,%r13 - movq 8(%rsi),%rbp - cmovcq %rcx,%r8 - movq 16(%rsi),%rcx - cmovcq %r10,%r9 - movq 24(%rsi),%r10 - - call __ecp_nistz256_subx - - leaq 128(%rsp),%rbx - leaq 288(%rsp),%rdi - call __ecp_nistz256_sub_fromx - - movq 192+0(%rsp),%rax - movq 192+8(%rsp),%rbp - movq 192+16(%rsp),%rcx - movq 192+24(%rsp),%r10 - leaq 320(%rsp),%rdi - - call __ecp_nistz256_subx - - movq %r12,0(%rdi) - movq %r13,8(%rdi) - movq %r8,16(%rdi) - movq %r9,24(%rdi) - movq 128(%rsp),%rdx - leaq 128(%rsp),%rbx - movq 0+224(%rsp),%r9 - movq 8+224(%rsp),%r10 - leaq -128+224(%rsp),%rsi - movq 16+224(%rsp),%r11 - movq 24+224(%rsp),%r12 - leaq 256(%rsp),%rdi - call __ecp_nistz256_mul_montx - - movq 320(%rsp),%rdx - leaq 320(%rsp),%rbx - movq 0+64(%rsp),%r9 - movq 8+64(%rsp),%r10 - leaq -128+64(%rsp),%rsi - movq 16+64(%rsp),%r11 - movq 24+64(%rsp),%r12 - leaq 320(%rsp),%rdi - call __ecp_nistz256_mul_montx - - leaq 256(%rsp),%rbx - leaq 320(%rsp),%rdi - call __ecp_nistz256_sub_fromx - -.byte 102,72,15,126,199 - - movdqa %xmm5,%xmm0 - movdqa %xmm5,%xmm1 - pandn 352(%rsp),%xmm0 - movdqa %xmm5,%xmm2 - pandn 352+16(%rsp),%xmm1 - movdqa %xmm5,%xmm3 - pand 544(%rsp),%xmm2 - pand 544+16(%rsp),%xmm3 - por %xmm0,%xmm2 - por %xmm1,%xmm3 - - movdqa %xmm4,%xmm0 - movdqa %xmm4,%xmm1 - pandn %xmm2,%xmm0 - movdqa %xmm4,%xmm2 - pandn %xmm3,%xmm1 - movdqa %xmm4,%xmm3 - pand 448(%rsp),%xmm2 - pand 448+16(%rsp),%xmm3 - por %xmm0,%xmm2 - por %xmm1,%xmm3 - movdqu %xmm2,64(%rdi) - movdqu %xmm3,80(%rdi) - - movdqa %xmm5,%xmm0 - movdqa %xmm5,%xmm1 - pandn 288(%rsp),%xmm0 - movdqa %xmm5,%xmm2 - pandn 288+16(%rsp),%xmm1 - movdqa %xmm5,%xmm3 - pand 480(%rsp),%xmm2 - pand 480+16(%rsp),%xmm3 - por %xmm0,%xmm2 - por %xmm1,%xmm3 - - movdqa %xmm4,%xmm0 - movdqa %xmm4,%xmm1 - pandn %xmm2,%xmm0 - movdqa %xmm4,%xmm2 - pandn %xmm3,%xmm1 - movdqa %xmm4,%xmm3 - pand 384(%rsp),%xmm2 - pand 384+16(%rsp),%xmm3 - por %xmm0,%xmm2 - por %xmm1,%xmm3 - movdqu %xmm2,0(%rdi) - movdqu %xmm3,16(%rdi) - - movdqa %xmm5,%xmm0 - movdqa %xmm5,%xmm1 - pandn 320(%rsp),%xmm0 - movdqa %xmm5,%xmm2 - pandn 320+16(%rsp),%xmm1 - movdqa %xmm5,%xmm3 - pand 512(%rsp),%xmm2 - pand 512+16(%rsp),%xmm3 - por %xmm0,%xmm2 - por %xmm1,%xmm3 - - movdqa %xmm4,%xmm0 - movdqa %xmm4,%xmm1 - pandn %xmm2,%xmm0 - movdqa %xmm4,%xmm2 - pandn %xmm3,%xmm1 - movdqa %xmm4,%xmm3 - pand 416(%rsp),%xmm2 - pand 416+16(%rsp),%xmm3 - por %xmm0,%xmm2 - por %xmm1,%xmm3 - movdqu %xmm2,32(%rdi) - movdqu %xmm3,48(%rdi) - -.Ladd_donex: - leaq 576+56(%rsp),%rsi -.cfi_def_cfa %rsi,8 - movq -48(%rsi),%r15 -.cfi_restore %r15 - movq -40(%rsi),%r14 -.cfi_restore %r14 - movq -32(%rsi),%r13 -.cfi_restore %r13 - movq -24(%rsi),%r12 -.cfi_restore %r12 - movq -16(%rsi),%rbx -.cfi_restore %rbx - movq -8(%rsi),%rbp -.cfi_restore %rbp - leaq (%rsi),%rsp -.cfi_def_cfa_register %rsp -.Lpoint_addx_epilogue: - .byte 0xf3,0xc3 -.cfi_endproc -.size GFp_nistz256_point_addx,.-GFp_nistz256_point_addx -.type GFp_nistz256_point_add_affinex,@function -.align 32 -GFp_nistz256_point_add_affinex: -.cfi_startproc -.Lpoint_add_affinex: - pushq %rbp -.cfi_adjust_cfa_offset 8 -.cfi_offset %rbp,-16 - pushq %rbx -.cfi_adjust_cfa_offset 8 -.cfi_offset %rbx,-24 - pushq %r12 -.cfi_adjust_cfa_offset 8 -.cfi_offset %r12,-32 - pushq %r13 -.cfi_adjust_cfa_offset 8 -.cfi_offset %r13,-40 - pushq %r14 -.cfi_adjust_cfa_offset 8 -.cfi_offset %r14,-48 - pushq %r15 -.cfi_adjust_cfa_offset 8 -.cfi_offset %r15,-56 - subq $480+8,%rsp -.cfi_adjust_cfa_offset 32*15+8 -.Ladd_affinex_body: - - movdqu 0(%rsi),%xmm0 - movq %rdx,%rbx - movdqu 16(%rsi),%xmm1 - movdqu 32(%rsi),%xmm2 - movdqu 48(%rsi),%xmm3 - movdqu 64(%rsi),%xmm4 - movdqu 80(%rsi),%xmm5 - movq 64+0(%rsi),%rdx - movq 64+8(%rsi),%r14 - movq 64+16(%rsi),%r15 - movq 64+24(%rsi),%r8 - movdqa %xmm0,320(%rsp) - movdqa %xmm1,320+16(%rsp) - movdqa %xmm2,352(%rsp) - movdqa %xmm3,352+16(%rsp) - movdqa %xmm4,384(%rsp) - movdqa %xmm5,384+16(%rsp) - por %xmm4,%xmm5 - - movdqu 0(%rbx),%xmm0 - pshufd $0xb1,%xmm5,%xmm3 - movdqu 16(%rbx),%xmm1 - movdqu 32(%rbx),%xmm2 - por %xmm3,%xmm5 - movdqu 48(%rbx),%xmm3 - movdqa %xmm0,416(%rsp) - pshufd $0x1e,%xmm5,%xmm4 - movdqa %xmm1,416+16(%rsp) - por %xmm0,%xmm1 -.byte 102,72,15,110,199 - movdqa %xmm2,448(%rsp) - movdqa %xmm3,448+16(%rsp) - por %xmm2,%xmm3 - por %xmm4,%xmm5 - pxor %xmm4,%xmm4 - por %xmm1,%xmm3 - - leaq 64-128(%rsi),%rsi - leaq 32(%rsp),%rdi - call __ecp_nistz256_sqr_montx - - pcmpeqd %xmm4,%xmm5 - pshufd $0xb1,%xmm3,%xmm4 - movq 0(%rbx),%rdx - - movq %r12,%r9 - por %xmm3,%xmm4 - pshufd $0,%xmm5,%xmm5 - pshufd $0x1e,%xmm4,%xmm3 - movq %r13,%r10 - por %xmm3,%xmm4 - pxor %xmm3,%xmm3 - movq %r14,%r11 - pcmpeqd %xmm3,%xmm4 - pshufd $0,%xmm4,%xmm4 - - leaq 32-128(%rsp),%rsi - movq %r15,%r12 - leaq 0(%rsp),%rdi - call __ecp_nistz256_mul_montx - - leaq 320(%rsp),%rbx - leaq 64(%rsp),%rdi - call __ecp_nistz256_sub_fromx - - movq 384(%rsp),%rdx - leaq 384(%rsp),%rbx - movq 0+32(%rsp),%r9 - movq 8+32(%rsp),%r10 - leaq -128+32(%rsp),%rsi - movq 16+32(%rsp),%r11 - movq 24+32(%rsp),%r12 - leaq 32(%rsp),%rdi - call __ecp_nistz256_mul_montx - - movq 384(%rsp),%rdx - leaq 384(%rsp),%rbx - movq 0+64(%rsp),%r9 - movq 8+64(%rsp),%r10 - leaq -128+64(%rsp),%rsi - movq 16+64(%rsp),%r11 - movq 24+64(%rsp),%r12 - leaq 288(%rsp),%rdi - call __ecp_nistz256_mul_montx - - movq 448(%rsp),%rdx - leaq 448(%rsp),%rbx - movq 0+32(%rsp),%r9 - movq 8+32(%rsp),%r10 - leaq -128+32(%rsp),%rsi - movq 16+32(%rsp),%r11 - movq 24+32(%rsp),%r12 - leaq 32(%rsp),%rdi - call __ecp_nistz256_mul_montx - - leaq 352(%rsp),%rbx - leaq 96(%rsp),%rdi - call __ecp_nistz256_sub_fromx - - movq 0+64(%rsp),%rdx - movq 8+64(%rsp),%r14 - leaq -128+64(%rsp),%rsi - movq 16+64(%rsp),%r15 - movq 24+64(%rsp),%r8 - leaq 128(%rsp),%rdi - call __ecp_nistz256_sqr_montx - - movq 0+96(%rsp),%rdx - movq 8+96(%rsp),%r14 - leaq -128+96(%rsp),%rsi - movq 16+96(%rsp),%r15 - movq 24+96(%rsp),%r8 - leaq 192(%rsp),%rdi - call __ecp_nistz256_sqr_montx - - movq 128(%rsp),%rdx - leaq 128(%rsp),%rbx - movq 0+64(%rsp),%r9 - movq 8+64(%rsp),%r10 - leaq -128+64(%rsp),%rsi - movq 16+64(%rsp),%r11 - movq 24+64(%rsp),%r12 - leaq 160(%rsp),%rdi - call __ecp_nistz256_mul_montx - - movq 320(%rsp),%rdx - leaq 320(%rsp),%rbx - movq 0+128(%rsp),%r9 - movq 8+128(%rsp),%r10 - leaq -128+128(%rsp),%rsi - movq 16+128(%rsp),%r11 - movq 24+128(%rsp),%r12 - leaq 0(%rsp),%rdi - call __ecp_nistz256_mul_montx - - - - - xorq %r11,%r11 - addq %r12,%r12 - leaq 192(%rsp),%rsi - adcq %r13,%r13 - movq %r12,%rax - adcq %r8,%r8 - adcq %r9,%r9 - movq %r13,%rbp - adcq $0,%r11 - - subq $-1,%r12 - movq %r8,%rcx - sbbq %r14,%r13 - sbbq $0,%r8 - movq %r9,%r10 - sbbq %r15,%r9 - sbbq $0,%r11 - - cmovcq %rax,%r12 - movq 0(%rsi),%rax - cmovcq %rbp,%r13 - movq 8(%rsi),%rbp - cmovcq %rcx,%r8 - movq 16(%rsi),%rcx - cmovcq %r10,%r9 - movq 24(%rsi),%r10 - - call __ecp_nistz256_subx - - leaq 160(%rsp),%rbx - leaq 224(%rsp),%rdi - call __ecp_nistz256_sub_fromx - - movq 0+0(%rsp),%rax - movq 0+8(%rsp),%rbp - movq 0+16(%rsp),%rcx - movq 0+24(%rsp),%r10 - leaq 64(%rsp),%rdi - - call __ecp_nistz256_subx - - movq %r12,0(%rdi) - movq %r13,8(%rdi) - movq %r8,16(%rdi) - movq %r9,24(%rdi) - movq 352(%rsp),%rdx - leaq 352(%rsp),%rbx - movq 0+160(%rsp),%r9 - movq 8+160(%rsp),%r10 - leaq -128+160(%rsp),%rsi - movq 16+160(%rsp),%r11 - movq 24+160(%rsp),%r12 - leaq 32(%rsp),%rdi - call __ecp_nistz256_mul_montx - - movq 96(%rsp),%rdx - leaq 96(%rsp),%rbx - movq 0+64(%rsp),%r9 - movq 8+64(%rsp),%r10 - leaq -128+64(%rsp),%rsi - movq 16+64(%rsp),%r11 - movq 24+64(%rsp),%r12 - leaq 64(%rsp),%rdi - call __ecp_nistz256_mul_montx - - leaq 32(%rsp),%rbx - leaq 256(%rsp),%rdi - call __ecp_nistz256_sub_fromx - -.byte 102,72,15,126,199 - - movdqa %xmm5,%xmm0 - movdqa %xmm5,%xmm1 - pandn 288(%rsp),%xmm0 - movdqa %xmm5,%xmm2 - pandn 288+16(%rsp),%xmm1 - movdqa %xmm5,%xmm3 - pand .LONE_mont(%rip),%xmm2 - pand .LONE_mont+16(%rip),%xmm3 - por %xmm0,%xmm2 - por %xmm1,%xmm3 - - movdqa %xmm4,%xmm0 - movdqa %xmm4,%xmm1 - pandn %xmm2,%xmm0 - movdqa %xmm4,%xmm2 - pandn %xmm3,%xmm1 - movdqa %xmm4,%xmm3 - pand 384(%rsp),%xmm2 - pand 384+16(%rsp),%xmm3 - por %xmm0,%xmm2 - por %xmm1,%xmm3 - movdqu %xmm2,64(%rdi) - movdqu %xmm3,80(%rdi) - - movdqa %xmm5,%xmm0 - movdqa %xmm5,%xmm1 - pandn 224(%rsp),%xmm0 - movdqa %xmm5,%xmm2 - pandn 224+16(%rsp),%xmm1 - movdqa %xmm5,%xmm3 - pand 416(%rsp),%xmm2 - pand 416+16(%rsp),%xmm3 - por %xmm0,%xmm2 - por %xmm1,%xmm3 - - movdqa %xmm4,%xmm0 - movdqa %xmm4,%xmm1 - pandn %xmm2,%xmm0 - movdqa %xmm4,%xmm2 - pandn %xmm3,%xmm1 - movdqa %xmm4,%xmm3 - pand 320(%rsp),%xmm2 - pand 320+16(%rsp),%xmm3 - por %xmm0,%xmm2 - por %xmm1,%xmm3 - movdqu %xmm2,0(%rdi) - movdqu %xmm3,16(%rdi) - - movdqa %xmm5,%xmm0 - movdqa %xmm5,%xmm1 - pandn 256(%rsp),%xmm0 - movdqa %xmm5,%xmm2 - pandn 256+16(%rsp),%xmm1 - movdqa %xmm5,%xmm3 - pand 448(%rsp),%xmm2 - pand 448+16(%rsp),%xmm3 - por %xmm0,%xmm2 - por %xmm1,%xmm3 - - movdqa %xmm4,%xmm0 - movdqa %xmm4,%xmm1 - pandn %xmm2,%xmm0 - movdqa %xmm4,%xmm2 - pandn %xmm3,%xmm1 - movdqa %xmm4,%xmm3 - pand 352(%rsp),%xmm2 - pand 352+16(%rsp),%xmm3 - por %xmm0,%xmm2 - por %xmm1,%xmm3 - movdqu %xmm2,32(%rdi) - movdqu %xmm3,48(%rdi) - - leaq 480+56(%rsp),%rsi -.cfi_def_cfa %rsi,8 - movq -48(%rsi),%r15 -.cfi_restore %r15 - movq -40(%rsi),%r14 -.cfi_restore %r14 - movq -32(%rsi),%r13 -.cfi_restore %r13 - movq -24(%rsi),%r12 -.cfi_restore %r12 - movq -16(%rsi),%rbx -.cfi_restore %rbx - movq -8(%rsi),%rbp -.cfi_restore %rbp - leaq (%rsi),%rsp -.cfi_def_cfa_register %rsp -.Ladd_affinex_epilogue: - .byte 0xf3,0xc3 -.cfi_endproc -.size GFp_nistz256_point_add_affinex,.-GFp_nistz256_point_add_affinex -#endif -.section .note.GNU-stack,"",@progbits diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/p256-x86_64-asm-macosx.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/p256-x86_64-asm-macosx.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/p256-x86_64-asm-macosx.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/p256-x86_64-asm-macosx.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,4511 +0,0 @@ -# This file is generated from a similarly-named Perl script in the BoringSSL -# source tree. Do not edit by hand. - -#if defined(__has_feature) -#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) -#define OPENSSL_NO_ASM -#endif -#endif - -#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) -.text - - - -.p2align 6 -L$poly: -.quad 0xffffffffffffffff, 0x00000000ffffffff, 0x0000000000000000, 0xffffffff00000001 - -L$One: -.long 1,1,1,1,1,1,1,1 -L$Two: -.long 2,2,2,2,2,2,2,2 -L$Three: -.long 3,3,3,3,3,3,3,3 -L$ONE_mont: -.quad 0x0000000000000001, 0xffffffff00000000, 0xffffffffffffffff, 0x00000000fffffffe - - -L$ord: -.quad 0xf3b9cac2fc632551, 0xbce6faada7179e84, 0xffffffffffffffff, 0xffffffff00000000 -L$ordK: -.quad 0xccd1c8aaee00bc4f - - - -.globl _GFp_nistz256_add -.private_extern _GFp_nistz256_add - -.p2align 5 -_GFp_nistz256_add: - pushq %r12 - pushq %r13 - - movq 0(%rsi),%r8 - xorq %r13,%r13 - movq 8(%rsi),%r9 - movq 16(%rsi),%r10 - movq 24(%rsi),%r11 - leaq L$poly(%rip),%rsi - - addq 0(%rdx),%r8 - adcq 8(%rdx),%r9 - movq %r8,%rax - adcq 16(%rdx),%r10 - adcq 24(%rdx),%r11 - movq %r9,%rdx - adcq $0,%r13 - - subq 0(%rsi),%r8 - movq %r10,%rcx - sbbq 8(%rsi),%r9 - sbbq 16(%rsi),%r10 - movq %r11,%r12 - sbbq 24(%rsi),%r11 - sbbq $0,%r13 - - cmovcq %rax,%r8 - cmovcq %rdx,%r9 - movq %r8,0(%rdi) - cmovcq %rcx,%r10 - movq %r9,8(%rdi) - cmovcq %r12,%r11 - movq %r10,16(%rdi) - movq %r11,24(%rdi) - - popq %r13 - popq %r12 - .byte 0xf3,0xc3 - - - - -.globl _GFp_nistz256_neg -.private_extern _GFp_nistz256_neg - -.p2align 5 -_GFp_nistz256_neg: - - pushq %r12 - - pushq %r13 - -L$neg_body: - - xorq %r8,%r8 - xorq %r9,%r9 - xorq %r10,%r10 - xorq %r11,%r11 - xorq %r13,%r13 - - subq 0(%rsi),%r8 - sbbq 8(%rsi),%r9 - sbbq 16(%rsi),%r10 - movq %r8,%rax - sbbq 24(%rsi),%r11 - leaq L$poly(%rip),%rsi - movq %r9,%rdx - sbbq $0,%r13 - - addq 0(%rsi),%r8 - movq %r10,%rcx - adcq 8(%rsi),%r9 - adcq 16(%rsi),%r10 - movq %r11,%r12 - adcq 24(%rsi),%r11 - testq %r13,%r13 - - cmovzq %rax,%r8 - cmovzq %rdx,%r9 - movq %r8,0(%rdi) - cmovzq %rcx,%r10 - movq %r9,8(%rdi) - cmovzq %r12,%r11 - movq %r10,16(%rdi) - movq %r11,24(%rdi) - - movq 0(%rsp),%r13 - - movq 8(%rsp),%r12 - - leaq 16(%rsp),%rsp - -L$neg_epilogue: - .byte 0xf3,0xc3 - - - - - - - - -.globl _GFp_p256_scalar_mul_mont -.private_extern _GFp_p256_scalar_mul_mont - -.p2align 5 -_GFp_p256_scalar_mul_mont: - - leaq _GFp_ia32cap_P(%rip),%rcx - movq 8(%rcx),%rcx - andl $0x80100,%ecx - cmpl $0x80100,%ecx - je L$ecp_nistz256_ord_mul_montx - pushq %rbp - - pushq %rbx - - pushq %r12 - - pushq %r13 - - pushq %r14 - - pushq %r15 - -L$ord_mul_body: - - movq 0(%rdx),%rax - movq %rdx,%rbx - leaq L$ord(%rip),%r14 - movq L$ordK(%rip),%r15 - - - movq %rax,%rcx - mulq 0(%rsi) - movq %rax,%r8 - movq %rcx,%rax - movq %rdx,%r9 - - mulq 8(%rsi) - addq %rax,%r9 - movq %rcx,%rax - adcq $0,%rdx - movq %rdx,%r10 - - mulq 16(%rsi) - addq %rax,%r10 - movq %rcx,%rax - adcq $0,%rdx - - movq %r8,%r13 - imulq %r15,%r8 - - movq %rdx,%r11 - mulq 24(%rsi) - addq %rax,%r11 - movq %r8,%rax - adcq $0,%rdx - movq %rdx,%r12 - - - mulq 0(%r14) - movq %r8,%rbp - addq %rax,%r13 - movq %r8,%rax - adcq $0,%rdx - movq %rdx,%rcx - - subq %r8,%r10 - sbbq $0,%r8 - - mulq 8(%r14) - addq %rcx,%r9 - adcq $0,%rdx - addq %rax,%r9 - movq %rbp,%rax - adcq %rdx,%r10 - movq %rbp,%rdx - adcq $0,%r8 - - shlq $32,%rax - shrq $32,%rdx - subq %rax,%r11 - movq 8(%rbx),%rax - sbbq %rdx,%rbp - - addq %r8,%r11 - adcq %rbp,%r12 - adcq $0,%r13 - - - movq %rax,%rcx - mulq 0(%rsi) - addq %rax,%r9 - movq %rcx,%rax - adcq $0,%rdx - movq %rdx,%rbp - - mulq 8(%rsi) - addq %rbp,%r10 - adcq $0,%rdx - addq %rax,%r10 - movq %rcx,%rax - adcq $0,%rdx - movq %rdx,%rbp - - mulq 16(%rsi) - addq %rbp,%r11 - adcq $0,%rdx - addq %rax,%r11 - movq %rcx,%rax - adcq $0,%rdx - - movq %r9,%rcx - imulq %r15,%r9 - - movq %rdx,%rbp - mulq 24(%rsi) - addq %rbp,%r12 - adcq $0,%rdx - xorq %r8,%r8 - addq %rax,%r12 - movq %r9,%rax - adcq %rdx,%r13 - adcq $0,%r8 - - - mulq 0(%r14) - movq %r9,%rbp - addq %rax,%rcx - movq %r9,%rax - adcq %rdx,%rcx - - subq %r9,%r11 - sbbq $0,%r9 - - mulq 8(%r14) - addq %rcx,%r10 - adcq $0,%rdx - addq %rax,%r10 - movq %rbp,%rax - adcq %rdx,%r11 - movq %rbp,%rdx - adcq $0,%r9 - - shlq $32,%rax - shrq $32,%rdx - subq %rax,%r12 - movq 16(%rbx),%rax - sbbq %rdx,%rbp - - addq %r9,%r12 - adcq %rbp,%r13 - adcq $0,%r8 - - - movq %rax,%rcx - mulq 0(%rsi) - addq %rax,%r10 - movq %rcx,%rax - adcq $0,%rdx - movq %rdx,%rbp - - mulq 8(%rsi) - addq %rbp,%r11 - adcq $0,%rdx - addq %rax,%r11 - movq %rcx,%rax - adcq $0,%rdx - movq %rdx,%rbp - - mulq 16(%rsi) - addq %rbp,%r12 - adcq $0,%rdx - addq %rax,%r12 - movq %rcx,%rax - adcq $0,%rdx - - movq %r10,%rcx - imulq %r15,%r10 - - movq %rdx,%rbp - mulq 24(%rsi) - addq %rbp,%r13 - adcq $0,%rdx - xorq %r9,%r9 - addq %rax,%r13 - movq %r10,%rax - adcq %rdx,%r8 - adcq $0,%r9 - - - mulq 0(%r14) - movq %r10,%rbp - addq %rax,%rcx - movq %r10,%rax - adcq %rdx,%rcx - - subq %r10,%r12 - sbbq $0,%r10 - - mulq 8(%r14) - addq %rcx,%r11 - adcq $0,%rdx - addq %rax,%r11 - movq %rbp,%rax - adcq %rdx,%r12 - movq %rbp,%rdx - adcq $0,%r10 - - shlq $32,%rax - shrq $32,%rdx - subq %rax,%r13 - movq 24(%rbx),%rax - sbbq %rdx,%rbp - - addq %r10,%r13 - adcq %rbp,%r8 - adcq $0,%r9 - - - movq %rax,%rcx - mulq 0(%rsi) - addq %rax,%r11 - movq %rcx,%rax - adcq $0,%rdx - movq %rdx,%rbp - - mulq 8(%rsi) - addq %rbp,%r12 - adcq $0,%rdx - addq %rax,%r12 - movq %rcx,%rax - adcq $0,%rdx - movq %rdx,%rbp - - mulq 16(%rsi) - addq %rbp,%r13 - adcq $0,%rdx - addq %rax,%r13 - movq %rcx,%rax - adcq $0,%rdx - - movq %r11,%rcx - imulq %r15,%r11 - - movq %rdx,%rbp - mulq 24(%rsi) - addq %rbp,%r8 - adcq $0,%rdx - xorq %r10,%r10 - addq %rax,%r8 - movq %r11,%rax - adcq %rdx,%r9 - adcq $0,%r10 - - - mulq 0(%r14) - movq %r11,%rbp - addq %rax,%rcx - movq %r11,%rax - adcq %rdx,%rcx - - subq %r11,%r13 - sbbq $0,%r11 - - mulq 8(%r14) - addq %rcx,%r12 - adcq $0,%rdx - addq %rax,%r12 - movq %rbp,%rax - adcq %rdx,%r13 - movq %rbp,%rdx - adcq $0,%r11 - - shlq $32,%rax - shrq $32,%rdx - subq %rax,%r8 - sbbq %rdx,%rbp - - addq %r11,%r8 - adcq %rbp,%r9 - adcq $0,%r10 - - - movq %r12,%rsi - subq 0(%r14),%r12 - movq %r13,%r11 - sbbq 8(%r14),%r13 - movq %r8,%rcx - sbbq 16(%r14),%r8 - movq %r9,%rbp - sbbq 24(%r14),%r9 - sbbq $0,%r10 - - cmovcq %rsi,%r12 - cmovcq %r11,%r13 - cmovcq %rcx,%r8 - cmovcq %rbp,%r9 - - movq %r12,0(%rdi) - movq %r13,8(%rdi) - movq %r8,16(%rdi) - movq %r9,24(%rdi) - - movq 0(%rsp),%r15 - - movq 8(%rsp),%r14 - - movq 16(%rsp),%r13 - - movq 24(%rsp),%r12 - - movq 32(%rsp),%rbx - - movq 40(%rsp),%rbp - - leaq 48(%rsp),%rsp - -L$ord_mul_epilogue: - .byte 0xf3,0xc3 - - - - - - - - - -.globl _GFp_p256_scalar_sqr_rep_mont -.private_extern _GFp_p256_scalar_sqr_rep_mont - -.p2align 5 -_GFp_p256_scalar_sqr_rep_mont: - - leaq _GFp_ia32cap_P(%rip),%rcx - movq 8(%rcx),%rcx - andl $0x80100,%ecx - cmpl $0x80100,%ecx - je L$ecp_nistz256_ord_sqr_montx - pushq %rbp - - pushq %rbx - - pushq %r12 - - pushq %r13 - - pushq %r14 - - pushq %r15 - -L$ord_sqr_body: - - movq 0(%rsi),%r8 - movq 8(%rsi),%rax - movq 16(%rsi),%r14 - movq 24(%rsi),%r15 - leaq L$ord(%rip),%rsi - movq %rdx,%rbx - jmp L$oop_ord_sqr - -.p2align 5 -L$oop_ord_sqr: - - movq %rax,%rbp - mulq %r8 - movq %rax,%r9 -.byte 102,72,15,110,205 - movq %r14,%rax - movq %rdx,%r10 - - mulq %r8 - addq %rax,%r10 - movq %r15,%rax -.byte 102,73,15,110,214 - adcq $0,%rdx - movq %rdx,%r11 - - mulq %r8 - addq %rax,%r11 - movq %r15,%rax -.byte 102,73,15,110,223 - adcq $0,%rdx - movq %rdx,%r12 - - - mulq %r14 - movq %rax,%r13 - movq %r14,%rax - movq %rdx,%r14 - - - mulq %rbp - addq %rax,%r11 - movq %r15,%rax - adcq $0,%rdx - movq %rdx,%r15 - - mulq %rbp - addq %rax,%r12 - adcq $0,%rdx - - addq %r15,%r12 - adcq %rdx,%r13 - adcq $0,%r14 - - - xorq %r15,%r15 - movq %r8,%rax - addq %r9,%r9 - adcq %r10,%r10 - adcq %r11,%r11 - adcq %r12,%r12 - adcq %r13,%r13 - adcq %r14,%r14 - adcq $0,%r15 - - - mulq %rax - movq %rax,%r8 -.byte 102,72,15,126,200 - movq %rdx,%rbp - - mulq %rax - addq %rbp,%r9 - adcq %rax,%r10 -.byte 102,72,15,126,208 - adcq $0,%rdx - movq %rdx,%rbp - - mulq %rax - addq %rbp,%r11 - adcq %rax,%r12 -.byte 102,72,15,126,216 - adcq $0,%rdx - movq %rdx,%rbp - - movq %r8,%rcx - imulq 32(%rsi),%r8 - - mulq %rax - addq %rbp,%r13 - adcq %rax,%r14 - movq 0(%rsi),%rax - adcq %rdx,%r15 - - - mulq %r8 - movq %r8,%rbp - addq %rax,%rcx - movq 8(%rsi),%rax - adcq %rdx,%rcx - - subq %r8,%r10 - sbbq $0,%rbp - - mulq %r8 - addq %rcx,%r9 - adcq $0,%rdx - addq %rax,%r9 - movq %r8,%rax - adcq %rdx,%r10 - movq %r8,%rdx - adcq $0,%rbp - - movq %r9,%rcx - imulq 32(%rsi),%r9 - - shlq $32,%rax - shrq $32,%rdx - subq %rax,%r11 - movq 0(%rsi),%rax - sbbq %rdx,%r8 - - addq %rbp,%r11 - adcq $0,%r8 - - - mulq %r9 - movq %r9,%rbp - addq %rax,%rcx - movq 8(%rsi),%rax - adcq %rdx,%rcx - - subq %r9,%r11 - sbbq $0,%rbp - - mulq %r9 - addq %rcx,%r10 - adcq $0,%rdx - addq %rax,%r10 - movq %r9,%rax - adcq %rdx,%r11 - movq %r9,%rdx - adcq $0,%rbp - - movq %r10,%rcx - imulq 32(%rsi),%r10 - - shlq $32,%rax - shrq $32,%rdx - subq %rax,%r8 - movq 0(%rsi),%rax - sbbq %rdx,%r9 - - addq %rbp,%r8 - adcq $0,%r9 - - - mulq %r10 - movq %r10,%rbp - addq %rax,%rcx - movq 8(%rsi),%rax - adcq %rdx,%rcx - - subq %r10,%r8 - sbbq $0,%rbp - - mulq %r10 - addq %rcx,%r11 - adcq $0,%rdx - addq %rax,%r11 - movq %r10,%rax - adcq %rdx,%r8 - movq %r10,%rdx - adcq $0,%rbp - - movq %r11,%rcx - imulq 32(%rsi),%r11 - - shlq $32,%rax - shrq $32,%rdx - subq %rax,%r9 - movq 0(%rsi),%rax - sbbq %rdx,%r10 - - addq %rbp,%r9 - adcq $0,%r10 - - - mulq %r11 - movq %r11,%rbp - addq %rax,%rcx - movq 8(%rsi),%rax - adcq %rdx,%rcx - - subq %r11,%r9 - sbbq $0,%rbp - - mulq %r11 - addq %rcx,%r8 - adcq $0,%rdx - addq %rax,%r8 - movq %r11,%rax - adcq %rdx,%r9 - movq %r11,%rdx - adcq $0,%rbp - - shlq $32,%rax - shrq $32,%rdx - subq %rax,%r10 - sbbq %rdx,%r11 - - addq %rbp,%r10 - adcq $0,%r11 - - - xorq %rdx,%rdx - addq %r12,%r8 - adcq %r13,%r9 - movq %r8,%r12 - adcq %r14,%r10 - adcq %r15,%r11 - movq %r9,%rax - adcq $0,%rdx - - - subq 0(%rsi),%r8 - movq %r10,%r14 - sbbq 8(%rsi),%r9 - sbbq 16(%rsi),%r10 - movq %r11,%r15 - sbbq 24(%rsi),%r11 - sbbq $0,%rdx - - cmovcq %r12,%r8 - cmovncq %r9,%rax - cmovncq %r10,%r14 - cmovncq %r11,%r15 - - decq %rbx - jnz L$oop_ord_sqr - - movq %r8,0(%rdi) - movq %rax,8(%rdi) - pxor %xmm1,%xmm1 - movq %r14,16(%rdi) - pxor %xmm2,%xmm2 - movq %r15,24(%rdi) - pxor %xmm3,%xmm3 - - movq 0(%rsp),%r15 - - movq 8(%rsp),%r14 - - movq 16(%rsp),%r13 - - movq 24(%rsp),%r12 - - movq 32(%rsp),%rbx - - movq 40(%rsp),%rbp - - leaq 48(%rsp),%rsp - -L$ord_sqr_epilogue: - .byte 0xf3,0xc3 - - - - -.p2align 5 -ecp_nistz256_ord_mul_montx: - -L$ecp_nistz256_ord_mul_montx: - pushq %rbp - - pushq %rbx - - pushq %r12 - - pushq %r13 - - pushq %r14 - - pushq %r15 - -L$ord_mulx_body: - - movq %rdx,%rbx - movq 0(%rdx),%rdx - movq 0(%rsi),%r9 - movq 8(%rsi),%r10 - movq 16(%rsi),%r11 - movq 24(%rsi),%r12 - leaq -128(%rsi),%rsi - leaq L$ord-128(%rip),%r14 - movq L$ordK(%rip),%r15 - - - mulxq %r9,%r8,%r9 - mulxq %r10,%rcx,%r10 - mulxq %r11,%rbp,%r11 - addq %rcx,%r9 - mulxq %r12,%rcx,%r12 - movq %r8,%rdx - mulxq %r15,%rdx,%rax - adcq %rbp,%r10 - adcq %rcx,%r11 - adcq $0,%r12 - - - xorq %r13,%r13 - mulxq 0+128(%r14),%rcx,%rbp - adcxq %rcx,%r8 - adoxq %rbp,%r9 - - mulxq 8+128(%r14),%rcx,%rbp - adcxq %rcx,%r9 - adoxq %rbp,%r10 - - mulxq 16+128(%r14),%rcx,%rbp - adcxq %rcx,%r10 - adoxq %rbp,%r11 - - mulxq 24+128(%r14),%rcx,%rbp - movq 8(%rbx),%rdx - adcxq %rcx,%r11 - adoxq %rbp,%r12 - adcxq %r8,%r12 - adoxq %r8,%r13 - adcq $0,%r13 - - - mulxq 0+128(%rsi),%rcx,%rbp - adcxq %rcx,%r9 - adoxq %rbp,%r10 - - mulxq 8+128(%rsi),%rcx,%rbp - adcxq %rcx,%r10 - adoxq %rbp,%r11 - - mulxq 16+128(%rsi),%rcx,%rbp - adcxq %rcx,%r11 - adoxq %rbp,%r12 - - mulxq 24+128(%rsi),%rcx,%rbp - movq %r9,%rdx - mulxq %r15,%rdx,%rax - adcxq %rcx,%r12 - adoxq %rbp,%r13 - - adcxq %r8,%r13 - adoxq %r8,%r8 - adcq $0,%r8 - - - mulxq 0+128(%r14),%rcx,%rbp - adcxq %rcx,%r9 - adoxq %rbp,%r10 - - mulxq 8+128(%r14),%rcx,%rbp - adcxq %rcx,%r10 - adoxq %rbp,%r11 - - mulxq 16+128(%r14),%rcx,%rbp - adcxq %rcx,%r11 - adoxq %rbp,%r12 - - mulxq 24+128(%r14),%rcx,%rbp - movq 16(%rbx),%rdx - adcxq %rcx,%r12 - adoxq %rbp,%r13 - adcxq %r9,%r13 - adoxq %r9,%r8 - adcq $0,%r8 - - - mulxq 0+128(%rsi),%rcx,%rbp - adcxq %rcx,%r10 - adoxq %rbp,%r11 - - mulxq 8+128(%rsi),%rcx,%rbp - adcxq %rcx,%r11 - adoxq %rbp,%r12 - - mulxq 16+128(%rsi),%rcx,%rbp - adcxq %rcx,%r12 - adoxq %rbp,%r13 - - mulxq 24+128(%rsi),%rcx,%rbp - movq %r10,%rdx - mulxq %r15,%rdx,%rax - adcxq %rcx,%r13 - adoxq %rbp,%r8 - - adcxq %r9,%r8 - adoxq %r9,%r9 - adcq $0,%r9 - - - mulxq 0+128(%r14),%rcx,%rbp - adcxq %rcx,%r10 - adoxq %rbp,%r11 - - mulxq 8+128(%r14),%rcx,%rbp - adcxq %rcx,%r11 - adoxq %rbp,%r12 - - mulxq 16+128(%r14),%rcx,%rbp - adcxq %rcx,%r12 - adoxq %rbp,%r13 - - mulxq 24+128(%r14),%rcx,%rbp - movq 24(%rbx),%rdx - adcxq %rcx,%r13 - adoxq %rbp,%r8 - adcxq %r10,%r8 - adoxq %r10,%r9 - adcq $0,%r9 - - - mulxq 0+128(%rsi),%rcx,%rbp - adcxq %rcx,%r11 - adoxq %rbp,%r12 - - mulxq 8+128(%rsi),%rcx,%rbp - adcxq %rcx,%r12 - adoxq %rbp,%r13 - - mulxq 16+128(%rsi),%rcx,%rbp - adcxq %rcx,%r13 - adoxq %rbp,%r8 - - mulxq 24+128(%rsi),%rcx,%rbp - movq %r11,%rdx - mulxq %r15,%rdx,%rax - adcxq %rcx,%r8 - adoxq %rbp,%r9 - - adcxq %r10,%r9 - adoxq %r10,%r10 - adcq $0,%r10 - - - mulxq 0+128(%r14),%rcx,%rbp - adcxq %rcx,%r11 - adoxq %rbp,%r12 - - mulxq 8+128(%r14),%rcx,%rbp - adcxq %rcx,%r12 - adoxq %rbp,%r13 - - mulxq 16+128(%r14),%rcx,%rbp - adcxq %rcx,%r13 - adoxq %rbp,%r8 - - mulxq 24+128(%r14),%rcx,%rbp - leaq 128(%r14),%r14 - movq %r12,%rbx - adcxq %rcx,%r8 - adoxq %rbp,%r9 - movq %r13,%rdx - adcxq %r11,%r9 - adoxq %r11,%r10 - adcq $0,%r10 - - - - movq %r8,%rcx - subq 0(%r14),%r12 - sbbq 8(%r14),%r13 - sbbq 16(%r14),%r8 - movq %r9,%rbp - sbbq 24(%r14),%r9 - sbbq $0,%r10 - - cmovcq %rbx,%r12 - cmovcq %rdx,%r13 - cmovcq %rcx,%r8 - cmovcq %rbp,%r9 - - movq %r12,0(%rdi) - movq %r13,8(%rdi) - movq %r8,16(%rdi) - movq %r9,24(%rdi) - - movq 0(%rsp),%r15 - - movq 8(%rsp),%r14 - - movq 16(%rsp),%r13 - - movq 24(%rsp),%r12 - - movq 32(%rsp),%rbx - - movq 40(%rsp),%rbp - - leaq 48(%rsp),%rsp - -L$ord_mulx_epilogue: - .byte 0xf3,0xc3 - - - - -.p2align 5 -ecp_nistz256_ord_sqr_montx: - -L$ecp_nistz256_ord_sqr_montx: - pushq %rbp - - pushq %rbx - - pushq %r12 - - pushq %r13 - - pushq %r14 - - pushq %r15 - -L$ord_sqrx_body: - - movq %rdx,%rbx - movq 0(%rsi),%rdx - movq 8(%rsi),%r14 - movq 16(%rsi),%r15 - movq 24(%rsi),%r8 - leaq L$ord(%rip),%rsi - jmp L$oop_ord_sqrx - -.p2align 5 -L$oop_ord_sqrx: - mulxq %r14,%r9,%r10 - mulxq %r15,%rcx,%r11 - movq %rdx,%rax -.byte 102,73,15,110,206 - mulxq %r8,%rbp,%r12 - movq %r14,%rdx - addq %rcx,%r10 -.byte 102,73,15,110,215 - adcq %rbp,%r11 - adcq $0,%r12 - xorq %r13,%r13 - - mulxq %r15,%rcx,%rbp - adcxq %rcx,%r11 - adoxq %rbp,%r12 - - mulxq %r8,%rcx,%rbp - movq %r15,%rdx - adcxq %rcx,%r12 - adoxq %rbp,%r13 - adcq $0,%r13 - - mulxq %r8,%rcx,%r14 - movq %rax,%rdx -.byte 102,73,15,110,216 - xorq %r15,%r15 - adcxq %r9,%r9 - adoxq %rcx,%r13 - adcxq %r10,%r10 - adoxq %r15,%r14 - - - mulxq %rdx,%r8,%rbp -.byte 102,72,15,126,202 - adcxq %r11,%r11 - adoxq %rbp,%r9 - adcxq %r12,%r12 - mulxq %rdx,%rcx,%rax -.byte 102,72,15,126,210 - adcxq %r13,%r13 - adoxq %rcx,%r10 - adcxq %r14,%r14 - mulxq %rdx,%rcx,%rbp -.byte 0x67 -.byte 102,72,15,126,218 - adoxq %rax,%r11 - adcxq %r15,%r15 - adoxq %rcx,%r12 - adoxq %rbp,%r13 - mulxq %rdx,%rcx,%rax - adoxq %rcx,%r14 - adoxq %rax,%r15 - - - movq %r8,%rdx - mulxq 32(%rsi),%rdx,%rcx - - xorq %rax,%rax - mulxq 0(%rsi),%rcx,%rbp - adcxq %rcx,%r8 - adoxq %rbp,%r9 - mulxq 8(%rsi),%rcx,%rbp - adcxq %rcx,%r9 - adoxq %rbp,%r10 - mulxq 16(%rsi),%rcx,%rbp - adcxq %rcx,%r10 - adoxq %rbp,%r11 - mulxq 24(%rsi),%rcx,%rbp - adcxq %rcx,%r11 - adoxq %rbp,%r8 - adcxq %rax,%r8 - - - movq %r9,%rdx - mulxq 32(%rsi),%rdx,%rcx - - mulxq 0(%rsi),%rcx,%rbp - adoxq %rcx,%r9 - adcxq %rbp,%r10 - mulxq 8(%rsi),%rcx,%rbp - adoxq %rcx,%r10 - adcxq %rbp,%r11 - mulxq 16(%rsi),%rcx,%rbp - adoxq %rcx,%r11 - adcxq %rbp,%r8 - mulxq 24(%rsi),%rcx,%rbp - adoxq %rcx,%r8 - adcxq %rbp,%r9 - adoxq %rax,%r9 - - - movq %r10,%rdx - mulxq 32(%rsi),%rdx,%rcx - - mulxq 0(%rsi),%rcx,%rbp - adcxq %rcx,%r10 - adoxq %rbp,%r11 - mulxq 8(%rsi),%rcx,%rbp - adcxq %rcx,%r11 - adoxq %rbp,%r8 - mulxq 16(%rsi),%rcx,%rbp - adcxq %rcx,%r8 - adoxq %rbp,%r9 - mulxq 24(%rsi),%rcx,%rbp - adcxq %rcx,%r9 - adoxq %rbp,%r10 - adcxq %rax,%r10 - - - movq %r11,%rdx - mulxq 32(%rsi),%rdx,%rcx - - mulxq 0(%rsi),%rcx,%rbp - adoxq %rcx,%r11 - adcxq %rbp,%r8 - mulxq 8(%rsi),%rcx,%rbp - adoxq %rcx,%r8 - adcxq %rbp,%r9 - mulxq 16(%rsi),%rcx,%rbp - adoxq %rcx,%r9 - adcxq %rbp,%r10 - mulxq 24(%rsi),%rcx,%rbp - adoxq %rcx,%r10 - adcxq %rbp,%r11 - adoxq %rax,%r11 - - - addq %r8,%r12 - adcq %r13,%r9 - movq %r12,%rdx - adcq %r14,%r10 - adcq %r15,%r11 - movq %r9,%r14 - adcq $0,%rax - - - subq 0(%rsi),%r12 - movq %r10,%r15 - sbbq 8(%rsi),%r9 - sbbq 16(%rsi),%r10 - movq %r11,%r8 - sbbq 24(%rsi),%r11 - sbbq $0,%rax - - cmovncq %r12,%rdx - cmovncq %r9,%r14 - cmovncq %r10,%r15 - cmovncq %r11,%r8 - - decq %rbx - jnz L$oop_ord_sqrx - - movq %rdx,0(%rdi) - movq %r14,8(%rdi) - pxor %xmm1,%xmm1 - movq %r15,16(%rdi) - pxor %xmm2,%xmm2 - movq %r8,24(%rdi) - pxor %xmm3,%xmm3 - - movq 0(%rsp),%r15 - - movq 8(%rsp),%r14 - - movq 16(%rsp),%r13 - - movq 24(%rsp),%r12 - - movq 32(%rsp),%rbx - - movq 40(%rsp),%rbp - - leaq 48(%rsp),%rsp - -L$ord_sqrx_epilogue: - .byte 0xf3,0xc3 - - - - - - - - -.globl _GFp_nistz256_mul_mont -.private_extern _GFp_nistz256_mul_mont - -.p2align 5 -_GFp_nistz256_mul_mont: - - leaq _GFp_ia32cap_P(%rip),%rcx - movq 8(%rcx),%rcx - andl $0x80100,%ecx -L$mul_mont: - pushq %rbp - - pushq %rbx - - pushq %r12 - - pushq %r13 - - pushq %r14 - - pushq %r15 - -L$mul_body: - cmpl $0x80100,%ecx - je L$mul_montx - movq %rdx,%rbx - movq 0(%rdx),%rax - movq 0(%rsi),%r9 - movq 8(%rsi),%r10 - movq 16(%rsi),%r11 - movq 24(%rsi),%r12 - - call __ecp_nistz256_mul_montq - jmp L$mul_mont_done - -.p2align 5 -L$mul_montx: - movq %rdx,%rbx - movq 0(%rdx),%rdx - movq 0(%rsi),%r9 - movq 8(%rsi),%r10 - movq 16(%rsi),%r11 - movq 24(%rsi),%r12 - leaq -128(%rsi),%rsi - - call __ecp_nistz256_mul_montx -L$mul_mont_done: - movq 0(%rsp),%r15 - - movq 8(%rsp),%r14 - - movq 16(%rsp),%r13 - - movq 24(%rsp),%r12 - - movq 32(%rsp),%rbx - - movq 40(%rsp),%rbp - - leaq 48(%rsp),%rsp - -L$mul_epilogue: - .byte 0xf3,0xc3 - - - - -.p2align 5 -__ecp_nistz256_mul_montq: - - - - movq %rax,%rbp - mulq %r9 - movq L$poly+8(%rip),%r14 - movq %rax,%r8 - movq %rbp,%rax - movq %rdx,%r9 - - mulq %r10 - movq L$poly+24(%rip),%r15 - addq %rax,%r9 - movq %rbp,%rax - adcq $0,%rdx - movq %rdx,%r10 - - mulq %r11 - addq %rax,%r10 - movq %rbp,%rax - adcq $0,%rdx - movq %rdx,%r11 - - mulq %r12 - addq %rax,%r11 - movq %r8,%rax - adcq $0,%rdx - xorq %r13,%r13 - movq %rdx,%r12 - - - - - - - - - - - movq %r8,%rbp - shlq $32,%r8 - mulq %r15 - shrq $32,%rbp - addq %r8,%r9 - adcq %rbp,%r10 - adcq %rax,%r11 - movq 8(%rbx),%rax - adcq %rdx,%r12 - adcq $0,%r13 - xorq %r8,%r8 - - - - movq %rax,%rbp - mulq 0(%rsi) - addq %rax,%r9 - movq %rbp,%rax - adcq $0,%rdx - movq %rdx,%rcx - - mulq 8(%rsi) - addq %rcx,%r10 - adcq $0,%rdx - addq %rax,%r10 - movq %rbp,%rax - adcq $0,%rdx - movq %rdx,%rcx - - mulq 16(%rsi) - addq %rcx,%r11 - adcq $0,%rdx - addq %rax,%r11 - movq %rbp,%rax - adcq $0,%rdx - movq %rdx,%rcx - - mulq 24(%rsi) - addq %rcx,%r12 - adcq $0,%rdx - addq %rax,%r12 - movq %r9,%rax - adcq %rdx,%r13 - adcq $0,%r8 - - - - movq %r9,%rbp - shlq $32,%r9 - mulq %r15 - shrq $32,%rbp - addq %r9,%r10 - adcq %rbp,%r11 - adcq %rax,%r12 - movq 16(%rbx),%rax - adcq %rdx,%r13 - adcq $0,%r8 - xorq %r9,%r9 - - - - movq %rax,%rbp - mulq 0(%rsi) - addq %rax,%r10 - movq %rbp,%rax - adcq $0,%rdx - movq %rdx,%rcx - - mulq 8(%rsi) - addq %rcx,%r11 - adcq $0,%rdx - addq %rax,%r11 - movq %rbp,%rax - adcq $0,%rdx - movq %rdx,%rcx - - mulq 16(%rsi) - addq %rcx,%r12 - adcq $0,%rdx - addq %rax,%r12 - movq %rbp,%rax - adcq $0,%rdx - movq %rdx,%rcx - - mulq 24(%rsi) - addq %rcx,%r13 - adcq $0,%rdx - addq %rax,%r13 - movq %r10,%rax - adcq %rdx,%r8 - adcq $0,%r9 - - - - movq %r10,%rbp - shlq $32,%r10 - mulq %r15 - shrq $32,%rbp - addq %r10,%r11 - adcq %rbp,%r12 - adcq %rax,%r13 - movq 24(%rbx),%rax - adcq %rdx,%r8 - adcq $0,%r9 - xorq %r10,%r10 - - - - movq %rax,%rbp - mulq 0(%rsi) - addq %rax,%r11 - movq %rbp,%rax - adcq $0,%rdx - movq %rdx,%rcx - - mulq 8(%rsi) - addq %rcx,%r12 - adcq $0,%rdx - addq %rax,%r12 - movq %rbp,%rax - adcq $0,%rdx - movq %rdx,%rcx - - mulq 16(%rsi) - addq %rcx,%r13 - adcq $0,%rdx - addq %rax,%r13 - movq %rbp,%rax - adcq $0,%rdx - movq %rdx,%rcx - - mulq 24(%rsi) - addq %rcx,%r8 - adcq $0,%rdx - addq %rax,%r8 - movq %r11,%rax - adcq %rdx,%r9 - adcq $0,%r10 - - - - movq %r11,%rbp - shlq $32,%r11 - mulq %r15 - shrq $32,%rbp - addq %r11,%r12 - adcq %rbp,%r13 - movq %r12,%rcx - adcq %rax,%r8 - adcq %rdx,%r9 - movq %r13,%rbp - adcq $0,%r10 - - - - subq $-1,%r12 - movq %r8,%rbx - sbbq %r14,%r13 - sbbq $0,%r8 - movq %r9,%rdx - sbbq %r15,%r9 - sbbq $0,%r10 - - cmovcq %rcx,%r12 - cmovcq %rbp,%r13 - movq %r12,0(%rdi) - cmovcq %rbx,%r8 - movq %r13,8(%rdi) - cmovcq %rdx,%r9 - movq %r8,16(%rdi) - movq %r9,24(%rdi) - - .byte 0xf3,0xc3 - - - - - - - - - - -.globl _GFp_nistz256_sqr_mont -.private_extern _GFp_nistz256_sqr_mont - -.p2align 5 -_GFp_nistz256_sqr_mont: - - leaq _GFp_ia32cap_P(%rip),%rcx - movq 8(%rcx),%rcx - andl $0x80100,%ecx - pushq %rbp - - pushq %rbx - - pushq %r12 - - pushq %r13 - - pushq %r14 - - pushq %r15 - -L$sqr_body: - cmpl $0x80100,%ecx - je L$sqr_montx - movq 0(%rsi),%rax - movq 8(%rsi),%r14 - movq 16(%rsi),%r15 - movq 24(%rsi),%r8 - - call __ecp_nistz256_sqr_montq - jmp L$sqr_mont_done - -.p2align 5 -L$sqr_montx: - movq 0(%rsi),%rdx - movq 8(%rsi),%r14 - movq 16(%rsi),%r15 - movq 24(%rsi),%r8 - leaq -128(%rsi),%rsi - - call __ecp_nistz256_sqr_montx -L$sqr_mont_done: - movq 0(%rsp),%r15 - - movq 8(%rsp),%r14 - - movq 16(%rsp),%r13 - - movq 24(%rsp),%r12 - - movq 32(%rsp),%rbx - - movq 40(%rsp),%rbp - - leaq 48(%rsp),%rsp - -L$sqr_epilogue: - .byte 0xf3,0xc3 - - - - -.p2align 5 -__ecp_nistz256_sqr_montq: - - movq %rax,%r13 - mulq %r14 - movq %rax,%r9 - movq %r15,%rax - movq %rdx,%r10 - - mulq %r13 - addq %rax,%r10 - movq %r8,%rax - adcq $0,%rdx - movq %rdx,%r11 - - mulq %r13 - addq %rax,%r11 - movq %r15,%rax - adcq $0,%rdx - movq %rdx,%r12 - - - mulq %r14 - addq %rax,%r11 - movq %r8,%rax - adcq $0,%rdx - movq %rdx,%rbp - - mulq %r14 - addq %rax,%r12 - movq %r8,%rax - adcq $0,%rdx - addq %rbp,%r12 - movq %rdx,%r13 - adcq $0,%r13 - - - mulq %r15 - xorq %r15,%r15 - addq %rax,%r13 - movq 0(%rsi),%rax - movq %rdx,%r14 - adcq $0,%r14 - - addq %r9,%r9 - adcq %r10,%r10 - adcq %r11,%r11 - adcq %r12,%r12 - adcq %r13,%r13 - adcq %r14,%r14 - adcq $0,%r15 - - mulq %rax - movq %rax,%r8 - movq 8(%rsi),%rax - movq %rdx,%rcx - - mulq %rax - addq %rcx,%r9 - adcq %rax,%r10 - movq 16(%rsi),%rax - adcq $0,%rdx - movq %rdx,%rcx - - mulq %rax - addq %rcx,%r11 - adcq %rax,%r12 - movq 24(%rsi),%rax - adcq $0,%rdx - movq %rdx,%rcx - - mulq %rax - addq %rcx,%r13 - adcq %rax,%r14 - movq %r8,%rax - adcq %rdx,%r15 - - movq L$poly+8(%rip),%rsi - movq L$poly+24(%rip),%rbp - - - - - movq %r8,%rcx - shlq $32,%r8 - mulq %rbp - shrq $32,%rcx - addq %r8,%r9 - adcq %rcx,%r10 - adcq %rax,%r11 - movq %r9,%rax - adcq $0,%rdx - - - - movq %r9,%rcx - shlq $32,%r9 - movq %rdx,%r8 - mulq %rbp - shrq $32,%rcx - addq %r9,%r10 - adcq %rcx,%r11 - adcq %rax,%r8 - movq %r10,%rax - adcq $0,%rdx - - - - movq %r10,%rcx - shlq $32,%r10 - movq %rdx,%r9 - mulq %rbp - shrq $32,%rcx - addq %r10,%r11 - adcq %rcx,%r8 - adcq %rax,%r9 - movq %r11,%rax - adcq $0,%rdx - - - - movq %r11,%rcx - shlq $32,%r11 - movq %rdx,%r10 - mulq %rbp - shrq $32,%rcx - addq %r11,%r8 - adcq %rcx,%r9 - adcq %rax,%r10 - adcq $0,%rdx - xorq %r11,%r11 - - - - addq %r8,%r12 - adcq %r9,%r13 - movq %r12,%r8 - adcq %r10,%r14 - adcq %rdx,%r15 - movq %r13,%r9 - adcq $0,%r11 - - subq $-1,%r12 - movq %r14,%r10 - sbbq %rsi,%r13 - sbbq $0,%r14 - movq %r15,%rcx - sbbq %rbp,%r15 - sbbq $0,%r11 - - cmovcq %r8,%r12 - cmovcq %r9,%r13 - movq %r12,0(%rdi) - cmovcq %r10,%r14 - movq %r13,8(%rdi) - cmovcq %rcx,%r15 - movq %r14,16(%rdi) - movq %r15,24(%rdi) - - .byte 0xf3,0xc3 - - - -.p2align 5 -__ecp_nistz256_mul_montx: - - - - mulxq %r9,%r8,%r9 - mulxq %r10,%rcx,%r10 - movq $32,%r14 - xorq %r13,%r13 - mulxq %r11,%rbp,%r11 - movq L$poly+24(%rip),%r15 - adcq %rcx,%r9 - mulxq %r12,%rcx,%r12 - movq %r8,%rdx - adcq %rbp,%r10 - shlxq %r14,%r8,%rbp - adcq %rcx,%r11 - shrxq %r14,%r8,%rcx - adcq $0,%r12 - - - - addq %rbp,%r9 - adcq %rcx,%r10 - - mulxq %r15,%rcx,%rbp - movq 8(%rbx),%rdx - adcq %rcx,%r11 - adcq %rbp,%r12 - adcq $0,%r13 - xorq %r8,%r8 - - - - mulxq 0+128(%rsi),%rcx,%rbp - adcxq %rcx,%r9 - adoxq %rbp,%r10 - - mulxq 8+128(%rsi),%rcx,%rbp - adcxq %rcx,%r10 - adoxq %rbp,%r11 - - mulxq 16+128(%rsi),%rcx,%rbp - adcxq %rcx,%r11 - adoxq %rbp,%r12 - - mulxq 24+128(%rsi),%rcx,%rbp - movq %r9,%rdx - adcxq %rcx,%r12 - shlxq %r14,%r9,%rcx - adoxq %rbp,%r13 - shrxq %r14,%r9,%rbp - - adcxq %r8,%r13 - adoxq %r8,%r8 - adcq $0,%r8 - - - - addq %rcx,%r10 - adcq %rbp,%r11 - - mulxq %r15,%rcx,%rbp - movq 16(%rbx),%rdx - adcq %rcx,%r12 - adcq %rbp,%r13 - adcq $0,%r8 - xorq %r9,%r9 - - - - mulxq 0+128(%rsi),%rcx,%rbp - adcxq %rcx,%r10 - adoxq %rbp,%r11 - - mulxq 8+128(%rsi),%rcx,%rbp - adcxq %rcx,%r11 - adoxq %rbp,%r12 - - mulxq 16+128(%rsi),%rcx,%rbp - adcxq %rcx,%r12 - adoxq %rbp,%r13 - - mulxq 24+128(%rsi),%rcx,%rbp - movq %r10,%rdx - adcxq %rcx,%r13 - shlxq %r14,%r10,%rcx - adoxq %rbp,%r8 - shrxq %r14,%r10,%rbp - - adcxq %r9,%r8 - adoxq %r9,%r9 - adcq $0,%r9 - - - - addq %rcx,%r11 - adcq %rbp,%r12 - - mulxq %r15,%rcx,%rbp - movq 24(%rbx),%rdx - adcq %rcx,%r13 - adcq %rbp,%r8 - adcq $0,%r9 - xorq %r10,%r10 - - - - mulxq 0+128(%rsi),%rcx,%rbp - adcxq %rcx,%r11 - adoxq %rbp,%r12 - - mulxq 8+128(%rsi),%rcx,%rbp - adcxq %rcx,%r12 - adoxq %rbp,%r13 - - mulxq 16+128(%rsi),%rcx,%rbp - adcxq %rcx,%r13 - adoxq %rbp,%r8 - - mulxq 24+128(%rsi),%rcx,%rbp - movq %r11,%rdx - adcxq %rcx,%r8 - shlxq %r14,%r11,%rcx - adoxq %rbp,%r9 - shrxq %r14,%r11,%rbp - - adcxq %r10,%r9 - adoxq %r10,%r10 - adcq $0,%r10 - - - - addq %rcx,%r12 - adcq %rbp,%r13 - - mulxq %r15,%rcx,%rbp - movq %r12,%rbx - movq L$poly+8(%rip),%r14 - adcq %rcx,%r8 - movq %r13,%rdx - adcq %rbp,%r9 - adcq $0,%r10 - - - - xorl %eax,%eax - movq %r8,%rcx - sbbq $-1,%r12 - sbbq %r14,%r13 - sbbq $0,%r8 - movq %r9,%rbp - sbbq %r15,%r9 - sbbq $0,%r10 - - cmovcq %rbx,%r12 - cmovcq %rdx,%r13 - movq %r12,0(%rdi) - cmovcq %rcx,%r8 - movq %r13,8(%rdi) - cmovcq %rbp,%r9 - movq %r8,16(%rdi) - movq %r9,24(%rdi) - - .byte 0xf3,0xc3 - - - - -.p2align 5 -__ecp_nistz256_sqr_montx: - - mulxq %r14,%r9,%r10 - mulxq %r15,%rcx,%r11 - xorl %eax,%eax - adcq %rcx,%r10 - mulxq %r8,%rbp,%r12 - movq %r14,%rdx - adcq %rbp,%r11 - adcq $0,%r12 - xorq %r13,%r13 - - - mulxq %r15,%rcx,%rbp - adcxq %rcx,%r11 - adoxq %rbp,%r12 - - mulxq %r8,%rcx,%rbp - movq %r15,%rdx - adcxq %rcx,%r12 - adoxq %rbp,%r13 - adcq $0,%r13 - - - mulxq %r8,%rcx,%r14 - movq 0+128(%rsi),%rdx - xorq %r15,%r15 - adcxq %r9,%r9 - adoxq %rcx,%r13 - adcxq %r10,%r10 - adoxq %r15,%r14 - - mulxq %rdx,%r8,%rbp - movq 8+128(%rsi),%rdx - adcxq %r11,%r11 - adoxq %rbp,%r9 - adcxq %r12,%r12 - mulxq %rdx,%rcx,%rax - movq 16+128(%rsi),%rdx - adcxq %r13,%r13 - adoxq %rcx,%r10 - adcxq %r14,%r14 -.byte 0x67 - mulxq %rdx,%rcx,%rbp - movq 24+128(%rsi),%rdx - adoxq %rax,%r11 - adcxq %r15,%r15 - adoxq %rcx,%r12 - movq $32,%rsi - adoxq %rbp,%r13 -.byte 0x67,0x67 - mulxq %rdx,%rcx,%rax - movq L$poly+24(%rip),%rdx - adoxq %rcx,%r14 - shlxq %rsi,%r8,%rcx - adoxq %rax,%r15 - shrxq %rsi,%r8,%rax - movq %rdx,%rbp - - - addq %rcx,%r9 - adcq %rax,%r10 - - mulxq %r8,%rcx,%r8 - adcq %rcx,%r11 - shlxq %rsi,%r9,%rcx - adcq $0,%r8 - shrxq %rsi,%r9,%rax - - - addq %rcx,%r10 - adcq %rax,%r11 - - mulxq %r9,%rcx,%r9 - adcq %rcx,%r8 - shlxq %rsi,%r10,%rcx - adcq $0,%r9 - shrxq %rsi,%r10,%rax - - - addq %rcx,%r11 - adcq %rax,%r8 - - mulxq %r10,%rcx,%r10 - adcq %rcx,%r9 - shlxq %rsi,%r11,%rcx - adcq $0,%r10 - shrxq %rsi,%r11,%rax - - - addq %rcx,%r8 - adcq %rax,%r9 - - mulxq %r11,%rcx,%r11 - adcq %rcx,%r10 - adcq $0,%r11 - - xorq %rdx,%rdx - addq %r8,%r12 - movq L$poly+8(%rip),%rsi - adcq %r9,%r13 - movq %r12,%r8 - adcq %r10,%r14 - adcq %r11,%r15 - movq %r13,%r9 - adcq $0,%rdx - - subq $-1,%r12 - movq %r14,%r10 - sbbq %rsi,%r13 - sbbq $0,%r14 - movq %r15,%r11 - sbbq %rbp,%r15 - sbbq $0,%rdx - - cmovcq %r8,%r12 - cmovcq %r9,%r13 - movq %r12,0(%rdi) - cmovcq %r10,%r14 - movq %r13,8(%rdi) - cmovcq %r11,%r15 - movq %r14,16(%rdi) - movq %r15,24(%rdi) - - .byte 0xf3,0xc3 - - - - -.globl _GFp_nistz256_select_w5 -.private_extern _GFp_nistz256_select_w5 - -.p2align 5 -_GFp_nistz256_select_w5: - - leaq _GFp_ia32cap_P(%rip),%rax - movq 8(%rax),%rax - testl $32,%eax - jnz L$avx2_select_w5 - movdqa L$One(%rip),%xmm0 - movd %edx,%xmm1 - - pxor %xmm2,%xmm2 - pxor %xmm3,%xmm3 - pxor %xmm4,%xmm4 - pxor %xmm5,%xmm5 - pxor %xmm6,%xmm6 - pxor %xmm7,%xmm7 - - movdqa %xmm0,%xmm8 - pshufd $0,%xmm1,%xmm1 - - movq $16,%rax -L$select_loop_sse_w5: - - movdqa %xmm8,%xmm15 - paddd %xmm0,%xmm8 - pcmpeqd %xmm1,%xmm15 - - movdqa 0(%rsi),%xmm9 - movdqa 16(%rsi),%xmm10 - movdqa 32(%rsi),%xmm11 - movdqa 48(%rsi),%xmm12 - movdqa 64(%rsi),%xmm13 - movdqa 80(%rsi),%xmm14 - leaq 96(%rsi),%rsi - - pand %xmm15,%xmm9 - pand %xmm15,%xmm10 - por %xmm9,%xmm2 - pand %xmm15,%xmm11 - por %xmm10,%xmm3 - pand %xmm15,%xmm12 - por %xmm11,%xmm4 - pand %xmm15,%xmm13 - por %xmm12,%xmm5 - pand %xmm15,%xmm14 - por %xmm13,%xmm6 - por %xmm14,%xmm7 - - decq %rax - jnz L$select_loop_sse_w5 - - movdqu %xmm2,0(%rdi) - movdqu %xmm3,16(%rdi) - movdqu %xmm4,32(%rdi) - movdqu %xmm5,48(%rdi) - movdqu %xmm6,64(%rdi) - movdqu %xmm7,80(%rdi) - .byte 0xf3,0xc3 - -L$SEH_end_GFp_nistz256_select_w5: - - - - -.globl _GFp_nistz256_select_w7 -.private_extern _GFp_nistz256_select_w7 - -.p2align 5 -_GFp_nistz256_select_w7: - - leaq _GFp_ia32cap_P(%rip),%rax - movq 8(%rax),%rax - testl $32,%eax - jnz L$avx2_select_w7 - movdqa L$One(%rip),%xmm8 - movd %edx,%xmm1 - - pxor %xmm2,%xmm2 - pxor %xmm3,%xmm3 - pxor %xmm4,%xmm4 - pxor %xmm5,%xmm5 - - movdqa %xmm8,%xmm0 - pshufd $0,%xmm1,%xmm1 - movq $64,%rax - -L$select_loop_sse_w7: - movdqa %xmm8,%xmm15 - paddd %xmm0,%xmm8 - movdqa 0(%rsi),%xmm9 - movdqa 16(%rsi),%xmm10 - pcmpeqd %xmm1,%xmm15 - movdqa 32(%rsi),%xmm11 - movdqa 48(%rsi),%xmm12 - leaq 64(%rsi),%rsi - - pand %xmm15,%xmm9 - pand %xmm15,%xmm10 - por %xmm9,%xmm2 - pand %xmm15,%xmm11 - por %xmm10,%xmm3 - pand %xmm15,%xmm12 - por %xmm11,%xmm4 - prefetcht0 255(%rsi) - por %xmm12,%xmm5 - - decq %rax - jnz L$select_loop_sse_w7 - - movdqu %xmm2,0(%rdi) - movdqu %xmm3,16(%rdi) - movdqu %xmm4,32(%rdi) - movdqu %xmm5,48(%rdi) - .byte 0xf3,0xc3 - -L$SEH_end_GFp_nistz256_select_w7: - - - - -.p2align 5 -GFp_nistz256_avx2_select_w5: - -L$avx2_select_w5: - vzeroupper - vmovdqa L$Two(%rip),%ymm0 - - vpxor %ymm2,%ymm2,%ymm2 - vpxor %ymm3,%ymm3,%ymm3 - vpxor %ymm4,%ymm4,%ymm4 - - vmovdqa L$One(%rip),%ymm5 - vmovdqa L$Two(%rip),%ymm10 - - vmovd %edx,%xmm1 - vpermd %ymm1,%ymm2,%ymm1 - - movq $8,%rax -L$select_loop_avx2_w5: - - vmovdqa 0(%rsi),%ymm6 - vmovdqa 32(%rsi),%ymm7 - vmovdqa 64(%rsi),%ymm8 - - vmovdqa 96(%rsi),%ymm11 - vmovdqa 128(%rsi),%ymm12 - vmovdqa 160(%rsi),%ymm13 - - vpcmpeqd %ymm1,%ymm5,%ymm9 - vpcmpeqd %ymm1,%ymm10,%ymm14 - - vpaddd %ymm0,%ymm5,%ymm5 - vpaddd %ymm0,%ymm10,%ymm10 - leaq 192(%rsi),%rsi - - vpand %ymm9,%ymm6,%ymm6 - vpand %ymm9,%ymm7,%ymm7 - vpand %ymm9,%ymm8,%ymm8 - vpand %ymm14,%ymm11,%ymm11 - vpand %ymm14,%ymm12,%ymm12 - vpand %ymm14,%ymm13,%ymm13 - - vpxor %ymm6,%ymm2,%ymm2 - vpxor %ymm7,%ymm3,%ymm3 - vpxor %ymm8,%ymm4,%ymm4 - vpxor %ymm11,%ymm2,%ymm2 - vpxor %ymm12,%ymm3,%ymm3 - vpxor %ymm13,%ymm4,%ymm4 - - decq %rax - jnz L$select_loop_avx2_w5 - - vmovdqu %ymm2,0(%rdi) - vmovdqu %ymm3,32(%rdi) - vmovdqu %ymm4,64(%rdi) - vzeroupper - .byte 0xf3,0xc3 - -L$SEH_end_GFp_nistz256_avx2_select_w5: - - - - -.globl _GFp_nistz256_avx2_select_w7 -.private_extern _GFp_nistz256_avx2_select_w7 - -.p2align 5 -_GFp_nistz256_avx2_select_w7: - -L$avx2_select_w7: - vzeroupper - vmovdqa L$Three(%rip),%ymm0 - - vpxor %ymm2,%ymm2,%ymm2 - vpxor %ymm3,%ymm3,%ymm3 - - vmovdqa L$One(%rip),%ymm4 - vmovdqa L$Two(%rip),%ymm8 - vmovdqa L$Three(%rip),%ymm12 - - vmovd %edx,%xmm1 - vpermd %ymm1,%ymm2,%ymm1 - - - movq $21,%rax -L$select_loop_avx2_w7: - - vmovdqa 0(%rsi),%ymm5 - vmovdqa 32(%rsi),%ymm6 - - vmovdqa 64(%rsi),%ymm9 - vmovdqa 96(%rsi),%ymm10 - - vmovdqa 128(%rsi),%ymm13 - vmovdqa 160(%rsi),%ymm14 - - vpcmpeqd %ymm1,%ymm4,%ymm7 - vpcmpeqd %ymm1,%ymm8,%ymm11 - vpcmpeqd %ymm1,%ymm12,%ymm15 - - vpaddd %ymm0,%ymm4,%ymm4 - vpaddd %ymm0,%ymm8,%ymm8 - vpaddd %ymm0,%ymm12,%ymm12 - leaq 192(%rsi),%rsi - - vpand %ymm7,%ymm5,%ymm5 - vpand %ymm7,%ymm6,%ymm6 - vpand %ymm11,%ymm9,%ymm9 - vpand %ymm11,%ymm10,%ymm10 - vpand %ymm15,%ymm13,%ymm13 - vpand %ymm15,%ymm14,%ymm14 - - vpxor %ymm5,%ymm2,%ymm2 - vpxor %ymm6,%ymm3,%ymm3 - vpxor %ymm9,%ymm2,%ymm2 - vpxor %ymm10,%ymm3,%ymm3 - vpxor %ymm13,%ymm2,%ymm2 - vpxor %ymm14,%ymm3,%ymm3 - - decq %rax - jnz L$select_loop_avx2_w7 - - - vmovdqa 0(%rsi),%ymm5 - vmovdqa 32(%rsi),%ymm6 - - vpcmpeqd %ymm1,%ymm4,%ymm7 - - vpand %ymm7,%ymm5,%ymm5 - vpand %ymm7,%ymm6,%ymm6 - - vpxor %ymm5,%ymm2,%ymm2 - vpxor %ymm6,%ymm3,%ymm3 - - vmovdqu %ymm2,0(%rdi) - vmovdqu %ymm3,32(%rdi) - vzeroupper - .byte 0xf3,0xc3 - -L$SEH_end_GFp_nistz256_avx2_select_w7: - - -.p2align 5 -__ecp_nistz256_add_toq: - - xorq %r11,%r11 - addq 0(%rbx),%r12 - adcq 8(%rbx),%r13 - movq %r12,%rax - adcq 16(%rbx),%r8 - adcq 24(%rbx),%r9 - movq %r13,%rbp - adcq $0,%r11 - - subq $-1,%r12 - movq %r8,%rcx - sbbq %r14,%r13 - sbbq $0,%r8 - movq %r9,%r10 - sbbq %r15,%r9 - sbbq $0,%r11 - - cmovcq %rax,%r12 - cmovcq %rbp,%r13 - movq %r12,0(%rdi) - cmovcq %rcx,%r8 - movq %r13,8(%rdi) - cmovcq %r10,%r9 - movq %r8,16(%rdi) - movq %r9,24(%rdi) - - .byte 0xf3,0xc3 - - - - -.p2align 5 -__ecp_nistz256_sub_fromq: - - subq 0(%rbx),%r12 - sbbq 8(%rbx),%r13 - movq %r12,%rax - sbbq 16(%rbx),%r8 - sbbq 24(%rbx),%r9 - movq %r13,%rbp - sbbq %r11,%r11 - - addq $-1,%r12 - movq %r8,%rcx - adcq %r14,%r13 - adcq $0,%r8 - movq %r9,%r10 - adcq %r15,%r9 - testq %r11,%r11 - - cmovzq %rax,%r12 - cmovzq %rbp,%r13 - movq %r12,0(%rdi) - cmovzq %rcx,%r8 - movq %r13,8(%rdi) - cmovzq %r10,%r9 - movq %r8,16(%rdi) - movq %r9,24(%rdi) - - .byte 0xf3,0xc3 - - - - -.p2align 5 -__ecp_nistz256_subq: - - subq %r12,%rax - sbbq %r13,%rbp - movq %rax,%r12 - sbbq %r8,%rcx - sbbq %r9,%r10 - movq %rbp,%r13 - sbbq %r11,%r11 - - addq $-1,%rax - movq %rcx,%r8 - adcq %r14,%rbp - adcq $0,%rcx - movq %r10,%r9 - adcq %r15,%r10 - testq %r11,%r11 - - cmovnzq %rax,%r12 - cmovnzq %rbp,%r13 - cmovnzq %rcx,%r8 - cmovnzq %r10,%r9 - - .byte 0xf3,0xc3 - - - - -.p2align 5 -__ecp_nistz256_mul_by_2q: - - xorq %r11,%r11 - addq %r12,%r12 - adcq %r13,%r13 - movq %r12,%rax - adcq %r8,%r8 - adcq %r9,%r9 - movq %r13,%rbp - adcq $0,%r11 - - subq $-1,%r12 - movq %r8,%rcx - sbbq %r14,%r13 - sbbq $0,%r8 - movq %r9,%r10 - sbbq %r15,%r9 - sbbq $0,%r11 - - cmovcq %rax,%r12 - cmovcq %rbp,%r13 - movq %r12,0(%rdi) - cmovcq %rcx,%r8 - movq %r13,8(%rdi) - cmovcq %r10,%r9 - movq %r8,16(%rdi) - movq %r9,24(%rdi) - - .byte 0xf3,0xc3 - - -.globl _GFp_nistz256_point_double -.private_extern _GFp_nistz256_point_double - -.p2align 5 -_GFp_nistz256_point_double: - - leaq _GFp_ia32cap_P(%rip),%rcx - movq 8(%rcx),%rcx - andl $0x80100,%ecx - cmpl $0x80100,%ecx - je L$point_doublex - pushq %rbp - - pushq %rbx - - pushq %r12 - - pushq %r13 - - pushq %r14 - - pushq %r15 - - subq $160+8,%rsp - -L$point_doubleq_body: - -L$point_double_shortcutq: - movdqu 0(%rsi),%xmm0 - movq %rsi,%rbx - movdqu 16(%rsi),%xmm1 - movq 32+0(%rsi),%r12 - movq 32+8(%rsi),%r13 - movq 32+16(%rsi),%r8 - movq 32+24(%rsi),%r9 - movq L$poly+8(%rip),%r14 - movq L$poly+24(%rip),%r15 - movdqa %xmm0,96(%rsp) - movdqa %xmm1,96+16(%rsp) - leaq 32(%rdi),%r10 - leaq 64(%rdi),%r11 -.byte 102,72,15,110,199 -.byte 102,73,15,110,202 -.byte 102,73,15,110,211 - - leaq 0(%rsp),%rdi - call __ecp_nistz256_mul_by_2q - - movq 64+0(%rsi),%rax - movq 64+8(%rsi),%r14 - movq 64+16(%rsi),%r15 - movq 64+24(%rsi),%r8 - leaq 64-0(%rsi),%rsi - leaq 64(%rsp),%rdi - call __ecp_nistz256_sqr_montq - - movq 0+0(%rsp),%rax - movq 8+0(%rsp),%r14 - leaq 0+0(%rsp),%rsi - movq 16+0(%rsp),%r15 - movq 24+0(%rsp),%r8 - leaq 0(%rsp),%rdi - call __ecp_nistz256_sqr_montq - - movq 32(%rbx),%rax - movq 64+0(%rbx),%r9 - movq 64+8(%rbx),%r10 - movq 64+16(%rbx),%r11 - movq 64+24(%rbx),%r12 - leaq 64-0(%rbx),%rsi - leaq 32(%rbx),%rbx -.byte 102,72,15,126,215 - call __ecp_nistz256_mul_montq - call __ecp_nistz256_mul_by_2q - - movq 96+0(%rsp),%r12 - movq 96+8(%rsp),%r13 - leaq 64(%rsp),%rbx - movq 96+16(%rsp),%r8 - movq 96+24(%rsp),%r9 - leaq 32(%rsp),%rdi - call __ecp_nistz256_add_toq - - movq 96+0(%rsp),%r12 - movq 96+8(%rsp),%r13 - leaq 64(%rsp),%rbx - movq 96+16(%rsp),%r8 - movq 96+24(%rsp),%r9 - leaq 64(%rsp),%rdi - call __ecp_nistz256_sub_fromq - - movq 0+0(%rsp),%rax - movq 8+0(%rsp),%r14 - leaq 0+0(%rsp),%rsi - movq 16+0(%rsp),%r15 - movq 24+0(%rsp),%r8 -.byte 102,72,15,126,207 - call __ecp_nistz256_sqr_montq - xorq %r9,%r9 - movq %r12,%rax - addq $-1,%r12 - movq %r13,%r10 - adcq %rsi,%r13 - movq %r14,%rcx - adcq $0,%r14 - movq %r15,%r8 - adcq %rbp,%r15 - adcq $0,%r9 - xorq %rsi,%rsi - testq $1,%rax - - cmovzq %rax,%r12 - cmovzq %r10,%r13 - cmovzq %rcx,%r14 - cmovzq %r8,%r15 - cmovzq %rsi,%r9 - - movq %r13,%rax - shrq $1,%r12 - shlq $63,%rax - movq %r14,%r10 - shrq $1,%r13 - orq %rax,%r12 - shlq $63,%r10 - movq %r15,%rcx - shrq $1,%r14 - orq %r10,%r13 - shlq $63,%rcx - movq %r12,0(%rdi) - shrq $1,%r15 - movq %r13,8(%rdi) - shlq $63,%r9 - orq %rcx,%r14 - orq %r9,%r15 - movq %r14,16(%rdi) - movq %r15,24(%rdi) - movq 64(%rsp),%rax - leaq 64(%rsp),%rbx - movq 0+32(%rsp),%r9 - movq 8+32(%rsp),%r10 - leaq 0+32(%rsp),%rsi - movq 16+32(%rsp),%r11 - movq 24+32(%rsp),%r12 - leaq 32(%rsp),%rdi - call __ecp_nistz256_mul_montq - - leaq 128(%rsp),%rdi - call __ecp_nistz256_mul_by_2q - - leaq 32(%rsp),%rbx - leaq 32(%rsp),%rdi - call __ecp_nistz256_add_toq - - movq 96(%rsp),%rax - leaq 96(%rsp),%rbx - movq 0+0(%rsp),%r9 - movq 8+0(%rsp),%r10 - leaq 0+0(%rsp),%rsi - movq 16+0(%rsp),%r11 - movq 24+0(%rsp),%r12 - leaq 0(%rsp),%rdi - call __ecp_nistz256_mul_montq - - leaq 128(%rsp),%rdi - call __ecp_nistz256_mul_by_2q - - movq 0+32(%rsp),%rax - movq 8+32(%rsp),%r14 - leaq 0+32(%rsp),%rsi - movq 16+32(%rsp),%r15 - movq 24+32(%rsp),%r8 -.byte 102,72,15,126,199 - call __ecp_nistz256_sqr_montq - - leaq 128(%rsp),%rbx - movq %r14,%r8 - movq %r15,%r9 - movq %rsi,%r14 - movq %rbp,%r15 - call __ecp_nistz256_sub_fromq - - movq 0+0(%rsp),%rax - movq 0+8(%rsp),%rbp - movq 0+16(%rsp),%rcx - movq 0+24(%rsp),%r10 - leaq 0(%rsp),%rdi - call __ecp_nistz256_subq - - movq 32(%rsp),%rax - leaq 32(%rsp),%rbx - movq %r12,%r14 - xorl %ecx,%ecx - movq %r12,0+0(%rsp) - movq %r13,%r10 - movq %r13,0+8(%rsp) - cmovzq %r8,%r11 - movq %r8,0+16(%rsp) - leaq 0-0(%rsp),%rsi - cmovzq %r9,%r12 - movq %r9,0+24(%rsp) - movq %r14,%r9 - leaq 0(%rsp),%rdi - call __ecp_nistz256_mul_montq - -.byte 102,72,15,126,203 -.byte 102,72,15,126,207 - call __ecp_nistz256_sub_fromq - - leaq 160+56(%rsp),%rsi - - movq -48(%rsi),%r15 - - movq -40(%rsi),%r14 - - movq -32(%rsi),%r13 - - movq -24(%rsi),%r12 - - movq -16(%rsi),%rbx - - movq -8(%rsi),%rbp - - leaq (%rsi),%rsp - -L$point_doubleq_epilogue: - .byte 0xf3,0xc3 - - -.globl _GFp_nistz256_point_add -.private_extern _GFp_nistz256_point_add - -.p2align 5 -_GFp_nistz256_point_add: - - leaq _GFp_ia32cap_P(%rip),%rcx - movq 8(%rcx),%rcx - andl $0x80100,%ecx - cmpl $0x80100,%ecx - je L$point_addx - pushq %rbp - - pushq %rbx - - pushq %r12 - - pushq %r13 - - pushq %r14 - - pushq %r15 - - subq $576+8,%rsp - -L$point_addq_body: - - movdqu 0(%rsi),%xmm0 - movdqu 16(%rsi),%xmm1 - movdqu 32(%rsi),%xmm2 - movdqu 48(%rsi),%xmm3 - movdqu 64(%rsi),%xmm4 - movdqu 80(%rsi),%xmm5 - movq %rsi,%rbx - movq %rdx,%rsi - movdqa %xmm0,384(%rsp) - movdqa %xmm1,384+16(%rsp) - movdqa %xmm2,416(%rsp) - movdqa %xmm3,416+16(%rsp) - movdqa %xmm4,448(%rsp) - movdqa %xmm5,448+16(%rsp) - por %xmm4,%xmm5 - - movdqu 0(%rsi),%xmm0 - pshufd $0xb1,%xmm5,%xmm3 - movdqu 16(%rsi),%xmm1 - movdqu 32(%rsi),%xmm2 - por %xmm3,%xmm5 - movdqu 48(%rsi),%xmm3 - movq 64+0(%rsi),%rax - movq 64+8(%rsi),%r14 - movq 64+16(%rsi),%r15 - movq 64+24(%rsi),%r8 - movdqa %xmm0,480(%rsp) - pshufd $0x1e,%xmm5,%xmm4 - movdqa %xmm1,480+16(%rsp) - movdqu 64(%rsi),%xmm0 - movdqu 80(%rsi),%xmm1 - movdqa %xmm2,512(%rsp) - movdqa %xmm3,512+16(%rsp) - por %xmm4,%xmm5 - pxor %xmm4,%xmm4 - por %xmm0,%xmm1 -.byte 102,72,15,110,199 - - leaq 64-0(%rsi),%rsi - movq %rax,544+0(%rsp) - movq %r14,544+8(%rsp) - movq %r15,544+16(%rsp) - movq %r8,544+24(%rsp) - leaq 96(%rsp),%rdi - call __ecp_nistz256_sqr_montq - - pcmpeqd %xmm4,%xmm5 - pshufd $0xb1,%xmm1,%xmm4 - por %xmm1,%xmm4 - pshufd $0,%xmm5,%xmm5 - pshufd $0x1e,%xmm4,%xmm3 - por %xmm3,%xmm4 - pxor %xmm3,%xmm3 - pcmpeqd %xmm3,%xmm4 - pshufd $0,%xmm4,%xmm4 - movq 64+0(%rbx),%rax - movq 64+8(%rbx),%r14 - movq 64+16(%rbx),%r15 - movq 64+24(%rbx),%r8 -.byte 102,72,15,110,203 - - leaq 64-0(%rbx),%rsi - leaq 32(%rsp),%rdi - call __ecp_nistz256_sqr_montq - - movq 544(%rsp),%rax - leaq 544(%rsp),%rbx - movq 0+96(%rsp),%r9 - movq 8+96(%rsp),%r10 - leaq 0+96(%rsp),%rsi - movq 16+96(%rsp),%r11 - movq 24+96(%rsp),%r12 - leaq 224(%rsp),%rdi - call __ecp_nistz256_mul_montq - - movq 448(%rsp),%rax - leaq 448(%rsp),%rbx - movq 0+32(%rsp),%r9 - movq 8+32(%rsp),%r10 - leaq 0+32(%rsp),%rsi - movq 16+32(%rsp),%r11 - movq 24+32(%rsp),%r12 - leaq 256(%rsp),%rdi - call __ecp_nistz256_mul_montq - - movq 416(%rsp),%rax - leaq 416(%rsp),%rbx - movq 0+224(%rsp),%r9 - movq 8+224(%rsp),%r10 - leaq 0+224(%rsp),%rsi - movq 16+224(%rsp),%r11 - movq 24+224(%rsp),%r12 - leaq 224(%rsp),%rdi - call __ecp_nistz256_mul_montq - - movq 512(%rsp),%rax - leaq 512(%rsp),%rbx - movq 0+256(%rsp),%r9 - movq 8+256(%rsp),%r10 - leaq 0+256(%rsp),%rsi - movq 16+256(%rsp),%r11 - movq 24+256(%rsp),%r12 - leaq 256(%rsp),%rdi - call __ecp_nistz256_mul_montq - - leaq 224(%rsp),%rbx - leaq 64(%rsp),%rdi - call __ecp_nistz256_sub_fromq - - orq %r13,%r12 - movdqa %xmm4,%xmm2 - orq %r8,%r12 - orq %r9,%r12 - por %xmm5,%xmm2 -.byte 102,73,15,110,220 - - movq 384(%rsp),%rax - leaq 384(%rsp),%rbx - movq 0+96(%rsp),%r9 - movq 8+96(%rsp),%r10 - leaq 0+96(%rsp),%rsi - movq 16+96(%rsp),%r11 - movq 24+96(%rsp),%r12 - leaq 160(%rsp),%rdi - call __ecp_nistz256_mul_montq - - movq 480(%rsp),%rax - leaq 480(%rsp),%rbx - movq 0+32(%rsp),%r9 - movq 8+32(%rsp),%r10 - leaq 0+32(%rsp),%rsi - movq 16+32(%rsp),%r11 - movq 24+32(%rsp),%r12 - leaq 192(%rsp),%rdi - call __ecp_nistz256_mul_montq - - leaq 160(%rsp),%rbx - leaq 0(%rsp),%rdi - call __ecp_nistz256_sub_fromq - - orq %r13,%r12 - orq %r8,%r12 - orq %r9,%r12 - -.byte 102,73,15,126,208 -.byte 102,73,15,126,217 - orq %r8,%r12 -.byte 0x3e - jnz L$add_proceedq - - - - testq %r9,%r9 - jz L$add_doubleq - - - - - - -.byte 102,72,15,126,199 - pxor %xmm0,%xmm0 - movdqu %xmm0,0(%rdi) - movdqu %xmm0,16(%rdi) - movdqu %xmm0,32(%rdi) - movdqu %xmm0,48(%rdi) - movdqu %xmm0,64(%rdi) - movdqu %xmm0,80(%rdi) - jmp L$add_doneq - -.p2align 5 -L$add_doubleq: -.byte 102,72,15,126,206 -.byte 102,72,15,126,199 - addq $416,%rsp - - jmp L$point_double_shortcutq - - -.p2align 5 -L$add_proceedq: - movq 0+64(%rsp),%rax - movq 8+64(%rsp),%r14 - leaq 0+64(%rsp),%rsi - movq 16+64(%rsp),%r15 - movq 24+64(%rsp),%r8 - leaq 96(%rsp),%rdi - call __ecp_nistz256_sqr_montq - - movq 448(%rsp),%rax - leaq 448(%rsp),%rbx - movq 0+0(%rsp),%r9 - movq 8+0(%rsp),%r10 - leaq 0+0(%rsp),%rsi - movq 16+0(%rsp),%r11 - movq 24+0(%rsp),%r12 - leaq 352(%rsp),%rdi - call __ecp_nistz256_mul_montq - - movq 0+0(%rsp),%rax - movq 8+0(%rsp),%r14 - leaq 0+0(%rsp),%rsi - movq 16+0(%rsp),%r15 - movq 24+0(%rsp),%r8 - leaq 32(%rsp),%rdi - call __ecp_nistz256_sqr_montq - - movq 544(%rsp),%rax - leaq 544(%rsp),%rbx - movq 0+352(%rsp),%r9 - movq 8+352(%rsp),%r10 - leaq 0+352(%rsp),%rsi - movq 16+352(%rsp),%r11 - movq 24+352(%rsp),%r12 - leaq 352(%rsp),%rdi - call __ecp_nistz256_mul_montq - - movq 0(%rsp),%rax - leaq 0(%rsp),%rbx - movq 0+32(%rsp),%r9 - movq 8+32(%rsp),%r10 - leaq 0+32(%rsp),%rsi - movq 16+32(%rsp),%r11 - movq 24+32(%rsp),%r12 - leaq 128(%rsp),%rdi - call __ecp_nistz256_mul_montq - - movq 160(%rsp),%rax - leaq 160(%rsp),%rbx - movq 0+32(%rsp),%r9 - movq 8+32(%rsp),%r10 - leaq 0+32(%rsp),%rsi - movq 16+32(%rsp),%r11 - movq 24+32(%rsp),%r12 - leaq 192(%rsp),%rdi - call __ecp_nistz256_mul_montq - - - - - xorq %r11,%r11 - addq %r12,%r12 - leaq 96(%rsp),%rsi - adcq %r13,%r13 - movq %r12,%rax - adcq %r8,%r8 - adcq %r9,%r9 - movq %r13,%rbp - adcq $0,%r11 - - subq $-1,%r12 - movq %r8,%rcx - sbbq %r14,%r13 - sbbq $0,%r8 - movq %r9,%r10 - sbbq %r15,%r9 - sbbq $0,%r11 - - cmovcq %rax,%r12 - movq 0(%rsi),%rax - cmovcq %rbp,%r13 - movq 8(%rsi),%rbp - cmovcq %rcx,%r8 - movq 16(%rsi),%rcx - cmovcq %r10,%r9 - movq 24(%rsi),%r10 - - call __ecp_nistz256_subq - - leaq 128(%rsp),%rbx - leaq 288(%rsp),%rdi - call __ecp_nistz256_sub_fromq - - movq 192+0(%rsp),%rax - movq 192+8(%rsp),%rbp - movq 192+16(%rsp),%rcx - movq 192+24(%rsp),%r10 - leaq 320(%rsp),%rdi - - call __ecp_nistz256_subq - - movq %r12,0(%rdi) - movq %r13,8(%rdi) - movq %r8,16(%rdi) - movq %r9,24(%rdi) - movq 128(%rsp),%rax - leaq 128(%rsp),%rbx - movq 0+224(%rsp),%r9 - movq 8+224(%rsp),%r10 - leaq 0+224(%rsp),%rsi - movq 16+224(%rsp),%r11 - movq 24+224(%rsp),%r12 - leaq 256(%rsp),%rdi - call __ecp_nistz256_mul_montq - - movq 320(%rsp),%rax - leaq 320(%rsp),%rbx - movq 0+64(%rsp),%r9 - movq 8+64(%rsp),%r10 - leaq 0+64(%rsp),%rsi - movq 16+64(%rsp),%r11 - movq 24+64(%rsp),%r12 - leaq 320(%rsp),%rdi - call __ecp_nistz256_mul_montq - - leaq 256(%rsp),%rbx - leaq 320(%rsp),%rdi - call __ecp_nistz256_sub_fromq - -.byte 102,72,15,126,199 - - movdqa %xmm5,%xmm0 - movdqa %xmm5,%xmm1 - pandn 352(%rsp),%xmm0 - movdqa %xmm5,%xmm2 - pandn 352+16(%rsp),%xmm1 - movdqa %xmm5,%xmm3 - pand 544(%rsp),%xmm2 - pand 544+16(%rsp),%xmm3 - por %xmm0,%xmm2 - por %xmm1,%xmm3 - - movdqa %xmm4,%xmm0 - movdqa %xmm4,%xmm1 - pandn %xmm2,%xmm0 - movdqa %xmm4,%xmm2 - pandn %xmm3,%xmm1 - movdqa %xmm4,%xmm3 - pand 448(%rsp),%xmm2 - pand 448+16(%rsp),%xmm3 - por %xmm0,%xmm2 - por %xmm1,%xmm3 - movdqu %xmm2,64(%rdi) - movdqu %xmm3,80(%rdi) - - movdqa %xmm5,%xmm0 - movdqa %xmm5,%xmm1 - pandn 288(%rsp),%xmm0 - movdqa %xmm5,%xmm2 - pandn 288+16(%rsp),%xmm1 - movdqa %xmm5,%xmm3 - pand 480(%rsp),%xmm2 - pand 480+16(%rsp),%xmm3 - por %xmm0,%xmm2 - por %xmm1,%xmm3 - - movdqa %xmm4,%xmm0 - movdqa %xmm4,%xmm1 - pandn %xmm2,%xmm0 - movdqa %xmm4,%xmm2 - pandn %xmm3,%xmm1 - movdqa %xmm4,%xmm3 - pand 384(%rsp),%xmm2 - pand 384+16(%rsp),%xmm3 - por %xmm0,%xmm2 - por %xmm1,%xmm3 - movdqu %xmm2,0(%rdi) - movdqu %xmm3,16(%rdi) - - movdqa %xmm5,%xmm0 - movdqa %xmm5,%xmm1 - pandn 320(%rsp),%xmm0 - movdqa %xmm5,%xmm2 - pandn 320+16(%rsp),%xmm1 - movdqa %xmm5,%xmm3 - pand 512(%rsp),%xmm2 - pand 512+16(%rsp),%xmm3 - por %xmm0,%xmm2 - por %xmm1,%xmm3 - - movdqa %xmm4,%xmm0 - movdqa %xmm4,%xmm1 - pandn %xmm2,%xmm0 - movdqa %xmm4,%xmm2 - pandn %xmm3,%xmm1 - movdqa %xmm4,%xmm3 - pand 416(%rsp),%xmm2 - pand 416+16(%rsp),%xmm3 - por %xmm0,%xmm2 - por %xmm1,%xmm3 - movdqu %xmm2,32(%rdi) - movdqu %xmm3,48(%rdi) - -L$add_doneq: - leaq 576+56(%rsp),%rsi - - movq -48(%rsi),%r15 - - movq -40(%rsi),%r14 - - movq -32(%rsi),%r13 - - movq -24(%rsi),%r12 - - movq -16(%rsi),%rbx - - movq -8(%rsi),%rbp - - leaq (%rsi),%rsp - -L$point_addq_epilogue: - .byte 0xf3,0xc3 - - -.globl _GFp_nistz256_point_add_affine -.private_extern _GFp_nistz256_point_add_affine - -.p2align 5 -_GFp_nistz256_point_add_affine: - - leaq _GFp_ia32cap_P(%rip),%rcx - movq 8(%rcx),%rcx - andl $0x80100,%ecx - cmpl $0x80100,%ecx - je L$point_add_affinex - pushq %rbp - - pushq %rbx - - pushq %r12 - - pushq %r13 - - pushq %r14 - - pushq %r15 - - subq $480+8,%rsp - -L$add_affineq_body: - - movdqu 0(%rsi),%xmm0 - movq %rdx,%rbx - movdqu 16(%rsi),%xmm1 - movdqu 32(%rsi),%xmm2 - movdqu 48(%rsi),%xmm3 - movdqu 64(%rsi),%xmm4 - movdqu 80(%rsi),%xmm5 - movq 64+0(%rsi),%rax - movq 64+8(%rsi),%r14 - movq 64+16(%rsi),%r15 - movq 64+24(%rsi),%r8 - movdqa %xmm0,320(%rsp) - movdqa %xmm1,320+16(%rsp) - movdqa %xmm2,352(%rsp) - movdqa %xmm3,352+16(%rsp) - movdqa %xmm4,384(%rsp) - movdqa %xmm5,384+16(%rsp) - por %xmm4,%xmm5 - - movdqu 0(%rbx),%xmm0 - pshufd $0xb1,%xmm5,%xmm3 - movdqu 16(%rbx),%xmm1 - movdqu 32(%rbx),%xmm2 - por %xmm3,%xmm5 - movdqu 48(%rbx),%xmm3 - movdqa %xmm0,416(%rsp) - pshufd $0x1e,%xmm5,%xmm4 - movdqa %xmm1,416+16(%rsp) - por %xmm0,%xmm1 -.byte 102,72,15,110,199 - movdqa %xmm2,448(%rsp) - movdqa %xmm3,448+16(%rsp) - por %xmm2,%xmm3 - por %xmm4,%xmm5 - pxor %xmm4,%xmm4 - por %xmm1,%xmm3 - - leaq 64-0(%rsi),%rsi - leaq 32(%rsp),%rdi - call __ecp_nistz256_sqr_montq - - pcmpeqd %xmm4,%xmm5 - pshufd $0xb1,%xmm3,%xmm4 - movq 0(%rbx),%rax - - movq %r12,%r9 - por %xmm3,%xmm4 - pshufd $0,%xmm5,%xmm5 - pshufd $0x1e,%xmm4,%xmm3 - movq %r13,%r10 - por %xmm3,%xmm4 - pxor %xmm3,%xmm3 - movq %r14,%r11 - pcmpeqd %xmm3,%xmm4 - pshufd $0,%xmm4,%xmm4 - - leaq 32-0(%rsp),%rsi - movq %r15,%r12 - leaq 0(%rsp),%rdi - call __ecp_nistz256_mul_montq - - leaq 320(%rsp),%rbx - leaq 64(%rsp),%rdi - call __ecp_nistz256_sub_fromq - - movq 384(%rsp),%rax - leaq 384(%rsp),%rbx - movq 0+32(%rsp),%r9 - movq 8+32(%rsp),%r10 - leaq 0+32(%rsp),%rsi - movq 16+32(%rsp),%r11 - movq 24+32(%rsp),%r12 - leaq 32(%rsp),%rdi - call __ecp_nistz256_mul_montq - - movq 384(%rsp),%rax - leaq 384(%rsp),%rbx - movq 0+64(%rsp),%r9 - movq 8+64(%rsp),%r10 - leaq 0+64(%rsp),%rsi - movq 16+64(%rsp),%r11 - movq 24+64(%rsp),%r12 - leaq 288(%rsp),%rdi - call __ecp_nistz256_mul_montq - - movq 448(%rsp),%rax - leaq 448(%rsp),%rbx - movq 0+32(%rsp),%r9 - movq 8+32(%rsp),%r10 - leaq 0+32(%rsp),%rsi - movq 16+32(%rsp),%r11 - movq 24+32(%rsp),%r12 - leaq 32(%rsp),%rdi - call __ecp_nistz256_mul_montq - - leaq 352(%rsp),%rbx - leaq 96(%rsp),%rdi - call __ecp_nistz256_sub_fromq - - movq 0+64(%rsp),%rax - movq 8+64(%rsp),%r14 - leaq 0+64(%rsp),%rsi - movq 16+64(%rsp),%r15 - movq 24+64(%rsp),%r8 - leaq 128(%rsp),%rdi - call __ecp_nistz256_sqr_montq - - movq 0+96(%rsp),%rax - movq 8+96(%rsp),%r14 - leaq 0+96(%rsp),%rsi - movq 16+96(%rsp),%r15 - movq 24+96(%rsp),%r8 - leaq 192(%rsp),%rdi - call __ecp_nistz256_sqr_montq - - movq 128(%rsp),%rax - leaq 128(%rsp),%rbx - movq 0+64(%rsp),%r9 - movq 8+64(%rsp),%r10 - leaq 0+64(%rsp),%rsi - movq 16+64(%rsp),%r11 - movq 24+64(%rsp),%r12 - leaq 160(%rsp),%rdi - call __ecp_nistz256_mul_montq - - movq 320(%rsp),%rax - leaq 320(%rsp),%rbx - movq 0+128(%rsp),%r9 - movq 8+128(%rsp),%r10 - leaq 0+128(%rsp),%rsi - movq 16+128(%rsp),%r11 - movq 24+128(%rsp),%r12 - leaq 0(%rsp),%rdi - call __ecp_nistz256_mul_montq - - - - - xorq %r11,%r11 - addq %r12,%r12 - leaq 192(%rsp),%rsi - adcq %r13,%r13 - movq %r12,%rax - adcq %r8,%r8 - adcq %r9,%r9 - movq %r13,%rbp - adcq $0,%r11 - - subq $-1,%r12 - movq %r8,%rcx - sbbq %r14,%r13 - sbbq $0,%r8 - movq %r9,%r10 - sbbq %r15,%r9 - sbbq $0,%r11 - - cmovcq %rax,%r12 - movq 0(%rsi),%rax - cmovcq %rbp,%r13 - movq 8(%rsi),%rbp - cmovcq %rcx,%r8 - movq 16(%rsi),%rcx - cmovcq %r10,%r9 - movq 24(%rsi),%r10 - - call __ecp_nistz256_subq - - leaq 160(%rsp),%rbx - leaq 224(%rsp),%rdi - call __ecp_nistz256_sub_fromq - - movq 0+0(%rsp),%rax - movq 0+8(%rsp),%rbp - movq 0+16(%rsp),%rcx - movq 0+24(%rsp),%r10 - leaq 64(%rsp),%rdi - - call __ecp_nistz256_subq - - movq %r12,0(%rdi) - movq %r13,8(%rdi) - movq %r8,16(%rdi) - movq %r9,24(%rdi) - movq 352(%rsp),%rax - leaq 352(%rsp),%rbx - movq 0+160(%rsp),%r9 - movq 8+160(%rsp),%r10 - leaq 0+160(%rsp),%rsi - movq 16+160(%rsp),%r11 - movq 24+160(%rsp),%r12 - leaq 32(%rsp),%rdi - call __ecp_nistz256_mul_montq - - movq 96(%rsp),%rax - leaq 96(%rsp),%rbx - movq 0+64(%rsp),%r9 - movq 8+64(%rsp),%r10 - leaq 0+64(%rsp),%rsi - movq 16+64(%rsp),%r11 - movq 24+64(%rsp),%r12 - leaq 64(%rsp),%rdi - call __ecp_nistz256_mul_montq - - leaq 32(%rsp),%rbx - leaq 256(%rsp),%rdi - call __ecp_nistz256_sub_fromq - -.byte 102,72,15,126,199 - - movdqa %xmm5,%xmm0 - movdqa %xmm5,%xmm1 - pandn 288(%rsp),%xmm0 - movdqa %xmm5,%xmm2 - pandn 288+16(%rsp),%xmm1 - movdqa %xmm5,%xmm3 - pand L$ONE_mont(%rip),%xmm2 - pand L$ONE_mont+16(%rip),%xmm3 - por %xmm0,%xmm2 - por %xmm1,%xmm3 - - movdqa %xmm4,%xmm0 - movdqa %xmm4,%xmm1 - pandn %xmm2,%xmm0 - movdqa %xmm4,%xmm2 - pandn %xmm3,%xmm1 - movdqa %xmm4,%xmm3 - pand 384(%rsp),%xmm2 - pand 384+16(%rsp),%xmm3 - por %xmm0,%xmm2 - por %xmm1,%xmm3 - movdqu %xmm2,64(%rdi) - movdqu %xmm3,80(%rdi) - - movdqa %xmm5,%xmm0 - movdqa %xmm5,%xmm1 - pandn 224(%rsp),%xmm0 - movdqa %xmm5,%xmm2 - pandn 224+16(%rsp),%xmm1 - movdqa %xmm5,%xmm3 - pand 416(%rsp),%xmm2 - pand 416+16(%rsp),%xmm3 - por %xmm0,%xmm2 - por %xmm1,%xmm3 - - movdqa %xmm4,%xmm0 - movdqa %xmm4,%xmm1 - pandn %xmm2,%xmm0 - movdqa %xmm4,%xmm2 - pandn %xmm3,%xmm1 - movdqa %xmm4,%xmm3 - pand 320(%rsp),%xmm2 - pand 320+16(%rsp),%xmm3 - por %xmm0,%xmm2 - por %xmm1,%xmm3 - movdqu %xmm2,0(%rdi) - movdqu %xmm3,16(%rdi) - - movdqa %xmm5,%xmm0 - movdqa %xmm5,%xmm1 - pandn 256(%rsp),%xmm0 - movdqa %xmm5,%xmm2 - pandn 256+16(%rsp),%xmm1 - movdqa %xmm5,%xmm3 - pand 448(%rsp),%xmm2 - pand 448+16(%rsp),%xmm3 - por %xmm0,%xmm2 - por %xmm1,%xmm3 - - movdqa %xmm4,%xmm0 - movdqa %xmm4,%xmm1 - pandn %xmm2,%xmm0 - movdqa %xmm4,%xmm2 - pandn %xmm3,%xmm1 - movdqa %xmm4,%xmm3 - pand 352(%rsp),%xmm2 - pand 352+16(%rsp),%xmm3 - por %xmm0,%xmm2 - por %xmm1,%xmm3 - movdqu %xmm2,32(%rdi) - movdqu %xmm3,48(%rdi) - - leaq 480+56(%rsp),%rsi - - movq -48(%rsi),%r15 - - movq -40(%rsi),%r14 - - movq -32(%rsi),%r13 - - movq -24(%rsi),%r12 - - movq -16(%rsi),%rbx - - movq -8(%rsi),%rbp - - leaq (%rsi),%rsp - -L$add_affineq_epilogue: - .byte 0xf3,0xc3 - - - -.p2align 5 -__ecp_nistz256_add_tox: - - xorq %r11,%r11 - adcq 0(%rbx),%r12 - adcq 8(%rbx),%r13 - movq %r12,%rax - adcq 16(%rbx),%r8 - adcq 24(%rbx),%r9 - movq %r13,%rbp - adcq $0,%r11 - - xorq %r10,%r10 - sbbq $-1,%r12 - movq %r8,%rcx - sbbq %r14,%r13 - sbbq $0,%r8 - movq %r9,%r10 - sbbq %r15,%r9 - sbbq $0,%r11 - - cmovcq %rax,%r12 - cmovcq %rbp,%r13 - movq %r12,0(%rdi) - cmovcq %rcx,%r8 - movq %r13,8(%rdi) - cmovcq %r10,%r9 - movq %r8,16(%rdi) - movq %r9,24(%rdi) - - .byte 0xf3,0xc3 - - - - -.p2align 5 -__ecp_nistz256_sub_fromx: - - xorq %r11,%r11 - sbbq 0(%rbx),%r12 - sbbq 8(%rbx),%r13 - movq %r12,%rax - sbbq 16(%rbx),%r8 - sbbq 24(%rbx),%r9 - movq %r13,%rbp - sbbq $0,%r11 - - xorq %r10,%r10 - adcq $-1,%r12 - movq %r8,%rcx - adcq %r14,%r13 - adcq $0,%r8 - movq %r9,%r10 - adcq %r15,%r9 - - btq $0,%r11 - cmovncq %rax,%r12 - cmovncq %rbp,%r13 - movq %r12,0(%rdi) - cmovncq %rcx,%r8 - movq %r13,8(%rdi) - cmovncq %r10,%r9 - movq %r8,16(%rdi) - movq %r9,24(%rdi) - - .byte 0xf3,0xc3 - - - - -.p2align 5 -__ecp_nistz256_subx: - - xorq %r11,%r11 - sbbq %r12,%rax - sbbq %r13,%rbp - movq %rax,%r12 - sbbq %r8,%rcx - sbbq %r9,%r10 - movq %rbp,%r13 - sbbq $0,%r11 - - xorq %r9,%r9 - adcq $-1,%rax - movq %rcx,%r8 - adcq %r14,%rbp - adcq $0,%rcx - movq %r10,%r9 - adcq %r15,%r10 - - btq $0,%r11 - cmovcq %rax,%r12 - cmovcq %rbp,%r13 - cmovcq %rcx,%r8 - cmovcq %r10,%r9 - - .byte 0xf3,0xc3 - - - - -.p2align 5 -__ecp_nistz256_mul_by_2x: - - xorq %r11,%r11 - adcq %r12,%r12 - adcq %r13,%r13 - movq %r12,%rax - adcq %r8,%r8 - adcq %r9,%r9 - movq %r13,%rbp - adcq $0,%r11 - - xorq %r10,%r10 - sbbq $-1,%r12 - movq %r8,%rcx - sbbq %r14,%r13 - sbbq $0,%r8 - movq %r9,%r10 - sbbq %r15,%r9 - sbbq $0,%r11 - - cmovcq %rax,%r12 - cmovcq %rbp,%r13 - movq %r12,0(%rdi) - cmovcq %rcx,%r8 - movq %r13,8(%rdi) - cmovcq %r10,%r9 - movq %r8,16(%rdi) - movq %r9,24(%rdi) - - .byte 0xf3,0xc3 - - - -.p2align 5 -GFp_nistz256_point_doublex: - -L$point_doublex: - pushq %rbp - - pushq %rbx - - pushq %r12 - - pushq %r13 - - pushq %r14 - - pushq %r15 - - subq $160+8,%rsp - -L$point_doublex_body: - -L$point_double_shortcutx: - movdqu 0(%rsi),%xmm0 - movq %rsi,%rbx - movdqu 16(%rsi),%xmm1 - movq 32+0(%rsi),%r12 - movq 32+8(%rsi),%r13 - movq 32+16(%rsi),%r8 - movq 32+24(%rsi),%r9 - movq L$poly+8(%rip),%r14 - movq L$poly+24(%rip),%r15 - movdqa %xmm0,96(%rsp) - movdqa %xmm1,96+16(%rsp) - leaq 32(%rdi),%r10 - leaq 64(%rdi),%r11 -.byte 102,72,15,110,199 -.byte 102,73,15,110,202 -.byte 102,73,15,110,211 - - leaq 0(%rsp),%rdi - call __ecp_nistz256_mul_by_2x - - movq 64+0(%rsi),%rdx - movq 64+8(%rsi),%r14 - movq 64+16(%rsi),%r15 - movq 64+24(%rsi),%r8 - leaq 64-128(%rsi),%rsi - leaq 64(%rsp),%rdi - call __ecp_nistz256_sqr_montx - - movq 0+0(%rsp),%rdx - movq 8+0(%rsp),%r14 - leaq -128+0(%rsp),%rsi - movq 16+0(%rsp),%r15 - movq 24+0(%rsp),%r8 - leaq 0(%rsp),%rdi - call __ecp_nistz256_sqr_montx - - movq 32(%rbx),%rdx - movq 64+0(%rbx),%r9 - movq 64+8(%rbx),%r10 - movq 64+16(%rbx),%r11 - movq 64+24(%rbx),%r12 - leaq 64-128(%rbx),%rsi - leaq 32(%rbx),%rbx -.byte 102,72,15,126,215 - call __ecp_nistz256_mul_montx - call __ecp_nistz256_mul_by_2x - - movq 96+0(%rsp),%r12 - movq 96+8(%rsp),%r13 - leaq 64(%rsp),%rbx - movq 96+16(%rsp),%r8 - movq 96+24(%rsp),%r9 - leaq 32(%rsp),%rdi - call __ecp_nistz256_add_tox - - movq 96+0(%rsp),%r12 - movq 96+8(%rsp),%r13 - leaq 64(%rsp),%rbx - movq 96+16(%rsp),%r8 - movq 96+24(%rsp),%r9 - leaq 64(%rsp),%rdi - call __ecp_nistz256_sub_fromx - - movq 0+0(%rsp),%rdx - movq 8+0(%rsp),%r14 - leaq -128+0(%rsp),%rsi - movq 16+0(%rsp),%r15 - movq 24+0(%rsp),%r8 -.byte 102,72,15,126,207 - call __ecp_nistz256_sqr_montx - xorq %r9,%r9 - movq %r12,%rax - addq $-1,%r12 - movq %r13,%r10 - adcq %rsi,%r13 - movq %r14,%rcx - adcq $0,%r14 - movq %r15,%r8 - adcq %rbp,%r15 - adcq $0,%r9 - xorq %rsi,%rsi - testq $1,%rax - - cmovzq %rax,%r12 - cmovzq %r10,%r13 - cmovzq %rcx,%r14 - cmovzq %r8,%r15 - cmovzq %rsi,%r9 - - movq %r13,%rax - shrq $1,%r12 - shlq $63,%rax - movq %r14,%r10 - shrq $1,%r13 - orq %rax,%r12 - shlq $63,%r10 - movq %r15,%rcx - shrq $1,%r14 - orq %r10,%r13 - shlq $63,%rcx - movq %r12,0(%rdi) - shrq $1,%r15 - movq %r13,8(%rdi) - shlq $63,%r9 - orq %rcx,%r14 - orq %r9,%r15 - movq %r14,16(%rdi) - movq %r15,24(%rdi) - movq 64(%rsp),%rdx - leaq 64(%rsp),%rbx - movq 0+32(%rsp),%r9 - movq 8+32(%rsp),%r10 - leaq -128+32(%rsp),%rsi - movq 16+32(%rsp),%r11 - movq 24+32(%rsp),%r12 - leaq 32(%rsp),%rdi - call __ecp_nistz256_mul_montx - - leaq 128(%rsp),%rdi - call __ecp_nistz256_mul_by_2x - - leaq 32(%rsp),%rbx - leaq 32(%rsp),%rdi - call __ecp_nistz256_add_tox - - movq 96(%rsp),%rdx - leaq 96(%rsp),%rbx - movq 0+0(%rsp),%r9 - movq 8+0(%rsp),%r10 - leaq -128+0(%rsp),%rsi - movq 16+0(%rsp),%r11 - movq 24+0(%rsp),%r12 - leaq 0(%rsp),%rdi - call __ecp_nistz256_mul_montx - - leaq 128(%rsp),%rdi - call __ecp_nistz256_mul_by_2x - - movq 0+32(%rsp),%rdx - movq 8+32(%rsp),%r14 - leaq -128+32(%rsp),%rsi - movq 16+32(%rsp),%r15 - movq 24+32(%rsp),%r8 -.byte 102,72,15,126,199 - call __ecp_nistz256_sqr_montx - - leaq 128(%rsp),%rbx - movq %r14,%r8 - movq %r15,%r9 - movq %rsi,%r14 - movq %rbp,%r15 - call __ecp_nistz256_sub_fromx - - movq 0+0(%rsp),%rax - movq 0+8(%rsp),%rbp - movq 0+16(%rsp),%rcx - movq 0+24(%rsp),%r10 - leaq 0(%rsp),%rdi - call __ecp_nistz256_subx - - movq 32(%rsp),%rdx - leaq 32(%rsp),%rbx - movq %r12,%r14 - xorl %ecx,%ecx - movq %r12,0+0(%rsp) - movq %r13,%r10 - movq %r13,0+8(%rsp) - cmovzq %r8,%r11 - movq %r8,0+16(%rsp) - leaq 0-128(%rsp),%rsi - cmovzq %r9,%r12 - movq %r9,0+24(%rsp) - movq %r14,%r9 - leaq 0(%rsp),%rdi - call __ecp_nistz256_mul_montx - -.byte 102,72,15,126,203 -.byte 102,72,15,126,207 - call __ecp_nistz256_sub_fromx - - leaq 160+56(%rsp),%rsi - - movq -48(%rsi),%r15 - - movq -40(%rsi),%r14 - - movq -32(%rsi),%r13 - - movq -24(%rsi),%r12 - - movq -16(%rsi),%rbx - - movq -8(%rsi),%rbp - - leaq (%rsi),%rsp - -L$point_doublex_epilogue: - .byte 0xf3,0xc3 - - - -.p2align 5 -GFp_nistz256_point_addx: - -L$point_addx: - pushq %rbp - - pushq %rbx - - pushq %r12 - - pushq %r13 - - pushq %r14 - - pushq %r15 - - subq $576+8,%rsp - -L$point_addx_body: - - movdqu 0(%rsi),%xmm0 - movdqu 16(%rsi),%xmm1 - movdqu 32(%rsi),%xmm2 - movdqu 48(%rsi),%xmm3 - movdqu 64(%rsi),%xmm4 - movdqu 80(%rsi),%xmm5 - movq %rsi,%rbx - movq %rdx,%rsi - movdqa %xmm0,384(%rsp) - movdqa %xmm1,384+16(%rsp) - movdqa %xmm2,416(%rsp) - movdqa %xmm3,416+16(%rsp) - movdqa %xmm4,448(%rsp) - movdqa %xmm5,448+16(%rsp) - por %xmm4,%xmm5 - - movdqu 0(%rsi),%xmm0 - pshufd $0xb1,%xmm5,%xmm3 - movdqu 16(%rsi),%xmm1 - movdqu 32(%rsi),%xmm2 - por %xmm3,%xmm5 - movdqu 48(%rsi),%xmm3 - movq 64+0(%rsi),%rdx - movq 64+8(%rsi),%r14 - movq 64+16(%rsi),%r15 - movq 64+24(%rsi),%r8 - movdqa %xmm0,480(%rsp) - pshufd $0x1e,%xmm5,%xmm4 - movdqa %xmm1,480+16(%rsp) - movdqu 64(%rsi),%xmm0 - movdqu 80(%rsi),%xmm1 - movdqa %xmm2,512(%rsp) - movdqa %xmm3,512+16(%rsp) - por %xmm4,%xmm5 - pxor %xmm4,%xmm4 - por %xmm0,%xmm1 -.byte 102,72,15,110,199 - - leaq 64-128(%rsi),%rsi - movq %rdx,544+0(%rsp) - movq %r14,544+8(%rsp) - movq %r15,544+16(%rsp) - movq %r8,544+24(%rsp) - leaq 96(%rsp),%rdi - call __ecp_nistz256_sqr_montx - - pcmpeqd %xmm4,%xmm5 - pshufd $0xb1,%xmm1,%xmm4 - por %xmm1,%xmm4 - pshufd $0,%xmm5,%xmm5 - pshufd $0x1e,%xmm4,%xmm3 - por %xmm3,%xmm4 - pxor %xmm3,%xmm3 - pcmpeqd %xmm3,%xmm4 - pshufd $0,%xmm4,%xmm4 - movq 64+0(%rbx),%rdx - movq 64+8(%rbx),%r14 - movq 64+16(%rbx),%r15 - movq 64+24(%rbx),%r8 -.byte 102,72,15,110,203 - - leaq 64-128(%rbx),%rsi - leaq 32(%rsp),%rdi - call __ecp_nistz256_sqr_montx - - movq 544(%rsp),%rdx - leaq 544(%rsp),%rbx - movq 0+96(%rsp),%r9 - movq 8+96(%rsp),%r10 - leaq -128+96(%rsp),%rsi - movq 16+96(%rsp),%r11 - movq 24+96(%rsp),%r12 - leaq 224(%rsp),%rdi - call __ecp_nistz256_mul_montx - - movq 448(%rsp),%rdx - leaq 448(%rsp),%rbx - movq 0+32(%rsp),%r9 - movq 8+32(%rsp),%r10 - leaq -128+32(%rsp),%rsi - movq 16+32(%rsp),%r11 - movq 24+32(%rsp),%r12 - leaq 256(%rsp),%rdi - call __ecp_nistz256_mul_montx - - movq 416(%rsp),%rdx - leaq 416(%rsp),%rbx - movq 0+224(%rsp),%r9 - movq 8+224(%rsp),%r10 - leaq -128+224(%rsp),%rsi - movq 16+224(%rsp),%r11 - movq 24+224(%rsp),%r12 - leaq 224(%rsp),%rdi - call __ecp_nistz256_mul_montx - - movq 512(%rsp),%rdx - leaq 512(%rsp),%rbx - movq 0+256(%rsp),%r9 - movq 8+256(%rsp),%r10 - leaq -128+256(%rsp),%rsi - movq 16+256(%rsp),%r11 - movq 24+256(%rsp),%r12 - leaq 256(%rsp),%rdi - call __ecp_nistz256_mul_montx - - leaq 224(%rsp),%rbx - leaq 64(%rsp),%rdi - call __ecp_nistz256_sub_fromx - - orq %r13,%r12 - movdqa %xmm4,%xmm2 - orq %r8,%r12 - orq %r9,%r12 - por %xmm5,%xmm2 -.byte 102,73,15,110,220 - - movq 384(%rsp),%rdx - leaq 384(%rsp),%rbx - movq 0+96(%rsp),%r9 - movq 8+96(%rsp),%r10 - leaq -128+96(%rsp),%rsi - movq 16+96(%rsp),%r11 - movq 24+96(%rsp),%r12 - leaq 160(%rsp),%rdi - call __ecp_nistz256_mul_montx - - movq 480(%rsp),%rdx - leaq 480(%rsp),%rbx - movq 0+32(%rsp),%r9 - movq 8+32(%rsp),%r10 - leaq -128+32(%rsp),%rsi - movq 16+32(%rsp),%r11 - movq 24+32(%rsp),%r12 - leaq 192(%rsp),%rdi - call __ecp_nistz256_mul_montx - - leaq 160(%rsp),%rbx - leaq 0(%rsp),%rdi - call __ecp_nistz256_sub_fromx - - orq %r13,%r12 - orq %r8,%r12 - orq %r9,%r12 - -.byte 102,73,15,126,208 -.byte 102,73,15,126,217 - orq %r8,%r12 -.byte 0x3e - jnz L$add_proceedx - - - - testq %r9,%r9 - jz L$add_doublex - - - - - - -.byte 102,72,15,126,199 - pxor %xmm0,%xmm0 - movdqu %xmm0,0(%rdi) - movdqu %xmm0,16(%rdi) - movdqu %xmm0,32(%rdi) - movdqu %xmm0,48(%rdi) - movdqu %xmm0,64(%rdi) - movdqu %xmm0,80(%rdi) - jmp L$add_donex - -.p2align 5 -L$add_doublex: -.byte 102,72,15,126,206 -.byte 102,72,15,126,199 - addq $416,%rsp - - jmp L$point_double_shortcutx - - -.p2align 5 -L$add_proceedx: - movq 0+64(%rsp),%rdx - movq 8+64(%rsp),%r14 - leaq -128+64(%rsp),%rsi - movq 16+64(%rsp),%r15 - movq 24+64(%rsp),%r8 - leaq 96(%rsp),%rdi - call __ecp_nistz256_sqr_montx - - movq 448(%rsp),%rdx - leaq 448(%rsp),%rbx - movq 0+0(%rsp),%r9 - movq 8+0(%rsp),%r10 - leaq -128+0(%rsp),%rsi - movq 16+0(%rsp),%r11 - movq 24+0(%rsp),%r12 - leaq 352(%rsp),%rdi - call __ecp_nistz256_mul_montx - - movq 0+0(%rsp),%rdx - movq 8+0(%rsp),%r14 - leaq -128+0(%rsp),%rsi - movq 16+0(%rsp),%r15 - movq 24+0(%rsp),%r8 - leaq 32(%rsp),%rdi - call __ecp_nistz256_sqr_montx - - movq 544(%rsp),%rdx - leaq 544(%rsp),%rbx - movq 0+352(%rsp),%r9 - movq 8+352(%rsp),%r10 - leaq -128+352(%rsp),%rsi - movq 16+352(%rsp),%r11 - movq 24+352(%rsp),%r12 - leaq 352(%rsp),%rdi - call __ecp_nistz256_mul_montx - - movq 0(%rsp),%rdx - leaq 0(%rsp),%rbx - movq 0+32(%rsp),%r9 - movq 8+32(%rsp),%r10 - leaq -128+32(%rsp),%rsi - movq 16+32(%rsp),%r11 - movq 24+32(%rsp),%r12 - leaq 128(%rsp),%rdi - call __ecp_nistz256_mul_montx - - movq 160(%rsp),%rdx - leaq 160(%rsp),%rbx - movq 0+32(%rsp),%r9 - movq 8+32(%rsp),%r10 - leaq -128+32(%rsp),%rsi - movq 16+32(%rsp),%r11 - movq 24+32(%rsp),%r12 - leaq 192(%rsp),%rdi - call __ecp_nistz256_mul_montx - - - - - xorq %r11,%r11 - addq %r12,%r12 - leaq 96(%rsp),%rsi - adcq %r13,%r13 - movq %r12,%rax - adcq %r8,%r8 - adcq %r9,%r9 - movq %r13,%rbp - adcq $0,%r11 - - subq $-1,%r12 - movq %r8,%rcx - sbbq %r14,%r13 - sbbq $0,%r8 - movq %r9,%r10 - sbbq %r15,%r9 - sbbq $0,%r11 - - cmovcq %rax,%r12 - movq 0(%rsi),%rax - cmovcq %rbp,%r13 - movq 8(%rsi),%rbp - cmovcq %rcx,%r8 - movq 16(%rsi),%rcx - cmovcq %r10,%r9 - movq 24(%rsi),%r10 - - call __ecp_nistz256_subx - - leaq 128(%rsp),%rbx - leaq 288(%rsp),%rdi - call __ecp_nistz256_sub_fromx - - movq 192+0(%rsp),%rax - movq 192+8(%rsp),%rbp - movq 192+16(%rsp),%rcx - movq 192+24(%rsp),%r10 - leaq 320(%rsp),%rdi - - call __ecp_nistz256_subx - - movq %r12,0(%rdi) - movq %r13,8(%rdi) - movq %r8,16(%rdi) - movq %r9,24(%rdi) - movq 128(%rsp),%rdx - leaq 128(%rsp),%rbx - movq 0+224(%rsp),%r9 - movq 8+224(%rsp),%r10 - leaq -128+224(%rsp),%rsi - movq 16+224(%rsp),%r11 - movq 24+224(%rsp),%r12 - leaq 256(%rsp),%rdi - call __ecp_nistz256_mul_montx - - movq 320(%rsp),%rdx - leaq 320(%rsp),%rbx - movq 0+64(%rsp),%r9 - movq 8+64(%rsp),%r10 - leaq -128+64(%rsp),%rsi - movq 16+64(%rsp),%r11 - movq 24+64(%rsp),%r12 - leaq 320(%rsp),%rdi - call __ecp_nistz256_mul_montx - - leaq 256(%rsp),%rbx - leaq 320(%rsp),%rdi - call __ecp_nistz256_sub_fromx - -.byte 102,72,15,126,199 - - movdqa %xmm5,%xmm0 - movdqa %xmm5,%xmm1 - pandn 352(%rsp),%xmm0 - movdqa %xmm5,%xmm2 - pandn 352+16(%rsp),%xmm1 - movdqa %xmm5,%xmm3 - pand 544(%rsp),%xmm2 - pand 544+16(%rsp),%xmm3 - por %xmm0,%xmm2 - por %xmm1,%xmm3 - - movdqa %xmm4,%xmm0 - movdqa %xmm4,%xmm1 - pandn %xmm2,%xmm0 - movdqa %xmm4,%xmm2 - pandn %xmm3,%xmm1 - movdqa %xmm4,%xmm3 - pand 448(%rsp),%xmm2 - pand 448+16(%rsp),%xmm3 - por %xmm0,%xmm2 - por %xmm1,%xmm3 - movdqu %xmm2,64(%rdi) - movdqu %xmm3,80(%rdi) - - movdqa %xmm5,%xmm0 - movdqa %xmm5,%xmm1 - pandn 288(%rsp),%xmm0 - movdqa %xmm5,%xmm2 - pandn 288+16(%rsp),%xmm1 - movdqa %xmm5,%xmm3 - pand 480(%rsp),%xmm2 - pand 480+16(%rsp),%xmm3 - por %xmm0,%xmm2 - por %xmm1,%xmm3 - - movdqa %xmm4,%xmm0 - movdqa %xmm4,%xmm1 - pandn %xmm2,%xmm0 - movdqa %xmm4,%xmm2 - pandn %xmm3,%xmm1 - movdqa %xmm4,%xmm3 - pand 384(%rsp),%xmm2 - pand 384+16(%rsp),%xmm3 - por %xmm0,%xmm2 - por %xmm1,%xmm3 - movdqu %xmm2,0(%rdi) - movdqu %xmm3,16(%rdi) - - movdqa %xmm5,%xmm0 - movdqa %xmm5,%xmm1 - pandn 320(%rsp),%xmm0 - movdqa %xmm5,%xmm2 - pandn 320+16(%rsp),%xmm1 - movdqa %xmm5,%xmm3 - pand 512(%rsp),%xmm2 - pand 512+16(%rsp),%xmm3 - por %xmm0,%xmm2 - por %xmm1,%xmm3 - - movdqa %xmm4,%xmm0 - movdqa %xmm4,%xmm1 - pandn %xmm2,%xmm0 - movdqa %xmm4,%xmm2 - pandn %xmm3,%xmm1 - movdqa %xmm4,%xmm3 - pand 416(%rsp),%xmm2 - pand 416+16(%rsp),%xmm3 - por %xmm0,%xmm2 - por %xmm1,%xmm3 - movdqu %xmm2,32(%rdi) - movdqu %xmm3,48(%rdi) - -L$add_donex: - leaq 576+56(%rsp),%rsi - - movq -48(%rsi),%r15 - - movq -40(%rsi),%r14 - - movq -32(%rsi),%r13 - - movq -24(%rsi),%r12 - - movq -16(%rsi),%rbx - - movq -8(%rsi),%rbp - - leaq (%rsi),%rsp - -L$point_addx_epilogue: - .byte 0xf3,0xc3 - - - -.p2align 5 -GFp_nistz256_point_add_affinex: - -L$point_add_affinex: - pushq %rbp - - pushq %rbx - - pushq %r12 - - pushq %r13 - - pushq %r14 - - pushq %r15 - - subq $480+8,%rsp - -L$add_affinex_body: - - movdqu 0(%rsi),%xmm0 - movq %rdx,%rbx - movdqu 16(%rsi),%xmm1 - movdqu 32(%rsi),%xmm2 - movdqu 48(%rsi),%xmm3 - movdqu 64(%rsi),%xmm4 - movdqu 80(%rsi),%xmm5 - movq 64+0(%rsi),%rdx - movq 64+8(%rsi),%r14 - movq 64+16(%rsi),%r15 - movq 64+24(%rsi),%r8 - movdqa %xmm0,320(%rsp) - movdqa %xmm1,320+16(%rsp) - movdqa %xmm2,352(%rsp) - movdqa %xmm3,352+16(%rsp) - movdqa %xmm4,384(%rsp) - movdqa %xmm5,384+16(%rsp) - por %xmm4,%xmm5 - - movdqu 0(%rbx),%xmm0 - pshufd $0xb1,%xmm5,%xmm3 - movdqu 16(%rbx),%xmm1 - movdqu 32(%rbx),%xmm2 - por %xmm3,%xmm5 - movdqu 48(%rbx),%xmm3 - movdqa %xmm0,416(%rsp) - pshufd $0x1e,%xmm5,%xmm4 - movdqa %xmm1,416+16(%rsp) - por %xmm0,%xmm1 -.byte 102,72,15,110,199 - movdqa %xmm2,448(%rsp) - movdqa %xmm3,448+16(%rsp) - por %xmm2,%xmm3 - por %xmm4,%xmm5 - pxor %xmm4,%xmm4 - por %xmm1,%xmm3 - - leaq 64-128(%rsi),%rsi - leaq 32(%rsp),%rdi - call __ecp_nistz256_sqr_montx - - pcmpeqd %xmm4,%xmm5 - pshufd $0xb1,%xmm3,%xmm4 - movq 0(%rbx),%rdx - - movq %r12,%r9 - por %xmm3,%xmm4 - pshufd $0,%xmm5,%xmm5 - pshufd $0x1e,%xmm4,%xmm3 - movq %r13,%r10 - por %xmm3,%xmm4 - pxor %xmm3,%xmm3 - movq %r14,%r11 - pcmpeqd %xmm3,%xmm4 - pshufd $0,%xmm4,%xmm4 - - leaq 32-128(%rsp),%rsi - movq %r15,%r12 - leaq 0(%rsp),%rdi - call __ecp_nistz256_mul_montx - - leaq 320(%rsp),%rbx - leaq 64(%rsp),%rdi - call __ecp_nistz256_sub_fromx - - movq 384(%rsp),%rdx - leaq 384(%rsp),%rbx - movq 0+32(%rsp),%r9 - movq 8+32(%rsp),%r10 - leaq -128+32(%rsp),%rsi - movq 16+32(%rsp),%r11 - movq 24+32(%rsp),%r12 - leaq 32(%rsp),%rdi - call __ecp_nistz256_mul_montx - - movq 384(%rsp),%rdx - leaq 384(%rsp),%rbx - movq 0+64(%rsp),%r9 - movq 8+64(%rsp),%r10 - leaq -128+64(%rsp),%rsi - movq 16+64(%rsp),%r11 - movq 24+64(%rsp),%r12 - leaq 288(%rsp),%rdi - call __ecp_nistz256_mul_montx - - movq 448(%rsp),%rdx - leaq 448(%rsp),%rbx - movq 0+32(%rsp),%r9 - movq 8+32(%rsp),%r10 - leaq -128+32(%rsp),%rsi - movq 16+32(%rsp),%r11 - movq 24+32(%rsp),%r12 - leaq 32(%rsp),%rdi - call __ecp_nistz256_mul_montx - - leaq 352(%rsp),%rbx - leaq 96(%rsp),%rdi - call __ecp_nistz256_sub_fromx - - movq 0+64(%rsp),%rdx - movq 8+64(%rsp),%r14 - leaq -128+64(%rsp),%rsi - movq 16+64(%rsp),%r15 - movq 24+64(%rsp),%r8 - leaq 128(%rsp),%rdi - call __ecp_nistz256_sqr_montx - - movq 0+96(%rsp),%rdx - movq 8+96(%rsp),%r14 - leaq -128+96(%rsp),%rsi - movq 16+96(%rsp),%r15 - movq 24+96(%rsp),%r8 - leaq 192(%rsp),%rdi - call __ecp_nistz256_sqr_montx - - movq 128(%rsp),%rdx - leaq 128(%rsp),%rbx - movq 0+64(%rsp),%r9 - movq 8+64(%rsp),%r10 - leaq -128+64(%rsp),%rsi - movq 16+64(%rsp),%r11 - movq 24+64(%rsp),%r12 - leaq 160(%rsp),%rdi - call __ecp_nistz256_mul_montx - - movq 320(%rsp),%rdx - leaq 320(%rsp),%rbx - movq 0+128(%rsp),%r9 - movq 8+128(%rsp),%r10 - leaq -128+128(%rsp),%rsi - movq 16+128(%rsp),%r11 - movq 24+128(%rsp),%r12 - leaq 0(%rsp),%rdi - call __ecp_nistz256_mul_montx - - - - - xorq %r11,%r11 - addq %r12,%r12 - leaq 192(%rsp),%rsi - adcq %r13,%r13 - movq %r12,%rax - adcq %r8,%r8 - adcq %r9,%r9 - movq %r13,%rbp - adcq $0,%r11 - - subq $-1,%r12 - movq %r8,%rcx - sbbq %r14,%r13 - sbbq $0,%r8 - movq %r9,%r10 - sbbq %r15,%r9 - sbbq $0,%r11 - - cmovcq %rax,%r12 - movq 0(%rsi),%rax - cmovcq %rbp,%r13 - movq 8(%rsi),%rbp - cmovcq %rcx,%r8 - movq 16(%rsi),%rcx - cmovcq %r10,%r9 - movq 24(%rsi),%r10 - - call __ecp_nistz256_subx - - leaq 160(%rsp),%rbx - leaq 224(%rsp),%rdi - call __ecp_nistz256_sub_fromx - - movq 0+0(%rsp),%rax - movq 0+8(%rsp),%rbp - movq 0+16(%rsp),%rcx - movq 0+24(%rsp),%r10 - leaq 64(%rsp),%rdi - - call __ecp_nistz256_subx - - movq %r12,0(%rdi) - movq %r13,8(%rdi) - movq %r8,16(%rdi) - movq %r9,24(%rdi) - movq 352(%rsp),%rdx - leaq 352(%rsp),%rbx - movq 0+160(%rsp),%r9 - movq 8+160(%rsp),%r10 - leaq -128+160(%rsp),%rsi - movq 16+160(%rsp),%r11 - movq 24+160(%rsp),%r12 - leaq 32(%rsp),%rdi - call __ecp_nistz256_mul_montx - - movq 96(%rsp),%rdx - leaq 96(%rsp),%rbx - movq 0+64(%rsp),%r9 - movq 8+64(%rsp),%r10 - leaq -128+64(%rsp),%rsi - movq 16+64(%rsp),%r11 - movq 24+64(%rsp),%r12 - leaq 64(%rsp),%rdi - call __ecp_nistz256_mul_montx - - leaq 32(%rsp),%rbx - leaq 256(%rsp),%rdi - call __ecp_nistz256_sub_fromx - -.byte 102,72,15,126,199 - - movdqa %xmm5,%xmm0 - movdqa %xmm5,%xmm1 - pandn 288(%rsp),%xmm0 - movdqa %xmm5,%xmm2 - pandn 288+16(%rsp),%xmm1 - movdqa %xmm5,%xmm3 - pand L$ONE_mont(%rip),%xmm2 - pand L$ONE_mont+16(%rip),%xmm3 - por %xmm0,%xmm2 - por %xmm1,%xmm3 - - movdqa %xmm4,%xmm0 - movdqa %xmm4,%xmm1 - pandn %xmm2,%xmm0 - movdqa %xmm4,%xmm2 - pandn %xmm3,%xmm1 - movdqa %xmm4,%xmm3 - pand 384(%rsp),%xmm2 - pand 384+16(%rsp),%xmm3 - por %xmm0,%xmm2 - por %xmm1,%xmm3 - movdqu %xmm2,64(%rdi) - movdqu %xmm3,80(%rdi) - - movdqa %xmm5,%xmm0 - movdqa %xmm5,%xmm1 - pandn 224(%rsp),%xmm0 - movdqa %xmm5,%xmm2 - pandn 224+16(%rsp),%xmm1 - movdqa %xmm5,%xmm3 - pand 416(%rsp),%xmm2 - pand 416+16(%rsp),%xmm3 - por %xmm0,%xmm2 - por %xmm1,%xmm3 - - movdqa %xmm4,%xmm0 - movdqa %xmm4,%xmm1 - pandn %xmm2,%xmm0 - movdqa %xmm4,%xmm2 - pandn %xmm3,%xmm1 - movdqa %xmm4,%xmm3 - pand 320(%rsp),%xmm2 - pand 320+16(%rsp),%xmm3 - por %xmm0,%xmm2 - por %xmm1,%xmm3 - movdqu %xmm2,0(%rdi) - movdqu %xmm3,16(%rdi) - - movdqa %xmm5,%xmm0 - movdqa %xmm5,%xmm1 - pandn 256(%rsp),%xmm0 - movdqa %xmm5,%xmm2 - pandn 256+16(%rsp),%xmm1 - movdqa %xmm5,%xmm3 - pand 448(%rsp),%xmm2 - pand 448+16(%rsp),%xmm3 - por %xmm0,%xmm2 - por %xmm1,%xmm3 - - movdqa %xmm4,%xmm0 - movdqa %xmm4,%xmm1 - pandn %xmm2,%xmm0 - movdqa %xmm4,%xmm2 - pandn %xmm3,%xmm1 - movdqa %xmm4,%xmm3 - pand 352(%rsp),%xmm2 - pand 352+16(%rsp),%xmm3 - por %xmm0,%xmm2 - por %xmm1,%xmm3 - movdqu %xmm2,32(%rdi) - movdqu %xmm3,48(%rdi) - - leaq 480+56(%rsp),%rsi - - movq -48(%rsi),%r15 - - movq -40(%rsi),%r14 - - movq -32(%rsi),%r13 - - movq -24(%rsi),%r12 - - movq -16(%rsi),%rbx - - movq -8(%rsi),%rbp - - leaq (%rsi),%rsp - -L$add_affinex_epilogue: - .byte 0xf3,0xc3 - - -#endif Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/p256-x86_64-asm-nasm.obj and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/p256-x86_64-asm-nasm.obj differ diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/sha256-armv4-ios32.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/sha256-armv4-ios32.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/sha256-armv4-ios32.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/sha256-armv4-ios32.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,2834 +0,0 @@ -// This file is generated from a similarly-named Perl script in the BoringSSL -// source tree. Do not edit by hand. - -#if !defined(__has_feature) -#define __has_feature(x) 0 -#endif -#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) -#define OPENSSL_NO_ASM -#endif - -#if !defined(OPENSSL_NO_ASM) -@ Copyright 2007-2016 The OpenSSL Project Authors. All Rights Reserved. -@ -@ Licensed under the OpenSSL license (the "License"). You may not use -@ this file except in compliance with the License. You can obtain a copy -@ in the file LICENSE in the source distribution or at -@ https://www.openssl.org/source/license.html - - -@ ==================================================================== -@ Written by Andy Polyakov for the OpenSSL -@ project. The module is, however, dual licensed under OpenSSL and -@ CRYPTOGAMS licenses depending on where you obtain it. For further -@ details see http://www.openssl.org/~appro/cryptogams/. -@ -@ Permission to use under GPL terms is granted. -@ ==================================================================== - -@ SHA256 block procedure for ARMv4. May 2007. - -@ Performance is ~2x better than gcc 3.4 generated code and in "abso- -@ lute" terms is ~2250 cycles per 64-byte block or ~35 cycles per -@ byte [on single-issue Xscale PXA250 core]. - -@ July 2010. -@ -@ Rescheduling for dual-issue pipeline resulted in 22% improvement on -@ Cortex A8 core and ~20 cycles per processed byte. - -@ February 2011. -@ -@ Profiler-assisted and platform-specific optimization resulted in 16% -@ improvement on Cortex A8 core and ~15.4 cycles per processed byte. - -@ September 2013. -@ -@ Add NEON implementation. On Cortex A8 it was measured to process one -@ byte in 12.5 cycles or 23% faster than integer-only code. Snapdragon -@ S4 does it in 12.5 cycles too, but it's 50% faster than integer-only -@ code (meaning that latter performs sub-optimally, nothing was done -@ about it). - -@ May 2014. -@ -@ Add ARMv8 code path performing at 2.0 cpb on Apple A7. - -#ifndef __KERNEL__ -# include -#else -# define __ARM_ARCH__ __LINUX_ARM_ARCH__ -# define __ARM_MAX_ARCH__ 7 -#endif - -@ Silence ARMv8 deprecated IT instruction warnings. This file is used by both -@ ARMv7 and ARMv8 processors. It does have ARMv8-only code, but those -@ instructions are manually-encoded. (See unsha256.) - - -.text -#if defined(__thumb2__) -.syntax unified -.thumb -#else -.code 32 -#endif - - -.align 5 -K256: -.word 0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5 -.word 0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5 -.word 0xd807aa98,0x12835b01,0x243185be,0x550c7dc3 -.word 0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174 -.word 0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc -.word 0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da -.word 0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7 -.word 0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967 -.word 0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13 -.word 0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85 -.word 0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3 -.word 0xd192e819,0xd6990624,0xf40e3585,0x106aa070 -.word 0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5 -.word 0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3 -.word 0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208 -.word 0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2 - -.word 0 @ terminator -#if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__) - -.private_extern _GFp_armcap_P -LOPENSSL_armcap: -.word _GFp_armcap_P-Lsha256_block_data_order -#endif -.align 5 - -.globl _GFp_sha256_block_data_order -.private_extern _GFp_sha256_block_data_order -#ifdef __thumb2__ -.thumb_func _GFp_sha256_block_data_order -#endif -_GFp_sha256_block_data_order: -Lsha256_block_data_order: -#if __ARM_ARCH__<7 && !defined(__thumb2__) - sub r3,pc,#8 @ _GFp_sha256_block_data_order -#else - adr r3,Lsha256_block_data_order -#endif -#if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__) - ldr r12,LOPENSSL_armcap - ldr r12,[r3,r12] @ _GFp_armcap_P -#ifdef __APPLE__ - ldr r12,[r12] -#endif - tst r12,#ARMV8_SHA256 - bne LARMv8 - tst r12,#ARMV7_NEON - bne LNEON -#endif - add r2,r1,r2,lsl#6 @ len to point at the end of inp - stmdb sp!,{r0,r1,r2,r4-r11,lr} - ldmia r0,{r4,r5,r6,r7,r8,r9,r10,r11} - sub r14,r3,#256+32 @ K256 - sub sp,sp,#16*4 @ alloca(X[16]) -Loop: -# if __ARM_ARCH__>=7 - ldr r2,[r1],#4 -# else - ldrb r2,[r1,#3] -# endif - eor r3,r5,r6 @ magic - eor r12,r12,r12 -#if __ARM_ARCH__>=7 - @ ldr r2,[r1],#4 @ 0 -# if 0==15 - str r1,[sp,#17*4] @ make room for r1 -# endif - eor r0,r8,r8,ror#5 - add r4,r4,r12 @ h+=Maj(a,b,c) from the past - eor r0,r0,r8,ror#19 @ Sigma1(e) -# ifndef __ARMEB__ - rev r2,r2 -# endif -#else - @ ldrb r2,[r1,#3] @ 0 - add r4,r4,r12 @ h+=Maj(a,b,c) from the past - ldrb r12,[r1,#2] - ldrb r0,[r1,#1] - orr r2,r2,r12,lsl#8 - ldrb r12,[r1],#4 - orr r2,r2,r0,lsl#16 -# if 0==15 - str r1,[sp,#17*4] @ make room for r1 -# endif - eor r0,r8,r8,ror#5 - orr r2,r2,r12,lsl#24 - eor r0,r0,r8,ror#19 @ Sigma1(e) -#endif - ldr r12,[r14],#4 @ *K256++ - add r11,r11,r2 @ h+=X[i] - str r2,[sp,#0*4] - eor r2,r9,r10 - add r11,r11,r0,ror#6 @ h+=Sigma1(e) - and r2,r2,r8 - add r11,r11,r12 @ h+=K256[i] - eor r2,r2,r10 @ Ch(e,f,g) - eor r0,r4,r4,ror#11 - add r11,r11,r2 @ h+=Ch(e,f,g) -#if 0==31 - and r12,r12,#0xff - cmp r12,#0xf2 @ done? -#endif -#if 0<15 -# if __ARM_ARCH__>=7 - ldr r2,[r1],#4 @ prefetch -# else - ldrb r2,[r1,#3] -# endif - eor r12,r4,r5 @ a^b, b^c in next round -#else - ldr r2,[sp,#2*4] @ from future BODY_16_xx - eor r12,r4,r5 @ a^b, b^c in next round - ldr r1,[sp,#15*4] @ from future BODY_16_xx -#endif - eor r0,r0,r4,ror#20 @ Sigma0(a) - and r3,r3,r12 @ (b^c)&=(a^b) - add r7,r7,r11 @ d+=h - eor r3,r3,r5 @ Maj(a,b,c) - add r11,r11,r0,ror#2 @ h+=Sigma0(a) - @ add r11,r11,r3 @ h+=Maj(a,b,c) -#if __ARM_ARCH__>=7 - @ ldr r2,[r1],#4 @ 1 -# if 1==15 - str r1,[sp,#17*4] @ make room for r1 -# endif - eor r0,r7,r7,ror#5 - add r11,r11,r3 @ h+=Maj(a,b,c) from the past - eor r0,r0,r7,ror#19 @ Sigma1(e) -# ifndef __ARMEB__ - rev r2,r2 -# endif -#else - @ ldrb r2,[r1,#3] @ 1 - add r11,r11,r3 @ h+=Maj(a,b,c) from the past - ldrb r3,[r1,#2] - ldrb r0,[r1,#1] - orr r2,r2,r3,lsl#8 - ldrb r3,[r1],#4 - orr r2,r2,r0,lsl#16 -# if 1==15 - str r1,[sp,#17*4] @ make room for r1 -# endif - eor r0,r7,r7,ror#5 - orr r2,r2,r3,lsl#24 - eor r0,r0,r7,ror#19 @ Sigma1(e) -#endif - ldr r3,[r14],#4 @ *K256++ - add r10,r10,r2 @ h+=X[i] - str r2,[sp,#1*4] - eor r2,r8,r9 - add r10,r10,r0,ror#6 @ h+=Sigma1(e) - and r2,r2,r7 - add r10,r10,r3 @ h+=K256[i] - eor r2,r2,r9 @ Ch(e,f,g) - eor r0,r11,r11,ror#11 - add r10,r10,r2 @ h+=Ch(e,f,g) -#if 1==31 - and r3,r3,#0xff - cmp r3,#0xf2 @ done? -#endif -#if 1<15 -# if __ARM_ARCH__>=7 - ldr r2,[r1],#4 @ prefetch -# else - ldrb r2,[r1,#3] -# endif - eor r3,r11,r4 @ a^b, b^c in next round -#else - ldr r2,[sp,#3*4] @ from future BODY_16_xx - eor r3,r11,r4 @ a^b, b^c in next round - ldr r1,[sp,#0*4] @ from future BODY_16_xx -#endif - eor r0,r0,r11,ror#20 @ Sigma0(a) - and r12,r12,r3 @ (b^c)&=(a^b) - add r6,r6,r10 @ d+=h - eor r12,r12,r4 @ Maj(a,b,c) - add r10,r10,r0,ror#2 @ h+=Sigma0(a) - @ add r10,r10,r12 @ h+=Maj(a,b,c) -#if __ARM_ARCH__>=7 - @ ldr r2,[r1],#4 @ 2 -# if 2==15 - str r1,[sp,#17*4] @ make room for r1 -# endif - eor r0,r6,r6,ror#5 - add r10,r10,r12 @ h+=Maj(a,b,c) from the past - eor r0,r0,r6,ror#19 @ Sigma1(e) -# ifndef __ARMEB__ - rev r2,r2 -# endif -#else - @ ldrb r2,[r1,#3] @ 2 - add r10,r10,r12 @ h+=Maj(a,b,c) from the past - ldrb r12,[r1,#2] - ldrb r0,[r1,#1] - orr r2,r2,r12,lsl#8 - ldrb r12,[r1],#4 - orr r2,r2,r0,lsl#16 -# if 2==15 - str r1,[sp,#17*4] @ make room for r1 -# endif - eor r0,r6,r6,ror#5 - orr r2,r2,r12,lsl#24 - eor r0,r0,r6,ror#19 @ Sigma1(e) -#endif - ldr r12,[r14],#4 @ *K256++ - add r9,r9,r2 @ h+=X[i] - str r2,[sp,#2*4] - eor r2,r7,r8 - add r9,r9,r0,ror#6 @ h+=Sigma1(e) - and r2,r2,r6 - add r9,r9,r12 @ h+=K256[i] - eor r2,r2,r8 @ Ch(e,f,g) - eor r0,r10,r10,ror#11 - add r9,r9,r2 @ h+=Ch(e,f,g) -#if 2==31 - and r12,r12,#0xff - cmp r12,#0xf2 @ done? -#endif -#if 2<15 -# if __ARM_ARCH__>=7 - ldr r2,[r1],#4 @ prefetch -# else - ldrb r2,[r1,#3] -# endif - eor r12,r10,r11 @ a^b, b^c in next round -#else - ldr r2,[sp,#4*4] @ from future BODY_16_xx - eor r12,r10,r11 @ a^b, b^c in next round - ldr r1,[sp,#1*4] @ from future BODY_16_xx -#endif - eor r0,r0,r10,ror#20 @ Sigma0(a) - and r3,r3,r12 @ (b^c)&=(a^b) - add r5,r5,r9 @ d+=h - eor r3,r3,r11 @ Maj(a,b,c) - add r9,r9,r0,ror#2 @ h+=Sigma0(a) - @ add r9,r9,r3 @ h+=Maj(a,b,c) -#if __ARM_ARCH__>=7 - @ ldr r2,[r1],#4 @ 3 -# if 3==15 - str r1,[sp,#17*4] @ make room for r1 -# endif - eor r0,r5,r5,ror#5 - add r9,r9,r3 @ h+=Maj(a,b,c) from the past - eor r0,r0,r5,ror#19 @ Sigma1(e) -# ifndef __ARMEB__ - rev r2,r2 -# endif -#else - @ ldrb r2,[r1,#3] @ 3 - add r9,r9,r3 @ h+=Maj(a,b,c) from the past - ldrb r3,[r1,#2] - ldrb r0,[r1,#1] - orr r2,r2,r3,lsl#8 - ldrb r3,[r1],#4 - orr r2,r2,r0,lsl#16 -# if 3==15 - str r1,[sp,#17*4] @ make room for r1 -# endif - eor r0,r5,r5,ror#5 - orr r2,r2,r3,lsl#24 - eor r0,r0,r5,ror#19 @ Sigma1(e) -#endif - ldr r3,[r14],#4 @ *K256++ - add r8,r8,r2 @ h+=X[i] - str r2,[sp,#3*4] - eor r2,r6,r7 - add r8,r8,r0,ror#6 @ h+=Sigma1(e) - and r2,r2,r5 - add r8,r8,r3 @ h+=K256[i] - eor r2,r2,r7 @ Ch(e,f,g) - eor r0,r9,r9,ror#11 - add r8,r8,r2 @ h+=Ch(e,f,g) -#if 3==31 - and r3,r3,#0xff - cmp r3,#0xf2 @ done? -#endif -#if 3<15 -# if __ARM_ARCH__>=7 - ldr r2,[r1],#4 @ prefetch -# else - ldrb r2,[r1,#3] -# endif - eor r3,r9,r10 @ a^b, b^c in next round -#else - ldr r2,[sp,#5*4] @ from future BODY_16_xx - eor r3,r9,r10 @ a^b, b^c in next round - ldr r1,[sp,#2*4] @ from future BODY_16_xx -#endif - eor r0,r0,r9,ror#20 @ Sigma0(a) - and r12,r12,r3 @ (b^c)&=(a^b) - add r4,r4,r8 @ d+=h - eor r12,r12,r10 @ Maj(a,b,c) - add r8,r8,r0,ror#2 @ h+=Sigma0(a) - @ add r8,r8,r12 @ h+=Maj(a,b,c) -#if __ARM_ARCH__>=7 - @ ldr r2,[r1],#4 @ 4 -# if 4==15 - str r1,[sp,#17*4] @ make room for r1 -# endif - eor r0,r4,r4,ror#5 - add r8,r8,r12 @ h+=Maj(a,b,c) from the past - eor r0,r0,r4,ror#19 @ Sigma1(e) -# ifndef __ARMEB__ - rev r2,r2 -# endif -#else - @ ldrb r2,[r1,#3] @ 4 - add r8,r8,r12 @ h+=Maj(a,b,c) from the past - ldrb r12,[r1,#2] - ldrb r0,[r1,#1] - orr r2,r2,r12,lsl#8 - ldrb r12,[r1],#4 - orr r2,r2,r0,lsl#16 -# if 4==15 - str r1,[sp,#17*4] @ make room for r1 -# endif - eor r0,r4,r4,ror#5 - orr r2,r2,r12,lsl#24 - eor r0,r0,r4,ror#19 @ Sigma1(e) -#endif - ldr r12,[r14],#4 @ *K256++ - add r7,r7,r2 @ h+=X[i] - str r2,[sp,#4*4] - eor r2,r5,r6 - add r7,r7,r0,ror#6 @ h+=Sigma1(e) - and r2,r2,r4 - add r7,r7,r12 @ h+=K256[i] - eor r2,r2,r6 @ Ch(e,f,g) - eor r0,r8,r8,ror#11 - add r7,r7,r2 @ h+=Ch(e,f,g) -#if 4==31 - and r12,r12,#0xff - cmp r12,#0xf2 @ done? -#endif -#if 4<15 -# if __ARM_ARCH__>=7 - ldr r2,[r1],#4 @ prefetch -# else - ldrb r2,[r1,#3] -# endif - eor r12,r8,r9 @ a^b, b^c in next round -#else - ldr r2,[sp,#6*4] @ from future BODY_16_xx - eor r12,r8,r9 @ a^b, b^c in next round - ldr r1,[sp,#3*4] @ from future BODY_16_xx -#endif - eor r0,r0,r8,ror#20 @ Sigma0(a) - and r3,r3,r12 @ (b^c)&=(a^b) - add r11,r11,r7 @ d+=h - eor r3,r3,r9 @ Maj(a,b,c) - add r7,r7,r0,ror#2 @ h+=Sigma0(a) - @ add r7,r7,r3 @ h+=Maj(a,b,c) -#if __ARM_ARCH__>=7 - @ ldr r2,[r1],#4 @ 5 -# if 5==15 - str r1,[sp,#17*4] @ make room for r1 -# endif - eor r0,r11,r11,ror#5 - add r7,r7,r3 @ h+=Maj(a,b,c) from the past - eor r0,r0,r11,ror#19 @ Sigma1(e) -# ifndef __ARMEB__ - rev r2,r2 -# endif -#else - @ ldrb r2,[r1,#3] @ 5 - add r7,r7,r3 @ h+=Maj(a,b,c) from the past - ldrb r3,[r1,#2] - ldrb r0,[r1,#1] - orr r2,r2,r3,lsl#8 - ldrb r3,[r1],#4 - orr r2,r2,r0,lsl#16 -# if 5==15 - str r1,[sp,#17*4] @ make room for r1 -# endif - eor r0,r11,r11,ror#5 - orr r2,r2,r3,lsl#24 - eor r0,r0,r11,ror#19 @ Sigma1(e) -#endif - ldr r3,[r14],#4 @ *K256++ - add r6,r6,r2 @ h+=X[i] - str r2,[sp,#5*4] - eor r2,r4,r5 - add r6,r6,r0,ror#6 @ h+=Sigma1(e) - and r2,r2,r11 - add r6,r6,r3 @ h+=K256[i] - eor r2,r2,r5 @ Ch(e,f,g) - eor r0,r7,r7,ror#11 - add r6,r6,r2 @ h+=Ch(e,f,g) -#if 5==31 - and r3,r3,#0xff - cmp r3,#0xf2 @ done? -#endif -#if 5<15 -# if __ARM_ARCH__>=7 - ldr r2,[r1],#4 @ prefetch -# else - ldrb r2,[r1,#3] -# endif - eor r3,r7,r8 @ a^b, b^c in next round -#else - ldr r2,[sp,#7*4] @ from future BODY_16_xx - eor r3,r7,r8 @ a^b, b^c in next round - ldr r1,[sp,#4*4] @ from future BODY_16_xx -#endif - eor r0,r0,r7,ror#20 @ Sigma0(a) - and r12,r12,r3 @ (b^c)&=(a^b) - add r10,r10,r6 @ d+=h - eor r12,r12,r8 @ Maj(a,b,c) - add r6,r6,r0,ror#2 @ h+=Sigma0(a) - @ add r6,r6,r12 @ h+=Maj(a,b,c) -#if __ARM_ARCH__>=7 - @ ldr r2,[r1],#4 @ 6 -# if 6==15 - str r1,[sp,#17*4] @ make room for r1 -# endif - eor r0,r10,r10,ror#5 - add r6,r6,r12 @ h+=Maj(a,b,c) from the past - eor r0,r0,r10,ror#19 @ Sigma1(e) -# ifndef __ARMEB__ - rev r2,r2 -# endif -#else - @ ldrb r2,[r1,#3] @ 6 - add r6,r6,r12 @ h+=Maj(a,b,c) from the past - ldrb r12,[r1,#2] - ldrb r0,[r1,#1] - orr r2,r2,r12,lsl#8 - ldrb r12,[r1],#4 - orr r2,r2,r0,lsl#16 -# if 6==15 - str r1,[sp,#17*4] @ make room for r1 -# endif - eor r0,r10,r10,ror#5 - orr r2,r2,r12,lsl#24 - eor r0,r0,r10,ror#19 @ Sigma1(e) -#endif - ldr r12,[r14],#4 @ *K256++ - add r5,r5,r2 @ h+=X[i] - str r2,[sp,#6*4] - eor r2,r11,r4 - add r5,r5,r0,ror#6 @ h+=Sigma1(e) - and r2,r2,r10 - add r5,r5,r12 @ h+=K256[i] - eor r2,r2,r4 @ Ch(e,f,g) - eor r0,r6,r6,ror#11 - add r5,r5,r2 @ h+=Ch(e,f,g) -#if 6==31 - and r12,r12,#0xff - cmp r12,#0xf2 @ done? -#endif -#if 6<15 -# if __ARM_ARCH__>=7 - ldr r2,[r1],#4 @ prefetch -# else - ldrb r2,[r1,#3] -# endif - eor r12,r6,r7 @ a^b, b^c in next round -#else - ldr r2,[sp,#8*4] @ from future BODY_16_xx - eor r12,r6,r7 @ a^b, b^c in next round - ldr r1,[sp,#5*4] @ from future BODY_16_xx -#endif - eor r0,r0,r6,ror#20 @ Sigma0(a) - and r3,r3,r12 @ (b^c)&=(a^b) - add r9,r9,r5 @ d+=h - eor r3,r3,r7 @ Maj(a,b,c) - add r5,r5,r0,ror#2 @ h+=Sigma0(a) - @ add r5,r5,r3 @ h+=Maj(a,b,c) -#if __ARM_ARCH__>=7 - @ ldr r2,[r1],#4 @ 7 -# if 7==15 - str r1,[sp,#17*4] @ make room for r1 -# endif - eor r0,r9,r9,ror#5 - add r5,r5,r3 @ h+=Maj(a,b,c) from the past - eor r0,r0,r9,ror#19 @ Sigma1(e) -# ifndef __ARMEB__ - rev r2,r2 -# endif -#else - @ ldrb r2,[r1,#3] @ 7 - add r5,r5,r3 @ h+=Maj(a,b,c) from the past - ldrb r3,[r1,#2] - ldrb r0,[r1,#1] - orr r2,r2,r3,lsl#8 - ldrb r3,[r1],#4 - orr r2,r2,r0,lsl#16 -# if 7==15 - str r1,[sp,#17*4] @ make room for r1 -# endif - eor r0,r9,r9,ror#5 - orr r2,r2,r3,lsl#24 - eor r0,r0,r9,ror#19 @ Sigma1(e) -#endif - ldr r3,[r14],#4 @ *K256++ - add r4,r4,r2 @ h+=X[i] - str r2,[sp,#7*4] - eor r2,r10,r11 - add r4,r4,r0,ror#6 @ h+=Sigma1(e) - and r2,r2,r9 - add r4,r4,r3 @ h+=K256[i] - eor r2,r2,r11 @ Ch(e,f,g) - eor r0,r5,r5,ror#11 - add r4,r4,r2 @ h+=Ch(e,f,g) -#if 7==31 - and r3,r3,#0xff - cmp r3,#0xf2 @ done? -#endif -#if 7<15 -# if __ARM_ARCH__>=7 - ldr r2,[r1],#4 @ prefetch -# else - ldrb r2,[r1,#3] -# endif - eor r3,r5,r6 @ a^b, b^c in next round -#else - ldr r2,[sp,#9*4] @ from future BODY_16_xx - eor r3,r5,r6 @ a^b, b^c in next round - ldr r1,[sp,#6*4] @ from future BODY_16_xx -#endif - eor r0,r0,r5,ror#20 @ Sigma0(a) - and r12,r12,r3 @ (b^c)&=(a^b) - add r8,r8,r4 @ d+=h - eor r12,r12,r6 @ Maj(a,b,c) - add r4,r4,r0,ror#2 @ h+=Sigma0(a) - @ add r4,r4,r12 @ h+=Maj(a,b,c) -#if __ARM_ARCH__>=7 - @ ldr r2,[r1],#4 @ 8 -# if 8==15 - str r1,[sp,#17*4] @ make room for r1 -# endif - eor r0,r8,r8,ror#5 - add r4,r4,r12 @ h+=Maj(a,b,c) from the past - eor r0,r0,r8,ror#19 @ Sigma1(e) -# ifndef __ARMEB__ - rev r2,r2 -# endif -#else - @ ldrb r2,[r1,#3] @ 8 - add r4,r4,r12 @ h+=Maj(a,b,c) from the past - ldrb r12,[r1,#2] - ldrb r0,[r1,#1] - orr r2,r2,r12,lsl#8 - ldrb r12,[r1],#4 - orr r2,r2,r0,lsl#16 -# if 8==15 - str r1,[sp,#17*4] @ make room for r1 -# endif - eor r0,r8,r8,ror#5 - orr r2,r2,r12,lsl#24 - eor r0,r0,r8,ror#19 @ Sigma1(e) -#endif - ldr r12,[r14],#4 @ *K256++ - add r11,r11,r2 @ h+=X[i] - str r2,[sp,#8*4] - eor r2,r9,r10 - add r11,r11,r0,ror#6 @ h+=Sigma1(e) - and r2,r2,r8 - add r11,r11,r12 @ h+=K256[i] - eor r2,r2,r10 @ Ch(e,f,g) - eor r0,r4,r4,ror#11 - add r11,r11,r2 @ h+=Ch(e,f,g) -#if 8==31 - and r12,r12,#0xff - cmp r12,#0xf2 @ done? -#endif -#if 8<15 -# if __ARM_ARCH__>=7 - ldr r2,[r1],#4 @ prefetch -# else - ldrb r2,[r1,#3] -# endif - eor r12,r4,r5 @ a^b, b^c in next round -#else - ldr r2,[sp,#10*4] @ from future BODY_16_xx - eor r12,r4,r5 @ a^b, b^c in next round - ldr r1,[sp,#7*4] @ from future BODY_16_xx -#endif - eor r0,r0,r4,ror#20 @ Sigma0(a) - and r3,r3,r12 @ (b^c)&=(a^b) - add r7,r7,r11 @ d+=h - eor r3,r3,r5 @ Maj(a,b,c) - add r11,r11,r0,ror#2 @ h+=Sigma0(a) - @ add r11,r11,r3 @ h+=Maj(a,b,c) -#if __ARM_ARCH__>=7 - @ ldr r2,[r1],#4 @ 9 -# if 9==15 - str r1,[sp,#17*4] @ make room for r1 -# endif - eor r0,r7,r7,ror#5 - add r11,r11,r3 @ h+=Maj(a,b,c) from the past - eor r0,r0,r7,ror#19 @ Sigma1(e) -# ifndef __ARMEB__ - rev r2,r2 -# endif -#else - @ ldrb r2,[r1,#3] @ 9 - add r11,r11,r3 @ h+=Maj(a,b,c) from the past - ldrb r3,[r1,#2] - ldrb r0,[r1,#1] - orr r2,r2,r3,lsl#8 - ldrb r3,[r1],#4 - orr r2,r2,r0,lsl#16 -# if 9==15 - str r1,[sp,#17*4] @ make room for r1 -# endif - eor r0,r7,r7,ror#5 - orr r2,r2,r3,lsl#24 - eor r0,r0,r7,ror#19 @ Sigma1(e) -#endif - ldr r3,[r14],#4 @ *K256++ - add r10,r10,r2 @ h+=X[i] - str r2,[sp,#9*4] - eor r2,r8,r9 - add r10,r10,r0,ror#6 @ h+=Sigma1(e) - and r2,r2,r7 - add r10,r10,r3 @ h+=K256[i] - eor r2,r2,r9 @ Ch(e,f,g) - eor r0,r11,r11,ror#11 - add r10,r10,r2 @ h+=Ch(e,f,g) -#if 9==31 - and r3,r3,#0xff - cmp r3,#0xf2 @ done? -#endif -#if 9<15 -# if __ARM_ARCH__>=7 - ldr r2,[r1],#4 @ prefetch -# else - ldrb r2,[r1,#3] -# endif - eor r3,r11,r4 @ a^b, b^c in next round -#else - ldr r2,[sp,#11*4] @ from future BODY_16_xx - eor r3,r11,r4 @ a^b, b^c in next round - ldr r1,[sp,#8*4] @ from future BODY_16_xx -#endif - eor r0,r0,r11,ror#20 @ Sigma0(a) - and r12,r12,r3 @ (b^c)&=(a^b) - add r6,r6,r10 @ d+=h - eor r12,r12,r4 @ Maj(a,b,c) - add r10,r10,r0,ror#2 @ h+=Sigma0(a) - @ add r10,r10,r12 @ h+=Maj(a,b,c) -#if __ARM_ARCH__>=7 - @ ldr r2,[r1],#4 @ 10 -# if 10==15 - str r1,[sp,#17*4] @ make room for r1 -# endif - eor r0,r6,r6,ror#5 - add r10,r10,r12 @ h+=Maj(a,b,c) from the past - eor r0,r0,r6,ror#19 @ Sigma1(e) -# ifndef __ARMEB__ - rev r2,r2 -# endif -#else - @ ldrb r2,[r1,#3] @ 10 - add r10,r10,r12 @ h+=Maj(a,b,c) from the past - ldrb r12,[r1,#2] - ldrb r0,[r1,#1] - orr r2,r2,r12,lsl#8 - ldrb r12,[r1],#4 - orr r2,r2,r0,lsl#16 -# if 10==15 - str r1,[sp,#17*4] @ make room for r1 -# endif - eor r0,r6,r6,ror#5 - orr r2,r2,r12,lsl#24 - eor r0,r0,r6,ror#19 @ Sigma1(e) -#endif - ldr r12,[r14],#4 @ *K256++ - add r9,r9,r2 @ h+=X[i] - str r2,[sp,#10*4] - eor r2,r7,r8 - add r9,r9,r0,ror#6 @ h+=Sigma1(e) - and r2,r2,r6 - add r9,r9,r12 @ h+=K256[i] - eor r2,r2,r8 @ Ch(e,f,g) - eor r0,r10,r10,ror#11 - add r9,r9,r2 @ h+=Ch(e,f,g) -#if 10==31 - and r12,r12,#0xff - cmp r12,#0xf2 @ done? -#endif -#if 10<15 -# if __ARM_ARCH__>=7 - ldr r2,[r1],#4 @ prefetch -# else - ldrb r2,[r1,#3] -# endif - eor r12,r10,r11 @ a^b, b^c in next round -#else - ldr r2,[sp,#12*4] @ from future BODY_16_xx - eor r12,r10,r11 @ a^b, b^c in next round - ldr r1,[sp,#9*4] @ from future BODY_16_xx -#endif - eor r0,r0,r10,ror#20 @ Sigma0(a) - and r3,r3,r12 @ (b^c)&=(a^b) - add r5,r5,r9 @ d+=h - eor r3,r3,r11 @ Maj(a,b,c) - add r9,r9,r0,ror#2 @ h+=Sigma0(a) - @ add r9,r9,r3 @ h+=Maj(a,b,c) -#if __ARM_ARCH__>=7 - @ ldr r2,[r1],#4 @ 11 -# if 11==15 - str r1,[sp,#17*4] @ make room for r1 -# endif - eor r0,r5,r5,ror#5 - add r9,r9,r3 @ h+=Maj(a,b,c) from the past - eor r0,r0,r5,ror#19 @ Sigma1(e) -# ifndef __ARMEB__ - rev r2,r2 -# endif -#else - @ ldrb r2,[r1,#3] @ 11 - add r9,r9,r3 @ h+=Maj(a,b,c) from the past - ldrb r3,[r1,#2] - ldrb r0,[r1,#1] - orr r2,r2,r3,lsl#8 - ldrb r3,[r1],#4 - orr r2,r2,r0,lsl#16 -# if 11==15 - str r1,[sp,#17*4] @ make room for r1 -# endif - eor r0,r5,r5,ror#5 - orr r2,r2,r3,lsl#24 - eor r0,r0,r5,ror#19 @ Sigma1(e) -#endif - ldr r3,[r14],#4 @ *K256++ - add r8,r8,r2 @ h+=X[i] - str r2,[sp,#11*4] - eor r2,r6,r7 - add r8,r8,r0,ror#6 @ h+=Sigma1(e) - and r2,r2,r5 - add r8,r8,r3 @ h+=K256[i] - eor r2,r2,r7 @ Ch(e,f,g) - eor r0,r9,r9,ror#11 - add r8,r8,r2 @ h+=Ch(e,f,g) -#if 11==31 - and r3,r3,#0xff - cmp r3,#0xf2 @ done? -#endif -#if 11<15 -# if __ARM_ARCH__>=7 - ldr r2,[r1],#4 @ prefetch -# else - ldrb r2,[r1,#3] -# endif - eor r3,r9,r10 @ a^b, b^c in next round -#else - ldr r2,[sp,#13*4] @ from future BODY_16_xx - eor r3,r9,r10 @ a^b, b^c in next round - ldr r1,[sp,#10*4] @ from future BODY_16_xx -#endif - eor r0,r0,r9,ror#20 @ Sigma0(a) - and r12,r12,r3 @ (b^c)&=(a^b) - add r4,r4,r8 @ d+=h - eor r12,r12,r10 @ Maj(a,b,c) - add r8,r8,r0,ror#2 @ h+=Sigma0(a) - @ add r8,r8,r12 @ h+=Maj(a,b,c) -#if __ARM_ARCH__>=7 - @ ldr r2,[r1],#4 @ 12 -# if 12==15 - str r1,[sp,#17*4] @ make room for r1 -# endif - eor r0,r4,r4,ror#5 - add r8,r8,r12 @ h+=Maj(a,b,c) from the past - eor r0,r0,r4,ror#19 @ Sigma1(e) -# ifndef __ARMEB__ - rev r2,r2 -# endif -#else - @ ldrb r2,[r1,#3] @ 12 - add r8,r8,r12 @ h+=Maj(a,b,c) from the past - ldrb r12,[r1,#2] - ldrb r0,[r1,#1] - orr r2,r2,r12,lsl#8 - ldrb r12,[r1],#4 - orr r2,r2,r0,lsl#16 -# if 12==15 - str r1,[sp,#17*4] @ make room for r1 -# endif - eor r0,r4,r4,ror#5 - orr r2,r2,r12,lsl#24 - eor r0,r0,r4,ror#19 @ Sigma1(e) -#endif - ldr r12,[r14],#4 @ *K256++ - add r7,r7,r2 @ h+=X[i] - str r2,[sp,#12*4] - eor r2,r5,r6 - add r7,r7,r0,ror#6 @ h+=Sigma1(e) - and r2,r2,r4 - add r7,r7,r12 @ h+=K256[i] - eor r2,r2,r6 @ Ch(e,f,g) - eor r0,r8,r8,ror#11 - add r7,r7,r2 @ h+=Ch(e,f,g) -#if 12==31 - and r12,r12,#0xff - cmp r12,#0xf2 @ done? -#endif -#if 12<15 -# if __ARM_ARCH__>=7 - ldr r2,[r1],#4 @ prefetch -# else - ldrb r2,[r1,#3] -# endif - eor r12,r8,r9 @ a^b, b^c in next round -#else - ldr r2,[sp,#14*4] @ from future BODY_16_xx - eor r12,r8,r9 @ a^b, b^c in next round - ldr r1,[sp,#11*4] @ from future BODY_16_xx -#endif - eor r0,r0,r8,ror#20 @ Sigma0(a) - and r3,r3,r12 @ (b^c)&=(a^b) - add r11,r11,r7 @ d+=h - eor r3,r3,r9 @ Maj(a,b,c) - add r7,r7,r0,ror#2 @ h+=Sigma0(a) - @ add r7,r7,r3 @ h+=Maj(a,b,c) -#if __ARM_ARCH__>=7 - @ ldr r2,[r1],#4 @ 13 -# if 13==15 - str r1,[sp,#17*4] @ make room for r1 -# endif - eor r0,r11,r11,ror#5 - add r7,r7,r3 @ h+=Maj(a,b,c) from the past - eor r0,r0,r11,ror#19 @ Sigma1(e) -# ifndef __ARMEB__ - rev r2,r2 -# endif -#else - @ ldrb r2,[r1,#3] @ 13 - add r7,r7,r3 @ h+=Maj(a,b,c) from the past - ldrb r3,[r1,#2] - ldrb r0,[r1,#1] - orr r2,r2,r3,lsl#8 - ldrb r3,[r1],#4 - orr r2,r2,r0,lsl#16 -# if 13==15 - str r1,[sp,#17*4] @ make room for r1 -# endif - eor r0,r11,r11,ror#5 - orr r2,r2,r3,lsl#24 - eor r0,r0,r11,ror#19 @ Sigma1(e) -#endif - ldr r3,[r14],#4 @ *K256++ - add r6,r6,r2 @ h+=X[i] - str r2,[sp,#13*4] - eor r2,r4,r5 - add r6,r6,r0,ror#6 @ h+=Sigma1(e) - and r2,r2,r11 - add r6,r6,r3 @ h+=K256[i] - eor r2,r2,r5 @ Ch(e,f,g) - eor r0,r7,r7,ror#11 - add r6,r6,r2 @ h+=Ch(e,f,g) -#if 13==31 - and r3,r3,#0xff - cmp r3,#0xf2 @ done? -#endif -#if 13<15 -# if __ARM_ARCH__>=7 - ldr r2,[r1],#4 @ prefetch -# else - ldrb r2,[r1,#3] -# endif - eor r3,r7,r8 @ a^b, b^c in next round -#else - ldr r2,[sp,#15*4] @ from future BODY_16_xx - eor r3,r7,r8 @ a^b, b^c in next round - ldr r1,[sp,#12*4] @ from future BODY_16_xx -#endif - eor r0,r0,r7,ror#20 @ Sigma0(a) - and r12,r12,r3 @ (b^c)&=(a^b) - add r10,r10,r6 @ d+=h - eor r12,r12,r8 @ Maj(a,b,c) - add r6,r6,r0,ror#2 @ h+=Sigma0(a) - @ add r6,r6,r12 @ h+=Maj(a,b,c) -#if __ARM_ARCH__>=7 - @ ldr r2,[r1],#4 @ 14 -# if 14==15 - str r1,[sp,#17*4] @ make room for r1 -# endif - eor r0,r10,r10,ror#5 - add r6,r6,r12 @ h+=Maj(a,b,c) from the past - eor r0,r0,r10,ror#19 @ Sigma1(e) -# ifndef __ARMEB__ - rev r2,r2 -# endif -#else - @ ldrb r2,[r1,#3] @ 14 - add r6,r6,r12 @ h+=Maj(a,b,c) from the past - ldrb r12,[r1,#2] - ldrb r0,[r1,#1] - orr r2,r2,r12,lsl#8 - ldrb r12,[r1],#4 - orr r2,r2,r0,lsl#16 -# if 14==15 - str r1,[sp,#17*4] @ make room for r1 -# endif - eor r0,r10,r10,ror#5 - orr r2,r2,r12,lsl#24 - eor r0,r0,r10,ror#19 @ Sigma1(e) -#endif - ldr r12,[r14],#4 @ *K256++ - add r5,r5,r2 @ h+=X[i] - str r2,[sp,#14*4] - eor r2,r11,r4 - add r5,r5,r0,ror#6 @ h+=Sigma1(e) - and r2,r2,r10 - add r5,r5,r12 @ h+=K256[i] - eor r2,r2,r4 @ Ch(e,f,g) - eor r0,r6,r6,ror#11 - add r5,r5,r2 @ h+=Ch(e,f,g) -#if 14==31 - and r12,r12,#0xff - cmp r12,#0xf2 @ done? -#endif -#if 14<15 -# if __ARM_ARCH__>=7 - ldr r2,[r1],#4 @ prefetch -# else - ldrb r2,[r1,#3] -# endif - eor r12,r6,r7 @ a^b, b^c in next round -#else - ldr r2,[sp,#0*4] @ from future BODY_16_xx - eor r12,r6,r7 @ a^b, b^c in next round - ldr r1,[sp,#13*4] @ from future BODY_16_xx -#endif - eor r0,r0,r6,ror#20 @ Sigma0(a) - and r3,r3,r12 @ (b^c)&=(a^b) - add r9,r9,r5 @ d+=h - eor r3,r3,r7 @ Maj(a,b,c) - add r5,r5,r0,ror#2 @ h+=Sigma0(a) - @ add r5,r5,r3 @ h+=Maj(a,b,c) -#if __ARM_ARCH__>=7 - @ ldr r2,[r1],#4 @ 15 -# if 15==15 - str r1,[sp,#17*4] @ make room for r1 -# endif - eor r0,r9,r9,ror#5 - add r5,r5,r3 @ h+=Maj(a,b,c) from the past - eor r0,r0,r9,ror#19 @ Sigma1(e) -# ifndef __ARMEB__ - rev r2,r2 -# endif -#else - @ ldrb r2,[r1,#3] @ 15 - add r5,r5,r3 @ h+=Maj(a,b,c) from the past - ldrb r3,[r1,#2] - ldrb r0,[r1,#1] - orr r2,r2,r3,lsl#8 - ldrb r3,[r1],#4 - orr r2,r2,r0,lsl#16 -# if 15==15 - str r1,[sp,#17*4] @ make room for r1 -# endif - eor r0,r9,r9,ror#5 - orr r2,r2,r3,lsl#24 - eor r0,r0,r9,ror#19 @ Sigma1(e) -#endif - ldr r3,[r14],#4 @ *K256++ - add r4,r4,r2 @ h+=X[i] - str r2,[sp,#15*4] - eor r2,r10,r11 - add r4,r4,r0,ror#6 @ h+=Sigma1(e) - and r2,r2,r9 - add r4,r4,r3 @ h+=K256[i] - eor r2,r2,r11 @ Ch(e,f,g) - eor r0,r5,r5,ror#11 - add r4,r4,r2 @ h+=Ch(e,f,g) -#if 15==31 - and r3,r3,#0xff - cmp r3,#0xf2 @ done? -#endif -#if 15<15 -# if __ARM_ARCH__>=7 - ldr r2,[r1],#4 @ prefetch -# else - ldrb r2,[r1,#3] -# endif - eor r3,r5,r6 @ a^b, b^c in next round -#else - ldr r2,[sp,#1*4] @ from future BODY_16_xx - eor r3,r5,r6 @ a^b, b^c in next round - ldr r1,[sp,#14*4] @ from future BODY_16_xx -#endif - eor r0,r0,r5,ror#20 @ Sigma0(a) - and r12,r12,r3 @ (b^c)&=(a^b) - add r8,r8,r4 @ d+=h - eor r12,r12,r6 @ Maj(a,b,c) - add r4,r4,r0,ror#2 @ h+=Sigma0(a) - @ add r4,r4,r12 @ h+=Maj(a,b,c) -Lrounds_16_xx: - @ ldr r2,[sp,#1*4] @ 16 - @ ldr r1,[sp,#14*4] - mov r0,r2,ror#7 - add r4,r4,r12 @ h+=Maj(a,b,c) from the past - mov r12,r1,ror#17 - eor r0,r0,r2,ror#18 - eor r12,r12,r1,ror#19 - eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) - ldr r2,[sp,#0*4] - eor r12,r12,r1,lsr#10 @ sigma1(X[i+14]) - ldr r1,[sp,#9*4] - - add r12,r12,r0 - eor r0,r8,r8,ror#5 @ from BODY_00_15 - add r2,r2,r12 - eor r0,r0,r8,ror#19 @ Sigma1(e) - add r2,r2,r1 @ X[i] - ldr r12,[r14],#4 @ *K256++ - add r11,r11,r2 @ h+=X[i] - str r2,[sp,#0*4] - eor r2,r9,r10 - add r11,r11,r0,ror#6 @ h+=Sigma1(e) - and r2,r2,r8 - add r11,r11,r12 @ h+=K256[i] - eor r2,r2,r10 @ Ch(e,f,g) - eor r0,r4,r4,ror#11 - add r11,r11,r2 @ h+=Ch(e,f,g) -#if 16==31 - and r12,r12,#0xff - cmp r12,#0xf2 @ done? -#endif -#if 16<15 -# if __ARM_ARCH__>=7 - ldr r2,[r1],#4 @ prefetch -# else - ldrb r2,[r1,#3] -# endif - eor r12,r4,r5 @ a^b, b^c in next round -#else - ldr r2,[sp,#2*4] @ from future BODY_16_xx - eor r12,r4,r5 @ a^b, b^c in next round - ldr r1,[sp,#15*4] @ from future BODY_16_xx -#endif - eor r0,r0,r4,ror#20 @ Sigma0(a) - and r3,r3,r12 @ (b^c)&=(a^b) - add r7,r7,r11 @ d+=h - eor r3,r3,r5 @ Maj(a,b,c) - add r11,r11,r0,ror#2 @ h+=Sigma0(a) - @ add r11,r11,r3 @ h+=Maj(a,b,c) - @ ldr r2,[sp,#2*4] @ 17 - @ ldr r1,[sp,#15*4] - mov r0,r2,ror#7 - add r11,r11,r3 @ h+=Maj(a,b,c) from the past - mov r3,r1,ror#17 - eor r0,r0,r2,ror#18 - eor r3,r3,r1,ror#19 - eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) - ldr r2,[sp,#1*4] - eor r3,r3,r1,lsr#10 @ sigma1(X[i+14]) - ldr r1,[sp,#10*4] - - add r3,r3,r0 - eor r0,r7,r7,ror#5 @ from BODY_00_15 - add r2,r2,r3 - eor r0,r0,r7,ror#19 @ Sigma1(e) - add r2,r2,r1 @ X[i] - ldr r3,[r14],#4 @ *K256++ - add r10,r10,r2 @ h+=X[i] - str r2,[sp,#1*4] - eor r2,r8,r9 - add r10,r10,r0,ror#6 @ h+=Sigma1(e) - and r2,r2,r7 - add r10,r10,r3 @ h+=K256[i] - eor r2,r2,r9 @ Ch(e,f,g) - eor r0,r11,r11,ror#11 - add r10,r10,r2 @ h+=Ch(e,f,g) -#if 17==31 - and r3,r3,#0xff - cmp r3,#0xf2 @ done? -#endif -#if 17<15 -# if __ARM_ARCH__>=7 - ldr r2,[r1],#4 @ prefetch -# else - ldrb r2,[r1,#3] -# endif - eor r3,r11,r4 @ a^b, b^c in next round -#else - ldr r2,[sp,#3*4] @ from future BODY_16_xx - eor r3,r11,r4 @ a^b, b^c in next round - ldr r1,[sp,#0*4] @ from future BODY_16_xx -#endif - eor r0,r0,r11,ror#20 @ Sigma0(a) - and r12,r12,r3 @ (b^c)&=(a^b) - add r6,r6,r10 @ d+=h - eor r12,r12,r4 @ Maj(a,b,c) - add r10,r10,r0,ror#2 @ h+=Sigma0(a) - @ add r10,r10,r12 @ h+=Maj(a,b,c) - @ ldr r2,[sp,#3*4] @ 18 - @ ldr r1,[sp,#0*4] - mov r0,r2,ror#7 - add r10,r10,r12 @ h+=Maj(a,b,c) from the past - mov r12,r1,ror#17 - eor r0,r0,r2,ror#18 - eor r12,r12,r1,ror#19 - eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) - ldr r2,[sp,#2*4] - eor r12,r12,r1,lsr#10 @ sigma1(X[i+14]) - ldr r1,[sp,#11*4] - - add r12,r12,r0 - eor r0,r6,r6,ror#5 @ from BODY_00_15 - add r2,r2,r12 - eor r0,r0,r6,ror#19 @ Sigma1(e) - add r2,r2,r1 @ X[i] - ldr r12,[r14],#4 @ *K256++ - add r9,r9,r2 @ h+=X[i] - str r2,[sp,#2*4] - eor r2,r7,r8 - add r9,r9,r0,ror#6 @ h+=Sigma1(e) - and r2,r2,r6 - add r9,r9,r12 @ h+=K256[i] - eor r2,r2,r8 @ Ch(e,f,g) - eor r0,r10,r10,ror#11 - add r9,r9,r2 @ h+=Ch(e,f,g) -#if 18==31 - and r12,r12,#0xff - cmp r12,#0xf2 @ done? -#endif -#if 18<15 -# if __ARM_ARCH__>=7 - ldr r2,[r1],#4 @ prefetch -# else - ldrb r2,[r1,#3] -# endif - eor r12,r10,r11 @ a^b, b^c in next round -#else - ldr r2,[sp,#4*4] @ from future BODY_16_xx - eor r12,r10,r11 @ a^b, b^c in next round - ldr r1,[sp,#1*4] @ from future BODY_16_xx -#endif - eor r0,r0,r10,ror#20 @ Sigma0(a) - and r3,r3,r12 @ (b^c)&=(a^b) - add r5,r5,r9 @ d+=h - eor r3,r3,r11 @ Maj(a,b,c) - add r9,r9,r0,ror#2 @ h+=Sigma0(a) - @ add r9,r9,r3 @ h+=Maj(a,b,c) - @ ldr r2,[sp,#4*4] @ 19 - @ ldr r1,[sp,#1*4] - mov r0,r2,ror#7 - add r9,r9,r3 @ h+=Maj(a,b,c) from the past - mov r3,r1,ror#17 - eor r0,r0,r2,ror#18 - eor r3,r3,r1,ror#19 - eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) - ldr r2,[sp,#3*4] - eor r3,r3,r1,lsr#10 @ sigma1(X[i+14]) - ldr r1,[sp,#12*4] - - add r3,r3,r0 - eor r0,r5,r5,ror#5 @ from BODY_00_15 - add r2,r2,r3 - eor r0,r0,r5,ror#19 @ Sigma1(e) - add r2,r2,r1 @ X[i] - ldr r3,[r14],#4 @ *K256++ - add r8,r8,r2 @ h+=X[i] - str r2,[sp,#3*4] - eor r2,r6,r7 - add r8,r8,r0,ror#6 @ h+=Sigma1(e) - and r2,r2,r5 - add r8,r8,r3 @ h+=K256[i] - eor r2,r2,r7 @ Ch(e,f,g) - eor r0,r9,r9,ror#11 - add r8,r8,r2 @ h+=Ch(e,f,g) -#if 19==31 - and r3,r3,#0xff - cmp r3,#0xf2 @ done? -#endif -#if 19<15 -# if __ARM_ARCH__>=7 - ldr r2,[r1],#4 @ prefetch -# else - ldrb r2,[r1,#3] -# endif - eor r3,r9,r10 @ a^b, b^c in next round -#else - ldr r2,[sp,#5*4] @ from future BODY_16_xx - eor r3,r9,r10 @ a^b, b^c in next round - ldr r1,[sp,#2*4] @ from future BODY_16_xx -#endif - eor r0,r0,r9,ror#20 @ Sigma0(a) - and r12,r12,r3 @ (b^c)&=(a^b) - add r4,r4,r8 @ d+=h - eor r12,r12,r10 @ Maj(a,b,c) - add r8,r8,r0,ror#2 @ h+=Sigma0(a) - @ add r8,r8,r12 @ h+=Maj(a,b,c) - @ ldr r2,[sp,#5*4] @ 20 - @ ldr r1,[sp,#2*4] - mov r0,r2,ror#7 - add r8,r8,r12 @ h+=Maj(a,b,c) from the past - mov r12,r1,ror#17 - eor r0,r0,r2,ror#18 - eor r12,r12,r1,ror#19 - eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) - ldr r2,[sp,#4*4] - eor r12,r12,r1,lsr#10 @ sigma1(X[i+14]) - ldr r1,[sp,#13*4] - - add r12,r12,r0 - eor r0,r4,r4,ror#5 @ from BODY_00_15 - add r2,r2,r12 - eor r0,r0,r4,ror#19 @ Sigma1(e) - add r2,r2,r1 @ X[i] - ldr r12,[r14],#4 @ *K256++ - add r7,r7,r2 @ h+=X[i] - str r2,[sp,#4*4] - eor r2,r5,r6 - add r7,r7,r0,ror#6 @ h+=Sigma1(e) - and r2,r2,r4 - add r7,r7,r12 @ h+=K256[i] - eor r2,r2,r6 @ Ch(e,f,g) - eor r0,r8,r8,ror#11 - add r7,r7,r2 @ h+=Ch(e,f,g) -#if 20==31 - and r12,r12,#0xff - cmp r12,#0xf2 @ done? -#endif -#if 20<15 -# if __ARM_ARCH__>=7 - ldr r2,[r1],#4 @ prefetch -# else - ldrb r2,[r1,#3] -# endif - eor r12,r8,r9 @ a^b, b^c in next round -#else - ldr r2,[sp,#6*4] @ from future BODY_16_xx - eor r12,r8,r9 @ a^b, b^c in next round - ldr r1,[sp,#3*4] @ from future BODY_16_xx -#endif - eor r0,r0,r8,ror#20 @ Sigma0(a) - and r3,r3,r12 @ (b^c)&=(a^b) - add r11,r11,r7 @ d+=h - eor r3,r3,r9 @ Maj(a,b,c) - add r7,r7,r0,ror#2 @ h+=Sigma0(a) - @ add r7,r7,r3 @ h+=Maj(a,b,c) - @ ldr r2,[sp,#6*4] @ 21 - @ ldr r1,[sp,#3*4] - mov r0,r2,ror#7 - add r7,r7,r3 @ h+=Maj(a,b,c) from the past - mov r3,r1,ror#17 - eor r0,r0,r2,ror#18 - eor r3,r3,r1,ror#19 - eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) - ldr r2,[sp,#5*4] - eor r3,r3,r1,lsr#10 @ sigma1(X[i+14]) - ldr r1,[sp,#14*4] - - add r3,r3,r0 - eor r0,r11,r11,ror#5 @ from BODY_00_15 - add r2,r2,r3 - eor r0,r0,r11,ror#19 @ Sigma1(e) - add r2,r2,r1 @ X[i] - ldr r3,[r14],#4 @ *K256++ - add r6,r6,r2 @ h+=X[i] - str r2,[sp,#5*4] - eor r2,r4,r5 - add r6,r6,r0,ror#6 @ h+=Sigma1(e) - and r2,r2,r11 - add r6,r6,r3 @ h+=K256[i] - eor r2,r2,r5 @ Ch(e,f,g) - eor r0,r7,r7,ror#11 - add r6,r6,r2 @ h+=Ch(e,f,g) -#if 21==31 - and r3,r3,#0xff - cmp r3,#0xf2 @ done? -#endif -#if 21<15 -# if __ARM_ARCH__>=7 - ldr r2,[r1],#4 @ prefetch -# else - ldrb r2,[r1,#3] -# endif - eor r3,r7,r8 @ a^b, b^c in next round -#else - ldr r2,[sp,#7*4] @ from future BODY_16_xx - eor r3,r7,r8 @ a^b, b^c in next round - ldr r1,[sp,#4*4] @ from future BODY_16_xx -#endif - eor r0,r0,r7,ror#20 @ Sigma0(a) - and r12,r12,r3 @ (b^c)&=(a^b) - add r10,r10,r6 @ d+=h - eor r12,r12,r8 @ Maj(a,b,c) - add r6,r6,r0,ror#2 @ h+=Sigma0(a) - @ add r6,r6,r12 @ h+=Maj(a,b,c) - @ ldr r2,[sp,#7*4] @ 22 - @ ldr r1,[sp,#4*4] - mov r0,r2,ror#7 - add r6,r6,r12 @ h+=Maj(a,b,c) from the past - mov r12,r1,ror#17 - eor r0,r0,r2,ror#18 - eor r12,r12,r1,ror#19 - eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) - ldr r2,[sp,#6*4] - eor r12,r12,r1,lsr#10 @ sigma1(X[i+14]) - ldr r1,[sp,#15*4] - - add r12,r12,r0 - eor r0,r10,r10,ror#5 @ from BODY_00_15 - add r2,r2,r12 - eor r0,r0,r10,ror#19 @ Sigma1(e) - add r2,r2,r1 @ X[i] - ldr r12,[r14],#4 @ *K256++ - add r5,r5,r2 @ h+=X[i] - str r2,[sp,#6*4] - eor r2,r11,r4 - add r5,r5,r0,ror#6 @ h+=Sigma1(e) - and r2,r2,r10 - add r5,r5,r12 @ h+=K256[i] - eor r2,r2,r4 @ Ch(e,f,g) - eor r0,r6,r6,ror#11 - add r5,r5,r2 @ h+=Ch(e,f,g) -#if 22==31 - and r12,r12,#0xff - cmp r12,#0xf2 @ done? -#endif -#if 22<15 -# if __ARM_ARCH__>=7 - ldr r2,[r1],#4 @ prefetch -# else - ldrb r2,[r1,#3] -# endif - eor r12,r6,r7 @ a^b, b^c in next round -#else - ldr r2,[sp,#8*4] @ from future BODY_16_xx - eor r12,r6,r7 @ a^b, b^c in next round - ldr r1,[sp,#5*4] @ from future BODY_16_xx -#endif - eor r0,r0,r6,ror#20 @ Sigma0(a) - and r3,r3,r12 @ (b^c)&=(a^b) - add r9,r9,r5 @ d+=h - eor r3,r3,r7 @ Maj(a,b,c) - add r5,r5,r0,ror#2 @ h+=Sigma0(a) - @ add r5,r5,r3 @ h+=Maj(a,b,c) - @ ldr r2,[sp,#8*4] @ 23 - @ ldr r1,[sp,#5*4] - mov r0,r2,ror#7 - add r5,r5,r3 @ h+=Maj(a,b,c) from the past - mov r3,r1,ror#17 - eor r0,r0,r2,ror#18 - eor r3,r3,r1,ror#19 - eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) - ldr r2,[sp,#7*4] - eor r3,r3,r1,lsr#10 @ sigma1(X[i+14]) - ldr r1,[sp,#0*4] - - add r3,r3,r0 - eor r0,r9,r9,ror#5 @ from BODY_00_15 - add r2,r2,r3 - eor r0,r0,r9,ror#19 @ Sigma1(e) - add r2,r2,r1 @ X[i] - ldr r3,[r14],#4 @ *K256++ - add r4,r4,r2 @ h+=X[i] - str r2,[sp,#7*4] - eor r2,r10,r11 - add r4,r4,r0,ror#6 @ h+=Sigma1(e) - and r2,r2,r9 - add r4,r4,r3 @ h+=K256[i] - eor r2,r2,r11 @ Ch(e,f,g) - eor r0,r5,r5,ror#11 - add r4,r4,r2 @ h+=Ch(e,f,g) -#if 23==31 - and r3,r3,#0xff - cmp r3,#0xf2 @ done? -#endif -#if 23<15 -# if __ARM_ARCH__>=7 - ldr r2,[r1],#4 @ prefetch -# else - ldrb r2,[r1,#3] -# endif - eor r3,r5,r6 @ a^b, b^c in next round -#else - ldr r2,[sp,#9*4] @ from future BODY_16_xx - eor r3,r5,r6 @ a^b, b^c in next round - ldr r1,[sp,#6*4] @ from future BODY_16_xx -#endif - eor r0,r0,r5,ror#20 @ Sigma0(a) - and r12,r12,r3 @ (b^c)&=(a^b) - add r8,r8,r4 @ d+=h - eor r12,r12,r6 @ Maj(a,b,c) - add r4,r4,r0,ror#2 @ h+=Sigma0(a) - @ add r4,r4,r12 @ h+=Maj(a,b,c) - @ ldr r2,[sp,#9*4] @ 24 - @ ldr r1,[sp,#6*4] - mov r0,r2,ror#7 - add r4,r4,r12 @ h+=Maj(a,b,c) from the past - mov r12,r1,ror#17 - eor r0,r0,r2,ror#18 - eor r12,r12,r1,ror#19 - eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) - ldr r2,[sp,#8*4] - eor r12,r12,r1,lsr#10 @ sigma1(X[i+14]) - ldr r1,[sp,#1*4] - - add r12,r12,r0 - eor r0,r8,r8,ror#5 @ from BODY_00_15 - add r2,r2,r12 - eor r0,r0,r8,ror#19 @ Sigma1(e) - add r2,r2,r1 @ X[i] - ldr r12,[r14],#4 @ *K256++ - add r11,r11,r2 @ h+=X[i] - str r2,[sp,#8*4] - eor r2,r9,r10 - add r11,r11,r0,ror#6 @ h+=Sigma1(e) - and r2,r2,r8 - add r11,r11,r12 @ h+=K256[i] - eor r2,r2,r10 @ Ch(e,f,g) - eor r0,r4,r4,ror#11 - add r11,r11,r2 @ h+=Ch(e,f,g) -#if 24==31 - and r12,r12,#0xff - cmp r12,#0xf2 @ done? -#endif -#if 24<15 -# if __ARM_ARCH__>=7 - ldr r2,[r1],#4 @ prefetch -# else - ldrb r2,[r1,#3] -# endif - eor r12,r4,r5 @ a^b, b^c in next round -#else - ldr r2,[sp,#10*4] @ from future BODY_16_xx - eor r12,r4,r5 @ a^b, b^c in next round - ldr r1,[sp,#7*4] @ from future BODY_16_xx -#endif - eor r0,r0,r4,ror#20 @ Sigma0(a) - and r3,r3,r12 @ (b^c)&=(a^b) - add r7,r7,r11 @ d+=h - eor r3,r3,r5 @ Maj(a,b,c) - add r11,r11,r0,ror#2 @ h+=Sigma0(a) - @ add r11,r11,r3 @ h+=Maj(a,b,c) - @ ldr r2,[sp,#10*4] @ 25 - @ ldr r1,[sp,#7*4] - mov r0,r2,ror#7 - add r11,r11,r3 @ h+=Maj(a,b,c) from the past - mov r3,r1,ror#17 - eor r0,r0,r2,ror#18 - eor r3,r3,r1,ror#19 - eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) - ldr r2,[sp,#9*4] - eor r3,r3,r1,lsr#10 @ sigma1(X[i+14]) - ldr r1,[sp,#2*4] - - add r3,r3,r0 - eor r0,r7,r7,ror#5 @ from BODY_00_15 - add r2,r2,r3 - eor r0,r0,r7,ror#19 @ Sigma1(e) - add r2,r2,r1 @ X[i] - ldr r3,[r14],#4 @ *K256++ - add r10,r10,r2 @ h+=X[i] - str r2,[sp,#9*4] - eor r2,r8,r9 - add r10,r10,r0,ror#6 @ h+=Sigma1(e) - and r2,r2,r7 - add r10,r10,r3 @ h+=K256[i] - eor r2,r2,r9 @ Ch(e,f,g) - eor r0,r11,r11,ror#11 - add r10,r10,r2 @ h+=Ch(e,f,g) -#if 25==31 - and r3,r3,#0xff - cmp r3,#0xf2 @ done? -#endif -#if 25<15 -# if __ARM_ARCH__>=7 - ldr r2,[r1],#4 @ prefetch -# else - ldrb r2,[r1,#3] -# endif - eor r3,r11,r4 @ a^b, b^c in next round -#else - ldr r2,[sp,#11*4] @ from future BODY_16_xx - eor r3,r11,r4 @ a^b, b^c in next round - ldr r1,[sp,#8*4] @ from future BODY_16_xx -#endif - eor r0,r0,r11,ror#20 @ Sigma0(a) - and r12,r12,r3 @ (b^c)&=(a^b) - add r6,r6,r10 @ d+=h - eor r12,r12,r4 @ Maj(a,b,c) - add r10,r10,r0,ror#2 @ h+=Sigma0(a) - @ add r10,r10,r12 @ h+=Maj(a,b,c) - @ ldr r2,[sp,#11*4] @ 26 - @ ldr r1,[sp,#8*4] - mov r0,r2,ror#7 - add r10,r10,r12 @ h+=Maj(a,b,c) from the past - mov r12,r1,ror#17 - eor r0,r0,r2,ror#18 - eor r12,r12,r1,ror#19 - eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) - ldr r2,[sp,#10*4] - eor r12,r12,r1,lsr#10 @ sigma1(X[i+14]) - ldr r1,[sp,#3*4] - - add r12,r12,r0 - eor r0,r6,r6,ror#5 @ from BODY_00_15 - add r2,r2,r12 - eor r0,r0,r6,ror#19 @ Sigma1(e) - add r2,r2,r1 @ X[i] - ldr r12,[r14],#4 @ *K256++ - add r9,r9,r2 @ h+=X[i] - str r2,[sp,#10*4] - eor r2,r7,r8 - add r9,r9,r0,ror#6 @ h+=Sigma1(e) - and r2,r2,r6 - add r9,r9,r12 @ h+=K256[i] - eor r2,r2,r8 @ Ch(e,f,g) - eor r0,r10,r10,ror#11 - add r9,r9,r2 @ h+=Ch(e,f,g) -#if 26==31 - and r12,r12,#0xff - cmp r12,#0xf2 @ done? -#endif -#if 26<15 -# if __ARM_ARCH__>=7 - ldr r2,[r1],#4 @ prefetch -# else - ldrb r2,[r1,#3] -# endif - eor r12,r10,r11 @ a^b, b^c in next round -#else - ldr r2,[sp,#12*4] @ from future BODY_16_xx - eor r12,r10,r11 @ a^b, b^c in next round - ldr r1,[sp,#9*4] @ from future BODY_16_xx -#endif - eor r0,r0,r10,ror#20 @ Sigma0(a) - and r3,r3,r12 @ (b^c)&=(a^b) - add r5,r5,r9 @ d+=h - eor r3,r3,r11 @ Maj(a,b,c) - add r9,r9,r0,ror#2 @ h+=Sigma0(a) - @ add r9,r9,r3 @ h+=Maj(a,b,c) - @ ldr r2,[sp,#12*4] @ 27 - @ ldr r1,[sp,#9*4] - mov r0,r2,ror#7 - add r9,r9,r3 @ h+=Maj(a,b,c) from the past - mov r3,r1,ror#17 - eor r0,r0,r2,ror#18 - eor r3,r3,r1,ror#19 - eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) - ldr r2,[sp,#11*4] - eor r3,r3,r1,lsr#10 @ sigma1(X[i+14]) - ldr r1,[sp,#4*4] - - add r3,r3,r0 - eor r0,r5,r5,ror#5 @ from BODY_00_15 - add r2,r2,r3 - eor r0,r0,r5,ror#19 @ Sigma1(e) - add r2,r2,r1 @ X[i] - ldr r3,[r14],#4 @ *K256++ - add r8,r8,r2 @ h+=X[i] - str r2,[sp,#11*4] - eor r2,r6,r7 - add r8,r8,r0,ror#6 @ h+=Sigma1(e) - and r2,r2,r5 - add r8,r8,r3 @ h+=K256[i] - eor r2,r2,r7 @ Ch(e,f,g) - eor r0,r9,r9,ror#11 - add r8,r8,r2 @ h+=Ch(e,f,g) -#if 27==31 - and r3,r3,#0xff - cmp r3,#0xf2 @ done? -#endif -#if 27<15 -# if __ARM_ARCH__>=7 - ldr r2,[r1],#4 @ prefetch -# else - ldrb r2,[r1,#3] -# endif - eor r3,r9,r10 @ a^b, b^c in next round -#else - ldr r2,[sp,#13*4] @ from future BODY_16_xx - eor r3,r9,r10 @ a^b, b^c in next round - ldr r1,[sp,#10*4] @ from future BODY_16_xx -#endif - eor r0,r0,r9,ror#20 @ Sigma0(a) - and r12,r12,r3 @ (b^c)&=(a^b) - add r4,r4,r8 @ d+=h - eor r12,r12,r10 @ Maj(a,b,c) - add r8,r8,r0,ror#2 @ h+=Sigma0(a) - @ add r8,r8,r12 @ h+=Maj(a,b,c) - @ ldr r2,[sp,#13*4] @ 28 - @ ldr r1,[sp,#10*4] - mov r0,r2,ror#7 - add r8,r8,r12 @ h+=Maj(a,b,c) from the past - mov r12,r1,ror#17 - eor r0,r0,r2,ror#18 - eor r12,r12,r1,ror#19 - eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) - ldr r2,[sp,#12*4] - eor r12,r12,r1,lsr#10 @ sigma1(X[i+14]) - ldr r1,[sp,#5*4] - - add r12,r12,r0 - eor r0,r4,r4,ror#5 @ from BODY_00_15 - add r2,r2,r12 - eor r0,r0,r4,ror#19 @ Sigma1(e) - add r2,r2,r1 @ X[i] - ldr r12,[r14],#4 @ *K256++ - add r7,r7,r2 @ h+=X[i] - str r2,[sp,#12*4] - eor r2,r5,r6 - add r7,r7,r0,ror#6 @ h+=Sigma1(e) - and r2,r2,r4 - add r7,r7,r12 @ h+=K256[i] - eor r2,r2,r6 @ Ch(e,f,g) - eor r0,r8,r8,ror#11 - add r7,r7,r2 @ h+=Ch(e,f,g) -#if 28==31 - and r12,r12,#0xff - cmp r12,#0xf2 @ done? -#endif -#if 28<15 -# if __ARM_ARCH__>=7 - ldr r2,[r1],#4 @ prefetch -# else - ldrb r2,[r1,#3] -# endif - eor r12,r8,r9 @ a^b, b^c in next round -#else - ldr r2,[sp,#14*4] @ from future BODY_16_xx - eor r12,r8,r9 @ a^b, b^c in next round - ldr r1,[sp,#11*4] @ from future BODY_16_xx -#endif - eor r0,r0,r8,ror#20 @ Sigma0(a) - and r3,r3,r12 @ (b^c)&=(a^b) - add r11,r11,r7 @ d+=h - eor r3,r3,r9 @ Maj(a,b,c) - add r7,r7,r0,ror#2 @ h+=Sigma0(a) - @ add r7,r7,r3 @ h+=Maj(a,b,c) - @ ldr r2,[sp,#14*4] @ 29 - @ ldr r1,[sp,#11*4] - mov r0,r2,ror#7 - add r7,r7,r3 @ h+=Maj(a,b,c) from the past - mov r3,r1,ror#17 - eor r0,r0,r2,ror#18 - eor r3,r3,r1,ror#19 - eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) - ldr r2,[sp,#13*4] - eor r3,r3,r1,lsr#10 @ sigma1(X[i+14]) - ldr r1,[sp,#6*4] - - add r3,r3,r0 - eor r0,r11,r11,ror#5 @ from BODY_00_15 - add r2,r2,r3 - eor r0,r0,r11,ror#19 @ Sigma1(e) - add r2,r2,r1 @ X[i] - ldr r3,[r14],#4 @ *K256++ - add r6,r6,r2 @ h+=X[i] - str r2,[sp,#13*4] - eor r2,r4,r5 - add r6,r6,r0,ror#6 @ h+=Sigma1(e) - and r2,r2,r11 - add r6,r6,r3 @ h+=K256[i] - eor r2,r2,r5 @ Ch(e,f,g) - eor r0,r7,r7,ror#11 - add r6,r6,r2 @ h+=Ch(e,f,g) -#if 29==31 - and r3,r3,#0xff - cmp r3,#0xf2 @ done? -#endif -#if 29<15 -# if __ARM_ARCH__>=7 - ldr r2,[r1],#4 @ prefetch -# else - ldrb r2,[r1,#3] -# endif - eor r3,r7,r8 @ a^b, b^c in next round -#else - ldr r2,[sp,#15*4] @ from future BODY_16_xx - eor r3,r7,r8 @ a^b, b^c in next round - ldr r1,[sp,#12*4] @ from future BODY_16_xx -#endif - eor r0,r0,r7,ror#20 @ Sigma0(a) - and r12,r12,r3 @ (b^c)&=(a^b) - add r10,r10,r6 @ d+=h - eor r12,r12,r8 @ Maj(a,b,c) - add r6,r6,r0,ror#2 @ h+=Sigma0(a) - @ add r6,r6,r12 @ h+=Maj(a,b,c) - @ ldr r2,[sp,#15*4] @ 30 - @ ldr r1,[sp,#12*4] - mov r0,r2,ror#7 - add r6,r6,r12 @ h+=Maj(a,b,c) from the past - mov r12,r1,ror#17 - eor r0,r0,r2,ror#18 - eor r12,r12,r1,ror#19 - eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) - ldr r2,[sp,#14*4] - eor r12,r12,r1,lsr#10 @ sigma1(X[i+14]) - ldr r1,[sp,#7*4] - - add r12,r12,r0 - eor r0,r10,r10,ror#5 @ from BODY_00_15 - add r2,r2,r12 - eor r0,r0,r10,ror#19 @ Sigma1(e) - add r2,r2,r1 @ X[i] - ldr r12,[r14],#4 @ *K256++ - add r5,r5,r2 @ h+=X[i] - str r2,[sp,#14*4] - eor r2,r11,r4 - add r5,r5,r0,ror#6 @ h+=Sigma1(e) - and r2,r2,r10 - add r5,r5,r12 @ h+=K256[i] - eor r2,r2,r4 @ Ch(e,f,g) - eor r0,r6,r6,ror#11 - add r5,r5,r2 @ h+=Ch(e,f,g) -#if 30==31 - and r12,r12,#0xff - cmp r12,#0xf2 @ done? -#endif -#if 30<15 -# if __ARM_ARCH__>=7 - ldr r2,[r1],#4 @ prefetch -# else - ldrb r2,[r1,#3] -# endif - eor r12,r6,r7 @ a^b, b^c in next round -#else - ldr r2,[sp,#0*4] @ from future BODY_16_xx - eor r12,r6,r7 @ a^b, b^c in next round - ldr r1,[sp,#13*4] @ from future BODY_16_xx -#endif - eor r0,r0,r6,ror#20 @ Sigma0(a) - and r3,r3,r12 @ (b^c)&=(a^b) - add r9,r9,r5 @ d+=h - eor r3,r3,r7 @ Maj(a,b,c) - add r5,r5,r0,ror#2 @ h+=Sigma0(a) - @ add r5,r5,r3 @ h+=Maj(a,b,c) - @ ldr r2,[sp,#0*4] @ 31 - @ ldr r1,[sp,#13*4] - mov r0,r2,ror#7 - add r5,r5,r3 @ h+=Maj(a,b,c) from the past - mov r3,r1,ror#17 - eor r0,r0,r2,ror#18 - eor r3,r3,r1,ror#19 - eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) - ldr r2,[sp,#15*4] - eor r3,r3,r1,lsr#10 @ sigma1(X[i+14]) - ldr r1,[sp,#8*4] - - add r3,r3,r0 - eor r0,r9,r9,ror#5 @ from BODY_00_15 - add r2,r2,r3 - eor r0,r0,r9,ror#19 @ Sigma1(e) - add r2,r2,r1 @ X[i] - ldr r3,[r14],#4 @ *K256++ - add r4,r4,r2 @ h+=X[i] - str r2,[sp,#15*4] - eor r2,r10,r11 - add r4,r4,r0,ror#6 @ h+=Sigma1(e) - and r2,r2,r9 - add r4,r4,r3 @ h+=K256[i] - eor r2,r2,r11 @ Ch(e,f,g) - eor r0,r5,r5,ror#11 - add r4,r4,r2 @ h+=Ch(e,f,g) -#if 31==31 - and r3,r3,#0xff - cmp r3,#0xf2 @ done? -#endif -#if 31<15 -# if __ARM_ARCH__>=7 - ldr r2,[r1],#4 @ prefetch -# else - ldrb r2,[r1,#3] -# endif - eor r3,r5,r6 @ a^b, b^c in next round -#else - ldr r2,[sp,#1*4] @ from future BODY_16_xx - eor r3,r5,r6 @ a^b, b^c in next round - ldr r1,[sp,#14*4] @ from future BODY_16_xx -#endif - eor r0,r0,r5,ror#20 @ Sigma0(a) - and r12,r12,r3 @ (b^c)&=(a^b) - add r8,r8,r4 @ d+=h - eor r12,r12,r6 @ Maj(a,b,c) - add r4,r4,r0,ror#2 @ h+=Sigma0(a) - @ add r4,r4,r12 @ h+=Maj(a,b,c) -#if __ARM_ARCH__>=7 - ite eq @ Thumb2 thing, sanity check in ARM -#endif - ldreq r3,[sp,#16*4] @ pull ctx - bne Lrounds_16_xx - - add r4,r4,r12 @ h+=Maj(a,b,c) from the past - ldr r0,[r3,#0] - ldr r2,[r3,#4] - ldr r12,[r3,#8] - add r4,r4,r0 - ldr r0,[r3,#12] - add r5,r5,r2 - ldr r2,[r3,#16] - add r6,r6,r12 - ldr r12,[r3,#20] - add r7,r7,r0 - ldr r0,[r3,#24] - add r8,r8,r2 - ldr r2,[r3,#28] - add r9,r9,r12 - ldr r1,[sp,#17*4] @ pull inp - ldr r12,[sp,#18*4] @ pull inp+len - add r10,r10,r0 - add r11,r11,r2 - stmia r3,{r4,r5,r6,r7,r8,r9,r10,r11} - cmp r1,r12 - sub r14,r14,#256 @ rewind Ktbl - bne Loop - - add sp,sp,#19*4 @ destroy frame -#if __ARM_ARCH__>=5 - ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,pc} -#else - ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,lr} - tst lr,#1 - moveq pc,lr @ be binary compatible with V4, yet -.word 0xe12fff1e @ interoperable with Thumb ISA:-) -#endif - -#if __ARM_MAX_ARCH__>=7 - - - -#ifdef __thumb2__ -.thumb_func sha256_block_data_order_neon -#endif -.align 5 -.skip 16 -sha256_block_data_order_neon: -LNEON: - stmdb sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} - - sub r11,sp,#16*4+16 - adr r14,K256 - bic r11,r11,#15 @ align for 128-bit stores - mov r12,sp - mov sp,r11 @ alloca - add r2,r1,r2,lsl#6 @ len to point at the end of inp - - vld1.8 {q0},[r1]! - vld1.8 {q1},[r1]! - vld1.8 {q2},[r1]! - vld1.8 {q3},[r1]! - vld1.32 {q8},[r14,:128]! - vld1.32 {q9},[r14,:128]! - vld1.32 {q10},[r14,:128]! - vld1.32 {q11},[r14,:128]! - vrev32.8 q0,q0 @ yes, even on - str r0,[sp,#64] - vrev32.8 q1,q1 @ big-endian - str r1,[sp,#68] - mov r1,sp - vrev32.8 q2,q2 - str r2,[sp,#72] - vrev32.8 q3,q3 - str r12,[sp,#76] @ save original sp - vadd.i32 q8,q8,q0 - vadd.i32 q9,q9,q1 - vst1.32 {q8},[r1,:128]! - vadd.i32 q10,q10,q2 - vst1.32 {q9},[r1,:128]! - vadd.i32 q11,q11,q3 - vst1.32 {q10},[r1,:128]! - vst1.32 {q11},[r1,:128]! - - ldmia r0,{r4,r5,r6,r7,r8,r9,r10,r11} - sub r1,r1,#64 - ldr r2,[sp,#0] - eor r12,r12,r12 - eor r3,r5,r6 - b L_00_48 - -.align 4 -L_00_48: - vext.8 q8,q0,q1,#4 - add r11,r11,r2 - eor r2,r9,r10 - eor r0,r8,r8,ror#5 - vext.8 q9,q2,q3,#4 - add r4,r4,r12 - and r2,r2,r8 - eor r12,r0,r8,ror#19 - vshr.u32 q10,q8,#7 - eor r0,r4,r4,ror#11 - eor r2,r2,r10 - vadd.i32 q0,q0,q9 - add r11,r11,r12,ror#6 - eor r12,r4,r5 - vshr.u32 q9,q8,#3 - eor r0,r0,r4,ror#20 - add r11,r11,r2 - vsli.32 q10,q8,#25 - ldr r2,[sp,#4] - and r3,r3,r12 - vshr.u32 q11,q8,#18 - add r7,r7,r11 - add r11,r11,r0,ror#2 - eor r3,r3,r5 - veor q9,q9,q10 - add r10,r10,r2 - vsli.32 q11,q8,#14 - eor r2,r8,r9 - eor r0,r7,r7,ror#5 - vshr.u32 d24,d7,#17 - add r11,r11,r3 - and r2,r2,r7 - veor q9,q9,q11 - eor r3,r0,r7,ror#19 - eor r0,r11,r11,ror#11 - vsli.32 d24,d7,#15 - eor r2,r2,r9 - add r10,r10,r3,ror#6 - vshr.u32 d25,d7,#10 - eor r3,r11,r4 - eor r0,r0,r11,ror#20 - vadd.i32 q0,q0,q9 - add r10,r10,r2 - ldr r2,[sp,#8] - veor d25,d25,d24 - and r12,r12,r3 - add r6,r6,r10 - vshr.u32 d24,d7,#19 - add r10,r10,r0,ror#2 - eor r12,r12,r4 - vsli.32 d24,d7,#13 - add r9,r9,r2 - eor r2,r7,r8 - veor d25,d25,d24 - eor r0,r6,r6,ror#5 - add r10,r10,r12 - vadd.i32 d0,d0,d25 - and r2,r2,r6 - eor r12,r0,r6,ror#19 - vshr.u32 d24,d0,#17 - eor r0,r10,r10,ror#11 - eor r2,r2,r8 - vsli.32 d24,d0,#15 - add r9,r9,r12,ror#6 - eor r12,r10,r11 - vshr.u32 d25,d0,#10 - eor r0,r0,r10,ror#20 - add r9,r9,r2 - veor d25,d25,d24 - ldr r2,[sp,#12] - and r3,r3,r12 - vshr.u32 d24,d0,#19 - add r5,r5,r9 - add r9,r9,r0,ror#2 - eor r3,r3,r11 - vld1.32 {q8},[r14,:128]! - add r8,r8,r2 - vsli.32 d24,d0,#13 - eor r2,r6,r7 - eor r0,r5,r5,ror#5 - veor d25,d25,d24 - add r9,r9,r3 - and r2,r2,r5 - vadd.i32 d1,d1,d25 - eor r3,r0,r5,ror#19 - eor r0,r9,r9,ror#11 - vadd.i32 q8,q8,q0 - eor r2,r2,r7 - add r8,r8,r3,ror#6 - eor r3,r9,r10 - eor r0,r0,r9,ror#20 - add r8,r8,r2 - ldr r2,[sp,#16] - and r12,r12,r3 - add r4,r4,r8 - vst1.32 {q8},[r1,:128]! - add r8,r8,r0,ror#2 - eor r12,r12,r10 - vext.8 q8,q1,q2,#4 - add r7,r7,r2 - eor r2,r5,r6 - eor r0,r4,r4,ror#5 - vext.8 q9,q3,q0,#4 - add r8,r8,r12 - and r2,r2,r4 - eor r12,r0,r4,ror#19 - vshr.u32 q10,q8,#7 - eor r0,r8,r8,ror#11 - eor r2,r2,r6 - vadd.i32 q1,q1,q9 - add r7,r7,r12,ror#6 - eor r12,r8,r9 - vshr.u32 q9,q8,#3 - eor r0,r0,r8,ror#20 - add r7,r7,r2 - vsli.32 q10,q8,#25 - ldr r2,[sp,#20] - and r3,r3,r12 - vshr.u32 q11,q8,#18 - add r11,r11,r7 - add r7,r7,r0,ror#2 - eor r3,r3,r9 - veor q9,q9,q10 - add r6,r6,r2 - vsli.32 q11,q8,#14 - eor r2,r4,r5 - eor r0,r11,r11,ror#5 - vshr.u32 d24,d1,#17 - add r7,r7,r3 - and r2,r2,r11 - veor q9,q9,q11 - eor r3,r0,r11,ror#19 - eor r0,r7,r7,ror#11 - vsli.32 d24,d1,#15 - eor r2,r2,r5 - add r6,r6,r3,ror#6 - vshr.u32 d25,d1,#10 - eor r3,r7,r8 - eor r0,r0,r7,ror#20 - vadd.i32 q1,q1,q9 - add r6,r6,r2 - ldr r2,[sp,#24] - veor d25,d25,d24 - and r12,r12,r3 - add r10,r10,r6 - vshr.u32 d24,d1,#19 - add r6,r6,r0,ror#2 - eor r12,r12,r8 - vsli.32 d24,d1,#13 - add r5,r5,r2 - eor r2,r11,r4 - veor d25,d25,d24 - eor r0,r10,r10,ror#5 - add r6,r6,r12 - vadd.i32 d2,d2,d25 - and r2,r2,r10 - eor r12,r0,r10,ror#19 - vshr.u32 d24,d2,#17 - eor r0,r6,r6,ror#11 - eor r2,r2,r4 - vsli.32 d24,d2,#15 - add r5,r5,r12,ror#6 - eor r12,r6,r7 - vshr.u32 d25,d2,#10 - eor r0,r0,r6,ror#20 - add r5,r5,r2 - veor d25,d25,d24 - ldr r2,[sp,#28] - and r3,r3,r12 - vshr.u32 d24,d2,#19 - add r9,r9,r5 - add r5,r5,r0,ror#2 - eor r3,r3,r7 - vld1.32 {q8},[r14,:128]! - add r4,r4,r2 - vsli.32 d24,d2,#13 - eor r2,r10,r11 - eor r0,r9,r9,ror#5 - veor d25,d25,d24 - add r5,r5,r3 - and r2,r2,r9 - vadd.i32 d3,d3,d25 - eor r3,r0,r9,ror#19 - eor r0,r5,r5,ror#11 - vadd.i32 q8,q8,q1 - eor r2,r2,r11 - add r4,r4,r3,ror#6 - eor r3,r5,r6 - eor r0,r0,r5,ror#20 - add r4,r4,r2 - ldr r2,[sp,#32] - and r12,r12,r3 - add r8,r8,r4 - vst1.32 {q8},[r1,:128]! - add r4,r4,r0,ror#2 - eor r12,r12,r6 - vext.8 q8,q2,q3,#4 - add r11,r11,r2 - eor r2,r9,r10 - eor r0,r8,r8,ror#5 - vext.8 q9,q0,q1,#4 - add r4,r4,r12 - and r2,r2,r8 - eor r12,r0,r8,ror#19 - vshr.u32 q10,q8,#7 - eor r0,r4,r4,ror#11 - eor r2,r2,r10 - vadd.i32 q2,q2,q9 - add r11,r11,r12,ror#6 - eor r12,r4,r5 - vshr.u32 q9,q8,#3 - eor r0,r0,r4,ror#20 - add r11,r11,r2 - vsli.32 q10,q8,#25 - ldr r2,[sp,#36] - and r3,r3,r12 - vshr.u32 q11,q8,#18 - add r7,r7,r11 - add r11,r11,r0,ror#2 - eor r3,r3,r5 - veor q9,q9,q10 - add r10,r10,r2 - vsli.32 q11,q8,#14 - eor r2,r8,r9 - eor r0,r7,r7,ror#5 - vshr.u32 d24,d3,#17 - add r11,r11,r3 - and r2,r2,r7 - veor q9,q9,q11 - eor r3,r0,r7,ror#19 - eor r0,r11,r11,ror#11 - vsli.32 d24,d3,#15 - eor r2,r2,r9 - add r10,r10,r3,ror#6 - vshr.u32 d25,d3,#10 - eor r3,r11,r4 - eor r0,r0,r11,ror#20 - vadd.i32 q2,q2,q9 - add r10,r10,r2 - ldr r2,[sp,#40] - veor d25,d25,d24 - and r12,r12,r3 - add r6,r6,r10 - vshr.u32 d24,d3,#19 - add r10,r10,r0,ror#2 - eor r12,r12,r4 - vsli.32 d24,d3,#13 - add r9,r9,r2 - eor r2,r7,r8 - veor d25,d25,d24 - eor r0,r6,r6,ror#5 - add r10,r10,r12 - vadd.i32 d4,d4,d25 - and r2,r2,r6 - eor r12,r0,r6,ror#19 - vshr.u32 d24,d4,#17 - eor r0,r10,r10,ror#11 - eor r2,r2,r8 - vsli.32 d24,d4,#15 - add r9,r9,r12,ror#6 - eor r12,r10,r11 - vshr.u32 d25,d4,#10 - eor r0,r0,r10,ror#20 - add r9,r9,r2 - veor d25,d25,d24 - ldr r2,[sp,#44] - and r3,r3,r12 - vshr.u32 d24,d4,#19 - add r5,r5,r9 - add r9,r9,r0,ror#2 - eor r3,r3,r11 - vld1.32 {q8},[r14,:128]! - add r8,r8,r2 - vsli.32 d24,d4,#13 - eor r2,r6,r7 - eor r0,r5,r5,ror#5 - veor d25,d25,d24 - add r9,r9,r3 - and r2,r2,r5 - vadd.i32 d5,d5,d25 - eor r3,r0,r5,ror#19 - eor r0,r9,r9,ror#11 - vadd.i32 q8,q8,q2 - eor r2,r2,r7 - add r8,r8,r3,ror#6 - eor r3,r9,r10 - eor r0,r0,r9,ror#20 - add r8,r8,r2 - ldr r2,[sp,#48] - and r12,r12,r3 - add r4,r4,r8 - vst1.32 {q8},[r1,:128]! - add r8,r8,r0,ror#2 - eor r12,r12,r10 - vext.8 q8,q3,q0,#4 - add r7,r7,r2 - eor r2,r5,r6 - eor r0,r4,r4,ror#5 - vext.8 q9,q1,q2,#4 - add r8,r8,r12 - and r2,r2,r4 - eor r12,r0,r4,ror#19 - vshr.u32 q10,q8,#7 - eor r0,r8,r8,ror#11 - eor r2,r2,r6 - vadd.i32 q3,q3,q9 - add r7,r7,r12,ror#6 - eor r12,r8,r9 - vshr.u32 q9,q8,#3 - eor r0,r0,r8,ror#20 - add r7,r7,r2 - vsli.32 q10,q8,#25 - ldr r2,[sp,#52] - and r3,r3,r12 - vshr.u32 q11,q8,#18 - add r11,r11,r7 - add r7,r7,r0,ror#2 - eor r3,r3,r9 - veor q9,q9,q10 - add r6,r6,r2 - vsli.32 q11,q8,#14 - eor r2,r4,r5 - eor r0,r11,r11,ror#5 - vshr.u32 d24,d5,#17 - add r7,r7,r3 - and r2,r2,r11 - veor q9,q9,q11 - eor r3,r0,r11,ror#19 - eor r0,r7,r7,ror#11 - vsli.32 d24,d5,#15 - eor r2,r2,r5 - add r6,r6,r3,ror#6 - vshr.u32 d25,d5,#10 - eor r3,r7,r8 - eor r0,r0,r7,ror#20 - vadd.i32 q3,q3,q9 - add r6,r6,r2 - ldr r2,[sp,#56] - veor d25,d25,d24 - and r12,r12,r3 - add r10,r10,r6 - vshr.u32 d24,d5,#19 - add r6,r6,r0,ror#2 - eor r12,r12,r8 - vsli.32 d24,d5,#13 - add r5,r5,r2 - eor r2,r11,r4 - veor d25,d25,d24 - eor r0,r10,r10,ror#5 - add r6,r6,r12 - vadd.i32 d6,d6,d25 - and r2,r2,r10 - eor r12,r0,r10,ror#19 - vshr.u32 d24,d6,#17 - eor r0,r6,r6,ror#11 - eor r2,r2,r4 - vsli.32 d24,d6,#15 - add r5,r5,r12,ror#6 - eor r12,r6,r7 - vshr.u32 d25,d6,#10 - eor r0,r0,r6,ror#20 - add r5,r5,r2 - veor d25,d25,d24 - ldr r2,[sp,#60] - and r3,r3,r12 - vshr.u32 d24,d6,#19 - add r9,r9,r5 - add r5,r5,r0,ror#2 - eor r3,r3,r7 - vld1.32 {q8},[r14,:128]! - add r4,r4,r2 - vsli.32 d24,d6,#13 - eor r2,r10,r11 - eor r0,r9,r9,ror#5 - veor d25,d25,d24 - add r5,r5,r3 - and r2,r2,r9 - vadd.i32 d7,d7,d25 - eor r3,r0,r9,ror#19 - eor r0,r5,r5,ror#11 - vadd.i32 q8,q8,q3 - eor r2,r2,r11 - add r4,r4,r3,ror#6 - eor r3,r5,r6 - eor r0,r0,r5,ror#20 - add r4,r4,r2 - ldr r2,[r14] - and r12,r12,r3 - add r8,r8,r4 - vst1.32 {q8},[r1,:128]! - add r4,r4,r0,ror#2 - eor r12,r12,r6 - teq r2,#0 @ check for K256 terminator - ldr r2,[sp,#0] - sub r1,r1,#64 - bne L_00_48 - - ldr r1,[sp,#68] - ldr r0,[sp,#72] - sub r14,r14,#256 @ rewind r14 - teq r1,r0 - it eq - subeq r1,r1,#64 @ avoid SEGV - vld1.8 {q0},[r1]! @ load next input block - vld1.8 {q1},[r1]! - vld1.8 {q2},[r1]! - vld1.8 {q3},[r1]! - it ne - strne r1,[sp,#68] - mov r1,sp - add r11,r11,r2 - eor r2,r9,r10 - eor r0,r8,r8,ror#5 - add r4,r4,r12 - vld1.32 {q8},[r14,:128]! - and r2,r2,r8 - eor r12,r0,r8,ror#19 - eor r0,r4,r4,ror#11 - eor r2,r2,r10 - vrev32.8 q0,q0 - add r11,r11,r12,ror#6 - eor r12,r4,r5 - eor r0,r0,r4,ror#20 - add r11,r11,r2 - vadd.i32 q8,q8,q0 - ldr r2,[sp,#4] - and r3,r3,r12 - add r7,r7,r11 - add r11,r11,r0,ror#2 - eor r3,r3,r5 - add r10,r10,r2 - eor r2,r8,r9 - eor r0,r7,r7,ror#5 - add r11,r11,r3 - and r2,r2,r7 - eor r3,r0,r7,ror#19 - eor r0,r11,r11,ror#11 - eor r2,r2,r9 - add r10,r10,r3,ror#6 - eor r3,r11,r4 - eor r0,r0,r11,ror#20 - add r10,r10,r2 - ldr r2,[sp,#8] - and r12,r12,r3 - add r6,r6,r10 - add r10,r10,r0,ror#2 - eor r12,r12,r4 - add r9,r9,r2 - eor r2,r7,r8 - eor r0,r6,r6,ror#5 - add r10,r10,r12 - and r2,r2,r6 - eor r12,r0,r6,ror#19 - eor r0,r10,r10,ror#11 - eor r2,r2,r8 - add r9,r9,r12,ror#6 - eor r12,r10,r11 - eor r0,r0,r10,ror#20 - add r9,r9,r2 - ldr r2,[sp,#12] - and r3,r3,r12 - add r5,r5,r9 - add r9,r9,r0,ror#2 - eor r3,r3,r11 - add r8,r8,r2 - eor r2,r6,r7 - eor r0,r5,r5,ror#5 - add r9,r9,r3 - and r2,r2,r5 - eor r3,r0,r5,ror#19 - eor r0,r9,r9,ror#11 - eor r2,r2,r7 - add r8,r8,r3,ror#6 - eor r3,r9,r10 - eor r0,r0,r9,ror#20 - add r8,r8,r2 - ldr r2,[sp,#16] - and r12,r12,r3 - add r4,r4,r8 - add r8,r8,r0,ror#2 - eor r12,r12,r10 - vst1.32 {q8},[r1,:128]! - add r7,r7,r2 - eor r2,r5,r6 - eor r0,r4,r4,ror#5 - add r8,r8,r12 - vld1.32 {q8},[r14,:128]! - and r2,r2,r4 - eor r12,r0,r4,ror#19 - eor r0,r8,r8,ror#11 - eor r2,r2,r6 - vrev32.8 q1,q1 - add r7,r7,r12,ror#6 - eor r12,r8,r9 - eor r0,r0,r8,ror#20 - add r7,r7,r2 - vadd.i32 q8,q8,q1 - ldr r2,[sp,#20] - and r3,r3,r12 - add r11,r11,r7 - add r7,r7,r0,ror#2 - eor r3,r3,r9 - add r6,r6,r2 - eor r2,r4,r5 - eor r0,r11,r11,ror#5 - add r7,r7,r3 - and r2,r2,r11 - eor r3,r0,r11,ror#19 - eor r0,r7,r7,ror#11 - eor r2,r2,r5 - add r6,r6,r3,ror#6 - eor r3,r7,r8 - eor r0,r0,r7,ror#20 - add r6,r6,r2 - ldr r2,[sp,#24] - and r12,r12,r3 - add r10,r10,r6 - add r6,r6,r0,ror#2 - eor r12,r12,r8 - add r5,r5,r2 - eor r2,r11,r4 - eor r0,r10,r10,ror#5 - add r6,r6,r12 - and r2,r2,r10 - eor r12,r0,r10,ror#19 - eor r0,r6,r6,ror#11 - eor r2,r2,r4 - add r5,r5,r12,ror#6 - eor r12,r6,r7 - eor r0,r0,r6,ror#20 - add r5,r5,r2 - ldr r2,[sp,#28] - and r3,r3,r12 - add r9,r9,r5 - add r5,r5,r0,ror#2 - eor r3,r3,r7 - add r4,r4,r2 - eor r2,r10,r11 - eor r0,r9,r9,ror#5 - add r5,r5,r3 - and r2,r2,r9 - eor r3,r0,r9,ror#19 - eor r0,r5,r5,ror#11 - eor r2,r2,r11 - add r4,r4,r3,ror#6 - eor r3,r5,r6 - eor r0,r0,r5,ror#20 - add r4,r4,r2 - ldr r2,[sp,#32] - and r12,r12,r3 - add r8,r8,r4 - add r4,r4,r0,ror#2 - eor r12,r12,r6 - vst1.32 {q8},[r1,:128]! - add r11,r11,r2 - eor r2,r9,r10 - eor r0,r8,r8,ror#5 - add r4,r4,r12 - vld1.32 {q8},[r14,:128]! - and r2,r2,r8 - eor r12,r0,r8,ror#19 - eor r0,r4,r4,ror#11 - eor r2,r2,r10 - vrev32.8 q2,q2 - add r11,r11,r12,ror#6 - eor r12,r4,r5 - eor r0,r0,r4,ror#20 - add r11,r11,r2 - vadd.i32 q8,q8,q2 - ldr r2,[sp,#36] - and r3,r3,r12 - add r7,r7,r11 - add r11,r11,r0,ror#2 - eor r3,r3,r5 - add r10,r10,r2 - eor r2,r8,r9 - eor r0,r7,r7,ror#5 - add r11,r11,r3 - and r2,r2,r7 - eor r3,r0,r7,ror#19 - eor r0,r11,r11,ror#11 - eor r2,r2,r9 - add r10,r10,r3,ror#6 - eor r3,r11,r4 - eor r0,r0,r11,ror#20 - add r10,r10,r2 - ldr r2,[sp,#40] - and r12,r12,r3 - add r6,r6,r10 - add r10,r10,r0,ror#2 - eor r12,r12,r4 - add r9,r9,r2 - eor r2,r7,r8 - eor r0,r6,r6,ror#5 - add r10,r10,r12 - and r2,r2,r6 - eor r12,r0,r6,ror#19 - eor r0,r10,r10,ror#11 - eor r2,r2,r8 - add r9,r9,r12,ror#6 - eor r12,r10,r11 - eor r0,r0,r10,ror#20 - add r9,r9,r2 - ldr r2,[sp,#44] - and r3,r3,r12 - add r5,r5,r9 - add r9,r9,r0,ror#2 - eor r3,r3,r11 - add r8,r8,r2 - eor r2,r6,r7 - eor r0,r5,r5,ror#5 - add r9,r9,r3 - and r2,r2,r5 - eor r3,r0,r5,ror#19 - eor r0,r9,r9,ror#11 - eor r2,r2,r7 - add r8,r8,r3,ror#6 - eor r3,r9,r10 - eor r0,r0,r9,ror#20 - add r8,r8,r2 - ldr r2,[sp,#48] - and r12,r12,r3 - add r4,r4,r8 - add r8,r8,r0,ror#2 - eor r12,r12,r10 - vst1.32 {q8},[r1,:128]! - add r7,r7,r2 - eor r2,r5,r6 - eor r0,r4,r4,ror#5 - add r8,r8,r12 - vld1.32 {q8},[r14,:128]! - and r2,r2,r4 - eor r12,r0,r4,ror#19 - eor r0,r8,r8,ror#11 - eor r2,r2,r6 - vrev32.8 q3,q3 - add r7,r7,r12,ror#6 - eor r12,r8,r9 - eor r0,r0,r8,ror#20 - add r7,r7,r2 - vadd.i32 q8,q8,q3 - ldr r2,[sp,#52] - and r3,r3,r12 - add r11,r11,r7 - add r7,r7,r0,ror#2 - eor r3,r3,r9 - add r6,r6,r2 - eor r2,r4,r5 - eor r0,r11,r11,ror#5 - add r7,r7,r3 - and r2,r2,r11 - eor r3,r0,r11,ror#19 - eor r0,r7,r7,ror#11 - eor r2,r2,r5 - add r6,r6,r3,ror#6 - eor r3,r7,r8 - eor r0,r0,r7,ror#20 - add r6,r6,r2 - ldr r2,[sp,#56] - and r12,r12,r3 - add r10,r10,r6 - add r6,r6,r0,ror#2 - eor r12,r12,r8 - add r5,r5,r2 - eor r2,r11,r4 - eor r0,r10,r10,ror#5 - add r6,r6,r12 - and r2,r2,r10 - eor r12,r0,r10,ror#19 - eor r0,r6,r6,ror#11 - eor r2,r2,r4 - add r5,r5,r12,ror#6 - eor r12,r6,r7 - eor r0,r0,r6,ror#20 - add r5,r5,r2 - ldr r2,[sp,#60] - and r3,r3,r12 - add r9,r9,r5 - add r5,r5,r0,ror#2 - eor r3,r3,r7 - add r4,r4,r2 - eor r2,r10,r11 - eor r0,r9,r9,ror#5 - add r5,r5,r3 - and r2,r2,r9 - eor r3,r0,r9,ror#19 - eor r0,r5,r5,ror#11 - eor r2,r2,r11 - add r4,r4,r3,ror#6 - eor r3,r5,r6 - eor r0,r0,r5,ror#20 - add r4,r4,r2 - ldr r2,[sp,#64] - and r12,r12,r3 - add r8,r8,r4 - add r4,r4,r0,ror#2 - eor r12,r12,r6 - vst1.32 {q8},[r1,:128]! - ldr r0,[r2,#0] - add r4,r4,r12 @ h+=Maj(a,b,c) from the past - ldr r12,[r2,#4] - ldr r3,[r2,#8] - ldr r1,[r2,#12] - add r4,r4,r0 @ accumulate - ldr r0,[r2,#16] - add r5,r5,r12 - ldr r12,[r2,#20] - add r6,r6,r3 - ldr r3,[r2,#24] - add r7,r7,r1 - ldr r1,[r2,#28] - add r8,r8,r0 - str r4,[r2],#4 - add r9,r9,r12 - str r5,[r2],#4 - add r10,r10,r3 - str r6,[r2],#4 - add r11,r11,r1 - str r7,[r2],#4 - stmia r2,{r8,r9,r10,r11} - - ittte ne - movne r1,sp - ldrne r2,[sp,#0] - eorne r12,r12,r12 - ldreq sp,[sp,#76] @ restore original sp - itt ne - eorne r3,r5,r6 - bne L_00_48 - - ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,pc} - -#endif -#if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__) - -# if defined(__thumb2__) -# define INST(a,b,c,d) .byte c,d|0xc,a,b -# else -# define INST(a,b,c,d) .byte a,b,c,d -# endif - -#ifdef __thumb2__ -.thumb_func sha256_block_data_order_armv8 -#endif -.align 5 -sha256_block_data_order_armv8: -LARMv8: - vld1.32 {q0,q1},[r0] - sub r3,r3,#256+32 - add r2,r1,r2,lsl#6 @ len to point at the end of inp - b Loop_v8 - -.align 4 -Loop_v8: - vld1.8 {q8,q9},[r1]! - vld1.8 {q10,q11},[r1]! - vld1.32 {q12},[r3]! - vrev32.8 q8,q8 - vrev32.8 q9,q9 - vrev32.8 q10,q10 - vrev32.8 q11,q11 - vmov q14,q0 @ offload - vmov q15,q1 - teq r1,r2 - vld1.32 {q13},[r3]! - vadd.i32 q12,q12,q8 - INST(0xe2,0x03,0xfa,0xf3) @ sha256su0 q8,q9 - vmov q2,q0 - INST(0x68,0x0c,0x02,0xf3) @ sha256h q0,q1,q12 - INST(0x68,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q12 - INST(0xe6,0x0c,0x64,0xf3) @ sha256su1 q8,q10,q11 - vld1.32 {q12},[r3]! - vadd.i32 q13,q13,q9 - INST(0xe4,0x23,0xfa,0xf3) @ sha256su0 q9,q10 - vmov q2,q0 - INST(0x6a,0x0c,0x02,0xf3) @ sha256h q0,q1,q13 - INST(0x6a,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q13 - INST(0xe0,0x2c,0x66,0xf3) @ sha256su1 q9,q11,q8 - vld1.32 {q13},[r3]! - vadd.i32 q12,q12,q10 - INST(0xe6,0x43,0xfa,0xf3) @ sha256su0 q10,q11 - vmov q2,q0 - INST(0x68,0x0c,0x02,0xf3) @ sha256h q0,q1,q12 - INST(0x68,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q12 - INST(0xe2,0x4c,0x60,0xf3) @ sha256su1 q10,q8,q9 - vld1.32 {q12},[r3]! - vadd.i32 q13,q13,q11 - INST(0xe0,0x63,0xfa,0xf3) @ sha256su0 q11,q8 - vmov q2,q0 - INST(0x6a,0x0c,0x02,0xf3) @ sha256h q0,q1,q13 - INST(0x6a,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q13 - INST(0xe4,0x6c,0x62,0xf3) @ sha256su1 q11,q9,q10 - vld1.32 {q13},[r3]! - vadd.i32 q12,q12,q8 - INST(0xe2,0x03,0xfa,0xf3) @ sha256su0 q8,q9 - vmov q2,q0 - INST(0x68,0x0c,0x02,0xf3) @ sha256h q0,q1,q12 - INST(0x68,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q12 - INST(0xe6,0x0c,0x64,0xf3) @ sha256su1 q8,q10,q11 - vld1.32 {q12},[r3]! - vadd.i32 q13,q13,q9 - INST(0xe4,0x23,0xfa,0xf3) @ sha256su0 q9,q10 - vmov q2,q0 - INST(0x6a,0x0c,0x02,0xf3) @ sha256h q0,q1,q13 - INST(0x6a,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q13 - INST(0xe0,0x2c,0x66,0xf3) @ sha256su1 q9,q11,q8 - vld1.32 {q13},[r3]! - vadd.i32 q12,q12,q10 - INST(0xe6,0x43,0xfa,0xf3) @ sha256su0 q10,q11 - vmov q2,q0 - INST(0x68,0x0c,0x02,0xf3) @ sha256h q0,q1,q12 - INST(0x68,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q12 - INST(0xe2,0x4c,0x60,0xf3) @ sha256su1 q10,q8,q9 - vld1.32 {q12},[r3]! - vadd.i32 q13,q13,q11 - INST(0xe0,0x63,0xfa,0xf3) @ sha256su0 q11,q8 - vmov q2,q0 - INST(0x6a,0x0c,0x02,0xf3) @ sha256h q0,q1,q13 - INST(0x6a,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q13 - INST(0xe4,0x6c,0x62,0xf3) @ sha256su1 q11,q9,q10 - vld1.32 {q13},[r3]! - vadd.i32 q12,q12,q8 - INST(0xe2,0x03,0xfa,0xf3) @ sha256su0 q8,q9 - vmov q2,q0 - INST(0x68,0x0c,0x02,0xf3) @ sha256h q0,q1,q12 - INST(0x68,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q12 - INST(0xe6,0x0c,0x64,0xf3) @ sha256su1 q8,q10,q11 - vld1.32 {q12},[r3]! - vadd.i32 q13,q13,q9 - INST(0xe4,0x23,0xfa,0xf3) @ sha256su0 q9,q10 - vmov q2,q0 - INST(0x6a,0x0c,0x02,0xf3) @ sha256h q0,q1,q13 - INST(0x6a,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q13 - INST(0xe0,0x2c,0x66,0xf3) @ sha256su1 q9,q11,q8 - vld1.32 {q13},[r3]! - vadd.i32 q12,q12,q10 - INST(0xe6,0x43,0xfa,0xf3) @ sha256su0 q10,q11 - vmov q2,q0 - INST(0x68,0x0c,0x02,0xf3) @ sha256h q0,q1,q12 - INST(0x68,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q12 - INST(0xe2,0x4c,0x60,0xf3) @ sha256su1 q10,q8,q9 - vld1.32 {q12},[r3]! - vadd.i32 q13,q13,q11 - INST(0xe0,0x63,0xfa,0xf3) @ sha256su0 q11,q8 - vmov q2,q0 - INST(0x6a,0x0c,0x02,0xf3) @ sha256h q0,q1,q13 - INST(0x6a,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q13 - INST(0xe4,0x6c,0x62,0xf3) @ sha256su1 q11,q9,q10 - vld1.32 {q13},[r3]! - vadd.i32 q12,q12,q8 - vmov q2,q0 - INST(0x68,0x0c,0x02,0xf3) @ sha256h q0,q1,q12 - INST(0x68,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q12 - - vld1.32 {q12},[r3]! - vadd.i32 q13,q13,q9 - vmov q2,q0 - INST(0x6a,0x0c,0x02,0xf3) @ sha256h q0,q1,q13 - INST(0x6a,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q13 - - vld1.32 {q13},[r3] - vadd.i32 q12,q12,q10 - sub r3,r3,#256-16 @ rewind - vmov q2,q0 - INST(0x68,0x0c,0x02,0xf3) @ sha256h q0,q1,q12 - INST(0x68,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q12 - - vadd.i32 q13,q13,q11 - vmov q2,q0 - INST(0x6a,0x0c,0x02,0xf3) @ sha256h q0,q1,q13 - INST(0x6a,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q13 - - vadd.i32 q0,q0,q14 - vadd.i32 q1,q1,q15 - it ne - bne Loop_v8 - - vst1.32 {q0,q1},[r0] - - bx lr @ bx lr - -#endif -.byte 83,72,65,50,53,54,32,98,108,111,99,107,32,116,114,97,110,115,102,111,114,109,32,102,111,114,32,65,82,77,118,52,47,78,69,79,78,47,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 -.align 2 -#endif // !OPENSSL_NO_ASM diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/sha256-armv4-linux32.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/sha256-armv4-linux32.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/sha256-armv4-linux32.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/sha256-armv4-linux32.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,2831 +0,0 @@ -// This file is generated from a similarly-named Perl script in the BoringSSL -// source tree. Do not edit by hand. - -#if !defined(__has_feature) -#define __has_feature(x) 0 -#endif -#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) -#define OPENSSL_NO_ASM -#endif - -#if !defined(OPENSSL_NO_ASM) -#if defined(__arm__) -@ Copyright 2007-2016 The OpenSSL Project Authors. All Rights Reserved. -@ -@ Licensed under the OpenSSL license (the "License"). You may not use -@ this file except in compliance with the License. You can obtain a copy -@ in the file LICENSE in the source distribution or at -@ https://www.openssl.org/source/license.html - - -@ ==================================================================== -@ Written by Andy Polyakov for the OpenSSL -@ project. The module is, however, dual licensed under OpenSSL and -@ CRYPTOGAMS licenses depending on where you obtain it. For further -@ details see http://www.openssl.org/~appro/cryptogams/. -@ -@ Permission to use under GPL terms is granted. -@ ==================================================================== - -@ SHA256 block procedure for ARMv4. May 2007. - -@ Performance is ~2x better than gcc 3.4 generated code and in "abso- -@ lute" terms is ~2250 cycles per 64-byte block or ~35 cycles per -@ byte [on single-issue Xscale PXA250 core]. - -@ July 2010. -@ -@ Rescheduling for dual-issue pipeline resulted in 22% improvement on -@ Cortex A8 core and ~20 cycles per processed byte. - -@ February 2011. -@ -@ Profiler-assisted and platform-specific optimization resulted in 16% -@ improvement on Cortex A8 core and ~15.4 cycles per processed byte. - -@ September 2013. -@ -@ Add NEON implementation. On Cortex A8 it was measured to process one -@ byte in 12.5 cycles or 23% faster than integer-only code. Snapdragon -@ S4 does it in 12.5 cycles too, but it's 50% faster than integer-only -@ code (meaning that latter performs sub-optimally, nothing was done -@ about it). - -@ May 2014. -@ -@ Add ARMv8 code path performing at 2.0 cpb on Apple A7. - -#ifndef __KERNEL__ -# include -#else -# define __ARM_ARCH__ __LINUX_ARM_ARCH__ -# define __ARM_MAX_ARCH__ 7 -#endif - -@ Silence ARMv8 deprecated IT instruction warnings. This file is used by both -@ ARMv7 and ARMv8 processors. It does have ARMv8-only code, but those -@ instructions are manually-encoded. (See unsha256.) -.arch armv7-a - -.text -#if defined(__thumb2__) -.syntax unified -.thumb -#else -.code 32 -#endif - -.type K256,%object -.align 5 -K256: -.word 0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5 -.word 0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5 -.word 0xd807aa98,0x12835b01,0x243185be,0x550c7dc3 -.word 0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174 -.word 0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc -.word 0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da -.word 0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7 -.word 0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967 -.word 0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13 -.word 0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85 -.word 0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3 -.word 0xd192e819,0xd6990624,0xf40e3585,0x106aa070 -.word 0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5 -.word 0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3 -.word 0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208 -.word 0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2 -.size K256,.-K256 -.word 0 @ terminator -#if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__) - -.hidden GFp_armcap_P -.LOPENSSL_armcap: -.word GFp_armcap_P-.Lsha256_block_data_order -#endif -.align 5 - -.globl GFp_sha256_block_data_order -.hidden GFp_sha256_block_data_order -.type GFp_sha256_block_data_order,%function -GFp_sha256_block_data_order: -.Lsha256_block_data_order: -#if __ARM_ARCH__<7 && !defined(__thumb2__) - sub r3,pc,#8 @ GFp_sha256_block_data_order -#else - adr r3,.Lsha256_block_data_order -#endif -#if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__) - ldr r12,.LOPENSSL_armcap - ldr r12,[r3,r12] @ GFp_armcap_P -#ifdef __APPLE__ - ldr r12,[r12] -#endif - tst r12,#ARMV8_SHA256 - bne .LARMv8 - tst r12,#ARMV7_NEON - bne .LNEON -#endif - add r2,r1,r2,lsl#6 @ len to point at the end of inp - stmdb sp!,{r0,r1,r2,r4-r11,lr} - ldmia r0,{r4,r5,r6,r7,r8,r9,r10,r11} - sub r14,r3,#256+32 @ K256 - sub sp,sp,#16*4 @ alloca(X[16]) -.Loop: -# if __ARM_ARCH__>=7 - ldr r2,[r1],#4 -# else - ldrb r2,[r1,#3] -# endif - eor r3,r5,r6 @ magic - eor r12,r12,r12 -#if __ARM_ARCH__>=7 - @ ldr r2,[r1],#4 @ 0 -# if 0==15 - str r1,[sp,#17*4] @ make room for r1 -# endif - eor r0,r8,r8,ror#5 - add r4,r4,r12 @ h+=Maj(a,b,c) from the past - eor r0,r0,r8,ror#19 @ Sigma1(e) -# ifndef __ARMEB__ - rev r2,r2 -# endif -#else - @ ldrb r2,[r1,#3] @ 0 - add r4,r4,r12 @ h+=Maj(a,b,c) from the past - ldrb r12,[r1,#2] - ldrb r0,[r1,#1] - orr r2,r2,r12,lsl#8 - ldrb r12,[r1],#4 - orr r2,r2,r0,lsl#16 -# if 0==15 - str r1,[sp,#17*4] @ make room for r1 -# endif - eor r0,r8,r8,ror#5 - orr r2,r2,r12,lsl#24 - eor r0,r0,r8,ror#19 @ Sigma1(e) -#endif - ldr r12,[r14],#4 @ *K256++ - add r11,r11,r2 @ h+=X[i] - str r2,[sp,#0*4] - eor r2,r9,r10 - add r11,r11,r0,ror#6 @ h+=Sigma1(e) - and r2,r2,r8 - add r11,r11,r12 @ h+=K256[i] - eor r2,r2,r10 @ Ch(e,f,g) - eor r0,r4,r4,ror#11 - add r11,r11,r2 @ h+=Ch(e,f,g) -#if 0==31 - and r12,r12,#0xff - cmp r12,#0xf2 @ done? -#endif -#if 0<15 -# if __ARM_ARCH__>=7 - ldr r2,[r1],#4 @ prefetch -# else - ldrb r2,[r1,#3] -# endif - eor r12,r4,r5 @ a^b, b^c in next round -#else - ldr r2,[sp,#2*4] @ from future BODY_16_xx - eor r12,r4,r5 @ a^b, b^c in next round - ldr r1,[sp,#15*4] @ from future BODY_16_xx -#endif - eor r0,r0,r4,ror#20 @ Sigma0(a) - and r3,r3,r12 @ (b^c)&=(a^b) - add r7,r7,r11 @ d+=h - eor r3,r3,r5 @ Maj(a,b,c) - add r11,r11,r0,ror#2 @ h+=Sigma0(a) - @ add r11,r11,r3 @ h+=Maj(a,b,c) -#if __ARM_ARCH__>=7 - @ ldr r2,[r1],#4 @ 1 -# if 1==15 - str r1,[sp,#17*4] @ make room for r1 -# endif - eor r0,r7,r7,ror#5 - add r11,r11,r3 @ h+=Maj(a,b,c) from the past - eor r0,r0,r7,ror#19 @ Sigma1(e) -# ifndef __ARMEB__ - rev r2,r2 -# endif -#else - @ ldrb r2,[r1,#3] @ 1 - add r11,r11,r3 @ h+=Maj(a,b,c) from the past - ldrb r3,[r1,#2] - ldrb r0,[r1,#1] - orr r2,r2,r3,lsl#8 - ldrb r3,[r1],#4 - orr r2,r2,r0,lsl#16 -# if 1==15 - str r1,[sp,#17*4] @ make room for r1 -# endif - eor r0,r7,r7,ror#5 - orr r2,r2,r3,lsl#24 - eor r0,r0,r7,ror#19 @ Sigma1(e) -#endif - ldr r3,[r14],#4 @ *K256++ - add r10,r10,r2 @ h+=X[i] - str r2,[sp,#1*4] - eor r2,r8,r9 - add r10,r10,r0,ror#6 @ h+=Sigma1(e) - and r2,r2,r7 - add r10,r10,r3 @ h+=K256[i] - eor r2,r2,r9 @ Ch(e,f,g) - eor r0,r11,r11,ror#11 - add r10,r10,r2 @ h+=Ch(e,f,g) -#if 1==31 - and r3,r3,#0xff - cmp r3,#0xf2 @ done? -#endif -#if 1<15 -# if __ARM_ARCH__>=7 - ldr r2,[r1],#4 @ prefetch -# else - ldrb r2,[r1,#3] -# endif - eor r3,r11,r4 @ a^b, b^c in next round -#else - ldr r2,[sp,#3*4] @ from future BODY_16_xx - eor r3,r11,r4 @ a^b, b^c in next round - ldr r1,[sp,#0*4] @ from future BODY_16_xx -#endif - eor r0,r0,r11,ror#20 @ Sigma0(a) - and r12,r12,r3 @ (b^c)&=(a^b) - add r6,r6,r10 @ d+=h - eor r12,r12,r4 @ Maj(a,b,c) - add r10,r10,r0,ror#2 @ h+=Sigma0(a) - @ add r10,r10,r12 @ h+=Maj(a,b,c) -#if __ARM_ARCH__>=7 - @ ldr r2,[r1],#4 @ 2 -# if 2==15 - str r1,[sp,#17*4] @ make room for r1 -# endif - eor r0,r6,r6,ror#5 - add r10,r10,r12 @ h+=Maj(a,b,c) from the past - eor r0,r0,r6,ror#19 @ Sigma1(e) -# ifndef __ARMEB__ - rev r2,r2 -# endif -#else - @ ldrb r2,[r1,#3] @ 2 - add r10,r10,r12 @ h+=Maj(a,b,c) from the past - ldrb r12,[r1,#2] - ldrb r0,[r1,#1] - orr r2,r2,r12,lsl#8 - ldrb r12,[r1],#4 - orr r2,r2,r0,lsl#16 -# if 2==15 - str r1,[sp,#17*4] @ make room for r1 -# endif - eor r0,r6,r6,ror#5 - orr r2,r2,r12,lsl#24 - eor r0,r0,r6,ror#19 @ Sigma1(e) -#endif - ldr r12,[r14],#4 @ *K256++ - add r9,r9,r2 @ h+=X[i] - str r2,[sp,#2*4] - eor r2,r7,r8 - add r9,r9,r0,ror#6 @ h+=Sigma1(e) - and r2,r2,r6 - add r9,r9,r12 @ h+=K256[i] - eor r2,r2,r8 @ Ch(e,f,g) - eor r0,r10,r10,ror#11 - add r9,r9,r2 @ h+=Ch(e,f,g) -#if 2==31 - and r12,r12,#0xff - cmp r12,#0xf2 @ done? -#endif -#if 2<15 -# if __ARM_ARCH__>=7 - ldr r2,[r1],#4 @ prefetch -# else - ldrb r2,[r1,#3] -# endif - eor r12,r10,r11 @ a^b, b^c in next round -#else - ldr r2,[sp,#4*4] @ from future BODY_16_xx - eor r12,r10,r11 @ a^b, b^c in next round - ldr r1,[sp,#1*4] @ from future BODY_16_xx -#endif - eor r0,r0,r10,ror#20 @ Sigma0(a) - and r3,r3,r12 @ (b^c)&=(a^b) - add r5,r5,r9 @ d+=h - eor r3,r3,r11 @ Maj(a,b,c) - add r9,r9,r0,ror#2 @ h+=Sigma0(a) - @ add r9,r9,r3 @ h+=Maj(a,b,c) -#if __ARM_ARCH__>=7 - @ ldr r2,[r1],#4 @ 3 -# if 3==15 - str r1,[sp,#17*4] @ make room for r1 -# endif - eor r0,r5,r5,ror#5 - add r9,r9,r3 @ h+=Maj(a,b,c) from the past - eor r0,r0,r5,ror#19 @ Sigma1(e) -# ifndef __ARMEB__ - rev r2,r2 -# endif -#else - @ ldrb r2,[r1,#3] @ 3 - add r9,r9,r3 @ h+=Maj(a,b,c) from the past - ldrb r3,[r1,#2] - ldrb r0,[r1,#1] - orr r2,r2,r3,lsl#8 - ldrb r3,[r1],#4 - orr r2,r2,r0,lsl#16 -# if 3==15 - str r1,[sp,#17*4] @ make room for r1 -# endif - eor r0,r5,r5,ror#5 - orr r2,r2,r3,lsl#24 - eor r0,r0,r5,ror#19 @ Sigma1(e) -#endif - ldr r3,[r14],#4 @ *K256++ - add r8,r8,r2 @ h+=X[i] - str r2,[sp,#3*4] - eor r2,r6,r7 - add r8,r8,r0,ror#6 @ h+=Sigma1(e) - and r2,r2,r5 - add r8,r8,r3 @ h+=K256[i] - eor r2,r2,r7 @ Ch(e,f,g) - eor r0,r9,r9,ror#11 - add r8,r8,r2 @ h+=Ch(e,f,g) -#if 3==31 - and r3,r3,#0xff - cmp r3,#0xf2 @ done? -#endif -#if 3<15 -# if __ARM_ARCH__>=7 - ldr r2,[r1],#4 @ prefetch -# else - ldrb r2,[r1,#3] -# endif - eor r3,r9,r10 @ a^b, b^c in next round -#else - ldr r2,[sp,#5*4] @ from future BODY_16_xx - eor r3,r9,r10 @ a^b, b^c in next round - ldr r1,[sp,#2*4] @ from future BODY_16_xx -#endif - eor r0,r0,r9,ror#20 @ Sigma0(a) - and r12,r12,r3 @ (b^c)&=(a^b) - add r4,r4,r8 @ d+=h - eor r12,r12,r10 @ Maj(a,b,c) - add r8,r8,r0,ror#2 @ h+=Sigma0(a) - @ add r8,r8,r12 @ h+=Maj(a,b,c) -#if __ARM_ARCH__>=7 - @ ldr r2,[r1],#4 @ 4 -# if 4==15 - str r1,[sp,#17*4] @ make room for r1 -# endif - eor r0,r4,r4,ror#5 - add r8,r8,r12 @ h+=Maj(a,b,c) from the past - eor r0,r0,r4,ror#19 @ Sigma1(e) -# ifndef __ARMEB__ - rev r2,r2 -# endif -#else - @ ldrb r2,[r1,#3] @ 4 - add r8,r8,r12 @ h+=Maj(a,b,c) from the past - ldrb r12,[r1,#2] - ldrb r0,[r1,#1] - orr r2,r2,r12,lsl#8 - ldrb r12,[r1],#4 - orr r2,r2,r0,lsl#16 -# if 4==15 - str r1,[sp,#17*4] @ make room for r1 -# endif - eor r0,r4,r4,ror#5 - orr r2,r2,r12,lsl#24 - eor r0,r0,r4,ror#19 @ Sigma1(e) -#endif - ldr r12,[r14],#4 @ *K256++ - add r7,r7,r2 @ h+=X[i] - str r2,[sp,#4*4] - eor r2,r5,r6 - add r7,r7,r0,ror#6 @ h+=Sigma1(e) - and r2,r2,r4 - add r7,r7,r12 @ h+=K256[i] - eor r2,r2,r6 @ Ch(e,f,g) - eor r0,r8,r8,ror#11 - add r7,r7,r2 @ h+=Ch(e,f,g) -#if 4==31 - and r12,r12,#0xff - cmp r12,#0xf2 @ done? -#endif -#if 4<15 -# if __ARM_ARCH__>=7 - ldr r2,[r1],#4 @ prefetch -# else - ldrb r2,[r1,#3] -# endif - eor r12,r8,r9 @ a^b, b^c in next round -#else - ldr r2,[sp,#6*4] @ from future BODY_16_xx - eor r12,r8,r9 @ a^b, b^c in next round - ldr r1,[sp,#3*4] @ from future BODY_16_xx -#endif - eor r0,r0,r8,ror#20 @ Sigma0(a) - and r3,r3,r12 @ (b^c)&=(a^b) - add r11,r11,r7 @ d+=h - eor r3,r3,r9 @ Maj(a,b,c) - add r7,r7,r0,ror#2 @ h+=Sigma0(a) - @ add r7,r7,r3 @ h+=Maj(a,b,c) -#if __ARM_ARCH__>=7 - @ ldr r2,[r1],#4 @ 5 -# if 5==15 - str r1,[sp,#17*4] @ make room for r1 -# endif - eor r0,r11,r11,ror#5 - add r7,r7,r3 @ h+=Maj(a,b,c) from the past - eor r0,r0,r11,ror#19 @ Sigma1(e) -# ifndef __ARMEB__ - rev r2,r2 -# endif -#else - @ ldrb r2,[r1,#3] @ 5 - add r7,r7,r3 @ h+=Maj(a,b,c) from the past - ldrb r3,[r1,#2] - ldrb r0,[r1,#1] - orr r2,r2,r3,lsl#8 - ldrb r3,[r1],#4 - orr r2,r2,r0,lsl#16 -# if 5==15 - str r1,[sp,#17*4] @ make room for r1 -# endif - eor r0,r11,r11,ror#5 - orr r2,r2,r3,lsl#24 - eor r0,r0,r11,ror#19 @ Sigma1(e) -#endif - ldr r3,[r14],#4 @ *K256++ - add r6,r6,r2 @ h+=X[i] - str r2,[sp,#5*4] - eor r2,r4,r5 - add r6,r6,r0,ror#6 @ h+=Sigma1(e) - and r2,r2,r11 - add r6,r6,r3 @ h+=K256[i] - eor r2,r2,r5 @ Ch(e,f,g) - eor r0,r7,r7,ror#11 - add r6,r6,r2 @ h+=Ch(e,f,g) -#if 5==31 - and r3,r3,#0xff - cmp r3,#0xf2 @ done? -#endif -#if 5<15 -# if __ARM_ARCH__>=7 - ldr r2,[r1],#4 @ prefetch -# else - ldrb r2,[r1,#3] -# endif - eor r3,r7,r8 @ a^b, b^c in next round -#else - ldr r2,[sp,#7*4] @ from future BODY_16_xx - eor r3,r7,r8 @ a^b, b^c in next round - ldr r1,[sp,#4*4] @ from future BODY_16_xx -#endif - eor r0,r0,r7,ror#20 @ Sigma0(a) - and r12,r12,r3 @ (b^c)&=(a^b) - add r10,r10,r6 @ d+=h - eor r12,r12,r8 @ Maj(a,b,c) - add r6,r6,r0,ror#2 @ h+=Sigma0(a) - @ add r6,r6,r12 @ h+=Maj(a,b,c) -#if __ARM_ARCH__>=7 - @ ldr r2,[r1],#4 @ 6 -# if 6==15 - str r1,[sp,#17*4] @ make room for r1 -# endif - eor r0,r10,r10,ror#5 - add r6,r6,r12 @ h+=Maj(a,b,c) from the past - eor r0,r0,r10,ror#19 @ Sigma1(e) -# ifndef __ARMEB__ - rev r2,r2 -# endif -#else - @ ldrb r2,[r1,#3] @ 6 - add r6,r6,r12 @ h+=Maj(a,b,c) from the past - ldrb r12,[r1,#2] - ldrb r0,[r1,#1] - orr r2,r2,r12,lsl#8 - ldrb r12,[r1],#4 - orr r2,r2,r0,lsl#16 -# if 6==15 - str r1,[sp,#17*4] @ make room for r1 -# endif - eor r0,r10,r10,ror#5 - orr r2,r2,r12,lsl#24 - eor r0,r0,r10,ror#19 @ Sigma1(e) -#endif - ldr r12,[r14],#4 @ *K256++ - add r5,r5,r2 @ h+=X[i] - str r2,[sp,#6*4] - eor r2,r11,r4 - add r5,r5,r0,ror#6 @ h+=Sigma1(e) - and r2,r2,r10 - add r5,r5,r12 @ h+=K256[i] - eor r2,r2,r4 @ Ch(e,f,g) - eor r0,r6,r6,ror#11 - add r5,r5,r2 @ h+=Ch(e,f,g) -#if 6==31 - and r12,r12,#0xff - cmp r12,#0xf2 @ done? -#endif -#if 6<15 -# if __ARM_ARCH__>=7 - ldr r2,[r1],#4 @ prefetch -# else - ldrb r2,[r1,#3] -# endif - eor r12,r6,r7 @ a^b, b^c in next round -#else - ldr r2,[sp,#8*4] @ from future BODY_16_xx - eor r12,r6,r7 @ a^b, b^c in next round - ldr r1,[sp,#5*4] @ from future BODY_16_xx -#endif - eor r0,r0,r6,ror#20 @ Sigma0(a) - and r3,r3,r12 @ (b^c)&=(a^b) - add r9,r9,r5 @ d+=h - eor r3,r3,r7 @ Maj(a,b,c) - add r5,r5,r0,ror#2 @ h+=Sigma0(a) - @ add r5,r5,r3 @ h+=Maj(a,b,c) -#if __ARM_ARCH__>=7 - @ ldr r2,[r1],#4 @ 7 -# if 7==15 - str r1,[sp,#17*4] @ make room for r1 -# endif - eor r0,r9,r9,ror#5 - add r5,r5,r3 @ h+=Maj(a,b,c) from the past - eor r0,r0,r9,ror#19 @ Sigma1(e) -# ifndef __ARMEB__ - rev r2,r2 -# endif -#else - @ ldrb r2,[r1,#3] @ 7 - add r5,r5,r3 @ h+=Maj(a,b,c) from the past - ldrb r3,[r1,#2] - ldrb r0,[r1,#1] - orr r2,r2,r3,lsl#8 - ldrb r3,[r1],#4 - orr r2,r2,r0,lsl#16 -# if 7==15 - str r1,[sp,#17*4] @ make room for r1 -# endif - eor r0,r9,r9,ror#5 - orr r2,r2,r3,lsl#24 - eor r0,r0,r9,ror#19 @ Sigma1(e) -#endif - ldr r3,[r14],#4 @ *K256++ - add r4,r4,r2 @ h+=X[i] - str r2,[sp,#7*4] - eor r2,r10,r11 - add r4,r4,r0,ror#6 @ h+=Sigma1(e) - and r2,r2,r9 - add r4,r4,r3 @ h+=K256[i] - eor r2,r2,r11 @ Ch(e,f,g) - eor r0,r5,r5,ror#11 - add r4,r4,r2 @ h+=Ch(e,f,g) -#if 7==31 - and r3,r3,#0xff - cmp r3,#0xf2 @ done? -#endif -#if 7<15 -# if __ARM_ARCH__>=7 - ldr r2,[r1],#4 @ prefetch -# else - ldrb r2,[r1,#3] -# endif - eor r3,r5,r6 @ a^b, b^c in next round -#else - ldr r2,[sp,#9*4] @ from future BODY_16_xx - eor r3,r5,r6 @ a^b, b^c in next round - ldr r1,[sp,#6*4] @ from future BODY_16_xx -#endif - eor r0,r0,r5,ror#20 @ Sigma0(a) - and r12,r12,r3 @ (b^c)&=(a^b) - add r8,r8,r4 @ d+=h - eor r12,r12,r6 @ Maj(a,b,c) - add r4,r4,r0,ror#2 @ h+=Sigma0(a) - @ add r4,r4,r12 @ h+=Maj(a,b,c) -#if __ARM_ARCH__>=7 - @ ldr r2,[r1],#4 @ 8 -# if 8==15 - str r1,[sp,#17*4] @ make room for r1 -# endif - eor r0,r8,r8,ror#5 - add r4,r4,r12 @ h+=Maj(a,b,c) from the past - eor r0,r0,r8,ror#19 @ Sigma1(e) -# ifndef __ARMEB__ - rev r2,r2 -# endif -#else - @ ldrb r2,[r1,#3] @ 8 - add r4,r4,r12 @ h+=Maj(a,b,c) from the past - ldrb r12,[r1,#2] - ldrb r0,[r1,#1] - orr r2,r2,r12,lsl#8 - ldrb r12,[r1],#4 - orr r2,r2,r0,lsl#16 -# if 8==15 - str r1,[sp,#17*4] @ make room for r1 -# endif - eor r0,r8,r8,ror#5 - orr r2,r2,r12,lsl#24 - eor r0,r0,r8,ror#19 @ Sigma1(e) -#endif - ldr r12,[r14],#4 @ *K256++ - add r11,r11,r2 @ h+=X[i] - str r2,[sp,#8*4] - eor r2,r9,r10 - add r11,r11,r0,ror#6 @ h+=Sigma1(e) - and r2,r2,r8 - add r11,r11,r12 @ h+=K256[i] - eor r2,r2,r10 @ Ch(e,f,g) - eor r0,r4,r4,ror#11 - add r11,r11,r2 @ h+=Ch(e,f,g) -#if 8==31 - and r12,r12,#0xff - cmp r12,#0xf2 @ done? -#endif -#if 8<15 -# if __ARM_ARCH__>=7 - ldr r2,[r1],#4 @ prefetch -# else - ldrb r2,[r1,#3] -# endif - eor r12,r4,r5 @ a^b, b^c in next round -#else - ldr r2,[sp,#10*4] @ from future BODY_16_xx - eor r12,r4,r5 @ a^b, b^c in next round - ldr r1,[sp,#7*4] @ from future BODY_16_xx -#endif - eor r0,r0,r4,ror#20 @ Sigma0(a) - and r3,r3,r12 @ (b^c)&=(a^b) - add r7,r7,r11 @ d+=h - eor r3,r3,r5 @ Maj(a,b,c) - add r11,r11,r0,ror#2 @ h+=Sigma0(a) - @ add r11,r11,r3 @ h+=Maj(a,b,c) -#if __ARM_ARCH__>=7 - @ ldr r2,[r1],#4 @ 9 -# if 9==15 - str r1,[sp,#17*4] @ make room for r1 -# endif - eor r0,r7,r7,ror#5 - add r11,r11,r3 @ h+=Maj(a,b,c) from the past - eor r0,r0,r7,ror#19 @ Sigma1(e) -# ifndef __ARMEB__ - rev r2,r2 -# endif -#else - @ ldrb r2,[r1,#3] @ 9 - add r11,r11,r3 @ h+=Maj(a,b,c) from the past - ldrb r3,[r1,#2] - ldrb r0,[r1,#1] - orr r2,r2,r3,lsl#8 - ldrb r3,[r1],#4 - orr r2,r2,r0,lsl#16 -# if 9==15 - str r1,[sp,#17*4] @ make room for r1 -# endif - eor r0,r7,r7,ror#5 - orr r2,r2,r3,lsl#24 - eor r0,r0,r7,ror#19 @ Sigma1(e) -#endif - ldr r3,[r14],#4 @ *K256++ - add r10,r10,r2 @ h+=X[i] - str r2,[sp,#9*4] - eor r2,r8,r9 - add r10,r10,r0,ror#6 @ h+=Sigma1(e) - and r2,r2,r7 - add r10,r10,r3 @ h+=K256[i] - eor r2,r2,r9 @ Ch(e,f,g) - eor r0,r11,r11,ror#11 - add r10,r10,r2 @ h+=Ch(e,f,g) -#if 9==31 - and r3,r3,#0xff - cmp r3,#0xf2 @ done? -#endif -#if 9<15 -# if __ARM_ARCH__>=7 - ldr r2,[r1],#4 @ prefetch -# else - ldrb r2,[r1,#3] -# endif - eor r3,r11,r4 @ a^b, b^c in next round -#else - ldr r2,[sp,#11*4] @ from future BODY_16_xx - eor r3,r11,r4 @ a^b, b^c in next round - ldr r1,[sp,#8*4] @ from future BODY_16_xx -#endif - eor r0,r0,r11,ror#20 @ Sigma0(a) - and r12,r12,r3 @ (b^c)&=(a^b) - add r6,r6,r10 @ d+=h - eor r12,r12,r4 @ Maj(a,b,c) - add r10,r10,r0,ror#2 @ h+=Sigma0(a) - @ add r10,r10,r12 @ h+=Maj(a,b,c) -#if __ARM_ARCH__>=7 - @ ldr r2,[r1],#4 @ 10 -# if 10==15 - str r1,[sp,#17*4] @ make room for r1 -# endif - eor r0,r6,r6,ror#5 - add r10,r10,r12 @ h+=Maj(a,b,c) from the past - eor r0,r0,r6,ror#19 @ Sigma1(e) -# ifndef __ARMEB__ - rev r2,r2 -# endif -#else - @ ldrb r2,[r1,#3] @ 10 - add r10,r10,r12 @ h+=Maj(a,b,c) from the past - ldrb r12,[r1,#2] - ldrb r0,[r1,#1] - orr r2,r2,r12,lsl#8 - ldrb r12,[r1],#4 - orr r2,r2,r0,lsl#16 -# if 10==15 - str r1,[sp,#17*4] @ make room for r1 -# endif - eor r0,r6,r6,ror#5 - orr r2,r2,r12,lsl#24 - eor r0,r0,r6,ror#19 @ Sigma1(e) -#endif - ldr r12,[r14],#4 @ *K256++ - add r9,r9,r2 @ h+=X[i] - str r2,[sp,#10*4] - eor r2,r7,r8 - add r9,r9,r0,ror#6 @ h+=Sigma1(e) - and r2,r2,r6 - add r9,r9,r12 @ h+=K256[i] - eor r2,r2,r8 @ Ch(e,f,g) - eor r0,r10,r10,ror#11 - add r9,r9,r2 @ h+=Ch(e,f,g) -#if 10==31 - and r12,r12,#0xff - cmp r12,#0xf2 @ done? -#endif -#if 10<15 -# if __ARM_ARCH__>=7 - ldr r2,[r1],#4 @ prefetch -# else - ldrb r2,[r1,#3] -# endif - eor r12,r10,r11 @ a^b, b^c in next round -#else - ldr r2,[sp,#12*4] @ from future BODY_16_xx - eor r12,r10,r11 @ a^b, b^c in next round - ldr r1,[sp,#9*4] @ from future BODY_16_xx -#endif - eor r0,r0,r10,ror#20 @ Sigma0(a) - and r3,r3,r12 @ (b^c)&=(a^b) - add r5,r5,r9 @ d+=h - eor r3,r3,r11 @ Maj(a,b,c) - add r9,r9,r0,ror#2 @ h+=Sigma0(a) - @ add r9,r9,r3 @ h+=Maj(a,b,c) -#if __ARM_ARCH__>=7 - @ ldr r2,[r1],#4 @ 11 -# if 11==15 - str r1,[sp,#17*4] @ make room for r1 -# endif - eor r0,r5,r5,ror#5 - add r9,r9,r3 @ h+=Maj(a,b,c) from the past - eor r0,r0,r5,ror#19 @ Sigma1(e) -# ifndef __ARMEB__ - rev r2,r2 -# endif -#else - @ ldrb r2,[r1,#3] @ 11 - add r9,r9,r3 @ h+=Maj(a,b,c) from the past - ldrb r3,[r1,#2] - ldrb r0,[r1,#1] - orr r2,r2,r3,lsl#8 - ldrb r3,[r1],#4 - orr r2,r2,r0,lsl#16 -# if 11==15 - str r1,[sp,#17*4] @ make room for r1 -# endif - eor r0,r5,r5,ror#5 - orr r2,r2,r3,lsl#24 - eor r0,r0,r5,ror#19 @ Sigma1(e) -#endif - ldr r3,[r14],#4 @ *K256++ - add r8,r8,r2 @ h+=X[i] - str r2,[sp,#11*4] - eor r2,r6,r7 - add r8,r8,r0,ror#6 @ h+=Sigma1(e) - and r2,r2,r5 - add r8,r8,r3 @ h+=K256[i] - eor r2,r2,r7 @ Ch(e,f,g) - eor r0,r9,r9,ror#11 - add r8,r8,r2 @ h+=Ch(e,f,g) -#if 11==31 - and r3,r3,#0xff - cmp r3,#0xf2 @ done? -#endif -#if 11<15 -# if __ARM_ARCH__>=7 - ldr r2,[r1],#4 @ prefetch -# else - ldrb r2,[r1,#3] -# endif - eor r3,r9,r10 @ a^b, b^c in next round -#else - ldr r2,[sp,#13*4] @ from future BODY_16_xx - eor r3,r9,r10 @ a^b, b^c in next round - ldr r1,[sp,#10*4] @ from future BODY_16_xx -#endif - eor r0,r0,r9,ror#20 @ Sigma0(a) - and r12,r12,r3 @ (b^c)&=(a^b) - add r4,r4,r8 @ d+=h - eor r12,r12,r10 @ Maj(a,b,c) - add r8,r8,r0,ror#2 @ h+=Sigma0(a) - @ add r8,r8,r12 @ h+=Maj(a,b,c) -#if __ARM_ARCH__>=7 - @ ldr r2,[r1],#4 @ 12 -# if 12==15 - str r1,[sp,#17*4] @ make room for r1 -# endif - eor r0,r4,r4,ror#5 - add r8,r8,r12 @ h+=Maj(a,b,c) from the past - eor r0,r0,r4,ror#19 @ Sigma1(e) -# ifndef __ARMEB__ - rev r2,r2 -# endif -#else - @ ldrb r2,[r1,#3] @ 12 - add r8,r8,r12 @ h+=Maj(a,b,c) from the past - ldrb r12,[r1,#2] - ldrb r0,[r1,#1] - orr r2,r2,r12,lsl#8 - ldrb r12,[r1],#4 - orr r2,r2,r0,lsl#16 -# if 12==15 - str r1,[sp,#17*4] @ make room for r1 -# endif - eor r0,r4,r4,ror#5 - orr r2,r2,r12,lsl#24 - eor r0,r0,r4,ror#19 @ Sigma1(e) -#endif - ldr r12,[r14],#4 @ *K256++ - add r7,r7,r2 @ h+=X[i] - str r2,[sp,#12*4] - eor r2,r5,r6 - add r7,r7,r0,ror#6 @ h+=Sigma1(e) - and r2,r2,r4 - add r7,r7,r12 @ h+=K256[i] - eor r2,r2,r6 @ Ch(e,f,g) - eor r0,r8,r8,ror#11 - add r7,r7,r2 @ h+=Ch(e,f,g) -#if 12==31 - and r12,r12,#0xff - cmp r12,#0xf2 @ done? -#endif -#if 12<15 -# if __ARM_ARCH__>=7 - ldr r2,[r1],#4 @ prefetch -# else - ldrb r2,[r1,#3] -# endif - eor r12,r8,r9 @ a^b, b^c in next round -#else - ldr r2,[sp,#14*4] @ from future BODY_16_xx - eor r12,r8,r9 @ a^b, b^c in next round - ldr r1,[sp,#11*4] @ from future BODY_16_xx -#endif - eor r0,r0,r8,ror#20 @ Sigma0(a) - and r3,r3,r12 @ (b^c)&=(a^b) - add r11,r11,r7 @ d+=h - eor r3,r3,r9 @ Maj(a,b,c) - add r7,r7,r0,ror#2 @ h+=Sigma0(a) - @ add r7,r7,r3 @ h+=Maj(a,b,c) -#if __ARM_ARCH__>=7 - @ ldr r2,[r1],#4 @ 13 -# if 13==15 - str r1,[sp,#17*4] @ make room for r1 -# endif - eor r0,r11,r11,ror#5 - add r7,r7,r3 @ h+=Maj(a,b,c) from the past - eor r0,r0,r11,ror#19 @ Sigma1(e) -# ifndef __ARMEB__ - rev r2,r2 -# endif -#else - @ ldrb r2,[r1,#3] @ 13 - add r7,r7,r3 @ h+=Maj(a,b,c) from the past - ldrb r3,[r1,#2] - ldrb r0,[r1,#1] - orr r2,r2,r3,lsl#8 - ldrb r3,[r1],#4 - orr r2,r2,r0,lsl#16 -# if 13==15 - str r1,[sp,#17*4] @ make room for r1 -# endif - eor r0,r11,r11,ror#5 - orr r2,r2,r3,lsl#24 - eor r0,r0,r11,ror#19 @ Sigma1(e) -#endif - ldr r3,[r14],#4 @ *K256++ - add r6,r6,r2 @ h+=X[i] - str r2,[sp,#13*4] - eor r2,r4,r5 - add r6,r6,r0,ror#6 @ h+=Sigma1(e) - and r2,r2,r11 - add r6,r6,r3 @ h+=K256[i] - eor r2,r2,r5 @ Ch(e,f,g) - eor r0,r7,r7,ror#11 - add r6,r6,r2 @ h+=Ch(e,f,g) -#if 13==31 - and r3,r3,#0xff - cmp r3,#0xf2 @ done? -#endif -#if 13<15 -# if __ARM_ARCH__>=7 - ldr r2,[r1],#4 @ prefetch -# else - ldrb r2,[r1,#3] -# endif - eor r3,r7,r8 @ a^b, b^c in next round -#else - ldr r2,[sp,#15*4] @ from future BODY_16_xx - eor r3,r7,r8 @ a^b, b^c in next round - ldr r1,[sp,#12*4] @ from future BODY_16_xx -#endif - eor r0,r0,r7,ror#20 @ Sigma0(a) - and r12,r12,r3 @ (b^c)&=(a^b) - add r10,r10,r6 @ d+=h - eor r12,r12,r8 @ Maj(a,b,c) - add r6,r6,r0,ror#2 @ h+=Sigma0(a) - @ add r6,r6,r12 @ h+=Maj(a,b,c) -#if __ARM_ARCH__>=7 - @ ldr r2,[r1],#4 @ 14 -# if 14==15 - str r1,[sp,#17*4] @ make room for r1 -# endif - eor r0,r10,r10,ror#5 - add r6,r6,r12 @ h+=Maj(a,b,c) from the past - eor r0,r0,r10,ror#19 @ Sigma1(e) -# ifndef __ARMEB__ - rev r2,r2 -# endif -#else - @ ldrb r2,[r1,#3] @ 14 - add r6,r6,r12 @ h+=Maj(a,b,c) from the past - ldrb r12,[r1,#2] - ldrb r0,[r1,#1] - orr r2,r2,r12,lsl#8 - ldrb r12,[r1],#4 - orr r2,r2,r0,lsl#16 -# if 14==15 - str r1,[sp,#17*4] @ make room for r1 -# endif - eor r0,r10,r10,ror#5 - orr r2,r2,r12,lsl#24 - eor r0,r0,r10,ror#19 @ Sigma1(e) -#endif - ldr r12,[r14],#4 @ *K256++ - add r5,r5,r2 @ h+=X[i] - str r2,[sp,#14*4] - eor r2,r11,r4 - add r5,r5,r0,ror#6 @ h+=Sigma1(e) - and r2,r2,r10 - add r5,r5,r12 @ h+=K256[i] - eor r2,r2,r4 @ Ch(e,f,g) - eor r0,r6,r6,ror#11 - add r5,r5,r2 @ h+=Ch(e,f,g) -#if 14==31 - and r12,r12,#0xff - cmp r12,#0xf2 @ done? -#endif -#if 14<15 -# if __ARM_ARCH__>=7 - ldr r2,[r1],#4 @ prefetch -# else - ldrb r2,[r1,#3] -# endif - eor r12,r6,r7 @ a^b, b^c in next round -#else - ldr r2,[sp,#0*4] @ from future BODY_16_xx - eor r12,r6,r7 @ a^b, b^c in next round - ldr r1,[sp,#13*4] @ from future BODY_16_xx -#endif - eor r0,r0,r6,ror#20 @ Sigma0(a) - and r3,r3,r12 @ (b^c)&=(a^b) - add r9,r9,r5 @ d+=h - eor r3,r3,r7 @ Maj(a,b,c) - add r5,r5,r0,ror#2 @ h+=Sigma0(a) - @ add r5,r5,r3 @ h+=Maj(a,b,c) -#if __ARM_ARCH__>=7 - @ ldr r2,[r1],#4 @ 15 -# if 15==15 - str r1,[sp,#17*4] @ make room for r1 -# endif - eor r0,r9,r9,ror#5 - add r5,r5,r3 @ h+=Maj(a,b,c) from the past - eor r0,r0,r9,ror#19 @ Sigma1(e) -# ifndef __ARMEB__ - rev r2,r2 -# endif -#else - @ ldrb r2,[r1,#3] @ 15 - add r5,r5,r3 @ h+=Maj(a,b,c) from the past - ldrb r3,[r1,#2] - ldrb r0,[r1,#1] - orr r2,r2,r3,lsl#8 - ldrb r3,[r1],#4 - orr r2,r2,r0,lsl#16 -# if 15==15 - str r1,[sp,#17*4] @ make room for r1 -# endif - eor r0,r9,r9,ror#5 - orr r2,r2,r3,lsl#24 - eor r0,r0,r9,ror#19 @ Sigma1(e) -#endif - ldr r3,[r14],#4 @ *K256++ - add r4,r4,r2 @ h+=X[i] - str r2,[sp,#15*4] - eor r2,r10,r11 - add r4,r4,r0,ror#6 @ h+=Sigma1(e) - and r2,r2,r9 - add r4,r4,r3 @ h+=K256[i] - eor r2,r2,r11 @ Ch(e,f,g) - eor r0,r5,r5,ror#11 - add r4,r4,r2 @ h+=Ch(e,f,g) -#if 15==31 - and r3,r3,#0xff - cmp r3,#0xf2 @ done? -#endif -#if 15<15 -# if __ARM_ARCH__>=7 - ldr r2,[r1],#4 @ prefetch -# else - ldrb r2,[r1,#3] -# endif - eor r3,r5,r6 @ a^b, b^c in next round -#else - ldr r2,[sp,#1*4] @ from future BODY_16_xx - eor r3,r5,r6 @ a^b, b^c in next round - ldr r1,[sp,#14*4] @ from future BODY_16_xx -#endif - eor r0,r0,r5,ror#20 @ Sigma0(a) - and r12,r12,r3 @ (b^c)&=(a^b) - add r8,r8,r4 @ d+=h - eor r12,r12,r6 @ Maj(a,b,c) - add r4,r4,r0,ror#2 @ h+=Sigma0(a) - @ add r4,r4,r12 @ h+=Maj(a,b,c) -.Lrounds_16_xx: - @ ldr r2,[sp,#1*4] @ 16 - @ ldr r1,[sp,#14*4] - mov r0,r2,ror#7 - add r4,r4,r12 @ h+=Maj(a,b,c) from the past - mov r12,r1,ror#17 - eor r0,r0,r2,ror#18 - eor r12,r12,r1,ror#19 - eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) - ldr r2,[sp,#0*4] - eor r12,r12,r1,lsr#10 @ sigma1(X[i+14]) - ldr r1,[sp,#9*4] - - add r12,r12,r0 - eor r0,r8,r8,ror#5 @ from BODY_00_15 - add r2,r2,r12 - eor r0,r0,r8,ror#19 @ Sigma1(e) - add r2,r2,r1 @ X[i] - ldr r12,[r14],#4 @ *K256++ - add r11,r11,r2 @ h+=X[i] - str r2,[sp,#0*4] - eor r2,r9,r10 - add r11,r11,r0,ror#6 @ h+=Sigma1(e) - and r2,r2,r8 - add r11,r11,r12 @ h+=K256[i] - eor r2,r2,r10 @ Ch(e,f,g) - eor r0,r4,r4,ror#11 - add r11,r11,r2 @ h+=Ch(e,f,g) -#if 16==31 - and r12,r12,#0xff - cmp r12,#0xf2 @ done? -#endif -#if 16<15 -# if __ARM_ARCH__>=7 - ldr r2,[r1],#4 @ prefetch -# else - ldrb r2,[r1,#3] -# endif - eor r12,r4,r5 @ a^b, b^c in next round -#else - ldr r2,[sp,#2*4] @ from future BODY_16_xx - eor r12,r4,r5 @ a^b, b^c in next round - ldr r1,[sp,#15*4] @ from future BODY_16_xx -#endif - eor r0,r0,r4,ror#20 @ Sigma0(a) - and r3,r3,r12 @ (b^c)&=(a^b) - add r7,r7,r11 @ d+=h - eor r3,r3,r5 @ Maj(a,b,c) - add r11,r11,r0,ror#2 @ h+=Sigma0(a) - @ add r11,r11,r3 @ h+=Maj(a,b,c) - @ ldr r2,[sp,#2*4] @ 17 - @ ldr r1,[sp,#15*4] - mov r0,r2,ror#7 - add r11,r11,r3 @ h+=Maj(a,b,c) from the past - mov r3,r1,ror#17 - eor r0,r0,r2,ror#18 - eor r3,r3,r1,ror#19 - eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) - ldr r2,[sp,#1*4] - eor r3,r3,r1,lsr#10 @ sigma1(X[i+14]) - ldr r1,[sp,#10*4] - - add r3,r3,r0 - eor r0,r7,r7,ror#5 @ from BODY_00_15 - add r2,r2,r3 - eor r0,r0,r7,ror#19 @ Sigma1(e) - add r2,r2,r1 @ X[i] - ldr r3,[r14],#4 @ *K256++ - add r10,r10,r2 @ h+=X[i] - str r2,[sp,#1*4] - eor r2,r8,r9 - add r10,r10,r0,ror#6 @ h+=Sigma1(e) - and r2,r2,r7 - add r10,r10,r3 @ h+=K256[i] - eor r2,r2,r9 @ Ch(e,f,g) - eor r0,r11,r11,ror#11 - add r10,r10,r2 @ h+=Ch(e,f,g) -#if 17==31 - and r3,r3,#0xff - cmp r3,#0xf2 @ done? -#endif -#if 17<15 -# if __ARM_ARCH__>=7 - ldr r2,[r1],#4 @ prefetch -# else - ldrb r2,[r1,#3] -# endif - eor r3,r11,r4 @ a^b, b^c in next round -#else - ldr r2,[sp,#3*4] @ from future BODY_16_xx - eor r3,r11,r4 @ a^b, b^c in next round - ldr r1,[sp,#0*4] @ from future BODY_16_xx -#endif - eor r0,r0,r11,ror#20 @ Sigma0(a) - and r12,r12,r3 @ (b^c)&=(a^b) - add r6,r6,r10 @ d+=h - eor r12,r12,r4 @ Maj(a,b,c) - add r10,r10,r0,ror#2 @ h+=Sigma0(a) - @ add r10,r10,r12 @ h+=Maj(a,b,c) - @ ldr r2,[sp,#3*4] @ 18 - @ ldr r1,[sp,#0*4] - mov r0,r2,ror#7 - add r10,r10,r12 @ h+=Maj(a,b,c) from the past - mov r12,r1,ror#17 - eor r0,r0,r2,ror#18 - eor r12,r12,r1,ror#19 - eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) - ldr r2,[sp,#2*4] - eor r12,r12,r1,lsr#10 @ sigma1(X[i+14]) - ldr r1,[sp,#11*4] - - add r12,r12,r0 - eor r0,r6,r6,ror#5 @ from BODY_00_15 - add r2,r2,r12 - eor r0,r0,r6,ror#19 @ Sigma1(e) - add r2,r2,r1 @ X[i] - ldr r12,[r14],#4 @ *K256++ - add r9,r9,r2 @ h+=X[i] - str r2,[sp,#2*4] - eor r2,r7,r8 - add r9,r9,r0,ror#6 @ h+=Sigma1(e) - and r2,r2,r6 - add r9,r9,r12 @ h+=K256[i] - eor r2,r2,r8 @ Ch(e,f,g) - eor r0,r10,r10,ror#11 - add r9,r9,r2 @ h+=Ch(e,f,g) -#if 18==31 - and r12,r12,#0xff - cmp r12,#0xf2 @ done? -#endif -#if 18<15 -# if __ARM_ARCH__>=7 - ldr r2,[r1],#4 @ prefetch -# else - ldrb r2,[r1,#3] -# endif - eor r12,r10,r11 @ a^b, b^c in next round -#else - ldr r2,[sp,#4*4] @ from future BODY_16_xx - eor r12,r10,r11 @ a^b, b^c in next round - ldr r1,[sp,#1*4] @ from future BODY_16_xx -#endif - eor r0,r0,r10,ror#20 @ Sigma0(a) - and r3,r3,r12 @ (b^c)&=(a^b) - add r5,r5,r9 @ d+=h - eor r3,r3,r11 @ Maj(a,b,c) - add r9,r9,r0,ror#2 @ h+=Sigma0(a) - @ add r9,r9,r3 @ h+=Maj(a,b,c) - @ ldr r2,[sp,#4*4] @ 19 - @ ldr r1,[sp,#1*4] - mov r0,r2,ror#7 - add r9,r9,r3 @ h+=Maj(a,b,c) from the past - mov r3,r1,ror#17 - eor r0,r0,r2,ror#18 - eor r3,r3,r1,ror#19 - eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) - ldr r2,[sp,#3*4] - eor r3,r3,r1,lsr#10 @ sigma1(X[i+14]) - ldr r1,[sp,#12*4] - - add r3,r3,r0 - eor r0,r5,r5,ror#5 @ from BODY_00_15 - add r2,r2,r3 - eor r0,r0,r5,ror#19 @ Sigma1(e) - add r2,r2,r1 @ X[i] - ldr r3,[r14],#4 @ *K256++ - add r8,r8,r2 @ h+=X[i] - str r2,[sp,#3*4] - eor r2,r6,r7 - add r8,r8,r0,ror#6 @ h+=Sigma1(e) - and r2,r2,r5 - add r8,r8,r3 @ h+=K256[i] - eor r2,r2,r7 @ Ch(e,f,g) - eor r0,r9,r9,ror#11 - add r8,r8,r2 @ h+=Ch(e,f,g) -#if 19==31 - and r3,r3,#0xff - cmp r3,#0xf2 @ done? -#endif -#if 19<15 -# if __ARM_ARCH__>=7 - ldr r2,[r1],#4 @ prefetch -# else - ldrb r2,[r1,#3] -# endif - eor r3,r9,r10 @ a^b, b^c in next round -#else - ldr r2,[sp,#5*4] @ from future BODY_16_xx - eor r3,r9,r10 @ a^b, b^c in next round - ldr r1,[sp,#2*4] @ from future BODY_16_xx -#endif - eor r0,r0,r9,ror#20 @ Sigma0(a) - and r12,r12,r3 @ (b^c)&=(a^b) - add r4,r4,r8 @ d+=h - eor r12,r12,r10 @ Maj(a,b,c) - add r8,r8,r0,ror#2 @ h+=Sigma0(a) - @ add r8,r8,r12 @ h+=Maj(a,b,c) - @ ldr r2,[sp,#5*4] @ 20 - @ ldr r1,[sp,#2*4] - mov r0,r2,ror#7 - add r8,r8,r12 @ h+=Maj(a,b,c) from the past - mov r12,r1,ror#17 - eor r0,r0,r2,ror#18 - eor r12,r12,r1,ror#19 - eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) - ldr r2,[sp,#4*4] - eor r12,r12,r1,lsr#10 @ sigma1(X[i+14]) - ldr r1,[sp,#13*4] - - add r12,r12,r0 - eor r0,r4,r4,ror#5 @ from BODY_00_15 - add r2,r2,r12 - eor r0,r0,r4,ror#19 @ Sigma1(e) - add r2,r2,r1 @ X[i] - ldr r12,[r14],#4 @ *K256++ - add r7,r7,r2 @ h+=X[i] - str r2,[sp,#4*4] - eor r2,r5,r6 - add r7,r7,r0,ror#6 @ h+=Sigma1(e) - and r2,r2,r4 - add r7,r7,r12 @ h+=K256[i] - eor r2,r2,r6 @ Ch(e,f,g) - eor r0,r8,r8,ror#11 - add r7,r7,r2 @ h+=Ch(e,f,g) -#if 20==31 - and r12,r12,#0xff - cmp r12,#0xf2 @ done? -#endif -#if 20<15 -# if __ARM_ARCH__>=7 - ldr r2,[r1],#4 @ prefetch -# else - ldrb r2,[r1,#3] -# endif - eor r12,r8,r9 @ a^b, b^c in next round -#else - ldr r2,[sp,#6*4] @ from future BODY_16_xx - eor r12,r8,r9 @ a^b, b^c in next round - ldr r1,[sp,#3*4] @ from future BODY_16_xx -#endif - eor r0,r0,r8,ror#20 @ Sigma0(a) - and r3,r3,r12 @ (b^c)&=(a^b) - add r11,r11,r7 @ d+=h - eor r3,r3,r9 @ Maj(a,b,c) - add r7,r7,r0,ror#2 @ h+=Sigma0(a) - @ add r7,r7,r3 @ h+=Maj(a,b,c) - @ ldr r2,[sp,#6*4] @ 21 - @ ldr r1,[sp,#3*4] - mov r0,r2,ror#7 - add r7,r7,r3 @ h+=Maj(a,b,c) from the past - mov r3,r1,ror#17 - eor r0,r0,r2,ror#18 - eor r3,r3,r1,ror#19 - eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) - ldr r2,[sp,#5*4] - eor r3,r3,r1,lsr#10 @ sigma1(X[i+14]) - ldr r1,[sp,#14*4] - - add r3,r3,r0 - eor r0,r11,r11,ror#5 @ from BODY_00_15 - add r2,r2,r3 - eor r0,r0,r11,ror#19 @ Sigma1(e) - add r2,r2,r1 @ X[i] - ldr r3,[r14],#4 @ *K256++ - add r6,r6,r2 @ h+=X[i] - str r2,[sp,#5*4] - eor r2,r4,r5 - add r6,r6,r0,ror#6 @ h+=Sigma1(e) - and r2,r2,r11 - add r6,r6,r3 @ h+=K256[i] - eor r2,r2,r5 @ Ch(e,f,g) - eor r0,r7,r7,ror#11 - add r6,r6,r2 @ h+=Ch(e,f,g) -#if 21==31 - and r3,r3,#0xff - cmp r3,#0xf2 @ done? -#endif -#if 21<15 -# if __ARM_ARCH__>=7 - ldr r2,[r1],#4 @ prefetch -# else - ldrb r2,[r1,#3] -# endif - eor r3,r7,r8 @ a^b, b^c in next round -#else - ldr r2,[sp,#7*4] @ from future BODY_16_xx - eor r3,r7,r8 @ a^b, b^c in next round - ldr r1,[sp,#4*4] @ from future BODY_16_xx -#endif - eor r0,r0,r7,ror#20 @ Sigma0(a) - and r12,r12,r3 @ (b^c)&=(a^b) - add r10,r10,r6 @ d+=h - eor r12,r12,r8 @ Maj(a,b,c) - add r6,r6,r0,ror#2 @ h+=Sigma0(a) - @ add r6,r6,r12 @ h+=Maj(a,b,c) - @ ldr r2,[sp,#7*4] @ 22 - @ ldr r1,[sp,#4*4] - mov r0,r2,ror#7 - add r6,r6,r12 @ h+=Maj(a,b,c) from the past - mov r12,r1,ror#17 - eor r0,r0,r2,ror#18 - eor r12,r12,r1,ror#19 - eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) - ldr r2,[sp,#6*4] - eor r12,r12,r1,lsr#10 @ sigma1(X[i+14]) - ldr r1,[sp,#15*4] - - add r12,r12,r0 - eor r0,r10,r10,ror#5 @ from BODY_00_15 - add r2,r2,r12 - eor r0,r0,r10,ror#19 @ Sigma1(e) - add r2,r2,r1 @ X[i] - ldr r12,[r14],#4 @ *K256++ - add r5,r5,r2 @ h+=X[i] - str r2,[sp,#6*4] - eor r2,r11,r4 - add r5,r5,r0,ror#6 @ h+=Sigma1(e) - and r2,r2,r10 - add r5,r5,r12 @ h+=K256[i] - eor r2,r2,r4 @ Ch(e,f,g) - eor r0,r6,r6,ror#11 - add r5,r5,r2 @ h+=Ch(e,f,g) -#if 22==31 - and r12,r12,#0xff - cmp r12,#0xf2 @ done? -#endif -#if 22<15 -# if __ARM_ARCH__>=7 - ldr r2,[r1],#4 @ prefetch -# else - ldrb r2,[r1,#3] -# endif - eor r12,r6,r7 @ a^b, b^c in next round -#else - ldr r2,[sp,#8*4] @ from future BODY_16_xx - eor r12,r6,r7 @ a^b, b^c in next round - ldr r1,[sp,#5*4] @ from future BODY_16_xx -#endif - eor r0,r0,r6,ror#20 @ Sigma0(a) - and r3,r3,r12 @ (b^c)&=(a^b) - add r9,r9,r5 @ d+=h - eor r3,r3,r7 @ Maj(a,b,c) - add r5,r5,r0,ror#2 @ h+=Sigma0(a) - @ add r5,r5,r3 @ h+=Maj(a,b,c) - @ ldr r2,[sp,#8*4] @ 23 - @ ldr r1,[sp,#5*4] - mov r0,r2,ror#7 - add r5,r5,r3 @ h+=Maj(a,b,c) from the past - mov r3,r1,ror#17 - eor r0,r0,r2,ror#18 - eor r3,r3,r1,ror#19 - eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) - ldr r2,[sp,#7*4] - eor r3,r3,r1,lsr#10 @ sigma1(X[i+14]) - ldr r1,[sp,#0*4] - - add r3,r3,r0 - eor r0,r9,r9,ror#5 @ from BODY_00_15 - add r2,r2,r3 - eor r0,r0,r9,ror#19 @ Sigma1(e) - add r2,r2,r1 @ X[i] - ldr r3,[r14],#4 @ *K256++ - add r4,r4,r2 @ h+=X[i] - str r2,[sp,#7*4] - eor r2,r10,r11 - add r4,r4,r0,ror#6 @ h+=Sigma1(e) - and r2,r2,r9 - add r4,r4,r3 @ h+=K256[i] - eor r2,r2,r11 @ Ch(e,f,g) - eor r0,r5,r5,ror#11 - add r4,r4,r2 @ h+=Ch(e,f,g) -#if 23==31 - and r3,r3,#0xff - cmp r3,#0xf2 @ done? -#endif -#if 23<15 -# if __ARM_ARCH__>=7 - ldr r2,[r1],#4 @ prefetch -# else - ldrb r2,[r1,#3] -# endif - eor r3,r5,r6 @ a^b, b^c in next round -#else - ldr r2,[sp,#9*4] @ from future BODY_16_xx - eor r3,r5,r6 @ a^b, b^c in next round - ldr r1,[sp,#6*4] @ from future BODY_16_xx -#endif - eor r0,r0,r5,ror#20 @ Sigma0(a) - and r12,r12,r3 @ (b^c)&=(a^b) - add r8,r8,r4 @ d+=h - eor r12,r12,r6 @ Maj(a,b,c) - add r4,r4,r0,ror#2 @ h+=Sigma0(a) - @ add r4,r4,r12 @ h+=Maj(a,b,c) - @ ldr r2,[sp,#9*4] @ 24 - @ ldr r1,[sp,#6*4] - mov r0,r2,ror#7 - add r4,r4,r12 @ h+=Maj(a,b,c) from the past - mov r12,r1,ror#17 - eor r0,r0,r2,ror#18 - eor r12,r12,r1,ror#19 - eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) - ldr r2,[sp,#8*4] - eor r12,r12,r1,lsr#10 @ sigma1(X[i+14]) - ldr r1,[sp,#1*4] - - add r12,r12,r0 - eor r0,r8,r8,ror#5 @ from BODY_00_15 - add r2,r2,r12 - eor r0,r0,r8,ror#19 @ Sigma1(e) - add r2,r2,r1 @ X[i] - ldr r12,[r14],#4 @ *K256++ - add r11,r11,r2 @ h+=X[i] - str r2,[sp,#8*4] - eor r2,r9,r10 - add r11,r11,r0,ror#6 @ h+=Sigma1(e) - and r2,r2,r8 - add r11,r11,r12 @ h+=K256[i] - eor r2,r2,r10 @ Ch(e,f,g) - eor r0,r4,r4,ror#11 - add r11,r11,r2 @ h+=Ch(e,f,g) -#if 24==31 - and r12,r12,#0xff - cmp r12,#0xf2 @ done? -#endif -#if 24<15 -# if __ARM_ARCH__>=7 - ldr r2,[r1],#4 @ prefetch -# else - ldrb r2,[r1,#3] -# endif - eor r12,r4,r5 @ a^b, b^c in next round -#else - ldr r2,[sp,#10*4] @ from future BODY_16_xx - eor r12,r4,r5 @ a^b, b^c in next round - ldr r1,[sp,#7*4] @ from future BODY_16_xx -#endif - eor r0,r0,r4,ror#20 @ Sigma0(a) - and r3,r3,r12 @ (b^c)&=(a^b) - add r7,r7,r11 @ d+=h - eor r3,r3,r5 @ Maj(a,b,c) - add r11,r11,r0,ror#2 @ h+=Sigma0(a) - @ add r11,r11,r3 @ h+=Maj(a,b,c) - @ ldr r2,[sp,#10*4] @ 25 - @ ldr r1,[sp,#7*4] - mov r0,r2,ror#7 - add r11,r11,r3 @ h+=Maj(a,b,c) from the past - mov r3,r1,ror#17 - eor r0,r0,r2,ror#18 - eor r3,r3,r1,ror#19 - eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) - ldr r2,[sp,#9*4] - eor r3,r3,r1,lsr#10 @ sigma1(X[i+14]) - ldr r1,[sp,#2*4] - - add r3,r3,r0 - eor r0,r7,r7,ror#5 @ from BODY_00_15 - add r2,r2,r3 - eor r0,r0,r7,ror#19 @ Sigma1(e) - add r2,r2,r1 @ X[i] - ldr r3,[r14],#4 @ *K256++ - add r10,r10,r2 @ h+=X[i] - str r2,[sp,#9*4] - eor r2,r8,r9 - add r10,r10,r0,ror#6 @ h+=Sigma1(e) - and r2,r2,r7 - add r10,r10,r3 @ h+=K256[i] - eor r2,r2,r9 @ Ch(e,f,g) - eor r0,r11,r11,ror#11 - add r10,r10,r2 @ h+=Ch(e,f,g) -#if 25==31 - and r3,r3,#0xff - cmp r3,#0xf2 @ done? -#endif -#if 25<15 -# if __ARM_ARCH__>=7 - ldr r2,[r1],#4 @ prefetch -# else - ldrb r2,[r1,#3] -# endif - eor r3,r11,r4 @ a^b, b^c in next round -#else - ldr r2,[sp,#11*4] @ from future BODY_16_xx - eor r3,r11,r4 @ a^b, b^c in next round - ldr r1,[sp,#8*4] @ from future BODY_16_xx -#endif - eor r0,r0,r11,ror#20 @ Sigma0(a) - and r12,r12,r3 @ (b^c)&=(a^b) - add r6,r6,r10 @ d+=h - eor r12,r12,r4 @ Maj(a,b,c) - add r10,r10,r0,ror#2 @ h+=Sigma0(a) - @ add r10,r10,r12 @ h+=Maj(a,b,c) - @ ldr r2,[sp,#11*4] @ 26 - @ ldr r1,[sp,#8*4] - mov r0,r2,ror#7 - add r10,r10,r12 @ h+=Maj(a,b,c) from the past - mov r12,r1,ror#17 - eor r0,r0,r2,ror#18 - eor r12,r12,r1,ror#19 - eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) - ldr r2,[sp,#10*4] - eor r12,r12,r1,lsr#10 @ sigma1(X[i+14]) - ldr r1,[sp,#3*4] - - add r12,r12,r0 - eor r0,r6,r6,ror#5 @ from BODY_00_15 - add r2,r2,r12 - eor r0,r0,r6,ror#19 @ Sigma1(e) - add r2,r2,r1 @ X[i] - ldr r12,[r14],#4 @ *K256++ - add r9,r9,r2 @ h+=X[i] - str r2,[sp,#10*4] - eor r2,r7,r8 - add r9,r9,r0,ror#6 @ h+=Sigma1(e) - and r2,r2,r6 - add r9,r9,r12 @ h+=K256[i] - eor r2,r2,r8 @ Ch(e,f,g) - eor r0,r10,r10,ror#11 - add r9,r9,r2 @ h+=Ch(e,f,g) -#if 26==31 - and r12,r12,#0xff - cmp r12,#0xf2 @ done? -#endif -#if 26<15 -# if __ARM_ARCH__>=7 - ldr r2,[r1],#4 @ prefetch -# else - ldrb r2,[r1,#3] -# endif - eor r12,r10,r11 @ a^b, b^c in next round -#else - ldr r2,[sp,#12*4] @ from future BODY_16_xx - eor r12,r10,r11 @ a^b, b^c in next round - ldr r1,[sp,#9*4] @ from future BODY_16_xx -#endif - eor r0,r0,r10,ror#20 @ Sigma0(a) - and r3,r3,r12 @ (b^c)&=(a^b) - add r5,r5,r9 @ d+=h - eor r3,r3,r11 @ Maj(a,b,c) - add r9,r9,r0,ror#2 @ h+=Sigma0(a) - @ add r9,r9,r3 @ h+=Maj(a,b,c) - @ ldr r2,[sp,#12*4] @ 27 - @ ldr r1,[sp,#9*4] - mov r0,r2,ror#7 - add r9,r9,r3 @ h+=Maj(a,b,c) from the past - mov r3,r1,ror#17 - eor r0,r0,r2,ror#18 - eor r3,r3,r1,ror#19 - eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) - ldr r2,[sp,#11*4] - eor r3,r3,r1,lsr#10 @ sigma1(X[i+14]) - ldr r1,[sp,#4*4] - - add r3,r3,r0 - eor r0,r5,r5,ror#5 @ from BODY_00_15 - add r2,r2,r3 - eor r0,r0,r5,ror#19 @ Sigma1(e) - add r2,r2,r1 @ X[i] - ldr r3,[r14],#4 @ *K256++ - add r8,r8,r2 @ h+=X[i] - str r2,[sp,#11*4] - eor r2,r6,r7 - add r8,r8,r0,ror#6 @ h+=Sigma1(e) - and r2,r2,r5 - add r8,r8,r3 @ h+=K256[i] - eor r2,r2,r7 @ Ch(e,f,g) - eor r0,r9,r9,ror#11 - add r8,r8,r2 @ h+=Ch(e,f,g) -#if 27==31 - and r3,r3,#0xff - cmp r3,#0xf2 @ done? -#endif -#if 27<15 -# if __ARM_ARCH__>=7 - ldr r2,[r1],#4 @ prefetch -# else - ldrb r2,[r1,#3] -# endif - eor r3,r9,r10 @ a^b, b^c in next round -#else - ldr r2,[sp,#13*4] @ from future BODY_16_xx - eor r3,r9,r10 @ a^b, b^c in next round - ldr r1,[sp,#10*4] @ from future BODY_16_xx -#endif - eor r0,r0,r9,ror#20 @ Sigma0(a) - and r12,r12,r3 @ (b^c)&=(a^b) - add r4,r4,r8 @ d+=h - eor r12,r12,r10 @ Maj(a,b,c) - add r8,r8,r0,ror#2 @ h+=Sigma0(a) - @ add r8,r8,r12 @ h+=Maj(a,b,c) - @ ldr r2,[sp,#13*4] @ 28 - @ ldr r1,[sp,#10*4] - mov r0,r2,ror#7 - add r8,r8,r12 @ h+=Maj(a,b,c) from the past - mov r12,r1,ror#17 - eor r0,r0,r2,ror#18 - eor r12,r12,r1,ror#19 - eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) - ldr r2,[sp,#12*4] - eor r12,r12,r1,lsr#10 @ sigma1(X[i+14]) - ldr r1,[sp,#5*4] - - add r12,r12,r0 - eor r0,r4,r4,ror#5 @ from BODY_00_15 - add r2,r2,r12 - eor r0,r0,r4,ror#19 @ Sigma1(e) - add r2,r2,r1 @ X[i] - ldr r12,[r14],#4 @ *K256++ - add r7,r7,r2 @ h+=X[i] - str r2,[sp,#12*4] - eor r2,r5,r6 - add r7,r7,r0,ror#6 @ h+=Sigma1(e) - and r2,r2,r4 - add r7,r7,r12 @ h+=K256[i] - eor r2,r2,r6 @ Ch(e,f,g) - eor r0,r8,r8,ror#11 - add r7,r7,r2 @ h+=Ch(e,f,g) -#if 28==31 - and r12,r12,#0xff - cmp r12,#0xf2 @ done? -#endif -#if 28<15 -# if __ARM_ARCH__>=7 - ldr r2,[r1],#4 @ prefetch -# else - ldrb r2,[r1,#3] -# endif - eor r12,r8,r9 @ a^b, b^c in next round -#else - ldr r2,[sp,#14*4] @ from future BODY_16_xx - eor r12,r8,r9 @ a^b, b^c in next round - ldr r1,[sp,#11*4] @ from future BODY_16_xx -#endif - eor r0,r0,r8,ror#20 @ Sigma0(a) - and r3,r3,r12 @ (b^c)&=(a^b) - add r11,r11,r7 @ d+=h - eor r3,r3,r9 @ Maj(a,b,c) - add r7,r7,r0,ror#2 @ h+=Sigma0(a) - @ add r7,r7,r3 @ h+=Maj(a,b,c) - @ ldr r2,[sp,#14*4] @ 29 - @ ldr r1,[sp,#11*4] - mov r0,r2,ror#7 - add r7,r7,r3 @ h+=Maj(a,b,c) from the past - mov r3,r1,ror#17 - eor r0,r0,r2,ror#18 - eor r3,r3,r1,ror#19 - eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) - ldr r2,[sp,#13*4] - eor r3,r3,r1,lsr#10 @ sigma1(X[i+14]) - ldr r1,[sp,#6*4] - - add r3,r3,r0 - eor r0,r11,r11,ror#5 @ from BODY_00_15 - add r2,r2,r3 - eor r0,r0,r11,ror#19 @ Sigma1(e) - add r2,r2,r1 @ X[i] - ldr r3,[r14],#4 @ *K256++ - add r6,r6,r2 @ h+=X[i] - str r2,[sp,#13*4] - eor r2,r4,r5 - add r6,r6,r0,ror#6 @ h+=Sigma1(e) - and r2,r2,r11 - add r6,r6,r3 @ h+=K256[i] - eor r2,r2,r5 @ Ch(e,f,g) - eor r0,r7,r7,ror#11 - add r6,r6,r2 @ h+=Ch(e,f,g) -#if 29==31 - and r3,r3,#0xff - cmp r3,#0xf2 @ done? -#endif -#if 29<15 -# if __ARM_ARCH__>=7 - ldr r2,[r1],#4 @ prefetch -# else - ldrb r2,[r1,#3] -# endif - eor r3,r7,r8 @ a^b, b^c in next round -#else - ldr r2,[sp,#15*4] @ from future BODY_16_xx - eor r3,r7,r8 @ a^b, b^c in next round - ldr r1,[sp,#12*4] @ from future BODY_16_xx -#endif - eor r0,r0,r7,ror#20 @ Sigma0(a) - and r12,r12,r3 @ (b^c)&=(a^b) - add r10,r10,r6 @ d+=h - eor r12,r12,r8 @ Maj(a,b,c) - add r6,r6,r0,ror#2 @ h+=Sigma0(a) - @ add r6,r6,r12 @ h+=Maj(a,b,c) - @ ldr r2,[sp,#15*4] @ 30 - @ ldr r1,[sp,#12*4] - mov r0,r2,ror#7 - add r6,r6,r12 @ h+=Maj(a,b,c) from the past - mov r12,r1,ror#17 - eor r0,r0,r2,ror#18 - eor r12,r12,r1,ror#19 - eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) - ldr r2,[sp,#14*4] - eor r12,r12,r1,lsr#10 @ sigma1(X[i+14]) - ldr r1,[sp,#7*4] - - add r12,r12,r0 - eor r0,r10,r10,ror#5 @ from BODY_00_15 - add r2,r2,r12 - eor r0,r0,r10,ror#19 @ Sigma1(e) - add r2,r2,r1 @ X[i] - ldr r12,[r14],#4 @ *K256++ - add r5,r5,r2 @ h+=X[i] - str r2,[sp,#14*4] - eor r2,r11,r4 - add r5,r5,r0,ror#6 @ h+=Sigma1(e) - and r2,r2,r10 - add r5,r5,r12 @ h+=K256[i] - eor r2,r2,r4 @ Ch(e,f,g) - eor r0,r6,r6,ror#11 - add r5,r5,r2 @ h+=Ch(e,f,g) -#if 30==31 - and r12,r12,#0xff - cmp r12,#0xf2 @ done? -#endif -#if 30<15 -# if __ARM_ARCH__>=7 - ldr r2,[r1],#4 @ prefetch -# else - ldrb r2,[r1,#3] -# endif - eor r12,r6,r7 @ a^b, b^c in next round -#else - ldr r2,[sp,#0*4] @ from future BODY_16_xx - eor r12,r6,r7 @ a^b, b^c in next round - ldr r1,[sp,#13*4] @ from future BODY_16_xx -#endif - eor r0,r0,r6,ror#20 @ Sigma0(a) - and r3,r3,r12 @ (b^c)&=(a^b) - add r9,r9,r5 @ d+=h - eor r3,r3,r7 @ Maj(a,b,c) - add r5,r5,r0,ror#2 @ h+=Sigma0(a) - @ add r5,r5,r3 @ h+=Maj(a,b,c) - @ ldr r2,[sp,#0*4] @ 31 - @ ldr r1,[sp,#13*4] - mov r0,r2,ror#7 - add r5,r5,r3 @ h+=Maj(a,b,c) from the past - mov r3,r1,ror#17 - eor r0,r0,r2,ror#18 - eor r3,r3,r1,ror#19 - eor r0,r0,r2,lsr#3 @ sigma0(X[i+1]) - ldr r2,[sp,#15*4] - eor r3,r3,r1,lsr#10 @ sigma1(X[i+14]) - ldr r1,[sp,#8*4] - - add r3,r3,r0 - eor r0,r9,r9,ror#5 @ from BODY_00_15 - add r2,r2,r3 - eor r0,r0,r9,ror#19 @ Sigma1(e) - add r2,r2,r1 @ X[i] - ldr r3,[r14],#4 @ *K256++ - add r4,r4,r2 @ h+=X[i] - str r2,[sp,#15*4] - eor r2,r10,r11 - add r4,r4,r0,ror#6 @ h+=Sigma1(e) - and r2,r2,r9 - add r4,r4,r3 @ h+=K256[i] - eor r2,r2,r11 @ Ch(e,f,g) - eor r0,r5,r5,ror#11 - add r4,r4,r2 @ h+=Ch(e,f,g) -#if 31==31 - and r3,r3,#0xff - cmp r3,#0xf2 @ done? -#endif -#if 31<15 -# if __ARM_ARCH__>=7 - ldr r2,[r1],#4 @ prefetch -# else - ldrb r2,[r1,#3] -# endif - eor r3,r5,r6 @ a^b, b^c in next round -#else - ldr r2,[sp,#1*4] @ from future BODY_16_xx - eor r3,r5,r6 @ a^b, b^c in next round - ldr r1,[sp,#14*4] @ from future BODY_16_xx -#endif - eor r0,r0,r5,ror#20 @ Sigma0(a) - and r12,r12,r3 @ (b^c)&=(a^b) - add r8,r8,r4 @ d+=h - eor r12,r12,r6 @ Maj(a,b,c) - add r4,r4,r0,ror#2 @ h+=Sigma0(a) - @ add r4,r4,r12 @ h+=Maj(a,b,c) -#if __ARM_ARCH__>=7 - ite eq @ Thumb2 thing, sanity check in ARM -#endif - ldreq r3,[sp,#16*4] @ pull ctx - bne .Lrounds_16_xx - - add r4,r4,r12 @ h+=Maj(a,b,c) from the past - ldr r0,[r3,#0] - ldr r2,[r3,#4] - ldr r12,[r3,#8] - add r4,r4,r0 - ldr r0,[r3,#12] - add r5,r5,r2 - ldr r2,[r3,#16] - add r6,r6,r12 - ldr r12,[r3,#20] - add r7,r7,r0 - ldr r0,[r3,#24] - add r8,r8,r2 - ldr r2,[r3,#28] - add r9,r9,r12 - ldr r1,[sp,#17*4] @ pull inp - ldr r12,[sp,#18*4] @ pull inp+len - add r10,r10,r0 - add r11,r11,r2 - stmia r3,{r4,r5,r6,r7,r8,r9,r10,r11} - cmp r1,r12 - sub r14,r14,#256 @ rewind Ktbl - bne .Loop - - add sp,sp,#19*4 @ destroy frame -#if __ARM_ARCH__>=5 - ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,pc} -#else - ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,lr} - tst lr,#1 - moveq pc,lr @ be binary compatible with V4, yet -.word 0xe12fff1e @ interoperable with Thumb ISA:-) -#endif -.size GFp_sha256_block_data_order,.-GFp_sha256_block_data_order -#if __ARM_MAX_ARCH__>=7 -.arch armv7-a -.fpu neon - -.type sha256_block_data_order_neon,%function -.align 5 -.skip 16 -sha256_block_data_order_neon: -.LNEON: - stmdb sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} - - sub r11,sp,#16*4+16 - adr r14,K256 - bic r11,r11,#15 @ align for 128-bit stores - mov r12,sp - mov sp,r11 @ alloca - add r2,r1,r2,lsl#6 @ len to point at the end of inp - - vld1.8 {q0},[r1]! - vld1.8 {q1},[r1]! - vld1.8 {q2},[r1]! - vld1.8 {q3},[r1]! - vld1.32 {q8},[r14,:128]! - vld1.32 {q9},[r14,:128]! - vld1.32 {q10},[r14,:128]! - vld1.32 {q11},[r14,:128]! - vrev32.8 q0,q0 @ yes, even on - str r0,[sp,#64] - vrev32.8 q1,q1 @ big-endian - str r1,[sp,#68] - mov r1,sp - vrev32.8 q2,q2 - str r2,[sp,#72] - vrev32.8 q3,q3 - str r12,[sp,#76] @ save original sp - vadd.i32 q8,q8,q0 - vadd.i32 q9,q9,q1 - vst1.32 {q8},[r1,:128]! - vadd.i32 q10,q10,q2 - vst1.32 {q9},[r1,:128]! - vadd.i32 q11,q11,q3 - vst1.32 {q10},[r1,:128]! - vst1.32 {q11},[r1,:128]! - - ldmia r0,{r4,r5,r6,r7,r8,r9,r10,r11} - sub r1,r1,#64 - ldr r2,[sp,#0] - eor r12,r12,r12 - eor r3,r5,r6 - b .L_00_48 - -.align 4 -.L_00_48: - vext.8 q8,q0,q1,#4 - add r11,r11,r2 - eor r2,r9,r10 - eor r0,r8,r8,ror#5 - vext.8 q9,q2,q3,#4 - add r4,r4,r12 - and r2,r2,r8 - eor r12,r0,r8,ror#19 - vshr.u32 q10,q8,#7 - eor r0,r4,r4,ror#11 - eor r2,r2,r10 - vadd.i32 q0,q0,q9 - add r11,r11,r12,ror#6 - eor r12,r4,r5 - vshr.u32 q9,q8,#3 - eor r0,r0,r4,ror#20 - add r11,r11,r2 - vsli.32 q10,q8,#25 - ldr r2,[sp,#4] - and r3,r3,r12 - vshr.u32 q11,q8,#18 - add r7,r7,r11 - add r11,r11,r0,ror#2 - eor r3,r3,r5 - veor q9,q9,q10 - add r10,r10,r2 - vsli.32 q11,q8,#14 - eor r2,r8,r9 - eor r0,r7,r7,ror#5 - vshr.u32 d24,d7,#17 - add r11,r11,r3 - and r2,r2,r7 - veor q9,q9,q11 - eor r3,r0,r7,ror#19 - eor r0,r11,r11,ror#11 - vsli.32 d24,d7,#15 - eor r2,r2,r9 - add r10,r10,r3,ror#6 - vshr.u32 d25,d7,#10 - eor r3,r11,r4 - eor r0,r0,r11,ror#20 - vadd.i32 q0,q0,q9 - add r10,r10,r2 - ldr r2,[sp,#8] - veor d25,d25,d24 - and r12,r12,r3 - add r6,r6,r10 - vshr.u32 d24,d7,#19 - add r10,r10,r0,ror#2 - eor r12,r12,r4 - vsli.32 d24,d7,#13 - add r9,r9,r2 - eor r2,r7,r8 - veor d25,d25,d24 - eor r0,r6,r6,ror#5 - add r10,r10,r12 - vadd.i32 d0,d0,d25 - and r2,r2,r6 - eor r12,r0,r6,ror#19 - vshr.u32 d24,d0,#17 - eor r0,r10,r10,ror#11 - eor r2,r2,r8 - vsli.32 d24,d0,#15 - add r9,r9,r12,ror#6 - eor r12,r10,r11 - vshr.u32 d25,d0,#10 - eor r0,r0,r10,ror#20 - add r9,r9,r2 - veor d25,d25,d24 - ldr r2,[sp,#12] - and r3,r3,r12 - vshr.u32 d24,d0,#19 - add r5,r5,r9 - add r9,r9,r0,ror#2 - eor r3,r3,r11 - vld1.32 {q8},[r14,:128]! - add r8,r8,r2 - vsli.32 d24,d0,#13 - eor r2,r6,r7 - eor r0,r5,r5,ror#5 - veor d25,d25,d24 - add r9,r9,r3 - and r2,r2,r5 - vadd.i32 d1,d1,d25 - eor r3,r0,r5,ror#19 - eor r0,r9,r9,ror#11 - vadd.i32 q8,q8,q0 - eor r2,r2,r7 - add r8,r8,r3,ror#6 - eor r3,r9,r10 - eor r0,r0,r9,ror#20 - add r8,r8,r2 - ldr r2,[sp,#16] - and r12,r12,r3 - add r4,r4,r8 - vst1.32 {q8},[r1,:128]! - add r8,r8,r0,ror#2 - eor r12,r12,r10 - vext.8 q8,q1,q2,#4 - add r7,r7,r2 - eor r2,r5,r6 - eor r0,r4,r4,ror#5 - vext.8 q9,q3,q0,#4 - add r8,r8,r12 - and r2,r2,r4 - eor r12,r0,r4,ror#19 - vshr.u32 q10,q8,#7 - eor r0,r8,r8,ror#11 - eor r2,r2,r6 - vadd.i32 q1,q1,q9 - add r7,r7,r12,ror#6 - eor r12,r8,r9 - vshr.u32 q9,q8,#3 - eor r0,r0,r8,ror#20 - add r7,r7,r2 - vsli.32 q10,q8,#25 - ldr r2,[sp,#20] - and r3,r3,r12 - vshr.u32 q11,q8,#18 - add r11,r11,r7 - add r7,r7,r0,ror#2 - eor r3,r3,r9 - veor q9,q9,q10 - add r6,r6,r2 - vsli.32 q11,q8,#14 - eor r2,r4,r5 - eor r0,r11,r11,ror#5 - vshr.u32 d24,d1,#17 - add r7,r7,r3 - and r2,r2,r11 - veor q9,q9,q11 - eor r3,r0,r11,ror#19 - eor r0,r7,r7,ror#11 - vsli.32 d24,d1,#15 - eor r2,r2,r5 - add r6,r6,r3,ror#6 - vshr.u32 d25,d1,#10 - eor r3,r7,r8 - eor r0,r0,r7,ror#20 - vadd.i32 q1,q1,q9 - add r6,r6,r2 - ldr r2,[sp,#24] - veor d25,d25,d24 - and r12,r12,r3 - add r10,r10,r6 - vshr.u32 d24,d1,#19 - add r6,r6,r0,ror#2 - eor r12,r12,r8 - vsli.32 d24,d1,#13 - add r5,r5,r2 - eor r2,r11,r4 - veor d25,d25,d24 - eor r0,r10,r10,ror#5 - add r6,r6,r12 - vadd.i32 d2,d2,d25 - and r2,r2,r10 - eor r12,r0,r10,ror#19 - vshr.u32 d24,d2,#17 - eor r0,r6,r6,ror#11 - eor r2,r2,r4 - vsli.32 d24,d2,#15 - add r5,r5,r12,ror#6 - eor r12,r6,r7 - vshr.u32 d25,d2,#10 - eor r0,r0,r6,ror#20 - add r5,r5,r2 - veor d25,d25,d24 - ldr r2,[sp,#28] - and r3,r3,r12 - vshr.u32 d24,d2,#19 - add r9,r9,r5 - add r5,r5,r0,ror#2 - eor r3,r3,r7 - vld1.32 {q8},[r14,:128]! - add r4,r4,r2 - vsli.32 d24,d2,#13 - eor r2,r10,r11 - eor r0,r9,r9,ror#5 - veor d25,d25,d24 - add r5,r5,r3 - and r2,r2,r9 - vadd.i32 d3,d3,d25 - eor r3,r0,r9,ror#19 - eor r0,r5,r5,ror#11 - vadd.i32 q8,q8,q1 - eor r2,r2,r11 - add r4,r4,r3,ror#6 - eor r3,r5,r6 - eor r0,r0,r5,ror#20 - add r4,r4,r2 - ldr r2,[sp,#32] - and r12,r12,r3 - add r8,r8,r4 - vst1.32 {q8},[r1,:128]! - add r4,r4,r0,ror#2 - eor r12,r12,r6 - vext.8 q8,q2,q3,#4 - add r11,r11,r2 - eor r2,r9,r10 - eor r0,r8,r8,ror#5 - vext.8 q9,q0,q1,#4 - add r4,r4,r12 - and r2,r2,r8 - eor r12,r0,r8,ror#19 - vshr.u32 q10,q8,#7 - eor r0,r4,r4,ror#11 - eor r2,r2,r10 - vadd.i32 q2,q2,q9 - add r11,r11,r12,ror#6 - eor r12,r4,r5 - vshr.u32 q9,q8,#3 - eor r0,r0,r4,ror#20 - add r11,r11,r2 - vsli.32 q10,q8,#25 - ldr r2,[sp,#36] - and r3,r3,r12 - vshr.u32 q11,q8,#18 - add r7,r7,r11 - add r11,r11,r0,ror#2 - eor r3,r3,r5 - veor q9,q9,q10 - add r10,r10,r2 - vsli.32 q11,q8,#14 - eor r2,r8,r9 - eor r0,r7,r7,ror#5 - vshr.u32 d24,d3,#17 - add r11,r11,r3 - and r2,r2,r7 - veor q9,q9,q11 - eor r3,r0,r7,ror#19 - eor r0,r11,r11,ror#11 - vsli.32 d24,d3,#15 - eor r2,r2,r9 - add r10,r10,r3,ror#6 - vshr.u32 d25,d3,#10 - eor r3,r11,r4 - eor r0,r0,r11,ror#20 - vadd.i32 q2,q2,q9 - add r10,r10,r2 - ldr r2,[sp,#40] - veor d25,d25,d24 - and r12,r12,r3 - add r6,r6,r10 - vshr.u32 d24,d3,#19 - add r10,r10,r0,ror#2 - eor r12,r12,r4 - vsli.32 d24,d3,#13 - add r9,r9,r2 - eor r2,r7,r8 - veor d25,d25,d24 - eor r0,r6,r6,ror#5 - add r10,r10,r12 - vadd.i32 d4,d4,d25 - and r2,r2,r6 - eor r12,r0,r6,ror#19 - vshr.u32 d24,d4,#17 - eor r0,r10,r10,ror#11 - eor r2,r2,r8 - vsli.32 d24,d4,#15 - add r9,r9,r12,ror#6 - eor r12,r10,r11 - vshr.u32 d25,d4,#10 - eor r0,r0,r10,ror#20 - add r9,r9,r2 - veor d25,d25,d24 - ldr r2,[sp,#44] - and r3,r3,r12 - vshr.u32 d24,d4,#19 - add r5,r5,r9 - add r9,r9,r0,ror#2 - eor r3,r3,r11 - vld1.32 {q8},[r14,:128]! - add r8,r8,r2 - vsli.32 d24,d4,#13 - eor r2,r6,r7 - eor r0,r5,r5,ror#5 - veor d25,d25,d24 - add r9,r9,r3 - and r2,r2,r5 - vadd.i32 d5,d5,d25 - eor r3,r0,r5,ror#19 - eor r0,r9,r9,ror#11 - vadd.i32 q8,q8,q2 - eor r2,r2,r7 - add r8,r8,r3,ror#6 - eor r3,r9,r10 - eor r0,r0,r9,ror#20 - add r8,r8,r2 - ldr r2,[sp,#48] - and r12,r12,r3 - add r4,r4,r8 - vst1.32 {q8},[r1,:128]! - add r8,r8,r0,ror#2 - eor r12,r12,r10 - vext.8 q8,q3,q0,#4 - add r7,r7,r2 - eor r2,r5,r6 - eor r0,r4,r4,ror#5 - vext.8 q9,q1,q2,#4 - add r8,r8,r12 - and r2,r2,r4 - eor r12,r0,r4,ror#19 - vshr.u32 q10,q8,#7 - eor r0,r8,r8,ror#11 - eor r2,r2,r6 - vadd.i32 q3,q3,q9 - add r7,r7,r12,ror#6 - eor r12,r8,r9 - vshr.u32 q9,q8,#3 - eor r0,r0,r8,ror#20 - add r7,r7,r2 - vsli.32 q10,q8,#25 - ldr r2,[sp,#52] - and r3,r3,r12 - vshr.u32 q11,q8,#18 - add r11,r11,r7 - add r7,r7,r0,ror#2 - eor r3,r3,r9 - veor q9,q9,q10 - add r6,r6,r2 - vsli.32 q11,q8,#14 - eor r2,r4,r5 - eor r0,r11,r11,ror#5 - vshr.u32 d24,d5,#17 - add r7,r7,r3 - and r2,r2,r11 - veor q9,q9,q11 - eor r3,r0,r11,ror#19 - eor r0,r7,r7,ror#11 - vsli.32 d24,d5,#15 - eor r2,r2,r5 - add r6,r6,r3,ror#6 - vshr.u32 d25,d5,#10 - eor r3,r7,r8 - eor r0,r0,r7,ror#20 - vadd.i32 q3,q3,q9 - add r6,r6,r2 - ldr r2,[sp,#56] - veor d25,d25,d24 - and r12,r12,r3 - add r10,r10,r6 - vshr.u32 d24,d5,#19 - add r6,r6,r0,ror#2 - eor r12,r12,r8 - vsli.32 d24,d5,#13 - add r5,r5,r2 - eor r2,r11,r4 - veor d25,d25,d24 - eor r0,r10,r10,ror#5 - add r6,r6,r12 - vadd.i32 d6,d6,d25 - and r2,r2,r10 - eor r12,r0,r10,ror#19 - vshr.u32 d24,d6,#17 - eor r0,r6,r6,ror#11 - eor r2,r2,r4 - vsli.32 d24,d6,#15 - add r5,r5,r12,ror#6 - eor r12,r6,r7 - vshr.u32 d25,d6,#10 - eor r0,r0,r6,ror#20 - add r5,r5,r2 - veor d25,d25,d24 - ldr r2,[sp,#60] - and r3,r3,r12 - vshr.u32 d24,d6,#19 - add r9,r9,r5 - add r5,r5,r0,ror#2 - eor r3,r3,r7 - vld1.32 {q8},[r14,:128]! - add r4,r4,r2 - vsli.32 d24,d6,#13 - eor r2,r10,r11 - eor r0,r9,r9,ror#5 - veor d25,d25,d24 - add r5,r5,r3 - and r2,r2,r9 - vadd.i32 d7,d7,d25 - eor r3,r0,r9,ror#19 - eor r0,r5,r5,ror#11 - vadd.i32 q8,q8,q3 - eor r2,r2,r11 - add r4,r4,r3,ror#6 - eor r3,r5,r6 - eor r0,r0,r5,ror#20 - add r4,r4,r2 - ldr r2,[r14] - and r12,r12,r3 - add r8,r8,r4 - vst1.32 {q8},[r1,:128]! - add r4,r4,r0,ror#2 - eor r12,r12,r6 - teq r2,#0 @ check for K256 terminator - ldr r2,[sp,#0] - sub r1,r1,#64 - bne .L_00_48 - - ldr r1,[sp,#68] - ldr r0,[sp,#72] - sub r14,r14,#256 @ rewind r14 - teq r1,r0 - it eq - subeq r1,r1,#64 @ avoid SEGV - vld1.8 {q0},[r1]! @ load next input block - vld1.8 {q1},[r1]! - vld1.8 {q2},[r1]! - vld1.8 {q3},[r1]! - it ne - strne r1,[sp,#68] - mov r1,sp - add r11,r11,r2 - eor r2,r9,r10 - eor r0,r8,r8,ror#5 - add r4,r4,r12 - vld1.32 {q8},[r14,:128]! - and r2,r2,r8 - eor r12,r0,r8,ror#19 - eor r0,r4,r4,ror#11 - eor r2,r2,r10 - vrev32.8 q0,q0 - add r11,r11,r12,ror#6 - eor r12,r4,r5 - eor r0,r0,r4,ror#20 - add r11,r11,r2 - vadd.i32 q8,q8,q0 - ldr r2,[sp,#4] - and r3,r3,r12 - add r7,r7,r11 - add r11,r11,r0,ror#2 - eor r3,r3,r5 - add r10,r10,r2 - eor r2,r8,r9 - eor r0,r7,r7,ror#5 - add r11,r11,r3 - and r2,r2,r7 - eor r3,r0,r7,ror#19 - eor r0,r11,r11,ror#11 - eor r2,r2,r9 - add r10,r10,r3,ror#6 - eor r3,r11,r4 - eor r0,r0,r11,ror#20 - add r10,r10,r2 - ldr r2,[sp,#8] - and r12,r12,r3 - add r6,r6,r10 - add r10,r10,r0,ror#2 - eor r12,r12,r4 - add r9,r9,r2 - eor r2,r7,r8 - eor r0,r6,r6,ror#5 - add r10,r10,r12 - and r2,r2,r6 - eor r12,r0,r6,ror#19 - eor r0,r10,r10,ror#11 - eor r2,r2,r8 - add r9,r9,r12,ror#6 - eor r12,r10,r11 - eor r0,r0,r10,ror#20 - add r9,r9,r2 - ldr r2,[sp,#12] - and r3,r3,r12 - add r5,r5,r9 - add r9,r9,r0,ror#2 - eor r3,r3,r11 - add r8,r8,r2 - eor r2,r6,r7 - eor r0,r5,r5,ror#5 - add r9,r9,r3 - and r2,r2,r5 - eor r3,r0,r5,ror#19 - eor r0,r9,r9,ror#11 - eor r2,r2,r7 - add r8,r8,r3,ror#6 - eor r3,r9,r10 - eor r0,r0,r9,ror#20 - add r8,r8,r2 - ldr r2,[sp,#16] - and r12,r12,r3 - add r4,r4,r8 - add r8,r8,r0,ror#2 - eor r12,r12,r10 - vst1.32 {q8},[r1,:128]! - add r7,r7,r2 - eor r2,r5,r6 - eor r0,r4,r4,ror#5 - add r8,r8,r12 - vld1.32 {q8},[r14,:128]! - and r2,r2,r4 - eor r12,r0,r4,ror#19 - eor r0,r8,r8,ror#11 - eor r2,r2,r6 - vrev32.8 q1,q1 - add r7,r7,r12,ror#6 - eor r12,r8,r9 - eor r0,r0,r8,ror#20 - add r7,r7,r2 - vadd.i32 q8,q8,q1 - ldr r2,[sp,#20] - and r3,r3,r12 - add r11,r11,r7 - add r7,r7,r0,ror#2 - eor r3,r3,r9 - add r6,r6,r2 - eor r2,r4,r5 - eor r0,r11,r11,ror#5 - add r7,r7,r3 - and r2,r2,r11 - eor r3,r0,r11,ror#19 - eor r0,r7,r7,ror#11 - eor r2,r2,r5 - add r6,r6,r3,ror#6 - eor r3,r7,r8 - eor r0,r0,r7,ror#20 - add r6,r6,r2 - ldr r2,[sp,#24] - and r12,r12,r3 - add r10,r10,r6 - add r6,r6,r0,ror#2 - eor r12,r12,r8 - add r5,r5,r2 - eor r2,r11,r4 - eor r0,r10,r10,ror#5 - add r6,r6,r12 - and r2,r2,r10 - eor r12,r0,r10,ror#19 - eor r0,r6,r6,ror#11 - eor r2,r2,r4 - add r5,r5,r12,ror#6 - eor r12,r6,r7 - eor r0,r0,r6,ror#20 - add r5,r5,r2 - ldr r2,[sp,#28] - and r3,r3,r12 - add r9,r9,r5 - add r5,r5,r0,ror#2 - eor r3,r3,r7 - add r4,r4,r2 - eor r2,r10,r11 - eor r0,r9,r9,ror#5 - add r5,r5,r3 - and r2,r2,r9 - eor r3,r0,r9,ror#19 - eor r0,r5,r5,ror#11 - eor r2,r2,r11 - add r4,r4,r3,ror#6 - eor r3,r5,r6 - eor r0,r0,r5,ror#20 - add r4,r4,r2 - ldr r2,[sp,#32] - and r12,r12,r3 - add r8,r8,r4 - add r4,r4,r0,ror#2 - eor r12,r12,r6 - vst1.32 {q8},[r1,:128]! - add r11,r11,r2 - eor r2,r9,r10 - eor r0,r8,r8,ror#5 - add r4,r4,r12 - vld1.32 {q8},[r14,:128]! - and r2,r2,r8 - eor r12,r0,r8,ror#19 - eor r0,r4,r4,ror#11 - eor r2,r2,r10 - vrev32.8 q2,q2 - add r11,r11,r12,ror#6 - eor r12,r4,r5 - eor r0,r0,r4,ror#20 - add r11,r11,r2 - vadd.i32 q8,q8,q2 - ldr r2,[sp,#36] - and r3,r3,r12 - add r7,r7,r11 - add r11,r11,r0,ror#2 - eor r3,r3,r5 - add r10,r10,r2 - eor r2,r8,r9 - eor r0,r7,r7,ror#5 - add r11,r11,r3 - and r2,r2,r7 - eor r3,r0,r7,ror#19 - eor r0,r11,r11,ror#11 - eor r2,r2,r9 - add r10,r10,r3,ror#6 - eor r3,r11,r4 - eor r0,r0,r11,ror#20 - add r10,r10,r2 - ldr r2,[sp,#40] - and r12,r12,r3 - add r6,r6,r10 - add r10,r10,r0,ror#2 - eor r12,r12,r4 - add r9,r9,r2 - eor r2,r7,r8 - eor r0,r6,r6,ror#5 - add r10,r10,r12 - and r2,r2,r6 - eor r12,r0,r6,ror#19 - eor r0,r10,r10,ror#11 - eor r2,r2,r8 - add r9,r9,r12,ror#6 - eor r12,r10,r11 - eor r0,r0,r10,ror#20 - add r9,r9,r2 - ldr r2,[sp,#44] - and r3,r3,r12 - add r5,r5,r9 - add r9,r9,r0,ror#2 - eor r3,r3,r11 - add r8,r8,r2 - eor r2,r6,r7 - eor r0,r5,r5,ror#5 - add r9,r9,r3 - and r2,r2,r5 - eor r3,r0,r5,ror#19 - eor r0,r9,r9,ror#11 - eor r2,r2,r7 - add r8,r8,r3,ror#6 - eor r3,r9,r10 - eor r0,r0,r9,ror#20 - add r8,r8,r2 - ldr r2,[sp,#48] - and r12,r12,r3 - add r4,r4,r8 - add r8,r8,r0,ror#2 - eor r12,r12,r10 - vst1.32 {q8},[r1,:128]! - add r7,r7,r2 - eor r2,r5,r6 - eor r0,r4,r4,ror#5 - add r8,r8,r12 - vld1.32 {q8},[r14,:128]! - and r2,r2,r4 - eor r12,r0,r4,ror#19 - eor r0,r8,r8,ror#11 - eor r2,r2,r6 - vrev32.8 q3,q3 - add r7,r7,r12,ror#6 - eor r12,r8,r9 - eor r0,r0,r8,ror#20 - add r7,r7,r2 - vadd.i32 q8,q8,q3 - ldr r2,[sp,#52] - and r3,r3,r12 - add r11,r11,r7 - add r7,r7,r0,ror#2 - eor r3,r3,r9 - add r6,r6,r2 - eor r2,r4,r5 - eor r0,r11,r11,ror#5 - add r7,r7,r3 - and r2,r2,r11 - eor r3,r0,r11,ror#19 - eor r0,r7,r7,ror#11 - eor r2,r2,r5 - add r6,r6,r3,ror#6 - eor r3,r7,r8 - eor r0,r0,r7,ror#20 - add r6,r6,r2 - ldr r2,[sp,#56] - and r12,r12,r3 - add r10,r10,r6 - add r6,r6,r0,ror#2 - eor r12,r12,r8 - add r5,r5,r2 - eor r2,r11,r4 - eor r0,r10,r10,ror#5 - add r6,r6,r12 - and r2,r2,r10 - eor r12,r0,r10,ror#19 - eor r0,r6,r6,ror#11 - eor r2,r2,r4 - add r5,r5,r12,ror#6 - eor r12,r6,r7 - eor r0,r0,r6,ror#20 - add r5,r5,r2 - ldr r2,[sp,#60] - and r3,r3,r12 - add r9,r9,r5 - add r5,r5,r0,ror#2 - eor r3,r3,r7 - add r4,r4,r2 - eor r2,r10,r11 - eor r0,r9,r9,ror#5 - add r5,r5,r3 - and r2,r2,r9 - eor r3,r0,r9,ror#19 - eor r0,r5,r5,ror#11 - eor r2,r2,r11 - add r4,r4,r3,ror#6 - eor r3,r5,r6 - eor r0,r0,r5,ror#20 - add r4,r4,r2 - ldr r2,[sp,#64] - and r12,r12,r3 - add r8,r8,r4 - add r4,r4,r0,ror#2 - eor r12,r12,r6 - vst1.32 {q8},[r1,:128]! - ldr r0,[r2,#0] - add r4,r4,r12 @ h+=Maj(a,b,c) from the past - ldr r12,[r2,#4] - ldr r3,[r2,#8] - ldr r1,[r2,#12] - add r4,r4,r0 @ accumulate - ldr r0,[r2,#16] - add r5,r5,r12 - ldr r12,[r2,#20] - add r6,r6,r3 - ldr r3,[r2,#24] - add r7,r7,r1 - ldr r1,[r2,#28] - add r8,r8,r0 - str r4,[r2],#4 - add r9,r9,r12 - str r5,[r2],#4 - add r10,r10,r3 - str r6,[r2],#4 - add r11,r11,r1 - str r7,[r2],#4 - stmia r2,{r8,r9,r10,r11} - - ittte ne - movne r1,sp - ldrne r2,[sp,#0] - eorne r12,r12,r12 - ldreq sp,[sp,#76] @ restore original sp - itt ne - eorne r3,r5,r6 - bne .L_00_48 - - ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,pc} -.size sha256_block_data_order_neon,.-sha256_block_data_order_neon -#endif -#if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__) - -# if defined(__thumb2__) -# define INST(a,b,c,d) .byte c,d|0xc,a,b -# else -# define INST(a,b,c,d) .byte a,b,c,d -# endif - -.type sha256_block_data_order_armv8,%function -.align 5 -sha256_block_data_order_armv8: -.LARMv8: - vld1.32 {q0,q1},[r0] - sub r3,r3,#256+32 - add r2,r1,r2,lsl#6 @ len to point at the end of inp - b .Loop_v8 - -.align 4 -.Loop_v8: - vld1.8 {q8,q9},[r1]! - vld1.8 {q10,q11},[r1]! - vld1.32 {q12},[r3]! - vrev32.8 q8,q8 - vrev32.8 q9,q9 - vrev32.8 q10,q10 - vrev32.8 q11,q11 - vmov q14,q0 @ offload - vmov q15,q1 - teq r1,r2 - vld1.32 {q13},[r3]! - vadd.i32 q12,q12,q8 - INST(0xe2,0x03,0xfa,0xf3) @ sha256su0 q8,q9 - vmov q2,q0 - INST(0x68,0x0c,0x02,0xf3) @ sha256h q0,q1,q12 - INST(0x68,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q12 - INST(0xe6,0x0c,0x64,0xf3) @ sha256su1 q8,q10,q11 - vld1.32 {q12},[r3]! - vadd.i32 q13,q13,q9 - INST(0xe4,0x23,0xfa,0xf3) @ sha256su0 q9,q10 - vmov q2,q0 - INST(0x6a,0x0c,0x02,0xf3) @ sha256h q0,q1,q13 - INST(0x6a,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q13 - INST(0xe0,0x2c,0x66,0xf3) @ sha256su1 q9,q11,q8 - vld1.32 {q13},[r3]! - vadd.i32 q12,q12,q10 - INST(0xe6,0x43,0xfa,0xf3) @ sha256su0 q10,q11 - vmov q2,q0 - INST(0x68,0x0c,0x02,0xf3) @ sha256h q0,q1,q12 - INST(0x68,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q12 - INST(0xe2,0x4c,0x60,0xf3) @ sha256su1 q10,q8,q9 - vld1.32 {q12},[r3]! - vadd.i32 q13,q13,q11 - INST(0xe0,0x63,0xfa,0xf3) @ sha256su0 q11,q8 - vmov q2,q0 - INST(0x6a,0x0c,0x02,0xf3) @ sha256h q0,q1,q13 - INST(0x6a,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q13 - INST(0xe4,0x6c,0x62,0xf3) @ sha256su1 q11,q9,q10 - vld1.32 {q13},[r3]! - vadd.i32 q12,q12,q8 - INST(0xe2,0x03,0xfa,0xf3) @ sha256su0 q8,q9 - vmov q2,q0 - INST(0x68,0x0c,0x02,0xf3) @ sha256h q0,q1,q12 - INST(0x68,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q12 - INST(0xe6,0x0c,0x64,0xf3) @ sha256su1 q8,q10,q11 - vld1.32 {q12},[r3]! - vadd.i32 q13,q13,q9 - INST(0xe4,0x23,0xfa,0xf3) @ sha256su0 q9,q10 - vmov q2,q0 - INST(0x6a,0x0c,0x02,0xf3) @ sha256h q0,q1,q13 - INST(0x6a,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q13 - INST(0xe0,0x2c,0x66,0xf3) @ sha256su1 q9,q11,q8 - vld1.32 {q13},[r3]! - vadd.i32 q12,q12,q10 - INST(0xe6,0x43,0xfa,0xf3) @ sha256su0 q10,q11 - vmov q2,q0 - INST(0x68,0x0c,0x02,0xf3) @ sha256h q0,q1,q12 - INST(0x68,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q12 - INST(0xe2,0x4c,0x60,0xf3) @ sha256su1 q10,q8,q9 - vld1.32 {q12},[r3]! - vadd.i32 q13,q13,q11 - INST(0xe0,0x63,0xfa,0xf3) @ sha256su0 q11,q8 - vmov q2,q0 - INST(0x6a,0x0c,0x02,0xf3) @ sha256h q0,q1,q13 - INST(0x6a,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q13 - INST(0xe4,0x6c,0x62,0xf3) @ sha256su1 q11,q9,q10 - vld1.32 {q13},[r3]! - vadd.i32 q12,q12,q8 - INST(0xe2,0x03,0xfa,0xf3) @ sha256su0 q8,q9 - vmov q2,q0 - INST(0x68,0x0c,0x02,0xf3) @ sha256h q0,q1,q12 - INST(0x68,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q12 - INST(0xe6,0x0c,0x64,0xf3) @ sha256su1 q8,q10,q11 - vld1.32 {q12},[r3]! - vadd.i32 q13,q13,q9 - INST(0xe4,0x23,0xfa,0xf3) @ sha256su0 q9,q10 - vmov q2,q0 - INST(0x6a,0x0c,0x02,0xf3) @ sha256h q0,q1,q13 - INST(0x6a,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q13 - INST(0xe0,0x2c,0x66,0xf3) @ sha256su1 q9,q11,q8 - vld1.32 {q13},[r3]! - vadd.i32 q12,q12,q10 - INST(0xe6,0x43,0xfa,0xf3) @ sha256su0 q10,q11 - vmov q2,q0 - INST(0x68,0x0c,0x02,0xf3) @ sha256h q0,q1,q12 - INST(0x68,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q12 - INST(0xe2,0x4c,0x60,0xf3) @ sha256su1 q10,q8,q9 - vld1.32 {q12},[r3]! - vadd.i32 q13,q13,q11 - INST(0xe0,0x63,0xfa,0xf3) @ sha256su0 q11,q8 - vmov q2,q0 - INST(0x6a,0x0c,0x02,0xf3) @ sha256h q0,q1,q13 - INST(0x6a,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q13 - INST(0xe4,0x6c,0x62,0xf3) @ sha256su1 q11,q9,q10 - vld1.32 {q13},[r3]! - vadd.i32 q12,q12,q8 - vmov q2,q0 - INST(0x68,0x0c,0x02,0xf3) @ sha256h q0,q1,q12 - INST(0x68,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q12 - - vld1.32 {q12},[r3]! - vadd.i32 q13,q13,q9 - vmov q2,q0 - INST(0x6a,0x0c,0x02,0xf3) @ sha256h q0,q1,q13 - INST(0x6a,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q13 - - vld1.32 {q13},[r3] - vadd.i32 q12,q12,q10 - sub r3,r3,#256-16 @ rewind - vmov q2,q0 - INST(0x68,0x0c,0x02,0xf3) @ sha256h q0,q1,q12 - INST(0x68,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q12 - - vadd.i32 q13,q13,q11 - vmov q2,q0 - INST(0x6a,0x0c,0x02,0xf3) @ sha256h q0,q1,q13 - INST(0x6a,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q13 - - vadd.i32 q0,q0,q14 - vadd.i32 q1,q1,q15 - it ne - bne .Loop_v8 - - vst1.32 {q0,q1},[r0] - - bx lr @ bx lr -.size sha256_block_data_order_armv8,.-sha256_block_data_order_armv8 -#endif -.byte 83,72,65,50,53,54,32,98,108,111,99,107,32,116,114,97,110,115,102,111,114,109,32,102,111,114,32,65,82,77,118,52,47,78,69,79,78,47,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 -.align 2 -#endif -#endif // !OPENSSL_NO_ASM -.section .note.GNU-stack,"",%progbits diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/sha256-armv8-ios64.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/sha256-armv8-ios64.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/sha256-armv8-ios64.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/sha256-armv8-ios64.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,1208 +0,0 @@ -// This file is generated from a similarly-named Perl script in the BoringSSL -// source tree. Do not edit by hand. - -#if !defined(__has_feature) -#define __has_feature(x) 0 -#endif -#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) -#define OPENSSL_NO_ASM -#endif - -#if !defined(OPENSSL_NO_ASM) -// Copyright 2014-2016 The OpenSSL Project Authors. All Rights Reserved. -// -// Licensed under the OpenSSL license (the "License"). You may not use -// this file except in compliance with the License. You can obtain a copy -// in the file LICENSE in the source distribution or at -// https://www.openssl.org/source/license.html - -// ==================================================================== -// Written by Andy Polyakov for the OpenSSL -// project. The module is, however, dual licensed under OpenSSL and -// CRYPTOGAMS licenses depending on where you obtain it. For further -// details see http://www.openssl.org/~appro/cryptogams/. -// -// Permission to use under GPLv2 terms is granted. -// ==================================================================== -// -// SHA256/512 for ARMv8. -// -// Performance in cycles per processed byte and improvement coefficient -// over code generated with "default" compiler: -// -// SHA256-hw SHA256(*) SHA512 -// Apple A7 1.97 10.5 (+33%) 6.73 (-1%(**)) -// Cortex-A53 2.38 15.5 (+115%) 10.0 (+150%(***)) -// Cortex-A57 2.31 11.6 (+86%) 7.51 (+260%(***)) -// Denver 2.01 10.5 (+26%) 6.70 (+8%) -// X-Gene 20.0 (+100%) 12.8 (+300%(***)) -// Mongoose 2.36 13.0 (+50%) 8.36 (+33%) -// -// (*) Software SHA256 results are of lesser relevance, presented -// mostly for informational purposes. -// (**) The result is a trade-off: it's possible to improve it by -// 10% (or by 1 cycle per round), but at the cost of 20% loss -// on Cortex-A53 (or by 4 cycles per round). -// (***) Super-impressive coefficients over gcc-generated code are -// indication of some compiler "pathology", most notably code -// generated with -mgeneral-regs-only is significanty faster -// and the gap is only 40-90%. - -#ifndef __KERNEL__ -# include -#endif - -.text - - -.private_extern _GFp_armcap_P -.globl _GFp_sha256_block_data_order -.private_extern _GFp_sha256_block_data_order - -.align 6 -_GFp_sha256_block_data_order: - AARCH64_VALID_CALL_TARGET -#ifndef __KERNEL__ -#if __has_feature(hwaddress_sanitizer) && __clang_major__ >= 10 - adrp x16,:pg_hi21_nc:_GFp_armcap_P -#else - adrp x16,_GFp_armcap_P@PAGE -#endif - ldr w16,[x16,_GFp_armcap_P@PAGEOFF] - tst w16,#ARMV8_SHA256 - b.ne Lv8_entry -#endif - AARCH64_SIGN_LINK_REGISTER - stp x29,x30,[sp,#-128]! - add x29,sp,#0 - - stp x19,x20,[sp,#16] - stp x21,x22,[sp,#32] - stp x23,x24,[sp,#48] - stp x25,x26,[sp,#64] - stp x27,x28,[sp,#80] - sub sp,sp,#4*4 - - ldp w20,w21,[x0] // load context - ldp w22,w23,[x0,#2*4] - ldp w24,w25,[x0,#4*4] - add x2,x1,x2,lsl#6 // end of input - ldp w26,w27,[x0,#6*4] - adrp x30,LK256@PAGE - add x30,x30,LK256@PAGEOFF - stp x0,x2,[x29,#96] - -Loop: - ldp w3,w4,[x1],#2*4 - ldr w19,[x30],#4 // *K++ - eor w28,w21,w22 // magic seed - str x1,[x29,#112] -#ifndef __ARMEB__ - rev w3,w3 // 0 -#endif - ror w16,w24,#6 - add w27,w27,w19 // h+=K[i] - eor w6,w24,w24,ror#14 - and w17,w25,w24 - bic w19,w26,w24 - add w27,w27,w3 // h+=X[i] - orr w17,w17,w19 // Ch(e,f,g) - eor w19,w20,w21 // a^b, b^c in next round - eor w16,w16,w6,ror#11 // Sigma1(e) - ror w6,w20,#2 - add w27,w27,w17 // h+=Ch(e,f,g) - eor w17,w20,w20,ror#9 - add w27,w27,w16 // h+=Sigma1(e) - and w28,w28,w19 // (b^c)&=(a^b) - add w23,w23,w27 // d+=h - eor w28,w28,w21 // Maj(a,b,c) - eor w17,w6,w17,ror#13 // Sigma0(a) - add w27,w27,w28 // h+=Maj(a,b,c) - ldr w28,[x30],#4 // *K++, w19 in next round - //add w27,w27,w17 // h+=Sigma0(a) -#ifndef __ARMEB__ - rev w4,w4 // 1 -#endif - ldp w5,w6,[x1],#2*4 - add w27,w27,w17 // h+=Sigma0(a) - ror w16,w23,#6 - add w26,w26,w28 // h+=K[i] - eor w7,w23,w23,ror#14 - and w17,w24,w23 - bic w28,w25,w23 - add w26,w26,w4 // h+=X[i] - orr w17,w17,w28 // Ch(e,f,g) - eor w28,w27,w20 // a^b, b^c in next round - eor w16,w16,w7,ror#11 // Sigma1(e) - ror w7,w27,#2 - add w26,w26,w17 // h+=Ch(e,f,g) - eor w17,w27,w27,ror#9 - add w26,w26,w16 // h+=Sigma1(e) - and w19,w19,w28 // (b^c)&=(a^b) - add w22,w22,w26 // d+=h - eor w19,w19,w20 // Maj(a,b,c) - eor w17,w7,w17,ror#13 // Sigma0(a) - add w26,w26,w19 // h+=Maj(a,b,c) - ldr w19,[x30],#4 // *K++, w28 in next round - //add w26,w26,w17 // h+=Sigma0(a) -#ifndef __ARMEB__ - rev w5,w5 // 2 -#endif - add w26,w26,w17 // h+=Sigma0(a) - ror w16,w22,#6 - add w25,w25,w19 // h+=K[i] - eor w8,w22,w22,ror#14 - and w17,w23,w22 - bic w19,w24,w22 - add w25,w25,w5 // h+=X[i] - orr w17,w17,w19 // Ch(e,f,g) - eor w19,w26,w27 // a^b, b^c in next round - eor w16,w16,w8,ror#11 // Sigma1(e) - ror w8,w26,#2 - add w25,w25,w17 // h+=Ch(e,f,g) - eor w17,w26,w26,ror#9 - add w25,w25,w16 // h+=Sigma1(e) - and w28,w28,w19 // (b^c)&=(a^b) - add w21,w21,w25 // d+=h - eor w28,w28,w27 // Maj(a,b,c) - eor w17,w8,w17,ror#13 // Sigma0(a) - add w25,w25,w28 // h+=Maj(a,b,c) - ldr w28,[x30],#4 // *K++, w19 in next round - //add w25,w25,w17 // h+=Sigma0(a) -#ifndef __ARMEB__ - rev w6,w6 // 3 -#endif - ldp w7,w8,[x1],#2*4 - add w25,w25,w17 // h+=Sigma0(a) - ror w16,w21,#6 - add w24,w24,w28 // h+=K[i] - eor w9,w21,w21,ror#14 - and w17,w22,w21 - bic w28,w23,w21 - add w24,w24,w6 // h+=X[i] - orr w17,w17,w28 // Ch(e,f,g) - eor w28,w25,w26 // a^b, b^c in next round - eor w16,w16,w9,ror#11 // Sigma1(e) - ror w9,w25,#2 - add w24,w24,w17 // h+=Ch(e,f,g) - eor w17,w25,w25,ror#9 - add w24,w24,w16 // h+=Sigma1(e) - and w19,w19,w28 // (b^c)&=(a^b) - add w20,w20,w24 // d+=h - eor w19,w19,w26 // Maj(a,b,c) - eor w17,w9,w17,ror#13 // Sigma0(a) - add w24,w24,w19 // h+=Maj(a,b,c) - ldr w19,[x30],#4 // *K++, w28 in next round - //add w24,w24,w17 // h+=Sigma0(a) -#ifndef __ARMEB__ - rev w7,w7 // 4 -#endif - add w24,w24,w17 // h+=Sigma0(a) - ror w16,w20,#6 - add w23,w23,w19 // h+=K[i] - eor w10,w20,w20,ror#14 - and w17,w21,w20 - bic w19,w22,w20 - add w23,w23,w7 // h+=X[i] - orr w17,w17,w19 // Ch(e,f,g) - eor w19,w24,w25 // a^b, b^c in next round - eor w16,w16,w10,ror#11 // Sigma1(e) - ror w10,w24,#2 - add w23,w23,w17 // h+=Ch(e,f,g) - eor w17,w24,w24,ror#9 - add w23,w23,w16 // h+=Sigma1(e) - and w28,w28,w19 // (b^c)&=(a^b) - add w27,w27,w23 // d+=h - eor w28,w28,w25 // Maj(a,b,c) - eor w17,w10,w17,ror#13 // Sigma0(a) - add w23,w23,w28 // h+=Maj(a,b,c) - ldr w28,[x30],#4 // *K++, w19 in next round - //add w23,w23,w17 // h+=Sigma0(a) -#ifndef __ARMEB__ - rev w8,w8 // 5 -#endif - ldp w9,w10,[x1],#2*4 - add w23,w23,w17 // h+=Sigma0(a) - ror w16,w27,#6 - add w22,w22,w28 // h+=K[i] - eor w11,w27,w27,ror#14 - and w17,w20,w27 - bic w28,w21,w27 - add w22,w22,w8 // h+=X[i] - orr w17,w17,w28 // Ch(e,f,g) - eor w28,w23,w24 // a^b, b^c in next round - eor w16,w16,w11,ror#11 // Sigma1(e) - ror w11,w23,#2 - add w22,w22,w17 // h+=Ch(e,f,g) - eor w17,w23,w23,ror#9 - add w22,w22,w16 // h+=Sigma1(e) - and w19,w19,w28 // (b^c)&=(a^b) - add w26,w26,w22 // d+=h - eor w19,w19,w24 // Maj(a,b,c) - eor w17,w11,w17,ror#13 // Sigma0(a) - add w22,w22,w19 // h+=Maj(a,b,c) - ldr w19,[x30],#4 // *K++, w28 in next round - //add w22,w22,w17 // h+=Sigma0(a) -#ifndef __ARMEB__ - rev w9,w9 // 6 -#endif - add w22,w22,w17 // h+=Sigma0(a) - ror w16,w26,#6 - add w21,w21,w19 // h+=K[i] - eor w12,w26,w26,ror#14 - and w17,w27,w26 - bic w19,w20,w26 - add w21,w21,w9 // h+=X[i] - orr w17,w17,w19 // Ch(e,f,g) - eor w19,w22,w23 // a^b, b^c in next round - eor w16,w16,w12,ror#11 // Sigma1(e) - ror w12,w22,#2 - add w21,w21,w17 // h+=Ch(e,f,g) - eor w17,w22,w22,ror#9 - add w21,w21,w16 // h+=Sigma1(e) - and w28,w28,w19 // (b^c)&=(a^b) - add w25,w25,w21 // d+=h - eor w28,w28,w23 // Maj(a,b,c) - eor w17,w12,w17,ror#13 // Sigma0(a) - add w21,w21,w28 // h+=Maj(a,b,c) - ldr w28,[x30],#4 // *K++, w19 in next round - //add w21,w21,w17 // h+=Sigma0(a) -#ifndef __ARMEB__ - rev w10,w10 // 7 -#endif - ldp w11,w12,[x1],#2*4 - add w21,w21,w17 // h+=Sigma0(a) - ror w16,w25,#6 - add w20,w20,w28 // h+=K[i] - eor w13,w25,w25,ror#14 - and w17,w26,w25 - bic w28,w27,w25 - add w20,w20,w10 // h+=X[i] - orr w17,w17,w28 // Ch(e,f,g) - eor w28,w21,w22 // a^b, b^c in next round - eor w16,w16,w13,ror#11 // Sigma1(e) - ror w13,w21,#2 - add w20,w20,w17 // h+=Ch(e,f,g) - eor w17,w21,w21,ror#9 - add w20,w20,w16 // h+=Sigma1(e) - and w19,w19,w28 // (b^c)&=(a^b) - add w24,w24,w20 // d+=h - eor w19,w19,w22 // Maj(a,b,c) - eor w17,w13,w17,ror#13 // Sigma0(a) - add w20,w20,w19 // h+=Maj(a,b,c) - ldr w19,[x30],#4 // *K++, w28 in next round - //add w20,w20,w17 // h+=Sigma0(a) -#ifndef __ARMEB__ - rev w11,w11 // 8 -#endif - add w20,w20,w17 // h+=Sigma0(a) - ror w16,w24,#6 - add w27,w27,w19 // h+=K[i] - eor w14,w24,w24,ror#14 - and w17,w25,w24 - bic w19,w26,w24 - add w27,w27,w11 // h+=X[i] - orr w17,w17,w19 // Ch(e,f,g) - eor w19,w20,w21 // a^b, b^c in next round - eor w16,w16,w14,ror#11 // Sigma1(e) - ror w14,w20,#2 - add w27,w27,w17 // h+=Ch(e,f,g) - eor w17,w20,w20,ror#9 - add w27,w27,w16 // h+=Sigma1(e) - and w28,w28,w19 // (b^c)&=(a^b) - add w23,w23,w27 // d+=h - eor w28,w28,w21 // Maj(a,b,c) - eor w17,w14,w17,ror#13 // Sigma0(a) - add w27,w27,w28 // h+=Maj(a,b,c) - ldr w28,[x30],#4 // *K++, w19 in next round - //add w27,w27,w17 // h+=Sigma0(a) -#ifndef __ARMEB__ - rev w12,w12 // 9 -#endif - ldp w13,w14,[x1],#2*4 - add w27,w27,w17 // h+=Sigma0(a) - ror w16,w23,#6 - add w26,w26,w28 // h+=K[i] - eor w15,w23,w23,ror#14 - and w17,w24,w23 - bic w28,w25,w23 - add w26,w26,w12 // h+=X[i] - orr w17,w17,w28 // Ch(e,f,g) - eor w28,w27,w20 // a^b, b^c in next round - eor w16,w16,w15,ror#11 // Sigma1(e) - ror w15,w27,#2 - add w26,w26,w17 // h+=Ch(e,f,g) - eor w17,w27,w27,ror#9 - add w26,w26,w16 // h+=Sigma1(e) - and w19,w19,w28 // (b^c)&=(a^b) - add w22,w22,w26 // d+=h - eor w19,w19,w20 // Maj(a,b,c) - eor w17,w15,w17,ror#13 // Sigma0(a) - add w26,w26,w19 // h+=Maj(a,b,c) - ldr w19,[x30],#4 // *K++, w28 in next round - //add w26,w26,w17 // h+=Sigma0(a) -#ifndef __ARMEB__ - rev w13,w13 // 10 -#endif - add w26,w26,w17 // h+=Sigma0(a) - ror w16,w22,#6 - add w25,w25,w19 // h+=K[i] - eor w0,w22,w22,ror#14 - and w17,w23,w22 - bic w19,w24,w22 - add w25,w25,w13 // h+=X[i] - orr w17,w17,w19 // Ch(e,f,g) - eor w19,w26,w27 // a^b, b^c in next round - eor w16,w16,w0,ror#11 // Sigma1(e) - ror w0,w26,#2 - add w25,w25,w17 // h+=Ch(e,f,g) - eor w17,w26,w26,ror#9 - add w25,w25,w16 // h+=Sigma1(e) - and w28,w28,w19 // (b^c)&=(a^b) - add w21,w21,w25 // d+=h - eor w28,w28,w27 // Maj(a,b,c) - eor w17,w0,w17,ror#13 // Sigma0(a) - add w25,w25,w28 // h+=Maj(a,b,c) - ldr w28,[x30],#4 // *K++, w19 in next round - //add w25,w25,w17 // h+=Sigma0(a) -#ifndef __ARMEB__ - rev w14,w14 // 11 -#endif - ldp w15,w0,[x1],#2*4 - add w25,w25,w17 // h+=Sigma0(a) - str w6,[sp,#12] - ror w16,w21,#6 - add w24,w24,w28 // h+=K[i] - eor w6,w21,w21,ror#14 - and w17,w22,w21 - bic w28,w23,w21 - add w24,w24,w14 // h+=X[i] - orr w17,w17,w28 // Ch(e,f,g) - eor w28,w25,w26 // a^b, b^c in next round - eor w16,w16,w6,ror#11 // Sigma1(e) - ror w6,w25,#2 - add w24,w24,w17 // h+=Ch(e,f,g) - eor w17,w25,w25,ror#9 - add w24,w24,w16 // h+=Sigma1(e) - and w19,w19,w28 // (b^c)&=(a^b) - add w20,w20,w24 // d+=h - eor w19,w19,w26 // Maj(a,b,c) - eor w17,w6,w17,ror#13 // Sigma0(a) - add w24,w24,w19 // h+=Maj(a,b,c) - ldr w19,[x30],#4 // *K++, w28 in next round - //add w24,w24,w17 // h+=Sigma0(a) -#ifndef __ARMEB__ - rev w15,w15 // 12 -#endif - add w24,w24,w17 // h+=Sigma0(a) - str w7,[sp,#0] - ror w16,w20,#6 - add w23,w23,w19 // h+=K[i] - eor w7,w20,w20,ror#14 - and w17,w21,w20 - bic w19,w22,w20 - add w23,w23,w15 // h+=X[i] - orr w17,w17,w19 // Ch(e,f,g) - eor w19,w24,w25 // a^b, b^c in next round - eor w16,w16,w7,ror#11 // Sigma1(e) - ror w7,w24,#2 - add w23,w23,w17 // h+=Ch(e,f,g) - eor w17,w24,w24,ror#9 - add w23,w23,w16 // h+=Sigma1(e) - and w28,w28,w19 // (b^c)&=(a^b) - add w27,w27,w23 // d+=h - eor w28,w28,w25 // Maj(a,b,c) - eor w17,w7,w17,ror#13 // Sigma0(a) - add w23,w23,w28 // h+=Maj(a,b,c) - ldr w28,[x30],#4 // *K++, w19 in next round - //add w23,w23,w17 // h+=Sigma0(a) -#ifndef __ARMEB__ - rev w0,w0 // 13 -#endif - ldp w1,w2,[x1] - add w23,w23,w17 // h+=Sigma0(a) - str w8,[sp,#4] - ror w16,w27,#6 - add w22,w22,w28 // h+=K[i] - eor w8,w27,w27,ror#14 - and w17,w20,w27 - bic w28,w21,w27 - add w22,w22,w0 // h+=X[i] - orr w17,w17,w28 // Ch(e,f,g) - eor w28,w23,w24 // a^b, b^c in next round - eor w16,w16,w8,ror#11 // Sigma1(e) - ror w8,w23,#2 - add w22,w22,w17 // h+=Ch(e,f,g) - eor w17,w23,w23,ror#9 - add w22,w22,w16 // h+=Sigma1(e) - and w19,w19,w28 // (b^c)&=(a^b) - add w26,w26,w22 // d+=h - eor w19,w19,w24 // Maj(a,b,c) - eor w17,w8,w17,ror#13 // Sigma0(a) - add w22,w22,w19 // h+=Maj(a,b,c) - ldr w19,[x30],#4 // *K++, w28 in next round - //add w22,w22,w17 // h+=Sigma0(a) -#ifndef __ARMEB__ - rev w1,w1 // 14 -#endif - ldr w6,[sp,#12] - add w22,w22,w17 // h+=Sigma0(a) - str w9,[sp,#8] - ror w16,w26,#6 - add w21,w21,w19 // h+=K[i] - eor w9,w26,w26,ror#14 - and w17,w27,w26 - bic w19,w20,w26 - add w21,w21,w1 // h+=X[i] - orr w17,w17,w19 // Ch(e,f,g) - eor w19,w22,w23 // a^b, b^c in next round - eor w16,w16,w9,ror#11 // Sigma1(e) - ror w9,w22,#2 - add w21,w21,w17 // h+=Ch(e,f,g) - eor w17,w22,w22,ror#9 - add w21,w21,w16 // h+=Sigma1(e) - and w28,w28,w19 // (b^c)&=(a^b) - add w25,w25,w21 // d+=h - eor w28,w28,w23 // Maj(a,b,c) - eor w17,w9,w17,ror#13 // Sigma0(a) - add w21,w21,w28 // h+=Maj(a,b,c) - ldr w28,[x30],#4 // *K++, w19 in next round - //add w21,w21,w17 // h+=Sigma0(a) -#ifndef __ARMEB__ - rev w2,w2 // 15 -#endif - ldr w7,[sp,#0] - add w21,w21,w17 // h+=Sigma0(a) - str w10,[sp,#12] - ror w16,w25,#6 - add w20,w20,w28 // h+=K[i] - ror w9,w4,#7 - and w17,w26,w25 - ror w8,w1,#17 - bic w28,w27,w25 - ror w10,w21,#2 - add w20,w20,w2 // h+=X[i] - eor w16,w16,w25,ror#11 - eor w9,w9,w4,ror#18 - orr w17,w17,w28 // Ch(e,f,g) - eor w28,w21,w22 // a^b, b^c in next round - eor w16,w16,w25,ror#25 // Sigma1(e) - eor w10,w10,w21,ror#13 - add w20,w20,w17 // h+=Ch(e,f,g) - and w19,w19,w28 // (b^c)&=(a^b) - eor w8,w8,w1,ror#19 - eor w9,w9,w4,lsr#3 // sigma0(X[i+1]) - add w20,w20,w16 // h+=Sigma1(e) - eor w19,w19,w22 // Maj(a,b,c) - eor w17,w10,w21,ror#22 // Sigma0(a) - eor w8,w8,w1,lsr#10 // sigma1(X[i+14]) - add w3,w3,w12 - add w24,w24,w20 // d+=h - add w20,w20,w19 // h+=Maj(a,b,c) - ldr w19,[x30],#4 // *K++, w28 in next round - add w3,w3,w9 - add w20,w20,w17 // h+=Sigma0(a) - add w3,w3,w8 -Loop_16_xx: - ldr w8,[sp,#4] - str w11,[sp,#0] - ror w16,w24,#6 - add w27,w27,w19 // h+=K[i] - ror w10,w5,#7 - and w17,w25,w24 - ror w9,w2,#17 - bic w19,w26,w24 - ror w11,w20,#2 - add w27,w27,w3 // h+=X[i] - eor w16,w16,w24,ror#11 - eor w10,w10,w5,ror#18 - orr w17,w17,w19 // Ch(e,f,g) - eor w19,w20,w21 // a^b, b^c in next round - eor w16,w16,w24,ror#25 // Sigma1(e) - eor w11,w11,w20,ror#13 - add w27,w27,w17 // h+=Ch(e,f,g) - and w28,w28,w19 // (b^c)&=(a^b) - eor w9,w9,w2,ror#19 - eor w10,w10,w5,lsr#3 // sigma0(X[i+1]) - add w27,w27,w16 // h+=Sigma1(e) - eor w28,w28,w21 // Maj(a,b,c) - eor w17,w11,w20,ror#22 // Sigma0(a) - eor w9,w9,w2,lsr#10 // sigma1(X[i+14]) - add w4,w4,w13 - add w23,w23,w27 // d+=h - add w27,w27,w28 // h+=Maj(a,b,c) - ldr w28,[x30],#4 // *K++, w19 in next round - add w4,w4,w10 - add w27,w27,w17 // h+=Sigma0(a) - add w4,w4,w9 - ldr w9,[sp,#8] - str w12,[sp,#4] - ror w16,w23,#6 - add w26,w26,w28 // h+=K[i] - ror w11,w6,#7 - and w17,w24,w23 - ror w10,w3,#17 - bic w28,w25,w23 - ror w12,w27,#2 - add w26,w26,w4 // h+=X[i] - eor w16,w16,w23,ror#11 - eor w11,w11,w6,ror#18 - orr w17,w17,w28 // Ch(e,f,g) - eor w28,w27,w20 // a^b, b^c in next round - eor w16,w16,w23,ror#25 // Sigma1(e) - eor w12,w12,w27,ror#13 - add w26,w26,w17 // h+=Ch(e,f,g) - and w19,w19,w28 // (b^c)&=(a^b) - eor w10,w10,w3,ror#19 - eor w11,w11,w6,lsr#3 // sigma0(X[i+1]) - add w26,w26,w16 // h+=Sigma1(e) - eor w19,w19,w20 // Maj(a,b,c) - eor w17,w12,w27,ror#22 // Sigma0(a) - eor w10,w10,w3,lsr#10 // sigma1(X[i+14]) - add w5,w5,w14 - add w22,w22,w26 // d+=h - add w26,w26,w19 // h+=Maj(a,b,c) - ldr w19,[x30],#4 // *K++, w28 in next round - add w5,w5,w11 - add w26,w26,w17 // h+=Sigma0(a) - add w5,w5,w10 - ldr w10,[sp,#12] - str w13,[sp,#8] - ror w16,w22,#6 - add w25,w25,w19 // h+=K[i] - ror w12,w7,#7 - and w17,w23,w22 - ror w11,w4,#17 - bic w19,w24,w22 - ror w13,w26,#2 - add w25,w25,w5 // h+=X[i] - eor w16,w16,w22,ror#11 - eor w12,w12,w7,ror#18 - orr w17,w17,w19 // Ch(e,f,g) - eor w19,w26,w27 // a^b, b^c in next round - eor w16,w16,w22,ror#25 // Sigma1(e) - eor w13,w13,w26,ror#13 - add w25,w25,w17 // h+=Ch(e,f,g) - and w28,w28,w19 // (b^c)&=(a^b) - eor w11,w11,w4,ror#19 - eor w12,w12,w7,lsr#3 // sigma0(X[i+1]) - add w25,w25,w16 // h+=Sigma1(e) - eor w28,w28,w27 // Maj(a,b,c) - eor w17,w13,w26,ror#22 // Sigma0(a) - eor w11,w11,w4,lsr#10 // sigma1(X[i+14]) - add w6,w6,w15 - add w21,w21,w25 // d+=h - add w25,w25,w28 // h+=Maj(a,b,c) - ldr w28,[x30],#4 // *K++, w19 in next round - add w6,w6,w12 - add w25,w25,w17 // h+=Sigma0(a) - add w6,w6,w11 - ldr w11,[sp,#0] - str w14,[sp,#12] - ror w16,w21,#6 - add w24,w24,w28 // h+=K[i] - ror w13,w8,#7 - and w17,w22,w21 - ror w12,w5,#17 - bic w28,w23,w21 - ror w14,w25,#2 - add w24,w24,w6 // h+=X[i] - eor w16,w16,w21,ror#11 - eor w13,w13,w8,ror#18 - orr w17,w17,w28 // Ch(e,f,g) - eor w28,w25,w26 // a^b, b^c in next round - eor w16,w16,w21,ror#25 // Sigma1(e) - eor w14,w14,w25,ror#13 - add w24,w24,w17 // h+=Ch(e,f,g) - and w19,w19,w28 // (b^c)&=(a^b) - eor w12,w12,w5,ror#19 - eor w13,w13,w8,lsr#3 // sigma0(X[i+1]) - add w24,w24,w16 // h+=Sigma1(e) - eor w19,w19,w26 // Maj(a,b,c) - eor w17,w14,w25,ror#22 // Sigma0(a) - eor w12,w12,w5,lsr#10 // sigma1(X[i+14]) - add w7,w7,w0 - add w20,w20,w24 // d+=h - add w24,w24,w19 // h+=Maj(a,b,c) - ldr w19,[x30],#4 // *K++, w28 in next round - add w7,w7,w13 - add w24,w24,w17 // h+=Sigma0(a) - add w7,w7,w12 - ldr w12,[sp,#4] - str w15,[sp,#0] - ror w16,w20,#6 - add w23,w23,w19 // h+=K[i] - ror w14,w9,#7 - and w17,w21,w20 - ror w13,w6,#17 - bic w19,w22,w20 - ror w15,w24,#2 - add w23,w23,w7 // h+=X[i] - eor w16,w16,w20,ror#11 - eor w14,w14,w9,ror#18 - orr w17,w17,w19 // Ch(e,f,g) - eor w19,w24,w25 // a^b, b^c in next round - eor w16,w16,w20,ror#25 // Sigma1(e) - eor w15,w15,w24,ror#13 - add w23,w23,w17 // h+=Ch(e,f,g) - and w28,w28,w19 // (b^c)&=(a^b) - eor w13,w13,w6,ror#19 - eor w14,w14,w9,lsr#3 // sigma0(X[i+1]) - add w23,w23,w16 // h+=Sigma1(e) - eor w28,w28,w25 // Maj(a,b,c) - eor w17,w15,w24,ror#22 // Sigma0(a) - eor w13,w13,w6,lsr#10 // sigma1(X[i+14]) - add w8,w8,w1 - add w27,w27,w23 // d+=h - add w23,w23,w28 // h+=Maj(a,b,c) - ldr w28,[x30],#4 // *K++, w19 in next round - add w8,w8,w14 - add w23,w23,w17 // h+=Sigma0(a) - add w8,w8,w13 - ldr w13,[sp,#8] - str w0,[sp,#4] - ror w16,w27,#6 - add w22,w22,w28 // h+=K[i] - ror w15,w10,#7 - and w17,w20,w27 - ror w14,w7,#17 - bic w28,w21,w27 - ror w0,w23,#2 - add w22,w22,w8 // h+=X[i] - eor w16,w16,w27,ror#11 - eor w15,w15,w10,ror#18 - orr w17,w17,w28 // Ch(e,f,g) - eor w28,w23,w24 // a^b, b^c in next round - eor w16,w16,w27,ror#25 // Sigma1(e) - eor w0,w0,w23,ror#13 - add w22,w22,w17 // h+=Ch(e,f,g) - and w19,w19,w28 // (b^c)&=(a^b) - eor w14,w14,w7,ror#19 - eor w15,w15,w10,lsr#3 // sigma0(X[i+1]) - add w22,w22,w16 // h+=Sigma1(e) - eor w19,w19,w24 // Maj(a,b,c) - eor w17,w0,w23,ror#22 // Sigma0(a) - eor w14,w14,w7,lsr#10 // sigma1(X[i+14]) - add w9,w9,w2 - add w26,w26,w22 // d+=h - add w22,w22,w19 // h+=Maj(a,b,c) - ldr w19,[x30],#4 // *K++, w28 in next round - add w9,w9,w15 - add w22,w22,w17 // h+=Sigma0(a) - add w9,w9,w14 - ldr w14,[sp,#12] - str w1,[sp,#8] - ror w16,w26,#6 - add w21,w21,w19 // h+=K[i] - ror w0,w11,#7 - and w17,w27,w26 - ror w15,w8,#17 - bic w19,w20,w26 - ror w1,w22,#2 - add w21,w21,w9 // h+=X[i] - eor w16,w16,w26,ror#11 - eor w0,w0,w11,ror#18 - orr w17,w17,w19 // Ch(e,f,g) - eor w19,w22,w23 // a^b, b^c in next round - eor w16,w16,w26,ror#25 // Sigma1(e) - eor w1,w1,w22,ror#13 - add w21,w21,w17 // h+=Ch(e,f,g) - and w28,w28,w19 // (b^c)&=(a^b) - eor w15,w15,w8,ror#19 - eor w0,w0,w11,lsr#3 // sigma0(X[i+1]) - add w21,w21,w16 // h+=Sigma1(e) - eor w28,w28,w23 // Maj(a,b,c) - eor w17,w1,w22,ror#22 // Sigma0(a) - eor w15,w15,w8,lsr#10 // sigma1(X[i+14]) - add w10,w10,w3 - add w25,w25,w21 // d+=h - add w21,w21,w28 // h+=Maj(a,b,c) - ldr w28,[x30],#4 // *K++, w19 in next round - add w10,w10,w0 - add w21,w21,w17 // h+=Sigma0(a) - add w10,w10,w15 - ldr w15,[sp,#0] - str w2,[sp,#12] - ror w16,w25,#6 - add w20,w20,w28 // h+=K[i] - ror w1,w12,#7 - and w17,w26,w25 - ror w0,w9,#17 - bic w28,w27,w25 - ror w2,w21,#2 - add w20,w20,w10 // h+=X[i] - eor w16,w16,w25,ror#11 - eor w1,w1,w12,ror#18 - orr w17,w17,w28 // Ch(e,f,g) - eor w28,w21,w22 // a^b, b^c in next round - eor w16,w16,w25,ror#25 // Sigma1(e) - eor w2,w2,w21,ror#13 - add w20,w20,w17 // h+=Ch(e,f,g) - and w19,w19,w28 // (b^c)&=(a^b) - eor w0,w0,w9,ror#19 - eor w1,w1,w12,lsr#3 // sigma0(X[i+1]) - add w20,w20,w16 // h+=Sigma1(e) - eor w19,w19,w22 // Maj(a,b,c) - eor w17,w2,w21,ror#22 // Sigma0(a) - eor w0,w0,w9,lsr#10 // sigma1(X[i+14]) - add w11,w11,w4 - add w24,w24,w20 // d+=h - add w20,w20,w19 // h+=Maj(a,b,c) - ldr w19,[x30],#4 // *K++, w28 in next round - add w11,w11,w1 - add w20,w20,w17 // h+=Sigma0(a) - add w11,w11,w0 - ldr w0,[sp,#4] - str w3,[sp,#0] - ror w16,w24,#6 - add w27,w27,w19 // h+=K[i] - ror w2,w13,#7 - and w17,w25,w24 - ror w1,w10,#17 - bic w19,w26,w24 - ror w3,w20,#2 - add w27,w27,w11 // h+=X[i] - eor w16,w16,w24,ror#11 - eor w2,w2,w13,ror#18 - orr w17,w17,w19 // Ch(e,f,g) - eor w19,w20,w21 // a^b, b^c in next round - eor w16,w16,w24,ror#25 // Sigma1(e) - eor w3,w3,w20,ror#13 - add w27,w27,w17 // h+=Ch(e,f,g) - and w28,w28,w19 // (b^c)&=(a^b) - eor w1,w1,w10,ror#19 - eor w2,w2,w13,lsr#3 // sigma0(X[i+1]) - add w27,w27,w16 // h+=Sigma1(e) - eor w28,w28,w21 // Maj(a,b,c) - eor w17,w3,w20,ror#22 // Sigma0(a) - eor w1,w1,w10,lsr#10 // sigma1(X[i+14]) - add w12,w12,w5 - add w23,w23,w27 // d+=h - add w27,w27,w28 // h+=Maj(a,b,c) - ldr w28,[x30],#4 // *K++, w19 in next round - add w12,w12,w2 - add w27,w27,w17 // h+=Sigma0(a) - add w12,w12,w1 - ldr w1,[sp,#8] - str w4,[sp,#4] - ror w16,w23,#6 - add w26,w26,w28 // h+=K[i] - ror w3,w14,#7 - and w17,w24,w23 - ror w2,w11,#17 - bic w28,w25,w23 - ror w4,w27,#2 - add w26,w26,w12 // h+=X[i] - eor w16,w16,w23,ror#11 - eor w3,w3,w14,ror#18 - orr w17,w17,w28 // Ch(e,f,g) - eor w28,w27,w20 // a^b, b^c in next round - eor w16,w16,w23,ror#25 // Sigma1(e) - eor w4,w4,w27,ror#13 - add w26,w26,w17 // h+=Ch(e,f,g) - and w19,w19,w28 // (b^c)&=(a^b) - eor w2,w2,w11,ror#19 - eor w3,w3,w14,lsr#3 // sigma0(X[i+1]) - add w26,w26,w16 // h+=Sigma1(e) - eor w19,w19,w20 // Maj(a,b,c) - eor w17,w4,w27,ror#22 // Sigma0(a) - eor w2,w2,w11,lsr#10 // sigma1(X[i+14]) - add w13,w13,w6 - add w22,w22,w26 // d+=h - add w26,w26,w19 // h+=Maj(a,b,c) - ldr w19,[x30],#4 // *K++, w28 in next round - add w13,w13,w3 - add w26,w26,w17 // h+=Sigma0(a) - add w13,w13,w2 - ldr w2,[sp,#12] - str w5,[sp,#8] - ror w16,w22,#6 - add w25,w25,w19 // h+=K[i] - ror w4,w15,#7 - and w17,w23,w22 - ror w3,w12,#17 - bic w19,w24,w22 - ror w5,w26,#2 - add w25,w25,w13 // h+=X[i] - eor w16,w16,w22,ror#11 - eor w4,w4,w15,ror#18 - orr w17,w17,w19 // Ch(e,f,g) - eor w19,w26,w27 // a^b, b^c in next round - eor w16,w16,w22,ror#25 // Sigma1(e) - eor w5,w5,w26,ror#13 - add w25,w25,w17 // h+=Ch(e,f,g) - and w28,w28,w19 // (b^c)&=(a^b) - eor w3,w3,w12,ror#19 - eor w4,w4,w15,lsr#3 // sigma0(X[i+1]) - add w25,w25,w16 // h+=Sigma1(e) - eor w28,w28,w27 // Maj(a,b,c) - eor w17,w5,w26,ror#22 // Sigma0(a) - eor w3,w3,w12,lsr#10 // sigma1(X[i+14]) - add w14,w14,w7 - add w21,w21,w25 // d+=h - add w25,w25,w28 // h+=Maj(a,b,c) - ldr w28,[x30],#4 // *K++, w19 in next round - add w14,w14,w4 - add w25,w25,w17 // h+=Sigma0(a) - add w14,w14,w3 - ldr w3,[sp,#0] - str w6,[sp,#12] - ror w16,w21,#6 - add w24,w24,w28 // h+=K[i] - ror w5,w0,#7 - and w17,w22,w21 - ror w4,w13,#17 - bic w28,w23,w21 - ror w6,w25,#2 - add w24,w24,w14 // h+=X[i] - eor w16,w16,w21,ror#11 - eor w5,w5,w0,ror#18 - orr w17,w17,w28 // Ch(e,f,g) - eor w28,w25,w26 // a^b, b^c in next round - eor w16,w16,w21,ror#25 // Sigma1(e) - eor w6,w6,w25,ror#13 - add w24,w24,w17 // h+=Ch(e,f,g) - and w19,w19,w28 // (b^c)&=(a^b) - eor w4,w4,w13,ror#19 - eor w5,w5,w0,lsr#3 // sigma0(X[i+1]) - add w24,w24,w16 // h+=Sigma1(e) - eor w19,w19,w26 // Maj(a,b,c) - eor w17,w6,w25,ror#22 // Sigma0(a) - eor w4,w4,w13,lsr#10 // sigma1(X[i+14]) - add w15,w15,w8 - add w20,w20,w24 // d+=h - add w24,w24,w19 // h+=Maj(a,b,c) - ldr w19,[x30],#4 // *K++, w28 in next round - add w15,w15,w5 - add w24,w24,w17 // h+=Sigma0(a) - add w15,w15,w4 - ldr w4,[sp,#4] - str w7,[sp,#0] - ror w16,w20,#6 - add w23,w23,w19 // h+=K[i] - ror w6,w1,#7 - and w17,w21,w20 - ror w5,w14,#17 - bic w19,w22,w20 - ror w7,w24,#2 - add w23,w23,w15 // h+=X[i] - eor w16,w16,w20,ror#11 - eor w6,w6,w1,ror#18 - orr w17,w17,w19 // Ch(e,f,g) - eor w19,w24,w25 // a^b, b^c in next round - eor w16,w16,w20,ror#25 // Sigma1(e) - eor w7,w7,w24,ror#13 - add w23,w23,w17 // h+=Ch(e,f,g) - and w28,w28,w19 // (b^c)&=(a^b) - eor w5,w5,w14,ror#19 - eor w6,w6,w1,lsr#3 // sigma0(X[i+1]) - add w23,w23,w16 // h+=Sigma1(e) - eor w28,w28,w25 // Maj(a,b,c) - eor w17,w7,w24,ror#22 // Sigma0(a) - eor w5,w5,w14,lsr#10 // sigma1(X[i+14]) - add w0,w0,w9 - add w27,w27,w23 // d+=h - add w23,w23,w28 // h+=Maj(a,b,c) - ldr w28,[x30],#4 // *K++, w19 in next round - add w0,w0,w6 - add w23,w23,w17 // h+=Sigma0(a) - add w0,w0,w5 - ldr w5,[sp,#8] - str w8,[sp,#4] - ror w16,w27,#6 - add w22,w22,w28 // h+=K[i] - ror w7,w2,#7 - and w17,w20,w27 - ror w6,w15,#17 - bic w28,w21,w27 - ror w8,w23,#2 - add w22,w22,w0 // h+=X[i] - eor w16,w16,w27,ror#11 - eor w7,w7,w2,ror#18 - orr w17,w17,w28 // Ch(e,f,g) - eor w28,w23,w24 // a^b, b^c in next round - eor w16,w16,w27,ror#25 // Sigma1(e) - eor w8,w8,w23,ror#13 - add w22,w22,w17 // h+=Ch(e,f,g) - and w19,w19,w28 // (b^c)&=(a^b) - eor w6,w6,w15,ror#19 - eor w7,w7,w2,lsr#3 // sigma0(X[i+1]) - add w22,w22,w16 // h+=Sigma1(e) - eor w19,w19,w24 // Maj(a,b,c) - eor w17,w8,w23,ror#22 // Sigma0(a) - eor w6,w6,w15,lsr#10 // sigma1(X[i+14]) - add w1,w1,w10 - add w26,w26,w22 // d+=h - add w22,w22,w19 // h+=Maj(a,b,c) - ldr w19,[x30],#4 // *K++, w28 in next round - add w1,w1,w7 - add w22,w22,w17 // h+=Sigma0(a) - add w1,w1,w6 - ldr w6,[sp,#12] - str w9,[sp,#8] - ror w16,w26,#6 - add w21,w21,w19 // h+=K[i] - ror w8,w3,#7 - and w17,w27,w26 - ror w7,w0,#17 - bic w19,w20,w26 - ror w9,w22,#2 - add w21,w21,w1 // h+=X[i] - eor w16,w16,w26,ror#11 - eor w8,w8,w3,ror#18 - orr w17,w17,w19 // Ch(e,f,g) - eor w19,w22,w23 // a^b, b^c in next round - eor w16,w16,w26,ror#25 // Sigma1(e) - eor w9,w9,w22,ror#13 - add w21,w21,w17 // h+=Ch(e,f,g) - and w28,w28,w19 // (b^c)&=(a^b) - eor w7,w7,w0,ror#19 - eor w8,w8,w3,lsr#3 // sigma0(X[i+1]) - add w21,w21,w16 // h+=Sigma1(e) - eor w28,w28,w23 // Maj(a,b,c) - eor w17,w9,w22,ror#22 // Sigma0(a) - eor w7,w7,w0,lsr#10 // sigma1(X[i+14]) - add w2,w2,w11 - add w25,w25,w21 // d+=h - add w21,w21,w28 // h+=Maj(a,b,c) - ldr w28,[x30],#4 // *K++, w19 in next round - add w2,w2,w8 - add w21,w21,w17 // h+=Sigma0(a) - add w2,w2,w7 - ldr w7,[sp,#0] - str w10,[sp,#12] - ror w16,w25,#6 - add w20,w20,w28 // h+=K[i] - ror w9,w4,#7 - and w17,w26,w25 - ror w8,w1,#17 - bic w28,w27,w25 - ror w10,w21,#2 - add w20,w20,w2 // h+=X[i] - eor w16,w16,w25,ror#11 - eor w9,w9,w4,ror#18 - orr w17,w17,w28 // Ch(e,f,g) - eor w28,w21,w22 // a^b, b^c in next round - eor w16,w16,w25,ror#25 // Sigma1(e) - eor w10,w10,w21,ror#13 - add w20,w20,w17 // h+=Ch(e,f,g) - and w19,w19,w28 // (b^c)&=(a^b) - eor w8,w8,w1,ror#19 - eor w9,w9,w4,lsr#3 // sigma0(X[i+1]) - add w20,w20,w16 // h+=Sigma1(e) - eor w19,w19,w22 // Maj(a,b,c) - eor w17,w10,w21,ror#22 // Sigma0(a) - eor w8,w8,w1,lsr#10 // sigma1(X[i+14]) - add w3,w3,w12 - add w24,w24,w20 // d+=h - add w20,w20,w19 // h+=Maj(a,b,c) - ldr w19,[x30],#4 // *K++, w28 in next round - add w3,w3,w9 - add w20,w20,w17 // h+=Sigma0(a) - add w3,w3,w8 - cbnz w19,Loop_16_xx - - ldp x0,x2,[x29,#96] - ldr x1,[x29,#112] - sub x30,x30,#260 // rewind - - ldp w3,w4,[x0] - ldp w5,w6,[x0,#2*4] - add x1,x1,#14*4 // advance input pointer - ldp w7,w8,[x0,#4*4] - add w20,w20,w3 - ldp w9,w10,[x0,#6*4] - add w21,w21,w4 - add w22,w22,w5 - add w23,w23,w6 - stp w20,w21,[x0] - add w24,w24,w7 - add w25,w25,w8 - stp w22,w23,[x0,#2*4] - add w26,w26,w9 - add w27,w27,w10 - cmp x1,x2 - stp w24,w25,[x0,#4*4] - stp w26,w27,[x0,#6*4] - b.ne Loop - - ldp x19,x20,[x29,#16] - add sp,sp,#4*4 - ldp x21,x22,[x29,#32] - ldp x23,x24,[x29,#48] - ldp x25,x26,[x29,#64] - ldp x27,x28,[x29,#80] - ldp x29,x30,[sp],#128 - AARCH64_VALIDATE_LINK_REGISTER - ret - - -.section __TEXT,__const -.align 6 - -LK256: -.long 0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5 -.long 0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5 -.long 0xd807aa98,0x12835b01,0x243185be,0x550c7dc3 -.long 0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174 -.long 0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc -.long 0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da -.long 0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7 -.long 0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967 -.long 0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13 -.long 0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85 -.long 0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3 -.long 0xd192e819,0xd6990624,0xf40e3585,0x106aa070 -.long 0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5 -.long 0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3 -.long 0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208 -.long 0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2 -.long 0 //terminator - -.byte 83,72,65,50,53,54,32,98,108,111,99,107,32,116,114,97,110,115,102,111,114,109,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 -.align 2 -.align 2 -.text -#ifndef __KERNEL__ - -.align 6 -sha256_block_armv8: -Lv8_entry: - // Armv8.3-A PAuth: even though x30 is pushed to stack it is not popped later. - stp x29,x30,[sp,#-16]! - add x29,sp,#0 - - ld1 {v0.4s,v1.4s},[x0] - adrp x3,LK256@PAGE - add x3,x3,LK256@PAGEOFF - -Loop_hw: - ld1 {v4.16b,v5.16b,v6.16b,v7.16b},[x1],#64 - sub x2,x2,#1 - ld1 {v16.4s},[x3],#16 - rev32 v4.16b,v4.16b - rev32 v5.16b,v5.16b - rev32 v6.16b,v6.16b - rev32 v7.16b,v7.16b - orr v18.16b,v0.16b,v0.16b // offload - orr v19.16b,v1.16b,v1.16b - ld1 {v17.4s},[x3],#16 - add v16.4s,v16.4s,v4.4s -.long 0x5e2828a4 //sha256su0 v4.16b,v5.16b - orr v2.16b,v0.16b,v0.16b -.long 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s -.long 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s -.long 0x5e0760c4 //sha256su1 v4.16b,v6.16b,v7.16b - ld1 {v16.4s},[x3],#16 - add v17.4s,v17.4s,v5.4s -.long 0x5e2828c5 //sha256su0 v5.16b,v6.16b - orr v2.16b,v0.16b,v0.16b -.long 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s -.long 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s -.long 0x5e0460e5 //sha256su1 v5.16b,v7.16b,v4.16b - ld1 {v17.4s},[x3],#16 - add v16.4s,v16.4s,v6.4s -.long 0x5e2828e6 //sha256su0 v6.16b,v7.16b - orr v2.16b,v0.16b,v0.16b -.long 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s -.long 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s -.long 0x5e056086 //sha256su1 v6.16b,v4.16b,v5.16b - ld1 {v16.4s},[x3],#16 - add v17.4s,v17.4s,v7.4s -.long 0x5e282887 //sha256su0 v7.16b,v4.16b - orr v2.16b,v0.16b,v0.16b -.long 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s -.long 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s -.long 0x5e0660a7 //sha256su1 v7.16b,v5.16b,v6.16b - ld1 {v17.4s},[x3],#16 - add v16.4s,v16.4s,v4.4s -.long 0x5e2828a4 //sha256su0 v4.16b,v5.16b - orr v2.16b,v0.16b,v0.16b -.long 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s -.long 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s -.long 0x5e0760c4 //sha256su1 v4.16b,v6.16b,v7.16b - ld1 {v16.4s},[x3],#16 - add v17.4s,v17.4s,v5.4s -.long 0x5e2828c5 //sha256su0 v5.16b,v6.16b - orr v2.16b,v0.16b,v0.16b -.long 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s -.long 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s -.long 0x5e0460e5 //sha256su1 v5.16b,v7.16b,v4.16b - ld1 {v17.4s},[x3],#16 - add v16.4s,v16.4s,v6.4s -.long 0x5e2828e6 //sha256su0 v6.16b,v7.16b - orr v2.16b,v0.16b,v0.16b -.long 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s -.long 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s -.long 0x5e056086 //sha256su1 v6.16b,v4.16b,v5.16b - ld1 {v16.4s},[x3],#16 - add v17.4s,v17.4s,v7.4s -.long 0x5e282887 //sha256su0 v7.16b,v4.16b - orr v2.16b,v0.16b,v0.16b -.long 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s -.long 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s -.long 0x5e0660a7 //sha256su1 v7.16b,v5.16b,v6.16b - ld1 {v17.4s},[x3],#16 - add v16.4s,v16.4s,v4.4s -.long 0x5e2828a4 //sha256su0 v4.16b,v5.16b - orr v2.16b,v0.16b,v0.16b -.long 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s -.long 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s -.long 0x5e0760c4 //sha256su1 v4.16b,v6.16b,v7.16b - ld1 {v16.4s},[x3],#16 - add v17.4s,v17.4s,v5.4s -.long 0x5e2828c5 //sha256su0 v5.16b,v6.16b - orr v2.16b,v0.16b,v0.16b -.long 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s -.long 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s -.long 0x5e0460e5 //sha256su1 v5.16b,v7.16b,v4.16b - ld1 {v17.4s},[x3],#16 - add v16.4s,v16.4s,v6.4s -.long 0x5e2828e6 //sha256su0 v6.16b,v7.16b - orr v2.16b,v0.16b,v0.16b -.long 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s -.long 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s -.long 0x5e056086 //sha256su1 v6.16b,v4.16b,v5.16b - ld1 {v16.4s},[x3],#16 - add v17.4s,v17.4s,v7.4s -.long 0x5e282887 //sha256su0 v7.16b,v4.16b - orr v2.16b,v0.16b,v0.16b -.long 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s -.long 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s -.long 0x5e0660a7 //sha256su1 v7.16b,v5.16b,v6.16b - ld1 {v17.4s},[x3],#16 - add v16.4s,v16.4s,v4.4s - orr v2.16b,v0.16b,v0.16b -.long 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s -.long 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s - - ld1 {v16.4s},[x3],#16 - add v17.4s,v17.4s,v5.4s - orr v2.16b,v0.16b,v0.16b -.long 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s -.long 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s - - ld1 {v17.4s},[x3] - add v16.4s,v16.4s,v6.4s - sub x3,x3,#64*4-16 // rewind - orr v2.16b,v0.16b,v0.16b -.long 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s -.long 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s - - add v17.4s,v17.4s,v7.4s - orr v2.16b,v0.16b,v0.16b -.long 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s -.long 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s - - add v0.4s,v0.4s,v18.4s - add v1.4s,v1.4s,v19.4s - - cbnz x2,Loop_hw - - st1 {v0.4s,v1.4s},[x0] - - ldr x29,[sp],#16 - ret - -#endif -#endif // !OPENSSL_NO_ASM diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/sha256-armv8-linux64.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/sha256-armv8-linux64.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/sha256-armv8-linux64.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/sha256-armv8-linux64.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,1211 +0,0 @@ -// This file is generated from a similarly-named Perl script in the BoringSSL -// source tree. Do not edit by hand. - -#if !defined(__has_feature) -#define __has_feature(x) 0 -#endif -#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) -#define OPENSSL_NO_ASM -#endif - -#if !defined(OPENSSL_NO_ASM) -#if defined(__aarch64__) -// Copyright 2014-2016 The OpenSSL Project Authors. All Rights Reserved. -// -// Licensed under the OpenSSL license (the "License"). You may not use -// this file except in compliance with the License. You can obtain a copy -// in the file LICENSE in the source distribution or at -// https://www.openssl.org/source/license.html - -// ==================================================================== -// Written by Andy Polyakov for the OpenSSL -// project. The module is, however, dual licensed under OpenSSL and -// CRYPTOGAMS licenses depending on where you obtain it. For further -// details see http://www.openssl.org/~appro/cryptogams/. -// -// Permission to use under GPLv2 terms is granted. -// ==================================================================== -// -// SHA256/512 for ARMv8. -// -// Performance in cycles per processed byte and improvement coefficient -// over code generated with "default" compiler: -// -// SHA256-hw SHA256(*) SHA512 -// Apple A7 1.97 10.5 (+33%) 6.73 (-1%(**)) -// Cortex-A53 2.38 15.5 (+115%) 10.0 (+150%(***)) -// Cortex-A57 2.31 11.6 (+86%) 7.51 (+260%(***)) -// Denver 2.01 10.5 (+26%) 6.70 (+8%) -// X-Gene 20.0 (+100%) 12.8 (+300%(***)) -// Mongoose 2.36 13.0 (+50%) 8.36 (+33%) -// -// (*) Software SHA256 results are of lesser relevance, presented -// mostly for informational purposes. -// (**) The result is a trade-off: it's possible to improve it by -// 10% (or by 1 cycle per round), but at the cost of 20% loss -// on Cortex-A53 (or by 4 cycles per round). -// (***) Super-impressive coefficients over gcc-generated code are -// indication of some compiler "pathology", most notably code -// generated with -mgeneral-regs-only is significanty faster -// and the gap is only 40-90%. - -#ifndef __KERNEL__ -# include -#endif - -.text - - -.hidden GFp_armcap_P -.globl GFp_sha256_block_data_order -.hidden GFp_sha256_block_data_order -.type GFp_sha256_block_data_order,%function -.align 6 -GFp_sha256_block_data_order: - AARCH64_VALID_CALL_TARGET -#ifndef __KERNEL__ -#if __has_feature(hwaddress_sanitizer) && __clang_major__ >= 10 - adrp x16,:pg_hi21_nc:GFp_armcap_P -#else - adrp x16,GFp_armcap_P -#endif - ldr w16,[x16,:lo12:GFp_armcap_P] - tst w16,#ARMV8_SHA256 - b.ne .Lv8_entry -#endif - AARCH64_SIGN_LINK_REGISTER - stp x29,x30,[sp,#-128]! - add x29,sp,#0 - - stp x19,x20,[sp,#16] - stp x21,x22,[sp,#32] - stp x23,x24,[sp,#48] - stp x25,x26,[sp,#64] - stp x27,x28,[sp,#80] - sub sp,sp,#4*4 - - ldp w20,w21,[x0] // load context - ldp w22,w23,[x0,#2*4] - ldp w24,w25,[x0,#4*4] - add x2,x1,x2,lsl#6 // end of input - ldp w26,w27,[x0,#6*4] - adrp x30,.LK256 - add x30,x30,:lo12:.LK256 - stp x0,x2,[x29,#96] - -.Loop: - ldp w3,w4,[x1],#2*4 - ldr w19,[x30],#4 // *K++ - eor w28,w21,w22 // magic seed - str x1,[x29,#112] -#ifndef __ARMEB__ - rev w3,w3 // 0 -#endif - ror w16,w24,#6 - add w27,w27,w19 // h+=K[i] - eor w6,w24,w24,ror#14 - and w17,w25,w24 - bic w19,w26,w24 - add w27,w27,w3 // h+=X[i] - orr w17,w17,w19 // Ch(e,f,g) - eor w19,w20,w21 // a^b, b^c in next round - eor w16,w16,w6,ror#11 // Sigma1(e) - ror w6,w20,#2 - add w27,w27,w17 // h+=Ch(e,f,g) - eor w17,w20,w20,ror#9 - add w27,w27,w16 // h+=Sigma1(e) - and w28,w28,w19 // (b^c)&=(a^b) - add w23,w23,w27 // d+=h - eor w28,w28,w21 // Maj(a,b,c) - eor w17,w6,w17,ror#13 // Sigma0(a) - add w27,w27,w28 // h+=Maj(a,b,c) - ldr w28,[x30],#4 // *K++, w19 in next round - //add w27,w27,w17 // h+=Sigma0(a) -#ifndef __ARMEB__ - rev w4,w4 // 1 -#endif - ldp w5,w6,[x1],#2*4 - add w27,w27,w17 // h+=Sigma0(a) - ror w16,w23,#6 - add w26,w26,w28 // h+=K[i] - eor w7,w23,w23,ror#14 - and w17,w24,w23 - bic w28,w25,w23 - add w26,w26,w4 // h+=X[i] - orr w17,w17,w28 // Ch(e,f,g) - eor w28,w27,w20 // a^b, b^c in next round - eor w16,w16,w7,ror#11 // Sigma1(e) - ror w7,w27,#2 - add w26,w26,w17 // h+=Ch(e,f,g) - eor w17,w27,w27,ror#9 - add w26,w26,w16 // h+=Sigma1(e) - and w19,w19,w28 // (b^c)&=(a^b) - add w22,w22,w26 // d+=h - eor w19,w19,w20 // Maj(a,b,c) - eor w17,w7,w17,ror#13 // Sigma0(a) - add w26,w26,w19 // h+=Maj(a,b,c) - ldr w19,[x30],#4 // *K++, w28 in next round - //add w26,w26,w17 // h+=Sigma0(a) -#ifndef __ARMEB__ - rev w5,w5 // 2 -#endif - add w26,w26,w17 // h+=Sigma0(a) - ror w16,w22,#6 - add w25,w25,w19 // h+=K[i] - eor w8,w22,w22,ror#14 - and w17,w23,w22 - bic w19,w24,w22 - add w25,w25,w5 // h+=X[i] - orr w17,w17,w19 // Ch(e,f,g) - eor w19,w26,w27 // a^b, b^c in next round - eor w16,w16,w8,ror#11 // Sigma1(e) - ror w8,w26,#2 - add w25,w25,w17 // h+=Ch(e,f,g) - eor w17,w26,w26,ror#9 - add w25,w25,w16 // h+=Sigma1(e) - and w28,w28,w19 // (b^c)&=(a^b) - add w21,w21,w25 // d+=h - eor w28,w28,w27 // Maj(a,b,c) - eor w17,w8,w17,ror#13 // Sigma0(a) - add w25,w25,w28 // h+=Maj(a,b,c) - ldr w28,[x30],#4 // *K++, w19 in next round - //add w25,w25,w17 // h+=Sigma0(a) -#ifndef __ARMEB__ - rev w6,w6 // 3 -#endif - ldp w7,w8,[x1],#2*4 - add w25,w25,w17 // h+=Sigma0(a) - ror w16,w21,#6 - add w24,w24,w28 // h+=K[i] - eor w9,w21,w21,ror#14 - and w17,w22,w21 - bic w28,w23,w21 - add w24,w24,w6 // h+=X[i] - orr w17,w17,w28 // Ch(e,f,g) - eor w28,w25,w26 // a^b, b^c in next round - eor w16,w16,w9,ror#11 // Sigma1(e) - ror w9,w25,#2 - add w24,w24,w17 // h+=Ch(e,f,g) - eor w17,w25,w25,ror#9 - add w24,w24,w16 // h+=Sigma1(e) - and w19,w19,w28 // (b^c)&=(a^b) - add w20,w20,w24 // d+=h - eor w19,w19,w26 // Maj(a,b,c) - eor w17,w9,w17,ror#13 // Sigma0(a) - add w24,w24,w19 // h+=Maj(a,b,c) - ldr w19,[x30],#4 // *K++, w28 in next round - //add w24,w24,w17 // h+=Sigma0(a) -#ifndef __ARMEB__ - rev w7,w7 // 4 -#endif - add w24,w24,w17 // h+=Sigma0(a) - ror w16,w20,#6 - add w23,w23,w19 // h+=K[i] - eor w10,w20,w20,ror#14 - and w17,w21,w20 - bic w19,w22,w20 - add w23,w23,w7 // h+=X[i] - orr w17,w17,w19 // Ch(e,f,g) - eor w19,w24,w25 // a^b, b^c in next round - eor w16,w16,w10,ror#11 // Sigma1(e) - ror w10,w24,#2 - add w23,w23,w17 // h+=Ch(e,f,g) - eor w17,w24,w24,ror#9 - add w23,w23,w16 // h+=Sigma1(e) - and w28,w28,w19 // (b^c)&=(a^b) - add w27,w27,w23 // d+=h - eor w28,w28,w25 // Maj(a,b,c) - eor w17,w10,w17,ror#13 // Sigma0(a) - add w23,w23,w28 // h+=Maj(a,b,c) - ldr w28,[x30],#4 // *K++, w19 in next round - //add w23,w23,w17 // h+=Sigma0(a) -#ifndef __ARMEB__ - rev w8,w8 // 5 -#endif - ldp w9,w10,[x1],#2*4 - add w23,w23,w17 // h+=Sigma0(a) - ror w16,w27,#6 - add w22,w22,w28 // h+=K[i] - eor w11,w27,w27,ror#14 - and w17,w20,w27 - bic w28,w21,w27 - add w22,w22,w8 // h+=X[i] - orr w17,w17,w28 // Ch(e,f,g) - eor w28,w23,w24 // a^b, b^c in next round - eor w16,w16,w11,ror#11 // Sigma1(e) - ror w11,w23,#2 - add w22,w22,w17 // h+=Ch(e,f,g) - eor w17,w23,w23,ror#9 - add w22,w22,w16 // h+=Sigma1(e) - and w19,w19,w28 // (b^c)&=(a^b) - add w26,w26,w22 // d+=h - eor w19,w19,w24 // Maj(a,b,c) - eor w17,w11,w17,ror#13 // Sigma0(a) - add w22,w22,w19 // h+=Maj(a,b,c) - ldr w19,[x30],#4 // *K++, w28 in next round - //add w22,w22,w17 // h+=Sigma0(a) -#ifndef __ARMEB__ - rev w9,w9 // 6 -#endif - add w22,w22,w17 // h+=Sigma0(a) - ror w16,w26,#6 - add w21,w21,w19 // h+=K[i] - eor w12,w26,w26,ror#14 - and w17,w27,w26 - bic w19,w20,w26 - add w21,w21,w9 // h+=X[i] - orr w17,w17,w19 // Ch(e,f,g) - eor w19,w22,w23 // a^b, b^c in next round - eor w16,w16,w12,ror#11 // Sigma1(e) - ror w12,w22,#2 - add w21,w21,w17 // h+=Ch(e,f,g) - eor w17,w22,w22,ror#9 - add w21,w21,w16 // h+=Sigma1(e) - and w28,w28,w19 // (b^c)&=(a^b) - add w25,w25,w21 // d+=h - eor w28,w28,w23 // Maj(a,b,c) - eor w17,w12,w17,ror#13 // Sigma0(a) - add w21,w21,w28 // h+=Maj(a,b,c) - ldr w28,[x30],#4 // *K++, w19 in next round - //add w21,w21,w17 // h+=Sigma0(a) -#ifndef __ARMEB__ - rev w10,w10 // 7 -#endif - ldp w11,w12,[x1],#2*4 - add w21,w21,w17 // h+=Sigma0(a) - ror w16,w25,#6 - add w20,w20,w28 // h+=K[i] - eor w13,w25,w25,ror#14 - and w17,w26,w25 - bic w28,w27,w25 - add w20,w20,w10 // h+=X[i] - orr w17,w17,w28 // Ch(e,f,g) - eor w28,w21,w22 // a^b, b^c in next round - eor w16,w16,w13,ror#11 // Sigma1(e) - ror w13,w21,#2 - add w20,w20,w17 // h+=Ch(e,f,g) - eor w17,w21,w21,ror#9 - add w20,w20,w16 // h+=Sigma1(e) - and w19,w19,w28 // (b^c)&=(a^b) - add w24,w24,w20 // d+=h - eor w19,w19,w22 // Maj(a,b,c) - eor w17,w13,w17,ror#13 // Sigma0(a) - add w20,w20,w19 // h+=Maj(a,b,c) - ldr w19,[x30],#4 // *K++, w28 in next round - //add w20,w20,w17 // h+=Sigma0(a) -#ifndef __ARMEB__ - rev w11,w11 // 8 -#endif - add w20,w20,w17 // h+=Sigma0(a) - ror w16,w24,#6 - add w27,w27,w19 // h+=K[i] - eor w14,w24,w24,ror#14 - and w17,w25,w24 - bic w19,w26,w24 - add w27,w27,w11 // h+=X[i] - orr w17,w17,w19 // Ch(e,f,g) - eor w19,w20,w21 // a^b, b^c in next round - eor w16,w16,w14,ror#11 // Sigma1(e) - ror w14,w20,#2 - add w27,w27,w17 // h+=Ch(e,f,g) - eor w17,w20,w20,ror#9 - add w27,w27,w16 // h+=Sigma1(e) - and w28,w28,w19 // (b^c)&=(a^b) - add w23,w23,w27 // d+=h - eor w28,w28,w21 // Maj(a,b,c) - eor w17,w14,w17,ror#13 // Sigma0(a) - add w27,w27,w28 // h+=Maj(a,b,c) - ldr w28,[x30],#4 // *K++, w19 in next round - //add w27,w27,w17 // h+=Sigma0(a) -#ifndef __ARMEB__ - rev w12,w12 // 9 -#endif - ldp w13,w14,[x1],#2*4 - add w27,w27,w17 // h+=Sigma0(a) - ror w16,w23,#6 - add w26,w26,w28 // h+=K[i] - eor w15,w23,w23,ror#14 - and w17,w24,w23 - bic w28,w25,w23 - add w26,w26,w12 // h+=X[i] - orr w17,w17,w28 // Ch(e,f,g) - eor w28,w27,w20 // a^b, b^c in next round - eor w16,w16,w15,ror#11 // Sigma1(e) - ror w15,w27,#2 - add w26,w26,w17 // h+=Ch(e,f,g) - eor w17,w27,w27,ror#9 - add w26,w26,w16 // h+=Sigma1(e) - and w19,w19,w28 // (b^c)&=(a^b) - add w22,w22,w26 // d+=h - eor w19,w19,w20 // Maj(a,b,c) - eor w17,w15,w17,ror#13 // Sigma0(a) - add w26,w26,w19 // h+=Maj(a,b,c) - ldr w19,[x30],#4 // *K++, w28 in next round - //add w26,w26,w17 // h+=Sigma0(a) -#ifndef __ARMEB__ - rev w13,w13 // 10 -#endif - add w26,w26,w17 // h+=Sigma0(a) - ror w16,w22,#6 - add w25,w25,w19 // h+=K[i] - eor w0,w22,w22,ror#14 - and w17,w23,w22 - bic w19,w24,w22 - add w25,w25,w13 // h+=X[i] - orr w17,w17,w19 // Ch(e,f,g) - eor w19,w26,w27 // a^b, b^c in next round - eor w16,w16,w0,ror#11 // Sigma1(e) - ror w0,w26,#2 - add w25,w25,w17 // h+=Ch(e,f,g) - eor w17,w26,w26,ror#9 - add w25,w25,w16 // h+=Sigma1(e) - and w28,w28,w19 // (b^c)&=(a^b) - add w21,w21,w25 // d+=h - eor w28,w28,w27 // Maj(a,b,c) - eor w17,w0,w17,ror#13 // Sigma0(a) - add w25,w25,w28 // h+=Maj(a,b,c) - ldr w28,[x30],#4 // *K++, w19 in next round - //add w25,w25,w17 // h+=Sigma0(a) -#ifndef __ARMEB__ - rev w14,w14 // 11 -#endif - ldp w15,w0,[x1],#2*4 - add w25,w25,w17 // h+=Sigma0(a) - str w6,[sp,#12] - ror w16,w21,#6 - add w24,w24,w28 // h+=K[i] - eor w6,w21,w21,ror#14 - and w17,w22,w21 - bic w28,w23,w21 - add w24,w24,w14 // h+=X[i] - orr w17,w17,w28 // Ch(e,f,g) - eor w28,w25,w26 // a^b, b^c in next round - eor w16,w16,w6,ror#11 // Sigma1(e) - ror w6,w25,#2 - add w24,w24,w17 // h+=Ch(e,f,g) - eor w17,w25,w25,ror#9 - add w24,w24,w16 // h+=Sigma1(e) - and w19,w19,w28 // (b^c)&=(a^b) - add w20,w20,w24 // d+=h - eor w19,w19,w26 // Maj(a,b,c) - eor w17,w6,w17,ror#13 // Sigma0(a) - add w24,w24,w19 // h+=Maj(a,b,c) - ldr w19,[x30],#4 // *K++, w28 in next round - //add w24,w24,w17 // h+=Sigma0(a) -#ifndef __ARMEB__ - rev w15,w15 // 12 -#endif - add w24,w24,w17 // h+=Sigma0(a) - str w7,[sp,#0] - ror w16,w20,#6 - add w23,w23,w19 // h+=K[i] - eor w7,w20,w20,ror#14 - and w17,w21,w20 - bic w19,w22,w20 - add w23,w23,w15 // h+=X[i] - orr w17,w17,w19 // Ch(e,f,g) - eor w19,w24,w25 // a^b, b^c in next round - eor w16,w16,w7,ror#11 // Sigma1(e) - ror w7,w24,#2 - add w23,w23,w17 // h+=Ch(e,f,g) - eor w17,w24,w24,ror#9 - add w23,w23,w16 // h+=Sigma1(e) - and w28,w28,w19 // (b^c)&=(a^b) - add w27,w27,w23 // d+=h - eor w28,w28,w25 // Maj(a,b,c) - eor w17,w7,w17,ror#13 // Sigma0(a) - add w23,w23,w28 // h+=Maj(a,b,c) - ldr w28,[x30],#4 // *K++, w19 in next round - //add w23,w23,w17 // h+=Sigma0(a) -#ifndef __ARMEB__ - rev w0,w0 // 13 -#endif - ldp w1,w2,[x1] - add w23,w23,w17 // h+=Sigma0(a) - str w8,[sp,#4] - ror w16,w27,#6 - add w22,w22,w28 // h+=K[i] - eor w8,w27,w27,ror#14 - and w17,w20,w27 - bic w28,w21,w27 - add w22,w22,w0 // h+=X[i] - orr w17,w17,w28 // Ch(e,f,g) - eor w28,w23,w24 // a^b, b^c in next round - eor w16,w16,w8,ror#11 // Sigma1(e) - ror w8,w23,#2 - add w22,w22,w17 // h+=Ch(e,f,g) - eor w17,w23,w23,ror#9 - add w22,w22,w16 // h+=Sigma1(e) - and w19,w19,w28 // (b^c)&=(a^b) - add w26,w26,w22 // d+=h - eor w19,w19,w24 // Maj(a,b,c) - eor w17,w8,w17,ror#13 // Sigma0(a) - add w22,w22,w19 // h+=Maj(a,b,c) - ldr w19,[x30],#4 // *K++, w28 in next round - //add w22,w22,w17 // h+=Sigma0(a) -#ifndef __ARMEB__ - rev w1,w1 // 14 -#endif - ldr w6,[sp,#12] - add w22,w22,w17 // h+=Sigma0(a) - str w9,[sp,#8] - ror w16,w26,#6 - add w21,w21,w19 // h+=K[i] - eor w9,w26,w26,ror#14 - and w17,w27,w26 - bic w19,w20,w26 - add w21,w21,w1 // h+=X[i] - orr w17,w17,w19 // Ch(e,f,g) - eor w19,w22,w23 // a^b, b^c in next round - eor w16,w16,w9,ror#11 // Sigma1(e) - ror w9,w22,#2 - add w21,w21,w17 // h+=Ch(e,f,g) - eor w17,w22,w22,ror#9 - add w21,w21,w16 // h+=Sigma1(e) - and w28,w28,w19 // (b^c)&=(a^b) - add w25,w25,w21 // d+=h - eor w28,w28,w23 // Maj(a,b,c) - eor w17,w9,w17,ror#13 // Sigma0(a) - add w21,w21,w28 // h+=Maj(a,b,c) - ldr w28,[x30],#4 // *K++, w19 in next round - //add w21,w21,w17 // h+=Sigma0(a) -#ifndef __ARMEB__ - rev w2,w2 // 15 -#endif - ldr w7,[sp,#0] - add w21,w21,w17 // h+=Sigma0(a) - str w10,[sp,#12] - ror w16,w25,#6 - add w20,w20,w28 // h+=K[i] - ror w9,w4,#7 - and w17,w26,w25 - ror w8,w1,#17 - bic w28,w27,w25 - ror w10,w21,#2 - add w20,w20,w2 // h+=X[i] - eor w16,w16,w25,ror#11 - eor w9,w9,w4,ror#18 - orr w17,w17,w28 // Ch(e,f,g) - eor w28,w21,w22 // a^b, b^c in next round - eor w16,w16,w25,ror#25 // Sigma1(e) - eor w10,w10,w21,ror#13 - add w20,w20,w17 // h+=Ch(e,f,g) - and w19,w19,w28 // (b^c)&=(a^b) - eor w8,w8,w1,ror#19 - eor w9,w9,w4,lsr#3 // sigma0(X[i+1]) - add w20,w20,w16 // h+=Sigma1(e) - eor w19,w19,w22 // Maj(a,b,c) - eor w17,w10,w21,ror#22 // Sigma0(a) - eor w8,w8,w1,lsr#10 // sigma1(X[i+14]) - add w3,w3,w12 - add w24,w24,w20 // d+=h - add w20,w20,w19 // h+=Maj(a,b,c) - ldr w19,[x30],#4 // *K++, w28 in next round - add w3,w3,w9 - add w20,w20,w17 // h+=Sigma0(a) - add w3,w3,w8 -.Loop_16_xx: - ldr w8,[sp,#4] - str w11,[sp,#0] - ror w16,w24,#6 - add w27,w27,w19 // h+=K[i] - ror w10,w5,#7 - and w17,w25,w24 - ror w9,w2,#17 - bic w19,w26,w24 - ror w11,w20,#2 - add w27,w27,w3 // h+=X[i] - eor w16,w16,w24,ror#11 - eor w10,w10,w5,ror#18 - orr w17,w17,w19 // Ch(e,f,g) - eor w19,w20,w21 // a^b, b^c in next round - eor w16,w16,w24,ror#25 // Sigma1(e) - eor w11,w11,w20,ror#13 - add w27,w27,w17 // h+=Ch(e,f,g) - and w28,w28,w19 // (b^c)&=(a^b) - eor w9,w9,w2,ror#19 - eor w10,w10,w5,lsr#3 // sigma0(X[i+1]) - add w27,w27,w16 // h+=Sigma1(e) - eor w28,w28,w21 // Maj(a,b,c) - eor w17,w11,w20,ror#22 // Sigma0(a) - eor w9,w9,w2,lsr#10 // sigma1(X[i+14]) - add w4,w4,w13 - add w23,w23,w27 // d+=h - add w27,w27,w28 // h+=Maj(a,b,c) - ldr w28,[x30],#4 // *K++, w19 in next round - add w4,w4,w10 - add w27,w27,w17 // h+=Sigma0(a) - add w4,w4,w9 - ldr w9,[sp,#8] - str w12,[sp,#4] - ror w16,w23,#6 - add w26,w26,w28 // h+=K[i] - ror w11,w6,#7 - and w17,w24,w23 - ror w10,w3,#17 - bic w28,w25,w23 - ror w12,w27,#2 - add w26,w26,w4 // h+=X[i] - eor w16,w16,w23,ror#11 - eor w11,w11,w6,ror#18 - orr w17,w17,w28 // Ch(e,f,g) - eor w28,w27,w20 // a^b, b^c in next round - eor w16,w16,w23,ror#25 // Sigma1(e) - eor w12,w12,w27,ror#13 - add w26,w26,w17 // h+=Ch(e,f,g) - and w19,w19,w28 // (b^c)&=(a^b) - eor w10,w10,w3,ror#19 - eor w11,w11,w6,lsr#3 // sigma0(X[i+1]) - add w26,w26,w16 // h+=Sigma1(e) - eor w19,w19,w20 // Maj(a,b,c) - eor w17,w12,w27,ror#22 // Sigma0(a) - eor w10,w10,w3,lsr#10 // sigma1(X[i+14]) - add w5,w5,w14 - add w22,w22,w26 // d+=h - add w26,w26,w19 // h+=Maj(a,b,c) - ldr w19,[x30],#4 // *K++, w28 in next round - add w5,w5,w11 - add w26,w26,w17 // h+=Sigma0(a) - add w5,w5,w10 - ldr w10,[sp,#12] - str w13,[sp,#8] - ror w16,w22,#6 - add w25,w25,w19 // h+=K[i] - ror w12,w7,#7 - and w17,w23,w22 - ror w11,w4,#17 - bic w19,w24,w22 - ror w13,w26,#2 - add w25,w25,w5 // h+=X[i] - eor w16,w16,w22,ror#11 - eor w12,w12,w7,ror#18 - orr w17,w17,w19 // Ch(e,f,g) - eor w19,w26,w27 // a^b, b^c in next round - eor w16,w16,w22,ror#25 // Sigma1(e) - eor w13,w13,w26,ror#13 - add w25,w25,w17 // h+=Ch(e,f,g) - and w28,w28,w19 // (b^c)&=(a^b) - eor w11,w11,w4,ror#19 - eor w12,w12,w7,lsr#3 // sigma0(X[i+1]) - add w25,w25,w16 // h+=Sigma1(e) - eor w28,w28,w27 // Maj(a,b,c) - eor w17,w13,w26,ror#22 // Sigma0(a) - eor w11,w11,w4,lsr#10 // sigma1(X[i+14]) - add w6,w6,w15 - add w21,w21,w25 // d+=h - add w25,w25,w28 // h+=Maj(a,b,c) - ldr w28,[x30],#4 // *K++, w19 in next round - add w6,w6,w12 - add w25,w25,w17 // h+=Sigma0(a) - add w6,w6,w11 - ldr w11,[sp,#0] - str w14,[sp,#12] - ror w16,w21,#6 - add w24,w24,w28 // h+=K[i] - ror w13,w8,#7 - and w17,w22,w21 - ror w12,w5,#17 - bic w28,w23,w21 - ror w14,w25,#2 - add w24,w24,w6 // h+=X[i] - eor w16,w16,w21,ror#11 - eor w13,w13,w8,ror#18 - orr w17,w17,w28 // Ch(e,f,g) - eor w28,w25,w26 // a^b, b^c in next round - eor w16,w16,w21,ror#25 // Sigma1(e) - eor w14,w14,w25,ror#13 - add w24,w24,w17 // h+=Ch(e,f,g) - and w19,w19,w28 // (b^c)&=(a^b) - eor w12,w12,w5,ror#19 - eor w13,w13,w8,lsr#3 // sigma0(X[i+1]) - add w24,w24,w16 // h+=Sigma1(e) - eor w19,w19,w26 // Maj(a,b,c) - eor w17,w14,w25,ror#22 // Sigma0(a) - eor w12,w12,w5,lsr#10 // sigma1(X[i+14]) - add w7,w7,w0 - add w20,w20,w24 // d+=h - add w24,w24,w19 // h+=Maj(a,b,c) - ldr w19,[x30],#4 // *K++, w28 in next round - add w7,w7,w13 - add w24,w24,w17 // h+=Sigma0(a) - add w7,w7,w12 - ldr w12,[sp,#4] - str w15,[sp,#0] - ror w16,w20,#6 - add w23,w23,w19 // h+=K[i] - ror w14,w9,#7 - and w17,w21,w20 - ror w13,w6,#17 - bic w19,w22,w20 - ror w15,w24,#2 - add w23,w23,w7 // h+=X[i] - eor w16,w16,w20,ror#11 - eor w14,w14,w9,ror#18 - orr w17,w17,w19 // Ch(e,f,g) - eor w19,w24,w25 // a^b, b^c in next round - eor w16,w16,w20,ror#25 // Sigma1(e) - eor w15,w15,w24,ror#13 - add w23,w23,w17 // h+=Ch(e,f,g) - and w28,w28,w19 // (b^c)&=(a^b) - eor w13,w13,w6,ror#19 - eor w14,w14,w9,lsr#3 // sigma0(X[i+1]) - add w23,w23,w16 // h+=Sigma1(e) - eor w28,w28,w25 // Maj(a,b,c) - eor w17,w15,w24,ror#22 // Sigma0(a) - eor w13,w13,w6,lsr#10 // sigma1(X[i+14]) - add w8,w8,w1 - add w27,w27,w23 // d+=h - add w23,w23,w28 // h+=Maj(a,b,c) - ldr w28,[x30],#4 // *K++, w19 in next round - add w8,w8,w14 - add w23,w23,w17 // h+=Sigma0(a) - add w8,w8,w13 - ldr w13,[sp,#8] - str w0,[sp,#4] - ror w16,w27,#6 - add w22,w22,w28 // h+=K[i] - ror w15,w10,#7 - and w17,w20,w27 - ror w14,w7,#17 - bic w28,w21,w27 - ror w0,w23,#2 - add w22,w22,w8 // h+=X[i] - eor w16,w16,w27,ror#11 - eor w15,w15,w10,ror#18 - orr w17,w17,w28 // Ch(e,f,g) - eor w28,w23,w24 // a^b, b^c in next round - eor w16,w16,w27,ror#25 // Sigma1(e) - eor w0,w0,w23,ror#13 - add w22,w22,w17 // h+=Ch(e,f,g) - and w19,w19,w28 // (b^c)&=(a^b) - eor w14,w14,w7,ror#19 - eor w15,w15,w10,lsr#3 // sigma0(X[i+1]) - add w22,w22,w16 // h+=Sigma1(e) - eor w19,w19,w24 // Maj(a,b,c) - eor w17,w0,w23,ror#22 // Sigma0(a) - eor w14,w14,w7,lsr#10 // sigma1(X[i+14]) - add w9,w9,w2 - add w26,w26,w22 // d+=h - add w22,w22,w19 // h+=Maj(a,b,c) - ldr w19,[x30],#4 // *K++, w28 in next round - add w9,w9,w15 - add w22,w22,w17 // h+=Sigma0(a) - add w9,w9,w14 - ldr w14,[sp,#12] - str w1,[sp,#8] - ror w16,w26,#6 - add w21,w21,w19 // h+=K[i] - ror w0,w11,#7 - and w17,w27,w26 - ror w15,w8,#17 - bic w19,w20,w26 - ror w1,w22,#2 - add w21,w21,w9 // h+=X[i] - eor w16,w16,w26,ror#11 - eor w0,w0,w11,ror#18 - orr w17,w17,w19 // Ch(e,f,g) - eor w19,w22,w23 // a^b, b^c in next round - eor w16,w16,w26,ror#25 // Sigma1(e) - eor w1,w1,w22,ror#13 - add w21,w21,w17 // h+=Ch(e,f,g) - and w28,w28,w19 // (b^c)&=(a^b) - eor w15,w15,w8,ror#19 - eor w0,w0,w11,lsr#3 // sigma0(X[i+1]) - add w21,w21,w16 // h+=Sigma1(e) - eor w28,w28,w23 // Maj(a,b,c) - eor w17,w1,w22,ror#22 // Sigma0(a) - eor w15,w15,w8,lsr#10 // sigma1(X[i+14]) - add w10,w10,w3 - add w25,w25,w21 // d+=h - add w21,w21,w28 // h+=Maj(a,b,c) - ldr w28,[x30],#4 // *K++, w19 in next round - add w10,w10,w0 - add w21,w21,w17 // h+=Sigma0(a) - add w10,w10,w15 - ldr w15,[sp,#0] - str w2,[sp,#12] - ror w16,w25,#6 - add w20,w20,w28 // h+=K[i] - ror w1,w12,#7 - and w17,w26,w25 - ror w0,w9,#17 - bic w28,w27,w25 - ror w2,w21,#2 - add w20,w20,w10 // h+=X[i] - eor w16,w16,w25,ror#11 - eor w1,w1,w12,ror#18 - orr w17,w17,w28 // Ch(e,f,g) - eor w28,w21,w22 // a^b, b^c in next round - eor w16,w16,w25,ror#25 // Sigma1(e) - eor w2,w2,w21,ror#13 - add w20,w20,w17 // h+=Ch(e,f,g) - and w19,w19,w28 // (b^c)&=(a^b) - eor w0,w0,w9,ror#19 - eor w1,w1,w12,lsr#3 // sigma0(X[i+1]) - add w20,w20,w16 // h+=Sigma1(e) - eor w19,w19,w22 // Maj(a,b,c) - eor w17,w2,w21,ror#22 // Sigma0(a) - eor w0,w0,w9,lsr#10 // sigma1(X[i+14]) - add w11,w11,w4 - add w24,w24,w20 // d+=h - add w20,w20,w19 // h+=Maj(a,b,c) - ldr w19,[x30],#4 // *K++, w28 in next round - add w11,w11,w1 - add w20,w20,w17 // h+=Sigma0(a) - add w11,w11,w0 - ldr w0,[sp,#4] - str w3,[sp,#0] - ror w16,w24,#6 - add w27,w27,w19 // h+=K[i] - ror w2,w13,#7 - and w17,w25,w24 - ror w1,w10,#17 - bic w19,w26,w24 - ror w3,w20,#2 - add w27,w27,w11 // h+=X[i] - eor w16,w16,w24,ror#11 - eor w2,w2,w13,ror#18 - orr w17,w17,w19 // Ch(e,f,g) - eor w19,w20,w21 // a^b, b^c in next round - eor w16,w16,w24,ror#25 // Sigma1(e) - eor w3,w3,w20,ror#13 - add w27,w27,w17 // h+=Ch(e,f,g) - and w28,w28,w19 // (b^c)&=(a^b) - eor w1,w1,w10,ror#19 - eor w2,w2,w13,lsr#3 // sigma0(X[i+1]) - add w27,w27,w16 // h+=Sigma1(e) - eor w28,w28,w21 // Maj(a,b,c) - eor w17,w3,w20,ror#22 // Sigma0(a) - eor w1,w1,w10,lsr#10 // sigma1(X[i+14]) - add w12,w12,w5 - add w23,w23,w27 // d+=h - add w27,w27,w28 // h+=Maj(a,b,c) - ldr w28,[x30],#4 // *K++, w19 in next round - add w12,w12,w2 - add w27,w27,w17 // h+=Sigma0(a) - add w12,w12,w1 - ldr w1,[sp,#8] - str w4,[sp,#4] - ror w16,w23,#6 - add w26,w26,w28 // h+=K[i] - ror w3,w14,#7 - and w17,w24,w23 - ror w2,w11,#17 - bic w28,w25,w23 - ror w4,w27,#2 - add w26,w26,w12 // h+=X[i] - eor w16,w16,w23,ror#11 - eor w3,w3,w14,ror#18 - orr w17,w17,w28 // Ch(e,f,g) - eor w28,w27,w20 // a^b, b^c in next round - eor w16,w16,w23,ror#25 // Sigma1(e) - eor w4,w4,w27,ror#13 - add w26,w26,w17 // h+=Ch(e,f,g) - and w19,w19,w28 // (b^c)&=(a^b) - eor w2,w2,w11,ror#19 - eor w3,w3,w14,lsr#3 // sigma0(X[i+1]) - add w26,w26,w16 // h+=Sigma1(e) - eor w19,w19,w20 // Maj(a,b,c) - eor w17,w4,w27,ror#22 // Sigma0(a) - eor w2,w2,w11,lsr#10 // sigma1(X[i+14]) - add w13,w13,w6 - add w22,w22,w26 // d+=h - add w26,w26,w19 // h+=Maj(a,b,c) - ldr w19,[x30],#4 // *K++, w28 in next round - add w13,w13,w3 - add w26,w26,w17 // h+=Sigma0(a) - add w13,w13,w2 - ldr w2,[sp,#12] - str w5,[sp,#8] - ror w16,w22,#6 - add w25,w25,w19 // h+=K[i] - ror w4,w15,#7 - and w17,w23,w22 - ror w3,w12,#17 - bic w19,w24,w22 - ror w5,w26,#2 - add w25,w25,w13 // h+=X[i] - eor w16,w16,w22,ror#11 - eor w4,w4,w15,ror#18 - orr w17,w17,w19 // Ch(e,f,g) - eor w19,w26,w27 // a^b, b^c in next round - eor w16,w16,w22,ror#25 // Sigma1(e) - eor w5,w5,w26,ror#13 - add w25,w25,w17 // h+=Ch(e,f,g) - and w28,w28,w19 // (b^c)&=(a^b) - eor w3,w3,w12,ror#19 - eor w4,w4,w15,lsr#3 // sigma0(X[i+1]) - add w25,w25,w16 // h+=Sigma1(e) - eor w28,w28,w27 // Maj(a,b,c) - eor w17,w5,w26,ror#22 // Sigma0(a) - eor w3,w3,w12,lsr#10 // sigma1(X[i+14]) - add w14,w14,w7 - add w21,w21,w25 // d+=h - add w25,w25,w28 // h+=Maj(a,b,c) - ldr w28,[x30],#4 // *K++, w19 in next round - add w14,w14,w4 - add w25,w25,w17 // h+=Sigma0(a) - add w14,w14,w3 - ldr w3,[sp,#0] - str w6,[sp,#12] - ror w16,w21,#6 - add w24,w24,w28 // h+=K[i] - ror w5,w0,#7 - and w17,w22,w21 - ror w4,w13,#17 - bic w28,w23,w21 - ror w6,w25,#2 - add w24,w24,w14 // h+=X[i] - eor w16,w16,w21,ror#11 - eor w5,w5,w0,ror#18 - orr w17,w17,w28 // Ch(e,f,g) - eor w28,w25,w26 // a^b, b^c in next round - eor w16,w16,w21,ror#25 // Sigma1(e) - eor w6,w6,w25,ror#13 - add w24,w24,w17 // h+=Ch(e,f,g) - and w19,w19,w28 // (b^c)&=(a^b) - eor w4,w4,w13,ror#19 - eor w5,w5,w0,lsr#3 // sigma0(X[i+1]) - add w24,w24,w16 // h+=Sigma1(e) - eor w19,w19,w26 // Maj(a,b,c) - eor w17,w6,w25,ror#22 // Sigma0(a) - eor w4,w4,w13,lsr#10 // sigma1(X[i+14]) - add w15,w15,w8 - add w20,w20,w24 // d+=h - add w24,w24,w19 // h+=Maj(a,b,c) - ldr w19,[x30],#4 // *K++, w28 in next round - add w15,w15,w5 - add w24,w24,w17 // h+=Sigma0(a) - add w15,w15,w4 - ldr w4,[sp,#4] - str w7,[sp,#0] - ror w16,w20,#6 - add w23,w23,w19 // h+=K[i] - ror w6,w1,#7 - and w17,w21,w20 - ror w5,w14,#17 - bic w19,w22,w20 - ror w7,w24,#2 - add w23,w23,w15 // h+=X[i] - eor w16,w16,w20,ror#11 - eor w6,w6,w1,ror#18 - orr w17,w17,w19 // Ch(e,f,g) - eor w19,w24,w25 // a^b, b^c in next round - eor w16,w16,w20,ror#25 // Sigma1(e) - eor w7,w7,w24,ror#13 - add w23,w23,w17 // h+=Ch(e,f,g) - and w28,w28,w19 // (b^c)&=(a^b) - eor w5,w5,w14,ror#19 - eor w6,w6,w1,lsr#3 // sigma0(X[i+1]) - add w23,w23,w16 // h+=Sigma1(e) - eor w28,w28,w25 // Maj(a,b,c) - eor w17,w7,w24,ror#22 // Sigma0(a) - eor w5,w5,w14,lsr#10 // sigma1(X[i+14]) - add w0,w0,w9 - add w27,w27,w23 // d+=h - add w23,w23,w28 // h+=Maj(a,b,c) - ldr w28,[x30],#4 // *K++, w19 in next round - add w0,w0,w6 - add w23,w23,w17 // h+=Sigma0(a) - add w0,w0,w5 - ldr w5,[sp,#8] - str w8,[sp,#4] - ror w16,w27,#6 - add w22,w22,w28 // h+=K[i] - ror w7,w2,#7 - and w17,w20,w27 - ror w6,w15,#17 - bic w28,w21,w27 - ror w8,w23,#2 - add w22,w22,w0 // h+=X[i] - eor w16,w16,w27,ror#11 - eor w7,w7,w2,ror#18 - orr w17,w17,w28 // Ch(e,f,g) - eor w28,w23,w24 // a^b, b^c in next round - eor w16,w16,w27,ror#25 // Sigma1(e) - eor w8,w8,w23,ror#13 - add w22,w22,w17 // h+=Ch(e,f,g) - and w19,w19,w28 // (b^c)&=(a^b) - eor w6,w6,w15,ror#19 - eor w7,w7,w2,lsr#3 // sigma0(X[i+1]) - add w22,w22,w16 // h+=Sigma1(e) - eor w19,w19,w24 // Maj(a,b,c) - eor w17,w8,w23,ror#22 // Sigma0(a) - eor w6,w6,w15,lsr#10 // sigma1(X[i+14]) - add w1,w1,w10 - add w26,w26,w22 // d+=h - add w22,w22,w19 // h+=Maj(a,b,c) - ldr w19,[x30],#4 // *K++, w28 in next round - add w1,w1,w7 - add w22,w22,w17 // h+=Sigma0(a) - add w1,w1,w6 - ldr w6,[sp,#12] - str w9,[sp,#8] - ror w16,w26,#6 - add w21,w21,w19 // h+=K[i] - ror w8,w3,#7 - and w17,w27,w26 - ror w7,w0,#17 - bic w19,w20,w26 - ror w9,w22,#2 - add w21,w21,w1 // h+=X[i] - eor w16,w16,w26,ror#11 - eor w8,w8,w3,ror#18 - orr w17,w17,w19 // Ch(e,f,g) - eor w19,w22,w23 // a^b, b^c in next round - eor w16,w16,w26,ror#25 // Sigma1(e) - eor w9,w9,w22,ror#13 - add w21,w21,w17 // h+=Ch(e,f,g) - and w28,w28,w19 // (b^c)&=(a^b) - eor w7,w7,w0,ror#19 - eor w8,w8,w3,lsr#3 // sigma0(X[i+1]) - add w21,w21,w16 // h+=Sigma1(e) - eor w28,w28,w23 // Maj(a,b,c) - eor w17,w9,w22,ror#22 // Sigma0(a) - eor w7,w7,w0,lsr#10 // sigma1(X[i+14]) - add w2,w2,w11 - add w25,w25,w21 // d+=h - add w21,w21,w28 // h+=Maj(a,b,c) - ldr w28,[x30],#4 // *K++, w19 in next round - add w2,w2,w8 - add w21,w21,w17 // h+=Sigma0(a) - add w2,w2,w7 - ldr w7,[sp,#0] - str w10,[sp,#12] - ror w16,w25,#6 - add w20,w20,w28 // h+=K[i] - ror w9,w4,#7 - and w17,w26,w25 - ror w8,w1,#17 - bic w28,w27,w25 - ror w10,w21,#2 - add w20,w20,w2 // h+=X[i] - eor w16,w16,w25,ror#11 - eor w9,w9,w4,ror#18 - orr w17,w17,w28 // Ch(e,f,g) - eor w28,w21,w22 // a^b, b^c in next round - eor w16,w16,w25,ror#25 // Sigma1(e) - eor w10,w10,w21,ror#13 - add w20,w20,w17 // h+=Ch(e,f,g) - and w19,w19,w28 // (b^c)&=(a^b) - eor w8,w8,w1,ror#19 - eor w9,w9,w4,lsr#3 // sigma0(X[i+1]) - add w20,w20,w16 // h+=Sigma1(e) - eor w19,w19,w22 // Maj(a,b,c) - eor w17,w10,w21,ror#22 // Sigma0(a) - eor w8,w8,w1,lsr#10 // sigma1(X[i+14]) - add w3,w3,w12 - add w24,w24,w20 // d+=h - add w20,w20,w19 // h+=Maj(a,b,c) - ldr w19,[x30],#4 // *K++, w28 in next round - add w3,w3,w9 - add w20,w20,w17 // h+=Sigma0(a) - add w3,w3,w8 - cbnz w19,.Loop_16_xx - - ldp x0,x2,[x29,#96] - ldr x1,[x29,#112] - sub x30,x30,#260 // rewind - - ldp w3,w4,[x0] - ldp w5,w6,[x0,#2*4] - add x1,x1,#14*4 // advance input pointer - ldp w7,w8,[x0,#4*4] - add w20,w20,w3 - ldp w9,w10,[x0,#6*4] - add w21,w21,w4 - add w22,w22,w5 - add w23,w23,w6 - stp w20,w21,[x0] - add w24,w24,w7 - add w25,w25,w8 - stp w22,w23,[x0,#2*4] - add w26,w26,w9 - add w27,w27,w10 - cmp x1,x2 - stp w24,w25,[x0,#4*4] - stp w26,w27,[x0,#6*4] - b.ne .Loop - - ldp x19,x20,[x29,#16] - add sp,sp,#4*4 - ldp x21,x22,[x29,#32] - ldp x23,x24,[x29,#48] - ldp x25,x26,[x29,#64] - ldp x27,x28,[x29,#80] - ldp x29,x30,[sp],#128 - AARCH64_VALIDATE_LINK_REGISTER - ret -.size GFp_sha256_block_data_order,.-GFp_sha256_block_data_order - -.section .rodata -.align 6 -.type .LK256,%object -.LK256: -.long 0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5 -.long 0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5 -.long 0xd807aa98,0x12835b01,0x243185be,0x550c7dc3 -.long 0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174 -.long 0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc -.long 0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da -.long 0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7 -.long 0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967 -.long 0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13 -.long 0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85 -.long 0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3 -.long 0xd192e819,0xd6990624,0xf40e3585,0x106aa070 -.long 0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5 -.long 0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3 -.long 0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208 -.long 0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2 -.long 0 //terminator -.size .LK256,.-.LK256 -.byte 83,72,65,50,53,54,32,98,108,111,99,107,32,116,114,97,110,115,102,111,114,109,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 -.align 2 -.align 2 -.text -#ifndef __KERNEL__ -.type sha256_block_armv8,%function -.align 6 -sha256_block_armv8: -.Lv8_entry: - // Armv8.3-A PAuth: even though x30 is pushed to stack it is not popped later. - stp x29,x30,[sp,#-16]! - add x29,sp,#0 - - ld1 {v0.4s,v1.4s},[x0] - adrp x3,.LK256 - add x3,x3,:lo12:.LK256 - -.Loop_hw: - ld1 {v4.16b,v5.16b,v6.16b,v7.16b},[x1],#64 - sub x2,x2,#1 - ld1 {v16.4s},[x3],#16 - rev32 v4.16b,v4.16b - rev32 v5.16b,v5.16b - rev32 v6.16b,v6.16b - rev32 v7.16b,v7.16b - orr v18.16b,v0.16b,v0.16b // offload - orr v19.16b,v1.16b,v1.16b - ld1 {v17.4s},[x3],#16 - add v16.4s,v16.4s,v4.4s -.inst 0x5e2828a4 //sha256su0 v4.16b,v5.16b - orr v2.16b,v0.16b,v0.16b -.inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s -.inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s -.inst 0x5e0760c4 //sha256su1 v4.16b,v6.16b,v7.16b - ld1 {v16.4s},[x3],#16 - add v17.4s,v17.4s,v5.4s -.inst 0x5e2828c5 //sha256su0 v5.16b,v6.16b - orr v2.16b,v0.16b,v0.16b -.inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s -.inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s -.inst 0x5e0460e5 //sha256su1 v5.16b,v7.16b,v4.16b - ld1 {v17.4s},[x3],#16 - add v16.4s,v16.4s,v6.4s -.inst 0x5e2828e6 //sha256su0 v6.16b,v7.16b - orr v2.16b,v0.16b,v0.16b -.inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s -.inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s -.inst 0x5e056086 //sha256su1 v6.16b,v4.16b,v5.16b - ld1 {v16.4s},[x3],#16 - add v17.4s,v17.4s,v7.4s -.inst 0x5e282887 //sha256su0 v7.16b,v4.16b - orr v2.16b,v0.16b,v0.16b -.inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s -.inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s -.inst 0x5e0660a7 //sha256su1 v7.16b,v5.16b,v6.16b - ld1 {v17.4s},[x3],#16 - add v16.4s,v16.4s,v4.4s -.inst 0x5e2828a4 //sha256su0 v4.16b,v5.16b - orr v2.16b,v0.16b,v0.16b -.inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s -.inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s -.inst 0x5e0760c4 //sha256su1 v4.16b,v6.16b,v7.16b - ld1 {v16.4s},[x3],#16 - add v17.4s,v17.4s,v5.4s -.inst 0x5e2828c5 //sha256su0 v5.16b,v6.16b - orr v2.16b,v0.16b,v0.16b -.inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s -.inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s -.inst 0x5e0460e5 //sha256su1 v5.16b,v7.16b,v4.16b - ld1 {v17.4s},[x3],#16 - add v16.4s,v16.4s,v6.4s -.inst 0x5e2828e6 //sha256su0 v6.16b,v7.16b - orr v2.16b,v0.16b,v0.16b -.inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s -.inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s -.inst 0x5e056086 //sha256su1 v6.16b,v4.16b,v5.16b - ld1 {v16.4s},[x3],#16 - add v17.4s,v17.4s,v7.4s -.inst 0x5e282887 //sha256su0 v7.16b,v4.16b - orr v2.16b,v0.16b,v0.16b -.inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s -.inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s -.inst 0x5e0660a7 //sha256su1 v7.16b,v5.16b,v6.16b - ld1 {v17.4s},[x3],#16 - add v16.4s,v16.4s,v4.4s -.inst 0x5e2828a4 //sha256su0 v4.16b,v5.16b - orr v2.16b,v0.16b,v0.16b -.inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s -.inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s -.inst 0x5e0760c4 //sha256su1 v4.16b,v6.16b,v7.16b - ld1 {v16.4s},[x3],#16 - add v17.4s,v17.4s,v5.4s -.inst 0x5e2828c5 //sha256su0 v5.16b,v6.16b - orr v2.16b,v0.16b,v0.16b -.inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s -.inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s -.inst 0x5e0460e5 //sha256su1 v5.16b,v7.16b,v4.16b - ld1 {v17.4s},[x3],#16 - add v16.4s,v16.4s,v6.4s -.inst 0x5e2828e6 //sha256su0 v6.16b,v7.16b - orr v2.16b,v0.16b,v0.16b -.inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s -.inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s -.inst 0x5e056086 //sha256su1 v6.16b,v4.16b,v5.16b - ld1 {v16.4s},[x3],#16 - add v17.4s,v17.4s,v7.4s -.inst 0x5e282887 //sha256su0 v7.16b,v4.16b - orr v2.16b,v0.16b,v0.16b -.inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s -.inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s -.inst 0x5e0660a7 //sha256su1 v7.16b,v5.16b,v6.16b - ld1 {v17.4s},[x3],#16 - add v16.4s,v16.4s,v4.4s - orr v2.16b,v0.16b,v0.16b -.inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s -.inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s - - ld1 {v16.4s},[x3],#16 - add v17.4s,v17.4s,v5.4s - orr v2.16b,v0.16b,v0.16b -.inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s -.inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s - - ld1 {v17.4s},[x3] - add v16.4s,v16.4s,v6.4s - sub x3,x3,#64*4-16 // rewind - orr v2.16b,v0.16b,v0.16b -.inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s -.inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s - - add v17.4s,v17.4s,v7.4s - orr v2.16b,v0.16b,v0.16b -.inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s -.inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s - - add v0.4s,v0.4s,v18.4s - add v1.4s,v1.4s,v19.4s - - cbnz x2,.Loop_hw - - st1 {v0.4s,v1.4s},[x0] - - ldr x29,[sp],#16 - ret -.size sha256_block_armv8,.-sha256_block_armv8 -#endif -#endif -#endif // !OPENSSL_NO_ASM -.section .note.GNU-stack,"",%progbits diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/sha256-x86_64-elf.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/sha256-x86_64-elf.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/sha256-x86_64-elf.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/sha256-x86_64-elf.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,3970 +0,0 @@ -# This file is generated from a similarly-named Perl script in the BoringSSL -# source tree. Do not edit by hand. - -#if defined(__has_feature) -#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) -#define OPENSSL_NO_ASM -#endif -#endif - -#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) -.text - -.extern GFp_ia32cap_P -.hidden GFp_ia32cap_P -.globl GFp_sha256_block_data_order -.hidden GFp_sha256_block_data_order -.type GFp_sha256_block_data_order,@function -.align 16 -GFp_sha256_block_data_order: -.cfi_startproc - leaq GFp_ia32cap_P(%rip),%r11 - movl 0(%r11),%r9d - movl 4(%r11),%r10d - movl 8(%r11),%r11d - andl $1073741824,%r9d - andl $268435968,%r10d - orl %r9d,%r10d - cmpl $1342177792,%r10d - je .Lavx_shortcut - testl $512,%r10d - jnz .Lssse3_shortcut - movq %rsp,%rax -.cfi_def_cfa_register %rax - pushq %rbx -.cfi_offset %rbx,-16 - pushq %rbp -.cfi_offset %rbp,-24 - pushq %r12 -.cfi_offset %r12,-32 - pushq %r13 -.cfi_offset %r13,-40 - pushq %r14 -.cfi_offset %r14,-48 - pushq %r15 -.cfi_offset %r15,-56 - shlq $4,%rdx - subq $64+32,%rsp - leaq (%rsi,%rdx,4),%rdx - andq $-64,%rsp - movq %rdi,64+0(%rsp) - movq %rsi,64+8(%rsp) - movq %rdx,64+16(%rsp) - movq %rax,88(%rsp) -.cfi_escape 0x0f,0x06,0x77,0xd8,0x00,0x06,0x23,0x08 -.Lprologue: - - movl 0(%rdi),%eax - movl 4(%rdi),%ebx - movl 8(%rdi),%ecx - movl 12(%rdi),%edx - movl 16(%rdi),%r8d - movl 20(%rdi),%r9d - movl 24(%rdi),%r10d - movl 28(%rdi),%r11d - jmp .Lloop - -.align 16 -.Lloop: - movl %ebx,%edi - leaq K256(%rip),%rbp - xorl %ecx,%edi - movl 0(%rsi),%r12d - movl %r8d,%r13d - movl %eax,%r14d - bswapl %r12d - rorl $14,%r13d - movl %r9d,%r15d - - xorl %r8d,%r13d - rorl $9,%r14d - xorl %r10d,%r15d - - movl %r12d,0(%rsp) - xorl %eax,%r14d - andl %r8d,%r15d - - rorl $5,%r13d - addl %r11d,%r12d - xorl %r10d,%r15d - - rorl $11,%r14d - xorl %r8d,%r13d - addl %r15d,%r12d - - movl %eax,%r15d - addl (%rbp),%r12d - xorl %eax,%r14d - - xorl %ebx,%r15d - rorl $6,%r13d - movl %ebx,%r11d - - andl %r15d,%edi - rorl $2,%r14d - addl %r13d,%r12d - - xorl %edi,%r11d - addl %r12d,%edx - addl %r12d,%r11d - - leaq 4(%rbp),%rbp - addl %r14d,%r11d - movl 4(%rsi),%r12d - movl %edx,%r13d - movl %r11d,%r14d - bswapl %r12d - rorl $14,%r13d - movl %r8d,%edi - - xorl %edx,%r13d - rorl $9,%r14d - xorl %r9d,%edi - - movl %r12d,4(%rsp) - xorl %r11d,%r14d - andl %edx,%edi - - rorl $5,%r13d - addl %r10d,%r12d - xorl %r9d,%edi - - rorl $11,%r14d - xorl %edx,%r13d - addl %edi,%r12d - - movl %r11d,%edi - addl (%rbp),%r12d - xorl %r11d,%r14d - - xorl %eax,%edi - rorl $6,%r13d - movl %eax,%r10d - - andl %edi,%r15d - rorl $2,%r14d - addl %r13d,%r12d - - xorl %r15d,%r10d - addl %r12d,%ecx - addl %r12d,%r10d - - leaq 4(%rbp),%rbp - addl %r14d,%r10d - movl 8(%rsi),%r12d - movl %ecx,%r13d - movl %r10d,%r14d - bswapl %r12d - rorl $14,%r13d - movl %edx,%r15d - - xorl %ecx,%r13d - rorl $9,%r14d - xorl %r8d,%r15d - - movl %r12d,8(%rsp) - xorl %r10d,%r14d - andl %ecx,%r15d - - rorl $5,%r13d - addl %r9d,%r12d - xorl %r8d,%r15d - - rorl $11,%r14d - xorl %ecx,%r13d - addl %r15d,%r12d - - movl %r10d,%r15d - addl (%rbp),%r12d - xorl %r10d,%r14d - - xorl %r11d,%r15d - rorl $6,%r13d - movl %r11d,%r9d - - andl %r15d,%edi - rorl $2,%r14d - addl %r13d,%r12d - - xorl %edi,%r9d - addl %r12d,%ebx - addl %r12d,%r9d - - leaq 4(%rbp),%rbp - addl %r14d,%r9d - movl 12(%rsi),%r12d - movl %ebx,%r13d - movl %r9d,%r14d - bswapl %r12d - rorl $14,%r13d - movl %ecx,%edi - - xorl %ebx,%r13d - rorl $9,%r14d - xorl %edx,%edi - - movl %r12d,12(%rsp) - xorl %r9d,%r14d - andl %ebx,%edi - - rorl $5,%r13d - addl %r8d,%r12d - xorl %edx,%edi - - rorl $11,%r14d - xorl %ebx,%r13d - addl %edi,%r12d - - movl %r9d,%edi - addl (%rbp),%r12d - xorl %r9d,%r14d - - xorl %r10d,%edi - rorl $6,%r13d - movl %r10d,%r8d - - andl %edi,%r15d - rorl $2,%r14d - addl %r13d,%r12d - - xorl %r15d,%r8d - addl %r12d,%eax - addl %r12d,%r8d - - leaq 20(%rbp),%rbp - addl %r14d,%r8d - movl 16(%rsi),%r12d - movl %eax,%r13d - movl %r8d,%r14d - bswapl %r12d - rorl $14,%r13d - movl %ebx,%r15d - - xorl %eax,%r13d - rorl $9,%r14d - xorl %ecx,%r15d - - movl %r12d,16(%rsp) - xorl %r8d,%r14d - andl %eax,%r15d - - rorl $5,%r13d - addl %edx,%r12d - xorl %ecx,%r15d - - rorl $11,%r14d - xorl %eax,%r13d - addl %r15d,%r12d - - movl %r8d,%r15d - addl (%rbp),%r12d - xorl %r8d,%r14d - - xorl %r9d,%r15d - rorl $6,%r13d - movl %r9d,%edx - - andl %r15d,%edi - rorl $2,%r14d - addl %r13d,%r12d - - xorl %edi,%edx - addl %r12d,%r11d - addl %r12d,%edx - - leaq 4(%rbp),%rbp - addl %r14d,%edx - movl 20(%rsi),%r12d - movl %r11d,%r13d - movl %edx,%r14d - bswapl %r12d - rorl $14,%r13d - movl %eax,%edi - - xorl %r11d,%r13d - rorl $9,%r14d - xorl %ebx,%edi - - movl %r12d,20(%rsp) - xorl %edx,%r14d - andl %r11d,%edi - - rorl $5,%r13d - addl %ecx,%r12d - xorl %ebx,%edi - - rorl $11,%r14d - xorl %r11d,%r13d - addl %edi,%r12d - - movl %edx,%edi - addl (%rbp),%r12d - xorl %edx,%r14d - - xorl %r8d,%edi - rorl $6,%r13d - movl %r8d,%ecx - - andl %edi,%r15d - rorl $2,%r14d - addl %r13d,%r12d - - xorl %r15d,%ecx - addl %r12d,%r10d - addl %r12d,%ecx - - leaq 4(%rbp),%rbp - addl %r14d,%ecx - movl 24(%rsi),%r12d - movl %r10d,%r13d - movl %ecx,%r14d - bswapl %r12d - rorl $14,%r13d - movl %r11d,%r15d - - xorl %r10d,%r13d - rorl $9,%r14d - xorl %eax,%r15d - - movl %r12d,24(%rsp) - xorl %ecx,%r14d - andl %r10d,%r15d - - rorl $5,%r13d - addl %ebx,%r12d - xorl %eax,%r15d - - rorl $11,%r14d - xorl %r10d,%r13d - addl %r15d,%r12d - - movl %ecx,%r15d - addl (%rbp),%r12d - xorl %ecx,%r14d - - xorl %edx,%r15d - rorl $6,%r13d - movl %edx,%ebx - - andl %r15d,%edi - rorl $2,%r14d - addl %r13d,%r12d - - xorl %edi,%ebx - addl %r12d,%r9d - addl %r12d,%ebx - - leaq 4(%rbp),%rbp - addl %r14d,%ebx - movl 28(%rsi),%r12d - movl %r9d,%r13d - movl %ebx,%r14d - bswapl %r12d - rorl $14,%r13d - movl %r10d,%edi - - xorl %r9d,%r13d - rorl $9,%r14d - xorl %r11d,%edi - - movl %r12d,28(%rsp) - xorl %ebx,%r14d - andl %r9d,%edi - - rorl $5,%r13d - addl %eax,%r12d - xorl %r11d,%edi - - rorl $11,%r14d - xorl %r9d,%r13d - addl %edi,%r12d - - movl %ebx,%edi - addl (%rbp),%r12d - xorl %ebx,%r14d - - xorl %ecx,%edi - rorl $6,%r13d - movl %ecx,%eax - - andl %edi,%r15d - rorl $2,%r14d - addl %r13d,%r12d - - xorl %r15d,%eax - addl %r12d,%r8d - addl %r12d,%eax - - leaq 20(%rbp),%rbp - addl %r14d,%eax - movl 32(%rsi),%r12d - movl %r8d,%r13d - movl %eax,%r14d - bswapl %r12d - rorl $14,%r13d - movl %r9d,%r15d - - xorl %r8d,%r13d - rorl $9,%r14d - xorl %r10d,%r15d - - movl %r12d,32(%rsp) - xorl %eax,%r14d - andl %r8d,%r15d - - rorl $5,%r13d - addl %r11d,%r12d - xorl %r10d,%r15d - - rorl $11,%r14d - xorl %r8d,%r13d - addl %r15d,%r12d - - movl %eax,%r15d - addl (%rbp),%r12d - xorl %eax,%r14d - - xorl %ebx,%r15d - rorl $6,%r13d - movl %ebx,%r11d - - andl %r15d,%edi - rorl $2,%r14d - addl %r13d,%r12d - - xorl %edi,%r11d - addl %r12d,%edx - addl %r12d,%r11d - - leaq 4(%rbp),%rbp - addl %r14d,%r11d - movl 36(%rsi),%r12d - movl %edx,%r13d - movl %r11d,%r14d - bswapl %r12d - rorl $14,%r13d - movl %r8d,%edi - - xorl %edx,%r13d - rorl $9,%r14d - xorl %r9d,%edi - - movl %r12d,36(%rsp) - xorl %r11d,%r14d - andl %edx,%edi - - rorl $5,%r13d - addl %r10d,%r12d - xorl %r9d,%edi - - rorl $11,%r14d - xorl %edx,%r13d - addl %edi,%r12d - - movl %r11d,%edi - addl (%rbp),%r12d - xorl %r11d,%r14d - - xorl %eax,%edi - rorl $6,%r13d - movl %eax,%r10d - - andl %edi,%r15d - rorl $2,%r14d - addl %r13d,%r12d - - xorl %r15d,%r10d - addl %r12d,%ecx - addl %r12d,%r10d - - leaq 4(%rbp),%rbp - addl %r14d,%r10d - movl 40(%rsi),%r12d - movl %ecx,%r13d - movl %r10d,%r14d - bswapl %r12d - rorl $14,%r13d - movl %edx,%r15d - - xorl %ecx,%r13d - rorl $9,%r14d - xorl %r8d,%r15d - - movl %r12d,40(%rsp) - xorl %r10d,%r14d - andl %ecx,%r15d - - rorl $5,%r13d - addl %r9d,%r12d - xorl %r8d,%r15d - - rorl $11,%r14d - xorl %ecx,%r13d - addl %r15d,%r12d - - movl %r10d,%r15d - addl (%rbp),%r12d - xorl %r10d,%r14d - - xorl %r11d,%r15d - rorl $6,%r13d - movl %r11d,%r9d - - andl %r15d,%edi - rorl $2,%r14d - addl %r13d,%r12d - - xorl %edi,%r9d - addl %r12d,%ebx - addl %r12d,%r9d - - leaq 4(%rbp),%rbp - addl %r14d,%r9d - movl 44(%rsi),%r12d - movl %ebx,%r13d - movl %r9d,%r14d - bswapl %r12d - rorl $14,%r13d - movl %ecx,%edi - - xorl %ebx,%r13d - rorl $9,%r14d - xorl %edx,%edi - - movl %r12d,44(%rsp) - xorl %r9d,%r14d - andl %ebx,%edi - - rorl $5,%r13d - addl %r8d,%r12d - xorl %edx,%edi - - rorl $11,%r14d - xorl %ebx,%r13d - addl %edi,%r12d - - movl %r9d,%edi - addl (%rbp),%r12d - xorl %r9d,%r14d - - xorl %r10d,%edi - rorl $6,%r13d - movl %r10d,%r8d - - andl %edi,%r15d - rorl $2,%r14d - addl %r13d,%r12d - - xorl %r15d,%r8d - addl %r12d,%eax - addl %r12d,%r8d - - leaq 20(%rbp),%rbp - addl %r14d,%r8d - movl 48(%rsi),%r12d - movl %eax,%r13d - movl %r8d,%r14d - bswapl %r12d - rorl $14,%r13d - movl %ebx,%r15d - - xorl %eax,%r13d - rorl $9,%r14d - xorl %ecx,%r15d - - movl %r12d,48(%rsp) - xorl %r8d,%r14d - andl %eax,%r15d - - rorl $5,%r13d - addl %edx,%r12d - xorl %ecx,%r15d - - rorl $11,%r14d - xorl %eax,%r13d - addl %r15d,%r12d - - movl %r8d,%r15d - addl (%rbp),%r12d - xorl %r8d,%r14d - - xorl %r9d,%r15d - rorl $6,%r13d - movl %r9d,%edx - - andl %r15d,%edi - rorl $2,%r14d - addl %r13d,%r12d - - xorl %edi,%edx - addl %r12d,%r11d - addl %r12d,%edx - - leaq 4(%rbp),%rbp - addl %r14d,%edx - movl 52(%rsi),%r12d - movl %r11d,%r13d - movl %edx,%r14d - bswapl %r12d - rorl $14,%r13d - movl %eax,%edi - - xorl %r11d,%r13d - rorl $9,%r14d - xorl %ebx,%edi - - movl %r12d,52(%rsp) - xorl %edx,%r14d - andl %r11d,%edi - - rorl $5,%r13d - addl %ecx,%r12d - xorl %ebx,%edi - - rorl $11,%r14d - xorl %r11d,%r13d - addl %edi,%r12d - - movl %edx,%edi - addl (%rbp),%r12d - xorl %edx,%r14d - - xorl %r8d,%edi - rorl $6,%r13d - movl %r8d,%ecx - - andl %edi,%r15d - rorl $2,%r14d - addl %r13d,%r12d - - xorl %r15d,%ecx - addl %r12d,%r10d - addl %r12d,%ecx - - leaq 4(%rbp),%rbp - addl %r14d,%ecx - movl 56(%rsi),%r12d - movl %r10d,%r13d - movl %ecx,%r14d - bswapl %r12d - rorl $14,%r13d - movl %r11d,%r15d - - xorl %r10d,%r13d - rorl $9,%r14d - xorl %eax,%r15d - - movl %r12d,56(%rsp) - xorl %ecx,%r14d - andl %r10d,%r15d - - rorl $5,%r13d - addl %ebx,%r12d - xorl %eax,%r15d - - rorl $11,%r14d - xorl %r10d,%r13d - addl %r15d,%r12d - - movl %ecx,%r15d - addl (%rbp),%r12d - xorl %ecx,%r14d - - xorl %edx,%r15d - rorl $6,%r13d - movl %edx,%ebx - - andl %r15d,%edi - rorl $2,%r14d - addl %r13d,%r12d - - xorl %edi,%ebx - addl %r12d,%r9d - addl %r12d,%ebx - - leaq 4(%rbp),%rbp - addl %r14d,%ebx - movl 60(%rsi),%r12d - movl %r9d,%r13d - movl %ebx,%r14d - bswapl %r12d - rorl $14,%r13d - movl %r10d,%edi - - xorl %r9d,%r13d - rorl $9,%r14d - xorl %r11d,%edi - - movl %r12d,60(%rsp) - xorl %ebx,%r14d - andl %r9d,%edi - - rorl $5,%r13d - addl %eax,%r12d - xorl %r11d,%edi - - rorl $11,%r14d - xorl %r9d,%r13d - addl %edi,%r12d - - movl %ebx,%edi - addl (%rbp),%r12d - xorl %ebx,%r14d - - xorl %ecx,%edi - rorl $6,%r13d - movl %ecx,%eax - - andl %edi,%r15d - rorl $2,%r14d - addl %r13d,%r12d - - xorl %r15d,%eax - addl %r12d,%r8d - addl %r12d,%eax - - leaq 20(%rbp),%rbp - jmp .Lrounds_16_xx -.align 16 -.Lrounds_16_xx: - movl 4(%rsp),%r13d - movl 56(%rsp),%r15d - - movl %r13d,%r12d - rorl $11,%r13d - addl %r14d,%eax - movl %r15d,%r14d - rorl $2,%r15d - - xorl %r12d,%r13d - shrl $3,%r12d - rorl $7,%r13d - xorl %r14d,%r15d - shrl $10,%r14d - - rorl $17,%r15d - xorl %r13d,%r12d - xorl %r14d,%r15d - addl 36(%rsp),%r12d - - addl 0(%rsp),%r12d - movl %r8d,%r13d - addl %r15d,%r12d - movl %eax,%r14d - rorl $14,%r13d - movl %r9d,%r15d - - xorl %r8d,%r13d - rorl $9,%r14d - xorl %r10d,%r15d - - movl %r12d,0(%rsp) - xorl %eax,%r14d - andl %r8d,%r15d - - rorl $5,%r13d - addl %r11d,%r12d - xorl %r10d,%r15d - - rorl $11,%r14d - xorl %r8d,%r13d - addl %r15d,%r12d - - movl %eax,%r15d - addl (%rbp),%r12d - xorl %eax,%r14d - - xorl %ebx,%r15d - rorl $6,%r13d - movl %ebx,%r11d - - andl %r15d,%edi - rorl $2,%r14d - addl %r13d,%r12d - - xorl %edi,%r11d - addl %r12d,%edx - addl %r12d,%r11d - - leaq 4(%rbp),%rbp - movl 8(%rsp),%r13d - movl 60(%rsp),%edi - - movl %r13d,%r12d - rorl $11,%r13d - addl %r14d,%r11d - movl %edi,%r14d - rorl $2,%edi - - xorl %r12d,%r13d - shrl $3,%r12d - rorl $7,%r13d - xorl %r14d,%edi - shrl $10,%r14d - - rorl $17,%edi - xorl %r13d,%r12d - xorl %r14d,%edi - addl 40(%rsp),%r12d - - addl 4(%rsp),%r12d - movl %edx,%r13d - addl %edi,%r12d - movl %r11d,%r14d - rorl $14,%r13d - movl %r8d,%edi - - xorl %edx,%r13d - rorl $9,%r14d - xorl %r9d,%edi - - movl %r12d,4(%rsp) - xorl %r11d,%r14d - andl %edx,%edi - - rorl $5,%r13d - addl %r10d,%r12d - xorl %r9d,%edi - - rorl $11,%r14d - xorl %edx,%r13d - addl %edi,%r12d - - movl %r11d,%edi - addl (%rbp),%r12d - xorl %r11d,%r14d - - xorl %eax,%edi - rorl $6,%r13d - movl %eax,%r10d - - andl %edi,%r15d - rorl $2,%r14d - addl %r13d,%r12d - - xorl %r15d,%r10d - addl %r12d,%ecx - addl %r12d,%r10d - - leaq 4(%rbp),%rbp - movl 12(%rsp),%r13d - movl 0(%rsp),%r15d - - movl %r13d,%r12d - rorl $11,%r13d - addl %r14d,%r10d - movl %r15d,%r14d - rorl $2,%r15d - - xorl %r12d,%r13d - shrl $3,%r12d - rorl $7,%r13d - xorl %r14d,%r15d - shrl $10,%r14d - - rorl $17,%r15d - xorl %r13d,%r12d - xorl %r14d,%r15d - addl 44(%rsp),%r12d - - addl 8(%rsp),%r12d - movl %ecx,%r13d - addl %r15d,%r12d - movl %r10d,%r14d - rorl $14,%r13d - movl %edx,%r15d - - xorl %ecx,%r13d - rorl $9,%r14d - xorl %r8d,%r15d - - movl %r12d,8(%rsp) - xorl %r10d,%r14d - andl %ecx,%r15d - - rorl $5,%r13d - addl %r9d,%r12d - xorl %r8d,%r15d - - rorl $11,%r14d - xorl %ecx,%r13d - addl %r15d,%r12d - - movl %r10d,%r15d - addl (%rbp),%r12d - xorl %r10d,%r14d - - xorl %r11d,%r15d - rorl $6,%r13d - movl %r11d,%r9d - - andl %r15d,%edi - rorl $2,%r14d - addl %r13d,%r12d - - xorl %edi,%r9d - addl %r12d,%ebx - addl %r12d,%r9d - - leaq 4(%rbp),%rbp - movl 16(%rsp),%r13d - movl 4(%rsp),%edi - - movl %r13d,%r12d - rorl $11,%r13d - addl %r14d,%r9d - movl %edi,%r14d - rorl $2,%edi - - xorl %r12d,%r13d - shrl $3,%r12d - rorl $7,%r13d - xorl %r14d,%edi - shrl $10,%r14d - - rorl $17,%edi - xorl %r13d,%r12d - xorl %r14d,%edi - addl 48(%rsp),%r12d - - addl 12(%rsp),%r12d - movl %ebx,%r13d - addl %edi,%r12d - movl %r9d,%r14d - rorl $14,%r13d - movl %ecx,%edi - - xorl %ebx,%r13d - rorl $9,%r14d - xorl %edx,%edi - - movl %r12d,12(%rsp) - xorl %r9d,%r14d - andl %ebx,%edi - - rorl $5,%r13d - addl %r8d,%r12d - xorl %edx,%edi - - rorl $11,%r14d - xorl %ebx,%r13d - addl %edi,%r12d - - movl %r9d,%edi - addl (%rbp),%r12d - xorl %r9d,%r14d - - xorl %r10d,%edi - rorl $6,%r13d - movl %r10d,%r8d - - andl %edi,%r15d - rorl $2,%r14d - addl %r13d,%r12d - - xorl %r15d,%r8d - addl %r12d,%eax - addl %r12d,%r8d - - leaq 20(%rbp),%rbp - movl 20(%rsp),%r13d - movl 8(%rsp),%r15d - - movl %r13d,%r12d - rorl $11,%r13d - addl %r14d,%r8d - movl %r15d,%r14d - rorl $2,%r15d - - xorl %r12d,%r13d - shrl $3,%r12d - rorl $7,%r13d - xorl %r14d,%r15d - shrl $10,%r14d - - rorl $17,%r15d - xorl %r13d,%r12d - xorl %r14d,%r15d - addl 52(%rsp),%r12d - - addl 16(%rsp),%r12d - movl %eax,%r13d - addl %r15d,%r12d - movl %r8d,%r14d - rorl $14,%r13d - movl %ebx,%r15d - - xorl %eax,%r13d - rorl $9,%r14d - xorl %ecx,%r15d - - movl %r12d,16(%rsp) - xorl %r8d,%r14d - andl %eax,%r15d - - rorl $5,%r13d - addl %edx,%r12d - xorl %ecx,%r15d - - rorl $11,%r14d - xorl %eax,%r13d - addl %r15d,%r12d - - movl %r8d,%r15d - addl (%rbp),%r12d - xorl %r8d,%r14d - - xorl %r9d,%r15d - rorl $6,%r13d - movl %r9d,%edx - - andl %r15d,%edi - rorl $2,%r14d - addl %r13d,%r12d - - xorl %edi,%edx - addl %r12d,%r11d - addl %r12d,%edx - - leaq 4(%rbp),%rbp - movl 24(%rsp),%r13d - movl 12(%rsp),%edi - - movl %r13d,%r12d - rorl $11,%r13d - addl %r14d,%edx - movl %edi,%r14d - rorl $2,%edi - - xorl %r12d,%r13d - shrl $3,%r12d - rorl $7,%r13d - xorl %r14d,%edi - shrl $10,%r14d - - rorl $17,%edi - xorl %r13d,%r12d - xorl %r14d,%edi - addl 56(%rsp),%r12d - - addl 20(%rsp),%r12d - movl %r11d,%r13d - addl %edi,%r12d - movl %edx,%r14d - rorl $14,%r13d - movl %eax,%edi - - xorl %r11d,%r13d - rorl $9,%r14d - xorl %ebx,%edi - - movl %r12d,20(%rsp) - xorl %edx,%r14d - andl %r11d,%edi - - rorl $5,%r13d - addl %ecx,%r12d - xorl %ebx,%edi - - rorl $11,%r14d - xorl %r11d,%r13d - addl %edi,%r12d - - movl %edx,%edi - addl (%rbp),%r12d - xorl %edx,%r14d - - xorl %r8d,%edi - rorl $6,%r13d - movl %r8d,%ecx - - andl %edi,%r15d - rorl $2,%r14d - addl %r13d,%r12d - - xorl %r15d,%ecx - addl %r12d,%r10d - addl %r12d,%ecx - - leaq 4(%rbp),%rbp - movl 28(%rsp),%r13d - movl 16(%rsp),%r15d - - movl %r13d,%r12d - rorl $11,%r13d - addl %r14d,%ecx - movl %r15d,%r14d - rorl $2,%r15d - - xorl %r12d,%r13d - shrl $3,%r12d - rorl $7,%r13d - xorl %r14d,%r15d - shrl $10,%r14d - - rorl $17,%r15d - xorl %r13d,%r12d - xorl %r14d,%r15d - addl 60(%rsp),%r12d - - addl 24(%rsp),%r12d - movl %r10d,%r13d - addl %r15d,%r12d - movl %ecx,%r14d - rorl $14,%r13d - movl %r11d,%r15d - - xorl %r10d,%r13d - rorl $9,%r14d - xorl %eax,%r15d - - movl %r12d,24(%rsp) - xorl %ecx,%r14d - andl %r10d,%r15d - - rorl $5,%r13d - addl %ebx,%r12d - xorl %eax,%r15d - - rorl $11,%r14d - xorl %r10d,%r13d - addl %r15d,%r12d - - movl %ecx,%r15d - addl (%rbp),%r12d - xorl %ecx,%r14d - - xorl %edx,%r15d - rorl $6,%r13d - movl %edx,%ebx - - andl %r15d,%edi - rorl $2,%r14d - addl %r13d,%r12d - - xorl %edi,%ebx - addl %r12d,%r9d - addl %r12d,%ebx - - leaq 4(%rbp),%rbp - movl 32(%rsp),%r13d - movl 20(%rsp),%edi - - movl %r13d,%r12d - rorl $11,%r13d - addl %r14d,%ebx - movl %edi,%r14d - rorl $2,%edi - - xorl %r12d,%r13d - shrl $3,%r12d - rorl $7,%r13d - xorl %r14d,%edi - shrl $10,%r14d - - rorl $17,%edi - xorl %r13d,%r12d - xorl %r14d,%edi - addl 0(%rsp),%r12d - - addl 28(%rsp),%r12d - movl %r9d,%r13d - addl %edi,%r12d - movl %ebx,%r14d - rorl $14,%r13d - movl %r10d,%edi - - xorl %r9d,%r13d - rorl $9,%r14d - xorl %r11d,%edi - - movl %r12d,28(%rsp) - xorl %ebx,%r14d - andl %r9d,%edi - - rorl $5,%r13d - addl %eax,%r12d - xorl %r11d,%edi - - rorl $11,%r14d - xorl %r9d,%r13d - addl %edi,%r12d - - movl %ebx,%edi - addl (%rbp),%r12d - xorl %ebx,%r14d - - xorl %ecx,%edi - rorl $6,%r13d - movl %ecx,%eax - - andl %edi,%r15d - rorl $2,%r14d - addl %r13d,%r12d - - xorl %r15d,%eax - addl %r12d,%r8d - addl %r12d,%eax - - leaq 20(%rbp),%rbp - movl 36(%rsp),%r13d - movl 24(%rsp),%r15d - - movl %r13d,%r12d - rorl $11,%r13d - addl %r14d,%eax - movl %r15d,%r14d - rorl $2,%r15d - - xorl %r12d,%r13d - shrl $3,%r12d - rorl $7,%r13d - xorl %r14d,%r15d - shrl $10,%r14d - - rorl $17,%r15d - xorl %r13d,%r12d - xorl %r14d,%r15d - addl 4(%rsp),%r12d - - addl 32(%rsp),%r12d - movl %r8d,%r13d - addl %r15d,%r12d - movl %eax,%r14d - rorl $14,%r13d - movl %r9d,%r15d - - xorl %r8d,%r13d - rorl $9,%r14d - xorl %r10d,%r15d - - movl %r12d,32(%rsp) - xorl %eax,%r14d - andl %r8d,%r15d - - rorl $5,%r13d - addl %r11d,%r12d - xorl %r10d,%r15d - - rorl $11,%r14d - xorl %r8d,%r13d - addl %r15d,%r12d - - movl %eax,%r15d - addl (%rbp),%r12d - xorl %eax,%r14d - - xorl %ebx,%r15d - rorl $6,%r13d - movl %ebx,%r11d - - andl %r15d,%edi - rorl $2,%r14d - addl %r13d,%r12d - - xorl %edi,%r11d - addl %r12d,%edx - addl %r12d,%r11d - - leaq 4(%rbp),%rbp - movl 40(%rsp),%r13d - movl 28(%rsp),%edi - - movl %r13d,%r12d - rorl $11,%r13d - addl %r14d,%r11d - movl %edi,%r14d - rorl $2,%edi - - xorl %r12d,%r13d - shrl $3,%r12d - rorl $7,%r13d - xorl %r14d,%edi - shrl $10,%r14d - - rorl $17,%edi - xorl %r13d,%r12d - xorl %r14d,%edi - addl 8(%rsp),%r12d - - addl 36(%rsp),%r12d - movl %edx,%r13d - addl %edi,%r12d - movl %r11d,%r14d - rorl $14,%r13d - movl %r8d,%edi - - xorl %edx,%r13d - rorl $9,%r14d - xorl %r9d,%edi - - movl %r12d,36(%rsp) - xorl %r11d,%r14d - andl %edx,%edi - - rorl $5,%r13d - addl %r10d,%r12d - xorl %r9d,%edi - - rorl $11,%r14d - xorl %edx,%r13d - addl %edi,%r12d - - movl %r11d,%edi - addl (%rbp),%r12d - xorl %r11d,%r14d - - xorl %eax,%edi - rorl $6,%r13d - movl %eax,%r10d - - andl %edi,%r15d - rorl $2,%r14d - addl %r13d,%r12d - - xorl %r15d,%r10d - addl %r12d,%ecx - addl %r12d,%r10d - - leaq 4(%rbp),%rbp - movl 44(%rsp),%r13d - movl 32(%rsp),%r15d - - movl %r13d,%r12d - rorl $11,%r13d - addl %r14d,%r10d - movl %r15d,%r14d - rorl $2,%r15d - - xorl %r12d,%r13d - shrl $3,%r12d - rorl $7,%r13d - xorl %r14d,%r15d - shrl $10,%r14d - - rorl $17,%r15d - xorl %r13d,%r12d - xorl %r14d,%r15d - addl 12(%rsp),%r12d - - addl 40(%rsp),%r12d - movl %ecx,%r13d - addl %r15d,%r12d - movl %r10d,%r14d - rorl $14,%r13d - movl %edx,%r15d - - xorl %ecx,%r13d - rorl $9,%r14d - xorl %r8d,%r15d - - movl %r12d,40(%rsp) - xorl %r10d,%r14d - andl %ecx,%r15d - - rorl $5,%r13d - addl %r9d,%r12d - xorl %r8d,%r15d - - rorl $11,%r14d - xorl %ecx,%r13d - addl %r15d,%r12d - - movl %r10d,%r15d - addl (%rbp),%r12d - xorl %r10d,%r14d - - xorl %r11d,%r15d - rorl $6,%r13d - movl %r11d,%r9d - - andl %r15d,%edi - rorl $2,%r14d - addl %r13d,%r12d - - xorl %edi,%r9d - addl %r12d,%ebx - addl %r12d,%r9d - - leaq 4(%rbp),%rbp - movl 48(%rsp),%r13d - movl 36(%rsp),%edi - - movl %r13d,%r12d - rorl $11,%r13d - addl %r14d,%r9d - movl %edi,%r14d - rorl $2,%edi - - xorl %r12d,%r13d - shrl $3,%r12d - rorl $7,%r13d - xorl %r14d,%edi - shrl $10,%r14d - - rorl $17,%edi - xorl %r13d,%r12d - xorl %r14d,%edi - addl 16(%rsp),%r12d - - addl 44(%rsp),%r12d - movl %ebx,%r13d - addl %edi,%r12d - movl %r9d,%r14d - rorl $14,%r13d - movl %ecx,%edi - - xorl %ebx,%r13d - rorl $9,%r14d - xorl %edx,%edi - - movl %r12d,44(%rsp) - xorl %r9d,%r14d - andl %ebx,%edi - - rorl $5,%r13d - addl %r8d,%r12d - xorl %edx,%edi - - rorl $11,%r14d - xorl %ebx,%r13d - addl %edi,%r12d - - movl %r9d,%edi - addl (%rbp),%r12d - xorl %r9d,%r14d - - xorl %r10d,%edi - rorl $6,%r13d - movl %r10d,%r8d - - andl %edi,%r15d - rorl $2,%r14d - addl %r13d,%r12d - - xorl %r15d,%r8d - addl %r12d,%eax - addl %r12d,%r8d - - leaq 20(%rbp),%rbp - movl 52(%rsp),%r13d - movl 40(%rsp),%r15d - - movl %r13d,%r12d - rorl $11,%r13d - addl %r14d,%r8d - movl %r15d,%r14d - rorl $2,%r15d - - xorl %r12d,%r13d - shrl $3,%r12d - rorl $7,%r13d - xorl %r14d,%r15d - shrl $10,%r14d - - rorl $17,%r15d - xorl %r13d,%r12d - xorl %r14d,%r15d - addl 20(%rsp),%r12d - - addl 48(%rsp),%r12d - movl %eax,%r13d - addl %r15d,%r12d - movl %r8d,%r14d - rorl $14,%r13d - movl %ebx,%r15d - - xorl %eax,%r13d - rorl $9,%r14d - xorl %ecx,%r15d - - movl %r12d,48(%rsp) - xorl %r8d,%r14d - andl %eax,%r15d - - rorl $5,%r13d - addl %edx,%r12d - xorl %ecx,%r15d - - rorl $11,%r14d - xorl %eax,%r13d - addl %r15d,%r12d - - movl %r8d,%r15d - addl (%rbp),%r12d - xorl %r8d,%r14d - - xorl %r9d,%r15d - rorl $6,%r13d - movl %r9d,%edx - - andl %r15d,%edi - rorl $2,%r14d - addl %r13d,%r12d - - xorl %edi,%edx - addl %r12d,%r11d - addl %r12d,%edx - - leaq 4(%rbp),%rbp - movl 56(%rsp),%r13d - movl 44(%rsp),%edi - - movl %r13d,%r12d - rorl $11,%r13d - addl %r14d,%edx - movl %edi,%r14d - rorl $2,%edi - - xorl %r12d,%r13d - shrl $3,%r12d - rorl $7,%r13d - xorl %r14d,%edi - shrl $10,%r14d - - rorl $17,%edi - xorl %r13d,%r12d - xorl %r14d,%edi - addl 24(%rsp),%r12d - - addl 52(%rsp),%r12d - movl %r11d,%r13d - addl %edi,%r12d - movl %edx,%r14d - rorl $14,%r13d - movl %eax,%edi - - xorl %r11d,%r13d - rorl $9,%r14d - xorl %ebx,%edi - - movl %r12d,52(%rsp) - xorl %edx,%r14d - andl %r11d,%edi - - rorl $5,%r13d - addl %ecx,%r12d - xorl %ebx,%edi - - rorl $11,%r14d - xorl %r11d,%r13d - addl %edi,%r12d - - movl %edx,%edi - addl (%rbp),%r12d - xorl %edx,%r14d - - xorl %r8d,%edi - rorl $6,%r13d - movl %r8d,%ecx - - andl %edi,%r15d - rorl $2,%r14d - addl %r13d,%r12d - - xorl %r15d,%ecx - addl %r12d,%r10d - addl %r12d,%ecx - - leaq 4(%rbp),%rbp - movl 60(%rsp),%r13d - movl 48(%rsp),%r15d - - movl %r13d,%r12d - rorl $11,%r13d - addl %r14d,%ecx - movl %r15d,%r14d - rorl $2,%r15d - - xorl %r12d,%r13d - shrl $3,%r12d - rorl $7,%r13d - xorl %r14d,%r15d - shrl $10,%r14d - - rorl $17,%r15d - xorl %r13d,%r12d - xorl %r14d,%r15d - addl 28(%rsp),%r12d - - addl 56(%rsp),%r12d - movl %r10d,%r13d - addl %r15d,%r12d - movl %ecx,%r14d - rorl $14,%r13d - movl %r11d,%r15d - - xorl %r10d,%r13d - rorl $9,%r14d - xorl %eax,%r15d - - movl %r12d,56(%rsp) - xorl %ecx,%r14d - andl %r10d,%r15d - - rorl $5,%r13d - addl %ebx,%r12d - xorl %eax,%r15d - - rorl $11,%r14d - xorl %r10d,%r13d - addl %r15d,%r12d - - movl %ecx,%r15d - addl (%rbp),%r12d - xorl %ecx,%r14d - - xorl %edx,%r15d - rorl $6,%r13d - movl %edx,%ebx - - andl %r15d,%edi - rorl $2,%r14d - addl %r13d,%r12d - - xorl %edi,%ebx - addl %r12d,%r9d - addl %r12d,%ebx - - leaq 4(%rbp),%rbp - movl 0(%rsp),%r13d - movl 52(%rsp),%edi - - movl %r13d,%r12d - rorl $11,%r13d - addl %r14d,%ebx - movl %edi,%r14d - rorl $2,%edi - - xorl %r12d,%r13d - shrl $3,%r12d - rorl $7,%r13d - xorl %r14d,%edi - shrl $10,%r14d - - rorl $17,%edi - xorl %r13d,%r12d - xorl %r14d,%edi - addl 32(%rsp),%r12d - - addl 60(%rsp),%r12d - movl %r9d,%r13d - addl %edi,%r12d - movl %ebx,%r14d - rorl $14,%r13d - movl %r10d,%edi - - xorl %r9d,%r13d - rorl $9,%r14d - xorl %r11d,%edi - - movl %r12d,60(%rsp) - xorl %ebx,%r14d - andl %r9d,%edi - - rorl $5,%r13d - addl %eax,%r12d - xorl %r11d,%edi - - rorl $11,%r14d - xorl %r9d,%r13d - addl %edi,%r12d - - movl %ebx,%edi - addl (%rbp),%r12d - xorl %ebx,%r14d - - xorl %ecx,%edi - rorl $6,%r13d - movl %ecx,%eax - - andl %edi,%r15d - rorl $2,%r14d - addl %r13d,%r12d - - xorl %r15d,%eax - addl %r12d,%r8d - addl %r12d,%eax - - leaq 20(%rbp),%rbp - cmpb $0,3(%rbp) - jnz .Lrounds_16_xx - - movq 64+0(%rsp),%rdi - addl %r14d,%eax - leaq 64(%rsi),%rsi - - addl 0(%rdi),%eax - addl 4(%rdi),%ebx - addl 8(%rdi),%ecx - addl 12(%rdi),%edx - addl 16(%rdi),%r8d - addl 20(%rdi),%r9d - addl 24(%rdi),%r10d - addl 28(%rdi),%r11d - - cmpq 64+16(%rsp),%rsi - - movl %eax,0(%rdi) - movl %ebx,4(%rdi) - movl %ecx,8(%rdi) - movl %edx,12(%rdi) - movl %r8d,16(%rdi) - movl %r9d,20(%rdi) - movl %r10d,24(%rdi) - movl %r11d,28(%rdi) - jb .Lloop - - movq 88(%rsp),%rsi -.cfi_def_cfa %rsi,8 - movq -48(%rsi),%r15 -.cfi_restore %r15 - movq -40(%rsi),%r14 -.cfi_restore %r14 - movq -32(%rsi),%r13 -.cfi_restore %r13 - movq -24(%rsi),%r12 -.cfi_restore %r12 - movq -16(%rsi),%rbp -.cfi_restore %rbp - movq -8(%rsi),%rbx -.cfi_restore %rbx - leaq (%rsi),%rsp -.cfi_def_cfa_register %rsp -.Lepilogue: - .byte 0xf3,0xc3 -.cfi_endproc -.size GFp_sha256_block_data_order,.-GFp_sha256_block_data_order -.align 64 -.type K256,@object -K256: -.long 0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5 -.long 0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5 -.long 0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5 -.long 0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5 -.long 0xd807aa98,0x12835b01,0x243185be,0x550c7dc3 -.long 0xd807aa98,0x12835b01,0x243185be,0x550c7dc3 -.long 0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174 -.long 0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174 -.long 0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc -.long 0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc -.long 0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da -.long 0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da -.long 0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7 -.long 0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7 -.long 0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967 -.long 0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967 -.long 0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13 -.long 0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13 -.long 0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85 -.long 0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85 -.long 0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3 -.long 0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3 -.long 0xd192e819,0xd6990624,0xf40e3585,0x106aa070 -.long 0xd192e819,0xd6990624,0xf40e3585,0x106aa070 -.long 0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5 -.long 0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5 -.long 0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3 -.long 0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3 -.long 0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208 -.long 0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208 -.long 0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2 -.long 0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2 - -.long 0x00010203,0x04050607,0x08090a0b,0x0c0d0e0f -.long 0x00010203,0x04050607,0x08090a0b,0x0c0d0e0f -.long 0x03020100,0x0b0a0908,0xffffffff,0xffffffff -.long 0x03020100,0x0b0a0908,0xffffffff,0xffffffff -.long 0xffffffff,0xffffffff,0x03020100,0x0b0a0908 -.long 0xffffffff,0xffffffff,0x03020100,0x0b0a0908 -.byte 83,72,65,50,53,54,32,98,108,111,99,107,32,116,114,97,110,115,102,111,114,109,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 -.type GFp_sha256_block_data_order_ssse3,@function -.align 64 -GFp_sha256_block_data_order_ssse3: -.cfi_startproc -.Lssse3_shortcut: - movq %rsp,%rax -.cfi_def_cfa_register %rax - pushq %rbx -.cfi_offset %rbx,-16 - pushq %rbp -.cfi_offset %rbp,-24 - pushq %r12 -.cfi_offset %r12,-32 - pushq %r13 -.cfi_offset %r13,-40 - pushq %r14 -.cfi_offset %r14,-48 - pushq %r15 -.cfi_offset %r15,-56 - shlq $4,%rdx - subq $96,%rsp - leaq (%rsi,%rdx,4),%rdx - andq $-64,%rsp - movq %rdi,64+0(%rsp) - movq %rsi,64+8(%rsp) - movq %rdx,64+16(%rsp) - movq %rax,88(%rsp) -.cfi_escape 0x0f,0x06,0x77,0xd8,0x00,0x06,0x23,0x08 -.Lprologue_ssse3: - - movl 0(%rdi),%eax - movl 4(%rdi),%ebx - movl 8(%rdi),%ecx - movl 12(%rdi),%edx - movl 16(%rdi),%r8d - movl 20(%rdi),%r9d - movl 24(%rdi),%r10d - movl 28(%rdi),%r11d - - - jmp .Lloop_ssse3 -.align 16 -.Lloop_ssse3: - movdqa K256+512(%rip),%xmm7 - movdqu 0(%rsi),%xmm0 - movdqu 16(%rsi),%xmm1 - movdqu 32(%rsi),%xmm2 -.byte 102,15,56,0,199 - movdqu 48(%rsi),%xmm3 - leaq K256(%rip),%rbp -.byte 102,15,56,0,207 - movdqa 0(%rbp),%xmm4 - movdqa 32(%rbp),%xmm5 -.byte 102,15,56,0,215 - paddd %xmm0,%xmm4 - movdqa 64(%rbp),%xmm6 -.byte 102,15,56,0,223 - movdqa 96(%rbp),%xmm7 - paddd %xmm1,%xmm5 - paddd %xmm2,%xmm6 - paddd %xmm3,%xmm7 - movdqa %xmm4,0(%rsp) - movl %eax,%r14d - movdqa %xmm5,16(%rsp) - movl %ebx,%edi - movdqa %xmm6,32(%rsp) - xorl %ecx,%edi - movdqa %xmm7,48(%rsp) - movl %r8d,%r13d - jmp .Lssse3_00_47 - -.align 16 -.Lssse3_00_47: - subq $-128,%rbp - rorl $14,%r13d - movdqa %xmm1,%xmm4 - movl %r14d,%eax - movl %r9d,%r12d - movdqa %xmm3,%xmm7 - rorl $9,%r14d - xorl %r8d,%r13d - xorl %r10d,%r12d - rorl $5,%r13d - xorl %eax,%r14d -.byte 102,15,58,15,224,4 - andl %r8d,%r12d - xorl %r8d,%r13d -.byte 102,15,58,15,250,4 - addl 0(%rsp),%r11d - movl %eax,%r15d - xorl %r10d,%r12d - rorl $11,%r14d - movdqa %xmm4,%xmm5 - xorl %ebx,%r15d - addl %r12d,%r11d - movdqa %xmm4,%xmm6 - rorl $6,%r13d - andl %r15d,%edi - psrld $3,%xmm4 - xorl %eax,%r14d - addl %r13d,%r11d - xorl %ebx,%edi - paddd %xmm7,%xmm0 - rorl $2,%r14d - addl %r11d,%edx - psrld $7,%xmm6 - addl %edi,%r11d - movl %edx,%r13d - pshufd $250,%xmm3,%xmm7 - addl %r11d,%r14d - rorl $14,%r13d - pslld $14,%xmm5 - movl %r14d,%r11d - movl %r8d,%r12d - pxor %xmm6,%xmm4 - rorl $9,%r14d - xorl %edx,%r13d - xorl %r9d,%r12d - rorl $5,%r13d - psrld $11,%xmm6 - xorl %r11d,%r14d - pxor %xmm5,%xmm4 - andl %edx,%r12d - xorl %edx,%r13d - pslld $11,%xmm5 - addl 4(%rsp),%r10d - movl %r11d,%edi - pxor %xmm6,%xmm4 - xorl %r9d,%r12d - rorl $11,%r14d - movdqa %xmm7,%xmm6 - xorl %eax,%edi - addl %r12d,%r10d - pxor %xmm5,%xmm4 - rorl $6,%r13d - andl %edi,%r15d - xorl %r11d,%r14d - psrld $10,%xmm7 - addl %r13d,%r10d - xorl %eax,%r15d - paddd %xmm4,%xmm0 - rorl $2,%r14d - addl %r10d,%ecx - psrlq $17,%xmm6 - addl %r15d,%r10d - movl %ecx,%r13d - addl %r10d,%r14d - pxor %xmm6,%xmm7 - rorl $14,%r13d - movl %r14d,%r10d - movl %edx,%r12d - rorl $9,%r14d - psrlq $2,%xmm6 - xorl %ecx,%r13d - xorl %r8d,%r12d - pxor %xmm6,%xmm7 - rorl $5,%r13d - xorl %r10d,%r14d - andl %ecx,%r12d - pshufd $128,%xmm7,%xmm7 - xorl %ecx,%r13d - addl 8(%rsp),%r9d - movl %r10d,%r15d - psrldq $8,%xmm7 - xorl %r8d,%r12d - rorl $11,%r14d - xorl %r11d,%r15d - addl %r12d,%r9d - rorl $6,%r13d - paddd %xmm7,%xmm0 - andl %r15d,%edi - xorl %r10d,%r14d - addl %r13d,%r9d - pshufd $80,%xmm0,%xmm7 - xorl %r11d,%edi - rorl $2,%r14d - addl %r9d,%ebx - movdqa %xmm7,%xmm6 - addl %edi,%r9d - movl %ebx,%r13d - psrld $10,%xmm7 - addl %r9d,%r14d - rorl $14,%r13d - psrlq $17,%xmm6 - movl %r14d,%r9d - movl %ecx,%r12d - pxor %xmm6,%xmm7 - rorl $9,%r14d - xorl %ebx,%r13d - xorl %edx,%r12d - rorl $5,%r13d - xorl %r9d,%r14d - psrlq $2,%xmm6 - andl %ebx,%r12d - xorl %ebx,%r13d - addl 12(%rsp),%r8d - pxor %xmm6,%xmm7 - movl %r9d,%edi - xorl %edx,%r12d - rorl $11,%r14d - pshufd $8,%xmm7,%xmm7 - xorl %r10d,%edi - addl %r12d,%r8d - movdqa 0(%rbp),%xmm6 - rorl $6,%r13d - andl %edi,%r15d - pslldq $8,%xmm7 - xorl %r9d,%r14d - addl %r13d,%r8d - xorl %r10d,%r15d - paddd %xmm7,%xmm0 - rorl $2,%r14d - addl %r8d,%eax - addl %r15d,%r8d - paddd %xmm0,%xmm6 - movl %eax,%r13d - addl %r8d,%r14d - movdqa %xmm6,0(%rsp) - rorl $14,%r13d - movdqa %xmm2,%xmm4 - movl %r14d,%r8d - movl %ebx,%r12d - movdqa %xmm0,%xmm7 - rorl $9,%r14d - xorl %eax,%r13d - xorl %ecx,%r12d - rorl $5,%r13d - xorl %r8d,%r14d -.byte 102,15,58,15,225,4 - andl %eax,%r12d - xorl %eax,%r13d -.byte 102,15,58,15,251,4 - addl 16(%rsp),%edx - movl %r8d,%r15d - xorl %ecx,%r12d - rorl $11,%r14d - movdqa %xmm4,%xmm5 - xorl %r9d,%r15d - addl %r12d,%edx - movdqa %xmm4,%xmm6 - rorl $6,%r13d - andl %r15d,%edi - psrld $3,%xmm4 - xorl %r8d,%r14d - addl %r13d,%edx - xorl %r9d,%edi - paddd %xmm7,%xmm1 - rorl $2,%r14d - addl %edx,%r11d - psrld $7,%xmm6 - addl %edi,%edx - movl %r11d,%r13d - pshufd $250,%xmm0,%xmm7 - addl %edx,%r14d - rorl $14,%r13d - pslld $14,%xmm5 - movl %r14d,%edx - movl %eax,%r12d - pxor %xmm6,%xmm4 - rorl $9,%r14d - xorl %r11d,%r13d - xorl %ebx,%r12d - rorl $5,%r13d - psrld $11,%xmm6 - xorl %edx,%r14d - pxor %xmm5,%xmm4 - andl %r11d,%r12d - xorl %r11d,%r13d - pslld $11,%xmm5 - addl 20(%rsp),%ecx - movl %edx,%edi - pxor %xmm6,%xmm4 - xorl %ebx,%r12d - rorl $11,%r14d - movdqa %xmm7,%xmm6 - xorl %r8d,%edi - addl %r12d,%ecx - pxor %xmm5,%xmm4 - rorl $6,%r13d - andl %edi,%r15d - xorl %edx,%r14d - psrld $10,%xmm7 - addl %r13d,%ecx - xorl %r8d,%r15d - paddd %xmm4,%xmm1 - rorl $2,%r14d - addl %ecx,%r10d - psrlq $17,%xmm6 - addl %r15d,%ecx - movl %r10d,%r13d - addl %ecx,%r14d - pxor %xmm6,%xmm7 - rorl $14,%r13d - movl %r14d,%ecx - movl %r11d,%r12d - rorl $9,%r14d - psrlq $2,%xmm6 - xorl %r10d,%r13d - xorl %eax,%r12d - pxor %xmm6,%xmm7 - rorl $5,%r13d - xorl %ecx,%r14d - andl %r10d,%r12d - pshufd $128,%xmm7,%xmm7 - xorl %r10d,%r13d - addl 24(%rsp),%ebx - movl %ecx,%r15d - psrldq $8,%xmm7 - xorl %eax,%r12d - rorl $11,%r14d - xorl %edx,%r15d - addl %r12d,%ebx - rorl $6,%r13d - paddd %xmm7,%xmm1 - andl %r15d,%edi - xorl %ecx,%r14d - addl %r13d,%ebx - pshufd $80,%xmm1,%xmm7 - xorl %edx,%edi - rorl $2,%r14d - addl %ebx,%r9d - movdqa %xmm7,%xmm6 - addl %edi,%ebx - movl %r9d,%r13d - psrld $10,%xmm7 - addl %ebx,%r14d - rorl $14,%r13d - psrlq $17,%xmm6 - movl %r14d,%ebx - movl %r10d,%r12d - pxor %xmm6,%xmm7 - rorl $9,%r14d - xorl %r9d,%r13d - xorl %r11d,%r12d - rorl $5,%r13d - xorl %ebx,%r14d - psrlq $2,%xmm6 - andl %r9d,%r12d - xorl %r9d,%r13d - addl 28(%rsp),%eax - pxor %xmm6,%xmm7 - movl %ebx,%edi - xorl %r11d,%r12d - rorl $11,%r14d - pshufd $8,%xmm7,%xmm7 - xorl %ecx,%edi - addl %r12d,%eax - movdqa 32(%rbp),%xmm6 - rorl $6,%r13d - andl %edi,%r15d - pslldq $8,%xmm7 - xorl %ebx,%r14d - addl %r13d,%eax - xorl %ecx,%r15d - paddd %xmm7,%xmm1 - rorl $2,%r14d - addl %eax,%r8d - addl %r15d,%eax - paddd %xmm1,%xmm6 - movl %r8d,%r13d - addl %eax,%r14d - movdqa %xmm6,16(%rsp) - rorl $14,%r13d - movdqa %xmm3,%xmm4 - movl %r14d,%eax - movl %r9d,%r12d - movdqa %xmm1,%xmm7 - rorl $9,%r14d - xorl %r8d,%r13d - xorl %r10d,%r12d - rorl $5,%r13d - xorl %eax,%r14d -.byte 102,15,58,15,226,4 - andl %r8d,%r12d - xorl %r8d,%r13d -.byte 102,15,58,15,248,4 - addl 32(%rsp),%r11d - movl %eax,%r15d - xorl %r10d,%r12d - rorl $11,%r14d - movdqa %xmm4,%xmm5 - xorl %ebx,%r15d - addl %r12d,%r11d - movdqa %xmm4,%xmm6 - rorl $6,%r13d - andl %r15d,%edi - psrld $3,%xmm4 - xorl %eax,%r14d - addl %r13d,%r11d - xorl %ebx,%edi - paddd %xmm7,%xmm2 - rorl $2,%r14d - addl %r11d,%edx - psrld $7,%xmm6 - addl %edi,%r11d - movl %edx,%r13d - pshufd $250,%xmm1,%xmm7 - addl %r11d,%r14d - rorl $14,%r13d - pslld $14,%xmm5 - movl %r14d,%r11d - movl %r8d,%r12d - pxor %xmm6,%xmm4 - rorl $9,%r14d - xorl %edx,%r13d - xorl %r9d,%r12d - rorl $5,%r13d - psrld $11,%xmm6 - xorl %r11d,%r14d - pxor %xmm5,%xmm4 - andl %edx,%r12d - xorl %edx,%r13d - pslld $11,%xmm5 - addl 36(%rsp),%r10d - movl %r11d,%edi - pxor %xmm6,%xmm4 - xorl %r9d,%r12d - rorl $11,%r14d - movdqa %xmm7,%xmm6 - xorl %eax,%edi - addl %r12d,%r10d - pxor %xmm5,%xmm4 - rorl $6,%r13d - andl %edi,%r15d - xorl %r11d,%r14d - psrld $10,%xmm7 - addl %r13d,%r10d - xorl %eax,%r15d - paddd %xmm4,%xmm2 - rorl $2,%r14d - addl %r10d,%ecx - psrlq $17,%xmm6 - addl %r15d,%r10d - movl %ecx,%r13d - addl %r10d,%r14d - pxor %xmm6,%xmm7 - rorl $14,%r13d - movl %r14d,%r10d - movl %edx,%r12d - rorl $9,%r14d - psrlq $2,%xmm6 - xorl %ecx,%r13d - xorl %r8d,%r12d - pxor %xmm6,%xmm7 - rorl $5,%r13d - xorl %r10d,%r14d - andl %ecx,%r12d - pshufd $128,%xmm7,%xmm7 - xorl %ecx,%r13d - addl 40(%rsp),%r9d - movl %r10d,%r15d - psrldq $8,%xmm7 - xorl %r8d,%r12d - rorl $11,%r14d - xorl %r11d,%r15d - addl %r12d,%r9d - rorl $6,%r13d - paddd %xmm7,%xmm2 - andl %r15d,%edi - xorl %r10d,%r14d - addl %r13d,%r9d - pshufd $80,%xmm2,%xmm7 - xorl %r11d,%edi - rorl $2,%r14d - addl %r9d,%ebx - movdqa %xmm7,%xmm6 - addl %edi,%r9d - movl %ebx,%r13d - psrld $10,%xmm7 - addl %r9d,%r14d - rorl $14,%r13d - psrlq $17,%xmm6 - movl %r14d,%r9d - movl %ecx,%r12d - pxor %xmm6,%xmm7 - rorl $9,%r14d - xorl %ebx,%r13d - xorl %edx,%r12d - rorl $5,%r13d - xorl %r9d,%r14d - psrlq $2,%xmm6 - andl %ebx,%r12d - xorl %ebx,%r13d - addl 44(%rsp),%r8d - pxor %xmm6,%xmm7 - movl %r9d,%edi - xorl %edx,%r12d - rorl $11,%r14d - pshufd $8,%xmm7,%xmm7 - xorl %r10d,%edi - addl %r12d,%r8d - movdqa 64(%rbp),%xmm6 - rorl $6,%r13d - andl %edi,%r15d - pslldq $8,%xmm7 - xorl %r9d,%r14d - addl %r13d,%r8d - xorl %r10d,%r15d - paddd %xmm7,%xmm2 - rorl $2,%r14d - addl %r8d,%eax - addl %r15d,%r8d - paddd %xmm2,%xmm6 - movl %eax,%r13d - addl %r8d,%r14d - movdqa %xmm6,32(%rsp) - rorl $14,%r13d - movdqa %xmm0,%xmm4 - movl %r14d,%r8d - movl %ebx,%r12d - movdqa %xmm2,%xmm7 - rorl $9,%r14d - xorl %eax,%r13d - xorl %ecx,%r12d - rorl $5,%r13d - xorl %r8d,%r14d -.byte 102,15,58,15,227,4 - andl %eax,%r12d - xorl %eax,%r13d -.byte 102,15,58,15,249,4 - addl 48(%rsp),%edx - movl %r8d,%r15d - xorl %ecx,%r12d - rorl $11,%r14d - movdqa %xmm4,%xmm5 - xorl %r9d,%r15d - addl %r12d,%edx - movdqa %xmm4,%xmm6 - rorl $6,%r13d - andl %r15d,%edi - psrld $3,%xmm4 - xorl %r8d,%r14d - addl %r13d,%edx - xorl %r9d,%edi - paddd %xmm7,%xmm3 - rorl $2,%r14d - addl %edx,%r11d - psrld $7,%xmm6 - addl %edi,%edx - movl %r11d,%r13d - pshufd $250,%xmm2,%xmm7 - addl %edx,%r14d - rorl $14,%r13d - pslld $14,%xmm5 - movl %r14d,%edx - movl %eax,%r12d - pxor %xmm6,%xmm4 - rorl $9,%r14d - xorl %r11d,%r13d - xorl %ebx,%r12d - rorl $5,%r13d - psrld $11,%xmm6 - xorl %edx,%r14d - pxor %xmm5,%xmm4 - andl %r11d,%r12d - xorl %r11d,%r13d - pslld $11,%xmm5 - addl 52(%rsp),%ecx - movl %edx,%edi - pxor %xmm6,%xmm4 - xorl %ebx,%r12d - rorl $11,%r14d - movdqa %xmm7,%xmm6 - xorl %r8d,%edi - addl %r12d,%ecx - pxor %xmm5,%xmm4 - rorl $6,%r13d - andl %edi,%r15d - xorl %edx,%r14d - psrld $10,%xmm7 - addl %r13d,%ecx - xorl %r8d,%r15d - paddd %xmm4,%xmm3 - rorl $2,%r14d - addl %ecx,%r10d - psrlq $17,%xmm6 - addl %r15d,%ecx - movl %r10d,%r13d - addl %ecx,%r14d - pxor %xmm6,%xmm7 - rorl $14,%r13d - movl %r14d,%ecx - movl %r11d,%r12d - rorl $9,%r14d - psrlq $2,%xmm6 - xorl %r10d,%r13d - xorl %eax,%r12d - pxor %xmm6,%xmm7 - rorl $5,%r13d - xorl %ecx,%r14d - andl %r10d,%r12d - pshufd $128,%xmm7,%xmm7 - xorl %r10d,%r13d - addl 56(%rsp),%ebx - movl %ecx,%r15d - psrldq $8,%xmm7 - xorl %eax,%r12d - rorl $11,%r14d - xorl %edx,%r15d - addl %r12d,%ebx - rorl $6,%r13d - paddd %xmm7,%xmm3 - andl %r15d,%edi - xorl %ecx,%r14d - addl %r13d,%ebx - pshufd $80,%xmm3,%xmm7 - xorl %edx,%edi - rorl $2,%r14d - addl %ebx,%r9d - movdqa %xmm7,%xmm6 - addl %edi,%ebx - movl %r9d,%r13d - psrld $10,%xmm7 - addl %ebx,%r14d - rorl $14,%r13d - psrlq $17,%xmm6 - movl %r14d,%ebx - movl %r10d,%r12d - pxor %xmm6,%xmm7 - rorl $9,%r14d - xorl %r9d,%r13d - xorl %r11d,%r12d - rorl $5,%r13d - xorl %ebx,%r14d - psrlq $2,%xmm6 - andl %r9d,%r12d - xorl %r9d,%r13d - addl 60(%rsp),%eax - pxor %xmm6,%xmm7 - movl %ebx,%edi - xorl %r11d,%r12d - rorl $11,%r14d - pshufd $8,%xmm7,%xmm7 - xorl %ecx,%edi - addl %r12d,%eax - movdqa 96(%rbp),%xmm6 - rorl $6,%r13d - andl %edi,%r15d - pslldq $8,%xmm7 - xorl %ebx,%r14d - addl %r13d,%eax - xorl %ecx,%r15d - paddd %xmm7,%xmm3 - rorl $2,%r14d - addl %eax,%r8d - addl %r15d,%eax - paddd %xmm3,%xmm6 - movl %r8d,%r13d - addl %eax,%r14d - movdqa %xmm6,48(%rsp) - cmpb $0,131(%rbp) - jne .Lssse3_00_47 - rorl $14,%r13d - movl %r14d,%eax - movl %r9d,%r12d - rorl $9,%r14d - xorl %r8d,%r13d - xorl %r10d,%r12d - rorl $5,%r13d - xorl %eax,%r14d - andl %r8d,%r12d - xorl %r8d,%r13d - addl 0(%rsp),%r11d - movl %eax,%r15d - xorl %r10d,%r12d - rorl $11,%r14d - xorl %ebx,%r15d - addl %r12d,%r11d - rorl $6,%r13d - andl %r15d,%edi - xorl %eax,%r14d - addl %r13d,%r11d - xorl %ebx,%edi - rorl $2,%r14d - addl %r11d,%edx - addl %edi,%r11d - movl %edx,%r13d - addl %r11d,%r14d - rorl $14,%r13d - movl %r14d,%r11d - movl %r8d,%r12d - rorl $9,%r14d - xorl %edx,%r13d - xorl %r9d,%r12d - rorl $5,%r13d - xorl %r11d,%r14d - andl %edx,%r12d - xorl %edx,%r13d - addl 4(%rsp),%r10d - movl %r11d,%edi - xorl %r9d,%r12d - rorl $11,%r14d - xorl %eax,%edi - addl %r12d,%r10d - rorl $6,%r13d - andl %edi,%r15d - xorl %r11d,%r14d - addl %r13d,%r10d - xorl %eax,%r15d - rorl $2,%r14d - addl %r10d,%ecx - addl %r15d,%r10d - movl %ecx,%r13d - addl %r10d,%r14d - rorl $14,%r13d - movl %r14d,%r10d - movl %edx,%r12d - rorl $9,%r14d - xorl %ecx,%r13d - xorl %r8d,%r12d - rorl $5,%r13d - xorl %r10d,%r14d - andl %ecx,%r12d - xorl %ecx,%r13d - addl 8(%rsp),%r9d - movl %r10d,%r15d - xorl %r8d,%r12d - rorl $11,%r14d - xorl %r11d,%r15d - addl %r12d,%r9d - rorl $6,%r13d - andl %r15d,%edi - xorl %r10d,%r14d - addl %r13d,%r9d - xorl %r11d,%edi - rorl $2,%r14d - addl %r9d,%ebx - addl %edi,%r9d - movl %ebx,%r13d - addl %r9d,%r14d - rorl $14,%r13d - movl %r14d,%r9d - movl %ecx,%r12d - rorl $9,%r14d - xorl %ebx,%r13d - xorl %edx,%r12d - rorl $5,%r13d - xorl %r9d,%r14d - andl %ebx,%r12d - xorl %ebx,%r13d - addl 12(%rsp),%r8d - movl %r9d,%edi - xorl %edx,%r12d - rorl $11,%r14d - xorl %r10d,%edi - addl %r12d,%r8d - rorl $6,%r13d - andl %edi,%r15d - xorl %r9d,%r14d - addl %r13d,%r8d - xorl %r10d,%r15d - rorl $2,%r14d - addl %r8d,%eax - addl %r15d,%r8d - movl %eax,%r13d - addl %r8d,%r14d - rorl $14,%r13d - movl %r14d,%r8d - movl %ebx,%r12d - rorl $9,%r14d - xorl %eax,%r13d - xorl %ecx,%r12d - rorl $5,%r13d - xorl %r8d,%r14d - andl %eax,%r12d - xorl %eax,%r13d - addl 16(%rsp),%edx - movl %r8d,%r15d - xorl %ecx,%r12d - rorl $11,%r14d - xorl %r9d,%r15d - addl %r12d,%edx - rorl $6,%r13d - andl %r15d,%edi - xorl %r8d,%r14d - addl %r13d,%edx - xorl %r9d,%edi - rorl $2,%r14d - addl %edx,%r11d - addl %edi,%edx - movl %r11d,%r13d - addl %edx,%r14d - rorl $14,%r13d - movl %r14d,%edx - movl %eax,%r12d - rorl $9,%r14d - xorl %r11d,%r13d - xorl %ebx,%r12d - rorl $5,%r13d - xorl %edx,%r14d - andl %r11d,%r12d - xorl %r11d,%r13d - addl 20(%rsp),%ecx - movl %edx,%edi - xorl %ebx,%r12d - rorl $11,%r14d - xorl %r8d,%edi - addl %r12d,%ecx - rorl $6,%r13d - andl %edi,%r15d - xorl %edx,%r14d - addl %r13d,%ecx - xorl %r8d,%r15d - rorl $2,%r14d - addl %ecx,%r10d - addl %r15d,%ecx - movl %r10d,%r13d - addl %ecx,%r14d - rorl $14,%r13d - movl %r14d,%ecx - movl %r11d,%r12d - rorl $9,%r14d - xorl %r10d,%r13d - xorl %eax,%r12d - rorl $5,%r13d - xorl %ecx,%r14d - andl %r10d,%r12d - xorl %r10d,%r13d - addl 24(%rsp),%ebx - movl %ecx,%r15d - xorl %eax,%r12d - rorl $11,%r14d - xorl %edx,%r15d - addl %r12d,%ebx - rorl $6,%r13d - andl %r15d,%edi - xorl %ecx,%r14d - addl %r13d,%ebx - xorl %edx,%edi - rorl $2,%r14d - addl %ebx,%r9d - addl %edi,%ebx - movl %r9d,%r13d - addl %ebx,%r14d - rorl $14,%r13d - movl %r14d,%ebx - movl %r10d,%r12d - rorl $9,%r14d - xorl %r9d,%r13d - xorl %r11d,%r12d - rorl $5,%r13d - xorl %ebx,%r14d - andl %r9d,%r12d - xorl %r9d,%r13d - addl 28(%rsp),%eax - movl %ebx,%edi - xorl %r11d,%r12d - rorl $11,%r14d - xorl %ecx,%edi - addl %r12d,%eax - rorl $6,%r13d - andl %edi,%r15d - xorl %ebx,%r14d - addl %r13d,%eax - xorl %ecx,%r15d - rorl $2,%r14d - addl %eax,%r8d - addl %r15d,%eax - movl %r8d,%r13d - addl %eax,%r14d - rorl $14,%r13d - movl %r14d,%eax - movl %r9d,%r12d - rorl $9,%r14d - xorl %r8d,%r13d - xorl %r10d,%r12d - rorl $5,%r13d - xorl %eax,%r14d - andl %r8d,%r12d - xorl %r8d,%r13d - addl 32(%rsp),%r11d - movl %eax,%r15d - xorl %r10d,%r12d - rorl $11,%r14d - xorl %ebx,%r15d - addl %r12d,%r11d - rorl $6,%r13d - andl %r15d,%edi - xorl %eax,%r14d - addl %r13d,%r11d - xorl %ebx,%edi - rorl $2,%r14d - addl %r11d,%edx - addl %edi,%r11d - movl %edx,%r13d - addl %r11d,%r14d - rorl $14,%r13d - movl %r14d,%r11d - movl %r8d,%r12d - rorl $9,%r14d - xorl %edx,%r13d - xorl %r9d,%r12d - rorl $5,%r13d - xorl %r11d,%r14d - andl %edx,%r12d - xorl %edx,%r13d - addl 36(%rsp),%r10d - movl %r11d,%edi - xorl %r9d,%r12d - rorl $11,%r14d - xorl %eax,%edi - addl %r12d,%r10d - rorl $6,%r13d - andl %edi,%r15d - xorl %r11d,%r14d - addl %r13d,%r10d - xorl %eax,%r15d - rorl $2,%r14d - addl %r10d,%ecx - addl %r15d,%r10d - movl %ecx,%r13d - addl %r10d,%r14d - rorl $14,%r13d - movl %r14d,%r10d - movl %edx,%r12d - rorl $9,%r14d - xorl %ecx,%r13d - xorl %r8d,%r12d - rorl $5,%r13d - xorl %r10d,%r14d - andl %ecx,%r12d - xorl %ecx,%r13d - addl 40(%rsp),%r9d - movl %r10d,%r15d - xorl %r8d,%r12d - rorl $11,%r14d - xorl %r11d,%r15d - addl %r12d,%r9d - rorl $6,%r13d - andl %r15d,%edi - xorl %r10d,%r14d - addl %r13d,%r9d - xorl %r11d,%edi - rorl $2,%r14d - addl %r9d,%ebx - addl %edi,%r9d - movl %ebx,%r13d - addl %r9d,%r14d - rorl $14,%r13d - movl %r14d,%r9d - movl %ecx,%r12d - rorl $9,%r14d - xorl %ebx,%r13d - xorl %edx,%r12d - rorl $5,%r13d - xorl %r9d,%r14d - andl %ebx,%r12d - xorl %ebx,%r13d - addl 44(%rsp),%r8d - movl %r9d,%edi - xorl %edx,%r12d - rorl $11,%r14d - xorl %r10d,%edi - addl %r12d,%r8d - rorl $6,%r13d - andl %edi,%r15d - xorl %r9d,%r14d - addl %r13d,%r8d - xorl %r10d,%r15d - rorl $2,%r14d - addl %r8d,%eax - addl %r15d,%r8d - movl %eax,%r13d - addl %r8d,%r14d - rorl $14,%r13d - movl %r14d,%r8d - movl %ebx,%r12d - rorl $9,%r14d - xorl %eax,%r13d - xorl %ecx,%r12d - rorl $5,%r13d - xorl %r8d,%r14d - andl %eax,%r12d - xorl %eax,%r13d - addl 48(%rsp),%edx - movl %r8d,%r15d - xorl %ecx,%r12d - rorl $11,%r14d - xorl %r9d,%r15d - addl %r12d,%edx - rorl $6,%r13d - andl %r15d,%edi - xorl %r8d,%r14d - addl %r13d,%edx - xorl %r9d,%edi - rorl $2,%r14d - addl %edx,%r11d - addl %edi,%edx - movl %r11d,%r13d - addl %edx,%r14d - rorl $14,%r13d - movl %r14d,%edx - movl %eax,%r12d - rorl $9,%r14d - xorl %r11d,%r13d - xorl %ebx,%r12d - rorl $5,%r13d - xorl %edx,%r14d - andl %r11d,%r12d - xorl %r11d,%r13d - addl 52(%rsp),%ecx - movl %edx,%edi - xorl %ebx,%r12d - rorl $11,%r14d - xorl %r8d,%edi - addl %r12d,%ecx - rorl $6,%r13d - andl %edi,%r15d - xorl %edx,%r14d - addl %r13d,%ecx - xorl %r8d,%r15d - rorl $2,%r14d - addl %ecx,%r10d - addl %r15d,%ecx - movl %r10d,%r13d - addl %ecx,%r14d - rorl $14,%r13d - movl %r14d,%ecx - movl %r11d,%r12d - rorl $9,%r14d - xorl %r10d,%r13d - xorl %eax,%r12d - rorl $5,%r13d - xorl %ecx,%r14d - andl %r10d,%r12d - xorl %r10d,%r13d - addl 56(%rsp),%ebx - movl %ecx,%r15d - xorl %eax,%r12d - rorl $11,%r14d - xorl %edx,%r15d - addl %r12d,%ebx - rorl $6,%r13d - andl %r15d,%edi - xorl %ecx,%r14d - addl %r13d,%ebx - xorl %edx,%edi - rorl $2,%r14d - addl %ebx,%r9d - addl %edi,%ebx - movl %r9d,%r13d - addl %ebx,%r14d - rorl $14,%r13d - movl %r14d,%ebx - movl %r10d,%r12d - rorl $9,%r14d - xorl %r9d,%r13d - xorl %r11d,%r12d - rorl $5,%r13d - xorl %ebx,%r14d - andl %r9d,%r12d - xorl %r9d,%r13d - addl 60(%rsp),%eax - movl %ebx,%edi - xorl %r11d,%r12d - rorl $11,%r14d - xorl %ecx,%edi - addl %r12d,%eax - rorl $6,%r13d - andl %edi,%r15d - xorl %ebx,%r14d - addl %r13d,%eax - xorl %ecx,%r15d - rorl $2,%r14d - addl %eax,%r8d - addl %r15d,%eax - movl %r8d,%r13d - addl %eax,%r14d - movq 64+0(%rsp),%rdi - movl %r14d,%eax - - addl 0(%rdi),%eax - leaq 64(%rsi),%rsi - addl 4(%rdi),%ebx - addl 8(%rdi),%ecx - addl 12(%rdi),%edx - addl 16(%rdi),%r8d - addl 20(%rdi),%r9d - addl 24(%rdi),%r10d - addl 28(%rdi),%r11d - - cmpq 64+16(%rsp),%rsi - - movl %eax,0(%rdi) - movl %ebx,4(%rdi) - movl %ecx,8(%rdi) - movl %edx,12(%rdi) - movl %r8d,16(%rdi) - movl %r9d,20(%rdi) - movl %r10d,24(%rdi) - movl %r11d,28(%rdi) - jb .Lloop_ssse3 - - movq 88(%rsp),%rsi -.cfi_def_cfa %rsi,8 - movq -48(%rsi),%r15 -.cfi_restore %r15 - movq -40(%rsi),%r14 -.cfi_restore %r14 - movq -32(%rsi),%r13 -.cfi_restore %r13 - movq -24(%rsi),%r12 -.cfi_restore %r12 - movq -16(%rsi),%rbp -.cfi_restore %rbp - movq -8(%rsi),%rbx -.cfi_restore %rbx - leaq (%rsi),%rsp -.cfi_def_cfa_register %rsp -.Lepilogue_ssse3: - .byte 0xf3,0xc3 -.cfi_endproc -.size GFp_sha256_block_data_order_ssse3,.-GFp_sha256_block_data_order_ssse3 -.type GFp_sha256_block_data_order_avx,@function -.align 64 -GFp_sha256_block_data_order_avx: -.cfi_startproc -.Lavx_shortcut: - movq %rsp,%rax -.cfi_def_cfa_register %rax - pushq %rbx -.cfi_offset %rbx,-16 - pushq %rbp -.cfi_offset %rbp,-24 - pushq %r12 -.cfi_offset %r12,-32 - pushq %r13 -.cfi_offset %r13,-40 - pushq %r14 -.cfi_offset %r14,-48 - pushq %r15 -.cfi_offset %r15,-56 - shlq $4,%rdx - subq $96,%rsp - leaq (%rsi,%rdx,4),%rdx - andq $-64,%rsp - movq %rdi,64+0(%rsp) - movq %rsi,64+8(%rsp) - movq %rdx,64+16(%rsp) - movq %rax,88(%rsp) -.cfi_escape 0x0f,0x06,0x77,0xd8,0x00,0x06,0x23,0x08 -.Lprologue_avx: - - vzeroupper - movl 0(%rdi),%eax - movl 4(%rdi),%ebx - movl 8(%rdi),%ecx - movl 12(%rdi),%edx - movl 16(%rdi),%r8d - movl 20(%rdi),%r9d - movl 24(%rdi),%r10d - movl 28(%rdi),%r11d - vmovdqa K256+512+32(%rip),%xmm8 - vmovdqa K256+512+64(%rip),%xmm9 - jmp .Lloop_avx -.align 16 -.Lloop_avx: - vmovdqa K256+512(%rip),%xmm7 - vmovdqu 0(%rsi),%xmm0 - vmovdqu 16(%rsi),%xmm1 - vmovdqu 32(%rsi),%xmm2 - vmovdqu 48(%rsi),%xmm3 - vpshufb %xmm7,%xmm0,%xmm0 - leaq K256(%rip),%rbp - vpshufb %xmm7,%xmm1,%xmm1 - vpshufb %xmm7,%xmm2,%xmm2 - vpaddd 0(%rbp),%xmm0,%xmm4 - vpshufb %xmm7,%xmm3,%xmm3 - vpaddd 32(%rbp),%xmm1,%xmm5 - vpaddd 64(%rbp),%xmm2,%xmm6 - vpaddd 96(%rbp),%xmm3,%xmm7 - vmovdqa %xmm4,0(%rsp) - movl %eax,%r14d - vmovdqa %xmm5,16(%rsp) - movl %ebx,%edi - vmovdqa %xmm6,32(%rsp) - xorl %ecx,%edi - vmovdqa %xmm7,48(%rsp) - movl %r8d,%r13d - jmp .Lavx_00_47 - -.align 16 -.Lavx_00_47: - subq $-128,%rbp - vpalignr $4,%xmm0,%xmm1,%xmm4 - shrdl $14,%r13d,%r13d - movl %r14d,%eax - movl %r9d,%r12d - vpalignr $4,%xmm2,%xmm3,%xmm7 - shrdl $9,%r14d,%r14d - xorl %r8d,%r13d - xorl %r10d,%r12d - vpsrld $7,%xmm4,%xmm6 - shrdl $5,%r13d,%r13d - xorl %eax,%r14d - andl %r8d,%r12d - vpaddd %xmm7,%xmm0,%xmm0 - xorl %r8d,%r13d - addl 0(%rsp),%r11d - movl %eax,%r15d - vpsrld $3,%xmm4,%xmm7 - xorl %r10d,%r12d - shrdl $11,%r14d,%r14d - xorl %ebx,%r15d - vpslld $14,%xmm4,%xmm5 - addl %r12d,%r11d - shrdl $6,%r13d,%r13d - andl %r15d,%edi - vpxor %xmm6,%xmm7,%xmm4 - xorl %eax,%r14d - addl %r13d,%r11d - xorl %ebx,%edi - vpshufd $250,%xmm3,%xmm7 - shrdl $2,%r14d,%r14d - addl %r11d,%edx - addl %edi,%r11d - vpsrld $11,%xmm6,%xmm6 - movl %edx,%r13d - addl %r11d,%r14d - shrdl $14,%r13d,%r13d - vpxor %xmm5,%xmm4,%xmm4 - movl %r14d,%r11d - movl %r8d,%r12d - shrdl $9,%r14d,%r14d - vpslld $11,%xmm5,%xmm5 - xorl %edx,%r13d - xorl %r9d,%r12d - shrdl $5,%r13d,%r13d - vpxor %xmm6,%xmm4,%xmm4 - xorl %r11d,%r14d - andl %edx,%r12d - xorl %edx,%r13d - vpsrld $10,%xmm7,%xmm6 - addl 4(%rsp),%r10d - movl %r11d,%edi - xorl %r9d,%r12d - vpxor %xmm5,%xmm4,%xmm4 - shrdl $11,%r14d,%r14d - xorl %eax,%edi - addl %r12d,%r10d - vpsrlq $17,%xmm7,%xmm7 - shrdl $6,%r13d,%r13d - andl %edi,%r15d - xorl %r11d,%r14d - vpaddd %xmm4,%xmm0,%xmm0 - addl %r13d,%r10d - xorl %eax,%r15d - shrdl $2,%r14d,%r14d - vpxor %xmm7,%xmm6,%xmm6 - addl %r10d,%ecx - addl %r15d,%r10d - movl %ecx,%r13d - vpsrlq $2,%xmm7,%xmm7 - addl %r10d,%r14d - shrdl $14,%r13d,%r13d - movl %r14d,%r10d - vpxor %xmm7,%xmm6,%xmm6 - movl %edx,%r12d - shrdl $9,%r14d,%r14d - xorl %ecx,%r13d - vpshufb %xmm8,%xmm6,%xmm6 - xorl %r8d,%r12d - shrdl $5,%r13d,%r13d - xorl %r10d,%r14d - vpaddd %xmm6,%xmm0,%xmm0 - andl %ecx,%r12d - xorl %ecx,%r13d - addl 8(%rsp),%r9d - vpshufd $80,%xmm0,%xmm7 - movl %r10d,%r15d - xorl %r8d,%r12d - shrdl $11,%r14d,%r14d - vpsrld $10,%xmm7,%xmm6 - xorl %r11d,%r15d - addl %r12d,%r9d - shrdl $6,%r13d,%r13d - vpsrlq $17,%xmm7,%xmm7 - andl %r15d,%edi - xorl %r10d,%r14d - addl %r13d,%r9d - vpxor %xmm7,%xmm6,%xmm6 - xorl %r11d,%edi - shrdl $2,%r14d,%r14d - addl %r9d,%ebx - vpsrlq $2,%xmm7,%xmm7 - addl %edi,%r9d - movl %ebx,%r13d - addl %r9d,%r14d - vpxor %xmm7,%xmm6,%xmm6 - shrdl $14,%r13d,%r13d - movl %r14d,%r9d - movl %ecx,%r12d - vpshufb %xmm9,%xmm6,%xmm6 - shrdl $9,%r14d,%r14d - xorl %ebx,%r13d - xorl %edx,%r12d - vpaddd %xmm6,%xmm0,%xmm0 - shrdl $5,%r13d,%r13d - xorl %r9d,%r14d - andl %ebx,%r12d - vpaddd 0(%rbp),%xmm0,%xmm6 - xorl %ebx,%r13d - addl 12(%rsp),%r8d - movl %r9d,%edi - xorl %edx,%r12d - shrdl $11,%r14d,%r14d - xorl %r10d,%edi - addl %r12d,%r8d - shrdl $6,%r13d,%r13d - andl %edi,%r15d - xorl %r9d,%r14d - addl %r13d,%r8d - xorl %r10d,%r15d - shrdl $2,%r14d,%r14d - addl %r8d,%eax - addl %r15d,%r8d - movl %eax,%r13d - addl %r8d,%r14d - vmovdqa %xmm6,0(%rsp) - vpalignr $4,%xmm1,%xmm2,%xmm4 - shrdl $14,%r13d,%r13d - movl %r14d,%r8d - movl %ebx,%r12d - vpalignr $4,%xmm3,%xmm0,%xmm7 - shrdl $9,%r14d,%r14d - xorl %eax,%r13d - xorl %ecx,%r12d - vpsrld $7,%xmm4,%xmm6 - shrdl $5,%r13d,%r13d - xorl %r8d,%r14d - andl %eax,%r12d - vpaddd %xmm7,%xmm1,%xmm1 - xorl %eax,%r13d - addl 16(%rsp),%edx - movl %r8d,%r15d - vpsrld $3,%xmm4,%xmm7 - xorl %ecx,%r12d - shrdl $11,%r14d,%r14d - xorl %r9d,%r15d - vpslld $14,%xmm4,%xmm5 - addl %r12d,%edx - shrdl $6,%r13d,%r13d - andl %r15d,%edi - vpxor %xmm6,%xmm7,%xmm4 - xorl %r8d,%r14d - addl %r13d,%edx - xorl %r9d,%edi - vpshufd $250,%xmm0,%xmm7 - shrdl $2,%r14d,%r14d - addl %edx,%r11d - addl %edi,%edx - vpsrld $11,%xmm6,%xmm6 - movl %r11d,%r13d - addl %edx,%r14d - shrdl $14,%r13d,%r13d - vpxor %xmm5,%xmm4,%xmm4 - movl %r14d,%edx - movl %eax,%r12d - shrdl $9,%r14d,%r14d - vpslld $11,%xmm5,%xmm5 - xorl %r11d,%r13d - xorl %ebx,%r12d - shrdl $5,%r13d,%r13d - vpxor %xmm6,%xmm4,%xmm4 - xorl %edx,%r14d - andl %r11d,%r12d - xorl %r11d,%r13d - vpsrld $10,%xmm7,%xmm6 - addl 20(%rsp),%ecx - movl %edx,%edi - xorl %ebx,%r12d - vpxor %xmm5,%xmm4,%xmm4 - shrdl $11,%r14d,%r14d - xorl %r8d,%edi - addl %r12d,%ecx - vpsrlq $17,%xmm7,%xmm7 - shrdl $6,%r13d,%r13d - andl %edi,%r15d - xorl %edx,%r14d - vpaddd %xmm4,%xmm1,%xmm1 - addl %r13d,%ecx - xorl %r8d,%r15d - shrdl $2,%r14d,%r14d - vpxor %xmm7,%xmm6,%xmm6 - addl %ecx,%r10d - addl %r15d,%ecx - movl %r10d,%r13d - vpsrlq $2,%xmm7,%xmm7 - addl %ecx,%r14d - shrdl $14,%r13d,%r13d - movl %r14d,%ecx - vpxor %xmm7,%xmm6,%xmm6 - movl %r11d,%r12d - shrdl $9,%r14d,%r14d - xorl %r10d,%r13d - vpshufb %xmm8,%xmm6,%xmm6 - xorl %eax,%r12d - shrdl $5,%r13d,%r13d - xorl %ecx,%r14d - vpaddd %xmm6,%xmm1,%xmm1 - andl %r10d,%r12d - xorl %r10d,%r13d - addl 24(%rsp),%ebx - vpshufd $80,%xmm1,%xmm7 - movl %ecx,%r15d - xorl %eax,%r12d - shrdl $11,%r14d,%r14d - vpsrld $10,%xmm7,%xmm6 - xorl %edx,%r15d - addl %r12d,%ebx - shrdl $6,%r13d,%r13d - vpsrlq $17,%xmm7,%xmm7 - andl %r15d,%edi - xorl %ecx,%r14d - addl %r13d,%ebx - vpxor %xmm7,%xmm6,%xmm6 - xorl %edx,%edi - shrdl $2,%r14d,%r14d - addl %ebx,%r9d - vpsrlq $2,%xmm7,%xmm7 - addl %edi,%ebx - movl %r9d,%r13d - addl %ebx,%r14d - vpxor %xmm7,%xmm6,%xmm6 - shrdl $14,%r13d,%r13d - movl %r14d,%ebx - movl %r10d,%r12d - vpshufb %xmm9,%xmm6,%xmm6 - shrdl $9,%r14d,%r14d - xorl %r9d,%r13d - xorl %r11d,%r12d - vpaddd %xmm6,%xmm1,%xmm1 - shrdl $5,%r13d,%r13d - xorl %ebx,%r14d - andl %r9d,%r12d - vpaddd 32(%rbp),%xmm1,%xmm6 - xorl %r9d,%r13d - addl 28(%rsp),%eax - movl %ebx,%edi - xorl %r11d,%r12d - shrdl $11,%r14d,%r14d - xorl %ecx,%edi - addl %r12d,%eax - shrdl $6,%r13d,%r13d - andl %edi,%r15d - xorl %ebx,%r14d - addl %r13d,%eax - xorl %ecx,%r15d - shrdl $2,%r14d,%r14d - addl %eax,%r8d - addl %r15d,%eax - movl %r8d,%r13d - addl %eax,%r14d - vmovdqa %xmm6,16(%rsp) - vpalignr $4,%xmm2,%xmm3,%xmm4 - shrdl $14,%r13d,%r13d - movl %r14d,%eax - movl %r9d,%r12d - vpalignr $4,%xmm0,%xmm1,%xmm7 - shrdl $9,%r14d,%r14d - xorl %r8d,%r13d - xorl %r10d,%r12d - vpsrld $7,%xmm4,%xmm6 - shrdl $5,%r13d,%r13d - xorl %eax,%r14d - andl %r8d,%r12d - vpaddd %xmm7,%xmm2,%xmm2 - xorl %r8d,%r13d - addl 32(%rsp),%r11d - movl %eax,%r15d - vpsrld $3,%xmm4,%xmm7 - xorl %r10d,%r12d - shrdl $11,%r14d,%r14d - xorl %ebx,%r15d - vpslld $14,%xmm4,%xmm5 - addl %r12d,%r11d - shrdl $6,%r13d,%r13d - andl %r15d,%edi - vpxor %xmm6,%xmm7,%xmm4 - xorl %eax,%r14d - addl %r13d,%r11d - xorl %ebx,%edi - vpshufd $250,%xmm1,%xmm7 - shrdl $2,%r14d,%r14d - addl %r11d,%edx - addl %edi,%r11d - vpsrld $11,%xmm6,%xmm6 - movl %edx,%r13d - addl %r11d,%r14d - shrdl $14,%r13d,%r13d - vpxor %xmm5,%xmm4,%xmm4 - movl %r14d,%r11d - movl %r8d,%r12d - shrdl $9,%r14d,%r14d - vpslld $11,%xmm5,%xmm5 - xorl %edx,%r13d - xorl %r9d,%r12d - shrdl $5,%r13d,%r13d - vpxor %xmm6,%xmm4,%xmm4 - xorl %r11d,%r14d - andl %edx,%r12d - xorl %edx,%r13d - vpsrld $10,%xmm7,%xmm6 - addl 36(%rsp),%r10d - movl %r11d,%edi - xorl %r9d,%r12d - vpxor %xmm5,%xmm4,%xmm4 - shrdl $11,%r14d,%r14d - xorl %eax,%edi - addl %r12d,%r10d - vpsrlq $17,%xmm7,%xmm7 - shrdl $6,%r13d,%r13d - andl %edi,%r15d - xorl %r11d,%r14d - vpaddd %xmm4,%xmm2,%xmm2 - addl %r13d,%r10d - xorl %eax,%r15d - shrdl $2,%r14d,%r14d - vpxor %xmm7,%xmm6,%xmm6 - addl %r10d,%ecx - addl %r15d,%r10d - movl %ecx,%r13d - vpsrlq $2,%xmm7,%xmm7 - addl %r10d,%r14d - shrdl $14,%r13d,%r13d - movl %r14d,%r10d - vpxor %xmm7,%xmm6,%xmm6 - movl %edx,%r12d - shrdl $9,%r14d,%r14d - xorl %ecx,%r13d - vpshufb %xmm8,%xmm6,%xmm6 - xorl %r8d,%r12d - shrdl $5,%r13d,%r13d - xorl %r10d,%r14d - vpaddd %xmm6,%xmm2,%xmm2 - andl %ecx,%r12d - xorl %ecx,%r13d - addl 40(%rsp),%r9d - vpshufd $80,%xmm2,%xmm7 - movl %r10d,%r15d - xorl %r8d,%r12d - shrdl $11,%r14d,%r14d - vpsrld $10,%xmm7,%xmm6 - xorl %r11d,%r15d - addl %r12d,%r9d - shrdl $6,%r13d,%r13d - vpsrlq $17,%xmm7,%xmm7 - andl %r15d,%edi - xorl %r10d,%r14d - addl %r13d,%r9d - vpxor %xmm7,%xmm6,%xmm6 - xorl %r11d,%edi - shrdl $2,%r14d,%r14d - addl %r9d,%ebx - vpsrlq $2,%xmm7,%xmm7 - addl %edi,%r9d - movl %ebx,%r13d - addl %r9d,%r14d - vpxor %xmm7,%xmm6,%xmm6 - shrdl $14,%r13d,%r13d - movl %r14d,%r9d - movl %ecx,%r12d - vpshufb %xmm9,%xmm6,%xmm6 - shrdl $9,%r14d,%r14d - xorl %ebx,%r13d - xorl %edx,%r12d - vpaddd %xmm6,%xmm2,%xmm2 - shrdl $5,%r13d,%r13d - xorl %r9d,%r14d - andl %ebx,%r12d - vpaddd 64(%rbp),%xmm2,%xmm6 - xorl %ebx,%r13d - addl 44(%rsp),%r8d - movl %r9d,%edi - xorl %edx,%r12d - shrdl $11,%r14d,%r14d - xorl %r10d,%edi - addl %r12d,%r8d - shrdl $6,%r13d,%r13d - andl %edi,%r15d - xorl %r9d,%r14d - addl %r13d,%r8d - xorl %r10d,%r15d - shrdl $2,%r14d,%r14d - addl %r8d,%eax - addl %r15d,%r8d - movl %eax,%r13d - addl %r8d,%r14d - vmovdqa %xmm6,32(%rsp) - vpalignr $4,%xmm3,%xmm0,%xmm4 - shrdl $14,%r13d,%r13d - movl %r14d,%r8d - movl %ebx,%r12d - vpalignr $4,%xmm1,%xmm2,%xmm7 - shrdl $9,%r14d,%r14d - xorl %eax,%r13d - xorl %ecx,%r12d - vpsrld $7,%xmm4,%xmm6 - shrdl $5,%r13d,%r13d - xorl %r8d,%r14d - andl %eax,%r12d - vpaddd %xmm7,%xmm3,%xmm3 - xorl %eax,%r13d - addl 48(%rsp),%edx - movl %r8d,%r15d - vpsrld $3,%xmm4,%xmm7 - xorl %ecx,%r12d - shrdl $11,%r14d,%r14d - xorl %r9d,%r15d - vpslld $14,%xmm4,%xmm5 - addl %r12d,%edx - shrdl $6,%r13d,%r13d - andl %r15d,%edi - vpxor %xmm6,%xmm7,%xmm4 - xorl %r8d,%r14d - addl %r13d,%edx - xorl %r9d,%edi - vpshufd $250,%xmm2,%xmm7 - shrdl $2,%r14d,%r14d - addl %edx,%r11d - addl %edi,%edx - vpsrld $11,%xmm6,%xmm6 - movl %r11d,%r13d - addl %edx,%r14d - shrdl $14,%r13d,%r13d - vpxor %xmm5,%xmm4,%xmm4 - movl %r14d,%edx - movl %eax,%r12d - shrdl $9,%r14d,%r14d - vpslld $11,%xmm5,%xmm5 - xorl %r11d,%r13d - xorl %ebx,%r12d - shrdl $5,%r13d,%r13d - vpxor %xmm6,%xmm4,%xmm4 - xorl %edx,%r14d - andl %r11d,%r12d - xorl %r11d,%r13d - vpsrld $10,%xmm7,%xmm6 - addl 52(%rsp),%ecx - movl %edx,%edi - xorl %ebx,%r12d - vpxor %xmm5,%xmm4,%xmm4 - shrdl $11,%r14d,%r14d - xorl %r8d,%edi - addl %r12d,%ecx - vpsrlq $17,%xmm7,%xmm7 - shrdl $6,%r13d,%r13d - andl %edi,%r15d - xorl %edx,%r14d - vpaddd %xmm4,%xmm3,%xmm3 - addl %r13d,%ecx - xorl %r8d,%r15d - shrdl $2,%r14d,%r14d - vpxor %xmm7,%xmm6,%xmm6 - addl %ecx,%r10d - addl %r15d,%ecx - movl %r10d,%r13d - vpsrlq $2,%xmm7,%xmm7 - addl %ecx,%r14d - shrdl $14,%r13d,%r13d - movl %r14d,%ecx - vpxor %xmm7,%xmm6,%xmm6 - movl %r11d,%r12d - shrdl $9,%r14d,%r14d - xorl %r10d,%r13d - vpshufb %xmm8,%xmm6,%xmm6 - xorl %eax,%r12d - shrdl $5,%r13d,%r13d - xorl %ecx,%r14d - vpaddd %xmm6,%xmm3,%xmm3 - andl %r10d,%r12d - xorl %r10d,%r13d - addl 56(%rsp),%ebx - vpshufd $80,%xmm3,%xmm7 - movl %ecx,%r15d - xorl %eax,%r12d - shrdl $11,%r14d,%r14d - vpsrld $10,%xmm7,%xmm6 - xorl %edx,%r15d - addl %r12d,%ebx - shrdl $6,%r13d,%r13d - vpsrlq $17,%xmm7,%xmm7 - andl %r15d,%edi - xorl %ecx,%r14d - addl %r13d,%ebx - vpxor %xmm7,%xmm6,%xmm6 - xorl %edx,%edi - shrdl $2,%r14d,%r14d - addl %ebx,%r9d - vpsrlq $2,%xmm7,%xmm7 - addl %edi,%ebx - movl %r9d,%r13d - addl %ebx,%r14d - vpxor %xmm7,%xmm6,%xmm6 - shrdl $14,%r13d,%r13d - movl %r14d,%ebx - movl %r10d,%r12d - vpshufb %xmm9,%xmm6,%xmm6 - shrdl $9,%r14d,%r14d - xorl %r9d,%r13d - xorl %r11d,%r12d - vpaddd %xmm6,%xmm3,%xmm3 - shrdl $5,%r13d,%r13d - xorl %ebx,%r14d - andl %r9d,%r12d - vpaddd 96(%rbp),%xmm3,%xmm6 - xorl %r9d,%r13d - addl 60(%rsp),%eax - movl %ebx,%edi - xorl %r11d,%r12d - shrdl $11,%r14d,%r14d - xorl %ecx,%edi - addl %r12d,%eax - shrdl $6,%r13d,%r13d - andl %edi,%r15d - xorl %ebx,%r14d - addl %r13d,%eax - xorl %ecx,%r15d - shrdl $2,%r14d,%r14d - addl %eax,%r8d - addl %r15d,%eax - movl %r8d,%r13d - addl %eax,%r14d - vmovdqa %xmm6,48(%rsp) - cmpb $0,131(%rbp) - jne .Lavx_00_47 - shrdl $14,%r13d,%r13d - movl %r14d,%eax - movl %r9d,%r12d - shrdl $9,%r14d,%r14d - xorl %r8d,%r13d - xorl %r10d,%r12d - shrdl $5,%r13d,%r13d - xorl %eax,%r14d - andl %r8d,%r12d - xorl %r8d,%r13d - addl 0(%rsp),%r11d - movl %eax,%r15d - xorl %r10d,%r12d - shrdl $11,%r14d,%r14d - xorl %ebx,%r15d - addl %r12d,%r11d - shrdl $6,%r13d,%r13d - andl %r15d,%edi - xorl %eax,%r14d - addl %r13d,%r11d - xorl %ebx,%edi - shrdl $2,%r14d,%r14d - addl %r11d,%edx - addl %edi,%r11d - movl %edx,%r13d - addl %r11d,%r14d - shrdl $14,%r13d,%r13d - movl %r14d,%r11d - movl %r8d,%r12d - shrdl $9,%r14d,%r14d - xorl %edx,%r13d - xorl %r9d,%r12d - shrdl $5,%r13d,%r13d - xorl %r11d,%r14d - andl %edx,%r12d - xorl %edx,%r13d - addl 4(%rsp),%r10d - movl %r11d,%edi - xorl %r9d,%r12d - shrdl $11,%r14d,%r14d - xorl %eax,%edi - addl %r12d,%r10d - shrdl $6,%r13d,%r13d - andl %edi,%r15d - xorl %r11d,%r14d - addl %r13d,%r10d - xorl %eax,%r15d - shrdl $2,%r14d,%r14d - addl %r10d,%ecx - addl %r15d,%r10d - movl %ecx,%r13d - addl %r10d,%r14d - shrdl $14,%r13d,%r13d - movl %r14d,%r10d - movl %edx,%r12d - shrdl $9,%r14d,%r14d - xorl %ecx,%r13d - xorl %r8d,%r12d - shrdl $5,%r13d,%r13d - xorl %r10d,%r14d - andl %ecx,%r12d - xorl %ecx,%r13d - addl 8(%rsp),%r9d - movl %r10d,%r15d - xorl %r8d,%r12d - shrdl $11,%r14d,%r14d - xorl %r11d,%r15d - addl %r12d,%r9d - shrdl $6,%r13d,%r13d - andl %r15d,%edi - xorl %r10d,%r14d - addl %r13d,%r9d - xorl %r11d,%edi - shrdl $2,%r14d,%r14d - addl %r9d,%ebx - addl %edi,%r9d - movl %ebx,%r13d - addl %r9d,%r14d - shrdl $14,%r13d,%r13d - movl %r14d,%r9d - movl %ecx,%r12d - shrdl $9,%r14d,%r14d - xorl %ebx,%r13d - xorl %edx,%r12d - shrdl $5,%r13d,%r13d - xorl %r9d,%r14d - andl %ebx,%r12d - xorl %ebx,%r13d - addl 12(%rsp),%r8d - movl %r9d,%edi - xorl %edx,%r12d - shrdl $11,%r14d,%r14d - xorl %r10d,%edi - addl %r12d,%r8d - shrdl $6,%r13d,%r13d - andl %edi,%r15d - xorl %r9d,%r14d - addl %r13d,%r8d - xorl %r10d,%r15d - shrdl $2,%r14d,%r14d - addl %r8d,%eax - addl %r15d,%r8d - movl %eax,%r13d - addl %r8d,%r14d - shrdl $14,%r13d,%r13d - movl %r14d,%r8d - movl %ebx,%r12d - shrdl $9,%r14d,%r14d - xorl %eax,%r13d - xorl %ecx,%r12d - shrdl $5,%r13d,%r13d - xorl %r8d,%r14d - andl %eax,%r12d - xorl %eax,%r13d - addl 16(%rsp),%edx - movl %r8d,%r15d - xorl %ecx,%r12d - shrdl $11,%r14d,%r14d - xorl %r9d,%r15d - addl %r12d,%edx - shrdl $6,%r13d,%r13d - andl %r15d,%edi - xorl %r8d,%r14d - addl %r13d,%edx - xorl %r9d,%edi - shrdl $2,%r14d,%r14d - addl %edx,%r11d - addl %edi,%edx - movl %r11d,%r13d - addl %edx,%r14d - shrdl $14,%r13d,%r13d - movl %r14d,%edx - movl %eax,%r12d - shrdl $9,%r14d,%r14d - xorl %r11d,%r13d - xorl %ebx,%r12d - shrdl $5,%r13d,%r13d - xorl %edx,%r14d - andl %r11d,%r12d - xorl %r11d,%r13d - addl 20(%rsp),%ecx - movl %edx,%edi - xorl %ebx,%r12d - shrdl $11,%r14d,%r14d - xorl %r8d,%edi - addl %r12d,%ecx - shrdl $6,%r13d,%r13d - andl %edi,%r15d - xorl %edx,%r14d - addl %r13d,%ecx - xorl %r8d,%r15d - shrdl $2,%r14d,%r14d - addl %ecx,%r10d - addl %r15d,%ecx - movl %r10d,%r13d - addl %ecx,%r14d - shrdl $14,%r13d,%r13d - movl %r14d,%ecx - movl %r11d,%r12d - shrdl $9,%r14d,%r14d - xorl %r10d,%r13d - xorl %eax,%r12d - shrdl $5,%r13d,%r13d - xorl %ecx,%r14d - andl %r10d,%r12d - xorl %r10d,%r13d - addl 24(%rsp),%ebx - movl %ecx,%r15d - xorl %eax,%r12d - shrdl $11,%r14d,%r14d - xorl %edx,%r15d - addl %r12d,%ebx - shrdl $6,%r13d,%r13d - andl %r15d,%edi - xorl %ecx,%r14d - addl %r13d,%ebx - xorl %edx,%edi - shrdl $2,%r14d,%r14d - addl %ebx,%r9d - addl %edi,%ebx - movl %r9d,%r13d - addl %ebx,%r14d - shrdl $14,%r13d,%r13d - movl %r14d,%ebx - movl %r10d,%r12d - shrdl $9,%r14d,%r14d - xorl %r9d,%r13d - xorl %r11d,%r12d - shrdl $5,%r13d,%r13d - xorl %ebx,%r14d - andl %r9d,%r12d - xorl %r9d,%r13d - addl 28(%rsp),%eax - movl %ebx,%edi - xorl %r11d,%r12d - shrdl $11,%r14d,%r14d - xorl %ecx,%edi - addl %r12d,%eax - shrdl $6,%r13d,%r13d - andl %edi,%r15d - xorl %ebx,%r14d - addl %r13d,%eax - xorl %ecx,%r15d - shrdl $2,%r14d,%r14d - addl %eax,%r8d - addl %r15d,%eax - movl %r8d,%r13d - addl %eax,%r14d - shrdl $14,%r13d,%r13d - movl %r14d,%eax - movl %r9d,%r12d - shrdl $9,%r14d,%r14d - xorl %r8d,%r13d - xorl %r10d,%r12d - shrdl $5,%r13d,%r13d - xorl %eax,%r14d - andl %r8d,%r12d - xorl %r8d,%r13d - addl 32(%rsp),%r11d - movl %eax,%r15d - xorl %r10d,%r12d - shrdl $11,%r14d,%r14d - xorl %ebx,%r15d - addl %r12d,%r11d - shrdl $6,%r13d,%r13d - andl %r15d,%edi - xorl %eax,%r14d - addl %r13d,%r11d - xorl %ebx,%edi - shrdl $2,%r14d,%r14d - addl %r11d,%edx - addl %edi,%r11d - movl %edx,%r13d - addl %r11d,%r14d - shrdl $14,%r13d,%r13d - movl %r14d,%r11d - movl %r8d,%r12d - shrdl $9,%r14d,%r14d - xorl %edx,%r13d - xorl %r9d,%r12d - shrdl $5,%r13d,%r13d - xorl %r11d,%r14d - andl %edx,%r12d - xorl %edx,%r13d - addl 36(%rsp),%r10d - movl %r11d,%edi - xorl %r9d,%r12d - shrdl $11,%r14d,%r14d - xorl %eax,%edi - addl %r12d,%r10d - shrdl $6,%r13d,%r13d - andl %edi,%r15d - xorl %r11d,%r14d - addl %r13d,%r10d - xorl %eax,%r15d - shrdl $2,%r14d,%r14d - addl %r10d,%ecx - addl %r15d,%r10d - movl %ecx,%r13d - addl %r10d,%r14d - shrdl $14,%r13d,%r13d - movl %r14d,%r10d - movl %edx,%r12d - shrdl $9,%r14d,%r14d - xorl %ecx,%r13d - xorl %r8d,%r12d - shrdl $5,%r13d,%r13d - xorl %r10d,%r14d - andl %ecx,%r12d - xorl %ecx,%r13d - addl 40(%rsp),%r9d - movl %r10d,%r15d - xorl %r8d,%r12d - shrdl $11,%r14d,%r14d - xorl %r11d,%r15d - addl %r12d,%r9d - shrdl $6,%r13d,%r13d - andl %r15d,%edi - xorl %r10d,%r14d - addl %r13d,%r9d - xorl %r11d,%edi - shrdl $2,%r14d,%r14d - addl %r9d,%ebx - addl %edi,%r9d - movl %ebx,%r13d - addl %r9d,%r14d - shrdl $14,%r13d,%r13d - movl %r14d,%r9d - movl %ecx,%r12d - shrdl $9,%r14d,%r14d - xorl %ebx,%r13d - xorl %edx,%r12d - shrdl $5,%r13d,%r13d - xorl %r9d,%r14d - andl %ebx,%r12d - xorl %ebx,%r13d - addl 44(%rsp),%r8d - movl %r9d,%edi - xorl %edx,%r12d - shrdl $11,%r14d,%r14d - xorl %r10d,%edi - addl %r12d,%r8d - shrdl $6,%r13d,%r13d - andl %edi,%r15d - xorl %r9d,%r14d - addl %r13d,%r8d - xorl %r10d,%r15d - shrdl $2,%r14d,%r14d - addl %r8d,%eax - addl %r15d,%r8d - movl %eax,%r13d - addl %r8d,%r14d - shrdl $14,%r13d,%r13d - movl %r14d,%r8d - movl %ebx,%r12d - shrdl $9,%r14d,%r14d - xorl %eax,%r13d - xorl %ecx,%r12d - shrdl $5,%r13d,%r13d - xorl %r8d,%r14d - andl %eax,%r12d - xorl %eax,%r13d - addl 48(%rsp),%edx - movl %r8d,%r15d - xorl %ecx,%r12d - shrdl $11,%r14d,%r14d - xorl %r9d,%r15d - addl %r12d,%edx - shrdl $6,%r13d,%r13d - andl %r15d,%edi - xorl %r8d,%r14d - addl %r13d,%edx - xorl %r9d,%edi - shrdl $2,%r14d,%r14d - addl %edx,%r11d - addl %edi,%edx - movl %r11d,%r13d - addl %edx,%r14d - shrdl $14,%r13d,%r13d - movl %r14d,%edx - movl %eax,%r12d - shrdl $9,%r14d,%r14d - xorl %r11d,%r13d - xorl %ebx,%r12d - shrdl $5,%r13d,%r13d - xorl %edx,%r14d - andl %r11d,%r12d - xorl %r11d,%r13d - addl 52(%rsp),%ecx - movl %edx,%edi - xorl %ebx,%r12d - shrdl $11,%r14d,%r14d - xorl %r8d,%edi - addl %r12d,%ecx - shrdl $6,%r13d,%r13d - andl %edi,%r15d - xorl %edx,%r14d - addl %r13d,%ecx - xorl %r8d,%r15d - shrdl $2,%r14d,%r14d - addl %ecx,%r10d - addl %r15d,%ecx - movl %r10d,%r13d - addl %ecx,%r14d - shrdl $14,%r13d,%r13d - movl %r14d,%ecx - movl %r11d,%r12d - shrdl $9,%r14d,%r14d - xorl %r10d,%r13d - xorl %eax,%r12d - shrdl $5,%r13d,%r13d - xorl %ecx,%r14d - andl %r10d,%r12d - xorl %r10d,%r13d - addl 56(%rsp),%ebx - movl %ecx,%r15d - xorl %eax,%r12d - shrdl $11,%r14d,%r14d - xorl %edx,%r15d - addl %r12d,%ebx - shrdl $6,%r13d,%r13d - andl %r15d,%edi - xorl %ecx,%r14d - addl %r13d,%ebx - xorl %edx,%edi - shrdl $2,%r14d,%r14d - addl %ebx,%r9d - addl %edi,%ebx - movl %r9d,%r13d - addl %ebx,%r14d - shrdl $14,%r13d,%r13d - movl %r14d,%ebx - movl %r10d,%r12d - shrdl $9,%r14d,%r14d - xorl %r9d,%r13d - xorl %r11d,%r12d - shrdl $5,%r13d,%r13d - xorl %ebx,%r14d - andl %r9d,%r12d - xorl %r9d,%r13d - addl 60(%rsp),%eax - movl %ebx,%edi - xorl %r11d,%r12d - shrdl $11,%r14d,%r14d - xorl %ecx,%edi - addl %r12d,%eax - shrdl $6,%r13d,%r13d - andl %edi,%r15d - xorl %ebx,%r14d - addl %r13d,%eax - xorl %ecx,%r15d - shrdl $2,%r14d,%r14d - addl %eax,%r8d - addl %r15d,%eax - movl %r8d,%r13d - addl %eax,%r14d - movq 64+0(%rsp),%rdi - movl %r14d,%eax - - addl 0(%rdi),%eax - leaq 64(%rsi),%rsi - addl 4(%rdi),%ebx - addl 8(%rdi),%ecx - addl 12(%rdi),%edx - addl 16(%rdi),%r8d - addl 20(%rdi),%r9d - addl 24(%rdi),%r10d - addl 28(%rdi),%r11d - - cmpq 64+16(%rsp),%rsi - - movl %eax,0(%rdi) - movl %ebx,4(%rdi) - movl %ecx,8(%rdi) - movl %edx,12(%rdi) - movl %r8d,16(%rdi) - movl %r9d,20(%rdi) - movl %r10d,24(%rdi) - movl %r11d,28(%rdi) - jb .Lloop_avx - - movq 88(%rsp),%rsi -.cfi_def_cfa %rsi,8 - vzeroupper - movq -48(%rsi),%r15 -.cfi_restore %r15 - movq -40(%rsi),%r14 -.cfi_restore %r14 - movq -32(%rsi),%r13 -.cfi_restore %r13 - movq -24(%rsi),%r12 -.cfi_restore %r12 - movq -16(%rsi),%rbp -.cfi_restore %rbp - movq -8(%rsi),%rbx -.cfi_restore %rbx - leaq (%rsi),%rsp -.cfi_def_cfa_register %rsp -.Lepilogue_avx: - .byte 0xf3,0xc3 -.cfi_endproc -.size GFp_sha256_block_data_order_avx,.-GFp_sha256_block_data_order_avx -#endif -.section .note.GNU-stack,"",@progbits diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/sha256-x86_64-macosx.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/sha256-x86_64-macosx.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/sha256-x86_64-macosx.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/sha256-x86_64-macosx.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,3968 +0,0 @@ -# This file is generated from a similarly-named Perl script in the BoringSSL -# source tree. Do not edit by hand. - -#if defined(__has_feature) -#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) -#define OPENSSL_NO_ASM -#endif -#endif - -#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) -.text - - -.globl _GFp_sha256_block_data_order -.private_extern _GFp_sha256_block_data_order - -.p2align 4 -_GFp_sha256_block_data_order: - - leaq _GFp_ia32cap_P(%rip),%r11 - movl 0(%r11),%r9d - movl 4(%r11),%r10d - movl 8(%r11),%r11d - andl $1073741824,%r9d - andl $268435968,%r10d - orl %r9d,%r10d - cmpl $1342177792,%r10d - je L$avx_shortcut - testl $512,%r10d - jnz L$ssse3_shortcut - movq %rsp,%rax - - pushq %rbx - - pushq %rbp - - pushq %r12 - - pushq %r13 - - pushq %r14 - - pushq %r15 - - shlq $4,%rdx - subq $64+32,%rsp - leaq (%rsi,%rdx,4),%rdx - andq $-64,%rsp - movq %rdi,64+0(%rsp) - movq %rsi,64+8(%rsp) - movq %rdx,64+16(%rsp) - movq %rax,88(%rsp) - -L$prologue: - - movl 0(%rdi),%eax - movl 4(%rdi),%ebx - movl 8(%rdi),%ecx - movl 12(%rdi),%edx - movl 16(%rdi),%r8d - movl 20(%rdi),%r9d - movl 24(%rdi),%r10d - movl 28(%rdi),%r11d - jmp L$loop - -.p2align 4 -L$loop: - movl %ebx,%edi - leaq K256(%rip),%rbp - xorl %ecx,%edi - movl 0(%rsi),%r12d - movl %r8d,%r13d - movl %eax,%r14d - bswapl %r12d - rorl $14,%r13d - movl %r9d,%r15d - - xorl %r8d,%r13d - rorl $9,%r14d - xorl %r10d,%r15d - - movl %r12d,0(%rsp) - xorl %eax,%r14d - andl %r8d,%r15d - - rorl $5,%r13d - addl %r11d,%r12d - xorl %r10d,%r15d - - rorl $11,%r14d - xorl %r8d,%r13d - addl %r15d,%r12d - - movl %eax,%r15d - addl (%rbp),%r12d - xorl %eax,%r14d - - xorl %ebx,%r15d - rorl $6,%r13d - movl %ebx,%r11d - - andl %r15d,%edi - rorl $2,%r14d - addl %r13d,%r12d - - xorl %edi,%r11d - addl %r12d,%edx - addl %r12d,%r11d - - leaq 4(%rbp),%rbp - addl %r14d,%r11d - movl 4(%rsi),%r12d - movl %edx,%r13d - movl %r11d,%r14d - bswapl %r12d - rorl $14,%r13d - movl %r8d,%edi - - xorl %edx,%r13d - rorl $9,%r14d - xorl %r9d,%edi - - movl %r12d,4(%rsp) - xorl %r11d,%r14d - andl %edx,%edi - - rorl $5,%r13d - addl %r10d,%r12d - xorl %r9d,%edi - - rorl $11,%r14d - xorl %edx,%r13d - addl %edi,%r12d - - movl %r11d,%edi - addl (%rbp),%r12d - xorl %r11d,%r14d - - xorl %eax,%edi - rorl $6,%r13d - movl %eax,%r10d - - andl %edi,%r15d - rorl $2,%r14d - addl %r13d,%r12d - - xorl %r15d,%r10d - addl %r12d,%ecx - addl %r12d,%r10d - - leaq 4(%rbp),%rbp - addl %r14d,%r10d - movl 8(%rsi),%r12d - movl %ecx,%r13d - movl %r10d,%r14d - bswapl %r12d - rorl $14,%r13d - movl %edx,%r15d - - xorl %ecx,%r13d - rorl $9,%r14d - xorl %r8d,%r15d - - movl %r12d,8(%rsp) - xorl %r10d,%r14d - andl %ecx,%r15d - - rorl $5,%r13d - addl %r9d,%r12d - xorl %r8d,%r15d - - rorl $11,%r14d - xorl %ecx,%r13d - addl %r15d,%r12d - - movl %r10d,%r15d - addl (%rbp),%r12d - xorl %r10d,%r14d - - xorl %r11d,%r15d - rorl $6,%r13d - movl %r11d,%r9d - - andl %r15d,%edi - rorl $2,%r14d - addl %r13d,%r12d - - xorl %edi,%r9d - addl %r12d,%ebx - addl %r12d,%r9d - - leaq 4(%rbp),%rbp - addl %r14d,%r9d - movl 12(%rsi),%r12d - movl %ebx,%r13d - movl %r9d,%r14d - bswapl %r12d - rorl $14,%r13d - movl %ecx,%edi - - xorl %ebx,%r13d - rorl $9,%r14d - xorl %edx,%edi - - movl %r12d,12(%rsp) - xorl %r9d,%r14d - andl %ebx,%edi - - rorl $5,%r13d - addl %r8d,%r12d - xorl %edx,%edi - - rorl $11,%r14d - xorl %ebx,%r13d - addl %edi,%r12d - - movl %r9d,%edi - addl (%rbp),%r12d - xorl %r9d,%r14d - - xorl %r10d,%edi - rorl $6,%r13d - movl %r10d,%r8d - - andl %edi,%r15d - rorl $2,%r14d - addl %r13d,%r12d - - xorl %r15d,%r8d - addl %r12d,%eax - addl %r12d,%r8d - - leaq 20(%rbp),%rbp - addl %r14d,%r8d - movl 16(%rsi),%r12d - movl %eax,%r13d - movl %r8d,%r14d - bswapl %r12d - rorl $14,%r13d - movl %ebx,%r15d - - xorl %eax,%r13d - rorl $9,%r14d - xorl %ecx,%r15d - - movl %r12d,16(%rsp) - xorl %r8d,%r14d - andl %eax,%r15d - - rorl $5,%r13d - addl %edx,%r12d - xorl %ecx,%r15d - - rorl $11,%r14d - xorl %eax,%r13d - addl %r15d,%r12d - - movl %r8d,%r15d - addl (%rbp),%r12d - xorl %r8d,%r14d - - xorl %r9d,%r15d - rorl $6,%r13d - movl %r9d,%edx - - andl %r15d,%edi - rorl $2,%r14d - addl %r13d,%r12d - - xorl %edi,%edx - addl %r12d,%r11d - addl %r12d,%edx - - leaq 4(%rbp),%rbp - addl %r14d,%edx - movl 20(%rsi),%r12d - movl %r11d,%r13d - movl %edx,%r14d - bswapl %r12d - rorl $14,%r13d - movl %eax,%edi - - xorl %r11d,%r13d - rorl $9,%r14d - xorl %ebx,%edi - - movl %r12d,20(%rsp) - xorl %edx,%r14d - andl %r11d,%edi - - rorl $5,%r13d - addl %ecx,%r12d - xorl %ebx,%edi - - rorl $11,%r14d - xorl %r11d,%r13d - addl %edi,%r12d - - movl %edx,%edi - addl (%rbp),%r12d - xorl %edx,%r14d - - xorl %r8d,%edi - rorl $6,%r13d - movl %r8d,%ecx - - andl %edi,%r15d - rorl $2,%r14d - addl %r13d,%r12d - - xorl %r15d,%ecx - addl %r12d,%r10d - addl %r12d,%ecx - - leaq 4(%rbp),%rbp - addl %r14d,%ecx - movl 24(%rsi),%r12d - movl %r10d,%r13d - movl %ecx,%r14d - bswapl %r12d - rorl $14,%r13d - movl %r11d,%r15d - - xorl %r10d,%r13d - rorl $9,%r14d - xorl %eax,%r15d - - movl %r12d,24(%rsp) - xorl %ecx,%r14d - andl %r10d,%r15d - - rorl $5,%r13d - addl %ebx,%r12d - xorl %eax,%r15d - - rorl $11,%r14d - xorl %r10d,%r13d - addl %r15d,%r12d - - movl %ecx,%r15d - addl (%rbp),%r12d - xorl %ecx,%r14d - - xorl %edx,%r15d - rorl $6,%r13d - movl %edx,%ebx - - andl %r15d,%edi - rorl $2,%r14d - addl %r13d,%r12d - - xorl %edi,%ebx - addl %r12d,%r9d - addl %r12d,%ebx - - leaq 4(%rbp),%rbp - addl %r14d,%ebx - movl 28(%rsi),%r12d - movl %r9d,%r13d - movl %ebx,%r14d - bswapl %r12d - rorl $14,%r13d - movl %r10d,%edi - - xorl %r9d,%r13d - rorl $9,%r14d - xorl %r11d,%edi - - movl %r12d,28(%rsp) - xorl %ebx,%r14d - andl %r9d,%edi - - rorl $5,%r13d - addl %eax,%r12d - xorl %r11d,%edi - - rorl $11,%r14d - xorl %r9d,%r13d - addl %edi,%r12d - - movl %ebx,%edi - addl (%rbp),%r12d - xorl %ebx,%r14d - - xorl %ecx,%edi - rorl $6,%r13d - movl %ecx,%eax - - andl %edi,%r15d - rorl $2,%r14d - addl %r13d,%r12d - - xorl %r15d,%eax - addl %r12d,%r8d - addl %r12d,%eax - - leaq 20(%rbp),%rbp - addl %r14d,%eax - movl 32(%rsi),%r12d - movl %r8d,%r13d - movl %eax,%r14d - bswapl %r12d - rorl $14,%r13d - movl %r9d,%r15d - - xorl %r8d,%r13d - rorl $9,%r14d - xorl %r10d,%r15d - - movl %r12d,32(%rsp) - xorl %eax,%r14d - andl %r8d,%r15d - - rorl $5,%r13d - addl %r11d,%r12d - xorl %r10d,%r15d - - rorl $11,%r14d - xorl %r8d,%r13d - addl %r15d,%r12d - - movl %eax,%r15d - addl (%rbp),%r12d - xorl %eax,%r14d - - xorl %ebx,%r15d - rorl $6,%r13d - movl %ebx,%r11d - - andl %r15d,%edi - rorl $2,%r14d - addl %r13d,%r12d - - xorl %edi,%r11d - addl %r12d,%edx - addl %r12d,%r11d - - leaq 4(%rbp),%rbp - addl %r14d,%r11d - movl 36(%rsi),%r12d - movl %edx,%r13d - movl %r11d,%r14d - bswapl %r12d - rorl $14,%r13d - movl %r8d,%edi - - xorl %edx,%r13d - rorl $9,%r14d - xorl %r9d,%edi - - movl %r12d,36(%rsp) - xorl %r11d,%r14d - andl %edx,%edi - - rorl $5,%r13d - addl %r10d,%r12d - xorl %r9d,%edi - - rorl $11,%r14d - xorl %edx,%r13d - addl %edi,%r12d - - movl %r11d,%edi - addl (%rbp),%r12d - xorl %r11d,%r14d - - xorl %eax,%edi - rorl $6,%r13d - movl %eax,%r10d - - andl %edi,%r15d - rorl $2,%r14d - addl %r13d,%r12d - - xorl %r15d,%r10d - addl %r12d,%ecx - addl %r12d,%r10d - - leaq 4(%rbp),%rbp - addl %r14d,%r10d - movl 40(%rsi),%r12d - movl %ecx,%r13d - movl %r10d,%r14d - bswapl %r12d - rorl $14,%r13d - movl %edx,%r15d - - xorl %ecx,%r13d - rorl $9,%r14d - xorl %r8d,%r15d - - movl %r12d,40(%rsp) - xorl %r10d,%r14d - andl %ecx,%r15d - - rorl $5,%r13d - addl %r9d,%r12d - xorl %r8d,%r15d - - rorl $11,%r14d - xorl %ecx,%r13d - addl %r15d,%r12d - - movl %r10d,%r15d - addl (%rbp),%r12d - xorl %r10d,%r14d - - xorl %r11d,%r15d - rorl $6,%r13d - movl %r11d,%r9d - - andl %r15d,%edi - rorl $2,%r14d - addl %r13d,%r12d - - xorl %edi,%r9d - addl %r12d,%ebx - addl %r12d,%r9d - - leaq 4(%rbp),%rbp - addl %r14d,%r9d - movl 44(%rsi),%r12d - movl %ebx,%r13d - movl %r9d,%r14d - bswapl %r12d - rorl $14,%r13d - movl %ecx,%edi - - xorl %ebx,%r13d - rorl $9,%r14d - xorl %edx,%edi - - movl %r12d,44(%rsp) - xorl %r9d,%r14d - andl %ebx,%edi - - rorl $5,%r13d - addl %r8d,%r12d - xorl %edx,%edi - - rorl $11,%r14d - xorl %ebx,%r13d - addl %edi,%r12d - - movl %r9d,%edi - addl (%rbp),%r12d - xorl %r9d,%r14d - - xorl %r10d,%edi - rorl $6,%r13d - movl %r10d,%r8d - - andl %edi,%r15d - rorl $2,%r14d - addl %r13d,%r12d - - xorl %r15d,%r8d - addl %r12d,%eax - addl %r12d,%r8d - - leaq 20(%rbp),%rbp - addl %r14d,%r8d - movl 48(%rsi),%r12d - movl %eax,%r13d - movl %r8d,%r14d - bswapl %r12d - rorl $14,%r13d - movl %ebx,%r15d - - xorl %eax,%r13d - rorl $9,%r14d - xorl %ecx,%r15d - - movl %r12d,48(%rsp) - xorl %r8d,%r14d - andl %eax,%r15d - - rorl $5,%r13d - addl %edx,%r12d - xorl %ecx,%r15d - - rorl $11,%r14d - xorl %eax,%r13d - addl %r15d,%r12d - - movl %r8d,%r15d - addl (%rbp),%r12d - xorl %r8d,%r14d - - xorl %r9d,%r15d - rorl $6,%r13d - movl %r9d,%edx - - andl %r15d,%edi - rorl $2,%r14d - addl %r13d,%r12d - - xorl %edi,%edx - addl %r12d,%r11d - addl %r12d,%edx - - leaq 4(%rbp),%rbp - addl %r14d,%edx - movl 52(%rsi),%r12d - movl %r11d,%r13d - movl %edx,%r14d - bswapl %r12d - rorl $14,%r13d - movl %eax,%edi - - xorl %r11d,%r13d - rorl $9,%r14d - xorl %ebx,%edi - - movl %r12d,52(%rsp) - xorl %edx,%r14d - andl %r11d,%edi - - rorl $5,%r13d - addl %ecx,%r12d - xorl %ebx,%edi - - rorl $11,%r14d - xorl %r11d,%r13d - addl %edi,%r12d - - movl %edx,%edi - addl (%rbp),%r12d - xorl %edx,%r14d - - xorl %r8d,%edi - rorl $6,%r13d - movl %r8d,%ecx - - andl %edi,%r15d - rorl $2,%r14d - addl %r13d,%r12d - - xorl %r15d,%ecx - addl %r12d,%r10d - addl %r12d,%ecx - - leaq 4(%rbp),%rbp - addl %r14d,%ecx - movl 56(%rsi),%r12d - movl %r10d,%r13d - movl %ecx,%r14d - bswapl %r12d - rorl $14,%r13d - movl %r11d,%r15d - - xorl %r10d,%r13d - rorl $9,%r14d - xorl %eax,%r15d - - movl %r12d,56(%rsp) - xorl %ecx,%r14d - andl %r10d,%r15d - - rorl $5,%r13d - addl %ebx,%r12d - xorl %eax,%r15d - - rorl $11,%r14d - xorl %r10d,%r13d - addl %r15d,%r12d - - movl %ecx,%r15d - addl (%rbp),%r12d - xorl %ecx,%r14d - - xorl %edx,%r15d - rorl $6,%r13d - movl %edx,%ebx - - andl %r15d,%edi - rorl $2,%r14d - addl %r13d,%r12d - - xorl %edi,%ebx - addl %r12d,%r9d - addl %r12d,%ebx - - leaq 4(%rbp),%rbp - addl %r14d,%ebx - movl 60(%rsi),%r12d - movl %r9d,%r13d - movl %ebx,%r14d - bswapl %r12d - rorl $14,%r13d - movl %r10d,%edi - - xorl %r9d,%r13d - rorl $9,%r14d - xorl %r11d,%edi - - movl %r12d,60(%rsp) - xorl %ebx,%r14d - andl %r9d,%edi - - rorl $5,%r13d - addl %eax,%r12d - xorl %r11d,%edi - - rorl $11,%r14d - xorl %r9d,%r13d - addl %edi,%r12d - - movl %ebx,%edi - addl (%rbp),%r12d - xorl %ebx,%r14d - - xorl %ecx,%edi - rorl $6,%r13d - movl %ecx,%eax - - andl %edi,%r15d - rorl $2,%r14d - addl %r13d,%r12d - - xorl %r15d,%eax - addl %r12d,%r8d - addl %r12d,%eax - - leaq 20(%rbp),%rbp - jmp L$rounds_16_xx -.p2align 4 -L$rounds_16_xx: - movl 4(%rsp),%r13d - movl 56(%rsp),%r15d - - movl %r13d,%r12d - rorl $11,%r13d - addl %r14d,%eax - movl %r15d,%r14d - rorl $2,%r15d - - xorl %r12d,%r13d - shrl $3,%r12d - rorl $7,%r13d - xorl %r14d,%r15d - shrl $10,%r14d - - rorl $17,%r15d - xorl %r13d,%r12d - xorl %r14d,%r15d - addl 36(%rsp),%r12d - - addl 0(%rsp),%r12d - movl %r8d,%r13d - addl %r15d,%r12d - movl %eax,%r14d - rorl $14,%r13d - movl %r9d,%r15d - - xorl %r8d,%r13d - rorl $9,%r14d - xorl %r10d,%r15d - - movl %r12d,0(%rsp) - xorl %eax,%r14d - andl %r8d,%r15d - - rorl $5,%r13d - addl %r11d,%r12d - xorl %r10d,%r15d - - rorl $11,%r14d - xorl %r8d,%r13d - addl %r15d,%r12d - - movl %eax,%r15d - addl (%rbp),%r12d - xorl %eax,%r14d - - xorl %ebx,%r15d - rorl $6,%r13d - movl %ebx,%r11d - - andl %r15d,%edi - rorl $2,%r14d - addl %r13d,%r12d - - xorl %edi,%r11d - addl %r12d,%edx - addl %r12d,%r11d - - leaq 4(%rbp),%rbp - movl 8(%rsp),%r13d - movl 60(%rsp),%edi - - movl %r13d,%r12d - rorl $11,%r13d - addl %r14d,%r11d - movl %edi,%r14d - rorl $2,%edi - - xorl %r12d,%r13d - shrl $3,%r12d - rorl $7,%r13d - xorl %r14d,%edi - shrl $10,%r14d - - rorl $17,%edi - xorl %r13d,%r12d - xorl %r14d,%edi - addl 40(%rsp),%r12d - - addl 4(%rsp),%r12d - movl %edx,%r13d - addl %edi,%r12d - movl %r11d,%r14d - rorl $14,%r13d - movl %r8d,%edi - - xorl %edx,%r13d - rorl $9,%r14d - xorl %r9d,%edi - - movl %r12d,4(%rsp) - xorl %r11d,%r14d - andl %edx,%edi - - rorl $5,%r13d - addl %r10d,%r12d - xorl %r9d,%edi - - rorl $11,%r14d - xorl %edx,%r13d - addl %edi,%r12d - - movl %r11d,%edi - addl (%rbp),%r12d - xorl %r11d,%r14d - - xorl %eax,%edi - rorl $6,%r13d - movl %eax,%r10d - - andl %edi,%r15d - rorl $2,%r14d - addl %r13d,%r12d - - xorl %r15d,%r10d - addl %r12d,%ecx - addl %r12d,%r10d - - leaq 4(%rbp),%rbp - movl 12(%rsp),%r13d - movl 0(%rsp),%r15d - - movl %r13d,%r12d - rorl $11,%r13d - addl %r14d,%r10d - movl %r15d,%r14d - rorl $2,%r15d - - xorl %r12d,%r13d - shrl $3,%r12d - rorl $7,%r13d - xorl %r14d,%r15d - shrl $10,%r14d - - rorl $17,%r15d - xorl %r13d,%r12d - xorl %r14d,%r15d - addl 44(%rsp),%r12d - - addl 8(%rsp),%r12d - movl %ecx,%r13d - addl %r15d,%r12d - movl %r10d,%r14d - rorl $14,%r13d - movl %edx,%r15d - - xorl %ecx,%r13d - rorl $9,%r14d - xorl %r8d,%r15d - - movl %r12d,8(%rsp) - xorl %r10d,%r14d - andl %ecx,%r15d - - rorl $5,%r13d - addl %r9d,%r12d - xorl %r8d,%r15d - - rorl $11,%r14d - xorl %ecx,%r13d - addl %r15d,%r12d - - movl %r10d,%r15d - addl (%rbp),%r12d - xorl %r10d,%r14d - - xorl %r11d,%r15d - rorl $6,%r13d - movl %r11d,%r9d - - andl %r15d,%edi - rorl $2,%r14d - addl %r13d,%r12d - - xorl %edi,%r9d - addl %r12d,%ebx - addl %r12d,%r9d - - leaq 4(%rbp),%rbp - movl 16(%rsp),%r13d - movl 4(%rsp),%edi - - movl %r13d,%r12d - rorl $11,%r13d - addl %r14d,%r9d - movl %edi,%r14d - rorl $2,%edi - - xorl %r12d,%r13d - shrl $3,%r12d - rorl $7,%r13d - xorl %r14d,%edi - shrl $10,%r14d - - rorl $17,%edi - xorl %r13d,%r12d - xorl %r14d,%edi - addl 48(%rsp),%r12d - - addl 12(%rsp),%r12d - movl %ebx,%r13d - addl %edi,%r12d - movl %r9d,%r14d - rorl $14,%r13d - movl %ecx,%edi - - xorl %ebx,%r13d - rorl $9,%r14d - xorl %edx,%edi - - movl %r12d,12(%rsp) - xorl %r9d,%r14d - andl %ebx,%edi - - rorl $5,%r13d - addl %r8d,%r12d - xorl %edx,%edi - - rorl $11,%r14d - xorl %ebx,%r13d - addl %edi,%r12d - - movl %r9d,%edi - addl (%rbp),%r12d - xorl %r9d,%r14d - - xorl %r10d,%edi - rorl $6,%r13d - movl %r10d,%r8d - - andl %edi,%r15d - rorl $2,%r14d - addl %r13d,%r12d - - xorl %r15d,%r8d - addl %r12d,%eax - addl %r12d,%r8d - - leaq 20(%rbp),%rbp - movl 20(%rsp),%r13d - movl 8(%rsp),%r15d - - movl %r13d,%r12d - rorl $11,%r13d - addl %r14d,%r8d - movl %r15d,%r14d - rorl $2,%r15d - - xorl %r12d,%r13d - shrl $3,%r12d - rorl $7,%r13d - xorl %r14d,%r15d - shrl $10,%r14d - - rorl $17,%r15d - xorl %r13d,%r12d - xorl %r14d,%r15d - addl 52(%rsp),%r12d - - addl 16(%rsp),%r12d - movl %eax,%r13d - addl %r15d,%r12d - movl %r8d,%r14d - rorl $14,%r13d - movl %ebx,%r15d - - xorl %eax,%r13d - rorl $9,%r14d - xorl %ecx,%r15d - - movl %r12d,16(%rsp) - xorl %r8d,%r14d - andl %eax,%r15d - - rorl $5,%r13d - addl %edx,%r12d - xorl %ecx,%r15d - - rorl $11,%r14d - xorl %eax,%r13d - addl %r15d,%r12d - - movl %r8d,%r15d - addl (%rbp),%r12d - xorl %r8d,%r14d - - xorl %r9d,%r15d - rorl $6,%r13d - movl %r9d,%edx - - andl %r15d,%edi - rorl $2,%r14d - addl %r13d,%r12d - - xorl %edi,%edx - addl %r12d,%r11d - addl %r12d,%edx - - leaq 4(%rbp),%rbp - movl 24(%rsp),%r13d - movl 12(%rsp),%edi - - movl %r13d,%r12d - rorl $11,%r13d - addl %r14d,%edx - movl %edi,%r14d - rorl $2,%edi - - xorl %r12d,%r13d - shrl $3,%r12d - rorl $7,%r13d - xorl %r14d,%edi - shrl $10,%r14d - - rorl $17,%edi - xorl %r13d,%r12d - xorl %r14d,%edi - addl 56(%rsp),%r12d - - addl 20(%rsp),%r12d - movl %r11d,%r13d - addl %edi,%r12d - movl %edx,%r14d - rorl $14,%r13d - movl %eax,%edi - - xorl %r11d,%r13d - rorl $9,%r14d - xorl %ebx,%edi - - movl %r12d,20(%rsp) - xorl %edx,%r14d - andl %r11d,%edi - - rorl $5,%r13d - addl %ecx,%r12d - xorl %ebx,%edi - - rorl $11,%r14d - xorl %r11d,%r13d - addl %edi,%r12d - - movl %edx,%edi - addl (%rbp),%r12d - xorl %edx,%r14d - - xorl %r8d,%edi - rorl $6,%r13d - movl %r8d,%ecx - - andl %edi,%r15d - rorl $2,%r14d - addl %r13d,%r12d - - xorl %r15d,%ecx - addl %r12d,%r10d - addl %r12d,%ecx - - leaq 4(%rbp),%rbp - movl 28(%rsp),%r13d - movl 16(%rsp),%r15d - - movl %r13d,%r12d - rorl $11,%r13d - addl %r14d,%ecx - movl %r15d,%r14d - rorl $2,%r15d - - xorl %r12d,%r13d - shrl $3,%r12d - rorl $7,%r13d - xorl %r14d,%r15d - shrl $10,%r14d - - rorl $17,%r15d - xorl %r13d,%r12d - xorl %r14d,%r15d - addl 60(%rsp),%r12d - - addl 24(%rsp),%r12d - movl %r10d,%r13d - addl %r15d,%r12d - movl %ecx,%r14d - rorl $14,%r13d - movl %r11d,%r15d - - xorl %r10d,%r13d - rorl $9,%r14d - xorl %eax,%r15d - - movl %r12d,24(%rsp) - xorl %ecx,%r14d - andl %r10d,%r15d - - rorl $5,%r13d - addl %ebx,%r12d - xorl %eax,%r15d - - rorl $11,%r14d - xorl %r10d,%r13d - addl %r15d,%r12d - - movl %ecx,%r15d - addl (%rbp),%r12d - xorl %ecx,%r14d - - xorl %edx,%r15d - rorl $6,%r13d - movl %edx,%ebx - - andl %r15d,%edi - rorl $2,%r14d - addl %r13d,%r12d - - xorl %edi,%ebx - addl %r12d,%r9d - addl %r12d,%ebx - - leaq 4(%rbp),%rbp - movl 32(%rsp),%r13d - movl 20(%rsp),%edi - - movl %r13d,%r12d - rorl $11,%r13d - addl %r14d,%ebx - movl %edi,%r14d - rorl $2,%edi - - xorl %r12d,%r13d - shrl $3,%r12d - rorl $7,%r13d - xorl %r14d,%edi - shrl $10,%r14d - - rorl $17,%edi - xorl %r13d,%r12d - xorl %r14d,%edi - addl 0(%rsp),%r12d - - addl 28(%rsp),%r12d - movl %r9d,%r13d - addl %edi,%r12d - movl %ebx,%r14d - rorl $14,%r13d - movl %r10d,%edi - - xorl %r9d,%r13d - rorl $9,%r14d - xorl %r11d,%edi - - movl %r12d,28(%rsp) - xorl %ebx,%r14d - andl %r9d,%edi - - rorl $5,%r13d - addl %eax,%r12d - xorl %r11d,%edi - - rorl $11,%r14d - xorl %r9d,%r13d - addl %edi,%r12d - - movl %ebx,%edi - addl (%rbp),%r12d - xorl %ebx,%r14d - - xorl %ecx,%edi - rorl $6,%r13d - movl %ecx,%eax - - andl %edi,%r15d - rorl $2,%r14d - addl %r13d,%r12d - - xorl %r15d,%eax - addl %r12d,%r8d - addl %r12d,%eax - - leaq 20(%rbp),%rbp - movl 36(%rsp),%r13d - movl 24(%rsp),%r15d - - movl %r13d,%r12d - rorl $11,%r13d - addl %r14d,%eax - movl %r15d,%r14d - rorl $2,%r15d - - xorl %r12d,%r13d - shrl $3,%r12d - rorl $7,%r13d - xorl %r14d,%r15d - shrl $10,%r14d - - rorl $17,%r15d - xorl %r13d,%r12d - xorl %r14d,%r15d - addl 4(%rsp),%r12d - - addl 32(%rsp),%r12d - movl %r8d,%r13d - addl %r15d,%r12d - movl %eax,%r14d - rorl $14,%r13d - movl %r9d,%r15d - - xorl %r8d,%r13d - rorl $9,%r14d - xorl %r10d,%r15d - - movl %r12d,32(%rsp) - xorl %eax,%r14d - andl %r8d,%r15d - - rorl $5,%r13d - addl %r11d,%r12d - xorl %r10d,%r15d - - rorl $11,%r14d - xorl %r8d,%r13d - addl %r15d,%r12d - - movl %eax,%r15d - addl (%rbp),%r12d - xorl %eax,%r14d - - xorl %ebx,%r15d - rorl $6,%r13d - movl %ebx,%r11d - - andl %r15d,%edi - rorl $2,%r14d - addl %r13d,%r12d - - xorl %edi,%r11d - addl %r12d,%edx - addl %r12d,%r11d - - leaq 4(%rbp),%rbp - movl 40(%rsp),%r13d - movl 28(%rsp),%edi - - movl %r13d,%r12d - rorl $11,%r13d - addl %r14d,%r11d - movl %edi,%r14d - rorl $2,%edi - - xorl %r12d,%r13d - shrl $3,%r12d - rorl $7,%r13d - xorl %r14d,%edi - shrl $10,%r14d - - rorl $17,%edi - xorl %r13d,%r12d - xorl %r14d,%edi - addl 8(%rsp),%r12d - - addl 36(%rsp),%r12d - movl %edx,%r13d - addl %edi,%r12d - movl %r11d,%r14d - rorl $14,%r13d - movl %r8d,%edi - - xorl %edx,%r13d - rorl $9,%r14d - xorl %r9d,%edi - - movl %r12d,36(%rsp) - xorl %r11d,%r14d - andl %edx,%edi - - rorl $5,%r13d - addl %r10d,%r12d - xorl %r9d,%edi - - rorl $11,%r14d - xorl %edx,%r13d - addl %edi,%r12d - - movl %r11d,%edi - addl (%rbp),%r12d - xorl %r11d,%r14d - - xorl %eax,%edi - rorl $6,%r13d - movl %eax,%r10d - - andl %edi,%r15d - rorl $2,%r14d - addl %r13d,%r12d - - xorl %r15d,%r10d - addl %r12d,%ecx - addl %r12d,%r10d - - leaq 4(%rbp),%rbp - movl 44(%rsp),%r13d - movl 32(%rsp),%r15d - - movl %r13d,%r12d - rorl $11,%r13d - addl %r14d,%r10d - movl %r15d,%r14d - rorl $2,%r15d - - xorl %r12d,%r13d - shrl $3,%r12d - rorl $7,%r13d - xorl %r14d,%r15d - shrl $10,%r14d - - rorl $17,%r15d - xorl %r13d,%r12d - xorl %r14d,%r15d - addl 12(%rsp),%r12d - - addl 40(%rsp),%r12d - movl %ecx,%r13d - addl %r15d,%r12d - movl %r10d,%r14d - rorl $14,%r13d - movl %edx,%r15d - - xorl %ecx,%r13d - rorl $9,%r14d - xorl %r8d,%r15d - - movl %r12d,40(%rsp) - xorl %r10d,%r14d - andl %ecx,%r15d - - rorl $5,%r13d - addl %r9d,%r12d - xorl %r8d,%r15d - - rorl $11,%r14d - xorl %ecx,%r13d - addl %r15d,%r12d - - movl %r10d,%r15d - addl (%rbp),%r12d - xorl %r10d,%r14d - - xorl %r11d,%r15d - rorl $6,%r13d - movl %r11d,%r9d - - andl %r15d,%edi - rorl $2,%r14d - addl %r13d,%r12d - - xorl %edi,%r9d - addl %r12d,%ebx - addl %r12d,%r9d - - leaq 4(%rbp),%rbp - movl 48(%rsp),%r13d - movl 36(%rsp),%edi - - movl %r13d,%r12d - rorl $11,%r13d - addl %r14d,%r9d - movl %edi,%r14d - rorl $2,%edi - - xorl %r12d,%r13d - shrl $3,%r12d - rorl $7,%r13d - xorl %r14d,%edi - shrl $10,%r14d - - rorl $17,%edi - xorl %r13d,%r12d - xorl %r14d,%edi - addl 16(%rsp),%r12d - - addl 44(%rsp),%r12d - movl %ebx,%r13d - addl %edi,%r12d - movl %r9d,%r14d - rorl $14,%r13d - movl %ecx,%edi - - xorl %ebx,%r13d - rorl $9,%r14d - xorl %edx,%edi - - movl %r12d,44(%rsp) - xorl %r9d,%r14d - andl %ebx,%edi - - rorl $5,%r13d - addl %r8d,%r12d - xorl %edx,%edi - - rorl $11,%r14d - xorl %ebx,%r13d - addl %edi,%r12d - - movl %r9d,%edi - addl (%rbp),%r12d - xorl %r9d,%r14d - - xorl %r10d,%edi - rorl $6,%r13d - movl %r10d,%r8d - - andl %edi,%r15d - rorl $2,%r14d - addl %r13d,%r12d - - xorl %r15d,%r8d - addl %r12d,%eax - addl %r12d,%r8d - - leaq 20(%rbp),%rbp - movl 52(%rsp),%r13d - movl 40(%rsp),%r15d - - movl %r13d,%r12d - rorl $11,%r13d - addl %r14d,%r8d - movl %r15d,%r14d - rorl $2,%r15d - - xorl %r12d,%r13d - shrl $3,%r12d - rorl $7,%r13d - xorl %r14d,%r15d - shrl $10,%r14d - - rorl $17,%r15d - xorl %r13d,%r12d - xorl %r14d,%r15d - addl 20(%rsp),%r12d - - addl 48(%rsp),%r12d - movl %eax,%r13d - addl %r15d,%r12d - movl %r8d,%r14d - rorl $14,%r13d - movl %ebx,%r15d - - xorl %eax,%r13d - rorl $9,%r14d - xorl %ecx,%r15d - - movl %r12d,48(%rsp) - xorl %r8d,%r14d - andl %eax,%r15d - - rorl $5,%r13d - addl %edx,%r12d - xorl %ecx,%r15d - - rorl $11,%r14d - xorl %eax,%r13d - addl %r15d,%r12d - - movl %r8d,%r15d - addl (%rbp),%r12d - xorl %r8d,%r14d - - xorl %r9d,%r15d - rorl $6,%r13d - movl %r9d,%edx - - andl %r15d,%edi - rorl $2,%r14d - addl %r13d,%r12d - - xorl %edi,%edx - addl %r12d,%r11d - addl %r12d,%edx - - leaq 4(%rbp),%rbp - movl 56(%rsp),%r13d - movl 44(%rsp),%edi - - movl %r13d,%r12d - rorl $11,%r13d - addl %r14d,%edx - movl %edi,%r14d - rorl $2,%edi - - xorl %r12d,%r13d - shrl $3,%r12d - rorl $7,%r13d - xorl %r14d,%edi - shrl $10,%r14d - - rorl $17,%edi - xorl %r13d,%r12d - xorl %r14d,%edi - addl 24(%rsp),%r12d - - addl 52(%rsp),%r12d - movl %r11d,%r13d - addl %edi,%r12d - movl %edx,%r14d - rorl $14,%r13d - movl %eax,%edi - - xorl %r11d,%r13d - rorl $9,%r14d - xorl %ebx,%edi - - movl %r12d,52(%rsp) - xorl %edx,%r14d - andl %r11d,%edi - - rorl $5,%r13d - addl %ecx,%r12d - xorl %ebx,%edi - - rorl $11,%r14d - xorl %r11d,%r13d - addl %edi,%r12d - - movl %edx,%edi - addl (%rbp),%r12d - xorl %edx,%r14d - - xorl %r8d,%edi - rorl $6,%r13d - movl %r8d,%ecx - - andl %edi,%r15d - rorl $2,%r14d - addl %r13d,%r12d - - xorl %r15d,%ecx - addl %r12d,%r10d - addl %r12d,%ecx - - leaq 4(%rbp),%rbp - movl 60(%rsp),%r13d - movl 48(%rsp),%r15d - - movl %r13d,%r12d - rorl $11,%r13d - addl %r14d,%ecx - movl %r15d,%r14d - rorl $2,%r15d - - xorl %r12d,%r13d - shrl $3,%r12d - rorl $7,%r13d - xorl %r14d,%r15d - shrl $10,%r14d - - rorl $17,%r15d - xorl %r13d,%r12d - xorl %r14d,%r15d - addl 28(%rsp),%r12d - - addl 56(%rsp),%r12d - movl %r10d,%r13d - addl %r15d,%r12d - movl %ecx,%r14d - rorl $14,%r13d - movl %r11d,%r15d - - xorl %r10d,%r13d - rorl $9,%r14d - xorl %eax,%r15d - - movl %r12d,56(%rsp) - xorl %ecx,%r14d - andl %r10d,%r15d - - rorl $5,%r13d - addl %ebx,%r12d - xorl %eax,%r15d - - rorl $11,%r14d - xorl %r10d,%r13d - addl %r15d,%r12d - - movl %ecx,%r15d - addl (%rbp),%r12d - xorl %ecx,%r14d - - xorl %edx,%r15d - rorl $6,%r13d - movl %edx,%ebx - - andl %r15d,%edi - rorl $2,%r14d - addl %r13d,%r12d - - xorl %edi,%ebx - addl %r12d,%r9d - addl %r12d,%ebx - - leaq 4(%rbp),%rbp - movl 0(%rsp),%r13d - movl 52(%rsp),%edi - - movl %r13d,%r12d - rorl $11,%r13d - addl %r14d,%ebx - movl %edi,%r14d - rorl $2,%edi - - xorl %r12d,%r13d - shrl $3,%r12d - rorl $7,%r13d - xorl %r14d,%edi - shrl $10,%r14d - - rorl $17,%edi - xorl %r13d,%r12d - xorl %r14d,%edi - addl 32(%rsp),%r12d - - addl 60(%rsp),%r12d - movl %r9d,%r13d - addl %edi,%r12d - movl %ebx,%r14d - rorl $14,%r13d - movl %r10d,%edi - - xorl %r9d,%r13d - rorl $9,%r14d - xorl %r11d,%edi - - movl %r12d,60(%rsp) - xorl %ebx,%r14d - andl %r9d,%edi - - rorl $5,%r13d - addl %eax,%r12d - xorl %r11d,%edi - - rorl $11,%r14d - xorl %r9d,%r13d - addl %edi,%r12d - - movl %ebx,%edi - addl (%rbp),%r12d - xorl %ebx,%r14d - - xorl %ecx,%edi - rorl $6,%r13d - movl %ecx,%eax - - andl %edi,%r15d - rorl $2,%r14d - addl %r13d,%r12d - - xorl %r15d,%eax - addl %r12d,%r8d - addl %r12d,%eax - - leaq 20(%rbp),%rbp - cmpb $0,3(%rbp) - jnz L$rounds_16_xx - - movq 64+0(%rsp),%rdi - addl %r14d,%eax - leaq 64(%rsi),%rsi - - addl 0(%rdi),%eax - addl 4(%rdi),%ebx - addl 8(%rdi),%ecx - addl 12(%rdi),%edx - addl 16(%rdi),%r8d - addl 20(%rdi),%r9d - addl 24(%rdi),%r10d - addl 28(%rdi),%r11d - - cmpq 64+16(%rsp),%rsi - - movl %eax,0(%rdi) - movl %ebx,4(%rdi) - movl %ecx,8(%rdi) - movl %edx,12(%rdi) - movl %r8d,16(%rdi) - movl %r9d,20(%rdi) - movl %r10d,24(%rdi) - movl %r11d,28(%rdi) - jb L$loop - - movq 88(%rsp),%rsi - - movq -48(%rsi),%r15 - - movq -40(%rsi),%r14 - - movq -32(%rsi),%r13 - - movq -24(%rsi),%r12 - - movq -16(%rsi),%rbp - - movq -8(%rsi),%rbx - - leaq (%rsi),%rsp - -L$epilogue: - .byte 0xf3,0xc3 - - -.p2align 6 - -K256: -.long 0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5 -.long 0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5 -.long 0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5 -.long 0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5 -.long 0xd807aa98,0x12835b01,0x243185be,0x550c7dc3 -.long 0xd807aa98,0x12835b01,0x243185be,0x550c7dc3 -.long 0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174 -.long 0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174 -.long 0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc -.long 0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc -.long 0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da -.long 0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da -.long 0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7 -.long 0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7 -.long 0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967 -.long 0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967 -.long 0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13 -.long 0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13 -.long 0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85 -.long 0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85 -.long 0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3 -.long 0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3 -.long 0xd192e819,0xd6990624,0xf40e3585,0x106aa070 -.long 0xd192e819,0xd6990624,0xf40e3585,0x106aa070 -.long 0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5 -.long 0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5 -.long 0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3 -.long 0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3 -.long 0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208 -.long 0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208 -.long 0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2 -.long 0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2 - -.long 0x00010203,0x04050607,0x08090a0b,0x0c0d0e0f -.long 0x00010203,0x04050607,0x08090a0b,0x0c0d0e0f -.long 0x03020100,0x0b0a0908,0xffffffff,0xffffffff -.long 0x03020100,0x0b0a0908,0xffffffff,0xffffffff -.long 0xffffffff,0xffffffff,0x03020100,0x0b0a0908 -.long 0xffffffff,0xffffffff,0x03020100,0x0b0a0908 -.byte 83,72,65,50,53,54,32,98,108,111,99,107,32,116,114,97,110,115,102,111,114,109,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 - -.p2align 6 -GFp_sha256_block_data_order_ssse3: - -L$ssse3_shortcut: - movq %rsp,%rax - - pushq %rbx - - pushq %rbp - - pushq %r12 - - pushq %r13 - - pushq %r14 - - pushq %r15 - - shlq $4,%rdx - subq $96,%rsp - leaq (%rsi,%rdx,4),%rdx - andq $-64,%rsp - movq %rdi,64+0(%rsp) - movq %rsi,64+8(%rsp) - movq %rdx,64+16(%rsp) - movq %rax,88(%rsp) - -L$prologue_ssse3: - - movl 0(%rdi),%eax - movl 4(%rdi),%ebx - movl 8(%rdi),%ecx - movl 12(%rdi),%edx - movl 16(%rdi),%r8d - movl 20(%rdi),%r9d - movl 24(%rdi),%r10d - movl 28(%rdi),%r11d - - - jmp L$loop_ssse3 -.p2align 4 -L$loop_ssse3: - movdqa K256+512(%rip),%xmm7 - movdqu 0(%rsi),%xmm0 - movdqu 16(%rsi),%xmm1 - movdqu 32(%rsi),%xmm2 -.byte 102,15,56,0,199 - movdqu 48(%rsi),%xmm3 - leaq K256(%rip),%rbp -.byte 102,15,56,0,207 - movdqa 0(%rbp),%xmm4 - movdqa 32(%rbp),%xmm5 -.byte 102,15,56,0,215 - paddd %xmm0,%xmm4 - movdqa 64(%rbp),%xmm6 -.byte 102,15,56,0,223 - movdqa 96(%rbp),%xmm7 - paddd %xmm1,%xmm5 - paddd %xmm2,%xmm6 - paddd %xmm3,%xmm7 - movdqa %xmm4,0(%rsp) - movl %eax,%r14d - movdqa %xmm5,16(%rsp) - movl %ebx,%edi - movdqa %xmm6,32(%rsp) - xorl %ecx,%edi - movdqa %xmm7,48(%rsp) - movl %r8d,%r13d - jmp L$ssse3_00_47 - -.p2align 4 -L$ssse3_00_47: - subq $-128,%rbp - rorl $14,%r13d - movdqa %xmm1,%xmm4 - movl %r14d,%eax - movl %r9d,%r12d - movdqa %xmm3,%xmm7 - rorl $9,%r14d - xorl %r8d,%r13d - xorl %r10d,%r12d - rorl $5,%r13d - xorl %eax,%r14d -.byte 102,15,58,15,224,4 - andl %r8d,%r12d - xorl %r8d,%r13d -.byte 102,15,58,15,250,4 - addl 0(%rsp),%r11d - movl %eax,%r15d - xorl %r10d,%r12d - rorl $11,%r14d - movdqa %xmm4,%xmm5 - xorl %ebx,%r15d - addl %r12d,%r11d - movdqa %xmm4,%xmm6 - rorl $6,%r13d - andl %r15d,%edi - psrld $3,%xmm4 - xorl %eax,%r14d - addl %r13d,%r11d - xorl %ebx,%edi - paddd %xmm7,%xmm0 - rorl $2,%r14d - addl %r11d,%edx - psrld $7,%xmm6 - addl %edi,%r11d - movl %edx,%r13d - pshufd $250,%xmm3,%xmm7 - addl %r11d,%r14d - rorl $14,%r13d - pslld $14,%xmm5 - movl %r14d,%r11d - movl %r8d,%r12d - pxor %xmm6,%xmm4 - rorl $9,%r14d - xorl %edx,%r13d - xorl %r9d,%r12d - rorl $5,%r13d - psrld $11,%xmm6 - xorl %r11d,%r14d - pxor %xmm5,%xmm4 - andl %edx,%r12d - xorl %edx,%r13d - pslld $11,%xmm5 - addl 4(%rsp),%r10d - movl %r11d,%edi - pxor %xmm6,%xmm4 - xorl %r9d,%r12d - rorl $11,%r14d - movdqa %xmm7,%xmm6 - xorl %eax,%edi - addl %r12d,%r10d - pxor %xmm5,%xmm4 - rorl $6,%r13d - andl %edi,%r15d - xorl %r11d,%r14d - psrld $10,%xmm7 - addl %r13d,%r10d - xorl %eax,%r15d - paddd %xmm4,%xmm0 - rorl $2,%r14d - addl %r10d,%ecx - psrlq $17,%xmm6 - addl %r15d,%r10d - movl %ecx,%r13d - addl %r10d,%r14d - pxor %xmm6,%xmm7 - rorl $14,%r13d - movl %r14d,%r10d - movl %edx,%r12d - rorl $9,%r14d - psrlq $2,%xmm6 - xorl %ecx,%r13d - xorl %r8d,%r12d - pxor %xmm6,%xmm7 - rorl $5,%r13d - xorl %r10d,%r14d - andl %ecx,%r12d - pshufd $128,%xmm7,%xmm7 - xorl %ecx,%r13d - addl 8(%rsp),%r9d - movl %r10d,%r15d - psrldq $8,%xmm7 - xorl %r8d,%r12d - rorl $11,%r14d - xorl %r11d,%r15d - addl %r12d,%r9d - rorl $6,%r13d - paddd %xmm7,%xmm0 - andl %r15d,%edi - xorl %r10d,%r14d - addl %r13d,%r9d - pshufd $80,%xmm0,%xmm7 - xorl %r11d,%edi - rorl $2,%r14d - addl %r9d,%ebx - movdqa %xmm7,%xmm6 - addl %edi,%r9d - movl %ebx,%r13d - psrld $10,%xmm7 - addl %r9d,%r14d - rorl $14,%r13d - psrlq $17,%xmm6 - movl %r14d,%r9d - movl %ecx,%r12d - pxor %xmm6,%xmm7 - rorl $9,%r14d - xorl %ebx,%r13d - xorl %edx,%r12d - rorl $5,%r13d - xorl %r9d,%r14d - psrlq $2,%xmm6 - andl %ebx,%r12d - xorl %ebx,%r13d - addl 12(%rsp),%r8d - pxor %xmm6,%xmm7 - movl %r9d,%edi - xorl %edx,%r12d - rorl $11,%r14d - pshufd $8,%xmm7,%xmm7 - xorl %r10d,%edi - addl %r12d,%r8d - movdqa 0(%rbp),%xmm6 - rorl $6,%r13d - andl %edi,%r15d - pslldq $8,%xmm7 - xorl %r9d,%r14d - addl %r13d,%r8d - xorl %r10d,%r15d - paddd %xmm7,%xmm0 - rorl $2,%r14d - addl %r8d,%eax - addl %r15d,%r8d - paddd %xmm0,%xmm6 - movl %eax,%r13d - addl %r8d,%r14d - movdqa %xmm6,0(%rsp) - rorl $14,%r13d - movdqa %xmm2,%xmm4 - movl %r14d,%r8d - movl %ebx,%r12d - movdqa %xmm0,%xmm7 - rorl $9,%r14d - xorl %eax,%r13d - xorl %ecx,%r12d - rorl $5,%r13d - xorl %r8d,%r14d -.byte 102,15,58,15,225,4 - andl %eax,%r12d - xorl %eax,%r13d -.byte 102,15,58,15,251,4 - addl 16(%rsp),%edx - movl %r8d,%r15d - xorl %ecx,%r12d - rorl $11,%r14d - movdqa %xmm4,%xmm5 - xorl %r9d,%r15d - addl %r12d,%edx - movdqa %xmm4,%xmm6 - rorl $6,%r13d - andl %r15d,%edi - psrld $3,%xmm4 - xorl %r8d,%r14d - addl %r13d,%edx - xorl %r9d,%edi - paddd %xmm7,%xmm1 - rorl $2,%r14d - addl %edx,%r11d - psrld $7,%xmm6 - addl %edi,%edx - movl %r11d,%r13d - pshufd $250,%xmm0,%xmm7 - addl %edx,%r14d - rorl $14,%r13d - pslld $14,%xmm5 - movl %r14d,%edx - movl %eax,%r12d - pxor %xmm6,%xmm4 - rorl $9,%r14d - xorl %r11d,%r13d - xorl %ebx,%r12d - rorl $5,%r13d - psrld $11,%xmm6 - xorl %edx,%r14d - pxor %xmm5,%xmm4 - andl %r11d,%r12d - xorl %r11d,%r13d - pslld $11,%xmm5 - addl 20(%rsp),%ecx - movl %edx,%edi - pxor %xmm6,%xmm4 - xorl %ebx,%r12d - rorl $11,%r14d - movdqa %xmm7,%xmm6 - xorl %r8d,%edi - addl %r12d,%ecx - pxor %xmm5,%xmm4 - rorl $6,%r13d - andl %edi,%r15d - xorl %edx,%r14d - psrld $10,%xmm7 - addl %r13d,%ecx - xorl %r8d,%r15d - paddd %xmm4,%xmm1 - rorl $2,%r14d - addl %ecx,%r10d - psrlq $17,%xmm6 - addl %r15d,%ecx - movl %r10d,%r13d - addl %ecx,%r14d - pxor %xmm6,%xmm7 - rorl $14,%r13d - movl %r14d,%ecx - movl %r11d,%r12d - rorl $9,%r14d - psrlq $2,%xmm6 - xorl %r10d,%r13d - xorl %eax,%r12d - pxor %xmm6,%xmm7 - rorl $5,%r13d - xorl %ecx,%r14d - andl %r10d,%r12d - pshufd $128,%xmm7,%xmm7 - xorl %r10d,%r13d - addl 24(%rsp),%ebx - movl %ecx,%r15d - psrldq $8,%xmm7 - xorl %eax,%r12d - rorl $11,%r14d - xorl %edx,%r15d - addl %r12d,%ebx - rorl $6,%r13d - paddd %xmm7,%xmm1 - andl %r15d,%edi - xorl %ecx,%r14d - addl %r13d,%ebx - pshufd $80,%xmm1,%xmm7 - xorl %edx,%edi - rorl $2,%r14d - addl %ebx,%r9d - movdqa %xmm7,%xmm6 - addl %edi,%ebx - movl %r9d,%r13d - psrld $10,%xmm7 - addl %ebx,%r14d - rorl $14,%r13d - psrlq $17,%xmm6 - movl %r14d,%ebx - movl %r10d,%r12d - pxor %xmm6,%xmm7 - rorl $9,%r14d - xorl %r9d,%r13d - xorl %r11d,%r12d - rorl $5,%r13d - xorl %ebx,%r14d - psrlq $2,%xmm6 - andl %r9d,%r12d - xorl %r9d,%r13d - addl 28(%rsp),%eax - pxor %xmm6,%xmm7 - movl %ebx,%edi - xorl %r11d,%r12d - rorl $11,%r14d - pshufd $8,%xmm7,%xmm7 - xorl %ecx,%edi - addl %r12d,%eax - movdqa 32(%rbp),%xmm6 - rorl $6,%r13d - andl %edi,%r15d - pslldq $8,%xmm7 - xorl %ebx,%r14d - addl %r13d,%eax - xorl %ecx,%r15d - paddd %xmm7,%xmm1 - rorl $2,%r14d - addl %eax,%r8d - addl %r15d,%eax - paddd %xmm1,%xmm6 - movl %r8d,%r13d - addl %eax,%r14d - movdqa %xmm6,16(%rsp) - rorl $14,%r13d - movdqa %xmm3,%xmm4 - movl %r14d,%eax - movl %r9d,%r12d - movdqa %xmm1,%xmm7 - rorl $9,%r14d - xorl %r8d,%r13d - xorl %r10d,%r12d - rorl $5,%r13d - xorl %eax,%r14d -.byte 102,15,58,15,226,4 - andl %r8d,%r12d - xorl %r8d,%r13d -.byte 102,15,58,15,248,4 - addl 32(%rsp),%r11d - movl %eax,%r15d - xorl %r10d,%r12d - rorl $11,%r14d - movdqa %xmm4,%xmm5 - xorl %ebx,%r15d - addl %r12d,%r11d - movdqa %xmm4,%xmm6 - rorl $6,%r13d - andl %r15d,%edi - psrld $3,%xmm4 - xorl %eax,%r14d - addl %r13d,%r11d - xorl %ebx,%edi - paddd %xmm7,%xmm2 - rorl $2,%r14d - addl %r11d,%edx - psrld $7,%xmm6 - addl %edi,%r11d - movl %edx,%r13d - pshufd $250,%xmm1,%xmm7 - addl %r11d,%r14d - rorl $14,%r13d - pslld $14,%xmm5 - movl %r14d,%r11d - movl %r8d,%r12d - pxor %xmm6,%xmm4 - rorl $9,%r14d - xorl %edx,%r13d - xorl %r9d,%r12d - rorl $5,%r13d - psrld $11,%xmm6 - xorl %r11d,%r14d - pxor %xmm5,%xmm4 - andl %edx,%r12d - xorl %edx,%r13d - pslld $11,%xmm5 - addl 36(%rsp),%r10d - movl %r11d,%edi - pxor %xmm6,%xmm4 - xorl %r9d,%r12d - rorl $11,%r14d - movdqa %xmm7,%xmm6 - xorl %eax,%edi - addl %r12d,%r10d - pxor %xmm5,%xmm4 - rorl $6,%r13d - andl %edi,%r15d - xorl %r11d,%r14d - psrld $10,%xmm7 - addl %r13d,%r10d - xorl %eax,%r15d - paddd %xmm4,%xmm2 - rorl $2,%r14d - addl %r10d,%ecx - psrlq $17,%xmm6 - addl %r15d,%r10d - movl %ecx,%r13d - addl %r10d,%r14d - pxor %xmm6,%xmm7 - rorl $14,%r13d - movl %r14d,%r10d - movl %edx,%r12d - rorl $9,%r14d - psrlq $2,%xmm6 - xorl %ecx,%r13d - xorl %r8d,%r12d - pxor %xmm6,%xmm7 - rorl $5,%r13d - xorl %r10d,%r14d - andl %ecx,%r12d - pshufd $128,%xmm7,%xmm7 - xorl %ecx,%r13d - addl 40(%rsp),%r9d - movl %r10d,%r15d - psrldq $8,%xmm7 - xorl %r8d,%r12d - rorl $11,%r14d - xorl %r11d,%r15d - addl %r12d,%r9d - rorl $6,%r13d - paddd %xmm7,%xmm2 - andl %r15d,%edi - xorl %r10d,%r14d - addl %r13d,%r9d - pshufd $80,%xmm2,%xmm7 - xorl %r11d,%edi - rorl $2,%r14d - addl %r9d,%ebx - movdqa %xmm7,%xmm6 - addl %edi,%r9d - movl %ebx,%r13d - psrld $10,%xmm7 - addl %r9d,%r14d - rorl $14,%r13d - psrlq $17,%xmm6 - movl %r14d,%r9d - movl %ecx,%r12d - pxor %xmm6,%xmm7 - rorl $9,%r14d - xorl %ebx,%r13d - xorl %edx,%r12d - rorl $5,%r13d - xorl %r9d,%r14d - psrlq $2,%xmm6 - andl %ebx,%r12d - xorl %ebx,%r13d - addl 44(%rsp),%r8d - pxor %xmm6,%xmm7 - movl %r9d,%edi - xorl %edx,%r12d - rorl $11,%r14d - pshufd $8,%xmm7,%xmm7 - xorl %r10d,%edi - addl %r12d,%r8d - movdqa 64(%rbp),%xmm6 - rorl $6,%r13d - andl %edi,%r15d - pslldq $8,%xmm7 - xorl %r9d,%r14d - addl %r13d,%r8d - xorl %r10d,%r15d - paddd %xmm7,%xmm2 - rorl $2,%r14d - addl %r8d,%eax - addl %r15d,%r8d - paddd %xmm2,%xmm6 - movl %eax,%r13d - addl %r8d,%r14d - movdqa %xmm6,32(%rsp) - rorl $14,%r13d - movdqa %xmm0,%xmm4 - movl %r14d,%r8d - movl %ebx,%r12d - movdqa %xmm2,%xmm7 - rorl $9,%r14d - xorl %eax,%r13d - xorl %ecx,%r12d - rorl $5,%r13d - xorl %r8d,%r14d -.byte 102,15,58,15,227,4 - andl %eax,%r12d - xorl %eax,%r13d -.byte 102,15,58,15,249,4 - addl 48(%rsp),%edx - movl %r8d,%r15d - xorl %ecx,%r12d - rorl $11,%r14d - movdqa %xmm4,%xmm5 - xorl %r9d,%r15d - addl %r12d,%edx - movdqa %xmm4,%xmm6 - rorl $6,%r13d - andl %r15d,%edi - psrld $3,%xmm4 - xorl %r8d,%r14d - addl %r13d,%edx - xorl %r9d,%edi - paddd %xmm7,%xmm3 - rorl $2,%r14d - addl %edx,%r11d - psrld $7,%xmm6 - addl %edi,%edx - movl %r11d,%r13d - pshufd $250,%xmm2,%xmm7 - addl %edx,%r14d - rorl $14,%r13d - pslld $14,%xmm5 - movl %r14d,%edx - movl %eax,%r12d - pxor %xmm6,%xmm4 - rorl $9,%r14d - xorl %r11d,%r13d - xorl %ebx,%r12d - rorl $5,%r13d - psrld $11,%xmm6 - xorl %edx,%r14d - pxor %xmm5,%xmm4 - andl %r11d,%r12d - xorl %r11d,%r13d - pslld $11,%xmm5 - addl 52(%rsp),%ecx - movl %edx,%edi - pxor %xmm6,%xmm4 - xorl %ebx,%r12d - rorl $11,%r14d - movdqa %xmm7,%xmm6 - xorl %r8d,%edi - addl %r12d,%ecx - pxor %xmm5,%xmm4 - rorl $6,%r13d - andl %edi,%r15d - xorl %edx,%r14d - psrld $10,%xmm7 - addl %r13d,%ecx - xorl %r8d,%r15d - paddd %xmm4,%xmm3 - rorl $2,%r14d - addl %ecx,%r10d - psrlq $17,%xmm6 - addl %r15d,%ecx - movl %r10d,%r13d - addl %ecx,%r14d - pxor %xmm6,%xmm7 - rorl $14,%r13d - movl %r14d,%ecx - movl %r11d,%r12d - rorl $9,%r14d - psrlq $2,%xmm6 - xorl %r10d,%r13d - xorl %eax,%r12d - pxor %xmm6,%xmm7 - rorl $5,%r13d - xorl %ecx,%r14d - andl %r10d,%r12d - pshufd $128,%xmm7,%xmm7 - xorl %r10d,%r13d - addl 56(%rsp),%ebx - movl %ecx,%r15d - psrldq $8,%xmm7 - xorl %eax,%r12d - rorl $11,%r14d - xorl %edx,%r15d - addl %r12d,%ebx - rorl $6,%r13d - paddd %xmm7,%xmm3 - andl %r15d,%edi - xorl %ecx,%r14d - addl %r13d,%ebx - pshufd $80,%xmm3,%xmm7 - xorl %edx,%edi - rorl $2,%r14d - addl %ebx,%r9d - movdqa %xmm7,%xmm6 - addl %edi,%ebx - movl %r9d,%r13d - psrld $10,%xmm7 - addl %ebx,%r14d - rorl $14,%r13d - psrlq $17,%xmm6 - movl %r14d,%ebx - movl %r10d,%r12d - pxor %xmm6,%xmm7 - rorl $9,%r14d - xorl %r9d,%r13d - xorl %r11d,%r12d - rorl $5,%r13d - xorl %ebx,%r14d - psrlq $2,%xmm6 - andl %r9d,%r12d - xorl %r9d,%r13d - addl 60(%rsp),%eax - pxor %xmm6,%xmm7 - movl %ebx,%edi - xorl %r11d,%r12d - rorl $11,%r14d - pshufd $8,%xmm7,%xmm7 - xorl %ecx,%edi - addl %r12d,%eax - movdqa 96(%rbp),%xmm6 - rorl $6,%r13d - andl %edi,%r15d - pslldq $8,%xmm7 - xorl %ebx,%r14d - addl %r13d,%eax - xorl %ecx,%r15d - paddd %xmm7,%xmm3 - rorl $2,%r14d - addl %eax,%r8d - addl %r15d,%eax - paddd %xmm3,%xmm6 - movl %r8d,%r13d - addl %eax,%r14d - movdqa %xmm6,48(%rsp) - cmpb $0,131(%rbp) - jne L$ssse3_00_47 - rorl $14,%r13d - movl %r14d,%eax - movl %r9d,%r12d - rorl $9,%r14d - xorl %r8d,%r13d - xorl %r10d,%r12d - rorl $5,%r13d - xorl %eax,%r14d - andl %r8d,%r12d - xorl %r8d,%r13d - addl 0(%rsp),%r11d - movl %eax,%r15d - xorl %r10d,%r12d - rorl $11,%r14d - xorl %ebx,%r15d - addl %r12d,%r11d - rorl $6,%r13d - andl %r15d,%edi - xorl %eax,%r14d - addl %r13d,%r11d - xorl %ebx,%edi - rorl $2,%r14d - addl %r11d,%edx - addl %edi,%r11d - movl %edx,%r13d - addl %r11d,%r14d - rorl $14,%r13d - movl %r14d,%r11d - movl %r8d,%r12d - rorl $9,%r14d - xorl %edx,%r13d - xorl %r9d,%r12d - rorl $5,%r13d - xorl %r11d,%r14d - andl %edx,%r12d - xorl %edx,%r13d - addl 4(%rsp),%r10d - movl %r11d,%edi - xorl %r9d,%r12d - rorl $11,%r14d - xorl %eax,%edi - addl %r12d,%r10d - rorl $6,%r13d - andl %edi,%r15d - xorl %r11d,%r14d - addl %r13d,%r10d - xorl %eax,%r15d - rorl $2,%r14d - addl %r10d,%ecx - addl %r15d,%r10d - movl %ecx,%r13d - addl %r10d,%r14d - rorl $14,%r13d - movl %r14d,%r10d - movl %edx,%r12d - rorl $9,%r14d - xorl %ecx,%r13d - xorl %r8d,%r12d - rorl $5,%r13d - xorl %r10d,%r14d - andl %ecx,%r12d - xorl %ecx,%r13d - addl 8(%rsp),%r9d - movl %r10d,%r15d - xorl %r8d,%r12d - rorl $11,%r14d - xorl %r11d,%r15d - addl %r12d,%r9d - rorl $6,%r13d - andl %r15d,%edi - xorl %r10d,%r14d - addl %r13d,%r9d - xorl %r11d,%edi - rorl $2,%r14d - addl %r9d,%ebx - addl %edi,%r9d - movl %ebx,%r13d - addl %r9d,%r14d - rorl $14,%r13d - movl %r14d,%r9d - movl %ecx,%r12d - rorl $9,%r14d - xorl %ebx,%r13d - xorl %edx,%r12d - rorl $5,%r13d - xorl %r9d,%r14d - andl %ebx,%r12d - xorl %ebx,%r13d - addl 12(%rsp),%r8d - movl %r9d,%edi - xorl %edx,%r12d - rorl $11,%r14d - xorl %r10d,%edi - addl %r12d,%r8d - rorl $6,%r13d - andl %edi,%r15d - xorl %r9d,%r14d - addl %r13d,%r8d - xorl %r10d,%r15d - rorl $2,%r14d - addl %r8d,%eax - addl %r15d,%r8d - movl %eax,%r13d - addl %r8d,%r14d - rorl $14,%r13d - movl %r14d,%r8d - movl %ebx,%r12d - rorl $9,%r14d - xorl %eax,%r13d - xorl %ecx,%r12d - rorl $5,%r13d - xorl %r8d,%r14d - andl %eax,%r12d - xorl %eax,%r13d - addl 16(%rsp),%edx - movl %r8d,%r15d - xorl %ecx,%r12d - rorl $11,%r14d - xorl %r9d,%r15d - addl %r12d,%edx - rorl $6,%r13d - andl %r15d,%edi - xorl %r8d,%r14d - addl %r13d,%edx - xorl %r9d,%edi - rorl $2,%r14d - addl %edx,%r11d - addl %edi,%edx - movl %r11d,%r13d - addl %edx,%r14d - rorl $14,%r13d - movl %r14d,%edx - movl %eax,%r12d - rorl $9,%r14d - xorl %r11d,%r13d - xorl %ebx,%r12d - rorl $5,%r13d - xorl %edx,%r14d - andl %r11d,%r12d - xorl %r11d,%r13d - addl 20(%rsp),%ecx - movl %edx,%edi - xorl %ebx,%r12d - rorl $11,%r14d - xorl %r8d,%edi - addl %r12d,%ecx - rorl $6,%r13d - andl %edi,%r15d - xorl %edx,%r14d - addl %r13d,%ecx - xorl %r8d,%r15d - rorl $2,%r14d - addl %ecx,%r10d - addl %r15d,%ecx - movl %r10d,%r13d - addl %ecx,%r14d - rorl $14,%r13d - movl %r14d,%ecx - movl %r11d,%r12d - rorl $9,%r14d - xorl %r10d,%r13d - xorl %eax,%r12d - rorl $5,%r13d - xorl %ecx,%r14d - andl %r10d,%r12d - xorl %r10d,%r13d - addl 24(%rsp),%ebx - movl %ecx,%r15d - xorl %eax,%r12d - rorl $11,%r14d - xorl %edx,%r15d - addl %r12d,%ebx - rorl $6,%r13d - andl %r15d,%edi - xorl %ecx,%r14d - addl %r13d,%ebx - xorl %edx,%edi - rorl $2,%r14d - addl %ebx,%r9d - addl %edi,%ebx - movl %r9d,%r13d - addl %ebx,%r14d - rorl $14,%r13d - movl %r14d,%ebx - movl %r10d,%r12d - rorl $9,%r14d - xorl %r9d,%r13d - xorl %r11d,%r12d - rorl $5,%r13d - xorl %ebx,%r14d - andl %r9d,%r12d - xorl %r9d,%r13d - addl 28(%rsp),%eax - movl %ebx,%edi - xorl %r11d,%r12d - rorl $11,%r14d - xorl %ecx,%edi - addl %r12d,%eax - rorl $6,%r13d - andl %edi,%r15d - xorl %ebx,%r14d - addl %r13d,%eax - xorl %ecx,%r15d - rorl $2,%r14d - addl %eax,%r8d - addl %r15d,%eax - movl %r8d,%r13d - addl %eax,%r14d - rorl $14,%r13d - movl %r14d,%eax - movl %r9d,%r12d - rorl $9,%r14d - xorl %r8d,%r13d - xorl %r10d,%r12d - rorl $5,%r13d - xorl %eax,%r14d - andl %r8d,%r12d - xorl %r8d,%r13d - addl 32(%rsp),%r11d - movl %eax,%r15d - xorl %r10d,%r12d - rorl $11,%r14d - xorl %ebx,%r15d - addl %r12d,%r11d - rorl $6,%r13d - andl %r15d,%edi - xorl %eax,%r14d - addl %r13d,%r11d - xorl %ebx,%edi - rorl $2,%r14d - addl %r11d,%edx - addl %edi,%r11d - movl %edx,%r13d - addl %r11d,%r14d - rorl $14,%r13d - movl %r14d,%r11d - movl %r8d,%r12d - rorl $9,%r14d - xorl %edx,%r13d - xorl %r9d,%r12d - rorl $5,%r13d - xorl %r11d,%r14d - andl %edx,%r12d - xorl %edx,%r13d - addl 36(%rsp),%r10d - movl %r11d,%edi - xorl %r9d,%r12d - rorl $11,%r14d - xorl %eax,%edi - addl %r12d,%r10d - rorl $6,%r13d - andl %edi,%r15d - xorl %r11d,%r14d - addl %r13d,%r10d - xorl %eax,%r15d - rorl $2,%r14d - addl %r10d,%ecx - addl %r15d,%r10d - movl %ecx,%r13d - addl %r10d,%r14d - rorl $14,%r13d - movl %r14d,%r10d - movl %edx,%r12d - rorl $9,%r14d - xorl %ecx,%r13d - xorl %r8d,%r12d - rorl $5,%r13d - xorl %r10d,%r14d - andl %ecx,%r12d - xorl %ecx,%r13d - addl 40(%rsp),%r9d - movl %r10d,%r15d - xorl %r8d,%r12d - rorl $11,%r14d - xorl %r11d,%r15d - addl %r12d,%r9d - rorl $6,%r13d - andl %r15d,%edi - xorl %r10d,%r14d - addl %r13d,%r9d - xorl %r11d,%edi - rorl $2,%r14d - addl %r9d,%ebx - addl %edi,%r9d - movl %ebx,%r13d - addl %r9d,%r14d - rorl $14,%r13d - movl %r14d,%r9d - movl %ecx,%r12d - rorl $9,%r14d - xorl %ebx,%r13d - xorl %edx,%r12d - rorl $5,%r13d - xorl %r9d,%r14d - andl %ebx,%r12d - xorl %ebx,%r13d - addl 44(%rsp),%r8d - movl %r9d,%edi - xorl %edx,%r12d - rorl $11,%r14d - xorl %r10d,%edi - addl %r12d,%r8d - rorl $6,%r13d - andl %edi,%r15d - xorl %r9d,%r14d - addl %r13d,%r8d - xorl %r10d,%r15d - rorl $2,%r14d - addl %r8d,%eax - addl %r15d,%r8d - movl %eax,%r13d - addl %r8d,%r14d - rorl $14,%r13d - movl %r14d,%r8d - movl %ebx,%r12d - rorl $9,%r14d - xorl %eax,%r13d - xorl %ecx,%r12d - rorl $5,%r13d - xorl %r8d,%r14d - andl %eax,%r12d - xorl %eax,%r13d - addl 48(%rsp),%edx - movl %r8d,%r15d - xorl %ecx,%r12d - rorl $11,%r14d - xorl %r9d,%r15d - addl %r12d,%edx - rorl $6,%r13d - andl %r15d,%edi - xorl %r8d,%r14d - addl %r13d,%edx - xorl %r9d,%edi - rorl $2,%r14d - addl %edx,%r11d - addl %edi,%edx - movl %r11d,%r13d - addl %edx,%r14d - rorl $14,%r13d - movl %r14d,%edx - movl %eax,%r12d - rorl $9,%r14d - xorl %r11d,%r13d - xorl %ebx,%r12d - rorl $5,%r13d - xorl %edx,%r14d - andl %r11d,%r12d - xorl %r11d,%r13d - addl 52(%rsp),%ecx - movl %edx,%edi - xorl %ebx,%r12d - rorl $11,%r14d - xorl %r8d,%edi - addl %r12d,%ecx - rorl $6,%r13d - andl %edi,%r15d - xorl %edx,%r14d - addl %r13d,%ecx - xorl %r8d,%r15d - rorl $2,%r14d - addl %ecx,%r10d - addl %r15d,%ecx - movl %r10d,%r13d - addl %ecx,%r14d - rorl $14,%r13d - movl %r14d,%ecx - movl %r11d,%r12d - rorl $9,%r14d - xorl %r10d,%r13d - xorl %eax,%r12d - rorl $5,%r13d - xorl %ecx,%r14d - andl %r10d,%r12d - xorl %r10d,%r13d - addl 56(%rsp),%ebx - movl %ecx,%r15d - xorl %eax,%r12d - rorl $11,%r14d - xorl %edx,%r15d - addl %r12d,%ebx - rorl $6,%r13d - andl %r15d,%edi - xorl %ecx,%r14d - addl %r13d,%ebx - xorl %edx,%edi - rorl $2,%r14d - addl %ebx,%r9d - addl %edi,%ebx - movl %r9d,%r13d - addl %ebx,%r14d - rorl $14,%r13d - movl %r14d,%ebx - movl %r10d,%r12d - rorl $9,%r14d - xorl %r9d,%r13d - xorl %r11d,%r12d - rorl $5,%r13d - xorl %ebx,%r14d - andl %r9d,%r12d - xorl %r9d,%r13d - addl 60(%rsp),%eax - movl %ebx,%edi - xorl %r11d,%r12d - rorl $11,%r14d - xorl %ecx,%edi - addl %r12d,%eax - rorl $6,%r13d - andl %edi,%r15d - xorl %ebx,%r14d - addl %r13d,%eax - xorl %ecx,%r15d - rorl $2,%r14d - addl %eax,%r8d - addl %r15d,%eax - movl %r8d,%r13d - addl %eax,%r14d - movq 64+0(%rsp),%rdi - movl %r14d,%eax - - addl 0(%rdi),%eax - leaq 64(%rsi),%rsi - addl 4(%rdi),%ebx - addl 8(%rdi),%ecx - addl 12(%rdi),%edx - addl 16(%rdi),%r8d - addl 20(%rdi),%r9d - addl 24(%rdi),%r10d - addl 28(%rdi),%r11d - - cmpq 64+16(%rsp),%rsi - - movl %eax,0(%rdi) - movl %ebx,4(%rdi) - movl %ecx,8(%rdi) - movl %edx,12(%rdi) - movl %r8d,16(%rdi) - movl %r9d,20(%rdi) - movl %r10d,24(%rdi) - movl %r11d,28(%rdi) - jb L$loop_ssse3 - - movq 88(%rsp),%rsi - - movq -48(%rsi),%r15 - - movq -40(%rsi),%r14 - - movq -32(%rsi),%r13 - - movq -24(%rsi),%r12 - - movq -16(%rsi),%rbp - - movq -8(%rsi),%rbx - - leaq (%rsi),%rsp - -L$epilogue_ssse3: - .byte 0xf3,0xc3 - - - -.p2align 6 -GFp_sha256_block_data_order_avx: - -L$avx_shortcut: - movq %rsp,%rax - - pushq %rbx - - pushq %rbp - - pushq %r12 - - pushq %r13 - - pushq %r14 - - pushq %r15 - - shlq $4,%rdx - subq $96,%rsp - leaq (%rsi,%rdx,4),%rdx - andq $-64,%rsp - movq %rdi,64+0(%rsp) - movq %rsi,64+8(%rsp) - movq %rdx,64+16(%rsp) - movq %rax,88(%rsp) - -L$prologue_avx: - - vzeroupper - movl 0(%rdi),%eax - movl 4(%rdi),%ebx - movl 8(%rdi),%ecx - movl 12(%rdi),%edx - movl 16(%rdi),%r8d - movl 20(%rdi),%r9d - movl 24(%rdi),%r10d - movl 28(%rdi),%r11d - vmovdqa K256+512+32(%rip),%xmm8 - vmovdqa K256+512+64(%rip),%xmm9 - jmp L$loop_avx -.p2align 4 -L$loop_avx: - vmovdqa K256+512(%rip),%xmm7 - vmovdqu 0(%rsi),%xmm0 - vmovdqu 16(%rsi),%xmm1 - vmovdqu 32(%rsi),%xmm2 - vmovdqu 48(%rsi),%xmm3 - vpshufb %xmm7,%xmm0,%xmm0 - leaq K256(%rip),%rbp - vpshufb %xmm7,%xmm1,%xmm1 - vpshufb %xmm7,%xmm2,%xmm2 - vpaddd 0(%rbp),%xmm0,%xmm4 - vpshufb %xmm7,%xmm3,%xmm3 - vpaddd 32(%rbp),%xmm1,%xmm5 - vpaddd 64(%rbp),%xmm2,%xmm6 - vpaddd 96(%rbp),%xmm3,%xmm7 - vmovdqa %xmm4,0(%rsp) - movl %eax,%r14d - vmovdqa %xmm5,16(%rsp) - movl %ebx,%edi - vmovdqa %xmm6,32(%rsp) - xorl %ecx,%edi - vmovdqa %xmm7,48(%rsp) - movl %r8d,%r13d - jmp L$avx_00_47 - -.p2align 4 -L$avx_00_47: - subq $-128,%rbp - vpalignr $4,%xmm0,%xmm1,%xmm4 - shrdl $14,%r13d,%r13d - movl %r14d,%eax - movl %r9d,%r12d - vpalignr $4,%xmm2,%xmm3,%xmm7 - shrdl $9,%r14d,%r14d - xorl %r8d,%r13d - xorl %r10d,%r12d - vpsrld $7,%xmm4,%xmm6 - shrdl $5,%r13d,%r13d - xorl %eax,%r14d - andl %r8d,%r12d - vpaddd %xmm7,%xmm0,%xmm0 - xorl %r8d,%r13d - addl 0(%rsp),%r11d - movl %eax,%r15d - vpsrld $3,%xmm4,%xmm7 - xorl %r10d,%r12d - shrdl $11,%r14d,%r14d - xorl %ebx,%r15d - vpslld $14,%xmm4,%xmm5 - addl %r12d,%r11d - shrdl $6,%r13d,%r13d - andl %r15d,%edi - vpxor %xmm6,%xmm7,%xmm4 - xorl %eax,%r14d - addl %r13d,%r11d - xorl %ebx,%edi - vpshufd $250,%xmm3,%xmm7 - shrdl $2,%r14d,%r14d - addl %r11d,%edx - addl %edi,%r11d - vpsrld $11,%xmm6,%xmm6 - movl %edx,%r13d - addl %r11d,%r14d - shrdl $14,%r13d,%r13d - vpxor %xmm5,%xmm4,%xmm4 - movl %r14d,%r11d - movl %r8d,%r12d - shrdl $9,%r14d,%r14d - vpslld $11,%xmm5,%xmm5 - xorl %edx,%r13d - xorl %r9d,%r12d - shrdl $5,%r13d,%r13d - vpxor %xmm6,%xmm4,%xmm4 - xorl %r11d,%r14d - andl %edx,%r12d - xorl %edx,%r13d - vpsrld $10,%xmm7,%xmm6 - addl 4(%rsp),%r10d - movl %r11d,%edi - xorl %r9d,%r12d - vpxor %xmm5,%xmm4,%xmm4 - shrdl $11,%r14d,%r14d - xorl %eax,%edi - addl %r12d,%r10d - vpsrlq $17,%xmm7,%xmm7 - shrdl $6,%r13d,%r13d - andl %edi,%r15d - xorl %r11d,%r14d - vpaddd %xmm4,%xmm0,%xmm0 - addl %r13d,%r10d - xorl %eax,%r15d - shrdl $2,%r14d,%r14d - vpxor %xmm7,%xmm6,%xmm6 - addl %r10d,%ecx - addl %r15d,%r10d - movl %ecx,%r13d - vpsrlq $2,%xmm7,%xmm7 - addl %r10d,%r14d - shrdl $14,%r13d,%r13d - movl %r14d,%r10d - vpxor %xmm7,%xmm6,%xmm6 - movl %edx,%r12d - shrdl $9,%r14d,%r14d - xorl %ecx,%r13d - vpshufb %xmm8,%xmm6,%xmm6 - xorl %r8d,%r12d - shrdl $5,%r13d,%r13d - xorl %r10d,%r14d - vpaddd %xmm6,%xmm0,%xmm0 - andl %ecx,%r12d - xorl %ecx,%r13d - addl 8(%rsp),%r9d - vpshufd $80,%xmm0,%xmm7 - movl %r10d,%r15d - xorl %r8d,%r12d - shrdl $11,%r14d,%r14d - vpsrld $10,%xmm7,%xmm6 - xorl %r11d,%r15d - addl %r12d,%r9d - shrdl $6,%r13d,%r13d - vpsrlq $17,%xmm7,%xmm7 - andl %r15d,%edi - xorl %r10d,%r14d - addl %r13d,%r9d - vpxor %xmm7,%xmm6,%xmm6 - xorl %r11d,%edi - shrdl $2,%r14d,%r14d - addl %r9d,%ebx - vpsrlq $2,%xmm7,%xmm7 - addl %edi,%r9d - movl %ebx,%r13d - addl %r9d,%r14d - vpxor %xmm7,%xmm6,%xmm6 - shrdl $14,%r13d,%r13d - movl %r14d,%r9d - movl %ecx,%r12d - vpshufb %xmm9,%xmm6,%xmm6 - shrdl $9,%r14d,%r14d - xorl %ebx,%r13d - xorl %edx,%r12d - vpaddd %xmm6,%xmm0,%xmm0 - shrdl $5,%r13d,%r13d - xorl %r9d,%r14d - andl %ebx,%r12d - vpaddd 0(%rbp),%xmm0,%xmm6 - xorl %ebx,%r13d - addl 12(%rsp),%r8d - movl %r9d,%edi - xorl %edx,%r12d - shrdl $11,%r14d,%r14d - xorl %r10d,%edi - addl %r12d,%r8d - shrdl $6,%r13d,%r13d - andl %edi,%r15d - xorl %r9d,%r14d - addl %r13d,%r8d - xorl %r10d,%r15d - shrdl $2,%r14d,%r14d - addl %r8d,%eax - addl %r15d,%r8d - movl %eax,%r13d - addl %r8d,%r14d - vmovdqa %xmm6,0(%rsp) - vpalignr $4,%xmm1,%xmm2,%xmm4 - shrdl $14,%r13d,%r13d - movl %r14d,%r8d - movl %ebx,%r12d - vpalignr $4,%xmm3,%xmm0,%xmm7 - shrdl $9,%r14d,%r14d - xorl %eax,%r13d - xorl %ecx,%r12d - vpsrld $7,%xmm4,%xmm6 - shrdl $5,%r13d,%r13d - xorl %r8d,%r14d - andl %eax,%r12d - vpaddd %xmm7,%xmm1,%xmm1 - xorl %eax,%r13d - addl 16(%rsp),%edx - movl %r8d,%r15d - vpsrld $3,%xmm4,%xmm7 - xorl %ecx,%r12d - shrdl $11,%r14d,%r14d - xorl %r9d,%r15d - vpslld $14,%xmm4,%xmm5 - addl %r12d,%edx - shrdl $6,%r13d,%r13d - andl %r15d,%edi - vpxor %xmm6,%xmm7,%xmm4 - xorl %r8d,%r14d - addl %r13d,%edx - xorl %r9d,%edi - vpshufd $250,%xmm0,%xmm7 - shrdl $2,%r14d,%r14d - addl %edx,%r11d - addl %edi,%edx - vpsrld $11,%xmm6,%xmm6 - movl %r11d,%r13d - addl %edx,%r14d - shrdl $14,%r13d,%r13d - vpxor %xmm5,%xmm4,%xmm4 - movl %r14d,%edx - movl %eax,%r12d - shrdl $9,%r14d,%r14d - vpslld $11,%xmm5,%xmm5 - xorl %r11d,%r13d - xorl %ebx,%r12d - shrdl $5,%r13d,%r13d - vpxor %xmm6,%xmm4,%xmm4 - xorl %edx,%r14d - andl %r11d,%r12d - xorl %r11d,%r13d - vpsrld $10,%xmm7,%xmm6 - addl 20(%rsp),%ecx - movl %edx,%edi - xorl %ebx,%r12d - vpxor %xmm5,%xmm4,%xmm4 - shrdl $11,%r14d,%r14d - xorl %r8d,%edi - addl %r12d,%ecx - vpsrlq $17,%xmm7,%xmm7 - shrdl $6,%r13d,%r13d - andl %edi,%r15d - xorl %edx,%r14d - vpaddd %xmm4,%xmm1,%xmm1 - addl %r13d,%ecx - xorl %r8d,%r15d - shrdl $2,%r14d,%r14d - vpxor %xmm7,%xmm6,%xmm6 - addl %ecx,%r10d - addl %r15d,%ecx - movl %r10d,%r13d - vpsrlq $2,%xmm7,%xmm7 - addl %ecx,%r14d - shrdl $14,%r13d,%r13d - movl %r14d,%ecx - vpxor %xmm7,%xmm6,%xmm6 - movl %r11d,%r12d - shrdl $9,%r14d,%r14d - xorl %r10d,%r13d - vpshufb %xmm8,%xmm6,%xmm6 - xorl %eax,%r12d - shrdl $5,%r13d,%r13d - xorl %ecx,%r14d - vpaddd %xmm6,%xmm1,%xmm1 - andl %r10d,%r12d - xorl %r10d,%r13d - addl 24(%rsp),%ebx - vpshufd $80,%xmm1,%xmm7 - movl %ecx,%r15d - xorl %eax,%r12d - shrdl $11,%r14d,%r14d - vpsrld $10,%xmm7,%xmm6 - xorl %edx,%r15d - addl %r12d,%ebx - shrdl $6,%r13d,%r13d - vpsrlq $17,%xmm7,%xmm7 - andl %r15d,%edi - xorl %ecx,%r14d - addl %r13d,%ebx - vpxor %xmm7,%xmm6,%xmm6 - xorl %edx,%edi - shrdl $2,%r14d,%r14d - addl %ebx,%r9d - vpsrlq $2,%xmm7,%xmm7 - addl %edi,%ebx - movl %r9d,%r13d - addl %ebx,%r14d - vpxor %xmm7,%xmm6,%xmm6 - shrdl $14,%r13d,%r13d - movl %r14d,%ebx - movl %r10d,%r12d - vpshufb %xmm9,%xmm6,%xmm6 - shrdl $9,%r14d,%r14d - xorl %r9d,%r13d - xorl %r11d,%r12d - vpaddd %xmm6,%xmm1,%xmm1 - shrdl $5,%r13d,%r13d - xorl %ebx,%r14d - andl %r9d,%r12d - vpaddd 32(%rbp),%xmm1,%xmm6 - xorl %r9d,%r13d - addl 28(%rsp),%eax - movl %ebx,%edi - xorl %r11d,%r12d - shrdl $11,%r14d,%r14d - xorl %ecx,%edi - addl %r12d,%eax - shrdl $6,%r13d,%r13d - andl %edi,%r15d - xorl %ebx,%r14d - addl %r13d,%eax - xorl %ecx,%r15d - shrdl $2,%r14d,%r14d - addl %eax,%r8d - addl %r15d,%eax - movl %r8d,%r13d - addl %eax,%r14d - vmovdqa %xmm6,16(%rsp) - vpalignr $4,%xmm2,%xmm3,%xmm4 - shrdl $14,%r13d,%r13d - movl %r14d,%eax - movl %r9d,%r12d - vpalignr $4,%xmm0,%xmm1,%xmm7 - shrdl $9,%r14d,%r14d - xorl %r8d,%r13d - xorl %r10d,%r12d - vpsrld $7,%xmm4,%xmm6 - shrdl $5,%r13d,%r13d - xorl %eax,%r14d - andl %r8d,%r12d - vpaddd %xmm7,%xmm2,%xmm2 - xorl %r8d,%r13d - addl 32(%rsp),%r11d - movl %eax,%r15d - vpsrld $3,%xmm4,%xmm7 - xorl %r10d,%r12d - shrdl $11,%r14d,%r14d - xorl %ebx,%r15d - vpslld $14,%xmm4,%xmm5 - addl %r12d,%r11d - shrdl $6,%r13d,%r13d - andl %r15d,%edi - vpxor %xmm6,%xmm7,%xmm4 - xorl %eax,%r14d - addl %r13d,%r11d - xorl %ebx,%edi - vpshufd $250,%xmm1,%xmm7 - shrdl $2,%r14d,%r14d - addl %r11d,%edx - addl %edi,%r11d - vpsrld $11,%xmm6,%xmm6 - movl %edx,%r13d - addl %r11d,%r14d - shrdl $14,%r13d,%r13d - vpxor %xmm5,%xmm4,%xmm4 - movl %r14d,%r11d - movl %r8d,%r12d - shrdl $9,%r14d,%r14d - vpslld $11,%xmm5,%xmm5 - xorl %edx,%r13d - xorl %r9d,%r12d - shrdl $5,%r13d,%r13d - vpxor %xmm6,%xmm4,%xmm4 - xorl %r11d,%r14d - andl %edx,%r12d - xorl %edx,%r13d - vpsrld $10,%xmm7,%xmm6 - addl 36(%rsp),%r10d - movl %r11d,%edi - xorl %r9d,%r12d - vpxor %xmm5,%xmm4,%xmm4 - shrdl $11,%r14d,%r14d - xorl %eax,%edi - addl %r12d,%r10d - vpsrlq $17,%xmm7,%xmm7 - shrdl $6,%r13d,%r13d - andl %edi,%r15d - xorl %r11d,%r14d - vpaddd %xmm4,%xmm2,%xmm2 - addl %r13d,%r10d - xorl %eax,%r15d - shrdl $2,%r14d,%r14d - vpxor %xmm7,%xmm6,%xmm6 - addl %r10d,%ecx - addl %r15d,%r10d - movl %ecx,%r13d - vpsrlq $2,%xmm7,%xmm7 - addl %r10d,%r14d - shrdl $14,%r13d,%r13d - movl %r14d,%r10d - vpxor %xmm7,%xmm6,%xmm6 - movl %edx,%r12d - shrdl $9,%r14d,%r14d - xorl %ecx,%r13d - vpshufb %xmm8,%xmm6,%xmm6 - xorl %r8d,%r12d - shrdl $5,%r13d,%r13d - xorl %r10d,%r14d - vpaddd %xmm6,%xmm2,%xmm2 - andl %ecx,%r12d - xorl %ecx,%r13d - addl 40(%rsp),%r9d - vpshufd $80,%xmm2,%xmm7 - movl %r10d,%r15d - xorl %r8d,%r12d - shrdl $11,%r14d,%r14d - vpsrld $10,%xmm7,%xmm6 - xorl %r11d,%r15d - addl %r12d,%r9d - shrdl $6,%r13d,%r13d - vpsrlq $17,%xmm7,%xmm7 - andl %r15d,%edi - xorl %r10d,%r14d - addl %r13d,%r9d - vpxor %xmm7,%xmm6,%xmm6 - xorl %r11d,%edi - shrdl $2,%r14d,%r14d - addl %r9d,%ebx - vpsrlq $2,%xmm7,%xmm7 - addl %edi,%r9d - movl %ebx,%r13d - addl %r9d,%r14d - vpxor %xmm7,%xmm6,%xmm6 - shrdl $14,%r13d,%r13d - movl %r14d,%r9d - movl %ecx,%r12d - vpshufb %xmm9,%xmm6,%xmm6 - shrdl $9,%r14d,%r14d - xorl %ebx,%r13d - xorl %edx,%r12d - vpaddd %xmm6,%xmm2,%xmm2 - shrdl $5,%r13d,%r13d - xorl %r9d,%r14d - andl %ebx,%r12d - vpaddd 64(%rbp),%xmm2,%xmm6 - xorl %ebx,%r13d - addl 44(%rsp),%r8d - movl %r9d,%edi - xorl %edx,%r12d - shrdl $11,%r14d,%r14d - xorl %r10d,%edi - addl %r12d,%r8d - shrdl $6,%r13d,%r13d - andl %edi,%r15d - xorl %r9d,%r14d - addl %r13d,%r8d - xorl %r10d,%r15d - shrdl $2,%r14d,%r14d - addl %r8d,%eax - addl %r15d,%r8d - movl %eax,%r13d - addl %r8d,%r14d - vmovdqa %xmm6,32(%rsp) - vpalignr $4,%xmm3,%xmm0,%xmm4 - shrdl $14,%r13d,%r13d - movl %r14d,%r8d - movl %ebx,%r12d - vpalignr $4,%xmm1,%xmm2,%xmm7 - shrdl $9,%r14d,%r14d - xorl %eax,%r13d - xorl %ecx,%r12d - vpsrld $7,%xmm4,%xmm6 - shrdl $5,%r13d,%r13d - xorl %r8d,%r14d - andl %eax,%r12d - vpaddd %xmm7,%xmm3,%xmm3 - xorl %eax,%r13d - addl 48(%rsp),%edx - movl %r8d,%r15d - vpsrld $3,%xmm4,%xmm7 - xorl %ecx,%r12d - shrdl $11,%r14d,%r14d - xorl %r9d,%r15d - vpslld $14,%xmm4,%xmm5 - addl %r12d,%edx - shrdl $6,%r13d,%r13d - andl %r15d,%edi - vpxor %xmm6,%xmm7,%xmm4 - xorl %r8d,%r14d - addl %r13d,%edx - xorl %r9d,%edi - vpshufd $250,%xmm2,%xmm7 - shrdl $2,%r14d,%r14d - addl %edx,%r11d - addl %edi,%edx - vpsrld $11,%xmm6,%xmm6 - movl %r11d,%r13d - addl %edx,%r14d - shrdl $14,%r13d,%r13d - vpxor %xmm5,%xmm4,%xmm4 - movl %r14d,%edx - movl %eax,%r12d - shrdl $9,%r14d,%r14d - vpslld $11,%xmm5,%xmm5 - xorl %r11d,%r13d - xorl %ebx,%r12d - shrdl $5,%r13d,%r13d - vpxor %xmm6,%xmm4,%xmm4 - xorl %edx,%r14d - andl %r11d,%r12d - xorl %r11d,%r13d - vpsrld $10,%xmm7,%xmm6 - addl 52(%rsp),%ecx - movl %edx,%edi - xorl %ebx,%r12d - vpxor %xmm5,%xmm4,%xmm4 - shrdl $11,%r14d,%r14d - xorl %r8d,%edi - addl %r12d,%ecx - vpsrlq $17,%xmm7,%xmm7 - shrdl $6,%r13d,%r13d - andl %edi,%r15d - xorl %edx,%r14d - vpaddd %xmm4,%xmm3,%xmm3 - addl %r13d,%ecx - xorl %r8d,%r15d - shrdl $2,%r14d,%r14d - vpxor %xmm7,%xmm6,%xmm6 - addl %ecx,%r10d - addl %r15d,%ecx - movl %r10d,%r13d - vpsrlq $2,%xmm7,%xmm7 - addl %ecx,%r14d - shrdl $14,%r13d,%r13d - movl %r14d,%ecx - vpxor %xmm7,%xmm6,%xmm6 - movl %r11d,%r12d - shrdl $9,%r14d,%r14d - xorl %r10d,%r13d - vpshufb %xmm8,%xmm6,%xmm6 - xorl %eax,%r12d - shrdl $5,%r13d,%r13d - xorl %ecx,%r14d - vpaddd %xmm6,%xmm3,%xmm3 - andl %r10d,%r12d - xorl %r10d,%r13d - addl 56(%rsp),%ebx - vpshufd $80,%xmm3,%xmm7 - movl %ecx,%r15d - xorl %eax,%r12d - shrdl $11,%r14d,%r14d - vpsrld $10,%xmm7,%xmm6 - xorl %edx,%r15d - addl %r12d,%ebx - shrdl $6,%r13d,%r13d - vpsrlq $17,%xmm7,%xmm7 - andl %r15d,%edi - xorl %ecx,%r14d - addl %r13d,%ebx - vpxor %xmm7,%xmm6,%xmm6 - xorl %edx,%edi - shrdl $2,%r14d,%r14d - addl %ebx,%r9d - vpsrlq $2,%xmm7,%xmm7 - addl %edi,%ebx - movl %r9d,%r13d - addl %ebx,%r14d - vpxor %xmm7,%xmm6,%xmm6 - shrdl $14,%r13d,%r13d - movl %r14d,%ebx - movl %r10d,%r12d - vpshufb %xmm9,%xmm6,%xmm6 - shrdl $9,%r14d,%r14d - xorl %r9d,%r13d - xorl %r11d,%r12d - vpaddd %xmm6,%xmm3,%xmm3 - shrdl $5,%r13d,%r13d - xorl %ebx,%r14d - andl %r9d,%r12d - vpaddd 96(%rbp),%xmm3,%xmm6 - xorl %r9d,%r13d - addl 60(%rsp),%eax - movl %ebx,%edi - xorl %r11d,%r12d - shrdl $11,%r14d,%r14d - xorl %ecx,%edi - addl %r12d,%eax - shrdl $6,%r13d,%r13d - andl %edi,%r15d - xorl %ebx,%r14d - addl %r13d,%eax - xorl %ecx,%r15d - shrdl $2,%r14d,%r14d - addl %eax,%r8d - addl %r15d,%eax - movl %r8d,%r13d - addl %eax,%r14d - vmovdqa %xmm6,48(%rsp) - cmpb $0,131(%rbp) - jne L$avx_00_47 - shrdl $14,%r13d,%r13d - movl %r14d,%eax - movl %r9d,%r12d - shrdl $9,%r14d,%r14d - xorl %r8d,%r13d - xorl %r10d,%r12d - shrdl $5,%r13d,%r13d - xorl %eax,%r14d - andl %r8d,%r12d - xorl %r8d,%r13d - addl 0(%rsp),%r11d - movl %eax,%r15d - xorl %r10d,%r12d - shrdl $11,%r14d,%r14d - xorl %ebx,%r15d - addl %r12d,%r11d - shrdl $6,%r13d,%r13d - andl %r15d,%edi - xorl %eax,%r14d - addl %r13d,%r11d - xorl %ebx,%edi - shrdl $2,%r14d,%r14d - addl %r11d,%edx - addl %edi,%r11d - movl %edx,%r13d - addl %r11d,%r14d - shrdl $14,%r13d,%r13d - movl %r14d,%r11d - movl %r8d,%r12d - shrdl $9,%r14d,%r14d - xorl %edx,%r13d - xorl %r9d,%r12d - shrdl $5,%r13d,%r13d - xorl %r11d,%r14d - andl %edx,%r12d - xorl %edx,%r13d - addl 4(%rsp),%r10d - movl %r11d,%edi - xorl %r9d,%r12d - shrdl $11,%r14d,%r14d - xorl %eax,%edi - addl %r12d,%r10d - shrdl $6,%r13d,%r13d - andl %edi,%r15d - xorl %r11d,%r14d - addl %r13d,%r10d - xorl %eax,%r15d - shrdl $2,%r14d,%r14d - addl %r10d,%ecx - addl %r15d,%r10d - movl %ecx,%r13d - addl %r10d,%r14d - shrdl $14,%r13d,%r13d - movl %r14d,%r10d - movl %edx,%r12d - shrdl $9,%r14d,%r14d - xorl %ecx,%r13d - xorl %r8d,%r12d - shrdl $5,%r13d,%r13d - xorl %r10d,%r14d - andl %ecx,%r12d - xorl %ecx,%r13d - addl 8(%rsp),%r9d - movl %r10d,%r15d - xorl %r8d,%r12d - shrdl $11,%r14d,%r14d - xorl %r11d,%r15d - addl %r12d,%r9d - shrdl $6,%r13d,%r13d - andl %r15d,%edi - xorl %r10d,%r14d - addl %r13d,%r9d - xorl %r11d,%edi - shrdl $2,%r14d,%r14d - addl %r9d,%ebx - addl %edi,%r9d - movl %ebx,%r13d - addl %r9d,%r14d - shrdl $14,%r13d,%r13d - movl %r14d,%r9d - movl %ecx,%r12d - shrdl $9,%r14d,%r14d - xorl %ebx,%r13d - xorl %edx,%r12d - shrdl $5,%r13d,%r13d - xorl %r9d,%r14d - andl %ebx,%r12d - xorl %ebx,%r13d - addl 12(%rsp),%r8d - movl %r9d,%edi - xorl %edx,%r12d - shrdl $11,%r14d,%r14d - xorl %r10d,%edi - addl %r12d,%r8d - shrdl $6,%r13d,%r13d - andl %edi,%r15d - xorl %r9d,%r14d - addl %r13d,%r8d - xorl %r10d,%r15d - shrdl $2,%r14d,%r14d - addl %r8d,%eax - addl %r15d,%r8d - movl %eax,%r13d - addl %r8d,%r14d - shrdl $14,%r13d,%r13d - movl %r14d,%r8d - movl %ebx,%r12d - shrdl $9,%r14d,%r14d - xorl %eax,%r13d - xorl %ecx,%r12d - shrdl $5,%r13d,%r13d - xorl %r8d,%r14d - andl %eax,%r12d - xorl %eax,%r13d - addl 16(%rsp),%edx - movl %r8d,%r15d - xorl %ecx,%r12d - shrdl $11,%r14d,%r14d - xorl %r9d,%r15d - addl %r12d,%edx - shrdl $6,%r13d,%r13d - andl %r15d,%edi - xorl %r8d,%r14d - addl %r13d,%edx - xorl %r9d,%edi - shrdl $2,%r14d,%r14d - addl %edx,%r11d - addl %edi,%edx - movl %r11d,%r13d - addl %edx,%r14d - shrdl $14,%r13d,%r13d - movl %r14d,%edx - movl %eax,%r12d - shrdl $9,%r14d,%r14d - xorl %r11d,%r13d - xorl %ebx,%r12d - shrdl $5,%r13d,%r13d - xorl %edx,%r14d - andl %r11d,%r12d - xorl %r11d,%r13d - addl 20(%rsp),%ecx - movl %edx,%edi - xorl %ebx,%r12d - shrdl $11,%r14d,%r14d - xorl %r8d,%edi - addl %r12d,%ecx - shrdl $6,%r13d,%r13d - andl %edi,%r15d - xorl %edx,%r14d - addl %r13d,%ecx - xorl %r8d,%r15d - shrdl $2,%r14d,%r14d - addl %ecx,%r10d - addl %r15d,%ecx - movl %r10d,%r13d - addl %ecx,%r14d - shrdl $14,%r13d,%r13d - movl %r14d,%ecx - movl %r11d,%r12d - shrdl $9,%r14d,%r14d - xorl %r10d,%r13d - xorl %eax,%r12d - shrdl $5,%r13d,%r13d - xorl %ecx,%r14d - andl %r10d,%r12d - xorl %r10d,%r13d - addl 24(%rsp),%ebx - movl %ecx,%r15d - xorl %eax,%r12d - shrdl $11,%r14d,%r14d - xorl %edx,%r15d - addl %r12d,%ebx - shrdl $6,%r13d,%r13d - andl %r15d,%edi - xorl %ecx,%r14d - addl %r13d,%ebx - xorl %edx,%edi - shrdl $2,%r14d,%r14d - addl %ebx,%r9d - addl %edi,%ebx - movl %r9d,%r13d - addl %ebx,%r14d - shrdl $14,%r13d,%r13d - movl %r14d,%ebx - movl %r10d,%r12d - shrdl $9,%r14d,%r14d - xorl %r9d,%r13d - xorl %r11d,%r12d - shrdl $5,%r13d,%r13d - xorl %ebx,%r14d - andl %r9d,%r12d - xorl %r9d,%r13d - addl 28(%rsp),%eax - movl %ebx,%edi - xorl %r11d,%r12d - shrdl $11,%r14d,%r14d - xorl %ecx,%edi - addl %r12d,%eax - shrdl $6,%r13d,%r13d - andl %edi,%r15d - xorl %ebx,%r14d - addl %r13d,%eax - xorl %ecx,%r15d - shrdl $2,%r14d,%r14d - addl %eax,%r8d - addl %r15d,%eax - movl %r8d,%r13d - addl %eax,%r14d - shrdl $14,%r13d,%r13d - movl %r14d,%eax - movl %r9d,%r12d - shrdl $9,%r14d,%r14d - xorl %r8d,%r13d - xorl %r10d,%r12d - shrdl $5,%r13d,%r13d - xorl %eax,%r14d - andl %r8d,%r12d - xorl %r8d,%r13d - addl 32(%rsp),%r11d - movl %eax,%r15d - xorl %r10d,%r12d - shrdl $11,%r14d,%r14d - xorl %ebx,%r15d - addl %r12d,%r11d - shrdl $6,%r13d,%r13d - andl %r15d,%edi - xorl %eax,%r14d - addl %r13d,%r11d - xorl %ebx,%edi - shrdl $2,%r14d,%r14d - addl %r11d,%edx - addl %edi,%r11d - movl %edx,%r13d - addl %r11d,%r14d - shrdl $14,%r13d,%r13d - movl %r14d,%r11d - movl %r8d,%r12d - shrdl $9,%r14d,%r14d - xorl %edx,%r13d - xorl %r9d,%r12d - shrdl $5,%r13d,%r13d - xorl %r11d,%r14d - andl %edx,%r12d - xorl %edx,%r13d - addl 36(%rsp),%r10d - movl %r11d,%edi - xorl %r9d,%r12d - shrdl $11,%r14d,%r14d - xorl %eax,%edi - addl %r12d,%r10d - shrdl $6,%r13d,%r13d - andl %edi,%r15d - xorl %r11d,%r14d - addl %r13d,%r10d - xorl %eax,%r15d - shrdl $2,%r14d,%r14d - addl %r10d,%ecx - addl %r15d,%r10d - movl %ecx,%r13d - addl %r10d,%r14d - shrdl $14,%r13d,%r13d - movl %r14d,%r10d - movl %edx,%r12d - shrdl $9,%r14d,%r14d - xorl %ecx,%r13d - xorl %r8d,%r12d - shrdl $5,%r13d,%r13d - xorl %r10d,%r14d - andl %ecx,%r12d - xorl %ecx,%r13d - addl 40(%rsp),%r9d - movl %r10d,%r15d - xorl %r8d,%r12d - shrdl $11,%r14d,%r14d - xorl %r11d,%r15d - addl %r12d,%r9d - shrdl $6,%r13d,%r13d - andl %r15d,%edi - xorl %r10d,%r14d - addl %r13d,%r9d - xorl %r11d,%edi - shrdl $2,%r14d,%r14d - addl %r9d,%ebx - addl %edi,%r9d - movl %ebx,%r13d - addl %r9d,%r14d - shrdl $14,%r13d,%r13d - movl %r14d,%r9d - movl %ecx,%r12d - shrdl $9,%r14d,%r14d - xorl %ebx,%r13d - xorl %edx,%r12d - shrdl $5,%r13d,%r13d - xorl %r9d,%r14d - andl %ebx,%r12d - xorl %ebx,%r13d - addl 44(%rsp),%r8d - movl %r9d,%edi - xorl %edx,%r12d - shrdl $11,%r14d,%r14d - xorl %r10d,%edi - addl %r12d,%r8d - shrdl $6,%r13d,%r13d - andl %edi,%r15d - xorl %r9d,%r14d - addl %r13d,%r8d - xorl %r10d,%r15d - shrdl $2,%r14d,%r14d - addl %r8d,%eax - addl %r15d,%r8d - movl %eax,%r13d - addl %r8d,%r14d - shrdl $14,%r13d,%r13d - movl %r14d,%r8d - movl %ebx,%r12d - shrdl $9,%r14d,%r14d - xorl %eax,%r13d - xorl %ecx,%r12d - shrdl $5,%r13d,%r13d - xorl %r8d,%r14d - andl %eax,%r12d - xorl %eax,%r13d - addl 48(%rsp),%edx - movl %r8d,%r15d - xorl %ecx,%r12d - shrdl $11,%r14d,%r14d - xorl %r9d,%r15d - addl %r12d,%edx - shrdl $6,%r13d,%r13d - andl %r15d,%edi - xorl %r8d,%r14d - addl %r13d,%edx - xorl %r9d,%edi - shrdl $2,%r14d,%r14d - addl %edx,%r11d - addl %edi,%edx - movl %r11d,%r13d - addl %edx,%r14d - shrdl $14,%r13d,%r13d - movl %r14d,%edx - movl %eax,%r12d - shrdl $9,%r14d,%r14d - xorl %r11d,%r13d - xorl %ebx,%r12d - shrdl $5,%r13d,%r13d - xorl %edx,%r14d - andl %r11d,%r12d - xorl %r11d,%r13d - addl 52(%rsp),%ecx - movl %edx,%edi - xorl %ebx,%r12d - shrdl $11,%r14d,%r14d - xorl %r8d,%edi - addl %r12d,%ecx - shrdl $6,%r13d,%r13d - andl %edi,%r15d - xorl %edx,%r14d - addl %r13d,%ecx - xorl %r8d,%r15d - shrdl $2,%r14d,%r14d - addl %ecx,%r10d - addl %r15d,%ecx - movl %r10d,%r13d - addl %ecx,%r14d - shrdl $14,%r13d,%r13d - movl %r14d,%ecx - movl %r11d,%r12d - shrdl $9,%r14d,%r14d - xorl %r10d,%r13d - xorl %eax,%r12d - shrdl $5,%r13d,%r13d - xorl %ecx,%r14d - andl %r10d,%r12d - xorl %r10d,%r13d - addl 56(%rsp),%ebx - movl %ecx,%r15d - xorl %eax,%r12d - shrdl $11,%r14d,%r14d - xorl %edx,%r15d - addl %r12d,%ebx - shrdl $6,%r13d,%r13d - andl %r15d,%edi - xorl %ecx,%r14d - addl %r13d,%ebx - xorl %edx,%edi - shrdl $2,%r14d,%r14d - addl %ebx,%r9d - addl %edi,%ebx - movl %r9d,%r13d - addl %ebx,%r14d - shrdl $14,%r13d,%r13d - movl %r14d,%ebx - movl %r10d,%r12d - shrdl $9,%r14d,%r14d - xorl %r9d,%r13d - xorl %r11d,%r12d - shrdl $5,%r13d,%r13d - xorl %ebx,%r14d - andl %r9d,%r12d - xorl %r9d,%r13d - addl 60(%rsp),%eax - movl %ebx,%edi - xorl %r11d,%r12d - shrdl $11,%r14d,%r14d - xorl %ecx,%edi - addl %r12d,%eax - shrdl $6,%r13d,%r13d - andl %edi,%r15d - xorl %ebx,%r14d - addl %r13d,%eax - xorl %ecx,%r15d - shrdl $2,%r14d,%r14d - addl %eax,%r8d - addl %r15d,%eax - movl %r8d,%r13d - addl %eax,%r14d - movq 64+0(%rsp),%rdi - movl %r14d,%eax - - addl 0(%rdi),%eax - leaq 64(%rsi),%rsi - addl 4(%rdi),%ebx - addl 8(%rdi),%ecx - addl 12(%rdi),%edx - addl 16(%rdi),%r8d - addl 20(%rdi),%r9d - addl 24(%rdi),%r10d - addl 28(%rdi),%r11d - - cmpq 64+16(%rsp),%rsi - - movl %eax,0(%rdi) - movl %ebx,4(%rdi) - movl %ecx,8(%rdi) - movl %edx,12(%rdi) - movl %r8d,16(%rdi) - movl %r9d,20(%rdi) - movl %r10d,24(%rdi) - movl %r11d,28(%rdi) - jb L$loop_avx - - movq 88(%rsp),%rsi - - vzeroupper - movq -48(%rsi),%r15 - - movq -40(%rsi),%r14 - - movq -32(%rsi),%r13 - - movq -24(%rsi),%r12 - - movq -16(%rsi),%rbp - - movq -8(%rsi),%rbx - - leaq (%rsi),%rsp - -L$epilogue_avx: - .byte 0xf3,0xc3 - - -#endif Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/sha256-x86_64-nasm.obj and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/sha256-x86_64-nasm.obj differ diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/sha512-armv4-ios32.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/sha512-armv4-ios32.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/sha512-armv4-ios32.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/sha512-armv4-ios32.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,1887 +0,0 @@ -// This file is generated from a similarly-named Perl script in the BoringSSL -// source tree. Do not edit by hand. - -#if !defined(__has_feature) -#define __has_feature(x) 0 -#endif -#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) -#define OPENSSL_NO_ASM -#endif - -#if !defined(OPENSSL_NO_ASM) -@ Copyright 2007-2016 The OpenSSL Project Authors. All Rights Reserved. -@ -@ Licensed under the OpenSSL license (the "License"). You may not use -@ this file except in compliance with the License. You can obtain a copy -@ in the file LICENSE in the source distribution or at -@ https://www.openssl.org/source/license.html - - -@ ==================================================================== -@ Written by Andy Polyakov for the OpenSSL -@ project. The module is, however, dual licensed under OpenSSL and -@ CRYPTOGAMS licenses depending on where you obtain it. For further -@ details see http://www.openssl.org/~appro/cryptogams/. -@ -@ Permission to use under GPL terms is granted. -@ ==================================================================== - -@ SHA512 block procedure for ARMv4. September 2007. - -@ This code is ~4.5 (four and a half) times faster than code generated -@ by gcc 3.4 and it spends ~72 clock cycles per byte [on single-issue -@ Xscale PXA250 core]. -@ -@ July 2010. -@ -@ Rescheduling for dual-issue pipeline resulted in 6% improvement on -@ Cortex A8 core and ~40 cycles per processed byte. - -@ February 2011. -@ -@ Profiler-assisted and platform-specific optimization resulted in 7% -@ improvement on Coxtex A8 core and ~38 cycles per byte. - -@ March 2011. -@ -@ Add NEON implementation. On Cortex A8 it was measured to process -@ one byte in 23.3 cycles or ~60% faster than integer-only code. - -@ August 2012. -@ -@ Improve NEON performance by 12% on Snapdragon S4. In absolute -@ terms it's 22.6 cycles per byte, which is disappointing result. -@ Technical writers asserted that 3-way S4 pipeline can sustain -@ multiple NEON instructions per cycle, but dual NEON issue could -@ not be observed, see http://www.openssl.org/~appro/Snapdragon-S4.html -@ for further details. On side note Cortex-A15 processes one byte in -@ 16 cycles. - -@ Byte order [in]dependence. ========================================= -@ -@ Originally caller was expected to maintain specific *dword* order in -@ h[0-7], namely with most significant dword at *lower* address, which -@ was reflected in below two parameters as 0 and 4. Now caller is -@ expected to maintain native byte order for whole 64-bit values. -#ifndef __KERNEL__ -# include -# define VFP_ABI_PUSH vstmdb sp!,{d8-d15} -# define VFP_ABI_POP vldmia sp!,{d8-d15} -#else -# define __ARM_ARCH__ __LINUX_ARM_ARCH__ -# define __ARM_MAX_ARCH__ 7 -# define VFP_ABI_PUSH -# define VFP_ABI_POP -#endif - -@ Silence ARMv8 deprecated IT instruction warnings. This file is used by both -@ ARMv7 and ARMv8 processors and does not use ARMv8 instructions. - - -#ifdef __ARMEL__ -# define LO 0 -# define HI 4 -# define WORD64(hi0,lo0,hi1,lo1) .word lo0,hi0, lo1,hi1 -#else -# define HI 0 -# define LO 4 -# define WORD64(hi0,lo0,hi1,lo1) .word hi0,lo0, hi1,lo1 -#endif - -.text -#if defined(__thumb2__) -.syntax unified -.thumb -# define adrl adr -#else -.code 32 -#endif - - -.align 5 -K512: - WORD64(0x428a2f98,0xd728ae22, 0x71374491,0x23ef65cd) - WORD64(0xb5c0fbcf,0xec4d3b2f, 0xe9b5dba5,0x8189dbbc) - WORD64(0x3956c25b,0xf348b538, 0x59f111f1,0xb605d019) - WORD64(0x923f82a4,0xaf194f9b, 0xab1c5ed5,0xda6d8118) - WORD64(0xd807aa98,0xa3030242, 0x12835b01,0x45706fbe) - WORD64(0x243185be,0x4ee4b28c, 0x550c7dc3,0xd5ffb4e2) - WORD64(0x72be5d74,0xf27b896f, 0x80deb1fe,0x3b1696b1) - WORD64(0x9bdc06a7,0x25c71235, 0xc19bf174,0xcf692694) - WORD64(0xe49b69c1,0x9ef14ad2, 0xefbe4786,0x384f25e3) - WORD64(0x0fc19dc6,0x8b8cd5b5, 0x240ca1cc,0x77ac9c65) - WORD64(0x2de92c6f,0x592b0275, 0x4a7484aa,0x6ea6e483) - WORD64(0x5cb0a9dc,0xbd41fbd4, 0x76f988da,0x831153b5) - WORD64(0x983e5152,0xee66dfab, 0xa831c66d,0x2db43210) - WORD64(0xb00327c8,0x98fb213f, 0xbf597fc7,0xbeef0ee4) - WORD64(0xc6e00bf3,0x3da88fc2, 0xd5a79147,0x930aa725) - WORD64(0x06ca6351,0xe003826f, 0x14292967,0x0a0e6e70) - WORD64(0x27b70a85,0x46d22ffc, 0x2e1b2138,0x5c26c926) - WORD64(0x4d2c6dfc,0x5ac42aed, 0x53380d13,0x9d95b3df) - WORD64(0x650a7354,0x8baf63de, 0x766a0abb,0x3c77b2a8) - WORD64(0x81c2c92e,0x47edaee6, 0x92722c85,0x1482353b) - WORD64(0xa2bfe8a1,0x4cf10364, 0xa81a664b,0xbc423001) - WORD64(0xc24b8b70,0xd0f89791, 0xc76c51a3,0x0654be30) - WORD64(0xd192e819,0xd6ef5218, 0xd6990624,0x5565a910) - WORD64(0xf40e3585,0x5771202a, 0x106aa070,0x32bbd1b8) - WORD64(0x19a4c116,0xb8d2d0c8, 0x1e376c08,0x5141ab53) - WORD64(0x2748774c,0xdf8eeb99, 0x34b0bcb5,0xe19b48a8) - WORD64(0x391c0cb3,0xc5c95a63, 0x4ed8aa4a,0xe3418acb) - WORD64(0x5b9cca4f,0x7763e373, 0x682e6ff3,0xd6b2b8a3) - WORD64(0x748f82ee,0x5defb2fc, 0x78a5636f,0x43172f60) - WORD64(0x84c87814,0xa1f0ab72, 0x8cc70208,0x1a6439ec) - WORD64(0x90befffa,0x23631e28, 0xa4506ceb,0xde82bde9) - WORD64(0xbef9a3f7,0xb2c67915, 0xc67178f2,0xe372532b) - WORD64(0xca273ece,0xea26619c, 0xd186b8c7,0x21c0c207) - WORD64(0xeada7dd6,0xcde0eb1e, 0xf57d4f7f,0xee6ed178) - WORD64(0x06f067aa,0x72176fba, 0x0a637dc5,0xa2c898a6) - WORD64(0x113f9804,0xbef90dae, 0x1b710b35,0x131c471b) - WORD64(0x28db77f5,0x23047d84, 0x32caab7b,0x40c72493) - WORD64(0x3c9ebe0a,0x15c9bebc, 0x431d67c4,0x9c100d4c) - WORD64(0x4cc5d4be,0xcb3e42b6, 0x597f299c,0xfc657e2a) - WORD64(0x5fcb6fab,0x3ad6faec, 0x6c44198c,0x4a475817) - -#if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__) - -.private_extern _GFp_armcap_P -LOPENSSL_armcap: -.word _GFp_armcap_P-Lsha512_block_data_order -.skip 32-4 -#else -.skip 32 -#endif - -.globl _GFp_sha512_block_data_order -.private_extern _GFp_sha512_block_data_order -#ifdef __thumb2__ -.thumb_func _GFp_sha512_block_data_order -#endif -_GFp_sha512_block_data_order: -Lsha512_block_data_order: -#if __ARM_ARCH__<7 && !defined(__thumb2__) - sub r3,pc,#8 @ _GFp_sha512_block_data_order -#else - adr r3,Lsha512_block_data_order -#endif -#if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__) - ldr r12,LOPENSSL_armcap - ldr r12,[r3,r12] @ _GFp_armcap_P -#ifdef __APPLE__ - ldr r12,[r12] -#endif - tst r12,#ARMV7_NEON - bne LNEON -#endif - add r2,r1,r2,lsl#7 @ len to point at the end of inp - stmdb sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} - sub r14,r3,#672 @ K512 - sub sp,sp,#9*8 - - ldr r7,[r0,#32+LO] - ldr r8,[r0,#32+HI] - ldr r9, [r0,#48+LO] - ldr r10, [r0,#48+HI] - ldr r11, [r0,#56+LO] - ldr r12, [r0,#56+HI] -Loop: - str r9, [sp,#48+0] - str r10, [sp,#48+4] - str r11, [sp,#56+0] - str r12, [sp,#56+4] - ldr r5,[r0,#0+LO] - ldr r6,[r0,#0+HI] - ldr r3,[r0,#8+LO] - ldr r4,[r0,#8+HI] - ldr r9, [r0,#16+LO] - ldr r10, [r0,#16+HI] - ldr r11, [r0,#24+LO] - ldr r12, [r0,#24+HI] - str r3,[sp,#8+0] - str r4,[sp,#8+4] - str r9, [sp,#16+0] - str r10, [sp,#16+4] - str r11, [sp,#24+0] - str r12, [sp,#24+4] - ldr r3,[r0,#40+LO] - ldr r4,[r0,#40+HI] - str r3,[sp,#40+0] - str r4,[sp,#40+4] - -L00_15: -#if __ARM_ARCH__<7 - ldrb r3,[r1,#7] - ldrb r9, [r1,#6] - ldrb r10, [r1,#5] - ldrb r11, [r1,#4] - ldrb r4,[r1,#3] - ldrb r12, [r1,#2] - orr r3,r3,r9,lsl#8 - ldrb r9, [r1,#1] - orr r3,r3,r10,lsl#16 - ldrb r10, [r1],#8 - orr r3,r3,r11,lsl#24 - orr r4,r4,r12,lsl#8 - orr r4,r4,r9,lsl#16 - orr r4,r4,r10,lsl#24 -#else - ldr r3,[r1,#4] - ldr r4,[r1],#8 -#ifdef __ARMEL__ - rev r3,r3 - rev r4,r4 -#endif -#endif - @ Sigma1(x) (ROTR((x),14) ^ ROTR((x),18) ^ ROTR((x),41)) - @ LO lo>>14^hi<<18 ^ lo>>18^hi<<14 ^ hi>>9^lo<<23 - @ HI hi>>14^lo<<18 ^ hi>>18^lo<<14 ^ lo>>9^hi<<23 - mov r9,r7,lsr#14 - str r3,[sp,#64+0] - mov r10,r8,lsr#14 - str r4,[sp,#64+4] - eor r9,r9,r8,lsl#18 - ldr r11,[sp,#56+0] @ h.lo - eor r10,r10,r7,lsl#18 - ldr r12,[sp,#56+4] @ h.hi - eor r9,r9,r7,lsr#18 - eor r10,r10,r8,lsr#18 - eor r9,r9,r8,lsl#14 - eor r10,r10,r7,lsl#14 - eor r9,r9,r8,lsr#9 - eor r10,r10,r7,lsr#9 - eor r9,r9,r7,lsl#23 - eor r10,r10,r8,lsl#23 @ Sigma1(e) - adds r3,r3,r9 - ldr r9,[sp,#40+0] @ f.lo - adc r4,r4,r10 @ T += Sigma1(e) - ldr r10,[sp,#40+4] @ f.hi - adds r3,r3,r11 - ldr r11,[sp,#48+0] @ g.lo - adc r4,r4,r12 @ T += h - ldr r12,[sp,#48+4] @ g.hi - - eor r9,r9,r11 - str r7,[sp,#32+0] - eor r10,r10,r12 - str r8,[sp,#32+4] - and r9,r9,r7 - str r5,[sp,#0+0] - and r10,r10,r8 - str r6,[sp,#0+4] - eor r9,r9,r11 - ldr r11,[r14,#LO] @ K[i].lo - eor r10,r10,r12 @ Ch(e,f,g) - ldr r12,[r14,#HI] @ K[i].hi - - adds r3,r3,r9 - ldr r7,[sp,#24+0] @ d.lo - adc r4,r4,r10 @ T += Ch(e,f,g) - ldr r8,[sp,#24+4] @ d.hi - adds r3,r3,r11 - and r9,r11,#0xff - adc r4,r4,r12 @ T += K[i] - adds r7,r7,r3 - ldr r11,[sp,#8+0] @ b.lo - adc r8,r8,r4 @ d += T - teq r9,#148 - - ldr r12,[sp,#16+0] @ c.lo -#if __ARM_ARCH__>=7 - it eq @ Thumb2 thing, sanity check in ARM -#endif - orreq r14,r14,#1 - @ Sigma0(x) (ROTR((x),28) ^ ROTR((x),34) ^ ROTR((x),39)) - @ LO lo>>28^hi<<4 ^ hi>>2^lo<<30 ^ hi>>7^lo<<25 - @ HI hi>>28^lo<<4 ^ lo>>2^hi<<30 ^ lo>>7^hi<<25 - mov r9,r5,lsr#28 - mov r10,r6,lsr#28 - eor r9,r9,r6,lsl#4 - eor r10,r10,r5,lsl#4 - eor r9,r9,r6,lsr#2 - eor r10,r10,r5,lsr#2 - eor r9,r9,r5,lsl#30 - eor r10,r10,r6,lsl#30 - eor r9,r9,r6,lsr#7 - eor r10,r10,r5,lsr#7 - eor r9,r9,r5,lsl#25 - eor r10,r10,r6,lsl#25 @ Sigma0(a) - adds r3,r3,r9 - and r9,r5,r11 - adc r4,r4,r10 @ T += Sigma0(a) - - ldr r10,[sp,#8+4] @ b.hi - orr r5,r5,r11 - ldr r11,[sp,#16+4] @ c.hi - and r5,r5,r12 - and r12,r6,r10 - orr r6,r6,r10 - orr r5,r5,r9 @ Maj(a,b,c).lo - and r6,r6,r11 - adds r5,r5,r3 - orr r6,r6,r12 @ Maj(a,b,c).hi - sub sp,sp,#8 - adc r6,r6,r4 @ h += T - tst r14,#1 - add r14,r14,#8 - tst r14,#1 - beq L00_15 - ldr r9,[sp,#184+0] - ldr r10,[sp,#184+4] - bic r14,r14,#1 -L16_79: - @ sigma0(x) (ROTR((x),1) ^ ROTR((x),8) ^ ((x)>>7)) - @ LO lo>>1^hi<<31 ^ lo>>8^hi<<24 ^ lo>>7^hi<<25 - @ HI hi>>1^lo<<31 ^ hi>>8^lo<<24 ^ hi>>7 - mov r3,r9,lsr#1 - ldr r11,[sp,#80+0] - mov r4,r10,lsr#1 - ldr r12,[sp,#80+4] - eor r3,r3,r10,lsl#31 - eor r4,r4,r9,lsl#31 - eor r3,r3,r9,lsr#8 - eor r4,r4,r10,lsr#8 - eor r3,r3,r10,lsl#24 - eor r4,r4,r9,lsl#24 - eor r3,r3,r9,lsr#7 - eor r4,r4,r10,lsr#7 - eor r3,r3,r10,lsl#25 - - @ sigma1(x) (ROTR((x),19) ^ ROTR((x),61) ^ ((x)>>6)) - @ LO lo>>19^hi<<13 ^ hi>>29^lo<<3 ^ lo>>6^hi<<26 - @ HI hi>>19^lo<<13 ^ lo>>29^hi<<3 ^ hi>>6 - mov r9,r11,lsr#19 - mov r10,r12,lsr#19 - eor r9,r9,r12,lsl#13 - eor r10,r10,r11,lsl#13 - eor r9,r9,r12,lsr#29 - eor r10,r10,r11,lsr#29 - eor r9,r9,r11,lsl#3 - eor r10,r10,r12,lsl#3 - eor r9,r9,r11,lsr#6 - eor r10,r10,r12,lsr#6 - ldr r11,[sp,#120+0] - eor r9,r9,r12,lsl#26 - - ldr r12,[sp,#120+4] - adds r3,r3,r9 - ldr r9,[sp,#192+0] - adc r4,r4,r10 - - ldr r10,[sp,#192+4] - adds r3,r3,r11 - adc r4,r4,r12 - adds r3,r3,r9 - adc r4,r4,r10 - @ Sigma1(x) (ROTR((x),14) ^ ROTR((x),18) ^ ROTR((x),41)) - @ LO lo>>14^hi<<18 ^ lo>>18^hi<<14 ^ hi>>9^lo<<23 - @ HI hi>>14^lo<<18 ^ hi>>18^lo<<14 ^ lo>>9^hi<<23 - mov r9,r7,lsr#14 - str r3,[sp,#64+0] - mov r10,r8,lsr#14 - str r4,[sp,#64+4] - eor r9,r9,r8,lsl#18 - ldr r11,[sp,#56+0] @ h.lo - eor r10,r10,r7,lsl#18 - ldr r12,[sp,#56+4] @ h.hi - eor r9,r9,r7,lsr#18 - eor r10,r10,r8,lsr#18 - eor r9,r9,r8,lsl#14 - eor r10,r10,r7,lsl#14 - eor r9,r9,r8,lsr#9 - eor r10,r10,r7,lsr#9 - eor r9,r9,r7,lsl#23 - eor r10,r10,r8,lsl#23 @ Sigma1(e) - adds r3,r3,r9 - ldr r9,[sp,#40+0] @ f.lo - adc r4,r4,r10 @ T += Sigma1(e) - ldr r10,[sp,#40+4] @ f.hi - adds r3,r3,r11 - ldr r11,[sp,#48+0] @ g.lo - adc r4,r4,r12 @ T += h - ldr r12,[sp,#48+4] @ g.hi - - eor r9,r9,r11 - str r7,[sp,#32+0] - eor r10,r10,r12 - str r8,[sp,#32+4] - and r9,r9,r7 - str r5,[sp,#0+0] - and r10,r10,r8 - str r6,[sp,#0+4] - eor r9,r9,r11 - ldr r11,[r14,#LO] @ K[i].lo - eor r10,r10,r12 @ Ch(e,f,g) - ldr r12,[r14,#HI] @ K[i].hi - - adds r3,r3,r9 - ldr r7,[sp,#24+0] @ d.lo - adc r4,r4,r10 @ T += Ch(e,f,g) - ldr r8,[sp,#24+4] @ d.hi - adds r3,r3,r11 - and r9,r11,#0xff - adc r4,r4,r12 @ T += K[i] - adds r7,r7,r3 - ldr r11,[sp,#8+0] @ b.lo - adc r8,r8,r4 @ d += T - teq r9,#23 - - ldr r12,[sp,#16+0] @ c.lo -#if __ARM_ARCH__>=7 - it eq @ Thumb2 thing, sanity check in ARM -#endif - orreq r14,r14,#1 - @ Sigma0(x) (ROTR((x),28) ^ ROTR((x),34) ^ ROTR((x),39)) - @ LO lo>>28^hi<<4 ^ hi>>2^lo<<30 ^ hi>>7^lo<<25 - @ HI hi>>28^lo<<4 ^ lo>>2^hi<<30 ^ lo>>7^hi<<25 - mov r9,r5,lsr#28 - mov r10,r6,lsr#28 - eor r9,r9,r6,lsl#4 - eor r10,r10,r5,lsl#4 - eor r9,r9,r6,lsr#2 - eor r10,r10,r5,lsr#2 - eor r9,r9,r5,lsl#30 - eor r10,r10,r6,lsl#30 - eor r9,r9,r6,lsr#7 - eor r10,r10,r5,lsr#7 - eor r9,r9,r5,lsl#25 - eor r10,r10,r6,lsl#25 @ Sigma0(a) - adds r3,r3,r9 - and r9,r5,r11 - adc r4,r4,r10 @ T += Sigma0(a) - - ldr r10,[sp,#8+4] @ b.hi - orr r5,r5,r11 - ldr r11,[sp,#16+4] @ c.hi - and r5,r5,r12 - and r12,r6,r10 - orr r6,r6,r10 - orr r5,r5,r9 @ Maj(a,b,c).lo - and r6,r6,r11 - adds r5,r5,r3 - orr r6,r6,r12 @ Maj(a,b,c).hi - sub sp,sp,#8 - adc r6,r6,r4 @ h += T - tst r14,#1 - add r14,r14,#8 -#if __ARM_ARCH__>=7 - ittt eq @ Thumb2 thing, sanity check in ARM -#endif - ldreq r9,[sp,#184+0] - ldreq r10,[sp,#184+4] - beq L16_79 - bic r14,r14,#1 - - ldr r3,[sp,#8+0] - ldr r4,[sp,#8+4] - ldr r9, [r0,#0+LO] - ldr r10, [r0,#0+HI] - ldr r11, [r0,#8+LO] - ldr r12, [r0,#8+HI] - adds r9,r5,r9 - str r9, [r0,#0+LO] - adc r10,r6,r10 - str r10, [r0,#0+HI] - adds r11,r3,r11 - str r11, [r0,#8+LO] - adc r12,r4,r12 - str r12, [r0,#8+HI] - - ldr r5,[sp,#16+0] - ldr r6,[sp,#16+4] - ldr r3,[sp,#24+0] - ldr r4,[sp,#24+4] - ldr r9, [r0,#16+LO] - ldr r10, [r0,#16+HI] - ldr r11, [r0,#24+LO] - ldr r12, [r0,#24+HI] - adds r9,r5,r9 - str r9, [r0,#16+LO] - adc r10,r6,r10 - str r10, [r0,#16+HI] - adds r11,r3,r11 - str r11, [r0,#24+LO] - adc r12,r4,r12 - str r12, [r0,#24+HI] - - ldr r3,[sp,#40+0] - ldr r4,[sp,#40+4] - ldr r9, [r0,#32+LO] - ldr r10, [r0,#32+HI] - ldr r11, [r0,#40+LO] - ldr r12, [r0,#40+HI] - adds r7,r7,r9 - str r7,[r0,#32+LO] - adc r8,r8,r10 - str r8,[r0,#32+HI] - adds r11,r3,r11 - str r11, [r0,#40+LO] - adc r12,r4,r12 - str r12, [r0,#40+HI] - - ldr r5,[sp,#48+0] - ldr r6,[sp,#48+4] - ldr r3,[sp,#56+0] - ldr r4,[sp,#56+4] - ldr r9, [r0,#48+LO] - ldr r10, [r0,#48+HI] - ldr r11, [r0,#56+LO] - ldr r12, [r0,#56+HI] - adds r9,r5,r9 - str r9, [r0,#48+LO] - adc r10,r6,r10 - str r10, [r0,#48+HI] - adds r11,r3,r11 - str r11, [r0,#56+LO] - adc r12,r4,r12 - str r12, [r0,#56+HI] - - add sp,sp,#640 - sub r14,r14,#640 - - teq r1,r2 - bne Loop - - add sp,sp,#8*9 @ destroy frame -#if __ARM_ARCH__>=5 - ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,pc} -#else - ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} - tst lr,#1 - moveq pc,lr @ be binary compatible with V4, yet -.word 0xe12fff1e @ interoperable with Thumb ISA:-) -#endif - -#if __ARM_MAX_ARCH__>=7 - - - -#ifdef __thumb2__ -.thumb_func sha512_block_data_order_neon -#endif -.align 4 -sha512_block_data_order_neon: -LNEON: - dmb @ errata #451034 on early Cortex A8 - add r2,r1,r2,lsl#7 @ len to point at the end of inp - adr r3,K512 - VFP_ABI_PUSH - vldmia r0,{d16,d17,d18,d19,d20,d21,d22,d23} @ load context -Loop_neon: - vshr.u64 d24,d20,#14 @ 0 -#if 0<16 - vld1.64 {d0},[r1]! @ handles unaligned -#endif - vshr.u64 d25,d20,#18 -#if 0>0 - vadd.i64 d16,d30 @ h+=Maj from the past -#endif - vshr.u64 d26,d20,#41 - vld1.64 {d28},[r3,:64]! @ K[i++] - vsli.64 d24,d20,#50 - vsli.64 d25,d20,#46 - vmov d29,d20 - vsli.64 d26,d20,#23 -#if 0<16 && defined(__ARMEL__) - vrev64.8 d0,d0 -#endif - veor d25,d24 - vbsl d29,d21,d22 @ Ch(e,f,g) - vshr.u64 d24,d16,#28 - veor d26,d25 @ Sigma1(e) - vadd.i64 d27,d29,d23 - vshr.u64 d25,d16,#34 - vsli.64 d24,d16,#36 - vadd.i64 d27,d26 - vshr.u64 d26,d16,#39 - vadd.i64 d28,d0 - vsli.64 d25,d16,#30 - veor d30,d16,d17 - vsli.64 d26,d16,#25 - veor d23,d24,d25 - vadd.i64 d27,d28 - vbsl d30,d18,d17 @ Maj(a,b,c) - veor d23,d26 @ Sigma0(a) - vadd.i64 d19,d27 - vadd.i64 d30,d27 - @ vadd.i64 d23,d30 - vshr.u64 d24,d19,#14 @ 1 -#if 1<16 - vld1.64 {d1},[r1]! @ handles unaligned -#endif - vshr.u64 d25,d19,#18 -#if 1>0 - vadd.i64 d23,d30 @ h+=Maj from the past -#endif - vshr.u64 d26,d19,#41 - vld1.64 {d28},[r3,:64]! @ K[i++] - vsli.64 d24,d19,#50 - vsli.64 d25,d19,#46 - vmov d29,d19 - vsli.64 d26,d19,#23 -#if 1<16 && defined(__ARMEL__) - vrev64.8 d1,d1 -#endif - veor d25,d24 - vbsl d29,d20,d21 @ Ch(e,f,g) - vshr.u64 d24,d23,#28 - veor d26,d25 @ Sigma1(e) - vadd.i64 d27,d29,d22 - vshr.u64 d25,d23,#34 - vsli.64 d24,d23,#36 - vadd.i64 d27,d26 - vshr.u64 d26,d23,#39 - vadd.i64 d28,d1 - vsli.64 d25,d23,#30 - veor d30,d23,d16 - vsli.64 d26,d23,#25 - veor d22,d24,d25 - vadd.i64 d27,d28 - vbsl d30,d17,d16 @ Maj(a,b,c) - veor d22,d26 @ Sigma0(a) - vadd.i64 d18,d27 - vadd.i64 d30,d27 - @ vadd.i64 d22,d30 - vshr.u64 d24,d18,#14 @ 2 -#if 2<16 - vld1.64 {d2},[r1]! @ handles unaligned -#endif - vshr.u64 d25,d18,#18 -#if 2>0 - vadd.i64 d22,d30 @ h+=Maj from the past -#endif - vshr.u64 d26,d18,#41 - vld1.64 {d28},[r3,:64]! @ K[i++] - vsli.64 d24,d18,#50 - vsli.64 d25,d18,#46 - vmov d29,d18 - vsli.64 d26,d18,#23 -#if 2<16 && defined(__ARMEL__) - vrev64.8 d2,d2 -#endif - veor d25,d24 - vbsl d29,d19,d20 @ Ch(e,f,g) - vshr.u64 d24,d22,#28 - veor d26,d25 @ Sigma1(e) - vadd.i64 d27,d29,d21 - vshr.u64 d25,d22,#34 - vsli.64 d24,d22,#36 - vadd.i64 d27,d26 - vshr.u64 d26,d22,#39 - vadd.i64 d28,d2 - vsli.64 d25,d22,#30 - veor d30,d22,d23 - vsli.64 d26,d22,#25 - veor d21,d24,d25 - vadd.i64 d27,d28 - vbsl d30,d16,d23 @ Maj(a,b,c) - veor d21,d26 @ Sigma0(a) - vadd.i64 d17,d27 - vadd.i64 d30,d27 - @ vadd.i64 d21,d30 - vshr.u64 d24,d17,#14 @ 3 -#if 3<16 - vld1.64 {d3},[r1]! @ handles unaligned -#endif - vshr.u64 d25,d17,#18 -#if 3>0 - vadd.i64 d21,d30 @ h+=Maj from the past -#endif - vshr.u64 d26,d17,#41 - vld1.64 {d28},[r3,:64]! @ K[i++] - vsli.64 d24,d17,#50 - vsli.64 d25,d17,#46 - vmov d29,d17 - vsli.64 d26,d17,#23 -#if 3<16 && defined(__ARMEL__) - vrev64.8 d3,d3 -#endif - veor d25,d24 - vbsl d29,d18,d19 @ Ch(e,f,g) - vshr.u64 d24,d21,#28 - veor d26,d25 @ Sigma1(e) - vadd.i64 d27,d29,d20 - vshr.u64 d25,d21,#34 - vsli.64 d24,d21,#36 - vadd.i64 d27,d26 - vshr.u64 d26,d21,#39 - vadd.i64 d28,d3 - vsli.64 d25,d21,#30 - veor d30,d21,d22 - vsli.64 d26,d21,#25 - veor d20,d24,d25 - vadd.i64 d27,d28 - vbsl d30,d23,d22 @ Maj(a,b,c) - veor d20,d26 @ Sigma0(a) - vadd.i64 d16,d27 - vadd.i64 d30,d27 - @ vadd.i64 d20,d30 - vshr.u64 d24,d16,#14 @ 4 -#if 4<16 - vld1.64 {d4},[r1]! @ handles unaligned -#endif - vshr.u64 d25,d16,#18 -#if 4>0 - vadd.i64 d20,d30 @ h+=Maj from the past -#endif - vshr.u64 d26,d16,#41 - vld1.64 {d28},[r3,:64]! @ K[i++] - vsli.64 d24,d16,#50 - vsli.64 d25,d16,#46 - vmov d29,d16 - vsli.64 d26,d16,#23 -#if 4<16 && defined(__ARMEL__) - vrev64.8 d4,d4 -#endif - veor d25,d24 - vbsl d29,d17,d18 @ Ch(e,f,g) - vshr.u64 d24,d20,#28 - veor d26,d25 @ Sigma1(e) - vadd.i64 d27,d29,d19 - vshr.u64 d25,d20,#34 - vsli.64 d24,d20,#36 - vadd.i64 d27,d26 - vshr.u64 d26,d20,#39 - vadd.i64 d28,d4 - vsli.64 d25,d20,#30 - veor d30,d20,d21 - vsli.64 d26,d20,#25 - veor d19,d24,d25 - vadd.i64 d27,d28 - vbsl d30,d22,d21 @ Maj(a,b,c) - veor d19,d26 @ Sigma0(a) - vadd.i64 d23,d27 - vadd.i64 d30,d27 - @ vadd.i64 d19,d30 - vshr.u64 d24,d23,#14 @ 5 -#if 5<16 - vld1.64 {d5},[r1]! @ handles unaligned -#endif - vshr.u64 d25,d23,#18 -#if 5>0 - vadd.i64 d19,d30 @ h+=Maj from the past -#endif - vshr.u64 d26,d23,#41 - vld1.64 {d28},[r3,:64]! @ K[i++] - vsli.64 d24,d23,#50 - vsli.64 d25,d23,#46 - vmov d29,d23 - vsli.64 d26,d23,#23 -#if 5<16 && defined(__ARMEL__) - vrev64.8 d5,d5 -#endif - veor d25,d24 - vbsl d29,d16,d17 @ Ch(e,f,g) - vshr.u64 d24,d19,#28 - veor d26,d25 @ Sigma1(e) - vadd.i64 d27,d29,d18 - vshr.u64 d25,d19,#34 - vsli.64 d24,d19,#36 - vadd.i64 d27,d26 - vshr.u64 d26,d19,#39 - vadd.i64 d28,d5 - vsli.64 d25,d19,#30 - veor d30,d19,d20 - vsli.64 d26,d19,#25 - veor d18,d24,d25 - vadd.i64 d27,d28 - vbsl d30,d21,d20 @ Maj(a,b,c) - veor d18,d26 @ Sigma0(a) - vadd.i64 d22,d27 - vadd.i64 d30,d27 - @ vadd.i64 d18,d30 - vshr.u64 d24,d22,#14 @ 6 -#if 6<16 - vld1.64 {d6},[r1]! @ handles unaligned -#endif - vshr.u64 d25,d22,#18 -#if 6>0 - vadd.i64 d18,d30 @ h+=Maj from the past -#endif - vshr.u64 d26,d22,#41 - vld1.64 {d28},[r3,:64]! @ K[i++] - vsli.64 d24,d22,#50 - vsli.64 d25,d22,#46 - vmov d29,d22 - vsli.64 d26,d22,#23 -#if 6<16 && defined(__ARMEL__) - vrev64.8 d6,d6 -#endif - veor d25,d24 - vbsl d29,d23,d16 @ Ch(e,f,g) - vshr.u64 d24,d18,#28 - veor d26,d25 @ Sigma1(e) - vadd.i64 d27,d29,d17 - vshr.u64 d25,d18,#34 - vsli.64 d24,d18,#36 - vadd.i64 d27,d26 - vshr.u64 d26,d18,#39 - vadd.i64 d28,d6 - vsli.64 d25,d18,#30 - veor d30,d18,d19 - vsli.64 d26,d18,#25 - veor d17,d24,d25 - vadd.i64 d27,d28 - vbsl d30,d20,d19 @ Maj(a,b,c) - veor d17,d26 @ Sigma0(a) - vadd.i64 d21,d27 - vadd.i64 d30,d27 - @ vadd.i64 d17,d30 - vshr.u64 d24,d21,#14 @ 7 -#if 7<16 - vld1.64 {d7},[r1]! @ handles unaligned -#endif - vshr.u64 d25,d21,#18 -#if 7>0 - vadd.i64 d17,d30 @ h+=Maj from the past -#endif - vshr.u64 d26,d21,#41 - vld1.64 {d28},[r3,:64]! @ K[i++] - vsli.64 d24,d21,#50 - vsli.64 d25,d21,#46 - vmov d29,d21 - vsli.64 d26,d21,#23 -#if 7<16 && defined(__ARMEL__) - vrev64.8 d7,d7 -#endif - veor d25,d24 - vbsl d29,d22,d23 @ Ch(e,f,g) - vshr.u64 d24,d17,#28 - veor d26,d25 @ Sigma1(e) - vadd.i64 d27,d29,d16 - vshr.u64 d25,d17,#34 - vsli.64 d24,d17,#36 - vadd.i64 d27,d26 - vshr.u64 d26,d17,#39 - vadd.i64 d28,d7 - vsli.64 d25,d17,#30 - veor d30,d17,d18 - vsli.64 d26,d17,#25 - veor d16,d24,d25 - vadd.i64 d27,d28 - vbsl d30,d19,d18 @ Maj(a,b,c) - veor d16,d26 @ Sigma0(a) - vadd.i64 d20,d27 - vadd.i64 d30,d27 - @ vadd.i64 d16,d30 - vshr.u64 d24,d20,#14 @ 8 -#if 8<16 - vld1.64 {d8},[r1]! @ handles unaligned -#endif - vshr.u64 d25,d20,#18 -#if 8>0 - vadd.i64 d16,d30 @ h+=Maj from the past -#endif - vshr.u64 d26,d20,#41 - vld1.64 {d28},[r3,:64]! @ K[i++] - vsli.64 d24,d20,#50 - vsli.64 d25,d20,#46 - vmov d29,d20 - vsli.64 d26,d20,#23 -#if 8<16 && defined(__ARMEL__) - vrev64.8 d8,d8 -#endif - veor d25,d24 - vbsl d29,d21,d22 @ Ch(e,f,g) - vshr.u64 d24,d16,#28 - veor d26,d25 @ Sigma1(e) - vadd.i64 d27,d29,d23 - vshr.u64 d25,d16,#34 - vsli.64 d24,d16,#36 - vadd.i64 d27,d26 - vshr.u64 d26,d16,#39 - vadd.i64 d28,d8 - vsli.64 d25,d16,#30 - veor d30,d16,d17 - vsli.64 d26,d16,#25 - veor d23,d24,d25 - vadd.i64 d27,d28 - vbsl d30,d18,d17 @ Maj(a,b,c) - veor d23,d26 @ Sigma0(a) - vadd.i64 d19,d27 - vadd.i64 d30,d27 - @ vadd.i64 d23,d30 - vshr.u64 d24,d19,#14 @ 9 -#if 9<16 - vld1.64 {d9},[r1]! @ handles unaligned -#endif - vshr.u64 d25,d19,#18 -#if 9>0 - vadd.i64 d23,d30 @ h+=Maj from the past -#endif - vshr.u64 d26,d19,#41 - vld1.64 {d28},[r3,:64]! @ K[i++] - vsli.64 d24,d19,#50 - vsli.64 d25,d19,#46 - vmov d29,d19 - vsli.64 d26,d19,#23 -#if 9<16 && defined(__ARMEL__) - vrev64.8 d9,d9 -#endif - veor d25,d24 - vbsl d29,d20,d21 @ Ch(e,f,g) - vshr.u64 d24,d23,#28 - veor d26,d25 @ Sigma1(e) - vadd.i64 d27,d29,d22 - vshr.u64 d25,d23,#34 - vsli.64 d24,d23,#36 - vadd.i64 d27,d26 - vshr.u64 d26,d23,#39 - vadd.i64 d28,d9 - vsli.64 d25,d23,#30 - veor d30,d23,d16 - vsli.64 d26,d23,#25 - veor d22,d24,d25 - vadd.i64 d27,d28 - vbsl d30,d17,d16 @ Maj(a,b,c) - veor d22,d26 @ Sigma0(a) - vadd.i64 d18,d27 - vadd.i64 d30,d27 - @ vadd.i64 d22,d30 - vshr.u64 d24,d18,#14 @ 10 -#if 10<16 - vld1.64 {d10},[r1]! @ handles unaligned -#endif - vshr.u64 d25,d18,#18 -#if 10>0 - vadd.i64 d22,d30 @ h+=Maj from the past -#endif - vshr.u64 d26,d18,#41 - vld1.64 {d28},[r3,:64]! @ K[i++] - vsli.64 d24,d18,#50 - vsli.64 d25,d18,#46 - vmov d29,d18 - vsli.64 d26,d18,#23 -#if 10<16 && defined(__ARMEL__) - vrev64.8 d10,d10 -#endif - veor d25,d24 - vbsl d29,d19,d20 @ Ch(e,f,g) - vshr.u64 d24,d22,#28 - veor d26,d25 @ Sigma1(e) - vadd.i64 d27,d29,d21 - vshr.u64 d25,d22,#34 - vsli.64 d24,d22,#36 - vadd.i64 d27,d26 - vshr.u64 d26,d22,#39 - vadd.i64 d28,d10 - vsli.64 d25,d22,#30 - veor d30,d22,d23 - vsli.64 d26,d22,#25 - veor d21,d24,d25 - vadd.i64 d27,d28 - vbsl d30,d16,d23 @ Maj(a,b,c) - veor d21,d26 @ Sigma0(a) - vadd.i64 d17,d27 - vadd.i64 d30,d27 - @ vadd.i64 d21,d30 - vshr.u64 d24,d17,#14 @ 11 -#if 11<16 - vld1.64 {d11},[r1]! @ handles unaligned -#endif - vshr.u64 d25,d17,#18 -#if 11>0 - vadd.i64 d21,d30 @ h+=Maj from the past -#endif - vshr.u64 d26,d17,#41 - vld1.64 {d28},[r3,:64]! @ K[i++] - vsli.64 d24,d17,#50 - vsli.64 d25,d17,#46 - vmov d29,d17 - vsli.64 d26,d17,#23 -#if 11<16 && defined(__ARMEL__) - vrev64.8 d11,d11 -#endif - veor d25,d24 - vbsl d29,d18,d19 @ Ch(e,f,g) - vshr.u64 d24,d21,#28 - veor d26,d25 @ Sigma1(e) - vadd.i64 d27,d29,d20 - vshr.u64 d25,d21,#34 - vsli.64 d24,d21,#36 - vadd.i64 d27,d26 - vshr.u64 d26,d21,#39 - vadd.i64 d28,d11 - vsli.64 d25,d21,#30 - veor d30,d21,d22 - vsli.64 d26,d21,#25 - veor d20,d24,d25 - vadd.i64 d27,d28 - vbsl d30,d23,d22 @ Maj(a,b,c) - veor d20,d26 @ Sigma0(a) - vadd.i64 d16,d27 - vadd.i64 d30,d27 - @ vadd.i64 d20,d30 - vshr.u64 d24,d16,#14 @ 12 -#if 12<16 - vld1.64 {d12},[r1]! @ handles unaligned -#endif - vshr.u64 d25,d16,#18 -#if 12>0 - vadd.i64 d20,d30 @ h+=Maj from the past -#endif - vshr.u64 d26,d16,#41 - vld1.64 {d28},[r3,:64]! @ K[i++] - vsli.64 d24,d16,#50 - vsli.64 d25,d16,#46 - vmov d29,d16 - vsli.64 d26,d16,#23 -#if 12<16 && defined(__ARMEL__) - vrev64.8 d12,d12 -#endif - veor d25,d24 - vbsl d29,d17,d18 @ Ch(e,f,g) - vshr.u64 d24,d20,#28 - veor d26,d25 @ Sigma1(e) - vadd.i64 d27,d29,d19 - vshr.u64 d25,d20,#34 - vsli.64 d24,d20,#36 - vadd.i64 d27,d26 - vshr.u64 d26,d20,#39 - vadd.i64 d28,d12 - vsli.64 d25,d20,#30 - veor d30,d20,d21 - vsli.64 d26,d20,#25 - veor d19,d24,d25 - vadd.i64 d27,d28 - vbsl d30,d22,d21 @ Maj(a,b,c) - veor d19,d26 @ Sigma0(a) - vadd.i64 d23,d27 - vadd.i64 d30,d27 - @ vadd.i64 d19,d30 - vshr.u64 d24,d23,#14 @ 13 -#if 13<16 - vld1.64 {d13},[r1]! @ handles unaligned -#endif - vshr.u64 d25,d23,#18 -#if 13>0 - vadd.i64 d19,d30 @ h+=Maj from the past -#endif - vshr.u64 d26,d23,#41 - vld1.64 {d28},[r3,:64]! @ K[i++] - vsli.64 d24,d23,#50 - vsli.64 d25,d23,#46 - vmov d29,d23 - vsli.64 d26,d23,#23 -#if 13<16 && defined(__ARMEL__) - vrev64.8 d13,d13 -#endif - veor d25,d24 - vbsl d29,d16,d17 @ Ch(e,f,g) - vshr.u64 d24,d19,#28 - veor d26,d25 @ Sigma1(e) - vadd.i64 d27,d29,d18 - vshr.u64 d25,d19,#34 - vsli.64 d24,d19,#36 - vadd.i64 d27,d26 - vshr.u64 d26,d19,#39 - vadd.i64 d28,d13 - vsli.64 d25,d19,#30 - veor d30,d19,d20 - vsli.64 d26,d19,#25 - veor d18,d24,d25 - vadd.i64 d27,d28 - vbsl d30,d21,d20 @ Maj(a,b,c) - veor d18,d26 @ Sigma0(a) - vadd.i64 d22,d27 - vadd.i64 d30,d27 - @ vadd.i64 d18,d30 - vshr.u64 d24,d22,#14 @ 14 -#if 14<16 - vld1.64 {d14},[r1]! @ handles unaligned -#endif - vshr.u64 d25,d22,#18 -#if 14>0 - vadd.i64 d18,d30 @ h+=Maj from the past -#endif - vshr.u64 d26,d22,#41 - vld1.64 {d28},[r3,:64]! @ K[i++] - vsli.64 d24,d22,#50 - vsli.64 d25,d22,#46 - vmov d29,d22 - vsli.64 d26,d22,#23 -#if 14<16 && defined(__ARMEL__) - vrev64.8 d14,d14 -#endif - veor d25,d24 - vbsl d29,d23,d16 @ Ch(e,f,g) - vshr.u64 d24,d18,#28 - veor d26,d25 @ Sigma1(e) - vadd.i64 d27,d29,d17 - vshr.u64 d25,d18,#34 - vsli.64 d24,d18,#36 - vadd.i64 d27,d26 - vshr.u64 d26,d18,#39 - vadd.i64 d28,d14 - vsli.64 d25,d18,#30 - veor d30,d18,d19 - vsli.64 d26,d18,#25 - veor d17,d24,d25 - vadd.i64 d27,d28 - vbsl d30,d20,d19 @ Maj(a,b,c) - veor d17,d26 @ Sigma0(a) - vadd.i64 d21,d27 - vadd.i64 d30,d27 - @ vadd.i64 d17,d30 - vshr.u64 d24,d21,#14 @ 15 -#if 15<16 - vld1.64 {d15},[r1]! @ handles unaligned -#endif - vshr.u64 d25,d21,#18 -#if 15>0 - vadd.i64 d17,d30 @ h+=Maj from the past -#endif - vshr.u64 d26,d21,#41 - vld1.64 {d28},[r3,:64]! @ K[i++] - vsli.64 d24,d21,#50 - vsli.64 d25,d21,#46 - vmov d29,d21 - vsli.64 d26,d21,#23 -#if 15<16 && defined(__ARMEL__) - vrev64.8 d15,d15 -#endif - veor d25,d24 - vbsl d29,d22,d23 @ Ch(e,f,g) - vshr.u64 d24,d17,#28 - veor d26,d25 @ Sigma1(e) - vadd.i64 d27,d29,d16 - vshr.u64 d25,d17,#34 - vsli.64 d24,d17,#36 - vadd.i64 d27,d26 - vshr.u64 d26,d17,#39 - vadd.i64 d28,d15 - vsli.64 d25,d17,#30 - veor d30,d17,d18 - vsli.64 d26,d17,#25 - veor d16,d24,d25 - vadd.i64 d27,d28 - vbsl d30,d19,d18 @ Maj(a,b,c) - veor d16,d26 @ Sigma0(a) - vadd.i64 d20,d27 - vadd.i64 d30,d27 - @ vadd.i64 d16,d30 - mov r12,#4 -L16_79_neon: - subs r12,#1 - vshr.u64 q12,q7,#19 - vshr.u64 q13,q7,#61 - vadd.i64 d16,d30 @ h+=Maj from the past - vshr.u64 q15,q7,#6 - vsli.64 q12,q7,#45 - vext.8 q14,q0,q1,#8 @ X[i+1] - vsli.64 q13,q7,#3 - veor q15,q12 - vshr.u64 q12,q14,#1 - veor q15,q13 @ sigma1(X[i+14]) - vshr.u64 q13,q14,#8 - vadd.i64 q0,q15 - vshr.u64 q15,q14,#7 - vsli.64 q12,q14,#63 - vsli.64 q13,q14,#56 - vext.8 q14,q4,q5,#8 @ X[i+9] - veor q15,q12 - vshr.u64 d24,d20,#14 @ from NEON_00_15 - vadd.i64 q0,q14 - vshr.u64 d25,d20,#18 @ from NEON_00_15 - veor q15,q13 @ sigma0(X[i+1]) - vshr.u64 d26,d20,#41 @ from NEON_00_15 - vadd.i64 q0,q15 - vld1.64 {d28},[r3,:64]! @ K[i++] - vsli.64 d24,d20,#50 - vsli.64 d25,d20,#46 - vmov d29,d20 - vsli.64 d26,d20,#23 -#if 16<16 && defined(__ARMEL__) - vrev64.8 , -#endif - veor d25,d24 - vbsl d29,d21,d22 @ Ch(e,f,g) - vshr.u64 d24,d16,#28 - veor d26,d25 @ Sigma1(e) - vadd.i64 d27,d29,d23 - vshr.u64 d25,d16,#34 - vsli.64 d24,d16,#36 - vadd.i64 d27,d26 - vshr.u64 d26,d16,#39 - vadd.i64 d28,d0 - vsli.64 d25,d16,#30 - veor d30,d16,d17 - vsli.64 d26,d16,#25 - veor d23,d24,d25 - vadd.i64 d27,d28 - vbsl d30,d18,d17 @ Maj(a,b,c) - veor d23,d26 @ Sigma0(a) - vadd.i64 d19,d27 - vadd.i64 d30,d27 - @ vadd.i64 d23,d30 - vshr.u64 d24,d19,#14 @ 17 -#if 17<16 - vld1.64 {d1},[r1]! @ handles unaligned -#endif - vshr.u64 d25,d19,#18 -#if 17>0 - vadd.i64 d23,d30 @ h+=Maj from the past -#endif - vshr.u64 d26,d19,#41 - vld1.64 {d28},[r3,:64]! @ K[i++] - vsli.64 d24,d19,#50 - vsli.64 d25,d19,#46 - vmov d29,d19 - vsli.64 d26,d19,#23 -#if 17<16 && defined(__ARMEL__) - vrev64.8 , -#endif - veor d25,d24 - vbsl d29,d20,d21 @ Ch(e,f,g) - vshr.u64 d24,d23,#28 - veor d26,d25 @ Sigma1(e) - vadd.i64 d27,d29,d22 - vshr.u64 d25,d23,#34 - vsli.64 d24,d23,#36 - vadd.i64 d27,d26 - vshr.u64 d26,d23,#39 - vadd.i64 d28,d1 - vsli.64 d25,d23,#30 - veor d30,d23,d16 - vsli.64 d26,d23,#25 - veor d22,d24,d25 - vadd.i64 d27,d28 - vbsl d30,d17,d16 @ Maj(a,b,c) - veor d22,d26 @ Sigma0(a) - vadd.i64 d18,d27 - vadd.i64 d30,d27 - @ vadd.i64 d22,d30 - vshr.u64 q12,q0,#19 - vshr.u64 q13,q0,#61 - vadd.i64 d22,d30 @ h+=Maj from the past - vshr.u64 q15,q0,#6 - vsli.64 q12,q0,#45 - vext.8 q14,q1,q2,#8 @ X[i+1] - vsli.64 q13,q0,#3 - veor q15,q12 - vshr.u64 q12,q14,#1 - veor q15,q13 @ sigma1(X[i+14]) - vshr.u64 q13,q14,#8 - vadd.i64 q1,q15 - vshr.u64 q15,q14,#7 - vsli.64 q12,q14,#63 - vsli.64 q13,q14,#56 - vext.8 q14,q5,q6,#8 @ X[i+9] - veor q15,q12 - vshr.u64 d24,d18,#14 @ from NEON_00_15 - vadd.i64 q1,q14 - vshr.u64 d25,d18,#18 @ from NEON_00_15 - veor q15,q13 @ sigma0(X[i+1]) - vshr.u64 d26,d18,#41 @ from NEON_00_15 - vadd.i64 q1,q15 - vld1.64 {d28},[r3,:64]! @ K[i++] - vsli.64 d24,d18,#50 - vsli.64 d25,d18,#46 - vmov d29,d18 - vsli.64 d26,d18,#23 -#if 18<16 && defined(__ARMEL__) - vrev64.8 , -#endif - veor d25,d24 - vbsl d29,d19,d20 @ Ch(e,f,g) - vshr.u64 d24,d22,#28 - veor d26,d25 @ Sigma1(e) - vadd.i64 d27,d29,d21 - vshr.u64 d25,d22,#34 - vsli.64 d24,d22,#36 - vadd.i64 d27,d26 - vshr.u64 d26,d22,#39 - vadd.i64 d28,d2 - vsli.64 d25,d22,#30 - veor d30,d22,d23 - vsli.64 d26,d22,#25 - veor d21,d24,d25 - vadd.i64 d27,d28 - vbsl d30,d16,d23 @ Maj(a,b,c) - veor d21,d26 @ Sigma0(a) - vadd.i64 d17,d27 - vadd.i64 d30,d27 - @ vadd.i64 d21,d30 - vshr.u64 d24,d17,#14 @ 19 -#if 19<16 - vld1.64 {d3},[r1]! @ handles unaligned -#endif - vshr.u64 d25,d17,#18 -#if 19>0 - vadd.i64 d21,d30 @ h+=Maj from the past -#endif - vshr.u64 d26,d17,#41 - vld1.64 {d28},[r3,:64]! @ K[i++] - vsli.64 d24,d17,#50 - vsli.64 d25,d17,#46 - vmov d29,d17 - vsli.64 d26,d17,#23 -#if 19<16 && defined(__ARMEL__) - vrev64.8 , -#endif - veor d25,d24 - vbsl d29,d18,d19 @ Ch(e,f,g) - vshr.u64 d24,d21,#28 - veor d26,d25 @ Sigma1(e) - vadd.i64 d27,d29,d20 - vshr.u64 d25,d21,#34 - vsli.64 d24,d21,#36 - vadd.i64 d27,d26 - vshr.u64 d26,d21,#39 - vadd.i64 d28,d3 - vsli.64 d25,d21,#30 - veor d30,d21,d22 - vsli.64 d26,d21,#25 - veor d20,d24,d25 - vadd.i64 d27,d28 - vbsl d30,d23,d22 @ Maj(a,b,c) - veor d20,d26 @ Sigma0(a) - vadd.i64 d16,d27 - vadd.i64 d30,d27 - @ vadd.i64 d20,d30 - vshr.u64 q12,q1,#19 - vshr.u64 q13,q1,#61 - vadd.i64 d20,d30 @ h+=Maj from the past - vshr.u64 q15,q1,#6 - vsli.64 q12,q1,#45 - vext.8 q14,q2,q3,#8 @ X[i+1] - vsli.64 q13,q1,#3 - veor q15,q12 - vshr.u64 q12,q14,#1 - veor q15,q13 @ sigma1(X[i+14]) - vshr.u64 q13,q14,#8 - vadd.i64 q2,q15 - vshr.u64 q15,q14,#7 - vsli.64 q12,q14,#63 - vsli.64 q13,q14,#56 - vext.8 q14,q6,q7,#8 @ X[i+9] - veor q15,q12 - vshr.u64 d24,d16,#14 @ from NEON_00_15 - vadd.i64 q2,q14 - vshr.u64 d25,d16,#18 @ from NEON_00_15 - veor q15,q13 @ sigma0(X[i+1]) - vshr.u64 d26,d16,#41 @ from NEON_00_15 - vadd.i64 q2,q15 - vld1.64 {d28},[r3,:64]! @ K[i++] - vsli.64 d24,d16,#50 - vsli.64 d25,d16,#46 - vmov d29,d16 - vsli.64 d26,d16,#23 -#if 20<16 && defined(__ARMEL__) - vrev64.8 , -#endif - veor d25,d24 - vbsl d29,d17,d18 @ Ch(e,f,g) - vshr.u64 d24,d20,#28 - veor d26,d25 @ Sigma1(e) - vadd.i64 d27,d29,d19 - vshr.u64 d25,d20,#34 - vsli.64 d24,d20,#36 - vadd.i64 d27,d26 - vshr.u64 d26,d20,#39 - vadd.i64 d28,d4 - vsli.64 d25,d20,#30 - veor d30,d20,d21 - vsli.64 d26,d20,#25 - veor d19,d24,d25 - vadd.i64 d27,d28 - vbsl d30,d22,d21 @ Maj(a,b,c) - veor d19,d26 @ Sigma0(a) - vadd.i64 d23,d27 - vadd.i64 d30,d27 - @ vadd.i64 d19,d30 - vshr.u64 d24,d23,#14 @ 21 -#if 21<16 - vld1.64 {d5},[r1]! @ handles unaligned -#endif - vshr.u64 d25,d23,#18 -#if 21>0 - vadd.i64 d19,d30 @ h+=Maj from the past -#endif - vshr.u64 d26,d23,#41 - vld1.64 {d28},[r3,:64]! @ K[i++] - vsli.64 d24,d23,#50 - vsli.64 d25,d23,#46 - vmov d29,d23 - vsli.64 d26,d23,#23 -#if 21<16 && defined(__ARMEL__) - vrev64.8 , -#endif - veor d25,d24 - vbsl d29,d16,d17 @ Ch(e,f,g) - vshr.u64 d24,d19,#28 - veor d26,d25 @ Sigma1(e) - vadd.i64 d27,d29,d18 - vshr.u64 d25,d19,#34 - vsli.64 d24,d19,#36 - vadd.i64 d27,d26 - vshr.u64 d26,d19,#39 - vadd.i64 d28,d5 - vsli.64 d25,d19,#30 - veor d30,d19,d20 - vsli.64 d26,d19,#25 - veor d18,d24,d25 - vadd.i64 d27,d28 - vbsl d30,d21,d20 @ Maj(a,b,c) - veor d18,d26 @ Sigma0(a) - vadd.i64 d22,d27 - vadd.i64 d30,d27 - @ vadd.i64 d18,d30 - vshr.u64 q12,q2,#19 - vshr.u64 q13,q2,#61 - vadd.i64 d18,d30 @ h+=Maj from the past - vshr.u64 q15,q2,#6 - vsli.64 q12,q2,#45 - vext.8 q14,q3,q4,#8 @ X[i+1] - vsli.64 q13,q2,#3 - veor q15,q12 - vshr.u64 q12,q14,#1 - veor q15,q13 @ sigma1(X[i+14]) - vshr.u64 q13,q14,#8 - vadd.i64 q3,q15 - vshr.u64 q15,q14,#7 - vsli.64 q12,q14,#63 - vsli.64 q13,q14,#56 - vext.8 q14,q7,q0,#8 @ X[i+9] - veor q15,q12 - vshr.u64 d24,d22,#14 @ from NEON_00_15 - vadd.i64 q3,q14 - vshr.u64 d25,d22,#18 @ from NEON_00_15 - veor q15,q13 @ sigma0(X[i+1]) - vshr.u64 d26,d22,#41 @ from NEON_00_15 - vadd.i64 q3,q15 - vld1.64 {d28},[r3,:64]! @ K[i++] - vsli.64 d24,d22,#50 - vsli.64 d25,d22,#46 - vmov d29,d22 - vsli.64 d26,d22,#23 -#if 22<16 && defined(__ARMEL__) - vrev64.8 , -#endif - veor d25,d24 - vbsl d29,d23,d16 @ Ch(e,f,g) - vshr.u64 d24,d18,#28 - veor d26,d25 @ Sigma1(e) - vadd.i64 d27,d29,d17 - vshr.u64 d25,d18,#34 - vsli.64 d24,d18,#36 - vadd.i64 d27,d26 - vshr.u64 d26,d18,#39 - vadd.i64 d28,d6 - vsli.64 d25,d18,#30 - veor d30,d18,d19 - vsli.64 d26,d18,#25 - veor d17,d24,d25 - vadd.i64 d27,d28 - vbsl d30,d20,d19 @ Maj(a,b,c) - veor d17,d26 @ Sigma0(a) - vadd.i64 d21,d27 - vadd.i64 d30,d27 - @ vadd.i64 d17,d30 - vshr.u64 d24,d21,#14 @ 23 -#if 23<16 - vld1.64 {d7},[r1]! @ handles unaligned -#endif - vshr.u64 d25,d21,#18 -#if 23>0 - vadd.i64 d17,d30 @ h+=Maj from the past -#endif - vshr.u64 d26,d21,#41 - vld1.64 {d28},[r3,:64]! @ K[i++] - vsli.64 d24,d21,#50 - vsli.64 d25,d21,#46 - vmov d29,d21 - vsli.64 d26,d21,#23 -#if 23<16 && defined(__ARMEL__) - vrev64.8 , -#endif - veor d25,d24 - vbsl d29,d22,d23 @ Ch(e,f,g) - vshr.u64 d24,d17,#28 - veor d26,d25 @ Sigma1(e) - vadd.i64 d27,d29,d16 - vshr.u64 d25,d17,#34 - vsli.64 d24,d17,#36 - vadd.i64 d27,d26 - vshr.u64 d26,d17,#39 - vadd.i64 d28,d7 - vsli.64 d25,d17,#30 - veor d30,d17,d18 - vsli.64 d26,d17,#25 - veor d16,d24,d25 - vadd.i64 d27,d28 - vbsl d30,d19,d18 @ Maj(a,b,c) - veor d16,d26 @ Sigma0(a) - vadd.i64 d20,d27 - vadd.i64 d30,d27 - @ vadd.i64 d16,d30 - vshr.u64 q12,q3,#19 - vshr.u64 q13,q3,#61 - vadd.i64 d16,d30 @ h+=Maj from the past - vshr.u64 q15,q3,#6 - vsli.64 q12,q3,#45 - vext.8 q14,q4,q5,#8 @ X[i+1] - vsli.64 q13,q3,#3 - veor q15,q12 - vshr.u64 q12,q14,#1 - veor q15,q13 @ sigma1(X[i+14]) - vshr.u64 q13,q14,#8 - vadd.i64 q4,q15 - vshr.u64 q15,q14,#7 - vsli.64 q12,q14,#63 - vsli.64 q13,q14,#56 - vext.8 q14,q0,q1,#8 @ X[i+9] - veor q15,q12 - vshr.u64 d24,d20,#14 @ from NEON_00_15 - vadd.i64 q4,q14 - vshr.u64 d25,d20,#18 @ from NEON_00_15 - veor q15,q13 @ sigma0(X[i+1]) - vshr.u64 d26,d20,#41 @ from NEON_00_15 - vadd.i64 q4,q15 - vld1.64 {d28},[r3,:64]! @ K[i++] - vsli.64 d24,d20,#50 - vsli.64 d25,d20,#46 - vmov d29,d20 - vsli.64 d26,d20,#23 -#if 24<16 && defined(__ARMEL__) - vrev64.8 , -#endif - veor d25,d24 - vbsl d29,d21,d22 @ Ch(e,f,g) - vshr.u64 d24,d16,#28 - veor d26,d25 @ Sigma1(e) - vadd.i64 d27,d29,d23 - vshr.u64 d25,d16,#34 - vsli.64 d24,d16,#36 - vadd.i64 d27,d26 - vshr.u64 d26,d16,#39 - vadd.i64 d28,d8 - vsli.64 d25,d16,#30 - veor d30,d16,d17 - vsli.64 d26,d16,#25 - veor d23,d24,d25 - vadd.i64 d27,d28 - vbsl d30,d18,d17 @ Maj(a,b,c) - veor d23,d26 @ Sigma0(a) - vadd.i64 d19,d27 - vadd.i64 d30,d27 - @ vadd.i64 d23,d30 - vshr.u64 d24,d19,#14 @ 25 -#if 25<16 - vld1.64 {d9},[r1]! @ handles unaligned -#endif - vshr.u64 d25,d19,#18 -#if 25>0 - vadd.i64 d23,d30 @ h+=Maj from the past -#endif - vshr.u64 d26,d19,#41 - vld1.64 {d28},[r3,:64]! @ K[i++] - vsli.64 d24,d19,#50 - vsli.64 d25,d19,#46 - vmov d29,d19 - vsli.64 d26,d19,#23 -#if 25<16 && defined(__ARMEL__) - vrev64.8 , -#endif - veor d25,d24 - vbsl d29,d20,d21 @ Ch(e,f,g) - vshr.u64 d24,d23,#28 - veor d26,d25 @ Sigma1(e) - vadd.i64 d27,d29,d22 - vshr.u64 d25,d23,#34 - vsli.64 d24,d23,#36 - vadd.i64 d27,d26 - vshr.u64 d26,d23,#39 - vadd.i64 d28,d9 - vsli.64 d25,d23,#30 - veor d30,d23,d16 - vsli.64 d26,d23,#25 - veor d22,d24,d25 - vadd.i64 d27,d28 - vbsl d30,d17,d16 @ Maj(a,b,c) - veor d22,d26 @ Sigma0(a) - vadd.i64 d18,d27 - vadd.i64 d30,d27 - @ vadd.i64 d22,d30 - vshr.u64 q12,q4,#19 - vshr.u64 q13,q4,#61 - vadd.i64 d22,d30 @ h+=Maj from the past - vshr.u64 q15,q4,#6 - vsli.64 q12,q4,#45 - vext.8 q14,q5,q6,#8 @ X[i+1] - vsli.64 q13,q4,#3 - veor q15,q12 - vshr.u64 q12,q14,#1 - veor q15,q13 @ sigma1(X[i+14]) - vshr.u64 q13,q14,#8 - vadd.i64 q5,q15 - vshr.u64 q15,q14,#7 - vsli.64 q12,q14,#63 - vsli.64 q13,q14,#56 - vext.8 q14,q1,q2,#8 @ X[i+9] - veor q15,q12 - vshr.u64 d24,d18,#14 @ from NEON_00_15 - vadd.i64 q5,q14 - vshr.u64 d25,d18,#18 @ from NEON_00_15 - veor q15,q13 @ sigma0(X[i+1]) - vshr.u64 d26,d18,#41 @ from NEON_00_15 - vadd.i64 q5,q15 - vld1.64 {d28},[r3,:64]! @ K[i++] - vsli.64 d24,d18,#50 - vsli.64 d25,d18,#46 - vmov d29,d18 - vsli.64 d26,d18,#23 -#if 26<16 && defined(__ARMEL__) - vrev64.8 , -#endif - veor d25,d24 - vbsl d29,d19,d20 @ Ch(e,f,g) - vshr.u64 d24,d22,#28 - veor d26,d25 @ Sigma1(e) - vadd.i64 d27,d29,d21 - vshr.u64 d25,d22,#34 - vsli.64 d24,d22,#36 - vadd.i64 d27,d26 - vshr.u64 d26,d22,#39 - vadd.i64 d28,d10 - vsli.64 d25,d22,#30 - veor d30,d22,d23 - vsli.64 d26,d22,#25 - veor d21,d24,d25 - vadd.i64 d27,d28 - vbsl d30,d16,d23 @ Maj(a,b,c) - veor d21,d26 @ Sigma0(a) - vadd.i64 d17,d27 - vadd.i64 d30,d27 - @ vadd.i64 d21,d30 - vshr.u64 d24,d17,#14 @ 27 -#if 27<16 - vld1.64 {d11},[r1]! @ handles unaligned -#endif - vshr.u64 d25,d17,#18 -#if 27>0 - vadd.i64 d21,d30 @ h+=Maj from the past -#endif - vshr.u64 d26,d17,#41 - vld1.64 {d28},[r3,:64]! @ K[i++] - vsli.64 d24,d17,#50 - vsli.64 d25,d17,#46 - vmov d29,d17 - vsli.64 d26,d17,#23 -#if 27<16 && defined(__ARMEL__) - vrev64.8 , -#endif - veor d25,d24 - vbsl d29,d18,d19 @ Ch(e,f,g) - vshr.u64 d24,d21,#28 - veor d26,d25 @ Sigma1(e) - vadd.i64 d27,d29,d20 - vshr.u64 d25,d21,#34 - vsli.64 d24,d21,#36 - vadd.i64 d27,d26 - vshr.u64 d26,d21,#39 - vadd.i64 d28,d11 - vsli.64 d25,d21,#30 - veor d30,d21,d22 - vsli.64 d26,d21,#25 - veor d20,d24,d25 - vadd.i64 d27,d28 - vbsl d30,d23,d22 @ Maj(a,b,c) - veor d20,d26 @ Sigma0(a) - vadd.i64 d16,d27 - vadd.i64 d30,d27 - @ vadd.i64 d20,d30 - vshr.u64 q12,q5,#19 - vshr.u64 q13,q5,#61 - vadd.i64 d20,d30 @ h+=Maj from the past - vshr.u64 q15,q5,#6 - vsli.64 q12,q5,#45 - vext.8 q14,q6,q7,#8 @ X[i+1] - vsli.64 q13,q5,#3 - veor q15,q12 - vshr.u64 q12,q14,#1 - veor q15,q13 @ sigma1(X[i+14]) - vshr.u64 q13,q14,#8 - vadd.i64 q6,q15 - vshr.u64 q15,q14,#7 - vsli.64 q12,q14,#63 - vsli.64 q13,q14,#56 - vext.8 q14,q2,q3,#8 @ X[i+9] - veor q15,q12 - vshr.u64 d24,d16,#14 @ from NEON_00_15 - vadd.i64 q6,q14 - vshr.u64 d25,d16,#18 @ from NEON_00_15 - veor q15,q13 @ sigma0(X[i+1]) - vshr.u64 d26,d16,#41 @ from NEON_00_15 - vadd.i64 q6,q15 - vld1.64 {d28},[r3,:64]! @ K[i++] - vsli.64 d24,d16,#50 - vsli.64 d25,d16,#46 - vmov d29,d16 - vsli.64 d26,d16,#23 -#if 28<16 && defined(__ARMEL__) - vrev64.8 , -#endif - veor d25,d24 - vbsl d29,d17,d18 @ Ch(e,f,g) - vshr.u64 d24,d20,#28 - veor d26,d25 @ Sigma1(e) - vadd.i64 d27,d29,d19 - vshr.u64 d25,d20,#34 - vsli.64 d24,d20,#36 - vadd.i64 d27,d26 - vshr.u64 d26,d20,#39 - vadd.i64 d28,d12 - vsli.64 d25,d20,#30 - veor d30,d20,d21 - vsli.64 d26,d20,#25 - veor d19,d24,d25 - vadd.i64 d27,d28 - vbsl d30,d22,d21 @ Maj(a,b,c) - veor d19,d26 @ Sigma0(a) - vadd.i64 d23,d27 - vadd.i64 d30,d27 - @ vadd.i64 d19,d30 - vshr.u64 d24,d23,#14 @ 29 -#if 29<16 - vld1.64 {d13},[r1]! @ handles unaligned -#endif - vshr.u64 d25,d23,#18 -#if 29>0 - vadd.i64 d19,d30 @ h+=Maj from the past -#endif - vshr.u64 d26,d23,#41 - vld1.64 {d28},[r3,:64]! @ K[i++] - vsli.64 d24,d23,#50 - vsli.64 d25,d23,#46 - vmov d29,d23 - vsli.64 d26,d23,#23 -#if 29<16 && defined(__ARMEL__) - vrev64.8 , -#endif - veor d25,d24 - vbsl d29,d16,d17 @ Ch(e,f,g) - vshr.u64 d24,d19,#28 - veor d26,d25 @ Sigma1(e) - vadd.i64 d27,d29,d18 - vshr.u64 d25,d19,#34 - vsli.64 d24,d19,#36 - vadd.i64 d27,d26 - vshr.u64 d26,d19,#39 - vadd.i64 d28,d13 - vsli.64 d25,d19,#30 - veor d30,d19,d20 - vsli.64 d26,d19,#25 - veor d18,d24,d25 - vadd.i64 d27,d28 - vbsl d30,d21,d20 @ Maj(a,b,c) - veor d18,d26 @ Sigma0(a) - vadd.i64 d22,d27 - vadd.i64 d30,d27 - @ vadd.i64 d18,d30 - vshr.u64 q12,q6,#19 - vshr.u64 q13,q6,#61 - vadd.i64 d18,d30 @ h+=Maj from the past - vshr.u64 q15,q6,#6 - vsli.64 q12,q6,#45 - vext.8 q14,q7,q0,#8 @ X[i+1] - vsli.64 q13,q6,#3 - veor q15,q12 - vshr.u64 q12,q14,#1 - veor q15,q13 @ sigma1(X[i+14]) - vshr.u64 q13,q14,#8 - vadd.i64 q7,q15 - vshr.u64 q15,q14,#7 - vsli.64 q12,q14,#63 - vsli.64 q13,q14,#56 - vext.8 q14,q3,q4,#8 @ X[i+9] - veor q15,q12 - vshr.u64 d24,d22,#14 @ from NEON_00_15 - vadd.i64 q7,q14 - vshr.u64 d25,d22,#18 @ from NEON_00_15 - veor q15,q13 @ sigma0(X[i+1]) - vshr.u64 d26,d22,#41 @ from NEON_00_15 - vadd.i64 q7,q15 - vld1.64 {d28},[r3,:64]! @ K[i++] - vsli.64 d24,d22,#50 - vsli.64 d25,d22,#46 - vmov d29,d22 - vsli.64 d26,d22,#23 -#if 30<16 && defined(__ARMEL__) - vrev64.8 , -#endif - veor d25,d24 - vbsl d29,d23,d16 @ Ch(e,f,g) - vshr.u64 d24,d18,#28 - veor d26,d25 @ Sigma1(e) - vadd.i64 d27,d29,d17 - vshr.u64 d25,d18,#34 - vsli.64 d24,d18,#36 - vadd.i64 d27,d26 - vshr.u64 d26,d18,#39 - vadd.i64 d28,d14 - vsli.64 d25,d18,#30 - veor d30,d18,d19 - vsli.64 d26,d18,#25 - veor d17,d24,d25 - vadd.i64 d27,d28 - vbsl d30,d20,d19 @ Maj(a,b,c) - veor d17,d26 @ Sigma0(a) - vadd.i64 d21,d27 - vadd.i64 d30,d27 - @ vadd.i64 d17,d30 - vshr.u64 d24,d21,#14 @ 31 -#if 31<16 - vld1.64 {d15},[r1]! @ handles unaligned -#endif - vshr.u64 d25,d21,#18 -#if 31>0 - vadd.i64 d17,d30 @ h+=Maj from the past -#endif - vshr.u64 d26,d21,#41 - vld1.64 {d28},[r3,:64]! @ K[i++] - vsli.64 d24,d21,#50 - vsli.64 d25,d21,#46 - vmov d29,d21 - vsli.64 d26,d21,#23 -#if 31<16 && defined(__ARMEL__) - vrev64.8 , -#endif - veor d25,d24 - vbsl d29,d22,d23 @ Ch(e,f,g) - vshr.u64 d24,d17,#28 - veor d26,d25 @ Sigma1(e) - vadd.i64 d27,d29,d16 - vshr.u64 d25,d17,#34 - vsli.64 d24,d17,#36 - vadd.i64 d27,d26 - vshr.u64 d26,d17,#39 - vadd.i64 d28,d15 - vsli.64 d25,d17,#30 - veor d30,d17,d18 - vsli.64 d26,d17,#25 - veor d16,d24,d25 - vadd.i64 d27,d28 - vbsl d30,d19,d18 @ Maj(a,b,c) - veor d16,d26 @ Sigma0(a) - vadd.i64 d20,d27 - vadd.i64 d30,d27 - @ vadd.i64 d16,d30 - bne L16_79_neon - - vadd.i64 d16,d30 @ h+=Maj from the past - vldmia r0,{d24,d25,d26,d27,d28,d29,d30,d31} @ load context to temp - vadd.i64 q8,q12 @ vectorized accumulate - vadd.i64 q9,q13 - vadd.i64 q10,q14 - vadd.i64 q11,q15 - vstmia r0,{d16,d17,d18,d19,d20,d21,d22,d23} @ save context - teq r1,r2 - sub r3,#640 @ rewind K512 - bne Loop_neon - - VFP_ABI_POP - bx lr @ .word 0xe12fff1e - -#endif -.byte 83,72,65,53,49,50,32,98,108,111,99,107,32,116,114,97,110,115,102,111,114,109,32,102,111,114,32,65,82,77,118,52,47,78,69,79,78,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 -.align 2 -#endif // !OPENSSL_NO_ASM diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/sha512-armv4-linux32.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/sha512-armv4-linux32.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/sha512-armv4-linux32.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/sha512-armv4-linux32.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,1886 +0,0 @@ -// This file is generated from a similarly-named Perl script in the BoringSSL -// source tree. Do not edit by hand. - -#if !defined(__has_feature) -#define __has_feature(x) 0 -#endif -#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) -#define OPENSSL_NO_ASM -#endif - -#if !defined(OPENSSL_NO_ASM) -#if defined(__arm__) -@ Copyright 2007-2016 The OpenSSL Project Authors. All Rights Reserved. -@ -@ Licensed under the OpenSSL license (the "License"). You may not use -@ this file except in compliance with the License. You can obtain a copy -@ in the file LICENSE in the source distribution or at -@ https://www.openssl.org/source/license.html - - -@ ==================================================================== -@ Written by Andy Polyakov for the OpenSSL -@ project. The module is, however, dual licensed under OpenSSL and -@ CRYPTOGAMS licenses depending on where you obtain it. For further -@ details see http://www.openssl.org/~appro/cryptogams/. -@ -@ Permission to use under GPL terms is granted. -@ ==================================================================== - -@ SHA512 block procedure for ARMv4. September 2007. - -@ This code is ~4.5 (four and a half) times faster than code generated -@ by gcc 3.4 and it spends ~72 clock cycles per byte [on single-issue -@ Xscale PXA250 core]. -@ -@ July 2010. -@ -@ Rescheduling for dual-issue pipeline resulted in 6% improvement on -@ Cortex A8 core and ~40 cycles per processed byte. - -@ February 2011. -@ -@ Profiler-assisted and platform-specific optimization resulted in 7% -@ improvement on Coxtex A8 core and ~38 cycles per byte. - -@ March 2011. -@ -@ Add NEON implementation. On Cortex A8 it was measured to process -@ one byte in 23.3 cycles or ~60% faster than integer-only code. - -@ August 2012. -@ -@ Improve NEON performance by 12% on Snapdragon S4. In absolute -@ terms it's 22.6 cycles per byte, which is disappointing result. -@ Technical writers asserted that 3-way S4 pipeline can sustain -@ multiple NEON instructions per cycle, but dual NEON issue could -@ not be observed, see http://www.openssl.org/~appro/Snapdragon-S4.html -@ for further details. On side note Cortex-A15 processes one byte in -@ 16 cycles. - -@ Byte order [in]dependence. ========================================= -@ -@ Originally caller was expected to maintain specific *dword* order in -@ h[0-7], namely with most significant dword at *lower* address, which -@ was reflected in below two parameters as 0 and 4. Now caller is -@ expected to maintain native byte order for whole 64-bit values. -#ifndef __KERNEL__ -# include -# define VFP_ABI_PUSH vstmdb sp!,{d8-d15} -# define VFP_ABI_POP vldmia sp!,{d8-d15} -#else -# define __ARM_ARCH__ __LINUX_ARM_ARCH__ -# define __ARM_MAX_ARCH__ 7 -# define VFP_ABI_PUSH -# define VFP_ABI_POP -#endif - -@ Silence ARMv8 deprecated IT instruction warnings. This file is used by both -@ ARMv7 and ARMv8 processors and does not use ARMv8 instructions. -.arch armv7-a - -#ifdef __ARMEL__ -# define LO 0 -# define HI 4 -# define WORD64(hi0,lo0,hi1,lo1) .word lo0,hi0, lo1,hi1 -#else -# define HI 0 -# define LO 4 -# define WORD64(hi0,lo0,hi1,lo1) .word hi0,lo0, hi1,lo1 -#endif - -.text -#if defined(__thumb2__) -.syntax unified -.thumb -# define adrl adr -#else -.code 32 -#endif - -.type K512,%object -.align 5 -K512: - WORD64(0x428a2f98,0xd728ae22, 0x71374491,0x23ef65cd) - WORD64(0xb5c0fbcf,0xec4d3b2f, 0xe9b5dba5,0x8189dbbc) - WORD64(0x3956c25b,0xf348b538, 0x59f111f1,0xb605d019) - WORD64(0x923f82a4,0xaf194f9b, 0xab1c5ed5,0xda6d8118) - WORD64(0xd807aa98,0xa3030242, 0x12835b01,0x45706fbe) - WORD64(0x243185be,0x4ee4b28c, 0x550c7dc3,0xd5ffb4e2) - WORD64(0x72be5d74,0xf27b896f, 0x80deb1fe,0x3b1696b1) - WORD64(0x9bdc06a7,0x25c71235, 0xc19bf174,0xcf692694) - WORD64(0xe49b69c1,0x9ef14ad2, 0xefbe4786,0x384f25e3) - WORD64(0x0fc19dc6,0x8b8cd5b5, 0x240ca1cc,0x77ac9c65) - WORD64(0x2de92c6f,0x592b0275, 0x4a7484aa,0x6ea6e483) - WORD64(0x5cb0a9dc,0xbd41fbd4, 0x76f988da,0x831153b5) - WORD64(0x983e5152,0xee66dfab, 0xa831c66d,0x2db43210) - WORD64(0xb00327c8,0x98fb213f, 0xbf597fc7,0xbeef0ee4) - WORD64(0xc6e00bf3,0x3da88fc2, 0xd5a79147,0x930aa725) - WORD64(0x06ca6351,0xe003826f, 0x14292967,0x0a0e6e70) - WORD64(0x27b70a85,0x46d22ffc, 0x2e1b2138,0x5c26c926) - WORD64(0x4d2c6dfc,0x5ac42aed, 0x53380d13,0x9d95b3df) - WORD64(0x650a7354,0x8baf63de, 0x766a0abb,0x3c77b2a8) - WORD64(0x81c2c92e,0x47edaee6, 0x92722c85,0x1482353b) - WORD64(0xa2bfe8a1,0x4cf10364, 0xa81a664b,0xbc423001) - WORD64(0xc24b8b70,0xd0f89791, 0xc76c51a3,0x0654be30) - WORD64(0xd192e819,0xd6ef5218, 0xd6990624,0x5565a910) - WORD64(0xf40e3585,0x5771202a, 0x106aa070,0x32bbd1b8) - WORD64(0x19a4c116,0xb8d2d0c8, 0x1e376c08,0x5141ab53) - WORD64(0x2748774c,0xdf8eeb99, 0x34b0bcb5,0xe19b48a8) - WORD64(0x391c0cb3,0xc5c95a63, 0x4ed8aa4a,0xe3418acb) - WORD64(0x5b9cca4f,0x7763e373, 0x682e6ff3,0xd6b2b8a3) - WORD64(0x748f82ee,0x5defb2fc, 0x78a5636f,0x43172f60) - WORD64(0x84c87814,0xa1f0ab72, 0x8cc70208,0x1a6439ec) - WORD64(0x90befffa,0x23631e28, 0xa4506ceb,0xde82bde9) - WORD64(0xbef9a3f7,0xb2c67915, 0xc67178f2,0xe372532b) - WORD64(0xca273ece,0xea26619c, 0xd186b8c7,0x21c0c207) - WORD64(0xeada7dd6,0xcde0eb1e, 0xf57d4f7f,0xee6ed178) - WORD64(0x06f067aa,0x72176fba, 0x0a637dc5,0xa2c898a6) - WORD64(0x113f9804,0xbef90dae, 0x1b710b35,0x131c471b) - WORD64(0x28db77f5,0x23047d84, 0x32caab7b,0x40c72493) - WORD64(0x3c9ebe0a,0x15c9bebc, 0x431d67c4,0x9c100d4c) - WORD64(0x4cc5d4be,0xcb3e42b6, 0x597f299c,0xfc657e2a) - WORD64(0x5fcb6fab,0x3ad6faec, 0x6c44198c,0x4a475817) -.size K512,.-K512 -#if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__) - -.hidden GFp_armcap_P -.LOPENSSL_armcap: -.word GFp_armcap_P-.Lsha512_block_data_order -.skip 32-4 -#else -.skip 32 -#endif - -.globl GFp_sha512_block_data_order -.hidden GFp_sha512_block_data_order -.type GFp_sha512_block_data_order,%function -GFp_sha512_block_data_order: -.Lsha512_block_data_order: -#if __ARM_ARCH__<7 && !defined(__thumb2__) - sub r3,pc,#8 @ GFp_sha512_block_data_order -#else - adr r3,.Lsha512_block_data_order -#endif -#if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__) - ldr r12,.LOPENSSL_armcap - ldr r12,[r3,r12] @ GFp_armcap_P -#ifdef __APPLE__ - ldr r12,[r12] -#endif - tst r12,#ARMV7_NEON - bne .LNEON -#endif - add r2,r1,r2,lsl#7 @ len to point at the end of inp - stmdb sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} - sub r14,r3,#672 @ K512 - sub sp,sp,#9*8 - - ldr r7,[r0,#32+LO] - ldr r8,[r0,#32+HI] - ldr r9, [r0,#48+LO] - ldr r10, [r0,#48+HI] - ldr r11, [r0,#56+LO] - ldr r12, [r0,#56+HI] -.Loop: - str r9, [sp,#48+0] - str r10, [sp,#48+4] - str r11, [sp,#56+0] - str r12, [sp,#56+4] - ldr r5,[r0,#0+LO] - ldr r6,[r0,#0+HI] - ldr r3,[r0,#8+LO] - ldr r4,[r0,#8+HI] - ldr r9, [r0,#16+LO] - ldr r10, [r0,#16+HI] - ldr r11, [r0,#24+LO] - ldr r12, [r0,#24+HI] - str r3,[sp,#8+0] - str r4,[sp,#8+4] - str r9, [sp,#16+0] - str r10, [sp,#16+4] - str r11, [sp,#24+0] - str r12, [sp,#24+4] - ldr r3,[r0,#40+LO] - ldr r4,[r0,#40+HI] - str r3,[sp,#40+0] - str r4,[sp,#40+4] - -.L00_15: -#if __ARM_ARCH__<7 - ldrb r3,[r1,#7] - ldrb r9, [r1,#6] - ldrb r10, [r1,#5] - ldrb r11, [r1,#4] - ldrb r4,[r1,#3] - ldrb r12, [r1,#2] - orr r3,r3,r9,lsl#8 - ldrb r9, [r1,#1] - orr r3,r3,r10,lsl#16 - ldrb r10, [r1],#8 - orr r3,r3,r11,lsl#24 - orr r4,r4,r12,lsl#8 - orr r4,r4,r9,lsl#16 - orr r4,r4,r10,lsl#24 -#else - ldr r3,[r1,#4] - ldr r4,[r1],#8 -#ifdef __ARMEL__ - rev r3,r3 - rev r4,r4 -#endif -#endif - @ Sigma1(x) (ROTR((x),14) ^ ROTR((x),18) ^ ROTR((x),41)) - @ LO lo>>14^hi<<18 ^ lo>>18^hi<<14 ^ hi>>9^lo<<23 - @ HI hi>>14^lo<<18 ^ hi>>18^lo<<14 ^ lo>>9^hi<<23 - mov r9,r7,lsr#14 - str r3,[sp,#64+0] - mov r10,r8,lsr#14 - str r4,[sp,#64+4] - eor r9,r9,r8,lsl#18 - ldr r11,[sp,#56+0] @ h.lo - eor r10,r10,r7,lsl#18 - ldr r12,[sp,#56+4] @ h.hi - eor r9,r9,r7,lsr#18 - eor r10,r10,r8,lsr#18 - eor r9,r9,r8,lsl#14 - eor r10,r10,r7,lsl#14 - eor r9,r9,r8,lsr#9 - eor r10,r10,r7,lsr#9 - eor r9,r9,r7,lsl#23 - eor r10,r10,r8,lsl#23 @ Sigma1(e) - adds r3,r3,r9 - ldr r9,[sp,#40+0] @ f.lo - adc r4,r4,r10 @ T += Sigma1(e) - ldr r10,[sp,#40+4] @ f.hi - adds r3,r3,r11 - ldr r11,[sp,#48+0] @ g.lo - adc r4,r4,r12 @ T += h - ldr r12,[sp,#48+4] @ g.hi - - eor r9,r9,r11 - str r7,[sp,#32+0] - eor r10,r10,r12 - str r8,[sp,#32+4] - and r9,r9,r7 - str r5,[sp,#0+0] - and r10,r10,r8 - str r6,[sp,#0+4] - eor r9,r9,r11 - ldr r11,[r14,#LO] @ K[i].lo - eor r10,r10,r12 @ Ch(e,f,g) - ldr r12,[r14,#HI] @ K[i].hi - - adds r3,r3,r9 - ldr r7,[sp,#24+0] @ d.lo - adc r4,r4,r10 @ T += Ch(e,f,g) - ldr r8,[sp,#24+4] @ d.hi - adds r3,r3,r11 - and r9,r11,#0xff - adc r4,r4,r12 @ T += K[i] - adds r7,r7,r3 - ldr r11,[sp,#8+0] @ b.lo - adc r8,r8,r4 @ d += T - teq r9,#148 - - ldr r12,[sp,#16+0] @ c.lo -#if __ARM_ARCH__>=7 - it eq @ Thumb2 thing, sanity check in ARM -#endif - orreq r14,r14,#1 - @ Sigma0(x) (ROTR((x),28) ^ ROTR((x),34) ^ ROTR((x),39)) - @ LO lo>>28^hi<<4 ^ hi>>2^lo<<30 ^ hi>>7^lo<<25 - @ HI hi>>28^lo<<4 ^ lo>>2^hi<<30 ^ lo>>7^hi<<25 - mov r9,r5,lsr#28 - mov r10,r6,lsr#28 - eor r9,r9,r6,lsl#4 - eor r10,r10,r5,lsl#4 - eor r9,r9,r6,lsr#2 - eor r10,r10,r5,lsr#2 - eor r9,r9,r5,lsl#30 - eor r10,r10,r6,lsl#30 - eor r9,r9,r6,lsr#7 - eor r10,r10,r5,lsr#7 - eor r9,r9,r5,lsl#25 - eor r10,r10,r6,lsl#25 @ Sigma0(a) - adds r3,r3,r9 - and r9,r5,r11 - adc r4,r4,r10 @ T += Sigma0(a) - - ldr r10,[sp,#8+4] @ b.hi - orr r5,r5,r11 - ldr r11,[sp,#16+4] @ c.hi - and r5,r5,r12 - and r12,r6,r10 - orr r6,r6,r10 - orr r5,r5,r9 @ Maj(a,b,c).lo - and r6,r6,r11 - adds r5,r5,r3 - orr r6,r6,r12 @ Maj(a,b,c).hi - sub sp,sp,#8 - adc r6,r6,r4 @ h += T - tst r14,#1 - add r14,r14,#8 - tst r14,#1 - beq .L00_15 - ldr r9,[sp,#184+0] - ldr r10,[sp,#184+4] - bic r14,r14,#1 -.L16_79: - @ sigma0(x) (ROTR((x),1) ^ ROTR((x),8) ^ ((x)>>7)) - @ LO lo>>1^hi<<31 ^ lo>>8^hi<<24 ^ lo>>7^hi<<25 - @ HI hi>>1^lo<<31 ^ hi>>8^lo<<24 ^ hi>>7 - mov r3,r9,lsr#1 - ldr r11,[sp,#80+0] - mov r4,r10,lsr#1 - ldr r12,[sp,#80+4] - eor r3,r3,r10,lsl#31 - eor r4,r4,r9,lsl#31 - eor r3,r3,r9,lsr#8 - eor r4,r4,r10,lsr#8 - eor r3,r3,r10,lsl#24 - eor r4,r4,r9,lsl#24 - eor r3,r3,r9,lsr#7 - eor r4,r4,r10,lsr#7 - eor r3,r3,r10,lsl#25 - - @ sigma1(x) (ROTR((x),19) ^ ROTR((x),61) ^ ((x)>>6)) - @ LO lo>>19^hi<<13 ^ hi>>29^lo<<3 ^ lo>>6^hi<<26 - @ HI hi>>19^lo<<13 ^ lo>>29^hi<<3 ^ hi>>6 - mov r9,r11,lsr#19 - mov r10,r12,lsr#19 - eor r9,r9,r12,lsl#13 - eor r10,r10,r11,lsl#13 - eor r9,r9,r12,lsr#29 - eor r10,r10,r11,lsr#29 - eor r9,r9,r11,lsl#3 - eor r10,r10,r12,lsl#3 - eor r9,r9,r11,lsr#6 - eor r10,r10,r12,lsr#6 - ldr r11,[sp,#120+0] - eor r9,r9,r12,lsl#26 - - ldr r12,[sp,#120+4] - adds r3,r3,r9 - ldr r9,[sp,#192+0] - adc r4,r4,r10 - - ldr r10,[sp,#192+4] - adds r3,r3,r11 - adc r4,r4,r12 - adds r3,r3,r9 - adc r4,r4,r10 - @ Sigma1(x) (ROTR((x),14) ^ ROTR((x),18) ^ ROTR((x),41)) - @ LO lo>>14^hi<<18 ^ lo>>18^hi<<14 ^ hi>>9^lo<<23 - @ HI hi>>14^lo<<18 ^ hi>>18^lo<<14 ^ lo>>9^hi<<23 - mov r9,r7,lsr#14 - str r3,[sp,#64+0] - mov r10,r8,lsr#14 - str r4,[sp,#64+4] - eor r9,r9,r8,lsl#18 - ldr r11,[sp,#56+0] @ h.lo - eor r10,r10,r7,lsl#18 - ldr r12,[sp,#56+4] @ h.hi - eor r9,r9,r7,lsr#18 - eor r10,r10,r8,lsr#18 - eor r9,r9,r8,lsl#14 - eor r10,r10,r7,lsl#14 - eor r9,r9,r8,lsr#9 - eor r10,r10,r7,lsr#9 - eor r9,r9,r7,lsl#23 - eor r10,r10,r8,lsl#23 @ Sigma1(e) - adds r3,r3,r9 - ldr r9,[sp,#40+0] @ f.lo - adc r4,r4,r10 @ T += Sigma1(e) - ldr r10,[sp,#40+4] @ f.hi - adds r3,r3,r11 - ldr r11,[sp,#48+0] @ g.lo - adc r4,r4,r12 @ T += h - ldr r12,[sp,#48+4] @ g.hi - - eor r9,r9,r11 - str r7,[sp,#32+0] - eor r10,r10,r12 - str r8,[sp,#32+4] - and r9,r9,r7 - str r5,[sp,#0+0] - and r10,r10,r8 - str r6,[sp,#0+4] - eor r9,r9,r11 - ldr r11,[r14,#LO] @ K[i].lo - eor r10,r10,r12 @ Ch(e,f,g) - ldr r12,[r14,#HI] @ K[i].hi - - adds r3,r3,r9 - ldr r7,[sp,#24+0] @ d.lo - adc r4,r4,r10 @ T += Ch(e,f,g) - ldr r8,[sp,#24+4] @ d.hi - adds r3,r3,r11 - and r9,r11,#0xff - adc r4,r4,r12 @ T += K[i] - adds r7,r7,r3 - ldr r11,[sp,#8+0] @ b.lo - adc r8,r8,r4 @ d += T - teq r9,#23 - - ldr r12,[sp,#16+0] @ c.lo -#if __ARM_ARCH__>=7 - it eq @ Thumb2 thing, sanity check in ARM -#endif - orreq r14,r14,#1 - @ Sigma0(x) (ROTR((x),28) ^ ROTR((x),34) ^ ROTR((x),39)) - @ LO lo>>28^hi<<4 ^ hi>>2^lo<<30 ^ hi>>7^lo<<25 - @ HI hi>>28^lo<<4 ^ lo>>2^hi<<30 ^ lo>>7^hi<<25 - mov r9,r5,lsr#28 - mov r10,r6,lsr#28 - eor r9,r9,r6,lsl#4 - eor r10,r10,r5,lsl#4 - eor r9,r9,r6,lsr#2 - eor r10,r10,r5,lsr#2 - eor r9,r9,r5,lsl#30 - eor r10,r10,r6,lsl#30 - eor r9,r9,r6,lsr#7 - eor r10,r10,r5,lsr#7 - eor r9,r9,r5,lsl#25 - eor r10,r10,r6,lsl#25 @ Sigma0(a) - adds r3,r3,r9 - and r9,r5,r11 - adc r4,r4,r10 @ T += Sigma0(a) - - ldr r10,[sp,#8+4] @ b.hi - orr r5,r5,r11 - ldr r11,[sp,#16+4] @ c.hi - and r5,r5,r12 - and r12,r6,r10 - orr r6,r6,r10 - orr r5,r5,r9 @ Maj(a,b,c).lo - and r6,r6,r11 - adds r5,r5,r3 - orr r6,r6,r12 @ Maj(a,b,c).hi - sub sp,sp,#8 - adc r6,r6,r4 @ h += T - tst r14,#1 - add r14,r14,#8 -#if __ARM_ARCH__>=7 - ittt eq @ Thumb2 thing, sanity check in ARM -#endif - ldreq r9,[sp,#184+0] - ldreq r10,[sp,#184+4] - beq .L16_79 - bic r14,r14,#1 - - ldr r3,[sp,#8+0] - ldr r4,[sp,#8+4] - ldr r9, [r0,#0+LO] - ldr r10, [r0,#0+HI] - ldr r11, [r0,#8+LO] - ldr r12, [r0,#8+HI] - adds r9,r5,r9 - str r9, [r0,#0+LO] - adc r10,r6,r10 - str r10, [r0,#0+HI] - adds r11,r3,r11 - str r11, [r0,#8+LO] - adc r12,r4,r12 - str r12, [r0,#8+HI] - - ldr r5,[sp,#16+0] - ldr r6,[sp,#16+4] - ldr r3,[sp,#24+0] - ldr r4,[sp,#24+4] - ldr r9, [r0,#16+LO] - ldr r10, [r0,#16+HI] - ldr r11, [r0,#24+LO] - ldr r12, [r0,#24+HI] - adds r9,r5,r9 - str r9, [r0,#16+LO] - adc r10,r6,r10 - str r10, [r0,#16+HI] - adds r11,r3,r11 - str r11, [r0,#24+LO] - adc r12,r4,r12 - str r12, [r0,#24+HI] - - ldr r3,[sp,#40+0] - ldr r4,[sp,#40+4] - ldr r9, [r0,#32+LO] - ldr r10, [r0,#32+HI] - ldr r11, [r0,#40+LO] - ldr r12, [r0,#40+HI] - adds r7,r7,r9 - str r7,[r0,#32+LO] - adc r8,r8,r10 - str r8,[r0,#32+HI] - adds r11,r3,r11 - str r11, [r0,#40+LO] - adc r12,r4,r12 - str r12, [r0,#40+HI] - - ldr r5,[sp,#48+0] - ldr r6,[sp,#48+4] - ldr r3,[sp,#56+0] - ldr r4,[sp,#56+4] - ldr r9, [r0,#48+LO] - ldr r10, [r0,#48+HI] - ldr r11, [r0,#56+LO] - ldr r12, [r0,#56+HI] - adds r9,r5,r9 - str r9, [r0,#48+LO] - adc r10,r6,r10 - str r10, [r0,#48+HI] - adds r11,r3,r11 - str r11, [r0,#56+LO] - adc r12,r4,r12 - str r12, [r0,#56+HI] - - add sp,sp,#640 - sub r14,r14,#640 - - teq r1,r2 - bne .Loop - - add sp,sp,#8*9 @ destroy frame -#if __ARM_ARCH__>=5 - ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,pc} -#else - ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} - tst lr,#1 - moveq pc,lr @ be binary compatible with V4, yet -.word 0xe12fff1e @ interoperable with Thumb ISA:-) -#endif -.size GFp_sha512_block_data_order,.-GFp_sha512_block_data_order -#if __ARM_MAX_ARCH__>=7 -.arch armv7-a -.fpu neon - -.type sha512_block_data_order_neon,%function -.align 4 -sha512_block_data_order_neon: -.LNEON: - dmb @ errata #451034 on early Cortex A8 - add r2,r1,r2,lsl#7 @ len to point at the end of inp - adr r3,K512 - VFP_ABI_PUSH - vldmia r0,{d16,d17,d18,d19,d20,d21,d22,d23} @ load context -.Loop_neon: - vshr.u64 d24,d20,#14 @ 0 -#if 0<16 - vld1.64 {d0},[r1]! @ handles unaligned -#endif - vshr.u64 d25,d20,#18 -#if 0>0 - vadd.i64 d16,d30 @ h+=Maj from the past -#endif - vshr.u64 d26,d20,#41 - vld1.64 {d28},[r3,:64]! @ K[i++] - vsli.64 d24,d20,#50 - vsli.64 d25,d20,#46 - vmov d29,d20 - vsli.64 d26,d20,#23 -#if 0<16 && defined(__ARMEL__) - vrev64.8 d0,d0 -#endif - veor d25,d24 - vbsl d29,d21,d22 @ Ch(e,f,g) - vshr.u64 d24,d16,#28 - veor d26,d25 @ Sigma1(e) - vadd.i64 d27,d29,d23 - vshr.u64 d25,d16,#34 - vsli.64 d24,d16,#36 - vadd.i64 d27,d26 - vshr.u64 d26,d16,#39 - vadd.i64 d28,d0 - vsli.64 d25,d16,#30 - veor d30,d16,d17 - vsli.64 d26,d16,#25 - veor d23,d24,d25 - vadd.i64 d27,d28 - vbsl d30,d18,d17 @ Maj(a,b,c) - veor d23,d26 @ Sigma0(a) - vadd.i64 d19,d27 - vadd.i64 d30,d27 - @ vadd.i64 d23,d30 - vshr.u64 d24,d19,#14 @ 1 -#if 1<16 - vld1.64 {d1},[r1]! @ handles unaligned -#endif - vshr.u64 d25,d19,#18 -#if 1>0 - vadd.i64 d23,d30 @ h+=Maj from the past -#endif - vshr.u64 d26,d19,#41 - vld1.64 {d28},[r3,:64]! @ K[i++] - vsli.64 d24,d19,#50 - vsli.64 d25,d19,#46 - vmov d29,d19 - vsli.64 d26,d19,#23 -#if 1<16 && defined(__ARMEL__) - vrev64.8 d1,d1 -#endif - veor d25,d24 - vbsl d29,d20,d21 @ Ch(e,f,g) - vshr.u64 d24,d23,#28 - veor d26,d25 @ Sigma1(e) - vadd.i64 d27,d29,d22 - vshr.u64 d25,d23,#34 - vsli.64 d24,d23,#36 - vadd.i64 d27,d26 - vshr.u64 d26,d23,#39 - vadd.i64 d28,d1 - vsli.64 d25,d23,#30 - veor d30,d23,d16 - vsli.64 d26,d23,#25 - veor d22,d24,d25 - vadd.i64 d27,d28 - vbsl d30,d17,d16 @ Maj(a,b,c) - veor d22,d26 @ Sigma0(a) - vadd.i64 d18,d27 - vadd.i64 d30,d27 - @ vadd.i64 d22,d30 - vshr.u64 d24,d18,#14 @ 2 -#if 2<16 - vld1.64 {d2},[r1]! @ handles unaligned -#endif - vshr.u64 d25,d18,#18 -#if 2>0 - vadd.i64 d22,d30 @ h+=Maj from the past -#endif - vshr.u64 d26,d18,#41 - vld1.64 {d28},[r3,:64]! @ K[i++] - vsli.64 d24,d18,#50 - vsli.64 d25,d18,#46 - vmov d29,d18 - vsli.64 d26,d18,#23 -#if 2<16 && defined(__ARMEL__) - vrev64.8 d2,d2 -#endif - veor d25,d24 - vbsl d29,d19,d20 @ Ch(e,f,g) - vshr.u64 d24,d22,#28 - veor d26,d25 @ Sigma1(e) - vadd.i64 d27,d29,d21 - vshr.u64 d25,d22,#34 - vsli.64 d24,d22,#36 - vadd.i64 d27,d26 - vshr.u64 d26,d22,#39 - vadd.i64 d28,d2 - vsli.64 d25,d22,#30 - veor d30,d22,d23 - vsli.64 d26,d22,#25 - veor d21,d24,d25 - vadd.i64 d27,d28 - vbsl d30,d16,d23 @ Maj(a,b,c) - veor d21,d26 @ Sigma0(a) - vadd.i64 d17,d27 - vadd.i64 d30,d27 - @ vadd.i64 d21,d30 - vshr.u64 d24,d17,#14 @ 3 -#if 3<16 - vld1.64 {d3},[r1]! @ handles unaligned -#endif - vshr.u64 d25,d17,#18 -#if 3>0 - vadd.i64 d21,d30 @ h+=Maj from the past -#endif - vshr.u64 d26,d17,#41 - vld1.64 {d28},[r3,:64]! @ K[i++] - vsli.64 d24,d17,#50 - vsli.64 d25,d17,#46 - vmov d29,d17 - vsli.64 d26,d17,#23 -#if 3<16 && defined(__ARMEL__) - vrev64.8 d3,d3 -#endif - veor d25,d24 - vbsl d29,d18,d19 @ Ch(e,f,g) - vshr.u64 d24,d21,#28 - veor d26,d25 @ Sigma1(e) - vadd.i64 d27,d29,d20 - vshr.u64 d25,d21,#34 - vsli.64 d24,d21,#36 - vadd.i64 d27,d26 - vshr.u64 d26,d21,#39 - vadd.i64 d28,d3 - vsli.64 d25,d21,#30 - veor d30,d21,d22 - vsli.64 d26,d21,#25 - veor d20,d24,d25 - vadd.i64 d27,d28 - vbsl d30,d23,d22 @ Maj(a,b,c) - veor d20,d26 @ Sigma0(a) - vadd.i64 d16,d27 - vadd.i64 d30,d27 - @ vadd.i64 d20,d30 - vshr.u64 d24,d16,#14 @ 4 -#if 4<16 - vld1.64 {d4},[r1]! @ handles unaligned -#endif - vshr.u64 d25,d16,#18 -#if 4>0 - vadd.i64 d20,d30 @ h+=Maj from the past -#endif - vshr.u64 d26,d16,#41 - vld1.64 {d28},[r3,:64]! @ K[i++] - vsli.64 d24,d16,#50 - vsli.64 d25,d16,#46 - vmov d29,d16 - vsli.64 d26,d16,#23 -#if 4<16 && defined(__ARMEL__) - vrev64.8 d4,d4 -#endif - veor d25,d24 - vbsl d29,d17,d18 @ Ch(e,f,g) - vshr.u64 d24,d20,#28 - veor d26,d25 @ Sigma1(e) - vadd.i64 d27,d29,d19 - vshr.u64 d25,d20,#34 - vsli.64 d24,d20,#36 - vadd.i64 d27,d26 - vshr.u64 d26,d20,#39 - vadd.i64 d28,d4 - vsli.64 d25,d20,#30 - veor d30,d20,d21 - vsli.64 d26,d20,#25 - veor d19,d24,d25 - vadd.i64 d27,d28 - vbsl d30,d22,d21 @ Maj(a,b,c) - veor d19,d26 @ Sigma0(a) - vadd.i64 d23,d27 - vadd.i64 d30,d27 - @ vadd.i64 d19,d30 - vshr.u64 d24,d23,#14 @ 5 -#if 5<16 - vld1.64 {d5},[r1]! @ handles unaligned -#endif - vshr.u64 d25,d23,#18 -#if 5>0 - vadd.i64 d19,d30 @ h+=Maj from the past -#endif - vshr.u64 d26,d23,#41 - vld1.64 {d28},[r3,:64]! @ K[i++] - vsli.64 d24,d23,#50 - vsli.64 d25,d23,#46 - vmov d29,d23 - vsli.64 d26,d23,#23 -#if 5<16 && defined(__ARMEL__) - vrev64.8 d5,d5 -#endif - veor d25,d24 - vbsl d29,d16,d17 @ Ch(e,f,g) - vshr.u64 d24,d19,#28 - veor d26,d25 @ Sigma1(e) - vadd.i64 d27,d29,d18 - vshr.u64 d25,d19,#34 - vsli.64 d24,d19,#36 - vadd.i64 d27,d26 - vshr.u64 d26,d19,#39 - vadd.i64 d28,d5 - vsli.64 d25,d19,#30 - veor d30,d19,d20 - vsli.64 d26,d19,#25 - veor d18,d24,d25 - vadd.i64 d27,d28 - vbsl d30,d21,d20 @ Maj(a,b,c) - veor d18,d26 @ Sigma0(a) - vadd.i64 d22,d27 - vadd.i64 d30,d27 - @ vadd.i64 d18,d30 - vshr.u64 d24,d22,#14 @ 6 -#if 6<16 - vld1.64 {d6},[r1]! @ handles unaligned -#endif - vshr.u64 d25,d22,#18 -#if 6>0 - vadd.i64 d18,d30 @ h+=Maj from the past -#endif - vshr.u64 d26,d22,#41 - vld1.64 {d28},[r3,:64]! @ K[i++] - vsli.64 d24,d22,#50 - vsli.64 d25,d22,#46 - vmov d29,d22 - vsli.64 d26,d22,#23 -#if 6<16 && defined(__ARMEL__) - vrev64.8 d6,d6 -#endif - veor d25,d24 - vbsl d29,d23,d16 @ Ch(e,f,g) - vshr.u64 d24,d18,#28 - veor d26,d25 @ Sigma1(e) - vadd.i64 d27,d29,d17 - vshr.u64 d25,d18,#34 - vsli.64 d24,d18,#36 - vadd.i64 d27,d26 - vshr.u64 d26,d18,#39 - vadd.i64 d28,d6 - vsli.64 d25,d18,#30 - veor d30,d18,d19 - vsli.64 d26,d18,#25 - veor d17,d24,d25 - vadd.i64 d27,d28 - vbsl d30,d20,d19 @ Maj(a,b,c) - veor d17,d26 @ Sigma0(a) - vadd.i64 d21,d27 - vadd.i64 d30,d27 - @ vadd.i64 d17,d30 - vshr.u64 d24,d21,#14 @ 7 -#if 7<16 - vld1.64 {d7},[r1]! @ handles unaligned -#endif - vshr.u64 d25,d21,#18 -#if 7>0 - vadd.i64 d17,d30 @ h+=Maj from the past -#endif - vshr.u64 d26,d21,#41 - vld1.64 {d28},[r3,:64]! @ K[i++] - vsli.64 d24,d21,#50 - vsli.64 d25,d21,#46 - vmov d29,d21 - vsli.64 d26,d21,#23 -#if 7<16 && defined(__ARMEL__) - vrev64.8 d7,d7 -#endif - veor d25,d24 - vbsl d29,d22,d23 @ Ch(e,f,g) - vshr.u64 d24,d17,#28 - veor d26,d25 @ Sigma1(e) - vadd.i64 d27,d29,d16 - vshr.u64 d25,d17,#34 - vsli.64 d24,d17,#36 - vadd.i64 d27,d26 - vshr.u64 d26,d17,#39 - vadd.i64 d28,d7 - vsli.64 d25,d17,#30 - veor d30,d17,d18 - vsli.64 d26,d17,#25 - veor d16,d24,d25 - vadd.i64 d27,d28 - vbsl d30,d19,d18 @ Maj(a,b,c) - veor d16,d26 @ Sigma0(a) - vadd.i64 d20,d27 - vadd.i64 d30,d27 - @ vadd.i64 d16,d30 - vshr.u64 d24,d20,#14 @ 8 -#if 8<16 - vld1.64 {d8},[r1]! @ handles unaligned -#endif - vshr.u64 d25,d20,#18 -#if 8>0 - vadd.i64 d16,d30 @ h+=Maj from the past -#endif - vshr.u64 d26,d20,#41 - vld1.64 {d28},[r3,:64]! @ K[i++] - vsli.64 d24,d20,#50 - vsli.64 d25,d20,#46 - vmov d29,d20 - vsli.64 d26,d20,#23 -#if 8<16 && defined(__ARMEL__) - vrev64.8 d8,d8 -#endif - veor d25,d24 - vbsl d29,d21,d22 @ Ch(e,f,g) - vshr.u64 d24,d16,#28 - veor d26,d25 @ Sigma1(e) - vadd.i64 d27,d29,d23 - vshr.u64 d25,d16,#34 - vsli.64 d24,d16,#36 - vadd.i64 d27,d26 - vshr.u64 d26,d16,#39 - vadd.i64 d28,d8 - vsli.64 d25,d16,#30 - veor d30,d16,d17 - vsli.64 d26,d16,#25 - veor d23,d24,d25 - vadd.i64 d27,d28 - vbsl d30,d18,d17 @ Maj(a,b,c) - veor d23,d26 @ Sigma0(a) - vadd.i64 d19,d27 - vadd.i64 d30,d27 - @ vadd.i64 d23,d30 - vshr.u64 d24,d19,#14 @ 9 -#if 9<16 - vld1.64 {d9},[r1]! @ handles unaligned -#endif - vshr.u64 d25,d19,#18 -#if 9>0 - vadd.i64 d23,d30 @ h+=Maj from the past -#endif - vshr.u64 d26,d19,#41 - vld1.64 {d28},[r3,:64]! @ K[i++] - vsli.64 d24,d19,#50 - vsli.64 d25,d19,#46 - vmov d29,d19 - vsli.64 d26,d19,#23 -#if 9<16 && defined(__ARMEL__) - vrev64.8 d9,d9 -#endif - veor d25,d24 - vbsl d29,d20,d21 @ Ch(e,f,g) - vshr.u64 d24,d23,#28 - veor d26,d25 @ Sigma1(e) - vadd.i64 d27,d29,d22 - vshr.u64 d25,d23,#34 - vsli.64 d24,d23,#36 - vadd.i64 d27,d26 - vshr.u64 d26,d23,#39 - vadd.i64 d28,d9 - vsli.64 d25,d23,#30 - veor d30,d23,d16 - vsli.64 d26,d23,#25 - veor d22,d24,d25 - vadd.i64 d27,d28 - vbsl d30,d17,d16 @ Maj(a,b,c) - veor d22,d26 @ Sigma0(a) - vadd.i64 d18,d27 - vadd.i64 d30,d27 - @ vadd.i64 d22,d30 - vshr.u64 d24,d18,#14 @ 10 -#if 10<16 - vld1.64 {d10},[r1]! @ handles unaligned -#endif - vshr.u64 d25,d18,#18 -#if 10>0 - vadd.i64 d22,d30 @ h+=Maj from the past -#endif - vshr.u64 d26,d18,#41 - vld1.64 {d28},[r3,:64]! @ K[i++] - vsli.64 d24,d18,#50 - vsli.64 d25,d18,#46 - vmov d29,d18 - vsli.64 d26,d18,#23 -#if 10<16 && defined(__ARMEL__) - vrev64.8 d10,d10 -#endif - veor d25,d24 - vbsl d29,d19,d20 @ Ch(e,f,g) - vshr.u64 d24,d22,#28 - veor d26,d25 @ Sigma1(e) - vadd.i64 d27,d29,d21 - vshr.u64 d25,d22,#34 - vsli.64 d24,d22,#36 - vadd.i64 d27,d26 - vshr.u64 d26,d22,#39 - vadd.i64 d28,d10 - vsli.64 d25,d22,#30 - veor d30,d22,d23 - vsli.64 d26,d22,#25 - veor d21,d24,d25 - vadd.i64 d27,d28 - vbsl d30,d16,d23 @ Maj(a,b,c) - veor d21,d26 @ Sigma0(a) - vadd.i64 d17,d27 - vadd.i64 d30,d27 - @ vadd.i64 d21,d30 - vshr.u64 d24,d17,#14 @ 11 -#if 11<16 - vld1.64 {d11},[r1]! @ handles unaligned -#endif - vshr.u64 d25,d17,#18 -#if 11>0 - vadd.i64 d21,d30 @ h+=Maj from the past -#endif - vshr.u64 d26,d17,#41 - vld1.64 {d28},[r3,:64]! @ K[i++] - vsli.64 d24,d17,#50 - vsli.64 d25,d17,#46 - vmov d29,d17 - vsli.64 d26,d17,#23 -#if 11<16 && defined(__ARMEL__) - vrev64.8 d11,d11 -#endif - veor d25,d24 - vbsl d29,d18,d19 @ Ch(e,f,g) - vshr.u64 d24,d21,#28 - veor d26,d25 @ Sigma1(e) - vadd.i64 d27,d29,d20 - vshr.u64 d25,d21,#34 - vsli.64 d24,d21,#36 - vadd.i64 d27,d26 - vshr.u64 d26,d21,#39 - vadd.i64 d28,d11 - vsli.64 d25,d21,#30 - veor d30,d21,d22 - vsli.64 d26,d21,#25 - veor d20,d24,d25 - vadd.i64 d27,d28 - vbsl d30,d23,d22 @ Maj(a,b,c) - veor d20,d26 @ Sigma0(a) - vadd.i64 d16,d27 - vadd.i64 d30,d27 - @ vadd.i64 d20,d30 - vshr.u64 d24,d16,#14 @ 12 -#if 12<16 - vld1.64 {d12},[r1]! @ handles unaligned -#endif - vshr.u64 d25,d16,#18 -#if 12>0 - vadd.i64 d20,d30 @ h+=Maj from the past -#endif - vshr.u64 d26,d16,#41 - vld1.64 {d28},[r3,:64]! @ K[i++] - vsli.64 d24,d16,#50 - vsli.64 d25,d16,#46 - vmov d29,d16 - vsli.64 d26,d16,#23 -#if 12<16 && defined(__ARMEL__) - vrev64.8 d12,d12 -#endif - veor d25,d24 - vbsl d29,d17,d18 @ Ch(e,f,g) - vshr.u64 d24,d20,#28 - veor d26,d25 @ Sigma1(e) - vadd.i64 d27,d29,d19 - vshr.u64 d25,d20,#34 - vsli.64 d24,d20,#36 - vadd.i64 d27,d26 - vshr.u64 d26,d20,#39 - vadd.i64 d28,d12 - vsli.64 d25,d20,#30 - veor d30,d20,d21 - vsli.64 d26,d20,#25 - veor d19,d24,d25 - vadd.i64 d27,d28 - vbsl d30,d22,d21 @ Maj(a,b,c) - veor d19,d26 @ Sigma0(a) - vadd.i64 d23,d27 - vadd.i64 d30,d27 - @ vadd.i64 d19,d30 - vshr.u64 d24,d23,#14 @ 13 -#if 13<16 - vld1.64 {d13},[r1]! @ handles unaligned -#endif - vshr.u64 d25,d23,#18 -#if 13>0 - vadd.i64 d19,d30 @ h+=Maj from the past -#endif - vshr.u64 d26,d23,#41 - vld1.64 {d28},[r3,:64]! @ K[i++] - vsli.64 d24,d23,#50 - vsli.64 d25,d23,#46 - vmov d29,d23 - vsli.64 d26,d23,#23 -#if 13<16 && defined(__ARMEL__) - vrev64.8 d13,d13 -#endif - veor d25,d24 - vbsl d29,d16,d17 @ Ch(e,f,g) - vshr.u64 d24,d19,#28 - veor d26,d25 @ Sigma1(e) - vadd.i64 d27,d29,d18 - vshr.u64 d25,d19,#34 - vsli.64 d24,d19,#36 - vadd.i64 d27,d26 - vshr.u64 d26,d19,#39 - vadd.i64 d28,d13 - vsli.64 d25,d19,#30 - veor d30,d19,d20 - vsli.64 d26,d19,#25 - veor d18,d24,d25 - vadd.i64 d27,d28 - vbsl d30,d21,d20 @ Maj(a,b,c) - veor d18,d26 @ Sigma0(a) - vadd.i64 d22,d27 - vadd.i64 d30,d27 - @ vadd.i64 d18,d30 - vshr.u64 d24,d22,#14 @ 14 -#if 14<16 - vld1.64 {d14},[r1]! @ handles unaligned -#endif - vshr.u64 d25,d22,#18 -#if 14>0 - vadd.i64 d18,d30 @ h+=Maj from the past -#endif - vshr.u64 d26,d22,#41 - vld1.64 {d28},[r3,:64]! @ K[i++] - vsli.64 d24,d22,#50 - vsli.64 d25,d22,#46 - vmov d29,d22 - vsli.64 d26,d22,#23 -#if 14<16 && defined(__ARMEL__) - vrev64.8 d14,d14 -#endif - veor d25,d24 - vbsl d29,d23,d16 @ Ch(e,f,g) - vshr.u64 d24,d18,#28 - veor d26,d25 @ Sigma1(e) - vadd.i64 d27,d29,d17 - vshr.u64 d25,d18,#34 - vsli.64 d24,d18,#36 - vadd.i64 d27,d26 - vshr.u64 d26,d18,#39 - vadd.i64 d28,d14 - vsli.64 d25,d18,#30 - veor d30,d18,d19 - vsli.64 d26,d18,#25 - veor d17,d24,d25 - vadd.i64 d27,d28 - vbsl d30,d20,d19 @ Maj(a,b,c) - veor d17,d26 @ Sigma0(a) - vadd.i64 d21,d27 - vadd.i64 d30,d27 - @ vadd.i64 d17,d30 - vshr.u64 d24,d21,#14 @ 15 -#if 15<16 - vld1.64 {d15},[r1]! @ handles unaligned -#endif - vshr.u64 d25,d21,#18 -#if 15>0 - vadd.i64 d17,d30 @ h+=Maj from the past -#endif - vshr.u64 d26,d21,#41 - vld1.64 {d28},[r3,:64]! @ K[i++] - vsli.64 d24,d21,#50 - vsli.64 d25,d21,#46 - vmov d29,d21 - vsli.64 d26,d21,#23 -#if 15<16 && defined(__ARMEL__) - vrev64.8 d15,d15 -#endif - veor d25,d24 - vbsl d29,d22,d23 @ Ch(e,f,g) - vshr.u64 d24,d17,#28 - veor d26,d25 @ Sigma1(e) - vadd.i64 d27,d29,d16 - vshr.u64 d25,d17,#34 - vsli.64 d24,d17,#36 - vadd.i64 d27,d26 - vshr.u64 d26,d17,#39 - vadd.i64 d28,d15 - vsli.64 d25,d17,#30 - veor d30,d17,d18 - vsli.64 d26,d17,#25 - veor d16,d24,d25 - vadd.i64 d27,d28 - vbsl d30,d19,d18 @ Maj(a,b,c) - veor d16,d26 @ Sigma0(a) - vadd.i64 d20,d27 - vadd.i64 d30,d27 - @ vadd.i64 d16,d30 - mov r12,#4 -.L16_79_neon: - subs r12,#1 - vshr.u64 q12,q7,#19 - vshr.u64 q13,q7,#61 - vadd.i64 d16,d30 @ h+=Maj from the past - vshr.u64 q15,q7,#6 - vsli.64 q12,q7,#45 - vext.8 q14,q0,q1,#8 @ X[i+1] - vsli.64 q13,q7,#3 - veor q15,q12 - vshr.u64 q12,q14,#1 - veor q15,q13 @ sigma1(X[i+14]) - vshr.u64 q13,q14,#8 - vadd.i64 q0,q15 - vshr.u64 q15,q14,#7 - vsli.64 q12,q14,#63 - vsli.64 q13,q14,#56 - vext.8 q14,q4,q5,#8 @ X[i+9] - veor q15,q12 - vshr.u64 d24,d20,#14 @ from NEON_00_15 - vadd.i64 q0,q14 - vshr.u64 d25,d20,#18 @ from NEON_00_15 - veor q15,q13 @ sigma0(X[i+1]) - vshr.u64 d26,d20,#41 @ from NEON_00_15 - vadd.i64 q0,q15 - vld1.64 {d28},[r3,:64]! @ K[i++] - vsli.64 d24,d20,#50 - vsli.64 d25,d20,#46 - vmov d29,d20 - vsli.64 d26,d20,#23 -#if 16<16 && defined(__ARMEL__) - vrev64.8 , -#endif - veor d25,d24 - vbsl d29,d21,d22 @ Ch(e,f,g) - vshr.u64 d24,d16,#28 - veor d26,d25 @ Sigma1(e) - vadd.i64 d27,d29,d23 - vshr.u64 d25,d16,#34 - vsli.64 d24,d16,#36 - vadd.i64 d27,d26 - vshr.u64 d26,d16,#39 - vadd.i64 d28,d0 - vsli.64 d25,d16,#30 - veor d30,d16,d17 - vsli.64 d26,d16,#25 - veor d23,d24,d25 - vadd.i64 d27,d28 - vbsl d30,d18,d17 @ Maj(a,b,c) - veor d23,d26 @ Sigma0(a) - vadd.i64 d19,d27 - vadd.i64 d30,d27 - @ vadd.i64 d23,d30 - vshr.u64 d24,d19,#14 @ 17 -#if 17<16 - vld1.64 {d1},[r1]! @ handles unaligned -#endif - vshr.u64 d25,d19,#18 -#if 17>0 - vadd.i64 d23,d30 @ h+=Maj from the past -#endif - vshr.u64 d26,d19,#41 - vld1.64 {d28},[r3,:64]! @ K[i++] - vsli.64 d24,d19,#50 - vsli.64 d25,d19,#46 - vmov d29,d19 - vsli.64 d26,d19,#23 -#if 17<16 && defined(__ARMEL__) - vrev64.8 , -#endif - veor d25,d24 - vbsl d29,d20,d21 @ Ch(e,f,g) - vshr.u64 d24,d23,#28 - veor d26,d25 @ Sigma1(e) - vadd.i64 d27,d29,d22 - vshr.u64 d25,d23,#34 - vsli.64 d24,d23,#36 - vadd.i64 d27,d26 - vshr.u64 d26,d23,#39 - vadd.i64 d28,d1 - vsli.64 d25,d23,#30 - veor d30,d23,d16 - vsli.64 d26,d23,#25 - veor d22,d24,d25 - vadd.i64 d27,d28 - vbsl d30,d17,d16 @ Maj(a,b,c) - veor d22,d26 @ Sigma0(a) - vadd.i64 d18,d27 - vadd.i64 d30,d27 - @ vadd.i64 d22,d30 - vshr.u64 q12,q0,#19 - vshr.u64 q13,q0,#61 - vadd.i64 d22,d30 @ h+=Maj from the past - vshr.u64 q15,q0,#6 - vsli.64 q12,q0,#45 - vext.8 q14,q1,q2,#8 @ X[i+1] - vsli.64 q13,q0,#3 - veor q15,q12 - vshr.u64 q12,q14,#1 - veor q15,q13 @ sigma1(X[i+14]) - vshr.u64 q13,q14,#8 - vadd.i64 q1,q15 - vshr.u64 q15,q14,#7 - vsli.64 q12,q14,#63 - vsli.64 q13,q14,#56 - vext.8 q14,q5,q6,#8 @ X[i+9] - veor q15,q12 - vshr.u64 d24,d18,#14 @ from NEON_00_15 - vadd.i64 q1,q14 - vshr.u64 d25,d18,#18 @ from NEON_00_15 - veor q15,q13 @ sigma0(X[i+1]) - vshr.u64 d26,d18,#41 @ from NEON_00_15 - vadd.i64 q1,q15 - vld1.64 {d28},[r3,:64]! @ K[i++] - vsli.64 d24,d18,#50 - vsli.64 d25,d18,#46 - vmov d29,d18 - vsli.64 d26,d18,#23 -#if 18<16 && defined(__ARMEL__) - vrev64.8 , -#endif - veor d25,d24 - vbsl d29,d19,d20 @ Ch(e,f,g) - vshr.u64 d24,d22,#28 - veor d26,d25 @ Sigma1(e) - vadd.i64 d27,d29,d21 - vshr.u64 d25,d22,#34 - vsli.64 d24,d22,#36 - vadd.i64 d27,d26 - vshr.u64 d26,d22,#39 - vadd.i64 d28,d2 - vsli.64 d25,d22,#30 - veor d30,d22,d23 - vsli.64 d26,d22,#25 - veor d21,d24,d25 - vadd.i64 d27,d28 - vbsl d30,d16,d23 @ Maj(a,b,c) - veor d21,d26 @ Sigma0(a) - vadd.i64 d17,d27 - vadd.i64 d30,d27 - @ vadd.i64 d21,d30 - vshr.u64 d24,d17,#14 @ 19 -#if 19<16 - vld1.64 {d3},[r1]! @ handles unaligned -#endif - vshr.u64 d25,d17,#18 -#if 19>0 - vadd.i64 d21,d30 @ h+=Maj from the past -#endif - vshr.u64 d26,d17,#41 - vld1.64 {d28},[r3,:64]! @ K[i++] - vsli.64 d24,d17,#50 - vsli.64 d25,d17,#46 - vmov d29,d17 - vsli.64 d26,d17,#23 -#if 19<16 && defined(__ARMEL__) - vrev64.8 , -#endif - veor d25,d24 - vbsl d29,d18,d19 @ Ch(e,f,g) - vshr.u64 d24,d21,#28 - veor d26,d25 @ Sigma1(e) - vadd.i64 d27,d29,d20 - vshr.u64 d25,d21,#34 - vsli.64 d24,d21,#36 - vadd.i64 d27,d26 - vshr.u64 d26,d21,#39 - vadd.i64 d28,d3 - vsli.64 d25,d21,#30 - veor d30,d21,d22 - vsli.64 d26,d21,#25 - veor d20,d24,d25 - vadd.i64 d27,d28 - vbsl d30,d23,d22 @ Maj(a,b,c) - veor d20,d26 @ Sigma0(a) - vadd.i64 d16,d27 - vadd.i64 d30,d27 - @ vadd.i64 d20,d30 - vshr.u64 q12,q1,#19 - vshr.u64 q13,q1,#61 - vadd.i64 d20,d30 @ h+=Maj from the past - vshr.u64 q15,q1,#6 - vsli.64 q12,q1,#45 - vext.8 q14,q2,q3,#8 @ X[i+1] - vsli.64 q13,q1,#3 - veor q15,q12 - vshr.u64 q12,q14,#1 - veor q15,q13 @ sigma1(X[i+14]) - vshr.u64 q13,q14,#8 - vadd.i64 q2,q15 - vshr.u64 q15,q14,#7 - vsli.64 q12,q14,#63 - vsli.64 q13,q14,#56 - vext.8 q14,q6,q7,#8 @ X[i+9] - veor q15,q12 - vshr.u64 d24,d16,#14 @ from NEON_00_15 - vadd.i64 q2,q14 - vshr.u64 d25,d16,#18 @ from NEON_00_15 - veor q15,q13 @ sigma0(X[i+1]) - vshr.u64 d26,d16,#41 @ from NEON_00_15 - vadd.i64 q2,q15 - vld1.64 {d28},[r3,:64]! @ K[i++] - vsli.64 d24,d16,#50 - vsli.64 d25,d16,#46 - vmov d29,d16 - vsli.64 d26,d16,#23 -#if 20<16 && defined(__ARMEL__) - vrev64.8 , -#endif - veor d25,d24 - vbsl d29,d17,d18 @ Ch(e,f,g) - vshr.u64 d24,d20,#28 - veor d26,d25 @ Sigma1(e) - vadd.i64 d27,d29,d19 - vshr.u64 d25,d20,#34 - vsli.64 d24,d20,#36 - vadd.i64 d27,d26 - vshr.u64 d26,d20,#39 - vadd.i64 d28,d4 - vsli.64 d25,d20,#30 - veor d30,d20,d21 - vsli.64 d26,d20,#25 - veor d19,d24,d25 - vadd.i64 d27,d28 - vbsl d30,d22,d21 @ Maj(a,b,c) - veor d19,d26 @ Sigma0(a) - vadd.i64 d23,d27 - vadd.i64 d30,d27 - @ vadd.i64 d19,d30 - vshr.u64 d24,d23,#14 @ 21 -#if 21<16 - vld1.64 {d5},[r1]! @ handles unaligned -#endif - vshr.u64 d25,d23,#18 -#if 21>0 - vadd.i64 d19,d30 @ h+=Maj from the past -#endif - vshr.u64 d26,d23,#41 - vld1.64 {d28},[r3,:64]! @ K[i++] - vsli.64 d24,d23,#50 - vsli.64 d25,d23,#46 - vmov d29,d23 - vsli.64 d26,d23,#23 -#if 21<16 && defined(__ARMEL__) - vrev64.8 , -#endif - veor d25,d24 - vbsl d29,d16,d17 @ Ch(e,f,g) - vshr.u64 d24,d19,#28 - veor d26,d25 @ Sigma1(e) - vadd.i64 d27,d29,d18 - vshr.u64 d25,d19,#34 - vsli.64 d24,d19,#36 - vadd.i64 d27,d26 - vshr.u64 d26,d19,#39 - vadd.i64 d28,d5 - vsli.64 d25,d19,#30 - veor d30,d19,d20 - vsli.64 d26,d19,#25 - veor d18,d24,d25 - vadd.i64 d27,d28 - vbsl d30,d21,d20 @ Maj(a,b,c) - veor d18,d26 @ Sigma0(a) - vadd.i64 d22,d27 - vadd.i64 d30,d27 - @ vadd.i64 d18,d30 - vshr.u64 q12,q2,#19 - vshr.u64 q13,q2,#61 - vadd.i64 d18,d30 @ h+=Maj from the past - vshr.u64 q15,q2,#6 - vsli.64 q12,q2,#45 - vext.8 q14,q3,q4,#8 @ X[i+1] - vsli.64 q13,q2,#3 - veor q15,q12 - vshr.u64 q12,q14,#1 - veor q15,q13 @ sigma1(X[i+14]) - vshr.u64 q13,q14,#8 - vadd.i64 q3,q15 - vshr.u64 q15,q14,#7 - vsli.64 q12,q14,#63 - vsli.64 q13,q14,#56 - vext.8 q14,q7,q0,#8 @ X[i+9] - veor q15,q12 - vshr.u64 d24,d22,#14 @ from NEON_00_15 - vadd.i64 q3,q14 - vshr.u64 d25,d22,#18 @ from NEON_00_15 - veor q15,q13 @ sigma0(X[i+1]) - vshr.u64 d26,d22,#41 @ from NEON_00_15 - vadd.i64 q3,q15 - vld1.64 {d28},[r3,:64]! @ K[i++] - vsli.64 d24,d22,#50 - vsli.64 d25,d22,#46 - vmov d29,d22 - vsli.64 d26,d22,#23 -#if 22<16 && defined(__ARMEL__) - vrev64.8 , -#endif - veor d25,d24 - vbsl d29,d23,d16 @ Ch(e,f,g) - vshr.u64 d24,d18,#28 - veor d26,d25 @ Sigma1(e) - vadd.i64 d27,d29,d17 - vshr.u64 d25,d18,#34 - vsli.64 d24,d18,#36 - vadd.i64 d27,d26 - vshr.u64 d26,d18,#39 - vadd.i64 d28,d6 - vsli.64 d25,d18,#30 - veor d30,d18,d19 - vsli.64 d26,d18,#25 - veor d17,d24,d25 - vadd.i64 d27,d28 - vbsl d30,d20,d19 @ Maj(a,b,c) - veor d17,d26 @ Sigma0(a) - vadd.i64 d21,d27 - vadd.i64 d30,d27 - @ vadd.i64 d17,d30 - vshr.u64 d24,d21,#14 @ 23 -#if 23<16 - vld1.64 {d7},[r1]! @ handles unaligned -#endif - vshr.u64 d25,d21,#18 -#if 23>0 - vadd.i64 d17,d30 @ h+=Maj from the past -#endif - vshr.u64 d26,d21,#41 - vld1.64 {d28},[r3,:64]! @ K[i++] - vsli.64 d24,d21,#50 - vsli.64 d25,d21,#46 - vmov d29,d21 - vsli.64 d26,d21,#23 -#if 23<16 && defined(__ARMEL__) - vrev64.8 , -#endif - veor d25,d24 - vbsl d29,d22,d23 @ Ch(e,f,g) - vshr.u64 d24,d17,#28 - veor d26,d25 @ Sigma1(e) - vadd.i64 d27,d29,d16 - vshr.u64 d25,d17,#34 - vsli.64 d24,d17,#36 - vadd.i64 d27,d26 - vshr.u64 d26,d17,#39 - vadd.i64 d28,d7 - vsli.64 d25,d17,#30 - veor d30,d17,d18 - vsli.64 d26,d17,#25 - veor d16,d24,d25 - vadd.i64 d27,d28 - vbsl d30,d19,d18 @ Maj(a,b,c) - veor d16,d26 @ Sigma0(a) - vadd.i64 d20,d27 - vadd.i64 d30,d27 - @ vadd.i64 d16,d30 - vshr.u64 q12,q3,#19 - vshr.u64 q13,q3,#61 - vadd.i64 d16,d30 @ h+=Maj from the past - vshr.u64 q15,q3,#6 - vsli.64 q12,q3,#45 - vext.8 q14,q4,q5,#8 @ X[i+1] - vsli.64 q13,q3,#3 - veor q15,q12 - vshr.u64 q12,q14,#1 - veor q15,q13 @ sigma1(X[i+14]) - vshr.u64 q13,q14,#8 - vadd.i64 q4,q15 - vshr.u64 q15,q14,#7 - vsli.64 q12,q14,#63 - vsli.64 q13,q14,#56 - vext.8 q14,q0,q1,#8 @ X[i+9] - veor q15,q12 - vshr.u64 d24,d20,#14 @ from NEON_00_15 - vadd.i64 q4,q14 - vshr.u64 d25,d20,#18 @ from NEON_00_15 - veor q15,q13 @ sigma0(X[i+1]) - vshr.u64 d26,d20,#41 @ from NEON_00_15 - vadd.i64 q4,q15 - vld1.64 {d28},[r3,:64]! @ K[i++] - vsli.64 d24,d20,#50 - vsli.64 d25,d20,#46 - vmov d29,d20 - vsli.64 d26,d20,#23 -#if 24<16 && defined(__ARMEL__) - vrev64.8 , -#endif - veor d25,d24 - vbsl d29,d21,d22 @ Ch(e,f,g) - vshr.u64 d24,d16,#28 - veor d26,d25 @ Sigma1(e) - vadd.i64 d27,d29,d23 - vshr.u64 d25,d16,#34 - vsli.64 d24,d16,#36 - vadd.i64 d27,d26 - vshr.u64 d26,d16,#39 - vadd.i64 d28,d8 - vsli.64 d25,d16,#30 - veor d30,d16,d17 - vsli.64 d26,d16,#25 - veor d23,d24,d25 - vadd.i64 d27,d28 - vbsl d30,d18,d17 @ Maj(a,b,c) - veor d23,d26 @ Sigma0(a) - vadd.i64 d19,d27 - vadd.i64 d30,d27 - @ vadd.i64 d23,d30 - vshr.u64 d24,d19,#14 @ 25 -#if 25<16 - vld1.64 {d9},[r1]! @ handles unaligned -#endif - vshr.u64 d25,d19,#18 -#if 25>0 - vadd.i64 d23,d30 @ h+=Maj from the past -#endif - vshr.u64 d26,d19,#41 - vld1.64 {d28},[r3,:64]! @ K[i++] - vsli.64 d24,d19,#50 - vsli.64 d25,d19,#46 - vmov d29,d19 - vsli.64 d26,d19,#23 -#if 25<16 && defined(__ARMEL__) - vrev64.8 , -#endif - veor d25,d24 - vbsl d29,d20,d21 @ Ch(e,f,g) - vshr.u64 d24,d23,#28 - veor d26,d25 @ Sigma1(e) - vadd.i64 d27,d29,d22 - vshr.u64 d25,d23,#34 - vsli.64 d24,d23,#36 - vadd.i64 d27,d26 - vshr.u64 d26,d23,#39 - vadd.i64 d28,d9 - vsli.64 d25,d23,#30 - veor d30,d23,d16 - vsli.64 d26,d23,#25 - veor d22,d24,d25 - vadd.i64 d27,d28 - vbsl d30,d17,d16 @ Maj(a,b,c) - veor d22,d26 @ Sigma0(a) - vadd.i64 d18,d27 - vadd.i64 d30,d27 - @ vadd.i64 d22,d30 - vshr.u64 q12,q4,#19 - vshr.u64 q13,q4,#61 - vadd.i64 d22,d30 @ h+=Maj from the past - vshr.u64 q15,q4,#6 - vsli.64 q12,q4,#45 - vext.8 q14,q5,q6,#8 @ X[i+1] - vsli.64 q13,q4,#3 - veor q15,q12 - vshr.u64 q12,q14,#1 - veor q15,q13 @ sigma1(X[i+14]) - vshr.u64 q13,q14,#8 - vadd.i64 q5,q15 - vshr.u64 q15,q14,#7 - vsli.64 q12,q14,#63 - vsli.64 q13,q14,#56 - vext.8 q14,q1,q2,#8 @ X[i+9] - veor q15,q12 - vshr.u64 d24,d18,#14 @ from NEON_00_15 - vadd.i64 q5,q14 - vshr.u64 d25,d18,#18 @ from NEON_00_15 - veor q15,q13 @ sigma0(X[i+1]) - vshr.u64 d26,d18,#41 @ from NEON_00_15 - vadd.i64 q5,q15 - vld1.64 {d28},[r3,:64]! @ K[i++] - vsli.64 d24,d18,#50 - vsli.64 d25,d18,#46 - vmov d29,d18 - vsli.64 d26,d18,#23 -#if 26<16 && defined(__ARMEL__) - vrev64.8 , -#endif - veor d25,d24 - vbsl d29,d19,d20 @ Ch(e,f,g) - vshr.u64 d24,d22,#28 - veor d26,d25 @ Sigma1(e) - vadd.i64 d27,d29,d21 - vshr.u64 d25,d22,#34 - vsli.64 d24,d22,#36 - vadd.i64 d27,d26 - vshr.u64 d26,d22,#39 - vadd.i64 d28,d10 - vsli.64 d25,d22,#30 - veor d30,d22,d23 - vsli.64 d26,d22,#25 - veor d21,d24,d25 - vadd.i64 d27,d28 - vbsl d30,d16,d23 @ Maj(a,b,c) - veor d21,d26 @ Sigma0(a) - vadd.i64 d17,d27 - vadd.i64 d30,d27 - @ vadd.i64 d21,d30 - vshr.u64 d24,d17,#14 @ 27 -#if 27<16 - vld1.64 {d11},[r1]! @ handles unaligned -#endif - vshr.u64 d25,d17,#18 -#if 27>0 - vadd.i64 d21,d30 @ h+=Maj from the past -#endif - vshr.u64 d26,d17,#41 - vld1.64 {d28},[r3,:64]! @ K[i++] - vsli.64 d24,d17,#50 - vsli.64 d25,d17,#46 - vmov d29,d17 - vsli.64 d26,d17,#23 -#if 27<16 && defined(__ARMEL__) - vrev64.8 , -#endif - veor d25,d24 - vbsl d29,d18,d19 @ Ch(e,f,g) - vshr.u64 d24,d21,#28 - veor d26,d25 @ Sigma1(e) - vadd.i64 d27,d29,d20 - vshr.u64 d25,d21,#34 - vsli.64 d24,d21,#36 - vadd.i64 d27,d26 - vshr.u64 d26,d21,#39 - vadd.i64 d28,d11 - vsli.64 d25,d21,#30 - veor d30,d21,d22 - vsli.64 d26,d21,#25 - veor d20,d24,d25 - vadd.i64 d27,d28 - vbsl d30,d23,d22 @ Maj(a,b,c) - veor d20,d26 @ Sigma0(a) - vadd.i64 d16,d27 - vadd.i64 d30,d27 - @ vadd.i64 d20,d30 - vshr.u64 q12,q5,#19 - vshr.u64 q13,q5,#61 - vadd.i64 d20,d30 @ h+=Maj from the past - vshr.u64 q15,q5,#6 - vsli.64 q12,q5,#45 - vext.8 q14,q6,q7,#8 @ X[i+1] - vsli.64 q13,q5,#3 - veor q15,q12 - vshr.u64 q12,q14,#1 - veor q15,q13 @ sigma1(X[i+14]) - vshr.u64 q13,q14,#8 - vadd.i64 q6,q15 - vshr.u64 q15,q14,#7 - vsli.64 q12,q14,#63 - vsli.64 q13,q14,#56 - vext.8 q14,q2,q3,#8 @ X[i+9] - veor q15,q12 - vshr.u64 d24,d16,#14 @ from NEON_00_15 - vadd.i64 q6,q14 - vshr.u64 d25,d16,#18 @ from NEON_00_15 - veor q15,q13 @ sigma0(X[i+1]) - vshr.u64 d26,d16,#41 @ from NEON_00_15 - vadd.i64 q6,q15 - vld1.64 {d28},[r3,:64]! @ K[i++] - vsli.64 d24,d16,#50 - vsli.64 d25,d16,#46 - vmov d29,d16 - vsli.64 d26,d16,#23 -#if 28<16 && defined(__ARMEL__) - vrev64.8 , -#endif - veor d25,d24 - vbsl d29,d17,d18 @ Ch(e,f,g) - vshr.u64 d24,d20,#28 - veor d26,d25 @ Sigma1(e) - vadd.i64 d27,d29,d19 - vshr.u64 d25,d20,#34 - vsli.64 d24,d20,#36 - vadd.i64 d27,d26 - vshr.u64 d26,d20,#39 - vadd.i64 d28,d12 - vsli.64 d25,d20,#30 - veor d30,d20,d21 - vsli.64 d26,d20,#25 - veor d19,d24,d25 - vadd.i64 d27,d28 - vbsl d30,d22,d21 @ Maj(a,b,c) - veor d19,d26 @ Sigma0(a) - vadd.i64 d23,d27 - vadd.i64 d30,d27 - @ vadd.i64 d19,d30 - vshr.u64 d24,d23,#14 @ 29 -#if 29<16 - vld1.64 {d13},[r1]! @ handles unaligned -#endif - vshr.u64 d25,d23,#18 -#if 29>0 - vadd.i64 d19,d30 @ h+=Maj from the past -#endif - vshr.u64 d26,d23,#41 - vld1.64 {d28},[r3,:64]! @ K[i++] - vsli.64 d24,d23,#50 - vsli.64 d25,d23,#46 - vmov d29,d23 - vsli.64 d26,d23,#23 -#if 29<16 && defined(__ARMEL__) - vrev64.8 , -#endif - veor d25,d24 - vbsl d29,d16,d17 @ Ch(e,f,g) - vshr.u64 d24,d19,#28 - veor d26,d25 @ Sigma1(e) - vadd.i64 d27,d29,d18 - vshr.u64 d25,d19,#34 - vsli.64 d24,d19,#36 - vadd.i64 d27,d26 - vshr.u64 d26,d19,#39 - vadd.i64 d28,d13 - vsli.64 d25,d19,#30 - veor d30,d19,d20 - vsli.64 d26,d19,#25 - veor d18,d24,d25 - vadd.i64 d27,d28 - vbsl d30,d21,d20 @ Maj(a,b,c) - veor d18,d26 @ Sigma0(a) - vadd.i64 d22,d27 - vadd.i64 d30,d27 - @ vadd.i64 d18,d30 - vshr.u64 q12,q6,#19 - vshr.u64 q13,q6,#61 - vadd.i64 d18,d30 @ h+=Maj from the past - vshr.u64 q15,q6,#6 - vsli.64 q12,q6,#45 - vext.8 q14,q7,q0,#8 @ X[i+1] - vsli.64 q13,q6,#3 - veor q15,q12 - vshr.u64 q12,q14,#1 - veor q15,q13 @ sigma1(X[i+14]) - vshr.u64 q13,q14,#8 - vadd.i64 q7,q15 - vshr.u64 q15,q14,#7 - vsli.64 q12,q14,#63 - vsli.64 q13,q14,#56 - vext.8 q14,q3,q4,#8 @ X[i+9] - veor q15,q12 - vshr.u64 d24,d22,#14 @ from NEON_00_15 - vadd.i64 q7,q14 - vshr.u64 d25,d22,#18 @ from NEON_00_15 - veor q15,q13 @ sigma0(X[i+1]) - vshr.u64 d26,d22,#41 @ from NEON_00_15 - vadd.i64 q7,q15 - vld1.64 {d28},[r3,:64]! @ K[i++] - vsli.64 d24,d22,#50 - vsli.64 d25,d22,#46 - vmov d29,d22 - vsli.64 d26,d22,#23 -#if 30<16 && defined(__ARMEL__) - vrev64.8 , -#endif - veor d25,d24 - vbsl d29,d23,d16 @ Ch(e,f,g) - vshr.u64 d24,d18,#28 - veor d26,d25 @ Sigma1(e) - vadd.i64 d27,d29,d17 - vshr.u64 d25,d18,#34 - vsli.64 d24,d18,#36 - vadd.i64 d27,d26 - vshr.u64 d26,d18,#39 - vadd.i64 d28,d14 - vsli.64 d25,d18,#30 - veor d30,d18,d19 - vsli.64 d26,d18,#25 - veor d17,d24,d25 - vadd.i64 d27,d28 - vbsl d30,d20,d19 @ Maj(a,b,c) - veor d17,d26 @ Sigma0(a) - vadd.i64 d21,d27 - vadd.i64 d30,d27 - @ vadd.i64 d17,d30 - vshr.u64 d24,d21,#14 @ 31 -#if 31<16 - vld1.64 {d15},[r1]! @ handles unaligned -#endif - vshr.u64 d25,d21,#18 -#if 31>0 - vadd.i64 d17,d30 @ h+=Maj from the past -#endif - vshr.u64 d26,d21,#41 - vld1.64 {d28},[r3,:64]! @ K[i++] - vsli.64 d24,d21,#50 - vsli.64 d25,d21,#46 - vmov d29,d21 - vsli.64 d26,d21,#23 -#if 31<16 && defined(__ARMEL__) - vrev64.8 , -#endif - veor d25,d24 - vbsl d29,d22,d23 @ Ch(e,f,g) - vshr.u64 d24,d17,#28 - veor d26,d25 @ Sigma1(e) - vadd.i64 d27,d29,d16 - vshr.u64 d25,d17,#34 - vsli.64 d24,d17,#36 - vadd.i64 d27,d26 - vshr.u64 d26,d17,#39 - vadd.i64 d28,d15 - vsli.64 d25,d17,#30 - veor d30,d17,d18 - vsli.64 d26,d17,#25 - veor d16,d24,d25 - vadd.i64 d27,d28 - vbsl d30,d19,d18 @ Maj(a,b,c) - veor d16,d26 @ Sigma0(a) - vadd.i64 d20,d27 - vadd.i64 d30,d27 - @ vadd.i64 d16,d30 - bne .L16_79_neon - - vadd.i64 d16,d30 @ h+=Maj from the past - vldmia r0,{d24,d25,d26,d27,d28,d29,d30,d31} @ load context to temp - vadd.i64 q8,q12 @ vectorized accumulate - vadd.i64 q9,q13 - vadd.i64 q10,q14 - vadd.i64 q11,q15 - vstmia r0,{d16,d17,d18,d19,d20,d21,d22,d23} @ save context - teq r1,r2 - sub r3,#640 @ rewind K512 - bne .Loop_neon - - VFP_ABI_POP - bx lr @ .word 0xe12fff1e -.size sha512_block_data_order_neon,.-sha512_block_data_order_neon -#endif -.byte 83,72,65,53,49,50,32,98,108,111,99,107,32,116,114,97,110,115,102,111,114,109,32,102,111,114,32,65,82,77,118,52,47,78,69,79,78,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 -.align 2 -#endif -#endif // !OPENSSL_NO_ASM -.section .note.GNU-stack,"",%progbits diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/sha512-armv8-ios64.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/sha512-armv8-ios64.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/sha512-armv8-ios64.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/sha512-armv8-ios64.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,1078 +0,0 @@ -// This file is generated from a similarly-named Perl script in the BoringSSL -// source tree. Do not edit by hand. - -#if !defined(__has_feature) -#define __has_feature(x) 0 -#endif -#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) -#define OPENSSL_NO_ASM -#endif - -#if !defined(OPENSSL_NO_ASM) -// Copyright 2014-2016 The OpenSSL Project Authors. All Rights Reserved. -// -// Licensed under the OpenSSL license (the "License"). You may not use -// this file except in compliance with the License. You can obtain a copy -// in the file LICENSE in the source distribution or at -// https://www.openssl.org/source/license.html - -// ==================================================================== -// Written by Andy Polyakov for the OpenSSL -// project. The module is, however, dual licensed under OpenSSL and -// CRYPTOGAMS licenses depending on where you obtain it. For further -// details see http://www.openssl.org/~appro/cryptogams/. -// -// Permission to use under GPLv2 terms is granted. -// ==================================================================== -// -// SHA256/512 for ARMv8. -// -// Performance in cycles per processed byte and improvement coefficient -// over code generated with "default" compiler: -// -// SHA256-hw SHA256(*) SHA512 -// Apple A7 1.97 10.5 (+33%) 6.73 (-1%(**)) -// Cortex-A53 2.38 15.5 (+115%) 10.0 (+150%(***)) -// Cortex-A57 2.31 11.6 (+86%) 7.51 (+260%(***)) -// Denver 2.01 10.5 (+26%) 6.70 (+8%) -// X-Gene 20.0 (+100%) 12.8 (+300%(***)) -// Mongoose 2.36 13.0 (+50%) 8.36 (+33%) -// -// (*) Software SHA256 results are of lesser relevance, presented -// mostly for informational purposes. -// (**) The result is a trade-off: it's possible to improve it by -// 10% (or by 1 cycle per round), but at the cost of 20% loss -// on Cortex-A53 (or by 4 cycles per round). -// (***) Super-impressive coefficients over gcc-generated code are -// indication of some compiler "pathology", most notably code -// generated with -mgeneral-regs-only is significanty faster -// and the gap is only 40-90%. - -#ifndef __KERNEL__ -# include -#endif - -.text - - -.private_extern _GFp_armcap_P -.globl _GFp_sha512_block_data_order -.private_extern _GFp_sha512_block_data_order - -.align 6 -_GFp_sha512_block_data_order: - AARCH64_SIGN_LINK_REGISTER - stp x29,x30,[sp,#-128]! - add x29,sp,#0 - - stp x19,x20,[sp,#16] - stp x21,x22,[sp,#32] - stp x23,x24,[sp,#48] - stp x25,x26,[sp,#64] - stp x27,x28,[sp,#80] - sub sp,sp,#4*8 - - ldp x20,x21,[x0] // load context - ldp x22,x23,[x0,#2*8] - ldp x24,x25,[x0,#4*8] - add x2,x1,x2,lsl#7 // end of input - ldp x26,x27,[x0,#6*8] - adrp x30,LK512@PAGE - add x30,x30,LK512@PAGEOFF - stp x0,x2,[x29,#96] - -Loop: - ldp x3,x4,[x1],#2*8 - ldr x19,[x30],#8 // *K++ - eor x28,x21,x22 // magic seed - str x1,[x29,#112] -#ifndef __ARMEB__ - rev x3,x3 // 0 -#endif - ror x16,x24,#14 - add x27,x27,x19 // h+=K[i] - eor x6,x24,x24,ror#23 - and x17,x25,x24 - bic x19,x26,x24 - add x27,x27,x3 // h+=X[i] - orr x17,x17,x19 // Ch(e,f,g) - eor x19,x20,x21 // a^b, b^c in next round - eor x16,x16,x6,ror#18 // Sigma1(e) - ror x6,x20,#28 - add x27,x27,x17 // h+=Ch(e,f,g) - eor x17,x20,x20,ror#5 - add x27,x27,x16 // h+=Sigma1(e) - and x28,x28,x19 // (b^c)&=(a^b) - add x23,x23,x27 // d+=h - eor x28,x28,x21 // Maj(a,b,c) - eor x17,x6,x17,ror#34 // Sigma0(a) - add x27,x27,x28 // h+=Maj(a,b,c) - ldr x28,[x30],#8 // *K++, x19 in next round - //add x27,x27,x17 // h+=Sigma0(a) -#ifndef __ARMEB__ - rev x4,x4 // 1 -#endif - ldp x5,x6,[x1],#2*8 - add x27,x27,x17 // h+=Sigma0(a) - ror x16,x23,#14 - add x26,x26,x28 // h+=K[i] - eor x7,x23,x23,ror#23 - and x17,x24,x23 - bic x28,x25,x23 - add x26,x26,x4 // h+=X[i] - orr x17,x17,x28 // Ch(e,f,g) - eor x28,x27,x20 // a^b, b^c in next round - eor x16,x16,x7,ror#18 // Sigma1(e) - ror x7,x27,#28 - add x26,x26,x17 // h+=Ch(e,f,g) - eor x17,x27,x27,ror#5 - add x26,x26,x16 // h+=Sigma1(e) - and x19,x19,x28 // (b^c)&=(a^b) - add x22,x22,x26 // d+=h - eor x19,x19,x20 // Maj(a,b,c) - eor x17,x7,x17,ror#34 // Sigma0(a) - add x26,x26,x19 // h+=Maj(a,b,c) - ldr x19,[x30],#8 // *K++, x28 in next round - //add x26,x26,x17 // h+=Sigma0(a) -#ifndef __ARMEB__ - rev x5,x5 // 2 -#endif - add x26,x26,x17 // h+=Sigma0(a) - ror x16,x22,#14 - add x25,x25,x19 // h+=K[i] - eor x8,x22,x22,ror#23 - and x17,x23,x22 - bic x19,x24,x22 - add x25,x25,x5 // h+=X[i] - orr x17,x17,x19 // Ch(e,f,g) - eor x19,x26,x27 // a^b, b^c in next round - eor x16,x16,x8,ror#18 // Sigma1(e) - ror x8,x26,#28 - add x25,x25,x17 // h+=Ch(e,f,g) - eor x17,x26,x26,ror#5 - add x25,x25,x16 // h+=Sigma1(e) - and x28,x28,x19 // (b^c)&=(a^b) - add x21,x21,x25 // d+=h - eor x28,x28,x27 // Maj(a,b,c) - eor x17,x8,x17,ror#34 // Sigma0(a) - add x25,x25,x28 // h+=Maj(a,b,c) - ldr x28,[x30],#8 // *K++, x19 in next round - //add x25,x25,x17 // h+=Sigma0(a) -#ifndef __ARMEB__ - rev x6,x6 // 3 -#endif - ldp x7,x8,[x1],#2*8 - add x25,x25,x17 // h+=Sigma0(a) - ror x16,x21,#14 - add x24,x24,x28 // h+=K[i] - eor x9,x21,x21,ror#23 - and x17,x22,x21 - bic x28,x23,x21 - add x24,x24,x6 // h+=X[i] - orr x17,x17,x28 // Ch(e,f,g) - eor x28,x25,x26 // a^b, b^c in next round - eor x16,x16,x9,ror#18 // Sigma1(e) - ror x9,x25,#28 - add x24,x24,x17 // h+=Ch(e,f,g) - eor x17,x25,x25,ror#5 - add x24,x24,x16 // h+=Sigma1(e) - and x19,x19,x28 // (b^c)&=(a^b) - add x20,x20,x24 // d+=h - eor x19,x19,x26 // Maj(a,b,c) - eor x17,x9,x17,ror#34 // Sigma0(a) - add x24,x24,x19 // h+=Maj(a,b,c) - ldr x19,[x30],#8 // *K++, x28 in next round - //add x24,x24,x17 // h+=Sigma0(a) -#ifndef __ARMEB__ - rev x7,x7 // 4 -#endif - add x24,x24,x17 // h+=Sigma0(a) - ror x16,x20,#14 - add x23,x23,x19 // h+=K[i] - eor x10,x20,x20,ror#23 - and x17,x21,x20 - bic x19,x22,x20 - add x23,x23,x7 // h+=X[i] - orr x17,x17,x19 // Ch(e,f,g) - eor x19,x24,x25 // a^b, b^c in next round - eor x16,x16,x10,ror#18 // Sigma1(e) - ror x10,x24,#28 - add x23,x23,x17 // h+=Ch(e,f,g) - eor x17,x24,x24,ror#5 - add x23,x23,x16 // h+=Sigma1(e) - and x28,x28,x19 // (b^c)&=(a^b) - add x27,x27,x23 // d+=h - eor x28,x28,x25 // Maj(a,b,c) - eor x17,x10,x17,ror#34 // Sigma0(a) - add x23,x23,x28 // h+=Maj(a,b,c) - ldr x28,[x30],#8 // *K++, x19 in next round - //add x23,x23,x17 // h+=Sigma0(a) -#ifndef __ARMEB__ - rev x8,x8 // 5 -#endif - ldp x9,x10,[x1],#2*8 - add x23,x23,x17 // h+=Sigma0(a) - ror x16,x27,#14 - add x22,x22,x28 // h+=K[i] - eor x11,x27,x27,ror#23 - and x17,x20,x27 - bic x28,x21,x27 - add x22,x22,x8 // h+=X[i] - orr x17,x17,x28 // Ch(e,f,g) - eor x28,x23,x24 // a^b, b^c in next round - eor x16,x16,x11,ror#18 // Sigma1(e) - ror x11,x23,#28 - add x22,x22,x17 // h+=Ch(e,f,g) - eor x17,x23,x23,ror#5 - add x22,x22,x16 // h+=Sigma1(e) - and x19,x19,x28 // (b^c)&=(a^b) - add x26,x26,x22 // d+=h - eor x19,x19,x24 // Maj(a,b,c) - eor x17,x11,x17,ror#34 // Sigma0(a) - add x22,x22,x19 // h+=Maj(a,b,c) - ldr x19,[x30],#8 // *K++, x28 in next round - //add x22,x22,x17 // h+=Sigma0(a) -#ifndef __ARMEB__ - rev x9,x9 // 6 -#endif - add x22,x22,x17 // h+=Sigma0(a) - ror x16,x26,#14 - add x21,x21,x19 // h+=K[i] - eor x12,x26,x26,ror#23 - and x17,x27,x26 - bic x19,x20,x26 - add x21,x21,x9 // h+=X[i] - orr x17,x17,x19 // Ch(e,f,g) - eor x19,x22,x23 // a^b, b^c in next round - eor x16,x16,x12,ror#18 // Sigma1(e) - ror x12,x22,#28 - add x21,x21,x17 // h+=Ch(e,f,g) - eor x17,x22,x22,ror#5 - add x21,x21,x16 // h+=Sigma1(e) - and x28,x28,x19 // (b^c)&=(a^b) - add x25,x25,x21 // d+=h - eor x28,x28,x23 // Maj(a,b,c) - eor x17,x12,x17,ror#34 // Sigma0(a) - add x21,x21,x28 // h+=Maj(a,b,c) - ldr x28,[x30],#8 // *K++, x19 in next round - //add x21,x21,x17 // h+=Sigma0(a) -#ifndef __ARMEB__ - rev x10,x10 // 7 -#endif - ldp x11,x12,[x1],#2*8 - add x21,x21,x17 // h+=Sigma0(a) - ror x16,x25,#14 - add x20,x20,x28 // h+=K[i] - eor x13,x25,x25,ror#23 - and x17,x26,x25 - bic x28,x27,x25 - add x20,x20,x10 // h+=X[i] - orr x17,x17,x28 // Ch(e,f,g) - eor x28,x21,x22 // a^b, b^c in next round - eor x16,x16,x13,ror#18 // Sigma1(e) - ror x13,x21,#28 - add x20,x20,x17 // h+=Ch(e,f,g) - eor x17,x21,x21,ror#5 - add x20,x20,x16 // h+=Sigma1(e) - and x19,x19,x28 // (b^c)&=(a^b) - add x24,x24,x20 // d+=h - eor x19,x19,x22 // Maj(a,b,c) - eor x17,x13,x17,ror#34 // Sigma0(a) - add x20,x20,x19 // h+=Maj(a,b,c) - ldr x19,[x30],#8 // *K++, x28 in next round - //add x20,x20,x17 // h+=Sigma0(a) -#ifndef __ARMEB__ - rev x11,x11 // 8 -#endif - add x20,x20,x17 // h+=Sigma0(a) - ror x16,x24,#14 - add x27,x27,x19 // h+=K[i] - eor x14,x24,x24,ror#23 - and x17,x25,x24 - bic x19,x26,x24 - add x27,x27,x11 // h+=X[i] - orr x17,x17,x19 // Ch(e,f,g) - eor x19,x20,x21 // a^b, b^c in next round - eor x16,x16,x14,ror#18 // Sigma1(e) - ror x14,x20,#28 - add x27,x27,x17 // h+=Ch(e,f,g) - eor x17,x20,x20,ror#5 - add x27,x27,x16 // h+=Sigma1(e) - and x28,x28,x19 // (b^c)&=(a^b) - add x23,x23,x27 // d+=h - eor x28,x28,x21 // Maj(a,b,c) - eor x17,x14,x17,ror#34 // Sigma0(a) - add x27,x27,x28 // h+=Maj(a,b,c) - ldr x28,[x30],#8 // *K++, x19 in next round - //add x27,x27,x17 // h+=Sigma0(a) -#ifndef __ARMEB__ - rev x12,x12 // 9 -#endif - ldp x13,x14,[x1],#2*8 - add x27,x27,x17 // h+=Sigma0(a) - ror x16,x23,#14 - add x26,x26,x28 // h+=K[i] - eor x15,x23,x23,ror#23 - and x17,x24,x23 - bic x28,x25,x23 - add x26,x26,x12 // h+=X[i] - orr x17,x17,x28 // Ch(e,f,g) - eor x28,x27,x20 // a^b, b^c in next round - eor x16,x16,x15,ror#18 // Sigma1(e) - ror x15,x27,#28 - add x26,x26,x17 // h+=Ch(e,f,g) - eor x17,x27,x27,ror#5 - add x26,x26,x16 // h+=Sigma1(e) - and x19,x19,x28 // (b^c)&=(a^b) - add x22,x22,x26 // d+=h - eor x19,x19,x20 // Maj(a,b,c) - eor x17,x15,x17,ror#34 // Sigma0(a) - add x26,x26,x19 // h+=Maj(a,b,c) - ldr x19,[x30],#8 // *K++, x28 in next round - //add x26,x26,x17 // h+=Sigma0(a) -#ifndef __ARMEB__ - rev x13,x13 // 10 -#endif - add x26,x26,x17 // h+=Sigma0(a) - ror x16,x22,#14 - add x25,x25,x19 // h+=K[i] - eor x0,x22,x22,ror#23 - and x17,x23,x22 - bic x19,x24,x22 - add x25,x25,x13 // h+=X[i] - orr x17,x17,x19 // Ch(e,f,g) - eor x19,x26,x27 // a^b, b^c in next round - eor x16,x16,x0,ror#18 // Sigma1(e) - ror x0,x26,#28 - add x25,x25,x17 // h+=Ch(e,f,g) - eor x17,x26,x26,ror#5 - add x25,x25,x16 // h+=Sigma1(e) - and x28,x28,x19 // (b^c)&=(a^b) - add x21,x21,x25 // d+=h - eor x28,x28,x27 // Maj(a,b,c) - eor x17,x0,x17,ror#34 // Sigma0(a) - add x25,x25,x28 // h+=Maj(a,b,c) - ldr x28,[x30],#8 // *K++, x19 in next round - //add x25,x25,x17 // h+=Sigma0(a) -#ifndef __ARMEB__ - rev x14,x14 // 11 -#endif - ldp x15,x0,[x1],#2*8 - add x25,x25,x17 // h+=Sigma0(a) - str x6,[sp,#24] - ror x16,x21,#14 - add x24,x24,x28 // h+=K[i] - eor x6,x21,x21,ror#23 - and x17,x22,x21 - bic x28,x23,x21 - add x24,x24,x14 // h+=X[i] - orr x17,x17,x28 // Ch(e,f,g) - eor x28,x25,x26 // a^b, b^c in next round - eor x16,x16,x6,ror#18 // Sigma1(e) - ror x6,x25,#28 - add x24,x24,x17 // h+=Ch(e,f,g) - eor x17,x25,x25,ror#5 - add x24,x24,x16 // h+=Sigma1(e) - and x19,x19,x28 // (b^c)&=(a^b) - add x20,x20,x24 // d+=h - eor x19,x19,x26 // Maj(a,b,c) - eor x17,x6,x17,ror#34 // Sigma0(a) - add x24,x24,x19 // h+=Maj(a,b,c) - ldr x19,[x30],#8 // *K++, x28 in next round - //add x24,x24,x17 // h+=Sigma0(a) -#ifndef __ARMEB__ - rev x15,x15 // 12 -#endif - add x24,x24,x17 // h+=Sigma0(a) - str x7,[sp,#0] - ror x16,x20,#14 - add x23,x23,x19 // h+=K[i] - eor x7,x20,x20,ror#23 - and x17,x21,x20 - bic x19,x22,x20 - add x23,x23,x15 // h+=X[i] - orr x17,x17,x19 // Ch(e,f,g) - eor x19,x24,x25 // a^b, b^c in next round - eor x16,x16,x7,ror#18 // Sigma1(e) - ror x7,x24,#28 - add x23,x23,x17 // h+=Ch(e,f,g) - eor x17,x24,x24,ror#5 - add x23,x23,x16 // h+=Sigma1(e) - and x28,x28,x19 // (b^c)&=(a^b) - add x27,x27,x23 // d+=h - eor x28,x28,x25 // Maj(a,b,c) - eor x17,x7,x17,ror#34 // Sigma0(a) - add x23,x23,x28 // h+=Maj(a,b,c) - ldr x28,[x30],#8 // *K++, x19 in next round - //add x23,x23,x17 // h+=Sigma0(a) -#ifndef __ARMEB__ - rev x0,x0 // 13 -#endif - ldp x1,x2,[x1] - add x23,x23,x17 // h+=Sigma0(a) - str x8,[sp,#8] - ror x16,x27,#14 - add x22,x22,x28 // h+=K[i] - eor x8,x27,x27,ror#23 - and x17,x20,x27 - bic x28,x21,x27 - add x22,x22,x0 // h+=X[i] - orr x17,x17,x28 // Ch(e,f,g) - eor x28,x23,x24 // a^b, b^c in next round - eor x16,x16,x8,ror#18 // Sigma1(e) - ror x8,x23,#28 - add x22,x22,x17 // h+=Ch(e,f,g) - eor x17,x23,x23,ror#5 - add x22,x22,x16 // h+=Sigma1(e) - and x19,x19,x28 // (b^c)&=(a^b) - add x26,x26,x22 // d+=h - eor x19,x19,x24 // Maj(a,b,c) - eor x17,x8,x17,ror#34 // Sigma0(a) - add x22,x22,x19 // h+=Maj(a,b,c) - ldr x19,[x30],#8 // *K++, x28 in next round - //add x22,x22,x17 // h+=Sigma0(a) -#ifndef __ARMEB__ - rev x1,x1 // 14 -#endif - ldr x6,[sp,#24] - add x22,x22,x17 // h+=Sigma0(a) - str x9,[sp,#16] - ror x16,x26,#14 - add x21,x21,x19 // h+=K[i] - eor x9,x26,x26,ror#23 - and x17,x27,x26 - bic x19,x20,x26 - add x21,x21,x1 // h+=X[i] - orr x17,x17,x19 // Ch(e,f,g) - eor x19,x22,x23 // a^b, b^c in next round - eor x16,x16,x9,ror#18 // Sigma1(e) - ror x9,x22,#28 - add x21,x21,x17 // h+=Ch(e,f,g) - eor x17,x22,x22,ror#5 - add x21,x21,x16 // h+=Sigma1(e) - and x28,x28,x19 // (b^c)&=(a^b) - add x25,x25,x21 // d+=h - eor x28,x28,x23 // Maj(a,b,c) - eor x17,x9,x17,ror#34 // Sigma0(a) - add x21,x21,x28 // h+=Maj(a,b,c) - ldr x28,[x30],#8 // *K++, x19 in next round - //add x21,x21,x17 // h+=Sigma0(a) -#ifndef __ARMEB__ - rev x2,x2 // 15 -#endif - ldr x7,[sp,#0] - add x21,x21,x17 // h+=Sigma0(a) - str x10,[sp,#24] - ror x16,x25,#14 - add x20,x20,x28 // h+=K[i] - ror x9,x4,#1 - and x17,x26,x25 - ror x8,x1,#19 - bic x28,x27,x25 - ror x10,x21,#28 - add x20,x20,x2 // h+=X[i] - eor x16,x16,x25,ror#18 - eor x9,x9,x4,ror#8 - orr x17,x17,x28 // Ch(e,f,g) - eor x28,x21,x22 // a^b, b^c in next round - eor x16,x16,x25,ror#41 // Sigma1(e) - eor x10,x10,x21,ror#34 - add x20,x20,x17 // h+=Ch(e,f,g) - and x19,x19,x28 // (b^c)&=(a^b) - eor x8,x8,x1,ror#61 - eor x9,x9,x4,lsr#7 // sigma0(X[i+1]) - add x20,x20,x16 // h+=Sigma1(e) - eor x19,x19,x22 // Maj(a,b,c) - eor x17,x10,x21,ror#39 // Sigma0(a) - eor x8,x8,x1,lsr#6 // sigma1(X[i+14]) - add x3,x3,x12 - add x24,x24,x20 // d+=h - add x20,x20,x19 // h+=Maj(a,b,c) - ldr x19,[x30],#8 // *K++, x28 in next round - add x3,x3,x9 - add x20,x20,x17 // h+=Sigma0(a) - add x3,x3,x8 -Loop_16_xx: - ldr x8,[sp,#8] - str x11,[sp,#0] - ror x16,x24,#14 - add x27,x27,x19 // h+=K[i] - ror x10,x5,#1 - and x17,x25,x24 - ror x9,x2,#19 - bic x19,x26,x24 - ror x11,x20,#28 - add x27,x27,x3 // h+=X[i] - eor x16,x16,x24,ror#18 - eor x10,x10,x5,ror#8 - orr x17,x17,x19 // Ch(e,f,g) - eor x19,x20,x21 // a^b, b^c in next round - eor x16,x16,x24,ror#41 // Sigma1(e) - eor x11,x11,x20,ror#34 - add x27,x27,x17 // h+=Ch(e,f,g) - and x28,x28,x19 // (b^c)&=(a^b) - eor x9,x9,x2,ror#61 - eor x10,x10,x5,lsr#7 // sigma0(X[i+1]) - add x27,x27,x16 // h+=Sigma1(e) - eor x28,x28,x21 // Maj(a,b,c) - eor x17,x11,x20,ror#39 // Sigma0(a) - eor x9,x9,x2,lsr#6 // sigma1(X[i+14]) - add x4,x4,x13 - add x23,x23,x27 // d+=h - add x27,x27,x28 // h+=Maj(a,b,c) - ldr x28,[x30],#8 // *K++, x19 in next round - add x4,x4,x10 - add x27,x27,x17 // h+=Sigma0(a) - add x4,x4,x9 - ldr x9,[sp,#16] - str x12,[sp,#8] - ror x16,x23,#14 - add x26,x26,x28 // h+=K[i] - ror x11,x6,#1 - and x17,x24,x23 - ror x10,x3,#19 - bic x28,x25,x23 - ror x12,x27,#28 - add x26,x26,x4 // h+=X[i] - eor x16,x16,x23,ror#18 - eor x11,x11,x6,ror#8 - orr x17,x17,x28 // Ch(e,f,g) - eor x28,x27,x20 // a^b, b^c in next round - eor x16,x16,x23,ror#41 // Sigma1(e) - eor x12,x12,x27,ror#34 - add x26,x26,x17 // h+=Ch(e,f,g) - and x19,x19,x28 // (b^c)&=(a^b) - eor x10,x10,x3,ror#61 - eor x11,x11,x6,lsr#7 // sigma0(X[i+1]) - add x26,x26,x16 // h+=Sigma1(e) - eor x19,x19,x20 // Maj(a,b,c) - eor x17,x12,x27,ror#39 // Sigma0(a) - eor x10,x10,x3,lsr#6 // sigma1(X[i+14]) - add x5,x5,x14 - add x22,x22,x26 // d+=h - add x26,x26,x19 // h+=Maj(a,b,c) - ldr x19,[x30],#8 // *K++, x28 in next round - add x5,x5,x11 - add x26,x26,x17 // h+=Sigma0(a) - add x5,x5,x10 - ldr x10,[sp,#24] - str x13,[sp,#16] - ror x16,x22,#14 - add x25,x25,x19 // h+=K[i] - ror x12,x7,#1 - and x17,x23,x22 - ror x11,x4,#19 - bic x19,x24,x22 - ror x13,x26,#28 - add x25,x25,x5 // h+=X[i] - eor x16,x16,x22,ror#18 - eor x12,x12,x7,ror#8 - orr x17,x17,x19 // Ch(e,f,g) - eor x19,x26,x27 // a^b, b^c in next round - eor x16,x16,x22,ror#41 // Sigma1(e) - eor x13,x13,x26,ror#34 - add x25,x25,x17 // h+=Ch(e,f,g) - and x28,x28,x19 // (b^c)&=(a^b) - eor x11,x11,x4,ror#61 - eor x12,x12,x7,lsr#7 // sigma0(X[i+1]) - add x25,x25,x16 // h+=Sigma1(e) - eor x28,x28,x27 // Maj(a,b,c) - eor x17,x13,x26,ror#39 // Sigma0(a) - eor x11,x11,x4,lsr#6 // sigma1(X[i+14]) - add x6,x6,x15 - add x21,x21,x25 // d+=h - add x25,x25,x28 // h+=Maj(a,b,c) - ldr x28,[x30],#8 // *K++, x19 in next round - add x6,x6,x12 - add x25,x25,x17 // h+=Sigma0(a) - add x6,x6,x11 - ldr x11,[sp,#0] - str x14,[sp,#24] - ror x16,x21,#14 - add x24,x24,x28 // h+=K[i] - ror x13,x8,#1 - and x17,x22,x21 - ror x12,x5,#19 - bic x28,x23,x21 - ror x14,x25,#28 - add x24,x24,x6 // h+=X[i] - eor x16,x16,x21,ror#18 - eor x13,x13,x8,ror#8 - orr x17,x17,x28 // Ch(e,f,g) - eor x28,x25,x26 // a^b, b^c in next round - eor x16,x16,x21,ror#41 // Sigma1(e) - eor x14,x14,x25,ror#34 - add x24,x24,x17 // h+=Ch(e,f,g) - and x19,x19,x28 // (b^c)&=(a^b) - eor x12,x12,x5,ror#61 - eor x13,x13,x8,lsr#7 // sigma0(X[i+1]) - add x24,x24,x16 // h+=Sigma1(e) - eor x19,x19,x26 // Maj(a,b,c) - eor x17,x14,x25,ror#39 // Sigma0(a) - eor x12,x12,x5,lsr#6 // sigma1(X[i+14]) - add x7,x7,x0 - add x20,x20,x24 // d+=h - add x24,x24,x19 // h+=Maj(a,b,c) - ldr x19,[x30],#8 // *K++, x28 in next round - add x7,x7,x13 - add x24,x24,x17 // h+=Sigma0(a) - add x7,x7,x12 - ldr x12,[sp,#8] - str x15,[sp,#0] - ror x16,x20,#14 - add x23,x23,x19 // h+=K[i] - ror x14,x9,#1 - and x17,x21,x20 - ror x13,x6,#19 - bic x19,x22,x20 - ror x15,x24,#28 - add x23,x23,x7 // h+=X[i] - eor x16,x16,x20,ror#18 - eor x14,x14,x9,ror#8 - orr x17,x17,x19 // Ch(e,f,g) - eor x19,x24,x25 // a^b, b^c in next round - eor x16,x16,x20,ror#41 // Sigma1(e) - eor x15,x15,x24,ror#34 - add x23,x23,x17 // h+=Ch(e,f,g) - and x28,x28,x19 // (b^c)&=(a^b) - eor x13,x13,x6,ror#61 - eor x14,x14,x9,lsr#7 // sigma0(X[i+1]) - add x23,x23,x16 // h+=Sigma1(e) - eor x28,x28,x25 // Maj(a,b,c) - eor x17,x15,x24,ror#39 // Sigma0(a) - eor x13,x13,x6,lsr#6 // sigma1(X[i+14]) - add x8,x8,x1 - add x27,x27,x23 // d+=h - add x23,x23,x28 // h+=Maj(a,b,c) - ldr x28,[x30],#8 // *K++, x19 in next round - add x8,x8,x14 - add x23,x23,x17 // h+=Sigma0(a) - add x8,x8,x13 - ldr x13,[sp,#16] - str x0,[sp,#8] - ror x16,x27,#14 - add x22,x22,x28 // h+=K[i] - ror x15,x10,#1 - and x17,x20,x27 - ror x14,x7,#19 - bic x28,x21,x27 - ror x0,x23,#28 - add x22,x22,x8 // h+=X[i] - eor x16,x16,x27,ror#18 - eor x15,x15,x10,ror#8 - orr x17,x17,x28 // Ch(e,f,g) - eor x28,x23,x24 // a^b, b^c in next round - eor x16,x16,x27,ror#41 // Sigma1(e) - eor x0,x0,x23,ror#34 - add x22,x22,x17 // h+=Ch(e,f,g) - and x19,x19,x28 // (b^c)&=(a^b) - eor x14,x14,x7,ror#61 - eor x15,x15,x10,lsr#7 // sigma0(X[i+1]) - add x22,x22,x16 // h+=Sigma1(e) - eor x19,x19,x24 // Maj(a,b,c) - eor x17,x0,x23,ror#39 // Sigma0(a) - eor x14,x14,x7,lsr#6 // sigma1(X[i+14]) - add x9,x9,x2 - add x26,x26,x22 // d+=h - add x22,x22,x19 // h+=Maj(a,b,c) - ldr x19,[x30],#8 // *K++, x28 in next round - add x9,x9,x15 - add x22,x22,x17 // h+=Sigma0(a) - add x9,x9,x14 - ldr x14,[sp,#24] - str x1,[sp,#16] - ror x16,x26,#14 - add x21,x21,x19 // h+=K[i] - ror x0,x11,#1 - and x17,x27,x26 - ror x15,x8,#19 - bic x19,x20,x26 - ror x1,x22,#28 - add x21,x21,x9 // h+=X[i] - eor x16,x16,x26,ror#18 - eor x0,x0,x11,ror#8 - orr x17,x17,x19 // Ch(e,f,g) - eor x19,x22,x23 // a^b, b^c in next round - eor x16,x16,x26,ror#41 // Sigma1(e) - eor x1,x1,x22,ror#34 - add x21,x21,x17 // h+=Ch(e,f,g) - and x28,x28,x19 // (b^c)&=(a^b) - eor x15,x15,x8,ror#61 - eor x0,x0,x11,lsr#7 // sigma0(X[i+1]) - add x21,x21,x16 // h+=Sigma1(e) - eor x28,x28,x23 // Maj(a,b,c) - eor x17,x1,x22,ror#39 // Sigma0(a) - eor x15,x15,x8,lsr#6 // sigma1(X[i+14]) - add x10,x10,x3 - add x25,x25,x21 // d+=h - add x21,x21,x28 // h+=Maj(a,b,c) - ldr x28,[x30],#8 // *K++, x19 in next round - add x10,x10,x0 - add x21,x21,x17 // h+=Sigma0(a) - add x10,x10,x15 - ldr x15,[sp,#0] - str x2,[sp,#24] - ror x16,x25,#14 - add x20,x20,x28 // h+=K[i] - ror x1,x12,#1 - and x17,x26,x25 - ror x0,x9,#19 - bic x28,x27,x25 - ror x2,x21,#28 - add x20,x20,x10 // h+=X[i] - eor x16,x16,x25,ror#18 - eor x1,x1,x12,ror#8 - orr x17,x17,x28 // Ch(e,f,g) - eor x28,x21,x22 // a^b, b^c in next round - eor x16,x16,x25,ror#41 // Sigma1(e) - eor x2,x2,x21,ror#34 - add x20,x20,x17 // h+=Ch(e,f,g) - and x19,x19,x28 // (b^c)&=(a^b) - eor x0,x0,x9,ror#61 - eor x1,x1,x12,lsr#7 // sigma0(X[i+1]) - add x20,x20,x16 // h+=Sigma1(e) - eor x19,x19,x22 // Maj(a,b,c) - eor x17,x2,x21,ror#39 // Sigma0(a) - eor x0,x0,x9,lsr#6 // sigma1(X[i+14]) - add x11,x11,x4 - add x24,x24,x20 // d+=h - add x20,x20,x19 // h+=Maj(a,b,c) - ldr x19,[x30],#8 // *K++, x28 in next round - add x11,x11,x1 - add x20,x20,x17 // h+=Sigma0(a) - add x11,x11,x0 - ldr x0,[sp,#8] - str x3,[sp,#0] - ror x16,x24,#14 - add x27,x27,x19 // h+=K[i] - ror x2,x13,#1 - and x17,x25,x24 - ror x1,x10,#19 - bic x19,x26,x24 - ror x3,x20,#28 - add x27,x27,x11 // h+=X[i] - eor x16,x16,x24,ror#18 - eor x2,x2,x13,ror#8 - orr x17,x17,x19 // Ch(e,f,g) - eor x19,x20,x21 // a^b, b^c in next round - eor x16,x16,x24,ror#41 // Sigma1(e) - eor x3,x3,x20,ror#34 - add x27,x27,x17 // h+=Ch(e,f,g) - and x28,x28,x19 // (b^c)&=(a^b) - eor x1,x1,x10,ror#61 - eor x2,x2,x13,lsr#7 // sigma0(X[i+1]) - add x27,x27,x16 // h+=Sigma1(e) - eor x28,x28,x21 // Maj(a,b,c) - eor x17,x3,x20,ror#39 // Sigma0(a) - eor x1,x1,x10,lsr#6 // sigma1(X[i+14]) - add x12,x12,x5 - add x23,x23,x27 // d+=h - add x27,x27,x28 // h+=Maj(a,b,c) - ldr x28,[x30],#8 // *K++, x19 in next round - add x12,x12,x2 - add x27,x27,x17 // h+=Sigma0(a) - add x12,x12,x1 - ldr x1,[sp,#16] - str x4,[sp,#8] - ror x16,x23,#14 - add x26,x26,x28 // h+=K[i] - ror x3,x14,#1 - and x17,x24,x23 - ror x2,x11,#19 - bic x28,x25,x23 - ror x4,x27,#28 - add x26,x26,x12 // h+=X[i] - eor x16,x16,x23,ror#18 - eor x3,x3,x14,ror#8 - orr x17,x17,x28 // Ch(e,f,g) - eor x28,x27,x20 // a^b, b^c in next round - eor x16,x16,x23,ror#41 // Sigma1(e) - eor x4,x4,x27,ror#34 - add x26,x26,x17 // h+=Ch(e,f,g) - and x19,x19,x28 // (b^c)&=(a^b) - eor x2,x2,x11,ror#61 - eor x3,x3,x14,lsr#7 // sigma0(X[i+1]) - add x26,x26,x16 // h+=Sigma1(e) - eor x19,x19,x20 // Maj(a,b,c) - eor x17,x4,x27,ror#39 // Sigma0(a) - eor x2,x2,x11,lsr#6 // sigma1(X[i+14]) - add x13,x13,x6 - add x22,x22,x26 // d+=h - add x26,x26,x19 // h+=Maj(a,b,c) - ldr x19,[x30],#8 // *K++, x28 in next round - add x13,x13,x3 - add x26,x26,x17 // h+=Sigma0(a) - add x13,x13,x2 - ldr x2,[sp,#24] - str x5,[sp,#16] - ror x16,x22,#14 - add x25,x25,x19 // h+=K[i] - ror x4,x15,#1 - and x17,x23,x22 - ror x3,x12,#19 - bic x19,x24,x22 - ror x5,x26,#28 - add x25,x25,x13 // h+=X[i] - eor x16,x16,x22,ror#18 - eor x4,x4,x15,ror#8 - orr x17,x17,x19 // Ch(e,f,g) - eor x19,x26,x27 // a^b, b^c in next round - eor x16,x16,x22,ror#41 // Sigma1(e) - eor x5,x5,x26,ror#34 - add x25,x25,x17 // h+=Ch(e,f,g) - and x28,x28,x19 // (b^c)&=(a^b) - eor x3,x3,x12,ror#61 - eor x4,x4,x15,lsr#7 // sigma0(X[i+1]) - add x25,x25,x16 // h+=Sigma1(e) - eor x28,x28,x27 // Maj(a,b,c) - eor x17,x5,x26,ror#39 // Sigma0(a) - eor x3,x3,x12,lsr#6 // sigma1(X[i+14]) - add x14,x14,x7 - add x21,x21,x25 // d+=h - add x25,x25,x28 // h+=Maj(a,b,c) - ldr x28,[x30],#8 // *K++, x19 in next round - add x14,x14,x4 - add x25,x25,x17 // h+=Sigma0(a) - add x14,x14,x3 - ldr x3,[sp,#0] - str x6,[sp,#24] - ror x16,x21,#14 - add x24,x24,x28 // h+=K[i] - ror x5,x0,#1 - and x17,x22,x21 - ror x4,x13,#19 - bic x28,x23,x21 - ror x6,x25,#28 - add x24,x24,x14 // h+=X[i] - eor x16,x16,x21,ror#18 - eor x5,x5,x0,ror#8 - orr x17,x17,x28 // Ch(e,f,g) - eor x28,x25,x26 // a^b, b^c in next round - eor x16,x16,x21,ror#41 // Sigma1(e) - eor x6,x6,x25,ror#34 - add x24,x24,x17 // h+=Ch(e,f,g) - and x19,x19,x28 // (b^c)&=(a^b) - eor x4,x4,x13,ror#61 - eor x5,x5,x0,lsr#7 // sigma0(X[i+1]) - add x24,x24,x16 // h+=Sigma1(e) - eor x19,x19,x26 // Maj(a,b,c) - eor x17,x6,x25,ror#39 // Sigma0(a) - eor x4,x4,x13,lsr#6 // sigma1(X[i+14]) - add x15,x15,x8 - add x20,x20,x24 // d+=h - add x24,x24,x19 // h+=Maj(a,b,c) - ldr x19,[x30],#8 // *K++, x28 in next round - add x15,x15,x5 - add x24,x24,x17 // h+=Sigma0(a) - add x15,x15,x4 - ldr x4,[sp,#8] - str x7,[sp,#0] - ror x16,x20,#14 - add x23,x23,x19 // h+=K[i] - ror x6,x1,#1 - and x17,x21,x20 - ror x5,x14,#19 - bic x19,x22,x20 - ror x7,x24,#28 - add x23,x23,x15 // h+=X[i] - eor x16,x16,x20,ror#18 - eor x6,x6,x1,ror#8 - orr x17,x17,x19 // Ch(e,f,g) - eor x19,x24,x25 // a^b, b^c in next round - eor x16,x16,x20,ror#41 // Sigma1(e) - eor x7,x7,x24,ror#34 - add x23,x23,x17 // h+=Ch(e,f,g) - and x28,x28,x19 // (b^c)&=(a^b) - eor x5,x5,x14,ror#61 - eor x6,x6,x1,lsr#7 // sigma0(X[i+1]) - add x23,x23,x16 // h+=Sigma1(e) - eor x28,x28,x25 // Maj(a,b,c) - eor x17,x7,x24,ror#39 // Sigma0(a) - eor x5,x5,x14,lsr#6 // sigma1(X[i+14]) - add x0,x0,x9 - add x27,x27,x23 // d+=h - add x23,x23,x28 // h+=Maj(a,b,c) - ldr x28,[x30],#8 // *K++, x19 in next round - add x0,x0,x6 - add x23,x23,x17 // h+=Sigma0(a) - add x0,x0,x5 - ldr x5,[sp,#16] - str x8,[sp,#8] - ror x16,x27,#14 - add x22,x22,x28 // h+=K[i] - ror x7,x2,#1 - and x17,x20,x27 - ror x6,x15,#19 - bic x28,x21,x27 - ror x8,x23,#28 - add x22,x22,x0 // h+=X[i] - eor x16,x16,x27,ror#18 - eor x7,x7,x2,ror#8 - orr x17,x17,x28 // Ch(e,f,g) - eor x28,x23,x24 // a^b, b^c in next round - eor x16,x16,x27,ror#41 // Sigma1(e) - eor x8,x8,x23,ror#34 - add x22,x22,x17 // h+=Ch(e,f,g) - and x19,x19,x28 // (b^c)&=(a^b) - eor x6,x6,x15,ror#61 - eor x7,x7,x2,lsr#7 // sigma0(X[i+1]) - add x22,x22,x16 // h+=Sigma1(e) - eor x19,x19,x24 // Maj(a,b,c) - eor x17,x8,x23,ror#39 // Sigma0(a) - eor x6,x6,x15,lsr#6 // sigma1(X[i+14]) - add x1,x1,x10 - add x26,x26,x22 // d+=h - add x22,x22,x19 // h+=Maj(a,b,c) - ldr x19,[x30],#8 // *K++, x28 in next round - add x1,x1,x7 - add x22,x22,x17 // h+=Sigma0(a) - add x1,x1,x6 - ldr x6,[sp,#24] - str x9,[sp,#16] - ror x16,x26,#14 - add x21,x21,x19 // h+=K[i] - ror x8,x3,#1 - and x17,x27,x26 - ror x7,x0,#19 - bic x19,x20,x26 - ror x9,x22,#28 - add x21,x21,x1 // h+=X[i] - eor x16,x16,x26,ror#18 - eor x8,x8,x3,ror#8 - orr x17,x17,x19 // Ch(e,f,g) - eor x19,x22,x23 // a^b, b^c in next round - eor x16,x16,x26,ror#41 // Sigma1(e) - eor x9,x9,x22,ror#34 - add x21,x21,x17 // h+=Ch(e,f,g) - and x28,x28,x19 // (b^c)&=(a^b) - eor x7,x7,x0,ror#61 - eor x8,x8,x3,lsr#7 // sigma0(X[i+1]) - add x21,x21,x16 // h+=Sigma1(e) - eor x28,x28,x23 // Maj(a,b,c) - eor x17,x9,x22,ror#39 // Sigma0(a) - eor x7,x7,x0,lsr#6 // sigma1(X[i+14]) - add x2,x2,x11 - add x25,x25,x21 // d+=h - add x21,x21,x28 // h+=Maj(a,b,c) - ldr x28,[x30],#8 // *K++, x19 in next round - add x2,x2,x8 - add x21,x21,x17 // h+=Sigma0(a) - add x2,x2,x7 - ldr x7,[sp,#0] - str x10,[sp,#24] - ror x16,x25,#14 - add x20,x20,x28 // h+=K[i] - ror x9,x4,#1 - and x17,x26,x25 - ror x8,x1,#19 - bic x28,x27,x25 - ror x10,x21,#28 - add x20,x20,x2 // h+=X[i] - eor x16,x16,x25,ror#18 - eor x9,x9,x4,ror#8 - orr x17,x17,x28 // Ch(e,f,g) - eor x28,x21,x22 // a^b, b^c in next round - eor x16,x16,x25,ror#41 // Sigma1(e) - eor x10,x10,x21,ror#34 - add x20,x20,x17 // h+=Ch(e,f,g) - and x19,x19,x28 // (b^c)&=(a^b) - eor x8,x8,x1,ror#61 - eor x9,x9,x4,lsr#7 // sigma0(X[i+1]) - add x20,x20,x16 // h+=Sigma1(e) - eor x19,x19,x22 // Maj(a,b,c) - eor x17,x10,x21,ror#39 // Sigma0(a) - eor x8,x8,x1,lsr#6 // sigma1(X[i+14]) - add x3,x3,x12 - add x24,x24,x20 // d+=h - add x20,x20,x19 // h+=Maj(a,b,c) - ldr x19,[x30],#8 // *K++, x28 in next round - add x3,x3,x9 - add x20,x20,x17 // h+=Sigma0(a) - add x3,x3,x8 - cbnz x19,Loop_16_xx - - ldp x0,x2,[x29,#96] - ldr x1,[x29,#112] - sub x30,x30,#648 // rewind - - ldp x3,x4,[x0] - ldp x5,x6,[x0,#2*8] - add x1,x1,#14*8 // advance input pointer - ldp x7,x8,[x0,#4*8] - add x20,x20,x3 - ldp x9,x10,[x0,#6*8] - add x21,x21,x4 - add x22,x22,x5 - add x23,x23,x6 - stp x20,x21,[x0] - add x24,x24,x7 - add x25,x25,x8 - stp x22,x23,[x0,#2*8] - add x26,x26,x9 - add x27,x27,x10 - cmp x1,x2 - stp x24,x25,[x0,#4*8] - stp x26,x27,[x0,#6*8] - b.ne Loop - - ldp x19,x20,[x29,#16] - add sp,sp,#4*8 - ldp x21,x22,[x29,#32] - ldp x23,x24,[x29,#48] - ldp x25,x26,[x29,#64] - ldp x27,x28,[x29,#80] - ldp x29,x30,[sp],#128 - AARCH64_VALIDATE_LINK_REGISTER - ret - - -.section __TEXT,__const -.align 6 - -LK512: -.quad 0x428a2f98d728ae22,0x7137449123ef65cd -.quad 0xb5c0fbcfec4d3b2f,0xe9b5dba58189dbbc -.quad 0x3956c25bf348b538,0x59f111f1b605d019 -.quad 0x923f82a4af194f9b,0xab1c5ed5da6d8118 -.quad 0xd807aa98a3030242,0x12835b0145706fbe -.quad 0x243185be4ee4b28c,0x550c7dc3d5ffb4e2 -.quad 0x72be5d74f27b896f,0x80deb1fe3b1696b1 -.quad 0x9bdc06a725c71235,0xc19bf174cf692694 -.quad 0xe49b69c19ef14ad2,0xefbe4786384f25e3 -.quad 0x0fc19dc68b8cd5b5,0x240ca1cc77ac9c65 -.quad 0x2de92c6f592b0275,0x4a7484aa6ea6e483 -.quad 0x5cb0a9dcbd41fbd4,0x76f988da831153b5 -.quad 0x983e5152ee66dfab,0xa831c66d2db43210 -.quad 0xb00327c898fb213f,0xbf597fc7beef0ee4 -.quad 0xc6e00bf33da88fc2,0xd5a79147930aa725 -.quad 0x06ca6351e003826f,0x142929670a0e6e70 -.quad 0x27b70a8546d22ffc,0x2e1b21385c26c926 -.quad 0x4d2c6dfc5ac42aed,0x53380d139d95b3df -.quad 0x650a73548baf63de,0x766a0abb3c77b2a8 -.quad 0x81c2c92e47edaee6,0x92722c851482353b -.quad 0xa2bfe8a14cf10364,0xa81a664bbc423001 -.quad 0xc24b8b70d0f89791,0xc76c51a30654be30 -.quad 0xd192e819d6ef5218,0xd69906245565a910 -.quad 0xf40e35855771202a,0x106aa07032bbd1b8 -.quad 0x19a4c116b8d2d0c8,0x1e376c085141ab53 -.quad 0x2748774cdf8eeb99,0x34b0bcb5e19b48a8 -.quad 0x391c0cb3c5c95a63,0x4ed8aa4ae3418acb -.quad 0x5b9cca4f7763e373,0x682e6ff3d6b2b8a3 -.quad 0x748f82ee5defb2fc,0x78a5636f43172f60 -.quad 0x84c87814a1f0ab72,0x8cc702081a6439ec -.quad 0x90befffa23631e28,0xa4506cebde82bde9 -.quad 0xbef9a3f7b2c67915,0xc67178f2e372532b -.quad 0xca273eceea26619c,0xd186b8c721c0c207 -.quad 0xeada7dd6cde0eb1e,0xf57d4f7fee6ed178 -.quad 0x06f067aa72176fba,0x0a637dc5a2c898a6 -.quad 0x113f9804bef90dae,0x1b710b35131c471b -.quad 0x28db77f523047d84,0x32caab7b40c72493 -.quad 0x3c9ebe0a15c9bebc,0x431d67c49c100d4c -.quad 0x4cc5d4becb3e42b6,0x597f299cfc657e2a -.quad 0x5fcb6fab3ad6faec,0x6c44198c4a475817 -.quad 0 // terminator - -.byte 83,72,65,53,49,50,32,98,108,111,99,107,32,116,114,97,110,115,102,111,114,109,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 -.align 2 -.align 2 -#endif // !OPENSSL_NO_ASM diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/sha512-armv8-linux64.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/sha512-armv8-linux64.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/sha512-armv8-linux64.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/sha512-armv8-linux64.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,1081 +0,0 @@ -// This file is generated from a similarly-named Perl script in the BoringSSL -// source tree. Do not edit by hand. - -#if !defined(__has_feature) -#define __has_feature(x) 0 -#endif -#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) -#define OPENSSL_NO_ASM -#endif - -#if !defined(OPENSSL_NO_ASM) -#if defined(__aarch64__) -// Copyright 2014-2016 The OpenSSL Project Authors. All Rights Reserved. -// -// Licensed under the OpenSSL license (the "License"). You may not use -// this file except in compliance with the License. You can obtain a copy -// in the file LICENSE in the source distribution or at -// https://www.openssl.org/source/license.html - -// ==================================================================== -// Written by Andy Polyakov for the OpenSSL -// project. The module is, however, dual licensed under OpenSSL and -// CRYPTOGAMS licenses depending on where you obtain it. For further -// details see http://www.openssl.org/~appro/cryptogams/. -// -// Permission to use under GPLv2 terms is granted. -// ==================================================================== -// -// SHA256/512 for ARMv8. -// -// Performance in cycles per processed byte and improvement coefficient -// over code generated with "default" compiler: -// -// SHA256-hw SHA256(*) SHA512 -// Apple A7 1.97 10.5 (+33%) 6.73 (-1%(**)) -// Cortex-A53 2.38 15.5 (+115%) 10.0 (+150%(***)) -// Cortex-A57 2.31 11.6 (+86%) 7.51 (+260%(***)) -// Denver 2.01 10.5 (+26%) 6.70 (+8%) -// X-Gene 20.0 (+100%) 12.8 (+300%(***)) -// Mongoose 2.36 13.0 (+50%) 8.36 (+33%) -// -// (*) Software SHA256 results are of lesser relevance, presented -// mostly for informational purposes. -// (**) The result is a trade-off: it's possible to improve it by -// 10% (or by 1 cycle per round), but at the cost of 20% loss -// on Cortex-A53 (or by 4 cycles per round). -// (***) Super-impressive coefficients over gcc-generated code are -// indication of some compiler "pathology", most notably code -// generated with -mgeneral-regs-only is significanty faster -// and the gap is only 40-90%. - -#ifndef __KERNEL__ -# include -#endif - -.text - - -.hidden GFp_armcap_P -.globl GFp_sha512_block_data_order -.hidden GFp_sha512_block_data_order -.type GFp_sha512_block_data_order,%function -.align 6 -GFp_sha512_block_data_order: - AARCH64_SIGN_LINK_REGISTER - stp x29,x30,[sp,#-128]! - add x29,sp,#0 - - stp x19,x20,[sp,#16] - stp x21,x22,[sp,#32] - stp x23,x24,[sp,#48] - stp x25,x26,[sp,#64] - stp x27,x28,[sp,#80] - sub sp,sp,#4*8 - - ldp x20,x21,[x0] // load context - ldp x22,x23,[x0,#2*8] - ldp x24,x25,[x0,#4*8] - add x2,x1,x2,lsl#7 // end of input - ldp x26,x27,[x0,#6*8] - adrp x30,.LK512 - add x30,x30,:lo12:.LK512 - stp x0,x2,[x29,#96] - -.Loop: - ldp x3,x4,[x1],#2*8 - ldr x19,[x30],#8 // *K++ - eor x28,x21,x22 // magic seed - str x1,[x29,#112] -#ifndef __ARMEB__ - rev x3,x3 // 0 -#endif - ror x16,x24,#14 - add x27,x27,x19 // h+=K[i] - eor x6,x24,x24,ror#23 - and x17,x25,x24 - bic x19,x26,x24 - add x27,x27,x3 // h+=X[i] - orr x17,x17,x19 // Ch(e,f,g) - eor x19,x20,x21 // a^b, b^c in next round - eor x16,x16,x6,ror#18 // Sigma1(e) - ror x6,x20,#28 - add x27,x27,x17 // h+=Ch(e,f,g) - eor x17,x20,x20,ror#5 - add x27,x27,x16 // h+=Sigma1(e) - and x28,x28,x19 // (b^c)&=(a^b) - add x23,x23,x27 // d+=h - eor x28,x28,x21 // Maj(a,b,c) - eor x17,x6,x17,ror#34 // Sigma0(a) - add x27,x27,x28 // h+=Maj(a,b,c) - ldr x28,[x30],#8 // *K++, x19 in next round - //add x27,x27,x17 // h+=Sigma0(a) -#ifndef __ARMEB__ - rev x4,x4 // 1 -#endif - ldp x5,x6,[x1],#2*8 - add x27,x27,x17 // h+=Sigma0(a) - ror x16,x23,#14 - add x26,x26,x28 // h+=K[i] - eor x7,x23,x23,ror#23 - and x17,x24,x23 - bic x28,x25,x23 - add x26,x26,x4 // h+=X[i] - orr x17,x17,x28 // Ch(e,f,g) - eor x28,x27,x20 // a^b, b^c in next round - eor x16,x16,x7,ror#18 // Sigma1(e) - ror x7,x27,#28 - add x26,x26,x17 // h+=Ch(e,f,g) - eor x17,x27,x27,ror#5 - add x26,x26,x16 // h+=Sigma1(e) - and x19,x19,x28 // (b^c)&=(a^b) - add x22,x22,x26 // d+=h - eor x19,x19,x20 // Maj(a,b,c) - eor x17,x7,x17,ror#34 // Sigma0(a) - add x26,x26,x19 // h+=Maj(a,b,c) - ldr x19,[x30],#8 // *K++, x28 in next round - //add x26,x26,x17 // h+=Sigma0(a) -#ifndef __ARMEB__ - rev x5,x5 // 2 -#endif - add x26,x26,x17 // h+=Sigma0(a) - ror x16,x22,#14 - add x25,x25,x19 // h+=K[i] - eor x8,x22,x22,ror#23 - and x17,x23,x22 - bic x19,x24,x22 - add x25,x25,x5 // h+=X[i] - orr x17,x17,x19 // Ch(e,f,g) - eor x19,x26,x27 // a^b, b^c in next round - eor x16,x16,x8,ror#18 // Sigma1(e) - ror x8,x26,#28 - add x25,x25,x17 // h+=Ch(e,f,g) - eor x17,x26,x26,ror#5 - add x25,x25,x16 // h+=Sigma1(e) - and x28,x28,x19 // (b^c)&=(a^b) - add x21,x21,x25 // d+=h - eor x28,x28,x27 // Maj(a,b,c) - eor x17,x8,x17,ror#34 // Sigma0(a) - add x25,x25,x28 // h+=Maj(a,b,c) - ldr x28,[x30],#8 // *K++, x19 in next round - //add x25,x25,x17 // h+=Sigma0(a) -#ifndef __ARMEB__ - rev x6,x6 // 3 -#endif - ldp x7,x8,[x1],#2*8 - add x25,x25,x17 // h+=Sigma0(a) - ror x16,x21,#14 - add x24,x24,x28 // h+=K[i] - eor x9,x21,x21,ror#23 - and x17,x22,x21 - bic x28,x23,x21 - add x24,x24,x6 // h+=X[i] - orr x17,x17,x28 // Ch(e,f,g) - eor x28,x25,x26 // a^b, b^c in next round - eor x16,x16,x9,ror#18 // Sigma1(e) - ror x9,x25,#28 - add x24,x24,x17 // h+=Ch(e,f,g) - eor x17,x25,x25,ror#5 - add x24,x24,x16 // h+=Sigma1(e) - and x19,x19,x28 // (b^c)&=(a^b) - add x20,x20,x24 // d+=h - eor x19,x19,x26 // Maj(a,b,c) - eor x17,x9,x17,ror#34 // Sigma0(a) - add x24,x24,x19 // h+=Maj(a,b,c) - ldr x19,[x30],#8 // *K++, x28 in next round - //add x24,x24,x17 // h+=Sigma0(a) -#ifndef __ARMEB__ - rev x7,x7 // 4 -#endif - add x24,x24,x17 // h+=Sigma0(a) - ror x16,x20,#14 - add x23,x23,x19 // h+=K[i] - eor x10,x20,x20,ror#23 - and x17,x21,x20 - bic x19,x22,x20 - add x23,x23,x7 // h+=X[i] - orr x17,x17,x19 // Ch(e,f,g) - eor x19,x24,x25 // a^b, b^c in next round - eor x16,x16,x10,ror#18 // Sigma1(e) - ror x10,x24,#28 - add x23,x23,x17 // h+=Ch(e,f,g) - eor x17,x24,x24,ror#5 - add x23,x23,x16 // h+=Sigma1(e) - and x28,x28,x19 // (b^c)&=(a^b) - add x27,x27,x23 // d+=h - eor x28,x28,x25 // Maj(a,b,c) - eor x17,x10,x17,ror#34 // Sigma0(a) - add x23,x23,x28 // h+=Maj(a,b,c) - ldr x28,[x30],#8 // *K++, x19 in next round - //add x23,x23,x17 // h+=Sigma0(a) -#ifndef __ARMEB__ - rev x8,x8 // 5 -#endif - ldp x9,x10,[x1],#2*8 - add x23,x23,x17 // h+=Sigma0(a) - ror x16,x27,#14 - add x22,x22,x28 // h+=K[i] - eor x11,x27,x27,ror#23 - and x17,x20,x27 - bic x28,x21,x27 - add x22,x22,x8 // h+=X[i] - orr x17,x17,x28 // Ch(e,f,g) - eor x28,x23,x24 // a^b, b^c in next round - eor x16,x16,x11,ror#18 // Sigma1(e) - ror x11,x23,#28 - add x22,x22,x17 // h+=Ch(e,f,g) - eor x17,x23,x23,ror#5 - add x22,x22,x16 // h+=Sigma1(e) - and x19,x19,x28 // (b^c)&=(a^b) - add x26,x26,x22 // d+=h - eor x19,x19,x24 // Maj(a,b,c) - eor x17,x11,x17,ror#34 // Sigma0(a) - add x22,x22,x19 // h+=Maj(a,b,c) - ldr x19,[x30],#8 // *K++, x28 in next round - //add x22,x22,x17 // h+=Sigma0(a) -#ifndef __ARMEB__ - rev x9,x9 // 6 -#endif - add x22,x22,x17 // h+=Sigma0(a) - ror x16,x26,#14 - add x21,x21,x19 // h+=K[i] - eor x12,x26,x26,ror#23 - and x17,x27,x26 - bic x19,x20,x26 - add x21,x21,x9 // h+=X[i] - orr x17,x17,x19 // Ch(e,f,g) - eor x19,x22,x23 // a^b, b^c in next round - eor x16,x16,x12,ror#18 // Sigma1(e) - ror x12,x22,#28 - add x21,x21,x17 // h+=Ch(e,f,g) - eor x17,x22,x22,ror#5 - add x21,x21,x16 // h+=Sigma1(e) - and x28,x28,x19 // (b^c)&=(a^b) - add x25,x25,x21 // d+=h - eor x28,x28,x23 // Maj(a,b,c) - eor x17,x12,x17,ror#34 // Sigma0(a) - add x21,x21,x28 // h+=Maj(a,b,c) - ldr x28,[x30],#8 // *K++, x19 in next round - //add x21,x21,x17 // h+=Sigma0(a) -#ifndef __ARMEB__ - rev x10,x10 // 7 -#endif - ldp x11,x12,[x1],#2*8 - add x21,x21,x17 // h+=Sigma0(a) - ror x16,x25,#14 - add x20,x20,x28 // h+=K[i] - eor x13,x25,x25,ror#23 - and x17,x26,x25 - bic x28,x27,x25 - add x20,x20,x10 // h+=X[i] - orr x17,x17,x28 // Ch(e,f,g) - eor x28,x21,x22 // a^b, b^c in next round - eor x16,x16,x13,ror#18 // Sigma1(e) - ror x13,x21,#28 - add x20,x20,x17 // h+=Ch(e,f,g) - eor x17,x21,x21,ror#5 - add x20,x20,x16 // h+=Sigma1(e) - and x19,x19,x28 // (b^c)&=(a^b) - add x24,x24,x20 // d+=h - eor x19,x19,x22 // Maj(a,b,c) - eor x17,x13,x17,ror#34 // Sigma0(a) - add x20,x20,x19 // h+=Maj(a,b,c) - ldr x19,[x30],#8 // *K++, x28 in next round - //add x20,x20,x17 // h+=Sigma0(a) -#ifndef __ARMEB__ - rev x11,x11 // 8 -#endif - add x20,x20,x17 // h+=Sigma0(a) - ror x16,x24,#14 - add x27,x27,x19 // h+=K[i] - eor x14,x24,x24,ror#23 - and x17,x25,x24 - bic x19,x26,x24 - add x27,x27,x11 // h+=X[i] - orr x17,x17,x19 // Ch(e,f,g) - eor x19,x20,x21 // a^b, b^c in next round - eor x16,x16,x14,ror#18 // Sigma1(e) - ror x14,x20,#28 - add x27,x27,x17 // h+=Ch(e,f,g) - eor x17,x20,x20,ror#5 - add x27,x27,x16 // h+=Sigma1(e) - and x28,x28,x19 // (b^c)&=(a^b) - add x23,x23,x27 // d+=h - eor x28,x28,x21 // Maj(a,b,c) - eor x17,x14,x17,ror#34 // Sigma0(a) - add x27,x27,x28 // h+=Maj(a,b,c) - ldr x28,[x30],#8 // *K++, x19 in next round - //add x27,x27,x17 // h+=Sigma0(a) -#ifndef __ARMEB__ - rev x12,x12 // 9 -#endif - ldp x13,x14,[x1],#2*8 - add x27,x27,x17 // h+=Sigma0(a) - ror x16,x23,#14 - add x26,x26,x28 // h+=K[i] - eor x15,x23,x23,ror#23 - and x17,x24,x23 - bic x28,x25,x23 - add x26,x26,x12 // h+=X[i] - orr x17,x17,x28 // Ch(e,f,g) - eor x28,x27,x20 // a^b, b^c in next round - eor x16,x16,x15,ror#18 // Sigma1(e) - ror x15,x27,#28 - add x26,x26,x17 // h+=Ch(e,f,g) - eor x17,x27,x27,ror#5 - add x26,x26,x16 // h+=Sigma1(e) - and x19,x19,x28 // (b^c)&=(a^b) - add x22,x22,x26 // d+=h - eor x19,x19,x20 // Maj(a,b,c) - eor x17,x15,x17,ror#34 // Sigma0(a) - add x26,x26,x19 // h+=Maj(a,b,c) - ldr x19,[x30],#8 // *K++, x28 in next round - //add x26,x26,x17 // h+=Sigma0(a) -#ifndef __ARMEB__ - rev x13,x13 // 10 -#endif - add x26,x26,x17 // h+=Sigma0(a) - ror x16,x22,#14 - add x25,x25,x19 // h+=K[i] - eor x0,x22,x22,ror#23 - and x17,x23,x22 - bic x19,x24,x22 - add x25,x25,x13 // h+=X[i] - orr x17,x17,x19 // Ch(e,f,g) - eor x19,x26,x27 // a^b, b^c in next round - eor x16,x16,x0,ror#18 // Sigma1(e) - ror x0,x26,#28 - add x25,x25,x17 // h+=Ch(e,f,g) - eor x17,x26,x26,ror#5 - add x25,x25,x16 // h+=Sigma1(e) - and x28,x28,x19 // (b^c)&=(a^b) - add x21,x21,x25 // d+=h - eor x28,x28,x27 // Maj(a,b,c) - eor x17,x0,x17,ror#34 // Sigma0(a) - add x25,x25,x28 // h+=Maj(a,b,c) - ldr x28,[x30],#8 // *K++, x19 in next round - //add x25,x25,x17 // h+=Sigma0(a) -#ifndef __ARMEB__ - rev x14,x14 // 11 -#endif - ldp x15,x0,[x1],#2*8 - add x25,x25,x17 // h+=Sigma0(a) - str x6,[sp,#24] - ror x16,x21,#14 - add x24,x24,x28 // h+=K[i] - eor x6,x21,x21,ror#23 - and x17,x22,x21 - bic x28,x23,x21 - add x24,x24,x14 // h+=X[i] - orr x17,x17,x28 // Ch(e,f,g) - eor x28,x25,x26 // a^b, b^c in next round - eor x16,x16,x6,ror#18 // Sigma1(e) - ror x6,x25,#28 - add x24,x24,x17 // h+=Ch(e,f,g) - eor x17,x25,x25,ror#5 - add x24,x24,x16 // h+=Sigma1(e) - and x19,x19,x28 // (b^c)&=(a^b) - add x20,x20,x24 // d+=h - eor x19,x19,x26 // Maj(a,b,c) - eor x17,x6,x17,ror#34 // Sigma0(a) - add x24,x24,x19 // h+=Maj(a,b,c) - ldr x19,[x30],#8 // *K++, x28 in next round - //add x24,x24,x17 // h+=Sigma0(a) -#ifndef __ARMEB__ - rev x15,x15 // 12 -#endif - add x24,x24,x17 // h+=Sigma0(a) - str x7,[sp,#0] - ror x16,x20,#14 - add x23,x23,x19 // h+=K[i] - eor x7,x20,x20,ror#23 - and x17,x21,x20 - bic x19,x22,x20 - add x23,x23,x15 // h+=X[i] - orr x17,x17,x19 // Ch(e,f,g) - eor x19,x24,x25 // a^b, b^c in next round - eor x16,x16,x7,ror#18 // Sigma1(e) - ror x7,x24,#28 - add x23,x23,x17 // h+=Ch(e,f,g) - eor x17,x24,x24,ror#5 - add x23,x23,x16 // h+=Sigma1(e) - and x28,x28,x19 // (b^c)&=(a^b) - add x27,x27,x23 // d+=h - eor x28,x28,x25 // Maj(a,b,c) - eor x17,x7,x17,ror#34 // Sigma0(a) - add x23,x23,x28 // h+=Maj(a,b,c) - ldr x28,[x30],#8 // *K++, x19 in next round - //add x23,x23,x17 // h+=Sigma0(a) -#ifndef __ARMEB__ - rev x0,x0 // 13 -#endif - ldp x1,x2,[x1] - add x23,x23,x17 // h+=Sigma0(a) - str x8,[sp,#8] - ror x16,x27,#14 - add x22,x22,x28 // h+=K[i] - eor x8,x27,x27,ror#23 - and x17,x20,x27 - bic x28,x21,x27 - add x22,x22,x0 // h+=X[i] - orr x17,x17,x28 // Ch(e,f,g) - eor x28,x23,x24 // a^b, b^c in next round - eor x16,x16,x8,ror#18 // Sigma1(e) - ror x8,x23,#28 - add x22,x22,x17 // h+=Ch(e,f,g) - eor x17,x23,x23,ror#5 - add x22,x22,x16 // h+=Sigma1(e) - and x19,x19,x28 // (b^c)&=(a^b) - add x26,x26,x22 // d+=h - eor x19,x19,x24 // Maj(a,b,c) - eor x17,x8,x17,ror#34 // Sigma0(a) - add x22,x22,x19 // h+=Maj(a,b,c) - ldr x19,[x30],#8 // *K++, x28 in next round - //add x22,x22,x17 // h+=Sigma0(a) -#ifndef __ARMEB__ - rev x1,x1 // 14 -#endif - ldr x6,[sp,#24] - add x22,x22,x17 // h+=Sigma0(a) - str x9,[sp,#16] - ror x16,x26,#14 - add x21,x21,x19 // h+=K[i] - eor x9,x26,x26,ror#23 - and x17,x27,x26 - bic x19,x20,x26 - add x21,x21,x1 // h+=X[i] - orr x17,x17,x19 // Ch(e,f,g) - eor x19,x22,x23 // a^b, b^c in next round - eor x16,x16,x9,ror#18 // Sigma1(e) - ror x9,x22,#28 - add x21,x21,x17 // h+=Ch(e,f,g) - eor x17,x22,x22,ror#5 - add x21,x21,x16 // h+=Sigma1(e) - and x28,x28,x19 // (b^c)&=(a^b) - add x25,x25,x21 // d+=h - eor x28,x28,x23 // Maj(a,b,c) - eor x17,x9,x17,ror#34 // Sigma0(a) - add x21,x21,x28 // h+=Maj(a,b,c) - ldr x28,[x30],#8 // *K++, x19 in next round - //add x21,x21,x17 // h+=Sigma0(a) -#ifndef __ARMEB__ - rev x2,x2 // 15 -#endif - ldr x7,[sp,#0] - add x21,x21,x17 // h+=Sigma0(a) - str x10,[sp,#24] - ror x16,x25,#14 - add x20,x20,x28 // h+=K[i] - ror x9,x4,#1 - and x17,x26,x25 - ror x8,x1,#19 - bic x28,x27,x25 - ror x10,x21,#28 - add x20,x20,x2 // h+=X[i] - eor x16,x16,x25,ror#18 - eor x9,x9,x4,ror#8 - orr x17,x17,x28 // Ch(e,f,g) - eor x28,x21,x22 // a^b, b^c in next round - eor x16,x16,x25,ror#41 // Sigma1(e) - eor x10,x10,x21,ror#34 - add x20,x20,x17 // h+=Ch(e,f,g) - and x19,x19,x28 // (b^c)&=(a^b) - eor x8,x8,x1,ror#61 - eor x9,x9,x4,lsr#7 // sigma0(X[i+1]) - add x20,x20,x16 // h+=Sigma1(e) - eor x19,x19,x22 // Maj(a,b,c) - eor x17,x10,x21,ror#39 // Sigma0(a) - eor x8,x8,x1,lsr#6 // sigma1(X[i+14]) - add x3,x3,x12 - add x24,x24,x20 // d+=h - add x20,x20,x19 // h+=Maj(a,b,c) - ldr x19,[x30],#8 // *K++, x28 in next round - add x3,x3,x9 - add x20,x20,x17 // h+=Sigma0(a) - add x3,x3,x8 -.Loop_16_xx: - ldr x8,[sp,#8] - str x11,[sp,#0] - ror x16,x24,#14 - add x27,x27,x19 // h+=K[i] - ror x10,x5,#1 - and x17,x25,x24 - ror x9,x2,#19 - bic x19,x26,x24 - ror x11,x20,#28 - add x27,x27,x3 // h+=X[i] - eor x16,x16,x24,ror#18 - eor x10,x10,x5,ror#8 - orr x17,x17,x19 // Ch(e,f,g) - eor x19,x20,x21 // a^b, b^c in next round - eor x16,x16,x24,ror#41 // Sigma1(e) - eor x11,x11,x20,ror#34 - add x27,x27,x17 // h+=Ch(e,f,g) - and x28,x28,x19 // (b^c)&=(a^b) - eor x9,x9,x2,ror#61 - eor x10,x10,x5,lsr#7 // sigma0(X[i+1]) - add x27,x27,x16 // h+=Sigma1(e) - eor x28,x28,x21 // Maj(a,b,c) - eor x17,x11,x20,ror#39 // Sigma0(a) - eor x9,x9,x2,lsr#6 // sigma1(X[i+14]) - add x4,x4,x13 - add x23,x23,x27 // d+=h - add x27,x27,x28 // h+=Maj(a,b,c) - ldr x28,[x30],#8 // *K++, x19 in next round - add x4,x4,x10 - add x27,x27,x17 // h+=Sigma0(a) - add x4,x4,x9 - ldr x9,[sp,#16] - str x12,[sp,#8] - ror x16,x23,#14 - add x26,x26,x28 // h+=K[i] - ror x11,x6,#1 - and x17,x24,x23 - ror x10,x3,#19 - bic x28,x25,x23 - ror x12,x27,#28 - add x26,x26,x4 // h+=X[i] - eor x16,x16,x23,ror#18 - eor x11,x11,x6,ror#8 - orr x17,x17,x28 // Ch(e,f,g) - eor x28,x27,x20 // a^b, b^c in next round - eor x16,x16,x23,ror#41 // Sigma1(e) - eor x12,x12,x27,ror#34 - add x26,x26,x17 // h+=Ch(e,f,g) - and x19,x19,x28 // (b^c)&=(a^b) - eor x10,x10,x3,ror#61 - eor x11,x11,x6,lsr#7 // sigma0(X[i+1]) - add x26,x26,x16 // h+=Sigma1(e) - eor x19,x19,x20 // Maj(a,b,c) - eor x17,x12,x27,ror#39 // Sigma0(a) - eor x10,x10,x3,lsr#6 // sigma1(X[i+14]) - add x5,x5,x14 - add x22,x22,x26 // d+=h - add x26,x26,x19 // h+=Maj(a,b,c) - ldr x19,[x30],#8 // *K++, x28 in next round - add x5,x5,x11 - add x26,x26,x17 // h+=Sigma0(a) - add x5,x5,x10 - ldr x10,[sp,#24] - str x13,[sp,#16] - ror x16,x22,#14 - add x25,x25,x19 // h+=K[i] - ror x12,x7,#1 - and x17,x23,x22 - ror x11,x4,#19 - bic x19,x24,x22 - ror x13,x26,#28 - add x25,x25,x5 // h+=X[i] - eor x16,x16,x22,ror#18 - eor x12,x12,x7,ror#8 - orr x17,x17,x19 // Ch(e,f,g) - eor x19,x26,x27 // a^b, b^c in next round - eor x16,x16,x22,ror#41 // Sigma1(e) - eor x13,x13,x26,ror#34 - add x25,x25,x17 // h+=Ch(e,f,g) - and x28,x28,x19 // (b^c)&=(a^b) - eor x11,x11,x4,ror#61 - eor x12,x12,x7,lsr#7 // sigma0(X[i+1]) - add x25,x25,x16 // h+=Sigma1(e) - eor x28,x28,x27 // Maj(a,b,c) - eor x17,x13,x26,ror#39 // Sigma0(a) - eor x11,x11,x4,lsr#6 // sigma1(X[i+14]) - add x6,x6,x15 - add x21,x21,x25 // d+=h - add x25,x25,x28 // h+=Maj(a,b,c) - ldr x28,[x30],#8 // *K++, x19 in next round - add x6,x6,x12 - add x25,x25,x17 // h+=Sigma0(a) - add x6,x6,x11 - ldr x11,[sp,#0] - str x14,[sp,#24] - ror x16,x21,#14 - add x24,x24,x28 // h+=K[i] - ror x13,x8,#1 - and x17,x22,x21 - ror x12,x5,#19 - bic x28,x23,x21 - ror x14,x25,#28 - add x24,x24,x6 // h+=X[i] - eor x16,x16,x21,ror#18 - eor x13,x13,x8,ror#8 - orr x17,x17,x28 // Ch(e,f,g) - eor x28,x25,x26 // a^b, b^c in next round - eor x16,x16,x21,ror#41 // Sigma1(e) - eor x14,x14,x25,ror#34 - add x24,x24,x17 // h+=Ch(e,f,g) - and x19,x19,x28 // (b^c)&=(a^b) - eor x12,x12,x5,ror#61 - eor x13,x13,x8,lsr#7 // sigma0(X[i+1]) - add x24,x24,x16 // h+=Sigma1(e) - eor x19,x19,x26 // Maj(a,b,c) - eor x17,x14,x25,ror#39 // Sigma0(a) - eor x12,x12,x5,lsr#6 // sigma1(X[i+14]) - add x7,x7,x0 - add x20,x20,x24 // d+=h - add x24,x24,x19 // h+=Maj(a,b,c) - ldr x19,[x30],#8 // *K++, x28 in next round - add x7,x7,x13 - add x24,x24,x17 // h+=Sigma0(a) - add x7,x7,x12 - ldr x12,[sp,#8] - str x15,[sp,#0] - ror x16,x20,#14 - add x23,x23,x19 // h+=K[i] - ror x14,x9,#1 - and x17,x21,x20 - ror x13,x6,#19 - bic x19,x22,x20 - ror x15,x24,#28 - add x23,x23,x7 // h+=X[i] - eor x16,x16,x20,ror#18 - eor x14,x14,x9,ror#8 - orr x17,x17,x19 // Ch(e,f,g) - eor x19,x24,x25 // a^b, b^c in next round - eor x16,x16,x20,ror#41 // Sigma1(e) - eor x15,x15,x24,ror#34 - add x23,x23,x17 // h+=Ch(e,f,g) - and x28,x28,x19 // (b^c)&=(a^b) - eor x13,x13,x6,ror#61 - eor x14,x14,x9,lsr#7 // sigma0(X[i+1]) - add x23,x23,x16 // h+=Sigma1(e) - eor x28,x28,x25 // Maj(a,b,c) - eor x17,x15,x24,ror#39 // Sigma0(a) - eor x13,x13,x6,lsr#6 // sigma1(X[i+14]) - add x8,x8,x1 - add x27,x27,x23 // d+=h - add x23,x23,x28 // h+=Maj(a,b,c) - ldr x28,[x30],#8 // *K++, x19 in next round - add x8,x8,x14 - add x23,x23,x17 // h+=Sigma0(a) - add x8,x8,x13 - ldr x13,[sp,#16] - str x0,[sp,#8] - ror x16,x27,#14 - add x22,x22,x28 // h+=K[i] - ror x15,x10,#1 - and x17,x20,x27 - ror x14,x7,#19 - bic x28,x21,x27 - ror x0,x23,#28 - add x22,x22,x8 // h+=X[i] - eor x16,x16,x27,ror#18 - eor x15,x15,x10,ror#8 - orr x17,x17,x28 // Ch(e,f,g) - eor x28,x23,x24 // a^b, b^c in next round - eor x16,x16,x27,ror#41 // Sigma1(e) - eor x0,x0,x23,ror#34 - add x22,x22,x17 // h+=Ch(e,f,g) - and x19,x19,x28 // (b^c)&=(a^b) - eor x14,x14,x7,ror#61 - eor x15,x15,x10,lsr#7 // sigma0(X[i+1]) - add x22,x22,x16 // h+=Sigma1(e) - eor x19,x19,x24 // Maj(a,b,c) - eor x17,x0,x23,ror#39 // Sigma0(a) - eor x14,x14,x7,lsr#6 // sigma1(X[i+14]) - add x9,x9,x2 - add x26,x26,x22 // d+=h - add x22,x22,x19 // h+=Maj(a,b,c) - ldr x19,[x30],#8 // *K++, x28 in next round - add x9,x9,x15 - add x22,x22,x17 // h+=Sigma0(a) - add x9,x9,x14 - ldr x14,[sp,#24] - str x1,[sp,#16] - ror x16,x26,#14 - add x21,x21,x19 // h+=K[i] - ror x0,x11,#1 - and x17,x27,x26 - ror x15,x8,#19 - bic x19,x20,x26 - ror x1,x22,#28 - add x21,x21,x9 // h+=X[i] - eor x16,x16,x26,ror#18 - eor x0,x0,x11,ror#8 - orr x17,x17,x19 // Ch(e,f,g) - eor x19,x22,x23 // a^b, b^c in next round - eor x16,x16,x26,ror#41 // Sigma1(e) - eor x1,x1,x22,ror#34 - add x21,x21,x17 // h+=Ch(e,f,g) - and x28,x28,x19 // (b^c)&=(a^b) - eor x15,x15,x8,ror#61 - eor x0,x0,x11,lsr#7 // sigma0(X[i+1]) - add x21,x21,x16 // h+=Sigma1(e) - eor x28,x28,x23 // Maj(a,b,c) - eor x17,x1,x22,ror#39 // Sigma0(a) - eor x15,x15,x8,lsr#6 // sigma1(X[i+14]) - add x10,x10,x3 - add x25,x25,x21 // d+=h - add x21,x21,x28 // h+=Maj(a,b,c) - ldr x28,[x30],#8 // *K++, x19 in next round - add x10,x10,x0 - add x21,x21,x17 // h+=Sigma0(a) - add x10,x10,x15 - ldr x15,[sp,#0] - str x2,[sp,#24] - ror x16,x25,#14 - add x20,x20,x28 // h+=K[i] - ror x1,x12,#1 - and x17,x26,x25 - ror x0,x9,#19 - bic x28,x27,x25 - ror x2,x21,#28 - add x20,x20,x10 // h+=X[i] - eor x16,x16,x25,ror#18 - eor x1,x1,x12,ror#8 - orr x17,x17,x28 // Ch(e,f,g) - eor x28,x21,x22 // a^b, b^c in next round - eor x16,x16,x25,ror#41 // Sigma1(e) - eor x2,x2,x21,ror#34 - add x20,x20,x17 // h+=Ch(e,f,g) - and x19,x19,x28 // (b^c)&=(a^b) - eor x0,x0,x9,ror#61 - eor x1,x1,x12,lsr#7 // sigma0(X[i+1]) - add x20,x20,x16 // h+=Sigma1(e) - eor x19,x19,x22 // Maj(a,b,c) - eor x17,x2,x21,ror#39 // Sigma0(a) - eor x0,x0,x9,lsr#6 // sigma1(X[i+14]) - add x11,x11,x4 - add x24,x24,x20 // d+=h - add x20,x20,x19 // h+=Maj(a,b,c) - ldr x19,[x30],#8 // *K++, x28 in next round - add x11,x11,x1 - add x20,x20,x17 // h+=Sigma0(a) - add x11,x11,x0 - ldr x0,[sp,#8] - str x3,[sp,#0] - ror x16,x24,#14 - add x27,x27,x19 // h+=K[i] - ror x2,x13,#1 - and x17,x25,x24 - ror x1,x10,#19 - bic x19,x26,x24 - ror x3,x20,#28 - add x27,x27,x11 // h+=X[i] - eor x16,x16,x24,ror#18 - eor x2,x2,x13,ror#8 - orr x17,x17,x19 // Ch(e,f,g) - eor x19,x20,x21 // a^b, b^c in next round - eor x16,x16,x24,ror#41 // Sigma1(e) - eor x3,x3,x20,ror#34 - add x27,x27,x17 // h+=Ch(e,f,g) - and x28,x28,x19 // (b^c)&=(a^b) - eor x1,x1,x10,ror#61 - eor x2,x2,x13,lsr#7 // sigma0(X[i+1]) - add x27,x27,x16 // h+=Sigma1(e) - eor x28,x28,x21 // Maj(a,b,c) - eor x17,x3,x20,ror#39 // Sigma0(a) - eor x1,x1,x10,lsr#6 // sigma1(X[i+14]) - add x12,x12,x5 - add x23,x23,x27 // d+=h - add x27,x27,x28 // h+=Maj(a,b,c) - ldr x28,[x30],#8 // *K++, x19 in next round - add x12,x12,x2 - add x27,x27,x17 // h+=Sigma0(a) - add x12,x12,x1 - ldr x1,[sp,#16] - str x4,[sp,#8] - ror x16,x23,#14 - add x26,x26,x28 // h+=K[i] - ror x3,x14,#1 - and x17,x24,x23 - ror x2,x11,#19 - bic x28,x25,x23 - ror x4,x27,#28 - add x26,x26,x12 // h+=X[i] - eor x16,x16,x23,ror#18 - eor x3,x3,x14,ror#8 - orr x17,x17,x28 // Ch(e,f,g) - eor x28,x27,x20 // a^b, b^c in next round - eor x16,x16,x23,ror#41 // Sigma1(e) - eor x4,x4,x27,ror#34 - add x26,x26,x17 // h+=Ch(e,f,g) - and x19,x19,x28 // (b^c)&=(a^b) - eor x2,x2,x11,ror#61 - eor x3,x3,x14,lsr#7 // sigma0(X[i+1]) - add x26,x26,x16 // h+=Sigma1(e) - eor x19,x19,x20 // Maj(a,b,c) - eor x17,x4,x27,ror#39 // Sigma0(a) - eor x2,x2,x11,lsr#6 // sigma1(X[i+14]) - add x13,x13,x6 - add x22,x22,x26 // d+=h - add x26,x26,x19 // h+=Maj(a,b,c) - ldr x19,[x30],#8 // *K++, x28 in next round - add x13,x13,x3 - add x26,x26,x17 // h+=Sigma0(a) - add x13,x13,x2 - ldr x2,[sp,#24] - str x5,[sp,#16] - ror x16,x22,#14 - add x25,x25,x19 // h+=K[i] - ror x4,x15,#1 - and x17,x23,x22 - ror x3,x12,#19 - bic x19,x24,x22 - ror x5,x26,#28 - add x25,x25,x13 // h+=X[i] - eor x16,x16,x22,ror#18 - eor x4,x4,x15,ror#8 - orr x17,x17,x19 // Ch(e,f,g) - eor x19,x26,x27 // a^b, b^c in next round - eor x16,x16,x22,ror#41 // Sigma1(e) - eor x5,x5,x26,ror#34 - add x25,x25,x17 // h+=Ch(e,f,g) - and x28,x28,x19 // (b^c)&=(a^b) - eor x3,x3,x12,ror#61 - eor x4,x4,x15,lsr#7 // sigma0(X[i+1]) - add x25,x25,x16 // h+=Sigma1(e) - eor x28,x28,x27 // Maj(a,b,c) - eor x17,x5,x26,ror#39 // Sigma0(a) - eor x3,x3,x12,lsr#6 // sigma1(X[i+14]) - add x14,x14,x7 - add x21,x21,x25 // d+=h - add x25,x25,x28 // h+=Maj(a,b,c) - ldr x28,[x30],#8 // *K++, x19 in next round - add x14,x14,x4 - add x25,x25,x17 // h+=Sigma0(a) - add x14,x14,x3 - ldr x3,[sp,#0] - str x6,[sp,#24] - ror x16,x21,#14 - add x24,x24,x28 // h+=K[i] - ror x5,x0,#1 - and x17,x22,x21 - ror x4,x13,#19 - bic x28,x23,x21 - ror x6,x25,#28 - add x24,x24,x14 // h+=X[i] - eor x16,x16,x21,ror#18 - eor x5,x5,x0,ror#8 - orr x17,x17,x28 // Ch(e,f,g) - eor x28,x25,x26 // a^b, b^c in next round - eor x16,x16,x21,ror#41 // Sigma1(e) - eor x6,x6,x25,ror#34 - add x24,x24,x17 // h+=Ch(e,f,g) - and x19,x19,x28 // (b^c)&=(a^b) - eor x4,x4,x13,ror#61 - eor x5,x5,x0,lsr#7 // sigma0(X[i+1]) - add x24,x24,x16 // h+=Sigma1(e) - eor x19,x19,x26 // Maj(a,b,c) - eor x17,x6,x25,ror#39 // Sigma0(a) - eor x4,x4,x13,lsr#6 // sigma1(X[i+14]) - add x15,x15,x8 - add x20,x20,x24 // d+=h - add x24,x24,x19 // h+=Maj(a,b,c) - ldr x19,[x30],#8 // *K++, x28 in next round - add x15,x15,x5 - add x24,x24,x17 // h+=Sigma0(a) - add x15,x15,x4 - ldr x4,[sp,#8] - str x7,[sp,#0] - ror x16,x20,#14 - add x23,x23,x19 // h+=K[i] - ror x6,x1,#1 - and x17,x21,x20 - ror x5,x14,#19 - bic x19,x22,x20 - ror x7,x24,#28 - add x23,x23,x15 // h+=X[i] - eor x16,x16,x20,ror#18 - eor x6,x6,x1,ror#8 - orr x17,x17,x19 // Ch(e,f,g) - eor x19,x24,x25 // a^b, b^c in next round - eor x16,x16,x20,ror#41 // Sigma1(e) - eor x7,x7,x24,ror#34 - add x23,x23,x17 // h+=Ch(e,f,g) - and x28,x28,x19 // (b^c)&=(a^b) - eor x5,x5,x14,ror#61 - eor x6,x6,x1,lsr#7 // sigma0(X[i+1]) - add x23,x23,x16 // h+=Sigma1(e) - eor x28,x28,x25 // Maj(a,b,c) - eor x17,x7,x24,ror#39 // Sigma0(a) - eor x5,x5,x14,lsr#6 // sigma1(X[i+14]) - add x0,x0,x9 - add x27,x27,x23 // d+=h - add x23,x23,x28 // h+=Maj(a,b,c) - ldr x28,[x30],#8 // *K++, x19 in next round - add x0,x0,x6 - add x23,x23,x17 // h+=Sigma0(a) - add x0,x0,x5 - ldr x5,[sp,#16] - str x8,[sp,#8] - ror x16,x27,#14 - add x22,x22,x28 // h+=K[i] - ror x7,x2,#1 - and x17,x20,x27 - ror x6,x15,#19 - bic x28,x21,x27 - ror x8,x23,#28 - add x22,x22,x0 // h+=X[i] - eor x16,x16,x27,ror#18 - eor x7,x7,x2,ror#8 - orr x17,x17,x28 // Ch(e,f,g) - eor x28,x23,x24 // a^b, b^c in next round - eor x16,x16,x27,ror#41 // Sigma1(e) - eor x8,x8,x23,ror#34 - add x22,x22,x17 // h+=Ch(e,f,g) - and x19,x19,x28 // (b^c)&=(a^b) - eor x6,x6,x15,ror#61 - eor x7,x7,x2,lsr#7 // sigma0(X[i+1]) - add x22,x22,x16 // h+=Sigma1(e) - eor x19,x19,x24 // Maj(a,b,c) - eor x17,x8,x23,ror#39 // Sigma0(a) - eor x6,x6,x15,lsr#6 // sigma1(X[i+14]) - add x1,x1,x10 - add x26,x26,x22 // d+=h - add x22,x22,x19 // h+=Maj(a,b,c) - ldr x19,[x30],#8 // *K++, x28 in next round - add x1,x1,x7 - add x22,x22,x17 // h+=Sigma0(a) - add x1,x1,x6 - ldr x6,[sp,#24] - str x9,[sp,#16] - ror x16,x26,#14 - add x21,x21,x19 // h+=K[i] - ror x8,x3,#1 - and x17,x27,x26 - ror x7,x0,#19 - bic x19,x20,x26 - ror x9,x22,#28 - add x21,x21,x1 // h+=X[i] - eor x16,x16,x26,ror#18 - eor x8,x8,x3,ror#8 - orr x17,x17,x19 // Ch(e,f,g) - eor x19,x22,x23 // a^b, b^c in next round - eor x16,x16,x26,ror#41 // Sigma1(e) - eor x9,x9,x22,ror#34 - add x21,x21,x17 // h+=Ch(e,f,g) - and x28,x28,x19 // (b^c)&=(a^b) - eor x7,x7,x0,ror#61 - eor x8,x8,x3,lsr#7 // sigma0(X[i+1]) - add x21,x21,x16 // h+=Sigma1(e) - eor x28,x28,x23 // Maj(a,b,c) - eor x17,x9,x22,ror#39 // Sigma0(a) - eor x7,x7,x0,lsr#6 // sigma1(X[i+14]) - add x2,x2,x11 - add x25,x25,x21 // d+=h - add x21,x21,x28 // h+=Maj(a,b,c) - ldr x28,[x30],#8 // *K++, x19 in next round - add x2,x2,x8 - add x21,x21,x17 // h+=Sigma0(a) - add x2,x2,x7 - ldr x7,[sp,#0] - str x10,[sp,#24] - ror x16,x25,#14 - add x20,x20,x28 // h+=K[i] - ror x9,x4,#1 - and x17,x26,x25 - ror x8,x1,#19 - bic x28,x27,x25 - ror x10,x21,#28 - add x20,x20,x2 // h+=X[i] - eor x16,x16,x25,ror#18 - eor x9,x9,x4,ror#8 - orr x17,x17,x28 // Ch(e,f,g) - eor x28,x21,x22 // a^b, b^c in next round - eor x16,x16,x25,ror#41 // Sigma1(e) - eor x10,x10,x21,ror#34 - add x20,x20,x17 // h+=Ch(e,f,g) - and x19,x19,x28 // (b^c)&=(a^b) - eor x8,x8,x1,ror#61 - eor x9,x9,x4,lsr#7 // sigma0(X[i+1]) - add x20,x20,x16 // h+=Sigma1(e) - eor x19,x19,x22 // Maj(a,b,c) - eor x17,x10,x21,ror#39 // Sigma0(a) - eor x8,x8,x1,lsr#6 // sigma1(X[i+14]) - add x3,x3,x12 - add x24,x24,x20 // d+=h - add x20,x20,x19 // h+=Maj(a,b,c) - ldr x19,[x30],#8 // *K++, x28 in next round - add x3,x3,x9 - add x20,x20,x17 // h+=Sigma0(a) - add x3,x3,x8 - cbnz x19,.Loop_16_xx - - ldp x0,x2,[x29,#96] - ldr x1,[x29,#112] - sub x30,x30,#648 // rewind - - ldp x3,x4,[x0] - ldp x5,x6,[x0,#2*8] - add x1,x1,#14*8 // advance input pointer - ldp x7,x8,[x0,#4*8] - add x20,x20,x3 - ldp x9,x10,[x0,#6*8] - add x21,x21,x4 - add x22,x22,x5 - add x23,x23,x6 - stp x20,x21,[x0] - add x24,x24,x7 - add x25,x25,x8 - stp x22,x23,[x0,#2*8] - add x26,x26,x9 - add x27,x27,x10 - cmp x1,x2 - stp x24,x25,[x0,#4*8] - stp x26,x27,[x0,#6*8] - b.ne .Loop - - ldp x19,x20,[x29,#16] - add sp,sp,#4*8 - ldp x21,x22,[x29,#32] - ldp x23,x24,[x29,#48] - ldp x25,x26,[x29,#64] - ldp x27,x28,[x29,#80] - ldp x29,x30,[sp],#128 - AARCH64_VALIDATE_LINK_REGISTER - ret -.size GFp_sha512_block_data_order,.-GFp_sha512_block_data_order - -.section .rodata -.align 6 -.type .LK512,%object -.LK512: -.quad 0x428a2f98d728ae22,0x7137449123ef65cd -.quad 0xb5c0fbcfec4d3b2f,0xe9b5dba58189dbbc -.quad 0x3956c25bf348b538,0x59f111f1b605d019 -.quad 0x923f82a4af194f9b,0xab1c5ed5da6d8118 -.quad 0xd807aa98a3030242,0x12835b0145706fbe -.quad 0x243185be4ee4b28c,0x550c7dc3d5ffb4e2 -.quad 0x72be5d74f27b896f,0x80deb1fe3b1696b1 -.quad 0x9bdc06a725c71235,0xc19bf174cf692694 -.quad 0xe49b69c19ef14ad2,0xefbe4786384f25e3 -.quad 0x0fc19dc68b8cd5b5,0x240ca1cc77ac9c65 -.quad 0x2de92c6f592b0275,0x4a7484aa6ea6e483 -.quad 0x5cb0a9dcbd41fbd4,0x76f988da831153b5 -.quad 0x983e5152ee66dfab,0xa831c66d2db43210 -.quad 0xb00327c898fb213f,0xbf597fc7beef0ee4 -.quad 0xc6e00bf33da88fc2,0xd5a79147930aa725 -.quad 0x06ca6351e003826f,0x142929670a0e6e70 -.quad 0x27b70a8546d22ffc,0x2e1b21385c26c926 -.quad 0x4d2c6dfc5ac42aed,0x53380d139d95b3df -.quad 0x650a73548baf63de,0x766a0abb3c77b2a8 -.quad 0x81c2c92e47edaee6,0x92722c851482353b -.quad 0xa2bfe8a14cf10364,0xa81a664bbc423001 -.quad 0xc24b8b70d0f89791,0xc76c51a30654be30 -.quad 0xd192e819d6ef5218,0xd69906245565a910 -.quad 0xf40e35855771202a,0x106aa07032bbd1b8 -.quad 0x19a4c116b8d2d0c8,0x1e376c085141ab53 -.quad 0x2748774cdf8eeb99,0x34b0bcb5e19b48a8 -.quad 0x391c0cb3c5c95a63,0x4ed8aa4ae3418acb -.quad 0x5b9cca4f7763e373,0x682e6ff3d6b2b8a3 -.quad 0x748f82ee5defb2fc,0x78a5636f43172f60 -.quad 0x84c87814a1f0ab72,0x8cc702081a6439ec -.quad 0x90befffa23631e28,0xa4506cebde82bde9 -.quad 0xbef9a3f7b2c67915,0xc67178f2e372532b -.quad 0xca273eceea26619c,0xd186b8c721c0c207 -.quad 0xeada7dd6cde0eb1e,0xf57d4f7fee6ed178 -.quad 0x06f067aa72176fba,0x0a637dc5a2c898a6 -.quad 0x113f9804bef90dae,0x1b710b35131c471b -.quad 0x28db77f523047d84,0x32caab7b40c72493 -.quad 0x3c9ebe0a15c9bebc,0x431d67c49c100d4c -.quad 0x4cc5d4becb3e42b6,0x597f299cfc657e2a -.quad 0x5fcb6fab3ad6faec,0x6c44198c4a475817 -.quad 0 // terminator -.size .LK512,.-.LK512 -.byte 83,72,65,53,49,50,32,98,108,111,99,107,32,116,114,97,110,115,102,111,114,109,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 -.align 2 -.align 2 -#endif -#endif // !OPENSSL_NO_ASM -.section .note.GNU-stack,"",%progbits diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/sha512-x86_64-elf.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/sha512-x86_64-elf.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/sha512-x86_64-elf.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/sha512-x86_64-elf.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,2989 +0,0 @@ -# This file is generated from a similarly-named Perl script in the BoringSSL -# source tree. Do not edit by hand. - -#if defined(__has_feature) -#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) -#define OPENSSL_NO_ASM -#endif -#endif - -#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) -.text - -.extern GFp_ia32cap_P -.hidden GFp_ia32cap_P -.globl GFp_sha512_block_data_order -.hidden GFp_sha512_block_data_order -.type GFp_sha512_block_data_order,@function -.align 16 -GFp_sha512_block_data_order: -.cfi_startproc - leaq GFp_ia32cap_P(%rip),%r11 - movl 0(%r11),%r9d - movl 4(%r11),%r10d - movl 8(%r11),%r11d - andl $1073741824,%r9d - andl $268435968,%r10d - orl %r9d,%r10d - cmpl $1342177792,%r10d - je .Lavx_shortcut - movq %rsp,%rax -.cfi_def_cfa_register %rax - pushq %rbx -.cfi_offset %rbx,-16 - pushq %rbp -.cfi_offset %rbp,-24 - pushq %r12 -.cfi_offset %r12,-32 - pushq %r13 -.cfi_offset %r13,-40 - pushq %r14 -.cfi_offset %r14,-48 - pushq %r15 -.cfi_offset %r15,-56 - shlq $4,%rdx - subq $128+32,%rsp - leaq (%rsi,%rdx,8),%rdx - andq $-64,%rsp - movq %rdi,128+0(%rsp) - movq %rsi,128+8(%rsp) - movq %rdx,128+16(%rsp) - movq %rax,152(%rsp) -.cfi_escape 0x0f,0x06,0x77,0x98,0x01,0x06,0x23,0x08 -.Lprologue: - - movq 0(%rdi),%rax - movq 8(%rdi),%rbx - movq 16(%rdi),%rcx - movq 24(%rdi),%rdx - movq 32(%rdi),%r8 - movq 40(%rdi),%r9 - movq 48(%rdi),%r10 - movq 56(%rdi),%r11 - jmp .Lloop - -.align 16 -.Lloop: - movq %rbx,%rdi - leaq K512(%rip),%rbp - xorq %rcx,%rdi - movq 0(%rsi),%r12 - movq %r8,%r13 - movq %rax,%r14 - bswapq %r12 - rorq $23,%r13 - movq %r9,%r15 - - xorq %r8,%r13 - rorq $5,%r14 - xorq %r10,%r15 - - movq %r12,0(%rsp) - xorq %rax,%r14 - andq %r8,%r15 - - rorq $4,%r13 - addq %r11,%r12 - xorq %r10,%r15 - - rorq $6,%r14 - xorq %r8,%r13 - addq %r15,%r12 - - movq %rax,%r15 - addq (%rbp),%r12 - xorq %rax,%r14 - - xorq %rbx,%r15 - rorq $14,%r13 - movq %rbx,%r11 - - andq %r15,%rdi - rorq $28,%r14 - addq %r13,%r12 - - xorq %rdi,%r11 - addq %r12,%rdx - addq %r12,%r11 - - leaq 8(%rbp),%rbp - addq %r14,%r11 - movq 8(%rsi),%r12 - movq %rdx,%r13 - movq %r11,%r14 - bswapq %r12 - rorq $23,%r13 - movq %r8,%rdi - - xorq %rdx,%r13 - rorq $5,%r14 - xorq %r9,%rdi - - movq %r12,8(%rsp) - xorq %r11,%r14 - andq %rdx,%rdi - - rorq $4,%r13 - addq %r10,%r12 - xorq %r9,%rdi - - rorq $6,%r14 - xorq %rdx,%r13 - addq %rdi,%r12 - - movq %r11,%rdi - addq (%rbp),%r12 - xorq %r11,%r14 - - xorq %rax,%rdi - rorq $14,%r13 - movq %rax,%r10 - - andq %rdi,%r15 - rorq $28,%r14 - addq %r13,%r12 - - xorq %r15,%r10 - addq %r12,%rcx - addq %r12,%r10 - - leaq 24(%rbp),%rbp - addq %r14,%r10 - movq 16(%rsi),%r12 - movq %rcx,%r13 - movq %r10,%r14 - bswapq %r12 - rorq $23,%r13 - movq %rdx,%r15 - - xorq %rcx,%r13 - rorq $5,%r14 - xorq %r8,%r15 - - movq %r12,16(%rsp) - xorq %r10,%r14 - andq %rcx,%r15 - - rorq $4,%r13 - addq %r9,%r12 - xorq %r8,%r15 - - rorq $6,%r14 - xorq %rcx,%r13 - addq %r15,%r12 - - movq %r10,%r15 - addq (%rbp),%r12 - xorq %r10,%r14 - - xorq %r11,%r15 - rorq $14,%r13 - movq %r11,%r9 - - andq %r15,%rdi - rorq $28,%r14 - addq %r13,%r12 - - xorq %rdi,%r9 - addq %r12,%rbx - addq %r12,%r9 - - leaq 8(%rbp),%rbp - addq %r14,%r9 - movq 24(%rsi),%r12 - movq %rbx,%r13 - movq %r9,%r14 - bswapq %r12 - rorq $23,%r13 - movq %rcx,%rdi - - xorq %rbx,%r13 - rorq $5,%r14 - xorq %rdx,%rdi - - movq %r12,24(%rsp) - xorq %r9,%r14 - andq %rbx,%rdi - - rorq $4,%r13 - addq %r8,%r12 - xorq %rdx,%rdi - - rorq $6,%r14 - xorq %rbx,%r13 - addq %rdi,%r12 - - movq %r9,%rdi - addq (%rbp),%r12 - xorq %r9,%r14 - - xorq %r10,%rdi - rorq $14,%r13 - movq %r10,%r8 - - andq %rdi,%r15 - rorq $28,%r14 - addq %r13,%r12 - - xorq %r15,%r8 - addq %r12,%rax - addq %r12,%r8 - - leaq 24(%rbp),%rbp - addq %r14,%r8 - movq 32(%rsi),%r12 - movq %rax,%r13 - movq %r8,%r14 - bswapq %r12 - rorq $23,%r13 - movq %rbx,%r15 - - xorq %rax,%r13 - rorq $5,%r14 - xorq %rcx,%r15 - - movq %r12,32(%rsp) - xorq %r8,%r14 - andq %rax,%r15 - - rorq $4,%r13 - addq %rdx,%r12 - xorq %rcx,%r15 - - rorq $6,%r14 - xorq %rax,%r13 - addq %r15,%r12 - - movq %r8,%r15 - addq (%rbp),%r12 - xorq %r8,%r14 - - xorq %r9,%r15 - rorq $14,%r13 - movq %r9,%rdx - - andq %r15,%rdi - rorq $28,%r14 - addq %r13,%r12 - - xorq %rdi,%rdx - addq %r12,%r11 - addq %r12,%rdx - - leaq 8(%rbp),%rbp - addq %r14,%rdx - movq 40(%rsi),%r12 - movq %r11,%r13 - movq %rdx,%r14 - bswapq %r12 - rorq $23,%r13 - movq %rax,%rdi - - xorq %r11,%r13 - rorq $5,%r14 - xorq %rbx,%rdi - - movq %r12,40(%rsp) - xorq %rdx,%r14 - andq %r11,%rdi - - rorq $4,%r13 - addq %rcx,%r12 - xorq %rbx,%rdi - - rorq $6,%r14 - xorq %r11,%r13 - addq %rdi,%r12 - - movq %rdx,%rdi - addq (%rbp),%r12 - xorq %rdx,%r14 - - xorq %r8,%rdi - rorq $14,%r13 - movq %r8,%rcx - - andq %rdi,%r15 - rorq $28,%r14 - addq %r13,%r12 - - xorq %r15,%rcx - addq %r12,%r10 - addq %r12,%rcx - - leaq 24(%rbp),%rbp - addq %r14,%rcx - movq 48(%rsi),%r12 - movq %r10,%r13 - movq %rcx,%r14 - bswapq %r12 - rorq $23,%r13 - movq %r11,%r15 - - xorq %r10,%r13 - rorq $5,%r14 - xorq %rax,%r15 - - movq %r12,48(%rsp) - xorq %rcx,%r14 - andq %r10,%r15 - - rorq $4,%r13 - addq %rbx,%r12 - xorq %rax,%r15 - - rorq $6,%r14 - xorq %r10,%r13 - addq %r15,%r12 - - movq %rcx,%r15 - addq (%rbp),%r12 - xorq %rcx,%r14 - - xorq %rdx,%r15 - rorq $14,%r13 - movq %rdx,%rbx - - andq %r15,%rdi - rorq $28,%r14 - addq %r13,%r12 - - xorq %rdi,%rbx - addq %r12,%r9 - addq %r12,%rbx - - leaq 8(%rbp),%rbp - addq %r14,%rbx - movq 56(%rsi),%r12 - movq %r9,%r13 - movq %rbx,%r14 - bswapq %r12 - rorq $23,%r13 - movq %r10,%rdi - - xorq %r9,%r13 - rorq $5,%r14 - xorq %r11,%rdi - - movq %r12,56(%rsp) - xorq %rbx,%r14 - andq %r9,%rdi - - rorq $4,%r13 - addq %rax,%r12 - xorq %r11,%rdi - - rorq $6,%r14 - xorq %r9,%r13 - addq %rdi,%r12 - - movq %rbx,%rdi - addq (%rbp),%r12 - xorq %rbx,%r14 - - xorq %rcx,%rdi - rorq $14,%r13 - movq %rcx,%rax - - andq %rdi,%r15 - rorq $28,%r14 - addq %r13,%r12 - - xorq %r15,%rax - addq %r12,%r8 - addq %r12,%rax - - leaq 24(%rbp),%rbp - addq %r14,%rax - movq 64(%rsi),%r12 - movq %r8,%r13 - movq %rax,%r14 - bswapq %r12 - rorq $23,%r13 - movq %r9,%r15 - - xorq %r8,%r13 - rorq $5,%r14 - xorq %r10,%r15 - - movq %r12,64(%rsp) - xorq %rax,%r14 - andq %r8,%r15 - - rorq $4,%r13 - addq %r11,%r12 - xorq %r10,%r15 - - rorq $6,%r14 - xorq %r8,%r13 - addq %r15,%r12 - - movq %rax,%r15 - addq (%rbp),%r12 - xorq %rax,%r14 - - xorq %rbx,%r15 - rorq $14,%r13 - movq %rbx,%r11 - - andq %r15,%rdi - rorq $28,%r14 - addq %r13,%r12 - - xorq %rdi,%r11 - addq %r12,%rdx - addq %r12,%r11 - - leaq 8(%rbp),%rbp - addq %r14,%r11 - movq 72(%rsi),%r12 - movq %rdx,%r13 - movq %r11,%r14 - bswapq %r12 - rorq $23,%r13 - movq %r8,%rdi - - xorq %rdx,%r13 - rorq $5,%r14 - xorq %r9,%rdi - - movq %r12,72(%rsp) - xorq %r11,%r14 - andq %rdx,%rdi - - rorq $4,%r13 - addq %r10,%r12 - xorq %r9,%rdi - - rorq $6,%r14 - xorq %rdx,%r13 - addq %rdi,%r12 - - movq %r11,%rdi - addq (%rbp),%r12 - xorq %r11,%r14 - - xorq %rax,%rdi - rorq $14,%r13 - movq %rax,%r10 - - andq %rdi,%r15 - rorq $28,%r14 - addq %r13,%r12 - - xorq %r15,%r10 - addq %r12,%rcx - addq %r12,%r10 - - leaq 24(%rbp),%rbp - addq %r14,%r10 - movq 80(%rsi),%r12 - movq %rcx,%r13 - movq %r10,%r14 - bswapq %r12 - rorq $23,%r13 - movq %rdx,%r15 - - xorq %rcx,%r13 - rorq $5,%r14 - xorq %r8,%r15 - - movq %r12,80(%rsp) - xorq %r10,%r14 - andq %rcx,%r15 - - rorq $4,%r13 - addq %r9,%r12 - xorq %r8,%r15 - - rorq $6,%r14 - xorq %rcx,%r13 - addq %r15,%r12 - - movq %r10,%r15 - addq (%rbp),%r12 - xorq %r10,%r14 - - xorq %r11,%r15 - rorq $14,%r13 - movq %r11,%r9 - - andq %r15,%rdi - rorq $28,%r14 - addq %r13,%r12 - - xorq %rdi,%r9 - addq %r12,%rbx - addq %r12,%r9 - - leaq 8(%rbp),%rbp - addq %r14,%r9 - movq 88(%rsi),%r12 - movq %rbx,%r13 - movq %r9,%r14 - bswapq %r12 - rorq $23,%r13 - movq %rcx,%rdi - - xorq %rbx,%r13 - rorq $5,%r14 - xorq %rdx,%rdi - - movq %r12,88(%rsp) - xorq %r9,%r14 - andq %rbx,%rdi - - rorq $4,%r13 - addq %r8,%r12 - xorq %rdx,%rdi - - rorq $6,%r14 - xorq %rbx,%r13 - addq %rdi,%r12 - - movq %r9,%rdi - addq (%rbp),%r12 - xorq %r9,%r14 - - xorq %r10,%rdi - rorq $14,%r13 - movq %r10,%r8 - - andq %rdi,%r15 - rorq $28,%r14 - addq %r13,%r12 - - xorq %r15,%r8 - addq %r12,%rax - addq %r12,%r8 - - leaq 24(%rbp),%rbp - addq %r14,%r8 - movq 96(%rsi),%r12 - movq %rax,%r13 - movq %r8,%r14 - bswapq %r12 - rorq $23,%r13 - movq %rbx,%r15 - - xorq %rax,%r13 - rorq $5,%r14 - xorq %rcx,%r15 - - movq %r12,96(%rsp) - xorq %r8,%r14 - andq %rax,%r15 - - rorq $4,%r13 - addq %rdx,%r12 - xorq %rcx,%r15 - - rorq $6,%r14 - xorq %rax,%r13 - addq %r15,%r12 - - movq %r8,%r15 - addq (%rbp),%r12 - xorq %r8,%r14 - - xorq %r9,%r15 - rorq $14,%r13 - movq %r9,%rdx - - andq %r15,%rdi - rorq $28,%r14 - addq %r13,%r12 - - xorq %rdi,%rdx - addq %r12,%r11 - addq %r12,%rdx - - leaq 8(%rbp),%rbp - addq %r14,%rdx - movq 104(%rsi),%r12 - movq %r11,%r13 - movq %rdx,%r14 - bswapq %r12 - rorq $23,%r13 - movq %rax,%rdi - - xorq %r11,%r13 - rorq $5,%r14 - xorq %rbx,%rdi - - movq %r12,104(%rsp) - xorq %rdx,%r14 - andq %r11,%rdi - - rorq $4,%r13 - addq %rcx,%r12 - xorq %rbx,%rdi - - rorq $6,%r14 - xorq %r11,%r13 - addq %rdi,%r12 - - movq %rdx,%rdi - addq (%rbp),%r12 - xorq %rdx,%r14 - - xorq %r8,%rdi - rorq $14,%r13 - movq %r8,%rcx - - andq %rdi,%r15 - rorq $28,%r14 - addq %r13,%r12 - - xorq %r15,%rcx - addq %r12,%r10 - addq %r12,%rcx - - leaq 24(%rbp),%rbp - addq %r14,%rcx - movq 112(%rsi),%r12 - movq %r10,%r13 - movq %rcx,%r14 - bswapq %r12 - rorq $23,%r13 - movq %r11,%r15 - - xorq %r10,%r13 - rorq $5,%r14 - xorq %rax,%r15 - - movq %r12,112(%rsp) - xorq %rcx,%r14 - andq %r10,%r15 - - rorq $4,%r13 - addq %rbx,%r12 - xorq %rax,%r15 - - rorq $6,%r14 - xorq %r10,%r13 - addq %r15,%r12 - - movq %rcx,%r15 - addq (%rbp),%r12 - xorq %rcx,%r14 - - xorq %rdx,%r15 - rorq $14,%r13 - movq %rdx,%rbx - - andq %r15,%rdi - rorq $28,%r14 - addq %r13,%r12 - - xorq %rdi,%rbx - addq %r12,%r9 - addq %r12,%rbx - - leaq 8(%rbp),%rbp - addq %r14,%rbx - movq 120(%rsi),%r12 - movq %r9,%r13 - movq %rbx,%r14 - bswapq %r12 - rorq $23,%r13 - movq %r10,%rdi - - xorq %r9,%r13 - rorq $5,%r14 - xorq %r11,%rdi - - movq %r12,120(%rsp) - xorq %rbx,%r14 - andq %r9,%rdi - - rorq $4,%r13 - addq %rax,%r12 - xorq %r11,%rdi - - rorq $6,%r14 - xorq %r9,%r13 - addq %rdi,%r12 - - movq %rbx,%rdi - addq (%rbp),%r12 - xorq %rbx,%r14 - - xorq %rcx,%rdi - rorq $14,%r13 - movq %rcx,%rax - - andq %rdi,%r15 - rorq $28,%r14 - addq %r13,%r12 - - xorq %r15,%rax - addq %r12,%r8 - addq %r12,%rax - - leaq 24(%rbp),%rbp - jmp .Lrounds_16_xx -.align 16 -.Lrounds_16_xx: - movq 8(%rsp),%r13 - movq 112(%rsp),%r15 - - movq %r13,%r12 - rorq $7,%r13 - addq %r14,%rax - movq %r15,%r14 - rorq $42,%r15 - - xorq %r12,%r13 - shrq $7,%r12 - rorq $1,%r13 - xorq %r14,%r15 - shrq $6,%r14 - - rorq $19,%r15 - xorq %r13,%r12 - xorq %r14,%r15 - addq 72(%rsp),%r12 - - addq 0(%rsp),%r12 - movq %r8,%r13 - addq %r15,%r12 - movq %rax,%r14 - rorq $23,%r13 - movq %r9,%r15 - - xorq %r8,%r13 - rorq $5,%r14 - xorq %r10,%r15 - - movq %r12,0(%rsp) - xorq %rax,%r14 - andq %r8,%r15 - - rorq $4,%r13 - addq %r11,%r12 - xorq %r10,%r15 - - rorq $6,%r14 - xorq %r8,%r13 - addq %r15,%r12 - - movq %rax,%r15 - addq (%rbp),%r12 - xorq %rax,%r14 - - xorq %rbx,%r15 - rorq $14,%r13 - movq %rbx,%r11 - - andq %r15,%rdi - rorq $28,%r14 - addq %r13,%r12 - - xorq %rdi,%r11 - addq %r12,%rdx - addq %r12,%r11 - - leaq 8(%rbp),%rbp - movq 16(%rsp),%r13 - movq 120(%rsp),%rdi - - movq %r13,%r12 - rorq $7,%r13 - addq %r14,%r11 - movq %rdi,%r14 - rorq $42,%rdi - - xorq %r12,%r13 - shrq $7,%r12 - rorq $1,%r13 - xorq %r14,%rdi - shrq $6,%r14 - - rorq $19,%rdi - xorq %r13,%r12 - xorq %r14,%rdi - addq 80(%rsp),%r12 - - addq 8(%rsp),%r12 - movq %rdx,%r13 - addq %rdi,%r12 - movq %r11,%r14 - rorq $23,%r13 - movq %r8,%rdi - - xorq %rdx,%r13 - rorq $5,%r14 - xorq %r9,%rdi - - movq %r12,8(%rsp) - xorq %r11,%r14 - andq %rdx,%rdi - - rorq $4,%r13 - addq %r10,%r12 - xorq %r9,%rdi - - rorq $6,%r14 - xorq %rdx,%r13 - addq %rdi,%r12 - - movq %r11,%rdi - addq (%rbp),%r12 - xorq %r11,%r14 - - xorq %rax,%rdi - rorq $14,%r13 - movq %rax,%r10 - - andq %rdi,%r15 - rorq $28,%r14 - addq %r13,%r12 - - xorq %r15,%r10 - addq %r12,%rcx - addq %r12,%r10 - - leaq 24(%rbp),%rbp - movq 24(%rsp),%r13 - movq 0(%rsp),%r15 - - movq %r13,%r12 - rorq $7,%r13 - addq %r14,%r10 - movq %r15,%r14 - rorq $42,%r15 - - xorq %r12,%r13 - shrq $7,%r12 - rorq $1,%r13 - xorq %r14,%r15 - shrq $6,%r14 - - rorq $19,%r15 - xorq %r13,%r12 - xorq %r14,%r15 - addq 88(%rsp),%r12 - - addq 16(%rsp),%r12 - movq %rcx,%r13 - addq %r15,%r12 - movq %r10,%r14 - rorq $23,%r13 - movq %rdx,%r15 - - xorq %rcx,%r13 - rorq $5,%r14 - xorq %r8,%r15 - - movq %r12,16(%rsp) - xorq %r10,%r14 - andq %rcx,%r15 - - rorq $4,%r13 - addq %r9,%r12 - xorq %r8,%r15 - - rorq $6,%r14 - xorq %rcx,%r13 - addq %r15,%r12 - - movq %r10,%r15 - addq (%rbp),%r12 - xorq %r10,%r14 - - xorq %r11,%r15 - rorq $14,%r13 - movq %r11,%r9 - - andq %r15,%rdi - rorq $28,%r14 - addq %r13,%r12 - - xorq %rdi,%r9 - addq %r12,%rbx - addq %r12,%r9 - - leaq 8(%rbp),%rbp - movq 32(%rsp),%r13 - movq 8(%rsp),%rdi - - movq %r13,%r12 - rorq $7,%r13 - addq %r14,%r9 - movq %rdi,%r14 - rorq $42,%rdi - - xorq %r12,%r13 - shrq $7,%r12 - rorq $1,%r13 - xorq %r14,%rdi - shrq $6,%r14 - - rorq $19,%rdi - xorq %r13,%r12 - xorq %r14,%rdi - addq 96(%rsp),%r12 - - addq 24(%rsp),%r12 - movq %rbx,%r13 - addq %rdi,%r12 - movq %r9,%r14 - rorq $23,%r13 - movq %rcx,%rdi - - xorq %rbx,%r13 - rorq $5,%r14 - xorq %rdx,%rdi - - movq %r12,24(%rsp) - xorq %r9,%r14 - andq %rbx,%rdi - - rorq $4,%r13 - addq %r8,%r12 - xorq %rdx,%rdi - - rorq $6,%r14 - xorq %rbx,%r13 - addq %rdi,%r12 - - movq %r9,%rdi - addq (%rbp),%r12 - xorq %r9,%r14 - - xorq %r10,%rdi - rorq $14,%r13 - movq %r10,%r8 - - andq %rdi,%r15 - rorq $28,%r14 - addq %r13,%r12 - - xorq %r15,%r8 - addq %r12,%rax - addq %r12,%r8 - - leaq 24(%rbp),%rbp - movq 40(%rsp),%r13 - movq 16(%rsp),%r15 - - movq %r13,%r12 - rorq $7,%r13 - addq %r14,%r8 - movq %r15,%r14 - rorq $42,%r15 - - xorq %r12,%r13 - shrq $7,%r12 - rorq $1,%r13 - xorq %r14,%r15 - shrq $6,%r14 - - rorq $19,%r15 - xorq %r13,%r12 - xorq %r14,%r15 - addq 104(%rsp),%r12 - - addq 32(%rsp),%r12 - movq %rax,%r13 - addq %r15,%r12 - movq %r8,%r14 - rorq $23,%r13 - movq %rbx,%r15 - - xorq %rax,%r13 - rorq $5,%r14 - xorq %rcx,%r15 - - movq %r12,32(%rsp) - xorq %r8,%r14 - andq %rax,%r15 - - rorq $4,%r13 - addq %rdx,%r12 - xorq %rcx,%r15 - - rorq $6,%r14 - xorq %rax,%r13 - addq %r15,%r12 - - movq %r8,%r15 - addq (%rbp),%r12 - xorq %r8,%r14 - - xorq %r9,%r15 - rorq $14,%r13 - movq %r9,%rdx - - andq %r15,%rdi - rorq $28,%r14 - addq %r13,%r12 - - xorq %rdi,%rdx - addq %r12,%r11 - addq %r12,%rdx - - leaq 8(%rbp),%rbp - movq 48(%rsp),%r13 - movq 24(%rsp),%rdi - - movq %r13,%r12 - rorq $7,%r13 - addq %r14,%rdx - movq %rdi,%r14 - rorq $42,%rdi - - xorq %r12,%r13 - shrq $7,%r12 - rorq $1,%r13 - xorq %r14,%rdi - shrq $6,%r14 - - rorq $19,%rdi - xorq %r13,%r12 - xorq %r14,%rdi - addq 112(%rsp),%r12 - - addq 40(%rsp),%r12 - movq %r11,%r13 - addq %rdi,%r12 - movq %rdx,%r14 - rorq $23,%r13 - movq %rax,%rdi - - xorq %r11,%r13 - rorq $5,%r14 - xorq %rbx,%rdi - - movq %r12,40(%rsp) - xorq %rdx,%r14 - andq %r11,%rdi - - rorq $4,%r13 - addq %rcx,%r12 - xorq %rbx,%rdi - - rorq $6,%r14 - xorq %r11,%r13 - addq %rdi,%r12 - - movq %rdx,%rdi - addq (%rbp),%r12 - xorq %rdx,%r14 - - xorq %r8,%rdi - rorq $14,%r13 - movq %r8,%rcx - - andq %rdi,%r15 - rorq $28,%r14 - addq %r13,%r12 - - xorq %r15,%rcx - addq %r12,%r10 - addq %r12,%rcx - - leaq 24(%rbp),%rbp - movq 56(%rsp),%r13 - movq 32(%rsp),%r15 - - movq %r13,%r12 - rorq $7,%r13 - addq %r14,%rcx - movq %r15,%r14 - rorq $42,%r15 - - xorq %r12,%r13 - shrq $7,%r12 - rorq $1,%r13 - xorq %r14,%r15 - shrq $6,%r14 - - rorq $19,%r15 - xorq %r13,%r12 - xorq %r14,%r15 - addq 120(%rsp),%r12 - - addq 48(%rsp),%r12 - movq %r10,%r13 - addq %r15,%r12 - movq %rcx,%r14 - rorq $23,%r13 - movq %r11,%r15 - - xorq %r10,%r13 - rorq $5,%r14 - xorq %rax,%r15 - - movq %r12,48(%rsp) - xorq %rcx,%r14 - andq %r10,%r15 - - rorq $4,%r13 - addq %rbx,%r12 - xorq %rax,%r15 - - rorq $6,%r14 - xorq %r10,%r13 - addq %r15,%r12 - - movq %rcx,%r15 - addq (%rbp),%r12 - xorq %rcx,%r14 - - xorq %rdx,%r15 - rorq $14,%r13 - movq %rdx,%rbx - - andq %r15,%rdi - rorq $28,%r14 - addq %r13,%r12 - - xorq %rdi,%rbx - addq %r12,%r9 - addq %r12,%rbx - - leaq 8(%rbp),%rbp - movq 64(%rsp),%r13 - movq 40(%rsp),%rdi - - movq %r13,%r12 - rorq $7,%r13 - addq %r14,%rbx - movq %rdi,%r14 - rorq $42,%rdi - - xorq %r12,%r13 - shrq $7,%r12 - rorq $1,%r13 - xorq %r14,%rdi - shrq $6,%r14 - - rorq $19,%rdi - xorq %r13,%r12 - xorq %r14,%rdi - addq 0(%rsp),%r12 - - addq 56(%rsp),%r12 - movq %r9,%r13 - addq %rdi,%r12 - movq %rbx,%r14 - rorq $23,%r13 - movq %r10,%rdi - - xorq %r9,%r13 - rorq $5,%r14 - xorq %r11,%rdi - - movq %r12,56(%rsp) - xorq %rbx,%r14 - andq %r9,%rdi - - rorq $4,%r13 - addq %rax,%r12 - xorq %r11,%rdi - - rorq $6,%r14 - xorq %r9,%r13 - addq %rdi,%r12 - - movq %rbx,%rdi - addq (%rbp),%r12 - xorq %rbx,%r14 - - xorq %rcx,%rdi - rorq $14,%r13 - movq %rcx,%rax - - andq %rdi,%r15 - rorq $28,%r14 - addq %r13,%r12 - - xorq %r15,%rax - addq %r12,%r8 - addq %r12,%rax - - leaq 24(%rbp),%rbp - movq 72(%rsp),%r13 - movq 48(%rsp),%r15 - - movq %r13,%r12 - rorq $7,%r13 - addq %r14,%rax - movq %r15,%r14 - rorq $42,%r15 - - xorq %r12,%r13 - shrq $7,%r12 - rorq $1,%r13 - xorq %r14,%r15 - shrq $6,%r14 - - rorq $19,%r15 - xorq %r13,%r12 - xorq %r14,%r15 - addq 8(%rsp),%r12 - - addq 64(%rsp),%r12 - movq %r8,%r13 - addq %r15,%r12 - movq %rax,%r14 - rorq $23,%r13 - movq %r9,%r15 - - xorq %r8,%r13 - rorq $5,%r14 - xorq %r10,%r15 - - movq %r12,64(%rsp) - xorq %rax,%r14 - andq %r8,%r15 - - rorq $4,%r13 - addq %r11,%r12 - xorq %r10,%r15 - - rorq $6,%r14 - xorq %r8,%r13 - addq %r15,%r12 - - movq %rax,%r15 - addq (%rbp),%r12 - xorq %rax,%r14 - - xorq %rbx,%r15 - rorq $14,%r13 - movq %rbx,%r11 - - andq %r15,%rdi - rorq $28,%r14 - addq %r13,%r12 - - xorq %rdi,%r11 - addq %r12,%rdx - addq %r12,%r11 - - leaq 8(%rbp),%rbp - movq 80(%rsp),%r13 - movq 56(%rsp),%rdi - - movq %r13,%r12 - rorq $7,%r13 - addq %r14,%r11 - movq %rdi,%r14 - rorq $42,%rdi - - xorq %r12,%r13 - shrq $7,%r12 - rorq $1,%r13 - xorq %r14,%rdi - shrq $6,%r14 - - rorq $19,%rdi - xorq %r13,%r12 - xorq %r14,%rdi - addq 16(%rsp),%r12 - - addq 72(%rsp),%r12 - movq %rdx,%r13 - addq %rdi,%r12 - movq %r11,%r14 - rorq $23,%r13 - movq %r8,%rdi - - xorq %rdx,%r13 - rorq $5,%r14 - xorq %r9,%rdi - - movq %r12,72(%rsp) - xorq %r11,%r14 - andq %rdx,%rdi - - rorq $4,%r13 - addq %r10,%r12 - xorq %r9,%rdi - - rorq $6,%r14 - xorq %rdx,%r13 - addq %rdi,%r12 - - movq %r11,%rdi - addq (%rbp),%r12 - xorq %r11,%r14 - - xorq %rax,%rdi - rorq $14,%r13 - movq %rax,%r10 - - andq %rdi,%r15 - rorq $28,%r14 - addq %r13,%r12 - - xorq %r15,%r10 - addq %r12,%rcx - addq %r12,%r10 - - leaq 24(%rbp),%rbp - movq 88(%rsp),%r13 - movq 64(%rsp),%r15 - - movq %r13,%r12 - rorq $7,%r13 - addq %r14,%r10 - movq %r15,%r14 - rorq $42,%r15 - - xorq %r12,%r13 - shrq $7,%r12 - rorq $1,%r13 - xorq %r14,%r15 - shrq $6,%r14 - - rorq $19,%r15 - xorq %r13,%r12 - xorq %r14,%r15 - addq 24(%rsp),%r12 - - addq 80(%rsp),%r12 - movq %rcx,%r13 - addq %r15,%r12 - movq %r10,%r14 - rorq $23,%r13 - movq %rdx,%r15 - - xorq %rcx,%r13 - rorq $5,%r14 - xorq %r8,%r15 - - movq %r12,80(%rsp) - xorq %r10,%r14 - andq %rcx,%r15 - - rorq $4,%r13 - addq %r9,%r12 - xorq %r8,%r15 - - rorq $6,%r14 - xorq %rcx,%r13 - addq %r15,%r12 - - movq %r10,%r15 - addq (%rbp),%r12 - xorq %r10,%r14 - - xorq %r11,%r15 - rorq $14,%r13 - movq %r11,%r9 - - andq %r15,%rdi - rorq $28,%r14 - addq %r13,%r12 - - xorq %rdi,%r9 - addq %r12,%rbx - addq %r12,%r9 - - leaq 8(%rbp),%rbp - movq 96(%rsp),%r13 - movq 72(%rsp),%rdi - - movq %r13,%r12 - rorq $7,%r13 - addq %r14,%r9 - movq %rdi,%r14 - rorq $42,%rdi - - xorq %r12,%r13 - shrq $7,%r12 - rorq $1,%r13 - xorq %r14,%rdi - shrq $6,%r14 - - rorq $19,%rdi - xorq %r13,%r12 - xorq %r14,%rdi - addq 32(%rsp),%r12 - - addq 88(%rsp),%r12 - movq %rbx,%r13 - addq %rdi,%r12 - movq %r9,%r14 - rorq $23,%r13 - movq %rcx,%rdi - - xorq %rbx,%r13 - rorq $5,%r14 - xorq %rdx,%rdi - - movq %r12,88(%rsp) - xorq %r9,%r14 - andq %rbx,%rdi - - rorq $4,%r13 - addq %r8,%r12 - xorq %rdx,%rdi - - rorq $6,%r14 - xorq %rbx,%r13 - addq %rdi,%r12 - - movq %r9,%rdi - addq (%rbp),%r12 - xorq %r9,%r14 - - xorq %r10,%rdi - rorq $14,%r13 - movq %r10,%r8 - - andq %rdi,%r15 - rorq $28,%r14 - addq %r13,%r12 - - xorq %r15,%r8 - addq %r12,%rax - addq %r12,%r8 - - leaq 24(%rbp),%rbp - movq 104(%rsp),%r13 - movq 80(%rsp),%r15 - - movq %r13,%r12 - rorq $7,%r13 - addq %r14,%r8 - movq %r15,%r14 - rorq $42,%r15 - - xorq %r12,%r13 - shrq $7,%r12 - rorq $1,%r13 - xorq %r14,%r15 - shrq $6,%r14 - - rorq $19,%r15 - xorq %r13,%r12 - xorq %r14,%r15 - addq 40(%rsp),%r12 - - addq 96(%rsp),%r12 - movq %rax,%r13 - addq %r15,%r12 - movq %r8,%r14 - rorq $23,%r13 - movq %rbx,%r15 - - xorq %rax,%r13 - rorq $5,%r14 - xorq %rcx,%r15 - - movq %r12,96(%rsp) - xorq %r8,%r14 - andq %rax,%r15 - - rorq $4,%r13 - addq %rdx,%r12 - xorq %rcx,%r15 - - rorq $6,%r14 - xorq %rax,%r13 - addq %r15,%r12 - - movq %r8,%r15 - addq (%rbp),%r12 - xorq %r8,%r14 - - xorq %r9,%r15 - rorq $14,%r13 - movq %r9,%rdx - - andq %r15,%rdi - rorq $28,%r14 - addq %r13,%r12 - - xorq %rdi,%rdx - addq %r12,%r11 - addq %r12,%rdx - - leaq 8(%rbp),%rbp - movq 112(%rsp),%r13 - movq 88(%rsp),%rdi - - movq %r13,%r12 - rorq $7,%r13 - addq %r14,%rdx - movq %rdi,%r14 - rorq $42,%rdi - - xorq %r12,%r13 - shrq $7,%r12 - rorq $1,%r13 - xorq %r14,%rdi - shrq $6,%r14 - - rorq $19,%rdi - xorq %r13,%r12 - xorq %r14,%rdi - addq 48(%rsp),%r12 - - addq 104(%rsp),%r12 - movq %r11,%r13 - addq %rdi,%r12 - movq %rdx,%r14 - rorq $23,%r13 - movq %rax,%rdi - - xorq %r11,%r13 - rorq $5,%r14 - xorq %rbx,%rdi - - movq %r12,104(%rsp) - xorq %rdx,%r14 - andq %r11,%rdi - - rorq $4,%r13 - addq %rcx,%r12 - xorq %rbx,%rdi - - rorq $6,%r14 - xorq %r11,%r13 - addq %rdi,%r12 - - movq %rdx,%rdi - addq (%rbp),%r12 - xorq %rdx,%r14 - - xorq %r8,%rdi - rorq $14,%r13 - movq %r8,%rcx - - andq %rdi,%r15 - rorq $28,%r14 - addq %r13,%r12 - - xorq %r15,%rcx - addq %r12,%r10 - addq %r12,%rcx - - leaq 24(%rbp),%rbp - movq 120(%rsp),%r13 - movq 96(%rsp),%r15 - - movq %r13,%r12 - rorq $7,%r13 - addq %r14,%rcx - movq %r15,%r14 - rorq $42,%r15 - - xorq %r12,%r13 - shrq $7,%r12 - rorq $1,%r13 - xorq %r14,%r15 - shrq $6,%r14 - - rorq $19,%r15 - xorq %r13,%r12 - xorq %r14,%r15 - addq 56(%rsp),%r12 - - addq 112(%rsp),%r12 - movq %r10,%r13 - addq %r15,%r12 - movq %rcx,%r14 - rorq $23,%r13 - movq %r11,%r15 - - xorq %r10,%r13 - rorq $5,%r14 - xorq %rax,%r15 - - movq %r12,112(%rsp) - xorq %rcx,%r14 - andq %r10,%r15 - - rorq $4,%r13 - addq %rbx,%r12 - xorq %rax,%r15 - - rorq $6,%r14 - xorq %r10,%r13 - addq %r15,%r12 - - movq %rcx,%r15 - addq (%rbp),%r12 - xorq %rcx,%r14 - - xorq %rdx,%r15 - rorq $14,%r13 - movq %rdx,%rbx - - andq %r15,%rdi - rorq $28,%r14 - addq %r13,%r12 - - xorq %rdi,%rbx - addq %r12,%r9 - addq %r12,%rbx - - leaq 8(%rbp),%rbp - movq 0(%rsp),%r13 - movq 104(%rsp),%rdi - - movq %r13,%r12 - rorq $7,%r13 - addq %r14,%rbx - movq %rdi,%r14 - rorq $42,%rdi - - xorq %r12,%r13 - shrq $7,%r12 - rorq $1,%r13 - xorq %r14,%rdi - shrq $6,%r14 - - rorq $19,%rdi - xorq %r13,%r12 - xorq %r14,%rdi - addq 64(%rsp),%r12 - - addq 120(%rsp),%r12 - movq %r9,%r13 - addq %rdi,%r12 - movq %rbx,%r14 - rorq $23,%r13 - movq %r10,%rdi - - xorq %r9,%r13 - rorq $5,%r14 - xorq %r11,%rdi - - movq %r12,120(%rsp) - xorq %rbx,%r14 - andq %r9,%rdi - - rorq $4,%r13 - addq %rax,%r12 - xorq %r11,%rdi - - rorq $6,%r14 - xorq %r9,%r13 - addq %rdi,%r12 - - movq %rbx,%rdi - addq (%rbp),%r12 - xorq %rbx,%r14 - - xorq %rcx,%rdi - rorq $14,%r13 - movq %rcx,%rax - - andq %rdi,%r15 - rorq $28,%r14 - addq %r13,%r12 - - xorq %r15,%rax - addq %r12,%r8 - addq %r12,%rax - - leaq 24(%rbp),%rbp - cmpb $0,7(%rbp) - jnz .Lrounds_16_xx - - movq 128+0(%rsp),%rdi - addq %r14,%rax - leaq 128(%rsi),%rsi - - addq 0(%rdi),%rax - addq 8(%rdi),%rbx - addq 16(%rdi),%rcx - addq 24(%rdi),%rdx - addq 32(%rdi),%r8 - addq 40(%rdi),%r9 - addq 48(%rdi),%r10 - addq 56(%rdi),%r11 - - cmpq 128+16(%rsp),%rsi - - movq %rax,0(%rdi) - movq %rbx,8(%rdi) - movq %rcx,16(%rdi) - movq %rdx,24(%rdi) - movq %r8,32(%rdi) - movq %r9,40(%rdi) - movq %r10,48(%rdi) - movq %r11,56(%rdi) - jb .Lloop - - movq 152(%rsp),%rsi -.cfi_def_cfa %rsi,8 - movq -48(%rsi),%r15 -.cfi_restore %r15 - movq -40(%rsi),%r14 -.cfi_restore %r14 - movq -32(%rsi),%r13 -.cfi_restore %r13 - movq -24(%rsi),%r12 -.cfi_restore %r12 - movq -16(%rsi),%rbp -.cfi_restore %rbp - movq -8(%rsi),%rbx -.cfi_restore %rbx - leaq (%rsi),%rsp -.cfi_def_cfa_register %rsp -.Lepilogue: - .byte 0xf3,0xc3 -.cfi_endproc -.size GFp_sha512_block_data_order,.-GFp_sha512_block_data_order -.align 64 -.type K512,@object -K512: -.quad 0x428a2f98d728ae22,0x7137449123ef65cd -.quad 0x428a2f98d728ae22,0x7137449123ef65cd -.quad 0xb5c0fbcfec4d3b2f,0xe9b5dba58189dbbc -.quad 0xb5c0fbcfec4d3b2f,0xe9b5dba58189dbbc -.quad 0x3956c25bf348b538,0x59f111f1b605d019 -.quad 0x3956c25bf348b538,0x59f111f1b605d019 -.quad 0x923f82a4af194f9b,0xab1c5ed5da6d8118 -.quad 0x923f82a4af194f9b,0xab1c5ed5da6d8118 -.quad 0xd807aa98a3030242,0x12835b0145706fbe -.quad 0xd807aa98a3030242,0x12835b0145706fbe -.quad 0x243185be4ee4b28c,0x550c7dc3d5ffb4e2 -.quad 0x243185be4ee4b28c,0x550c7dc3d5ffb4e2 -.quad 0x72be5d74f27b896f,0x80deb1fe3b1696b1 -.quad 0x72be5d74f27b896f,0x80deb1fe3b1696b1 -.quad 0x9bdc06a725c71235,0xc19bf174cf692694 -.quad 0x9bdc06a725c71235,0xc19bf174cf692694 -.quad 0xe49b69c19ef14ad2,0xefbe4786384f25e3 -.quad 0xe49b69c19ef14ad2,0xefbe4786384f25e3 -.quad 0x0fc19dc68b8cd5b5,0x240ca1cc77ac9c65 -.quad 0x0fc19dc68b8cd5b5,0x240ca1cc77ac9c65 -.quad 0x2de92c6f592b0275,0x4a7484aa6ea6e483 -.quad 0x2de92c6f592b0275,0x4a7484aa6ea6e483 -.quad 0x5cb0a9dcbd41fbd4,0x76f988da831153b5 -.quad 0x5cb0a9dcbd41fbd4,0x76f988da831153b5 -.quad 0x983e5152ee66dfab,0xa831c66d2db43210 -.quad 0x983e5152ee66dfab,0xa831c66d2db43210 -.quad 0xb00327c898fb213f,0xbf597fc7beef0ee4 -.quad 0xb00327c898fb213f,0xbf597fc7beef0ee4 -.quad 0xc6e00bf33da88fc2,0xd5a79147930aa725 -.quad 0xc6e00bf33da88fc2,0xd5a79147930aa725 -.quad 0x06ca6351e003826f,0x142929670a0e6e70 -.quad 0x06ca6351e003826f,0x142929670a0e6e70 -.quad 0x27b70a8546d22ffc,0x2e1b21385c26c926 -.quad 0x27b70a8546d22ffc,0x2e1b21385c26c926 -.quad 0x4d2c6dfc5ac42aed,0x53380d139d95b3df -.quad 0x4d2c6dfc5ac42aed,0x53380d139d95b3df -.quad 0x650a73548baf63de,0x766a0abb3c77b2a8 -.quad 0x650a73548baf63de,0x766a0abb3c77b2a8 -.quad 0x81c2c92e47edaee6,0x92722c851482353b -.quad 0x81c2c92e47edaee6,0x92722c851482353b -.quad 0xa2bfe8a14cf10364,0xa81a664bbc423001 -.quad 0xa2bfe8a14cf10364,0xa81a664bbc423001 -.quad 0xc24b8b70d0f89791,0xc76c51a30654be30 -.quad 0xc24b8b70d0f89791,0xc76c51a30654be30 -.quad 0xd192e819d6ef5218,0xd69906245565a910 -.quad 0xd192e819d6ef5218,0xd69906245565a910 -.quad 0xf40e35855771202a,0x106aa07032bbd1b8 -.quad 0xf40e35855771202a,0x106aa07032bbd1b8 -.quad 0x19a4c116b8d2d0c8,0x1e376c085141ab53 -.quad 0x19a4c116b8d2d0c8,0x1e376c085141ab53 -.quad 0x2748774cdf8eeb99,0x34b0bcb5e19b48a8 -.quad 0x2748774cdf8eeb99,0x34b0bcb5e19b48a8 -.quad 0x391c0cb3c5c95a63,0x4ed8aa4ae3418acb -.quad 0x391c0cb3c5c95a63,0x4ed8aa4ae3418acb -.quad 0x5b9cca4f7763e373,0x682e6ff3d6b2b8a3 -.quad 0x5b9cca4f7763e373,0x682e6ff3d6b2b8a3 -.quad 0x748f82ee5defb2fc,0x78a5636f43172f60 -.quad 0x748f82ee5defb2fc,0x78a5636f43172f60 -.quad 0x84c87814a1f0ab72,0x8cc702081a6439ec -.quad 0x84c87814a1f0ab72,0x8cc702081a6439ec -.quad 0x90befffa23631e28,0xa4506cebde82bde9 -.quad 0x90befffa23631e28,0xa4506cebde82bde9 -.quad 0xbef9a3f7b2c67915,0xc67178f2e372532b -.quad 0xbef9a3f7b2c67915,0xc67178f2e372532b -.quad 0xca273eceea26619c,0xd186b8c721c0c207 -.quad 0xca273eceea26619c,0xd186b8c721c0c207 -.quad 0xeada7dd6cde0eb1e,0xf57d4f7fee6ed178 -.quad 0xeada7dd6cde0eb1e,0xf57d4f7fee6ed178 -.quad 0x06f067aa72176fba,0x0a637dc5a2c898a6 -.quad 0x06f067aa72176fba,0x0a637dc5a2c898a6 -.quad 0x113f9804bef90dae,0x1b710b35131c471b -.quad 0x113f9804bef90dae,0x1b710b35131c471b -.quad 0x28db77f523047d84,0x32caab7b40c72493 -.quad 0x28db77f523047d84,0x32caab7b40c72493 -.quad 0x3c9ebe0a15c9bebc,0x431d67c49c100d4c -.quad 0x3c9ebe0a15c9bebc,0x431d67c49c100d4c -.quad 0x4cc5d4becb3e42b6,0x597f299cfc657e2a -.quad 0x4cc5d4becb3e42b6,0x597f299cfc657e2a -.quad 0x5fcb6fab3ad6faec,0x6c44198c4a475817 -.quad 0x5fcb6fab3ad6faec,0x6c44198c4a475817 - -.quad 0x0001020304050607,0x08090a0b0c0d0e0f -.quad 0x0001020304050607,0x08090a0b0c0d0e0f -.byte 83,72,65,53,49,50,32,98,108,111,99,107,32,116,114,97,110,115,102,111,114,109,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 -.type GFp_sha512_block_data_order_avx,@function -.align 64 -GFp_sha512_block_data_order_avx: -.cfi_startproc -.Lavx_shortcut: - movq %rsp,%rax -.cfi_def_cfa_register %rax - pushq %rbx -.cfi_offset %rbx,-16 - pushq %rbp -.cfi_offset %rbp,-24 - pushq %r12 -.cfi_offset %r12,-32 - pushq %r13 -.cfi_offset %r13,-40 - pushq %r14 -.cfi_offset %r14,-48 - pushq %r15 -.cfi_offset %r15,-56 - shlq $4,%rdx - subq $160,%rsp - leaq (%rsi,%rdx,8),%rdx - andq $-64,%rsp - movq %rdi,128+0(%rsp) - movq %rsi,128+8(%rsp) - movq %rdx,128+16(%rsp) - movq %rax,152(%rsp) -.cfi_escape 0x0f,0x06,0x77,0x98,0x01,0x06,0x23,0x08 -.Lprologue_avx: - - vzeroupper - movq 0(%rdi),%rax - movq 8(%rdi),%rbx - movq 16(%rdi),%rcx - movq 24(%rdi),%rdx - movq 32(%rdi),%r8 - movq 40(%rdi),%r9 - movq 48(%rdi),%r10 - movq 56(%rdi),%r11 - jmp .Lloop_avx -.align 16 -.Lloop_avx: - vmovdqa K512+1280(%rip),%xmm11 - vmovdqu 0(%rsi),%xmm0 - leaq K512+128(%rip),%rbp - vmovdqu 16(%rsi),%xmm1 - vmovdqu 32(%rsi),%xmm2 - vpshufb %xmm11,%xmm0,%xmm0 - vmovdqu 48(%rsi),%xmm3 - vpshufb %xmm11,%xmm1,%xmm1 - vmovdqu 64(%rsi),%xmm4 - vpshufb %xmm11,%xmm2,%xmm2 - vmovdqu 80(%rsi),%xmm5 - vpshufb %xmm11,%xmm3,%xmm3 - vmovdqu 96(%rsi),%xmm6 - vpshufb %xmm11,%xmm4,%xmm4 - vmovdqu 112(%rsi),%xmm7 - vpshufb %xmm11,%xmm5,%xmm5 - vpaddq -128(%rbp),%xmm0,%xmm8 - vpshufb %xmm11,%xmm6,%xmm6 - vpaddq -96(%rbp),%xmm1,%xmm9 - vpshufb %xmm11,%xmm7,%xmm7 - vpaddq -64(%rbp),%xmm2,%xmm10 - vpaddq -32(%rbp),%xmm3,%xmm11 - vmovdqa %xmm8,0(%rsp) - vpaddq 0(%rbp),%xmm4,%xmm8 - vmovdqa %xmm9,16(%rsp) - vpaddq 32(%rbp),%xmm5,%xmm9 - vmovdqa %xmm10,32(%rsp) - vpaddq 64(%rbp),%xmm6,%xmm10 - vmovdqa %xmm11,48(%rsp) - vpaddq 96(%rbp),%xmm7,%xmm11 - vmovdqa %xmm8,64(%rsp) - movq %rax,%r14 - vmovdqa %xmm9,80(%rsp) - movq %rbx,%rdi - vmovdqa %xmm10,96(%rsp) - xorq %rcx,%rdi - vmovdqa %xmm11,112(%rsp) - movq %r8,%r13 - jmp .Lavx_00_47 - -.align 16 -.Lavx_00_47: - addq $256,%rbp - vpalignr $8,%xmm0,%xmm1,%xmm8 - shrdq $23,%r13,%r13 - movq %r14,%rax - vpalignr $8,%xmm4,%xmm5,%xmm11 - movq %r9,%r12 - shrdq $5,%r14,%r14 - vpsrlq $1,%xmm8,%xmm10 - xorq %r8,%r13 - xorq %r10,%r12 - vpaddq %xmm11,%xmm0,%xmm0 - shrdq $4,%r13,%r13 - xorq %rax,%r14 - vpsrlq $7,%xmm8,%xmm11 - andq %r8,%r12 - xorq %r8,%r13 - vpsllq $56,%xmm8,%xmm9 - addq 0(%rsp),%r11 - movq %rax,%r15 - vpxor %xmm10,%xmm11,%xmm8 - xorq %r10,%r12 - shrdq $6,%r14,%r14 - vpsrlq $7,%xmm10,%xmm10 - xorq %rbx,%r15 - addq %r12,%r11 - vpxor %xmm9,%xmm8,%xmm8 - shrdq $14,%r13,%r13 - andq %r15,%rdi - vpsllq $7,%xmm9,%xmm9 - xorq %rax,%r14 - addq %r13,%r11 - vpxor %xmm10,%xmm8,%xmm8 - xorq %rbx,%rdi - shrdq $28,%r14,%r14 - vpsrlq $6,%xmm7,%xmm11 - addq %r11,%rdx - addq %rdi,%r11 - vpxor %xmm9,%xmm8,%xmm8 - movq %rdx,%r13 - addq %r11,%r14 - vpsllq $3,%xmm7,%xmm10 - shrdq $23,%r13,%r13 - movq %r14,%r11 - vpaddq %xmm8,%xmm0,%xmm0 - movq %r8,%r12 - shrdq $5,%r14,%r14 - vpsrlq $19,%xmm7,%xmm9 - xorq %rdx,%r13 - xorq %r9,%r12 - vpxor %xmm10,%xmm11,%xmm11 - shrdq $4,%r13,%r13 - xorq %r11,%r14 - vpsllq $42,%xmm10,%xmm10 - andq %rdx,%r12 - xorq %rdx,%r13 - vpxor %xmm9,%xmm11,%xmm11 - addq 8(%rsp),%r10 - movq %r11,%rdi - vpsrlq $42,%xmm9,%xmm9 - xorq %r9,%r12 - shrdq $6,%r14,%r14 - vpxor %xmm10,%xmm11,%xmm11 - xorq %rax,%rdi - addq %r12,%r10 - vpxor %xmm9,%xmm11,%xmm11 - shrdq $14,%r13,%r13 - andq %rdi,%r15 - vpaddq %xmm11,%xmm0,%xmm0 - xorq %r11,%r14 - addq %r13,%r10 - vpaddq -128(%rbp),%xmm0,%xmm10 - xorq %rax,%r15 - shrdq $28,%r14,%r14 - addq %r10,%rcx - addq %r15,%r10 - movq %rcx,%r13 - addq %r10,%r14 - vmovdqa %xmm10,0(%rsp) - vpalignr $8,%xmm1,%xmm2,%xmm8 - shrdq $23,%r13,%r13 - movq %r14,%r10 - vpalignr $8,%xmm5,%xmm6,%xmm11 - movq %rdx,%r12 - shrdq $5,%r14,%r14 - vpsrlq $1,%xmm8,%xmm10 - xorq %rcx,%r13 - xorq %r8,%r12 - vpaddq %xmm11,%xmm1,%xmm1 - shrdq $4,%r13,%r13 - xorq %r10,%r14 - vpsrlq $7,%xmm8,%xmm11 - andq %rcx,%r12 - xorq %rcx,%r13 - vpsllq $56,%xmm8,%xmm9 - addq 16(%rsp),%r9 - movq %r10,%r15 - vpxor %xmm10,%xmm11,%xmm8 - xorq %r8,%r12 - shrdq $6,%r14,%r14 - vpsrlq $7,%xmm10,%xmm10 - xorq %r11,%r15 - addq %r12,%r9 - vpxor %xmm9,%xmm8,%xmm8 - shrdq $14,%r13,%r13 - andq %r15,%rdi - vpsllq $7,%xmm9,%xmm9 - xorq %r10,%r14 - addq %r13,%r9 - vpxor %xmm10,%xmm8,%xmm8 - xorq %r11,%rdi - shrdq $28,%r14,%r14 - vpsrlq $6,%xmm0,%xmm11 - addq %r9,%rbx - addq %rdi,%r9 - vpxor %xmm9,%xmm8,%xmm8 - movq %rbx,%r13 - addq %r9,%r14 - vpsllq $3,%xmm0,%xmm10 - shrdq $23,%r13,%r13 - movq %r14,%r9 - vpaddq %xmm8,%xmm1,%xmm1 - movq %rcx,%r12 - shrdq $5,%r14,%r14 - vpsrlq $19,%xmm0,%xmm9 - xorq %rbx,%r13 - xorq %rdx,%r12 - vpxor %xmm10,%xmm11,%xmm11 - shrdq $4,%r13,%r13 - xorq %r9,%r14 - vpsllq $42,%xmm10,%xmm10 - andq %rbx,%r12 - xorq %rbx,%r13 - vpxor %xmm9,%xmm11,%xmm11 - addq 24(%rsp),%r8 - movq %r9,%rdi - vpsrlq $42,%xmm9,%xmm9 - xorq %rdx,%r12 - shrdq $6,%r14,%r14 - vpxor %xmm10,%xmm11,%xmm11 - xorq %r10,%rdi - addq %r12,%r8 - vpxor %xmm9,%xmm11,%xmm11 - shrdq $14,%r13,%r13 - andq %rdi,%r15 - vpaddq %xmm11,%xmm1,%xmm1 - xorq %r9,%r14 - addq %r13,%r8 - vpaddq -96(%rbp),%xmm1,%xmm10 - xorq %r10,%r15 - shrdq $28,%r14,%r14 - addq %r8,%rax - addq %r15,%r8 - movq %rax,%r13 - addq %r8,%r14 - vmovdqa %xmm10,16(%rsp) - vpalignr $8,%xmm2,%xmm3,%xmm8 - shrdq $23,%r13,%r13 - movq %r14,%r8 - vpalignr $8,%xmm6,%xmm7,%xmm11 - movq %rbx,%r12 - shrdq $5,%r14,%r14 - vpsrlq $1,%xmm8,%xmm10 - xorq %rax,%r13 - xorq %rcx,%r12 - vpaddq %xmm11,%xmm2,%xmm2 - shrdq $4,%r13,%r13 - xorq %r8,%r14 - vpsrlq $7,%xmm8,%xmm11 - andq %rax,%r12 - xorq %rax,%r13 - vpsllq $56,%xmm8,%xmm9 - addq 32(%rsp),%rdx - movq %r8,%r15 - vpxor %xmm10,%xmm11,%xmm8 - xorq %rcx,%r12 - shrdq $6,%r14,%r14 - vpsrlq $7,%xmm10,%xmm10 - xorq %r9,%r15 - addq %r12,%rdx - vpxor %xmm9,%xmm8,%xmm8 - shrdq $14,%r13,%r13 - andq %r15,%rdi - vpsllq $7,%xmm9,%xmm9 - xorq %r8,%r14 - addq %r13,%rdx - vpxor %xmm10,%xmm8,%xmm8 - xorq %r9,%rdi - shrdq $28,%r14,%r14 - vpsrlq $6,%xmm1,%xmm11 - addq %rdx,%r11 - addq %rdi,%rdx - vpxor %xmm9,%xmm8,%xmm8 - movq %r11,%r13 - addq %rdx,%r14 - vpsllq $3,%xmm1,%xmm10 - shrdq $23,%r13,%r13 - movq %r14,%rdx - vpaddq %xmm8,%xmm2,%xmm2 - movq %rax,%r12 - shrdq $5,%r14,%r14 - vpsrlq $19,%xmm1,%xmm9 - xorq %r11,%r13 - xorq %rbx,%r12 - vpxor %xmm10,%xmm11,%xmm11 - shrdq $4,%r13,%r13 - xorq %rdx,%r14 - vpsllq $42,%xmm10,%xmm10 - andq %r11,%r12 - xorq %r11,%r13 - vpxor %xmm9,%xmm11,%xmm11 - addq 40(%rsp),%rcx - movq %rdx,%rdi - vpsrlq $42,%xmm9,%xmm9 - xorq %rbx,%r12 - shrdq $6,%r14,%r14 - vpxor %xmm10,%xmm11,%xmm11 - xorq %r8,%rdi - addq %r12,%rcx - vpxor %xmm9,%xmm11,%xmm11 - shrdq $14,%r13,%r13 - andq %rdi,%r15 - vpaddq %xmm11,%xmm2,%xmm2 - xorq %rdx,%r14 - addq %r13,%rcx - vpaddq -64(%rbp),%xmm2,%xmm10 - xorq %r8,%r15 - shrdq $28,%r14,%r14 - addq %rcx,%r10 - addq %r15,%rcx - movq %r10,%r13 - addq %rcx,%r14 - vmovdqa %xmm10,32(%rsp) - vpalignr $8,%xmm3,%xmm4,%xmm8 - shrdq $23,%r13,%r13 - movq %r14,%rcx - vpalignr $8,%xmm7,%xmm0,%xmm11 - movq %r11,%r12 - shrdq $5,%r14,%r14 - vpsrlq $1,%xmm8,%xmm10 - xorq %r10,%r13 - xorq %rax,%r12 - vpaddq %xmm11,%xmm3,%xmm3 - shrdq $4,%r13,%r13 - xorq %rcx,%r14 - vpsrlq $7,%xmm8,%xmm11 - andq %r10,%r12 - xorq %r10,%r13 - vpsllq $56,%xmm8,%xmm9 - addq 48(%rsp),%rbx - movq %rcx,%r15 - vpxor %xmm10,%xmm11,%xmm8 - xorq %rax,%r12 - shrdq $6,%r14,%r14 - vpsrlq $7,%xmm10,%xmm10 - xorq %rdx,%r15 - addq %r12,%rbx - vpxor %xmm9,%xmm8,%xmm8 - shrdq $14,%r13,%r13 - andq %r15,%rdi - vpsllq $7,%xmm9,%xmm9 - xorq %rcx,%r14 - addq %r13,%rbx - vpxor %xmm10,%xmm8,%xmm8 - xorq %rdx,%rdi - shrdq $28,%r14,%r14 - vpsrlq $6,%xmm2,%xmm11 - addq %rbx,%r9 - addq %rdi,%rbx - vpxor %xmm9,%xmm8,%xmm8 - movq %r9,%r13 - addq %rbx,%r14 - vpsllq $3,%xmm2,%xmm10 - shrdq $23,%r13,%r13 - movq %r14,%rbx - vpaddq %xmm8,%xmm3,%xmm3 - movq %r10,%r12 - shrdq $5,%r14,%r14 - vpsrlq $19,%xmm2,%xmm9 - xorq %r9,%r13 - xorq %r11,%r12 - vpxor %xmm10,%xmm11,%xmm11 - shrdq $4,%r13,%r13 - xorq %rbx,%r14 - vpsllq $42,%xmm10,%xmm10 - andq %r9,%r12 - xorq %r9,%r13 - vpxor %xmm9,%xmm11,%xmm11 - addq 56(%rsp),%rax - movq %rbx,%rdi - vpsrlq $42,%xmm9,%xmm9 - xorq %r11,%r12 - shrdq $6,%r14,%r14 - vpxor %xmm10,%xmm11,%xmm11 - xorq %rcx,%rdi - addq %r12,%rax - vpxor %xmm9,%xmm11,%xmm11 - shrdq $14,%r13,%r13 - andq %rdi,%r15 - vpaddq %xmm11,%xmm3,%xmm3 - xorq %rbx,%r14 - addq %r13,%rax - vpaddq -32(%rbp),%xmm3,%xmm10 - xorq %rcx,%r15 - shrdq $28,%r14,%r14 - addq %rax,%r8 - addq %r15,%rax - movq %r8,%r13 - addq %rax,%r14 - vmovdqa %xmm10,48(%rsp) - vpalignr $8,%xmm4,%xmm5,%xmm8 - shrdq $23,%r13,%r13 - movq %r14,%rax - vpalignr $8,%xmm0,%xmm1,%xmm11 - movq %r9,%r12 - shrdq $5,%r14,%r14 - vpsrlq $1,%xmm8,%xmm10 - xorq %r8,%r13 - xorq %r10,%r12 - vpaddq %xmm11,%xmm4,%xmm4 - shrdq $4,%r13,%r13 - xorq %rax,%r14 - vpsrlq $7,%xmm8,%xmm11 - andq %r8,%r12 - xorq %r8,%r13 - vpsllq $56,%xmm8,%xmm9 - addq 64(%rsp),%r11 - movq %rax,%r15 - vpxor %xmm10,%xmm11,%xmm8 - xorq %r10,%r12 - shrdq $6,%r14,%r14 - vpsrlq $7,%xmm10,%xmm10 - xorq %rbx,%r15 - addq %r12,%r11 - vpxor %xmm9,%xmm8,%xmm8 - shrdq $14,%r13,%r13 - andq %r15,%rdi - vpsllq $7,%xmm9,%xmm9 - xorq %rax,%r14 - addq %r13,%r11 - vpxor %xmm10,%xmm8,%xmm8 - xorq %rbx,%rdi - shrdq $28,%r14,%r14 - vpsrlq $6,%xmm3,%xmm11 - addq %r11,%rdx - addq %rdi,%r11 - vpxor %xmm9,%xmm8,%xmm8 - movq %rdx,%r13 - addq %r11,%r14 - vpsllq $3,%xmm3,%xmm10 - shrdq $23,%r13,%r13 - movq %r14,%r11 - vpaddq %xmm8,%xmm4,%xmm4 - movq %r8,%r12 - shrdq $5,%r14,%r14 - vpsrlq $19,%xmm3,%xmm9 - xorq %rdx,%r13 - xorq %r9,%r12 - vpxor %xmm10,%xmm11,%xmm11 - shrdq $4,%r13,%r13 - xorq %r11,%r14 - vpsllq $42,%xmm10,%xmm10 - andq %rdx,%r12 - xorq %rdx,%r13 - vpxor %xmm9,%xmm11,%xmm11 - addq 72(%rsp),%r10 - movq %r11,%rdi - vpsrlq $42,%xmm9,%xmm9 - xorq %r9,%r12 - shrdq $6,%r14,%r14 - vpxor %xmm10,%xmm11,%xmm11 - xorq %rax,%rdi - addq %r12,%r10 - vpxor %xmm9,%xmm11,%xmm11 - shrdq $14,%r13,%r13 - andq %rdi,%r15 - vpaddq %xmm11,%xmm4,%xmm4 - xorq %r11,%r14 - addq %r13,%r10 - vpaddq 0(%rbp),%xmm4,%xmm10 - xorq %rax,%r15 - shrdq $28,%r14,%r14 - addq %r10,%rcx - addq %r15,%r10 - movq %rcx,%r13 - addq %r10,%r14 - vmovdqa %xmm10,64(%rsp) - vpalignr $8,%xmm5,%xmm6,%xmm8 - shrdq $23,%r13,%r13 - movq %r14,%r10 - vpalignr $8,%xmm1,%xmm2,%xmm11 - movq %rdx,%r12 - shrdq $5,%r14,%r14 - vpsrlq $1,%xmm8,%xmm10 - xorq %rcx,%r13 - xorq %r8,%r12 - vpaddq %xmm11,%xmm5,%xmm5 - shrdq $4,%r13,%r13 - xorq %r10,%r14 - vpsrlq $7,%xmm8,%xmm11 - andq %rcx,%r12 - xorq %rcx,%r13 - vpsllq $56,%xmm8,%xmm9 - addq 80(%rsp),%r9 - movq %r10,%r15 - vpxor %xmm10,%xmm11,%xmm8 - xorq %r8,%r12 - shrdq $6,%r14,%r14 - vpsrlq $7,%xmm10,%xmm10 - xorq %r11,%r15 - addq %r12,%r9 - vpxor %xmm9,%xmm8,%xmm8 - shrdq $14,%r13,%r13 - andq %r15,%rdi - vpsllq $7,%xmm9,%xmm9 - xorq %r10,%r14 - addq %r13,%r9 - vpxor %xmm10,%xmm8,%xmm8 - xorq %r11,%rdi - shrdq $28,%r14,%r14 - vpsrlq $6,%xmm4,%xmm11 - addq %r9,%rbx - addq %rdi,%r9 - vpxor %xmm9,%xmm8,%xmm8 - movq %rbx,%r13 - addq %r9,%r14 - vpsllq $3,%xmm4,%xmm10 - shrdq $23,%r13,%r13 - movq %r14,%r9 - vpaddq %xmm8,%xmm5,%xmm5 - movq %rcx,%r12 - shrdq $5,%r14,%r14 - vpsrlq $19,%xmm4,%xmm9 - xorq %rbx,%r13 - xorq %rdx,%r12 - vpxor %xmm10,%xmm11,%xmm11 - shrdq $4,%r13,%r13 - xorq %r9,%r14 - vpsllq $42,%xmm10,%xmm10 - andq %rbx,%r12 - xorq %rbx,%r13 - vpxor %xmm9,%xmm11,%xmm11 - addq 88(%rsp),%r8 - movq %r9,%rdi - vpsrlq $42,%xmm9,%xmm9 - xorq %rdx,%r12 - shrdq $6,%r14,%r14 - vpxor %xmm10,%xmm11,%xmm11 - xorq %r10,%rdi - addq %r12,%r8 - vpxor %xmm9,%xmm11,%xmm11 - shrdq $14,%r13,%r13 - andq %rdi,%r15 - vpaddq %xmm11,%xmm5,%xmm5 - xorq %r9,%r14 - addq %r13,%r8 - vpaddq 32(%rbp),%xmm5,%xmm10 - xorq %r10,%r15 - shrdq $28,%r14,%r14 - addq %r8,%rax - addq %r15,%r8 - movq %rax,%r13 - addq %r8,%r14 - vmovdqa %xmm10,80(%rsp) - vpalignr $8,%xmm6,%xmm7,%xmm8 - shrdq $23,%r13,%r13 - movq %r14,%r8 - vpalignr $8,%xmm2,%xmm3,%xmm11 - movq %rbx,%r12 - shrdq $5,%r14,%r14 - vpsrlq $1,%xmm8,%xmm10 - xorq %rax,%r13 - xorq %rcx,%r12 - vpaddq %xmm11,%xmm6,%xmm6 - shrdq $4,%r13,%r13 - xorq %r8,%r14 - vpsrlq $7,%xmm8,%xmm11 - andq %rax,%r12 - xorq %rax,%r13 - vpsllq $56,%xmm8,%xmm9 - addq 96(%rsp),%rdx - movq %r8,%r15 - vpxor %xmm10,%xmm11,%xmm8 - xorq %rcx,%r12 - shrdq $6,%r14,%r14 - vpsrlq $7,%xmm10,%xmm10 - xorq %r9,%r15 - addq %r12,%rdx - vpxor %xmm9,%xmm8,%xmm8 - shrdq $14,%r13,%r13 - andq %r15,%rdi - vpsllq $7,%xmm9,%xmm9 - xorq %r8,%r14 - addq %r13,%rdx - vpxor %xmm10,%xmm8,%xmm8 - xorq %r9,%rdi - shrdq $28,%r14,%r14 - vpsrlq $6,%xmm5,%xmm11 - addq %rdx,%r11 - addq %rdi,%rdx - vpxor %xmm9,%xmm8,%xmm8 - movq %r11,%r13 - addq %rdx,%r14 - vpsllq $3,%xmm5,%xmm10 - shrdq $23,%r13,%r13 - movq %r14,%rdx - vpaddq %xmm8,%xmm6,%xmm6 - movq %rax,%r12 - shrdq $5,%r14,%r14 - vpsrlq $19,%xmm5,%xmm9 - xorq %r11,%r13 - xorq %rbx,%r12 - vpxor %xmm10,%xmm11,%xmm11 - shrdq $4,%r13,%r13 - xorq %rdx,%r14 - vpsllq $42,%xmm10,%xmm10 - andq %r11,%r12 - xorq %r11,%r13 - vpxor %xmm9,%xmm11,%xmm11 - addq 104(%rsp),%rcx - movq %rdx,%rdi - vpsrlq $42,%xmm9,%xmm9 - xorq %rbx,%r12 - shrdq $6,%r14,%r14 - vpxor %xmm10,%xmm11,%xmm11 - xorq %r8,%rdi - addq %r12,%rcx - vpxor %xmm9,%xmm11,%xmm11 - shrdq $14,%r13,%r13 - andq %rdi,%r15 - vpaddq %xmm11,%xmm6,%xmm6 - xorq %rdx,%r14 - addq %r13,%rcx - vpaddq 64(%rbp),%xmm6,%xmm10 - xorq %r8,%r15 - shrdq $28,%r14,%r14 - addq %rcx,%r10 - addq %r15,%rcx - movq %r10,%r13 - addq %rcx,%r14 - vmovdqa %xmm10,96(%rsp) - vpalignr $8,%xmm7,%xmm0,%xmm8 - shrdq $23,%r13,%r13 - movq %r14,%rcx - vpalignr $8,%xmm3,%xmm4,%xmm11 - movq %r11,%r12 - shrdq $5,%r14,%r14 - vpsrlq $1,%xmm8,%xmm10 - xorq %r10,%r13 - xorq %rax,%r12 - vpaddq %xmm11,%xmm7,%xmm7 - shrdq $4,%r13,%r13 - xorq %rcx,%r14 - vpsrlq $7,%xmm8,%xmm11 - andq %r10,%r12 - xorq %r10,%r13 - vpsllq $56,%xmm8,%xmm9 - addq 112(%rsp),%rbx - movq %rcx,%r15 - vpxor %xmm10,%xmm11,%xmm8 - xorq %rax,%r12 - shrdq $6,%r14,%r14 - vpsrlq $7,%xmm10,%xmm10 - xorq %rdx,%r15 - addq %r12,%rbx - vpxor %xmm9,%xmm8,%xmm8 - shrdq $14,%r13,%r13 - andq %r15,%rdi - vpsllq $7,%xmm9,%xmm9 - xorq %rcx,%r14 - addq %r13,%rbx - vpxor %xmm10,%xmm8,%xmm8 - xorq %rdx,%rdi - shrdq $28,%r14,%r14 - vpsrlq $6,%xmm6,%xmm11 - addq %rbx,%r9 - addq %rdi,%rbx - vpxor %xmm9,%xmm8,%xmm8 - movq %r9,%r13 - addq %rbx,%r14 - vpsllq $3,%xmm6,%xmm10 - shrdq $23,%r13,%r13 - movq %r14,%rbx - vpaddq %xmm8,%xmm7,%xmm7 - movq %r10,%r12 - shrdq $5,%r14,%r14 - vpsrlq $19,%xmm6,%xmm9 - xorq %r9,%r13 - xorq %r11,%r12 - vpxor %xmm10,%xmm11,%xmm11 - shrdq $4,%r13,%r13 - xorq %rbx,%r14 - vpsllq $42,%xmm10,%xmm10 - andq %r9,%r12 - xorq %r9,%r13 - vpxor %xmm9,%xmm11,%xmm11 - addq 120(%rsp),%rax - movq %rbx,%rdi - vpsrlq $42,%xmm9,%xmm9 - xorq %r11,%r12 - shrdq $6,%r14,%r14 - vpxor %xmm10,%xmm11,%xmm11 - xorq %rcx,%rdi - addq %r12,%rax - vpxor %xmm9,%xmm11,%xmm11 - shrdq $14,%r13,%r13 - andq %rdi,%r15 - vpaddq %xmm11,%xmm7,%xmm7 - xorq %rbx,%r14 - addq %r13,%rax - vpaddq 96(%rbp),%xmm7,%xmm10 - xorq %rcx,%r15 - shrdq $28,%r14,%r14 - addq %rax,%r8 - addq %r15,%rax - movq %r8,%r13 - addq %rax,%r14 - vmovdqa %xmm10,112(%rsp) - cmpb $0,135(%rbp) - jne .Lavx_00_47 - shrdq $23,%r13,%r13 - movq %r14,%rax - movq %r9,%r12 - shrdq $5,%r14,%r14 - xorq %r8,%r13 - xorq %r10,%r12 - shrdq $4,%r13,%r13 - xorq %rax,%r14 - andq %r8,%r12 - xorq %r8,%r13 - addq 0(%rsp),%r11 - movq %rax,%r15 - xorq %r10,%r12 - shrdq $6,%r14,%r14 - xorq %rbx,%r15 - addq %r12,%r11 - shrdq $14,%r13,%r13 - andq %r15,%rdi - xorq %rax,%r14 - addq %r13,%r11 - xorq %rbx,%rdi - shrdq $28,%r14,%r14 - addq %r11,%rdx - addq %rdi,%r11 - movq %rdx,%r13 - addq %r11,%r14 - shrdq $23,%r13,%r13 - movq %r14,%r11 - movq %r8,%r12 - shrdq $5,%r14,%r14 - xorq %rdx,%r13 - xorq %r9,%r12 - shrdq $4,%r13,%r13 - xorq %r11,%r14 - andq %rdx,%r12 - xorq %rdx,%r13 - addq 8(%rsp),%r10 - movq %r11,%rdi - xorq %r9,%r12 - shrdq $6,%r14,%r14 - xorq %rax,%rdi - addq %r12,%r10 - shrdq $14,%r13,%r13 - andq %rdi,%r15 - xorq %r11,%r14 - addq %r13,%r10 - xorq %rax,%r15 - shrdq $28,%r14,%r14 - addq %r10,%rcx - addq %r15,%r10 - movq %rcx,%r13 - addq %r10,%r14 - shrdq $23,%r13,%r13 - movq %r14,%r10 - movq %rdx,%r12 - shrdq $5,%r14,%r14 - xorq %rcx,%r13 - xorq %r8,%r12 - shrdq $4,%r13,%r13 - xorq %r10,%r14 - andq %rcx,%r12 - xorq %rcx,%r13 - addq 16(%rsp),%r9 - movq %r10,%r15 - xorq %r8,%r12 - shrdq $6,%r14,%r14 - xorq %r11,%r15 - addq %r12,%r9 - shrdq $14,%r13,%r13 - andq %r15,%rdi - xorq %r10,%r14 - addq %r13,%r9 - xorq %r11,%rdi - shrdq $28,%r14,%r14 - addq %r9,%rbx - addq %rdi,%r9 - movq %rbx,%r13 - addq %r9,%r14 - shrdq $23,%r13,%r13 - movq %r14,%r9 - movq %rcx,%r12 - shrdq $5,%r14,%r14 - xorq %rbx,%r13 - xorq %rdx,%r12 - shrdq $4,%r13,%r13 - xorq %r9,%r14 - andq %rbx,%r12 - xorq %rbx,%r13 - addq 24(%rsp),%r8 - movq %r9,%rdi - xorq %rdx,%r12 - shrdq $6,%r14,%r14 - xorq %r10,%rdi - addq %r12,%r8 - shrdq $14,%r13,%r13 - andq %rdi,%r15 - xorq %r9,%r14 - addq %r13,%r8 - xorq %r10,%r15 - shrdq $28,%r14,%r14 - addq %r8,%rax - addq %r15,%r8 - movq %rax,%r13 - addq %r8,%r14 - shrdq $23,%r13,%r13 - movq %r14,%r8 - movq %rbx,%r12 - shrdq $5,%r14,%r14 - xorq %rax,%r13 - xorq %rcx,%r12 - shrdq $4,%r13,%r13 - xorq %r8,%r14 - andq %rax,%r12 - xorq %rax,%r13 - addq 32(%rsp),%rdx - movq %r8,%r15 - xorq %rcx,%r12 - shrdq $6,%r14,%r14 - xorq %r9,%r15 - addq %r12,%rdx - shrdq $14,%r13,%r13 - andq %r15,%rdi - xorq %r8,%r14 - addq %r13,%rdx - xorq %r9,%rdi - shrdq $28,%r14,%r14 - addq %rdx,%r11 - addq %rdi,%rdx - movq %r11,%r13 - addq %rdx,%r14 - shrdq $23,%r13,%r13 - movq %r14,%rdx - movq %rax,%r12 - shrdq $5,%r14,%r14 - xorq %r11,%r13 - xorq %rbx,%r12 - shrdq $4,%r13,%r13 - xorq %rdx,%r14 - andq %r11,%r12 - xorq %r11,%r13 - addq 40(%rsp),%rcx - movq %rdx,%rdi - xorq %rbx,%r12 - shrdq $6,%r14,%r14 - xorq %r8,%rdi - addq %r12,%rcx - shrdq $14,%r13,%r13 - andq %rdi,%r15 - xorq %rdx,%r14 - addq %r13,%rcx - xorq %r8,%r15 - shrdq $28,%r14,%r14 - addq %rcx,%r10 - addq %r15,%rcx - movq %r10,%r13 - addq %rcx,%r14 - shrdq $23,%r13,%r13 - movq %r14,%rcx - movq %r11,%r12 - shrdq $5,%r14,%r14 - xorq %r10,%r13 - xorq %rax,%r12 - shrdq $4,%r13,%r13 - xorq %rcx,%r14 - andq %r10,%r12 - xorq %r10,%r13 - addq 48(%rsp),%rbx - movq %rcx,%r15 - xorq %rax,%r12 - shrdq $6,%r14,%r14 - xorq %rdx,%r15 - addq %r12,%rbx - shrdq $14,%r13,%r13 - andq %r15,%rdi - xorq %rcx,%r14 - addq %r13,%rbx - xorq %rdx,%rdi - shrdq $28,%r14,%r14 - addq %rbx,%r9 - addq %rdi,%rbx - movq %r9,%r13 - addq %rbx,%r14 - shrdq $23,%r13,%r13 - movq %r14,%rbx - movq %r10,%r12 - shrdq $5,%r14,%r14 - xorq %r9,%r13 - xorq %r11,%r12 - shrdq $4,%r13,%r13 - xorq %rbx,%r14 - andq %r9,%r12 - xorq %r9,%r13 - addq 56(%rsp),%rax - movq %rbx,%rdi - xorq %r11,%r12 - shrdq $6,%r14,%r14 - xorq %rcx,%rdi - addq %r12,%rax - shrdq $14,%r13,%r13 - andq %rdi,%r15 - xorq %rbx,%r14 - addq %r13,%rax - xorq %rcx,%r15 - shrdq $28,%r14,%r14 - addq %rax,%r8 - addq %r15,%rax - movq %r8,%r13 - addq %rax,%r14 - shrdq $23,%r13,%r13 - movq %r14,%rax - movq %r9,%r12 - shrdq $5,%r14,%r14 - xorq %r8,%r13 - xorq %r10,%r12 - shrdq $4,%r13,%r13 - xorq %rax,%r14 - andq %r8,%r12 - xorq %r8,%r13 - addq 64(%rsp),%r11 - movq %rax,%r15 - xorq %r10,%r12 - shrdq $6,%r14,%r14 - xorq %rbx,%r15 - addq %r12,%r11 - shrdq $14,%r13,%r13 - andq %r15,%rdi - xorq %rax,%r14 - addq %r13,%r11 - xorq %rbx,%rdi - shrdq $28,%r14,%r14 - addq %r11,%rdx - addq %rdi,%r11 - movq %rdx,%r13 - addq %r11,%r14 - shrdq $23,%r13,%r13 - movq %r14,%r11 - movq %r8,%r12 - shrdq $5,%r14,%r14 - xorq %rdx,%r13 - xorq %r9,%r12 - shrdq $4,%r13,%r13 - xorq %r11,%r14 - andq %rdx,%r12 - xorq %rdx,%r13 - addq 72(%rsp),%r10 - movq %r11,%rdi - xorq %r9,%r12 - shrdq $6,%r14,%r14 - xorq %rax,%rdi - addq %r12,%r10 - shrdq $14,%r13,%r13 - andq %rdi,%r15 - xorq %r11,%r14 - addq %r13,%r10 - xorq %rax,%r15 - shrdq $28,%r14,%r14 - addq %r10,%rcx - addq %r15,%r10 - movq %rcx,%r13 - addq %r10,%r14 - shrdq $23,%r13,%r13 - movq %r14,%r10 - movq %rdx,%r12 - shrdq $5,%r14,%r14 - xorq %rcx,%r13 - xorq %r8,%r12 - shrdq $4,%r13,%r13 - xorq %r10,%r14 - andq %rcx,%r12 - xorq %rcx,%r13 - addq 80(%rsp),%r9 - movq %r10,%r15 - xorq %r8,%r12 - shrdq $6,%r14,%r14 - xorq %r11,%r15 - addq %r12,%r9 - shrdq $14,%r13,%r13 - andq %r15,%rdi - xorq %r10,%r14 - addq %r13,%r9 - xorq %r11,%rdi - shrdq $28,%r14,%r14 - addq %r9,%rbx - addq %rdi,%r9 - movq %rbx,%r13 - addq %r9,%r14 - shrdq $23,%r13,%r13 - movq %r14,%r9 - movq %rcx,%r12 - shrdq $5,%r14,%r14 - xorq %rbx,%r13 - xorq %rdx,%r12 - shrdq $4,%r13,%r13 - xorq %r9,%r14 - andq %rbx,%r12 - xorq %rbx,%r13 - addq 88(%rsp),%r8 - movq %r9,%rdi - xorq %rdx,%r12 - shrdq $6,%r14,%r14 - xorq %r10,%rdi - addq %r12,%r8 - shrdq $14,%r13,%r13 - andq %rdi,%r15 - xorq %r9,%r14 - addq %r13,%r8 - xorq %r10,%r15 - shrdq $28,%r14,%r14 - addq %r8,%rax - addq %r15,%r8 - movq %rax,%r13 - addq %r8,%r14 - shrdq $23,%r13,%r13 - movq %r14,%r8 - movq %rbx,%r12 - shrdq $5,%r14,%r14 - xorq %rax,%r13 - xorq %rcx,%r12 - shrdq $4,%r13,%r13 - xorq %r8,%r14 - andq %rax,%r12 - xorq %rax,%r13 - addq 96(%rsp),%rdx - movq %r8,%r15 - xorq %rcx,%r12 - shrdq $6,%r14,%r14 - xorq %r9,%r15 - addq %r12,%rdx - shrdq $14,%r13,%r13 - andq %r15,%rdi - xorq %r8,%r14 - addq %r13,%rdx - xorq %r9,%rdi - shrdq $28,%r14,%r14 - addq %rdx,%r11 - addq %rdi,%rdx - movq %r11,%r13 - addq %rdx,%r14 - shrdq $23,%r13,%r13 - movq %r14,%rdx - movq %rax,%r12 - shrdq $5,%r14,%r14 - xorq %r11,%r13 - xorq %rbx,%r12 - shrdq $4,%r13,%r13 - xorq %rdx,%r14 - andq %r11,%r12 - xorq %r11,%r13 - addq 104(%rsp),%rcx - movq %rdx,%rdi - xorq %rbx,%r12 - shrdq $6,%r14,%r14 - xorq %r8,%rdi - addq %r12,%rcx - shrdq $14,%r13,%r13 - andq %rdi,%r15 - xorq %rdx,%r14 - addq %r13,%rcx - xorq %r8,%r15 - shrdq $28,%r14,%r14 - addq %rcx,%r10 - addq %r15,%rcx - movq %r10,%r13 - addq %rcx,%r14 - shrdq $23,%r13,%r13 - movq %r14,%rcx - movq %r11,%r12 - shrdq $5,%r14,%r14 - xorq %r10,%r13 - xorq %rax,%r12 - shrdq $4,%r13,%r13 - xorq %rcx,%r14 - andq %r10,%r12 - xorq %r10,%r13 - addq 112(%rsp),%rbx - movq %rcx,%r15 - xorq %rax,%r12 - shrdq $6,%r14,%r14 - xorq %rdx,%r15 - addq %r12,%rbx - shrdq $14,%r13,%r13 - andq %r15,%rdi - xorq %rcx,%r14 - addq %r13,%rbx - xorq %rdx,%rdi - shrdq $28,%r14,%r14 - addq %rbx,%r9 - addq %rdi,%rbx - movq %r9,%r13 - addq %rbx,%r14 - shrdq $23,%r13,%r13 - movq %r14,%rbx - movq %r10,%r12 - shrdq $5,%r14,%r14 - xorq %r9,%r13 - xorq %r11,%r12 - shrdq $4,%r13,%r13 - xorq %rbx,%r14 - andq %r9,%r12 - xorq %r9,%r13 - addq 120(%rsp),%rax - movq %rbx,%rdi - xorq %r11,%r12 - shrdq $6,%r14,%r14 - xorq %rcx,%rdi - addq %r12,%rax - shrdq $14,%r13,%r13 - andq %rdi,%r15 - xorq %rbx,%r14 - addq %r13,%rax - xorq %rcx,%r15 - shrdq $28,%r14,%r14 - addq %rax,%r8 - addq %r15,%rax - movq %r8,%r13 - addq %rax,%r14 - movq 128+0(%rsp),%rdi - movq %r14,%rax - - addq 0(%rdi),%rax - leaq 128(%rsi),%rsi - addq 8(%rdi),%rbx - addq 16(%rdi),%rcx - addq 24(%rdi),%rdx - addq 32(%rdi),%r8 - addq 40(%rdi),%r9 - addq 48(%rdi),%r10 - addq 56(%rdi),%r11 - - cmpq 128+16(%rsp),%rsi - - movq %rax,0(%rdi) - movq %rbx,8(%rdi) - movq %rcx,16(%rdi) - movq %rdx,24(%rdi) - movq %r8,32(%rdi) - movq %r9,40(%rdi) - movq %r10,48(%rdi) - movq %r11,56(%rdi) - jb .Lloop_avx - - movq 152(%rsp),%rsi -.cfi_def_cfa %rsi,8 - vzeroupper - movq -48(%rsi),%r15 -.cfi_restore %r15 - movq -40(%rsi),%r14 -.cfi_restore %r14 - movq -32(%rsi),%r13 -.cfi_restore %r13 - movq -24(%rsi),%r12 -.cfi_restore %r12 - movq -16(%rsi),%rbp -.cfi_restore %rbp - movq -8(%rsi),%rbx -.cfi_restore %rbx - leaq (%rsi),%rsp -.cfi_def_cfa_register %rsp -.Lepilogue_avx: - .byte 0xf3,0xc3 -.cfi_endproc -.size GFp_sha512_block_data_order_avx,.-GFp_sha512_block_data_order_avx -#endif -.section .note.GNU-stack,"",@progbits diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/sha512-x86_64-macosx.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/sha512-x86_64-macosx.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/sha512-x86_64-macosx.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/sha512-x86_64-macosx.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,2987 +0,0 @@ -# This file is generated from a similarly-named Perl script in the BoringSSL -# source tree. Do not edit by hand. - -#if defined(__has_feature) -#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) -#define OPENSSL_NO_ASM -#endif -#endif - -#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) -.text - - -.globl _GFp_sha512_block_data_order -.private_extern _GFp_sha512_block_data_order - -.p2align 4 -_GFp_sha512_block_data_order: - - leaq _GFp_ia32cap_P(%rip),%r11 - movl 0(%r11),%r9d - movl 4(%r11),%r10d - movl 8(%r11),%r11d - andl $1073741824,%r9d - andl $268435968,%r10d - orl %r9d,%r10d - cmpl $1342177792,%r10d - je L$avx_shortcut - movq %rsp,%rax - - pushq %rbx - - pushq %rbp - - pushq %r12 - - pushq %r13 - - pushq %r14 - - pushq %r15 - - shlq $4,%rdx - subq $128+32,%rsp - leaq (%rsi,%rdx,8),%rdx - andq $-64,%rsp - movq %rdi,128+0(%rsp) - movq %rsi,128+8(%rsp) - movq %rdx,128+16(%rsp) - movq %rax,152(%rsp) - -L$prologue: - - movq 0(%rdi),%rax - movq 8(%rdi),%rbx - movq 16(%rdi),%rcx - movq 24(%rdi),%rdx - movq 32(%rdi),%r8 - movq 40(%rdi),%r9 - movq 48(%rdi),%r10 - movq 56(%rdi),%r11 - jmp L$loop - -.p2align 4 -L$loop: - movq %rbx,%rdi - leaq K512(%rip),%rbp - xorq %rcx,%rdi - movq 0(%rsi),%r12 - movq %r8,%r13 - movq %rax,%r14 - bswapq %r12 - rorq $23,%r13 - movq %r9,%r15 - - xorq %r8,%r13 - rorq $5,%r14 - xorq %r10,%r15 - - movq %r12,0(%rsp) - xorq %rax,%r14 - andq %r8,%r15 - - rorq $4,%r13 - addq %r11,%r12 - xorq %r10,%r15 - - rorq $6,%r14 - xorq %r8,%r13 - addq %r15,%r12 - - movq %rax,%r15 - addq (%rbp),%r12 - xorq %rax,%r14 - - xorq %rbx,%r15 - rorq $14,%r13 - movq %rbx,%r11 - - andq %r15,%rdi - rorq $28,%r14 - addq %r13,%r12 - - xorq %rdi,%r11 - addq %r12,%rdx - addq %r12,%r11 - - leaq 8(%rbp),%rbp - addq %r14,%r11 - movq 8(%rsi),%r12 - movq %rdx,%r13 - movq %r11,%r14 - bswapq %r12 - rorq $23,%r13 - movq %r8,%rdi - - xorq %rdx,%r13 - rorq $5,%r14 - xorq %r9,%rdi - - movq %r12,8(%rsp) - xorq %r11,%r14 - andq %rdx,%rdi - - rorq $4,%r13 - addq %r10,%r12 - xorq %r9,%rdi - - rorq $6,%r14 - xorq %rdx,%r13 - addq %rdi,%r12 - - movq %r11,%rdi - addq (%rbp),%r12 - xorq %r11,%r14 - - xorq %rax,%rdi - rorq $14,%r13 - movq %rax,%r10 - - andq %rdi,%r15 - rorq $28,%r14 - addq %r13,%r12 - - xorq %r15,%r10 - addq %r12,%rcx - addq %r12,%r10 - - leaq 24(%rbp),%rbp - addq %r14,%r10 - movq 16(%rsi),%r12 - movq %rcx,%r13 - movq %r10,%r14 - bswapq %r12 - rorq $23,%r13 - movq %rdx,%r15 - - xorq %rcx,%r13 - rorq $5,%r14 - xorq %r8,%r15 - - movq %r12,16(%rsp) - xorq %r10,%r14 - andq %rcx,%r15 - - rorq $4,%r13 - addq %r9,%r12 - xorq %r8,%r15 - - rorq $6,%r14 - xorq %rcx,%r13 - addq %r15,%r12 - - movq %r10,%r15 - addq (%rbp),%r12 - xorq %r10,%r14 - - xorq %r11,%r15 - rorq $14,%r13 - movq %r11,%r9 - - andq %r15,%rdi - rorq $28,%r14 - addq %r13,%r12 - - xorq %rdi,%r9 - addq %r12,%rbx - addq %r12,%r9 - - leaq 8(%rbp),%rbp - addq %r14,%r9 - movq 24(%rsi),%r12 - movq %rbx,%r13 - movq %r9,%r14 - bswapq %r12 - rorq $23,%r13 - movq %rcx,%rdi - - xorq %rbx,%r13 - rorq $5,%r14 - xorq %rdx,%rdi - - movq %r12,24(%rsp) - xorq %r9,%r14 - andq %rbx,%rdi - - rorq $4,%r13 - addq %r8,%r12 - xorq %rdx,%rdi - - rorq $6,%r14 - xorq %rbx,%r13 - addq %rdi,%r12 - - movq %r9,%rdi - addq (%rbp),%r12 - xorq %r9,%r14 - - xorq %r10,%rdi - rorq $14,%r13 - movq %r10,%r8 - - andq %rdi,%r15 - rorq $28,%r14 - addq %r13,%r12 - - xorq %r15,%r8 - addq %r12,%rax - addq %r12,%r8 - - leaq 24(%rbp),%rbp - addq %r14,%r8 - movq 32(%rsi),%r12 - movq %rax,%r13 - movq %r8,%r14 - bswapq %r12 - rorq $23,%r13 - movq %rbx,%r15 - - xorq %rax,%r13 - rorq $5,%r14 - xorq %rcx,%r15 - - movq %r12,32(%rsp) - xorq %r8,%r14 - andq %rax,%r15 - - rorq $4,%r13 - addq %rdx,%r12 - xorq %rcx,%r15 - - rorq $6,%r14 - xorq %rax,%r13 - addq %r15,%r12 - - movq %r8,%r15 - addq (%rbp),%r12 - xorq %r8,%r14 - - xorq %r9,%r15 - rorq $14,%r13 - movq %r9,%rdx - - andq %r15,%rdi - rorq $28,%r14 - addq %r13,%r12 - - xorq %rdi,%rdx - addq %r12,%r11 - addq %r12,%rdx - - leaq 8(%rbp),%rbp - addq %r14,%rdx - movq 40(%rsi),%r12 - movq %r11,%r13 - movq %rdx,%r14 - bswapq %r12 - rorq $23,%r13 - movq %rax,%rdi - - xorq %r11,%r13 - rorq $5,%r14 - xorq %rbx,%rdi - - movq %r12,40(%rsp) - xorq %rdx,%r14 - andq %r11,%rdi - - rorq $4,%r13 - addq %rcx,%r12 - xorq %rbx,%rdi - - rorq $6,%r14 - xorq %r11,%r13 - addq %rdi,%r12 - - movq %rdx,%rdi - addq (%rbp),%r12 - xorq %rdx,%r14 - - xorq %r8,%rdi - rorq $14,%r13 - movq %r8,%rcx - - andq %rdi,%r15 - rorq $28,%r14 - addq %r13,%r12 - - xorq %r15,%rcx - addq %r12,%r10 - addq %r12,%rcx - - leaq 24(%rbp),%rbp - addq %r14,%rcx - movq 48(%rsi),%r12 - movq %r10,%r13 - movq %rcx,%r14 - bswapq %r12 - rorq $23,%r13 - movq %r11,%r15 - - xorq %r10,%r13 - rorq $5,%r14 - xorq %rax,%r15 - - movq %r12,48(%rsp) - xorq %rcx,%r14 - andq %r10,%r15 - - rorq $4,%r13 - addq %rbx,%r12 - xorq %rax,%r15 - - rorq $6,%r14 - xorq %r10,%r13 - addq %r15,%r12 - - movq %rcx,%r15 - addq (%rbp),%r12 - xorq %rcx,%r14 - - xorq %rdx,%r15 - rorq $14,%r13 - movq %rdx,%rbx - - andq %r15,%rdi - rorq $28,%r14 - addq %r13,%r12 - - xorq %rdi,%rbx - addq %r12,%r9 - addq %r12,%rbx - - leaq 8(%rbp),%rbp - addq %r14,%rbx - movq 56(%rsi),%r12 - movq %r9,%r13 - movq %rbx,%r14 - bswapq %r12 - rorq $23,%r13 - movq %r10,%rdi - - xorq %r9,%r13 - rorq $5,%r14 - xorq %r11,%rdi - - movq %r12,56(%rsp) - xorq %rbx,%r14 - andq %r9,%rdi - - rorq $4,%r13 - addq %rax,%r12 - xorq %r11,%rdi - - rorq $6,%r14 - xorq %r9,%r13 - addq %rdi,%r12 - - movq %rbx,%rdi - addq (%rbp),%r12 - xorq %rbx,%r14 - - xorq %rcx,%rdi - rorq $14,%r13 - movq %rcx,%rax - - andq %rdi,%r15 - rorq $28,%r14 - addq %r13,%r12 - - xorq %r15,%rax - addq %r12,%r8 - addq %r12,%rax - - leaq 24(%rbp),%rbp - addq %r14,%rax - movq 64(%rsi),%r12 - movq %r8,%r13 - movq %rax,%r14 - bswapq %r12 - rorq $23,%r13 - movq %r9,%r15 - - xorq %r8,%r13 - rorq $5,%r14 - xorq %r10,%r15 - - movq %r12,64(%rsp) - xorq %rax,%r14 - andq %r8,%r15 - - rorq $4,%r13 - addq %r11,%r12 - xorq %r10,%r15 - - rorq $6,%r14 - xorq %r8,%r13 - addq %r15,%r12 - - movq %rax,%r15 - addq (%rbp),%r12 - xorq %rax,%r14 - - xorq %rbx,%r15 - rorq $14,%r13 - movq %rbx,%r11 - - andq %r15,%rdi - rorq $28,%r14 - addq %r13,%r12 - - xorq %rdi,%r11 - addq %r12,%rdx - addq %r12,%r11 - - leaq 8(%rbp),%rbp - addq %r14,%r11 - movq 72(%rsi),%r12 - movq %rdx,%r13 - movq %r11,%r14 - bswapq %r12 - rorq $23,%r13 - movq %r8,%rdi - - xorq %rdx,%r13 - rorq $5,%r14 - xorq %r9,%rdi - - movq %r12,72(%rsp) - xorq %r11,%r14 - andq %rdx,%rdi - - rorq $4,%r13 - addq %r10,%r12 - xorq %r9,%rdi - - rorq $6,%r14 - xorq %rdx,%r13 - addq %rdi,%r12 - - movq %r11,%rdi - addq (%rbp),%r12 - xorq %r11,%r14 - - xorq %rax,%rdi - rorq $14,%r13 - movq %rax,%r10 - - andq %rdi,%r15 - rorq $28,%r14 - addq %r13,%r12 - - xorq %r15,%r10 - addq %r12,%rcx - addq %r12,%r10 - - leaq 24(%rbp),%rbp - addq %r14,%r10 - movq 80(%rsi),%r12 - movq %rcx,%r13 - movq %r10,%r14 - bswapq %r12 - rorq $23,%r13 - movq %rdx,%r15 - - xorq %rcx,%r13 - rorq $5,%r14 - xorq %r8,%r15 - - movq %r12,80(%rsp) - xorq %r10,%r14 - andq %rcx,%r15 - - rorq $4,%r13 - addq %r9,%r12 - xorq %r8,%r15 - - rorq $6,%r14 - xorq %rcx,%r13 - addq %r15,%r12 - - movq %r10,%r15 - addq (%rbp),%r12 - xorq %r10,%r14 - - xorq %r11,%r15 - rorq $14,%r13 - movq %r11,%r9 - - andq %r15,%rdi - rorq $28,%r14 - addq %r13,%r12 - - xorq %rdi,%r9 - addq %r12,%rbx - addq %r12,%r9 - - leaq 8(%rbp),%rbp - addq %r14,%r9 - movq 88(%rsi),%r12 - movq %rbx,%r13 - movq %r9,%r14 - bswapq %r12 - rorq $23,%r13 - movq %rcx,%rdi - - xorq %rbx,%r13 - rorq $5,%r14 - xorq %rdx,%rdi - - movq %r12,88(%rsp) - xorq %r9,%r14 - andq %rbx,%rdi - - rorq $4,%r13 - addq %r8,%r12 - xorq %rdx,%rdi - - rorq $6,%r14 - xorq %rbx,%r13 - addq %rdi,%r12 - - movq %r9,%rdi - addq (%rbp),%r12 - xorq %r9,%r14 - - xorq %r10,%rdi - rorq $14,%r13 - movq %r10,%r8 - - andq %rdi,%r15 - rorq $28,%r14 - addq %r13,%r12 - - xorq %r15,%r8 - addq %r12,%rax - addq %r12,%r8 - - leaq 24(%rbp),%rbp - addq %r14,%r8 - movq 96(%rsi),%r12 - movq %rax,%r13 - movq %r8,%r14 - bswapq %r12 - rorq $23,%r13 - movq %rbx,%r15 - - xorq %rax,%r13 - rorq $5,%r14 - xorq %rcx,%r15 - - movq %r12,96(%rsp) - xorq %r8,%r14 - andq %rax,%r15 - - rorq $4,%r13 - addq %rdx,%r12 - xorq %rcx,%r15 - - rorq $6,%r14 - xorq %rax,%r13 - addq %r15,%r12 - - movq %r8,%r15 - addq (%rbp),%r12 - xorq %r8,%r14 - - xorq %r9,%r15 - rorq $14,%r13 - movq %r9,%rdx - - andq %r15,%rdi - rorq $28,%r14 - addq %r13,%r12 - - xorq %rdi,%rdx - addq %r12,%r11 - addq %r12,%rdx - - leaq 8(%rbp),%rbp - addq %r14,%rdx - movq 104(%rsi),%r12 - movq %r11,%r13 - movq %rdx,%r14 - bswapq %r12 - rorq $23,%r13 - movq %rax,%rdi - - xorq %r11,%r13 - rorq $5,%r14 - xorq %rbx,%rdi - - movq %r12,104(%rsp) - xorq %rdx,%r14 - andq %r11,%rdi - - rorq $4,%r13 - addq %rcx,%r12 - xorq %rbx,%rdi - - rorq $6,%r14 - xorq %r11,%r13 - addq %rdi,%r12 - - movq %rdx,%rdi - addq (%rbp),%r12 - xorq %rdx,%r14 - - xorq %r8,%rdi - rorq $14,%r13 - movq %r8,%rcx - - andq %rdi,%r15 - rorq $28,%r14 - addq %r13,%r12 - - xorq %r15,%rcx - addq %r12,%r10 - addq %r12,%rcx - - leaq 24(%rbp),%rbp - addq %r14,%rcx - movq 112(%rsi),%r12 - movq %r10,%r13 - movq %rcx,%r14 - bswapq %r12 - rorq $23,%r13 - movq %r11,%r15 - - xorq %r10,%r13 - rorq $5,%r14 - xorq %rax,%r15 - - movq %r12,112(%rsp) - xorq %rcx,%r14 - andq %r10,%r15 - - rorq $4,%r13 - addq %rbx,%r12 - xorq %rax,%r15 - - rorq $6,%r14 - xorq %r10,%r13 - addq %r15,%r12 - - movq %rcx,%r15 - addq (%rbp),%r12 - xorq %rcx,%r14 - - xorq %rdx,%r15 - rorq $14,%r13 - movq %rdx,%rbx - - andq %r15,%rdi - rorq $28,%r14 - addq %r13,%r12 - - xorq %rdi,%rbx - addq %r12,%r9 - addq %r12,%rbx - - leaq 8(%rbp),%rbp - addq %r14,%rbx - movq 120(%rsi),%r12 - movq %r9,%r13 - movq %rbx,%r14 - bswapq %r12 - rorq $23,%r13 - movq %r10,%rdi - - xorq %r9,%r13 - rorq $5,%r14 - xorq %r11,%rdi - - movq %r12,120(%rsp) - xorq %rbx,%r14 - andq %r9,%rdi - - rorq $4,%r13 - addq %rax,%r12 - xorq %r11,%rdi - - rorq $6,%r14 - xorq %r9,%r13 - addq %rdi,%r12 - - movq %rbx,%rdi - addq (%rbp),%r12 - xorq %rbx,%r14 - - xorq %rcx,%rdi - rorq $14,%r13 - movq %rcx,%rax - - andq %rdi,%r15 - rorq $28,%r14 - addq %r13,%r12 - - xorq %r15,%rax - addq %r12,%r8 - addq %r12,%rax - - leaq 24(%rbp),%rbp - jmp L$rounds_16_xx -.p2align 4 -L$rounds_16_xx: - movq 8(%rsp),%r13 - movq 112(%rsp),%r15 - - movq %r13,%r12 - rorq $7,%r13 - addq %r14,%rax - movq %r15,%r14 - rorq $42,%r15 - - xorq %r12,%r13 - shrq $7,%r12 - rorq $1,%r13 - xorq %r14,%r15 - shrq $6,%r14 - - rorq $19,%r15 - xorq %r13,%r12 - xorq %r14,%r15 - addq 72(%rsp),%r12 - - addq 0(%rsp),%r12 - movq %r8,%r13 - addq %r15,%r12 - movq %rax,%r14 - rorq $23,%r13 - movq %r9,%r15 - - xorq %r8,%r13 - rorq $5,%r14 - xorq %r10,%r15 - - movq %r12,0(%rsp) - xorq %rax,%r14 - andq %r8,%r15 - - rorq $4,%r13 - addq %r11,%r12 - xorq %r10,%r15 - - rorq $6,%r14 - xorq %r8,%r13 - addq %r15,%r12 - - movq %rax,%r15 - addq (%rbp),%r12 - xorq %rax,%r14 - - xorq %rbx,%r15 - rorq $14,%r13 - movq %rbx,%r11 - - andq %r15,%rdi - rorq $28,%r14 - addq %r13,%r12 - - xorq %rdi,%r11 - addq %r12,%rdx - addq %r12,%r11 - - leaq 8(%rbp),%rbp - movq 16(%rsp),%r13 - movq 120(%rsp),%rdi - - movq %r13,%r12 - rorq $7,%r13 - addq %r14,%r11 - movq %rdi,%r14 - rorq $42,%rdi - - xorq %r12,%r13 - shrq $7,%r12 - rorq $1,%r13 - xorq %r14,%rdi - shrq $6,%r14 - - rorq $19,%rdi - xorq %r13,%r12 - xorq %r14,%rdi - addq 80(%rsp),%r12 - - addq 8(%rsp),%r12 - movq %rdx,%r13 - addq %rdi,%r12 - movq %r11,%r14 - rorq $23,%r13 - movq %r8,%rdi - - xorq %rdx,%r13 - rorq $5,%r14 - xorq %r9,%rdi - - movq %r12,8(%rsp) - xorq %r11,%r14 - andq %rdx,%rdi - - rorq $4,%r13 - addq %r10,%r12 - xorq %r9,%rdi - - rorq $6,%r14 - xorq %rdx,%r13 - addq %rdi,%r12 - - movq %r11,%rdi - addq (%rbp),%r12 - xorq %r11,%r14 - - xorq %rax,%rdi - rorq $14,%r13 - movq %rax,%r10 - - andq %rdi,%r15 - rorq $28,%r14 - addq %r13,%r12 - - xorq %r15,%r10 - addq %r12,%rcx - addq %r12,%r10 - - leaq 24(%rbp),%rbp - movq 24(%rsp),%r13 - movq 0(%rsp),%r15 - - movq %r13,%r12 - rorq $7,%r13 - addq %r14,%r10 - movq %r15,%r14 - rorq $42,%r15 - - xorq %r12,%r13 - shrq $7,%r12 - rorq $1,%r13 - xorq %r14,%r15 - shrq $6,%r14 - - rorq $19,%r15 - xorq %r13,%r12 - xorq %r14,%r15 - addq 88(%rsp),%r12 - - addq 16(%rsp),%r12 - movq %rcx,%r13 - addq %r15,%r12 - movq %r10,%r14 - rorq $23,%r13 - movq %rdx,%r15 - - xorq %rcx,%r13 - rorq $5,%r14 - xorq %r8,%r15 - - movq %r12,16(%rsp) - xorq %r10,%r14 - andq %rcx,%r15 - - rorq $4,%r13 - addq %r9,%r12 - xorq %r8,%r15 - - rorq $6,%r14 - xorq %rcx,%r13 - addq %r15,%r12 - - movq %r10,%r15 - addq (%rbp),%r12 - xorq %r10,%r14 - - xorq %r11,%r15 - rorq $14,%r13 - movq %r11,%r9 - - andq %r15,%rdi - rorq $28,%r14 - addq %r13,%r12 - - xorq %rdi,%r9 - addq %r12,%rbx - addq %r12,%r9 - - leaq 8(%rbp),%rbp - movq 32(%rsp),%r13 - movq 8(%rsp),%rdi - - movq %r13,%r12 - rorq $7,%r13 - addq %r14,%r9 - movq %rdi,%r14 - rorq $42,%rdi - - xorq %r12,%r13 - shrq $7,%r12 - rorq $1,%r13 - xorq %r14,%rdi - shrq $6,%r14 - - rorq $19,%rdi - xorq %r13,%r12 - xorq %r14,%rdi - addq 96(%rsp),%r12 - - addq 24(%rsp),%r12 - movq %rbx,%r13 - addq %rdi,%r12 - movq %r9,%r14 - rorq $23,%r13 - movq %rcx,%rdi - - xorq %rbx,%r13 - rorq $5,%r14 - xorq %rdx,%rdi - - movq %r12,24(%rsp) - xorq %r9,%r14 - andq %rbx,%rdi - - rorq $4,%r13 - addq %r8,%r12 - xorq %rdx,%rdi - - rorq $6,%r14 - xorq %rbx,%r13 - addq %rdi,%r12 - - movq %r9,%rdi - addq (%rbp),%r12 - xorq %r9,%r14 - - xorq %r10,%rdi - rorq $14,%r13 - movq %r10,%r8 - - andq %rdi,%r15 - rorq $28,%r14 - addq %r13,%r12 - - xorq %r15,%r8 - addq %r12,%rax - addq %r12,%r8 - - leaq 24(%rbp),%rbp - movq 40(%rsp),%r13 - movq 16(%rsp),%r15 - - movq %r13,%r12 - rorq $7,%r13 - addq %r14,%r8 - movq %r15,%r14 - rorq $42,%r15 - - xorq %r12,%r13 - shrq $7,%r12 - rorq $1,%r13 - xorq %r14,%r15 - shrq $6,%r14 - - rorq $19,%r15 - xorq %r13,%r12 - xorq %r14,%r15 - addq 104(%rsp),%r12 - - addq 32(%rsp),%r12 - movq %rax,%r13 - addq %r15,%r12 - movq %r8,%r14 - rorq $23,%r13 - movq %rbx,%r15 - - xorq %rax,%r13 - rorq $5,%r14 - xorq %rcx,%r15 - - movq %r12,32(%rsp) - xorq %r8,%r14 - andq %rax,%r15 - - rorq $4,%r13 - addq %rdx,%r12 - xorq %rcx,%r15 - - rorq $6,%r14 - xorq %rax,%r13 - addq %r15,%r12 - - movq %r8,%r15 - addq (%rbp),%r12 - xorq %r8,%r14 - - xorq %r9,%r15 - rorq $14,%r13 - movq %r9,%rdx - - andq %r15,%rdi - rorq $28,%r14 - addq %r13,%r12 - - xorq %rdi,%rdx - addq %r12,%r11 - addq %r12,%rdx - - leaq 8(%rbp),%rbp - movq 48(%rsp),%r13 - movq 24(%rsp),%rdi - - movq %r13,%r12 - rorq $7,%r13 - addq %r14,%rdx - movq %rdi,%r14 - rorq $42,%rdi - - xorq %r12,%r13 - shrq $7,%r12 - rorq $1,%r13 - xorq %r14,%rdi - shrq $6,%r14 - - rorq $19,%rdi - xorq %r13,%r12 - xorq %r14,%rdi - addq 112(%rsp),%r12 - - addq 40(%rsp),%r12 - movq %r11,%r13 - addq %rdi,%r12 - movq %rdx,%r14 - rorq $23,%r13 - movq %rax,%rdi - - xorq %r11,%r13 - rorq $5,%r14 - xorq %rbx,%rdi - - movq %r12,40(%rsp) - xorq %rdx,%r14 - andq %r11,%rdi - - rorq $4,%r13 - addq %rcx,%r12 - xorq %rbx,%rdi - - rorq $6,%r14 - xorq %r11,%r13 - addq %rdi,%r12 - - movq %rdx,%rdi - addq (%rbp),%r12 - xorq %rdx,%r14 - - xorq %r8,%rdi - rorq $14,%r13 - movq %r8,%rcx - - andq %rdi,%r15 - rorq $28,%r14 - addq %r13,%r12 - - xorq %r15,%rcx - addq %r12,%r10 - addq %r12,%rcx - - leaq 24(%rbp),%rbp - movq 56(%rsp),%r13 - movq 32(%rsp),%r15 - - movq %r13,%r12 - rorq $7,%r13 - addq %r14,%rcx - movq %r15,%r14 - rorq $42,%r15 - - xorq %r12,%r13 - shrq $7,%r12 - rorq $1,%r13 - xorq %r14,%r15 - shrq $6,%r14 - - rorq $19,%r15 - xorq %r13,%r12 - xorq %r14,%r15 - addq 120(%rsp),%r12 - - addq 48(%rsp),%r12 - movq %r10,%r13 - addq %r15,%r12 - movq %rcx,%r14 - rorq $23,%r13 - movq %r11,%r15 - - xorq %r10,%r13 - rorq $5,%r14 - xorq %rax,%r15 - - movq %r12,48(%rsp) - xorq %rcx,%r14 - andq %r10,%r15 - - rorq $4,%r13 - addq %rbx,%r12 - xorq %rax,%r15 - - rorq $6,%r14 - xorq %r10,%r13 - addq %r15,%r12 - - movq %rcx,%r15 - addq (%rbp),%r12 - xorq %rcx,%r14 - - xorq %rdx,%r15 - rorq $14,%r13 - movq %rdx,%rbx - - andq %r15,%rdi - rorq $28,%r14 - addq %r13,%r12 - - xorq %rdi,%rbx - addq %r12,%r9 - addq %r12,%rbx - - leaq 8(%rbp),%rbp - movq 64(%rsp),%r13 - movq 40(%rsp),%rdi - - movq %r13,%r12 - rorq $7,%r13 - addq %r14,%rbx - movq %rdi,%r14 - rorq $42,%rdi - - xorq %r12,%r13 - shrq $7,%r12 - rorq $1,%r13 - xorq %r14,%rdi - shrq $6,%r14 - - rorq $19,%rdi - xorq %r13,%r12 - xorq %r14,%rdi - addq 0(%rsp),%r12 - - addq 56(%rsp),%r12 - movq %r9,%r13 - addq %rdi,%r12 - movq %rbx,%r14 - rorq $23,%r13 - movq %r10,%rdi - - xorq %r9,%r13 - rorq $5,%r14 - xorq %r11,%rdi - - movq %r12,56(%rsp) - xorq %rbx,%r14 - andq %r9,%rdi - - rorq $4,%r13 - addq %rax,%r12 - xorq %r11,%rdi - - rorq $6,%r14 - xorq %r9,%r13 - addq %rdi,%r12 - - movq %rbx,%rdi - addq (%rbp),%r12 - xorq %rbx,%r14 - - xorq %rcx,%rdi - rorq $14,%r13 - movq %rcx,%rax - - andq %rdi,%r15 - rorq $28,%r14 - addq %r13,%r12 - - xorq %r15,%rax - addq %r12,%r8 - addq %r12,%rax - - leaq 24(%rbp),%rbp - movq 72(%rsp),%r13 - movq 48(%rsp),%r15 - - movq %r13,%r12 - rorq $7,%r13 - addq %r14,%rax - movq %r15,%r14 - rorq $42,%r15 - - xorq %r12,%r13 - shrq $7,%r12 - rorq $1,%r13 - xorq %r14,%r15 - shrq $6,%r14 - - rorq $19,%r15 - xorq %r13,%r12 - xorq %r14,%r15 - addq 8(%rsp),%r12 - - addq 64(%rsp),%r12 - movq %r8,%r13 - addq %r15,%r12 - movq %rax,%r14 - rorq $23,%r13 - movq %r9,%r15 - - xorq %r8,%r13 - rorq $5,%r14 - xorq %r10,%r15 - - movq %r12,64(%rsp) - xorq %rax,%r14 - andq %r8,%r15 - - rorq $4,%r13 - addq %r11,%r12 - xorq %r10,%r15 - - rorq $6,%r14 - xorq %r8,%r13 - addq %r15,%r12 - - movq %rax,%r15 - addq (%rbp),%r12 - xorq %rax,%r14 - - xorq %rbx,%r15 - rorq $14,%r13 - movq %rbx,%r11 - - andq %r15,%rdi - rorq $28,%r14 - addq %r13,%r12 - - xorq %rdi,%r11 - addq %r12,%rdx - addq %r12,%r11 - - leaq 8(%rbp),%rbp - movq 80(%rsp),%r13 - movq 56(%rsp),%rdi - - movq %r13,%r12 - rorq $7,%r13 - addq %r14,%r11 - movq %rdi,%r14 - rorq $42,%rdi - - xorq %r12,%r13 - shrq $7,%r12 - rorq $1,%r13 - xorq %r14,%rdi - shrq $6,%r14 - - rorq $19,%rdi - xorq %r13,%r12 - xorq %r14,%rdi - addq 16(%rsp),%r12 - - addq 72(%rsp),%r12 - movq %rdx,%r13 - addq %rdi,%r12 - movq %r11,%r14 - rorq $23,%r13 - movq %r8,%rdi - - xorq %rdx,%r13 - rorq $5,%r14 - xorq %r9,%rdi - - movq %r12,72(%rsp) - xorq %r11,%r14 - andq %rdx,%rdi - - rorq $4,%r13 - addq %r10,%r12 - xorq %r9,%rdi - - rorq $6,%r14 - xorq %rdx,%r13 - addq %rdi,%r12 - - movq %r11,%rdi - addq (%rbp),%r12 - xorq %r11,%r14 - - xorq %rax,%rdi - rorq $14,%r13 - movq %rax,%r10 - - andq %rdi,%r15 - rorq $28,%r14 - addq %r13,%r12 - - xorq %r15,%r10 - addq %r12,%rcx - addq %r12,%r10 - - leaq 24(%rbp),%rbp - movq 88(%rsp),%r13 - movq 64(%rsp),%r15 - - movq %r13,%r12 - rorq $7,%r13 - addq %r14,%r10 - movq %r15,%r14 - rorq $42,%r15 - - xorq %r12,%r13 - shrq $7,%r12 - rorq $1,%r13 - xorq %r14,%r15 - shrq $6,%r14 - - rorq $19,%r15 - xorq %r13,%r12 - xorq %r14,%r15 - addq 24(%rsp),%r12 - - addq 80(%rsp),%r12 - movq %rcx,%r13 - addq %r15,%r12 - movq %r10,%r14 - rorq $23,%r13 - movq %rdx,%r15 - - xorq %rcx,%r13 - rorq $5,%r14 - xorq %r8,%r15 - - movq %r12,80(%rsp) - xorq %r10,%r14 - andq %rcx,%r15 - - rorq $4,%r13 - addq %r9,%r12 - xorq %r8,%r15 - - rorq $6,%r14 - xorq %rcx,%r13 - addq %r15,%r12 - - movq %r10,%r15 - addq (%rbp),%r12 - xorq %r10,%r14 - - xorq %r11,%r15 - rorq $14,%r13 - movq %r11,%r9 - - andq %r15,%rdi - rorq $28,%r14 - addq %r13,%r12 - - xorq %rdi,%r9 - addq %r12,%rbx - addq %r12,%r9 - - leaq 8(%rbp),%rbp - movq 96(%rsp),%r13 - movq 72(%rsp),%rdi - - movq %r13,%r12 - rorq $7,%r13 - addq %r14,%r9 - movq %rdi,%r14 - rorq $42,%rdi - - xorq %r12,%r13 - shrq $7,%r12 - rorq $1,%r13 - xorq %r14,%rdi - shrq $6,%r14 - - rorq $19,%rdi - xorq %r13,%r12 - xorq %r14,%rdi - addq 32(%rsp),%r12 - - addq 88(%rsp),%r12 - movq %rbx,%r13 - addq %rdi,%r12 - movq %r9,%r14 - rorq $23,%r13 - movq %rcx,%rdi - - xorq %rbx,%r13 - rorq $5,%r14 - xorq %rdx,%rdi - - movq %r12,88(%rsp) - xorq %r9,%r14 - andq %rbx,%rdi - - rorq $4,%r13 - addq %r8,%r12 - xorq %rdx,%rdi - - rorq $6,%r14 - xorq %rbx,%r13 - addq %rdi,%r12 - - movq %r9,%rdi - addq (%rbp),%r12 - xorq %r9,%r14 - - xorq %r10,%rdi - rorq $14,%r13 - movq %r10,%r8 - - andq %rdi,%r15 - rorq $28,%r14 - addq %r13,%r12 - - xorq %r15,%r8 - addq %r12,%rax - addq %r12,%r8 - - leaq 24(%rbp),%rbp - movq 104(%rsp),%r13 - movq 80(%rsp),%r15 - - movq %r13,%r12 - rorq $7,%r13 - addq %r14,%r8 - movq %r15,%r14 - rorq $42,%r15 - - xorq %r12,%r13 - shrq $7,%r12 - rorq $1,%r13 - xorq %r14,%r15 - shrq $6,%r14 - - rorq $19,%r15 - xorq %r13,%r12 - xorq %r14,%r15 - addq 40(%rsp),%r12 - - addq 96(%rsp),%r12 - movq %rax,%r13 - addq %r15,%r12 - movq %r8,%r14 - rorq $23,%r13 - movq %rbx,%r15 - - xorq %rax,%r13 - rorq $5,%r14 - xorq %rcx,%r15 - - movq %r12,96(%rsp) - xorq %r8,%r14 - andq %rax,%r15 - - rorq $4,%r13 - addq %rdx,%r12 - xorq %rcx,%r15 - - rorq $6,%r14 - xorq %rax,%r13 - addq %r15,%r12 - - movq %r8,%r15 - addq (%rbp),%r12 - xorq %r8,%r14 - - xorq %r9,%r15 - rorq $14,%r13 - movq %r9,%rdx - - andq %r15,%rdi - rorq $28,%r14 - addq %r13,%r12 - - xorq %rdi,%rdx - addq %r12,%r11 - addq %r12,%rdx - - leaq 8(%rbp),%rbp - movq 112(%rsp),%r13 - movq 88(%rsp),%rdi - - movq %r13,%r12 - rorq $7,%r13 - addq %r14,%rdx - movq %rdi,%r14 - rorq $42,%rdi - - xorq %r12,%r13 - shrq $7,%r12 - rorq $1,%r13 - xorq %r14,%rdi - shrq $6,%r14 - - rorq $19,%rdi - xorq %r13,%r12 - xorq %r14,%rdi - addq 48(%rsp),%r12 - - addq 104(%rsp),%r12 - movq %r11,%r13 - addq %rdi,%r12 - movq %rdx,%r14 - rorq $23,%r13 - movq %rax,%rdi - - xorq %r11,%r13 - rorq $5,%r14 - xorq %rbx,%rdi - - movq %r12,104(%rsp) - xorq %rdx,%r14 - andq %r11,%rdi - - rorq $4,%r13 - addq %rcx,%r12 - xorq %rbx,%rdi - - rorq $6,%r14 - xorq %r11,%r13 - addq %rdi,%r12 - - movq %rdx,%rdi - addq (%rbp),%r12 - xorq %rdx,%r14 - - xorq %r8,%rdi - rorq $14,%r13 - movq %r8,%rcx - - andq %rdi,%r15 - rorq $28,%r14 - addq %r13,%r12 - - xorq %r15,%rcx - addq %r12,%r10 - addq %r12,%rcx - - leaq 24(%rbp),%rbp - movq 120(%rsp),%r13 - movq 96(%rsp),%r15 - - movq %r13,%r12 - rorq $7,%r13 - addq %r14,%rcx - movq %r15,%r14 - rorq $42,%r15 - - xorq %r12,%r13 - shrq $7,%r12 - rorq $1,%r13 - xorq %r14,%r15 - shrq $6,%r14 - - rorq $19,%r15 - xorq %r13,%r12 - xorq %r14,%r15 - addq 56(%rsp),%r12 - - addq 112(%rsp),%r12 - movq %r10,%r13 - addq %r15,%r12 - movq %rcx,%r14 - rorq $23,%r13 - movq %r11,%r15 - - xorq %r10,%r13 - rorq $5,%r14 - xorq %rax,%r15 - - movq %r12,112(%rsp) - xorq %rcx,%r14 - andq %r10,%r15 - - rorq $4,%r13 - addq %rbx,%r12 - xorq %rax,%r15 - - rorq $6,%r14 - xorq %r10,%r13 - addq %r15,%r12 - - movq %rcx,%r15 - addq (%rbp),%r12 - xorq %rcx,%r14 - - xorq %rdx,%r15 - rorq $14,%r13 - movq %rdx,%rbx - - andq %r15,%rdi - rorq $28,%r14 - addq %r13,%r12 - - xorq %rdi,%rbx - addq %r12,%r9 - addq %r12,%rbx - - leaq 8(%rbp),%rbp - movq 0(%rsp),%r13 - movq 104(%rsp),%rdi - - movq %r13,%r12 - rorq $7,%r13 - addq %r14,%rbx - movq %rdi,%r14 - rorq $42,%rdi - - xorq %r12,%r13 - shrq $7,%r12 - rorq $1,%r13 - xorq %r14,%rdi - shrq $6,%r14 - - rorq $19,%rdi - xorq %r13,%r12 - xorq %r14,%rdi - addq 64(%rsp),%r12 - - addq 120(%rsp),%r12 - movq %r9,%r13 - addq %rdi,%r12 - movq %rbx,%r14 - rorq $23,%r13 - movq %r10,%rdi - - xorq %r9,%r13 - rorq $5,%r14 - xorq %r11,%rdi - - movq %r12,120(%rsp) - xorq %rbx,%r14 - andq %r9,%rdi - - rorq $4,%r13 - addq %rax,%r12 - xorq %r11,%rdi - - rorq $6,%r14 - xorq %r9,%r13 - addq %rdi,%r12 - - movq %rbx,%rdi - addq (%rbp),%r12 - xorq %rbx,%r14 - - xorq %rcx,%rdi - rorq $14,%r13 - movq %rcx,%rax - - andq %rdi,%r15 - rorq $28,%r14 - addq %r13,%r12 - - xorq %r15,%rax - addq %r12,%r8 - addq %r12,%rax - - leaq 24(%rbp),%rbp - cmpb $0,7(%rbp) - jnz L$rounds_16_xx - - movq 128+0(%rsp),%rdi - addq %r14,%rax - leaq 128(%rsi),%rsi - - addq 0(%rdi),%rax - addq 8(%rdi),%rbx - addq 16(%rdi),%rcx - addq 24(%rdi),%rdx - addq 32(%rdi),%r8 - addq 40(%rdi),%r9 - addq 48(%rdi),%r10 - addq 56(%rdi),%r11 - - cmpq 128+16(%rsp),%rsi - - movq %rax,0(%rdi) - movq %rbx,8(%rdi) - movq %rcx,16(%rdi) - movq %rdx,24(%rdi) - movq %r8,32(%rdi) - movq %r9,40(%rdi) - movq %r10,48(%rdi) - movq %r11,56(%rdi) - jb L$loop - - movq 152(%rsp),%rsi - - movq -48(%rsi),%r15 - - movq -40(%rsi),%r14 - - movq -32(%rsi),%r13 - - movq -24(%rsi),%r12 - - movq -16(%rsi),%rbp - - movq -8(%rsi),%rbx - - leaq (%rsi),%rsp - -L$epilogue: - .byte 0xf3,0xc3 - - -.p2align 6 - -K512: -.quad 0x428a2f98d728ae22,0x7137449123ef65cd -.quad 0x428a2f98d728ae22,0x7137449123ef65cd -.quad 0xb5c0fbcfec4d3b2f,0xe9b5dba58189dbbc -.quad 0xb5c0fbcfec4d3b2f,0xe9b5dba58189dbbc -.quad 0x3956c25bf348b538,0x59f111f1b605d019 -.quad 0x3956c25bf348b538,0x59f111f1b605d019 -.quad 0x923f82a4af194f9b,0xab1c5ed5da6d8118 -.quad 0x923f82a4af194f9b,0xab1c5ed5da6d8118 -.quad 0xd807aa98a3030242,0x12835b0145706fbe -.quad 0xd807aa98a3030242,0x12835b0145706fbe -.quad 0x243185be4ee4b28c,0x550c7dc3d5ffb4e2 -.quad 0x243185be4ee4b28c,0x550c7dc3d5ffb4e2 -.quad 0x72be5d74f27b896f,0x80deb1fe3b1696b1 -.quad 0x72be5d74f27b896f,0x80deb1fe3b1696b1 -.quad 0x9bdc06a725c71235,0xc19bf174cf692694 -.quad 0x9bdc06a725c71235,0xc19bf174cf692694 -.quad 0xe49b69c19ef14ad2,0xefbe4786384f25e3 -.quad 0xe49b69c19ef14ad2,0xefbe4786384f25e3 -.quad 0x0fc19dc68b8cd5b5,0x240ca1cc77ac9c65 -.quad 0x0fc19dc68b8cd5b5,0x240ca1cc77ac9c65 -.quad 0x2de92c6f592b0275,0x4a7484aa6ea6e483 -.quad 0x2de92c6f592b0275,0x4a7484aa6ea6e483 -.quad 0x5cb0a9dcbd41fbd4,0x76f988da831153b5 -.quad 0x5cb0a9dcbd41fbd4,0x76f988da831153b5 -.quad 0x983e5152ee66dfab,0xa831c66d2db43210 -.quad 0x983e5152ee66dfab,0xa831c66d2db43210 -.quad 0xb00327c898fb213f,0xbf597fc7beef0ee4 -.quad 0xb00327c898fb213f,0xbf597fc7beef0ee4 -.quad 0xc6e00bf33da88fc2,0xd5a79147930aa725 -.quad 0xc6e00bf33da88fc2,0xd5a79147930aa725 -.quad 0x06ca6351e003826f,0x142929670a0e6e70 -.quad 0x06ca6351e003826f,0x142929670a0e6e70 -.quad 0x27b70a8546d22ffc,0x2e1b21385c26c926 -.quad 0x27b70a8546d22ffc,0x2e1b21385c26c926 -.quad 0x4d2c6dfc5ac42aed,0x53380d139d95b3df -.quad 0x4d2c6dfc5ac42aed,0x53380d139d95b3df -.quad 0x650a73548baf63de,0x766a0abb3c77b2a8 -.quad 0x650a73548baf63de,0x766a0abb3c77b2a8 -.quad 0x81c2c92e47edaee6,0x92722c851482353b -.quad 0x81c2c92e47edaee6,0x92722c851482353b -.quad 0xa2bfe8a14cf10364,0xa81a664bbc423001 -.quad 0xa2bfe8a14cf10364,0xa81a664bbc423001 -.quad 0xc24b8b70d0f89791,0xc76c51a30654be30 -.quad 0xc24b8b70d0f89791,0xc76c51a30654be30 -.quad 0xd192e819d6ef5218,0xd69906245565a910 -.quad 0xd192e819d6ef5218,0xd69906245565a910 -.quad 0xf40e35855771202a,0x106aa07032bbd1b8 -.quad 0xf40e35855771202a,0x106aa07032bbd1b8 -.quad 0x19a4c116b8d2d0c8,0x1e376c085141ab53 -.quad 0x19a4c116b8d2d0c8,0x1e376c085141ab53 -.quad 0x2748774cdf8eeb99,0x34b0bcb5e19b48a8 -.quad 0x2748774cdf8eeb99,0x34b0bcb5e19b48a8 -.quad 0x391c0cb3c5c95a63,0x4ed8aa4ae3418acb -.quad 0x391c0cb3c5c95a63,0x4ed8aa4ae3418acb -.quad 0x5b9cca4f7763e373,0x682e6ff3d6b2b8a3 -.quad 0x5b9cca4f7763e373,0x682e6ff3d6b2b8a3 -.quad 0x748f82ee5defb2fc,0x78a5636f43172f60 -.quad 0x748f82ee5defb2fc,0x78a5636f43172f60 -.quad 0x84c87814a1f0ab72,0x8cc702081a6439ec -.quad 0x84c87814a1f0ab72,0x8cc702081a6439ec -.quad 0x90befffa23631e28,0xa4506cebde82bde9 -.quad 0x90befffa23631e28,0xa4506cebde82bde9 -.quad 0xbef9a3f7b2c67915,0xc67178f2e372532b -.quad 0xbef9a3f7b2c67915,0xc67178f2e372532b -.quad 0xca273eceea26619c,0xd186b8c721c0c207 -.quad 0xca273eceea26619c,0xd186b8c721c0c207 -.quad 0xeada7dd6cde0eb1e,0xf57d4f7fee6ed178 -.quad 0xeada7dd6cde0eb1e,0xf57d4f7fee6ed178 -.quad 0x06f067aa72176fba,0x0a637dc5a2c898a6 -.quad 0x06f067aa72176fba,0x0a637dc5a2c898a6 -.quad 0x113f9804bef90dae,0x1b710b35131c471b -.quad 0x113f9804bef90dae,0x1b710b35131c471b -.quad 0x28db77f523047d84,0x32caab7b40c72493 -.quad 0x28db77f523047d84,0x32caab7b40c72493 -.quad 0x3c9ebe0a15c9bebc,0x431d67c49c100d4c -.quad 0x3c9ebe0a15c9bebc,0x431d67c49c100d4c -.quad 0x4cc5d4becb3e42b6,0x597f299cfc657e2a -.quad 0x4cc5d4becb3e42b6,0x597f299cfc657e2a -.quad 0x5fcb6fab3ad6faec,0x6c44198c4a475817 -.quad 0x5fcb6fab3ad6faec,0x6c44198c4a475817 - -.quad 0x0001020304050607,0x08090a0b0c0d0e0f -.quad 0x0001020304050607,0x08090a0b0c0d0e0f -.byte 83,72,65,53,49,50,32,98,108,111,99,107,32,116,114,97,110,115,102,111,114,109,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 - -.p2align 6 -GFp_sha512_block_data_order_avx: - -L$avx_shortcut: - movq %rsp,%rax - - pushq %rbx - - pushq %rbp - - pushq %r12 - - pushq %r13 - - pushq %r14 - - pushq %r15 - - shlq $4,%rdx - subq $160,%rsp - leaq (%rsi,%rdx,8),%rdx - andq $-64,%rsp - movq %rdi,128+0(%rsp) - movq %rsi,128+8(%rsp) - movq %rdx,128+16(%rsp) - movq %rax,152(%rsp) - -L$prologue_avx: - - vzeroupper - movq 0(%rdi),%rax - movq 8(%rdi),%rbx - movq 16(%rdi),%rcx - movq 24(%rdi),%rdx - movq 32(%rdi),%r8 - movq 40(%rdi),%r9 - movq 48(%rdi),%r10 - movq 56(%rdi),%r11 - jmp L$loop_avx -.p2align 4 -L$loop_avx: - vmovdqa K512+1280(%rip),%xmm11 - vmovdqu 0(%rsi),%xmm0 - leaq K512+128(%rip),%rbp - vmovdqu 16(%rsi),%xmm1 - vmovdqu 32(%rsi),%xmm2 - vpshufb %xmm11,%xmm0,%xmm0 - vmovdqu 48(%rsi),%xmm3 - vpshufb %xmm11,%xmm1,%xmm1 - vmovdqu 64(%rsi),%xmm4 - vpshufb %xmm11,%xmm2,%xmm2 - vmovdqu 80(%rsi),%xmm5 - vpshufb %xmm11,%xmm3,%xmm3 - vmovdqu 96(%rsi),%xmm6 - vpshufb %xmm11,%xmm4,%xmm4 - vmovdqu 112(%rsi),%xmm7 - vpshufb %xmm11,%xmm5,%xmm5 - vpaddq -128(%rbp),%xmm0,%xmm8 - vpshufb %xmm11,%xmm6,%xmm6 - vpaddq -96(%rbp),%xmm1,%xmm9 - vpshufb %xmm11,%xmm7,%xmm7 - vpaddq -64(%rbp),%xmm2,%xmm10 - vpaddq -32(%rbp),%xmm3,%xmm11 - vmovdqa %xmm8,0(%rsp) - vpaddq 0(%rbp),%xmm4,%xmm8 - vmovdqa %xmm9,16(%rsp) - vpaddq 32(%rbp),%xmm5,%xmm9 - vmovdqa %xmm10,32(%rsp) - vpaddq 64(%rbp),%xmm6,%xmm10 - vmovdqa %xmm11,48(%rsp) - vpaddq 96(%rbp),%xmm7,%xmm11 - vmovdqa %xmm8,64(%rsp) - movq %rax,%r14 - vmovdqa %xmm9,80(%rsp) - movq %rbx,%rdi - vmovdqa %xmm10,96(%rsp) - xorq %rcx,%rdi - vmovdqa %xmm11,112(%rsp) - movq %r8,%r13 - jmp L$avx_00_47 - -.p2align 4 -L$avx_00_47: - addq $256,%rbp - vpalignr $8,%xmm0,%xmm1,%xmm8 - shrdq $23,%r13,%r13 - movq %r14,%rax - vpalignr $8,%xmm4,%xmm5,%xmm11 - movq %r9,%r12 - shrdq $5,%r14,%r14 - vpsrlq $1,%xmm8,%xmm10 - xorq %r8,%r13 - xorq %r10,%r12 - vpaddq %xmm11,%xmm0,%xmm0 - shrdq $4,%r13,%r13 - xorq %rax,%r14 - vpsrlq $7,%xmm8,%xmm11 - andq %r8,%r12 - xorq %r8,%r13 - vpsllq $56,%xmm8,%xmm9 - addq 0(%rsp),%r11 - movq %rax,%r15 - vpxor %xmm10,%xmm11,%xmm8 - xorq %r10,%r12 - shrdq $6,%r14,%r14 - vpsrlq $7,%xmm10,%xmm10 - xorq %rbx,%r15 - addq %r12,%r11 - vpxor %xmm9,%xmm8,%xmm8 - shrdq $14,%r13,%r13 - andq %r15,%rdi - vpsllq $7,%xmm9,%xmm9 - xorq %rax,%r14 - addq %r13,%r11 - vpxor %xmm10,%xmm8,%xmm8 - xorq %rbx,%rdi - shrdq $28,%r14,%r14 - vpsrlq $6,%xmm7,%xmm11 - addq %r11,%rdx - addq %rdi,%r11 - vpxor %xmm9,%xmm8,%xmm8 - movq %rdx,%r13 - addq %r11,%r14 - vpsllq $3,%xmm7,%xmm10 - shrdq $23,%r13,%r13 - movq %r14,%r11 - vpaddq %xmm8,%xmm0,%xmm0 - movq %r8,%r12 - shrdq $5,%r14,%r14 - vpsrlq $19,%xmm7,%xmm9 - xorq %rdx,%r13 - xorq %r9,%r12 - vpxor %xmm10,%xmm11,%xmm11 - shrdq $4,%r13,%r13 - xorq %r11,%r14 - vpsllq $42,%xmm10,%xmm10 - andq %rdx,%r12 - xorq %rdx,%r13 - vpxor %xmm9,%xmm11,%xmm11 - addq 8(%rsp),%r10 - movq %r11,%rdi - vpsrlq $42,%xmm9,%xmm9 - xorq %r9,%r12 - shrdq $6,%r14,%r14 - vpxor %xmm10,%xmm11,%xmm11 - xorq %rax,%rdi - addq %r12,%r10 - vpxor %xmm9,%xmm11,%xmm11 - shrdq $14,%r13,%r13 - andq %rdi,%r15 - vpaddq %xmm11,%xmm0,%xmm0 - xorq %r11,%r14 - addq %r13,%r10 - vpaddq -128(%rbp),%xmm0,%xmm10 - xorq %rax,%r15 - shrdq $28,%r14,%r14 - addq %r10,%rcx - addq %r15,%r10 - movq %rcx,%r13 - addq %r10,%r14 - vmovdqa %xmm10,0(%rsp) - vpalignr $8,%xmm1,%xmm2,%xmm8 - shrdq $23,%r13,%r13 - movq %r14,%r10 - vpalignr $8,%xmm5,%xmm6,%xmm11 - movq %rdx,%r12 - shrdq $5,%r14,%r14 - vpsrlq $1,%xmm8,%xmm10 - xorq %rcx,%r13 - xorq %r8,%r12 - vpaddq %xmm11,%xmm1,%xmm1 - shrdq $4,%r13,%r13 - xorq %r10,%r14 - vpsrlq $7,%xmm8,%xmm11 - andq %rcx,%r12 - xorq %rcx,%r13 - vpsllq $56,%xmm8,%xmm9 - addq 16(%rsp),%r9 - movq %r10,%r15 - vpxor %xmm10,%xmm11,%xmm8 - xorq %r8,%r12 - shrdq $6,%r14,%r14 - vpsrlq $7,%xmm10,%xmm10 - xorq %r11,%r15 - addq %r12,%r9 - vpxor %xmm9,%xmm8,%xmm8 - shrdq $14,%r13,%r13 - andq %r15,%rdi - vpsllq $7,%xmm9,%xmm9 - xorq %r10,%r14 - addq %r13,%r9 - vpxor %xmm10,%xmm8,%xmm8 - xorq %r11,%rdi - shrdq $28,%r14,%r14 - vpsrlq $6,%xmm0,%xmm11 - addq %r9,%rbx - addq %rdi,%r9 - vpxor %xmm9,%xmm8,%xmm8 - movq %rbx,%r13 - addq %r9,%r14 - vpsllq $3,%xmm0,%xmm10 - shrdq $23,%r13,%r13 - movq %r14,%r9 - vpaddq %xmm8,%xmm1,%xmm1 - movq %rcx,%r12 - shrdq $5,%r14,%r14 - vpsrlq $19,%xmm0,%xmm9 - xorq %rbx,%r13 - xorq %rdx,%r12 - vpxor %xmm10,%xmm11,%xmm11 - shrdq $4,%r13,%r13 - xorq %r9,%r14 - vpsllq $42,%xmm10,%xmm10 - andq %rbx,%r12 - xorq %rbx,%r13 - vpxor %xmm9,%xmm11,%xmm11 - addq 24(%rsp),%r8 - movq %r9,%rdi - vpsrlq $42,%xmm9,%xmm9 - xorq %rdx,%r12 - shrdq $6,%r14,%r14 - vpxor %xmm10,%xmm11,%xmm11 - xorq %r10,%rdi - addq %r12,%r8 - vpxor %xmm9,%xmm11,%xmm11 - shrdq $14,%r13,%r13 - andq %rdi,%r15 - vpaddq %xmm11,%xmm1,%xmm1 - xorq %r9,%r14 - addq %r13,%r8 - vpaddq -96(%rbp),%xmm1,%xmm10 - xorq %r10,%r15 - shrdq $28,%r14,%r14 - addq %r8,%rax - addq %r15,%r8 - movq %rax,%r13 - addq %r8,%r14 - vmovdqa %xmm10,16(%rsp) - vpalignr $8,%xmm2,%xmm3,%xmm8 - shrdq $23,%r13,%r13 - movq %r14,%r8 - vpalignr $8,%xmm6,%xmm7,%xmm11 - movq %rbx,%r12 - shrdq $5,%r14,%r14 - vpsrlq $1,%xmm8,%xmm10 - xorq %rax,%r13 - xorq %rcx,%r12 - vpaddq %xmm11,%xmm2,%xmm2 - shrdq $4,%r13,%r13 - xorq %r8,%r14 - vpsrlq $7,%xmm8,%xmm11 - andq %rax,%r12 - xorq %rax,%r13 - vpsllq $56,%xmm8,%xmm9 - addq 32(%rsp),%rdx - movq %r8,%r15 - vpxor %xmm10,%xmm11,%xmm8 - xorq %rcx,%r12 - shrdq $6,%r14,%r14 - vpsrlq $7,%xmm10,%xmm10 - xorq %r9,%r15 - addq %r12,%rdx - vpxor %xmm9,%xmm8,%xmm8 - shrdq $14,%r13,%r13 - andq %r15,%rdi - vpsllq $7,%xmm9,%xmm9 - xorq %r8,%r14 - addq %r13,%rdx - vpxor %xmm10,%xmm8,%xmm8 - xorq %r9,%rdi - shrdq $28,%r14,%r14 - vpsrlq $6,%xmm1,%xmm11 - addq %rdx,%r11 - addq %rdi,%rdx - vpxor %xmm9,%xmm8,%xmm8 - movq %r11,%r13 - addq %rdx,%r14 - vpsllq $3,%xmm1,%xmm10 - shrdq $23,%r13,%r13 - movq %r14,%rdx - vpaddq %xmm8,%xmm2,%xmm2 - movq %rax,%r12 - shrdq $5,%r14,%r14 - vpsrlq $19,%xmm1,%xmm9 - xorq %r11,%r13 - xorq %rbx,%r12 - vpxor %xmm10,%xmm11,%xmm11 - shrdq $4,%r13,%r13 - xorq %rdx,%r14 - vpsllq $42,%xmm10,%xmm10 - andq %r11,%r12 - xorq %r11,%r13 - vpxor %xmm9,%xmm11,%xmm11 - addq 40(%rsp),%rcx - movq %rdx,%rdi - vpsrlq $42,%xmm9,%xmm9 - xorq %rbx,%r12 - shrdq $6,%r14,%r14 - vpxor %xmm10,%xmm11,%xmm11 - xorq %r8,%rdi - addq %r12,%rcx - vpxor %xmm9,%xmm11,%xmm11 - shrdq $14,%r13,%r13 - andq %rdi,%r15 - vpaddq %xmm11,%xmm2,%xmm2 - xorq %rdx,%r14 - addq %r13,%rcx - vpaddq -64(%rbp),%xmm2,%xmm10 - xorq %r8,%r15 - shrdq $28,%r14,%r14 - addq %rcx,%r10 - addq %r15,%rcx - movq %r10,%r13 - addq %rcx,%r14 - vmovdqa %xmm10,32(%rsp) - vpalignr $8,%xmm3,%xmm4,%xmm8 - shrdq $23,%r13,%r13 - movq %r14,%rcx - vpalignr $8,%xmm7,%xmm0,%xmm11 - movq %r11,%r12 - shrdq $5,%r14,%r14 - vpsrlq $1,%xmm8,%xmm10 - xorq %r10,%r13 - xorq %rax,%r12 - vpaddq %xmm11,%xmm3,%xmm3 - shrdq $4,%r13,%r13 - xorq %rcx,%r14 - vpsrlq $7,%xmm8,%xmm11 - andq %r10,%r12 - xorq %r10,%r13 - vpsllq $56,%xmm8,%xmm9 - addq 48(%rsp),%rbx - movq %rcx,%r15 - vpxor %xmm10,%xmm11,%xmm8 - xorq %rax,%r12 - shrdq $6,%r14,%r14 - vpsrlq $7,%xmm10,%xmm10 - xorq %rdx,%r15 - addq %r12,%rbx - vpxor %xmm9,%xmm8,%xmm8 - shrdq $14,%r13,%r13 - andq %r15,%rdi - vpsllq $7,%xmm9,%xmm9 - xorq %rcx,%r14 - addq %r13,%rbx - vpxor %xmm10,%xmm8,%xmm8 - xorq %rdx,%rdi - shrdq $28,%r14,%r14 - vpsrlq $6,%xmm2,%xmm11 - addq %rbx,%r9 - addq %rdi,%rbx - vpxor %xmm9,%xmm8,%xmm8 - movq %r9,%r13 - addq %rbx,%r14 - vpsllq $3,%xmm2,%xmm10 - shrdq $23,%r13,%r13 - movq %r14,%rbx - vpaddq %xmm8,%xmm3,%xmm3 - movq %r10,%r12 - shrdq $5,%r14,%r14 - vpsrlq $19,%xmm2,%xmm9 - xorq %r9,%r13 - xorq %r11,%r12 - vpxor %xmm10,%xmm11,%xmm11 - shrdq $4,%r13,%r13 - xorq %rbx,%r14 - vpsllq $42,%xmm10,%xmm10 - andq %r9,%r12 - xorq %r9,%r13 - vpxor %xmm9,%xmm11,%xmm11 - addq 56(%rsp),%rax - movq %rbx,%rdi - vpsrlq $42,%xmm9,%xmm9 - xorq %r11,%r12 - shrdq $6,%r14,%r14 - vpxor %xmm10,%xmm11,%xmm11 - xorq %rcx,%rdi - addq %r12,%rax - vpxor %xmm9,%xmm11,%xmm11 - shrdq $14,%r13,%r13 - andq %rdi,%r15 - vpaddq %xmm11,%xmm3,%xmm3 - xorq %rbx,%r14 - addq %r13,%rax - vpaddq -32(%rbp),%xmm3,%xmm10 - xorq %rcx,%r15 - shrdq $28,%r14,%r14 - addq %rax,%r8 - addq %r15,%rax - movq %r8,%r13 - addq %rax,%r14 - vmovdqa %xmm10,48(%rsp) - vpalignr $8,%xmm4,%xmm5,%xmm8 - shrdq $23,%r13,%r13 - movq %r14,%rax - vpalignr $8,%xmm0,%xmm1,%xmm11 - movq %r9,%r12 - shrdq $5,%r14,%r14 - vpsrlq $1,%xmm8,%xmm10 - xorq %r8,%r13 - xorq %r10,%r12 - vpaddq %xmm11,%xmm4,%xmm4 - shrdq $4,%r13,%r13 - xorq %rax,%r14 - vpsrlq $7,%xmm8,%xmm11 - andq %r8,%r12 - xorq %r8,%r13 - vpsllq $56,%xmm8,%xmm9 - addq 64(%rsp),%r11 - movq %rax,%r15 - vpxor %xmm10,%xmm11,%xmm8 - xorq %r10,%r12 - shrdq $6,%r14,%r14 - vpsrlq $7,%xmm10,%xmm10 - xorq %rbx,%r15 - addq %r12,%r11 - vpxor %xmm9,%xmm8,%xmm8 - shrdq $14,%r13,%r13 - andq %r15,%rdi - vpsllq $7,%xmm9,%xmm9 - xorq %rax,%r14 - addq %r13,%r11 - vpxor %xmm10,%xmm8,%xmm8 - xorq %rbx,%rdi - shrdq $28,%r14,%r14 - vpsrlq $6,%xmm3,%xmm11 - addq %r11,%rdx - addq %rdi,%r11 - vpxor %xmm9,%xmm8,%xmm8 - movq %rdx,%r13 - addq %r11,%r14 - vpsllq $3,%xmm3,%xmm10 - shrdq $23,%r13,%r13 - movq %r14,%r11 - vpaddq %xmm8,%xmm4,%xmm4 - movq %r8,%r12 - shrdq $5,%r14,%r14 - vpsrlq $19,%xmm3,%xmm9 - xorq %rdx,%r13 - xorq %r9,%r12 - vpxor %xmm10,%xmm11,%xmm11 - shrdq $4,%r13,%r13 - xorq %r11,%r14 - vpsllq $42,%xmm10,%xmm10 - andq %rdx,%r12 - xorq %rdx,%r13 - vpxor %xmm9,%xmm11,%xmm11 - addq 72(%rsp),%r10 - movq %r11,%rdi - vpsrlq $42,%xmm9,%xmm9 - xorq %r9,%r12 - shrdq $6,%r14,%r14 - vpxor %xmm10,%xmm11,%xmm11 - xorq %rax,%rdi - addq %r12,%r10 - vpxor %xmm9,%xmm11,%xmm11 - shrdq $14,%r13,%r13 - andq %rdi,%r15 - vpaddq %xmm11,%xmm4,%xmm4 - xorq %r11,%r14 - addq %r13,%r10 - vpaddq 0(%rbp),%xmm4,%xmm10 - xorq %rax,%r15 - shrdq $28,%r14,%r14 - addq %r10,%rcx - addq %r15,%r10 - movq %rcx,%r13 - addq %r10,%r14 - vmovdqa %xmm10,64(%rsp) - vpalignr $8,%xmm5,%xmm6,%xmm8 - shrdq $23,%r13,%r13 - movq %r14,%r10 - vpalignr $8,%xmm1,%xmm2,%xmm11 - movq %rdx,%r12 - shrdq $5,%r14,%r14 - vpsrlq $1,%xmm8,%xmm10 - xorq %rcx,%r13 - xorq %r8,%r12 - vpaddq %xmm11,%xmm5,%xmm5 - shrdq $4,%r13,%r13 - xorq %r10,%r14 - vpsrlq $7,%xmm8,%xmm11 - andq %rcx,%r12 - xorq %rcx,%r13 - vpsllq $56,%xmm8,%xmm9 - addq 80(%rsp),%r9 - movq %r10,%r15 - vpxor %xmm10,%xmm11,%xmm8 - xorq %r8,%r12 - shrdq $6,%r14,%r14 - vpsrlq $7,%xmm10,%xmm10 - xorq %r11,%r15 - addq %r12,%r9 - vpxor %xmm9,%xmm8,%xmm8 - shrdq $14,%r13,%r13 - andq %r15,%rdi - vpsllq $7,%xmm9,%xmm9 - xorq %r10,%r14 - addq %r13,%r9 - vpxor %xmm10,%xmm8,%xmm8 - xorq %r11,%rdi - shrdq $28,%r14,%r14 - vpsrlq $6,%xmm4,%xmm11 - addq %r9,%rbx - addq %rdi,%r9 - vpxor %xmm9,%xmm8,%xmm8 - movq %rbx,%r13 - addq %r9,%r14 - vpsllq $3,%xmm4,%xmm10 - shrdq $23,%r13,%r13 - movq %r14,%r9 - vpaddq %xmm8,%xmm5,%xmm5 - movq %rcx,%r12 - shrdq $5,%r14,%r14 - vpsrlq $19,%xmm4,%xmm9 - xorq %rbx,%r13 - xorq %rdx,%r12 - vpxor %xmm10,%xmm11,%xmm11 - shrdq $4,%r13,%r13 - xorq %r9,%r14 - vpsllq $42,%xmm10,%xmm10 - andq %rbx,%r12 - xorq %rbx,%r13 - vpxor %xmm9,%xmm11,%xmm11 - addq 88(%rsp),%r8 - movq %r9,%rdi - vpsrlq $42,%xmm9,%xmm9 - xorq %rdx,%r12 - shrdq $6,%r14,%r14 - vpxor %xmm10,%xmm11,%xmm11 - xorq %r10,%rdi - addq %r12,%r8 - vpxor %xmm9,%xmm11,%xmm11 - shrdq $14,%r13,%r13 - andq %rdi,%r15 - vpaddq %xmm11,%xmm5,%xmm5 - xorq %r9,%r14 - addq %r13,%r8 - vpaddq 32(%rbp),%xmm5,%xmm10 - xorq %r10,%r15 - shrdq $28,%r14,%r14 - addq %r8,%rax - addq %r15,%r8 - movq %rax,%r13 - addq %r8,%r14 - vmovdqa %xmm10,80(%rsp) - vpalignr $8,%xmm6,%xmm7,%xmm8 - shrdq $23,%r13,%r13 - movq %r14,%r8 - vpalignr $8,%xmm2,%xmm3,%xmm11 - movq %rbx,%r12 - shrdq $5,%r14,%r14 - vpsrlq $1,%xmm8,%xmm10 - xorq %rax,%r13 - xorq %rcx,%r12 - vpaddq %xmm11,%xmm6,%xmm6 - shrdq $4,%r13,%r13 - xorq %r8,%r14 - vpsrlq $7,%xmm8,%xmm11 - andq %rax,%r12 - xorq %rax,%r13 - vpsllq $56,%xmm8,%xmm9 - addq 96(%rsp),%rdx - movq %r8,%r15 - vpxor %xmm10,%xmm11,%xmm8 - xorq %rcx,%r12 - shrdq $6,%r14,%r14 - vpsrlq $7,%xmm10,%xmm10 - xorq %r9,%r15 - addq %r12,%rdx - vpxor %xmm9,%xmm8,%xmm8 - shrdq $14,%r13,%r13 - andq %r15,%rdi - vpsllq $7,%xmm9,%xmm9 - xorq %r8,%r14 - addq %r13,%rdx - vpxor %xmm10,%xmm8,%xmm8 - xorq %r9,%rdi - shrdq $28,%r14,%r14 - vpsrlq $6,%xmm5,%xmm11 - addq %rdx,%r11 - addq %rdi,%rdx - vpxor %xmm9,%xmm8,%xmm8 - movq %r11,%r13 - addq %rdx,%r14 - vpsllq $3,%xmm5,%xmm10 - shrdq $23,%r13,%r13 - movq %r14,%rdx - vpaddq %xmm8,%xmm6,%xmm6 - movq %rax,%r12 - shrdq $5,%r14,%r14 - vpsrlq $19,%xmm5,%xmm9 - xorq %r11,%r13 - xorq %rbx,%r12 - vpxor %xmm10,%xmm11,%xmm11 - shrdq $4,%r13,%r13 - xorq %rdx,%r14 - vpsllq $42,%xmm10,%xmm10 - andq %r11,%r12 - xorq %r11,%r13 - vpxor %xmm9,%xmm11,%xmm11 - addq 104(%rsp),%rcx - movq %rdx,%rdi - vpsrlq $42,%xmm9,%xmm9 - xorq %rbx,%r12 - shrdq $6,%r14,%r14 - vpxor %xmm10,%xmm11,%xmm11 - xorq %r8,%rdi - addq %r12,%rcx - vpxor %xmm9,%xmm11,%xmm11 - shrdq $14,%r13,%r13 - andq %rdi,%r15 - vpaddq %xmm11,%xmm6,%xmm6 - xorq %rdx,%r14 - addq %r13,%rcx - vpaddq 64(%rbp),%xmm6,%xmm10 - xorq %r8,%r15 - shrdq $28,%r14,%r14 - addq %rcx,%r10 - addq %r15,%rcx - movq %r10,%r13 - addq %rcx,%r14 - vmovdqa %xmm10,96(%rsp) - vpalignr $8,%xmm7,%xmm0,%xmm8 - shrdq $23,%r13,%r13 - movq %r14,%rcx - vpalignr $8,%xmm3,%xmm4,%xmm11 - movq %r11,%r12 - shrdq $5,%r14,%r14 - vpsrlq $1,%xmm8,%xmm10 - xorq %r10,%r13 - xorq %rax,%r12 - vpaddq %xmm11,%xmm7,%xmm7 - shrdq $4,%r13,%r13 - xorq %rcx,%r14 - vpsrlq $7,%xmm8,%xmm11 - andq %r10,%r12 - xorq %r10,%r13 - vpsllq $56,%xmm8,%xmm9 - addq 112(%rsp),%rbx - movq %rcx,%r15 - vpxor %xmm10,%xmm11,%xmm8 - xorq %rax,%r12 - shrdq $6,%r14,%r14 - vpsrlq $7,%xmm10,%xmm10 - xorq %rdx,%r15 - addq %r12,%rbx - vpxor %xmm9,%xmm8,%xmm8 - shrdq $14,%r13,%r13 - andq %r15,%rdi - vpsllq $7,%xmm9,%xmm9 - xorq %rcx,%r14 - addq %r13,%rbx - vpxor %xmm10,%xmm8,%xmm8 - xorq %rdx,%rdi - shrdq $28,%r14,%r14 - vpsrlq $6,%xmm6,%xmm11 - addq %rbx,%r9 - addq %rdi,%rbx - vpxor %xmm9,%xmm8,%xmm8 - movq %r9,%r13 - addq %rbx,%r14 - vpsllq $3,%xmm6,%xmm10 - shrdq $23,%r13,%r13 - movq %r14,%rbx - vpaddq %xmm8,%xmm7,%xmm7 - movq %r10,%r12 - shrdq $5,%r14,%r14 - vpsrlq $19,%xmm6,%xmm9 - xorq %r9,%r13 - xorq %r11,%r12 - vpxor %xmm10,%xmm11,%xmm11 - shrdq $4,%r13,%r13 - xorq %rbx,%r14 - vpsllq $42,%xmm10,%xmm10 - andq %r9,%r12 - xorq %r9,%r13 - vpxor %xmm9,%xmm11,%xmm11 - addq 120(%rsp),%rax - movq %rbx,%rdi - vpsrlq $42,%xmm9,%xmm9 - xorq %r11,%r12 - shrdq $6,%r14,%r14 - vpxor %xmm10,%xmm11,%xmm11 - xorq %rcx,%rdi - addq %r12,%rax - vpxor %xmm9,%xmm11,%xmm11 - shrdq $14,%r13,%r13 - andq %rdi,%r15 - vpaddq %xmm11,%xmm7,%xmm7 - xorq %rbx,%r14 - addq %r13,%rax - vpaddq 96(%rbp),%xmm7,%xmm10 - xorq %rcx,%r15 - shrdq $28,%r14,%r14 - addq %rax,%r8 - addq %r15,%rax - movq %r8,%r13 - addq %rax,%r14 - vmovdqa %xmm10,112(%rsp) - cmpb $0,135(%rbp) - jne L$avx_00_47 - shrdq $23,%r13,%r13 - movq %r14,%rax - movq %r9,%r12 - shrdq $5,%r14,%r14 - xorq %r8,%r13 - xorq %r10,%r12 - shrdq $4,%r13,%r13 - xorq %rax,%r14 - andq %r8,%r12 - xorq %r8,%r13 - addq 0(%rsp),%r11 - movq %rax,%r15 - xorq %r10,%r12 - shrdq $6,%r14,%r14 - xorq %rbx,%r15 - addq %r12,%r11 - shrdq $14,%r13,%r13 - andq %r15,%rdi - xorq %rax,%r14 - addq %r13,%r11 - xorq %rbx,%rdi - shrdq $28,%r14,%r14 - addq %r11,%rdx - addq %rdi,%r11 - movq %rdx,%r13 - addq %r11,%r14 - shrdq $23,%r13,%r13 - movq %r14,%r11 - movq %r8,%r12 - shrdq $5,%r14,%r14 - xorq %rdx,%r13 - xorq %r9,%r12 - shrdq $4,%r13,%r13 - xorq %r11,%r14 - andq %rdx,%r12 - xorq %rdx,%r13 - addq 8(%rsp),%r10 - movq %r11,%rdi - xorq %r9,%r12 - shrdq $6,%r14,%r14 - xorq %rax,%rdi - addq %r12,%r10 - shrdq $14,%r13,%r13 - andq %rdi,%r15 - xorq %r11,%r14 - addq %r13,%r10 - xorq %rax,%r15 - shrdq $28,%r14,%r14 - addq %r10,%rcx - addq %r15,%r10 - movq %rcx,%r13 - addq %r10,%r14 - shrdq $23,%r13,%r13 - movq %r14,%r10 - movq %rdx,%r12 - shrdq $5,%r14,%r14 - xorq %rcx,%r13 - xorq %r8,%r12 - shrdq $4,%r13,%r13 - xorq %r10,%r14 - andq %rcx,%r12 - xorq %rcx,%r13 - addq 16(%rsp),%r9 - movq %r10,%r15 - xorq %r8,%r12 - shrdq $6,%r14,%r14 - xorq %r11,%r15 - addq %r12,%r9 - shrdq $14,%r13,%r13 - andq %r15,%rdi - xorq %r10,%r14 - addq %r13,%r9 - xorq %r11,%rdi - shrdq $28,%r14,%r14 - addq %r9,%rbx - addq %rdi,%r9 - movq %rbx,%r13 - addq %r9,%r14 - shrdq $23,%r13,%r13 - movq %r14,%r9 - movq %rcx,%r12 - shrdq $5,%r14,%r14 - xorq %rbx,%r13 - xorq %rdx,%r12 - shrdq $4,%r13,%r13 - xorq %r9,%r14 - andq %rbx,%r12 - xorq %rbx,%r13 - addq 24(%rsp),%r8 - movq %r9,%rdi - xorq %rdx,%r12 - shrdq $6,%r14,%r14 - xorq %r10,%rdi - addq %r12,%r8 - shrdq $14,%r13,%r13 - andq %rdi,%r15 - xorq %r9,%r14 - addq %r13,%r8 - xorq %r10,%r15 - shrdq $28,%r14,%r14 - addq %r8,%rax - addq %r15,%r8 - movq %rax,%r13 - addq %r8,%r14 - shrdq $23,%r13,%r13 - movq %r14,%r8 - movq %rbx,%r12 - shrdq $5,%r14,%r14 - xorq %rax,%r13 - xorq %rcx,%r12 - shrdq $4,%r13,%r13 - xorq %r8,%r14 - andq %rax,%r12 - xorq %rax,%r13 - addq 32(%rsp),%rdx - movq %r8,%r15 - xorq %rcx,%r12 - shrdq $6,%r14,%r14 - xorq %r9,%r15 - addq %r12,%rdx - shrdq $14,%r13,%r13 - andq %r15,%rdi - xorq %r8,%r14 - addq %r13,%rdx - xorq %r9,%rdi - shrdq $28,%r14,%r14 - addq %rdx,%r11 - addq %rdi,%rdx - movq %r11,%r13 - addq %rdx,%r14 - shrdq $23,%r13,%r13 - movq %r14,%rdx - movq %rax,%r12 - shrdq $5,%r14,%r14 - xorq %r11,%r13 - xorq %rbx,%r12 - shrdq $4,%r13,%r13 - xorq %rdx,%r14 - andq %r11,%r12 - xorq %r11,%r13 - addq 40(%rsp),%rcx - movq %rdx,%rdi - xorq %rbx,%r12 - shrdq $6,%r14,%r14 - xorq %r8,%rdi - addq %r12,%rcx - shrdq $14,%r13,%r13 - andq %rdi,%r15 - xorq %rdx,%r14 - addq %r13,%rcx - xorq %r8,%r15 - shrdq $28,%r14,%r14 - addq %rcx,%r10 - addq %r15,%rcx - movq %r10,%r13 - addq %rcx,%r14 - shrdq $23,%r13,%r13 - movq %r14,%rcx - movq %r11,%r12 - shrdq $5,%r14,%r14 - xorq %r10,%r13 - xorq %rax,%r12 - shrdq $4,%r13,%r13 - xorq %rcx,%r14 - andq %r10,%r12 - xorq %r10,%r13 - addq 48(%rsp),%rbx - movq %rcx,%r15 - xorq %rax,%r12 - shrdq $6,%r14,%r14 - xorq %rdx,%r15 - addq %r12,%rbx - shrdq $14,%r13,%r13 - andq %r15,%rdi - xorq %rcx,%r14 - addq %r13,%rbx - xorq %rdx,%rdi - shrdq $28,%r14,%r14 - addq %rbx,%r9 - addq %rdi,%rbx - movq %r9,%r13 - addq %rbx,%r14 - shrdq $23,%r13,%r13 - movq %r14,%rbx - movq %r10,%r12 - shrdq $5,%r14,%r14 - xorq %r9,%r13 - xorq %r11,%r12 - shrdq $4,%r13,%r13 - xorq %rbx,%r14 - andq %r9,%r12 - xorq %r9,%r13 - addq 56(%rsp),%rax - movq %rbx,%rdi - xorq %r11,%r12 - shrdq $6,%r14,%r14 - xorq %rcx,%rdi - addq %r12,%rax - shrdq $14,%r13,%r13 - andq %rdi,%r15 - xorq %rbx,%r14 - addq %r13,%rax - xorq %rcx,%r15 - shrdq $28,%r14,%r14 - addq %rax,%r8 - addq %r15,%rax - movq %r8,%r13 - addq %rax,%r14 - shrdq $23,%r13,%r13 - movq %r14,%rax - movq %r9,%r12 - shrdq $5,%r14,%r14 - xorq %r8,%r13 - xorq %r10,%r12 - shrdq $4,%r13,%r13 - xorq %rax,%r14 - andq %r8,%r12 - xorq %r8,%r13 - addq 64(%rsp),%r11 - movq %rax,%r15 - xorq %r10,%r12 - shrdq $6,%r14,%r14 - xorq %rbx,%r15 - addq %r12,%r11 - shrdq $14,%r13,%r13 - andq %r15,%rdi - xorq %rax,%r14 - addq %r13,%r11 - xorq %rbx,%rdi - shrdq $28,%r14,%r14 - addq %r11,%rdx - addq %rdi,%r11 - movq %rdx,%r13 - addq %r11,%r14 - shrdq $23,%r13,%r13 - movq %r14,%r11 - movq %r8,%r12 - shrdq $5,%r14,%r14 - xorq %rdx,%r13 - xorq %r9,%r12 - shrdq $4,%r13,%r13 - xorq %r11,%r14 - andq %rdx,%r12 - xorq %rdx,%r13 - addq 72(%rsp),%r10 - movq %r11,%rdi - xorq %r9,%r12 - shrdq $6,%r14,%r14 - xorq %rax,%rdi - addq %r12,%r10 - shrdq $14,%r13,%r13 - andq %rdi,%r15 - xorq %r11,%r14 - addq %r13,%r10 - xorq %rax,%r15 - shrdq $28,%r14,%r14 - addq %r10,%rcx - addq %r15,%r10 - movq %rcx,%r13 - addq %r10,%r14 - shrdq $23,%r13,%r13 - movq %r14,%r10 - movq %rdx,%r12 - shrdq $5,%r14,%r14 - xorq %rcx,%r13 - xorq %r8,%r12 - shrdq $4,%r13,%r13 - xorq %r10,%r14 - andq %rcx,%r12 - xorq %rcx,%r13 - addq 80(%rsp),%r9 - movq %r10,%r15 - xorq %r8,%r12 - shrdq $6,%r14,%r14 - xorq %r11,%r15 - addq %r12,%r9 - shrdq $14,%r13,%r13 - andq %r15,%rdi - xorq %r10,%r14 - addq %r13,%r9 - xorq %r11,%rdi - shrdq $28,%r14,%r14 - addq %r9,%rbx - addq %rdi,%r9 - movq %rbx,%r13 - addq %r9,%r14 - shrdq $23,%r13,%r13 - movq %r14,%r9 - movq %rcx,%r12 - shrdq $5,%r14,%r14 - xorq %rbx,%r13 - xorq %rdx,%r12 - shrdq $4,%r13,%r13 - xorq %r9,%r14 - andq %rbx,%r12 - xorq %rbx,%r13 - addq 88(%rsp),%r8 - movq %r9,%rdi - xorq %rdx,%r12 - shrdq $6,%r14,%r14 - xorq %r10,%rdi - addq %r12,%r8 - shrdq $14,%r13,%r13 - andq %rdi,%r15 - xorq %r9,%r14 - addq %r13,%r8 - xorq %r10,%r15 - shrdq $28,%r14,%r14 - addq %r8,%rax - addq %r15,%r8 - movq %rax,%r13 - addq %r8,%r14 - shrdq $23,%r13,%r13 - movq %r14,%r8 - movq %rbx,%r12 - shrdq $5,%r14,%r14 - xorq %rax,%r13 - xorq %rcx,%r12 - shrdq $4,%r13,%r13 - xorq %r8,%r14 - andq %rax,%r12 - xorq %rax,%r13 - addq 96(%rsp),%rdx - movq %r8,%r15 - xorq %rcx,%r12 - shrdq $6,%r14,%r14 - xorq %r9,%r15 - addq %r12,%rdx - shrdq $14,%r13,%r13 - andq %r15,%rdi - xorq %r8,%r14 - addq %r13,%rdx - xorq %r9,%rdi - shrdq $28,%r14,%r14 - addq %rdx,%r11 - addq %rdi,%rdx - movq %r11,%r13 - addq %rdx,%r14 - shrdq $23,%r13,%r13 - movq %r14,%rdx - movq %rax,%r12 - shrdq $5,%r14,%r14 - xorq %r11,%r13 - xorq %rbx,%r12 - shrdq $4,%r13,%r13 - xorq %rdx,%r14 - andq %r11,%r12 - xorq %r11,%r13 - addq 104(%rsp),%rcx - movq %rdx,%rdi - xorq %rbx,%r12 - shrdq $6,%r14,%r14 - xorq %r8,%rdi - addq %r12,%rcx - shrdq $14,%r13,%r13 - andq %rdi,%r15 - xorq %rdx,%r14 - addq %r13,%rcx - xorq %r8,%r15 - shrdq $28,%r14,%r14 - addq %rcx,%r10 - addq %r15,%rcx - movq %r10,%r13 - addq %rcx,%r14 - shrdq $23,%r13,%r13 - movq %r14,%rcx - movq %r11,%r12 - shrdq $5,%r14,%r14 - xorq %r10,%r13 - xorq %rax,%r12 - shrdq $4,%r13,%r13 - xorq %rcx,%r14 - andq %r10,%r12 - xorq %r10,%r13 - addq 112(%rsp),%rbx - movq %rcx,%r15 - xorq %rax,%r12 - shrdq $6,%r14,%r14 - xorq %rdx,%r15 - addq %r12,%rbx - shrdq $14,%r13,%r13 - andq %r15,%rdi - xorq %rcx,%r14 - addq %r13,%rbx - xorq %rdx,%rdi - shrdq $28,%r14,%r14 - addq %rbx,%r9 - addq %rdi,%rbx - movq %r9,%r13 - addq %rbx,%r14 - shrdq $23,%r13,%r13 - movq %r14,%rbx - movq %r10,%r12 - shrdq $5,%r14,%r14 - xorq %r9,%r13 - xorq %r11,%r12 - shrdq $4,%r13,%r13 - xorq %rbx,%r14 - andq %r9,%r12 - xorq %r9,%r13 - addq 120(%rsp),%rax - movq %rbx,%rdi - xorq %r11,%r12 - shrdq $6,%r14,%r14 - xorq %rcx,%rdi - addq %r12,%rax - shrdq $14,%r13,%r13 - andq %rdi,%r15 - xorq %rbx,%r14 - addq %r13,%rax - xorq %rcx,%r15 - shrdq $28,%r14,%r14 - addq %rax,%r8 - addq %r15,%rax - movq %r8,%r13 - addq %rax,%r14 - movq 128+0(%rsp),%rdi - movq %r14,%rax - - addq 0(%rdi),%rax - leaq 128(%rsi),%rsi - addq 8(%rdi),%rbx - addq 16(%rdi),%rcx - addq 24(%rdi),%rdx - addq 32(%rdi),%r8 - addq 40(%rdi),%r9 - addq 48(%rdi),%r10 - addq 56(%rdi),%r11 - - cmpq 128+16(%rsp),%rsi - - movq %rax,0(%rdi) - movq %rbx,8(%rdi) - movq %rcx,16(%rdi) - movq %rdx,24(%rdi) - movq %r8,32(%rdi) - movq %r9,40(%rdi) - movq %r10,48(%rdi) - movq %r11,56(%rdi) - jb L$loop_avx - - movq 152(%rsp),%rsi - - vzeroupper - movq -48(%rsi),%r15 - - movq -40(%rsi),%r14 - - movq -32(%rsi),%r13 - - movq -24(%rsi),%r12 - - movq -16(%rsi),%rbp - - movq -8(%rsi),%rbx - - leaq (%rsi),%rsp - -L$epilogue_avx: - .byte 0xf3,0xc3 - - -#endif Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/sha512-x86_64-nasm.obj and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/sha512-x86_64-nasm.obj differ diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/tmp/aesni-gcm-x86_64-nasm.asm temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/tmp/aesni-gcm-x86_64-nasm.asm --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/tmp/aesni-gcm-x86_64-nasm.asm 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/tmp/aesni-gcm-x86_64-nasm.asm 1970-01-01 00:00:00.000000000 +0000 @@ -1,1025 +0,0 @@ -; This file is generated from a similarly-named Perl script in the BoringSSL -; source tree. Do not edit by hand. - -default rel -%define XMMWORD -%define YMMWORD -%define ZMMWORD -section .text code align=64 - - - -ALIGN 32 -_aesni_ctr32_ghash_6x: - - vmovdqu xmm2,XMMWORD[32+r11] - sub rdx,6 - vpxor xmm4,xmm4,xmm4 - vmovdqu xmm15,XMMWORD[((0-128))+rcx] - vpaddb xmm10,xmm1,xmm2 - vpaddb xmm11,xmm10,xmm2 - vpaddb xmm12,xmm11,xmm2 - vpaddb xmm13,xmm12,xmm2 - vpaddb xmm14,xmm13,xmm2 - vpxor xmm9,xmm1,xmm15 - vmovdqu XMMWORD[(16+8)+rsp],xmm4 - jmp NEAR $L$oop6x - -ALIGN 32 -$L$oop6x: - add ebx,100663296 - jc NEAR $L$handle_ctr32 - vmovdqu xmm3,XMMWORD[((0-32))+r9] - vpaddb xmm1,xmm14,xmm2 - vpxor xmm10,xmm10,xmm15 - vpxor xmm11,xmm11,xmm15 - -$L$resume_ctr32: - vmovdqu XMMWORD[r8],xmm1 - vpclmulqdq xmm5,xmm7,xmm3,0x10 - vpxor xmm12,xmm12,xmm15 - vmovups xmm2,XMMWORD[((16-128))+rcx] - vpclmulqdq xmm6,xmm7,xmm3,0x01 - - - - - - - - - - - - - - - - - - xor r12,r12 - cmp r15,r14 - - vaesenc xmm9,xmm9,xmm2 - vmovdqu xmm0,XMMWORD[((48+8))+rsp] - vpxor xmm13,xmm13,xmm15 - vpclmulqdq xmm1,xmm7,xmm3,0x00 - vaesenc xmm10,xmm10,xmm2 - vpxor xmm14,xmm14,xmm15 - setnc r12b - vpclmulqdq xmm7,xmm7,xmm3,0x11 - vaesenc xmm11,xmm11,xmm2 - vmovdqu xmm3,XMMWORD[((16-32))+r9] - neg r12 - vaesenc xmm12,xmm12,xmm2 - vpxor xmm6,xmm6,xmm5 - vpclmulqdq xmm5,xmm0,xmm3,0x00 - vpxor xmm8,xmm8,xmm4 - vaesenc xmm13,xmm13,xmm2 - vpxor xmm4,xmm1,xmm5 - and r12,0x60 - vmovups xmm15,XMMWORD[((32-128))+rcx] - vpclmulqdq xmm1,xmm0,xmm3,0x10 - vaesenc xmm14,xmm14,xmm2 - - vpclmulqdq xmm2,xmm0,xmm3,0x01 - lea r14,[r12*1+r14] - vaesenc xmm9,xmm9,xmm15 - vpxor xmm8,xmm8,XMMWORD[((16+8))+rsp] - vpclmulqdq xmm3,xmm0,xmm3,0x11 - vmovdqu xmm0,XMMWORD[((64+8))+rsp] - vaesenc xmm10,xmm10,xmm15 - movbe r13,QWORD[88+r14] - vaesenc xmm11,xmm11,xmm15 - movbe r12,QWORD[80+r14] - vaesenc xmm12,xmm12,xmm15 - mov QWORD[((32+8))+rsp],r13 - vaesenc xmm13,xmm13,xmm15 - mov QWORD[((40+8))+rsp],r12 - vmovdqu xmm5,XMMWORD[((48-32))+r9] - vaesenc xmm14,xmm14,xmm15 - - vmovups xmm15,XMMWORD[((48-128))+rcx] - vpxor xmm6,xmm6,xmm1 - vpclmulqdq xmm1,xmm0,xmm5,0x00 - vaesenc xmm9,xmm9,xmm15 - vpxor xmm6,xmm6,xmm2 - vpclmulqdq xmm2,xmm0,xmm5,0x10 - vaesenc xmm10,xmm10,xmm15 - vpxor xmm7,xmm7,xmm3 - vpclmulqdq xmm3,xmm0,xmm5,0x01 - vaesenc xmm11,xmm11,xmm15 - vpclmulqdq xmm5,xmm0,xmm5,0x11 - vmovdqu xmm0,XMMWORD[((80+8))+rsp] - vaesenc xmm12,xmm12,xmm15 - vaesenc xmm13,xmm13,xmm15 - vpxor xmm4,xmm4,xmm1 - vmovdqu xmm1,XMMWORD[((64-32))+r9] - vaesenc xmm14,xmm14,xmm15 - - vmovups xmm15,XMMWORD[((64-128))+rcx] - vpxor xmm6,xmm6,xmm2 - vpclmulqdq xmm2,xmm0,xmm1,0x00 - vaesenc xmm9,xmm9,xmm15 - vpxor xmm6,xmm6,xmm3 - vpclmulqdq xmm3,xmm0,xmm1,0x10 - vaesenc xmm10,xmm10,xmm15 - movbe r13,QWORD[72+r14] - vpxor xmm7,xmm7,xmm5 - vpclmulqdq xmm5,xmm0,xmm1,0x01 - vaesenc xmm11,xmm11,xmm15 - movbe r12,QWORD[64+r14] - vpclmulqdq xmm1,xmm0,xmm1,0x11 - vmovdqu xmm0,XMMWORD[((96+8))+rsp] - vaesenc xmm12,xmm12,xmm15 - mov QWORD[((48+8))+rsp],r13 - vaesenc xmm13,xmm13,xmm15 - mov QWORD[((56+8))+rsp],r12 - vpxor xmm4,xmm4,xmm2 - vmovdqu xmm2,XMMWORD[((96-32))+r9] - vaesenc xmm14,xmm14,xmm15 - - vmovups xmm15,XMMWORD[((80-128))+rcx] - vpxor xmm6,xmm6,xmm3 - vpclmulqdq xmm3,xmm0,xmm2,0x00 - vaesenc xmm9,xmm9,xmm15 - vpxor xmm6,xmm6,xmm5 - vpclmulqdq xmm5,xmm0,xmm2,0x10 - vaesenc xmm10,xmm10,xmm15 - movbe r13,QWORD[56+r14] - vpxor xmm7,xmm7,xmm1 - vpclmulqdq xmm1,xmm0,xmm2,0x01 - vpxor xmm8,xmm8,XMMWORD[((112+8))+rsp] - vaesenc xmm11,xmm11,xmm15 - movbe r12,QWORD[48+r14] - vpclmulqdq xmm2,xmm0,xmm2,0x11 - vaesenc xmm12,xmm12,xmm15 - mov QWORD[((64+8))+rsp],r13 - vaesenc xmm13,xmm13,xmm15 - mov QWORD[((72+8))+rsp],r12 - vpxor xmm4,xmm4,xmm3 - vmovdqu xmm3,XMMWORD[((112-32))+r9] - vaesenc xmm14,xmm14,xmm15 - - vmovups xmm15,XMMWORD[((96-128))+rcx] - vpxor xmm6,xmm6,xmm5 - vpclmulqdq xmm5,xmm8,xmm3,0x10 - vaesenc xmm9,xmm9,xmm15 - vpxor xmm6,xmm6,xmm1 - vpclmulqdq xmm1,xmm8,xmm3,0x01 - vaesenc xmm10,xmm10,xmm15 - movbe r13,QWORD[40+r14] - vpxor xmm7,xmm7,xmm2 - vpclmulqdq xmm2,xmm8,xmm3,0x00 - vaesenc xmm11,xmm11,xmm15 - movbe r12,QWORD[32+r14] - vpclmulqdq xmm8,xmm8,xmm3,0x11 - vaesenc xmm12,xmm12,xmm15 - mov QWORD[((80+8))+rsp],r13 - vaesenc xmm13,xmm13,xmm15 - mov QWORD[((88+8))+rsp],r12 - vpxor xmm6,xmm6,xmm5 - vaesenc xmm14,xmm14,xmm15 - vpxor xmm6,xmm6,xmm1 - - vmovups xmm15,XMMWORD[((112-128))+rcx] - vpslldq xmm5,xmm6,8 - vpxor xmm4,xmm4,xmm2 - vmovdqu xmm3,XMMWORD[16+r11] - - vaesenc xmm9,xmm9,xmm15 - vpxor xmm7,xmm7,xmm8 - vaesenc xmm10,xmm10,xmm15 - vpxor xmm4,xmm4,xmm5 - movbe r13,QWORD[24+r14] - vaesenc xmm11,xmm11,xmm15 - movbe r12,QWORD[16+r14] - vpalignr xmm0,xmm4,xmm4,8 - vpclmulqdq xmm4,xmm4,xmm3,0x10 - mov QWORD[((96+8))+rsp],r13 - vaesenc xmm12,xmm12,xmm15 - mov QWORD[((104+8))+rsp],r12 - vaesenc xmm13,xmm13,xmm15 - vmovups xmm1,XMMWORD[((128-128))+rcx] - vaesenc xmm14,xmm14,xmm15 - - vaesenc xmm9,xmm9,xmm1 - vmovups xmm15,XMMWORD[((144-128))+rcx] - vaesenc xmm10,xmm10,xmm1 - vpsrldq xmm6,xmm6,8 - vaesenc xmm11,xmm11,xmm1 - vpxor xmm7,xmm7,xmm6 - vaesenc xmm12,xmm12,xmm1 - vpxor xmm4,xmm4,xmm0 - movbe r13,QWORD[8+r14] - vaesenc xmm13,xmm13,xmm1 - movbe r12,QWORD[r14] - vaesenc xmm14,xmm14,xmm1 - vmovups xmm1,XMMWORD[((160-128))+rcx] - cmp ebp,11 - jb NEAR $L$enc_tail - - vaesenc xmm9,xmm9,xmm15 - vaesenc xmm10,xmm10,xmm15 - vaesenc xmm11,xmm11,xmm15 - vaesenc xmm12,xmm12,xmm15 - vaesenc xmm13,xmm13,xmm15 - vaesenc xmm14,xmm14,xmm15 - - vaesenc xmm9,xmm9,xmm1 - vaesenc xmm10,xmm10,xmm1 - vaesenc xmm11,xmm11,xmm1 - vaesenc xmm12,xmm12,xmm1 - vaesenc xmm13,xmm13,xmm1 - vmovups xmm15,XMMWORD[((176-128))+rcx] - vaesenc xmm14,xmm14,xmm1 - vmovups xmm1,XMMWORD[((192-128))+rcx] - - - vaesenc xmm9,xmm9,xmm15 - vaesenc xmm10,xmm10,xmm15 - vaesenc xmm11,xmm11,xmm15 - vaesenc xmm12,xmm12,xmm15 - vaesenc xmm13,xmm13,xmm15 - vaesenc xmm14,xmm14,xmm15 - - vaesenc xmm9,xmm9,xmm1 - vaesenc xmm10,xmm10,xmm1 - vaesenc xmm11,xmm11,xmm1 - vaesenc xmm12,xmm12,xmm1 - vaesenc xmm13,xmm13,xmm1 - vmovups xmm15,XMMWORD[((208-128))+rcx] - vaesenc xmm14,xmm14,xmm1 - vmovups xmm1,XMMWORD[((224-128))+rcx] - jmp NEAR $L$enc_tail - -ALIGN 32 -$L$handle_ctr32: - vmovdqu xmm0,XMMWORD[r11] - vpshufb xmm6,xmm1,xmm0 - vmovdqu xmm5,XMMWORD[48+r11] - vpaddd xmm10,xmm6,XMMWORD[64+r11] - vpaddd xmm11,xmm6,xmm5 - vmovdqu xmm3,XMMWORD[((0-32))+r9] - vpaddd xmm12,xmm10,xmm5 - vpshufb xmm10,xmm10,xmm0 - vpaddd xmm13,xmm11,xmm5 - vpshufb xmm11,xmm11,xmm0 - vpxor xmm10,xmm10,xmm15 - vpaddd xmm14,xmm12,xmm5 - vpshufb xmm12,xmm12,xmm0 - vpxor xmm11,xmm11,xmm15 - vpaddd xmm1,xmm13,xmm5 - vpshufb xmm13,xmm13,xmm0 - vpshufb xmm14,xmm14,xmm0 - vpshufb xmm1,xmm1,xmm0 - jmp NEAR $L$resume_ctr32 - -ALIGN 32 -$L$enc_tail: - vaesenc xmm9,xmm9,xmm15 - vmovdqu XMMWORD[(16+8)+rsp],xmm7 - vpalignr xmm8,xmm4,xmm4,8 - vaesenc xmm10,xmm10,xmm15 - vpclmulqdq xmm4,xmm4,xmm3,0x10 - vpxor xmm2,xmm1,XMMWORD[rdi] - vaesenc xmm11,xmm11,xmm15 - vpxor xmm0,xmm1,XMMWORD[16+rdi] - vaesenc xmm12,xmm12,xmm15 - vpxor xmm5,xmm1,XMMWORD[32+rdi] - vaesenc xmm13,xmm13,xmm15 - vpxor xmm6,xmm1,XMMWORD[48+rdi] - vaesenc xmm14,xmm14,xmm15 - vpxor xmm7,xmm1,XMMWORD[64+rdi] - vpxor xmm3,xmm1,XMMWORD[80+rdi] - vmovdqu xmm1,XMMWORD[r8] - - vaesenclast xmm9,xmm9,xmm2 - vmovdqu xmm2,XMMWORD[32+r11] - vaesenclast xmm10,xmm10,xmm0 - vpaddb xmm0,xmm1,xmm2 - mov QWORD[((112+8))+rsp],r13 - lea rdi,[96+rdi] - vaesenclast xmm11,xmm11,xmm5 - vpaddb xmm5,xmm0,xmm2 - mov QWORD[((120+8))+rsp],r12 - lea rsi,[96+rsi] - vmovdqu xmm15,XMMWORD[((0-128))+rcx] - vaesenclast xmm12,xmm12,xmm6 - vpaddb xmm6,xmm5,xmm2 - vaesenclast xmm13,xmm13,xmm7 - vpaddb xmm7,xmm6,xmm2 - vaesenclast xmm14,xmm14,xmm3 - vpaddb xmm3,xmm7,xmm2 - - add r10,0x60 - sub rdx,0x6 - jc NEAR $L$6x_done - - vmovups XMMWORD[(-96)+rsi],xmm9 - vpxor xmm9,xmm1,xmm15 - vmovups XMMWORD[(-80)+rsi],xmm10 - vmovdqa xmm10,xmm0 - vmovups XMMWORD[(-64)+rsi],xmm11 - vmovdqa xmm11,xmm5 - vmovups XMMWORD[(-48)+rsi],xmm12 - vmovdqa xmm12,xmm6 - vmovups XMMWORD[(-32)+rsi],xmm13 - vmovdqa xmm13,xmm7 - vmovups XMMWORD[(-16)+rsi],xmm14 - vmovdqa xmm14,xmm3 - vmovdqu xmm7,XMMWORD[((32+8))+rsp] - jmp NEAR $L$oop6x - -$L$6x_done: - vpxor xmm8,xmm8,XMMWORD[((16+8))+rsp] - vpxor xmm8,xmm8,xmm4 - - DB 0F3h,0C3h ;repret - - -global GFp_aesni_gcm_decrypt - -ALIGN 32 -GFp_aesni_gcm_decrypt: - mov QWORD[8+rsp],rdi ;WIN64 prologue - mov QWORD[16+rsp],rsi - mov rax,rsp -$L$SEH_begin_GFp_aesni_gcm_decrypt: - mov rdi,rcx - mov rsi,rdx - mov rdx,r8 - mov rcx,r9 - mov r8,QWORD[40+rsp] - mov r9,QWORD[48+rsp] - - - - xor r10,r10 - - - - cmp rdx,0x60 - jb NEAR $L$gcm_dec_abort - - lea rax,[rsp] - - push rbx - - push rbp - - push r12 - - push r13 - - push r14 - - push r15 - - lea rsp,[((-168))+rsp] - movaps XMMWORD[(-216)+rax],xmm6 - movaps XMMWORD[(-200)+rax],xmm7 - movaps XMMWORD[(-184)+rax],xmm8 - movaps XMMWORD[(-168)+rax],xmm9 - movaps XMMWORD[(-152)+rax],xmm10 - movaps XMMWORD[(-136)+rax],xmm11 - movaps XMMWORD[(-120)+rax],xmm12 - movaps XMMWORD[(-104)+rax],xmm13 - movaps XMMWORD[(-88)+rax],xmm14 - movaps XMMWORD[(-72)+rax],xmm15 -$L$gcm_dec_body: - vzeroupper - - vmovdqu xmm1,XMMWORD[r8] - add rsp,-128 - mov ebx,DWORD[12+r8] - lea r11,[$L$bswap_mask] - lea r14,[((-128))+rcx] - mov r15,0xf80 - vmovdqu xmm8,XMMWORD[r9] - and rsp,-128 - vmovdqu xmm0,XMMWORD[r11] - lea rcx,[128+rcx] - lea r9,[((32+32))+r9] - mov ebp,DWORD[((240-128))+rcx] - vpshufb xmm8,xmm8,xmm0 - - and r14,r15 - and r15,rsp - sub r15,r14 - jc NEAR $L$dec_no_key_aliasing - cmp r15,768 - jnc NEAR $L$dec_no_key_aliasing - sub rsp,r15 -$L$dec_no_key_aliasing: - - vmovdqu xmm7,XMMWORD[80+rdi] - lea r14,[rdi] - vmovdqu xmm4,XMMWORD[64+rdi] - - - - - - - - lea r15,[((-192))+rdx*1+rdi] - - vmovdqu xmm5,XMMWORD[48+rdi] - shr rdx,4 - xor r10,r10 - vmovdqu xmm6,XMMWORD[32+rdi] - vpshufb xmm7,xmm7,xmm0 - vmovdqu xmm2,XMMWORD[16+rdi] - vpshufb xmm4,xmm4,xmm0 - vmovdqu xmm3,XMMWORD[rdi] - vpshufb xmm5,xmm5,xmm0 - vmovdqu XMMWORD[48+rsp],xmm4 - vpshufb xmm6,xmm6,xmm0 - vmovdqu XMMWORD[64+rsp],xmm5 - vpshufb xmm2,xmm2,xmm0 - vmovdqu XMMWORD[80+rsp],xmm6 - vpshufb xmm3,xmm3,xmm0 - vmovdqu XMMWORD[96+rsp],xmm2 - vmovdqu XMMWORD[112+rsp],xmm3 - - call _aesni_ctr32_ghash_6x - - vmovups XMMWORD[(-96)+rsi],xmm9 - vmovups XMMWORD[(-80)+rsi],xmm10 - vmovups XMMWORD[(-64)+rsi],xmm11 - vmovups XMMWORD[(-48)+rsi],xmm12 - vmovups XMMWORD[(-32)+rsi],xmm13 - vmovups XMMWORD[(-16)+rsi],xmm14 - - vpshufb xmm8,xmm8,XMMWORD[r11] - vmovdqu XMMWORD[(-64)+r9],xmm8 - - vzeroupper - movaps xmm6,XMMWORD[((-216))+rax] - movaps xmm7,XMMWORD[((-200))+rax] - movaps xmm8,XMMWORD[((-184))+rax] - movaps xmm9,XMMWORD[((-168))+rax] - movaps xmm10,XMMWORD[((-152))+rax] - movaps xmm11,XMMWORD[((-136))+rax] - movaps xmm12,XMMWORD[((-120))+rax] - movaps xmm13,XMMWORD[((-104))+rax] - movaps xmm14,XMMWORD[((-88))+rax] - movaps xmm15,XMMWORD[((-72))+rax] - mov r15,QWORD[((-48))+rax] - - mov r14,QWORD[((-40))+rax] - - mov r13,QWORD[((-32))+rax] - - mov r12,QWORD[((-24))+rax] - - mov rbp,QWORD[((-16))+rax] - - mov rbx,QWORD[((-8))+rax] - - lea rsp,[rax] - -$L$gcm_dec_abort: - mov rax,r10 - mov rdi,QWORD[8+rsp] ;WIN64 epilogue - mov rsi,QWORD[16+rsp] - DB 0F3h,0C3h ;repret - -$L$SEH_end_GFp_aesni_gcm_decrypt: - -ALIGN 32 -_aesni_ctr32_6x: - - vmovdqu xmm4,XMMWORD[((0-128))+rcx] - vmovdqu xmm2,XMMWORD[32+r11] - lea r13,[((-1))+rbp] - vmovups xmm15,XMMWORD[((16-128))+rcx] - lea r12,[((32-128))+rcx] - vpxor xmm9,xmm1,xmm4 - add ebx,100663296 - jc NEAR $L$handle_ctr32_2 - vpaddb xmm10,xmm1,xmm2 - vpaddb xmm11,xmm10,xmm2 - vpxor xmm10,xmm10,xmm4 - vpaddb xmm12,xmm11,xmm2 - vpxor xmm11,xmm11,xmm4 - vpaddb xmm13,xmm12,xmm2 - vpxor xmm12,xmm12,xmm4 - vpaddb xmm14,xmm13,xmm2 - vpxor xmm13,xmm13,xmm4 - vpaddb xmm1,xmm14,xmm2 - vpxor xmm14,xmm14,xmm4 - jmp NEAR $L$oop_ctr32 - -ALIGN 16 -$L$oop_ctr32: - vaesenc xmm9,xmm9,xmm15 - vaesenc xmm10,xmm10,xmm15 - vaesenc xmm11,xmm11,xmm15 - vaesenc xmm12,xmm12,xmm15 - vaesenc xmm13,xmm13,xmm15 - vaesenc xmm14,xmm14,xmm15 - vmovups xmm15,XMMWORD[r12] - lea r12,[16+r12] - dec r13d - jnz NEAR $L$oop_ctr32 - - vmovdqu xmm3,XMMWORD[r12] - vaesenc xmm9,xmm9,xmm15 - vpxor xmm4,xmm3,XMMWORD[rdi] - vaesenc xmm10,xmm10,xmm15 - vpxor xmm5,xmm3,XMMWORD[16+rdi] - vaesenc xmm11,xmm11,xmm15 - vpxor xmm6,xmm3,XMMWORD[32+rdi] - vaesenc xmm12,xmm12,xmm15 - vpxor xmm8,xmm3,XMMWORD[48+rdi] - vaesenc xmm13,xmm13,xmm15 - vpxor xmm2,xmm3,XMMWORD[64+rdi] - vaesenc xmm14,xmm14,xmm15 - vpxor xmm3,xmm3,XMMWORD[80+rdi] - lea rdi,[96+rdi] - - vaesenclast xmm9,xmm9,xmm4 - vaesenclast xmm10,xmm10,xmm5 - vaesenclast xmm11,xmm11,xmm6 - vaesenclast xmm12,xmm12,xmm8 - vaesenclast xmm13,xmm13,xmm2 - vaesenclast xmm14,xmm14,xmm3 - vmovups XMMWORD[rsi],xmm9 - vmovups XMMWORD[16+rsi],xmm10 - vmovups XMMWORD[32+rsi],xmm11 - vmovups XMMWORD[48+rsi],xmm12 - vmovups XMMWORD[64+rsi],xmm13 - vmovups XMMWORD[80+rsi],xmm14 - lea rsi,[96+rsi] - - DB 0F3h,0C3h ;repret -ALIGN 32 -$L$handle_ctr32_2: - vpshufb xmm6,xmm1,xmm0 - vmovdqu xmm5,XMMWORD[48+r11] - vpaddd xmm10,xmm6,XMMWORD[64+r11] - vpaddd xmm11,xmm6,xmm5 - vpaddd xmm12,xmm10,xmm5 - vpshufb xmm10,xmm10,xmm0 - vpaddd xmm13,xmm11,xmm5 - vpshufb xmm11,xmm11,xmm0 - vpxor xmm10,xmm10,xmm4 - vpaddd xmm14,xmm12,xmm5 - vpshufb xmm12,xmm12,xmm0 - vpxor xmm11,xmm11,xmm4 - vpaddd xmm1,xmm13,xmm5 - vpshufb xmm13,xmm13,xmm0 - vpxor xmm12,xmm12,xmm4 - vpshufb xmm14,xmm14,xmm0 - vpxor xmm13,xmm13,xmm4 - vpshufb xmm1,xmm1,xmm0 - vpxor xmm14,xmm14,xmm4 - jmp NEAR $L$oop_ctr32 - - - -global GFp_aesni_gcm_encrypt - -ALIGN 32 -GFp_aesni_gcm_encrypt: - mov QWORD[8+rsp],rdi ;WIN64 prologue - mov QWORD[16+rsp],rsi - mov rax,rsp -$L$SEH_begin_GFp_aesni_gcm_encrypt: - mov rdi,rcx - mov rsi,rdx - mov rdx,r8 - mov rcx,r9 - mov r8,QWORD[40+rsp] - mov r9,QWORD[48+rsp] - - - - xor r10,r10 - - - - - cmp rdx,0x60*3 - jb NEAR $L$gcm_enc_abort - - lea rax,[rsp] - - push rbx - - push rbp - - push r12 - - push r13 - - push r14 - - push r15 - - lea rsp,[((-168))+rsp] - movaps XMMWORD[(-216)+rax],xmm6 - movaps XMMWORD[(-200)+rax],xmm7 - movaps XMMWORD[(-184)+rax],xmm8 - movaps XMMWORD[(-168)+rax],xmm9 - movaps XMMWORD[(-152)+rax],xmm10 - movaps XMMWORD[(-136)+rax],xmm11 - movaps XMMWORD[(-120)+rax],xmm12 - movaps XMMWORD[(-104)+rax],xmm13 - movaps XMMWORD[(-88)+rax],xmm14 - movaps XMMWORD[(-72)+rax],xmm15 -$L$gcm_enc_body: - vzeroupper - - vmovdqu xmm1,XMMWORD[r8] - add rsp,-128 - mov ebx,DWORD[12+r8] - lea r11,[$L$bswap_mask] - lea r14,[((-128))+rcx] - mov r15,0xf80 - lea rcx,[128+rcx] - vmovdqu xmm0,XMMWORD[r11] - and rsp,-128 - mov ebp,DWORD[((240-128))+rcx] - - and r14,r15 - and r15,rsp - sub r15,r14 - jc NEAR $L$enc_no_key_aliasing - cmp r15,768 - jnc NEAR $L$enc_no_key_aliasing - sub rsp,r15 -$L$enc_no_key_aliasing: - - lea r14,[rsi] - - - - - - - - - lea r15,[((-192))+rdx*1+rsi] - - shr rdx,4 - - call _aesni_ctr32_6x - vpshufb xmm8,xmm9,xmm0 - vpshufb xmm2,xmm10,xmm0 - vmovdqu XMMWORD[112+rsp],xmm8 - vpshufb xmm4,xmm11,xmm0 - vmovdqu XMMWORD[96+rsp],xmm2 - vpshufb xmm5,xmm12,xmm0 - vmovdqu XMMWORD[80+rsp],xmm4 - vpshufb xmm6,xmm13,xmm0 - vmovdqu XMMWORD[64+rsp],xmm5 - vpshufb xmm7,xmm14,xmm0 - vmovdqu XMMWORD[48+rsp],xmm6 - - call _aesni_ctr32_6x - - vmovdqu xmm8,XMMWORD[r9] - lea r9,[((32+32))+r9] - sub rdx,12 - mov r10,0x60*2 - vpshufb xmm8,xmm8,xmm0 - - call _aesni_ctr32_ghash_6x - vmovdqu xmm7,XMMWORD[32+rsp] - vmovdqu xmm0,XMMWORD[r11] - vmovdqu xmm3,XMMWORD[((0-32))+r9] - vpunpckhqdq xmm1,xmm7,xmm7 - vmovdqu xmm15,XMMWORD[((32-32))+r9] - vmovups XMMWORD[(-96)+rsi],xmm9 - vpshufb xmm9,xmm9,xmm0 - vpxor xmm1,xmm1,xmm7 - vmovups XMMWORD[(-80)+rsi],xmm10 - vpshufb xmm10,xmm10,xmm0 - vmovups XMMWORD[(-64)+rsi],xmm11 - vpshufb xmm11,xmm11,xmm0 - vmovups XMMWORD[(-48)+rsi],xmm12 - vpshufb xmm12,xmm12,xmm0 - vmovups XMMWORD[(-32)+rsi],xmm13 - vpshufb xmm13,xmm13,xmm0 - vmovups XMMWORD[(-16)+rsi],xmm14 - vpshufb xmm14,xmm14,xmm0 - vmovdqu XMMWORD[16+rsp],xmm9 - vmovdqu xmm6,XMMWORD[48+rsp] - vmovdqu xmm0,XMMWORD[((16-32))+r9] - vpunpckhqdq xmm2,xmm6,xmm6 - vpclmulqdq xmm5,xmm7,xmm3,0x00 - vpxor xmm2,xmm2,xmm6 - vpclmulqdq xmm7,xmm7,xmm3,0x11 - vpclmulqdq xmm1,xmm1,xmm15,0x00 - - vmovdqu xmm9,XMMWORD[64+rsp] - vpclmulqdq xmm4,xmm6,xmm0,0x00 - vmovdqu xmm3,XMMWORD[((48-32))+r9] - vpxor xmm4,xmm4,xmm5 - vpunpckhqdq xmm5,xmm9,xmm9 - vpclmulqdq xmm6,xmm6,xmm0,0x11 - vpxor xmm5,xmm5,xmm9 - vpxor xmm6,xmm6,xmm7 - vpclmulqdq xmm2,xmm2,xmm15,0x10 - vmovdqu xmm15,XMMWORD[((80-32))+r9] - vpxor xmm2,xmm2,xmm1 - - vmovdqu xmm1,XMMWORD[80+rsp] - vpclmulqdq xmm7,xmm9,xmm3,0x00 - vmovdqu xmm0,XMMWORD[((64-32))+r9] - vpxor xmm7,xmm7,xmm4 - vpunpckhqdq xmm4,xmm1,xmm1 - vpclmulqdq xmm9,xmm9,xmm3,0x11 - vpxor xmm4,xmm4,xmm1 - vpxor xmm9,xmm9,xmm6 - vpclmulqdq xmm5,xmm5,xmm15,0x00 - vpxor xmm5,xmm5,xmm2 - - vmovdqu xmm2,XMMWORD[96+rsp] - vpclmulqdq xmm6,xmm1,xmm0,0x00 - vmovdqu xmm3,XMMWORD[((96-32))+r9] - vpxor xmm6,xmm6,xmm7 - vpunpckhqdq xmm7,xmm2,xmm2 - vpclmulqdq xmm1,xmm1,xmm0,0x11 - vpxor xmm7,xmm7,xmm2 - vpxor xmm1,xmm1,xmm9 - vpclmulqdq xmm4,xmm4,xmm15,0x10 - vmovdqu xmm15,XMMWORD[((128-32))+r9] - vpxor xmm4,xmm4,xmm5 - - vpxor xmm8,xmm8,XMMWORD[112+rsp] - vpclmulqdq xmm5,xmm2,xmm3,0x00 - vmovdqu xmm0,XMMWORD[((112-32))+r9] - vpunpckhqdq xmm9,xmm8,xmm8 - vpxor xmm5,xmm5,xmm6 - vpclmulqdq xmm2,xmm2,xmm3,0x11 - vpxor xmm9,xmm9,xmm8 - vpxor xmm2,xmm2,xmm1 - vpclmulqdq xmm7,xmm7,xmm15,0x00 - vpxor xmm4,xmm7,xmm4 - - vpclmulqdq xmm6,xmm8,xmm0,0x00 - vmovdqu xmm3,XMMWORD[((0-32))+r9] - vpunpckhqdq xmm1,xmm14,xmm14 - vpclmulqdq xmm8,xmm8,xmm0,0x11 - vpxor xmm1,xmm1,xmm14 - vpxor xmm5,xmm6,xmm5 - vpclmulqdq xmm9,xmm9,xmm15,0x10 - vmovdqu xmm15,XMMWORD[((32-32))+r9] - vpxor xmm7,xmm8,xmm2 - vpxor xmm6,xmm9,xmm4 - - vmovdqu xmm0,XMMWORD[((16-32))+r9] - vpxor xmm9,xmm7,xmm5 - vpclmulqdq xmm4,xmm14,xmm3,0x00 - vpxor xmm6,xmm6,xmm9 - vpunpckhqdq xmm2,xmm13,xmm13 - vpclmulqdq xmm14,xmm14,xmm3,0x11 - vpxor xmm2,xmm2,xmm13 - vpslldq xmm9,xmm6,8 - vpclmulqdq xmm1,xmm1,xmm15,0x00 - vpxor xmm8,xmm5,xmm9 - vpsrldq xmm6,xmm6,8 - vpxor xmm7,xmm7,xmm6 - - vpclmulqdq xmm5,xmm13,xmm0,0x00 - vmovdqu xmm3,XMMWORD[((48-32))+r9] - vpxor xmm5,xmm5,xmm4 - vpunpckhqdq xmm9,xmm12,xmm12 - vpclmulqdq xmm13,xmm13,xmm0,0x11 - vpxor xmm9,xmm9,xmm12 - vpxor xmm13,xmm13,xmm14 - vpalignr xmm14,xmm8,xmm8,8 - vpclmulqdq xmm2,xmm2,xmm15,0x10 - vmovdqu xmm15,XMMWORD[((80-32))+r9] - vpxor xmm2,xmm2,xmm1 - - vpclmulqdq xmm4,xmm12,xmm3,0x00 - vmovdqu xmm0,XMMWORD[((64-32))+r9] - vpxor xmm4,xmm4,xmm5 - vpunpckhqdq xmm1,xmm11,xmm11 - vpclmulqdq xmm12,xmm12,xmm3,0x11 - vpxor xmm1,xmm1,xmm11 - vpxor xmm12,xmm12,xmm13 - vxorps xmm7,xmm7,XMMWORD[16+rsp] - vpclmulqdq xmm9,xmm9,xmm15,0x00 - vpxor xmm9,xmm9,xmm2 - - vpclmulqdq xmm8,xmm8,XMMWORD[16+r11],0x10 - vxorps xmm8,xmm8,xmm14 - - vpclmulqdq xmm5,xmm11,xmm0,0x00 - vmovdqu xmm3,XMMWORD[((96-32))+r9] - vpxor xmm5,xmm5,xmm4 - vpunpckhqdq xmm2,xmm10,xmm10 - vpclmulqdq xmm11,xmm11,xmm0,0x11 - vpxor xmm2,xmm2,xmm10 - vpalignr xmm14,xmm8,xmm8,8 - vpxor xmm11,xmm11,xmm12 - vpclmulqdq xmm1,xmm1,xmm15,0x10 - vmovdqu xmm15,XMMWORD[((128-32))+r9] - vpxor xmm1,xmm1,xmm9 - - vxorps xmm14,xmm14,xmm7 - vpclmulqdq xmm8,xmm8,XMMWORD[16+r11],0x10 - vxorps xmm8,xmm8,xmm14 - - vpclmulqdq xmm4,xmm10,xmm3,0x00 - vmovdqu xmm0,XMMWORD[((112-32))+r9] - vpxor xmm4,xmm4,xmm5 - vpunpckhqdq xmm9,xmm8,xmm8 - vpclmulqdq xmm10,xmm10,xmm3,0x11 - vpxor xmm9,xmm9,xmm8 - vpxor xmm10,xmm10,xmm11 - vpclmulqdq xmm2,xmm2,xmm15,0x00 - vpxor xmm2,xmm2,xmm1 - - vpclmulqdq xmm5,xmm8,xmm0,0x00 - vpclmulqdq xmm7,xmm8,xmm0,0x11 - vpxor xmm5,xmm5,xmm4 - vpclmulqdq xmm6,xmm9,xmm15,0x10 - vpxor xmm7,xmm7,xmm10 - vpxor xmm6,xmm6,xmm2 - - vpxor xmm4,xmm7,xmm5 - vpxor xmm6,xmm6,xmm4 - vpslldq xmm1,xmm6,8 - vmovdqu xmm3,XMMWORD[16+r11] - vpsrldq xmm6,xmm6,8 - vpxor xmm8,xmm5,xmm1 - vpxor xmm7,xmm7,xmm6 - - vpalignr xmm2,xmm8,xmm8,8 - vpclmulqdq xmm8,xmm8,xmm3,0x10 - vpxor xmm8,xmm8,xmm2 - - vpalignr xmm2,xmm8,xmm8,8 - vpclmulqdq xmm8,xmm8,xmm3,0x10 - vpxor xmm2,xmm2,xmm7 - vpxor xmm8,xmm8,xmm2 - vpshufb xmm8,xmm8,XMMWORD[r11] - vmovdqu XMMWORD[(-64)+r9],xmm8 - - vzeroupper - movaps xmm6,XMMWORD[((-216))+rax] - movaps xmm7,XMMWORD[((-200))+rax] - movaps xmm8,XMMWORD[((-184))+rax] - movaps xmm9,XMMWORD[((-168))+rax] - movaps xmm10,XMMWORD[((-152))+rax] - movaps xmm11,XMMWORD[((-136))+rax] - movaps xmm12,XMMWORD[((-120))+rax] - movaps xmm13,XMMWORD[((-104))+rax] - movaps xmm14,XMMWORD[((-88))+rax] - movaps xmm15,XMMWORD[((-72))+rax] - mov r15,QWORD[((-48))+rax] - - mov r14,QWORD[((-40))+rax] - - mov r13,QWORD[((-32))+rax] - - mov r12,QWORD[((-24))+rax] - - mov rbp,QWORD[((-16))+rax] - - mov rbx,QWORD[((-8))+rax] - - lea rsp,[rax] - -$L$gcm_enc_abort: - mov rax,r10 - mov rdi,QWORD[8+rsp] ;WIN64 epilogue - mov rsi,QWORD[16+rsp] - DB 0F3h,0C3h ;repret - -$L$SEH_end_GFp_aesni_gcm_encrypt: -ALIGN 64 -$L$bswap_mask: -DB 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 -$L$poly: -DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xc2 -$L$one_msb: -DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 -$L$two_lsb: -DB 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -$L$one_lsb: -DB 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -DB 65,69,83,45,78,73,32,71,67,77,32,109,111,100,117,108 -DB 101,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82 -DB 89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112 -DB 114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 -ALIGN 64 -EXTERN __imp_RtlVirtualUnwind - -ALIGN 16 -gcm_se_handler: - push rsi - push rdi - push rbx - push rbp - push r12 - push r13 - push r14 - push r15 - pushfq - sub rsp,64 - - mov rax,QWORD[120+r8] - mov rbx,QWORD[248+r8] - - mov rsi,QWORD[8+r9] - mov r11,QWORD[56+r9] - - mov r10d,DWORD[r11] - lea r10,[r10*1+rsi] - cmp rbx,r10 - jb NEAR $L$common_seh_tail - - mov rax,QWORD[152+r8] - - mov r10d,DWORD[4+r11] - lea r10,[r10*1+rsi] - cmp rbx,r10 - jae NEAR $L$common_seh_tail - - mov rax,QWORD[120+r8] - - mov r15,QWORD[((-48))+rax] - mov r14,QWORD[((-40))+rax] - mov r13,QWORD[((-32))+rax] - mov r12,QWORD[((-24))+rax] - mov rbp,QWORD[((-16))+rax] - mov rbx,QWORD[((-8))+rax] - mov QWORD[240+r8],r15 - mov QWORD[232+r8],r14 - mov QWORD[224+r8],r13 - mov QWORD[216+r8],r12 - mov QWORD[160+r8],rbp - mov QWORD[144+r8],rbx - - lea rsi,[((-216))+rax] - lea rdi,[512+r8] - mov ecx,20 - DD 0xa548f3fc - -$L$common_seh_tail: - mov rdi,QWORD[8+rax] - mov rsi,QWORD[16+rax] - mov QWORD[152+r8],rax - mov QWORD[168+r8],rsi - mov QWORD[176+r8],rdi - - mov rdi,QWORD[40+r9] - mov rsi,r8 - mov ecx,154 - DD 0xa548f3fc - - mov rsi,r9 - xor rcx,rcx - mov rdx,QWORD[8+rsi] - mov r8,QWORD[rsi] - mov r9,QWORD[16+rsi] - mov r10,QWORD[40+rsi] - lea r11,[56+rsi] - lea r12,[24+rsi] - mov QWORD[32+rsp],r10 - mov QWORD[40+rsp],r11 - mov QWORD[48+rsp],r12 - mov QWORD[56+rsp],rcx - call QWORD[__imp_RtlVirtualUnwind] - - mov eax,1 - add rsp,64 - popfq - pop r15 - pop r14 - pop r13 - pop r12 - pop rbp - pop rbx - pop rdi - pop rsi - DB 0F3h,0C3h ;repret - - -section .pdata rdata align=4 -ALIGN 4 - DD $L$SEH_begin_GFp_aesni_gcm_decrypt wrt ..imagebase - DD $L$SEH_end_GFp_aesni_gcm_decrypt wrt ..imagebase - DD $L$SEH_gcm_dec_info wrt ..imagebase - - DD $L$SEH_begin_GFp_aesni_gcm_encrypt wrt ..imagebase - DD $L$SEH_end_GFp_aesni_gcm_encrypt wrt ..imagebase - DD $L$SEH_GFp_gcm_enc_info wrt ..imagebase -section .xdata rdata align=8 -ALIGN 8 -$L$SEH_gcm_dec_info: -DB 9,0,0,0 - DD gcm_se_handler wrt ..imagebase - DD $L$gcm_dec_body wrt ..imagebase,$L$gcm_dec_abort wrt ..imagebase -$L$SEH_GFp_gcm_enc_info: -DB 9,0,0,0 - DD gcm_se_handler wrt ..imagebase - DD $L$gcm_enc_body wrt ..imagebase,$L$gcm_enc_abort wrt ..imagebase diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/tmp/aesni-x86_64-nasm.asm temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/tmp/aesni-x86_64-nasm.asm --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/tmp/aesni-x86_64-nasm.asm 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/tmp/aesni-x86_64-nasm.asm 1970-01-01 00:00:00.000000000 +0000 @@ -1,1311 +0,0 @@ -; This file is generated from a similarly-named Perl script in the BoringSSL -; source tree. Do not edit by hand. - -default rel -%define XMMWORD -%define YMMWORD -%define ZMMWORD -section .text code align=64 - -EXTERN GFp_ia32cap_P -global GFp_aes_hw_encrypt - -ALIGN 16 -GFp_aes_hw_encrypt: - - movups xmm2,XMMWORD[rcx] - mov eax,DWORD[240+r8] - movups xmm0,XMMWORD[r8] - movups xmm1,XMMWORD[16+r8] - lea r8,[32+r8] - xorps xmm2,xmm0 -$L$oop_enc1_1: -DB 102,15,56,220,209 - dec eax - movups xmm1,XMMWORD[r8] - lea r8,[16+r8] - jnz NEAR $L$oop_enc1_1 -DB 102,15,56,221,209 - pxor xmm0,xmm0 - pxor xmm1,xmm1 - movups XMMWORD[rdx],xmm2 - pxor xmm2,xmm2 - DB 0F3h,0C3h ;repret - - - -ALIGN 16 -_aesni_encrypt2: - - movups xmm0,XMMWORD[rcx] - shl eax,4 - movups xmm1,XMMWORD[16+rcx] - xorps xmm2,xmm0 - xorps xmm3,xmm0 - movups xmm0,XMMWORD[32+rcx] - lea rcx,[32+rax*1+rcx] - neg rax - add rax,16 - -$L$enc_loop2: -DB 102,15,56,220,209 -DB 102,15,56,220,217 - movups xmm1,XMMWORD[rax*1+rcx] - add rax,32 -DB 102,15,56,220,208 -DB 102,15,56,220,216 - movups xmm0,XMMWORD[((-16))+rax*1+rcx] - jnz NEAR $L$enc_loop2 - -DB 102,15,56,220,209 -DB 102,15,56,220,217 -DB 102,15,56,221,208 -DB 102,15,56,221,216 - DB 0F3h,0C3h ;repret - - - -ALIGN 16 -_aesni_encrypt3: - - movups xmm0,XMMWORD[rcx] - shl eax,4 - movups xmm1,XMMWORD[16+rcx] - xorps xmm2,xmm0 - xorps xmm3,xmm0 - xorps xmm4,xmm0 - movups xmm0,XMMWORD[32+rcx] - lea rcx,[32+rax*1+rcx] - neg rax - add rax,16 - -$L$enc_loop3: -DB 102,15,56,220,209 -DB 102,15,56,220,217 -DB 102,15,56,220,225 - movups xmm1,XMMWORD[rax*1+rcx] - add rax,32 -DB 102,15,56,220,208 -DB 102,15,56,220,216 -DB 102,15,56,220,224 - movups xmm0,XMMWORD[((-16))+rax*1+rcx] - jnz NEAR $L$enc_loop3 - -DB 102,15,56,220,209 -DB 102,15,56,220,217 -DB 102,15,56,220,225 -DB 102,15,56,221,208 -DB 102,15,56,221,216 -DB 102,15,56,221,224 - DB 0F3h,0C3h ;repret - - - -ALIGN 16 -_aesni_encrypt4: - - movups xmm0,XMMWORD[rcx] - shl eax,4 - movups xmm1,XMMWORD[16+rcx] - xorps xmm2,xmm0 - xorps xmm3,xmm0 - xorps xmm4,xmm0 - xorps xmm5,xmm0 - movups xmm0,XMMWORD[32+rcx] - lea rcx,[32+rax*1+rcx] - neg rax -DB 0x0f,0x1f,0x00 - add rax,16 - -$L$enc_loop4: -DB 102,15,56,220,209 -DB 102,15,56,220,217 -DB 102,15,56,220,225 -DB 102,15,56,220,233 - movups xmm1,XMMWORD[rax*1+rcx] - add rax,32 -DB 102,15,56,220,208 -DB 102,15,56,220,216 -DB 102,15,56,220,224 -DB 102,15,56,220,232 - movups xmm0,XMMWORD[((-16))+rax*1+rcx] - jnz NEAR $L$enc_loop4 - -DB 102,15,56,220,209 -DB 102,15,56,220,217 -DB 102,15,56,220,225 -DB 102,15,56,220,233 -DB 102,15,56,221,208 -DB 102,15,56,221,216 -DB 102,15,56,221,224 -DB 102,15,56,221,232 - DB 0F3h,0C3h ;repret - - - -ALIGN 16 -_aesni_encrypt6: - - movups xmm0,XMMWORD[rcx] - shl eax,4 - movups xmm1,XMMWORD[16+rcx] - xorps xmm2,xmm0 - pxor xmm3,xmm0 - pxor xmm4,xmm0 -DB 102,15,56,220,209 - lea rcx,[32+rax*1+rcx] - neg rax -DB 102,15,56,220,217 - pxor xmm5,xmm0 - pxor xmm6,xmm0 -DB 102,15,56,220,225 - pxor xmm7,xmm0 - movups xmm0,XMMWORD[rax*1+rcx] - add rax,16 - jmp NEAR $L$enc_loop6_enter -ALIGN 16 -$L$enc_loop6: -DB 102,15,56,220,209 -DB 102,15,56,220,217 -DB 102,15,56,220,225 -$L$enc_loop6_enter: -DB 102,15,56,220,233 -DB 102,15,56,220,241 -DB 102,15,56,220,249 - movups xmm1,XMMWORD[rax*1+rcx] - add rax,32 -DB 102,15,56,220,208 -DB 102,15,56,220,216 -DB 102,15,56,220,224 -DB 102,15,56,220,232 -DB 102,15,56,220,240 -DB 102,15,56,220,248 - movups xmm0,XMMWORD[((-16))+rax*1+rcx] - jnz NEAR $L$enc_loop6 - -DB 102,15,56,220,209 -DB 102,15,56,220,217 -DB 102,15,56,220,225 -DB 102,15,56,220,233 -DB 102,15,56,220,241 -DB 102,15,56,220,249 -DB 102,15,56,221,208 -DB 102,15,56,221,216 -DB 102,15,56,221,224 -DB 102,15,56,221,232 -DB 102,15,56,221,240 -DB 102,15,56,221,248 - DB 0F3h,0C3h ;repret - - - -ALIGN 16 -_aesni_encrypt8: - - movups xmm0,XMMWORD[rcx] - shl eax,4 - movups xmm1,XMMWORD[16+rcx] - xorps xmm2,xmm0 - xorps xmm3,xmm0 - pxor xmm4,xmm0 - pxor xmm5,xmm0 - pxor xmm6,xmm0 - lea rcx,[32+rax*1+rcx] - neg rax -DB 102,15,56,220,209 - pxor xmm7,xmm0 - pxor xmm8,xmm0 -DB 102,15,56,220,217 - pxor xmm9,xmm0 - movups xmm0,XMMWORD[rax*1+rcx] - add rax,16 - jmp NEAR $L$enc_loop8_inner -ALIGN 16 -$L$enc_loop8: -DB 102,15,56,220,209 -DB 102,15,56,220,217 -$L$enc_loop8_inner: -DB 102,15,56,220,225 -DB 102,15,56,220,233 -DB 102,15,56,220,241 -DB 102,15,56,220,249 -DB 102,68,15,56,220,193 -DB 102,68,15,56,220,201 -$L$enc_loop8_enter: - movups xmm1,XMMWORD[rax*1+rcx] - add rax,32 -DB 102,15,56,220,208 -DB 102,15,56,220,216 -DB 102,15,56,220,224 -DB 102,15,56,220,232 -DB 102,15,56,220,240 -DB 102,15,56,220,248 -DB 102,68,15,56,220,192 -DB 102,68,15,56,220,200 - movups xmm0,XMMWORD[((-16))+rax*1+rcx] - jnz NEAR $L$enc_loop8 - -DB 102,15,56,220,209 -DB 102,15,56,220,217 -DB 102,15,56,220,225 -DB 102,15,56,220,233 -DB 102,15,56,220,241 -DB 102,15,56,220,249 -DB 102,68,15,56,220,193 -DB 102,68,15,56,220,201 -DB 102,15,56,221,208 -DB 102,15,56,221,216 -DB 102,15,56,221,224 -DB 102,15,56,221,232 -DB 102,15,56,221,240 -DB 102,15,56,221,248 -DB 102,68,15,56,221,192 -DB 102,68,15,56,221,200 - DB 0F3h,0C3h ;repret - - -global GFp_aes_hw_ctr32_encrypt_blocks - -ALIGN 16 -GFp_aes_hw_ctr32_encrypt_blocks: - mov QWORD[8+rsp],rdi ;WIN64 prologue - mov QWORD[16+rsp],rsi - mov rax,rsp -$L$SEH_begin_GFp_aes_hw_ctr32_encrypt_blocks: - mov rdi,rcx - mov rsi,rdx - mov rdx,r8 - mov rcx,r9 - mov r8,QWORD[40+rsp] - - - - cmp rdx,1 - jne NEAR $L$ctr32_bulk - - - - movups xmm2,XMMWORD[r8] - movups xmm3,XMMWORD[rdi] - mov edx,DWORD[240+rcx] - movups xmm0,XMMWORD[rcx] - movups xmm1,XMMWORD[16+rcx] - lea rcx,[32+rcx] - xorps xmm2,xmm0 -$L$oop_enc1_2: -DB 102,15,56,220,209 - dec edx - movups xmm1,XMMWORD[rcx] - lea rcx,[16+rcx] - jnz NEAR $L$oop_enc1_2 -DB 102,15,56,221,209 - pxor xmm0,xmm0 - pxor xmm1,xmm1 - xorps xmm2,xmm3 - pxor xmm3,xmm3 - movups XMMWORD[rsi],xmm2 - xorps xmm2,xmm2 - jmp NEAR $L$ctr32_epilogue - -ALIGN 16 -$L$ctr32_bulk: - lea r11,[rsp] - - push rbp - - sub rsp,288 - and rsp,-16 - movaps XMMWORD[(-168)+r11],xmm6 - movaps XMMWORD[(-152)+r11],xmm7 - movaps XMMWORD[(-136)+r11],xmm8 - movaps XMMWORD[(-120)+r11],xmm9 - movaps XMMWORD[(-104)+r11],xmm10 - movaps XMMWORD[(-88)+r11],xmm11 - movaps XMMWORD[(-72)+r11],xmm12 - movaps XMMWORD[(-56)+r11],xmm13 - movaps XMMWORD[(-40)+r11],xmm14 - movaps XMMWORD[(-24)+r11],xmm15 -$L$ctr32_body: - - - - - movdqu xmm2,XMMWORD[r8] - movdqu xmm0,XMMWORD[rcx] - mov r8d,DWORD[12+r8] - pxor xmm2,xmm0 - mov ebp,DWORD[12+rcx] - movdqa XMMWORD[rsp],xmm2 - bswap r8d - movdqa xmm3,xmm2 - movdqa xmm4,xmm2 - movdqa xmm5,xmm2 - movdqa XMMWORD[64+rsp],xmm2 - movdqa XMMWORD[80+rsp],xmm2 - movdqa XMMWORD[96+rsp],xmm2 - mov r10,rdx - movdqa XMMWORD[112+rsp],xmm2 - - lea rax,[1+r8] - lea rdx,[2+r8] - bswap eax - bswap edx - xor eax,ebp - xor edx,ebp -DB 102,15,58,34,216,3 - lea rax,[3+r8] - movdqa XMMWORD[16+rsp],xmm3 -DB 102,15,58,34,226,3 - bswap eax - mov rdx,r10 - lea r10,[4+r8] - movdqa XMMWORD[32+rsp],xmm4 - xor eax,ebp - bswap r10d -DB 102,15,58,34,232,3 - xor r10d,ebp - movdqa XMMWORD[48+rsp],xmm5 - lea r9,[5+r8] - mov DWORD[((64+12))+rsp],r10d - bswap r9d - lea r10,[6+r8] - mov eax,DWORD[240+rcx] - xor r9d,ebp - bswap r10d - mov DWORD[((80+12))+rsp],r9d - xor r10d,ebp - lea r9,[7+r8] - mov DWORD[((96+12))+rsp],r10d - bswap r9d - lea r10,[GFp_ia32cap_P] - mov r10d,DWORD[4+r10] - xor r9d,ebp - and r10d,71303168 - mov DWORD[((112+12))+rsp],r9d - - movups xmm1,XMMWORD[16+rcx] - - movdqa xmm6,XMMWORD[64+rsp] - movdqa xmm7,XMMWORD[80+rsp] - - cmp rdx,8 - jb NEAR $L$ctr32_tail - - sub rdx,6 - cmp r10d,4194304 - je NEAR $L$ctr32_6x - - lea rcx,[128+rcx] - sub rdx,2 - jmp NEAR $L$ctr32_loop8 - -ALIGN 16 -$L$ctr32_6x: - shl eax,4 - mov r10d,48 - bswap ebp - lea rcx,[32+rax*1+rcx] - sub r10,rax - jmp NEAR $L$ctr32_loop6 - -ALIGN 16 -$L$ctr32_loop6: - add r8d,6 - movups xmm0,XMMWORD[((-48))+r10*1+rcx] -DB 102,15,56,220,209 - mov eax,r8d - xor eax,ebp -DB 102,15,56,220,217 -DB 0x0f,0x38,0xf1,0x44,0x24,12 - lea eax,[1+r8] -DB 102,15,56,220,225 - xor eax,ebp -DB 0x0f,0x38,0xf1,0x44,0x24,28 -DB 102,15,56,220,233 - lea eax,[2+r8] - xor eax,ebp -DB 102,15,56,220,241 -DB 0x0f,0x38,0xf1,0x44,0x24,44 - lea eax,[3+r8] -DB 102,15,56,220,249 - movups xmm1,XMMWORD[((-32))+r10*1+rcx] - xor eax,ebp - -DB 102,15,56,220,208 -DB 0x0f,0x38,0xf1,0x44,0x24,60 - lea eax,[4+r8] -DB 102,15,56,220,216 - xor eax,ebp -DB 0x0f,0x38,0xf1,0x44,0x24,76 -DB 102,15,56,220,224 - lea eax,[5+r8] - xor eax,ebp -DB 102,15,56,220,232 -DB 0x0f,0x38,0xf1,0x44,0x24,92 - mov rax,r10 -DB 102,15,56,220,240 -DB 102,15,56,220,248 - movups xmm0,XMMWORD[((-16))+r10*1+rcx] - - call $L$enc_loop6 - - movdqu xmm8,XMMWORD[rdi] - movdqu xmm9,XMMWORD[16+rdi] - movdqu xmm10,XMMWORD[32+rdi] - movdqu xmm11,XMMWORD[48+rdi] - movdqu xmm12,XMMWORD[64+rdi] - movdqu xmm13,XMMWORD[80+rdi] - lea rdi,[96+rdi] - movups xmm1,XMMWORD[((-64))+r10*1+rcx] - pxor xmm8,xmm2 - movaps xmm2,XMMWORD[rsp] - pxor xmm9,xmm3 - movaps xmm3,XMMWORD[16+rsp] - pxor xmm10,xmm4 - movaps xmm4,XMMWORD[32+rsp] - pxor xmm11,xmm5 - movaps xmm5,XMMWORD[48+rsp] - pxor xmm12,xmm6 - movaps xmm6,XMMWORD[64+rsp] - pxor xmm13,xmm7 - movaps xmm7,XMMWORD[80+rsp] - movdqu XMMWORD[rsi],xmm8 - movdqu XMMWORD[16+rsi],xmm9 - movdqu XMMWORD[32+rsi],xmm10 - movdqu XMMWORD[48+rsi],xmm11 - movdqu XMMWORD[64+rsi],xmm12 - movdqu XMMWORD[80+rsi],xmm13 - lea rsi,[96+rsi] - - sub rdx,6 - jnc NEAR $L$ctr32_loop6 - - add rdx,6 - jz NEAR $L$ctr32_done - - lea eax,[((-48))+r10] - lea rcx,[((-80))+r10*1+rcx] - neg eax - shr eax,4 - jmp NEAR $L$ctr32_tail - -ALIGN 32 -$L$ctr32_loop8: - add r8d,8 - movdqa xmm8,XMMWORD[96+rsp] -DB 102,15,56,220,209 - mov r9d,r8d - movdqa xmm9,XMMWORD[112+rsp] -DB 102,15,56,220,217 - bswap r9d - movups xmm0,XMMWORD[((32-128))+rcx] -DB 102,15,56,220,225 - xor r9d,ebp - nop -DB 102,15,56,220,233 - mov DWORD[((0+12))+rsp],r9d - lea r9,[1+r8] -DB 102,15,56,220,241 -DB 102,15,56,220,249 -DB 102,68,15,56,220,193 -DB 102,68,15,56,220,201 - movups xmm1,XMMWORD[((48-128))+rcx] - bswap r9d -DB 102,15,56,220,208 -DB 102,15,56,220,216 - xor r9d,ebp -DB 0x66,0x90 -DB 102,15,56,220,224 -DB 102,15,56,220,232 - mov DWORD[((16+12))+rsp],r9d - lea r9,[2+r8] -DB 102,15,56,220,240 -DB 102,15,56,220,248 -DB 102,68,15,56,220,192 -DB 102,68,15,56,220,200 - movups xmm0,XMMWORD[((64-128))+rcx] - bswap r9d -DB 102,15,56,220,209 -DB 102,15,56,220,217 - xor r9d,ebp -DB 0x66,0x90 -DB 102,15,56,220,225 -DB 102,15,56,220,233 - mov DWORD[((32+12))+rsp],r9d - lea r9,[3+r8] -DB 102,15,56,220,241 -DB 102,15,56,220,249 -DB 102,68,15,56,220,193 -DB 102,68,15,56,220,201 - movups xmm1,XMMWORD[((80-128))+rcx] - bswap r9d -DB 102,15,56,220,208 -DB 102,15,56,220,216 - xor r9d,ebp -DB 0x66,0x90 -DB 102,15,56,220,224 -DB 102,15,56,220,232 - mov DWORD[((48+12))+rsp],r9d - lea r9,[4+r8] -DB 102,15,56,220,240 -DB 102,15,56,220,248 -DB 102,68,15,56,220,192 -DB 102,68,15,56,220,200 - movups xmm0,XMMWORD[((96-128))+rcx] - bswap r9d -DB 102,15,56,220,209 -DB 102,15,56,220,217 - xor r9d,ebp -DB 0x66,0x90 -DB 102,15,56,220,225 -DB 102,15,56,220,233 - mov DWORD[((64+12))+rsp],r9d - lea r9,[5+r8] -DB 102,15,56,220,241 -DB 102,15,56,220,249 -DB 102,68,15,56,220,193 -DB 102,68,15,56,220,201 - movups xmm1,XMMWORD[((112-128))+rcx] - bswap r9d -DB 102,15,56,220,208 -DB 102,15,56,220,216 - xor r9d,ebp -DB 0x66,0x90 -DB 102,15,56,220,224 -DB 102,15,56,220,232 - mov DWORD[((80+12))+rsp],r9d - lea r9,[6+r8] -DB 102,15,56,220,240 -DB 102,15,56,220,248 -DB 102,68,15,56,220,192 -DB 102,68,15,56,220,200 - movups xmm0,XMMWORD[((128-128))+rcx] - bswap r9d -DB 102,15,56,220,209 -DB 102,15,56,220,217 - xor r9d,ebp -DB 0x66,0x90 -DB 102,15,56,220,225 -DB 102,15,56,220,233 - mov DWORD[((96+12))+rsp],r9d - lea r9,[7+r8] -DB 102,15,56,220,241 -DB 102,15,56,220,249 -DB 102,68,15,56,220,193 -DB 102,68,15,56,220,201 - movups xmm1,XMMWORD[((144-128))+rcx] - bswap r9d -DB 102,15,56,220,208 -DB 102,15,56,220,216 -DB 102,15,56,220,224 - xor r9d,ebp - movdqu xmm10,XMMWORD[rdi] -DB 102,15,56,220,232 - mov DWORD[((112+12))+rsp],r9d - cmp eax,11 -DB 102,15,56,220,240 -DB 102,15,56,220,248 -DB 102,68,15,56,220,192 -DB 102,68,15,56,220,200 - movups xmm0,XMMWORD[((160-128))+rcx] - - jb NEAR $L$ctr32_enc_done - -DB 102,15,56,220,209 -DB 102,15,56,220,217 -DB 102,15,56,220,225 -DB 102,15,56,220,233 -DB 102,15,56,220,241 -DB 102,15,56,220,249 -DB 102,68,15,56,220,193 -DB 102,68,15,56,220,201 - movups xmm1,XMMWORD[((176-128))+rcx] - -DB 102,15,56,220,208 -DB 102,15,56,220,216 -DB 102,15,56,220,224 -DB 102,15,56,220,232 -DB 102,15,56,220,240 -DB 102,15,56,220,248 -DB 102,68,15,56,220,192 -DB 102,68,15,56,220,200 - movups xmm0,XMMWORD[((192-128))+rcx] - - - -DB 102,15,56,220,209 -DB 102,15,56,220,217 -DB 102,15,56,220,225 -DB 102,15,56,220,233 -DB 102,15,56,220,241 -DB 102,15,56,220,249 -DB 102,68,15,56,220,193 -DB 102,68,15,56,220,201 - movups xmm1,XMMWORD[((208-128))+rcx] - -DB 102,15,56,220,208 -DB 102,15,56,220,216 -DB 102,15,56,220,224 -DB 102,15,56,220,232 -DB 102,15,56,220,240 -DB 102,15,56,220,248 -DB 102,68,15,56,220,192 -DB 102,68,15,56,220,200 - movups xmm0,XMMWORD[((224-128))+rcx] - jmp NEAR $L$ctr32_enc_done - -ALIGN 16 -$L$ctr32_enc_done: - movdqu xmm11,XMMWORD[16+rdi] - pxor xmm10,xmm0 - movdqu xmm12,XMMWORD[32+rdi] - pxor xmm11,xmm0 - movdqu xmm13,XMMWORD[48+rdi] - pxor xmm12,xmm0 - movdqu xmm14,XMMWORD[64+rdi] - pxor xmm13,xmm0 - movdqu xmm15,XMMWORD[80+rdi] - pxor xmm14,xmm0 - pxor xmm15,xmm0 -DB 102,15,56,220,209 -DB 102,15,56,220,217 -DB 102,15,56,220,225 -DB 102,15,56,220,233 -DB 102,15,56,220,241 -DB 102,15,56,220,249 -DB 102,68,15,56,220,193 -DB 102,68,15,56,220,201 - movdqu xmm1,XMMWORD[96+rdi] - lea rdi,[128+rdi] - -DB 102,65,15,56,221,210 - pxor xmm1,xmm0 - movdqu xmm10,XMMWORD[((112-128))+rdi] -DB 102,65,15,56,221,219 - pxor xmm10,xmm0 - movdqa xmm11,XMMWORD[rsp] -DB 102,65,15,56,221,228 -DB 102,65,15,56,221,237 - movdqa xmm12,XMMWORD[16+rsp] - movdqa xmm13,XMMWORD[32+rsp] -DB 102,65,15,56,221,246 -DB 102,65,15,56,221,255 - movdqa xmm14,XMMWORD[48+rsp] - movdqa xmm15,XMMWORD[64+rsp] -DB 102,68,15,56,221,193 - movdqa xmm0,XMMWORD[80+rsp] - movups xmm1,XMMWORD[((16-128))+rcx] -DB 102,69,15,56,221,202 - - movups XMMWORD[rsi],xmm2 - movdqa xmm2,xmm11 - movups XMMWORD[16+rsi],xmm3 - movdqa xmm3,xmm12 - movups XMMWORD[32+rsi],xmm4 - movdqa xmm4,xmm13 - movups XMMWORD[48+rsi],xmm5 - movdqa xmm5,xmm14 - movups XMMWORD[64+rsi],xmm6 - movdqa xmm6,xmm15 - movups XMMWORD[80+rsi],xmm7 - movdqa xmm7,xmm0 - movups XMMWORD[96+rsi],xmm8 - movups XMMWORD[112+rsi],xmm9 - lea rsi,[128+rsi] - - sub rdx,8 - jnc NEAR $L$ctr32_loop8 - - add rdx,8 - jz NEAR $L$ctr32_done - lea rcx,[((-128))+rcx] - -$L$ctr32_tail: - - - lea rcx,[16+rcx] - cmp rdx,4 - jb NEAR $L$ctr32_loop3 - je NEAR $L$ctr32_loop4 - - - shl eax,4 - movdqa xmm8,XMMWORD[96+rsp] - pxor xmm9,xmm9 - - movups xmm0,XMMWORD[16+rcx] -DB 102,15,56,220,209 -DB 102,15,56,220,217 - lea rcx,[((32-16))+rax*1+rcx] - neg rax -DB 102,15,56,220,225 - add rax,16 - movups xmm10,XMMWORD[rdi] -DB 102,15,56,220,233 -DB 102,15,56,220,241 - movups xmm11,XMMWORD[16+rdi] - movups xmm12,XMMWORD[32+rdi] -DB 102,15,56,220,249 -DB 102,68,15,56,220,193 - - call $L$enc_loop8_enter - - movdqu xmm13,XMMWORD[48+rdi] - pxor xmm2,xmm10 - movdqu xmm10,XMMWORD[64+rdi] - pxor xmm3,xmm11 - movdqu XMMWORD[rsi],xmm2 - pxor xmm4,xmm12 - movdqu XMMWORD[16+rsi],xmm3 - pxor xmm5,xmm13 - movdqu XMMWORD[32+rsi],xmm4 - pxor xmm6,xmm10 - movdqu XMMWORD[48+rsi],xmm5 - movdqu XMMWORD[64+rsi],xmm6 - cmp rdx,6 - jb NEAR $L$ctr32_done - - movups xmm11,XMMWORD[80+rdi] - xorps xmm7,xmm11 - movups XMMWORD[80+rsi],xmm7 - je NEAR $L$ctr32_done - - movups xmm12,XMMWORD[96+rdi] - xorps xmm8,xmm12 - movups XMMWORD[96+rsi],xmm8 - jmp NEAR $L$ctr32_done - -ALIGN 32 -$L$ctr32_loop4: -DB 102,15,56,220,209 - lea rcx,[16+rcx] - dec eax -DB 102,15,56,220,217 -DB 102,15,56,220,225 -DB 102,15,56,220,233 - movups xmm1,XMMWORD[rcx] - jnz NEAR $L$ctr32_loop4 -DB 102,15,56,221,209 -DB 102,15,56,221,217 - movups xmm10,XMMWORD[rdi] - movups xmm11,XMMWORD[16+rdi] -DB 102,15,56,221,225 -DB 102,15,56,221,233 - movups xmm12,XMMWORD[32+rdi] - movups xmm13,XMMWORD[48+rdi] - - xorps xmm2,xmm10 - movups XMMWORD[rsi],xmm2 - xorps xmm3,xmm11 - movups XMMWORD[16+rsi],xmm3 - pxor xmm4,xmm12 - movdqu XMMWORD[32+rsi],xmm4 - pxor xmm5,xmm13 - movdqu XMMWORD[48+rsi],xmm5 - jmp NEAR $L$ctr32_done - -ALIGN 32 -$L$ctr32_loop3: -DB 102,15,56,220,209 - lea rcx,[16+rcx] - dec eax -DB 102,15,56,220,217 -DB 102,15,56,220,225 - movups xmm1,XMMWORD[rcx] - jnz NEAR $L$ctr32_loop3 -DB 102,15,56,221,209 -DB 102,15,56,221,217 -DB 102,15,56,221,225 - - movups xmm10,XMMWORD[rdi] - xorps xmm2,xmm10 - movups XMMWORD[rsi],xmm2 - cmp rdx,2 - jb NEAR $L$ctr32_done - - movups xmm11,XMMWORD[16+rdi] - xorps xmm3,xmm11 - movups XMMWORD[16+rsi],xmm3 - je NEAR $L$ctr32_done - - movups xmm12,XMMWORD[32+rdi] - xorps xmm4,xmm12 - movups XMMWORD[32+rsi],xmm4 - -$L$ctr32_done: - xorps xmm0,xmm0 - xor ebp,ebp - pxor xmm1,xmm1 - pxor xmm2,xmm2 - pxor xmm3,xmm3 - pxor xmm4,xmm4 - pxor xmm5,xmm5 - movaps xmm6,XMMWORD[((-168))+r11] - movaps XMMWORD[(-168)+r11],xmm0 - movaps xmm7,XMMWORD[((-152))+r11] - movaps XMMWORD[(-152)+r11],xmm0 - movaps xmm8,XMMWORD[((-136))+r11] - movaps XMMWORD[(-136)+r11],xmm0 - movaps xmm9,XMMWORD[((-120))+r11] - movaps XMMWORD[(-120)+r11],xmm0 - movaps xmm10,XMMWORD[((-104))+r11] - movaps XMMWORD[(-104)+r11],xmm0 - movaps xmm11,XMMWORD[((-88))+r11] - movaps XMMWORD[(-88)+r11],xmm0 - movaps xmm12,XMMWORD[((-72))+r11] - movaps XMMWORD[(-72)+r11],xmm0 - movaps xmm13,XMMWORD[((-56))+r11] - movaps XMMWORD[(-56)+r11],xmm0 - movaps xmm14,XMMWORD[((-40))+r11] - movaps XMMWORD[(-40)+r11],xmm0 - movaps xmm15,XMMWORD[((-24))+r11] - movaps XMMWORD[(-24)+r11],xmm0 - movaps XMMWORD[rsp],xmm0 - movaps XMMWORD[16+rsp],xmm0 - movaps XMMWORD[32+rsp],xmm0 - movaps XMMWORD[48+rsp],xmm0 - movaps XMMWORD[64+rsp],xmm0 - movaps XMMWORD[80+rsp],xmm0 - movaps XMMWORD[96+rsp],xmm0 - movaps XMMWORD[112+rsp],xmm0 - mov rbp,QWORD[((-8))+r11] - - lea rsp,[r11] - -$L$ctr32_epilogue: - mov rdi,QWORD[8+rsp] ;WIN64 epilogue - mov rsi,QWORD[16+rsp] - DB 0F3h,0C3h ;repret - -$L$SEH_end_GFp_aes_hw_ctr32_encrypt_blocks: -global GFp_aes_hw_set_encrypt_key - -ALIGN 16 -GFp_aes_hw_set_encrypt_key: -__aesni_set_encrypt_key: - -DB 0x48,0x83,0xEC,0x08 - - mov rax,-1 - test rcx,rcx - jz NEAR $L$enc_key_ret - test r8,r8 - jz NEAR $L$enc_key_ret - - movups xmm0,XMMWORD[rcx] - xorps xmm4,xmm4 - lea r10,[GFp_ia32cap_P] - mov r10d,DWORD[4+r10] - and r10d,268437504 - lea rax,[16+r8] - cmp edx,256 - je NEAR $L$14rounds - - cmp edx,128 - jne NEAR $L$bad_keybits - -$L$10rounds: - mov edx,9 - cmp r10d,268435456 - je NEAR $L$10rounds_alt - - movups XMMWORD[r8],xmm0 -DB 102,15,58,223,200,1 - call $L$key_expansion_128_cold -DB 102,15,58,223,200,2 - call $L$key_expansion_128 -DB 102,15,58,223,200,4 - call $L$key_expansion_128 -DB 102,15,58,223,200,8 - call $L$key_expansion_128 -DB 102,15,58,223,200,16 - call $L$key_expansion_128 -DB 102,15,58,223,200,32 - call $L$key_expansion_128 -DB 102,15,58,223,200,64 - call $L$key_expansion_128 -DB 102,15,58,223,200,128 - call $L$key_expansion_128 -DB 102,15,58,223,200,27 - call $L$key_expansion_128 -DB 102,15,58,223,200,54 - call $L$key_expansion_128 - movups XMMWORD[rax],xmm0 - mov DWORD[80+rax],edx - xor eax,eax - jmp NEAR $L$enc_key_ret - -ALIGN 16 -$L$10rounds_alt: - movdqa xmm5,XMMWORD[$L$key_rotate] - mov r10d,8 - movdqa xmm4,XMMWORD[$L$key_rcon1] - movdqa xmm2,xmm0 - movdqu XMMWORD[r8],xmm0 - jmp NEAR $L$oop_key128 - -ALIGN 16 -$L$oop_key128: -DB 102,15,56,0,197 -DB 102,15,56,221,196 - pslld xmm4,1 - lea rax,[16+rax] - - movdqa xmm3,xmm2 - pslldq xmm2,4 - pxor xmm3,xmm2 - pslldq xmm2,4 - pxor xmm3,xmm2 - pslldq xmm2,4 - pxor xmm2,xmm3 - - pxor xmm0,xmm2 - movdqu XMMWORD[(-16)+rax],xmm0 - movdqa xmm2,xmm0 - - dec r10d - jnz NEAR $L$oop_key128 - - movdqa xmm4,XMMWORD[$L$key_rcon1b] - -DB 102,15,56,0,197 -DB 102,15,56,221,196 - pslld xmm4,1 - - movdqa xmm3,xmm2 - pslldq xmm2,4 - pxor xmm3,xmm2 - pslldq xmm2,4 - pxor xmm3,xmm2 - pslldq xmm2,4 - pxor xmm2,xmm3 - - pxor xmm0,xmm2 - movdqu XMMWORD[rax],xmm0 - - movdqa xmm2,xmm0 -DB 102,15,56,0,197 -DB 102,15,56,221,196 - - movdqa xmm3,xmm2 - pslldq xmm2,4 - pxor xmm3,xmm2 - pslldq xmm2,4 - pxor xmm3,xmm2 - pslldq xmm2,4 - pxor xmm2,xmm3 - - pxor xmm0,xmm2 - movdqu XMMWORD[16+rax],xmm0 - - mov DWORD[96+rax],edx - xor eax,eax - jmp NEAR $L$enc_key_ret - - - -ALIGN 16 -$L$14rounds: - movups xmm2,XMMWORD[16+rcx] - mov edx,13 - lea rax,[16+rax] - cmp r10d,268435456 - je NEAR $L$14rounds_alt - - movups XMMWORD[r8],xmm0 - movups XMMWORD[16+r8],xmm2 -DB 102,15,58,223,202,1 - call $L$key_expansion_256a_cold -DB 102,15,58,223,200,1 - call $L$key_expansion_256b -DB 102,15,58,223,202,2 - call $L$key_expansion_256a -DB 102,15,58,223,200,2 - call $L$key_expansion_256b -DB 102,15,58,223,202,4 - call $L$key_expansion_256a -DB 102,15,58,223,200,4 - call $L$key_expansion_256b -DB 102,15,58,223,202,8 - call $L$key_expansion_256a -DB 102,15,58,223,200,8 - call $L$key_expansion_256b -DB 102,15,58,223,202,16 - call $L$key_expansion_256a -DB 102,15,58,223,200,16 - call $L$key_expansion_256b -DB 102,15,58,223,202,32 - call $L$key_expansion_256a -DB 102,15,58,223,200,32 - call $L$key_expansion_256b -DB 102,15,58,223,202,64 - call $L$key_expansion_256a - movups XMMWORD[rax],xmm0 - mov DWORD[16+rax],edx - xor rax,rax - jmp NEAR $L$enc_key_ret - -ALIGN 16 -$L$14rounds_alt: - movdqa xmm5,XMMWORD[$L$key_rotate] - movdqa xmm4,XMMWORD[$L$key_rcon1] - mov r10d,7 - movdqu XMMWORD[r8],xmm0 - movdqa xmm1,xmm2 - movdqu XMMWORD[16+r8],xmm2 - jmp NEAR $L$oop_key256 - -ALIGN 16 -$L$oop_key256: -DB 102,15,56,0,213 -DB 102,15,56,221,212 - - movdqa xmm3,xmm0 - pslldq xmm0,4 - pxor xmm3,xmm0 - pslldq xmm0,4 - pxor xmm3,xmm0 - pslldq xmm0,4 - pxor xmm0,xmm3 - pslld xmm4,1 - - pxor xmm0,xmm2 - movdqu XMMWORD[rax],xmm0 - - dec r10d - jz NEAR $L$done_key256 - - pshufd xmm2,xmm0,0xff - pxor xmm3,xmm3 -DB 102,15,56,221,211 - - movdqa xmm3,xmm1 - pslldq xmm1,4 - pxor xmm3,xmm1 - pslldq xmm1,4 - pxor xmm3,xmm1 - pslldq xmm1,4 - pxor xmm1,xmm3 - - pxor xmm2,xmm1 - movdqu XMMWORD[16+rax],xmm2 - lea rax,[32+rax] - movdqa xmm1,xmm2 - - jmp NEAR $L$oop_key256 - -$L$done_key256: - mov DWORD[16+rax],edx - xor eax,eax - jmp NEAR $L$enc_key_ret - -ALIGN 16 -$L$bad_keybits: - mov rax,-2 -$L$enc_key_ret: - pxor xmm0,xmm0 - pxor xmm1,xmm1 - pxor xmm2,xmm2 - pxor xmm3,xmm3 - pxor xmm4,xmm4 - pxor xmm5,xmm5 - add rsp,8 - - DB 0F3h,0C3h ;repret - -$L$SEH_end_GFp_set_encrypt_key: - -ALIGN 16 -$L$key_expansion_128: - movups XMMWORD[rax],xmm0 - lea rax,[16+rax] -$L$key_expansion_128_cold: - shufps xmm4,xmm0,16 - xorps xmm0,xmm4 - shufps xmm4,xmm0,140 - xorps xmm0,xmm4 - shufps xmm1,xmm1,255 - xorps xmm0,xmm1 - DB 0F3h,0C3h ;repret - -ALIGN 16 -$L$key_expansion_192a: - movups XMMWORD[rax],xmm0 - lea rax,[16+rax] -$L$key_expansion_192a_cold: - movaps xmm5,xmm2 -$L$key_expansion_192b_warm: - shufps xmm4,xmm0,16 - movdqa xmm3,xmm2 - xorps xmm0,xmm4 - shufps xmm4,xmm0,140 - pslldq xmm3,4 - xorps xmm0,xmm4 - pshufd xmm1,xmm1,85 - pxor xmm2,xmm3 - pxor xmm0,xmm1 - pshufd xmm3,xmm0,255 - pxor xmm2,xmm3 - DB 0F3h,0C3h ;repret - -ALIGN 16 -$L$key_expansion_192b: - movaps xmm3,xmm0 - shufps xmm5,xmm0,68 - movups XMMWORD[rax],xmm5 - shufps xmm3,xmm2,78 - movups XMMWORD[16+rax],xmm3 - lea rax,[32+rax] - jmp NEAR $L$key_expansion_192b_warm - -ALIGN 16 -$L$key_expansion_256a: - movups XMMWORD[rax],xmm2 - lea rax,[16+rax] -$L$key_expansion_256a_cold: - shufps xmm4,xmm0,16 - xorps xmm0,xmm4 - shufps xmm4,xmm0,140 - xorps xmm0,xmm4 - shufps xmm1,xmm1,255 - xorps xmm0,xmm1 - DB 0F3h,0C3h ;repret - -ALIGN 16 -$L$key_expansion_256b: - movups XMMWORD[rax],xmm0 - lea rax,[16+rax] - - shufps xmm4,xmm2,16 - xorps xmm2,xmm4 - shufps xmm4,xmm2,140 - xorps xmm2,xmm4 - shufps xmm1,xmm1,170 - xorps xmm2,xmm1 - DB 0F3h,0C3h ;repret - - -ALIGN 64 -$L$bswap_mask: -DB 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 -$L$increment32: - DD 6,6,6,0 -$L$increment64: - DD 1,0,0,0 -$L$increment1: -DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 -$L$key_rotate: - DD 0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d -$L$key_rotate192: - DD 0x04070605,0x04070605,0x04070605,0x04070605 -$L$key_rcon1: - DD 1,1,1,1 -$L$key_rcon1b: - DD 0x1b,0x1b,0x1b,0x1b - -DB 65,69,83,32,102,111,114,32,73,110,116,101,108,32,65,69 -DB 83,45,78,73,44,32,67,82,89,80,84,79,71,65,77,83 -DB 32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115 -DB 115,108,46,111,114,103,62,0 -ALIGN 64 -EXTERN __imp_RtlVirtualUnwind - -ALIGN 16 -ctr_xts_se_handler: - push rsi - push rdi - push rbx - push rbp - push r12 - push r13 - push r14 - push r15 - pushfq - sub rsp,64 - - mov rax,QWORD[120+r8] - mov rbx,QWORD[248+r8] - - mov rsi,QWORD[8+r9] - mov r11,QWORD[56+r9] - - mov r10d,DWORD[r11] - lea r10,[r10*1+rsi] - cmp rbx,r10 - jb NEAR $L$common_seh_tail - - mov rax,QWORD[152+r8] - - mov r10d,DWORD[4+r11] - lea r10,[r10*1+rsi] - cmp rbx,r10 - jae NEAR $L$common_seh_tail - - mov rax,QWORD[208+r8] - - lea rsi,[((-168))+rax] - lea rdi,[512+r8] - mov ecx,20 - DD 0xa548f3fc - - mov rbp,QWORD[((-8))+rax] - mov QWORD[160+r8],rbp - - -$L$common_seh_tail: - mov rdi,QWORD[8+rax] - mov rsi,QWORD[16+rax] - mov QWORD[152+r8],rax - mov QWORD[168+r8],rsi - mov QWORD[176+r8],rdi - - mov rdi,QWORD[40+r9] - mov rsi,r8 - mov ecx,154 - DD 0xa548f3fc - - mov rsi,r9 - xor rcx,rcx - mov rdx,QWORD[8+rsi] - mov r8,QWORD[rsi] - mov r9,QWORD[16+rsi] - mov r10,QWORD[40+rsi] - lea r11,[56+rsi] - lea r12,[24+rsi] - mov QWORD[32+rsp],r10 - mov QWORD[40+rsp],r11 - mov QWORD[48+rsp],r12 - mov QWORD[56+rsp],rcx - call QWORD[__imp_RtlVirtualUnwind] - - mov eax,1 - add rsp,64 - popfq - pop r15 - pop r14 - pop r13 - pop r12 - pop rbp - pop rbx - pop rdi - pop rsi - DB 0F3h,0C3h ;repret - - -section .pdata rdata align=4 -ALIGN 4 - DD $L$SEH_begin_GFp_aes_hw_ctr32_encrypt_blocks wrt ..imagebase - DD $L$SEH_end_GFp_aes_hw_ctr32_encrypt_blocks wrt ..imagebase - DD $L$SEH_info_GFp_ctr32 wrt ..imagebase - DD GFp_aes_hw_set_encrypt_key wrt ..imagebase - DD $L$SEH_end_GFp_set_encrypt_key wrt ..imagebase - DD $L$SEH_info_GFp_key wrt ..imagebase -section .xdata rdata align=8 -ALIGN 8 -$L$SEH_info_GFp_ctr32: -DB 9,0,0,0 - DD ctr_xts_se_handler wrt ..imagebase - DD $L$ctr32_body wrt ..imagebase,$L$ctr32_epilogue wrt ..imagebase -$L$SEH_info_GFp_key: -DB 0x01,0x04,0x01,0x00 -DB 0x04,0x02,0x00,0x00 diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/tmp/aesni-x86-win32n.asm temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/tmp/aesni-x86-win32n.asm --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/tmp/aesni-x86-win32n.asm 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/tmp/aesni-x86-win32n.asm 1970-01-01 00:00:00.000000000 +0000 @@ -1,682 +0,0 @@ -; This file is generated from a similarly-named Perl script in the BoringSSL -; source tree. Do not edit by hand. - -%ifdef BORINGSSL_PREFIX -%include "boringssl_prefix_symbols_nasm.inc" -%endif -%ifidn __OUTPUT_FORMAT__,obj -section code use32 class=code align=64 -%elifidn __OUTPUT_FORMAT__,win32 -$@feat.00 equ 1 -section .text code align=64 -%else -section .text code -%endif -;extern _GFp_ia32cap_P -global _GFp_aes_hw_encrypt -align 16 -_GFp_aes_hw_encrypt: -L$_GFp_aes_hw_encrypt_begin: - mov eax,DWORD [4+esp] - mov edx,DWORD [12+esp] - movups xmm2,[eax] - mov ecx,DWORD [240+edx] - mov eax,DWORD [8+esp] - movups xmm0,[edx] - movups xmm1,[16+edx] - lea edx,[32+edx] - xorps xmm2,xmm0 -L$000enc1_loop_1: -db 102,15,56,220,209 - dec ecx - movups xmm1,[edx] - lea edx,[16+edx] - jnz NEAR L$000enc1_loop_1 -db 102,15,56,221,209 - pxor xmm0,xmm0 - pxor xmm1,xmm1 - movups [eax],xmm2 - pxor xmm2,xmm2 - ret -align 16 -__aesni_encrypt2: - movups xmm0,[edx] - shl ecx,4 - movups xmm1,[16+edx] - xorps xmm2,xmm0 - pxor xmm3,xmm0 - movups xmm0,[32+edx] - lea edx,[32+ecx*1+edx] - neg ecx - add ecx,16 -L$001enc2_loop: -db 102,15,56,220,209 -db 102,15,56,220,217 - movups xmm1,[ecx*1+edx] - add ecx,32 -db 102,15,56,220,208 -db 102,15,56,220,216 - movups xmm0,[ecx*1+edx-16] - jnz NEAR L$001enc2_loop -db 102,15,56,220,209 -db 102,15,56,220,217 -db 102,15,56,221,208 -db 102,15,56,221,216 - ret -align 16 -__aesni_encrypt3: - movups xmm0,[edx] - shl ecx,4 - movups xmm1,[16+edx] - xorps xmm2,xmm0 - pxor xmm3,xmm0 - pxor xmm4,xmm0 - movups xmm0,[32+edx] - lea edx,[32+ecx*1+edx] - neg ecx - add ecx,16 -L$002enc3_loop: -db 102,15,56,220,209 -db 102,15,56,220,217 -db 102,15,56,220,225 - movups xmm1,[ecx*1+edx] - add ecx,32 -db 102,15,56,220,208 -db 102,15,56,220,216 -db 102,15,56,220,224 - movups xmm0,[ecx*1+edx-16] - jnz NEAR L$002enc3_loop -db 102,15,56,220,209 -db 102,15,56,220,217 -db 102,15,56,220,225 -db 102,15,56,221,208 -db 102,15,56,221,216 -db 102,15,56,221,224 - ret -align 16 -__aesni_encrypt4: - movups xmm0,[edx] - movups xmm1,[16+edx] - shl ecx,4 - xorps xmm2,xmm0 - pxor xmm3,xmm0 - pxor xmm4,xmm0 - pxor xmm5,xmm0 - movups xmm0,[32+edx] - lea edx,[32+ecx*1+edx] - neg ecx -db 15,31,64,0 - add ecx,16 -L$003enc4_loop: -db 102,15,56,220,209 -db 102,15,56,220,217 -db 102,15,56,220,225 -db 102,15,56,220,233 - movups xmm1,[ecx*1+edx] - add ecx,32 -db 102,15,56,220,208 -db 102,15,56,220,216 -db 102,15,56,220,224 -db 102,15,56,220,232 - movups xmm0,[ecx*1+edx-16] - jnz NEAR L$003enc4_loop -db 102,15,56,220,209 -db 102,15,56,220,217 -db 102,15,56,220,225 -db 102,15,56,220,233 -db 102,15,56,221,208 -db 102,15,56,221,216 -db 102,15,56,221,224 -db 102,15,56,221,232 - ret -align 16 -__aesni_encrypt6: - movups xmm0,[edx] - shl ecx,4 - movups xmm1,[16+edx] - xorps xmm2,xmm0 - pxor xmm3,xmm0 - pxor xmm4,xmm0 -db 102,15,56,220,209 - pxor xmm5,xmm0 - pxor xmm6,xmm0 -db 102,15,56,220,217 - lea edx,[32+ecx*1+edx] - neg ecx -db 102,15,56,220,225 - pxor xmm7,xmm0 - movups xmm0,[ecx*1+edx] - add ecx,16 - jmp NEAR L$004_aesni_encrypt6_inner -align 16 -L$005enc6_loop: -db 102,15,56,220,209 -db 102,15,56,220,217 -db 102,15,56,220,225 -L$004_aesni_encrypt6_inner: -db 102,15,56,220,233 -db 102,15,56,220,241 -db 102,15,56,220,249 -L$_aesni_encrypt6_enter: - movups xmm1,[ecx*1+edx] - add ecx,32 -db 102,15,56,220,208 -db 102,15,56,220,216 -db 102,15,56,220,224 -db 102,15,56,220,232 -db 102,15,56,220,240 -db 102,15,56,220,248 - movups xmm0,[ecx*1+edx-16] - jnz NEAR L$005enc6_loop -db 102,15,56,220,209 -db 102,15,56,220,217 -db 102,15,56,220,225 -db 102,15,56,220,233 -db 102,15,56,220,241 -db 102,15,56,220,249 -db 102,15,56,221,208 -db 102,15,56,221,216 -db 102,15,56,221,224 -db 102,15,56,221,232 -db 102,15,56,221,240 -db 102,15,56,221,248 - ret -global _GFp_aes_hw_ctr32_encrypt_blocks -align 16 -_GFp_aes_hw_ctr32_encrypt_blocks: -L$_GFp_aes_hw_ctr32_encrypt_blocks_begin: - push ebp - push ebx - push esi - push edi - mov esi,DWORD [20+esp] - mov edi,DWORD [24+esp] - mov eax,DWORD [28+esp] - mov edx,DWORD [32+esp] - mov ebx,DWORD [36+esp] - mov ebp,esp - sub esp,88 - and esp,-16 - mov DWORD [80+esp],ebp - cmp eax,1 - je NEAR L$006ctr32_one_shortcut - movdqu xmm7,[ebx] - mov DWORD [esp],202182159 - mov DWORD [4+esp],134810123 - mov DWORD [8+esp],67438087 - mov DWORD [12+esp],66051 - mov ecx,6 - xor ebp,ebp - mov DWORD [16+esp],ecx - mov DWORD [20+esp],ecx - mov DWORD [24+esp],ecx - mov DWORD [28+esp],ebp -db 102,15,58,22,251,3 -db 102,15,58,34,253,3 - mov ecx,DWORD [240+edx] - bswap ebx - pxor xmm0,xmm0 - pxor xmm1,xmm1 - movdqa xmm2,[esp] -db 102,15,58,34,195,0 - lea ebp,[3+ebx] -db 102,15,58,34,205,0 - inc ebx -db 102,15,58,34,195,1 - inc ebp -db 102,15,58,34,205,1 - inc ebx -db 102,15,58,34,195,2 - inc ebp -db 102,15,58,34,205,2 - movdqa [48+esp],xmm0 -db 102,15,56,0,194 - movdqu xmm6,[edx] - movdqa [64+esp],xmm1 -db 102,15,56,0,202 - pshufd xmm2,xmm0,192 - pshufd xmm3,xmm0,128 - cmp eax,6 - jb NEAR L$007ctr32_tail - pxor xmm7,xmm6 - shl ecx,4 - mov ebx,16 - movdqa [32+esp],xmm7 - mov ebp,edx - sub ebx,ecx - lea edx,[32+ecx*1+edx] - sub eax,6 - jmp NEAR L$008ctr32_loop6 -align 16 -L$008ctr32_loop6: - pshufd xmm4,xmm0,64 - movdqa xmm0,[32+esp] - pshufd xmm5,xmm1,192 - pxor xmm2,xmm0 - pshufd xmm6,xmm1,128 - pxor xmm3,xmm0 - pshufd xmm7,xmm1,64 - movups xmm1,[16+ebp] - pxor xmm4,xmm0 - pxor xmm5,xmm0 -db 102,15,56,220,209 - pxor xmm6,xmm0 - pxor xmm7,xmm0 -db 102,15,56,220,217 - movups xmm0,[32+ebp] - mov ecx,ebx -db 102,15,56,220,225 -db 102,15,56,220,233 -db 102,15,56,220,241 -db 102,15,56,220,249 - call L$_aesni_encrypt6_enter - movups xmm1,[esi] - movups xmm0,[16+esi] - xorps xmm2,xmm1 - movups xmm1,[32+esi] - xorps xmm3,xmm0 - movups [edi],xmm2 - movdqa xmm0,[16+esp] - xorps xmm4,xmm1 - movdqa xmm1,[64+esp] - movups [16+edi],xmm3 - movups [32+edi],xmm4 - paddd xmm1,xmm0 - paddd xmm0,[48+esp] - movdqa xmm2,[esp] - movups xmm3,[48+esi] - movups xmm4,[64+esi] - xorps xmm5,xmm3 - movups xmm3,[80+esi] - lea esi,[96+esi] - movdqa [48+esp],xmm0 -db 102,15,56,0,194 - xorps xmm6,xmm4 - movups [48+edi],xmm5 - xorps xmm7,xmm3 - movdqa [64+esp],xmm1 -db 102,15,56,0,202 - movups [64+edi],xmm6 - pshufd xmm2,xmm0,192 - movups [80+edi],xmm7 - lea edi,[96+edi] - pshufd xmm3,xmm0,128 - sub eax,6 - jnc NEAR L$008ctr32_loop6 - add eax,6 - jz NEAR L$009ctr32_ret - movdqu xmm7,[ebp] - mov edx,ebp - pxor xmm7,[32+esp] - mov ecx,DWORD [240+ebp] -L$007ctr32_tail: - por xmm2,xmm7 - cmp eax,2 - jb NEAR L$010ctr32_one - pshufd xmm4,xmm0,64 - por xmm3,xmm7 - je NEAR L$011ctr32_two - pshufd xmm5,xmm1,192 - por xmm4,xmm7 - cmp eax,4 - jb NEAR L$012ctr32_three - pshufd xmm6,xmm1,128 - por xmm5,xmm7 - je NEAR L$013ctr32_four - por xmm6,xmm7 - call __aesni_encrypt6 - movups xmm1,[esi] - movups xmm0,[16+esi] - xorps xmm2,xmm1 - movups xmm1,[32+esi] - xorps xmm3,xmm0 - movups xmm0,[48+esi] - xorps xmm4,xmm1 - movups xmm1,[64+esi] - xorps xmm5,xmm0 - movups [edi],xmm2 - xorps xmm6,xmm1 - movups [16+edi],xmm3 - movups [32+edi],xmm4 - movups [48+edi],xmm5 - movups [64+edi],xmm6 - jmp NEAR L$009ctr32_ret -align 16 -L$006ctr32_one_shortcut: - movups xmm2,[ebx] - mov ecx,DWORD [240+edx] -L$010ctr32_one: - movups xmm0,[edx] - movups xmm1,[16+edx] - lea edx,[32+edx] - xorps xmm2,xmm0 -L$014enc1_loop_2: -db 102,15,56,220,209 - dec ecx - movups xmm1,[edx] - lea edx,[16+edx] - jnz NEAR L$014enc1_loop_2 -db 102,15,56,221,209 - movups xmm6,[esi] - xorps xmm6,xmm2 - movups [edi],xmm6 - jmp NEAR L$009ctr32_ret -align 16 -L$011ctr32_two: - call __aesni_encrypt2 - movups xmm5,[esi] - movups xmm6,[16+esi] - xorps xmm2,xmm5 - xorps xmm3,xmm6 - movups [edi],xmm2 - movups [16+edi],xmm3 - jmp NEAR L$009ctr32_ret -align 16 -L$012ctr32_three: - call __aesni_encrypt3 - movups xmm5,[esi] - movups xmm6,[16+esi] - xorps xmm2,xmm5 - movups xmm7,[32+esi] - xorps xmm3,xmm6 - movups [edi],xmm2 - xorps xmm4,xmm7 - movups [16+edi],xmm3 - movups [32+edi],xmm4 - jmp NEAR L$009ctr32_ret -align 16 -L$013ctr32_four: - call __aesni_encrypt4 - movups xmm6,[esi] - movups xmm7,[16+esi] - movups xmm1,[32+esi] - xorps xmm2,xmm6 - movups xmm0,[48+esi] - xorps xmm3,xmm7 - movups [edi],xmm2 - xorps xmm4,xmm1 - movups [16+edi],xmm3 - xorps xmm5,xmm0 - movups [32+edi],xmm4 - movups [48+edi],xmm5 -L$009ctr32_ret: - pxor xmm0,xmm0 - pxor xmm1,xmm1 - pxor xmm2,xmm2 - pxor xmm3,xmm3 - pxor xmm4,xmm4 - movdqa [32+esp],xmm0 - pxor xmm5,xmm5 - movdqa [48+esp],xmm0 - pxor xmm6,xmm6 - movdqa [64+esp],xmm0 - pxor xmm7,xmm7 - mov esp,DWORD [80+esp] - pop edi - pop esi - pop ebx - pop ebp - ret -align 16 -__aesni_set_encrypt_key: - push ebp - push ebx - test eax,eax - jz NEAR L$015bad_pointer - test edx,edx - jz NEAR L$015bad_pointer - call L$016pic -L$016pic: - pop ebx - lea ebx,[(L$key_const-L$016pic)+ebx] - lea ebp,[_GFp_ia32cap_P] - movups xmm0,[eax] - xorps xmm4,xmm4 - mov ebp,DWORD [4+ebp] - lea edx,[16+edx] - and ebp,268437504 - cmp ecx,256 - je NEAR L$01714rounds - cmp ecx,128 - jne NEAR L$018bad_keybits -align 16 -L$01910rounds: - cmp ebp,268435456 - je NEAR L$02010rounds_alt - mov ecx,9 - movups [edx-16],xmm0 -db 102,15,58,223,200,1 - call L$021key_128_cold -db 102,15,58,223,200,2 - call L$022key_128 -db 102,15,58,223,200,4 - call L$022key_128 -db 102,15,58,223,200,8 - call L$022key_128 -db 102,15,58,223,200,16 - call L$022key_128 -db 102,15,58,223,200,32 - call L$022key_128 -db 102,15,58,223,200,64 - call L$022key_128 -db 102,15,58,223,200,128 - call L$022key_128 -db 102,15,58,223,200,27 - call L$022key_128 -db 102,15,58,223,200,54 - call L$022key_128 - movups [edx],xmm0 - mov DWORD [80+edx],ecx - jmp NEAR L$023good_key -align 16 -L$022key_128: - movups [edx],xmm0 - lea edx,[16+edx] -L$021key_128_cold: - shufps xmm4,xmm0,16 - xorps xmm0,xmm4 - shufps xmm4,xmm0,140 - xorps xmm0,xmm4 - shufps xmm1,xmm1,255 - xorps xmm0,xmm1 - ret -align 16 -L$02010rounds_alt: - movdqa xmm5,[ebx] - mov ecx,8 - movdqa xmm4,[32+ebx] - movdqa xmm2,xmm0 - movdqu [edx-16],xmm0 -L$024loop_key128: -db 102,15,56,0,197 -db 102,15,56,221,196 - pslld xmm4,1 - lea edx,[16+edx] - movdqa xmm3,xmm2 - pslldq xmm2,4 - pxor xmm3,xmm2 - pslldq xmm2,4 - pxor xmm3,xmm2 - pslldq xmm2,4 - pxor xmm2,xmm3 - pxor xmm0,xmm2 - movdqu [edx-16],xmm0 - movdqa xmm2,xmm0 - dec ecx - jnz NEAR L$024loop_key128 - movdqa xmm4,[48+ebx] -db 102,15,56,0,197 -db 102,15,56,221,196 - pslld xmm4,1 - movdqa xmm3,xmm2 - pslldq xmm2,4 - pxor xmm3,xmm2 - pslldq xmm2,4 - pxor xmm3,xmm2 - pslldq xmm2,4 - pxor xmm2,xmm3 - pxor xmm0,xmm2 - movdqu [edx],xmm0 - movdqa xmm2,xmm0 -db 102,15,56,0,197 -db 102,15,56,221,196 - movdqa xmm3,xmm2 - pslldq xmm2,4 - pxor xmm3,xmm2 - pslldq xmm2,4 - pxor xmm3,xmm2 - pslldq xmm2,4 - pxor xmm2,xmm3 - pxor xmm0,xmm2 - movdqu [16+edx],xmm0 - mov ecx,9 - mov DWORD [96+edx],ecx - jmp NEAR L$023good_key -align 16 -L$01714rounds: - movups xmm2,[16+eax] - lea edx,[16+edx] - cmp ebp,268435456 - je NEAR L$02514rounds_alt - mov ecx,13 - movups [edx-32],xmm0 - movups [edx-16],xmm2 -db 102,15,58,223,202,1 - call L$026key_256a_cold -db 102,15,58,223,200,1 - call L$027key_256b -db 102,15,58,223,202,2 - call L$028key_256a -db 102,15,58,223,200,2 - call L$027key_256b -db 102,15,58,223,202,4 - call L$028key_256a -db 102,15,58,223,200,4 - call L$027key_256b -db 102,15,58,223,202,8 - call L$028key_256a -db 102,15,58,223,200,8 - call L$027key_256b -db 102,15,58,223,202,16 - call L$028key_256a -db 102,15,58,223,200,16 - call L$027key_256b -db 102,15,58,223,202,32 - call L$028key_256a -db 102,15,58,223,200,32 - call L$027key_256b -db 102,15,58,223,202,64 - call L$028key_256a - movups [edx],xmm0 - mov DWORD [16+edx],ecx - xor eax,eax - jmp NEAR L$023good_key -align 16 -L$028key_256a: - movups [edx],xmm2 - lea edx,[16+edx] -L$026key_256a_cold: - shufps xmm4,xmm0,16 - xorps xmm0,xmm4 - shufps xmm4,xmm0,140 - xorps xmm0,xmm4 - shufps xmm1,xmm1,255 - xorps xmm0,xmm1 - ret -align 16 -L$027key_256b: - movups [edx],xmm0 - lea edx,[16+edx] - shufps xmm4,xmm2,16 - xorps xmm2,xmm4 - shufps xmm4,xmm2,140 - xorps xmm2,xmm4 - shufps xmm1,xmm1,170 - xorps xmm2,xmm1 - ret -align 16 -L$02514rounds_alt: - movdqa xmm5,[ebx] - movdqa xmm4,[32+ebx] - mov ecx,7 - movdqu [edx-32],xmm0 - movdqa xmm1,xmm2 - movdqu [edx-16],xmm2 -L$029loop_key256: -db 102,15,56,0,213 -db 102,15,56,221,212 - movdqa xmm3,xmm0 - pslldq xmm0,4 - pxor xmm3,xmm0 - pslldq xmm0,4 - pxor xmm3,xmm0 - pslldq xmm0,4 - pxor xmm0,xmm3 - pslld xmm4,1 - pxor xmm0,xmm2 - movdqu [edx],xmm0 - dec ecx - jz NEAR L$030done_key256 - pshufd xmm2,xmm0,255 - pxor xmm3,xmm3 -db 102,15,56,221,211 - movdqa xmm3,xmm1 - pslldq xmm1,4 - pxor xmm3,xmm1 - pslldq xmm1,4 - pxor xmm3,xmm1 - pslldq xmm1,4 - pxor xmm1,xmm3 - pxor xmm2,xmm1 - movdqu [16+edx],xmm2 - lea edx,[32+edx] - movdqa xmm1,xmm2 - jmp NEAR L$029loop_key256 -L$030done_key256: - mov ecx,13 - mov DWORD [16+edx],ecx -L$023good_key: - pxor xmm0,xmm0 - pxor xmm1,xmm1 - pxor xmm2,xmm2 - pxor xmm3,xmm3 - pxor xmm4,xmm4 - pxor xmm5,xmm5 - xor eax,eax - pop ebx - pop ebp - ret -align 4 -L$015bad_pointer: - mov eax,-1 - pop ebx - pop ebp - ret -align 4 -L$018bad_keybits: - pxor xmm0,xmm0 - mov eax,-2 - pop ebx - pop ebp - ret -global _GFp_aes_hw_set_encrypt_key -align 16 -_GFp_aes_hw_set_encrypt_key: -L$_GFp_aes_hw_set_encrypt_key_begin: - mov eax,DWORD [4+esp] - mov ecx,DWORD [8+esp] - mov edx,DWORD [12+esp] - call __aesni_set_encrypt_key - ret -align 64 -L$key_const: -dd 202313229,202313229,202313229,202313229 -dd 67569157,67569157,67569157,67569157 -dd 1,1,1,1 -dd 27,27,27,27 -db 65,69,83,32,102,111,114,32,73,110,116,101,108,32,65,69 -db 83,45,78,73,44,32,67,82,89,80,84,79,71,65,77,83 -db 32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115 -db 115,108,46,111,114,103,62,0 -segment .bss -common _GFp_ia32cap_P 16 diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/tmp/chacha20_poly1305_x86_64-nasm.asm temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/tmp/chacha20_poly1305_x86_64-nasm.asm --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/tmp/chacha20_poly1305_x86_64-nasm.asm 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/tmp/chacha20_poly1305_x86_64-nasm.asm 1970-01-01 00:00:00.000000000 +0000 @@ -1,8941 +0,0 @@ -; This file is generated from a similarly-named Perl script in the BoringSSL -; source tree. Do not edit by hand. - -default rel -%define XMMWORD -%define YMMWORD -%define ZMMWORD -section .text code align=64 - -EXTERN GFp_ia32cap_P - -chacha20_poly1305_constants: - -ALIGN 64 -$L$chacha20_consts: -DB 'e','x','p','a','n','d',' ','3','2','-','b','y','t','e',' ','k' -DB 'e','x','p','a','n','d',' ','3','2','-','b','y','t','e',' ','k' -$L$rol8: -DB 3,0,1,2,7,4,5,6,11,8,9,10,15,12,13,14 -DB 3,0,1,2,7,4,5,6,11,8,9,10,15,12,13,14 -$L$rol16: -DB 2,3,0,1,6,7,4,5,10,11,8,9,14,15,12,13 -DB 2,3,0,1,6,7,4,5,10,11,8,9,14,15,12,13 -$L$avx2_init: - DD 0,0,0,0 -$L$sse_inc: - DD 1,0,0,0 -$L$avx2_inc: - DD 2,0,0,0,2,0,0,0 -$L$clamp: - DQ 0x0FFFFFFC0FFFFFFF,0x0FFFFFFC0FFFFFFC - DQ 0xFFFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFFFF -ALIGN 16 -$L$and_masks: -DB 0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 -DB 0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 -DB 0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 -DB 0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 -DB 0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 -DB 0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 -DB 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 -DB 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 -DB 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00 -DB 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00 -DB 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00 -DB 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00 -DB 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00 -DB 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00 -DB 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00 -DB 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff - - -ALIGN 64 -poly_hash_ad_internal: - - - xor r10,r10 - xor r11,r11 - xor r12,r12 - cmp r8,13 - jne NEAR $L$hash_ad_loop -$L$poly_fast_tls_ad: - - mov r10,QWORD[rcx] - mov r11,QWORD[5+rcx] - shr r11,24 - mov r12,1 - mov rax,QWORD[((0+160+0))+rbp] - mov r15,rax - mul r10 - mov r13,rax - mov r14,rdx - mov rax,QWORD[((0+160+0))+rbp] - mul r11 - imul r15,r12 - add r14,rax - adc r15,rdx - mov rax,QWORD[((8+160+0))+rbp] - mov r9,rax - mul r10 - add r14,rax - adc rdx,0 - mov r10,rdx - mov rax,QWORD[((8+160+0))+rbp] - mul r11 - add r15,rax - adc rdx,0 - imul r9,r12 - add r15,r10 - adc r9,rdx - mov r10,r13 - mov r11,r14 - mov r12,r15 - and r12,3 - mov r13,r15 - and r13,-4 - mov r14,r9 - shrd r15,r9,2 - shr r9,2 - add r15,r13 - adc r9,r14 - add r10,r15 - adc r11,r9 - adc r12,0 - - DB 0F3h,0C3h ;repret -$L$hash_ad_loop: - - cmp r8,16 - jb NEAR $L$hash_ad_tail - add r10,QWORD[((0+0))+rcx] - adc r11,QWORD[((8+0))+rcx] - adc r12,1 - mov rax,QWORD[((0+160+0))+rbp] - mov r15,rax - mul r10 - mov r13,rax - mov r14,rdx - mov rax,QWORD[((0+160+0))+rbp] - mul r11 - imul r15,r12 - add r14,rax - adc r15,rdx - mov rax,QWORD[((8+160+0))+rbp] - mov r9,rax - mul r10 - add r14,rax - adc rdx,0 - mov r10,rdx - mov rax,QWORD[((8+160+0))+rbp] - mul r11 - add r15,rax - adc rdx,0 - imul r9,r12 - add r15,r10 - adc r9,rdx - mov r10,r13 - mov r11,r14 - mov r12,r15 - and r12,3 - mov r13,r15 - and r13,-4 - mov r14,r9 - shrd r15,r9,2 - shr r9,2 - add r15,r13 - adc r9,r14 - add r10,r15 - adc r11,r9 - adc r12,0 - - lea rcx,[16+rcx] - sub r8,16 - jmp NEAR $L$hash_ad_loop -$L$hash_ad_tail: - cmp r8,0 - je NEAR $L$hash_ad_done - - xor r13,r13 - xor r14,r14 - xor r15,r15 - add rcx,r8 -$L$hash_ad_tail_loop: - shld r14,r13,8 - shl r13,8 - movzx r15,BYTE[((-1))+rcx] - xor r13,r15 - dec rcx - dec r8 - jne NEAR $L$hash_ad_tail_loop - - add r10,r13 - adc r11,r14 - adc r12,1 - mov rax,QWORD[((0+160+0))+rbp] - mov r15,rax - mul r10 - mov r13,rax - mov r14,rdx - mov rax,QWORD[((0+160+0))+rbp] - mul r11 - imul r15,r12 - add r14,rax - adc r15,rdx - mov rax,QWORD[((8+160+0))+rbp] - mov r9,rax - mul r10 - add r14,rax - adc rdx,0 - mov r10,rdx - mov rax,QWORD[((8+160+0))+rbp] - mul r11 - add r15,rax - adc rdx,0 - imul r9,r12 - add r15,r10 - adc r9,rdx - mov r10,r13 - mov r11,r14 - mov r12,r15 - and r12,3 - mov r13,r15 - and r13,-4 - mov r14,r9 - shrd r15,r9,2 - shr r9,2 - add r15,r13 - adc r9,r14 - add r10,r15 - adc r11,r9 - adc r12,0 - - -$L$hash_ad_done: - DB 0F3h,0C3h ;repret - - - -global GFp_chacha20_poly1305_open - -ALIGN 64 -GFp_chacha20_poly1305_open: - mov QWORD[8+rsp],rdi ;WIN64 prologue - mov QWORD[16+rsp],rsi - mov rax,rsp -$L$SEH_begin_GFp_chacha20_poly1305_open: - mov rdi,rcx - mov rsi,rdx - mov rdx,r8 - mov rcx,r9 - mov r8,QWORD[40+rsp] - mov r9,QWORD[48+rsp] - - - - push rbp - - push rbx - - push r12 - - push r13 - - push r14 - - push r15 - - - - push r9 - - sub rsp,288 + 160 + 32 - - - lea rbp,[32+rsp] - and rbp,-32 - - movaps XMMWORD[(0+0)+rbp],xmm6 - movaps XMMWORD[(16+0)+rbp],xmm7 - movaps XMMWORD[(32+0)+rbp],xmm8 - movaps XMMWORD[(48+0)+rbp],xmm9 - movaps XMMWORD[(64+0)+rbp],xmm10 - movaps XMMWORD[(80+0)+rbp],xmm11 - movaps XMMWORD[(96+0)+rbp],xmm12 - movaps XMMWORD[(112+0)+rbp],xmm13 - movaps XMMWORD[(128+0)+rbp],xmm14 - movaps XMMWORD[(144+0)+rbp],xmm15 - - mov rbx,rdx - mov QWORD[((0+160+32))+rbp],r8 - mov QWORD[((8+160+32))+rbp],rbx - - mov eax,DWORD[((GFp_ia32cap_P+8))] - and eax,288 - xor eax,288 - jz NEAR chacha20_poly1305_open_avx2 - - cmp rbx,128 - jbe NEAR $L$open_sse_128 - - movdqa xmm0,XMMWORD[$L$chacha20_consts] - movdqu xmm4,XMMWORD[r9] - movdqu xmm8,XMMWORD[16+r9] - movdqu xmm12,XMMWORD[32+r9] - - movdqa xmm7,xmm12 - - movdqa XMMWORD[(160+48)+rbp],xmm4 - movdqa XMMWORD[(160+64)+rbp],xmm8 - movdqa XMMWORD[(160+96)+rbp],xmm12 - mov r10,10 -$L$open_sse_init_rounds: - paddd xmm0,xmm4 - pxor xmm12,xmm0 - pshufb xmm12,XMMWORD[$L$rol16] - paddd xmm8,xmm12 - pxor xmm4,xmm8 - movdqa xmm3,xmm4 - pslld xmm3,12 - psrld xmm4,20 - pxor xmm4,xmm3 - paddd xmm0,xmm4 - pxor xmm12,xmm0 - pshufb xmm12,XMMWORD[$L$rol8] - paddd xmm8,xmm12 - pxor xmm4,xmm8 - movdqa xmm3,xmm4 - pslld xmm3,7 - psrld xmm4,25 - pxor xmm4,xmm3 -DB 102,15,58,15,228,4 -DB 102,69,15,58,15,192,8 -DB 102,69,15,58,15,228,12 - paddd xmm0,xmm4 - pxor xmm12,xmm0 - pshufb xmm12,XMMWORD[$L$rol16] - paddd xmm8,xmm12 - pxor xmm4,xmm8 - movdqa xmm3,xmm4 - pslld xmm3,12 - psrld xmm4,20 - pxor xmm4,xmm3 - paddd xmm0,xmm4 - pxor xmm12,xmm0 - pshufb xmm12,XMMWORD[$L$rol8] - paddd xmm8,xmm12 - pxor xmm4,xmm8 - movdqa xmm3,xmm4 - pslld xmm3,7 - psrld xmm4,25 - pxor xmm4,xmm3 -DB 102,15,58,15,228,12 -DB 102,69,15,58,15,192,8 -DB 102,69,15,58,15,228,4 - - dec r10 - jne NEAR $L$open_sse_init_rounds - - paddd xmm0,XMMWORD[$L$chacha20_consts] - paddd xmm4,XMMWORD[((160+48))+rbp] - - pand xmm0,XMMWORD[$L$clamp] - movdqa XMMWORD[(160+0)+rbp],xmm0 - movdqa XMMWORD[(160+16)+rbp],xmm4 - - mov r8,r8 - call poly_hash_ad_internal -$L$open_sse_main_loop: - cmp rbx,16*16 - jb NEAR $L$open_sse_tail - - movdqa xmm0,XMMWORD[$L$chacha20_consts] - movdqa xmm4,XMMWORD[((160+48))+rbp] - movdqa xmm8,XMMWORD[((160+64))+rbp] - movdqa xmm1,xmm0 - movdqa xmm5,xmm4 - movdqa xmm9,xmm8 - movdqa xmm2,xmm0 - movdqa xmm6,xmm4 - movdqa xmm10,xmm8 - movdqa xmm3,xmm0 - movdqa xmm7,xmm4 - movdqa xmm11,xmm8 - movdqa xmm15,XMMWORD[((160+96))+rbp] - paddd xmm15,XMMWORD[$L$sse_inc] - movdqa xmm14,xmm15 - paddd xmm14,XMMWORD[$L$sse_inc] - movdqa xmm13,xmm14 - paddd xmm13,XMMWORD[$L$sse_inc] - movdqa xmm12,xmm13 - paddd xmm12,XMMWORD[$L$sse_inc] - movdqa XMMWORD[(160+96)+rbp],xmm12 - movdqa XMMWORD[(160+112)+rbp],xmm13 - movdqa XMMWORD[(160+128)+rbp],xmm14 - movdqa XMMWORD[(160+144)+rbp],xmm15 - - - - mov rcx,4 - mov r8,rsi -$L$open_sse_main_loop_rounds: - movdqa XMMWORD[(160+80)+rbp],xmm8 - movdqa xmm8,XMMWORD[$L$rol16] - paddd xmm3,xmm7 - paddd xmm2,xmm6 - paddd xmm1,xmm5 - paddd xmm0,xmm4 - pxor xmm15,xmm3 - pxor xmm14,xmm2 - pxor xmm13,xmm1 - pxor xmm12,xmm0 -DB 102,69,15,56,0,248 -DB 102,69,15,56,0,240 -DB 102,69,15,56,0,232 -DB 102,69,15,56,0,224 - movdqa xmm8,XMMWORD[((160+80))+rbp] - paddd xmm11,xmm15 - paddd xmm10,xmm14 - paddd xmm9,xmm13 - paddd xmm8,xmm12 - pxor xmm7,xmm11 - add r10,QWORD[((0+0))+r8] - adc r11,QWORD[((8+0))+r8] - adc r12,1 - - lea r8,[16+r8] - pxor xmm6,xmm10 - pxor xmm5,xmm9 - pxor xmm4,xmm8 - movdqa XMMWORD[(160+80)+rbp],xmm8 - movdqa xmm8,xmm7 - psrld xmm8,20 - pslld xmm7,32-20 - pxor xmm7,xmm8 - movdqa xmm8,xmm6 - psrld xmm8,20 - pslld xmm6,32-20 - pxor xmm6,xmm8 - movdqa xmm8,xmm5 - psrld xmm8,20 - pslld xmm5,32-20 - pxor xmm5,xmm8 - movdqa xmm8,xmm4 - psrld xmm8,20 - pslld xmm4,32-20 - pxor xmm4,xmm8 - mov rax,QWORD[((0+160+0))+rbp] - mov r15,rax - mul r10 - mov r13,rax - mov r14,rdx - mov rax,QWORD[((0+160+0))+rbp] - mul r11 - imul r15,r12 - add r14,rax - adc r15,rdx - movdqa xmm8,XMMWORD[$L$rol8] - paddd xmm3,xmm7 - paddd xmm2,xmm6 - paddd xmm1,xmm5 - paddd xmm0,xmm4 - pxor xmm15,xmm3 - pxor xmm14,xmm2 - pxor xmm13,xmm1 - pxor xmm12,xmm0 -DB 102,69,15,56,0,248 -DB 102,69,15,56,0,240 -DB 102,69,15,56,0,232 -DB 102,69,15,56,0,224 - movdqa xmm8,XMMWORD[((160+80))+rbp] - paddd xmm11,xmm15 - paddd xmm10,xmm14 - paddd xmm9,xmm13 - paddd xmm8,xmm12 - pxor xmm7,xmm11 - pxor xmm6,xmm10 - mov rax,QWORD[((8+160+0))+rbp] - mov r9,rax - mul r10 - add r14,rax - adc rdx,0 - mov r10,rdx - mov rax,QWORD[((8+160+0))+rbp] - mul r11 - add r15,rax - adc rdx,0 - pxor xmm5,xmm9 - pxor xmm4,xmm8 - movdqa XMMWORD[(160+80)+rbp],xmm8 - movdqa xmm8,xmm7 - psrld xmm8,25 - pslld xmm7,32-25 - pxor xmm7,xmm8 - movdqa xmm8,xmm6 - psrld xmm8,25 - pslld xmm6,32-25 - pxor xmm6,xmm8 - movdqa xmm8,xmm5 - psrld xmm8,25 - pslld xmm5,32-25 - pxor xmm5,xmm8 - movdqa xmm8,xmm4 - psrld xmm8,25 - pslld xmm4,32-25 - pxor xmm4,xmm8 - movdqa xmm8,XMMWORD[((160+80))+rbp] - imul r9,r12 - add r15,r10 - adc r9,rdx -DB 102,15,58,15,255,4 -DB 102,69,15,58,15,219,8 -DB 102,69,15,58,15,255,12 -DB 102,15,58,15,246,4 -DB 102,69,15,58,15,210,8 -DB 102,69,15,58,15,246,12 -DB 102,15,58,15,237,4 -DB 102,69,15,58,15,201,8 -DB 102,69,15,58,15,237,12 -DB 102,15,58,15,228,4 -DB 102,69,15,58,15,192,8 -DB 102,69,15,58,15,228,12 - movdqa XMMWORD[(160+80)+rbp],xmm8 - movdqa xmm8,XMMWORD[$L$rol16] - paddd xmm3,xmm7 - paddd xmm2,xmm6 - paddd xmm1,xmm5 - paddd xmm0,xmm4 - pxor xmm15,xmm3 - pxor xmm14,xmm2 - mov r10,r13 - mov r11,r14 - mov r12,r15 - and r12,3 - mov r13,r15 - and r13,-4 - mov r14,r9 - shrd r15,r9,2 - shr r9,2 - add r15,r13 - adc r9,r14 - add r10,r15 - adc r11,r9 - adc r12,0 - pxor xmm13,xmm1 - pxor xmm12,xmm0 -DB 102,69,15,56,0,248 -DB 102,69,15,56,0,240 -DB 102,69,15,56,0,232 -DB 102,69,15,56,0,224 - movdqa xmm8,XMMWORD[((160+80))+rbp] - paddd xmm11,xmm15 - paddd xmm10,xmm14 - paddd xmm9,xmm13 - paddd xmm8,xmm12 - pxor xmm7,xmm11 - pxor xmm6,xmm10 - pxor xmm5,xmm9 - pxor xmm4,xmm8 - movdqa XMMWORD[(160+80)+rbp],xmm8 - movdqa xmm8,xmm7 - psrld xmm8,20 - pslld xmm7,32-20 - pxor xmm7,xmm8 - movdqa xmm8,xmm6 - psrld xmm8,20 - pslld xmm6,32-20 - pxor xmm6,xmm8 - movdqa xmm8,xmm5 - psrld xmm8,20 - pslld xmm5,32-20 - pxor xmm5,xmm8 - movdqa xmm8,xmm4 - psrld xmm8,20 - pslld xmm4,32-20 - pxor xmm4,xmm8 - movdqa xmm8,XMMWORD[$L$rol8] - paddd xmm3,xmm7 - paddd xmm2,xmm6 - paddd xmm1,xmm5 - paddd xmm0,xmm4 - pxor xmm15,xmm3 - pxor xmm14,xmm2 - pxor xmm13,xmm1 - pxor xmm12,xmm0 -DB 102,69,15,56,0,248 -DB 102,69,15,56,0,240 -DB 102,69,15,56,0,232 -DB 102,69,15,56,0,224 - movdqa xmm8,XMMWORD[((160+80))+rbp] - paddd xmm11,xmm15 - paddd xmm10,xmm14 - paddd xmm9,xmm13 - paddd xmm8,xmm12 - pxor xmm7,xmm11 - pxor xmm6,xmm10 - pxor xmm5,xmm9 - pxor xmm4,xmm8 - movdqa XMMWORD[(160+80)+rbp],xmm8 - movdqa xmm8,xmm7 - psrld xmm8,25 - pslld xmm7,32-25 - pxor xmm7,xmm8 - movdqa xmm8,xmm6 - psrld xmm8,25 - pslld xmm6,32-25 - pxor xmm6,xmm8 - movdqa xmm8,xmm5 - psrld xmm8,25 - pslld xmm5,32-25 - pxor xmm5,xmm8 - movdqa xmm8,xmm4 - psrld xmm8,25 - pslld xmm4,32-25 - pxor xmm4,xmm8 - movdqa xmm8,XMMWORD[((160+80))+rbp] -DB 102,15,58,15,255,12 -DB 102,69,15,58,15,219,8 -DB 102,69,15,58,15,255,4 -DB 102,15,58,15,246,12 -DB 102,69,15,58,15,210,8 -DB 102,69,15,58,15,246,4 -DB 102,15,58,15,237,12 -DB 102,69,15,58,15,201,8 -DB 102,69,15,58,15,237,4 -DB 102,15,58,15,228,12 -DB 102,69,15,58,15,192,8 -DB 102,69,15,58,15,228,4 - - dec rcx - jge NEAR $L$open_sse_main_loop_rounds - add r10,QWORD[((0+0))+r8] - adc r11,QWORD[((8+0))+r8] - adc r12,1 - mov rax,QWORD[((0+160+0))+rbp] - mov r15,rax - mul r10 - mov r13,rax - mov r14,rdx - mov rax,QWORD[((0+160+0))+rbp] - mul r11 - imul r15,r12 - add r14,rax - adc r15,rdx - mov rax,QWORD[((8+160+0))+rbp] - mov r9,rax - mul r10 - add r14,rax - adc rdx,0 - mov r10,rdx - mov rax,QWORD[((8+160+0))+rbp] - mul r11 - add r15,rax - adc rdx,0 - imul r9,r12 - add r15,r10 - adc r9,rdx - mov r10,r13 - mov r11,r14 - mov r12,r15 - and r12,3 - mov r13,r15 - and r13,-4 - mov r14,r9 - shrd r15,r9,2 - shr r9,2 - add r15,r13 - adc r9,r14 - add r10,r15 - adc r11,r9 - adc r12,0 - - lea r8,[16+r8] - cmp rcx,-6 - jg NEAR $L$open_sse_main_loop_rounds - paddd xmm3,XMMWORD[$L$chacha20_consts] - paddd xmm7,XMMWORD[((160+48))+rbp] - paddd xmm11,XMMWORD[((160+64))+rbp] - paddd xmm15,XMMWORD[((160+144))+rbp] - paddd xmm2,XMMWORD[$L$chacha20_consts] - paddd xmm6,XMMWORD[((160+48))+rbp] - paddd xmm10,XMMWORD[((160+64))+rbp] - paddd xmm14,XMMWORD[((160+128))+rbp] - paddd xmm1,XMMWORD[$L$chacha20_consts] - paddd xmm5,XMMWORD[((160+48))+rbp] - paddd xmm9,XMMWORD[((160+64))+rbp] - paddd xmm13,XMMWORD[((160+112))+rbp] - paddd xmm0,XMMWORD[$L$chacha20_consts] - paddd xmm4,XMMWORD[((160+48))+rbp] - paddd xmm8,XMMWORD[((160+64))+rbp] - paddd xmm12,XMMWORD[((160+96))+rbp] - movdqa XMMWORD[(160+80)+rbp],xmm12 - movdqu xmm12,XMMWORD[((0 + 0))+rsi] - pxor xmm12,xmm3 - movdqu XMMWORD[(0 + 0)+rdi],xmm12 - movdqu xmm12,XMMWORD[((16 + 0))+rsi] - pxor xmm12,xmm7 - movdqu XMMWORD[(16 + 0)+rdi],xmm12 - movdqu xmm12,XMMWORD[((32 + 0))+rsi] - pxor xmm12,xmm11 - movdqu XMMWORD[(32 + 0)+rdi],xmm12 - movdqu xmm12,XMMWORD[((48 + 0))+rsi] - pxor xmm12,xmm15 - movdqu XMMWORD[(48 + 0)+rdi],xmm12 - movdqu xmm3,XMMWORD[((0 + 64))+rsi] - movdqu xmm7,XMMWORD[((16 + 64))+rsi] - movdqu xmm11,XMMWORD[((32 + 64))+rsi] - movdqu xmm15,XMMWORD[((48 + 64))+rsi] - pxor xmm2,xmm3 - pxor xmm6,xmm7 - pxor xmm10,xmm11 - pxor xmm15,xmm14 - movdqu XMMWORD[(0 + 64)+rdi],xmm2 - movdqu XMMWORD[(16 + 64)+rdi],xmm6 - movdqu XMMWORD[(32 + 64)+rdi],xmm10 - movdqu XMMWORD[(48 + 64)+rdi],xmm15 - movdqu xmm3,XMMWORD[((0 + 128))+rsi] - movdqu xmm7,XMMWORD[((16 + 128))+rsi] - movdqu xmm11,XMMWORD[((32 + 128))+rsi] - movdqu xmm15,XMMWORD[((48 + 128))+rsi] - pxor xmm1,xmm3 - pxor xmm5,xmm7 - pxor xmm9,xmm11 - pxor xmm15,xmm13 - movdqu XMMWORD[(0 + 128)+rdi],xmm1 - movdqu XMMWORD[(16 + 128)+rdi],xmm5 - movdqu XMMWORD[(32 + 128)+rdi],xmm9 - movdqu XMMWORD[(48 + 128)+rdi],xmm15 - movdqu xmm3,XMMWORD[((0 + 192))+rsi] - movdqu xmm7,XMMWORD[((16 + 192))+rsi] - movdqu xmm11,XMMWORD[((32 + 192))+rsi] - movdqu xmm15,XMMWORD[((48 + 192))+rsi] - pxor xmm0,xmm3 - pxor xmm4,xmm7 - pxor xmm8,xmm11 - pxor xmm15,XMMWORD[((160+80))+rbp] - movdqu XMMWORD[(0 + 192)+rdi],xmm0 - movdqu XMMWORD[(16 + 192)+rdi],xmm4 - movdqu XMMWORD[(32 + 192)+rdi],xmm8 - movdqu XMMWORD[(48 + 192)+rdi],xmm15 - - lea rsi,[256+rsi] - lea rdi,[256+rdi] - sub rbx,16*16 - jmp NEAR $L$open_sse_main_loop -$L$open_sse_tail: - - test rbx,rbx - jz NEAR $L$open_sse_finalize - cmp rbx,12*16 - ja NEAR $L$open_sse_tail_256 - cmp rbx,8*16 - ja NEAR $L$open_sse_tail_192 - cmp rbx,4*16 - ja NEAR $L$open_sse_tail_128 - movdqa xmm0,XMMWORD[$L$chacha20_consts] - movdqa xmm4,XMMWORD[((160+48))+rbp] - movdqa xmm8,XMMWORD[((160+64))+rbp] - movdqa xmm12,XMMWORD[((160+96))+rbp] - paddd xmm12,XMMWORD[$L$sse_inc] - movdqa XMMWORD[(160+96)+rbp],xmm12 - - xor r8,r8 - mov rcx,rbx - cmp rcx,16 - jb NEAR $L$open_sse_tail_64_rounds -$L$open_sse_tail_64_rounds_and_x1hash: - add r10,QWORD[((0+0))+r8*1+rsi] - adc r11,QWORD[((8+0))+r8*1+rsi] - adc r12,1 - mov rax,QWORD[((0+160+0))+rbp] - mov r15,rax - mul r10 - mov r13,rax - mov r14,rdx - mov rax,QWORD[((0+160+0))+rbp] - mul r11 - imul r15,r12 - add r14,rax - adc r15,rdx - mov rax,QWORD[((8+160+0))+rbp] - mov r9,rax - mul r10 - add r14,rax - adc rdx,0 - mov r10,rdx - mov rax,QWORD[((8+160+0))+rbp] - mul r11 - add r15,rax - adc rdx,0 - imul r9,r12 - add r15,r10 - adc r9,rdx - mov r10,r13 - mov r11,r14 - mov r12,r15 - and r12,3 - mov r13,r15 - and r13,-4 - mov r14,r9 - shrd r15,r9,2 - shr r9,2 - add r15,r13 - adc r9,r14 - add r10,r15 - adc r11,r9 - adc r12,0 - - sub rcx,16 -$L$open_sse_tail_64_rounds: - add r8,16 - paddd xmm0,xmm4 - pxor xmm12,xmm0 - pshufb xmm12,XMMWORD[$L$rol16] - paddd xmm8,xmm12 - pxor xmm4,xmm8 - movdqa xmm3,xmm4 - pslld xmm3,12 - psrld xmm4,20 - pxor xmm4,xmm3 - paddd xmm0,xmm4 - pxor xmm12,xmm0 - pshufb xmm12,XMMWORD[$L$rol8] - paddd xmm8,xmm12 - pxor xmm4,xmm8 - movdqa xmm3,xmm4 - pslld xmm3,7 - psrld xmm4,25 - pxor xmm4,xmm3 -DB 102,15,58,15,228,4 -DB 102,69,15,58,15,192,8 -DB 102,69,15,58,15,228,12 - paddd xmm0,xmm4 - pxor xmm12,xmm0 - pshufb xmm12,XMMWORD[$L$rol16] - paddd xmm8,xmm12 - pxor xmm4,xmm8 - movdqa xmm3,xmm4 - pslld xmm3,12 - psrld xmm4,20 - pxor xmm4,xmm3 - paddd xmm0,xmm4 - pxor xmm12,xmm0 - pshufb xmm12,XMMWORD[$L$rol8] - paddd xmm8,xmm12 - pxor xmm4,xmm8 - movdqa xmm3,xmm4 - pslld xmm3,7 - psrld xmm4,25 - pxor xmm4,xmm3 -DB 102,15,58,15,228,12 -DB 102,69,15,58,15,192,8 -DB 102,69,15,58,15,228,4 - - cmp rcx,16 - jae NEAR $L$open_sse_tail_64_rounds_and_x1hash - cmp r8,10*16 - jne NEAR $L$open_sse_tail_64_rounds - paddd xmm0,XMMWORD[$L$chacha20_consts] - paddd xmm4,XMMWORD[((160+48))+rbp] - paddd xmm8,XMMWORD[((160+64))+rbp] - paddd xmm12,XMMWORD[((160+96))+rbp] - - jmp NEAR $L$open_sse_tail_64_dec_loop - -$L$open_sse_tail_128: - movdqa xmm0,XMMWORD[$L$chacha20_consts] - movdqa xmm4,XMMWORD[((160+48))+rbp] - movdqa xmm8,XMMWORD[((160+64))+rbp] - movdqa xmm1,xmm0 - movdqa xmm5,xmm4 - movdqa xmm9,xmm8 - movdqa xmm13,XMMWORD[((160+96))+rbp] - paddd xmm13,XMMWORD[$L$sse_inc] - movdqa xmm12,xmm13 - paddd xmm12,XMMWORD[$L$sse_inc] - movdqa XMMWORD[(160+96)+rbp],xmm12 - movdqa XMMWORD[(160+112)+rbp],xmm13 - - mov rcx,rbx - and rcx,-16 - xor r8,r8 -$L$open_sse_tail_128_rounds_and_x1hash: - add r10,QWORD[((0+0))+r8*1+rsi] - adc r11,QWORD[((8+0))+r8*1+rsi] - adc r12,1 - mov rax,QWORD[((0+160+0))+rbp] - mov r15,rax - mul r10 - mov r13,rax - mov r14,rdx - mov rax,QWORD[((0+160+0))+rbp] - mul r11 - imul r15,r12 - add r14,rax - adc r15,rdx - mov rax,QWORD[((8+160+0))+rbp] - mov r9,rax - mul r10 - add r14,rax - adc rdx,0 - mov r10,rdx - mov rax,QWORD[((8+160+0))+rbp] - mul r11 - add r15,rax - adc rdx,0 - imul r9,r12 - add r15,r10 - adc r9,rdx - mov r10,r13 - mov r11,r14 - mov r12,r15 - and r12,3 - mov r13,r15 - and r13,-4 - mov r14,r9 - shrd r15,r9,2 - shr r9,2 - add r15,r13 - adc r9,r14 - add r10,r15 - adc r11,r9 - adc r12,0 - -$L$open_sse_tail_128_rounds: - add r8,16 - paddd xmm0,xmm4 - pxor xmm12,xmm0 - pshufb xmm12,XMMWORD[$L$rol16] - paddd xmm8,xmm12 - pxor xmm4,xmm8 - movdqa xmm3,xmm4 - pslld xmm3,12 - psrld xmm4,20 - pxor xmm4,xmm3 - paddd xmm0,xmm4 - pxor xmm12,xmm0 - pshufb xmm12,XMMWORD[$L$rol8] - paddd xmm8,xmm12 - pxor xmm4,xmm8 - movdqa xmm3,xmm4 - pslld xmm3,7 - psrld xmm4,25 - pxor xmm4,xmm3 -DB 102,15,58,15,228,4 -DB 102,69,15,58,15,192,8 -DB 102,69,15,58,15,228,12 - paddd xmm1,xmm5 - pxor xmm13,xmm1 - pshufb xmm13,XMMWORD[$L$rol16] - paddd xmm9,xmm13 - pxor xmm5,xmm9 - movdqa xmm3,xmm5 - pslld xmm3,12 - psrld xmm5,20 - pxor xmm5,xmm3 - paddd xmm1,xmm5 - pxor xmm13,xmm1 - pshufb xmm13,XMMWORD[$L$rol8] - paddd xmm9,xmm13 - pxor xmm5,xmm9 - movdqa xmm3,xmm5 - pslld xmm3,7 - psrld xmm5,25 - pxor xmm5,xmm3 -DB 102,15,58,15,237,4 -DB 102,69,15,58,15,201,8 -DB 102,69,15,58,15,237,12 - paddd xmm0,xmm4 - pxor xmm12,xmm0 - pshufb xmm12,XMMWORD[$L$rol16] - paddd xmm8,xmm12 - pxor xmm4,xmm8 - movdqa xmm3,xmm4 - pslld xmm3,12 - psrld xmm4,20 - pxor xmm4,xmm3 - paddd xmm0,xmm4 - pxor xmm12,xmm0 - pshufb xmm12,XMMWORD[$L$rol8] - paddd xmm8,xmm12 - pxor xmm4,xmm8 - movdqa xmm3,xmm4 - pslld xmm3,7 - psrld xmm4,25 - pxor xmm4,xmm3 -DB 102,15,58,15,228,12 -DB 102,69,15,58,15,192,8 -DB 102,69,15,58,15,228,4 - paddd xmm1,xmm5 - pxor xmm13,xmm1 - pshufb xmm13,XMMWORD[$L$rol16] - paddd xmm9,xmm13 - pxor xmm5,xmm9 - movdqa xmm3,xmm5 - pslld xmm3,12 - psrld xmm5,20 - pxor xmm5,xmm3 - paddd xmm1,xmm5 - pxor xmm13,xmm1 - pshufb xmm13,XMMWORD[$L$rol8] - paddd xmm9,xmm13 - pxor xmm5,xmm9 - movdqa xmm3,xmm5 - pslld xmm3,7 - psrld xmm5,25 - pxor xmm5,xmm3 -DB 102,15,58,15,237,12 -DB 102,69,15,58,15,201,8 -DB 102,69,15,58,15,237,4 - - cmp r8,rcx - jb NEAR $L$open_sse_tail_128_rounds_and_x1hash - cmp r8,10*16 - jne NEAR $L$open_sse_tail_128_rounds - paddd xmm1,XMMWORD[$L$chacha20_consts] - paddd xmm5,XMMWORD[((160+48))+rbp] - paddd xmm9,XMMWORD[((160+64))+rbp] - paddd xmm13,XMMWORD[((160+112))+rbp] - paddd xmm0,XMMWORD[$L$chacha20_consts] - paddd xmm4,XMMWORD[((160+48))+rbp] - paddd xmm8,XMMWORD[((160+64))+rbp] - paddd xmm12,XMMWORD[((160+96))+rbp] - movdqu xmm3,XMMWORD[((0 + 0))+rsi] - movdqu xmm7,XMMWORD[((16 + 0))+rsi] - movdqu xmm11,XMMWORD[((32 + 0))+rsi] - movdqu xmm15,XMMWORD[((48 + 0))+rsi] - pxor xmm1,xmm3 - pxor xmm5,xmm7 - pxor xmm9,xmm11 - pxor xmm15,xmm13 - movdqu XMMWORD[(0 + 0)+rdi],xmm1 - movdqu XMMWORD[(16 + 0)+rdi],xmm5 - movdqu XMMWORD[(32 + 0)+rdi],xmm9 - movdqu XMMWORD[(48 + 0)+rdi],xmm15 - - sub rbx,4*16 - lea rsi,[64+rsi] - lea rdi,[64+rdi] - jmp NEAR $L$open_sse_tail_64_dec_loop - -$L$open_sse_tail_192: - movdqa xmm0,XMMWORD[$L$chacha20_consts] - movdqa xmm4,XMMWORD[((160+48))+rbp] - movdqa xmm8,XMMWORD[((160+64))+rbp] - movdqa xmm1,xmm0 - movdqa xmm5,xmm4 - movdqa xmm9,xmm8 - movdqa xmm2,xmm0 - movdqa xmm6,xmm4 - movdqa xmm10,xmm8 - movdqa xmm14,XMMWORD[((160+96))+rbp] - paddd xmm14,XMMWORD[$L$sse_inc] - movdqa xmm13,xmm14 - paddd xmm13,XMMWORD[$L$sse_inc] - movdqa xmm12,xmm13 - paddd xmm12,XMMWORD[$L$sse_inc] - movdqa XMMWORD[(160+96)+rbp],xmm12 - movdqa XMMWORD[(160+112)+rbp],xmm13 - movdqa XMMWORD[(160+128)+rbp],xmm14 - - mov rcx,rbx - mov r8,10*16 - cmp rcx,10*16 - cmovg rcx,r8 - and rcx,-16 - xor r8,r8 -$L$open_sse_tail_192_rounds_and_x1hash: - add r10,QWORD[((0+0))+r8*1+rsi] - adc r11,QWORD[((8+0))+r8*1+rsi] - adc r12,1 - mov rax,QWORD[((0+160+0))+rbp] - mov r15,rax - mul r10 - mov r13,rax - mov r14,rdx - mov rax,QWORD[((0+160+0))+rbp] - mul r11 - imul r15,r12 - add r14,rax - adc r15,rdx - mov rax,QWORD[((8+160+0))+rbp] - mov r9,rax - mul r10 - add r14,rax - adc rdx,0 - mov r10,rdx - mov rax,QWORD[((8+160+0))+rbp] - mul r11 - add r15,rax - adc rdx,0 - imul r9,r12 - add r15,r10 - adc r9,rdx - mov r10,r13 - mov r11,r14 - mov r12,r15 - and r12,3 - mov r13,r15 - and r13,-4 - mov r14,r9 - shrd r15,r9,2 - shr r9,2 - add r15,r13 - adc r9,r14 - add r10,r15 - adc r11,r9 - adc r12,0 - -$L$open_sse_tail_192_rounds: - add r8,16 - paddd xmm0,xmm4 - pxor xmm12,xmm0 - pshufb xmm12,XMMWORD[$L$rol16] - paddd xmm8,xmm12 - pxor xmm4,xmm8 - movdqa xmm3,xmm4 - pslld xmm3,12 - psrld xmm4,20 - pxor xmm4,xmm3 - paddd xmm0,xmm4 - pxor xmm12,xmm0 - pshufb xmm12,XMMWORD[$L$rol8] - paddd xmm8,xmm12 - pxor xmm4,xmm8 - movdqa xmm3,xmm4 - pslld xmm3,7 - psrld xmm4,25 - pxor xmm4,xmm3 -DB 102,15,58,15,228,4 -DB 102,69,15,58,15,192,8 -DB 102,69,15,58,15,228,12 - paddd xmm1,xmm5 - pxor xmm13,xmm1 - pshufb xmm13,XMMWORD[$L$rol16] - paddd xmm9,xmm13 - pxor xmm5,xmm9 - movdqa xmm3,xmm5 - pslld xmm3,12 - psrld xmm5,20 - pxor xmm5,xmm3 - paddd xmm1,xmm5 - pxor xmm13,xmm1 - pshufb xmm13,XMMWORD[$L$rol8] - paddd xmm9,xmm13 - pxor xmm5,xmm9 - movdqa xmm3,xmm5 - pslld xmm3,7 - psrld xmm5,25 - pxor xmm5,xmm3 -DB 102,15,58,15,237,4 -DB 102,69,15,58,15,201,8 -DB 102,69,15,58,15,237,12 - paddd xmm2,xmm6 - pxor xmm14,xmm2 - pshufb xmm14,XMMWORD[$L$rol16] - paddd xmm10,xmm14 - pxor xmm6,xmm10 - movdqa xmm3,xmm6 - pslld xmm3,12 - psrld xmm6,20 - pxor xmm6,xmm3 - paddd xmm2,xmm6 - pxor xmm14,xmm2 - pshufb xmm14,XMMWORD[$L$rol8] - paddd xmm10,xmm14 - pxor xmm6,xmm10 - movdqa xmm3,xmm6 - pslld xmm3,7 - psrld xmm6,25 - pxor xmm6,xmm3 -DB 102,15,58,15,246,4 -DB 102,69,15,58,15,210,8 -DB 102,69,15,58,15,246,12 - paddd xmm0,xmm4 - pxor xmm12,xmm0 - pshufb xmm12,XMMWORD[$L$rol16] - paddd xmm8,xmm12 - pxor xmm4,xmm8 - movdqa xmm3,xmm4 - pslld xmm3,12 - psrld xmm4,20 - pxor xmm4,xmm3 - paddd xmm0,xmm4 - pxor xmm12,xmm0 - pshufb xmm12,XMMWORD[$L$rol8] - paddd xmm8,xmm12 - pxor xmm4,xmm8 - movdqa xmm3,xmm4 - pslld xmm3,7 - psrld xmm4,25 - pxor xmm4,xmm3 -DB 102,15,58,15,228,12 -DB 102,69,15,58,15,192,8 -DB 102,69,15,58,15,228,4 - paddd xmm1,xmm5 - pxor xmm13,xmm1 - pshufb xmm13,XMMWORD[$L$rol16] - paddd xmm9,xmm13 - pxor xmm5,xmm9 - movdqa xmm3,xmm5 - pslld xmm3,12 - psrld xmm5,20 - pxor xmm5,xmm3 - paddd xmm1,xmm5 - pxor xmm13,xmm1 - pshufb xmm13,XMMWORD[$L$rol8] - paddd xmm9,xmm13 - pxor xmm5,xmm9 - movdqa xmm3,xmm5 - pslld xmm3,7 - psrld xmm5,25 - pxor xmm5,xmm3 -DB 102,15,58,15,237,12 -DB 102,69,15,58,15,201,8 -DB 102,69,15,58,15,237,4 - paddd xmm2,xmm6 - pxor xmm14,xmm2 - pshufb xmm14,XMMWORD[$L$rol16] - paddd xmm10,xmm14 - pxor xmm6,xmm10 - movdqa xmm3,xmm6 - pslld xmm3,12 - psrld xmm6,20 - pxor xmm6,xmm3 - paddd xmm2,xmm6 - pxor xmm14,xmm2 - pshufb xmm14,XMMWORD[$L$rol8] - paddd xmm10,xmm14 - pxor xmm6,xmm10 - movdqa xmm3,xmm6 - pslld xmm3,7 - psrld xmm6,25 - pxor xmm6,xmm3 -DB 102,15,58,15,246,12 -DB 102,69,15,58,15,210,8 -DB 102,69,15,58,15,246,4 - - cmp r8,rcx - jb NEAR $L$open_sse_tail_192_rounds_and_x1hash - cmp r8,10*16 - jne NEAR $L$open_sse_tail_192_rounds - cmp rbx,11*16 - jb NEAR $L$open_sse_tail_192_finish - add r10,QWORD[((0+160))+rsi] - adc r11,QWORD[((8+160))+rsi] - adc r12,1 - mov rax,QWORD[((0+160+0))+rbp] - mov r15,rax - mul r10 - mov r13,rax - mov r14,rdx - mov rax,QWORD[((0+160+0))+rbp] - mul r11 - imul r15,r12 - add r14,rax - adc r15,rdx - mov rax,QWORD[((8+160+0))+rbp] - mov r9,rax - mul r10 - add r14,rax - adc rdx,0 - mov r10,rdx - mov rax,QWORD[((8+160+0))+rbp] - mul r11 - add r15,rax - adc rdx,0 - imul r9,r12 - add r15,r10 - adc r9,rdx - mov r10,r13 - mov r11,r14 - mov r12,r15 - and r12,3 - mov r13,r15 - and r13,-4 - mov r14,r9 - shrd r15,r9,2 - shr r9,2 - add r15,r13 - adc r9,r14 - add r10,r15 - adc r11,r9 - adc r12,0 - - cmp rbx,12*16 - jb NEAR $L$open_sse_tail_192_finish - add r10,QWORD[((0+176))+rsi] - adc r11,QWORD[((8+176))+rsi] - adc r12,1 - mov rax,QWORD[((0+160+0))+rbp] - mov r15,rax - mul r10 - mov r13,rax - mov r14,rdx - mov rax,QWORD[((0+160+0))+rbp] - mul r11 - imul r15,r12 - add r14,rax - adc r15,rdx - mov rax,QWORD[((8+160+0))+rbp] - mov r9,rax - mul r10 - add r14,rax - adc rdx,0 - mov r10,rdx - mov rax,QWORD[((8+160+0))+rbp] - mul r11 - add r15,rax - adc rdx,0 - imul r9,r12 - add r15,r10 - adc r9,rdx - mov r10,r13 - mov r11,r14 - mov r12,r15 - and r12,3 - mov r13,r15 - and r13,-4 - mov r14,r9 - shrd r15,r9,2 - shr r9,2 - add r15,r13 - adc r9,r14 - add r10,r15 - adc r11,r9 - adc r12,0 - -$L$open_sse_tail_192_finish: - paddd xmm2,XMMWORD[$L$chacha20_consts] - paddd xmm6,XMMWORD[((160+48))+rbp] - paddd xmm10,XMMWORD[((160+64))+rbp] - paddd xmm14,XMMWORD[((160+128))+rbp] - paddd xmm1,XMMWORD[$L$chacha20_consts] - paddd xmm5,XMMWORD[((160+48))+rbp] - paddd xmm9,XMMWORD[((160+64))+rbp] - paddd xmm13,XMMWORD[((160+112))+rbp] - paddd xmm0,XMMWORD[$L$chacha20_consts] - paddd xmm4,XMMWORD[((160+48))+rbp] - paddd xmm8,XMMWORD[((160+64))+rbp] - paddd xmm12,XMMWORD[((160+96))+rbp] - movdqu xmm3,XMMWORD[((0 + 0))+rsi] - movdqu xmm7,XMMWORD[((16 + 0))+rsi] - movdqu xmm11,XMMWORD[((32 + 0))+rsi] - movdqu xmm15,XMMWORD[((48 + 0))+rsi] - pxor xmm2,xmm3 - pxor xmm6,xmm7 - pxor xmm10,xmm11 - pxor xmm15,xmm14 - movdqu XMMWORD[(0 + 0)+rdi],xmm2 - movdqu XMMWORD[(16 + 0)+rdi],xmm6 - movdqu XMMWORD[(32 + 0)+rdi],xmm10 - movdqu XMMWORD[(48 + 0)+rdi],xmm15 - movdqu xmm3,XMMWORD[((0 + 64))+rsi] - movdqu xmm7,XMMWORD[((16 + 64))+rsi] - movdqu xmm11,XMMWORD[((32 + 64))+rsi] - movdqu xmm15,XMMWORD[((48 + 64))+rsi] - pxor xmm1,xmm3 - pxor xmm5,xmm7 - pxor xmm9,xmm11 - pxor xmm15,xmm13 - movdqu XMMWORD[(0 + 64)+rdi],xmm1 - movdqu XMMWORD[(16 + 64)+rdi],xmm5 - movdqu XMMWORD[(32 + 64)+rdi],xmm9 - movdqu XMMWORD[(48 + 64)+rdi],xmm15 - - sub rbx,8*16 - lea rsi,[128+rsi] - lea rdi,[128+rdi] - jmp NEAR $L$open_sse_tail_64_dec_loop - -$L$open_sse_tail_256: - movdqa xmm0,XMMWORD[$L$chacha20_consts] - movdqa xmm4,XMMWORD[((160+48))+rbp] - movdqa xmm8,XMMWORD[((160+64))+rbp] - movdqa xmm1,xmm0 - movdqa xmm5,xmm4 - movdqa xmm9,xmm8 - movdqa xmm2,xmm0 - movdqa xmm6,xmm4 - movdqa xmm10,xmm8 - movdqa xmm3,xmm0 - movdqa xmm7,xmm4 - movdqa xmm11,xmm8 - movdqa xmm15,XMMWORD[((160+96))+rbp] - paddd xmm15,XMMWORD[$L$sse_inc] - movdqa xmm14,xmm15 - paddd xmm14,XMMWORD[$L$sse_inc] - movdqa xmm13,xmm14 - paddd xmm13,XMMWORD[$L$sse_inc] - movdqa xmm12,xmm13 - paddd xmm12,XMMWORD[$L$sse_inc] - movdqa XMMWORD[(160+96)+rbp],xmm12 - movdqa XMMWORD[(160+112)+rbp],xmm13 - movdqa XMMWORD[(160+128)+rbp],xmm14 - movdqa XMMWORD[(160+144)+rbp],xmm15 - - xor r8,r8 -$L$open_sse_tail_256_rounds_and_x1hash: - add r10,QWORD[((0+0))+r8*1+rsi] - adc r11,QWORD[((8+0))+r8*1+rsi] - adc r12,1 - movdqa XMMWORD[(160+80)+rbp],xmm11 - paddd xmm0,xmm4 - pxor xmm12,xmm0 - pshufb xmm12,XMMWORD[$L$rol16] - paddd xmm8,xmm12 - pxor xmm4,xmm8 - movdqa xmm11,xmm4 - pslld xmm11,12 - psrld xmm4,20 - pxor xmm4,xmm11 - paddd xmm0,xmm4 - pxor xmm12,xmm0 - pshufb xmm12,XMMWORD[$L$rol8] - paddd xmm8,xmm12 - pxor xmm4,xmm8 - movdqa xmm11,xmm4 - pslld xmm11,7 - psrld xmm4,25 - pxor xmm4,xmm11 -DB 102,15,58,15,228,4 -DB 102,69,15,58,15,192,8 -DB 102,69,15,58,15,228,12 - paddd xmm1,xmm5 - pxor xmm13,xmm1 - pshufb xmm13,XMMWORD[$L$rol16] - paddd xmm9,xmm13 - pxor xmm5,xmm9 - movdqa xmm11,xmm5 - pslld xmm11,12 - psrld xmm5,20 - pxor xmm5,xmm11 - paddd xmm1,xmm5 - pxor xmm13,xmm1 - pshufb xmm13,XMMWORD[$L$rol8] - paddd xmm9,xmm13 - pxor xmm5,xmm9 - movdqa xmm11,xmm5 - pslld xmm11,7 - psrld xmm5,25 - pxor xmm5,xmm11 -DB 102,15,58,15,237,4 -DB 102,69,15,58,15,201,8 -DB 102,69,15,58,15,237,12 - paddd xmm2,xmm6 - pxor xmm14,xmm2 - pshufb xmm14,XMMWORD[$L$rol16] - paddd xmm10,xmm14 - pxor xmm6,xmm10 - movdqa xmm11,xmm6 - pslld xmm11,12 - psrld xmm6,20 - pxor xmm6,xmm11 - paddd xmm2,xmm6 - pxor xmm14,xmm2 - pshufb xmm14,XMMWORD[$L$rol8] - paddd xmm10,xmm14 - pxor xmm6,xmm10 - movdqa xmm11,xmm6 - pslld xmm11,7 - psrld xmm6,25 - pxor xmm6,xmm11 -DB 102,15,58,15,246,4 -DB 102,69,15,58,15,210,8 -DB 102,69,15,58,15,246,12 - movdqa xmm11,XMMWORD[((160+80))+rbp] - mov rax,QWORD[((0+160+0))+rbp] - mov r15,rax - mul r10 - mov r13,rax - mov r14,rdx - mov rax,QWORD[((0+160+0))+rbp] - mul r11 - imul r15,r12 - add r14,rax - adc r15,rdx - movdqa XMMWORD[(160+80)+rbp],xmm9 - paddd xmm3,xmm7 - pxor xmm15,xmm3 - pshufb xmm15,XMMWORD[$L$rol16] - paddd xmm11,xmm15 - pxor xmm7,xmm11 - movdqa xmm9,xmm7 - pslld xmm9,12 - psrld xmm7,20 - pxor xmm7,xmm9 - paddd xmm3,xmm7 - pxor xmm15,xmm3 - pshufb xmm15,XMMWORD[$L$rol8] - paddd xmm11,xmm15 - pxor xmm7,xmm11 - movdqa xmm9,xmm7 - pslld xmm9,7 - psrld xmm7,25 - pxor xmm7,xmm9 -DB 102,15,58,15,255,4 -DB 102,69,15,58,15,219,8 -DB 102,69,15,58,15,255,12 - movdqa xmm9,XMMWORD[((160+80))+rbp] - mov rax,QWORD[((8+160+0))+rbp] - mov r9,rax - mul r10 - add r14,rax - adc rdx,0 - mov r10,rdx - mov rax,QWORD[((8+160+0))+rbp] - mul r11 - add r15,rax - adc rdx,0 - movdqa XMMWORD[(160+80)+rbp],xmm11 - paddd xmm0,xmm4 - pxor xmm12,xmm0 - pshufb xmm12,XMMWORD[$L$rol16] - paddd xmm8,xmm12 - pxor xmm4,xmm8 - movdqa xmm11,xmm4 - pslld xmm11,12 - psrld xmm4,20 - pxor xmm4,xmm11 - paddd xmm0,xmm4 - pxor xmm12,xmm0 - pshufb xmm12,XMMWORD[$L$rol8] - paddd xmm8,xmm12 - pxor xmm4,xmm8 - movdqa xmm11,xmm4 - pslld xmm11,7 - psrld xmm4,25 - pxor xmm4,xmm11 -DB 102,15,58,15,228,12 -DB 102,69,15,58,15,192,8 -DB 102,69,15,58,15,228,4 - paddd xmm1,xmm5 - pxor xmm13,xmm1 - pshufb xmm13,XMMWORD[$L$rol16] - paddd xmm9,xmm13 - pxor xmm5,xmm9 - movdqa xmm11,xmm5 - pslld xmm11,12 - psrld xmm5,20 - pxor xmm5,xmm11 - paddd xmm1,xmm5 - pxor xmm13,xmm1 - pshufb xmm13,XMMWORD[$L$rol8] - paddd xmm9,xmm13 - pxor xmm5,xmm9 - movdqa xmm11,xmm5 - pslld xmm11,7 - psrld xmm5,25 - pxor xmm5,xmm11 -DB 102,15,58,15,237,12 -DB 102,69,15,58,15,201,8 -DB 102,69,15,58,15,237,4 - imul r9,r12 - add r15,r10 - adc r9,rdx - paddd xmm2,xmm6 - pxor xmm14,xmm2 - pshufb xmm14,XMMWORD[$L$rol16] - paddd xmm10,xmm14 - pxor xmm6,xmm10 - movdqa xmm11,xmm6 - pslld xmm11,12 - psrld xmm6,20 - pxor xmm6,xmm11 - paddd xmm2,xmm6 - pxor xmm14,xmm2 - pshufb xmm14,XMMWORD[$L$rol8] - paddd xmm10,xmm14 - pxor xmm6,xmm10 - movdqa xmm11,xmm6 - pslld xmm11,7 - psrld xmm6,25 - pxor xmm6,xmm11 -DB 102,15,58,15,246,12 -DB 102,69,15,58,15,210,8 -DB 102,69,15,58,15,246,4 - movdqa xmm11,XMMWORD[((160+80))+rbp] - mov r10,r13 - mov r11,r14 - mov r12,r15 - and r12,3 - mov r13,r15 - and r13,-4 - mov r14,r9 - shrd r15,r9,2 - shr r9,2 - add r15,r13 - adc r9,r14 - add r10,r15 - adc r11,r9 - adc r12,0 - movdqa XMMWORD[(160+80)+rbp],xmm9 - paddd xmm3,xmm7 - pxor xmm15,xmm3 - pshufb xmm15,XMMWORD[$L$rol16] - paddd xmm11,xmm15 - pxor xmm7,xmm11 - movdqa xmm9,xmm7 - pslld xmm9,12 - psrld xmm7,20 - pxor xmm7,xmm9 - paddd xmm3,xmm7 - pxor xmm15,xmm3 - pshufb xmm15,XMMWORD[$L$rol8] - paddd xmm11,xmm15 - pxor xmm7,xmm11 - movdqa xmm9,xmm7 - pslld xmm9,7 - psrld xmm7,25 - pxor xmm7,xmm9 -DB 102,15,58,15,255,12 -DB 102,69,15,58,15,219,8 -DB 102,69,15,58,15,255,4 - movdqa xmm9,XMMWORD[((160+80))+rbp] - - add r8,16 - cmp r8,10*16 - jb NEAR $L$open_sse_tail_256_rounds_and_x1hash - - mov rcx,rbx - and rcx,-16 -$L$open_sse_tail_256_hash: - add r10,QWORD[((0+0))+r8*1+rsi] - adc r11,QWORD[((8+0))+r8*1+rsi] - adc r12,1 - mov rax,QWORD[((0+160+0))+rbp] - mov r15,rax - mul r10 - mov r13,rax - mov r14,rdx - mov rax,QWORD[((0+160+0))+rbp] - mul r11 - imul r15,r12 - add r14,rax - adc r15,rdx - mov rax,QWORD[((8+160+0))+rbp] - mov r9,rax - mul r10 - add r14,rax - adc rdx,0 - mov r10,rdx - mov rax,QWORD[((8+160+0))+rbp] - mul r11 - add r15,rax - adc rdx,0 - imul r9,r12 - add r15,r10 - adc r9,rdx - mov r10,r13 - mov r11,r14 - mov r12,r15 - and r12,3 - mov r13,r15 - and r13,-4 - mov r14,r9 - shrd r15,r9,2 - shr r9,2 - add r15,r13 - adc r9,r14 - add r10,r15 - adc r11,r9 - adc r12,0 - - add r8,16 - cmp r8,rcx - jb NEAR $L$open_sse_tail_256_hash - paddd xmm3,XMMWORD[$L$chacha20_consts] - paddd xmm7,XMMWORD[((160+48))+rbp] - paddd xmm11,XMMWORD[((160+64))+rbp] - paddd xmm15,XMMWORD[((160+144))+rbp] - paddd xmm2,XMMWORD[$L$chacha20_consts] - paddd xmm6,XMMWORD[((160+48))+rbp] - paddd xmm10,XMMWORD[((160+64))+rbp] - paddd xmm14,XMMWORD[((160+128))+rbp] - paddd xmm1,XMMWORD[$L$chacha20_consts] - paddd xmm5,XMMWORD[((160+48))+rbp] - paddd xmm9,XMMWORD[((160+64))+rbp] - paddd xmm13,XMMWORD[((160+112))+rbp] - paddd xmm0,XMMWORD[$L$chacha20_consts] - paddd xmm4,XMMWORD[((160+48))+rbp] - paddd xmm8,XMMWORD[((160+64))+rbp] - paddd xmm12,XMMWORD[((160+96))+rbp] - movdqa XMMWORD[(160+80)+rbp],xmm12 - movdqu xmm12,XMMWORD[((0 + 0))+rsi] - pxor xmm12,xmm3 - movdqu XMMWORD[(0 + 0)+rdi],xmm12 - movdqu xmm12,XMMWORD[((16 + 0))+rsi] - pxor xmm12,xmm7 - movdqu XMMWORD[(16 + 0)+rdi],xmm12 - movdqu xmm12,XMMWORD[((32 + 0))+rsi] - pxor xmm12,xmm11 - movdqu XMMWORD[(32 + 0)+rdi],xmm12 - movdqu xmm12,XMMWORD[((48 + 0))+rsi] - pxor xmm12,xmm15 - movdqu XMMWORD[(48 + 0)+rdi],xmm12 - movdqu xmm3,XMMWORD[((0 + 64))+rsi] - movdqu xmm7,XMMWORD[((16 + 64))+rsi] - movdqu xmm11,XMMWORD[((32 + 64))+rsi] - movdqu xmm15,XMMWORD[((48 + 64))+rsi] - pxor xmm2,xmm3 - pxor xmm6,xmm7 - pxor xmm10,xmm11 - pxor xmm15,xmm14 - movdqu XMMWORD[(0 + 64)+rdi],xmm2 - movdqu XMMWORD[(16 + 64)+rdi],xmm6 - movdqu XMMWORD[(32 + 64)+rdi],xmm10 - movdqu XMMWORD[(48 + 64)+rdi],xmm15 - movdqu xmm3,XMMWORD[((0 + 128))+rsi] - movdqu xmm7,XMMWORD[((16 + 128))+rsi] - movdqu xmm11,XMMWORD[((32 + 128))+rsi] - movdqu xmm15,XMMWORD[((48 + 128))+rsi] - pxor xmm1,xmm3 - pxor xmm5,xmm7 - pxor xmm9,xmm11 - pxor xmm15,xmm13 - movdqu XMMWORD[(0 + 128)+rdi],xmm1 - movdqu XMMWORD[(16 + 128)+rdi],xmm5 - movdqu XMMWORD[(32 + 128)+rdi],xmm9 - movdqu XMMWORD[(48 + 128)+rdi],xmm15 - - movdqa xmm12,XMMWORD[((160+80))+rbp] - sub rbx,12*16 - lea rsi,[192+rsi] - lea rdi,[192+rdi] - - -$L$open_sse_tail_64_dec_loop: - cmp rbx,16 - jb NEAR $L$open_sse_tail_16_init - sub rbx,16 - movdqu xmm3,XMMWORD[rsi] - pxor xmm0,xmm3 - movdqu XMMWORD[rdi],xmm0 - lea rsi,[16+rsi] - lea rdi,[16+rdi] - movdqa xmm0,xmm4 - movdqa xmm4,xmm8 - movdqa xmm8,xmm12 - jmp NEAR $L$open_sse_tail_64_dec_loop -$L$open_sse_tail_16_init: - movdqa xmm1,xmm0 - - -$L$open_sse_tail_16: - test rbx,rbx - jz NEAR $L$open_sse_finalize - - - - pxor xmm3,xmm3 - lea rsi,[((-1))+rbx*1+rsi] - mov r8,rbx -$L$open_sse_tail_16_compose: - pslldq xmm3,1 - pinsrb xmm3,BYTE[rsi],0 - sub rsi,1 - sub r8,1 - jnz NEAR $L$open_sse_tail_16_compose - -DB 102,73,15,126,221 - pextrq r14,xmm3,1 - - pxor xmm3,xmm1 - - -$L$open_sse_tail_16_extract: - pextrb XMMWORD[rdi],xmm3,0 - psrldq xmm3,1 - add rdi,1 - sub rbx,1 - jne NEAR $L$open_sse_tail_16_extract - - add r10,r13 - adc r11,r14 - adc r12,1 - mov rax,QWORD[((0+160+0))+rbp] - mov r15,rax - mul r10 - mov r13,rax - mov r14,rdx - mov rax,QWORD[((0+160+0))+rbp] - mul r11 - imul r15,r12 - add r14,rax - adc r15,rdx - mov rax,QWORD[((8+160+0))+rbp] - mov r9,rax - mul r10 - add r14,rax - adc rdx,0 - mov r10,rdx - mov rax,QWORD[((8+160+0))+rbp] - mul r11 - add r15,rax - adc rdx,0 - imul r9,r12 - add r15,r10 - adc r9,rdx - mov r10,r13 - mov r11,r14 - mov r12,r15 - and r12,3 - mov r13,r15 - and r13,-4 - mov r14,r9 - shrd r15,r9,2 - shr r9,2 - add r15,r13 - adc r9,r14 - add r10,r15 - adc r11,r9 - adc r12,0 - - -$L$open_sse_finalize: - add r10,QWORD[((0+160+32))+rbp] - adc r11,QWORD[((8+160+32))+rbp] - adc r12,1 - mov rax,QWORD[((0+160+0))+rbp] - mov r15,rax - mul r10 - mov r13,rax - mov r14,rdx - mov rax,QWORD[((0+160+0))+rbp] - mul r11 - imul r15,r12 - add r14,rax - adc r15,rdx - mov rax,QWORD[((8+160+0))+rbp] - mov r9,rax - mul r10 - add r14,rax - adc rdx,0 - mov r10,rdx - mov rax,QWORD[((8+160+0))+rbp] - mul r11 - add r15,rax - adc rdx,0 - imul r9,r12 - add r15,r10 - adc r9,rdx - mov r10,r13 - mov r11,r14 - mov r12,r15 - and r12,3 - mov r13,r15 - and r13,-4 - mov r14,r9 - shrd r15,r9,2 - shr r9,2 - add r15,r13 - adc r9,r14 - add r10,r15 - adc r11,r9 - adc r12,0 - - - mov r13,r10 - mov r14,r11 - mov r15,r12 - sub r10,-5 - sbb r11,-1 - sbb r12,3 - cmovc r10,r13 - cmovc r11,r14 - cmovc r12,r15 - - add r10,QWORD[((0+160+16))+rbp] - adc r11,QWORD[((8+160+16))+rbp] - - movaps xmm6,XMMWORD[((0+0))+rbp] - movaps xmm7,XMMWORD[((16+0))+rbp] - movaps xmm8,XMMWORD[((32+0))+rbp] - movaps xmm9,XMMWORD[((48+0))+rbp] - movaps xmm10,XMMWORD[((64+0))+rbp] - movaps xmm11,XMMWORD[((80+0))+rbp] - movaps xmm12,XMMWORD[((96+0))+rbp] - movaps xmm13,XMMWORD[((112+0))+rbp] - movaps xmm14,XMMWORD[((128+0))+rbp] - movaps xmm15,XMMWORD[((144+0))+rbp] - - - add rsp,288 + 160 + 32 - - - pop r9 - - mov QWORD[r9],r10 - mov QWORD[8+r9],r11 - pop r15 - - pop r14 - - pop r13 - - pop r12 - - pop rbx - - pop rbp - - mov rdi,QWORD[8+rsp] ;WIN64 epilogue - mov rsi,QWORD[16+rsp] - DB 0F3h,0C3h ;repret - -$L$open_sse_128: - - movdqu xmm0,XMMWORD[$L$chacha20_consts] - movdqa xmm1,xmm0 - movdqa xmm2,xmm0 - movdqu xmm4,XMMWORD[r9] - movdqa xmm5,xmm4 - movdqa xmm6,xmm4 - movdqu xmm8,XMMWORD[16+r9] - movdqa xmm9,xmm8 - movdqa xmm10,xmm8 - movdqu xmm12,XMMWORD[32+r9] - movdqa xmm13,xmm12 - paddd xmm13,XMMWORD[$L$sse_inc] - movdqa xmm14,xmm13 - paddd xmm14,XMMWORD[$L$sse_inc] - movdqa xmm7,xmm4 - movdqa xmm11,xmm8 - movdqa xmm15,xmm13 - mov r10,10 - -$L$open_sse_128_rounds: - paddd xmm0,xmm4 - pxor xmm12,xmm0 - pshufb xmm12,XMMWORD[$L$rol16] - paddd xmm8,xmm12 - pxor xmm4,xmm8 - movdqa xmm3,xmm4 - pslld xmm3,12 - psrld xmm4,20 - pxor xmm4,xmm3 - paddd xmm0,xmm4 - pxor xmm12,xmm0 - pshufb xmm12,XMMWORD[$L$rol8] - paddd xmm8,xmm12 - pxor xmm4,xmm8 - movdqa xmm3,xmm4 - pslld xmm3,7 - psrld xmm4,25 - pxor xmm4,xmm3 -DB 102,15,58,15,228,4 -DB 102,69,15,58,15,192,8 -DB 102,69,15,58,15,228,12 - paddd xmm1,xmm5 - pxor xmm13,xmm1 - pshufb xmm13,XMMWORD[$L$rol16] - paddd xmm9,xmm13 - pxor xmm5,xmm9 - movdqa xmm3,xmm5 - pslld xmm3,12 - psrld xmm5,20 - pxor xmm5,xmm3 - paddd xmm1,xmm5 - pxor xmm13,xmm1 - pshufb xmm13,XMMWORD[$L$rol8] - paddd xmm9,xmm13 - pxor xmm5,xmm9 - movdqa xmm3,xmm5 - pslld xmm3,7 - psrld xmm5,25 - pxor xmm5,xmm3 -DB 102,15,58,15,237,4 -DB 102,69,15,58,15,201,8 -DB 102,69,15,58,15,237,12 - paddd xmm2,xmm6 - pxor xmm14,xmm2 - pshufb xmm14,XMMWORD[$L$rol16] - paddd xmm10,xmm14 - pxor xmm6,xmm10 - movdqa xmm3,xmm6 - pslld xmm3,12 - psrld xmm6,20 - pxor xmm6,xmm3 - paddd xmm2,xmm6 - pxor xmm14,xmm2 - pshufb xmm14,XMMWORD[$L$rol8] - paddd xmm10,xmm14 - pxor xmm6,xmm10 - movdqa xmm3,xmm6 - pslld xmm3,7 - psrld xmm6,25 - pxor xmm6,xmm3 -DB 102,15,58,15,246,4 -DB 102,69,15,58,15,210,8 -DB 102,69,15,58,15,246,12 - paddd xmm0,xmm4 - pxor xmm12,xmm0 - pshufb xmm12,XMMWORD[$L$rol16] - paddd xmm8,xmm12 - pxor xmm4,xmm8 - movdqa xmm3,xmm4 - pslld xmm3,12 - psrld xmm4,20 - pxor xmm4,xmm3 - paddd xmm0,xmm4 - pxor xmm12,xmm0 - pshufb xmm12,XMMWORD[$L$rol8] - paddd xmm8,xmm12 - pxor xmm4,xmm8 - movdqa xmm3,xmm4 - pslld xmm3,7 - psrld xmm4,25 - pxor xmm4,xmm3 -DB 102,15,58,15,228,12 -DB 102,69,15,58,15,192,8 -DB 102,69,15,58,15,228,4 - paddd xmm1,xmm5 - pxor xmm13,xmm1 - pshufb xmm13,XMMWORD[$L$rol16] - paddd xmm9,xmm13 - pxor xmm5,xmm9 - movdqa xmm3,xmm5 - pslld xmm3,12 - psrld xmm5,20 - pxor xmm5,xmm3 - paddd xmm1,xmm5 - pxor xmm13,xmm1 - pshufb xmm13,XMMWORD[$L$rol8] - paddd xmm9,xmm13 - pxor xmm5,xmm9 - movdqa xmm3,xmm5 - pslld xmm3,7 - psrld xmm5,25 - pxor xmm5,xmm3 -DB 102,15,58,15,237,12 -DB 102,69,15,58,15,201,8 -DB 102,69,15,58,15,237,4 - paddd xmm2,xmm6 - pxor xmm14,xmm2 - pshufb xmm14,XMMWORD[$L$rol16] - paddd xmm10,xmm14 - pxor xmm6,xmm10 - movdqa xmm3,xmm6 - pslld xmm3,12 - psrld xmm6,20 - pxor xmm6,xmm3 - paddd xmm2,xmm6 - pxor xmm14,xmm2 - pshufb xmm14,XMMWORD[$L$rol8] - paddd xmm10,xmm14 - pxor xmm6,xmm10 - movdqa xmm3,xmm6 - pslld xmm3,7 - psrld xmm6,25 - pxor xmm6,xmm3 -DB 102,15,58,15,246,12 -DB 102,69,15,58,15,210,8 -DB 102,69,15,58,15,246,4 - - dec r10 - jnz NEAR $L$open_sse_128_rounds - paddd xmm0,XMMWORD[$L$chacha20_consts] - paddd xmm1,XMMWORD[$L$chacha20_consts] - paddd xmm2,XMMWORD[$L$chacha20_consts] - paddd xmm4,xmm7 - paddd xmm5,xmm7 - paddd xmm6,xmm7 - paddd xmm9,xmm11 - paddd xmm10,xmm11 - paddd xmm13,xmm15 - paddd xmm15,XMMWORD[$L$sse_inc] - paddd xmm14,xmm15 - - pand xmm0,XMMWORD[$L$clamp] - movdqa XMMWORD[(160+0)+rbp],xmm0 - movdqa XMMWORD[(160+16)+rbp],xmm4 - - mov r8,r8 - call poly_hash_ad_internal -$L$open_sse_128_xor_hash: - cmp rbx,16 - jb NEAR $L$open_sse_tail_16 - sub rbx,16 - add r10,QWORD[((0+0))+rsi] - adc r11,QWORD[((8+0))+rsi] - adc r12,1 - - - movdqu xmm3,XMMWORD[rsi] - pxor xmm1,xmm3 - movdqu XMMWORD[rdi],xmm1 - lea rsi,[16+rsi] - lea rdi,[16+rdi] - mov rax,QWORD[((0+160+0))+rbp] - mov r15,rax - mul r10 - mov r13,rax - mov r14,rdx - mov rax,QWORD[((0+160+0))+rbp] - mul r11 - imul r15,r12 - add r14,rax - adc r15,rdx - mov rax,QWORD[((8+160+0))+rbp] - mov r9,rax - mul r10 - add r14,rax - adc rdx,0 - mov r10,rdx - mov rax,QWORD[((8+160+0))+rbp] - mul r11 - add r15,rax - adc rdx,0 - imul r9,r12 - add r15,r10 - adc r9,rdx - mov r10,r13 - mov r11,r14 - mov r12,r15 - and r12,3 - mov r13,r15 - and r13,-4 - mov r14,r9 - shrd r15,r9,2 - shr r9,2 - add r15,r13 - adc r9,r14 - add r10,r15 - adc r11,r9 - adc r12,0 - - - movdqa xmm1,xmm5 - movdqa xmm5,xmm9 - movdqa xmm9,xmm13 - movdqa xmm13,xmm2 - movdqa xmm2,xmm6 - movdqa xmm6,xmm10 - movdqa xmm10,xmm14 - jmp NEAR $L$open_sse_128_xor_hash -$L$SEH_end_GFp_chacha20_poly1305_open: - - - - - - - -global GFp_chacha20_poly1305_seal - -ALIGN 64 -GFp_chacha20_poly1305_seal: - mov QWORD[8+rsp],rdi ;WIN64 prologue - mov QWORD[16+rsp],rsi - mov rax,rsp -$L$SEH_begin_GFp_chacha20_poly1305_seal: - mov rdi,rcx - mov rsi,rdx - mov rdx,r8 - mov rcx,r9 - mov r8,QWORD[40+rsp] - mov r9,QWORD[48+rsp] - - - - push rbp - - push rbx - - push r12 - - push r13 - - push r14 - - push r15 - - - - push r9 - - sub rsp,288 + 160 + 32 - - lea rbp,[32+rsp] - and rbp,-32 - - movaps XMMWORD[(0+0)+rbp],xmm6 - movaps XMMWORD[(16+0)+rbp],xmm7 - movaps XMMWORD[(32+0)+rbp],xmm8 - movaps XMMWORD[(48+0)+rbp],xmm9 - movaps XMMWORD[(64+0)+rbp],xmm10 - movaps XMMWORD[(80+0)+rbp],xmm11 - movaps XMMWORD[(96+0)+rbp],xmm12 - movaps XMMWORD[(112+0)+rbp],xmm13 - movaps XMMWORD[(128+0)+rbp],xmm14 - movaps XMMWORD[(144+0)+rbp],xmm15 - - mov rbx,QWORD[56+r9] - add rbx,rdx - mov QWORD[((0+160+32))+rbp],r8 - mov QWORD[((8+160+32))+rbp],rbx - mov rbx,rdx - - mov eax,DWORD[((GFp_ia32cap_P+8))] - and eax,288 - xor eax,288 - jz NEAR chacha20_poly1305_seal_avx2 - - cmp rbx,128 - jbe NEAR $L$seal_sse_128 - - movdqa xmm0,XMMWORD[$L$chacha20_consts] - movdqu xmm4,XMMWORD[r9] - movdqu xmm8,XMMWORD[16+r9] - movdqu xmm12,XMMWORD[32+r9] - - movdqa xmm1,xmm0 - movdqa xmm2,xmm0 - movdqa xmm3,xmm0 - movdqa xmm5,xmm4 - movdqa xmm6,xmm4 - movdqa xmm7,xmm4 - movdqa xmm9,xmm8 - movdqa xmm10,xmm8 - movdqa xmm11,xmm8 - movdqa xmm15,xmm12 - paddd xmm12,XMMWORD[$L$sse_inc] - movdqa xmm14,xmm12 - paddd xmm12,XMMWORD[$L$sse_inc] - movdqa xmm13,xmm12 - paddd xmm12,XMMWORD[$L$sse_inc] - - movdqa XMMWORD[(160+48)+rbp],xmm4 - movdqa XMMWORD[(160+64)+rbp],xmm8 - movdqa XMMWORD[(160+96)+rbp],xmm12 - movdqa XMMWORD[(160+112)+rbp],xmm13 - movdqa XMMWORD[(160+128)+rbp],xmm14 - movdqa XMMWORD[(160+144)+rbp],xmm15 - mov r10,10 -$L$seal_sse_init_rounds: - movdqa XMMWORD[(160+80)+rbp],xmm8 - movdqa xmm8,XMMWORD[$L$rol16] - paddd xmm3,xmm7 - paddd xmm2,xmm6 - paddd xmm1,xmm5 - paddd xmm0,xmm4 - pxor xmm15,xmm3 - pxor xmm14,xmm2 - pxor xmm13,xmm1 - pxor xmm12,xmm0 -DB 102,69,15,56,0,248 -DB 102,69,15,56,0,240 -DB 102,69,15,56,0,232 -DB 102,69,15,56,0,224 - movdqa xmm8,XMMWORD[((160+80))+rbp] - paddd xmm11,xmm15 - paddd xmm10,xmm14 - paddd xmm9,xmm13 - paddd xmm8,xmm12 - pxor xmm7,xmm11 - pxor xmm6,xmm10 - pxor xmm5,xmm9 - pxor xmm4,xmm8 - movdqa XMMWORD[(160+80)+rbp],xmm8 - movdqa xmm8,xmm7 - psrld xmm8,20 - pslld xmm7,32-20 - pxor xmm7,xmm8 - movdqa xmm8,xmm6 - psrld xmm8,20 - pslld xmm6,32-20 - pxor xmm6,xmm8 - movdqa xmm8,xmm5 - psrld xmm8,20 - pslld xmm5,32-20 - pxor xmm5,xmm8 - movdqa xmm8,xmm4 - psrld xmm8,20 - pslld xmm4,32-20 - pxor xmm4,xmm8 - movdqa xmm8,XMMWORD[$L$rol8] - paddd xmm3,xmm7 - paddd xmm2,xmm6 - paddd xmm1,xmm5 - paddd xmm0,xmm4 - pxor xmm15,xmm3 - pxor xmm14,xmm2 - pxor xmm13,xmm1 - pxor xmm12,xmm0 -DB 102,69,15,56,0,248 -DB 102,69,15,56,0,240 -DB 102,69,15,56,0,232 -DB 102,69,15,56,0,224 - movdqa xmm8,XMMWORD[((160+80))+rbp] - paddd xmm11,xmm15 - paddd xmm10,xmm14 - paddd xmm9,xmm13 - paddd xmm8,xmm12 - pxor xmm7,xmm11 - pxor xmm6,xmm10 - pxor xmm5,xmm9 - pxor xmm4,xmm8 - movdqa XMMWORD[(160+80)+rbp],xmm8 - movdqa xmm8,xmm7 - psrld xmm8,25 - pslld xmm7,32-25 - pxor xmm7,xmm8 - movdqa xmm8,xmm6 - psrld xmm8,25 - pslld xmm6,32-25 - pxor xmm6,xmm8 - movdqa xmm8,xmm5 - psrld xmm8,25 - pslld xmm5,32-25 - pxor xmm5,xmm8 - movdqa xmm8,xmm4 - psrld xmm8,25 - pslld xmm4,32-25 - pxor xmm4,xmm8 - movdqa xmm8,XMMWORD[((160+80))+rbp] -DB 102,15,58,15,255,4 -DB 102,69,15,58,15,219,8 -DB 102,69,15,58,15,255,12 -DB 102,15,58,15,246,4 -DB 102,69,15,58,15,210,8 -DB 102,69,15,58,15,246,12 -DB 102,15,58,15,237,4 -DB 102,69,15,58,15,201,8 -DB 102,69,15,58,15,237,12 -DB 102,15,58,15,228,4 -DB 102,69,15,58,15,192,8 -DB 102,69,15,58,15,228,12 - movdqa XMMWORD[(160+80)+rbp],xmm8 - movdqa xmm8,XMMWORD[$L$rol16] - paddd xmm3,xmm7 - paddd xmm2,xmm6 - paddd xmm1,xmm5 - paddd xmm0,xmm4 - pxor xmm15,xmm3 - pxor xmm14,xmm2 - pxor xmm13,xmm1 - pxor xmm12,xmm0 -DB 102,69,15,56,0,248 -DB 102,69,15,56,0,240 -DB 102,69,15,56,0,232 -DB 102,69,15,56,0,224 - movdqa xmm8,XMMWORD[((160+80))+rbp] - paddd xmm11,xmm15 - paddd xmm10,xmm14 - paddd xmm9,xmm13 - paddd xmm8,xmm12 - pxor xmm7,xmm11 - pxor xmm6,xmm10 - pxor xmm5,xmm9 - pxor xmm4,xmm8 - movdqa XMMWORD[(160+80)+rbp],xmm8 - movdqa xmm8,xmm7 - psrld xmm8,20 - pslld xmm7,32-20 - pxor xmm7,xmm8 - movdqa xmm8,xmm6 - psrld xmm8,20 - pslld xmm6,32-20 - pxor xmm6,xmm8 - movdqa xmm8,xmm5 - psrld xmm8,20 - pslld xmm5,32-20 - pxor xmm5,xmm8 - movdqa xmm8,xmm4 - psrld xmm8,20 - pslld xmm4,32-20 - pxor xmm4,xmm8 - movdqa xmm8,XMMWORD[$L$rol8] - paddd xmm3,xmm7 - paddd xmm2,xmm6 - paddd xmm1,xmm5 - paddd xmm0,xmm4 - pxor xmm15,xmm3 - pxor xmm14,xmm2 - pxor xmm13,xmm1 - pxor xmm12,xmm0 -DB 102,69,15,56,0,248 -DB 102,69,15,56,0,240 -DB 102,69,15,56,0,232 -DB 102,69,15,56,0,224 - movdqa xmm8,XMMWORD[((160+80))+rbp] - paddd xmm11,xmm15 - paddd xmm10,xmm14 - paddd xmm9,xmm13 - paddd xmm8,xmm12 - pxor xmm7,xmm11 - pxor xmm6,xmm10 - pxor xmm5,xmm9 - pxor xmm4,xmm8 - movdqa XMMWORD[(160+80)+rbp],xmm8 - movdqa xmm8,xmm7 - psrld xmm8,25 - pslld xmm7,32-25 - pxor xmm7,xmm8 - movdqa xmm8,xmm6 - psrld xmm8,25 - pslld xmm6,32-25 - pxor xmm6,xmm8 - movdqa xmm8,xmm5 - psrld xmm8,25 - pslld xmm5,32-25 - pxor xmm5,xmm8 - movdqa xmm8,xmm4 - psrld xmm8,25 - pslld xmm4,32-25 - pxor xmm4,xmm8 - movdqa xmm8,XMMWORD[((160+80))+rbp] -DB 102,15,58,15,255,12 -DB 102,69,15,58,15,219,8 -DB 102,69,15,58,15,255,4 -DB 102,15,58,15,246,12 -DB 102,69,15,58,15,210,8 -DB 102,69,15,58,15,246,4 -DB 102,15,58,15,237,12 -DB 102,69,15,58,15,201,8 -DB 102,69,15,58,15,237,4 -DB 102,15,58,15,228,12 -DB 102,69,15,58,15,192,8 -DB 102,69,15,58,15,228,4 - - dec r10 - jnz NEAR $L$seal_sse_init_rounds - paddd xmm3,XMMWORD[$L$chacha20_consts] - paddd xmm7,XMMWORD[((160+48))+rbp] - paddd xmm11,XMMWORD[((160+64))+rbp] - paddd xmm15,XMMWORD[((160+144))+rbp] - paddd xmm2,XMMWORD[$L$chacha20_consts] - paddd xmm6,XMMWORD[((160+48))+rbp] - paddd xmm10,XMMWORD[((160+64))+rbp] - paddd xmm14,XMMWORD[((160+128))+rbp] - paddd xmm1,XMMWORD[$L$chacha20_consts] - paddd xmm5,XMMWORD[((160+48))+rbp] - paddd xmm9,XMMWORD[((160+64))+rbp] - paddd xmm13,XMMWORD[((160+112))+rbp] - paddd xmm0,XMMWORD[$L$chacha20_consts] - paddd xmm4,XMMWORD[((160+48))+rbp] - paddd xmm8,XMMWORD[((160+64))+rbp] - paddd xmm12,XMMWORD[((160+96))+rbp] - - - pand xmm3,XMMWORD[$L$clamp] - movdqa XMMWORD[(160+0)+rbp],xmm3 - movdqa XMMWORD[(160+16)+rbp],xmm7 - - mov r8,r8 - call poly_hash_ad_internal - movdqu xmm3,XMMWORD[((0 + 0))+rsi] - movdqu xmm7,XMMWORD[((16 + 0))+rsi] - movdqu xmm11,XMMWORD[((32 + 0))+rsi] - movdqu xmm15,XMMWORD[((48 + 0))+rsi] - pxor xmm2,xmm3 - pxor xmm6,xmm7 - pxor xmm10,xmm11 - pxor xmm15,xmm14 - movdqu XMMWORD[(0 + 0)+rdi],xmm2 - movdqu XMMWORD[(16 + 0)+rdi],xmm6 - movdqu XMMWORD[(32 + 0)+rdi],xmm10 - movdqu XMMWORD[(48 + 0)+rdi],xmm15 - movdqu xmm3,XMMWORD[((0 + 64))+rsi] - movdqu xmm7,XMMWORD[((16 + 64))+rsi] - movdqu xmm11,XMMWORD[((32 + 64))+rsi] - movdqu xmm15,XMMWORD[((48 + 64))+rsi] - pxor xmm1,xmm3 - pxor xmm5,xmm7 - pxor xmm9,xmm11 - pxor xmm15,xmm13 - movdqu XMMWORD[(0 + 64)+rdi],xmm1 - movdqu XMMWORD[(16 + 64)+rdi],xmm5 - movdqu XMMWORD[(32 + 64)+rdi],xmm9 - movdqu XMMWORD[(48 + 64)+rdi],xmm15 - - cmp rbx,12*16 - ja NEAR $L$seal_sse_main_init - mov rcx,8*16 - sub rbx,8*16 - lea rsi,[128+rsi] - jmp NEAR $L$seal_sse_128_tail_hash -$L$seal_sse_main_init: - movdqu xmm3,XMMWORD[((0 + 128))+rsi] - movdqu xmm7,XMMWORD[((16 + 128))+rsi] - movdqu xmm11,XMMWORD[((32 + 128))+rsi] - movdqu xmm15,XMMWORD[((48 + 128))+rsi] - pxor xmm0,xmm3 - pxor xmm4,xmm7 - pxor xmm8,xmm11 - pxor xmm15,xmm12 - movdqu XMMWORD[(0 + 128)+rdi],xmm0 - movdqu XMMWORD[(16 + 128)+rdi],xmm4 - movdqu XMMWORD[(32 + 128)+rdi],xmm8 - movdqu XMMWORD[(48 + 128)+rdi],xmm15 - - mov rcx,12*16 - sub rbx,12*16 - lea rsi,[192+rsi] - mov rcx,2 - mov r8,8 - cmp rbx,4*16 - jbe NEAR $L$seal_sse_tail_64 - cmp rbx,8*16 - jbe NEAR $L$seal_sse_tail_128 - cmp rbx,12*16 - jbe NEAR $L$seal_sse_tail_192 - -$L$seal_sse_main_loop: - movdqa xmm0,XMMWORD[$L$chacha20_consts] - movdqa xmm4,XMMWORD[((160+48))+rbp] - movdqa xmm8,XMMWORD[((160+64))+rbp] - movdqa xmm1,xmm0 - movdqa xmm5,xmm4 - movdqa xmm9,xmm8 - movdqa xmm2,xmm0 - movdqa xmm6,xmm4 - movdqa xmm10,xmm8 - movdqa xmm3,xmm0 - movdqa xmm7,xmm4 - movdqa xmm11,xmm8 - movdqa xmm15,XMMWORD[((160+96))+rbp] - paddd xmm15,XMMWORD[$L$sse_inc] - movdqa xmm14,xmm15 - paddd xmm14,XMMWORD[$L$sse_inc] - movdqa xmm13,xmm14 - paddd xmm13,XMMWORD[$L$sse_inc] - movdqa xmm12,xmm13 - paddd xmm12,XMMWORD[$L$sse_inc] - movdqa XMMWORD[(160+96)+rbp],xmm12 - movdqa XMMWORD[(160+112)+rbp],xmm13 - movdqa XMMWORD[(160+128)+rbp],xmm14 - movdqa XMMWORD[(160+144)+rbp],xmm15 - -ALIGN 32 -$L$seal_sse_main_rounds: - movdqa XMMWORD[(160+80)+rbp],xmm8 - movdqa xmm8,XMMWORD[$L$rol16] - paddd xmm3,xmm7 - paddd xmm2,xmm6 - paddd xmm1,xmm5 - paddd xmm0,xmm4 - pxor xmm15,xmm3 - pxor xmm14,xmm2 - pxor xmm13,xmm1 - pxor xmm12,xmm0 -DB 102,69,15,56,0,248 -DB 102,69,15,56,0,240 -DB 102,69,15,56,0,232 -DB 102,69,15,56,0,224 - movdqa xmm8,XMMWORD[((160+80))+rbp] - paddd xmm11,xmm15 - paddd xmm10,xmm14 - paddd xmm9,xmm13 - paddd xmm8,xmm12 - pxor xmm7,xmm11 - add r10,QWORD[((0+0))+rdi] - adc r11,QWORD[((8+0))+rdi] - adc r12,1 - pxor xmm6,xmm10 - pxor xmm5,xmm9 - pxor xmm4,xmm8 - movdqa XMMWORD[(160+80)+rbp],xmm8 - movdqa xmm8,xmm7 - psrld xmm8,20 - pslld xmm7,32-20 - pxor xmm7,xmm8 - movdqa xmm8,xmm6 - psrld xmm8,20 - pslld xmm6,32-20 - pxor xmm6,xmm8 - movdqa xmm8,xmm5 - psrld xmm8,20 - pslld xmm5,32-20 - pxor xmm5,xmm8 - movdqa xmm8,xmm4 - psrld xmm8,20 - pslld xmm4,32-20 - pxor xmm4,xmm8 - mov rax,QWORD[((0+160+0))+rbp] - mov r15,rax - mul r10 - mov r13,rax - mov r14,rdx - mov rax,QWORD[((0+160+0))+rbp] - mul r11 - imul r15,r12 - add r14,rax - adc r15,rdx - movdqa xmm8,XMMWORD[$L$rol8] - paddd xmm3,xmm7 - paddd xmm2,xmm6 - paddd xmm1,xmm5 - paddd xmm0,xmm4 - pxor xmm15,xmm3 - pxor xmm14,xmm2 - pxor xmm13,xmm1 - pxor xmm12,xmm0 -DB 102,69,15,56,0,248 -DB 102,69,15,56,0,240 -DB 102,69,15,56,0,232 -DB 102,69,15,56,0,224 - movdqa xmm8,XMMWORD[((160+80))+rbp] - paddd xmm11,xmm15 - paddd xmm10,xmm14 - paddd xmm9,xmm13 - paddd xmm8,xmm12 - pxor xmm7,xmm11 - pxor xmm6,xmm10 - mov rax,QWORD[((8+160+0))+rbp] - mov r9,rax - mul r10 - add r14,rax - adc rdx,0 - mov r10,rdx - mov rax,QWORD[((8+160+0))+rbp] - mul r11 - add r15,rax - adc rdx,0 - pxor xmm5,xmm9 - pxor xmm4,xmm8 - movdqa XMMWORD[(160+80)+rbp],xmm8 - movdqa xmm8,xmm7 - psrld xmm8,25 - pslld xmm7,32-25 - pxor xmm7,xmm8 - movdqa xmm8,xmm6 - psrld xmm8,25 - pslld xmm6,32-25 - pxor xmm6,xmm8 - movdqa xmm8,xmm5 - psrld xmm8,25 - pslld xmm5,32-25 - pxor xmm5,xmm8 - movdqa xmm8,xmm4 - psrld xmm8,25 - pslld xmm4,32-25 - pxor xmm4,xmm8 - movdqa xmm8,XMMWORD[((160+80))+rbp] - imul r9,r12 - add r15,r10 - adc r9,rdx -DB 102,15,58,15,255,4 -DB 102,69,15,58,15,219,8 -DB 102,69,15,58,15,255,12 -DB 102,15,58,15,246,4 -DB 102,69,15,58,15,210,8 -DB 102,69,15,58,15,246,12 -DB 102,15,58,15,237,4 -DB 102,69,15,58,15,201,8 -DB 102,69,15,58,15,237,12 -DB 102,15,58,15,228,4 -DB 102,69,15,58,15,192,8 -DB 102,69,15,58,15,228,12 - movdqa XMMWORD[(160+80)+rbp],xmm8 - movdqa xmm8,XMMWORD[$L$rol16] - paddd xmm3,xmm7 - paddd xmm2,xmm6 - paddd xmm1,xmm5 - paddd xmm0,xmm4 - pxor xmm15,xmm3 - pxor xmm14,xmm2 - mov r10,r13 - mov r11,r14 - mov r12,r15 - and r12,3 - mov r13,r15 - and r13,-4 - mov r14,r9 - shrd r15,r9,2 - shr r9,2 - add r15,r13 - adc r9,r14 - add r10,r15 - adc r11,r9 - adc r12,0 - pxor xmm13,xmm1 - pxor xmm12,xmm0 -DB 102,69,15,56,0,248 -DB 102,69,15,56,0,240 -DB 102,69,15,56,0,232 -DB 102,69,15,56,0,224 - movdqa xmm8,XMMWORD[((160+80))+rbp] - paddd xmm11,xmm15 - paddd xmm10,xmm14 - paddd xmm9,xmm13 - paddd xmm8,xmm12 - pxor xmm7,xmm11 - pxor xmm6,xmm10 - pxor xmm5,xmm9 - pxor xmm4,xmm8 - movdqa XMMWORD[(160+80)+rbp],xmm8 - movdqa xmm8,xmm7 - psrld xmm8,20 - pslld xmm7,32-20 - pxor xmm7,xmm8 - movdqa xmm8,xmm6 - psrld xmm8,20 - pslld xmm6,32-20 - pxor xmm6,xmm8 - movdqa xmm8,xmm5 - psrld xmm8,20 - pslld xmm5,32-20 - pxor xmm5,xmm8 - movdqa xmm8,xmm4 - psrld xmm8,20 - pslld xmm4,32-20 - pxor xmm4,xmm8 - movdqa xmm8,XMMWORD[$L$rol8] - paddd xmm3,xmm7 - paddd xmm2,xmm6 - paddd xmm1,xmm5 - paddd xmm0,xmm4 - pxor xmm15,xmm3 - pxor xmm14,xmm2 - pxor xmm13,xmm1 - pxor xmm12,xmm0 -DB 102,69,15,56,0,248 -DB 102,69,15,56,0,240 -DB 102,69,15,56,0,232 -DB 102,69,15,56,0,224 - movdqa xmm8,XMMWORD[((160+80))+rbp] - paddd xmm11,xmm15 - paddd xmm10,xmm14 - paddd xmm9,xmm13 - paddd xmm8,xmm12 - pxor xmm7,xmm11 - pxor xmm6,xmm10 - pxor xmm5,xmm9 - pxor xmm4,xmm8 - movdqa XMMWORD[(160+80)+rbp],xmm8 - movdqa xmm8,xmm7 - psrld xmm8,25 - pslld xmm7,32-25 - pxor xmm7,xmm8 - movdqa xmm8,xmm6 - psrld xmm8,25 - pslld xmm6,32-25 - pxor xmm6,xmm8 - movdqa xmm8,xmm5 - psrld xmm8,25 - pslld xmm5,32-25 - pxor xmm5,xmm8 - movdqa xmm8,xmm4 - psrld xmm8,25 - pslld xmm4,32-25 - pxor xmm4,xmm8 - movdqa xmm8,XMMWORD[((160+80))+rbp] -DB 102,15,58,15,255,12 -DB 102,69,15,58,15,219,8 -DB 102,69,15,58,15,255,4 -DB 102,15,58,15,246,12 -DB 102,69,15,58,15,210,8 -DB 102,69,15,58,15,246,4 -DB 102,15,58,15,237,12 -DB 102,69,15,58,15,201,8 -DB 102,69,15,58,15,237,4 -DB 102,15,58,15,228,12 -DB 102,69,15,58,15,192,8 -DB 102,69,15,58,15,228,4 - - lea rdi,[16+rdi] - dec r8 - jge NEAR $L$seal_sse_main_rounds - add r10,QWORD[((0+0))+rdi] - adc r11,QWORD[((8+0))+rdi] - adc r12,1 - mov rax,QWORD[((0+160+0))+rbp] - mov r15,rax - mul r10 - mov r13,rax - mov r14,rdx - mov rax,QWORD[((0+160+0))+rbp] - mul r11 - imul r15,r12 - add r14,rax - adc r15,rdx - mov rax,QWORD[((8+160+0))+rbp] - mov r9,rax - mul r10 - add r14,rax - adc rdx,0 - mov r10,rdx - mov rax,QWORD[((8+160+0))+rbp] - mul r11 - add r15,rax - adc rdx,0 - imul r9,r12 - add r15,r10 - adc r9,rdx - mov r10,r13 - mov r11,r14 - mov r12,r15 - and r12,3 - mov r13,r15 - and r13,-4 - mov r14,r9 - shrd r15,r9,2 - shr r9,2 - add r15,r13 - adc r9,r14 - add r10,r15 - adc r11,r9 - adc r12,0 - - lea rdi,[16+rdi] - dec rcx - jg NEAR $L$seal_sse_main_rounds - paddd xmm3,XMMWORD[$L$chacha20_consts] - paddd xmm7,XMMWORD[((160+48))+rbp] - paddd xmm11,XMMWORD[((160+64))+rbp] - paddd xmm15,XMMWORD[((160+144))+rbp] - paddd xmm2,XMMWORD[$L$chacha20_consts] - paddd xmm6,XMMWORD[((160+48))+rbp] - paddd xmm10,XMMWORD[((160+64))+rbp] - paddd xmm14,XMMWORD[((160+128))+rbp] - paddd xmm1,XMMWORD[$L$chacha20_consts] - paddd xmm5,XMMWORD[((160+48))+rbp] - paddd xmm9,XMMWORD[((160+64))+rbp] - paddd xmm13,XMMWORD[((160+112))+rbp] - paddd xmm0,XMMWORD[$L$chacha20_consts] - paddd xmm4,XMMWORD[((160+48))+rbp] - paddd xmm8,XMMWORD[((160+64))+rbp] - paddd xmm12,XMMWORD[((160+96))+rbp] - - movdqa XMMWORD[(160+80)+rbp],xmm14 - movdqa XMMWORD[(160+80)+rbp],xmm14 - movdqu xmm14,XMMWORD[((0 + 0))+rsi] - pxor xmm14,xmm3 - movdqu XMMWORD[(0 + 0)+rdi],xmm14 - movdqu xmm14,XMMWORD[((16 + 0))+rsi] - pxor xmm14,xmm7 - movdqu XMMWORD[(16 + 0)+rdi],xmm14 - movdqu xmm14,XMMWORD[((32 + 0))+rsi] - pxor xmm14,xmm11 - movdqu XMMWORD[(32 + 0)+rdi],xmm14 - movdqu xmm14,XMMWORD[((48 + 0))+rsi] - pxor xmm14,xmm15 - movdqu XMMWORD[(48 + 0)+rdi],xmm14 - - movdqa xmm14,XMMWORD[((160+80))+rbp] - movdqu xmm3,XMMWORD[((0 + 64))+rsi] - movdqu xmm7,XMMWORD[((16 + 64))+rsi] - movdqu xmm11,XMMWORD[((32 + 64))+rsi] - movdqu xmm15,XMMWORD[((48 + 64))+rsi] - pxor xmm2,xmm3 - pxor xmm6,xmm7 - pxor xmm10,xmm11 - pxor xmm15,xmm14 - movdqu XMMWORD[(0 + 64)+rdi],xmm2 - movdqu XMMWORD[(16 + 64)+rdi],xmm6 - movdqu XMMWORD[(32 + 64)+rdi],xmm10 - movdqu XMMWORD[(48 + 64)+rdi],xmm15 - movdqu xmm3,XMMWORD[((0 + 128))+rsi] - movdqu xmm7,XMMWORD[((16 + 128))+rsi] - movdqu xmm11,XMMWORD[((32 + 128))+rsi] - movdqu xmm15,XMMWORD[((48 + 128))+rsi] - pxor xmm1,xmm3 - pxor xmm5,xmm7 - pxor xmm9,xmm11 - pxor xmm15,xmm13 - movdqu XMMWORD[(0 + 128)+rdi],xmm1 - movdqu XMMWORD[(16 + 128)+rdi],xmm5 - movdqu XMMWORD[(32 + 128)+rdi],xmm9 - movdqu XMMWORD[(48 + 128)+rdi],xmm15 - - cmp rbx,16*16 - ja NEAR $L$seal_sse_main_loop_xor - - mov rcx,12*16 - sub rbx,12*16 - lea rsi,[192+rsi] - jmp NEAR $L$seal_sse_128_tail_hash -$L$seal_sse_main_loop_xor: - movdqu xmm3,XMMWORD[((0 + 192))+rsi] - movdqu xmm7,XMMWORD[((16 + 192))+rsi] - movdqu xmm11,XMMWORD[((32 + 192))+rsi] - movdqu xmm15,XMMWORD[((48 + 192))+rsi] - pxor xmm0,xmm3 - pxor xmm4,xmm7 - pxor xmm8,xmm11 - pxor xmm15,xmm12 - movdqu XMMWORD[(0 + 192)+rdi],xmm0 - movdqu XMMWORD[(16 + 192)+rdi],xmm4 - movdqu XMMWORD[(32 + 192)+rdi],xmm8 - movdqu XMMWORD[(48 + 192)+rdi],xmm15 - - lea rsi,[256+rsi] - sub rbx,16*16 - mov rcx,6 - mov r8,4 - cmp rbx,12*16 - jg NEAR $L$seal_sse_main_loop - mov rcx,rbx - test rbx,rbx - je NEAR $L$seal_sse_128_tail_hash - mov rcx,6 - cmp rbx,8*16 - ja NEAR $L$seal_sse_tail_192 - cmp rbx,4*16 - ja NEAR $L$seal_sse_tail_128 - -$L$seal_sse_tail_64: - movdqa xmm0,XMMWORD[$L$chacha20_consts] - movdqa xmm4,XMMWORD[((160+48))+rbp] - movdqa xmm8,XMMWORD[((160+64))+rbp] - movdqa xmm12,XMMWORD[((160+96))+rbp] - paddd xmm12,XMMWORD[$L$sse_inc] - movdqa XMMWORD[(160+96)+rbp],xmm12 - -$L$seal_sse_tail_64_rounds_and_x2hash: - add r10,QWORD[((0+0))+rdi] - adc r11,QWORD[((8+0))+rdi] - adc r12,1 - mov rax,QWORD[((0+160+0))+rbp] - mov r15,rax - mul r10 - mov r13,rax - mov r14,rdx - mov rax,QWORD[((0+160+0))+rbp] - mul r11 - imul r15,r12 - add r14,rax - adc r15,rdx - mov rax,QWORD[((8+160+0))+rbp] - mov r9,rax - mul r10 - add r14,rax - adc rdx,0 - mov r10,rdx - mov rax,QWORD[((8+160+0))+rbp] - mul r11 - add r15,rax - adc rdx,0 - imul r9,r12 - add r15,r10 - adc r9,rdx - mov r10,r13 - mov r11,r14 - mov r12,r15 - and r12,3 - mov r13,r15 - and r13,-4 - mov r14,r9 - shrd r15,r9,2 - shr r9,2 - add r15,r13 - adc r9,r14 - add r10,r15 - adc r11,r9 - adc r12,0 - - lea rdi,[16+rdi] -$L$seal_sse_tail_64_rounds_and_x1hash: - paddd xmm0,xmm4 - pxor xmm12,xmm0 - pshufb xmm12,XMMWORD[$L$rol16] - paddd xmm8,xmm12 - pxor xmm4,xmm8 - movdqa xmm3,xmm4 - pslld xmm3,12 - psrld xmm4,20 - pxor xmm4,xmm3 - paddd xmm0,xmm4 - pxor xmm12,xmm0 - pshufb xmm12,XMMWORD[$L$rol8] - paddd xmm8,xmm12 - pxor xmm4,xmm8 - movdqa xmm3,xmm4 - pslld xmm3,7 - psrld xmm4,25 - pxor xmm4,xmm3 -DB 102,15,58,15,228,4 -DB 102,69,15,58,15,192,8 -DB 102,69,15,58,15,228,12 - paddd xmm0,xmm4 - pxor xmm12,xmm0 - pshufb xmm12,XMMWORD[$L$rol16] - paddd xmm8,xmm12 - pxor xmm4,xmm8 - movdqa xmm3,xmm4 - pslld xmm3,12 - psrld xmm4,20 - pxor xmm4,xmm3 - paddd xmm0,xmm4 - pxor xmm12,xmm0 - pshufb xmm12,XMMWORD[$L$rol8] - paddd xmm8,xmm12 - pxor xmm4,xmm8 - movdqa xmm3,xmm4 - pslld xmm3,7 - psrld xmm4,25 - pxor xmm4,xmm3 -DB 102,15,58,15,228,12 -DB 102,69,15,58,15,192,8 -DB 102,69,15,58,15,228,4 - add r10,QWORD[((0+0))+rdi] - adc r11,QWORD[((8+0))+rdi] - adc r12,1 - mov rax,QWORD[((0+160+0))+rbp] - mov r15,rax - mul r10 - mov r13,rax - mov r14,rdx - mov rax,QWORD[((0+160+0))+rbp] - mul r11 - imul r15,r12 - add r14,rax - adc r15,rdx - mov rax,QWORD[((8+160+0))+rbp] - mov r9,rax - mul r10 - add r14,rax - adc rdx,0 - mov r10,rdx - mov rax,QWORD[((8+160+0))+rbp] - mul r11 - add r15,rax - adc rdx,0 - imul r9,r12 - add r15,r10 - adc r9,rdx - mov r10,r13 - mov r11,r14 - mov r12,r15 - and r12,3 - mov r13,r15 - and r13,-4 - mov r14,r9 - shrd r15,r9,2 - shr r9,2 - add r15,r13 - adc r9,r14 - add r10,r15 - adc r11,r9 - adc r12,0 - - lea rdi,[16+rdi] - dec rcx - jg NEAR $L$seal_sse_tail_64_rounds_and_x2hash - dec r8 - jge NEAR $L$seal_sse_tail_64_rounds_and_x1hash - paddd xmm0,XMMWORD[$L$chacha20_consts] - paddd xmm4,XMMWORD[((160+48))+rbp] - paddd xmm8,XMMWORD[((160+64))+rbp] - paddd xmm12,XMMWORD[((160+96))+rbp] - - jmp NEAR $L$seal_sse_128_tail_xor - -$L$seal_sse_tail_128: - movdqa xmm0,XMMWORD[$L$chacha20_consts] - movdqa xmm4,XMMWORD[((160+48))+rbp] - movdqa xmm8,XMMWORD[((160+64))+rbp] - movdqa xmm1,xmm0 - movdqa xmm5,xmm4 - movdqa xmm9,xmm8 - movdqa xmm13,XMMWORD[((160+96))+rbp] - paddd xmm13,XMMWORD[$L$sse_inc] - movdqa xmm12,xmm13 - paddd xmm12,XMMWORD[$L$sse_inc] - movdqa XMMWORD[(160+96)+rbp],xmm12 - movdqa XMMWORD[(160+112)+rbp],xmm13 - -$L$seal_sse_tail_128_rounds_and_x2hash: - add r10,QWORD[((0+0))+rdi] - adc r11,QWORD[((8+0))+rdi] - adc r12,1 - mov rax,QWORD[((0+160+0))+rbp] - mov r15,rax - mul r10 - mov r13,rax - mov r14,rdx - mov rax,QWORD[((0+160+0))+rbp] - mul r11 - imul r15,r12 - add r14,rax - adc r15,rdx - mov rax,QWORD[((8+160+0))+rbp] - mov r9,rax - mul r10 - add r14,rax - adc rdx,0 - mov r10,rdx - mov rax,QWORD[((8+160+0))+rbp] - mul r11 - add r15,rax - adc rdx,0 - imul r9,r12 - add r15,r10 - adc r9,rdx - mov r10,r13 - mov r11,r14 - mov r12,r15 - and r12,3 - mov r13,r15 - and r13,-4 - mov r14,r9 - shrd r15,r9,2 - shr r9,2 - add r15,r13 - adc r9,r14 - add r10,r15 - adc r11,r9 - adc r12,0 - - lea rdi,[16+rdi] -$L$seal_sse_tail_128_rounds_and_x1hash: - paddd xmm0,xmm4 - pxor xmm12,xmm0 - pshufb xmm12,XMMWORD[$L$rol16] - paddd xmm8,xmm12 - pxor xmm4,xmm8 - movdqa xmm3,xmm4 - pslld xmm3,12 - psrld xmm4,20 - pxor xmm4,xmm3 - paddd xmm0,xmm4 - pxor xmm12,xmm0 - pshufb xmm12,XMMWORD[$L$rol8] - paddd xmm8,xmm12 - pxor xmm4,xmm8 - movdqa xmm3,xmm4 - pslld xmm3,7 - psrld xmm4,25 - pxor xmm4,xmm3 -DB 102,15,58,15,228,4 -DB 102,69,15,58,15,192,8 -DB 102,69,15,58,15,228,12 - paddd xmm1,xmm5 - pxor xmm13,xmm1 - pshufb xmm13,XMMWORD[$L$rol16] - paddd xmm9,xmm13 - pxor xmm5,xmm9 - movdqa xmm3,xmm5 - pslld xmm3,12 - psrld xmm5,20 - pxor xmm5,xmm3 - paddd xmm1,xmm5 - pxor xmm13,xmm1 - pshufb xmm13,XMMWORD[$L$rol8] - paddd xmm9,xmm13 - pxor xmm5,xmm9 - movdqa xmm3,xmm5 - pslld xmm3,7 - psrld xmm5,25 - pxor xmm5,xmm3 -DB 102,15,58,15,237,4 -DB 102,69,15,58,15,201,8 -DB 102,69,15,58,15,237,12 - add r10,QWORD[((0+0))+rdi] - adc r11,QWORD[((8+0))+rdi] - adc r12,1 - mov rax,QWORD[((0+160+0))+rbp] - mov r15,rax - mul r10 - mov r13,rax - mov r14,rdx - mov rax,QWORD[((0+160+0))+rbp] - mul r11 - imul r15,r12 - add r14,rax - adc r15,rdx - mov rax,QWORD[((8+160+0))+rbp] - mov r9,rax - mul r10 - add r14,rax - adc rdx,0 - mov r10,rdx - mov rax,QWORD[((8+160+0))+rbp] - mul r11 - add r15,rax - adc rdx,0 - imul r9,r12 - add r15,r10 - adc r9,rdx - mov r10,r13 - mov r11,r14 - mov r12,r15 - and r12,3 - mov r13,r15 - and r13,-4 - mov r14,r9 - shrd r15,r9,2 - shr r9,2 - add r15,r13 - adc r9,r14 - add r10,r15 - adc r11,r9 - adc r12,0 - paddd xmm0,xmm4 - pxor xmm12,xmm0 - pshufb xmm12,XMMWORD[$L$rol16] - paddd xmm8,xmm12 - pxor xmm4,xmm8 - movdqa xmm3,xmm4 - pslld xmm3,12 - psrld xmm4,20 - pxor xmm4,xmm3 - paddd xmm0,xmm4 - pxor xmm12,xmm0 - pshufb xmm12,XMMWORD[$L$rol8] - paddd xmm8,xmm12 - pxor xmm4,xmm8 - movdqa xmm3,xmm4 - pslld xmm3,7 - psrld xmm4,25 - pxor xmm4,xmm3 -DB 102,15,58,15,228,12 -DB 102,69,15,58,15,192,8 -DB 102,69,15,58,15,228,4 - paddd xmm1,xmm5 - pxor xmm13,xmm1 - pshufb xmm13,XMMWORD[$L$rol16] - paddd xmm9,xmm13 - pxor xmm5,xmm9 - movdqa xmm3,xmm5 - pslld xmm3,12 - psrld xmm5,20 - pxor xmm5,xmm3 - paddd xmm1,xmm5 - pxor xmm13,xmm1 - pshufb xmm13,XMMWORD[$L$rol8] - paddd xmm9,xmm13 - pxor xmm5,xmm9 - movdqa xmm3,xmm5 - pslld xmm3,7 - psrld xmm5,25 - pxor xmm5,xmm3 -DB 102,15,58,15,237,12 -DB 102,69,15,58,15,201,8 -DB 102,69,15,58,15,237,4 - - lea rdi,[16+rdi] - dec rcx - jg NEAR $L$seal_sse_tail_128_rounds_and_x2hash - dec r8 - jge NEAR $L$seal_sse_tail_128_rounds_and_x1hash - paddd xmm1,XMMWORD[$L$chacha20_consts] - paddd xmm5,XMMWORD[((160+48))+rbp] - paddd xmm9,XMMWORD[((160+64))+rbp] - paddd xmm13,XMMWORD[((160+112))+rbp] - paddd xmm0,XMMWORD[$L$chacha20_consts] - paddd xmm4,XMMWORD[((160+48))+rbp] - paddd xmm8,XMMWORD[((160+64))+rbp] - paddd xmm12,XMMWORD[((160+96))+rbp] - movdqu xmm3,XMMWORD[((0 + 0))+rsi] - movdqu xmm7,XMMWORD[((16 + 0))+rsi] - movdqu xmm11,XMMWORD[((32 + 0))+rsi] - movdqu xmm15,XMMWORD[((48 + 0))+rsi] - pxor xmm1,xmm3 - pxor xmm5,xmm7 - pxor xmm9,xmm11 - pxor xmm15,xmm13 - movdqu XMMWORD[(0 + 0)+rdi],xmm1 - movdqu XMMWORD[(16 + 0)+rdi],xmm5 - movdqu XMMWORD[(32 + 0)+rdi],xmm9 - movdqu XMMWORD[(48 + 0)+rdi],xmm15 - - mov rcx,4*16 - sub rbx,4*16 - lea rsi,[64+rsi] - jmp NEAR $L$seal_sse_128_tail_hash - -$L$seal_sse_tail_192: - movdqa xmm0,XMMWORD[$L$chacha20_consts] - movdqa xmm4,XMMWORD[((160+48))+rbp] - movdqa xmm8,XMMWORD[((160+64))+rbp] - movdqa xmm1,xmm0 - movdqa xmm5,xmm4 - movdqa xmm9,xmm8 - movdqa xmm2,xmm0 - movdqa xmm6,xmm4 - movdqa xmm10,xmm8 - movdqa xmm14,XMMWORD[((160+96))+rbp] - paddd xmm14,XMMWORD[$L$sse_inc] - movdqa xmm13,xmm14 - paddd xmm13,XMMWORD[$L$sse_inc] - movdqa xmm12,xmm13 - paddd xmm12,XMMWORD[$L$sse_inc] - movdqa XMMWORD[(160+96)+rbp],xmm12 - movdqa XMMWORD[(160+112)+rbp],xmm13 - movdqa XMMWORD[(160+128)+rbp],xmm14 - -$L$seal_sse_tail_192_rounds_and_x2hash: - add r10,QWORD[((0+0))+rdi] - adc r11,QWORD[((8+0))+rdi] - adc r12,1 - mov rax,QWORD[((0+160+0))+rbp] - mov r15,rax - mul r10 - mov r13,rax - mov r14,rdx - mov rax,QWORD[((0+160+0))+rbp] - mul r11 - imul r15,r12 - add r14,rax - adc r15,rdx - mov rax,QWORD[((8+160+0))+rbp] - mov r9,rax - mul r10 - add r14,rax - adc rdx,0 - mov r10,rdx - mov rax,QWORD[((8+160+0))+rbp] - mul r11 - add r15,rax - adc rdx,0 - imul r9,r12 - add r15,r10 - adc r9,rdx - mov r10,r13 - mov r11,r14 - mov r12,r15 - and r12,3 - mov r13,r15 - and r13,-4 - mov r14,r9 - shrd r15,r9,2 - shr r9,2 - add r15,r13 - adc r9,r14 - add r10,r15 - adc r11,r9 - adc r12,0 - - lea rdi,[16+rdi] -$L$seal_sse_tail_192_rounds_and_x1hash: - paddd xmm0,xmm4 - pxor xmm12,xmm0 - pshufb xmm12,XMMWORD[$L$rol16] - paddd xmm8,xmm12 - pxor xmm4,xmm8 - movdqa xmm3,xmm4 - pslld xmm3,12 - psrld xmm4,20 - pxor xmm4,xmm3 - paddd xmm0,xmm4 - pxor xmm12,xmm0 - pshufb xmm12,XMMWORD[$L$rol8] - paddd xmm8,xmm12 - pxor xmm4,xmm8 - movdqa xmm3,xmm4 - pslld xmm3,7 - psrld xmm4,25 - pxor xmm4,xmm3 -DB 102,15,58,15,228,4 -DB 102,69,15,58,15,192,8 -DB 102,69,15,58,15,228,12 - paddd xmm1,xmm5 - pxor xmm13,xmm1 - pshufb xmm13,XMMWORD[$L$rol16] - paddd xmm9,xmm13 - pxor xmm5,xmm9 - movdqa xmm3,xmm5 - pslld xmm3,12 - psrld xmm5,20 - pxor xmm5,xmm3 - paddd xmm1,xmm5 - pxor xmm13,xmm1 - pshufb xmm13,XMMWORD[$L$rol8] - paddd xmm9,xmm13 - pxor xmm5,xmm9 - movdqa xmm3,xmm5 - pslld xmm3,7 - psrld xmm5,25 - pxor xmm5,xmm3 -DB 102,15,58,15,237,4 -DB 102,69,15,58,15,201,8 -DB 102,69,15,58,15,237,12 - paddd xmm2,xmm6 - pxor xmm14,xmm2 - pshufb xmm14,XMMWORD[$L$rol16] - paddd xmm10,xmm14 - pxor xmm6,xmm10 - movdqa xmm3,xmm6 - pslld xmm3,12 - psrld xmm6,20 - pxor xmm6,xmm3 - paddd xmm2,xmm6 - pxor xmm14,xmm2 - pshufb xmm14,XMMWORD[$L$rol8] - paddd xmm10,xmm14 - pxor xmm6,xmm10 - movdqa xmm3,xmm6 - pslld xmm3,7 - psrld xmm6,25 - pxor xmm6,xmm3 -DB 102,15,58,15,246,4 -DB 102,69,15,58,15,210,8 -DB 102,69,15,58,15,246,12 - add r10,QWORD[((0+0))+rdi] - adc r11,QWORD[((8+0))+rdi] - adc r12,1 - mov rax,QWORD[((0+160+0))+rbp] - mov r15,rax - mul r10 - mov r13,rax - mov r14,rdx - mov rax,QWORD[((0+160+0))+rbp] - mul r11 - imul r15,r12 - add r14,rax - adc r15,rdx - mov rax,QWORD[((8+160+0))+rbp] - mov r9,rax - mul r10 - add r14,rax - adc rdx,0 - mov r10,rdx - mov rax,QWORD[((8+160+0))+rbp] - mul r11 - add r15,rax - adc rdx,0 - imul r9,r12 - add r15,r10 - adc r9,rdx - mov r10,r13 - mov r11,r14 - mov r12,r15 - and r12,3 - mov r13,r15 - and r13,-4 - mov r14,r9 - shrd r15,r9,2 - shr r9,2 - add r15,r13 - adc r9,r14 - add r10,r15 - adc r11,r9 - adc r12,0 - paddd xmm0,xmm4 - pxor xmm12,xmm0 - pshufb xmm12,XMMWORD[$L$rol16] - paddd xmm8,xmm12 - pxor xmm4,xmm8 - movdqa xmm3,xmm4 - pslld xmm3,12 - psrld xmm4,20 - pxor xmm4,xmm3 - paddd xmm0,xmm4 - pxor xmm12,xmm0 - pshufb xmm12,XMMWORD[$L$rol8] - paddd xmm8,xmm12 - pxor xmm4,xmm8 - movdqa xmm3,xmm4 - pslld xmm3,7 - psrld xmm4,25 - pxor xmm4,xmm3 -DB 102,15,58,15,228,12 -DB 102,69,15,58,15,192,8 -DB 102,69,15,58,15,228,4 - paddd xmm1,xmm5 - pxor xmm13,xmm1 - pshufb xmm13,XMMWORD[$L$rol16] - paddd xmm9,xmm13 - pxor xmm5,xmm9 - movdqa xmm3,xmm5 - pslld xmm3,12 - psrld xmm5,20 - pxor xmm5,xmm3 - paddd xmm1,xmm5 - pxor xmm13,xmm1 - pshufb xmm13,XMMWORD[$L$rol8] - paddd xmm9,xmm13 - pxor xmm5,xmm9 - movdqa xmm3,xmm5 - pslld xmm3,7 - psrld xmm5,25 - pxor xmm5,xmm3 -DB 102,15,58,15,237,12 -DB 102,69,15,58,15,201,8 -DB 102,69,15,58,15,237,4 - paddd xmm2,xmm6 - pxor xmm14,xmm2 - pshufb xmm14,XMMWORD[$L$rol16] - paddd xmm10,xmm14 - pxor xmm6,xmm10 - movdqa xmm3,xmm6 - pslld xmm3,12 - psrld xmm6,20 - pxor xmm6,xmm3 - paddd xmm2,xmm6 - pxor xmm14,xmm2 - pshufb xmm14,XMMWORD[$L$rol8] - paddd xmm10,xmm14 - pxor xmm6,xmm10 - movdqa xmm3,xmm6 - pslld xmm3,7 - psrld xmm6,25 - pxor xmm6,xmm3 -DB 102,15,58,15,246,12 -DB 102,69,15,58,15,210,8 -DB 102,69,15,58,15,246,4 - - lea rdi,[16+rdi] - dec rcx - jg NEAR $L$seal_sse_tail_192_rounds_and_x2hash - dec r8 - jge NEAR $L$seal_sse_tail_192_rounds_and_x1hash - paddd xmm2,XMMWORD[$L$chacha20_consts] - paddd xmm6,XMMWORD[((160+48))+rbp] - paddd xmm10,XMMWORD[((160+64))+rbp] - paddd xmm14,XMMWORD[((160+128))+rbp] - paddd xmm1,XMMWORD[$L$chacha20_consts] - paddd xmm5,XMMWORD[((160+48))+rbp] - paddd xmm9,XMMWORD[((160+64))+rbp] - paddd xmm13,XMMWORD[((160+112))+rbp] - paddd xmm0,XMMWORD[$L$chacha20_consts] - paddd xmm4,XMMWORD[((160+48))+rbp] - paddd xmm8,XMMWORD[((160+64))+rbp] - paddd xmm12,XMMWORD[((160+96))+rbp] - movdqu xmm3,XMMWORD[((0 + 0))+rsi] - movdqu xmm7,XMMWORD[((16 + 0))+rsi] - movdqu xmm11,XMMWORD[((32 + 0))+rsi] - movdqu xmm15,XMMWORD[((48 + 0))+rsi] - pxor xmm2,xmm3 - pxor xmm6,xmm7 - pxor xmm10,xmm11 - pxor xmm15,xmm14 - movdqu XMMWORD[(0 + 0)+rdi],xmm2 - movdqu XMMWORD[(16 + 0)+rdi],xmm6 - movdqu XMMWORD[(32 + 0)+rdi],xmm10 - movdqu XMMWORD[(48 + 0)+rdi],xmm15 - movdqu xmm3,XMMWORD[((0 + 64))+rsi] - movdqu xmm7,XMMWORD[((16 + 64))+rsi] - movdqu xmm11,XMMWORD[((32 + 64))+rsi] - movdqu xmm15,XMMWORD[((48 + 64))+rsi] - pxor xmm1,xmm3 - pxor xmm5,xmm7 - pxor xmm9,xmm11 - pxor xmm15,xmm13 - movdqu XMMWORD[(0 + 64)+rdi],xmm1 - movdqu XMMWORD[(16 + 64)+rdi],xmm5 - movdqu XMMWORD[(32 + 64)+rdi],xmm9 - movdqu XMMWORD[(48 + 64)+rdi],xmm15 - - mov rcx,8*16 - sub rbx,8*16 - lea rsi,[128+rsi] - -$L$seal_sse_128_tail_hash: - cmp rcx,16 - jb NEAR $L$seal_sse_128_tail_xor - add r10,QWORD[((0+0))+rdi] - adc r11,QWORD[((8+0))+rdi] - adc r12,1 - mov rax,QWORD[((0+160+0))+rbp] - mov r15,rax - mul r10 - mov r13,rax - mov r14,rdx - mov rax,QWORD[((0+160+0))+rbp] - mul r11 - imul r15,r12 - add r14,rax - adc r15,rdx - mov rax,QWORD[((8+160+0))+rbp] - mov r9,rax - mul r10 - add r14,rax - adc rdx,0 - mov r10,rdx - mov rax,QWORD[((8+160+0))+rbp] - mul r11 - add r15,rax - adc rdx,0 - imul r9,r12 - add r15,r10 - adc r9,rdx - mov r10,r13 - mov r11,r14 - mov r12,r15 - and r12,3 - mov r13,r15 - and r13,-4 - mov r14,r9 - shrd r15,r9,2 - shr r9,2 - add r15,r13 - adc r9,r14 - add r10,r15 - adc r11,r9 - adc r12,0 - - sub rcx,16 - lea rdi,[16+rdi] - jmp NEAR $L$seal_sse_128_tail_hash - -$L$seal_sse_128_tail_xor: - cmp rbx,16 - jb NEAR $L$seal_sse_tail_16 - sub rbx,16 - - movdqu xmm3,XMMWORD[rsi] - pxor xmm0,xmm3 - movdqu XMMWORD[rdi],xmm0 - - add r10,QWORD[rdi] - adc r11,QWORD[8+rdi] - adc r12,1 - lea rsi,[16+rsi] - lea rdi,[16+rdi] - mov rax,QWORD[((0+160+0))+rbp] - mov r15,rax - mul r10 - mov r13,rax - mov r14,rdx - mov rax,QWORD[((0+160+0))+rbp] - mul r11 - imul r15,r12 - add r14,rax - adc r15,rdx - mov rax,QWORD[((8+160+0))+rbp] - mov r9,rax - mul r10 - add r14,rax - adc rdx,0 - mov r10,rdx - mov rax,QWORD[((8+160+0))+rbp] - mul r11 - add r15,rax - adc rdx,0 - imul r9,r12 - add r15,r10 - adc r9,rdx - mov r10,r13 - mov r11,r14 - mov r12,r15 - and r12,3 - mov r13,r15 - and r13,-4 - mov r14,r9 - shrd r15,r9,2 - shr r9,2 - add r15,r13 - adc r9,r14 - add r10,r15 - adc r11,r9 - adc r12,0 - - - movdqa xmm0,xmm4 - movdqa xmm4,xmm8 - movdqa xmm8,xmm12 - movdqa xmm12,xmm1 - movdqa xmm1,xmm5 - movdqa xmm5,xmm9 - movdqa xmm9,xmm13 - jmp NEAR $L$seal_sse_128_tail_xor - -$L$seal_sse_tail_16: - test rbx,rbx - jz NEAR $L$process_blocks_of_extra_in - - mov r8,rbx - mov rcx,rbx - lea rsi,[((-1))+rbx*1+rsi] - pxor xmm15,xmm15 -$L$seal_sse_tail_16_compose: - pslldq xmm15,1 - pinsrb xmm15,BYTE[rsi],0 - lea rsi,[((-1))+rsi] - dec rcx - jne NEAR $L$seal_sse_tail_16_compose - - - pxor xmm15,xmm0 - - - mov rcx,rbx - movdqu xmm0,xmm15 -$L$seal_sse_tail_16_extract: - pextrb XMMWORD[rdi],xmm0,0 - psrldq xmm0,1 - add rdi,1 - sub rcx,1 - jnz NEAR $L$seal_sse_tail_16_extract - - - - - - - - - mov r9,QWORD[((288 + 160 + 32))+rsp] - mov r14,QWORD[56+r9] - mov r13,QWORD[48+r9] - test r14,r14 - jz NEAR $L$process_partial_block - - mov r15,16 - sub r15,rbx - cmp r14,r15 - - jge NEAR $L$load_extra_in - mov r15,r14 - -$L$load_extra_in: - - - lea rsi,[((-1))+r15*1+r13] - - - add r13,r15 - sub r14,r15 - mov QWORD[48+r9],r13 - mov QWORD[56+r9],r14 - - - - add r8,r15 - - - pxor xmm11,xmm11 -$L$load_extra_load_loop: - pslldq xmm11,1 - pinsrb xmm11,BYTE[rsi],0 - lea rsi,[((-1))+rsi] - sub r15,1 - jnz NEAR $L$load_extra_load_loop - - - - - mov r15,rbx - -$L$load_extra_shift_loop: - pslldq xmm11,1 - sub r15,1 - jnz NEAR $L$load_extra_shift_loop - - - - - lea r15,[$L$and_masks] - shl rbx,4 - pand xmm15,XMMWORD[((-16))+rbx*1+r15] - - - por xmm15,xmm11 - - - -DB 102,77,15,126,253 - pextrq r14,xmm15,1 - add r10,r13 - adc r11,r14 - adc r12,1 - mov rax,QWORD[((0+160+0))+rbp] - mov r15,rax - mul r10 - mov r13,rax - mov r14,rdx - mov rax,QWORD[((0+160+0))+rbp] - mul r11 - imul r15,r12 - add r14,rax - adc r15,rdx - mov rax,QWORD[((8+160+0))+rbp] - mov r9,rax - mul r10 - add r14,rax - adc rdx,0 - mov r10,rdx - mov rax,QWORD[((8+160+0))+rbp] - mul r11 - add r15,rax - adc rdx,0 - imul r9,r12 - add r15,r10 - adc r9,rdx - mov r10,r13 - mov r11,r14 - mov r12,r15 - and r12,3 - mov r13,r15 - and r13,-4 - mov r14,r9 - shrd r15,r9,2 - shr r9,2 - add r15,r13 - adc r9,r14 - add r10,r15 - adc r11,r9 - adc r12,0 - - -$L$process_blocks_of_extra_in: - - mov r9,QWORD[((288+32+160 ))+rsp] - mov rsi,QWORD[48+r9] - mov r8,QWORD[56+r9] - mov rcx,r8 - shr r8,4 - -$L$process_extra_hash_loop: - jz NEAR process_extra_in_trailer - add r10,QWORD[((0+0))+rsi] - adc r11,QWORD[((8+0))+rsi] - adc r12,1 - mov rax,QWORD[((0+160+0))+rbp] - mov r15,rax - mul r10 - mov r13,rax - mov r14,rdx - mov rax,QWORD[((0+160+0))+rbp] - mul r11 - imul r15,r12 - add r14,rax - adc r15,rdx - mov rax,QWORD[((8+160+0))+rbp] - mov r9,rax - mul r10 - add r14,rax - adc rdx,0 - mov r10,rdx - mov rax,QWORD[((8+160+0))+rbp] - mul r11 - add r15,rax - adc rdx,0 - imul r9,r12 - add r15,r10 - adc r9,rdx - mov r10,r13 - mov r11,r14 - mov r12,r15 - and r12,3 - mov r13,r15 - and r13,-4 - mov r14,r9 - shrd r15,r9,2 - shr r9,2 - add r15,r13 - adc r9,r14 - add r10,r15 - adc r11,r9 - adc r12,0 - - lea rsi,[16+rsi] - sub r8,1 - jmp NEAR $L$process_extra_hash_loop -process_extra_in_trailer: - and rcx,15 - mov rbx,rcx - jz NEAR $L$do_length_block - lea rsi,[((-1))+rcx*1+rsi] - -$L$process_extra_in_trailer_load: - pslldq xmm15,1 - pinsrb xmm15,BYTE[rsi],0 - lea rsi,[((-1))+rsi] - sub rcx,1 - jnz NEAR $L$process_extra_in_trailer_load - -$L$process_partial_block: - - lea r15,[$L$and_masks] - shl rbx,4 - pand xmm15,XMMWORD[((-16))+rbx*1+r15] -DB 102,77,15,126,253 - pextrq r14,xmm15,1 - add r10,r13 - adc r11,r14 - adc r12,1 - mov rax,QWORD[((0+160+0))+rbp] - mov r15,rax - mul r10 - mov r13,rax - mov r14,rdx - mov rax,QWORD[((0+160+0))+rbp] - mul r11 - imul r15,r12 - add r14,rax - adc r15,rdx - mov rax,QWORD[((8+160+0))+rbp] - mov r9,rax - mul r10 - add r14,rax - adc rdx,0 - mov r10,rdx - mov rax,QWORD[((8+160+0))+rbp] - mul r11 - add r15,rax - adc rdx,0 - imul r9,r12 - add r15,r10 - adc r9,rdx - mov r10,r13 - mov r11,r14 - mov r12,r15 - and r12,3 - mov r13,r15 - and r13,-4 - mov r14,r9 - shrd r15,r9,2 - shr r9,2 - add r15,r13 - adc r9,r14 - add r10,r15 - adc r11,r9 - adc r12,0 - - -$L$do_length_block: - add r10,QWORD[((0+160+32))+rbp] - adc r11,QWORD[((8+160+32))+rbp] - adc r12,1 - mov rax,QWORD[((0+160+0))+rbp] - mov r15,rax - mul r10 - mov r13,rax - mov r14,rdx - mov rax,QWORD[((0+160+0))+rbp] - mul r11 - imul r15,r12 - add r14,rax - adc r15,rdx - mov rax,QWORD[((8+160+0))+rbp] - mov r9,rax - mul r10 - add r14,rax - adc rdx,0 - mov r10,rdx - mov rax,QWORD[((8+160+0))+rbp] - mul r11 - add r15,rax - adc rdx,0 - imul r9,r12 - add r15,r10 - adc r9,rdx - mov r10,r13 - mov r11,r14 - mov r12,r15 - and r12,3 - mov r13,r15 - and r13,-4 - mov r14,r9 - shrd r15,r9,2 - shr r9,2 - add r15,r13 - adc r9,r14 - add r10,r15 - adc r11,r9 - adc r12,0 - - - mov r13,r10 - mov r14,r11 - mov r15,r12 - sub r10,-5 - sbb r11,-1 - sbb r12,3 - cmovc r10,r13 - cmovc r11,r14 - cmovc r12,r15 - - add r10,QWORD[((0+160+16))+rbp] - adc r11,QWORD[((8+160+16))+rbp] - - movaps xmm6,XMMWORD[((0+0))+rbp] - movaps xmm7,XMMWORD[((16+0))+rbp] - movaps xmm8,XMMWORD[((32+0))+rbp] - movaps xmm9,XMMWORD[((48+0))+rbp] - movaps xmm10,XMMWORD[((64+0))+rbp] - movaps xmm11,XMMWORD[((80+0))+rbp] - movaps xmm12,XMMWORD[((96+0))+rbp] - movaps xmm13,XMMWORD[((112+0))+rbp] - movaps xmm14,XMMWORD[((128+0))+rbp] - movaps xmm15,XMMWORD[((144+0))+rbp] - - - add rsp,288 + 160 + 32 - - - pop r9 - - mov QWORD[r9],r10 - mov QWORD[8+r9],r11 - pop r15 - - pop r14 - - pop r13 - - pop r12 - - pop rbx - - pop rbp - - mov rdi,QWORD[8+rsp] ;WIN64 epilogue - mov rsi,QWORD[16+rsp] - DB 0F3h,0C3h ;repret - -$L$seal_sse_128: - - movdqu xmm0,XMMWORD[$L$chacha20_consts] - movdqa xmm1,xmm0 - movdqa xmm2,xmm0 - movdqu xmm4,XMMWORD[r9] - movdqa xmm5,xmm4 - movdqa xmm6,xmm4 - movdqu xmm8,XMMWORD[16+r9] - movdqa xmm9,xmm8 - movdqa xmm10,xmm8 - movdqu xmm14,XMMWORD[32+r9] - movdqa xmm12,xmm14 - paddd xmm12,XMMWORD[$L$sse_inc] - movdqa xmm13,xmm12 - paddd xmm13,XMMWORD[$L$sse_inc] - movdqa xmm7,xmm4 - movdqa xmm11,xmm8 - movdqa xmm15,xmm12 - mov r10,10 - -$L$seal_sse_128_rounds: - paddd xmm0,xmm4 - pxor xmm12,xmm0 - pshufb xmm12,XMMWORD[$L$rol16] - paddd xmm8,xmm12 - pxor xmm4,xmm8 - movdqa xmm3,xmm4 - pslld xmm3,12 - psrld xmm4,20 - pxor xmm4,xmm3 - paddd xmm0,xmm4 - pxor xmm12,xmm0 - pshufb xmm12,XMMWORD[$L$rol8] - paddd xmm8,xmm12 - pxor xmm4,xmm8 - movdqa xmm3,xmm4 - pslld xmm3,7 - psrld xmm4,25 - pxor xmm4,xmm3 -DB 102,15,58,15,228,4 -DB 102,69,15,58,15,192,8 -DB 102,69,15,58,15,228,12 - paddd xmm1,xmm5 - pxor xmm13,xmm1 - pshufb xmm13,XMMWORD[$L$rol16] - paddd xmm9,xmm13 - pxor xmm5,xmm9 - movdqa xmm3,xmm5 - pslld xmm3,12 - psrld xmm5,20 - pxor xmm5,xmm3 - paddd xmm1,xmm5 - pxor xmm13,xmm1 - pshufb xmm13,XMMWORD[$L$rol8] - paddd xmm9,xmm13 - pxor xmm5,xmm9 - movdqa xmm3,xmm5 - pslld xmm3,7 - psrld xmm5,25 - pxor xmm5,xmm3 -DB 102,15,58,15,237,4 -DB 102,69,15,58,15,201,8 -DB 102,69,15,58,15,237,12 - paddd xmm2,xmm6 - pxor xmm14,xmm2 - pshufb xmm14,XMMWORD[$L$rol16] - paddd xmm10,xmm14 - pxor xmm6,xmm10 - movdqa xmm3,xmm6 - pslld xmm3,12 - psrld xmm6,20 - pxor xmm6,xmm3 - paddd xmm2,xmm6 - pxor xmm14,xmm2 - pshufb xmm14,XMMWORD[$L$rol8] - paddd xmm10,xmm14 - pxor xmm6,xmm10 - movdqa xmm3,xmm6 - pslld xmm3,7 - psrld xmm6,25 - pxor xmm6,xmm3 -DB 102,15,58,15,246,4 -DB 102,69,15,58,15,210,8 -DB 102,69,15,58,15,246,12 - paddd xmm0,xmm4 - pxor xmm12,xmm0 - pshufb xmm12,XMMWORD[$L$rol16] - paddd xmm8,xmm12 - pxor xmm4,xmm8 - movdqa xmm3,xmm4 - pslld xmm3,12 - psrld xmm4,20 - pxor xmm4,xmm3 - paddd xmm0,xmm4 - pxor xmm12,xmm0 - pshufb xmm12,XMMWORD[$L$rol8] - paddd xmm8,xmm12 - pxor xmm4,xmm8 - movdqa xmm3,xmm4 - pslld xmm3,7 - psrld xmm4,25 - pxor xmm4,xmm3 -DB 102,15,58,15,228,12 -DB 102,69,15,58,15,192,8 -DB 102,69,15,58,15,228,4 - paddd xmm1,xmm5 - pxor xmm13,xmm1 - pshufb xmm13,XMMWORD[$L$rol16] - paddd xmm9,xmm13 - pxor xmm5,xmm9 - movdqa xmm3,xmm5 - pslld xmm3,12 - psrld xmm5,20 - pxor xmm5,xmm3 - paddd xmm1,xmm5 - pxor xmm13,xmm1 - pshufb xmm13,XMMWORD[$L$rol8] - paddd xmm9,xmm13 - pxor xmm5,xmm9 - movdqa xmm3,xmm5 - pslld xmm3,7 - psrld xmm5,25 - pxor xmm5,xmm3 -DB 102,15,58,15,237,12 -DB 102,69,15,58,15,201,8 -DB 102,69,15,58,15,237,4 - paddd xmm2,xmm6 - pxor xmm14,xmm2 - pshufb xmm14,XMMWORD[$L$rol16] - paddd xmm10,xmm14 - pxor xmm6,xmm10 - movdqa xmm3,xmm6 - pslld xmm3,12 - psrld xmm6,20 - pxor xmm6,xmm3 - paddd xmm2,xmm6 - pxor xmm14,xmm2 - pshufb xmm14,XMMWORD[$L$rol8] - paddd xmm10,xmm14 - pxor xmm6,xmm10 - movdqa xmm3,xmm6 - pslld xmm3,7 - psrld xmm6,25 - pxor xmm6,xmm3 -DB 102,15,58,15,246,12 -DB 102,69,15,58,15,210,8 -DB 102,69,15,58,15,246,4 - - dec r10 - jnz NEAR $L$seal_sse_128_rounds - paddd xmm0,XMMWORD[$L$chacha20_consts] - paddd xmm1,XMMWORD[$L$chacha20_consts] - paddd xmm2,XMMWORD[$L$chacha20_consts] - paddd xmm4,xmm7 - paddd xmm5,xmm7 - paddd xmm6,xmm7 - paddd xmm8,xmm11 - paddd xmm9,xmm11 - paddd xmm12,xmm15 - paddd xmm15,XMMWORD[$L$sse_inc] - paddd xmm13,xmm15 - - pand xmm2,XMMWORD[$L$clamp] - movdqa XMMWORD[(160+0)+rbp],xmm2 - movdqa XMMWORD[(160+16)+rbp],xmm6 - - mov r8,r8 - call poly_hash_ad_internal - jmp NEAR $L$seal_sse_128_tail_xor -$L$SEH_end_GFp_chacha20_poly1305_seal: - - - - -ALIGN 64 -chacha20_poly1305_open_avx2: - - - - - - - - - - - - - vzeroupper - vmovdqa ymm0,YMMWORD[$L$chacha20_consts] - vbroadcasti128 ymm4,XMMWORD[r9] - vbroadcasti128 ymm8,XMMWORD[16+r9] - vbroadcasti128 ymm12,XMMWORD[32+r9] - vpaddd ymm12,ymm12,YMMWORD[$L$avx2_init] - cmp rbx,6*32 - jbe NEAR $L$open_avx2_192 - cmp rbx,10*32 - jbe NEAR $L$open_avx2_320 - - vmovdqa YMMWORD[(160+64)+rbp],ymm4 - vmovdqa YMMWORD[(160+96)+rbp],ymm8 - vmovdqa YMMWORD[(160+160)+rbp],ymm12 - mov r10,10 -$L$open_avx2_init_rounds: - vpaddd ymm0,ymm0,ymm4 - vpxor ymm12,ymm12,ymm0 - vpshufb ymm12,ymm12,YMMWORD[$L$rol16] - vpaddd ymm8,ymm8,ymm12 - vpxor ymm4,ymm4,ymm8 - vpsrld ymm3,ymm4,20 - vpslld ymm4,ymm4,12 - vpxor ymm4,ymm4,ymm3 - vpaddd ymm0,ymm0,ymm4 - vpxor ymm12,ymm12,ymm0 - vpshufb ymm12,ymm12,YMMWORD[$L$rol8] - vpaddd ymm8,ymm8,ymm12 - vpxor ymm4,ymm4,ymm8 - vpslld ymm3,ymm4,7 - vpsrld ymm4,ymm4,25 - vpxor ymm4,ymm4,ymm3 - vpalignr ymm12,ymm12,ymm12,12 - vpalignr ymm8,ymm8,ymm8,8 - vpalignr ymm4,ymm4,ymm4,4 - vpaddd ymm0,ymm0,ymm4 - vpxor ymm12,ymm12,ymm0 - vpshufb ymm12,ymm12,YMMWORD[$L$rol16] - vpaddd ymm8,ymm8,ymm12 - vpxor ymm4,ymm4,ymm8 - vpsrld ymm3,ymm4,20 - vpslld ymm4,ymm4,12 - vpxor ymm4,ymm4,ymm3 - vpaddd ymm0,ymm0,ymm4 - vpxor ymm12,ymm12,ymm0 - vpshufb ymm12,ymm12,YMMWORD[$L$rol8] - vpaddd ymm8,ymm8,ymm12 - vpxor ymm4,ymm4,ymm8 - vpslld ymm3,ymm4,7 - vpsrld ymm4,ymm4,25 - vpxor ymm4,ymm4,ymm3 - vpalignr ymm12,ymm12,ymm12,4 - vpalignr ymm8,ymm8,ymm8,8 - vpalignr ymm4,ymm4,ymm4,12 - - dec r10 - jne NEAR $L$open_avx2_init_rounds - vpaddd ymm0,ymm0,YMMWORD[$L$chacha20_consts] - vpaddd ymm4,ymm4,YMMWORD[((160+64))+rbp] - vpaddd ymm8,ymm8,YMMWORD[((160+96))+rbp] - vpaddd ymm12,ymm12,YMMWORD[((160+160))+rbp] - - vperm2i128 ymm3,ymm4,ymm0,0x02 - - vpand ymm3,ymm3,YMMWORD[$L$clamp] - vmovdqa YMMWORD[(160+0)+rbp],ymm3 - - vperm2i128 ymm0,ymm4,ymm0,0x13 - vperm2i128 ymm4,ymm12,ymm8,0x13 - - mov r8,r8 - call poly_hash_ad_internal - - xor rcx,rcx -$L$open_avx2_init_hash: - add r10,QWORD[((0+0))+rcx*1+rsi] - adc r11,QWORD[((8+0))+rcx*1+rsi] - adc r12,1 - mov rax,QWORD[((0+160+0))+rbp] - mov r15,rax - mul r10 - mov r13,rax - mov r14,rdx - mov rax,QWORD[((0+160+0))+rbp] - mul r11 - imul r15,r12 - add r14,rax - adc r15,rdx - mov rax,QWORD[((8+160+0))+rbp] - mov r9,rax - mul r10 - add r14,rax - adc rdx,0 - mov r10,rdx - mov rax,QWORD[((8+160+0))+rbp] - mul r11 - add r15,rax - adc rdx,0 - imul r9,r12 - add r15,r10 - adc r9,rdx - mov r10,r13 - mov r11,r14 - mov r12,r15 - and r12,3 - mov r13,r15 - and r13,-4 - mov r14,r9 - shrd r15,r9,2 - shr r9,2 - add r15,r13 - adc r9,r14 - add r10,r15 - adc r11,r9 - adc r12,0 - - add rcx,16 - cmp rcx,2*32 - jne NEAR $L$open_avx2_init_hash - - vpxor ymm0,ymm0,YMMWORD[rsi] - vpxor ymm4,ymm4,YMMWORD[32+rsi] - - vmovdqu YMMWORD[rdi],ymm0 - vmovdqu YMMWORD[32+rdi],ymm4 - lea rsi,[64+rsi] - lea rdi,[64+rdi] - sub rbx,2*32 -$L$open_avx2_main_loop: - - cmp rbx,16*32 - jb NEAR $L$open_avx2_main_loop_done - vmovdqa ymm0,YMMWORD[$L$chacha20_consts] - vmovdqa ymm4,YMMWORD[((160+64))+rbp] - vmovdqa ymm8,YMMWORD[((160+96))+rbp] - vmovdqa ymm1,ymm0 - vmovdqa ymm5,ymm4 - vmovdqa ymm9,ymm8 - vmovdqa ymm2,ymm0 - vmovdqa ymm6,ymm4 - vmovdqa ymm10,ymm8 - vmovdqa ymm3,ymm0 - vmovdqa ymm7,ymm4 - vmovdqa ymm11,ymm8 - vmovdqa ymm12,YMMWORD[$L$avx2_inc] - vpaddd ymm15,ymm12,YMMWORD[((160+160))+rbp] - vpaddd ymm14,ymm12,ymm15 - vpaddd ymm13,ymm12,ymm14 - vpaddd ymm12,ymm12,ymm13 - vmovdqa YMMWORD[(160+256)+rbp],ymm15 - vmovdqa YMMWORD[(160+224)+rbp],ymm14 - vmovdqa YMMWORD[(160+192)+rbp],ymm13 - vmovdqa YMMWORD[(160+160)+rbp],ymm12 - - xor rcx,rcx -$L$open_avx2_main_loop_rounds: - add r10,QWORD[((0+0))+rcx*1+rsi] - adc r11,QWORD[((8+0))+rcx*1+rsi] - adc r12,1 - vmovdqa YMMWORD[(160+128)+rbp],ymm8 - vmovdqa ymm8,YMMWORD[$L$rol16] - vpaddd ymm3,ymm3,ymm7 - vpaddd ymm2,ymm2,ymm6 - vpaddd ymm1,ymm1,ymm5 - vpaddd ymm0,ymm0,ymm4 - vpxor ymm15,ymm15,ymm3 - vpxor ymm14,ymm14,ymm2 - vpxor ymm13,ymm13,ymm1 - vpxor ymm12,ymm12,ymm0 - mov rdx,QWORD[((0+160+0))+rbp] - mov r15,rdx - mulx r14,r13,r10 - mulx rdx,rax,r11 - imul r15,r12 - add r14,rax - adc r15,rdx - vpshufb ymm15,ymm15,ymm8 - vpshufb ymm14,ymm14,ymm8 - vpshufb ymm13,ymm13,ymm8 - vpshufb ymm12,ymm12,ymm8 - vpaddd ymm11,ymm11,ymm15 - vpaddd ymm10,ymm10,ymm14 - vpaddd ymm9,ymm9,ymm13 - vpaddd ymm8,ymm12,YMMWORD[((160+128))+rbp] - vpxor ymm7,ymm7,ymm11 - mov rdx,QWORD[((8+160+0))+rbp] - mulx rax,r10,r10 - add r14,r10 - mulx r9,r11,r11 - adc r15,r11 - adc r9,0 - imul rdx,r12 - vpxor ymm6,ymm6,ymm10 - vpxor ymm5,ymm5,ymm9 - vpxor ymm4,ymm4,ymm8 - vmovdqa YMMWORD[(160+128)+rbp],ymm8 - vpsrld ymm8,ymm7,20 - vpslld ymm7,ymm7,32-20 - vpxor ymm7,ymm7,ymm8 - vpsrld ymm8,ymm6,20 - vpslld ymm6,ymm6,32-20 - vpxor ymm6,ymm6,ymm8 - vpsrld ymm8,ymm5,20 - vpslld ymm5,ymm5,32-20 - add r15,rax - adc r9,rdx - vpxor ymm5,ymm5,ymm8 - vpsrld ymm8,ymm4,20 - vpslld ymm4,ymm4,32-20 - vpxor ymm4,ymm4,ymm8 - vmovdqa ymm8,YMMWORD[$L$rol8] - vpaddd ymm3,ymm3,ymm7 - vpaddd ymm2,ymm2,ymm6 - vpaddd ymm1,ymm1,ymm5 - vpaddd ymm0,ymm0,ymm4 - vpxor ymm15,ymm15,ymm3 - mov r10,r13 - mov r11,r14 - mov r12,r15 - and r12,3 - mov r13,r15 - and r13,-4 - mov r14,r9 - shrd r15,r9,2 - shr r9,2 - add r15,r13 - adc r9,r14 - add r10,r15 - adc r11,r9 - adc r12,0 - vpxor ymm14,ymm14,ymm2 - vpxor ymm13,ymm13,ymm1 - vpxor ymm12,ymm12,ymm0 - vpshufb ymm15,ymm15,ymm8 - vpshufb ymm14,ymm14,ymm8 - vpshufb ymm13,ymm13,ymm8 - vpshufb ymm12,ymm12,ymm8 - vpaddd ymm11,ymm11,ymm15 - vpaddd ymm10,ymm10,ymm14 - add r10,QWORD[((0+16))+rcx*1+rsi] - adc r11,QWORD[((8+16))+rcx*1+rsi] - adc r12,1 - vpaddd ymm9,ymm9,ymm13 - vpaddd ymm8,ymm12,YMMWORD[((160+128))+rbp] - vpxor ymm7,ymm7,ymm11 - vpxor ymm6,ymm6,ymm10 - vpxor ymm5,ymm5,ymm9 - vpxor ymm4,ymm4,ymm8 - vmovdqa YMMWORD[(160+128)+rbp],ymm8 - vpsrld ymm8,ymm7,25 - mov rdx,QWORD[((0+160+0))+rbp] - mov r15,rdx - mulx r14,r13,r10 - mulx rdx,rax,r11 - imul r15,r12 - add r14,rax - adc r15,rdx - vpslld ymm7,ymm7,32-25 - vpxor ymm7,ymm7,ymm8 - vpsrld ymm8,ymm6,25 - vpslld ymm6,ymm6,32-25 - vpxor ymm6,ymm6,ymm8 - vpsrld ymm8,ymm5,25 - vpslld ymm5,ymm5,32-25 - vpxor ymm5,ymm5,ymm8 - vpsrld ymm8,ymm4,25 - vpslld ymm4,ymm4,32-25 - vpxor ymm4,ymm4,ymm8 - vmovdqa ymm8,YMMWORD[((160+128))+rbp] - vpalignr ymm7,ymm7,ymm7,4 - vpalignr ymm11,ymm11,ymm11,8 - vpalignr ymm15,ymm15,ymm15,12 - vpalignr ymm6,ymm6,ymm6,4 - vpalignr ymm10,ymm10,ymm10,8 - vpalignr ymm14,ymm14,ymm14,12 - mov rdx,QWORD[((8+160+0))+rbp] - mulx rax,r10,r10 - add r14,r10 - mulx r9,r11,r11 - adc r15,r11 - adc r9,0 - imul rdx,r12 - vpalignr ymm5,ymm5,ymm5,4 - vpalignr ymm9,ymm9,ymm9,8 - vpalignr ymm13,ymm13,ymm13,12 - vpalignr ymm4,ymm4,ymm4,4 - vpalignr ymm8,ymm8,ymm8,8 - vpalignr ymm12,ymm12,ymm12,12 - vmovdqa YMMWORD[(160+128)+rbp],ymm8 - vmovdqa ymm8,YMMWORD[$L$rol16] - vpaddd ymm3,ymm3,ymm7 - vpaddd ymm2,ymm2,ymm6 - vpaddd ymm1,ymm1,ymm5 - vpaddd ymm0,ymm0,ymm4 - vpxor ymm15,ymm15,ymm3 - vpxor ymm14,ymm14,ymm2 - vpxor ymm13,ymm13,ymm1 - vpxor ymm12,ymm12,ymm0 - vpshufb ymm15,ymm15,ymm8 - vpshufb ymm14,ymm14,ymm8 - add r15,rax - adc r9,rdx - vpshufb ymm13,ymm13,ymm8 - vpshufb ymm12,ymm12,ymm8 - vpaddd ymm11,ymm11,ymm15 - vpaddd ymm10,ymm10,ymm14 - vpaddd ymm9,ymm9,ymm13 - vpaddd ymm8,ymm12,YMMWORD[((160+128))+rbp] - vpxor ymm7,ymm7,ymm11 - vpxor ymm6,ymm6,ymm10 - vpxor ymm5,ymm5,ymm9 - mov r10,r13 - mov r11,r14 - mov r12,r15 - and r12,3 - mov r13,r15 - and r13,-4 - mov r14,r9 - shrd r15,r9,2 - shr r9,2 - add r15,r13 - adc r9,r14 - add r10,r15 - adc r11,r9 - adc r12,0 - vpxor ymm4,ymm4,ymm8 - vmovdqa YMMWORD[(160+128)+rbp],ymm8 - vpsrld ymm8,ymm7,20 - vpslld ymm7,ymm7,32-20 - vpxor ymm7,ymm7,ymm8 - vpsrld ymm8,ymm6,20 - vpslld ymm6,ymm6,32-20 - vpxor ymm6,ymm6,ymm8 - add r10,QWORD[((0+32))+rcx*1+rsi] - adc r11,QWORD[((8+32))+rcx*1+rsi] - adc r12,1 - - lea rcx,[48+rcx] - vpsrld ymm8,ymm5,20 - vpslld ymm5,ymm5,32-20 - vpxor ymm5,ymm5,ymm8 - vpsrld ymm8,ymm4,20 - vpslld ymm4,ymm4,32-20 - vpxor ymm4,ymm4,ymm8 - vmovdqa ymm8,YMMWORD[$L$rol8] - vpaddd ymm3,ymm3,ymm7 - vpaddd ymm2,ymm2,ymm6 - vpaddd ymm1,ymm1,ymm5 - vpaddd ymm0,ymm0,ymm4 - vpxor ymm15,ymm15,ymm3 - vpxor ymm14,ymm14,ymm2 - vpxor ymm13,ymm13,ymm1 - vpxor ymm12,ymm12,ymm0 - vpshufb ymm15,ymm15,ymm8 - vpshufb ymm14,ymm14,ymm8 - vpshufb ymm13,ymm13,ymm8 - mov rdx,QWORD[((0+160+0))+rbp] - mov r15,rdx - mulx r14,r13,r10 - mulx rdx,rax,r11 - imul r15,r12 - add r14,rax - adc r15,rdx - vpshufb ymm12,ymm12,ymm8 - vpaddd ymm11,ymm11,ymm15 - vpaddd ymm10,ymm10,ymm14 - vpaddd ymm9,ymm9,ymm13 - vpaddd ymm8,ymm12,YMMWORD[((160+128))+rbp] - vpxor ymm7,ymm7,ymm11 - vpxor ymm6,ymm6,ymm10 - vpxor ymm5,ymm5,ymm9 - mov rdx,QWORD[((8+160+0))+rbp] - mulx rax,r10,r10 - add r14,r10 - mulx r9,r11,r11 - adc r15,r11 - adc r9,0 - imul rdx,r12 - vpxor ymm4,ymm4,ymm8 - vmovdqa YMMWORD[(160+128)+rbp],ymm8 - vpsrld ymm8,ymm7,25 - vpslld ymm7,ymm7,32-25 - vpxor ymm7,ymm7,ymm8 - vpsrld ymm8,ymm6,25 - vpslld ymm6,ymm6,32-25 - vpxor ymm6,ymm6,ymm8 - add r15,rax - adc r9,rdx - vpsrld ymm8,ymm5,25 - vpslld ymm5,ymm5,32-25 - vpxor ymm5,ymm5,ymm8 - vpsrld ymm8,ymm4,25 - vpslld ymm4,ymm4,32-25 - vpxor ymm4,ymm4,ymm8 - vmovdqa ymm8,YMMWORD[((160+128))+rbp] - vpalignr ymm7,ymm7,ymm7,12 - vpalignr ymm11,ymm11,ymm11,8 - vpalignr ymm15,ymm15,ymm15,4 - vpalignr ymm6,ymm6,ymm6,12 - vpalignr ymm10,ymm10,ymm10,8 - vpalignr ymm14,ymm14,ymm14,4 - vpalignr ymm5,ymm5,ymm5,12 - vpalignr ymm9,ymm9,ymm9,8 - vpalignr ymm13,ymm13,ymm13,4 - vpalignr ymm4,ymm4,ymm4,12 - vpalignr ymm8,ymm8,ymm8,8 - mov r10,r13 - mov r11,r14 - mov r12,r15 - and r12,3 - mov r13,r15 - and r13,-4 - mov r14,r9 - shrd r15,r9,2 - shr r9,2 - add r15,r13 - adc r9,r14 - add r10,r15 - adc r11,r9 - adc r12,0 - vpalignr ymm12,ymm12,ymm12,4 - - cmp rcx,10*6*8 - jne NEAR $L$open_avx2_main_loop_rounds - vpaddd ymm3,ymm3,YMMWORD[$L$chacha20_consts] - vpaddd ymm7,ymm7,YMMWORD[((160+64))+rbp] - vpaddd ymm11,ymm11,YMMWORD[((160+96))+rbp] - vpaddd ymm15,ymm15,YMMWORD[((160+256))+rbp] - vpaddd ymm2,ymm2,YMMWORD[$L$chacha20_consts] - vpaddd ymm6,ymm6,YMMWORD[((160+64))+rbp] - vpaddd ymm10,ymm10,YMMWORD[((160+96))+rbp] - vpaddd ymm14,ymm14,YMMWORD[((160+224))+rbp] - vpaddd ymm1,ymm1,YMMWORD[$L$chacha20_consts] - vpaddd ymm5,ymm5,YMMWORD[((160+64))+rbp] - vpaddd ymm9,ymm9,YMMWORD[((160+96))+rbp] - vpaddd ymm13,ymm13,YMMWORD[((160+192))+rbp] - vpaddd ymm0,ymm0,YMMWORD[$L$chacha20_consts] - vpaddd ymm4,ymm4,YMMWORD[((160+64))+rbp] - vpaddd ymm8,ymm8,YMMWORD[((160+96))+rbp] - vpaddd ymm12,ymm12,YMMWORD[((160+160))+rbp] - - vmovdqa YMMWORD[(160+128)+rbp],ymm0 - add r10,QWORD[((0+480))+rsi] - adc r11,QWORD[((8+480))+rsi] - adc r12,1 - vperm2i128 ymm0,ymm7,ymm3,0x02 - vperm2i128 ymm7,ymm7,ymm3,0x13 - vperm2i128 ymm3,ymm15,ymm11,0x02 - vperm2i128 ymm11,ymm15,ymm11,0x13 - vpxor ymm0,ymm0,YMMWORD[((0+0))+rsi] - vpxor ymm3,ymm3,YMMWORD[((32+0))+rsi] - vpxor ymm7,ymm7,YMMWORD[((64+0))+rsi] - vpxor ymm11,ymm11,YMMWORD[((96+0))+rsi] - vmovdqu YMMWORD[(0+0)+rdi],ymm0 - vmovdqu YMMWORD[(32+0)+rdi],ymm3 - vmovdqu YMMWORD[(64+0)+rdi],ymm7 - vmovdqu YMMWORD[(96+0)+rdi],ymm11 - - vmovdqa ymm0,YMMWORD[((160+128))+rbp] - mov rax,QWORD[((0+160+0))+rbp] - mov r15,rax - mul r10 - mov r13,rax - mov r14,rdx - mov rax,QWORD[((0+160+0))+rbp] - mul r11 - imul r15,r12 - add r14,rax - adc r15,rdx - mov rax,QWORD[((8+160+0))+rbp] - mov r9,rax - mul r10 - add r14,rax - adc rdx,0 - mov r10,rdx - mov rax,QWORD[((8+160+0))+rbp] - mul r11 - add r15,rax - adc rdx,0 - imul r9,r12 - add r15,r10 - adc r9,rdx - mov r10,r13 - mov r11,r14 - mov r12,r15 - and r12,3 - mov r13,r15 - and r13,-4 - mov r14,r9 - shrd r15,r9,2 - shr r9,2 - add r15,r13 - adc r9,r14 - add r10,r15 - adc r11,r9 - adc r12,0 - vperm2i128 ymm3,ymm6,ymm2,0x02 - vperm2i128 ymm6,ymm6,ymm2,0x13 - vperm2i128 ymm2,ymm14,ymm10,0x02 - vperm2i128 ymm10,ymm14,ymm10,0x13 - vpxor ymm3,ymm3,YMMWORD[((0+128))+rsi] - vpxor ymm2,ymm2,YMMWORD[((32+128))+rsi] - vpxor ymm6,ymm6,YMMWORD[((64+128))+rsi] - vpxor ymm10,ymm10,YMMWORD[((96+128))+rsi] - vmovdqu YMMWORD[(0+128)+rdi],ymm3 - vmovdqu YMMWORD[(32+128)+rdi],ymm2 - vmovdqu YMMWORD[(64+128)+rdi],ymm6 - vmovdqu YMMWORD[(96+128)+rdi],ymm10 - add r10,QWORD[((0+480+16))+rsi] - adc r11,QWORD[((8+480+16))+rsi] - adc r12,1 - vperm2i128 ymm3,ymm5,ymm1,0x02 - vperm2i128 ymm5,ymm5,ymm1,0x13 - vperm2i128 ymm1,ymm13,ymm9,0x02 - vperm2i128 ymm9,ymm13,ymm9,0x13 - vpxor ymm3,ymm3,YMMWORD[((0+256))+rsi] - vpxor ymm1,ymm1,YMMWORD[((32+256))+rsi] - vpxor ymm5,ymm5,YMMWORD[((64+256))+rsi] - vpxor ymm9,ymm9,YMMWORD[((96+256))+rsi] - vmovdqu YMMWORD[(0+256)+rdi],ymm3 - vmovdqu YMMWORD[(32+256)+rdi],ymm1 - vmovdqu YMMWORD[(64+256)+rdi],ymm5 - vmovdqu YMMWORD[(96+256)+rdi],ymm9 - mov rax,QWORD[((0+160+0))+rbp] - mov r15,rax - mul r10 - mov r13,rax - mov r14,rdx - mov rax,QWORD[((0+160+0))+rbp] - mul r11 - imul r15,r12 - add r14,rax - adc r15,rdx - mov rax,QWORD[((8+160+0))+rbp] - mov r9,rax - mul r10 - add r14,rax - adc rdx,0 - mov r10,rdx - mov rax,QWORD[((8+160+0))+rbp] - mul r11 - add r15,rax - adc rdx,0 - imul r9,r12 - add r15,r10 - adc r9,rdx - mov r10,r13 - mov r11,r14 - mov r12,r15 - and r12,3 - mov r13,r15 - and r13,-4 - mov r14,r9 - shrd r15,r9,2 - shr r9,2 - add r15,r13 - adc r9,r14 - add r10,r15 - adc r11,r9 - adc r12,0 - vperm2i128 ymm3,ymm4,ymm0,0x02 - vperm2i128 ymm4,ymm4,ymm0,0x13 - vperm2i128 ymm0,ymm12,ymm8,0x02 - vperm2i128 ymm8,ymm12,ymm8,0x13 - vpxor ymm3,ymm3,YMMWORD[((0+384))+rsi] - vpxor ymm0,ymm0,YMMWORD[((32+384))+rsi] - vpxor ymm4,ymm4,YMMWORD[((64+384))+rsi] - vpxor ymm8,ymm8,YMMWORD[((96+384))+rsi] - vmovdqu YMMWORD[(0+384)+rdi],ymm3 - vmovdqu YMMWORD[(32+384)+rdi],ymm0 - vmovdqu YMMWORD[(64+384)+rdi],ymm4 - vmovdqu YMMWORD[(96+384)+rdi],ymm8 - - lea rsi,[512+rsi] - lea rdi,[512+rdi] - sub rbx,16*32 - jmp NEAR $L$open_avx2_main_loop -$L$open_avx2_main_loop_done: - test rbx,rbx - vzeroupper - je NEAR $L$open_sse_finalize - - cmp rbx,12*32 - ja NEAR $L$open_avx2_tail_512 - cmp rbx,8*32 - ja NEAR $L$open_avx2_tail_384 - cmp rbx,4*32 - ja NEAR $L$open_avx2_tail_256 - vmovdqa ymm0,YMMWORD[$L$chacha20_consts] - vmovdqa ymm4,YMMWORD[((160+64))+rbp] - vmovdqa ymm8,YMMWORD[((160+96))+rbp] - vmovdqa ymm12,YMMWORD[$L$avx2_inc] - vpaddd ymm12,ymm12,YMMWORD[((160+160))+rbp] - vmovdqa YMMWORD[(160+160)+rbp],ymm12 - - xor r8,r8 - mov rcx,rbx - and rcx,-16 - test rcx,rcx - je NEAR $L$open_avx2_tail_128_rounds -$L$open_avx2_tail_128_rounds_and_x1hash: - add r10,QWORD[((0+0))+r8*1+rsi] - adc r11,QWORD[((8+0))+r8*1+rsi] - adc r12,1 - mov rax,QWORD[((0+160+0))+rbp] - mov r15,rax - mul r10 - mov r13,rax - mov r14,rdx - mov rax,QWORD[((0+160+0))+rbp] - mul r11 - imul r15,r12 - add r14,rax - adc r15,rdx - mov rax,QWORD[((8+160+0))+rbp] - mov r9,rax - mul r10 - add r14,rax - adc rdx,0 - mov r10,rdx - mov rax,QWORD[((8+160+0))+rbp] - mul r11 - add r15,rax - adc rdx,0 - imul r9,r12 - add r15,r10 - adc r9,rdx - mov r10,r13 - mov r11,r14 - mov r12,r15 - and r12,3 - mov r13,r15 - and r13,-4 - mov r14,r9 - shrd r15,r9,2 - shr r9,2 - add r15,r13 - adc r9,r14 - add r10,r15 - adc r11,r9 - adc r12,0 - -$L$open_avx2_tail_128_rounds: - add r8,16 - vpaddd ymm0,ymm0,ymm4 - vpxor ymm12,ymm12,ymm0 - vpshufb ymm12,ymm12,YMMWORD[$L$rol16] - vpaddd ymm8,ymm8,ymm12 - vpxor ymm4,ymm4,ymm8 - vpsrld ymm3,ymm4,20 - vpslld ymm4,ymm4,12 - vpxor ymm4,ymm4,ymm3 - vpaddd ymm0,ymm0,ymm4 - vpxor ymm12,ymm12,ymm0 - vpshufb ymm12,ymm12,YMMWORD[$L$rol8] - vpaddd ymm8,ymm8,ymm12 - vpxor ymm4,ymm4,ymm8 - vpslld ymm3,ymm4,7 - vpsrld ymm4,ymm4,25 - vpxor ymm4,ymm4,ymm3 - vpalignr ymm12,ymm12,ymm12,12 - vpalignr ymm8,ymm8,ymm8,8 - vpalignr ymm4,ymm4,ymm4,4 - vpaddd ymm0,ymm0,ymm4 - vpxor ymm12,ymm12,ymm0 - vpshufb ymm12,ymm12,YMMWORD[$L$rol16] - vpaddd ymm8,ymm8,ymm12 - vpxor ymm4,ymm4,ymm8 - vpsrld ymm3,ymm4,20 - vpslld ymm4,ymm4,12 - vpxor ymm4,ymm4,ymm3 - vpaddd ymm0,ymm0,ymm4 - vpxor ymm12,ymm12,ymm0 - vpshufb ymm12,ymm12,YMMWORD[$L$rol8] - vpaddd ymm8,ymm8,ymm12 - vpxor ymm4,ymm4,ymm8 - vpslld ymm3,ymm4,7 - vpsrld ymm4,ymm4,25 - vpxor ymm4,ymm4,ymm3 - vpalignr ymm12,ymm12,ymm12,4 - vpalignr ymm8,ymm8,ymm8,8 - vpalignr ymm4,ymm4,ymm4,12 - - cmp r8,rcx - jb NEAR $L$open_avx2_tail_128_rounds_and_x1hash - cmp r8,160 - jne NEAR $L$open_avx2_tail_128_rounds - vpaddd ymm0,ymm0,YMMWORD[$L$chacha20_consts] - vpaddd ymm4,ymm4,YMMWORD[((160+64))+rbp] - vpaddd ymm8,ymm8,YMMWORD[((160+96))+rbp] - vpaddd ymm12,ymm12,YMMWORD[((160+160))+rbp] - vperm2i128 ymm3,ymm4,ymm0,0x13 - vperm2i128 ymm0,ymm4,ymm0,0x02 - vperm2i128 ymm4,ymm12,ymm8,0x02 - vperm2i128 ymm12,ymm12,ymm8,0x13 - vmovdqa ymm8,ymm3 - - jmp NEAR $L$open_avx2_tail_128_xor - -$L$open_avx2_tail_256: - vmovdqa ymm0,YMMWORD[$L$chacha20_consts] - vmovdqa ymm4,YMMWORD[((160+64))+rbp] - vmovdqa ymm8,YMMWORD[((160+96))+rbp] - vmovdqa ymm1,ymm0 - vmovdqa ymm5,ymm4 - vmovdqa ymm9,ymm8 - vmovdqa ymm12,YMMWORD[$L$avx2_inc] - vpaddd ymm13,ymm12,YMMWORD[((160+160))+rbp] - vpaddd ymm12,ymm12,ymm13 - vmovdqa YMMWORD[(160+160)+rbp],ymm12 - vmovdqa YMMWORD[(160+192)+rbp],ymm13 - - mov QWORD[((160+128))+rbp],rbx - mov rcx,rbx - sub rcx,4*32 - shr rcx,4 - mov r8,10 - cmp rcx,10 - cmovg rcx,r8 - mov rbx,rsi - xor r8,r8 -$L$open_avx2_tail_256_rounds_and_x1hash: - add r10,QWORD[((0+0))+rbx] - adc r11,QWORD[((8+0))+rbx] - adc r12,1 - mov rdx,QWORD[((0+160+0))+rbp] - mov r15,rdx - mulx r14,r13,r10 - mulx rdx,rax,r11 - imul r15,r12 - add r14,rax - adc r15,rdx - mov rdx,QWORD[((8+160+0))+rbp] - mulx rax,r10,r10 - add r14,r10 - mulx r9,r11,r11 - adc r15,r11 - adc r9,0 - imul rdx,r12 - add r15,rax - adc r9,rdx - mov r10,r13 - mov r11,r14 - mov r12,r15 - and r12,3 - mov r13,r15 - and r13,-4 - mov r14,r9 - shrd r15,r9,2 - shr r9,2 - add r15,r13 - adc r9,r14 - add r10,r15 - adc r11,r9 - adc r12,0 - - lea rbx,[16+rbx] -$L$open_avx2_tail_256_rounds: - vpaddd ymm0,ymm0,ymm4 - vpxor ymm12,ymm12,ymm0 - vpshufb ymm12,ymm12,YMMWORD[$L$rol16] - vpaddd ymm8,ymm8,ymm12 - vpxor ymm4,ymm4,ymm8 - vpsrld ymm3,ymm4,20 - vpslld ymm4,ymm4,12 - vpxor ymm4,ymm4,ymm3 - vpaddd ymm0,ymm0,ymm4 - vpxor ymm12,ymm12,ymm0 - vpshufb ymm12,ymm12,YMMWORD[$L$rol8] - vpaddd ymm8,ymm8,ymm12 - vpxor ymm4,ymm4,ymm8 - vpslld ymm3,ymm4,7 - vpsrld ymm4,ymm4,25 - vpxor ymm4,ymm4,ymm3 - vpalignr ymm12,ymm12,ymm12,12 - vpalignr ymm8,ymm8,ymm8,8 - vpalignr ymm4,ymm4,ymm4,4 - vpaddd ymm1,ymm1,ymm5 - vpxor ymm13,ymm13,ymm1 - vpshufb ymm13,ymm13,YMMWORD[$L$rol16] - vpaddd ymm9,ymm9,ymm13 - vpxor ymm5,ymm5,ymm9 - vpsrld ymm3,ymm5,20 - vpslld ymm5,ymm5,12 - vpxor ymm5,ymm5,ymm3 - vpaddd ymm1,ymm1,ymm5 - vpxor ymm13,ymm13,ymm1 - vpshufb ymm13,ymm13,YMMWORD[$L$rol8] - vpaddd ymm9,ymm9,ymm13 - vpxor ymm5,ymm5,ymm9 - vpslld ymm3,ymm5,7 - vpsrld ymm5,ymm5,25 - vpxor ymm5,ymm5,ymm3 - vpalignr ymm13,ymm13,ymm13,12 - vpalignr ymm9,ymm9,ymm9,8 - vpalignr ymm5,ymm5,ymm5,4 - - inc r8 - vpaddd ymm0,ymm0,ymm4 - vpxor ymm12,ymm12,ymm0 - vpshufb ymm12,ymm12,YMMWORD[$L$rol16] - vpaddd ymm8,ymm8,ymm12 - vpxor ymm4,ymm4,ymm8 - vpsrld ymm3,ymm4,20 - vpslld ymm4,ymm4,12 - vpxor ymm4,ymm4,ymm3 - vpaddd ymm0,ymm0,ymm4 - vpxor ymm12,ymm12,ymm0 - vpshufb ymm12,ymm12,YMMWORD[$L$rol8] - vpaddd ymm8,ymm8,ymm12 - vpxor ymm4,ymm4,ymm8 - vpslld ymm3,ymm4,7 - vpsrld ymm4,ymm4,25 - vpxor ymm4,ymm4,ymm3 - vpalignr ymm12,ymm12,ymm12,4 - vpalignr ymm8,ymm8,ymm8,8 - vpalignr ymm4,ymm4,ymm4,12 - vpaddd ymm1,ymm1,ymm5 - vpxor ymm13,ymm13,ymm1 - vpshufb ymm13,ymm13,YMMWORD[$L$rol16] - vpaddd ymm9,ymm9,ymm13 - vpxor ymm5,ymm5,ymm9 - vpsrld ymm3,ymm5,20 - vpslld ymm5,ymm5,12 - vpxor ymm5,ymm5,ymm3 - vpaddd ymm1,ymm1,ymm5 - vpxor ymm13,ymm13,ymm1 - vpshufb ymm13,ymm13,YMMWORD[$L$rol8] - vpaddd ymm9,ymm9,ymm13 - vpxor ymm5,ymm5,ymm9 - vpslld ymm3,ymm5,7 - vpsrld ymm5,ymm5,25 - vpxor ymm5,ymm5,ymm3 - vpalignr ymm13,ymm13,ymm13,4 - vpalignr ymm9,ymm9,ymm9,8 - vpalignr ymm5,ymm5,ymm5,12 - vpaddd ymm2,ymm2,ymm6 - vpxor ymm14,ymm14,ymm2 - vpshufb ymm14,ymm14,YMMWORD[$L$rol16] - vpaddd ymm10,ymm10,ymm14 - vpxor ymm6,ymm6,ymm10 - vpsrld ymm3,ymm6,20 - vpslld ymm6,ymm6,12 - vpxor ymm6,ymm6,ymm3 - vpaddd ymm2,ymm2,ymm6 - vpxor ymm14,ymm14,ymm2 - vpshufb ymm14,ymm14,YMMWORD[$L$rol8] - vpaddd ymm10,ymm10,ymm14 - vpxor ymm6,ymm6,ymm10 - vpslld ymm3,ymm6,7 - vpsrld ymm6,ymm6,25 - vpxor ymm6,ymm6,ymm3 - vpalignr ymm14,ymm14,ymm14,4 - vpalignr ymm10,ymm10,ymm10,8 - vpalignr ymm6,ymm6,ymm6,12 - - cmp r8,rcx - jb NEAR $L$open_avx2_tail_256_rounds_and_x1hash - cmp r8,10 - jne NEAR $L$open_avx2_tail_256_rounds - mov r8,rbx - sub rbx,rsi - mov rcx,rbx - mov rbx,QWORD[((160+128))+rbp] -$L$open_avx2_tail_256_hash: - add rcx,16 - cmp rcx,rbx - jg NEAR $L$open_avx2_tail_256_done - add r10,QWORD[((0+0))+r8] - adc r11,QWORD[((8+0))+r8] - adc r12,1 - mov rdx,QWORD[((0+160+0))+rbp] - mov r15,rdx - mulx r14,r13,r10 - mulx rdx,rax,r11 - imul r15,r12 - add r14,rax - adc r15,rdx - mov rdx,QWORD[((8+160+0))+rbp] - mulx rax,r10,r10 - add r14,r10 - mulx r9,r11,r11 - adc r15,r11 - adc r9,0 - imul rdx,r12 - add r15,rax - adc r9,rdx - mov r10,r13 - mov r11,r14 - mov r12,r15 - and r12,3 - mov r13,r15 - and r13,-4 - mov r14,r9 - shrd r15,r9,2 - shr r9,2 - add r15,r13 - adc r9,r14 - add r10,r15 - adc r11,r9 - adc r12,0 - - lea r8,[16+r8] - jmp NEAR $L$open_avx2_tail_256_hash -$L$open_avx2_tail_256_done: - vpaddd ymm1,ymm1,YMMWORD[$L$chacha20_consts] - vpaddd ymm5,ymm5,YMMWORD[((160+64))+rbp] - vpaddd ymm9,ymm9,YMMWORD[((160+96))+rbp] - vpaddd ymm13,ymm13,YMMWORD[((160+192))+rbp] - vpaddd ymm0,ymm0,YMMWORD[$L$chacha20_consts] - vpaddd ymm4,ymm4,YMMWORD[((160+64))+rbp] - vpaddd ymm8,ymm8,YMMWORD[((160+96))+rbp] - vpaddd ymm12,ymm12,YMMWORD[((160+160))+rbp] - vperm2i128 ymm3,ymm5,ymm1,0x02 - vperm2i128 ymm5,ymm5,ymm1,0x13 - vperm2i128 ymm1,ymm13,ymm9,0x02 - vperm2i128 ymm9,ymm13,ymm9,0x13 - vpxor ymm3,ymm3,YMMWORD[((0+0))+rsi] - vpxor ymm1,ymm1,YMMWORD[((32+0))+rsi] - vpxor ymm5,ymm5,YMMWORD[((64+0))+rsi] - vpxor ymm9,ymm9,YMMWORD[((96+0))+rsi] - vmovdqu YMMWORD[(0+0)+rdi],ymm3 - vmovdqu YMMWORD[(32+0)+rdi],ymm1 - vmovdqu YMMWORD[(64+0)+rdi],ymm5 - vmovdqu YMMWORD[(96+0)+rdi],ymm9 - vperm2i128 ymm3,ymm4,ymm0,0x13 - vperm2i128 ymm0,ymm4,ymm0,0x02 - vperm2i128 ymm4,ymm12,ymm8,0x02 - vperm2i128 ymm12,ymm12,ymm8,0x13 - vmovdqa ymm8,ymm3 - - lea rsi,[128+rsi] - lea rdi,[128+rdi] - sub rbx,4*32 - jmp NEAR $L$open_avx2_tail_128_xor - -$L$open_avx2_tail_384: - vmovdqa ymm0,YMMWORD[$L$chacha20_consts] - vmovdqa ymm4,YMMWORD[((160+64))+rbp] - vmovdqa ymm8,YMMWORD[((160+96))+rbp] - vmovdqa ymm1,ymm0 - vmovdqa ymm5,ymm4 - vmovdqa ymm9,ymm8 - vmovdqa ymm2,ymm0 - vmovdqa ymm6,ymm4 - vmovdqa ymm10,ymm8 - vmovdqa ymm12,YMMWORD[$L$avx2_inc] - vpaddd ymm14,ymm12,YMMWORD[((160+160))+rbp] - vpaddd ymm13,ymm12,ymm14 - vpaddd ymm12,ymm12,ymm13 - vmovdqa YMMWORD[(160+160)+rbp],ymm12 - vmovdqa YMMWORD[(160+192)+rbp],ymm13 - vmovdqa YMMWORD[(160+224)+rbp],ymm14 - - mov QWORD[((160+128))+rbp],rbx - mov rcx,rbx - sub rcx,8*32 - shr rcx,4 - add rcx,6 - mov r8,10 - cmp rcx,10 - cmovg rcx,r8 - mov rbx,rsi - xor r8,r8 -$L$open_avx2_tail_384_rounds_and_x2hash: - add r10,QWORD[((0+0))+rbx] - adc r11,QWORD[((8+0))+rbx] - adc r12,1 - mov rdx,QWORD[((0+160+0))+rbp] - mov r15,rdx - mulx r14,r13,r10 - mulx rdx,rax,r11 - imul r15,r12 - add r14,rax - adc r15,rdx - mov rdx,QWORD[((8+160+0))+rbp] - mulx rax,r10,r10 - add r14,r10 - mulx r9,r11,r11 - adc r15,r11 - adc r9,0 - imul rdx,r12 - add r15,rax - adc r9,rdx - mov r10,r13 - mov r11,r14 - mov r12,r15 - and r12,3 - mov r13,r15 - and r13,-4 - mov r14,r9 - shrd r15,r9,2 - shr r9,2 - add r15,r13 - adc r9,r14 - add r10,r15 - adc r11,r9 - adc r12,0 - - lea rbx,[16+rbx] -$L$open_avx2_tail_384_rounds_and_x1hash: - vpaddd ymm2,ymm2,ymm6 - vpxor ymm14,ymm14,ymm2 - vpshufb ymm14,ymm14,YMMWORD[$L$rol16] - vpaddd ymm10,ymm10,ymm14 - vpxor ymm6,ymm6,ymm10 - vpsrld ymm3,ymm6,20 - vpslld ymm6,ymm6,12 - vpxor ymm6,ymm6,ymm3 - vpaddd ymm2,ymm2,ymm6 - vpxor ymm14,ymm14,ymm2 - vpshufb ymm14,ymm14,YMMWORD[$L$rol8] - vpaddd ymm10,ymm10,ymm14 - vpxor ymm6,ymm6,ymm10 - vpslld ymm3,ymm6,7 - vpsrld ymm6,ymm6,25 - vpxor ymm6,ymm6,ymm3 - vpalignr ymm14,ymm14,ymm14,12 - vpalignr ymm10,ymm10,ymm10,8 - vpalignr ymm6,ymm6,ymm6,4 - vpaddd ymm1,ymm1,ymm5 - vpxor ymm13,ymm13,ymm1 - vpshufb ymm13,ymm13,YMMWORD[$L$rol16] - vpaddd ymm9,ymm9,ymm13 - vpxor ymm5,ymm5,ymm9 - vpsrld ymm3,ymm5,20 - vpslld ymm5,ymm5,12 - vpxor ymm5,ymm5,ymm3 - vpaddd ymm1,ymm1,ymm5 - vpxor ymm13,ymm13,ymm1 - vpshufb ymm13,ymm13,YMMWORD[$L$rol8] - vpaddd ymm9,ymm9,ymm13 - vpxor ymm5,ymm5,ymm9 - vpslld ymm3,ymm5,7 - vpsrld ymm5,ymm5,25 - vpxor ymm5,ymm5,ymm3 - vpalignr ymm13,ymm13,ymm13,12 - vpalignr ymm9,ymm9,ymm9,8 - vpalignr ymm5,ymm5,ymm5,4 - vpaddd ymm0,ymm0,ymm4 - vpxor ymm12,ymm12,ymm0 - vpshufb ymm12,ymm12,YMMWORD[$L$rol16] - vpaddd ymm8,ymm8,ymm12 - vpxor ymm4,ymm4,ymm8 - vpsrld ymm3,ymm4,20 - vpslld ymm4,ymm4,12 - vpxor ymm4,ymm4,ymm3 - vpaddd ymm0,ymm0,ymm4 - vpxor ymm12,ymm12,ymm0 - vpshufb ymm12,ymm12,YMMWORD[$L$rol8] - vpaddd ymm8,ymm8,ymm12 - vpxor ymm4,ymm4,ymm8 - vpslld ymm3,ymm4,7 - vpsrld ymm4,ymm4,25 - vpxor ymm4,ymm4,ymm3 - vpalignr ymm12,ymm12,ymm12,12 - vpalignr ymm8,ymm8,ymm8,8 - vpalignr ymm4,ymm4,ymm4,4 - add r10,QWORD[((0+0))+rbx] - adc r11,QWORD[((8+0))+rbx] - adc r12,1 - mov rax,QWORD[((0+160+0))+rbp] - mov r15,rax - mul r10 - mov r13,rax - mov r14,rdx - mov rax,QWORD[((0+160+0))+rbp] - mul r11 - imul r15,r12 - add r14,rax - adc r15,rdx - mov rax,QWORD[((8+160+0))+rbp] - mov r9,rax - mul r10 - add r14,rax - adc rdx,0 - mov r10,rdx - mov rax,QWORD[((8+160+0))+rbp] - mul r11 - add r15,rax - adc rdx,0 - imul r9,r12 - add r15,r10 - adc r9,rdx - mov r10,r13 - mov r11,r14 - mov r12,r15 - and r12,3 - mov r13,r15 - and r13,-4 - mov r14,r9 - shrd r15,r9,2 - shr r9,2 - add r15,r13 - adc r9,r14 - add r10,r15 - adc r11,r9 - adc r12,0 - - lea rbx,[16+rbx] - inc r8 - vpaddd ymm2,ymm2,ymm6 - vpxor ymm14,ymm14,ymm2 - vpshufb ymm14,ymm14,YMMWORD[$L$rol16] - vpaddd ymm10,ymm10,ymm14 - vpxor ymm6,ymm6,ymm10 - vpsrld ymm3,ymm6,20 - vpslld ymm6,ymm6,12 - vpxor ymm6,ymm6,ymm3 - vpaddd ymm2,ymm2,ymm6 - vpxor ymm14,ymm14,ymm2 - vpshufb ymm14,ymm14,YMMWORD[$L$rol8] - vpaddd ymm10,ymm10,ymm14 - vpxor ymm6,ymm6,ymm10 - vpslld ymm3,ymm6,7 - vpsrld ymm6,ymm6,25 - vpxor ymm6,ymm6,ymm3 - vpalignr ymm14,ymm14,ymm14,4 - vpalignr ymm10,ymm10,ymm10,8 - vpalignr ymm6,ymm6,ymm6,12 - vpaddd ymm1,ymm1,ymm5 - vpxor ymm13,ymm13,ymm1 - vpshufb ymm13,ymm13,YMMWORD[$L$rol16] - vpaddd ymm9,ymm9,ymm13 - vpxor ymm5,ymm5,ymm9 - vpsrld ymm3,ymm5,20 - vpslld ymm5,ymm5,12 - vpxor ymm5,ymm5,ymm3 - vpaddd ymm1,ymm1,ymm5 - vpxor ymm13,ymm13,ymm1 - vpshufb ymm13,ymm13,YMMWORD[$L$rol8] - vpaddd ymm9,ymm9,ymm13 - vpxor ymm5,ymm5,ymm9 - vpslld ymm3,ymm5,7 - vpsrld ymm5,ymm5,25 - vpxor ymm5,ymm5,ymm3 - vpalignr ymm13,ymm13,ymm13,4 - vpalignr ymm9,ymm9,ymm9,8 - vpalignr ymm5,ymm5,ymm5,12 - vpaddd ymm0,ymm0,ymm4 - vpxor ymm12,ymm12,ymm0 - vpshufb ymm12,ymm12,YMMWORD[$L$rol16] - vpaddd ymm8,ymm8,ymm12 - vpxor ymm4,ymm4,ymm8 - vpsrld ymm3,ymm4,20 - vpslld ymm4,ymm4,12 - vpxor ymm4,ymm4,ymm3 - vpaddd ymm0,ymm0,ymm4 - vpxor ymm12,ymm12,ymm0 - vpshufb ymm12,ymm12,YMMWORD[$L$rol8] - vpaddd ymm8,ymm8,ymm12 - vpxor ymm4,ymm4,ymm8 - vpslld ymm3,ymm4,7 - vpsrld ymm4,ymm4,25 - vpxor ymm4,ymm4,ymm3 - vpalignr ymm12,ymm12,ymm12,4 - vpalignr ymm8,ymm8,ymm8,8 - vpalignr ymm4,ymm4,ymm4,12 - - cmp r8,rcx - jb NEAR $L$open_avx2_tail_384_rounds_and_x2hash - cmp r8,10 - jne NEAR $L$open_avx2_tail_384_rounds_and_x1hash - mov r8,rbx - sub rbx,rsi - mov rcx,rbx - mov rbx,QWORD[((160+128))+rbp] -$L$open_avx2_384_tail_hash: - add rcx,16 - cmp rcx,rbx - jg NEAR $L$open_avx2_384_tail_done - add r10,QWORD[((0+0))+r8] - adc r11,QWORD[((8+0))+r8] - adc r12,1 - mov rdx,QWORD[((0+160+0))+rbp] - mov r15,rdx - mulx r14,r13,r10 - mulx rdx,rax,r11 - imul r15,r12 - add r14,rax - adc r15,rdx - mov rdx,QWORD[((8+160+0))+rbp] - mulx rax,r10,r10 - add r14,r10 - mulx r9,r11,r11 - adc r15,r11 - adc r9,0 - imul rdx,r12 - add r15,rax - adc r9,rdx - mov r10,r13 - mov r11,r14 - mov r12,r15 - and r12,3 - mov r13,r15 - and r13,-4 - mov r14,r9 - shrd r15,r9,2 - shr r9,2 - add r15,r13 - adc r9,r14 - add r10,r15 - adc r11,r9 - adc r12,0 - - lea r8,[16+r8] - jmp NEAR $L$open_avx2_384_tail_hash -$L$open_avx2_384_tail_done: - vpaddd ymm2,ymm2,YMMWORD[$L$chacha20_consts] - vpaddd ymm6,ymm6,YMMWORD[((160+64))+rbp] - vpaddd ymm10,ymm10,YMMWORD[((160+96))+rbp] - vpaddd ymm14,ymm14,YMMWORD[((160+224))+rbp] - vpaddd ymm1,ymm1,YMMWORD[$L$chacha20_consts] - vpaddd ymm5,ymm5,YMMWORD[((160+64))+rbp] - vpaddd ymm9,ymm9,YMMWORD[((160+96))+rbp] - vpaddd ymm13,ymm13,YMMWORD[((160+192))+rbp] - vpaddd ymm0,ymm0,YMMWORD[$L$chacha20_consts] - vpaddd ymm4,ymm4,YMMWORD[((160+64))+rbp] - vpaddd ymm8,ymm8,YMMWORD[((160+96))+rbp] - vpaddd ymm12,ymm12,YMMWORD[((160+160))+rbp] - vperm2i128 ymm3,ymm6,ymm2,0x02 - vperm2i128 ymm6,ymm6,ymm2,0x13 - vperm2i128 ymm2,ymm14,ymm10,0x02 - vperm2i128 ymm10,ymm14,ymm10,0x13 - vpxor ymm3,ymm3,YMMWORD[((0+0))+rsi] - vpxor ymm2,ymm2,YMMWORD[((32+0))+rsi] - vpxor ymm6,ymm6,YMMWORD[((64+0))+rsi] - vpxor ymm10,ymm10,YMMWORD[((96+0))+rsi] - vmovdqu YMMWORD[(0+0)+rdi],ymm3 - vmovdqu YMMWORD[(32+0)+rdi],ymm2 - vmovdqu YMMWORD[(64+0)+rdi],ymm6 - vmovdqu YMMWORD[(96+0)+rdi],ymm10 - vperm2i128 ymm3,ymm5,ymm1,0x02 - vperm2i128 ymm5,ymm5,ymm1,0x13 - vperm2i128 ymm1,ymm13,ymm9,0x02 - vperm2i128 ymm9,ymm13,ymm9,0x13 - vpxor ymm3,ymm3,YMMWORD[((0+128))+rsi] - vpxor ymm1,ymm1,YMMWORD[((32+128))+rsi] - vpxor ymm5,ymm5,YMMWORD[((64+128))+rsi] - vpxor ymm9,ymm9,YMMWORD[((96+128))+rsi] - vmovdqu YMMWORD[(0+128)+rdi],ymm3 - vmovdqu YMMWORD[(32+128)+rdi],ymm1 - vmovdqu YMMWORD[(64+128)+rdi],ymm5 - vmovdqu YMMWORD[(96+128)+rdi],ymm9 - vperm2i128 ymm3,ymm4,ymm0,0x13 - vperm2i128 ymm0,ymm4,ymm0,0x02 - vperm2i128 ymm4,ymm12,ymm8,0x02 - vperm2i128 ymm12,ymm12,ymm8,0x13 - vmovdqa ymm8,ymm3 - - lea rsi,[256+rsi] - lea rdi,[256+rdi] - sub rbx,8*32 - jmp NEAR $L$open_avx2_tail_128_xor - -$L$open_avx2_tail_512: - vmovdqa ymm0,YMMWORD[$L$chacha20_consts] - vmovdqa ymm4,YMMWORD[((160+64))+rbp] - vmovdqa ymm8,YMMWORD[((160+96))+rbp] - vmovdqa ymm1,ymm0 - vmovdqa ymm5,ymm4 - vmovdqa ymm9,ymm8 - vmovdqa ymm2,ymm0 - vmovdqa ymm6,ymm4 - vmovdqa ymm10,ymm8 - vmovdqa ymm3,ymm0 - vmovdqa ymm7,ymm4 - vmovdqa ymm11,ymm8 - vmovdqa ymm12,YMMWORD[$L$avx2_inc] - vpaddd ymm15,ymm12,YMMWORD[((160+160))+rbp] - vpaddd ymm14,ymm12,ymm15 - vpaddd ymm13,ymm12,ymm14 - vpaddd ymm12,ymm12,ymm13 - vmovdqa YMMWORD[(160+256)+rbp],ymm15 - vmovdqa YMMWORD[(160+224)+rbp],ymm14 - vmovdqa YMMWORD[(160+192)+rbp],ymm13 - vmovdqa YMMWORD[(160+160)+rbp],ymm12 - - xor rcx,rcx - mov r8,rsi -$L$open_avx2_tail_512_rounds_and_x2hash: - add r10,QWORD[((0+0))+r8] - adc r11,QWORD[((8+0))+r8] - adc r12,1 - mov rax,QWORD[((0+160+0))+rbp] - mov r15,rax - mul r10 - mov r13,rax - mov r14,rdx - mov rax,QWORD[((0+160+0))+rbp] - mul r11 - imul r15,r12 - add r14,rax - adc r15,rdx - mov rax,QWORD[((8+160+0))+rbp] - mov r9,rax - mul r10 - add r14,rax - adc rdx,0 - mov r10,rdx - mov rax,QWORD[((8+160+0))+rbp] - mul r11 - add r15,rax - adc rdx,0 - imul r9,r12 - add r15,r10 - adc r9,rdx - mov r10,r13 - mov r11,r14 - mov r12,r15 - and r12,3 - mov r13,r15 - and r13,-4 - mov r14,r9 - shrd r15,r9,2 - shr r9,2 - add r15,r13 - adc r9,r14 - add r10,r15 - adc r11,r9 - adc r12,0 - - lea r8,[16+r8] -$L$open_avx2_tail_512_rounds_and_x1hash: - vmovdqa YMMWORD[(160+128)+rbp],ymm8 - vmovdqa ymm8,YMMWORD[$L$rol16] - vpaddd ymm3,ymm3,ymm7 - vpaddd ymm2,ymm2,ymm6 - vpaddd ymm1,ymm1,ymm5 - vpaddd ymm0,ymm0,ymm4 - vpxor ymm15,ymm15,ymm3 - vpxor ymm14,ymm14,ymm2 - vpxor ymm13,ymm13,ymm1 - vpxor ymm12,ymm12,ymm0 - vpshufb ymm15,ymm15,ymm8 - vpshufb ymm14,ymm14,ymm8 - vpshufb ymm13,ymm13,ymm8 - vpshufb ymm12,ymm12,ymm8 - vpaddd ymm11,ymm11,ymm15 - vpaddd ymm10,ymm10,ymm14 - vpaddd ymm9,ymm9,ymm13 - vpaddd ymm8,ymm12,YMMWORD[((160+128))+rbp] - vpxor ymm7,ymm7,ymm11 - vpxor ymm6,ymm6,ymm10 - vpxor ymm5,ymm5,ymm9 - vpxor ymm4,ymm4,ymm8 - vmovdqa YMMWORD[(160+128)+rbp],ymm8 - vpsrld ymm8,ymm7,20 - vpslld ymm7,ymm7,32-20 - vpxor ymm7,ymm7,ymm8 - vpsrld ymm8,ymm6,20 - vpslld ymm6,ymm6,32-20 - vpxor ymm6,ymm6,ymm8 - vpsrld ymm8,ymm5,20 - vpslld ymm5,ymm5,32-20 - vpxor ymm5,ymm5,ymm8 - vpsrld ymm8,ymm4,20 - vpslld ymm4,ymm4,32-20 - vpxor ymm4,ymm4,ymm8 - vmovdqa ymm8,YMMWORD[$L$rol8] - vpaddd ymm3,ymm3,ymm7 - add r10,QWORD[((0+0))+r8] - adc r11,QWORD[((8+0))+r8] - adc r12,1 - mov rdx,QWORD[((0+160+0))+rbp] - mov r15,rdx - mulx r14,r13,r10 - mulx rdx,rax,r11 - imul r15,r12 - add r14,rax - adc r15,rdx - mov rdx,QWORD[((8+160+0))+rbp] - mulx rax,r10,r10 - add r14,r10 - mulx r9,r11,r11 - adc r15,r11 - adc r9,0 - imul rdx,r12 - add r15,rax - adc r9,rdx - mov r10,r13 - mov r11,r14 - mov r12,r15 - and r12,3 - mov r13,r15 - and r13,-4 - mov r14,r9 - shrd r15,r9,2 - shr r9,2 - add r15,r13 - adc r9,r14 - add r10,r15 - adc r11,r9 - adc r12,0 - vpaddd ymm2,ymm2,ymm6 - vpaddd ymm1,ymm1,ymm5 - vpaddd ymm0,ymm0,ymm4 - vpxor ymm15,ymm15,ymm3 - vpxor ymm14,ymm14,ymm2 - vpxor ymm13,ymm13,ymm1 - vpxor ymm12,ymm12,ymm0 - vpshufb ymm15,ymm15,ymm8 - vpshufb ymm14,ymm14,ymm8 - vpshufb ymm13,ymm13,ymm8 - vpshufb ymm12,ymm12,ymm8 - vpaddd ymm11,ymm11,ymm15 - vpaddd ymm10,ymm10,ymm14 - vpaddd ymm9,ymm9,ymm13 - vpaddd ymm8,ymm12,YMMWORD[((160+128))+rbp] - vpxor ymm7,ymm7,ymm11 - vpxor ymm6,ymm6,ymm10 - vpxor ymm5,ymm5,ymm9 - vpxor ymm4,ymm4,ymm8 - vmovdqa YMMWORD[(160+128)+rbp],ymm8 - vpsrld ymm8,ymm7,25 - vpslld ymm7,ymm7,32-25 - vpxor ymm7,ymm7,ymm8 - vpsrld ymm8,ymm6,25 - vpslld ymm6,ymm6,32-25 - vpxor ymm6,ymm6,ymm8 - vpsrld ymm8,ymm5,25 - vpslld ymm5,ymm5,32-25 - vpxor ymm5,ymm5,ymm8 - vpsrld ymm8,ymm4,25 - vpslld ymm4,ymm4,32-25 - vpxor ymm4,ymm4,ymm8 - vmovdqa ymm8,YMMWORD[((160+128))+rbp] - vpalignr ymm7,ymm7,ymm7,4 - vpalignr ymm11,ymm11,ymm11,8 - vpalignr ymm15,ymm15,ymm15,12 - vpalignr ymm6,ymm6,ymm6,4 - vpalignr ymm10,ymm10,ymm10,8 - vpalignr ymm14,ymm14,ymm14,12 - vpalignr ymm5,ymm5,ymm5,4 - vpalignr ymm9,ymm9,ymm9,8 - vpalignr ymm13,ymm13,ymm13,12 - vpalignr ymm4,ymm4,ymm4,4 - vpalignr ymm8,ymm8,ymm8,8 - vpalignr ymm12,ymm12,ymm12,12 - vmovdqa YMMWORD[(160+128)+rbp],ymm8 - vmovdqa ymm8,YMMWORD[$L$rol16] - vpaddd ymm3,ymm3,ymm7 - add r10,QWORD[((0+16))+r8] - adc r11,QWORD[((8+16))+r8] - adc r12,1 - mov rdx,QWORD[((0+160+0))+rbp] - mov r15,rdx - mulx r14,r13,r10 - mulx rdx,rax,r11 - imul r15,r12 - add r14,rax - adc r15,rdx - mov rdx,QWORD[((8+160+0))+rbp] - mulx rax,r10,r10 - add r14,r10 - mulx r9,r11,r11 - adc r15,r11 - adc r9,0 - imul rdx,r12 - add r15,rax - adc r9,rdx - mov r10,r13 - mov r11,r14 - mov r12,r15 - and r12,3 - mov r13,r15 - and r13,-4 - mov r14,r9 - shrd r15,r9,2 - shr r9,2 - add r15,r13 - adc r9,r14 - add r10,r15 - adc r11,r9 - adc r12,0 - - lea r8,[32+r8] - vpaddd ymm2,ymm2,ymm6 - vpaddd ymm1,ymm1,ymm5 - vpaddd ymm0,ymm0,ymm4 - vpxor ymm15,ymm15,ymm3 - vpxor ymm14,ymm14,ymm2 - vpxor ymm13,ymm13,ymm1 - vpxor ymm12,ymm12,ymm0 - vpshufb ymm15,ymm15,ymm8 - vpshufb ymm14,ymm14,ymm8 - vpshufb ymm13,ymm13,ymm8 - vpshufb ymm12,ymm12,ymm8 - vpaddd ymm11,ymm11,ymm15 - vpaddd ymm10,ymm10,ymm14 - vpaddd ymm9,ymm9,ymm13 - vpaddd ymm8,ymm12,YMMWORD[((160+128))+rbp] - vpxor ymm7,ymm7,ymm11 - vpxor ymm6,ymm6,ymm10 - vpxor ymm5,ymm5,ymm9 - vpxor ymm4,ymm4,ymm8 - vmovdqa YMMWORD[(160+128)+rbp],ymm8 - vpsrld ymm8,ymm7,20 - vpslld ymm7,ymm7,32-20 - vpxor ymm7,ymm7,ymm8 - vpsrld ymm8,ymm6,20 - vpslld ymm6,ymm6,32-20 - vpxor ymm6,ymm6,ymm8 - vpsrld ymm8,ymm5,20 - vpslld ymm5,ymm5,32-20 - vpxor ymm5,ymm5,ymm8 - vpsrld ymm8,ymm4,20 - vpslld ymm4,ymm4,32-20 - vpxor ymm4,ymm4,ymm8 - vmovdqa ymm8,YMMWORD[$L$rol8] - vpaddd ymm3,ymm3,ymm7 - vpaddd ymm2,ymm2,ymm6 - vpaddd ymm1,ymm1,ymm5 - vpaddd ymm0,ymm0,ymm4 - vpxor ymm15,ymm15,ymm3 - vpxor ymm14,ymm14,ymm2 - vpxor ymm13,ymm13,ymm1 - vpxor ymm12,ymm12,ymm0 - vpshufb ymm15,ymm15,ymm8 - vpshufb ymm14,ymm14,ymm8 - vpshufb ymm13,ymm13,ymm8 - vpshufb ymm12,ymm12,ymm8 - vpaddd ymm11,ymm11,ymm15 - vpaddd ymm10,ymm10,ymm14 - vpaddd ymm9,ymm9,ymm13 - vpaddd ymm8,ymm12,YMMWORD[((160+128))+rbp] - vpxor ymm7,ymm7,ymm11 - vpxor ymm6,ymm6,ymm10 - vpxor ymm5,ymm5,ymm9 - vpxor ymm4,ymm4,ymm8 - vmovdqa YMMWORD[(160+128)+rbp],ymm8 - vpsrld ymm8,ymm7,25 - vpslld ymm7,ymm7,32-25 - vpxor ymm7,ymm7,ymm8 - vpsrld ymm8,ymm6,25 - vpslld ymm6,ymm6,32-25 - vpxor ymm6,ymm6,ymm8 - vpsrld ymm8,ymm5,25 - vpslld ymm5,ymm5,32-25 - vpxor ymm5,ymm5,ymm8 - vpsrld ymm8,ymm4,25 - vpslld ymm4,ymm4,32-25 - vpxor ymm4,ymm4,ymm8 - vmovdqa ymm8,YMMWORD[((160+128))+rbp] - vpalignr ymm7,ymm7,ymm7,12 - vpalignr ymm11,ymm11,ymm11,8 - vpalignr ymm15,ymm15,ymm15,4 - vpalignr ymm6,ymm6,ymm6,12 - vpalignr ymm10,ymm10,ymm10,8 - vpalignr ymm14,ymm14,ymm14,4 - vpalignr ymm5,ymm5,ymm5,12 - vpalignr ymm9,ymm9,ymm9,8 - vpalignr ymm13,ymm13,ymm13,4 - vpalignr ymm4,ymm4,ymm4,12 - vpalignr ymm8,ymm8,ymm8,8 - vpalignr ymm12,ymm12,ymm12,4 - - inc rcx - cmp rcx,4 - jl NEAR $L$open_avx2_tail_512_rounds_and_x2hash - cmp rcx,10 - jne NEAR $L$open_avx2_tail_512_rounds_and_x1hash - mov rcx,rbx - sub rcx,12*32 - and rcx,-16 -$L$open_avx2_tail_512_hash: - test rcx,rcx - je NEAR $L$open_avx2_tail_512_done - add r10,QWORD[((0+0))+r8] - adc r11,QWORD[((8+0))+r8] - adc r12,1 - mov rdx,QWORD[((0+160+0))+rbp] - mov r15,rdx - mulx r14,r13,r10 - mulx rdx,rax,r11 - imul r15,r12 - add r14,rax - adc r15,rdx - mov rdx,QWORD[((8+160+0))+rbp] - mulx rax,r10,r10 - add r14,r10 - mulx r9,r11,r11 - adc r15,r11 - adc r9,0 - imul rdx,r12 - add r15,rax - adc r9,rdx - mov r10,r13 - mov r11,r14 - mov r12,r15 - and r12,3 - mov r13,r15 - and r13,-4 - mov r14,r9 - shrd r15,r9,2 - shr r9,2 - add r15,r13 - adc r9,r14 - add r10,r15 - adc r11,r9 - adc r12,0 - - lea r8,[16+r8] - sub rcx,2*8 - jmp NEAR $L$open_avx2_tail_512_hash -$L$open_avx2_tail_512_done: - vpaddd ymm3,ymm3,YMMWORD[$L$chacha20_consts] - vpaddd ymm7,ymm7,YMMWORD[((160+64))+rbp] - vpaddd ymm11,ymm11,YMMWORD[((160+96))+rbp] - vpaddd ymm15,ymm15,YMMWORD[((160+256))+rbp] - vpaddd ymm2,ymm2,YMMWORD[$L$chacha20_consts] - vpaddd ymm6,ymm6,YMMWORD[((160+64))+rbp] - vpaddd ymm10,ymm10,YMMWORD[((160+96))+rbp] - vpaddd ymm14,ymm14,YMMWORD[((160+224))+rbp] - vpaddd ymm1,ymm1,YMMWORD[$L$chacha20_consts] - vpaddd ymm5,ymm5,YMMWORD[((160+64))+rbp] - vpaddd ymm9,ymm9,YMMWORD[((160+96))+rbp] - vpaddd ymm13,ymm13,YMMWORD[((160+192))+rbp] - vpaddd ymm0,ymm0,YMMWORD[$L$chacha20_consts] - vpaddd ymm4,ymm4,YMMWORD[((160+64))+rbp] - vpaddd ymm8,ymm8,YMMWORD[((160+96))+rbp] - vpaddd ymm12,ymm12,YMMWORD[((160+160))+rbp] - - vmovdqa YMMWORD[(160+128)+rbp],ymm0 - vperm2i128 ymm0,ymm7,ymm3,0x02 - vperm2i128 ymm7,ymm7,ymm3,0x13 - vperm2i128 ymm3,ymm15,ymm11,0x02 - vperm2i128 ymm11,ymm15,ymm11,0x13 - vpxor ymm0,ymm0,YMMWORD[((0+0))+rsi] - vpxor ymm3,ymm3,YMMWORD[((32+0))+rsi] - vpxor ymm7,ymm7,YMMWORD[((64+0))+rsi] - vpxor ymm11,ymm11,YMMWORD[((96+0))+rsi] - vmovdqu YMMWORD[(0+0)+rdi],ymm0 - vmovdqu YMMWORD[(32+0)+rdi],ymm3 - vmovdqu YMMWORD[(64+0)+rdi],ymm7 - vmovdqu YMMWORD[(96+0)+rdi],ymm11 - - vmovdqa ymm0,YMMWORD[((160+128))+rbp] - vperm2i128 ymm3,ymm6,ymm2,0x02 - vperm2i128 ymm6,ymm6,ymm2,0x13 - vperm2i128 ymm2,ymm14,ymm10,0x02 - vperm2i128 ymm10,ymm14,ymm10,0x13 - vpxor ymm3,ymm3,YMMWORD[((0+128))+rsi] - vpxor ymm2,ymm2,YMMWORD[((32+128))+rsi] - vpxor ymm6,ymm6,YMMWORD[((64+128))+rsi] - vpxor ymm10,ymm10,YMMWORD[((96+128))+rsi] - vmovdqu YMMWORD[(0+128)+rdi],ymm3 - vmovdqu YMMWORD[(32+128)+rdi],ymm2 - vmovdqu YMMWORD[(64+128)+rdi],ymm6 - vmovdqu YMMWORD[(96+128)+rdi],ymm10 - vperm2i128 ymm3,ymm5,ymm1,0x02 - vperm2i128 ymm5,ymm5,ymm1,0x13 - vperm2i128 ymm1,ymm13,ymm9,0x02 - vperm2i128 ymm9,ymm13,ymm9,0x13 - vpxor ymm3,ymm3,YMMWORD[((0+256))+rsi] - vpxor ymm1,ymm1,YMMWORD[((32+256))+rsi] - vpxor ymm5,ymm5,YMMWORD[((64+256))+rsi] - vpxor ymm9,ymm9,YMMWORD[((96+256))+rsi] - vmovdqu YMMWORD[(0+256)+rdi],ymm3 - vmovdqu YMMWORD[(32+256)+rdi],ymm1 - vmovdqu YMMWORD[(64+256)+rdi],ymm5 - vmovdqu YMMWORD[(96+256)+rdi],ymm9 - vperm2i128 ymm3,ymm4,ymm0,0x13 - vperm2i128 ymm0,ymm4,ymm0,0x02 - vperm2i128 ymm4,ymm12,ymm8,0x02 - vperm2i128 ymm12,ymm12,ymm8,0x13 - vmovdqa ymm8,ymm3 - - lea rsi,[384+rsi] - lea rdi,[384+rdi] - sub rbx,12*32 -$L$open_avx2_tail_128_xor: - cmp rbx,32 - jb NEAR $L$open_avx2_tail_32_xor - sub rbx,32 - vpxor ymm0,ymm0,YMMWORD[rsi] - vmovdqu YMMWORD[rdi],ymm0 - lea rsi,[32+rsi] - lea rdi,[32+rdi] - vmovdqa ymm0,ymm4 - vmovdqa ymm4,ymm8 - vmovdqa ymm8,ymm12 - jmp NEAR $L$open_avx2_tail_128_xor -$L$open_avx2_tail_32_xor: - cmp rbx,16 - vmovdqa xmm1,xmm0 - jb NEAR $L$open_avx2_exit - sub rbx,16 - - vpxor xmm1,xmm0,XMMWORD[rsi] - vmovdqu XMMWORD[rdi],xmm1 - lea rsi,[16+rsi] - lea rdi,[16+rdi] - vperm2i128 ymm0,ymm0,ymm0,0x11 - vmovdqa xmm1,xmm0 -$L$open_avx2_exit: - vzeroupper - jmp NEAR $L$open_sse_tail_16 - -$L$open_avx2_192: - vmovdqa ymm1,ymm0 - vmovdqa ymm2,ymm0 - vmovdqa ymm5,ymm4 - vmovdqa ymm6,ymm4 - vmovdqa ymm9,ymm8 - vmovdqa ymm10,ymm8 - vpaddd ymm13,ymm12,YMMWORD[$L$avx2_inc] - vmovdqa ymm11,ymm12 - vmovdqa ymm15,ymm13 - mov r10,10 -$L$open_avx2_192_rounds: - vpaddd ymm0,ymm0,ymm4 - vpxor ymm12,ymm12,ymm0 - vpshufb ymm12,ymm12,YMMWORD[$L$rol16] - vpaddd ymm8,ymm8,ymm12 - vpxor ymm4,ymm4,ymm8 - vpsrld ymm3,ymm4,20 - vpslld ymm4,ymm4,12 - vpxor ymm4,ymm4,ymm3 - vpaddd ymm0,ymm0,ymm4 - vpxor ymm12,ymm12,ymm0 - vpshufb ymm12,ymm12,YMMWORD[$L$rol8] - vpaddd ymm8,ymm8,ymm12 - vpxor ymm4,ymm4,ymm8 - vpslld ymm3,ymm4,7 - vpsrld ymm4,ymm4,25 - vpxor ymm4,ymm4,ymm3 - vpalignr ymm12,ymm12,ymm12,12 - vpalignr ymm8,ymm8,ymm8,8 - vpalignr ymm4,ymm4,ymm4,4 - vpaddd ymm1,ymm1,ymm5 - vpxor ymm13,ymm13,ymm1 - vpshufb ymm13,ymm13,YMMWORD[$L$rol16] - vpaddd ymm9,ymm9,ymm13 - vpxor ymm5,ymm5,ymm9 - vpsrld ymm3,ymm5,20 - vpslld ymm5,ymm5,12 - vpxor ymm5,ymm5,ymm3 - vpaddd ymm1,ymm1,ymm5 - vpxor ymm13,ymm13,ymm1 - vpshufb ymm13,ymm13,YMMWORD[$L$rol8] - vpaddd ymm9,ymm9,ymm13 - vpxor ymm5,ymm5,ymm9 - vpslld ymm3,ymm5,7 - vpsrld ymm5,ymm5,25 - vpxor ymm5,ymm5,ymm3 - vpalignr ymm13,ymm13,ymm13,12 - vpalignr ymm9,ymm9,ymm9,8 - vpalignr ymm5,ymm5,ymm5,4 - vpaddd ymm0,ymm0,ymm4 - vpxor ymm12,ymm12,ymm0 - vpshufb ymm12,ymm12,YMMWORD[$L$rol16] - vpaddd ymm8,ymm8,ymm12 - vpxor ymm4,ymm4,ymm8 - vpsrld ymm3,ymm4,20 - vpslld ymm4,ymm4,12 - vpxor ymm4,ymm4,ymm3 - vpaddd ymm0,ymm0,ymm4 - vpxor ymm12,ymm12,ymm0 - vpshufb ymm12,ymm12,YMMWORD[$L$rol8] - vpaddd ymm8,ymm8,ymm12 - vpxor ymm4,ymm4,ymm8 - vpslld ymm3,ymm4,7 - vpsrld ymm4,ymm4,25 - vpxor ymm4,ymm4,ymm3 - vpalignr ymm12,ymm12,ymm12,4 - vpalignr ymm8,ymm8,ymm8,8 - vpalignr ymm4,ymm4,ymm4,12 - vpaddd ymm1,ymm1,ymm5 - vpxor ymm13,ymm13,ymm1 - vpshufb ymm13,ymm13,YMMWORD[$L$rol16] - vpaddd ymm9,ymm9,ymm13 - vpxor ymm5,ymm5,ymm9 - vpsrld ymm3,ymm5,20 - vpslld ymm5,ymm5,12 - vpxor ymm5,ymm5,ymm3 - vpaddd ymm1,ymm1,ymm5 - vpxor ymm13,ymm13,ymm1 - vpshufb ymm13,ymm13,YMMWORD[$L$rol8] - vpaddd ymm9,ymm9,ymm13 - vpxor ymm5,ymm5,ymm9 - vpslld ymm3,ymm5,7 - vpsrld ymm5,ymm5,25 - vpxor ymm5,ymm5,ymm3 - vpalignr ymm13,ymm13,ymm13,4 - vpalignr ymm9,ymm9,ymm9,8 - vpalignr ymm5,ymm5,ymm5,12 - - dec r10 - jne NEAR $L$open_avx2_192_rounds - vpaddd ymm0,ymm0,ymm2 - vpaddd ymm1,ymm1,ymm2 - vpaddd ymm4,ymm4,ymm6 - vpaddd ymm5,ymm5,ymm6 - vpaddd ymm8,ymm8,ymm10 - vpaddd ymm9,ymm9,ymm10 - vpaddd ymm12,ymm12,ymm11 - vpaddd ymm13,ymm13,ymm15 - vperm2i128 ymm3,ymm4,ymm0,0x02 - - vpand ymm3,ymm3,YMMWORD[$L$clamp] - vmovdqa YMMWORD[(160+0)+rbp],ymm3 - - vperm2i128 ymm0,ymm4,ymm0,0x13 - vperm2i128 ymm4,ymm12,ymm8,0x13 - vperm2i128 ymm8,ymm5,ymm1,0x02 - vperm2i128 ymm12,ymm13,ymm9,0x02 - vperm2i128 ymm1,ymm5,ymm1,0x13 - vperm2i128 ymm5,ymm13,ymm9,0x13 -$L$open_avx2_short: - mov r8,r8 - call poly_hash_ad_internal -$L$open_avx2_short_hash_and_xor_loop: - cmp rbx,32 - jb NEAR $L$open_avx2_short_tail_32 - sub rbx,32 - add r10,QWORD[((0+0))+rsi] - adc r11,QWORD[((8+0))+rsi] - adc r12,1 - mov rax,QWORD[((0+160+0))+rbp] - mov r15,rax - mul r10 - mov r13,rax - mov r14,rdx - mov rax,QWORD[((0+160+0))+rbp] - mul r11 - imul r15,r12 - add r14,rax - adc r15,rdx - mov rax,QWORD[((8+160+0))+rbp] - mov r9,rax - mul r10 - add r14,rax - adc rdx,0 - mov r10,rdx - mov rax,QWORD[((8+160+0))+rbp] - mul r11 - add r15,rax - adc rdx,0 - imul r9,r12 - add r15,r10 - adc r9,rdx - mov r10,r13 - mov r11,r14 - mov r12,r15 - and r12,3 - mov r13,r15 - and r13,-4 - mov r14,r9 - shrd r15,r9,2 - shr r9,2 - add r15,r13 - adc r9,r14 - add r10,r15 - adc r11,r9 - adc r12,0 - add r10,QWORD[((0+16))+rsi] - adc r11,QWORD[((8+16))+rsi] - adc r12,1 - mov rax,QWORD[((0+160+0))+rbp] - mov r15,rax - mul r10 - mov r13,rax - mov r14,rdx - mov rax,QWORD[((0+160+0))+rbp] - mul r11 - imul r15,r12 - add r14,rax - adc r15,rdx - mov rax,QWORD[((8+160+0))+rbp] - mov r9,rax - mul r10 - add r14,rax - adc rdx,0 - mov r10,rdx - mov rax,QWORD[((8+160+0))+rbp] - mul r11 - add r15,rax - adc rdx,0 - imul r9,r12 - add r15,r10 - adc r9,rdx - mov r10,r13 - mov r11,r14 - mov r12,r15 - and r12,3 - mov r13,r15 - and r13,-4 - mov r14,r9 - shrd r15,r9,2 - shr r9,2 - add r15,r13 - adc r9,r14 - add r10,r15 - adc r11,r9 - adc r12,0 - - - vpxor ymm0,ymm0,YMMWORD[rsi] - vmovdqu YMMWORD[rdi],ymm0 - lea rsi,[32+rsi] - lea rdi,[32+rdi] - - vmovdqa ymm0,ymm4 - vmovdqa ymm4,ymm8 - vmovdqa ymm8,ymm12 - vmovdqa ymm12,ymm1 - vmovdqa ymm1,ymm5 - vmovdqa ymm5,ymm9 - vmovdqa ymm9,ymm13 - vmovdqa ymm13,ymm2 - vmovdqa ymm2,ymm6 - jmp NEAR $L$open_avx2_short_hash_and_xor_loop -$L$open_avx2_short_tail_32: - cmp rbx,16 - vmovdqa xmm1,xmm0 - jb NEAR $L$open_avx2_short_tail_32_exit - sub rbx,16 - add r10,QWORD[((0+0))+rsi] - adc r11,QWORD[((8+0))+rsi] - adc r12,1 - mov rax,QWORD[((0+160+0))+rbp] - mov r15,rax - mul r10 - mov r13,rax - mov r14,rdx - mov rax,QWORD[((0+160+0))+rbp] - mul r11 - imul r15,r12 - add r14,rax - adc r15,rdx - mov rax,QWORD[((8+160+0))+rbp] - mov r9,rax - mul r10 - add r14,rax - adc rdx,0 - mov r10,rdx - mov rax,QWORD[((8+160+0))+rbp] - mul r11 - add r15,rax - adc rdx,0 - imul r9,r12 - add r15,r10 - adc r9,rdx - mov r10,r13 - mov r11,r14 - mov r12,r15 - and r12,3 - mov r13,r15 - and r13,-4 - mov r14,r9 - shrd r15,r9,2 - shr r9,2 - add r15,r13 - adc r9,r14 - add r10,r15 - adc r11,r9 - adc r12,0 - - vpxor xmm3,xmm0,XMMWORD[rsi] - vmovdqu XMMWORD[rdi],xmm3 - lea rsi,[16+rsi] - lea rdi,[16+rdi] - vextracti128 xmm1,ymm0,1 -$L$open_avx2_short_tail_32_exit: - vzeroupper - jmp NEAR $L$open_sse_tail_16 - -$L$open_avx2_320: - vmovdqa ymm1,ymm0 - vmovdqa ymm2,ymm0 - vmovdqa ymm5,ymm4 - vmovdqa ymm6,ymm4 - vmovdqa ymm9,ymm8 - vmovdqa ymm10,ymm8 - vpaddd ymm13,ymm12,YMMWORD[$L$avx2_inc] - vpaddd ymm14,ymm13,YMMWORD[$L$avx2_inc] - vmovdqa ymm7,ymm4 - vmovdqa ymm11,ymm8 - vmovdqa YMMWORD[(160+160)+rbp],ymm12 - vmovdqa YMMWORD[(160+192)+rbp],ymm13 - vmovdqa YMMWORD[(160+224)+rbp],ymm14 - mov r10,10 -$L$open_avx2_320_rounds: - vpaddd ymm0,ymm0,ymm4 - vpxor ymm12,ymm12,ymm0 - vpshufb ymm12,ymm12,YMMWORD[$L$rol16] - vpaddd ymm8,ymm8,ymm12 - vpxor ymm4,ymm4,ymm8 - vpsrld ymm3,ymm4,20 - vpslld ymm4,ymm4,12 - vpxor ymm4,ymm4,ymm3 - vpaddd ymm0,ymm0,ymm4 - vpxor ymm12,ymm12,ymm0 - vpshufb ymm12,ymm12,YMMWORD[$L$rol8] - vpaddd ymm8,ymm8,ymm12 - vpxor ymm4,ymm4,ymm8 - vpslld ymm3,ymm4,7 - vpsrld ymm4,ymm4,25 - vpxor ymm4,ymm4,ymm3 - vpalignr ymm12,ymm12,ymm12,12 - vpalignr ymm8,ymm8,ymm8,8 - vpalignr ymm4,ymm4,ymm4,4 - vpaddd ymm1,ymm1,ymm5 - vpxor ymm13,ymm13,ymm1 - vpshufb ymm13,ymm13,YMMWORD[$L$rol16] - vpaddd ymm9,ymm9,ymm13 - vpxor ymm5,ymm5,ymm9 - vpsrld ymm3,ymm5,20 - vpslld ymm5,ymm5,12 - vpxor ymm5,ymm5,ymm3 - vpaddd ymm1,ymm1,ymm5 - vpxor ymm13,ymm13,ymm1 - vpshufb ymm13,ymm13,YMMWORD[$L$rol8] - vpaddd ymm9,ymm9,ymm13 - vpxor ymm5,ymm5,ymm9 - vpslld ymm3,ymm5,7 - vpsrld ymm5,ymm5,25 - vpxor ymm5,ymm5,ymm3 - vpalignr ymm13,ymm13,ymm13,12 - vpalignr ymm9,ymm9,ymm9,8 - vpalignr ymm5,ymm5,ymm5,4 - vpaddd ymm2,ymm2,ymm6 - vpxor ymm14,ymm14,ymm2 - vpshufb ymm14,ymm14,YMMWORD[$L$rol16] - vpaddd ymm10,ymm10,ymm14 - vpxor ymm6,ymm6,ymm10 - vpsrld ymm3,ymm6,20 - vpslld ymm6,ymm6,12 - vpxor ymm6,ymm6,ymm3 - vpaddd ymm2,ymm2,ymm6 - vpxor ymm14,ymm14,ymm2 - vpshufb ymm14,ymm14,YMMWORD[$L$rol8] - vpaddd ymm10,ymm10,ymm14 - vpxor ymm6,ymm6,ymm10 - vpslld ymm3,ymm6,7 - vpsrld ymm6,ymm6,25 - vpxor ymm6,ymm6,ymm3 - vpalignr ymm14,ymm14,ymm14,12 - vpalignr ymm10,ymm10,ymm10,8 - vpalignr ymm6,ymm6,ymm6,4 - vpaddd ymm0,ymm0,ymm4 - vpxor ymm12,ymm12,ymm0 - vpshufb ymm12,ymm12,YMMWORD[$L$rol16] - vpaddd ymm8,ymm8,ymm12 - vpxor ymm4,ymm4,ymm8 - vpsrld ymm3,ymm4,20 - vpslld ymm4,ymm4,12 - vpxor ymm4,ymm4,ymm3 - vpaddd ymm0,ymm0,ymm4 - vpxor ymm12,ymm12,ymm0 - vpshufb ymm12,ymm12,YMMWORD[$L$rol8] - vpaddd ymm8,ymm8,ymm12 - vpxor ymm4,ymm4,ymm8 - vpslld ymm3,ymm4,7 - vpsrld ymm4,ymm4,25 - vpxor ymm4,ymm4,ymm3 - vpalignr ymm12,ymm12,ymm12,4 - vpalignr ymm8,ymm8,ymm8,8 - vpalignr ymm4,ymm4,ymm4,12 - vpaddd ymm1,ymm1,ymm5 - vpxor ymm13,ymm13,ymm1 - vpshufb ymm13,ymm13,YMMWORD[$L$rol16] - vpaddd ymm9,ymm9,ymm13 - vpxor ymm5,ymm5,ymm9 - vpsrld ymm3,ymm5,20 - vpslld ymm5,ymm5,12 - vpxor ymm5,ymm5,ymm3 - vpaddd ymm1,ymm1,ymm5 - vpxor ymm13,ymm13,ymm1 - vpshufb ymm13,ymm13,YMMWORD[$L$rol8] - vpaddd ymm9,ymm9,ymm13 - vpxor ymm5,ymm5,ymm9 - vpslld ymm3,ymm5,7 - vpsrld ymm5,ymm5,25 - vpxor ymm5,ymm5,ymm3 - vpalignr ymm13,ymm13,ymm13,4 - vpalignr ymm9,ymm9,ymm9,8 - vpalignr ymm5,ymm5,ymm5,12 - vpaddd ymm2,ymm2,ymm6 - vpxor ymm14,ymm14,ymm2 - vpshufb ymm14,ymm14,YMMWORD[$L$rol16] - vpaddd ymm10,ymm10,ymm14 - vpxor ymm6,ymm6,ymm10 - vpsrld ymm3,ymm6,20 - vpslld ymm6,ymm6,12 - vpxor ymm6,ymm6,ymm3 - vpaddd ymm2,ymm2,ymm6 - vpxor ymm14,ymm14,ymm2 - vpshufb ymm14,ymm14,YMMWORD[$L$rol8] - vpaddd ymm10,ymm10,ymm14 - vpxor ymm6,ymm6,ymm10 - vpslld ymm3,ymm6,7 - vpsrld ymm6,ymm6,25 - vpxor ymm6,ymm6,ymm3 - vpalignr ymm14,ymm14,ymm14,4 - vpalignr ymm10,ymm10,ymm10,8 - vpalignr ymm6,ymm6,ymm6,12 - - dec r10 - jne NEAR $L$open_avx2_320_rounds - vpaddd ymm0,ymm0,YMMWORD[$L$chacha20_consts] - vpaddd ymm1,ymm1,YMMWORD[$L$chacha20_consts] - vpaddd ymm2,ymm2,YMMWORD[$L$chacha20_consts] - vpaddd ymm4,ymm4,ymm7 - vpaddd ymm5,ymm5,ymm7 - vpaddd ymm6,ymm6,ymm7 - vpaddd ymm8,ymm8,ymm11 - vpaddd ymm9,ymm9,ymm11 - vpaddd ymm10,ymm10,ymm11 - vpaddd ymm12,ymm12,YMMWORD[((160+160))+rbp] - vpaddd ymm13,ymm13,YMMWORD[((160+192))+rbp] - vpaddd ymm14,ymm14,YMMWORD[((160+224))+rbp] - vperm2i128 ymm3,ymm4,ymm0,0x02 - - vpand ymm3,ymm3,YMMWORD[$L$clamp] - vmovdqa YMMWORD[(160+0)+rbp],ymm3 - - vperm2i128 ymm0,ymm4,ymm0,0x13 - vperm2i128 ymm4,ymm12,ymm8,0x13 - vperm2i128 ymm8,ymm5,ymm1,0x02 - vperm2i128 ymm12,ymm13,ymm9,0x02 - vperm2i128 ymm1,ymm5,ymm1,0x13 - vperm2i128 ymm5,ymm13,ymm9,0x13 - vperm2i128 ymm9,ymm6,ymm2,0x02 - vperm2i128 ymm13,ymm14,ymm10,0x02 - vperm2i128 ymm2,ymm6,ymm2,0x13 - vperm2i128 ymm6,ymm14,ymm10,0x13 - jmp NEAR $L$open_avx2_short - - - - - -ALIGN 64 -chacha20_poly1305_seal_avx2: - - - - - - - - - - - - - vzeroupper - vmovdqa ymm0,YMMWORD[$L$chacha20_consts] - vbroadcasti128 ymm4,XMMWORD[r9] - vbroadcasti128 ymm8,XMMWORD[16+r9] - vbroadcasti128 ymm12,XMMWORD[32+r9] - vpaddd ymm12,ymm12,YMMWORD[$L$avx2_init] - cmp rbx,6*32 - jbe NEAR $L$seal_avx2_192 - cmp rbx,10*32 - jbe NEAR $L$seal_avx2_320 - vmovdqa ymm1,ymm0 - vmovdqa ymm2,ymm0 - vmovdqa ymm3,ymm0 - vmovdqa ymm5,ymm4 - vmovdqa ymm6,ymm4 - vmovdqa ymm7,ymm4 - vmovdqa YMMWORD[(160+64)+rbp],ymm4 - vmovdqa ymm9,ymm8 - vmovdqa ymm10,ymm8 - vmovdqa ymm11,ymm8 - vmovdqa YMMWORD[(160+96)+rbp],ymm8 - vmovdqa ymm15,ymm12 - vpaddd ymm14,ymm15,YMMWORD[$L$avx2_inc] - vpaddd ymm13,ymm14,YMMWORD[$L$avx2_inc] - vpaddd ymm12,ymm13,YMMWORD[$L$avx2_inc] - vmovdqa YMMWORD[(160+160)+rbp],ymm12 - vmovdqa YMMWORD[(160+192)+rbp],ymm13 - vmovdqa YMMWORD[(160+224)+rbp],ymm14 - vmovdqa YMMWORD[(160+256)+rbp],ymm15 - mov r10,10 -$L$seal_avx2_init_rounds: - vmovdqa YMMWORD[(160+128)+rbp],ymm8 - vmovdqa ymm8,YMMWORD[$L$rol16] - vpaddd ymm3,ymm3,ymm7 - vpaddd ymm2,ymm2,ymm6 - vpaddd ymm1,ymm1,ymm5 - vpaddd ymm0,ymm0,ymm4 - vpxor ymm15,ymm15,ymm3 - vpxor ymm14,ymm14,ymm2 - vpxor ymm13,ymm13,ymm1 - vpxor ymm12,ymm12,ymm0 - vpshufb ymm15,ymm15,ymm8 - vpshufb ymm14,ymm14,ymm8 - vpshufb ymm13,ymm13,ymm8 - vpshufb ymm12,ymm12,ymm8 - vpaddd ymm11,ymm11,ymm15 - vpaddd ymm10,ymm10,ymm14 - vpaddd ymm9,ymm9,ymm13 - vpaddd ymm8,ymm12,YMMWORD[((160+128))+rbp] - vpxor ymm7,ymm7,ymm11 - vpxor ymm6,ymm6,ymm10 - vpxor ymm5,ymm5,ymm9 - vpxor ymm4,ymm4,ymm8 - vmovdqa YMMWORD[(160+128)+rbp],ymm8 - vpsrld ymm8,ymm7,20 - vpslld ymm7,ymm7,32-20 - vpxor ymm7,ymm7,ymm8 - vpsrld ymm8,ymm6,20 - vpslld ymm6,ymm6,32-20 - vpxor ymm6,ymm6,ymm8 - vpsrld ymm8,ymm5,20 - vpslld ymm5,ymm5,32-20 - vpxor ymm5,ymm5,ymm8 - vpsrld ymm8,ymm4,20 - vpslld ymm4,ymm4,32-20 - vpxor ymm4,ymm4,ymm8 - vmovdqa ymm8,YMMWORD[$L$rol8] - vpaddd ymm3,ymm3,ymm7 - vpaddd ymm2,ymm2,ymm6 - vpaddd ymm1,ymm1,ymm5 - vpaddd ymm0,ymm0,ymm4 - vpxor ymm15,ymm15,ymm3 - vpxor ymm14,ymm14,ymm2 - vpxor ymm13,ymm13,ymm1 - vpxor ymm12,ymm12,ymm0 - vpshufb ymm15,ymm15,ymm8 - vpshufb ymm14,ymm14,ymm8 - vpshufb ymm13,ymm13,ymm8 - vpshufb ymm12,ymm12,ymm8 - vpaddd ymm11,ymm11,ymm15 - vpaddd ymm10,ymm10,ymm14 - vpaddd ymm9,ymm9,ymm13 - vpaddd ymm8,ymm12,YMMWORD[((160+128))+rbp] - vpxor ymm7,ymm7,ymm11 - vpxor ymm6,ymm6,ymm10 - vpxor ymm5,ymm5,ymm9 - vpxor ymm4,ymm4,ymm8 - vmovdqa YMMWORD[(160+128)+rbp],ymm8 - vpsrld ymm8,ymm7,25 - vpslld ymm7,ymm7,32-25 - vpxor ymm7,ymm7,ymm8 - vpsrld ymm8,ymm6,25 - vpslld ymm6,ymm6,32-25 - vpxor ymm6,ymm6,ymm8 - vpsrld ymm8,ymm5,25 - vpslld ymm5,ymm5,32-25 - vpxor ymm5,ymm5,ymm8 - vpsrld ymm8,ymm4,25 - vpslld ymm4,ymm4,32-25 - vpxor ymm4,ymm4,ymm8 - vmovdqa ymm8,YMMWORD[((160+128))+rbp] - vpalignr ymm7,ymm7,ymm7,4 - vpalignr ymm11,ymm11,ymm11,8 - vpalignr ymm15,ymm15,ymm15,12 - vpalignr ymm6,ymm6,ymm6,4 - vpalignr ymm10,ymm10,ymm10,8 - vpalignr ymm14,ymm14,ymm14,12 - vpalignr ymm5,ymm5,ymm5,4 - vpalignr ymm9,ymm9,ymm9,8 - vpalignr ymm13,ymm13,ymm13,12 - vpalignr ymm4,ymm4,ymm4,4 - vpalignr ymm8,ymm8,ymm8,8 - vpalignr ymm12,ymm12,ymm12,12 - vmovdqa YMMWORD[(160+128)+rbp],ymm8 - vmovdqa ymm8,YMMWORD[$L$rol16] - vpaddd ymm3,ymm3,ymm7 - vpaddd ymm2,ymm2,ymm6 - vpaddd ymm1,ymm1,ymm5 - vpaddd ymm0,ymm0,ymm4 - vpxor ymm15,ymm15,ymm3 - vpxor ymm14,ymm14,ymm2 - vpxor ymm13,ymm13,ymm1 - vpxor ymm12,ymm12,ymm0 - vpshufb ymm15,ymm15,ymm8 - vpshufb ymm14,ymm14,ymm8 - vpshufb ymm13,ymm13,ymm8 - vpshufb ymm12,ymm12,ymm8 - vpaddd ymm11,ymm11,ymm15 - vpaddd ymm10,ymm10,ymm14 - vpaddd ymm9,ymm9,ymm13 - vpaddd ymm8,ymm12,YMMWORD[((160+128))+rbp] - vpxor ymm7,ymm7,ymm11 - vpxor ymm6,ymm6,ymm10 - vpxor ymm5,ymm5,ymm9 - vpxor ymm4,ymm4,ymm8 - vmovdqa YMMWORD[(160+128)+rbp],ymm8 - vpsrld ymm8,ymm7,20 - vpslld ymm7,ymm7,32-20 - vpxor ymm7,ymm7,ymm8 - vpsrld ymm8,ymm6,20 - vpslld ymm6,ymm6,32-20 - vpxor ymm6,ymm6,ymm8 - vpsrld ymm8,ymm5,20 - vpslld ymm5,ymm5,32-20 - vpxor ymm5,ymm5,ymm8 - vpsrld ymm8,ymm4,20 - vpslld ymm4,ymm4,32-20 - vpxor ymm4,ymm4,ymm8 - vmovdqa ymm8,YMMWORD[$L$rol8] - vpaddd ymm3,ymm3,ymm7 - vpaddd ymm2,ymm2,ymm6 - vpaddd ymm1,ymm1,ymm5 - vpaddd ymm0,ymm0,ymm4 - vpxor ymm15,ymm15,ymm3 - vpxor ymm14,ymm14,ymm2 - vpxor ymm13,ymm13,ymm1 - vpxor ymm12,ymm12,ymm0 - vpshufb ymm15,ymm15,ymm8 - vpshufb ymm14,ymm14,ymm8 - vpshufb ymm13,ymm13,ymm8 - vpshufb ymm12,ymm12,ymm8 - vpaddd ymm11,ymm11,ymm15 - vpaddd ymm10,ymm10,ymm14 - vpaddd ymm9,ymm9,ymm13 - vpaddd ymm8,ymm12,YMMWORD[((160+128))+rbp] - vpxor ymm7,ymm7,ymm11 - vpxor ymm6,ymm6,ymm10 - vpxor ymm5,ymm5,ymm9 - vpxor ymm4,ymm4,ymm8 - vmovdqa YMMWORD[(160+128)+rbp],ymm8 - vpsrld ymm8,ymm7,25 - vpslld ymm7,ymm7,32-25 - vpxor ymm7,ymm7,ymm8 - vpsrld ymm8,ymm6,25 - vpslld ymm6,ymm6,32-25 - vpxor ymm6,ymm6,ymm8 - vpsrld ymm8,ymm5,25 - vpslld ymm5,ymm5,32-25 - vpxor ymm5,ymm5,ymm8 - vpsrld ymm8,ymm4,25 - vpslld ymm4,ymm4,32-25 - vpxor ymm4,ymm4,ymm8 - vmovdqa ymm8,YMMWORD[((160+128))+rbp] - vpalignr ymm7,ymm7,ymm7,12 - vpalignr ymm11,ymm11,ymm11,8 - vpalignr ymm15,ymm15,ymm15,4 - vpalignr ymm6,ymm6,ymm6,12 - vpalignr ymm10,ymm10,ymm10,8 - vpalignr ymm14,ymm14,ymm14,4 - vpalignr ymm5,ymm5,ymm5,12 - vpalignr ymm9,ymm9,ymm9,8 - vpalignr ymm13,ymm13,ymm13,4 - vpalignr ymm4,ymm4,ymm4,12 - vpalignr ymm8,ymm8,ymm8,8 - vpalignr ymm12,ymm12,ymm12,4 - - dec r10 - jnz NEAR $L$seal_avx2_init_rounds - vpaddd ymm3,ymm3,YMMWORD[$L$chacha20_consts] - vpaddd ymm7,ymm7,YMMWORD[((160+64))+rbp] - vpaddd ymm11,ymm11,YMMWORD[((160+96))+rbp] - vpaddd ymm15,ymm15,YMMWORD[((160+256))+rbp] - vpaddd ymm2,ymm2,YMMWORD[$L$chacha20_consts] - vpaddd ymm6,ymm6,YMMWORD[((160+64))+rbp] - vpaddd ymm10,ymm10,YMMWORD[((160+96))+rbp] - vpaddd ymm14,ymm14,YMMWORD[((160+224))+rbp] - vpaddd ymm1,ymm1,YMMWORD[$L$chacha20_consts] - vpaddd ymm5,ymm5,YMMWORD[((160+64))+rbp] - vpaddd ymm9,ymm9,YMMWORD[((160+96))+rbp] - vpaddd ymm13,ymm13,YMMWORD[((160+192))+rbp] - vpaddd ymm0,ymm0,YMMWORD[$L$chacha20_consts] - vpaddd ymm4,ymm4,YMMWORD[((160+64))+rbp] - vpaddd ymm8,ymm8,YMMWORD[((160+96))+rbp] - vpaddd ymm12,ymm12,YMMWORD[((160+160))+rbp] - - vperm2i128 ymm11,ymm15,ymm11,0x13 - vperm2i128 ymm15,ymm7,ymm3,0x02 - vperm2i128 ymm3,ymm7,ymm3,0x13 - vpand ymm15,ymm15,YMMWORD[$L$clamp] - vmovdqa YMMWORD[(160+0)+rbp],ymm15 - mov r8,r8 - call poly_hash_ad_internal - - vpxor ymm3,ymm3,YMMWORD[rsi] - vpxor ymm11,ymm11,YMMWORD[32+rsi] - vmovdqu YMMWORD[rdi],ymm3 - vmovdqu YMMWORD[32+rdi],ymm11 - vperm2i128 ymm15,ymm6,ymm2,0x02 - vperm2i128 ymm6,ymm6,ymm2,0x13 - vperm2i128 ymm2,ymm14,ymm10,0x02 - vperm2i128 ymm10,ymm14,ymm10,0x13 - vpxor ymm15,ymm15,YMMWORD[((0+64))+rsi] - vpxor ymm2,ymm2,YMMWORD[((32+64))+rsi] - vpxor ymm6,ymm6,YMMWORD[((64+64))+rsi] - vpxor ymm10,ymm10,YMMWORD[((96+64))+rsi] - vmovdqu YMMWORD[(0+64)+rdi],ymm15 - vmovdqu YMMWORD[(32+64)+rdi],ymm2 - vmovdqu YMMWORD[(64+64)+rdi],ymm6 - vmovdqu YMMWORD[(96+64)+rdi],ymm10 - vperm2i128 ymm15,ymm5,ymm1,0x02 - vperm2i128 ymm5,ymm5,ymm1,0x13 - vperm2i128 ymm1,ymm13,ymm9,0x02 - vperm2i128 ymm9,ymm13,ymm9,0x13 - vpxor ymm15,ymm15,YMMWORD[((0+192))+rsi] - vpxor ymm1,ymm1,YMMWORD[((32+192))+rsi] - vpxor ymm5,ymm5,YMMWORD[((64+192))+rsi] - vpxor ymm9,ymm9,YMMWORD[((96+192))+rsi] - vmovdqu YMMWORD[(0+192)+rdi],ymm15 - vmovdqu YMMWORD[(32+192)+rdi],ymm1 - vmovdqu YMMWORD[(64+192)+rdi],ymm5 - vmovdqu YMMWORD[(96+192)+rdi],ymm9 - vperm2i128 ymm15,ymm4,ymm0,0x13 - vperm2i128 ymm0,ymm4,ymm0,0x02 - vperm2i128 ymm4,ymm12,ymm8,0x02 - vperm2i128 ymm12,ymm12,ymm8,0x13 - vmovdqa ymm8,ymm15 - - lea rsi,[320+rsi] - sub rbx,10*32 - mov rcx,10*32 - cmp rbx,4*32 - jbe NEAR $L$seal_avx2_short_hash_remainder - vpxor ymm0,ymm0,YMMWORD[rsi] - vpxor ymm4,ymm4,YMMWORD[32+rsi] - vpxor ymm8,ymm8,YMMWORD[64+rsi] - vpxor ymm12,ymm12,YMMWORD[96+rsi] - vmovdqu YMMWORD[320+rdi],ymm0 - vmovdqu YMMWORD[352+rdi],ymm4 - vmovdqu YMMWORD[384+rdi],ymm8 - vmovdqu YMMWORD[416+rdi],ymm12 - lea rsi,[128+rsi] - sub rbx,4*32 - mov rcx,8 - mov r8,2 - cmp rbx,4*32 - jbe NEAR $L$seal_avx2_tail_128 - cmp rbx,8*32 - jbe NEAR $L$seal_avx2_tail_256 - cmp rbx,12*32 - jbe NEAR $L$seal_avx2_tail_384 - cmp rbx,16*32 - jbe NEAR $L$seal_avx2_tail_512 - vmovdqa ymm0,YMMWORD[$L$chacha20_consts] - vmovdqa ymm4,YMMWORD[((160+64))+rbp] - vmovdqa ymm8,YMMWORD[((160+96))+rbp] - vmovdqa ymm1,ymm0 - vmovdqa ymm5,ymm4 - vmovdqa ymm9,ymm8 - vmovdqa ymm2,ymm0 - vmovdqa ymm6,ymm4 - vmovdqa ymm10,ymm8 - vmovdqa ymm3,ymm0 - vmovdqa ymm7,ymm4 - vmovdqa ymm11,ymm8 - vmovdqa ymm12,YMMWORD[$L$avx2_inc] - vpaddd ymm15,ymm12,YMMWORD[((160+160))+rbp] - vpaddd ymm14,ymm12,ymm15 - vpaddd ymm13,ymm12,ymm14 - vpaddd ymm12,ymm12,ymm13 - vmovdqa YMMWORD[(160+256)+rbp],ymm15 - vmovdqa YMMWORD[(160+224)+rbp],ymm14 - vmovdqa YMMWORD[(160+192)+rbp],ymm13 - vmovdqa YMMWORD[(160+160)+rbp],ymm12 - vmovdqa YMMWORD[(160+128)+rbp],ymm8 - vmovdqa ymm8,YMMWORD[$L$rol16] - vpaddd ymm3,ymm3,ymm7 - vpaddd ymm2,ymm2,ymm6 - vpaddd ymm1,ymm1,ymm5 - vpaddd ymm0,ymm0,ymm4 - vpxor ymm15,ymm15,ymm3 - vpxor ymm14,ymm14,ymm2 - vpxor ymm13,ymm13,ymm1 - vpxor ymm12,ymm12,ymm0 - vpshufb ymm15,ymm15,ymm8 - vpshufb ymm14,ymm14,ymm8 - vpshufb ymm13,ymm13,ymm8 - vpshufb ymm12,ymm12,ymm8 - vpaddd ymm11,ymm11,ymm15 - vpaddd ymm10,ymm10,ymm14 - vpaddd ymm9,ymm9,ymm13 - vpaddd ymm8,ymm12,YMMWORD[((160+128))+rbp] - vpxor ymm7,ymm7,ymm11 - vpxor ymm6,ymm6,ymm10 - vpxor ymm5,ymm5,ymm9 - vpxor ymm4,ymm4,ymm8 - vmovdqa YMMWORD[(160+128)+rbp],ymm8 - vpsrld ymm8,ymm7,20 - vpslld ymm7,ymm7,32-20 - vpxor ymm7,ymm7,ymm8 - vpsrld ymm8,ymm6,20 - vpslld ymm6,ymm6,32-20 - vpxor ymm6,ymm6,ymm8 - vpsrld ymm8,ymm5,20 - vpslld ymm5,ymm5,32-20 - vpxor ymm5,ymm5,ymm8 - vpsrld ymm8,ymm4,20 - vpslld ymm4,ymm4,32-20 - vpxor ymm4,ymm4,ymm8 - vmovdqa ymm8,YMMWORD[$L$rol8] - vpaddd ymm3,ymm3,ymm7 - vpaddd ymm2,ymm2,ymm6 - vpaddd ymm1,ymm1,ymm5 - vpaddd ymm0,ymm0,ymm4 - vpxor ymm15,ymm15,ymm3 - vpxor ymm14,ymm14,ymm2 - vpxor ymm13,ymm13,ymm1 - vpxor ymm12,ymm12,ymm0 - vpshufb ymm15,ymm15,ymm8 - vpshufb ymm14,ymm14,ymm8 - vpshufb ymm13,ymm13,ymm8 - vpshufb ymm12,ymm12,ymm8 - vpaddd ymm11,ymm11,ymm15 - vpaddd ymm10,ymm10,ymm14 - vpaddd ymm9,ymm9,ymm13 - vpaddd ymm8,ymm12,YMMWORD[((160+128))+rbp] - vpxor ymm7,ymm7,ymm11 - vpxor ymm6,ymm6,ymm10 - vpxor ymm5,ymm5,ymm9 - vpxor ymm4,ymm4,ymm8 - vmovdqa YMMWORD[(160+128)+rbp],ymm8 - vpsrld ymm8,ymm7,25 - vpslld ymm7,ymm7,32-25 - vpxor ymm7,ymm7,ymm8 - vpsrld ymm8,ymm6,25 - vpslld ymm6,ymm6,32-25 - vpxor ymm6,ymm6,ymm8 - vpsrld ymm8,ymm5,25 - vpslld ymm5,ymm5,32-25 - vpxor ymm5,ymm5,ymm8 - vpsrld ymm8,ymm4,25 - vpslld ymm4,ymm4,32-25 - vpxor ymm4,ymm4,ymm8 - vmovdqa ymm8,YMMWORD[((160+128))+rbp] - vpalignr ymm7,ymm7,ymm7,4 - vpalignr ymm11,ymm11,ymm11,8 - vpalignr ymm15,ymm15,ymm15,12 - vpalignr ymm6,ymm6,ymm6,4 - vpalignr ymm10,ymm10,ymm10,8 - vpalignr ymm14,ymm14,ymm14,12 - vpalignr ymm5,ymm5,ymm5,4 - vpalignr ymm9,ymm9,ymm9,8 - vpalignr ymm13,ymm13,ymm13,12 - vpalignr ymm4,ymm4,ymm4,4 - vpalignr ymm8,ymm8,ymm8,8 - vpalignr ymm12,ymm12,ymm12,12 - vmovdqa YMMWORD[(160+128)+rbp],ymm8 - vmovdqa ymm8,YMMWORD[$L$rol16] - vpaddd ymm3,ymm3,ymm7 - vpaddd ymm2,ymm2,ymm6 - vpaddd ymm1,ymm1,ymm5 - vpaddd ymm0,ymm0,ymm4 - vpxor ymm15,ymm15,ymm3 - vpxor ymm14,ymm14,ymm2 - vpxor ymm13,ymm13,ymm1 - vpxor ymm12,ymm12,ymm0 - vpshufb ymm15,ymm15,ymm8 - vpshufb ymm14,ymm14,ymm8 - vpshufb ymm13,ymm13,ymm8 - vpshufb ymm12,ymm12,ymm8 - vpaddd ymm11,ymm11,ymm15 - vpaddd ymm10,ymm10,ymm14 - vpaddd ymm9,ymm9,ymm13 - vpaddd ymm8,ymm12,YMMWORD[((160+128))+rbp] - vpxor ymm7,ymm7,ymm11 - vpxor ymm6,ymm6,ymm10 - vpxor ymm5,ymm5,ymm9 - vpxor ymm4,ymm4,ymm8 - vmovdqa YMMWORD[(160+128)+rbp],ymm8 - vpsrld ymm8,ymm7,20 - vpslld ymm7,ymm7,32-20 - vpxor ymm7,ymm7,ymm8 - vpsrld ymm8,ymm6,20 - vpslld ymm6,ymm6,32-20 - vpxor ymm6,ymm6,ymm8 - vpsrld ymm8,ymm5,20 - vpslld ymm5,ymm5,32-20 - vpxor ymm5,ymm5,ymm8 - vpsrld ymm8,ymm4,20 - vpslld ymm4,ymm4,32-20 - vpxor ymm4,ymm4,ymm8 - vmovdqa ymm8,YMMWORD[$L$rol8] - vpaddd ymm3,ymm3,ymm7 - vpaddd ymm2,ymm2,ymm6 - vpaddd ymm1,ymm1,ymm5 - vpaddd ymm0,ymm0,ymm4 - vpxor ymm15,ymm15,ymm3 - vpxor ymm14,ymm14,ymm2 - vpxor ymm13,ymm13,ymm1 - vpxor ymm12,ymm12,ymm0 - vpshufb ymm15,ymm15,ymm8 - vpshufb ymm14,ymm14,ymm8 - vpshufb ymm13,ymm13,ymm8 - vpshufb ymm12,ymm12,ymm8 - vpaddd ymm11,ymm11,ymm15 - vpaddd ymm10,ymm10,ymm14 - vpaddd ymm9,ymm9,ymm13 - vpaddd ymm8,ymm12,YMMWORD[((160+128))+rbp] - vpxor ymm7,ymm7,ymm11 - vpxor ymm6,ymm6,ymm10 - vpxor ymm5,ymm5,ymm9 - vpxor ymm4,ymm4,ymm8 - vmovdqa YMMWORD[(160+128)+rbp],ymm8 - vpsrld ymm8,ymm7,25 - vpslld ymm7,ymm7,32-25 - vpxor ymm7,ymm7,ymm8 - vpsrld ymm8,ymm6,25 - vpslld ymm6,ymm6,32-25 - vpxor ymm6,ymm6,ymm8 - vpsrld ymm8,ymm5,25 - vpslld ymm5,ymm5,32-25 - vpxor ymm5,ymm5,ymm8 - vpsrld ymm8,ymm4,25 - vpslld ymm4,ymm4,32-25 - vpxor ymm4,ymm4,ymm8 - vmovdqa ymm8,YMMWORD[((160+128))+rbp] - vpalignr ymm7,ymm7,ymm7,12 - vpalignr ymm11,ymm11,ymm11,8 - vpalignr ymm15,ymm15,ymm15,4 - vpalignr ymm6,ymm6,ymm6,12 - vpalignr ymm10,ymm10,ymm10,8 - vpalignr ymm14,ymm14,ymm14,4 - vpalignr ymm5,ymm5,ymm5,12 - vpalignr ymm9,ymm9,ymm9,8 - vpalignr ymm13,ymm13,ymm13,4 - vpalignr ymm4,ymm4,ymm4,12 - vpalignr ymm8,ymm8,ymm8,8 - vpalignr ymm12,ymm12,ymm12,4 - vmovdqa YMMWORD[(160+128)+rbp],ymm8 - vmovdqa ymm8,YMMWORD[$L$rol16] - vpaddd ymm3,ymm3,ymm7 - vpaddd ymm2,ymm2,ymm6 - vpaddd ymm1,ymm1,ymm5 - vpaddd ymm0,ymm0,ymm4 - vpxor ymm15,ymm15,ymm3 - vpxor ymm14,ymm14,ymm2 - vpxor ymm13,ymm13,ymm1 - vpxor ymm12,ymm12,ymm0 - vpshufb ymm15,ymm15,ymm8 - vpshufb ymm14,ymm14,ymm8 - vpshufb ymm13,ymm13,ymm8 - vpshufb ymm12,ymm12,ymm8 - vpaddd ymm11,ymm11,ymm15 - vpaddd ymm10,ymm10,ymm14 - vpaddd ymm9,ymm9,ymm13 - vpaddd ymm8,ymm12,YMMWORD[((160+128))+rbp] - vpxor ymm7,ymm7,ymm11 - vpxor ymm6,ymm6,ymm10 - vpxor ymm5,ymm5,ymm9 - vpxor ymm4,ymm4,ymm8 - vmovdqa YMMWORD[(160+128)+rbp],ymm8 - vpsrld ymm8,ymm7,20 - vpslld ymm7,ymm7,32-20 - vpxor ymm7,ymm7,ymm8 - vpsrld ymm8,ymm6,20 - vpslld ymm6,ymm6,32-20 - vpxor ymm6,ymm6,ymm8 - vpsrld ymm8,ymm5,20 - vpslld ymm5,ymm5,32-20 - vpxor ymm5,ymm5,ymm8 - vpsrld ymm8,ymm4,20 - vpslld ymm4,ymm4,32-20 - vpxor ymm4,ymm4,ymm8 - vmovdqa ymm8,YMMWORD[$L$rol8] - vpaddd ymm3,ymm3,ymm7 - vpaddd ymm2,ymm2,ymm6 - vpaddd ymm1,ymm1,ymm5 - vpaddd ymm0,ymm0,ymm4 - vpxor ymm15,ymm15,ymm3 - - sub rdi,16 - mov rcx,9 - jmp NEAR $L$seal_avx2_main_loop_rounds_entry -ALIGN 32 -$L$seal_avx2_main_loop: - vmovdqa ymm0,YMMWORD[$L$chacha20_consts] - vmovdqa ymm4,YMMWORD[((160+64))+rbp] - vmovdqa ymm8,YMMWORD[((160+96))+rbp] - vmovdqa ymm1,ymm0 - vmovdqa ymm5,ymm4 - vmovdqa ymm9,ymm8 - vmovdqa ymm2,ymm0 - vmovdqa ymm6,ymm4 - vmovdqa ymm10,ymm8 - vmovdqa ymm3,ymm0 - vmovdqa ymm7,ymm4 - vmovdqa ymm11,ymm8 - vmovdqa ymm12,YMMWORD[$L$avx2_inc] - vpaddd ymm15,ymm12,YMMWORD[((160+160))+rbp] - vpaddd ymm14,ymm12,ymm15 - vpaddd ymm13,ymm12,ymm14 - vpaddd ymm12,ymm12,ymm13 - vmovdqa YMMWORD[(160+256)+rbp],ymm15 - vmovdqa YMMWORD[(160+224)+rbp],ymm14 - vmovdqa YMMWORD[(160+192)+rbp],ymm13 - vmovdqa YMMWORD[(160+160)+rbp],ymm12 - - mov rcx,10 -ALIGN 32 -$L$seal_avx2_main_loop_rounds: - add r10,QWORD[((0+0))+rdi] - adc r11,QWORD[((8+0))+rdi] - adc r12,1 - vmovdqa YMMWORD[(160+128)+rbp],ymm8 - vmovdqa ymm8,YMMWORD[$L$rol16] - vpaddd ymm3,ymm3,ymm7 - vpaddd ymm2,ymm2,ymm6 - vpaddd ymm1,ymm1,ymm5 - vpaddd ymm0,ymm0,ymm4 - vpxor ymm15,ymm15,ymm3 - vpxor ymm14,ymm14,ymm2 - vpxor ymm13,ymm13,ymm1 - vpxor ymm12,ymm12,ymm0 - mov rdx,QWORD[((0+160+0))+rbp] - mov r15,rdx - mulx r14,r13,r10 - mulx rdx,rax,r11 - imul r15,r12 - add r14,rax - adc r15,rdx - vpshufb ymm15,ymm15,ymm8 - vpshufb ymm14,ymm14,ymm8 - vpshufb ymm13,ymm13,ymm8 - vpshufb ymm12,ymm12,ymm8 - vpaddd ymm11,ymm11,ymm15 - vpaddd ymm10,ymm10,ymm14 - vpaddd ymm9,ymm9,ymm13 - vpaddd ymm8,ymm12,YMMWORD[((160+128))+rbp] - vpxor ymm7,ymm7,ymm11 - mov rdx,QWORD[((8+160+0))+rbp] - mulx rax,r10,r10 - add r14,r10 - mulx r9,r11,r11 - adc r15,r11 - adc r9,0 - imul rdx,r12 - vpxor ymm6,ymm6,ymm10 - vpxor ymm5,ymm5,ymm9 - vpxor ymm4,ymm4,ymm8 - vmovdqa YMMWORD[(160+128)+rbp],ymm8 - vpsrld ymm8,ymm7,20 - vpslld ymm7,ymm7,32-20 - vpxor ymm7,ymm7,ymm8 - vpsrld ymm8,ymm6,20 - vpslld ymm6,ymm6,32-20 - vpxor ymm6,ymm6,ymm8 - vpsrld ymm8,ymm5,20 - vpslld ymm5,ymm5,32-20 - add r15,rax - adc r9,rdx - vpxor ymm5,ymm5,ymm8 - vpsrld ymm8,ymm4,20 - vpslld ymm4,ymm4,32-20 - vpxor ymm4,ymm4,ymm8 - vmovdqa ymm8,YMMWORD[$L$rol8] - vpaddd ymm3,ymm3,ymm7 - vpaddd ymm2,ymm2,ymm6 - vpaddd ymm1,ymm1,ymm5 - vpaddd ymm0,ymm0,ymm4 - vpxor ymm15,ymm15,ymm3 - mov r10,r13 - mov r11,r14 - mov r12,r15 - and r12,3 - mov r13,r15 - and r13,-4 - mov r14,r9 - shrd r15,r9,2 - shr r9,2 - add r15,r13 - adc r9,r14 - add r10,r15 - adc r11,r9 - adc r12,0 - -$L$seal_avx2_main_loop_rounds_entry: - vpxor ymm14,ymm14,ymm2 - vpxor ymm13,ymm13,ymm1 - vpxor ymm12,ymm12,ymm0 - vpshufb ymm15,ymm15,ymm8 - vpshufb ymm14,ymm14,ymm8 - vpshufb ymm13,ymm13,ymm8 - vpshufb ymm12,ymm12,ymm8 - vpaddd ymm11,ymm11,ymm15 - vpaddd ymm10,ymm10,ymm14 - add r10,QWORD[((0+16))+rdi] - adc r11,QWORD[((8+16))+rdi] - adc r12,1 - vpaddd ymm9,ymm9,ymm13 - vpaddd ymm8,ymm12,YMMWORD[((160+128))+rbp] - vpxor ymm7,ymm7,ymm11 - vpxor ymm6,ymm6,ymm10 - vpxor ymm5,ymm5,ymm9 - vpxor ymm4,ymm4,ymm8 - vmovdqa YMMWORD[(160+128)+rbp],ymm8 - vpsrld ymm8,ymm7,25 - mov rdx,QWORD[((0+160+0))+rbp] - mov r15,rdx - mulx r14,r13,r10 - mulx rdx,rax,r11 - imul r15,r12 - add r14,rax - adc r15,rdx - vpslld ymm7,ymm7,32-25 - vpxor ymm7,ymm7,ymm8 - vpsrld ymm8,ymm6,25 - vpslld ymm6,ymm6,32-25 - vpxor ymm6,ymm6,ymm8 - vpsrld ymm8,ymm5,25 - vpslld ymm5,ymm5,32-25 - vpxor ymm5,ymm5,ymm8 - vpsrld ymm8,ymm4,25 - vpslld ymm4,ymm4,32-25 - vpxor ymm4,ymm4,ymm8 - vmovdqa ymm8,YMMWORD[((160+128))+rbp] - vpalignr ymm7,ymm7,ymm7,4 - vpalignr ymm11,ymm11,ymm11,8 - vpalignr ymm15,ymm15,ymm15,12 - vpalignr ymm6,ymm6,ymm6,4 - vpalignr ymm10,ymm10,ymm10,8 - vpalignr ymm14,ymm14,ymm14,12 - mov rdx,QWORD[((8+160+0))+rbp] - mulx rax,r10,r10 - add r14,r10 - mulx r9,r11,r11 - adc r15,r11 - adc r9,0 - imul rdx,r12 - vpalignr ymm5,ymm5,ymm5,4 - vpalignr ymm9,ymm9,ymm9,8 - vpalignr ymm13,ymm13,ymm13,12 - vpalignr ymm4,ymm4,ymm4,4 - vpalignr ymm8,ymm8,ymm8,8 - vpalignr ymm12,ymm12,ymm12,12 - vmovdqa YMMWORD[(160+128)+rbp],ymm8 - vmovdqa ymm8,YMMWORD[$L$rol16] - vpaddd ymm3,ymm3,ymm7 - vpaddd ymm2,ymm2,ymm6 - vpaddd ymm1,ymm1,ymm5 - vpaddd ymm0,ymm0,ymm4 - vpxor ymm15,ymm15,ymm3 - vpxor ymm14,ymm14,ymm2 - vpxor ymm13,ymm13,ymm1 - vpxor ymm12,ymm12,ymm0 - vpshufb ymm15,ymm15,ymm8 - vpshufb ymm14,ymm14,ymm8 - add r15,rax - adc r9,rdx - vpshufb ymm13,ymm13,ymm8 - vpshufb ymm12,ymm12,ymm8 - vpaddd ymm11,ymm11,ymm15 - vpaddd ymm10,ymm10,ymm14 - vpaddd ymm9,ymm9,ymm13 - vpaddd ymm8,ymm12,YMMWORD[((160+128))+rbp] - vpxor ymm7,ymm7,ymm11 - vpxor ymm6,ymm6,ymm10 - vpxor ymm5,ymm5,ymm9 - mov r10,r13 - mov r11,r14 - mov r12,r15 - and r12,3 - mov r13,r15 - and r13,-4 - mov r14,r9 - shrd r15,r9,2 - shr r9,2 - add r15,r13 - adc r9,r14 - add r10,r15 - adc r11,r9 - adc r12,0 - vpxor ymm4,ymm4,ymm8 - vmovdqa YMMWORD[(160+128)+rbp],ymm8 - vpsrld ymm8,ymm7,20 - vpslld ymm7,ymm7,32-20 - vpxor ymm7,ymm7,ymm8 - vpsrld ymm8,ymm6,20 - vpslld ymm6,ymm6,32-20 - vpxor ymm6,ymm6,ymm8 - add r10,QWORD[((0+32))+rdi] - adc r11,QWORD[((8+32))+rdi] - adc r12,1 - - lea rdi,[48+rdi] - vpsrld ymm8,ymm5,20 - vpslld ymm5,ymm5,32-20 - vpxor ymm5,ymm5,ymm8 - vpsrld ymm8,ymm4,20 - vpslld ymm4,ymm4,32-20 - vpxor ymm4,ymm4,ymm8 - vmovdqa ymm8,YMMWORD[$L$rol8] - vpaddd ymm3,ymm3,ymm7 - vpaddd ymm2,ymm2,ymm6 - vpaddd ymm1,ymm1,ymm5 - vpaddd ymm0,ymm0,ymm4 - vpxor ymm15,ymm15,ymm3 - vpxor ymm14,ymm14,ymm2 - vpxor ymm13,ymm13,ymm1 - vpxor ymm12,ymm12,ymm0 - vpshufb ymm15,ymm15,ymm8 - vpshufb ymm14,ymm14,ymm8 - vpshufb ymm13,ymm13,ymm8 - mov rdx,QWORD[((0+160+0))+rbp] - mov r15,rdx - mulx r14,r13,r10 - mulx rdx,rax,r11 - imul r15,r12 - add r14,rax - adc r15,rdx - vpshufb ymm12,ymm12,ymm8 - vpaddd ymm11,ymm11,ymm15 - vpaddd ymm10,ymm10,ymm14 - vpaddd ymm9,ymm9,ymm13 - vpaddd ymm8,ymm12,YMMWORD[((160+128))+rbp] - vpxor ymm7,ymm7,ymm11 - vpxor ymm6,ymm6,ymm10 - vpxor ymm5,ymm5,ymm9 - mov rdx,QWORD[((8+160+0))+rbp] - mulx rax,r10,r10 - add r14,r10 - mulx r9,r11,r11 - adc r15,r11 - adc r9,0 - imul rdx,r12 - vpxor ymm4,ymm4,ymm8 - vmovdqa YMMWORD[(160+128)+rbp],ymm8 - vpsrld ymm8,ymm7,25 - vpslld ymm7,ymm7,32-25 - vpxor ymm7,ymm7,ymm8 - vpsrld ymm8,ymm6,25 - vpslld ymm6,ymm6,32-25 - vpxor ymm6,ymm6,ymm8 - add r15,rax - adc r9,rdx - vpsrld ymm8,ymm5,25 - vpslld ymm5,ymm5,32-25 - vpxor ymm5,ymm5,ymm8 - vpsrld ymm8,ymm4,25 - vpslld ymm4,ymm4,32-25 - vpxor ymm4,ymm4,ymm8 - vmovdqa ymm8,YMMWORD[((160+128))+rbp] - vpalignr ymm7,ymm7,ymm7,12 - vpalignr ymm11,ymm11,ymm11,8 - vpalignr ymm15,ymm15,ymm15,4 - vpalignr ymm6,ymm6,ymm6,12 - vpalignr ymm10,ymm10,ymm10,8 - vpalignr ymm14,ymm14,ymm14,4 - vpalignr ymm5,ymm5,ymm5,12 - vpalignr ymm9,ymm9,ymm9,8 - vpalignr ymm13,ymm13,ymm13,4 - vpalignr ymm4,ymm4,ymm4,12 - vpalignr ymm8,ymm8,ymm8,8 - mov r10,r13 - mov r11,r14 - mov r12,r15 - and r12,3 - mov r13,r15 - and r13,-4 - mov r14,r9 - shrd r15,r9,2 - shr r9,2 - add r15,r13 - adc r9,r14 - add r10,r15 - adc r11,r9 - adc r12,0 - vpalignr ymm12,ymm12,ymm12,4 - - dec rcx - jne NEAR $L$seal_avx2_main_loop_rounds - vpaddd ymm3,ymm3,YMMWORD[$L$chacha20_consts] - vpaddd ymm7,ymm7,YMMWORD[((160+64))+rbp] - vpaddd ymm11,ymm11,YMMWORD[((160+96))+rbp] - vpaddd ymm15,ymm15,YMMWORD[((160+256))+rbp] - vpaddd ymm2,ymm2,YMMWORD[$L$chacha20_consts] - vpaddd ymm6,ymm6,YMMWORD[((160+64))+rbp] - vpaddd ymm10,ymm10,YMMWORD[((160+96))+rbp] - vpaddd ymm14,ymm14,YMMWORD[((160+224))+rbp] - vpaddd ymm1,ymm1,YMMWORD[$L$chacha20_consts] - vpaddd ymm5,ymm5,YMMWORD[((160+64))+rbp] - vpaddd ymm9,ymm9,YMMWORD[((160+96))+rbp] - vpaddd ymm13,ymm13,YMMWORD[((160+192))+rbp] - vpaddd ymm0,ymm0,YMMWORD[$L$chacha20_consts] - vpaddd ymm4,ymm4,YMMWORD[((160+64))+rbp] - vpaddd ymm8,ymm8,YMMWORD[((160+96))+rbp] - vpaddd ymm12,ymm12,YMMWORD[((160+160))+rbp] - - vmovdqa YMMWORD[(160+128)+rbp],ymm0 - add r10,QWORD[((0+0))+rdi] - adc r11,QWORD[((8+0))+rdi] - adc r12,1 - mov rdx,QWORD[((0+160+0))+rbp] - mov r15,rdx - mulx r14,r13,r10 - mulx rdx,rax,r11 - imul r15,r12 - add r14,rax - adc r15,rdx - mov rdx,QWORD[((8+160+0))+rbp] - mulx rax,r10,r10 - add r14,r10 - mulx r9,r11,r11 - adc r15,r11 - adc r9,0 - imul rdx,r12 - add r15,rax - adc r9,rdx - mov r10,r13 - mov r11,r14 - mov r12,r15 - and r12,3 - mov r13,r15 - and r13,-4 - mov r14,r9 - shrd r15,r9,2 - shr r9,2 - add r15,r13 - adc r9,r14 - add r10,r15 - adc r11,r9 - adc r12,0 - add r10,QWORD[((0+16))+rdi] - adc r11,QWORD[((8+16))+rdi] - adc r12,1 - mov rdx,QWORD[((0+160+0))+rbp] - mov r15,rdx - mulx r14,r13,r10 - mulx rdx,rax,r11 - imul r15,r12 - add r14,rax - adc r15,rdx - mov rdx,QWORD[((8+160+0))+rbp] - mulx rax,r10,r10 - add r14,r10 - mulx r9,r11,r11 - adc r15,r11 - adc r9,0 - imul rdx,r12 - add r15,rax - adc r9,rdx - mov r10,r13 - mov r11,r14 - mov r12,r15 - and r12,3 - mov r13,r15 - and r13,-4 - mov r14,r9 - shrd r15,r9,2 - shr r9,2 - add r15,r13 - adc r9,r14 - add r10,r15 - adc r11,r9 - adc r12,0 - - lea rdi,[32+rdi] - vperm2i128 ymm0,ymm7,ymm3,0x02 - vperm2i128 ymm7,ymm7,ymm3,0x13 - vperm2i128 ymm3,ymm15,ymm11,0x02 - vperm2i128 ymm11,ymm15,ymm11,0x13 - vpxor ymm0,ymm0,YMMWORD[((0+0))+rsi] - vpxor ymm3,ymm3,YMMWORD[((32+0))+rsi] - vpxor ymm7,ymm7,YMMWORD[((64+0))+rsi] - vpxor ymm11,ymm11,YMMWORD[((96+0))+rsi] - vmovdqu YMMWORD[(0+0)+rdi],ymm0 - vmovdqu YMMWORD[(32+0)+rdi],ymm3 - vmovdqu YMMWORD[(64+0)+rdi],ymm7 - vmovdqu YMMWORD[(96+0)+rdi],ymm11 - - vmovdqa ymm0,YMMWORD[((160+128))+rbp] - vperm2i128 ymm3,ymm6,ymm2,0x02 - vperm2i128 ymm6,ymm6,ymm2,0x13 - vperm2i128 ymm2,ymm14,ymm10,0x02 - vperm2i128 ymm10,ymm14,ymm10,0x13 - vpxor ymm3,ymm3,YMMWORD[((0+128))+rsi] - vpxor ymm2,ymm2,YMMWORD[((32+128))+rsi] - vpxor ymm6,ymm6,YMMWORD[((64+128))+rsi] - vpxor ymm10,ymm10,YMMWORD[((96+128))+rsi] - vmovdqu YMMWORD[(0+128)+rdi],ymm3 - vmovdqu YMMWORD[(32+128)+rdi],ymm2 - vmovdqu YMMWORD[(64+128)+rdi],ymm6 - vmovdqu YMMWORD[(96+128)+rdi],ymm10 - vperm2i128 ymm3,ymm5,ymm1,0x02 - vperm2i128 ymm5,ymm5,ymm1,0x13 - vperm2i128 ymm1,ymm13,ymm9,0x02 - vperm2i128 ymm9,ymm13,ymm9,0x13 - vpxor ymm3,ymm3,YMMWORD[((0+256))+rsi] - vpxor ymm1,ymm1,YMMWORD[((32+256))+rsi] - vpxor ymm5,ymm5,YMMWORD[((64+256))+rsi] - vpxor ymm9,ymm9,YMMWORD[((96+256))+rsi] - vmovdqu YMMWORD[(0+256)+rdi],ymm3 - vmovdqu YMMWORD[(32+256)+rdi],ymm1 - vmovdqu YMMWORD[(64+256)+rdi],ymm5 - vmovdqu YMMWORD[(96+256)+rdi],ymm9 - vperm2i128 ymm3,ymm4,ymm0,0x02 - vperm2i128 ymm4,ymm4,ymm0,0x13 - vperm2i128 ymm0,ymm12,ymm8,0x02 - vperm2i128 ymm8,ymm12,ymm8,0x13 - vpxor ymm3,ymm3,YMMWORD[((0+384))+rsi] - vpxor ymm0,ymm0,YMMWORD[((32+384))+rsi] - vpxor ymm4,ymm4,YMMWORD[((64+384))+rsi] - vpxor ymm8,ymm8,YMMWORD[((96+384))+rsi] - vmovdqu YMMWORD[(0+384)+rdi],ymm3 - vmovdqu YMMWORD[(32+384)+rdi],ymm0 - vmovdqu YMMWORD[(64+384)+rdi],ymm4 - vmovdqu YMMWORD[(96+384)+rdi],ymm8 - - lea rsi,[512+rsi] - sub rbx,16*32 - cmp rbx,16*32 - jg NEAR $L$seal_avx2_main_loop - - add r10,QWORD[((0+0))+rdi] - adc r11,QWORD[((8+0))+rdi] - adc r12,1 - mov rdx,QWORD[((0+160+0))+rbp] - mov r15,rdx - mulx r14,r13,r10 - mulx rdx,rax,r11 - imul r15,r12 - add r14,rax - adc r15,rdx - mov rdx,QWORD[((8+160+0))+rbp] - mulx rax,r10,r10 - add r14,r10 - mulx r9,r11,r11 - adc r15,r11 - adc r9,0 - imul rdx,r12 - add r15,rax - adc r9,rdx - mov r10,r13 - mov r11,r14 - mov r12,r15 - and r12,3 - mov r13,r15 - and r13,-4 - mov r14,r9 - shrd r15,r9,2 - shr r9,2 - add r15,r13 - adc r9,r14 - add r10,r15 - adc r11,r9 - adc r12,0 - add r10,QWORD[((0+16))+rdi] - adc r11,QWORD[((8+16))+rdi] - adc r12,1 - mov rdx,QWORD[((0+160+0))+rbp] - mov r15,rdx - mulx r14,r13,r10 - mulx rdx,rax,r11 - imul r15,r12 - add r14,rax - adc r15,rdx - mov rdx,QWORD[((8+160+0))+rbp] - mulx rax,r10,r10 - add r14,r10 - mulx r9,r11,r11 - adc r15,r11 - adc r9,0 - imul rdx,r12 - add r15,rax - adc r9,rdx - mov r10,r13 - mov r11,r14 - mov r12,r15 - and r12,3 - mov r13,r15 - and r13,-4 - mov r14,r9 - shrd r15,r9,2 - shr r9,2 - add r15,r13 - adc r9,r14 - add r10,r15 - adc r11,r9 - adc r12,0 - - lea rdi,[32+rdi] - mov rcx,10 - xor r8,r8 - - cmp rbx,12*32 - ja NEAR $L$seal_avx2_tail_512 - cmp rbx,8*32 - ja NEAR $L$seal_avx2_tail_384 - cmp rbx,4*32 - ja NEAR $L$seal_avx2_tail_256 - -$L$seal_avx2_tail_128: - vmovdqa ymm0,YMMWORD[$L$chacha20_consts] - vmovdqa ymm4,YMMWORD[((160+64))+rbp] - vmovdqa ymm8,YMMWORD[((160+96))+rbp] - vmovdqa ymm12,YMMWORD[$L$avx2_inc] - vpaddd ymm12,ymm12,YMMWORD[((160+160))+rbp] - vmovdqa YMMWORD[(160+160)+rbp],ymm12 - -$L$seal_avx2_tail_128_rounds_and_3xhash: - add r10,QWORD[((0+0))+rdi] - adc r11,QWORD[((8+0))+rdi] - adc r12,1 - mov rdx,QWORD[((0+160+0))+rbp] - mov r15,rdx - mulx r14,r13,r10 - mulx rdx,rax,r11 - imul r15,r12 - add r14,rax - adc r15,rdx - mov rdx,QWORD[((8+160+0))+rbp] - mulx rax,r10,r10 - add r14,r10 - mulx r9,r11,r11 - adc r15,r11 - adc r9,0 - imul rdx,r12 - add r15,rax - adc r9,rdx - mov r10,r13 - mov r11,r14 - mov r12,r15 - and r12,3 - mov r13,r15 - and r13,-4 - mov r14,r9 - shrd r15,r9,2 - shr r9,2 - add r15,r13 - adc r9,r14 - add r10,r15 - adc r11,r9 - adc r12,0 - - lea rdi,[16+rdi] -$L$seal_avx2_tail_128_rounds_and_2xhash: - vpaddd ymm0,ymm0,ymm4 - vpxor ymm12,ymm12,ymm0 - vpshufb ymm12,ymm12,YMMWORD[$L$rol16] - vpaddd ymm8,ymm8,ymm12 - vpxor ymm4,ymm4,ymm8 - vpsrld ymm3,ymm4,20 - vpslld ymm4,ymm4,12 - vpxor ymm4,ymm4,ymm3 - vpaddd ymm0,ymm0,ymm4 - vpxor ymm12,ymm12,ymm0 - vpshufb ymm12,ymm12,YMMWORD[$L$rol8] - vpaddd ymm8,ymm8,ymm12 - vpxor ymm4,ymm4,ymm8 - vpslld ymm3,ymm4,7 - vpsrld ymm4,ymm4,25 - vpxor ymm4,ymm4,ymm3 - vpalignr ymm12,ymm12,ymm12,12 - vpalignr ymm8,ymm8,ymm8,8 - vpalignr ymm4,ymm4,ymm4,4 - add r10,QWORD[((0+0))+rdi] - adc r11,QWORD[((8+0))+rdi] - adc r12,1 - mov rdx,QWORD[((0+160+0))+rbp] - mov r15,rdx - mulx r14,r13,r10 - mulx rdx,rax,r11 - imul r15,r12 - add r14,rax - adc r15,rdx - mov rdx,QWORD[((8+160+0))+rbp] - mulx rax,r10,r10 - add r14,r10 - mulx r9,r11,r11 - adc r15,r11 - adc r9,0 - imul rdx,r12 - add r15,rax - adc r9,rdx - mov r10,r13 - mov r11,r14 - mov r12,r15 - and r12,3 - mov r13,r15 - and r13,-4 - mov r14,r9 - shrd r15,r9,2 - shr r9,2 - add r15,r13 - adc r9,r14 - add r10,r15 - adc r11,r9 - adc r12,0 - vpaddd ymm0,ymm0,ymm4 - vpxor ymm12,ymm12,ymm0 - vpshufb ymm12,ymm12,YMMWORD[$L$rol16] - vpaddd ymm8,ymm8,ymm12 - vpxor ymm4,ymm4,ymm8 - vpsrld ymm3,ymm4,20 - vpslld ymm4,ymm4,12 - vpxor ymm4,ymm4,ymm3 - vpaddd ymm0,ymm0,ymm4 - vpxor ymm12,ymm12,ymm0 - vpshufb ymm12,ymm12,YMMWORD[$L$rol8] - vpaddd ymm8,ymm8,ymm12 - vpxor ymm4,ymm4,ymm8 - vpslld ymm3,ymm4,7 - vpsrld ymm4,ymm4,25 - vpxor ymm4,ymm4,ymm3 - vpalignr ymm12,ymm12,ymm12,4 - vpalignr ymm8,ymm8,ymm8,8 - vpalignr ymm4,ymm4,ymm4,12 - add r10,QWORD[((0+16))+rdi] - adc r11,QWORD[((8+16))+rdi] - adc r12,1 - mov rdx,QWORD[((0+160+0))+rbp] - mov r15,rdx - mulx r14,r13,r10 - mulx rdx,rax,r11 - imul r15,r12 - add r14,rax - adc r15,rdx - mov rdx,QWORD[((8+160+0))+rbp] - mulx rax,r10,r10 - add r14,r10 - mulx r9,r11,r11 - adc r15,r11 - adc r9,0 - imul rdx,r12 - add r15,rax - adc r9,rdx - mov r10,r13 - mov r11,r14 - mov r12,r15 - and r12,3 - mov r13,r15 - and r13,-4 - mov r14,r9 - shrd r15,r9,2 - shr r9,2 - add r15,r13 - adc r9,r14 - add r10,r15 - adc r11,r9 - adc r12,0 - - lea rdi,[32+rdi] - dec rcx - jg NEAR $L$seal_avx2_tail_128_rounds_and_3xhash - dec r8 - jge NEAR $L$seal_avx2_tail_128_rounds_and_2xhash - vpaddd ymm0,ymm0,YMMWORD[$L$chacha20_consts] - vpaddd ymm4,ymm4,YMMWORD[((160+64))+rbp] - vpaddd ymm8,ymm8,YMMWORD[((160+96))+rbp] - vpaddd ymm12,ymm12,YMMWORD[((160+160))+rbp] - vperm2i128 ymm3,ymm4,ymm0,0x13 - vperm2i128 ymm0,ymm4,ymm0,0x02 - vperm2i128 ymm4,ymm12,ymm8,0x02 - vperm2i128 ymm12,ymm12,ymm8,0x13 - vmovdqa ymm8,ymm3 - - jmp NEAR $L$seal_avx2_short_loop - -$L$seal_avx2_tail_256: - vmovdqa ymm0,YMMWORD[$L$chacha20_consts] - vmovdqa ymm4,YMMWORD[((160+64))+rbp] - vmovdqa ymm8,YMMWORD[((160+96))+rbp] - vmovdqa ymm1,ymm0 - vmovdqa ymm5,ymm4 - vmovdqa ymm9,ymm8 - vmovdqa ymm12,YMMWORD[$L$avx2_inc] - vpaddd ymm13,ymm12,YMMWORD[((160+160))+rbp] - vpaddd ymm12,ymm12,ymm13 - vmovdqa YMMWORD[(160+160)+rbp],ymm12 - vmovdqa YMMWORD[(160+192)+rbp],ymm13 - -$L$seal_avx2_tail_256_rounds_and_3xhash: - add r10,QWORD[((0+0))+rdi] - adc r11,QWORD[((8+0))+rdi] - adc r12,1 - mov rax,QWORD[((0+160+0))+rbp] - mov r15,rax - mul r10 - mov r13,rax - mov r14,rdx - mov rax,QWORD[((0+160+0))+rbp] - mul r11 - imul r15,r12 - add r14,rax - adc r15,rdx - mov rax,QWORD[((8+160+0))+rbp] - mov r9,rax - mul r10 - add r14,rax - adc rdx,0 - mov r10,rdx - mov rax,QWORD[((8+160+0))+rbp] - mul r11 - add r15,rax - adc rdx,0 - imul r9,r12 - add r15,r10 - adc r9,rdx - mov r10,r13 - mov r11,r14 - mov r12,r15 - and r12,3 - mov r13,r15 - and r13,-4 - mov r14,r9 - shrd r15,r9,2 - shr r9,2 - add r15,r13 - adc r9,r14 - add r10,r15 - adc r11,r9 - adc r12,0 - - lea rdi,[16+rdi] -$L$seal_avx2_tail_256_rounds_and_2xhash: - vpaddd ymm0,ymm0,ymm4 - vpxor ymm12,ymm12,ymm0 - vpshufb ymm12,ymm12,YMMWORD[$L$rol16] - vpaddd ymm8,ymm8,ymm12 - vpxor ymm4,ymm4,ymm8 - vpsrld ymm3,ymm4,20 - vpslld ymm4,ymm4,12 - vpxor ymm4,ymm4,ymm3 - vpaddd ymm0,ymm0,ymm4 - vpxor ymm12,ymm12,ymm0 - vpshufb ymm12,ymm12,YMMWORD[$L$rol8] - vpaddd ymm8,ymm8,ymm12 - vpxor ymm4,ymm4,ymm8 - vpslld ymm3,ymm4,7 - vpsrld ymm4,ymm4,25 - vpxor ymm4,ymm4,ymm3 - vpalignr ymm12,ymm12,ymm12,12 - vpalignr ymm8,ymm8,ymm8,8 - vpalignr ymm4,ymm4,ymm4,4 - vpaddd ymm1,ymm1,ymm5 - vpxor ymm13,ymm13,ymm1 - vpshufb ymm13,ymm13,YMMWORD[$L$rol16] - vpaddd ymm9,ymm9,ymm13 - vpxor ymm5,ymm5,ymm9 - vpsrld ymm3,ymm5,20 - vpslld ymm5,ymm5,12 - vpxor ymm5,ymm5,ymm3 - vpaddd ymm1,ymm1,ymm5 - vpxor ymm13,ymm13,ymm1 - vpshufb ymm13,ymm13,YMMWORD[$L$rol8] - vpaddd ymm9,ymm9,ymm13 - vpxor ymm5,ymm5,ymm9 - vpslld ymm3,ymm5,7 - vpsrld ymm5,ymm5,25 - vpxor ymm5,ymm5,ymm3 - vpalignr ymm13,ymm13,ymm13,12 - vpalignr ymm9,ymm9,ymm9,8 - vpalignr ymm5,ymm5,ymm5,4 - add r10,QWORD[((0+0))+rdi] - adc r11,QWORD[((8+0))+rdi] - adc r12,1 - mov rax,QWORD[((0+160+0))+rbp] - mov r15,rax - mul r10 - mov r13,rax - mov r14,rdx - mov rax,QWORD[((0+160+0))+rbp] - mul r11 - imul r15,r12 - add r14,rax - adc r15,rdx - mov rax,QWORD[((8+160+0))+rbp] - mov r9,rax - mul r10 - add r14,rax - adc rdx,0 - mov r10,rdx - mov rax,QWORD[((8+160+0))+rbp] - mul r11 - add r15,rax - adc rdx,0 - imul r9,r12 - add r15,r10 - adc r9,rdx - mov r10,r13 - mov r11,r14 - mov r12,r15 - and r12,3 - mov r13,r15 - and r13,-4 - mov r14,r9 - shrd r15,r9,2 - shr r9,2 - add r15,r13 - adc r9,r14 - add r10,r15 - adc r11,r9 - adc r12,0 - vpaddd ymm0,ymm0,ymm4 - vpxor ymm12,ymm12,ymm0 - vpshufb ymm12,ymm12,YMMWORD[$L$rol16] - vpaddd ymm8,ymm8,ymm12 - vpxor ymm4,ymm4,ymm8 - vpsrld ymm3,ymm4,20 - vpslld ymm4,ymm4,12 - vpxor ymm4,ymm4,ymm3 - vpaddd ymm0,ymm0,ymm4 - vpxor ymm12,ymm12,ymm0 - vpshufb ymm12,ymm12,YMMWORD[$L$rol8] - vpaddd ymm8,ymm8,ymm12 - vpxor ymm4,ymm4,ymm8 - vpslld ymm3,ymm4,7 - vpsrld ymm4,ymm4,25 - vpxor ymm4,ymm4,ymm3 - vpalignr ymm12,ymm12,ymm12,4 - vpalignr ymm8,ymm8,ymm8,8 - vpalignr ymm4,ymm4,ymm4,12 - vpaddd ymm1,ymm1,ymm5 - vpxor ymm13,ymm13,ymm1 - vpshufb ymm13,ymm13,YMMWORD[$L$rol16] - vpaddd ymm9,ymm9,ymm13 - vpxor ymm5,ymm5,ymm9 - vpsrld ymm3,ymm5,20 - vpslld ymm5,ymm5,12 - vpxor ymm5,ymm5,ymm3 - vpaddd ymm1,ymm1,ymm5 - vpxor ymm13,ymm13,ymm1 - vpshufb ymm13,ymm13,YMMWORD[$L$rol8] - vpaddd ymm9,ymm9,ymm13 - vpxor ymm5,ymm5,ymm9 - vpslld ymm3,ymm5,7 - vpsrld ymm5,ymm5,25 - vpxor ymm5,ymm5,ymm3 - vpalignr ymm13,ymm13,ymm13,4 - vpalignr ymm9,ymm9,ymm9,8 - vpalignr ymm5,ymm5,ymm5,12 - add r10,QWORD[((0+16))+rdi] - adc r11,QWORD[((8+16))+rdi] - adc r12,1 - mov rax,QWORD[((0+160+0))+rbp] - mov r15,rax - mul r10 - mov r13,rax - mov r14,rdx - mov rax,QWORD[((0+160+0))+rbp] - mul r11 - imul r15,r12 - add r14,rax - adc r15,rdx - mov rax,QWORD[((8+160+0))+rbp] - mov r9,rax - mul r10 - add r14,rax - adc rdx,0 - mov r10,rdx - mov rax,QWORD[((8+160+0))+rbp] - mul r11 - add r15,rax - adc rdx,0 - imul r9,r12 - add r15,r10 - adc r9,rdx - mov r10,r13 - mov r11,r14 - mov r12,r15 - and r12,3 - mov r13,r15 - and r13,-4 - mov r14,r9 - shrd r15,r9,2 - shr r9,2 - add r15,r13 - adc r9,r14 - add r10,r15 - adc r11,r9 - adc r12,0 - - lea rdi,[32+rdi] - dec rcx - jg NEAR $L$seal_avx2_tail_256_rounds_and_3xhash - dec r8 - jge NEAR $L$seal_avx2_tail_256_rounds_and_2xhash - vpaddd ymm1,ymm1,YMMWORD[$L$chacha20_consts] - vpaddd ymm5,ymm5,YMMWORD[((160+64))+rbp] - vpaddd ymm9,ymm9,YMMWORD[((160+96))+rbp] - vpaddd ymm13,ymm13,YMMWORD[((160+192))+rbp] - vpaddd ymm0,ymm0,YMMWORD[$L$chacha20_consts] - vpaddd ymm4,ymm4,YMMWORD[((160+64))+rbp] - vpaddd ymm8,ymm8,YMMWORD[((160+96))+rbp] - vpaddd ymm12,ymm12,YMMWORD[((160+160))+rbp] - vperm2i128 ymm3,ymm5,ymm1,0x02 - vperm2i128 ymm5,ymm5,ymm1,0x13 - vperm2i128 ymm1,ymm13,ymm9,0x02 - vperm2i128 ymm9,ymm13,ymm9,0x13 - vpxor ymm3,ymm3,YMMWORD[((0+0))+rsi] - vpxor ymm1,ymm1,YMMWORD[((32+0))+rsi] - vpxor ymm5,ymm5,YMMWORD[((64+0))+rsi] - vpxor ymm9,ymm9,YMMWORD[((96+0))+rsi] - vmovdqu YMMWORD[(0+0)+rdi],ymm3 - vmovdqu YMMWORD[(32+0)+rdi],ymm1 - vmovdqu YMMWORD[(64+0)+rdi],ymm5 - vmovdqu YMMWORD[(96+0)+rdi],ymm9 - vperm2i128 ymm3,ymm4,ymm0,0x13 - vperm2i128 ymm0,ymm4,ymm0,0x02 - vperm2i128 ymm4,ymm12,ymm8,0x02 - vperm2i128 ymm12,ymm12,ymm8,0x13 - vmovdqa ymm8,ymm3 - - mov rcx,4*32 - lea rsi,[128+rsi] - sub rbx,4*32 - jmp NEAR $L$seal_avx2_short_hash_remainder - -$L$seal_avx2_tail_384: - vmovdqa ymm0,YMMWORD[$L$chacha20_consts] - vmovdqa ymm4,YMMWORD[((160+64))+rbp] - vmovdqa ymm8,YMMWORD[((160+96))+rbp] - vmovdqa ymm1,ymm0 - vmovdqa ymm5,ymm4 - vmovdqa ymm9,ymm8 - vmovdqa ymm2,ymm0 - vmovdqa ymm6,ymm4 - vmovdqa ymm10,ymm8 - vmovdqa ymm12,YMMWORD[$L$avx2_inc] - vpaddd ymm14,ymm12,YMMWORD[((160+160))+rbp] - vpaddd ymm13,ymm12,ymm14 - vpaddd ymm12,ymm12,ymm13 - vmovdqa YMMWORD[(160+160)+rbp],ymm12 - vmovdqa YMMWORD[(160+192)+rbp],ymm13 - vmovdqa YMMWORD[(160+224)+rbp],ymm14 - -$L$seal_avx2_tail_384_rounds_and_3xhash: - add r10,QWORD[((0+0))+rdi] - adc r11,QWORD[((8+0))+rdi] - adc r12,1 - mov rax,QWORD[((0+160+0))+rbp] - mov r15,rax - mul r10 - mov r13,rax - mov r14,rdx - mov rax,QWORD[((0+160+0))+rbp] - mul r11 - imul r15,r12 - add r14,rax - adc r15,rdx - mov rax,QWORD[((8+160+0))+rbp] - mov r9,rax - mul r10 - add r14,rax - adc rdx,0 - mov r10,rdx - mov rax,QWORD[((8+160+0))+rbp] - mul r11 - add r15,rax - adc rdx,0 - imul r9,r12 - add r15,r10 - adc r9,rdx - mov r10,r13 - mov r11,r14 - mov r12,r15 - and r12,3 - mov r13,r15 - and r13,-4 - mov r14,r9 - shrd r15,r9,2 - shr r9,2 - add r15,r13 - adc r9,r14 - add r10,r15 - adc r11,r9 - adc r12,0 - - lea rdi,[16+rdi] -$L$seal_avx2_tail_384_rounds_and_2xhash: - vpaddd ymm0,ymm0,ymm4 - vpxor ymm12,ymm12,ymm0 - vpshufb ymm12,ymm12,YMMWORD[$L$rol16] - vpaddd ymm8,ymm8,ymm12 - vpxor ymm4,ymm4,ymm8 - vpsrld ymm3,ymm4,20 - vpslld ymm4,ymm4,12 - vpxor ymm4,ymm4,ymm3 - vpaddd ymm0,ymm0,ymm4 - vpxor ymm12,ymm12,ymm0 - vpshufb ymm12,ymm12,YMMWORD[$L$rol8] - vpaddd ymm8,ymm8,ymm12 - vpxor ymm4,ymm4,ymm8 - vpslld ymm3,ymm4,7 - vpsrld ymm4,ymm4,25 - vpxor ymm4,ymm4,ymm3 - vpalignr ymm12,ymm12,ymm12,12 - vpalignr ymm8,ymm8,ymm8,8 - vpalignr ymm4,ymm4,ymm4,4 - vpaddd ymm1,ymm1,ymm5 - vpxor ymm13,ymm13,ymm1 - vpshufb ymm13,ymm13,YMMWORD[$L$rol16] - vpaddd ymm9,ymm9,ymm13 - vpxor ymm5,ymm5,ymm9 - vpsrld ymm3,ymm5,20 - vpslld ymm5,ymm5,12 - vpxor ymm5,ymm5,ymm3 - vpaddd ymm1,ymm1,ymm5 - vpxor ymm13,ymm13,ymm1 - vpshufb ymm13,ymm13,YMMWORD[$L$rol8] - vpaddd ymm9,ymm9,ymm13 - vpxor ymm5,ymm5,ymm9 - vpslld ymm3,ymm5,7 - vpsrld ymm5,ymm5,25 - vpxor ymm5,ymm5,ymm3 - vpalignr ymm13,ymm13,ymm13,12 - vpalignr ymm9,ymm9,ymm9,8 - vpalignr ymm5,ymm5,ymm5,4 - add r10,QWORD[((0+0))+rdi] - adc r11,QWORD[((8+0))+rdi] - adc r12,1 - mov rax,QWORD[((0+160+0))+rbp] - mov r15,rax - mul r10 - mov r13,rax - mov r14,rdx - mov rax,QWORD[((0+160+0))+rbp] - mul r11 - imul r15,r12 - add r14,rax - adc r15,rdx - mov rax,QWORD[((8+160+0))+rbp] - mov r9,rax - mul r10 - add r14,rax - adc rdx,0 - mov r10,rdx - mov rax,QWORD[((8+160+0))+rbp] - mul r11 - add r15,rax - adc rdx,0 - imul r9,r12 - add r15,r10 - adc r9,rdx - mov r10,r13 - mov r11,r14 - mov r12,r15 - and r12,3 - mov r13,r15 - and r13,-4 - mov r14,r9 - shrd r15,r9,2 - shr r9,2 - add r15,r13 - adc r9,r14 - add r10,r15 - adc r11,r9 - adc r12,0 - vpaddd ymm2,ymm2,ymm6 - vpxor ymm14,ymm14,ymm2 - vpshufb ymm14,ymm14,YMMWORD[$L$rol16] - vpaddd ymm10,ymm10,ymm14 - vpxor ymm6,ymm6,ymm10 - vpsrld ymm3,ymm6,20 - vpslld ymm6,ymm6,12 - vpxor ymm6,ymm6,ymm3 - vpaddd ymm2,ymm2,ymm6 - vpxor ymm14,ymm14,ymm2 - vpshufb ymm14,ymm14,YMMWORD[$L$rol8] - vpaddd ymm10,ymm10,ymm14 - vpxor ymm6,ymm6,ymm10 - vpslld ymm3,ymm6,7 - vpsrld ymm6,ymm6,25 - vpxor ymm6,ymm6,ymm3 - vpalignr ymm14,ymm14,ymm14,12 - vpalignr ymm10,ymm10,ymm10,8 - vpalignr ymm6,ymm6,ymm6,4 - vpaddd ymm0,ymm0,ymm4 - vpxor ymm12,ymm12,ymm0 - vpshufb ymm12,ymm12,YMMWORD[$L$rol16] - vpaddd ymm8,ymm8,ymm12 - vpxor ymm4,ymm4,ymm8 - vpsrld ymm3,ymm4,20 - vpslld ymm4,ymm4,12 - vpxor ymm4,ymm4,ymm3 - vpaddd ymm0,ymm0,ymm4 - vpxor ymm12,ymm12,ymm0 - vpshufb ymm12,ymm12,YMMWORD[$L$rol8] - vpaddd ymm8,ymm8,ymm12 - vpxor ymm4,ymm4,ymm8 - vpslld ymm3,ymm4,7 - vpsrld ymm4,ymm4,25 - vpxor ymm4,ymm4,ymm3 - vpalignr ymm12,ymm12,ymm12,4 - vpalignr ymm8,ymm8,ymm8,8 - vpalignr ymm4,ymm4,ymm4,12 - add r10,QWORD[((0+16))+rdi] - adc r11,QWORD[((8+16))+rdi] - adc r12,1 - mov rax,QWORD[((0+160+0))+rbp] - mov r15,rax - mul r10 - mov r13,rax - mov r14,rdx - mov rax,QWORD[((0+160+0))+rbp] - mul r11 - imul r15,r12 - add r14,rax - adc r15,rdx - mov rax,QWORD[((8+160+0))+rbp] - mov r9,rax - mul r10 - add r14,rax - adc rdx,0 - mov r10,rdx - mov rax,QWORD[((8+160+0))+rbp] - mul r11 - add r15,rax - adc rdx,0 - imul r9,r12 - add r15,r10 - adc r9,rdx - mov r10,r13 - mov r11,r14 - mov r12,r15 - and r12,3 - mov r13,r15 - and r13,-4 - mov r14,r9 - shrd r15,r9,2 - shr r9,2 - add r15,r13 - adc r9,r14 - add r10,r15 - adc r11,r9 - adc r12,0 - vpaddd ymm1,ymm1,ymm5 - vpxor ymm13,ymm13,ymm1 - vpshufb ymm13,ymm13,YMMWORD[$L$rol16] - vpaddd ymm9,ymm9,ymm13 - vpxor ymm5,ymm5,ymm9 - vpsrld ymm3,ymm5,20 - vpslld ymm5,ymm5,12 - vpxor ymm5,ymm5,ymm3 - vpaddd ymm1,ymm1,ymm5 - vpxor ymm13,ymm13,ymm1 - vpshufb ymm13,ymm13,YMMWORD[$L$rol8] - vpaddd ymm9,ymm9,ymm13 - vpxor ymm5,ymm5,ymm9 - vpslld ymm3,ymm5,7 - vpsrld ymm5,ymm5,25 - vpxor ymm5,ymm5,ymm3 - vpalignr ymm13,ymm13,ymm13,4 - vpalignr ymm9,ymm9,ymm9,8 - vpalignr ymm5,ymm5,ymm5,12 - vpaddd ymm2,ymm2,ymm6 - vpxor ymm14,ymm14,ymm2 - vpshufb ymm14,ymm14,YMMWORD[$L$rol16] - vpaddd ymm10,ymm10,ymm14 - vpxor ymm6,ymm6,ymm10 - vpsrld ymm3,ymm6,20 - vpslld ymm6,ymm6,12 - vpxor ymm6,ymm6,ymm3 - vpaddd ymm2,ymm2,ymm6 - vpxor ymm14,ymm14,ymm2 - vpshufb ymm14,ymm14,YMMWORD[$L$rol8] - vpaddd ymm10,ymm10,ymm14 - vpxor ymm6,ymm6,ymm10 - vpslld ymm3,ymm6,7 - vpsrld ymm6,ymm6,25 - vpxor ymm6,ymm6,ymm3 - vpalignr ymm14,ymm14,ymm14,4 - vpalignr ymm10,ymm10,ymm10,8 - vpalignr ymm6,ymm6,ymm6,12 - - lea rdi,[32+rdi] - dec rcx - jg NEAR $L$seal_avx2_tail_384_rounds_and_3xhash - dec r8 - jge NEAR $L$seal_avx2_tail_384_rounds_and_2xhash - vpaddd ymm2,ymm2,YMMWORD[$L$chacha20_consts] - vpaddd ymm6,ymm6,YMMWORD[((160+64))+rbp] - vpaddd ymm10,ymm10,YMMWORD[((160+96))+rbp] - vpaddd ymm14,ymm14,YMMWORD[((160+224))+rbp] - vpaddd ymm1,ymm1,YMMWORD[$L$chacha20_consts] - vpaddd ymm5,ymm5,YMMWORD[((160+64))+rbp] - vpaddd ymm9,ymm9,YMMWORD[((160+96))+rbp] - vpaddd ymm13,ymm13,YMMWORD[((160+192))+rbp] - vpaddd ymm0,ymm0,YMMWORD[$L$chacha20_consts] - vpaddd ymm4,ymm4,YMMWORD[((160+64))+rbp] - vpaddd ymm8,ymm8,YMMWORD[((160+96))+rbp] - vpaddd ymm12,ymm12,YMMWORD[((160+160))+rbp] - vperm2i128 ymm3,ymm6,ymm2,0x02 - vperm2i128 ymm6,ymm6,ymm2,0x13 - vperm2i128 ymm2,ymm14,ymm10,0x02 - vperm2i128 ymm10,ymm14,ymm10,0x13 - vpxor ymm3,ymm3,YMMWORD[((0+0))+rsi] - vpxor ymm2,ymm2,YMMWORD[((32+0))+rsi] - vpxor ymm6,ymm6,YMMWORD[((64+0))+rsi] - vpxor ymm10,ymm10,YMMWORD[((96+0))+rsi] - vmovdqu YMMWORD[(0+0)+rdi],ymm3 - vmovdqu YMMWORD[(32+0)+rdi],ymm2 - vmovdqu YMMWORD[(64+0)+rdi],ymm6 - vmovdqu YMMWORD[(96+0)+rdi],ymm10 - vperm2i128 ymm3,ymm5,ymm1,0x02 - vperm2i128 ymm5,ymm5,ymm1,0x13 - vperm2i128 ymm1,ymm13,ymm9,0x02 - vperm2i128 ymm9,ymm13,ymm9,0x13 - vpxor ymm3,ymm3,YMMWORD[((0+128))+rsi] - vpxor ymm1,ymm1,YMMWORD[((32+128))+rsi] - vpxor ymm5,ymm5,YMMWORD[((64+128))+rsi] - vpxor ymm9,ymm9,YMMWORD[((96+128))+rsi] - vmovdqu YMMWORD[(0+128)+rdi],ymm3 - vmovdqu YMMWORD[(32+128)+rdi],ymm1 - vmovdqu YMMWORD[(64+128)+rdi],ymm5 - vmovdqu YMMWORD[(96+128)+rdi],ymm9 - vperm2i128 ymm3,ymm4,ymm0,0x13 - vperm2i128 ymm0,ymm4,ymm0,0x02 - vperm2i128 ymm4,ymm12,ymm8,0x02 - vperm2i128 ymm12,ymm12,ymm8,0x13 - vmovdqa ymm8,ymm3 - - mov rcx,8*32 - lea rsi,[256+rsi] - sub rbx,8*32 - jmp NEAR $L$seal_avx2_short_hash_remainder - -$L$seal_avx2_tail_512: - vmovdqa ymm0,YMMWORD[$L$chacha20_consts] - vmovdqa ymm4,YMMWORD[((160+64))+rbp] - vmovdqa ymm8,YMMWORD[((160+96))+rbp] - vmovdqa ymm1,ymm0 - vmovdqa ymm5,ymm4 - vmovdqa ymm9,ymm8 - vmovdqa ymm2,ymm0 - vmovdqa ymm6,ymm4 - vmovdqa ymm10,ymm8 - vmovdqa ymm3,ymm0 - vmovdqa ymm7,ymm4 - vmovdqa ymm11,ymm8 - vmovdqa ymm12,YMMWORD[$L$avx2_inc] - vpaddd ymm15,ymm12,YMMWORD[((160+160))+rbp] - vpaddd ymm14,ymm12,ymm15 - vpaddd ymm13,ymm12,ymm14 - vpaddd ymm12,ymm12,ymm13 - vmovdqa YMMWORD[(160+256)+rbp],ymm15 - vmovdqa YMMWORD[(160+224)+rbp],ymm14 - vmovdqa YMMWORD[(160+192)+rbp],ymm13 - vmovdqa YMMWORD[(160+160)+rbp],ymm12 - -$L$seal_avx2_tail_512_rounds_and_3xhash: - add r10,QWORD[((0+0))+rdi] - adc r11,QWORD[((8+0))+rdi] - adc r12,1 - mov rdx,QWORD[((0+160+0))+rbp] - mov r15,rdx - mulx r14,r13,r10 - mulx rdx,rax,r11 - imul r15,r12 - add r14,rax - adc r15,rdx - mov rdx,QWORD[((8+160+0))+rbp] - mulx rax,r10,r10 - add r14,r10 - mulx r9,r11,r11 - adc r15,r11 - adc r9,0 - imul rdx,r12 - add r15,rax - adc r9,rdx - mov r10,r13 - mov r11,r14 - mov r12,r15 - and r12,3 - mov r13,r15 - and r13,-4 - mov r14,r9 - shrd r15,r9,2 - shr r9,2 - add r15,r13 - adc r9,r14 - add r10,r15 - adc r11,r9 - adc r12,0 - - lea rdi,[16+rdi] -$L$seal_avx2_tail_512_rounds_and_2xhash: - vmovdqa YMMWORD[(160+128)+rbp],ymm8 - vmovdqa ymm8,YMMWORD[$L$rol16] - vpaddd ymm3,ymm3,ymm7 - vpaddd ymm2,ymm2,ymm6 - vpaddd ymm1,ymm1,ymm5 - vpaddd ymm0,ymm0,ymm4 - vpxor ymm15,ymm15,ymm3 - vpxor ymm14,ymm14,ymm2 - vpxor ymm13,ymm13,ymm1 - vpxor ymm12,ymm12,ymm0 - vpshufb ymm15,ymm15,ymm8 - vpshufb ymm14,ymm14,ymm8 - vpshufb ymm13,ymm13,ymm8 - vpshufb ymm12,ymm12,ymm8 - vpaddd ymm11,ymm11,ymm15 - vpaddd ymm10,ymm10,ymm14 - vpaddd ymm9,ymm9,ymm13 - vpaddd ymm8,ymm12,YMMWORD[((160+128))+rbp] - vpxor ymm7,ymm7,ymm11 - vpxor ymm6,ymm6,ymm10 - add r10,QWORD[((0+0))+rdi] - adc r11,QWORD[((8+0))+rdi] - adc r12,1 - vpxor ymm5,ymm5,ymm9 - vpxor ymm4,ymm4,ymm8 - vmovdqa YMMWORD[(160+128)+rbp],ymm8 - vpsrld ymm8,ymm7,20 - vpslld ymm7,ymm7,32-20 - vpxor ymm7,ymm7,ymm8 - vpsrld ymm8,ymm6,20 - vpslld ymm6,ymm6,32-20 - vpxor ymm6,ymm6,ymm8 - vpsrld ymm8,ymm5,20 - vpslld ymm5,ymm5,32-20 - vpxor ymm5,ymm5,ymm8 - vpsrld ymm8,ymm4,20 - vpslld ymm4,ymm4,32-20 - vpxor ymm4,ymm4,ymm8 - vmovdqa ymm8,YMMWORD[$L$rol8] - vpaddd ymm3,ymm3,ymm7 - vpaddd ymm2,ymm2,ymm6 - vpaddd ymm1,ymm1,ymm5 - vpaddd ymm0,ymm0,ymm4 - mov rdx,QWORD[((0+160+0))+rbp] - mov r15,rdx - mulx r14,r13,r10 - mulx rdx,rax,r11 - imul r15,r12 - add r14,rax - adc r15,rdx - vpxor ymm15,ymm15,ymm3 - vpxor ymm14,ymm14,ymm2 - vpxor ymm13,ymm13,ymm1 - vpxor ymm12,ymm12,ymm0 - vpshufb ymm15,ymm15,ymm8 - vpshufb ymm14,ymm14,ymm8 - vpshufb ymm13,ymm13,ymm8 - vpshufb ymm12,ymm12,ymm8 - vpaddd ymm11,ymm11,ymm15 - vpaddd ymm10,ymm10,ymm14 - vpaddd ymm9,ymm9,ymm13 - vpaddd ymm8,ymm12,YMMWORD[((160+128))+rbp] - vpxor ymm7,ymm7,ymm11 - vpxor ymm6,ymm6,ymm10 - vpxor ymm5,ymm5,ymm9 - vpxor ymm4,ymm4,ymm8 - vmovdqa YMMWORD[(160+128)+rbp],ymm8 - vpsrld ymm8,ymm7,25 - vpslld ymm7,ymm7,32-25 - vpxor ymm7,ymm7,ymm8 - mov rdx,QWORD[((8+160+0))+rbp] - mulx rax,r10,r10 - add r14,r10 - mulx r9,r11,r11 - adc r15,r11 - adc r9,0 - imul rdx,r12 - vpsrld ymm8,ymm6,25 - vpslld ymm6,ymm6,32-25 - vpxor ymm6,ymm6,ymm8 - vpsrld ymm8,ymm5,25 - vpslld ymm5,ymm5,32-25 - vpxor ymm5,ymm5,ymm8 - vpsrld ymm8,ymm4,25 - vpslld ymm4,ymm4,32-25 - vpxor ymm4,ymm4,ymm8 - vmovdqa ymm8,YMMWORD[((160+128))+rbp] - vpalignr ymm7,ymm7,ymm7,4 - vpalignr ymm11,ymm11,ymm11,8 - vpalignr ymm15,ymm15,ymm15,12 - vpalignr ymm6,ymm6,ymm6,4 - vpalignr ymm10,ymm10,ymm10,8 - vpalignr ymm14,ymm14,ymm14,12 - vpalignr ymm5,ymm5,ymm5,4 - vpalignr ymm9,ymm9,ymm9,8 - vpalignr ymm13,ymm13,ymm13,12 - vpalignr ymm4,ymm4,ymm4,4 - add r15,rax - adc r9,rdx - vpalignr ymm8,ymm8,ymm8,8 - vpalignr ymm12,ymm12,ymm12,12 - vmovdqa YMMWORD[(160+128)+rbp],ymm8 - vmovdqa ymm8,YMMWORD[$L$rol16] - vpaddd ymm3,ymm3,ymm7 - vpaddd ymm2,ymm2,ymm6 - vpaddd ymm1,ymm1,ymm5 - vpaddd ymm0,ymm0,ymm4 - vpxor ymm15,ymm15,ymm3 - vpxor ymm14,ymm14,ymm2 - vpxor ymm13,ymm13,ymm1 - vpxor ymm12,ymm12,ymm0 - vpshufb ymm15,ymm15,ymm8 - vpshufb ymm14,ymm14,ymm8 - vpshufb ymm13,ymm13,ymm8 - vpshufb ymm12,ymm12,ymm8 - vpaddd ymm11,ymm11,ymm15 - vpaddd ymm10,ymm10,ymm14 - vpaddd ymm9,ymm9,ymm13 - vpaddd ymm8,ymm12,YMMWORD[((160+128))+rbp] - mov r10,r13 - mov r11,r14 - mov r12,r15 - and r12,3 - mov r13,r15 - and r13,-4 - mov r14,r9 - shrd r15,r9,2 - shr r9,2 - add r15,r13 - adc r9,r14 - add r10,r15 - adc r11,r9 - adc r12,0 - vpxor ymm7,ymm7,ymm11 - vpxor ymm6,ymm6,ymm10 - vpxor ymm5,ymm5,ymm9 - vpxor ymm4,ymm4,ymm8 - vmovdqa YMMWORD[(160+128)+rbp],ymm8 - vpsrld ymm8,ymm7,20 - vpslld ymm7,ymm7,32-20 - vpxor ymm7,ymm7,ymm8 - vpsrld ymm8,ymm6,20 - vpslld ymm6,ymm6,32-20 - vpxor ymm6,ymm6,ymm8 - vpsrld ymm8,ymm5,20 - vpslld ymm5,ymm5,32-20 - vpxor ymm5,ymm5,ymm8 - vpsrld ymm8,ymm4,20 - vpslld ymm4,ymm4,32-20 - vpxor ymm4,ymm4,ymm8 - vmovdqa ymm8,YMMWORD[$L$rol8] - vpaddd ymm3,ymm3,ymm7 - vpaddd ymm2,ymm2,ymm6 - add r10,QWORD[((0+16))+rdi] - adc r11,QWORD[((8+16))+rdi] - adc r12,1 - vpaddd ymm1,ymm1,ymm5 - vpaddd ymm0,ymm0,ymm4 - vpxor ymm15,ymm15,ymm3 - vpxor ymm14,ymm14,ymm2 - vpxor ymm13,ymm13,ymm1 - vpxor ymm12,ymm12,ymm0 - vpshufb ymm15,ymm15,ymm8 - vpshufb ymm14,ymm14,ymm8 - vpshufb ymm13,ymm13,ymm8 - vpshufb ymm12,ymm12,ymm8 - vpaddd ymm11,ymm11,ymm15 - vpaddd ymm10,ymm10,ymm14 - vpaddd ymm9,ymm9,ymm13 - vpaddd ymm8,ymm12,YMMWORD[((160+128))+rbp] - vpxor ymm7,ymm7,ymm11 - vpxor ymm6,ymm6,ymm10 - vpxor ymm5,ymm5,ymm9 - vpxor ymm4,ymm4,ymm8 - vmovdqa YMMWORD[(160+128)+rbp],ymm8 - vpsrld ymm8,ymm7,25 - mov rdx,QWORD[((0+160+0))+rbp] - mov r15,rdx - mulx r14,r13,r10 - mulx rdx,rax,r11 - imul r15,r12 - add r14,rax - adc r15,rdx - vpslld ymm7,ymm7,32-25 - vpxor ymm7,ymm7,ymm8 - vpsrld ymm8,ymm6,25 - vpslld ymm6,ymm6,32-25 - vpxor ymm6,ymm6,ymm8 - vpsrld ymm8,ymm5,25 - vpslld ymm5,ymm5,32-25 - vpxor ymm5,ymm5,ymm8 - vpsrld ymm8,ymm4,25 - vpslld ymm4,ymm4,32-25 - vpxor ymm4,ymm4,ymm8 - vmovdqa ymm8,YMMWORD[((160+128))+rbp] - vpalignr ymm7,ymm7,ymm7,12 - vpalignr ymm11,ymm11,ymm11,8 - vpalignr ymm15,ymm15,ymm15,4 - vpalignr ymm6,ymm6,ymm6,12 - vpalignr ymm10,ymm10,ymm10,8 - vpalignr ymm14,ymm14,ymm14,4 - vpalignr ymm5,ymm5,ymm5,12 - vpalignr ymm9,ymm9,ymm9,8 - mov rdx,QWORD[((8+160+0))+rbp] - mulx rax,r10,r10 - add r14,r10 - mulx r9,r11,r11 - adc r15,r11 - adc r9,0 - imul rdx,r12 - vpalignr ymm13,ymm13,ymm13,4 - vpalignr ymm4,ymm4,ymm4,12 - vpalignr ymm8,ymm8,ymm8,8 - vpalignr ymm12,ymm12,ymm12,4 - - - - - - - - - - - - - - - - - add r15,rax - adc r9,rdx - - - - - - - - - - - - - - - - - - - - - mov r10,r13 - mov r11,r14 - mov r12,r15 - and r12,3 - mov r13,r15 - and r13,-4 - mov r14,r9 - shrd r15,r9,2 - shr r9,2 - add r15,r13 - adc r9,r14 - add r10,r15 - adc r11,r9 - adc r12,0 - - lea rdi,[32+rdi] - dec rcx - jg NEAR $L$seal_avx2_tail_512_rounds_and_3xhash - dec r8 - jge NEAR $L$seal_avx2_tail_512_rounds_and_2xhash - vpaddd ymm3,ymm3,YMMWORD[$L$chacha20_consts] - vpaddd ymm7,ymm7,YMMWORD[((160+64))+rbp] - vpaddd ymm11,ymm11,YMMWORD[((160+96))+rbp] - vpaddd ymm15,ymm15,YMMWORD[((160+256))+rbp] - vpaddd ymm2,ymm2,YMMWORD[$L$chacha20_consts] - vpaddd ymm6,ymm6,YMMWORD[((160+64))+rbp] - vpaddd ymm10,ymm10,YMMWORD[((160+96))+rbp] - vpaddd ymm14,ymm14,YMMWORD[((160+224))+rbp] - vpaddd ymm1,ymm1,YMMWORD[$L$chacha20_consts] - vpaddd ymm5,ymm5,YMMWORD[((160+64))+rbp] - vpaddd ymm9,ymm9,YMMWORD[((160+96))+rbp] - vpaddd ymm13,ymm13,YMMWORD[((160+192))+rbp] - vpaddd ymm0,ymm0,YMMWORD[$L$chacha20_consts] - vpaddd ymm4,ymm4,YMMWORD[((160+64))+rbp] - vpaddd ymm8,ymm8,YMMWORD[((160+96))+rbp] - vpaddd ymm12,ymm12,YMMWORD[((160+160))+rbp] - - vmovdqa YMMWORD[(160+128)+rbp],ymm0 - vperm2i128 ymm0,ymm7,ymm3,0x02 - vperm2i128 ymm7,ymm7,ymm3,0x13 - vperm2i128 ymm3,ymm15,ymm11,0x02 - vperm2i128 ymm11,ymm15,ymm11,0x13 - vpxor ymm0,ymm0,YMMWORD[((0+0))+rsi] - vpxor ymm3,ymm3,YMMWORD[((32+0))+rsi] - vpxor ymm7,ymm7,YMMWORD[((64+0))+rsi] - vpxor ymm11,ymm11,YMMWORD[((96+0))+rsi] - vmovdqu YMMWORD[(0+0)+rdi],ymm0 - vmovdqu YMMWORD[(32+0)+rdi],ymm3 - vmovdqu YMMWORD[(64+0)+rdi],ymm7 - vmovdqu YMMWORD[(96+0)+rdi],ymm11 - - vmovdqa ymm0,YMMWORD[((160+128))+rbp] - vperm2i128 ymm3,ymm6,ymm2,0x02 - vperm2i128 ymm6,ymm6,ymm2,0x13 - vperm2i128 ymm2,ymm14,ymm10,0x02 - vperm2i128 ymm10,ymm14,ymm10,0x13 - vpxor ymm3,ymm3,YMMWORD[((0+128))+rsi] - vpxor ymm2,ymm2,YMMWORD[((32+128))+rsi] - vpxor ymm6,ymm6,YMMWORD[((64+128))+rsi] - vpxor ymm10,ymm10,YMMWORD[((96+128))+rsi] - vmovdqu YMMWORD[(0+128)+rdi],ymm3 - vmovdqu YMMWORD[(32+128)+rdi],ymm2 - vmovdqu YMMWORD[(64+128)+rdi],ymm6 - vmovdqu YMMWORD[(96+128)+rdi],ymm10 - vperm2i128 ymm3,ymm5,ymm1,0x02 - vperm2i128 ymm5,ymm5,ymm1,0x13 - vperm2i128 ymm1,ymm13,ymm9,0x02 - vperm2i128 ymm9,ymm13,ymm9,0x13 - vpxor ymm3,ymm3,YMMWORD[((0+256))+rsi] - vpxor ymm1,ymm1,YMMWORD[((32+256))+rsi] - vpxor ymm5,ymm5,YMMWORD[((64+256))+rsi] - vpxor ymm9,ymm9,YMMWORD[((96+256))+rsi] - vmovdqu YMMWORD[(0+256)+rdi],ymm3 - vmovdqu YMMWORD[(32+256)+rdi],ymm1 - vmovdqu YMMWORD[(64+256)+rdi],ymm5 - vmovdqu YMMWORD[(96+256)+rdi],ymm9 - vperm2i128 ymm3,ymm4,ymm0,0x13 - vperm2i128 ymm0,ymm4,ymm0,0x02 - vperm2i128 ymm4,ymm12,ymm8,0x02 - vperm2i128 ymm12,ymm12,ymm8,0x13 - vmovdqa ymm8,ymm3 - - mov rcx,12*32 - lea rsi,[384+rsi] - sub rbx,12*32 - jmp NEAR $L$seal_avx2_short_hash_remainder - -$L$seal_avx2_320: - vmovdqa ymm1,ymm0 - vmovdqa ymm2,ymm0 - vmovdqa ymm5,ymm4 - vmovdqa ymm6,ymm4 - vmovdqa ymm9,ymm8 - vmovdqa ymm10,ymm8 - vpaddd ymm13,ymm12,YMMWORD[$L$avx2_inc] - vpaddd ymm14,ymm13,YMMWORD[$L$avx2_inc] - vmovdqa ymm7,ymm4 - vmovdqa ymm11,ymm8 - vmovdqa YMMWORD[(160+160)+rbp],ymm12 - vmovdqa YMMWORD[(160+192)+rbp],ymm13 - vmovdqa YMMWORD[(160+224)+rbp],ymm14 - mov r10,10 -$L$seal_avx2_320_rounds: - vpaddd ymm0,ymm0,ymm4 - vpxor ymm12,ymm12,ymm0 - vpshufb ymm12,ymm12,YMMWORD[$L$rol16] - vpaddd ymm8,ymm8,ymm12 - vpxor ymm4,ymm4,ymm8 - vpsrld ymm3,ymm4,20 - vpslld ymm4,ymm4,12 - vpxor ymm4,ymm4,ymm3 - vpaddd ymm0,ymm0,ymm4 - vpxor ymm12,ymm12,ymm0 - vpshufb ymm12,ymm12,YMMWORD[$L$rol8] - vpaddd ymm8,ymm8,ymm12 - vpxor ymm4,ymm4,ymm8 - vpslld ymm3,ymm4,7 - vpsrld ymm4,ymm4,25 - vpxor ymm4,ymm4,ymm3 - vpalignr ymm12,ymm12,ymm12,12 - vpalignr ymm8,ymm8,ymm8,8 - vpalignr ymm4,ymm4,ymm4,4 - vpaddd ymm1,ymm1,ymm5 - vpxor ymm13,ymm13,ymm1 - vpshufb ymm13,ymm13,YMMWORD[$L$rol16] - vpaddd ymm9,ymm9,ymm13 - vpxor ymm5,ymm5,ymm9 - vpsrld ymm3,ymm5,20 - vpslld ymm5,ymm5,12 - vpxor ymm5,ymm5,ymm3 - vpaddd ymm1,ymm1,ymm5 - vpxor ymm13,ymm13,ymm1 - vpshufb ymm13,ymm13,YMMWORD[$L$rol8] - vpaddd ymm9,ymm9,ymm13 - vpxor ymm5,ymm5,ymm9 - vpslld ymm3,ymm5,7 - vpsrld ymm5,ymm5,25 - vpxor ymm5,ymm5,ymm3 - vpalignr ymm13,ymm13,ymm13,12 - vpalignr ymm9,ymm9,ymm9,8 - vpalignr ymm5,ymm5,ymm5,4 - vpaddd ymm2,ymm2,ymm6 - vpxor ymm14,ymm14,ymm2 - vpshufb ymm14,ymm14,YMMWORD[$L$rol16] - vpaddd ymm10,ymm10,ymm14 - vpxor ymm6,ymm6,ymm10 - vpsrld ymm3,ymm6,20 - vpslld ymm6,ymm6,12 - vpxor ymm6,ymm6,ymm3 - vpaddd ymm2,ymm2,ymm6 - vpxor ymm14,ymm14,ymm2 - vpshufb ymm14,ymm14,YMMWORD[$L$rol8] - vpaddd ymm10,ymm10,ymm14 - vpxor ymm6,ymm6,ymm10 - vpslld ymm3,ymm6,7 - vpsrld ymm6,ymm6,25 - vpxor ymm6,ymm6,ymm3 - vpalignr ymm14,ymm14,ymm14,12 - vpalignr ymm10,ymm10,ymm10,8 - vpalignr ymm6,ymm6,ymm6,4 - vpaddd ymm0,ymm0,ymm4 - vpxor ymm12,ymm12,ymm0 - vpshufb ymm12,ymm12,YMMWORD[$L$rol16] - vpaddd ymm8,ymm8,ymm12 - vpxor ymm4,ymm4,ymm8 - vpsrld ymm3,ymm4,20 - vpslld ymm4,ymm4,12 - vpxor ymm4,ymm4,ymm3 - vpaddd ymm0,ymm0,ymm4 - vpxor ymm12,ymm12,ymm0 - vpshufb ymm12,ymm12,YMMWORD[$L$rol8] - vpaddd ymm8,ymm8,ymm12 - vpxor ymm4,ymm4,ymm8 - vpslld ymm3,ymm4,7 - vpsrld ymm4,ymm4,25 - vpxor ymm4,ymm4,ymm3 - vpalignr ymm12,ymm12,ymm12,4 - vpalignr ymm8,ymm8,ymm8,8 - vpalignr ymm4,ymm4,ymm4,12 - vpaddd ymm1,ymm1,ymm5 - vpxor ymm13,ymm13,ymm1 - vpshufb ymm13,ymm13,YMMWORD[$L$rol16] - vpaddd ymm9,ymm9,ymm13 - vpxor ymm5,ymm5,ymm9 - vpsrld ymm3,ymm5,20 - vpslld ymm5,ymm5,12 - vpxor ymm5,ymm5,ymm3 - vpaddd ymm1,ymm1,ymm5 - vpxor ymm13,ymm13,ymm1 - vpshufb ymm13,ymm13,YMMWORD[$L$rol8] - vpaddd ymm9,ymm9,ymm13 - vpxor ymm5,ymm5,ymm9 - vpslld ymm3,ymm5,7 - vpsrld ymm5,ymm5,25 - vpxor ymm5,ymm5,ymm3 - vpalignr ymm13,ymm13,ymm13,4 - vpalignr ymm9,ymm9,ymm9,8 - vpalignr ymm5,ymm5,ymm5,12 - vpaddd ymm2,ymm2,ymm6 - vpxor ymm14,ymm14,ymm2 - vpshufb ymm14,ymm14,YMMWORD[$L$rol16] - vpaddd ymm10,ymm10,ymm14 - vpxor ymm6,ymm6,ymm10 - vpsrld ymm3,ymm6,20 - vpslld ymm6,ymm6,12 - vpxor ymm6,ymm6,ymm3 - vpaddd ymm2,ymm2,ymm6 - vpxor ymm14,ymm14,ymm2 - vpshufb ymm14,ymm14,YMMWORD[$L$rol8] - vpaddd ymm10,ymm10,ymm14 - vpxor ymm6,ymm6,ymm10 - vpslld ymm3,ymm6,7 - vpsrld ymm6,ymm6,25 - vpxor ymm6,ymm6,ymm3 - vpalignr ymm14,ymm14,ymm14,4 - vpalignr ymm10,ymm10,ymm10,8 - vpalignr ymm6,ymm6,ymm6,12 - - dec r10 - jne NEAR $L$seal_avx2_320_rounds - vpaddd ymm0,ymm0,YMMWORD[$L$chacha20_consts] - vpaddd ymm1,ymm1,YMMWORD[$L$chacha20_consts] - vpaddd ymm2,ymm2,YMMWORD[$L$chacha20_consts] - vpaddd ymm4,ymm4,ymm7 - vpaddd ymm5,ymm5,ymm7 - vpaddd ymm6,ymm6,ymm7 - vpaddd ymm8,ymm8,ymm11 - vpaddd ymm9,ymm9,ymm11 - vpaddd ymm10,ymm10,ymm11 - vpaddd ymm12,ymm12,YMMWORD[((160+160))+rbp] - vpaddd ymm13,ymm13,YMMWORD[((160+192))+rbp] - vpaddd ymm14,ymm14,YMMWORD[((160+224))+rbp] - vperm2i128 ymm3,ymm4,ymm0,0x02 - - vpand ymm3,ymm3,YMMWORD[$L$clamp] - vmovdqa YMMWORD[(160+0)+rbp],ymm3 - - vperm2i128 ymm0,ymm4,ymm0,0x13 - vperm2i128 ymm4,ymm12,ymm8,0x13 - vperm2i128 ymm8,ymm5,ymm1,0x02 - vperm2i128 ymm12,ymm13,ymm9,0x02 - vperm2i128 ymm1,ymm5,ymm1,0x13 - vperm2i128 ymm5,ymm13,ymm9,0x13 - vperm2i128 ymm9,ymm6,ymm2,0x02 - vperm2i128 ymm13,ymm14,ymm10,0x02 - vperm2i128 ymm2,ymm6,ymm2,0x13 - vperm2i128 ymm6,ymm14,ymm10,0x13 - jmp NEAR $L$seal_avx2_short - -$L$seal_avx2_192: - vmovdqa ymm1,ymm0 - vmovdqa ymm2,ymm0 - vmovdqa ymm5,ymm4 - vmovdqa ymm6,ymm4 - vmovdqa ymm9,ymm8 - vmovdqa ymm10,ymm8 - vpaddd ymm13,ymm12,YMMWORD[$L$avx2_inc] - vmovdqa ymm11,ymm12 - vmovdqa ymm15,ymm13 - mov r10,10 -$L$seal_avx2_192_rounds: - vpaddd ymm0,ymm0,ymm4 - vpxor ymm12,ymm12,ymm0 - vpshufb ymm12,ymm12,YMMWORD[$L$rol16] - vpaddd ymm8,ymm8,ymm12 - vpxor ymm4,ymm4,ymm8 - vpsrld ymm3,ymm4,20 - vpslld ymm4,ymm4,12 - vpxor ymm4,ymm4,ymm3 - vpaddd ymm0,ymm0,ymm4 - vpxor ymm12,ymm12,ymm0 - vpshufb ymm12,ymm12,YMMWORD[$L$rol8] - vpaddd ymm8,ymm8,ymm12 - vpxor ymm4,ymm4,ymm8 - vpslld ymm3,ymm4,7 - vpsrld ymm4,ymm4,25 - vpxor ymm4,ymm4,ymm3 - vpalignr ymm12,ymm12,ymm12,12 - vpalignr ymm8,ymm8,ymm8,8 - vpalignr ymm4,ymm4,ymm4,4 - vpaddd ymm1,ymm1,ymm5 - vpxor ymm13,ymm13,ymm1 - vpshufb ymm13,ymm13,YMMWORD[$L$rol16] - vpaddd ymm9,ymm9,ymm13 - vpxor ymm5,ymm5,ymm9 - vpsrld ymm3,ymm5,20 - vpslld ymm5,ymm5,12 - vpxor ymm5,ymm5,ymm3 - vpaddd ymm1,ymm1,ymm5 - vpxor ymm13,ymm13,ymm1 - vpshufb ymm13,ymm13,YMMWORD[$L$rol8] - vpaddd ymm9,ymm9,ymm13 - vpxor ymm5,ymm5,ymm9 - vpslld ymm3,ymm5,7 - vpsrld ymm5,ymm5,25 - vpxor ymm5,ymm5,ymm3 - vpalignr ymm13,ymm13,ymm13,12 - vpalignr ymm9,ymm9,ymm9,8 - vpalignr ymm5,ymm5,ymm5,4 - vpaddd ymm0,ymm0,ymm4 - vpxor ymm12,ymm12,ymm0 - vpshufb ymm12,ymm12,YMMWORD[$L$rol16] - vpaddd ymm8,ymm8,ymm12 - vpxor ymm4,ymm4,ymm8 - vpsrld ymm3,ymm4,20 - vpslld ymm4,ymm4,12 - vpxor ymm4,ymm4,ymm3 - vpaddd ymm0,ymm0,ymm4 - vpxor ymm12,ymm12,ymm0 - vpshufb ymm12,ymm12,YMMWORD[$L$rol8] - vpaddd ymm8,ymm8,ymm12 - vpxor ymm4,ymm4,ymm8 - vpslld ymm3,ymm4,7 - vpsrld ymm4,ymm4,25 - vpxor ymm4,ymm4,ymm3 - vpalignr ymm12,ymm12,ymm12,4 - vpalignr ymm8,ymm8,ymm8,8 - vpalignr ymm4,ymm4,ymm4,12 - vpaddd ymm1,ymm1,ymm5 - vpxor ymm13,ymm13,ymm1 - vpshufb ymm13,ymm13,YMMWORD[$L$rol16] - vpaddd ymm9,ymm9,ymm13 - vpxor ymm5,ymm5,ymm9 - vpsrld ymm3,ymm5,20 - vpslld ymm5,ymm5,12 - vpxor ymm5,ymm5,ymm3 - vpaddd ymm1,ymm1,ymm5 - vpxor ymm13,ymm13,ymm1 - vpshufb ymm13,ymm13,YMMWORD[$L$rol8] - vpaddd ymm9,ymm9,ymm13 - vpxor ymm5,ymm5,ymm9 - vpslld ymm3,ymm5,7 - vpsrld ymm5,ymm5,25 - vpxor ymm5,ymm5,ymm3 - vpalignr ymm13,ymm13,ymm13,4 - vpalignr ymm9,ymm9,ymm9,8 - vpalignr ymm5,ymm5,ymm5,12 - - dec r10 - jne NEAR $L$seal_avx2_192_rounds - vpaddd ymm0,ymm0,ymm2 - vpaddd ymm1,ymm1,ymm2 - vpaddd ymm4,ymm4,ymm6 - vpaddd ymm5,ymm5,ymm6 - vpaddd ymm8,ymm8,ymm10 - vpaddd ymm9,ymm9,ymm10 - vpaddd ymm12,ymm12,ymm11 - vpaddd ymm13,ymm13,ymm15 - vperm2i128 ymm3,ymm4,ymm0,0x02 - - vpand ymm3,ymm3,YMMWORD[$L$clamp] - vmovdqa YMMWORD[(160+0)+rbp],ymm3 - - vperm2i128 ymm0,ymm4,ymm0,0x13 - vperm2i128 ymm4,ymm12,ymm8,0x13 - vperm2i128 ymm8,ymm5,ymm1,0x02 - vperm2i128 ymm12,ymm13,ymm9,0x02 - vperm2i128 ymm1,ymm5,ymm1,0x13 - vperm2i128 ymm5,ymm13,ymm9,0x13 -$L$seal_avx2_short: - mov r8,r8 - call poly_hash_ad_internal - xor rcx,rcx -$L$seal_avx2_short_hash_remainder: - cmp rcx,16 - jb NEAR $L$seal_avx2_short_loop - add r10,QWORD[((0+0))+rdi] - adc r11,QWORD[((8+0))+rdi] - adc r12,1 - mov rax,QWORD[((0+160+0))+rbp] - mov r15,rax - mul r10 - mov r13,rax - mov r14,rdx - mov rax,QWORD[((0+160+0))+rbp] - mul r11 - imul r15,r12 - add r14,rax - adc r15,rdx - mov rax,QWORD[((8+160+0))+rbp] - mov r9,rax - mul r10 - add r14,rax - adc rdx,0 - mov r10,rdx - mov rax,QWORD[((8+160+0))+rbp] - mul r11 - add r15,rax - adc rdx,0 - imul r9,r12 - add r15,r10 - adc r9,rdx - mov r10,r13 - mov r11,r14 - mov r12,r15 - and r12,3 - mov r13,r15 - and r13,-4 - mov r14,r9 - shrd r15,r9,2 - shr r9,2 - add r15,r13 - adc r9,r14 - add r10,r15 - adc r11,r9 - adc r12,0 - - sub rcx,16 - add rdi,16 - jmp NEAR $L$seal_avx2_short_hash_remainder -$L$seal_avx2_short_loop: - cmp rbx,32 - jb NEAR $L$seal_avx2_short_tail - sub rbx,32 - - vpxor ymm0,ymm0,YMMWORD[rsi] - vmovdqu YMMWORD[rdi],ymm0 - lea rsi,[32+rsi] - - add r10,QWORD[((0+0))+rdi] - adc r11,QWORD[((8+0))+rdi] - adc r12,1 - mov rax,QWORD[((0+160+0))+rbp] - mov r15,rax - mul r10 - mov r13,rax - mov r14,rdx - mov rax,QWORD[((0+160+0))+rbp] - mul r11 - imul r15,r12 - add r14,rax - adc r15,rdx - mov rax,QWORD[((8+160+0))+rbp] - mov r9,rax - mul r10 - add r14,rax - adc rdx,0 - mov r10,rdx - mov rax,QWORD[((8+160+0))+rbp] - mul r11 - add r15,rax - adc rdx,0 - imul r9,r12 - add r15,r10 - adc r9,rdx - mov r10,r13 - mov r11,r14 - mov r12,r15 - and r12,3 - mov r13,r15 - and r13,-4 - mov r14,r9 - shrd r15,r9,2 - shr r9,2 - add r15,r13 - adc r9,r14 - add r10,r15 - adc r11,r9 - adc r12,0 - add r10,QWORD[((0+16))+rdi] - adc r11,QWORD[((8+16))+rdi] - adc r12,1 - mov rax,QWORD[((0+160+0))+rbp] - mov r15,rax - mul r10 - mov r13,rax - mov r14,rdx - mov rax,QWORD[((0+160+0))+rbp] - mul r11 - imul r15,r12 - add r14,rax - adc r15,rdx - mov rax,QWORD[((8+160+0))+rbp] - mov r9,rax - mul r10 - add r14,rax - adc rdx,0 - mov r10,rdx - mov rax,QWORD[((8+160+0))+rbp] - mul r11 - add r15,rax - adc rdx,0 - imul r9,r12 - add r15,r10 - adc r9,rdx - mov r10,r13 - mov r11,r14 - mov r12,r15 - and r12,3 - mov r13,r15 - and r13,-4 - mov r14,r9 - shrd r15,r9,2 - shr r9,2 - add r15,r13 - adc r9,r14 - add r10,r15 - adc r11,r9 - adc r12,0 - - lea rdi,[32+rdi] - - vmovdqa ymm0,ymm4 - vmovdqa ymm4,ymm8 - vmovdqa ymm8,ymm12 - vmovdqa ymm12,ymm1 - vmovdqa ymm1,ymm5 - vmovdqa ymm5,ymm9 - vmovdqa ymm9,ymm13 - vmovdqa ymm13,ymm2 - vmovdqa ymm2,ymm6 - jmp NEAR $L$seal_avx2_short_loop -$L$seal_avx2_short_tail: - cmp rbx,16 - jb NEAR $L$seal_avx2_exit - sub rbx,16 - vpxor xmm3,xmm0,XMMWORD[rsi] - vmovdqu XMMWORD[rdi],xmm3 - lea rsi,[16+rsi] - add r10,QWORD[((0+0))+rdi] - adc r11,QWORD[((8+0))+rdi] - adc r12,1 - mov rax,QWORD[((0+160+0))+rbp] - mov r15,rax - mul r10 - mov r13,rax - mov r14,rdx - mov rax,QWORD[((0+160+0))+rbp] - mul r11 - imul r15,r12 - add r14,rax - adc r15,rdx - mov rax,QWORD[((8+160+0))+rbp] - mov r9,rax - mul r10 - add r14,rax - adc rdx,0 - mov r10,rdx - mov rax,QWORD[((8+160+0))+rbp] - mul r11 - add r15,rax - adc rdx,0 - imul r9,r12 - add r15,r10 - adc r9,rdx - mov r10,r13 - mov r11,r14 - mov r12,r15 - and r12,3 - mov r13,r15 - and r13,-4 - mov r14,r9 - shrd r15,r9,2 - shr r9,2 - add r15,r13 - adc r9,r14 - add r10,r15 - adc r11,r9 - adc r12,0 - - lea rdi,[16+rdi] - vextracti128 xmm0,ymm0,1 -$L$seal_avx2_exit: - vzeroupper - jmp NEAR $L$seal_sse_tail_16 - - diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/tmp/chacha-x86_64-nasm.asm temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/tmp/chacha-x86_64-nasm.asm --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/tmp/chacha-x86_64-nasm.asm 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/tmp/chacha-x86_64-nasm.asm 1970-01-01 00:00:00.000000000 +0000 @@ -1,1922 +0,0 @@ -; This file is generated from a similarly-named Perl script in the BoringSSL -; source tree. Do not edit by hand. - -default rel -%define XMMWORD -%define YMMWORD -%define ZMMWORD -section .text code align=64 - - -EXTERN GFp_ia32cap_P - -ALIGN 64 -$L$zero: - DD 0,0,0,0 -$L$one: - DD 1,0,0,0 -$L$inc: - DD 0,1,2,3 -$L$four: - DD 4,4,4,4 -$L$incy: - DD 0,2,4,6,1,3,5,7 -$L$eight: - DD 8,8,8,8,8,8,8,8 -$L$rot16: -DB 0x2,0x3,0x0,0x1,0x6,0x7,0x4,0x5,0xa,0xb,0x8,0x9,0xe,0xf,0xc,0xd -$L$rot24: -DB 0x3,0x0,0x1,0x2,0x7,0x4,0x5,0x6,0xb,0x8,0x9,0xa,0xf,0xc,0xd,0xe -$L$sigma: -DB 101,120,112,97,110,100,32,51,50,45,98,121,116,101,32,107 -DB 0 -ALIGN 64 -$L$zeroz: - DD 0,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0 -$L$fourz: - DD 4,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0 -$L$incz: - DD 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 -$L$sixteen: - DD 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16 -DB 67,104,97,67,104,97,50,48,32,102,111,114,32,120,56,54 -DB 95,54,52,44,32,67,82,89,80,84,79,71,65,77,83,32 -DB 98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115 -DB 108,46,111,114,103,62,0 -global GFp_ChaCha20_ctr32 - -ALIGN 64 -GFp_ChaCha20_ctr32: - mov QWORD[8+rsp],rdi ;WIN64 prologue - mov QWORD[16+rsp],rsi - mov rax,rsp -$L$SEH_begin_GFp_ChaCha20_ctr32: - mov rdi,rcx - mov rsi,rdx - mov rdx,r8 - mov rcx,r9 - mov r8,QWORD[40+rsp] - - - - cmp rdx,0 - je NEAR $L$no_data - mov r10,QWORD[((GFp_ia32cap_P+4))] - test r10d,512 - jnz NEAR $L$ChaCha20_ssse3 - - push rbx - - push rbp - - push r12 - - push r13 - - push r14 - - push r15 - - sub rsp,64+24 - -$L$ctr32_body: - - - movdqu xmm1,XMMWORD[rcx] - movdqu xmm2,XMMWORD[16+rcx] - movdqu xmm3,XMMWORD[r8] - movdqa xmm4,XMMWORD[$L$one] - - - movdqa XMMWORD[16+rsp],xmm1 - movdqa XMMWORD[32+rsp],xmm2 - movdqa XMMWORD[48+rsp],xmm3 - mov rbp,rdx - jmp NEAR $L$oop_outer - -ALIGN 32 -$L$oop_outer: - mov eax,0x61707865 - mov ebx,0x3320646e - mov ecx,0x79622d32 - mov edx,0x6b206574 - mov r8d,DWORD[16+rsp] - mov r9d,DWORD[20+rsp] - mov r10d,DWORD[24+rsp] - mov r11d,DWORD[28+rsp] - movd r12d,xmm3 - mov r13d,DWORD[52+rsp] - mov r14d,DWORD[56+rsp] - mov r15d,DWORD[60+rsp] - - mov QWORD[((64+0))+rsp],rbp - mov ebp,10 - mov QWORD[((64+8))+rsp],rsi -DB 102,72,15,126,214 - mov QWORD[((64+16))+rsp],rdi - mov rdi,rsi - shr rdi,32 - jmp NEAR $L$oop - -ALIGN 32 -$L$oop: - add eax,r8d - xor r12d,eax - rol r12d,16 - add ebx,r9d - xor r13d,ebx - rol r13d,16 - add esi,r12d - xor r8d,esi - rol r8d,12 - add edi,r13d - xor r9d,edi - rol r9d,12 - add eax,r8d - xor r12d,eax - rol r12d,8 - add ebx,r9d - xor r13d,ebx - rol r13d,8 - add esi,r12d - xor r8d,esi - rol r8d,7 - add edi,r13d - xor r9d,edi - rol r9d,7 - mov DWORD[32+rsp],esi - mov DWORD[36+rsp],edi - mov esi,DWORD[40+rsp] - mov edi,DWORD[44+rsp] - add ecx,r10d - xor r14d,ecx - rol r14d,16 - add edx,r11d - xor r15d,edx - rol r15d,16 - add esi,r14d - xor r10d,esi - rol r10d,12 - add edi,r15d - xor r11d,edi - rol r11d,12 - add ecx,r10d - xor r14d,ecx - rol r14d,8 - add edx,r11d - xor r15d,edx - rol r15d,8 - add esi,r14d - xor r10d,esi - rol r10d,7 - add edi,r15d - xor r11d,edi - rol r11d,7 - add eax,r9d - xor r15d,eax - rol r15d,16 - add ebx,r10d - xor r12d,ebx - rol r12d,16 - add esi,r15d - xor r9d,esi - rol r9d,12 - add edi,r12d - xor r10d,edi - rol r10d,12 - add eax,r9d - xor r15d,eax - rol r15d,8 - add ebx,r10d - xor r12d,ebx - rol r12d,8 - add esi,r15d - xor r9d,esi - rol r9d,7 - add edi,r12d - xor r10d,edi - rol r10d,7 - mov DWORD[40+rsp],esi - mov DWORD[44+rsp],edi - mov esi,DWORD[32+rsp] - mov edi,DWORD[36+rsp] - add ecx,r11d - xor r13d,ecx - rol r13d,16 - add edx,r8d - xor r14d,edx - rol r14d,16 - add esi,r13d - xor r11d,esi - rol r11d,12 - add edi,r14d - xor r8d,edi - rol r8d,12 - add ecx,r11d - xor r13d,ecx - rol r13d,8 - add edx,r8d - xor r14d,edx - rol r14d,8 - add esi,r13d - xor r11d,esi - rol r11d,7 - add edi,r14d - xor r8d,edi - rol r8d,7 - dec ebp - jnz NEAR $L$oop - mov DWORD[36+rsp],edi - mov DWORD[32+rsp],esi - mov rbp,QWORD[64+rsp] - movdqa xmm1,xmm2 - mov rsi,QWORD[((64+8))+rsp] - paddd xmm3,xmm4 - mov rdi,QWORD[((64+16))+rsp] - - add eax,0x61707865 - add ebx,0x3320646e - add ecx,0x79622d32 - add edx,0x6b206574 - add r8d,DWORD[16+rsp] - add r9d,DWORD[20+rsp] - add r10d,DWORD[24+rsp] - add r11d,DWORD[28+rsp] - add r12d,DWORD[48+rsp] - add r13d,DWORD[52+rsp] - add r14d,DWORD[56+rsp] - add r15d,DWORD[60+rsp] - paddd xmm1,XMMWORD[32+rsp] - - cmp rbp,64 - jb NEAR $L$tail - - xor eax,DWORD[rsi] - xor ebx,DWORD[4+rsi] - xor ecx,DWORD[8+rsi] - xor edx,DWORD[12+rsi] - xor r8d,DWORD[16+rsi] - xor r9d,DWORD[20+rsi] - xor r10d,DWORD[24+rsi] - xor r11d,DWORD[28+rsi] - movdqu xmm0,XMMWORD[32+rsi] - xor r12d,DWORD[48+rsi] - xor r13d,DWORD[52+rsi] - xor r14d,DWORD[56+rsi] - xor r15d,DWORD[60+rsi] - lea rsi,[64+rsi] - pxor xmm0,xmm1 - - movdqa XMMWORD[32+rsp],xmm2 - movd DWORD[48+rsp],xmm3 - - mov DWORD[rdi],eax - mov DWORD[4+rdi],ebx - mov DWORD[8+rdi],ecx - mov DWORD[12+rdi],edx - mov DWORD[16+rdi],r8d - mov DWORD[20+rdi],r9d - mov DWORD[24+rdi],r10d - mov DWORD[28+rdi],r11d - movdqu XMMWORD[32+rdi],xmm0 - mov DWORD[48+rdi],r12d - mov DWORD[52+rdi],r13d - mov DWORD[56+rdi],r14d - mov DWORD[60+rdi],r15d - lea rdi,[64+rdi] - - sub rbp,64 - jnz NEAR $L$oop_outer - - jmp NEAR $L$done - -ALIGN 16 -$L$tail: - mov DWORD[rsp],eax - mov DWORD[4+rsp],ebx - xor rbx,rbx - mov DWORD[8+rsp],ecx - mov DWORD[12+rsp],edx - mov DWORD[16+rsp],r8d - mov DWORD[20+rsp],r9d - mov DWORD[24+rsp],r10d - mov DWORD[28+rsp],r11d - movdqa XMMWORD[32+rsp],xmm1 - mov DWORD[48+rsp],r12d - mov DWORD[52+rsp],r13d - mov DWORD[56+rsp],r14d - mov DWORD[60+rsp],r15d - -$L$oop_tail: - movzx eax,BYTE[rbx*1+rsi] - movzx edx,BYTE[rbx*1+rsp] - lea rbx,[1+rbx] - xor eax,edx - mov BYTE[((-1))+rbx*1+rdi],al - dec rbp - jnz NEAR $L$oop_tail - -$L$done: - lea rsi,[((64+24+48))+rsp] - mov r15,QWORD[((-48))+rsi] - - mov r14,QWORD[((-40))+rsi] - - mov r13,QWORD[((-32))+rsi] - - mov r12,QWORD[((-24))+rsi] - - mov rbp,QWORD[((-16))+rsi] - - mov rbx,QWORD[((-8))+rsi] - - lea rsp,[rsi] - -$L$no_data: - mov rdi,QWORD[8+rsp] ;WIN64 epilogue - mov rsi,QWORD[16+rsp] - DB 0F3h,0C3h ;repret - -$L$SEH_end_GFp_ChaCha20_ctr32: - -ALIGN 32 -ChaCha20_ssse3: - mov QWORD[8+rsp],rdi ;WIN64 prologue - mov QWORD[16+rsp],rsi - mov rax,rsp -$L$SEH_begin_ChaCha20_ssse3: - mov rdi,rcx - mov rsi,rdx - mov rdx,r8 - mov rcx,r9 - mov r8,QWORD[40+rsp] - - -$L$ChaCha20_ssse3: - - mov r9,rsp - - cmp rdx,128 - ja NEAR $L$ChaCha20_4x - -$L$do_sse3_after_all: - sub rsp,64+40 - movaps XMMWORD[(-40)+r9],xmm6 - movaps XMMWORD[(-24)+r9],xmm7 -$L$ssse3_body: - movdqa xmm0,XMMWORD[$L$sigma] - movdqu xmm1,XMMWORD[rcx] - movdqu xmm2,XMMWORD[16+rcx] - movdqu xmm3,XMMWORD[r8] - movdqa xmm6,XMMWORD[$L$rot16] - movdqa xmm7,XMMWORD[$L$rot24] - - movdqa XMMWORD[rsp],xmm0 - movdqa XMMWORD[16+rsp],xmm1 - movdqa XMMWORD[32+rsp],xmm2 - movdqa XMMWORD[48+rsp],xmm3 - mov r8,10 - jmp NEAR $L$oop_ssse3 - -ALIGN 32 -$L$oop_outer_ssse3: - movdqa xmm3,XMMWORD[$L$one] - movdqa xmm0,XMMWORD[rsp] - movdqa xmm1,XMMWORD[16+rsp] - movdqa xmm2,XMMWORD[32+rsp] - paddd xmm3,XMMWORD[48+rsp] - mov r8,10 - movdqa XMMWORD[48+rsp],xmm3 - jmp NEAR $L$oop_ssse3 - -ALIGN 32 -$L$oop_ssse3: - paddd xmm0,xmm1 - pxor xmm3,xmm0 -DB 102,15,56,0,222 - paddd xmm2,xmm3 - pxor xmm1,xmm2 - movdqa xmm4,xmm1 - psrld xmm1,20 - pslld xmm4,12 - por xmm1,xmm4 - paddd xmm0,xmm1 - pxor xmm3,xmm0 -DB 102,15,56,0,223 - paddd xmm2,xmm3 - pxor xmm1,xmm2 - movdqa xmm4,xmm1 - psrld xmm1,25 - pslld xmm4,7 - por xmm1,xmm4 - pshufd xmm2,xmm2,78 - pshufd xmm1,xmm1,57 - pshufd xmm3,xmm3,147 - nop - paddd xmm0,xmm1 - pxor xmm3,xmm0 -DB 102,15,56,0,222 - paddd xmm2,xmm3 - pxor xmm1,xmm2 - movdqa xmm4,xmm1 - psrld xmm1,20 - pslld xmm4,12 - por xmm1,xmm4 - paddd xmm0,xmm1 - pxor xmm3,xmm0 -DB 102,15,56,0,223 - paddd xmm2,xmm3 - pxor xmm1,xmm2 - movdqa xmm4,xmm1 - psrld xmm1,25 - pslld xmm4,7 - por xmm1,xmm4 - pshufd xmm2,xmm2,78 - pshufd xmm1,xmm1,147 - pshufd xmm3,xmm3,57 - dec r8 - jnz NEAR $L$oop_ssse3 - paddd xmm0,XMMWORD[rsp] - paddd xmm1,XMMWORD[16+rsp] - paddd xmm2,XMMWORD[32+rsp] - paddd xmm3,XMMWORD[48+rsp] - - cmp rdx,64 - jb NEAR $L$tail_ssse3 - - movdqu xmm4,XMMWORD[rsi] - movdqu xmm5,XMMWORD[16+rsi] - pxor xmm0,xmm4 - movdqu xmm4,XMMWORD[32+rsi] - pxor xmm1,xmm5 - movdqu xmm5,XMMWORD[48+rsi] - lea rsi,[64+rsi] - pxor xmm2,xmm4 - pxor xmm3,xmm5 - - movdqu XMMWORD[rdi],xmm0 - movdqu XMMWORD[16+rdi],xmm1 - movdqu XMMWORD[32+rdi],xmm2 - movdqu XMMWORD[48+rdi],xmm3 - lea rdi,[64+rdi] - - sub rdx,64 - jnz NEAR $L$oop_outer_ssse3 - - jmp NEAR $L$done_ssse3 - -ALIGN 16 -$L$tail_ssse3: - movdqa XMMWORD[rsp],xmm0 - movdqa XMMWORD[16+rsp],xmm1 - movdqa XMMWORD[32+rsp],xmm2 - movdqa XMMWORD[48+rsp],xmm3 - xor r8,r8 - -$L$oop_tail_ssse3: - movzx eax,BYTE[r8*1+rsi] - movzx ecx,BYTE[r8*1+rsp] - lea r8,[1+r8] - xor eax,ecx - mov BYTE[((-1))+r8*1+rdi],al - dec rdx - jnz NEAR $L$oop_tail_ssse3 - -$L$done_ssse3: - movaps xmm6,XMMWORD[((-40))+r9] - movaps xmm7,XMMWORD[((-24))+r9] - lea rsp,[r9] - -$L$ssse3_epilogue: - mov rdi,QWORD[8+rsp] ;WIN64 epilogue - mov rsi,QWORD[16+rsp] - DB 0F3h,0C3h ;repret - -$L$SEH_end_ChaCha20_ssse3: - -ALIGN 32 -ChaCha20_4x: - mov QWORD[8+rsp],rdi ;WIN64 prologue - mov QWORD[16+rsp],rsi - mov rax,rsp -$L$SEH_begin_ChaCha20_4x: - mov rdi,rcx - mov rsi,rdx - mov rdx,r8 - mov rcx,r9 - mov r8,QWORD[40+rsp] - - -$L$ChaCha20_4x: - - mov r9,rsp - - mov r11,r10 - shr r10,32 - test r10,32 - jnz NEAR $L$ChaCha20_8x - cmp rdx,192 - ja NEAR $L$proceed4x - - and r11,71303168 - cmp r11,4194304 - je NEAR $L$do_sse3_after_all - -$L$proceed4x: - sub rsp,0x140+168 - movaps XMMWORD[(-168)+r9],xmm6 - movaps XMMWORD[(-152)+r9],xmm7 - movaps XMMWORD[(-136)+r9],xmm8 - movaps XMMWORD[(-120)+r9],xmm9 - movaps XMMWORD[(-104)+r9],xmm10 - movaps XMMWORD[(-88)+r9],xmm11 - movaps XMMWORD[(-72)+r9],xmm12 - movaps XMMWORD[(-56)+r9],xmm13 - movaps XMMWORD[(-40)+r9],xmm14 - movaps XMMWORD[(-24)+r9],xmm15 -$L$4x_body: - movdqa xmm11,XMMWORD[$L$sigma] - movdqu xmm15,XMMWORD[rcx] - movdqu xmm7,XMMWORD[16+rcx] - movdqu xmm3,XMMWORD[r8] - lea rcx,[256+rsp] - lea r10,[$L$rot16] - lea r11,[$L$rot24] - - pshufd xmm8,xmm11,0x00 - pshufd xmm9,xmm11,0x55 - movdqa XMMWORD[64+rsp],xmm8 - pshufd xmm10,xmm11,0xaa - movdqa XMMWORD[80+rsp],xmm9 - pshufd xmm11,xmm11,0xff - movdqa XMMWORD[96+rsp],xmm10 - movdqa XMMWORD[112+rsp],xmm11 - - pshufd xmm12,xmm15,0x00 - pshufd xmm13,xmm15,0x55 - movdqa XMMWORD[(128-256)+rcx],xmm12 - pshufd xmm14,xmm15,0xaa - movdqa XMMWORD[(144-256)+rcx],xmm13 - pshufd xmm15,xmm15,0xff - movdqa XMMWORD[(160-256)+rcx],xmm14 - movdqa XMMWORD[(176-256)+rcx],xmm15 - - pshufd xmm4,xmm7,0x00 - pshufd xmm5,xmm7,0x55 - movdqa XMMWORD[(192-256)+rcx],xmm4 - pshufd xmm6,xmm7,0xaa - movdqa XMMWORD[(208-256)+rcx],xmm5 - pshufd xmm7,xmm7,0xff - movdqa XMMWORD[(224-256)+rcx],xmm6 - movdqa XMMWORD[(240-256)+rcx],xmm7 - - pshufd xmm0,xmm3,0x00 - pshufd xmm1,xmm3,0x55 - paddd xmm0,XMMWORD[$L$inc] - pshufd xmm2,xmm3,0xaa - movdqa XMMWORD[(272-256)+rcx],xmm1 - pshufd xmm3,xmm3,0xff - movdqa XMMWORD[(288-256)+rcx],xmm2 - movdqa XMMWORD[(304-256)+rcx],xmm3 - - jmp NEAR $L$oop_enter4x - -ALIGN 32 -$L$oop_outer4x: - movdqa xmm8,XMMWORD[64+rsp] - movdqa xmm9,XMMWORD[80+rsp] - movdqa xmm10,XMMWORD[96+rsp] - movdqa xmm11,XMMWORD[112+rsp] - movdqa xmm12,XMMWORD[((128-256))+rcx] - movdqa xmm13,XMMWORD[((144-256))+rcx] - movdqa xmm14,XMMWORD[((160-256))+rcx] - movdqa xmm15,XMMWORD[((176-256))+rcx] - movdqa xmm4,XMMWORD[((192-256))+rcx] - movdqa xmm5,XMMWORD[((208-256))+rcx] - movdqa xmm6,XMMWORD[((224-256))+rcx] - movdqa xmm7,XMMWORD[((240-256))+rcx] - movdqa xmm0,XMMWORD[((256-256))+rcx] - movdqa xmm1,XMMWORD[((272-256))+rcx] - movdqa xmm2,XMMWORD[((288-256))+rcx] - movdqa xmm3,XMMWORD[((304-256))+rcx] - paddd xmm0,XMMWORD[$L$four] - -$L$oop_enter4x: - movdqa XMMWORD[32+rsp],xmm6 - movdqa XMMWORD[48+rsp],xmm7 - movdqa xmm7,XMMWORD[r10] - mov eax,10 - movdqa XMMWORD[(256-256)+rcx],xmm0 - jmp NEAR $L$oop4x - -ALIGN 32 -$L$oop4x: - paddd xmm8,xmm12 - paddd xmm9,xmm13 - pxor xmm0,xmm8 - pxor xmm1,xmm9 -DB 102,15,56,0,199 -DB 102,15,56,0,207 - paddd xmm4,xmm0 - paddd xmm5,xmm1 - pxor xmm12,xmm4 - pxor xmm13,xmm5 - movdqa xmm6,xmm12 - pslld xmm12,12 - psrld xmm6,20 - movdqa xmm7,xmm13 - pslld xmm13,12 - por xmm12,xmm6 - psrld xmm7,20 - movdqa xmm6,XMMWORD[r11] - por xmm13,xmm7 - paddd xmm8,xmm12 - paddd xmm9,xmm13 - pxor xmm0,xmm8 - pxor xmm1,xmm9 -DB 102,15,56,0,198 -DB 102,15,56,0,206 - paddd xmm4,xmm0 - paddd xmm5,xmm1 - pxor xmm12,xmm4 - pxor xmm13,xmm5 - movdqa xmm7,xmm12 - pslld xmm12,7 - psrld xmm7,25 - movdqa xmm6,xmm13 - pslld xmm13,7 - por xmm12,xmm7 - psrld xmm6,25 - movdqa xmm7,XMMWORD[r10] - por xmm13,xmm6 - movdqa XMMWORD[rsp],xmm4 - movdqa XMMWORD[16+rsp],xmm5 - movdqa xmm4,XMMWORD[32+rsp] - movdqa xmm5,XMMWORD[48+rsp] - paddd xmm10,xmm14 - paddd xmm11,xmm15 - pxor xmm2,xmm10 - pxor xmm3,xmm11 -DB 102,15,56,0,215 -DB 102,15,56,0,223 - paddd xmm4,xmm2 - paddd xmm5,xmm3 - pxor xmm14,xmm4 - pxor xmm15,xmm5 - movdqa xmm6,xmm14 - pslld xmm14,12 - psrld xmm6,20 - movdqa xmm7,xmm15 - pslld xmm15,12 - por xmm14,xmm6 - psrld xmm7,20 - movdqa xmm6,XMMWORD[r11] - por xmm15,xmm7 - paddd xmm10,xmm14 - paddd xmm11,xmm15 - pxor xmm2,xmm10 - pxor xmm3,xmm11 -DB 102,15,56,0,214 -DB 102,15,56,0,222 - paddd xmm4,xmm2 - paddd xmm5,xmm3 - pxor xmm14,xmm4 - pxor xmm15,xmm5 - movdqa xmm7,xmm14 - pslld xmm14,7 - psrld xmm7,25 - movdqa xmm6,xmm15 - pslld xmm15,7 - por xmm14,xmm7 - psrld xmm6,25 - movdqa xmm7,XMMWORD[r10] - por xmm15,xmm6 - paddd xmm8,xmm13 - paddd xmm9,xmm14 - pxor xmm3,xmm8 - pxor xmm0,xmm9 -DB 102,15,56,0,223 -DB 102,15,56,0,199 - paddd xmm4,xmm3 - paddd xmm5,xmm0 - pxor xmm13,xmm4 - pxor xmm14,xmm5 - movdqa xmm6,xmm13 - pslld xmm13,12 - psrld xmm6,20 - movdqa xmm7,xmm14 - pslld xmm14,12 - por xmm13,xmm6 - psrld xmm7,20 - movdqa xmm6,XMMWORD[r11] - por xmm14,xmm7 - paddd xmm8,xmm13 - paddd xmm9,xmm14 - pxor xmm3,xmm8 - pxor xmm0,xmm9 -DB 102,15,56,0,222 -DB 102,15,56,0,198 - paddd xmm4,xmm3 - paddd xmm5,xmm0 - pxor xmm13,xmm4 - pxor xmm14,xmm5 - movdqa xmm7,xmm13 - pslld xmm13,7 - psrld xmm7,25 - movdqa xmm6,xmm14 - pslld xmm14,7 - por xmm13,xmm7 - psrld xmm6,25 - movdqa xmm7,XMMWORD[r10] - por xmm14,xmm6 - movdqa XMMWORD[32+rsp],xmm4 - movdqa XMMWORD[48+rsp],xmm5 - movdqa xmm4,XMMWORD[rsp] - movdqa xmm5,XMMWORD[16+rsp] - paddd xmm10,xmm15 - paddd xmm11,xmm12 - pxor xmm1,xmm10 - pxor xmm2,xmm11 -DB 102,15,56,0,207 -DB 102,15,56,0,215 - paddd xmm4,xmm1 - paddd xmm5,xmm2 - pxor xmm15,xmm4 - pxor xmm12,xmm5 - movdqa xmm6,xmm15 - pslld xmm15,12 - psrld xmm6,20 - movdqa xmm7,xmm12 - pslld xmm12,12 - por xmm15,xmm6 - psrld xmm7,20 - movdqa xmm6,XMMWORD[r11] - por xmm12,xmm7 - paddd xmm10,xmm15 - paddd xmm11,xmm12 - pxor xmm1,xmm10 - pxor xmm2,xmm11 -DB 102,15,56,0,206 -DB 102,15,56,0,214 - paddd xmm4,xmm1 - paddd xmm5,xmm2 - pxor xmm15,xmm4 - pxor xmm12,xmm5 - movdqa xmm7,xmm15 - pslld xmm15,7 - psrld xmm7,25 - movdqa xmm6,xmm12 - pslld xmm12,7 - por xmm15,xmm7 - psrld xmm6,25 - movdqa xmm7,XMMWORD[r10] - por xmm12,xmm6 - dec eax - jnz NEAR $L$oop4x - - paddd xmm8,XMMWORD[64+rsp] - paddd xmm9,XMMWORD[80+rsp] - paddd xmm10,XMMWORD[96+rsp] - paddd xmm11,XMMWORD[112+rsp] - - movdqa xmm6,xmm8 - punpckldq xmm8,xmm9 - movdqa xmm7,xmm10 - punpckldq xmm10,xmm11 - punpckhdq xmm6,xmm9 - punpckhdq xmm7,xmm11 - movdqa xmm9,xmm8 - punpcklqdq xmm8,xmm10 - movdqa xmm11,xmm6 - punpcklqdq xmm6,xmm7 - punpckhqdq xmm9,xmm10 - punpckhqdq xmm11,xmm7 - paddd xmm12,XMMWORD[((128-256))+rcx] - paddd xmm13,XMMWORD[((144-256))+rcx] - paddd xmm14,XMMWORD[((160-256))+rcx] - paddd xmm15,XMMWORD[((176-256))+rcx] - - movdqa XMMWORD[rsp],xmm8 - movdqa XMMWORD[16+rsp],xmm9 - movdqa xmm8,XMMWORD[32+rsp] - movdqa xmm9,XMMWORD[48+rsp] - - movdqa xmm10,xmm12 - punpckldq xmm12,xmm13 - movdqa xmm7,xmm14 - punpckldq xmm14,xmm15 - punpckhdq xmm10,xmm13 - punpckhdq xmm7,xmm15 - movdqa xmm13,xmm12 - punpcklqdq xmm12,xmm14 - movdqa xmm15,xmm10 - punpcklqdq xmm10,xmm7 - punpckhqdq xmm13,xmm14 - punpckhqdq xmm15,xmm7 - paddd xmm4,XMMWORD[((192-256))+rcx] - paddd xmm5,XMMWORD[((208-256))+rcx] - paddd xmm8,XMMWORD[((224-256))+rcx] - paddd xmm9,XMMWORD[((240-256))+rcx] - - movdqa XMMWORD[32+rsp],xmm6 - movdqa XMMWORD[48+rsp],xmm11 - - movdqa xmm14,xmm4 - punpckldq xmm4,xmm5 - movdqa xmm7,xmm8 - punpckldq xmm8,xmm9 - punpckhdq xmm14,xmm5 - punpckhdq xmm7,xmm9 - movdqa xmm5,xmm4 - punpcklqdq xmm4,xmm8 - movdqa xmm9,xmm14 - punpcklqdq xmm14,xmm7 - punpckhqdq xmm5,xmm8 - punpckhqdq xmm9,xmm7 - paddd xmm0,XMMWORD[((256-256))+rcx] - paddd xmm1,XMMWORD[((272-256))+rcx] - paddd xmm2,XMMWORD[((288-256))+rcx] - paddd xmm3,XMMWORD[((304-256))+rcx] - - movdqa xmm8,xmm0 - punpckldq xmm0,xmm1 - movdqa xmm7,xmm2 - punpckldq xmm2,xmm3 - punpckhdq xmm8,xmm1 - punpckhdq xmm7,xmm3 - movdqa xmm1,xmm0 - punpcklqdq xmm0,xmm2 - movdqa xmm3,xmm8 - punpcklqdq xmm8,xmm7 - punpckhqdq xmm1,xmm2 - punpckhqdq xmm3,xmm7 - cmp rdx,64*4 - jb NEAR $L$tail4x - - movdqu xmm6,XMMWORD[rsi] - movdqu xmm11,XMMWORD[16+rsi] - movdqu xmm2,XMMWORD[32+rsi] - movdqu xmm7,XMMWORD[48+rsi] - pxor xmm6,XMMWORD[rsp] - pxor xmm11,xmm12 - pxor xmm2,xmm4 - pxor xmm7,xmm0 - - movdqu XMMWORD[rdi],xmm6 - movdqu xmm6,XMMWORD[64+rsi] - movdqu XMMWORD[16+rdi],xmm11 - movdqu xmm11,XMMWORD[80+rsi] - movdqu XMMWORD[32+rdi],xmm2 - movdqu xmm2,XMMWORD[96+rsi] - movdqu XMMWORD[48+rdi],xmm7 - movdqu xmm7,XMMWORD[112+rsi] - lea rsi,[128+rsi] - pxor xmm6,XMMWORD[16+rsp] - pxor xmm11,xmm13 - pxor xmm2,xmm5 - pxor xmm7,xmm1 - - movdqu XMMWORD[64+rdi],xmm6 - movdqu xmm6,XMMWORD[rsi] - movdqu XMMWORD[80+rdi],xmm11 - movdqu xmm11,XMMWORD[16+rsi] - movdqu XMMWORD[96+rdi],xmm2 - movdqu xmm2,XMMWORD[32+rsi] - movdqu XMMWORD[112+rdi],xmm7 - lea rdi,[128+rdi] - movdqu xmm7,XMMWORD[48+rsi] - pxor xmm6,XMMWORD[32+rsp] - pxor xmm11,xmm10 - pxor xmm2,xmm14 - pxor xmm7,xmm8 - - movdqu XMMWORD[rdi],xmm6 - movdqu xmm6,XMMWORD[64+rsi] - movdqu XMMWORD[16+rdi],xmm11 - movdqu xmm11,XMMWORD[80+rsi] - movdqu XMMWORD[32+rdi],xmm2 - movdqu xmm2,XMMWORD[96+rsi] - movdqu XMMWORD[48+rdi],xmm7 - movdqu xmm7,XMMWORD[112+rsi] - lea rsi,[128+rsi] - pxor xmm6,XMMWORD[48+rsp] - pxor xmm11,xmm15 - pxor xmm2,xmm9 - pxor xmm7,xmm3 - movdqu XMMWORD[64+rdi],xmm6 - movdqu XMMWORD[80+rdi],xmm11 - movdqu XMMWORD[96+rdi],xmm2 - movdqu XMMWORD[112+rdi],xmm7 - lea rdi,[128+rdi] - - sub rdx,64*4 - jnz NEAR $L$oop_outer4x - - jmp NEAR $L$done4x - -$L$tail4x: - cmp rdx,192 - jae NEAR $L$192_or_more4x - cmp rdx,128 - jae NEAR $L$128_or_more4x - cmp rdx,64 - jae NEAR $L$64_or_more4x - - - xor r10,r10 - - movdqa XMMWORD[16+rsp],xmm12 - movdqa XMMWORD[32+rsp],xmm4 - movdqa XMMWORD[48+rsp],xmm0 - jmp NEAR $L$oop_tail4x - -ALIGN 32 -$L$64_or_more4x: - movdqu xmm6,XMMWORD[rsi] - movdqu xmm11,XMMWORD[16+rsi] - movdqu xmm2,XMMWORD[32+rsi] - movdqu xmm7,XMMWORD[48+rsi] - pxor xmm6,XMMWORD[rsp] - pxor xmm11,xmm12 - pxor xmm2,xmm4 - pxor xmm7,xmm0 - movdqu XMMWORD[rdi],xmm6 - movdqu XMMWORD[16+rdi],xmm11 - movdqu XMMWORD[32+rdi],xmm2 - movdqu XMMWORD[48+rdi],xmm7 - je NEAR $L$done4x - - movdqa xmm6,XMMWORD[16+rsp] - lea rsi,[64+rsi] - xor r10,r10 - movdqa XMMWORD[rsp],xmm6 - movdqa XMMWORD[16+rsp],xmm13 - lea rdi,[64+rdi] - movdqa XMMWORD[32+rsp],xmm5 - sub rdx,64 - movdqa XMMWORD[48+rsp],xmm1 - jmp NEAR $L$oop_tail4x - -ALIGN 32 -$L$128_or_more4x: - movdqu xmm6,XMMWORD[rsi] - movdqu xmm11,XMMWORD[16+rsi] - movdqu xmm2,XMMWORD[32+rsi] - movdqu xmm7,XMMWORD[48+rsi] - pxor xmm6,XMMWORD[rsp] - pxor xmm11,xmm12 - pxor xmm2,xmm4 - pxor xmm7,xmm0 - - movdqu XMMWORD[rdi],xmm6 - movdqu xmm6,XMMWORD[64+rsi] - movdqu XMMWORD[16+rdi],xmm11 - movdqu xmm11,XMMWORD[80+rsi] - movdqu XMMWORD[32+rdi],xmm2 - movdqu xmm2,XMMWORD[96+rsi] - movdqu XMMWORD[48+rdi],xmm7 - movdqu xmm7,XMMWORD[112+rsi] - pxor xmm6,XMMWORD[16+rsp] - pxor xmm11,xmm13 - pxor xmm2,xmm5 - pxor xmm7,xmm1 - movdqu XMMWORD[64+rdi],xmm6 - movdqu XMMWORD[80+rdi],xmm11 - movdqu XMMWORD[96+rdi],xmm2 - movdqu XMMWORD[112+rdi],xmm7 - je NEAR $L$done4x - - movdqa xmm6,XMMWORD[32+rsp] - lea rsi,[128+rsi] - xor r10,r10 - movdqa XMMWORD[rsp],xmm6 - movdqa XMMWORD[16+rsp],xmm10 - lea rdi,[128+rdi] - movdqa XMMWORD[32+rsp],xmm14 - sub rdx,128 - movdqa XMMWORD[48+rsp],xmm8 - jmp NEAR $L$oop_tail4x - -ALIGN 32 -$L$192_or_more4x: - movdqu xmm6,XMMWORD[rsi] - movdqu xmm11,XMMWORD[16+rsi] - movdqu xmm2,XMMWORD[32+rsi] - movdqu xmm7,XMMWORD[48+rsi] - pxor xmm6,XMMWORD[rsp] - pxor xmm11,xmm12 - pxor xmm2,xmm4 - pxor xmm7,xmm0 - - movdqu XMMWORD[rdi],xmm6 - movdqu xmm6,XMMWORD[64+rsi] - movdqu XMMWORD[16+rdi],xmm11 - movdqu xmm11,XMMWORD[80+rsi] - movdqu XMMWORD[32+rdi],xmm2 - movdqu xmm2,XMMWORD[96+rsi] - movdqu XMMWORD[48+rdi],xmm7 - movdqu xmm7,XMMWORD[112+rsi] - lea rsi,[128+rsi] - pxor xmm6,XMMWORD[16+rsp] - pxor xmm11,xmm13 - pxor xmm2,xmm5 - pxor xmm7,xmm1 - - movdqu XMMWORD[64+rdi],xmm6 - movdqu xmm6,XMMWORD[rsi] - movdqu XMMWORD[80+rdi],xmm11 - movdqu xmm11,XMMWORD[16+rsi] - movdqu XMMWORD[96+rdi],xmm2 - movdqu xmm2,XMMWORD[32+rsi] - movdqu XMMWORD[112+rdi],xmm7 - lea rdi,[128+rdi] - movdqu xmm7,XMMWORD[48+rsi] - pxor xmm6,XMMWORD[32+rsp] - pxor xmm11,xmm10 - pxor xmm2,xmm14 - pxor xmm7,xmm8 - movdqu XMMWORD[rdi],xmm6 - movdqu XMMWORD[16+rdi],xmm11 - movdqu XMMWORD[32+rdi],xmm2 - movdqu XMMWORD[48+rdi],xmm7 - je NEAR $L$done4x - - movdqa xmm6,XMMWORD[48+rsp] - lea rsi,[64+rsi] - xor r10,r10 - movdqa XMMWORD[rsp],xmm6 - movdqa XMMWORD[16+rsp],xmm15 - lea rdi,[64+rdi] - movdqa XMMWORD[32+rsp],xmm9 - sub rdx,192 - movdqa XMMWORD[48+rsp],xmm3 - -$L$oop_tail4x: - movzx eax,BYTE[r10*1+rsi] - movzx ecx,BYTE[r10*1+rsp] - lea r10,[1+r10] - xor eax,ecx - mov BYTE[((-1))+r10*1+rdi],al - dec rdx - jnz NEAR $L$oop_tail4x - -$L$done4x: - movaps xmm6,XMMWORD[((-168))+r9] - movaps xmm7,XMMWORD[((-152))+r9] - movaps xmm8,XMMWORD[((-136))+r9] - movaps xmm9,XMMWORD[((-120))+r9] - movaps xmm10,XMMWORD[((-104))+r9] - movaps xmm11,XMMWORD[((-88))+r9] - movaps xmm12,XMMWORD[((-72))+r9] - movaps xmm13,XMMWORD[((-56))+r9] - movaps xmm14,XMMWORD[((-40))+r9] - movaps xmm15,XMMWORD[((-24))+r9] - lea rsp,[r9] - -$L$4x_epilogue: - mov rdi,QWORD[8+rsp] ;WIN64 epilogue - mov rsi,QWORD[16+rsp] - DB 0F3h,0C3h ;repret - -$L$SEH_end_ChaCha20_4x: - -ALIGN 32 -ChaCha20_8x: - mov QWORD[8+rsp],rdi ;WIN64 prologue - mov QWORD[16+rsp],rsi - mov rax,rsp -$L$SEH_begin_ChaCha20_8x: - mov rdi,rcx - mov rsi,rdx - mov rdx,r8 - mov rcx,r9 - mov r8,QWORD[40+rsp] - - -$L$ChaCha20_8x: - - mov r9,rsp - - sub rsp,0x280+168 - and rsp,-32 - movaps XMMWORD[(-168)+r9],xmm6 - movaps XMMWORD[(-152)+r9],xmm7 - movaps XMMWORD[(-136)+r9],xmm8 - movaps XMMWORD[(-120)+r9],xmm9 - movaps XMMWORD[(-104)+r9],xmm10 - movaps XMMWORD[(-88)+r9],xmm11 - movaps XMMWORD[(-72)+r9],xmm12 - movaps XMMWORD[(-56)+r9],xmm13 - movaps XMMWORD[(-40)+r9],xmm14 - movaps XMMWORD[(-24)+r9],xmm15 -$L$8x_body: - vzeroupper - - - - - - - - - - - vbroadcasti128 ymm11,XMMWORD[$L$sigma] - vbroadcasti128 ymm3,XMMWORD[rcx] - vbroadcasti128 ymm15,XMMWORD[16+rcx] - vbroadcasti128 ymm7,XMMWORD[r8] - lea rcx,[256+rsp] - lea rax,[512+rsp] - lea r10,[$L$rot16] - lea r11,[$L$rot24] - - vpshufd ymm8,ymm11,0x00 - vpshufd ymm9,ymm11,0x55 - vmovdqa YMMWORD[(128-256)+rcx],ymm8 - vpshufd ymm10,ymm11,0xaa - vmovdqa YMMWORD[(160-256)+rcx],ymm9 - vpshufd ymm11,ymm11,0xff - vmovdqa YMMWORD[(192-256)+rcx],ymm10 - vmovdqa YMMWORD[(224-256)+rcx],ymm11 - - vpshufd ymm0,ymm3,0x00 - vpshufd ymm1,ymm3,0x55 - vmovdqa YMMWORD[(256-256)+rcx],ymm0 - vpshufd ymm2,ymm3,0xaa - vmovdqa YMMWORD[(288-256)+rcx],ymm1 - vpshufd ymm3,ymm3,0xff - vmovdqa YMMWORD[(320-256)+rcx],ymm2 - vmovdqa YMMWORD[(352-256)+rcx],ymm3 - - vpshufd ymm12,ymm15,0x00 - vpshufd ymm13,ymm15,0x55 - vmovdqa YMMWORD[(384-512)+rax],ymm12 - vpshufd ymm14,ymm15,0xaa - vmovdqa YMMWORD[(416-512)+rax],ymm13 - vpshufd ymm15,ymm15,0xff - vmovdqa YMMWORD[(448-512)+rax],ymm14 - vmovdqa YMMWORD[(480-512)+rax],ymm15 - - vpshufd ymm4,ymm7,0x00 - vpshufd ymm5,ymm7,0x55 - vpaddd ymm4,ymm4,YMMWORD[$L$incy] - vpshufd ymm6,ymm7,0xaa - vmovdqa YMMWORD[(544-512)+rax],ymm5 - vpshufd ymm7,ymm7,0xff - vmovdqa YMMWORD[(576-512)+rax],ymm6 - vmovdqa YMMWORD[(608-512)+rax],ymm7 - - jmp NEAR $L$oop_enter8x - -ALIGN 32 -$L$oop_outer8x: - vmovdqa ymm8,YMMWORD[((128-256))+rcx] - vmovdqa ymm9,YMMWORD[((160-256))+rcx] - vmovdqa ymm10,YMMWORD[((192-256))+rcx] - vmovdqa ymm11,YMMWORD[((224-256))+rcx] - vmovdqa ymm0,YMMWORD[((256-256))+rcx] - vmovdqa ymm1,YMMWORD[((288-256))+rcx] - vmovdqa ymm2,YMMWORD[((320-256))+rcx] - vmovdqa ymm3,YMMWORD[((352-256))+rcx] - vmovdqa ymm12,YMMWORD[((384-512))+rax] - vmovdqa ymm13,YMMWORD[((416-512))+rax] - vmovdqa ymm14,YMMWORD[((448-512))+rax] - vmovdqa ymm15,YMMWORD[((480-512))+rax] - vmovdqa ymm4,YMMWORD[((512-512))+rax] - vmovdqa ymm5,YMMWORD[((544-512))+rax] - vmovdqa ymm6,YMMWORD[((576-512))+rax] - vmovdqa ymm7,YMMWORD[((608-512))+rax] - vpaddd ymm4,ymm4,YMMWORD[$L$eight] - -$L$oop_enter8x: - vmovdqa YMMWORD[64+rsp],ymm14 - vmovdqa YMMWORD[96+rsp],ymm15 - vbroadcasti128 ymm15,XMMWORD[r10] - vmovdqa YMMWORD[(512-512)+rax],ymm4 - mov eax,10 - jmp NEAR $L$oop8x - -ALIGN 32 -$L$oop8x: - vpaddd ymm8,ymm8,ymm0 - vpxor ymm4,ymm8,ymm4 - vpshufb ymm4,ymm4,ymm15 - vpaddd ymm9,ymm9,ymm1 - vpxor ymm5,ymm9,ymm5 - vpshufb ymm5,ymm5,ymm15 - vpaddd ymm12,ymm12,ymm4 - vpxor ymm0,ymm12,ymm0 - vpslld ymm14,ymm0,12 - vpsrld ymm0,ymm0,20 - vpor ymm0,ymm14,ymm0 - vbroadcasti128 ymm14,XMMWORD[r11] - vpaddd ymm13,ymm13,ymm5 - vpxor ymm1,ymm13,ymm1 - vpslld ymm15,ymm1,12 - vpsrld ymm1,ymm1,20 - vpor ymm1,ymm15,ymm1 - vpaddd ymm8,ymm8,ymm0 - vpxor ymm4,ymm8,ymm4 - vpshufb ymm4,ymm4,ymm14 - vpaddd ymm9,ymm9,ymm1 - vpxor ymm5,ymm9,ymm5 - vpshufb ymm5,ymm5,ymm14 - vpaddd ymm12,ymm12,ymm4 - vpxor ymm0,ymm12,ymm0 - vpslld ymm15,ymm0,7 - vpsrld ymm0,ymm0,25 - vpor ymm0,ymm15,ymm0 - vbroadcasti128 ymm15,XMMWORD[r10] - vpaddd ymm13,ymm13,ymm5 - vpxor ymm1,ymm13,ymm1 - vpslld ymm14,ymm1,7 - vpsrld ymm1,ymm1,25 - vpor ymm1,ymm14,ymm1 - vmovdqa YMMWORD[rsp],ymm12 - vmovdqa YMMWORD[32+rsp],ymm13 - vmovdqa ymm12,YMMWORD[64+rsp] - vmovdqa ymm13,YMMWORD[96+rsp] - vpaddd ymm10,ymm10,ymm2 - vpxor ymm6,ymm10,ymm6 - vpshufb ymm6,ymm6,ymm15 - vpaddd ymm11,ymm11,ymm3 - vpxor ymm7,ymm11,ymm7 - vpshufb ymm7,ymm7,ymm15 - vpaddd ymm12,ymm12,ymm6 - vpxor ymm2,ymm12,ymm2 - vpslld ymm14,ymm2,12 - vpsrld ymm2,ymm2,20 - vpor ymm2,ymm14,ymm2 - vbroadcasti128 ymm14,XMMWORD[r11] - vpaddd ymm13,ymm13,ymm7 - vpxor ymm3,ymm13,ymm3 - vpslld ymm15,ymm3,12 - vpsrld ymm3,ymm3,20 - vpor ymm3,ymm15,ymm3 - vpaddd ymm10,ymm10,ymm2 - vpxor ymm6,ymm10,ymm6 - vpshufb ymm6,ymm6,ymm14 - vpaddd ymm11,ymm11,ymm3 - vpxor ymm7,ymm11,ymm7 - vpshufb ymm7,ymm7,ymm14 - vpaddd ymm12,ymm12,ymm6 - vpxor ymm2,ymm12,ymm2 - vpslld ymm15,ymm2,7 - vpsrld ymm2,ymm2,25 - vpor ymm2,ymm15,ymm2 - vbroadcasti128 ymm15,XMMWORD[r10] - vpaddd ymm13,ymm13,ymm7 - vpxor ymm3,ymm13,ymm3 - vpslld ymm14,ymm3,7 - vpsrld ymm3,ymm3,25 - vpor ymm3,ymm14,ymm3 - vpaddd ymm8,ymm8,ymm1 - vpxor ymm7,ymm8,ymm7 - vpshufb ymm7,ymm7,ymm15 - vpaddd ymm9,ymm9,ymm2 - vpxor ymm4,ymm9,ymm4 - vpshufb ymm4,ymm4,ymm15 - vpaddd ymm12,ymm12,ymm7 - vpxor ymm1,ymm12,ymm1 - vpslld ymm14,ymm1,12 - vpsrld ymm1,ymm1,20 - vpor ymm1,ymm14,ymm1 - vbroadcasti128 ymm14,XMMWORD[r11] - vpaddd ymm13,ymm13,ymm4 - vpxor ymm2,ymm13,ymm2 - vpslld ymm15,ymm2,12 - vpsrld ymm2,ymm2,20 - vpor ymm2,ymm15,ymm2 - vpaddd ymm8,ymm8,ymm1 - vpxor ymm7,ymm8,ymm7 - vpshufb ymm7,ymm7,ymm14 - vpaddd ymm9,ymm9,ymm2 - vpxor ymm4,ymm9,ymm4 - vpshufb ymm4,ymm4,ymm14 - vpaddd ymm12,ymm12,ymm7 - vpxor ymm1,ymm12,ymm1 - vpslld ymm15,ymm1,7 - vpsrld ymm1,ymm1,25 - vpor ymm1,ymm15,ymm1 - vbroadcasti128 ymm15,XMMWORD[r10] - vpaddd ymm13,ymm13,ymm4 - vpxor ymm2,ymm13,ymm2 - vpslld ymm14,ymm2,7 - vpsrld ymm2,ymm2,25 - vpor ymm2,ymm14,ymm2 - vmovdqa YMMWORD[64+rsp],ymm12 - vmovdqa YMMWORD[96+rsp],ymm13 - vmovdqa ymm12,YMMWORD[rsp] - vmovdqa ymm13,YMMWORD[32+rsp] - vpaddd ymm10,ymm10,ymm3 - vpxor ymm5,ymm10,ymm5 - vpshufb ymm5,ymm5,ymm15 - vpaddd ymm11,ymm11,ymm0 - vpxor ymm6,ymm11,ymm6 - vpshufb ymm6,ymm6,ymm15 - vpaddd ymm12,ymm12,ymm5 - vpxor ymm3,ymm12,ymm3 - vpslld ymm14,ymm3,12 - vpsrld ymm3,ymm3,20 - vpor ymm3,ymm14,ymm3 - vbroadcasti128 ymm14,XMMWORD[r11] - vpaddd ymm13,ymm13,ymm6 - vpxor ymm0,ymm13,ymm0 - vpslld ymm15,ymm0,12 - vpsrld ymm0,ymm0,20 - vpor ymm0,ymm15,ymm0 - vpaddd ymm10,ymm10,ymm3 - vpxor ymm5,ymm10,ymm5 - vpshufb ymm5,ymm5,ymm14 - vpaddd ymm11,ymm11,ymm0 - vpxor ymm6,ymm11,ymm6 - vpshufb ymm6,ymm6,ymm14 - vpaddd ymm12,ymm12,ymm5 - vpxor ymm3,ymm12,ymm3 - vpslld ymm15,ymm3,7 - vpsrld ymm3,ymm3,25 - vpor ymm3,ymm15,ymm3 - vbroadcasti128 ymm15,XMMWORD[r10] - vpaddd ymm13,ymm13,ymm6 - vpxor ymm0,ymm13,ymm0 - vpslld ymm14,ymm0,7 - vpsrld ymm0,ymm0,25 - vpor ymm0,ymm14,ymm0 - dec eax - jnz NEAR $L$oop8x - - lea rax,[512+rsp] - vpaddd ymm8,ymm8,YMMWORD[((128-256))+rcx] - vpaddd ymm9,ymm9,YMMWORD[((160-256))+rcx] - vpaddd ymm10,ymm10,YMMWORD[((192-256))+rcx] - vpaddd ymm11,ymm11,YMMWORD[((224-256))+rcx] - - vpunpckldq ymm14,ymm8,ymm9 - vpunpckldq ymm15,ymm10,ymm11 - vpunpckhdq ymm8,ymm8,ymm9 - vpunpckhdq ymm10,ymm10,ymm11 - vpunpcklqdq ymm9,ymm14,ymm15 - vpunpckhqdq ymm14,ymm14,ymm15 - vpunpcklqdq ymm11,ymm8,ymm10 - vpunpckhqdq ymm8,ymm8,ymm10 - vpaddd ymm0,ymm0,YMMWORD[((256-256))+rcx] - vpaddd ymm1,ymm1,YMMWORD[((288-256))+rcx] - vpaddd ymm2,ymm2,YMMWORD[((320-256))+rcx] - vpaddd ymm3,ymm3,YMMWORD[((352-256))+rcx] - - vpunpckldq ymm10,ymm0,ymm1 - vpunpckldq ymm15,ymm2,ymm3 - vpunpckhdq ymm0,ymm0,ymm1 - vpunpckhdq ymm2,ymm2,ymm3 - vpunpcklqdq ymm1,ymm10,ymm15 - vpunpckhqdq ymm10,ymm10,ymm15 - vpunpcklqdq ymm3,ymm0,ymm2 - vpunpckhqdq ymm0,ymm0,ymm2 - vperm2i128 ymm15,ymm9,ymm1,0x20 - vperm2i128 ymm1,ymm9,ymm1,0x31 - vperm2i128 ymm9,ymm14,ymm10,0x20 - vperm2i128 ymm10,ymm14,ymm10,0x31 - vperm2i128 ymm14,ymm11,ymm3,0x20 - vperm2i128 ymm3,ymm11,ymm3,0x31 - vperm2i128 ymm11,ymm8,ymm0,0x20 - vperm2i128 ymm0,ymm8,ymm0,0x31 - vmovdqa YMMWORD[rsp],ymm15 - vmovdqa YMMWORD[32+rsp],ymm9 - vmovdqa ymm15,YMMWORD[64+rsp] - vmovdqa ymm9,YMMWORD[96+rsp] - - vpaddd ymm12,ymm12,YMMWORD[((384-512))+rax] - vpaddd ymm13,ymm13,YMMWORD[((416-512))+rax] - vpaddd ymm15,ymm15,YMMWORD[((448-512))+rax] - vpaddd ymm9,ymm9,YMMWORD[((480-512))+rax] - - vpunpckldq ymm2,ymm12,ymm13 - vpunpckldq ymm8,ymm15,ymm9 - vpunpckhdq ymm12,ymm12,ymm13 - vpunpckhdq ymm15,ymm15,ymm9 - vpunpcklqdq ymm13,ymm2,ymm8 - vpunpckhqdq ymm2,ymm2,ymm8 - vpunpcklqdq ymm9,ymm12,ymm15 - vpunpckhqdq ymm12,ymm12,ymm15 - vpaddd ymm4,ymm4,YMMWORD[((512-512))+rax] - vpaddd ymm5,ymm5,YMMWORD[((544-512))+rax] - vpaddd ymm6,ymm6,YMMWORD[((576-512))+rax] - vpaddd ymm7,ymm7,YMMWORD[((608-512))+rax] - - vpunpckldq ymm15,ymm4,ymm5 - vpunpckldq ymm8,ymm6,ymm7 - vpunpckhdq ymm4,ymm4,ymm5 - vpunpckhdq ymm6,ymm6,ymm7 - vpunpcklqdq ymm5,ymm15,ymm8 - vpunpckhqdq ymm15,ymm15,ymm8 - vpunpcklqdq ymm7,ymm4,ymm6 - vpunpckhqdq ymm4,ymm4,ymm6 - vperm2i128 ymm8,ymm13,ymm5,0x20 - vperm2i128 ymm5,ymm13,ymm5,0x31 - vperm2i128 ymm13,ymm2,ymm15,0x20 - vperm2i128 ymm15,ymm2,ymm15,0x31 - vperm2i128 ymm2,ymm9,ymm7,0x20 - vperm2i128 ymm7,ymm9,ymm7,0x31 - vperm2i128 ymm9,ymm12,ymm4,0x20 - vperm2i128 ymm4,ymm12,ymm4,0x31 - vmovdqa ymm6,YMMWORD[rsp] - vmovdqa ymm12,YMMWORD[32+rsp] - - cmp rdx,64*8 - jb NEAR $L$tail8x - - vpxor ymm6,ymm6,YMMWORD[rsi] - vpxor ymm8,ymm8,YMMWORD[32+rsi] - vpxor ymm1,ymm1,YMMWORD[64+rsi] - vpxor ymm5,ymm5,YMMWORD[96+rsi] - lea rsi,[128+rsi] - vmovdqu YMMWORD[rdi],ymm6 - vmovdqu YMMWORD[32+rdi],ymm8 - vmovdqu YMMWORD[64+rdi],ymm1 - vmovdqu YMMWORD[96+rdi],ymm5 - lea rdi,[128+rdi] - - vpxor ymm12,ymm12,YMMWORD[rsi] - vpxor ymm13,ymm13,YMMWORD[32+rsi] - vpxor ymm10,ymm10,YMMWORD[64+rsi] - vpxor ymm15,ymm15,YMMWORD[96+rsi] - lea rsi,[128+rsi] - vmovdqu YMMWORD[rdi],ymm12 - vmovdqu YMMWORD[32+rdi],ymm13 - vmovdqu YMMWORD[64+rdi],ymm10 - vmovdqu YMMWORD[96+rdi],ymm15 - lea rdi,[128+rdi] - - vpxor ymm14,ymm14,YMMWORD[rsi] - vpxor ymm2,ymm2,YMMWORD[32+rsi] - vpxor ymm3,ymm3,YMMWORD[64+rsi] - vpxor ymm7,ymm7,YMMWORD[96+rsi] - lea rsi,[128+rsi] - vmovdqu YMMWORD[rdi],ymm14 - vmovdqu YMMWORD[32+rdi],ymm2 - vmovdqu YMMWORD[64+rdi],ymm3 - vmovdqu YMMWORD[96+rdi],ymm7 - lea rdi,[128+rdi] - - vpxor ymm11,ymm11,YMMWORD[rsi] - vpxor ymm9,ymm9,YMMWORD[32+rsi] - vpxor ymm0,ymm0,YMMWORD[64+rsi] - vpxor ymm4,ymm4,YMMWORD[96+rsi] - lea rsi,[128+rsi] - vmovdqu YMMWORD[rdi],ymm11 - vmovdqu YMMWORD[32+rdi],ymm9 - vmovdqu YMMWORD[64+rdi],ymm0 - vmovdqu YMMWORD[96+rdi],ymm4 - lea rdi,[128+rdi] - - sub rdx,64*8 - jnz NEAR $L$oop_outer8x - - jmp NEAR $L$done8x - -$L$tail8x: - cmp rdx,448 - jae NEAR $L$448_or_more8x - cmp rdx,384 - jae NEAR $L$384_or_more8x - cmp rdx,320 - jae NEAR $L$320_or_more8x - cmp rdx,256 - jae NEAR $L$256_or_more8x - cmp rdx,192 - jae NEAR $L$192_or_more8x - cmp rdx,128 - jae NEAR $L$128_or_more8x - cmp rdx,64 - jae NEAR $L$64_or_more8x - - xor r10,r10 - vmovdqa YMMWORD[rsp],ymm6 - vmovdqa YMMWORD[32+rsp],ymm8 - jmp NEAR $L$oop_tail8x - -ALIGN 32 -$L$64_or_more8x: - vpxor ymm6,ymm6,YMMWORD[rsi] - vpxor ymm8,ymm8,YMMWORD[32+rsi] - vmovdqu YMMWORD[rdi],ymm6 - vmovdqu YMMWORD[32+rdi],ymm8 - je NEAR $L$done8x - - lea rsi,[64+rsi] - xor r10,r10 - vmovdqa YMMWORD[rsp],ymm1 - lea rdi,[64+rdi] - sub rdx,64 - vmovdqa YMMWORD[32+rsp],ymm5 - jmp NEAR $L$oop_tail8x - -ALIGN 32 -$L$128_or_more8x: - vpxor ymm6,ymm6,YMMWORD[rsi] - vpxor ymm8,ymm8,YMMWORD[32+rsi] - vpxor ymm1,ymm1,YMMWORD[64+rsi] - vpxor ymm5,ymm5,YMMWORD[96+rsi] - vmovdqu YMMWORD[rdi],ymm6 - vmovdqu YMMWORD[32+rdi],ymm8 - vmovdqu YMMWORD[64+rdi],ymm1 - vmovdqu YMMWORD[96+rdi],ymm5 - je NEAR $L$done8x - - lea rsi,[128+rsi] - xor r10,r10 - vmovdqa YMMWORD[rsp],ymm12 - lea rdi,[128+rdi] - sub rdx,128 - vmovdqa YMMWORD[32+rsp],ymm13 - jmp NEAR $L$oop_tail8x - -ALIGN 32 -$L$192_or_more8x: - vpxor ymm6,ymm6,YMMWORD[rsi] - vpxor ymm8,ymm8,YMMWORD[32+rsi] - vpxor ymm1,ymm1,YMMWORD[64+rsi] - vpxor ymm5,ymm5,YMMWORD[96+rsi] - vpxor ymm12,ymm12,YMMWORD[128+rsi] - vpxor ymm13,ymm13,YMMWORD[160+rsi] - vmovdqu YMMWORD[rdi],ymm6 - vmovdqu YMMWORD[32+rdi],ymm8 - vmovdqu YMMWORD[64+rdi],ymm1 - vmovdqu YMMWORD[96+rdi],ymm5 - vmovdqu YMMWORD[128+rdi],ymm12 - vmovdqu YMMWORD[160+rdi],ymm13 - je NEAR $L$done8x - - lea rsi,[192+rsi] - xor r10,r10 - vmovdqa YMMWORD[rsp],ymm10 - lea rdi,[192+rdi] - sub rdx,192 - vmovdqa YMMWORD[32+rsp],ymm15 - jmp NEAR $L$oop_tail8x - -ALIGN 32 -$L$256_or_more8x: - vpxor ymm6,ymm6,YMMWORD[rsi] - vpxor ymm8,ymm8,YMMWORD[32+rsi] - vpxor ymm1,ymm1,YMMWORD[64+rsi] - vpxor ymm5,ymm5,YMMWORD[96+rsi] - vpxor ymm12,ymm12,YMMWORD[128+rsi] - vpxor ymm13,ymm13,YMMWORD[160+rsi] - vpxor ymm10,ymm10,YMMWORD[192+rsi] - vpxor ymm15,ymm15,YMMWORD[224+rsi] - vmovdqu YMMWORD[rdi],ymm6 - vmovdqu YMMWORD[32+rdi],ymm8 - vmovdqu YMMWORD[64+rdi],ymm1 - vmovdqu YMMWORD[96+rdi],ymm5 - vmovdqu YMMWORD[128+rdi],ymm12 - vmovdqu YMMWORD[160+rdi],ymm13 - vmovdqu YMMWORD[192+rdi],ymm10 - vmovdqu YMMWORD[224+rdi],ymm15 - je NEAR $L$done8x - - lea rsi,[256+rsi] - xor r10,r10 - vmovdqa YMMWORD[rsp],ymm14 - lea rdi,[256+rdi] - sub rdx,256 - vmovdqa YMMWORD[32+rsp],ymm2 - jmp NEAR $L$oop_tail8x - -ALIGN 32 -$L$320_or_more8x: - vpxor ymm6,ymm6,YMMWORD[rsi] - vpxor ymm8,ymm8,YMMWORD[32+rsi] - vpxor ymm1,ymm1,YMMWORD[64+rsi] - vpxor ymm5,ymm5,YMMWORD[96+rsi] - vpxor ymm12,ymm12,YMMWORD[128+rsi] - vpxor ymm13,ymm13,YMMWORD[160+rsi] - vpxor ymm10,ymm10,YMMWORD[192+rsi] - vpxor ymm15,ymm15,YMMWORD[224+rsi] - vpxor ymm14,ymm14,YMMWORD[256+rsi] - vpxor ymm2,ymm2,YMMWORD[288+rsi] - vmovdqu YMMWORD[rdi],ymm6 - vmovdqu YMMWORD[32+rdi],ymm8 - vmovdqu YMMWORD[64+rdi],ymm1 - vmovdqu YMMWORD[96+rdi],ymm5 - vmovdqu YMMWORD[128+rdi],ymm12 - vmovdqu YMMWORD[160+rdi],ymm13 - vmovdqu YMMWORD[192+rdi],ymm10 - vmovdqu YMMWORD[224+rdi],ymm15 - vmovdqu YMMWORD[256+rdi],ymm14 - vmovdqu YMMWORD[288+rdi],ymm2 - je NEAR $L$done8x - - lea rsi,[320+rsi] - xor r10,r10 - vmovdqa YMMWORD[rsp],ymm3 - lea rdi,[320+rdi] - sub rdx,320 - vmovdqa YMMWORD[32+rsp],ymm7 - jmp NEAR $L$oop_tail8x - -ALIGN 32 -$L$384_or_more8x: - vpxor ymm6,ymm6,YMMWORD[rsi] - vpxor ymm8,ymm8,YMMWORD[32+rsi] - vpxor ymm1,ymm1,YMMWORD[64+rsi] - vpxor ymm5,ymm5,YMMWORD[96+rsi] - vpxor ymm12,ymm12,YMMWORD[128+rsi] - vpxor ymm13,ymm13,YMMWORD[160+rsi] - vpxor ymm10,ymm10,YMMWORD[192+rsi] - vpxor ymm15,ymm15,YMMWORD[224+rsi] - vpxor ymm14,ymm14,YMMWORD[256+rsi] - vpxor ymm2,ymm2,YMMWORD[288+rsi] - vpxor ymm3,ymm3,YMMWORD[320+rsi] - vpxor ymm7,ymm7,YMMWORD[352+rsi] - vmovdqu YMMWORD[rdi],ymm6 - vmovdqu YMMWORD[32+rdi],ymm8 - vmovdqu YMMWORD[64+rdi],ymm1 - vmovdqu YMMWORD[96+rdi],ymm5 - vmovdqu YMMWORD[128+rdi],ymm12 - vmovdqu YMMWORD[160+rdi],ymm13 - vmovdqu YMMWORD[192+rdi],ymm10 - vmovdqu YMMWORD[224+rdi],ymm15 - vmovdqu YMMWORD[256+rdi],ymm14 - vmovdqu YMMWORD[288+rdi],ymm2 - vmovdqu YMMWORD[320+rdi],ymm3 - vmovdqu YMMWORD[352+rdi],ymm7 - je NEAR $L$done8x - - lea rsi,[384+rsi] - xor r10,r10 - vmovdqa YMMWORD[rsp],ymm11 - lea rdi,[384+rdi] - sub rdx,384 - vmovdqa YMMWORD[32+rsp],ymm9 - jmp NEAR $L$oop_tail8x - -ALIGN 32 -$L$448_or_more8x: - vpxor ymm6,ymm6,YMMWORD[rsi] - vpxor ymm8,ymm8,YMMWORD[32+rsi] - vpxor ymm1,ymm1,YMMWORD[64+rsi] - vpxor ymm5,ymm5,YMMWORD[96+rsi] - vpxor ymm12,ymm12,YMMWORD[128+rsi] - vpxor ymm13,ymm13,YMMWORD[160+rsi] - vpxor ymm10,ymm10,YMMWORD[192+rsi] - vpxor ymm15,ymm15,YMMWORD[224+rsi] - vpxor ymm14,ymm14,YMMWORD[256+rsi] - vpxor ymm2,ymm2,YMMWORD[288+rsi] - vpxor ymm3,ymm3,YMMWORD[320+rsi] - vpxor ymm7,ymm7,YMMWORD[352+rsi] - vpxor ymm11,ymm11,YMMWORD[384+rsi] - vpxor ymm9,ymm9,YMMWORD[416+rsi] - vmovdqu YMMWORD[rdi],ymm6 - vmovdqu YMMWORD[32+rdi],ymm8 - vmovdqu YMMWORD[64+rdi],ymm1 - vmovdqu YMMWORD[96+rdi],ymm5 - vmovdqu YMMWORD[128+rdi],ymm12 - vmovdqu YMMWORD[160+rdi],ymm13 - vmovdqu YMMWORD[192+rdi],ymm10 - vmovdqu YMMWORD[224+rdi],ymm15 - vmovdqu YMMWORD[256+rdi],ymm14 - vmovdqu YMMWORD[288+rdi],ymm2 - vmovdqu YMMWORD[320+rdi],ymm3 - vmovdqu YMMWORD[352+rdi],ymm7 - vmovdqu YMMWORD[384+rdi],ymm11 - vmovdqu YMMWORD[416+rdi],ymm9 - je NEAR $L$done8x - - lea rsi,[448+rsi] - xor r10,r10 - vmovdqa YMMWORD[rsp],ymm0 - lea rdi,[448+rdi] - sub rdx,448 - vmovdqa YMMWORD[32+rsp],ymm4 - -$L$oop_tail8x: - movzx eax,BYTE[r10*1+rsi] - movzx ecx,BYTE[r10*1+rsp] - lea r10,[1+r10] - xor eax,ecx - mov BYTE[((-1))+r10*1+rdi],al - dec rdx - jnz NEAR $L$oop_tail8x - -$L$done8x: - vzeroall - movaps xmm6,XMMWORD[((-168))+r9] - movaps xmm7,XMMWORD[((-152))+r9] - movaps xmm8,XMMWORD[((-136))+r9] - movaps xmm9,XMMWORD[((-120))+r9] - movaps xmm10,XMMWORD[((-104))+r9] - movaps xmm11,XMMWORD[((-88))+r9] - movaps xmm12,XMMWORD[((-72))+r9] - movaps xmm13,XMMWORD[((-56))+r9] - movaps xmm14,XMMWORD[((-40))+r9] - movaps xmm15,XMMWORD[((-24))+r9] - lea rsp,[r9] - -$L$8x_epilogue: - mov rdi,QWORD[8+rsp] ;WIN64 epilogue - mov rsi,QWORD[16+rsp] - DB 0F3h,0C3h ;repret - -$L$SEH_end_ChaCha20_8x: -EXTERN __imp_RtlVirtualUnwind - -ALIGN 16 -se_handler: - push rsi - push rdi - push rbx - push rbp - push r12 - push r13 - push r14 - push r15 - pushfq - sub rsp,64 - - mov rax,QWORD[120+r8] - mov rbx,QWORD[248+r8] - - mov rsi,QWORD[8+r9] - mov r11,QWORD[56+r9] - - lea r10,[$L$ctr32_body] - cmp rbx,r10 - jb NEAR $L$common_seh_tail - - mov rax,QWORD[152+r8] - - lea r10,[$L$no_data] - cmp rbx,r10 - jae NEAR $L$common_seh_tail - - lea rax,[((64+24+48))+rax] - - mov rbx,QWORD[((-8))+rax] - mov rbp,QWORD[((-16))+rax] - mov r12,QWORD[((-24))+rax] - mov r13,QWORD[((-32))+rax] - mov r14,QWORD[((-40))+rax] - mov r15,QWORD[((-48))+rax] - mov QWORD[144+r8],rbx - mov QWORD[160+r8],rbp - mov QWORD[216+r8],r12 - mov QWORD[224+r8],r13 - mov QWORD[232+r8],r14 - mov QWORD[240+r8],r15 - -$L$common_seh_tail: - mov rdi,QWORD[8+rax] - mov rsi,QWORD[16+rax] - mov QWORD[152+r8],rax - mov QWORD[168+r8],rsi - mov QWORD[176+r8],rdi - - mov rdi,QWORD[40+r9] - mov rsi,r8 - mov ecx,154 - DD 0xa548f3fc - - mov rsi,r9 - xor rcx,rcx - mov rdx,QWORD[8+rsi] - mov r8,QWORD[rsi] - mov r9,QWORD[16+rsi] - mov r10,QWORD[40+rsi] - lea r11,[56+rsi] - lea r12,[24+rsi] - mov QWORD[32+rsp],r10 - mov QWORD[40+rsp],r11 - mov QWORD[48+rsp],r12 - mov QWORD[56+rsp],rcx - call QWORD[__imp_RtlVirtualUnwind] - - mov eax,1 - add rsp,64 - popfq - pop r15 - pop r14 - pop r13 - pop r12 - pop rbp - pop rbx - pop rdi - pop rsi - DB 0F3h,0C3h ;repret - - - -ALIGN 16 -ssse3_handler: - push rsi - push rdi - push rbx - push rbp - push r12 - push r13 - push r14 - push r15 - pushfq - sub rsp,64 - - mov rax,QWORD[120+r8] - mov rbx,QWORD[248+r8] - - mov rsi,QWORD[8+r9] - mov r11,QWORD[56+r9] - - mov r10d,DWORD[r11] - lea r10,[r10*1+rsi] - cmp rbx,r10 - jb NEAR $L$common_seh_tail - - mov rax,QWORD[192+r8] - - mov r10d,DWORD[4+r11] - lea r10,[r10*1+rsi] - cmp rbx,r10 - jae NEAR $L$common_seh_tail - - lea rsi,[((-40))+rax] - lea rdi,[512+r8] - mov ecx,4 - DD 0xa548f3fc - - jmp NEAR $L$common_seh_tail - - - -ALIGN 16 -full_handler: - push rsi - push rdi - push rbx - push rbp - push r12 - push r13 - push r14 - push r15 - pushfq - sub rsp,64 - - mov rax,QWORD[120+r8] - mov rbx,QWORD[248+r8] - - mov rsi,QWORD[8+r9] - mov r11,QWORD[56+r9] - - mov r10d,DWORD[r11] - lea r10,[r10*1+rsi] - cmp rbx,r10 - jb NEAR $L$common_seh_tail - - mov rax,QWORD[192+r8] - - mov r10d,DWORD[4+r11] - lea r10,[r10*1+rsi] - cmp rbx,r10 - jae NEAR $L$common_seh_tail - - lea rsi,[((-168))+rax] - lea rdi,[512+r8] - mov ecx,20 - DD 0xa548f3fc - - jmp NEAR $L$common_seh_tail - - -section .pdata rdata align=4 -ALIGN 4 - DD $L$SEH_begin_GFp_ChaCha20_ctr32 wrt ..imagebase - DD $L$SEH_end_GFp_ChaCha20_ctr32 wrt ..imagebase - DD $L$SEH_info_GFp_ChaCha20_ctr32 wrt ..imagebase - - DD $L$SEH_begin_ChaCha20_ssse3 wrt ..imagebase - DD $L$SEH_end_ChaCha20_ssse3 wrt ..imagebase - DD $L$SEH_info_ChaCha20_ssse3 wrt ..imagebase - - DD $L$SEH_begin_ChaCha20_4x wrt ..imagebase - DD $L$SEH_end_ChaCha20_4x wrt ..imagebase - DD $L$SEH_info_ChaCha20_4x wrt ..imagebase - DD $L$SEH_begin_ChaCha20_8x wrt ..imagebase - DD $L$SEH_end_ChaCha20_8x wrt ..imagebase - DD $L$SEH_info_ChaCha20_8x wrt ..imagebase -section .xdata rdata align=8 -ALIGN 8 -$L$SEH_info_GFp_ChaCha20_ctr32: -DB 9,0,0,0 - DD se_handler wrt ..imagebase - -$L$SEH_info_ChaCha20_ssse3: -DB 9,0,0,0 - DD ssse3_handler wrt ..imagebase - DD $L$ssse3_body wrt ..imagebase,$L$ssse3_epilogue wrt ..imagebase - -$L$SEH_info_ChaCha20_4x: -DB 9,0,0,0 - DD full_handler wrt ..imagebase - DD $L$4x_body wrt ..imagebase,$L$4x_epilogue wrt ..imagebase -$L$SEH_info_ChaCha20_8x: -DB 9,0,0,0 - DD full_handler wrt ..imagebase - DD $L$8x_body wrt ..imagebase,$L$8x_epilogue wrt ..imagebase diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/tmp/chacha-x86-win32n.asm temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/tmp/chacha-x86-win32n.asm --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/tmp/chacha-x86-win32n.asm 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/tmp/chacha-x86-win32n.asm 1970-01-01 00:00:00.000000000 +0000 @@ -1,973 +0,0 @@ -; This file is generated from a similarly-named Perl script in the BoringSSL -; source tree. Do not edit by hand. - -%ifdef BORINGSSL_PREFIX -%include "boringssl_prefix_symbols_nasm.inc" -%endif -%ifidn __OUTPUT_FORMAT__,obj -section code use32 class=code align=64 -%elifidn __OUTPUT_FORMAT__,win32 -$@feat.00 equ 1 -section .text code align=64 -%else -section .text code -%endif -global _GFp_ChaCha20_ctr32 -align 16 -_GFp_ChaCha20_ctr32: -L$_GFp_ChaCha20_ctr32_begin: - push ebp - push ebx - push esi - push edi - xor eax,eax - cmp eax,DWORD [28+esp] - je NEAR L$000no_data - call L$pic_point -L$pic_point: - pop eax - lea ebp,[_GFp_ia32cap_P] - test DWORD [ebp],16777216 - jz NEAR L$001x86 - test DWORD [4+ebp],512 - jz NEAR L$001x86 - jmp NEAR L$ssse3_shortcut -L$001x86: - mov esi,DWORD [32+esp] - mov edi,DWORD [36+esp] - sub esp,132 - mov eax,DWORD [esi] - mov ebx,DWORD [4+esi] - mov ecx,DWORD [8+esi] - mov edx,DWORD [12+esi] - mov DWORD [80+esp],eax - mov DWORD [84+esp],ebx - mov DWORD [88+esp],ecx - mov DWORD [92+esp],edx - mov eax,DWORD [16+esi] - mov ebx,DWORD [20+esi] - mov ecx,DWORD [24+esi] - mov edx,DWORD [28+esi] - mov DWORD [96+esp],eax - mov DWORD [100+esp],ebx - mov DWORD [104+esp],ecx - mov DWORD [108+esp],edx - mov eax,DWORD [edi] - mov ebx,DWORD [4+edi] - mov ecx,DWORD [8+edi] - mov edx,DWORD [12+edi] - sub eax,1 - mov DWORD [112+esp],eax - mov DWORD [116+esp],ebx - mov DWORD [120+esp],ecx - mov DWORD [124+esp],edx - jmp NEAR L$002entry -align 16 -L$003outer_loop: - mov DWORD [156+esp],ebx - mov DWORD [152+esp],eax - mov DWORD [160+esp],ecx -L$002entry: - mov eax,1634760805 - mov DWORD [4+esp],857760878 - mov DWORD [8+esp],2036477234 - mov DWORD [12+esp],1797285236 - mov ebx,DWORD [84+esp] - mov ebp,DWORD [88+esp] - mov ecx,DWORD [104+esp] - mov esi,DWORD [108+esp] - mov edx,DWORD [116+esp] - mov edi,DWORD [120+esp] - mov DWORD [20+esp],ebx - mov DWORD [24+esp],ebp - mov DWORD [40+esp],ecx - mov DWORD [44+esp],esi - mov DWORD [52+esp],edx - mov DWORD [56+esp],edi - mov ebx,DWORD [92+esp] - mov edi,DWORD [124+esp] - mov edx,DWORD [112+esp] - mov ebp,DWORD [80+esp] - mov ecx,DWORD [96+esp] - mov esi,DWORD [100+esp] - add edx,1 - mov DWORD [28+esp],ebx - mov DWORD [60+esp],edi - mov DWORD [112+esp],edx - mov ebx,10 - jmp NEAR L$004loop -align 16 -L$004loop: - add eax,ebp - mov DWORD [128+esp],ebx - mov ebx,ebp - xor edx,eax - rol edx,16 - add ecx,edx - xor ebx,ecx - mov edi,DWORD [52+esp] - rol ebx,12 - mov ebp,DWORD [20+esp] - add eax,ebx - xor edx,eax - mov DWORD [esp],eax - rol edx,8 - mov eax,DWORD [4+esp] - add ecx,edx - mov DWORD [48+esp],edx - xor ebx,ecx - add eax,ebp - rol ebx,7 - xor edi,eax - mov DWORD [32+esp],ecx - rol edi,16 - mov DWORD [16+esp],ebx - add esi,edi - mov ecx,DWORD [40+esp] - xor ebp,esi - mov edx,DWORD [56+esp] - rol ebp,12 - mov ebx,DWORD [24+esp] - add eax,ebp - xor edi,eax - mov DWORD [4+esp],eax - rol edi,8 - mov eax,DWORD [8+esp] - add esi,edi - mov DWORD [52+esp],edi - xor ebp,esi - add eax,ebx - rol ebp,7 - xor edx,eax - mov DWORD [36+esp],esi - rol edx,16 - mov DWORD [20+esp],ebp - add ecx,edx - mov esi,DWORD [44+esp] - xor ebx,ecx - mov edi,DWORD [60+esp] - rol ebx,12 - mov ebp,DWORD [28+esp] - add eax,ebx - xor edx,eax - mov DWORD [8+esp],eax - rol edx,8 - mov eax,DWORD [12+esp] - add ecx,edx - mov DWORD [56+esp],edx - xor ebx,ecx - add eax,ebp - rol ebx,7 - xor edi,eax - rol edi,16 - mov DWORD [24+esp],ebx - add esi,edi - xor ebp,esi - rol ebp,12 - mov ebx,DWORD [20+esp] - add eax,ebp - xor edi,eax - mov DWORD [12+esp],eax - rol edi,8 - mov eax,DWORD [esp] - add esi,edi - mov edx,edi - xor ebp,esi - add eax,ebx - rol ebp,7 - xor edx,eax - rol edx,16 - mov DWORD [28+esp],ebp - add ecx,edx - xor ebx,ecx - mov edi,DWORD [48+esp] - rol ebx,12 - mov ebp,DWORD [24+esp] - add eax,ebx - xor edx,eax - mov DWORD [esp],eax - rol edx,8 - mov eax,DWORD [4+esp] - add ecx,edx - mov DWORD [60+esp],edx - xor ebx,ecx - add eax,ebp - rol ebx,7 - xor edi,eax - mov DWORD [40+esp],ecx - rol edi,16 - mov DWORD [20+esp],ebx - add esi,edi - mov ecx,DWORD [32+esp] - xor ebp,esi - mov edx,DWORD [52+esp] - rol ebp,12 - mov ebx,DWORD [28+esp] - add eax,ebp - xor edi,eax - mov DWORD [4+esp],eax - rol edi,8 - mov eax,DWORD [8+esp] - add esi,edi - mov DWORD [48+esp],edi - xor ebp,esi - add eax,ebx - rol ebp,7 - xor edx,eax - mov DWORD [44+esp],esi - rol edx,16 - mov DWORD [24+esp],ebp - add ecx,edx - mov esi,DWORD [36+esp] - xor ebx,ecx - mov edi,DWORD [56+esp] - rol ebx,12 - mov ebp,DWORD [16+esp] - add eax,ebx - xor edx,eax - mov DWORD [8+esp],eax - rol edx,8 - mov eax,DWORD [12+esp] - add ecx,edx - mov DWORD [52+esp],edx - xor ebx,ecx - add eax,ebp - rol ebx,7 - xor edi,eax - rol edi,16 - mov DWORD [28+esp],ebx - add esi,edi - xor ebp,esi - mov edx,DWORD [48+esp] - rol ebp,12 - mov ebx,DWORD [128+esp] - add eax,ebp - xor edi,eax - mov DWORD [12+esp],eax - rol edi,8 - mov eax,DWORD [esp] - add esi,edi - mov DWORD [56+esp],edi - xor ebp,esi - rol ebp,7 - dec ebx - jnz NEAR L$004loop - mov ebx,DWORD [160+esp] - add eax,1634760805 - add ebp,DWORD [80+esp] - add ecx,DWORD [96+esp] - add esi,DWORD [100+esp] - cmp ebx,64 - jb NEAR L$005tail - mov ebx,DWORD [156+esp] - add edx,DWORD [112+esp] - add edi,DWORD [120+esp] - xor eax,DWORD [ebx] - xor ebp,DWORD [16+ebx] - mov DWORD [esp],eax - mov eax,DWORD [152+esp] - xor ecx,DWORD [32+ebx] - xor esi,DWORD [36+ebx] - xor edx,DWORD [48+ebx] - xor edi,DWORD [56+ebx] - mov DWORD [16+eax],ebp - mov DWORD [32+eax],ecx - mov DWORD [36+eax],esi - mov DWORD [48+eax],edx - mov DWORD [56+eax],edi - mov ebp,DWORD [4+esp] - mov ecx,DWORD [8+esp] - mov esi,DWORD [12+esp] - mov edx,DWORD [20+esp] - mov edi,DWORD [24+esp] - add ebp,857760878 - add ecx,2036477234 - add esi,1797285236 - add edx,DWORD [84+esp] - add edi,DWORD [88+esp] - xor ebp,DWORD [4+ebx] - xor ecx,DWORD [8+ebx] - xor esi,DWORD [12+ebx] - xor edx,DWORD [20+ebx] - xor edi,DWORD [24+ebx] - mov DWORD [4+eax],ebp - mov DWORD [8+eax],ecx - mov DWORD [12+eax],esi - mov DWORD [20+eax],edx - mov DWORD [24+eax],edi - mov ebp,DWORD [28+esp] - mov ecx,DWORD [40+esp] - mov esi,DWORD [44+esp] - mov edx,DWORD [52+esp] - mov edi,DWORD [60+esp] - add ebp,DWORD [92+esp] - add ecx,DWORD [104+esp] - add esi,DWORD [108+esp] - add edx,DWORD [116+esp] - add edi,DWORD [124+esp] - xor ebp,DWORD [28+ebx] - xor ecx,DWORD [40+ebx] - xor esi,DWORD [44+ebx] - xor edx,DWORD [52+ebx] - xor edi,DWORD [60+ebx] - lea ebx,[64+ebx] - mov DWORD [28+eax],ebp - mov ebp,DWORD [esp] - mov DWORD [40+eax],ecx - mov ecx,DWORD [160+esp] - mov DWORD [44+eax],esi - mov DWORD [52+eax],edx - mov DWORD [60+eax],edi - mov DWORD [eax],ebp - lea eax,[64+eax] - sub ecx,64 - jnz NEAR L$003outer_loop - jmp NEAR L$006done -L$005tail: - add edx,DWORD [112+esp] - add edi,DWORD [120+esp] - mov DWORD [esp],eax - mov DWORD [16+esp],ebp - mov DWORD [32+esp],ecx - mov DWORD [36+esp],esi - mov DWORD [48+esp],edx - mov DWORD [56+esp],edi - mov ebp,DWORD [4+esp] - mov ecx,DWORD [8+esp] - mov esi,DWORD [12+esp] - mov edx,DWORD [20+esp] - mov edi,DWORD [24+esp] - add ebp,857760878 - add ecx,2036477234 - add esi,1797285236 - add edx,DWORD [84+esp] - add edi,DWORD [88+esp] - mov DWORD [4+esp],ebp - mov DWORD [8+esp],ecx - mov DWORD [12+esp],esi - mov DWORD [20+esp],edx - mov DWORD [24+esp],edi - mov ebp,DWORD [28+esp] - mov ecx,DWORD [40+esp] - mov esi,DWORD [44+esp] - mov edx,DWORD [52+esp] - mov edi,DWORD [60+esp] - add ebp,DWORD [92+esp] - add ecx,DWORD [104+esp] - add esi,DWORD [108+esp] - add edx,DWORD [116+esp] - add edi,DWORD [124+esp] - mov DWORD [28+esp],ebp - mov ebp,DWORD [156+esp] - mov DWORD [40+esp],ecx - mov ecx,DWORD [152+esp] - mov DWORD [44+esp],esi - xor esi,esi - mov DWORD [52+esp],edx - mov DWORD [60+esp],edi - xor eax,eax - xor edx,edx -L$007tail_loop: - mov al,BYTE [ebp*1+esi] - mov dl,BYTE [esi*1+esp] - lea esi,[1+esi] - xor al,dl - mov BYTE [esi*1+ecx-1],al - dec ebx - jnz NEAR L$007tail_loop -L$006done: - add esp,132 -L$000no_data: - pop edi - pop esi - pop ebx - pop ebp - ret -align 16 -__ChaCha20_ssse3: - push ebp - push ebx - push esi - push edi -L$ssse3_shortcut: - mov edi,DWORD [20+esp] - mov esi,DWORD [24+esp] - mov ecx,DWORD [28+esp] - mov edx,DWORD [32+esp] - mov ebx,DWORD [36+esp] - mov ebp,esp - sub esp,524 - and esp,-64 - mov DWORD [512+esp],ebp - lea eax,[(L$ssse3_data-L$pic_point)+eax] - movdqu xmm3,[ebx] - cmp ecx,256 - jb NEAR L$0081x - mov DWORD [516+esp],edx - mov DWORD [520+esp],ebx - sub ecx,256 - lea ebp,[384+esp] - movdqu xmm7,[edx] - pshufd xmm0,xmm3,0 - pshufd xmm1,xmm3,85 - pshufd xmm2,xmm3,170 - pshufd xmm3,xmm3,255 - paddd xmm0,[48+eax] - pshufd xmm4,xmm7,0 - pshufd xmm5,xmm7,85 - psubd xmm0,[64+eax] - pshufd xmm6,xmm7,170 - pshufd xmm7,xmm7,255 - movdqa [64+ebp],xmm0 - movdqa [80+ebp],xmm1 - movdqa [96+ebp],xmm2 - movdqa [112+ebp],xmm3 - movdqu xmm3,[16+edx] - movdqa [ebp-64],xmm4 - movdqa [ebp-48],xmm5 - movdqa [ebp-32],xmm6 - movdqa [ebp-16],xmm7 - movdqa xmm7,[32+eax] - lea ebx,[128+esp] - pshufd xmm0,xmm3,0 - pshufd xmm1,xmm3,85 - pshufd xmm2,xmm3,170 - pshufd xmm3,xmm3,255 - pshufd xmm4,xmm7,0 - pshufd xmm5,xmm7,85 - pshufd xmm6,xmm7,170 - pshufd xmm7,xmm7,255 - movdqa [ebp],xmm0 - movdqa [16+ebp],xmm1 - movdqa [32+ebp],xmm2 - movdqa [48+ebp],xmm3 - movdqa [ebp-128],xmm4 - movdqa [ebp-112],xmm5 - movdqa [ebp-96],xmm6 - movdqa [ebp-80],xmm7 - lea esi,[128+esi] - lea edi,[128+edi] - jmp NEAR L$009outer_loop -align 16 -L$009outer_loop: - movdqa xmm1,[ebp-112] - movdqa xmm2,[ebp-96] - movdqa xmm3,[ebp-80] - movdqa xmm5,[ebp-48] - movdqa xmm6,[ebp-32] - movdqa xmm7,[ebp-16] - movdqa [ebx-112],xmm1 - movdqa [ebx-96],xmm2 - movdqa [ebx-80],xmm3 - movdqa [ebx-48],xmm5 - movdqa [ebx-32],xmm6 - movdqa [ebx-16],xmm7 - movdqa xmm2,[32+ebp] - movdqa xmm3,[48+ebp] - movdqa xmm4,[64+ebp] - movdqa xmm5,[80+ebp] - movdqa xmm6,[96+ebp] - movdqa xmm7,[112+ebp] - paddd xmm4,[64+eax] - movdqa [32+ebx],xmm2 - movdqa [48+ebx],xmm3 - movdqa [64+ebx],xmm4 - movdqa [80+ebx],xmm5 - movdqa [96+ebx],xmm6 - movdqa [112+ebx],xmm7 - movdqa [64+ebp],xmm4 - movdqa xmm0,[ebp-128] - movdqa xmm6,xmm4 - movdqa xmm3,[ebp-64] - movdqa xmm4,[ebp] - movdqa xmm5,[16+ebp] - mov edx,10 - nop -align 16 -L$010loop: - paddd xmm0,xmm3 - movdqa xmm2,xmm3 - pxor xmm6,xmm0 - pshufb xmm6,[eax] - paddd xmm4,xmm6 - pxor xmm2,xmm4 - movdqa xmm3,[ebx-48] - movdqa xmm1,xmm2 - pslld xmm2,12 - psrld xmm1,20 - por xmm2,xmm1 - movdqa xmm1,[ebx-112] - paddd xmm0,xmm2 - movdqa xmm7,[80+ebx] - pxor xmm6,xmm0 - movdqa [ebx-128],xmm0 - pshufb xmm6,[16+eax] - paddd xmm4,xmm6 - movdqa [64+ebx],xmm6 - pxor xmm2,xmm4 - paddd xmm1,xmm3 - movdqa xmm0,xmm2 - pslld xmm2,7 - psrld xmm0,25 - pxor xmm7,xmm1 - por xmm2,xmm0 - movdqa [ebx],xmm4 - pshufb xmm7,[eax] - movdqa [ebx-64],xmm2 - paddd xmm5,xmm7 - movdqa xmm4,[32+ebx] - pxor xmm3,xmm5 - movdqa xmm2,[ebx-32] - movdqa xmm0,xmm3 - pslld xmm3,12 - psrld xmm0,20 - por xmm3,xmm0 - movdqa xmm0,[ebx-96] - paddd xmm1,xmm3 - movdqa xmm6,[96+ebx] - pxor xmm7,xmm1 - movdqa [ebx-112],xmm1 - pshufb xmm7,[16+eax] - paddd xmm5,xmm7 - movdqa [80+ebx],xmm7 - pxor xmm3,xmm5 - paddd xmm0,xmm2 - movdqa xmm1,xmm3 - pslld xmm3,7 - psrld xmm1,25 - pxor xmm6,xmm0 - por xmm3,xmm1 - movdqa [16+ebx],xmm5 - pshufb xmm6,[eax] - movdqa [ebx-48],xmm3 - paddd xmm4,xmm6 - movdqa xmm5,[48+ebx] - pxor xmm2,xmm4 - movdqa xmm3,[ebx-16] - movdqa xmm1,xmm2 - pslld xmm2,12 - psrld xmm1,20 - por xmm2,xmm1 - movdqa xmm1,[ebx-80] - paddd xmm0,xmm2 - movdqa xmm7,[112+ebx] - pxor xmm6,xmm0 - movdqa [ebx-96],xmm0 - pshufb xmm6,[16+eax] - paddd xmm4,xmm6 - movdqa [96+ebx],xmm6 - pxor xmm2,xmm4 - paddd xmm1,xmm3 - movdqa xmm0,xmm2 - pslld xmm2,7 - psrld xmm0,25 - pxor xmm7,xmm1 - por xmm2,xmm0 - pshufb xmm7,[eax] - movdqa [ebx-32],xmm2 - paddd xmm5,xmm7 - pxor xmm3,xmm5 - movdqa xmm2,[ebx-48] - movdqa xmm0,xmm3 - pslld xmm3,12 - psrld xmm0,20 - por xmm3,xmm0 - movdqa xmm0,[ebx-128] - paddd xmm1,xmm3 - pxor xmm7,xmm1 - movdqa [ebx-80],xmm1 - pshufb xmm7,[16+eax] - paddd xmm5,xmm7 - movdqa xmm6,xmm7 - pxor xmm3,xmm5 - paddd xmm0,xmm2 - movdqa xmm1,xmm3 - pslld xmm3,7 - psrld xmm1,25 - pxor xmm6,xmm0 - por xmm3,xmm1 - pshufb xmm6,[eax] - movdqa [ebx-16],xmm3 - paddd xmm4,xmm6 - pxor xmm2,xmm4 - movdqa xmm3,[ebx-32] - movdqa xmm1,xmm2 - pslld xmm2,12 - psrld xmm1,20 - por xmm2,xmm1 - movdqa xmm1,[ebx-112] - paddd xmm0,xmm2 - movdqa xmm7,[64+ebx] - pxor xmm6,xmm0 - movdqa [ebx-128],xmm0 - pshufb xmm6,[16+eax] - paddd xmm4,xmm6 - movdqa [112+ebx],xmm6 - pxor xmm2,xmm4 - paddd xmm1,xmm3 - movdqa xmm0,xmm2 - pslld xmm2,7 - psrld xmm0,25 - pxor xmm7,xmm1 - por xmm2,xmm0 - movdqa [32+ebx],xmm4 - pshufb xmm7,[eax] - movdqa [ebx-48],xmm2 - paddd xmm5,xmm7 - movdqa xmm4,[ebx] - pxor xmm3,xmm5 - movdqa xmm2,[ebx-16] - movdqa xmm0,xmm3 - pslld xmm3,12 - psrld xmm0,20 - por xmm3,xmm0 - movdqa xmm0,[ebx-96] - paddd xmm1,xmm3 - movdqa xmm6,[80+ebx] - pxor xmm7,xmm1 - movdqa [ebx-112],xmm1 - pshufb xmm7,[16+eax] - paddd xmm5,xmm7 - movdqa [64+ebx],xmm7 - pxor xmm3,xmm5 - paddd xmm0,xmm2 - movdqa xmm1,xmm3 - pslld xmm3,7 - psrld xmm1,25 - pxor xmm6,xmm0 - por xmm3,xmm1 - movdqa [48+ebx],xmm5 - pshufb xmm6,[eax] - movdqa [ebx-32],xmm3 - paddd xmm4,xmm6 - movdqa xmm5,[16+ebx] - pxor xmm2,xmm4 - movdqa xmm3,[ebx-64] - movdqa xmm1,xmm2 - pslld xmm2,12 - psrld xmm1,20 - por xmm2,xmm1 - movdqa xmm1,[ebx-80] - paddd xmm0,xmm2 - movdqa xmm7,[96+ebx] - pxor xmm6,xmm0 - movdqa [ebx-96],xmm0 - pshufb xmm6,[16+eax] - paddd xmm4,xmm6 - movdqa [80+ebx],xmm6 - pxor xmm2,xmm4 - paddd xmm1,xmm3 - movdqa xmm0,xmm2 - pslld xmm2,7 - psrld xmm0,25 - pxor xmm7,xmm1 - por xmm2,xmm0 - pshufb xmm7,[eax] - movdqa [ebx-16],xmm2 - paddd xmm5,xmm7 - pxor xmm3,xmm5 - movdqa xmm0,xmm3 - pslld xmm3,12 - psrld xmm0,20 - por xmm3,xmm0 - movdqa xmm0,[ebx-128] - paddd xmm1,xmm3 - movdqa xmm6,[64+ebx] - pxor xmm7,xmm1 - movdqa [ebx-80],xmm1 - pshufb xmm7,[16+eax] - paddd xmm5,xmm7 - movdqa [96+ebx],xmm7 - pxor xmm3,xmm5 - movdqa xmm1,xmm3 - pslld xmm3,7 - psrld xmm1,25 - por xmm3,xmm1 - dec edx - jnz NEAR L$010loop - movdqa [ebx-64],xmm3 - movdqa [ebx],xmm4 - movdqa [16+ebx],xmm5 - movdqa [64+ebx],xmm6 - movdqa [96+ebx],xmm7 - movdqa xmm1,[ebx-112] - movdqa xmm2,[ebx-96] - movdqa xmm3,[ebx-80] - paddd xmm0,[ebp-128] - paddd xmm1,[ebp-112] - paddd xmm2,[ebp-96] - paddd xmm3,[ebp-80] - movdqa xmm6,xmm0 - punpckldq xmm0,xmm1 - movdqa xmm7,xmm2 - punpckldq xmm2,xmm3 - punpckhdq xmm6,xmm1 - punpckhdq xmm7,xmm3 - movdqa xmm1,xmm0 - punpcklqdq xmm0,xmm2 - movdqa xmm3,xmm6 - punpcklqdq xmm6,xmm7 - punpckhqdq xmm1,xmm2 - punpckhqdq xmm3,xmm7 - movdqu xmm4,[esi-128] - movdqu xmm5,[esi-64] - movdqu xmm2,[esi] - movdqu xmm7,[64+esi] - lea esi,[16+esi] - pxor xmm4,xmm0 - movdqa xmm0,[ebx-64] - pxor xmm5,xmm1 - movdqa xmm1,[ebx-48] - pxor xmm6,xmm2 - movdqa xmm2,[ebx-32] - pxor xmm7,xmm3 - movdqa xmm3,[ebx-16] - movdqu [edi-128],xmm4 - movdqu [edi-64],xmm5 - movdqu [edi],xmm6 - movdqu [64+edi],xmm7 - lea edi,[16+edi] - paddd xmm0,[ebp-64] - paddd xmm1,[ebp-48] - paddd xmm2,[ebp-32] - paddd xmm3,[ebp-16] - movdqa xmm6,xmm0 - punpckldq xmm0,xmm1 - movdqa xmm7,xmm2 - punpckldq xmm2,xmm3 - punpckhdq xmm6,xmm1 - punpckhdq xmm7,xmm3 - movdqa xmm1,xmm0 - punpcklqdq xmm0,xmm2 - movdqa xmm3,xmm6 - punpcklqdq xmm6,xmm7 - punpckhqdq xmm1,xmm2 - punpckhqdq xmm3,xmm7 - movdqu xmm4,[esi-128] - movdqu xmm5,[esi-64] - movdqu xmm2,[esi] - movdqu xmm7,[64+esi] - lea esi,[16+esi] - pxor xmm4,xmm0 - movdqa xmm0,[ebx] - pxor xmm5,xmm1 - movdqa xmm1,[16+ebx] - pxor xmm6,xmm2 - movdqa xmm2,[32+ebx] - pxor xmm7,xmm3 - movdqa xmm3,[48+ebx] - movdqu [edi-128],xmm4 - movdqu [edi-64],xmm5 - movdqu [edi],xmm6 - movdqu [64+edi],xmm7 - lea edi,[16+edi] - paddd xmm0,[ebp] - paddd xmm1,[16+ebp] - paddd xmm2,[32+ebp] - paddd xmm3,[48+ebp] - movdqa xmm6,xmm0 - punpckldq xmm0,xmm1 - movdqa xmm7,xmm2 - punpckldq xmm2,xmm3 - punpckhdq xmm6,xmm1 - punpckhdq xmm7,xmm3 - movdqa xmm1,xmm0 - punpcklqdq xmm0,xmm2 - movdqa xmm3,xmm6 - punpcklqdq xmm6,xmm7 - punpckhqdq xmm1,xmm2 - punpckhqdq xmm3,xmm7 - movdqu xmm4,[esi-128] - movdqu xmm5,[esi-64] - movdqu xmm2,[esi] - movdqu xmm7,[64+esi] - lea esi,[16+esi] - pxor xmm4,xmm0 - movdqa xmm0,[64+ebx] - pxor xmm5,xmm1 - movdqa xmm1,[80+ebx] - pxor xmm6,xmm2 - movdqa xmm2,[96+ebx] - pxor xmm7,xmm3 - movdqa xmm3,[112+ebx] - movdqu [edi-128],xmm4 - movdqu [edi-64],xmm5 - movdqu [edi],xmm6 - movdqu [64+edi],xmm7 - lea edi,[16+edi] - paddd xmm0,[64+ebp] - paddd xmm1,[80+ebp] - paddd xmm2,[96+ebp] - paddd xmm3,[112+ebp] - movdqa xmm6,xmm0 - punpckldq xmm0,xmm1 - movdqa xmm7,xmm2 - punpckldq xmm2,xmm3 - punpckhdq xmm6,xmm1 - punpckhdq xmm7,xmm3 - movdqa xmm1,xmm0 - punpcklqdq xmm0,xmm2 - movdqa xmm3,xmm6 - punpcklqdq xmm6,xmm7 - punpckhqdq xmm1,xmm2 - punpckhqdq xmm3,xmm7 - movdqu xmm4,[esi-128] - movdqu xmm5,[esi-64] - movdqu xmm2,[esi] - movdqu xmm7,[64+esi] - lea esi,[208+esi] - pxor xmm4,xmm0 - pxor xmm5,xmm1 - pxor xmm6,xmm2 - pxor xmm7,xmm3 - movdqu [edi-128],xmm4 - movdqu [edi-64],xmm5 - movdqu [edi],xmm6 - movdqu [64+edi],xmm7 - lea edi,[208+edi] - sub ecx,256 - jnc NEAR L$009outer_loop - add ecx,256 - jz NEAR L$011done - mov ebx,DWORD [520+esp] - lea esi,[esi-128] - mov edx,DWORD [516+esp] - lea edi,[edi-128] - movd xmm2,DWORD [64+ebp] - movdqu xmm3,[ebx] - paddd xmm2,[96+eax] - pand xmm3,[112+eax] - por xmm3,xmm2 -L$0081x: - movdqa xmm0,[32+eax] - movdqu xmm1,[edx] - movdqu xmm2,[16+edx] - movdqa xmm6,[eax] - movdqa xmm7,[16+eax] - mov DWORD [48+esp],ebp - movdqa [esp],xmm0 - movdqa [16+esp],xmm1 - movdqa [32+esp],xmm2 - movdqa [48+esp],xmm3 - mov edx,10 - jmp NEAR L$012loop1x -align 16 -L$013outer1x: - movdqa xmm3,[80+eax] - movdqa xmm0,[esp] - movdqa xmm1,[16+esp] - movdqa xmm2,[32+esp] - paddd xmm3,[48+esp] - mov edx,10 - movdqa [48+esp],xmm3 - jmp NEAR L$012loop1x -align 16 -L$012loop1x: - paddd xmm0,xmm1 - pxor xmm3,xmm0 -db 102,15,56,0,222 - paddd xmm2,xmm3 - pxor xmm1,xmm2 - movdqa xmm4,xmm1 - psrld xmm1,20 - pslld xmm4,12 - por xmm1,xmm4 - paddd xmm0,xmm1 - pxor xmm3,xmm0 -db 102,15,56,0,223 - paddd xmm2,xmm3 - pxor xmm1,xmm2 - movdqa xmm4,xmm1 - psrld xmm1,25 - pslld xmm4,7 - por xmm1,xmm4 - pshufd xmm2,xmm2,78 - pshufd xmm1,xmm1,57 - pshufd xmm3,xmm3,147 - nop - paddd xmm0,xmm1 - pxor xmm3,xmm0 -db 102,15,56,0,222 - paddd xmm2,xmm3 - pxor xmm1,xmm2 - movdqa xmm4,xmm1 - psrld xmm1,20 - pslld xmm4,12 - por xmm1,xmm4 - paddd xmm0,xmm1 - pxor xmm3,xmm0 -db 102,15,56,0,223 - paddd xmm2,xmm3 - pxor xmm1,xmm2 - movdqa xmm4,xmm1 - psrld xmm1,25 - pslld xmm4,7 - por xmm1,xmm4 - pshufd xmm2,xmm2,78 - pshufd xmm1,xmm1,147 - pshufd xmm3,xmm3,57 - dec edx - jnz NEAR L$012loop1x - paddd xmm0,[esp] - paddd xmm1,[16+esp] - paddd xmm2,[32+esp] - paddd xmm3,[48+esp] - cmp ecx,64 - jb NEAR L$014tail - movdqu xmm4,[esi] - movdqu xmm5,[16+esi] - pxor xmm0,xmm4 - movdqu xmm4,[32+esi] - pxor xmm1,xmm5 - movdqu xmm5,[48+esi] - pxor xmm2,xmm4 - pxor xmm3,xmm5 - lea esi,[64+esi] - movdqu [edi],xmm0 - movdqu [16+edi],xmm1 - movdqu [32+edi],xmm2 - movdqu [48+edi],xmm3 - lea edi,[64+edi] - sub ecx,64 - jnz NEAR L$013outer1x - jmp NEAR L$011done -L$014tail: - movdqa [esp],xmm0 - movdqa [16+esp],xmm1 - movdqa [32+esp],xmm2 - movdqa [48+esp],xmm3 - xor eax,eax - xor edx,edx - xor ebp,ebp -L$015tail_loop: - mov al,BYTE [ebp*1+esp] - mov dl,BYTE [ebp*1+esi] - lea ebp,[1+ebp] - xor al,dl - mov BYTE [ebp*1+edi-1],al - dec ecx - jnz NEAR L$015tail_loop -L$011done: - mov esp,DWORD [512+esp] - pop edi - pop esi - pop ebx - pop ebp - ret -align 64 -L$ssse3_data: -db 2,3,0,1,6,7,4,5,10,11,8,9,14,15,12,13 -db 3,0,1,2,7,4,5,6,11,8,9,10,15,12,13,14 -dd 1634760805,857760878,2036477234,1797285236 -dd 0,1,2,3 -dd 4,4,4,4 -dd 1,0,0,0 -dd 4,0,0,0 -dd 0,-1,-1,-1 -align 64 -db 67,104,97,67,104,97,50,48,32,102,111,114,32,120,56,54 -db 44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32 -db 60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111 -db 114,103,62,0 -segment .bss -common _GFp_ia32cap_P 16 diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/tmp/ecp_nistz256-x86-win32n.asm temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/tmp/ecp_nistz256-x86-win32n.asm --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/tmp/ecp_nistz256-x86-win32n.asm 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/tmp/ecp_nistz256-x86-win32n.asm 1970-01-01 00:00:00.000000000 +0000 @@ -1,1105 +0,0 @@ -; This file is generated from a similarly-named Perl script in the BoringSSL -; source tree. Do not edit by hand. - -%ifdef BORINGSSL_PREFIX -%include "boringssl_prefix_symbols_nasm.inc" -%endif -%ifidn __OUTPUT_FORMAT__,obj -section code use32 class=code align=64 -%elifidn __OUTPUT_FORMAT__,win32 -$@feat.00 equ 1 -section .text code align=64 -%else -section .text code -%endif -;extern _GFp_ia32cap_P -L$ONE_mont: -dd 1,0,0,-1,-1,-1,-2,0 -align 16 -__ecp_nistz256_div_by_2: - mov ebp,DWORD [esi] - xor edx,edx - mov ebx,DWORD [4+esi] - mov eax,ebp - and ebp,1 - mov ecx,DWORD [8+esi] - sub edx,ebp - add eax,edx - adc ebx,edx - mov DWORD [edi],eax - adc ecx,edx - mov DWORD [4+edi],ebx - mov DWORD [8+edi],ecx - mov eax,DWORD [12+esi] - mov ebx,DWORD [16+esi] - adc eax,0 - mov ecx,DWORD [20+esi] - adc ebx,0 - mov DWORD [12+edi],eax - adc ecx,0 - mov DWORD [16+edi],ebx - mov DWORD [20+edi],ecx - mov eax,DWORD [24+esi] - mov ebx,DWORD [28+esi] - adc eax,ebp - adc ebx,edx - mov DWORD [24+edi],eax - sbb esi,esi - mov DWORD [28+edi],ebx - mov eax,DWORD [edi] - mov ebx,DWORD [4+edi] - mov ecx,DWORD [8+edi] - mov edx,DWORD [12+edi] - shr eax,1 - mov ebp,ebx - shl ebx,31 - or eax,ebx - shr ebp,1 - mov ebx,ecx - shl ecx,31 - mov DWORD [edi],eax - or ebp,ecx - mov eax,DWORD [16+edi] - shr ebx,1 - mov ecx,edx - shl edx,31 - mov DWORD [4+edi],ebp - or ebx,edx - mov ebp,DWORD [20+edi] - shr ecx,1 - mov edx,eax - shl eax,31 - mov DWORD [8+edi],ebx - or ecx,eax - mov ebx,DWORD [24+edi] - shr edx,1 - mov eax,ebp - shl ebp,31 - mov DWORD [12+edi],ecx - or edx,ebp - mov ecx,DWORD [28+edi] - shr eax,1 - mov ebp,ebx - shl ebx,31 - mov DWORD [16+edi],edx - or eax,ebx - shr ebp,1 - mov ebx,ecx - shl ecx,31 - mov DWORD [20+edi],eax - or ebp,ecx - shr ebx,1 - shl esi,31 - mov DWORD [24+edi],ebp - or ebx,esi - mov DWORD [28+edi],ebx - ret -global _GFp_nistz256_add -align 16 -_GFp_nistz256_add: -L$_GFp_nistz256_add_begin: - push ebp - push ebx - push esi - push edi - mov esi,DWORD [24+esp] - mov ebp,DWORD [28+esp] - mov edi,DWORD [20+esp] - call __ecp_nistz256_add - pop edi - pop esi - pop ebx - pop ebp - ret -align 16 -__ecp_nistz256_add: - mov eax,DWORD [esi] - mov ebx,DWORD [4+esi] - mov ecx,DWORD [8+esi] - add eax,DWORD [ebp] - mov edx,DWORD [12+esi] - adc ebx,DWORD [4+ebp] - mov DWORD [edi],eax - adc ecx,DWORD [8+ebp] - mov DWORD [4+edi],ebx - adc edx,DWORD [12+ebp] - mov DWORD [8+edi],ecx - mov DWORD [12+edi],edx - mov eax,DWORD [16+esi] - mov ebx,DWORD [20+esi] - mov ecx,DWORD [24+esi] - adc eax,DWORD [16+ebp] - mov edx,DWORD [28+esi] - adc ebx,DWORD [20+ebp] - mov DWORD [16+edi],eax - adc ecx,DWORD [24+ebp] - mov DWORD [20+edi],ebx - mov esi,0 - adc edx,DWORD [28+ebp] - mov DWORD [24+edi],ecx - adc esi,0 - mov DWORD [28+edi],edx - mov eax,DWORD [edi] - mov ebx,DWORD [4+edi] - mov ecx,DWORD [8+edi] - sub eax,-1 - mov edx,DWORD [12+edi] - sbb ebx,-1 - mov eax,DWORD [16+edi] - sbb ecx,-1 - mov ebx,DWORD [20+edi] - sbb edx,0 - mov ecx,DWORD [24+edi] - sbb eax,0 - mov edx,DWORD [28+edi] - sbb ebx,0 - sbb ecx,1 - sbb edx,-1 - sbb esi,0 - not esi - mov eax,DWORD [edi] - mov ebp,esi - mov ebx,DWORD [4+edi] - shr ebp,31 - mov ecx,DWORD [8+edi] - sub eax,esi - mov edx,DWORD [12+edi] - sbb ebx,esi - mov DWORD [edi],eax - sbb ecx,esi - mov DWORD [4+edi],ebx - sbb edx,0 - mov DWORD [8+edi],ecx - mov DWORD [12+edi],edx - mov eax,DWORD [16+edi] - mov ebx,DWORD [20+edi] - mov ecx,DWORD [24+edi] - sbb eax,0 - mov edx,DWORD [28+edi] - sbb ebx,0 - mov DWORD [16+edi],eax - sbb ecx,ebp - mov DWORD [20+edi],ebx - sbb edx,esi - mov DWORD [24+edi],ecx - mov DWORD [28+edi],edx - ret -align 16 -__ecp_nistz256_sub: - mov eax,DWORD [esi] - mov ebx,DWORD [4+esi] - mov ecx,DWORD [8+esi] - sub eax,DWORD [ebp] - mov edx,DWORD [12+esi] - sbb ebx,DWORD [4+ebp] - mov DWORD [edi],eax - sbb ecx,DWORD [8+ebp] - mov DWORD [4+edi],ebx - sbb edx,DWORD [12+ebp] - mov DWORD [8+edi],ecx - mov DWORD [12+edi],edx - mov eax,DWORD [16+esi] - mov ebx,DWORD [20+esi] - mov ecx,DWORD [24+esi] - sbb eax,DWORD [16+ebp] - mov edx,DWORD [28+esi] - sbb ebx,DWORD [20+ebp] - sbb ecx,DWORD [24+ebp] - mov DWORD [16+edi],eax - sbb edx,DWORD [28+ebp] - mov DWORD [20+edi],ebx - sbb esi,esi - mov DWORD [24+edi],ecx - mov DWORD [28+edi],edx - mov eax,DWORD [edi] - mov ebp,esi - mov ebx,DWORD [4+edi] - shr ebp,31 - mov ecx,DWORD [8+edi] - add eax,esi - mov edx,DWORD [12+edi] - adc ebx,esi - mov DWORD [edi],eax - adc ecx,esi - mov DWORD [4+edi],ebx - adc edx,0 - mov DWORD [8+edi],ecx - mov DWORD [12+edi],edx - mov eax,DWORD [16+edi] - mov ebx,DWORD [20+edi] - mov ecx,DWORD [24+edi] - adc eax,0 - mov edx,DWORD [28+edi] - adc ebx,0 - mov DWORD [16+edi],eax - adc ecx,ebp - mov DWORD [20+edi],ebx - adc edx,esi - mov DWORD [24+edi],ecx - mov DWORD [28+edi],edx - ret -global _GFp_nistz256_neg -align 16 -_GFp_nistz256_neg: -L$_GFp_nistz256_neg_begin: - push ebp - push ebx - push esi - push edi - mov ebp,DWORD [24+esp] - mov edi,DWORD [20+esp] - xor eax,eax - sub esp,32 - mov DWORD [esp],eax - mov esi,esp - mov DWORD [4+esp],eax - mov DWORD [8+esp],eax - mov DWORD [12+esp],eax - mov DWORD [16+esp],eax - mov DWORD [20+esp],eax - mov DWORD [24+esp],eax - mov DWORD [28+esp],eax - call __ecp_nistz256_sub - add esp,32 - pop edi - pop esi - pop ebx - pop ebp - ret -align 16 -__picup_eax: - mov eax,DWORD [esp] - ret -global _GFp_nistz256_mul_mont -align 16 -_GFp_nistz256_mul_mont: -L$_GFp_nistz256_mul_mont_begin: - push ebp - push ebx - push esi - push edi - mov esi,DWORD [24+esp] - mov ebp,DWORD [28+esp] - call __picup_eax -L$000pic: - lea eax,[_GFp_ia32cap_P] - mov eax,DWORD [eax] - mov edi,DWORD [20+esp] - call __ecp_nistz256_mul_mont - pop edi - pop esi - pop ebx - pop ebp - ret -align 16 -__ecp_nistz256_mul_mont: - mov edx,esp - sub esp,256 - movd xmm7,DWORD [ebp] - lea ebp,[4+ebp] - pcmpeqd xmm6,xmm6 - psrlq xmm6,48 - pshuflw xmm7,xmm7,220 - and esp,-64 - pshufd xmm7,xmm7,220 - lea ebx,[128+esp] - movd xmm0,DWORD [esi] - pshufd xmm0,xmm0,204 - movd xmm1,DWORD [4+esi] - movdqa [ebx],xmm0 - pmuludq xmm0,xmm7 - movd xmm2,DWORD [8+esi] - pshufd xmm1,xmm1,204 - movdqa [16+ebx],xmm1 - pmuludq xmm1,xmm7 - movq xmm4,xmm0 - pslldq xmm4,6 - paddq xmm4,xmm0 - movdqa xmm5,xmm4 - psrldq xmm4,10 - pand xmm5,xmm6 - movd xmm3,DWORD [12+esi] - pshufd xmm2,xmm2,204 - movdqa [32+ebx],xmm2 - pmuludq xmm2,xmm7 - paddq xmm1,xmm4 - movdqa [esp],xmm1 - movd xmm0,DWORD [16+esi] - pshufd xmm3,xmm3,204 - movdqa [48+ebx],xmm3 - pmuludq xmm3,xmm7 - movdqa [16+esp],xmm2 - movd xmm1,DWORD [20+esi] - pshufd xmm0,xmm0,204 - movdqa [64+ebx],xmm0 - pmuludq xmm0,xmm7 - paddq xmm3,xmm5 - movdqa [32+esp],xmm3 - movd xmm2,DWORD [24+esi] - pshufd xmm1,xmm1,204 - movdqa [80+ebx],xmm1 - pmuludq xmm1,xmm7 - movdqa [48+esp],xmm0 - pshufd xmm4,xmm5,177 - movd xmm3,DWORD [28+esi] - pshufd xmm2,xmm2,204 - movdqa [96+ebx],xmm2 - pmuludq xmm2,xmm7 - movdqa [64+esp],xmm1 - psubq xmm4,xmm5 - movd xmm0,DWORD [ebp] - pshufd xmm3,xmm3,204 - movdqa [112+ebx],xmm3 - pmuludq xmm3,xmm7 - pshuflw xmm7,xmm0,220 - movdqa xmm0,[ebx] - pshufd xmm7,xmm7,220 - mov ecx,6 - lea ebp,[4+ebp] - jmp NEAR L$001madd_sse2 -align 16 -L$001madd_sse2: - paddq xmm2,xmm5 - paddq xmm3,xmm4 - movdqa xmm1,[16+ebx] - pmuludq xmm0,xmm7 - movdqa [80+esp],xmm2 - movdqa xmm2,[32+ebx] - pmuludq xmm1,xmm7 - movdqa [96+esp],xmm3 - paddq xmm0,[esp] - movdqa xmm3,[48+ebx] - pmuludq xmm2,xmm7 - movq xmm4,xmm0 - pslldq xmm4,6 - paddq xmm1,[16+esp] - paddq xmm4,xmm0 - movdqa xmm5,xmm4 - psrldq xmm4,10 - movdqa xmm0,[64+ebx] - pmuludq xmm3,xmm7 - paddq xmm1,xmm4 - paddq xmm2,[32+esp] - movdqa [esp],xmm1 - movdqa xmm1,[80+ebx] - pmuludq xmm0,xmm7 - paddq xmm3,[48+esp] - movdqa [16+esp],xmm2 - pand xmm5,xmm6 - movdqa xmm2,[96+ebx] - pmuludq xmm1,xmm7 - paddq xmm3,xmm5 - paddq xmm0,[64+esp] - movdqa [32+esp],xmm3 - pshufd xmm4,xmm5,177 - movdqa xmm3,xmm7 - pmuludq xmm2,xmm7 - movd xmm7,DWORD [ebp] - lea ebp,[4+ebp] - paddq xmm1,[80+esp] - psubq xmm4,xmm5 - movdqa [48+esp],xmm0 - pshuflw xmm7,xmm7,220 - pmuludq xmm3,[112+ebx] - pshufd xmm7,xmm7,220 - movdqa xmm0,[ebx] - movdqa [64+esp],xmm1 - paddq xmm2,[96+esp] - dec ecx - jnz NEAR L$001madd_sse2 - paddq xmm2,xmm5 - paddq xmm3,xmm4 - movdqa xmm1,[16+ebx] - pmuludq xmm0,xmm7 - movdqa [80+esp],xmm2 - movdqa xmm2,[32+ebx] - pmuludq xmm1,xmm7 - movdqa [96+esp],xmm3 - paddq xmm0,[esp] - movdqa xmm3,[48+ebx] - pmuludq xmm2,xmm7 - movq xmm4,xmm0 - pslldq xmm4,6 - paddq xmm1,[16+esp] - paddq xmm4,xmm0 - movdqa xmm5,xmm4 - psrldq xmm4,10 - movdqa xmm0,[64+ebx] - pmuludq xmm3,xmm7 - paddq xmm1,xmm4 - paddq xmm2,[32+esp] - movdqa [esp],xmm1 - movdqa xmm1,[80+ebx] - pmuludq xmm0,xmm7 - paddq xmm3,[48+esp] - movdqa [16+esp],xmm2 - pand xmm5,xmm6 - movdqa xmm2,[96+ebx] - pmuludq xmm1,xmm7 - paddq xmm3,xmm5 - paddq xmm0,[64+esp] - movdqa [32+esp],xmm3 - pshufd xmm4,xmm5,177 - movdqa xmm3,[112+ebx] - pmuludq xmm2,xmm7 - paddq xmm1,[80+esp] - psubq xmm4,xmm5 - movdqa [48+esp],xmm0 - pmuludq xmm3,xmm7 - pcmpeqd xmm7,xmm7 - movdqa xmm0,[esp] - pslldq xmm7,8 - movdqa [64+esp],xmm1 - paddq xmm2,[96+esp] - paddq xmm2,xmm5 - paddq xmm3,xmm4 - movdqa [80+esp],xmm2 - movdqa [96+esp],xmm3 - movdqa xmm1,[16+esp] - movdqa xmm2,[32+esp] - movdqa xmm3,[48+esp] - movq xmm4,xmm0 - pand xmm0,xmm7 - xor ebp,ebp - pslldq xmm4,6 - movq xmm5,xmm1 - paddq xmm0,xmm4 - pand xmm1,xmm7 - psrldq xmm0,6 - movd eax,xmm0 - psrldq xmm0,4 - paddq xmm5,xmm0 - movdqa xmm0,[64+esp] - sub eax,-1 - pslldq xmm5,6 - movq xmm4,xmm2 - paddq xmm1,xmm5 - pand xmm2,xmm7 - psrldq xmm1,6 - mov DWORD [edi],eax - movd eax,xmm1 - psrldq xmm1,4 - paddq xmm4,xmm1 - movdqa xmm1,[80+esp] - sbb eax,-1 - pslldq xmm4,6 - movq xmm5,xmm3 - paddq xmm2,xmm4 - pand xmm3,xmm7 - psrldq xmm2,6 - mov DWORD [4+edi],eax - movd eax,xmm2 - psrldq xmm2,4 - paddq xmm5,xmm2 - movdqa xmm2,[96+esp] - sbb eax,-1 - pslldq xmm5,6 - movq xmm4,xmm0 - paddq xmm3,xmm5 - pand xmm0,xmm7 - psrldq xmm3,6 - mov DWORD [8+edi],eax - movd eax,xmm3 - psrldq xmm3,4 - paddq xmm4,xmm3 - sbb eax,0 - pslldq xmm4,6 - movq xmm5,xmm1 - paddq xmm0,xmm4 - pand xmm1,xmm7 - psrldq xmm0,6 - mov DWORD [12+edi],eax - movd eax,xmm0 - psrldq xmm0,4 - paddq xmm5,xmm0 - sbb eax,0 - pslldq xmm5,6 - movq xmm4,xmm2 - paddq xmm1,xmm5 - pand xmm2,xmm7 - psrldq xmm1,6 - movd ebx,xmm1 - psrldq xmm1,4 - mov esp,edx - paddq xmm4,xmm1 - pslldq xmm4,6 - paddq xmm2,xmm4 - psrldq xmm2,6 - movd ecx,xmm2 - psrldq xmm2,4 - sbb ebx,0 - movd edx,xmm2 - pextrw esi,xmm2,2 - sbb ecx,1 - sbb edx,-1 - sbb esi,0 - sub ebp,esi - add DWORD [edi],esi - adc DWORD [4+edi],esi - adc DWORD [8+edi],esi - adc DWORD [12+edi],0 - adc eax,0 - adc ebx,0 - mov DWORD [16+edi],eax - adc ecx,ebp - mov DWORD [20+edi],ebx - adc edx,esi - mov DWORD [24+edi],ecx - mov DWORD [28+edi],edx - ret -global _GFp_nistz256_point_double -align 16 -_GFp_nistz256_point_double: -L$_GFp_nistz256_point_double_begin: - push ebp - push ebx - push esi - push edi - mov esi,DWORD [24+esp] - sub esp,164 - call __picup_eax -L$002pic: - lea edx,[_GFp_ia32cap_P] - mov ebp,DWORD [edx] -L$point_double_shortcut: - mov eax,DWORD [esi] - mov ebx,DWORD [4+esi] - mov ecx,DWORD [8+esi] - mov edx,DWORD [12+esi] - mov DWORD [96+esp],eax - mov DWORD [100+esp],ebx - mov DWORD [104+esp],ecx - mov DWORD [108+esp],edx - mov eax,DWORD [16+esi] - mov ebx,DWORD [20+esi] - mov ecx,DWORD [24+esi] - mov edx,DWORD [28+esi] - mov DWORD [112+esp],eax - mov DWORD [116+esp],ebx - mov DWORD [120+esp],ecx - mov DWORD [124+esp],edx - mov DWORD [160+esp],ebp - lea ebp,[32+esi] - lea esi,[32+esi] - lea edi,[esp] - call __ecp_nistz256_add - mov eax,DWORD [160+esp] - mov esi,64 - add esi,DWORD [188+esp] - lea edi,[64+esp] - mov ebp,esi - call __ecp_nistz256_mul_mont - mov eax,DWORD [160+esp] - lea esi,[esp] - lea ebp,[esp] - lea edi,[esp] - call __ecp_nistz256_mul_mont - mov eax,DWORD [160+esp] - mov ebp,DWORD [188+esp] - lea esi,[32+ebp] - lea ebp,[64+ebp] - lea edi,[128+esp] - call __ecp_nistz256_mul_mont - lea esi,[96+esp] - lea ebp,[64+esp] - lea edi,[32+esp] - call __ecp_nistz256_add - mov edi,64 - lea esi,[128+esp] - lea ebp,[128+esp] - add edi,DWORD [184+esp] - call __ecp_nistz256_add - lea esi,[96+esp] - lea ebp,[64+esp] - lea edi,[64+esp] - call __ecp_nistz256_sub - mov eax,DWORD [160+esp] - lea esi,[esp] - lea ebp,[esp] - lea edi,[128+esp] - call __ecp_nistz256_mul_mont - mov eax,DWORD [160+esp] - lea esi,[32+esp] - lea ebp,[64+esp] - lea edi,[32+esp] - call __ecp_nistz256_mul_mont - mov edi,32 - lea esi,[128+esp] - add edi,DWORD [184+esp] - call __ecp_nistz256_div_by_2 - lea esi,[32+esp] - lea ebp,[32+esp] - lea edi,[128+esp] - call __ecp_nistz256_add - mov eax,DWORD [160+esp] - lea esi,[96+esp] - lea ebp,[esp] - lea edi,[esp] - call __ecp_nistz256_mul_mont - lea esi,[128+esp] - lea ebp,[32+esp] - lea edi,[32+esp] - call __ecp_nistz256_add - lea esi,[esp] - lea ebp,[esp] - lea edi,[128+esp] - call __ecp_nistz256_add - mov eax,DWORD [160+esp] - lea esi,[32+esp] - lea ebp,[32+esp] - mov edi,DWORD [184+esp] - call __ecp_nistz256_mul_mont - mov esi,edi - lea ebp,[128+esp] - call __ecp_nistz256_sub - lea esi,[esp] - mov ebp,edi - lea edi,[esp] - call __ecp_nistz256_sub - mov eax,DWORD [160+esp] - mov esi,edi - lea ebp,[32+esp] - call __ecp_nistz256_mul_mont - mov ebp,32 - lea esi,[esp] - add ebp,DWORD [184+esp] - mov edi,ebp - call __ecp_nistz256_sub - add esp,164 - pop edi - pop esi - pop ebx - pop ebp - ret -global _GFp_nistz256_point_add_affine -align 16 -_GFp_nistz256_point_add_affine: -L$_GFp_nistz256_point_add_affine_begin: - push ebp - push ebx - push esi - push edi - mov esi,DWORD [24+esp] - sub esp,492 - call __picup_eax -L$003pic: - lea edx,[_GFp_ia32cap_P] - mov ebp,DWORD [edx] - lea edi,[96+esp] - mov eax,DWORD [esi] - mov ebx,DWORD [4+esi] - mov ecx,DWORD [8+esi] - mov edx,DWORD [12+esi] - mov DWORD [edi],eax - mov DWORD [488+esp],ebp - mov DWORD [4+edi],ebx - mov DWORD [8+edi],ecx - mov DWORD [12+edi],edx - mov eax,DWORD [16+esi] - mov ebx,DWORD [20+esi] - mov ecx,DWORD [24+esi] - mov edx,DWORD [28+esi] - mov DWORD [16+edi],eax - mov DWORD [20+edi],ebx - mov DWORD [24+edi],ecx - mov DWORD [28+edi],edx - mov eax,DWORD [32+esi] - mov ebx,DWORD [36+esi] - mov ecx,DWORD [40+esi] - mov edx,DWORD [44+esi] - mov DWORD [32+edi],eax - mov DWORD [36+edi],ebx - mov DWORD [40+edi],ecx - mov DWORD [44+edi],edx - mov eax,DWORD [48+esi] - mov ebx,DWORD [52+esi] - mov ecx,DWORD [56+esi] - mov edx,DWORD [60+esi] - mov DWORD [48+edi],eax - mov DWORD [52+edi],ebx - mov DWORD [56+edi],ecx - mov DWORD [60+edi],edx - mov eax,DWORD [64+esi] - mov ebx,DWORD [68+esi] - mov ecx,DWORD [72+esi] - mov edx,DWORD [76+esi] - mov DWORD [64+edi],eax - mov ebp,eax - mov DWORD [68+edi],ebx - or ebp,ebx - mov DWORD [72+edi],ecx - or ebp,ecx - mov DWORD [76+edi],edx - or ebp,edx - mov eax,DWORD [80+esi] - mov ebx,DWORD [84+esi] - mov ecx,DWORD [88+esi] - mov edx,DWORD [92+esi] - mov DWORD [80+edi],eax - or ebp,eax - mov DWORD [84+edi],ebx - or ebp,ebx - mov DWORD [88+edi],ecx - or ebp,ecx - mov DWORD [92+edi],edx - or ebp,edx - xor eax,eax - mov esi,DWORD [520+esp] - sub eax,ebp - or ebp,eax - sar ebp,31 - mov DWORD [480+esp],ebp - lea edi,[192+esp] - mov eax,DWORD [esi] - mov ebx,DWORD [4+esi] - mov ecx,DWORD [8+esi] - mov edx,DWORD [12+esi] - mov DWORD [edi],eax - mov ebp,eax - mov DWORD [4+edi],ebx - or ebp,ebx - mov DWORD [8+edi],ecx - or ebp,ecx - mov DWORD [12+edi],edx - or ebp,edx - mov eax,DWORD [16+esi] - mov ebx,DWORD [20+esi] - mov ecx,DWORD [24+esi] - mov edx,DWORD [28+esi] - mov DWORD [16+edi],eax - or ebp,eax - mov DWORD [20+edi],ebx - or ebp,ebx - mov DWORD [24+edi],ecx - or ebp,ecx - mov DWORD [28+edi],edx - or ebp,edx - mov eax,DWORD [32+esi] - mov ebx,DWORD [36+esi] - mov ecx,DWORD [40+esi] - mov edx,DWORD [44+esi] - mov DWORD [32+edi],eax - or ebp,eax - mov DWORD [36+edi],ebx - or ebp,ebx - mov DWORD [40+edi],ecx - or ebp,ecx - mov DWORD [44+edi],edx - or ebp,edx - mov eax,DWORD [48+esi] - mov ebx,DWORD [52+esi] - mov ecx,DWORD [56+esi] - mov edx,DWORD [60+esi] - mov DWORD [48+edi],eax - or ebp,eax - mov DWORD [52+edi],ebx - or ebp,ebx - mov DWORD [56+edi],ecx - or ebp,ecx - mov DWORD [60+edi],edx - or ebp,edx - xor ebx,ebx - mov eax,DWORD [488+esp] - sub ebx,ebp - lea esi,[160+esp] - or ebx,ebp - lea ebp,[160+esp] - sar ebx,31 - lea edi,[288+esp] - mov DWORD [484+esp],ebx - call __ecp_nistz256_mul_mont - mov eax,DWORD [488+esp] - lea esi,[192+esp] - mov ebp,edi - lea edi,[256+esp] - call __ecp_nistz256_mul_mont - mov eax,DWORD [488+esp] - lea esi,[160+esp] - lea ebp,[288+esp] - lea edi,[288+esp] - call __ecp_nistz256_mul_mont - lea esi,[256+esp] - lea ebp,[96+esp] - lea edi,[320+esp] - call __ecp_nistz256_sub - mov eax,DWORD [488+esp] - lea esi,[224+esp] - lea ebp,[288+esp] - lea edi,[288+esp] - call __ecp_nistz256_mul_mont - mov eax,DWORD [488+esp] - lea esi,[160+esp] - lea ebp,[320+esp] - lea edi,[64+esp] - call __ecp_nistz256_mul_mont - lea esi,[288+esp] - lea ebp,[128+esp] - lea edi,[352+esp] - call __ecp_nistz256_sub - mov eax,DWORD [488+esp] - lea esi,[320+esp] - lea ebp,[320+esp] - lea edi,[384+esp] - call __ecp_nistz256_mul_mont - mov eax,DWORD [488+esp] - lea esi,[352+esp] - lea ebp,[352+esp] - lea edi,[448+esp] - call __ecp_nistz256_mul_mont - mov eax,DWORD [488+esp] - lea esi,[96+esp] - lea ebp,[384+esp] - lea edi,[256+esp] - call __ecp_nistz256_mul_mont - mov eax,DWORD [488+esp] - lea esi,[320+esp] - lea ebp,[384+esp] - lea edi,[416+esp] - call __ecp_nistz256_mul_mont - lea esi,[256+esp] - lea ebp,[256+esp] - lea edi,[384+esp] - call __ecp_nistz256_add - lea esi,[448+esp] - lea ebp,[384+esp] - lea edi,[esp] - call __ecp_nistz256_sub - lea esi,[esp] - lea ebp,[416+esp] - lea edi,[esp] - call __ecp_nistz256_sub - lea esi,[256+esp] - lea ebp,[esp] - lea edi,[32+esp] - call __ecp_nistz256_sub - mov eax,DWORD [488+esp] - lea esi,[416+esp] - lea ebp,[128+esp] - lea edi,[288+esp] - call __ecp_nistz256_mul_mont - mov eax,DWORD [488+esp] - lea esi,[352+esp] - lea ebp,[32+esp] - lea edi,[32+esp] - call __ecp_nistz256_mul_mont - lea esi,[32+esp] - lea ebp,[288+esp] - lea edi,[32+esp] - call __ecp_nistz256_sub - mov ebp,DWORD [480+esp] - mov esi,DWORD [484+esp] - mov edi,DWORD [512+esp] - mov edx,ebp - not ebp - and edx,esi - and ebp,esi - not esi - mov eax,edx - and eax,DWORD [64+esp] - mov ebx,ebp - and ebx,1 - mov ecx,esi - and ecx,DWORD [160+esp] - or eax,ebx - or eax,ecx - mov DWORD [64+edi],eax - mov eax,edx - and eax,DWORD [68+esp] - mov ecx,esi - and ecx,DWORD [164+esp] - or eax,ecx - mov DWORD [68+edi],eax - mov eax,edx - and eax,DWORD [72+esp] - mov ecx,esi - and ecx,DWORD [168+esp] - or eax,ecx - mov DWORD [72+edi],eax - mov eax,edx - and eax,DWORD [76+esp] - mov ecx,esi - and ecx,DWORD [172+esp] - or eax,ebp - or eax,ecx - mov DWORD [76+edi],eax - mov eax,edx - and eax,DWORD [80+esp] - mov ecx,esi - and ecx,DWORD [176+esp] - or eax,ebp - or eax,ecx - mov DWORD [80+edi],eax - mov eax,edx - and eax,DWORD [84+esp] - mov ecx,esi - and ecx,DWORD [180+esp] - or eax,ebp - or eax,ecx - mov DWORD [84+edi],eax - mov eax,edx - and eax,DWORD [88+esp] - mov ebx,ebp - and ebx,-2 - mov ecx,esi - and ecx,DWORD [184+esp] - or eax,ebx - or eax,ecx - mov DWORD [88+edi],eax - mov eax,edx - and eax,DWORD [92+esp] - mov ecx,esi - and ecx,DWORD [188+esp] - or eax,ecx - mov DWORD [92+edi],eax - mov eax,edx - and eax,DWORD [esp] - mov ebx,ebp - and ebx,DWORD [192+esp] - mov ecx,esi - and ecx,DWORD [96+esp] - or eax,ebx - or eax,ecx - mov DWORD [edi],eax - mov eax,edx - and eax,DWORD [4+esp] - mov ebx,ebp - and ebx,DWORD [196+esp] - mov ecx,esi - and ecx,DWORD [100+esp] - or eax,ebx - or eax,ecx - mov DWORD [4+edi],eax - mov eax,edx - and eax,DWORD [8+esp] - mov ebx,ebp - and ebx,DWORD [200+esp] - mov ecx,esi - and ecx,DWORD [104+esp] - or eax,ebx - or eax,ecx - mov DWORD [8+edi],eax - mov eax,edx - and eax,DWORD [12+esp] - mov ebx,ebp - and ebx,DWORD [204+esp] - mov ecx,esi - and ecx,DWORD [108+esp] - or eax,ebx - or eax,ecx - mov DWORD [12+edi],eax - mov eax,edx - and eax,DWORD [16+esp] - mov ebx,ebp - and ebx,DWORD [208+esp] - mov ecx,esi - and ecx,DWORD [112+esp] - or eax,ebx - or eax,ecx - mov DWORD [16+edi],eax - mov eax,edx - and eax,DWORD [20+esp] - mov ebx,ebp - and ebx,DWORD [212+esp] - mov ecx,esi - and ecx,DWORD [116+esp] - or eax,ebx - or eax,ecx - mov DWORD [20+edi],eax - mov eax,edx - and eax,DWORD [24+esp] - mov ebx,ebp - and ebx,DWORD [216+esp] - mov ecx,esi - and ecx,DWORD [120+esp] - or eax,ebx - or eax,ecx - mov DWORD [24+edi],eax - mov eax,edx - and eax,DWORD [28+esp] - mov ebx,ebp - and ebx,DWORD [220+esp] - mov ecx,esi - and ecx,DWORD [124+esp] - or eax,ebx - or eax,ecx - mov DWORD [28+edi],eax - mov eax,edx - and eax,DWORD [32+esp] - mov ebx,ebp - and ebx,DWORD [224+esp] - mov ecx,esi - and ecx,DWORD [128+esp] - or eax,ebx - or eax,ecx - mov DWORD [32+edi],eax - mov eax,edx - and eax,DWORD [36+esp] - mov ebx,ebp - and ebx,DWORD [228+esp] - mov ecx,esi - and ecx,DWORD [132+esp] - or eax,ebx - or eax,ecx - mov DWORD [36+edi],eax - mov eax,edx - and eax,DWORD [40+esp] - mov ebx,ebp - and ebx,DWORD [232+esp] - mov ecx,esi - and ecx,DWORD [136+esp] - or eax,ebx - or eax,ecx - mov DWORD [40+edi],eax - mov eax,edx - and eax,DWORD [44+esp] - mov ebx,ebp - and ebx,DWORD [236+esp] - mov ecx,esi - and ecx,DWORD [140+esp] - or eax,ebx - or eax,ecx - mov DWORD [44+edi],eax - mov eax,edx - and eax,DWORD [48+esp] - mov ebx,ebp - and ebx,DWORD [240+esp] - mov ecx,esi - and ecx,DWORD [144+esp] - or eax,ebx - or eax,ecx - mov DWORD [48+edi],eax - mov eax,edx - and eax,DWORD [52+esp] - mov ebx,ebp - and ebx,DWORD [244+esp] - mov ecx,esi - and ecx,DWORD [148+esp] - or eax,ebx - or eax,ecx - mov DWORD [52+edi],eax - mov eax,edx - and eax,DWORD [56+esp] - mov ebx,ebp - and ebx,DWORD [248+esp] - mov ecx,esi - and ecx,DWORD [152+esp] - or eax,ebx - or eax,ecx - mov DWORD [56+edi],eax - mov eax,edx - and eax,DWORD [60+esp] - mov ebx,ebp - and ebx,DWORD [252+esp] - mov ecx,esi - and ecx,DWORD [156+esp] - or eax,ebx - or eax,ecx - mov DWORD [60+edi],eax - add esp,492 - pop edi - pop esi - pop ebx - pop ebp - ret -segment .bss -common _GFp_ia32cap_P 16 diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/tmp/ghash-x86_64-nasm.asm temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/tmp/ghash-x86_64-nasm.asm --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/tmp/ghash-x86_64-nasm.asm 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/tmp/ghash-x86_64-nasm.asm 1970-01-01 00:00:00.000000000 +0000 @@ -1,1209 +0,0 @@ -; This file is generated from a similarly-named Perl script in the BoringSSL -; source tree. Do not edit by hand. - -default rel -%define XMMWORD -%define YMMWORD -%define ZMMWORD -section .text code align=64 - -EXTERN GFp_ia32cap_P -global GFp_gcm_init_clmul - -ALIGN 16 -GFp_gcm_init_clmul: - -$L$_init_clmul: -$L$SEH_begin_GFp_gcm_init_clmul: - -DB 0x48,0x83,0xec,0x18 -DB 0x0f,0x29,0x34,0x24 - movdqu xmm2,XMMWORD[rdx] - pshufd xmm2,xmm2,78 - - - pshufd xmm4,xmm2,255 - movdqa xmm3,xmm2 - psllq xmm2,1 - pxor xmm5,xmm5 - psrlq xmm3,63 - pcmpgtd xmm5,xmm4 - pslldq xmm3,8 - por xmm2,xmm3 - - - pand xmm5,XMMWORD[$L$0x1c2_polynomial] - pxor xmm2,xmm5 - - - pshufd xmm6,xmm2,78 - movdqa xmm0,xmm2 - pxor xmm6,xmm2 - movdqa xmm1,xmm0 - pshufd xmm3,xmm0,78 - pxor xmm3,xmm0 -DB 102,15,58,68,194,0 -DB 102,15,58,68,202,17 -DB 102,15,58,68,222,0 - pxor xmm3,xmm0 - pxor xmm3,xmm1 - - movdqa xmm4,xmm3 - psrldq xmm3,8 - pslldq xmm4,8 - pxor xmm1,xmm3 - pxor xmm0,xmm4 - - movdqa xmm4,xmm0 - movdqa xmm3,xmm0 - psllq xmm0,5 - pxor xmm3,xmm0 - psllq xmm0,1 - pxor xmm0,xmm3 - psllq xmm0,57 - movdqa xmm3,xmm0 - pslldq xmm0,8 - psrldq xmm3,8 - pxor xmm0,xmm4 - pxor xmm1,xmm3 - - - movdqa xmm4,xmm0 - psrlq xmm0,1 - pxor xmm1,xmm4 - pxor xmm4,xmm0 - psrlq xmm0,5 - pxor xmm0,xmm4 - psrlq xmm0,1 - pxor xmm0,xmm1 - pshufd xmm3,xmm2,78 - pshufd xmm4,xmm0,78 - pxor xmm3,xmm2 - movdqu XMMWORD[rcx],xmm2 - pxor xmm4,xmm0 - movdqu XMMWORD[16+rcx],xmm0 -DB 102,15,58,15,227,8 - movdqu XMMWORD[32+rcx],xmm4 - movdqa xmm1,xmm0 - pshufd xmm3,xmm0,78 - pxor xmm3,xmm0 -DB 102,15,58,68,194,0 -DB 102,15,58,68,202,17 -DB 102,15,58,68,222,0 - pxor xmm3,xmm0 - pxor xmm3,xmm1 - - movdqa xmm4,xmm3 - psrldq xmm3,8 - pslldq xmm4,8 - pxor xmm1,xmm3 - pxor xmm0,xmm4 - - movdqa xmm4,xmm0 - movdqa xmm3,xmm0 - psllq xmm0,5 - pxor xmm3,xmm0 - psllq xmm0,1 - pxor xmm0,xmm3 - psllq xmm0,57 - movdqa xmm3,xmm0 - pslldq xmm0,8 - psrldq xmm3,8 - pxor xmm0,xmm4 - pxor xmm1,xmm3 - - - movdqa xmm4,xmm0 - psrlq xmm0,1 - pxor xmm1,xmm4 - pxor xmm4,xmm0 - psrlq xmm0,5 - pxor xmm0,xmm4 - psrlq xmm0,1 - pxor xmm0,xmm1 - movdqa xmm5,xmm0 - movdqa xmm1,xmm0 - pshufd xmm3,xmm0,78 - pxor xmm3,xmm0 -DB 102,15,58,68,194,0 -DB 102,15,58,68,202,17 -DB 102,15,58,68,222,0 - pxor xmm3,xmm0 - pxor xmm3,xmm1 - - movdqa xmm4,xmm3 - psrldq xmm3,8 - pslldq xmm4,8 - pxor xmm1,xmm3 - pxor xmm0,xmm4 - - movdqa xmm4,xmm0 - movdqa xmm3,xmm0 - psllq xmm0,5 - pxor xmm3,xmm0 - psllq xmm0,1 - pxor xmm0,xmm3 - psllq xmm0,57 - movdqa xmm3,xmm0 - pslldq xmm0,8 - psrldq xmm3,8 - pxor xmm0,xmm4 - pxor xmm1,xmm3 - - - movdqa xmm4,xmm0 - psrlq xmm0,1 - pxor xmm1,xmm4 - pxor xmm4,xmm0 - psrlq xmm0,5 - pxor xmm0,xmm4 - psrlq xmm0,1 - pxor xmm0,xmm1 - pshufd xmm3,xmm5,78 - pshufd xmm4,xmm0,78 - pxor xmm3,xmm5 - movdqu XMMWORD[48+rcx],xmm5 - pxor xmm4,xmm0 - movdqu XMMWORD[64+rcx],xmm0 -DB 102,15,58,15,227,8 - movdqu XMMWORD[80+rcx],xmm4 - movaps xmm6,XMMWORD[rsp] - lea rsp,[24+rsp] -$L$SEH_end_GFp_gcm_init_clmul: - DB 0F3h,0C3h ;repret - - -global GFp_gcm_gmult_clmul - -ALIGN 16 -GFp_gcm_gmult_clmul: - -$L$_gmult_clmul: - movdqu xmm0,XMMWORD[rcx] - movdqa xmm5,XMMWORD[$L$bswap_mask] - movdqu xmm2,XMMWORD[rdx] - movdqu xmm4,XMMWORD[32+rdx] -DB 102,15,56,0,197 - movdqa xmm1,xmm0 - pshufd xmm3,xmm0,78 - pxor xmm3,xmm0 -DB 102,15,58,68,194,0 -DB 102,15,58,68,202,17 -DB 102,15,58,68,220,0 - pxor xmm3,xmm0 - pxor xmm3,xmm1 - - movdqa xmm4,xmm3 - psrldq xmm3,8 - pslldq xmm4,8 - pxor xmm1,xmm3 - pxor xmm0,xmm4 - - movdqa xmm4,xmm0 - movdqa xmm3,xmm0 - psllq xmm0,5 - pxor xmm3,xmm0 - psllq xmm0,1 - pxor xmm0,xmm3 - psllq xmm0,57 - movdqa xmm3,xmm0 - pslldq xmm0,8 - psrldq xmm3,8 - pxor xmm0,xmm4 - pxor xmm1,xmm3 - - - movdqa xmm4,xmm0 - psrlq xmm0,1 - pxor xmm1,xmm4 - pxor xmm4,xmm0 - psrlq xmm0,5 - pxor xmm0,xmm4 - psrlq xmm0,1 - pxor xmm0,xmm1 -DB 102,15,56,0,197 - movdqu XMMWORD[rcx],xmm0 - DB 0F3h,0C3h ;repret - - -global GFp_gcm_ghash_clmul - -ALIGN 32 -GFp_gcm_ghash_clmul: - -$L$_ghash_clmul: - lea rax,[((-136))+rsp] -$L$SEH_begin_GFp_gcm_ghash_clmul: - -DB 0x48,0x8d,0x60,0xe0 -DB 0x0f,0x29,0x70,0xe0 -DB 0x0f,0x29,0x78,0xf0 -DB 0x44,0x0f,0x29,0x00 -DB 0x44,0x0f,0x29,0x48,0x10 -DB 0x44,0x0f,0x29,0x50,0x20 -DB 0x44,0x0f,0x29,0x58,0x30 -DB 0x44,0x0f,0x29,0x60,0x40 -DB 0x44,0x0f,0x29,0x68,0x50 -DB 0x44,0x0f,0x29,0x70,0x60 -DB 0x44,0x0f,0x29,0x78,0x70 - movdqa xmm10,XMMWORD[$L$bswap_mask] - - movdqu xmm0,XMMWORD[rcx] - movdqu xmm2,XMMWORD[rdx] - movdqu xmm7,XMMWORD[32+rdx] -DB 102,65,15,56,0,194 - - sub r9,0x10 - jz NEAR $L$odd_tail - - movdqu xmm6,XMMWORD[16+rdx] - lea rax,[GFp_ia32cap_P] - mov eax,DWORD[4+rax] - cmp r9,0x30 - jb NEAR $L$skip4x - - and eax,71303168 - cmp eax,4194304 - je NEAR $L$skip4x - - sub r9,0x30 - mov rax,0xA040608020C0E000 - movdqu xmm14,XMMWORD[48+rdx] - movdqu xmm15,XMMWORD[64+rdx] - - - - - movdqu xmm3,XMMWORD[48+r8] - movdqu xmm11,XMMWORD[32+r8] -DB 102,65,15,56,0,218 -DB 102,69,15,56,0,218 - movdqa xmm5,xmm3 - pshufd xmm4,xmm3,78 - pxor xmm4,xmm3 -DB 102,15,58,68,218,0 -DB 102,15,58,68,234,17 -DB 102,15,58,68,231,0 - - movdqa xmm13,xmm11 - pshufd xmm12,xmm11,78 - pxor xmm12,xmm11 -DB 102,68,15,58,68,222,0 -DB 102,68,15,58,68,238,17 -DB 102,68,15,58,68,231,16 - xorps xmm3,xmm11 - xorps xmm5,xmm13 - movups xmm7,XMMWORD[80+rdx] - xorps xmm4,xmm12 - - movdqu xmm11,XMMWORD[16+r8] - movdqu xmm8,XMMWORD[r8] -DB 102,69,15,56,0,218 -DB 102,69,15,56,0,194 - movdqa xmm13,xmm11 - pshufd xmm12,xmm11,78 - pxor xmm0,xmm8 - pxor xmm12,xmm11 -DB 102,69,15,58,68,222,0 - movdqa xmm1,xmm0 - pshufd xmm8,xmm0,78 - pxor xmm8,xmm0 -DB 102,69,15,58,68,238,17 -DB 102,68,15,58,68,231,0 - xorps xmm3,xmm11 - xorps xmm5,xmm13 - - lea r8,[64+r8] - sub r9,0x40 - jc NEAR $L$tail4x - - jmp NEAR $L$mod4_loop -ALIGN 32 -$L$mod4_loop: -DB 102,65,15,58,68,199,0 - xorps xmm4,xmm12 - movdqu xmm11,XMMWORD[48+r8] -DB 102,69,15,56,0,218 -DB 102,65,15,58,68,207,17 - xorps xmm0,xmm3 - movdqu xmm3,XMMWORD[32+r8] - movdqa xmm13,xmm11 -DB 102,68,15,58,68,199,16 - pshufd xmm12,xmm11,78 - xorps xmm1,xmm5 - pxor xmm12,xmm11 -DB 102,65,15,56,0,218 - movups xmm7,XMMWORD[32+rdx] - xorps xmm8,xmm4 -DB 102,68,15,58,68,218,0 - pshufd xmm4,xmm3,78 - - pxor xmm8,xmm0 - movdqa xmm5,xmm3 - pxor xmm8,xmm1 - pxor xmm4,xmm3 - movdqa xmm9,xmm8 -DB 102,68,15,58,68,234,17 - pslldq xmm8,8 - psrldq xmm9,8 - pxor xmm0,xmm8 - movdqa xmm8,XMMWORD[$L$7_mask] - pxor xmm1,xmm9 -DB 102,76,15,110,200 - - pand xmm8,xmm0 -DB 102,69,15,56,0,200 - pxor xmm9,xmm0 -DB 102,68,15,58,68,231,0 - psllq xmm9,57 - movdqa xmm8,xmm9 - pslldq xmm9,8 -DB 102,15,58,68,222,0 - psrldq xmm8,8 - pxor xmm0,xmm9 - pxor xmm1,xmm8 - movdqu xmm8,XMMWORD[r8] - - movdqa xmm9,xmm0 - psrlq xmm0,1 -DB 102,15,58,68,238,17 - xorps xmm3,xmm11 - movdqu xmm11,XMMWORD[16+r8] -DB 102,69,15,56,0,218 -DB 102,15,58,68,231,16 - xorps xmm5,xmm13 - movups xmm7,XMMWORD[80+rdx] -DB 102,69,15,56,0,194 - pxor xmm1,xmm9 - pxor xmm9,xmm0 - psrlq xmm0,5 - - movdqa xmm13,xmm11 - pxor xmm4,xmm12 - pshufd xmm12,xmm11,78 - pxor xmm0,xmm9 - pxor xmm1,xmm8 - pxor xmm12,xmm11 -DB 102,69,15,58,68,222,0 - psrlq xmm0,1 - pxor xmm0,xmm1 - movdqa xmm1,xmm0 -DB 102,69,15,58,68,238,17 - xorps xmm3,xmm11 - pshufd xmm8,xmm0,78 - pxor xmm8,xmm0 - -DB 102,68,15,58,68,231,0 - xorps xmm5,xmm13 - - lea r8,[64+r8] - sub r9,0x40 - jnc NEAR $L$mod4_loop - -$L$tail4x: -DB 102,65,15,58,68,199,0 -DB 102,65,15,58,68,207,17 -DB 102,68,15,58,68,199,16 - xorps xmm4,xmm12 - xorps xmm0,xmm3 - xorps xmm1,xmm5 - pxor xmm1,xmm0 - pxor xmm8,xmm4 - - pxor xmm8,xmm1 - pxor xmm1,xmm0 - - movdqa xmm9,xmm8 - psrldq xmm8,8 - pslldq xmm9,8 - pxor xmm1,xmm8 - pxor xmm0,xmm9 - - movdqa xmm4,xmm0 - movdqa xmm3,xmm0 - psllq xmm0,5 - pxor xmm3,xmm0 - psllq xmm0,1 - pxor xmm0,xmm3 - psllq xmm0,57 - movdqa xmm3,xmm0 - pslldq xmm0,8 - psrldq xmm3,8 - pxor xmm0,xmm4 - pxor xmm1,xmm3 - - - movdqa xmm4,xmm0 - psrlq xmm0,1 - pxor xmm1,xmm4 - pxor xmm4,xmm0 - psrlq xmm0,5 - pxor xmm0,xmm4 - psrlq xmm0,1 - pxor xmm0,xmm1 - add r9,0x40 - jz NEAR $L$done - movdqu xmm7,XMMWORD[32+rdx] - sub r9,0x10 - jz NEAR $L$odd_tail -$L$skip4x: - - - - - - movdqu xmm8,XMMWORD[r8] - movdqu xmm3,XMMWORD[16+r8] -DB 102,69,15,56,0,194 -DB 102,65,15,56,0,218 - pxor xmm0,xmm8 - - movdqa xmm5,xmm3 - pshufd xmm4,xmm3,78 - pxor xmm4,xmm3 -DB 102,15,58,68,218,0 -DB 102,15,58,68,234,17 -DB 102,15,58,68,231,0 - - lea r8,[32+r8] - nop - sub r9,0x20 - jbe NEAR $L$even_tail - nop - jmp NEAR $L$mod_loop - -ALIGN 32 -$L$mod_loop: - movdqa xmm1,xmm0 - movdqa xmm8,xmm4 - pshufd xmm4,xmm0,78 - pxor xmm4,xmm0 - -DB 102,15,58,68,198,0 -DB 102,15,58,68,206,17 -DB 102,15,58,68,231,16 - - pxor xmm0,xmm3 - pxor xmm1,xmm5 - movdqu xmm9,XMMWORD[r8] - pxor xmm8,xmm0 -DB 102,69,15,56,0,202 - movdqu xmm3,XMMWORD[16+r8] - - pxor xmm8,xmm1 - pxor xmm1,xmm9 - pxor xmm4,xmm8 -DB 102,65,15,56,0,218 - movdqa xmm8,xmm4 - psrldq xmm8,8 - pslldq xmm4,8 - pxor xmm1,xmm8 - pxor xmm0,xmm4 - - movdqa xmm5,xmm3 - - movdqa xmm9,xmm0 - movdqa xmm8,xmm0 - psllq xmm0,5 - pxor xmm8,xmm0 -DB 102,15,58,68,218,0 - psllq xmm0,1 - pxor xmm0,xmm8 - psllq xmm0,57 - movdqa xmm8,xmm0 - pslldq xmm0,8 - psrldq xmm8,8 - pxor xmm0,xmm9 - pshufd xmm4,xmm5,78 - pxor xmm1,xmm8 - pxor xmm4,xmm5 - - movdqa xmm9,xmm0 - psrlq xmm0,1 -DB 102,15,58,68,234,17 - pxor xmm1,xmm9 - pxor xmm9,xmm0 - psrlq xmm0,5 - pxor xmm0,xmm9 - lea r8,[32+r8] - psrlq xmm0,1 -DB 102,15,58,68,231,0 - pxor xmm0,xmm1 - - sub r9,0x20 - ja NEAR $L$mod_loop - -$L$even_tail: - movdqa xmm1,xmm0 - movdqa xmm8,xmm4 - pshufd xmm4,xmm0,78 - pxor xmm4,xmm0 - -DB 102,15,58,68,198,0 -DB 102,15,58,68,206,17 -DB 102,15,58,68,231,16 - - pxor xmm0,xmm3 - pxor xmm1,xmm5 - pxor xmm8,xmm0 - pxor xmm8,xmm1 - pxor xmm4,xmm8 - movdqa xmm8,xmm4 - psrldq xmm8,8 - pslldq xmm4,8 - pxor xmm1,xmm8 - pxor xmm0,xmm4 - - movdqa xmm4,xmm0 - movdqa xmm3,xmm0 - psllq xmm0,5 - pxor xmm3,xmm0 - psllq xmm0,1 - pxor xmm0,xmm3 - psllq xmm0,57 - movdqa xmm3,xmm0 - pslldq xmm0,8 - psrldq xmm3,8 - pxor xmm0,xmm4 - pxor xmm1,xmm3 - - - movdqa xmm4,xmm0 - psrlq xmm0,1 - pxor xmm1,xmm4 - pxor xmm4,xmm0 - psrlq xmm0,5 - pxor xmm0,xmm4 - psrlq xmm0,1 - pxor xmm0,xmm1 - test r9,r9 - jnz NEAR $L$done - -$L$odd_tail: - movdqu xmm8,XMMWORD[r8] -DB 102,69,15,56,0,194 - pxor xmm0,xmm8 - movdqa xmm1,xmm0 - pshufd xmm3,xmm0,78 - pxor xmm3,xmm0 -DB 102,15,58,68,194,0 -DB 102,15,58,68,202,17 -DB 102,15,58,68,223,0 - pxor xmm3,xmm0 - pxor xmm3,xmm1 - - movdqa xmm4,xmm3 - psrldq xmm3,8 - pslldq xmm4,8 - pxor xmm1,xmm3 - pxor xmm0,xmm4 - - movdqa xmm4,xmm0 - movdqa xmm3,xmm0 - psllq xmm0,5 - pxor xmm3,xmm0 - psllq xmm0,1 - pxor xmm0,xmm3 - psllq xmm0,57 - movdqa xmm3,xmm0 - pslldq xmm0,8 - psrldq xmm3,8 - pxor xmm0,xmm4 - pxor xmm1,xmm3 - - - movdqa xmm4,xmm0 - psrlq xmm0,1 - pxor xmm1,xmm4 - pxor xmm4,xmm0 - psrlq xmm0,5 - pxor xmm0,xmm4 - psrlq xmm0,1 - pxor xmm0,xmm1 -$L$done: -DB 102,65,15,56,0,194 - movdqu XMMWORD[rcx],xmm0 - movaps xmm6,XMMWORD[rsp] - movaps xmm7,XMMWORD[16+rsp] - movaps xmm8,XMMWORD[32+rsp] - movaps xmm9,XMMWORD[48+rsp] - movaps xmm10,XMMWORD[64+rsp] - movaps xmm11,XMMWORD[80+rsp] - movaps xmm12,XMMWORD[96+rsp] - movaps xmm13,XMMWORD[112+rsp] - movaps xmm14,XMMWORD[128+rsp] - movaps xmm15,XMMWORD[144+rsp] - lea rsp,[168+rsp] -$L$SEH_end_GFp_gcm_ghash_clmul: - DB 0F3h,0C3h ;repret - - -global GFp_gcm_init_avx - -ALIGN 32 -GFp_gcm_init_avx: - -$L$SEH_begin_GFp_gcm_init_avx: - -DB 0x48,0x83,0xec,0x18 -DB 0x0f,0x29,0x34,0x24 - vzeroupper - - vmovdqu xmm2,XMMWORD[rdx] - vpshufd xmm2,xmm2,78 - - - vpshufd xmm4,xmm2,255 - vpsrlq xmm3,xmm2,63 - vpsllq xmm2,xmm2,1 - vpxor xmm5,xmm5,xmm5 - vpcmpgtd xmm5,xmm5,xmm4 - vpslldq xmm3,xmm3,8 - vpor xmm2,xmm2,xmm3 - - - vpand xmm5,xmm5,XMMWORD[$L$0x1c2_polynomial] - vpxor xmm2,xmm2,xmm5 - - vpunpckhqdq xmm6,xmm2,xmm2 - vmovdqa xmm0,xmm2 - vpxor xmm6,xmm6,xmm2 - mov r10,4 - jmp NEAR $L$init_start_avx -ALIGN 32 -$L$init_loop_avx: - vpalignr xmm5,xmm4,xmm3,8 - vmovdqu XMMWORD[(-16)+rcx],xmm5 - vpunpckhqdq xmm3,xmm0,xmm0 - vpxor xmm3,xmm3,xmm0 - vpclmulqdq xmm1,xmm0,xmm2,0x11 - vpclmulqdq xmm0,xmm0,xmm2,0x00 - vpclmulqdq xmm3,xmm3,xmm6,0x00 - vpxor xmm4,xmm1,xmm0 - vpxor xmm3,xmm3,xmm4 - - vpslldq xmm4,xmm3,8 - vpsrldq xmm3,xmm3,8 - vpxor xmm0,xmm0,xmm4 - vpxor xmm1,xmm1,xmm3 - vpsllq xmm3,xmm0,57 - vpsllq xmm4,xmm0,62 - vpxor xmm4,xmm4,xmm3 - vpsllq xmm3,xmm0,63 - vpxor xmm4,xmm4,xmm3 - vpslldq xmm3,xmm4,8 - vpsrldq xmm4,xmm4,8 - vpxor xmm0,xmm0,xmm3 - vpxor xmm1,xmm1,xmm4 - - vpsrlq xmm4,xmm0,1 - vpxor xmm1,xmm1,xmm0 - vpxor xmm0,xmm0,xmm4 - vpsrlq xmm4,xmm4,5 - vpxor xmm0,xmm0,xmm4 - vpsrlq xmm0,xmm0,1 - vpxor xmm0,xmm0,xmm1 -$L$init_start_avx: - vmovdqa xmm5,xmm0 - vpunpckhqdq xmm3,xmm0,xmm0 - vpxor xmm3,xmm3,xmm0 - vpclmulqdq xmm1,xmm0,xmm2,0x11 - vpclmulqdq xmm0,xmm0,xmm2,0x00 - vpclmulqdq xmm3,xmm3,xmm6,0x00 - vpxor xmm4,xmm1,xmm0 - vpxor xmm3,xmm3,xmm4 - - vpslldq xmm4,xmm3,8 - vpsrldq xmm3,xmm3,8 - vpxor xmm0,xmm0,xmm4 - vpxor xmm1,xmm1,xmm3 - vpsllq xmm3,xmm0,57 - vpsllq xmm4,xmm0,62 - vpxor xmm4,xmm4,xmm3 - vpsllq xmm3,xmm0,63 - vpxor xmm4,xmm4,xmm3 - vpslldq xmm3,xmm4,8 - vpsrldq xmm4,xmm4,8 - vpxor xmm0,xmm0,xmm3 - vpxor xmm1,xmm1,xmm4 - - vpsrlq xmm4,xmm0,1 - vpxor xmm1,xmm1,xmm0 - vpxor xmm0,xmm0,xmm4 - vpsrlq xmm4,xmm4,5 - vpxor xmm0,xmm0,xmm4 - vpsrlq xmm0,xmm0,1 - vpxor xmm0,xmm0,xmm1 - vpshufd xmm3,xmm5,78 - vpshufd xmm4,xmm0,78 - vpxor xmm3,xmm3,xmm5 - vmovdqu XMMWORD[rcx],xmm5 - vpxor xmm4,xmm4,xmm0 - vmovdqu XMMWORD[16+rcx],xmm0 - lea rcx,[48+rcx] - sub r10,1 - jnz NEAR $L$init_loop_avx - - vpalignr xmm5,xmm3,xmm4,8 - vmovdqu XMMWORD[(-16)+rcx],xmm5 - - vzeroupper - movaps xmm6,XMMWORD[rsp] - lea rsp,[24+rsp] -$L$SEH_end_GFp_gcm_init_avx: - DB 0F3h,0C3h ;repret - - -global GFp_gcm_ghash_avx - -ALIGN 32 -GFp_gcm_ghash_avx: - - lea rax,[((-136))+rsp] -$L$SEH_begin_GFp_gcm_ghash_avx: - -DB 0x48,0x8d,0x60,0xe0 -DB 0x0f,0x29,0x70,0xe0 -DB 0x0f,0x29,0x78,0xf0 -DB 0x44,0x0f,0x29,0x00 -DB 0x44,0x0f,0x29,0x48,0x10 -DB 0x44,0x0f,0x29,0x50,0x20 -DB 0x44,0x0f,0x29,0x58,0x30 -DB 0x44,0x0f,0x29,0x60,0x40 -DB 0x44,0x0f,0x29,0x68,0x50 -DB 0x44,0x0f,0x29,0x70,0x60 -DB 0x44,0x0f,0x29,0x78,0x70 - vzeroupper - - vmovdqu xmm10,XMMWORD[rcx] - lea r10,[$L$0x1c2_polynomial] - lea rdx,[64+rdx] - vmovdqu xmm13,XMMWORD[$L$bswap_mask] - vpshufb xmm10,xmm10,xmm13 - cmp r9,0x80 - jb NEAR $L$short_avx - sub r9,0x80 - - vmovdqu xmm14,XMMWORD[112+r8] - vmovdqu xmm6,XMMWORD[((0-64))+rdx] - vpshufb xmm14,xmm14,xmm13 - vmovdqu xmm7,XMMWORD[((32-64))+rdx] - - vpunpckhqdq xmm9,xmm14,xmm14 - vmovdqu xmm15,XMMWORD[96+r8] - vpclmulqdq xmm0,xmm14,xmm6,0x00 - vpxor xmm9,xmm9,xmm14 - vpshufb xmm15,xmm15,xmm13 - vpclmulqdq xmm1,xmm14,xmm6,0x11 - vmovdqu xmm6,XMMWORD[((16-64))+rdx] - vpunpckhqdq xmm8,xmm15,xmm15 - vmovdqu xmm14,XMMWORD[80+r8] - vpclmulqdq xmm2,xmm9,xmm7,0x00 - vpxor xmm8,xmm8,xmm15 - - vpshufb xmm14,xmm14,xmm13 - vpclmulqdq xmm3,xmm15,xmm6,0x00 - vpunpckhqdq xmm9,xmm14,xmm14 - vpclmulqdq xmm4,xmm15,xmm6,0x11 - vmovdqu xmm6,XMMWORD[((48-64))+rdx] - vpxor xmm9,xmm9,xmm14 - vmovdqu xmm15,XMMWORD[64+r8] - vpclmulqdq xmm5,xmm8,xmm7,0x10 - vmovdqu xmm7,XMMWORD[((80-64))+rdx] - - vpshufb xmm15,xmm15,xmm13 - vpxor xmm3,xmm3,xmm0 - vpclmulqdq xmm0,xmm14,xmm6,0x00 - vpxor xmm4,xmm4,xmm1 - vpunpckhqdq xmm8,xmm15,xmm15 - vpclmulqdq xmm1,xmm14,xmm6,0x11 - vmovdqu xmm6,XMMWORD[((64-64))+rdx] - vpxor xmm5,xmm5,xmm2 - vpclmulqdq xmm2,xmm9,xmm7,0x00 - vpxor xmm8,xmm8,xmm15 - - vmovdqu xmm14,XMMWORD[48+r8] - vpxor xmm0,xmm0,xmm3 - vpclmulqdq xmm3,xmm15,xmm6,0x00 - vpxor xmm1,xmm1,xmm4 - vpshufb xmm14,xmm14,xmm13 - vpclmulqdq xmm4,xmm15,xmm6,0x11 - vmovdqu xmm6,XMMWORD[((96-64))+rdx] - vpxor xmm2,xmm2,xmm5 - vpunpckhqdq xmm9,xmm14,xmm14 - vpclmulqdq xmm5,xmm8,xmm7,0x10 - vmovdqu xmm7,XMMWORD[((128-64))+rdx] - vpxor xmm9,xmm9,xmm14 - - vmovdqu xmm15,XMMWORD[32+r8] - vpxor xmm3,xmm3,xmm0 - vpclmulqdq xmm0,xmm14,xmm6,0x00 - vpxor xmm4,xmm4,xmm1 - vpshufb xmm15,xmm15,xmm13 - vpclmulqdq xmm1,xmm14,xmm6,0x11 - vmovdqu xmm6,XMMWORD[((112-64))+rdx] - vpxor xmm5,xmm5,xmm2 - vpunpckhqdq xmm8,xmm15,xmm15 - vpclmulqdq xmm2,xmm9,xmm7,0x00 - vpxor xmm8,xmm8,xmm15 - - vmovdqu xmm14,XMMWORD[16+r8] - vpxor xmm0,xmm0,xmm3 - vpclmulqdq xmm3,xmm15,xmm6,0x00 - vpxor xmm1,xmm1,xmm4 - vpshufb xmm14,xmm14,xmm13 - vpclmulqdq xmm4,xmm15,xmm6,0x11 - vmovdqu xmm6,XMMWORD[((144-64))+rdx] - vpxor xmm2,xmm2,xmm5 - vpunpckhqdq xmm9,xmm14,xmm14 - vpclmulqdq xmm5,xmm8,xmm7,0x10 - vmovdqu xmm7,XMMWORD[((176-64))+rdx] - vpxor xmm9,xmm9,xmm14 - - vmovdqu xmm15,XMMWORD[r8] - vpxor xmm3,xmm3,xmm0 - vpclmulqdq xmm0,xmm14,xmm6,0x00 - vpxor xmm4,xmm4,xmm1 - vpshufb xmm15,xmm15,xmm13 - vpclmulqdq xmm1,xmm14,xmm6,0x11 - vmovdqu xmm6,XMMWORD[((160-64))+rdx] - vpxor xmm5,xmm5,xmm2 - vpclmulqdq xmm2,xmm9,xmm7,0x10 - - lea r8,[128+r8] - cmp r9,0x80 - jb NEAR $L$tail_avx - - vpxor xmm15,xmm15,xmm10 - sub r9,0x80 - jmp NEAR $L$oop8x_avx - -ALIGN 32 -$L$oop8x_avx: - vpunpckhqdq xmm8,xmm15,xmm15 - vmovdqu xmm14,XMMWORD[112+r8] - vpxor xmm3,xmm3,xmm0 - vpxor xmm8,xmm8,xmm15 - vpclmulqdq xmm10,xmm15,xmm6,0x00 - vpshufb xmm14,xmm14,xmm13 - vpxor xmm4,xmm4,xmm1 - vpclmulqdq xmm11,xmm15,xmm6,0x11 - vmovdqu xmm6,XMMWORD[((0-64))+rdx] - vpunpckhqdq xmm9,xmm14,xmm14 - vpxor xmm5,xmm5,xmm2 - vpclmulqdq xmm12,xmm8,xmm7,0x00 - vmovdqu xmm7,XMMWORD[((32-64))+rdx] - vpxor xmm9,xmm9,xmm14 - - vmovdqu xmm15,XMMWORD[96+r8] - vpclmulqdq xmm0,xmm14,xmm6,0x00 - vpxor xmm10,xmm10,xmm3 - vpshufb xmm15,xmm15,xmm13 - vpclmulqdq xmm1,xmm14,xmm6,0x11 - vxorps xmm11,xmm11,xmm4 - vmovdqu xmm6,XMMWORD[((16-64))+rdx] - vpunpckhqdq xmm8,xmm15,xmm15 - vpclmulqdq xmm2,xmm9,xmm7,0x00 - vpxor xmm12,xmm12,xmm5 - vxorps xmm8,xmm8,xmm15 - - vmovdqu xmm14,XMMWORD[80+r8] - vpxor xmm12,xmm12,xmm10 - vpclmulqdq xmm3,xmm15,xmm6,0x00 - vpxor xmm12,xmm12,xmm11 - vpslldq xmm9,xmm12,8 - vpxor xmm3,xmm3,xmm0 - vpclmulqdq xmm4,xmm15,xmm6,0x11 - vpsrldq xmm12,xmm12,8 - vpxor xmm10,xmm10,xmm9 - vmovdqu xmm6,XMMWORD[((48-64))+rdx] - vpshufb xmm14,xmm14,xmm13 - vxorps xmm11,xmm11,xmm12 - vpxor xmm4,xmm4,xmm1 - vpunpckhqdq xmm9,xmm14,xmm14 - vpclmulqdq xmm5,xmm8,xmm7,0x10 - vmovdqu xmm7,XMMWORD[((80-64))+rdx] - vpxor xmm9,xmm9,xmm14 - vpxor xmm5,xmm5,xmm2 - - vmovdqu xmm15,XMMWORD[64+r8] - vpalignr xmm12,xmm10,xmm10,8 - vpclmulqdq xmm0,xmm14,xmm6,0x00 - vpshufb xmm15,xmm15,xmm13 - vpxor xmm0,xmm0,xmm3 - vpclmulqdq xmm1,xmm14,xmm6,0x11 - vmovdqu xmm6,XMMWORD[((64-64))+rdx] - vpunpckhqdq xmm8,xmm15,xmm15 - vpxor xmm1,xmm1,xmm4 - vpclmulqdq xmm2,xmm9,xmm7,0x00 - vxorps xmm8,xmm8,xmm15 - vpxor xmm2,xmm2,xmm5 - - vmovdqu xmm14,XMMWORD[48+r8] - vpclmulqdq xmm10,xmm10,XMMWORD[r10],0x10 - vpclmulqdq xmm3,xmm15,xmm6,0x00 - vpshufb xmm14,xmm14,xmm13 - vpxor xmm3,xmm3,xmm0 - vpclmulqdq xmm4,xmm15,xmm6,0x11 - vmovdqu xmm6,XMMWORD[((96-64))+rdx] - vpunpckhqdq xmm9,xmm14,xmm14 - vpxor xmm4,xmm4,xmm1 - vpclmulqdq xmm5,xmm8,xmm7,0x10 - vmovdqu xmm7,XMMWORD[((128-64))+rdx] - vpxor xmm9,xmm9,xmm14 - vpxor xmm5,xmm5,xmm2 - - vmovdqu xmm15,XMMWORD[32+r8] - vpclmulqdq xmm0,xmm14,xmm6,0x00 - vpshufb xmm15,xmm15,xmm13 - vpxor xmm0,xmm0,xmm3 - vpclmulqdq xmm1,xmm14,xmm6,0x11 - vmovdqu xmm6,XMMWORD[((112-64))+rdx] - vpunpckhqdq xmm8,xmm15,xmm15 - vpxor xmm1,xmm1,xmm4 - vpclmulqdq xmm2,xmm9,xmm7,0x00 - vpxor xmm8,xmm8,xmm15 - vpxor xmm2,xmm2,xmm5 - vxorps xmm10,xmm10,xmm12 - - vmovdqu xmm14,XMMWORD[16+r8] - vpalignr xmm12,xmm10,xmm10,8 - vpclmulqdq xmm3,xmm15,xmm6,0x00 - vpshufb xmm14,xmm14,xmm13 - vpxor xmm3,xmm3,xmm0 - vpclmulqdq xmm4,xmm15,xmm6,0x11 - vmovdqu xmm6,XMMWORD[((144-64))+rdx] - vpclmulqdq xmm10,xmm10,XMMWORD[r10],0x10 - vxorps xmm12,xmm12,xmm11 - vpunpckhqdq xmm9,xmm14,xmm14 - vpxor xmm4,xmm4,xmm1 - vpclmulqdq xmm5,xmm8,xmm7,0x10 - vmovdqu xmm7,XMMWORD[((176-64))+rdx] - vpxor xmm9,xmm9,xmm14 - vpxor xmm5,xmm5,xmm2 - - vmovdqu xmm15,XMMWORD[r8] - vpclmulqdq xmm0,xmm14,xmm6,0x00 - vpshufb xmm15,xmm15,xmm13 - vpclmulqdq xmm1,xmm14,xmm6,0x11 - vmovdqu xmm6,XMMWORD[((160-64))+rdx] - vpxor xmm15,xmm15,xmm12 - vpclmulqdq xmm2,xmm9,xmm7,0x10 - vpxor xmm15,xmm15,xmm10 - - lea r8,[128+r8] - sub r9,0x80 - jnc NEAR $L$oop8x_avx - - add r9,0x80 - jmp NEAR $L$tail_no_xor_avx - -ALIGN 32 -$L$short_avx: - vmovdqu xmm14,XMMWORD[((-16))+r9*1+r8] - lea r8,[r9*1+r8] - vmovdqu xmm6,XMMWORD[((0-64))+rdx] - vmovdqu xmm7,XMMWORD[((32-64))+rdx] - vpshufb xmm15,xmm14,xmm13 - - vmovdqa xmm3,xmm0 - vmovdqa xmm4,xmm1 - vmovdqa xmm5,xmm2 - sub r9,0x10 - jz NEAR $L$tail_avx - - vpunpckhqdq xmm8,xmm15,xmm15 - vpxor xmm3,xmm3,xmm0 - vpclmulqdq xmm0,xmm15,xmm6,0x00 - vpxor xmm8,xmm8,xmm15 - vmovdqu xmm14,XMMWORD[((-32))+r8] - vpxor xmm4,xmm4,xmm1 - vpclmulqdq xmm1,xmm15,xmm6,0x11 - vmovdqu xmm6,XMMWORD[((16-64))+rdx] - vpshufb xmm15,xmm14,xmm13 - vpxor xmm5,xmm5,xmm2 - vpclmulqdq xmm2,xmm8,xmm7,0x00 - vpsrldq xmm7,xmm7,8 - sub r9,0x10 - jz NEAR $L$tail_avx - - vpunpckhqdq xmm8,xmm15,xmm15 - vpxor xmm3,xmm3,xmm0 - vpclmulqdq xmm0,xmm15,xmm6,0x00 - vpxor xmm8,xmm8,xmm15 - vmovdqu xmm14,XMMWORD[((-48))+r8] - vpxor xmm4,xmm4,xmm1 - vpclmulqdq xmm1,xmm15,xmm6,0x11 - vmovdqu xmm6,XMMWORD[((48-64))+rdx] - vpshufb xmm15,xmm14,xmm13 - vpxor xmm5,xmm5,xmm2 - vpclmulqdq xmm2,xmm8,xmm7,0x00 - vmovdqu xmm7,XMMWORD[((80-64))+rdx] - sub r9,0x10 - jz NEAR $L$tail_avx - - vpunpckhqdq xmm8,xmm15,xmm15 - vpxor xmm3,xmm3,xmm0 - vpclmulqdq xmm0,xmm15,xmm6,0x00 - vpxor xmm8,xmm8,xmm15 - vmovdqu xmm14,XMMWORD[((-64))+r8] - vpxor xmm4,xmm4,xmm1 - vpclmulqdq xmm1,xmm15,xmm6,0x11 - vmovdqu xmm6,XMMWORD[((64-64))+rdx] - vpshufb xmm15,xmm14,xmm13 - vpxor xmm5,xmm5,xmm2 - vpclmulqdq xmm2,xmm8,xmm7,0x00 - vpsrldq xmm7,xmm7,8 - sub r9,0x10 - jz NEAR $L$tail_avx - - vpunpckhqdq xmm8,xmm15,xmm15 - vpxor xmm3,xmm3,xmm0 - vpclmulqdq xmm0,xmm15,xmm6,0x00 - vpxor xmm8,xmm8,xmm15 - vmovdqu xmm14,XMMWORD[((-80))+r8] - vpxor xmm4,xmm4,xmm1 - vpclmulqdq xmm1,xmm15,xmm6,0x11 - vmovdqu xmm6,XMMWORD[((96-64))+rdx] - vpshufb xmm15,xmm14,xmm13 - vpxor xmm5,xmm5,xmm2 - vpclmulqdq xmm2,xmm8,xmm7,0x00 - vmovdqu xmm7,XMMWORD[((128-64))+rdx] - sub r9,0x10 - jz NEAR $L$tail_avx - - vpunpckhqdq xmm8,xmm15,xmm15 - vpxor xmm3,xmm3,xmm0 - vpclmulqdq xmm0,xmm15,xmm6,0x00 - vpxor xmm8,xmm8,xmm15 - vmovdqu xmm14,XMMWORD[((-96))+r8] - vpxor xmm4,xmm4,xmm1 - vpclmulqdq xmm1,xmm15,xmm6,0x11 - vmovdqu xmm6,XMMWORD[((112-64))+rdx] - vpshufb xmm15,xmm14,xmm13 - vpxor xmm5,xmm5,xmm2 - vpclmulqdq xmm2,xmm8,xmm7,0x00 - vpsrldq xmm7,xmm7,8 - sub r9,0x10 - jz NEAR $L$tail_avx - - vpunpckhqdq xmm8,xmm15,xmm15 - vpxor xmm3,xmm3,xmm0 - vpclmulqdq xmm0,xmm15,xmm6,0x00 - vpxor xmm8,xmm8,xmm15 - vmovdqu xmm14,XMMWORD[((-112))+r8] - vpxor xmm4,xmm4,xmm1 - vpclmulqdq xmm1,xmm15,xmm6,0x11 - vmovdqu xmm6,XMMWORD[((144-64))+rdx] - vpshufb xmm15,xmm14,xmm13 - vpxor xmm5,xmm5,xmm2 - vpclmulqdq xmm2,xmm8,xmm7,0x00 - vmovq xmm7,QWORD[((184-64))+rdx] - sub r9,0x10 - jmp NEAR $L$tail_avx - -ALIGN 32 -$L$tail_avx: - vpxor xmm15,xmm15,xmm10 -$L$tail_no_xor_avx: - vpunpckhqdq xmm8,xmm15,xmm15 - vpxor xmm3,xmm3,xmm0 - vpclmulqdq xmm0,xmm15,xmm6,0x00 - vpxor xmm8,xmm8,xmm15 - vpxor xmm4,xmm4,xmm1 - vpclmulqdq xmm1,xmm15,xmm6,0x11 - vpxor xmm5,xmm5,xmm2 - vpclmulqdq xmm2,xmm8,xmm7,0x00 - - vmovdqu xmm12,XMMWORD[r10] - - vpxor xmm10,xmm3,xmm0 - vpxor xmm11,xmm4,xmm1 - vpxor xmm5,xmm5,xmm2 - - vpxor xmm5,xmm5,xmm10 - vpxor xmm5,xmm5,xmm11 - vpslldq xmm9,xmm5,8 - vpsrldq xmm5,xmm5,8 - vpxor xmm10,xmm10,xmm9 - vpxor xmm11,xmm11,xmm5 - - vpclmulqdq xmm9,xmm10,xmm12,0x10 - vpalignr xmm10,xmm10,xmm10,8 - vpxor xmm10,xmm10,xmm9 - - vpclmulqdq xmm9,xmm10,xmm12,0x10 - vpalignr xmm10,xmm10,xmm10,8 - vpxor xmm10,xmm10,xmm11 - vpxor xmm10,xmm10,xmm9 - - cmp r9,0 - jne NEAR $L$short_avx - - vpshufb xmm10,xmm10,xmm13 - vmovdqu XMMWORD[rcx],xmm10 - vzeroupper - movaps xmm6,XMMWORD[rsp] - movaps xmm7,XMMWORD[16+rsp] - movaps xmm8,XMMWORD[32+rsp] - movaps xmm9,XMMWORD[48+rsp] - movaps xmm10,XMMWORD[64+rsp] - movaps xmm11,XMMWORD[80+rsp] - movaps xmm12,XMMWORD[96+rsp] - movaps xmm13,XMMWORD[112+rsp] - movaps xmm14,XMMWORD[128+rsp] - movaps xmm15,XMMWORD[144+rsp] - lea rsp,[168+rsp] -$L$SEH_end_GFp_gcm_ghash_avx: - DB 0F3h,0C3h ;repret - - -ALIGN 64 -$L$bswap_mask: -DB 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 -$L$0x1c2_polynomial: -DB 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xc2 -$L$7_mask: - DD 7,0,7,0 -ALIGN 64 - -DB 71,72,65,83,72,32,102,111,114,32,120,56,54,95,54,52 -DB 44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32 -DB 60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111 -DB 114,103,62,0 -ALIGN 64 -section .pdata rdata align=4 -ALIGN 4 - DD $L$SEH_begin_GFp_gcm_init_clmul wrt ..imagebase - DD $L$SEH_end_GFp_gcm_init_clmul wrt ..imagebase - DD $L$SEH_info_GFp_gcm_init_clmul wrt ..imagebase - - DD $L$SEH_begin_GFp_gcm_ghash_clmul wrt ..imagebase - DD $L$SEH_end_GFp_gcm_ghash_clmul wrt ..imagebase - DD $L$SEH_info_GFp_gcm_ghash_clmul wrt ..imagebase - DD $L$SEH_begin_GFp_gcm_init_avx wrt ..imagebase - DD $L$SEH_end_GFp_gcm_init_avx wrt ..imagebase - DD $L$SEH_info_GFp_gcm_init_clmul wrt ..imagebase - - DD $L$SEH_begin_GFp_gcm_ghash_avx wrt ..imagebase - DD $L$SEH_end_GFp_gcm_ghash_avx wrt ..imagebase - DD $L$SEH_info_GFp_gcm_ghash_clmul wrt ..imagebase -section .xdata rdata align=8 -ALIGN 8 -$L$SEH_info_GFp_gcm_init_clmul: -DB 0x01,0x08,0x03,0x00 -DB 0x08,0x68,0x00,0x00 -DB 0x04,0x22,0x00,0x00 -$L$SEH_info_GFp_gcm_ghash_clmul: -DB 0x01,0x33,0x16,0x00 -DB 0x33,0xf8,0x09,0x00 -DB 0x2e,0xe8,0x08,0x00 -DB 0x29,0xd8,0x07,0x00 -DB 0x24,0xc8,0x06,0x00 -DB 0x1f,0xb8,0x05,0x00 -DB 0x1a,0xa8,0x04,0x00 -DB 0x15,0x98,0x03,0x00 -DB 0x10,0x88,0x02,0x00 -DB 0x0c,0x78,0x01,0x00 -DB 0x08,0x68,0x00,0x00 -DB 0x04,0x01,0x15,0x00 diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/tmp/ghash-x86-win32n.asm temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/tmp/ghash-x86-win32n.asm --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/tmp/ghash-x86-win32n.asm 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/tmp/ghash-x86-win32n.asm 1970-01-01 00:00:00.000000000 +0000 @@ -1,359 +0,0 @@ -; This file is generated from a similarly-named Perl script in the BoringSSL -; source tree. Do not edit by hand. - -%ifdef BORINGSSL_PREFIX -%include "boringssl_prefix_symbols_nasm.inc" -%endif -%ifidn __OUTPUT_FORMAT__,obj -section code use32 class=code align=64 -%elifidn __OUTPUT_FORMAT__,win32 -$@feat.00 equ 1 -section .text code align=64 -%else -section .text code -%endif -global _GFp_gcm_init_clmul -align 16 -_GFp_gcm_init_clmul: -L$_GFp_gcm_init_clmul_begin: - mov edx,DWORD [4+esp] - mov eax,DWORD [8+esp] - call L$000pic -L$000pic: - pop ecx - lea ecx,[(L$bswap-L$000pic)+ecx] - movdqu xmm2,[eax] - pshufd xmm2,xmm2,78 - pshufd xmm4,xmm2,255 - movdqa xmm3,xmm2 - psllq xmm2,1 - pxor xmm5,xmm5 - psrlq xmm3,63 - pcmpgtd xmm5,xmm4 - pslldq xmm3,8 - por xmm2,xmm3 - pand xmm5,[16+ecx] - pxor xmm2,xmm5 - movdqa xmm0,xmm2 - movdqa xmm1,xmm0 - pshufd xmm3,xmm0,78 - pshufd xmm4,xmm2,78 - pxor xmm3,xmm0 - pxor xmm4,xmm2 -db 102,15,58,68,194,0 -db 102,15,58,68,202,17 -db 102,15,58,68,220,0 - xorps xmm3,xmm0 - xorps xmm3,xmm1 - movdqa xmm4,xmm3 - psrldq xmm3,8 - pslldq xmm4,8 - pxor xmm1,xmm3 - pxor xmm0,xmm4 - movdqa xmm4,xmm0 - movdqa xmm3,xmm0 - psllq xmm0,5 - pxor xmm3,xmm0 - psllq xmm0,1 - pxor xmm0,xmm3 - psllq xmm0,57 - movdqa xmm3,xmm0 - pslldq xmm0,8 - psrldq xmm3,8 - pxor xmm0,xmm4 - pxor xmm1,xmm3 - movdqa xmm4,xmm0 - psrlq xmm0,1 - pxor xmm1,xmm4 - pxor xmm4,xmm0 - psrlq xmm0,5 - pxor xmm0,xmm4 - psrlq xmm0,1 - pxor xmm0,xmm1 - pshufd xmm3,xmm2,78 - pshufd xmm4,xmm0,78 - pxor xmm3,xmm2 - movdqu [edx],xmm2 - pxor xmm4,xmm0 - movdqu [16+edx],xmm0 -db 102,15,58,15,227,8 - movdqu [32+edx],xmm4 - ret -global _GFp_gcm_gmult_clmul -align 16 -_GFp_gcm_gmult_clmul: -L$_GFp_gcm_gmult_clmul_begin: - mov eax,DWORD [4+esp] - mov edx,DWORD [8+esp] - call L$001pic -L$001pic: - pop ecx - lea ecx,[(L$bswap-L$001pic)+ecx] - movdqu xmm0,[eax] - movdqa xmm5,[ecx] - movups xmm2,[edx] -db 102,15,56,0,197 - movups xmm4,[32+edx] - movdqa xmm1,xmm0 - pshufd xmm3,xmm0,78 - pxor xmm3,xmm0 -db 102,15,58,68,194,0 -db 102,15,58,68,202,17 -db 102,15,58,68,220,0 - xorps xmm3,xmm0 - xorps xmm3,xmm1 - movdqa xmm4,xmm3 - psrldq xmm3,8 - pslldq xmm4,8 - pxor xmm1,xmm3 - pxor xmm0,xmm4 - movdqa xmm4,xmm0 - movdqa xmm3,xmm0 - psllq xmm0,5 - pxor xmm3,xmm0 - psllq xmm0,1 - pxor xmm0,xmm3 - psllq xmm0,57 - movdqa xmm3,xmm0 - pslldq xmm0,8 - psrldq xmm3,8 - pxor xmm0,xmm4 - pxor xmm1,xmm3 - movdqa xmm4,xmm0 - psrlq xmm0,1 - pxor xmm1,xmm4 - pxor xmm4,xmm0 - psrlq xmm0,5 - pxor xmm0,xmm4 - psrlq xmm0,1 - pxor xmm0,xmm1 -db 102,15,56,0,197 - movdqu [eax],xmm0 - ret -global _GFp_gcm_ghash_clmul -align 16 -_GFp_gcm_ghash_clmul: -L$_GFp_gcm_ghash_clmul_begin: - push ebp - push ebx - push esi - push edi - mov eax,DWORD [20+esp] - mov edx,DWORD [24+esp] - mov esi,DWORD [28+esp] - mov ebx,DWORD [32+esp] - call L$002pic -L$002pic: - pop ecx - lea ecx,[(L$bswap-L$002pic)+ecx] - movdqu xmm0,[eax] - movdqa xmm5,[ecx] - movdqu xmm2,[edx] -db 102,15,56,0,197 - sub ebx,16 - jz NEAR L$003odd_tail - movdqu xmm3,[esi] - movdqu xmm6,[16+esi] -db 102,15,56,0,221 -db 102,15,56,0,245 - movdqu xmm5,[32+edx] - pxor xmm0,xmm3 - pshufd xmm3,xmm6,78 - movdqa xmm7,xmm6 - pxor xmm3,xmm6 - lea esi,[32+esi] -db 102,15,58,68,242,0 -db 102,15,58,68,250,17 -db 102,15,58,68,221,0 - movups xmm2,[16+edx] - nop - sub ebx,32 - jbe NEAR L$004even_tail - jmp NEAR L$005mod_loop -align 32 -L$005mod_loop: - pshufd xmm4,xmm0,78 - movdqa xmm1,xmm0 - pxor xmm4,xmm0 - nop -db 102,15,58,68,194,0 -db 102,15,58,68,202,17 -db 102,15,58,68,229,16 - movups xmm2,[edx] - xorps xmm0,xmm6 - movdqa xmm5,[ecx] - xorps xmm1,xmm7 - movdqu xmm7,[esi] - pxor xmm3,xmm0 - movdqu xmm6,[16+esi] - pxor xmm3,xmm1 -db 102,15,56,0,253 - pxor xmm4,xmm3 - movdqa xmm3,xmm4 - psrldq xmm4,8 - pslldq xmm3,8 - pxor xmm1,xmm4 - pxor xmm0,xmm3 -db 102,15,56,0,245 - pxor xmm1,xmm7 - movdqa xmm7,xmm6 - movdqa xmm4,xmm0 - movdqa xmm3,xmm0 - psllq xmm0,5 - pxor xmm3,xmm0 - psllq xmm0,1 - pxor xmm0,xmm3 -db 102,15,58,68,242,0 - movups xmm5,[32+edx] - psllq xmm0,57 - movdqa xmm3,xmm0 - pslldq xmm0,8 - psrldq xmm3,8 - pxor xmm0,xmm4 - pxor xmm1,xmm3 - pshufd xmm3,xmm7,78 - movdqa xmm4,xmm0 - psrlq xmm0,1 - pxor xmm3,xmm7 - pxor xmm1,xmm4 -db 102,15,58,68,250,17 - movups xmm2,[16+edx] - pxor xmm4,xmm0 - psrlq xmm0,5 - pxor xmm0,xmm4 - psrlq xmm0,1 - pxor xmm0,xmm1 -db 102,15,58,68,221,0 - lea esi,[32+esi] - sub ebx,32 - ja NEAR L$005mod_loop -L$004even_tail: - pshufd xmm4,xmm0,78 - movdqa xmm1,xmm0 - pxor xmm4,xmm0 -db 102,15,58,68,194,0 -db 102,15,58,68,202,17 -db 102,15,58,68,229,16 - movdqa xmm5,[ecx] - xorps xmm0,xmm6 - xorps xmm1,xmm7 - pxor xmm3,xmm0 - pxor xmm3,xmm1 - pxor xmm4,xmm3 - movdqa xmm3,xmm4 - psrldq xmm4,8 - pslldq xmm3,8 - pxor xmm1,xmm4 - pxor xmm0,xmm3 - movdqa xmm4,xmm0 - movdqa xmm3,xmm0 - psllq xmm0,5 - pxor xmm3,xmm0 - psllq xmm0,1 - pxor xmm0,xmm3 - psllq xmm0,57 - movdqa xmm3,xmm0 - pslldq xmm0,8 - psrldq xmm3,8 - pxor xmm0,xmm4 - pxor xmm1,xmm3 - movdqa xmm4,xmm0 - psrlq xmm0,1 - pxor xmm1,xmm4 - pxor xmm4,xmm0 - psrlq xmm0,5 - pxor xmm0,xmm4 - psrlq xmm0,1 - pxor xmm0,xmm1 - test ebx,ebx - jnz NEAR L$006done - movups xmm2,[edx] -L$003odd_tail: - movdqu xmm3,[esi] -db 102,15,56,0,221 - pxor xmm0,xmm3 - movdqa xmm1,xmm0 - pshufd xmm3,xmm0,78 - pshufd xmm4,xmm2,78 - pxor xmm3,xmm0 - pxor xmm4,xmm2 -db 102,15,58,68,194,0 -db 102,15,58,68,202,17 -db 102,15,58,68,220,0 - xorps xmm3,xmm0 - xorps xmm3,xmm1 - movdqa xmm4,xmm3 - psrldq xmm3,8 - pslldq xmm4,8 - pxor xmm1,xmm3 - pxor xmm0,xmm4 - movdqa xmm4,xmm0 - movdqa xmm3,xmm0 - psllq xmm0,5 - pxor xmm3,xmm0 - psllq xmm0,1 - pxor xmm0,xmm3 - psllq xmm0,57 - movdqa xmm3,xmm0 - pslldq xmm0,8 - psrldq xmm3,8 - pxor xmm0,xmm4 - pxor xmm1,xmm3 - movdqa xmm4,xmm0 - psrlq xmm0,1 - pxor xmm1,xmm4 - pxor xmm4,xmm0 - psrlq xmm0,5 - pxor xmm0,xmm4 - psrlq xmm0,1 - pxor xmm0,xmm1 -L$006done: -db 102,15,56,0,197 - movdqu [eax],xmm0 - pop edi - pop esi - pop ebx - pop ebp - ret -align 64 -L$bswap: -db 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 -db 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,194 -align 64 -L$007rem_8bit: -dw 0,450,900,582,1800,1738,1164,1358 -dw 3600,4050,3476,3158,2328,2266,2716,2910 -dw 7200,7650,8100,7782,6952,6890,6316,6510 -dw 4656,5106,4532,4214,5432,5370,5820,6014 -dw 14400,14722,15300,14854,16200,16010,15564,15630 -dw 13904,14226,13780,13334,12632,12442,13020,13086 -dw 9312,9634,10212,9766,9064,8874,8428,8494 -dw 10864,11186,10740,10294,11640,11450,12028,12094 -dw 28800,28994,29444,29382,30600,30282,29708,30158 -dw 32400,32594,32020,31958,31128,30810,31260,31710 -dw 27808,28002,28452,28390,27560,27242,26668,27118 -dw 25264,25458,24884,24822,26040,25722,26172,26622 -dw 18624,18690,19268,19078,20424,19978,19532,19854 -dw 18128,18194,17748,17558,16856,16410,16988,17310 -dw 21728,21794,22372,22182,21480,21034,20588,20910 -dw 23280,23346,22900,22710,24056,23610,24188,24510 -dw 57600,57538,57988,58182,58888,59338,58764,58446 -dw 61200,61138,60564,60758,59416,59866,60316,59998 -dw 64800,64738,65188,65382,64040,64490,63916,63598 -dw 62256,62194,61620,61814,62520,62970,63420,63102 -dw 55616,55426,56004,56070,56904,57226,56780,56334 -dw 55120,54930,54484,54550,53336,53658,54236,53790 -dw 50528,50338,50916,50982,49768,50090,49644,49198 -dw 52080,51890,51444,51510,52344,52666,53244,52798 -dw 37248,36930,37380,37830,38536,38730,38156,38094 -dw 40848,40530,39956,40406,39064,39258,39708,39646 -dw 36256,35938,36388,36838,35496,35690,35116,35054 -dw 33712,33394,32820,33270,33976,34170,34620,34558 -dw 43456,43010,43588,43910,44744,44810,44364,44174 -dw 42960,42514,42068,42390,41176,41242,41820,41630 -dw 46560,46114,46692,47014,45800,45866,45420,45230 -dw 48112,47666,47220,47542,48376,48442,49020,48830 -db 71,72,65,83,72,32,102,111,114,32,120,56,54,44,32,67 -db 82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112 -db 112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62 -db 0 diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/tmp/p256-x86_64-asm-nasm.asm temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/tmp/p256-x86_64-asm-nasm.asm --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/tmp/p256-x86_64-asm-nasm.asm 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/tmp/p256-x86_64-asm-nasm.asm 1970-01-01 00:00:00.000000000 +0000 @@ -1,5037 +0,0 @@ -; This file is generated from a similarly-named Perl script in the BoringSSL -; source tree. Do not edit by hand. - -default rel -%define XMMWORD -%define YMMWORD -%define ZMMWORD -section .text code align=64 - -EXTERN GFp_ia32cap_P - - -ALIGN 64 -$L$poly: - DQ 0xffffffffffffffff,0x00000000ffffffff,0x0000000000000000,0xffffffff00000001 - -$L$One: - DD 1,1,1,1,1,1,1,1 -$L$Two: - DD 2,2,2,2,2,2,2,2 -$L$Three: - DD 3,3,3,3,3,3,3,3 -$L$ONE_mont: - DQ 0x0000000000000001,0xffffffff00000000,0xffffffffffffffff,0x00000000fffffffe - - -$L$ord: - DQ 0xf3b9cac2fc632551,0xbce6faada7179e84,0xffffffffffffffff,0xffffffff00000000 -$L$ordK: - DQ 0xccd1c8aaee00bc4f - - - -global GFp_nistz256_add - -ALIGN 32 -GFp_nistz256_add: - mov QWORD[8+rsp],rdi ;WIN64 prologue - mov QWORD[16+rsp],rsi - mov rax,rsp -$L$SEH_begin_GFp_nistz256_add: - mov rdi,rcx - mov rsi,rdx - mov rdx,r8 - - - push r12 - push r13 - - mov r8,QWORD[rsi] - xor r13,r13 - mov r9,QWORD[8+rsi] - mov r10,QWORD[16+rsi] - mov r11,QWORD[24+rsi] - lea rsi,[$L$poly] - - add r8,QWORD[rdx] - adc r9,QWORD[8+rdx] - mov rax,r8 - adc r10,QWORD[16+rdx] - adc r11,QWORD[24+rdx] - mov rdx,r9 - adc r13,0 - - sub r8,QWORD[rsi] - mov rcx,r10 - sbb r9,QWORD[8+rsi] - sbb r10,QWORD[16+rsi] - mov r12,r11 - sbb r11,QWORD[24+rsi] - sbb r13,0 - - cmovc r8,rax - cmovc r9,rdx - mov QWORD[rdi],r8 - cmovc r10,rcx - mov QWORD[8+rdi],r9 - cmovc r11,r12 - mov QWORD[16+rdi],r10 - mov QWORD[24+rdi],r11 - - pop r13 - pop r12 - mov rdi,QWORD[8+rsp] ;WIN64 epilogue - mov rsi,QWORD[16+rsp] - DB 0F3h,0C3h ;repret -$L$SEH_end_GFp_nistz256_add: - - - -global GFp_nistz256_neg - -ALIGN 32 -GFp_nistz256_neg: - mov QWORD[8+rsp],rdi ;WIN64 prologue - mov QWORD[16+rsp],rsi - mov rax,rsp -$L$SEH_begin_GFp_nistz256_neg: - mov rdi,rcx - mov rsi,rdx - - - - push r12 - - push r13 - -$L$neg_body: - - xor r8,r8 - xor r9,r9 - xor r10,r10 - xor r11,r11 - xor r13,r13 - - sub r8,QWORD[rsi] - sbb r9,QWORD[8+rsi] - sbb r10,QWORD[16+rsi] - mov rax,r8 - sbb r11,QWORD[24+rsi] - lea rsi,[$L$poly] - mov rdx,r9 - sbb r13,0 - - add r8,QWORD[rsi] - mov rcx,r10 - adc r9,QWORD[8+rsi] - adc r10,QWORD[16+rsi] - mov r12,r11 - adc r11,QWORD[24+rsi] - test r13,r13 - - cmovz r8,rax - cmovz r9,rdx - mov QWORD[rdi],r8 - cmovz r10,rcx - mov QWORD[8+rdi],r9 - cmovz r11,r12 - mov QWORD[16+rdi],r10 - mov QWORD[24+rdi],r11 - - mov r13,QWORD[rsp] - - mov r12,QWORD[8+rsp] - - lea rsp,[16+rsp] - -$L$neg_epilogue: - mov rdi,QWORD[8+rsp] ;WIN64 epilogue - mov rsi,QWORD[16+rsp] - DB 0F3h,0C3h ;repret - -$L$SEH_end_GFp_nistz256_neg: - - - - - - -global GFp_p256_scalar_mul_mont - -ALIGN 32 -GFp_p256_scalar_mul_mont: - mov QWORD[8+rsp],rdi ;WIN64 prologue - mov QWORD[16+rsp],rsi - mov rax,rsp -$L$SEH_begin_GFp_p256_scalar_mul_mont: - mov rdi,rcx - mov rsi,rdx - mov rdx,r8 - - - - lea rcx,[GFp_ia32cap_P] - mov rcx,QWORD[8+rcx] - and ecx,0x80100 - cmp ecx,0x80100 - je NEAR $L$ecp_nistz256_ord_mul_montx - push rbp - - push rbx - - push r12 - - push r13 - - push r14 - - push r15 - -$L$ord_mul_body: - - mov rax,QWORD[rdx] - mov rbx,rdx - lea r14,[$L$ord] - mov r15,QWORD[$L$ordK] - - - mov rcx,rax - mul QWORD[rsi] - mov r8,rax - mov rax,rcx - mov r9,rdx - - mul QWORD[8+rsi] - add r9,rax - mov rax,rcx - adc rdx,0 - mov r10,rdx - - mul QWORD[16+rsi] - add r10,rax - mov rax,rcx - adc rdx,0 - - mov r13,r8 - imul r8,r15 - - mov r11,rdx - mul QWORD[24+rsi] - add r11,rax - mov rax,r8 - adc rdx,0 - mov r12,rdx - - - mul QWORD[r14] - mov rbp,r8 - add r13,rax - mov rax,r8 - adc rdx,0 - mov rcx,rdx - - sub r10,r8 - sbb r8,0 - - mul QWORD[8+r14] - add r9,rcx - adc rdx,0 - add r9,rax - mov rax,rbp - adc r10,rdx - mov rdx,rbp - adc r8,0 - - shl rax,32 - shr rdx,32 - sub r11,rax - mov rax,QWORD[8+rbx] - sbb rbp,rdx - - add r11,r8 - adc r12,rbp - adc r13,0 - - - mov rcx,rax - mul QWORD[rsi] - add r9,rax - mov rax,rcx - adc rdx,0 - mov rbp,rdx - - mul QWORD[8+rsi] - add r10,rbp - adc rdx,0 - add r10,rax - mov rax,rcx - adc rdx,0 - mov rbp,rdx - - mul QWORD[16+rsi] - add r11,rbp - adc rdx,0 - add r11,rax - mov rax,rcx - adc rdx,0 - - mov rcx,r9 - imul r9,r15 - - mov rbp,rdx - mul QWORD[24+rsi] - add r12,rbp - adc rdx,0 - xor r8,r8 - add r12,rax - mov rax,r9 - adc r13,rdx - adc r8,0 - - - mul QWORD[r14] - mov rbp,r9 - add rcx,rax - mov rax,r9 - adc rcx,rdx - - sub r11,r9 - sbb r9,0 - - mul QWORD[8+r14] - add r10,rcx - adc rdx,0 - add r10,rax - mov rax,rbp - adc r11,rdx - mov rdx,rbp - adc r9,0 - - shl rax,32 - shr rdx,32 - sub r12,rax - mov rax,QWORD[16+rbx] - sbb rbp,rdx - - add r12,r9 - adc r13,rbp - adc r8,0 - - - mov rcx,rax - mul QWORD[rsi] - add r10,rax - mov rax,rcx - adc rdx,0 - mov rbp,rdx - - mul QWORD[8+rsi] - add r11,rbp - adc rdx,0 - add r11,rax - mov rax,rcx - adc rdx,0 - mov rbp,rdx - - mul QWORD[16+rsi] - add r12,rbp - adc rdx,0 - add r12,rax - mov rax,rcx - adc rdx,0 - - mov rcx,r10 - imul r10,r15 - - mov rbp,rdx - mul QWORD[24+rsi] - add r13,rbp - adc rdx,0 - xor r9,r9 - add r13,rax - mov rax,r10 - adc r8,rdx - adc r9,0 - - - mul QWORD[r14] - mov rbp,r10 - add rcx,rax - mov rax,r10 - adc rcx,rdx - - sub r12,r10 - sbb r10,0 - - mul QWORD[8+r14] - add r11,rcx - adc rdx,0 - add r11,rax - mov rax,rbp - adc r12,rdx - mov rdx,rbp - adc r10,0 - - shl rax,32 - shr rdx,32 - sub r13,rax - mov rax,QWORD[24+rbx] - sbb rbp,rdx - - add r13,r10 - adc r8,rbp - adc r9,0 - - - mov rcx,rax - mul QWORD[rsi] - add r11,rax - mov rax,rcx - adc rdx,0 - mov rbp,rdx - - mul QWORD[8+rsi] - add r12,rbp - adc rdx,0 - add r12,rax - mov rax,rcx - adc rdx,0 - mov rbp,rdx - - mul QWORD[16+rsi] - add r13,rbp - adc rdx,0 - add r13,rax - mov rax,rcx - adc rdx,0 - - mov rcx,r11 - imul r11,r15 - - mov rbp,rdx - mul QWORD[24+rsi] - add r8,rbp - adc rdx,0 - xor r10,r10 - add r8,rax - mov rax,r11 - adc r9,rdx - adc r10,0 - - - mul QWORD[r14] - mov rbp,r11 - add rcx,rax - mov rax,r11 - adc rcx,rdx - - sub r13,r11 - sbb r11,0 - - mul QWORD[8+r14] - add r12,rcx - adc rdx,0 - add r12,rax - mov rax,rbp - adc r13,rdx - mov rdx,rbp - adc r11,0 - - shl rax,32 - shr rdx,32 - sub r8,rax - sbb rbp,rdx - - add r8,r11 - adc r9,rbp - adc r10,0 - - - mov rsi,r12 - sub r12,QWORD[r14] - mov r11,r13 - sbb r13,QWORD[8+r14] - mov rcx,r8 - sbb r8,QWORD[16+r14] - mov rbp,r9 - sbb r9,QWORD[24+r14] - sbb r10,0 - - cmovc r12,rsi - cmovc r13,r11 - cmovc r8,rcx - cmovc r9,rbp - - mov QWORD[rdi],r12 - mov QWORD[8+rdi],r13 - mov QWORD[16+rdi],r8 - mov QWORD[24+rdi],r9 - - mov r15,QWORD[rsp] - - mov r14,QWORD[8+rsp] - - mov r13,QWORD[16+rsp] - - mov r12,QWORD[24+rsp] - - mov rbx,QWORD[32+rsp] - - mov rbp,QWORD[40+rsp] - - lea rsp,[48+rsp] - -$L$ord_mul_epilogue: - mov rdi,QWORD[8+rsp] ;WIN64 epilogue - mov rsi,QWORD[16+rsp] - DB 0F3h,0C3h ;repret - -$L$SEH_end_GFp_p256_scalar_mul_mont: - - - - - - - -global GFp_p256_scalar_sqr_rep_mont - -ALIGN 32 -GFp_p256_scalar_sqr_rep_mont: - mov QWORD[8+rsp],rdi ;WIN64 prologue - mov QWORD[16+rsp],rsi - mov rax,rsp -$L$SEH_begin_GFp_p256_scalar_sqr_rep_mont: - mov rdi,rcx - mov rsi,rdx - mov rdx,r8 - - - - lea rcx,[GFp_ia32cap_P] - mov rcx,QWORD[8+rcx] - and ecx,0x80100 - cmp ecx,0x80100 - je NEAR $L$ecp_nistz256_ord_sqr_montx - push rbp - - push rbx - - push r12 - - push r13 - - push r14 - - push r15 - -$L$ord_sqr_body: - - mov r8,QWORD[rsi] - mov rax,QWORD[8+rsi] - mov r14,QWORD[16+rsi] - mov r15,QWORD[24+rsi] - lea rsi,[$L$ord] - mov rbx,rdx - jmp NEAR $L$oop_ord_sqr - -ALIGN 32 -$L$oop_ord_sqr: - - mov rbp,rax - mul r8 - mov r9,rax -DB 102,72,15,110,205 - mov rax,r14 - mov r10,rdx - - mul r8 - add r10,rax - mov rax,r15 -DB 102,73,15,110,214 - adc rdx,0 - mov r11,rdx - - mul r8 - add r11,rax - mov rax,r15 -DB 102,73,15,110,223 - adc rdx,0 - mov r12,rdx - - - mul r14 - mov r13,rax - mov rax,r14 - mov r14,rdx - - - mul rbp - add r11,rax - mov rax,r15 - adc rdx,0 - mov r15,rdx - - mul rbp - add r12,rax - adc rdx,0 - - add r12,r15 - adc r13,rdx - adc r14,0 - - - xor r15,r15 - mov rax,r8 - add r9,r9 - adc r10,r10 - adc r11,r11 - adc r12,r12 - adc r13,r13 - adc r14,r14 - adc r15,0 - - - mul rax - mov r8,rax -DB 102,72,15,126,200 - mov rbp,rdx - - mul rax - add r9,rbp - adc r10,rax -DB 102,72,15,126,208 - adc rdx,0 - mov rbp,rdx - - mul rax - add r11,rbp - adc r12,rax -DB 102,72,15,126,216 - adc rdx,0 - mov rbp,rdx - - mov rcx,r8 - imul r8,QWORD[32+rsi] - - mul rax - add r13,rbp - adc r14,rax - mov rax,QWORD[rsi] - adc r15,rdx - - - mul r8 - mov rbp,r8 - add rcx,rax - mov rax,QWORD[8+rsi] - adc rcx,rdx - - sub r10,r8 - sbb rbp,0 - - mul r8 - add r9,rcx - adc rdx,0 - add r9,rax - mov rax,r8 - adc r10,rdx - mov rdx,r8 - adc rbp,0 - - mov rcx,r9 - imul r9,QWORD[32+rsi] - - shl rax,32 - shr rdx,32 - sub r11,rax - mov rax,QWORD[rsi] - sbb r8,rdx - - add r11,rbp - adc r8,0 - - - mul r9 - mov rbp,r9 - add rcx,rax - mov rax,QWORD[8+rsi] - adc rcx,rdx - - sub r11,r9 - sbb rbp,0 - - mul r9 - add r10,rcx - adc rdx,0 - add r10,rax - mov rax,r9 - adc r11,rdx - mov rdx,r9 - adc rbp,0 - - mov rcx,r10 - imul r10,QWORD[32+rsi] - - shl rax,32 - shr rdx,32 - sub r8,rax - mov rax,QWORD[rsi] - sbb r9,rdx - - add r8,rbp - adc r9,0 - - - mul r10 - mov rbp,r10 - add rcx,rax - mov rax,QWORD[8+rsi] - adc rcx,rdx - - sub r8,r10 - sbb rbp,0 - - mul r10 - add r11,rcx - adc rdx,0 - add r11,rax - mov rax,r10 - adc r8,rdx - mov rdx,r10 - adc rbp,0 - - mov rcx,r11 - imul r11,QWORD[32+rsi] - - shl rax,32 - shr rdx,32 - sub r9,rax - mov rax,QWORD[rsi] - sbb r10,rdx - - add r9,rbp - adc r10,0 - - - mul r11 - mov rbp,r11 - add rcx,rax - mov rax,QWORD[8+rsi] - adc rcx,rdx - - sub r9,r11 - sbb rbp,0 - - mul r11 - add r8,rcx - adc rdx,0 - add r8,rax - mov rax,r11 - adc r9,rdx - mov rdx,r11 - adc rbp,0 - - shl rax,32 - shr rdx,32 - sub r10,rax - sbb r11,rdx - - add r10,rbp - adc r11,0 - - - xor rdx,rdx - add r8,r12 - adc r9,r13 - mov r12,r8 - adc r10,r14 - adc r11,r15 - mov rax,r9 - adc rdx,0 - - - sub r8,QWORD[rsi] - mov r14,r10 - sbb r9,QWORD[8+rsi] - sbb r10,QWORD[16+rsi] - mov r15,r11 - sbb r11,QWORD[24+rsi] - sbb rdx,0 - - cmovc r8,r12 - cmovnc rax,r9 - cmovnc r14,r10 - cmovnc r15,r11 - - dec rbx - jnz NEAR $L$oop_ord_sqr - - mov QWORD[rdi],r8 - mov QWORD[8+rdi],rax - pxor xmm1,xmm1 - mov QWORD[16+rdi],r14 - pxor xmm2,xmm2 - mov QWORD[24+rdi],r15 - pxor xmm3,xmm3 - - mov r15,QWORD[rsp] - - mov r14,QWORD[8+rsp] - - mov r13,QWORD[16+rsp] - - mov r12,QWORD[24+rsp] - - mov rbx,QWORD[32+rsp] - - mov rbp,QWORD[40+rsp] - - lea rsp,[48+rsp] - -$L$ord_sqr_epilogue: - mov rdi,QWORD[8+rsp] ;WIN64 epilogue - mov rsi,QWORD[16+rsp] - DB 0F3h,0C3h ;repret - -$L$SEH_end_GFp_p256_scalar_sqr_rep_mont: - - -ALIGN 32 -ecp_nistz256_ord_mul_montx: - mov QWORD[8+rsp],rdi ;WIN64 prologue - mov QWORD[16+rsp],rsi - mov rax,rsp -$L$SEH_begin_ecp_nistz256_ord_mul_montx: - mov rdi,rcx - mov rsi,rdx - mov rdx,r8 - - - -$L$ecp_nistz256_ord_mul_montx: - push rbp - - push rbx - - push r12 - - push r13 - - push r14 - - push r15 - -$L$ord_mulx_body: - - mov rbx,rdx - mov rdx,QWORD[rdx] - mov r9,QWORD[rsi] - mov r10,QWORD[8+rsi] - mov r11,QWORD[16+rsi] - mov r12,QWORD[24+rsi] - lea rsi,[((-128))+rsi] - lea r14,[(($L$ord-128))] - mov r15,QWORD[$L$ordK] - - - mulx r9,r8,r9 - mulx r10,rcx,r10 - mulx r11,rbp,r11 - add r9,rcx - mulx r12,rcx,r12 - mov rdx,r8 - mulx rax,rdx,r15 - adc r10,rbp - adc r11,rcx - adc r12,0 - - - xor r13,r13 - mulx rbp,rcx,QWORD[((0+128))+r14] - adcx r8,rcx - adox r9,rbp - - mulx rbp,rcx,QWORD[((8+128))+r14] - adcx r9,rcx - adox r10,rbp - - mulx rbp,rcx,QWORD[((16+128))+r14] - adcx r10,rcx - adox r11,rbp - - mulx rbp,rcx,QWORD[((24+128))+r14] - mov rdx,QWORD[8+rbx] - adcx r11,rcx - adox r12,rbp - adcx r12,r8 - adox r13,r8 - adc r13,0 - - - mulx rbp,rcx,QWORD[((0+128))+rsi] - adcx r9,rcx - adox r10,rbp - - mulx rbp,rcx,QWORD[((8+128))+rsi] - adcx r10,rcx - adox r11,rbp - - mulx rbp,rcx,QWORD[((16+128))+rsi] - adcx r11,rcx - adox r12,rbp - - mulx rbp,rcx,QWORD[((24+128))+rsi] - mov rdx,r9 - mulx rax,rdx,r15 - adcx r12,rcx - adox r13,rbp - - adcx r13,r8 - adox r8,r8 - adc r8,0 - - - mulx rbp,rcx,QWORD[((0+128))+r14] - adcx r9,rcx - adox r10,rbp - - mulx rbp,rcx,QWORD[((8+128))+r14] - adcx r10,rcx - adox r11,rbp - - mulx rbp,rcx,QWORD[((16+128))+r14] - adcx r11,rcx - adox r12,rbp - - mulx rbp,rcx,QWORD[((24+128))+r14] - mov rdx,QWORD[16+rbx] - adcx r12,rcx - adox r13,rbp - adcx r13,r9 - adox r8,r9 - adc r8,0 - - - mulx rbp,rcx,QWORD[((0+128))+rsi] - adcx r10,rcx - adox r11,rbp - - mulx rbp,rcx,QWORD[((8+128))+rsi] - adcx r11,rcx - adox r12,rbp - - mulx rbp,rcx,QWORD[((16+128))+rsi] - adcx r12,rcx - adox r13,rbp - - mulx rbp,rcx,QWORD[((24+128))+rsi] - mov rdx,r10 - mulx rax,rdx,r15 - adcx r13,rcx - adox r8,rbp - - adcx r8,r9 - adox r9,r9 - adc r9,0 - - - mulx rbp,rcx,QWORD[((0+128))+r14] - adcx r10,rcx - adox r11,rbp - - mulx rbp,rcx,QWORD[((8+128))+r14] - adcx r11,rcx - adox r12,rbp - - mulx rbp,rcx,QWORD[((16+128))+r14] - adcx r12,rcx - adox r13,rbp - - mulx rbp,rcx,QWORD[((24+128))+r14] - mov rdx,QWORD[24+rbx] - adcx r13,rcx - adox r8,rbp - adcx r8,r10 - adox r9,r10 - adc r9,0 - - - mulx rbp,rcx,QWORD[((0+128))+rsi] - adcx r11,rcx - adox r12,rbp - - mulx rbp,rcx,QWORD[((8+128))+rsi] - adcx r12,rcx - adox r13,rbp - - mulx rbp,rcx,QWORD[((16+128))+rsi] - adcx r13,rcx - adox r8,rbp - - mulx rbp,rcx,QWORD[((24+128))+rsi] - mov rdx,r11 - mulx rax,rdx,r15 - adcx r8,rcx - adox r9,rbp - - adcx r9,r10 - adox r10,r10 - adc r10,0 - - - mulx rbp,rcx,QWORD[((0+128))+r14] - adcx r11,rcx - adox r12,rbp - - mulx rbp,rcx,QWORD[((8+128))+r14] - adcx r12,rcx - adox r13,rbp - - mulx rbp,rcx,QWORD[((16+128))+r14] - adcx r13,rcx - adox r8,rbp - - mulx rbp,rcx,QWORD[((24+128))+r14] - lea r14,[128+r14] - mov rbx,r12 - adcx r8,rcx - adox r9,rbp - mov rdx,r13 - adcx r9,r11 - adox r10,r11 - adc r10,0 - - - - mov rcx,r8 - sub r12,QWORD[r14] - sbb r13,QWORD[8+r14] - sbb r8,QWORD[16+r14] - mov rbp,r9 - sbb r9,QWORD[24+r14] - sbb r10,0 - - cmovc r12,rbx - cmovc r13,rdx - cmovc r8,rcx - cmovc r9,rbp - - mov QWORD[rdi],r12 - mov QWORD[8+rdi],r13 - mov QWORD[16+rdi],r8 - mov QWORD[24+rdi],r9 - - mov r15,QWORD[rsp] - - mov r14,QWORD[8+rsp] - - mov r13,QWORD[16+rsp] - - mov r12,QWORD[24+rsp] - - mov rbx,QWORD[32+rsp] - - mov rbp,QWORD[40+rsp] - - lea rsp,[48+rsp] - -$L$ord_mulx_epilogue: - mov rdi,QWORD[8+rsp] ;WIN64 epilogue - mov rsi,QWORD[16+rsp] - DB 0F3h,0C3h ;repret - -$L$SEH_end_ecp_nistz256_ord_mul_montx: - - -ALIGN 32 -ecp_nistz256_ord_sqr_montx: - mov QWORD[8+rsp],rdi ;WIN64 prologue - mov QWORD[16+rsp],rsi - mov rax,rsp -$L$SEH_begin_ecp_nistz256_ord_sqr_montx: - mov rdi,rcx - mov rsi,rdx - mov rdx,r8 - - - -$L$ecp_nistz256_ord_sqr_montx: - push rbp - - push rbx - - push r12 - - push r13 - - push r14 - - push r15 - -$L$ord_sqrx_body: - - mov rbx,rdx - mov rdx,QWORD[rsi] - mov r14,QWORD[8+rsi] - mov r15,QWORD[16+rsi] - mov r8,QWORD[24+rsi] - lea rsi,[$L$ord] - jmp NEAR $L$oop_ord_sqrx - -ALIGN 32 -$L$oop_ord_sqrx: - mulx r10,r9,r14 - mulx r11,rcx,r15 - mov rax,rdx -DB 102,73,15,110,206 - mulx r12,rbp,r8 - mov rdx,r14 - add r10,rcx -DB 102,73,15,110,215 - adc r11,rbp - adc r12,0 - xor r13,r13 - - mulx rbp,rcx,r15 - adcx r11,rcx - adox r12,rbp - - mulx rbp,rcx,r8 - mov rdx,r15 - adcx r12,rcx - adox r13,rbp - adc r13,0 - - mulx r14,rcx,r8 - mov rdx,rax -DB 102,73,15,110,216 - xor r15,r15 - adcx r9,r9 - adox r13,rcx - adcx r10,r10 - adox r14,r15 - - - mulx rbp,r8,rdx -DB 102,72,15,126,202 - adcx r11,r11 - adox r9,rbp - adcx r12,r12 - mulx rax,rcx,rdx -DB 102,72,15,126,210 - adcx r13,r13 - adox r10,rcx - adcx r14,r14 - mulx rbp,rcx,rdx -DB 0x67 -DB 102,72,15,126,218 - adox r11,rax - adcx r15,r15 - adox r12,rcx - adox r13,rbp - mulx rax,rcx,rdx - adox r14,rcx - adox r15,rax - - - mov rdx,r8 - mulx rcx,rdx,QWORD[32+rsi] - - xor rax,rax - mulx rbp,rcx,QWORD[rsi] - adcx r8,rcx - adox r9,rbp - mulx rbp,rcx,QWORD[8+rsi] - adcx r9,rcx - adox r10,rbp - mulx rbp,rcx,QWORD[16+rsi] - adcx r10,rcx - adox r11,rbp - mulx rbp,rcx,QWORD[24+rsi] - adcx r11,rcx - adox r8,rbp - adcx r8,rax - - - mov rdx,r9 - mulx rcx,rdx,QWORD[32+rsi] - - mulx rbp,rcx,QWORD[rsi] - adox r9,rcx - adcx r10,rbp - mulx rbp,rcx,QWORD[8+rsi] - adox r10,rcx - adcx r11,rbp - mulx rbp,rcx,QWORD[16+rsi] - adox r11,rcx - adcx r8,rbp - mulx rbp,rcx,QWORD[24+rsi] - adox r8,rcx - adcx r9,rbp - adox r9,rax - - - mov rdx,r10 - mulx rcx,rdx,QWORD[32+rsi] - - mulx rbp,rcx,QWORD[rsi] - adcx r10,rcx - adox r11,rbp - mulx rbp,rcx,QWORD[8+rsi] - adcx r11,rcx - adox r8,rbp - mulx rbp,rcx,QWORD[16+rsi] - adcx r8,rcx - adox r9,rbp - mulx rbp,rcx,QWORD[24+rsi] - adcx r9,rcx - adox r10,rbp - adcx r10,rax - - - mov rdx,r11 - mulx rcx,rdx,QWORD[32+rsi] - - mulx rbp,rcx,QWORD[rsi] - adox r11,rcx - adcx r8,rbp - mulx rbp,rcx,QWORD[8+rsi] - adox r8,rcx - adcx r9,rbp - mulx rbp,rcx,QWORD[16+rsi] - adox r9,rcx - adcx r10,rbp - mulx rbp,rcx,QWORD[24+rsi] - adox r10,rcx - adcx r11,rbp - adox r11,rax - - - add r12,r8 - adc r9,r13 - mov rdx,r12 - adc r10,r14 - adc r11,r15 - mov r14,r9 - adc rax,0 - - - sub r12,QWORD[rsi] - mov r15,r10 - sbb r9,QWORD[8+rsi] - sbb r10,QWORD[16+rsi] - mov r8,r11 - sbb r11,QWORD[24+rsi] - sbb rax,0 - - cmovnc rdx,r12 - cmovnc r14,r9 - cmovnc r15,r10 - cmovnc r8,r11 - - dec rbx - jnz NEAR $L$oop_ord_sqrx - - mov QWORD[rdi],rdx - mov QWORD[8+rdi],r14 - pxor xmm1,xmm1 - mov QWORD[16+rdi],r15 - pxor xmm2,xmm2 - mov QWORD[24+rdi],r8 - pxor xmm3,xmm3 - - mov r15,QWORD[rsp] - - mov r14,QWORD[8+rsp] - - mov r13,QWORD[16+rsp] - - mov r12,QWORD[24+rsp] - - mov rbx,QWORD[32+rsp] - - mov rbp,QWORD[40+rsp] - - lea rsp,[48+rsp] - -$L$ord_sqrx_epilogue: - mov rdi,QWORD[8+rsp] ;WIN64 epilogue - mov rsi,QWORD[16+rsp] - DB 0F3h,0C3h ;repret - -$L$SEH_end_ecp_nistz256_ord_sqr_montx: - - - - - - -global GFp_nistz256_mul_mont - -ALIGN 32 -GFp_nistz256_mul_mont: - mov QWORD[8+rsp],rdi ;WIN64 prologue - mov QWORD[16+rsp],rsi - mov rax,rsp -$L$SEH_begin_GFp_nistz256_mul_mont: - mov rdi,rcx - mov rsi,rdx - mov rdx,r8 - - - - lea rcx,[GFp_ia32cap_P] - mov rcx,QWORD[8+rcx] - and ecx,0x80100 -$L$mul_mont: - push rbp - - push rbx - - push r12 - - push r13 - - push r14 - - push r15 - -$L$mul_body: - cmp ecx,0x80100 - je NEAR $L$mul_montx - mov rbx,rdx - mov rax,QWORD[rdx] - mov r9,QWORD[rsi] - mov r10,QWORD[8+rsi] - mov r11,QWORD[16+rsi] - mov r12,QWORD[24+rsi] - - call __ecp_nistz256_mul_montq - jmp NEAR $L$mul_mont_done - -ALIGN 32 -$L$mul_montx: - mov rbx,rdx - mov rdx,QWORD[rdx] - mov r9,QWORD[rsi] - mov r10,QWORD[8+rsi] - mov r11,QWORD[16+rsi] - mov r12,QWORD[24+rsi] - lea rsi,[((-128))+rsi] - - call __ecp_nistz256_mul_montx -$L$mul_mont_done: - mov r15,QWORD[rsp] - - mov r14,QWORD[8+rsp] - - mov r13,QWORD[16+rsp] - - mov r12,QWORD[24+rsp] - - mov rbx,QWORD[32+rsp] - - mov rbp,QWORD[40+rsp] - - lea rsp,[48+rsp] - -$L$mul_epilogue: - mov rdi,QWORD[8+rsp] ;WIN64 epilogue - mov rsi,QWORD[16+rsp] - DB 0F3h,0C3h ;repret - -$L$SEH_end_GFp_nistz256_mul_mont: - - -ALIGN 32 -__ecp_nistz256_mul_montq: - - - - mov rbp,rax - mul r9 - mov r14,QWORD[(($L$poly+8))] - mov r8,rax - mov rax,rbp - mov r9,rdx - - mul r10 - mov r15,QWORD[(($L$poly+24))] - add r9,rax - mov rax,rbp - adc rdx,0 - mov r10,rdx - - mul r11 - add r10,rax - mov rax,rbp - adc rdx,0 - mov r11,rdx - - mul r12 - add r11,rax - mov rax,r8 - adc rdx,0 - xor r13,r13 - mov r12,rdx - - - - - - - - - - - mov rbp,r8 - shl r8,32 - mul r15 - shr rbp,32 - add r9,r8 - adc r10,rbp - adc r11,rax - mov rax,QWORD[8+rbx] - adc r12,rdx - adc r13,0 - xor r8,r8 - - - - mov rbp,rax - mul QWORD[rsi] - add r9,rax - mov rax,rbp - adc rdx,0 - mov rcx,rdx - - mul QWORD[8+rsi] - add r10,rcx - adc rdx,0 - add r10,rax - mov rax,rbp - adc rdx,0 - mov rcx,rdx - - mul QWORD[16+rsi] - add r11,rcx - adc rdx,0 - add r11,rax - mov rax,rbp - adc rdx,0 - mov rcx,rdx - - mul QWORD[24+rsi] - add r12,rcx - adc rdx,0 - add r12,rax - mov rax,r9 - adc r13,rdx - adc r8,0 - - - - mov rbp,r9 - shl r9,32 - mul r15 - shr rbp,32 - add r10,r9 - adc r11,rbp - adc r12,rax - mov rax,QWORD[16+rbx] - adc r13,rdx - adc r8,0 - xor r9,r9 - - - - mov rbp,rax - mul QWORD[rsi] - add r10,rax - mov rax,rbp - adc rdx,0 - mov rcx,rdx - - mul QWORD[8+rsi] - add r11,rcx - adc rdx,0 - add r11,rax - mov rax,rbp - adc rdx,0 - mov rcx,rdx - - mul QWORD[16+rsi] - add r12,rcx - adc rdx,0 - add r12,rax - mov rax,rbp - adc rdx,0 - mov rcx,rdx - - mul QWORD[24+rsi] - add r13,rcx - adc rdx,0 - add r13,rax - mov rax,r10 - adc r8,rdx - adc r9,0 - - - - mov rbp,r10 - shl r10,32 - mul r15 - shr rbp,32 - add r11,r10 - adc r12,rbp - adc r13,rax - mov rax,QWORD[24+rbx] - adc r8,rdx - adc r9,0 - xor r10,r10 - - - - mov rbp,rax - mul QWORD[rsi] - add r11,rax - mov rax,rbp - adc rdx,0 - mov rcx,rdx - - mul QWORD[8+rsi] - add r12,rcx - adc rdx,0 - add r12,rax - mov rax,rbp - adc rdx,0 - mov rcx,rdx - - mul QWORD[16+rsi] - add r13,rcx - adc rdx,0 - add r13,rax - mov rax,rbp - adc rdx,0 - mov rcx,rdx - - mul QWORD[24+rsi] - add r8,rcx - adc rdx,0 - add r8,rax - mov rax,r11 - adc r9,rdx - adc r10,0 - - - - mov rbp,r11 - shl r11,32 - mul r15 - shr rbp,32 - add r12,r11 - adc r13,rbp - mov rcx,r12 - adc r8,rax - adc r9,rdx - mov rbp,r13 - adc r10,0 - - - - sub r12,-1 - mov rbx,r8 - sbb r13,r14 - sbb r8,0 - mov rdx,r9 - sbb r9,r15 - sbb r10,0 - - cmovc r12,rcx - cmovc r13,rbp - mov QWORD[rdi],r12 - cmovc r8,rbx - mov QWORD[8+rdi],r13 - cmovc r9,rdx - mov QWORD[16+rdi],r8 - mov QWORD[24+rdi],r9 - - DB 0F3h,0C3h ;repret - - - - - - - - - - -global GFp_nistz256_sqr_mont - -ALIGN 32 -GFp_nistz256_sqr_mont: - mov QWORD[8+rsp],rdi ;WIN64 prologue - mov QWORD[16+rsp],rsi - mov rax,rsp -$L$SEH_begin_GFp_nistz256_sqr_mont: - mov rdi,rcx - mov rsi,rdx - - - - lea rcx,[GFp_ia32cap_P] - mov rcx,QWORD[8+rcx] - and ecx,0x80100 - push rbp - - push rbx - - push r12 - - push r13 - - push r14 - - push r15 - -$L$sqr_body: - cmp ecx,0x80100 - je NEAR $L$sqr_montx - mov rax,QWORD[rsi] - mov r14,QWORD[8+rsi] - mov r15,QWORD[16+rsi] - mov r8,QWORD[24+rsi] - - call __ecp_nistz256_sqr_montq - jmp NEAR $L$sqr_mont_done - -ALIGN 32 -$L$sqr_montx: - mov rdx,QWORD[rsi] - mov r14,QWORD[8+rsi] - mov r15,QWORD[16+rsi] - mov r8,QWORD[24+rsi] - lea rsi,[((-128))+rsi] - - call __ecp_nistz256_sqr_montx -$L$sqr_mont_done: - mov r15,QWORD[rsp] - - mov r14,QWORD[8+rsp] - - mov r13,QWORD[16+rsp] - - mov r12,QWORD[24+rsp] - - mov rbx,QWORD[32+rsp] - - mov rbp,QWORD[40+rsp] - - lea rsp,[48+rsp] - -$L$sqr_epilogue: - mov rdi,QWORD[8+rsp] ;WIN64 epilogue - mov rsi,QWORD[16+rsp] - DB 0F3h,0C3h ;repret - -$L$SEH_end_GFp_nistz256_sqr_mont: - - -ALIGN 32 -__ecp_nistz256_sqr_montq: - - mov r13,rax - mul r14 - mov r9,rax - mov rax,r15 - mov r10,rdx - - mul r13 - add r10,rax - mov rax,r8 - adc rdx,0 - mov r11,rdx - - mul r13 - add r11,rax - mov rax,r15 - adc rdx,0 - mov r12,rdx - - - mul r14 - add r11,rax - mov rax,r8 - adc rdx,0 - mov rbp,rdx - - mul r14 - add r12,rax - mov rax,r8 - adc rdx,0 - add r12,rbp - mov r13,rdx - adc r13,0 - - - mul r15 - xor r15,r15 - add r13,rax - mov rax,QWORD[rsi] - mov r14,rdx - adc r14,0 - - add r9,r9 - adc r10,r10 - adc r11,r11 - adc r12,r12 - adc r13,r13 - adc r14,r14 - adc r15,0 - - mul rax - mov r8,rax - mov rax,QWORD[8+rsi] - mov rcx,rdx - - mul rax - add r9,rcx - adc r10,rax - mov rax,QWORD[16+rsi] - adc rdx,0 - mov rcx,rdx - - mul rax - add r11,rcx - adc r12,rax - mov rax,QWORD[24+rsi] - adc rdx,0 - mov rcx,rdx - - mul rax - add r13,rcx - adc r14,rax - mov rax,r8 - adc r15,rdx - - mov rsi,QWORD[(($L$poly+8))] - mov rbp,QWORD[(($L$poly+24))] - - - - - mov rcx,r8 - shl r8,32 - mul rbp - shr rcx,32 - add r9,r8 - adc r10,rcx - adc r11,rax - mov rax,r9 - adc rdx,0 - - - - mov rcx,r9 - shl r9,32 - mov r8,rdx - mul rbp - shr rcx,32 - add r10,r9 - adc r11,rcx - adc r8,rax - mov rax,r10 - adc rdx,0 - - - - mov rcx,r10 - shl r10,32 - mov r9,rdx - mul rbp - shr rcx,32 - add r11,r10 - adc r8,rcx - adc r9,rax - mov rax,r11 - adc rdx,0 - - - - mov rcx,r11 - shl r11,32 - mov r10,rdx - mul rbp - shr rcx,32 - add r8,r11 - adc r9,rcx - adc r10,rax - adc rdx,0 - xor r11,r11 - - - - add r12,r8 - adc r13,r9 - mov r8,r12 - adc r14,r10 - adc r15,rdx - mov r9,r13 - adc r11,0 - - sub r12,-1 - mov r10,r14 - sbb r13,rsi - sbb r14,0 - mov rcx,r15 - sbb r15,rbp - sbb r11,0 - - cmovc r12,r8 - cmovc r13,r9 - mov QWORD[rdi],r12 - cmovc r14,r10 - mov QWORD[8+rdi],r13 - cmovc r15,rcx - mov QWORD[16+rdi],r14 - mov QWORD[24+rdi],r15 - - DB 0F3h,0C3h ;repret - - - -ALIGN 32 -__ecp_nistz256_mul_montx: - - - - mulx r9,r8,r9 - mulx r10,rcx,r10 - mov r14,32 - xor r13,r13 - mulx r11,rbp,r11 - mov r15,QWORD[(($L$poly+24))] - adc r9,rcx - mulx r12,rcx,r12 - mov rdx,r8 - adc r10,rbp - shlx rbp,r8,r14 - adc r11,rcx - shrx rcx,r8,r14 - adc r12,0 - - - - add r9,rbp - adc r10,rcx - - mulx rbp,rcx,r15 - mov rdx,QWORD[8+rbx] - adc r11,rcx - adc r12,rbp - adc r13,0 - xor r8,r8 - - - - mulx rbp,rcx,QWORD[((0+128))+rsi] - adcx r9,rcx - adox r10,rbp - - mulx rbp,rcx,QWORD[((8+128))+rsi] - adcx r10,rcx - adox r11,rbp - - mulx rbp,rcx,QWORD[((16+128))+rsi] - adcx r11,rcx - adox r12,rbp - - mulx rbp,rcx,QWORD[((24+128))+rsi] - mov rdx,r9 - adcx r12,rcx - shlx rcx,r9,r14 - adox r13,rbp - shrx rbp,r9,r14 - - adcx r13,r8 - adox r8,r8 - adc r8,0 - - - - add r10,rcx - adc r11,rbp - - mulx rbp,rcx,r15 - mov rdx,QWORD[16+rbx] - adc r12,rcx - adc r13,rbp - adc r8,0 - xor r9,r9 - - - - mulx rbp,rcx,QWORD[((0+128))+rsi] - adcx r10,rcx - adox r11,rbp - - mulx rbp,rcx,QWORD[((8+128))+rsi] - adcx r11,rcx - adox r12,rbp - - mulx rbp,rcx,QWORD[((16+128))+rsi] - adcx r12,rcx - adox r13,rbp - - mulx rbp,rcx,QWORD[((24+128))+rsi] - mov rdx,r10 - adcx r13,rcx - shlx rcx,r10,r14 - adox r8,rbp - shrx rbp,r10,r14 - - adcx r8,r9 - adox r9,r9 - adc r9,0 - - - - add r11,rcx - adc r12,rbp - - mulx rbp,rcx,r15 - mov rdx,QWORD[24+rbx] - adc r13,rcx - adc r8,rbp - adc r9,0 - xor r10,r10 - - - - mulx rbp,rcx,QWORD[((0+128))+rsi] - adcx r11,rcx - adox r12,rbp - - mulx rbp,rcx,QWORD[((8+128))+rsi] - adcx r12,rcx - adox r13,rbp - - mulx rbp,rcx,QWORD[((16+128))+rsi] - adcx r13,rcx - adox r8,rbp - - mulx rbp,rcx,QWORD[((24+128))+rsi] - mov rdx,r11 - adcx r8,rcx - shlx rcx,r11,r14 - adox r9,rbp - shrx rbp,r11,r14 - - adcx r9,r10 - adox r10,r10 - adc r10,0 - - - - add r12,rcx - adc r13,rbp - - mulx rbp,rcx,r15 - mov rbx,r12 - mov r14,QWORD[(($L$poly+8))] - adc r8,rcx - mov rdx,r13 - adc r9,rbp - adc r10,0 - - - - xor eax,eax - mov rcx,r8 - sbb r12,-1 - sbb r13,r14 - sbb r8,0 - mov rbp,r9 - sbb r9,r15 - sbb r10,0 - - cmovc r12,rbx - cmovc r13,rdx - mov QWORD[rdi],r12 - cmovc r8,rcx - mov QWORD[8+rdi],r13 - cmovc r9,rbp - mov QWORD[16+rdi],r8 - mov QWORD[24+rdi],r9 - - DB 0F3h,0C3h ;repret - - - - -ALIGN 32 -__ecp_nistz256_sqr_montx: - - mulx r10,r9,r14 - mulx r11,rcx,r15 - xor eax,eax - adc r10,rcx - mulx r12,rbp,r8 - mov rdx,r14 - adc r11,rbp - adc r12,0 - xor r13,r13 - - - mulx rbp,rcx,r15 - adcx r11,rcx - adox r12,rbp - - mulx rbp,rcx,r8 - mov rdx,r15 - adcx r12,rcx - adox r13,rbp - adc r13,0 - - - mulx r14,rcx,r8 - mov rdx,QWORD[((0+128))+rsi] - xor r15,r15 - adcx r9,r9 - adox r13,rcx - adcx r10,r10 - adox r14,r15 - - mulx rbp,r8,rdx - mov rdx,QWORD[((8+128))+rsi] - adcx r11,r11 - adox r9,rbp - adcx r12,r12 - mulx rax,rcx,rdx - mov rdx,QWORD[((16+128))+rsi] - adcx r13,r13 - adox r10,rcx - adcx r14,r14 -DB 0x67 - mulx rbp,rcx,rdx - mov rdx,QWORD[((24+128))+rsi] - adox r11,rax - adcx r15,r15 - adox r12,rcx - mov rsi,32 - adox r13,rbp -DB 0x67,0x67 - mulx rax,rcx,rdx - mov rdx,QWORD[(($L$poly+24))] - adox r14,rcx - shlx rcx,r8,rsi - adox r15,rax - shrx rax,r8,rsi - mov rbp,rdx - - - add r9,rcx - adc r10,rax - - mulx r8,rcx,r8 - adc r11,rcx - shlx rcx,r9,rsi - adc r8,0 - shrx rax,r9,rsi - - - add r10,rcx - adc r11,rax - - mulx r9,rcx,r9 - adc r8,rcx - shlx rcx,r10,rsi - adc r9,0 - shrx rax,r10,rsi - - - add r11,rcx - adc r8,rax - - mulx r10,rcx,r10 - adc r9,rcx - shlx rcx,r11,rsi - adc r10,0 - shrx rax,r11,rsi - - - add r8,rcx - adc r9,rax - - mulx r11,rcx,r11 - adc r10,rcx - adc r11,0 - - xor rdx,rdx - add r12,r8 - mov rsi,QWORD[(($L$poly+8))] - adc r13,r9 - mov r8,r12 - adc r14,r10 - adc r15,r11 - mov r9,r13 - adc rdx,0 - - sub r12,-1 - mov r10,r14 - sbb r13,rsi - sbb r14,0 - mov r11,r15 - sbb r15,rbp - sbb rdx,0 - - cmovc r12,r8 - cmovc r13,r9 - mov QWORD[rdi],r12 - cmovc r14,r10 - mov QWORD[8+rdi],r13 - cmovc r15,r11 - mov QWORD[16+rdi],r14 - mov QWORD[24+rdi],r15 - - DB 0F3h,0C3h ;repret - - - - -global GFp_nistz256_select_w5 - -ALIGN 32 -GFp_nistz256_select_w5: - - lea rax,[GFp_ia32cap_P] - mov rax,QWORD[8+rax] - test eax,32 - jnz NEAR $L$avx2_select_w5 - lea rax,[((-136))+rsp] -$L$SEH_begin_GFp_nistz256_select_w5: -DB 0x48,0x8d,0x60,0xe0 -DB 0x0f,0x29,0x70,0xe0 -DB 0x0f,0x29,0x78,0xf0 -DB 0x44,0x0f,0x29,0x00 -DB 0x44,0x0f,0x29,0x48,0x10 -DB 0x44,0x0f,0x29,0x50,0x20 -DB 0x44,0x0f,0x29,0x58,0x30 -DB 0x44,0x0f,0x29,0x60,0x40 -DB 0x44,0x0f,0x29,0x68,0x50 -DB 0x44,0x0f,0x29,0x70,0x60 -DB 0x44,0x0f,0x29,0x78,0x70 - movdqa xmm0,XMMWORD[$L$One] - movd xmm1,r8d - - pxor xmm2,xmm2 - pxor xmm3,xmm3 - pxor xmm4,xmm4 - pxor xmm5,xmm5 - pxor xmm6,xmm6 - pxor xmm7,xmm7 - - movdqa xmm8,xmm0 - pshufd xmm1,xmm1,0 - - mov rax,16 -$L$select_loop_sse_w5: - - movdqa xmm15,xmm8 - paddd xmm8,xmm0 - pcmpeqd xmm15,xmm1 - - movdqa xmm9,XMMWORD[rdx] - movdqa xmm10,XMMWORD[16+rdx] - movdqa xmm11,XMMWORD[32+rdx] - movdqa xmm12,XMMWORD[48+rdx] - movdqa xmm13,XMMWORD[64+rdx] - movdqa xmm14,XMMWORD[80+rdx] - lea rdx,[96+rdx] - - pand xmm9,xmm15 - pand xmm10,xmm15 - por xmm2,xmm9 - pand xmm11,xmm15 - por xmm3,xmm10 - pand xmm12,xmm15 - por xmm4,xmm11 - pand xmm13,xmm15 - por xmm5,xmm12 - pand xmm14,xmm15 - por xmm6,xmm13 - por xmm7,xmm14 - - dec rax - jnz NEAR $L$select_loop_sse_w5 - - movdqu XMMWORD[rcx],xmm2 - movdqu XMMWORD[16+rcx],xmm3 - movdqu XMMWORD[32+rcx],xmm4 - movdqu XMMWORD[48+rcx],xmm5 - movdqu XMMWORD[64+rcx],xmm6 - movdqu XMMWORD[80+rcx],xmm7 - movaps xmm6,XMMWORD[rsp] - movaps xmm7,XMMWORD[16+rsp] - movaps xmm8,XMMWORD[32+rsp] - movaps xmm9,XMMWORD[48+rsp] - movaps xmm10,XMMWORD[64+rsp] - movaps xmm11,XMMWORD[80+rsp] - movaps xmm12,XMMWORD[96+rsp] - movaps xmm13,XMMWORD[112+rsp] - movaps xmm14,XMMWORD[128+rsp] - movaps xmm15,XMMWORD[144+rsp] - lea rsp,[168+rsp] - DB 0F3h,0C3h ;repret - -$L$SEH_end_GFp_nistz256_select_w5: - - - - -global GFp_nistz256_select_w7 - -ALIGN 32 -GFp_nistz256_select_w7: - - lea rax,[GFp_ia32cap_P] - mov rax,QWORD[8+rax] - test eax,32 - jnz NEAR $L$avx2_select_w7 - lea rax,[((-136))+rsp] -$L$SEH_begin_GFp_nistz256_select_w7: -DB 0x48,0x8d,0x60,0xe0 -DB 0x0f,0x29,0x70,0xe0 -DB 0x0f,0x29,0x78,0xf0 -DB 0x44,0x0f,0x29,0x00 -DB 0x44,0x0f,0x29,0x48,0x10 -DB 0x44,0x0f,0x29,0x50,0x20 -DB 0x44,0x0f,0x29,0x58,0x30 -DB 0x44,0x0f,0x29,0x60,0x40 -DB 0x44,0x0f,0x29,0x68,0x50 -DB 0x44,0x0f,0x29,0x70,0x60 -DB 0x44,0x0f,0x29,0x78,0x70 - movdqa xmm8,XMMWORD[$L$One] - movd xmm1,r8d - - pxor xmm2,xmm2 - pxor xmm3,xmm3 - pxor xmm4,xmm4 - pxor xmm5,xmm5 - - movdqa xmm0,xmm8 - pshufd xmm1,xmm1,0 - mov rax,64 - -$L$select_loop_sse_w7: - movdqa xmm15,xmm8 - paddd xmm8,xmm0 - movdqa xmm9,XMMWORD[rdx] - movdqa xmm10,XMMWORD[16+rdx] - pcmpeqd xmm15,xmm1 - movdqa xmm11,XMMWORD[32+rdx] - movdqa xmm12,XMMWORD[48+rdx] - lea rdx,[64+rdx] - - pand xmm9,xmm15 - pand xmm10,xmm15 - por xmm2,xmm9 - pand xmm11,xmm15 - por xmm3,xmm10 - pand xmm12,xmm15 - por xmm4,xmm11 - prefetcht0 [255+rdx] - por xmm5,xmm12 - - dec rax - jnz NEAR $L$select_loop_sse_w7 - - movdqu XMMWORD[rcx],xmm2 - movdqu XMMWORD[16+rcx],xmm3 - movdqu XMMWORD[32+rcx],xmm4 - movdqu XMMWORD[48+rcx],xmm5 - movaps xmm6,XMMWORD[rsp] - movaps xmm7,XMMWORD[16+rsp] - movaps xmm8,XMMWORD[32+rsp] - movaps xmm9,XMMWORD[48+rsp] - movaps xmm10,XMMWORD[64+rsp] - movaps xmm11,XMMWORD[80+rsp] - movaps xmm12,XMMWORD[96+rsp] - movaps xmm13,XMMWORD[112+rsp] - movaps xmm14,XMMWORD[128+rsp] - movaps xmm15,XMMWORD[144+rsp] - lea rsp,[168+rsp] - DB 0F3h,0C3h ;repret - -$L$SEH_end_GFp_nistz256_select_w7: - - - - -ALIGN 32 -GFp_nistz256_avx2_select_w5: - -$L$avx2_select_w5: - vzeroupper - lea rax,[((-136))+rsp] - mov r11,rsp -$L$SEH_begin_GFp_nistz256_avx2_select_w5: -DB 0x48,0x8d,0x60,0xe0 -DB 0xc5,0xf8,0x29,0x70,0xe0 -DB 0xc5,0xf8,0x29,0x78,0xf0 -DB 0xc5,0x78,0x29,0x40,0x00 -DB 0xc5,0x78,0x29,0x48,0x10 -DB 0xc5,0x78,0x29,0x50,0x20 -DB 0xc5,0x78,0x29,0x58,0x30 -DB 0xc5,0x78,0x29,0x60,0x40 -DB 0xc5,0x78,0x29,0x68,0x50 -DB 0xc5,0x78,0x29,0x70,0x60 -DB 0xc5,0x78,0x29,0x78,0x70 - vmovdqa ymm0,YMMWORD[$L$Two] - - vpxor ymm2,ymm2,ymm2 - vpxor ymm3,ymm3,ymm3 - vpxor ymm4,ymm4,ymm4 - - vmovdqa ymm5,YMMWORD[$L$One] - vmovdqa ymm10,YMMWORD[$L$Two] - - vmovd xmm1,r8d - vpermd ymm1,ymm2,ymm1 - - mov rax,8 -$L$select_loop_avx2_w5: - - vmovdqa ymm6,YMMWORD[rdx] - vmovdqa ymm7,YMMWORD[32+rdx] - vmovdqa ymm8,YMMWORD[64+rdx] - - vmovdqa ymm11,YMMWORD[96+rdx] - vmovdqa ymm12,YMMWORD[128+rdx] - vmovdqa ymm13,YMMWORD[160+rdx] - - vpcmpeqd ymm9,ymm5,ymm1 - vpcmpeqd ymm14,ymm10,ymm1 - - vpaddd ymm5,ymm5,ymm0 - vpaddd ymm10,ymm10,ymm0 - lea rdx,[192+rdx] - - vpand ymm6,ymm6,ymm9 - vpand ymm7,ymm7,ymm9 - vpand ymm8,ymm8,ymm9 - vpand ymm11,ymm11,ymm14 - vpand ymm12,ymm12,ymm14 - vpand ymm13,ymm13,ymm14 - - vpxor ymm2,ymm2,ymm6 - vpxor ymm3,ymm3,ymm7 - vpxor ymm4,ymm4,ymm8 - vpxor ymm2,ymm2,ymm11 - vpxor ymm3,ymm3,ymm12 - vpxor ymm4,ymm4,ymm13 - - dec rax - jnz NEAR $L$select_loop_avx2_w5 - - vmovdqu YMMWORD[rcx],ymm2 - vmovdqu YMMWORD[32+rcx],ymm3 - vmovdqu YMMWORD[64+rcx],ymm4 - vzeroupper - movaps xmm6,XMMWORD[rsp] - movaps xmm7,XMMWORD[16+rsp] - movaps xmm8,XMMWORD[32+rsp] - movaps xmm9,XMMWORD[48+rsp] - movaps xmm10,XMMWORD[64+rsp] - movaps xmm11,XMMWORD[80+rsp] - movaps xmm12,XMMWORD[96+rsp] - movaps xmm13,XMMWORD[112+rsp] - movaps xmm14,XMMWORD[128+rsp] - movaps xmm15,XMMWORD[144+rsp] - lea rsp,[r11] - DB 0F3h,0C3h ;repret - -$L$SEH_end_GFp_nistz256_avx2_select_w5: - - - - -global GFp_nistz256_avx2_select_w7 - -ALIGN 32 -GFp_nistz256_avx2_select_w7: - -$L$avx2_select_w7: - vzeroupper - mov r11,rsp - lea rax,[((-136))+rsp] -$L$SEH_begin_GFp_nistz256_avx2_select_w7: -DB 0x48,0x8d,0x60,0xe0 -DB 0xc5,0xf8,0x29,0x70,0xe0 -DB 0xc5,0xf8,0x29,0x78,0xf0 -DB 0xc5,0x78,0x29,0x40,0x00 -DB 0xc5,0x78,0x29,0x48,0x10 -DB 0xc5,0x78,0x29,0x50,0x20 -DB 0xc5,0x78,0x29,0x58,0x30 -DB 0xc5,0x78,0x29,0x60,0x40 -DB 0xc5,0x78,0x29,0x68,0x50 -DB 0xc5,0x78,0x29,0x70,0x60 -DB 0xc5,0x78,0x29,0x78,0x70 - vmovdqa ymm0,YMMWORD[$L$Three] - - vpxor ymm2,ymm2,ymm2 - vpxor ymm3,ymm3,ymm3 - - vmovdqa ymm4,YMMWORD[$L$One] - vmovdqa ymm8,YMMWORD[$L$Two] - vmovdqa ymm12,YMMWORD[$L$Three] - - vmovd xmm1,r8d - vpermd ymm1,ymm2,ymm1 - - - mov rax,21 -$L$select_loop_avx2_w7: - - vmovdqa ymm5,YMMWORD[rdx] - vmovdqa ymm6,YMMWORD[32+rdx] - - vmovdqa ymm9,YMMWORD[64+rdx] - vmovdqa ymm10,YMMWORD[96+rdx] - - vmovdqa ymm13,YMMWORD[128+rdx] - vmovdqa ymm14,YMMWORD[160+rdx] - - vpcmpeqd ymm7,ymm4,ymm1 - vpcmpeqd ymm11,ymm8,ymm1 - vpcmpeqd ymm15,ymm12,ymm1 - - vpaddd ymm4,ymm4,ymm0 - vpaddd ymm8,ymm8,ymm0 - vpaddd ymm12,ymm12,ymm0 - lea rdx,[192+rdx] - - vpand ymm5,ymm5,ymm7 - vpand ymm6,ymm6,ymm7 - vpand ymm9,ymm9,ymm11 - vpand ymm10,ymm10,ymm11 - vpand ymm13,ymm13,ymm15 - vpand ymm14,ymm14,ymm15 - - vpxor ymm2,ymm2,ymm5 - vpxor ymm3,ymm3,ymm6 - vpxor ymm2,ymm2,ymm9 - vpxor ymm3,ymm3,ymm10 - vpxor ymm2,ymm2,ymm13 - vpxor ymm3,ymm3,ymm14 - - dec rax - jnz NEAR $L$select_loop_avx2_w7 - - - vmovdqa ymm5,YMMWORD[rdx] - vmovdqa ymm6,YMMWORD[32+rdx] - - vpcmpeqd ymm7,ymm4,ymm1 - - vpand ymm5,ymm5,ymm7 - vpand ymm6,ymm6,ymm7 - - vpxor ymm2,ymm2,ymm5 - vpxor ymm3,ymm3,ymm6 - - vmovdqu YMMWORD[rcx],ymm2 - vmovdqu YMMWORD[32+rcx],ymm3 - vzeroupper - movaps xmm6,XMMWORD[rsp] - movaps xmm7,XMMWORD[16+rsp] - movaps xmm8,XMMWORD[32+rsp] - movaps xmm9,XMMWORD[48+rsp] - movaps xmm10,XMMWORD[64+rsp] - movaps xmm11,XMMWORD[80+rsp] - movaps xmm12,XMMWORD[96+rsp] - movaps xmm13,XMMWORD[112+rsp] - movaps xmm14,XMMWORD[128+rsp] - movaps xmm15,XMMWORD[144+rsp] - lea rsp,[r11] - DB 0F3h,0C3h ;repret - -$L$SEH_end_GFp_nistz256_avx2_select_w7: - - -ALIGN 32 -__ecp_nistz256_add_toq: - - xor r11,r11 - add r12,QWORD[rbx] - adc r13,QWORD[8+rbx] - mov rax,r12 - adc r8,QWORD[16+rbx] - adc r9,QWORD[24+rbx] - mov rbp,r13 - adc r11,0 - - sub r12,-1 - mov rcx,r8 - sbb r13,r14 - sbb r8,0 - mov r10,r9 - sbb r9,r15 - sbb r11,0 - - cmovc r12,rax - cmovc r13,rbp - mov QWORD[rdi],r12 - cmovc r8,rcx - mov QWORD[8+rdi],r13 - cmovc r9,r10 - mov QWORD[16+rdi],r8 - mov QWORD[24+rdi],r9 - - DB 0F3h,0C3h ;repret - - - - -ALIGN 32 -__ecp_nistz256_sub_fromq: - - sub r12,QWORD[rbx] - sbb r13,QWORD[8+rbx] - mov rax,r12 - sbb r8,QWORD[16+rbx] - sbb r9,QWORD[24+rbx] - mov rbp,r13 - sbb r11,r11 - - add r12,-1 - mov rcx,r8 - adc r13,r14 - adc r8,0 - mov r10,r9 - adc r9,r15 - test r11,r11 - - cmovz r12,rax - cmovz r13,rbp - mov QWORD[rdi],r12 - cmovz r8,rcx - mov QWORD[8+rdi],r13 - cmovz r9,r10 - mov QWORD[16+rdi],r8 - mov QWORD[24+rdi],r9 - - DB 0F3h,0C3h ;repret - - - - -ALIGN 32 -__ecp_nistz256_subq: - - sub rax,r12 - sbb rbp,r13 - mov r12,rax - sbb rcx,r8 - sbb r10,r9 - mov r13,rbp - sbb r11,r11 - - add rax,-1 - mov r8,rcx - adc rbp,r14 - adc rcx,0 - mov r9,r10 - adc r10,r15 - test r11,r11 - - cmovnz r12,rax - cmovnz r13,rbp - cmovnz r8,rcx - cmovnz r9,r10 - - DB 0F3h,0C3h ;repret - - - - -ALIGN 32 -__ecp_nistz256_mul_by_2q: - - xor r11,r11 - add r12,r12 - adc r13,r13 - mov rax,r12 - adc r8,r8 - adc r9,r9 - mov rbp,r13 - adc r11,0 - - sub r12,-1 - mov rcx,r8 - sbb r13,r14 - sbb r8,0 - mov r10,r9 - sbb r9,r15 - sbb r11,0 - - cmovc r12,rax - cmovc r13,rbp - mov QWORD[rdi],r12 - cmovc r8,rcx - mov QWORD[8+rdi],r13 - cmovc r9,r10 - mov QWORD[16+rdi],r8 - mov QWORD[24+rdi],r9 - - DB 0F3h,0C3h ;repret - - -global GFp_nistz256_point_double - -ALIGN 32 -GFp_nistz256_point_double: - mov QWORD[8+rsp],rdi ;WIN64 prologue - mov QWORD[16+rsp],rsi - mov rax,rsp -$L$SEH_begin_GFp_nistz256_point_double: - mov rdi,rcx - mov rsi,rdx - - - - lea rcx,[GFp_ia32cap_P] - mov rcx,QWORD[8+rcx] - and ecx,0x80100 - cmp ecx,0x80100 - je NEAR $L$point_doublex - push rbp - - push rbx - - push r12 - - push r13 - - push r14 - - push r15 - - sub rsp,32*5+8 - -$L$point_doubleq_body: - -$L$point_double_shortcutq: - movdqu xmm0,XMMWORD[rsi] - mov rbx,rsi - movdqu xmm1,XMMWORD[16+rsi] - mov r12,QWORD[((32+0))+rsi] - mov r13,QWORD[((32+8))+rsi] - mov r8,QWORD[((32+16))+rsi] - mov r9,QWORD[((32+24))+rsi] - mov r14,QWORD[(($L$poly+8))] - mov r15,QWORD[(($L$poly+24))] - movdqa XMMWORD[96+rsp],xmm0 - movdqa XMMWORD[(96+16)+rsp],xmm1 - lea r10,[32+rdi] - lea r11,[64+rdi] -DB 102,72,15,110,199 -DB 102,73,15,110,202 -DB 102,73,15,110,211 - - lea rdi,[rsp] - call __ecp_nistz256_mul_by_2q - - mov rax,QWORD[((64+0))+rsi] - mov r14,QWORD[((64+8))+rsi] - mov r15,QWORD[((64+16))+rsi] - mov r8,QWORD[((64+24))+rsi] - lea rsi,[((64-0))+rsi] - lea rdi,[64+rsp] - call __ecp_nistz256_sqr_montq - - mov rax,QWORD[((0+0))+rsp] - mov r14,QWORD[((8+0))+rsp] - lea rsi,[((0+0))+rsp] - mov r15,QWORD[((16+0))+rsp] - mov r8,QWORD[((24+0))+rsp] - lea rdi,[rsp] - call __ecp_nistz256_sqr_montq - - mov rax,QWORD[32+rbx] - mov r9,QWORD[((64+0))+rbx] - mov r10,QWORD[((64+8))+rbx] - mov r11,QWORD[((64+16))+rbx] - mov r12,QWORD[((64+24))+rbx] - lea rsi,[((64-0))+rbx] - lea rbx,[32+rbx] -DB 102,72,15,126,215 - call __ecp_nistz256_mul_montq - call __ecp_nistz256_mul_by_2q - - mov r12,QWORD[((96+0))+rsp] - mov r13,QWORD[((96+8))+rsp] - lea rbx,[64+rsp] - mov r8,QWORD[((96+16))+rsp] - mov r9,QWORD[((96+24))+rsp] - lea rdi,[32+rsp] - call __ecp_nistz256_add_toq - - mov r12,QWORD[((96+0))+rsp] - mov r13,QWORD[((96+8))+rsp] - lea rbx,[64+rsp] - mov r8,QWORD[((96+16))+rsp] - mov r9,QWORD[((96+24))+rsp] - lea rdi,[64+rsp] - call __ecp_nistz256_sub_fromq - - mov rax,QWORD[((0+0))+rsp] - mov r14,QWORD[((8+0))+rsp] - lea rsi,[((0+0))+rsp] - mov r15,QWORD[((16+0))+rsp] - mov r8,QWORD[((24+0))+rsp] -DB 102,72,15,126,207 - call __ecp_nistz256_sqr_montq - xor r9,r9 - mov rax,r12 - add r12,-1 - mov r10,r13 - adc r13,rsi - mov rcx,r14 - adc r14,0 - mov r8,r15 - adc r15,rbp - adc r9,0 - xor rsi,rsi - test rax,1 - - cmovz r12,rax - cmovz r13,r10 - cmovz r14,rcx - cmovz r15,r8 - cmovz r9,rsi - - mov rax,r13 - shr r12,1 - shl rax,63 - mov r10,r14 - shr r13,1 - or r12,rax - shl r10,63 - mov rcx,r15 - shr r14,1 - or r13,r10 - shl rcx,63 - mov QWORD[rdi],r12 - shr r15,1 - mov QWORD[8+rdi],r13 - shl r9,63 - or r14,rcx - or r15,r9 - mov QWORD[16+rdi],r14 - mov QWORD[24+rdi],r15 - mov rax,QWORD[64+rsp] - lea rbx,[64+rsp] - mov r9,QWORD[((0+32))+rsp] - mov r10,QWORD[((8+32))+rsp] - lea rsi,[((0+32))+rsp] - mov r11,QWORD[((16+32))+rsp] - mov r12,QWORD[((24+32))+rsp] - lea rdi,[32+rsp] - call __ecp_nistz256_mul_montq - - lea rdi,[128+rsp] - call __ecp_nistz256_mul_by_2q - - lea rbx,[32+rsp] - lea rdi,[32+rsp] - call __ecp_nistz256_add_toq - - mov rax,QWORD[96+rsp] - lea rbx,[96+rsp] - mov r9,QWORD[((0+0))+rsp] - mov r10,QWORD[((8+0))+rsp] - lea rsi,[((0+0))+rsp] - mov r11,QWORD[((16+0))+rsp] - mov r12,QWORD[((24+0))+rsp] - lea rdi,[rsp] - call __ecp_nistz256_mul_montq - - lea rdi,[128+rsp] - call __ecp_nistz256_mul_by_2q - - mov rax,QWORD[((0+32))+rsp] - mov r14,QWORD[((8+32))+rsp] - lea rsi,[((0+32))+rsp] - mov r15,QWORD[((16+32))+rsp] - mov r8,QWORD[((24+32))+rsp] -DB 102,72,15,126,199 - call __ecp_nistz256_sqr_montq - - lea rbx,[128+rsp] - mov r8,r14 - mov r9,r15 - mov r14,rsi - mov r15,rbp - call __ecp_nistz256_sub_fromq - - mov rax,QWORD[((0+0))+rsp] - mov rbp,QWORD[((0+8))+rsp] - mov rcx,QWORD[((0+16))+rsp] - mov r10,QWORD[((0+24))+rsp] - lea rdi,[rsp] - call __ecp_nistz256_subq - - mov rax,QWORD[32+rsp] - lea rbx,[32+rsp] - mov r14,r12 - xor ecx,ecx - mov QWORD[((0+0))+rsp],r12 - mov r10,r13 - mov QWORD[((0+8))+rsp],r13 - cmovz r11,r8 - mov QWORD[((0+16))+rsp],r8 - lea rsi,[((0-0))+rsp] - cmovz r12,r9 - mov QWORD[((0+24))+rsp],r9 - mov r9,r14 - lea rdi,[rsp] - call __ecp_nistz256_mul_montq - -DB 102,72,15,126,203 -DB 102,72,15,126,207 - call __ecp_nistz256_sub_fromq - - lea rsi,[((160+56))+rsp] - - mov r15,QWORD[((-48))+rsi] - - mov r14,QWORD[((-40))+rsi] - - mov r13,QWORD[((-32))+rsi] - - mov r12,QWORD[((-24))+rsi] - - mov rbx,QWORD[((-16))+rsi] - - mov rbp,QWORD[((-8))+rsi] - - lea rsp,[rsi] - -$L$point_doubleq_epilogue: - mov rdi,QWORD[8+rsp] ;WIN64 epilogue - mov rsi,QWORD[16+rsp] - DB 0F3h,0C3h ;repret - -$L$SEH_end_GFp_nistz256_point_double: -global GFp_nistz256_point_add - -ALIGN 32 -GFp_nistz256_point_add: - mov QWORD[8+rsp],rdi ;WIN64 prologue - mov QWORD[16+rsp],rsi - mov rax,rsp -$L$SEH_begin_GFp_nistz256_point_add: - mov rdi,rcx - mov rsi,rdx - mov rdx,r8 - - - - lea rcx,[GFp_ia32cap_P] - mov rcx,QWORD[8+rcx] - and ecx,0x80100 - cmp ecx,0x80100 - je NEAR $L$point_addx - push rbp - - push rbx - - push r12 - - push r13 - - push r14 - - push r15 - - sub rsp,32*18+8 - -$L$point_addq_body: - - movdqu xmm0,XMMWORD[rsi] - movdqu xmm1,XMMWORD[16+rsi] - movdqu xmm2,XMMWORD[32+rsi] - movdqu xmm3,XMMWORD[48+rsi] - movdqu xmm4,XMMWORD[64+rsi] - movdqu xmm5,XMMWORD[80+rsi] - mov rbx,rsi - mov rsi,rdx - movdqa XMMWORD[384+rsp],xmm0 - movdqa XMMWORD[(384+16)+rsp],xmm1 - movdqa XMMWORD[416+rsp],xmm2 - movdqa XMMWORD[(416+16)+rsp],xmm3 - movdqa XMMWORD[448+rsp],xmm4 - movdqa XMMWORD[(448+16)+rsp],xmm5 - por xmm5,xmm4 - - movdqu xmm0,XMMWORD[rsi] - pshufd xmm3,xmm5,0xb1 - movdqu xmm1,XMMWORD[16+rsi] - movdqu xmm2,XMMWORD[32+rsi] - por xmm5,xmm3 - movdqu xmm3,XMMWORD[48+rsi] - mov rax,QWORD[((64+0))+rsi] - mov r14,QWORD[((64+8))+rsi] - mov r15,QWORD[((64+16))+rsi] - mov r8,QWORD[((64+24))+rsi] - movdqa XMMWORD[480+rsp],xmm0 - pshufd xmm4,xmm5,0x1e - movdqa XMMWORD[(480+16)+rsp],xmm1 - movdqu xmm0,XMMWORD[64+rsi] - movdqu xmm1,XMMWORD[80+rsi] - movdqa XMMWORD[512+rsp],xmm2 - movdqa XMMWORD[(512+16)+rsp],xmm3 - por xmm5,xmm4 - pxor xmm4,xmm4 - por xmm1,xmm0 -DB 102,72,15,110,199 - - lea rsi,[((64-0))+rsi] - mov QWORD[((544+0))+rsp],rax - mov QWORD[((544+8))+rsp],r14 - mov QWORD[((544+16))+rsp],r15 - mov QWORD[((544+24))+rsp],r8 - lea rdi,[96+rsp] - call __ecp_nistz256_sqr_montq - - pcmpeqd xmm5,xmm4 - pshufd xmm4,xmm1,0xb1 - por xmm4,xmm1 - pshufd xmm5,xmm5,0 - pshufd xmm3,xmm4,0x1e - por xmm4,xmm3 - pxor xmm3,xmm3 - pcmpeqd xmm4,xmm3 - pshufd xmm4,xmm4,0 - mov rax,QWORD[((64+0))+rbx] - mov r14,QWORD[((64+8))+rbx] - mov r15,QWORD[((64+16))+rbx] - mov r8,QWORD[((64+24))+rbx] -DB 102,72,15,110,203 - - lea rsi,[((64-0))+rbx] - lea rdi,[32+rsp] - call __ecp_nistz256_sqr_montq - - mov rax,QWORD[544+rsp] - lea rbx,[544+rsp] - mov r9,QWORD[((0+96))+rsp] - mov r10,QWORD[((8+96))+rsp] - lea rsi,[((0+96))+rsp] - mov r11,QWORD[((16+96))+rsp] - mov r12,QWORD[((24+96))+rsp] - lea rdi,[224+rsp] - call __ecp_nistz256_mul_montq - - mov rax,QWORD[448+rsp] - lea rbx,[448+rsp] - mov r9,QWORD[((0+32))+rsp] - mov r10,QWORD[((8+32))+rsp] - lea rsi,[((0+32))+rsp] - mov r11,QWORD[((16+32))+rsp] - mov r12,QWORD[((24+32))+rsp] - lea rdi,[256+rsp] - call __ecp_nistz256_mul_montq - - mov rax,QWORD[416+rsp] - lea rbx,[416+rsp] - mov r9,QWORD[((0+224))+rsp] - mov r10,QWORD[((8+224))+rsp] - lea rsi,[((0+224))+rsp] - mov r11,QWORD[((16+224))+rsp] - mov r12,QWORD[((24+224))+rsp] - lea rdi,[224+rsp] - call __ecp_nistz256_mul_montq - - mov rax,QWORD[512+rsp] - lea rbx,[512+rsp] - mov r9,QWORD[((0+256))+rsp] - mov r10,QWORD[((8+256))+rsp] - lea rsi,[((0+256))+rsp] - mov r11,QWORD[((16+256))+rsp] - mov r12,QWORD[((24+256))+rsp] - lea rdi,[256+rsp] - call __ecp_nistz256_mul_montq - - lea rbx,[224+rsp] - lea rdi,[64+rsp] - call __ecp_nistz256_sub_fromq - - or r12,r13 - movdqa xmm2,xmm4 - or r12,r8 - or r12,r9 - por xmm2,xmm5 -DB 102,73,15,110,220 - - mov rax,QWORD[384+rsp] - lea rbx,[384+rsp] - mov r9,QWORD[((0+96))+rsp] - mov r10,QWORD[((8+96))+rsp] - lea rsi,[((0+96))+rsp] - mov r11,QWORD[((16+96))+rsp] - mov r12,QWORD[((24+96))+rsp] - lea rdi,[160+rsp] - call __ecp_nistz256_mul_montq - - mov rax,QWORD[480+rsp] - lea rbx,[480+rsp] - mov r9,QWORD[((0+32))+rsp] - mov r10,QWORD[((8+32))+rsp] - lea rsi,[((0+32))+rsp] - mov r11,QWORD[((16+32))+rsp] - mov r12,QWORD[((24+32))+rsp] - lea rdi,[192+rsp] - call __ecp_nistz256_mul_montq - - lea rbx,[160+rsp] - lea rdi,[rsp] - call __ecp_nistz256_sub_fromq - - or r12,r13 - or r12,r8 - or r12,r9 - -DB 102,73,15,126,208 -DB 102,73,15,126,217 - or r12,r8 -DB 0x3e - jnz NEAR $L$add_proceedq - - - - test r9,r9 - jz NEAR $L$add_doubleq - - - - - - -DB 102,72,15,126,199 - pxor xmm0,xmm0 - movdqu XMMWORD[rdi],xmm0 - movdqu XMMWORD[16+rdi],xmm0 - movdqu XMMWORD[32+rdi],xmm0 - movdqu XMMWORD[48+rdi],xmm0 - movdqu XMMWORD[64+rdi],xmm0 - movdqu XMMWORD[80+rdi],xmm0 - jmp NEAR $L$add_doneq - -ALIGN 32 -$L$add_doubleq: -DB 102,72,15,126,206 -DB 102,72,15,126,199 - add rsp,416 - - jmp NEAR $L$point_double_shortcutq - - -ALIGN 32 -$L$add_proceedq: - mov rax,QWORD[((0+64))+rsp] - mov r14,QWORD[((8+64))+rsp] - lea rsi,[((0+64))+rsp] - mov r15,QWORD[((16+64))+rsp] - mov r8,QWORD[((24+64))+rsp] - lea rdi,[96+rsp] - call __ecp_nistz256_sqr_montq - - mov rax,QWORD[448+rsp] - lea rbx,[448+rsp] - mov r9,QWORD[((0+0))+rsp] - mov r10,QWORD[((8+0))+rsp] - lea rsi,[((0+0))+rsp] - mov r11,QWORD[((16+0))+rsp] - mov r12,QWORD[((24+0))+rsp] - lea rdi,[352+rsp] - call __ecp_nistz256_mul_montq - - mov rax,QWORD[((0+0))+rsp] - mov r14,QWORD[((8+0))+rsp] - lea rsi,[((0+0))+rsp] - mov r15,QWORD[((16+0))+rsp] - mov r8,QWORD[((24+0))+rsp] - lea rdi,[32+rsp] - call __ecp_nistz256_sqr_montq - - mov rax,QWORD[544+rsp] - lea rbx,[544+rsp] - mov r9,QWORD[((0+352))+rsp] - mov r10,QWORD[((8+352))+rsp] - lea rsi,[((0+352))+rsp] - mov r11,QWORD[((16+352))+rsp] - mov r12,QWORD[((24+352))+rsp] - lea rdi,[352+rsp] - call __ecp_nistz256_mul_montq - - mov rax,QWORD[rsp] - lea rbx,[rsp] - mov r9,QWORD[((0+32))+rsp] - mov r10,QWORD[((8+32))+rsp] - lea rsi,[((0+32))+rsp] - mov r11,QWORD[((16+32))+rsp] - mov r12,QWORD[((24+32))+rsp] - lea rdi,[128+rsp] - call __ecp_nistz256_mul_montq - - mov rax,QWORD[160+rsp] - lea rbx,[160+rsp] - mov r9,QWORD[((0+32))+rsp] - mov r10,QWORD[((8+32))+rsp] - lea rsi,[((0+32))+rsp] - mov r11,QWORD[((16+32))+rsp] - mov r12,QWORD[((24+32))+rsp] - lea rdi,[192+rsp] - call __ecp_nistz256_mul_montq - - - - - xor r11,r11 - add r12,r12 - lea rsi,[96+rsp] - adc r13,r13 - mov rax,r12 - adc r8,r8 - adc r9,r9 - mov rbp,r13 - adc r11,0 - - sub r12,-1 - mov rcx,r8 - sbb r13,r14 - sbb r8,0 - mov r10,r9 - sbb r9,r15 - sbb r11,0 - - cmovc r12,rax - mov rax,QWORD[rsi] - cmovc r13,rbp - mov rbp,QWORD[8+rsi] - cmovc r8,rcx - mov rcx,QWORD[16+rsi] - cmovc r9,r10 - mov r10,QWORD[24+rsi] - - call __ecp_nistz256_subq - - lea rbx,[128+rsp] - lea rdi,[288+rsp] - call __ecp_nistz256_sub_fromq - - mov rax,QWORD[((192+0))+rsp] - mov rbp,QWORD[((192+8))+rsp] - mov rcx,QWORD[((192+16))+rsp] - mov r10,QWORD[((192+24))+rsp] - lea rdi,[320+rsp] - - call __ecp_nistz256_subq - - mov QWORD[rdi],r12 - mov QWORD[8+rdi],r13 - mov QWORD[16+rdi],r8 - mov QWORD[24+rdi],r9 - mov rax,QWORD[128+rsp] - lea rbx,[128+rsp] - mov r9,QWORD[((0+224))+rsp] - mov r10,QWORD[((8+224))+rsp] - lea rsi,[((0+224))+rsp] - mov r11,QWORD[((16+224))+rsp] - mov r12,QWORD[((24+224))+rsp] - lea rdi,[256+rsp] - call __ecp_nistz256_mul_montq - - mov rax,QWORD[320+rsp] - lea rbx,[320+rsp] - mov r9,QWORD[((0+64))+rsp] - mov r10,QWORD[((8+64))+rsp] - lea rsi,[((0+64))+rsp] - mov r11,QWORD[((16+64))+rsp] - mov r12,QWORD[((24+64))+rsp] - lea rdi,[320+rsp] - call __ecp_nistz256_mul_montq - - lea rbx,[256+rsp] - lea rdi,[320+rsp] - call __ecp_nistz256_sub_fromq - -DB 102,72,15,126,199 - - movdqa xmm0,xmm5 - movdqa xmm1,xmm5 - pandn xmm0,XMMWORD[352+rsp] - movdqa xmm2,xmm5 - pandn xmm1,XMMWORD[((352+16))+rsp] - movdqa xmm3,xmm5 - pand xmm2,XMMWORD[544+rsp] - pand xmm3,XMMWORD[((544+16))+rsp] - por xmm2,xmm0 - por xmm3,xmm1 - - movdqa xmm0,xmm4 - movdqa xmm1,xmm4 - pandn xmm0,xmm2 - movdqa xmm2,xmm4 - pandn xmm1,xmm3 - movdqa xmm3,xmm4 - pand xmm2,XMMWORD[448+rsp] - pand xmm3,XMMWORD[((448+16))+rsp] - por xmm2,xmm0 - por xmm3,xmm1 - movdqu XMMWORD[64+rdi],xmm2 - movdqu XMMWORD[80+rdi],xmm3 - - movdqa xmm0,xmm5 - movdqa xmm1,xmm5 - pandn xmm0,XMMWORD[288+rsp] - movdqa xmm2,xmm5 - pandn xmm1,XMMWORD[((288+16))+rsp] - movdqa xmm3,xmm5 - pand xmm2,XMMWORD[480+rsp] - pand xmm3,XMMWORD[((480+16))+rsp] - por xmm2,xmm0 - por xmm3,xmm1 - - movdqa xmm0,xmm4 - movdqa xmm1,xmm4 - pandn xmm0,xmm2 - movdqa xmm2,xmm4 - pandn xmm1,xmm3 - movdqa xmm3,xmm4 - pand xmm2,XMMWORD[384+rsp] - pand xmm3,XMMWORD[((384+16))+rsp] - por xmm2,xmm0 - por xmm3,xmm1 - movdqu XMMWORD[rdi],xmm2 - movdqu XMMWORD[16+rdi],xmm3 - - movdqa xmm0,xmm5 - movdqa xmm1,xmm5 - pandn xmm0,XMMWORD[320+rsp] - movdqa xmm2,xmm5 - pandn xmm1,XMMWORD[((320+16))+rsp] - movdqa xmm3,xmm5 - pand xmm2,XMMWORD[512+rsp] - pand xmm3,XMMWORD[((512+16))+rsp] - por xmm2,xmm0 - por xmm3,xmm1 - - movdqa xmm0,xmm4 - movdqa xmm1,xmm4 - pandn xmm0,xmm2 - movdqa xmm2,xmm4 - pandn xmm1,xmm3 - movdqa xmm3,xmm4 - pand xmm2,XMMWORD[416+rsp] - pand xmm3,XMMWORD[((416+16))+rsp] - por xmm2,xmm0 - por xmm3,xmm1 - movdqu XMMWORD[32+rdi],xmm2 - movdqu XMMWORD[48+rdi],xmm3 - -$L$add_doneq: - lea rsi,[((576+56))+rsp] - - mov r15,QWORD[((-48))+rsi] - - mov r14,QWORD[((-40))+rsi] - - mov r13,QWORD[((-32))+rsi] - - mov r12,QWORD[((-24))+rsi] - - mov rbx,QWORD[((-16))+rsi] - - mov rbp,QWORD[((-8))+rsi] - - lea rsp,[rsi] - -$L$point_addq_epilogue: - mov rdi,QWORD[8+rsp] ;WIN64 epilogue - mov rsi,QWORD[16+rsp] - DB 0F3h,0C3h ;repret - -$L$SEH_end_GFp_nistz256_point_add: -global GFp_nistz256_point_add_affine - -ALIGN 32 -GFp_nistz256_point_add_affine: - mov QWORD[8+rsp],rdi ;WIN64 prologue - mov QWORD[16+rsp],rsi - mov rax,rsp -$L$SEH_begin_GFp_nistz256_point_add_affine: - mov rdi,rcx - mov rsi,rdx - mov rdx,r8 - - - - lea rcx,[GFp_ia32cap_P] - mov rcx,QWORD[8+rcx] - and ecx,0x80100 - cmp ecx,0x80100 - je NEAR $L$point_add_affinex - push rbp - - push rbx - - push r12 - - push r13 - - push r14 - - push r15 - - sub rsp,32*15+8 - -$L$add_affineq_body: - - movdqu xmm0,XMMWORD[rsi] - mov rbx,rdx - movdqu xmm1,XMMWORD[16+rsi] - movdqu xmm2,XMMWORD[32+rsi] - movdqu xmm3,XMMWORD[48+rsi] - movdqu xmm4,XMMWORD[64+rsi] - movdqu xmm5,XMMWORD[80+rsi] - mov rax,QWORD[((64+0))+rsi] - mov r14,QWORD[((64+8))+rsi] - mov r15,QWORD[((64+16))+rsi] - mov r8,QWORD[((64+24))+rsi] - movdqa XMMWORD[320+rsp],xmm0 - movdqa XMMWORD[(320+16)+rsp],xmm1 - movdqa XMMWORD[352+rsp],xmm2 - movdqa XMMWORD[(352+16)+rsp],xmm3 - movdqa XMMWORD[384+rsp],xmm4 - movdqa XMMWORD[(384+16)+rsp],xmm5 - por xmm5,xmm4 - - movdqu xmm0,XMMWORD[rbx] - pshufd xmm3,xmm5,0xb1 - movdqu xmm1,XMMWORD[16+rbx] - movdqu xmm2,XMMWORD[32+rbx] - por xmm5,xmm3 - movdqu xmm3,XMMWORD[48+rbx] - movdqa XMMWORD[416+rsp],xmm0 - pshufd xmm4,xmm5,0x1e - movdqa XMMWORD[(416+16)+rsp],xmm1 - por xmm1,xmm0 -DB 102,72,15,110,199 - movdqa XMMWORD[448+rsp],xmm2 - movdqa XMMWORD[(448+16)+rsp],xmm3 - por xmm3,xmm2 - por xmm5,xmm4 - pxor xmm4,xmm4 - por xmm3,xmm1 - - lea rsi,[((64-0))+rsi] - lea rdi,[32+rsp] - call __ecp_nistz256_sqr_montq - - pcmpeqd xmm5,xmm4 - pshufd xmm4,xmm3,0xb1 - mov rax,QWORD[rbx] - - mov r9,r12 - por xmm4,xmm3 - pshufd xmm5,xmm5,0 - pshufd xmm3,xmm4,0x1e - mov r10,r13 - por xmm4,xmm3 - pxor xmm3,xmm3 - mov r11,r14 - pcmpeqd xmm4,xmm3 - pshufd xmm4,xmm4,0 - - lea rsi,[((32-0))+rsp] - mov r12,r15 - lea rdi,[rsp] - call __ecp_nistz256_mul_montq - - lea rbx,[320+rsp] - lea rdi,[64+rsp] - call __ecp_nistz256_sub_fromq - - mov rax,QWORD[384+rsp] - lea rbx,[384+rsp] - mov r9,QWORD[((0+32))+rsp] - mov r10,QWORD[((8+32))+rsp] - lea rsi,[((0+32))+rsp] - mov r11,QWORD[((16+32))+rsp] - mov r12,QWORD[((24+32))+rsp] - lea rdi,[32+rsp] - call __ecp_nistz256_mul_montq - - mov rax,QWORD[384+rsp] - lea rbx,[384+rsp] - mov r9,QWORD[((0+64))+rsp] - mov r10,QWORD[((8+64))+rsp] - lea rsi,[((0+64))+rsp] - mov r11,QWORD[((16+64))+rsp] - mov r12,QWORD[((24+64))+rsp] - lea rdi,[288+rsp] - call __ecp_nistz256_mul_montq - - mov rax,QWORD[448+rsp] - lea rbx,[448+rsp] - mov r9,QWORD[((0+32))+rsp] - mov r10,QWORD[((8+32))+rsp] - lea rsi,[((0+32))+rsp] - mov r11,QWORD[((16+32))+rsp] - mov r12,QWORD[((24+32))+rsp] - lea rdi,[32+rsp] - call __ecp_nistz256_mul_montq - - lea rbx,[352+rsp] - lea rdi,[96+rsp] - call __ecp_nistz256_sub_fromq - - mov rax,QWORD[((0+64))+rsp] - mov r14,QWORD[((8+64))+rsp] - lea rsi,[((0+64))+rsp] - mov r15,QWORD[((16+64))+rsp] - mov r8,QWORD[((24+64))+rsp] - lea rdi,[128+rsp] - call __ecp_nistz256_sqr_montq - - mov rax,QWORD[((0+96))+rsp] - mov r14,QWORD[((8+96))+rsp] - lea rsi,[((0+96))+rsp] - mov r15,QWORD[((16+96))+rsp] - mov r8,QWORD[((24+96))+rsp] - lea rdi,[192+rsp] - call __ecp_nistz256_sqr_montq - - mov rax,QWORD[128+rsp] - lea rbx,[128+rsp] - mov r9,QWORD[((0+64))+rsp] - mov r10,QWORD[((8+64))+rsp] - lea rsi,[((0+64))+rsp] - mov r11,QWORD[((16+64))+rsp] - mov r12,QWORD[((24+64))+rsp] - lea rdi,[160+rsp] - call __ecp_nistz256_mul_montq - - mov rax,QWORD[320+rsp] - lea rbx,[320+rsp] - mov r9,QWORD[((0+128))+rsp] - mov r10,QWORD[((8+128))+rsp] - lea rsi,[((0+128))+rsp] - mov r11,QWORD[((16+128))+rsp] - mov r12,QWORD[((24+128))+rsp] - lea rdi,[rsp] - call __ecp_nistz256_mul_montq - - - - - xor r11,r11 - add r12,r12 - lea rsi,[192+rsp] - adc r13,r13 - mov rax,r12 - adc r8,r8 - adc r9,r9 - mov rbp,r13 - adc r11,0 - - sub r12,-1 - mov rcx,r8 - sbb r13,r14 - sbb r8,0 - mov r10,r9 - sbb r9,r15 - sbb r11,0 - - cmovc r12,rax - mov rax,QWORD[rsi] - cmovc r13,rbp - mov rbp,QWORD[8+rsi] - cmovc r8,rcx - mov rcx,QWORD[16+rsi] - cmovc r9,r10 - mov r10,QWORD[24+rsi] - - call __ecp_nistz256_subq - - lea rbx,[160+rsp] - lea rdi,[224+rsp] - call __ecp_nistz256_sub_fromq - - mov rax,QWORD[((0+0))+rsp] - mov rbp,QWORD[((0+8))+rsp] - mov rcx,QWORD[((0+16))+rsp] - mov r10,QWORD[((0+24))+rsp] - lea rdi,[64+rsp] - - call __ecp_nistz256_subq - - mov QWORD[rdi],r12 - mov QWORD[8+rdi],r13 - mov QWORD[16+rdi],r8 - mov QWORD[24+rdi],r9 - mov rax,QWORD[352+rsp] - lea rbx,[352+rsp] - mov r9,QWORD[((0+160))+rsp] - mov r10,QWORD[((8+160))+rsp] - lea rsi,[((0+160))+rsp] - mov r11,QWORD[((16+160))+rsp] - mov r12,QWORD[((24+160))+rsp] - lea rdi,[32+rsp] - call __ecp_nistz256_mul_montq - - mov rax,QWORD[96+rsp] - lea rbx,[96+rsp] - mov r9,QWORD[((0+64))+rsp] - mov r10,QWORD[((8+64))+rsp] - lea rsi,[((0+64))+rsp] - mov r11,QWORD[((16+64))+rsp] - mov r12,QWORD[((24+64))+rsp] - lea rdi,[64+rsp] - call __ecp_nistz256_mul_montq - - lea rbx,[32+rsp] - lea rdi,[256+rsp] - call __ecp_nistz256_sub_fromq - -DB 102,72,15,126,199 - - movdqa xmm0,xmm5 - movdqa xmm1,xmm5 - pandn xmm0,XMMWORD[288+rsp] - movdqa xmm2,xmm5 - pandn xmm1,XMMWORD[((288+16))+rsp] - movdqa xmm3,xmm5 - pand xmm2,XMMWORD[$L$ONE_mont] - pand xmm3,XMMWORD[(($L$ONE_mont+16))] - por xmm2,xmm0 - por xmm3,xmm1 - - movdqa xmm0,xmm4 - movdqa xmm1,xmm4 - pandn xmm0,xmm2 - movdqa xmm2,xmm4 - pandn xmm1,xmm3 - movdqa xmm3,xmm4 - pand xmm2,XMMWORD[384+rsp] - pand xmm3,XMMWORD[((384+16))+rsp] - por xmm2,xmm0 - por xmm3,xmm1 - movdqu XMMWORD[64+rdi],xmm2 - movdqu XMMWORD[80+rdi],xmm3 - - movdqa xmm0,xmm5 - movdqa xmm1,xmm5 - pandn xmm0,XMMWORD[224+rsp] - movdqa xmm2,xmm5 - pandn xmm1,XMMWORD[((224+16))+rsp] - movdqa xmm3,xmm5 - pand xmm2,XMMWORD[416+rsp] - pand xmm3,XMMWORD[((416+16))+rsp] - por xmm2,xmm0 - por xmm3,xmm1 - - movdqa xmm0,xmm4 - movdqa xmm1,xmm4 - pandn xmm0,xmm2 - movdqa xmm2,xmm4 - pandn xmm1,xmm3 - movdqa xmm3,xmm4 - pand xmm2,XMMWORD[320+rsp] - pand xmm3,XMMWORD[((320+16))+rsp] - por xmm2,xmm0 - por xmm3,xmm1 - movdqu XMMWORD[rdi],xmm2 - movdqu XMMWORD[16+rdi],xmm3 - - movdqa xmm0,xmm5 - movdqa xmm1,xmm5 - pandn xmm0,XMMWORD[256+rsp] - movdqa xmm2,xmm5 - pandn xmm1,XMMWORD[((256+16))+rsp] - movdqa xmm3,xmm5 - pand xmm2,XMMWORD[448+rsp] - pand xmm3,XMMWORD[((448+16))+rsp] - por xmm2,xmm0 - por xmm3,xmm1 - - movdqa xmm0,xmm4 - movdqa xmm1,xmm4 - pandn xmm0,xmm2 - movdqa xmm2,xmm4 - pandn xmm1,xmm3 - movdqa xmm3,xmm4 - pand xmm2,XMMWORD[352+rsp] - pand xmm3,XMMWORD[((352+16))+rsp] - por xmm2,xmm0 - por xmm3,xmm1 - movdqu XMMWORD[32+rdi],xmm2 - movdqu XMMWORD[48+rdi],xmm3 - - lea rsi,[((480+56))+rsp] - - mov r15,QWORD[((-48))+rsi] - - mov r14,QWORD[((-40))+rsi] - - mov r13,QWORD[((-32))+rsi] - - mov r12,QWORD[((-24))+rsi] - - mov rbx,QWORD[((-16))+rsi] - - mov rbp,QWORD[((-8))+rsi] - - lea rsp,[rsi] - -$L$add_affineq_epilogue: - mov rdi,QWORD[8+rsp] ;WIN64 epilogue - mov rsi,QWORD[16+rsp] - DB 0F3h,0C3h ;repret - -$L$SEH_end_GFp_nistz256_point_add_affine: - -ALIGN 32 -__ecp_nistz256_add_tox: - - xor r11,r11 - adc r12,QWORD[rbx] - adc r13,QWORD[8+rbx] - mov rax,r12 - adc r8,QWORD[16+rbx] - adc r9,QWORD[24+rbx] - mov rbp,r13 - adc r11,0 - - xor r10,r10 - sbb r12,-1 - mov rcx,r8 - sbb r13,r14 - sbb r8,0 - mov r10,r9 - sbb r9,r15 - sbb r11,0 - - cmovc r12,rax - cmovc r13,rbp - mov QWORD[rdi],r12 - cmovc r8,rcx - mov QWORD[8+rdi],r13 - cmovc r9,r10 - mov QWORD[16+rdi],r8 - mov QWORD[24+rdi],r9 - - DB 0F3h,0C3h ;repret - - - - -ALIGN 32 -__ecp_nistz256_sub_fromx: - - xor r11,r11 - sbb r12,QWORD[rbx] - sbb r13,QWORD[8+rbx] - mov rax,r12 - sbb r8,QWORD[16+rbx] - sbb r9,QWORD[24+rbx] - mov rbp,r13 - sbb r11,0 - - xor r10,r10 - adc r12,-1 - mov rcx,r8 - adc r13,r14 - adc r8,0 - mov r10,r9 - adc r9,r15 - - bt r11,0 - cmovnc r12,rax - cmovnc r13,rbp - mov QWORD[rdi],r12 - cmovnc r8,rcx - mov QWORD[8+rdi],r13 - cmovnc r9,r10 - mov QWORD[16+rdi],r8 - mov QWORD[24+rdi],r9 - - DB 0F3h,0C3h ;repret - - - - -ALIGN 32 -__ecp_nistz256_subx: - - xor r11,r11 - sbb rax,r12 - sbb rbp,r13 - mov r12,rax - sbb rcx,r8 - sbb r10,r9 - mov r13,rbp - sbb r11,0 - - xor r9,r9 - adc rax,-1 - mov r8,rcx - adc rbp,r14 - adc rcx,0 - mov r9,r10 - adc r10,r15 - - bt r11,0 - cmovc r12,rax - cmovc r13,rbp - cmovc r8,rcx - cmovc r9,r10 - - DB 0F3h,0C3h ;repret - - - - -ALIGN 32 -__ecp_nistz256_mul_by_2x: - - xor r11,r11 - adc r12,r12 - adc r13,r13 - mov rax,r12 - adc r8,r8 - adc r9,r9 - mov rbp,r13 - adc r11,0 - - xor r10,r10 - sbb r12,-1 - mov rcx,r8 - sbb r13,r14 - sbb r8,0 - mov r10,r9 - sbb r9,r15 - sbb r11,0 - - cmovc r12,rax - cmovc r13,rbp - mov QWORD[rdi],r12 - cmovc r8,rcx - mov QWORD[8+rdi],r13 - cmovc r9,r10 - mov QWORD[16+rdi],r8 - mov QWORD[24+rdi],r9 - - DB 0F3h,0C3h ;repret - - - -ALIGN 32 -GFp_nistz256_point_doublex: - mov QWORD[8+rsp],rdi ;WIN64 prologue - mov QWORD[16+rsp],rsi - mov rax,rsp -$L$SEH_begin_GFp_nistz256_point_doublex: - mov rdi,rcx - mov rsi,rdx - - - -$L$point_doublex: - push rbp - - push rbx - - push r12 - - push r13 - - push r14 - - push r15 - - sub rsp,32*5+8 - -$L$point_doublex_body: - -$L$point_double_shortcutx: - movdqu xmm0,XMMWORD[rsi] - mov rbx,rsi - movdqu xmm1,XMMWORD[16+rsi] - mov r12,QWORD[((32+0))+rsi] - mov r13,QWORD[((32+8))+rsi] - mov r8,QWORD[((32+16))+rsi] - mov r9,QWORD[((32+24))+rsi] - mov r14,QWORD[(($L$poly+8))] - mov r15,QWORD[(($L$poly+24))] - movdqa XMMWORD[96+rsp],xmm0 - movdqa XMMWORD[(96+16)+rsp],xmm1 - lea r10,[32+rdi] - lea r11,[64+rdi] -DB 102,72,15,110,199 -DB 102,73,15,110,202 -DB 102,73,15,110,211 - - lea rdi,[rsp] - call __ecp_nistz256_mul_by_2x - - mov rdx,QWORD[((64+0))+rsi] - mov r14,QWORD[((64+8))+rsi] - mov r15,QWORD[((64+16))+rsi] - mov r8,QWORD[((64+24))+rsi] - lea rsi,[((64-128))+rsi] - lea rdi,[64+rsp] - call __ecp_nistz256_sqr_montx - - mov rdx,QWORD[((0+0))+rsp] - mov r14,QWORD[((8+0))+rsp] - lea rsi,[((-128+0))+rsp] - mov r15,QWORD[((16+0))+rsp] - mov r8,QWORD[((24+0))+rsp] - lea rdi,[rsp] - call __ecp_nistz256_sqr_montx - - mov rdx,QWORD[32+rbx] - mov r9,QWORD[((64+0))+rbx] - mov r10,QWORD[((64+8))+rbx] - mov r11,QWORD[((64+16))+rbx] - mov r12,QWORD[((64+24))+rbx] - lea rsi,[((64-128))+rbx] - lea rbx,[32+rbx] -DB 102,72,15,126,215 - call __ecp_nistz256_mul_montx - call __ecp_nistz256_mul_by_2x - - mov r12,QWORD[((96+0))+rsp] - mov r13,QWORD[((96+8))+rsp] - lea rbx,[64+rsp] - mov r8,QWORD[((96+16))+rsp] - mov r9,QWORD[((96+24))+rsp] - lea rdi,[32+rsp] - call __ecp_nistz256_add_tox - - mov r12,QWORD[((96+0))+rsp] - mov r13,QWORD[((96+8))+rsp] - lea rbx,[64+rsp] - mov r8,QWORD[((96+16))+rsp] - mov r9,QWORD[((96+24))+rsp] - lea rdi,[64+rsp] - call __ecp_nistz256_sub_fromx - - mov rdx,QWORD[((0+0))+rsp] - mov r14,QWORD[((8+0))+rsp] - lea rsi,[((-128+0))+rsp] - mov r15,QWORD[((16+0))+rsp] - mov r8,QWORD[((24+0))+rsp] -DB 102,72,15,126,207 - call __ecp_nistz256_sqr_montx - xor r9,r9 - mov rax,r12 - add r12,-1 - mov r10,r13 - adc r13,rsi - mov rcx,r14 - adc r14,0 - mov r8,r15 - adc r15,rbp - adc r9,0 - xor rsi,rsi - test rax,1 - - cmovz r12,rax - cmovz r13,r10 - cmovz r14,rcx - cmovz r15,r8 - cmovz r9,rsi - - mov rax,r13 - shr r12,1 - shl rax,63 - mov r10,r14 - shr r13,1 - or r12,rax - shl r10,63 - mov rcx,r15 - shr r14,1 - or r13,r10 - shl rcx,63 - mov QWORD[rdi],r12 - shr r15,1 - mov QWORD[8+rdi],r13 - shl r9,63 - or r14,rcx - or r15,r9 - mov QWORD[16+rdi],r14 - mov QWORD[24+rdi],r15 - mov rdx,QWORD[64+rsp] - lea rbx,[64+rsp] - mov r9,QWORD[((0+32))+rsp] - mov r10,QWORD[((8+32))+rsp] - lea rsi,[((-128+32))+rsp] - mov r11,QWORD[((16+32))+rsp] - mov r12,QWORD[((24+32))+rsp] - lea rdi,[32+rsp] - call __ecp_nistz256_mul_montx - - lea rdi,[128+rsp] - call __ecp_nistz256_mul_by_2x - - lea rbx,[32+rsp] - lea rdi,[32+rsp] - call __ecp_nistz256_add_tox - - mov rdx,QWORD[96+rsp] - lea rbx,[96+rsp] - mov r9,QWORD[((0+0))+rsp] - mov r10,QWORD[((8+0))+rsp] - lea rsi,[((-128+0))+rsp] - mov r11,QWORD[((16+0))+rsp] - mov r12,QWORD[((24+0))+rsp] - lea rdi,[rsp] - call __ecp_nistz256_mul_montx - - lea rdi,[128+rsp] - call __ecp_nistz256_mul_by_2x - - mov rdx,QWORD[((0+32))+rsp] - mov r14,QWORD[((8+32))+rsp] - lea rsi,[((-128+32))+rsp] - mov r15,QWORD[((16+32))+rsp] - mov r8,QWORD[((24+32))+rsp] -DB 102,72,15,126,199 - call __ecp_nistz256_sqr_montx - - lea rbx,[128+rsp] - mov r8,r14 - mov r9,r15 - mov r14,rsi - mov r15,rbp - call __ecp_nistz256_sub_fromx - - mov rax,QWORD[((0+0))+rsp] - mov rbp,QWORD[((0+8))+rsp] - mov rcx,QWORD[((0+16))+rsp] - mov r10,QWORD[((0+24))+rsp] - lea rdi,[rsp] - call __ecp_nistz256_subx - - mov rdx,QWORD[32+rsp] - lea rbx,[32+rsp] - mov r14,r12 - xor ecx,ecx - mov QWORD[((0+0))+rsp],r12 - mov r10,r13 - mov QWORD[((0+8))+rsp],r13 - cmovz r11,r8 - mov QWORD[((0+16))+rsp],r8 - lea rsi,[((0-128))+rsp] - cmovz r12,r9 - mov QWORD[((0+24))+rsp],r9 - mov r9,r14 - lea rdi,[rsp] - call __ecp_nistz256_mul_montx - -DB 102,72,15,126,203 -DB 102,72,15,126,207 - call __ecp_nistz256_sub_fromx - - lea rsi,[((160+56))+rsp] - - mov r15,QWORD[((-48))+rsi] - - mov r14,QWORD[((-40))+rsi] - - mov r13,QWORD[((-32))+rsi] - - mov r12,QWORD[((-24))+rsi] - - mov rbx,QWORD[((-16))+rsi] - - mov rbp,QWORD[((-8))+rsi] - - lea rsp,[rsi] - -$L$point_doublex_epilogue: - mov rdi,QWORD[8+rsp] ;WIN64 epilogue - mov rsi,QWORD[16+rsp] - DB 0F3h,0C3h ;repret - -$L$SEH_end_GFp_nistz256_point_doublex: - -ALIGN 32 -GFp_nistz256_point_addx: - mov QWORD[8+rsp],rdi ;WIN64 prologue - mov QWORD[16+rsp],rsi - mov rax,rsp -$L$SEH_begin_GFp_nistz256_point_addx: - mov rdi,rcx - mov rsi,rdx - mov rdx,r8 - - - -$L$point_addx: - push rbp - - push rbx - - push r12 - - push r13 - - push r14 - - push r15 - - sub rsp,32*18+8 - -$L$point_addx_body: - - movdqu xmm0,XMMWORD[rsi] - movdqu xmm1,XMMWORD[16+rsi] - movdqu xmm2,XMMWORD[32+rsi] - movdqu xmm3,XMMWORD[48+rsi] - movdqu xmm4,XMMWORD[64+rsi] - movdqu xmm5,XMMWORD[80+rsi] - mov rbx,rsi - mov rsi,rdx - movdqa XMMWORD[384+rsp],xmm0 - movdqa XMMWORD[(384+16)+rsp],xmm1 - movdqa XMMWORD[416+rsp],xmm2 - movdqa XMMWORD[(416+16)+rsp],xmm3 - movdqa XMMWORD[448+rsp],xmm4 - movdqa XMMWORD[(448+16)+rsp],xmm5 - por xmm5,xmm4 - - movdqu xmm0,XMMWORD[rsi] - pshufd xmm3,xmm5,0xb1 - movdqu xmm1,XMMWORD[16+rsi] - movdqu xmm2,XMMWORD[32+rsi] - por xmm5,xmm3 - movdqu xmm3,XMMWORD[48+rsi] - mov rdx,QWORD[((64+0))+rsi] - mov r14,QWORD[((64+8))+rsi] - mov r15,QWORD[((64+16))+rsi] - mov r8,QWORD[((64+24))+rsi] - movdqa XMMWORD[480+rsp],xmm0 - pshufd xmm4,xmm5,0x1e - movdqa XMMWORD[(480+16)+rsp],xmm1 - movdqu xmm0,XMMWORD[64+rsi] - movdqu xmm1,XMMWORD[80+rsi] - movdqa XMMWORD[512+rsp],xmm2 - movdqa XMMWORD[(512+16)+rsp],xmm3 - por xmm5,xmm4 - pxor xmm4,xmm4 - por xmm1,xmm0 -DB 102,72,15,110,199 - - lea rsi,[((64-128))+rsi] - mov QWORD[((544+0))+rsp],rdx - mov QWORD[((544+8))+rsp],r14 - mov QWORD[((544+16))+rsp],r15 - mov QWORD[((544+24))+rsp],r8 - lea rdi,[96+rsp] - call __ecp_nistz256_sqr_montx - - pcmpeqd xmm5,xmm4 - pshufd xmm4,xmm1,0xb1 - por xmm4,xmm1 - pshufd xmm5,xmm5,0 - pshufd xmm3,xmm4,0x1e - por xmm4,xmm3 - pxor xmm3,xmm3 - pcmpeqd xmm4,xmm3 - pshufd xmm4,xmm4,0 - mov rdx,QWORD[((64+0))+rbx] - mov r14,QWORD[((64+8))+rbx] - mov r15,QWORD[((64+16))+rbx] - mov r8,QWORD[((64+24))+rbx] -DB 102,72,15,110,203 - - lea rsi,[((64-128))+rbx] - lea rdi,[32+rsp] - call __ecp_nistz256_sqr_montx - - mov rdx,QWORD[544+rsp] - lea rbx,[544+rsp] - mov r9,QWORD[((0+96))+rsp] - mov r10,QWORD[((8+96))+rsp] - lea rsi,[((-128+96))+rsp] - mov r11,QWORD[((16+96))+rsp] - mov r12,QWORD[((24+96))+rsp] - lea rdi,[224+rsp] - call __ecp_nistz256_mul_montx - - mov rdx,QWORD[448+rsp] - lea rbx,[448+rsp] - mov r9,QWORD[((0+32))+rsp] - mov r10,QWORD[((8+32))+rsp] - lea rsi,[((-128+32))+rsp] - mov r11,QWORD[((16+32))+rsp] - mov r12,QWORD[((24+32))+rsp] - lea rdi,[256+rsp] - call __ecp_nistz256_mul_montx - - mov rdx,QWORD[416+rsp] - lea rbx,[416+rsp] - mov r9,QWORD[((0+224))+rsp] - mov r10,QWORD[((8+224))+rsp] - lea rsi,[((-128+224))+rsp] - mov r11,QWORD[((16+224))+rsp] - mov r12,QWORD[((24+224))+rsp] - lea rdi,[224+rsp] - call __ecp_nistz256_mul_montx - - mov rdx,QWORD[512+rsp] - lea rbx,[512+rsp] - mov r9,QWORD[((0+256))+rsp] - mov r10,QWORD[((8+256))+rsp] - lea rsi,[((-128+256))+rsp] - mov r11,QWORD[((16+256))+rsp] - mov r12,QWORD[((24+256))+rsp] - lea rdi,[256+rsp] - call __ecp_nistz256_mul_montx - - lea rbx,[224+rsp] - lea rdi,[64+rsp] - call __ecp_nistz256_sub_fromx - - or r12,r13 - movdqa xmm2,xmm4 - or r12,r8 - or r12,r9 - por xmm2,xmm5 -DB 102,73,15,110,220 - - mov rdx,QWORD[384+rsp] - lea rbx,[384+rsp] - mov r9,QWORD[((0+96))+rsp] - mov r10,QWORD[((8+96))+rsp] - lea rsi,[((-128+96))+rsp] - mov r11,QWORD[((16+96))+rsp] - mov r12,QWORD[((24+96))+rsp] - lea rdi,[160+rsp] - call __ecp_nistz256_mul_montx - - mov rdx,QWORD[480+rsp] - lea rbx,[480+rsp] - mov r9,QWORD[((0+32))+rsp] - mov r10,QWORD[((8+32))+rsp] - lea rsi,[((-128+32))+rsp] - mov r11,QWORD[((16+32))+rsp] - mov r12,QWORD[((24+32))+rsp] - lea rdi,[192+rsp] - call __ecp_nistz256_mul_montx - - lea rbx,[160+rsp] - lea rdi,[rsp] - call __ecp_nistz256_sub_fromx - - or r12,r13 - or r12,r8 - or r12,r9 - -DB 102,73,15,126,208 -DB 102,73,15,126,217 - or r12,r8 -DB 0x3e - jnz NEAR $L$add_proceedx - - - - test r9,r9 - jz NEAR $L$add_doublex - - - - - - -DB 102,72,15,126,199 - pxor xmm0,xmm0 - movdqu XMMWORD[rdi],xmm0 - movdqu XMMWORD[16+rdi],xmm0 - movdqu XMMWORD[32+rdi],xmm0 - movdqu XMMWORD[48+rdi],xmm0 - movdqu XMMWORD[64+rdi],xmm0 - movdqu XMMWORD[80+rdi],xmm0 - jmp NEAR $L$add_donex - -ALIGN 32 -$L$add_doublex: -DB 102,72,15,126,206 -DB 102,72,15,126,199 - add rsp,416 - - jmp NEAR $L$point_double_shortcutx - - -ALIGN 32 -$L$add_proceedx: - mov rdx,QWORD[((0+64))+rsp] - mov r14,QWORD[((8+64))+rsp] - lea rsi,[((-128+64))+rsp] - mov r15,QWORD[((16+64))+rsp] - mov r8,QWORD[((24+64))+rsp] - lea rdi,[96+rsp] - call __ecp_nistz256_sqr_montx - - mov rdx,QWORD[448+rsp] - lea rbx,[448+rsp] - mov r9,QWORD[((0+0))+rsp] - mov r10,QWORD[((8+0))+rsp] - lea rsi,[((-128+0))+rsp] - mov r11,QWORD[((16+0))+rsp] - mov r12,QWORD[((24+0))+rsp] - lea rdi,[352+rsp] - call __ecp_nistz256_mul_montx - - mov rdx,QWORD[((0+0))+rsp] - mov r14,QWORD[((8+0))+rsp] - lea rsi,[((-128+0))+rsp] - mov r15,QWORD[((16+0))+rsp] - mov r8,QWORD[((24+0))+rsp] - lea rdi,[32+rsp] - call __ecp_nistz256_sqr_montx - - mov rdx,QWORD[544+rsp] - lea rbx,[544+rsp] - mov r9,QWORD[((0+352))+rsp] - mov r10,QWORD[((8+352))+rsp] - lea rsi,[((-128+352))+rsp] - mov r11,QWORD[((16+352))+rsp] - mov r12,QWORD[((24+352))+rsp] - lea rdi,[352+rsp] - call __ecp_nistz256_mul_montx - - mov rdx,QWORD[rsp] - lea rbx,[rsp] - mov r9,QWORD[((0+32))+rsp] - mov r10,QWORD[((8+32))+rsp] - lea rsi,[((-128+32))+rsp] - mov r11,QWORD[((16+32))+rsp] - mov r12,QWORD[((24+32))+rsp] - lea rdi,[128+rsp] - call __ecp_nistz256_mul_montx - - mov rdx,QWORD[160+rsp] - lea rbx,[160+rsp] - mov r9,QWORD[((0+32))+rsp] - mov r10,QWORD[((8+32))+rsp] - lea rsi,[((-128+32))+rsp] - mov r11,QWORD[((16+32))+rsp] - mov r12,QWORD[((24+32))+rsp] - lea rdi,[192+rsp] - call __ecp_nistz256_mul_montx - - - - - xor r11,r11 - add r12,r12 - lea rsi,[96+rsp] - adc r13,r13 - mov rax,r12 - adc r8,r8 - adc r9,r9 - mov rbp,r13 - adc r11,0 - - sub r12,-1 - mov rcx,r8 - sbb r13,r14 - sbb r8,0 - mov r10,r9 - sbb r9,r15 - sbb r11,0 - - cmovc r12,rax - mov rax,QWORD[rsi] - cmovc r13,rbp - mov rbp,QWORD[8+rsi] - cmovc r8,rcx - mov rcx,QWORD[16+rsi] - cmovc r9,r10 - mov r10,QWORD[24+rsi] - - call __ecp_nistz256_subx - - lea rbx,[128+rsp] - lea rdi,[288+rsp] - call __ecp_nistz256_sub_fromx - - mov rax,QWORD[((192+0))+rsp] - mov rbp,QWORD[((192+8))+rsp] - mov rcx,QWORD[((192+16))+rsp] - mov r10,QWORD[((192+24))+rsp] - lea rdi,[320+rsp] - - call __ecp_nistz256_subx - - mov QWORD[rdi],r12 - mov QWORD[8+rdi],r13 - mov QWORD[16+rdi],r8 - mov QWORD[24+rdi],r9 - mov rdx,QWORD[128+rsp] - lea rbx,[128+rsp] - mov r9,QWORD[((0+224))+rsp] - mov r10,QWORD[((8+224))+rsp] - lea rsi,[((-128+224))+rsp] - mov r11,QWORD[((16+224))+rsp] - mov r12,QWORD[((24+224))+rsp] - lea rdi,[256+rsp] - call __ecp_nistz256_mul_montx - - mov rdx,QWORD[320+rsp] - lea rbx,[320+rsp] - mov r9,QWORD[((0+64))+rsp] - mov r10,QWORD[((8+64))+rsp] - lea rsi,[((-128+64))+rsp] - mov r11,QWORD[((16+64))+rsp] - mov r12,QWORD[((24+64))+rsp] - lea rdi,[320+rsp] - call __ecp_nistz256_mul_montx - - lea rbx,[256+rsp] - lea rdi,[320+rsp] - call __ecp_nistz256_sub_fromx - -DB 102,72,15,126,199 - - movdqa xmm0,xmm5 - movdqa xmm1,xmm5 - pandn xmm0,XMMWORD[352+rsp] - movdqa xmm2,xmm5 - pandn xmm1,XMMWORD[((352+16))+rsp] - movdqa xmm3,xmm5 - pand xmm2,XMMWORD[544+rsp] - pand xmm3,XMMWORD[((544+16))+rsp] - por xmm2,xmm0 - por xmm3,xmm1 - - movdqa xmm0,xmm4 - movdqa xmm1,xmm4 - pandn xmm0,xmm2 - movdqa xmm2,xmm4 - pandn xmm1,xmm3 - movdqa xmm3,xmm4 - pand xmm2,XMMWORD[448+rsp] - pand xmm3,XMMWORD[((448+16))+rsp] - por xmm2,xmm0 - por xmm3,xmm1 - movdqu XMMWORD[64+rdi],xmm2 - movdqu XMMWORD[80+rdi],xmm3 - - movdqa xmm0,xmm5 - movdqa xmm1,xmm5 - pandn xmm0,XMMWORD[288+rsp] - movdqa xmm2,xmm5 - pandn xmm1,XMMWORD[((288+16))+rsp] - movdqa xmm3,xmm5 - pand xmm2,XMMWORD[480+rsp] - pand xmm3,XMMWORD[((480+16))+rsp] - por xmm2,xmm0 - por xmm3,xmm1 - - movdqa xmm0,xmm4 - movdqa xmm1,xmm4 - pandn xmm0,xmm2 - movdqa xmm2,xmm4 - pandn xmm1,xmm3 - movdqa xmm3,xmm4 - pand xmm2,XMMWORD[384+rsp] - pand xmm3,XMMWORD[((384+16))+rsp] - por xmm2,xmm0 - por xmm3,xmm1 - movdqu XMMWORD[rdi],xmm2 - movdqu XMMWORD[16+rdi],xmm3 - - movdqa xmm0,xmm5 - movdqa xmm1,xmm5 - pandn xmm0,XMMWORD[320+rsp] - movdqa xmm2,xmm5 - pandn xmm1,XMMWORD[((320+16))+rsp] - movdqa xmm3,xmm5 - pand xmm2,XMMWORD[512+rsp] - pand xmm3,XMMWORD[((512+16))+rsp] - por xmm2,xmm0 - por xmm3,xmm1 - - movdqa xmm0,xmm4 - movdqa xmm1,xmm4 - pandn xmm0,xmm2 - movdqa xmm2,xmm4 - pandn xmm1,xmm3 - movdqa xmm3,xmm4 - pand xmm2,XMMWORD[416+rsp] - pand xmm3,XMMWORD[((416+16))+rsp] - por xmm2,xmm0 - por xmm3,xmm1 - movdqu XMMWORD[32+rdi],xmm2 - movdqu XMMWORD[48+rdi],xmm3 - -$L$add_donex: - lea rsi,[((576+56))+rsp] - - mov r15,QWORD[((-48))+rsi] - - mov r14,QWORD[((-40))+rsi] - - mov r13,QWORD[((-32))+rsi] - - mov r12,QWORD[((-24))+rsi] - - mov rbx,QWORD[((-16))+rsi] - - mov rbp,QWORD[((-8))+rsi] - - lea rsp,[rsi] - -$L$point_addx_epilogue: - mov rdi,QWORD[8+rsp] ;WIN64 epilogue - mov rsi,QWORD[16+rsp] - DB 0F3h,0C3h ;repret - -$L$SEH_end_GFp_nistz256_point_addx: - -ALIGN 32 -GFp_nistz256_point_add_affinex: - mov QWORD[8+rsp],rdi ;WIN64 prologue - mov QWORD[16+rsp],rsi - mov rax,rsp -$L$SEH_begin_GFp_nistz256_point_add_affinex: - mov rdi,rcx - mov rsi,rdx - mov rdx,r8 - - - -$L$point_add_affinex: - push rbp - - push rbx - - push r12 - - push r13 - - push r14 - - push r15 - - sub rsp,32*15+8 - -$L$add_affinex_body: - - movdqu xmm0,XMMWORD[rsi] - mov rbx,rdx - movdqu xmm1,XMMWORD[16+rsi] - movdqu xmm2,XMMWORD[32+rsi] - movdqu xmm3,XMMWORD[48+rsi] - movdqu xmm4,XMMWORD[64+rsi] - movdqu xmm5,XMMWORD[80+rsi] - mov rdx,QWORD[((64+0))+rsi] - mov r14,QWORD[((64+8))+rsi] - mov r15,QWORD[((64+16))+rsi] - mov r8,QWORD[((64+24))+rsi] - movdqa XMMWORD[320+rsp],xmm0 - movdqa XMMWORD[(320+16)+rsp],xmm1 - movdqa XMMWORD[352+rsp],xmm2 - movdqa XMMWORD[(352+16)+rsp],xmm3 - movdqa XMMWORD[384+rsp],xmm4 - movdqa XMMWORD[(384+16)+rsp],xmm5 - por xmm5,xmm4 - - movdqu xmm0,XMMWORD[rbx] - pshufd xmm3,xmm5,0xb1 - movdqu xmm1,XMMWORD[16+rbx] - movdqu xmm2,XMMWORD[32+rbx] - por xmm5,xmm3 - movdqu xmm3,XMMWORD[48+rbx] - movdqa XMMWORD[416+rsp],xmm0 - pshufd xmm4,xmm5,0x1e - movdqa XMMWORD[(416+16)+rsp],xmm1 - por xmm1,xmm0 -DB 102,72,15,110,199 - movdqa XMMWORD[448+rsp],xmm2 - movdqa XMMWORD[(448+16)+rsp],xmm3 - por xmm3,xmm2 - por xmm5,xmm4 - pxor xmm4,xmm4 - por xmm3,xmm1 - - lea rsi,[((64-128))+rsi] - lea rdi,[32+rsp] - call __ecp_nistz256_sqr_montx - - pcmpeqd xmm5,xmm4 - pshufd xmm4,xmm3,0xb1 - mov rdx,QWORD[rbx] - - mov r9,r12 - por xmm4,xmm3 - pshufd xmm5,xmm5,0 - pshufd xmm3,xmm4,0x1e - mov r10,r13 - por xmm4,xmm3 - pxor xmm3,xmm3 - mov r11,r14 - pcmpeqd xmm4,xmm3 - pshufd xmm4,xmm4,0 - - lea rsi,[((32-128))+rsp] - mov r12,r15 - lea rdi,[rsp] - call __ecp_nistz256_mul_montx - - lea rbx,[320+rsp] - lea rdi,[64+rsp] - call __ecp_nistz256_sub_fromx - - mov rdx,QWORD[384+rsp] - lea rbx,[384+rsp] - mov r9,QWORD[((0+32))+rsp] - mov r10,QWORD[((8+32))+rsp] - lea rsi,[((-128+32))+rsp] - mov r11,QWORD[((16+32))+rsp] - mov r12,QWORD[((24+32))+rsp] - lea rdi,[32+rsp] - call __ecp_nistz256_mul_montx - - mov rdx,QWORD[384+rsp] - lea rbx,[384+rsp] - mov r9,QWORD[((0+64))+rsp] - mov r10,QWORD[((8+64))+rsp] - lea rsi,[((-128+64))+rsp] - mov r11,QWORD[((16+64))+rsp] - mov r12,QWORD[((24+64))+rsp] - lea rdi,[288+rsp] - call __ecp_nistz256_mul_montx - - mov rdx,QWORD[448+rsp] - lea rbx,[448+rsp] - mov r9,QWORD[((0+32))+rsp] - mov r10,QWORD[((8+32))+rsp] - lea rsi,[((-128+32))+rsp] - mov r11,QWORD[((16+32))+rsp] - mov r12,QWORD[((24+32))+rsp] - lea rdi,[32+rsp] - call __ecp_nistz256_mul_montx - - lea rbx,[352+rsp] - lea rdi,[96+rsp] - call __ecp_nistz256_sub_fromx - - mov rdx,QWORD[((0+64))+rsp] - mov r14,QWORD[((8+64))+rsp] - lea rsi,[((-128+64))+rsp] - mov r15,QWORD[((16+64))+rsp] - mov r8,QWORD[((24+64))+rsp] - lea rdi,[128+rsp] - call __ecp_nistz256_sqr_montx - - mov rdx,QWORD[((0+96))+rsp] - mov r14,QWORD[((8+96))+rsp] - lea rsi,[((-128+96))+rsp] - mov r15,QWORD[((16+96))+rsp] - mov r8,QWORD[((24+96))+rsp] - lea rdi,[192+rsp] - call __ecp_nistz256_sqr_montx - - mov rdx,QWORD[128+rsp] - lea rbx,[128+rsp] - mov r9,QWORD[((0+64))+rsp] - mov r10,QWORD[((8+64))+rsp] - lea rsi,[((-128+64))+rsp] - mov r11,QWORD[((16+64))+rsp] - mov r12,QWORD[((24+64))+rsp] - lea rdi,[160+rsp] - call __ecp_nistz256_mul_montx - - mov rdx,QWORD[320+rsp] - lea rbx,[320+rsp] - mov r9,QWORD[((0+128))+rsp] - mov r10,QWORD[((8+128))+rsp] - lea rsi,[((-128+128))+rsp] - mov r11,QWORD[((16+128))+rsp] - mov r12,QWORD[((24+128))+rsp] - lea rdi,[rsp] - call __ecp_nistz256_mul_montx - - - - - xor r11,r11 - add r12,r12 - lea rsi,[192+rsp] - adc r13,r13 - mov rax,r12 - adc r8,r8 - adc r9,r9 - mov rbp,r13 - adc r11,0 - - sub r12,-1 - mov rcx,r8 - sbb r13,r14 - sbb r8,0 - mov r10,r9 - sbb r9,r15 - sbb r11,0 - - cmovc r12,rax - mov rax,QWORD[rsi] - cmovc r13,rbp - mov rbp,QWORD[8+rsi] - cmovc r8,rcx - mov rcx,QWORD[16+rsi] - cmovc r9,r10 - mov r10,QWORD[24+rsi] - - call __ecp_nistz256_subx - - lea rbx,[160+rsp] - lea rdi,[224+rsp] - call __ecp_nistz256_sub_fromx - - mov rax,QWORD[((0+0))+rsp] - mov rbp,QWORD[((0+8))+rsp] - mov rcx,QWORD[((0+16))+rsp] - mov r10,QWORD[((0+24))+rsp] - lea rdi,[64+rsp] - - call __ecp_nistz256_subx - - mov QWORD[rdi],r12 - mov QWORD[8+rdi],r13 - mov QWORD[16+rdi],r8 - mov QWORD[24+rdi],r9 - mov rdx,QWORD[352+rsp] - lea rbx,[352+rsp] - mov r9,QWORD[((0+160))+rsp] - mov r10,QWORD[((8+160))+rsp] - lea rsi,[((-128+160))+rsp] - mov r11,QWORD[((16+160))+rsp] - mov r12,QWORD[((24+160))+rsp] - lea rdi,[32+rsp] - call __ecp_nistz256_mul_montx - - mov rdx,QWORD[96+rsp] - lea rbx,[96+rsp] - mov r9,QWORD[((0+64))+rsp] - mov r10,QWORD[((8+64))+rsp] - lea rsi,[((-128+64))+rsp] - mov r11,QWORD[((16+64))+rsp] - mov r12,QWORD[((24+64))+rsp] - lea rdi,[64+rsp] - call __ecp_nistz256_mul_montx - - lea rbx,[32+rsp] - lea rdi,[256+rsp] - call __ecp_nistz256_sub_fromx - -DB 102,72,15,126,199 - - movdqa xmm0,xmm5 - movdqa xmm1,xmm5 - pandn xmm0,XMMWORD[288+rsp] - movdqa xmm2,xmm5 - pandn xmm1,XMMWORD[((288+16))+rsp] - movdqa xmm3,xmm5 - pand xmm2,XMMWORD[$L$ONE_mont] - pand xmm3,XMMWORD[(($L$ONE_mont+16))] - por xmm2,xmm0 - por xmm3,xmm1 - - movdqa xmm0,xmm4 - movdqa xmm1,xmm4 - pandn xmm0,xmm2 - movdqa xmm2,xmm4 - pandn xmm1,xmm3 - movdqa xmm3,xmm4 - pand xmm2,XMMWORD[384+rsp] - pand xmm3,XMMWORD[((384+16))+rsp] - por xmm2,xmm0 - por xmm3,xmm1 - movdqu XMMWORD[64+rdi],xmm2 - movdqu XMMWORD[80+rdi],xmm3 - - movdqa xmm0,xmm5 - movdqa xmm1,xmm5 - pandn xmm0,XMMWORD[224+rsp] - movdqa xmm2,xmm5 - pandn xmm1,XMMWORD[((224+16))+rsp] - movdqa xmm3,xmm5 - pand xmm2,XMMWORD[416+rsp] - pand xmm3,XMMWORD[((416+16))+rsp] - por xmm2,xmm0 - por xmm3,xmm1 - - movdqa xmm0,xmm4 - movdqa xmm1,xmm4 - pandn xmm0,xmm2 - movdqa xmm2,xmm4 - pandn xmm1,xmm3 - movdqa xmm3,xmm4 - pand xmm2,XMMWORD[320+rsp] - pand xmm3,XMMWORD[((320+16))+rsp] - por xmm2,xmm0 - por xmm3,xmm1 - movdqu XMMWORD[rdi],xmm2 - movdqu XMMWORD[16+rdi],xmm3 - - movdqa xmm0,xmm5 - movdqa xmm1,xmm5 - pandn xmm0,XMMWORD[256+rsp] - movdqa xmm2,xmm5 - pandn xmm1,XMMWORD[((256+16))+rsp] - movdqa xmm3,xmm5 - pand xmm2,XMMWORD[448+rsp] - pand xmm3,XMMWORD[((448+16))+rsp] - por xmm2,xmm0 - por xmm3,xmm1 - - movdqa xmm0,xmm4 - movdqa xmm1,xmm4 - pandn xmm0,xmm2 - movdqa xmm2,xmm4 - pandn xmm1,xmm3 - movdqa xmm3,xmm4 - pand xmm2,XMMWORD[352+rsp] - pand xmm3,XMMWORD[((352+16))+rsp] - por xmm2,xmm0 - por xmm3,xmm1 - movdqu XMMWORD[32+rdi],xmm2 - movdqu XMMWORD[48+rdi],xmm3 - - lea rsi,[((480+56))+rsp] - - mov r15,QWORD[((-48))+rsi] - - mov r14,QWORD[((-40))+rsi] - - mov r13,QWORD[((-32))+rsi] - - mov r12,QWORD[((-24))+rsi] - - mov rbx,QWORD[((-16))+rsi] - - mov rbp,QWORD[((-8))+rsi] - - lea rsp,[rsi] - -$L$add_affinex_epilogue: - mov rdi,QWORD[8+rsp] ;WIN64 epilogue - mov rsi,QWORD[16+rsp] - DB 0F3h,0C3h ;repret - -$L$SEH_end_GFp_nistz256_point_add_affinex: -EXTERN __imp_RtlVirtualUnwind - - -ALIGN 16 -short_handler: - push rsi - push rdi - push rbx - push rbp - push r12 - push r13 - push r14 - push r15 - pushfq - sub rsp,64 - - mov rax,QWORD[120+r8] - mov rbx,QWORD[248+r8] - - mov rsi,QWORD[8+r9] - mov r11,QWORD[56+r9] - - mov r10d,DWORD[r11] - lea r10,[r10*1+rsi] - cmp rbx,r10 - jb NEAR $L$common_seh_tail - - mov rax,QWORD[152+r8] - - mov r10d,DWORD[4+r11] - lea r10,[r10*1+rsi] - cmp rbx,r10 - jae NEAR $L$common_seh_tail - - lea rax,[16+rax] - - mov r12,QWORD[((-8))+rax] - mov r13,QWORD[((-16))+rax] - mov QWORD[216+r8],r12 - mov QWORD[224+r8],r13 - - jmp NEAR $L$common_seh_tail - - - -ALIGN 16 -full_handler: - push rsi - push rdi - push rbx - push rbp - push r12 - push r13 - push r14 - push r15 - pushfq - sub rsp,64 - - mov rax,QWORD[120+r8] - mov rbx,QWORD[248+r8] - - mov rsi,QWORD[8+r9] - mov r11,QWORD[56+r9] - - mov r10d,DWORD[r11] - lea r10,[r10*1+rsi] - cmp rbx,r10 - jb NEAR $L$common_seh_tail - - mov rax,QWORD[152+r8] - - mov r10d,DWORD[4+r11] - lea r10,[r10*1+rsi] - cmp rbx,r10 - jae NEAR $L$common_seh_tail - - mov r10d,DWORD[8+r11] - lea rax,[r10*1+rax] - - mov rbp,QWORD[((-8))+rax] - mov rbx,QWORD[((-16))+rax] - mov r12,QWORD[((-24))+rax] - mov r13,QWORD[((-32))+rax] - mov r14,QWORD[((-40))+rax] - mov r15,QWORD[((-48))+rax] - mov QWORD[144+r8],rbx - mov QWORD[160+r8],rbp - mov QWORD[216+r8],r12 - mov QWORD[224+r8],r13 - mov QWORD[232+r8],r14 - mov QWORD[240+r8],r15 - -$L$common_seh_tail: - mov rdi,QWORD[8+rax] - mov rsi,QWORD[16+rax] - mov QWORD[152+r8],rax - mov QWORD[168+r8],rsi - mov QWORD[176+r8],rdi - - mov rdi,QWORD[40+r9] - mov rsi,r8 - mov ecx,154 - DD 0xa548f3fc - - mov rsi,r9 - xor rcx,rcx - mov rdx,QWORD[8+rsi] - mov r8,QWORD[rsi] - mov r9,QWORD[16+rsi] - mov r10,QWORD[40+rsi] - lea r11,[56+rsi] - lea r12,[24+rsi] - mov QWORD[32+rsp],r10 - mov QWORD[40+rsp],r11 - mov QWORD[48+rsp],r12 - mov QWORD[56+rsp],rcx - call QWORD[__imp_RtlVirtualUnwind] - - mov eax,1 - add rsp,64 - popfq - pop r15 - pop r14 - pop r13 - pop r12 - pop rbp - pop rbx - pop rdi - pop rsi - DB 0F3h,0C3h ;repret - - -section .pdata rdata align=4 -ALIGN 4 - DD $L$SEH_begin_GFp_nistz256_neg wrt ..imagebase - DD $L$SEH_end_GFp_nistz256_neg wrt ..imagebase - DD $L$SEH_info_GFp_nistz256_neg wrt ..imagebase - - DD $L$SEH_begin_GFp_p256_scalar_mul_mont wrt ..imagebase - DD $L$SEH_end_GFp_p256_scalar_mul_mont wrt ..imagebase - DD $L$SEH_info_GFp_p256_scalar_mul_mont wrt ..imagebase - - DD $L$SEH_begin_GFp_p256_scalar_sqr_rep_mont wrt ..imagebase - DD $L$SEH_end_GFp_p256_scalar_sqr_rep_mont wrt ..imagebase - DD $L$SEH_info_GFp_p256_scalar_sqr_rep_mont wrt ..imagebase - DD $L$SEH_begin_ecp_nistz256_ord_mul_montx wrt ..imagebase - DD $L$SEH_end_ecp_nistz256_ord_mul_montx wrt ..imagebase - DD $L$SEH_info_ecp_nistz256_ord_mul_montx wrt ..imagebase - - DD $L$SEH_begin_ecp_nistz256_ord_sqr_montx wrt ..imagebase - DD $L$SEH_end_ecp_nistz256_ord_sqr_montx wrt ..imagebase - DD $L$SEH_info_ecp_nistz256_ord_sqr_montx wrt ..imagebase - DD $L$SEH_begin_GFp_nistz256_mul_mont wrt ..imagebase - DD $L$SEH_end_GFp_nistz256_mul_mont wrt ..imagebase - DD $L$SEH_info_GFp_nistz256_mul_mont wrt ..imagebase - - DD $L$SEH_begin_GFp_nistz256_sqr_mont wrt ..imagebase - DD $L$SEH_end_GFp_nistz256_sqr_mont wrt ..imagebase - DD $L$SEH_info_GFp_nistz256_sqr_mont wrt ..imagebase - - DD $L$SEH_begin_GFp_nistz256_select_w5 wrt ..imagebase - DD $L$SEH_end_GFp_nistz256_select_w5 wrt ..imagebase - DD $L$SEH_info_GFp_nistz256_select_wX wrt ..imagebase - - DD $L$SEH_begin_GFp_nistz256_select_w7 wrt ..imagebase - DD $L$SEH_end_GFp_nistz256_select_w7 wrt ..imagebase - DD $L$SEH_info_GFp_nistz256_select_wX wrt ..imagebase - DD $L$SEH_begin_GFp_nistz256_avx2_select_w5 wrt ..imagebase - DD $L$SEH_end_GFp_nistz256_avx2_select_w5 wrt ..imagebase - DD $L$SEH_info_GFp_nistz256_avx2_select_wX wrt ..imagebase - - DD $L$SEH_begin_GFp_nistz256_avx2_select_w7 wrt ..imagebase - DD $L$SEH_end_GFp_nistz256_avx2_select_w7 wrt ..imagebase - DD $L$SEH_info_GFp_nistz256_avx2_select_wX wrt ..imagebase - DD $L$SEH_begin_GFp_nistz256_point_double wrt ..imagebase - DD $L$SEH_end_GFp_nistz256_point_double wrt ..imagebase - DD $L$SEH_info_GFp_nistz256_point_double wrt ..imagebase - - DD $L$SEH_begin_GFp_nistz256_point_add wrt ..imagebase - DD $L$SEH_end_GFp_nistz256_point_add wrt ..imagebase - DD $L$SEH_info_GFp_nistz256_point_add wrt ..imagebase - - DD $L$SEH_begin_GFp_nistz256_point_add_affine wrt ..imagebase - DD $L$SEH_end_GFp_nistz256_point_add_affine wrt ..imagebase - DD $L$SEH_info_GFp_nistz256_point_add_affine wrt ..imagebase - DD $L$SEH_begin_GFp_nistz256_point_doublex wrt ..imagebase - DD $L$SEH_end_GFp_nistz256_point_doublex wrt ..imagebase - DD $L$SEH_info_GFp_nistz256_point_doublex wrt ..imagebase - - DD $L$SEH_begin_GFp_nistz256_point_addx wrt ..imagebase - DD $L$SEH_end_GFp_nistz256_point_addx wrt ..imagebase - DD $L$SEH_info_GFp_nistz256_point_addx wrt ..imagebase - - DD $L$SEH_begin_GFp_nistz256_point_add_affinex wrt ..imagebase - DD $L$SEH_end_GFp_nistz256_point_add_affinex wrt ..imagebase - DD $L$SEH_info_GFp_nistz256_point_add_affinex wrt ..imagebase - -section .xdata rdata align=8 -ALIGN 8 -$L$SEH_info_GFp_nistz256_neg: -DB 9,0,0,0 - DD short_handler wrt ..imagebase - DD $L$neg_body wrt ..imagebase,$L$neg_epilogue wrt ..imagebase -$L$SEH_info_GFp_p256_scalar_mul_mont: -DB 9,0,0,0 - DD full_handler wrt ..imagebase - DD $L$ord_mul_body wrt ..imagebase,$L$ord_mul_epilogue wrt ..imagebase - DD 48,0 -$L$SEH_info_GFp_p256_scalar_sqr_rep_mont: -DB 9,0,0,0 - DD full_handler wrt ..imagebase - DD $L$ord_sqr_body wrt ..imagebase,$L$ord_sqr_epilogue wrt ..imagebase - DD 48,0 -$L$SEH_info_ecp_nistz256_ord_mul_montx: -DB 9,0,0,0 - DD full_handler wrt ..imagebase - DD $L$ord_mulx_body wrt ..imagebase,$L$ord_mulx_epilogue wrt ..imagebase - DD 48,0 -$L$SEH_info_ecp_nistz256_ord_sqr_montx: -DB 9,0,0,0 - DD full_handler wrt ..imagebase - DD $L$ord_sqrx_body wrt ..imagebase,$L$ord_sqrx_epilogue wrt ..imagebase - DD 48,0 -$L$SEH_info_GFp_nistz256_mul_mont: -DB 9,0,0,0 - DD full_handler wrt ..imagebase - DD $L$mul_body wrt ..imagebase,$L$mul_epilogue wrt ..imagebase - DD 48,0 -$L$SEH_info_GFp_nistz256_sqr_mont: -DB 9,0,0,0 - DD full_handler wrt ..imagebase - DD $L$sqr_body wrt ..imagebase,$L$sqr_epilogue wrt ..imagebase - DD 48,0 -$L$SEH_info_GFp_nistz256_select_wX: -DB 0x01,0x33,0x16,0x00 -DB 0x33,0xf8,0x09,0x00 -DB 0x2e,0xe8,0x08,0x00 -DB 0x29,0xd8,0x07,0x00 -DB 0x24,0xc8,0x06,0x00 -DB 0x1f,0xb8,0x05,0x00 -DB 0x1a,0xa8,0x04,0x00 -DB 0x15,0x98,0x03,0x00 -DB 0x10,0x88,0x02,0x00 -DB 0x0c,0x78,0x01,0x00 -DB 0x08,0x68,0x00,0x00 -DB 0x04,0x01,0x15,0x00 -ALIGN 8 -$L$SEH_info_GFp_nistz256_avx2_select_wX: -DB 0x01,0x36,0x17,0x0b -DB 0x36,0xf8,0x09,0x00 -DB 0x31,0xe8,0x08,0x00 -DB 0x2c,0xd8,0x07,0x00 -DB 0x27,0xc8,0x06,0x00 -DB 0x22,0xb8,0x05,0x00 -DB 0x1d,0xa8,0x04,0x00 -DB 0x18,0x98,0x03,0x00 -DB 0x13,0x88,0x02,0x00 -DB 0x0e,0x78,0x01,0x00 -DB 0x09,0x68,0x00,0x00 -DB 0x04,0x01,0x15,0x00 -DB 0x00,0xb3,0x00,0x00 -ALIGN 8 -$L$SEH_info_GFp_nistz256_point_double: -DB 9,0,0,0 - DD full_handler wrt ..imagebase - DD $L$point_doubleq_body wrt ..imagebase,$L$point_doubleq_epilogue wrt ..imagebase - DD 32*5+56,0 -$L$SEH_info_GFp_nistz256_point_add: -DB 9,0,0,0 - DD full_handler wrt ..imagebase - DD $L$point_addq_body wrt ..imagebase,$L$point_addq_epilogue wrt ..imagebase - DD 32*18+56,0 -$L$SEH_info_GFp_nistz256_point_add_affine: -DB 9,0,0,0 - DD full_handler wrt ..imagebase - DD $L$add_affineq_body wrt ..imagebase,$L$add_affineq_epilogue wrt ..imagebase - DD 32*15+56,0 -ALIGN 8 -$L$SEH_info_GFp_nistz256_point_doublex: -DB 9,0,0,0 - DD full_handler wrt ..imagebase - DD $L$point_doublex_body wrt ..imagebase,$L$point_doublex_epilogue wrt ..imagebase - DD 32*5+56,0 -$L$SEH_info_GFp_nistz256_point_addx: -DB 9,0,0,0 - DD full_handler wrt ..imagebase - DD $L$point_addx_body wrt ..imagebase,$L$point_addx_epilogue wrt ..imagebase - DD 32*18+56,0 -$L$SEH_info_GFp_nistz256_point_add_affinex: -DB 9,0,0,0 - DD full_handler wrt ..imagebase - DD $L$add_affinex_body wrt ..imagebase,$L$add_affinex_epilogue wrt ..imagebase - DD 32*15+56,0 diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/tmp/sha256-x86_64-nasm.asm temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/tmp/sha256-x86_64-nasm.asm --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/tmp/sha256-x86_64-nasm.asm 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/tmp/sha256-x86_64-nasm.asm 1970-01-01 00:00:00.000000000 +0000 @@ -1,4138 +0,0 @@ -; This file is generated from a similarly-named Perl script in the BoringSSL -; source tree. Do not edit by hand. - -default rel -%define XMMWORD -%define YMMWORD -%define ZMMWORD -section .text code align=64 - - -EXTERN GFp_ia32cap_P -global GFp_sha256_block_data_order - -ALIGN 16 -GFp_sha256_block_data_order: - mov QWORD[8+rsp],rdi ;WIN64 prologue - mov QWORD[16+rsp],rsi - mov rax,rsp -$L$SEH_begin_GFp_sha256_block_data_order: - mov rdi,rcx - mov rsi,rdx - mov rdx,r8 - - - - lea r11,[GFp_ia32cap_P] - mov r9d,DWORD[r11] - mov r10d,DWORD[4+r11] - mov r11d,DWORD[8+r11] - and r9d,1073741824 - and r10d,268435968 - or r10d,r9d - cmp r10d,1342177792 - je NEAR $L$avx_shortcut - test r10d,512 - jnz NEAR $L$ssse3_shortcut - mov rax,rsp - - push rbx - - push rbp - - push r12 - - push r13 - - push r14 - - push r15 - - shl rdx,4 - sub rsp,16*4+4*8 - lea rdx,[rdx*4+rsi] - and rsp,-64 - mov QWORD[((64+0))+rsp],rdi - mov QWORD[((64+8))+rsp],rsi - mov QWORD[((64+16))+rsp],rdx - mov QWORD[88+rsp],rax - -$L$prologue: - - mov eax,DWORD[rdi] - mov ebx,DWORD[4+rdi] - mov ecx,DWORD[8+rdi] - mov edx,DWORD[12+rdi] - mov r8d,DWORD[16+rdi] - mov r9d,DWORD[20+rdi] - mov r10d,DWORD[24+rdi] - mov r11d,DWORD[28+rdi] - jmp NEAR $L$loop - -ALIGN 16 -$L$loop: - mov edi,ebx - lea rbp,[K256] - xor edi,ecx - mov r12d,DWORD[rsi] - mov r13d,r8d - mov r14d,eax - bswap r12d - ror r13d,14 - mov r15d,r9d - - xor r13d,r8d - ror r14d,9 - xor r15d,r10d - - mov DWORD[rsp],r12d - xor r14d,eax - and r15d,r8d - - ror r13d,5 - add r12d,r11d - xor r15d,r10d - - ror r14d,11 - xor r13d,r8d - add r12d,r15d - - mov r15d,eax - add r12d,DWORD[rbp] - xor r14d,eax - - xor r15d,ebx - ror r13d,6 - mov r11d,ebx - - and edi,r15d - ror r14d,2 - add r12d,r13d - - xor r11d,edi - add edx,r12d - add r11d,r12d - - lea rbp,[4+rbp] - add r11d,r14d - mov r12d,DWORD[4+rsi] - mov r13d,edx - mov r14d,r11d - bswap r12d - ror r13d,14 - mov edi,r8d - - xor r13d,edx - ror r14d,9 - xor edi,r9d - - mov DWORD[4+rsp],r12d - xor r14d,r11d - and edi,edx - - ror r13d,5 - add r12d,r10d - xor edi,r9d - - ror r14d,11 - xor r13d,edx - add r12d,edi - - mov edi,r11d - add r12d,DWORD[rbp] - xor r14d,r11d - - xor edi,eax - ror r13d,6 - mov r10d,eax - - and r15d,edi - ror r14d,2 - add r12d,r13d - - xor r10d,r15d - add ecx,r12d - add r10d,r12d - - lea rbp,[4+rbp] - add r10d,r14d - mov r12d,DWORD[8+rsi] - mov r13d,ecx - mov r14d,r10d - bswap r12d - ror r13d,14 - mov r15d,edx - - xor r13d,ecx - ror r14d,9 - xor r15d,r8d - - mov DWORD[8+rsp],r12d - xor r14d,r10d - and r15d,ecx - - ror r13d,5 - add r12d,r9d - xor r15d,r8d - - ror r14d,11 - xor r13d,ecx - add r12d,r15d - - mov r15d,r10d - add r12d,DWORD[rbp] - xor r14d,r10d - - xor r15d,r11d - ror r13d,6 - mov r9d,r11d - - and edi,r15d - ror r14d,2 - add r12d,r13d - - xor r9d,edi - add ebx,r12d - add r9d,r12d - - lea rbp,[4+rbp] - add r9d,r14d - mov r12d,DWORD[12+rsi] - mov r13d,ebx - mov r14d,r9d - bswap r12d - ror r13d,14 - mov edi,ecx - - xor r13d,ebx - ror r14d,9 - xor edi,edx - - mov DWORD[12+rsp],r12d - xor r14d,r9d - and edi,ebx - - ror r13d,5 - add r12d,r8d - xor edi,edx - - ror r14d,11 - xor r13d,ebx - add r12d,edi - - mov edi,r9d - add r12d,DWORD[rbp] - xor r14d,r9d - - xor edi,r10d - ror r13d,6 - mov r8d,r10d - - and r15d,edi - ror r14d,2 - add r12d,r13d - - xor r8d,r15d - add eax,r12d - add r8d,r12d - - lea rbp,[20+rbp] - add r8d,r14d - mov r12d,DWORD[16+rsi] - mov r13d,eax - mov r14d,r8d - bswap r12d - ror r13d,14 - mov r15d,ebx - - xor r13d,eax - ror r14d,9 - xor r15d,ecx - - mov DWORD[16+rsp],r12d - xor r14d,r8d - and r15d,eax - - ror r13d,5 - add r12d,edx - xor r15d,ecx - - ror r14d,11 - xor r13d,eax - add r12d,r15d - - mov r15d,r8d - add r12d,DWORD[rbp] - xor r14d,r8d - - xor r15d,r9d - ror r13d,6 - mov edx,r9d - - and edi,r15d - ror r14d,2 - add r12d,r13d - - xor edx,edi - add r11d,r12d - add edx,r12d - - lea rbp,[4+rbp] - add edx,r14d - mov r12d,DWORD[20+rsi] - mov r13d,r11d - mov r14d,edx - bswap r12d - ror r13d,14 - mov edi,eax - - xor r13d,r11d - ror r14d,9 - xor edi,ebx - - mov DWORD[20+rsp],r12d - xor r14d,edx - and edi,r11d - - ror r13d,5 - add r12d,ecx - xor edi,ebx - - ror r14d,11 - xor r13d,r11d - add r12d,edi - - mov edi,edx - add r12d,DWORD[rbp] - xor r14d,edx - - xor edi,r8d - ror r13d,6 - mov ecx,r8d - - and r15d,edi - ror r14d,2 - add r12d,r13d - - xor ecx,r15d - add r10d,r12d - add ecx,r12d - - lea rbp,[4+rbp] - add ecx,r14d - mov r12d,DWORD[24+rsi] - mov r13d,r10d - mov r14d,ecx - bswap r12d - ror r13d,14 - mov r15d,r11d - - xor r13d,r10d - ror r14d,9 - xor r15d,eax - - mov DWORD[24+rsp],r12d - xor r14d,ecx - and r15d,r10d - - ror r13d,5 - add r12d,ebx - xor r15d,eax - - ror r14d,11 - xor r13d,r10d - add r12d,r15d - - mov r15d,ecx - add r12d,DWORD[rbp] - xor r14d,ecx - - xor r15d,edx - ror r13d,6 - mov ebx,edx - - and edi,r15d - ror r14d,2 - add r12d,r13d - - xor ebx,edi - add r9d,r12d - add ebx,r12d - - lea rbp,[4+rbp] - add ebx,r14d - mov r12d,DWORD[28+rsi] - mov r13d,r9d - mov r14d,ebx - bswap r12d - ror r13d,14 - mov edi,r10d - - xor r13d,r9d - ror r14d,9 - xor edi,r11d - - mov DWORD[28+rsp],r12d - xor r14d,ebx - and edi,r9d - - ror r13d,5 - add r12d,eax - xor edi,r11d - - ror r14d,11 - xor r13d,r9d - add r12d,edi - - mov edi,ebx - add r12d,DWORD[rbp] - xor r14d,ebx - - xor edi,ecx - ror r13d,6 - mov eax,ecx - - and r15d,edi - ror r14d,2 - add r12d,r13d - - xor eax,r15d - add r8d,r12d - add eax,r12d - - lea rbp,[20+rbp] - add eax,r14d - mov r12d,DWORD[32+rsi] - mov r13d,r8d - mov r14d,eax - bswap r12d - ror r13d,14 - mov r15d,r9d - - xor r13d,r8d - ror r14d,9 - xor r15d,r10d - - mov DWORD[32+rsp],r12d - xor r14d,eax - and r15d,r8d - - ror r13d,5 - add r12d,r11d - xor r15d,r10d - - ror r14d,11 - xor r13d,r8d - add r12d,r15d - - mov r15d,eax - add r12d,DWORD[rbp] - xor r14d,eax - - xor r15d,ebx - ror r13d,6 - mov r11d,ebx - - and edi,r15d - ror r14d,2 - add r12d,r13d - - xor r11d,edi - add edx,r12d - add r11d,r12d - - lea rbp,[4+rbp] - add r11d,r14d - mov r12d,DWORD[36+rsi] - mov r13d,edx - mov r14d,r11d - bswap r12d - ror r13d,14 - mov edi,r8d - - xor r13d,edx - ror r14d,9 - xor edi,r9d - - mov DWORD[36+rsp],r12d - xor r14d,r11d - and edi,edx - - ror r13d,5 - add r12d,r10d - xor edi,r9d - - ror r14d,11 - xor r13d,edx - add r12d,edi - - mov edi,r11d - add r12d,DWORD[rbp] - xor r14d,r11d - - xor edi,eax - ror r13d,6 - mov r10d,eax - - and r15d,edi - ror r14d,2 - add r12d,r13d - - xor r10d,r15d - add ecx,r12d - add r10d,r12d - - lea rbp,[4+rbp] - add r10d,r14d - mov r12d,DWORD[40+rsi] - mov r13d,ecx - mov r14d,r10d - bswap r12d - ror r13d,14 - mov r15d,edx - - xor r13d,ecx - ror r14d,9 - xor r15d,r8d - - mov DWORD[40+rsp],r12d - xor r14d,r10d - and r15d,ecx - - ror r13d,5 - add r12d,r9d - xor r15d,r8d - - ror r14d,11 - xor r13d,ecx - add r12d,r15d - - mov r15d,r10d - add r12d,DWORD[rbp] - xor r14d,r10d - - xor r15d,r11d - ror r13d,6 - mov r9d,r11d - - and edi,r15d - ror r14d,2 - add r12d,r13d - - xor r9d,edi - add ebx,r12d - add r9d,r12d - - lea rbp,[4+rbp] - add r9d,r14d - mov r12d,DWORD[44+rsi] - mov r13d,ebx - mov r14d,r9d - bswap r12d - ror r13d,14 - mov edi,ecx - - xor r13d,ebx - ror r14d,9 - xor edi,edx - - mov DWORD[44+rsp],r12d - xor r14d,r9d - and edi,ebx - - ror r13d,5 - add r12d,r8d - xor edi,edx - - ror r14d,11 - xor r13d,ebx - add r12d,edi - - mov edi,r9d - add r12d,DWORD[rbp] - xor r14d,r9d - - xor edi,r10d - ror r13d,6 - mov r8d,r10d - - and r15d,edi - ror r14d,2 - add r12d,r13d - - xor r8d,r15d - add eax,r12d - add r8d,r12d - - lea rbp,[20+rbp] - add r8d,r14d - mov r12d,DWORD[48+rsi] - mov r13d,eax - mov r14d,r8d - bswap r12d - ror r13d,14 - mov r15d,ebx - - xor r13d,eax - ror r14d,9 - xor r15d,ecx - - mov DWORD[48+rsp],r12d - xor r14d,r8d - and r15d,eax - - ror r13d,5 - add r12d,edx - xor r15d,ecx - - ror r14d,11 - xor r13d,eax - add r12d,r15d - - mov r15d,r8d - add r12d,DWORD[rbp] - xor r14d,r8d - - xor r15d,r9d - ror r13d,6 - mov edx,r9d - - and edi,r15d - ror r14d,2 - add r12d,r13d - - xor edx,edi - add r11d,r12d - add edx,r12d - - lea rbp,[4+rbp] - add edx,r14d - mov r12d,DWORD[52+rsi] - mov r13d,r11d - mov r14d,edx - bswap r12d - ror r13d,14 - mov edi,eax - - xor r13d,r11d - ror r14d,9 - xor edi,ebx - - mov DWORD[52+rsp],r12d - xor r14d,edx - and edi,r11d - - ror r13d,5 - add r12d,ecx - xor edi,ebx - - ror r14d,11 - xor r13d,r11d - add r12d,edi - - mov edi,edx - add r12d,DWORD[rbp] - xor r14d,edx - - xor edi,r8d - ror r13d,6 - mov ecx,r8d - - and r15d,edi - ror r14d,2 - add r12d,r13d - - xor ecx,r15d - add r10d,r12d - add ecx,r12d - - lea rbp,[4+rbp] - add ecx,r14d - mov r12d,DWORD[56+rsi] - mov r13d,r10d - mov r14d,ecx - bswap r12d - ror r13d,14 - mov r15d,r11d - - xor r13d,r10d - ror r14d,9 - xor r15d,eax - - mov DWORD[56+rsp],r12d - xor r14d,ecx - and r15d,r10d - - ror r13d,5 - add r12d,ebx - xor r15d,eax - - ror r14d,11 - xor r13d,r10d - add r12d,r15d - - mov r15d,ecx - add r12d,DWORD[rbp] - xor r14d,ecx - - xor r15d,edx - ror r13d,6 - mov ebx,edx - - and edi,r15d - ror r14d,2 - add r12d,r13d - - xor ebx,edi - add r9d,r12d - add ebx,r12d - - lea rbp,[4+rbp] - add ebx,r14d - mov r12d,DWORD[60+rsi] - mov r13d,r9d - mov r14d,ebx - bswap r12d - ror r13d,14 - mov edi,r10d - - xor r13d,r9d - ror r14d,9 - xor edi,r11d - - mov DWORD[60+rsp],r12d - xor r14d,ebx - and edi,r9d - - ror r13d,5 - add r12d,eax - xor edi,r11d - - ror r14d,11 - xor r13d,r9d - add r12d,edi - - mov edi,ebx - add r12d,DWORD[rbp] - xor r14d,ebx - - xor edi,ecx - ror r13d,6 - mov eax,ecx - - and r15d,edi - ror r14d,2 - add r12d,r13d - - xor eax,r15d - add r8d,r12d - add eax,r12d - - lea rbp,[20+rbp] - jmp NEAR $L$rounds_16_xx -ALIGN 16 -$L$rounds_16_xx: - mov r13d,DWORD[4+rsp] - mov r15d,DWORD[56+rsp] - - mov r12d,r13d - ror r13d,11 - add eax,r14d - mov r14d,r15d - ror r15d,2 - - xor r13d,r12d - shr r12d,3 - ror r13d,7 - xor r15d,r14d - shr r14d,10 - - ror r15d,17 - xor r12d,r13d - xor r15d,r14d - add r12d,DWORD[36+rsp] - - add r12d,DWORD[rsp] - mov r13d,r8d - add r12d,r15d - mov r14d,eax - ror r13d,14 - mov r15d,r9d - - xor r13d,r8d - ror r14d,9 - xor r15d,r10d - - mov DWORD[rsp],r12d - xor r14d,eax - and r15d,r8d - - ror r13d,5 - add r12d,r11d - xor r15d,r10d - - ror r14d,11 - xor r13d,r8d - add r12d,r15d - - mov r15d,eax - add r12d,DWORD[rbp] - xor r14d,eax - - xor r15d,ebx - ror r13d,6 - mov r11d,ebx - - and edi,r15d - ror r14d,2 - add r12d,r13d - - xor r11d,edi - add edx,r12d - add r11d,r12d - - lea rbp,[4+rbp] - mov r13d,DWORD[8+rsp] - mov edi,DWORD[60+rsp] - - mov r12d,r13d - ror r13d,11 - add r11d,r14d - mov r14d,edi - ror edi,2 - - xor r13d,r12d - shr r12d,3 - ror r13d,7 - xor edi,r14d - shr r14d,10 - - ror edi,17 - xor r12d,r13d - xor edi,r14d - add r12d,DWORD[40+rsp] - - add r12d,DWORD[4+rsp] - mov r13d,edx - add r12d,edi - mov r14d,r11d - ror r13d,14 - mov edi,r8d - - xor r13d,edx - ror r14d,9 - xor edi,r9d - - mov DWORD[4+rsp],r12d - xor r14d,r11d - and edi,edx - - ror r13d,5 - add r12d,r10d - xor edi,r9d - - ror r14d,11 - xor r13d,edx - add r12d,edi - - mov edi,r11d - add r12d,DWORD[rbp] - xor r14d,r11d - - xor edi,eax - ror r13d,6 - mov r10d,eax - - and r15d,edi - ror r14d,2 - add r12d,r13d - - xor r10d,r15d - add ecx,r12d - add r10d,r12d - - lea rbp,[4+rbp] - mov r13d,DWORD[12+rsp] - mov r15d,DWORD[rsp] - - mov r12d,r13d - ror r13d,11 - add r10d,r14d - mov r14d,r15d - ror r15d,2 - - xor r13d,r12d - shr r12d,3 - ror r13d,7 - xor r15d,r14d - shr r14d,10 - - ror r15d,17 - xor r12d,r13d - xor r15d,r14d - add r12d,DWORD[44+rsp] - - add r12d,DWORD[8+rsp] - mov r13d,ecx - add r12d,r15d - mov r14d,r10d - ror r13d,14 - mov r15d,edx - - xor r13d,ecx - ror r14d,9 - xor r15d,r8d - - mov DWORD[8+rsp],r12d - xor r14d,r10d - and r15d,ecx - - ror r13d,5 - add r12d,r9d - xor r15d,r8d - - ror r14d,11 - xor r13d,ecx - add r12d,r15d - - mov r15d,r10d - add r12d,DWORD[rbp] - xor r14d,r10d - - xor r15d,r11d - ror r13d,6 - mov r9d,r11d - - and edi,r15d - ror r14d,2 - add r12d,r13d - - xor r9d,edi - add ebx,r12d - add r9d,r12d - - lea rbp,[4+rbp] - mov r13d,DWORD[16+rsp] - mov edi,DWORD[4+rsp] - - mov r12d,r13d - ror r13d,11 - add r9d,r14d - mov r14d,edi - ror edi,2 - - xor r13d,r12d - shr r12d,3 - ror r13d,7 - xor edi,r14d - shr r14d,10 - - ror edi,17 - xor r12d,r13d - xor edi,r14d - add r12d,DWORD[48+rsp] - - add r12d,DWORD[12+rsp] - mov r13d,ebx - add r12d,edi - mov r14d,r9d - ror r13d,14 - mov edi,ecx - - xor r13d,ebx - ror r14d,9 - xor edi,edx - - mov DWORD[12+rsp],r12d - xor r14d,r9d - and edi,ebx - - ror r13d,5 - add r12d,r8d - xor edi,edx - - ror r14d,11 - xor r13d,ebx - add r12d,edi - - mov edi,r9d - add r12d,DWORD[rbp] - xor r14d,r9d - - xor edi,r10d - ror r13d,6 - mov r8d,r10d - - and r15d,edi - ror r14d,2 - add r12d,r13d - - xor r8d,r15d - add eax,r12d - add r8d,r12d - - lea rbp,[20+rbp] - mov r13d,DWORD[20+rsp] - mov r15d,DWORD[8+rsp] - - mov r12d,r13d - ror r13d,11 - add r8d,r14d - mov r14d,r15d - ror r15d,2 - - xor r13d,r12d - shr r12d,3 - ror r13d,7 - xor r15d,r14d - shr r14d,10 - - ror r15d,17 - xor r12d,r13d - xor r15d,r14d - add r12d,DWORD[52+rsp] - - add r12d,DWORD[16+rsp] - mov r13d,eax - add r12d,r15d - mov r14d,r8d - ror r13d,14 - mov r15d,ebx - - xor r13d,eax - ror r14d,9 - xor r15d,ecx - - mov DWORD[16+rsp],r12d - xor r14d,r8d - and r15d,eax - - ror r13d,5 - add r12d,edx - xor r15d,ecx - - ror r14d,11 - xor r13d,eax - add r12d,r15d - - mov r15d,r8d - add r12d,DWORD[rbp] - xor r14d,r8d - - xor r15d,r9d - ror r13d,6 - mov edx,r9d - - and edi,r15d - ror r14d,2 - add r12d,r13d - - xor edx,edi - add r11d,r12d - add edx,r12d - - lea rbp,[4+rbp] - mov r13d,DWORD[24+rsp] - mov edi,DWORD[12+rsp] - - mov r12d,r13d - ror r13d,11 - add edx,r14d - mov r14d,edi - ror edi,2 - - xor r13d,r12d - shr r12d,3 - ror r13d,7 - xor edi,r14d - shr r14d,10 - - ror edi,17 - xor r12d,r13d - xor edi,r14d - add r12d,DWORD[56+rsp] - - add r12d,DWORD[20+rsp] - mov r13d,r11d - add r12d,edi - mov r14d,edx - ror r13d,14 - mov edi,eax - - xor r13d,r11d - ror r14d,9 - xor edi,ebx - - mov DWORD[20+rsp],r12d - xor r14d,edx - and edi,r11d - - ror r13d,5 - add r12d,ecx - xor edi,ebx - - ror r14d,11 - xor r13d,r11d - add r12d,edi - - mov edi,edx - add r12d,DWORD[rbp] - xor r14d,edx - - xor edi,r8d - ror r13d,6 - mov ecx,r8d - - and r15d,edi - ror r14d,2 - add r12d,r13d - - xor ecx,r15d - add r10d,r12d - add ecx,r12d - - lea rbp,[4+rbp] - mov r13d,DWORD[28+rsp] - mov r15d,DWORD[16+rsp] - - mov r12d,r13d - ror r13d,11 - add ecx,r14d - mov r14d,r15d - ror r15d,2 - - xor r13d,r12d - shr r12d,3 - ror r13d,7 - xor r15d,r14d - shr r14d,10 - - ror r15d,17 - xor r12d,r13d - xor r15d,r14d - add r12d,DWORD[60+rsp] - - add r12d,DWORD[24+rsp] - mov r13d,r10d - add r12d,r15d - mov r14d,ecx - ror r13d,14 - mov r15d,r11d - - xor r13d,r10d - ror r14d,9 - xor r15d,eax - - mov DWORD[24+rsp],r12d - xor r14d,ecx - and r15d,r10d - - ror r13d,5 - add r12d,ebx - xor r15d,eax - - ror r14d,11 - xor r13d,r10d - add r12d,r15d - - mov r15d,ecx - add r12d,DWORD[rbp] - xor r14d,ecx - - xor r15d,edx - ror r13d,6 - mov ebx,edx - - and edi,r15d - ror r14d,2 - add r12d,r13d - - xor ebx,edi - add r9d,r12d - add ebx,r12d - - lea rbp,[4+rbp] - mov r13d,DWORD[32+rsp] - mov edi,DWORD[20+rsp] - - mov r12d,r13d - ror r13d,11 - add ebx,r14d - mov r14d,edi - ror edi,2 - - xor r13d,r12d - shr r12d,3 - ror r13d,7 - xor edi,r14d - shr r14d,10 - - ror edi,17 - xor r12d,r13d - xor edi,r14d - add r12d,DWORD[rsp] - - add r12d,DWORD[28+rsp] - mov r13d,r9d - add r12d,edi - mov r14d,ebx - ror r13d,14 - mov edi,r10d - - xor r13d,r9d - ror r14d,9 - xor edi,r11d - - mov DWORD[28+rsp],r12d - xor r14d,ebx - and edi,r9d - - ror r13d,5 - add r12d,eax - xor edi,r11d - - ror r14d,11 - xor r13d,r9d - add r12d,edi - - mov edi,ebx - add r12d,DWORD[rbp] - xor r14d,ebx - - xor edi,ecx - ror r13d,6 - mov eax,ecx - - and r15d,edi - ror r14d,2 - add r12d,r13d - - xor eax,r15d - add r8d,r12d - add eax,r12d - - lea rbp,[20+rbp] - mov r13d,DWORD[36+rsp] - mov r15d,DWORD[24+rsp] - - mov r12d,r13d - ror r13d,11 - add eax,r14d - mov r14d,r15d - ror r15d,2 - - xor r13d,r12d - shr r12d,3 - ror r13d,7 - xor r15d,r14d - shr r14d,10 - - ror r15d,17 - xor r12d,r13d - xor r15d,r14d - add r12d,DWORD[4+rsp] - - add r12d,DWORD[32+rsp] - mov r13d,r8d - add r12d,r15d - mov r14d,eax - ror r13d,14 - mov r15d,r9d - - xor r13d,r8d - ror r14d,9 - xor r15d,r10d - - mov DWORD[32+rsp],r12d - xor r14d,eax - and r15d,r8d - - ror r13d,5 - add r12d,r11d - xor r15d,r10d - - ror r14d,11 - xor r13d,r8d - add r12d,r15d - - mov r15d,eax - add r12d,DWORD[rbp] - xor r14d,eax - - xor r15d,ebx - ror r13d,6 - mov r11d,ebx - - and edi,r15d - ror r14d,2 - add r12d,r13d - - xor r11d,edi - add edx,r12d - add r11d,r12d - - lea rbp,[4+rbp] - mov r13d,DWORD[40+rsp] - mov edi,DWORD[28+rsp] - - mov r12d,r13d - ror r13d,11 - add r11d,r14d - mov r14d,edi - ror edi,2 - - xor r13d,r12d - shr r12d,3 - ror r13d,7 - xor edi,r14d - shr r14d,10 - - ror edi,17 - xor r12d,r13d - xor edi,r14d - add r12d,DWORD[8+rsp] - - add r12d,DWORD[36+rsp] - mov r13d,edx - add r12d,edi - mov r14d,r11d - ror r13d,14 - mov edi,r8d - - xor r13d,edx - ror r14d,9 - xor edi,r9d - - mov DWORD[36+rsp],r12d - xor r14d,r11d - and edi,edx - - ror r13d,5 - add r12d,r10d - xor edi,r9d - - ror r14d,11 - xor r13d,edx - add r12d,edi - - mov edi,r11d - add r12d,DWORD[rbp] - xor r14d,r11d - - xor edi,eax - ror r13d,6 - mov r10d,eax - - and r15d,edi - ror r14d,2 - add r12d,r13d - - xor r10d,r15d - add ecx,r12d - add r10d,r12d - - lea rbp,[4+rbp] - mov r13d,DWORD[44+rsp] - mov r15d,DWORD[32+rsp] - - mov r12d,r13d - ror r13d,11 - add r10d,r14d - mov r14d,r15d - ror r15d,2 - - xor r13d,r12d - shr r12d,3 - ror r13d,7 - xor r15d,r14d - shr r14d,10 - - ror r15d,17 - xor r12d,r13d - xor r15d,r14d - add r12d,DWORD[12+rsp] - - add r12d,DWORD[40+rsp] - mov r13d,ecx - add r12d,r15d - mov r14d,r10d - ror r13d,14 - mov r15d,edx - - xor r13d,ecx - ror r14d,9 - xor r15d,r8d - - mov DWORD[40+rsp],r12d - xor r14d,r10d - and r15d,ecx - - ror r13d,5 - add r12d,r9d - xor r15d,r8d - - ror r14d,11 - xor r13d,ecx - add r12d,r15d - - mov r15d,r10d - add r12d,DWORD[rbp] - xor r14d,r10d - - xor r15d,r11d - ror r13d,6 - mov r9d,r11d - - and edi,r15d - ror r14d,2 - add r12d,r13d - - xor r9d,edi - add ebx,r12d - add r9d,r12d - - lea rbp,[4+rbp] - mov r13d,DWORD[48+rsp] - mov edi,DWORD[36+rsp] - - mov r12d,r13d - ror r13d,11 - add r9d,r14d - mov r14d,edi - ror edi,2 - - xor r13d,r12d - shr r12d,3 - ror r13d,7 - xor edi,r14d - shr r14d,10 - - ror edi,17 - xor r12d,r13d - xor edi,r14d - add r12d,DWORD[16+rsp] - - add r12d,DWORD[44+rsp] - mov r13d,ebx - add r12d,edi - mov r14d,r9d - ror r13d,14 - mov edi,ecx - - xor r13d,ebx - ror r14d,9 - xor edi,edx - - mov DWORD[44+rsp],r12d - xor r14d,r9d - and edi,ebx - - ror r13d,5 - add r12d,r8d - xor edi,edx - - ror r14d,11 - xor r13d,ebx - add r12d,edi - - mov edi,r9d - add r12d,DWORD[rbp] - xor r14d,r9d - - xor edi,r10d - ror r13d,6 - mov r8d,r10d - - and r15d,edi - ror r14d,2 - add r12d,r13d - - xor r8d,r15d - add eax,r12d - add r8d,r12d - - lea rbp,[20+rbp] - mov r13d,DWORD[52+rsp] - mov r15d,DWORD[40+rsp] - - mov r12d,r13d - ror r13d,11 - add r8d,r14d - mov r14d,r15d - ror r15d,2 - - xor r13d,r12d - shr r12d,3 - ror r13d,7 - xor r15d,r14d - shr r14d,10 - - ror r15d,17 - xor r12d,r13d - xor r15d,r14d - add r12d,DWORD[20+rsp] - - add r12d,DWORD[48+rsp] - mov r13d,eax - add r12d,r15d - mov r14d,r8d - ror r13d,14 - mov r15d,ebx - - xor r13d,eax - ror r14d,9 - xor r15d,ecx - - mov DWORD[48+rsp],r12d - xor r14d,r8d - and r15d,eax - - ror r13d,5 - add r12d,edx - xor r15d,ecx - - ror r14d,11 - xor r13d,eax - add r12d,r15d - - mov r15d,r8d - add r12d,DWORD[rbp] - xor r14d,r8d - - xor r15d,r9d - ror r13d,6 - mov edx,r9d - - and edi,r15d - ror r14d,2 - add r12d,r13d - - xor edx,edi - add r11d,r12d - add edx,r12d - - lea rbp,[4+rbp] - mov r13d,DWORD[56+rsp] - mov edi,DWORD[44+rsp] - - mov r12d,r13d - ror r13d,11 - add edx,r14d - mov r14d,edi - ror edi,2 - - xor r13d,r12d - shr r12d,3 - ror r13d,7 - xor edi,r14d - shr r14d,10 - - ror edi,17 - xor r12d,r13d - xor edi,r14d - add r12d,DWORD[24+rsp] - - add r12d,DWORD[52+rsp] - mov r13d,r11d - add r12d,edi - mov r14d,edx - ror r13d,14 - mov edi,eax - - xor r13d,r11d - ror r14d,9 - xor edi,ebx - - mov DWORD[52+rsp],r12d - xor r14d,edx - and edi,r11d - - ror r13d,5 - add r12d,ecx - xor edi,ebx - - ror r14d,11 - xor r13d,r11d - add r12d,edi - - mov edi,edx - add r12d,DWORD[rbp] - xor r14d,edx - - xor edi,r8d - ror r13d,6 - mov ecx,r8d - - and r15d,edi - ror r14d,2 - add r12d,r13d - - xor ecx,r15d - add r10d,r12d - add ecx,r12d - - lea rbp,[4+rbp] - mov r13d,DWORD[60+rsp] - mov r15d,DWORD[48+rsp] - - mov r12d,r13d - ror r13d,11 - add ecx,r14d - mov r14d,r15d - ror r15d,2 - - xor r13d,r12d - shr r12d,3 - ror r13d,7 - xor r15d,r14d - shr r14d,10 - - ror r15d,17 - xor r12d,r13d - xor r15d,r14d - add r12d,DWORD[28+rsp] - - add r12d,DWORD[56+rsp] - mov r13d,r10d - add r12d,r15d - mov r14d,ecx - ror r13d,14 - mov r15d,r11d - - xor r13d,r10d - ror r14d,9 - xor r15d,eax - - mov DWORD[56+rsp],r12d - xor r14d,ecx - and r15d,r10d - - ror r13d,5 - add r12d,ebx - xor r15d,eax - - ror r14d,11 - xor r13d,r10d - add r12d,r15d - - mov r15d,ecx - add r12d,DWORD[rbp] - xor r14d,ecx - - xor r15d,edx - ror r13d,6 - mov ebx,edx - - and edi,r15d - ror r14d,2 - add r12d,r13d - - xor ebx,edi - add r9d,r12d - add ebx,r12d - - lea rbp,[4+rbp] - mov r13d,DWORD[rsp] - mov edi,DWORD[52+rsp] - - mov r12d,r13d - ror r13d,11 - add ebx,r14d - mov r14d,edi - ror edi,2 - - xor r13d,r12d - shr r12d,3 - ror r13d,7 - xor edi,r14d - shr r14d,10 - - ror edi,17 - xor r12d,r13d - xor edi,r14d - add r12d,DWORD[32+rsp] - - add r12d,DWORD[60+rsp] - mov r13d,r9d - add r12d,edi - mov r14d,ebx - ror r13d,14 - mov edi,r10d - - xor r13d,r9d - ror r14d,9 - xor edi,r11d - - mov DWORD[60+rsp],r12d - xor r14d,ebx - and edi,r9d - - ror r13d,5 - add r12d,eax - xor edi,r11d - - ror r14d,11 - xor r13d,r9d - add r12d,edi - - mov edi,ebx - add r12d,DWORD[rbp] - xor r14d,ebx - - xor edi,ecx - ror r13d,6 - mov eax,ecx - - and r15d,edi - ror r14d,2 - add r12d,r13d - - xor eax,r15d - add r8d,r12d - add eax,r12d - - lea rbp,[20+rbp] - cmp BYTE[3+rbp],0 - jnz NEAR $L$rounds_16_xx - - mov rdi,QWORD[((64+0))+rsp] - add eax,r14d - lea rsi,[64+rsi] - - add eax,DWORD[rdi] - add ebx,DWORD[4+rdi] - add ecx,DWORD[8+rdi] - add edx,DWORD[12+rdi] - add r8d,DWORD[16+rdi] - add r9d,DWORD[20+rdi] - add r10d,DWORD[24+rdi] - add r11d,DWORD[28+rdi] - - cmp rsi,QWORD[((64+16))+rsp] - - mov DWORD[rdi],eax - mov DWORD[4+rdi],ebx - mov DWORD[8+rdi],ecx - mov DWORD[12+rdi],edx - mov DWORD[16+rdi],r8d - mov DWORD[20+rdi],r9d - mov DWORD[24+rdi],r10d - mov DWORD[28+rdi],r11d - jb NEAR $L$loop - - mov rsi,QWORD[88+rsp] - - mov r15,QWORD[((-48))+rsi] - - mov r14,QWORD[((-40))+rsi] - - mov r13,QWORD[((-32))+rsi] - - mov r12,QWORD[((-24))+rsi] - - mov rbp,QWORD[((-16))+rsi] - - mov rbx,QWORD[((-8))+rsi] - - lea rsp,[rsi] - -$L$epilogue: - mov rdi,QWORD[8+rsp] ;WIN64 epilogue - mov rsi,QWORD[16+rsp] - DB 0F3h,0C3h ;repret - -$L$SEH_end_GFp_sha256_block_data_order: -ALIGN 64 - -K256: - DD 0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5 - DD 0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5 - DD 0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5 - DD 0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5 - DD 0xd807aa98,0x12835b01,0x243185be,0x550c7dc3 - DD 0xd807aa98,0x12835b01,0x243185be,0x550c7dc3 - DD 0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174 - DD 0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174 - DD 0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc - DD 0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc - DD 0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da - DD 0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da - DD 0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7 - DD 0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7 - DD 0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967 - DD 0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967 - DD 0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13 - DD 0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13 - DD 0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85 - DD 0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85 - DD 0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3 - DD 0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3 - DD 0xd192e819,0xd6990624,0xf40e3585,0x106aa070 - DD 0xd192e819,0xd6990624,0xf40e3585,0x106aa070 - DD 0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5 - DD 0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5 - DD 0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3 - DD 0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3 - DD 0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208 - DD 0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208 - DD 0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2 - DD 0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2 - - DD 0x00010203,0x04050607,0x08090a0b,0x0c0d0e0f - DD 0x00010203,0x04050607,0x08090a0b,0x0c0d0e0f - DD 0x03020100,0x0b0a0908,0xffffffff,0xffffffff - DD 0x03020100,0x0b0a0908,0xffffffff,0xffffffff - DD 0xffffffff,0xffffffff,0x03020100,0x0b0a0908 - DD 0xffffffff,0xffffffff,0x03020100,0x0b0a0908 -DB 83,72,65,50,53,54,32,98,108,111,99,107,32,116,114,97 -DB 110,115,102,111,114,109,32,102,111,114,32,120,56,54,95,54 -DB 52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121 -DB 32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46 -DB 111,114,103,62,0 - -ALIGN 64 -GFp_sha256_block_data_order_ssse3: - mov QWORD[8+rsp],rdi ;WIN64 prologue - mov QWORD[16+rsp],rsi - mov rax,rsp -$L$SEH_begin_GFp_sha256_block_data_order_ssse3: - mov rdi,rcx - mov rsi,rdx - mov rdx,r8 - - - -$L$ssse3_shortcut: - mov rax,rsp - - push rbx - - push rbp - - push r12 - - push r13 - - push r14 - - push r15 - - shl rdx,4 - sub rsp,160 - lea rdx,[rdx*4+rsi] - and rsp,-64 - mov QWORD[((64+0))+rsp],rdi - mov QWORD[((64+8))+rsp],rsi - mov QWORD[((64+16))+rsp],rdx - mov QWORD[88+rsp],rax - - movaps XMMWORD[(64+32)+rsp],xmm6 - movaps XMMWORD[(64+48)+rsp],xmm7 - movaps XMMWORD[(64+64)+rsp],xmm8 - movaps XMMWORD[(64+80)+rsp],xmm9 -$L$prologue_ssse3: - - mov eax,DWORD[rdi] - mov ebx,DWORD[4+rdi] - mov ecx,DWORD[8+rdi] - mov edx,DWORD[12+rdi] - mov r8d,DWORD[16+rdi] - mov r9d,DWORD[20+rdi] - mov r10d,DWORD[24+rdi] - mov r11d,DWORD[28+rdi] - - - jmp NEAR $L$loop_ssse3 -ALIGN 16 -$L$loop_ssse3: - movdqa xmm7,XMMWORD[((K256+512))] - movdqu xmm0,XMMWORD[rsi] - movdqu xmm1,XMMWORD[16+rsi] - movdqu xmm2,XMMWORD[32+rsi] -DB 102,15,56,0,199 - movdqu xmm3,XMMWORD[48+rsi] - lea rbp,[K256] -DB 102,15,56,0,207 - movdqa xmm4,XMMWORD[rbp] - movdqa xmm5,XMMWORD[32+rbp] -DB 102,15,56,0,215 - paddd xmm4,xmm0 - movdqa xmm6,XMMWORD[64+rbp] -DB 102,15,56,0,223 - movdqa xmm7,XMMWORD[96+rbp] - paddd xmm5,xmm1 - paddd xmm6,xmm2 - paddd xmm7,xmm3 - movdqa XMMWORD[rsp],xmm4 - mov r14d,eax - movdqa XMMWORD[16+rsp],xmm5 - mov edi,ebx - movdqa XMMWORD[32+rsp],xmm6 - xor edi,ecx - movdqa XMMWORD[48+rsp],xmm7 - mov r13d,r8d - jmp NEAR $L$ssse3_00_47 - -ALIGN 16 -$L$ssse3_00_47: - sub rbp,-128 - ror r13d,14 - movdqa xmm4,xmm1 - mov eax,r14d - mov r12d,r9d - movdqa xmm7,xmm3 - ror r14d,9 - xor r13d,r8d - xor r12d,r10d - ror r13d,5 - xor r14d,eax -DB 102,15,58,15,224,4 - and r12d,r8d - xor r13d,r8d -DB 102,15,58,15,250,4 - add r11d,DWORD[rsp] - mov r15d,eax - xor r12d,r10d - ror r14d,11 - movdqa xmm5,xmm4 - xor r15d,ebx - add r11d,r12d - movdqa xmm6,xmm4 - ror r13d,6 - and edi,r15d - psrld xmm4,3 - xor r14d,eax - add r11d,r13d - xor edi,ebx - paddd xmm0,xmm7 - ror r14d,2 - add edx,r11d - psrld xmm6,7 - add r11d,edi - mov r13d,edx - pshufd xmm7,xmm3,250 - add r14d,r11d - ror r13d,14 - pslld xmm5,14 - mov r11d,r14d - mov r12d,r8d - pxor xmm4,xmm6 - ror r14d,9 - xor r13d,edx - xor r12d,r9d - ror r13d,5 - psrld xmm6,11 - xor r14d,r11d - pxor xmm4,xmm5 - and r12d,edx - xor r13d,edx - pslld xmm5,11 - add r10d,DWORD[4+rsp] - mov edi,r11d - pxor xmm4,xmm6 - xor r12d,r9d - ror r14d,11 - movdqa xmm6,xmm7 - xor edi,eax - add r10d,r12d - pxor xmm4,xmm5 - ror r13d,6 - and r15d,edi - xor r14d,r11d - psrld xmm7,10 - add r10d,r13d - xor r15d,eax - paddd xmm0,xmm4 - ror r14d,2 - add ecx,r10d - psrlq xmm6,17 - add r10d,r15d - mov r13d,ecx - add r14d,r10d - pxor xmm7,xmm6 - ror r13d,14 - mov r10d,r14d - mov r12d,edx - ror r14d,9 - psrlq xmm6,2 - xor r13d,ecx - xor r12d,r8d - pxor xmm7,xmm6 - ror r13d,5 - xor r14d,r10d - and r12d,ecx - pshufd xmm7,xmm7,128 - xor r13d,ecx - add r9d,DWORD[8+rsp] - mov r15d,r10d - psrldq xmm7,8 - xor r12d,r8d - ror r14d,11 - xor r15d,r11d - add r9d,r12d - ror r13d,6 - paddd xmm0,xmm7 - and edi,r15d - xor r14d,r10d - add r9d,r13d - pshufd xmm7,xmm0,80 - xor edi,r11d - ror r14d,2 - add ebx,r9d - movdqa xmm6,xmm7 - add r9d,edi - mov r13d,ebx - psrld xmm7,10 - add r14d,r9d - ror r13d,14 - psrlq xmm6,17 - mov r9d,r14d - mov r12d,ecx - pxor xmm7,xmm6 - ror r14d,9 - xor r13d,ebx - xor r12d,edx - ror r13d,5 - xor r14d,r9d - psrlq xmm6,2 - and r12d,ebx - xor r13d,ebx - add r8d,DWORD[12+rsp] - pxor xmm7,xmm6 - mov edi,r9d - xor r12d,edx - ror r14d,11 - pshufd xmm7,xmm7,8 - xor edi,r10d - add r8d,r12d - movdqa xmm6,XMMWORD[rbp] - ror r13d,6 - and r15d,edi - pslldq xmm7,8 - xor r14d,r9d - add r8d,r13d - xor r15d,r10d - paddd xmm0,xmm7 - ror r14d,2 - add eax,r8d - add r8d,r15d - paddd xmm6,xmm0 - mov r13d,eax - add r14d,r8d - movdqa XMMWORD[rsp],xmm6 - ror r13d,14 - movdqa xmm4,xmm2 - mov r8d,r14d - mov r12d,ebx - movdqa xmm7,xmm0 - ror r14d,9 - xor r13d,eax - xor r12d,ecx - ror r13d,5 - xor r14d,r8d -DB 102,15,58,15,225,4 - and r12d,eax - xor r13d,eax -DB 102,15,58,15,251,4 - add edx,DWORD[16+rsp] - mov r15d,r8d - xor r12d,ecx - ror r14d,11 - movdqa xmm5,xmm4 - xor r15d,r9d - add edx,r12d - movdqa xmm6,xmm4 - ror r13d,6 - and edi,r15d - psrld xmm4,3 - xor r14d,r8d - add edx,r13d - xor edi,r9d - paddd xmm1,xmm7 - ror r14d,2 - add r11d,edx - psrld xmm6,7 - add edx,edi - mov r13d,r11d - pshufd xmm7,xmm0,250 - add r14d,edx - ror r13d,14 - pslld xmm5,14 - mov edx,r14d - mov r12d,eax - pxor xmm4,xmm6 - ror r14d,9 - xor r13d,r11d - xor r12d,ebx - ror r13d,5 - psrld xmm6,11 - xor r14d,edx - pxor xmm4,xmm5 - and r12d,r11d - xor r13d,r11d - pslld xmm5,11 - add ecx,DWORD[20+rsp] - mov edi,edx - pxor xmm4,xmm6 - xor r12d,ebx - ror r14d,11 - movdqa xmm6,xmm7 - xor edi,r8d - add ecx,r12d - pxor xmm4,xmm5 - ror r13d,6 - and r15d,edi - xor r14d,edx - psrld xmm7,10 - add ecx,r13d - xor r15d,r8d - paddd xmm1,xmm4 - ror r14d,2 - add r10d,ecx - psrlq xmm6,17 - add ecx,r15d - mov r13d,r10d - add r14d,ecx - pxor xmm7,xmm6 - ror r13d,14 - mov ecx,r14d - mov r12d,r11d - ror r14d,9 - psrlq xmm6,2 - xor r13d,r10d - xor r12d,eax - pxor xmm7,xmm6 - ror r13d,5 - xor r14d,ecx - and r12d,r10d - pshufd xmm7,xmm7,128 - xor r13d,r10d - add ebx,DWORD[24+rsp] - mov r15d,ecx - psrldq xmm7,8 - xor r12d,eax - ror r14d,11 - xor r15d,edx - add ebx,r12d - ror r13d,6 - paddd xmm1,xmm7 - and edi,r15d - xor r14d,ecx - add ebx,r13d - pshufd xmm7,xmm1,80 - xor edi,edx - ror r14d,2 - add r9d,ebx - movdqa xmm6,xmm7 - add ebx,edi - mov r13d,r9d - psrld xmm7,10 - add r14d,ebx - ror r13d,14 - psrlq xmm6,17 - mov ebx,r14d - mov r12d,r10d - pxor xmm7,xmm6 - ror r14d,9 - xor r13d,r9d - xor r12d,r11d - ror r13d,5 - xor r14d,ebx - psrlq xmm6,2 - and r12d,r9d - xor r13d,r9d - add eax,DWORD[28+rsp] - pxor xmm7,xmm6 - mov edi,ebx - xor r12d,r11d - ror r14d,11 - pshufd xmm7,xmm7,8 - xor edi,ecx - add eax,r12d - movdqa xmm6,XMMWORD[32+rbp] - ror r13d,6 - and r15d,edi - pslldq xmm7,8 - xor r14d,ebx - add eax,r13d - xor r15d,ecx - paddd xmm1,xmm7 - ror r14d,2 - add r8d,eax - add eax,r15d - paddd xmm6,xmm1 - mov r13d,r8d - add r14d,eax - movdqa XMMWORD[16+rsp],xmm6 - ror r13d,14 - movdqa xmm4,xmm3 - mov eax,r14d - mov r12d,r9d - movdqa xmm7,xmm1 - ror r14d,9 - xor r13d,r8d - xor r12d,r10d - ror r13d,5 - xor r14d,eax -DB 102,15,58,15,226,4 - and r12d,r8d - xor r13d,r8d -DB 102,15,58,15,248,4 - add r11d,DWORD[32+rsp] - mov r15d,eax - xor r12d,r10d - ror r14d,11 - movdqa xmm5,xmm4 - xor r15d,ebx - add r11d,r12d - movdqa xmm6,xmm4 - ror r13d,6 - and edi,r15d - psrld xmm4,3 - xor r14d,eax - add r11d,r13d - xor edi,ebx - paddd xmm2,xmm7 - ror r14d,2 - add edx,r11d - psrld xmm6,7 - add r11d,edi - mov r13d,edx - pshufd xmm7,xmm1,250 - add r14d,r11d - ror r13d,14 - pslld xmm5,14 - mov r11d,r14d - mov r12d,r8d - pxor xmm4,xmm6 - ror r14d,9 - xor r13d,edx - xor r12d,r9d - ror r13d,5 - psrld xmm6,11 - xor r14d,r11d - pxor xmm4,xmm5 - and r12d,edx - xor r13d,edx - pslld xmm5,11 - add r10d,DWORD[36+rsp] - mov edi,r11d - pxor xmm4,xmm6 - xor r12d,r9d - ror r14d,11 - movdqa xmm6,xmm7 - xor edi,eax - add r10d,r12d - pxor xmm4,xmm5 - ror r13d,6 - and r15d,edi - xor r14d,r11d - psrld xmm7,10 - add r10d,r13d - xor r15d,eax - paddd xmm2,xmm4 - ror r14d,2 - add ecx,r10d - psrlq xmm6,17 - add r10d,r15d - mov r13d,ecx - add r14d,r10d - pxor xmm7,xmm6 - ror r13d,14 - mov r10d,r14d - mov r12d,edx - ror r14d,9 - psrlq xmm6,2 - xor r13d,ecx - xor r12d,r8d - pxor xmm7,xmm6 - ror r13d,5 - xor r14d,r10d - and r12d,ecx - pshufd xmm7,xmm7,128 - xor r13d,ecx - add r9d,DWORD[40+rsp] - mov r15d,r10d - psrldq xmm7,8 - xor r12d,r8d - ror r14d,11 - xor r15d,r11d - add r9d,r12d - ror r13d,6 - paddd xmm2,xmm7 - and edi,r15d - xor r14d,r10d - add r9d,r13d - pshufd xmm7,xmm2,80 - xor edi,r11d - ror r14d,2 - add ebx,r9d - movdqa xmm6,xmm7 - add r9d,edi - mov r13d,ebx - psrld xmm7,10 - add r14d,r9d - ror r13d,14 - psrlq xmm6,17 - mov r9d,r14d - mov r12d,ecx - pxor xmm7,xmm6 - ror r14d,9 - xor r13d,ebx - xor r12d,edx - ror r13d,5 - xor r14d,r9d - psrlq xmm6,2 - and r12d,ebx - xor r13d,ebx - add r8d,DWORD[44+rsp] - pxor xmm7,xmm6 - mov edi,r9d - xor r12d,edx - ror r14d,11 - pshufd xmm7,xmm7,8 - xor edi,r10d - add r8d,r12d - movdqa xmm6,XMMWORD[64+rbp] - ror r13d,6 - and r15d,edi - pslldq xmm7,8 - xor r14d,r9d - add r8d,r13d - xor r15d,r10d - paddd xmm2,xmm7 - ror r14d,2 - add eax,r8d - add r8d,r15d - paddd xmm6,xmm2 - mov r13d,eax - add r14d,r8d - movdqa XMMWORD[32+rsp],xmm6 - ror r13d,14 - movdqa xmm4,xmm0 - mov r8d,r14d - mov r12d,ebx - movdqa xmm7,xmm2 - ror r14d,9 - xor r13d,eax - xor r12d,ecx - ror r13d,5 - xor r14d,r8d -DB 102,15,58,15,227,4 - and r12d,eax - xor r13d,eax -DB 102,15,58,15,249,4 - add edx,DWORD[48+rsp] - mov r15d,r8d - xor r12d,ecx - ror r14d,11 - movdqa xmm5,xmm4 - xor r15d,r9d - add edx,r12d - movdqa xmm6,xmm4 - ror r13d,6 - and edi,r15d - psrld xmm4,3 - xor r14d,r8d - add edx,r13d - xor edi,r9d - paddd xmm3,xmm7 - ror r14d,2 - add r11d,edx - psrld xmm6,7 - add edx,edi - mov r13d,r11d - pshufd xmm7,xmm2,250 - add r14d,edx - ror r13d,14 - pslld xmm5,14 - mov edx,r14d - mov r12d,eax - pxor xmm4,xmm6 - ror r14d,9 - xor r13d,r11d - xor r12d,ebx - ror r13d,5 - psrld xmm6,11 - xor r14d,edx - pxor xmm4,xmm5 - and r12d,r11d - xor r13d,r11d - pslld xmm5,11 - add ecx,DWORD[52+rsp] - mov edi,edx - pxor xmm4,xmm6 - xor r12d,ebx - ror r14d,11 - movdqa xmm6,xmm7 - xor edi,r8d - add ecx,r12d - pxor xmm4,xmm5 - ror r13d,6 - and r15d,edi - xor r14d,edx - psrld xmm7,10 - add ecx,r13d - xor r15d,r8d - paddd xmm3,xmm4 - ror r14d,2 - add r10d,ecx - psrlq xmm6,17 - add ecx,r15d - mov r13d,r10d - add r14d,ecx - pxor xmm7,xmm6 - ror r13d,14 - mov ecx,r14d - mov r12d,r11d - ror r14d,9 - psrlq xmm6,2 - xor r13d,r10d - xor r12d,eax - pxor xmm7,xmm6 - ror r13d,5 - xor r14d,ecx - and r12d,r10d - pshufd xmm7,xmm7,128 - xor r13d,r10d - add ebx,DWORD[56+rsp] - mov r15d,ecx - psrldq xmm7,8 - xor r12d,eax - ror r14d,11 - xor r15d,edx - add ebx,r12d - ror r13d,6 - paddd xmm3,xmm7 - and edi,r15d - xor r14d,ecx - add ebx,r13d - pshufd xmm7,xmm3,80 - xor edi,edx - ror r14d,2 - add r9d,ebx - movdqa xmm6,xmm7 - add ebx,edi - mov r13d,r9d - psrld xmm7,10 - add r14d,ebx - ror r13d,14 - psrlq xmm6,17 - mov ebx,r14d - mov r12d,r10d - pxor xmm7,xmm6 - ror r14d,9 - xor r13d,r9d - xor r12d,r11d - ror r13d,5 - xor r14d,ebx - psrlq xmm6,2 - and r12d,r9d - xor r13d,r9d - add eax,DWORD[60+rsp] - pxor xmm7,xmm6 - mov edi,ebx - xor r12d,r11d - ror r14d,11 - pshufd xmm7,xmm7,8 - xor edi,ecx - add eax,r12d - movdqa xmm6,XMMWORD[96+rbp] - ror r13d,6 - and r15d,edi - pslldq xmm7,8 - xor r14d,ebx - add eax,r13d - xor r15d,ecx - paddd xmm3,xmm7 - ror r14d,2 - add r8d,eax - add eax,r15d - paddd xmm6,xmm3 - mov r13d,r8d - add r14d,eax - movdqa XMMWORD[48+rsp],xmm6 - cmp BYTE[131+rbp],0 - jne NEAR $L$ssse3_00_47 - ror r13d,14 - mov eax,r14d - mov r12d,r9d - ror r14d,9 - xor r13d,r8d - xor r12d,r10d - ror r13d,5 - xor r14d,eax - and r12d,r8d - xor r13d,r8d - add r11d,DWORD[rsp] - mov r15d,eax - xor r12d,r10d - ror r14d,11 - xor r15d,ebx - add r11d,r12d - ror r13d,6 - and edi,r15d - xor r14d,eax - add r11d,r13d - xor edi,ebx - ror r14d,2 - add edx,r11d - add r11d,edi - mov r13d,edx - add r14d,r11d - ror r13d,14 - mov r11d,r14d - mov r12d,r8d - ror r14d,9 - xor r13d,edx - xor r12d,r9d - ror r13d,5 - xor r14d,r11d - and r12d,edx - xor r13d,edx - add r10d,DWORD[4+rsp] - mov edi,r11d - xor r12d,r9d - ror r14d,11 - xor edi,eax - add r10d,r12d - ror r13d,6 - and r15d,edi - xor r14d,r11d - add r10d,r13d - xor r15d,eax - ror r14d,2 - add ecx,r10d - add r10d,r15d - mov r13d,ecx - add r14d,r10d - ror r13d,14 - mov r10d,r14d - mov r12d,edx - ror r14d,9 - xor r13d,ecx - xor r12d,r8d - ror r13d,5 - xor r14d,r10d - and r12d,ecx - xor r13d,ecx - add r9d,DWORD[8+rsp] - mov r15d,r10d - xor r12d,r8d - ror r14d,11 - xor r15d,r11d - add r9d,r12d - ror r13d,6 - and edi,r15d - xor r14d,r10d - add r9d,r13d - xor edi,r11d - ror r14d,2 - add ebx,r9d - add r9d,edi - mov r13d,ebx - add r14d,r9d - ror r13d,14 - mov r9d,r14d - mov r12d,ecx - ror r14d,9 - xor r13d,ebx - xor r12d,edx - ror r13d,5 - xor r14d,r9d - and r12d,ebx - xor r13d,ebx - add r8d,DWORD[12+rsp] - mov edi,r9d - xor r12d,edx - ror r14d,11 - xor edi,r10d - add r8d,r12d - ror r13d,6 - and r15d,edi - xor r14d,r9d - add r8d,r13d - xor r15d,r10d - ror r14d,2 - add eax,r8d - add r8d,r15d - mov r13d,eax - add r14d,r8d - ror r13d,14 - mov r8d,r14d - mov r12d,ebx - ror r14d,9 - xor r13d,eax - xor r12d,ecx - ror r13d,5 - xor r14d,r8d - and r12d,eax - xor r13d,eax - add edx,DWORD[16+rsp] - mov r15d,r8d - xor r12d,ecx - ror r14d,11 - xor r15d,r9d - add edx,r12d - ror r13d,6 - and edi,r15d - xor r14d,r8d - add edx,r13d - xor edi,r9d - ror r14d,2 - add r11d,edx - add edx,edi - mov r13d,r11d - add r14d,edx - ror r13d,14 - mov edx,r14d - mov r12d,eax - ror r14d,9 - xor r13d,r11d - xor r12d,ebx - ror r13d,5 - xor r14d,edx - and r12d,r11d - xor r13d,r11d - add ecx,DWORD[20+rsp] - mov edi,edx - xor r12d,ebx - ror r14d,11 - xor edi,r8d - add ecx,r12d - ror r13d,6 - and r15d,edi - xor r14d,edx - add ecx,r13d - xor r15d,r8d - ror r14d,2 - add r10d,ecx - add ecx,r15d - mov r13d,r10d - add r14d,ecx - ror r13d,14 - mov ecx,r14d - mov r12d,r11d - ror r14d,9 - xor r13d,r10d - xor r12d,eax - ror r13d,5 - xor r14d,ecx - and r12d,r10d - xor r13d,r10d - add ebx,DWORD[24+rsp] - mov r15d,ecx - xor r12d,eax - ror r14d,11 - xor r15d,edx - add ebx,r12d - ror r13d,6 - and edi,r15d - xor r14d,ecx - add ebx,r13d - xor edi,edx - ror r14d,2 - add r9d,ebx - add ebx,edi - mov r13d,r9d - add r14d,ebx - ror r13d,14 - mov ebx,r14d - mov r12d,r10d - ror r14d,9 - xor r13d,r9d - xor r12d,r11d - ror r13d,5 - xor r14d,ebx - and r12d,r9d - xor r13d,r9d - add eax,DWORD[28+rsp] - mov edi,ebx - xor r12d,r11d - ror r14d,11 - xor edi,ecx - add eax,r12d - ror r13d,6 - and r15d,edi - xor r14d,ebx - add eax,r13d - xor r15d,ecx - ror r14d,2 - add r8d,eax - add eax,r15d - mov r13d,r8d - add r14d,eax - ror r13d,14 - mov eax,r14d - mov r12d,r9d - ror r14d,9 - xor r13d,r8d - xor r12d,r10d - ror r13d,5 - xor r14d,eax - and r12d,r8d - xor r13d,r8d - add r11d,DWORD[32+rsp] - mov r15d,eax - xor r12d,r10d - ror r14d,11 - xor r15d,ebx - add r11d,r12d - ror r13d,6 - and edi,r15d - xor r14d,eax - add r11d,r13d - xor edi,ebx - ror r14d,2 - add edx,r11d - add r11d,edi - mov r13d,edx - add r14d,r11d - ror r13d,14 - mov r11d,r14d - mov r12d,r8d - ror r14d,9 - xor r13d,edx - xor r12d,r9d - ror r13d,5 - xor r14d,r11d - and r12d,edx - xor r13d,edx - add r10d,DWORD[36+rsp] - mov edi,r11d - xor r12d,r9d - ror r14d,11 - xor edi,eax - add r10d,r12d - ror r13d,6 - and r15d,edi - xor r14d,r11d - add r10d,r13d - xor r15d,eax - ror r14d,2 - add ecx,r10d - add r10d,r15d - mov r13d,ecx - add r14d,r10d - ror r13d,14 - mov r10d,r14d - mov r12d,edx - ror r14d,9 - xor r13d,ecx - xor r12d,r8d - ror r13d,5 - xor r14d,r10d - and r12d,ecx - xor r13d,ecx - add r9d,DWORD[40+rsp] - mov r15d,r10d - xor r12d,r8d - ror r14d,11 - xor r15d,r11d - add r9d,r12d - ror r13d,6 - and edi,r15d - xor r14d,r10d - add r9d,r13d - xor edi,r11d - ror r14d,2 - add ebx,r9d - add r9d,edi - mov r13d,ebx - add r14d,r9d - ror r13d,14 - mov r9d,r14d - mov r12d,ecx - ror r14d,9 - xor r13d,ebx - xor r12d,edx - ror r13d,5 - xor r14d,r9d - and r12d,ebx - xor r13d,ebx - add r8d,DWORD[44+rsp] - mov edi,r9d - xor r12d,edx - ror r14d,11 - xor edi,r10d - add r8d,r12d - ror r13d,6 - and r15d,edi - xor r14d,r9d - add r8d,r13d - xor r15d,r10d - ror r14d,2 - add eax,r8d - add r8d,r15d - mov r13d,eax - add r14d,r8d - ror r13d,14 - mov r8d,r14d - mov r12d,ebx - ror r14d,9 - xor r13d,eax - xor r12d,ecx - ror r13d,5 - xor r14d,r8d - and r12d,eax - xor r13d,eax - add edx,DWORD[48+rsp] - mov r15d,r8d - xor r12d,ecx - ror r14d,11 - xor r15d,r9d - add edx,r12d - ror r13d,6 - and edi,r15d - xor r14d,r8d - add edx,r13d - xor edi,r9d - ror r14d,2 - add r11d,edx - add edx,edi - mov r13d,r11d - add r14d,edx - ror r13d,14 - mov edx,r14d - mov r12d,eax - ror r14d,9 - xor r13d,r11d - xor r12d,ebx - ror r13d,5 - xor r14d,edx - and r12d,r11d - xor r13d,r11d - add ecx,DWORD[52+rsp] - mov edi,edx - xor r12d,ebx - ror r14d,11 - xor edi,r8d - add ecx,r12d - ror r13d,6 - and r15d,edi - xor r14d,edx - add ecx,r13d - xor r15d,r8d - ror r14d,2 - add r10d,ecx - add ecx,r15d - mov r13d,r10d - add r14d,ecx - ror r13d,14 - mov ecx,r14d - mov r12d,r11d - ror r14d,9 - xor r13d,r10d - xor r12d,eax - ror r13d,5 - xor r14d,ecx - and r12d,r10d - xor r13d,r10d - add ebx,DWORD[56+rsp] - mov r15d,ecx - xor r12d,eax - ror r14d,11 - xor r15d,edx - add ebx,r12d - ror r13d,6 - and edi,r15d - xor r14d,ecx - add ebx,r13d - xor edi,edx - ror r14d,2 - add r9d,ebx - add ebx,edi - mov r13d,r9d - add r14d,ebx - ror r13d,14 - mov ebx,r14d - mov r12d,r10d - ror r14d,9 - xor r13d,r9d - xor r12d,r11d - ror r13d,5 - xor r14d,ebx - and r12d,r9d - xor r13d,r9d - add eax,DWORD[60+rsp] - mov edi,ebx - xor r12d,r11d - ror r14d,11 - xor edi,ecx - add eax,r12d - ror r13d,6 - and r15d,edi - xor r14d,ebx - add eax,r13d - xor r15d,ecx - ror r14d,2 - add r8d,eax - add eax,r15d - mov r13d,r8d - add r14d,eax - mov rdi,QWORD[((64+0))+rsp] - mov eax,r14d - - add eax,DWORD[rdi] - lea rsi,[64+rsi] - add ebx,DWORD[4+rdi] - add ecx,DWORD[8+rdi] - add edx,DWORD[12+rdi] - add r8d,DWORD[16+rdi] - add r9d,DWORD[20+rdi] - add r10d,DWORD[24+rdi] - add r11d,DWORD[28+rdi] - - cmp rsi,QWORD[((64+16))+rsp] - - mov DWORD[rdi],eax - mov DWORD[4+rdi],ebx - mov DWORD[8+rdi],ecx - mov DWORD[12+rdi],edx - mov DWORD[16+rdi],r8d - mov DWORD[20+rdi],r9d - mov DWORD[24+rdi],r10d - mov DWORD[28+rdi],r11d - jb NEAR $L$loop_ssse3 - - mov rsi,QWORD[88+rsp] - - movaps xmm6,XMMWORD[((64+32))+rsp] - movaps xmm7,XMMWORD[((64+48))+rsp] - movaps xmm8,XMMWORD[((64+64))+rsp] - movaps xmm9,XMMWORD[((64+80))+rsp] - mov r15,QWORD[((-48))+rsi] - - mov r14,QWORD[((-40))+rsi] - - mov r13,QWORD[((-32))+rsi] - - mov r12,QWORD[((-24))+rsi] - - mov rbp,QWORD[((-16))+rsi] - - mov rbx,QWORD[((-8))+rsi] - - lea rsp,[rsi] - -$L$epilogue_ssse3: - mov rdi,QWORD[8+rsp] ;WIN64 epilogue - mov rsi,QWORD[16+rsp] - DB 0F3h,0C3h ;repret - -$L$SEH_end_GFp_sha256_block_data_order_ssse3: - -ALIGN 64 -GFp_sha256_block_data_order_avx: - mov QWORD[8+rsp],rdi ;WIN64 prologue - mov QWORD[16+rsp],rsi - mov rax,rsp -$L$SEH_begin_GFp_sha256_block_data_order_avx: - mov rdi,rcx - mov rsi,rdx - mov rdx,r8 - - - -$L$avx_shortcut: - mov rax,rsp - - push rbx - - push rbp - - push r12 - - push r13 - - push r14 - - push r15 - - shl rdx,4 - sub rsp,160 - lea rdx,[rdx*4+rsi] - and rsp,-64 - mov QWORD[((64+0))+rsp],rdi - mov QWORD[((64+8))+rsp],rsi - mov QWORD[((64+16))+rsp],rdx - mov QWORD[88+rsp],rax - - movaps XMMWORD[(64+32)+rsp],xmm6 - movaps XMMWORD[(64+48)+rsp],xmm7 - movaps XMMWORD[(64+64)+rsp],xmm8 - movaps XMMWORD[(64+80)+rsp],xmm9 -$L$prologue_avx: - - vzeroupper - mov eax,DWORD[rdi] - mov ebx,DWORD[4+rdi] - mov ecx,DWORD[8+rdi] - mov edx,DWORD[12+rdi] - mov r8d,DWORD[16+rdi] - mov r9d,DWORD[20+rdi] - mov r10d,DWORD[24+rdi] - mov r11d,DWORD[28+rdi] - vmovdqa xmm8,XMMWORD[((K256+512+32))] - vmovdqa xmm9,XMMWORD[((K256+512+64))] - jmp NEAR $L$loop_avx -ALIGN 16 -$L$loop_avx: - vmovdqa xmm7,XMMWORD[((K256+512))] - vmovdqu xmm0,XMMWORD[rsi] - vmovdqu xmm1,XMMWORD[16+rsi] - vmovdqu xmm2,XMMWORD[32+rsi] - vmovdqu xmm3,XMMWORD[48+rsi] - vpshufb xmm0,xmm0,xmm7 - lea rbp,[K256] - vpshufb xmm1,xmm1,xmm7 - vpshufb xmm2,xmm2,xmm7 - vpaddd xmm4,xmm0,XMMWORD[rbp] - vpshufb xmm3,xmm3,xmm7 - vpaddd xmm5,xmm1,XMMWORD[32+rbp] - vpaddd xmm6,xmm2,XMMWORD[64+rbp] - vpaddd xmm7,xmm3,XMMWORD[96+rbp] - vmovdqa XMMWORD[rsp],xmm4 - mov r14d,eax - vmovdqa XMMWORD[16+rsp],xmm5 - mov edi,ebx - vmovdqa XMMWORD[32+rsp],xmm6 - xor edi,ecx - vmovdqa XMMWORD[48+rsp],xmm7 - mov r13d,r8d - jmp NEAR $L$avx_00_47 - -ALIGN 16 -$L$avx_00_47: - sub rbp,-128 - vpalignr xmm4,xmm1,xmm0,4 - shrd r13d,r13d,14 - mov eax,r14d - mov r12d,r9d - vpalignr xmm7,xmm3,xmm2,4 - shrd r14d,r14d,9 - xor r13d,r8d - xor r12d,r10d - vpsrld xmm6,xmm4,7 - shrd r13d,r13d,5 - xor r14d,eax - and r12d,r8d - vpaddd xmm0,xmm0,xmm7 - xor r13d,r8d - add r11d,DWORD[rsp] - mov r15d,eax - vpsrld xmm7,xmm4,3 - xor r12d,r10d - shrd r14d,r14d,11 - xor r15d,ebx - vpslld xmm5,xmm4,14 - add r11d,r12d - shrd r13d,r13d,6 - and edi,r15d - vpxor xmm4,xmm7,xmm6 - xor r14d,eax - add r11d,r13d - xor edi,ebx - vpshufd xmm7,xmm3,250 - shrd r14d,r14d,2 - add edx,r11d - add r11d,edi - vpsrld xmm6,xmm6,11 - mov r13d,edx - add r14d,r11d - shrd r13d,r13d,14 - vpxor xmm4,xmm4,xmm5 - mov r11d,r14d - mov r12d,r8d - shrd r14d,r14d,9 - vpslld xmm5,xmm5,11 - xor r13d,edx - xor r12d,r9d - shrd r13d,r13d,5 - vpxor xmm4,xmm4,xmm6 - xor r14d,r11d - and r12d,edx - xor r13d,edx - vpsrld xmm6,xmm7,10 - add r10d,DWORD[4+rsp] - mov edi,r11d - xor r12d,r9d - vpxor xmm4,xmm4,xmm5 - shrd r14d,r14d,11 - xor edi,eax - add r10d,r12d - vpsrlq xmm7,xmm7,17 - shrd r13d,r13d,6 - and r15d,edi - xor r14d,r11d - vpaddd xmm0,xmm0,xmm4 - add r10d,r13d - xor r15d,eax - shrd r14d,r14d,2 - vpxor xmm6,xmm6,xmm7 - add ecx,r10d - add r10d,r15d - mov r13d,ecx - vpsrlq xmm7,xmm7,2 - add r14d,r10d - shrd r13d,r13d,14 - mov r10d,r14d - vpxor xmm6,xmm6,xmm7 - mov r12d,edx - shrd r14d,r14d,9 - xor r13d,ecx - vpshufb xmm6,xmm6,xmm8 - xor r12d,r8d - shrd r13d,r13d,5 - xor r14d,r10d - vpaddd xmm0,xmm0,xmm6 - and r12d,ecx - xor r13d,ecx - add r9d,DWORD[8+rsp] - vpshufd xmm7,xmm0,80 - mov r15d,r10d - xor r12d,r8d - shrd r14d,r14d,11 - vpsrld xmm6,xmm7,10 - xor r15d,r11d - add r9d,r12d - shrd r13d,r13d,6 - vpsrlq xmm7,xmm7,17 - and edi,r15d - xor r14d,r10d - add r9d,r13d - vpxor xmm6,xmm6,xmm7 - xor edi,r11d - shrd r14d,r14d,2 - add ebx,r9d - vpsrlq xmm7,xmm7,2 - add r9d,edi - mov r13d,ebx - add r14d,r9d - vpxor xmm6,xmm6,xmm7 - shrd r13d,r13d,14 - mov r9d,r14d - mov r12d,ecx - vpshufb xmm6,xmm6,xmm9 - shrd r14d,r14d,9 - xor r13d,ebx - xor r12d,edx - vpaddd xmm0,xmm0,xmm6 - shrd r13d,r13d,5 - xor r14d,r9d - and r12d,ebx - vpaddd xmm6,xmm0,XMMWORD[rbp] - xor r13d,ebx - add r8d,DWORD[12+rsp] - mov edi,r9d - xor r12d,edx - shrd r14d,r14d,11 - xor edi,r10d - add r8d,r12d - shrd r13d,r13d,6 - and r15d,edi - xor r14d,r9d - add r8d,r13d - xor r15d,r10d - shrd r14d,r14d,2 - add eax,r8d - add r8d,r15d - mov r13d,eax - add r14d,r8d - vmovdqa XMMWORD[rsp],xmm6 - vpalignr xmm4,xmm2,xmm1,4 - shrd r13d,r13d,14 - mov r8d,r14d - mov r12d,ebx - vpalignr xmm7,xmm0,xmm3,4 - shrd r14d,r14d,9 - xor r13d,eax - xor r12d,ecx - vpsrld xmm6,xmm4,7 - shrd r13d,r13d,5 - xor r14d,r8d - and r12d,eax - vpaddd xmm1,xmm1,xmm7 - xor r13d,eax - add edx,DWORD[16+rsp] - mov r15d,r8d - vpsrld xmm7,xmm4,3 - xor r12d,ecx - shrd r14d,r14d,11 - xor r15d,r9d - vpslld xmm5,xmm4,14 - add edx,r12d - shrd r13d,r13d,6 - and edi,r15d - vpxor xmm4,xmm7,xmm6 - xor r14d,r8d - add edx,r13d - xor edi,r9d - vpshufd xmm7,xmm0,250 - shrd r14d,r14d,2 - add r11d,edx - add edx,edi - vpsrld xmm6,xmm6,11 - mov r13d,r11d - add r14d,edx - shrd r13d,r13d,14 - vpxor xmm4,xmm4,xmm5 - mov edx,r14d - mov r12d,eax - shrd r14d,r14d,9 - vpslld xmm5,xmm5,11 - xor r13d,r11d - xor r12d,ebx - shrd r13d,r13d,5 - vpxor xmm4,xmm4,xmm6 - xor r14d,edx - and r12d,r11d - xor r13d,r11d - vpsrld xmm6,xmm7,10 - add ecx,DWORD[20+rsp] - mov edi,edx - xor r12d,ebx - vpxor xmm4,xmm4,xmm5 - shrd r14d,r14d,11 - xor edi,r8d - add ecx,r12d - vpsrlq xmm7,xmm7,17 - shrd r13d,r13d,6 - and r15d,edi - xor r14d,edx - vpaddd xmm1,xmm1,xmm4 - add ecx,r13d - xor r15d,r8d - shrd r14d,r14d,2 - vpxor xmm6,xmm6,xmm7 - add r10d,ecx - add ecx,r15d - mov r13d,r10d - vpsrlq xmm7,xmm7,2 - add r14d,ecx - shrd r13d,r13d,14 - mov ecx,r14d - vpxor xmm6,xmm6,xmm7 - mov r12d,r11d - shrd r14d,r14d,9 - xor r13d,r10d - vpshufb xmm6,xmm6,xmm8 - xor r12d,eax - shrd r13d,r13d,5 - xor r14d,ecx - vpaddd xmm1,xmm1,xmm6 - and r12d,r10d - xor r13d,r10d - add ebx,DWORD[24+rsp] - vpshufd xmm7,xmm1,80 - mov r15d,ecx - xor r12d,eax - shrd r14d,r14d,11 - vpsrld xmm6,xmm7,10 - xor r15d,edx - add ebx,r12d - shrd r13d,r13d,6 - vpsrlq xmm7,xmm7,17 - and edi,r15d - xor r14d,ecx - add ebx,r13d - vpxor xmm6,xmm6,xmm7 - xor edi,edx - shrd r14d,r14d,2 - add r9d,ebx - vpsrlq xmm7,xmm7,2 - add ebx,edi - mov r13d,r9d - add r14d,ebx - vpxor xmm6,xmm6,xmm7 - shrd r13d,r13d,14 - mov ebx,r14d - mov r12d,r10d - vpshufb xmm6,xmm6,xmm9 - shrd r14d,r14d,9 - xor r13d,r9d - xor r12d,r11d - vpaddd xmm1,xmm1,xmm6 - shrd r13d,r13d,5 - xor r14d,ebx - and r12d,r9d - vpaddd xmm6,xmm1,XMMWORD[32+rbp] - xor r13d,r9d - add eax,DWORD[28+rsp] - mov edi,ebx - xor r12d,r11d - shrd r14d,r14d,11 - xor edi,ecx - add eax,r12d - shrd r13d,r13d,6 - and r15d,edi - xor r14d,ebx - add eax,r13d - xor r15d,ecx - shrd r14d,r14d,2 - add r8d,eax - add eax,r15d - mov r13d,r8d - add r14d,eax - vmovdqa XMMWORD[16+rsp],xmm6 - vpalignr xmm4,xmm3,xmm2,4 - shrd r13d,r13d,14 - mov eax,r14d - mov r12d,r9d - vpalignr xmm7,xmm1,xmm0,4 - shrd r14d,r14d,9 - xor r13d,r8d - xor r12d,r10d - vpsrld xmm6,xmm4,7 - shrd r13d,r13d,5 - xor r14d,eax - and r12d,r8d - vpaddd xmm2,xmm2,xmm7 - xor r13d,r8d - add r11d,DWORD[32+rsp] - mov r15d,eax - vpsrld xmm7,xmm4,3 - xor r12d,r10d - shrd r14d,r14d,11 - xor r15d,ebx - vpslld xmm5,xmm4,14 - add r11d,r12d - shrd r13d,r13d,6 - and edi,r15d - vpxor xmm4,xmm7,xmm6 - xor r14d,eax - add r11d,r13d - xor edi,ebx - vpshufd xmm7,xmm1,250 - shrd r14d,r14d,2 - add edx,r11d - add r11d,edi - vpsrld xmm6,xmm6,11 - mov r13d,edx - add r14d,r11d - shrd r13d,r13d,14 - vpxor xmm4,xmm4,xmm5 - mov r11d,r14d - mov r12d,r8d - shrd r14d,r14d,9 - vpslld xmm5,xmm5,11 - xor r13d,edx - xor r12d,r9d - shrd r13d,r13d,5 - vpxor xmm4,xmm4,xmm6 - xor r14d,r11d - and r12d,edx - xor r13d,edx - vpsrld xmm6,xmm7,10 - add r10d,DWORD[36+rsp] - mov edi,r11d - xor r12d,r9d - vpxor xmm4,xmm4,xmm5 - shrd r14d,r14d,11 - xor edi,eax - add r10d,r12d - vpsrlq xmm7,xmm7,17 - shrd r13d,r13d,6 - and r15d,edi - xor r14d,r11d - vpaddd xmm2,xmm2,xmm4 - add r10d,r13d - xor r15d,eax - shrd r14d,r14d,2 - vpxor xmm6,xmm6,xmm7 - add ecx,r10d - add r10d,r15d - mov r13d,ecx - vpsrlq xmm7,xmm7,2 - add r14d,r10d - shrd r13d,r13d,14 - mov r10d,r14d - vpxor xmm6,xmm6,xmm7 - mov r12d,edx - shrd r14d,r14d,9 - xor r13d,ecx - vpshufb xmm6,xmm6,xmm8 - xor r12d,r8d - shrd r13d,r13d,5 - xor r14d,r10d - vpaddd xmm2,xmm2,xmm6 - and r12d,ecx - xor r13d,ecx - add r9d,DWORD[40+rsp] - vpshufd xmm7,xmm2,80 - mov r15d,r10d - xor r12d,r8d - shrd r14d,r14d,11 - vpsrld xmm6,xmm7,10 - xor r15d,r11d - add r9d,r12d - shrd r13d,r13d,6 - vpsrlq xmm7,xmm7,17 - and edi,r15d - xor r14d,r10d - add r9d,r13d - vpxor xmm6,xmm6,xmm7 - xor edi,r11d - shrd r14d,r14d,2 - add ebx,r9d - vpsrlq xmm7,xmm7,2 - add r9d,edi - mov r13d,ebx - add r14d,r9d - vpxor xmm6,xmm6,xmm7 - shrd r13d,r13d,14 - mov r9d,r14d - mov r12d,ecx - vpshufb xmm6,xmm6,xmm9 - shrd r14d,r14d,9 - xor r13d,ebx - xor r12d,edx - vpaddd xmm2,xmm2,xmm6 - shrd r13d,r13d,5 - xor r14d,r9d - and r12d,ebx - vpaddd xmm6,xmm2,XMMWORD[64+rbp] - xor r13d,ebx - add r8d,DWORD[44+rsp] - mov edi,r9d - xor r12d,edx - shrd r14d,r14d,11 - xor edi,r10d - add r8d,r12d - shrd r13d,r13d,6 - and r15d,edi - xor r14d,r9d - add r8d,r13d - xor r15d,r10d - shrd r14d,r14d,2 - add eax,r8d - add r8d,r15d - mov r13d,eax - add r14d,r8d - vmovdqa XMMWORD[32+rsp],xmm6 - vpalignr xmm4,xmm0,xmm3,4 - shrd r13d,r13d,14 - mov r8d,r14d - mov r12d,ebx - vpalignr xmm7,xmm2,xmm1,4 - shrd r14d,r14d,9 - xor r13d,eax - xor r12d,ecx - vpsrld xmm6,xmm4,7 - shrd r13d,r13d,5 - xor r14d,r8d - and r12d,eax - vpaddd xmm3,xmm3,xmm7 - xor r13d,eax - add edx,DWORD[48+rsp] - mov r15d,r8d - vpsrld xmm7,xmm4,3 - xor r12d,ecx - shrd r14d,r14d,11 - xor r15d,r9d - vpslld xmm5,xmm4,14 - add edx,r12d - shrd r13d,r13d,6 - and edi,r15d - vpxor xmm4,xmm7,xmm6 - xor r14d,r8d - add edx,r13d - xor edi,r9d - vpshufd xmm7,xmm2,250 - shrd r14d,r14d,2 - add r11d,edx - add edx,edi - vpsrld xmm6,xmm6,11 - mov r13d,r11d - add r14d,edx - shrd r13d,r13d,14 - vpxor xmm4,xmm4,xmm5 - mov edx,r14d - mov r12d,eax - shrd r14d,r14d,9 - vpslld xmm5,xmm5,11 - xor r13d,r11d - xor r12d,ebx - shrd r13d,r13d,5 - vpxor xmm4,xmm4,xmm6 - xor r14d,edx - and r12d,r11d - xor r13d,r11d - vpsrld xmm6,xmm7,10 - add ecx,DWORD[52+rsp] - mov edi,edx - xor r12d,ebx - vpxor xmm4,xmm4,xmm5 - shrd r14d,r14d,11 - xor edi,r8d - add ecx,r12d - vpsrlq xmm7,xmm7,17 - shrd r13d,r13d,6 - and r15d,edi - xor r14d,edx - vpaddd xmm3,xmm3,xmm4 - add ecx,r13d - xor r15d,r8d - shrd r14d,r14d,2 - vpxor xmm6,xmm6,xmm7 - add r10d,ecx - add ecx,r15d - mov r13d,r10d - vpsrlq xmm7,xmm7,2 - add r14d,ecx - shrd r13d,r13d,14 - mov ecx,r14d - vpxor xmm6,xmm6,xmm7 - mov r12d,r11d - shrd r14d,r14d,9 - xor r13d,r10d - vpshufb xmm6,xmm6,xmm8 - xor r12d,eax - shrd r13d,r13d,5 - xor r14d,ecx - vpaddd xmm3,xmm3,xmm6 - and r12d,r10d - xor r13d,r10d - add ebx,DWORD[56+rsp] - vpshufd xmm7,xmm3,80 - mov r15d,ecx - xor r12d,eax - shrd r14d,r14d,11 - vpsrld xmm6,xmm7,10 - xor r15d,edx - add ebx,r12d - shrd r13d,r13d,6 - vpsrlq xmm7,xmm7,17 - and edi,r15d - xor r14d,ecx - add ebx,r13d - vpxor xmm6,xmm6,xmm7 - xor edi,edx - shrd r14d,r14d,2 - add r9d,ebx - vpsrlq xmm7,xmm7,2 - add ebx,edi - mov r13d,r9d - add r14d,ebx - vpxor xmm6,xmm6,xmm7 - shrd r13d,r13d,14 - mov ebx,r14d - mov r12d,r10d - vpshufb xmm6,xmm6,xmm9 - shrd r14d,r14d,9 - xor r13d,r9d - xor r12d,r11d - vpaddd xmm3,xmm3,xmm6 - shrd r13d,r13d,5 - xor r14d,ebx - and r12d,r9d - vpaddd xmm6,xmm3,XMMWORD[96+rbp] - xor r13d,r9d - add eax,DWORD[60+rsp] - mov edi,ebx - xor r12d,r11d - shrd r14d,r14d,11 - xor edi,ecx - add eax,r12d - shrd r13d,r13d,6 - and r15d,edi - xor r14d,ebx - add eax,r13d - xor r15d,ecx - shrd r14d,r14d,2 - add r8d,eax - add eax,r15d - mov r13d,r8d - add r14d,eax - vmovdqa XMMWORD[48+rsp],xmm6 - cmp BYTE[131+rbp],0 - jne NEAR $L$avx_00_47 - shrd r13d,r13d,14 - mov eax,r14d - mov r12d,r9d - shrd r14d,r14d,9 - xor r13d,r8d - xor r12d,r10d - shrd r13d,r13d,5 - xor r14d,eax - and r12d,r8d - xor r13d,r8d - add r11d,DWORD[rsp] - mov r15d,eax - xor r12d,r10d - shrd r14d,r14d,11 - xor r15d,ebx - add r11d,r12d - shrd r13d,r13d,6 - and edi,r15d - xor r14d,eax - add r11d,r13d - xor edi,ebx - shrd r14d,r14d,2 - add edx,r11d - add r11d,edi - mov r13d,edx - add r14d,r11d - shrd r13d,r13d,14 - mov r11d,r14d - mov r12d,r8d - shrd r14d,r14d,9 - xor r13d,edx - xor r12d,r9d - shrd r13d,r13d,5 - xor r14d,r11d - and r12d,edx - xor r13d,edx - add r10d,DWORD[4+rsp] - mov edi,r11d - xor r12d,r9d - shrd r14d,r14d,11 - xor edi,eax - add r10d,r12d - shrd r13d,r13d,6 - and r15d,edi - xor r14d,r11d - add r10d,r13d - xor r15d,eax - shrd r14d,r14d,2 - add ecx,r10d - add r10d,r15d - mov r13d,ecx - add r14d,r10d - shrd r13d,r13d,14 - mov r10d,r14d - mov r12d,edx - shrd r14d,r14d,9 - xor r13d,ecx - xor r12d,r8d - shrd r13d,r13d,5 - xor r14d,r10d - and r12d,ecx - xor r13d,ecx - add r9d,DWORD[8+rsp] - mov r15d,r10d - xor r12d,r8d - shrd r14d,r14d,11 - xor r15d,r11d - add r9d,r12d - shrd r13d,r13d,6 - and edi,r15d - xor r14d,r10d - add r9d,r13d - xor edi,r11d - shrd r14d,r14d,2 - add ebx,r9d - add r9d,edi - mov r13d,ebx - add r14d,r9d - shrd r13d,r13d,14 - mov r9d,r14d - mov r12d,ecx - shrd r14d,r14d,9 - xor r13d,ebx - xor r12d,edx - shrd r13d,r13d,5 - xor r14d,r9d - and r12d,ebx - xor r13d,ebx - add r8d,DWORD[12+rsp] - mov edi,r9d - xor r12d,edx - shrd r14d,r14d,11 - xor edi,r10d - add r8d,r12d - shrd r13d,r13d,6 - and r15d,edi - xor r14d,r9d - add r8d,r13d - xor r15d,r10d - shrd r14d,r14d,2 - add eax,r8d - add r8d,r15d - mov r13d,eax - add r14d,r8d - shrd r13d,r13d,14 - mov r8d,r14d - mov r12d,ebx - shrd r14d,r14d,9 - xor r13d,eax - xor r12d,ecx - shrd r13d,r13d,5 - xor r14d,r8d - and r12d,eax - xor r13d,eax - add edx,DWORD[16+rsp] - mov r15d,r8d - xor r12d,ecx - shrd r14d,r14d,11 - xor r15d,r9d - add edx,r12d - shrd r13d,r13d,6 - and edi,r15d - xor r14d,r8d - add edx,r13d - xor edi,r9d - shrd r14d,r14d,2 - add r11d,edx - add edx,edi - mov r13d,r11d - add r14d,edx - shrd r13d,r13d,14 - mov edx,r14d - mov r12d,eax - shrd r14d,r14d,9 - xor r13d,r11d - xor r12d,ebx - shrd r13d,r13d,5 - xor r14d,edx - and r12d,r11d - xor r13d,r11d - add ecx,DWORD[20+rsp] - mov edi,edx - xor r12d,ebx - shrd r14d,r14d,11 - xor edi,r8d - add ecx,r12d - shrd r13d,r13d,6 - and r15d,edi - xor r14d,edx - add ecx,r13d - xor r15d,r8d - shrd r14d,r14d,2 - add r10d,ecx - add ecx,r15d - mov r13d,r10d - add r14d,ecx - shrd r13d,r13d,14 - mov ecx,r14d - mov r12d,r11d - shrd r14d,r14d,9 - xor r13d,r10d - xor r12d,eax - shrd r13d,r13d,5 - xor r14d,ecx - and r12d,r10d - xor r13d,r10d - add ebx,DWORD[24+rsp] - mov r15d,ecx - xor r12d,eax - shrd r14d,r14d,11 - xor r15d,edx - add ebx,r12d - shrd r13d,r13d,6 - and edi,r15d - xor r14d,ecx - add ebx,r13d - xor edi,edx - shrd r14d,r14d,2 - add r9d,ebx - add ebx,edi - mov r13d,r9d - add r14d,ebx - shrd r13d,r13d,14 - mov ebx,r14d - mov r12d,r10d - shrd r14d,r14d,9 - xor r13d,r9d - xor r12d,r11d - shrd r13d,r13d,5 - xor r14d,ebx - and r12d,r9d - xor r13d,r9d - add eax,DWORD[28+rsp] - mov edi,ebx - xor r12d,r11d - shrd r14d,r14d,11 - xor edi,ecx - add eax,r12d - shrd r13d,r13d,6 - and r15d,edi - xor r14d,ebx - add eax,r13d - xor r15d,ecx - shrd r14d,r14d,2 - add r8d,eax - add eax,r15d - mov r13d,r8d - add r14d,eax - shrd r13d,r13d,14 - mov eax,r14d - mov r12d,r9d - shrd r14d,r14d,9 - xor r13d,r8d - xor r12d,r10d - shrd r13d,r13d,5 - xor r14d,eax - and r12d,r8d - xor r13d,r8d - add r11d,DWORD[32+rsp] - mov r15d,eax - xor r12d,r10d - shrd r14d,r14d,11 - xor r15d,ebx - add r11d,r12d - shrd r13d,r13d,6 - and edi,r15d - xor r14d,eax - add r11d,r13d - xor edi,ebx - shrd r14d,r14d,2 - add edx,r11d - add r11d,edi - mov r13d,edx - add r14d,r11d - shrd r13d,r13d,14 - mov r11d,r14d - mov r12d,r8d - shrd r14d,r14d,9 - xor r13d,edx - xor r12d,r9d - shrd r13d,r13d,5 - xor r14d,r11d - and r12d,edx - xor r13d,edx - add r10d,DWORD[36+rsp] - mov edi,r11d - xor r12d,r9d - shrd r14d,r14d,11 - xor edi,eax - add r10d,r12d - shrd r13d,r13d,6 - and r15d,edi - xor r14d,r11d - add r10d,r13d - xor r15d,eax - shrd r14d,r14d,2 - add ecx,r10d - add r10d,r15d - mov r13d,ecx - add r14d,r10d - shrd r13d,r13d,14 - mov r10d,r14d - mov r12d,edx - shrd r14d,r14d,9 - xor r13d,ecx - xor r12d,r8d - shrd r13d,r13d,5 - xor r14d,r10d - and r12d,ecx - xor r13d,ecx - add r9d,DWORD[40+rsp] - mov r15d,r10d - xor r12d,r8d - shrd r14d,r14d,11 - xor r15d,r11d - add r9d,r12d - shrd r13d,r13d,6 - and edi,r15d - xor r14d,r10d - add r9d,r13d - xor edi,r11d - shrd r14d,r14d,2 - add ebx,r9d - add r9d,edi - mov r13d,ebx - add r14d,r9d - shrd r13d,r13d,14 - mov r9d,r14d - mov r12d,ecx - shrd r14d,r14d,9 - xor r13d,ebx - xor r12d,edx - shrd r13d,r13d,5 - xor r14d,r9d - and r12d,ebx - xor r13d,ebx - add r8d,DWORD[44+rsp] - mov edi,r9d - xor r12d,edx - shrd r14d,r14d,11 - xor edi,r10d - add r8d,r12d - shrd r13d,r13d,6 - and r15d,edi - xor r14d,r9d - add r8d,r13d - xor r15d,r10d - shrd r14d,r14d,2 - add eax,r8d - add r8d,r15d - mov r13d,eax - add r14d,r8d - shrd r13d,r13d,14 - mov r8d,r14d - mov r12d,ebx - shrd r14d,r14d,9 - xor r13d,eax - xor r12d,ecx - shrd r13d,r13d,5 - xor r14d,r8d - and r12d,eax - xor r13d,eax - add edx,DWORD[48+rsp] - mov r15d,r8d - xor r12d,ecx - shrd r14d,r14d,11 - xor r15d,r9d - add edx,r12d - shrd r13d,r13d,6 - and edi,r15d - xor r14d,r8d - add edx,r13d - xor edi,r9d - shrd r14d,r14d,2 - add r11d,edx - add edx,edi - mov r13d,r11d - add r14d,edx - shrd r13d,r13d,14 - mov edx,r14d - mov r12d,eax - shrd r14d,r14d,9 - xor r13d,r11d - xor r12d,ebx - shrd r13d,r13d,5 - xor r14d,edx - and r12d,r11d - xor r13d,r11d - add ecx,DWORD[52+rsp] - mov edi,edx - xor r12d,ebx - shrd r14d,r14d,11 - xor edi,r8d - add ecx,r12d - shrd r13d,r13d,6 - and r15d,edi - xor r14d,edx - add ecx,r13d - xor r15d,r8d - shrd r14d,r14d,2 - add r10d,ecx - add ecx,r15d - mov r13d,r10d - add r14d,ecx - shrd r13d,r13d,14 - mov ecx,r14d - mov r12d,r11d - shrd r14d,r14d,9 - xor r13d,r10d - xor r12d,eax - shrd r13d,r13d,5 - xor r14d,ecx - and r12d,r10d - xor r13d,r10d - add ebx,DWORD[56+rsp] - mov r15d,ecx - xor r12d,eax - shrd r14d,r14d,11 - xor r15d,edx - add ebx,r12d - shrd r13d,r13d,6 - and edi,r15d - xor r14d,ecx - add ebx,r13d - xor edi,edx - shrd r14d,r14d,2 - add r9d,ebx - add ebx,edi - mov r13d,r9d - add r14d,ebx - shrd r13d,r13d,14 - mov ebx,r14d - mov r12d,r10d - shrd r14d,r14d,9 - xor r13d,r9d - xor r12d,r11d - shrd r13d,r13d,5 - xor r14d,ebx - and r12d,r9d - xor r13d,r9d - add eax,DWORD[60+rsp] - mov edi,ebx - xor r12d,r11d - shrd r14d,r14d,11 - xor edi,ecx - add eax,r12d - shrd r13d,r13d,6 - and r15d,edi - xor r14d,ebx - add eax,r13d - xor r15d,ecx - shrd r14d,r14d,2 - add r8d,eax - add eax,r15d - mov r13d,r8d - add r14d,eax - mov rdi,QWORD[((64+0))+rsp] - mov eax,r14d - - add eax,DWORD[rdi] - lea rsi,[64+rsi] - add ebx,DWORD[4+rdi] - add ecx,DWORD[8+rdi] - add edx,DWORD[12+rdi] - add r8d,DWORD[16+rdi] - add r9d,DWORD[20+rdi] - add r10d,DWORD[24+rdi] - add r11d,DWORD[28+rdi] - - cmp rsi,QWORD[((64+16))+rsp] - - mov DWORD[rdi],eax - mov DWORD[4+rdi],ebx - mov DWORD[8+rdi],ecx - mov DWORD[12+rdi],edx - mov DWORD[16+rdi],r8d - mov DWORD[20+rdi],r9d - mov DWORD[24+rdi],r10d - mov DWORD[28+rdi],r11d - jb NEAR $L$loop_avx - - mov rsi,QWORD[88+rsp] - - vzeroupper - movaps xmm6,XMMWORD[((64+32))+rsp] - movaps xmm7,XMMWORD[((64+48))+rsp] - movaps xmm8,XMMWORD[((64+64))+rsp] - movaps xmm9,XMMWORD[((64+80))+rsp] - mov r15,QWORD[((-48))+rsi] - - mov r14,QWORD[((-40))+rsi] - - mov r13,QWORD[((-32))+rsi] - - mov r12,QWORD[((-24))+rsi] - - mov rbp,QWORD[((-16))+rsi] - - mov rbx,QWORD[((-8))+rsi] - - lea rsp,[rsi] - -$L$epilogue_avx: - mov rdi,QWORD[8+rsp] ;WIN64 epilogue - mov rsi,QWORD[16+rsp] - DB 0F3h,0C3h ;repret - -$L$SEH_end_GFp_sha256_block_data_order_avx: -EXTERN __imp_RtlVirtualUnwind - -ALIGN 16 -se_handler: - push rsi - push rdi - push rbx - push rbp - push r12 - push r13 - push r14 - push r15 - pushfq - sub rsp,64 - - mov rax,QWORD[120+r8] - mov rbx,QWORD[248+r8] - - mov rsi,QWORD[8+r9] - mov r11,QWORD[56+r9] - - mov r10d,DWORD[r11] - lea r10,[r10*1+rsi] - cmp rbx,r10 - jb NEAR $L$in_prologue - - mov rax,QWORD[152+r8] - - mov r10d,DWORD[4+r11] - lea r10,[r10*1+rsi] - cmp rbx,r10 - jae NEAR $L$in_prologue - mov rsi,rax - mov rax,QWORD[((64+24))+rax] - - mov rbx,QWORD[((-8))+rax] - mov rbp,QWORD[((-16))+rax] - mov r12,QWORD[((-24))+rax] - mov r13,QWORD[((-32))+rax] - mov r14,QWORD[((-40))+rax] - mov r15,QWORD[((-48))+rax] - mov QWORD[144+r8],rbx - mov QWORD[160+r8],rbp - mov QWORD[216+r8],r12 - mov QWORD[224+r8],r13 - mov QWORD[232+r8],r14 - mov QWORD[240+r8],r15 - - lea r10,[$L$epilogue] - cmp rbx,r10 - jb NEAR $L$in_prologue - - lea rsi,[((64+32))+rsi] - lea rdi,[512+r8] - mov ecx,8 - DD 0xa548f3fc - -$L$in_prologue: - mov rdi,QWORD[8+rax] - mov rsi,QWORD[16+rax] - mov QWORD[152+r8],rax - mov QWORD[168+r8],rsi - mov QWORD[176+r8],rdi - - mov rdi,QWORD[40+r9] - mov rsi,r8 - mov ecx,154 - DD 0xa548f3fc - - mov rsi,r9 - xor rcx,rcx - mov rdx,QWORD[8+rsi] - mov r8,QWORD[rsi] - mov r9,QWORD[16+rsi] - mov r10,QWORD[40+rsi] - lea r11,[56+rsi] - lea r12,[24+rsi] - mov QWORD[32+rsp],r10 - mov QWORD[40+rsp],r11 - mov QWORD[48+rsp],r12 - mov QWORD[56+rsp],rcx - call QWORD[__imp_RtlVirtualUnwind] - - mov eax,1 - add rsp,64 - popfq - pop r15 - pop r14 - pop r13 - pop r12 - pop rbp - pop rbx - pop rdi - pop rsi - DB 0F3h,0C3h ;repret - -section .pdata rdata align=4 -ALIGN 4 - DD $L$SEH_begin_GFp_sha256_block_data_order wrt ..imagebase - DD $L$SEH_end_GFp_sha256_block_data_order wrt ..imagebase - DD $L$SEH_info_GFp_sha256_block_data_order wrt ..imagebase - DD $L$SEH_begin_GFp_sha256_block_data_order_ssse3 wrt ..imagebase - DD $L$SEH_end_GFp_sha256_block_data_order_ssse3 wrt ..imagebase - DD $L$SEH_info_GFp_sha256_block_data_order_ssse3 wrt ..imagebase - DD $L$SEH_begin_GFp_sha256_block_data_order_avx wrt ..imagebase - DD $L$SEH_end_GFp_sha256_block_data_order_avx wrt ..imagebase - DD $L$SEH_info_GFp_sha256_block_data_order_avx wrt ..imagebase -section .xdata rdata align=8 -ALIGN 8 -$L$SEH_info_GFp_sha256_block_data_order: -DB 9,0,0,0 - DD se_handler wrt ..imagebase - DD $L$prologue wrt ..imagebase,$L$epilogue wrt ..imagebase -$L$SEH_info_GFp_sha256_block_data_order_ssse3: -DB 9,0,0,0 - DD se_handler wrt ..imagebase - DD $L$prologue_ssse3 wrt ..imagebase,$L$epilogue_ssse3 wrt ..imagebase -$L$SEH_info_GFp_sha256_block_data_order_avx: -DB 9,0,0,0 - DD se_handler wrt ..imagebase - DD $L$prologue_avx wrt ..imagebase,$L$epilogue_avx wrt ..imagebase diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/tmp/sha512-x86_64-nasm.asm temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/tmp/sha512-x86_64-nasm.asm --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/tmp/sha512-x86_64-nasm.asm 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/tmp/sha512-x86_64-nasm.asm 1970-01-01 00:00:00.000000000 +0000 @@ -1,3135 +0,0 @@ -; This file is generated from a similarly-named Perl script in the BoringSSL -; source tree. Do not edit by hand. - -default rel -%define XMMWORD -%define YMMWORD -%define ZMMWORD -section .text code align=64 - - -EXTERN GFp_ia32cap_P -global GFp_sha512_block_data_order - -ALIGN 16 -GFp_sha512_block_data_order: - mov QWORD[8+rsp],rdi ;WIN64 prologue - mov QWORD[16+rsp],rsi - mov rax,rsp -$L$SEH_begin_GFp_sha512_block_data_order: - mov rdi,rcx - mov rsi,rdx - mov rdx,r8 - - - - lea r11,[GFp_ia32cap_P] - mov r9d,DWORD[r11] - mov r10d,DWORD[4+r11] - mov r11d,DWORD[8+r11] - and r9d,1073741824 - and r10d,268435968 - or r10d,r9d - cmp r10d,1342177792 - je NEAR $L$avx_shortcut - mov rax,rsp - - push rbx - - push rbp - - push r12 - - push r13 - - push r14 - - push r15 - - shl rdx,4 - sub rsp,16*8+4*8 - lea rdx,[rdx*8+rsi] - and rsp,-64 - mov QWORD[((128+0))+rsp],rdi - mov QWORD[((128+8))+rsp],rsi - mov QWORD[((128+16))+rsp],rdx - mov QWORD[152+rsp],rax - -$L$prologue: - - mov rax,QWORD[rdi] - mov rbx,QWORD[8+rdi] - mov rcx,QWORD[16+rdi] - mov rdx,QWORD[24+rdi] - mov r8,QWORD[32+rdi] - mov r9,QWORD[40+rdi] - mov r10,QWORD[48+rdi] - mov r11,QWORD[56+rdi] - jmp NEAR $L$loop - -ALIGN 16 -$L$loop: - mov rdi,rbx - lea rbp,[K512] - xor rdi,rcx - mov r12,QWORD[rsi] - mov r13,r8 - mov r14,rax - bswap r12 - ror r13,23 - mov r15,r9 - - xor r13,r8 - ror r14,5 - xor r15,r10 - - mov QWORD[rsp],r12 - xor r14,rax - and r15,r8 - - ror r13,4 - add r12,r11 - xor r15,r10 - - ror r14,6 - xor r13,r8 - add r12,r15 - - mov r15,rax - add r12,QWORD[rbp] - xor r14,rax - - xor r15,rbx - ror r13,14 - mov r11,rbx - - and rdi,r15 - ror r14,28 - add r12,r13 - - xor r11,rdi - add rdx,r12 - add r11,r12 - - lea rbp,[8+rbp] - add r11,r14 - mov r12,QWORD[8+rsi] - mov r13,rdx - mov r14,r11 - bswap r12 - ror r13,23 - mov rdi,r8 - - xor r13,rdx - ror r14,5 - xor rdi,r9 - - mov QWORD[8+rsp],r12 - xor r14,r11 - and rdi,rdx - - ror r13,4 - add r12,r10 - xor rdi,r9 - - ror r14,6 - xor r13,rdx - add r12,rdi - - mov rdi,r11 - add r12,QWORD[rbp] - xor r14,r11 - - xor rdi,rax - ror r13,14 - mov r10,rax - - and r15,rdi - ror r14,28 - add r12,r13 - - xor r10,r15 - add rcx,r12 - add r10,r12 - - lea rbp,[24+rbp] - add r10,r14 - mov r12,QWORD[16+rsi] - mov r13,rcx - mov r14,r10 - bswap r12 - ror r13,23 - mov r15,rdx - - xor r13,rcx - ror r14,5 - xor r15,r8 - - mov QWORD[16+rsp],r12 - xor r14,r10 - and r15,rcx - - ror r13,4 - add r12,r9 - xor r15,r8 - - ror r14,6 - xor r13,rcx - add r12,r15 - - mov r15,r10 - add r12,QWORD[rbp] - xor r14,r10 - - xor r15,r11 - ror r13,14 - mov r9,r11 - - and rdi,r15 - ror r14,28 - add r12,r13 - - xor r9,rdi - add rbx,r12 - add r9,r12 - - lea rbp,[8+rbp] - add r9,r14 - mov r12,QWORD[24+rsi] - mov r13,rbx - mov r14,r9 - bswap r12 - ror r13,23 - mov rdi,rcx - - xor r13,rbx - ror r14,5 - xor rdi,rdx - - mov QWORD[24+rsp],r12 - xor r14,r9 - and rdi,rbx - - ror r13,4 - add r12,r8 - xor rdi,rdx - - ror r14,6 - xor r13,rbx - add r12,rdi - - mov rdi,r9 - add r12,QWORD[rbp] - xor r14,r9 - - xor rdi,r10 - ror r13,14 - mov r8,r10 - - and r15,rdi - ror r14,28 - add r12,r13 - - xor r8,r15 - add rax,r12 - add r8,r12 - - lea rbp,[24+rbp] - add r8,r14 - mov r12,QWORD[32+rsi] - mov r13,rax - mov r14,r8 - bswap r12 - ror r13,23 - mov r15,rbx - - xor r13,rax - ror r14,5 - xor r15,rcx - - mov QWORD[32+rsp],r12 - xor r14,r8 - and r15,rax - - ror r13,4 - add r12,rdx - xor r15,rcx - - ror r14,6 - xor r13,rax - add r12,r15 - - mov r15,r8 - add r12,QWORD[rbp] - xor r14,r8 - - xor r15,r9 - ror r13,14 - mov rdx,r9 - - and rdi,r15 - ror r14,28 - add r12,r13 - - xor rdx,rdi - add r11,r12 - add rdx,r12 - - lea rbp,[8+rbp] - add rdx,r14 - mov r12,QWORD[40+rsi] - mov r13,r11 - mov r14,rdx - bswap r12 - ror r13,23 - mov rdi,rax - - xor r13,r11 - ror r14,5 - xor rdi,rbx - - mov QWORD[40+rsp],r12 - xor r14,rdx - and rdi,r11 - - ror r13,4 - add r12,rcx - xor rdi,rbx - - ror r14,6 - xor r13,r11 - add r12,rdi - - mov rdi,rdx - add r12,QWORD[rbp] - xor r14,rdx - - xor rdi,r8 - ror r13,14 - mov rcx,r8 - - and r15,rdi - ror r14,28 - add r12,r13 - - xor rcx,r15 - add r10,r12 - add rcx,r12 - - lea rbp,[24+rbp] - add rcx,r14 - mov r12,QWORD[48+rsi] - mov r13,r10 - mov r14,rcx - bswap r12 - ror r13,23 - mov r15,r11 - - xor r13,r10 - ror r14,5 - xor r15,rax - - mov QWORD[48+rsp],r12 - xor r14,rcx - and r15,r10 - - ror r13,4 - add r12,rbx - xor r15,rax - - ror r14,6 - xor r13,r10 - add r12,r15 - - mov r15,rcx - add r12,QWORD[rbp] - xor r14,rcx - - xor r15,rdx - ror r13,14 - mov rbx,rdx - - and rdi,r15 - ror r14,28 - add r12,r13 - - xor rbx,rdi - add r9,r12 - add rbx,r12 - - lea rbp,[8+rbp] - add rbx,r14 - mov r12,QWORD[56+rsi] - mov r13,r9 - mov r14,rbx - bswap r12 - ror r13,23 - mov rdi,r10 - - xor r13,r9 - ror r14,5 - xor rdi,r11 - - mov QWORD[56+rsp],r12 - xor r14,rbx - and rdi,r9 - - ror r13,4 - add r12,rax - xor rdi,r11 - - ror r14,6 - xor r13,r9 - add r12,rdi - - mov rdi,rbx - add r12,QWORD[rbp] - xor r14,rbx - - xor rdi,rcx - ror r13,14 - mov rax,rcx - - and r15,rdi - ror r14,28 - add r12,r13 - - xor rax,r15 - add r8,r12 - add rax,r12 - - lea rbp,[24+rbp] - add rax,r14 - mov r12,QWORD[64+rsi] - mov r13,r8 - mov r14,rax - bswap r12 - ror r13,23 - mov r15,r9 - - xor r13,r8 - ror r14,5 - xor r15,r10 - - mov QWORD[64+rsp],r12 - xor r14,rax - and r15,r8 - - ror r13,4 - add r12,r11 - xor r15,r10 - - ror r14,6 - xor r13,r8 - add r12,r15 - - mov r15,rax - add r12,QWORD[rbp] - xor r14,rax - - xor r15,rbx - ror r13,14 - mov r11,rbx - - and rdi,r15 - ror r14,28 - add r12,r13 - - xor r11,rdi - add rdx,r12 - add r11,r12 - - lea rbp,[8+rbp] - add r11,r14 - mov r12,QWORD[72+rsi] - mov r13,rdx - mov r14,r11 - bswap r12 - ror r13,23 - mov rdi,r8 - - xor r13,rdx - ror r14,5 - xor rdi,r9 - - mov QWORD[72+rsp],r12 - xor r14,r11 - and rdi,rdx - - ror r13,4 - add r12,r10 - xor rdi,r9 - - ror r14,6 - xor r13,rdx - add r12,rdi - - mov rdi,r11 - add r12,QWORD[rbp] - xor r14,r11 - - xor rdi,rax - ror r13,14 - mov r10,rax - - and r15,rdi - ror r14,28 - add r12,r13 - - xor r10,r15 - add rcx,r12 - add r10,r12 - - lea rbp,[24+rbp] - add r10,r14 - mov r12,QWORD[80+rsi] - mov r13,rcx - mov r14,r10 - bswap r12 - ror r13,23 - mov r15,rdx - - xor r13,rcx - ror r14,5 - xor r15,r8 - - mov QWORD[80+rsp],r12 - xor r14,r10 - and r15,rcx - - ror r13,4 - add r12,r9 - xor r15,r8 - - ror r14,6 - xor r13,rcx - add r12,r15 - - mov r15,r10 - add r12,QWORD[rbp] - xor r14,r10 - - xor r15,r11 - ror r13,14 - mov r9,r11 - - and rdi,r15 - ror r14,28 - add r12,r13 - - xor r9,rdi - add rbx,r12 - add r9,r12 - - lea rbp,[8+rbp] - add r9,r14 - mov r12,QWORD[88+rsi] - mov r13,rbx - mov r14,r9 - bswap r12 - ror r13,23 - mov rdi,rcx - - xor r13,rbx - ror r14,5 - xor rdi,rdx - - mov QWORD[88+rsp],r12 - xor r14,r9 - and rdi,rbx - - ror r13,4 - add r12,r8 - xor rdi,rdx - - ror r14,6 - xor r13,rbx - add r12,rdi - - mov rdi,r9 - add r12,QWORD[rbp] - xor r14,r9 - - xor rdi,r10 - ror r13,14 - mov r8,r10 - - and r15,rdi - ror r14,28 - add r12,r13 - - xor r8,r15 - add rax,r12 - add r8,r12 - - lea rbp,[24+rbp] - add r8,r14 - mov r12,QWORD[96+rsi] - mov r13,rax - mov r14,r8 - bswap r12 - ror r13,23 - mov r15,rbx - - xor r13,rax - ror r14,5 - xor r15,rcx - - mov QWORD[96+rsp],r12 - xor r14,r8 - and r15,rax - - ror r13,4 - add r12,rdx - xor r15,rcx - - ror r14,6 - xor r13,rax - add r12,r15 - - mov r15,r8 - add r12,QWORD[rbp] - xor r14,r8 - - xor r15,r9 - ror r13,14 - mov rdx,r9 - - and rdi,r15 - ror r14,28 - add r12,r13 - - xor rdx,rdi - add r11,r12 - add rdx,r12 - - lea rbp,[8+rbp] - add rdx,r14 - mov r12,QWORD[104+rsi] - mov r13,r11 - mov r14,rdx - bswap r12 - ror r13,23 - mov rdi,rax - - xor r13,r11 - ror r14,5 - xor rdi,rbx - - mov QWORD[104+rsp],r12 - xor r14,rdx - and rdi,r11 - - ror r13,4 - add r12,rcx - xor rdi,rbx - - ror r14,6 - xor r13,r11 - add r12,rdi - - mov rdi,rdx - add r12,QWORD[rbp] - xor r14,rdx - - xor rdi,r8 - ror r13,14 - mov rcx,r8 - - and r15,rdi - ror r14,28 - add r12,r13 - - xor rcx,r15 - add r10,r12 - add rcx,r12 - - lea rbp,[24+rbp] - add rcx,r14 - mov r12,QWORD[112+rsi] - mov r13,r10 - mov r14,rcx - bswap r12 - ror r13,23 - mov r15,r11 - - xor r13,r10 - ror r14,5 - xor r15,rax - - mov QWORD[112+rsp],r12 - xor r14,rcx - and r15,r10 - - ror r13,4 - add r12,rbx - xor r15,rax - - ror r14,6 - xor r13,r10 - add r12,r15 - - mov r15,rcx - add r12,QWORD[rbp] - xor r14,rcx - - xor r15,rdx - ror r13,14 - mov rbx,rdx - - and rdi,r15 - ror r14,28 - add r12,r13 - - xor rbx,rdi - add r9,r12 - add rbx,r12 - - lea rbp,[8+rbp] - add rbx,r14 - mov r12,QWORD[120+rsi] - mov r13,r9 - mov r14,rbx - bswap r12 - ror r13,23 - mov rdi,r10 - - xor r13,r9 - ror r14,5 - xor rdi,r11 - - mov QWORD[120+rsp],r12 - xor r14,rbx - and rdi,r9 - - ror r13,4 - add r12,rax - xor rdi,r11 - - ror r14,6 - xor r13,r9 - add r12,rdi - - mov rdi,rbx - add r12,QWORD[rbp] - xor r14,rbx - - xor rdi,rcx - ror r13,14 - mov rax,rcx - - and r15,rdi - ror r14,28 - add r12,r13 - - xor rax,r15 - add r8,r12 - add rax,r12 - - lea rbp,[24+rbp] - jmp NEAR $L$rounds_16_xx -ALIGN 16 -$L$rounds_16_xx: - mov r13,QWORD[8+rsp] - mov r15,QWORD[112+rsp] - - mov r12,r13 - ror r13,7 - add rax,r14 - mov r14,r15 - ror r15,42 - - xor r13,r12 - shr r12,7 - ror r13,1 - xor r15,r14 - shr r14,6 - - ror r15,19 - xor r12,r13 - xor r15,r14 - add r12,QWORD[72+rsp] - - add r12,QWORD[rsp] - mov r13,r8 - add r12,r15 - mov r14,rax - ror r13,23 - mov r15,r9 - - xor r13,r8 - ror r14,5 - xor r15,r10 - - mov QWORD[rsp],r12 - xor r14,rax - and r15,r8 - - ror r13,4 - add r12,r11 - xor r15,r10 - - ror r14,6 - xor r13,r8 - add r12,r15 - - mov r15,rax - add r12,QWORD[rbp] - xor r14,rax - - xor r15,rbx - ror r13,14 - mov r11,rbx - - and rdi,r15 - ror r14,28 - add r12,r13 - - xor r11,rdi - add rdx,r12 - add r11,r12 - - lea rbp,[8+rbp] - mov r13,QWORD[16+rsp] - mov rdi,QWORD[120+rsp] - - mov r12,r13 - ror r13,7 - add r11,r14 - mov r14,rdi - ror rdi,42 - - xor r13,r12 - shr r12,7 - ror r13,1 - xor rdi,r14 - shr r14,6 - - ror rdi,19 - xor r12,r13 - xor rdi,r14 - add r12,QWORD[80+rsp] - - add r12,QWORD[8+rsp] - mov r13,rdx - add r12,rdi - mov r14,r11 - ror r13,23 - mov rdi,r8 - - xor r13,rdx - ror r14,5 - xor rdi,r9 - - mov QWORD[8+rsp],r12 - xor r14,r11 - and rdi,rdx - - ror r13,4 - add r12,r10 - xor rdi,r9 - - ror r14,6 - xor r13,rdx - add r12,rdi - - mov rdi,r11 - add r12,QWORD[rbp] - xor r14,r11 - - xor rdi,rax - ror r13,14 - mov r10,rax - - and r15,rdi - ror r14,28 - add r12,r13 - - xor r10,r15 - add rcx,r12 - add r10,r12 - - lea rbp,[24+rbp] - mov r13,QWORD[24+rsp] - mov r15,QWORD[rsp] - - mov r12,r13 - ror r13,7 - add r10,r14 - mov r14,r15 - ror r15,42 - - xor r13,r12 - shr r12,7 - ror r13,1 - xor r15,r14 - shr r14,6 - - ror r15,19 - xor r12,r13 - xor r15,r14 - add r12,QWORD[88+rsp] - - add r12,QWORD[16+rsp] - mov r13,rcx - add r12,r15 - mov r14,r10 - ror r13,23 - mov r15,rdx - - xor r13,rcx - ror r14,5 - xor r15,r8 - - mov QWORD[16+rsp],r12 - xor r14,r10 - and r15,rcx - - ror r13,4 - add r12,r9 - xor r15,r8 - - ror r14,6 - xor r13,rcx - add r12,r15 - - mov r15,r10 - add r12,QWORD[rbp] - xor r14,r10 - - xor r15,r11 - ror r13,14 - mov r9,r11 - - and rdi,r15 - ror r14,28 - add r12,r13 - - xor r9,rdi - add rbx,r12 - add r9,r12 - - lea rbp,[8+rbp] - mov r13,QWORD[32+rsp] - mov rdi,QWORD[8+rsp] - - mov r12,r13 - ror r13,7 - add r9,r14 - mov r14,rdi - ror rdi,42 - - xor r13,r12 - shr r12,7 - ror r13,1 - xor rdi,r14 - shr r14,6 - - ror rdi,19 - xor r12,r13 - xor rdi,r14 - add r12,QWORD[96+rsp] - - add r12,QWORD[24+rsp] - mov r13,rbx - add r12,rdi - mov r14,r9 - ror r13,23 - mov rdi,rcx - - xor r13,rbx - ror r14,5 - xor rdi,rdx - - mov QWORD[24+rsp],r12 - xor r14,r9 - and rdi,rbx - - ror r13,4 - add r12,r8 - xor rdi,rdx - - ror r14,6 - xor r13,rbx - add r12,rdi - - mov rdi,r9 - add r12,QWORD[rbp] - xor r14,r9 - - xor rdi,r10 - ror r13,14 - mov r8,r10 - - and r15,rdi - ror r14,28 - add r12,r13 - - xor r8,r15 - add rax,r12 - add r8,r12 - - lea rbp,[24+rbp] - mov r13,QWORD[40+rsp] - mov r15,QWORD[16+rsp] - - mov r12,r13 - ror r13,7 - add r8,r14 - mov r14,r15 - ror r15,42 - - xor r13,r12 - shr r12,7 - ror r13,1 - xor r15,r14 - shr r14,6 - - ror r15,19 - xor r12,r13 - xor r15,r14 - add r12,QWORD[104+rsp] - - add r12,QWORD[32+rsp] - mov r13,rax - add r12,r15 - mov r14,r8 - ror r13,23 - mov r15,rbx - - xor r13,rax - ror r14,5 - xor r15,rcx - - mov QWORD[32+rsp],r12 - xor r14,r8 - and r15,rax - - ror r13,4 - add r12,rdx - xor r15,rcx - - ror r14,6 - xor r13,rax - add r12,r15 - - mov r15,r8 - add r12,QWORD[rbp] - xor r14,r8 - - xor r15,r9 - ror r13,14 - mov rdx,r9 - - and rdi,r15 - ror r14,28 - add r12,r13 - - xor rdx,rdi - add r11,r12 - add rdx,r12 - - lea rbp,[8+rbp] - mov r13,QWORD[48+rsp] - mov rdi,QWORD[24+rsp] - - mov r12,r13 - ror r13,7 - add rdx,r14 - mov r14,rdi - ror rdi,42 - - xor r13,r12 - shr r12,7 - ror r13,1 - xor rdi,r14 - shr r14,6 - - ror rdi,19 - xor r12,r13 - xor rdi,r14 - add r12,QWORD[112+rsp] - - add r12,QWORD[40+rsp] - mov r13,r11 - add r12,rdi - mov r14,rdx - ror r13,23 - mov rdi,rax - - xor r13,r11 - ror r14,5 - xor rdi,rbx - - mov QWORD[40+rsp],r12 - xor r14,rdx - and rdi,r11 - - ror r13,4 - add r12,rcx - xor rdi,rbx - - ror r14,6 - xor r13,r11 - add r12,rdi - - mov rdi,rdx - add r12,QWORD[rbp] - xor r14,rdx - - xor rdi,r8 - ror r13,14 - mov rcx,r8 - - and r15,rdi - ror r14,28 - add r12,r13 - - xor rcx,r15 - add r10,r12 - add rcx,r12 - - lea rbp,[24+rbp] - mov r13,QWORD[56+rsp] - mov r15,QWORD[32+rsp] - - mov r12,r13 - ror r13,7 - add rcx,r14 - mov r14,r15 - ror r15,42 - - xor r13,r12 - shr r12,7 - ror r13,1 - xor r15,r14 - shr r14,6 - - ror r15,19 - xor r12,r13 - xor r15,r14 - add r12,QWORD[120+rsp] - - add r12,QWORD[48+rsp] - mov r13,r10 - add r12,r15 - mov r14,rcx - ror r13,23 - mov r15,r11 - - xor r13,r10 - ror r14,5 - xor r15,rax - - mov QWORD[48+rsp],r12 - xor r14,rcx - and r15,r10 - - ror r13,4 - add r12,rbx - xor r15,rax - - ror r14,6 - xor r13,r10 - add r12,r15 - - mov r15,rcx - add r12,QWORD[rbp] - xor r14,rcx - - xor r15,rdx - ror r13,14 - mov rbx,rdx - - and rdi,r15 - ror r14,28 - add r12,r13 - - xor rbx,rdi - add r9,r12 - add rbx,r12 - - lea rbp,[8+rbp] - mov r13,QWORD[64+rsp] - mov rdi,QWORD[40+rsp] - - mov r12,r13 - ror r13,7 - add rbx,r14 - mov r14,rdi - ror rdi,42 - - xor r13,r12 - shr r12,7 - ror r13,1 - xor rdi,r14 - shr r14,6 - - ror rdi,19 - xor r12,r13 - xor rdi,r14 - add r12,QWORD[rsp] - - add r12,QWORD[56+rsp] - mov r13,r9 - add r12,rdi - mov r14,rbx - ror r13,23 - mov rdi,r10 - - xor r13,r9 - ror r14,5 - xor rdi,r11 - - mov QWORD[56+rsp],r12 - xor r14,rbx - and rdi,r9 - - ror r13,4 - add r12,rax - xor rdi,r11 - - ror r14,6 - xor r13,r9 - add r12,rdi - - mov rdi,rbx - add r12,QWORD[rbp] - xor r14,rbx - - xor rdi,rcx - ror r13,14 - mov rax,rcx - - and r15,rdi - ror r14,28 - add r12,r13 - - xor rax,r15 - add r8,r12 - add rax,r12 - - lea rbp,[24+rbp] - mov r13,QWORD[72+rsp] - mov r15,QWORD[48+rsp] - - mov r12,r13 - ror r13,7 - add rax,r14 - mov r14,r15 - ror r15,42 - - xor r13,r12 - shr r12,7 - ror r13,1 - xor r15,r14 - shr r14,6 - - ror r15,19 - xor r12,r13 - xor r15,r14 - add r12,QWORD[8+rsp] - - add r12,QWORD[64+rsp] - mov r13,r8 - add r12,r15 - mov r14,rax - ror r13,23 - mov r15,r9 - - xor r13,r8 - ror r14,5 - xor r15,r10 - - mov QWORD[64+rsp],r12 - xor r14,rax - and r15,r8 - - ror r13,4 - add r12,r11 - xor r15,r10 - - ror r14,6 - xor r13,r8 - add r12,r15 - - mov r15,rax - add r12,QWORD[rbp] - xor r14,rax - - xor r15,rbx - ror r13,14 - mov r11,rbx - - and rdi,r15 - ror r14,28 - add r12,r13 - - xor r11,rdi - add rdx,r12 - add r11,r12 - - lea rbp,[8+rbp] - mov r13,QWORD[80+rsp] - mov rdi,QWORD[56+rsp] - - mov r12,r13 - ror r13,7 - add r11,r14 - mov r14,rdi - ror rdi,42 - - xor r13,r12 - shr r12,7 - ror r13,1 - xor rdi,r14 - shr r14,6 - - ror rdi,19 - xor r12,r13 - xor rdi,r14 - add r12,QWORD[16+rsp] - - add r12,QWORD[72+rsp] - mov r13,rdx - add r12,rdi - mov r14,r11 - ror r13,23 - mov rdi,r8 - - xor r13,rdx - ror r14,5 - xor rdi,r9 - - mov QWORD[72+rsp],r12 - xor r14,r11 - and rdi,rdx - - ror r13,4 - add r12,r10 - xor rdi,r9 - - ror r14,6 - xor r13,rdx - add r12,rdi - - mov rdi,r11 - add r12,QWORD[rbp] - xor r14,r11 - - xor rdi,rax - ror r13,14 - mov r10,rax - - and r15,rdi - ror r14,28 - add r12,r13 - - xor r10,r15 - add rcx,r12 - add r10,r12 - - lea rbp,[24+rbp] - mov r13,QWORD[88+rsp] - mov r15,QWORD[64+rsp] - - mov r12,r13 - ror r13,7 - add r10,r14 - mov r14,r15 - ror r15,42 - - xor r13,r12 - shr r12,7 - ror r13,1 - xor r15,r14 - shr r14,6 - - ror r15,19 - xor r12,r13 - xor r15,r14 - add r12,QWORD[24+rsp] - - add r12,QWORD[80+rsp] - mov r13,rcx - add r12,r15 - mov r14,r10 - ror r13,23 - mov r15,rdx - - xor r13,rcx - ror r14,5 - xor r15,r8 - - mov QWORD[80+rsp],r12 - xor r14,r10 - and r15,rcx - - ror r13,4 - add r12,r9 - xor r15,r8 - - ror r14,6 - xor r13,rcx - add r12,r15 - - mov r15,r10 - add r12,QWORD[rbp] - xor r14,r10 - - xor r15,r11 - ror r13,14 - mov r9,r11 - - and rdi,r15 - ror r14,28 - add r12,r13 - - xor r9,rdi - add rbx,r12 - add r9,r12 - - lea rbp,[8+rbp] - mov r13,QWORD[96+rsp] - mov rdi,QWORD[72+rsp] - - mov r12,r13 - ror r13,7 - add r9,r14 - mov r14,rdi - ror rdi,42 - - xor r13,r12 - shr r12,7 - ror r13,1 - xor rdi,r14 - shr r14,6 - - ror rdi,19 - xor r12,r13 - xor rdi,r14 - add r12,QWORD[32+rsp] - - add r12,QWORD[88+rsp] - mov r13,rbx - add r12,rdi - mov r14,r9 - ror r13,23 - mov rdi,rcx - - xor r13,rbx - ror r14,5 - xor rdi,rdx - - mov QWORD[88+rsp],r12 - xor r14,r9 - and rdi,rbx - - ror r13,4 - add r12,r8 - xor rdi,rdx - - ror r14,6 - xor r13,rbx - add r12,rdi - - mov rdi,r9 - add r12,QWORD[rbp] - xor r14,r9 - - xor rdi,r10 - ror r13,14 - mov r8,r10 - - and r15,rdi - ror r14,28 - add r12,r13 - - xor r8,r15 - add rax,r12 - add r8,r12 - - lea rbp,[24+rbp] - mov r13,QWORD[104+rsp] - mov r15,QWORD[80+rsp] - - mov r12,r13 - ror r13,7 - add r8,r14 - mov r14,r15 - ror r15,42 - - xor r13,r12 - shr r12,7 - ror r13,1 - xor r15,r14 - shr r14,6 - - ror r15,19 - xor r12,r13 - xor r15,r14 - add r12,QWORD[40+rsp] - - add r12,QWORD[96+rsp] - mov r13,rax - add r12,r15 - mov r14,r8 - ror r13,23 - mov r15,rbx - - xor r13,rax - ror r14,5 - xor r15,rcx - - mov QWORD[96+rsp],r12 - xor r14,r8 - and r15,rax - - ror r13,4 - add r12,rdx - xor r15,rcx - - ror r14,6 - xor r13,rax - add r12,r15 - - mov r15,r8 - add r12,QWORD[rbp] - xor r14,r8 - - xor r15,r9 - ror r13,14 - mov rdx,r9 - - and rdi,r15 - ror r14,28 - add r12,r13 - - xor rdx,rdi - add r11,r12 - add rdx,r12 - - lea rbp,[8+rbp] - mov r13,QWORD[112+rsp] - mov rdi,QWORD[88+rsp] - - mov r12,r13 - ror r13,7 - add rdx,r14 - mov r14,rdi - ror rdi,42 - - xor r13,r12 - shr r12,7 - ror r13,1 - xor rdi,r14 - shr r14,6 - - ror rdi,19 - xor r12,r13 - xor rdi,r14 - add r12,QWORD[48+rsp] - - add r12,QWORD[104+rsp] - mov r13,r11 - add r12,rdi - mov r14,rdx - ror r13,23 - mov rdi,rax - - xor r13,r11 - ror r14,5 - xor rdi,rbx - - mov QWORD[104+rsp],r12 - xor r14,rdx - and rdi,r11 - - ror r13,4 - add r12,rcx - xor rdi,rbx - - ror r14,6 - xor r13,r11 - add r12,rdi - - mov rdi,rdx - add r12,QWORD[rbp] - xor r14,rdx - - xor rdi,r8 - ror r13,14 - mov rcx,r8 - - and r15,rdi - ror r14,28 - add r12,r13 - - xor rcx,r15 - add r10,r12 - add rcx,r12 - - lea rbp,[24+rbp] - mov r13,QWORD[120+rsp] - mov r15,QWORD[96+rsp] - - mov r12,r13 - ror r13,7 - add rcx,r14 - mov r14,r15 - ror r15,42 - - xor r13,r12 - shr r12,7 - ror r13,1 - xor r15,r14 - shr r14,6 - - ror r15,19 - xor r12,r13 - xor r15,r14 - add r12,QWORD[56+rsp] - - add r12,QWORD[112+rsp] - mov r13,r10 - add r12,r15 - mov r14,rcx - ror r13,23 - mov r15,r11 - - xor r13,r10 - ror r14,5 - xor r15,rax - - mov QWORD[112+rsp],r12 - xor r14,rcx - and r15,r10 - - ror r13,4 - add r12,rbx - xor r15,rax - - ror r14,6 - xor r13,r10 - add r12,r15 - - mov r15,rcx - add r12,QWORD[rbp] - xor r14,rcx - - xor r15,rdx - ror r13,14 - mov rbx,rdx - - and rdi,r15 - ror r14,28 - add r12,r13 - - xor rbx,rdi - add r9,r12 - add rbx,r12 - - lea rbp,[8+rbp] - mov r13,QWORD[rsp] - mov rdi,QWORD[104+rsp] - - mov r12,r13 - ror r13,7 - add rbx,r14 - mov r14,rdi - ror rdi,42 - - xor r13,r12 - shr r12,7 - ror r13,1 - xor rdi,r14 - shr r14,6 - - ror rdi,19 - xor r12,r13 - xor rdi,r14 - add r12,QWORD[64+rsp] - - add r12,QWORD[120+rsp] - mov r13,r9 - add r12,rdi - mov r14,rbx - ror r13,23 - mov rdi,r10 - - xor r13,r9 - ror r14,5 - xor rdi,r11 - - mov QWORD[120+rsp],r12 - xor r14,rbx - and rdi,r9 - - ror r13,4 - add r12,rax - xor rdi,r11 - - ror r14,6 - xor r13,r9 - add r12,rdi - - mov rdi,rbx - add r12,QWORD[rbp] - xor r14,rbx - - xor rdi,rcx - ror r13,14 - mov rax,rcx - - and r15,rdi - ror r14,28 - add r12,r13 - - xor rax,r15 - add r8,r12 - add rax,r12 - - lea rbp,[24+rbp] - cmp BYTE[7+rbp],0 - jnz NEAR $L$rounds_16_xx - - mov rdi,QWORD[((128+0))+rsp] - add rax,r14 - lea rsi,[128+rsi] - - add rax,QWORD[rdi] - add rbx,QWORD[8+rdi] - add rcx,QWORD[16+rdi] - add rdx,QWORD[24+rdi] - add r8,QWORD[32+rdi] - add r9,QWORD[40+rdi] - add r10,QWORD[48+rdi] - add r11,QWORD[56+rdi] - - cmp rsi,QWORD[((128+16))+rsp] - - mov QWORD[rdi],rax - mov QWORD[8+rdi],rbx - mov QWORD[16+rdi],rcx - mov QWORD[24+rdi],rdx - mov QWORD[32+rdi],r8 - mov QWORD[40+rdi],r9 - mov QWORD[48+rdi],r10 - mov QWORD[56+rdi],r11 - jb NEAR $L$loop - - mov rsi,QWORD[152+rsp] - - mov r15,QWORD[((-48))+rsi] - - mov r14,QWORD[((-40))+rsi] - - mov r13,QWORD[((-32))+rsi] - - mov r12,QWORD[((-24))+rsi] - - mov rbp,QWORD[((-16))+rsi] - - mov rbx,QWORD[((-8))+rsi] - - lea rsp,[rsi] - -$L$epilogue: - mov rdi,QWORD[8+rsp] ;WIN64 epilogue - mov rsi,QWORD[16+rsp] - DB 0F3h,0C3h ;repret - -$L$SEH_end_GFp_sha512_block_data_order: -ALIGN 64 - -K512: - DQ 0x428a2f98d728ae22,0x7137449123ef65cd - DQ 0x428a2f98d728ae22,0x7137449123ef65cd - DQ 0xb5c0fbcfec4d3b2f,0xe9b5dba58189dbbc - DQ 0xb5c0fbcfec4d3b2f,0xe9b5dba58189dbbc - DQ 0x3956c25bf348b538,0x59f111f1b605d019 - DQ 0x3956c25bf348b538,0x59f111f1b605d019 - DQ 0x923f82a4af194f9b,0xab1c5ed5da6d8118 - DQ 0x923f82a4af194f9b,0xab1c5ed5da6d8118 - DQ 0xd807aa98a3030242,0x12835b0145706fbe - DQ 0xd807aa98a3030242,0x12835b0145706fbe - DQ 0x243185be4ee4b28c,0x550c7dc3d5ffb4e2 - DQ 0x243185be4ee4b28c,0x550c7dc3d5ffb4e2 - DQ 0x72be5d74f27b896f,0x80deb1fe3b1696b1 - DQ 0x72be5d74f27b896f,0x80deb1fe3b1696b1 - DQ 0x9bdc06a725c71235,0xc19bf174cf692694 - DQ 0x9bdc06a725c71235,0xc19bf174cf692694 - DQ 0xe49b69c19ef14ad2,0xefbe4786384f25e3 - DQ 0xe49b69c19ef14ad2,0xefbe4786384f25e3 - DQ 0x0fc19dc68b8cd5b5,0x240ca1cc77ac9c65 - DQ 0x0fc19dc68b8cd5b5,0x240ca1cc77ac9c65 - DQ 0x2de92c6f592b0275,0x4a7484aa6ea6e483 - DQ 0x2de92c6f592b0275,0x4a7484aa6ea6e483 - DQ 0x5cb0a9dcbd41fbd4,0x76f988da831153b5 - DQ 0x5cb0a9dcbd41fbd4,0x76f988da831153b5 - DQ 0x983e5152ee66dfab,0xa831c66d2db43210 - DQ 0x983e5152ee66dfab,0xa831c66d2db43210 - DQ 0xb00327c898fb213f,0xbf597fc7beef0ee4 - DQ 0xb00327c898fb213f,0xbf597fc7beef0ee4 - DQ 0xc6e00bf33da88fc2,0xd5a79147930aa725 - DQ 0xc6e00bf33da88fc2,0xd5a79147930aa725 - DQ 0x06ca6351e003826f,0x142929670a0e6e70 - DQ 0x06ca6351e003826f,0x142929670a0e6e70 - DQ 0x27b70a8546d22ffc,0x2e1b21385c26c926 - DQ 0x27b70a8546d22ffc,0x2e1b21385c26c926 - DQ 0x4d2c6dfc5ac42aed,0x53380d139d95b3df - DQ 0x4d2c6dfc5ac42aed,0x53380d139d95b3df - DQ 0x650a73548baf63de,0x766a0abb3c77b2a8 - DQ 0x650a73548baf63de,0x766a0abb3c77b2a8 - DQ 0x81c2c92e47edaee6,0x92722c851482353b - DQ 0x81c2c92e47edaee6,0x92722c851482353b - DQ 0xa2bfe8a14cf10364,0xa81a664bbc423001 - DQ 0xa2bfe8a14cf10364,0xa81a664bbc423001 - DQ 0xc24b8b70d0f89791,0xc76c51a30654be30 - DQ 0xc24b8b70d0f89791,0xc76c51a30654be30 - DQ 0xd192e819d6ef5218,0xd69906245565a910 - DQ 0xd192e819d6ef5218,0xd69906245565a910 - DQ 0xf40e35855771202a,0x106aa07032bbd1b8 - DQ 0xf40e35855771202a,0x106aa07032bbd1b8 - DQ 0x19a4c116b8d2d0c8,0x1e376c085141ab53 - DQ 0x19a4c116b8d2d0c8,0x1e376c085141ab53 - DQ 0x2748774cdf8eeb99,0x34b0bcb5e19b48a8 - DQ 0x2748774cdf8eeb99,0x34b0bcb5e19b48a8 - DQ 0x391c0cb3c5c95a63,0x4ed8aa4ae3418acb - DQ 0x391c0cb3c5c95a63,0x4ed8aa4ae3418acb - DQ 0x5b9cca4f7763e373,0x682e6ff3d6b2b8a3 - DQ 0x5b9cca4f7763e373,0x682e6ff3d6b2b8a3 - DQ 0x748f82ee5defb2fc,0x78a5636f43172f60 - DQ 0x748f82ee5defb2fc,0x78a5636f43172f60 - DQ 0x84c87814a1f0ab72,0x8cc702081a6439ec - DQ 0x84c87814a1f0ab72,0x8cc702081a6439ec - DQ 0x90befffa23631e28,0xa4506cebde82bde9 - DQ 0x90befffa23631e28,0xa4506cebde82bde9 - DQ 0xbef9a3f7b2c67915,0xc67178f2e372532b - DQ 0xbef9a3f7b2c67915,0xc67178f2e372532b - DQ 0xca273eceea26619c,0xd186b8c721c0c207 - DQ 0xca273eceea26619c,0xd186b8c721c0c207 - DQ 0xeada7dd6cde0eb1e,0xf57d4f7fee6ed178 - DQ 0xeada7dd6cde0eb1e,0xf57d4f7fee6ed178 - DQ 0x06f067aa72176fba,0x0a637dc5a2c898a6 - DQ 0x06f067aa72176fba,0x0a637dc5a2c898a6 - DQ 0x113f9804bef90dae,0x1b710b35131c471b - DQ 0x113f9804bef90dae,0x1b710b35131c471b - DQ 0x28db77f523047d84,0x32caab7b40c72493 - DQ 0x28db77f523047d84,0x32caab7b40c72493 - DQ 0x3c9ebe0a15c9bebc,0x431d67c49c100d4c - DQ 0x3c9ebe0a15c9bebc,0x431d67c49c100d4c - DQ 0x4cc5d4becb3e42b6,0x597f299cfc657e2a - DQ 0x4cc5d4becb3e42b6,0x597f299cfc657e2a - DQ 0x5fcb6fab3ad6faec,0x6c44198c4a475817 - DQ 0x5fcb6fab3ad6faec,0x6c44198c4a475817 - - DQ 0x0001020304050607,0x08090a0b0c0d0e0f - DQ 0x0001020304050607,0x08090a0b0c0d0e0f -DB 83,72,65,53,49,50,32,98,108,111,99,107,32,116,114,97 -DB 110,115,102,111,114,109,32,102,111,114,32,120,56,54,95,54 -DB 52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121 -DB 32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46 -DB 111,114,103,62,0 - -ALIGN 64 -GFp_sha512_block_data_order_avx: - mov QWORD[8+rsp],rdi ;WIN64 prologue - mov QWORD[16+rsp],rsi - mov rax,rsp -$L$SEH_begin_GFp_sha512_block_data_order_avx: - mov rdi,rcx - mov rsi,rdx - mov rdx,r8 - - - -$L$avx_shortcut: - mov rax,rsp - - push rbx - - push rbp - - push r12 - - push r13 - - push r14 - - push r15 - - shl rdx,4 - sub rsp,256 - lea rdx,[rdx*8+rsi] - and rsp,-64 - mov QWORD[((128+0))+rsp],rdi - mov QWORD[((128+8))+rsp],rsi - mov QWORD[((128+16))+rsp],rdx - mov QWORD[152+rsp],rax - - movaps XMMWORD[(128+32)+rsp],xmm6 - movaps XMMWORD[(128+48)+rsp],xmm7 - movaps XMMWORD[(128+64)+rsp],xmm8 - movaps XMMWORD[(128+80)+rsp],xmm9 - movaps XMMWORD[(128+96)+rsp],xmm10 - movaps XMMWORD[(128+112)+rsp],xmm11 -$L$prologue_avx: - - vzeroupper - mov rax,QWORD[rdi] - mov rbx,QWORD[8+rdi] - mov rcx,QWORD[16+rdi] - mov rdx,QWORD[24+rdi] - mov r8,QWORD[32+rdi] - mov r9,QWORD[40+rdi] - mov r10,QWORD[48+rdi] - mov r11,QWORD[56+rdi] - jmp NEAR $L$loop_avx -ALIGN 16 -$L$loop_avx: - vmovdqa xmm11,XMMWORD[((K512+1280))] - vmovdqu xmm0,XMMWORD[rsi] - lea rbp,[((K512+128))] - vmovdqu xmm1,XMMWORD[16+rsi] - vmovdqu xmm2,XMMWORD[32+rsi] - vpshufb xmm0,xmm0,xmm11 - vmovdqu xmm3,XMMWORD[48+rsi] - vpshufb xmm1,xmm1,xmm11 - vmovdqu xmm4,XMMWORD[64+rsi] - vpshufb xmm2,xmm2,xmm11 - vmovdqu xmm5,XMMWORD[80+rsi] - vpshufb xmm3,xmm3,xmm11 - vmovdqu xmm6,XMMWORD[96+rsi] - vpshufb xmm4,xmm4,xmm11 - vmovdqu xmm7,XMMWORD[112+rsi] - vpshufb xmm5,xmm5,xmm11 - vpaddq xmm8,xmm0,XMMWORD[((-128))+rbp] - vpshufb xmm6,xmm6,xmm11 - vpaddq xmm9,xmm1,XMMWORD[((-96))+rbp] - vpshufb xmm7,xmm7,xmm11 - vpaddq xmm10,xmm2,XMMWORD[((-64))+rbp] - vpaddq xmm11,xmm3,XMMWORD[((-32))+rbp] - vmovdqa XMMWORD[rsp],xmm8 - vpaddq xmm8,xmm4,XMMWORD[rbp] - vmovdqa XMMWORD[16+rsp],xmm9 - vpaddq xmm9,xmm5,XMMWORD[32+rbp] - vmovdqa XMMWORD[32+rsp],xmm10 - vpaddq xmm10,xmm6,XMMWORD[64+rbp] - vmovdqa XMMWORD[48+rsp],xmm11 - vpaddq xmm11,xmm7,XMMWORD[96+rbp] - vmovdqa XMMWORD[64+rsp],xmm8 - mov r14,rax - vmovdqa XMMWORD[80+rsp],xmm9 - mov rdi,rbx - vmovdqa XMMWORD[96+rsp],xmm10 - xor rdi,rcx - vmovdqa XMMWORD[112+rsp],xmm11 - mov r13,r8 - jmp NEAR $L$avx_00_47 - -ALIGN 16 -$L$avx_00_47: - add rbp,256 - vpalignr xmm8,xmm1,xmm0,8 - shrd r13,r13,23 - mov rax,r14 - vpalignr xmm11,xmm5,xmm4,8 - mov r12,r9 - shrd r14,r14,5 - vpsrlq xmm10,xmm8,1 - xor r13,r8 - xor r12,r10 - vpaddq xmm0,xmm0,xmm11 - shrd r13,r13,4 - xor r14,rax - vpsrlq xmm11,xmm8,7 - and r12,r8 - xor r13,r8 - vpsllq xmm9,xmm8,56 - add r11,QWORD[rsp] - mov r15,rax - vpxor xmm8,xmm11,xmm10 - xor r12,r10 - shrd r14,r14,6 - vpsrlq xmm10,xmm10,7 - xor r15,rbx - add r11,r12 - vpxor xmm8,xmm8,xmm9 - shrd r13,r13,14 - and rdi,r15 - vpsllq xmm9,xmm9,7 - xor r14,rax - add r11,r13 - vpxor xmm8,xmm8,xmm10 - xor rdi,rbx - shrd r14,r14,28 - vpsrlq xmm11,xmm7,6 - add rdx,r11 - add r11,rdi - vpxor xmm8,xmm8,xmm9 - mov r13,rdx - add r14,r11 - vpsllq xmm10,xmm7,3 - shrd r13,r13,23 - mov r11,r14 - vpaddq xmm0,xmm0,xmm8 - mov r12,r8 - shrd r14,r14,5 - vpsrlq xmm9,xmm7,19 - xor r13,rdx - xor r12,r9 - vpxor xmm11,xmm11,xmm10 - shrd r13,r13,4 - xor r14,r11 - vpsllq xmm10,xmm10,42 - and r12,rdx - xor r13,rdx - vpxor xmm11,xmm11,xmm9 - add r10,QWORD[8+rsp] - mov rdi,r11 - vpsrlq xmm9,xmm9,42 - xor r12,r9 - shrd r14,r14,6 - vpxor xmm11,xmm11,xmm10 - xor rdi,rax - add r10,r12 - vpxor xmm11,xmm11,xmm9 - shrd r13,r13,14 - and r15,rdi - vpaddq xmm0,xmm0,xmm11 - xor r14,r11 - add r10,r13 - vpaddq xmm10,xmm0,XMMWORD[((-128))+rbp] - xor r15,rax - shrd r14,r14,28 - add rcx,r10 - add r10,r15 - mov r13,rcx - add r14,r10 - vmovdqa XMMWORD[rsp],xmm10 - vpalignr xmm8,xmm2,xmm1,8 - shrd r13,r13,23 - mov r10,r14 - vpalignr xmm11,xmm6,xmm5,8 - mov r12,rdx - shrd r14,r14,5 - vpsrlq xmm10,xmm8,1 - xor r13,rcx - xor r12,r8 - vpaddq xmm1,xmm1,xmm11 - shrd r13,r13,4 - xor r14,r10 - vpsrlq xmm11,xmm8,7 - and r12,rcx - xor r13,rcx - vpsllq xmm9,xmm8,56 - add r9,QWORD[16+rsp] - mov r15,r10 - vpxor xmm8,xmm11,xmm10 - xor r12,r8 - shrd r14,r14,6 - vpsrlq xmm10,xmm10,7 - xor r15,r11 - add r9,r12 - vpxor xmm8,xmm8,xmm9 - shrd r13,r13,14 - and rdi,r15 - vpsllq xmm9,xmm9,7 - xor r14,r10 - add r9,r13 - vpxor xmm8,xmm8,xmm10 - xor rdi,r11 - shrd r14,r14,28 - vpsrlq xmm11,xmm0,6 - add rbx,r9 - add r9,rdi - vpxor xmm8,xmm8,xmm9 - mov r13,rbx - add r14,r9 - vpsllq xmm10,xmm0,3 - shrd r13,r13,23 - mov r9,r14 - vpaddq xmm1,xmm1,xmm8 - mov r12,rcx - shrd r14,r14,5 - vpsrlq xmm9,xmm0,19 - xor r13,rbx - xor r12,rdx - vpxor xmm11,xmm11,xmm10 - shrd r13,r13,4 - xor r14,r9 - vpsllq xmm10,xmm10,42 - and r12,rbx - xor r13,rbx - vpxor xmm11,xmm11,xmm9 - add r8,QWORD[24+rsp] - mov rdi,r9 - vpsrlq xmm9,xmm9,42 - xor r12,rdx - shrd r14,r14,6 - vpxor xmm11,xmm11,xmm10 - xor rdi,r10 - add r8,r12 - vpxor xmm11,xmm11,xmm9 - shrd r13,r13,14 - and r15,rdi - vpaddq xmm1,xmm1,xmm11 - xor r14,r9 - add r8,r13 - vpaddq xmm10,xmm1,XMMWORD[((-96))+rbp] - xor r15,r10 - shrd r14,r14,28 - add rax,r8 - add r8,r15 - mov r13,rax - add r14,r8 - vmovdqa XMMWORD[16+rsp],xmm10 - vpalignr xmm8,xmm3,xmm2,8 - shrd r13,r13,23 - mov r8,r14 - vpalignr xmm11,xmm7,xmm6,8 - mov r12,rbx - shrd r14,r14,5 - vpsrlq xmm10,xmm8,1 - xor r13,rax - xor r12,rcx - vpaddq xmm2,xmm2,xmm11 - shrd r13,r13,4 - xor r14,r8 - vpsrlq xmm11,xmm8,7 - and r12,rax - xor r13,rax - vpsllq xmm9,xmm8,56 - add rdx,QWORD[32+rsp] - mov r15,r8 - vpxor xmm8,xmm11,xmm10 - xor r12,rcx - shrd r14,r14,6 - vpsrlq xmm10,xmm10,7 - xor r15,r9 - add rdx,r12 - vpxor xmm8,xmm8,xmm9 - shrd r13,r13,14 - and rdi,r15 - vpsllq xmm9,xmm9,7 - xor r14,r8 - add rdx,r13 - vpxor xmm8,xmm8,xmm10 - xor rdi,r9 - shrd r14,r14,28 - vpsrlq xmm11,xmm1,6 - add r11,rdx - add rdx,rdi - vpxor xmm8,xmm8,xmm9 - mov r13,r11 - add r14,rdx - vpsllq xmm10,xmm1,3 - shrd r13,r13,23 - mov rdx,r14 - vpaddq xmm2,xmm2,xmm8 - mov r12,rax - shrd r14,r14,5 - vpsrlq xmm9,xmm1,19 - xor r13,r11 - xor r12,rbx - vpxor xmm11,xmm11,xmm10 - shrd r13,r13,4 - xor r14,rdx - vpsllq xmm10,xmm10,42 - and r12,r11 - xor r13,r11 - vpxor xmm11,xmm11,xmm9 - add rcx,QWORD[40+rsp] - mov rdi,rdx - vpsrlq xmm9,xmm9,42 - xor r12,rbx - shrd r14,r14,6 - vpxor xmm11,xmm11,xmm10 - xor rdi,r8 - add rcx,r12 - vpxor xmm11,xmm11,xmm9 - shrd r13,r13,14 - and r15,rdi - vpaddq xmm2,xmm2,xmm11 - xor r14,rdx - add rcx,r13 - vpaddq xmm10,xmm2,XMMWORD[((-64))+rbp] - xor r15,r8 - shrd r14,r14,28 - add r10,rcx - add rcx,r15 - mov r13,r10 - add r14,rcx - vmovdqa XMMWORD[32+rsp],xmm10 - vpalignr xmm8,xmm4,xmm3,8 - shrd r13,r13,23 - mov rcx,r14 - vpalignr xmm11,xmm0,xmm7,8 - mov r12,r11 - shrd r14,r14,5 - vpsrlq xmm10,xmm8,1 - xor r13,r10 - xor r12,rax - vpaddq xmm3,xmm3,xmm11 - shrd r13,r13,4 - xor r14,rcx - vpsrlq xmm11,xmm8,7 - and r12,r10 - xor r13,r10 - vpsllq xmm9,xmm8,56 - add rbx,QWORD[48+rsp] - mov r15,rcx - vpxor xmm8,xmm11,xmm10 - xor r12,rax - shrd r14,r14,6 - vpsrlq xmm10,xmm10,7 - xor r15,rdx - add rbx,r12 - vpxor xmm8,xmm8,xmm9 - shrd r13,r13,14 - and rdi,r15 - vpsllq xmm9,xmm9,7 - xor r14,rcx - add rbx,r13 - vpxor xmm8,xmm8,xmm10 - xor rdi,rdx - shrd r14,r14,28 - vpsrlq xmm11,xmm2,6 - add r9,rbx - add rbx,rdi - vpxor xmm8,xmm8,xmm9 - mov r13,r9 - add r14,rbx - vpsllq xmm10,xmm2,3 - shrd r13,r13,23 - mov rbx,r14 - vpaddq xmm3,xmm3,xmm8 - mov r12,r10 - shrd r14,r14,5 - vpsrlq xmm9,xmm2,19 - xor r13,r9 - xor r12,r11 - vpxor xmm11,xmm11,xmm10 - shrd r13,r13,4 - xor r14,rbx - vpsllq xmm10,xmm10,42 - and r12,r9 - xor r13,r9 - vpxor xmm11,xmm11,xmm9 - add rax,QWORD[56+rsp] - mov rdi,rbx - vpsrlq xmm9,xmm9,42 - xor r12,r11 - shrd r14,r14,6 - vpxor xmm11,xmm11,xmm10 - xor rdi,rcx - add rax,r12 - vpxor xmm11,xmm11,xmm9 - shrd r13,r13,14 - and r15,rdi - vpaddq xmm3,xmm3,xmm11 - xor r14,rbx - add rax,r13 - vpaddq xmm10,xmm3,XMMWORD[((-32))+rbp] - xor r15,rcx - shrd r14,r14,28 - add r8,rax - add rax,r15 - mov r13,r8 - add r14,rax - vmovdqa XMMWORD[48+rsp],xmm10 - vpalignr xmm8,xmm5,xmm4,8 - shrd r13,r13,23 - mov rax,r14 - vpalignr xmm11,xmm1,xmm0,8 - mov r12,r9 - shrd r14,r14,5 - vpsrlq xmm10,xmm8,1 - xor r13,r8 - xor r12,r10 - vpaddq xmm4,xmm4,xmm11 - shrd r13,r13,4 - xor r14,rax - vpsrlq xmm11,xmm8,7 - and r12,r8 - xor r13,r8 - vpsllq xmm9,xmm8,56 - add r11,QWORD[64+rsp] - mov r15,rax - vpxor xmm8,xmm11,xmm10 - xor r12,r10 - shrd r14,r14,6 - vpsrlq xmm10,xmm10,7 - xor r15,rbx - add r11,r12 - vpxor xmm8,xmm8,xmm9 - shrd r13,r13,14 - and rdi,r15 - vpsllq xmm9,xmm9,7 - xor r14,rax - add r11,r13 - vpxor xmm8,xmm8,xmm10 - xor rdi,rbx - shrd r14,r14,28 - vpsrlq xmm11,xmm3,6 - add rdx,r11 - add r11,rdi - vpxor xmm8,xmm8,xmm9 - mov r13,rdx - add r14,r11 - vpsllq xmm10,xmm3,3 - shrd r13,r13,23 - mov r11,r14 - vpaddq xmm4,xmm4,xmm8 - mov r12,r8 - shrd r14,r14,5 - vpsrlq xmm9,xmm3,19 - xor r13,rdx - xor r12,r9 - vpxor xmm11,xmm11,xmm10 - shrd r13,r13,4 - xor r14,r11 - vpsllq xmm10,xmm10,42 - and r12,rdx - xor r13,rdx - vpxor xmm11,xmm11,xmm9 - add r10,QWORD[72+rsp] - mov rdi,r11 - vpsrlq xmm9,xmm9,42 - xor r12,r9 - shrd r14,r14,6 - vpxor xmm11,xmm11,xmm10 - xor rdi,rax - add r10,r12 - vpxor xmm11,xmm11,xmm9 - shrd r13,r13,14 - and r15,rdi - vpaddq xmm4,xmm4,xmm11 - xor r14,r11 - add r10,r13 - vpaddq xmm10,xmm4,XMMWORD[rbp] - xor r15,rax - shrd r14,r14,28 - add rcx,r10 - add r10,r15 - mov r13,rcx - add r14,r10 - vmovdqa XMMWORD[64+rsp],xmm10 - vpalignr xmm8,xmm6,xmm5,8 - shrd r13,r13,23 - mov r10,r14 - vpalignr xmm11,xmm2,xmm1,8 - mov r12,rdx - shrd r14,r14,5 - vpsrlq xmm10,xmm8,1 - xor r13,rcx - xor r12,r8 - vpaddq xmm5,xmm5,xmm11 - shrd r13,r13,4 - xor r14,r10 - vpsrlq xmm11,xmm8,7 - and r12,rcx - xor r13,rcx - vpsllq xmm9,xmm8,56 - add r9,QWORD[80+rsp] - mov r15,r10 - vpxor xmm8,xmm11,xmm10 - xor r12,r8 - shrd r14,r14,6 - vpsrlq xmm10,xmm10,7 - xor r15,r11 - add r9,r12 - vpxor xmm8,xmm8,xmm9 - shrd r13,r13,14 - and rdi,r15 - vpsllq xmm9,xmm9,7 - xor r14,r10 - add r9,r13 - vpxor xmm8,xmm8,xmm10 - xor rdi,r11 - shrd r14,r14,28 - vpsrlq xmm11,xmm4,6 - add rbx,r9 - add r9,rdi - vpxor xmm8,xmm8,xmm9 - mov r13,rbx - add r14,r9 - vpsllq xmm10,xmm4,3 - shrd r13,r13,23 - mov r9,r14 - vpaddq xmm5,xmm5,xmm8 - mov r12,rcx - shrd r14,r14,5 - vpsrlq xmm9,xmm4,19 - xor r13,rbx - xor r12,rdx - vpxor xmm11,xmm11,xmm10 - shrd r13,r13,4 - xor r14,r9 - vpsllq xmm10,xmm10,42 - and r12,rbx - xor r13,rbx - vpxor xmm11,xmm11,xmm9 - add r8,QWORD[88+rsp] - mov rdi,r9 - vpsrlq xmm9,xmm9,42 - xor r12,rdx - shrd r14,r14,6 - vpxor xmm11,xmm11,xmm10 - xor rdi,r10 - add r8,r12 - vpxor xmm11,xmm11,xmm9 - shrd r13,r13,14 - and r15,rdi - vpaddq xmm5,xmm5,xmm11 - xor r14,r9 - add r8,r13 - vpaddq xmm10,xmm5,XMMWORD[32+rbp] - xor r15,r10 - shrd r14,r14,28 - add rax,r8 - add r8,r15 - mov r13,rax - add r14,r8 - vmovdqa XMMWORD[80+rsp],xmm10 - vpalignr xmm8,xmm7,xmm6,8 - shrd r13,r13,23 - mov r8,r14 - vpalignr xmm11,xmm3,xmm2,8 - mov r12,rbx - shrd r14,r14,5 - vpsrlq xmm10,xmm8,1 - xor r13,rax - xor r12,rcx - vpaddq xmm6,xmm6,xmm11 - shrd r13,r13,4 - xor r14,r8 - vpsrlq xmm11,xmm8,7 - and r12,rax - xor r13,rax - vpsllq xmm9,xmm8,56 - add rdx,QWORD[96+rsp] - mov r15,r8 - vpxor xmm8,xmm11,xmm10 - xor r12,rcx - shrd r14,r14,6 - vpsrlq xmm10,xmm10,7 - xor r15,r9 - add rdx,r12 - vpxor xmm8,xmm8,xmm9 - shrd r13,r13,14 - and rdi,r15 - vpsllq xmm9,xmm9,7 - xor r14,r8 - add rdx,r13 - vpxor xmm8,xmm8,xmm10 - xor rdi,r9 - shrd r14,r14,28 - vpsrlq xmm11,xmm5,6 - add r11,rdx - add rdx,rdi - vpxor xmm8,xmm8,xmm9 - mov r13,r11 - add r14,rdx - vpsllq xmm10,xmm5,3 - shrd r13,r13,23 - mov rdx,r14 - vpaddq xmm6,xmm6,xmm8 - mov r12,rax - shrd r14,r14,5 - vpsrlq xmm9,xmm5,19 - xor r13,r11 - xor r12,rbx - vpxor xmm11,xmm11,xmm10 - shrd r13,r13,4 - xor r14,rdx - vpsllq xmm10,xmm10,42 - and r12,r11 - xor r13,r11 - vpxor xmm11,xmm11,xmm9 - add rcx,QWORD[104+rsp] - mov rdi,rdx - vpsrlq xmm9,xmm9,42 - xor r12,rbx - shrd r14,r14,6 - vpxor xmm11,xmm11,xmm10 - xor rdi,r8 - add rcx,r12 - vpxor xmm11,xmm11,xmm9 - shrd r13,r13,14 - and r15,rdi - vpaddq xmm6,xmm6,xmm11 - xor r14,rdx - add rcx,r13 - vpaddq xmm10,xmm6,XMMWORD[64+rbp] - xor r15,r8 - shrd r14,r14,28 - add r10,rcx - add rcx,r15 - mov r13,r10 - add r14,rcx - vmovdqa XMMWORD[96+rsp],xmm10 - vpalignr xmm8,xmm0,xmm7,8 - shrd r13,r13,23 - mov rcx,r14 - vpalignr xmm11,xmm4,xmm3,8 - mov r12,r11 - shrd r14,r14,5 - vpsrlq xmm10,xmm8,1 - xor r13,r10 - xor r12,rax - vpaddq xmm7,xmm7,xmm11 - shrd r13,r13,4 - xor r14,rcx - vpsrlq xmm11,xmm8,7 - and r12,r10 - xor r13,r10 - vpsllq xmm9,xmm8,56 - add rbx,QWORD[112+rsp] - mov r15,rcx - vpxor xmm8,xmm11,xmm10 - xor r12,rax - shrd r14,r14,6 - vpsrlq xmm10,xmm10,7 - xor r15,rdx - add rbx,r12 - vpxor xmm8,xmm8,xmm9 - shrd r13,r13,14 - and rdi,r15 - vpsllq xmm9,xmm9,7 - xor r14,rcx - add rbx,r13 - vpxor xmm8,xmm8,xmm10 - xor rdi,rdx - shrd r14,r14,28 - vpsrlq xmm11,xmm6,6 - add r9,rbx - add rbx,rdi - vpxor xmm8,xmm8,xmm9 - mov r13,r9 - add r14,rbx - vpsllq xmm10,xmm6,3 - shrd r13,r13,23 - mov rbx,r14 - vpaddq xmm7,xmm7,xmm8 - mov r12,r10 - shrd r14,r14,5 - vpsrlq xmm9,xmm6,19 - xor r13,r9 - xor r12,r11 - vpxor xmm11,xmm11,xmm10 - shrd r13,r13,4 - xor r14,rbx - vpsllq xmm10,xmm10,42 - and r12,r9 - xor r13,r9 - vpxor xmm11,xmm11,xmm9 - add rax,QWORD[120+rsp] - mov rdi,rbx - vpsrlq xmm9,xmm9,42 - xor r12,r11 - shrd r14,r14,6 - vpxor xmm11,xmm11,xmm10 - xor rdi,rcx - add rax,r12 - vpxor xmm11,xmm11,xmm9 - shrd r13,r13,14 - and r15,rdi - vpaddq xmm7,xmm7,xmm11 - xor r14,rbx - add rax,r13 - vpaddq xmm10,xmm7,XMMWORD[96+rbp] - xor r15,rcx - shrd r14,r14,28 - add r8,rax - add rax,r15 - mov r13,r8 - add r14,rax - vmovdqa XMMWORD[112+rsp],xmm10 - cmp BYTE[135+rbp],0 - jne NEAR $L$avx_00_47 - shrd r13,r13,23 - mov rax,r14 - mov r12,r9 - shrd r14,r14,5 - xor r13,r8 - xor r12,r10 - shrd r13,r13,4 - xor r14,rax - and r12,r8 - xor r13,r8 - add r11,QWORD[rsp] - mov r15,rax - xor r12,r10 - shrd r14,r14,6 - xor r15,rbx - add r11,r12 - shrd r13,r13,14 - and rdi,r15 - xor r14,rax - add r11,r13 - xor rdi,rbx - shrd r14,r14,28 - add rdx,r11 - add r11,rdi - mov r13,rdx - add r14,r11 - shrd r13,r13,23 - mov r11,r14 - mov r12,r8 - shrd r14,r14,5 - xor r13,rdx - xor r12,r9 - shrd r13,r13,4 - xor r14,r11 - and r12,rdx - xor r13,rdx - add r10,QWORD[8+rsp] - mov rdi,r11 - xor r12,r9 - shrd r14,r14,6 - xor rdi,rax - add r10,r12 - shrd r13,r13,14 - and r15,rdi - xor r14,r11 - add r10,r13 - xor r15,rax - shrd r14,r14,28 - add rcx,r10 - add r10,r15 - mov r13,rcx - add r14,r10 - shrd r13,r13,23 - mov r10,r14 - mov r12,rdx - shrd r14,r14,5 - xor r13,rcx - xor r12,r8 - shrd r13,r13,4 - xor r14,r10 - and r12,rcx - xor r13,rcx - add r9,QWORD[16+rsp] - mov r15,r10 - xor r12,r8 - shrd r14,r14,6 - xor r15,r11 - add r9,r12 - shrd r13,r13,14 - and rdi,r15 - xor r14,r10 - add r9,r13 - xor rdi,r11 - shrd r14,r14,28 - add rbx,r9 - add r9,rdi - mov r13,rbx - add r14,r9 - shrd r13,r13,23 - mov r9,r14 - mov r12,rcx - shrd r14,r14,5 - xor r13,rbx - xor r12,rdx - shrd r13,r13,4 - xor r14,r9 - and r12,rbx - xor r13,rbx - add r8,QWORD[24+rsp] - mov rdi,r9 - xor r12,rdx - shrd r14,r14,6 - xor rdi,r10 - add r8,r12 - shrd r13,r13,14 - and r15,rdi - xor r14,r9 - add r8,r13 - xor r15,r10 - shrd r14,r14,28 - add rax,r8 - add r8,r15 - mov r13,rax - add r14,r8 - shrd r13,r13,23 - mov r8,r14 - mov r12,rbx - shrd r14,r14,5 - xor r13,rax - xor r12,rcx - shrd r13,r13,4 - xor r14,r8 - and r12,rax - xor r13,rax - add rdx,QWORD[32+rsp] - mov r15,r8 - xor r12,rcx - shrd r14,r14,6 - xor r15,r9 - add rdx,r12 - shrd r13,r13,14 - and rdi,r15 - xor r14,r8 - add rdx,r13 - xor rdi,r9 - shrd r14,r14,28 - add r11,rdx - add rdx,rdi - mov r13,r11 - add r14,rdx - shrd r13,r13,23 - mov rdx,r14 - mov r12,rax - shrd r14,r14,5 - xor r13,r11 - xor r12,rbx - shrd r13,r13,4 - xor r14,rdx - and r12,r11 - xor r13,r11 - add rcx,QWORD[40+rsp] - mov rdi,rdx - xor r12,rbx - shrd r14,r14,6 - xor rdi,r8 - add rcx,r12 - shrd r13,r13,14 - and r15,rdi - xor r14,rdx - add rcx,r13 - xor r15,r8 - shrd r14,r14,28 - add r10,rcx - add rcx,r15 - mov r13,r10 - add r14,rcx - shrd r13,r13,23 - mov rcx,r14 - mov r12,r11 - shrd r14,r14,5 - xor r13,r10 - xor r12,rax - shrd r13,r13,4 - xor r14,rcx - and r12,r10 - xor r13,r10 - add rbx,QWORD[48+rsp] - mov r15,rcx - xor r12,rax - shrd r14,r14,6 - xor r15,rdx - add rbx,r12 - shrd r13,r13,14 - and rdi,r15 - xor r14,rcx - add rbx,r13 - xor rdi,rdx - shrd r14,r14,28 - add r9,rbx - add rbx,rdi - mov r13,r9 - add r14,rbx - shrd r13,r13,23 - mov rbx,r14 - mov r12,r10 - shrd r14,r14,5 - xor r13,r9 - xor r12,r11 - shrd r13,r13,4 - xor r14,rbx - and r12,r9 - xor r13,r9 - add rax,QWORD[56+rsp] - mov rdi,rbx - xor r12,r11 - shrd r14,r14,6 - xor rdi,rcx - add rax,r12 - shrd r13,r13,14 - and r15,rdi - xor r14,rbx - add rax,r13 - xor r15,rcx - shrd r14,r14,28 - add r8,rax - add rax,r15 - mov r13,r8 - add r14,rax - shrd r13,r13,23 - mov rax,r14 - mov r12,r9 - shrd r14,r14,5 - xor r13,r8 - xor r12,r10 - shrd r13,r13,4 - xor r14,rax - and r12,r8 - xor r13,r8 - add r11,QWORD[64+rsp] - mov r15,rax - xor r12,r10 - shrd r14,r14,6 - xor r15,rbx - add r11,r12 - shrd r13,r13,14 - and rdi,r15 - xor r14,rax - add r11,r13 - xor rdi,rbx - shrd r14,r14,28 - add rdx,r11 - add r11,rdi - mov r13,rdx - add r14,r11 - shrd r13,r13,23 - mov r11,r14 - mov r12,r8 - shrd r14,r14,5 - xor r13,rdx - xor r12,r9 - shrd r13,r13,4 - xor r14,r11 - and r12,rdx - xor r13,rdx - add r10,QWORD[72+rsp] - mov rdi,r11 - xor r12,r9 - shrd r14,r14,6 - xor rdi,rax - add r10,r12 - shrd r13,r13,14 - and r15,rdi - xor r14,r11 - add r10,r13 - xor r15,rax - shrd r14,r14,28 - add rcx,r10 - add r10,r15 - mov r13,rcx - add r14,r10 - shrd r13,r13,23 - mov r10,r14 - mov r12,rdx - shrd r14,r14,5 - xor r13,rcx - xor r12,r8 - shrd r13,r13,4 - xor r14,r10 - and r12,rcx - xor r13,rcx - add r9,QWORD[80+rsp] - mov r15,r10 - xor r12,r8 - shrd r14,r14,6 - xor r15,r11 - add r9,r12 - shrd r13,r13,14 - and rdi,r15 - xor r14,r10 - add r9,r13 - xor rdi,r11 - shrd r14,r14,28 - add rbx,r9 - add r9,rdi - mov r13,rbx - add r14,r9 - shrd r13,r13,23 - mov r9,r14 - mov r12,rcx - shrd r14,r14,5 - xor r13,rbx - xor r12,rdx - shrd r13,r13,4 - xor r14,r9 - and r12,rbx - xor r13,rbx - add r8,QWORD[88+rsp] - mov rdi,r9 - xor r12,rdx - shrd r14,r14,6 - xor rdi,r10 - add r8,r12 - shrd r13,r13,14 - and r15,rdi - xor r14,r9 - add r8,r13 - xor r15,r10 - shrd r14,r14,28 - add rax,r8 - add r8,r15 - mov r13,rax - add r14,r8 - shrd r13,r13,23 - mov r8,r14 - mov r12,rbx - shrd r14,r14,5 - xor r13,rax - xor r12,rcx - shrd r13,r13,4 - xor r14,r8 - and r12,rax - xor r13,rax - add rdx,QWORD[96+rsp] - mov r15,r8 - xor r12,rcx - shrd r14,r14,6 - xor r15,r9 - add rdx,r12 - shrd r13,r13,14 - and rdi,r15 - xor r14,r8 - add rdx,r13 - xor rdi,r9 - shrd r14,r14,28 - add r11,rdx - add rdx,rdi - mov r13,r11 - add r14,rdx - shrd r13,r13,23 - mov rdx,r14 - mov r12,rax - shrd r14,r14,5 - xor r13,r11 - xor r12,rbx - shrd r13,r13,4 - xor r14,rdx - and r12,r11 - xor r13,r11 - add rcx,QWORD[104+rsp] - mov rdi,rdx - xor r12,rbx - shrd r14,r14,6 - xor rdi,r8 - add rcx,r12 - shrd r13,r13,14 - and r15,rdi - xor r14,rdx - add rcx,r13 - xor r15,r8 - shrd r14,r14,28 - add r10,rcx - add rcx,r15 - mov r13,r10 - add r14,rcx - shrd r13,r13,23 - mov rcx,r14 - mov r12,r11 - shrd r14,r14,5 - xor r13,r10 - xor r12,rax - shrd r13,r13,4 - xor r14,rcx - and r12,r10 - xor r13,r10 - add rbx,QWORD[112+rsp] - mov r15,rcx - xor r12,rax - shrd r14,r14,6 - xor r15,rdx - add rbx,r12 - shrd r13,r13,14 - and rdi,r15 - xor r14,rcx - add rbx,r13 - xor rdi,rdx - shrd r14,r14,28 - add r9,rbx - add rbx,rdi - mov r13,r9 - add r14,rbx - shrd r13,r13,23 - mov rbx,r14 - mov r12,r10 - shrd r14,r14,5 - xor r13,r9 - xor r12,r11 - shrd r13,r13,4 - xor r14,rbx - and r12,r9 - xor r13,r9 - add rax,QWORD[120+rsp] - mov rdi,rbx - xor r12,r11 - shrd r14,r14,6 - xor rdi,rcx - add rax,r12 - shrd r13,r13,14 - and r15,rdi - xor r14,rbx - add rax,r13 - xor r15,rcx - shrd r14,r14,28 - add r8,rax - add rax,r15 - mov r13,r8 - add r14,rax - mov rdi,QWORD[((128+0))+rsp] - mov rax,r14 - - add rax,QWORD[rdi] - lea rsi,[128+rsi] - add rbx,QWORD[8+rdi] - add rcx,QWORD[16+rdi] - add rdx,QWORD[24+rdi] - add r8,QWORD[32+rdi] - add r9,QWORD[40+rdi] - add r10,QWORD[48+rdi] - add r11,QWORD[56+rdi] - - cmp rsi,QWORD[((128+16))+rsp] - - mov QWORD[rdi],rax - mov QWORD[8+rdi],rbx - mov QWORD[16+rdi],rcx - mov QWORD[24+rdi],rdx - mov QWORD[32+rdi],r8 - mov QWORD[40+rdi],r9 - mov QWORD[48+rdi],r10 - mov QWORD[56+rdi],r11 - jb NEAR $L$loop_avx - - mov rsi,QWORD[152+rsp] - - vzeroupper - movaps xmm6,XMMWORD[((128+32))+rsp] - movaps xmm7,XMMWORD[((128+48))+rsp] - movaps xmm8,XMMWORD[((128+64))+rsp] - movaps xmm9,XMMWORD[((128+80))+rsp] - movaps xmm10,XMMWORD[((128+96))+rsp] - movaps xmm11,XMMWORD[((128+112))+rsp] - mov r15,QWORD[((-48))+rsi] - - mov r14,QWORD[((-40))+rsi] - - mov r13,QWORD[((-32))+rsi] - - mov r12,QWORD[((-24))+rsi] - - mov rbp,QWORD[((-16))+rsi] - - mov rbx,QWORD[((-8))+rsi] - - lea rsp,[rsi] - -$L$epilogue_avx: - mov rdi,QWORD[8+rsp] ;WIN64 epilogue - mov rsi,QWORD[16+rsp] - DB 0F3h,0C3h ;repret - -$L$SEH_end_GFp_sha512_block_data_order_avx: -EXTERN __imp_RtlVirtualUnwind - -ALIGN 16 -se_handler: - push rsi - push rdi - push rbx - push rbp - push r12 - push r13 - push r14 - push r15 - pushfq - sub rsp,64 - - mov rax,QWORD[120+r8] - mov rbx,QWORD[248+r8] - - mov rsi,QWORD[8+r9] - mov r11,QWORD[56+r9] - - mov r10d,DWORD[r11] - lea r10,[r10*1+rsi] - cmp rbx,r10 - jb NEAR $L$in_prologue - - mov rax,QWORD[152+r8] - - mov r10d,DWORD[4+r11] - lea r10,[r10*1+rsi] - cmp rbx,r10 - jae NEAR $L$in_prologue - mov rsi,rax - mov rax,QWORD[((128+24))+rax] - - mov rbx,QWORD[((-8))+rax] - mov rbp,QWORD[((-16))+rax] - mov r12,QWORD[((-24))+rax] - mov r13,QWORD[((-32))+rax] - mov r14,QWORD[((-40))+rax] - mov r15,QWORD[((-48))+rax] - mov QWORD[144+r8],rbx - mov QWORD[160+r8],rbp - mov QWORD[216+r8],r12 - mov QWORD[224+r8],r13 - mov QWORD[232+r8],r14 - mov QWORD[240+r8],r15 - - lea r10,[$L$epilogue] - cmp rbx,r10 - jb NEAR $L$in_prologue - - lea rsi,[((128+32))+rsi] - lea rdi,[512+r8] - mov ecx,12 - DD 0xa548f3fc - -$L$in_prologue: - mov rdi,QWORD[8+rax] - mov rsi,QWORD[16+rax] - mov QWORD[152+r8],rax - mov QWORD[168+r8],rsi - mov QWORD[176+r8],rdi - - mov rdi,QWORD[40+r9] - mov rsi,r8 - mov ecx,154 - DD 0xa548f3fc - - mov rsi,r9 - xor rcx,rcx - mov rdx,QWORD[8+rsi] - mov r8,QWORD[rsi] - mov r9,QWORD[16+rsi] - mov r10,QWORD[40+rsi] - lea r11,[56+rsi] - lea r12,[24+rsi] - mov QWORD[32+rsp],r10 - mov QWORD[40+rsp],r11 - mov QWORD[48+rsp],r12 - mov QWORD[56+rsp],rcx - call QWORD[__imp_RtlVirtualUnwind] - - mov eax,1 - add rsp,64 - popfq - pop r15 - pop r14 - pop r13 - pop r12 - pop rbp - pop rbx - pop rdi - pop rsi - DB 0F3h,0C3h ;repret - -section .pdata rdata align=4 -ALIGN 4 - DD $L$SEH_begin_GFp_sha512_block_data_order wrt ..imagebase - DD $L$SEH_end_GFp_sha512_block_data_order wrt ..imagebase - DD $L$SEH_info_GFp_sha512_block_data_order wrt ..imagebase - DD $L$SEH_begin_GFp_sha512_block_data_order_avx wrt ..imagebase - DD $L$SEH_end_GFp_sha512_block_data_order_avx wrt ..imagebase - DD $L$SEH_info_GFp_sha512_block_data_order_avx wrt ..imagebase -section .xdata rdata align=8 -ALIGN 8 -$L$SEH_info_GFp_sha512_block_data_order: -DB 9,0,0,0 - DD se_handler wrt ..imagebase - DD $L$prologue wrt ..imagebase,$L$epilogue wrt ..imagebase -$L$SEH_info_GFp_sha512_block_data_order_avx: -DB 9,0,0,0 - DD se_handler wrt ..imagebase - DD $L$prologue_avx wrt ..imagebase,$L$epilogue_avx wrt ..imagebase diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/tmp/vpaes-x86_64-nasm.asm temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/tmp/vpaes-x86_64-nasm.asm --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/tmp/vpaes-x86_64-nasm.asm 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/tmp/vpaes-x86_64-nasm.asm 1970-01-01 00:00:00.000000000 +0000 @@ -1,982 +0,0 @@ -; This file is generated from a similarly-named Perl script in the BoringSSL -; source tree. Do not edit by hand. - -default rel -%define XMMWORD -%define YMMWORD -%define ZMMWORD -section .text code align=64 - - - - - - - - - - - - - - - - - - -ALIGN 16 -_vpaes_encrypt_core: - - mov r9,rdx - mov r11,16 - mov eax,DWORD[240+rdx] - movdqa xmm1,xmm9 - movdqa xmm2,XMMWORD[$L$k_ipt] - pandn xmm1,xmm0 - movdqu xmm5,XMMWORD[r9] - psrld xmm1,4 - pand xmm0,xmm9 -DB 102,15,56,0,208 - movdqa xmm0,XMMWORD[(($L$k_ipt+16))] -DB 102,15,56,0,193 - pxor xmm2,xmm5 - add r9,16 - pxor xmm0,xmm2 - lea r10,[$L$k_mc_backward] - jmp NEAR $L$enc_entry - -ALIGN 16 -$L$enc_loop: - - movdqa xmm4,xmm13 - movdqa xmm0,xmm12 -DB 102,15,56,0,226 -DB 102,15,56,0,195 - pxor xmm4,xmm5 - movdqa xmm5,xmm15 - pxor xmm0,xmm4 - movdqa xmm1,XMMWORD[((-64))+r10*1+r11] -DB 102,15,56,0,234 - movdqa xmm4,XMMWORD[r10*1+r11] - movdqa xmm2,xmm14 -DB 102,15,56,0,211 - movdqa xmm3,xmm0 - pxor xmm2,xmm5 -DB 102,15,56,0,193 - add r9,16 - pxor xmm0,xmm2 -DB 102,15,56,0,220 - add r11,16 - pxor xmm3,xmm0 -DB 102,15,56,0,193 - and r11,0x30 - sub rax,1 - pxor xmm0,xmm3 - -$L$enc_entry: - - movdqa xmm1,xmm9 - movdqa xmm5,xmm11 - pandn xmm1,xmm0 - psrld xmm1,4 - pand xmm0,xmm9 -DB 102,15,56,0,232 - movdqa xmm3,xmm10 - pxor xmm0,xmm1 -DB 102,15,56,0,217 - movdqa xmm4,xmm10 - pxor xmm3,xmm5 -DB 102,15,56,0,224 - movdqa xmm2,xmm10 - pxor xmm4,xmm5 -DB 102,15,56,0,211 - movdqa xmm3,xmm10 - pxor xmm2,xmm0 -DB 102,15,56,0,220 - movdqu xmm5,XMMWORD[r9] - pxor xmm3,xmm1 - jnz NEAR $L$enc_loop - - - movdqa xmm4,XMMWORD[((-96))+r10] - movdqa xmm0,XMMWORD[((-80))+r10] -DB 102,15,56,0,226 - pxor xmm4,xmm5 -DB 102,15,56,0,195 - movdqa xmm1,XMMWORD[64+r10*1+r11] - pxor xmm0,xmm4 -DB 102,15,56,0,193 - DB 0F3h,0C3h ;repret - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -ALIGN 16 -_vpaes_encrypt_core_2x: - - mov r9,rdx - mov r11,16 - mov eax,DWORD[240+rdx] - movdqa xmm1,xmm9 - movdqa xmm7,xmm9 - movdqa xmm2,XMMWORD[$L$k_ipt] - movdqa xmm8,xmm2 - pandn xmm1,xmm0 - pandn xmm7,xmm6 - movdqu xmm5,XMMWORD[r9] - - psrld xmm1,4 - psrld xmm7,4 - pand xmm0,xmm9 - pand xmm6,xmm9 -DB 102,15,56,0,208 -DB 102,68,15,56,0,198 - movdqa xmm0,XMMWORD[(($L$k_ipt+16))] - movdqa xmm6,xmm0 -DB 102,15,56,0,193 -DB 102,15,56,0,247 - pxor xmm2,xmm5 - pxor xmm8,xmm5 - add r9,16 - pxor xmm0,xmm2 - pxor xmm6,xmm8 - lea r10,[$L$k_mc_backward] - jmp NEAR $L$enc2x_entry - -ALIGN 16 -$L$enc2x_loop: - - movdqa xmm4,XMMWORD[$L$k_sb1] - movdqa xmm0,XMMWORD[(($L$k_sb1+16))] - movdqa xmm12,xmm4 - movdqa xmm6,xmm0 -DB 102,15,56,0,226 -DB 102,69,15,56,0,224 -DB 102,15,56,0,195 -DB 102,65,15,56,0,243 - pxor xmm4,xmm5 - pxor xmm12,xmm5 - movdqa xmm5,XMMWORD[$L$k_sb2] - movdqa xmm13,xmm5 - pxor xmm0,xmm4 - pxor xmm6,xmm12 - movdqa xmm1,XMMWORD[((-64))+r10*1+r11] - -DB 102,15,56,0,234 -DB 102,69,15,56,0,232 - movdqa xmm4,XMMWORD[r10*1+r11] - - movdqa xmm2,XMMWORD[(($L$k_sb2+16))] - movdqa xmm8,xmm2 -DB 102,15,56,0,211 -DB 102,69,15,56,0,195 - movdqa xmm3,xmm0 - movdqa xmm11,xmm6 - pxor xmm2,xmm5 - pxor xmm8,xmm13 -DB 102,15,56,0,193 -DB 102,15,56,0,241 - add r9,16 - pxor xmm0,xmm2 - pxor xmm6,xmm8 -DB 102,15,56,0,220 -DB 102,68,15,56,0,220 - add r11,16 - pxor xmm3,xmm0 - pxor xmm11,xmm6 -DB 102,15,56,0,193 -DB 102,15,56,0,241 - and r11,0x30 - sub rax,1 - pxor xmm0,xmm3 - pxor xmm6,xmm11 - -$L$enc2x_entry: - - movdqa xmm1,xmm9 - movdqa xmm7,xmm9 - movdqa xmm5,XMMWORD[(($L$k_inv+16))] - movdqa xmm13,xmm5 - pandn xmm1,xmm0 - pandn xmm7,xmm6 - psrld xmm1,4 - psrld xmm7,4 - pand xmm0,xmm9 - pand xmm6,xmm9 -DB 102,15,56,0,232 -DB 102,68,15,56,0,238 - movdqa xmm3,xmm10 - movdqa xmm11,xmm10 - pxor xmm0,xmm1 - pxor xmm6,xmm7 -DB 102,15,56,0,217 -DB 102,68,15,56,0,223 - movdqa xmm4,xmm10 - movdqa xmm12,xmm10 - pxor xmm3,xmm5 - pxor xmm11,xmm13 -DB 102,15,56,0,224 -DB 102,68,15,56,0,230 - movdqa xmm2,xmm10 - movdqa xmm8,xmm10 - pxor xmm4,xmm5 - pxor xmm12,xmm13 -DB 102,15,56,0,211 -DB 102,69,15,56,0,195 - movdqa xmm3,xmm10 - movdqa xmm11,xmm10 - pxor xmm2,xmm0 - pxor xmm8,xmm6 -DB 102,15,56,0,220 -DB 102,69,15,56,0,220 - movdqu xmm5,XMMWORD[r9] - - pxor xmm3,xmm1 - pxor xmm11,xmm7 - jnz NEAR $L$enc2x_loop - - - movdqa xmm4,XMMWORD[((-96))+r10] - movdqa xmm0,XMMWORD[((-80))+r10] - movdqa xmm12,xmm4 - movdqa xmm6,xmm0 -DB 102,15,56,0,226 -DB 102,69,15,56,0,224 - pxor xmm4,xmm5 - pxor xmm12,xmm5 -DB 102,15,56,0,195 -DB 102,65,15,56,0,243 - movdqa xmm1,XMMWORD[64+r10*1+r11] - - pxor xmm0,xmm4 - pxor xmm6,xmm12 -DB 102,15,56,0,193 -DB 102,15,56,0,241 - DB 0F3h,0C3h ;repret - - - - - - - - - -ALIGN 16 -_vpaes_schedule_core: - - - - - - - call _vpaes_preheat - movdqa xmm8,XMMWORD[$L$k_rcon] - movdqu xmm0,XMMWORD[rdi] - - - movdqa xmm3,xmm0 - lea r11,[$L$k_ipt] - call _vpaes_schedule_transform - movdqa xmm7,xmm0 - - lea r10,[$L$k_sr] - - - movdqu XMMWORD[rdx],xmm0 - -$L$schedule_go: - cmp esi,192 - ja NEAR $L$schedule_256 - - - - - - - - - - - -$L$schedule_128: - mov esi,10 - -$L$oop_schedule_128: - call _vpaes_schedule_round - dec rsi - jz NEAR $L$schedule_mangle_last - call _vpaes_schedule_mangle - jmp NEAR $L$oop_schedule_128 - - - - - - - - - - - -ALIGN 16 -$L$schedule_256: - movdqu xmm0,XMMWORD[16+rdi] - call _vpaes_schedule_transform - mov esi,7 - -$L$oop_schedule_256: - call _vpaes_schedule_mangle - movdqa xmm6,xmm0 - - - call _vpaes_schedule_round - dec rsi - jz NEAR $L$schedule_mangle_last - call _vpaes_schedule_mangle - - - pshufd xmm0,xmm0,0xFF - movdqa xmm5,xmm7 - movdqa xmm7,xmm6 - call _vpaes_schedule_low_round - movdqa xmm7,xmm5 - - jmp NEAR $L$oop_schedule_256 - - - - - - - - - - - - -ALIGN 16 -$L$schedule_mangle_last: - - lea r11,[$L$k_deskew] - - - movdqa xmm1,XMMWORD[r10*1+r8] -DB 102,15,56,0,193 - lea r11,[$L$k_opt] - add rdx,32 - -$L$schedule_mangle_last_dec: - add rdx,-16 - pxor xmm0,XMMWORD[$L$k_s63] - call _vpaes_schedule_transform - movdqu XMMWORD[rdx],xmm0 - - - pxor xmm0,xmm0 - pxor xmm1,xmm1 - pxor xmm2,xmm2 - pxor xmm3,xmm3 - pxor xmm4,xmm4 - pxor xmm5,xmm5 - pxor xmm6,xmm6 - pxor xmm7,xmm7 - DB 0F3h,0C3h ;repret - - - - - - - - - - - - - - - - - - - - - - -ALIGN 16 -_vpaes_schedule_round: - - - pxor xmm1,xmm1 -DB 102,65,15,58,15,200,15 -DB 102,69,15,58,15,192,15 - pxor xmm7,xmm1 - - - pshufd xmm0,xmm0,0xFF -DB 102,15,58,15,192,1 - - - - -_vpaes_schedule_low_round: - - movdqa xmm1,xmm7 - pslldq xmm7,4 - pxor xmm7,xmm1 - movdqa xmm1,xmm7 - pslldq xmm7,8 - pxor xmm7,xmm1 - pxor xmm7,XMMWORD[$L$k_s63] - - - movdqa xmm1,xmm9 - pandn xmm1,xmm0 - psrld xmm1,4 - pand xmm0,xmm9 - movdqa xmm2,xmm11 -DB 102,15,56,0,208 - pxor xmm0,xmm1 - movdqa xmm3,xmm10 -DB 102,15,56,0,217 - pxor xmm3,xmm2 - movdqa xmm4,xmm10 -DB 102,15,56,0,224 - pxor xmm4,xmm2 - movdqa xmm2,xmm10 -DB 102,15,56,0,211 - pxor xmm2,xmm0 - movdqa xmm3,xmm10 -DB 102,15,56,0,220 - pxor xmm3,xmm1 - movdqa xmm4,xmm13 -DB 102,15,56,0,226 - movdqa xmm0,xmm12 -DB 102,15,56,0,195 - pxor xmm0,xmm4 - - - pxor xmm0,xmm7 - movdqa xmm7,xmm0 - DB 0F3h,0C3h ;repret - - - - - - - - - - - - - -ALIGN 16 -_vpaes_schedule_transform: - - movdqa xmm1,xmm9 - pandn xmm1,xmm0 - psrld xmm1,4 - pand xmm0,xmm9 - movdqa xmm2,XMMWORD[r11] -DB 102,15,56,0,208 - movdqa xmm0,XMMWORD[16+r11] -DB 102,15,56,0,193 - pxor xmm0,xmm2 - DB 0F3h,0C3h ;repret - - - - - - - - - - - - - - - - - - - - - - - - - - - -ALIGN 16 -_vpaes_schedule_mangle: - - movdqa xmm4,xmm0 - movdqa xmm5,XMMWORD[$L$k_mc_forward] - - - add rdx,16 - pxor xmm4,XMMWORD[$L$k_s63] -DB 102,15,56,0,229 - movdqa xmm3,xmm4 -DB 102,15,56,0,229 - pxor xmm3,xmm4 -DB 102,15,56,0,229 - pxor xmm3,xmm4 - -$L$schedule_mangle_both: - movdqa xmm1,XMMWORD[r10*1+r8] -DB 102,15,56,0,217 - add r8,-16 - and r8,0x30 - movdqu XMMWORD[rdx],xmm3 - DB 0F3h,0C3h ;repret - - - - - - -global GFp_vpaes_set_encrypt_key - -ALIGN 16 -GFp_vpaes_set_encrypt_key: - mov QWORD[8+rsp],rdi ;WIN64 prologue - mov QWORD[16+rsp],rsi - mov rax,rsp -$L$SEH_begin_GFp_vpaes_set_encrypt_key: - mov rdi,rcx - mov rsi,rdx - mov rdx,r8 - - - -%ifdef BORINGSSL_DISPATCH_TEST -EXTERN BORINGSSL_function_hit - mov BYTE[((BORINGSSL_function_hit+5))],1 -%endif - - lea rsp,[((-184))+rsp] - movaps XMMWORD[16+rsp],xmm6 - movaps XMMWORD[32+rsp],xmm7 - movaps XMMWORD[48+rsp],xmm8 - movaps XMMWORD[64+rsp],xmm9 - movaps XMMWORD[80+rsp],xmm10 - movaps XMMWORD[96+rsp],xmm11 - movaps XMMWORD[112+rsp],xmm12 - movaps XMMWORD[128+rsp],xmm13 - movaps XMMWORD[144+rsp],xmm14 - movaps XMMWORD[160+rsp],xmm15 -$L$enc_key_body: - mov eax,esi - shr eax,5 - add eax,5 - mov DWORD[240+rdx],eax - - mov ecx,0 - mov r8d,0x30 - call _vpaes_schedule_core - movaps xmm6,XMMWORD[16+rsp] - movaps xmm7,XMMWORD[32+rsp] - movaps xmm8,XMMWORD[48+rsp] - movaps xmm9,XMMWORD[64+rsp] - movaps xmm10,XMMWORD[80+rsp] - movaps xmm11,XMMWORD[96+rsp] - movaps xmm12,XMMWORD[112+rsp] - movaps xmm13,XMMWORD[128+rsp] - movaps xmm14,XMMWORD[144+rsp] - movaps xmm15,XMMWORD[160+rsp] - lea rsp,[184+rsp] -$L$enc_key_epilogue: - xor eax,eax - mov rdi,QWORD[8+rsp] ;WIN64 epilogue - mov rsi,QWORD[16+rsp] - DB 0F3h,0C3h ;repret - -$L$SEH_end_GFp_vpaes_set_encrypt_key: - -global GFp_vpaes_encrypt - -ALIGN 16 -GFp_vpaes_encrypt: - mov QWORD[8+rsp],rdi ;WIN64 prologue - mov QWORD[16+rsp],rsi - mov rax,rsp -$L$SEH_begin_GFp_vpaes_encrypt: - mov rdi,rcx - mov rsi,rdx - mov rdx,r8 - - - - lea rsp,[((-184))+rsp] - movaps XMMWORD[16+rsp],xmm6 - movaps XMMWORD[32+rsp],xmm7 - movaps XMMWORD[48+rsp],xmm8 - movaps XMMWORD[64+rsp],xmm9 - movaps XMMWORD[80+rsp],xmm10 - movaps XMMWORD[96+rsp],xmm11 - movaps XMMWORD[112+rsp],xmm12 - movaps XMMWORD[128+rsp],xmm13 - movaps XMMWORD[144+rsp],xmm14 - movaps XMMWORD[160+rsp],xmm15 -$L$enc_body: - movdqu xmm0,XMMWORD[rdi] - call _vpaes_preheat - call _vpaes_encrypt_core - movdqu XMMWORD[rsi],xmm0 - movaps xmm6,XMMWORD[16+rsp] - movaps xmm7,XMMWORD[32+rsp] - movaps xmm8,XMMWORD[48+rsp] - movaps xmm9,XMMWORD[64+rsp] - movaps xmm10,XMMWORD[80+rsp] - movaps xmm11,XMMWORD[96+rsp] - movaps xmm12,XMMWORD[112+rsp] - movaps xmm13,XMMWORD[128+rsp] - movaps xmm14,XMMWORD[144+rsp] - movaps xmm15,XMMWORD[160+rsp] - lea rsp,[184+rsp] -$L$enc_epilogue: - mov rdi,QWORD[8+rsp] ;WIN64 epilogue - mov rsi,QWORD[16+rsp] - DB 0F3h,0C3h ;repret - -$L$SEH_end_GFp_vpaes_encrypt: -global GFp_vpaes_ctr32_encrypt_blocks - -ALIGN 16 -GFp_vpaes_ctr32_encrypt_blocks: - mov QWORD[8+rsp],rdi ;WIN64 prologue - mov QWORD[16+rsp],rsi - mov rax,rsp -$L$SEH_begin_GFp_vpaes_ctr32_encrypt_blocks: - mov rdi,rcx - mov rsi,rdx - mov rdx,r8 - mov rcx,r9 - mov r8,QWORD[40+rsp] - - - - - xchg rdx,rcx - test rcx,rcx - jz NEAR $L$ctr32_abort - lea rsp,[((-184))+rsp] - movaps XMMWORD[16+rsp],xmm6 - movaps XMMWORD[32+rsp],xmm7 - movaps XMMWORD[48+rsp],xmm8 - movaps XMMWORD[64+rsp],xmm9 - movaps XMMWORD[80+rsp],xmm10 - movaps XMMWORD[96+rsp],xmm11 - movaps XMMWORD[112+rsp],xmm12 - movaps XMMWORD[128+rsp],xmm13 - movaps XMMWORD[144+rsp],xmm14 - movaps XMMWORD[160+rsp],xmm15 -$L$ctr32_body: - movdqu xmm0,XMMWORD[r8] - movdqa xmm8,XMMWORD[$L$ctr_add_one] - sub rsi,rdi - call _vpaes_preheat - movdqa xmm6,xmm0 - pshufb xmm6,XMMWORD[$L$rev_ctr] - - test rcx,1 - jz NEAR $L$ctr32_prep_loop - - - - movdqu xmm7,XMMWORD[rdi] - call _vpaes_encrypt_core - pxor xmm0,xmm7 - paddd xmm6,xmm8 - movdqu XMMWORD[rdi*1+rsi],xmm0 - sub rcx,1 - lea rdi,[16+rdi] - jz NEAR $L$ctr32_done - -$L$ctr32_prep_loop: - - - movdqa xmm14,xmm6 - movdqa xmm15,xmm6 - paddd xmm15,xmm8 - -$L$ctr32_loop: - movdqa xmm1,XMMWORD[$L$rev_ctr] - movdqa xmm0,xmm14 - movdqa xmm6,xmm15 -DB 102,15,56,0,193 -DB 102,15,56,0,241 - call _vpaes_encrypt_core_2x - movdqu xmm1,XMMWORD[rdi] - movdqu xmm2,XMMWORD[16+rdi] - movdqa xmm3,XMMWORD[$L$ctr_add_two] - pxor xmm0,xmm1 - pxor xmm6,xmm2 - paddd xmm14,xmm3 - paddd xmm15,xmm3 - movdqu XMMWORD[rdi*1+rsi],xmm0 - movdqu XMMWORD[16+rdi*1+rsi],xmm6 - sub rcx,2 - lea rdi,[32+rdi] - jnz NEAR $L$ctr32_loop - -$L$ctr32_done: - movaps xmm6,XMMWORD[16+rsp] - movaps xmm7,XMMWORD[32+rsp] - movaps xmm8,XMMWORD[48+rsp] - movaps xmm9,XMMWORD[64+rsp] - movaps xmm10,XMMWORD[80+rsp] - movaps xmm11,XMMWORD[96+rsp] - movaps xmm12,XMMWORD[112+rsp] - movaps xmm13,XMMWORD[128+rsp] - movaps xmm14,XMMWORD[144+rsp] - movaps xmm15,XMMWORD[160+rsp] - lea rsp,[184+rsp] -$L$ctr32_epilogue: -$L$ctr32_abort: - mov rdi,QWORD[8+rsp] ;WIN64 epilogue - mov rsi,QWORD[16+rsp] - DB 0F3h,0C3h ;repret - -$L$SEH_end_GFp_vpaes_ctr32_encrypt_blocks: - - - - - - - -ALIGN 16 -_vpaes_preheat: - - lea r10,[$L$k_s0F] - movdqa xmm10,XMMWORD[((-32))+r10] - movdqa xmm11,XMMWORD[((-16))+r10] - movdqa xmm9,XMMWORD[r10] - movdqa xmm13,XMMWORD[48+r10] - movdqa xmm12,XMMWORD[64+r10] - movdqa xmm15,XMMWORD[80+r10] - movdqa xmm14,XMMWORD[96+r10] - DB 0F3h,0C3h ;repret - - - - - - - - -ALIGN 64 -_vpaes_consts: -$L$k_inv: - DQ 0x0E05060F0D080180,0x040703090A0B0C02 - DQ 0x01040A060F0B0780,0x030D0E0C02050809 - -$L$k_s0F: - DQ 0x0F0F0F0F0F0F0F0F,0x0F0F0F0F0F0F0F0F - -$L$k_ipt: - DQ 0xC2B2E8985A2A7000,0xCABAE09052227808 - DQ 0x4C01307D317C4D00,0xCD80B1FCB0FDCC81 - -$L$k_sb1: - DQ 0xB19BE18FCB503E00,0xA5DF7A6E142AF544 - DQ 0x3618D415FAE22300,0x3BF7CCC10D2ED9EF -$L$k_sb2: - DQ 0xE27A93C60B712400,0x5EB7E955BC982FCD - DQ 0x69EB88400AE12900,0xC2A163C8AB82234A -$L$k_sbo: - DQ 0xD0D26D176FBDC700,0x15AABF7AC502A878 - DQ 0xCFE474A55FBB6A00,0x8E1E90D1412B35FA - -$L$k_mc_forward: - DQ 0x0407060500030201,0x0C0F0E0D080B0A09 - DQ 0x080B0A0904070605,0x000302010C0F0E0D - DQ 0x0C0F0E0D080B0A09,0x0407060500030201 - DQ 0x000302010C0F0E0D,0x080B0A0904070605 - -$L$k_mc_backward: - DQ 0x0605040702010003,0x0E0D0C0F0A09080B - DQ 0x020100030E0D0C0F,0x0A09080B06050407 - DQ 0x0E0D0C0F0A09080B,0x0605040702010003 - DQ 0x0A09080B06050407,0x020100030E0D0C0F - -$L$k_sr: - DQ 0x0706050403020100,0x0F0E0D0C0B0A0908 - DQ 0x030E09040F0A0500,0x0B06010C07020D08 - DQ 0x0F060D040B020900,0x070E050C030A0108 - DQ 0x0B0E0104070A0D00,0x0306090C0F020508 - -$L$k_rcon: - DQ 0x1F8391B9AF9DEEB6,0x702A98084D7C7D81 - -$L$k_s63: - DQ 0x5B5B5B5B5B5B5B5B,0x5B5B5B5B5B5B5B5B - -$L$k_opt: - DQ 0xFF9F4929D6B66000,0xF7974121DEBE6808 - DQ 0x01EDBD5150BCEC00,0xE10D5DB1B05C0CE0 - -$L$k_deskew: - DQ 0x07E4A34047A4E300,0x1DFEB95A5DBEF91A - DQ 0x5F36B5DC83EA6900,0x2841C2ABF49D1E77 - - -$L$rev_ctr: - DQ 0x0706050403020100,0x0c0d0e0f0b0a0908 - - -$L$ctr_add_one: - DQ 0x0000000000000000,0x0000000100000000 -$L$ctr_add_two: - DQ 0x0000000000000000,0x0000000200000000 - -DB 86,101,99,116,111,114,32,80,101,114,109,117,116,97,116,105 -DB 111,110,32,65,69,83,32,102,111,114,32,120,56,54,95,54 -DB 52,47,83,83,83,69,51,44,32,77,105,107,101,32,72,97 -DB 109,98,117,114,103,32,40,83,116,97,110,102,111,114,100,32 -DB 85,110,105,118,101,114,115,105,116,121,41,0 -ALIGN 64 - -EXTERN __imp_RtlVirtualUnwind - -ALIGN 16 -se_handler: - push rsi - push rdi - push rbx - push rbp - push r12 - push r13 - push r14 - push r15 - pushfq - sub rsp,64 - - mov rax,QWORD[120+r8] - mov rbx,QWORD[248+r8] - - mov rsi,QWORD[8+r9] - mov r11,QWORD[56+r9] - - mov r10d,DWORD[r11] - lea r10,[r10*1+rsi] - cmp rbx,r10 - jb NEAR $L$in_prologue - - mov rax,QWORD[152+r8] - - mov r10d,DWORD[4+r11] - lea r10,[r10*1+rsi] - cmp rbx,r10 - jae NEAR $L$in_prologue - - lea rsi,[16+rax] - lea rdi,[512+r8] - mov ecx,20 - DD 0xa548f3fc - lea rax,[184+rax] - -$L$in_prologue: - mov rdi,QWORD[8+rax] - mov rsi,QWORD[16+rax] - mov QWORD[152+r8],rax - mov QWORD[168+r8],rsi - mov QWORD[176+r8],rdi - - mov rdi,QWORD[40+r9] - mov rsi,r8 - mov ecx,154 - DD 0xa548f3fc - - mov rsi,r9 - xor rcx,rcx - mov rdx,QWORD[8+rsi] - mov r8,QWORD[rsi] - mov r9,QWORD[16+rsi] - mov r10,QWORD[40+rsi] - lea r11,[56+rsi] - lea r12,[24+rsi] - mov QWORD[32+rsp],r10 - mov QWORD[40+rsp],r11 - mov QWORD[48+rsp],r12 - mov QWORD[56+rsp],rcx - call QWORD[__imp_RtlVirtualUnwind] - - mov eax,1 - add rsp,64 - popfq - pop r15 - pop r14 - pop r13 - pop r12 - pop rbp - pop rbx - pop rdi - pop rsi - DB 0F3h,0C3h ;repret - - -section .pdata rdata align=4 -ALIGN 4 - DD $L$SEH_begin_GFp_vpaes_set_encrypt_key wrt ..imagebase - DD $L$SEH_end_GFp_vpaes_set_encrypt_key wrt ..imagebase - DD $L$SEH_info_GFp_vpaes_set_encrypt_key wrt ..imagebase - - DD $L$SEH_begin_GFp_vpaes_encrypt wrt ..imagebase - DD $L$SEH_end_GFp_vpaes_encrypt wrt ..imagebase - DD $L$SEH_info_GFp_vpaes_encrypt wrt ..imagebase - DD $L$SEH_begin_GFp_vpaes_ctr32_encrypt_blocks wrt ..imagebase - DD $L$SEH_end_GFp_vpaes_ctr32_encrypt_blocks wrt ..imagebase - DD $L$SEH_info_GFp_vpaes_ctr32_encrypt_blocks wrt ..imagebase - -section .xdata rdata align=8 -ALIGN 8 -$L$SEH_info_GFp_vpaes_set_encrypt_key: -DB 9,0,0,0 - DD se_handler wrt ..imagebase - DD $L$enc_key_body wrt ..imagebase,$L$enc_key_epilogue wrt ..imagebase -$L$SEH_info_GFp_vpaes_encrypt: -DB 9,0,0,0 - DD se_handler wrt ..imagebase - DD $L$enc_body wrt ..imagebase,$L$enc_epilogue wrt ..imagebase -$L$SEH_info_GFp_vpaes_ctr32_encrypt_blocks: -DB 9,0,0,0 - DD se_handler wrt ..imagebase - DD $L$ctr32_body wrt ..imagebase,$L$ctr32_epilogue wrt ..imagebase diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/tmp/vpaes-x86-win32n.asm temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/tmp/vpaes-x86-win32n.asm --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/tmp/vpaes-x86-win32n.asm 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/tmp/vpaes-x86-win32n.asm 1970-01-01 00:00:00.000000000 +0000 @@ -1,378 +0,0 @@ -; This file is generated from a similarly-named Perl script in the BoringSSL -; source tree. Do not edit by hand. - -%ifdef BORINGSSL_PREFIX -%include "boringssl_prefix_symbols_nasm.inc" -%endif -%ifidn __OUTPUT_FORMAT__,obj -section code use32 class=code align=64 -%elifidn __OUTPUT_FORMAT__,win32 -$@feat.00 equ 1 -section .text code align=64 -%else -section .text code -%endif -align 64 -L$_vpaes_consts: -dd 218628480,235210255,168496130,67568393 -dd 252381056,17041926,33884169,51187212 -dd 252645135,252645135,252645135,252645135 -dd 1512730624,3266504856,1377990664,3401244816 -dd 830229760,1275146365,2969422977,3447763452 -dd 3411033600,2979783055,338359620,2782886510 -dd 4209124096,907596821,221174255,1006095553 -dd 191964160,3799684038,3164090317,1589111125 -dd 182528256,1777043520,2877432650,3265356744 -dd 1874708224,3503451415,3305285752,363511674 -dd 1606117888,3487855781,1093350906,2384367825 -dd 197121,67569157,134941193,202313229 -dd 67569157,134941193,202313229,197121 -dd 134941193,202313229,197121,67569157 -dd 202313229,197121,67569157,134941193 -dd 33619971,100992007,168364043,235736079 -dd 235736079,33619971,100992007,168364043 -dd 168364043,235736079,33619971,100992007 -dd 100992007,168364043,235736079,33619971 -dd 50462976,117835012,185207048,252579084 -dd 252314880,51251460,117574920,184942860 -dd 184682752,252054788,50987272,118359308 -dd 118099200,185467140,251790600,50727180 -dd 2946363062,528716217,1300004225,1881839624 -dd 1532713819,1532713819,1532713819,1532713819 -dd 3602276352,4288629033,3737020424,4153884961 -dd 1354558464,32357713,2958822624,3775749553 -dd 1201988352,132424512,1572796698,503232858 -dd 2213177600,1597421020,4103937655,675398315 -db 86,101,99,116,111,114,32,80,101,114,109,117,116,97,116,105 -db 111,110,32,65,69,83,32,102,111,114,32,120,56,54,47,83 -db 83,83,69,51,44,32,77,105,107,101,32,72,97,109,98,117 -db 114,103,32,40,83,116,97,110,102,111,114,100,32,85,110,105 -db 118,101,114,115,105,116,121,41,0 -align 64 -align 16 -__vpaes_preheat: - add ebp,DWORD [esp] - movdqa xmm7,[ebp-48] - movdqa xmm6,[ebp-16] - ret -align 16 -__vpaes_encrypt_core: - mov ecx,16 - mov eax,DWORD [240+edx] - movdqa xmm1,xmm6 - movdqa xmm2,[ebp] - pandn xmm1,xmm0 - pand xmm0,xmm6 - movdqu xmm5,[edx] -db 102,15,56,0,208 - movdqa xmm0,[16+ebp] - pxor xmm2,xmm5 - psrld xmm1,4 - add edx,16 -db 102,15,56,0,193 - lea ebx,[192+ebp] - pxor xmm0,xmm2 - jmp NEAR L$000enc_entry -align 16 -L$001enc_loop: - movdqa xmm4,[32+ebp] - movdqa xmm0,[48+ebp] -db 102,15,56,0,226 -db 102,15,56,0,195 - pxor xmm4,xmm5 - movdqa xmm5,[64+ebp] - pxor xmm0,xmm4 - movdqa xmm1,[ecx*1+ebx-64] -db 102,15,56,0,234 - movdqa xmm2,[80+ebp] - movdqa xmm4,[ecx*1+ebx] -db 102,15,56,0,211 - movdqa xmm3,xmm0 - pxor xmm2,xmm5 -db 102,15,56,0,193 - add edx,16 - pxor xmm0,xmm2 -db 102,15,56,0,220 - add ecx,16 - pxor xmm3,xmm0 -db 102,15,56,0,193 - and ecx,48 - sub eax,1 - pxor xmm0,xmm3 -L$000enc_entry: - movdqa xmm1,xmm6 - movdqa xmm5,[ebp-32] - pandn xmm1,xmm0 - psrld xmm1,4 - pand xmm0,xmm6 -db 102,15,56,0,232 - movdqa xmm3,xmm7 - pxor xmm0,xmm1 -db 102,15,56,0,217 - movdqa xmm4,xmm7 - pxor xmm3,xmm5 -db 102,15,56,0,224 - movdqa xmm2,xmm7 - pxor xmm4,xmm5 -db 102,15,56,0,211 - movdqa xmm3,xmm7 - pxor xmm2,xmm0 -db 102,15,56,0,220 - movdqu xmm5,[edx] - pxor xmm3,xmm1 - jnz NEAR L$001enc_loop - movdqa xmm4,[96+ebp] - movdqa xmm0,[112+ebp] -db 102,15,56,0,226 - pxor xmm4,xmm5 -db 102,15,56,0,195 - movdqa xmm1,[64+ecx*1+ebx] - pxor xmm0,xmm4 -db 102,15,56,0,193 - ret -align 16 -__vpaes_schedule_core: - add ebp,DWORD [esp] - movdqu xmm0,[esi] - movdqa xmm2,[320+ebp] - movdqa xmm3,xmm0 - lea ebx,[ebp] - movdqa [4+esp],xmm2 - call __vpaes_schedule_transform - movdqa xmm7,xmm0 - test edi,edi - jnz NEAR L$002schedule_am_decrypting - movdqu [edx],xmm0 - jmp NEAR L$003schedule_go -L$002schedule_am_decrypting: - movdqa xmm1,[256+ecx*1+ebp] -db 102,15,56,0,217 - movdqu [edx],xmm3 - xor ecx,48 -L$003schedule_go: - cmp eax,192 - ja NEAR L$004schedule_256 -L$005schedule_128: - mov eax,10 -L$006loop_schedule_128: - call __vpaes_schedule_round - dec eax - jz NEAR L$007schedule_mangle_last - call __vpaes_schedule_mangle - jmp NEAR L$006loop_schedule_128 -align 16 -L$004schedule_256: - movdqu xmm0,[16+esi] - call __vpaes_schedule_transform - mov eax,7 -L$008loop_schedule_256: - call __vpaes_schedule_mangle - movdqa xmm6,xmm0 - call __vpaes_schedule_round - dec eax - jz NEAR L$007schedule_mangle_last - call __vpaes_schedule_mangle - pshufd xmm0,xmm0,255 - movdqa [20+esp],xmm7 - movdqa xmm7,xmm6 - call L$_vpaes_schedule_low_round - movdqa xmm7,[20+esp] - jmp NEAR L$008loop_schedule_256 -align 16 -L$007schedule_mangle_last: - lea ebx,[384+ebp] - test edi,edi - jnz NEAR L$009schedule_mangle_last_dec - movdqa xmm1,[256+ecx*1+ebp] -db 102,15,56,0,193 - lea ebx,[352+ebp] - add edx,32 -L$009schedule_mangle_last_dec: - add edx,-16 - pxor xmm0,[336+ebp] - call __vpaes_schedule_transform - movdqu [edx],xmm0 - pxor xmm0,xmm0 - pxor xmm1,xmm1 - pxor xmm2,xmm2 - pxor xmm3,xmm3 - pxor xmm4,xmm4 - pxor xmm5,xmm5 - pxor xmm6,xmm6 - pxor xmm7,xmm7 - ret -align 16 -__vpaes_schedule_round: - movdqa xmm2,[8+esp] - pxor xmm1,xmm1 -db 102,15,58,15,202,15 -db 102,15,58,15,210,15 - pxor xmm7,xmm1 - pshufd xmm0,xmm0,255 -db 102,15,58,15,192,1 - movdqa [8+esp],xmm2 -L$_vpaes_schedule_low_round: - movdqa xmm1,xmm7 - pslldq xmm7,4 - pxor xmm7,xmm1 - movdqa xmm1,xmm7 - pslldq xmm7,8 - pxor xmm7,xmm1 - pxor xmm7,[336+ebp] - movdqa xmm4,[ebp-16] - movdqa xmm5,[ebp-48] - movdqa xmm1,xmm4 - pandn xmm1,xmm0 - psrld xmm1,4 - pand xmm0,xmm4 - movdqa xmm2,[ebp-32] -db 102,15,56,0,208 - pxor xmm0,xmm1 - movdqa xmm3,xmm5 -db 102,15,56,0,217 - pxor xmm3,xmm2 - movdqa xmm4,xmm5 -db 102,15,56,0,224 - pxor xmm4,xmm2 - movdqa xmm2,xmm5 -db 102,15,56,0,211 - pxor xmm2,xmm0 - movdqa xmm3,xmm5 -db 102,15,56,0,220 - pxor xmm3,xmm1 - movdqa xmm4,[32+ebp] -db 102,15,56,0,226 - movdqa xmm0,[48+ebp] -db 102,15,56,0,195 - pxor xmm0,xmm4 - pxor xmm0,xmm7 - movdqa xmm7,xmm0 - ret -align 16 -__vpaes_schedule_transform: - movdqa xmm2,[ebp-16] - movdqa xmm1,xmm2 - pandn xmm1,xmm0 - psrld xmm1,4 - pand xmm0,xmm2 - movdqa xmm2,[ebx] -db 102,15,56,0,208 - movdqa xmm0,[16+ebx] -db 102,15,56,0,193 - pxor xmm0,xmm2 - ret -align 16 -__vpaes_schedule_mangle: - movdqa xmm4,xmm0 - movdqa xmm5,[128+ebp] - test edi,edi - jnz NEAR L$010schedule_mangle_dec - add edx,16 - pxor xmm4,[336+ebp] -db 102,15,56,0,229 - movdqa xmm3,xmm4 -db 102,15,56,0,229 - pxor xmm3,xmm4 -db 102,15,56,0,229 - pxor xmm3,xmm4 - jmp NEAR L$011schedule_mangle_both -align 16 -L$010schedule_mangle_dec: - movdqa xmm2,[ebp-16] - lea esi,[ebp] - movdqa xmm1,xmm2 - pandn xmm1,xmm4 - psrld xmm1,4 - pand xmm4,xmm2 - movdqa xmm2,[esi] -db 102,15,56,0,212 - movdqa xmm3,[16+esi] -db 102,15,56,0,217 - pxor xmm3,xmm2 -db 102,15,56,0,221 - movdqa xmm2,[32+esi] -db 102,15,56,0,212 - pxor xmm2,xmm3 - movdqa xmm3,[48+esi] -db 102,15,56,0,217 - pxor xmm3,xmm2 -db 102,15,56,0,221 - movdqa xmm2,[64+esi] -db 102,15,56,0,212 - pxor xmm2,xmm3 - movdqa xmm3,[80+esi] -db 102,15,56,0,217 - pxor xmm3,xmm2 -db 102,15,56,0,221 - movdqa xmm2,[96+esi] -db 102,15,56,0,212 - pxor xmm2,xmm3 - movdqa xmm3,[112+esi] -db 102,15,56,0,217 - pxor xmm3,xmm2 - add edx,-16 -L$011schedule_mangle_both: - movdqa xmm1,[256+ecx*1+ebp] -db 102,15,56,0,217 - add ecx,-16 - and ecx,48 - movdqu [edx],xmm3 - ret -global _GFp_vpaes_set_encrypt_key -align 16 -_GFp_vpaes_set_encrypt_key: -L$_GFp_vpaes_set_encrypt_key_begin: - push ebp - push ebx - push esi - push edi - mov esi,DWORD [20+esp] - lea ebx,[esp-56] - mov eax,DWORD [24+esp] - and ebx,-16 - mov edx,DWORD [28+esp] - xchg ebx,esp - mov DWORD [48+esp],ebx - mov ebx,eax - shr ebx,5 - add ebx,5 - mov DWORD [240+edx],ebx - mov ecx,48 - mov edi,0 - lea ebp,[(L$_vpaes_consts+0x30-L$012pic_point)] - call __vpaes_schedule_core -L$012pic_point: - mov esp,DWORD [48+esp] - xor eax,eax - pop edi - pop esi - pop ebx - pop ebp - ret -global _GFp_vpaes_encrypt -align 16 -_GFp_vpaes_encrypt: -L$_GFp_vpaes_encrypt_begin: - push ebp - push ebx - push esi - push edi - lea ebp,[(L$_vpaes_consts+0x30-L$013pic_point)] - call __vpaes_preheat -L$013pic_point: - mov esi,DWORD [20+esp] - lea ebx,[esp-56] - mov edi,DWORD [24+esp] - and ebx,-16 - mov edx,DWORD [28+esp] - xchg ebx,esp - mov DWORD [48+esp],ebx - movdqu xmm0,[esi] - call __vpaes_encrypt_core - movdqu [edi],xmm0 - mov esp,DWORD [48+esp] - pop edi - pop esi - pop ebx - pop ebp - ret diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/tmp/x86_64-mont5-nasm.asm temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/tmp/x86_64-mont5-nasm.asm --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/tmp/x86_64-mont5-nasm.asm 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/tmp/x86_64-mont5-nasm.asm 1970-01-01 00:00:00.000000000 +0000 @@ -1,4031 +0,0 @@ -; This file is generated from a similarly-named Perl script in the BoringSSL -; source tree. Do not edit by hand. - -default rel -%define XMMWORD -%define YMMWORD -%define ZMMWORD -section .text code align=64 - - -EXTERN GFp_ia32cap_P - -global GFp_bn_mul_mont_gather5 - -ALIGN 64 -GFp_bn_mul_mont_gather5: - mov QWORD[8+rsp],rdi ;WIN64 prologue - mov QWORD[16+rsp],rsi - mov rax,rsp -$L$SEH_begin_GFp_bn_mul_mont_gather5: - mov rdi,rcx - mov rsi,rdx - mov rdx,r8 - mov rcx,r9 - mov r8,QWORD[40+rsp] - mov r9,QWORD[48+rsp] - - - - mov r9d,r9d - mov rax,rsp - - test r9d,7 - jnz NEAR $L$mul_enter - lea r11,[GFp_ia32cap_P] - mov r11d,DWORD[8+r11] - jmp NEAR $L$mul4x_enter - -ALIGN 16 -$L$mul_enter: - movd xmm5,DWORD[56+rsp] - push rbx - - push rbp - - push r12 - - push r13 - - push r14 - - push r15 - - - neg r9 - mov r11,rsp - lea r10,[((-280))+r9*8+rsp] - neg r9 - and r10,-1024 - - - - - - - - - - sub r11,r10 - and r11,-4096 - lea rsp,[r11*1+r10] - mov r11,QWORD[rsp] - cmp rsp,r10 - ja NEAR $L$mul_page_walk - jmp NEAR $L$mul_page_walk_done - -$L$mul_page_walk: - lea rsp,[((-4096))+rsp] - mov r11,QWORD[rsp] - cmp rsp,r10 - ja NEAR $L$mul_page_walk -$L$mul_page_walk_done: - - lea r10,[$L$inc] - mov QWORD[8+r9*8+rsp],rax - -$L$mul_body: - - lea r12,[128+rdx] - movdqa xmm0,XMMWORD[r10] - movdqa xmm1,XMMWORD[16+r10] - lea r10,[((24-112))+r9*8+rsp] - and r10,-16 - - pshufd xmm5,xmm5,0 - movdqa xmm4,xmm1 - movdqa xmm2,xmm1 - paddd xmm1,xmm0 - pcmpeqd xmm0,xmm5 -DB 0x67 - movdqa xmm3,xmm4 - paddd xmm2,xmm1 - pcmpeqd xmm1,xmm5 - movdqa XMMWORD[112+r10],xmm0 - movdqa xmm0,xmm4 - - paddd xmm3,xmm2 - pcmpeqd xmm2,xmm5 - movdqa XMMWORD[128+r10],xmm1 - movdqa xmm1,xmm4 - - paddd xmm0,xmm3 - pcmpeqd xmm3,xmm5 - movdqa XMMWORD[144+r10],xmm2 - movdqa xmm2,xmm4 - - paddd xmm1,xmm0 - pcmpeqd xmm0,xmm5 - movdqa XMMWORD[160+r10],xmm3 - movdqa xmm3,xmm4 - paddd xmm2,xmm1 - pcmpeqd xmm1,xmm5 - movdqa XMMWORD[176+r10],xmm0 - movdqa xmm0,xmm4 - - paddd xmm3,xmm2 - pcmpeqd xmm2,xmm5 - movdqa XMMWORD[192+r10],xmm1 - movdqa xmm1,xmm4 - - paddd xmm0,xmm3 - pcmpeqd xmm3,xmm5 - movdqa XMMWORD[208+r10],xmm2 - movdqa xmm2,xmm4 - - paddd xmm1,xmm0 - pcmpeqd xmm0,xmm5 - movdqa XMMWORD[224+r10],xmm3 - movdqa xmm3,xmm4 - paddd xmm2,xmm1 - pcmpeqd xmm1,xmm5 - movdqa XMMWORD[240+r10],xmm0 - movdqa xmm0,xmm4 - - paddd xmm3,xmm2 - pcmpeqd xmm2,xmm5 - movdqa XMMWORD[256+r10],xmm1 - movdqa xmm1,xmm4 - - paddd xmm0,xmm3 - pcmpeqd xmm3,xmm5 - movdqa XMMWORD[272+r10],xmm2 - movdqa xmm2,xmm4 - - paddd xmm1,xmm0 - pcmpeqd xmm0,xmm5 - movdqa XMMWORD[288+r10],xmm3 - movdqa xmm3,xmm4 - paddd xmm2,xmm1 - pcmpeqd xmm1,xmm5 - movdqa XMMWORD[304+r10],xmm0 - - paddd xmm3,xmm2 -DB 0x67 - pcmpeqd xmm2,xmm5 - movdqa XMMWORD[320+r10],xmm1 - - pcmpeqd xmm3,xmm5 - movdqa XMMWORD[336+r10],xmm2 - pand xmm0,XMMWORD[64+r12] - - pand xmm1,XMMWORD[80+r12] - pand xmm2,XMMWORD[96+r12] - movdqa XMMWORD[352+r10],xmm3 - pand xmm3,XMMWORD[112+r12] - por xmm0,xmm2 - por xmm1,xmm3 - movdqa xmm4,XMMWORD[((-128))+r12] - movdqa xmm5,XMMWORD[((-112))+r12] - movdqa xmm2,XMMWORD[((-96))+r12] - pand xmm4,XMMWORD[112+r10] - movdqa xmm3,XMMWORD[((-80))+r12] - pand xmm5,XMMWORD[128+r10] - por xmm0,xmm4 - pand xmm2,XMMWORD[144+r10] - por xmm1,xmm5 - pand xmm3,XMMWORD[160+r10] - por xmm0,xmm2 - por xmm1,xmm3 - movdqa xmm4,XMMWORD[((-64))+r12] - movdqa xmm5,XMMWORD[((-48))+r12] - movdqa xmm2,XMMWORD[((-32))+r12] - pand xmm4,XMMWORD[176+r10] - movdqa xmm3,XMMWORD[((-16))+r12] - pand xmm5,XMMWORD[192+r10] - por xmm0,xmm4 - pand xmm2,XMMWORD[208+r10] - por xmm1,xmm5 - pand xmm3,XMMWORD[224+r10] - por xmm0,xmm2 - por xmm1,xmm3 - movdqa xmm4,XMMWORD[r12] - movdqa xmm5,XMMWORD[16+r12] - movdqa xmm2,XMMWORD[32+r12] - pand xmm4,XMMWORD[240+r10] - movdqa xmm3,XMMWORD[48+r12] - pand xmm5,XMMWORD[256+r10] - por xmm0,xmm4 - pand xmm2,XMMWORD[272+r10] - por xmm1,xmm5 - pand xmm3,XMMWORD[288+r10] - por xmm0,xmm2 - por xmm1,xmm3 - por xmm0,xmm1 - pshufd xmm1,xmm0,0x4e - por xmm0,xmm1 - lea r12,[256+r12] -DB 102,72,15,126,195 - - mov r8,QWORD[r8] - mov rax,QWORD[rsi] - - xor r14,r14 - xor r15,r15 - - mov rbp,r8 - mul rbx - mov r10,rax - mov rax,QWORD[rcx] - - imul rbp,r10 - mov r11,rdx - - mul rbp - add r10,rax - mov rax,QWORD[8+rsi] - adc rdx,0 - mov r13,rdx - - lea r15,[1+r15] - jmp NEAR $L$1st_enter - -ALIGN 16 -$L$1st: - add r13,rax - mov rax,QWORD[r15*8+rsi] - adc rdx,0 - add r13,r11 - mov r11,r10 - adc rdx,0 - mov QWORD[((-16))+r15*8+rsp],r13 - mov r13,rdx - -$L$1st_enter: - mul rbx - add r11,rax - mov rax,QWORD[r15*8+rcx] - adc rdx,0 - lea r15,[1+r15] - mov r10,rdx - - mul rbp - cmp r15,r9 - jne NEAR $L$1st - - - add r13,rax - adc rdx,0 - add r13,r11 - adc rdx,0 - mov QWORD[((-16))+r9*8+rsp],r13 - mov r13,rdx - mov r11,r10 - - xor rdx,rdx - add r13,r11 - adc rdx,0 - mov QWORD[((-8))+r9*8+rsp],r13 - mov QWORD[r9*8+rsp],rdx - - lea r14,[1+r14] - jmp NEAR $L$outer -ALIGN 16 -$L$outer: - lea rdx,[((24+128))+r9*8+rsp] - and rdx,-16 - pxor xmm4,xmm4 - pxor xmm5,xmm5 - movdqa xmm0,XMMWORD[((-128))+r12] - movdqa xmm1,XMMWORD[((-112))+r12] - movdqa xmm2,XMMWORD[((-96))+r12] - movdqa xmm3,XMMWORD[((-80))+r12] - pand xmm0,XMMWORD[((-128))+rdx] - pand xmm1,XMMWORD[((-112))+rdx] - por xmm4,xmm0 - pand xmm2,XMMWORD[((-96))+rdx] - por xmm5,xmm1 - pand xmm3,XMMWORD[((-80))+rdx] - por xmm4,xmm2 - por xmm5,xmm3 - movdqa xmm0,XMMWORD[((-64))+r12] - movdqa xmm1,XMMWORD[((-48))+r12] - movdqa xmm2,XMMWORD[((-32))+r12] - movdqa xmm3,XMMWORD[((-16))+r12] - pand xmm0,XMMWORD[((-64))+rdx] - pand xmm1,XMMWORD[((-48))+rdx] - por xmm4,xmm0 - pand xmm2,XMMWORD[((-32))+rdx] - por xmm5,xmm1 - pand xmm3,XMMWORD[((-16))+rdx] - por xmm4,xmm2 - por xmm5,xmm3 - movdqa xmm0,XMMWORD[r12] - movdqa xmm1,XMMWORD[16+r12] - movdqa xmm2,XMMWORD[32+r12] - movdqa xmm3,XMMWORD[48+r12] - pand xmm0,XMMWORD[rdx] - pand xmm1,XMMWORD[16+rdx] - por xmm4,xmm0 - pand xmm2,XMMWORD[32+rdx] - por xmm5,xmm1 - pand xmm3,XMMWORD[48+rdx] - por xmm4,xmm2 - por xmm5,xmm3 - movdqa xmm0,XMMWORD[64+r12] - movdqa xmm1,XMMWORD[80+r12] - movdqa xmm2,XMMWORD[96+r12] - movdqa xmm3,XMMWORD[112+r12] - pand xmm0,XMMWORD[64+rdx] - pand xmm1,XMMWORD[80+rdx] - por xmm4,xmm0 - pand xmm2,XMMWORD[96+rdx] - por xmm5,xmm1 - pand xmm3,XMMWORD[112+rdx] - por xmm4,xmm2 - por xmm5,xmm3 - por xmm4,xmm5 - pshufd xmm0,xmm4,0x4e - por xmm0,xmm4 - lea r12,[256+r12] - - mov rax,QWORD[rsi] -DB 102,72,15,126,195 - - xor r15,r15 - mov rbp,r8 - mov r10,QWORD[rsp] - - mul rbx - add r10,rax - mov rax,QWORD[rcx] - adc rdx,0 - - imul rbp,r10 - mov r11,rdx - - mul rbp - add r10,rax - mov rax,QWORD[8+rsi] - adc rdx,0 - mov r10,QWORD[8+rsp] - mov r13,rdx - - lea r15,[1+r15] - jmp NEAR $L$inner_enter - -ALIGN 16 -$L$inner: - add r13,rax - mov rax,QWORD[r15*8+rsi] - adc rdx,0 - add r13,r10 - mov r10,QWORD[r15*8+rsp] - adc rdx,0 - mov QWORD[((-16))+r15*8+rsp],r13 - mov r13,rdx - -$L$inner_enter: - mul rbx - add r11,rax - mov rax,QWORD[r15*8+rcx] - adc rdx,0 - add r10,r11 - mov r11,rdx - adc r11,0 - lea r15,[1+r15] - - mul rbp - cmp r15,r9 - jne NEAR $L$inner - - add r13,rax - adc rdx,0 - add r13,r10 - mov r10,QWORD[r9*8+rsp] - adc rdx,0 - mov QWORD[((-16))+r9*8+rsp],r13 - mov r13,rdx - - xor rdx,rdx - add r13,r11 - adc rdx,0 - add r13,r10 - adc rdx,0 - mov QWORD[((-8))+r9*8+rsp],r13 - mov QWORD[r9*8+rsp],rdx - - lea r14,[1+r14] - cmp r14,r9 - jb NEAR $L$outer - - xor r14,r14 - mov rax,QWORD[rsp] - lea rsi,[rsp] - mov r15,r9 - jmp NEAR $L$sub -ALIGN 16 -$L$sub: sbb rax,QWORD[r14*8+rcx] - mov QWORD[r14*8+rdi],rax - mov rax,QWORD[8+r14*8+rsi] - lea r14,[1+r14] - dec r15 - jnz NEAR $L$sub - - sbb rax,0 - mov rbx,-1 - xor rbx,rax - xor r14,r14 - mov r15,r9 - -$L$copy: - mov rcx,QWORD[r14*8+rdi] - mov rdx,QWORD[r14*8+rsp] - and rcx,rbx - and rdx,rax - mov QWORD[r14*8+rsp],r14 - or rdx,rcx - mov QWORD[r14*8+rdi],rdx - lea r14,[1+r14] - sub r15,1 - jnz NEAR $L$copy - - mov rsi,QWORD[8+r9*8+rsp] - - mov rax,1 - - mov r15,QWORD[((-48))+rsi] - - mov r14,QWORD[((-40))+rsi] - - mov r13,QWORD[((-32))+rsi] - - mov r12,QWORD[((-24))+rsi] - - mov rbp,QWORD[((-16))+rsi] - - mov rbx,QWORD[((-8))+rsi] - - lea rsp,[rsi] - -$L$mul_epilogue: - mov rdi,QWORD[8+rsp] ;WIN64 epilogue - mov rsi,QWORD[16+rsp] - DB 0F3h,0C3h ;repret - -$L$SEH_end_GFp_bn_mul_mont_gather5: - -ALIGN 32 -bn_mul4x_mont_gather5: - mov QWORD[8+rsp],rdi ;WIN64 prologue - mov QWORD[16+rsp],rsi - mov rax,rsp -$L$SEH_begin_bn_mul4x_mont_gather5: - mov rdi,rcx - mov rsi,rdx - mov rdx,r8 - mov rcx,r9 - mov r8,QWORD[40+rsp] - mov r9,QWORD[48+rsp] - - - -DB 0x67 - mov rax,rsp - -$L$mul4x_enter: - and r11d,0x80108 - cmp r11d,0x80108 - je NEAR $L$mulx4x_enter - push rbx - - push rbp - - push r12 - - push r13 - - push r14 - - push r15 - -$L$mul4x_prologue: - -DB 0x67 - shl r9d,3 - lea r10,[r9*2+r9] - neg r9 - - - - - - - - - - - lea r11,[((-320))+r9*2+rsp] - mov rbp,rsp - sub r11,rdi - and r11,4095 - cmp r10,r11 - jb NEAR $L$mul4xsp_alt - sub rbp,r11 - lea rbp,[((-320))+r9*2+rbp] - jmp NEAR $L$mul4xsp_done - -ALIGN 32 -$L$mul4xsp_alt: - lea r10,[((4096-320))+r9*2] - lea rbp,[((-320))+r9*2+rbp] - sub r11,r10 - mov r10,0 - cmovc r11,r10 - sub rbp,r11 -$L$mul4xsp_done: - and rbp,-64 - mov r11,rsp - sub r11,rbp - and r11,-4096 - lea rsp,[rbp*1+r11] - mov r10,QWORD[rsp] - cmp rsp,rbp - ja NEAR $L$mul4x_page_walk - jmp NEAR $L$mul4x_page_walk_done - -$L$mul4x_page_walk: - lea rsp,[((-4096))+rsp] - mov r10,QWORD[rsp] - cmp rsp,rbp - ja NEAR $L$mul4x_page_walk -$L$mul4x_page_walk_done: - - neg r9 - - mov QWORD[40+rsp],rax - -$L$mul4x_body: - - call mul4x_internal - - mov rsi,QWORD[40+rsp] - - mov rax,1 - - mov r15,QWORD[((-48))+rsi] - - mov r14,QWORD[((-40))+rsi] - - mov r13,QWORD[((-32))+rsi] - - mov r12,QWORD[((-24))+rsi] - - mov rbp,QWORD[((-16))+rsi] - - mov rbx,QWORD[((-8))+rsi] - - lea rsp,[rsi] - -$L$mul4x_epilogue: - mov rdi,QWORD[8+rsp] ;WIN64 epilogue - mov rsi,QWORD[16+rsp] - DB 0F3h,0C3h ;repret - -$L$SEH_end_bn_mul4x_mont_gather5: - - -ALIGN 32 -mul4x_internal: - - shl r9,5 - movd xmm5,DWORD[56+rax] - lea rax,[$L$inc] - lea r13,[128+r9*1+rdx] - shr r9,5 - movdqa xmm0,XMMWORD[rax] - movdqa xmm1,XMMWORD[16+rax] - lea r10,[((88-112))+r9*1+rsp] - lea r12,[128+rdx] - - pshufd xmm5,xmm5,0 - movdqa xmm4,xmm1 -DB 0x67,0x67 - movdqa xmm2,xmm1 - paddd xmm1,xmm0 - pcmpeqd xmm0,xmm5 -DB 0x67 - movdqa xmm3,xmm4 - paddd xmm2,xmm1 - pcmpeqd xmm1,xmm5 - movdqa XMMWORD[112+r10],xmm0 - movdqa xmm0,xmm4 - - paddd xmm3,xmm2 - pcmpeqd xmm2,xmm5 - movdqa XMMWORD[128+r10],xmm1 - movdqa xmm1,xmm4 - - paddd xmm0,xmm3 - pcmpeqd xmm3,xmm5 - movdqa XMMWORD[144+r10],xmm2 - movdqa xmm2,xmm4 - - paddd xmm1,xmm0 - pcmpeqd xmm0,xmm5 - movdqa XMMWORD[160+r10],xmm3 - movdqa xmm3,xmm4 - paddd xmm2,xmm1 - pcmpeqd xmm1,xmm5 - movdqa XMMWORD[176+r10],xmm0 - movdqa xmm0,xmm4 - - paddd xmm3,xmm2 - pcmpeqd xmm2,xmm5 - movdqa XMMWORD[192+r10],xmm1 - movdqa xmm1,xmm4 - - paddd xmm0,xmm3 - pcmpeqd xmm3,xmm5 - movdqa XMMWORD[208+r10],xmm2 - movdqa xmm2,xmm4 - - paddd xmm1,xmm0 - pcmpeqd xmm0,xmm5 - movdqa XMMWORD[224+r10],xmm3 - movdqa xmm3,xmm4 - paddd xmm2,xmm1 - pcmpeqd xmm1,xmm5 - movdqa XMMWORD[240+r10],xmm0 - movdqa xmm0,xmm4 - - paddd xmm3,xmm2 - pcmpeqd xmm2,xmm5 - movdqa XMMWORD[256+r10],xmm1 - movdqa xmm1,xmm4 - - paddd xmm0,xmm3 - pcmpeqd xmm3,xmm5 - movdqa XMMWORD[272+r10],xmm2 - movdqa xmm2,xmm4 - - paddd xmm1,xmm0 - pcmpeqd xmm0,xmm5 - movdqa XMMWORD[288+r10],xmm3 - movdqa xmm3,xmm4 - paddd xmm2,xmm1 - pcmpeqd xmm1,xmm5 - movdqa XMMWORD[304+r10],xmm0 - - paddd xmm3,xmm2 -DB 0x67 - pcmpeqd xmm2,xmm5 - movdqa XMMWORD[320+r10],xmm1 - - pcmpeqd xmm3,xmm5 - movdqa XMMWORD[336+r10],xmm2 - pand xmm0,XMMWORD[64+r12] - - pand xmm1,XMMWORD[80+r12] - pand xmm2,XMMWORD[96+r12] - movdqa XMMWORD[352+r10],xmm3 - pand xmm3,XMMWORD[112+r12] - por xmm0,xmm2 - por xmm1,xmm3 - movdqa xmm4,XMMWORD[((-128))+r12] - movdqa xmm5,XMMWORD[((-112))+r12] - movdqa xmm2,XMMWORD[((-96))+r12] - pand xmm4,XMMWORD[112+r10] - movdqa xmm3,XMMWORD[((-80))+r12] - pand xmm5,XMMWORD[128+r10] - por xmm0,xmm4 - pand xmm2,XMMWORD[144+r10] - por xmm1,xmm5 - pand xmm3,XMMWORD[160+r10] - por xmm0,xmm2 - por xmm1,xmm3 - movdqa xmm4,XMMWORD[((-64))+r12] - movdqa xmm5,XMMWORD[((-48))+r12] - movdqa xmm2,XMMWORD[((-32))+r12] - pand xmm4,XMMWORD[176+r10] - movdqa xmm3,XMMWORD[((-16))+r12] - pand xmm5,XMMWORD[192+r10] - por xmm0,xmm4 - pand xmm2,XMMWORD[208+r10] - por xmm1,xmm5 - pand xmm3,XMMWORD[224+r10] - por xmm0,xmm2 - por xmm1,xmm3 - movdqa xmm4,XMMWORD[r12] - movdqa xmm5,XMMWORD[16+r12] - movdqa xmm2,XMMWORD[32+r12] - pand xmm4,XMMWORD[240+r10] - movdqa xmm3,XMMWORD[48+r12] - pand xmm5,XMMWORD[256+r10] - por xmm0,xmm4 - pand xmm2,XMMWORD[272+r10] - por xmm1,xmm5 - pand xmm3,XMMWORD[288+r10] - por xmm0,xmm2 - por xmm1,xmm3 - por xmm0,xmm1 - pshufd xmm1,xmm0,0x4e - por xmm0,xmm1 - lea r12,[256+r12] -DB 102,72,15,126,195 - - mov QWORD[((16+8))+rsp],r13 - mov QWORD[((56+8))+rsp],rdi - - mov r8,QWORD[r8] - mov rax,QWORD[rsi] - lea rsi,[r9*1+rsi] - neg r9 - - mov rbp,r8 - mul rbx - mov r10,rax - mov rax,QWORD[rcx] - - imul rbp,r10 - lea r14,[((64+8))+rsp] - mov r11,rdx - - mul rbp - add r10,rax - mov rax,QWORD[8+r9*1+rsi] - adc rdx,0 - mov rdi,rdx - - mul rbx - add r11,rax - mov rax,QWORD[8+rcx] - adc rdx,0 - mov r10,rdx - - mul rbp - add rdi,rax - mov rax,QWORD[16+r9*1+rsi] - adc rdx,0 - add rdi,r11 - lea r15,[32+r9] - lea rcx,[32+rcx] - adc rdx,0 - mov QWORD[r14],rdi - mov r13,rdx - jmp NEAR $L$1st4x - -ALIGN 32 -$L$1st4x: - mul rbx - add r10,rax - mov rax,QWORD[((-16))+rcx] - lea r14,[32+r14] - adc rdx,0 - mov r11,rdx - - mul rbp - add r13,rax - mov rax,QWORD[((-8))+r15*1+rsi] - adc rdx,0 - add r13,r10 - adc rdx,0 - mov QWORD[((-24))+r14],r13 - mov rdi,rdx - - mul rbx - add r11,rax - mov rax,QWORD[((-8))+rcx] - adc rdx,0 - mov r10,rdx - - mul rbp - add rdi,rax - mov rax,QWORD[r15*1+rsi] - adc rdx,0 - add rdi,r11 - adc rdx,0 - mov QWORD[((-16))+r14],rdi - mov r13,rdx - - mul rbx - add r10,rax - mov rax,QWORD[rcx] - adc rdx,0 - mov r11,rdx - - mul rbp - add r13,rax - mov rax,QWORD[8+r15*1+rsi] - adc rdx,0 - add r13,r10 - adc rdx,0 - mov QWORD[((-8))+r14],r13 - mov rdi,rdx - - mul rbx - add r11,rax - mov rax,QWORD[8+rcx] - adc rdx,0 - mov r10,rdx - - mul rbp - add rdi,rax - mov rax,QWORD[16+r15*1+rsi] - adc rdx,0 - add rdi,r11 - lea rcx,[32+rcx] - adc rdx,0 - mov QWORD[r14],rdi - mov r13,rdx - - add r15,32 - jnz NEAR $L$1st4x - - mul rbx - add r10,rax - mov rax,QWORD[((-16))+rcx] - lea r14,[32+r14] - adc rdx,0 - mov r11,rdx - - mul rbp - add r13,rax - mov rax,QWORD[((-8))+rsi] - adc rdx,0 - add r13,r10 - adc rdx,0 - mov QWORD[((-24))+r14],r13 - mov rdi,rdx - - mul rbx - add r11,rax - mov rax,QWORD[((-8))+rcx] - adc rdx,0 - mov r10,rdx - - mul rbp - add rdi,rax - mov rax,QWORD[r9*1+rsi] - adc rdx,0 - add rdi,r11 - adc rdx,0 - mov QWORD[((-16))+r14],rdi - mov r13,rdx - - lea rcx,[r9*1+rcx] - - xor rdi,rdi - add r13,r10 - adc rdi,0 - mov QWORD[((-8))+r14],r13 - - jmp NEAR $L$outer4x - -ALIGN 32 -$L$outer4x: - lea rdx,[((16+128))+r14] - pxor xmm4,xmm4 - pxor xmm5,xmm5 - movdqa xmm0,XMMWORD[((-128))+r12] - movdqa xmm1,XMMWORD[((-112))+r12] - movdqa xmm2,XMMWORD[((-96))+r12] - movdqa xmm3,XMMWORD[((-80))+r12] - pand xmm0,XMMWORD[((-128))+rdx] - pand xmm1,XMMWORD[((-112))+rdx] - por xmm4,xmm0 - pand xmm2,XMMWORD[((-96))+rdx] - por xmm5,xmm1 - pand xmm3,XMMWORD[((-80))+rdx] - por xmm4,xmm2 - por xmm5,xmm3 - movdqa xmm0,XMMWORD[((-64))+r12] - movdqa xmm1,XMMWORD[((-48))+r12] - movdqa xmm2,XMMWORD[((-32))+r12] - movdqa xmm3,XMMWORD[((-16))+r12] - pand xmm0,XMMWORD[((-64))+rdx] - pand xmm1,XMMWORD[((-48))+rdx] - por xmm4,xmm0 - pand xmm2,XMMWORD[((-32))+rdx] - por xmm5,xmm1 - pand xmm3,XMMWORD[((-16))+rdx] - por xmm4,xmm2 - por xmm5,xmm3 - movdqa xmm0,XMMWORD[r12] - movdqa xmm1,XMMWORD[16+r12] - movdqa xmm2,XMMWORD[32+r12] - movdqa xmm3,XMMWORD[48+r12] - pand xmm0,XMMWORD[rdx] - pand xmm1,XMMWORD[16+rdx] - por xmm4,xmm0 - pand xmm2,XMMWORD[32+rdx] - por xmm5,xmm1 - pand xmm3,XMMWORD[48+rdx] - por xmm4,xmm2 - por xmm5,xmm3 - movdqa xmm0,XMMWORD[64+r12] - movdqa xmm1,XMMWORD[80+r12] - movdqa xmm2,XMMWORD[96+r12] - movdqa xmm3,XMMWORD[112+r12] - pand xmm0,XMMWORD[64+rdx] - pand xmm1,XMMWORD[80+rdx] - por xmm4,xmm0 - pand xmm2,XMMWORD[96+rdx] - por xmm5,xmm1 - pand xmm3,XMMWORD[112+rdx] - por xmm4,xmm2 - por xmm5,xmm3 - por xmm4,xmm5 - pshufd xmm0,xmm4,0x4e - por xmm0,xmm4 - lea r12,[256+r12] -DB 102,72,15,126,195 - - mov r10,QWORD[r9*1+r14] - mov rbp,r8 - mul rbx - add r10,rax - mov rax,QWORD[rcx] - adc rdx,0 - - imul rbp,r10 - mov r11,rdx - mov QWORD[r14],rdi - - lea r14,[r9*1+r14] - - mul rbp - add r10,rax - mov rax,QWORD[8+r9*1+rsi] - adc rdx,0 - mov rdi,rdx - - mul rbx - add r11,rax - mov rax,QWORD[8+rcx] - adc rdx,0 - add r11,QWORD[8+r14] - adc rdx,0 - mov r10,rdx - - mul rbp - add rdi,rax - mov rax,QWORD[16+r9*1+rsi] - adc rdx,0 - add rdi,r11 - lea r15,[32+r9] - lea rcx,[32+rcx] - adc rdx,0 - mov r13,rdx - jmp NEAR $L$inner4x - -ALIGN 32 -$L$inner4x: - mul rbx - add r10,rax - mov rax,QWORD[((-16))+rcx] - adc rdx,0 - add r10,QWORD[16+r14] - lea r14,[32+r14] - adc rdx,0 - mov r11,rdx - - mul rbp - add r13,rax - mov rax,QWORD[((-8))+r15*1+rsi] - adc rdx,0 - add r13,r10 - adc rdx,0 - mov QWORD[((-32))+r14],rdi - mov rdi,rdx - - mul rbx - add r11,rax - mov rax,QWORD[((-8))+rcx] - adc rdx,0 - add r11,QWORD[((-8))+r14] - adc rdx,0 - mov r10,rdx - - mul rbp - add rdi,rax - mov rax,QWORD[r15*1+rsi] - adc rdx,0 - add rdi,r11 - adc rdx,0 - mov QWORD[((-24))+r14],r13 - mov r13,rdx - - mul rbx - add r10,rax - mov rax,QWORD[rcx] - adc rdx,0 - add r10,QWORD[r14] - adc rdx,0 - mov r11,rdx - - mul rbp - add r13,rax - mov rax,QWORD[8+r15*1+rsi] - adc rdx,0 - add r13,r10 - adc rdx,0 - mov QWORD[((-16))+r14],rdi - mov rdi,rdx - - mul rbx - add r11,rax - mov rax,QWORD[8+rcx] - adc rdx,0 - add r11,QWORD[8+r14] - adc rdx,0 - mov r10,rdx - - mul rbp - add rdi,rax - mov rax,QWORD[16+r15*1+rsi] - adc rdx,0 - add rdi,r11 - lea rcx,[32+rcx] - adc rdx,0 - mov QWORD[((-8))+r14],r13 - mov r13,rdx - - add r15,32 - jnz NEAR $L$inner4x - - mul rbx - add r10,rax - mov rax,QWORD[((-16))+rcx] - adc rdx,0 - add r10,QWORD[16+r14] - lea r14,[32+r14] - adc rdx,0 - mov r11,rdx - - mul rbp - add r13,rax - mov rax,QWORD[((-8))+rsi] - adc rdx,0 - add r13,r10 - adc rdx,0 - mov QWORD[((-32))+r14],rdi - mov rdi,rdx - - mul rbx - add r11,rax - mov rax,rbp - mov rbp,QWORD[((-8))+rcx] - adc rdx,0 - add r11,QWORD[((-8))+r14] - adc rdx,0 - mov r10,rdx - - mul rbp - add rdi,rax - mov rax,QWORD[r9*1+rsi] - adc rdx,0 - add rdi,r11 - adc rdx,0 - mov QWORD[((-24))+r14],r13 - mov r13,rdx - - mov QWORD[((-16))+r14],rdi - lea rcx,[r9*1+rcx] - - xor rdi,rdi - add r13,r10 - adc rdi,0 - add r13,QWORD[r14] - adc rdi,0 - mov QWORD[((-8))+r14],r13 - - cmp r12,QWORD[((16+8))+rsp] - jb NEAR $L$outer4x - xor rax,rax - sub rbp,r13 - adc r15,r15 - or rdi,r15 - sub rax,rdi - lea rbx,[r9*1+r14] - mov r12,QWORD[rcx] - lea rbp,[rcx] - mov rcx,r9 - sar rcx,3+2 - mov rdi,QWORD[((56+8))+rsp] - dec r12 - xor r10,r10 - mov r13,QWORD[8+rbp] - mov r14,QWORD[16+rbp] - mov r15,QWORD[24+rbp] - jmp NEAR $L$sqr4x_sub_entry - - -global GFp_bn_power5 - -ALIGN 32 -GFp_bn_power5: - mov QWORD[8+rsp],rdi ;WIN64 prologue - mov QWORD[16+rsp],rsi - mov rax,rsp -$L$SEH_begin_GFp_bn_power5: - mov rdi,rcx - mov rsi,rdx - mov rdx,r8 - mov rcx,r9 - mov r8,QWORD[40+rsp] - mov r9,QWORD[48+rsp] - - - - mov rax,rsp - - lea r11,[GFp_ia32cap_P] - mov r11d,DWORD[8+r11] - and r11d,0x80108 - cmp r11d,0x80108 - je NEAR $L$powerx5_enter - push rbx - - push rbp - - push r12 - - push r13 - - push r14 - - push r15 - -$L$power5_prologue: - - shl r9d,3 - lea r10d,[r9*2+r9] - neg r9 - mov r8,QWORD[r8] - - - - - - - - - lea r11,[((-320))+r9*2+rsp] - mov rbp,rsp - sub r11,rdi - and r11,4095 - cmp r10,r11 - jb NEAR $L$pwr_sp_alt - sub rbp,r11 - lea rbp,[((-320))+r9*2+rbp] - jmp NEAR $L$pwr_sp_done - -ALIGN 32 -$L$pwr_sp_alt: - lea r10,[((4096-320))+r9*2] - lea rbp,[((-320))+r9*2+rbp] - sub r11,r10 - mov r10,0 - cmovc r11,r10 - sub rbp,r11 -$L$pwr_sp_done: - and rbp,-64 - mov r11,rsp - sub r11,rbp - and r11,-4096 - lea rsp,[rbp*1+r11] - mov r10,QWORD[rsp] - cmp rsp,rbp - ja NEAR $L$pwr_page_walk - jmp NEAR $L$pwr_page_walk_done - -$L$pwr_page_walk: - lea rsp,[((-4096))+rsp] - mov r10,QWORD[rsp] - cmp rsp,rbp - ja NEAR $L$pwr_page_walk -$L$pwr_page_walk_done: - - mov r10,r9 - neg r9 - - - - - - - - - - - mov QWORD[32+rsp],r8 - mov QWORD[40+rsp],rax - -$L$power5_body: -DB 102,72,15,110,207 -DB 102,72,15,110,209 -DB 102,73,15,110,218 -DB 102,72,15,110,226 - - call __bn_sqr8x_internal - call __bn_post4x_internal - call __bn_sqr8x_internal - call __bn_post4x_internal - call __bn_sqr8x_internal - call __bn_post4x_internal - call __bn_sqr8x_internal - call __bn_post4x_internal - call __bn_sqr8x_internal - call __bn_post4x_internal - -DB 102,72,15,126,209 -DB 102,72,15,126,226 - mov rdi,rsi - mov rax,QWORD[40+rsp] - lea r8,[32+rsp] - - call mul4x_internal - - mov rsi,QWORD[40+rsp] - - mov rax,1 - mov r15,QWORD[((-48))+rsi] - - mov r14,QWORD[((-40))+rsi] - - mov r13,QWORD[((-32))+rsi] - - mov r12,QWORD[((-24))+rsi] - - mov rbp,QWORD[((-16))+rsi] - - mov rbx,QWORD[((-8))+rsi] - - lea rsp,[rsi] - -$L$power5_epilogue: - mov rdi,QWORD[8+rsp] ;WIN64 epilogue - mov rsi,QWORD[16+rsp] - DB 0F3h,0C3h ;repret - -$L$SEH_end_GFp_bn_power5: - -global GFp_bn_sqr8x_internal - - -ALIGN 32 -GFp_bn_sqr8x_internal: -__bn_sqr8x_internal: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - lea rbp,[32+r10] - lea rsi,[r9*1+rsi] - - mov rcx,r9 - - - mov r14,QWORD[((-32))+rbp*1+rsi] - lea rdi,[((48+8))+r9*2+rsp] - mov rax,QWORD[((-24))+rbp*1+rsi] - lea rdi,[((-32))+rbp*1+rdi] - mov rbx,QWORD[((-16))+rbp*1+rsi] - mov r15,rax - - mul r14 - mov r10,rax - mov rax,rbx - mov r11,rdx - mov QWORD[((-24))+rbp*1+rdi],r10 - - mul r14 - add r11,rax - mov rax,rbx - adc rdx,0 - mov QWORD[((-16))+rbp*1+rdi],r11 - mov r10,rdx - - - mov rbx,QWORD[((-8))+rbp*1+rsi] - mul r15 - mov r12,rax - mov rax,rbx - mov r13,rdx - - lea rcx,[rbp] - mul r14 - add r10,rax - mov rax,rbx - mov r11,rdx - adc r11,0 - add r10,r12 - adc r11,0 - mov QWORD[((-8))+rcx*1+rdi],r10 - jmp NEAR $L$sqr4x_1st - -ALIGN 32 -$L$sqr4x_1st: - mov rbx,QWORD[rcx*1+rsi] - mul r15 - add r13,rax - mov rax,rbx - mov r12,rdx - adc r12,0 - - mul r14 - add r11,rax - mov rax,rbx - mov rbx,QWORD[8+rcx*1+rsi] - mov r10,rdx - adc r10,0 - add r11,r13 - adc r10,0 - - - mul r15 - add r12,rax - mov rax,rbx - mov QWORD[rcx*1+rdi],r11 - mov r13,rdx - adc r13,0 - - mul r14 - add r10,rax - mov rax,rbx - mov rbx,QWORD[16+rcx*1+rsi] - mov r11,rdx - adc r11,0 - add r10,r12 - adc r11,0 - - mul r15 - add r13,rax - mov rax,rbx - mov QWORD[8+rcx*1+rdi],r10 - mov r12,rdx - adc r12,0 - - mul r14 - add r11,rax - mov rax,rbx - mov rbx,QWORD[24+rcx*1+rsi] - mov r10,rdx - adc r10,0 - add r11,r13 - adc r10,0 - - - mul r15 - add r12,rax - mov rax,rbx - mov QWORD[16+rcx*1+rdi],r11 - mov r13,rdx - adc r13,0 - lea rcx,[32+rcx] - - mul r14 - add r10,rax - mov rax,rbx - mov r11,rdx - adc r11,0 - add r10,r12 - adc r11,0 - mov QWORD[((-8))+rcx*1+rdi],r10 - - cmp rcx,0 - jne NEAR $L$sqr4x_1st - - mul r15 - add r13,rax - lea rbp,[16+rbp] - adc rdx,0 - add r13,r11 - adc rdx,0 - - mov QWORD[rdi],r13 - mov r12,rdx - mov QWORD[8+rdi],rdx - jmp NEAR $L$sqr4x_outer - -ALIGN 32 -$L$sqr4x_outer: - mov r14,QWORD[((-32))+rbp*1+rsi] - lea rdi,[((48+8))+r9*2+rsp] - mov rax,QWORD[((-24))+rbp*1+rsi] - lea rdi,[((-32))+rbp*1+rdi] - mov rbx,QWORD[((-16))+rbp*1+rsi] - mov r15,rax - - mul r14 - mov r10,QWORD[((-24))+rbp*1+rdi] - add r10,rax - mov rax,rbx - adc rdx,0 - mov QWORD[((-24))+rbp*1+rdi],r10 - mov r11,rdx - - mul r14 - add r11,rax - mov rax,rbx - adc rdx,0 - add r11,QWORD[((-16))+rbp*1+rdi] - mov r10,rdx - adc r10,0 - mov QWORD[((-16))+rbp*1+rdi],r11 - - xor r12,r12 - - mov rbx,QWORD[((-8))+rbp*1+rsi] - mul r15 - add r12,rax - mov rax,rbx - adc rdx,0 - add r12,QWORD[((-8))+rbp*1+rdi] - mov r13,rdx - adc r13,0 - - mul r14 - add r10,rax - mov rax,rbx - adc rdx,0 - add r10,r12 - mov r11,rdx - adc r11,0 - mov QWORD[((-8))+rbp*1+rdi],r10 - - lea rcx,[rbp] - jmp NEAR $L$sqr4x_inner - -ALIGN 32 -$L$sqr4x_inner: - mov rbx,QWORD[rcx*1+rsi] - mul r15 - add r13,rax - mov rax,rbx - mov r12,rdx - adc r12,0 - add r13,QWORD[rcx*1+rdi] - adc r12,0 - -DB 0x67 - mul r14 - add r11,rax - mov rax,rbx - mov rbx,QWORD[8+rcx*1+rsi] - mov r10,rdx - adc r10,0 - add r11,r13 - adc r10,0 - - mul r15 - add r12,rax - mov QWORD[rcx*1+rdi],r11 - mov rax,rbx - mov r13,rdx - adc r13,0 - add r12,QWORD[8+rcx*1+rdi] - lea rcx,[16+rcx] - adc r13,0 - - mul r14 - add r10,rax - mov rax,rbx - adc rdx,0 - add r10,r12 - mov r11,rdx - adc r11,0 - mov QWORD[((-8))+rcx*1+rdi],r10 - - cmp rcx,0 - jne NEAR $L$sqr4x_inner - -DB 0x67 - mul r15 - add r13,rax - adc rdx,0 - add r13,r11 - adc rdx,0 - - mov QWORD[rdi],r13 - mov r12,rdx - mov QWORD[8+rdi],rdx - - add rbp,16 - jnz NEAR $L$sqr4x_outer - - - mov r14,QWORD[((-32))+rsi] - lea rdi,[((48+8))+r9*2+rsp] - mov rax,QWORD[((-24))+rsi] - lea rdi,[((-32))+rbp*1+rdi] - mov rbx,QWORD[((-16))+rsi] - mov r15,rax - - mul r14 - add r10,rax - mov rax,rbx - mov r11,rdx - adc r11,0 - - mul r14 - add r11,rax - mov rax,rbx - mov QWORD[((-24))+rdi],r10 - mov r10,rdx - adc r10,0 - add r11,r13 - mov rbx,QWORD[((-8))+rsi] - adc r10,0 - - mul r15 - add r12,rax - mov rax,rbx - mov QWORD[((-16))+rdi],r11 - mov r13,rdx - adc r13,0 - - mul r14 - add r10,rax - mov rax,rbx - mov r11,rdx - adc r11,0 - add r10,r12 - adc r11,0 - mov QWORD[((-8))+rdi],r10 - - mul r15 - add r13,rax - mov rax,QWORD[((-16))+rsi] - adc rdx,0 - add r13,r11 - adc rdx,0 - - mov QWORD[rdi],r13 - mov r12,rdx - mov QWORD[8+rdi],rdx - - mul rbx - add rbp,16 - xor r14,r14 - sub rbp,r9 - xor r15,r15 - - add rax,r12 - adc rdx,0 - mov QWORD[8+rdi],rax - mov QWORD[16+rdi],rdx - mov QWORD[24+rdi],r15 - - mov rax,QWORD[((-16))+rbp*1+rsi] - lea rdi,[((48+8))+rsp] - xor r10,r10 - mov r11,QWORD[8+rdi] - - lea r12,[r10*2+r14] - shr r10,63 - lea r13,[r11*2+rcx] - shr r11,63 - or r13,r10 - mov r10,QWORD[16+rdi] - mov r14,r11 - mul rax - neg r15 - mov r11,QWORD[24+rdi] - adc r12,rax - mov rax,QWORD[((-8))+rbp*1+rsi] - mov QWORD[rdi],r12 - adc r13,rdx - - lea rbx,[r10*2+r14] - mov QWORD[8+rdi],r13 - sbb r15,r15 - shr r10,63 - lea r8,[r11*2+rcx] - shr r11,63 - or r8,r10 - mov r10,QWORD[32+rdi] - mov r14,r11 - mul rax - neg r15 - mov r11,QWORD[40+rdi] - adc rbx,rax - mov rax,QWORD[rbp*1+rsi] - mov QWORD[16+rdi],rbx - adc r8,rdx - lea rbp,[16+rbp] - mov QWORD[24+rdi],r8 - sbb r15,r15 - lea rdi,[64+rdi] - jmp NEAR $L$sqr4x_shift_n_add - -ALIGN 32 -$L$sqr4x_shift_n_add: - lea r12,[r10*2+r14] - shr r10,63 - lea r13,[r11*2+rcx] - shr r11,63 - or r13,r10 - mov r10,QWORD[((-16))+rdi] - mov r14,r11 - mul rax - neg r15 - mov r11,QWORD[((-8))+rdi] - adc r12,rax - mov rax,QWORD[((-8))+rbp*1+rsi] - mov QWORD[((-32))+rdi],r12 - adc r13,rdx - - lea rbx,[r10*2+r14] - mov QWORD[((-24))+rdi],r13 - sbb r15,r15 - shr r10,63 - lea r8,[r11*2+rcx] - shr r11,63 - or r8,r10 - mov r10,QWORD[rdi] - mov r14,r11 - mul rax - neg r15 - mov r11,QWORD[8+rdi] - adc rbx,rax - mov rax,QWORD[rbp*1+rsi] - mov QWORD[((-16))+rdi],rbx - adc r8,rdx - - lea r12,[r10*2+r14] - mov QWORD[((-8))+rdi],r8 - sbb r15,r15 - shr r10,63 - lea r13,[r11*2+rcx] - shr r11,63 - or r13,r10 - mov r10,QWORD[16+rdi] - mov r14,r11 - mul rax - neg r15 - mov r11,QWORD[24+rdi] - adc r12,rax - mov rax,QWORD[8+rbp*1+rsi] - mov QWORD[rdi],r12 - adc r13,rdx - - lea rbx,[r10*2+r14] - mov QWORD[8+rdi],r13 - sbb r15,r15 - shr r10,63 - lea r8,[r11*2+rcx] - shr r11,63 - or r8,r10 - mov r10,QWORD[32+rdi] - mov r14,r11 - mul rax - neg r15 - mov r11,QWORD[40+rdi] - adc rbx,rax - mov rax,QWORD[16+rbp*1+rsi] - mov QWORD[16+rdi],rbx - adc r8,rdx - mov QWORD[24+rdi],r8 - sbb r15,r15 - lea rdi,[64+rdi] - add rbp,32 - jnz NEAR $L$sqr4x_shift_n_add - - lea r12,[r10*2+r14] -DB 0x67 - shr r10,63 - lea r13,[r11*2+rcx] - shr r11,63 - or r13,r10 - mov r10,QWORD[((-16))+rdi] - mov r14,r11 - mul rax - neg r15 - mov r11,QWORD[((-8))+rdi] - adc r12,rax - mov rax,QWORD[((-8))+rsi] - mov QWORD[((-32))+rdi],r12 - adc r13,rdx - - lea rbx,[r10*2+r14] - mov QWORD[((-24))+rdi],r13 - sbb r15,r15 - shr r10,63 - lea r8,[r11*2+rcx] - shr r11,63 - or r8,r10 - mul rax - neg r15 - adc rbx,rax - adc r8,rdx - mov QWORD[((-16))+rdi],rbx - mov QWORD[((-8))+rdi],r8 -DB 102,72,15,126,213 -__bn_sqr8x_reduction: - xor rax,rax - lea rcx,[rbp*1+r9] - lea rdx,[((48+8))+r9*2+rsp] - mov QWORD[((0+8))+rsp],rcx - lea rdi,[((48+8))+r9*1+rsp] - mov QWORD[((8+8))+rsp],rdx - neg r9 - jmp NEAR $L$8x_reduction_loop - -ALIGN 32 -$L$8x_reduction_loop: - lea rdi,[r9*1+rdi] -DB 0x66 - mov rbx,QWORD[rdi] - mov r9,QWORD[8+rdi] - mov r10,QWORD[16+rdi] - mov r11,QWORD[24+rdi] - mov r12,QWORD[32+rdi] - mov r13,QWORD[40+rdi] - mov r14,QWORD[48+rdi] - mov r15,QWORD[56+rdi] - mov QWORD[rdx],rax - lea rdi,[64+rdi] - -DB 0x67 - mov r8,rbx - imul rbx,QWORD[((32+8))+rsp] - mov rax,QWORD[rbp] - mov ecx,8 - jmp NEAR $L$8x_reduce - -ALIGN 32 -$L$8x_reduce: - mul rbx - mov rax,QWORD[8+rbp] - neg r8 - mov r8,rdx - adc r8,0 - - mul rbx - add r9,rax - mov rax,QWORD[16+rbp] - adc rdx,0 - add r8,r9 - mov QWORD[((48-8+8))+rcx*8+rsp],rbx - mov r9,rdx - adc r9,0 - - mul rbx - add r10,rax - mov rax,QWORD[24+rbp] - adc rdx,0 - add r9,r10 - mov rsi,QWORD[((32+8))+rsp] - mov r10,rdx - adc r10,0 - - mul rbx - add r11,rax - mov rax,QWORD[32+rbp] - adc rdx,0 - imul rsi,r8 - add r10,r11 - mov r11,rdx - adc r11,0 - - mul rbx - add r12,rax - mov rax,QWORD[40+rbp] - adc rdx,0 - add r11,r12 - mov r12,rdx - adc r12,0 - - mul rbx - add r13,rax - mov rax,QWORD[48+rbp] - adc rdx,0 - add r12,r13 - mov r13,rdx - adc r13,0 - - mul rbx - add r14,rax - mov rax,QWORD[56+rbp] - adc rdx,0 - add r13,r14 - mov r14,rdx - adc r14,0 - - mul rbx - mov rbx,rsi - add r15,rax - mov rax,QWORD[rbp] - adc rdx,0 - add r14,r15 - mov r15,rdx - adc r15,0 - - dec ecx - jnz NEAR $L$8x_reduce - - lea rbp,[64+rbp] - xor rax,rax - mov rdx,QWORD[((8+8))+rsp] - cmp rbp,QWORD[((0+8))+rsp] - jae NEAR $L$8x_no_tail - -DB 0x66 - add r8,QWORD[rdi] - adc r9,QWORD[8+rdi] - adc r10,QWORD[16+rdi] - adc r11,QWORD[24+rdi] - adc r12,QWORD[32+rdi] - adc r13,QWORD[40+rdi] - adc r14,QWORD[48+rdi] - adc r15,QWORD[56+rdi] - sbb rsi,rsi - - mov rbx,QWORD[((48+56+8))+rsp] - mov ecx,8 - mov rax,QWORD[rbp] - jmp NEAR $L$8x_tail - -ALIGN 32 -$L$8x_tail: - mul rbx - add r8,rax - mov rax,QWORD[8+rbp] - mov QWORD[rdi],r8 - mov r8,rdx - adc r8,0 - - mul rbx - add r9,rax - mov rax,QWORD[16+rbp] - adc rdx,0 - add r8,r9 - lea rdi,[8+rdi] - mov r9,rdx - adc r9,0 - - mul rbx - add r10,rax - mov rax,QWORD[24+rbp] - adc rdx,0 - add r9,r10 - mov r10,rdx - adc r10,0 - - mul rbx - add r11,rax - mov rax,QWORD[32+rbp] - adc rdx,0 - add r10,r11 - mov r11,rdx - adc r11,0 - - mul rbx - add r12,rax - mov rax,QWORD[40+rbp] - adc rdx,0 - add r11,r12 - mov r12,rdx - adc r12,0 - - mul rbx - add r13,rax - mov rax,QWORD[48+rbp] - adc rdx,0 - add r12,r13 - mov r13,rdx - adc r13,0 - - mul rbx - add r14,rax - mov rax,QWORD[56+rbp] - adc rdx,0 - add r13,r14 - mov r14,rdx - adc r14,0 - - mul rbx - mov rbx,QWORD[((48-16+8))+rcx*8+rsp] - add r15,rax - adc rdx,0 - add r14,r15 - mov rax,QWORD[rbp] - mov r15,rdx - adc r15,0 - - dec ecx - jnz NEAR $L$8x_tail - - lea rbp,[64+rbp] - mov rdx,QWORD[((8+8))+rsp] - cmp rbp,QWORD[((0+8))+rsp] - jae NEAR $L$8x_tail_done - - mov rbx,QWORD[((48+56+8))+rsp] - neg rsi - mov rax,QWORD[rbp] - adc r8,QWORD[rdi] - adc r9,QWORD[8+rdi] - adc r10,QWORD[16+rdi] - adc r11,QWORD[24+rdi] - adc r12,QWORD[32+rdi] - adc r13,QWORD[40+rdi] - adc r14,QWORD[48+rdi] - adc r15,QWORD[56+rdi] - sbb rsi,rsi - - mov ecx,8 - jmp NEAR $L$8x_tail - -ALIGN 32 -$L$8x_tail_done: - xor rax,rax - add r8,QWORD[rdx] - adc r9,0 - adc r10,0 - adc r11,0 - adc r12,0 - adc r13,0 - adc r14,0 - adc r15,0 - adc rax,0 - - neg rsi -$L$8x_no_tail: - adc r8,QWORD[rdi] - adc r9,QWORD[8+rdi] - adc r10,QWORD[16+rdi] - adc r11,QWORD[24+rdi] - adc r12,QWORD[32+rdi] - adc r13,QWORD[40+rdi] - adc r14,QWORD[48+rdi] - adc r15,QWORD[56+rdi] - adc rax,0 - mov rcx,QWORD[((-8))+rbp] - xor rsi,rsi - -DB 102,72,15,126,213 - - mov QWORD[rdi],r8 - mov QWORD[8+rdi],r9 -DB 102,73,15,126,217 - mov QWORD[16+rdi],r10 - mov QWORD[24+rdi],r11 - mov QWORD[32+rdi],r12 - mov QWORD[40+rdi],r13 - mov QWORD[48+rdi],r14 - mov QWORD[56+rdi],r15 - lea rdi,[64+rdi] - - cmp rdi,rdx - jb NEAR $L$8x_reduction_loop - DB 0F3h,0C3h ;repret - - - -ALIGN 32 -__bn_post4x_internal: - - mov r12,QWORD[rbp] - lea rbx,[r9*1+rdi] - mov rcx,r9 -DB 102,72,15,126,207 - neg rax -DB 102,72,15,126,206 - sar rcx,3+2 - dec r12 - xor r10,r10 - mov r13,QWORD[8+rbp] - mov r14,QWORD[16+rbp] - mov r15,QWORD[24+rbp] - jmp NEAR $L$sqr4x_sub_entry - -ALIGN 16 -$L$sqr4x_sub: - mov r12,QWORD[rbp] - mov r13,QWORD[8+rbp] - mov r14,QWORD[16+rbp] - mov r15,QWORD[24+rbp] -$L$sqr4x_sub_entry: - lea rbp,[32+rbp] - not r12 - not r13 - not r14 - not r15 - and r12,rax - and r13,rax - and r14,rax - and r15,rax - - neg r10 - adc r12,QWORD[rbx] - adc r13,QWORD[8+rbx] - adc r14,QWORD[16+rbx] - adc r15,QWORD[24+rbx] - mov QWORD[rdi],r12 - lea rbx,[32+rbx] - mov QWORD[8+rdi],r13 - sbb r10,r10 - mov QWORD[16+rdi],r14 - mov QWORD[24+rdi],r15 - lea rdi,[32+rdi] - - inc rcx - jnz NEAR $L$sqr4x_sub - - mov r10,r9 - neg r9 - DB 0F3h,0C3h ;repret - - -global GFp_bn_from_montgomery - -ALIGN 32 -GFp_bn_from_montgomery: - - test DWORD[48+rsp],7 - jz NEAR bn_from_mont8x - xor eax,eax - DB 0F3h,0C3h ;repret - - - - -ALIGN 32 -bn_from_mont8x: - mov QWORD[8+rsp],rdi ;WIN64 prologue - mov QWORD[16+rsp],rsi - mov rax,rsp -$L$SEH_begin_bn_from_mont8x: - mov rdi,rcx - mov rsi,rdx - mov rdx,r8 - mov rcx,r9 - mov r8,QWORD[40+rsp] - mov r9,QWORD[48+rsp] - - - -DB 0x67 - mov rax,rsp - - push rbx - - push rbp - - push r12 - - push r13 - - push r14 - - push r15 - -$L$from_prologue: - - shl r9d,3 - lea r10,[r9*2+r9] - neg r9 - mov r8,QWORD[r8] - - - - - - - - - lea r11,[((-320))+r9*2+rsp] - mov rbp,rsp - sub r11,rdi - and r11,4095 - cmp r10,r11 - jb NEAR $L$from_sp_alt - sub rbp,r11 - lea rbp,[((-320))+r9*2+rbp] - jmp NEAR $L$from_sp_done - -ALIGN 32 -$L$from_sp_alt: - lea r10,[((4096-320))+r9*2] - lea rbp,[((-320))+r9*2+rbp] - sub r11,r10 - mov r10,0 - cmovc r11,r10 - sub rbp,r11 -$L$from_sp_done: - and rbp,-64 - mov r11,rsp - sub r11,rbp - and r11,-4096 - lea rsp,[rbp*1+r11] - mov r10,QWORD[rsp] - cmp rsp,rbp - ja NEAR $L$from_page_walk - jmp NEAR $L$from_page_walk_done - -$L$from_page_walk: - lea rsp,[((-4096))+rsp] - mov r10,QWORD[rsp] - cmp rsp,rbp - ja NEAR $L$from_page_walk -$L$from_page_walk_done: - - mov r10,r9 - neg r9 - - - - - - - - - - - mov QWORD[32+rsp],r8 - mov QWORD[40+rsp],rax - -$L$from_body: - mov r11,r9 - lea rax,[48+rsp] - pxor xmm0,xmm0 - jmp NEAR $L$mul_by_1 - -ALIGN 32 -$L$mul_by_1: - movdqu xmm1,XMMWORD[rsi] - movdqu xmm2,XMMWORD[16+rsi] - movdqu xmm3,XMMWORD[32+rsi] - movdqa XMMWORD[r9*1+rax],xmm0 - movdqu xmm4,XMMWORD[48+rsi] - movdqa XMMWORD[16+r9*1+rax],xmm0 -DB 0x48,0x8d,0xb6,0x40,0x00,0x00,0x00 - movdqa XMMWORD[rax],xmm1 - movdqa XMMWORD[32+r9*1+rax],xmm0 - movdqa XMMWORD[16+rax],xmm2 - movdqa XMMWORD[48+r9*1+rax],xmm0 - movdqa XMMWORD[32+rax],xmm3 - movdqa XMMWORD[48+rax],xmm4 - lea rax,[64+rax] - sub r11,64 - jnz NEAR $L$mul_by_1 - -DB 102,72,15,110,207 -DB 102,72,15,110,209 -DB 0x67 - mov rbp,rcx -DB 102,73,15,110,218 - lea r11,[GFp_ia32cap_P] - mov r11d,DWORD[8+r11] - and r11d,0x80108 - cmp r11d,0x80108 - jne NEAR $L$from_mont_nox - - lea rdi,[r9*1+rax] - call __bn_sqrx8x_reduction - call __bn_postx4x_internal - - pxor xmm0,xmm0 - lea rax,[48+rsp] - jmp NEAR $L$from_mont_zero - -ALIGN 32 -$L$from_mont_nox: - call __bn_sqr8x_reduction - call __bn_post4x_internal - - pxor xmm0,xmm0 - lea rax,[48+rsp] - jmp NEAR $L$from_mont_zero - -ALIGN 32 -$L$from_mont_zero: - mov rsi,QWORD[40+rsp] - - movdqa XMMWORD[rax],xmm0 - movdqa XMMWORD[16+rax],xmm0 - movdqa XMMWORD[32+rax],xmm0 - movdqa XMMWORD[48+rax],xmm0 - lea rax,[64+rax] - sub r9,32 - jnz NEAR $L$from_mont_zero - - mov rax,1 - mov r15,QWORD[((-48))+rsi] - - mov r14,QWORD[((-40))+rsi] - - mov r13,QWORD[((-32))+rsi] - - mov r12,QWORD[((-24))+rsi] - - mov rbp,QWORD[((-16))+rsi] - - mov rbx,QWORD[((-8))+rsi] - - lea rsp,[rsi] - -$L$from_epilogue: - mov rdi,QWORD[8+rsp] ;WIN64 epilogue - mov rsi,QWORD[16+rsp] - DB 0F3h,0C3h ;repret - -$L$SEH_end_bn_from_mont8x: - -ALIGN 32 -bn_mulx4x_mont_gather5: - mov QWORD[8+rsp],rdi ;WIN64 prologue - mov QWORD[16+rsp],rsi - mov rax,rsp -$L$SEH_begin_bn_mulx4x_mont_gather5: - mov rdi,rcx - mov rsi,rdx - mov rdx,r8 - mov rcx,r9 - mov r8,QWORD[40+rsp] - mov r9,QWORD[48+rsp] - - - - mov rax,rsp - -$L$mulx4x_enter: - push rbx - - push rbp - - push r12 - - push r13 - - push r14 - - push r15 - -$L$mulx4x_prologue: - - shl r9d,3 - lea r10,[r9*2+r9] - neg r9 - mov r8,QWORD[r8] - - - - - - - - - - - lea r11,[((-320))+r9*2+rsp] - mov rbp,rsp - sub r11,rdi - and r11,4095 - cmp r10,r11 - jb NEAR $L$mulx4xsp_alt - sub rbp,r11 - lea rbp,[((-320))+r9*2+rbp] - jmp NEAR $L$mulx4xsp_done - -$L$mulx4xsp_alt: - lea r10,[((4096-320))+r9*2] - lea rbp,[((-320))+r9*2+rbp] - sub r11,r10 - mov r10,0 - cmovc r11,r10 - sub rbp,r11 -$L$mulx4xsp_done: - and rbp,-64 - mov r11,rsp - sub r11,rbp - and r11,-4096 - lea rsp,[rbp*1+r11] - mov r10,QWORD[rsp] - cmp rsp,rbp - ja NEAR $L$mulx4x_page_walk - jmp NEAR $L$mulx4x_page_walk_done - -$L$mulx4x_page_walk: - lea rsp,[((-4096))+rsp] - mov r10,QWORD[rsp] - cmp rsp,rbp - ja NEAR $L$mulx4x_page_walk -$L$mulx4x_page_walk_done: - - - - - - - - - - - - - - mov QWORD[32+rsp],r8 - mov QWORD[40+rsp],rax - -$L$mulx4x_body: - call mulx4x_internal - - mov rsi,QWORD[40+rsp] - - mov rax,1 - - mov r15,QWORD[((-48))+rsi] - - mov r14,QWORD[((-40))+rsi] - - mov r13,QWORD[((-32))+rsi] - - mov r12,QWORD[((-24))+rsi] - - mov rbp,QWORD[((-16))+rsi] - - mov rbx,QWORD[((-8))+rsi] - - lea rsp,[rsi] - -$L$mulx4x_epilogue: - mov rdi,QWORD[8+rsp] ;WIN64 epilogue - mov rsi,QWORD[16+rsp] - DB 0F3h,0C3h ;repret - -$L$SEH_end_bn_mulx4x_mont_gather5: - - -ALIGN 32 -mulx4x_internal: - - mov QWORD[8+rsp],r9 - mov r10,r9 - neg r9 - shl r9,5 - neg r10 - lea r13,[128+r9*1+rdx] - shr r9,5+5 - movd xmm5,DWORD[56+rax] - sub r9,1 - lea rax,[$L$inc] - mov QWORD[((16+8))+rsp],r13 - mov QWORD[((24+8))+rsp],r9 - mov QWORD[((56+8))+rsp],rdi - movdqa xmm0,XMMWORD[rax] - movdqa xmm1,XMMWORD[16+rax] - lea r10,[((88-112))+r10*1+rsp] - lea rdi,[128+rdx] - - pshufd xmm5,xmm5,0 - movdqa xmm4,xmm1 -DB 0x67 - movdqa xmm2,xmm1 -DB 0x67 - paddd xmm1,xmm0 - pcmpeqd xmm0,xmm5 - movdqa xmm3,xmm4 - paddd xmm2,xmm1 - pcmpeqd xmm1,xmm5 - movdqa XMMWORD[112+r10],xmm0 - movdqa xmm0,xmm4 - - paddd xmm3,xmm2 - pcmpeqd xmm2,xmm5 - movdqa XMMWORD[128+r10],xmm1 - movdqa xmm1,xmm4 - - paddd xmm0,xmm3 - pcmpeqd xmm3,xmm5 - movdqa XMMWORD[144+r10],xmm2 - movdqa xmm2,xmm4 - - paddd xmm1,xmm0 - pcmpeqd xmm0,xmm5 - movdqa XMMWORD[160+r10],xmm3 - movdqa xmm3,xmm4 - paddd xmm2,xmm1 - pcmpeqd xmm1,xmm5 - movdqa XMMWORD[176+r10],xmm0 - movdqa xmm0,xmm4 - - paddd xmm3,xmm2 - pcmpeqd xmm2,xmm5 - movdqa XMMWORD[192+r10],xmm1 - movdqa xmm1,xmm4 - - paddd xmm0,xmm3 - pcmpeqd xmm3,xmm5 - movdqa XMMWORD[208+r10],xmm2 - movdqa xmm2,xmm4 - - paddd xmm1,xmm0 - pcmpeqd xmm0,xmm5 - movdqa XMMWORD[224+r10],xmm3 - movdqa xmm3,xmm4 - paddd xmm2,xmm1 - pcmpeqd xmm1,xmm5 - movdqa XMMWORD[240+r10],xmm0 - movdqa xmm0,xmm4 - - paddd xmm3,xmm2 - pcmpeqd xmm2,xmm5 - movdqa XMMWORD[256+r10],xmm1 - movdqa xmm1,xmm4 - - paddd xmm0,xmm3 - pcmpeqd xmm3,xmm5 - movdqa XMMWORD[272+r10],xmm2 - movdqa xmm2,xmm4 - - paddd xmm1,xmm0 - pcmpeqd xmm0,xmm5 - movdqa XMMWORD[288+r10],xmm3 - movdqa xmm3,xmm4 -DB 0x67 - paddd xmm2,xmm1 - pcmpeqd xmm1,xmm5 - movdqa XMMWORD[304+r10],xmm0 - - paddd xmm3,xmm2 - pcmpeqd xmm2,xmm5 - movdqa XMMWORD[320+r10],xmm1 - - pcmpeqd xmm3,xmm5 - movdqa XMMWORD[336+r10],xmm2 - - pand xmm0,XMMWORD[64+rdi] - pand xmm1,XMMWORD[80+rdi] - pand xmm2,XMMWORD[96+rdi] - movdqa XMMWORD[352+r10],xmm3 - pand xmm3,XMMWORD[112+rdi] - por xmm0,xmm2 - por xmm1,xmm3 - movdqa xmm4,XMMWORD[((-128))+rdi] - movdqa xmm5,XMMWORD[((-112))+rdi] - movdqa xmm2,XMMWORD[((-96))+rdi] - pand xmm4,XMMWORD[112+r10] - movdqa xmm3,XMMWORD[((-80))+rdi] - pand xmm5,XMMWORD[128+r10] - por xmm0,xmm4 - pand xmm2,XMMWORD[144+r10] - por xmm1,xmm5 - pand xmm3,XMMWORD[160+r10] - por xmm0,xmm2 - por xmm1,xmm3 - movdqa xmm4,XMMWORD[((-64))+rdi] - movdqa xmm5,XMMWORD[((-48))+rdi] - movdqa xmm2,XMMWORD[((-32))+rdi] - pand xmm4,XMMWORD[176+r10] - movdqa xmm3,XMMWORD[((-16))+rdi] - pand xmm5,XMMWORD[192+r10] - por xmm0,xmm4 - pand xmm2,XMMWORD[208+r10] - por xmm1,xmm5 - pand xmm3,XMMWORD[224+r10] - por xmm0,xmm2 - por xmm1,xmm3 - movdqa xmm4,XMMWORD[rdi] - movdqa xmm5,XMMWORD[16+rdi] - movdqa xmm2,XMMWORD[32+rdi] - pand xmm4,XMMWORD[240+r10] - movdqa xmm3,XMMWORD[48+rdi] - pand xmm5,XMMWORD[256+r10] - por xmm0,xmm4 - pand xmm2,XMMWORD[272+r10] - por xmm1,xmm5 - pand xmm3,XMMWORD[288+r10] - por xmm0,xmm2 - por xmm1,xmm3 - pxor xmm0,xmm1 - pshufd xmm1,xmm0,0x4e - por xmm0,xmm1 - lea rdi,[256+rdi] -DB 102,72,15,126,194 - lea rbx,[((64+32+8))+rsp] - - mov r9,rdx - mulx rax,r8,QWORD[rsi] - mulx r12,r11,QWORD[8+rsi] - add r11,rax - mulx r13,rax,QWORD[16+rsi] - adc r12,rax - adc r13,0 - mulx r14,rax,QWORD[24+rsi] - - mov r15,r8 - imul r8,QWORD[((32+8))+rsp] - xor rbp,rbp - mov rdx,r8 - - mov QWORD[((8+8))+rsp],rdi - - lea rsi,[32+rsi] - adcx r13,rax - adcx r14,rbp - - mulx r10,rax,QWORD[rcx] - adcx r15,rax - adox r10,r11 - mulx r11,rax,QWORD[8+rcx] - adcx r10,rax - adox r11,r12 - mulx r12,rax,QWORD[16+rcx] - mov rdi,QWORD[((24+8))+rsp] - mov QWORD[((-32))+rbx],r10 - adcx r11,rax - adox r12,r13 - mulx r15,rax,QWORD[24+rcx] - mov rdx,r9 - mov QWORD[((-24))+rbx],r11 - adcx r12,rax - adox r15,rbp - lea rcx,[32+rcx] - mov QWORD[((-16))+rbx],r12 - jmp NEAR $L$mulx4x_1st - -ALIGN 32 -$L$mulx4x_1st: - adcx r15,rbp - mulx rax,r10,QWORD[rsi] - adcx r10,r14 - mulx r14,r11,QWORD[8+rsi] - adcx r11,rax - mulx rax,r12,QWORD[16+rsi] - adcx r12,r14 - mulx r14,r13,QWORD[24+rsi] -DB 0x67,0x67 - mov rdx,r8 - adcx r13,rax - adcx r14,rbp - lea rsi,[32+rsi] - lea rbx,[32+rbx] - - adox r10,r15 - mulx r15,rax,QWORD[rcx] - adcx r10,rax - adox r11,r15 - mulx r15,rax,QWORD[8+rcx] - adcx r11,rax - adox r12,r15 - mulx r15,rax,QWORD[16+rcx] - mov QWORD[((-40))+rbx],r10 - adcx r12,rax - mov QWORD[((-32))+rbx],r11 - adox r13,r15 - mulx r15,rax,QWORD[24+rcx] - mov rdx,r9 - mov QWORD[((-24))+rbx],r12 - adcx r13,rax - adox r15,rbp - lea rcx,[32+rcx] - mov QWORD[((-16))+rbx],r13 - - dec rdi - jnz NEAR $L$mulx4x_1st - - mov rax,QWORD[8+rsp] - adc r15,rbp - lea rsi,[rax*1+rsi] - add r14,r15 - mov rdi,QWORD[((8+8))+rsp] - adc rbp,rbp - mov QWORD[((-8))+rbx],r14 - jmp NEAR $L$mulx4x_outer - -ALIGN 32 -$L$mulx4x_outer: - lea r10,[((16-256))+rbx] - pxor xmm4,xmm4 -DB 0x67,0x67 - pxor xmm5,xmm5 - movdqa xmm0,XMMWORD[((-128))+rdi] - movdqa xmm1,XMMWORD[((-112))+rdi] - movdqa xmm2,XMMWORD[((-96))+rdi] - pand xmm0,XMMWORD[256+r10] - movdqa xmm3,XMMWORD[((-80))+rdi] - pand xmm1,XMMWORD[272+r10] - por xmm4,xmm0 - pand xmm2,XMMWORD[288+r10] - por xmm5,xmm1 - pand xmm3,XMMWORD[304+r10] - por xmm4,xmm2 - por xmm5,xmm3 - movdqa xmm0,XMMWORD[((-64))+rdi] - movdqa xmm1,XMMWORD[((-48))+rdi] - movdqa xmm2,XMMWORD[((-32))+rdi] - pand xmm0,XMMWORD[320+r10] - movdqa xmm3,XMMWORD[((-16))+rdi] - pand xmm1,XMMWORD[336+r10] - por xmm4,xmm0 - pand xmm2,XMMWORD[352+r10] - por xmm5,xmm1 - pand xmm3,XMMWORD[368+r10] - por xmm4,xmm2 - por xmm5,xmm3 - movdqa xmm0,XMMWORD[rdi] - movdqa xmm1,XMMWORD[16+rdi] - movdqa xmm2,XMMWORD[32+rdi] - pand xmm0,XMMWORD[384+r10] - movdqa xmm3,XMMWORD[48+rdi] - pand xmm1,XMMWORD[400+r10] - por xmm4,xmm0 - pand xmm2,XMMWORD[416+r10] - por xmm5,xmm1 - pand xmm3,XMMWORD[432+r10] - por xmm4,xmm2 - por xmm5,xmm3 - movdqa xmm0,XMMWORD[64+rdi] - movdqa xmm1,XMMWORD[80+rdi] - movdqa xmm2,XMMWORD[96+rdi] - pand xmm0,XMMWORD[448+r10] - movdqa xmm3,XMMWORD[112+rdi] - pand xmm1,XMMWORD[464+r10] - por xmm4,xmm0 - pand xmm2,XMMWORD[480+r10] - por xmm5,xmm1 - pand xmm3,XMMWORD[496+r10] - por xmm4,xmm2 - por xmm5,xmm3 - por xmm4,xmm5 - pshufd xmm0,xmm4,0x4e - por xmm0,xmm4 - lea rdi,[256+rdi] -DB 102,72,15,126,194 - - mov QWORD[rbx],rbp - lea rbx,[32+rax*1+rbx] - mulx r11,r8,QWORD[rsi] - xor rbp,rbp - mov r9,rdx - mulx r12,r14,QWORD[8+rsi] - adox r8,QWORD[((-32))+rbx] - adcx r11,r14 - mulx r13,r15,QWORD[16+rsi] - adox r11,QWORD[((-24))+rbx] - adcx r12,r15 - mulx r14,rdx,QWORD[24+rsi] - adox r12,QWORD[((-16))+rbx] - adcx r13,rdx - lea rcx,[rax*1+rcx] - lea rsi,[32+rsi] - adox r13,QWORD[((-8))+rbx] - adcx r14,rbp - adox r14,rbp - - mov r15,r8 - imul r8,QWORD[((32+8))+rsp] - - mov rdx,r8 - xor rbp,rbp - mov QWORD[((8+8))+rsp],rdi - - mulx r10,rax,QWORD[rcx] - adcx r15,rax - adox r10,r11 - mulx r11,rax,QWORD[8+rcx] - adcx r10,rax - adox r11,r12 - mulx r12,rax,QWORD[16+rcx] - adcx r11,rax - adox r12,r13 - mulx r15,rax,QWORD[24+rcx] - mov rdx,r9 - mov rdi,QWORD[((24+8))+rsp] - mov QWORD[((-32))+rbx],r10 - adcx r12,rax - mov QWORD[((-24))+rbx],r11 - adox r15,rbp - mov QWORD[((-16))+rbx],r12 - lea rcx,[32+rcx] - jmp NEAR $L$mulx4x_inner - -ALIGN 32 -$L$mulx4x_inner: - mulx rax,r10,QWORD[rsi] - adcx r15,rbp - adox r10,r14 - mulx r14,r11,QWORD[8+rsi] - adcx r10,QWORD[rbx] - adox r11,rax - mulx rax,r12,QWORD[16+rsi] - adcx r11,QWORD[8+rbx] - adox r12,r14 - mulx r14,r13,QWORD[24+rsi] - mov rdx,r8 - adcx r12,QWORD[16+rbx] - adox r13,rax - adcx r13,QWORD[24+rbx] - adox r14,rbp - lea rsi,[32+rsi] - lea rbx,[32+rbx] - adcx r14,rbp - - adox r10,r15 - mulx r15,rax,QWORD[rcx] - adcx r10,rax - adox r11,r15 - mulx r15,rax,QWORD[8+rcx] - adcx r11,rax - adox r12,r15 - mulx r15,rax,QWORD[16+rcx] - mov QWORD[((-40))+rbx],r10 - adcx r12,rax - adox r13,r15 - mov QWORD[((-32))+rbx],r11 - mulx r15,rax,QWORD[24+rcx] - mov rdx,r9 - lea rcx,[32+rcx] - mov QWORD[((-24))+rbx],r12 - adcx r13,rax - adox r15,rbp - mov QWORD[((-16))+rbx],r13 - - dec rdi - jnz NEAR $L$mulx4x_inner - - mov rax,QWORD[((0+8))+rsp] - adc r15,rbp - sub rdi,QWORD[rbx] - mov rdi,QWORD[((8+8))+rsp] - mov r10,QWORD[((16+8))+rsp] - adc r14,r15 - lea rsi,[rax*1+rsi] - adc rbp,rbp - mov QWORD[((-8))+rbx],r14 - - cmp rdi,r10 - jb NEAR $L$mulx4x_outer - - mov r10,QWORD[((-8))+rcx] - mov r8,rbp - mov r12,QWORD[rax*1+rcx] - lea rbp,[rax*1+rcx] - mov rcx,rax - lea rdi,[rax*1+rbx] - xor eax,eax - xor r15,r15 - sub r10,r14 - adc r15,r15 - or r8,r15 - sar rcx,3+2 - sub rax,r8 - mov rdx,QWORD[((56+8))+rsp] - dec r12 - mov r13,QWORD[8+rbp] - xor r8,r8 - mov r14,QWORD[16+rbp] - mov r15,QWORD[24+rbp] - jmp NEAR $L$sqrx4x_sub_entry - - - -ALIGN 32 -bn_powerx5: - mov QWORD[8+rsp],rdi ;WIN64 prologue - mov QWORD[16+rsp],rsi - mov rax,rsp -$L$SEH_begin_bn_powerx5: - mov rdi,rcx - mov rsi,rdx - mov rdx,r8 - mov rcx,r9 - mov r8,QWORD[40+rsp] - mov r9,QWORD[48+rsp] - - - - mov rax,rsp - -$L$powerx5_enter: - push rbx - - push rbp - - push r12 - - push r13 - - push r14 - - push r15 - -$L$powerx5_prologue: - - shl r9d,3 - lea r10,[r9*2+r9] - neg r9 - mov r8,QWORD[r8] - - - - - - - - - lea r11,[((-320))+r9*2+rsp] - mov rbp,rsp - sub r11,rdi - and r11,4095 - cmp r10,r11 - jb NEAR $L$pwrx_sp_alt - sub rbp,r11 - lea rbp,[((-320))+r9*2+rbp] - jmp NEAR $L$pwrx_sp_done - -ALIGN 32 -$L$pwrx_sp_alt: - lea r10,[((4096-320))+r9*2] - lea rbp,[((-320))+r9*2+rbp] - sub r11,r10 - mov r10,0 - cmovc r11,r10 - sub rbp,r11 -$L$pwrx_sp_done: - and rbp,-64 - mov r11,rsp - sub r11,rbp - and r11,-4096 - lea rsp,[rbp*1+r11] - mov r10,QWORD[rsp] - cmp rsp,rbp - ja NEAR $L$pwrx_page_walk - jmp NEAR $L$pwrx_page_walk_done - -$L$pwrx_page_walk: - lea rsp,[((-4096))+rsp] - mov r10,QWORD[rsp] - cmp rsp,rbp - ja NEAR $L$pwrx_page_walk -$L$pwrx_page_walk_done: - - mov r10,r9 - neg r9 - - - - - - - - - - - - - pxor xmm0,xmm0 -DB 102,72,15,110,207 -DB 102,72,15,110,209 -DB 102,73,15,110,218 -DB 102,72,15,110,226 - mov QWORD[32+rsp],r8 - mov QWORD[40+rsp],rax - -$L$powerx5_body: - - call __bn_sqrx8x_internal - call __bn_postx4x_internal - call __bn_sqrx8x_internal - call __bn_postx4x_internal - call __bn_sqrx8x_internal - call __bn_postx4x_internal - call __bn_sqrx8x_internal - call __bn_postx4x_internal - call __bn_sqrx8x_internal - call __bn_postx4x_internal - - mov r9,r10 - mov rdi,rsi -DB 102,72,15,126,209 -DB 102,72,15,126,226 - mov rax,QWORD[40+rsp] - - call mulx4x_internal - - mov rsi,QWORD[40+rsp] - - mov rax,1 - - mov r15,QWORD[((-48))+rsi] - - mov r14,QWORD[((-40))+rsi] - - mov r13,QWORD[((-32))+rsi] - - mov r12,QWORD[((-24))+rsi] - - mov rbp,QWORD[((-16))+rsi] - - mov rbx,QWORD[((-8))+rsi] - - lea rsp,[rsi] - -$L$powerx5_epilogue: - mov rdi,QWORD[8+rsp] ;WIN64 epilogue - mov rsi,QWORD[16+rsp] - DB 0F3h,0C3h ;repret - -$L$SEH_end_bn_powerx5: - -global GFp_bn_sqrx8x_internal - -ALIGN 32 -GFp_bn_sqrx8x_internal: -__bn_sqrx8x_internal: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - lea rdi,[((48+8))+rsp] - lea rbp,[r9*1+rsi] - mov QWORD[((0+8))+rsp],r9 - mov QWORD[((8+8))+rsp],rbp - jmp NEAR $L$sqr8x_zero_start - -ALIGN 32 -DB 0x66,0x66,0x66,0x2e,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00 -$L$sqrx8x_zero: -DB 0x3e - movdqa XMMWORD[rdi],xmm0 - movdqa XMMWORD[16+rdi],xmm0 - movdqa XMMWORD[32+rdi],xmm0 - movdqa XMMWORD[48+rdi],xmm0 -$L$sqr8x_zero_start: - movdqa XMMWORD[64+rdi],xmm0 - movdqa XMMWORD[80+rdi],xmm0 - movdqa XMMWORD[96+rdi],xmm0 - movdqa XMMWORD[112+rdi],xmm0 - lea rdi,[128+rdi] - sub r9,64 - jnz NEAR $L$sqrx8x_zero - - mov rdx,QWORD[rsi] - - xor r10,r10 - xor r11,r11 - xor r12,r12 - xor r13,r13 - xor r14,r14 - xor r15,r15 - lea rdi,[((48+8))+rsp] - xor rbp,rbp - jmp NEAR $L$sqrx8x_outer_loop - -ALIGN 32 -$L$sqrx8x_outer_loop: - mulx rax,r8,QWORD[8+rsi] - adcx r8,r9 - adox r10,rax - mulx rax,r9,QWORD[16+rsi] - adcx r9,r10 - adox r11,rax -DB 0xc4,0xe2,0xab,0xf6,0x86,0x18,0x00,0x00,0x00 - adcx r10,r11 - adox r12,rax -DB 0xc4,0xe2,0xa3,0xf6,0x86,0x20,0x00,0x00,0x00 - adcx r11,r12 - adox r13,rax - mulx rax,r12,QWORD[40+rsi] - adcx r12,r13 - adox r14,rax - mulx rax,r13,QWORD[48+rsi] - adcx r13,r14 - adox rax,r15 - mulx r15,r14,QWORD[56+rsi] - mov rdx,QWORD[8+rsi] - adcx r14,rax - adox r15,rbp - adc r15,QWORD[64+rdi] - mov QWORD[8+rdi],r8 - mov QWORD[16+rdi],r9 - sbb rcx,rcx - xor rbp,rbp - - - mulx rbx,r8,QWORD[16+rsi] - mulx rax,r9,QWORD[24+rsi] - adcx r8,r10 - adox r9,rbx - mulx rbx,r10,QWORD[32+rsi] - adcx r9,r11 - adox r10,rax -DB 0xc4,0xe2,0xa3,0xf6,0x86,0x28,0x00,0x00,0x00 - adcx r10,r12 - adox r11,rbx -DB 0xc4,0xe2,0x9b,0xf6,0x9e,0x30,0x00,0x00,0x00 - adcx r11,r13 - adox r12,r14 -DB 0xc4,0x62,0x93,0xf6,0xb6,0x38,0x00,0x00,0x00 - mov rdx,QWORD[16+rsi] - adcx r12,rax - adox r13,rbx - adcx r13,r15 - adox r14,rbp - adcx r14,rbp - - mov QWORD[24+rdi],r8 - mov QWORD[32+rdi],r9 - - mulx rbx,r8,QWORD[24+rsi] - mulx rax,r9,QWORD[32+rsi] - adcx r8,r10 - adox r9,rbx - mulx rbx,r10,QWORD[40+rsi] - adcx r9,r11 - adox r10,rax -DB 0xc4,0xe2,0xa3,0xf6,0x86,0x30,0x00,0x00,0x00 - adcx r10,r12 - adox r11,r13 -DB 0xc4,0x62,0x9b,0xf6,0xae,0x38,0x00,0x00,0x00 -DB 0x3e - mov rdx,QWORD[24+rsi] - adcx r11,rbx - adox r12,rax - adcx r12,r14 - mov QWORD[40+rdi],r8 - mov QWORD[48+rdi],r9 - mulx rax,r8,QWORD[32+rsi] - adox r13,rbp - adcx r13,rbp - - mulx rbx,r9,QWORD[40+rsi] - adcx r8,r10 - adox r9,rax - mulx rax,r10,QWORD[48+rsi] - adcx r9,r11 - adox r10,r12 - mulx r12,r11,QWORD[56+rsi] - mov rdx,QWORD[32+rsi] - mov r14,QWORD[40+rsi] - adcx r10,rbx - adox r11,rax - mov r15,QWORD[48+rsi] - adcx r11,r13 - adox r12,rbp - adcx r12,rbp - - mov QWORD[56+rdi],r8 - mov QWORD[64+rdi],r9 - - mulx rax,r9,r14 - mov r8,QWORD[56+rsi] - adcx r9,r10 - mulx rbx,r10,r15 - adox r10,rax - adcx r10,r11 - mulx rax,r11,r8 - mov rdx,r14 - adox r11,rbx - adcx r11,r12 - - adcx rax,rbp - - mulx rbx,r14,r15 - mulx r13,r12,r8 - mov rdx,r15 - lea rsi,[64+rsi] - adcx r11,r14 - adox r12,rbx - adcx r12,rax - adox r13,rbp - -DB 0x67,0x67 - mulx r14,r8,r8 - adcx r13,r8 - adcx r14,rbp - - cmp rsi,QWORD[((8+8))+rsp] - je NEAR $L$sqrx8x_outer_break - - neg rcx - mov rcx,-8 - mov r15,rbp - mov r8,QWORD[64+rdi] - adcx r9,QWORD[72+rdi] - adcx r10,QWORD[80+rdi] - adcx r11,QWORD[88+rdi] - adc r12,QWORD[96+rdi] - adc r13,QWORD[104+rdi] - adc r14,QWORD[112+rdi] - adc r15,QWORD[120+rdi] - lea rbp,[rsi] - lea rdi,[128+rdi] - sbb rax,rax - - mov rdx,QWORD[((-64))+rsi] - mov QWORD[((16+8))+rsp],rax - mov QWORD[((24+8))+rsp],rdi - - - xor eax,eax - jmp NEAR $L$sqrx8x_loop - -ALIGN 32 -$L$sqrx8x_loop: - mov rbx,r8 - mulx r8,rax,QWORD[rbp] - adcx rbx,rax - adox r8,r9 - - mulx r9,rax,QWORD[8+rbp] - adcx r8,rax - adox r9,r10 - - mulx r10,rax,QWORD[16+rbp] - adcx r9,rax - adox r10,r11 - - mulx r11,rax,QWORD[24+rbp] - adcx r10,rax - adox r11,r12 - -DB 0xc4,0x62,0xfb,0xf6,0xa5,0x20,0x00,0x00,0x00 - adcx r11,rax - adox r12,r13 - - mulx r13,rax,QWORD[40+rbp] - adcx r12,rax - adox r13,r14 - - mulx r14,rax,QWORD[48+rbp] - mov QWORD[rcx*8+rdi],rbx - mov ebx,0 - adcx r13,rax - adox r14,r15 - -DB 0xc4,0x62,0xfb,0xf6,0xbd,0x38,0x00,0x00,0x00 - mov rdx,QWORD[8+rcx*8+rsi] - adcx r14,rax - adox r15,rbx - adcx r15,rbx - -DB 0x67 - inc rcx - jnz NEAR $L$sqrx8x_loop - - lea rbp,[64+rbp] - mov rcx,-8 - cmp rbp,QWORD[((8+8))+rsp] - je NEAR $L$sqrx8x_break - - sub rbx,QWORD[((16+8))+rsp] -DB 0x66 - mov rdx,QWORD[((-64))+rsi] - adcx r8,QWORD[rdi] - adcx r9,QWORD[8+rdi] - adc r10,QWORD[16+rdi] - adc r11,QWORD[24+rdi] - adc r12,QWORD[32+rdi] - adc r13,QWORD[40+rdi] - adc r14,QWORD[48+rdi] - adc r15,QWORD[56+rdi] - lea rdi,[64+rdi] -DB 0x67 - sbb rax,rax - xor ebx,ebx - mov QWORD[((16+8))+rsp],rax - jmp NEAR $L$sqrx8x_loop - -ALIGN 32 -$L$sqrx8x_break: - xor rbp,rbp - sub rbx,QWORD[((16+8))+rsp] - adcx r8,rbp - mov rcx,QWORD[((24+8))+rsp] - adcx r9,rbp - mov rdx,QWORD[rsi] - adc r10,0 - mov QWORD[rdi],r8 - adc r11,0 - adc r12,0 - adc r13,0 - adc r14,0 - adc r15,0 - cmp rdi,rcx - je NEAR $L$sqrx8x_outer_loop - - mov QWORD[8+rdi],r9 - mov r9,QWORD[8+rcx] - mov QWORD[16+rdi],r10 - mov r10,QWORD[16+rcx] - mov QWORD[24+rdi],r11 - mov r11,QWORD[24+rcx] - mov QWORD[32+rdi],r12 - mov r12,QWORD[32+rcx] - mov QWORD[40+rdi],r13 - mov r13,QWORD[40+rcx] - mov QWORD[48+rdi],r14 - mov r14,QWORD[48+rcx] - mov QWORD[56+rdi],r15 - mov r15,QWORD[56+rcx] - mov rdi,rcx - jmp NEAR $L$sqrx8x_outer_loop - -ALIGN 32 -$L$sqrx8x_outer_break: - mov QWORD[72+rdi],r9 -DB 102,72,15,126,217 - mov QWORD[80+rdi],r10 - mov QWORD[88+rdi],r11 - mov QWORD[96+rdi],r12 - mov QWORD[104+rdi],r13 - mov QWORD[112+rdi],r14 - lea rdi,[((48+8))+rsp] - mov rdx,QWORD[rcx*1+rsi] - - mov r11,QWORD[8+rdi] - xor r10,r10 - mov r9,QWORD[((0+8))+rsp] - adox r11,r11 - mov r12,QWORD[16+rdi] - mov r13,QWORD[24+rdi] - - -ALIGN 32 -$L$sqrx4x_shift_n_add: - mulx rbx,rax,rdx - adox r12,r12 - adcx rax,r10 -DB 0x48,0x8b,0x94,0x0e,0x08,0x00,0x00,0x00 -DB 0x4c,0x8b,0x97,0x20,0x00,0x00,0x00 - adox r13,r13 - adcx rbx,r11 - mov r11,QWORD[40+rdi] - mov QWORD[rdi],rax - mov QWORD[8+rdi],rbx - - mulx rbx,rax,rdx - adox r10,r10 - adcx rax,r12 - mov rdx,QWORD[16+rcx*1+rsi] - mov r12,QWORD[48+rdi] - adox r11,r11 - adcx rbx,r13 - mov r13,QWORD[56+rdi] - mov QWORD[16+rdi],rax - mov QWORD[24+rdi],rbx - - mulx rbx,rax,rdx - adox r12,r12 - adcx rax,r10 - mov rdx,QWORD[24+rcx*1+rsi] - lea rcx,[32+rcx] - mov r10,QWORD[64+rdi] - adox r13,r13 - adcx rbx,r11 - mov r11,QWORD[72+rdi] - mov QWORD[32+rdi],rax - mov QWORD[40+rdi],rbx - - mulx rbx,rax,rdx - adox r10,r10 - adcx rax,r12 - jrcxz $L$sqrx4x_shift_n_add_break -DB 0x48,0x8b,0x94,0x0e,0x00,0x00,0x00,0x00 - adox r11,r11 - adcx rbx,r13 - mov r12,QWORD[80+rdi] - mov r13,QWORD[88+rdi] - mov QWORD[48+rdi],rax - mov QWORD[56+rdi],rbx - lea rdi,[64+rdi] - nop - jmp NEAR $L$sqrx4x_shift_n_add - -ALIGN 32 -$L$sqrx4x_shift_n_add_break: - adcx rbx,r13 - mov QWORD[48+rdi],rax - mov QWORD[56+rdi],rbx - lea rdi,[64+rdi] -DB 102,72,15,126,213 -__bn_sqrx8x_reduction: - xor eax,eax - mov rbx,QWORD[((32+8))+rsp] - mov rdx,QWORD[((48+8))+rsp] - lea rcx,[((-64))+r9*1+rbp] - - mov QWORD[((0+8))+rsp],rcx - mov QWORD[((8+8))+rsp],rdi - - lea rdi,[((48+8))+rsp] - jmp NEAR $L$sqrx8x_reduction_loop - -ALIGN 32 -$L$sqrx8x_reduction_loop: - mov r9,QWORD[8+rdi] - mov r10,QWORD[16+rdi] - mov r11,QWORD[24+rdi] - mov r12,QWORD[32+rdi] - mov r8,rdx - imul rdx,rbx - mov r13,QWORD[40+rdi] - mov r14,QWORD[48+rdi] - mov r15,QWORD[56+rdi] - mov QWORD[((24+8))+rsp],rax - - lea rdi,[64+rdi] - xor rsi,rsi - mov rcx,-8 - jmp NEAR $L$sqrx8x_reduce - -ALIGN 32 -$L$sqrx8x_reduce: - mov rbx,r8 - mulx r8,rax,QWORD[rbp] - adcx rax,rbx - adox r8,r9 - - mulx r9,rbx,QWORD[8+rbp] - adcx r8,rbx - adox r9,r10 - - mulx r10,rbx,QWORD[16+rbp] - adcx r9,rbx - adox r10,r11 - - mulx r11,rbx,QWORD[24+rbp] - adcx r10,rbx - adox r11,r12 - -DB 0xc4,0x62,0xe3,0xf6,0xa5,0x20,0x00,0x00,0x00 - mov rax,rdx - mov rdx,r8 - adcx r11,rbx - adox r12,r13 - - mulx rdx,rbx,QWORD[((32+8))+rsp] - mov rdx,rax - mov QWORD[((64+48+8))+rcx*8+rsp],rax - - mulx r13,rax,QWORD[40+rbp] - adcx r12,rax - adox r13,r14 - - mulx r14,rax,QWORD[48+rbp] - adcx r13,rax - adox r14,r15 - - mulx r15,rax,QWORD[56+rbp] - mov rdx,rbx - adcx r14,rax - adox r15,rsi - adcx r15,rsi - -DB 0x67,0x67,0x67 - inc rcx - jnz NEAR $L$sqrx8x_reduce - - mov rax,rsi - cmp rbp,QWORD[((0+8))+rsp] - jae NEAR $L$sqrx8x_no_tail - - mov rdx,QWORD[((48+8))+rsp] - add r8,QWORD[rdi] - lea rbp,[64+rbp] - mov rcx,-8 - adcx r9,QWORD[8+rdi] - adcx r10,QWORD[16+rdi] - adc r11,QWORD[24+rdi] - adc r12,QWORD[32+rdi] - adc r13,QWORD[40+rdi] - adc r14,QWORD[48+rdi] - adc r15,QWORD[56+rdi] - lea rdi,[64+rdi] - sbb rax,rax - - xor rsi,rsi - mov QWORD[((16+8))+rsp],rax - jmp NEAR $L$sqrx8x_tail - -ALIGN 32 -$L$sqrx8x_tail: - mov rbx,r8 - mulx r8,rax,QWORD[rbp] - adcx rbx,rax - adox r8,r9 - - mulx r9,rax,QWORD[8+rbp] - adcx r8,rax - adox r9,r10 - - mulx r10,rax,QWORD[16+rbp] - adcx r9,rax - adox r10,r11 - - mulx r11,rax,QWORD[24+rbp] - adcx r10,rax - adox r11,r12 - -DB 0xc4,0x62,0xfb,0xf6,0xa5,0x20,0x00,0x00,0x00 - adcx r11,rax - adox r12,r13 - - mulx r13,rax,QWORD[40+rbp] - adcx r12,rax - adox r13,r14 - - mulx r14,rax,QWORD[48+rbp] - adcx r13,rax - adox r14,r15 - - mulx r15,rax,QWORD[56+rbp] - mov rdx,QWORD[((72+48+8))+rcx*8+rsp] - adcx r14,rax - adox r15,rsi - mov QWORD[rcx*8+rdi],rbx - mov rbx,r8 - adcx r15,rsi - - inc rcx - jnz NEAR $L$sqrx8x_tail - - cmp rbp,QWORD[((0+8))+rsp] - jae NEAR $L$sqrx8x_tail_done - - sub rsi,QWORD[((16+8))+rsp] - mov rdx,QWORD[((48+8))+rsp] - lea rbp,[64+rbp] - adc r8,QWORD[rdi] - adc r9,QWORD[8+rdi] - adc r10,QWORD[16+rdi] - adc r11,QWORD[24+rdi] - adc r12,QWORD[32+rdi] - adc r13,QWORD[40+rdi] - adc r14,QWORD[48+rdi] - adc r15,QWORD[56+rdi] - lea rdi,[64+rdi] - sbb rax,rax - sub rcx,8 - - xor rsi,rsi - mov QWORD[((16+8))+rsp],rax - jmp NEAR $L$sqrx8x_tail - -ALIGN 32 -$L$sqrx8x_tail_done: - xor rax,rax - add r8,QWORD[((24+8))+rsp] - adc r9,0 - adc r10,0 - adc r11,0 - adc r12,0 - adc r13,0 - adc r14,0 - adc r15,0 - adc rax,0 - - sub rsi,QWORD[((16+8))+rsp] -$L$sqrx8x_no_tail: - adc r8,QWORD[rdi] -DB 102,72,15,126,217 - adc r9,QWORD[8+rdi] - mov rsi,QWORD[56+rbp] -DB 102,72,15,126,213 - adc r10,QWORD[16+rdi] - adc r11,QWORD[24+rdi] - adc r12,QWORD[32+rdi] - adc r13,QWORD[40+rdi] - adc r14,QWORD[48+rdi] - adc r15,QWORD[56+rdi] - adc rax,0 - - mov rbx,QWORD[((32+8))+rsp] - mov rdx,QWORD[64+rcx*1+rdi] - - mov QWORD[rdi],r8 - lea r8,[64+rdi] - mov QWORD[8+rdi],r9 - mov QWORD[16+rdi],r10 - mov QWORD[24+rdi],r11 - mov QWORD[32+rdi],r12 - mov QWORD[40+rdi],r13 - mov QWORD[48+rdi],r14 - mov QWORD[56+rdi],r15 - - lea rdi,[64+rcx*1+rdi] - cmp r8,QWORD[((8+8))+rsp] - jb NEAR $L$sqrx8x_reduction_loop - DB 0F3h,0C3h ;repret - - -ALIGN 32 - -__bn_postx4x_internal: - - mov r12,QWORD[rbp] - mov r10,rcx - mov r9,rcx - neg rax - sar rcx,3+2 - -DB 102,72,15,126,202 -DB 102,72,15,126,206 - dec r12 - mov r13,QWORD[8+rbp] - xor r8,r8 - mov r14,QWORD[16+rbp] - mov r15,QWORD[24+rbp] - jmp NEAR $L$sqrx4x_sub_entry - -ALIGN 16 -$L$sqrx4x_sub: - mov r12,QWORD[rbp] - mov r13,QWORD[8+rbp] - mov r14,QWORD[16+rbp] - mov r15,QWORD[24+rbp] -$L$sqrx4x_sub_entry: - andn r12,r12,rax - lea rbp,[32+rbp] - andn r13,r13,rax - andn r14,r14,rax - andn r15,r15,rax - - neg r8 - adc r12,QWORD[rdi] - adc r13,QWORD[8+rdi] - adc r14,QWORD[16+rdi] - adc r15,QWORD[24+rdi] - mov QWORD[rdx],r12 - lea rdi,[32+rdi] - mov QWORD[8+rdx],r13 - sbb r8,r8 - mov QWORD[16+rdx],r14 - mov QWORD[24+rdx],r15 - lea rdx,[32+rdx] - - inc rcx - jnz NEAR $L$sqrx4x_sub - - neg r9 - - DB 0F3h,0C3h ;repret - - -global GFp_bn_scatter5 - -ALIGN 16 -GFp_bn_scatter5: - - cmp edx,0 - jz NEAR $L$scatter_epilogue - lea r8,[r9*8+r8] -$L$scatter: - mov rax,QWORD[rcx] - lea rcx,[8+rcx] - mov QWORD[r8],rax - lea r8,[256+r8] - sub edx,1 - jnz NEAR $L$scatter -$L$scatter_epilogue: - DB 0F3h,0C3h ;repret - - - -global GFp_bn_gather5 - -ALIGN 32 -GFp_bn_gather5: - -$L$SEH_begin_GFp_bn_gather5: - -DB 0x4c,0x8d,0x14,0x24 - -DB 0x48,0x81,0xec,0x08,0x01,0x00,0x00 - lea rax,[$L$inc] - and rsp,-16 - - movd xmm5,r9d - movdqa xmm0,XMMWORD[rax] - movdqa xmm1,XMMWORD[16+rax] - lea r11,[128+r8] - lea rax,[128+rsp] - - pshufd xmm5,xmm5,0 - movdqa xmm4,xmm1 - movdqa xmm2,xmm1 - paddd xmm1,xmm0 - pcmpeqd xmm0,xmm5 - movdqa xmm3,xmm4 - - paddd xmm2,xmm1 - pcmpeqd xmm1,xmm5 - movdqa XMMWORD[(-128)+rax],xmm0 - movdqa xmm0,xmm4 - - paddd xmm3,xmm2 - pcmpeqd xmm2,xmm5 - movdqa XMMWORD[(-112)+rax],xmm1 - movdqa xmm1,xmm4 - - paddd xmm0,xmm3 - pcmpeqd xmm3,xmm5 - movdqa XMMWORD[(-96)+rax],xmm2 - movdqa xmm2,xmm4 - paddd xmm1,xmm0 - pcmpeqd xmm0,xmm5 - movdqa XMMWORD[(-80)+rax],xmm3 - movdqa xmm3,xmm4 - - paddd xmm2,xmm1 - pcmpeqd xmm1,xmm5 - movdqa XMMWORD[(-64)+rax],xmm0 - movdqa xmm0,xmm4 - - paddd xmm3,xmm2 - pcmpeqd xmm2,xmm5 - movdqa XMMWORD[(-48)+rax],xmm1 - movdqa xmm1,xmm4 - - paddd xmm0,xmm3 - pcmpeqd xmm3,xmm5 - movdqa XMMWORD[(-32)+rax],xmm2 - movdqa xmm2,xmm4 - paddd xmm1,xmm0 - pcmpeqd xmm0,xmm5 - movdqa XMMWORD[(-16)+rax],xmm3 - movdqa xmm3,xmm4 - - paddd xmm2,xmm1 - pcmpeqd xmm1,xmm5 - movdqa XMMWORD[rax],xmm0 - movdqa xmm0,xmm4 - - paddd xmm3,xmm2 - pcmpeqd xmm2,xmm5 - movdqa XMMWORD[16+rax],xmm1 - movdqa xmm1,xmm4 - - paddd xmm0,xmm3 - pcmpeqd xmm3,xmm5 - movdqa XMMWORD[32+rax],xmm2 - movdqa xmm2,xmm4 - paddd xmm1,xmm0 - pcmpeqd xmm0,xmm5 - movdqa XMMWORD[48+rax],xmm3 - movdqa xmm3,xmm4 - - paddd xmm2,xmm1 - pcmpeqd xmm1,xmm5 - movdqa XMMWORD[64+rax],xmm0 - movdqa xmm0,xmm4 - - paddd xmm3,xmm2 - pcmpeqd xmm2,xmm5 - movdqa XMMWORD[80+rax],xmm1 - movdqa xmm1,xmm4 - - paddd xmm0,xmm3 - pcmpeqd xmm3,xmm5 - movdqa XMMWORD[96+rax],xmm2 - movdqa xmm2,xmm4 - movdqa XMMWORD[112+rax],xmm3 - jmp NEAR $L$gather - -ALIGN 32 -$L$gather: - pxor xmm4,xmm4 - pxor xmm5,xmm5 - movdqa xmm0,XMMWORD[((-128))+r11] - movdqa xmm1,XMMWORD[((-112))+r11] - movdqa xmm2,XMMWORD[((-96))+r11] - pand xmm0,XMMWORD[((-128))+rax] - movdqa xmm3,XMMWORD[((-80))+r11] - pand xmm1,XMMWORD[((-112))+rax] - por xmm4,xmm0 - pand xmm2,XMMWORD[((-96))+rax] - por xmm5,xmm1 - pand xmm3,XMMWORD[((-80))+rax] - por xmm4,xmm2 - por xmm5,xmm3 - movdqa xmm0,XMMWORD[((-64))+r11] - movdqa xmm1,XMMWORD[((-48))+r11] - movdqa xmm2,XMMWORD[((-32))+r11] - pand xmm0,XMMWORD[((-64))+rax] - movdqa xmm3,XMMWORD[((-16))+r11] - pand xmm1,XMMWORD[((-48))+rax] - por xmm4,xmm0 - pand xmm2,XMMWORD[((-32))+rax] - por xmm5,xmm1 - pand xmm3,XMMWORD[((-16))+rax] - por xmm4,xmm2 - por xmm5,xmm3 - movdqa xmm0,XMMWORD[r11] - movdqa xmm1,XMMWORD[16+r11] - movdqa xmm2,XMMWORD[32+r11] - pand xmm0,XMMWORD[rax] - movdqa xmm3,XMMWORD[48+r11] - pand xmm1,XMMWORD[16+rax] - por xmm4,xmm0 - pand xmm2,XMMWORD[32+rax] - por xmm5,xmm1 - pand xmm3,XMMWORD[48+rax] - por xmm4,xmm2 - por xmm5,xmm3 - movdqa xmm0,XMMWORD[64+r11] - movdqa xmm1,XMMWORD[80+r11] - movdqa xmm2,XMMWORD[96+r11] - pand xmm0,XMMWORD[64+rax] - movdqa xmm3,XMMWORD[112+r11] - pand xmm1,XMMWORD[80+rax] - por xmm4,xmm0 - pand xmm2,XMMWORD[96+rax] - por xmm5,xmm1 - pand xmm3,XMMWORD[112+rax] - por xmm4,xmm2 - por xmm5,xmm3 - por xmm4,xmm5 - lea r11,[256+r11] - pshufd xmm0,xmm4,0x4e - por xmm0,xmm4 - movq QWORD[rcx],xmm0 - lea rcx,[8+rcx] - sub edx,1 - jnz NEAR $L$gather - - lea rsp,[r10] - - DB 0F3h,0C3h ;repret -$L$SEH_end_GFp_bn_gather5: - - -ALIGN 64 -$L$inc: - DD 0,0,1,1 - DD 2,2,2,2 -DB 77,111,110,116,103,111,109,101,114,121,32,77,117,108,116,105 -DB 112,108,105,99,97,116,105,111,110,32,119,105,116,104,32,115 -DB 99,97,116,116,101,114,47,103,97,116,104,101,114,32,102,111 -DB 114,32,120,56,54,95,54,52,44,32,67,82,89,80,84,79 -DB 71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111 -DB 112,101,110,115,115,108,46,111,114,103,62,0 -EXTERN __imp_RtlVirtualUnwind - -ALIGN 16 -mul_handler: - push rsi - push rdi - push rbx - push rbp - push r12 - push r13 - push r14 - push r15 - pushfq - sub rsp,64 - - mov rax,QWORD[120+r8] - mov rbx,QWORD[248+r8] - - mov rsi,QWORD[8+r9] - mov r11,QWORD[56+r9] - - mov r10d,DWORD[r11] - lea r10,[r10*1+rsi] - cmp rbx,r10 - jb NEAR $L$common_seh_tail - - mov r10d,DWORD[4+r11] - lea r10,[r10*1+rsi] - cmp rbx,r10 - jb NEAR $L$common_pop_regs - - mov rax,QWORD[152+r8] - - mov r10d,DWORD[8+r11] - lea r10,[r10*1+rsi] - cmp rbx,r10 - jae NEAR $L$common_seh_tail - - lea r10,[$L$mul_epilogue] - cmp rbx,r10 - ja NEAR $L$body_40 - - mov r10,QWORD[192+r8] - mov rax,QWORD[8+r10*8+rax] - - jmp NEAR $L$common_pop_regs - -$L$body_40: - mov rax,QWORD[40+rax] -$L$common_pop_regs: - mov rbx,QWORD[((-8))+rax] - mov rbp,QWORD[((-16))+rax] - mov r12,QWORD[((-24))+rax] - mov r13,QWORD[((-32))+rax] - mov r14,QWORD[((-40))+rax] - mov r15,QWORD[((-48))+rax] - mov QWORD[144+r8],rbx - mov QWORD[160+r8],rbp - mov QWORD[216+r8],r12 - mov QWORD[224+r8],r13 - mov QWORD[232+r8],r14 - mov QWORD[240+r8],r15 - -$L$common_seh_tail: - mov rdi,QWORD[8+rax] - mov rsi,QWORD[16+rax] - mov QWORD[152+r8],rax - mov QWORD[168+r8],rsi - mov QWORD[176+r8],rdi - - mov rdi,QWORD[40+r9] - mov rsi,r8 - mov ecx,154 - DD 0xa548f3fc - - mov rsi,r9 - xor rcx,rcx - mov rdx,QWORD[8+rsi] - mov r8,QWORD[rsi] - mov r9,QWORD[16+rsi] - mov r10,QWORD[40+rsi] - lea r11,[56+rsi] - lea r12,[24+rsi] - mov QWORD[32+rsp],r10 - mov QWORD[40+rsp],r11 - mov QWORD[48+rsp],r12 - mov QWORD[56+rsp],rcx - call QWORD[__imp_RtlVirtualUnwind] - - mov eax,1 - add rsp,64 - popfq - pop r15 - pop r14 - pop r13 - pop r12 - pop rbp - pop rbx - pop rdi - pop rsi - DB 0F3h,0C3h ;repret - - -section .pdata rdata align=4 -ALIGN 4 - DD $L$SEH_begin_GFp_bn_mul_mont_gather5 wrt ..imagebase - DD $L$SEH_end_GFp_bn_mul_mont_gather5 wrt ..imagebase - DD $L$SEH_info_GFp_bn_mul_mont_gather5 wrt ..imagebase - - DD $L$SEH_begin_bn_mul4x_mont_gather5 wrt ..imagebase - DD $L$SEH_end_bn_mul4x_mont_gather5 wrt ..imagebase - DD $L$SEH_info_bn_mul4x_mont_gather5 wrt ..imagebase - - DD $L$SEH_begin_GFp_bn_power5 wrt ..imagebase - DD $L$SEH_end_GFp_bn_power5 wrt ..imagebase - DD $L$SEH_info_GFp_bn_power5 wrt ..imagebase - - DD $L$SEH_begin_bn_from_mont8x wrt ..imagebase - DD $L$SEH_end_bn_from_mont8x wrt ..imagebase - DD $L$SEH_info_bn_from_mont8x wrt ..imagebase - DD $L$SEH_begin_bn_mulx4x_mont_gather5 wrt ..imagebase - DD $L$SEH_end_bn_mulx4x_mont_gather5 wrt ..imagebase - DD $L$SEH_info_bn_mulx4x_mont_gather5 wrt ..imagebase - - DD $L$SEH_begin_bn_powerx5 wrt ..imagebase - DD $L$SEH_end_bn_powerx5 wrt ..imagebase - DD $L$SEH_info_GFp_bn_powerx5 wrt ..imagebase - DD $L$SEH_begin_GFp_bn_gather5 wrt ..imagebase - DD $L$SEH_end_GFp_bn_gather5 wrt ..imagebase - DD $L$SEH_info_GFp_bn_gather5 wrt ..imagebase - -section .xdata rdata align=8 -ALIGN 8 -$L$SEH_info_GFp_bn_mul_mont_gather5: -DB 9,0,0,0 - DD mul_handler wrt ..imagebase - DD $L$mul_body wrt ..imagebase,$L$mul_body wrt ..imagebase,$L$mul_epilogue wrt ..imagebase -ALIGN 8 -$L$SEH_info_bn_mul4x_mont_gather5: -DB 9,0,0,0 - DD mul_handler wrt ..imagebase - DD $L$mul4x_prologue wrt ..imagebase,$L$mul4x_body wrt ..imagebase,$L$mul4x_epilogue wrt ..imagebase -ALIGN 8 -$L$SEH_info_GFp_bn_power5: -DB 9,0,0,0 - DD mul_handler wrt ..imagebase - DD $L$power5_prologue wrt ..imagebase,$L$power5_body wrt ..imagebase,$L$power5_epilogue wrt ..imagebase -ALIGN 8 -$L$SEH_info_bn_from_mont8x: -DB 9,0,0,0 - DD mul_handler wrt ..imagebase - DD $L$from_prologue wrt ..imagebase,$L$from_body wrt ..imagebase,$L$from_epilogue wrt ..imagebase -ALIGN 8 -$L$SEH_info_bn_mulx4x_mont_gather5: -DB 9,0,0,0 - DD mul_handler wrt ..imagebase - DD $L$mulx4x_prologue wrt ..imagebase,$L$mulx4x_body wrt ..imagebase,$L$mulx4x_epilogue wrt ..imagebase -ALIGN 8 -$L$SEH_info_GFp_bn_powerx5: -DB 9,0,0,0 - DD mul_handler wrt ..imagebase - DD $L$powerx5_prologue wrt ..imagebase,$L$powerx5_body wrt ..imagebase,$L$powerx5_epilogue wrt ..imagebase -ALIGN 8 -$L$SEH_info_GFp_bn_gather5: -DB 0x01,0x0b,0x03,0x0a -DB 0x0b,0x01,0x21,0x00 -DB 0x04,0xa3,0x00,0x00 -ALIGN 8 diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/tmp/x86_64-mont-nasm.asm temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/tmp/x86_64-mont-nasm.asm --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/tmp/x86_64-mont-nasm.asm 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/tmp/x86_64-mont-nasm.asm 1970-01-01 00:00:00.000000000 +0000 @@ -1,1475 +0,0 @@ -; This file is generated from a similarly-named Perl script in the BoringSSL -; source tree. Do not edit by hand. - -default rel -%define XMMWORD -%define YMMWORD -%define ZMMWORD -section .text code align=64 - - -EXTERN GFp_ia32cap_P - -global GFp_bn_mul_mont - -ALIGN 16 -GFp_bn_mul_mont: - mov QWORD[8+rsp],rdi ;WIN64 prologue - mov QWORD[16+rsp],rsi - mov rax,rsp -$L$SEH_begin_GFp_bn_mul_mont: - mov rdi,rcx - mov rsi,rdx - mov rdx,r8 - mov rcx,r9 - mov r8,QWORD[40+rsp] - mov r9,QWORD[48+rsp] - - - - mov r9d,r9d - mov rax,rsp - - test r9d,3 - jnz NEAR $L$mul_enter - cmp r9d,8 - jb NEAR $L$mul_enter - mov r11d,DWORD[((GFp_ia32cap_P+8))] - cmp rdx,rsi - jne NEAR $L$mul4x_enter - test r9d,7 - jz NEAR $L$sqr8x_enter - jmp NEAR $L$mul4x_enter - -ALIGN 16 -$L$mul_enter: - push rbx - - push rbp - - push r12 - - push r13 - - push r14 - - push r15 - - - neg r9 - mov r11,rsp - lea r10,[((-16))+r9*8+rsp] - neg r9 - and r10,-1024 - - - - - - - - - - sub r11,r10 - and r11,-4096 - lea rsp,[r11*1+r10] - mov r11,QWORD[rsp] - cmp rsp,r10 - ja NEAR $L$mul_page_walk - jmp NEAR $L$mul_page_walk_done - -ALIGN 16 -$L$mul_page_walk: - lea rsp,[((-4096))+rsp] - mov r11,QWORD[rsp] - cmp rsp,r10 - ja NEAR $L$mul_page_walk -$L$mul_page_walk_done: - - mov QWORD[8+r9*8+rsp],rax - -$L$mul_body: - mov r12,rdx - mov r8,QWORD[r8] - mov rbx,QWORD[r12] - mov rax,QWORD[rsi] - - xor r14,r14 - xor r15,r15 - - mov rbp,r8 - mul rbx - mov r10,rax - mov rax,QWORD[rcx] - - imul rbp,r10 - mov r11,rdx - - mul rbp - add r10,rax - mov rax,QWORD[8+rsi] - adc rdx,0 - mov r13,rdx - - lea r15,[1+r15] - jmp NEAR $L$1st_enter - -ALIGN 16 -$L$1st: - add r13,rax - mov rax,QWORD[r15*8+rsi] - adc rdx,0 - add r13,r11 - mov r11,r10 - adc rdx,0 - mov QWORD[((-16))+r15*8+rsp],r13 - mov r13,rdx - -$L$1st_enter: - mul rbx - add r11,rax - mov rax,QWORD[r15*8+rcx] - adc rdx,0 - lea r15,[1+r15] - mov r10,rdx - - mul rbp - cmp r15,r9 - jne NEAR $L$1st - - add r13,rax - mov rax,QWORD[rsi] - adc rdx,0 - add r13,r11 - adc rdx,0 - mov QWORD[((-16))+r15*8+rsp],r13 - mov r13,rdx - mov r11,r10 - - xor rdx,rdx - add r13,r11 - adc rdx,0 - mov QWORD[((-8))+r9*8+rsp],r13 - mov QWORD[r9*8+rsp],rdx - - lea r14,[1+r14] - jmp NEAR $L$outer -ALIGN 16 -$L$outer: - mov rbx,QWORD[r14*8+r12] - xor r15,r15 - mov rbp,r8 - mov r10,QWORD[rsp] - mul rbx - add r10,rax - mov rax,QWORD[rcx] - adc rdx,0 - - imul rbp,r10 - mov r11,rdx - - mul rbp - add r10,rax - mov rax,QWORD[8+rsi] - adc rdx,0 - mov r10,QWORD[8+rsp] - mov r13,rdx - - lea r15,[1+r15] - jmp NEAR $L$inner_enter - -ALIGN 16 -$L$inner: - add r13,rax - mov rax,QWORD[r15*8+rsi] - adc rdx,0 - add r13,r10 - mov r10,QWORD[r15*8+rsp] - adc rdx,0 - mov QWORD[((-16))+r15*8+rsp],r13 - mov r13,rdx - -$L$inner_enter: - mul rbx - add r11,rax - mov rax,QWORD[r15*8+rcx] - adc rdx,0 - add r10,r11 - mov r11,rdx - adc r11,0 - lea r15,[1+r15] - - mul rbp - cmp r15,r9 - jne NEAR $L$inner - - add r13,rax - mov rax,QWORD[rsi] - adc rdx,0 - add r13,r10 - mov r10,QWORD[r15*8+rsp] - adc rdx,0 - mov QWORD[((-16))+r15*8+rsp],r13 - mov r13,rdx - - xor rdx,rdx - add r13,r11 - adc rdx,0 - add r13,r10 - adc rdx,0 - mov QWORD[((-8))+r9*8+rsp],r13 - mov QWORD[r9*8+rsp],rdx - - lea r14,[1+r14] - cmp r14,r9 - jb NEAR $L$outer - - xor r14,r14 - mov rax,QWORD[rsp] - mov r15,r9 - -ALIGN 16 -$L$sub: sbb rax,QWORD[r14*8+rcx] - mov QWORD[r14*8+rdi],rax - mov rax,QWORD[8+r14*8+rsp] - lea r14,[1+r14] - dec r15 - jnz NEAR $L$sub - - sbb rax,0 - mov rbx,-1 - xor rbx,rax - xor r14,r14 - mov r15,r9 - -$L$copy: - mov rcx,QWORD[r14*8+rdi] - mov rdx,QWORD[r14*8+rsp] - and rcx,rbx - and rdx,rax - mov QWORD[r14*8+rsp],r9 - or rdx,rcx - mov QWORD[r14*8+rdi],rdx - lea r14,[1+r14] - sub r15,1 - jnz NEAR $L$copy - - mov rsi,QWORD[8+r9*8+rsp] - - mov rax,1 - mov r15,QWORD[((-48))+rsi] - - mov r14,QWORD[((-40))+rsi] - - mov r13,QWORD[((-32))+rsi] - - mov r12,QWORD[((-24))+rsi] - - mov rbp,QWORD[((-16))+rsi] - - mov rbx,QWORD[((-8))+rsi] - - lea rsp,[rsi] - -$L$mul_epilogue: - mov rdi,QWORD[8+rsp] ;WIN64 epilogue - mov rsi,QWORD[16+rsp] - DB 0F3h,0C3h ;repret - -$L$SEH_end_GFp_bn_mul_mont: - -ALIGN 16 -bn_mul4x_mont: - mov QWORD[8+rsp],rdi ;WIN64 prologue - mov QWORD[16+rsp],rsi - mov rax,rsp -$L$SEH_begin_bn_mul4x_mont: - mov rdi,rcx - mov rsi,rdx - mov rdx,r8 - mov rcx,r9 - mov r8,QWORD[40+rsp] - mov r9,QWORD[48+rsp] - - - - mov r9d,r9d - mov rax,rsp - -$L$mul4x_enter: - and r11d,0x80100 - cmp r11d,0x80100 - je NEAR $L$mulx4x_enter - push rbx - - push rbp - - push r12 - - push r13 - - push r14 - - push r15 - - - neg r9 - mov r11,rsp - lea r10,[((-32))+r9*8+rsp] - neg r9 - and r10,-1024 - - sub r11,r10 - and r11,-4096 - lea rsp,[r11*1+r10] - mov r11,QWORD[rsp] - cmp rsp,r10 - ja NEAR $L$mul4x_page_walk - jmp NEAR $L$mul4x_page_walk_done - -$L$mul4x_page_walk: - lea rsp,[((-4096))+rsp] - mov r11,QWORD[rsp] - cmp rsp,r10 - ja NEAR $L$mul4x_page_walk -$L$mul4x_page_walk_done: - - mov QWORD[8+r9*8+rsp],rax - -$L$mul4x_body: - mov QWORD[16+r9*8+rsp],rdi - mov r12,rdx - mov r8,QWORD[r8] - mov rbx,QWORD[r12] - mov rax,QWORD[rsi] - - xor r14,r14 - xor r15,r15 - - mov rbp,r8 - mul rbx - mov r10,rax - mov rax,QWORD[rcx] - - imul rbp,r10 - mov r11,rdx - - mul rbp - add r10,rax - mov rax,QWORD[8+rsi] - adc rdx,0 - mov rdi,rdx - - mul rbx - add r11,rax - mov rax,QWORD[8+rcx] - adc rdx,0 - mov r10,rdx - - mul rbp - add rdi,rax - mov rax,QWORD[16+rsi] - adc rdx,0 - add rdi,r11 - lea r15,[4+r15] - adc rdx,0 - mov QWORD[rsp],rdi - mov r13,rdx - jmp NEAR $L$1st4x -ALIGN 16 -$L$1st4x: - mul rbx - add r10,rax - mov rax,QWORD[((-16))+r15*8+rcx] - adc rdx,0 - mov r11,rdx - - mul rbp - add r13,rax - mov rax,QWORD[((-8))+r15*8+rsi] - adc rdx,0 - add r13,r10 - adc rdx,0 - mov QWORD[((-24))+r15*8+rsp],r13 - mov rdi,rdx - - mul rbx - add r11,rax - mov rax,QWORD[((-8))+r15*8+rcx] - adc rdx,0 - mov r10,rdx - - mul rbp - add rdi,rax - mov rax,QWORD[r15*8+rsi] - adc rdx,0 - add rdi,r11 - adc rdx,0 - mov QWORD[((-16))+r15*8+rsp],rdi - mov r13,rdx - - mul rbx - add r10,rax - mov rax,QWORD[r15*8+rcx] - adc rdx,0 - mov r11,rdx - - mul rbp - add r13,rax - mov rax,QWORD[8+r15*8+rsi] - adc rdx,0 - add r13,r10 - adc rdx,0 - mov QWORD[((-8))+r15*8+rsp],r13 - mov rdi,rdx - - mul rbx - add r11,rax - mov rax,QWORD[8+r15*8+rcx] - adc rdx,0 - lea r15,[4+r15] - mov r10,rdx - - mul rbp - add rdi,rax - mov rax,QWORD[((-16))+r15*8+rsi] - adc rdx,0 - add rdi,r11 - adc rdx,0 - mov QWORD[((-32))+r15*8+rsp],rdi - mov r13,rdx - cmp r15,r9 - jb NEAR $L$1st4x - - mul rbx - add r10,rax - mov rax,QWORD[((-16))+r15*8+rcx] - adc rdx,0 - mov r11,rdx - - mul rbp - add r13,rax - mov rax,QWORD[((-8))+r15*8+rsi] - adc rdx,0 - add r13,r10 - adc rdx,0 - mov QWORD[((-24))+r15*8+rsp],r13 - mov rdi,rdx - - mul rbx - add r11,rax - mov rax,QWORD[((-8))+r15*8+rcx] - adc rdx,0 - mov r10,rdx - - mul rbp - add rdi,rax - mov rax,QWORD[rsi] - adc rdx,0 - add rdi,r11 - adc rdx,0 - mov QWORD[((-16))+r15*8+rsp],rdi - mov r13,rdx - - xor rdi,rdi - add r13,r10 - adc rdi,0 - mov QWORD[((-8))+r15*8+rsp],r13 - mov QWORD[r15*8+rsp],rdi - - lea r14,[1+r14] -ALIGN 4 -$L$outer4x: - mov rbx,QWORD[r14*8+r12] - xor r15,r15 - mov r10,QWORD[rsp] - mov rbp,r8 - mul rbx - add r10,rax - mov rax,QWORD[rcx] - adc rdx,0 - - imul rbp,r10 - mov r11,rdx - - mul rbp - add r10,rax - mov rax,QWORD[8+rsi] - adc rdx,0 - mov rdi,rdx - - mul rbx - add r11,rax - mov rax,QWORD[8+rcx] - adc rdx,0 - add r11,QWORD[8+rsp] - adc rdx,0 - mov r10,rdx - - mul rbp - add rdi,rax - mov rax,QWORD[16+rsi] - adc rdx,0 - add rdi,r11 - lea r15,[4+r15] - adc rdx,0 - mov QWORD[rsp],rdi - mov r13,rdx - jmp NEAR $L$inner4x -ALIGN 16 -$L$inner4x: - mul rbx - add r10,rax - mov rax,QWORD[((-16))+r15*8+rcx] - adc rdx,0 - add r10,QWORD[((-16))+r15*8+rsp] - adc rdx,0 - mov r11,rdx - - mul rbp - add r13,rax - mov rax,QWORD[((-8))+r15*8+rsi] - adc rdx,0 - add r13,r10 - adc rdx,0 - mov QWORD[((-24))+r15*8+rsp],r13 - mov rdi,rdx - - mul rbx - add r11,rax - mov rax,QWORD[((-8))+r15*8+rcx] - adc rdx,0 - add r11,QWORD[((-8))+r15*8+rsp] - adc rdx,0 - mov r10,rdx - - mul rbp - add rdi,rax - mov rax,QWORD[r15*8+rsi] - adc rdx,0 - add rdi,r11 - adc rdx,0 - mov QWORD[((-16))+r15*8+rsp],rdi - mov r13,rdx - - mul rbx - add r10,rax - mov rax,QWORD[r15*8+rcx] - adc rdx,0 - add r10,QWORD[r15*8+rsp] - adc rdx,0 - mov r11,rdx - - mul rbp - add r13,rax - mov rax,QWORD[8+r15*8+rsi] - adc rdx,0 - add r13,r10 - adc rdx,0 - mov QWORD[((-8))+r15*8+rsp],r13 - mov rdi,rdx - - mul rbx - add r11,rax - mov rax,QWORD[8+r15*8+rcx] - adc rdx,0 - add r11,QWORD[8+r15*8+rsp] - adc rdx,0 - lea r15,[4+r15] - mov r10,rdx - - mul rbp - add rdi,rax - mov rax,QWORD[((-16))+r15*8+rsi] - adc rdx,0 - add rdi,r11 - adc rdx,0 - mov QWORD[((-32))+r15*8+rsp],rdi - mov r13,rdx - cmp r15,r9 - jb NEAR $L$inner4x - - mul rbx - add r10,rax - mov rax,QWORD[((-16))+r15*8+rcx] - adc rdx,0 - add r10,QWORD[((-16))+r15*8+rsp] - adc rdx,0 - mov r11,rdx - - mul rbp - add r13,rax - mov rax,QWORD[((-8))+r15*8+rsi] - adc rdx,0 - add r13,r10 - adc rdx,0 - mov QWORD[((-24))+r15*8+rsp],r13 - mov rdi,rdx - - mul rbx - add r11,rax - mov rax,QWORD[((-8))+r15*8+rcx] - adc rdx,0 - add r11,QWORD[((-8))+r15*8+rsp] - adc rdx,0 - lea r14,[1+r14] - mov r10,rdx - - mul rbp - add rdi,rax - mov rax,QWORD[rsi] - adc rdx,0 - add rdi,r11 - adc rdx,0 - mov QWORD[((-16))+r15*8+rsp],rdi - mov r13,rdx - - xor rdi,rdi - add r13,r10 - adc rdi,0 - add r13,QWORD[r9*8+rsp] - adc rdi,0 - mov QWORD[((-8))+r15*8+rsp],r13 - mov QWORD[r15*8+rsp],rdi - - cmp r14,r9 - jb NEAR $L$outer4x - mov rdi,QWORD[16+r9*8+rsp] - lea r15,[((-4))+r9] - mov rax,QWORD[rsp] - mov rdx,QWORD[8+rsp] - shr r15,2 - lea rsi,[rsp] - xor r14,r14 - - sub rax,QWORD[rcx] - mov rbx,QWORD[16+rsi] - mov rbp,QWORD[24+rsi] - sbb rdx,QWORD[8+rcx] - -$L$sub4x: - mov QWORD[r14*8+rdi],rax - mov QWORD[8+r14*8+rdi],rdx - sbb rbx,QWORD[16+r14*8+rcx] - mov rax,QWORD[32+r14*8+rsi] - mov rdx,QWORD[40+r14*8+rsi] - sbb rbp,QWORD[24+r14*8+rcx] - mov QWORD[16+r14*8+rdi],rbx - mov QWORD[24+r14*8+rdi],rbp - sbb rax,QWORD[32+r14*8+rcx] - mov rbx,QWORD[48+r14*8+rsi] - mov rbp,QWORD[56+r14*8+rsi] - sbb rdx,QWORD[40+r14*8+rcx] - lea r14,[4+r14] - dec r15 - jnz NEAR $L$sub4x - - mov QWORD[r14*8+rdi],rax - mov rax,QWORD[32+r14*8+rsi] - sbb rbx,QWORD[16+r14*8+rcx] - mov QWORD[8+r14*8+rdi],rdx - sbb rbp,QWORD[24+r14*8+rcx] - mov QWORD[16+r14*8+rdi],rbx - - sbb rax,0 - mov QWORD[24+r14*8+rdi],rbp - pxor xmm0,xmm0 -DB 102,72,15,110,224 - pcmpeqd xmm5,xmm5 - pshufd xmm4,xmm4,0 - mov r15,r9 - pxor xmm5,xmm4 - shr r15,2 - xor eax,eax - - jmp NEAR $L$copy4x -ALIGN 16 -$L$copy4x: - movdqa xmm1,XMMWORD[rax*1+rsp] - movdqu xmm2,XMMWORD[rax*1+rdi] - pand xmm1,xmm4 - pand xmm2,xmm5 - movdqa xmm3,XMMWORD[16+rax*1+rsp] - movdqa XMMWORD[rax*1+rsp],xmm0 - por xmm1,xmm2 - movdqu xmm2,XMMWORD[16+rax*1+rdi] - movdqu XMMWORD[rax*1+rdi],xmm1 - pand xmm3,xmm4 - pand xmm2,xmm5 - movdqa XMMWORD[16+rax*1+rsp],xmm0 - por xmm3,xmm2 - movdqu XMMWORD[16+rax*1+rdi],xmm3 - lea rax,[32+rax] - dec r15 - jnz NEAR $L$copy4x - mov rsi,QWORD[8+r9*8+rsp] - - mov rax,1 - mov r15,QWORD[((-48))+rsi] - - mov r14,QWORD[((-40))+rsi] - - mov r13,QWORD[((-32))+rsi] - - mov r12,QWORD[((-24))+rsi] - - mov rbp,QWORD[((-16))+rsi] - - mov rbx,QWORD[((-8))+rsi] - - lea rsp,[rsi] - -$L$mul4x_epilogue: - mov rdi,QWORD[8+rsp] ;WIN64 epilogue - mov rsi,QWORD[16+rsp] - DB 0F3h,0C3h ;repret - -$L$SEH_end_bn_mul4x_mont: -EXTERN GFp_bn_sqrx8x_internal -EXTERN GFp_bn_sqr8x_internal - - -ALIGN 32 -bn_sqr8x_mont: - mov QWORD[8+rsp],rdi ;WIN64 prologue - mov QWORD[16+rsp],rsi - mov rax,rsp -$L$SEH_begin_bn_sqr8x_mont: - mov rdi,rcx - mov rsi,rdx - mov rdx,r8 - mov rcx,r9 - mov r8,QWORD[40+rsp] - mov r9,QWORD[48+rsp] - - - - mov rax,rsp - -$L$sqr8x_enter: - push rbx - - push rbp - - push r12 - - push r13 - - push r14 - - push r15 - -$L$sqr8x_prologue: - - mov r10d,r9d - shl r9d,3 - shl r10,3+2 - neg r9 - - - - - - - lea r11,[((-64))+r9*2+rsp] - mov rbp,rsp - mov r8,QWORD[r8] - sub r11,rsi - and r11,4095 - cmp r10,r11 - jb NEAR $L$sqr8x_sp_alt - sub rbp,r11 - lea rbp,[((-64))+r9*2+rbp] - jmp NEAR $L$sqr8x_sp_done - -ALIGN 32 -$L$sqr8x_sp_alt: - lea r10,[((4096-64))+r9*2] - lea rbp,[((-64))+r9*2+rbp] - sub r11,r10 - mov r10,0 - cmovc r11,r10 - sub rbp,r11 -$L$sqr8x_sp_done: - and rbp,-64 - mov r11,rsp - sub r11,rbp - and r11,-4096 - lea rsp,[rbp*1+r11] - mov r10,QWORD[rsp] - cmp rsp,rbp - ja NEAR $L$sqr8x_page_walk - jmp NEAR $L$sqr8x_page_walk_done - -ALIGN 16 -$L$sqr8x_page_walk: - lea rsp,[((-4096))+rsp] - mov r10,QWORD[rsp] - cmp rsp,rbp - ja NEAR $L$sqr8x_page_walk -$L$sqr8x_page_walk_done: - - mov r10,r9 - neg r9 - - mov QWORD[32+rsp],r8 - mov QWORD[40+rsp],rax - -$L$sqr8x_body: - -DB 102,72,15,110,209 - pxor xmm0,xmm0 -DB 102,72,15,110,207 -DB 102,73,15,110,218 - mov eax,DWORD[((GFp_ia32cap_P+8))] - and eax,0x80100 - cmp eax,0x80100 - jne NEAR $L$sqr8x_nox - - call GFp_bn_sqrx8x_internal - - - - - lea rbx,[rcx*1+r8] - mov r9,rcx - mov rdx,rcx -DB 102,72,15,126,207 - sar rcx,3+2 - jmp NEAR $L$sqr8x_sub - -ALIGN 32 -$L$sqr8x_nox: - call GFp_bn_sqr8x_internal - - - - - lea rbx,[r9*1+rdi] - mov rcx,r9 - mov rdx,r9 -DB 102,72,15,126,207 - sar rcx,3+2 - jmp NEAR $L$sqr8x_sub - -ALIGN 32 -$L$sqr8x_sub: - mov r12,QWORD[rbx] - mov r13,QWORD[8+rbx] - mov r14,QWORD[16+rbx] - mov r15,QWORD[24+rbx] - lea rbx,[32+rbx] - sbb r12,QWORD[rbp] - sbb r13,QWORD[8+rbp] - sbb r14,QWORD[16+rbp] - sbb r15,QWORD[24+rbp] - lea rbp,[32+rbp] - mov QWORD[rdi],r12 - mov QWORD[8+rdi],r13 - mov QWORD[16+rdi],r14 - mov QWORD[24+rdi],r15 - lea rdi,[32+rdi] - inc rcx - jnz NEAR $L$sqr8x_sub - - sbb rax,0 - lea rbx,[r9*1+rbx] - lea rdi,[r9*1+rdi] - -DB 102,72,15,110,200 - pxor xmm0,xmm0 - pshufd xmm1,xmm1,0 - mov rsi,QWORD[40+rsp] - - jmp NEAR $L$sqr8x_cond_copy - -ALIGN 32 -$L$sqr8x_cond_copy: - movdqa xmm2,XMMWORD[rbx] - movdqa xmm3,XMMWORD[16+rbx] - lea rbx,[32+rbx] - movdqu xmm4,XMMWORD[rdi] - movdqu xmm5,XMMWORD[16+rdi] - lea rdi,[32+rdi] - movdqa XMMWORD[(-32)+rbx],xmm0 - movdqa XMMWORD[(-16)+rbx],xmm0 - movdqa XMMWORD[(-32)+rdx*1+rbx],xmm0 - movdqa XMMWORD[(-16)+rdx*1+rbx],xmm0 - pcmpeqd xmm0,xmm1 - pand xmm2,xmm1 - pand xmm3,xmm1 - pand xmm4,xmm0 - pand xmm5,xmm0 - pxor xmm0,xmm0 - por xmm4,xmm2 - por xmm5,xmm3 - movdqu XMMWORD[(-32)+rdi],xmm4 - movdqu XMMWORD[(-16)+rdi],xmm5 - add r9,32 - jnz NEAR $L$sqr8x_cond_copy - - mov rax,1 - mov r15,QWORD[((-48))+rsi] - - mov r14,QWORD[((-40))+rsi] - - mov r13,QWORD[((-32))+rsi] - - mov r12,QWORD[((-24))+rsi] - - mov rbp,QWORD[((-16))+rsi] - - mov rbx,QWORD[((-8))+rsi] - - lea rsp,[rsi] - -$L$sqr8x_epilogue: - mov rdi,QWORD[8+rsp] ;WIN64 epilogue - mov rsi,QWORD[16+rsp] - DB 0F3h,0C3h ;repret - -$L$SEH_end_bn_sqr8x_mont: - -ALIGN 32 -bn_mulx4x_mont: - mov QWORD[8+rsp],rdi ;WIN64 prologue - mov QWORD[16+rsp],rsi - mov rax,rsp -$L$SEH_begin_bn_mulx4x_mont: - mov rdi,rcx - mov rsi,rdx - mov rdx,r8 - mov rcx,r9 - mov r8,QWORD[40+rsp] - mov r9,QWORD[48+rsp] - - - - mov rax,rsp - -$L$mulx4x_enter: - push rbx - - push rbp - - push r12 - - push r13 - - push r14 - - push r15 - -$L$mulx4x_prologue: - - shl r9d,3 - xor r10,r10 - sub r10,r9 - mov r8,QWORD[r8] - lea rbp,[((-72))+r10*1+rsp] - and rbp,-128 - mov r11,rsp - sub r11,rbp - and r11,-4096 - lea rsp,[rbp*1+r11] - mov r10,QWORD[rsp] - cmp rsp,rbp - ja NEAR $L$mulx4x_page_walk - jmp NEAR $L$mulx4x_page_walk_done - -ALIGN 16 -$L$mulx4x_page_walk: - lea rsp,[((-4096))+rsp] - mov r10,QWORD[rsp] - cmp rsp,rbp - ja NEAR $L$mulx4x_page_walk -$L$mulx4x_page_walk_done: - - lea r10,[r9*1+rdx] - - - - - - - - - - - - - mov QWORD[rsp],r9 - shr r9,5 - mov QWORD[16+rsp],r10 - sub r9,1 - mov QWORD[24+rsp],r8 - mov QWORD[32+rsp],rdi - mov QWORD[40+rsp],rax - - mov QWORD[48+rsp],r9 - jmp NEAR $L$mulx4x_body - -ALIGN 32 -$L$mulx4x_body: - lea rdi,[8+rdx] - mov rdx,QWORD[rdx] - lea rbx,[((64+32))+rsp] - mov r9,rdx - - mulx rax,r8,QWORD[rsi] - mulx r14,r11,QWORD[8+rsi] - add r11,rax - mov QWORD[8+rsp],rdi - mulx r13,r12,QWORD[16+rsi] - adc r12,r14 - adc r13,0 - - mov rdi,r8 - imul r8,QWORD[24+rsp] - xor rbp,rbp - - mulx r14,rax,QWORD[24+rsi] - mov rdx,r8 - lea rsi,[32+rsi] - adcx r13,rax - adcx r14,rbp - - mulx r10,rax,QWORD[rcx] - adcx rdi,rax - adox r10,r11 - mulx r11,rax,QWORD[8+rcx] - adcx r10,rax - adox r11,r12 -DB 0xc4,0x62,0xfb,0xf6,0xa1,0x10,0x00,0x00,0x00 - mov rdi,QWORD[48+rsp] - mov QWORD[((-32))+rbx],r10 - adcx r11,rax - adox r12,r13 - mulx r15,rax,QWORD[24+rcx] - mov rdx,r9 - mov QWORD[((-24))+rbx],r11 - adcx r12,rax - adox r15,rbp - lea rcx,[32+rcx] - mov QWORD[((-16))+rbx],r12 - - jmp NEAR $L$mulx4x_1st - -ALIGN 32 -$L$mulx4x_1st: - adcx r15,rbp - mulx rax,r10,QWORD[rsi] - adcx r10,r14 - mulx r14,r11,QWORD[8+rsi] - adcx r11,rax - mulx rax,r12,QWORD[16+rsi] - adcx r12,r14 - mulx r14,r13,QWORD[24+rsi] -DB 0x67,0x67 - mov rdx,r8 - adcx r13,rax - adcx r14,rbp - lea rsi,[32+rsi] - lea rbx,[32+rbx] - - adox r10,r15 - mulx r15,rax,QWORD[rcx] - adcx r10,rax - adox r11,r15 - mulx r15,rax,QWORD[8+rcx] - adcx r11,rax - adox r12,r15 - mulx r15,rax,QWORD[16+rcx] - mov QWORD[((-40))+rbx],r10 - adcx r12,rax - mov QWORD[((-32))+rbx],r11 - adox r13,r15 - mulx r15,rax,QWORD[24+rcx] - mov rdx,r9 - mov QWORD[((-24))+rbx],r12 - adcx r13,rax - adox r15,rbp - lea rcx,[32+rcx] - mov QWORD[((-16))+rbx],r13 - - dec rdi - jnz NEAR $L$mulx4x_1st - - mov rax,QWORD[rsp] - mov rdi,QWORD[8+rsp] - adc r15,rbp - add r14,r15 - sbb r15,r15 - mov QWORD[((-8))+rbx],r14 - jmp NEAR $L$mulx4x_outer - -ALIGN 32 -$L$mulx4x_outer: - mov rdx,QWORD[rdi] - lea rdi,[8+rdi] - sub rsi,rax - mov QWORD[rbx],r15 - lea rbx,[((64+32))+rsp] - sub rcx,rax - - mulx r11,r8,QWORD[rsi] - xor ebp,ebp - mov r9,rdx - mulx r12,r14,QWORD[8+rsi] - adox r8,QWORD[((-32))+rbx] - adcx r11,r14 - mulx r13,r15,QWORD[16+rsi] - adox r11,QWORD[((-24))+rbx] - adcx r12,r15 - adox r12,QWORD[((-16))+rbx] - adcx r13,rbp - adox r13,rbp - - mov QWORD[8+rsp],rdi - mov r15,r8 - imul r8,QWORD[24+rsp] - xor ebp,ebp - - mulx r14,rax,QWORD[24+rsi] - mov rdx,r8 - adcx r13,rax - adox r13,QWORD[((-8))+rbx] - adcx r14,rbp - lea rsi,[32+rsi] - adox r14,rbp - - mulx r10,rax,QWORD[rcx] - adcx r15,rax - adox r10,r11 - mulx r11,rax,QWORD[8+rcx] - adcx r10,rax - adox r11,r12 - mulx r12,rax,QWORD[16+rcx] - mov QWORD[((-32))+rbx],r10 - adcx r11,rax - adox r12,r13 - mulx r15,rax,QWORD[24+rcx] - mov rdx,r9 - mov QWORD[((-24))+rbx],r11 - lea rcx,[32+rcx] - adcx r12,rax - adox r15,rbp - mov rdi,QWORD[48+rsp] - mov QWORD[((-16))+rbx],r12 - - jmp NEAR $L$mulx4x_inner - -ALIGN 32 -$L$mulx4x_inner: - mulx rax,r10,QWORD[rsi] - adcx r15,rbp - adox r10,r14 - mulx r14,r11,QWORD[8+rsi] - adcx r10,QWORD[rbx] - adox r11,rax - mulx rax,r12,QWORD[16+rsi] - adcx r11,QWORD[8+rbx] - adox r12,r14 - mulx r14,r13,QWORD[24+rsi] - mov rdx,r8 - adcx r12,QWORD[16+rbx] - adox r13,rax - adcx r13,QWORD[24+rbx] - adox r14,rbp - lea rsi,[32+rsi] - lea rbx,[32+rbx] - adcx r14,rbp - - adox r10,r15 - mulx r15,rax,QWORD[rcx] - adcx r10,rax - adox r11,r15 - mulx r15,rax,QWORD[8+rcx] - adcx r11,rax - adox r12,r15 - mulx r15,rax,QWORD[16+rcx] - mov QWORD[((-40))+rbx],r10 - adcx r12,rax - adox r13,r15 - mulx r15,rax,QWORD[24+rcx] - mov rdx,r9 - mov QWORD[((-32))+rbx],r11 - mov QWORD[((-24))+rbx],r12 - adcx r13,rax - adox r15,rbp - lea rcx,[32+rcx] - mov QWORD[((-16))+rbx],r13 - - dec rdi - jnz NEAR $L$mulx4x_inner - - mov rax,QWORD[rsp] - mov rdi,QWORD[8+rsp] - adc r15,rbp - sub rbp,QWORD[rbx] - adc r14,r15 - sbb r15,r15 - mov QWORD[((-8))+rbx],r14 - - cmp rdi,QWORD[16+rsp] - jne NEAR $L$mulx4x_outer - - lea rbx,[64+rsp] - sub rcx,rax - neg r15 - mov rdx,rax - shr rax,3+2 - mov rdi,QWORD[32+rsp] - jmp NEAR $L$mulx4x_sub - -ALIGN 32 -$L$mulx4x_sub: - mov r11,QWORD[rbx] - mov r12,QWORD[8+rbx] - mov r13,QWORD[16+rbx] - mov r14,QWORD[24+rbx] - lea rbx,[32+rbx] - sbb r11,QWORD[rcx] - sbb r12,QWORD[8+rcx] - sbb r13,QWORD[16+rcx] - sbb r14,QWORD[24+rcx] - lea rcx,[32+rcx] - mov QWORD[rdi],r11 - mov QWORD[8+rdi],r12 - mov QWORD[16+rdi],r13 - mov QWORD[24+rdi],r14 - lea rdi,[32+rdi] - dec rax - jnz NEAR $L$mulx4x_sub - - sbb r15,0 - lea rbx,[64+rsp] - sub rdi,rdx - -DB 102,73,15,110,207 - pxor xmm0,xmm0 - pshufd xmm1,xmm1,0 - mov rsi,QWORD[40+rsp] - - jmp NEAR $L$mulx4x_cond_copy - -ALIGN 32 -$L$mulx4x_cond_copy: - movdqa xmm2,XMMWORD[rbx] - movdqa xmm3,XMMWORD[16+rbx] - lea rbx,[32+rbx] - movdqu xmm4,XMMWORD[rdi] - movdqu xmm5,XMMWORD[16+rdi] - lea rdi,[32+rdi] - movdqa XMMWORD[(-32)+rbx],xmm0 - movdqa XMMWORD[(-16)+rbx],xmm0 - pcmpeqd xmm0,xmm1 - pand xmm2,xmm1 - pand xmm3,xmm1 - pand xmm4,xmm0 - pand xmm5,xmm0 - pxor xmm0,xmm0 - por xmm4,xmm2 - por xmm5,xmm3 - movdqu XMMWORD[(-32)+rdi],xmm4 - movdqu XMMWORD[(-16)+rdi],xmm5 - sub rdx,32 - jnz NEAR $L$mulx4x_cond_copy - - mov QWORD[rbx],rdx - - mov rax,1 - mov r15,QWORD[((-48))+rsi] - - mov r14,QWORD[((-40))+rsi] - - mov r13,QWORD[((-32))+rsi] - - mov r12,QWORD[((-24))+rsi] - - mov rbp,QWORD[((-16))+rsi] - - mov rbx,QWORD[((-8))+rsi] - - lea rsp,[rsi] - -$L$mulx4x_epilogue: - mov rdi,QWORD[8+rsp] ;WIN64 epilogue - mov rsi,QWORD[16+rsp] - DB 0F3h,0C3h ;repret - -$L$SEH_end_bn_mulx4x_mont: -DB 77,111,110,116,103,111,109,101,114,121,32,77,117,108,116,105 -DB 112,108,105,99,97,116,105,111,110,32,102,111,114,32,120,56 -DB 54,95,54,52,44,32,67,82,89,80,84,79,71,65,77,83 -DB 32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115 -DB 115,108,46,111,114,103,62,0 -ALIGN 16 -EXTERN __imp_RtlVirtualUnwind - -ALIGN 16 -mul_handler: - push rsi - push rdi - push rbx - push rbp - push r12 - push r13 - push r14 - push r15 - pushfq - sub rsp,64 - - mov rax,QWORD[120+r8] - mov rbx,QWORD[248+r8] - - mov rsi,QWORD[8+r9] - mov r11,QWORD[56+r9] - - mov r10d,DWORD[r11] - lea r10,[r10*1+rsi] - cmp rbx,r10 - jb NEAR $L$common_seh_tail - - mov rax,QWORD[152+r8] - - mov r10d,DWORD[4+r11] - lea r10,[r10*1+rsi] - cmp rbx,r10 - jae NEAR $L$common_seh_tail - - mov r10,QWORD[192+r8] - mov rax,QWORD[8+r10*8+rax] - - jmp NEAR $L$common_pop_regs - - - -ALIGN 16 -sqr_handler: - push rsi - push rdi - push rbx - push rbp - push r12 - push r13 - push r14 - push r15 - pushfq - sub rsp,64 - - mov rax,QWORD[120+r8] - mov rbx,QWORD[248+r8] - - mov rsi,QWORD[8+r9] - mov r11,QWORD[56+r9] - - mov r10d,DWORD[r11] - lea r10,[r10*1+rsi] - cmp rbx,r10 - jb NEAR $L$common_seh_tail - - mov r10d,DWORD[4+r11] - lea r10,[r10*1+rsi] - cmp rbx,r10 - jb NEAR $L$common_pop_regs - - mov rax,QWORD[152+r8] - - mov r10d,DWORD[8+r11] - lea r10,[r10*1+rsi] - cmp rbx,r10 - jae NEAR $L$common_seh_tail - - mov rax,QWORD[40+rax] - -$L$common_pop_regs: - mov rbx,QWORD[((-8))+rax] - mov rbp,QWORD[((-16))+rax] - mov r12,QWORD[((-24))+rax] - mov r13,QWORD[((-32))+rax] - mov r14,QWORD[((-40))+rax] - mov r15,QWORD[((-48))+rax] - mov QWORD[144+r8],rbx - mov QWORD[160+r8],rbp - mov QWORD[216+r8],r12 - mov QWORD[224+r8],r13 - mov QWORD[232+r8],r14 - mov QWORD[240+r8],r15 - -$L$common_seh_tail: - mov rdi,QWORD[8+rax] - mov rsi,QWORD[16+rax] - mov QWORD[152+r8],rax - mov QWORD[168+r8],rsi - mov QWORD[176+r8],rdi - - mov rdi,QWORD[40+r9] - mov rsi,r8 - mov ecx,154 - DD 0xa548f3fc - - mov rsi,r9 - xor rcx,rcx - mov rdx,QWORD[8+rsi] - mov r8,QWORD[rsi] - mov r9,QWORD[16+rsi] - mov r10,QWORD[40+rsi] - lea r11,[56+rsi] - lea r12,[24+rsi] - mov QWORD[32+rsp],r10 - mov QWORD[40+rsp],r11 - mov QWORD[48+rsp],r12 - mov QWORD[56+rsp],rcx - call QWORD[__imp_RtlVirtualUnwind] - - mov eax,1 - add rsp,64 - popfq - pop r15 - pop r14 - pop r13 - pop r12 - pop rbp - pop rbx - pop rdi - pop rsi - DB 0F3h,0C3h ;repret - - -section .pdata rdata align=4 -ALIGN 4 - DD $L$SEH_begin_GFp_bn_mul_mont wrt ..imagebase - DD $L$SEH_end_GFp_bn_mul_mont wrt ..imagebase - DD $L$SEH_info_GFp_bn_mul_mont wrt ..imagebase - - DD $L$SEH_begin_bn_mul4x_mont wrt ..imagebase - DD $L$SEH_end_bn_mul4x_mont wrt ..imagebase - DD $L$SEH_info_bn_mul4x_mont wrt ..imagebase - - DD $L$SEH_begin_bn_sqr8x_mont wrt ..imagebase - DD $L$SEH_end_bn_sqr8x_mont wrt ..imagebase - DD $L$SEH_info_bn_sqr8x_mont wrt ..imagebase - DD $L$SEH_begin_bn_mulx4x_mont wrt ..imagebase - DD $L$SEH_end_bn_mulx4x_mont wrt ..imagebase - DD $L$SEH_info_bn_mulx4x_mont wrt ..imagebase -section .xdata rdata align=8 -ALIGN 8 -$L$SEH_info_GFp_bn_mul_mont: -DB 9,0,0,0 - DD mul_handler wrt ..imagebase - DD $L$mul_body wrt ..imagebase,$L$mul_epilogue wrt ..imagebase -$L$SEH_info_bn_mul4x_mont: -DB 9,0,0,0 - DD mul_handler wrt ..imagebase - DD $L$mul4x_body wrt ..imagebase,$L$mul4x_epilogue wrt ..imagebase -$L$SEH_info_bn_sqr8x_mont: -DB 9,0,0,0 - DD sqr_handler wrt ..imagebase - DD $L$sqr8x_prologue wrt ..imagebase,$L$sqr8x_body wrt ..imagebase,$L$sqr8x_epilogue wrt ..imagebase -ALIGN 8 -$L$SEH_info_bn_mulx4x_mont: -DB 9,0,0,0 - DD sqr_handler wrt ..imagebase - DD $L$mulx4x_prologue wrt ..imagebase,$L$mulx4x_body wrt ..imagebase,$L$mulx4x_epilogue wrt ..imagebase -ALIGN 8 diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/tmp/x86-mont-win32n.asm temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/tmp/x86-mont-win32n.asm --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/tmp/x86-mont-win32n.asm 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/tmp/x86-mont-win32n.asm 1970-01-01 00:00:00.000000000 +0000 @@ -1,227 +0,0 @@ -; This file is generated from a similarly-named Perl script in the BoringSSL -; source tree. Do not edit by hand. - -%ifdef BORINGSSL_PREFIX -%include "boringssl_prefix_symbols_nasm.inc" -%endif -%ifidn __OUTPUT_FORMAT__,obj -section code use32 class=code align=64 -%elifidn __OUTPUT_FORMAT__,win32 -$@feat.00 equ 1 -section .text code align=64 -%else -section .text code -%endif -;extern _GFp_ia32cap_P -global _GFp_bn_mul_mont -align 16 -_GFp_bn_mul_mont: -L$_GFp_bn_mul_mont_begin: - push ebp - push ebx - push esi - push edi - xor eax,eax - mov edi,DWORD [40+esp] - lea esi,[20+esp] - lea edx,[24+esp] - add edi,2 - neg edi - lea ebp,[edi*4+esp-32] - neg edi - mov eax,ebp - sub eax,edx - and eax,2047 - sub ebp,eax - xor edx,ebp - and edx,2048 - xor edx,2048 - sub ebp,edx - and ebp,-64 - mov eax,esp - sub eax,ebp - and eax,-4096 - mov edx,esp - lea esp,[eax*1+ebp] - mov eax,DWORD [esp] - cmp esp,ebp - ja NEAR L$000page_walk - jmp NEAR L$001page_walk_done -align 16 -L$000page_walk: - lea esp,[esp-4096] - mov eax,DWORD [esp] - cmp esp,ebp - ja NEAR L$000page_walk -L$001page_walk_done: - mov eax,DWORD [esi] - mov ebx,DWORD [4+esi] - mov ecx,DWORD [8+esi] - mov ebp,DWORD [12+esi] - mov esi,DWORD [16+esi] - mov esi,DWORD [esi] - mov DWORD [4+esp],eax - mov DWORD [8+esp],ebx - mov DWORD [12+esp],ecx - mov DWORD [16+esp],ebp - mov DWORD [20+esp],esi - lea ebx,[edi-3] - mov DWORD [24+esp],edx - lea eax,[_GFp_ia32cap_P] - bt DWORD [eax],26 - mov eax,-1 - movd mm7,eax - mov esi,DWORD [8+esp] - mov edi,DWORD [12+esp] - mov ebp,DWORD [16+esp] - xor edx,edx - xor ecx,ecx - movd mm4,DWORD [edi] - movd mm5,DWORD [esi] - movd mm3,DWORD [ebp] - pmuludq mm5,mm4 - movq mm2,mm5 - movq mm0,mm5 - pand mm0,mm7 - pmuludq mm5,[20+esp] - pmuludq mm3,mm5 - paddq mm3,mm0 - movd mm1,DWORD [4+ebp] - movd mm0,DWORD [4+esi] - psrlq mm2,32 - psrlq mm3,32 - inc ecx -align 16 -L$0021st: - pmuludq mm0,mm4 - pmuludq mm1,mm5 - paddq mm2,mm0 - paddq mm3,mm1 - movq mm0,mm2 - pand mm0,mm7 - movd mm1,DWORD [4+ecx*4+ebp] - paddq mm3,mm0 - movd mm0,DWORD [4+ecx*4+esi] - psrlq mm2,32 - movd DWORD [28+ecx*4+esp],mm3 - psrlq mm3,32 - lea ecx,[1+ecx] - cmp ecx,ebx - jl NEAR L$0021st - pmuludq mm0,mm4 - pmuludq mm1,mm5 - paddq mm2,mm0 - paddq mm3,mm1 - movq mm0,mm2 - pand mm0,mm7 - paddq mm3,mm0 - movd DWORD [28+ecx*4+esp],mm3 - psrlq mm2,32 - psrlq mm3,32 - paddq mm3,mm2 - movq [32+ebx*4+esp],mm3 - inc edx -L$003outer: - xor ecx,ecx - movd mm4,DWORD [edx*4+edi] - movd mm5,DWORD [esi] - movd mm6,DWORD [32+esp] - movd mm3,DWORD [ebp] - pmuludq mm5,mm4 - paddq mm5,mm6 - movq mm0,mm5 - movq mm2,mm5 - pand mm0,mm7 - pmuludq mm5,[20+esp] - pmuludq mm3,mm5 - paddq mm3,mm0 - movd mm6,DWORD [36+esp] - movd mm1,DWORD [4+ebp] - movd mm0,DWORD [4+esi] - psrlq mm2,32 - psrlq mm3,32 - paddq mm2,mm6 - inc ecx - dec ebx -L$004inner: - pmuludq mm0,mm4 - pmuludq mm1,mm5 - paddq mm2,mm0 - paddq mm3,mm1 - movq mm0,mm2 - movd mm6,DWORD [36+ecx*4+esp] - pand mm0,mm7 - movd mm1,DWORD [4+ecx*4+ebp] - paddq mm3,mm0 - movd mm0,DWORD [4+ecx*4+esi] - psrlq mm2,32 - movd DWORD [28+ecx*4+esp],mm3 - psrlq mm3,32 - paddq mm2,mm6 - dec ebx - lea ecx,[1+ecx] - jnz NEAR L$004inner - mov ebx,ecx - pmuludq mm0,mm4 - pmuludq mm1,mm5 - paddq mm2,mm0 - paddq mm3,mm1 - movq mm0,mm2 - pand mm0,mm7 - paddq mm3,mm0 - movd DWORD [28+ecx*4+esp],mm3 - psrlq mm2,32 - psrlq mm3,32 - movd mm6,DWORD [36+ebx*4+esp] - paddq mm3,mm2 - paddq mm3,mm6 - movq [32+ebx*4+esp],mm3 - lea edx,[1+edx] - cmp edx,ebx - jle NEAR L$003outer - emms -align 16 -L$005common_tail: - mov ebp,DWORD [16+esp] - mov edi,DWORD [4+esp] - lea esi,[32+esp] - mov eax,DWORD [esi] - mov ecx,ebx - xor edx,edx -align 16 -L$006sub: - sbb eax,DWORD [edx*4+ebp] - mov DWORD [edx*4+edi],eax - dec ecx - mov eax,DWORD [4+edx*4+esi] - lea edx,[1+edx] - jge NEAR L$006sub - sbb eax,0 - mov edx,-1 - xor edx,eax - jmp NEAR L$007copy -align 16 -L$007copy: - mov esi,DWORD [32+ebx*4+esp] - mov ebp,DWORD [ebx*4+edi] - mov DWORD [32+ebx*4+esp],ecx - and esi,eax - and ebp,edx - or ebp,esi - mov DWORD [ebx*4+edi],ebp - dec ebx - jge NEAR L$007copy - mov esp,DWORD [24+esp] - mov eax,1 - pop edi - pop esi - pop ebx - pop ebp - ret -db 77,111,110,116,103,111,109,101,114,121,32,77,117,108,116,105 -db 112,108,105,99,97,116,105,111,110,32,102,111,114,32,120,56 -db 54,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121 -db 32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46 -db 111,114,103,62,0 -segment .bss -common _GFp_ia32cap_P 16 diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/vpaes-armv7-ios32.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/vpaes-armv7-ios32.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/vpaes-armv7-ios32.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/vpaes-armv7-ios32.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,769 +0,0 @@ -// This file is generated from a similarly-named Perl script in the BoringSSL -// source tree. Do not edit by hand. - -#if !defined(__has_feature) -#define __has_feature(x) 0 -#endif -#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) -#define OPENSSL_NO_ASM -#endif - -#if !defined(OPENSSL_NO_ASM) -.syntax unified - - - - -#if defined(__thumb2__) -.thumb -#else -.code 32 -#endif - -.text - - -.align 7 @ totally strategic alignment -_vpaes_consts: -Lk_mc_forward:@ mc_forward -.quad 0x0407060500030201, 0x0C0F0E0D080B0A09 -.quad 0x080B0A0904070605, 0x000302010C0F0E0D -.quad 0x0C0F0E0D080B0A09, 0x0407060500030201 -.quad 0x000302010C0F0E0D, 0x080B0A0904070605 -Lk_mc_backward:@ mc_backward -.quad 0x0605040702010003, 0x0E0D0C0F0A09080B -.quad 0x020100030E0D0C0F, 0x0A09080B06050407 -.quad 0x0E0D0C0F0A09080B, 0x0605040702010003 -.quad 0x0A09080B06050407, 0x020100030E0D0C0F -Lk_sr:@ sr -.quad 0x0706050403020100, 0x0F0E0D0C0B0A0908 -.quad 0x030E09040F0A0500, 0x0B06010C07020D08 -.quad 0x0F060D040B020900, 0x070E050C030A0108 -.quad 0x0B0E0104070A0D00, 0x0306090C0F020508 - -@ -@ "Hot" constants -@ -Lk_inv:@ inv, inva -.quad 0x0E05060F0D080180, 0x040703090A0B0C02 -.quad 0x01040A060F0B0780, 0x030D0E0C02050809 -Lk_ipt:@ input transform (lo, hi) -.quad 0xC2B2E8985A2A7000, 0xCABAE09052227808 -.quad 0x4C01307D317C4D00, 0xCD80B1FCB0FDCC81 -Lk_sbo:@ sbou, sbot -.quad 0xD0D26D176FBDC700, 0x15AABF7AC502A878 -.quad 0xCFE474A55FBB6A00, 0x8E1E90D1412B35FA -Lk_sb1:@ sb1u, sb1t -.quad 0x3618D415FAE22300, 0x3BF7CCC10D2ED9EF -.quad 0xB19BE18FCB503E00, 0xA5DF7A6E142AF544 -Lk_sb2:@ sb2u, sb2t -.quad 0x69EB88400AE12900, 0xC2A163C8AB82234A -.quad 0xE27A93C60B712400, 0x5EB7E955BC982FCD - -.byte 86,101,99,116,111,114,32,80,101,114,109,117,116,97,116,105,111,110,32,65,69,83,32,102,111,114,32,65,82,77,118,55,32,78,69,79,78,44,32,77,105,107,101,32,72,97,109,98,117,114,103,32,40,83,116,97,110,102,111,114,100,32,85,110,105,118,101,114,115,105,116,121,41,0 -.align 2 - -.align 6 -@@ -@@ _aes_preheat -@@ -@@ Fills q9-q15 as specified below. -@@ -#ifdef __thumb2__ -.thumb_func _vpaes_preheat -#endif -.align 4 -_vpaes_preheat: - adr r10, Lk_inv - vmov.i8 q9, #0x0f @ Lk_s0F - vld1.64 {q10,q11}, [r10]! @ Lk_inv - add r10, r10, #64 @ Skip Lk_ipt, Lk_sbo - vld1.64 {q12,q13}, [r10]! @ Lk_sb1 - vld1.64 {q14,q15}, [r10] @ Lk_sb2 - bx lr - -@@ -@@ _aes_encrypt_core -@@ -@@ AES-encrypt q0. -@@ -@@ Inputs: -@@ q0 = input -@@ q9-q15 as in _vpaes_preheat -@@ [r2] = scheduled keys -@@ -@@ Output in q0 -@@ Clobbers q1-q5, r8-r11 -@@ Preserves q6-q8 so you get some local vectors -@@ -@@ -#ifdef __thumb2__ -.thumb_func _vpaes_encrypt_core -#endif -.align 4 -_vpaes_encrypt_core: - mov r9, r2 - ldr r8, [r2,#240] @ pull rounds - adr r11, Lk_ipt - @ vmovdqa .Lk_ipt(%rip), %xmm2 # iptlo - @ vmovdqa .Lk_ipt+16(%rip), %xmm3 # ipthi - vld1.64 {q2, q3}, [r11] - adr r11, Lk_mc_forward+16 - vld1.64 {q5}, [r9]! @ vmovdqu (%r9), %xmm5 # round0 key - vand q1, q0, q9 @ vpand %xmm9, %xmm0, %xmm1 - vshr.u8 q0, q0, #4 @ vpsrlb $4, %xmm0, %xmm0 - vtbl.8 d2, {q2}, d2 @ vpshufb %xmm1, %xmm2, %xmm1 - vtbl.8 d3, {q2}, d3 - vtbl.8 d4, {q3}, d0 @ vpshufb %xmm0, %xmm3, %xmm2 - vtbl.8 d5, {q3}, d1 - veor q0, q1, q5 @ vpxor %xmm5, %xmm1, %xmm0 - veor q0, q0, q2 @ vpxor %xmm2, %xmm0, %xmm0 - - @ .Lenc_entry ends with a bnz instruction which is normally paired with - @ subs in .Lenc_loop. - tst r8, r8 - b Lenc_entry - -.align 4 -Lenc_loop: - @ middle of middle round - add r10, r11, #0x40 - vtbl.8 d8, {q13}, d4 @ vpshufb %xmm2, %xmm13, %xmm4 # 4 = sb1u - vtbl.8 d9, {q13}, d5 - vld1.64 {q1}, [r11]! @ vmovdqa -0x40(%r11,%r10), %xmm1 # Lk_mc_forward[] - vtbl.8 d0, {q12}, d6 @ vpshufb %xmm3, %xmm12, %xmm0 # 0 = sb1t - vtbl.8 d1, {q12}, d7 - veor q4, q4, q5 @ vpxor %xmm5, %xmm4, %xmm4 # 4 = sb1u + k - vtbl.8 d10, {q15}, d4 @ vpshufb %xmm2, %xmm15, %xmm5 # 4 = sb2u - vtbl.8 d11, {q15}, d5 - veor q0, q0, q4 @ vpxor %xmm4, %xmm0, %xmm0 # 0 = A - vtbl.8 d4, {q14}, d6 @ vpshufb %xmm3, %xmm14, %xmm2 # 2 = sb2t - vtbl.8 d5, {q14}, d7 - vld1.64 {q4}, [r10] @ vmovdqa (%r11,%r10), %xmm4 # Lk_mc_backward[] - vtbl.8 d6, {q0}, d2 @ vpshufb %xmm1, %xmm0, %xmm3 # 0 = B - vtbl.8 d7, {q0}, d3 - veor q2, q2, q5 @ vpxor %xmm5, %xmm2, %xmm2 # 2 = 2A - @ Write to q5 instead of q0, so the table and destination registers do - @ not overlap. - vtbl.8 d10, {q0}, d8 @ vpshufb %xmm4, %xmm0, %xmm0 # 3 = D - vtbl.8 d11, {q0}, d9 - veor q3, q3, q2 @ vpxor %xmm2, %xmm3, %xmm3 # 0 = 2A+B - vtbl.8 d8, {q3}, d2 @ vpshufb %xmm1, %xmm3, %xmm4 # 0 = 2B+C - vtbl.8 d9, {q3}, d3 - @ Here we restore the original q0/q5 usage. - veor q0, q5, q3 @ vpxor %xmm3, %xmm0, %xmm0 # 3 = 2A+B+D - and r11, r11, #~(1<<6) @ and $0x30, %r11 # ... mod 4 - veor q0, q0, q4 @ vpxor %xmm4, %xmm0, %xmm0 # 0 = 2A+3B+C+D - subs r8, r8, #1 @ nr-- - -Lenc_entry: - @ top of round - vand q1, q0, q9 @ vpand %xmm0, %xmm9, %xmm1 # 0 = k - vshr.u8 q0, q0, #4 @ vpsrlb $4, %xmm0, %xmm0 # 1 = i - vtbl.8 d10, {q11}, d2 @ vpshufb %xmm1, %xmm11, %xmm5 # 2 = a/k - vtbl.8 d11, {q11}, d3 - veor q1, q1, q0 @ vpxor %xmm0, %xmm1, %xmm1 # 0 = j - vtbl.8 d6, {q10}, d0 @ vpshufb %xmm0, %xmm10, %xmm3 # 3 = 1/i - vtbl.8 d7, {q10}, d1 - vtbl.8 d8, {q10}, d2 @ vpshufb %xmm1, %xmm10, %xmm4 # 4 = 1/j - vtbl.8 d9, {q10}, d3 - veor q3, q3, q5 @ vpxor %xmm5, %xmm3, %xmm3 # 3 = iak = 1/i + a/k - veor q4, q4, q5 @ vpxor %xmm5, %xmm4, %xmm4 # 4 = jak = 1/j + a/k - vtbl.8 d4, {q10}, d6 @ vpshufb %xmm3, %xmm10, %xmm2 # 2 = 1/iak - vtbl.8 d5, {q10}, d7 - vtbl.8 d6, {q10}, d8 @ vpshufb %xmm4, %xmm10, %xmm3 # 3 = 1/jak - vtbl.8 d7, {q10}, d9 - veor q2, q2, q1 @ vpxor %xmm1, %xmm2, %xmm2 # 2 = io - veor q3, q3, q0 @ vpxor %xmm0, %xmm3, %xmm3 # 3 = jo - vld1.64 {q5}, [r9]! @ vmovdqu (%r9), %xmm5 - bne Lenc_loop - - @ middle of last round - add r10, r11, #0x80 - - adr r11, Lk_sbo - @ Read to q1 instead of q4, so the vtbl.8 instruction below does not - @ overlap table and destination registers. - vld1.64 {q1}, [r11]! @ vmovdqa -0x60(%r10), %xmm4 # 3 : sbou - vld1.64 {q0}, [r11] @ vmovdqa -0x50(%r10), %xmm0 # 0 : sbot Lk_sbo+16 - vtbl.8 d8, {q1}, d4 @ vpshufb %xmm2, %xmm4, %xmm4 # 4 = sbou - vtbl.8 d9, {q1}, d5 - vld1.64 {q1}, [r10] @ vmovdqa 0x40(%r11,%r10), %xmm1 # Lk_sr[] - @ Write to q2 instead of q0 below, to avoid overlapping table and - @ destination registers. - vtbl.8 d4, {q0}, d6 @ vpshufb %xmm3, %xmm0, %xmm0 # 0 = sb1t - vtbl.8 d5, {q0}, d7 - veor q4, q4, q5 @ vpxor %xmm5, %xmm4, %xmm4 # 4 = sb1u + k - veor q2, q2, q4 @ vpxor %xmm4, %xmm0, %xmm0 # 0 = A - @ Here we restore the original q0/q2 usage. - vtbl.8 d0, {q2}, d2 @ vpshufb %xmm1, %xmm0, %xmm0 - vtbl.8 d1, {q2}, d3 - bx lr - - -.globl _GFp_vpaes_encrypt -.private_extern _GFp_vpaes_encrypt -#ifdef __thumb2__ -.thumb_func _GFp_vpaes_encrypt -#endif -.align 4 -_GFp_vpaes_encrypt: - @ _vpaes_encrypt_core uses r8-r11. Round up to r7-r11 to maintain stack - @ alignment. - stmdb sp!, {r7,r8,r9,r10,r11,lr} - @ _vpaes_encrypt_core uses q4-q5 (d8-d11), which are callee-saved. - vstmdb sp!, {d8,d9,d10,d11} - - vld1.64 {q0}, [r0] - bl _vpaes_preheat - bl _vpaes_encrypt_core - vst1.64 {q0}, [r1] - - vldmia sp!, {d8,d9,d10,d11} - ldmia sp!, {r7,r8,r9,r10,r11, pc} @ return - -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@ @@ -@@ AES key schedule @@ -@@ @@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - -@ This function diverges from both x86_64 and armv7 in which constants are -@ pinned. x86_64 has a common preheat function for all operations. aarch64 -@ separates them because it has enough registers to pin nearly all constants. -@ armv7 does not have enough registers, but needing explicit loads and stores -@ also complicates using x86_64's register allocation directly. -@ -@ We pin some constants for convenience and leave q14 and q15 free to load -@ others on demand. - -@ -@ Key schedule constants -@ - -.align 4 -_vpaes_key_consts: -Lk_rcon:@ rcon -.quad 0x1F8391B9AF9DEEB6, 0x702A98084D7C7D81 - -Lk_opt:@ output transform -.quad 0xFF9F4929D6B66000, 0xF7974121DEBE6808 -.quad 0x01EDBD5150BCEC00, 0xE10D5DB1B05C0CE0 -Lk_deskew:@ deskew tables: inverts the sbox's "skew" -.quad 0x07E4A34047A4E300, 0x1DFEB95A5DBEF91A -.quad 0x5F36B5DC83EA6900, 0x2841C2ABF49D1E77 - - -#ifdef __thumb2__ -.thumb_func _vpaes_key_preheat -#endif -.align 4 -_vpaes_key_preheat: - adr r11, Lk_rcon - vmov.i8 q12, #0x5b @ Lk_s63 - adr r10, Lk_inv @ Must be aligned to 8 mod 16. - vmov.i8 q9, #0x0f @ Lk_s0F - vld1.64 {q10,q11}, [r10] @ Lk_inv - vld1.64 {q8}, [r11] @ Lk_rcon - bx lr - - -#ifdef __thumb2__ -.thumb_func _vpaes_schedule_core -#endif -.align 4 -_vpaes_schedule_core: - @ We only need to save lr, but ARM requires an 8-byte stack alignment, - @ so save an extra register. - stmdb sp!, {r3,lr} - - bl _vpaes_key_preheat @ load the tables - - adr r11, Lk_ipt @ Must be aligned to 8 mod 16. - vld1.64 {q0}, [r0]! @ vmovdqu (%rdi), %xmm0 # load key (unaligned) - - @ input transform - @ Use q4 here rather than q3 so .Lschedule_am_decrypting does not - @ overlap table and destination. - vmov q4, q0 @ vmovdqa %xmm0, %xmm3 - bl _vpaes_schedule_transform - adr r10, Lk_sr @ Must be aligned to 8 mod 16. - vmov q7, q0 @ vmovdqa %xmm0, %xmm7 - - add r8, r8, r10 - - @ encrypting, output zeroth round key after transform - vst1.64 {q0}, [r2] @ vmovdqu %xmm0, (%rdx) - - @ *ring*: Decryption removed. - -Lschedule_go: - cmp r1, #192 @ cmp $192, %esi - bhi Lschedule_256 - @ 128: fall though - -@@ -@@ .schedule_128 -@@ -@@ 128-bit specific part of key schedule. -@@ -@@ This schedule is really simple, because all its parts -@@ are accomplished by the subroutines. -@@ -Lschedule_128: - mov r0, #10 @ mov $10, %esi - -Loop_schedule_128: - bl _vpaes_schedule_round - subs r0, r0, #1 @ dec %esi - beq Lschedule_mangle_last - bl _vpaes_schedule_mangle @ write output - b Loop_schedule_128 - -@@ -@@ .aes_schedule_256 -@@ -@@ 256-bit specific part of key schedule. -@@ -@@ The structure here is very similar to the 128-bit -@@ schedule, but with an additional "low side" in -@@ q6. The low side's rounds are the same as the -@@ high side's, except no rcon and no rotation. -@@ -.align 4 -Lschedule_256: - vld1.64 {q0}, [r0] @ vmovdqu 16(%rdi),%xmm0 # load key part 2 (unaligned) - bl _vpaes_schedule_transform @ input transform - mov r0, #7 @ mov $7, %esi - -Loop_schedule_256: - bl _vpaes_schedule_mangle @ output low result - vmov q6, q0 @ vmovdqa %xmm0, %xmm6 # save cur_lo in xmm6 - - @ high round - bl _vpaes_schedule_round - subs r0, r0, #1 @ dec %esi - beq Lschedule_mangle_last - bl _vpaes_schedule_mangle - - @ low round. swap xmm7 and xmm6 - vdup.32 q0, d1[1] @ vpshufd $0xFF, %xmm0, %xmm0 - vmov.i8 q4, #0 - vmov q5, q7 @ vmovdqa %xmm7, %xmm5 - vmov q7, q6 @ vmovdqa %xmm6, %xmm7 - bl _vpaes_schedule_low_round - vmov q7, q5 @ vmovdqa %xmm5, %xmm7 - - b Loop_schedule_256 - -@@ -@@ .aes_schedule_mangle_last -@@ -@@ Mangler for last round of key schedule -@@ Mangles q0 -@@ when encrypting, outputs out(q0) ^ 63 -@@ when decrypting, outputs unskew(q0) -@@ -@@ Always called right before return... jumps to cleanup and exits -@@ -.align 4 -Lschedule_mangle_last: - @ schedule last round key from xmm0 - adr r11, Lk_deskew @ lea Lk_deskew(%rip),%r11 # prepare to deskew - - @ encrypting - vld1.64 {q1}, [r8] @ vmovdqa (%r8,%r10),%xmm1 - adr r11, Lk_opt @ lea Lk_opt(%rip), %r11 # prepare to output transform - add r2, r2, #32 @ add $32, %rdx - vmov q2, q0 - vtbl.8 d0, {q2}, d2 @ vpshufb %xmm1, %xmm0, %xmm0 # output permute - vtbl.8 d1, {q2}, d3 - -Lschedule_mangle_last_dec: - sub r2, r2, #16 @ add $-16, %rdx - veor q0, q0, q12 @ vpxor Lk_s63(%rip), %xmm0, %xmm0 - bl _vpaes_schedule_transform @ output transform - vst1.64 {q0}, [r2] @ vmovdqu %xmm0, (%rdx) # save last key - - @ cleanup - veor q0, q0, q0 @ vpxor %xmm0, %xmm0, %xmm0 - veor q1, q1, q1 @ vpxor %xmm1, %xmm1, %xmm1 - veor q2, q2, q2 @ vpxor %xmm2, %xmm2, %xmm2 - veor q3, q3, q3 @ vpxor %xmm3, %xmm3, %xmm3 - veor q4, q4, q4 @ vpxor %xmm4, %xmm4, %xmm4 - veor q5, q5, q5 @ vpxor %xmm5, %xmm5, %xmm5 - veor q6, q6, q6 @ vpxor %xmm6, %xmm6, %xmm6 - veor q7, q7, q7 @ vpxor %xmm7, %xmm7, %xmm7 - ldmia sp!, {r3,pc} @ return - - -@@ -@@ .aes_schedule_round -@@ -@@ Runs one main round of the key schedule on q0, q7 -@@ -@@ Specifically, runs subbytes on the high dword of q0 -@@ then rotates it by one byte and xors into the low dword of -@@ q7. -@@ -@@ Adds rcon from low byte of q8, then rotates q8 for -@@ next rcon. -@@ -@@ Smears the dwords of q7 by xoring the low into the -@@ second low, result into third, result into highest. -@@ -@@ Returns results in q7 = q0. -@@ Clobbers q1-q4, r11. -@@ -#ifdef __thumb2__ -.thumb_func _vpaes_schedule_round -#endif -.align 4 -_vpaes_schedule_round: - @ extract rcon from xmm8 - vmov.i8 q4, #0 @ vpxor %xmm4, %xmm4, %xmm4 - vext.8 q1, q8, q4, #15 @ vpalignr $15, %xmm8, %xmm4, %xmm1 - vext.8 q8, q8, q8, #15 @ vpalignr $15, %xmm8, %xmm8, %xmm8 - veor q7, q7, q1 @ vpxor %xmm1, %xmm7, %xmm7 - - @ rotate - vdup.32 q0, d1[1] @ vpshufd $0xFF, %xmm0, %xmm0 - vext.8 q0, q0, q0, #1 @ vpalignr $1, %xmm0, %xmm0, %xmm0 - - @ fall through... - - @ low round: same as high round, but no rotation and no rcon. -_vpaes_schedule_low_round: - @ The x86_64 version pins .Lk_sb1 in %xmm13 and .Lk_sb1+16 in %xmm12. - @ We pin other values in _vpaes_key_preheat, so load them now. - adr r11, Lk_sb1 - vld1.64 {q14,q15}, [r11] - - @ smear xmm7 - vext.8 q1, q4, q7, #12 @ vpslldq $4, %xmm7, %xmm1 - veor q7, q7, q1 @ vpxor %xmm1, %xmm7, %xmm7 - vext.8 q4, q4, q7, #8 @ vpslldq $8, %xmm7, %xmm4 - - @ subbytes - vand q1, q0, q9 @ vpand %xmm9, %xmm0, %xmm1 # 0 = k - vshr.u8 q0, q0, #4 @ vpsrlb $4, %xmm0, %xmm0 # 1 = i - veor q7, q7, q4 @ vpxor %xmm4, %xmm7, %xmm7 - vtbl.8 d4, {q11}, d2 @ vpshufb %xmm1, %xmm11, %xmm2 # 2 = a/k - vtbl.8 d5, {q11}, d3 - veor q1, q1, q0 @ vpxor %xmm0, %xmm1, %xmm1 # 0 = j - vtbl.8 d6, {q10}, d0 @ vpshufb %xmm0, %xmm10, %xmm3 # 3 = 1/i - vtbl.8 d7, {q10}, d1 - veor q3, q3, q2 @ vpxor %xmm2, %xmm3, %xmm3 # 3 = iak = 1/i + a/k - vtbl.8 d8, {q10}, d2 @ vpshufb %xmm1, %xmm10, %xmm4 # 4 = 1/j - vtbl.8 d9, {q10}, d3 - veor q7, q7, q12 @ vpxor Lk_s63(%rip), %xmm7, %xmm7 - vtbl.8 d6, {q10}, d6 @ vpshufb %xmm3, %xmm10, %xmm3 # 2 = 1/iak - vtbl.8 d7, {q10}, d7 - veor q4, q4, q2 @ vpxor %xmm2, %xmm4, %xmm4 # 4 = jak = 1/j + a/k - vtbl.8 d4, {q10}, d8 @ vpshufb %xmm4, %xmm10, %xmm2 # 3 = 1/jak - vtbl.8 d5, {q10}, d9 - veor q3, q3, q1 @ vpxor %xmm1, %xmm3, %xmm3 # 2 = io - veor q2, q2, q0 @ vpxor %xmm0, %xmm2, %xmm2 # 3 = jo - vtbl.8 d8, {q15}, d6 @ vpshufb %xmm3, %xmm13, %xmm4 # 4 = sbou - vtbl.8 d9, {q15}, d7 - vtbl.8 d2, {q14}, d4 @ vpshufb %xmm2, %xmm12, %xmm1 # 0 = sb1t - vtbl.8 d3, {q14}, d5 - veor q1, q1, q4 @ vpxor %xmm4, %xmm1, %xmm1 # 0 = sbox output - - @ add in smeared stuff - veor q0, q1, q7 @ vpxor %xmm7, %xmm1, %xmm0 - veor q7, q1, q7 @ vmovdqa %xmm0, %xmm7 - bx lr - - -@@ -@@ .aes_schedule_transform -@@ -@@ Linear-transform q0 according to tables at [r11] -@@ -@@ Requires that q9 = 0x0F0F... as in preheat -@@ Output in q0 -@@ Clobbers q1, q2, q14, q15 -@@ -#ifdef __thumb2__ -.thumb_func _vpaes_schedule_transform -#endif -.align 4 -_vpaes_schedule_transform: - vld1.64 {q14,q15}, [r11] @ vmovdqa (%r11), %xmm2 # lo - @ vmovdqa 16(%r11), %xmm1 # hi - vand q1, q0, q9 @ vpand %xmm9, %xmm0, %xmm1 - vshr.u8 q0, q0, #4 @ vpsrlb $4, %xmm0, %xmm0 - vtbl.8 d4, {q14}, d2 @ vpshufb %xmm1, %xmm2, %xmm2 - vtbl.8 d5, {q14}, d3 - vtbl.8 d0, {q15}, d0 @ vpshufb %xmm0, %xmm1, %xmm0 - vtbl.8 d1, {q15}, d1 - veor q0, q0, q2 @ vpxor %xmm2, %xmm0, %xmm0 - bx lr - - -@@ -@@ .aes_schedule_mangle -@@ -@@ Mangles q0 from (basis-transformed) standard version -@@ to our version. -@@ -@@ On encrypt, -@@ xor with 0x63 -@@ multiply by circulant 0,1,1,1 -@@ apply shiftrows transform -@@ -@@ On decrypt, -@@ xor with 0x63 -@@ multiply by "inverse mixcolumns" circulant E,B,D,9 -@@ deskew -@@ apply shiftrows transform -@@ -@@ -@@ Writes out to [r2], and increments or decrements it -@@ Keeps track of round number mod 4 in r8 -@@ Preserves q0 -@@ Clobbers q1-q5 -@@ -#ifdef __thumb2__ -.thumb_func _vpaes_schedule_mangle -#endif -.align 4 -_vpaes_schedule_mangle: - tst r3, r3 - vmov q4, q0 @ vmovdqa %xmm0, %xmm4 # save xmm0 for later - adr r11, Lk_mc_forward @ Must be aligned to 8 mod 16. - vld1.64 {q5}, [r11] @ vmovdqa Lk_mc_forward(%rip),%xmm5 - - @ encrypting - @ Write to q2 so we do not overlap table and destination below. - veor q2, q0, q12 @ vpxor Lk_s63(%rip), %xmm0, %xmm4 - add r2, r2, #16 @ add $16, %rdx - vtbl.8 d8, {q2}, d10 @ vpshufb %xmm5, %xmm4, %xmm4 - vtbl.8 d9, {q2}, d11 - vtbl.8 d2, {q4}, d10 @ vpshufb %xmm5, %xmm4, %xmm1 - vtbl.8 d3, {q4}, d11 - vtbl.8 d6, {q1}, d10 @ vpshufb %xmm5, %xmm1, %xmm3 - vtbl.8 d7, {q1}, d11 - veor q4, q4, q1 @ vpxor %xmm1, %xmm4, %xmm4 - vld1.64 {q1}, [r8] @ vmovdqa (%r8,%r10), %xmm1 - veor q3, q3, q4 @ vpxor %xmm4, %xmm3, %xmm3 - -Lschedule_mangle_both: - @ Write to q2 so table and destination do not overlap. - vtbl.8 d4, {q3}, d2 @ vpshufb %xmm1, %xmm3, %xmm3 - vtbl.8 d5, {q3}, d3 - add r8, r8, #64-16 @ add $-16, %r8 - and r8, r8, #~(1<<6) @ and $0x30, %r8 - vst1.64 {q2}, [r2] @ vmovdqu %xmm3, (%rdx) - bx lr - - -.globl _GFp_vpaes_set_encrypt_key -.private_extern _GFp_vpaes_set_encrypt_key -#ifdef __thumb2__ -.thumb_func _GFp_vpaes_set_encrypt_key -#endif -.align 4 -_GFp_vpaes_set_encrypt_key: - stmdb sp!, {r7,r8,r9,r10,r11, lr} - vstmdb sp!, {d8,d9,d10,d11,d12,d13,d14,d15} - - lsr r9, r1, #5 @ shr $5,%eax - add r9, r9, #5 @ $5,%eax - str r9, [r2,#240] @ mov %eax,240(%rdx) # AES_KEY->rounds = nbits/32+5; - - mov r3, #0 @ mov $0,%ecx - mov r8, #0x30 @ mov $0x30,%r8d - bl _vpaes_schedule_core - eor r0, r0, r0 - - vldmia sp!, {d8,d9,d10,d11,d12,d13,d14,d15} - ldmia sp!, {r7,r8,r9,r10,r11, pc} @ return - - -@ Additional constants for converting to bsaes. - -.align 4 -_vpaes_convert_consts: -@ .Lk_opt_then_skew applies skew(opt(x)) XOR 0x63, where skew is the linear -@ transform in the AES S-box. 0x63 is incorporated into the low half of the -@ table. This was computed with the following script: -@ -@ def u64s_to_u128(x, y): -@ return x | (y << 64) -@ def u128_to_u64s(w): -@ return w & ((1<<64)-1), w >> 64 -@ def get_byte(w, i): -@ return (w >> (i*8)) & 0xff -@ def apply_table(table, b): -@ lo = b & 0xf -@ hi = b >> 4 -@ return get_byte(table[0], lo) ^ get_byte(table[1], hi) -@ def opt(b): -@ table = [ -@ u64s_to_u128(0xFF9F4929D6B66000, 0xF7974121DEBE6808), -@ u64s_to_u128(0x01EDBD5150BCEC00, 0xE10D5DB1B05C0CE0), -@ ] -@ return apply_table(table, b) -@ def rot_byte(b, n): -@ return 0xff & ((b << n) | (b >> (8-n))) -@ def skew(x): -@ return (x ^ rot_byte(x, 1) ^ rot_byte(x, 2) ^ rot_byte(x, 3) ^ -@ rot_byte(x, 4)) -@ table = [0, 0] -@ for i in range(16): -@ table[0] |= (skew(opt(i)) ^ 0x63) << (i*8) -@ table[1] |= skew(opt(i<<4)) << (i*8) -@ print(" .quad 0x%016x, 0x%016x" % u128_to_u64s(table[0])) -@ print(" .quad 0x%016x, 0x%016x" % u128_to_u64s(table[1])) -Lk_opt_then_skew: -.quad 0x9cb8436798bc4763, 0x6440bb9f6044bf9b -.quad 0x1f30062936192f00, 0xb49bad829db284ab - -@ void GFp_vpaes_encrypt_key_to_bsaes(AES_KEY *bsaes, const AES_KEY *vpaes); -.globl _GFp_vpaes_encrypt_key_to_bsaes -.private_extern _GFp_vpaes_encrypt_key_to_bsaes -#ifdef __thumb2__ -.thumb_func _GFp_vpaes_encrypt_key_to_bsaes -#endif -.align 4 -_GFp_vpaes_encrypt_key_to_bsaes: - stmdb sp!, {r11, lr} - - @ See _vpaes_schedule_core for the key schedule logic. In particular, - @ _vpaes_schedule_transform(.Lk_ipt) (section 2.2 of the paper), - @ _vpaes_schedule_mangle (section 4.3), and .Lschedule_mangle_last - @ contain the transformations not in the bsaes representation. This - @ function inverts those transforms. - @ - @ Note also that bsaes-armv7.pl expects aes-armv4.pl's key - @ representation, which does not match the other aes_nohw_* - @ implementations. The ARM aes_nohw_* stores each 32-bit word - @ byteswapped, as a convenience for (unsupported) big-endian ARM, at the - @ cost of extra REV and VREV32 operations in little-endian ARM. - - vmov.i8 q9, #0x0f @ Required by _vpaes_schedule_transform - adr r2, Lk_mc_forward @ Must be aligned to 8 mod 16. - add r3, r2, 0x90 @ Lk_sr+0x10-Lk_mc_forward = 0x90 (Apple's toolchain doesn't support the expression) - - vld1.64 {q12}, [r2] - vmov.i8 q10, #0x5b @ Lk_s63 from vpaes-x86_64 - adr r11, Lk_opt @ Must be aligned to 8 mod 16. - vmov.i8 q11, #0x63 @ LK_s63 without Lk_ipt applied - - @ vpaes stores one fewer round count than bsaes, but the number of keys - @ is the same. - ldr r2, [r1,#240] - add r2, r2, #1 - str r2, [r0,#240] - - @ The first key is transformed with _vpaes_schedule_transform(.Lk_ipt). - @ Invert this with .Lk_opt. - vld1.64 {q0}, [r1]! - bl _vpaes_schedule_transform - vrev32.8 q0, q0 - vst1.64 {q0}, [r0]! - - @ The middle keys have _vpaes_schedule_transform(.Lk_ipt) applied, - @ followed by _vpaes_schedule_mangle. _vpaes_schedule_mangle XORs 0x63, - @ multiplies by the circulant 0,1,1,1, then applies ShiftRows. -Loop_enc_key_to_bsaes: - vld1.64 {q0}, [r1]! - - @ Invert the ShiftRows step (see .Lschedule_mangle_both). Note we cycle - @ r3 in the opposite direction and start at .Lk_sr+0x10 instead of 0x30. - @ We use r3 rather than r8 to avoid a callee-saved register. - vld1.64 {q1}, [r3] - vtbl.8 d4, {q0}, d2 - vtbl.8 d5, {q0}, d3 - add r3, r3, #16 - and r3, r3, #~(1<<6) - vmov q0, q2 - - @ Handle the last key differently. - subs r2, r2, #1 - beq Loop_enc_key_to_bsaes_last - - @ Multiply by the circulant. This is its own inverse. - vtbl.8 d2, {q0}, d24 - vtbl.8 d3, {q0}, d25 - vmov q0, q1 - vtbl.8 d4, {q1}, d24 - vtbl.8 d5, {q1}, d25 - veor q0, q0, q2 - vtbl.8 d2, {q2}, d24 - vtbl.8 d3, {q2}, d25 - veor q0, q0, q1 - - @ XOR and finish. - veor q0, q0, q10 - bl _vpaes_schedule_transform - vrev32.8 q0, q0 - vst1.64 {q0}, [r0]! - b Loop_enc_key_to_bsaes - -Loop_enc_key_to_bsaes_last: - @ The final key does not have a basis transform (note - @ .Lschedule_mangle_last inverts the original transform). It only XORs - @ 0x63 and applies ShiftRows. The latter was already inverted in the - @ loop. Note that, because we act on the original representation, we use - @ q11, not q10. - veor q0, q0, q11 - vrev32.8 q0, q0 - vst1.64 {q0}, [r0] - - @ Wipe registers which contained key material. - veor q0, q0, q0 - veor q1, q1, q1 - veor q2, q2, q2 - - ldmia sp!, {r11, pc} @ return - -.globl _GFp_vpaes_ctr32_encrypt_blocks -.private_extern _GFp_vpaes_ctr32_encrypt_blocks -#ifdef __thumb2__ -.thumb_func _GFp_vpaes_ctr32_encrypt_blocks -#endif -.align 4 -_GFp_vpaes_ctr32_encrypt_blocks: - mov ip, sp - stmdb sp!, {r7,r8,r9,r10,r11, lr} - @ This function uses q4-q7 (d8-d15), which are callee-saved. - vstmdb sp!, {d8,d9,d10,d11,d12,d13,d14,d15} - - cmp r2, #0 - @ r8 is passed on the stack. - ldr r8, [ip] - beq Lctr32_done - - @ _vpaes_encrypt_core expects the key in r2, so swap r2 and r3. - mov r9, r3 - mov r3, r2 - mov r2, r9 - - @ Load the IV and counter portion. - ldr r7, [r8, #12] - vld1.8 {q7}, [r8] - - bl _vpaes_preheat - rev r7, r7 @ The counter is big-endian. - -Lctr32_loop: - vmov q0, q7 - vld1.8 {q6}, [r0]! @ Load input ahead of time - bl _vpaes_encrypt_core - veor q0, q0, q6 @ XOR input and result - vst1.8 {q0}, [r1]! - subs r3, r3, #1 - @ Update the counter. - add r7, r7, #1 - rev r9, r7 - vmov.32 d15[1], r9 - bne Lctr32_loop - -Lctr32_done: - vldmia sp!, {d8,d9,d10,d11,d12,d13,d14,d15} - ldmia sp!, {r7,r8,r9,r10,r11, pc} @ return - -#endif // !OPENSSL_NO_ASM diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/vpaes-armv7-linux32.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/vpaes-armv7-linux32.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/vpaes-armv7-linux32.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/vpaes-armv7-linux32.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,750 +0,0 @@ -// This file is generated from a similarly-named Perl script in the BoringSSL -// source tree. Do not edit by hand. - -#if !defined(__has_feature) -#define __has_feature(x) 0 -#endif -#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) -#define OPENSSL_NO_ASM -#endif - -#if !defined(OPENSSL_NO_ASM) -#if defined(__arm__) -.syntax unified - -.arch armv7-a -.fpu neon - -#if defined(__thumb2__) -.thumb -#else -.code 32 -#endif - -.text - -.type _vpaes_consts,%object -.align 7 @ totally strategic alignment -_vpaes_consts: -.Lk_mc_forward:@ mc_forward -.quad 0x0407060500030201, 0x0C0F0E0D080B0A09 -.quad 0x080B0A0904070605, 0x000302010C0F0E0D -.quad 0x0C0F0E0D080B0A09, 0x0407060500030201 -.quad 0x000302010C0F0E0D, 0x080B0A0904070605 -.Lk_mc_backward:@ mc_backward -.quad 0x0605040702010003, 0x0E0D0C0F0A09080B -.quad 0x020100030E0D0C0F, 0x0A09080B06050407 -.quad 0x0E0D0C0F0A09080B, 0x0605040702010003 -.quad 0x0A09080B06050407, 0x020100030E0D0C0F -.Lk_sr:@ sr -.quad 0x0706050403020100, 0x0F0E0D0C0B0A0908 -.quad 0x030E09040F0A0500, 0x0B06010C07020D08 -.quad 0x0F060D040B020900, 0x070E050C030A0108 -.quad 0x0B0E0104070A0D00, 0x0306090C0F020508 - -@ -@ "Hot" constants -@ -.Lk_inv:@ inv, inva -.quad 0x0E05060F0D080180, 0x040703090A0B0C02 -.quad 0x01040A060F0B0780, 0x030D0E0C02050809 -.Lk_ipt:@ input transform (lo, hi) -.quad 0xC2B2E8985A2A7000, 0xCABAE09052227808 -.quad 0x4C01307D317C4D00, 0xCD80B1FCB0FDCC81 -.Lk_sbo:@ sbou, sbot -.quad 0xD0D26D176FBDC700, 0x15AABF7AC502A878 -.quad 0xCFE474A55FBB6A00, 0x8E1E90D1412B35FA -.Lk_sb1:@ sb1u, sb1t -.quad 0x3618D415FAE22300, 0x3BF7CCC10D2ED9EF -.quad 0xB19BE18FCB503E00, 0xA5DF7A6E142AF544 -.Lk_sb2:@ sb2u, sb2t -.quad 0x69EB88400AE12900, 0xC2A163C8AB82234A -.quad 0xE27A93C60B712400, 0x5EB7E955BC982FCD - -.byte 86,101,99,116,111,114,32,80,101,114,109,117,116,97,116,105,111,110,32,65,69,83,32,102,111,114,32,65,82,77,118,55,32,78,69,79,78,44,32,77,105,107,101,32,72,97,109,98,117,114,103,32,40,83,116,97,110,102,111,114,100,32,85,110,105,118,101,114,115,105,116,121,41,0 -.align 2 -.size _vpaes_consts,.-_vpaes_consts -.align 6 -@@ -@@ _aes_preheat -@@ -@@ Fills q9-q15 as specified below. -@@ -.type _vpaes_preheat,%function -.align 4 -_vpaes_preheat: - adr r10, .Lk_inv - vmov.i8 q9, #0x0f @ .Lk_s0F - vld1.64 {q10,q11}, [r10]! @ .Lk_inv - add r10, r10, #64 @ Skip .Lk_ipt, .Lk_sbo - vld1.64 {q12,q13}, [r10]! @ .Lk_sb1 - vld1.64 {q14,q15}, [r10] @ .Lk_sb2 - bx lr - -@@ -@@ _aes_encrypt_core -@@ -@@ AES-encrypt q0. -@@ -@@ Inputs: -@@ q0 = input -@@ q9-q15 as in _vpaes_preheat -@@ [r2] = scheduled keys -@@ -@@ Output in q0 -@@ Clobbers q1-q5, r8-r11 -@@ Preserves q6-q8 so you get some local vectors -@@ -@@ -.type _vpaes_encrypt_core,%function -.align 4 -_vpaes_encrypt_core: - mov r9, r2 - ldr r8, [r2,#240] @ pull rounds - adr r11, .Lk_ipt - @ vmovdqa .Lk_ipt(%rip), %xmm2 # iptlo - @ vmovdqa .Lk_ipt+16(%rip), %xmm3 # ipthi - vld1.64 {q2, q3}, [r11] - adr r11, .Lk_mc_forward+16 - vld1.64 {q5}, [r9]! @ vmovdqu (%r9), %xmm5 # round0 key - vand q1, q0, q9 @ vpand %xmm9, %xmm0, %xmm1 - vshr.u8 q0, q0, #4 @ vpsrlb $4, %xmm0, %xmm0 - vtbl.8 d2, {q2}, d2 @ vpshufb %xmm1, %xmm2, %xmm1 - vtbl.8 d3, {q2}, d3 - vtbl.8 d4, {q3}, d0 @ vpshufb %xmm0, %xmm3, %xmm2 - vtbl.8 d5, {q3}, d1 - veor q0, q1, q5 @ vpxor %xmm5, %xmm1, %xmm0 - veor q0, q0, q2 @ vpxor %xmm2, %xmm0, %xmm0 - - @ .Lenc_entry ends with a bnz instruction which is normally paired with - @ subs in .Lenc_loop. - tst r8, r8 - b .Lenc_entry - -.align 4 -.Lenc_loop: - @ middle of middle round - add r10, r11, #0x40 - vtbl.8 d8, {q13}, d4 @ vpshufb %xmm2, %xmm13, %xmm4 # 4 = sb1u - vtbl.8 d9, {q13}, d5 - vld1.64 {q1}, [r11]! @ vmovdqa -0x40(%r11,%r10), %xmm1 # .Lk_mc_forward[] - vtbl.8 d0, {q12}, d6 @ vpshufb %xmm3, %xmm12, %xmm0 # 0 = sb1t - vtbl.8 d1, {q12}, d7 - veor q4, q4, q5 @ vpxor %xmm5, %xmm4, %xmm4 # 4 = sb1u + k - vtbl.8 d10, {q15}, d4 @ vpshufb %xmm2, %xmm15, %xmm5 # 4 = sb2u - vtbl.8 d11, {q15}, d5 - veor q0, q0, q4 @ vpxor %xmm4, %xmm0, %xmm0 # 0 = A - vtbl.8 d4, {q14}, d6 @ vpshufb %xmm3, %xmm14, %xmm2 # 2 = sb2t - vtbl.8 d5, {q14}, d7 - vld1.64 {q4}, [r10] @ vmovdqa (%r11,%r10), %xmm4 # .Lk_mc_backward[] - vtbl.8 d6, {q0}, d2 @ vpshufb %xmm1, %xmm0, %xmm3 # 0 = B - vtbl.8 d7, {q0}, d3 - veor q2, q2, q5 @ vpxor %xmm5, %xmm2, %xmm2 # 2 = 2A - @ Write to q5 instead of q0, so the table and destination registers do - @ not overlap. - vtbl.8 d10, {q0}, d8 @ vpshufb %xmm4, %xmm0, %xmm0 # 3 = D - vtbl.8 d11, {q0}, d9 - veor q3, q3, q2 @ vpxor %xmm2, %xmm3, %xmm3 # 0 = 2A+B - vtbl.8 d8, {q3}, d2 @ vpshufb %xmm1, %xmm3, %xmm4 # 0 = 2B+C - vtbl.8 d9, {q3}, d3 - @ Here we restore the original q0/q5 usage. - veor q0, q5, q3 @ vpxor %xmm3, %xmm0, %xmm0 # 3 = 2A+B+D - and r11, r11, #~(1<<6) @ and $0x30, %r11 # ... mod 4 - veor q0, q0, q4 @ vpxor %xmm4, %xmm0, %xmm0 # 0 = 2A+3B+C+D - subs r8, r8, #1 @ nr-- - -.Lenc_entry: - @ top of round - vand q1, q0, q9 @ vpand %xmm0, %xmm9, %xmm1 # 0 = k - vshr.u8 q0, q0, #4 @ vpsrlb $4, %xmm0, %xmm0 # 1 = i - vtbl.8 d10, {q11}, d2 @ vpshufb %xmm1, %xmm11, %xmm5 # 2 = a/k - vtbl.8 d11, {q11}, d3 - veor q1, q1, q0 @ vpxor %xmm0, %xmm1, %xmm1 # 0 = j - vtbl.8 d6, {q10}, d0 @ vpshufb %xmm0, %xmm10, %xmm3 # 3 = 1/i - vtbl.8 d7, {q10}, d1 - vtbl.8 d8, {q10}, d2 @ vpshufb %xmm1, %xmm10, %xmm4 # 4 = 1/j - vtbl.8 d9, {q10}, d3 - veor q3, q3, q5 @ vpxor %xmm5, %xmm3, %xmm3 # 3 = iak = 1/i + a/k - veor q4, q4, q5 @ vpxor %xmm5, %xmm4, %xmm4 # 4 = jak = 1/j + a/k - vtbl.8 d4, {q10}, d6 @ vpshufb %xmm3, %xmm10, %xmm2 # 2 = 1/iak - vtbl.8 d5, {q10}, d7 - vtbl.8 d6, {q10}, d8 @ vpshufb %xmm4, %xmm10, %xmm3 # 3 = 1/jak - vtbl.8 d7, {q10}, d9 - veor q2, q2, q1 @ vpxor %xmm1, %xmm2, %xmm2 # 2 = io - veor q3, q3, q0 @ vpxor %xmm0, %xmm3, %xmm3 # 3 = jo - vld1.64 {q5}, [r9]! @ vmovdqu (%r9), %xmm5 - bne .Lenc_loop - - @ middle of last round - add r10, r11, #0x80 - - adr r11, .Lk_sbo - @ Read to q1 instead of q4, so the vtbl.8 instruction below does not - @ overlap table and destination registers. - vld1.64 {q1}, [r11]! @ vmovdqa -0x60(%r10), %xmm4 # 3 : sbou - vld1.64 {q0}, [r11] @ vmovdqa -0x50(%r10), %xmm0 # 0 : sbot .Lk_sbo+16 - vtbl.8 d8, {q1}, d4 @ vpshufb %xmm2, %xmm4, %xmm4 # 4 = sbou - vtbl.8 d9, {q1}, d5 - vld1.64 {q1}, [r10] @ vmovdqa 0x40(%r11,%r10), %xmm1 # .Lk_sr[] - @ Write to q2 instead of q0 below, to avoid overlapping table and - @ destination registers. - vtbl.8 d4, {q0}, d6 @ vpshufb %xmm3, %xmm0, %xmm0 # 0 = sb1t - vtbl.8 d5, {q0}, d7 - veor q4, q4, q5 @ vpxor %xmm5, %xmm4, %xmm4 # 4 = sb1u + k - veor q2, q2, q4 @ vpxor %xmm4, %xmm0, %xmm0 # 0 = A - @ Here we restore the original q0/q2 usage. - vtbl.8 d0, {q2}, d2 @ vpshufb %xmm1, %xmm0, %xmm0 - vtbl.8 d1, {q2}, d3 - bx lr -.size _vpaes_encrypt_core,.-_vpaes_encrypt_core - -.globl GFp_vpaes_encrypt -.hidden GFp_vpaes_encrypt -.type GFp_vpaes_encrypt,%function -.align 4 -GFp_vpaes_encrypt: - @ _vpaes_encrypt_core uses r8-r11. Round up to r7-r11 to maintain stack - @ alignment. - stmdb sp!, {r7,r8,r9,r10,r11,lr} - @ _vpaes_encrypt_core uses q4-q5 (d8-d11), which are callee-saved. - vstmdb sp!, {d8,d9,d10,d11} - - vld1.64 {q0}, [r0] - bl _vpaes_preheat - bl _vpaes_encrypt_core - vst1.64 {q0}, [r1] - - vldmia sp!, {d8,d9,d10,d11} - ldmia sp!, {r7,r8,r9,r10,r11, pc} @ return -.size GFp_vpaes_encrypt,.-GFp_vpaes_encrypt -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@ @@ -@@ AES key schedule @@ -@@ @@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - -@ This function diverges from both x86_64 and armv7 in which constants are -@ pinned. x86_64 has a common preheat function for all operations. aarch64 -@ separates them because it has enough registers to pin nearly all constants. -@ armv7 does not have enough registers, but needing explicit loads and stores -@ also complicates using x86_64's register allocation directly. -@ -@ We pin some constants for convenience and leave q14 and q15 free to load -@ others on demand. - -@ -@ Key schedule constants -@ -.type _vpaes_key_consts,%object -.align 4 -_vpaes_key_consts: -.Lk_rcon:@ rcon -.quad 0x1F8391B9AF9DEEB6, 0x702A98084D7C7D81 - -.Lk_opt:@ output transform -.quad 0xFF9F4929D6B66000, 0xF7974121DEBE6808 -.quad 0x01EDBD5150BCEC00, 0xE10D5DB1B05C0CE0 -.Lk_deskew:@ deskew tables: inverts the sbox's "skew" -.quad 0x07E4A34047A4E300, 0x1DFEB95A5DBEF91A -.quad 0x5F36B5DC83EA6900, 0x2841C2ABF49D1E77 -.size _vpaes_key_consts,.-_vpaes_key_consts - -.type _vpaes_key_preheat,%function -.align 4 -_vpaes_key_preheat: - adr r11, .Lk_rcon - vmov.i8 q12, #0x5b @ .Lk_s63 - adr r10, .Lk_inv @ Must be aligned to 8 mod 16. - vmov.i8 q9, #0x0f @ .Lk_s0F - vld1.64 {q10,q11}, [r10] @ .Lk_inv - vld1.64 {q8}, [r11] @ .Lk_rcon - bx lr -.size _vpaes_key_preheat,.-_vpaes_key_preheat - -.type _vpaes_schedule_core,%function -.align 4 -_vpaes_schedule_core: - @ We only need to save lr, but ARM requires an 8-byte stack alignment, - @ so save an extra register. - stmdb sp!, {r3,lr} - - bl _vpaes_key_preheat @ load the tables - - adr r11, .Lk_ipt @ Must be aligned to 8 mod 16. - vld1.64 {q0}, [r0]! @ vmovdqu (%rdi), %xmm0 # load key (unaligned) - - @ input transform - @ Use q4 here rather than q3 so .Lschedule_am_decrypting does not - @ overlap table and destination. - vmov q4, q0 @ vmovdqa %xmm0, %xmm3 - bl _vpaes_schedule_transform - adr r10, .Lk_sr @ Must be aligned to 8 mod 16. - vmov q7, q0 @ vmovdqa %xmm0, %xmm7 - - add r8, r8, r10 - - @ encrypting, output zeroth round key after transform - vst1.64 {q0}, [r2] @ vmovdqu %xmm0, (%rdx) - - @ *ring*: Decryption removed. - -.Lschedule_go: - cmp r1, #192 @ cmp $192, %esi - bhi .Lschedule_256 - @ 128: fall though - -@@ -@@ .schedule_128 -@@ -@@ 128-bit specific part of key schedule. -@@ -@@ This schedule is really simple, because all its parts -@@ are accomplished by the subroutines. -@@ -.Lschedule_128: - mov r0, #10 @ mov $10, %esi - -.Loop_schedule_128: - bl _vpaes_schedule_round - subs r0, r0, #1 @ dec %esi - beq .Lschedule_mangle_last - bl _vpaes_schedule_mangle @ write output - b .Loop_schedule_128 - -@@ -@@ .aes_schedule_256 -@@ -@@ 256-bit specific part of key schedule. -@@ -@@ The structure here is very similar to the 128-bit -@@ schedule, but with an additional "low side" in -@@ q6. The low side's rounds are the same as the -@@ high side's, except no rcon and no rotation. -@@ -.align 4 -.Lschedule_256: - vld1.64 {q0}, [r0] @ vmovdqu 16(%rdi),%xmm0 # load key part 2 (unaligned) - bl _vpaes_schedule_transform @ input transform - mov r0, #7 @ mov $7, %esi - -.Loop_schedule_256: - bl _vpaes_schedule_mangle @ output low result - vmov q6, q0 @ vmovdqa %xmm0, %xmm6 # save cur_lo in xmm6 - - @ high round - bl _vpaes_schedule_round - subs r0, r0, #1 @ dec %esi - beq .Lschedule_mangle_last - bl _vpaes_schedule_mangle - - @ low round. swap xmm7 and xmm6 - vdup.32 q0, d1[1] @ vpshufd $0xFF, %xmm0, %xmm0 - vmov.i8 q4, #0 - vmov q5, q7 @ vmovdqa %xmm7, %xmm5 - vmov q7, q6 @ vmovdqa %xmm6, %xmm7 - bl _vpaes_schedule_low_round - vmov q7, q5 @ vmovdqa %xmm5, %xmm7 - - b .Loop_schedule_256 - -@@ -@@ .aes_schedule_mangle_last -@@ -@@ Mangler for last round of key schedule -@@ Mangles q0 -@@ when encrypting, outputs out(q0) ^ 63 -@@ when decrypting, outputs unskew(q0) -@@ -@@ Always called right before return... jumps to cleanup and exits -@@ -.align 4 -.Lschedule_mangle_last: - @ schedule last round key from xmm0 - adr r11, .Lk_deskew @ lea .Lk_deskew(%rip),%r11 # prepare to deskew - - @ encrypting - vld1.64 {q1}, [r8] @ vmovdqa (%r8,%r10),%xmm1 - adr r11, .Lk_opt @ lea .Lk_opt(%rip), %r11 # prepare to output transform - add r2, r2, #32 @ add $32, %rdx - vmov q2, q0 - vtbl.8 d0, {q2}, d2 @ vpshufb %xmm1, %xmm0, %xmm0 # output permute - vtbl.8 d1, {q2}, d3 - -.Lschedule_mangle_last_dec: - sub r2, r2, #16 @ add $-16, %rdx - veor q0, q0, q12 @ vpxor .Lk_s63(%rip), %xmm0, %xmm0 - bl _vpaes_schedule_transform @ output transform - vst1.64 {q0}, [r2] @ vmovdqu %xmm0, (%rdx) # save last key - - @ cleanup - veor q0, q0, q0 @ vpxor %xmm0, %xmm0, %xmm0 - veor q1, q1, q1 @ vpxor %xmm1, %xmm1, %xmm1 - veor q2, q2, q2 @ vpxor %xmm2, %xmm2, %xmm2 - veor q3, q3, q3 @ vpxor %xmm3, %xmm3, %xmm3 - veor q4, q4, q4 @ vpxor %xmm4, %xmm4, %xmm4 - veor q5, q5, q5 @ vpxor %xmm5, %xmm5, %xmm5 - veor q6, q6, q6 @ vpxor %xmm6, %xmm6, %xmm6 - veor q7, q7, q7 @ vpxor %xmm7, %xmm7, %xmm7 - ldmia sp!, {r3,pc} @ return -.size _vpaes_schedule_core,.-_vpaes_schedule_core - -@@ -@@ .aes_schedule_round -@@ -@@ Runs one main round of the key schedule on q0, q7 -@@ -@@ Specifically, runs subbytes on the high dword of q0 -@@ then rotates it by one byte and xors into the low dword of -@@ q7. -@@ -@@ Adds rcon from low byte of q8, then rotates q8 for -@@ next rcon. -@@ -@@ Smears the dwords of q7 by xoring the low into the -@@ second low, result into third, result into highest. -@@ -@@ Returns results in q7 = q0. -@@ Clobbers q1-q4, r11. -@@ -.type _vpaes_schedule_round,%function -.align 4 -_vpaes_schedule_round: - @ extract rcon from xmm8 - vmov.i8 q4, #0 @ vpxor %xmm4, %xmm4, %xmm4 - vext.8 q1, q8, q4, #15 @ vpalignr $15, %xmm8, %xmm4, %xmm1 - vext.8 q8, q8, q8, #15 @ vpalignr $15, %xmm8, %xmm8, %xmm8 - veor q7, q7, q1 @ vpxor %xmm1, %xmm7, %xmm7 - - @ rotate - vdup.32 q0, d1[1] @ vpshufd $0xFF, %xmm0, %xmm0 - vext.8 q0, q0, q0, #1 @ vpalignr $1, %xmm0, %xmm0, %xmm0 - - @ fall through... - - @ low round: same as high round, but no rotation and no rcon. -_vpaes_schedule_low_round: - @ The x86_64 version pins .Lk_sb1 in %xmm13 and .Lk_sb1+16 in %xmm12. - @ We pin other values in _vpaes_key_preheat, so load them now. - adr r11, .Lk_sb1 - vld1.64 {q14,q15}, [r11] - - @ smear xmm7 - vext.8 q1, q4, q7, #12 @ vpslldq $4, %xmm7, %xmm1 - veor q7, q7, q1 @ vpxor %xmm1, %xmm7, %xmm7 - vext.8 q4, q4, q7, #8 @ vpslldq $8, %xmm7, %xmm4 - - @ subbytes - vand q1, q0, q9 @ vpand %xmm9, %xmm0, %xmm1 # 0 = k - vshr.u8 q0, q0, #4 @ vpsrlb $4, %xmm0, %xmm0 # 1 = i - veor q7, q7, q4 @ vpxor %xmm4, %xmm7, %xmm7 - vtbl.8 d4, {q11}, d2 @ vpshufb %xmm1, %xmm11, %xmm2 # 2 = a/k - vtbl.8 d5, {q11}, d3 - veor q1, q1, q0 @ vpxor %xmm0, %xmm1, %xmm1 # 0 = j - vtbl.8 d6, {q10}, d0 @ vpshufb %xmm0, %xmm10, %xmm3 # 3 = 1/i - vtbl.8 d7, {q10}, d1 - veor q3, q3, q2 @ vpxor %xmm2, %xmm3, %xmm3 # 3 = iak = 1/i + a/k - vtbl.8 d8, {q10}, d2 @ vpshufb %xmm1, %xmm10, %xmm4 # 4 = 1/j - vtbl.8 d9, {q10}, d3 - veor q7, q7, q12 @ vpxor .Lk_s63(%rip), %xmm7, %xmm7 - vtbl.8 d6, {q10}, d6 @ vpshufb %xmm3, %xmm10, %xmm3 # 2 = 1/iak - vtbl.8 d7, {q10}, d7 - veor q4, q4, q2 @ vpxor %xmm2, %xmm4, %xmm4 # 4 = jak = 1/j + a/k - vtbl.8 d4, {q10}, d8 @ vpshufb %xmm4, %xmm10, %xmm2 # 3 = 1/jak - vtbl.8 d5, {q10}, d9 - veor q3, q3, q1 @ vpxor %xmm1, %xmm3, %xmm3 # 2 = io - veor q2, q2, q0 @ vpxor %xmm0, %xmm2, %xmm2 # 3 = jo - vtbl.8 d8, {q15}, d6 @ vpshufb %xmm3, %xmm13, %xmm4 # 4 = sbou - vtbl.8 d9, {q15}, d7 - vtbl.8 d2, {q14}, d4 @ vpshufb %xmm2, %xmm12, %xmm1 # 0 = sb1t - vtbl.8 d3, {q14}, d5 - veor q1, q1, q4 @ vpxor %xmm4, %xmm1, %xmm1 # 0 = sbox output - - @ add in smeared stuff - veor q0, q1, q7 @ vpxor %xmm7, %xmm1, %xmm0 - veor q7, q1, q7 @ vmovdqa %xmm0, %xmm7 - bx lr -.size _vpaes_schedule_round,.-_vpaes_schedule_round - -@@ -@@ .aes_schedule_transform -@@ -@@ Linear-transform q0 according to tables at [r11] -@@ -@@ Requires that q9 = 0x0F0F... as in preheat -@@ Output in q0 -@@ Clobbers q1, q2, q14, q15 -@@ -.type _vpaes_schedule_transform,%function -.align 4 -_vpaes_schedule_transform: - vld1.64 {q14,q15}, [r11] @ vmovdqa (%r11), %xmm2 # lo - @ vmovdqa 16(%r11), %xmm1 # hi - vand q1, q0, q9 @ vpand %xmm9, %xmm0, %xmm1 - vshr.u8 q0, q0, #4 @ vpsrlb $4, %xmm0, %xmm0 - vtbl.8 d4, {q14}, d2 @ vpshufb %xmm1, %xmm2, %xmm2 - vtbl.8 d5, {q14}, d3 - vtbl.8 d0, {q15}, d0 @ vpshufb %xmm0, %xmm1, %xmm0 - vtbl.8 d1, {q15}, d1 - veor q0, q0, q2 @ vpxor %xmm2, %xmm0, %xmm0 - bx lr -.size _vpaes_schedule_transform,.-_vpaes_schedule_transform - -@@ -@@ .aes_schedule_mangle -@@ -@@ Mangles q0 from (basis-transformed) standard version -@@ to our version. -@@ -@@ On encrypt, -@@ xor with 0x63 -@@ multiply by circulant 0,1,1,1 -@@ apply shiftrows transform -@@ -@@ On decrypt, -@@ xor with 0x63 -@@ multiply by "inverse mixcolumns" circulant E,B,D,9 -@@ deskew -@@ apply shiftrows transform -@@ -@@ -@@ Writes out to [r2], and increments or decrements it -@@ Keeps track of round number mod 4 in r8 -@@ Preserves q0 -@@ Clobbers q1-q5 -@@ -.type _vpaes_schedule_mangle,%function -.align 4 -_vpaes_schedule_mangle: - tst r3, r3 - vmov q4, q0 @ vmovdqa %xmm0, %xmm4 # save xmm0 for later - adr r11, .Lk_mc_forward @ Must be aligned to 8 mod 16. - vld1.64 {q5}, [r11] @ vmovdqa .Lk_mc_forward(%rip),%xmm5 - - @ encrypting - @ Write to q2 so we do not overlap table and destination below. - veor q2, q0, q12 @ vpxor .Lk_s63(%rip), %xmm0, %xmm4 - add r2, r2, #16 @ add $16, %rdx - vtbl.8 d8, {q2}, d10 @ vpshufb %xmm5, %xmm4, %xmm4 - vtbl.8 d9, {q2}, d11 - vtbl.8 d2, {q4}, d10 @ vpshufb %xmm5, %xmm4, %xmm1 - vtbl.8 d3, {q4}, d11 - vtbl.8 d6, {q1}, d10 @ vpshufb %xmm5, %xmm1, %xmm3 - vtbl.8 d7, {q1}, d11 - veor q4, q4, q1 @ vpxor %xmm1, %xmm4, %xmm4 - vld1.64 {q1}, [r8] @ vmovdqa (%r8,%r10), %xmm1 - veor q3, q3, q4 @ vpxor %xmm4, %xmm3, %xmm3 - -.Lschedule_mangle_both: - @ Write to q2 so table and destination do not overlap. - vtbl.8 d4, {q3}, d2 @ vpshufb %xmm1, %xmm3, %xmm3 - vtbl.8 d5, {q3}, d3 - add r8, r8, #64-16 @ add $-16, %r8 - and r8, r8, #~(1<<6) @ and $0x30, %r8 - vst1.64 {q2}, [r2] @ vmovdqu %xmm3, (%rdx) - bx lr -.size _vpaes_schedule_mangle,.-_vpaes_schedule_mangle - -.globl GFp_vpaes_set_encrypt_key -.hidden GFp_vpaes_set_encrypt_key -.type GFp_vpaes_set_encrypt_key,%function -.align 4 -GFp_vpaes_set_encrypt_key: - stmdb sp!, {r7,r8,r9,r10,r11, lr} - vstmdb sp!, {d8,d9,d10,d11,d12,d13,d14,d15} - - lsr r9, r1, #5 @ shr $5,%eax - add r9, r9, #5 @ $5,%eax - str r9, [r2,#240] @ mov %eax,240(%rdx) # AES_KEY->rounds = nbits/32+5; - - mov r3, #0 @ mov $0,%ecx - mov r8, #0x30 @ mov $0x30,%r8d - bl _vpaes_schedule_core - eor r0, r0, r0 - - vldmia sp!, {d8,d9,d10,d11,d12,d13,d14,d15} - ldmia sp!, {r7,r8,r9,r10,r11, pc} @ return -.size GFp_vpaes_set_encrypt_key,.-GFp_vpaes_set_encrypt_key - -@ Additional constants for converting to bsaes. -.type _vpaes_convert_consts,%object -.align 4 -_vpaes_convert_consts: -@ .Lk_opt_then_skew applies skew(opt(x)) XOR 0x63, where skew is the linear -@ transform in the AES S-box. 0x63 is incorporated into the low half of the -@ table. This was computed with the following script: -@ -@ def u64s_to_u128(x, y): -@ return x | (y << 64) -@ def u128_to_u64s(w): -@ return w & ((1<<64)-1), w >> 64 -@ def get_byte(w, i): -@ return (w >> (i*8)) & 0xff -@ def apply_table(table, b): -@ lo = b & 0xf -@ hi = b >> 4 -@ return get_byte(table[0], lo) ^ get_byte(table[1], hi) -@ def opt(b): -@ table = [ -@ u64s_to_u128(0xFF9F4929D6B66000, 0xF7974121DEBE6808), -@ u64s_to_u128(0x01EDBD5150BCEC00, 0xE10D5DB1B05C0CE0), -@ ] -@ return apply_table(table, b) -@ def rot_byte(b, n): -@ return 0xff & ((b << n) | (b >> (8-n))) -@ def skew(x): -@ return (x ^ rot_byte(x, 1) ^ rot_byte(x, 2) ^ rot_byte(x, 3) ^ -@ rot_byte(x, 4)) -@ table = [0, 0] -@ for i in range(16): -@ table[0] |= (skew(opt(i)) ^ 0x63) << (i*8) -@ table[1] |= skew(opt(i<<4)) << (i*8) -@ print(" .quad 0x%016x, 0x%016x" % u128_to_u64s(table[0])) -@ print(" .quad 0x%016x, 0x%016x" % u128_to_u64s(table[1])) -.Lk_opt_then_skew: -.quad 0x9cb8436798bc4763, 0x6440bb9f6044bf9b -.quad 0x1f30062936192f00, 0xb49bad829db284ab - -@ void GFp_vpaes_encrypt_key_to_bsaes(AES_KEY *bsaes, const AES_KEY *vpaes); -.globl GFp_vpaes_encrypt_key_to_bsaes -.hidden GFp_vpaes_encrypt_key_to_bsaes -.type GFp_vpaes_encrypt_key_to_bsaes,%function -.align 4 -GFp_vpaes_encrypt_key_to_bsaes: - stmdb sp!, {r11, lr} - - @ See _vpaes_schedule_core for the key schedule logic. In particular, - @ _vpaes_schedule_transform(.Lk_ipt) (section 2.2 of the paper), - @ _vpaes_schedule_mangle (section 4.3), and .Lschedule_mangle_last - @ contain the transformations not in the bsaes representation. This - @ function inverts those transforms. - @ - @ Note also that bsaes-armv7.pl expects aes-armv4.pl's key - @ representation, which does not match the other aes_nohw_* - @ implementations. The ARM aes_nohw_* stores each 32-bit word - @ byteswapped, as a convenience for (unsupported) big-endian ARM, at the - @ cost of extra REV and VREV32 operations in little-endian ARM. - - vmov.i8 q9, #0x0f @ Required by _vpaes_schedule_transform - adr r2, .Lk_mc_forward @ Must be aligned to 8 mod 16. - add r3, r2, 0x90 @ .Lk_sr+0x10-.Lk_mc_forward = 0x90 (Apple's toolchain doesn't support the expression) - - vld1.64 {q12}, [r2] - vmov.i8 q10, #0x5b @ .Lk_s63 from vpaes-x86_64 - adr r11, .Lk_opt @ Must be aligned to 8 mod 16. - vmov.i8 q11, #0x63 @ .LK_s63 without .Lk_ipt applied - - @ vpaes stores one fewer round count than bsaes, but the number of keys - @ is the same. - ldr r2, [r1,#240] - add r2, r2, #1 - str r2, [r0,#240] - - @ The first key is transformed with _vpaes_schedule_transform(.Lk_ipt). - @ Invert this with .Lk_opt. - vld1.64 {q0}, [r1]! - bl _vpaes_schedule_transform - vrev32.8 q0, q0 - vst1.64 {q0}, [r0]! - - @ The middle keys have _vpaes_schedule_transform(.Lk_ipt) applied, - @ followed by _vpaes_schedule_mangle. _vpaes_schedule_mangle XORs 0x63, - @ multiplies by the circulant 0,1,1,1, then applies ShiftRows. -.Loop_enc_key_to_bsaes: - vld1.64 {q0}, [r1]! - - @ Invert the ShiftRows step (see .Lschedule_mangle_both). Note we cycle - @ r3 in the opposite direction and start at .Lk_sr+0x10 instead of 0x30. - @ We use r3 rather than r8 to avoid a callee-saved register. - vld1.64 {q1}, [r3] - vtbl.8 d4, {q0}, d2 - vtbl.8 d5, {q0}, d3 - add r3, r3, #16 - and r3, r3, #~(1<<6) - vmov q0, q2 - - @ Handle the last key differently. - subs r2, r2, #1 - beq .Loop_enc_key_to_bsaes_last - - @ Multiply by the circulant. This is its own inverse. - vtbl.8 d2, {q0}, d24 - vtbl.8 d3, {q0}, d25 - vmov q0, q1 - vtbl.8 d4, {q1}, d24 - vtbl.8 d5, {q1}, d25 - veor q0, q0, q2 - vtbl.8 d2, {q2}, d24 - vtbl.8 d3, {q2}, d25 - veor q0, q0, q1 - - @ XOR and finish. - veor q0, q0, q10 - bl _vpaes_schedule_transform - vrev32.8 q0, q0 - vst1.64 {q0}, [r0]! - b .Loop_enc_key_to_bsaes - -.Loop_enc_key_to_bsaes_last: - @ The final key does not have a basis transform (note - @ .Lschedule_mangle_last inverts the original transform). It only XORs - @ 0x63 and applies ShiftRows. The latter was already inverted in the - @ loop. Note that, because we act on the original representation, we use - @ q11, not q10. - veor q0, q0, q11 - vrev32.8 q0, q0 - vst1.64 {q0}, [r0] - - @ Wipe registers which contained key material. - veor q0, q0, q0 - veor q1, q1, q1 - veor q2, q2, q2 - - ldmia sp!, {r11, pc} @ return -.size GFp_vpaes_encrypt_key_to_bsaes,.-GFp_vpaes_encrypt_key_to_bsaes -.globl GFp_vpaes_ctr32_encrypt_blocks -.hidden GFp_vpaes_ctr32_encrypt_blocks -.type GFp_vpaes_ctr32_encrypt_blocks,%function -.align 4 -GFp_vpaes_ctr32_encrypt_blocks: - mov ip, sp - stmdb sp!, {r7,r8,r9,r10,r11, lr} - @ This function uses q4-q7 (d8-d15), which are callee-saved. - vstmdb sp!, {d8,d9,d10,d11,d12,d13,d14,d15} - - cmp r2, #0 - @ r8 is passed on the stack. - ldr r8, [ip] - beq .Lctr32_done - - @ _vpaes_encrypt_core expects the key in r2, so swap r2 and r3. - mov r9, r3 - mov r3, r2 - mov r2, r9 - - @ Load the IV and counter portion. - ldr r7, [r8, #12] - vld1.8 {q7}, [r8] - - bl _vpaes_preheat - rev r7, r7 @ The counter is big-endian. - -.Lctr32_loop: - vmov q0, q7 - vld1.8 {q6}, [r0]! @ .Load input ahead of time - bl _vpaes_encrypt_core - veor q0, q0, q6 @ XOR input and result - vst1.8 {q0}, [r1]! - subs r3, r3, #1 - @ Update the counter. - add r7, r7, #1 - rev r9, r7 - vmov.32 d15[1], r9 - bne .Lctr32_loop - -.Lctr32_done: - vldmia sp!, {d8,d9,d10,d11,d12,d13,d14,d15} - ldmia sp!, {r7,r8,r9,r10,r11, pc} @ return -.size GFp_vpaes_ctr32_encrypt_blocks,.-GFp_vpaes_ctr32_encrypt_blocks -#endif -#endif // !OPENSSL_NO_ASM -.section .note.GNU-stack,"",%progbits diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/vpaes-armv8-ios64.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/vpaes-armv8-ios64.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/vpaes-armv8-ios64.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/vpaes-armv8-ios64.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,770 +0,0 @@ -// This file is generated from a similarly-named Perl script in the BoringSSL -// source tree. Do not edit by hand. - -#if !defined(__has_feature) -#define __has_feature(x) 0 -#endif -#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) -#define OPENSSL_NO_ASM -#endif - -#if !defined(OPENSSL_NO_ASM) -#include - -.section __TEXT,__const - - -.align 7 // totally strategic alignment -_vpaes_consts: -Lk_mc_forward: // mc_forward -.quad 0x0407060500030201, 0x0C0F0E0D080B0A09 -.quad 0x080B0A0904070605, 0x000302010C0F0E0D -.quad 0x0C0F0E0D080B0A09, 0x0407060500030201 -.quad 0x000302010C0F0E0D, 0x080B0A0904070605 -Lk_mc_backward: // mc_backward -.quad 0x0605040702010003, 0x0E0D0C0F0A09080B -.quad 0x020100030E0D0C0F, 0x0A09080B06050407 -.quad 0x0E0D0C0F0A09080B, 0x0605040702010003 -.quad 0x0A09080B06050407, 0x020100030E0D0C0F -Lk_sr: // sr -.quad 0x0706050403020100, 0x0F0E0D0C0B0A0908 -.quad 0x030E09040F0A0500, 0x0B06010C07020D08 -.quad 0x0F060D040B020900, 0x070E050C030A0108 -.quad 0x0B0E0104070A0D00, 0x0306090C0F020508 - -// -// "Hot" constants -// -Lk_inv: // inv, inva -.quad 0x0E05060F0D080180, 0x040703090A0B0C02 -.quad 0x01040A060F0B0780, 0x030D0E0C02050809 -Lk_ipt: // input transform (lo, hi) -.quad 0xC2B2E8985A2A7000, 0xCABAE09052227808 -.quad 0x4C01307D317C4D00, 0xCD80B1FCB0FDCC81 -Lk_sbo: // sbou, sbot -.quad 0xD0D26D176FBDC700, 0x15AABF7AC502A878 -.quad 0xCFE474A55FBB6A00, 0x8E1E90D1412B35FA -Lk_sb1: // sb1u, sb1t -.quad 0x3618D415FAE22300, 0x3BF7CCC10D2ED9EF -.quad 0xB19BE18FCB503E00, 0xA5DF7A6E142AF544 -Lk_sb2: // sb2u, sb2t -.quad 0x69EB88400AE12900, 0xC2A163C8AB82234A -.quad 0xE27A93C60B712400, 0x5EB7E955BC982FCD - -// -// Key schedule constants -// -Lk_dksd: // decryption key schedule: invskew x*D -.quad 0xFEB91A5DA3E44700, 0x0740E3A45A1DBEF9 -.quad 0x41C277F4B5368300, 0x5FDC69EAAB289D1E -Lk_dksb: // decryption key schedule: invskew x*B -.quad 0x9A4FCA1F8550D500, 0x03D653861CC94C99 -.quad 0x115BEDA7B6FC4A00, 0xD993256F7E3482C8 -Lk_dkse: // decryption key schedule: invskew x*E + 0x63 -.quad 0xD5031CCA1FC9D600, 0x53859A4C994F5086 -.quad 0xA23196054FDC7BE8, 0xCD5EF96A20B31487 -Lk_dks9: // decryption key schedule: invskew x*9 -.quad 0xB6116FC87ED9A700, 0x4AED933482255BFC -.quad 0x4576516227143300, 0x8BB89FACE9DAFDCE - -Lk_rcon: // rcon -.quad 0x1F8391B9AF9DEEB6, 0x702A98084D7C7D81 - -Lk_opt: // output transform -.quad 0xFF9F4929D6B66000, 0xF7974121DEBE6808 -.quad 0x01EDBD5150BCEC00, 0xE10D5DB1B05C0CE0 -Lk_deskew: // deskew tables: inverts the sbox's "skew" -.quad 0x07E4A34047A4E300, 0x1DFEB95A5DBEF91A -.quad 0x5F36B5DC83EA6900, 0x2841C2ABF49D1E77 - -.byte 86,101,99,116,111,114,32,80,101,114,109,117,116,97,116,105,111,110,32,65,69,83,32,102,111,114,32,65,82,77,118,56,44,32,77,105,107,101,32,72,97,109,98,117,114,103,32,40,83,116,97,110,102,111,114,100,32,85,110,105,118,101,114,115,105,116,121,41,0 -.align 2 - -.align 6 - -.text -## -## _aes_preheat -## -## Fills register %r10 -> .aes_consts (so you can -fPIC) -## and %xmm9-%xmm15 as specified below. -## - -.align 4 -_vpaes_encrypt_preheat: - adrp x10, Lk_inv@PAGE - add x10, x10, Lk_inv@PAGEOFF - movi v17.16b, #0x0f - ld1 {v18.2d,v19.2d}, [x10],#32 // Lk_inv - ld1 {v20.2d,v21.2d,v22.2d,v23.2d}, [x10],#64 // Lk_ipt, Lk_sbo - ld1 {v24.2d,v25.2d,v26.2d,v27.2d}, [x10] // Lk_sb1, Lk_sb2 - ret - - -## -## _aes_encrypt_core -## -## AES-encrypt %xmm0. -## -## Inputs: -## %xmm0 = input -## %xmm9-%xmm15 as in _vpaes_preheat -## (%rdx) = scheduled keys -## -## Output in %xmm0 -## Clobbers %xmm1-%xmm5, %r9, %r10, %r11, %rax -## Preserves %xmm6 - %xmm8 so you get some local vectors -## -## - -.align 4 -_vpaes_encrypt_core: - mov x9, x2 - ldr w8, [x2,#240] // pull rounds - adrp x11, Lk_mc_forward@PAGE+16 - add x11, x11, Lk_mc_forward@PAGEOFF+16 - // vmovdqa .Lk_ipt(%rip), %xmm2 # iptlo - ld1 {v16.2d}, [x9], #16 // vmovdqu (%r9), %xmm5 # round0 key - and v1.16b, v7.16b, v17.16b // vpand %xmm9, %xmm0, %xmm1 - ushr v0.16b, v7.16b, #4 // vpsrlb $4, %xmm0, %xmm0 - tbl v1.16b, {v20.16b}, v1.16b // vpshufb %xmm1, %xmm2, %xmm1 - // vmovdqa .Lk_ipt+16(%rip), %xmm3 # ipthi - tbl v2.16b, {v21.16b}, v0.16b // vpshufb %xmm0, %xmm3, %xmm2 - eor v0.16b, v1.16b, v16.16b // vpxor %xmm5, %xmm1, %xmm0 - eor v0.16b, v0.16b, v2.16b // vpxor %xmm2, %xmm0, %xmm0 - b Lenc_entry - -.align 4 -Lenc_loop: - // middle of middle round - add x10, x11, #0x40 - tbl v4.16b, {v25.16b}, v2.16b // vpshufb %xmm2, %xmm13, %xmm4 # 4 = sb1u - ld1 {v1.2d}, [x11], #16 // vmovdqa -0x40(%r11,%r10), %xmm1 # Lk_mc_forward[] - tbl v0.16b, {v24.16b}, v3.16b // vpshufb %xmm3, %xmm12, %xmm0 # 0 = sb1t - eor v4.16b, v4.16b, v16.16b // vpxor %xmm5, %xmm4, %xmm4 # 4 = sb1u + k - tbl v5.16b, {v27.16b}, v2.16b // vpshufb %xmm2, %xmm15, %xmm5 # 4 = sb2u - eor v0.16b, v0.16b, v4.16b // vpxor %xmm4, %xmm0, %xmm0 # 0 = A - tbl v2.16b, {v26.16b}, v3.16b // vpshufb %xmm3, %xmm14, %xmm2 # 2 = sb2t - ld1 {v4.2d}, [x10] // vmovdqa (%r11,%r10), %xmm4 # Lk_mc_backward[] - tbl v3.16b, {v0.16b}, v1.16b // vpshufb %xmm1, %xmm0, %xmm3 # 0 = B - eor v2.16b, v2.16b, v5.16b // vpxor %xmm5, %xmm2, %xmm2 # 2 = 2A - tbl v0.16b, {v0.16b}, v4.16b // vpshufb %xmm4, %xmm0, %xmm0 # 3 = D - eor v3.16b, v3.16b, v2.16b // vpxor %xmm2, %xmm3, %xmm3 # 0 = 2A+B - tbl v4.16b, {v3.16b}, v1.16b // vpshufb %xmm1, %xmm3, %xmm4 # 0 = 2B+C - eor v0.16b, v0.16b, v3.16b // vpxor %xmm3, %xmm0, %xmm0 # 3 = 2A+B+D - and x11, x11, #~(1<<6) // and $0x30, %r11 # ... mod 4 - eor v0.16b, v0.16b, v4.16b // vpxor %xmm4, %xmm0, %xmm0 # 0 = 2A+3B+C+D - sub w8, w8, #1 // nr-- - -Lenc_entry: - // top of round - and v1.16b, v0.16b, v17.16b // vpand %xmm0, %xmm9, %xmm1 # 0 = k - ushr v0.16b, v0.16b, #4 // vpsrlb $4, %xmm0, %xmm0 # 1 = i - tbl v5.16b, {v19.16b}, v1.16b // vpshufb %xmm1, %xmm11, %xmm5 # 2 = a/k - eor v1.16b, v1.16b, v0.16b // vpxor %xmm0, %xmm1, %xmm1 # 0 = j - tbl v3.16b, {v18.16b}, v0.16b // vpshufb %xmm0, %xmm10, %xmm3 # 3 = 1/i - tbl v4.16b, {v18.16b}, v1.16b // vpshufb %xmm1, %xmm10, %xmm4 # 4 = 1/j - eor v3.16b, v3.16b, v5.16b // vpxor %xmm5, %xmm3, %xmm3 # 3 = iak = 1/i + a/k - eor v4.16b, v4.16b, v5.16b // vpxor %xmm5, %xmm4, %xmm4 # 4 = jak = 1/j + a/k - tbl v2.16b, {v18.16b}, v3.16b // vpshufb %xmm3, %xmm10, %xmm2 # 2 = 1/iak - tbl v3.16b, {v18.16b}, v4.16b // vpshufb %xmm4, %xmm10, %xmm3 # 3 = 1/jak - eor v2.16b, v2.16b, v1.16b // vpxor %xmm1, %xmm2, %xmm2 # 2 = io - eor v3.16b, v3.16b, v0.16b // vpxor %xmm0, %xmm3, %xmm3 # 3 = jo - ld1 {v16.2d}, [x9],#16 // vmovdqu (%r9), %xmm5 - cbnz w8, Lenc_loop - - // middle of last round - add x10, x11, #0x80 - // vmovdqa -0x60(%r10), %xmm4 # 3 : sbou .Lk_sbo - // vmovdqa -0x50(%r10), %xmm0 # 0 : sbot .Lk_sbo+16 - tbl v4.16b, {v22.16b}, v2.16b // vpshufb %xmm2, %xmm4, %xmm4 # 4 = sbou - ld1 {v1.2d}, [x10] // vmovdqa 0x40(%r11,%r10), %xmm1 # Lk_sr[] - tbl v0.16b, {v23.16b}, v3.16b // vpshufb %xmm3, %xmm0, %xmm0 # 0 = sb1t - eor v4.16b, v4.16b, v16.16b // vpxor %xmm5, %xmm4, %xmm4 # 4 = sb1u + k - eor v0.16b, v0.16b, v4.16b // vpxor %xmm4, %xmm0, %xmm0 # 0 = A - tbl v0.16b, {v0.16b}, v1.16b // vpshufb %xmm1, %xmm0, %xmm0 - ret - - -.globl _GFp_vpaes_encrypt -.private_extern _GFp_vpaes_encrypt - -.align 4 -_GFp_vpaes_encrypt: - AARCH64_SIGN_LINK_REGISTER - stp x29,x30,[sp,#-16]! - add x29,sp,#0 - - ld1 {v7.16b}, [x0] - bl _vpaes_encrypt_preheat - bl _vpaes_encrypt_core - st1 {v0.16b}, [x1] - - ldp x29,x30,[sp],#16 - AARCH64_VALIDATE_LINK_REGISTER - ret - - - -.align 4 -_vpaes_encrypt_2x: - mov x9, x2 - ldr w8, [x2,#240] // pull rounds - adrp x11, Lk_mc_forward@PAGE+16 - add x11, x11, Lk_mc_forward@PAGEOFF+16 - // vmovdqa .Lk_ipt(%rip), %xmm2 # iptlo - ld1 {v16.2d}, [x9], #16 // vmovdqu (%r9), %xmm5 # round0 key - and v1.16b, v14.16b, v17.16b // vpand %xmm9, %xmm0, %xmm1 - ushr v0.16b, v14.16b, #4 // vpsrlb $4, %xmm0, %xmm0 - and v9.16b, v15.16b, v17.16b - ushr v8.16b, v15.16b, #4 - tbl v1.16b, {v20.16b}, v1.16b // vpshufb %xmm1, %xmm2, %xmm1 - tbl v9.16b, {v20.16b}, v9.16b - // vmovdqa .Lk_ipt+16(%rip), %xmm3 # ipthi - tbl v2.16b, {v21.16b}, v0.16b // vpshufb %xmm0, %xmm3, %xmm2 - tbl v10.16b, {v21.16b}, v8.16b - eor v0.16b, v1.16b, v16.16b // vpxor %xmm5, %xmm1, %xmm0 - eor v8.16b, v9.16b, v16.16b - eor v0.16b, v0.16b, v2.16b // vpxor %xmm2, %xmm0, %xmm0 - eor v8.16b, v8.16b, v10.16b - b Lenc_2x_entry - -.align 4 -Lenc_2x_loop: - // middle of middle round - add x10, x11, #0x40 - tbl v4.16b, {v25.16b}, v2.16b // vpshufb %xmm2, %xmm13, %xmm4 # 4 = sb1u - tbl v12.16b, {v25.16b}, v10.16b - ld1 {v1.2d}, [x11], #16 // vmovdqa -0x40(%r11,%r10), %xmm1 # Lk_mc_forward[] - tbl v0.16b, {v24.16b}, v3.16b // vpshufb %xmm3, %xmm12, %xmm0 # 0 = sb1t - tbl v8.16b, {v24.16b}, v11.16b - eor v4.16b, v4.16b, v16.16b // vpxor %xmm5, %xmm4, %xmm4 # 4 = sb1u + k - eor v12.16b, v12.16b, v16.16b - tbl v5.16b, {v27.16b}, v2.16b // vpshufb %xmm2, %xmm15, %xmm5 # 4 = sb2u - tbl v13.16b, {v27.16b}, v10.16b - eor v0.16b, v0.16b, v4.16b // vpxor %xmm4, %xmm0, %xmm0 # 0 = A - eor v8.16b, v8.16b, v12.16b - tbl v2.16b, {v26.16b}, v3.16b // vpshufb %xmm3, %xmm14, %xmm2 # 2 = sb2t - tbl v10.16b, {v26.16b}, v11.16b - ld1 {v4.2d}, [x10] // vmovdqa (%r11,%r10), %xmm4 # Lk_mc_backward[] - tbl v3.16b, {v0.16b}, v1.16b // vpshufb %xmm1, %xmm0, %xmm3 # 0 = B - tbl v11.16b, {v8.16b}, v1.16b - eor v2.16b, v2.16b, v5.16b // vpxor %xmm5, %xmm2, %xmm2 # 2 = 2A - eor v10.16b, v10.16b, v13.16b - tbl v0.16b, {v0.16b}, v4.16b // vpshufb %xmm4, %xmm0, %xmm0 # 3 = D - tbl v8.16b, {v8.16b}, v4.16b - eor v3.16b, v3.16b, v2.16b // vpxor %xmm2, %xmm3, %xmm3 # 0 = 2A+B - eor v11.16b, v11.16b, v10.16b - tbl v4.16b, {v3.16b}, v1.16b // vpshufb %xmm1, %xmm3, %xmm4 # 0 = 2B+C - tbl v12.16b, {v11.16b},v1.16b - eor v0.16b, v0.16b, v3.16b // vpxor %xmm3, %xmm0, %xmm0 # 3 = 2A+B+D - eor v8.16b, v8.16b, v11.16b - and x11, x11, #~(1<<6) // and $0x30, %r11 # ... mod 4 - eor v0.16b, v0.16b, v4.16b // vpxor %xmm4, %xmm0, %xmm0 # 0 = 2A+3B+C+D - eor v8.16b, v8.16b, v12.16b - sub w8, w8, #1 // nr-- - -Lenc_2x_entry: - // top of round - and v1.16b, v0.16b, v17.16b // vpand %xmm0, %xmm9, %xmm1 # 0 = k - ushr v0.16b, v0.16b, #4 // vpsrlb $4, %xmm0, %xmm0 # 1 = i - and v9.16b, v8.16b, v17.16b - ushr v8.16b, v8.16b, #4 - tbl v5.16b, {v19.16b},v1.16b // vpshufb %xmm1, %xmm11, %xmm5 # 2 = a/k - tbl v13.16b, {v19.16b},v9.16b - eor v1.16b, v1.16b, v0.16b // vpxor %xmm0, %xmm1, %xmm1 # 0 = j - eor v9.16b, v9.16b, v8.16b - tbl v3.16b, {v18.16b},v0.16b // vpshufb %xmm0, %xmm10, %xmm3 # 3 = 1/i - tbl v11.16b, {v18.16b},v8.16b - tbl v4.16b, {v18.16b},v1.16b // vpshufb %xmm1, %xmm10, %xmm4 # 4 = 1/j - tbl v12.16b, {v18.16b},v9.16b - eor v3.16b, v3.16b, v5.16b // vpxor %xmm5, %xmm3, %xmm3 # 3 = iak = 1/i + a/k - eor v11.16b, v11.16b, v13.16b - eor v4.16b, v4.16b, v5.16b // vpxor %xmm5, %xmm4, %xmm4 # 4 = jak = 1/j + a/k - eor v12.16b, v12.16b, v13.16b - tbl v2.16b, {v18.16b},v3.16b // vpshufb %xmm3, %xmm10, %xmm2 # 2 = 1/iak - tbl v10.16b, {v18.16b},v11.16b - tbl v3.16b, {v18.16b},v4.16b // vpshufb %xmm4, %xmm10, %xmm3 # 3 = 1/jak - tbl v11.16b, {v18.16b},v12.16b - eor v2.16b, v2.16b, v1.16b // vpxor %xmm1, %xmm2, %xmm2 # 2 = io - eor v10.16b, v10.16b, v9.16b - eor v3.16b, v3.16b, v0.16b // vpxor %xmm0, %xmm3, %xmm3 # 3 = jo - eor v11.16b, v11.16b, v8.16b - ld1 {v16.2d}, [x9],#16 // vmovdqu (%r9), %xmm5 - cbnz w8, Lenc_2x_loop - - // middle of last round - add x10, x11, #0x80 - // vmovdqa -0x60(%r10), %xmm4 # 3 : sbou .Lk_sbo - // vmovdqa -0x50(%r10), %xmm0 # 0 : sbot .Lk_sbo+16 - tbl v4.16b, {v22.16b}, v2.16b // vpshufb %xmm2, %xmm4, %xmm4 # 4 = sbou - tbl v12.16b, {v22.16b}, v10.16b - ld1 {v1.2d}, [x10] // vmovdqa 0x40(%r11,%r10), %xmm1 # Lk_sr[] - tbl v0.16b, {v23.16b}, v3.16b // vpshufb %xmm3, %xmm0, %xmm0 # 0 = sb1t - tbl v8.16b, {v23.16b}, v11.16b - eor v4.16b, v4.16b, v16.16b // vpxor %xmm5, %xmm4, %xmm4 # 4 = sb1u + k - eor v12.16b, v12.16b, v16.16b - eor v0.16b, v0.16b, v4.16b // vpxor %xmm4, %xmm0, %xmm0 # 0 = A - eor v8.16b, v8.16b, v12.16b - tbl v0.16b, {v0.16b},v1.16b // vpshufb %xmm1, %xmm0, %xmm0 - tbl v1.16b, {v8.16b},v1.16b - ret - -######################################################## -## ## -## AES key schedule ## -## ## -######################################################## - -.align 4 -_vpaes_key_preheat: - adrp x10, Lk_inv@PAGE - add x10, x10, Lk_inv@PAGEOFF - movi v16.16b, #0x5b // Lk_s63 - adrp x11, Lk_sb1@PAGE - add x11, x11, Lk_sb1@PAGEOFF - movi v17.16b, #0x0f // Lk_s0F - ld1 {v18.2d,v19.2d,v20.2d,v21.2d}, [x10] // Lk_inv, Lk_ipt - adrp x10, Lk_dksd@PAGE - add x10, x10, Lk_dksd@PAGEOFF - ld1 {v22.2d,v23.2d}, [x11] // Lk_sb1 - adrp x11, Lk_mc_forward@PAGE - add x11, x11, Lk_mc_forward@PAGEOFF - ld1 {v24.2d,v25.2d,v26.2d,v27.2d}, [x10],#64 // Lk_dksd, Lk_dksb - ld1 {v28.2d,v29.2d,v30.2d,v31.2d}, [x10],#64 // Lk_dkse, Lk_dks9 - ld1 {v8.2d}, [x10] // Lk_rcon - ld1 {v9.2d}, [x11] // Lk_mc_forward[0] - ret - - - -.align 4 -_vpaes_schedule_core: - AARCH64_SIGN_LINK_REGISTER - stp x29, x30, [sp,#-16]! - add x29,sp,#0 - - bl _vpaes_key_preheat // load the tables - - ld1 {v0.16b}, [x0],#16 // vmovdqu (%rdi), %xmm0 # load key (unaligned) - - // input transform - mov v3.16b, v0.16b // vmovdqa %xmm0, %xmm3 - bl _vpaes_schedule_transform - mov v7.16b, v0.16b // vmovdqa %xmm0, %xmm7 - - adrp x10, Lk_sr@PAGE // lea Lk_sr(%rip),%r10 - add x10, x10, Lk_sr@PAGEOFF - - add x8, x8, x10 - - // encrypting, output zeroth round key after transform - st1 {v0.2d}, [x2] // vmovdqu %xmm0, (%rdx) - - cmp w1, #192 // cmp $192, %esi - b.hi Lschedule_256 - b.eq Lschedule_192 - // 128: fall though - -## -## .schedule_128 -## -## 128-bit specific part of key schedule. -## -## This schedule is really simple, because all its parts -## are accomplished by the subroutines. -## -Lschedule_128: - mov x0, #10 // mov $10, %esi - -Loop_schedule_128: - sub x0, x0, #1 // dec %esi - bl _vpaes_schedule_round - cbz x0, Lschedule_mangle_last - bl _vpaes_schedule_mangle // write output - b Loop_schedule_128 - -## -## .aes_schedule_192 -## -## 192-bit specific part of key schedule. -## -## The main body of this schedule is the same as the 128-bit -## schedule, but with more smearing. The long, high side is -## stored in %xmm7 as before, and the short, low side is in -## the high bits of %xmm6. -## -## This schedule is somewhat nastier, however, because each -## round produces 192 bits of key material, or 1.5 round keys. -## Therefore, on each cycle we do 2 rounds and produce 3 round -## keys. -## -.align 4 -Lschedule_192: - sub x0, x0, #8 - ld1 {v0.16b}, [x0] // vmovdqu 8(%rdi),%xmm0 # load key part 2 (very unaligned) - bl _vpaes_schedule_transform // input transform - mov v6.16b, v0.16b // vmovdqa %xmm0, %xmm6 # save short part - eor v4.16b, v4.16b, v4.16b // vpxor %xmm4, %xmm4, %xmm4 # clear 4 - ins v6.d[0], v4.d[0] // vmovhlps %xmm4, %xmm6, %xmm6 # clobber low side with zeros - mov x0, #4 // mov $4, %esi - -Loop_schedule_192: - sub x0, x0, #1 // dec %esi - bl _vpaes_schedule_round - ext v0.16b, v6.16b, v0.16b, #8 // vpalignr $8,%xmm6,%xmm0,%xmm0 - bl _vpaes_schedule_mangle // save key n - bl _vpaes_schedule_192_smear - bl _vpaes_schedule_mangle // save key n+1 - bl _vpaes_schedule_round - cbz x0, Lschedule_mangle_last - bl _vpaes_schedule_mangle // save key n+2 - bl _vpaes_schedule_192_smear - b Loop_schedule_192 - -## -## .aes_schedule_256 -## -## 256-bit specific part of key schedule. -## -## The structure here is very similar to the 128-bit -## schedule, but with an additional "low side" in -## %xmm6. The low side's rounds are the same as the -## high side's, except no rcon and no rotation. -## -.align 4 -Lschedule_256: - ld1 {v0.16b}, [x0] // vmovdqu 16(%rdi),%xmm0 # load key part 2 (unaligned) - bl _vpaes_schedule_transform // input transform - mov x0, #7 // mov $7, %esi - -Loop_schedule_256: - sub x0, x0, #1 // dec %esi - bl _vpaes_schedule_mangle // output low result - mov v6.16b, v0.16b // vmovdqa %xmm0, %xmm6 # save cur_lo in xmm6 - - // high round - bl _vpaes_schedule_round - cbz x0, Lschedule_mangle_last - bl _vpaes_schedule_mangle - - // low round. swap xmm7 and xmm6 - dup v0.4s, v0.s[3] // vpshufd $0xFF, %xmm0, %xmm0 - movi v4.16b, #0 - mov v5.16b, v7.16b // vmovdqa %xmm7, %xmm5 - mov v7.16b, v6.16b // vmovdqa %xmm6, %xmm7 - bl _vpaes_schedule_low_round - mov v7.16b, v5.16b // vmovdqa %xmm5, %xmm7 - - b Loop_schedule_256 - -## -## .aes_schedule_mangle_last -## -## Mangler for last round of key schedule -## Mangles %xmm0 -## when encrypting, outputs out(%xmm0) ^ 63 -## when decrypting, outputs unskew(%xmm0) -## -## Always called right before return... jumps to cleanup and exits -## -.align 4 -Lschedule_mangle_last: - // schedule last round key from xmm0 - adrp x11, Lk_deskew@PAGE // lea Lk_deskew(%rip),%r11 # prepare to deskew - add x11, x11, Lk_deskew@PAGEOFF - - cbnz w3, Lschedule_mangle_last_dec - - // encrypting - ld1 {v1.2d}, [x8] // vmovdqa (%r8,%r10),%xmm1 - adrp x11, Lk_opt@PAGE // lea Lk_opt(%rip), %r11 # prepare to output transform - add x11, x11, Lk_opt@PAGEOFF - add x2, x2, #32 // add $32, %rdx - tbl v0.16b, {v0.16b}, v1.16b // vpshufb %xmm1, %xmm0, %xmm0 # output permute - -Lschedule_mangle_last_dec: - ld1 {v20.2d,v21.2d}, [x11] // reload constants - sub x2, x2, #16 // add $-16, %rdx - eor v0.16b, v0.16b, v16.16b // vpxor Lk_s63(%rip), %xmm0, %xmm0 - bl _vpaes_schedule_transform // output transform - st1 {v0.2d}, [x2] // vmovdqu %xmm0, (%rdx) # save last key - - // cleanup - eor v0.16b, v0.16b, v0.16b // vpxor %xmm0, %xmm0, %xmm0 - eor v1.16b, v1.16b, v1.16b // vpxor %xmm1, %xmm1, %xmm1 - eor v2.16b, v2.16b, v2.16b // vpxor %xmm2, %xmm2, %xmm2 - eor v3.16b, v3.16b, v3.16b // vpxor %xmm3, %xmm3, %xmm3 - eor v4.16b, v4.16b, v4.16b // vpxor %xmm4, %xmm4, %xmm4 - eor v5.16b, v5.16b, v5.16b // vpxor %xmm5, %xmm5, %xmm5 - eor v6.16b, v6.16b, v6.16b // vpxor %xmm6, %xmm6, %xmm6 - eor v7.16b, v7.16b, v7.16b // vpxor %xmm7, %xmm7, %xmm7 - ldp x29, x30, [sp],#16 - AARCH64_VALIDATE_LINK_REGISTER - ret - - -## -## .aes_schedule_192_smear -## -## Smear the short, low side in the 192-bit key schedule. -## -## Inputs: -## %xmm7: high side, b a x y -## %xmm6: low side, d c 0 0 -## %xmm13: 0 -## -## Outputs: -## %xmm6: b+c+d b+c 0 0 -## %xmm0: b+c+d b+c b a -## - -.align 4 -_vpaes_schedule_192_smear: - movi v1.16b, #0 - dup v0.4s, v7.s[3] - ins v1.s[3], v6.s[2] // vpshufd $0x80, %xmm6, %xmm1 # d c 0 0 -> c 0 0 0 - ins v0.s[0], v7.s[2] // vpshufd $0xFE, %xmm7, %xmm0 # b a _ _ -> b b b a - eor v6.16b, v6.16b, v1.16b // vpxor %xmm1, %xmm6, %xmm6 # -> c+d c 0 0 - eor v1.16b, v1.16b, v1.16b // vpxor %xmm1, %xmm1, %xmm1 - eor v6.16b, v6.16b, v0.16b // vpxor %xmm0, %xmm6, %xmm6 # -> b+c+d b+c b a - mov v0.16b, v6.16b // vmovdqa %xmm6, %xmm0 - ins v6.d[0], v1.d[0] // vmovhlps %xmm1, %xmm6, %xmm6 # clobber low side with zeros - ret - - -## -## .aes_schedule_round -## -## Runs one main round of the key schedule on %xmm0, %xmm7 -## -## Specifically, runs subbytes on the high dword of %xmm0 -## then rotates it by one byte and xors into the low dword of -## %xmm7. -## -## Adds rcon from low byte of %xmm8, then rotates %xmm8 for -## next rcon. -## -## Smears the dwords of %xmm7 by xoring the low into the -## second low, result into third, result into highest. -## -## Returns results in %xmm7 = %xmm0. -## Clobbers %xmm1-%xmm4, %r11. -## - -.align 4 -_vpaes_schedule_round: - // extract rcon from xmm8 - movi v4.16b, #0 // vpxor %xmm4, %xmm4, %xmm4 - ext v1.16b, v8.16b, v4.16b, #15 // vpalignr $15, %xmm8, %xmm4, %xmm1 - ext v8.16b, v8.16b, v8.16b, #15 // vpalignr $15, %xmm8, %xmm8, %xmm8 - eor v7.16b, v7.16b, v1.16b // vpxor %xmm1, %xmm7, %xmm7 - - // rotate - dup v0.4s, v0.s[3] // vpshufd $0xFF, %xmm0, %xmm0 - ext v0.16b, v0.16b, v0.16b, #1 // vpalignr $1, %xmm0, %xmm0, %xmm0 - - // fall through... - - // low round: same as high round, but no rotation and no rcon. -_vpaes_schedule_low_round: - // smear xmm7 - ext v1.16b, v4.16b, v7.16b, #12 // vpslldq $4, %xmm7, %xmm1 - eor v7.16b, v7.16b, v1.16b // vpxor %xmm1, %xmm7, %xmm7 - ext v4.16b, v4.16b, v7.16b, #8 // vpslldq $8, %xmm7, %xmm4 - - // subbytes - and v1.16b, v0.16b, v17.16b // vpand %xmm9, %xmm0, %xmm1 # 0 = k - ushr v0.16b, v0.16b, #4 // vpsrlb $4, %xmm0, %xmm0 # 1 = i - eor v7.16b, v7.16b, v4.16b // vpxor %xmm4, %xmm7, %xmm7 - tbl v2.16b, {v19.16b}, v1.16b // vpshufb %xmm1, %xmm11, %xmm2 # 2 = a/k - eor v1.16b, v1.16b, v0.16b // vpxor %xmm0, %xmm1, %xmm1 # 0 = j - tbl v3.16b, {v18.16b}, v0.16b // vpshufb %xmm0, %xmm10, %xmm3 # 3 = 1/i - eor v3.16b, v3.16b, v2.16b // vpxor %xmm2, %xmm3, %xmm3 # 3 = iak = 1/i + a/k - tbl v4.16b, {v18.16b}, v1.16b // vpshufb %xmm1, %xmm10, %xmm4 # 4 = 1/j - eor v7.16b, v7.16b, v16.16b // vpxor Lk_s63(%rip), %xmm7, %xmm7 - tbl v3.16b, {v18.16b}, v3.16b // vpshufb %xmm3, %xmm10, %xmm3 # 2 = 1/iak - eor v4.16b, v4.16b, v2.16b // vpxor %xmm2, %xmm4, %xmm4 # 4 = jak = 1/j + a/k - tbl v2.16b, {v18.16b}, v4.16b // vpshufb %xmm4, %xmm10, %xmm2 # 3 = 1/jak - eor v3.16b, v3.16b, v1.16b // vpxor %xmm1, %xmm3, %xmm3 # 2 = io - eor v2.16b, v2.16b, v0.16b // vpxor %xmm0, %xmm2, %xmm2 # 3 = jo - tbl v4.16b, {v23.16b}, v3.16b // vpshufb %xmm3, %xmm13, %xmm4 # 4 = sbou - tbl v1.16b, {v22.16b}, v2.16b // vpshufb %xmm2, %xmm12, %xmm1 # 0 = sb1t - eor v1.16b, v1.16b, v4.16b // vpxor %xmm4, %xmm1, %xmm1 # 0 = sbox output - - // add in smeared stuff - eor v0.16b, v1.16b, v7.16b // vpxor %xmm7, %xmm1, %xmm0 - eor v7.16b, v1.16b, v7.16b // vmovdqa %xmm0, %xmm7 - ret - - -## -## .aes_schedule_transform -## -## Linear-transform %xmm0 according to tables at (%r11) -## -## Requires that %xmm9 = 0x0F0F... as in preheat -## Output in %xmm0 -## Clobbers %xmm1, %xmm2 -## - -.align 4 -_vpaes_schedule_transform: - and v1.16b, v0.16b, v17.16b // vpand %xmm9, %xmm0, %xmm1 - ushr v0.16b, v0.16b, #4 // vpsrlb $4, %xmm0, %xmm0 - // vmovdqa (%r11), %xmm2 # lo - tbl v2.16b, {v20.16b}, v1.16b // vpshufb %xmm1, %xmm2, %xmm2 - // vmovdqa 16(%r11), %xmm1 # hi - tbl v0.16b, {v21.16b}, v0.16b // vpshufb %xmm0, %xmm1, %xmm0 - eor v0.16b, v0.16b, v2.16b // vpxor %xmm2, %xmm0, %xmm0 - ret - - -## -## .aes_schedule_mangle -## -## Mangle xmm0 from (basis-transformed) standard version -## to our version. -## -## On encrypt, -## xor with 0x63 -## multiply by circulant 0,1,1,1 -## apply shiftrows transform -## -## On decrypt, -## xor with 0x63 -## multiply by "inverse mixcolumns" circulant E,B,D,9 -## deskew -## apply shiftrows transform -## -## -## Writes out to (%rdx), and increments or decrements it -## Keeps track of round number mod 4 in %r8 -## Preserves xmm0 -## Clobbers xmm1-xmm5 -## - -.align 4 -_vpaes_schedule_mangle: - mov v4.16b, v0.16b // vmovdqa %xmm0, %xmm4 # save xmm0 for later - // vmovdqa .Lk_mc_forward(%rip),%xmm5 - - // encrypting - eor v4.16b, v0.16b, v16.16b // vpxor Lk_s63(%rip), %xmm0, %xmm4 - add x2, x2, #16 // add $16, %rdx - tbl v4.16b, {v4.16b}, v9.16b // vpshufb %xmm5, %xmm4, %xmm4 - tbl v1.16b, {v4.16b}, v9.16b // vpshufb %xmm5, %xmm4, %xmm1 - tbl v3.16b, {v1.16b}, v9.16b // vpshufb %xmm5, %xmm1, %xmm3 - eor v4.16b, v4.16b, v1.16b // vpxor %xmm1, %xmm4, %xmm4 - ld1 {v1.2d}, [x8] // vmovdqa (%r8,%r10), %xmm1 - eor v3.16b, v3.16b, v4.16b // vpxor %xmm4, %xmm3, %xmm3 - -Lschedule_mangle_both: - tbl v3.16b, {v3.16b}, v1.16b // vpshufb %xmm1, %xmm3, %xmm3 - add x8, x8, #64-16 // add $-16, %r8 - and x8, x8, #~(1<<6) // and $0x30, %r8 - st1 {v3.2d}, [x2] // vmovdqu %xmm3, (%rdx) - ret - - -.globl _GFp_vpaes_set_encrypt_key -.private_extern _GFp_vpaes_set_encrypt_key - -.align 4 -_GFp_vpaes_set_encrypt_key: - AARCH64_SIGN_LINK_REGISTER - stp x29,x30,[sp,#-16]! - add x29,sp,#0 - stp d8,d9,[sp,#-16]! // ABI spec says so - - lsr w9, w1, #5 // shr $5,%eax - add w9, w9, #5 // $5,%eax - str w9, [x2,#240] // mov %eax,240(%rdx) # AES_KEY->rounds = nbits/32+5; - - mov w3, #0 // mov $0,%ecx - mov x8, #0x30 // mov $0x30,%r8d - bl _vpaes_schedule_core - eor x0, x0, x0 - - ldp d8,d9,[sp],#16 - ldp x29,x30,[sp],#16 - AARCH64_VALIDATE_LINK_REGISTER - ret - -.globl _GFp_vpaes_ctr32_encrypt_blocks -.private_extern _GFp_vpaes_ctr32_encrypt_blocks - -.align 4 -_GFp_vpaes_ctr32_encrypt_blocks: - AARCH64_SIGN_LINK_REGISTER - stp x29,x30,[sp,#-16]! - add x29,sp,#0 - stp d8,d9,[sp,#-16]! // ABI spec says so - stp d10,d11,[sp,#-16]! - stp d12,d13,[sp,#-16]! - stp d14,d15,[sp,#-16]! - - cbz x2, Lctr32_done - - // Note, unlike the other functions, x2 here is measured in blocks, - // not bytes. - mov x17, x2 - mov x2, x3 - - // Load the IV and counter portion. - ldr w6, [x4, #12] - ld1 {v7.16b}, [x4] - - bl _vpaes_encrypt_preheat - tst x17, #1 - rev w6, w6 // The counter is big-endian. - b.eq Lctr32_prep_loop - - // Handle one block so the remaining block count is even for - // _vpaes_encrypt_2x. - ld1 {v6.16b}, [x0], #16 // Load input ahead of time - bl _vpaes_encrypt_core - eor v0.16b, v0.16b, v6.16b // XOR input and result - st1 {v0.16b}, [x1], #16 - subs x17, x17, #1 - // Update the counter. - add w6, w6, #1 - rev w7, w6 - mov v7.s[3], w7 - b.ls Lctr32_done - -Lctr32_prep_loop: - // _vpaes_encrypt_core takes its input from v7, while _vpaes_encrypt_2x - // uses v14 and v15. - mov v15.16b, v7.16b - mov v14.16b, v7.16b - add w6, w6, #1 - rev w7, w6 - mov v15.s[3], w7 - -Lctr32_loop: - ld1 {v6.16b,v7.16b}, [x0], #32 // Load input ahead of time - bl _vpaes_encrypt_2x - eor v0.16b, v0.16b, v6.16b // XOR input and result - eor v1.16b, v1.16b, v7.16b // XOR input and result (#2) - st1 {v0.16b,v1.16b}, [x1], #32 - subs x17, x17, #2 - // Update the counter. - add w7, w6, #1 - add w6, w6, #2 - rev w7, w7 - mov v14.s[3], w7 - rev w7, w6 - mov v15.s[3], w7 - b.hi Lctr32_loop - -Lctr32_done: - ldp d14,d15,[sp],#16 - ldp d12,d13,[sp],#16 - ldp d10,d11,[sp],#16 - ldp d8,d9,[sp],#16 - ldp x29,x30,[sp],#16 - AARCH64_VALIDATE_LINK_REGISTER - ret - -#endif // !OPENSSL_NO_ASM diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/vpaes-armv8-linux64.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/vpaes-armv8-linux64.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/vpaes-armv8-linux64.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/vpaes-armv8-linux64.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,773 +0,0 @@ -// This file is generated from a similarly-named Perl script in the BoringSSL -// source tree. Do not edit by hand. - -#if !defined(__has_feature) -#define __has_feature(x) 0 -#endif -#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) -#define OPENSSL_NO_ASM -#endif - -#if !defined(OPENSSL_NO_ASM) -#if defined(__aarch64__) -#include - -.section .rodata - -.type _vpaes_consts,%object -.align 7 // totally strategic alignment -_vpaes_consts: -.Lk_mc_forward: // mc_forward -.quad 0x0407060500030201, 0x0C0F0E0D080B0A09 -.quad 0x080B0A0904070605, 0x000302010C0F0E0D -.quad 0x0C0F0E0D080B0A09, 0x0407060500030201 -.quad 0x000302010C0F0E0D, 0x080B0A0904070605 -.Lk_mc_backward: // mc_backward -.quad 0x0605040702010003, 0x0E0D0C0F0A09080B -.quad 0x020100030E0D0C0F, 0x0A09080B06050407 -.quad 0x0E0D0C0F0A09080B, 0x0605040702010003 -.quad 0x0A09080B06050407, 0x020100030E0D0C0F -.Lk_sr: // sr -.quad 0x0706050403020100, 0x0F0E0D0C0B0A0908 -.quad 0x030E09040F0A0500, 0x0B06010C07020D08 -.quad 0x0F060D040B020900, 0x070E050C030A0108 -.quad 0x0B0E0104070A0D00, 0x0306090C0F020508 - -// -// "Hot" constants -// -.Lk_inv: // inv, inva -.quad 0x0E05060F0D080180, 0x040703090A0B0C02 -.quad 0x01040A060F0B0780, 0x030D0E0C02050809 -.Lk_ipt: // input transform (lo, hi) -.quad 0xC2B2E8985A2A7000, 0xCABAE09052227808 -.quad 0x4C01307D317C4D00, 0xCD80B1FCB0FDCC81 -.Lk_sbo: // sbou, sbot -.quad 0xD0D26D176FBDC700, 0x15AABF7AC502A878 -.quad 0xCFE474A55FBB6A00, 0x8E1E90D1412B35FA -.Lk_sb1: // sb1u, sb1t -.quad 0x3618D415FAE22300, 0x3BF7CCC10D2ED9EF -.quad 0xB19BE18FCB503E00, 0xA5DF7A6E142AF544 -.Lk_sb2: // sb2u, sb2t -.quad 0x69EB88400AE12900, 0xC2A163C8AB82234A -.quad 0xE27A93C60B712400, 0x5EB7E955BC982FCD - -// -// Key schedule constants -// -.Lk_dksd: // decryption key schedule: invskew x*D -.quad 0xFEB91A5DA3E44700, 0x0740E3A45A1DBEF9 -.quad 0x41C277F4B5368300, 0x5FDC69EAAB289D1E -.Lk_dksb: // decryption key schedule: invskew x*B -.quad 0x9A4FCA1F8550D500, 0x03D653861CC94C99 -.quad 0x115BEDA7B6FC4A00, 0xD993256F7E3482C8 -.Lk_dkse: // decryption key schedule: invskew x*E + 0x63 -.quad 0xD5031CCA1FC9D600, 0x53859A4C994F5086 -.quad 0xA23196054FDC7BE8, 0xCD5EF96A20B31487 -.Lk_dks9: // decryption key schedule: invskew x*9 -.quad 0xB6116FC87ED9A700, 0x4AED933482255BFC -.quad 0x4576516227143300, 0x8BB89FACE9DAFDCE - -.Lk_rcon: // rcon -.quad 0x1F8391B9AF9DEEB6, 0x702A98084D7C7D81 - -.Lk_opt: // output transform -.quad 0xFF9F4929D6B66000, 0xF7974121DEBE6808 -.quad 0x01EDBD5150BCEC00, 0xE10D5DB1B05C0CE0 -.Lk_deskew: // deskew tables: inverts the sbox's "skew" -.quad 0x07E4A34047A4E300, 0x1DFEB95A5DBEF91A -.quad 0x5F36B5DC83EA6900, 0x2841C2ABF49D1E77 - -.byte 86,101,99,116,111,114,32,80,101,114,109,117,116,97,116,105,111,110,32,65,69,83,32,102,111,114,32,65,82,77,118,56,44,32,77,105,107,101,32,72,97,109,98,117,114,103,32,40,83,116,97,110,102,111,114,100,32,85,110,105,118,101,114,115,105,116,121,41,0 -.align 2 -.size _vpaes_consts,.-_vpaes_consts -.align 6 - -.text -## -## _aes_preheat -## -## Fills register %r10 -> .aes_consts (so you can -fPIC) -## and %xmm9-%xmm15 as specified below. -## -.type _vpaes_encrypt_preheat,%function -.align 4 -_vpaes_encrypt_preheat: - adrp x10, .Lk_inv - add x10, x10, :lo12:.Lk_inv - movi v17.16b, #0x0f - ld1 {v18.2d,v19.2d}, [x10],#32 // .Lk_inv - ld1 {v20.2d,v21.2d,v22.2d,v23.2d}, [x10],#64 // .Lk_ipt, .Lk_sbo - ld1 {v24.2d,v25.2d,v26.2d,v27.2d}, [x10] // .Lk_sb1, .Lk_sb2 - ret -.size _vpaes_encrypt_preheat,.-_vpaes_encrypt_preheat - -## -## _aes_encrypt_core -## -## AES-encrypt %xmm0. -## -## Inputs: -## %xmm0 = input -## %xmm9-%xmm15 as in _vpaes_preheat -## (%rdx) = scheduled keys -## -## Output in %xmm0 -## Clobbers %xmm1-%xmm5, %r9, %r10, %r11, %rax -## Preserves %xmm6 - %xmm8 so you get some local vectors -## -## -.type _vpaes_encrypt_core,%function -.align 4 -_vpaes_encrypt_core: - mov x9, x2 - ldr w8, [x2,#240] // pull rounds - adrp x11, .Lk_mc_forward+16 - add x11, x11, :lo12:.Lk_mc_forward+16 - // vmovdqa .Lk_ipt(%rip), %xmm2 # iptlo - ld1 {v16.2d}, [x9], #16 // vmovdqu (%r9), %xmm5 # round0 key - and v1.16b, v7.16b, v17.16b // vpand %xmm9, %xmm0, %xmm1 - ushr v0.16b, v7.16b, #4 // vpsrlb $4, %xmm0, %xmm0 - tbl v1.16b, {v20.16b}, v1.16b // vpshufb %xmm1, %xmm2, %xmm1 - // vmovdqa .Lk_ipt+16(%rip), %xmm3 # ipthi - tbl v2.16b, {v21.16b}, v0.16b // vpshufb %xmm0, %xmm3, %xmm2 - eor v0.16b, v1.16b, v16.16b // vpxor %xmm5, %xmm1, %xmm0 - eor v0.16b, v0.16b, v2.16b // vpxor %xmm2, %xmm0, %xmm0 - b .Lenc_entry - -.align 4 -.Lenc_loop: - // middle of middle round - add x10, x11, #0x40 - tbl v4.16b, {v25.16b}, v2.16b // vpshufb %xmm2, %xmm13, %xmm4 # 4 = sb1u - ld1 {v1.2d}, [x11], #16 // vmovdqa -0x40(%r11,%r10), %xmm1 # .Lk_mc_forward[] - tbl v0.16b, {v24.16b}, v3.16b // vpshufb %xmm3, %xmm12, %xmm0 # 0 = sb1t - eor v4.16b, v4.16b, v16.16b // vpxor %xmm5, %xmm4, %xmm4 # 4 = sb1u + k - tbl v5.16b, {v27.16b}, v2.16b // vpshufb %xmm2, %xmm15, %xmm5 # 4 = sb2u - eor v0.16b, v0.16b, v4.16b // vpxor %xmm4, %xmm0, %xmm0 # 0 = A - tbl v2.16b, {v26.16b}, v3.16b // vpshufb %xmm3, %xmm14, %xmm2 # 2 = sb2t - ld1 {v4.2d}, [x10] // vmovdqa (%r11,%r10), %xmm4 # .Lk_mc_backward[] - tbl v3.16b, {v0.16b}, v1.16b // vpshufb %xmm1, %xmm0, %xmm3 # 0 = B - eor v2.16b, v2.16b, v5.16b // vpxor %xmm5, %xmm2, %xmm2 # 2 = 2A - tbl v0.16b, {v0.16b}, v4.16b // vpshufb %xmm4, %xmm0, %xmm0 # 3 = D - eor v3.16b, v3.16b, v2.16b // vpxor %xmm2, %xmm3, %xmm3 # 0 = 2A+B - tbl v4.16b, {v3.16b}, v1.16b // vpshufb %xmm1, %xmm3, %xmm4 # 0 = 2B+C - eor v0.16b, v0.16b, v3.16b // vpxor %xmm3, %xmm0, %xmm0 # 3 = 2A+B+D - and x11, x11, #~(1<<6) // and $0x30, %r11 # ... mod 4 - eor v0.16b, v0.16b, v4.16b // vpxor %xmm4, %xmm0, %xmm0 # 0 = 2A+3B+C+D - sub w8, w8, #1 // nr-- - -.Lenc_entry: - // top of round - and v1.16b, v0.16b, v17.16b // vpand %xmm0, %xmm9, %xmm1 # 0 = k - ushr v0.16b, v0.16b, #4 // vpsrlb $4, %xmm0, %xmm0 # 1 = i - tbl v5.16b, {v19.16b}, v1.16b // vpshufb %xmm1, %xmm11, %xmm5 # 2 = a/k - eor v1.16b, v1.16b, v0.16b // vpxor %xmm0, %xmm1, %xmm1 # 0 = j - tbl v3.16b, {v18.16b}, v0.16b // vpshufb %xmm0, %xmm10, %xmm3 # 3 = 1/i - tbl v4.16b, {v18.16b}, v1.16b // vpshufb %xmm1, %xmm10, %xmm4 # 4 = 1/j - eor v3.16b, v3.16b, v5.16b // vpxor %xmm5, %xmm3, %xmm3 # 3 = iak = 1/i + a/k - eor v4.16b, v4.16b, v5.16b // vpxor %xmm5, %xmm4, %xmm4 # 4 = jak = 1/j + a/k - tbl v2.16b, {v18.16b}, v3.16b // vpshufb %xmm3, %xmm10, %xmm2 # 2 = 1/iak - tbl v3.16b, {v18.16b}, v4.16b // vpshufb %xmm4, %xmm10, %xmm3 # 3 = 1/jak - eor v2.16b, v2.16b, v1.16b // vpxor %xmm1, %xmm2, %xmm2 # 2 = io - eor v3.16b, v3.16b, v0.16b // vpxor %xmm0, %xmm3, %xmm3 # 3 = jo - ld1 {v16.2d}, [x9],#16 // vmovdqu (%r9), %xmm5 - cbnz w8, .Lenc_loop - - // middle of last round - add x10, x11, #0x80 - // vmovdqa -0x60(%r10), %xmm4 # 3 : sbou .Lk_sbo - // vmovdqa -0x50(%r10), %xmm0 # 0 : sbot .Lk_sbo+16 - tbl v4.16b, {v22.16b}, v2.16b // vpshufb %xmm2, %xmm4, %xmm4 # 4 = sbou - ld1 {v1.2d}, [x10] // vmovdqa 0x40(%r11,%r10), %xmm1 # .Lk_sr[] - tbl v0.16b, {v23.16b}, v3.16b // vpshufb %xmm3, %xmm0, %xmm0 # 0 = sb1t - eor v4.16b, v4.16b, v16.16b // vpxor %xmm5, %xmm4, %xmm4 # 4 = sb1u + k - eor v0.16b, v0.16b, v4.16b // vpxor %xmm4, %xmm0, %xmm0 # 0 = A - tbl v0.16b, {v0.16b}, v1.16b // vpshufb %xmm1, %xmm0, %xmm0 - ret -.size _vpaes_encrypt_core,.-_vpaes_encrypt_core - -.globl GFp_vpaes_encrypt -.hidden GFp_vpaes_encrypt -.type GFp_vpaes_encrypt,%function -.align 4 -GFp_vpaes_encrypt: - AARCH64_SIGN_LINK_REGISTER - stp x29,x30,[sp,#-16]! - add x29,sp,#0 - - ld1 {v7.16b}, [x0] - bl _vpaes_encrypt_preheat - bl _vpaes_encrypt_core - st1 {v0.16b}, [x1] - - ldp x29,x30,[sp],#16 - AARCH64_VALIDATE_LINK_REGISTER - ret -.size GFp_vpaes_encrypt,.-GFp_vpaes_encrypt - -.type _vpaes_encrypt_2x,%function -.align 4 -_vpaes_encrypt_2x: - mov x9, x2 - ldr w8, [x2,#240] // pull rounds - adrp x11, .Lk_mc_forward+16 - add x11, x11, :lo12:.Lk_mc_forward+16 - // vmovdqa .Lk_ipt(%rip), %xmm2 # iptlo - ld1 {v16.2d}, [x9], #16 // vmovdqu (%r9), %xmm5 # round0 key - and v1.16b, v14.16b, v17.16b // vpand %xmm9, %xmm0, %xmm1 - ushr v0.16b, v14.16b, #4 // vpsrlb $4, %xmm0, %xmm0 - and v9.16b, v15.16b, v17.16b - ushr v8.16b, v15.16b, #4 - tbl v1.16b, {v20.16b}, v1.16b // vpshufb %xmm1, %xmm2, %xmm1 - tbl v9.16b, {v20.16b}, v9.16b - // vmovdqa .Lk_ipt+16(%rip), %xmm3 # ipthi - tbl v2.16b, {v21.16b}, v0.16b // vpshufb %xmm0, %xmm3, %xmm2 - tbl v10.16b, {v21.16b}, v8.16b - eor v0.16b, v1.16b, v16.16b // vpxor %xmm5, %xmm1, %xmm0 - eor v8.16b, v9.16b, v16.16b - eor v0.16b, v0.16b, v2.16b // vpxor %xmm2, %xmm0, %xmm0 - eor v8.16b, v8.16b, v10.16b - b .Lenc_2x_entry - -.align 4 -.Lenc_2x_loop: - // middle of middle round - add x10, x11, #0x40 - tbl v4.16b, {v25.16b}, v2.16b // vpshufb %xmm2, %xmm13, %xmm4 # 4 = sb1u - tbl v12.16b, {v25.16b}, v10.16b - ld1 {v1.2d}, [x11], #16 // vmovdqa -0x40(%r11,%r10), %xmm1 # .Lk_mc_forward[] - tbl v0.16b, {v24.16b}, v3.16b // vpshufb %xmm3, %xmm12, %xmm0 # 0 = sb1t - tbl v8.16b, {v24.16b}, v11.16b - eor v4.16b, v4.16b, v16.16b // vpxor %xmm5, %xmm4, %xmm4 # 4 = sb1u + k - eor v12.16b, v12.16b, v16.16b - tbl v5.16b, {v27.16b}, v2.16b // vpshufb %xmm2, %xmm15, %xmm5 # 4 = sb2u - tbl v13.16b, {v27.16b}, v10.16b - eor v0.16b, v0.16b, v4.16b // vpxor %xmm4, %xmm0, %xmm0 # 0 = A - eor v8.16b, v8.16b, v12.16b - tbl v2.16b, {v26.16b}, v3.16b // vpshufb %xmm3, %xmm14, %xmm2 # 2 = sb2t - tbl v10.16b, {v26.16b}, v11.16b - ld1 {v4.2d}, [x10] // vmovdqa (%r11,%r10), %xmm4 # .Lk_mc_backward[] - tbl v3.16b, {v0.16b}, v1.16b // vpshufb %xmm1, %xmm0, %xmm3 # 0 = B - tbl v11.16b, {v8.16b}, v1.16b - eor v2.16b, v2.16b, v5.16b // vpxor %xmm5, %xmm2, %xmm2 # 2 = 2A - eor v10.16b, v10.16b, v13.16b - tbl v0.16b, {v0.16b}, v4.16b // vpshufb %xmm4, %xmm0, %xmm0 # 3 = D - tbl v8.16b, {v8.16b}, v4.16b - eor v3.16b, v3.16b, v2.16b // vpxor %xmm2, %xmm3, %xmm3 # 0 = 2A+B - eor v11.16b, v11.16b, v10.16b - tbl v4.16b, {v3.16b}, v1.16b // vpshufb %xmm1, %xmm3, %xmm4 # 0 = 2B+C - tbl v12.16b, {v11.16b},v1.16b - eor v0.16b, v0.16b, v3.16b // vpxor %xmm3, %xmm0, %xmm0 # 3 = 2A+B+D - eor v8.16b, v8.16b, v11.16b - and x11, x11, #~(1<<6) // and $0x30, %r11 # ... mod 4 - eor v0.16b, v0.16b, v4.16b // vpxor %xmm4, %xmm0, %xmm0 # 0 = 2A+3B+C+D - eor v8.16b, v8.16b, v12.16b - sub w8, w8, #1 // nr-- - -.Lenc_2x_entry: - // top of round - and v1.16b, v0.16b, v17.16b // vpand %xmm0, %xmm9, %xmm1 # 0 = k - ushr v0.16b, v0.16b, #4 // vpsrlb $4, %xmm0, %xmm0 # 1 = i - and v9.16b, v8.16b, v17.16b - ushr v8.16b, v8.16b, #4 - tbl v5.16b, {v19.16b},v1.16b // vpshufb %xmm1, %xmm11, %xmm5 # 2 = a/k - tbl v13.16b, {v19.16b},v9.16b - eor v1.16b, v1.16b, v0.16b // vpxor %xmm0, %xmm1, %xmm1 # 0 = j - eor v9.16b, v9.16b, v8.16b - tbl v3.16b, {v18.16b},v0.16b // vpshufb %xmm0, %xmm10, %xmm3 # 3 = 1/i - tbl v11.16b, {v18.16b},v8.16b - tbl v4.16b, {v18.16b},v1.16b // vpshufb %xmm1, %xmm10, %xmm4 # 4 = 1/j - tbl v12.16b, {v18.16b},v9.16b - eor v3.16b, v3.16b, v5.16b // vpxor %xmm5, %xmm3, %xmm3 # 3 = iak = 1/i + a/k - eor v11.16b, v11.16b, v13.16b - eor v4.16b, v4.16b, v5.16b // vpxor %xmm5, %xmm4, %xmm4 # 4 = jak = 1/j + a/k - eor v12.16b, v12.16b, v13.16b - tbl v2.16b, {v18.16b},v3.16b // vpshufb %xmm3, %xmm10, %xmm2 # 2 = 1/iak - tbl v10.16b, {v18.16b},v11.16b - tbl v3.16b, {v18.16b},v4.16b // vpshufb %xmm4, %xmm10, %xmm3 # 3 = 1/jak - tbl v11.16b, {v18.16b},v12.16b - eor v2.16b, v2.16b, v1.16b // vpxor %xmm1, %xmm2, %xmm2 # 2 = io - eor v10.16b, v10.16b, v9.16b - eor v3.16b, v3.16b, v0.16b // vpxor %xmm0, %xmm3, %xmm3 # 3 = jo - eor v11.16b, v11.16b, v8.16b - ld1 {v16.2d}, [x9],#16 // vmovdqu (%r9), %xmm5 - cbnz w8, .Lenc_2x_loop - - // middle of last round - add x10, x11, #0x80 - // vmovdqa -0x60(%r10), %xmm4 # 3 : sbou .Lk_sbo - // vmovdqa -0x50(%r10), %xmm0 # 0 : sbot .Lk_sbo+16 - tbl v4.16b, {v22.16b}, v2.16b // vpshufb %xmm2, %xmm4, %xmm4 # 4 = sbou - tbl v12.16b, {v22.16b}, v10.16b - ld1 {v1.2d}, [x10] // vmovdqa 0x40(%r11,%r10), %xmm1 # .Lk_sr[] - tbl v0.16b, {v23.16b}, v3.16b // vpshufb %xmm3, %xmm0, %xmm0 # 0 = sb1t - tbl v8.16b, {v23.16b}, v11.16b - eor v4.16b, v4.16b, v16.16b // vpxor %xmm5, %xmm4, %xmm4 # 4 = sb1u + k - eor v12.16b, v12.16b, v16.16b - eor v0.16b, v0.16b, v4.16b // vpxor %xmm4, %xmm0, %xmm0 # 0 = A - eor v8.16b, v8.16b, v12.16b - tbl v0.16b, {v0.16b},v1.16b // vpshufb %xmm1, %xmm0, %xmm0 - tbl v1.16b, {v8.16b},v1.16b - ret -.size _vpaes_encrypt_2x,.-_vpaes_encrypt_2x -######################################################## -## ## -## AES key schedule ## -## ## -######################################################## -.type _vpaes_key_preheat,%function -.align 4 -_vpaes_key_preheat: - adrp x10, .Lk_inv - add x10, x10, :lo12:.Lk_inv - movi v16.16b, #0x5b // .Lk_s63 - adrp x11, .Lk_sb1 - add x11, x11, :lo12:.Lk_sb1 - movi v17.16b, #0x0f // .Lk_s0F - ld1 {v18.2d,v19.2d,v20.2d,v21.2d}, [x10] // .Lk_inv, .Lk_ipt - adrp x10, .Lk_dksd - add x10, x10, :lo12:.Lk_dksd - ld1 {v22.2d,v23.2d}, [x11] // .Lk_sb1 - adrp x11, .Lk_mc_forward - add x11, x11, :lo12:.Lk_mc_forward - ld1 {v24.2d,v25.2d,v26.2d,v27.2d}, [x10],#64 // .Lk_dksd, .Lk_dksb - ld1 {v28.2d,v29.2d,v30.2d,v31.2d}, [x10],#64 // .Lk_dkse, .Lk_dks9 - ld1 {v8.2d}, [x10] // .Lk_rcon - ld1 {v9.2d}, [x11] // .Lk_mc_forward[0] - ret -.size _vpaes_key_preheat,.-_vpaes_key_preheat - -.type _vpaes_schedule_core,%function -.align 4 -_vpaes_schedule_core: - AARCH64_SIGN_LINK_REGISTER - stp x29, x30, [sp,#-16]! - add x29,sp,#0 - - bl _vpaes_key_preheat // load the tables - - ld1 {v0.16b}, [x0],#16 // vmovdqu (%rdi), %xmm0 # load key (unaligned) - - // input transform - mov v3.16b, v0.16b // vmovdqa %xmm0, %xmm3 - bl _vpaes_schedule_transform - mov v7.16b, v0.16b // vmovdqa %xmm0, %xmm7 - - adrp x10, .Lk_sr // lea .Lk_sr(%rip),%r10 - add x10, x10, :lo12:.Lk_sr - - add x8, x8, x10 - - // encrypting, output zeroth round key after transform - st1 {v0.2d}, [x2] // vmovdqu %xmm0, (%rdx) - - cmp w1, #192 // cmp $192, %esi - b.hi .Lschedule_256 - b.eq .Lschedule_192 - // 128: fall though - -## -## .schedule_128 -## -## 128-bit specific part of key schedule. -## -## This schedule is really simple, because all its parts -## are accomplished by the subroutines. -## -.Lschedule_128: - mov x0, #10 // mov $10, %esi - -.Loop_schedule_128: - sub x0, x0, #1 // dec %esi - bl _vpaes_schedule_round - cbz x0, .Lschedule_mangle_last - bl _vpaes_schedule_mangle // write output - b .Loop_schedule_128 - -## -## .aes_schedule_192 -## -## 192-bit specific part of key schedule. -## -## The main body of this schedule is the same as the 128-bit -## schedule, but with more smearing. The long, high side is -## stored in %xmm7 as before, and the short, low side is in -## the high bits of %xmm6. -## -## This schedule is somewhat nastier, however, because each -## round produces 192 bits of key material, or 1.5 round keys. -## Therefore, on each cycle we do 2 rounds and produce 3 round -## keys. -## -.align 4 -.Lschedule_192: - sub x0, x0, #8 - ld1 {v0.16b}, [x0] // vmovdqu 8(%rdi),%xmm0 # load key part 2 (very unaligned) - bl _vpaes_schedule_transform // input transform - mov v6.16b, v0.16b // vmovdqa %xmm0, %xmm6 # save short part - eor v4.16b, v4.16b, v4.16b // vpxor %xmm4, %xmm4, %xmm4 # clear 4 - ins v6.d[0], v4.d[0] // vmovhlps %xmm4, %xmm6, %xmm6 # clobber low side with zeros - mov x0, #4 // mov $4, %esi - -.Loop_schedule_192: - sub x0, x0, #1 // dec %esi - bl _vpaes_schedule_round - ext v0.16b, v6.16b, v0.16b, #8 // vpalignr $8,%xmm6,%xmm0,%xmm0 - bl _vpaes_schedule_mangle // save key n - bl _vpaes_schedule_192_smear - bl _vpaes_schedule_mangle // save key n+1 - bl _vpaes_schedule_round - cbz x0, .Lschedule_mangle_last - bl _vpaes_schedule_mangle // save key n+2 - bl _vpaes_schedule_192_smear - b .Loop_schedule_192 - -## -## .aes_schedule_256 -## -## 256-bit specific part of key schedule. -## -## The structure here is very similar to the 128-bit -## schedule, but with an additional "low side" in -## %xmm6. The low side's rounds are the same as the -## high side's, except no rcon and no rotation. -## -.align 4 -.Lschedule_256: - ld1 {v0.16b}, [x0] // vmovdqu 16(%rdi),%xmm0 # load key part 2 (unaligned) - bl _vpaes_schedule_transform // input transform - mov x0, #7 // mov $7, %esi - -.Loop_schedule_256: - sub x0, x0, #1 // dec %esi - bl _vpaes_schedule_mangle // output low result - mov v6.16b, v0.16b // vmovdqa %xmm0, %xmm6 # save cur_lo in xmm6 - - // high round - bl _vpaes_schedule_round - cbz x0, .Lschedule_mangle_last - bl _vpaes_schedule_mangle - - // low round. swap xmm7 and xmm6 - dup v0.4s, v0.s[3] // vpshufd $0xFF, %xmm0, %xmm0 - movi v4.16b, #0 - mov v5.16b, v7.16b // vmovdqa %xmm7, %xmm5 - mov v7.16b, v6.16b // vmovdqa %xmm6, %xmm7 - bl _vpaes_schedule_low_round - mov v7.16b, v5.16b // vmovdqa %xmm5, %xmm7 - - b .Loop_schedule_256 - -## -## .aes_schedule_mangle_last -## -## Mangler for last round of key schedule -## Mangles %xmm0 -## when encrypting, outputs out(%xmm0) ^ 63 -## when decrypting, outputs unskew(%xmm0) -## -## Always called right before return... jumps to cleanup and exits -## -.align 4 -.Lschedule_mangle_last: - // schedule last round key from xmm0 - adrp x11, .Lk_deskew // lea .Lk_deskew(%rip),%r11 # prepare to deskew - add x11, x11, :lo12:.Lk_deskew - - cbnz w3, .Lschedule_mangle_last_dec - - // encrypting - ld1 {v1.2d}, [x8] // vmovdqa (%r8,%r10),%xmm1 - adrp x11, .Lk_opt // lea .Lk_opt(%rip), %r11 # prepare to output transform - add x11, x11, :lo12:.Lk_opt - add x2, x2, #32 // add $32, %rdx - tbl v0.16b, {v0.16b}, v1.16b // vpshufb %xmm1, %xmm0, %xmm0 # output permute - -.Lschedule_mangle_last_dec: - ld1 {v20.2d,v21.2d}, [x11] // reload constants - sub x2, x2, #16 // add $-16, %rdx - eor v0.16b, v0.16b, v16.16b // vpxor .Lk_s63(%rip), %xmm0, %xmm0 - bl _vpaes_schedule_transform // output transform - st1 {v0.2d}, [x2] // vmovdqu %xmm0, (%rdx) # save last key - - // cleanup - eor v0.16b, v0.16b, v0.16b // vpxor %xmm0, %xmm0, %xmm0 - eor v1.16b, v1.16b, v1.16b // vpxor %xmm1, %xmm1, %xmm1 - eor v2.16b, v2.16b, v2.16b // vpxor %xmm2, %xmm2, %xmm2 - eor v3.16b, v3.16b, v3.16b // vpxor %xmm3, %xmm3, %xmm3 - eor v4.16b, v4.16b, v4.16b // vpxor %xmm4, %xmm4, %xmm4 - eor v5.16b, v5.16b, v5.16b // vpxor %xmm5, %xmm5, %xmm5 - eor v6.16b, v6.16b, v6.16b // vpxor %xmm6, %xmm6, %xmm6 - eor v7.16b, v7.16b, v7.16b // vpxor %xmm7, %xmm7, %xmm7 - ldp x29, x30, [sp],#16 - AARCH64_VALIDATE_LINK_REGISTER - ret -.size _vpaes_schedule_core,.-_vpaes_schedule_core - -## -## .aes_schedule_192_smear -## -## Smear the short, low side in the 192-bit key schedule. -## -## Inputs: -## %xmm7: high side, b a x y -## %xmm6: low side, d c 0 0 -## %xmm13: 0 -## -## Outputs: -## %xmm6: b+c+d b+c 0 0 -## %xmm0: b+c+d b+c b a -## -.type _vpaes_schedule_192_smear,%function -.align 4 -_vpaes_schedule_192_smear: - movi v1.16b, #0 - dup v0.4s, v7.s[3] - ins v1.s[3], v6.s[2] // vpshufd $0x80, %xmm6, %xmm1 # d c 0 0 -> c 0 0 0 - ins v0.s[0], v7.s[2] // vpshufd $0xFE, %xmm7, %xmm0 # b a _ _ -> b b b a - eor v6.16b, v6.16b, v1.16b // vpxor %xmm1, %xmm6, %xmm6 # -> c+d c 0 0 - eor v1.16b, v1.16b, v1.16b // vpxor %xmm1, %xmm1, %xmm1 - eor v6.16b, v6.16b, v0.16b // vpxor %xmm0, %xmm6, %xmm6 # -> b+c+d b+c b a - mov v0.16b, v6.16b // vmovdqa %xmm6, %xmm0 - ins v6.d[0], v1.d[0] // vmovhlps %xmm1, %xmm6, %xmm6 # clobber low side with zeros - ret -.size _vpaes_schedule_192_smear,.-_vpaes_schedule_192_smear - -## -## .aes_schedule_round -## -## Runs one main round of the key schedule on %xmm0, %xmm7 -## -## Specifically, runs subbytes on the high dword of %xmm0 -## then rotates it by one byte and xors into the low dword of -## %xmm7. -## -## Adds rcon from low byte of %xmm8, then rotates %xmm8 for -## next rcon. -## -## Smears the dwords of %xmm7 by xoring the low into the -## second low, result into third, result into highest. -## -## Returns results in %xmm7 = %xmm0. -## Clobbers %xmm1-%xmm4, %r11. -## -.type _vpaes_schedule_round,%function -.align 4 -_vpaes_schedule_round: - // extract rcon from xmm8 - movi v4.16b, #0 // vpxor %xmm4, %xmm4, %xmm4 - ext v1.16b, v8.16b, v4.16b, #15 // vpalignr $15, %xmm8, %xmm4, %xmm1 - ext v8.16b, v8.16b, v8.16b, #15 // vpalignr $15, %xmm8, %xmm8, %xmm8 - eor v7.16b, v7.16b, v1.16b // vpxor %xmm1, %xmm7, %xmm7 - - // rotate - dup v0.4s, v0.s[3] // vpshufd $0xFF, %xmm0, %xmm0 - ext v0.16b, v0.16b, v0.16b, #1 // vpalignr $1, %xmm0, %xmm0, %xmm0 - - // fall through... - - // low round: same as high round, but no rotation and no rcon. -_vpaes_schedule_low_round: - // smear xmm7 - ext v1.16b, v4.16b, v7.16b, #12 // vpslldq $4, %xmm7, %xmm1 - eor v7.16b, v7.16b, v1.16b // vpxor %xmm1, %xmm7, %xmm7 - ext v4.16b, v4.16b, v7.16b, #8 // vpslldq $8, %xmm7, %xmm4 - - // subbytes - and v1.16b, v0.16b, v17.16b // vpand %xmm9, %xmm0, %xmm1 # 0 = k - ushr v0.16b, v0.16b, #4 // vpsrlb $4, %xmm0, %xmm0 # 1 = i - eor v7.16b, v7.16b, v4.16b // vpxor %xmm4, %xmm7, %xmm7 - tbl v2.16b, {v19.16b}, v1.16b // vpshufb %xmm1, %xmm11, %xmm2 # 2 = a/k - eor v1.16b, v1.16b, v0.16b // vpxor %xmm0, %xmm1, %xmm1 # 0 = j - tbl v3.16b, {v18.16b}, v0.16b // vpshufb %xmm0, %xmm10, %xmm3 # 3 = 1/i - eor v3.16b, v3.16b, v2.16b // vpxor %xmm2, %xmm3, %xmm3 # 3 = iak = 1/i + a/k - tbl v4.16b, {v18.16b}, v1.16b // vpshufb %xmm1, %xmm10, %xmm4 # 4 = 1/j - eor v7.16b, v7.16b, v16.16b // vpxor .Lk_s63(%rip), %xmm7, %xmm7 - tbl v3.16b, {v18.16b}, v3.16b // vpshufb %xmm3, %xmm10, %xmm3 # 2 = 1/iak - eor v4.16b, v4.16b, v2.16b // vpxor %xmm2, %xmm4, %xmm4 # 4 = jak = 1/j + a/k - tbl v2.16b, {v18.16b}, v4.16b // vpshufb %xmm4, %xmm10, %xmm2 # 3 = 1/jak - eor v3.16b, v3.16b, v1.16b // vpxor %xmm1, %xmm3, %xmm3 # 2 = io - eor v2.16b, v2.16b, v0.16b // vpxor %xmm0, %xmm2, %xmm2 # 3 = jo - tbl v4.16b, {v23.16b}, v3.16b // vpshufb %xmm3, %xmm13, %xmm4 # 4 = sbou - tbl v1.16b, {v22.16b}, v2.16b // vpshufb %xmm2, %xmm12, %xmm1 # 0 = sb1t - eor v1.16b, v1.16b, v4.16b // vpxor %xmm4, %xmm1, %xmm1 # 0 = sbox output - - // add in smeared stuff - eor v0.16b, v1.16b, v7.16b // vpxor %xmm7, %xmm1, %xmm0 - eor v7.16b, v1.16b, v7.16b // vmovdqa %xmm0, %xmm7 - ret -.size _vpaes_schedule_round,.-_vpaes_schedule_round - -## -## .aes_schedule_transform -## -## Linear-transform %xmm0 according to tables at (%r11) -## -## Requires that %xmm9 = 0x0F0F... as in preheat -## Output in %xmm0 -## Clobbers %xmm1, %xmm2 -## -.type _vpaes_schedule_transform,%function -.align 4 -_vpaes_schedule_transform: - and v1.16b, v0.16b, v17.16b // vpand %xmm9, %xmm0, %xmm1 - ushr v0.16b, v0.16b, #4 // vpsrlb $4, %xmm0, %xmm0 - // vmovdqa (%r11), %xmm2 # lo - tbl v2.16b, {v20.16b}, v1.16b // vpshufb %xmm1, %xmm2, %xmm2 - // vmovdqa 16(%r11), %xmm1 # hi - tbl v0.16b, {v21.16b}, v0.16b // vpshufb %xmm0, %xmm1, %xmm0 - eor v0.16b, v0.16b, v2.16b // vpxor %xmm2, %xmm0, %xmm0 - ret -.size _vpaes_schedule_transform,.-_vpaes_schedule_transform - -## -## .aes_schedule_mangle -## -## Mangle xmm0 from (basis-transformed) standard version -## to our version. -## -## On encrypt, -## xor with 0x63 -## multiply by circulant 0,1,1,1 -## apply shiftrows transform -## -## On decrypt, -## xor with 0x63 -## multiply by "inverse mixcolumns" circulant E,B,D,9 -## deskew -## apply shiftrows transform -## -## -## Writes out to (%rdx), and increments or decrements it -## Keeps track of round number mod 4 in %r8 -## Preserves xmm0 -## Clobbers xmm1-xmm5 -## -.type _vpaes_schedule_mangle,%function -.align 4 -_vpaes_schedule_mangle: - mov v4.16b, v0.16b // vmovdqa %xmm0, %xmm4 # save xmm0 for later - // vmovdqa .Lk_mc_forward(%rip),%xmm5 - - // encrypting - eor v4.16b, v0.16b, v16.16b // vpxor .Lk_s63(%rip), %xmm0, %xmm4 - add x2, x2, #16 // add $16, %rdx - tbl v4.16b, {v4.16b}, v9.16b // vpshufb %xmm5, %xmm4, %xmm4 - tbl v1.16b, {v4.16b}, v9.16b // vpshufb %xmm5, %xmm4, %xmm1 - tbl v3.16b, {v1.16b}, v9.16b // vpshufb %xmm5, %xmm1, %xmm3 - eor v4.16b, v4.16b, v1.16b // vpxor %xmm1, %xmm4, %xmm4 - ld1 {v1.2d}, [x8] // vmovdqa (%r8,%r10), %xmm1 - eor v3.16b, v3.16b, v4.16b // vpxor %xmm4, %xmm3, %xmm3 - -.Lschedule_mangle_both: - tbl v3.16b, {v3.16b}, v1.16b // vpshufb %xmm1, %xmm3, %xmm3 - add x8, x8, #64-16 // add $-16, %r8 - and x8, x8, #~(1<<6) // and $0x30, %r8 - st1 {v3.2d}, [x2] // vmovdqu %xmm3, (%rdx) - ret -.size _vpaes_schedule_mangle,.-_vpaes_schedule_mangle - -.globl GFp_vpaes_set_encrypt_key -.hidden GFp_vpaes_set_encrypt_key -.type GFp_vpaes_set_encrypt_key,%function -.align 4 -GFp_vpaes_set_encrypt_key: - AARCH64_SIGN_LINK_REGISTER - stp x29,x30,[sp,#-16]! - add x29,sp,#0 - stp d8,d9,[sp,#-16]! // ABI spec says so - - lsr w9, w1, #5 // shr $5,%eax - add w9, w9, #5 // $5,%eax - str w9, [x2,#240] // mov %eax,240(%rdx) # AES_KEY->rounds = nbits/32+5; - - mov w3, #0 // mov $0,%ecx - mov x8, #0x30 // mov $0x30,%r8d - bl _vpaes_schedule_core - eor x0, x0, x0 - - ldp d8,d9,[sp],#16 - ldp x29,x30,[sp],#16 - AARCH64_VALIDATE_LINK_REGISTER - ret -.size GFp_vpaes_set_encrypt_key,.-GFp_vpaes_set_encrypt_key -.globl GFp_vpaes_ctr32_encrypt_blocks -.hidden GFp_vpaes_ctr32_encrypt_blocks -.type GFp_vpaes_ctr32_encrypt_blocks,%function -.align 4 -GFp_vpaes_ctr32_encrypt_blocks: - AARCH64_SIGN_LINK_REGISTER - stp x29,x30,[sp,#-16]! - add x29,sp,#0 - stp d8,d9,[sp,#-16]! // ABI spec says so - stp d10,d11,[sp,#-16]! - stp d12,d13,[sp,#-16]! - stp d14,d15,[sp,#-16]! - - cbz x2, .Lctr32_done - - // Note, unlike the other functions, x2 here is measured in blocks, - // not bytes. - mov x17, x2 - mov x2, x3 - - // Load the IV and counter portion. - ldr w6, [x4, #12] - ld1 {v7.16b}, [x4] - - bl _vpaes_encrypt_preheat - tst x17, #1 - rev w6, w6 // The counter is big-endian. - b.eq .Lctr32_prep_loop - - // Handle one block so the remaining block count is even for - // _vpaes_encrypt_2x. - ld1 {v6.16b}, [x0], #16 // .Load input ahead of time - bl _vpaes_encrypt_core - eor v0.16b, v0.16b, v6.16b // XOR input and result - st1 {v0.16b}, [x1], #16 - subs x17, x17, #1 - // Update the counter. - add w6, w6, #1 - rev w7, w6 - mov v7.s[3], w7 - b.ls .Lctr32_done - -.Lctr32_prep_loop: - // _vpaes_encrypt_core takes its input from v7, while _vpaes_encrypt_2x - // uses v14 and v15. - mov v15.16b, v7.16b - mov v14.16b, v7.16b - add w6, w6, #1 - rev w7, w6 - mov v15.s[3], w7 - -.Lctr32_loop: - ld1 {v6.16b,v7.16b}, [x0], #32 // .Load input ahead of time - bl _vpaes_encrypt_2x - eor v0.16b, v0.16b, v6.16b // XOR input and result - eor v1.16b, v1.16b, v7.16b // XOR input and result (#2) - st1 {v0.16b,v1.16b}, [x1], #32 - subs x17, x17, #2 - // Update the counter. - add w7, w6, #1 - add w6, w6, #2 - rev w7, w7 - mov v14.s[3], w7 - rev w7, w6 - mov v15.s[3], w7 - b.hi .Lctr32_loop - -.Lctr32_done: - ldp d14,d15,[sp],#16 - ldp d12,d13,[sp],#16 - ldp d10,d11,[sp],#16 - ldp d8,d9,[sp],#16 - ldp x29,x30,[sp],#16 - AARCH64_VALIDATE_LINK_REGISTER - ret -.size GFp_vpaes_ctr32_encrypt_blocks,.-GFp_vpaes_ctr32_encrypt_blocks -#endif -#endif // !OPENSSL_NO_ASM -.section .note.GNU-stack,"",%progbits diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/vpaes-x86_64-elf.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/vpaes-x86_64-elf.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/vpaes-x86_64-elf.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/vpaes-x86_64-elf.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,773 +0,0 @@ -# This file is generated from a similarly-named Perl script in the BoringSSL -# source tree. Do not edit by hand. - -#if defined(__has_feature) -#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) -#define OPENSSL_NO_ASM -#endif -#endif - -#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) -.text - - - - - - - - - - - - - - - - -.type _vpaes_encrypt_core,@function -.align 16 -_vpaes_encrypt_core: -.cfi_startproc - movq %rdx,%r9 - movq $16,%r11 - movl 240(%rdx),%eax - movdqa %xmm9,%xmm1 - movdqa .Lk_ipt(%rip),%xmm2 - pandn %xmm0,%xmm1 - movdqu (%r9),%xmm5 - psrld $4,%xmm1 - pand %xmm9,%xmm0 -.byte 102,15,56,0,208 - movdqa .Lk_ipt+16(%rip),%xmm0 -.byte 102,15,56,0,193 - pxor %xmm5,%xmm2 - addq $16,%r9 - pxor %xmm2,%xmm0 - leaq .Lk_mc_backward(%rip),%r10 - jmp .Lenc_entry - -.align 16 -.Lenc_loop: - - movdqa %xmm13,%xmm4 - movdqa %xmm12,%xmm0 -.byte 102,15,56,0,226 -.byte 102,15,56,0,195 - pxor %xmm5,%xmm4 - movdqa %xmm15,%xmm5 - pxor %xmm4,%xmm0 - movdqa -64(%r11,%r10,1),%xmm1 -.byte 102,15,56,0,234 - movdqa (%r11,%r10,1),%xmm4 - movdqa %xmm14,%xmm2 -.byte 102,15,56,0,211 - movdqa %xmm0,%xmm3 - pxor %xmm5,%xmm2 -.byte 102,15,56,0,193 - addq $16,%r9 - pxor %xmm2,%xmm0 -.byte 102,15,56,0,220 - addq $16,%r11 - pxor %xmm0,%xmm3 -.byte 102,15,56,0,193 - andq $0x30,%r11 - subq $1,%rax - pxor %xmm3,%xmm0 - -.Lenc_entry: - - movdqa %xmm9,%xmm1 - movdqa %xmm11,%xmm5 - pandn %xmm0,%xmm1 - psrld $4,%xmm1 - pand %xmm9,%xmm0 -.byte 102,15,56,0,232 - movdqa %xmm10,%xmm3 - pxor %xmm1,%xmm0 -.byte 102,15,56,0,217 - movdqa %xmm10,%xmm4 - pxor %xmm5,%xmm3 -.byte 102,15,56,0,224 - movdqa %xmm10,%xmm2 - pxor %xmm5,%xmm4 -.byte 102,15,56,0,211 - movdqa %xmm10,%xmm3 - pxor %xmm0,%xmm2 -.byte 102,15,56,0,220 - movdqu (%r9),%xmm5 - pxor %xmm1,%xmm3 - jnz .Lenc_loop - - - movdqa -96(%r10),%xmm4 - movdqa -80(%r10),%xmm0 -.byte 102,15,56,0,226 - pxor %xmm5,%xmm4 -.byte 102,15,56,0,195 - movdqa 64(%r11,%r10,1),%xmm1 - pxor %xmm4,%xmm0 -.byte 102,15,56,0,193 - .byte 0xf3,0xc3 -.cfi_endproc -.size _vpaes_encrypt_core,.-_vpaes_encrypt_core - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -.type _vpaes_encrypt_core_2x,@function -.align 16 -_vpaes_encrypt_core_2x: -.cfi_startproc - movq %rdx,%r9 - movq $16,%r11 - movl 240(%rdx),%eax - movdqa %xmm9,%xmm1 - movdqa %xmm9,%xmm7 - movdqa .Lk_ipt(%rip),%xmm2 - movdqa %xmm2,%xmm8 - pandn %xmm0,%xmm1 - pandn %xmm6,%xmm7 - movdqu (%r9),%xmm5 - - psrld $4,%xmm1 - psrld $4,%xmm7 - pand %xmm9,%xmm0 - pand %xmm9,%xmm6 -.byte 102,15,56,0,208 -.byte 102,68,15,56,0,198 - movdqa .Lk_ipt+16(%rip),%xmm0 - movdqa %xmm0,%xmm6 -.byte 102,15,56,0,193 -.byte 102,15,56,0,247 - pxor %xmm5,%xmm2 - pxor %xmm5,%xmm8 - addq $16,%r9 - pxor %xmm2,%xmm0 - pxor %xmm8,%xmm6 - leaq .Lk_mc_backward(%rip),%r10 - jmp .Lenc2x_entry - -.align 16 -.Lenc2x_loop: - - movdqa .Lk_sb1(%rip),%xmm4 - movdqa .Lk_sb1+16(%rip),%xmm0 - movdqa %xmm4,%xmm12 - movdqa %xmm0,%xmm6 -.byte 102,15,56,0,226 -.byte 102,69,15,56,0,224 -.byte 102,15,56,0,195 -.byte 102,65,15,56,0,243 - pxor %xmm5,%xmm4 - pxor %xmm5,%xmm12 - movdqa .Lk_sb2(%rip),%xmm5 - movdqa %xmm5,%xmm13 - pxor %xmm4,%xmm0 - pxor %xmm12,%xmm6 - movdqa -64(%r11,%r10,1),%xmm1 - -.byte 102,15,56,0,234 -.byte 102,69,15,56,0,232 - movdqa (%r11,%r10,1),%xmm4 - - movdqa .Lk_sb2+16(%rip),%xmm2 - movdqa %xmm2,%xmm8 -.byte 102,15,56,0,211 -.byte 102,69,15,56,0,195 - movdqa %xmm0,%xmm3 - movdqa %xmm6,%xmm11 - pxor %xmm5,%xmm2 - pxor %xmm13,%xmm8 -.byte 102,15,56,0,193 -.byte 102,15,56,0,241 - addq $16,%r9 - pxor %xmm2,%xmm0 - pxor %xmm8,%xmm6 -.byte 102,15,56,0,220 -.byte 102,68,15,56,0,220 - addq $16,%r11 - pxor %xmm0,%xmm3 - pxor %xmm6,%xmm11 -.byte 102,15,56,0,193 -.byte 102,15,56,0,241 - andq $0x30,%r11 - subq $1,%rax - pxor %xmm3,%xmm0 - pxor %xmm11,%xmm6 - -.Lenc2x_entry: - - movdqa %xmm9,%xmm1 - movdqa %xmm9,%xmm7 - movdqa .Lk_inv+16(%rip),%xmm5 - movdqa %xmm5,%xmm13 - pandn %xmm0,%xmm1 - pandn %xmm6,%xmm7 - psrld $4,%xmm1 - psrld $4,%xmm7 - pand %xmm9,%xmm0 - pand %xmm9,%xmm6 -.byte 102,15,56,0,232 -.byte 102,68,15,56,0,238 - movdqa %xmm10,%xmm3 - movdqa %xmm10,%xmm11 - pxor %xmm1,%xmm0 - pxor %xmm7,%xmm6 -.byte 102,15,56,0,217 -.byte 102,68,15,56,0,223 - movdqa %xmm10,%xmm4 - movdqa %xmm10,%xmm12 - pxor %xmm5,%xmm3 - pxor %xmm13,%xmm11 -.byte 102,15,56,0,224 -.byte 102,68,15,56,0,230 - movdqa %xmm10,%xmm2 - movdqa %xmm10,%xmm8 - pxor %xmm5,%xmm4 - pxor %xmm13,%xmm12 -.byte 102,15,56,0,211 -.byte 102,69,15,56,0,195 - movdqa %xmm10,%xmm3 - movdqa %xmm10,%xmm11 - pxor %xmm0,%xmm2 - pxor %xmm6,%xmm8 -.byte 102,15,56,0,220 -.byte 102,69,15,56,0,220 - movdqu (%r9),%xmm5 - - pxor %xmm1,%xmm3 - pxor %xmm7,%xmm11 - jnz .Lenc2x_loop - - - movdqa -96(%r10),%xmm4 - movdqa -80(%r10),%xmm0 - movdqa %xmm4,%xmm12 - movdqa %xmm0,%xmm6 -.byte 102,15,56,0,226 -.byte 102,69,15,56,0,224 - pxor %xmm5,%xmm4 - pxor %xmm5,%xmm12 -.byte 102,15,56,0,195 -.byte 102,65,15,56,0,243 - movdqa 64(%r11,%r10,1),%xmm1 - - pxor %xmm4,%xmm0 - pxor %xmm12,%xmm6 -.byte 102,15,56,0,193 -.byte 102,15,56,0,241 - .byte 0xf3,0xc3 -.cfi_endproc -.size _vpaes_encrypt_core_2x,.-_vpaes_encrypt_core_2x - - - - - - -.type _vpaes_schedule_core,@function -.align 16 -_vpaes_schedule_core: -.cfi_startproc - - - - - - call _vpaes_preheat - movdqa .Lk_rcon(%rip),%xmm8 - movdqu (%rdi),%xmm0 - - - movdqa %xmm0,%xmm3 - leaq .Lk_ipt(%rip),%r11 - call _vpaes_schedule_transform - movdqa %xmm0,%xmm7 - - leaq .Lk_sr(%rip),%r10 - - - movdqu %xmm0,(%rdx) - -.Lschedule_go: - cmpl $192,%esi - ja .Lschedule_256 - - - - - - - - - - - -.Lschedule_128: - movl $10,%esi - -.Loop_schedule_128: - call _vpaes_schedule_round - decq %rsi - jz .Lschedule_mangle_last - call _vpaes_schedule_mangle - jmp .Loop_schedule_128 - - - - - - - - - - - -.align 16 -.Lschedule_256: - movdqu 16(%rdi),%xmm0 - call _vpaes_schedule_transform - movl $7,%esi - -.Loop_schedule_256: - call _vpaes_schedule_mangle - movdqa %xmm0,%xmm6 - - - call _vpaes_schedule_round - decq %rsi - jz .Lschedule_mangle_last - call _vpaes_schedule_mangle - - - pshufd $0xFF,%xmm0,%xmm0 - movdqa %xmm7,%xmm5 - movdqa %xmm6,%xmm7 - call _vpaes_schedule_low_round - movdqa %xmm5,%xmm7 - - jmp .Loop_schedule_256 - - - - - - - - - - - - -.align 16 -.Lschedule_mangle_last: - - leaq .Lk_deskew(%rip),%r11 - - - movdqa (%r8,%r10,1),%xmm1 -.byte 102,15,56,0,193 - leaq .Lk_opt(%rip),%r11 - addq $32,%rdx - -.Lschedule_mangle_last_dec: - addq $-16,%rdx - pxor .Lk_s63(%rip),%xmm0 - call _vpaes_schedule_transform - movdqu %xmm0,(%rdx) - - - pxor %xmm0,%xmm0 - pxor %xmm1,%xmm1 - pxor %xmm2,%xmm2 - pxor %xmm3,%xmm3 - pxor %xmm4,%xmm4 - pxor %xmm5,%xmm5 - pxor %xmm6,%xmm6 - pxor %xmm7,%xmm7 - .byte 0xf3,0xc3 -.cfi_endproc -.size _vpaes_schedule_core,.-_vpaes_schedule_core - - - - - - - - - - - - - - - - - - - -.type _vpaes_schedule_round,@function -.align 16 -_vpaes_schedule_round: -.cfi_startproc - - pxor %xmm1,%xmm1 -.byte 102,65,15,58,15,200,15 -.byte 102,69,15,58,15,192,15 - pxor %xmm1,%xmm7 - - - pshufd $0xFF,%xmm0,%xmm0 -.byte 102,15,58,15,192,1 - - - - -_vpaes_schedule_low_round: - - movdqa %xmm7,%xmm1 - pslldq $4,%xmm7 - pxor %xmm1,%xmm7 - movdqa %xmm7,%xmm1 - pslldq $8,%xmm7 - pxor %xmm1,%xmm7 - pxor .Lk_s63(%rip),%xmm7 - - - movdqa %xmm9,%xmm1 - pandn %xmm0,%xmm1 - psrld $4,%xmm1 - pand %xmm9,%xmm0 - movdqa %xmm11,%xmm2 -.byte 102,15,56,0,208 - pxor %xmm1,%xmm0 - movdqa %xmm10,%xmm3 -.byte 102,15,56,0,217 - pxor %xmm2,%xmm3 - movdqa %xmm10,%xmm4 -.byte 102,15,56,0,224 - pxor %xmm2,%xmm4 - movdqa %xmm10,%xmm2 -.byte 102,15,56,0,211 - pxor %xmm0,%xmm2 - movdqa %xmm10,%xmm3 -.byte 102,15,56,0,220 - pxor %xmm1,%xmm3 - movdqa %xmm13,%xmm4 -.byte 102,15,56,0,226 - movdqa %xmm12,%xmm0 -.byte 102,15,56,0,195 - pxor %xmm4,%xmm0 - - - pxor %xmm7,%xmm0 - movdqa %xmm0,%xmm7 - .byte 0xf3,0xc3 -.cfi_endproc -.size _vpaes_schedule_round,.-_vpaes_schedule_round - - - - - - - - - - -.type _vpaes_schedule_transform,@function -.align 16 -_vpaes_schedule_transform: -.cfi_startproc - movdqa %xmm9,%xmm1 - pandn %xmm0,%xmm1 - psrld $4,%xmm1 - pand %xmm9,%xmm0 - movdqa (%r11),%xmm2 -.byte 102,15,56,0,208 - movdqa 16(%r11),%xmm0 -.byte 102,15,56,0,193 - pxor %xmm2,%xmm0 - .byte 0xf3,0xc3 -.cfi_endproc -.size _vpaes_schedule_transform,.-_vpaes_schedule_transform - - - - - - - - - - - - - - - - - - - - - - - - -.type _vpaes_schedule_mangle,@function -.align 16 -_vpaes_schedule_mangle: -.cfi_startproc - movdqa %xmm0,%xmm4 - movdqa .Lk_mc_forward(%rip),%xmm5 - - - addq $16,%rdx - pxor .Lk_s63(%rip),%xmm4 -.byte 102,15,56,0,229 - movdqa %xmm4,%xmm3 -.byte 102,15,56,0,229 - pxor %xmm4,%xmm3 -.byte 102,15,56,0,229 - pxor %xmm4,%xmm3 - -.Lschedule_mangle_both: - movdqa (%r8,%r10,1),%xmm1 -.byte 102,15,56,0,217 - addq $-16,%r8 - andq $0x30,%r8 - movdqu %xmm3,(%rdx) - .byte 0xf3,0xc3 -.cfi_endproc -.size _vpaes_schedule_mangle,.-_vpaes_schedule_mangle - - - - -.globl GFp_vpaes_set_encrypt_key -.hidden GFp_vpaes_set_encrypt_key -.type GFp_vpaes_set_encrypt_key,@function -.align 16 -GFp_vpaes_set_encrypt_key: -.cfi_startproc -#ifdef BORINGSSL_DISPATCH_TEST -.extern BORINGSSL_function_hit -.hidden BORINGSSL_function_hit - movb $1,BORINGSSL_function_hit+5(%rip) -#endif - - movl %esi,%eax - shrl $5,%eax - addl $5,%eax - movl %eax,240(%rdx) - - movl $0,%ecx - movl $0x30,%r8d - call _vpaes_schedule_core - xorl %eax,%eax - .byte 0xf3,0xc3 -.cfi_endproc -.size GFp_vpaes_set_encrypt_key,.-GFp_vpaes_set_encrypt_key - -.globl GFp_vpaes_encrypt -.hidden GFp_vpaes_encrypt -.type GFp_vpaes_encrypt,@function -.align 16 -GFp_vpaes_encrypt: -.cfi_startproc - movdqu (%rdi),%xmm0 - call _vpaes_preheat - call _vpaes_encrypt_core - movdqu %xmm0,(%rsi) - .byte 0xf3,0xc3 -.cfi_endproc -.size GFp_vpaes_encrypt,.-GFp_vpaes_encrypt -.globl GFp_vpaes_ctr32_encrypt_blocks -.hidden GFp_vpaes_ctr32_encrypt_blocks -.type GFp_vpaes_ctr32_encrypt_blocks,@function -.align 16 -GFp_vpaes_ctr32_encrypt_blocks: -.cfi_startproc - - xchgq %rcx,%rdx - testq %rcx,%rcx - jz .Lctr32_abort - movdqu (%r8),%xmm0 - movdqa .Lctr_add_one(%rip),%xmm8 - subq %rdi,%rsi - call _vpaes_preheat - movdqa %xmm0,%xmm6 - pshufb .Lrev_ctr(%rip),%xmm6 - - testq $1,%rcx - jz .Lctr32_prep_loop - - - - movdqu (%rdi),%xmm7 - call _vpaes_encrypt_core - pxor %xmm7,%xmm0 - paddd %xmm8,%xmm6 - movdqu %xmm0,(%rsi,%rdi,1) - subq $1,%rcx - leaq 16(%rdi),%rdi - jz .Lctr32_done - -.Lctr32_prep_loop: - - - movdqa %xmm6,%xmm14 - movdqa %xmm6,%xmm15 - paddd %xmm8,%xmm15 - -.Lctr32_loop: - movdqa .Lrev_ctr(%rip),%xmm1 - movdqa %xmm14,%xmm0 - movdqa %xmm15,%xmm6 -.byte 102,15,56,0,193 -.byte 102,15,56,0,241 - call _vpaes_encrypt_core_2x - movdqu (%rdi),%xmm1 - movdqu 16(%rdi),%xmm2 - movdqa .Lctr_add_two(%rip),%xmm3 - pxor %xmm1,%xmm0 - pxor %xmm2,%xmm6 - paddd %xmm3,%xmm14 - paddd %xmm3,%xmm15 - movdqu %xmm0,(%rsi,%rdi,1) - movdqu %xmm6,16(%rsi,%rdi,1) - subq $2,%rcx - leaq 32(%rdi),%rdi - jnz .Lctr32_loop - -.Lctr32_done: -.Lctr32_abort: - .byte 0xf3,0xc3 -.cfi_endproc -.size GFp_vpaes_ctr32_encrypt_blocks,.-GFp_vpaes_ctr32_encrypt_blocks - - - - - - -.type _vpaes_preheat,@function -.align 16 -_vpaes_preheat: -.cfi_startproc - leaq .Lk_s0F(%rip),%r10 - movdqa -32(%r10),%xmm10 - movdqa -16(%r10),%xmm11 - movdqa 0(%r10),%xmm9 - movdqa 48(%r10),%xmm13 - movdqa 64(%r10),%xmm12 - movdqa 80(%r10),%xmm15 - movdqa 96(%r10),%xmm14 - .byte 0xf3,0xc3 -.cfi_endproc -.size _vpaes_preheat,.-_vpaes_preheat - - - - - -.type _vpaes_consts,@object -.align 64 -_vpaes_consts: -.Lk_inv: -.quad 0x0E05060F0D080180, 0x040703090A0B0C02 -.quad 0x01040A060F0B0780, 0x030D0E0C02050809 - -.Lk_s0F: -.quad 0x0F0F0F0F0F0F0F0F, 0x0F0F0F0F0F0F0F0F - -.Lk_ipt: -.quad 0xC2B2E8985A2A7000, 0xCABAE09052227808 -.quad 0x4C01307D317C4D00, 0xCD80B1FCB0FDCC81 - -.Lk_sb1: -.quad 0xB19BE18FCB503E00, 0xA5DF7A6E142AF544 -.quad 0x3618D415FAE22300, 0x3BF7CCC10D2ED9EF -.Lk_sb2: -.quad 0xE27A93C60B712400, 0x5EB7E955BC982FCD -.quad 0x69EB88400AE12900, 0xC2A163C8AB82234A -.Lk_sbo: -.quad 0xD0D26D176FBDC700, 0x15AABF7AC502A878 -.quad 0xCFE474A55FBB6A00, 0x8E1E90D1412B35FA - -.Lk_mc_forward: -.quad 0x0407060500030201, 0x0C0F0E0D080B0A09 -.quad 0x080B0A0904070605, 0x000302010C0F0E0D -.quad 0x0C0F0E0D080B0A09, 0x0407060500030201 -.quad 0x000302010C0F0E0D, 0x080B0A0904070605 - -.Lk_mc_backward: -.quad 0x0605040702010003, 0x0E0D0C0F0A09080B -.quad 0x020100030E0D0C0F, 0x0A09080B06050407 -.quad 0x0E0D0C0F0A09080B, 0x0605040702010003 -.quad 0x0A09080B06050407, 0x020100030E0D0C0F - -.Lk_sr: -.quad 0x0706050403020100, 0x0F0E0D0C0B0A0908 -.quad 0x030E09040F0A0500, 0x0B06010C07020D08 -.quad 0x0F060D040B020900, 0x070E050C030A0108 -.quad 0x0B0E0104070A0D00, 0x0306090C0F020508 - -.Lk_rcon: -.quad 0x1F8391B9AF9DEEB6, 0x702A98084D7C7D81 - -.Lk_s63: -.quad 0x5B5B5B5B5B5B5B5B, 0x5B5B5B5B5B5B5B5B - -.Lk_opt: -.quad 0xFF9F4929D6B66000, 0xF7974121DEBE6808 -.quad 0x01EDBD5150BCEC00, 0xE10D5DB1B05C0CE0 - -.Lk_deskew: -.quad 0x07E4A34047A4E300, 0x1DFEB95A5DBEF91A -.quad 0x5F36B5DC83EA6900, 0x2841C2ABF49D1E77 - - -.Lrev_ctr: -.quad 0x0706050403020100, 0x0c0d0e0f0b0a0908 - - -.Lctr_add_one: -.quad 0x0000000000000000, 0x0000000100000000 -.Lctr_add_two: -.quad 0x0000000000000000, 0x0000000200000000 - -.byte 86,101,99,116,111,114,32,80,101,114,109,117,116,97,116,105,111,110,32,65,69,83,32,102,111,114,32,120,56,54,95,54,52,47,83,83,83,69,51,44,32,77,105,107,101,32,72,97,109,98,117,114,103,32,40,83,116,97,110,102,111,114,100,32,85,110,105,118,101,114,115,105,116,121,41,0 -.align 64 -.size _vpaes_consts,.-_vpaes_consts -#endif -.section .note.GNU-stack,"",@progbits diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/vpaes-x86_64-macosx.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/vpaes-x86_64-macosx.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/vpaes-x86_64-macosx.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/vpaes-x86_64-macosx.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,771 +0,0 @@ -# This file is generated from a similarly-named Perl script in the BoringSSL -# source tree. Do not edit by hand. - -#if defined(__has_feature) -#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) -#define OPENSSL_NO_ASM -#endif -#endif - -#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) -.text - - - - - - - - - - - - - - - - - -.p2align 4 -_vpaes_encrypt_core: - - movq %rdx,%r9 - movq $16,%r11 - movl 240(%rdx),%eax - movdqa %xmm9,%xmm1 - movdqa L$k_ipt(%rip),%xmm2 - pandn %xmm0,%xmm1 - movdqu (%r9),%xmm5 - psrld $4,%xmm1 - pand %xmm9,%xmm0 -.byte 102,15,56,0,208 - movdqa L$k_ipt+16(%rip),%xmm0 -.byte 102,15,56,0,193 - pxor %xmm5,%xmm2 - addq $16,%r9 - pxor %xmm2,%xmm0 - leaq L$k_mc_backward(%rip),%r10 - jmp L$enc_entry - -.p2align 4 -L$enc_loop: - - movdqa %xmm13,%xmm4 - movdqa %xmm12,%xmm0 -.byte 102,15,56,0,226 -.byte 102,15,56,0,195 - pxor %xmm5,%xmm4 - movdqa %xmm15,%xmm5 - pxor %xmm4,%xmm0 - movdqa -64(%r11,%r10,1),%xmm1 -.byte 102,15,56,0,234 - movdqa (%r11,%r10,1),%xmm4 - movdqa %xmm14,%xmm2 -.byte 102,15,56,0,211 - movdqa %xmm0,%xmm3 - pxor %xmm5,%xmm2 -.byte 102,15,56,0,193 - addq $16,%r9 - pxor %xmm2,%xmm0 -.byte 102,15,56,0,220 - addq $16,%r11 - pxor %xmm0,%xmm3 -.byte 102,15,56,0,193 - andq $0x30,%r11 - subq $1,%rax - pxor %xmm3,%xmm0 - -L$enc_entry: - - movdqa %xmm9,%xmm1 - movdqa %xmm11,%xmm5 - pandn %xmm0,%xmm1 - psrld $4,%xmm1 - pand %xmm9,%xmm0 -.byte 102,15,56,0,232 - movdqa %xmm10,%xmm3 - pxor %xmm1,%xmm0 -.byte 102,15,56,0,217 - movdqa %xmm10,%xmm4 - pxor %xmm5,%xmm3 -.byte 102,15,56,0,224 - movdqa %xmm10,%xmm2 - pxor %xmm5,%xmm4 -.byte 102,15,56,0,211 - movdqa %xmm10,%xmm3 - pxor %xmm0,%xmm2 -.byte 102,15,56,0,220 - movdqu (%r9),%xmm5 - pxor %xmm1,%xmm3 - jnz L$enc_loop - - - movdqa -96(%r10),%xmm4 - movdqa -80(%r10),%xmm0 -.byte 102,15,56,0,226 - pxor %xmm5,%xmm4 -.byte 102,15,56,0,195 - movdqa 64(%r11,%r10,1),%xmm1 - pxor %xmm4,%xmm0 -.byte 102,15,56,0,193 - .byte 0xf3,0xc3 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -.p2align 4 -_vpaes_encrypt_core_2x: - - movq %rdx,%r9 - movq $16,%r11 - movl 240(%rdx),%eax - movdqa %xmm9,%xmm1 - movdqa %xmm9,%xmm7 - movdqa L$k_ipt(%rip),%xmm2 - movdqa %xmm2,%xmm8 - pandn %xmm0,%xmm1 - pandn %xmm6,%xmm7 - movdqu (%r9),%xmm5 - - psrld $4,%xmm1 - psrld $4,%xmm7 - pand %xmm9,%xmm0 - pand %xmm9,%xmm6 -.byte 102,15,56,0,208 -.byte 102,68,15,56,0,198 - movdqa L$k_ipt+16(%rip),%xmm0 - movdqa %xmm0,%xmm6 -.byte 102,15,56,0,193 -.byte 102,15,56,0,247 - pxor %xmm5,%xmm2 - pxor %xmm5,%xmm8 - addq $16,%r9 - pxor %xmm2,%xmm0 - pxor %xmm8,%xmm6 - leaq L$k_mc_backward(%rip),%r10 - jmp L$enc2x_entry - -.p2align 4 -L$enc2x_loop: - - movdqa L$k_sb1(%rip),%xmm4 - movdqa L$k_sb1+16(%rip),%xmm0 - movdqa %xmm4,%xmm12 - movdqa %xmm0,%xmm6 -.byte 102,15,56,0,226 -.byte 102,69,15,56,0,224 -.byte 102,15,56,0,195 -.byte 102,65,15,56,0,243 - pxor %xmm5,%xmm4 - pxor %xmm5,%xmm12 - movdqa L$k_sb2(%rip),%xmm5 - movdqa %xmm5,%xmm13 - pxor %xmm4,%xmm0 - pxor %xmm12,%xmm6 - movdqa -64(%r11,%r10,1),%xmm1 - -.byte 102,15,56,0,234 -.byte 102,69,15,56,0,232 - movdqa (%r11,%r10,1),%xmm4 - - movdqa L$k_sb2+16(%rip),%xmm2 - movdqa %xmm2,%xmm8 -.byte 102,15,56,0,211 -.byte 102,69,15,56,0,195 - movdqa %xmm0,%xmm3 - movdqa %xmm6,%xmm11 - pxor %xmm5,%xmm2 - pxor %xmm13,%xmm8 -.byte 102,15,56,0,193 -.byte 102,15,56,0,241 - addq $16,%r9 - pxor %xmm2,%xmm0 - pxor %xmm8,%xmm6 -.byte 102,15,56,0,220 -.byte 102,68,15,56,0,220 - addq $16,%r11 - pxor %xmm0,%xmm3 - pxor %xmm6,%xmm11 -.byte 102,15,56,0,193 -.byte 102,15,56,0,241 - andq $0x30,%r11 - subq $1,%rax - pxor %xmm3,%xmm0 - pxor %xmm11,%xmm6 - -L$enc2x_entry: - - movdqa %xmm9,%xmm1 - movdqa %xmm9,%xmm7 - movdqa L$k_inv+16(%rip),%xmm5 - movdqa %xmm5,%xmm13 - pandn %xmm0,%xmm1 - pandn %xmm6,%xmm7 - psrld $4,%xmm1 - psrld $4,%xmm7 - pand %xmm9,%xmm0 - pand %xmm9,%xmm6 -.byte 102,15,56,0,232 -.byte 102,68,15,56,0,238 - movdqa %xmm10,%xmm3 - movdqa %xmm10,%xmm11 - pxor %xmm1,%xmm0 - pxor %xmm7,%xmm6 -.byte 102,15,56,0,217 -.byte 102,68,15,56,0,223 - movdqa %xmm10,%xmm4 - movdqa %xmm10,%xmm12 - pxor %xmm5,%xmm3 - pxor %xmm13,%xmm11 -.byte 102,15,56,0,224 -.byte 102,68,15,56,0,230 - movdqa %xmm10,%xmm2 - movdqa %xmm10,%xmm8 - pxor %xmm5,%xmm4 - pxor %xmm13,%xmm12 -.byte 102,15,56,0,211 -.byte 102,69,15,56,0,195 - movdqa %xmm10,%xmm3 - movdqa %xmm10,%xmm11 - pxor %xmm0,%xmm2 - pxor %xmm6,%xmm8 -.byte 102,15,56,0,220 -.byte 102,69,15,56,0,220 - movdqu (%r9),%xmm5 - - pxor %xmm1,%xmm3 - pxor %xmm7,%xmm11 - jnz L$enc2x_loop - - - movdqa -96(%r10),%xmm4 - movdqa -80(%r10),%xmm0 - movdqa %xmm4,%xmm12 - movdqa %xmm0,%xmm6 -.byte 102,15,56,0,226 -.byte 102,69,15,56,0,224 - pxor %xmm5,%xmm4 - pxor %xmm5,%xmm12 -.byte 102,15,56,0,195 -.byte 102,65,15,56,0,243 - movdqa 64(%r11,%r10,1),%xmm1 - - pxor %xmm4,%xmm0 - pxor %xmm12,%xmm6 -.byte 102,15,56,0,193 -.byte 102,15,56,0,241 - .byte 0xf3,0xc3 - - - - - - - - - -.p2align 4 -_vpaes_schedule_core: - - - - - - - call _vpaes_preheat - movdqa L$k_rcon(%rip),%xmm8 - movdqu (%rdi),%xmm0 - - - movdqa %xmm0,%xmm3 - leaq L$k_ipt(%rip),%r11 - call _vpaes_schedule_transform - movdqa %xmm0,%xmm7 - - leaq L$k_sr(%rip),%r10 - - - movdqu %xmm0,(%rdx) - -L$schedule_go: - cmpl $192,%esi - ja L$schedule_256 - - - - - - - - - - - -L$schedule_128: - movl $10,%esi - -L$oop_schedule_128: - call _vpaes_schedule_round - decq %rsi - jz L$schedule_mangle_last - call _vpaes_schedule_mangle - jmp L$oop_schedule_128 - - - - - - - - - - - -.p2align 4 -L$schedule_256: - movdqu 16(%rdi),%xmm0 - call _vpaes_schedule_transform - movl $7,%esi - -L$oop_schedule_256: - call _vpaes_schedule_mangle - movdqa %xmm0,%xmm6 - - - call _vpaes_schedule_round - decq %rsi - jz L$schedule_mangle_last - call _vpaes_schedule_mangle - - - pshufd $0xFF,%xmm0,%xmm0 - movdqa %xmm7,%xmm5 - movdqa %xmm6,%xmm7 - call _vpaes_schedule_low_round - movdqa %xmm5,%xmm7 - - jmp L$oop_schedule_256 - - - - - - - - - - - - -.p2align 4 -L$schedule_mangle_last: - - leaq L$k_deskew(%rip),%r11 - - - movdqa (%r8,%r10,1),%xmm1 -.byte 102,15,56,0,193 - leaq L$k_opt(%rip),%r11 - addq $32,%rdx - -L$schedule_mangle_last_dec: - addq $-16,%rdx - pxor L$k_s63(%rip),%xmm0 - call _vpaes_schedule_transform - movdqu %xmm0,(%rdx) - - - pxor %xmm0,%xmm0 - pxor %xmm1,%xmm1 - pxor %xmm2,%xmm2 - pxor %xmm3,%xmm3 - pxor %xmm4,%xmm4 - pxor %xmm5,%xmm5 - pxor %xmm6,%xmm6 - pxor %xmm7,%xmm7 - .byte 0xf3,0xc3 - - - - - - - - - - - - - - - - - - - - - - -.p2align 4 -_vpaes_schedule_round: - - - pxor %xmm1,%xmm1 -.byte 102,65,15,58,15,200,15 -.byte 102,69,15,58,15,192,15 - pxor %xmm1,%xmm7 - - - pshufd $0xFF,%xmm0,%xmm0 -.byte 102,15,58,15,192,1 - - - - -_vpaes_schedule_low_round: - - movdqa %xmm7,%xmm1 - pslldq $4,%xmm7 - pxor %xmm1,%xmm7 - movdqa %xmm7,%xmm1 - pslldq $8,%xmm7 - pxor %xmm1,%xmm7 - pxor L$k_s63(%rip),%xmm7 - - - movdqa %xmm9,%xmm1 - pandn %xmm0,%xmm1 - psrld $4,%xmm1 - pand %xmm9,%xmm0 - movdqa %xmm11,%xmm2 -.byte 102,15,56,0,208 - pxor %xmm1,%xmm0 - movdqa %xmm10,%xmm3 -.byte 102,15,56,0,217 - pxor %xmm2,%xmm3 - movdqa %xmm10,%xmm4 -.byte 102,15,56,0,224 - pxor %xmm2,%xmm4 - movdqa %xmm10,%xmm2 -.byte 102,15,56,0,211 - pxor %xmm0,%xmm2 - movdqa %xmm10,%xmm3 -.byte 102,15,56,0,220 - pxor %xmm1,%xmm3 - movdqa %xmm13,%xmm4 -.byte 102,15,56,0,226 - movdqa %xmm12,%xmm0 -.byte 102,15,56,0,195 - pxor %xmm4,%xmm0 - - - pxor %xmm7,%xmm0 - movdqa %xmm0,%xmm7 - .byte 0xf3,0xc3 - - - - - - - - - - - - - -.p2align 4 -_vpaes_schedule_transform: - - movdqa %xmm9,%xmm1 - pandn %xmm0,%xmm1 - psrld $4,%xmm1 - pand %xmm9,%xmm0 - movdqa (%r11),%xmm2 -.byte 102,15,56,0,208 - movdqa 16(%r11),%xmm0 -.byte 102,15,56,0,193 - pxor %xmm2,%xmm0 - .byte 0xf3,0xc3 - - - - - - - - - - - - - - - - - - - - - - - - - - - -.p2align 4 -_vpaes_schedule_mangle: - - movdqa %xmm0,%xmm4 - movdqa L$k_mc_forward(%rip),%xmm5 - - - addq $16,%rdx - pxor L$k_s63(%rip),%xmm4 -.byte 102,15,56,0,229 - movdqa %xmm4,%xmm3 -.byte 102,15,56,0,229 - pxor %xmm4,%xmm3 -.byte 102,15,56,0,229 - pxor %xmm4,%xmm3 - -L$schedule_mangle_both: - movdqa (%r8,%r10,1),%xmm1 -.byte 102,15,56,0,217 - addq $-16,%r8 - andq $0x30,%r8 - movdqu %xmm3,(%rdx) - .byte 0xf3,0xc3 - - - - - - -.globl _GFp_vpaes_set_encrypt_key -.private_extern _GFp_vpaes_set_encrypt_key - -.p2align 4 -_GFp_vpaes_set_encrypt_key: - -#ifdef BORINGSSL_DISPATCH_TEST - - movb $1,_BORINGSSL_function_hit+5(%rip) -#endif - - movl %esi,%eax - shrl $5,%eax - addl $5,%eax - movl %eax,240(%rdx) - - movl $0,%ecx - movl $0x30,%r8d - call _vpaes_schedule_core - xorl %eax,%eax - .byte 0xf3,0xc3 - - - -.globl _GFp_vpaes_encrypt -.private_extern _GFp_vpaes_encrypt - -.p2align 4 -_GFp_vpaes_encrypt: - - movdqu (%rdi),%xmm0 - call _vpaes_preheat - call _vpaes_encrypt_core - movdqu %xmm0,(%rsi) - .byte 0xf3,0xc3 - - -.globl _GFp_vpaes_ctr32_encrypt_blocks -.private_extern _GFp_vpaes_ctr32_encrypt_blocks - -.p2align 4 -_GFp_vpaes_ctr32_encrypt_blocks: - - - xchgq %rcx,%rdx - testq %rcx,%rcx - jz L$ctr32_abort - movdqu (%r8),%xmm0 - movdqa L$ctr_add_one(%rip),%xmm8 - subq %rdi,%rsi - call _vpaes_preheat - movdqa %xmm0,%xmm6 - pshufb L$rev_ctr(%rip),%xmm6 - - testq $1,%rcx - jz L$ctr32_prep_loop - - - - movdqu (%rdi),%xmm7 - call _vpaes_encrypt_core - pxor %xmm7,%xmm0 - paddd %xmm8,%xmm6 - movdqu %xmm0,(%rsi,%rdi,1) - subq $1,%rcx - leaq 16(%rdi),%rdi - jz L$ctr32_done - -L$ctr32_prep_loop: - - - movdqa %xmm6,%xmm14 - movdqa %xmm6,%xmm15 - paddd %xmm8,%xmm15 - -L$ctr32_loop: - movdqa L$rev_ctr(%rip),%xmm1 - movdqa %xmm14,%xmm0 - movdqa %xmm15,%xmm6 -.byte 102,15,56,0,193 -.byte 102,15,56,0,241 - call _vpaes_encrypt_core_2x - movdqu (%rdi),%xmm1 - movdqu 16(%rdi),%xmm2 - movdqa L$ctr_add_two(%rip),%xmm3 - pxor %xmm1,%xmm0 - pxor %xmm2,%xmm6 - paddd %xmm3,%xmm14 - paddd %xmm3,%xmm15 - movdqu %xmm0,(%rsi,%rdi,1) - movdqu %xmm6,16(%rsi,%rdi,1) - subq $2,%rcx - leaq 32(%rdi),%rdi - jnz L$ctr32_loop - -L$ctr32_done: -L$ctr32_abort: - .byte 0xf3,0xc3 - - - - - - - - - -.p2align 4 -_vpaes_preheat: - - leaq L$k_s0F(%rip),%r10 - movdqa -32(%r10),%xmm10 - movdqa -16(%r10),%xmm11 - movdqa 0(%r10),%xmm9 - movdqa 48(%r10),%xmm13 - movdqa 64(%r10),%xmm12 - movdqa 80(%r10),%xmm15 - movdqa 96(%r10),%xmm14 - .byte 0xf3,0xc3 - - - - - - - - -.p2align 6 -_vpaes_consts: -L$k_inv: -.quad 0x0E05060F0D080180, 0x040703090A0B0C02 -.quad 0x01040A060F0B0780, 0x030D0E0C02050809 - -L$k_s0F: -.quad 0x0F0F0F0F0F0F0F0F, 0x0F0F0F0F0F0F0F0F - -L$k_ipt: -.quad 0xC2B2E8985A2A7000, 0xCABAE09052227808 -.quad 0x4C01307D317C4D00, 0xCD80B1FCB0FDCC81 - -L$k_sb1: -.quad 0xB19BE18FCB503E00, 0xA5DF7A6E142AF544 -.quad 0x3618D415FAE22300, 0x3BF7CCC10D2ED9EF -L$k_sb2: -.quad 0xE27A93C60B712400, 0x5EB7E955BC982FCD -.quad 0x69EB88400AE12900, 0xC2A163C8AB82234A -L$k_sbo: -.quad 0xD0D26D176FBDC700, 0x15AABF7AC502A878 -.quad 0xCFE474A55FBB6A00, 0x8E1E90D1412B35FA - -L$k_mc_forward: -.quad 0x0407060500030201, 0x0C0F0E0D080B0A09 -.quad 0x080B0A0904070605, 0x000302010C0F0E0D -.quad 0x0C0F0E0D080B0A09, 0x0407060500030201 -.quad 0x000302010C0F0E0D, 0x080B0A0904070605 - -L$k_mc_backward: -.quad 0x0605040702010003, 0x0E0D0C0F0A09080B -.quad 0x020100030E0D0C0F, 0x0A09080B06050407 -.quad 0x0E0D0C0F0A09080B, 0x0605040702010003 -.quad 0x0A09080B06050407, 0x020100030E0D0C0F - -L$k_sr: -.quad 0x0706050403020100, 0x0F0E0D0C0B0A0908 -.quad 0x030E09040F0A0500, 0x0B06010C07020D08 -.quad 0x0F060D040B020900, 0x070E050C030A0108 -.quad 0x0B0E0104070A0D00, 0x0306090C0F020508 - -L$k_rcon: -.quad 0x1F8391B9AF9DEEB6, 0x702A98084D7C7D81 - -L$k_s63: -.quad 0x5B5B5B5B5B5B5B5B, 0x5B5B5B5B5B5B5B5B - -L$k_opt: -.quad 0xFF9F4929D6B66000, 0xF7974121DEBE6808 -.quad 0x01EDBD5150BCEC00, 0xE10D5DB1B05C0CE0 - -L$k_deskew: -.quad 0x07E4A34047A4E300, 0x1DFEB95A5DBEF91A -.quad 0x5F36B5DC83EA6900, 0x2841C2ABF49D1E77 - - -L$rev_ctr: -.quad 0x0706050403020100, 0x0c0d0e0f0b0a0908 - - -L$ctr_add_one: -.quad 0x0000000000000000, 0x0000000100000000 -L$ctr_add_two: -.quad 0x0000000000000000, 0x0000000200000000 - -.byte 86,101,99,116,111,114,32,80,101,114,109,117,116,97,116,105,111,110,32,65,69,83,32,102,111,114,32,120,56,54,95,54,52,47,83,83,83,69,51,44,32,77,105,107,101,32,72,97,109,98,117,114,103,32,40,83,116,97,110,102,111,114,100,32,85,110,105,118,101,114,115,105,116,121,41,0 -.p2align 6 - -#endif Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/vpaes-x86_64-nasm.obj and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/vpaes-x86_64-nasm.obj differ diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/vpaes-x86-elf.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/vpaes-x86-elf.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/vpaes-x86-elf.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/vpaes-x86-elf.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,398 +0,0 @@ -# This file is generated from a similarly-named Perl script in the BoringSSL -# source tree. Do not edit by hand. - -#if defined(__i386__) -#if defined(BORINGSSL_PREFIX) -#include -#endif -.text -.align 64 -.L_vpaes_consts: -.long 218628480,235210255,168496130,67568393 -.long 252381056,17041926,33884169,51187212 -.long 252645135,252645135,252645135,252645135 -.long 1512730624,3266504856,1377990664,3401244816 -.long 830229760,1275146365,2969422977,3447763452 -.long 3411033600,2979783055,338359620,2782886510 -.long 4209124096,907596821,221174255,1006095553 -.long 191964160,3799684038,3164090317,1589111125 -.long 182528256,1777043520,2877432650,3265356744 -.long 1874708224,3503451415,3305285752,363511674 -.long 1606117888,3487855781,1093350906,2384367825 -.long 197121,67569157,134941193,202313229 -.long 67569157,134941193,202313229,197121 -.long 134941193,202313229,197121,67569157 -.long 202313229,197121,67569157,134941193 -.long 33619971,100992007,168364043,235736079 -.long 235736079,33619971,100992007,168364043 -.long 168364043,235736079,33619971,100992007 -.long 100992007,168364043,235736079,33619971 -.long 50462976,117835012,185207048,252579084 -.long 252314880,51251460,117574920,184942860 -.long 184682752,252054788,50987272,118359308 -.long 118099200,185467140,251790600,50727180 -.long 2946363062,528716217,1300004225,1881839624 -.long 1532713819,1532713819,1532713819,1532713819 -.long 3602276352,4288629033,3737020424,4153884961 -.long 1354558464,32357713,2958822624,3775749553 -.long 1201988352,132424512,1572796698,503232858 -.long 2213177600,1597421020,4103937655,675398315 -.byte 86,101,99,116,111,114,32,80,101,114,109,117,116,97,116,105 -.byte 111,110,32,65,69,83,32,102,111,114,32,120,56,54,47,83 -.byte 83,83,69,51,44,32,77,105,107,101,32,72,97,109,98,117 -.byte 114,103,32,40,83,116,97,110,102,111,114,100,32,85,110,105 -.byte 118,101,114,115,105,116,121,41,0 -.align 64 -.hidden _vpaes_preheat -.type _vpaes_preheat,@function -.align 16 -_vpaes_preheat: - addl (%esp),%ebp - movdqa -48(%ebp),%xmm7 - movdqa -16(%ebp),%xmm6 - ret -.size _vpaes_preheat,.-_vpaes_preheat -.hidden _vpaes_encrypt_core -.type _vpaes_encrypt_core,@function -.align 16 -_vpaes_encrypt_core: - movl $16,%ecx - movl 240(%edx),%eax - movdqa %xmm6,%xmm1 - movdqa (%ebp),%xmm2 - pandn %xmm0,%xmm1 - pand %xmm6,%xmm0 - movdqu (%edx),%xmm5 -.byte 102,15,56,0,208 - movdqa 16(%ebp),%xmm0 - pxor %xmm5,%xmm2 - psrld $4,%xmm1 - addl $16,%edx -.byte 102,15,56,0,193 - leal 192(%ebp),%ebx - pxor %xmm2,%xmm0 - jmp .L000enc_entry -.align 16 -.L001enc_loop: - movdqa 32(%ebp),%xmm4 - movdqa 48(%ebp),%xmm0 -.byte 102,15,56,0,226 -.byte 102,15,56,0,195 - pxor %xmm5,%xmm4 - movdqa 64(%ebp),%xmm5 - pxor %xmm4,%xmm0 - movdqa -64(%ebx,%ecx,1),%xmm1 -.byte 102,15,56,0,234 - movdqa 80(%ebp),%xmm2 - movdqa (%ebx,%ecx,1),%xmm4 -.byte 102,15,56,0,211 - movdqa %xmm0,%xmm3 - pxor %xmm5,%xmm2 -.byte 102,15,56,0,193 - addl $16,%edx - pxor %xmm2,%xmm0 -.byte 102,15,56,0,220 - addl $16,%ecx - pxor %xmm0,%xmm3 -.byte 102,15,56,0,193 - andl $48,%ecx - subl $1,%eax - pxor %xmm3,%xmm0 -.L000enc_entry: - movdqa %xmm6,%xmm1 - movdqa -32(%ebp),%xmm5 - pandn %xmm0,%xmm1 - psrld $4,%xmm1 - pand %xmm6,%xmm0 -.byte 102,15,56,0,232 - movdqa %xmm7,%xmm3 - pxor %xmm1,%xmm0 -.byte 102,15,56,0,217 - movdqa %xmm7,%xmm4 - pxor %xmm5,%xmm3 -.byte 102,15,56,0,224 - movdqa %xmm7,%xmm2 - pxor %xmm5,%xmm4 -.byte 102,15,56,0,211 - movdqa %xmm7,%xmm3 - pxor %xmm0,%xmm2 -.byte 102,15,56,0,220 - movdqu (%edx),%xmm5 - pxor %xmm1,%xmm3 - jnz .L001enc_loop - movdqa 96(%ebp),%xmm4 - movdqa 112(%ebp),%xmm0 -.byte 102,15,56,0,226 - pxor %xmm5,%xmm4 -.byte 102,15,56,0,195 - movdqa 64(%ebx,%ecx,1),%xmm1 - pxor %xmm4,%xmm0 -.byte 102,15,56,0,193 - ret -.size _vpaes_encrypt_core,.-_vpaes_encrypt_core -.hidden _vpaes_schedule_core -.type _vpaes_schedule_core,@function -.align 16 -_vpaes_schedule_core: - addl (%esp),%ebp - movdqu (%esi),%xmm0 - movdqa 320(%ebp),%xmm2 - movdqa %xmm0,%xmm3 - leal (%ebp),%ebx - movdqa %xmm2,4(%esp) - call _vpaes_schedule_transform - movdqa %xmm0,%xmm7 - testl %edi,%edi - jnz .L002schedule_am_decrypting - movdqu %xmm0,(%edx) - jmp .L003schedule_go -.L002schedule_am_decrypting: - movdqa 256(%ebp,%ecx,1),%xmm1 -.byte 102,15,56,0,217 - movdqu %xmm3,(%edx) - xorl $48,%ecx -.L003schedule_go: - cmpl $192,%eax - ja .L004schedule_256 -.L005schedule_128: - movl $10,%eax -.L006loop_schedule_128: - call _vpaes_schedule_round - decl %eax - jz .L007schedule_mangle_last - call _vpaes_schedule_mangle - jmp .L006loop_schedule_128 -.align 16 -.L004schedule_256: - movdqu 16(%esi),%xmm0 - call _vpaes_schedule_transform - movl $7,%eax -.L008loop_schedule_256: - call _vpaes_schedule_mangle - movdqa %xmm0,%xmm6 - call _vpaes_schedule_round - decl %eax - jz .L007schedule_mangle_last - call _vpaes_schedule_mangle - pshufd $255,%xmm0,%xmm0 - movdqa %xmm7,20(%esp) - movdqa %xmm6,%xmm7 - call .L_vpaes_schedule_low_round - movdqa 20(%esp),%xmm7 - jmp .L008loop_schedule_256 -.align 16 -.L007schedule_mangle_last: - leal 384(%ebp),%ebx - testl %edi,%edi - jnz .L009schedule_mangle_last_dec - movdqa 256(%ebp,%ecx,1),%xmm1 -.byte 102,15,56,0,193 - leal 352(%ebp),%ebx - addl $32,%edx -.L009schedule_mangle_last_dec: - addl $-16,%edx - pxor 336(%ebp),%xmm0 - call _vpaes_schedule_transform - movdqu %xmm0,(%edx) - pxor %xmm0,%xmm0 - pxor %xmm1,%xmm1 - pxor %xmm2,%xmm2 - pxor %xmm3,%xmm3 - pxor %xmm4,%xmm4 - pxor %xmm5,%xmm5 - pxor %xmm6,%xmm6 - pxor %xmm7,%xmm7 - ret -.size _vpaes_schedule_core,.-_vpaes_schedule_core -.hidden _vpaes_schedule_round -.type _vpaes_schedule_round,@function -.align 16 -_vpaes_schedule_round: - movdqa 8(%esp),%xmm2 - pxor %xmm1,%xmm1 -.byte 102,15,58,15,202,15 -.byte 102,15,58,15,210,15 - pxor %xmm1,%xmm7 - pshufd $255,%xmm0,%xmm0 -.byte 102,15,58,15,192,1 - movdqa %xmm2,8(%esp) -.L_vpaes_schedule_low_round: - movdqa %xmm7,%xmm1 - pslldq $4,%xmm7 - pxor %xmm1,%xmm7 - movdqa %xmm7,%xmm1 - pslldq $8,%xmm7 - pxor %xmm1,%xmm7 - pxor 336(%ebp),%xmm7 - movdqa -16(%ebp),%xmm4 - movdqa -48(%ebp),%xmm5 - movdqa %xmm4,%xmm1 - pandn %xmm0,%xmm1 - psrld $4,%xmm1 - pand %xmm4,%xmm0 - movdqa -32(%ebp),%xmm2 -.byte 102,15,56,0,208 - pxor %xmm1,%xmm0 - movdqa %xmm5,%xmm3 -.byte 102,15,56,0,217 - pxor %xmm2,%xmm3 - movdqa %xmm5,%xmm4 -.byte 102,15,56,0,224 - pxor %xmm2,%xmm4 - movdqa %xmm5,%xmm2 -.byte 102,15,56,0,211 - pxor %xmm0,%xmm2 - movdqa %xmm5,%xmm3 -.byte 102,15,56,0,220 - pxor %xmm1,%xmm3 - movdqa 32(%ebp),%xmm4 -.byte 102,15,56,0,226 - movdqa 48(%ebp),%xmm0 -.byte 102,15,56,0,195 - pxor %xmm4,%xmm0 - pxor %xmm7,%xmm0 - movdqa %xmm0,%xmm7 - ret -.size _vpaes_schedule_round,.-_vpaes_schedule_round -.hidden _vpaes_schedule_transform -.type _vpaes_schedule_transform,@function -.align 16 -_vpaes_schedule_transform: - movdqa -16(%ebp),%xmm2 - movdqa %xmm2,%xmm1 - pandn %xmm0,%xmm1 - psrld $4,%xmm1 - pand %xmm2,%xmm0 - movdqa (%ebx),%xmm2 -.byte 102,15,56,0,208 - movdqa 16(%ebx),%xmm0 -.byte 102,15,56,0,193 - pxor %xmm2,%xmm0 - ret -.size _vpaes_schedule_transform,.-_vpaes_schedule_transform -.hidden _vpaes_schedule_mangle -.type _vpaes_schedule_mangle,@function -.align 16 -_vpaes_schedule_mangle: - movdqa %xmm0,%xmm4 - movdqa 128(%ebp),%xmm5 - testl %edi,%edi - jnz .L010schedule_mangle_dec - addl $16,%edx - pxor 336(%ebp),%xmm4 -.byte 102,15,56,0,229 - movdqa %xmm4,%xmm3 -.byte 102,15,56,0,229 - pxor %xmm4,%xmm3 -.byte 102,15,56,0,229 - pxor %xmm4,%xmm3 - jmp .L011schedule_mangle_both -.align 16 -.L010schedule_mangle_dec: - movdqa -16(%ebp),%xmm2 - leal (%ebp),%esi - movdqa %xmm2,%xmm1 - pandn %xmm4,%xmm1 - psrld $4,%xmm1 - pand %xmm2,%xmm4 - movdqa (%esi),%xmm2 -.byte 102,15,56,0,212 - movdqa 16(%esi),%xmm3 -.byte 102,15,56,0,217 - pxor %xmm2,%xmm3 -.byte 102,15,56,0,221 - movdqa 32(%esi),%xmm2 -.byte 102,15,56,0,212 - pxor %xmm3,%xmm2 - movdqa 48(%esi),%xmm3 -.byte 102,15,56,0,217 - pxor %xmm2,%xmm3 -.byte 102,15,56,0,221 - movdqa 64(%esi),%xmm2 -.byte 102,15,56,0,212 - pxor %xmm3,%xmm2 - movdqa 80(%esi),%xmm3 -.byte 102,15,56,0,217 - pxor %xmm2,%xmm3 -.byte 102,15,56,0,221 - movdqa 96(%esi),%xmm2 -.byte 102,15,56,0,212 - pxor %xmm3,%xmm2 - movdqa 112(%esi),%xmm3 -.byte 102,15,56,0,217 - pxor %xmm2,%xmm3 - addl $-16,%edx -.L011schedule_mangle_both: - movdqa 256(%ebp,%ecx,1),%xmm1 -.byte 102,15,56,0,217 - addl $-16,%ecx - andl $48,%ecx - movdqu %xmm3,(%edx) - ret -.size _vpaes_schedule_mangle,.-_vpaes_schedule_mangle -.globl GFp_vpaes_set_encrypt_key -.hidden GFp_vpaes_set_encrypt_key -.type GFp_vpaes_set_encrypt_key,@function -.align 16 -GFp_vpaes_set_encrypt_key: -.L_GFp_vpaes_set_encrypt_key_begin: - pushl %ebp - pushl %ebx - pushl %esi - pushl %edi - movl 20(%esp),%esi - leal -56(%esp),%ebx - movl 24(%esp),%eax - andl $-16,%ebx - movl 28(%esp),%edx - xchgl %esp,%ebx - movl %ebx,48(%esp) - movl %eax,%ebx - shrl $5,%ebx - addl $5,%ebx - movl %ebx,240(%edx) - movl $48,%ecx - movl $0,%edi - leal .L_vpaes_consts+0x30-.L012pic_point,%ebp - call _vpaes_schedule_core -.L012pic_point: - movl 48(%esp),%esp - xorl %eax,%eax - popl %edi - popl %esi - popl %ebx - popl %ebp - ret -.size GFp_vpaes_set_encrypt_key,.-.L_GFp_vpaes_set_encrypt_key_begin -.globl GFp_vpaes_encrypt -.hidden GFp_vpaes_encrypt -.type GFp_vpaes_encrypt,@function -.align 16 -GFp_vpaes_encrypt: -.L_GFp_vpaes_encrypt_begin: - pushl %ebp - pushl %ebx - pushl %esi - pushl %edi - leal .L_vpaes_consts+0x30-.L013pic_point,%ebp - call _vpaes_preheat -.L013pic_point: - movl 20(%esp),%esi - leal -56(%esp),%ebx - movl 24(%esp),%edi - andl $-16,%ebx - movl 28(%esp),%edx - xchgl %esp,%ebx - movl %ebx,48(%esp) - movdqu (%esi),%xmm0 - call _vpaes_encrypt_core - movdqu %xmm0,(%edi) - movl 48(%esp),%esp - popl %edi - popl %esi - popl %ebx - popl %ebp - ret -.size GFp_vpaes_encrypt,.-.L_GFp_vpaes_encrypt_begin -#endif -.section .note.GNU-stack,"",@progbits diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/vpaes-x86-macosx.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/vpaes-x86-macosx.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/vpaes-x86-macosx.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/vpaes-x86-macosx.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,381 +0,0 @@ -# This file is generated from a similarly-named Perl script in the BoringSSL -# source tree. Do not edit by hand. - -#if defined(__i386__) -#if defined(BORINGSSL_PREFIX) -#include -#endif -.text -.align 6,0x90 -L_vpaes_consts: -.long 218628480,235210255,168496130,67568393 -.long 252381056,17041926,33884169,51187212 -.long 252645135,252645135,252645135,252645135 -.long 1512730624,3266504856,1377990664,3401244816 -.long 830229760,1275146365,2969422977,3447763452 -.long 3411033600,2979783055,338359620,2782886510 -.long 4209124096,907596821,221174255,1006095553 -.long 191964160,3799684038,3164090317,1589111125 -.long 182528256,1777043520,2877432650,3265356744 -.long 1874708224,3503451415,3305285752,363511674 -.long 1606117888,3487855781,1093350906,2384367825 -.long 197121,67569157,134941193,202313229 -.long 67569157,134941193,202313229,197121 -.long 134941193,202313229,197121,67569157 -.long 202313229,197121,67569157,134941193 -.long 33619971,100992007,168364043,235736079 -.long 235736079,33619971,100992007,168364043 -.long 168364043,235736079,33619971,100992007 -.long 100992007,168364043,235736079,33619971 -.long 50462976,117835012,185207048,252579084 -.long 252314880,51251460,117574920,184942860 -.long 184682752,252054788,50987272,118359308 -.long 118099200,185467140,251790600,50727180 -.long 2946363062,528716217,1300004225,1881839624 -.long 1532713819,1532713819,1532713819,1532713819 -.long 3602276352,4288629033,3737020424,4153884961 -.long 1354558464,32357713,2958822624,3775749553 -.long 1201988352,132424512,1572796698,503232858 -.long 2213177600,1597421020,4103937655,675398315 -.byte 86,101,99,116,111,114,32,80,101,114,109,117,116,97,116,105 -.byte 111,110,32,65,69,83,32,102,111,114,32,120,56,54,47,83 -.byte 83,83,69,51,44,32,77,105,107,101,32,72,97,109,98,117 -.byte 114,103,32,40,83,116,97,110,102,111,114,100,32,85,110,105 -.byte 118,101,114,115,105,116,121,41,0 -.align 6,0x90 -.private_extern __vpaes_preheat -.align 4 -__vpaes_preheat: - addl (%esp),%ebp - movdqa -48(%ebp),%xmm7 - movdqa -16(%ebp),%xmm6 - ret -.private_extern __vpaes_encrypt_core -.align 4 -__vpaes_encrypt_core: - movl $16,%ecx - movl 240(%edx),%eax - movdqa %xmm6,%xmm1 - movdqa (%ebp),%xmm2 - pandn %xmm0,%xmm1 - pand %xmm6,%xmm0 - movdqu (%edx),%xmm5 -.byte 102,15,56,0,208 - movdqa 16(%ebp),%xmm0 - pxor %xmm5,%xmm2 - psrld $4,%xmm1 - addl $16,%edx -.byte 102,15,56,0,193 - leal 192(%ebp),%ebx - pxor %xmm2,%xmm0 - jmp L000enc_entry -.align 4,0x90 -L001enc_loop: - movdqa 32(%ebp),%xmm4 - movdqa 48(%ebp),%xmm0 -.byte 102,15,56,0,226 -.byte 102,15,56,0,195 - pxor %xmm5,%xmm4 - movdqa 64(%ebp),%xmm5 - pxor %xmm4,%xmm0 - movdqa -64(%ebx,%ecx,1),%xmm1 -.byte 102,15,56,0,234 - movdqa 80(%ebp),%xmm2 - movdqa (%ebx,%ecx,1),%xmm4 -.byte 102,15,56,0,211 - movdqa %xmm0,%xmm3 - pxor %xmm5,%xmm2 -.byte 102,15,56,0,193 - addl $16,%edx - pxor %xmm2,%xmm0 -.byte 102,15,56,0,220 - addl $16,%ecx - pxor %xmm0,%xmm3 -.byte 102,15,56,0,193 - andl $48,%ecx - subl $1,%eax - pxor %xmm3,%xmm0 -L000enc_entry: - movdqa %xmm6,%xmm1 - movdqa -32(%ebp),%xmm5 - pandn %xmm0,%xmm1 - psrld $4,%xmm1 - pand %xmm6,%xmm0 -.byte 102,15,56,0,232 - movdqa %xmm7,%xmm3 - pxor %xmm1,%xmm0 -.byte 102,15,56,0,217 - movdqa %xmm7,%xmm4 - pxor %xmm5,%xmm3 -.byte 102,15,56,0,224 - movdqa %xmm7,%xmm2 - pxor %xmm5,%xmm4 -.byte 102,15,56,0,211 - movdqa %xmm7,%xmm3 - pxor %xmm0,%xmm2 -.byte 102,15,56,0,220 - movdqu (%edx),%xmm5 - pxor %xmm1,%xmm3 - jnz L001enc_loop - movdqa 96(%ebp),%xmm4 - movdqa 112(%ebp),%xmm0 -.byte 102,15,56,0,226 - pxor %xmm5,%xmm4 -.byte 102,15,56,0,195 - movdqa 64(%ebx,%ecx,1),%xmm1 - pxor %xmm4,%xmm0 -.byte 102,15,56,0,193 - ret -.private_extern __vpaes_schedule_core -.align 4 -__vpaes_schedule_core: - addl (%esp),%ebp - movdqu (%esi),%xmm0 - movdqa 320(%ebp),%xmm2 - movdqa %xmm0,%xmm3 - leal (%ebp),%ebx - movdqa %xmm2,4(%esp) - call __vpaes_schedule_transform - movdqa %xmm0,%xmm7 - testl %edi,%edi - jnz L002schedule_am_decrypting - movdqu %xmm0,(%edx) - jmp L003schedule_go -L002schedule_am_decrypting: - movdqa 256(%ebp,%ecx,1),%xmm1 -.byte 102,15,56,0,217 - movdqu %xmm3,(%edx) - xorl $48,%ecx -L003schedule_go: - cmpl $192,%eax - ja L004schedule_256 -L005schedule_128: - movl $10,%eax -L006loop_schedule_128: - call __vpaes_schedule_round - decl %eax - jz L007schedule_mangle_last - call __vpaes_schedule_mangle - jmp L006loop_schedule_128 -.align 4,0x90 -L004schedule_256: - movdqu 16(%esi),%xmm0 - call __vpaes_schedule_transform - movl $7,%eax -L008loop_schedule_256: - call __vpaes_schedule_mangle - movdqa %xmm0,%xmm6 - call __vpaes_schedule_round - decl %eax - jz L007schedule_mangle_last - call __vpaes_schedule_mangle - pshufd $255,%xmm0,%xmm0 - movdqa %xmm7,20(%esp) - movdqa %xmm6,%xmm7 - call L_vpaes_schedule_low_round - movdqa 20(%esp),%xmm7 - jmp L008loop_schedule_256 -.align 4,0x90 -L007schedule_mangle_last: - leal 384(%ebp),%ebx - testl %edi,%edi - jnz L009schedule_mangle_last_dec - movdqa 256(%ebp,%ecx,1),%xmm1 -.byte 102,15,56,0,193 - leal 352(%ebp),%ebx - addl $32,%edx -L009schedule_mangle_last_dec: - addl $-16,%edx - pxor 336(%ebp),%xmm0 - call __vpaes_schedule_transform - movdqu %xmm0,(%edx) - pxor %xmm0,%xmm0 - pxor %xmm1,%xmm1 - pxor %xmm2,%xmm2 - pxor %xmm3,%xmm3 - pxor %xmm4,%xmm4 - pxor %xmm5,%xmm5 - pxor %xmm6,%xmm6 - pxor %xmm7,%xmm7 - ret -.private_extern __vpaes_schedule_round -.align 4 -__vpaes_schedule_round: - movdqa 8(%esp),%xmm2 - pxor %xmm1,%xmm1 -.byte 102,15,58,15,202,15 -.byte 102,15,58,15,210,15 - pxor %xmm1,%xmm7 - pshufd $255,%xmm0,%xmm0 -.byte 102,15,58,15,192,1 - movdqa %xmm2,8(%esp) -L_vpaes_schedule_low_round: - movdqa %xmm7,%xmm1 - pslldq $4,%xmm7 - pxor %xmm1,%xmm7 - movdqa %xmm7,%xmm1 - pslldq $8,%xmm7 - pxor %xmm1,%xmm7 - pxor 336(%ebp),%xmm7 - movdqa -16(%ebp),%xmm4 - movdqa -48(%ebp),%xmm5 - movdqa %xmm4,%xmm1 - pandn %xmm0,%xmm1 - psrld $4,%xmm1 - pand %xmm4,%xmm0 - movdqa -32(%ebp),%xmm2 -.byte 102,15,56,0,208 - pxor %xmm1,%xmm0 - movdqa %xmm5,%xmm3 -.byte 102,15,56,0,217 - pxor %xmm2,%xmm3 - movdqa %xmm5,%xmm4 -.byte 102,15,56,0,224 - pxor %xmm2,%xmm4 - movdqa %xmm5,%xmm2 -.byte 102,15,56,0,211 - pxor %xmm0,%xmm2 - movdqa %xmm5,%xmm3 -.byte 102,15,56,0,220 - pxor %xmm1,%xmm3 - movdqa 32(%ebp),%xmm4 -.byte 102,15,56,0,226 - movdqa 48(%ebp),%xmm0 -.byte 102,15,56,0,195 - pxor %xmm4,%xmm0 - pxor %xmm7,%xmm0 - movdqa %xmm0,%xmm7 - ret -.private_extern __vpaes_schedule_transform -.align 4 -__vpaes_schedule_transform: - movdqa -16(%ebp),%xmm2 - movdqa %xmm2,%xmm1 - pandn %xmm0,%xmm1 - psrld $4,%xmm1 - pand %xmm2,%xmm0 - movdqa (%ebx),%xmm2 -.byte 102,15,56,0,208 - movdqa 16(%ebx),%xmm0 -.byte 102,15,56,0,193 - pxor %xmm2,%xmm0 - ret -.private_extern __vpaes_schedule_mangle -.align 4 -__vpaes_schedule_mangle: - movdqa %xmm0,%xmm4 - movdqa 128(%ebp),%xmm5 - testl %edi,%edi - jnz L010schedule_mangle_dec - addl $16,%edx - pxor 336(%ebp),%xmm4 -.byte 102,15,56,0,229 - movdqa %xmm4,%xmm3 -.byte 102,15,56,0,229 - pxor %xmm4,%xmm3 -.byte 102,15,56,0,229 - pxor %xmm4,%xmm3 - jmp L011schedule_mangle_both -.align 4,0x90 -L010schedule_mangle_dec: - movdqa -16(%ebp),%xmm2 - leal (%ebp),%esi - movdqa %xmm2,%xmm1 - pandn %xmm4,%xmm1 - psrld $4,%xmm1 - pand %xmm2,%xmm4 - movdqa (%esi),%xmm2 -.byte 102,15,56,0,212 - movdqa 16(%esi),%xmm3 -.byte 102,15,56,0,217 - pxor %xmm2,%xmm3 -.byte 102,15,56,0,221 - movdqa 32(%esi),%xmm2 -.byte 102,15,56,0,212 - pxor %xmm3,%xmm2 - movdqa 48(%esi),%xmm3 -.byte 102,15,56,0,217 - pxor %xmm2,%xmm3 -.byte 102,15,56,0,221 - movdqa 64(%esi),%xmm2 -.byte 102,15,56,0,212 - pxor %xmm3,%xmm2 - movdqa 80(%esi),%xmm3 -.byte 102,15,56,0,217 - pxor %xmm2,%xmm3 -.byte 102,15,56,0,221 - movdqa 96(%esi),%xmm2 -.byte 102,15,56,0,212 - pxor %xmm3,%xmm2 - movdqa 112(%esi),%xmm3 -.byte 102,15,56,0,217 - pxor %xmm2,%xmm3 - addl $-16,%edx -L011schedule_mangle_both: - movdqa 256(%ebp,%ecx,1),%xmm1 -.byte 102,15,56,0,217 - addl $-16,%ecx - andl $48,%ecx - movdqu %xmm3,(%edx) - ret -.globl _GFp_vpaes_set_encrypt_key -.private_extern _GFp_vpaes_set_encrypt_key -.align 4 -_GFp_vpaes_set_encrypt_key: -L_GFp_vpaes_set_encrypt_key_begin: - pushl %ebp - pushl %ebx - pushl %esi - pushl %edi - movl 20(%esp),%esi - leal -56(%esp),%ebx - movl 24(%esp),%eax - andl $-16,%ebx - movl 28(%esp),%edx - xchgl %esp,%ebx - movl %ebx,48(%esp) - movl %eax,%ebx - shrl $5,%ebx - addl $5,%ebx - movl %ebx,240(%edx) - movl $48,%ecx - movl $0,%edi - leal L_vpaes_consts+0x30-L012pic_point,%ebp - call __vpaes_schedule_core -L012pic_point: - movl 48(%esp),%esp - xorl %eax,%eax - popl %edi - popl %esi - popl %ebx - popl %ebp - ret -.globl _GFp_vpaes_encrypt -.private_extern _GFp_vpaes_encrypt -.align 4 -_GFp_vpaes_encrypt: -L_GFp_vpaes_encrypt_begin: - pushl %ebp - pushl %ebx - pushl %esi - pushl %edi - leal L_vpaes_consts+0x30-L013pic_point,%ebp - call __vpaes_preheat -L013pic_point: - movl 20(%esp),%esi - leal -56(%esp),%ebx - movl 24(%esp),%edi - andl $-16,%ebx - movl 28(%esp),%edx - xchgl %esp,%ebx - movl %ebx,48(%esp) - movdqu (%esi),%xmm0 - call __vpaes_encrypt_core - movdqu %xmm0,(%edi) - movl 48(%esp),%esp - popl %edi - popl %esi - popl %ebx - popl %ebp - ret -#endif Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/vpaes-x86-win32n.obj and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/vpaes-x86-win32n.obj differ diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/x86_64-mont5-elf.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/x86_64-mont5-elf.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/x86_64-mont5-elf.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/x86_64-mont5-elf.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,3786 +0,0 @@ -# This file is generated from a similarly-named Perl script in the BoringSSL -# source tree. Do not edit by hand. - -#if defined(__has_feature) -#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) -#define OPENSSL_NO_ASM -#endif -#endif - -#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) -.text - -.extern GFp_ia32cap_P -.hidden GFp_ia32cap_P - -.globl GFp_bn_mul_mont_gather5 -.hidden GFp_bn_mul_mont_gather5 -.type GFp_bn_mul_mont_gather5,@function -.align 64 -GFp_bn_mul_mont_gather5: -.cfi_startproc - movl %r9d,%r9d - movq %rsp,%rax -.cfi_def_cfa_register %rax - testl $7,%r9d - jnz .Lmul_enter - leaq GFp_ia32cap_P(%rip),%r11 - movl 8(%r11),%r11d - jmp .Lmul4x_enter - -.align 16 -.Lmul_enter: - movd 8(%rsp),%xmm5 - pushq %rbx -.cfi_offset %rbx,-16 - pushq %rbp -.cfi_offset %rbp,-24 - pushq %r12 -.cfi_offset %r12,-32 - pushq %r13 -.cfi_offset %r13,-40 - pushq %r14 -.cfi_offset %r14,-48 - pushq %r15 -.cfi_offset %r15,-56 - - negq %r9 - movq %rsp,%r11 - leaq -280(%rsp,%r9,8),%r10 - negq %r9 - andq $-1024,%r10 - - - - - - - - - - subq %r10,%r11 - andq $-4096,%r11 - leaq (%r10,%r11,1),%rsp - movq (%rsp),%r11 - cmpq %r10,%rsp - ja .Lmul_page_walk - jmp .Lmul_page_walk_done - -.Lmul_page_walk: - leaq -4096(%rsp),%rsp - movq (%rsp),%r11 - cmpq %r10,%rsp - ja .Lmul_page_walk -.Lmul_page_walk_done: - - leaq .Linc(%rip),%r10 - movq %rax,8(%rsp,%r9,8) -.cfi_escape 0x0f,0x0a,0x77,0x08,0x79,0x00,0x38,0x1e,0x22,0x06,0x23,0x08 -.Lmul_body: - - leaq 128(%rdx),%r12 - movdqa 0(%r10),%xmm0 - movdqa 16(%r10),%xmm1 - leaq 24-112(%rsp,%r9,8),%r10 - andq $-16,%r10 - - pshufd $0,%xmm5,%xmm5 - movdqa %xmm1,%xmm4 - movdqa %xmm1,%xmm2 - paddd %xmm0,%xmm1 - pcmpeqd %xmm5,%xmm0 -.byte 0x67 - movdqa %xmm4,%xmm3 - paddd %xmm1,%xmm2 - pcmpeqd %xmm5,%xmm1 - movdqa %xmm0,112(%r10) - movdqa %xmm4,%xmm0 - - paddd %xmm2,%xmm3 - pcmpeqd %xmm5,%xmm2 - movdqa %xmm1,128(%r10) - movdqa %xmm4,%xmm1 - - paddd %xmm3,%xmm0 - pcmpeqd %xmm5,%xmm3 - movdqa %xmm2,144(%r10) - movdqa %xmm4,%xmm2 - - paddd %xmm0,%xmm1 - pcmpeqd %xmm5,%xmm0 - movdqa %xmm3,160(%r10) - movdqa %xmm4,%xmm3 - paddd %xmm1,%xmm2 - pcmpeqd %xmm5,%xmm1 - movdqa %xmm0,176(%r10) - movdqa %xmm4,%xmm0 - - paddd %xmm2,%xmm3 - pcmpeqd %xmm5,%xmm2 - movdqa %xmm1,192(%r10) - movdqa %xmm4,%xmm1 - - paddd %xmm3,%xmm0 - pcmpeqd %xmm5,%xmm3 - movdqa %xmm2,208(%r10) - movdqa %xmm4,%xmm2 - - paddd %xmm0,%xmm1 - pcmpeqd %xmm5,%xmm0 - movdqa %xmm3,224(%r10) - movdqa %xmm4,%xmm3 - paddd %xmm1,%xmm2 - pcmpeqd %xmm5,%xmm1 - movdqa %xmm0,240(%r10) - movdqa %xmm4,%xmm0 - - paddd %xmm2,%xmm3 - pcmpeqd %xmm5,%xmm2 - movdqa %xmm1,256(%r10) - movdqa %xmm4,%xmm1 - - paddd %xmm3,%xmm0 - pcmpeqd %xmm5,%xmm3 - movdqa %xmm2,272(%r10) - movdqa %xmm4,%xmm2 - - paddd %xmm0,%xmm1 - pcmpeqd %xmm5,%xmm0 - movdqa %xmm3,288(%r10) - movdqa %xmm4,%xmm3 - paddd %xmm1,%xmm2 - pcmpeqd %xmm5,%xmm1 - movdqa %xmm0,304(%r10) - - paddd %xmm2,%xmm3 -.byte 0x67 - pcmpeqd %xmm5,%xmm2 - movdqa %xmm1,320(%r10) - - pcmpeqd %xmm5,%xmm3 - movdqa %xmm2,336(%r10) - pand 64(%r12),%xmm0 - - pand 80(%r12),%xmm1 - pand 96(%r12),%xmm2 - movdqa %xmm3,352(%r10) - pand 112(%r12),%xmm3 - por %xmm2,%xmm0 - por %xmm3,%xmm1 - movdqa -128(%r12),%xmm4 - movdqa -112(%r12),%xmm5 - movdqa -96(%r12),%xmm2 - pand 112(%r10),%xmm4 - movdqa -80(%r12),%xmm3 - pand 128(%r10),%xmm5 - por %xmm4,%xmm0 - pand 144(%r10),%xmm2 - por %xmm5,%xmm1 - pand 160(%r10),%xmm3 - por %xmm2,%xmm0 - por %xmm3,%xmm1 - movdqa -64(%r12),%xmm4 - movdqa -48(%r12),%xmm5 - movdqa -32(%r12),%xmm2 - pand 176(%r10),%xmm4 - movdqa -16(%r12),%xmm3 - pand 192(%r10),%xmm5 - por %xmm4,%xmm0 - pand 208(%r10),%xmm2 - por %xmm5,%xmm1 - pand 224(%r10),%xmm3 - por %xmm2,%xmm0 - por %xmm3,%xmm1 - movdqa 0(%r12),%xmm4 - movdqa 16(%r12),%xmm5 - movdqa 32(%r12),%xmm2 - pand 240(%r10),%xmm4 - movdqa 48(%r12),%xmm3 - pand 256(%r10),%xmm5 - por %xmm4,%xmm0 - pand 272(%r10),%xmm2 - por %xmm5,%xmm1 - pand 288(%r10),%xmm3 - por %xmm2,%xmm0 - por %xmm3,%xmm1 - por %xmm1,%xmm0 - pshufd $0x4e,%xmm0,%xmm1 - por %xmm1,%xmm0 - leaq 256(%r12),%r12 -.byte 102,72,15,126,195 - - movq (%r8),%r8 - movq (%rsi),%rax - - xorq %r14,%r14 - xorq %r15,%r15 - - movq %r8,%rbp - mulq %rbx - movq %rax,%r10 - movq (%rcx),%rax - - imulq %r10,%rbp - movq %rdx,%r11 - - mulq %rbp - addq %rax,%r10 - movq 8(%rsi),%rax - adcq $0,%rdx - movq %rdx,%r13 - - leaq 1(%r15),%r15 - jmp .L1st_enter - -.align 16 -.L1st: - addq %rax,%r13 - movq (%rsi,%r15,8),%rax - adcq $0,%rdx - addq %r11,%r13 - movq %r10,%r11 - adcq $0,%rdx - movq %r13,-16(%rsp,%r15,8) - movq %rdx,%r13 - -.L1st_enter: - mulq %rbx - addq %rax,%r11 - movq (%rcx,%r15,8),%rax - adcq $0,%rdx - leaq 1(%r15),%r15 - movq %rdx,%r10 - - mulq %rbp - cmpq %r9,%r15 - jne .L1st - - - addq %rax,%r13 - adcq $0,%rdx - addq %r11,%r13 - adcq $0,%rdx - movq %r13,-16(%rsp,%r9,8) - movq %rdx,%r13 - movq %r10,%r11 - - xorq %rdx,%rdx - addq %r11,%r13 - adcq $0,%rdx - movq %r13,-8(%rsp,%r9,8) - movq %rdx,(%rsp,%r9,8) - - leaq 1(%r14),%r14 - jmp .Louter -.align 16 -.Louter: - leaq 24+128(%rsp,%r9,8),%rdx - andq $-16,%rdx - pxor %xmm4,%xmm4 - pxor %xmm5,%xmm5 - movdqa -128(%r12),%xmm0 - movdqa -112(%r12),%xmm1 - movdqa -96(%r12),%xmm2 - movdqa -80(%r12),%xmm3 - pand -128(%rdx),%xmm0 - pand -112(%rdx),%xmm1 - por %xmm0,%xmm4 - pand -96(%rdx),%xmm2 - por %xmm1,%xmm5 - pand -80(%rdx),%xmm3 - por %xmm2,%xmm4 - por %xmm3,%xmm5 - movdqa -64(%r12),%xmm0 - movdqa -48(%r12),%xmm1 - movdqa -32(%r12),%xmm2 - movdqa -16(%r12),%xmm3 - pand -64(%rdx),%xmm0 - pand -48(%rdx),%xmm1 - por %xmm0,%xmm4 - pand -32(%rdx),%xmm2 - por %xmm1,%xmm5 - pand -16(%rdx),%xmm3 - por %xmm2,%xmm4 - por %xmm3,%xmm5 - movdqa 0(%r12),%xmm0 - movdqa 16(%r12),%xmm1 - movdqa 32(%r12),%xmm2 - movdqa 48(%r12),%xmm3 - pand 0(%rdx),%xmm0 - pand 16(%rdx),%xmm1 - por %xmm0,%xmm4 - pand 32(%rdx),%xmm2 - por %xmm1,%xmm5 - pand 48(%rdx),%xmm3 - por %xmm2,%xmm4 - por %xmm3,%xmm5 - movdqa 64(%r12),%xmm0 - movdqa 80(%r12),%xmm1 - movdqa 96(%r12),%xmm2 - movdqa 112(%r12),%xmm3 - pand 64(%rdx),%xmm0 - pand 80(%rdx),%xmm1 - por %xmm0,%xmm4 - pand 96(%rdx),%xmm2 - por %xmm1,%xmm5 - pand 112(%rdx),%xmm3 - por %xmm2,%xmm4 - por %xmm3,%xmm5 - por %xmm5,%xmm4 - pshufd $0x4e,%xmm4,%xmm0 - por %xmm4,%xmm0 - leaq 256(%r12),%r12 - - movq (%rsi),%rax -.byte 102,72,15,126,195 - - xorq %r15,%r15 - movq %r8,%rbp - movq (%rsp),%r10 - - mulq %rbx - addq %rax,%r10 - movq (%rcx),%rax - adcq $0,%rdx - - imulq %r10,%rbp - movq %rdx,%r11 - - mulq %rbp - addq %rax,%r10 - movq 8(%rsi),%rax - adcq $0,%rdx - movq 8(%rsp),%r10 - movq %rdx,%r13 - - leaq 1(%r15),%r15 - jmp .Linner_enter - -.align 16 -.Linner: - addq %rax,%r13 - movq (%rsi,%r15,8),%rax - adcq $0,%rdx - addq %r10,%r13 - movq (%rsp,%r15,8),%r10 - adcq $0,%rdx - movq %r13,-16(%rsp,%r15,8) - movq %rdx,%r13 - -.Linner_enter: - mulq %rbx - addq %rax,%r11 - movq (%rcx,%r15,8),%rax - adcq $0,%rdx - addq %r11,%r10 - movq %rdx,%r11 - adcq $0,%r11 - leaq 1(%r15),%r15 - - mulq %rbp - cmpq %r9,%r15 - jne .Linner - - addq %rax,%r13 - adcq $0,%rdx - addq %r10,%r13 - movq (%rsp,%r9,8),%r10 - adcq $0,%rdx - movq %r13,-16(%rsp,%r9,8) - movq %rdx,%r13 - - xorq %rdx,%rdx - addq %r11,%r13 - adcq $0,%rdx - addq %r10,%r13 - adcq $0,%rdx - movq %r13,-8(%rsp,%r9,8) - movq %rdx,(%rsp,%r9,8) - - leaq 1(%r14),%r14 - cmpq %r9,%r14 - jb .Louter - - xorq %r14,%r14 - movq (%rsp),%rax - leaq (%rsp),%rsi - movq %r9,%r15 - jmp .Lsub -.align 16 -.Lsub: sbbq (%rcx,%r14,8),%rax - movq %rax,(%rdi,%r14,8) - movq 8(%rsi,%r14,8),%rax - leaq 1(%r14),%r14 - decq %r15 - jnz .Lsub - - sbbq $0,%rax - movq $-1,%rbx - xorq %rax,%rbx - xorq %r14,%r14 - movq %r9,%r15 - -.Lcopy: - movq (%rdi,%r14,8),%rcx - movq (%rsp,%r14,8),%rdx - andq %rbx,%rcx - andq %rax,%rdx - movq %r14,(%rsp,%r14,8) - orq %rcx,%rdx - movq %rdx,(%rdi,%r14,8) - leaq 1(%r14),%r14 - subq $1,%r15 - jnz .Lcopy - - movq 8(%rsp,%r9,8),%rsi -.cfi_def_cfa %rsi,8 - movq $1,%rax - - movq -48(%rsi),%r15 -.cfi_restore %r15 - movq -40(%rsi),%r14 -.cfi_restore %r14 - movq -32(%rsi),%r13 -.cfi_restore %r13 - movq -24(%rsi),%r12 -.cfi_restore %r12 - movq -16(%rsi),%rbp -.cfi_restore %rbp - movq -8(%rsi),%rbx -.cfi_restore %rbx - leaq (%rsi),%rsp -.cfi_def_cfa_register %rsp -.Lmul_epilogue: - .byte 0xf3,0xc3 -.cfi_endproc -.size GFp_bn_mul_mont_gather5,.-GFp_bn_mul_mont_gather5 -.type bn_mul4x_mont_gather5,@function -.align 32 -bn_mul4x_mont_gather5: -.cfi_startproc -.byte 0x67 - movq %rsp,%rax -.cfi_def_cfa_register %rax -.Lmul4x_enter: - andl $0x80108,%r11d - cmpl $0x80108,%r11d - je .Lmulx4x_enter - pushq %rbx -.cfi_offset %rbx,-16 - pushq %rbp -.cfi_offset %rbp,-24 - pushq %r12 -.cfi_offset %r12,-32 - pushq %r13 -.cfi_offset %r13,-40 - pushq %r14 -.cfi_offset %r14,-48 - pushq %r15 -.cfi_offset %r15,-56 -.Lmul4x_prologue: - -.byte 0x67 - shll $3,%r9d - leaq (%r9,%r9,2),%r10 - negq %r9 - - - - - - - - - - - leaq -320(%rsp,%r9,2),%r11 - movq %rsp,%rbp - subq %rdi,%r11 - andq $4095,%r11 - cmpq %r11,%r10 - jb .Lmul4xsp_alt - subq %r11,%rbp - leaq -320(%rbp,%r9,2),%rbp - jmp .Lmul4xsp_done - -.align 32 -.Lmul4xsp_alt: - leaq 4096-320(,%r9,2),%r10 - leaq -320(%rbp,%r9,2),%rbp - subq %r10,%r11 - movq $0,%r10 - cmovcq %r10,%r11 - subq %r11,%rbp -.Lmul4xsp_done: - andq $-64,%rbp - movq %rsp,%r11 - subq %rbp,%r11 - andq $-4096,%r11 - leaq (%r11,%rbp,1),%rsp - movq (%rsp),%r10 - cmpq %rbp,%rsp - ja .Lmul4x_page_walk - jmp .Lmul4x_page_walk_done - -.Lmul4x_page_walk: - leaq -4096(%rsp),%rsp - movq (%rsp),%r10 - cmpq %rbp,%rsp - ja .Lmul4x_page_walk -.Lmul4x_page_walk_done: - - negq %r9 - - movq %rax,40(%rsp) -.cfi_escape 0x0f,0x05,0x77,0x28,0x06,0x23,0x08 -.Lmul4x_body: - - call mul4x_internal - - movq 40(%rsp),%rsi -.cfi_def_cfa %rsi,8 - movq $1,%rax - - movq -48(%rsi),%r15 -.cfi_restore %r15 - movq -40(%rsi),%r14 -.cfi_restore %r14 - movq -32(%rsi),%r13 -.cfi_restore %r13 - movq -24(%rsi),%r12 -.cfi_restore %r12 - movq -16(%rsi),%rbp -.cfi_restore %rbp - movq -8(%rsi),%rbx -.cfi_restore %rbx - leaq (%rsi),%rsp -.cfi_def_cfa_register %rsp -.Lmul4x_epilogue: - .byte 0xf3,0xc3 -.cfi_endproc -.size bn_mul4x_mont_gather5,.-bn_mul4x_mont_gather5 - -.type mul4x_internal,@function -.align 32 -mul4x_internal: -.cfi_startproc - shlq $5,%r9 - movd 8(%rax),%xmm5 - leaq .Linc(%rip),%rax - leaq 128(%rdx,%r9,1),%r13 - shrq $5,%r9 - movdqa 0(%rax),%xmm0 - movdqa 16(%rax),%xmm1 - leaq 88-112(%rsp,%r9,1),%r10 - leaq 128(%rdx),%r12 - - pshufd $0,%xmm5,%xmm5 - movdqa %xmm1,%xmm4 -.byte 0x67,0x67 - movdqa %xmm1,%xmm2 - paddd %xmm0,%xmm1 - pcmpeqd %xmm5,%xmm0 -.byte 0x67 - movdqa %xmm4,%xmm3 - paddd %xmm1,%xmm2 - pcmpeqd %xmm5,%xmm1 - movdqa %xmm0,112(%r10) - movdqa %xmm4,%xmm0 - - paddd %xmm2,%xmm3 - pcmpeqd %xmm5,%xmm2 - movdqa %xmm1,128(%r10) - movdqa %xmm4,%xmm1 - - paddd %xmm3,%xmm0 - pcmpeqd %xmm5,%xmm3 - movdqa %xmm2,144(%r10) - movdqa %xmm4,%xmm2 - - paddd %xmm0,%xmm1 - pcmpeqd %xmm5,%xmm0 - movdqa %xmm3,160(%r10) - movdqa %xmm4,%xmm3 - paddd %xmm1,%xmm2 - pcmpeqd %xmm5,%xmm1 - movdqa %xmm0,176(%r10) - movdqa %xmm4,%xmm0 - - paddd %xmm2,%xmm3 - pcmpeqd %xmm5,%xmm2 - movdqa %xmm1,192(%r10) - movdqa %xmm4,%xmm1 - - paddd %xmm3,%xmm0 - pcmpeqd %xmm5,%xmm3 - movdqa %xmm2,208(%r10) - movdqa %xmm4,%xmm2 - - paddd %xmm0,%xmm1 - pcmpeqd %xmm5,%xmm0 - movdqa %xmm3,224(%r10) - movdqa %xmm4,%xmm3 - paddd %xmm1,%xmm2 - pcmpeqd %xmm5,%xmm1 - movdqa %xmm0,240(%r10) - movdqa %xmm4,%xmm0 - - paddd %xmm2,%xmm3 - pcmpeqd %xmm5,%xmm2 - movdqa %xmm1,256(%r10) - movdqa %xmm4,%xmm1 - - paddd %xmm3,%xmm0 - pcmpeqd %xmm5,%xmm3 - movdqa %xmm2,272(%r10) - movdqa %xmm4,%xmm2 - - paddd %xmm0,%xmm1 - pcmpeqd %xmm5,%xmm0 - movdqa %xmm3,288(%r10) - movdqa %xmm4,%xmm3 - paddd %xmm1,%xmm2 - pcmpeqd %xmm5,%xmm1 - movdqa %xmm0,304(%r10) - - paddd %xmm2,%xmm3 -.byte 0x67 - pcmpeqd %xmm5,%xmm2 - movdqa %xmm1,320(%r10) - - pcmpeqd %xmm5,%xmm3 - movdqa %xmm2,336(%r10) - pand 64(%r12),%xmm0 - - pand 80(%r12),%xmm1 - pand 96(%r12),%xmm2 - movdqa %xmm3,352(%r10) - pand 112(%r12),%xmm3 - por %xmm2,%xmm0 - por %xmm3,%xmm1 - movdqa -128(%r12),%xmm4 - movdqa -112(%r12),%xmm5 - movdqa -96(%r12),%xmm2 - pand 112(%r10),%xmm4 - movdqa -80(%r12),%xmm3 - pand 128(%r10),%xmm5 - por %xmm4,%xmm0 - pand 144(%r10),%xmm2 - por %xmm5,%xmm1 - pand 160(%r10),%xmm3 - por %xmm2,%xmm0 - por %xmm3,%xmm1 - movdqa -64(%r12),%xmm4 - movdqa -48(%r12),%xmm5 - movdqa -32(%r12),%xmm2 - pand 176(%r10),%xmm4 - movdqa -16(%r12),%xmm3 - pand 192(%r10),%xmm5 - por %xmm4,%xmm0 - pand 208(%r10),%xmm2 - por %xmm5,%xmm1 - pand 224(%r10),%xmm3 - por %xmm2,%xmm0 - por %xmm3,%xmm1 - movdqa 0(%r12),%xmm4 - movdqa 16(%r12),%xmm5 - movdqa 32(%r12),%xmm2 - pand 240(%r10),%xmm4 - movdqa 48(%r12),%xmm3 - pand 256(%r10),%xmm5 - por %xmm4,%xmm0 - pand 272(%r10),%xmm2 - por %xmm5,%xmm1 - pand 288(%r10),%xmm3 - por %xmm2,%xmm0 - por %xmm3,%xmm1 - por %xmm1,%xmm0 - pshufd $0x4e,%xmm0,%xmm1 - por %xmm1,%xmm0 - leaq 256(%r12),%r12 -.byte 102,72,15,126,195 - - movq %r13,16+8(%rsp) - movq %rdi,56+8(%rsp) - - movq (%r8),%r8 - movq (%rsi),%rax - leaq (%rsi,%r9,1),%rsi - negq %r9 - - movq %r8,%rbp - mulq %rbx - movq %rax,%r10 - movq (%rcx),%rax - - imulq %r10,%rbp - leaq 64+8(%rsp),%r14 - movq %rdx,%r11 - - mulq %rbp - addq %rax,%r10 - movq 8(%rsi,%r9,1),%rax - adcq $0,%rdx - movq %rdx,%rdi - - mulq %rbx - addq %rax,%r11 - movq 8(%rcx),%rax - adcq $0,%rdx - movq %rdx,%r10 - - mulq %rbp - addq %rax,%rdi - movq 16(%rsi,%r9,1),%rax - adcq $0,%rdx - addq %r11,%rdi - leaq 32(%r9),%r15 - leaq 32(%rcx),%rcx - adcq $0,%rdx - movq %rdi,(%r14) - movq %rdx,%r13 - jmp .L1st4x - -.align 32 -.L1st4x: - mulq %rbx - addq %rax,%r10 - movq -16(%rcx),%rax - leaq 32(%r14),%r14 - adcq $0,%rdx - movq %rdx,%r11 - - mulq %rbp - addq %rax,%r13 - movq -8(%rsi,%r15,1),%rax - adcq $0,%rdx - addq %r10,%r13 - adcq $0,%rdx - movq %r13,-24(%r14) - movq %rdx,%rdi - - mulq %rbx - addq %rax,%r11 - movq -8(%rcx),%rax - adcq $0,%rdx - movq %rdx,%r10 - - mulq %rbp - addq %rax,%rdi - movq (%rsi,%r15,1),%rax - adcq $0,%rdx - addq %r11,%rdi - adcq $0,%rdx - movq %rdi,-16(%r14) - movq %rdx,%r13 - - mulq %rbx - addq %rax,%r10 - movq 0(%rcx),%rax - adcq $0,%rdx - movq %rdx,%r11 - - mulq %rbp - addq %rax,%r13 - movq 8(%rsi,%r15,1),%rax - adcq $0,%rdx - addq %r10,%r13 - adcq $0,%rdx - movq %r13,-8(%r14) - movq %rdx,%rdi - - mulq %rbx - addq %rax,%r11 - movq 8(%rcx),%rax - adcq $0,%rdx - movq %rdx,%r10 - - mulq %rbp - addq %rax,%rdi - movq 16(%rsi,%r15,1),%rax - adcq $0,%rdx - addq %r11,%rdi - leaq 32(%rcx),%rcx - adcq $0,%rdx - movq %rdi,(%r14) - movq %rdx,%r13 - - addq $32,%r15 - jnz .L1st4x - - mulq %rbx - addq %rax,%r10 - movq -16(%rcx),%rax - leaq 32(%r14),%r14 - adcq $0,%rdx - movq %rdx,%r11 - - mulq %rbp - addq %rax,%r13 - movq -8(%rsi),%rax - adcq $0,%rdx - addq %r10,%r13 - adcq $0,%rdx - movq %r13,-24(%r14) - movq %rdx,%rdi - - mulq %rbx - addq %rax,%r11 - movq -8(%rcx),%rax - adcq $0,%rdx - movq %rdx,%r10 - - mulq %rbp - addq %rax,%rdi - movq (%rsi,%r9,1),%rax - adcq $0,%rdx - addq %r11,%rdi - adcq $0,%rdx - movq %rdi,-16(%r14) - movq %rdx,%r13 - - leaq (%rcx,%r9,1),%rcx - - xorq %rdi,%rdi - addq %r10,%r13 - adcq $0,%rdi - movq %r13,-8(%r14) - - jmp .Louter4x - -.align 32 -.Louter4x: - leaq 16+128(%r14),%rdx - pxor %xmm4,%xmm4 - pxor %xmm5,%xmm5 - movdqa -128(%r12),%xmm0 - movdqa -112(%r12),%xmm1 - movdqa -96(%r12),%xmm2 - movdqa -80(%r12),%xmm3 - pand -128(%rdx),%xmm0 - pand -112(%rdx),%xmm1 - por %xmm0,%xmm4 - pand -96(%rdx),%xmm2 - por %xmm1,%xmm5 - pand -80(%rdx),%xmm3 - por %xmm2,%xmm4 - por %xmm3,%xmm5 - movdqa -64(%r12),%xmm0 - movdqa -48(%r12),%xmm1 - movdqa -32(%r12),%xmm2 - movdqa -16(%r12),%xmm3 - pand -64(%rdx),%xmm0 - pand -48(%rdx),%xmm1 - por %xmm0,%xmm4 - pand -32(%rdx),%xmm2 - por %xmm1,%xmm5 - pand -16(%rdx),%xmm3 - por %xmm2,%xmm4 - por %xmm3,%xmm5 - movdqa 0(%r12),%xmm0 - movdqa 16(%r12),%xmm1 - movdqa 32(%r12),%xmm2 - movdqa 48(%r12),%xmm3 - pand 0(%rdx),%xmm0 - pand 16(%rdx),%xmm1 - por %xmm0,%xmm4 - pand 32(%rdx),%xmm2 - por %xmm1,%xmm5 - pand 48(%rdx),%xmm3 - por %xmm2,%xmm4 - por %xmm3,%xmm5 - movdqa 64(%r12),%xmm0 - movdqa 80(%r12),%xmm1 - movdqa 96(%r12),%xmm2 - movdqa 112(%r12),%xmm3 - pand 64(%rdx),%xmm0 - pand 80(%rdx),%xmm1 - por %xmm0,%xmm4 - pand 96(%rdx),%xmm2 - por %xmm1,%xmm5 - pand 112(%rdx),%xmm3 - por %xmm2,%xmm4 - por %xmm3,%xmm5 - por %xmm5,%xmm4 - pshufd $0x4e,%xmm4,%xmm0 - por %xmm4,%xmm0 - leaq 256(%r12),%r12 -.byte 102,72,15,126,195 - - movq (%r14,%r9,1),%r10 - movq %r8,%rbp - mulq %rbx - addq %rax,%r10 - movq (%rcx),%rax - adcq $0,%rdx - - imulq %r10,%rbp - movq %rdx,%r11 - movq %rdi,(%r14) - - leaq (%r14,%r9,1),%r14 - - mulq %rbp - addq %rax,%r10 - movq 8(%rsi,%r9,1),%rax - adcq $0,%rdx - movq %rdx,%rdi - - mulq %rbx - addq %rax,%r11 - movq 8(%rcx),%rax - adcq $0,%rdx - addq 8(%r14),%r11 - adcq $0,%rdx - movq %rdx,%r10 - - mulq %rbp - addq %rax,%rdi - movq 16(%rsi,%r9,1),%rax - adcq $0,%rdx - addq %r11,%rdi - leaq 32(%r9),%r15 - leaq 32(%rcx),%rcx - adcq $0,%rdx - movq %rdx,%r13 - jmp .Linner4x - -.align 32 -.Linner4x: - mulq %rbx - addq %rax,%r10 - movq -16(%rcx),%rax - adcq $0,%rdx - addq 16(%r14),%r10 - leaq 32(%r14),%r14 - adcq $0,%rdx - movq %rdx,%r11 - - mulq %rbp - addq %rax,%r13 - movq -8(%rsi,%r15,1),%rax - adcq $0,%rdx - addq %r10,%r13 - adcq $0,%rdx - movq %rdi,-32(%r14) - movq %rdx,%rdi - - mulq %rbx - addq %rax,%r11 - movq -8(%rcx),%rax - adcq $0,%rdx - addq -8(%r14),%r11 - adcq $0,%rdx - movq %rdx,%r10 - - mulq %rbp - addq %rax,%rdi - movq (%rsi,%r15,1),%rax - adcq $0,%rdx - addq %r11,%rdi - adcq $0,%rdx - movq %r13,-24(%r14) - movq %rdx,%r13 - - mulq %rbx - addq %rax,%r10 - movq 0(%rcx),%rax - adcq $0,%rdx - addq (%r14),%r10 - adcq $0,%rdx - movq %rdx,%r11 - - mulq %rbp - addq %rax,%r13 - movq 8(%rsi,%r15,1),%rax - adcq $0,%rdx - addq %r10,%r13 - adcq $0,%rdx - movq %rdi,-16(%r14) - movq %rdx,%rdi - - mulq %rbx - addq %rax,%r11 - movq 8(%rcx),%rax - adcq $0,%rdx - addq 8(%r14),%r11 - adcq $0,%rdx - movq %rdx,%r10 - - mulq %rbp - addq %rax,%rdi - movq 16(%rsi,%r15,1),%rax - adcq $0,%rdx - addq %r11,%rdi - leaq 32(%rcx),%rcx - adcq $0,%rdx - movq %r13,-8(%r14) - movq %rdx,%r13 - - addq $32,%r15 - jnz .Linner4x - - mulq %rbx - addq %rax,%r10 - movq -16(%rcx),%rax - adcq $0,%rdx - addq 16(%r14),%r10 - leaq 32(%r14),%r14 - adcq $0,%rdx - movq %rdx,%r11 - - mulq %rbp - addq %rax,%r13 - movq -8(%rsi),%rax - adcq $0,%rdx - addq %r10,%r13 - adcq $0,%rdx - movq %rdi,-32(%r14) - movq %rdx,%rdi - - mulq %rbx - addq %rax,%r11 - movq %rbp,%rax - movq -8(%rcx),%rbp - adcq $0,%rdx - addq -8(%r14),%r11 - adcq $0,%rdx - movq %rdx,%r10 - - mulq %rbp - addq %rax,%rdi - movq (%rsi,%r9,1),%rax - adcq $0,%rdx - addq %r11,%rdi - adcq $0,%rdx - movq %r13,-24(%r14) - movq %rdx,%r13 - - movq %rdi,-16(%r14) - leaq (%rcx,%r9,1),%rcx - - xorq %rdi,%rdi - addq %r10,%r13 - adcq $0,%rdi - addq (%r14),%r13 - adcq $0,%rdi - movq %r13,-8(%r14) - - cmpq 16+8(%rsp),%r12 - jb .Louter4x - xorq %rax,%rax - subq %r13,%rbp - adcq %r15,%r15 - orq %r15,%rdi - subq %rdi,%rax - leaq (%r14,%r9,1),%rbx - movq (%rcx),%r12 - leaq (%rcx),%rbp - movq %r9,%rcx - sarq $3+2,%rcx - movq 56+8(%rsp),%rdi - decq %r12 - xorq %r10,%r10 - movq 8(%rbp),%r13 - movq 16(%rbp),%r14 - movq 24(%rbp),%r15 - jmp .Lsqr4x_sub_entry -.cfi_endproc -.size mul4x_internal,.-mul4x_internal -.globl GFp_bn_power5 -.hidden GFp_bn_power5 -.type GFp_bn_power5,@function -.align 32 -GFp_bn_power5: -.cfi_startproc - movq %rsp,%rax -.cfi_def_cfa_register %rax - leaq GFp_ia32cap_P(%rip),%r11 - movl 8(%r11),%r11d - andl $0x80108,%r11d - cmpl $0x80108,%r11d - je .Lpowerx5_enter - pushq %rbx -.cfi_offset %rbx,-16 - pushq %rbp -.cfi_offset %rbp,-24 - pushq %r12 -.cfi_offset %r12,-32 - pushq %r13 -.cfi_offset %r13,-40 - pushq %r14 -.cfi_offset %r14,-48 - pushq %r15 -.cfi_offset %r15,-56 -.Lpower5_prologue: - - shll $3,%r9d - leal (%r9,%r9,2),%r10d - negq %r9 - movq (%r8),%r8 - - - - - - - - - leaq -320(%rsp,%r9,2),%r11 - movq %rsp,%rbp - subq %rdi,%r11 - andq $4095,%r11 - cmpq %r11,%r10 - jb .Lpwr_sp_alt - subq %r11,%rbp - leaq -320(%rbp,%r9,2),%rbp - jmp .Lpwr_sp_done - -.align 32 -.Lpwr_sp_alt: - leaq 4096-320(,%r9,2),%r10 - leaq -320(%rbp,%r9,2),%rbp - subq %r10,%r11 - movq $0,%r10 - cmovcq %r10,%r11 - subq %r11,%rbp -.Lpwr_sp_done: - andq $-64,%rbp - movq %rsp,%r11 - subq %rbp,%r11 - andq $-4096,%r11 - leaq (%r11,%rbp,1),%rsp - movq (%rsp),%r10 - cmpq %rbp,%rsp - ja .Lpwr_page_walk - jmp .Lpwr_page_walk_done - -.Lpwr_page_walk: - leaq -4096(%rsp),%rsp - movq (%rsp),%r10 - cmpq %rbp,%rsp - ja .Lpwr_page_walk -.Lpwr_page_walk_done: - - movq %r9,%r10 - negq %r9 - - - - - - - - - - - movq %r8,32(%rsp) - movq %rax,40(%rsp) -.cfi_escape 0x0f,0x05,0x77,0x28,0x06,0x23,0x08 -.Lpower5_body: -.byte 102,72,15,110,207 -.byte 102,72,15,110,209 -.byte 102,73,15,110,218 -.byte 102,72,15,110,226 - - call __bn_sqr8x_internal - call __bn_post4x_internal - call __bn_sqr8x_internal - call __bn_post4x_internal - call __bn_sqr8x_internal - call __bn_post4x_internal - call __bn_sqr8x_internal - call __bn_post4x_internal - call __bn_sqr8x_internal - call __bn_post4x_internal - -.byte 102,72,15,126,209 -.byte 102,72,15,126,226 - movq %rsi,%rdi - movq 40(%rsp),%rax - leaq 32(%rsp),%r8 - - call mul4x_internal - - movq 40(%rsp),%rsi -.cfi_def_cfa %rsi,8 - movq $1,%rax - movq -48(%rsi),%r15 -.cfi_restore %r15 - movq -40(%rsi),%r14 -.cfi_restore %r14 - movq -32(%rsi),%r13 -.cfi_restore %r13 - movq -24(%rsi),%r12 -.cfi_restore %r12 - movq -16(%rsi),%rbp -.cfi_restore %rbp - movq -8(%rsi),%rbx -.cfi_restore %rbx - leaq (%rsi),%rsp -.cfi_def_cfa_register %rsp -.Lpower5_epilogue: - .byte 0xf3,0xc3 -.cfi_endproc -.size GFp_bn_power5,.-GFp_bn_power5 - -.globl GFp_bn_sqr8x_internal -.hidden GFp_bn_sqr8x_internal -.hidden GFp_bn_sqr8x_internal -.type GFp_bn_sqr8x_internal,@function -.align 32 -GFp_bn_sqr8x_internal: -__bn_sqr8x_internal: -.cfi_startproc - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - leaq 32(%r10),%rbp - leaq (%rsi,%r9,1),%rsi - - movq %r9,%rcx - - - movq -32(%rsi,%rbp,1),%r14 - leaq 48+8(%rsp,%r9,2),%rdi - movq -24(%rsi,%rbp,1),%rax - leaq -32(%rdi,%rbp,1),%rdi - movq -16(%rsi,%rbp,1),%rbx - movq %rax,%r15 - - mulq %r14 - movq %rax,%r10 - movq %rbx,%rax - movq %rdx,%r11 - movq %r10,-24(%rdi,%rbp,1) - - mulq %r14 - addq %rax,%r11 - movq %rbx,%rax - adcq $0,%rdx - movq %r11,-16(%rdi,%rbp,1) - movq %rdx,%r10 - - - movq -8(%rsi,%rbp,1),%rbx - mulq %r15 - movq %rax,%r12 - movq %rbx,%rax - movq %rdx,%r13 - - leaq (%rbp),%rcx - mulq %r14 - addq %rax,%r10 - movq %rbx,%rax - movq %rdx,%r11 - adcq $0,%r11 - addq %r12,%r10 - adcq $0,%r11 - movq %r10,-8(%rdi,%rcx,1) - jmp .Lsqr4x_1st - -.align 32 -.Lsqr4x_1st: - movq (%rsi,%rcx,1),%rbx - mulq %r15 - addq %rax,%r13 - movq %rbx,%rax - movq %rdx,%r12 - adcq $0,%r12 - - mulq %r14 - addq %rax,%r11 - movq %rbx,%rax - movq 8(%rsi,%rcx,1),%rbx - movq %rdx,%r10 - adcq $0,%r10 - addq %r13,%r11 - adcq $0,%r10 - - - mulq %r15 - addq %rax,%r12 - movq %rbx,%rax - movq %r11,(%rdi,%rcx,1) - movq %rdx,%r13 - adcq $0,%r13 - - mulq %r14 - addq %rax,%r10 - movq %rbx,%rax - movq 16(%rsi,%rcx,1),%rbx - movq %rdx,%r11 - adcq $0,%r11 - addq %r12,%r10 - adcq $0,%r11 - - mulq %r15 - addq %rax,%r13 - movq %rbx,%rax - movq %r10,8(%rdi,%rcx,1) - movq %rdx,%r12 - adcq $0,%r12 - - mulq %r14 - addq %rax,%r11 - movq %rbx,%rax - movq 24(%rsi,%rcx,1),%rbx - movq %rdx,%r10 - adcq $0,%r10 - addq %r13,%r11 - adcq $0,%r10 - - - mulq %r15 - addq %rax,%r12 - movq %rbx,%rax - movq %r11,16(%rdi,%rcx,1) - movq %rdx,%r13 - adcq $0,%r13 - leaq 32(%rcx),%rcx - - mulq %r14 - addq %rax,%r10 - movq %rbx,%rax - movq %rdx,%r11 - adcq $0,%r11 - addq %r12,%r10 - adcq $0,%r11 - movq %r10,-8(%rdi,%rcx,1) - - cmpq $0,%rcx - jne .Lsqr4x_1st - - mulq %r15 - addq %rax,%r13 - leaq 16(%rbp),%rbp - adcq $0,%rdx - addq %r11,%r13 - adcq $0,%rdx - - movq %r13,(%rdi) - movq %rdx,%r12 - movq %rdx,8(%rdi) - jmp .Lsqr4x_outer - -.align 32 -.Lsqr4x_outer: - movq -32(%rsi,%rbp,1),%r14 - leaq 48+8(%rsp,%r9,2),%rdi - movq -24(%rsi,%rbp,1),%rax - leaq -32(%rdi,%rbp,1),%rdi - movq -16(%rsi,%rbp,1),%rbx - movq %rax,%r15 - - mulq %r14 - movq -24(%rdi,%rbp,1),%r10 - addq %rax,%r10 - movq %rbx,%rax - adcq $0,%rdx - movq %r10,-24(%rdi,%rbp,1) - movq %rdx,%r11 - - mulq %r14 - addq %rax,%r11 - movq %rbx,%rax - adcq $0,%rdx - addq -16(%rdi,%rbp,1),%r11 - movq %rdx,%r10 - adcq $0,%r10 - movq %r11,-16(%rdi,%rbp,1) - - xorq %r12,%r12 - - movq -8(%rsi,%rbp,1),%rbx - mulq %r15 - addq %rax,%r12 - movq %rbx,%rax - adcq $0,%rdx - addq -8(%rdi,%rbp,1),%r12 - movq %rdx,%r13 - adcq $0,%r13 - - mulq %r14 - addq %rax,%r10 - movq %rbx,%rax - adcq $0,%rdx - addq %r12,%r10 - movq %rdx,%r11 - adcq $0,%r11 - movq %r10,-8(%rdi,%rbp,1) - - leaq (%rbp),%rcx - jmp .Lsqr4x_inner - -.align 32 -.Lsqr4x_inner: - movq (%rsi,%rcx,1),%rbx - mulq %r15 - addq %rax,%r13 - movq %rbx,%rax - movq %rdx,%r12 - adcq $0,%r12 - addq (%rdi,%rcx,1),%r13 - adcq $0,%r12 - -.byte 0x67 - mulq %r14 - addq %rax,%r11 - movq %rbx,%rax - movq 8(%rsi,%rcx,1),%rbx - movq %rdx,%r10 - adcq $0,%r10 - addq %r13,%r11 - adcq $0,%r10 - - mulq %r15 - addq %rax,%r12 - movq %r11,(%rdi,%rcx,1) - movq %rbx,%rax - movq %rdx,%r13 - adcq $0,%r13 - addq 8(%rdi,%rcx,1),%r12 - leaq 16(%rcx),%rcx - adcq $0,%r13 - - mulq %r14 - addq %rax,%r10 - movq %rbx,%rax - adcq $0,%rdx - addq %r12,%r10 - movq %rdx,%r11 - adcq $0,%r11 - movq %r10,-8(%rdi,%rcx,1) - - cmpq $0,%rcx - jne .Lsqr4x_inner - -.byte 0x67 - mulq %r15 - addq %rax,%r13 - adcq $0,%rdx - addq %r11,%r13 - adcq $0,%rdx - - movq %r13,(%rdi) - movq %rdx,%r12 - movq %rdx,8(%rdi) - - addq $16,%rbp - jnz .Lsqr4x_outer - - - movq -32(%rsi),%r14 - leaq 48+8(%rsp,%r9,2),%rdi - movq -24(%rsi),%rax - leaq -32(%rdi,%rbp,1),%rdi - movq -16(%rsi),%rbx - movq %rax,%r15 - - mulq %r14 - addq %rax,%r10 - movq %rbx,%rax - movq %rdx,%r11 - adcq $0,%r11 - - mulq %r14 - addq %rax,%r11 - movq %rbx,%rax - movq %r10,-24(%rdi) - movq %rdx,%r10 - adcq $0,%r10 - addq %r13,%r11 - movq -8(%rsi),%rbx - adcq $0,%r10 - - mulq %r15 - addq %rax,%r12 - movq %rbx,%rax - movq %r11,-16(%rdi) - movq %rdx,%r13 - adcq $0,%r13 - - mulq %r14 - addq %rax,%r10 - movq %rbx,%rax - movq %rdx,%r11 - adcq $0,%r11 - addq %r12,%r10 - adcq $0,%r11 - movq %r10,-8(%rdi) - - mulq %r15 - addq %rax,%r13 - movq -16(%rsi),%rax - adcq $0,%rdx - addq %r11,%r13 - adcq $0,%rdx - - movq %r13,(%rdi) - movq %rdx,%r12 - movq %rdx,8(%rdi) - - mulq %rbx - addq $16,%rbp - xorq %r14,%r14 - subq %r9,%rbp - xorq %r15,%r15 - - addq %r12,%rax - adcq $0,%rdx - movq %rax,8(%rdi) - movq %rdx,16(%rdi) - movq %r15,24(%rdi) - - movq -16(%rsi,%rbp,1),%rax - leaq 48+8(%rsp),%rdi - xorq %r10,%r10 - movq 8(%rdi),%r11 - - leaq (%r14,%r10,2),%r12 - shrq $63,%r10 - leaq (%rcx,%r11,2),%r13 - shrq $63,%r11 - orq %r10,%r13 - movq 16(%rdi),%r10 - movq %r11,%r14 - mulq %rax - negq %r15 - movq 24(%rdi),%r11 - adcq %rax,%r12 - movq -8(%rsi,%rbp,1),%rax - movq %r12,(%rdi) - adcq %rdx,%r13 - - leaq (%r14,%r10,2),%rbx - movq %r13,8(%rdi) - sbbq %r15,%r15 - shrq $63,%r10 - leaq (%rcx,%r11,2),%r8 - shrq $63,%r11 - orq %r10,%r8 - movq 32(%rdi),%r10 - movq %r11,%r14 - mulq %rax - negq %r15 - movq 40(%rdi),%r11 - adcq %rax,%rbx - movq 0(%rsi,%rbp,1),%rax - movq %rbx,16(%rdi) - adcq %rdx,%r8 - leaq 16(%rbp),%rbp - movq %r8,24(%rdi) - sbbq %r15,%r15 - leaq 64(%rdi),%rdi - jmp .Lsqr4x_shift_n_add - -.align 32 -.Lsqr4x_shift_n_add: - leaq (%r14,%r10,2),%r12 - shrq $63,%r10 - leaq (%rcx,%r11,2),%r13 - shrq $63,%r11 - orq %r10,%r13 - movq -16(%rdi),%r10 - movq %r11,%r14 - mulq %rax - negq %r15 - movq -8(%rdi),%r11 - adcq %rax,%r12 - movq -8(%rsi,%rbp,1),%rax - movq %r12,-32(%rdi) - adcq %rdx,%r13 - - leaq (%r14,%r10,2),%rbx - movq %r13,-24(%rdi) - sbbq %r15,%r15 - shrq $63,%r10 - leaq (%rcx,%r11,2),%r8 - shrq $63,%r11 - orq %r10,%r8 - movq 0(%rdi),%r10 - movq %r11,%r14 - mulq %rax - negq %r15 - movq 8(%rdi),%r11 - adcq %rax,%rbx - movq 0(%rsi,%rbp,1),%rax - movq %rbx,-16(%rdi) - adcq %rdx,%r8 - - leaq (%r14,%r10,2),%r12 - movq %r8,-8(%rdi) - sbbq %r15,%r15 - shrq $63,%r10 - leaq (%rcx,%r11,2),%r13 - shrq $63,%r11 - orq %r10,%r13 - movq 16(%rdi),%r10 - movq %r11,%r14 - mulq %rax - negq %r15 - movq 24(%rdi),%r11 - adcq %rax,%r12 - movq 8(%rsi,%rbp,1),%rax - movq %r12,0(%rdi) - adcq %rdx,%r13 - - leaq (%r14,%r10,2),%rbx - movq %r13,8(%rdi) - sbbq %r15,%r15 - shrq $63,%r10 - leaq (%rcx,%r11,2),%r8 - shrq $63,%r11 - orq %r10,%r8 - movq 32(%rdi),%r10 - movq %r11,%r14 - mulq %rax - negq %r15 - movq 40(%rdi),%r11 - adcq %rax,%rbx - movq 16(%rsi,%rbp,1),%rax - movq %rbx,16(%rdi) - adcq %rdx,%r8 - movq %r8,24(%rdi) - sbbq %r15,%r15 - leaq 64(%rdi),%rdi - addq $32,%rbp - jnz .Lsqr4x_shift_n_add - - leaq (%r14,%r10,2),%r12 -.byte 0x67 - shrq $63,%r10 - leaq (%rcx,%r11,2),%r13 - shrq $63,%r11 - orq %r10,%r13 - movq -16(%rdi),%r10 - movq %r11,%r14 - mulq %rax - negq %r15 - movq -8(%rdi),%r11 - adcq %rax,%r12 - movq -8(%rsi),%rax - movq %r12,-32(%rdi) - adcq %rdx,%r13 - - leaq (%r14,%r10,2),%rbx - movq %r13,-24(%rdi) - sbbq %r15,%r15 - shrq $63,%r10 - leaq (%rcx,%r11,2),%r8 - shrq $63,%r11 - orq %r10,%r8 - mulq %rax - negq %r15 - adcq %rax,%rbx - adcq %rdx,%r8 - movq %rbx,-16(%rdi) - movq %r8,-8(%rdi) -.byte 102,72,15,126,213 -__bn_sqr8x_reduction: - xorq %rax,%rax - leaq (%r9,%rbp,1),%rcx - leaq 48+8(%rsp,%r9,2),%rdx - movq %rcx,0+8(%rsp) - leaq 48+8(%rsp,%r9,1),%rdi - movq %rdx,8+8(%rsp) - negq %r9 - jmp .L8x_reduction_loop - -.align 32 -.L8x_reduction_loop: - leaq (%rdi,%r9,1),%rdi -.byte 0x66 - movq 0(%rdi),%rbx - movq 8(%rdi),%r9 - movq 16(%rdi),%r10 - movq 24(%rdi),%r11 - movq 32(%rdi),%r12 - movq 40(%rdi),%r13 - movq 48(%rdi),%r14 - movq 56(%rdi),%r15 - movq %rax,(%rdx) - leaq 64(%rdi),%rdi - -.byte 0x67 - movq %rbx,%r8 - imulq 32+8(%rsp),%rbx - movq 0(%rbp),%rax - movl $8,%ecx - jmp .L8x_reduce - -.align 32 -.L8x_reduce: - mulq %rbx - movq 8(%rbp),%rax - negq %r8 - movq %rdx,%r8 - adcq $0,%r8 - - mulq %rbx - addq %rax,%r9 - movq 16(%rbp),%rax - adcq $0,%rdx - addq %r9,%r8 - movq %rbx,48-8+8(%rsp,%rcx,8) - movq %rdx,%r9 - adcq $0,%r9 - - mulq %rbx - addq %rax,%r10 - movq 24(%rbp),%rax - adcq $0,%rdx - addq %r10,%r9 - movq 32+8(%rsp),%rsi - movq %rdx,%r10 - adcq $0,%r10 - - mulq %rbx - addq %rax,%r11 - movq 32(%rbp),%rax - adcq $0,%rdx - imulq %r8,%rsi - addq %r11,%r10 - movq %rdx,%r11 - adcq $0,%r11 - - mulq %rbx - addq %rax,%r12 - movq 40(%rbp),%rax - adcq $0,%rdx - addq %r12,%r11 - movq %rdx,%r12 - adcq $0,%r12 - - mulq %rbx - addq %rax,%r13 - movq 48(%rbp),%rax - adcq $0,%rdx - addq %r13,%r12 - movq %rdx,%r13 - adcq $0,%r13 - - mulq %rbx - addq %rax,%r14 - movq 56(%rbp),%rax - adcq $0,%rdx - addq %r14,%r13 - movq %rdx,%r14 - adcq $0,%r14 - - mulq %rbx - movq %rsi,%rbx - addq %rax,%r15 - movq 0(%rbp),%rax - adcq $0,%rdx - addq %r15,%r14 - movq %rdx,%r15 - adcq $0,%r15 - - decl %ecx - jnz .L8x_reduce - - leaq 64(%rbp),%rbp - xorq %rax,%rax - movq 8+8(%rsp),%rdx - cmpq 0+8(%rsp),%rbp - jae .L8x_no_tail - -.byte 0x66 - addq 0(%rdi),%r8 - adcq 8(%rdi),%r9 - adcq 16(%rdi),%r10 - adcq 24(%rdi),%r11 - adcq 32(%rdi),%r12 - adcq 40(%rdi),%r13 - adcq 48(%rdi),%r14 - adcq 56(%rdi),%r15 - sbbq %rsi,%rsi - - movq 48+56+8(%rsp),%rbx - movl $8,%ecx - movq 0(%rbp),%rax - jmp .L8x_tail - -.align 32 -.L8x_tail: - mulq %rbx - addq %rax,%r8 - movq 8(%rbp),%rax - movq %r8,(%rdi) - movq %rdx,%r8 - adcq $0,%r8 - - mulq %rbx - addq %rax,%r9 - movq 16(%rbp),%rax - adcq $0,%rdx - addq %r9,%r8 - leaq 8(%rdi),%rdi - movq %rdx,%r9 - adcq $0,%r9 - - mulq %rbx - addq %rax,%r10 - movq 24(%rbp),%rax - adcq $0,%rdx - addq %r10,%r9 - movq %rdx,%r10 - adcq $0,%r10 - - mulq %rbx - addq %rax,%r11 - movq 32(%rbp),%rax - adcq $0,%rdx - addq %r11,%r10 - movq %rdx,%r11 - adcq $0,%r11 - - mulq %rbx - addq %rax,%r12 - movq 40(%rbp),%rax - adcq $0,%rdx - addq %r12,%r11 - movq %rdx,%r12 - adcq $0,%r12 - - mulq %rbx - addq %rax,%r13 - movq 48(%rbp),%rax - adcq $0,%rdx - addq %r13,%r12 - movq %rdx,%r13 - adcq $0,%r13 - - mulq %rbx - addq %rax,%r14 - movq 56(%rbp),%rax - adcq $0,%rdx - addq %r14,%r13 - movq %rdx,%r14 - adcq $0,%r14 - - mulq %rbx - movq 48-16+8(%rsp,%rcx,8),%rbx - addq %rax,%r15 - adcq $0,%rdx - addq %r15,%r14 - movq 0(%rbp),%rax - movq %rdx,%r15 - adcq $0,%r15 - - decl %ecx - jnz .L8x_tail - - leaq 64(%rbp),%rbp - movq 8+8(%rsp),%rdx - cmpq 0+8(%rsp),%rbp - jae .L8x_tail_done - - movq 48+56+8(%rsp),%rbx - negq %rsi - movq 0(%rbp),%rax - adcq 0(%rdi),%r8 - adcq 8(%rdi),%r9 - adcq 16(%rdi),%r10 - adcq 24(%rdi),%r11 - adcq 32(%rdi),%r12 - adcq 40(%rdi),%r13 - adcq 48(%rdi),%r14 - adcq 56(%rdi),%r15 - sbbq %rsi,%rsi - - movl $8,%ecx - jmp .L8x_tail - -.align 32 -.L8x_tail_done: - xorq %rax,%rax - addq (%rdx),%r8 - adcq $0,%r9 - adcq $0,%r10 - adcq $0,%r11 - adcq $0,%r12 - adcq $0,%r13 - adcq $0,%r14 - adcq $0,%r15 - adcq $0,%rax - - negq %rsi -.L8x_no_tail: - adcq 0(%rdi),%r8 - adcq 8(%rdi),%r9 - adcq 16(%rdi),%r10 - adcq 24(%rdi),%r11 - adcq 32(%rdi),%r12 - adcq 40(%rdi),%r13 - adcq 48(%rdi),%r14 - adcq 56(%rdi),%r15 - adcq $0,%rax - movq -8(%rbp),%rcx - xorq %rsi,%rsi - -.byte 102,72,15,126,213 - - movq %r8,0(%rdi) - movq %r9,8(%rdi) -.byte 102,73,15,126,217 - movq %r10,16(%rdi) - movq %r11,24(%rdi) - movq %r12,32(%rdi) - movq %r13,40(%rdi) - movq %r14,48(%rdi) - movq %r15,56(%rdi) - leaq 64(%rdi),%rdi - - cmpq %rdx,%rdi - jb .L8x_reduction_loop - .byte 0xf3,0xc3 -.cfi_endproc -.size GFp_bn_sqr8x_internal,.-GFp_bn_sqr8x_internal -.type __bn_post4x_internal,@function -.align 32 -__bn_post4x_internal: -.cfi_startproc - movq 0(%rbp),%r12 - leaq (%rdi,%r9,1),%rbx - movq %r9,%rcx -.byte 102,72,15,126,207 - negq %rax -.byte 102,72,15,126,206 - sarq $3+2,%rcx - decq %r12 - xorq %r10,%r10 - movq 8(%rbp),%r13 - movq 16(%rbp),%r14 - movq 24(%rbp),%r15 - jmp .Lsqr4x_sub_entry - -.align 16 -.Lsqr4x_sub: - movq 0(%rbp),%r12 - movq 8(%rbp),%r13 - movq 16(%rbp),%r14 - movq 24(%rbp),%r15 -.Lsqr4x_sub_entry: - leaq 32(%rbp),%rbp - notq %r12 - notq %r13 - notq %r14 - notq %r15 - andq %rax,%r12 - andq %rax,%r13 - andq %rax,%r14 - andq %rax,%r15 - - negq %r10 - adcq 0(%rbx),%r12 - adcq 8(%rbx),%r13 - adcq 16(%rbx),%r14 - adcq 24(%rbx),%r15 - movq %r12,0(%rdi) - leaq 32(%rbx),%rbx - movq %r13,8(%rdi) - sbbq %r10,%r10 - movq %r14,16(%rdi) - movq %r15,24(%rdi) - leaq 32(%rdi),%rdi - - incq %rcx - jnz .Lsqr4x_sub - - movq %r9,%r10 - negq %r9 - .byte 0xf3,0xc3 -.cfi_endproc -.size __bn_post4x_internal,.-__bn_post4x_internal -.globl GFp_bn_from_montgomery -.hidden GFp_bn_from_montgomery -.type GFp_bn_from_montgomery,@function -.align 32 -GFp_bn_from_montgomery: -.cfi_startproc - testl $7,%r9d - jz bn_from_mont8x - xorl %eax,%eax - .byte 0xf3,0xc3 -.cfi_endproc -.size GFp_bn_from_montgomery,.-GFp_bn_from_montgomery - -.type bn_from_mont8x,@function -.align 32 -bn_from_mont8x: -.cfi_startproc -.byte 0x67 - movq %rsp,%rax -.cfi_def_cfa_register %rax - pushq %rbx -.cfi_offset %rbx,-16 - pushq %rbp -.cfi_offset %rbp,-24 - pushq %r12 -.cfi_offset %r12,-32 - pushq %r13 -.cfi_offset %r13,-40 - pushq %r14 -.cfi_offset %r14,-48 - pushq %r15 -.cfi_offset %r15,-56 -.Lfrom_prologue: - - shll $3,%r9d - leaq (%r9,%r9,2),%r10 - negq %r9 - movq (%r8),%r8 - - - - - - - - - leaq -320(%rsp,%r9,2),%r11 - movq %rsp,%rbp - subq %rdi,%r11 - andq $4095,%r11 - cmpq %r11,%r10 - jb .Lfrom_sp_alt - subq %r11,%rbp - leaq -320(%rbp,%r9,2),%rbp - jmp .Lfrom_sp_done - -.align 32 -.Lfrom_sp_alt: - leaq 4096-320(,%r9,2),%r10 - leaq -320(%rbp,%r9,2),%rbp - subq %r10,%r11 - movq $0,%r10 - cmovcq %r10,%r11 - subq %r11,%rbp -.Lfrom_sp_done: - andq $-64,%rbp - movq %rsp,%r11 - subq %rbp,%r11 - andq $-4096,%r11 - leaq (%r11,%rbp,1),%rsp - movq (%rsp),%r10 - cmpq %rbp,%rsp - ja .Lfrom_page_walk - jmp .Lfrom_page_walk_done - -.Lfrom_page_walk: - leaq -4096(%rsp),%rsp - movq (%rsp),%r10 - cmpq %rbp,%rsp - ja .Lfrom_page_walk -.Lfrom_page_walk_done: - - movq %r9,%r10 - negq %r9 - - - - - - - - - - - movq %r8,32(%rsp) - movq %rax,40(%rsp) -.cfi_escape 0x0f,0x05,0x77,0x28,0x06,0x23,0x08 -.Lfrom_body: - movq %r9,%r11 - leaq 48(%rsp),%rax - pxor %xmm0,%xmm0 - jmp .Lmul_by_1 - -.align 32 -.Lmul_by_1: - movdqu (%rsi),%xmm1 - movdqu 16(%rsi),%xmm2 - movdqu 32(%rsi),%xmm3 - movdqa %xmm0,(%rax,%r9,1) - movdqu 48(%rsi),%xmm4 - movdqa %xmm0,16(%rax,%r9,1) -.byte 0x48,0x8d,0xb6,0x40,0x00,0x00,0x00 - movdqa %xmm1,(%rax) - movdqa %xmm0,32(%rax,%r9,1) - movdqa %xmm2,16(%rax) - movdqa %xmm0,48(%rax,%r9,1) - movdqa %xmm3,32(%rax) - movdqa %xmm4,48(%rax) - leaq 64(%rax),%rax - subq $64,%r11 - jnz .Lmul_by_1 - -.byte 102,72,15,110,207 -.byte 102,72,15,110,209 -.byte 0x67 - movq %rcx,%rbp -.byte 102,73,15,110,218 - leaq GFp_ia32cap_P(%rip),%r11 - movl 8(%r11),%r11d - andl $0x80108,%r11d - cmpl $0x80108,%r11d - jne .Lfrom_mont_nox - - leaq (%rax,%r9,1),%rdi - call __bn_sqrx8x_reduction - call __bn_postx4x_internal - - pxor %xmm0,%xmm0 - leaq 48(%rsp),%rax - jmp .Lfrom_mont_zero - -.align 32 -.Lfrom_mont_nox: - call __bn_sqr8x_reduction - call __bn_post4x_internal - - pxor %xmm0,%xmm0 - leaq 48(%rsp),%rax - jmp .Lfrom_mont_zero - -.align 32 -.Lfrom_mont_zero: - movq 40(%rsp),%rsi -.cfi_def_cfa %rsi,8 - movdqa %xmm0,0(%rax) - movdqa %xmm0,16(%rax) - movdqa %xmm0,32(%rax) - movdqa %xmm0,48(%rax) - leaq 64(%rax),%rax - subq $32,%r9 - jnz .Lfrom_mont_zero - - movq $1,%rax - movq -48(%rsi),%r15 -.cfi_restore %r15 - movq -40(%rsi),%r14 -.cfi_restore %r14 - movq -32(%rsi),%r13 -.cfi_restore %r13 - movq -24(%rsi),%r12 -.cfi_restore %r12 - movq -16(%rsi),%rbp -.cfi_restore %rbp - movq -8(%rsi),%rbx -.cfi_restore %rbx - leaq (%rsi),%rsp -.cfi_def_cfa_register %rsp -.Lfrom_epilogue: - .byte 0xf3,0xc3 -.cfi_endproc -.size bn_from_mont8x,.-bn_from_mont8x -.type bn_mulx4x_mont_gather5,@function -.align 32 -bn_mulx4x_mont_gather5: -.cfi_startproc - movq %rsp,%rax -.cfi_def_cfa_register %rax -.Lmulx4x_enter: - pushq %rbx -.cfi_offset %rbx,-16 - pushq %rbp -.cfi_offset %rbp,-24 - pushq %r12 -.cfi_offset %r12,-32 - pushq %r13 -.cfi_offset %r13,-40 - pushq %r14 -.cfi_offset %r14,-48 - pushq %r15 -.cfi_offset %r15,-56 -.Lmulx4x_prologue: - - shll $3,%r9d - leaq (%r9,%r9,2),%r10 - negq %r9 - movq (%r8),%r8 - - - - - - - - - - - leaq -320(%rsp,%r9,2),%r11 - movq %rsp,%rbp - subq %rdi,%r11 - andq $4095,%r11 - cmpq %r11,%r10 - jb .Lmulx4xsp_alt - subq %r11,%rbp - leaq -320(%rbp,%r9,2),%rbp - jmp .Lmulx4xsp_done - -.Lmulx4xsp_alt: - leaq 4096-320(,%r9,2),%r10 - leaq -320(%rbp,%r9,2),%rbp - subq %r10,%r11 - movq $0,%r10 - cmovcq %r10,%r11 - subq %r11,%rbp -.Lmulx4xsp_done: - andq $-64,%rbp - movq %rsp,%r11 - subq %rbp,%r11 - andq $-4096,%r11 - leaq (%r11,%rbp,1),%rsp - movq (%rsp),%r10 - cmpq %rbp,%rsp - ja .Lmulx4x_page_walk - jmp .Lmulx4x_page_walk_done - -.Lmulx4x_page_walk: - leaq -4096(%rsp),%rsp - movq (%rsp),%r10 - cmpq %rbp,%rsp - ja .Lmulx4x_page_walk -.Lmulx4x_page_walk_done: - - - - - - - - - - - - - - movq %r8,32(%rsp) - movq %rax,40(%rsp) -.cfi_escape 0x0f,0x05,0x77,0x28,0x06,0x23,0x08 -.Lmulx4x_body: - call mulx4x_internal - - movq 40(%rsp),%rsi -.cfi_def_cfa %rsi,8 - movq $1,%rax - - movq -48(%rsi),%r15 -.cfi_restore %r15 - movq -40(%rsi),%r14 -.cfi_restore %r14 - movq -32(%rsi),%r13 -.cfi_restore %r13 - movq -24(%rsi),%r12 -.cfi_restore %r12 - movq -16(%rsi),%rbp -.cfi_restore %rbp - movq -8(%rsi),%rbx -.cfi_restore %rbx - leaq (%rsi),%rsp -.cfi_def_cfa_register %rsp -.Lmulx4x_epilogue: - .byte 0xf3,0xc3 -.cfi_endproc -.size bn_mulx4x_mont_gather5,.-bn_mulx4x_mont_gather5 - -.type mulx4x_internal,@function -.align 32 -mulx4x_internal: -.cfi_startproc - movq %r9,8(%rsp) - movq %r9,%r10 - negq %r9 - shlq $5,%r9 - negq %r10 - leaq 128(%rdx,%r9,1),%r13 - shrq $5+5,%r9 - movd 8(%rax),%xmm5 - subq $1,%r9 - leaq .Linc(%rip),%rax - movq %r13,16+8(%rsp) - movq %r9,24+8(%rsp) - movq %rdi,56+8(%rsp) - movdqa 0(%rax),%xmm0 - movdqa 16(%rax),%xmm1 - leaq 88-112(%rsp,%r10,1),%r10 - leaq 128(%rdx),%rdi - - pshufd $0,%xmm5,%xmm5 - movdqa %xmm1,%xmm4 -.byte 0x67 - movdqa %xmm1,%xmm2 -.byte 0x67 - paddd %xmm0,%xmm1 - pcmpeqd %xmm5,%xmm0 - movdqa %xmm4,%xmm3 - paddd %xmm1,%xmm2 - pcmpeqd %xmm5,%xmm1 - movdqa %xmm0,112(%r10) - movdqa %xmm4,%xmm0 - - paddd %xmm2,%xmm3 - pcmpeqd %xmm5,%xmm2 - movdqa %xmm1,128(%r10) - movdqa %xmm4,%xmm1 - - paddd %xmm3,%xmm0 - pcmpeqd %xmm5,%xmm3 - movdqa %xmm2,144(%r10) - movdqa %xmm4,%xmm2 - - paddd %xmm0,%xmm1 - pcmpeqd %xmm5,%xmm0 - movdqa %xmm3,160(%r10) - movdqa %xmm4,%xmm3 - paddd %xmm1,%xmm2 - pcmpeqd %xmm5,%xmm1 - movdqa %xmm0,176(%r10) - movdqa %xmm4,%xmm0 - - paddd %xmm2,%xmm3 - pcmpeqd %xmm5,%xmm2 - movdqa %xmm1,192(%r10) - movdqa %xmm4,%xmm1 - - paddd %xmm3,%xmm0 - pcmpeqd %xmm5,%xmm3 - movdqa %xmm2,208(%r10) - movdqa %xmm4,%xmm2 - - paddd %xmm0,%xmm1 - pcmpeqd %xmm5,%xmm0 - movdqa %xmm3,224(%r10) - movdqa %xmm4,%xmm3 - paddd %xmm1,%xmm2 - pcmpeqd %xmm5,%xmm1 - movdqa %xmm0,240(%r10) - movdqa %xmm4,%xmm0 - - paddd %xmm2,%xmm3 - pcmpeqd %xmm5,%xmm2 - movdqa %xmm1,256(%r10) - movdqa %xmm4,%xmm1 - - paddd %xmm3,%xmm0 - pcmpeqd %xmm5,%xmm3 - movdqa %xmm2,272(%r10) - movdqa %xmm4,%xmm2 - - paddd %xmm0,%xmm1 - pcmpeqd %xmm5,%xmm0 - movdqa %xmm3,288(%r10) - movdqa %xmm4,%xmm3 -.byte 0x67 - paddd %xmm1,%xmm2 - pcmpeqd %xmm5,%xmm1 - movdqa %xmm0,304(%r10) - - paddd %xmm2,%xmm3 - pcmpeqd %xmm5,%xmm2 - movdqa %xmm1,320(%r10) - - pcmpeqd %xmm5,%xmm3 - movdqa %xmm2,336(%r10) - - pand 64(%rdi),%xmm0 - pand 80(%rdi),%xmm1 - pand 96(%rdi),%xmm2 - movdqa %xmm3,352(%r10) - pand 112(%rdi),%xmm3 - por %xmm2,%xmm0 - por %xmm3,%xmm1 - movdqa -128(%rdi),%xmm4 - movdqa -112(%rdi),%xmm5 - movdqa -96(%rdi),%xmm2 - pand 112(%r10),%xmm4 - movdqa -80(%rdi),%xmm3 - pand 128(%r10),%xmm5 - por %xmm4,%xmm0 - pand 144(%r10),%xmm2 - por %xmm5,%xmm1 - pand 160(%r10),%xmm3 - por %xmm2,%xmm0 - por %xmm3,%xmm1 - movdqa -64(%rdi),%xmm4 - movdqa -48(%rdi),%xmm5 - movdqa -32(%rdi),%xmm2 - pand 176(%r10),%xmm4 - movdqa -16(%rdi),%xmm3 - pand 192(%r10),%xmm5 - por %xmm4,%xmm0 - pand 208(%r10),%xmm2 - por %xmm5,%xmm1 - pand 224(%r10),%xmm3 - por %xmm2,%xmm0 - por %xmm3,%xmm1 - movdqa 0(%rdi),%xmm4 - movdqa 16(%rdi),%xmm5 - movdqa 32(%rdi),%xmm2 - pand 240(%r10),%xmm4 - movdqa 48(%rdi),%xmm3 - pand 256(%r10),%xmm5 - por %xmm4,%xmm0 - pand 272(%r10),%xmm2 - por %xmm5,%xmm1 - pand 288(%r10),%xmm3 - por %xmm2,%xmm0 - por %xmm3,%xmm1 - pxor %xmm1,%xmm0 - pshufd $0x4e,%xmm0,%xmm1 - por %xmm1,%xmm0 - leaq 256(%rdi),%rdi -.byte 102,72,15,126,194 - leaq 64+32+8(%rsp),%rbx - - movq %rdx,%r9 - mulxq 0(%rsi),%r8,%rax - mulxq 8(%rsi),%r11,%r12 - addq %rax,%r11 - mulxq 16(%rsi),%rax,%r13 - adcq %rax,%r12 - adcq $0,%r13 - mulxq 24(%rsi),%rax,%r14 - - movq %r8,%r15 - imulq 32+8(%rsp),%r8 - xorq %rbp,%rbp - movq %r8,%rdx - - movq %rdi,8+8(%rsp) - - leaq 32(%rsi),%rsi - adcxq %rax,%r13 - adcxq %rbp,%r14 - - mulxq 0(%rcx),%rax,%r10 - adcxq %rax,%r15 - adoxq %r11,%r10 - mulxq 8(%rcx),%rax,%r11 - adcxq %rax,%r10 - adoxq %r12,%r11 - mulxq 16(%rcx),%rax,%r12 - movq 24+8(%rsp),%rdi - movq %r10,-32(%rbx) - adcxq %rax,%r11 - adoxq %r13,%r12 - mulxq 24(%rcx),%rax,%r15 - movq %r9,%rdx - movq %r11,-24(%rbx) - adcxq %rax,%r12 - adoxq %rbp,%r15 - leaq 32(%rcx),%rcx - movq %r12,-16(%rbx) - jmp .Lmulx4x_1st - -.align 32 -.Lmulx4x_1st: - adcxq %rbp,%r15 - mulxq 0(%rsi),%r10,%rax - adcxq %r14,%r10 - mulxq 8(%rsi),%r11,%r14 - adcxq %rax,%r11 - mulxq 16(%rsi),%r12,%rax - adcxq %r14,%r12 - mulxq 24(%rsi),%r13,%r14 -.byte 0x67,0x67 - movq %r8,%rdx - adcxq %rax,%r13 - adcxq %rbp,%r14 - leaq 32(%rsi),%rsi - leaq 32(%rbx),%rbx - - adoxq %r15,%r10 - mulxq 0(%rcx),%rax,%r15 - adcxq %rax,%r10 - adoxq %r15,%r11 - mulxq 8(%rcx),%rax,%r15 - adcxq %rax,%r11 - adoxq %r15,%r12 - mulxq 16(%rcx),%rax,%r15 - movq %r10,-40(%rbx) - adcxq %rax,%r12 - movq %r11,-32(%rbx) - adoxq %r15,%r13 - mulxq 24(%rcx),%rax,%r15 - movq %r9,%rdx - movq %r12,-24(%rbx) - adcxq %rax,%r13 - adoxq %rbp,%r15 - leaq 32(%rcx),%rcx - movq %r13,-16(%rbx) - - decq %rdi - jnz .Lmulx4x_1st - - movq 8(%rsp),%rax - adcq %rbp,%r15 - leaq (%rsi,%rax,1),%rsi - addq %r15,%r14 - movq 8+8(%rsp),%rdi - adcq %rbp,%rbp - movq %r14,-8(%rbx) - jmp .Lmulx4x_outer - -.align 32 -.Lmulx4x_outer: - leaq 16-256(%rbx),%r10 - pxor %xmm4,%xmm4 -.byte 0x67,0x67 - pxor %xmm5,%xmm5 - movdqa -128(%rdi),%xmm0 - movdqa -112(%rdi),%xmm1 - movdqa -96(%rdi),%xmm2 - pand 256(%r10),%xmm0 - movdqa -80(%rdi),%xmm3 - pand 272(%r10),%xmm1 - por %xmm0,%xmm4 - pand 288(%r10),%xmm2 - por %xmm1,%xmm5 - pand 304(%r10),%xmm3 - por %xmm2,%xmm4 - por %xmm3,%xmm5 - movdqa -64(%rdi),%xmm0 - movdqa -48(%rdi),%xmm1 - movdqa -32(%rdi),%xmm2 - pand 320(%r10),%xmm0 - movdqa -16(%rdi),%xmm3 - pand 336(%r10),%xmm1 - por %xmm0,%xmm4 - pand 352(%r10),%xmm2 - por %xmm1,%xmm5 - pand 368(%r10),%xmm3 - por %xmm2,%xmm4 - por %xmm3,%xmm5 - movdqa 0(%rdi),%xmm0 - movdqa 16(%rdi),%xmm1 - movdqa 32(%rdi),%xmm2 - pand 384(%r10),%xmm0 - movdqa 48(%rdi),%xmm3 - pand 400(%r10),%xmm1 - por %xmm0,%xmm4 - pand 416(%r10),%xmm2 - por %xmm1,%xmm5 - pand 432(%r10),%xmm3 - por %xmm2,%xmm4 - por %xmm3,%xmm5 - movdqa 64(%rdi),%xmm0 - movdqa 80(%rdi),%xmm1 - movdqa 96(%rdi),%xmm2 - pand 448(%r10),%xmm0 - movdqa 112(%rdi),%xmm3 - pand 464(%r10),%xmm1 - por %xmm0,%xmm4 - pand 480(%r10),%xmm2 - por %xmm1,%xmm5 - pand 496(%r10),%xmm3 - por %xmm2,%xmm4 - por %xmm3,%xmm5 - por %xmm5,%xmm4 - pshufd $0x4e,%xmm4,%xmm0 - por %xmm4,%xmm0 - leaq 256(%rdi),%rdi -.byte 102,72,15,126,194 - - movq %rbp,(%rbx) - leaq 32(%rbx,%rax,1),%rbx - mulxq 0(%rsi),%r8,%r11 - xorq %rbp,%rbp - movq %rdx,%r9 - mulxq 8(%rsi),%r14,%r12 - adoxq -32(%rbx),%r8 - adcxq %r14,%r11 - mulxq 16(%rsi),%r15,%r13 - adoxq -24(%rbx),%r11 - adcxq %r15,%r12 - mulxq 24(%rsi),%rdx,%r14 - adoxq -16(%rbx),%r12 - adcxq %rdx,%r13 - leaq (%rcx,%rax,1),%rcx - leaq 32(%rsi),%rsi - adoxq -8(%rbx),%r13 - adcxq %rbp,%r14 - adoxq %rbp,%r14 - - movq %r8,%r15 - imulq 32+8(%rsp),%r8 - - movq %r8,%rdx - xorq %rbp,%rbp - movq %rdi,8+8(%rsp) - - mulxq 0(%rcx),%rax,%r10 - adcxq %rax,%r15 - adoxq %r11,%r10 - mulxq 8(%rcx),%rax,%r11 - adcxq %rax,%r10 - adoxq %r12,%r11 - mulxq 16(%rcx),%rax,%r12 - adcxq %rax,%r11 - adoxq %r13,%r12 - mulxq 24(%rcx),%rax,%r15 - movq %r9,%rdx - movq 24+8(%rsp),%rdi - movq %r10,-32(%rbx) - adcxq %rax,%r12 - movq %r11,-24(%rbx) - adoxq %rbp,%r15 - movq %r12,-16(%rbx) - leaq 32(%rcx),%rcx - jmp .Lmulx4x_inner - -.align 32 -.Lmulx4x_inner: - mulxq 0(%rsi),%r10,%rax - adcxq %rbp,%r15 - adoxq %r14,%r10 - mulxq 8(%rsi),%r11,%r14 - adcxq 0(%rbx),%r10 - adoxq %rax,%r11 - mulxq 16(%rsi),%r12,%rax - adcxq 8(%rbx),%r11 - adoxq %r14,%r12 - mulxq 24(%rsi),%r13,%r14 - movq %r8,%rdx - adcxq 16(%rbx),%r12 - adoxq %rax,%r13 - adcxq 24(%rbx),%r13 - adoxq %rbp,%r14 - leaq 32(%rsi),%rsi - leaq 32(%rbx),%rbx - adcxq %rbp,%r14 - - adoxq %r15,%r10 - mulxq 0(%rcx),%rax,%r15 - adcxq %rax,%r10 - adoxq %r15,%r11 - mulxq 8(%rcx),%rax,%r15 - adcxq %rax,%r11 - adoxq %r15,%r12 - mulxq 16(%rcx),%rax,%r15 - movq %r10,-40(%rbx) - adcxq %rax,%r12 - adoxq %r15,%r13 - movq %r11,-32(%rbx) - mulxq 24(%rcx),%rax,%r15 - movq %r9,%rdx - leaq 32(%rcx),%rcx - movq %r12,-24(%rbx) - adcxq %rax,%r13 - adoxq %rbp,%r15 - movq %r13,-16(%rbx) - - decq %rdi - jnz .Lmulx4x_inner - - movq 0+8(%rsp),%rax - adcq %rbp,%r15 - subq 0(%rbx),%rdi - movq 8+8(%rsp),%rdi - movq 16+8(%rsp),%r10 - adcq %r15,%r14 - leaq (%rsi,%rax,1),%rsi - adcq %rbp,%rbp - movq %r14,-8(%rbx) - - cmpq %r10,%rdi - jb .Lmulx4x_outer - - movq -8(%rcx),%r10 - movq %rbp,%r8 - movq (%rcx,%rax,1),%r12 - leaq (%rcx,%rax,1),%rbp - movq %rax,%rcx - leaq (%rbx,%rax,1),%rdi - xorl %eax,%eax - xorq %r15,%r15 - subq %r14,%r10 - adcq %r15,%r15 - orq %r15,%r8 - sarq $3+2,%rcx - subq %r8,%rax - movq 56+8(%rsp),%rdx - decq %r12 - movq 8(%rbp),%r13 - xorq %r8,%r8 - movq 16(%rbp),%r14 - movq 24(%rbp),%r15 - jmp .Lsqrx4x_sub_entry -.cfi_endproc -.size mulx4x_internal,.-mulx4x_internal -.type bn_powerx5,@function -.align 32 -bn_powerx5: -.cfi_startproc - movq %rsp,%rax -.cfi_def_cfa_register %rax -.Lpowerx5_enter: - pushq %rbx -.cfi_offset %rbx,-16 - pushq %rbp -.cfi_offset %rbp,-24 - pushq %r12 -.cfi_offset %r12,-32 - pushq %r13 -.cfi_offset %r13,-40 - pushq %r14 -.cfi_offset %r14,-48 - pushq %r15 -.cfi_offset %r15,-56 -.Lpowerx5_prologue: - - shll $3,%r9d - leaq (%r9,%r9,2),%r10 - negq %r9 - movq (%r8),%r8 - - - - - - - - - leaq -320(%rsp,%r9,2),%r11 - movq %rsp,%rbp - subq %rdi,%r11 - andq $4095,%r11 - cmpq %r11,%r10 - jb .Lpwrx_sp_alt - subq %r11,%rbp - leaq -320(%rbp,%r9,2),%rbp - jmp .Lpwrx_sp_done - -.align 32 -.Lpwrx_sp_alt: - leaq 4096-320(,%r9,2),%r10 - leaq -320(%rbp,%r9,2),%rbp - subq %r10,%r11 - movq $0,%r10 - cmovcq %r10,%r11 - subq %r11,%rbp -.Lpwrx_sp_done: - andq $-64,%rbp - movq %rsp,%r11 - subq %rbp,%r11 - andq $-4096,%r11 - leaq (%r11,%rbp,1),%rsp - movq (%rsp),%r10 - cmpq %rbp,%rsp - ja .Lpwrx_page_walk - jmp .Lpwrx_page_walk_done - -.Lpwrx_page_walk: - leaq -4096(%rsp),%rsp - movq (%rsp),%r10 - cmpq %rbp,%rsp - ja .Lpwrx_page_walk -.Lpwrx_page_walk_done: - - movq %r9,%r10 - negq %r9 - - - - - - - - - - - - - pxor %xmm0,%xmm0 -.byte 102,72,15,110,207 -.byte 102,72,15,110,209 -.byte 102,73,15,110,218 -.byte 102,72,15,110,226 - movq %r8,32(%rsp) - movq %rax,40(%rsp) -.cfi_escape 0x0f,0x05,0x77,0x28,0x06,0x23,0x08 -.Lpowerx5_body: - - call __bn_sqrx8x_internal - call __bn_postx4x_internal - call __bn_sqrx8x_internal - call __bn_postx4x_internal - call __bn_sqrx8x_internal - call __bn_postx4x_internal - call __bn_sqrx8x_internal - call __bn_postx4x_internal - call __bn_sqrx8x_internal - call __bn_postx4x_internal - - movq %r10,%r9 - movq %rsi,%rdi -.byte 102,72,15,126,209 -.byte 102,72,15,126,226 - movq 40(%rsp),%rax - - call mulx4x_internal - - movq 40(%rsp),%rsi -.cfi_def_cfa %rsi,8 - movq $1,%rax - - movq -48(%rsi),%r15 -.cfi_restore %r15 - movq -40(%rsi),%r14 -.cfi_restore %r14 - movq -32(%rsi),%r13 -.cfi_restore %r13 - movq -24(%rsi),%r12 -.cfi_restore %r12 - movq -16(%rsi),%rbp -.cfi_restore %rbp - movq -8(%rsi),%rbx -.cfi_restore %rbx - leaq (%rsi),%rsp -.cfi_def_cfa_register %rsp -.Lpowerx5_epilogue: - .byte 0xf3,0xc3 -.cfi_endproc -.size bn_powerx5,.-bn_powerx5 - -.globl GFp_bn_sqrx8x_internal -.hidden GFp_bn_sqrx8x_internal -.type GFp_bn_sqrx8x_internal,@function -.align 32 -GFp_bn_sqrx8x_internal: -__bn_sqrx8x_internal: -.cfi_startproc - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - leaq 48+8(%rsp),%rdi - leaq (%rsi,%r9,1),%rbp - movq %r9,0+8(%rsp) - movq %rbp,8+8(%rsp) - jmp .Lsqr8x_zero_start - -.align 32 -.byte 0x66,0x66,0x66,0x2e,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00 -.Lsqrx8x_zero: -.byte 0x3e - movdqa %xmm0,0(%rdi) - movdqa %xmm0,16(%rdi) - movdqa %xmm0,32(%rdi) - movdqa %xmm0,48(%rdi) -.Lsqr8x_zero_start: - movdqa %xmm0,64(%rdi) - movdqa %xmm0,80(%rdi) - movdqa %xmm0,96(%rdi) - movdqa %xmm0,112(%rdi) - leaq 128(%rdi),%rdi - subq $64,%r9 - jnz .Lsqrx8x_zero - - movq 0(%rsi),%rdx - - xorq %r10,%r10 - xorq %r11,%r11 - xorq %r12,%r12 - xorq %r13,%r13 - xorq %r14,%r14 - xorq %r15,%r15 - leaq 48+8(%rsp),%rdi - xorq %rbp,%rbp - jmp .Lsqrx8x_outer_loop - -.align 32 -.Lsqrx8x_outer_loop: - mulxq 8(%rsi),%r8,%rax - adcxq %r9,%r8 - adoxq %rax,%r10 - mulxq 16(%rsi),%r9,%rax - adcxq %r10,%r9 - adoxq %rax,%r11 -.byte 0xc4,0xe2,0xab,0xf6,0x86,0x18,0x00,0x00,0x00 - adcxq %r11,%r10 - adoxq %rax,%r12 -.byte 0xc4,0xe2,0xa3,0xf6,0x86,0x20,0x00,0x00,0x00 - adcxq %r12,%r11 - adoxq %rax,%r13 - mulxq 40(%rsi),%r12,%rax - adcxq %r13,%r12 - adoxq %rax,%r14 - mulxq 48(%rsi),%r13,%rax - adcxq %r14,%r13 - adoxq %r15,%rax - mulxq 56(%rsi),%r14,%r15 - movq 8(%rsi),%rdx - adcxq %rax,%r14 - adoxq %rbp,%r15 - adcq 64(%rdi),%r15 - movq %r8,8(%rdi) - movq %r9,16(%rdi) - sbbq %rcx,%rcx - xorq %rbp,%rbp - - - mulxq 16(%rsi),%r8,%rbx - mulxq 24(%rsi),%r9,%rax - adcxq %r10,%r8 - adoxq %rbx,%r9 - mulxq 32(%rsi),%r10,%rbx - adcxq %r11,%r9 - adoxq %rax,%r10 -.byte 0xc4,0xe2,0xa3,0xf6,0x86,0x28,0x00,0x00,0x00 - adcxq %r12,%r10 - adoxq %rbx,%r11 -.byte 0xc4,0xe2,0x9b,0xf6,0x9e,0x30,0x00,0x00,0x00 - adcxq %r13,%r11 - adoxq %r14,%r12 -.byte 0xc4,0x62,0x93,0xf6,0xb6,0x38,0x00,0x00,0x00 - movq 16(%rsi),%rdx - adcxq %rax,%r12 - adoxq %rbx,%r13 - adcxq %r15,%r13 - adoxq %rbp,%r14 - adcxq %rbp,%r14 - - movq %r8,24(%rdi) - movq %r9,32(%rdi) - - mulxq 24(%rsi),%r8,%rbx - mulxq 32(%rsi),%r9,%rax - adcxq %r10,%r8 - adoxq %rbx,%r9 - mulxq 40(%rsi),%r10,%rbx - adcxq %r11,%r9 - adoxq %rax,%r10 -.byte 0xc4,0xe2,0xa3,0xf6,0x86,0x30,0x00,0x00,0x00 - adcxq %r12,%r10 - adoxq %r13,%r11 -.byte 0xc4,0x62,0x9b,0xf6,0xae,0x38,0x00,0x00,0x00 -.byte 0x3e - movq 24(%rsi),%rdx - adcxq %rbx,%r11 - adoxq %rax,%r12 - adcxq %r14,%r12 - movq %r8,40(%rdi) - movq %r9,48(%rdi) - mulxq 32(%rsi),%r8,%rax - adoxq %rbp,%r13 - adcxq %rbp,%r13 - - mulxq 40(%rsi),%r9,%rbx - adcxq %r10,%r8 - adoxq %rax,%r9 - mulxq 48(%rsi),%r10,%rax - adcxq %r11,%r9 - adoxq %r12,%r10 - mulxq 56(%rsi),%r11,%r12 - movq 32(%rsi),%rdx - movq 40(%rsi),%r14 - adcxq %rbx,%r10 - adoxq %rax,%r11 - movq 48(%rsi),%r15 - adcxq %r13,%r11 - adoxq %rbp,%r12 - adcxq %rbp,%r12 - - movq %r8,56(%rdi) - movq %r9,64(%rdi) - - mulxq %r14,%r9,%rax - movq 56(%rsi),%r8 - adcxq %r10,%r9 - mulxq %r15,%r10,%rbx - adoxq %rax,%r10 - adcxq %r11,%r10 - mulxq %r8,%r11,%rax - movq %r14,%rdx - adoxq %rbx,%r11 - adcxq %r12,%r11 - - adcxq %rbp,%rax - - mulxq %r15,%r14,%rbx - mulxq %r8,%r12,%r13 - movq %r15,%rdx - leaq 64(%rsi),%rsi - adcxq %r14,%r11 - adoxq %rbx,%r12 - adcxq %rax,%r12 - adoxq %rbp,%r13 - -.byte 0x67,0x67 - mulxq %r8,%r8,%r14 - adcxq %r8,%r13 - adcxq %rbp,%r14 - - cmpq 8+8(%rsp),%rsi - je .Lsqrx8x_outer_break - - negq %rcx - movq $-8,%rcx - movq %rbp,%r15 - movq 64(%rdi),%r8 - adcxq 72(%rdi),%r9 - adcxq 80(%rdi),%r10 - adcxq 88(%rdi),%r11 - adcq 96(%rdi),%r12 - adcq 104(%rdi),%r13 - adcq 112(%rdi),%r14 - adcq 120(%rdi),%r15 - leaq (%rsi),%rbp - leaq 128(%rdi),%rdi - sbbq %rax,%rax - - movq -64(%rsi),%rdx - movq %rax,16+8(%rsp) - movq %rdi,24+8(%rsp) - - - xorl %eax,%eax - jmp .Lsqrx8x_loop - -.align 32 -.Lsqrx8x_loop: - movq %r8,%rbx - mulxq 0(%rbp),%rax,%r8 - adcxq %rax,%rbx - adoxq %r9,%r8 - - mulxq 8(%rbp),%rax,%r9 - adcxq %rax,%r8 - adoxq %r10,%r9 - - mulxq 16(%rbp),%rax,%r10 - adcxq %rax,%r9 - adoxq %r11,%r10 - - mulxq 24(%rbp),%rax,%r11 - adcxq %rax,%r10 - adoxq %r12,%r11 - -.byte 0xc4,0x62,0xfb,0xf6,0xa5,0x20,0x00,0x00,0x00 - adcxq %rax,%r11 - adoxq %r13,%r12 - - mulxq 40(%rbp),%rax,%r13 - adcxq %rax,%r12 - adoxq %r14,%r13 - - mulxq 48(%rbp),%rax,%r14 - movq %rbx,(%rdi,%rcx,8) - movl $0,%ebx - adcxq %rax,%r13 - adoxq %r15,%r14 - -.byte 0xc4,0x62,0xfb,0xf6,0xbd,0x38,0x00,0x00,0x00 - movq 8(%rsi,%rcx,8),%rdx - adcxq %rax,%r14 - adoxq %rbx,%r15 - adcxq %rbx,%r15 - -.byte 0x67 - incq %rcx - jnz .Lsqrx8x_loop - - leaq 64(%rbp),%rbp - movq $-8,%rcx - cmpq 8+8(%rsp),%rbp - je .Lsqrx8x_break - - subq 16+8(%rsp),%rbx -.byte 0x66 - movq -64(%rsi),%rdx - adcxq 0(%rdi),%r8 - adcxq 8(%rdi),%r9 - adcq 16(%rdi),%r10 - adcq 24(%rdi),%r11 - adcq 32(%rdi),%r12 - adcq 40(%rdi),%r13 - adcq 48(%rdi),%r14 - adcq 56(%rdi),%r15 - leaq 64(%rdi),%rdi -.byte 0x67 - sbbq %rax,%rax - xorl %ebx,%ebx - movq %rax,16+8(%rsp) - jmp .Lsqrx8x_loop - -.align 32 -.Lsqrx8x_break: - xorq %rbp,%rbp - subq 16+8(%rsp),%rbx - adcxq %rbp,%r8 - movq 24+8(%rsp),%rcx - adcxq %rbp,%r9 - movq 0(%rsi),%rdx - adcq $0,%r10 - movq %r8,0(%rdi) - adcq $0,%r11 - adcq $0,%r12 - adcq $0,%r13 - adcq $0,%r14 - adcq $0,%r15 - cmpq %rcx,%rdi - je .Lsqrx8x_outer_loop - - movq %r9,8(%rdi) - movq 8(%rcx),%r9 - movq %r10,16(%rdi) - movq 16(%rcx),%r10 - movq %r11,24(%rdi) - movq 24(%rcx),%r11 - movq %r12,32(%rdi) - movq 32(%rcx),%r12 - movq %r13,40(%rdi) - movq 40(%rcx),%r13 - movq %r14,48(%rdi) - movq 48(%rcx),%r14 - movq %r15,56(%rdi) - movq 56(%rcx),%r15 - movq %rcx,%rdi - jmp .Lsqrx8x_outer_loop - -.align 32 -.Lsqrx8x_outer_break: - movq %r9,72(%rdi) -.byte 102,72,15,126,217 - movq %r10,80(%rdi) - movq %r11,88(%rdi) - movq %r12,96(%rdi) - movq %r13,104(%rdi) - movq %r14,112(%rdi) - leaq 48+8(%rsp),%rdi - movq (%rsi,%rcx,1),%rdx - - movq 8(%rdi),%r11 - xorq %r10,%r10 - movq 0+8(%rsp),%r9 - adoxq %r11,%r11 - movq 16(%rdi),%r12 - movq 24(%rdi),%r13 - - -.align 32 -.Lsqrx4x_shift_n_add: - mulxq %rdx,%rax,%rbx - adoxq %r12,%r12 - adcxq %r10,%rax -.byte 0x48,0x8b,0x94,0x0e,0x08,0x00,0x00,0x00 -.byte 0x4c,0x8b,0x97,0x20,0x00,0x00,0x00 - adoxq %r13,%r13 - adcxq %r11,%rbx - movq 40(%rdi),%r11 - movq %rax,0(%rdi) - movq %rbx,8(%rdi) - - mulxq %rdx,%rax,%rbx - adoxq %r10,%r10 - adcxq %r12,%rax - movq 16(%rsi,%rcx,1),%rdx - movq 48(%rdi),%r12 - adoxq %r11,%r11 - adcxq %r13,%rbx - movq 56(%rdi),%r13 - movq %rax,16(%rdi) - movq %rbx,24(%rdi) - - mulxq %rdx,%rax,%rbx - adoxq %r12,%r12 - adcxq %r10,%rax - movq 24(%rsi,%rcx,1),%rdx - leaq 32(%rcx),%rcx - movq 64(%rdi),%r10 - adoxq %r13,%r13 - adcxq %r11,%rbx - movq 72(%rdi),%r11 - movq %rax,32(%rdi) - movq %rbx,40(%rdi) - - mulxq %rdx,%rax,%rbx - adoxq %r10,%r10 - adcxq %r12,%rax - jrcxz .Lsqrx4x_shift_n_add_break -.byte 0x48,0x8b,0x94,0x0e,0x00,0x00,0x00,0x00 - adoxq %r11,%r11 - adcxq %r13,%rbx - movq 80(%rdi),%r12 - movq 88(%rdi),%r13 - movq %rax,48(%rdi) - movq %rbx,56(%rdi) - leaq 64(%rdi),%rdi - nop - jmp .Lsqrx4x_shift_n_add - -.align 32 -.Lsqrx4x_shift_n_add_break: - adcxq %r13,%rbx - movq %rax,48(%rdi) - movq %rbx,56(%rdi) - leaq 64(%rdi),%rdi -.byte 102,72,15,126,213 -__bn_sqrx8x_reduction: - xorl %eax,%eax - movq 32+8(%rsp),%rbx - movq 48+8(%rsp),%rdx - leaq -64(%rbp,%r9,1),%rcx - - movq %rcx,0+8(%rsp) - movq %rdi,8+8(%rsp) - - leaq 48+8(%rsp),%rdi - jmp .Lsqrx8x_reduction_loop - -.align 32 -.Lsqrx8x_reduction_loop: - movq 8(%rdi),%r9 - movq 16(%rdi),%r10 - movq 24(%rdi),%r11 - movq 32(%rdi),%r12 - movq %rdx,%r8 - imulq %rbx,%rdx - movq 40(%rdi),%r13 - movq 48(%rdi),%r14 - movq 56(%rdi),%r15 - movq %rax,24+8(%rsp) - - leaq 64(%rdi),%rdi - xorq %rsi,%rsi - movq $-8,%rcx - jmp .Lsqrx8x_reduce - -.align 32 -.Lsqrx8x_reduce: - movq %r8,%rbx - mulxq 0(%rbp),%rax,%r8 - adcxq %rbx,%rax - adoxq %r9,%r8 - - mulxq 8(%rbp),%rbx,%r9 - adcxq %rbx,%r8 - adoxq %r10,%r9 - - mulxq 16(%rbp),%rbx,%r10 - adcxq %rbx,%r9 - adoxq %r11,%r10 - - mulxq 24(%rbp),%rbx,%r11 - adcxq %rbx,%r10 - adoxq %r12,%r11 - -.byte 0xc4,0x62,0xe3,0xf6,0xa5,0x20,0x00,0x00,0x00 - movq %rdx,%rax - movq %r8,%rdx - adcxq %rbx,%r11 - adoxq %r13,%r12 - - mulxq 32+8(%rsp),%rbx,%rdx - movq %rax,%rdx - movq %rax,64+48+8(%rsp,%rcx,8) - - mulxq 40(%rbp),%rax,%r13 - adcxq %rax,%r12 - adoxq %r14,%r13 - - mulxq 48(%rbp),%rax,%r14 - adcxq %rax,%r13 - adoxq %r15,%r14 - - mulxq 56(%rbp),%rax,%r15 - movq %rbx,%rdx - adcxq %rax,%r14 - adoxq %rsi,%r15 - adcxq %rsi,%r15 - -.byte 0x67,0x67,0x67 - incq %rcx - jnz .Lsqrx8x_reduce - - movq %rsi,%rax - cmpq 0+8(%rsp),%rbp - jae .Lsqrx8x_no_tail - - movq 48+8(%rsp),%rdx - addq 0(%rdi),%r8 - leaq 64(%rbp),%rbp - movq $-8,%rcx - adcxq 8(%rdi),%r9 - adcxq 16(%rdi),%r10 - adcq 24(%rdi),%r11 - adcq 32(%rdi),%r12 - adcq 40(%rdi),%r13 - adcq 48(%rdi),%r14 - adcq 56(%rdi),%r15 - leaq 64(%rdi),%rdi - sbbq %rax,%rax - - xorq %rsi,%rsi - movq %rax,16+8(%rsp) - jmp .Lsqrx8x_tail - -.align 32 -.Lsqrx8x_tail: - movq %r8,%rbx - mulxq 0(%rbp),%rax,%r8 - adcxq %rax,%rbx - adoxq %r9,%r8 - - mulxq 8(%rbp),%rax,%r9 - adcxq %rax,%r8 - adoxq %r10,%r9 - - mulxq 16(%rbp),%rax,%r10 - adcxq %rax,%r9 - adoxq %r11,%r10 - - mulxq 24(%rbp),%rax,%r11 - adcxq %rax,%r10 - adoxq %r12,%r11 - -.byte 0xc4,0x62,0xfb,0xf6,0xa5,0x20,0x00,0x00,0x00 - adcxq %rax,%r11 - adoxq %r13,%r12 - - mulxq 40(%rbp),%rax,%r13 - adcxq %rax,%r12 - adoxq %r14,%r13 - - mulxq 48(%rbp),%rax,%r14 - adcxq %rax,%r13 - adoxq %r15,%r14 - - mulxq 56(%rbp),%rax,%r15 - movq 72+48+8(%rsp,%rcx,8),%rdx - adcxq %rax,%r14 - adoxq %rsi,%r15 - movq %rbx,(%rdi,%rcx,8) - movq %r8,%rbx - adcxq %rsi,%r15 - - incq %rcx - jnz .Lsqrx8x_tail - - cmpq 0+8(%rsp),%rbp - jae .Lsqrx8x_tail_done - - subq 16+8(%rsp),%rsi - movq 48+8(%rsp),%rdx - leaq 64(%rbp),%rbp - adcq 0(%rdi),%r8 - adcq 8(%rdi),%r9 - adcq 16(%rdi),%r10 - adcq 24(%rdi),%r11 - adcq 32(%rdi),%r12 - adcq 40(%rdi),%r13 - adcq 48(%rdi),%r14 - adcq 56(%rdi),%r15 - leaq 64(%rdi),%rdi - sbbq %rax,%rax - subq $8,%rcx - - xorq %rsi,%rsi - movq %rax,16+8(%rsp) - jmp .Lsqrx8x_tail - -.align 32 -.Lsqrx8x_tail_done: - xorq %rax,%rax - addq 24+8(%rsp),%r8 - adcq $0,%r9 - adcq $0,%r10 - adcq $0,%r11 - adcq $0,%r12 - adcq $0,%r13 - adcq $0,%r14 - adcq $0,%r15 - adcq $0,%rax - - subq 16+8(%rsp),%rsi -.Lsqrx8x_no_tail: - adcq 0(%rdi),%r8 -.byte 102,72,15,126,217 - adcq 8(%rdi),%r9 - movq 56(%rbp),%rsi -.byte 102,72,15,126,213 - adcq 16(%rdi),%r10 - adcq 24(%rdi),%r11 - adcq 32(%rdi),%r12 - adcq 40(%rdi),%r13 - adcq 48(%rdi),%r14 - adcq 56(%rdi),%r15 - adcq $0,%rax - - movq 32+8(%rsp),%rbx - movq 64(%rdi,%rcx,1),%rdx - - movq %r8,0(%rdi) - leaq 64(%rdi),%r8 - movq %r9,8(%rdi) - movq %r10,16(%rdi) - movq %r11,24(%rdi) - movq %r12,32(%rdi) - movq %r13,40(%rdi) - movq %r14,48(%rdi) - movq %r15,56(%rdi) - - leaq 64(%rdi,%rcx,1),%rdi - cmpq 8+8(%rsp),%r8 - jb .Lsqrx8x_reduction_loop - .byte 0xf3,0xc3 -.cfi_endproc -.size GFp_bn_sqrx8x_internal,.-GFp_bn_sqrx8x_internal -.align 32 -.type __bn_postx4x_internal,@function -__bn_postx4x_internal: -.cfi_startproc - movq 0(%rbp),%r12 - movq %rcx,%r10 - movq %rcx,%r9 - negq %rax - sarq $3+2,%rcx - -.byte 102,72,15,126,202 -.byte 102,72,15,126,206 - decq %r12 - movq 8(%rbp),%r13 - xorq %r8,%r8 - movq 16(%rbp),%r14 - movq 24(%rbp),%r15 - jmp .Lsqrx4x_sub_entry - -.align 16 -.Lsqrx4x_sub: - movq 0(%rbp),%r12 - movq 8(%rbp),%r13 - movq 16(%rbp),%r14 - movq 24(%rbp),%r15 -.Lsqrx4x_sub_entry: - andnq %rax,%r12,%r12 - leaq 32(%rbp),%rbp - andnq %rax,%r13,%r13 - andnq %rax,%r14,%r14 - andnq %rax,%r15,%r15 - - negq %r8 - adcq 0(%rdi),%r12 - adcq 8(%rdi),%r13 - adcq 16(%rdi),%r14 - adcq 24(%rdi),%r15 - movq %r12,0(%rdx) - leaq 32(%rdi),%rdi - movq %r13,8(%rdx) - sbbq %r8,%r8 - movq %r14,16(%rdx) - movq %r15,24(%rdx) - leaq 32(%rdx),%rdx - - incq %rcx - jnz .Lsqrx4x_sub - - negq %r9 - - .byte 0xf3,0xc3 -.cfi_endproc -.size __bn_postx4x_internal,.-__bn_postx4x_internal -.globl GFp_bn_scatter5 -.hidden GFp_bn_scatter5 -.type GFp_bn_scatter5,@function -.align 16 -GFp_bn_scatter5: -.cfi_startproc - cmpl $0,%esi - jz .Lscatter_epilogue - leaq (%rdx,%rcx,8),%rdx -.Lscatter: - movq (%rdi),%rax - leaq 8(%rdi),%rdi - movq %rax,(%rdx) - leaq 256(%rdx),%rdx - subl $1,%esi - jnz .Lscatter -.Lscatter_epilogue: - .byte 0xf3,0xc3 -.cfi_endproc -.size GFp_bn_scatter5,.-GFp_bn_scatter5 - -.globl GFp_bn_gather5 -.hidden GFp_bn_gather5 -.type GFp_bn_gather5,@function -.align 32 -GFp_bn_gather5: -.cfi_startproc -.LSEH_begin_GFp_bn_gather5: - -.byte 0x4c,0x8d,0x14,0x24 -.cfi_def_cfa_register %r10 -.byte 0x48,0x81,0xec,0x08,0x01,0x00,0x00 - leaq .Linc(%rip),%rax - andq $-16,%rsp - - movd %ecx,%xmm5 - movdqa 0(%rax),%xmm0 - movdqa 16(%rax),%xmm1 - leaq 128(%rdx),%r11 - leaq 128(%rsp),%rax - - pshufd $0,%xmm5,%xmm5 - movdqa %xmm1,%xmm4 - movdqa %xmm1,%xmm2 - paddd %xmm0,%xmm1 - pcmpeqd %xmm5,%xmm0 - movdqa %xmm4,%xmm3 - - paddd %xmm1,%xmm2 - pcmpeqd %xmm5,%xmm1 - movdqa %xmm0,-128(%rax) - movdqa %xmm4,%xmm0 - - paddd %xmm2,%xmm3 - pcmpeqd %xmm5,%xmm2 - movdqa %xmm1,-112(%rax) - movdqa %xmm4,%xmm1 - - paddd %xmm3,%xmm0 - pcmpeqd %xmm5,%xmm3 - movdqa %xmm2,-96(%rax) - movdqa %xmm4,%xmm2 - paddd %xmm0,%xmm1 - pcmpeqd %xmm5,%xmm0 - movdqa %xmm3,-80(%rax) - movdqa %xmm4,%xmm3 - - paddd %xmm1,%xmm2 - pcmpeqd %xmm5,%xmm1 - movdqa %xmm0,-64(%rax) - movdqa %xmm4,%xmm0 - - paddd %xmm2,%xmm3 - pcmpeqd %xmm5,%xmm2 - movdqa %xmm1,-48(%rax) - movdqa %xmm4,%xmm1 - - paddd %xmm3,%xmm0 - pcmpeqd %xmm5,%xmm3 - movdqa %xmm2,-32(%rax) - movdqa %xmm4,%xmm2 - paddd %xmm0,%xmm1 - pcmpeqd %xmm5,%xmm0 - movdqa %xmm3,-16(%rax) - movdqa %xmm4,%xmm3 - - paddd %xmm1,%xmm2 - pcmpeqd %xmm5,%xmm1 - movdqa %xmm0,0(%rax) - movdqa %xmm4,%xmm0 - - paddd %xmm2,%xmm3 - pcmpeqd %xmm5,%xmm2 - movdqa %xmm1,16(%rax) - movdqa %xmm4,%xmm1 - - paddd %xmm3,%xmm0 - pcmpeqd %xmm5,%xmm3 - movdqa %xmm2,32(%rax) - movdqa %xmm4,%xmm2 - paddd %xmm0,%xmm1 - pcmpeqd %xmm5,%xmm0 - movdqa %xmm3,48(%rax) - movdqa %xmm4,%xmm3 - - paddd %xmm1,%xmm2 - pcmpeqd %xmm5,%xmm1 - movdqa %xmm0,64(%rax) - movdqa %xmm4,%xmm0 - - paddd %xmm2,%xmm3 - pcmpeqd %xmm5,%xmm2 - movdqa %xmm1,80(%rax) - movdqa %xmm4,%xmm1 - - paddd %xmm3,%xmm0 - pcmpeqd %xmm5,%xmm3 - movdqa %xmm2,96(%rax) - movdqa %xmm4,%xmm2 - movdqa %xmm3,112(%rax) - jmp .Lgather - -.align 32 -.Lgather: - pxor %xmm4,%xmm4 - pxor %xmm5,%xmm5 - movdqa -128(%r11),%xmm0 - movdqa -112(%r11),%xmm1 - movdqa -96(%r11),%xmm2 - pand -128(%rax),%xmm0 - movdqa -80(%r11),%xmm3 - pand -112(%rax),%xmm1 - por %xmm0,%xmm4 - pand -96(%rax),%xmm2 - por %xmm1,%xmm5 - pand -80(%rax),%xmm3 - por %xmm2,%xmm4 - por %xmm3,%xmm5 - movdqa -64(%r11),%xmm0 - movdqa -48(%r11),%xmm1 - movdqa -32(%r11),%xmm2 - pand -64(%rax),%xmm0 - movdqa -16(%r11),%xmm3 - pand -48(%rax),%xmm1 - por %xmm0,%xmm4 - pand -32(%rax),%xmm2 - por %xmm1,%xmm5 - pand -16(%rax),%xmm3 - por %xmm2,%xmm4 - por %xmm3,%xmm5 - movdqa 0(%r11),%xmm0 - movdqa 16(%r11),%xmm1 - movdqa 32(%r11),%xmm2 - pand 0(%rax),%xmm0 - movdqa 48(%r11),%xmm3 - pand 16(%rax),%xmm1 - por %xmm0,%xmm4 - pand 32(%rax),%xmm2 - por %xmm1,%xmm5 - pand 48(%rax),%xmm3 - por %xmm2,%xmm4 - por %xmm3,%xmm5 - movdqa 64(%r11),%xmm0 - movdqa 80(%r11),%xmm1 - movdqa 96(%r11),%xmm2 - pand 64(%rax),%xmm0 - movdqa 112(%r11),%xmm3 - pand 80(%rax),%xmm1 - por %xmm0,%xmm4 - pand 96(%rax),%xmm2 - por %xmm1,%xmm5 - pand 112(%rax),%xmm3 - por %xmm2,%xmm4 - por %xmm3,%xmm5 - por %xmm5,%xmm4 - leaq 256(%r11),%r11 - pshufd $0x4e,%xmm4,%xmm0 - por %xmm4,%xmm0 - movq %xmm0,(%rdi) - leaq 8(%rdi),%rdi - subl $1,%esi - jnz .Lgather - - leaq (%r10),%rsp -.cfi_def_cfa_register %rsp - .byte 0xf3,0xc3 -.LSEH_end_GFp_bn_gather5: -.cfi_endproc -.size GFp_bn_gather5,.-GFp_bn_gather5 -.align 64 -.Linc: -.long 0,0, 1,1 -.long 2,2, 2,2 -.byte 77,111,110,116,103,111,109,101,114,121,32,77,117,108,116,105,112,108,105,99,97,116,105,111,110,32,119,105,116,104,32,115,99,97,116,116,101,114,47,103,97,116,104,101,114,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 -#endif -.section .note.GNU-stack,"",@progbits diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/x86_64-mont5-macosx.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/x86_64-mont5-macosx.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/x86_64-mont5-macosx.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/x86_64-mont5-macosx.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,3784 +0,0 @@ -# This file is generated from a similarly-named Perl script in the BoringSSL -# source tree. Do not edit by hand. - -#if defined(__has_feature) -#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) -#define OPENSSL_NO_ASM -#endif -#endif - -#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) -.text - - - -.globl _GFp_bn_mul_mont_gather5 -.private_extern _GFp_bn_mul_mont_gather5 - -.p2align 6 -_GFp_bn_mul_mont_gather5: - - movl %r9d,%r9d - movq %rsp,%rax - - testl $7,%r9d - jnz L$mul_enter - leaq _GFp_ia32cap_P(%rip),%r11 - movl 8(%r11),%r11d - jmp L$mul4x_enter - -.p2align 4 -L$mul_enter: - movd 8(%rsp),%xmm5 - pushq %rbx - - pushq %rbp - - pushq %r12 - - pushq %r13 - - pushq %r14 - - pushq %r15 - - - negq %r9 - movq %rsp,%r11 - leaq -280(%rsp,%r9,8),%r10 - negq %r9 - andq $-1024,%r10 - - - - - - - - - - subq %r10,%r11 - andq $-4096,%r11 - leaq (%r10,%r11,1),%rsp - movq (%rsp),%r11 - cmpq %r10,%rsp - ja L$mul_page_walk - jmp L$mul_page_walk_done - -L$mul_page_walk: - leaq -4096(%rsp),%rsp - movq (%rsp),%r11 - cmpq %r10,%rsp - ja L$mul_page_walk -L$mul_page_walk_done: - - leaq L$inc(%rip),%r10 - movq %rax,8(%rsp,%r9,8) - -L$mul_body: - - leaq 128(%rdx),%r12 - movdqa 0(%r10),%xmm0 - movdqa 16(%r10),%xmm1 - leaq 24-112(%rsp,%r9,8),%r10 - andq $-16,%r10 - - pshufd $0,%xmm5,%xmm5 - movdqa %xmm1,%xmm4 - movdqa %xmm1,%xmm2 - paddd %xmm0,%xmm1 - pcmpeqd %xmm5,%xmm0 -.byte 0x67 - movdqa %xmm4,%xmm3 - paddd %xmm1,%xmm2 - pcmpeqd %xmm5,%xmm1 - movdqa %xmm0,112(%r10) - movdqa %xmm4,%xmm0 - - paddd %xmm2,%xmm3 - pcmpeqd %xmm5,%xmm2 - movdqa %xmm1,128(%r10) - movdqa %xmm4,%xmm1 - - paddd %xmm3,%xmm0 - pcmpeqd %xmm5,%xmm3 - movdqa %xmm2,144(%r10) - movdqa %xmm4,%xmm2 - - paddd %xmm0,%xmm1 - pcmpeqd %xmm5,%xmm0 - movdqa %xmm3,160(%r10) - movdqa %xmm4,%xmm3 - paddd %xmm1,%xmm2 - pcmpeqd %xmm5,%xmm1 - movdqa %xmm0,176(%r10) - movdqa %xmm4,%xmm0 - - paddd %xmm2,%xmm3 - pcmpeqd %xmm5,%xmm2 - movdqa %xmm1,192(%r10) - movdqa %xmm4,%xmm1 - - paddd %xmm3,%xmm0 - pcmpeqd %xmm5,%xmm3 - movdqa %xmm2,208(%r10) - movdqa %xmm4,%xmm2 - - paddd %xmm0,%xmm1 - pcmpeqd %xmm5,%xmm0 - movdqa %xmm3,224(%r10) - movdqa %xmm4,%xmm3 - paddd %xmm1,%xmm2 - pcmpeqd %xmm5,%xmm1 - movdqa %xmm0,240(%r10) - movdqa %xmm4,%xmm0 - - paddd %xmm2,%xmm3 - pcmpeqd %xmm5,%xmm2 - movdqa %xmm1,256(%r10) - movdqa %xmm4,%xmm1 - - paddd %xmm3,%xmm0 - pcmpeqd %xmm5,%xmm3 - movdqa %xmm2,272(%r10) - movdqa %xmm4,%xmm2 - - paddd %xmm0,%xmm1 - pcmpeqd %xmm5,%xmm0 - movdqa %xmm3,288(%r10) - movdqa %xmm4,%xmm3 - paddd %xmm1,%xmm2 - pcmpeqd %xmm5,%xmm1 - movdqa %xmm0,304(%r10) - - paddd %xmm2,%xmm3 -.byte 0x67 - pcmpeqd %xmm5,%xmm2 - movdqa %xmm1,320(%r10) - - pcmpeqd %xmm5,%xmm3 - movdqa %xmm2,336(%r10) - pand 64(%r12),%xmm0 - - pand 80(%r12),%xmm1 - pand 96(%r12),%xmm2 - movdqa %xmm3,352(%r10) - pand 112(%r12),%xmm3 - por %xmm2,%xmm0 - por %xmm3,%xmm1 - movdqa -128(%r12),%xmm4 - movdqa -112(%r12),%xmm5 - movdqa -96(%r12),%xmm2 - pand 112(%r10),%xmm4 - movdqa -80(%r12),%xmm3 - pand 128(%r10),%xmm5 - por %xmm4,%xmm0 - pand 144(%r10),%xmm2 - por %xmm5,%xmm1 - pand 160(%r10),%xmm3 - por %xmm2,%xmm0 - por %xmm3,%xmm1 - movdqa -64(%r12),%xmm4 - movdqa -48(%r12),%xmm5 - movdqa -32(%r12),%xmm2 - pand 176(%r10),%xmm4 - movdqa -16(%r12),%xmm3 - pand 192(%r10),%xmm5 - por %xmm4,%xmm0 - pand 208(%r10),%xmm2 - por %xmm5,%xmm1 - pand 224(%r10),%xmm3 - por %xmm2,%xmm0 - por %xmm3,%xmm1 - movdqa 0(%r12),%xmm4 - movdqa 16(%r12),%xmm5 - movdqa 32(%r12),%xmm2 - pand 240(%r10),%xmm4 - movdqa 48(%r12),%xmm3 - pand 256(%r10),%xmm5 - por %xmm4,%xmm0 - pand 272(%r10),%xmm2 - por %xmm5,%xmm1 - pand 288(%r10),%xmm3 - por %xmm2,%xmm0 - por %xmm3,%xmm1 - por %xmm1,%xmm0 - pshufd $0x4e,%xmm0,%xmm1 - por %xmm1,%xmm0 - leaq 256(%r12),%r12 -.byte 102,72,15,126,195 - - movq (%r8),%r8 - movq (%rsi),%rax - - xorq %r14,%r14 - xorq %r15,%r15 - - movq %r8,%rbp - mulq %rbx - movq %rax,%r10 - movq (%rcx),%rax - - imulq %r10,%rbp - movq %rdx,%r11 - - mulq %rbp - addq %rax,%r10 - movq 8(%rsi),%rax - adcq $0,%rdx - movq %rdx,%r13 - - leaq 1(%r15),%r15 - jmp L$1st_enter - -.p2align 4 -L$1st: - addq %rax,%r13 - movq (%rsi,%r15,8),%rax - adcq $0,%rdx - addq %r11,%r13 - movq %r10,%r11 - adcq $0,%rdx - movq %r13,-16(%rsp,%r15,8) - movq %rdx,%r13 - -L$1st_enter: - mulq %rbx - addq %rax,%r11 - movq (%rcx,%r15,8),%rax - adcq $0,%rdx - leaq 1(%r15),%r15 - movq %rdx,%r10 - - mulq %rbp - cmpq %r9,%r15 - jne L$1st - - - addq %rax,%r13 - adcq $0,%rdx - addq %r11,%r13 - adcq $0,%rdx - movq %r13,-16(%rsp,%r9,8) - movq %rdx,%r13 - movq %r10,%r11 - - xorq %rdx,%rdx - addq %r11,%r13 - adcq $0,%rdx - movq %r13,-8(%rsp,%r9,8) - movq %rdx,(%rsp,%r9,8) - - leaq 1(%r14),%r14 - jmp L$outer -.p2align 4 -L$outer: - leaq 24+128(%rsp,%r9,8),%rdx - andq $-16,%rdx - pxor %xmm4,%xmm4 - pxor %xmm5,%xmm5 - movdqa -128(%r12),%xmm0 - movdqa -112(%r12),%xmm1 - movdqa -96(%r12),%xmm2 - movdqa -80(%r12),%xmm3 - pand -128(%rdx),%xmm0 - pand -112(%rdx),%xmm1 - por %xmm0,%xmm4 - pand -96(%rdx),%xmm2 - por %xmm1,%xmm5 - pand -80(%rdx),%xmm3 - por %xmm2,%xmm4 - por %xmm3,%xmm5 - movdqa -64(%r12),%xmm0 - movdqa -48(%r12),%xmm1 - movdqa -32(%r12),%xmm2 - movdqa -16(%r12),%xmm3 - pand -64(%rdx),%xmm0 - pand -48(%rdx),%xmm1 - por %xmm0,%xmm4 - pand -32(%rdx),%xmm2 - por %xmm1,%xmm5 - pand -16(%rdx),%xmm3 - por %xmm2,%xmm4 - por %xmm3,%xmm5 - movdqa 0(%r12),%xmm0 - movdqa 16(%r12),%xmm1 - movdqa 32(%r12),%xmm2 - movdqa 48(%r12),%xmm3 - pand 0(%rdx),%xmm0 - pand 16(%rdx),%xmm1 - por %xmm0,%xmm4 - pand 32(%rdx),%xmm2 - por %xmm1,%xmm5 - pand 48(%rdx),%xmm3 - por %xmm2,%xmm4 - por %xmm3,%xmm5 - movdqa 64(%r12),%xmm0 - movdqa 80(%r12),%xmm1 - movdqa 96(%r12),%xmm2 - movdqa 112(%r12),%xmm3 - pand 64(%rdx),%xmm0 - pand 80(%rdx),%xmm1 - por %xmm0,%xmm4 - pand 96(%rdx),%xmm2 - por %xmm1,%xmm5 - pand 112(%rdx),%xmm3 - por %xmm2,%xmm4 - por %xmm3,%xmm5 - por %xmm5,%xmm4 - pshufd $0x4e,%xmm4,%xmm0 - por %xmm4,%xmm0 - leaq 256(%r12),%r12 - - movq (%rsi),%rax -.byte 102,72,15,126,195 - - xorq %r15,%r15 - movq %r8,%rbp - movq (%rsp),%r10 - - mulq %rbx - addq %rax,%r10 - movq (%rcx),%rax - adcq $0,%rdx - - imulq %r10,%rbp - movq %rdx,%r11 - - mulq %rbp - addq %rax,%r10 - movq 8(%rsi),%rax - adcq $0,%rdx - movq 8(%rsp),%r10 - movq %rdx,%r13 - - leaq 1(%r15),%r15 - jmp L$inner_enter - -.p2align 4 -L$inner: - addq %rax,%r13 - movq (%rsi,%r15,8),%rax - adcq $0,%rdx - addq %r10,%r13 - movq (%rsp,%r15,8),%r10 - adcq $0,%rdx - movq %r13,-16(%rsp,%r15,8) - movq %rdx,%r13 - -L$inner_enter: - mulq %rbx - addq %rax,%r11 - movq (%rcx,%r15,8),%rax - adcq $0,%rdx - addq %r11,%r10 - movq %rdx,%r11 - adcq $0,%r11 - leaq 1(%r15),%r15 - - mulq %rbp - cmpq %r9,%r15 - jne L$inner - - addq %rax,%r13 - adcq $0,%rdx - addq %r10,%r13 - movq (%rsp,%r9,8),%r10 - adcq $0,%rdx - movq %r13,-16(%rsp,%r9,8) - movq %rdx,%r13 - - xorq %rdx,%rdx - addq %r11,%r13 - adcq $0,%rdx - addq %r10,%r13 - adcq $0,%rdx - movq %r13,-8(%rsp,%r9,8) - movq %rdx,(%rsp,%r9,8) - - leaq 1(%r14),%r14 - cmpq %r9,%r14 - jb L$outer - - xorq %r14,%r14 - movq (%rsp),%rax - leaq (%rsp),%rsi - movq %r9,%r15 - jmp L$sub -.p2align 4 -L$sub: sbbq (%rcx,%r14,8),%rax - movq %rax,(%rdi,%r14,8) - movq 8(%rsi,%r14,8),%rax - leaq 1(%r14),%r14 - decq %r15 - jnz L$sub - - sbbq $0,%rax - movq $-1,%rbx - xorq %rax,%rbx - xorq %r14,%r14 - movq %r9,%r15 - -L$copy: - movq (%rdi,%r14,8),%rcx - movq (%rsp,%r14,8),%rdx - andq %rbx,%rcx - andq %rax,%rdx - movq %r14,(%rsp,%r14,8) - orq %rcx,%rdx - movq %rdx,(%rdi,%r14,8) - leaq 1(%r14),%r14 - subq $1,%r15 - jnz L$copy - - movq 8(%rsp,%r9,8),%rsi - - movq $1,%rax - - movq -48(%rsi),%r15 - - movq -40(%rsi),%r14 - - movq -32(%rsi),%r13 - - movq -24(%rsi),%r12 - - movq -16(%rsi),%rbp - - movq -8(%rsi),%rbx - - leaq (%rsi),%rsp - -L$mul_epilogue: - .byte 0xf3,0xc3 - - - -.p2align 5 -bn_mul4x_mont_gather5: - -.byte 0x67 - movq %rsp,%rax - -L$mul4x_enter: - andl $0x80108,%r11d - cmpl $0x80108,%r11d - je L$mulx4x_enter - pushq %rbx - - pushq %rbp - - pushq %r12 - - pushq %r13 - - pushq %r14 - - pushq %r15 - -L$mul4x_prologue: - -.byte 0x67 - shll $3,%r9d - leaq (%r9,%r9,2),%r10 - negq %r9 - - - - - - - - - - - leaq -320(%rsp,%r9,2),%r11 - movq %rsp,%rbp - subq %rdi,%r11 - andq $4095,%r11 - cmpq %r11,%r10 - jb L$mul4xsp_alt - subq %r11,%rbp - leaq -320(%rbp,%r9,2),%rbp - jmp L$mul4xsp_done - -.p2align 5 -L$mul4xsp_alt: - leaq 4096-320(,%r9,2),%r10 - leaq -320(%rbp,%r9,2),%rbp - subq %r10,%r11 - movq $0,%r10 - cmovcq %r10,%r11 - subq %r11,%rbp -L$mul4xsp_done: - andq $-64,%rbp - movq %rsp,%r11 - subq %rbp,%r11 - andq $-4096,%r11 - leaq (%r11,%rbp,1),%rsp - movq (%rsp),%r10 - cmpq %rbp,%rsp - ja L$mul4x_page_walk - jmp L$mul4x_page_walk_done - -L$mul4x_page_walk: - leaq -4096(%rsp),%rsp - movq (%rsp),%r10 - cmpq %rbp,%rsp - ja L$mul4x_page_walk -L$mul4x_page_walk_done: - - negq %r9 - - movq %rax,40(%rsp) - -L$mul4x_body: - - call mul4x_internal - - movq 40(%rsp),%rsi - - movq $1,%rax - - movq -48(%rsi),%r15 - - movq -40(%rsi),%r14 - - movq -32(%rsi),%r13 - - movq -24(%rsi),%r12 - - movq -16(%rsi),%rbp - - movq -8(%rsi),%rbx - - leaq (%rsi),%rsp - -L$mul4x_epilogue: - .byte 0xf3,0xc3 - - - - -.p2align 5 -mul4x_internal: - - shlq $5,%r9 - movd 8(%rax),%xmm5 - leaq L$inc(%rip),%rax - leaq 128(%rdx,%r9,1),%r13 - shrq $5,%r9 - movdqa 0(%rax),%xmm0 - movdqa 16(%rax),%xmm1 - leaq 88-112(%rsp,%r9,1),%r10 - leaq 128(%rdx),%r12 - - pshufd $0,%xmm5,%xmm5 - movdqa %xmm1,%xmm4 -.byte 0x67,0x67 - movdqa %xmm1,%xmm2 - paddd %xmm0,%xmm1 - pcmpeqd %xmm5,%xmm0 -.byte 0x67 - movdqa %xmm4,%xmm3 - paddd %xmm1,%xmm2 - pcmpeqd %xmm5,%xmm1 - movdqa %xmm0,112(%r10) - movdqa %xmm4,%xmm0 - - paddd %xmm2,%xmm3 - pcmpeqd %xmm5,%xmm2 - movdqa %xmm1,128(%r10) - movdqa %xmm4,%xmm1 - - paddd %xmm3,%xmm0 - pcmpeqd %xmm5,%xmm3 - movdqa %xmm2,144(%r10) - movdqa %xmm4,%xmm2 - - paddd %xmm0,%xmm1 - pcmpeqd %xmm5,%xmm0 - movdqa %xmm3,160(%r10) - movdqa %xmm4,%xmm3 - paddd %xmm1,%xmm2 - pcmpeqd %xmm5,%xmm1 - movdqa %xmm0,176(%r10) - movdqa %xmm4,%xmm0 - - paddd %xmm2,%xmm3 - pcmpeqd %xmm5,%xmm2 - movdqa %xmm1,192(%r10) - movdqa %xmm4,%xmm1 - - paddd %xmm3,%xmm0 - pcmpeqd %xmm5,%xmm3 - movdqa %xmm2,208(%r10) - movdqa %xmm4,%xmm2 - - paddd %xmm0,%xmm1 - pcmpeqd %xmm5,%xmm0 - movdqa %xmm3,224(%r10) - movdqa %xmm4,%xmm3 - paddd %xmm1,%xmm2 - pcmpeqd %xmm5,%xmm1 - movdqa %xmm0,240(%r10) - movdqa %xmm4,%xmm0 - - paddd %xmm2,%xmm3 - pcmpeqd %xmm5,%xmm2 - movdqa %xmm1,256(%r10) - movdqa %xmm4,%xmm1 - - paddd %xmm3,%xmm0 - pcmpeqd %xmm5,%xmm3 - movdqa %xmm2,272(%r10) - movdqa %xmm4,%xmm2 - - paddd %xmm0,%xmm1 - pcmpeqd %xmm5,%xmm0 - movdqa %xmm3,288(%r10) - movdqa %xmm4,%xmm3 - paddd %xmm1,%xmm2 - pcmpeqd %xmm5,%xmm1 - movdqa %xmm0,304(%r10) - - paddd %xmm2,%xmm3 -.byte 0x67 - pcmpeqd %xmm5,%xmm2 - movdqa %xmm1,320(%r10) - - pcmpeqd %xmm5,%xmm3 - movdqa %xmm2,336(%r10) - pand 64(%r12),%xmm0 - - pand 80(%r12),%xmm1 - pand 96(%r12),%xmm2 - movdqa %xmm3,352(%r10) - pand 112(%r12),%xmm3 - por %xmm2,%xmm0 - por %xmm3,%xmm1 - movdqa -128(%r12),%xmm4 - movdqa -112(%r12),%xmm5 - movdqa -96(%r12),%xmm2 - pand 112(%r10),%xmm4 - movdqa -80(%r12),%xmm3 - pand 128(%r10),%xmm5 - por %xmm4,%xmm0 - pand 144(%r10),%xmm2 - por %xmm5,%xmm1 - pand 160(%r10),%xmm3 - por %xmm2,%xmm0 - por %xmm3,%xmm1 - movdqa -64(%r12),%xmm4 - movdqa -48(%r12),%xmm5 - movdqa -32(%r12),%xmm2 - pand 176(%r10),%xmm4 - movdqa -16(%r12),%xmm3 - pand 192(%r10),%xmm5 - por %xmm4,%xmm0 - pand 208(%r10),%xmm2 - por %xmm5,%xmm1 - pand 224(%r10),%xmm3 - por %xmm2,%xmm0 - por %xmm3,%xmm1 - movdqa 0(%r12),%xmm4 - movdqa 16(%r12),%xmm5 - movdqa 32(%r12),%xmm2 - pand 240(%r10),%xmm4 - movdqa 48(%r12),%xmm3 - pand 256(%r10),%xmm5 - por %xmm4,%xmm0 - pand 272(%r10),%xmm2 - por %xmm5,%xmm1 - pand 288(%r10),%xmm3 - por %xmm2,%xmm0 - por %xmm3,%xmm1 - por %xmm1,%xmm0 - pshufd $0x4e,%xmm0,%xmm1 - por %xmm1,%xmm0 - leaq 256(%r12),%r12 -.byte 102,72,15,126,195 - - movq %r13,16+8(%rsp) - movq %rdi,56+8(%rsp) - - movq (%r8),%r8 - movq (%rsi),%rax - leaq (%rsi,%r9,1),%rsi - negq %r9 - - movq %r8,%rbp - mulq %rbx - movq %rax,%r10 - movq (%rcx),%rax - - imulq %r10,%rbp - leaq 64+8(%rsp),%r14 - movq %rdx,%r11 - - mulq %rbp - addq %rax,%r10 - movq 8(%rsi,%r9,1),%rax - adcq $0,%rdx - movq %rdx,%rdi - - mulq %rbx - addq %rax,%r11 - movq 8(%rcx),%rax - adcq $0,%rdx - movq %rdx,%r10 - - mulq %rbp - addq %rax,%rdi - movq 16(%rsi,%r9,1),%rax - adcq $0,%rdx - addq %r11,%rdi - leaq 32(%r9),%r15 - leaq 32(%rcx),%rcx - adcq $0,%rdx - movq %rdi,(%r14) - movq %rdx,%r13 - jmp L$1st4x - -.p2align 5 -L$1st4x: - mulq %rbx - addq %rax,%r10 - movq -16(%rcx),%rax - leaq 32(%r14),%r14 - adcq $0,%rdx - movq %rdx,%r11 - - mulq %rbp - addq %rax,%r13 - movq -8(%rsi,%r15,1),%rax - adcq $0,%rdx - addq %r10,%r13 - adcq $0,%rdx - movq %r13,-24(%r14) - movq %rdx,%rdi - - mulq %rbx - addq %rax,%r11 - movq -8(%rcx),%rax - adcq $0,%rdx - movq %rdx,%r10 - - mulq %rbp - addq %rax,%rdi - movq (%rsi,%r15,1),%rax - adcq $0,%rdx - addq %r11,%rdi - adcq $0,%rdx - movq %rdi,-16(%r14) - movq %rdx,%r13 - - mulq %rbx - addq %rax,%r10 - movq 0(%rcx),%rax - adcq $0,%rdx - movq %rdx,%r11 - - mulq %rbp - addq %rax,%r13 - movq 8(%rsi,%r15,1),%rax - adcq $0,%rdx - addq %r10,%r13 - adcq $0,%rdx - movq %r13,-8(%r14) - movq %rdx,%rdi - - mulq %rbx - addq %rax,%r11 - movq 8(%rcx),%rax - adcq $0,%rdx - movq %rdx,%r10 - - mulq %rbp - addq %rax,%rdi - movq 16(%rsi,%r15,1),%rax - adcq $0,%rdx - addq %r11,%rdi - leaq 32(%rcx),%rcx - adcq $0,%rdx - movq %rdi,(%r14) - movq %rdx,%r13 - - addq $32,%r15 - jnz L$1st4x - - mulq %rbx - addq %rax,%r10 - movq -16(%rcx),%rax - leaq 32(%r14),%r14 - adcq $0,%rdx - movq %rdx,%r11 - - mulq %rbp - addq %rax,%r13 - movq -8(%rsi),%rax - adcq $0,%rdx - addq %r10,%r13 - adcq $0,%rdx - movq %r13,-24(%r14) - movq %rdx,%rdi - - mulq %rbx - addq %rax,%r11 - movq -8(%rcx),%rax - adcq $0,%rdx - movq %rdx,%r10 - - mulq %rbp - addq %rax,%rdi - movq (%rsi,%r9,1),%rax - adcq $0,%rdx - addq %r11,%rdi - adcq $0,%rdx - movq %rdi,-16(%r14) - movq %rdx,%r13 - - leaq (%rcx,%r9,1),%rcx - - xorq %rdi,%rdi - addq %r10,%r13 - adcq $0,%rdi - movq %r13,-8(%r14) - - jmp L$outer4x - -.p2align 5 -L$outer4x: - leaq 16+128(%r14),%rdx - pxor %xmm4,%xmm4 - pxor %xmm5,%xmm5 - movdqa -128(%r12),%xmm0 - movdqa -112(%r12),%xmm1 - movdqa -96(%r12),%xmm2 - movdqa -80(%r12),%xmm3 - pand -128(%rdx),%xmm0 - pand -112(%rdx),%xmm1 - por %xmm0,%xmm4 - pand -96(%rdx),%xmm2 - por %xmm1,%xmm5 - pand -80(%rdx),%xmm3 - por %xmm2,%xmm4 - por %xmm3,%xmm5 - movdqa -64(%r12),%xmm0 - movdqa -48(%r12),%xmm1 - movdqa -32(%r12),%xmm2 - movdqa -16(%r12),%xmm3 - pand -64(%rdx),%xmm0 - pand -48(%rdx),%xmm1 - por %xmm0,%xmm4 - pand -32(%rdx),%xmm2 - por %xmm1,%xmm5 - pand -16(%rdx),%xmm3 - por %xmm2,%xmm4 - por %xmm3,%xmm5 - movdqa 0(%r12),%xmm0 - movdqa 16(%r12),%xmm1 - movdqa 32(%r12),%xmm2 - movdqa 48(%r12),%xmm3 - pand 0(%rdx),%xmm0 - pand 16(%rdx),%xmm1 - por %xmm0,%xmm4 - pand 32(%rdx),%xmm2 - por %xmm1,%xmm5 - pand 48(%rdx),%xmm3 - por %xmm2,%xmm4 - por %xmm3,%xmm5 - movdqa 64(%r12),%xmm0 - movdqa 80(%r12),%xmm1 - movdqa 96(%r12),%xmm2 - movdqa 112(%r12),%xmm3 - pand 64(%rdx),%xmm0 - pand 80(%rdx),%xmm1 - por %xmm0,%xmm4 - pand 96(%rdx),%xmm2 - por %xmm1,%xmm5 - pand 112(%rdx),%xmm3 - por %xmm2,%xmm4 - por %xmm3,%xmm5 - por %xmm5,%xmm4 - pshufd $0x4e,%xmm4,%xmm0 - por %xmm4,%xmm0 - leaq 256(%r12),%r12 -.byte 102,72,15,126,195 - - movq (%r14,%r9,1),%r10 - movq %r8,%rbp - mulq %rbx - addq %rax,%r10 - movq (%rcx),%rax - adcq $0,%rdx - - imulq %r10,%rbp - movq %rdx,%r11 - movq %rdi,(%r14) - - leaq (%r14,%r9,1),%r14 - - mulq %rbp - addq %rax,%r10 - movq 8(%rsi,%r9,1),%rax - adcq $0,%rdx - movq %rdx,%rdi - - mulq %rbx - addq %rax,%r11 - movq 8(%rcx),%rax - adcq $0,%rdx - addq 8(%r14),%r11 - adcq $0,%rdx - movq %rdx,%r10 - - mulq %rbp - addq %rax,%rdi - movq 16(%rsi,%r9,1),%rax - adcq $0,%rdx - addq %r11,%rdi - leaq 32(%r9),%r15 - leaq 32(%rcx),%rcx - adcq $0,%rdx - movq %rdx,%r13 - jmp L$inner4x - -.p2align 5 -L$inner4x: - mulq %rbx - addq %rax,%r10 - movq -16(%rcx),%rax - adcq $0,%rdx - addq 16(%r14),%r10 - leaq 32(%r14),%r14 - adcq $0,%rdx - movq %rdx,%r11 - - mulq %rbp - addq %rax,%r13 - movq -8(%rsi,%r15,1),%rax - adcq $0,%rdx - addq %r10,%r13 - adcq $0,%rdx - movq %rdi,-32(%r14) - movq %rdx,%rdi - - mulq %rbx - addq %rax,%r11 - movq -8(%rcx),%rax - adcq $0,%rdx - addq -8(%r14),%r11 - adcq $0,%rdx - movq %rdx,%r10 - - mulq %rbp - addq %rax,%rdi - movq (%rsi,%r15,1),%rax - adcq $0,%rdx - addq %r11,%rdi - adcq $0,%rdx - movq %r13,-24(%r14) - movq %rdx,%r13 - - mulq %rbx - addq %rax,%r10 - movq 0(%rcx),%rax - adcq $0,%rdx - addq (%r14),%r10 - adcq $0,%rdx - movq %rdx,%r11 - - mulq %rbp - addq %rax,%r13 - movq 8(%rsi,%r15,1),%rax - adcq $0,%rdx - addq %r10,%r13 - adcq $0,%rdx - movq %rdi,-16(%r14) - movq %rdx,%rdi - - mulq %rbx - addq %rax,%r11 - movq 8(%rcx),%rax - adcq $0,%rdx - addq 8(%r14),%r11 - adcq $0,%rdx - movq %rdx,%r10 - - mulq %rbp - addq %rax,%rdi - movq 16(%rsi,%r15,1),%rax - adcq $0,%rdx - addq %r11,%rdi - leaq 32(%rcx),%rcx - adcq $0,%rdx - movq %r13,-8(%r14) - movq %rdx,%r13 - - addq $32,%r15 - jnz L$inner4x - - mulq %rbx - addq %rax,%r10 - movq -16(%rcx),%rax - adcq $0,%rdx - addq 16(%r14),%r10 - leaq 32(%r14),%r14 - adcq $0,%rdx - movq %rdx,%r11 - - mulq %rbp - addq %rax,%r13 - movq -8(%rsi),%rax - adcq $0,%rdx - addq %r10,%r13 - adcq $0,%rdx - movq %rdi,-32(%r14) - movq %rdx,%rdi - - mulq %rbx - addq %rax,%r11 - movq %rbp,%rax - movq -8(%rcx),%rbp - adcq $0,%rdx - addq -8(%r14),%r11 - adcq $0,%rdx - movq %rdx,%r10 - - mulq %rbp - addq %rax,%rdi - movq (%rsi,%r9,1),%rax - adcq $0,%rdx - addq %r11,%rdi - adcq $0,%rdx - movq %r13,-24(%r14) - movq %rdx,%r13 - - movq %rdi,-16(%r14) - leaq (%rcx,%r9,1),%rcx - - xorq %rdi,%rdi - addq %r10,%r13 - adcq $0,%rdi - addq (%r14),%r13 - adcq $0,%rdi - movq %r13,-8(%r14) - - cmpq 16+8(%rsp),%r12 - jb L$outer4x - xorq %rax,%rax - subq %r13,%rbp - adcq %r15,%r15 - orq %r15,%rdi - subq %rdi,%rax - leaq (%r14,%r9,1),%rbx - movq (%rcx),%r12 - leaq (%rcx),%rbp - movq %r9,%rcx - sarq $3+2,%rcx - movq 56+8(%rsp),%rdi - decq %r12 - xorq %r10,%r10 - movq 8(%rbp),%r13 - movq 16(%rbp),%r14 - movq 24(%rbp),%r15 - jmp L$sqr4x_sub_entry - - -.globl _GFp_bn_power5 -.private_extern _GFp_bn_power5 - -.p2align 5 -_GFp_bn_power5: - - movq %rsp,%rax - - leaq _GFp_ia32cap_P(%rip),%r11 - movl 8(%r11),%r11d - andl $0x80108,%r11d - cmpl $0x80108,%r11d - je L$powerx5_enter - pushq %rbx - - pushq %rbp - - pushq %r12 - - pushq %r13 - - pushq %r14 - - pushq %r15 - -L$power5_prologue: - - shll $3,%r9d - leal (%r9,%r9,2),%r10d - negq %r9 - movq (%r8),%r8 - - - - - - - - - leaq -320(%rsp,%r9,2),%r11 - movq %rsp,%rbp - subq %rdi,%r11 - andq $4095,%r11 - cmpq %r11,%r10 - jb L$pwr_sp_alt - subq %r11,%rbp - leaq -320(%rbp,%r9,2),%rbp - jmp L$pwr_sp_done - -.p2align 5 -L$pwr_sp_alt: - leaq 4096-320(,%r9,2),%r10 - leaq -320(%rbp,%r9,2),%rbp - subq %r10,%r11 - movq $0,%r10 - cmovcq %r10,%r11 - subq %r11,%rbp -L$pwr_sp_done: - andq $-64,%rbp - movq %rsp,%r11 - subq %rbp,%r11 - andq $-4096,%r11 - leaq (%r11,%rbp,1),%rsp - movq (%rsp),%r10 - cmpq %rbp,%rsp - ja L$pwr_page_walk - jmp L$pwr_page_walk_done - -L$pwr_page_walk: - leaq -4096(%rsp),%rsp - movq (%rsp),%r10 - cmpq %rbp,%rsp - ja L$pwr_page_walk -L$pwr_page_walk_done: - - movq %r9,%r10 - negq %r9 - - - - - - - - - - - movq %r8,32(%rsp) - movq %rax,40(%rsp) - -L$power5_body: -.byte 102,72,15,110,207 -.byte 102,72,15,110,209 -.byte 102,73,15,110,218 -.byte 102,72,15,110,226 - - call __bn_sqr8x_internal - call __bn_post4x_internal - call __bn_sqr8x_internal - call __bn_post4x_internal - call __bn_sqr8x_internal - call __bn_post4x_internal - call __bn_sqr8x_internal - call __bn_post4x_internal - call __bn_sqr8x_internal - call __bn_post4x_internal - -.byte 102,72,15,126,209 -.byte 102,72,15,126,226 - movq %rsi,%rdi - movq 40(%rsp),%rax - leaq 32(%rsp),%r8 - - call mul4x_internal - - movq 40(%rsp),%rsi - - movq $1,%rax - movq -48(%rsi),%r15 - - movq -40(%rsi),%r14 - - movq -32(%rsi),%r13 - - movq -24(%rsi),%r12 - - movq -16(%rsi),%rbp - - movq -8(%rsi),%rbx - - leaq (%rsi),%rsp - -L$power5_epilogue: - .byte 0xf3,0xc3 - - - -.globl _GFp_bn_sqr8x_internal -.private_extern _GFp_bn_sqr8x_internal -.private_extern _GFp_bn_sqr8x_internal - -.p2align 5 -_GFp_bn_sqr8x_internal: -__bn_sqr8x_internal: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - leaq 32(%r10),%rbp - leaq (%rsi,%r9,1),%rsi - - movq %r9,%rcx - - - movq -32(%rsi,%rbp,1),%r14 - leaq 48+8(%rsp,%r9,2),%rdi - movq -24(%rsi,%rbp,1),%rax - leaq -32(%rdi,%rbp,1),%rdi - movq -16(%rsi,%rbp,1),%rbx - movq %rax,%r15 - - mulq %r14 - movq %rax,%r10 - movq %rbx,%rax - movq %rdx,%r11 - movq %r10,-24(%rdi,%rbp,1) - - mulq %r14 - addq %rax,%r11 - movq %rbx,%rax - adcq $0,%rdx - movq %r11,-16(%rdi,%rbp,1) - movq %rdx,%r10 - - - movq -8(%rsi,%rbp,1),%rbx - mulq %r15 - movq %rax,%r12 - movq %rbx,%rax - movq %rdx,%r13 - - leaq (%rbp),%rcx - mulq %r14 - addq %rax,%r10 - movq %rbx,%rax - movq %rdx,%r11 - adcq $0,%r11 - addq %r12,%r10 - adcq $0,%r11 - movq %r10,-8(%rdi,%rcx,1) - jmp L$sqr4x_1st - -.p2align 5 -L$sqr4x_1st: - movq (%rsi,%rcx,1),%rbx - mulq %r15 - addq %rax,%r13 - movq %rbx,%rax - movq %rdx,%r12 - adcq $0,%r12 - - mulq %r14 - addq %rax,%r11 - movq %rbx,%rax - movq 8(%rsi,%rcx,1),%rbx - movq %rdx,%r10 - adcq $0,%r10 - addq %r13,%r11 - adcq $0,%r10 - - - mulq %r15 - addq %rax,%r12 - movq %rbx,%rax - movq %r11,(%rdi,%rcx,1) - movq %rdx,%r13 - adcq $0,%r13 - - mulq %r14 - addq %rax,%r10 - movq %rbx,%rax - movq 16(%rsi,%rcx,1),%rbx - movq %rdx,%r11 - adcq $0,%r11 - addq %r12,%r10 - adcq $0,%r11 - - mulq %r15 - addq %rax,%r13 - movq %rbx,%rax - movq %r10,8(%rdi,%rcx,1) - movq %rdx,%r12 - adcq $0,%r12 - - mulq %r14 - addq %rax,%r11 - movq %rbx,%rax - movq 24(%rsi,%rcx,1),%rbx - movq %rdx,%r10 - adcq $0,%r10 - addq %r13,%r11 - adcq $0,%r10 - - - mulq %r15 - addq %rax,%r12 - movq %rbx,%rax - movq %r11,16(%rdi,%rcx,1) - movq %rdx,%r13 - adcq $0,%r13 - leaq 32(%rcx),%rcx - - mulq %r14 - addq %rax,%r10 - movq %rbx,%rax - movq %rdx,%r11 - adcq $0,%r11 - addq %r12,%r10 - adcq $0,%r11 - movq %r10,-8(%rdi,%rcx,1) - - cmpq $0,%rcx - jne L$sqr4x_1st - - mulq %r15 - addq %rax,%r13 - leaq 16(%rbp),%rbp - adcq $0,%rdx - addq %r11,%r13 - adcq $0,%rdx - - movq %r13,(%rdi) - movq %rdx,%r12 - movq %rdx,8(%rdi) - jmp L$sqr4x_outer - -.p2align 5 -L$sqr4x_outer: - movq -32(%rsi,%rbp,1),%r14 - leaq 48+8(%rsp,%r9,2),%rdi - movq -24(%rsi,%rbp,1),%rax - leaq -32(%rdi,%rbp,1),%rdi - movq -16(%rsi,%rbp,1),%rbx - movq %rax,%r15 - - mulq %r14 - movq -24(%rdi,%rbp,1),%r10 - addq %rax,%r10 - movq %rbx,%rax - adcq $0,%rdx - movq %r10,-24(%rdi,%rbp,1) - movq %rdx,%r11 - - mulq %r14 - addq %rax,%r11 - movq %rbx,%rax - adcq $0,%rdx - addq -16(%rdi,%rbp,1),%r11 - movq %rdx,%r10 - adcq $0,%r10 - movq %r11,-16(%rdi,%rbp,1) - - xorq %r12,%r12 - - movq -8(%rsi,%rbp,1),%rbx - mulq %r15 - addq %rax,%r12 - movq %rbx,%rax - adcq $0,%rdx - addq -8(%rdi,%rbp,1),%r12 - movq %rdx,%r13 - adcq $0,%r13 - - mulq %r14 - addq %rax,%r10 - movq %rbx,%rax - adcq $0,%rdx - addq %r12,%r10 - movq %rdx,%r11 - adcq $0,%r11 - movq %r10,-8(%rdi,%rbp,1) - - leaq (%rbp),%rcx - jmp L$sqr4x_inner - -.p2align 5 -L$sqr4x_inner: - movq (%rsi,%rcx,1),%rbx - mulq %r15 - addq %rax,%r13 - movq %rbx,%rax - movq %rdx,%r12 - adcq $0,%r12 - addq (%rdi,%rcx,1),%r13 - adcq $0,%r12 - -.byte 0x67 - mulq %r14 - addq %rax,%r11 - movq %rbx,%rax - movq 8(%rsi,%rcx,1),%rbx - movq %rdx,%r10 - adcq $0,%r10 - addq %r13,%r11 - adcq $0,%r10 - - mulq %r15 - addq %rax,%r12 - movq %r11,(%rdi,%rcx,1) - movq %rbx,%rax - movq %rdx,%r13 - adcq $0,%r13 - addq 8(%rdi,%rcx,1),%r12 - leaq 16(%rcx),%rcx - adcq $0,%r13 - - mulq %r14 - addq %rax,%r10 - movq %rbx,%rax - adcq $0,%rdx - addq %r12,%r10 - movq %rdx,%r11 - adcq $0,%r11 - movq %r10,-8(%rdi,%rcx,1) - - cmpq $0,%rcx - jne L$sqr4x_inner - -.byte 0x67 - mulq %r15 - addq %rax,%r13 - adcq $0,%rdx - addq %r11,%r13 - adcq $0,%rdx - - movq %r13,(%rdi) - movq %rdx,%r12 - movq %rdx,8(%rdi) - - addq $16,%rbp - jnz L$sqr4x_outer - - - movq -32(%rsi),%r14 - leaq 48+8(%rsp,%r9,2),%rdi - movq -24(%rsi),%rax - leaq -32(%rdi,%rbp,1),%rdi - movq -16(%rsi),%rbx - movq %rax,%r15 - - mulq %r14 - addq %rax,%r10 - movq %rbx,%rax - movq %rdx,%r11 - adcq $0,%r11 - - mulq %r14 - addq %rax,%r11 - movq %rbx,%rax - movq %r10,-24(%rdi) - movq %rdx,%r10 - adcq $0,%r10 - addq %r13,%r11 - movq -8(%rsi),%rbx - adcq $0,%r10 - - mulq %r15 - addq %rax,%r12 - movq %rbx,%rax - movq %r11,-16(%rdi) - movq %rdx,%r13 - adcq $0,%r13 - - mulq %r14 - addq %rax,%r10 - movq %rbx,%rax - movq %rdx,%r11 - adcq $0,%r11 - addq %r12,%r10 - adcq $0,%r11 - movq %r10,-8(%rdi) - - mulq %r15 - addq %rax,%r13 - movq -16(%rsi),%rax - adcq $0,%rdx - addq %r11,%r13 - adcq $0,%rdx - - movq %r13,(%rdi) - movq %rdx,%r12 - movq %rdx,8(%rdi) - - mulq %rbx - addq $16,%rbp - xorq %r14,%r14 - subq %r9,%rbp - xorq %r15,%r15 - - addq %r12,%rax - adcq $0,%rdx - movq %rax,8(%rdi) - movq %rdx,16(%rdi) - movq %r15,24(%rdi) - - movq -16(%rsi,%rbp,1),%rax - leaq 48+8(%rsp),%rdi - xorq %r10,%r10 - movq 8(%rdi),%r11 - - leaq (%r14,%r10,2),%r12 - shrq $63,%r10 - leaq (%rcx,%r11,2),%r13 - shrq $63,%r11 - orq %r10,%r13 - movq 16(%rdi),%r10 - movq %r11,%r14 - mulq %rax - negq %r15 - movq 24(%rdi),%r11 - adcq %rax,%r12 - movq -8(%rsi,%rbp,1),%rax - movq %r12,(%rdi) - adcq %rdx,%r13 - - leaq (%r14,%r10,2),%rbx - movq %r13,8(%rdi) - sbbq %r15,%r15 - shrq $63,%r10 - leaq (%rcx,%r11,2),%r8 - shrq $63,%r11 - orq %r10,%r8 - movq 32(%rdi),%r10 - movq %r11,%r14 - mulq %rax - negq %r15 - movq 40(%rdi),%r11 - adcq %rax,%rbx - movq 0(%rsi,%rbp,1),%rax - movq %rbx,16(%rdi) - adcq %rdx,%r8 - leaq 16(%rbp),%rbp - movq %r8,24(%rdi) - sbbq %r15,%r15 - leaq 64(%rdi),%rdi - jmp L$sqr4x_shift_n_add - -.p2align 5 -L$sqr4x_shift_n_add: - leaq (%r14,%r10,2),%r12 - shrq $63,%r10 - leaq (%rcx,%r11,2),%r13 - shrq $63,%r11 - orq %r10,%r13 - movq -16(%rdi),%r10 - movq %r11,%r14 - mulq %rax - negq %r15 - movq -8(%rdi),%r11 - adcq %rax,%r12 - movq -8(%rsi,%rbp,1),%rax - movq %r12,-32(%rdi) - adcq %rdx,%r13 - - leaq (%r14,%r10,2),%rbx - movq %r13,-24(%rdi) - sbbq %r15,%r15 - shrq $63,%r10 - leaq (%rcx,%r11,2),%r8 - shrq $63,%r11 - orq %r10,%r8 - movq 0(%rdi),%r10 - movq %r11,%r14 - mulq %rax - negq %r15 - movq 8(%rdi),%r11 - adcq %rax,%rbx - movq 0(%rsi,%rbp,1),%rax - movq %rbx,-16(%rdi) - adcq %rdx,%r8 - - leaq (%r14,%r10,2),%r12 - movq %r8,-8(%rdi) - sbbq %r15,%r15 - shrq $63,%r10 - leaq (%rcx,%r11,2),%r13 - shrq $63,%r11 - orq %r10,%r13 - movq 16(%rdi),%r10 - movq %r11,%r14 - mulq %rax - negq %r15 - movq 24(%rdi),%r11 - adcq %rax,%r12 - movq 8(%rsi,%rbp,1),%rax - movq %r12,0(%rdi) - adcq %rdx,%r13 - - leaq (%r14,%r10,2),%rbx - movq %r13,8(%rdi) - sbbq %r15,%r15 - shrq $63,%r10 - leaq (%rcx,%r11,2),%r8 - shrq $63,%r11 - orq %r10,%r8 - movq 32(%rdi),%r10 - movq %r11,%r14 - mulq %rax - negq %r15 - movq 40(%rdi),%r11 - adcq %rax,%rbx - movq 16(%rsi,%rbp,1),%rax - movq %rbx,16(%rdi) - adcq %rdx,%r8 - movq %r8,24(%rdi) - sbbq %r15,%r15 - leaq 64(%rdi),%rdi - addq $32,%rbp - jnz L$sqr4x_shift_n_add - - leaq (%r14,%r10,2),%r12 -.byte 0x67 - shrq $63,%r10 - leaq (%rcx,%r11,2),%r13 - shrq $63,%r11 - orq %r10,%r13 - movq -16(%rdi),%r10 - movq %r11,%r14 - mulq %rax - negq %r15 - movq -8(%rdi),%r11 - adcq %rax,%r12 - movq -8(%rsi),%rax - movq %r12,-32(%rdi) - adcq %rdx,%r13 - - leaq (%r14,%r10,2),%rbx - movq %r13,-24(%rdi) - sbbq %r15,%r15 - shrq $63,%r10 - leaq (%rcx,%r11,2),%r8 - shrq $63,%r11 - orq %r10,%r8 - mulq %rax - negq %r15 - adcq %rax,%rbx - adcq %rdx,%r8 - movq %rbx,-16(%rdi) - movq %r8,-8(%rdi) -.byte 102,72,15,126,213 -__bn_sqr8x_reduction: - xorq %rax,%rax - leaq (%r9,%rbp,1),%rcx - leaq 48+8(%rsp,%r9,2),%rdx - movq %rcx,0+8(%rsp) - leaq 48+8(%rsp,%r9,1),%rdi - movq %rdx,8+8(%rsp) - negq %r9 - jmp L$8x_reduction_loop - -.p2align 5 -L$8x_reduction_loop: - leaq (%rdi,%r9,1),%rdi -.byte 0x66 - movq 0(%rdi),%rbx - movq 8(%rdi),%r9 - movq 16(%rdi),%r10 - movq 24(%rdi),%r11 - movq 32(%rdi),%r12 - movq 40(%rdi),%r13 - movq 48(%rdi),%r14 - movq 56(%rdi),%r15 - movq %rax,(%rdx) - leaq 64(%rdi),%rdi - -.byte 0x67 - movq %rbx,%r8 - imulq 32+8(%rsp),%rbx - movq 0(%rbp),%rax - movl $8,%ecx - jmp L$8x_reduce - -.p2align 5 -L$8x_reduce: - mulq %rbx - movq 8(%rbp),%rax - negq %r8 - movq %rdx,%r8 - adcq $0,%r8 - - mulq %rbx - addq %rax,%r9 - movq 16(%rbp),%rax - adcq $0,%rdx - addq %r9,%r8 - movq %rbx,48-8+8(%rsp,%rcx,8) - movq %rdx,%r9 - adcq $0,%r9 - - mulq %rbx - addq %rax,%r10 - movq 24(%rbp),%rax - adcq $0,%rdx - addq %r10,%r9 - movq 32+8(%rsp),%rsi - movq %rdx,%r10 - adcq $0,%r10 - - mulq %rbx - addq %rax,%r11 - movq 32(%rbp),%rax - adcq $0,%rdx - imulq %r8,%rsi - addq %r11,%r10 - movq %rdx,%r11 - adcq $0,%r11 - - mulq %rbx - addq %rax,%r12 - movq 40(%rbp),%rax - adcq $0,%rdx - addq %r12,%r11 - movq %rdx,%r12 - adcq $0,%r12 - - mulq %rbx - addq %rax,%r13 - movq 48(%rbp),%rax - adcq $0,%rdx - addq %r13,%r12 - movq %rdx,%r13 - adcq $0,%r13 - - mulq %rbx - addq %rax,%r14 - movq 56(%rbp),%rax - adcq $0,%rdx - addq %r14,%r13 - movq %rdx,%r14 - adcq $0,%r14 - - mulq %rbx - movq %rsi,%rbx - addq %rax,%r15 - movq 0(%rbp),%rax - adcq $0,%rdx - addq %r15,%r14 - movq %rdx,%r15 - adcq $0,%r15 - - decl %ecx - jnz L$8x_reduce - - leaq 64(%rbp),%rbp - xorq %rax,%rax - movq 8+8(%rsp),%rdx - cmpq 0+8(%rsp),%rbp - jae L$8x_no_tail - -.byte 0x66 - addq 0(%rdi),%r8 - adcq 8(%rdi),%r9 - adcq 16(%rdi),%r10 - adcq 24(%rdi),%r11 - adcq 32(%rdi),%r12 - adcq 40(%rdi),%r13 - adcq 48(%rdi),%r14 - adcq 56(%rdi),%r15 - sbbq %rsi,%rsi - - movq 48+56+8(%rsp),%rbx - movl $8,%ecx - movq 0(%rbp),%rax - jmp L$8x_tail - -.p2align 5 -L$8x_tail: - mulq %rbx - addq %rax,%r8 - movq 8(%rbp),%rax - movq %r8,(%rdi) - movq %rdx,%r8 - adcq $0,%r8 - - mulq %rbx - addq %rax,%r9 - movq 16(%rbp),%rax - adcq $0,%rdx - addq %r9,%r8 - leaq 8(%rdi),%rdi - movq %rdx,%r9 - adcq $0,%r9 - - mulq %rbx - addq %rax,%r10 - movq 24(%rbp),%rax - adcq $0,%rdx - addq %r10,%r9 - movq %rdx,%r10 - adcq $0,%r10 - - mulq %rbx - addq %rax,%r11 - movq 32(%rbp),%rax - adcq $0,%rdx - addq %r11,%r10 - movq %rdx,%r11 - adcq $0,%r11 - - mulq %rbx - addq %rax,%r12 - movq 40(%rbp),%rax - adcq $0,%rdx - addq %r12,%r11 - movq %rdx,%r12 - adcq $0,%r12 - - mulq %rbx - addq %rax,%r13 - movq 48(%rbp),%rax - adcq $0,%rdx - addq %r13,%r12 - movq %rdx,%r13 - adcq $0,%r13 - - mulq %rbx - addq %rax,%r14 - movq 56(%rbp),%rax - adcq $0,%rdx - addq %r14,%r13 - movq %rdx,%r14 - adcq $0,%r14 - - mulq %rbx - movq 48-16+8(%rsp,%rcx,8),%rbx - addq %rax,%r15 - adcq $0,%rdx - addq %r15,%r14 - movq 0(%rbp),%rax - movq %rdx,%r15 - adcq $0,%r15 - - decl %ecx - jnz L$8x_tail - - leaq 64(%rbp),%rbp - movq 8+8(%rsp),%rdx - cmpq 0+8(%rsp),%rbp - jae L$8x_tail_done - - movq 48+56+8(%rsp),%rbx - negq %rsi - movq 0(%rbp),%rax - adcq 0(%rdi),%r8 - adcq 8(%rdi),%r9 - adcq 16(%rdi),%r10 - adcq 24(%rdi),%r11 - adcq 32(%rdi),%r12 - adcq 40(%rdi),%r13 - adcq 48(%rdi),%r14 - adcq 56(%rdi),%r15 - sbbq %rsi,%rsi - - movl $8,%ecx - jmp L$8x_tail - -.p2align 5 -L$8x_tail_done: - xorq %rax,%rax - addq (%rdx),%r8 - adcq $0,%r9 - adcq $0,%r10 - adcq $0,%r11 - adcq $0,%r12 - adcq $0,%r13 - adcq $0,%r14 - adcq $0,%r15 - adcq $0,%rax - - negq %rsi -L$8x_no_tail: - adcq 0(%rdi),%r8 - adcq 8(%rdi),%r9 - adcq 16(%rdi),%r10 - adcq 24(%rdi),%r11 - adcq 32(%rdi),%r12 - adcq 40(%rdi),%r13 - adcq 48(%rdi),%r14 - adcq 56(%rdi),%r15 - adcq $0,%rax - movq -8(%rbp),%rcx - xorq %rsi,%rsi - -.byte 102,72,15,126,213 - - movq %r8,0(%rdi) - movq %r9,8(%rdi) -.byte 102,73,15,126,217 - movq %r10,16(%rdi) - movq %r11,24(%rdi) - movq %r12,32(%rdi) - movq %r13,40(%rdi) - movq %r14,48(%rdi) - movq %r15,56(%rdi) - leaq 64(%rdi),%rdi - - cmpq %rdx,%rdi - jb L$8x_reduction_loop - .byte 0xf3,0xc3 - - - -.p2align 5 -__bn_post4x_internal: - - movq 0(%rbp),%r12 - leaq (%rdi,%r9,1),%rbx - movq %r9,%rcx -.byte 102,72,15,126,207 - negq %rax -.byte 102,72,15,126,206 - sarq $3+2,%rcx - decq %r12 - xorq %r10,%r10 - movq 8(%rbp),%r13 - movq 16(%rbp),%r14 - movq 24(%rbp),%r15 - jmp L$sqr4x_sub_entry - -.p2align 4 -L$sqr4x_sub: - movq 0(%rbp),%r12 - movq 8(%rbp),%r13 - movq 16(%rbp),%r14 - movq 24(%rbp),%r15 -L$sqr4x_sub_entry: - leaq 32(%rbp),%rbp - notq %r12 - notq %r13 - notq %r14 - notq %r15 - andq %rax,%r12 - andq %rax,%r13 - andq %rax,%r14 - andq %rax,%r15 - - negq %r10 - adcq 0(%rbx),%r12 - adcq 8(%rbx),%r13 - adcq 16(%rbx),%r14 - adcq 24(%rbx),%r15 - movq %r12,0(%rdi) - leaq 32(%rbx),%rbx - movq %r13,8(%rdi) - sbbq %r10,%r10 - movq %r14,16(%rdi) - movq %r15,24(%rdi) - leaq 32(%rdi),%rdi - - incq %rcx - jnz L$sqr4x_sub - - movq %r9,%r10 - negq %r9 - .byte 0xf3,0xc3 - - -.globl _GFp_bn_from_montgomery -.private_extern _GFp_bn_from_montgomery - -.p2align 5 -_GFp_bn_from_montgomery: - - testl $7,%r9d - jz bn_from_mont8x - xorl %eax,%eax - .byte 0xf3,0xc3 - - - - -.p2align 5 -bn_from_mont8x: - -.byte 0x67 - movq %rsp,%rax - - pushq %rbx - - pushq %rbp - - pushq %r12 - - pushq %r13 - - pushq %r14 - - pushq %r15 - -L$from_prologue: - - shll $3,%r9d - leaq (%r9,%r9,2),%r10 - negq %r9 - movq (%r8),%r8 - - - - - - - - - leaq -320(%rsp,%r9,2),%r11 - movq %rsp,%rbp - subq %rdi,%r11 - andq $4095,%r11 - cmpq %r11,%r10 - jb L$from_sp_alt - subq %r11,%rbp - leaq -320(%rbp,%r9,2),%rbp - jmp L$from_sp_done - -.p2align 5 -L$from_sp_alt: - leaq 4096-320(,%r9,2),%r10 - leaq -320(%rbp,%r9,2),%rbp - subq %r10,%r11 - movq $0,%r10 - cmovcq %r10,%r11 - subq %r11,%rbp -L$from_sp_done: - andq $-64,%rbp - movq %rsp,%r11 - subq %rbp,%r11 - andq $-4096,%r11 - leaq (%r11,%rbp,1),%rsp - movq (%rsp),%r10 - cmpq %rbp,%rsp - ja L$from_page_walk - jmp L$from_page_walk_done - -L$from_page_walk: - leaq -4096(%rsp),%rsp - movq (%rsp),%r10 - cmpq %rbp,%rsp - ja L$from_page_walk -L$from_page_walk_done: - - movq %r9,%r10 - negq %r9 - - - - - - - - - - - movq %r8,32(%rsp) - movq %rax,40(%rsp) - -L$from_body: - movq %r9,%r11 - leaq 48(%rsp),%rax - pxor %xmm0,%xmm0 - jmp L$mul_by_1 - -.p2align 5 -L$mul_by_1: - movdqu (%rsi),%xmm1 - movdqu 16(%rsi),%xmm2 - movdqu 32(%rsi),%xmm3 - movdqa %xmm0,(%rax,%r9,1) - movdqu 48(%rsi),%xmm4 - movdqa %xmm0,16(%rax,%r9,1) -.byte 0x48,0x8d,0xb6,0x40,0x00,0x00,0x00 - movdqa %xmm1,(%rax) - movdqa %xmm0,32(%rax,%r9,1) - movdqa %xmm2,16(%rax) - movdqa %xmm0,48(%rax,%r9,1) - movdqa %xmm3,32(%rax) - movdqa %xmm4,48(%rax) - leaq 64(%rax),%rax - subq $64,%r11 - jnz L$mul_by_1 - -.byte 102,72,15,110,207 -.byte 102,72,15,110,209 -.byte 0x67 - movq %rcx,%rbp -.byte 102,73,15,110,218 - leaq _GFp_ia32cap_P(%rip),%r11 - movl 8(%r11),%r11d - andl $0x80108,%r11d - cmpl $0x80108,%r11d - jne L$from_mont_nox - - leaq (%rax,%r9,1),%rdi - call __bn_sqrx8x_reduction - call __bn_postx4x_internal - - pxor %xmm0,%xmm0 - leaq 48(%rsp),%rax - jmp L$from_mont_zero - -.p2align 5 -L$from_mont_nox: - call __bn_sqr8x_reduction - call __bn_post4x_internal - - pxor %xmm0,%xmm0 - leaq 48(%rsp),%rax - jmp L$from_mont_zero - -.p2align 5 -L$from_mont_zero: - movq 40(%rsp),%rsi - - movdqa %xmm0,0(%rax) - movdqa %xmm0,16(%rax) - movdqa %xmm0,32(%rax) - movdqa %xmm0,48(%rax) - leaq 64(%rax),%rax - subq $32,%r9 - jnz L$from_mont_zero - - movq $1,%rax - movq -48(%rsi),%r15 - - movq -40(%rsi),%r14 - - movq -32(%rsi),%r13 - - movq -24(%rsi),%r12 - - movq -16(%rsi),%rbp - - movq -8(%rsi),%rbx - - leaq (%rsi),%rsp - -L$from_epilogue: - .byte 0xf3,0xc3 - - - -.p2align 5 -bn_mulx4x_mont_gather5: - - movq %rsp,%rax - -L$mulx4x_enter: - pushq %rbx - - pushq %rbp - - pushq %r12 - - pushq %r13 - - pushq %r14 - - pushq %r15 - -L$mulx4x_prologue: - - shll $3,%r9d - leaq (%r9,%r9,2),%r10 - negq %r9 - movq (%r8),%r8 - - - - - - - - - - - leaq -320(%rsp,%r9,2),%r11 - movq %rsp,%rbp - subq %rdi,%r11 - andq $4095,%r11 - cmpq %r11,%r10 - jb L$mulx4xsp_alt - subq %r11,%rbp - leaq -320(%rbp,%r9,2),%rbp - jmp L$mulx4xsp_done - -L$mulx4xsp_alt: - leaq 4096-320(,%r9,2),%r10 - leaq -320(%rbp,%r9,2),%rbp - subq %r10,%r11 - movq $0,%r10 - cmovcq %r10,%r11 - subq %r11,%rbp -L$mulx4xsp_done: - andq $-64,%rbp - movq %rsp,%r11 - subq %rbp,%r11 - andq $-4096,%r11 - leaq (%r11,%rbp,1),%rsp - movq (%rsp),%r10 - cmpq %rbp,%rsp - ja L$mulx4x_page_walk - jmp L$mulx4x_page_walk_done - -L$mulx4x_page_walk: - leaq -4096(%rsp),%rsp - movq (%rsp),%r10 - cmpq %rbp,%rsp - ja L$mulx4x_page_walk -L$mulx4x_page_walk_done: - - - - - - - - - - - - - - movq %r8,32(%rsp) - movq %rax,40(%rsp) - -L$mulx4x_body: - call mulx4x_internal - - movq 40(%rsp),%rsi - - movq $1,%rax - - movq -48(%rsi),%r15 - - movq -40(%rsi),%r14 - - movq -32(%rsi),%r13 - - movq -24(%rsi),%r12 - - movq -16(%rsi),%rbp - - movq -8(%rsi),%rbx - - leaq (%rsi),%rsp - -L$mulx4x_epilogue: - .byte 0xf3,0xc3 - - - - -.p2align 5 -mulx4x_internal: - - movq %r9,8(%rsp) - movq %r9,%r10 - negq %r9 - shlq $5,%r9 - negq %r10 - leaq 128(%rdx,%r9,1),%r13 - shrq $5+5,%r9 - movd 8(%rax),%xmm5 - subq $1,%r9 - leaq L$inc(%rip),%rax - movq %r13,16+8(%rsp) - movq %r9,24+8(%rsp) - movq %rdi,56+8(%rsp) - movdqa 0(%rax),%xmm0 - movdqa 16(%rax),%xmm1 - leaq 88-112(%rsp,%r10,1),%r10 - leaq 128(%rdx),%rdi - - pshufd $0,%xmm5,%xmm5 - movdqa %xmm1,%xmm4 -.byte 0x67 - movdqa %xmm1,%xmm2 -.byte 0x67 - paddd %xmm0,%xmm1 - pcmpeqd %xmm5,%xmm0 - movdqa %xmm4,%xmm3 - paddd %xmm1,%xmm2 - pcmpeqd %xmm5,%xmm1 - movdqa %xmm0,112(%r10) - movdqa %xmm4,%xmm0 - - paddd %xmm2,%xmm3 - pcmpeqd %xmm5,%xmm2 - movdqa %xmm1,128(%r10) - movdqa %xmm4,%xmm1 - - paddd %xmm3,%xmm0 - pcmpeqd %xmm5,%xmm3 - movdqa %xmm2,144(%r10) - movdqa %xmm4,%xmm2 - - paddd %xmm0,%xmm1 - pcmpeqd %xmm5,%xmm0 - movdqa %xmm3,160(%r10) - movdqa %xmm4,%xmm3 - paddd %xmm1,%xmm2 - pcmpeqd %xmm5,%xmm1 - movdqa %xmm0,176(%r10) - movdqa %xmm4,%xmm0 - - paddd %xmm2,%xmm3 - pcmpeqd %xmm5,%xmm2 - movdqa %xmm1,192(%r10) - movdqa %xmm4,%xmm1 - - paddd %xmm3,%xmm0 - pcmpeqd %xmm5,%xmm3 - movdqa %xmm2,208(%r10) - movdqa %xmm4,%xmm2 - - paddd %xmm0,%xmm1 - pcmpeqd %xmm5,%xmm0 - movdqa %xmm3,224(%r10) - movdqa %xmm4,%xmm3 - paddd %xmm1,%xmm2 - pcmpeqd %xmm5,%xmm1 - movdqa %xmm0,240(%r10) - movdqa %xmm4,%xmm0 - - paddd %xmm2,%xmm3 - pcmpeqd %xmm5,%xmm2 - movdqa %xmm1,256(%r10) - movdqa %xmm4,%xmm1 - - paddd %xmm3,%xmm0 - pcmpeqd %xmm5,%xmm3 - movdqa %xmm2,272(%r10) - movdqa %xmm4,%xmm2 - - paddd %xmm0,%xmm1 - pcmpeqd %xmm5,%xmm0 - movdqa %xmm3,288(%r10) - movdqa %xmm4,%xmm3 -.byte 0x67 - paddd %xmm1,%xmm2 - pcmpeqd %xmm5,%xmm1 - movdqa %xmm0,304(%r10) - - paddd %xmm2,%xmm3 - pcmpeqd %xmm5,%xmm2 - movdqa %xmm1,320(%r10) - - pcmpeqd %xmm5,%xmm3 - movdqa %xmm2,336(%r10) - - pand 64(%rdi),%xmm0 - pand 80(%rdi),%xmm1 - pand 96(%rdi),%xmm2 - movdqa %xmm3,352(%r10) - pand 112(%rdi),%xmm3 - por %xmm2,%xmm0 - por %xmm3,%xmm1 - movdqa -128(%rdi),%xmm4 - movdqa -112(%rdi),%xmm5 - movdqa -96(%rdi),%xmm2 - pand 112(%r10),%xmm4 - movdqa -80(%rdi),%xmm3 - pand 128(%r10),%xmm5 - por %xmm4,%xmm0 - pand 144(%r10),%xmm2 - por %xmm5,%xmm1 - pand 160(%r10),%xmm3 - por %xmm2,%xmm0 - por %xmm3,%xmm1 - movdqa -64(%rdi),%xmm4 - movdqa -48(%rdi),%xmm5 - movdqa -32(%rdi),%xmm2 - pand 176(%r10),%xmm4 - movdqa -16(%rdi),%xmm3 - pand 192(%r10),%xmm5 - por %xmm4,%xmm0 - pand 208(%r10),%xmm2 - por %xmm5,%xmm1 - pand 224(%r10),%xmm3 - por %xmm2,%xmm0 - por %xmm3,%xmm1 - movdqa 0(%rdi),%xmm4 - movdqa 16(%rdi),%xmm5 - movdqa 32(%rdi),%xmm2 - pand 240(%r10),%xmm4 - movdqa 48(%rdi),%xmm3 - pand 256(%r10),%xmm5 - por %xmm4,%xmm0 - pand 272(%r10),%xmm2 - por %xmm5,%xmm1 - pand 288(%r10),%xmm3 - por %xmm2,%xmm0 - por %xmm3,%xmm1 - pxor %xmm1,%xmm0 - pshufd $0x4e,%xmm0,%xmm1 - por %xmm1,%xmm0 - leaq 256(%rdi),%rdi -.byte 102,72,15,126,194 - leaq 64+32+8(%rsp),%rbx - - movq %rdx,%r9 - mulxq 0(%rsi),%r8,%rax - mulxq 8(%rsi),%r11,%r12 - addq %rax,%r11 - mulxq 16(%rsi),%rax,%r13 - adcq %rax,%r12 - adcq $0,%r13 - mulxq 24(%rsi),%rax,%r14 - - movq %r8,%r15 - imulq 32+8(%rsp),%r8 - xorq %rbp,%rbp - movq %r8,%rdx - - movq %rdi,8+8(%rsp) - - leaq 32(%rsi),%rsi - adcxq %rax,%r13 - adcxq %rbp,%r14 - - mulxq 0(%rcx),%rax,%r10 - adcxq %rax,%r15 - adoxq %r11,%r10 - mulxq 8(%rcx),%rax,%r11 - adcxq %rax,%r10 - adoxq %r12,%r11 - mulxq 16(%rcx),%rax,%r12 - movq 24+8(%rsp),%rdi - movq %r10,-32(%rbx) - adcxq %rax,%r11 - adoxq %r13,%r12 - mulxq 24(%rcx),%rax,%r15 - movq %r9,%rdx - movq %r11,-24(%rbx) - adcxq %rax,%r12 - adoxq %rbp,%r15 - leaq 32(%rcx),%rcx - movq %r12,-16(%rbx) - jmp L$mulx4x_1st - -.p2align 5 -L$mulx4x_1st: - adcxq %rbp,%r15 - mulxq 0(%rsi),%r10,%rax - adcxq %r14,%r10 - mulxq 8(%rsi),%r11,%r14 - adcxq %rax,%r11 - mulxq 16(%rsi),%r12,%rax - adcxq %r14,%r12 - mulxq 24(%rsi),%r13,%r14 -.byte 0x67,0x67 - movq %r8,%rdx - adcxq %rax,%r13 - adcxq %rbp,%r14 - leaq 32(%rsi),%rsi - leaq 32(%rbx),%rbx - - adoxq %r15,%r10 - mulxq 0(%rcx),%rax,%r15 - adcxq %rax,%r10 - adoxq %r15,%r11 - mulxq 8(%rcx),%rax,%r15 - adcxq %rax,%r11 - adoxq %r15,%r12 - mulxq 16(%rcx),%rax,%r15 - movq %r10,-40(%rbx) - adcxq %rax,%r12 - movq %r11,-32(%rbx) - adoxq %r15,%r13 - mulxq 24(%rcx),%rax,%r15 - movq %r9,%rdx - movq %r12,-24(%rbx) - adcxq %rax,%r13 - adoxq %rbp,%r15 - leaq 32(%rcx),%rcx - movq %r13,-16(%rbx) - - decq %rdi - jnz L$mulx4x_1st - - movq 8(%rsp),%rax - adcq %rbp,%r15 - leaq (%rsi,%rax,1),%rsi - addq %r15,%r14 - movq 8+8(%rsp),%rdi - adcq %rbp,%rbp - movq %r14,-8(%rbx) - jmp L$mulx4x_outer - -.p2align 5 -L$mulx4x_outer: - leaq 16-256(%rbx),%r10 - pxor %xmm4,%xmm4 -.byte 0x67,0x67 - pxor %xmm5,%xmm5 - movdqa -128(%rdi),%xmm0 - movdqa -112(%rdi),%xmm1 - movdqa -96(%rdi),%xmm2 - pand 256(%r10),%xmm0 - movdqa -80(%rdi),%xmm3 - pand 272(%r10),%xmm1 - por %xmm0,%xmm4 - pand 288(%r10),%xmm2 - por %xmm1,%xmm5 - pand 304(%r10),%xmm3 - por %xmm2,%xmm4 - por %xmm3,%xmm5 - movdqa -64(%rdi),%xmm0 - movdqa -48(%rdi),%xmm1 - movdqa -32(%rdi),%xmm2 - pand 320(%r10),%xmm0 - movdqa -16(%rdi),%xmm3 - pand 336(%r10),%xmm1 - por %xmm0,%xmm4 - pand 352(%r10),%xmm2 - por %xmm1,%xmm5 - pand 368(%r10),%xmm3 - por %xmm2,%xmm4 - por %xmm3,%xmm5 - movdqa 0(%rdi),%xmm0 - movdqa 16(%rdi),%xmm1 - movdqa 32(%rdi),%xmm2 - pand 384(%r10),%xmm0 - movdqa 48(%rdi),%xmm3 - pand 400(%r10),%xmm1 - por %xmm0,%xmm4 - pand 416(%r10),%xmm2 - por %xmm1,%xmm5 - pand 432(%r10),%xmm3 - por %xmm2,%xmm4 - por %xmm3,%xmm5 - movdqa 64(%rdi),%xmm0 - movdqa 80(%rdi),%xmm1 - movdqa 96(%rdi),%xmm2 - pand 448(%r10),%xmm0 - movdqa 112(%rdi),%xmm3 - pand 464(%r10),%xmm1 - por %xmm0,%xmm4 - pand 480(%r10),%xmm2 - por %xmm1,%xmm5 - pand 496(%r10),%xmm3 - por %xmm2,%xmm4 - por %xmm3,%xmm5 - por %xmm5,%xmm4 - pshufd $0x4e,%xmm4,%xmm0 - por %xmm4,%xmm0 - leaq 256(%rdi),%rdi -.byte 102,72,15,126,194 - - movq %rbp,(%rbx) - leaq 32(%rbx,%rax,1),%rbx - mulxq 0(%rsi),%r8,%r11 - xorq %rbp,%rbp - movq %rdx,%r9 - mulxq 8(%rsi),%r14,%r12 - adoxq -32(%rbx),%r8 - adcxq %r14,%r11 - mulxq 16(%rsi),%r15,%r13 - adoxq -24(%rbx),%r11 - adcxq %r15,%r12 - mulxq 24(%rsi),%rdx,%r14 - adoxq -16(%rbx),%r12 - adcxq %rdx,%r13 - leaq (%rcx,%rax,1),%rcx - leaq 32(%rsi),%rsi - adoxq -8(%rbx),%r13 - adcxq %rbp,%r14 - adoxq %rbp,%r14 - - movq %r8,%r15 - imulq 32+8(%rsp),%r8 - - movq %r8,%rdx - xorq %rbp,%rbp - movq %rdi,8+8(%rsp) - - mulxq 0(%rcx),%rax,%r10 - adcxq %rax,%r15 - adoxq %r11,%r10 - mulxq 8(%rcx),%rax,%r11 - adcxq %rax,%r10 - adoxq %r12,%r11 - mulxq 16(%rcx),%rax,%r12 - adcxq %rax,%r11 - adoxq %r13,%r12 - mulxq 24(%rcx),%rax,%r15 - movq %r9,%rdx - movq 24+8(%rsp),%rdi - movq %r10,-32(%rbx) - adcxq %rax,%r12 - movq %r11,-24(%rbx) - adoxq %rbp,%r15 - movq %r12,-16(%rbx) - leaq 32(%rcx),%rcx - jmp L$mulx4x_inner - -.p2align 5 -L$mulx4x_inner: - mulxq 0(%rsi),%r10,%rax - adcxq %rbp,%r15 - adoxq %r14,%r10 - mulxq 8(%rsi),%r11,%r14 - adcxq 0(%rbx),%r10 - adoxq %rax,%r11 - mulxq 16(%rsi),%r12,%rax - adcxq 8(%rbx),%r11 - adoxq %r14,%r12 - mulxq 24(%rsi),%r13,%r14 - movq %r8,%rdx - adcxq 16(%rbx),%r12 - adoxq %rax,%r13 - adcxq 24(%rbx),%r13 - adoxq %rbp,%r14 - leaq 32(%rsi),%rsi - leaq 32(%rbx),%rbx - adcxq %rbp,%r14 - - adoxq %r15,%r10 - mulxq 0(%rcx),%rax,%r15 - adcxq %rax,%r10 - adoxq %r15,%r11 - mulxq 8(%rcx),%rax,%r15 - adcxq %rax,%r11 - adoxq %r15,%r12 - mulxq 16(%rcx),%rax,%r15 - movq %r10,-40(%rbx) - adcxq %rax,%r12 - adoxq %r15,%r13 - movq %r11,-32(%rbx) - mulxq 24(%rcx),%rax,%r15 - movq %r9,%rdx - leaq 32(%rcx),%rcx - movq %r12,-24(%rbx) - adcxq %rax,%r13 - adoxq %rbp,%r15 - movq %r13,-16(%rbx) - - decq %rdi - jnz L$mulx4x_inner - - movq 0+8(%rsp),%rax - adcq %rbp,%r15 - subq 0(%rbx),%rdi - movq 8+8(%rsp),%rdi - movq 16+8(%rsp),%r10 - adcq %r15,%r14 - leaq (%rsi,%rax,1),%rsi - adcq %rbp,%rbp - movq %r14,-8(%rbx) - - cmpq %r10,%rdi - jb L$mulx4x_outer - - movq -8(%rcx),%r10 - movq %rbp,%r8 - movq (%rcx,%rax,1),%r12 - leaq (%rcx,%rax,1),%rbp - movq %rax,%rcx - leaq (%rbx,%rax,1),%rdi - xorl %eax,%eax - xorq %r15,%r15 - subq %r14,%r10 - adcq %r15,%r15 - orq %r15,%r8 - sarq $3+2,%rcx - subq %r8,%rax - movq 56+8(%rsp),%rdx - decq %r12 - movq 8(%rbp),%r13 - xorq %r8,%r8 - movq 16(%rbp),%r14 - movq 24(%rbp),%r15 - jmp L$sqrx4x_sub_entry - - - -.p2align 5 -bn_powerx5: - - movq %rsp,%rax - -L$powerx5_enter: - pushq %rbx - - pushq %rbp - - pushq %r12 - - pushq %r13 - - pushq %r14 - - pushq %r15 - -L$powerx5_prologue: - - shll $3,%r9d - leaq (%r9,%r9,2),%r10 - negq %r9 - movq (%r8),%r8 - - - - - - - - - leaq -320(%rsp,%r9,2),%r11 - movq %rsp,%rbp - subq %rdi,%r11 - andq $4095,%r11 - cmpq %r11,%r10 - jb L$pwrx_sp_alt - subq %r11,%rbp - leaq -320(%rbp,%r9,2),%rbp - jmp L$pwrx_sp_done - -.p2align 5 -L$pwrx_sp_alt: - leaq 4096-320(,%r9,2),%r10 - leaq -320(%rbp,%r9,2),%rbp - subq %r10,%r11 - movq $0,%r10 - cmovcq %r10,%r11 - subq %r11,%rbp -L$pwrx_sp_done: - andq $-64,%rbp - movq %rsp,%r11 - subq %rbp,%r11 - andq $-4096,%r11 - leaq (%r11,%rbp,1),%rsp - movq (%rsp),%r10 - cmpq %rbp,%rsp - ja L$pwrx_page_walk - jmp L$pwrx_page_walk_done - -L$pwrx_page_walk: - leaq -4096(%rsp),%rsp - movq (%rsp),%r10 - cmpq %rbp,%rsp - ja L$pwrx_page_walk -L$pwrx_page_walk_done: - - movq %r9,%r10 - negq %r9 - - - - - - - - - - - - - pxor %xmm0,%xmm0 -.byte 102,72,15,110,207 -.byte 102,72,15,110,209 -.byte 102,73,15,110,218 -.byte 102,72,15,110,226 - movq %r8,32(%rsp) - movq %rax,40(%rsp) - -L$powerx5_body: - - call __bn_sqrx8x_internal - call __bn_postx4x_internal - call __bn_sqrx8x_internal - call __bn_postx4x_internal - call __bn_sqrx8x_internal - call __bn_postx4x_internal - call __bn_sqrx8x_internal - call __bn_postx4x_internal - call __bn_sqrx8x_internal - call __bn_postx4x_internal - - movq %r10,%r9 - movq %rsi,%rdi -.byte 102,72,15,126,209 -.byte 102,72,15,126,226 - movq 40(%rsp),%rax - - call mulx4x_internal - - movq 40(%rsp),%rsi - - movq $1,%rax - - movq -48(%rsi),%r15 - - movq -40(%rsi),%r14 - - movq -32(%rsi),%r13 - - movq -24(%rsi),%r12 - - movq -16(%rsi),%rbp - - movq -8(%rsi),%rbx - - leaq (%rsi),%rsp - -L$powerx5_epilogue: - .byte 0xf3,0xc3 - - - -.globl _GFp_bn_sqrx8x_internal -.private_extern _GFp_bn_sqrx8x_internal - -.p2align 5 -_GFp_bn_sqrx8x_internal: -__bn_sqrx8x_internal: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - leaq 48+8(%rsp),%rdi - leaq (%rsi,%r9,1),%rbp - movq %r9,0+8(%rsp) - movq %rbp,8+8(%rsp) - jmp L$sqr8x_zero_start - -.p2align 5 -.byte 0x66,0x66,0x66,0x2e,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00 -L$sqrx8x_zero: -.byte 0x3e - movdqa %xmm0,0(%rdi) - movdqa %xmm0,16(%rdi) - movdqa %xmm0,32(%rdi) - movdqa %xmm0,48(%rdi) -L$sqr8x_zero_start: - movdqa %xmm0,64(%rdi) - movdqa %xmm0,80(%rdi) - movdqa %xmm0,96(%rdi) - movdqa %xmm0,112(%rdi) - leaq 128(%rdi),%rdi - subq $64,%r9 - jnz L$sqrx8x_zero - - movq 0(%rsi),%rdx - - xorq %r10,%r10 - xorq %r11,%r11 - xorq %r12,%r12 - xorq %r13,%r13 - xorq %r14,%r14 - xorq %r15,%r15 - leaq 48+8(%rsp),%rdi - xorq %rbp,%rbp - jmp L$sqrx8x_outer_loop - -.p2align 5 -L$sqrx8x_outer_loop: - mulxq 8(%rsi),%r8,%rax - adcxq %r9,%r8 - adoxq %rax,%r10 - mulxq 16(%rsi),%r9,%rax - adcxq %r10,%r9 - adoxq %rax,%r11 -.byte 0xc4,0xe2,0xab,0xf6,0x86,0x18,0x00,0x00,0x00 - adcxq %r11,%r10 - adoxq %rax,%r12 -.byte 0xc4,0xe2,0xa3,0xf6,0x86,0x20,0x00,0x00,0x00 - adcxq %r12,%r11 - adoxq %rax,%r13 - mulxq 40(%rsi),%r12,%rax - adcxq %r13,%r12 - adoxq %rax,%r14 - mulxq 48(%rsi),%r13,%rax - adcxq %r14,%r13 - adoxq %r15,%rax - mulxq 56(%rsi),%r14,%r15 - movq 8(%rsi),%rdx - adcxq %rax,%r14 - adoxq %rbp,%r15 - adcq 64(%rdi),%r15 - movq %r8,8(%rdi) - movq %r9,16(%rdi) - sbbq %rcx,%rcx - xorq %rbp,%rbp - - - mulxq 16(%rsi),%r8,%rbx - mulxq 24(%rsi),%r9,%rax - adcxq %r10,%r8 - adoxq %rbx,%r9 - mulxq 32(%rsi),%r10,%rbx - adcxq %r11,%r9 - adoxq %rax,%r10 -.byte 0xc4,0xe2,0xa3,0xf6,0x86,0x28,0x00,0x00,0x00 - adcxq %r12,%r10 - adoxq %rbx,%r11 -.byte 0xc4,0xe2,0x9b,0xf6,0x9e,0x30,0x00,0x00,0x00 - adcxq %r13,%r11 - adoxq %r14,%r12 -.byte 0xc4,0x62,0x93,0xf6,0xb6,0x38,0x00,0x00,0x00 - movq 16(%rsi),%rdx - adcxq %rax,%r12 - adoxq %rbx,%r13 - adcxq %r15,%r13 - adoxq %rbp,%r14 - adcxq %rbp,%r14 - - movq %r8,24(%rdi) - movq %r9,32(%rdi) - - mulxq 24(%rsi),%r8,%rbx - mulxq 32(%rsi),%r9,%rax - adcxq %r10,%r8 - adoxq %rbx,%r9 - mulxq 40(%rsi),%r10,%rbx - adcxq %r11,%r9 - adoxq %rax,%r10 -.byte 0xc4,0xe2,0xa3,0xf6,0x86,0x30,0x00,0x00,0x00 - adcxq %r12,%r10 - adoxq %r13,%r11 -.byte 0xc4,0x62,0x9b,0xf6,0xae,0x38,0x00,0x00,0x00 -.byte 0x3e - movq 24(%rsi),%rdx - adcxq %rbx,%r11 - adoxq %rax,%r12 - adcxq %r14,%r12 - movq %r8,40(%rdi) - movq %r9,48(%rdi) - mulxq 32(%rsi),%r8,%rax - adoxq %rbp,%r13 - adcxq %rbp,%r13 - - mulxq 40(%rsi),%r9,%rbx - adcxq %r10,%r8 - adoxq %rax,%r9 - mulxq 48(%rsi),%r10,%rax - adcxq %r11,%r9 - adoxq %r12,%r10 - mulxq 56(%rsi),%r11,%r12 - movq 32(%rsi),%rdx - movq 40(%rsi),%r14 - adcxq %rbx,%r10 - adoxq %rax,%r11 - movq 48(%rsi),%r15 - adcxq %r13,%r11 - adoxq %rbp,%r12 - adcxq %rbp,%r12 - - movq %r8,56(%rdi) - movq %r9,64(%rdi) - - mulxq %r14,%r9,%rax - movq 56(%rsi),%r8 - adcxq %r10,%r9 - mulxq %r15,%r10,%rbx - adoxq %rax,%r10 - adcxq %r11,%r10 - mulxq %r8,%r11,%rax - movq %r14,%rdx - adoxq %rbx,%r11 - adcxq %r12,%r11 - - adcxq %rbp,%rax - - mulxq %r15,%r14,%rbx - mulxq %r8,%r12,%r13 - movq %r15,%rdx - leaq 64(%rsi),%rsi - adcxq %r14,%r11 - adoxq %rbx,%r12 - adcxq %rax,%r12 - adoxq %rbp,%r13 - -.byte 0x67,0x67 - mulxq %r8,%r8,%r14 - adcxq %r8,%r13 - adcxq %rbp,%r14 - - cmpq 8+8(%rsp),%rsi - je L$sqrx8x_outer_break - - negq %rcx - movq $-8,%rcx - movq %rbp,%r15 - movq 64(%rdi),%r8 - adcxq 72(%rdi),%r9 - adcxq 80(%rdi),%r10 - adcxq 88(%rdi),%r11 - adcq 96(%rdi),%r12 - adcq 104(%rdi),%r13 - adcq 112(%rdi),%r14 - adcq 120(%rdi),%r15 - leaq (%rsi),%rbp - leaq 128(%rdi),%rdi - sbbq %rax,%rax - - movq -64(%rsi),%rdx - movq %rax,16+8(%rsp) - movq %rdi,24+8(%rsp) - - - xorl %eax,%eax - jmp L$sqrx8x_loop - -.p2align 5 -L$sqrx8x_loop: - movq %r8,%rbx - mulxq 0(%rbp),%rax,%r8 - adcxq %rax,%rbx - adoxq %r9,%r8 - - mulxq 8(%rbp),%rax,%r9 - adcxq %rax,%r8 - adoxq %r10,%r9 - - mulxq 16(%rbp),%rax,%r10 - adcxq %rax,%r9 - adoxq %r11,%r10 - - mulxq 24(%rbp),%rax,%r11 - adcxq %rax,%r10 - adoxq %r12,%r11 - -.byte 0xc4,0x62,0xfb,0xf6,0xa5,0x20,0x00,0x00,0x00 - adcxq %rax,%r11 - adoxq %r13,%r12 - - mulxq 40(%rbp),%rax,%r13 - adcxq %rax,%r12 - adoxq %r14,%r13 - - mulxq 48(%rbp),%rax,%r14 - movq %rbx,(%rdi,%rcx,8) - movl $0,%ebx - adcxq %rax,%r13 - adoxq %r15,%r14 - -.byte 0xc4,0x62,0xfb,0xf6,0xbd,0x38,0x00,0x00,0x00 - movq 8(%rsi,%rcx,8),%rdx - adcxq %rax,%r14 - adoxq %rbx,%r15 - adcxq %rbx,%r15 - -.byte 0x67 - incq %rcx - jnz L$sqrx8x_loop - - leaq 64(%rbp),%rbp - movq $-8,%rcx - cmpq 8+8(%rsp),%rbp - je L$sqrx8x_break - - subq 16+8(%rsp),%rbx -.byte 0x66 - movq -64(%rsi),%rdx - adcxq 0(%rdi),%r8 - adcxq 8(%rdi),%r9 - adcq 16(%rdi),%r10 - adcq 24(%rdi),%r11 - adcq 32(%rdi),%r12 - adcq 40(%rdi),%r13 - adcq 48(%rdi),%r14 - adcq 56(%rdi),%r15 - leaq 64(%rdi),%rdi -.byte 0x67 - sbbq %rax,%rax - xorl %ebx,%ebx - movq %rax,16+8(%rsp) - jmp L$sqrx8x_loop - -.p2align 5 -L$sqrx8x_break: - xorq %rbp,%rbp - subq 16+8(%rsp),%rbx - adcxq %rbp,%r8 - movq 24+8(%rsp),%rcx - adcxq %rbp,%r9 - movq 0(%rsi),%rdx - adcq $0,%r10 - movq %r8,0(%rdi) - adcq $0,%r11 - adcq $0,%r12 - adcq $0,%r13 - adcq $0,%r14 - adcq $0,%r15 - cmpq %rcx,%rdi - je L$sqrx8x_outer_loop - - movq %r9,8(%rdi) - movq 8(%rcx),%r9 - movq %r10,16(%rdi) - movq 16(%rcx),%r10 - movq %r11,24(%rdi) - movq 24(%rcx),%r11 - movq %r12,32(%rdi) - movq 32(%rcx),%r12 - movq %r13,40(%rdi) - movq 40(%rcx),%r13 - movq %r14,48(%rdi) - movq 48(%rcx),%r14 - movq %r15,56(%rdi) - movq 56(%rcx),%r15 - movq %rcx,%rdi - jmp L$sqrx8x_outer_loop - -.p2align 5 -L$sqrx8x_outer_break: - movq %r9,72(%rdi) -.byte 102,72,15,126,217 - movq %r10,80(%rdi) - movq %r11,88(%rdi) - movq %r12,96(%rdi) - movq %r13,104(%rdi) - movq %r14,112(%rdi) - leaq 48+8(%rsp),%rdi - movq (%rsi,%rcx,1),%rdx - - movq 8(%rdi),%r11 - xorq %r10,%r10 - movq 0+8(%rsp),%r9 - adoxq %r11,%r11 - movq 16(%rdi),%r12 - movq 24(%rdi),%r13 - - -.p2align 5 -L$sqrx4x_shift_n_add: - mulxq %rdx,%rax,%rbx - adoxq %r12,%r12 - adcxq %r10,%rax -.byte 0x48,0x8b,0x94,0x0e,0x08,0x00,0x00,0x00 -.byte 0x4c,0x8b,0x97,0x20,0x00,0x00,0x00 - adoxq %r13,%r13 - adcxq %r11,%rbx - movq 40(%rdi),%r11 - movq %rax,0(%rdi) - movq %rbx,8(%rdi) - - mulxq %rdx,%rax,%rbx - adoxq %r10,%r10 - adcxq %r12,%rax - movq 16(%rsi,%rcx,1),%rdx - movq 48(%rdi),%r12 - adoxq %r11,%r11 - adcxq %r13,%rbx - movq 56(%rdi),%r13 - movq %rax,16(%rdi) - movq %rbx,24(%rdi) - - mulxq %rdx,%rax,%rbx - adoxq %r12,%r12 - adcxq %r10,%rax - movq 24(%rsi,%rcx,1),%rdx - leaq 32(%rcx),%rcx - movq 64(%rdi),%r10 - adoxq %r13,%r13 - adcxq %r11,%rbx - movq 72(%rdi),%r11 - movq %rax,32(%rdi) - movq %rbx,40(%rdi) - - mulxq %rdx,%rax,%rbx - adoxq %r10,%r10 - adcxq %r12,%rax - jrcxz L$sqrx4x_shift_n_add_break -.byte 0x48,0x8b,0x94,0x0e,0x00,0x00,0x00,0x00 - adoxq %r11,%r11 - adcxq %r13,%rbx - movq 80(%rdi),%r12 - movq 88(%rdi),%r13 - movq %rax,48(%rdi) - movq %rbx,56(%rdi) - leaq 64(%rdi),%rdi - nop - jmp L$sqrx4x_shift_n_add - -.p2align 5 -L$sqrx4x_shift_n_add_break: - adcxq %r13,%rbx - movq %rax,48(%rdi) - movq %rbx,56(%rdi) - leaq 64(%rdi),%rdi -.byte 102,72,15,126,213 -__bn_sqrx8x_reduction: - xorl %eax,%eax - movq 32+8(%rsp),%rbx - movq 48+8(%rsp),%rdx - leaq -64(%rbp,%r9,1),%rcx - - movq %rcx,0+8(%rsp) - movq %rdi,8+8(%rsp) - - leaq 48+8(%rsp),%rdi - jmp L$sqrx8x_reduction_loop - -.p2align 5 -L$sqrx8x_reduction_loop: - movq 8(%rdi),%r9 - movq 16(%rdi),%r10 - movq 24(%rdi),%r11 - movq 32(%rdi),%r12 - movq %rdx,%r8 - imulq %rbx,%rdx - movq 40(%rdi),%r13 - movq 48(%rdi),%r14 - movq 56(%rdi),%r15 - movq %rax,24+8(%rsp) - - leaq 64(%rdi),%rdi - xorq %rsi,%rsi - movq $-8,%rcx - jmp L$sqrx8x_reduce - -.p2align 5 -L$sqrx8x_reduce: - movq %r8,%rbx - mulxq 0(%rbp),%rax,%r8 - adcxq %rbx,%rax - adoxq %r9,%r8 - - mulxq 8(%rbp),%rbx,%r9 - adcxq %rbx,%r8 - adoxq %r10,%r9 - - mulxq 16(%rbp),%rbx,%r10 - adcxq %rbx,%r9 - adoxq %r11,%r10 - - mulxq 24(%rbp),%rbx,%r11 - adcxq %rbx,%r10 - adoxq %r12,%r11 - -.byte 0xc4,0x62,0xe3,0xf6,0xa5,0x20,0x00,0x00,0x00 - movq %rdx,%rax - movq %r8,%rdx - adcxq %rbx,%r11 - adoxq %r13,%r12 - - mulxq 32+8(%rsp),%rbx,%rdx - movq %rax,%rdx - movq %rax,64+48+8(%rsp,%rcx,8) - - mulxq 40(%rbp),%rax,%r13 - adcxq %rax,%r12 - adoxq %r14,%r13 - - mulxq 48(%rbp),%rax,%r14 - adcxq %rax,%r13 - adoxq %r15,%r14 - - mulxq 56(%rbp),%rax,%r15 - movq %rbx,%rdx - adcxq %rax,%r14 - adoxq %rsi,%r15 - adcxq %rsi,%r15 - -.byte 0x67,0x67,0x67 - incq %rcx - jnz L$sqrx8x_reduce - - movq %rsi,%rax - cmpq 0+8(%rsp),%rbp - jae L$sqrx8x_no_tail - - movq 48+8(%rsp),%rdx - addq 0(%rdi),%r8 - leaq 64(%rbp),%rbp - movq $-8,%rcx - adcxq 8(%rdi),%r9 - adcxq 16(%rdi),%r10 - adcq 24(%rdi),%r11 - adcq 32(%rdi),%r12 - adcq 40(%rdi),%r13 - adcq 48(%rdi),%r14 - adcq 56(%rdi),%r15 - leaq 64(%rdi),%rdi - sbbq %rax,%rax - - xorq %rsi,%rsi - movq %rax,16+8(%rsp) - jmp L$sqrx8x_tail - -.p2align 5 -L$sqrx8x_tail: - movq %r8,%rbx - mulxq 0(%rbp),%rax,%r8 - adcxq %rax,%rbx - adoxq %r9,%r8 - - mulxq 8(%rbp),%rax,%r9 - adcxq %rax,%r8 - adoxq %r10,%r9 - - mulxq 16(%rbp),%rax,%r10 - adcxq %rax,%r9 - adoxq %r11,%r10 - - mulxq 24(%rbp),%rax,%r11 - adcxq %rax,%r10 - adoxq %r12,%r11 - -.byte 0xc4,0x62,0xfb,0xf6,0xa5,0x20,0x00,0x00,0x00 - adcxq %rax,%r11 - adoxq %r13,%r12 - - mulxq 40(%rbp),%rax,%r13 - adcxq %rax,%r12 - adoxq %r14,%r13 - - mulxq 48(%rbp),%rax,%r14 - adcxq %rax,%r13 - adoxq %r15,%r14 - - mulxq 56(%rbp),%rax,%r15 - movq 72+48+8(%rsp,%rcx,8),%rdx - adcxq %rax,%r14 - adoxq %rsi,%r15 - movq %rbx,(%rdi,%rcx,8) - movq %r8,%rbx - adcxq %rsi,%r15 - - incq %rcx - jnz L$sqrx8x_tail - - cmpq 0+8(%rsp),%rbp - jae L$sqrx8x_tail_done - - subq 16+8(%rsp),%rsi - movq 48+8(%rsp),%rdx - leaq 64(%rbp),%rbp - adcq 0(%rdi),%r8 - adcq 8(%rdi),%r9 - adcq 16(%rdi),%r10 - adcq 24(%rdi),%r11 - adcq 32(%rdi),%r12 - adcq 40(%rdi),%r13 - adcq 48(%rdi),%r14 - adcq 56(%rdi),%r15 - leaq 64(%rdi),%rdi - sbbq %rax,%rax - subq $8,%rcx - - xorq %rsi,%rsi - movq %rax,16+8(%rsp) - jmp L$sqrx8x_tail - -.p2align 5 -L$sqrx8x_tail_done: - xorq %rax,%rax - addq 24+8(%rsp),%r8 - adcq $0,%r9 - adcq $0,%r10 - adcq $0,%r11 - adcq $0,%r12 - adcq $0,%r13 - adcq $0,%r14 - adcq $0,%r15 - adcq $0,%rax - - subq 16+8(%rsp),%rsi -L$sqrx8x_no_tail: - adcq 0(%rdi),%r8 -.byte 102,72,15,126,217 - adcq 8(%rdi),%r9 - movq 56(%rbp),%rsi -.byte 102,72,15,126,213 - adcq 16(%rdi),%r10 - adcq 24(%rdi),%r11 - adcq 32(%rdi),%r12 - adcq 40(%rdi),%r13 - adcq 48(%rdi),%r14 - adcq 56(%rdi),%r15 - adcq $0,%rax - - movq 32+8(%rsp),%rbx - movq 64(%rdi,%rcx,1),%rdx - - movq %r8,0(%rdi) - leaq 64(%rdi),%r8 - movq %r9,8(%rdi) - movq %r10,16(%rdi) - movq %r11,24(%rdi) - movq %r12,32(%rdi) - movq %r13,40(%rdi) - movq %r14,48(%rdi) - movq %r15,56(%rdi) - - leaq 64(%rdi,%rcx,1),%rdi - cmpq 8+8(%rsp),%r8 - jb L$sqrx8x_reduction_loop - .byte 0xf3,0xc3 - - -.p2align 5 - -__bn_postx4x_internal: - - movq 0(%rbp),%r12 - movq %rcx,%r10 - movq %rcx,%r9 - negq %rax - sarq $3+2,%rcx - -.byte 102,72,15,126,202 -.byte 102,72,15,126,206 - decq %r12 - movq 8(%rbp),%r13 - xorq %r8,%r8 - movq 16(%rbp),%r14 - movq 24(%rbp),%r15 - jmp L$sqrx4x_sub_entry - -.p2align 4 -L$sqrx4x_sub: - movq 0(%rbp),%r12 - movq 8(%rbp),%r13 - movq 16(%rbp),%r14 - movq 24(%rbp),%r15 -L$sqrx4x_sub_entry: - andnq %rax,%r12,%r12 - leaq 32(%rbp),%rbp - andnq %rax,%r13,%r13 - andnq %rax,%r14,%r14 - andnq %rax,%r15,%r15 - - negq %r8 - adcq 0(%rdi),%r12 - adcq 8(%rdi),%r13 - adcq 16(%rdi),%r14 - adcq 24(%rdi),%r15 - movq %r12,0(%rdx) - leaq 32(%rdi),%rdi - movq %r13,8(%rdx) - sbbq %r8,%r8 - movq %r14,16(%rdx) - movq %r15,24(%rdx) - leaq 32(%rdx),%rdx - - incq %rcx - jnz L$sqrx4x_sub - - negq %r9 - - .byte 0xf3,0xc3 - - -.globl _GFp_bn_scatter5 -.private_extern _GFp_bn_scatter5 - -.p2align 4 -_GFp_bn_scatter5: - - cmpl $0,%esi - jz L$scatter_epilogue - leaq (%rdx,%rcx,8),%rdx -L$scatter: - movq (%rdi),%rax - leaq 8(%rdi),%rdi - movq %rax,(%rdx) - leaq 256(%rdx),%rdx - subl $1,%esi - jnz L$scatter -L$scatter_epilogue: - .byte 0xf3,0xc3 - - - -.globl _GFp_bn_gather5 -.private_extern _GFp_bn_gather5 - -.p2align 5 -_GFp_bn_gather5: - -L$SEH_begin_GFp_bn_gather5: - -.byte 0x4c,0x8d,0x14,0x24 - -.byte 0x48,0x81,0xec,0x08,0x01,0x00,0x00 - leaq L$inc(%rip),%rax - andq $-16,%rsp - - movd %ecx,%xmm5 - movdqa 0(%rax),%xmm0 - movdqa 16(%rax),%xmm1 - leaq 128(%rdx),%r11 - leaq 128(%rsp),%rax - - pshufd $0,%xmm5,%xmm5 - movdqa %xmm1,%xmm4 - movdqa %xmm1,%xmm2 - paddd %xmm0,%xmm1 - pcmpeqd %xmm5,%xmm0 - movdqa %xmm4,%xmm3 - - paddd %xmm1,%xmm2 - pcmpeqd %xmm5,%xmm1 - movdqa %xmm0,-128(%rax) - movdqa %xmm4,%xmm0 - - paddd %xmm2,%xmm3 - pcmpeqd %xmm5,%xmm2 - movdqa %xmm1,-112(%rax) - movdqa %xmm4,%xmm1 - - paddd %xmm3,%xmm0 - pcmpeqd %xmm5,%xmm3 - movdqa %xmm2,-96(%rax) - movdqa %xmm4,%xmm2 - paddd %xmm0,%xmm1 - pcmpeqd %xmm5,%xmm0 - movdqa %xmm3,-80(%rax) - movdqa %xmm4,%xmm3 - - paddd %xmm1,%xmm2 - pcmpeqd %xmm5,%xmm1 - movdqa %xmm0,-64(%rax) - movdqa %xmm4,%xmm0 - - paddd %xmm2,%xmm3 - pcmpeqd %xmm5,%xmm2 - movdqa %xmm1,-48(%rax) - movdqa %xmm4,%xmm1 - - paddd %xmm3,%xmm0 - pcmpeqd %xmm5,%xmm3 - movdqa %xmm2,-32(%rax) - movdqa %xmm4,%xmm2 - paddd %xmm0,%xmm1 - pcmpeqd %xmm5,%xmm0 - movdqa %xmm3,-16(%rax) - movdqa %xmm4,%xmm3 - - paddd %xmm1,%xmm2 - pcmpeqd %xmm5,%xmm1 - movdqa %xmm0,0(%rax) - movdqa %xmm4,%xmm0 - - paddd %xmm2,%xmm3 - pcmpeqd %xmm5,%xmm2 - movdqa %xmm1,16(%rax) - movdqa %xmm4,%xmm1 - - paddd %xmm3,%xmm0 - pcmpeqd %xmm5,%xmm3 - movdqa %xmm2,32(%rax) - movdqa %xmm4,%xmm2 - paddd %xmm0,%xmm1 - pcmpeqd %xmm5,%xmm0 - movdqa %xmm3,48(%rax) - movdqa %xmm4,%xmm3 - - paddd %xmm1,%xmm2 - pcmpeqd %xmm5,%xmm1 - movdqa %xmm0,64(%rax) - movdqa %xmm4,%xmm0 - - paddd %xmm2,%xmm3 - pcmpeqd %xmm5,%xmm2 - movdqa %xmm1,80(%rax) - movdqa %xmm4,%xmm1 - - paddd %xmm3,%xmm0 - pcmpeqd %xmm5,%xmm3 - movdqa %xmm2,96(%rax) - movdqa %xmm4,%xmm2 - movdqa %xmm3,112(%rax) - jmp L$gather - -.p2align 5 -L$gather: - pxor %xmm4,%xmm4 - pxor %xmm5,%xmm5 - movdqa -128(%r11),%xmm0 - movdqa -112(%r11),%xmm1 - movdqa -96(%r11),%xmm2 - pand -128(%rax),%xmm0 - movdqa -80(%r11),%xmm3 - pand -112(%rax),%xmm1 - por %xmm0,%xmm4 - pand -96(%rax),%xmm2 - por %xmm1,%xmm5 - pand -80(%rax),%xmm3 - por %xmm2,%xmm4 - por %xmm3,%xmm5 - movdqa -64(%r11),%xmm0 - movdqa -48(%r11),%xmm1 - movdqa -32(%r11),%xmm2 - pand -64(%rax),%xmm0 - movdqa -16(%r11),%xmm3 - pand -48(%rax),%xmm1 - por %xmm0,%xmm4 - pand -32(%rax),%xmm2 - por %xmm1,%xmm5 - pand -16(%rax),%xmm3 - por %xmm2,%xmm4 - por %xmm3,%xmm5 - movdqa 0(%r11),%xmm0 - movdqa 16(%r11),%xmm1 - movdqa 32(%r11),%xmm2 - pand 0(%rax),%xmm0 - movdqa 48(%r11),%xmm3 - pand 16(%rax),%xmm1 - por %xmm0,%xmm4 - pand 32(%rax),%xmm2 - por %xmm1,%xmm5 - pand 48(%rax),%xmm3 - por %xmm2,%xmm4 - por %xmm3,%xmm5 - movdqa 64(%r11),%xmm0 - movdqa 80(%r11),%xmm1 - movdqa 96(%r11),%xmm2 - pand 64(%rax),%xmm0 - movdqa 112(%r11),%xmm3 - pand 80(%rax),%xmm1 - por %xmm0,%xmm4 - pand 96(%rax),%xmm2 - por %xmm1,%xmm5 - pand 112(%rax),%xmm3 - por %xmm2,%xmm4 - por %xmm3,%xmm5 - por %xmm5,%xmm4 - leaq 256(%r11),%r11 - pshufd $0x4e,%xmm4,%xmm0 - por %xmm4,%xmm0 - movq %xmm0,(%rdi) - leaq 8(%rdi),%rdi - subl $1,%esi - jnz L$gather - - leaq (%r10),%rsp - - .byte 0xf3,0xc3 -L$SEH_end_GFp_bn_gather5: - - -.p2align 6 -L$inc: -.long 0,0, 1,1 -.long 2,2, 2,2 -.byte 77,111,110,116,103,111,109,101,114,121,32,77,117,108,116,105,112,108,105,99,97,116,105,111,110,32,119,105,116,104,32,115,99,97,116,116,101,114,47,103,97,116,104,101,114,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 -#endif Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/x86_64-mont5-nasm.obj and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/x86_64-mont5-nasm.obj differ diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/x86_64-mont-elf.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/x86_64-mont-elf.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/x86_64-mont-elf.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/x86_64-mont-elf.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,1255 +0,0 @@ -# This file is generated from a similarly-named Perl script in the BoringSSL -# source tree. Do not edit by hand. - -#if defined(__has_feature) -#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) -#define OPENSSL_NO_ASM -#endif -#endif - -#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) -.text - -.extern GFp_ia32cap_P -.hidden GFp_ia32cap_P - -.globl GFp_bn_mul_mont -.hidden GFp_bn_mul_mont -.type GFp_bn_mul_mont,@function -.align 16 -GFp_bn_mul_mont: -.cfi_startproc - movl %r9d,%r9d - movq %rsp,%rax -.cfi_def_cfa_register %rax - testl $3,%r9d - jnz .Lmul_enter - cmpl $8,%r9d - jb .Lmul_enter - movl GFp_ia32cap_P+8(%rip),%r11d - cmpq %rsi,%rdx - jne .Lmul4x_enter - testl $7,%r9d - jz .Lsqr8x_enter - jmp .Lmul4x_enter - -.align 16 -.Lmul_enter: - pushq %rbx -.cfi_offset %rbx,-16 - pushq %rbp -.cfi_offset %rbp,-24 - pushq %r12 -.cfi_offset %r12,-32 - pushq %r13 -.cfi_offset %r13,-40 - pushq %r14 -.cfi_offset %r14,-48 - pushq %r15 -.cfi_offset %r15,-56 - - negq %r9 - movq %rsp,%r11 - leaq -16(%rsp,%r9,8),%r10 - negq %r9 - andq $-1024,%r10 - - - - - - - - - - subq %r10,%r11 - andq $-4096,%r11 - leaq (%r10,%r11,1),%rsp - movq (%rsp),%r11 - cmpq %r10,%rsp - ja .Lmul_page_walk - jmp .Lmul_page_walk_done - -.align 16 -.Lmul_page_walk: - leaq -4096(%rsp),%rsp - movq (%rsp),%r11 - cmpq %r10,%rsp - ja .Lmul_page_walk -.Lmul_page_walk_done: - - movq %rax,8(%rsp,%r9,8) -.cfi_escape 0x0f,0x0a,0x77,0x08,0x79,0x00,0x38,0x1e,0x22,0x06,0x23,0x08 -.Lmul_body: - movq %rdx,%r12 - movq (%r8),%r8 - movq (%r12),%rbx - movq (%rsi),%rax - - xorq %r14,%r14 - xorq %r15,%r15 - - movq %r8,%rbp - mulq %rbx - movq %rax,%r10 - movq (%rcx),%rax - - imulq %r10,%rbp - movq %rdx,%r11 - - mulq %rbp - addq %rax,%r10 - movq 8(%rsi),%rax - adcq $0,%rdx - movq %rdx,%r13 - - leaq 1(%r15),%r15 - jmp .L1st_enter - -.align 16 -.L1st: - addq %rax,%r13 - movq (%rsi,%r15,8),%rax - adcq $0,%rdx - addq %r11,%r13 - movq %r10,%r11 - adcq $0,%rdx - movq %r13,-16(%rsp,%r15,8) - movq %rdx,%r13 - -.L1st_enter: - mulq %rbx - addq %rax,%r11 - movq (%rcx,%r15,8),%rax - adcq $0,%rdx - leaq 1(%r15),%r15 - movq %rdx,%r10 - - mulq %rbp - cmpq %r9,%r15 - jne .L1st - - addq %rax,%r13 - movq (%rsi),%rax - adcq $0,%rdx - addq %r11,%r13 - adcq $0,%rdx - movq %r13,-16(%rsp,%r15,8) - movq %rdx,%r13 - movq %r10,%r11 - - xorq %rdx,%rdx - addq %r11,%r13 - adcq $0,%rdx - movq %r13,-8(%rsp,%r9,8) - movq %rdx,(%rsp,%r9,8) - - leaq 1(%r14),%r14 - jmp .Louter -.align 16 -.Louter: - movq (%r12,%r14,8),%rbx - xorq %r15,%r15 - movq %r8,%rbp - movq (%rsp),%r10 - mulq %rbx - addq %rax,%r10 - movq (%rcx),%rax - adcq $0,%rdx - - imulq %r10,%rbp - movq %rdx,%r11 - - mulq %rbp - addq %rax,%r10 - movq 8(%rsi),%rax - adcq $0,%rdx - movq 8(%rsp),%r10 - movq %rdx,%r13 - - leaq 1(%r15),%r15 - jmp .Linner_enter - -.align 16 -.Linner: - addq %rax,%r13 - movq (%rsi,%r15,8),%rax - adcq $0,%rdx - addq %r10,%r13 - movq (%rsp,%r15,8),%r10 - adcq $0,%rdx - movq %r13,-16(%rsp,%r15,8) - movq %rdx,%r13 - -.Linner_enter: - mulq %rbx - addq %rax,%r11 - movq (%rcx,%r15,8),%rax - adcq $0,%rdx - addq %r11,%r10 - movq %rdx,%r11 - adcq $0,%r11 - leaq 1(%r15),%r15 - - mulq %rbp - cmpq %r9,%r15 - jne .Linner - - addq %rax,%r13 - movq (%rsi),%rax - adcq $0,%rdx - addq %r10,%r13 - movq (%rsp,%r15,8),%r10 - adcq $0,%rdx - movq %r13,-16(%rsp,%r15,8) - movq %rdx,%r13 - - xorq %rdx,%rdx - addq %r11,%r13 - adcq $0,%rdx - addq %r10,%r13 - adcq $0,%rdx - movq %r13,-8(%rsp,%r9,8) - movq %rdx,(%rsp,%r9,8) - - leaq 1(%r14),%r14 - cmpq %r9,%r14 - jb .Louter - - xorq %r14,%r14 - movq (%rsp),%rax - movq %r9,%r15 - -.align 16 -.Lsub: sbbq (%rcx,%r14,8),%rax - movq %rax,(%rdi,%r14,8) - movq 8(%rsp,%r14,8),%rax - leaq 1(%r14),%r14 - decq %r15 - jnz .Lsub - - sbbq $0,%rax - movq $-1,%rbx - xorq %rax,%rbx - xorq %r14,%r14 - movq %r9,%r15 - -.Lcopy: - movq (%rdi,%r14,8),%rcx - movq (%rsp,%r14,8),%rdx - andq %rbx,%rcx - andq %rax,%rdx - movq %r9,(%rsp,%r14,8) - orq %rcx,%rdx - movq %rdx,(%rdi,%r14,8) - leaq 1(%r14),%r14 - subq $1,%r15 - jnz .Lcopy - - movq 8(%rsp,%r9,8),%rsi -.cfi_def_cfa %rsi,8 - movq $1,%rax - movq -48(%rsi),%r15 -.cfi_restore %r15 - movq -40(%rsi),%r14 -.cfi_restore %r14 - movq -32(%rsi),%r13 -.cfi_restore %r13 - movq -24(%rsi),%r12 -.cfi_restore %r12 - movq -16(%rsi),%rbp -.cfi_restore %rbp - movq -8(%rsi),%rbx -.cfi_restore %rbx - leaq (%rsi),%rsp -.cfi_def_cfa_register %rsp -.Lmul_epilogue: - .byte 0xf3,0xc3 -.cfi_endproc -.size GFp_bn_mul_mont,.-GFp_bn_mul_mont -.type bn_mul4x_mont,@function -.align 16 -bn_mul4x_mont: -.cfi_startproc - movl %r9d,%r9d - movq %rsp,%rax -.cfi_def_cfa_register %rax -.Lmul4x_enter: - andl $0x80100,%r11d - cmpl $0x80100,%r11d - je .Lmulx4x_enter - pushq %rbx -.cfi_offset %rbx,-16 - pushq %rbp -.cfi_offset %rbp,-24 - pushq %r12 -.cfi_offset %r12,-32 - pushq %r13 -.cfi_offset %r13,-40 - pushq %r14 -.cfi_offset %r14,-48 - pushq %r15 -.cfi_offset %r15,-56 - - negq %r9 - movq %rsp,%r11 - leaq -32(%rsp,%r9,8),%r10 - negq %r9 - andq $-1024,%r10 - - subq %r10,%r11 - andq $-4096,%r11 - leaq (%r10,%r11,1),%rsp - movq (%rsp),%r11 - cmpq %r10,%rsp - ja .Lmul4x_page_walk - jmp .Lmul4x_page_walk_done - -.Lmul4x_page_walk: - leaq -4096(%rsp),%rsp - movq (%rsp),%r11 - cmpq %r10,%rsp - ja .Lmul4x_page_walk -.Lmul4x_page_walk_done: - - movq %rax,8(%rsp,%r9,8) -.cfi_escape 0x0f,0x0a,0x77,0x08,0x79,0x00,0x38,0x1e,0x22,0x06,0x23,0x08 -.Lmul4x_body: - movq %rdi,16(%rsp,%r9,8) - movq %rdx,%r12 - movq (%r8),%r8 - movq (%r12),%rbx - movq (%rsi),%rax - - xorq %r14,%r14 - xorq %r15,%r15 - - movq %r8,%rbp - mulq %rbx - movq %rax,%r10 - movq (%rcx),%rax - - imulq %r10,%rbp - movq %rdx,%r11 - - mulq %rbp - addq %rax,%r10 - movq 8(%rsi),%rax - adcq $0,%rdx - movq %rdx,%rdi - - mulq %rbx - addq %rax,%r11 - movq 8(%rcx),%rax - adcq $0,%rdx - movq %rdx,%r10 - - mulq %rbp - addq %rax,%rdi - movq 16(%rsi),%rax - adcq $0,%rdx - addq %r11,%rdi - leaq 4(%r15),%r15 - adcq $0,%rdx - movq %rdi,(%rsp) - movq %rdx,%r13 - jmp .L1st4x -.align 16 -.L1st4x: - mulq %rbx - addq %rax,%r10 - movq -16(%rcx,%r15,8),%rax - adcq $0,%rdx - movq %rdx,%r11 - - mulq %rbp - addq %rax,%r13 - movq -8(%rsi,%r15,8),%rax - adcq $0,%rdx - addq %r10,%r13 - adcq $0,%rdx - movq %r13,-24(%rsp,%r15,8) - movq %rdx,%rdi - - mulq %rbx - addq %rax,%r11 - movq -8(%rcx,%r15,8),%rax - adcq $0,%rdx - movq %rdx,%r10 - - mulq %rbp - addq %rax,%rdi - movq (%rsi,%r15,8),%rax - adcq $0,%rdx - addq %r11,%rdi - adcq $0,%rdx - movq %rdi,-16(%rsp,%r15,8) - movq %rdx,%r13 - - mulq %rbx - addq %rax,%r10 - movq (%rcx,%r15,8),%rax - adcq $0,%rdx - movq %rdx,%r11 - - mulq %rbp - addq %rax,%r13 - movq 8(%rsi,%r15,8),%rax - adcq $0,%rdx - addq %r10,%r13 - adcq $0,%rdx - movq %r13,-8(%rsp,%r15,8) - movq %rdx,%rdi - - mulq %rbx - addq %rax,%r11 - movq 8(%rcx,%r15,8),%rax - adcq $0,%rdx - leaq 4(%r15),%r15 - movq %rdx,%r10 - - mulq %rbp - addq %rax,%rdi - movq -16(%rsi,%r15,8),%rax - adcq $0,%rdx - addq %r11,%rdi - adcq $0,%rdx - movq %rdi,-32(%rsp,%r15,8) - movq %rdx,%r13 - cmpq %r9,%r15 - jb .L1st4x - - mulq %rbx - addq %rax,%r10 - movq -16(%rcx,%r15,8),%rax - adcq $0,%rdx - movq %rdx,%r11 - - mulq %rbp - addq %rax,%r13 - movq -8(%rsi,%r15,8),%rax - adcq $0,%rdx - addq %r10,%r13 - adcq $0,%rdx - movq %r13,-24(%rsp,%r15,8) - movq %rdx,%rdi - - mulq %rbx - addq %rax,%r11 - movq -8(%rcx,%r15,8),%rax - adcq $0,%rdx - movq %rdx,%r10 - - mulq %rbp - addq %rax,%rdi - movq (%rsi),%rax - adcq $0,%rdx - addq %r11,%rdi - adcq $0,%rdx - movq %rdi,-16(%rsp,%r15,8) - movq %rdx,%r13 - - xorq %rdi,%rdi - addq %r10,%r13 - adcq $0,%rdi - movq %r13,-8(%rsp,%r15,8) - movq %rdi,(%rsp,%r15,8) - - leaq 1(%r14),%r14 -.align 4 -.Louter4x: - movq (%r12,%r14,8),%rbx - xorq %r15,%r15 - movq (%rsp),%r10 - movq %r8,%rbp - mulq %rbx - addq %rax,%r10 - movq (%rcx),%rax - adcq $0,%rdx - - imulq %r10,%rbp - movq %rdx,%r11 - - mulq %rbp - addq %rax,%r10 - movq 8(%rsi),%rax - adcq $0,%rdx - movq %rdx,%rdi - - mulq %rbx - addq %rax,%r11 - movq 8(%rcx),%rax - adcq $0,%rdx - addq 8(%rsp),%r11 - adcq $0,%rdx - movq %rdx,%r10 - - mulq %rbp - addq %rax,%rdi - movq 16(%rsi),%rax - adcq $0,%rdx - addq %r11,%rdi - leaq 4(%r15),%r15 - adcq $0,%rdx - movq %rdi,(%rsp) - movq %rdx,%r13 - jmp .Linner4x -.align 16 -.Linner4x: - mulq %rbx - addq %rax,%r10 - movq -16(%rcx,%r15,8),%rax - adcq $0,%rdx - addq -16(%rsp,%r15,8),%r10 - adcq $0,%rdx - movq %rdx,%r11 - - mulq %rbp - addq %rax,%r13 - movq -8(%rsi,%r15,8),%rax - adcq $0,%rdx - addq %r10,%r13 - adcq $0,%rdx - movq %r13,-24(%rsp,%r15,8) - movq %rdx,%rdi - - mulq %rbx - addq %rax,%r11 - movq -8(%rcx,%r15,8),%rax - adcq $0,%rdx - addq -8(%rsp,%r15,8),%r11 - adcq $0,%rdx - movq %rdx,%r10 - - mulq %rbp - addq %rax,%rdi - movq (%rsi,%r15,8),%rax - adcq $0,%rdx - addq %r11,%rdi - adcq $0,%rdx - movq %rdi,-16(%rsp,%r15,8) - movq %rdx,%r13 - - mulq %rbx - addq %rax,%r10 - movq (%rcx,%r15,8),%rax - adcq $0,%rdx - addq (%rsp,%r15,8),%r10 - adcq $0,%rdx - movq %rdx,%r11 - - mulq %rbp - addq %rax,%r13 - movq 8(%rsi,%r15,8),%rax - adcq $0,%rdx - addq %r10,%r13 - adcq $0,%rdx - movq %r13,-8(%rsp,%r15,8) - movq %rdx,%rdi - - mulq %rbx - addq %rax,%r11 - movq 8(%rcx,%r15,8),%rax - adcq $0,%rdx - addq 8(%rsp,%r15,8),%r11 - adcq $0,%rdx - leaq 4(%r15),%r15 - movq %rdx,%r10 - - mulq %rbp - addq %rax,%rdi - movq -16(%rsi,%r15,8),%rax - adcq $0,%rdx - addq %r11,%rdi - adcq $0,%rdx - movq %rdi,-32(%rsp,%r15,8) - movq %rdx,%r13 - cmpq %r9,%r15 - jb .Linner4x - - mulq %rbx - addq %rax,%r10 - movq -16(%rcx,%r15,8),%rax - adcq $0,%rdx - addq -16(%rsp,%r15,8),%r10 - adcq $0,%rdx - movq %rdx,%r11 - - mulq %rbp - addq %rax,%r13 - movq -8(%rsi,%r15,8),%rax - adcq $0,%rdx - addq %r10,%r13 - adcq $0,%rdx - movq %r13,-24(%rsp,%r15,8) - movq %rdx,%rdi - - mulq %rbx - addq %rax,%r11 - movq -8(%rcx,%r15,8),%rax - adcq $0,%rdx - addq -8(%rsp,%r15,8),%r11 - adcq $0,%rdx - leaq 1(%r14),%r14 - movq %rdx,%r10 - - mulq %rbp - addq %rax,%rdi - movq (%rsi),%rax - adcq $0,%rdx - addq %r11,%rdi - adcq $0,%rdx - movq %rdi,-16(%rsp,%r15,8) - movq %rdx,%r13 - - xorq %rdi,%rdi - addq %r10,%r13 - adcq $0,%rdi - addq (%rsp,%r9,8),%r13 - adcq $0,%rdi - movq %r13,-8(%rsp,%r15,8) - movq %rdi,(%rsp,%r15,8) - - cmpq %r9,%r14 - jb .Louter4x - movq 16(%rsp,%r9,8),%rdi - leaq -4(%r9),%r15 - movq 0(%rsp),%rax - movq 8(%rsp),%rdx - shrq $2,%r15 - leaq (%rsp),%rsi - xorq %r14,%r14 - - subq 0(%rcx),%rax - movq 16(%rsi),%rbx - movq 24(%rsi),%rbp - sbbq 8(%rcx),%rdx - -.Lsub4x: - movq %rax,0(%rdi,%r14,8) - movq %rdx,8(%rdi,%r14,8) - sbbq 16(%rcx,%r14,8),%rbx - movq 32(%rsi,%r14,8),%rax - movq 40(%rsi,%r14,8),%rdx - sbbq 24(%rcx,%r14,8),%rbp - movq %rbx,16(%rdi,%r14,8) - movq %rbp,24(%rdi,%r14,8) - sbbq 32(%rcx,%r14,8),%rax - movq 48(%rsi,%r14,8),%rbx - movq 56(%rsi,%r14,8),%rbp - sbbq 40(%rcx,%r14,8),%rdx - leaq 4(%r14),%r14 - decq %r15 - jnz .Lsub4x - - movq %rax,0(%rdi,%r14,8) - movq 32(%rsi,%r14,8),%rax - sbbq 16(%rcx,%r14,8),%rbx - movq %rdx,8(%rdi,%r14,8) - sbbq 24(%rcx,%r14,8),%rbp - movq %rbx,16(%rdi,%r14,8) - - sbbq $0,%rax - movq %rbp,24(%rdi,%r14,8) - pxor %xmm0,%xmm0 -.byte 102,72,15,110,224 - pcmpeqd %xmm5,%xmm5 - pshufd $0,%xmm4,%xmm4 - movq %r9,%r15 - pxor %xmm4,%xmm5 - shrq $2,%r15 - xorl %eax,%eax - - jmp .Lcopy4x -.align 16 -.Lcopy4x: - movdqa (%rsp,%rax,1),%xmm1 - movdqu (%rdi,%rax,1),%xmm2 - pand %xmm4,%xmm1 - pand %xmm5,%xmm2 - movdqa 16(%rsp,%rax,1),%xmm3 - movdqa %xmm0,(%rsp,%rax,1) - por %xmm2,%xmm1 - movdqu 16(%rdi,%rax,1),%xmm2 - movdqu %xmm1,(%rdi,%rax,1) - pand %xmm4,%xmm3 - pand %xmm5,%xmm2 - movdqa %xmm0,16(%rsp,%rax,1) - por %xmm2,%xmm3 - movdqu %xmm3,16(%rdi,%rax,1) - leaq 32(%rax),%rax - decq %r15 - jnz .Lcopy4x - movq 8(%rsp,%r9,8),%rsi -.cfi_def_cfa %rsi, 8 - movq $1,%rax - movq -48(%rsi),%r15 -.cfi_restore %r15 - movq -40(%rsi),%r14 -.cfi_restore %r14 - movq -32(%rsi),%r13 -.cfi_restore %r13 - movq -24(%rsi),%r12 -.cfi_restore %r12 - movq -16(%rsi),%rbp -.cfi_restore %rbp - movq -8(%rsi),%rbx -.cfi_restore %rbx - leaq (%rsi),%rsp -.cfi_def_cfa_register %rsp -.Lmul4x_epilogue: - .byte 0xf3,0xc3 -.cfi_endproc -.size bn_mul4x_mont,.-bn_mul4x_mont -.extern GFp_bn_sqrx8x_internal -.hidden GFp_bn_sqrx8x_internal -.extern GFp_bn_sqr8x_internal -.hidden GFp_bn_sqr8x_internal - -.type bn_sqr8x_mont,@function -.align 32 -bn_sqr8x_mont: -.cfi_startproc - movq %rsp,%rax -.cfi_def_cfa_register %rax -.Lsqr8x_enter: - pushq %rbx -.cfi_offset %rbx,-16 - pushq %rbp -.cfi_offset %rbp,-24 - pushq %r12 -.cfi_offset %r12,-32 - pushq %r13 -.cfi_offset %r13,-40 - pushq %r14 -.cfi_offset %r14,-48 - pushq %r15 -.cfi_offset %r15,-56 -.Lsqr8x_prologue: - - movl %r9d,%r10d - shll $3,%r9d - shlq $3+2,%r10 - negq %r9 - - - - - - - leaq -64(%rsp,%r9,2),%r11 - movq %rsp,%rbp - movq (%r8),%r8 - subq %rsi,%r11 - andq $4095,%r11 - cmpq %r11,%r10 - jb .Lsqr8x_sp_alt - subq %r11,%rbp - leaq -64(%rbp,%r9,2),%rbp - jmp .Lsqr8x_sp_done - -.align 32 -.Lsqr8x_sp_alt: - leaq 4096-64(,%r9,2),%r10 - leaq -64(%rbp,%r9,2),%rbp - subq %r10,%r11 - movq $0,%r10 - cmovcq %r10,%r11 - subq %r11,%rbp -.Lsqr8x_sp_done: - andq $-64,%rbp - movq %rsp,%r11 - subq %rbp,%r11 - andq $-4096,%r11 - leaq (%r11,%rbp,1),%rsp - movq (%rsp),%r10 - cmpq %rbp,%rsp - ja .Lsqr8x_page_walk - jmp .Lsqr8x_page_walk_done - -.align 16 -.Lsqr8x_page_walk: - leaq -4096(%rsp),%rsp - movq (%rsp),%r10 - cmpq %rbp,%rsp - ja .Lsqr8x_page_walk -.Lsqr8x_page_walk_done: - - movq %r9,%r10 - negq %r9 - - movq %r8,32(%rsp) - movq %rax,40(%rsp) -.cfi_escape 0x0f,0x05,0x77,0x28,0x06,0x23,0x08 -.Lsqr8x_body: - -.byte 102,72,15,110,209 - pxor %xmm0,%xmm0 -.byte 102,72,15,110,207 -.byte 102,73,15,110,218 - movl GFp_ia32cap_P+8(%rip),%eax - andl $0x80100,%eax - cmpl $0x80100,%eax - jne .Lsqr8x_nox - - call GFp_bn_sqrx8x_internal - - - - - leaq (%r8,%rcx,1),%rbx - movq %rcx,%r9 - movq %rcx,%rdx -.byte 102,72,15,126,207 - sarq $3+2,%rcx - jmp .Lsqr8x_sub - -.align 32 -.Lsqr8x_nox: - call GFp_bn_sqr8x_internal - - - - - leaq (%rdi,%r9,1),%rbx - movq %r9,%rcx - movq %r9,%rdx -.byte 102,72,15,126,207 - sarq $3+2,%rcx - jmp .Lsqr8x_sub - -.align 32 -.Lsqr8x_sub: - movq 0(%rbx),%r12 - movq 8(%rbx),%r13 - movq 16(%rbx),%r14 - movq 24(%rbx),%r15 - leaq 32(%rbx),%rbx - sbbq 0(%rbp),%r12 - sbbq 8(%rbp),%r13 - sbbq 16(%rbp),%r14 - sbbq 24(%rbp),%r15 - leaq 32(%rbp),%rbp - movq %r12,0(%rdi) - movq %r13,8(%rdi) - movq %r14,16(%rdi) - movq %r15,24(%rdi) - leaq 32(%rdi),%rdi - incq %rcx - jnz .Lsqr8x_sub - - sbbq $0,%rax - leaq (%rbx,%r9,1),%rbx - leaq (%rdi,%r9,1),%rdi - -.byte 102,72,15,110,200 - pxor %xmm0,%xmm0 - pshufd $0,%xmm1,%xmm1 - movq 40(%rsp),%rsi -.cfi_def_cfa %rsi,8 - jmp .Lsqr8x_cond_copy - -.align 32 -.Lsqr8x_cond_copy: - movdqa 0(%rbx),%xmm2 - movdqa 16(%rbx),%xmm3 - leaq 32(%rbx),%rbx - movdqu 0(%rdi),%xmm4 - movdqu 16(%rdi),%xmm5 - leaq 32(%rdi),%rdi - movdqa %xmm0,-32(%rbx) - movdqa %xmm0,-16(%rbx) - movdqa %xmm0,-32(%rbx,%rdx,1) - movdqa %xmm0,-16(%rbx,%rdx,1) - pcmpeqd %xmm1,%xmm0 - pand %xmm1,%xmm2 - pand %xmm1,%xmm3 - pand %xmm0,%xmm4 - pand %xmm0,%xmm5 - pxor %xmm0,%xmm0 - por %xmm2,%xmm4 - por %xmm3,%xmm5 - movdqu %xmm4,-32(%rdi) - movdqu %xmm5,-16(%rdi) - addq $32,%r9 - jnz .Lsqr8x_cond_copy - - movq $1,%rax - movq -48(%rsi),%r15 -.cfi_restore %r15 - movq -40(%rsi),%r14 -.cfi_restore %r14 - movq -32(%rsi),%r13 -.cfi_restore %r13 - movq -24(%rsi),%r12 -.cfi_restore %r12 - movq -16(%rsi),%rbp -.cfi_restore %rbp - movq -8(%rsi),%rbx -.cfi_restore %rbx - leaq (%rsi),%rsp -.cfi_def_cfa_register %rsp -.Lsqr8x_epilogue: - .byte 0xf3,0xc3 -.cfi_endproc -.size bn_sqr8x_mont,.-bn_sqr8x_mont -.type bn_mulx4x_mont,@function -.align 32 -bn_mulx4x_mont: -.cfi_startproc - movq %rsp,%rax -.cfi_def_cfa_register %rax -.Lmulx4x_enter: - pushq %rbx -.cfi_offset %rbx,-16 - pushq %rbp -.cfi_offset %rbp,-24 - pushq %r12 -.cfi_offset %r12,-32 - pushq %r13 -.cfi_offset %r13,-40 - pushq %r14 -.cfi_offset %r14,-48 - pushq %r15 -.cfi_offset %r15,-56 -.Lmulx4x_prologue: - - shll $3,%r9d - xorq %r10,%r10 - subq %r9,%r10 - movq (%r8),%r8 - leaq -72(%rsp,%r10,1),%rbp - andq $-128,%rbp - movq %rsp,%r11 - subq %rbp,%r11 - andq $-4096,%r11 - leaq (%r11,%rbp,1),%rsp - movq (%rsp),%r10 - cmpq %rbp,%rsp - ja .Lmulx4x_page_walk - jmp .Lmulx4x_page_walk_done - -.align 16 -.Lmulx4x_page_walk: - leaq -4096(%rsp),%rsp - movq (%rsp),%r10 - cmpq %rbp,%rsp - ja .Lmulx4x_page_walk -.Lmulx4x_page_walk_done: - - leaq (%rdx,%r9,1),%r10 - - - - - - - - - - - - - movq %r9,0(%rsp) - shrq $5,%r9 - movq %r10,16(%rsp) - subq $1,%r9 - movq %r8,24(%rsp) - movq %rdi,32(%rsp) - movq %rax,40(%rsp) -.cfi_escape 0x0f,0x05,0x77,0x28,0x06,0x23,0x08 - movq %r9,48(%rsp) - jmp .Lmulx4x_body - -.align 32 -.Lmulx4x_body: - leaq 8(%rdx),%rdi - movq (%rdx),%rdx - leaq 64+32(%rsp),%rbx - movq %rdx,%r9 - - mulxq 0(%rsi),%r8,%rax - mulxq 8(%rsi),%r11,%r14 - addq %rax,%r11 - movq %rdi,8(%rsp) - mulxq 16(%rsi),%r12,%r13 - adcq %r14,%r12 - adcq $0,%r13 - - movq %r8,%rdi - imulq 24(%rsp),%r8 - xorq %rbp,%rbp - - mulxq 24(%rsi),%rax,%r14 - movq %r8,%rdx - leaq 32(%rsi),%rsi - adcxq %rax,%r13 - adcxq %rbp,%r14 - - mulxq 0(%rcx),%rax,%r10 - adcxq %rax,%rdi - adoxq %r11,%r10 - mulxq 8(%rcx),%rax,%r11 - adcxq %rax,%r10 - adoxq %r12,%r11 -.byte 0xc4,0x62,0xfb,0xf6,0xa1,0x10,0x00,0x00,0x00 - movq 48(%rsp),%rdi - movq %r10,-32(%rbx) - adcxq %rax,%r11 - adoxq %r13,%r12 - mulxq 24(%rcx),%rax,%r15 - movq %r9,%rdx - movq %r11,-24(%rbx) - adcxq %rax,%r12 - adoxq %rbp,%r15 - leaq 32(%rcx),%rcx - movq %r12,-16(%rbx) - - jmp .Lmulx4x_1st - -.align 32 -.Lmulx4x_1st: - adcxq %rbp,%r15 - mulxq 0(%rsi),%r10,%rax - adcxq %r14,%r10 - mulxq 8(%rsi),%r11,%r14 - adcxq %rax,%r11 - mulxq 16(%rsi),%r12,%rax - adcxq %r14,%r12 - mulxq 24(%rsi),%r13,%r14 -.byte 0x67,0x67 - movq %r8,%rdx - adcxq %rax,%r13 - adcxq %rbp,%r14 - leaq 32(%rsi),%rsi - leaq 32(%rbx),%rbx - - adoxq %r15,%r10 - mulxq 0(%rcx),%rax,%r15 - adcxq %rax,%r10 - adoxq %r15,%r11 - mulxq 8(%rcx),%rax,%r15 - adcxq %rax,%r11 - adoxq %r15,%r12 - mulxq 16(%rcx),%rax,%r15 - movq %r10,-40(%rbx) - adcxq %rax,%r12 - movq %r11,-32(%rbx) - adoxq %r15,%r13 - mulxq 24(%rcx),%rax,%r15 - movq %r9,%rdx - movq %r12,-24(%rbx) - adcxq %rax,%r13 - adoxq %rbp,%r15 - leaq 32(%rcx),%rcx - movq %r13,-16(%rbx) - - decq %rdi - jnz .Lmulx4x_1st - - movq 0(%rsp),%rax - movq 8(%rsp),%rdi - adcq %rbp,%r15 - addq %r15,%r14 - sbbq %r15,%r15 - movq %r14,-8(%rbx) - jmp .Lmulx4x_outer - -.align 32 -.Lmulx4x_outer: - movq (%rdi),%rdx - leaq 8(%rdi),%rdi - subq %rax,%rsi - movq %r15,(%rbx) - leaq 64+32(%rsp),%rbx - subq %rax,%rcx - - mulxq 0(%rsi),%r8,%r11 - xorl %ebp,%ebp - movq %rdx,%r9 - mulxq 8(%rsi),%r14,%r12 - adoxq -32(%rbx),%r8 - adcxq %r14,%r11 - mulxq 16(%rsi),%r15,%r13 - adoxq -24(%rbx),%r11 - adcxq %r15,%r12 - adoxq -16(%rbx),%r12 - adcxq %rbp,%r13 - adoxq %rbp,%r13 - - movq %rdi,8(%rsp) - movq %r8,%r15 - imulq 24(%rsp),%r8 - xorl %ebp,%ebp - - mulxq 24(%rsi),%rax,%r14 - movq %r8,%rdx - adcxq %rax,%r13 - adoxq -8(%rbx),%r13 - adcxq %rbp,%r14 - leaq 32(%rsi),%rsi - adoxq %rbp,%r14 - - mulxq 0(%rcx),%rax,%r10 - adcxq %rax,%r15 - adoxq %r11,%r10 - mulxq 8(%rcx),%rax,%r11 - adcxq %rax,%r10 - adoxq %r12,%r11 - mulxq 16(%rcx),%rax,%r12 - movq %r10,-32(%rbx) - adcxq %rax,%r11 - adoxq %r13,%r12 - mulxq 24(%rcx),%rax,%r15 - movq %r9,%rdx - movq %r11,-24(%rbx) - leaq 32(%rcx),%rcx - adcxq %rax,%r12 - adoxq %rbp,%r15 - movq 48(%rsp),%rdi - movq %r12,-16(%rbx) - - jmp .Lmulx4x_inner - -.align 32 -.Lmulx4x_inner: - mulxq 0(%rsi),%r10,%rax - adcxq %rbp,%r15 - adoxq %r14,%r10 - mulxq 8(%rsi),%r11,%r14 - adcxq 0(%rbx),%r10 - adoxq %rax,%r11 - mulxq 16(%rsi),%r12,%rax - adcxq 8(%rbx),%r11 - adoxq %r14,%r12 - mulxq 24(%rsi),%r13,%r14 - movq %r8,%rdx - adcxq 16(%rbx),%r12 - adoxq %rax,%r13 - adcxq 24(%rbx),%r13 - adoxq %rbp,%r14 - leaq 32(%rsi),%rsi - leaq 32(%rbx),%rbx - adcxq %rbp,%r14 - - adoxq %r15,%r10 - mulxq 0(%rcx),%rax,%r15 - adcxq %rax,%r10 - adoxq %r15,%r11 - mulxq 8(%rcx),%rax,%r15 - adcxq %rax,%r11 - adoxq %r15,%r12 - mulxq 16(%rcx),%rax,%r15 - movq %r10,-40(%rbx) - adcxq %rax,%r12 - adoxq %r15,%r13 - mulxq 24(%rcx),%rax,%r15 - movq %r9,%rdx - movq %r11,-32(%rbx) - movq %r12,-24(%rbx) - adcxq %rax,%r13 - adoxq %rbp,%r15 - leaq 32(%rcx),%rcx - movq %r13,-16(%rbx) - - decq %rdi - jnz .Lmulx4x_inner - - movq 0(%rsp),%rax - movq 8(%rsp),%rdi - adcq %rbp,%r15 - subq 0(%rbx),%rbp - adcq %r15,%r14 - sbbq %r15,%r15 - movq %r14,-8(%rbx) - - cmpq 16(%rsp),%rdi - jne .Lmulx4x_outer - - leaq 64(%rsp),%rbx - subq %rax,%rcx - negq %r15 - movq %rax,%rdx - shrq $3+2,%rax - movq 32(%rsp),%rdi - jmp .Lmulx4x_sub - -.align 32 -.Lmulx4x_sub: - movq 0(%rbx),%r11 - movq 8(%rbx),%r12 - movq 16(%rbx),%r13 - movq 24(%rbx),%r14 - leaq 32(%rbx),%rbx - sbbq 0(%rcx),%r11 - sbbq 8(%rcx),%r12 - sbbq 16(%rcx),%r13 - sbbq 24(%rcx),%r14 - leaq 32(%rcx),%rcx - movq %r11,0(%rdi) - movq %r12,8(%rdi) - movq %r13,16(%rdi) - movq %r14,24(%rdi) - leaq 32(%rdi),%rdi - decq %rax - jnz .Lmulx4x_sub - - sbbq $0,%r15 - leaq 64(%rsp),%rbx - subq %rdx,%rdi - -.byte 102,73,15,110,207 - pxor %xmm0,%xmm0 - pshufd $0,%xmm1,%xmm1 - movq 40(%rsp),%rsi -.cfi_def_cfa %rsi,8 - jmp .Lmulx4x_cond_copy - -.align 32 -.Lmulx4x_cond_copy: - movdqa 0(%rbx),%xmm2 - movdqa 16(%rbx),%xmm3 - leaq 32(%rbx),%rbx - movdqu 0(%rdi),%xmm4 - movdqu 16(%rdi),%xmm5 - leaq 32(%rdi),%rdi - movdqa %xmm0,-32(%rbx) - movdqa %xmm0,-16(%rbx) - pcmpeqd %xmm1,%xmm0 - pand %xmm1,%xmm2 - pand %xmm1,%xmm3 - pand %xmm0,%xmm4 - pand %xmm0,%xmm5 - pxor %xmm0,%xmm0 - por %xmm2,%xmm4 - por %xmm3,%xmm5 - movdqu %xmm4,-32(%rdi) - movdqu %xmm5,-16(%rdi) - subq $32,%rdx - jnz .Lmulx4x_cond_copy - - movq %rdx,(%rbx) - - movq $1,%rax - movq -48(%rsi),%r15 -.cfi_restore %r15 - movq -40(%rsi),%r14 -.cfi_restore %r14 - movq -32(%rsi),%r13 -.cfi_restore %r13 - movq -24(%rsi),%r12 -.cfi_restore %r12 - movq -16(%rsi),%rbp -.cfi_restore %rbp - movq -8(%rsi),%rbx -.cfi_restore %rbx - leaq (%rsi),%rsp -.cfi_def_cfa_register %rsp -.Lmulx4x_epilogue: - .byte 0xf3,0xc3 -.cfi_endproc -.size bn_mulx4x_mont,.-bn_mulx4x_mont -.byte 77,111,110,116,103,111,109,101,114,121,32,77,117,108,116,105,112,108,105,99,97,116,105,111,110,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 -.align 16 -#endif -.section .note.GNU-stack,"",@progbits diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/x86_64-mont-macosx.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/x86_64-mont-macosx.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/x86_64-mont-macosx.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/x86_64-mont-macosx.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,1251 +0,0 @@ -# This file is generated from a similarly-named Perl script in the BoringSSL -# source tree. Do not edit by hand. - -#if defined(__has_feature) -#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM) -#define OPENSSL_NO_ASM -#endif -#endif - -#if defined(__x86_64__) && !defined(OPENSSL_NO_ASM) -.text - - - -.globl _GFp_bn_mul_mont -.private_extern _GFp_bn_mul_mont - -.p2align 4 -_GFp_bn_mul_mont: - - movl %r9d,%r9d - movq %rsp,%rax - - testl $3,%r9d - jnz L$mul_enter - cmpl $8,%r9d - jb L$mul_enter - movl _GFp_ia32cap_P+8(%rip),%r11d - cmpq %rsi,%rdx - jne L$mul4x_enter - testl $7,%r9d - jz L$sqr8x_enter - jmp L$mul4x_enter - -.p2align 4 -L$mul_enter: - pushq %rbx - - pushq %rbp - - pushq %r12 - - pushq %r13 - - pushq %r14 - - pushq %r15 - - - negq %r9 - movq %rsp,%r11 - leaq -16(%rsp,%r9,8),%r10 - negq %r9 - andq $-1024,%r10 - - - - - - - - - - subq %r10,%r11 - andq $-4096,%r11 - leaq (%r10,%r11,1),%rsp - movq (%rsp),%r11 - cmpq %r10,%rsp - ja L$mul_page_walk - jmp L$mul_page_walk_done - -.p2align 4 -L$mul_page_walk: - leaq -4096(%rsp),%rsp - movq (%rsp),%r11 - cmpq %r10,%rsp - ja L$mul_page_walk -L$mul_page_walk_done: - - movq %rax,8(%rsp,%r9,8) - -L$mul_body: - movq %rdx,%r12 - movq (%r8),%r8 - movq (%r12),%rbx - movq (%rsi),%rax - - xorq %r14,%r14 - xorq %r15,%r15 - - movq %r8,%rbp - mulq %rbx - movq %rax,%r10 - movq (%rcx),%rax - - imulq %r10,%rbp - movq %rdx,%r11 - - mulq %rbp - addq %rax,%r10 - movq 8(%rsi),%rax - adcq $0,%rdx - movq %rdx,%r13 - - leaq 1(%r15),%r15 - jmp L$1st_enter - -.p2align 4 -L$1st: - addq %rax,%r13 - movq (%rsi,%r15,8),%rax - adcq $0,%rdx - addq %r11,%r13 - movq %r10,%r11 - adcq $0,%rdx - movq %r13,-16(%rsp,%r15,8) - movq %rdx,%r13 - -L$1st_enter: - mulq %rbx - addq %rax,%r11 - movq (%rcx,%r15,8),%rax - adcq $0,%rdx - leaq 1(%r15),%r15 - movq %rdx,%r10 - - mulq %rbp - cmpq %r9,%r15 - jne L$1st - - addq %rax,%r13 - movq (%rsi),%rax - adcq $0,%rdx - addq %r11,%r13 - adcq $0,%rdx - movq %r13,-16(%rsp,%r15,8) - movq %rdx,%r13 - movq %r10,%r11 - - xorq %rdx,%rdx - addq %r11,%r13 - adcq $0,%rdx - movq %r13,-8(%rsp,%r9,8) - movq %rdx,(%rsp,%r9,8) - - leaq 1(%r14),%r14 - jmp L$outer -.p2align 4 -L$outer: - movq (%r12,%r14,8),%rbx - xorq %r15,%r15 - movq %r8,%rbp - movq (%rsp),%r10 - mulq %rbx - addq %rax,%r10 - movq (%rcx),%rax - adcq $0,%rdx - - imulq %r10,%rbp - movq %rdx,%r11 - - mulq %rbp - addq %rax,%r10 - movq 8(%rsi),%rax - adcq $0,%rdx - movq 8(%rsp),%r10 - movq %rdx,%r13 - - leaq 1(%r15),%r15 - jmp L$inner_enter - -.p2align 4 -L$inner: - addq %rax,%r13 - movq (%rsi,%r15,8),%rax - adcq $0,%rdx - addq %r10,%r13 - movq (%rsp,%r15,8),%r10 - adcq $0,%rdx - movq %r13,-16(%rsp,%r15,8) - movq %rdx,%r13 - -L$inner_enter: - mulq %rbx - addq %rax,%r11 - movq (%rcx,%r15,8),%rax - adcq $0,%rdx - addq %r11,%r10 - movq %rdx,%r11 - adcq $0,%r11 - leaq 1(%r15),%r15 - - mulq %rbp - cmpq %r9,%r15 - jne L$inner - - addq %rax,%r13 - movq (%rsi),%rax - adcq $0,%rdx - addq %r10,%r13 - movq (%rsp,%r15,8),%r10 - adcq $0,%rdx - movq %r13,-16(%rsp,%r15,8) - movq %rdx,%r13 - - xorq %rdx,%rdx - addq %r11,%r13 - adcq $0,%rdx - addq %r10,%r13 - adcq $0,%rdx - movq %r13,-8(%rsp,%r9,8) - movq %rdx,(%rsp,%r9,8) - - leaq 1(%r14),%r14 - cmpq %r9,%r14 - jb L$outer - - xorq %r14,%r14 - movq (%rsp),%rax - movq %r9,%r15 - -.p2align 4 -L$sub: sbbq (%rcx,%r14,8),%rax - movq %rax,(%rdi,%r14,8) - movq 8(%rsp,%r14,8),%rax - leaq 1(%r14),%r14 - decq %r15 - jnz L$sub - - sbbq $0,%rax - movq $-1,%rbx - xorq %rax,%rbx - xorq %r14,%r14 - movq %r9,%r15 - -L$copy: - movq (%rdi,%r14,8),%rcx - movq (%rsp,%r14,8),%rdx - andq %rbx,%rcx - andq %rax,%rdx - movq %r9,(%rsp,%r14,8) - orq %rcx,%rdx - movq %rdx,(%rdi,%r14,8) - leaq 1(%r14),%r14 - subq $1,%r15 - jnz L$copy - - movq 8(%rsp,%r9,8),%rsi - - movq $1,%rax - movq -48(%rsi),%r15 - - movq -40(%rsi),%r14 - - movq -32(%rsi),%r13 - - movq -24(%rsi),%r12 - - movq -16(%rsi),%rbp - - movq -8(%rsi),%rbx - - leaq (%rsi),%rsp - -L$mul_epilogue: - .byte 0xf3,0xc3 - - - -.p2align 4 -bn_mul4x_mont: - - movl %r9d,%r9d - movq %rsp,%rax - -L$mul4x_enter: - andl $0x80100,%r11d - cmpl $0x80100,%r11d - je L$mulx4x_enter - pushq %rbx - - pushq %rbp - - pushq %r12 - - pushq %r13 - - pushq %r14 - - pushq %r15 - - - negq %r9 - movq %rsp,%r11 - leaq -32(%rsp,%r9,8),%r10 - negq %r9 - andq $-1024,%r10 - - subq %r10,%r11 - andq $-4096,%r11 - leaq (%r10,%r11,1),%rsp - movq (%rsp),%r11 - cmpq %r10,%rsp - ja L$mul4x_page_walk - jmp L$mul4x_page_walk_done - -L$mul4x_page_walk: - leaq -4096(%rsp),%rsp - movq (%rsp),%r11 - cmpq %r10,%rsp - ja L$mul4x_page_walk -L$mul4x_page_walk_done: - - movq %rax,8(%rsp,%r9,8) - -L$mul4x_body: - movq %rdi,16(%rsp,%r9,8) - movq %rdx,%r12 - movq (%r8),%r8 - movq (%r12),%rbx - movq (%rsi),%rax - - xorq %r14,%r14 - xorq %r15,%r15 - - movq %r8,%rbp - mulq %rbx - movq %rax,%r10 - movq (%rcx),%rax - - imulq %r10,%rbp - movq %rdx,%r11 - - mulq %rbp - addq %rax,%r10 - movq 8(%rsi),%rax - adcq $0,%rdx - movq %rdx,%rdi - - mulq %rbx - addq %rax,%r11 - movq 8(%rcx),%rax - adcq $0,%rdx - movq %rdx,%r10 - - mulq %rbp - addq %rax,%rdi - movq 16(%rsi),%rax - adcq $0,%rdx - addq %r11,%rdi - leaq 4(%r15),%r15 - adcq $0,%rdx - movq %rdi,(%rsp) - movq %rdx,%r13 - jmp L$1st4x -.p2align 4 -L$1st4x: - mulq %rbx - addq %rax,%r10 - movq -16(%rcx,%r15,8),%rax - adcq $0,%rdx - movq %rdx,%r11 - - mulq %rbp - addq %rax,%r13 - movq -8(%rsi,%r15,8),%rax - adcq $0,%rdx - addq %r10,%r13 - adcq $0,%rdx - movq %r13,-24(%rsp,%r15,8) - movq %rdx,%rdi - - mulq %rbx - addq %rax,%r11 - movq -8(%rcx,%r15,8),%rax - adcq $0,%rdx - movq %rdx,%r10 - - mulq %rbp - addq %rax,%rdi - movq (%rsi,%r15,8),%rax - adcq $0,%rdx - addq %r11,%rdi - adcq $0,%rdx - movq %rdi,-16(%rsp,%r15,8) - movq %rdx,%r13 - - mulq %rbx - addq %rax,%r10 - movq (%rcx,%r15,8),%rax - adcq $0,%rdx - movq %rdx,%r11 - - mulq %rbp - addq %rax,%r13 - movq 8(%rsi,%r15,8),%rax - adcq $0,%rdx - addq %r10,%r13 - adcq $0,%rdx - movq %r13,-8(%rsp,%r15,8) - movq %rdx,%rdi - - mulq %rbx - addq %rax,%r11 - movq 8(%rcx,%r15,8),%rax - adcq $0,%rdx - leaq 4(%r15),%r15 - movq %rdx,%r10 - - mulq %rbp - addq %rax,%rdi - movq -16(%rsi,%r15,8),%rax - adcq $0,%rdx - addq %r11,%rdi - adcq $0,%rdx - movq %rdi,-32(%rsp,%r15,8) - movq %rdx,%r13 - cmpq %r9,%r15 - jb L$1st4x - - mulq %rbx - addq %rax,%r10 - movq -16(%rcx,%r15,8),%rax - adcq $0,%rdx - movq %rdx,%r11 - - mulq %rbp - addq %rax,%r13 - movq -8(%rsi,%r15,8),%rax - adcq $0,%rdx - addq %r10,%r13 - adcq $0,%rdx - movq %r13,-24(%rsp,%r15,8) - movq %rdx,%rdi - - mulq %rbx - addq %rax,%r11 - movq -8(%rcx,%r15,8),%rax - adcq $0,%rdx - movq %rdx,%r10 - - mulq %rbp - addq %rax,%rdi - movq (%rsi),%rax - adcq $0,%rdx - addq %r11,%rdi - adcq $0,%rdx - movq %rdi,-16(%rsp,%r15,8) - movq %rdx,%r13 - - xorq %rdi,%rdi - addq %r10,%r13 - adcq $0,%rdi - movq %r13,-8(%rsp,%r15,8) - movq %rdi,(%rsp,%r15,8) - - leaq 1(%r14),%r14 -.p2align 2 -L$outer4x: - movq (%r12,%r14,8),%rbx - xorq %r15,%r15 - movq (%rsp),%r10 - movq %r8,%rbp - mulq %rbx - addq %rax,%r10 - movq (%rcx),%rax - adcq $0,%rdx - - imulq %r10,%rbp - movq %rdx,%r11 - - mulq %rbp - addq %rax,%r10 - movq 8(%rsi),%rax - adcq $0,%rdx - movq %rdx,%rdi - - mulq %rbx - addq %rax,%r11 - movq 8(%rcx),%rax - adcq $0,%rdx - addq 8(%rsp),%r11 - adcq $0,%rdx - movq %rdx,%r10 - - mulq %rbp - addq %rax,%rdi - movq 16(%rsi),%rax - adcq $0,%rdx - addq %r11,%rdi - leaq 4(%r15),%r15 - adcq $0,%rdx - movq %rdi,(%rsp) - movq %rdx,%r13 - jmp L$inner4x -.p2align 4 -L$inner4x: - mulq %rbx - addq %rax,%r10 - movq -16(%rcx,%r15,8),%rax - adcq $0,%rdx - addq -16(%rsp,%r15,8),%r10 - adcq $0,%rdx - movq %rdx,%r11 - - mulq %rbp - addq %rax,%r13 - movq -8(%rsi,%r15,8),%rax - adcq $0,%rdx - addq %r10,%r13 - adcq $0,%rdx - movq %r13,-24(%rsp,%r15,8) - movq %rdx,%rdi - - mulq %rbx - addq %rax,%r11 - movq -8(%rcx,%r15,8),%rax - adcq $0,%rdx - addq -8(%rsp,%r15,8),%r11 - adcq $0,%rdx - movq %rdx,%r10 - - mulq %rbp - addq %rax,%rdi - movq (%rsi,%r15,8),%rax - adcq $0,%rdx - addq %r11,%rdi - adcq $0,%rdx - movq %rdi,-16(%rsp,%r15,8) - movq %rdx,%r13 - - mulq %rbx - addq %rax,%r10 - movq (%rcx,%r15,8),%rax - adcq $0,%rdx - addq (%rsp,%r15,8),%r10 - adcq $0,%rdx - movq %rdx,%r11 - - mulq %rbp - addq %rax,%r13 - movq 8(%rsi,%r15,8),%rax - adcq $0,%rdx - addq %r10,%r13 - adcq $0,%rdx - movq %r13,-8(%rsp,%r15,8) - movq %rdx,%rdi - - mulq %rbx - addq %rax,%r11 - movq 8(%rcx,%r15,8),%rax - adcq $0,%rdx - addq 8(%rsp,%r15,8),%r11 - adcq $0,%rdx - leaq 4(%r15),%r15 - movq %rdx,%r10 - - mulq %rbp - addq %rax,%rdi - movq -16(%rsi,%r15,8),%rax - adcq $0,%rdx - addq %r11,%rdi - adcq $0,%rdx - movq %rdi,-32(%rsp,%r15,8) - movq %rdx,%r13 - cmpq %r9,%r15 - jb L$inner4x - - mulq %rbx - addq %rax,%r10 - movq -16(%rcx,%r15,8),%rax - adcq $0,%rdx - addq -16(%rsp,%r15,8),%r10 - adcq $0,%rdx - movq %rdx,%r11 - - mulq %rbp - addq %rax,%r13 - movq -8(%rsi,%r15,8),%rax - adcq $0,%rdx - addq %r10,%r13 - adcq $0,%rdx - movq %r13,-24(%rsp,%r15,8) - movq %rdx,%rdi - - mulq %rbx - addq %rax,%r11 - movq -8(%rcx,%r15,8),%rax - adcq $0,%rdx - addq -8(%rsp,%r15,8),%r11 - adcq $0,%rdx - leaq 1(%r14),%r14 - movq %rdx,%r10 - - mulq %rbp - addq %rax,%rdi - movq (%rsi),%rax - adcq $0,%rdx - addq %r11,%rdi - adcq $0,%rdx - movq %rdi,-16(%rsp,%r15,8) - movq %rdx,%r13 - - xorq %rdi,%rdi - addq %r10,%r13 - adcq $0,%rdi - addq (%rsp,%r9,8),%r13 - adcq $0,%rdi - movq %r13,-8(%rsp,%r15,8) - movq %rdi,(%rsp,%r15,8) - - cmpq %r9,%r14 - jb L$outer4x - movq 16(%rsp,%r9,8),%rdi - leaq -4(%r9),%r15 - movq 0(%rsp),%rax - movq 8(%rsp),%rdx - shrq $2,%r15 - leaq (%rsp),%rsi - xorq %r14,%r14 - - subq 0(%rcx),%rax - movq 16(%rsi),%rbx - movq 24(%rsi),%rbp - sbbq 8(%rcx),%rdx - -L$sub4x: - movq %rax,0(%rdi,%r14,8) - movq %rdx,8(%rdi,%r14,8) - sbbq 16(%rcx,%r14,8),%rbx - movq 32(%rsi,%r14,8),%rax - movq 40(%rsi,%r14,8),%rdx - sbbq 24(%rcx,%r14,8),%rbp - movq %rbx,16(%rdi,%r14,8) - movq %rbp,24(%rdi,%r14,8) - sbbq 32(%rcx,%r14,8),%rax - movq 48(%rsi,%r14,8),%rbx - movq 56(%rsi,%r14,8),%rbp - sbbq 40(%rcx,%r14,8),%rdx - leaq 4(%r14),%r14 - decq %r15 - jnz L$sub4x - - movq %rax,0(%rdi,%r14,8) - movq 32(%rsi,%r14,8),%rax - sbbq 16(%rcx,%r14,8),%rbx - movq %rdx,8(%rdi,%r14,8) - sbbq 24(%rcx,%r14,8),%rbp - movq %rbx,16(%rdi,%r14,8) - - sbbq $0,%rax - movq %rbp,24(%rdi,%r14,8) - pxor %xmm0,%xmm0 -.byte 102,72,15,110,224 - pcmpeqd %xmm5,%xmm5 - pshufd $0,%xmm4,%xmm4 - movq %r9,%r15 - pxor %xmm4,%xmm5 - shrq $2,%r15 - xorl %eax,%eax - - jmp L$copy4x -.p2align 4 -L$copy4x: - movdqa (%rsp,%rax,1),%xmm1 - movdqu (%rdi,%rax,1),%xmm2 - pand %xmm4,%xmm1 - pand %xmm5,%xmm2 - movdqa 16(%rsp,%rax,1),%xmm3 - movdqa %xmm0,(%rsp,%rax,1) - por %xmm2,%xmm1 - movdqu 16(%rdi,%rax,1),%xmm2 - movdqu %xmm1,(%rdi,%rax,1) - pand %xmm4,%xmm3 - pand %xmm5,%xmm2 - movdqa %xmm0,16(%rsp,%rax,1) - por %xmm2,%xmm3 - movdqu %xmm3,16(%rdi,%rax,1) - leaq 32(%rax),%rax - decq %r15 - jnz L$copy4x - movq 8(%rsp,%r9,8),%rsi - - movq $1,%rax - movq -48(%rsi),%r15 - - movq -40(%rsi),%r14 - - movq -32(%rsi),%r13 - - movq -24(%rsi),%r12 - - movq -16(%rsi),%rbp - - movq -8(%rsi),%rbx - - leaq (%rsi),%rsp - -L$mul4x_epilogue: - .byte 0xf3,0xc3 - - - - - - -.p2align 5 -bn_sqr8x_mont: - - movq %rsp,%rax - -L$sqr8x_enter: - pushq %rbx - - pushq %rbp - - pushq %r12 - - pushq %r13 - - pushq %r14 - - pushq %r15 - -L$sqr8x_prologue: - - movl %r9d,%r10d - shll $3,%r9d - shlq $3+2,%r10 - negq %r9 - - - - - - - leaq -64(%rsp,%r9,2),%r11 - movq %rsp,%rbp - movq (%r8),%r8 - subq %rsi,%r11 - andq $4095,%r11 - cmpq %r11,%r10 - jb L$sqr8x_sp_alt - subq %r11,%rbp - leaq -64(%rbp,%r9,2),%rbp - jmp L$sqr8x_sp_done - -.p2align 5 -L$sqr8x_sp_alt: - leaq 4096-64(,%r9,2),%r10 - leaq -64(%rbp,%r9,2),%rbp - subq %r10,%r11 - movq $0,%r10 - cmovcq %r10,%r11 - subq %r11,%rbp -L$sqr8x_sp_done: - andq $-64,%rbp - movq %rsp,%r11 - subq %rbp,%r11 - andq $-4096,%r11 - leaq (%r11,%rbp,1),%rsp - movq (%rsp),%r10 - cmpq %rbp,%rsp - ja L$sqr8x_page_walk - jmp L$sqr8x_page_walk_done - -.p2align 4 -L$sqr8x_page_walk: - leaq -4096(%rsp),%rsp - movq (%rsp),%r10 - cmpq %rbp,%rsp - ja L$sqr8x_page_walk -L$sqr8x_page_walk_done: - - movq %r9,%r10 - negq %r9 - - movq %r8,32(%rsp) - movq %rax,40(%rsp) - -L$sqr8x_body: - -.byte 102,72,15,110,209 - pxor %xmm0,%xmm0 -.byte 102,72,15,110,207 -.byte 102,73,15,110,218 - movl _GFp_ia32cap_P+8(%rip),%eax - andl $0x80100,%eax - cmpl $0x80100,%eax - jne L$sqr8x_nox - - call _GFp_bn_sqrx8x_internal - - - - - leaq (%r8,%rcx,1),%rbx - movq %rcx,%r9 - movq %rcx,%rdx -.byte 102,72,15,126,207 - sarq $3+2,%rcx - jmp L$sqr8x_sub - -.p2align 5 -L$sqr8x_nox: - call _GFp_bn_sqr8x_internal - - - - - leaq (%rdi,%r9,1),%rbx - movq %r9,%rcx - movq %r9,%rdx -.byte 102,72,15,126,207 - sarq $3+2,%rcx - jmp L$sqr8x_sub - -.p2align 5 -L$sqr8x_sub: - movq 0(%rbx),%r12 - movq 8(%rbx),%r13 - movq 16(%rbx),%r14 - movq 24(%rbx),%r15 - leaq 32(%rbx),%rbx - sbbq 0(%rbp),%r12 - sbbq 8(%rbp),%r13 - sbbq 16(%rbp),%r14 - sbbq 24(%rbp),%r15 - leaq 32(%rbp),%rbp - movq %r12,0(%rdi) - movq %r13,8(%rdi) - movq %r14,16(%rdi) - movq %r15,24(%rdi) - leaq 32(%rdi),%rdi - incq %rcx - jnz L$sqr8x_sub - - sbbq $0,%rax - leaq (%rbx,%r9,1),%rbx - leaq (%rdi,%r9,1),%rdi - -.byte 102,72,15,110,200 - pxor %xmm0,%xmm0 - pshufd $0,%xmm1,%xmm1 - movq 40(%rsp),%rsi - - jmp L$sqr8x_cond_copy - -.p2align 5 -L$sqr8x_cond_copy: - movdqa 0(%rbx),%xmm2 - movdqa 16(%rbx),%xmm3 - leaq 32(%rbx),%rbx - movdqu 0(%rdi),%xmm4 - movdqu 16(%rdi),%xmm5 - leaq 32(%rdi),%rdi - movdqa %xmm0,-32(%rbx) - movdqa %xmm0,-16(%rbx) - movdqa %xmm0,-32(%rbx,%rdx,1) - movdqa %xmm0,-16(%rbx,%rdx,1) - pcmpeqd %xmm1,%xmm0 - pand %xmm1,%xmm2 - pand %xmm1,%xmm3 - pand %xmm0,%xmm4 - pand %xmm0,%xmm5 - pxor %xmm0,%xmm0 - por %xmm2,%xmm4 - por %xmm3,%xmm5 - movdqu %xmm4,-32(%rdi) - movdqu %xmm5,-16(%rdi) - addq $32,%r9 - jnz L$sqr8x_cond_copy - - movq $1,%rax - movq -48(%rsi),%r15 - - movq -40(%rsi),%r14 - - movq -32(%rsi),%r13 - - movq -24(%rsi),%r12 - - movq -16(%rsi),%rbp - - movq -8(%rsi),%rbx - - leaq (%rsi),%rsp - -L$sqr8x_epilogue: - .byte 0xf3,0xc3 - - - -.p2align 5 -bn_mulx4x_mont: - - movq %rsp,%rax - -L$mulx4x_enter: - pushq %rbx - - pushq %rbp - - pushq %r12 - - pushq %r13 - - pushq %r14 - - pushq %r15 - -L$mulx4x_prologue: - - shll $3,%r9d - xorq %r10,%r10 - subq %r9,%r10 - movq (%r8),%r8 - leaq -72(%rsp,%r10,1),%rbp - andq $-128,%rbp - movq %rsp,%r11 - subq %rbp,%r11 - andq $-4096,%r11 - leaq (%r11,%rbp,1),%rsp - movq (%rsp),%r10 - cmpq %rbp,%rsp - ja L$mulx4x_page_walk - jmp L$mulx4x_page_walk_done - -.p2align 4 -L$mulx4x_page_walk: - leaq -4096(%rsp),%rsp - movq (%rsp),%r10 - cmpq %rbp,%rsp - ja L$mulx4x_page_walk -L$mulx4x_page_walk_done: - - leaq (%rdx,%r9,1),%r10 - - - - - - - - - - - - - movq %r9,0(%rsp) - shrq $5,%r9 - movq %r10,16(%rsp) - subq $1,%r9 - movq %r8,24(%rsp) - movq %rdi,32(%rsp) - movq %rax,40(%rsp) - - movq %r9,48(%rsp) - jmp L$mulx4x_body - -.p2align 5 -L$mulx4x_body: - leaq 8(%rdx),%rdi - movq (%rdx),%rdx - leaq 64+32(%rsp),%rbx - movq %rdx,%r9 - - mulxq 0(%rsi),%r8,%rax - mulxq 8(%rsi),%r11,%r14 - addq %rax,%r11 - movq %rdi,8(%rsp) - mulxq 16(%rsi),%r12,%r13 - adcq %r14,%r12 - adcq $0,%r13 - - movq %r8,%rdi - imulq 24(%rsp),%r8 - xorq %rbp,%rbp - - mulxq 24(%rsi),%rax,%r14 - movq %r8,%rdx - leaq 32(%rsi),%rsi - adcxq %rax,%r13 - adcxq %rbp,%r14 - - mulxq 0(%rcx),%rax,%r10 - adcxq %rax,%rdi - adoxq %r11,%r10 - mulxq 8(%rcx),%rax,%r11 - adcxq %rax,%r10 - adoxq %r12,%r11 -.byte 0xc4,0x62,0xfb,0xf6,0xa1,0x10,0x00,0x00,0x00 - movq 48(%rsp),%rdi - movq %r10,-32(%rbx) - adcxq %rax,%r11 - adoxq %r13,%r12 - mulxq 24(%rcx),%rax,%r15 - movq %r9,%rdx - movq %r11,-24(%rbx) - adcxq %rax,%r12 - adoxq %rbp,%r15 - leaq 32(%rcx),%rcx - movq %r12,-16(%rbx) - - jmp L$mulx4x_1st - -.p2align 5 -L$mulx4x_1st: - adcxq %rbp,%r15 - mulxq 0(%rsi),%r10,%rax - adcxq %r14,%r10 - mulxq 8(%rsi),%r11,%r14 - adcxq %rax,%r11 - mulxq 16(%rsi),%r12,%rax - adcxq %r14,%r12 - mulxq 24(%rsi),%r13,%r14 -.byte 0x67,0x67 - movq %r8,%rdx - adcxq %rax,%r13 - adcxq %rbp,%r14 - leaq 32(%rsi),%rsi - leaq 32(%rbx),%rbx - - adoxq %r15,%r10 - mulxq 0(%rcx),%rax,%r15 - adcxq %rax,%r10 - adoxq %r15,%r11 - mulxq 8(%rcx),%rax,%r15 - adcxq %rax,%r11 - adoxq %r15,%r12 - mulxq 16(%rcx),%rax,%r15 - movq %r10,-40(%rbx) - adcxq %rax,%r12 - movq %r11,-32(%rbx) - adoxq %r15,%r13 - mulxq 24(%rcx),%rax,%r15 - movq %r9,%rdx - movq %r12,-24(%rbx) - adcxq %rax,%r13 - adoxq %rbp,%r15 - leaq 32(%rcx),%rcx - movq %r13,-16(%rbx) - - decq %rdi - jnz L$mulx4x_1st - - movq 0(%rsp),%rax - movq 8(%rsp),%rdi - adcq %rbp,%r15 - addq %r15,%r14 - sbbq %r15,%r15 - movq %r14,-8(%rbx) - jmp L$mulx4x_outer - -.p2align 5 -L$mulx4x_outer: - movq (%rdi),%rdx - leaq 8(%rdi),%rdi - subq %rax,%rsi - movq %r15,(%rbx) - leaq 64+32(%rsp),%rbx - subq %rax,%rcx - - mulxq 0(%rsi),%r8,%r11 - xorl %ebp,%ebp - movq %rdx,%r9 - mulxq 8(%rsi),%r14,%r12 - adoxq -32(%rbx),%r8 - adcxq %r14,%r11 - mulxq 16(%rsi),%r15,%r13 - adoxq -24(%rbx),%r11 - adcxq %r15,%r12 - adoxq -16(%rbx),%r12 - adcxq %rbp,%r13 - adoxq %rbp,%r13 - - movq %rdi,8(%rsp) - movq %r8,%r15 - imulq 24(%rsp),%r8 - xorl %ebp,%ebp - - mulxq 24(%rsi),%rax,%r14 - movq %r8,%rdx - adcxq %rax,%r13 - adoxq -8(%rbx),%r13 - adcxq %rbp,%r14 - leaq 32(%rsi),%rsi - adoxq %rbp,%r14 - - mulxq 0(%rcx),%rax,%r10 - adcxq %rax,%r15 - adoxq %r11,%r10 - mulxq 8(%rcx),%rax,%r11 - adcxq %rax,%r10 - adoxq %r12,%r11 - mulxq 16(%rcx),%rax,%r12 - movq %r10,-32(%rbx) - adcxq %rax,%r11 - adoxq %r13,%r12 - mulxq 24(%rcx),%rax,%r15 - movq %r9,%rdx - movq %r11,-24(%rbx) - leaq 32(%rcx),%rcx - adcxq %rax,%r12 - adoxq %rbp,%r15 - movq 48(%rsp),%rdi - movq %r12,-16(%rbx) - - jmp L$mulx4x_inner - -.p2align 5 -L$mulx4x_inner: - mulxq 0(%rsi),%r10,%rax - adcxq %rbp,%r15 - adoxq %r14,%r10 - mulxq 8(%rsi),%r11,%r14 - adcxq 0(%rbx),%r10 - adoxq %rax,%r11 - mulxq 16(%rsi),%r12,%rax - adcxq 8(%rbx),%r11 - adoxq %r14,%r12 - mulxq 24(%rsi),%r13,%r14 - movq %r8,%rdx - adcxq 16(%rbx),%r12 - adoxq %rax,%r13 - adcxq 24(%rbx),%r13 - adoxq %rbp,%r14 - leaq 32(%rsi),%rsi - leaq 32(%rbx),%rbx - adcxq %rbp,%r14 - - adoxq %r15,%r10 - mulxq 0(%rcx),%rax,%r15 - adcxq %rax,%r10 - adoxq %r15,%r11 - mulxq 8(%rcx),%rax,%r15 - adcxq %rax,%r11 - adoxq %r15,%r12 - mulxq 16(%rcx),%rax,%r15 - movq %r10,-40(%rbx) - adcxq %rax,%r12 - adoxq %r15,%r13 - mulxq 24(%rcx),%rax,%r15 - movq %r9,%rdx - movq %r11,-32(%rbx) - movq %r12,-24(%rbx) - adcxq %rax,%r13 - adoxq %rbp,%r15 - leaq 32(%rcx),%rcx - movq %r13,-16(%rbx) - - decq %rdi - jnz L$mulx4x_inner - - movq 0(%rsp),%rax - movq 8(%rsp),%rdi - adcq %rbp,%r15 - subq 0(%rbx),%rbp - adcq %r15,%r14 - sbbq %r15,%r15 - movq %r14,-8(%rbx) - - cmpq 16(%rsp),%rdi - jne L$mulx4x_outer - - leaq 64(%rsp),%rbx - subq %rax,%rcx - negq %r15 - movq %rax,%rdx - shrq $3+2,%rax - movq 32(%rsp),%rdi - jmp L$mulx4x_sub - -.p2align 5 -L$mulx4x_sub: - movq 0(%rbx),%r11 - movq 8(%rbx),%r12 - movq 16(%rbx),%r13 - movq 24(%rbx),%r14 - leaq 32(%rbx),%rbx - sbbq 0(%rcx),%r11 - sbbq 8(%rcx),%r12 - sbbq 16(%rcx),%r13 - sbbq 24(%rcx),%r14 - leaq 32(%rcx),%rcx - movq %r11,0(%rdi) - movq %r12,8(%rdi) - movq %r13,16(%rdi) - movq %r14,24(%rdi) - leaq 32(%rdi),%rdi - decq %rax - jnz L$mulx4x_sub - - sbbq $0,%r15 - leaq 64(%rsp),%rbx - subq %rdx,%rdi - -.byte 102,73,15,110,207 - pxor %xmm0,%xmm0 - pshufd $0,%xmm1,%xmm1 - movq 40(%rsp),%rsi - - jmp L$mulx4x_cond_copy - -.p2align 5 -L$mulx4x_cond_copy: - movdqa 0(%rbx),%xmm2 - movdqa 16(%rbx),%xmm3 - leaq 32(%rbx),%rbx - movdqu 0(%rdi),%xmm4 - movdqu 16(%rdi),%xmm5 - leaq 32(%rdi),%rdi - movdqa %xmm0,-32(%rbx) - movdqa %xmm0,-16(%rbx) - pcmpeqd %xmm1,%xmm0 - pand %xmm1,%xmm2 - pand %xmm1,%xmm3 - pand %xmm0,%xmm4 - pand %xmm0,%xmm5 - pxor %xmm0,%xmm0 - por %xmm2,%xmm4 - por %xmm3,%xmm5 - movdqu %xmm4,-32(%rdi) - movdqu %xmm5,-16(%rdi) - subq $32,%rdx - jnz L$mulx4x_cond_copy - - movq %rdx,(%rbx) - - movq $1,%rax - movq -48(%rsi),%r15 - - movq -40(%rsi),%r14 - - movq -32(%rsi),%r13 - - movq -24(%rsi),%r12 - - movq -16(%rsi),%rbp - - movq -8(%rsi),%rbx - - leaq (%rsi),%rsp - -L$mulx4x_epilogue: - .byte 0xf3,0xc3 - - -.byte 77,111,110,116,103,111,109,101,114,121,32,77,117,108,116,105,112,108,105,99,97,116,105,111,110,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 -.p2align 4 -#endif Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/x86_64-mont-nasm.obj and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/x86_64-mont-nasm.obj differ diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/x86-mont-elf.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/x86-mont-elf.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/x86-mont-elf.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/x86-mont-elf.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,226 +0,0 @@ -# This file is generated from a similarly-named Perl script in the BoringSSL -# source tree. Do not edit by hand. - -#if defined(__i386__) -#if defined(BORINGSSL_PREFIX) -#include -#endif -.text -.globl GFp_bn_mul_mont -.hidden GFp_bn_mul_mont -.type GFp_bn_mul_mont,@function -.align 16 -GFp_bn_mul_mont: -.L_GFp_bn_mul_mont_begin: - pushl %ebp - pushl %ebx - pushl %esi - pushl %edi - xorl %eax,%eax - movl 40(%esp),%edi - leal 20(%esp),%esi - leal 24(%esp),%edx - addl $2,%edi - negl %edi - leal -32(%esp,%edi,4),%ebp - negl %edi - movl %ebp,%eax - subl %edx,%eax - andl $2047,%eax - subl %eax,%ebp - xorl %ebp,%edx - andl $2048,%edx - xorl $2048,%edx - subl %edx,%ebp - andl $-64,%ebp - movl %esp,%eax - subl %ebp,%eax - andl $-4096,%eax - movl %esp,%edx - leal (%ebp,%eax,1),%esp - movl (%esp),%eax - cmpl %ebp,%esp - ja .L000page_walk - jmp .L001page_walk_done -.align 16 -.L000page_walk: - leal -4096(%esp),%esp - movl (%esp),%eax - cmpl %ebp,%esp - ja .L000page_walk -.L001page_walk_done: - movl (%esi),%eax - movl 4(%esi),%ebx - movl 8(%esi),%ecx - movl 12(%esi),%ebp - movl 16(%esi),%esi - movl (%esi),%esi - movl %eax,4(%esp) - movl %ebx,8(%esp) - movl %ecx,12(%esp) - movl %ebp,16(%esp) - movl %esi,20(%esp) - leal -3(%edi),%ebx - movl %edx,24(%esp) - call .L002PIC_me_up -.L002PIC_me_up: - popl %eax - leal GFp_ia32cap_P-.L002PIC_me_up(%eax),%eax - btl $26,(%eax) - movl $-1,%eax - movd %eax,%mm7 - movl 8(%esp),%esi - movl 12(%esp),%edi - movl 16(%esp),%ebp - xorl %edx,%edx - xorl %ecx,%ecx - movd (%edi),%mm4 - movd (%esi),%mm5 - movd (%ebp),%mm3 - pmuludq %mm4,%mm5 - movq %mm5,%mm2 - movq %mm5,%mm0 - pand %mm7,%mm0 - pmuludq 20(%esp),%mm5 - pmuludq %mm5,%mm3 - paddq %mm0,%mm3 - movd 4(%ebp),%mm1 - movd 4(%esi),%mm0 - psrlq $32,%mm2 - psrlq $32,%mm3 - incl %ecx -.align 16 -.L0031st: - pmuludq %mm4,%mm0 - pmuludq %mm5,%mm1 - paddq %mm0,%mm2 - paddq %mm1,%mm3 - movq %mm2,%mm0 - pand %mm7,%mm0 - movd 4(%ebp,%ecx,4),%mm1 - paddq %mm0,%mm3 - movd 4(%esi,%ecx,4),%mm0 - psrlq $32,%mm2 - movd %mm3,28(%esp,%ecx,4) - psrlq $32,%mm3 - leal 1(%ecx),%ecx - cmpl %ebx,%ecx - jl .L0031st - pmuludq %mm4,%mm0 - pmuludq %mm5,%mm1 - paddq %mm0,%mm2 - paddq %mm1,%mm3 - movq %mm2,%mm0 - pand %mm7,%mm0 - paddq %mm0,%mm3 - movd %mm3,28(%esp,%ecx,4) - psrlq $32,%mm2 - psrlq $32,%mm3 - paddq %mm2,%mm3 - movq %mm3,32(%esp,%ebx,4) - incl %edx -.L004outer: - xorl %ecx,%ecx - movd (%edi,%edx,4),%mm4 - movd (%esi),%mm5 - movd 32(%esp),%mm6 - movd (%ebp),%mm3 - pmuludq %mm4,%mm5 - paddq %mm6,%mm5 - movq %mm5,%mm0 - movq %mm5,%mm2 - pand %mm7,%mm0 - pmuludq 20(%esp),%mm5 - pmuludq %mm5,%mm3 - paddq %mm0,%mm3 - movd 36(%esp),%mm6 - movd 4(%ebp),%mm1 - movd 4(%esi),%mm0 - psrlq $32,%mm2 - psrlq $32,%mm3 - paddq %mm6,%mm2 - incl %ecx - decl %ebx -.L005inner: - pmuludq %mm4,%mm0 - pmuludq %mm5,%mm1 - paddq %mm0,%mm2 - paddq %mm1,%mm3 - movq %mm2,%mm0 - movd 36(%esp,%ecx,4),%mm6 - pand %mm7,%mm0 - movd 4(%ebp,%ecx,4),%mm1 - paddq %mm0,%mm3 - movd 4(%esi,%ecx,4),%mm0 - psrlq $32,%mm2 - movd %mm3,28(%esp,%ecx,4) - psrlq $32,%mm3 - paddq %mm6,%mm2 - decl %ebx - leal 1(%ecx),%ecx - jnz .L005inner - movl %ecx,%ebx - pmuludq %mm4,%mm0 - pmuludq %mm5,%mm1 - paddq %mm0,%mm2 - paddq %mm1,%mm3 - movq %mm2,%mm0 - pand %mm7,%mm0 - paddq %mm0,%mm3 - movd %mm3,28(%esp,%ecx,4) - psrlq $32,%mm2 - psrlq $32,%mm3 - movd 36(%esp,%ebx,4),%mm6 - paddq %mm2,%mm3 - paddq %mm6,%mm3 - movq %mm3,32(%esp,%ebx,4) - leal 1(%edx),%edx - cmpl %ebx,%edx - jle .L004outer - emms -.align 16 -.L006common_tail: - movl 16(%esp),%ebp - movl 4(%esp),%edi - leal 32(%esp),%esi - movl (%esi),%eax - movl %ebx,%ecx - xorl %edx,%edx -.align 16 -.L007sub: - sbbl (%ebp,%edx,4),%eax - movl %eax,(%edi,%edx,4) - decl %ecx - movl 4(%esi,%edx,4),%eax - leal 1(%edx),%edx - jge .L007sub - sbbl $0,%eax - movl $-1,%edx - xorl %eax,%edx - jmp .L008copy -.align 16 -.L008copy: - movl 32(%esp,%ebx,4),%esi - movl (%edi,%ebx,4),%ebp - movl %ecx,32(%esp,%ebx,4) - andl %eax,%esi - andl %edx,%ebp - orl %esi,%ebp - movl %ebp,(%edi,%ebx,4) - decl %ebx - jge .L008copy - movl 24(%esp),%esp - movl $1,%eax - popl %edi - popl %esi - popl %ebx - popl %ebp - ret -.size GFp_bn_mul_mont,.-.L_GFp_bn_mul_mont_begin -.byte 77,111,110,116,103,111,109,101,114,121,32,77,117,108,116,105 -.byte 112,108,105,99,97,116,105,111,110,32,102,111,114,32,120,56 -.byte 54,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121 -.byte 32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46 -.byte 111,114,103,62,0 -#endif -.section .note.GNU-stack,"",@progbits diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/x86-mont-macosx.S temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/x86-mont-macosx.S --- temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/x86-mont-macosx.S 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/x86-mont-macosx.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,227 +0,0 @@ -# This file is generated from a similarly-named Perl script in the BoringSSL -# source tree. Do not edit by hand. - -#if defined(__i386__) -#if defined(BORINGSSL_PREFIX) -#include -#endif -.text -.globl _GFp_bn_mul_mont -.private_extern _GFp_bn_mul_mont -.align 4 -_GFp_bn_mul_mont: -L_GFp_bn_mul_mont_begin: - pushl %ebp - pushl %ebx - pushl %esi - pushl %edi - xorl %eax,%eax - movl 40(%esp),%edi - leal 20(%esp),%esi - leal 24(%esp),%edx - addl $2,%edi - negl %edi - leal -32(%esp,%edi,4),%ebp - negl %edi - movl %ebp,%eax - subl %edx,%eax - andl $2047,%eax - subl %eax,%ebp - xorl %ebp,%edx - andl $2048,%edx - xorl $2048,%edx - subl %edx,%ebp - andl $-64,%ebp - movl %esp,%eax - subl %ebp,%eax - andl $-4096,%eax - movl %esp,%edx - leal (%ebp,%eax,1),%esp - movl (%esp),%eax - cmpl %ebp,%esp - ja L000page_walk - jmp L001page_walk_done -.align 4,0x90 -L000page_walk: - leal -4096(%esp),%esp - movl (%esp),%eax - cmpl %ebp,%esp - ja L000page_walk -L001page_walk_done: - movl (%esi),%eax - movl 4(%esi),%ebx - movl 8(%esi),%ecx - movl 12(%esi),%ebp - movl 16(%esi),%esi - movl (%esi),%esi - movl %eax,4(%esp) - movl %ebx,8(%esp) - movl %ecx,12(%esp) - movl %ebp,16(%esp) - movl %esi,20(%esp) - leal -3(%edi),%ebx - movl %edx,24(%esp) - call L002PIC_me_up -L002PIC_me_up: - popl %eax - movl L_GFp_ia32cap_P$non_lazy_ptr-L002PIC_me_up(%eax),%eax - btl $26,(%eax) - movl $-1,%eax - movd %eax,%mm7 - movl 8(%esp),%esi - movl 12(%esp),%edi - movl 16(%esp),%ebp - xorl %edx,%edx - xorl %ecx,%ecx - movd (%edi),%mm4 - movd (%esi),%mm5 - movd (%ebp),%mm3 - pmuludq %mm4,%mm5 - movq %mm5,%mm2 - movq %mm5,%mm0 - pand %mm7,%mm0 - pmuludq 20(%esp),%mm5 - pmuludq %mm5,%mm3 - paddq %mm0,%mm3 - movd 4(%ebp),%mm1 - movd 4(%esi),%mm0 - psrlq $32,%mm2 - psrlq $32,%mm3 - incl %ecx -.align 4,0x90 -L0031st: - pmuludq %mm4,%mm0 - pmuludq %mm5,%mm1 - paddq %mm0,%mm2 - paddq %mm1,%mm3 - movq %mm2,%mm0 - pand %mm7,%mm0 - movd 4(%ebp,%ecx,4),%mm1 - paddq %mm0,%mm3 - movd 4(%esi,%ecx,4),%mm0 - psrlq $32,%mm2 - movd %mm3,28(%esp,%ecx,4) - psrlq $32,%mm3 - leal 1(%ecx),%ecx - cmpl %ebx,%ecx - jl L0031st - pmuludq %mm4,%mm0 - pmuludq %mm5,%mm1 - paddq %mm0,%mm2 - paddq %mm1,%mm3 - movq %mm2,%mm0 - pand %mm7,%mm0 - paddq %mm0,%mm3 - movd %mm3,28(%esp,%ecx,4) - psrlq $32,%mm2 - psrlq $32,%mm3 - paddq %mm2,%mm3 - movq %mm3,32(%esp,%ebx,4) - incl %edx -L004outer: - xorl %ecx,%ecx - movd (%edi,%edx,4),%mm4 - movd (%esi),%mm5 - movd 32(%esp),%mm6 - movd (%ebp),%mm3 - pmuludq %mm4,%mm5 - paddq %mm6,%mm5 - movq %mm5,%mm0 - movq %mm5,%mm2 - pand %mm7,%mm0 - pmuludq 20(%esp),%mm5 - pmuludq %mm5,%mm3 - paddq %mm0,%mm3 - movd 36(%esp),%mm6 - movd 4(%ebp),%mm1 - movd 4(%esi),%mm0 - psrlq $32,%mm2 - psrlq $32,%mm3 - paddq %mm6,%mm2 - incl %ecx - decl %ebx -L005inner: - pmuludq %mm4,%mm0 - pmuludq %mm5,%mm1 - paddq %mm0,%mm2 - paddq %mm1,%mm3 - movq %mm2,%mm0 - movd 36(%esp,%ecx,4),%mm6 - pand %mm7,%mm0 - movd 4(%ebp,%ecx,4),%mm1 - paddq %mm0,%mm3 - movd 4(%esi,%ecx,4),%mm0 - psrlq $32,%mm2 - movd %mm3,28(%esp,%ecx,4) - psrlq $32,%mm3 - paddq %mm6,%mm2 - decl %ebx - leal 1(%ecx),%ecx - jnz L005inner - movl %ecx,%ebx - pmuludq %mm4,%mm0 - pmuludq %mm5,%mm1 - paddq %mm0,%mm2 - paddq %mm1,%mm3 - movq %mm2,%mm0 - pand %mm7,%mm0 - paddq %mm0,%mm3 - movd %mm3,28(%esp,%ecx,4) - psrlq $32,%mm2 - psrlq $32,%mm3 - movd 36(%esp,%ebx,4),%mm6 - paddq %mm2,%mm3 - paddq %mm6,%mm3 - movq %mm3,32(%esp,%ebx,4) - leal 1(%edx),%edx - cmpl %ebx,%edx - jle L004outer - emms -.align 4,0x90 -L006common_tail: - movl 16(%esp),%ebp - movl 4(%esp),%edi - leal 32(%esp),%esi - movl (%esi),%eax - movl %ebx,%ecx - xorl %edx,%edx -.align 4,0x90 -L007sub: - sbbl (%ebp,%edx,4),%eax - movl %eax,(%edi,%edx,4) - decl %ecx - movl 4(%esi,%edx,4),%eax - leal 1(%edx),%edx - jge L007sub - sbbl $0,%eax - movl $-1,%edx - xorl %eax,%edx - jmp L008copy -.align 4,0x90 -L008copy: - movl 32(%esp,%ebx,4),%esi - movl (%edi,%ebx,4),%ebp - movl %ecx,32(%esp,%ebx,4) - andl %eax,%esi - andl %edx,%ebp - orl %esi,%ebp - movl %ebp,(%edi,%ebx,4) - decl %ebx - jge L008copy - movl 24(%esp),%esp - movl $1,%eax - popl %edi - popl %esi - popl %ebx - popl %ebp - ret -.byte 77,111,110,116,103,111,109,101,114,121,32,77,117,108,116,105 -.byte 112,108,105,99,97,116,105,111,110,32,102,111,114,32,120,56 -.byte 54,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121 -.byte 32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46 -.byte 111,114,103,62,0 -.section __IMPORT,__pointers,non_lazy_symbol_pointers -L_GFp_ia32cap_P$non_lazy_ptr: -.indirect_symbol _GFp_ia32cap_P -.long 0 -#endif Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/x86-mont-win32n.obj and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/ring-0.16.20/pregenerated/x86-mont-win32n.obj differ diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/aead/aes_gcm.rs temporalio-1.3.0/vendor/ring-0.16.20/src/aead/aes_gcm.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/aead/aes_gcm.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/aead/aes_gcm.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,301 +0,0 @@ -// Copyright 2015-2016 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -use super::{ - aes::{self, Counter}, - gcm, shift, Aad, Block, Direction, Nonce, Tag, BLOCK_LEN, -}; -use crate::{aead, cpu, endian::*, error, polyfill}; - -/// AES-128 in GCM mode with 128-bit tags and 96 bit nonces. -pub static AES_128_GCM: aead::Algorithm = aead::Algorithm { - key_len: 16, - init: init_128, - seal: aes_gcm_seal, - open: aes_gcm_open, - id: aead::AlgorithmID::AES_128_GCM, - max_input_len: AES_GCM_MAX_INPUT_LEN, -}; - -/// AES-256 in GCM mode with 128-bit tags and 96 bit nonces. -pub static AES_256_GCM: aead::Algorithm = aead::Algorithm { - key_len: 32, - init: init_256, - seal: aes_gcm_seal, - open: aes_gcm_open, - id: aead::AlgorithmID::AES_256_GCM, - max_input_len: AES_GCM_MAX_INPUT_LEN, -}; - -pub struct Key { - gcm_key: gcm::Key, // First because it has a large alignment requirement. - aes_key: aes::Key, -} - -fn init_128(key: &[u8], cpu_features: cpu::Features) -> Result { - init(key, aes::Variant::AES_128, cpu_features) -} - -fn init_256(key: &[u8], cpu_features: cpu::Features) -> Result { - init(key, aes::Variant::AES_256, cpu_features) -} - -fn init( - key: &[u8], - variant: aes::Variant, - cpu_features: cpu::Features, -) -> Result { - let aes_key = aes::Key::new(key, variant, cpu_features)?; - let gcm_key = gcm::Key::new(aes_key.encrypt_block(Block::zero()), cpu_features); - Ok(aead::KeyInner::AesGcm(Key { aes_key, gcm_key })) -} - -const CHUNK_BLOCKS: usize = 3 * 1024 / 16; - -fn aes_gcm_seal( - key: &aead::KeyInner, - nonce: Nonce, - aad: Aad<&[u8]>, - in_out: &mut [u8], - cpu_features: cpu::Features, -) -> Tag { - aead(key, nonce, aad, in_out, Direction::Sealing, cpu_features) -} - -fn aes_gcm_open( - key: &aead::KeyInner, - nonce: Nonce, - aad: Aad<&[u8]>, - in_prefix_len: usize, - in_out: &mut [u8], - cpu_features: cpu::Features, -) -> Tag { - aead( - key, - nonce, - aad, - in_out, - Direction::Opening { in_prefix_len }, - cpu_features, - ) -} - -#[inline(always)] // Avoid branching on `direction`. -fn aead( - key: &aead::KeyInner, - nonce: Nonce, - aad: Aad<&[u8]>, - in_out: &mut [u8], - direction: Direction, - cpu_features: cpu::Features, -) -> Tag { - let Key { aes_key, gcm_key } = match key { - aead::KeyInner::AesGcm(key) => key, - _ => unreachable!(), - }; - - let mut ctr = Counter::one(nonce); - let tag_iv = ctr.increment(); - - let aad_len = aad.0.len(); - let mut gcm_ctx = gcm::Context::new(gcm_key, aad, cpu_features); - - let in_prefix_len = match direction { - Direction::Opening { in_prefix_len } => in_prefix_len, - Direction::Sealing => 0, - }; - - let total_in_out_len = in_out.len() - in_prefix_len; - - let in_out = integrated_aes_gcm( - aes_key, - &mut gcm_ctx, - in_out, - &mut ctr, - direction, - cpu_features, - ); - let in_out_len = in_out.len() - in_prefix_len; - - // Process any (remaining) whole blocks. - let whole_len = in_out_len - (in_out_len % BLOCK_LEN); - { - let mut chunk_len = CHUNK_BLOCKS * BLOCK_LEN; - let mut output = 0; - let mut input = in_prefix_len; - loop { - if whole_len - output < chunk_len { - chunk_len = whole_len - output; - } - if chunk_len == 0 { - break; - } - - if let Direction::Opening { .. } = direction { - gcm_ctx.update_blocks(&in_out[input..][..chunk_len]); - } - - aes_key.ctr32_encrypt_blocks( - &mut in_out[output..][..(chunk_len + in_prefix_len)], - direction, - &mut ctr, - ); - - if let Direction::Sealing = direction { - gcm_ctx.update_blocks(&in_out[output..][..chunk_len]); - } - - output += chunk_len; - input += chunk_len; - } - } - - // Process any remaining partial block. - let remainder = &mut in_out[whole_len..]; - shift::shift_partial((in_prefix_len, remainder), |remainder| { - let mut input = Block::zero(); - input.overwrite_part_at(0, remainder); - if let Direction::Opening { .. } = direction { - gcm_ctx.update_block(input); - } - let mut output = aes_key.encrypt_iv_xor_block(ctr.into(), input); - if let Direction::Sealing = direction { - output.zero_from(remainder.len()); - gcm_ctx.update_block(output); - } - output - }); - - // Authenticate the final block containing the input lengths. - let aad_bits = polyfill::u64_from_usize(aad_len) << 3; - let ciphertext_bits = polyfill::u64_from_usize(total_in_out_len) << 3; - gcm_ctx.update_block(Block::from_u64_be( - BigEndian::from(aad_bits), - BigEndian::from(ciphertext_bits), - )); - - // Finalize the tag and return it. - gcm_ctx.pre_finish(|pre_tag| { - let bytes = tag_iv.into_bytes_less_safe(); - let mut tag = aes_key.encrypt_block(Block::from(&bytes)); - tag.bitxor_assign(pre_tag.into()); - Tag(*tag.as_ref()) - }) -} - -// Returns the data that wasn't processed. -#[cfg(target_arch = "x86_64")] -#[inline] // Optimize out the match on `direction`. -fn integrated_aes_gcm<'a>( - aes_key: &aes::Key, - gcm_ctx: &mut gcm::Context, - in_out: &'a mut [u8], - ctr: &mut Counter, - direction: Direction, - cpu_features: cpu::Features, -) -> &'a mut [u8] { - use crate::c; - - if !aes_key.is_aes_hw() || !gcm_ctx.is_avx2(cpu_features) { - return in_out; - } - - let processed = match direction { - Direction::Opening { in_prefix_len } => { - extern "C" { - fn GFp_aesni_gcm_decrypt( - input: *const u8, - output: *mut u8, - len: c::size_t, - key: &aes::AES_KEY, - ivec: &mut Counter, - gcm: &mut gcm::ContextInner, - ) -> c::size_t; - } - unsafe { - GFp_aesni_gcm_decrypt( - in_out[in_prefix_len..].as_ptr(), - in_out.as_mut_ptr(), - in_out.len() - in_prefix_len, - aes_key.inner_less_safe(), - ctr, - gcm_ctx.inner(), - ) - } - } - Direction::Sealing => { - extern "C" { - fn GFp_aesni_gcm_encrypt( - input: *const u8, - output: *mut u8, - len: c::size_t, - key: &aes::AES_KEY, - ivec: &mut Counter, - gcm: &mut gcm::ContextInner, - ) -> c::size_t; - } - unsafe { - GFp_aesni_gcm_encrypt( - in_out.as_ptr(), - in_out.as_mut_ptr(), - in_out.len(), - aes_key.inner_less_safe(), - ctr, - gcm_ctx.inner(), - ) - } - } - }; - - &mut in_out[processed..] -} - -#[cfg(not(target_arch = "x86_64"))] -#[inline] -fn integrated_aes_gcm<'a>( - _: &aes::Key, - _: &mut gcm::Context, - in_out: &'a mut [u8], - _: &mut Counter, - _: Direction, - _: cpu::Features, -) -> &'a mut [u8] { - in_out // This doesn't process any of the input so it all remains. -} - -const AES_GCM_MAX_INPUT_LEN: u64 = super::max_input_len(BLOCK_LEN, 2); - -#[cfg(test)] -mod tests { - #[test] - fn max_input_len_test() { - // [NIST SP800-38D] Section 5.2.1.1. Note that [RFC 5116 Section 5.1] and - // [RFC 5116 Section 5.2] have an off-by-one error in `P_MAX`. - // - // [NIST SP800-38D]: - // http://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38d.pdf - // [RFC 5116 Section 5.1]: https://tools.ietf.org/html/rfc5116#section-5.1 - // [RFC 5116 Section 5.2]: https://tools.ietf.org/html/rfc5116#section-5.2 - const NIST_SP800_38D_MAX_BITS: u64 = (1u64 << 39) - 256; - assert_eq!(NIST_SP800_38D_MAX_BITS, 549_755_813_632u64); - assert_eq!( - super::AES_128_GCM.max_input_len * 8, - NIST_SP800_38D_MAX_BITS - ); - assert_eq!( - super::AES_256_GCM.max_input_len * 8, - NIST_SP800_38D_MAX_BITS - ); - } -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/aead/aes.rs temporalio-1.3.0/vendor/ring-0.16.20/src/aead/aes.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/aead/aes.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/aead/aes.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,443 +0,0 @@ -// Copyright 2018 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -use super::{counter, iv::Iv, quic::Sample, Block, Direction, BLOCK_LEN}; -use crate::{bits::BitLength, c, cpu, endian::*, error, polyfill}; - -pub(crate) struct Key { - inner: AES_KEY, - cpu_features: cpu::Features, -} - -macro_rules! set_encrypt_key { - ( $name:ident, $bytes:expr, $key_bits:expr, $key:expr ) => {{ - extern "C" { - fn $name(user_key: *const u8, bits: c::uint, key: &mut AES_KEY) -> c::int; - } - set_encrypt_key($name, $bytes, $key_bits, $key) - }}; -} - -#[inline] -fn set_encrypt_key( - f: unsafe extern "C" fn(*const u8, c::uint, &mut AES_KEY) -> c::int, - bytes: &[u8], - key_bits: BitLength, - key: &mut AES_KEY, -) -> Result<(), error::Unspecified> { - // Unusually, in this case zero means success and non-zero means failure. - if 0 == unsafe { f(bytes.as_ptr(), key_bits.as_usize_bits() as c::uint, key) } { - Ok(()) - } else { - Err(error::Unspecified) - } -} - -macro_rules! encrypt_block { - ($name:ident, $block:expr, $key:expr) => {{ - extern "C" { - fn $name(a: &Block, r: *mut Block, key: &AES_KEY); - } - encrypt_block_($name, $block, $key) - }}; -} - -#[inline] -fn encrypt_block_( - f: unsafe extern "C" fn(&Block, *mut Block, &AES_KEY), - a: Block, - key: &Key, -) -> Block { - let mut result = core::mem::MaybeUninit::uninit(); - unsafe { - f(&a, result.as_mut_ptr(), &key.inner); - result.assume_init() - } -} - -macro_rules! ctr32_encrypt_blocks { - ($name:ident, $in_out:expr, $in_prefix_len:expr, $key:expr, $ivec:expr ) => {{ - extern "C" { - fn $name( - input: *const u8, - output: *mut u8, - blocks: c::size_t, - key: &AES_KEY, - ivec: &Counter, - ); - } - ctr32_encrypt_blocks_($name, $in_out, $in_prefix_len, $key, $ivec) - }}; -} - -#[inline] -fn ctr32_encrypt_blocks_( - f: unsafe extern "C" fn( - input: *const u8, - output: *mut u8, - blocks: c::size_t, - key: &AES_KEY, - ivec: &Counter, - ), - in_out: &mut [u8], - in_prefix_len: usize, - key: &AES_KEY, - ctr: &mut Counter, -) { - let in_out_len = in_out.len().checked_sub(in_prefix_len).unwrap(); - assert_eq!(in_out_len % BLOCK_LEN, 0); - - let blocks = in_out_len / BLOCK_LEN; - let blocks_u32 = blocks as u32; - assert_eq!(blocks, polyfill::usize_from_u32(blocks_u32)); - - let input = in_out[in_prefix_len..].as_ptr(); - let output = in_out.as_mut_ptr(); - - unsafe { - f(input, output, blocks, &key, ctr); - } - ctr.increment_by_less_safe(blocks_u32); -} - -impl Key { - #[inline] - pub fn new( - bytes: &[u8], - variant: Variant, - cpu_features: cpu::Features, - ) -> Result { - let key_bits = match variant { - Variant::AES_128 => BitLength::from_usize_bits(128), - Variant::AES_256 => BitLength::from_usize_bits(256), - }; - if BitLength::from_usize_bytes(bytes.len())? != key_bits { - return Err(error::Unspecified); - } - - let mut key = AES_KEY { - rd_key: [0u32; 4 * (MAX_ROUNDS + 1)], - rounds: 0, - }; - - match detect_implementation(cpu_features) { - #[cfg(any( - target_arch = "aarch64", - target_arch = "arm", - target_arch = "x86_64", - target_arch = "x86" - ))] - Implementation::HWAES => { - set_encrypt_key!(GFp_aes_hw_set_encrypt_key, bytes, key_bits, &mut key)? - } - - #[cfg(any( - target_arch = "aarch64", - target_arch = "arm", - target_arch = "x86_64", - target_arch = "x86" - ))] - Implementation::VPAES_BSAES => { - set_encrypt_key!(GFp_vpaes_set_encrypt_key, bytes, key_bits, &mut key)? - } - - #[cfg(not(target_arch = "aarch64"))] - Implementation::NOHW => { - set_encrypt_key!(GFp_aes_nohw_set_encrypt_key, bytes, key_bits, &mut key)? - } - }; - - Ok(Self { - inner: key, - cpu_features, - }) - } - - #[inline] - pub fn encrypt_block(&self, a: Block) -> Block { - match detect_implementation(self.cpu_features) { - #[cfg(any( - target_arch = "aarch64", - target_arch = "arm", - target_arch = "x86_64", - target_arch = "x86" - ))] - Implementation::HWAES => encrypt_block!(GFp_aes_hw_encrypt, a, self), - - #[cfg(any( - target_arch = "aarch64", - target_arch = "arm", - target_arch = "x86_64", - target_arch = "x86" - ))] - Implementation::VPAES_BSAES => encrypt_block!(GFp_vpaes_encrypt, a, self), - - #[cfg(not(target_arch = "aarch64"))] - Implementation::NOHW => encrypt_block!(GFp_aes_nohw_encrypt, a, self), - } - } - - #[inline] - pub fn encrypt_iv_xor_block(&self, iv: Iv, input: Block) -> Block { - let mut output = self.encrypt_block(Block::from(&iv.into_bytes_less_safe())); - output.bitxor_assign(input); - output - } - - #[inline] - pub(super) fn ctr32_encrypt_blocks( - &self, - in_out: &mut [u8], - direction: Direction, - ctr: &mut Counter, - ) { - let in_prefix_len = match direction { - Direction::Opening { in_prefix_len } => in_prefix_len, - Direction::Sealing => 0, - }; - - let in_out_len = in_out.len().checked_sub(in_prefix_len).unwrap(); - - assert_eq!(in_out_len % BLOCK_LEN, 0); - - match detect_implementation(self.cpu_features) { - #[cfg(any( - target_arch = "aarch64", - target_arch = "arm", - target_arch = "x86_64", - target_arch = "x86" - ))] - Implementation::HWAES => ctr32_encrypt_blocks!( - GFp_aes_hw_ctr32_encrypt_blocks, - in_out, - in_prefix_len, - &self.inner, - ctr - ), - - #[cfg(any(target_arch = "aarch64", target_arch = "arm", target_arch = "x86_64"))] - Implementation::VPAES_BSAES => { - // 8 blocks is the cut-off point where it's faster to use BSAES. - #[cfg(target_arch = "arm")] - let in_out = if in_out_len >= 8 * BLOCK_LEN { - let remainder = in_out_len % (8 * BLOCK_LEN); - let bsaes_in_out_len = if remainder < (4 * BLOCK_LEN) { - in_out_len - remainder - } else { - in_out_len - }; - - let mut bsaes_key = AES_KEY { - rd_key: [0u32; 4 * (MAX_ROUNDS + 1)], - rounds: 0, - }; - extern "C" { - fn GFp_vpaes_encrypt_key_to_bsaes( - bsaes_key: &mut AES_KEY, - vpaes_key: &AES_KEY, - ); - } - unsafe { - GFp_vpaes_encrypt_key_to_bsaes(&mut bsaes_key, &self.inner); - } - ctr32_encrypt_blocks!( - GFp_bsaes_ctr32_encrypt_blocks, - &mut in_out[..(bsaes_in_out_len + in_prefix_len)], - in_prefix_len, - &bsaes_key, - ctr - ); - - &mut in_out[bsaes_in_out_len..] - } else { - in_out - }; - - ctr32_encrypt_blocks!( - GFp_vpaes_ctr32_encrypt_blocks, - in_out, - in_prefix_len, - &self.inner, - ctr - ) - } - - #[cfg(any(target_arch = "x86"))] - Implementation::VPAES_BSAES => { - super::shift::shift_full_blocks(in_out, in_prefix_len, |input| { - self.encrypt_iv_xor_block(ctr.increment(), Block::from(input)) - }); - } - - #[cfg(not(target_arch = "aarch64"))] - Implementation::NOHW => ctr32_encrypt_blocks!( - GFp_aes_nohw_ctr32_encrypt_blocks, - in_out, - in_prefix_len, - &self.inner, - ctr - ), - } - } - - pub fn new_mask(&self, sample: Sample) -> [u8; 5] { - let block = self.encrypt_block(Block::from(&sample)); - - let mut out: [u8; 5] = [0; 5]; - out.copy_from_slice(&block.as_ref()[..5]); - - out - } - - // TODO: use `matches!` when MSRV increases to 1.42.0 and remove this - // `#[allow(...)]` - #[allow(clippy::unknown_clippy_lints)] - #[allow(clippy::match_like_matches_macro)] - #[cfg(target_arch = "x86_64")] - #[must_use] - pub fn is_aes_hw(&self) -> bool { - match detect_implementation(self.cpu_features) { - Implementation::HWAES => true, - _ => false, - } - } - - #[cfg(target_arch = "x86_64")] - #[must_use] - pub(super) fn inner_less_safe(&self) -> &AES_KEY { - &self.inner - } -} - -// Keep this in sync with AES_KEY in aes.h. -#[repr(C)] -pub(super) struct AES_KEY { - pub rd_key: [u32; 4 * (MAX_ROUNDS + 1)], - pub rounds: c::uint, -} - -// Keep this in sync with `AES_MAXNR` in aes.h. -const MAX_ROUNDS: usize = 14; - -pub enum Variant { - AES_128, - AES_256, -} - -pub type Counter = counter::Counter>; - -#[repr(C)] // Only so `Key` can be `#[repr(C)]` -#[derive(Clone, Copy)] -pub enum Implementation { - #[cfg(any( - target_arch = "aarch64", - target_arch = "arm", - target_arch = "x86_64", - target_arch = "x86" - ))] - HWAES = 1, - - // On "arm" only, this indicates that the bsaes implementation may be used. - #[cfg(any( - target_arch = "aarch64", - target_arch = "arm", - target_arch = "x86_64", - target_arch = "x86" - ))] - VPAES_BSAES = 2, - - #[cfg(not(target_arch = "aarch64"))] - NOHW = 3, -} - -fn detect_implementation(cpu_features: cpu::Features) -> Implementation { - // `cpu_features` is only used for specific platforms. - #[cfg(not(any( - target_arch = "aarch64", - target_arch = "arm", - target_arch = "x86_64", - target_arch = "x86" - )))] - let _cpu_features = cpu_features; - - #[cfg(any( - target_arch = "aarch64", - target_arch = "arm", - target_arch = "x86_64", - target_arch = "x86" - ))] - { - if cpu::intel::AES.available(cpu_features) || cpu::arm::AES.available(cpu_features) { - return Implementation::HWAES; - } - } - - #[cfg(any(target_arch = "x86_64", target_arch = "x86"))] - { - if cpu::intel::SSSE3.available(cpu_features) { - return Implementation::VPAES_BSAES; - } - } - - #[cfg(target_arch = "arm")] - { - if cpu::arm::NEON.available(cpu_features) { - return Implementation::VPAES_BSAES; - } - } - - #[cfg(target_arch = "aarch64")] - { - Implementation::VPAES_BSAES - } - - #[cfg(not(target_arch = "aarch64"))] - { - Implementation::NOHW - } -} - -#[cfg(test)] -mod tests { - use super::{super::BLOCK_LEN, *}; - use crate::test; - use core::convert::TryInto; - - #[test] - pub fn test_aes() { - test::run(test_file!("aes_tests.txt"), |section, test_case| { - assert_eq!(section, ""); - let key = consume_key(test_case, "Key"); - let input = test_case.consume_bytes("Input"); - let input: &[u8; BLOCK_LEN] = input.as_slice().try_into()?; - let expected_output = test_case.consume_bytes("Output"); - - let block = Block::from(input); - let output = key.encrypt_block(block); - assert_eq!(output.as_ref(), &expected_output[..]); - - Ok(()) - }) - } - - fn consume_key(test_case: &mut test::TestCase, name: &str) -> Key { - let key = test_case.consume_bytes(name); - let variant = match key.len() { - 16 => Variant::AES_128, - 32 => Variant::AES_256, - _ => unreachable!(), - }; - Key::new(&key[..], variant, cpu::features()).unwrap() - } -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/aead/aes_tests.txt temporalio-1.3.0/vendor/ring-0.16.20/src/aead/aes_tests.txt --- temporalio-1.3.0/vendor/ring-0.16.20/src/aead/aes_tests.txt 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/aead/aes_tests.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ -Key = 000102030405060708090a0b0c0d0e0f -Input = 00112233445566778899aabbccddeeff -Output = 69c4e0d86a7b0430d8cdb78070b4c55a - -Key = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f -Input = 00112233445566778899aabbccddeeff -Output = 8ea2b7ca516745bfeafc49904b496089 diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/aead/block.rs temporalio-1.3.0/vendor/ring-0.16.20/src/aead/block.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/aead/block.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/aead/block.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,122 +0,0 @@ -// Copyright 2018 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -use crate::{endian::*, polyfill}; - -/// An array of 16 bytes that can (in the x86_64 and AAarch64 ABIs, at least) -/// be efficiently passed by value and returned by value (i.e. in registers), -/// and which meets the alignment requirements of `u32` and `u64` (at least) -/// for the target. -#[repr(C)] -#[derive(Copy, Clone)] -pub struct Block { - subblocks: [u64; 2], -} - -pub const BLOCK_LEN: usize = 16; - -impl Block { - #[inline] - pub fn zero() -> Self { - Self { subblocks: [0, 0] } - } - - // TODO: Remove this. - #[inline] - pub fn from_u64_le(first: LittleEndian, second: LittleEndian) -> Self { - #[allow(deprecated)] - Self { - subblocks: [first.into_raw_value(), second.into_raw_value()], - } - } - - // TODO: Remove this. - #[inline] - pub fn from_u64_be(first: BigEndian, second: BigEndian) -> Self { - #[allow(deprecated)] - Self { - subblocks: [first.into_raw_value(), second.into_raw_value()], - } - } - - pub fn u64s_be_to_native(&self) -> [u64; 2] { - [ - u64::from_be(self.subblocks[0]), - u64::from_be(self.subblocks[1]), - ] - } - - #[inline] - pub fn overwrite_part_at(&mut self, index: usize, a: &[u8]) { - let mut tmp: [u8; BLOCK_LEN] = *self.as_ref(); - tmp[index..][..a.len()].copy_from_slice(a); - *self = Self::from(&tmp) - } - - #[inline] - pub fn zero_from(&mut self, index: usize) { - let mut tmp: [u8; BLOCK_LEN] = *self.as_ref(); - polyfill::slice::fill(&mut tmp[index..], 0); - *self = Self::from(&tmp) - } - - #[inline] - pub fn bitxor_assign(&mut self, a: Block) { - for (r, a) in self.subblocks.iter_mut().zip(a.subblocks.iter()) { - *r ^= *a; - } - } -} - -impl From<&'_ [u8; BLOCK_LEN]> for Block { - #[inline] - fn from(bytes: &[u8; BLOCK_LEN]) -> Self { - unsafe { core::mem::transmute_copy(bytes) } - } -} - -impl AsRef<[u8; BLOCK_LEN]> for Block { - #[allow(clippy::transmute_ptr_to_ptr)] - #[inline] - fn as_ref(&self) -> &[u8; BLOCK_LEN] { - unsafe { core::mem::transmute(self) } - } -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn test_bitxor_assign() { - const ONES: u64 = -1i64 as u64; - const TEST_CASES: &[([u64; 2], [u64; 2], [u64; 2])] = &[ - ([0, 0], [0, 0], [0, 0]), - ([0, 0], [ONES, ONES], [ONES, ONES]), - ([0, ONES], [ONES, 0], [ONES, ONES]), - ([ONES, 0], [0, ONES], [ONES, ONES]), - ([ONES, ONES], [ONES, ONES], [0, 0]), - ]; - for (expected_result, a, b) in TEST_CASES { - let mut r = Block::from_u64_le(a[0].into(), a[1].into()); - r.bitxor_assign(Block::from_u64_le(b[0].into(), b[1].into())); - assert_eq!(*expected_result, r.subblocks); - - // XOR is symmetric. - let mut r = Block::from_u64_le(b[0].into(), b[1].into()); - r.bitxor_assign(Block::from_u64_le(a[0].into(), a[1].into())); - assert_eq!(*expected_result, r.subblocks); - } - } -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/aead/chacha20_poly1305_openssh.rs temporalio-1.3.0/vendor/ring-0.16.20/src/aead/chacha20_poly1305_openssh.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/aead/chacha20_poly1305_openssh.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/aead/chacha20_poly1305_openssh.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,189 +0,0 @@ -// Copyright 2016 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -//! The [chacha20-poly1305@openssh.com] AEAD-ish construct. -//! -//! This should only be used by SSH implementations. It has a similar, but -//! different API from `ring::aead` because the construct cannot use the same -//! API as `ring::aead` due to the way the construct handles the encrypted -//! packet length. -//! -//! The concatenation of a and b is denoted `a||b`. `K_1` and `K_2` are defined -//! in the [chacha20-poly1305@openssh.com] specification. `packet_length`, -//! `padding_length`, `payload`, and `random padding` are defined in -//! [RFC 4253]. The term `plaintext` is used as a shorthand for -//! `padding_length||payload||random padding`. -//! -//! [chacha20-poly1305@openssh.com]: -//! http://cvsweb.openbsd.org/cgi-bin/cvsweb/src/usr.bin/ssh/PROTOCOL.chacha20poly1305?annotate=HEAD -//! [RFC 4253]: https://tools.ietf.org/html/rfc4253 - -use super::{ - chacha::{self, *}, - chacha20_poly1305::derive_poly1305_key, - cpu, poly1305, Nonce, Tag, -}; -use crate::{constant_time, endian::*, error}; -use core::convert::TryInto; - -/// A key for sealing packets. -pub struct SealingKey { - key: Key, -} - -impl SealingKey { - /// Constructs a new `SealingKey`. - pub fn new(key_material: &[u8; KEY_LEN]) -> SealingKey { - SealingKey { - key: Key::new(key_material, cpu::features()), - } - } - - /// Seals (encrypts and signs) a packet. - /// - /// On input, `plaintext_in_ciphertext_out` must contain the unencrypted - /// `packet_length||plaintext` where `plaintext` is the - /// `padding_length||payload||random padding`. It will be overwritten by - /// `encrypted_packet_length||ciphertext`, where `encrypted_packet_length` - /// is encrypted with `K_1` and `ciphertext` is encrypted by `K_2`. - pub fn seal_in_place( - &self, - sequence_number: u32, - plaintext_in_ciphertext_out: &mut [u8], - tag_out: &mut [u8; TAG_LEN], - ) { - let mut counter = make_counter(sequence_number); - let poly_key = - derive_poly1305_key(&self.key.k_2, counter.increment(), self.key.cpu_features); - - { - let (len_in_out, data_and_padding_in_out) = - plaintext_in_ciphertext_out.split_at_mut(PACKET_LENGTH_LEN); - - self.key - .k_1 - .encrypt_in_place(make_counter(sequence_number), len_in_out); - self.key - .k_2 - .encrypt_in_place(counter, data_and_padding_in_out); - } - - let Tag(tag) = poly1305::sign(poly_key, plaintext_in_ciphertext_out); - tag_out.copy_from_slice(tag.as_ref()); - } -} - -/// A key for opening packets. -pub struct OpeningKey { - key: Key, -} - -impl OpeningKey { - /// Constructs a new `OpeningKey`. - pub fn new(key_material: &[u8; KEY_LEN]) -> OpeningKey { - OpeningKey { - key: Key::new(key_material, cpu::features()), - } - } - - /// Returns the decrypted, but unauthenticated, packet length. - /// - /// Importantly, the result won't be authenticated until `open_in_place` is - /// called. - pub fn decrypt_packet_length( - &self, - sequence_number: u32, - encrypted_packet_length: [u8; PACKET_LENGTH_LEN], - ) -> [u8; PACKET_LENGTH_LEN] { - let mut packet_length = encrypted_packet_length; - let counter = make_counter(sequence_number); - self.key.k_1.encrypt_in_place(counter, &mut packet_length); - packet_length - } - - /// Opens (authenticates and decrypts) a packet. - /// - /// `ciphertext_in_plaintext_out` must be of the form - /// `encrypted_packet_length||ciphertext` where `ciphertext` is the - /// encrypted `plaintext`. When the function succeeds the ciphertext is - /// replaced by the plaintext and the result is `Ok(plaintext)`, where - /// `plaintext` is `&ciphertext_in_plaintext_out[PACKET_LENGTH_LEN..]`; - /// otherwise the contents of `ciphertext_in_plaintext_out` are unspecified - /// and must not be used. - pub fn open_in_place<'a>( - &self, - sequence_number: u32, - ciphertext_in_plaintext_out: &'a mut [u8], - tag: &[u8; TAG_LEN], - ) -> Result<&'a [u8], error::Unspecified> { - let mut counter = make_counter(sequence_number); - - // We must verify the tag before decrypting so that - // `ciphertext_in_plaintext_out` is unmodified if verification fails. - // This is beyond what we guarantee. - let poly_key = - derive_poly1305_key(&self.key.k_2, counter.increment(), self.key.cpu_features); - verify(poly_key, ciphertext_in_plaintext_out, tag)?; - - let plaintext_in_ciphertext_out = &mut ciphertext_in_plaintext_out[PACKET_LENGTH_LEN..]; - self.key - .k_2 - .encrypt_in_place(counter, plaintext_in_ciphertext_out); - - Ok(plaintext_in_ciphertext_out) - } -} - -struct Key { - k_1: chacha::Key, - k_2: chacha::Key, - cpu_features: cpu::Features, -} - -impl Key { - fn new(key_material: &[u8; KEY_LEN], cpu_features: cpu::Features) -> Key { - // The first half becomes K_2 and the second half becomes K_1. - let (k_2, k_1) = key_material.split_at(chacha::KEY_LEN); - let k_1: [u8; chacha::KEY_LEN] = k_1.try_into().unwrap(); - let k_2: [u8; chacha::KEY_LEN] = k_2.try_into().unwrap(); - Key { - k_1: chacha::Key::from(k_1), - k_2: chacha::Key::from(k_2), - cpu_features, - } - } -} - -fn make_counter(sequence_number: u32) -> Counter { - let nonce = [ - BigEndian::ZERO, - BigEndian::ZERO, - BigEndian::from(sequence_number), - ]; - Counter::zero(Nonce::assume_unique_for_key(*(nonce.as_byte_array()))) -} - -/// The length of key. -pub const KEY_LEN: usize = chacha::KEY_LEN * 2; - -/// The length in bytes of the `packet_length` field in a SSH packet. -pub const PACKET_LENGTH_LEN: usize = 4; // 32 bits - -/// The length in bytes of an authentication tag. -pub const TAG_LEN: usize = super::BLOCK_LEN; - -fn verify(key: poly1305::Key, msg: &[u8], tag: &[u8; TAG_LEN]) -> Result<(), error::Unspecified> { - let Tag(calculated_tag) = poly1305::sign(key, msg); - constant_time::verify_slices_are_equal(calculated_tag.as_ref(), tag) -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/aead/chacha20_poly1305.rs temporalio-1.3.0/vendor/ring-0.16.20/src/aead/chacha20_poly1305.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/aead/chacha20_poly1305.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/aead/chacha20_poly1305.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,291 +0,0 @@ -// Copyright 2015-2016 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -use super::{ - chacha::{self, Counter}, - iv::Iv, - poly1305, Aad, Block, Direction, Nonce, Tag, BLOCK_LEN, -}; -use crate::{aead, cpu, endian::*, error, polyfill}; -use core::convert::TryInto; - -/// ChaCha20-Poly1305 as described in [RFC 7539]. -/// -/// The keys are 256 bits long and the nonces are 96 bits long. -/// -/// [RFC 7539]: https://tools.ietf.org/html/rfc7539 -pub static CHACHA20_POLY1305: aead::Algorithm = aead::Algorithm { - key_len: chacha::KEY_LEN, - init: chacha20_poly1305_init, - seal: chacha20_poly1305_seal, - open: chacha20_poly1305_open, - id: aead::AlgorithmID::CHACHA20_POLY1305, - max_input_len: super::max_input_len(64, 1), -}; - -/// Copies |key| into |ctx_buf|. -fn chacha20_poly1305_init( - key: &[u8], - _todo: cpu::Features, -) -> Result { - let key: [u8; chacha::KEY_LEN] = key.try_into()?; - Ok(aead::KeyInner::ChaCha20Poly1305(chacha::Key::from(key))) -} - -fn chacha20_poly1305_seal( - key: &aead::KeyInner, - nonce: Nonce, - aad: Aad<&[u8]>, - in_out: &mut [u8], - cpu_features: cpu::Features, -) -> Tag { - let key = match key { - aead::KeyInner::ChaCha20Poly1305(key) => key, - _ => unreachable!(), - }; - - #[cfg(target_arch = "x86_64")] - { - if cpu::intel::SSE41.available(cpu_features) { - // XXX: BoringSSL uses `alignas(16)` on `key` instead of on the - // structure, but Rust can't do that yet; see - // https://github.com/rust-lang/rust/issues/73557. - // - // Keep in sync with the anonymous struct of BoringSSL's - // `chacha20_poly1305_seal_data`. - #[repr(align(16), C)] - #[derive(Clone, Copy)] - struct seal_data_in { - key: [u8; chacha::KEY_LEN], - counter: u32, - nonce: [u8; super::NONCE_LEN], - extra_ciphertext: *const u8, - extra_ciphertext_len: usize, - } - - let mut data = InOut { - input: seal_data_in { - key: *key.words_less_safe().as_byte_array(), - counter: 0, - nonce: *nonce.as_ref(), - extra_ciphertext: core::ptr::null(), - extra_ciphertext_len: 0, - }, - }; - - // Encrypts `plaintext_len` bytes from `plaintext` and writes them to `out_ciphertext`. - extern "C" { - fn GFp_chacha20_poly1305_seal( - out_ciphertext: *mut u8, - plaintext: *const u8, - plaintext_len: usize, - ad: *const u8, - ad_len: usize, - data: &mut InOut, - ); - } - - let out = unsafe { - GFp_chacha20_poly1305_seal( - in_out.as_mut_ptr(), - in_out.as_ptr(), - in_out.len(), - aad.as_ref().as_ptr(), - aad.as_ref().len(), - &mut data, - ); - &data.out - }; - - return Tag(out.tag); - } - } - - aead(key, nonce, aad, in_out, Direction::Sealing, cpu_features) -} - -fn chacha20_poly1305_open( - key: &aead::KeyInner, - nonce: Nonce, - aad: Aad<&[u8]>, - in_prefix_len: usize, - in_out: &mut [u8], - cpu_features: cpu::Features, -) -> Tag { - let key = match key { - aead::KeyInner::ChaCha20Poly1305(key) => key, - _ => unreachable!(), - }; - - #[cfg(target_arch = "x86_64")] - { - if cpu::intel::SSE41.available(cpu_features) { - // XXX: BoringSSL uses `alignas(16)` on `key` instead of on the - // structure, but Rust can't do that yet; see - // https://github.com/rust-lang/rust/issues/73557. - // - // Keep in sync with the anonymous struct of BoringSSL's - // `chacha20_poly1305_open_data`. - #[derive(Copy, Clone)] - #[repr(align(16), C)] - struct open_data_in { - key: [u8; chacha::KEY_LEN], - counter: u32, - nonce: [u8; super::NONCE_LEN], - } - - let mut data = InOut { - input: open_data_in { - key: *key.words_less_safe().as_byte_array(), - counter: 0, - nonce: *nonce.as_ref(), - }, - }; - - // Decrypts `plaintext_len` bytes from `ciphertext` and writes them to `out_plaintext`. - extern "C" { - fn GFp_chacha20_poly1305_open( - out_plaintext: *mut u8, - ciphertext: *const u8, - plaintext_len: usize, - ad: *const u8, - ad_len: usize, - data: &mut InOut, - ); - } - - let out = unsafe { - GFp_chacha20_poly1305_open( - in_out.as_mut_ptr(), - in_out.as_ptr().add(in_prefix_len), - in_out.len() - in_prefix_len, - aad.as_ref().as_ptr(), - aad.as_ref().len(), - &mut data, - ); - &data.out - }; - - return Tag(out.tag); - } - } - - aead( - key, - nonce, - aad, - in_out, - Direction::Opening { in_prefix_len }, - cpu_features, - ) -} - -pub type Key = chacha::Key; - -// Keep in sync with BoringSSL's `chacha20_poly1305_open_data` and -// `chacha20_poly1305_seal_data`. -#[repr(C)] -#[cfg(target_arch = "x86_64")] -union InOut -where - T: Copy, -{ - input: T, - out: Out, -} - -// It isn't obvious whether the assembly code works for tags that aren't -// 16-byte aligned. In practice it will always be 16-byte aligned because it -// is embedded in a union where the other member of the union is 16-byte -// aligned. -#[cfg(target_arch = "x86_64")] -#[derive(Clone, Copy)] -#[repr(align(16), C)] -struct Out { - tag: [u8; super::TAG_LEN], -} - -#[inline(always)] // Statically eliminate branches on `direction`. -fn aead( - chacha20_key: &Key, - nonce: Nonce, - Aad(aad): Aad<&[u8]>, - in_out: &mut [u8], - direction: Direction, - cpu_features: cpu::Features, -) -> Tag { - let mut counter = Counter::zero(nonce); - let mut ctx = { - let key = derive_poly1305_key(chacha20_key, counter.increment(), cpu_features); - poly1305::Context::from_key(key) - }; - - poly1305_update_padded_16(&mut ctx, aad); - - let in_out_len = match direction { - Direction::Opening { in_prefix_len } => { - poly1305_update_padded_16(&mut ctx, &in_out[in_prefix_len..]); - chacha20_key.encrypt_overlapping(counter, in_out, in_prefix_len); - in_out.len() - in_prefix_len - } - Direction::Sealing => { - chacha20_key.encrypt_in_place(counter, in_out); - poly1305_update_padded_16(&mut ctx, in_out); - in_out.len() - } - }; - - ctx.update( - Block::from_u64_le( - LittleEndian::from(polyfill::u64_from_usize(aad.len())), - LittleEndian::from(polyfill::u64_from_usize(in_out_len)), - ) - .as_ref(), - ); - ctx.finish() -} - -#[inline] -fn poly1305_update_padded_16(ctx: &mut poly1305::Context, input: &[u8]) { - let remainder_len = input.len() % BLOCK_LEN; - let whole_len = input.len() - remainder_len; - if whole_len > 0 { - ctx.update(&input[..whole_len]); - } - if remainder_len > 0 { - let mut block = Block::zero(); - block.overwrite_part_at(0, &input[whole_len..]); - ctx.update(block.as_ref()) - } -} - -// Also used by chacha20_poly1305_openssh. -pub(super) fn derive_poly1305_key( - chacha_key: &chacha::Key, - iv: Iv, - cpu_features: cpu::Features, -) -> poly1305::Key { - let mut key_bytes = [0u8; 2 * BLOCK_LEN]; - chacha_key.encrypt_iv_xor_blocks_in_place(iv, &mut key_bytes); - poly1305::Key::new(key_bytes, cpu_features) -} - -#[cfg(test)] -mod tests { - #[test] - fn max_input_len_test() { - // Errata 4858 at https://www.rfc-editor.org/errata_search.php?rfc=7539. - assert_eq!(super::CHACHA20_POLY1305.max_input_len, 274_877_906_880u64); - } -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/aead/chacha.rs temporalio-1.3.0/vendor/ring-0.16.20/src/aead/chacha.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/aead/chacha.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/aead/chacha.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,235 +0,0 @@ -// Copyright 2016 Brian Smith. -// Portions Copyright (c) 2016, Google Inc. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -use super::{counter, iv::Iv, quic::Sample, BLOCK_LEN}; -use crate::{c, endian::*}; - -#[repr(transparent)] -pub struct Key([LittleEndian; KEY_LEN / 4]); - -impl From<[u8; KEY_LEN]> for Key { - #[inline] - fn from(value: [u8; KEY_LEN]) -> Self { - Self(FromByteArray::from_byte_array(&value)) - } -} - -impl Key { - #[inline] // Optimize away match on `counter`. - pub fn encrypt_in_place(&self, counter: Counter, in_out: &mut [u8]) { - unsafe { - self.encrypt( - CounterOrIv::Counter(counter), - in_out.as_ptr(), - in_out.len(), - in_out.as_mut_ptr(), - ); - } - } - - #[inline] // Optimize away match on `iv` and length check. - pub fn encrypt_iv_xor_blocks_in_place(&self, iv: Iv, in_out: &mut [u8; 2 * BLOCK_LEN]) { - unsafe { - self.encrypt( - CounterOrIv::Iv(iv), - in_out.as_ptr(), - in_out.len(), - in_out.as_mut_ptr(), - ); - } - } - - #[inline] - pub fn new_mask(&self, sample: Sample) -> [u8; 5] { - let mut out: [u8; 5] = [0; 5]; - let iv = Iv::assume_unique_for_key(sample); - - unsafe { - self.encrypt( - CounterOrIv::Iv(iv), - out.as_ptr(), - out.len(), - out.as_mut_ptr(), - ); - } - - out - } - - pub fn encrypt_overlapping(&self, counter: Counter, in_out: &mut [u8], in_prefix_len: usize) { - // XXX: The x86 and at least one branch of the ARM assembly language - // code doesn't allow overlapping input and output unless they are - // exactly overlapping. TODO: Figure out which branch of the ARM code - // has this limitation and come up with a better solution. - // - // https://rt.openssl.org/Ticket/Display.html?id=4362 - let len = in_out.len() - in_prefix_len; - if cfg!(any(target_arch = "arm", target_arch = "x86")) && in_prefix_len != 0 { - in_out.copy_within(in_prefix_len.., 0); - self.encrypt_in_place(counter, &mut in_out[..len]); - } else { - unsafe { - self.encrypt( - CounterOrIv::Counter(counter), - in_out[in_prefix_len..].as_ptr(), - len, - in_out.as_mut_ptr(), - ); - } - } - } - - #[inline] // Optimize away match on `counter.` - unsafe fn encrypt( - &self, - counter: CounterOrIv, - input: *const u8, - in_out_len: usize, - output: *mut u8, - ) { - let iv = match counter { - CounterOrIv::Counter(counter) => counter.into(), - CounterOrIv::Iv(iv) => { - assert!(in_out_len <= 32); - iv - } - }; - - /// XXX: Although this takes an `Iv`, this actually uses it like a - /// `Counter`. - extern "C" { - fn GFp_ChaCha20_ctr32( - out: *mut u8, - in_: *const u8, - in_len: c::size_t, - key: &Key, - first_iv: &Iv, - ); - } - - GFp_ChaCha20_ctr32(output, input, in_out_len, self, &iv); - } - - #[cfg(target_arch = "x86_64")] - #[inline] - pub(super) fn words_less_safe(&self) -> &[LittleEndian; KEY_LEN / 4] { - &self.0 - } -} - -pub type Counter = counter::Counter>; - -enum CounterOrIv { - Counter(Counter), - Iv(Iv), -} - -const KEY_BLOCKS: usize = 2; -pub const KEY_LEN: usize = KEY_BLOCKS * BLOCK_LEN; - -#[cfg(test)] -mod tests { - use super::*; - use crate::test; - use alloc::vec; - use core::convert::TryInto; - - // This verifies the encryption functionality provided by ChaCha20_ctr32 - // is successful when either computed on disjoint input/output buffers, - // or on overlapping input/output buffers. On some branches of the 32-bit - // x86 and ARM code the in-place operation fails in some situations where - // the input/output buffers are not exactly overlapping. Such failures are - // dependent not only on the degree of overlapping but also the length of - // the data. `open()` works around that by moving the input data to the - // output location so that the buffers exactly overlap, for those targets. - // This test exists largely as a canary for detecting if/when that type of - // problem spreads to other platforms. - #[test] - pub fn chacha20_tests() { - test::run(test_file!("chacha_tests.txt"), |section, test_case| { - assert_eq!(section, ""); - - let key = test_case.consume_bytes("Key"); - let key: &[u8; KEY_LEN] = key.as_slice().try_into()?; - let key = Key::from(*key); - - let ctr = test_case.consume_usize("Ctr"); - let nonce = test_case.consume_bytes("Nonce"); - let input = test_case.consume_bytes("Input"); - let output = test_case.consume_bytes("Output"); - - // Pre-allocate buffer for use in test_cases. - let mut in_out_buf = vec![0u8; input.len() + 276]; - - // Run the test case over all prefixes of the input because the - // behavior of ChaCha20 implementation changes dependent on the - // length of the input. - for len in 0..(input.len() + 1) { - chacha20_test_case_inner( - &key, - &nonce, - ctr as u32, - &input[..len], - &output[..len], - len, - &mut in_out_buf, - ); - } - - Ok(()) - }); - } - - fn chacha20_test_case_inner( - key: &Key, - nonce: &[u8], - ctr: u32, - input: &[u8], - expected: &[u8], - len: usize, - in_out_buf: &mut [u8], - ) { - // Straightforward encryption into disjoint buffers is computed - // correctly. - unsafe { - key.encrypt( - CounterOrIv::Counter(Counter::from_test_vector(nonce, ctr)), - input[..len].as_ptr(), - len, - in_out_buf.as_mut_ptr(), - ); - } - assert_eq!(&in_out_buf[..len], expected); - - // Do not test offset buffers for x86 and ARM architectures (see above - // for rationale). - let max_offset = if cfg!(any(target_arch = "x86", target_arch = "arm")) { - 0 - } else { - 259 - }; - - // Check that in-place encryption works successfully when the pointers - // to the input/output buffers are (partially) overlapping. - for alignment in 0..16 { - for offset in 0..(max_offset + 1) { - in_out_buf[alignment + offset..][..len].copy_from_slice(input); - let ctr = Counter::from_test_vector(nonce, ctr); - key.encrypt_overlapping(ctr, &mut in_out_buf[alignment..], offset); - assert_eq!(&in_out_buf[alignment..][..len], expected); - } - } - } -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/aead/chacha_tests.txt temporalio-1.3.0/vendor/ring-0.16.20/src/aead/chacha_tests.txt --- temporalio-1.3.0/vendor/ring-0.16.20/src/aead/chacha_tests.txt 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/aead/chacha_tests.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ -Key = 98bef1469be7269837a45bfbc92a5a6ac762507cf96443bf33b96b1bd4c6f8f6 -Ctr = 42 -Nonce = 44e792d63335abb1582e9253 -Input = 5828d530362c605529f8e18cae151526f23a73a0f312a3885f2b74233dc90523c654491e448814d9da3715dcb7e423b39d7e166835fc026dcc8ae5dd5fe4d2566f129c9c7d6a3848bddfd9ac1ba24dc543043cd799e1a7139c51c26df9cf073be4bf93a3a9b4c5f01ae48d5fc6c47c697ade1ac1c9cfc24e7a252c32e917ba68f1375d628446f5807f1a71f7be724bb81cfe3ebdae0d730d874a31c33d466fb3d76be3b870178e7a6a0ebfa8bc2bdbfa4fb62620ee63f06d26ac6a18376e5981d160e640d56d68ba8b654af9f1ae56248fe38ee77e6fcf92dfa9753ad62e1caff2d68b39add25dfbd7df05570df7f68f2d14b04e1a3c7704cd3c5c5852106fcf5c03c85f852b058260dacccdd688bfc010b36f545442bc4b77214dee8745064c6038d27e1d306c55f038801cde3dea683ef63e59cf0d08ae8c020bc1726ab46df3f7b3ef3ab106f2f4d6697b3ea216313179b633a9ca8aa8bef3e93828d1e13b4e2e4735a461141e422c4955eae3b3ce39d3b3ef4a4d7849bdf67c0a2cd326cbd96aad6393a72992dc1faf61828074b29c4a867350d8d1ffee1ae2dda261bd10c35f679f29e4d370e5673ad22000cc251596544585ed82883b9f3bc304d423b10ddcc8269d28b3254d52e533f3ed2cb81acfc352b42fc77996147d72277285ea6d41a022136d0683a4dd0f69d201cdc6b8645c2c79d1c7d331db2cffdad06931ad835fed6a97e40043b02e97ae005f5cb9e8398010ca0cfaf0b5cdaa271160d9218693919f2d1a8ede0bb5cb052430454d1175fde5a0a94e3a8c3b525a3718054a7a096ae6d5a9a671474c50e13e8a212b4f0ee3cb72c5283e5a33ec48922ea12457090f01853b34397ec79062e2dc5d0a2c5126953a9592a5398f0c830b9d38ab982ac401c40d7713cbcaf128315275272cf00486c8f33df29d8f5552403faa227fe7693bee4409deffb0693aae74e99d33ae8b6d6004ff533f88e9639bb16d2c22155a15d9e5cb03783cca598cc8c286ffd279d6c6ec5bbba0ae0120092e385dda5de0594ee58b848fb6e0569f21a1cfb20f2c93f8cf37c19f3298216552666ed3719855b9469f1a35c4476962704b779ee421e6325a2605ba5753d79b553cbb5379609cc84df7f51d540291680eaaca5a780c289ac3ac49c0f485ee59767e284ef15c63f7ce0e2c21a058e901fdebd1afe6ef93b3955160a2744015e5f40aca6d9a37424d5a58490fe902fc77d859deddad4b992e6473ad422ff32c0d49e42e6ca47375181485bb64b4a1b06e01c0cf179cc528c32d6c172a3d065cf3b44975ad1769d4ca65ae4471a5f60d0f8e37c743ce6b08e9d134488fc9fcf35d2dec62d3f0b3fe2e40557654c7b46116cc7c1c1924e64dd4c377671f3c7479a1f885881d6fa47e2c219f49f5aa4ef34afa9dbef6cedab5ab39bd1641a94aac0901ca -Output = 54306a13da596b6d5949c8c5ab26d48aadc03daf14b915b8cadf17a703d3c50601ef21dda30b9e48b85e0b879f9523688569d25daf57e927113d49faf108cc15ec1d1916129bc8661ffa2c93f4991127310ed8464740117001cae85bc591c83adcaaf34b80e5bc03d08972bcce2a760cf5da4c10063541b1e6b4aa7aeff0624ac59f2cafb82fd9d1017a362f3e83a5eb8170a0571746ea9ecb0e74d344571d4006f8b7cb5ff479bd1119d6eef8b0aadd0062ad3b889a885b1b07c9ae9ea694e555db4523b92ccd29d354c3881e5f52f2090026261aedf5c2a97df9215aaf6dab8e168496b54fcf1ea3af089f7986c3be0c70cb8ff3c5f8e84b217d18a9ed8bfb6b5a6f260b56047cfe0e1ec13f82c573bd530cf0e2c9f33d1b6dba70c16db60028e1c4786204da2386c3da743d7cd67629b2272eb235426082cf302c59e4e3d0741f58e8da4745731c0593ae75be1f81d8b7b3fffc8b529eed8b379fe0b8a266e16ac51f1df0de3f3db028f3aa4e4d31b026792b080fe92f79b3c8dda789a8a81d590e4f1e931f707f4e7efeb8ca63e0a605ccd7de2a4931785c5f44b29b91991429630912dd02d97be9f51207d0e7e6e8dddaa473c48ebd7bb7bbcb832f43f61c50ae9b2e52801885a823527a6af74236ca915a3d2aa0357d70fc4c187c5772cf9b29d6d0b4d7e6897069225e45094d4987845f8a5fe415d3e372afb2309cc1ff8e6d2a769e08037ee0c3c297066b332b08e3d50bd832676110ed6bed50efd71c1be06da16419342fe4e854bf840edf0e8bd8dd7796b854abf295590d0d0a156e01f224aba0d8df38ea97587688beaf45e3564f68e84be72b22189682892534d1dd08ea7e21ef575543f7faca1cde992e8bd8c3cf894dfc3b7d4ac999c431b67aaef849b246c1600575f33df2c984a4b98a872a875c0abc517d9af5c9242d5ee6c6e3cd7ee4af8a6c0004c8d7a5adfab2084a269b7cd0c613b1b9653f7030f9989d879957713eb1c324f0a6a2609d66d25faee39487ead1ea0d2a77ef31ccebf90cdc9c1280bbb08eab9a04cd4b954f7a0b537c16cc0eb17310ddaa769490d98b664131ed8c7d74c433fac3438d10bc844d0e9532df17436dd25e12b9ed33d9976f4acdc3cd8134be7ea2d0a7915d90f65e4a250fcc24ebe1e4626c8f4536975dda202b86008c94a96a69b2e9bb828e4195b4b7f15552303948b32582a9102789b5e51fab723c7008cee661bf19c8902b29303eb84c33f0f0152eb725ca994b6f4b4150ee5699cf2ba4c47c5ca6d467045c5d5f269e0fe258684c30cdef46db376fbbc480ca8a545d719d0ce8b82c109044a4883fbc153cd2ca0ec3e46eefb0cbfd617c27f225ea716df7499c8127f06133cf5568d373a4ed35652af23ecf9098546d956a0c9c240eb4b79b8d6e1cbceb171086da916d894cebf5508f40cf4a diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/aead/counter.rs temporalio-1.3.0/vendor/ring-0.16.20/src/aead/counter.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/aead/counter.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/aead/counter.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,105 +0,0 @@ -// Copyright 2018 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -use super::{ - iv::{Iv, IV_LEN}, - Nonce, -}; -use crate::endian::*; -use core::convert::TryInto; - -/// A generator of a monotonically increasing series of `Iv`s. -/// -/// Intentionally not `Clone` to ensure counters aren't forked. -#[repr(C)] -pub struct Counter { - u32s: [U32; COUNTER_LEN], -} - -const COUNTER_LEN: usize = 4; - -impl Counter -where - U32: Copy, - U32: Encoding, - U32: From<[u8; 4]>, - U32: Layout, - [U32; 4]: ArrayEncoding<[u8; IV_LEN]>, -{ - pub fn zero(nonce: Nonce) -> Self { - Self::new(nonce, 0) - } - pub fn one(nonce: Nonce) -> Self { - Self::new(nonce, 1) - } - - #[cfg(test)] - pub fn from_test_vector(nonce: &[u8], initial_counter: u32) -> Self { - Self::new( - Nonce::try_assume_unique_for_key(nonce).unwrap(), - initial_counter, - ) - } - - fn new(nonce: Nonce, initial_counter: u32) -> Self { - let mut r = Self { - u32s: [U32::ZERO; COUNTER_LEN], - }; - let nonce_index = (U32::COUNTER_INDEX + 1) % COUNTER_LEN; - (&mut r.u32s[nonce_index..][..3]) - .iter_mut() - .zip(nonce.as_ref().chunks_exact(4)) - .for_each(|(initial, nonce)| { - let nonce: &[u8; 4] = nonce.try_into().unwrap(); - *initial = U32::from(*nonce); - }); - r.u32s[U32::COUNTER_INDEX] = U32::from(initial_counter); - r - } - - #[inline] - pub fn increment(&mut self) -> Iv { - let current = Self { u32s: self.u32s }; - self.increment_by_less_safe(1); - current.into() - } - - #[inline] - pub fn increment_by_less_safe(&mut self, increment_by: u32) { - let counter = &mut self.u32s[U32::COUNTER_INDEX]; - let old_value: u32 = (*counter).into(); - *counter = U32::from(old_value + increment_by); - } -} - -pub trait Layout { - const COUNTER_INDEX: usize; -} - -impl Layout for BigEndian { - const COUNTER_INDEX: usize = 3; -} - -impl Layout for LittleEndian { - const COUNTER_INDEX: usize = 0; -} - -impl Into for Counter -where - [U32; 4]: ArrayEncoding<[u8; IV_LEN]>, -{ - fn into(self) -> Iv { - Iv::assume_unique_for_key(*self.u32s.as_byte_array()) - } -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/aead/gcm/gcm_nohw.rs temporalio-1.3.0/vendor/ring-0.16.20/src/aead/gcm/gcm_nohw.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/aead/gcm/gcm_nohw.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/aead/gcm/gcm_nohw.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,242 +0,0 @@ -// Copyright (c) 2019, Google Inc. -// Portions Copyright 2020 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -// This file is based on BoringSSL's gcm_nohw.c. - -// This file contains a constant-time implementation of GHASH based on the notes -// in https://bearssl.org/constanttime.html#ghash-for-gcm and the reduction -// algorithm described in -// https://crypto.stanford.edu/RealWorldCrypto/slides/gueron.pdf. -// -// Unlike the BearSSL notes, we use u128 in the 64-bit implementation. - -use super::{super::Block, Xi}; -use crate::endian::BigEndian; -use core::convert::TryInto; - -#[cfg(target_pointer_width = "64")] -fn gcm_mul64_nohw(a: u64, b: u64) -> (u64, u64) { - #[inline(always)] - fn lo(a: u128) -> u64 { - a as u64 - } - - #[inline(always)] - fn hi(a: u128) -> u64 { - lo(a >> 64) - } - - #[inline(always)] - fn mul(a: u64, b: u64) -> u128 { - u128::from(a) * u128::from(b) - } - - // One term every four bits means the largest term is 64/4 = 16, which barely - // overflows into the next term. Using one term every five bits would cost 25 - // multiplications instead of 16. It is faster to mask off the bottom four - // bits of |a|, giving a largest term of 60/4 = 15, and apply the bottom bits - // separately. - let a0 = a & 0x1111111111111110; - let a1 = a & 0x2222222222222220; - let a2 = a & 0x4444444444444440; - let a3 = a & 0x8888888888888880; - - let b0 = b & 0x1111111111111111; - let b1 = b & 0x2222222222222222; - let b2 = b & 0x4444444444444444; - let b3 = b & 0x8888888888888888; - - let c0 = mul(a0, b0) ^ mul(a1, b3) ^ mul(a2, b2) ^ mul(a3, b1); - let c1 = mul(a0, b1) ^ mul(a1, b0) ^ mul(a2, b3) ^ mul(a3, b2); - let c2 = mul(a0, b2) ^ mul(a1, b1) ^ mul(a2, b0) ^ mul(a3, b3); - let c3 = mul(a0, b3) ^ mul(a1, b2) ^ mul(a2, b1) ^ mul(a3, b0); - - // Multiply the bottom four bits of |a| with |b|. - let a0_mask = 0u64.wrapping_sub(a & 1); - let a1_mask = 0u64.wrapping_sub((a >> 1) & 1); - let a2_mask = 0u64.wrapping_sub((a >> 2) & 1); - let a3_mask = 0u64.wrapping_sub((a >> 3) & 1); - let extra = u128::from(a0_mask & b) - ^ (u128::from(a1_mask & b) << 1) - ^ (u128::from(a2_mask & b) << 2) - ^ (u128::from(a3_mask & b) << 3); - - let lo = (lo(c0) & 0x1111111111111111) - ^ (lo(c1) & 0x2222222222222222) - ^ (lo(c2) & 0x4444444444444444) - ^ (lo(c3) & 0x8888888888888888) - ^ lo(extra); - let hi = (hi(c0) & 0x1111111111111111) - ^ (hi(c1) & 0x2222222222222222) - ^ (hi(c2) & 0x4444444444444444) - ^ (hi(c3) & 0x8888888888888888) - ^ hi(extra); - (lo, hi) -} - -#[cfg(not(target_pointer_width = "64"))] -fn gcm_mul32_nohw(a: u32, b: u32) -> u64 { - #[inline(always)] - fn mul(a: u32, b: u32) -> u64 { - u64::from(a) * u64::from(b) - } - - // One term every four bits means the largest term is 32/4 = 8, which does not - // overflow into the next term. - let a0 = a & 0x11111111; - let a1 = a & 0x22222222; - let a2 = a & 0x44444444; - let a3 = a & 0x88888888; - - let b0 = b & 0x11111111; - let b1 = b & 0x22222222; - let b2 = b & 0x44444444; - let b3 = b & 0x88888888; - - let c0 = mul(a0, b0) ^ mul(a1, b3) ^ mul(a2, b2) ^ mul(a3, b1); - let c1 = mul(a0, b1) ^ mul(a1, b0) ^ mul(a2, b3) ^ mul(a3, b2); - let c2 = mul(a0, b2) ^ mul(a1, b1) ^ mul(a2, b0) ^ mul(a3, b3); - let c3 = mul(a0, b3) ^ mul(a1, b2) ^ mul(a2, b1) ^ mul(a3, b0); - - (c0 & 0x1111111111111111) - | (c1 & 0x2222222222222222) - | (c2 & 0x4444444444444444) - | (c3 & 0x8888888888888888) -} - -#[cfg(not(target_pointer_width = "64"))] -fn gcm_mul64_nohw(a: u64, b: u64) -> (u64, u64) { - #[inline(always)] - fn lo(a: u64) -> u32 { - a as u32 - } - #[inline(always)] - fn hi(a: u64) -> u32 { - lo(a >> 32) - } - - let a0 = lo(a); - let a1 = hi(a); - let b0 = lo(b); - let b1 = hi(b); - // Karatsuba multiplication. - let lo = gcm_mul32_nohw(a0, b0); - let hi = gcm_mul32_nohw(a1, b1); - let mid = gcm_mul32_nohw(a0 ^ a1, b0 ^ b1) ^ lo ^ hi; - (lo ^ (mid << 32), hi ^ (mid >> 32)) -} - -pub(super) fn init(xi: [u64; 2]) -> super::u128 { - // We implement GHASH in terms of POLYVAL, as described in RFC8452. This - // avoids a shift by 1 in the multiplication, needed to account for bit - // reversal losing a bit after multiplication, that is, - // rev128(X) * rev128(Y) = rev255(X*Y). - // - // Per Appendix A, we run mulX_POLYVAL. Note this is the same transformation - // applied by |gcm_init_clmul|, etc. Note |Xi| has already been byteswapped. - // - // See also slide 16 of - // https://crypto.stanford.edu/RealWorldCrypto/slides/gueron.pdf - let mut lo = xi[1]; - let mut hi = xi[0]; - - let mut carry = hi >> 63; - carry = 0u64.wrapping_sub(carry); - - hi <<= 1; - hi |= lo >> 63; - lo <<= 1; - - // The irreducible polynomial is 1 + x^121 + x^126 + x^127 + x^128, so we - // conditionally add 0xc200...0001. - lo ^= carry & 1; - hi ^= carry & 0xc200000000000000; - - // This implementation does not use the rest of |Htable|. - super::u128 { lo, hi } -} - -fn gcm_polyval_nohw(xi: &mut [u64; 2], h: super::u128) { - // Karatsuba multiplication. The product of |Xi| and |H| is stored in |r0| - // through |r3|. Note there is no byte or bit reversal because we are - // evaluating POLYVAL. - let (r0, mut r1) = gcm_mul64_nohw(xi[0], h.lo); - let (mut r2, mut r3) = gcm_mul64_nohw(xi[1], h.hi); - let (mut mid0, mut mid1) = gcm_mul64_nohw(xi[0] ^ xi[1], h.hi ^ h.lo); - mid0 ^= r0 ^ r2; - mid1 ^= r1 ^ r3; - r2 ^= mid1; - r1 ^= mid0; - - // Now we multiply our 256-bit result by x^-128 and reduce. |r2| and - // |r3| shifts into position and we must multiply |r0| and |r1| by x^-128. We - // have: - // - // 1 = x^121 + x^126 + x^127 + x^128 - // x^-128 = x^-7 + x^-2 + x^-1 + 1 - // - // This is the GHASH reduction step, but with bits flowing in reverse. - - // The x^-7, x^-2, and x^-1 terms shift bits past x^0, which would require - // another reduction steps. Instead, we gather the excess bits, incorporate - // them into |r0| and |r1| and reduce once. See slides 17-19 - // of https://crypto.stanford.edu/RealWorldCrypto/slides/gueron.pdf. - r1 ^= (r0 << 63) ^ (r0 << 62) ^ (r0 << 57); - - // 1 - r2 ^= r0; - r3 ^= r1; - - // x^-1 - r2 ^= r0 >> 1; - r2 ^= r1 << 63; - r3 ^= r1 >> 1; - - // x^-2 - r2 ^= r0 >> 2; - r2 ^= r1 << 62; - r3 ^= r1 >> 2; - - // x^-7 - r2 ^= r0 >> 7; - r2 ^= r1 << 57; - r3 ^= r1 >> 7; - - *xi = [r2, r3]; -} - -pub(super) fn gmult(xi: &mut Xi, h: super::u128) { - with_swapped_xi(xi, |swapped| { - gcm_polyval_nohw(swapped, h); - }) -} - -pub(super) fn ghash(xi: &mut Xi, h: super::u128, input: &[u8]) { - with_swapped_xi(xi, |swapped| { - input.chunks_exact(16).for_each(|inp| { - swapped[0] ^= u64::from_be_bytes(inp[8..].try_into().unwrap()); - swapped[1] ^= u64::from_be_bytes(inp[..8].try_into().unwrap()); - gcm_polyval_nohw(swapped, h); - }); - }); -} - -#[inline] -fn with_swapped_xi(Xi(xi): &mut Xi, f: impl FnOnce(&mut [u64; 2])) { - let unswapped = xi.u64s_be_to_native(); - let mut swapped: [u64; 2] = [unswapped[1], unswapped[0]]; - f(&mut swapped); - *xi = Block::from_u64_be(BigEndian::from(swapped[1]), BigEndian::from(swapped[0])) -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/aead/gcm.rs temporalio-1.3.0/vendor/ring-0.16.20/src/aead/gcm.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/aead/gcm.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/aead/gcm.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,340 +0,0 @@ -// Copyright 2018 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -use super::{Aad, Block, BLOCK_LEN}; -use crate::cpu; - -#[cfg(not(target_arch = "aarch64"))] -mod gcm_nohw; - -pub struct Key(HTable); - -impl Key { - pub(super) fn new(h_be: Block, cpu_features: cpu::Features) -> Self { - let h = h_be.u64s_be_to_native(); - - let mut key = Self(HTable { - Htable: [u128 { hi: 0, lo: 0 }; HTABLE_LEN], - }); - let h_table = &mut key.0; - - match detect_implementation(cpu_features) { - #[cfg(target_arch = "x86_64")] - Implementation::CLMUL if has_avx_movbe(cpu_features) => { - extern "C" { - fn GFp_gcm_init_avx(HTable: &mut HTable, h: &[u64; 2]); - } - unsafe { - GFp_gcm_init_avx(h_table, &h); - } - } - - #[cfg(any( - target_arch = "aarch64", - target_arch = "arm", - target_arch = "x86_64", - target_arch = "x86" - ))] - Implementation::CLMUL => { - extern "C" { - fn GFp_gcm_init_clmul(Htable: &mut HTable, h: &[u64; 2]); - } - unsafe { - GFp_gcm_init_clmul(h_table, &h); - } - } - - #[cfg(any(target_arch = "aarch64", target_arch = "arm"))] - Implementation::NEON => { - extern "C" { - fn GFp_gcm_init_neon(Htable: &mut HTable, h: &[u64; 2]); - } - unsafe { - GFp_gcm_init_neon(h_table, &h); - } - } - - #[cfg(not(target_arch = "aarch64"))] - Implementation::Fallback => { - h_table.Htable[0] = gcm_nohw::init(h); - } - } - - key - } -} - -pub struct Context { - inner: ContextInner, - cpu_features: cpu::Features, -} - -impl Context { - pub(crate) fn new(key: &Key, aad: Aad<&[u8]>, cpu_features: cpu::Features) -> Self { - let mut ctx = Context { - inner: ContextInner { - Xi: Xi(Block::zero()), - _unused: Block::zero(), - Htable: key.0.clone(), - }, - cpu_features, - }; - - for ad in aad.0.chunks(BLOCK_LEN) { - let mut block = Block::zero(); - block.overwrite_part_at(0, ad); - ctx.update_block(block); - } - - ctx - } - - /// Access to `inner` for the integrated AES-GCM implementations only. - #[cfg(target_arch = "x86_64")] - #[inline] - pub(super) fn inner(&mut self) -> &mut ContextInner { - &mut self.inner - } - - pub fn update_blocks(&mut self, input: &[u8]) { - debug_assert!(input.len() > 0); - debug_assert_eq!(input.len() % BLOCK_LEN, 0); - - // Although these functions take `Xi` and `h_table` as separate - // parameters, one or more of them might assume that they are part of - // the same `ContextInner` structure. - let xi = &mut self.inner.Xi; - let h_table = &self.inner.Htable; - - match detect_implementation(self.cpu_features) { - #[cfg(target_arch = "x86_64")] - Implementation::CLMUL if has_avx_movbe(self.cpu_features) => { - extern "C" { - fn GFp_gcm_ghash_avx( - xi: &mut Xi, - Htable: &HTable, - inp: *const u8, - len: crate::c::size_t, - ); - } - unsafe { - GFp_gcm_ghash_avx(xi, h_table, input.as_ptr(), input.len()); - } - } - - #[cfg(any( - target_arch = "aarch64", - target_arch = "arm", - target_arch = "x86_64", - target_arch = "x86" - ))] - Implementation::CLMUL => { - extern "C" { - fn GFp_gcm_ghash_clmul( - xi: &mut Xi, - Htable: &HTable, - inp: *const u8, - len: crate::c::size_t, - ); - } - unsafe { - GFp_gcm_ghash_clmul(xi, h_table, input.as_ptr(), input.len()); - } - } - - #[cfg(any(target_arch = "aarch64", target_arch = "arm"))] - Implementation::NEON => { - extern "C" { - fn GFp_gcm_ghash_neon( - xi: &mut Xi, - Htable: &HTable, - inp: *const u8, - len: crate::c::size_t, - ); - } - unsafe { - GFp_gcm_ghash_neon(xi, h_table, input.as_ptr(), input.len()); - } - } - - #[cfg(not(target_arch = "aarch64"))] - Implementation::Fallback => { - gcm_nohw::ghash(xi, h_table.Htable[0], input); - } - } - } - - pub fn update_block(&mut self, a: Block) { - self.inner.Xi.bitxor_assign(a); - - // Although these functions take `Xi` and `h_table` as separate - // parameters, one or more of them might assume that they are part of - // the same `ContextInner` structure. - let xi = &mut self.inner.Xi; - let h_table = &self.inner.Htable; - - match detect_implementation(self.cpu_features) { - #[cfg(any( - target_arch = "aarch64", - target_arch = "arm", - target_arch = "x86_64", - target_arch = "x86" - ))] - Implementation::CLMUL => { - extern "C" { - fn GFp_gcm_gmult_clmul(xi: &mut Xi, Htable: &HTable); - } - unsafe { - GFp_gcm_gmult_clmul(xi, h_table); - } - } - - #[cfg(any(target_arch = "aarch64", target_arch = "arm"))] - Implementation::NEON => { - extern "C" { - fn GFp_gcm_gmult_neon(xi: &mut Xi, Htable: &HTable); - } - unsafe { - GFp_gcm_gmult_neon(xi, h_table); - } - } - - #[cfg(not(target_arch = "aarch64"))] - Implementation::Fallback => { - gcm_nohw::gmult(xi, h_table.Htable[0]); - } - } - } - - pub(super) fn pre_finish(self, f: F) -> super::Tag - where - F: FnOnce(Xi) -> super::Tag, - { - f(self.inner.Xi) - } - - #[cfg(target_arch = "x86_64")] - pub(super) fn is_avx2(&self, cpu_features: cpu::Features) -> bool { - match detect_implementation(cpu_features) { - Implementation::CLMUL => has_avx_movbe(self.cpu_features), - _ => false, - } - } -} - -// The alignment is required by non-Rust code that uses `GCM128_CONTEXT`. -#[derive(Clone)] -#[repr(C, align(16))] -struct HTable { - Htable: [u128; HTABLE_LEN], -} - -#[derive(Clone, Copy)] -#[repr(C)] -struct u128 { - hi: u64, - lo: u64, -} - -const HTABLE_LEN: usize = 16; - -#[repr(transparent)] -pub struct Xi(Block); - -impl Xi { - #[inline] - fn bitxor_assign(&mut self, a: Block) { - self.0.bitxor_assign(a) - } -} - -impl From for Block { - #[inline] - fn from(Xi(block): Xi) -> Self { - block - } -} - -// This corresponds roughly to the `GCM128_CONTEXT` structure in BoringSSL. -// Some assembly language code, in particular the MOVEBE+AVX2 X86-64 -// implementation, requires this exact layout. -#[repr(C, align(16))] -pub(super) struct ContextInner { - Xi: Xi, - _unused: Block, - Htable: HTable, -} - -enum Implementation { - #[cfg(any( - target_arch = "aarch64", - target_arch = "arm", - target_arch = "x86_64", - target_arch = "x86" - ))] - CLMUL, - - #[cfg(any(target_arch = "aarch64", target_arch = "arm"))] - NEON, - - #[cfg(not(target_arch = "aarch64"))] - Fallback, -} - -#[inline] -fn detect_implementation(cpu_features: cpu::Features) -> Implementation { - // `cpu_features` is only used for specific platforms. - #[cfg(not(any( - target_arch = "aarch64", - target_arch = "arm", - target_arch = "x86_64", - target_arch = "x86" - )))] - let _cpu_features = cpu_features; - - #[cfg(any( - target_arch = "aarch64", - target_arch = "arm", - target_arch = "x86_64", - target_arch = "x86" - ))] - { - if (cpu::intel::FXSR.available(cpu_features) - && cpu::intel::PCLMULQDQ.available(cpu_features)) - || cpu::arm::PMULL.available(cpu_features) - { - return Implementation::CLMUL; - } - } - - #[cfg(target_arch = "arm")] - { - if cpu::arm::NEON.available(cpu_features) { - return Implementation::NEON; - } - } - - #[cfg(target_arch = "aarch64")] - { - return Implementation::NEON; - } - - #[cfg(not(target_arch = "aarch64"))] - Implementation::Fallback -} - -#[cfg(target_arch = "x86_64")] -fn has_avx_movbe(cpu_features: cpu::Features) -> bool { - cpu::intel::AVX.available(cpu_features) && cpu::intel::MOVBE.available(cpu_features) -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/aead/iv.rs temporalio-1.3.0/vendor/ring-0.16.20/src/aead/iv.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/aead/iv.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/aead/iv.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,33 +0,0 @@ -// Copyright 2018 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -/// The IV for a single block encryption. -/// -/// Intentionally not `Clone` to ensure each is used only once. -#[repr(C)] -pub struct Iv([u8; IV_LEN]); - -pub const IV_LEN: usize = 16; - -impl Iv { - #[inline] - pub fn assume_unique_for_key(a: [u8; IV_LEN]) -> Self { - Self(a) - } - - #[inline] - pub fn into_bytes_less_safe(self) -> [u8; IV_LEN] { - self.0 - } -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/aead/nonce.rs temporalio-1.3.0/vendor/ring-0.16.20/src/aead/nonce.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/aead/nonce.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/aead/nonce.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,52 +0,0 @@ -// Copyright 2018 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -use crate::error; -use core::convert::TryInto; - -/// A nonce for a single AEAD opening or sealing operation. -/// -/// The user must ensure, for a particular key, that each nonce is unique. -/// -/// `Nonce` intentionally doesn't implement `Clone` to ensure that each one is -/// consumed at most once. -pub struct Nonce([u8; NONCE_LEN]); - -impl Nonce { - /// Constructs a `Nonce` with the given value, assuming that the value is - /// unique for the lifetime of the key it is being used with. - /// - /// Fails if `value` isn't `NONCE_LEN` bytes long. - #[inline] - pub fn try_assume_unique_for_key(value: &[u8]) -> Result { - let value: &[u8; NONCE_LEN] = value.try_into()?; - Ok(Self::assume_unique_for_key(*value)) - } - - /// Constructs a `Nonce` with the given value, assuming that the value is - /// unique for the lifetime of the key it is being used with. - #[inline] - pub fn assume_unique_for_key(value: [u8; NONCE_LEN]) -> Self { - Self(value) - } -} - -impl AsRef<[u8; NONCE_LEN]> for Nonce { - fn as_ref(&self) -> &[u8; NONCE_LEN] { - &self.0 - } -} - -/// All the AEADs we support use 96-bit nonces. -pub const NONCE_LEN: usize = 96 / 8; diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/aead/poly1305.rs temporalio-1.3.0/vendor/ring-0.16.20/src/aead/poly1305.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/aead/poly1305.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/aead/poly1305.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,154 +0,0 @@ -// Copyright 2015-2016 Brian Smith. -// Portions Copyright (c) 2014, 2015, Google Inc. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -// TODO: enforce maximum input length. - -use super::{block::BLOCK_LEN, Tag, TAG_LEN}; -use crate::{c, cpu}; - -/// A Poly1305 key. -pub(super) struct Key { - key_and_nonce: [u8; KEY_LEN], - cpu_features: cpu::Features, -} - -const KEY_LEN: usize = 2 * BLOCK_LEN; - -impl Key { - #[inline] - pub(super) fn new(key_and_nonce: [u8; KEY_LEN], cpu_features: cpu::Features) -> Self { - Self { - key_and_nonce, - cpu_features, - } - } -} - -pub struct Context { - state: poly1305_state, - #[allow(dead_code)] - cpu_features: cpu::Features, -} - -// Keep in sync with `poly1305_state` in GFp/poly1305.h. -// -// The C code, in particular the way the `poly1305_aligned_state` functions -// are used, is only correct when the state buffer is 64-byte aligned. -#[repr(C, align(64))] -struct poly1305_state([u8; OPAQUE_LEN]); -const OPAQUE_LEN: usize = 512; - -// Abstracts the dispatching logic that chooses the NEON implementation if and -// only if it would work. -macro_rules! dispatch { - ( $features:expr => - ( $f:ident | $neon_f:ident ) - ( $( $p:ident : $t:ty ),+ ) - ( $( $a:expr ),+ ) ) => { - match () { - // Apple's 32-bit ARM ABI is incompatible with the assembly code. - #[cfg(all(target_arch = "arm", not(target_vendor = "apple")))] - () if cpu::arm::NEON.available($features) => { - extern "C" { - fn $neon_f( $( $p : $t ),+ ); - } - unsafe { $neon_f( $( $a ),+ ) } - } - () => { - extern "C" { - fn $f( $( $p : $t ),+ ); - } - unsafe { $f( $( $a ),+ ) } - } - } - } -} - -impl Context { - #[inline] - pub(super) fn from_key( - Key { - key_and_nonce, - cpu_features, - }: Key, - ) -> Self { - let mut ctx = Self { - state: poly1305_state([0u8; OPAQUE_LEN]), - cpu_features, - }; - - dispatch!( - cpu_features => - (GFp_poly1305_init | GFp_poly1305_init_neon) - (statep: &mut poly1305_state, key: &[u8; KEY_LEN]) - (&mut ctx.state, &key_and_nonce)); - - ctx - } - - #[inline(always)] - pub fn update(&mut self, input: &[u8]) { - dispatch!( - self.cpu_features => - (GFp_poly1305_update | GFp_poly1305_update_neon) - (statep: &mut poly1305_state, input: *const u8, in_len: c::size_t) - (&mut self.state, input.as_ptr(), input.len())); - } - - pub(super) fn finish(mut self) -> Tag { - let mut tag = Tag([0u8; TAG_LEN]); - dispatch!( - self.cpu_features => - (GFp_poly1305_finish | GFp_poly1305_finish_neon) - (statep: &mut poly1305_state, mac: &mut [u8; TAG_LEN]) - (&mut self.state, &mut tag.0)); - tag - } -} - -/// Implements the original, non-IETF padding semantics. -/// -/// This is used by chacha20_poly1305_openssh and the standalone -/// poly1305 test vectors. -pub(super) fn sign(key: Key, input: &[u8]) -> Tag { - let mut ctx = Context::from_key(key); - ctx.update(input); - ctx.finish() -} - -#[cfg(test)] -mod tests { - use super::*; - use crate::test; - use core::convert::TryInto; - - // Adapted from BoringSSL's crypto/poly1305/poly1305_test.cc. - #[test] - pub fn test_poly1305() { - let cpu_features = cpu::features(); - test::run(test_file!("poly1305_test.txt"), |section, test_case| { - assert_eq!(section, ""); - let key = test_case.consume_bytes("Key"); - let key: &[u8; BLOCK_LEN * 2] = key.as_slice().try_into().unwrap(); - let input = test_case.consume_bytes("Input"); - let expected_mac = test_case.consume_bytes("MAC"); - let key = Key::new(*key, cpu_features); - let Tag(actual_mac) = sign(key, &input); - assert_eq!(expected_mac, actual_mac.as_ref()); - - Ok(()) - }) - } -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/aead/poly1305_test.txt temporalio-1.3.0/vendor/ring-0.16.20/src/aead/poly1305_test.txt --- temporalio-1.3.0/vendor/ring-0.16.20/src/aead/poly1305_test.txt 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/aead/poly1305_test.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,170 +0,0 @@ -# Test Vectors from OpenSSL commit bbe9769ba66ab2512678a87b0d9b266ba970db05. - -Key = 2d773be37adb1e4d683bf0075e79c4ee037918535a7f99ccb7040fb5f5f43aea -Input = 89dab80b7717c1db5db437860a3f70218e93e1b8f461fb677f16f35f6f87e2a91c99bc3a47ace47640cc95c345be5ecca5a3523c35cc01893af0b64a620334270372ec12482d1b1e363561698a578b359803495bb4e2ef1930b17a5190b580f141300df30adbeca28f6427a8bc1a999fd51c554a017d095d8c3e3127daf9f595 -MAC = c85d15ed44c378d6b00e23064c7bcd51 - -Key = 99e5822dd4173c995e3dae0ddefb97743fde3b080134b39f76e9bf8d0e88d546 -Input = 000000000000000b170303020000000006db1f1f368d696a810a349c0c714c9a5e7850c2407d721acded95e018d7a85266a6e1289cdb4aeb18da5ac8a2b0026d24a59ad485227f3eaedbb2e7e35e1c66cd60f9abf716dcc9ac42682dd7dab287a7024c4eefc321cc0574e16793e37cec03c5bda42b54c114a80b57af26416c7be742005e20855c73e21dc8e2edc9d435cb6f6059280011c270b71570051c1c9b3052126620bc1e2730fa066c7a509d53c60e5ae1b40aa6e39e49669228c90eecb4a50db32a50bc49e90b4f4b359a1dfd11749cd3867fcf2fb7bb6cd4738f6a4ad6f7ca5058f7618845af9f020f6c3b967b8f4cd4a91e2813b507ae66f2d35c18284f7292186062e10fd5510d18775351ef334e7634ab4743f5b68f49adcab384d3fd75f7390f4006ef2a295c8c7a076ad54546cd25d2107fbe1436c840924aaebe5b370893cd63d1325b8616fc4810886bc152c53221b6df373119393255ee72bcaa880174f1717f9184fa91646f17a24ac55d16bfddca9581a92eda479201f0edbf633600d6066d1ab36d5d2415d71351bbcd608a25108d25641992c1f26c531cf9f90203bc4cc19f5927d834b0a47116d3884bbb164b8ec883d1ac832e56b3918a98601a08d171881541d594db399c6ae6151221745aec814c45b0b05b565436fd6f137aa10a0c0b643761dbd6f9a9dcb99b1a6e690854ce0769cde39761d82fcdec15f0d92d7d8e94ade8eb83fbe0 -MAC = 2637408fe13086ea73f971e3425e2820 - - -# RFC 7539, section 2.5.2. - -Key = 85d6be7857556d337f4452fe42d506a80103808afb0db2fd4abff6af4149f51b -Input = "Cryptographic Forum Research Group" -MAC = a8061dc1305136c6c22b8baf0c0127a9 - - -# RFC 7539, section A.3. - -Key = 0000000000000000000000000000000000000000000000000000000000000000 -Input = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -MAC = 00000000000000000000000000000000 - -Key = 0000000000000000000000000000000036e5f6b5c5e06070f0efca96227a863e -Input = 416e79207375626d697373696f6e20746f20746865204945544620696e74656e6465642062792074686520436f6e7472696275746f7220666f72207075626c69636174696f6e20617320616c6c206f722070617274206f6620616e204945544620496e7465726e65742d4472616674206f722052464320616e6420616e792073746174656d656e74206d6164652077697468696e2074686520636f6e74657874206f6620616e204945544620616374697669747920697320636f6e7369646572656420616e20224945544620436f6e747269627574696f6e222e20537563682073746174656d656e747320696e636c756465206f72616c2073746174656d656e747320696e20494554462073657373696f6e732c2061732077656c6c206173207772697474656e20616e6420656c656374726f6e696320636f6d6d756e69636174696f6e73206d61646520617420616e792074696d65206f7220706c6163652c207768696368206172652061646472657373656420746f -MAC = 36e5f6b5c5e06070f0efca96227a863e - -Key = 36e5f6b5c5e06070f0efca96227a863e00000000000000000000000000000000 -Input = 416e79207375626d697373696f6e20746f20746865204945544620696e74656e6465642062792074686520436f6e7472696275746f7220666f72207075626c69636174696f6e20617320616c6c206f722070617274206f6620616e204945544620496e7465726e65742d4472616674206f722052464320616e6420616e792073746174656d656e74206d6164652077697468696e2074686520636f6e74657874206f6620616e204945544620616374697669747920697320636f6e7369646572656420616e20224945544620436f6e747269627574696f6e222e20537563682073746174656d656e747320696e636c756465206f72616c2073746174656d656e747320696e20494554462073657373696f6e732c2061732077656c6c206173207772697474656e20616e6420656c656374726f6e696320636f6d6d756e69636174696f6e73206d61646520617420616e792074696d65206f7220706c6163652c207768696368206172652061646472657373656420746f -MAC = f3477e7cd95417af89a6b8794c310cf0 - -Key = 1c9240a5eb55d38af333888604f6b5f0473917c1402b80099dca5cbc207075c0 -Input = 2754776173206272696c6c69672c20616e642074686520736c6974687920746f7665730a446964206779726520616e642067696d626c6520696e2074686520776162653a0a416c6c206d696d737920776572652074686520626f726f676f7665732c0a416e6420746865206d6f6d65207261746873206f757467726162652e -MAC = 4541669a7eaaee61e708dc7cbcc5eb62 - -Key = 0200000000000000000000000000000000000000000000000000000000000000 -Input = ffffffffffffffffffffffffffffffff -MAC = 03000000000000000000000000000000 - -Key = 02000000000000000000000000000000ffffffffffffffffffffffffffffffff -Input = 02000000000000000000000000000000 -MAC = 03000000000000000000000000000000 - -Key = 0100000000000000000000000000000000000000000000000000000000000000 -Input = fffffffffffffffffffffffffffffffff0ffffffffffffffffffffffffffffff11000000000000000000000000000000 -MAC = 05000000000000000000000000000000 - -Key = 0100000000000000000000000000000000000000000000000000000000000000 -Input = fffffffffffffffffffffffffffffffffbfefefefefefefefefefefefefefefe01010101010101010101010101010101 -MAC = 00000000000000000000000000000000 - -Key = 0200000000000000000000000000000000000000000000000000000000000000 -Input = fdffffffffffffffffffffffffffffff -MAC = faffffffffffffffffffffffffffffff - -Key = 0100000000000000040000000000000000000000000000000000000000000000 -Input = e33594d7505e43b900000000000000003394d7505e4379cd01000000000000000000000000000000000000000000000001000000000000000000000000000000 -MAC = 14000000000000005500000000000000 - -Key = 0100000000000000040000000000000000000000000000000000000000000000 -Input = e33594d7505e43b900000000000000003394d7505e4379cd010000000000000000000000000000000000000000000000 -MAC = 13000000000000000000000000000000 - - -# Additional test vectors that are long enough to ensure OpenSSL's SIMD -# assembly is fully tested. - -# Length 2048. -Key = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f -Input = 248ac31085b6c2adaaa38259a0d7192c5c35d1bb4ef39ad94c38d1c82479e2dd2159a077024b0589bc8a20101b506f0a1ad0bbab76e83a83f1b94be6beae74e874cab692c5963a75436b776121ec9f62399a3e66b2d22707dae81933b6277f3c8516bcbe26dbbd86f373103d7cf4cad1888c952118fbfbd0d7b4bedc4ae4936aff91157e7aa47c54442ea78d6ac251d324a0fbe49d89cc3521b66d16e9c66a3709894e4eb0a4eedc4ae19468e66b81f271351b1d921ea551047abcc6b87a901fde7db79fa1818c11336dbc07244a40eb14cf77bde35e78ae9ad7d3f57ed7e7f23926c9172f82d77684ea5ed7d74ebc6f142b997036bcb7cce8df1bbc0d5b35a46509c954fc9469d214d6238f166cbf872156b4c41d7aac5942cffb175023078252a3f36e315c5d4ce0e39928a018252862becacef96a19f03bdcf46d75584299d1f8b03c0169e9e407d937145b5e5024139e7022a1978f114f24cdfa23780a119735c41da8fb759bbb3f025c6ec30e6c6e9bce8615be68e392fce59fd26a8e6a6cc5c606e3848116e4d01d29565a1facfb524b6d29643b826eee1e42869fc76df229dd79b39a2b1df28bb335c3a5f15a855d0121e4a6da34b5e4d5b7b5d5746a03ecff70811e1516fcec1bf7462e8876a2d21710aa168c78f45a6a15015950e221da85d3ec822ad6d0a6931b25a06b7bb5f3c10bb36cd4d647f9561982fde9818de5d4bf8db7f86c53b4ff14928ac15f79023b61861e73e44216540bb302153770da2533de9795252ab5fb77ad924c9338c8144c23d4c90dab9a18feac1a1574d4545e1435eb405e6c4c439fc724fce992ae85badf345bad16d85fbd338f04433703614754d0e7e54c4ccde2670587d52ecfb5a70a14a501bacc727722649931d8515b13d020a78e511fe136d45fbf97f9c7f689fcc677cfb3683723878350ffe9d08130cc6e567b6179e01b7eb2b3bbcf0873e1308eec018edeb8cce946338e15d5bf68c71916a83a99358039ef071e009546a2df936879dffbba397a93925d229a469fd17d71b7f524e03a30da6ee927542f8b369bed4734fe25dbd63d24ffd2a222f5f84f75d858ab989be925af570ad6d45bd28ce61b5139e1dd2f0b7795fe072e6e83acbb5e7b777a70c641e4cab2af40eed69abc334cd2703c3273204fac580c6a3d6680427e5f7d051e8380a53f93a180f4556ecea4530b9a2d5948dad63d415b6874f6b90e767d6d265be86351b53ba690780bb57c21b57418c5b97559e840c68257f839e7583a4bf7c7645c5987d40cc1ba79a218c35edfacdabe581d950e4bb7a481ebe64d61d00e75b1f25f1ce5f5462334a5b9038a697aa0937a3f8017e05d2c9c05dcb05c0b02508dea619b137f5444b6f088eb3cb2c66788f88afdfbba8faa1c490485624c88ae11e57347a676902e7553f056188493209bdbb30acc63c9e41e16a9d6c009416b520a76ba38f57628170c43626b5cb46179dc5bf65de865085f84bf741c223fbe474d2d19d8f43914fbd6586351089e73babf344f988b7963fe44528457d7aad3c564f6bcbd0d772a4c9fd328e6022d1c7c9f86726f8d5a23797d309c0f653ab1ac687833eb2700f156296062a8b377078f45f6b68c3d07cae1913ba8d5a6f9bf7525a3439eb932d4cefc4bf8e1b07b48ca13ece366cbc3e0388915915d1757475103a9e9454e7e6355de2d6acbf4710f9a63e4f6d3cd70c2d6fca88dd8a14448fdb63ce9350fdaafbe0b8bd1c5d307dae76dfed799aef2d8f23d5608d37d1330dd38b94860905dbeebf78d7b7318b7d42aed40d3f9899e9f420cbd92a6eeae3026f7725694e0e4bee016ba346fed2c21172bdb4a461cebe0cfe38e76645226ac127a259c193264d735ce8c8a57e17dd3f0579e2e86dc295ad1f45ba2d85db35044da61f7d401274b31eefbeb34e8d2ae596e9b4541aae117bdac5ed0b324c20539c27c07a411d5288b0b5f6fa16e9a7df85dc319fa6b71cd08a859c06a3f7b0289e1750adbf182f9750fea96fea5ab7aa3473340607cd7ed2c626f5382491c26d5d5bea61401dee7319c94d418f297e61ceac8f258ee8c23831bda081591f5a918e96855774ddedffc51e5b180f1971806d42fc333020b734aeb45adb0bc47325d0cea5f6713a786558022afc39d573892aa3635efbfd8bcb11c57f306c72146afe8b45388125cb7bf9ecf965a7ba4f768c77be366470dcdcf214b7f6a5a9460ed4fe44ae559d85e2fdc2094de83fff12ea8804db1215c4ca865871bdd7f8ef32ab799bf923ffb02c1ded7d129beadad46c5eda31ab1a6f43da05ea08bff7ffa88d8966353d01830558c39b930b01d175e437124d8edd0d2698fd8932f2b2c9b14746e52879c57a395538150f390264f00e60d470711202f4194499ff79037ca9885dc8d695f7d917a3086ca88e8f8d0243efee09302cf39e039eb7cc8dd19d28120d5fe533b5727cd39133181c729ca6f90a015ed30be7668d5cb5ecc33a53ee69bf7d1a5ecbdb153803743c6adaaabd36bf84e5be38d3f04a5d5dbfd67bdcd3b176e65bd1391ade775cc32ce43a847fb6c672a3fe97a5d4081c4986959ec5fb898f42a9397ba2b3ec2c1018f8d76d057f2366bd0e4465514ad6560c599664fb85621fe771e00f43d39b591b2a6a321100f4d1ef23a376d5ae3eeedbfe23da73dff0ee4d16b34ebddd8f5f053db9824105fc7300dbee7ea6af56b112319e3e215a0fc79ae946f6b5227453ec7fcaf17cf7651f71499a50d81221404d5f129ac50ea7528ff0e0069ec4ab8acb7919d81749ab37a870c5ef2cc5a15cf96709d3c65b4addc77e7416847160bcabb94ea36377e0ef71be80b5cc53effd5444888044a353574c72c924bba2a8b4e8354188ebfed -MAC = 69d28f73dd09d39a92aa179da354b7ea - -# Length 2049. -Key = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f -Input = 248ac31085b6c2adaaa38259a0d7192c5c35d1bb4ef39ad94c38d1c82479e2dd2159a077024b0589bc8a20101b506f0a1ad0bbab76e83a83f1b94be6beae74e874cab692c5963a75436b776121ec9f62399a3e66b2d22707dae81933b6277f3c8516bcbe26dbbd86f373103d7cf4cad1888c952118fbfbd0d7b4bedc4ae4936aff91157e7aa47c54442ea78d6ac251d324a0fbe49d89cc3521b66d16e9c66a3709894e4eb0a4eedc4ae19468e66b81f271351b1d921ea551047abcc6b87a901fde7db79fa1818c11336dbc07244a40eb14cf77bde35e78ae9ad7d3f57ed7e7f23926c9172f82d77684ea5ed7d74ebc6f142b997036bcb7cce8df1bbc0d5b35a46509c954fc9469d214d6238f166cbf872156b4c41d7aac5942cffb175023078252a3f36e315c5d4ce0e39928a018252862becacef96a19f03bdcf46d75584299d1f8b03c0169e9e407d937145b5e5024139e7022a1978f114f24cdfa23780a119735c41da8fb759bbb3f025c6ec30e6c6e9bce8615be68e392fce59fd26a8e6a6cc5c606e3848116e4d01d29565a1facfb524b6d29643b826eee1e42869fc76df229dd79b39a2b1df28bb335c3a5f15a855d0121e4a6da34b5e4d5b7b5d5746a03ecff70811e1516fcec1bf7462e8876a2d21710aa168c78f45a6a15015950e221da85d3ec822ad6d0a6931b25a06b7bb5f3c10bb36cd4d647f9561982fde9818de5d4bf8db7f86c53b4ff14928ac15f79023b61861e73e44216540bb302153770da2533de9795252ab5fb77ad924c9338c8144c23d4c90dab9a18feac1a1574d4545e1435eb405e6c4c439fc724fce992ae85badf345bad16d85fbd338f04433703614754d0e7e54c4ccde2670587d52ecfb5a70a14a501bacc727722649931d8515b13d020a78e511fe136d45fbf97f9c7f689fcc677cfb3683723878350ffe9d08130cc6e567b6179e01b7eb2b3bbcf0873e1308eec018edeb8cce946338e15d5bf68c71916a83a99358039ef071e009546a2df936879dffbba397a93925d229a469fd17d71b7f524e03a30da6ee927542f8b369bed4734fe25dbd63d24ffd2a222f5f84f75d858ab989be925af570ad6d45bd28ce61b5139e1dd2f0b7795fe072e6e83acbb5e7b777a70c641e4cab2af40eed69abc334cd2703c3273204fac580c6a3d6680427e5f7d051e8380a53f93a180f4556ecea4530b9a2d5948dad63d415b6874f6b90e767d6d265be86351b53ba690780bb57c21b57418c5b97559e840c68257f839e7583a4bf7c7645c5987d40cc1ba79a218c35edfacdabe581d950e4bb7a481ebe64d61d00e75b1f25f1ce5f5462334a5b9038a697aa0937a3f8017e05d2c9c05dcb05c0b02508dea619b137f5444b6f088eb3cb2c66788f88afdfbba8faa1c490485624c88ae11e57347a676902e7553f056188493209bdbb30acc63c9e41e16a9d6c009416b520a76ba38f57628170c43626b5cb46179dc5bf65de865085f84bf741c223fbe474d2d19d8f43914fbd6586351089e73babf344f988b7963fe44528457d7aad3c564f6bcbd0d772a4c9fd328e6022d1c7c9f86726f8d5a23797d309c0f653ab1ac687833eb2700f156296062a8b377078f45f6b68c3d07cae1913ba8d5a6f9bf7525a3439eb932d4cefc4bf8e1b07b48ca13ece366cbc3e0388915915d1757475103a9e9454e7e6355de2d6acbf4710f9a63e4f6d3cd70c2d6fca88dd8a14448fdb63ce9350fdaafbe0b8bd1c5d307dae76dfed799aef2d8f23d5608d37d1330dd38b94860905dbeebf78d7b7318b7d42aed40d3f9899e9f420cbd92a6eeae3026f7725694e0e4bee016ba346fed2c21172bdb4a461cebe0cfe38e76645226ac127a259c193264d735ce8c8a57e17dd3f0579e2e86dc295ad1f45ba2d85db35044da61f7d401274b31eefbeb34e8d2ae596e9b4541aae117bdac5ed0b324c20539c27c07a411d5288b0b5f6fa16e9a7df85dc319fa6b71cd08a859c06a3f7b0289e1750adbf182f9750fea96fea5ab7aa3473340607cd7ed2c626f5382491c26d5d5bea61401dee7319c94d418f297e61ceac8f258ee8c23831bda081591f5a918e96855774ddedffc51e5b180f1971806d42fc333020b734aeb45adb0bc47325d0cea5f6713a786558022afc39d573892aa3635efbfd8bcb11c57f306c72146afe8b45388125cb7bf9ecf965a7ba4f768c77be366470dcdcf214b7f6a5a9460ed4fe44ae559d85e2fdc2094de83fff12ea8804db1215c4ca865871bdd7f8ef32ab799bf923ffb02c1ded7d129beadad46c5eda31ab1a6f43da05ea08bff7ffa88d8966353d01830558c39b930b01d175e437124d8edd0d2698fd8932f2b2c9b14746e52879c57a395538150f390264f00e60d470711202f4194499ff79037ca9885dc8d695f7d917a3086ca88e8f8d0243efee09302cf39e039eb7cc8dd19d28120d5fe533b5727cd39133181c729ca6f90a015ed30be7668d5cb5ecc33a53ee69bf7d1a5ecbdb153803743c6adaaabd36bf84e5be38d3f04a5d5dbfd67bdcd3b176e65bd1391ade775cc32ce43a847fb6c672a3fe97a5d4081c4986959ec5fb898f42a9397ba2b3ec2c1018f8d76d057f2366bd0e4465514ad6560c599664fb85621fe771e00f43d39b591b2a6a321100f4d1ef23a376d5ae3eeedbfe23da73dff0ee4d16b34ebddd8f5f053db9824105fc7300dbee7ea6af56b112319e3e215a0fc79ae946f6b5227453ec7fcaf17cf7651f71499a50d81221404d5f129ac50ea7528ff0e0069ec4ab8acb7919d81749ab37a870c5ef2cc5a15cf96709d3c65b4addc77e7416847160bcabb94ea36377e0ef71be80b5cc53effd5444888044a353574c72c924bba2a8b4e8354188ebfedc8 -MAC = d6a26654b88572e875d9661c83471c1b - -# Length 2050. -Key = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f -Input = 248ac31085b6c2adaaa38259a0d7192c5c35d1bb4ef39ad94c38d1c82479e2dd2159a077024b0589bc8a20101b506f0a1ad0bbab76e83a83f1b94be6beae74e874cab692c5963a75436b776121ec9f62399a3e66b2d22707dae81933b6277f3c8516bcbe26dbbd86f373103d7cf4cad1888c952118fbfbd0d7b4bedc4ae4936aff91157e7aa47c54442ea78d6ac251d324a0fbe49d89cc3521b66d16e9c66a3709894e4eb0a4eedc4ae19468e66b81f271351b1d921ea551047abcc6b87a901fde7db79fa1818c11336dbc07244a40eb14cf77bde35e78ae9ad7d3f57ed7e7f23926c9172f82d77684ea5ed7d74ebc6f142b997036bcb7cce8df1bbc0d5b35a46509c954fc9469d214d6238f166cbf872156b4c41d7aac5942cffb175023078252a3f36e315c5d4ce0e39928a018252862becacef96a19f03bdcf46d75584299d1f8b03c0169e9e407d937145b5e5024139e7022a1978f114f24cdfa23780a119735c41da8fb759bbb3f025c6ec30e6c6e9bce8615be68e392fce59fd26a8e6a6cc5c606e3848116e4d01d29565a1facfb524b6d29643b826eee1e42869fc76df229dd79b39a2b1df28bb335c3a5f15a855d0121e4a6da34b5e4d5b7b5d5746a03ecff70811e1516fcec1bf7462e8876a2d21710aa168c78f45a6a15015950e221da85d3ec822ad6d0a6931b25a06b7bb5f3c10bb36cd4d647f9561982fde9818de5d4bf8db7f86c53b4ff14928ac15f79023b61861e73e44216540bb302153770da2533de9795252ab5fb77ad924c9338c8144c23d4c90dab9a18feac1a1574d4545e1435eb405e6c4c439fc724fce992ae85badf345bad16d85fbd338f04433703614754d0e7e54c4ccde2670587d52ecfb5a70a14a501bacc727722649931d8515b13d020a78e511fe136d45fbf97f9c7f689fcc677cfb3683723878350ffe9d08130cc6e567b6179e01b7eb2b3bbcf0873e1308eec018edeb8cce946338e15d5bf68c71916a83a99358039ef071e009546a2df936879dffbba397a93925d229a469fd17d71b7f524e03a30da6ee927542f8b369bed4734fe25dbd63d24ffd2a222f5f84f75d858ab989be925af570ad6d45bd28ce61b5139e1dd2f0b7795fe072e6e83acbb5e7b777a70c641e4cab2af40eed69abc334cd2703c3273204fac580c6a3d6680427e5f7d051e8380a53f93a180f4556ecea4530b9a2d5948dad63d415b6874f6b90e767d6d265be86351b53ba690780bb57c21b57418c5b97559e840c68257f839e7583a4bf7c7645c5987d40cc1ba79a218c35edfacdabe581d950e4bb7a481ebe64d61d00e75b1f25f1ce5f5462334a5b9038a697aa0937a3f8017e05d2c9c05dcb05c0b02508dea619b137f5444b6f088eb3cb2c66788f88afdfbba8faa1c490485624c88ae11e57347a676902e7553f056188493209bdbb30acc63c9e41e16a9d6c009416b520a76ba38f57628170c43626b5cb46179dc5bf65de865085f84bf741c223fbe474d2d19d8f43914fbd6586351089e73babf344f988b7963fe44528457d7aad3c564f6bcbd0d772a4c9fd328e6022d1c7c9f86726f8d5a23797d309c0f653ab1ac687833eb2700f156296062a8b377078f45f6b68c3d07cae1913ba8d5a6f9bf7525a3439eb932d4cefc4bf8e1b07b48ca13ece366cbc3e0388915915d1757475103a9e9454e7e6355de2d6acbf4710f9a63e4f6d3cd70c2d6fca88dd8a14448fdb63ce9350fdaafbe0b8bd1c5d307dae76dfed799aef2d8f23d5608d37d1330dd38b94860905dbeebf78d7b7318b7d42aed40d3f9899e9f420cbd92a6eeae3026f7725694e0e4bee016ba346fed2c21172bdb4a461cebe0cfe38e76645226ac127a259c193264d735ce8c8a57e17dd3f0579e2e86dc295ad1f45ba2d85db35044da61f7d401274b31eefbeb34e8d2ae596e9b4541aae117bdac5ed0b324c20539c27c07a411d5288b0b5f6fa16e9a7df85dc319fa6b71cd08a859c06a3f7b0289e1750adbf182f9750fea96fea5ab7aa3473340607cd7ed2c626f5382491c26d5d5bea61401dee7319c94d418f297e61ceac8f258ee8c23831bda081591f5a918e96855774ddedffc51e5b180f1971806d42fc333020b734aeb45adb0bc47325d0cea5f6713a786558022afc39d573892aa3635efbfd8bcb11c57f306c72146afe8b45388125cb7bf9ecf965a7ba4f768c77be366470dcdcf214b7f6a5a9460ed4fe44ae559d85e2fdc2094de83fff12ea8804db1215c4ca865871bdd7f8ef32ab799bf923ffb02c1ded7d129beadad46c5eda31ab1a6f43da05ea08bff7ffa88d8966353d01830558c39b930b01d175e437124d8edd0d2698fd8932f2b2c9b14746e52879c57a395538150f390264f00e60d470711202f4194499ff79037ca9885dc8d695f7d917a3086ca88e8f8d0243efee09302cf39e039eb7cc8dd19d28120d5fe533b5727cd39133181c729ca6f90a015ed30be7668d5cb5ecc33a53ee69bf7d1a5ecbdb153803743c6adaaabd36bf84e5be38d3f04a5d5dbfd67bdcd3b176e65bd1391ade775cc32ce43a847fb6c672a3fe97a5d4081c4986959ec5fb898f42a9397ba2b3ec2c1018f8d76d057f2366bd0e4465514ad6560c599664fb85621fe771e00f43d39b591b2a6a321100f4d1ef23a376d5ae3eeedbfe23da73dff0ee4d16b34ebddd8f5f053db9824105fc7300dbee7ea6af56b112319e3e215a0fc79ae946f6b5227453ec7fcaf17cf7651f71499a50d81221404d5f129ac50ea7528ff0e0069ec4ab8acb7919d81749ab37a870c5ef2cc5a15cf96709d3c65b4addc77e7416847160bcabb94ea36377e0ef71be80b5cc53effd5444888044a353574c72c924bba2a8b4e8354188ebfedc852 -MAC = 9fbbb7f7adcd0cd5b46a4a520b22499a - -# Length 2051. -Key = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f -Input = 248ac31085b6c2adaaa38259a0d7192c5c35d1bb4ef39ad94c38d1c82479e2dd2159a077024b0589bc8a20101b506f0a1ad0bbab76e83a83f1b94be6beae74e874cab692c5963a75436b776121ec9f62399a3e66b2d22707dae81933b6277f3c8516bcbe26dbbd86f373103d7cf4cad1888c952118fbfbd0d7b4bedc4ae4936aff91157e7aa47c54442ea78d6ac251d324a0fbe49d89cc3521b66d16e9c66a3709894e4eb0a4eedc4ae19468e66b81f271351b1d921ea551047abcc6b87a901fde7db79fa1818c11336dbc07244a40eb14cf77bde35e78ae9ad7d3f57ed7e7f23926c9172f82d77684ea5ed7d74ebc6f142b997036bcb7cce8df1bbc0d5b35a46509c954fc9469d214d6238f166cbf872156b4c41d7aac5942cffb175023078252a3f36e315c5d4ce0e39928a018252862becacef96a19f03bdcf46d75584299d1f8b03c0169e9e407d937145b5e5024139e7022a1978f114f24cdfa23780a119735c41da8fb759bbb3f025c6ec30e6c6e9bce8615be68e392fce59fd26a8e6a6cc5c606e3848116e4d01d29565a1facfb524b6d29643b826eee1e42869fc76df229dd79b39a2b1df28bb335c3a5f15a855d0121e4a6da34b5e4d5b7b5d5746a03ecff70811e1516fcec1bf7462e8876a2d21710aa168c78f45a6a15015950e221da85d3ec822ad6d0a6931b25a06b7bb5f3c10bb36cd4d647f9561982fde9818de5d4bf8db7f86c53b4ff14928ac15f79023b61861e73e44216540bb302153770da2533de9795252ab5fb77ad924c9338c8144c23d4c90dab9a18feac1a1574d4545e1435eb405e6c4c439fc724fce992ae85badf345bad16d85fbd338f04433703614754d0e7e54c4ccde2670587d52ecfb5a70a14a501bacc727722649931d8515b13d020a78e511fe136d45fbf97f9c7f689fcc677cfb3683723878350ffe9d08130cc6e567b6179e01b7eb2b3bbcf0873e1308eec018edeb8cce946338e15d5bf68c71916a83a99358039ef071e009546a2df936879dffbba397a93925d229a469fd17d71b7f524e03a30da6ee927542f8b369bed4734fe25dbd63d24ffd2a222f5f84f75d858ab989be925af570ad6d45bd28ce61b5139e1dd2f0b7795fe072e6e83acbb5e7b777a70c641e4cab2af40eed69abc334cd2703c3273204fac580c6a3d6680427e5f7d051e8380a53f93a180f4556ecea4530b9a2d5948dad63d415b6874f6b90e767d6d265be86351b53ba690780bb57c21b57418c5b97559e840c68257f839e7583a4bf7c7645c5987d40cc1ba79a218c35edfacdabe581d950e4bb7a481ebe64d61d00e75b1f25f1ce5f5462334a5b9038a697aa0937a3f8017e05d2c9c05dcb05c0b02508dea619b137f5444b6f088eb3cb2c66788f88afdfbba8faa1c490485624c88ae11e57347a676902e7553f056188493209bdbb30acc63c9e41e16a9d6c009416b520a76ba38f57628170c43626b5cb46179dc5bf65de865085f84bf741c223fbe474d2d19d8f43914fbd6586351089e73babf344f988b7963fe44528457d7aad3c564f6bcbd0d772a4c9fd328e6022d1c7c9f86726f8d5a23797d309c0f653ab1ac687833eb2700f156296062a8b377078f45f6b68c3d07cae1913ba8d5a6f9bf7525a3439eb932d4cefc4bf8e1b07b48ca13ece366cbc3e0388915915d1757475103a9e9454e7e6355de2d6acbf4710f9a63e4f6d3cd70c2d6fca88dd8a14448fdb63ce9350fdaafbe0b8bd1c5d307dae76dfed799aef2d8f23d5608d37d1330dd38b94860905dbeebf78d7b7318b7d42aed40d3f9899e9f420cbd92a6eeae3026f7725694e0e4bee016ba346fed2c21172bdb4a461cebe0cfe38e76645226ac127a259c193264d735ce8c8a57e17dd3f0579e2e86dc295ad1f45ba2d85db35044da61f7d401274b31eefbeb34e8d2ae596e9b4541aae117bdac5ed0b324c20539c27c07a411d5288b0b5f6fa16e9a7df85dc319fa6b71cd08a859c06a3f7b0289e1750adbf182f9750fea96fea5ab7aa3473340607cd7ed2c626f5382491c26d5d5bea61401dee7319c94d418f297e61ceac8f258ee8c23831bda081591f5a918e96855774ddedffc51e5b180f1971806d42fc333020b734aeb45adb0bc47325d0cea5f6713a786558022afc39d573892aa3635efbfd8bcb11c57f306c72146afe8b45388125cb7bf9ecf965a7ba4f768c77be366470dcdcf214b7f6a5a9460ed4fe44ae559d85e2fdc2094de83fff12ea8804db1215c4ca865871bdd7f8ef32ab799bf923ffb02c1ded7d129beadad46c5eda31ab1a6f43da05ea08bff7ffa88d8966353d01830558c39b930b01d175e437124d8edd0d2698fd8932f2b2c9b14746e52879c57a395538150f390264f00e60d470711202f4194499ff79037ca9885dc8d695f7d917a3086ca88e8f8d0243efee09302cf39e039eb7cc8dd19d28120d5fe533b5727cd39133181c729ca6f90a015ed30be7668d5cb5ecc33a53ee69bf7d1a5ecbdb153803743c6adaaabd36bf84e5be38d3f04a5d5dbfd67bdcd3b176e65bd1391ade775cc32ce43a847fb6c672a3fe97a5d4081c4986959ec5fb898f42a9397ba2b3ec2c1018f8d76d057f2366bd0e4465514ad6560c599664fb85621fe771e00f43d39b591b2a6a321100f4d1ef23a376d5ae3eeedbfe23da73dff0ee4d16b34ebddd8f5f053db9824105fc7300dbee7ea6af56b112319e3e215a0fc79ae946f6b5227453ec7fcaf17cf7651f71499a50d81221404d5f129ac50ea7528ff0e0069ec4ab8acb7919d81749ab37a870c5ef2cc5a15cf96709d3c65b4addc77e7416847160bcabb94ea36377e0ef71be80b5cc53effd5444888044a353574c72c924bba2a8b4e8354188ebfedc852f5 -MAC = eb7cdceb97ade2a07622f8f5a4b1ce15 - -# Length 2052. -Key = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f -Input = 248ac31085b6c2adaaa38259a0d7192c5c35d1bb4ef39ad94c38d1c82479e2dd2159a077024b0589bc8a20101b506f0a1ad0bbab76e83a83f1b94be6beae74e874cab692c5963a75436b776121ec9f62399a3e66b2d22707dae81933b6277f3c8516bcbe26dbbd86f373103d7cf4cad1888c952118fbfbd0d7b4bedc4ae4936aff91157e7aa47c54442ea78d6ac251d324a0fbe49d89cc3521b66d16e9c66a3709894e4eb0a4eedc4ae19468e66b81f271351b1d921ea551047abcc6b87a901fde7db79fa1818c11336dbc07244a40eb14cf77bde35e78ae9ad7d3f57ed7e7f23926c9172f82d77684ea5ed7d74ebc6f142b997036bcb7cce8df1bbc0d5b35a46509c954fc9469d214d6238f166cbf872156b4c41d7aac5942cffb175023078252a3f36e315c5d4ce0e39928a018252862becacef96a19f03bdcf46d75584299d1f8b03c0169e9e407d937145b5e5024139e7022a1978f114f24cdfa23780a119735c41da8fb759bbb3f025c6ec30e6c6e9bce8615be68e392fce59fd26a8e6a6cc5c606e3848116e4d01d29565a1facfb524b6d29643b826eee1e42869fc76df229dd79b39a2b1df28bb335c3a5f15a855d0121e4a6da34b5e4d5b7b5d5746a03ecff70811e1516fcec1bf7462e8876a2d21710aa168c78f45a6a15015950e221da85d3ec822ad6d0a6931b25a06b7bb5f3c10bb36cd4d647f9561982fde9818de5d4bf8db7f86c53b4ff14928ac15f79023b61861e73e44216540bb302153770da2533de9795252ab5fb77ad924c9338c8144c23d4c90dab9a18feac1a1574d4545e1435eb405e6c4c439fc724fce992ae85badf345bad16d85fbd338f04433703614754d0e7e54c4ccde2670587d52ecfb5a70a14a501bacc727722649931d8515b13d020a78e511fe136d45fbf97f9c7f689fcc677cfb3683723878350ffe9d08130cc6e567b6179e01b7eb2b3bbcf0873e1308eec018edeb8cce946338e15d5bf68c71916a83a99358039ef071e009546a2df936879dffbba397a93925d229a469fd17d71b7f524e03a30da6ee927542f8b369bed4734fe25dbd63d24ffd2a222f5f84f75d858ab989be925af570ad6d45bd28ce61b5139e1dd2f0b7795fe072e6e83acbb5e7b777a70c641e4cab2af40eed69abc334cd2703c3273204fac580c6a3d6680427e5f7d051e8380a53f93a180f4556ecea4530b9a2d5948dad63d415b6874f6b90e767d6d265be86351b53ba690780bb57c21b57418c5b97559e840c68257f839e7583a4bf7c7645c5987d40cc1ba79a218c35edfacdabe581d950e4bb7a481ebe64d61d00e75b1f25f1ce5f5462334a5b9038a697aa0937a3f8017e05d2c9c05dcb05c0b02508dea619b137f5444b6f088eb3cb2c66788f88afdfbba8faa1c490485624c88ae11e57347a676902e7553f056188493209bdbb30acc63c9e41e16a9d6c009416b520a76ba38f57628170c43626b5cb46179dc5bf65de865085f84bf741c223fbe474d2d19d8f43914fbd6586351089e73babf344f988b7963fe44528457d7aad3c564f6bcbd0d772a4c9fd328e6022d1c7c9f86726f8d5a23797d309c0f653ab1ac687833eb2700f156296062a8b377078f45f6b68c3d07cae1913ba8d5a6f9bf7525a3439eb932d4cefc4bf8e1b07b48ca13ece366cbc3e0388915915d1757475103a9e9454e7e6355de2d6acbf4710f9a63e4f6d3cd70c2d6fca88dd8a14448fdb63ce9350fdaafbe0b8bd1c5d307dae76dfed799aef2d8f23d5608d37d1330dd38b94860905dbeebf78d7b7318b7d42aed40d3f9899e9f420cbd92a6eeae3026f7725694e0e4bee016ba346fed2c21172bdb4a461cebe0cfe38e76645226ac127a259c193264d735ce8c8a57e17dd3f0579e2e86dc295ad1f45ba2d85db35044da61f7d401274b31eefbeb34e8d2ae596e9b4541aae117bdac5ed0b324c20539c27c07a411d5288b0b5f6fa16e9a7df85dc319fa6b71cd08a859c06a3f7b0289e1750adbf182f9750fea96fea5ab7aa3473340607cd7ed2c626f5382491c26d5d5bea61401dee7319c94d418f297e61ceac8f258ee8c23831bda081591f5a918e96855774ddedffc51e5b180f1971806d42fc333020b734aeb45adb0bc47325d0cea5f6713a786558022afc39d573892aa3635efbfd8bcb11c57f306c72146afe8b45388125cb7bf9ecf965a7ba4f768c77be366470dcdcf214b7f6a5a9460ed4fe44ae559d85e2fdc2094de83fff12ea8804db1215c4ca865871bdd7f8ef32ab799bf923ffb02c1ded7d129beadad46c5eda31ab1a6f43da05ea08bff7ffa88d8966353d01830558c39b930b01d175e437124d8edd0d2698fd8932f2b2c9b14746e52879c57a395538150f390264f00e60d470711202f4194499ff79037ca9885dc8d695f7d917a3086ca88e8f8d0243efee09302cf39e039eb7cc8dd19d28120d5fe533b5727cd39133181c729ca6f90a015ed30be7668d5cb5ecc33a53ee69bf7d1a5ecbdb153803743c6adaaabd36bf84e5be38d3f04a5d5dbfd67bdcd3b176e65bd1391ade775cc32ce43a847fb6c672a3fe97a5d4081c4986959ec5fb898f42a9397ba2b3ec2c1018f8d76d057f2366bd0e4465514ad6560c599664fb85621fe771e00f43d39b591b2a6a321100f4d1ef23a376d5ae3eeedbfe23da73dff0ee4d16b34ebddd8f5f053db9824105fc7300dbee7ea6af56b112319e3e215a0fc79ae946f6b5227453ec7fcaf17cf7651f71499a50d81221404d5f129ac50ea7528ff0e0069ec4ab8acb7919d81749ab37a870c5ef2cc5a15cf96709d3c65b4addc77e7416847160bcabb94ea36377e0ef71be80b5cc53effd5444888044a353574c72c924bba2a8b4e8354188ebfedc852f590 -MAC = d41c310927cd92e14784ea78b85503db - -# Length 2053. -Key = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f -Input = 248ac31085b6c2adaaa38259a0d7192c5c35d1bb4ef39ad94c38d1c82479e2dd2159a077024b0589bc8a20101b506f0a1ad0bbab76e83a83f1b94be6beae74e874cab692c5963a75436b776121ec9f62399a3e66b2d22707dae81933b6277f3c8516bcbe26dbbd86f373103d7cf4cad1888c952118fbfbd0d7b4bedc4ae4936aff91157e7aa47c54442ea78d6ac251d324a0fbe49d89cc3521b66d16e9c66a3709894e4eb0a4eedc4ae19468e66b81f271351b1d921ea551047abcc6b87a901fde7db79fa1818c11336dbc07244a40eb14cf77bde35e78ae9ad7d3f57ed7e7f23926c9172f82d77684ea5ed7d74ebc6f142b997036bcb7cce8df1bbc0d5b35a46509c954fc9469d214d6238f166cbf872156b4c41d7aac5942cffb175023078252a3f36e315c5d4ce0e39928a018252862becacef96a19f03bdcf46d75584299d1f8b03c0169e9e407d937145b5e5024139e7022a1978f114f24cdfa23780a119735c41da8fb759bbb3f025c6ec30e6c6e9bce8615be68e392fce59fd26a8e6a6cc5c606e3848116e4d01d29565a1facfb524b6d29643b826eee1e42869fc76df229dd79b39a2b1df28bb335c3a5f15a855d0121e4a6da34b5e4d5b7b5d5746a03ecff70811e1516fcec1bf7462e8876a2d21710aa168c78f45a6a15015950e221da85d3ec822ad6d0a6931b25a06b7bb5f3c10bb36cd4d647f9561982fde9818de5d4bf8db7f86c53b4ff14928ac15f79023b61861e73e44216540bb302153770da2533de9795252ab5fb77ad924c9338c8144c23d4c90dab9a18feac1a1574d4545e1435eb405e6c4c439fc724fce992ae85badf345bad16d85fbd338f04433703614754d0e7e54c4ccde2670587d52ecfb5a70a14a501bacc727722649931d8515b13d020a78e511fe136d45fbf97f9c7f689fcc677cfb3683723878350ffe9d08130cc6e567b6179e01b7eb2b3bbcf0873e1308eec018edeb8cce946338e15d5bf68c71916a83a99358039ef071e009546a2df936879dffbba397a93925d229a469fd17d71b7f524e03a30da6ee927542f8b369bed4734fe25dbd63d24ffd2a222f5f84f75d858ab989be925af570ad6d45bd28ce61b5139e1dd2f0b7795fe072e6e83acbb5e7b777a70c641e4cab2af40eed69abc334cd2703c3273204fac580c6a3d6680427e5f7d051e8380a53f93a180f4556ecea4530b9a2d5948dad63d415b6874f6b90e767d6d265be86351b53ba690780bb57c21b57418c5b97559e840c68257f839e7583a4bf7c7645c5987d40cc1ba79a218c35edfacdabe581d950e4bb7a481ebe64d61d00e75b1f25f1ce5f5462334a5b9038a697aa0937a3f8017e05d2c9c05dcb05c0b02508dea619b137f5444b6f088eb3cb2c66788f88afdfbba8faa1c490485624c88ae11e57347a676902e7553f056188493209bdbb30acc63c9e41e16a9d6c009416b520a76ba38f57628170c43626b5cb46179dc5bf65de865085f84bf741c223fbe474d2d19d8f43914fbd6586351089e73babf344f988b7963fe44528457d7aad3c564f6bcbd0d772a4c9fd328e6022d1c7c9f86726f8d5a23797d309c0f653ab1ac687833eb2700f156296062a8b377078f45f6b68c3d07cae1913ba8d5a6f9bf7525a3439eb932d4cefc4bf8e1b07b48ca13ece366cbc3e0388915915d1757475103a9e9454e7e6355de2d6acbf4710f9a63e4f6d3cd70c2d6fca88dd8a14448fdb63ce9350fdaafbe0b8bd1c5d307dae76dfed799aef2d8f23d5608d37d1330dd38b94860905dbeebf78d7b7318b7d42aed40d3f9899e9f420cbd92a6eeae3026f7725694e0e4bee016ba346fed2c21172bdb4a461cebe0cfe38e76645226ac127a259c193264d735ce8c8a57e17dd3f0579e2e86dc295ad1f45ba2d85db35044da61f7d401274b31eefbeb34e8d2ae596e9b4541aae117bdac5ed0b324c20539c27c07a411d5288b0b5f6fa16e9a7df85dc319fa6b71cd08a859c06a3f7b0289e1750adbf182f9750fea96fea5ab7aa3473340607cd7ed2c626f5382491c26d5d5bea61401dee7319c94d418f297e61ceac8f258ee8c23831bda081591f5a918e96855774ddedffc51e5b180f1971806d42fc333020b734aeb45adb0bc47325d0cea5f6713a786558022afc39d573892aa3635efbfd8bcb11c57f306c72146afe8b45388125cb7bf9ecf965a7ba4f768c77be366470dcdcf214b7f6a5a9460ed4fe44ae559d85e2fdc2094de83fff12ea8804db1215c4ca865871bdd7f8ef32ab799bf923ffb02c1ded7d129beadad46c5eda31ab1a6f43da05ea08bff7ffa88d8966353d01830558c39b930b01d175e437124d8edd0d2698fd8932f2b2c9b14746e52879c57a395538150f390264f00e60d470711202f4194499ff79037ca9885dc8d695f7d917a3086ca88e8f8d0243efee09302cf39e039eb7cc8dd19d28120d5fe533b5727cd39133181c729ca6f90a015ed30be7668d5cb5ecc33a53ee69bf7d1a5ecbdb153803743c6adaaabd36bf84e5be38d3f04a5d5dbfd67bdcd3b176e65bd1391ade775cc32ce43a847fb6c672a3fe97a5d4081c4986959ec5fb898f42a9397ba2b3ec2c1018f8d76d057f2366bd0e4465514ad6560c599664fb85621fe771e00f43d39b591b2a6a321100f4d1ef23a376d5ae3eeedbfe23da73dff0ee4d16b34ebddd8f5f053db9824105fc7300dbee7ea6af56b112319e3e215a0fc79ae946f6b5227453ec7fcaf17cf7651f71499a50d81221404d5f129ac50ea7528ff0e0069ec4ab8acb7919d81749ab37a870c5ef2cc5a15cf96709d3c65b4addc77e7416847160bcabb94ea36377e0ef71be80b5cc53effd5444888044a353574c72c924bba2a8b4e8354188ebfedc852f59073 -MAC = 16af133c423f783a14c49d9f526384cf - -# Length 2054. -Key = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f -Input = 248ac31085b6c2adaaa38259a0d7192c5c35d1bb4ef39ad94c38d1c82479e2dd2159a077024b0589bc8a20101b506f0a1ad0bbab76e83a83f1b94be6beae74e874cab692c5963a75436b776121ec9f62399a3e66b2d22707dae81933b6277f3c8516bcbe26dbbd86f373103d7cf4cad1888c952118fbfbd0d7b4bedc4ae4936aff91157e7aa47c54442ea78d6ac251d324a0fbe49d89cc3521b66d16e9c66a3709894e4eb0a4eedc4ae19468e66b81f271351b1d921ea551047abcc6b87a901fde7db79fa1818c11336dbc07244a40eb14cf77bde35e78ae9ad7d3f57ed7e7f23926c9172f82d77684ea5ed7d74ebc6f142b997036bcb7cce8df1bbc0d5b35a46509c954fc9469d214d6238f166cbf872156b4c41d7aac5942cffb175023078252a3f36e315c5d4ce0e39928a018252862becacef96a19f03bdcf46d75584299d1f8b03c0169e9e407d937145b5e5024139e7022a1978f114f24cdfa23780a119735c41da8fb759bbb3f025c6ec30e6c6e9bce8615be68e392fce59fd26a8e6a6cc5c606e3848116e4d01d29565a1facfb524b6d29643b826eee1e42869fc76df229dd79b39a2b1df28bb335c3a5f15a855d0121e4a6da34b5e4d5b7b5d5746a03ecff70811e1516fcec1bf7462e8876a2d21710aa168c78f45a6a15015950e221da85d3ec822ad6d0a6931b25a06b7bb5f3c10bb36cd4d647f9561982fde9818de5d4bf8db7f86c53b4ff14928ac15f79023b61861e73e44216540bb302153770da2533de9795252ab5fb77ad924c9338c8144c23d4c90dab9a18feac1a1574d4545e1435eb405e6c4c439fc724fce992ae85badf345bad16d85fbd338f04433703614754d0e7e54c4ccde2670587d52ecfb5a70a14a501bacc727722649931d8515b13d020a78e511fe136d45fbf97f9c7f689fcc677cfb3683723878350ffe9d08130cc6e567b6179e01b7eb2b3bbcf0873e1308eec018edeb8cce946338e15d5bf68c71916a83a99358039ef071e009546a2df936879dffbba397a93925d229a469fd17d71b7f524e03a30da6ee927542f8b369bed4734fe25dbd63d24ffd2a222f5f84f75d858ab989be925af570ad6d45bd28ce61b5139e1dd2f0b7795fe072e6e83acbb5e7b777a70c641e4cab2af40eed69abc334cd2703c3273204fac580c6a3d6680427e5f7d051e8380a53f93a180f4556ecea4530b9a2d5948dad63d415b6874f6b90e767d6d265be86351b53ba690780bb57c21b57418c5b97559e840c68257f839e7583a4bf7c7645c5987d40cc1ba79a218c35edfacdabe581d950e4bb7a481ebe64d61d00e75b1f25f1ce5f5462334a5b9038a697aa0937a3f8017e05d2c9c05dcb05c0b02508dea619b137f5444b6f088eb3cb2c66788f88afdfbba8faa1c490485624c88ae11e57347a676902e7553f056188493209bdbb30acc63c9e41e16a9d6c009416b520a76ba38f57628170c43626b5cb46179dc5bf65de865085f84bf741c223fbe474d2d19d8f43914fbd6586351089e73babf344f988b7963fe44528457d7aad3c564f6bcbd0d772a4c9fd328e6022d1c7c9f86726f8d5a23797d309c0f653ab1ac687833eb2700f156296062a8b377078f45f6b68c3d07cae1913ba8d5a6f9bf7525a3439eb932d4cefc4bf8e1b07b48ca13ece366cbc3e0388915915d1757475103a9e9454e7e6355de2d6acbf4710f9a63e4f6d3cd70c2d6fca88dd8a14448fdb63ce9350fdaafbe0b8bd1c5d307dae76dfed799aef2d8f23d5608d37d1330dd38b94860905dbeebf78d7b7318b7d42aed40d3f9899e9f420cbd92a6eeae3026f7725694e0e4bee016ba346fed2c21172bdb4a461cebe0cfe38e76645226ac127a259c193264d735ce8c8a57e17dd3f0579e2e86dc295ad1f45ba2d85db35044da61f7d401274b31eefbeb34e8d2ae596e9b4541aae117bdac5ed0b324c20539c27c07a411d5288b0b5f6fa16e9a7df85dc319fa6b71cd08a859c06a3f7b0289e1750adbf182f9750fea96fea5ab7aa3473340607cd7ed2c626f5382491c26d5d5bea61401dee7319c94d418f297e61ceac8f258ee8c23831bda081591f5a918e96855774ddedffc51e5b180f1971806d42fc333020b734aeb45adb0bc47325d0cea5f6713a786558022afc39d573892aa3635efbfd8bcb11c57f306c72146afe8b45388125cb7bf9ecf965a7ba4f768c77be366470dcdcf214b7f6a5a9460ed4fe44ae559d85e2fdc2094de83fff12ea8804db1215c4ca865871bdd7f8ef32ab799bf923ffb02c1ded7d129beadad46c5eda31ab1a6f43da05ea08bff7ffa88d8966353d01830558c39b930b01d175e437124d8edd0d2698fd8932f2b2c9b14746e52879c57a395538150f390264f00e60d470711202f4194499ff79037ca9885dc8d695f7d917a3086ca88e8f8d0243efee09302cf39e039eb7cc8dd19d28120d5fe533b5727cd39133181c729ca6f90a015ed30be7668d5cb5ecc33a53ee69bf7d1a5ecbdb153803743c6adaaabd36bf84e5be38d3f04a5d5dbfd67bdcd3b176e65bd1391ade775cc32ce43a847fb6c672a3fe97a5d4081c4986959ec5fb898f42a9397ba2b3ec2c1018f8d76d057f2366bd0e4465514ad6560c599664fb85621fe771e00f43d39b591b2a6a321100f4d1ef23a376d5ae3eeedbfe23da73dff0ee4d16b34ebddd8f5f053db9824105fc7300dbee7ea6af56b112319e3e215a0fc79ae946f6b5227453ec7fcaf17cf7651f71499a50d81221404d5f129ac50ea7528ff0e0069ec4ab8acb7919d81749ab37a870c5ef2cc5a15cf96709d3c65b4addc77e7416847160bcabb94ea36377e0ef71be80b5cc53effd5444888044a353574c72c924bba2a8b4e8354188ebfedc852f59073f4 -MAC = 00c75db8f0636b22f195645b03091f5f - -# Length 2055. -Key = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f -Input = 248ac31085b6c2adaaa38259a0d7192c5c35d1bb4ef39ad94c38d1c82479e2dd2159a077024b0589bc8a20101b506f0a1ad0bbab76e83a83f1b94be6beae74e874cab692c5963a75436b776121ec9f62399a3e66b2d22707dae81933b6277f3c8516bcbe26dbbd86f373103d7cf4cad1888c952118fbfbd0d7b4bedc4ae4936aff91157e7aa47c54442ea78d6ac251d324a0fbe49d89cc3521b66d16e9c66a3709894e4eb0a4eedc4ae19468e66b81f271351b1d921ea551047abcc6b87a901fde7db79fa1818c11336dbc07244a40eb14cf77bde35e78ae9ad7d3f57ed7e7f23926c9172f82d77684ea5ed7d74ebc6f142b997036bcb7cce8df1bbc0d5b35a46509c954fc9469d214d6238f166cbf872156b4c41d7aac5942cffb175023078252a3f36e315c5d4ce0e39928a018252862becacef96a19f03bdcf46d75584299d1f8b03c0169e9e407d937145b5e5024139e7022a1978f114f24cdfa23780a119735c41da8fb759bbb3f025c6ec30e6c6e9bce8615be68e392fce59fd26a8e6a6cc5c606e3848116e4d01d29565a1facfb524b6d29643b826eee1e42869fc76df229dd79b39a2b1df28bb335c3a5f15a855d0121e4a6da34b5e4d5b7b5d5746a03ecff70811e1516fcec1bf7462e8876a2d21710aa168c78f45a6a15015950e221da85d3ec822ad6d0a6931b25a06b7bb5f3c10bb36cd4d647f9561982fde9818de5d4bf8db7f86c53b4ff14928ac15f79023b61861e73e44216540bb302153770da2533de9795252ab5fb77ad924c9338c8144c23d4c90dab9a18feac1a1574d4545e1435eb405e6c4c439fc724fce992ae85badf345bad16d85fbd338f04433703614754d0e7e54c4ccde2670587d52ecfb5a70a14a501bacc727722649931d8515b13d020a78e511fe136d45fbf97f9c7f689fcc677cfb3683723878350ffe9d08130cc6e567b6179e01b7eb2b3bbcf0873e1308eec018edeb8cce946338e15d5bf68c71916a83a99358039ef071e009546a2df936879dffbba397a93925d229a469fd17d71b7f524e03a30da6ee927542f8b369bed4734fe25dbd63d24ffd2a222f5f84f75d858ab989be925af570ad6d45bd28ce61b5139e1dd2f0b7795fe072e6e83acbb5e7b777a70c641e4cab2af40eed69abc334cd2703c3273204fac580c6a3d6680427e5f7d051e8380a53f93a180f4556ecea4530b9a2d5948dad63d415b6874f6b90e767d6d265be86351b53ba690780bb57c21b57418c5b97559e840c68257f839e7583a4bf7c7645c5987d40cc1ba79a218c35edfacdabe581d950e4bb7a481ebe64d61d00e75b1f25f1ce5f5462334a5b9038a697aa0937a3f8017e05d2c9c05dcb05c0b02508dea619b137f5444b6f088eb3cb2c66788f88afdfbba8faa1c490485624c88ae11e57347a676902e7553f056188493209bdbb30acc63c9e41e16a9d6c009416b520a76ba38f57628170c43626b5cb46179dc5bf65de865085f84bf741c223fbe474d2d19d8f43914fbd6586351089e73babf344f988b7963fe44528457d7aad3c564f6bcbd0d772a4c9fd328e6022d1c7c9f86726f8d5a23797d309c0f653ab1ac687833eb2700f156296062a8b377078f45f6b68c3d07cae1913ba8d5a6f9bf7525a3439eb932d4cefc4bf8e1b07b48ca13ece366cbc3e0388915915d1757475103a9e9454e7e6355de2d6acbf4710f9a63e4f6d3cd70c2d6fca88dd8a14448fdb63ce9350fdaafbe0b8bd1c5d307dae76dfed799aef2d8f23d5608d37d1330dd38b94860905dbeebf78d7b7318b7d42aed40d3f9899e9f420cbd92a6eeae3026f7725694e0e4bee016ba346fed2c21172bdb4a461cebe0cfe38e76645226ac127a259c193264d735ce8c8a57e17dd3f0579e2e86dc295ad1f45ba2d85db35044da61f7d401274b31eefbeb34e8d2ae596e9b4541aae117bdac5ed0b324c20539c27c07a411d5288b0b5f6fa16e9a7df85dc319fa6b71cd08a859c06a3f7b0289e1750adbf182f9750fea96fea5ab7aa3473340607cd7ed2c626f5382491c26d5d5bea61401dee7319c94d418f297e61ceac8f258ee8c23831bda081591f5a918e96855774ddedffc51e5b180f1971806d42fc333020b734aeb45adb0bc47325d0cea5f6713a786558022afc39d573892aa3635efbfd8bcb11c57f306c72146afe8b45388125cb7bf9ecf965a7ba4f768c77be366470dcdcf214b7f6a5a9460ed4fe44ae559d85e2fdc2094de83fff12ea8804db1215c4ca865871bdd7f8ef32ab799bf923ffb02c1ded7d129beadad46c5eda31ab1a6f43da05ea08bff7ffa88d8966353d01830558c39b930b01d175e437124d8edd0d2698fd8932f2b2c9b14746e52879c57a395538150f390264f00e60d470711202f4194499ff79037ca9885dc8d695f7d917a3086ca88e8f8d0243efee09302cf39e039eb7cc8dd19d28120d5fe533b5727cd39133181c729ca6f90a015ed30be7668d5cb5ecc33a53ee69bf7d1a5ecbdb153803743c6adaaabd36bf84e5be38d3f04a5d5dbfd67bdcd3b176e65bd1391ade775cc32ce43a847fb6c672a3fe97a5d4081c4986959ec5fb898f42a9397ba2b3ec2c1018f8d76d057f2366bd0e4465514ad6560c599664fb85621fe771e00f43d39b591b2a6a321100f4d1ef23a376d5ae3eeedbfe23da73dff0ee4d16b34ebddd8f5f053db9824105fc7300dbee7ea6af56b112319e3e215a0fc79ae946f6b5227453ec7fcaf17cf7651f71499a50d81221404d5f129ac50ea7528ff0e0069ec4ab8acb7919d81749ab37a870c5ef2cc5a15cf96709d3c65b4addc77e7416847160bcabb94ea36377e0ef71be80b5cc53effd5444888044a353574c72c924bba2a8b4e8354188ebfedc852f59073f434 -MAC = 4a532bc740f581555831345f3b75bf33 - -# Length 2056. -Key = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f -Input = 248ac31085b6c2adaaa38259a0d7192c5c35d1bb4ef39ad94c38d1c82479e2dd2159a077024b0589bc8a20101b506f0a1ad0bbab76e83a83f1b94be6beae74e874cab692c5963a75436b776121ec9f62399a3e66b2d22707dae81933b6277f3c8516bcbe26dbbd86f373103d7cf4cad1888c952118fbfbd0d7b4bedc4ae4936aff91157e7aa47c54442ea78d6ac251d324a0fbe49d89cc3521b66d16e9c66a3709894e4eb0a4eedc4ae19468e66b81f271351b1d921ea551047abcc6b87a901fde7db79fa1818c11336dbc07244a40eb14cf77bde35e78ae9ad7d3f57ed7e7f23926c9172f82d77684ea5ed7d74ebc6f142b997036bcb7cce8df1bbc0d5b35a46509c954fc9469d214d6238f166cbf872156b4c41d7aac5942cffb175023078252a3f36e315c5d4ce0e39928a018252862becacef96a19f03bdcf46d75584299d1f8b03c0169e9e407d937145b5e5024139e7022a1978f114f24cdfa23780a119735c41da8fb759bbb3f025c6ec30e6c6e9bce8615be68e392fce59fd26a8e6a6cc5c606e3848116e4d01d29565a1facfb524b6d29643b826eee1e42869fc76df229dd79b39a2b1df28bb335c3a5f15a855d0121e4a6da34b5e4d5b7b5d5746a03ecff70811e1516fcec1bf7462e8876a2d21710aa168c78f45a6a15015950e221da85d3ec822ad6d0a6931b25a06b7bb5f3c10bb36cd4d647f9561982fde9818de5d4bf8db7f86c53b4ff14928ac15f79023b61861e73e44216540bb302153770da2533de9795252ab5fb77ad924c9338c8144c23d4c90dab9a18feac1a1574d4545e1435eb405e6c4c439fc724fce992ae85badf345bad16d85fbd338f04433703614754d0e7e54c4ccde2670587d52ecfb5a70a14a501bacc727722649931d8515b13d020a78e511fe136d45fbf97f9c7f689fcc677cfb3683723878350ffe9d08130cc6e567b6179e01b7eb2b3bbcf0873e1308eec018edeb8cce946338e15d5bf68c71916a83a99358039ef071e009546a2df936879dffbba397a93925d229a469fd17d71b7f524e03a30da6ee927542f8b369bed4734fe25dbd63d24ffd2a222f5f84f75d858ab989be925af570ad6d45bd28ce61b5139e1dd2f0b7795fe072e6e83acbb5e7b777a70c641e4cab2af40eed69abc334cd2703c3273204fac580c6a3d6680427e5f7d051e8380a53f93a180f4556ecea4530b9a2d5948dad63d415b6874f6b90e767d6d265be86351b53ba690780bb57c21b57418c5b97559e840c68257f839e7583a4bf7c7645c5987d40cc1ba79a218c35edfacdabe581d950e4bb7a481ebe64d61d00e75b1f25f1ce5f5462334a5b9038a697aa0937a3f8017e05d2c9c05dcb05c0b02508dea619b137f5444b6f088eb3cb2c66788f88afdfbba8faa1c490485624c88ae11e57347a676902e7553f056188493209bdbb30acc63c9e41e16a9d6c009416b520a76ba38f57628170c43626b5cb46179dc5bf65de865085f84bf741c223fbe474d2d19d8f43914fbd6586351089e73babf344f988b7963fe44528457d7aad3c564f6bcbd0d772a4c9fd328e6022d1c7c9f86726f8d5a23797d309c0f653ab1ac687833eb2700f156296062a8b377078f45f6b68c3d07cae1913ba8d5a6f9bf7525a3439eb932d4cefc4bf8e1b07b48ca13ece366cbc3e0388915915d1757475103a9e9454e7e6355de2d6acbf4710f9a63e4f6d3cd70c2d6fca88dd8a14448fdb63ce9350fdaafbe0b8bd1c5d307dae76dfed799aef2d8f23d5608d37d1330dd38b94860905dbeebf78d7b7318b7d42aed40d3f9899e9f420cbd92a6eeae3026f7725694e0e4bee016ba346fed2c21172bdb4a461cebe0cfe38e76645226ac127a259c193264d735ce8c8a57e17dd3f0579e2e86dc295ad1f45ba2d85db35044da61f7d401274b31eefbeb34e8d2ae596e9b4541aae117bdac5ed0b324c20539c27c07a411d5288b0b5f6fa16e9a7df85dc319fa6b71cd08a859c06a3f7b0289e1750adbf182f9750fea96fea5ab7aa3473340607cd7ed2c626f5382491c26d5d5bea61401dee7319c94d418f297e61ceac8f258ee8c23831bda081591f5a918e96855774ddedffc51e5b180f1971806d42fc333020b734aeb45adb0bc47325d0cea5f6713a786558022afc39d573892aa3635efbfd8bcb11c57f306c72146afe8b45388125cb7bf9ecf965a7ba4f768c77be366470dcdcf214b7f6a5a9460ed4fe44ae559d85e2fdc2094de83fff12ea8804db1215c4ca865871bdd7f8ef32ab799bf923ffb02c1ded7d129beadad46c5eda31ab1a6f43da05ea08bff7ffa88d8966353d01830558c39b930b01d175e437124d8edd0d2698fd8932f2b2c9b14746e52879c57a395538150f390264f00e60d470711202f4194499ff79037ca9885dc8d695f7d917a3086ca88e8f8d0243efee09302cf39e039eb7cc8dd19d28120d5fe533b5727cd39133181c729ca6f90a015ed30be7668d5cb5ecc33a53ee69bf7d1a5ecbdb153803743c6adaaabd36bf84e5be38d3f04a5d5dbfd67bdcd3b176e65bd1391ade775cc32ce43a847fb6c672a3fe97a5d4081c4986959ec5fb898f42a9397ba2b3ec2c1018f8d76d057f2366bd0e4465514ad6560c599664fb85621fe771e00f43d39b591b2a6a321100f4d1ef23a376d5ae3eeedbfe23da73dff0ee4d16b34ebddd8f5f053db9824105fc7300dbee7ea6af56b112319e3e215a0fc79ae946f6b5227453ec7fcaf17cf7651f71499a50d81221404d5f129ac50ea7528ff0e0069ec4ab8acb7919d81749ab37a870c5ef2cc5a15cf96709d3c65b4addc77e7416847160bcabb94ea36377e0ef71be80b5cc53effd5444888044a353574c72c924bba2a8b4e8354188ebfedc852f59073f4347a -MAC = 698c7d32c5923871d124a2479e521706 - -# Length 2057. -Key = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f -Input = 248ac31085b6c2adaaa38259a0d7192c5c35d1bb4ef39ad94c38d1c82479e2dd2159a077024b0589bc8a20101b506f0a1ad0bbab76e83a83f1b94be6beae74e874cab692c5963a75436b776121ec9f62399a3e66b2d22707dae81933b6277f3c8516bcbe26dbbd86f373103d7cf4cad1888c952118fbfbd0d7b4bedc4ae4936aff91157e7aa47c54442ea78d6ac251d324a0fbe49d89cc3521b66d16e9c66a3709894e4eb0a4eedc4ae19468e66b81f271351b1d921ea551047abcc6b87a901fde7db79fa1818c11336dbc07244a40eb14cf77bde35e78ae9ad7d3f57ed7e7f23926c9172f82d77684ea5ed7d74ebc6f142b997036bcb7cce8df1bbc0d5b35a46509c954fc9469d214d6238f166cbf872156b4c41d7aac5942cffb175023078252a3f36e315c5d4ce0e39928a018252862becacef96a19f03bdcf46d75584299d1f8b03c0169e9e407d937145b5e5024139e7022a1978f114f24cdfa23780a119735c41da8fb759bbb3f025c6ec30e6c6e9bce8615be68e392fce59fd26a8e6a6cc5c606e3848116e4d01d29565a1facfb524b6d29643b826eee1e42869fc76df229dd79b39a2b1df28bb335c3a5f15a855d0121e4a6da34b5e4d5b7b5d5746a03ecff70811e1516fcec1bf7462e8876a2d21710aa168c78f45a6a15015950e221da85d3ec822ad6d0a6931b25a06b7bb5f3c10bb36cd4d647f9561982fde9818de5d4bf8db7f86c53b4ff14928ac15f79023b61861e73e44216540bb302153770da2533de9795252ab5fb77ad924c9338c8144c23d4c90dab9a18feac1a1574d4545e1435eb405e6c4c439fc724fce992ae85badf345bad16d85fbd338f04433703614754d0e7e54c4ccde2670587d52ecfb5a70a14a501bacc727722649931d8515b13d020a78e511fe136d45fbf97f9c7f689fcc677cfb3683723878350ffe9d08130cc6e567b6179e01b7eb2b3bbcf0873e1308eec018edeb8cce946338e15d5bf68c71916a83a99358039ef071e009546a2df936879dffbba397a93925d229a469fd17d71b7f524e03a30da6ee927542f8b369bed4734fe25dbd63d24ffd2a222f5f84f75d858ab989be925af570ad6d45bd28ce61b5139e1dd2f0b7795fe072e6e83acbb5e7b777a70c641e4cab2af40eed69abc334cd2703c3273204fac580c6a3d6680427e5f7d051e8380a53f93a180f4556ecea4530b9a2d5948dad63d415b6874f6b90e767d6d265be86351b53ba690780bb57c21b57418c5b97559e840c68257f839e7583a4bf7c7645c5987d40cc1ba79a218c35edfacdabe581d950e4bb7a481ebe64d61d00e75b1f25f1ce5f5462334a5b9038a697aa0937a3f8017e05d2c9c05dcb05c0b02508dea619b137f5444b6f088eb3cb2c66788f88afdfbba8faa1c490485624c88ae11e57347a676902e7553f056188493209bdbb30acc63c9e41e16a9d6c009416b520a76ba38f57628170c43626b5cb46179dc5bf65de865085f84bf741c223fbe474d2d19d8f43914fbd6586351089e73babf344f988b7963fe44528457d7aad3c564f6bcbd0d772a4c9fd328e6022d1c7c9f86726f8d5a23797d309c0f653ab1ac687833eb2700f156296062a8b377078f45f6b68c3d07cae1913ba8d5a6f9bf7525a3439eb932d4cefc4bf8e1b07b48ca13ece366cbc3e0388915915d1757475103a9e9454e7e6355de2d6acbf4710f9a63e4f6d3cd70c2d6fca88dd8a14448fdb63ce9350fdaafbe0b8bd1c5d307dae76dfed799aef2d8f23d5608d37d1330dd38b94860905dbeebf78d7b7318b7d42aed40d3f9899e9f420cbd92a6eeae3026f7725694e0e4bee016ba346fed2c21172bdb4a461cebe0cfe38e76645226ac127a259c193264d735ce8c8a57e17dd3f0579e2e86dc295ad1f45ba2d85db35044da61f7d401274b31eefbeb34e8d2ae596e9b4541aae117bdac5ed0b324c20539c27c07a411d5288b0b5f6fa16e9a7df85dc319fa6b71cd08a859c06a3f7b0289e1750adbf182f9750fea96fea5ab7aa3473340607cd7ed2c626f5382491c26d5d5bea61401dee7319c94d418f297e61ceac8f258ee8c23831bda081591f5a918e96855774ddedffc51e5b180f1971806d42fc333020b734aeb45adb0bc47325d0cea5f6713a786558022afc39d573892aa3635efbfd8bcb11c57f306c72146afe8b45388125cb7bf9ecf965a7ba4f768c77be366470dcdcf214b7f6a5a9460ed4fe44ae559d85e2fdc2094de83fff12ea8804db1215c4ca865871bdd7f8ef32ab799bf923ffb02c1ded7d129beadad46c5eda31ab1a6f43da05ea08bff7ffa88d8966353d01830558c39b930b01d175e437124d8edd0d2698fd8932f2b2c9b14746e52879c57a395538150f390264f00e60d470711202f4194499ff79037ca9885dc8d695f7d917a3086ca88e8f8d0243efee09302cf39e039eb7cc8dd19d28120d5fe533b5727cd39133181c729ca6f90a015ed30be7668d5cb5ecc33a53ee69bf7d1a5ecbdb153803743c6adaaabd36bf84e5be38d3f04a5d5dbfd67bdcd3b176e65bd1391ade775cc32ce43a847fb6c672a3fe97a5d4081c4986959ec5fb898f42a9397ba2b3ec2c1018f8d76d057f2366bd0e4465514ad6560c599664fb85621fe771e00f43d39b591b2a6a321100f4d1ef23a376d5ae3eeedbfe23da73dff0ee4d16b34ebddd8f5f053db9824105fc7300dbee7ea6af56b112319e3e215a0fc79ae946f6b5227453ec7fcaf17cf7651f71499a50d81221404d5f129ac50ea7528ff0e0069ec4ab8acb7919d81749ab37a870c5ef2cc5a15cf96709d3c65b4addc77e7416847160bcabb94ea36377e0ef71be80b5cc53effd5444888044a353574c72c924bba2a8b4e8354188ebfedc852f59073f4347a8c -MAC = a677187dbf3c927aeeafb9ebce0f61dc - -# Length 2058. -Key = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f -Input = 248ac31085b6c2adaaa38259a0d7192c5c35d1bb4ef39ad94c38d1c82479e2dd2159a077024b0589bc8a20101b506f0a1ad0bbab76e83a83f1b94be6beae74e874cab692c5963a75436b776121ec9f62399a3e66b2d22707dae81933b6277f3c8516bcbe26dbbd86f373103d7cf4cad1888c952118fbfbd0d7b4bedc4ae4936aff91157e7aa47c54442ea78d6ac251d324a0fbe49d89cc3521b66d16e9c66a3709894e4eb0a4eedc4ae19468e66b81f271351b1d921ea551047abcc6b87a901fde7db79fa1818c11336dbc07244a40eb14cf77bde35e78ae9ad7d3f57ed7e7f23926c9172f82d77684ea5ed7d74ebc6f142b997036bcb7cce8df1bbc0d5b35a46509c954fc9469d214d6238f166cbf872156b4c41d7aac5942cffb175023078252a3f36e315c5d4ce0e39928a018252862becacef96a19f03bdcf46d75584299d1f8b03c0169e9e407d937145b5e5024139e7022a1978f114f24cdfa23780a119735c41da8fb759bbb3f025c6ec30e6c6e9bce8615be68e392fce59fd26a8e6a6cc5c606e3848116e4d01d29565a1facfb524b6d29643b826eee1e42869fc76df229dd79b39a2b1df28bb335c3a5f15a855d0121e4a6da34b5e4d5b7b5d5746a03ecff70811e1516fcec1bf7462e8876a2d21710aa168c78f45a6a15015950e221da85d3ec822ad6d0a6931b25a06b7bb5f3c10bb36cd4d647f9561982fde9818de5d4bf8db7f86c53b4ff14928ac15f79023b61861e73e44216540bb302153770da2533de9795252ab5fb77ad924c9338c8144c23d4c90dab9a18feac1a1574d4545e1435eb405e6c4c439fc724fce992ae85badf345bad16d85fbd338f04433703614754d0e7e54c4ccde2670587d52ecfb5a70a14a501bacc727722649931d8515b13d020a78e511fe136d45fbf97f9c7f689fcc677cfb3683723878350ffe9d08130cc6e567b6179e01b7eb2b3bbcf0873e1308eec018edeb8cce946338e15d5bf68c71916a83a99358039ef071e009546a2df936879dffbba397a93925d229a469fd17d71b7f524e03a30da6ee927542f8b369bed4734fe25dbd63d24ffd2a222f5f84f75d858ab989be925af570ad6d45bd28ce61b5139e1dd2f0b7795fe072e6e83acbb5e7b777a70c641e4cab2af40eed69abc334cd2703c3273204fac580c6a3d6680427e5f7d051e8380a53f93a180f4556ecea4530b9a2d5948dad63d415b6874f6b90e767d6d265be86351b53ba690780bb57c21b57418c5b97559e840c68257f839e7583a4bf7c7645c5987d40cc1ba79a218c35edfacdabe581d950e4bb7a481ebe64d61d00e75b1f25f1ce5f5462334a5b9038a697aa0937a3f8017e05d2c9c05dcb05c0b02508dea619b137f5444b6f088eb3cb2c66788f88afdfbba8faa1c490485624c88ae11e57347a676902e7553f056188493209bdbb30acc63c9e41e16a9d6c009416b520a76ba38f57628170c43626b5cb46179dc5bf65de865085f84bf741c223fbe474d2d19d8f43914fbd6586351089e73babf344f988b7963fe44528457d7aad3c564f6bcbd0d772a4c9fd328e6022d1c7c9f86726f8d5a23797d309c0f653ab1ac687833eb2700f156296062a8b377078f45f6b68c3d07cae1913ba8d5a6f9bf7525a3439eb932d4cefc4bf8e1b07b48ca13ece366cbc3e0388915915d1757475103a9e9454e7e6355de2d6acbf4710f9a63e4f6d3cd70c2d6fca88dd8a14448fdb63ce9350fdaafbe0b8bd1c5d307dae76dfed799aef2d8f23d5608d37d1330dd38b94860905dbeebf78d7b7318b7d42aed40d3f9899e9f420cbd92a6eeae3026f7725694e0e4bee016ba346fed2c21172bdb4a461cebe0cfe38e76645226ac127a259c193264d735ce8c8a57e17dd3f0579e2e86dc295ad1f45ba2d85db35044da61f7d401274b31eefbeb34e8d2ae596e9b4541aae117bdac5ed0b324c20539c27c07a411d5288b0b5f6fa16e9a7df85dc319fa6b71cd08a859c06a3f7b0289e1750adbf182f9750fea96fea5ab7aa3473340607cd7ed2c626f5382491c26d5d5bea61401dee7319c94d418f297e61ceac8f258ee8c23831bda081591f5a918e96855774ddedffc51e5b180f1971806d42fc333020b734aeb45adb0bc47325d0cea5f6713a786558022afc39d573892aa3635efbfd8bcb11c57f306c72146afe8b45388125cb7bf9ecf965a7ba4f768c77be366470dcdcf214b7f6a5a9460ed4fe44ae559d85e2fdc2094de83fff12ea8804db1215c4ca865871bdd7f8ef32ab799bf923ffb02c1ded7d129beadad46c5eda31ab1a6f43da05ea08bff7ffa88d8966353d01830558c39b930b01d175e437124d8edd0d2698fd8932f2b2c9b14746e52879c57a395538150f390264f00e60d470711202f4194499ff79037ca9885dc8d695f7d917a3086ca88e8f8d0243efee09302cf39e039eb7cc8dd19d28120d5fe533b5727cd39133181c729ca6f90a015ed30be7668d5cb5ecc33a53ee69bf7d1a5ecbdb153803743c6adaaabd36bf84e5be38d3f04a5d5dbfd67bdcd3b176e65bd1391ade775cc32ce43a847fb6c672a3fe97a5d4081c4986959ec5fb898f42a9397ba2b3ec2c1018f8d76d057f2366bd0e4465514ad6560c599664fb85621fe771e00f43d39b591b2a6a321100f4d1ef23a376d5ae3eeedbfe23da73dff0ee4d16b34ebddd8f5f053db9824105fc7300dbee7ea6af56b112319e3e215a0fc79ae946f6b5227453ec7fcaf17cf7651f71499a50d81221404d5f129ac50ea7528ff0e0069ec4ab8acb7919d81749ab37a870c5ef2cc5a15cf96709d3c65b4addc77e7416847160bcabb94ea36377e0ef71be80b5cc53effd5444888044a353574c72c924bba2a8b4e8354188ebfedc852f59073f4347a8c8a -MAC = 201fed7eee981b31d2cc42ff6c38141a - -# Length 2059. -Key = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f -Input = 248ac31085b6c2adaaa38259a0d7192c5c35d1bb4ef39ad94c38d1c82479e2dd2159a077024b0589bc8a20101b506f0a1ad0bbab76e83a83f1b94be6beae74e874cab692c5963a75436b776121ec9f62399a3e66b2d22707dae81933b6277f3c8516bcbe26dbbd86f373103d7cf4cad1888c952118fbfbd0d7b4bedc4ae4936aff91157e7aa47c54442ea78d6ac251d324a0fbe49d89cc3521b66d16e9c66a3709894e4eb0a4eedc4ae19468e66b81f271351b1d921ea551047abcc6b87a901fde7db79fa1818c11336dbc07244a40eb14cf77bde35e78ae9ad7d3f57ed7e7f23926c9172f82d77684ea5ed7d74ebc6f142b997036bcb7cce8df1bbc0d5b35a46509c954fc9469d214d6238f166cbf872156b4c41d7aac5942cffb175023078252a3f36e315c5d4ce0e39928a018252862becacef96a19f03bdcf46d75584299d1f8b03c0169e9e407d937145b5e5024139e7022a1978f114f24cdfa23780a119735c41da8fb759bbb3f025c6ec30e6c6e9bce8615be68e392fce59fd26a8e6a6cc5c606e3848116e4d01d29565a1facfb524b6d29643b826eee1e42869fc76df229dd79b39a2b1df28bb335c3a5f15a855d0121e4a6da34b5e4d5b7b5d5746a03ecff70811e1516fcec1bf7462e8876a2d21710aa168c78f45a6a15015950e221da85d3ec822ad6d0a6931b25a06b7bb5f3c10bb36cd4d647f9561982fde9818de5d4bf8db7f86c53b4ff14928ac15f79023b61861e73e44216540bb302153770da2533de9795252ab5fb77ad924c9338c8144c23d4c90dab9a18feac1a1574d4545e1435eb405e6c4c439fc724fce992ae85badf345bad16d85fbd338f04433703614754d0e7e54c4ccde2670587d52ecfb5a70a14a501bacc727722649931d8515b13d020a78e511fe136d45fbf97f9c7f689fcc677cfb3683723878350ffe9d08130cc6e567b6179e01b7eb2b3bbcf0873e1308eec018edeb8cce946338e15d5bf68c71916a83a99358039ef071e009546a2df936879dffbba397a93925d229a469fd17d71b7f524e03a30da6ee927542f8b369bed4734fe25dbd63d24ffd2a222f5f84f75d858ab989be925af570ad6d45bd28ce61b5139e1dd2f0b7795fe072e6e83acbb5e7b777a70c641e4cab2af40eed69abc334cd2703c3273204fac580c6a3d6680427e5f7d051e8380a53f93a180f4556ecea4530b9a2d5948dad63d415b6874f6b90e767d6d265be86351b53ba690780bb57c21b57418c5b97559e840c68257f839e7583a4bf7c7645c5987d40cc1ba79a218c35edfacdabe581d950e4bb7a481ebe64d61d00e75b1f25f1ce5f5462334a5b9038a697aa0937a3f8017e05d2c9c05dcb05c0b02508dea619b137f5444b6f088eb3cb2c66788f88afdfbba8faa1c490485624c88ae11e57347a676902e7553f056188493209bdbb30acc63c9e41e16a9d6c009416b520a76ba38f57628170c43626b5cb46179dc5bf65de865085f84bf741c223fbe474d2d19d8f43914fbd6586351089e73babf344f988b7963fe44528457d7aad3c564f6bcbd0d772a4c9fd328e6022d1c7c9f86726f8d5a23797d309c0f653ab1ac687833eb2700f156296062a8b377078f45f6b68c3d07cae1913ba8d5a6f9bf7525a3439eb932d4cefc4bf8e1b07b48ca13ece366cbc3e0388915915d1757475103a9e9454e7e6355de2d6acbf4710f9a63e4f6d3cd70c2d6fca88dd8a14448fdb63ce9350fdaafbe0b8bd1c5d307dae76dfed799aef2d8f23d5608d37d1330dd38b94860905dbeebf78d7b7318b7d42aed40d3f9899e9f420cbd92a6eeae3026f7725694e0e4bee016ba346fed2c21172bdb4a461cebe0cfe38e76645226ac127a259c193264d735ce8c8a57e17dd3f0579e2e86dc295ad1f45ba2d85db35044da61f7d401274b31eefbeb34e8d2ae596e9b4541aae117bdac5ed0b324c20539c27c07a411d5288b0b5f6fa16e9a7df85dc319fa6b71cd08a859c06a3f7b0289e1750adbf182f9750fea96fea5ab7aa3473340607cd7ed2c626f5382491c26d5d5bea61401dee7319c94d418f297e61ceac8f258ee8c23831bda081591f5a918e96855774ddedffc51e5b180f1971806d42fc333020b734aeb45adb0bc47325d0cea5f6713a786558022afc39d573892aa3635efbfd8bcb11c57f306c72146afe8b45388125cb7bf9ecf965a7ba4f768c77be366470dcdcf214b7f6a5a9460ed4fe44ae559d85e2fdc2094de83fff12ea8804db1215c4ca865871bdd7f8ef32ab799bf923ffb02c1ded7d129beadad46c5eda31ab1a6f43da05ea08bff7ffa88d8966353d01830558c39b930b01d175e437124d8edd0d2698fd8932f2b2c9b14746e52879c57a395538150f390264f00e60d470711202f4194499ff79037ca9885dc8d695f7d917a3086ca88e8f8d0243efee09302cf39e039eb7cc8dd19d28120d5fe533b5727cd39133181c729ca6f90a015ed30be7668d5cb5ecc33a53ee69bf7d1a5ecbdb153803743c6adaaabd36bf84e5be38d3f04a5d5dbfd67bdcd3b176e65bd1391ade775cc32ce43a847fb6c672a3fe97a5d4081c4986959ec5fb898f42a9397ba2b3ec2c1018f8d76d057f2366bd0e4465514ad6560c599664fb85621fe771e00f43d39b591b2a6a321100f4d1ef23a376d5ae3eeedbfe23da73dff0ee4d16b34ebddd8f5f053db9824105fc7300dbee7ea6af56b112319e3e215a0fc79ae946f6b5227453ec7fcaf17cf7651f71499a50d81221404d5f129ac50ea7528ff0e0069ec4ab8acb7919d81749ab37a870c5ef2cc5a15cf96709d3c65b4addc77e7416847160bcabb94ea36377e0ef71be80b5cc53effd5444888044a353574c72c924bba2a8b4e8354188ebfedc852f59073f4347a8c8a28 -MAC = 0c3d3d01a37f347c4f7c5826bcafb3e1 - -# Length 2060. -Key = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f -Input = 248ac31085b6c2adaaa38259a0d7192c5c35d1bb4ef39ad94c38d1c82479e2dd2159a077024b0589bc8a20101b506f0a1ad0bbab76e83a83f1b94be6beae74e874cab692c5963a75436b776121ec9f62399a3e66b2d22707dae81933b6277f3c8516bcbe26dbbd86f373103d7cf4cad1888c952118fbfbd0d7b4bedc4ae4936aff91157e7aa47c54442ea78d6ac251d324a0fbe49d89cc3521b66d16e9c66a3709894e4eb0a4eedc4ae19468e66b81f271351b1d921ea551047abcc6b87a901fde7db79fa1818c11336dbc07244a40eb14cf77bde35e78ae9ad7d3f57ed7e7f23926c9172f82d77684ea5ed7d74ebc6f142b997036bcb7cce8df1bbc0d5b35a46509c954fc9469d214d6238f166cbf872156b4c41d7aac5942cffb175023078252a3f36e315c5d4ce0e39928a018252862becacef96a19f03bdcf46d75584299d1f8b03c0169e9e407d937145b5e5024139e7022a1978f114f24cdfa23780a119735c41da8fb759bbb3f025c6ec30e6c6e9bce8615be68e392fce59fd26a8e6a6cc5c606e3848116e4d01d29565a1facfb524b6d29643b826eee1e42869fc76df229dd79b39a2b1df28bb335c3a5f15a855d0121e4a6da34b5e4d5b7b5d5746a03ecff70811e1516fcec1bf7462e8876a2d21710aa168c78f45a6a15015950e221da85d3ec822ad6d0a6931b25a06b7bb5f3c10bb36cd4d647f9561982fde9818de5d4bf8db7f86c53b4ff14928ac15f79023b61861e73e44216540bb302153770da2533de9795252ab5fb77ad924c9338c8144c23d4c90dab9a18feac1a1574d4545e1435eb405e6c4c439fc724fce992ae85badf345bad16d85fbd338f04433703614754d0e7e54c4ccde2670587d52ecfb5a70a14a501bacc727722649931d8515b13d020a78e511fe136d45fbf97f9c7f689fcc677cfb3683723878350ffe9d08130cc6e567b6179e01b7eb2b3bbcf0873e1308eec018edeb8cce946338e15d5bf68c71916a83a99358039ef071e009546a2df936879dffbba397a93925d229a469fd17d71b7f524e03a30da6ee927542f8b369bed4734fe25dbd63d24ffd2a222f5f84f75d858ab989be925af570ad6d45bd28ce61b5139e1dd2f0b7795fe072e6e83acbb5e7b777a70c641e4cab2af40eed69abc334cd2703c3273204fac580c6a3d6680427e5f7d051e8380a53f93a180f4556ecea4530b9a2d5948dad63d415b6874f6b90e767d6d265be86351b53ba690780bb57c21b57418c5b97559e840c68257f839e7583a4bf7c7645c5987d40cc1ba79a218c35edfacdabe581d950e4bb7a481ebe64d61d00e75b1f25f1ce5f5462334a5b9038a697aa0937a3f8017e05d2c9c05dcb05c0b02508dea619b137f5444b6f088eb3cb2c66788f88afdfbba8faa1c490485624c88ae11e57347a676902e7553f056188493209bdbb30acc63c9e41e16a9d6c009416b520a76ba38f57628170c43626b5cb46179dc5bf65de865085f84bf741c223fbe474d2d19d8f43914fbd6586351089e73babf344f988b7963fe44528457d7aad3c564f6bcbd0d772a4c9fd328e6022d1c7c9f86726f8d5a23797d309c0f653ab1ac687833eb2700f156296062a8b377078f45f6b68c3d07cae1913ba8d5a6f9bf7525a3439eb932d4cefc4bf8e1b07b48ca13ece366cbc3e0388915915d1757475103a9e9454e7e6355de2d6acbf4710f9a63e4f6d3cd70c2d6fca88dd8a14448fdb63ce9350fdaafbe0b8bd1c5d307dae76dfed799aef2d8f23d5608d37d1330dd38b94860905dbeebf78d7b7318b7d42aed40d3f9899e9f420cbd92a6eeae3026f7725694e0e4bee016ba346fed2c21172bdb4a461cebe0cfe38e76645226ac127a259c193264d735ce8c8a57e17dd3f0579e2e86dc295ad1f45ba2d85db35044da61f7d401274b31eefbeb34e8d2ae596e9b4541aae117bdac5ed0b324c20539c27c07a411d5288b0b5f6fa16e9a7df85dc319fa6b71cd08a859c06a3f7b0289e1750adbf182f9750fea96fea5ab7aa3473340607cd7ed2c626f5382491c26d5d5bea61401dee7319c94d418f297e61ceac8f258ee8c23831bda081591f5a918e96855774ddedffc51e5b180f1971806d42fc333020b734aeb45adb0bc47325d0cea5f6713a786558022afc39d573892aa3635efbfd8bcb11c57f306c72146afe8b45388125cb7bf9ecf965a7ba4f768c77be366470dcdcf214b7f6a5a9460ed4fe44ae559d85e2fdc2094de83fff12ea8804db1215c4ca865871bdd7f8ef32ab799bf923ffb02c1ded7d129beadad46c5eda31ab1a6f43da05ea08bff7ffa88d8966353d01830558c39b930b01d175e437124d8edd0d2698fd8932f2b2c9b14746e52879c57a395538150f390264f00e60d470711202f4194499ff79037ca9885dc8d695f7d917a3086ca88e8f8d0243efee09302cf39e039eb7cc8dd19d28120d5fe533b5727cd39133181c729ca6f90a015ed30be7668d5cb5ecc33a53ee69bf7d1a5ecbdb153803743c6adaaabd36bf84e5be38d3f04a5d5dbfd67bdcd3b176e65bd1391ade775cc32ce43a847fb6c672a3fe97a5d4081c4986959ec5fb898f42a9397ba2b3ec2c1018f8d76d057f2366bd0e4465514ad6560c599664fb85621fe771e00f43d39b591b2a6a321100f4d1ef23a376d5ae3eeedbfe23da73dff0ee4d16b34ebddd8f5f053db9824105fc7300dbee7ea6af56b112319e3e215a0fc79ae946f6b5227453ec7fcaf17cf7651f71499a50d81221404d5f129ac50ea7528ff0e0069ec4ab8acb7919d81749ab37a870c5ef2cc5a15cf96709d3c65b4addc77e7416847160bcabb94ea36377e0ef71be80b5cc53effd5444888044a353574c72c924bba2a8b4e8354188ebfedc852f59073f4347a8c8a28c9 -MAC = 33a4e0e0bed7c84c5cc5dd4784410f07 - -# Length 2061. -Key = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f -Input = 248ac31085b6c2adaaa38259a0d7192c5c35d1bb4ef39ad94c38d1c82479e2dd2159a077024b0589bc8a20101b506f0a1ad0bbab76e83a83f1b94be6beae74e874cab692c5963a75436b776121ec9f62399a3e66b2d22707dae81933b6277f3c8516bcbe26dbbd86f373103d7cf4cad1888c952118fbfbd0d7b4bedc4ae4936aff91157e7aa47c54442ea78d6ac251d324a0fbe49d89cc3521b66d16e9c66a3709894e4eb0a4eedc4ae19468e66b81f271351b1d921ea551047abcc6b87a901fde7db79fa1818c11336dbc07244a40eb14cf77bde35e78ae9ad7d3f57ed7e7f23926c9172f82d77684ea5ed7d74ebc6f142b997036bcb7cce8df1bbc0d5b35a46509c954fc9469d214d6238f166cbf872156b4c41d7aac5942cffb175023078252a3f36e315c5d4ce0e39928a018252862becacef96a19f03bdcf46d75584299d1f8b03c0169e9e407d937145b5e5024139e7022a1978f114f24cdfa23780a119735c41da8fb759bbb3f025c6ec30e6c6e9bce8615be68e392fce59fd26a8e6a6cc5c606e3848116e4d01d29565a1facfb524b6d29643b826eee1e42869fc76df229dd79b39a2b1df28bb335c3a5f15a855d0121e4a6da34b5e4d5b7b5d5746a03ecff70811e1516fcec1bf7462e8876a2d21710aa168c78f45a6a15015950e221da85d3ec822ad6d0a6931b25a06b7bb5f3c10bb36cd4d647f9561982fde9818de5d4bf8db7f86c53b4ff14928ac15f79023b61861e73e44216540bb302153770da2533de9795252ab5fb77ad924c9338c8144c23d4c90dab9a18feac1a1574d4545e1435eb405e6c4c439fc724fce992ae85badf345bad16d85fbd338f04433703614754d0e7e54c4ccde2670587d52ecfb5a70a14a501bacc727722649931d8515b13d020a78e511fe136d45fbf97f9c7f689fcc677cfb3683723878350ffe9d08130cc6e567b6179e01b7eb2b3bbcf0873e1308eec018edeb8cce946338e15d5bf68c71916a83a99358039ef071e009546a2df936879dffbba397a93925d229a469fd17d71b7f524e03a30da6ee927542f8b369bed4734fe25dbd63d24ffd2a222f5f84f75d858ab989be925af570ad6d45bd28ce61b5139e1dd2f0b7795fe072e6e83acbb5e7b777a70c641e4cab2af40eed69abc334cd2703c3273204fac580c6a3d6680427e5f7d051e8380a53f93a180f4556ecea4530b9a2d5948dad63d415b6874f6b90e767d6d265be86351b53ba690780bb57c21b57418c5b97559e840c68257f839e7583a4bf7c7645c5987d40cc1ba79a218c35edfacdabe581d950e4bb7a481ebe64d61d00e75b1f25f1ce5f5462334a5b9038a697aa0937a3f8017e05d2c9c05dcb05c0b02508dea619b137f5444b6f088eb3cb2c66788f88afdfbba8faa1c490485624c88ae11e57347a676902e7553f056188493209bdbb30acc63c9e41e16a9d6c009416b520a76ba38f57628170c43626b5cb46179dc5bf65de865085f84bf741c223fbe474d2d19d8f43914fbd6586351089e73babf344f988b7963fe44528457d7aad3c564f6bcbd0d772a4c9fd328e6022d1c7c9f86726f8d5a23797d309c0f653ab1ac687833eb2700f156296062a8b377078f45f6b68c3d07cae1913ba8d5a6f9bf7525a3439eb932d4cefc4bf8e1b07b48ca13ece366cbc3e0388915915d1757475103a9e9454e7e6355de2d6acbf4710f9a63e4f6d3cd70c2d6fca88dd8a14448fdb63ce9350fdaafbe0b8bd1c5d307dae76dfed799aef2d8f23d5608d37d1330dd38b94860905dbeebf78d7b7318b7d42aed40d3f9899e9f420cbd92a6eeae3026f7725694e0e4bee016ba346fed2c21172bdb4a461cebe0cfe38e76645226ac127a259c193264d735ce8c8a57e17dd3f0579e2e86dc295ad1f45ba2d85db35044da61f7d401274b31eefbeb34e8d2ae596e9b4541aae117bdac5ed0b324c20539c27c07a411d5288b0b5f6fa16e9a7df85dc319fa6b71cd08a859c06a3f7b0289e1750adbf182f9750fea96fea5ab7aa3473340607cd7ed2c626f5382491c26d5d5bea61401dee7319c94d418f297e61ceac8f258ee8c23831bda081591f5a918e96855774ddedffc51e5b180f1971806d42fc333020b734aeb45adb0bc47325d0cea5f6713a786558022afc39d573892aa3635efbfd8bcb11c57f306c72146afe8b45388125cb7bf9ecf965a7ba4f768c77be366470dcdcf214b7f6a5a9460ed4fe44ae559d85e2fdc2094de83fff12ea8804db1215c4ca865871bdd7f8ef32ab799bf923ffb02c1ded7d129beadad46c5eda31ab1a6f43da05ea08bff7ffa88d8966353d01830558c39b930b01d175e437124d8edd0d2698fd8932f2b2c9b14746e52879c57a395538150f390264f00e60d470711202f4194499ff79037ca9885dc8d695f7d917a3086ca88e8f8d0243efee09302cf39e039eb7cc8dd19d28120d5fe533b5727cd39133181c729ca6f90a015ed30be7668d5cb5ecc33a53ee69bf7d1a5ecbdb153803743c6adaaabd36bf84e5be38d3f04a5d5dbfd67bdcd3b176e65bd1391ade775cc32ce43a847fb6c672a3fe97a5d4081c4986959ec5fb898f42a9397ba2b3ec2c1018f8d76d057f2366bd0e4465514ad6560c599664fb85621fe771e00f43d39b591b2a6a321100f4d1ef23a376d5ae3eeedbfe23da73dff0ee4d16b34ebddd8f5f053db9824105fc7300dbee7ea6af56b112319e3e215a0fc79ae946f6b5227453ec7fcaf17cf7651f71499a50d81221404d5f129ac50ea7528ff0e0069ec4ab8acb7919d81749ab37a870c5ef2cc5a15cf96709d3c65b4addc77e7416847160bcabb94ea36377e0ef71be80b5cc53effd5444888044a353574c72c924bba2a8b4e8354188ebfedc852f59073f4347a8c8a28c99e -MAC = 8e41c40a2f8ec58fe594f3a3a2de4ae1 - -# Length 2062. -Key = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f -Input = 248ac31085b6c2adaaa38259a0d7192c5c35d1bb4ef39ad94c38d1c82479e2dd2159a077024b0589bc8a20101b506f0a1ad0bbab76e83a83f1b94be6beae74e874cab692c5963a75436b776121ec9f62399a3e66b2d22707dae81933b6277f3c8516bcbe26dbbd86f373103d7cf4cad1888c952118fbfbd0d7b4bedc4ae4936aff91157e7aa47c54442ea78d6ac251d324a0fbe49d89cc3521b66d16e9c66a3709894e4eb0a4eedc4ae19468e66b81f271351b1d921ea551047abcc6b87a901fde7db79fa1818c11336dbc07244a40eb14cf77bde35e78ae9ad7d3f57ed7e7f23926c9172f82d77684ea5ed7d74ebc6f142b997036bcb7cce8df1bbc0d5b35a46509c954fc9469d214d6238f166cbf872156b4c41d7aac5942cffb175023078252a3f36e315c5d4ce0e39928a018252862becacef96a19f03bdcf46d75584299d1f8b03c0169e9e407d937145b5e5024139e7022a1978f114f24cdfa23780a119735c41da8fb759bbb3f025c6ec30e6c6e9bce8615be68e392fce59fd26a8e6a6cc5c606e3848116e4d01d29565a1facfb524b6d29643b826eee1e42869fc76df229dd79b39a2b1df28bb335c3a5f15a855d0121e4a6da34b5e4d5b7b5d5746a03ecff70811e1516fcec1bf7462e8876a2d21710aa168c78f45a6a15015950e221da85d3ec822ad6d0a6931b25a06b7bb5f3c10bb36cd4d647f9561982fde9818de5d4bf8db7f86c53b4ff14928ac15f79023b61861e73e44216540bb302153770da2533de9795252ab5fb77ad924c9338c8144c23d4c90dab9a18feac1a1574d4545e1435eb405e6c4c439fc724fce992ae85badf345bad16d85fbd338f04433703614754d0e7e54c4ccde2670587d52ecfb5a70a14a501bacc727722649931d8515b13d020a78e511fe136d45fbf97f9c7f689fcc677cfb3683723878350ffe9d08130cc6e567b6179e01b7eb2b3bbcf0873e1308eec018edeb8cce946338e15d5bf68c71916a83a99358039ef071e009546a2df936879dffbba397a93925d229a469fd17d71b7f524e03a30da6ee927542f8b369bed4734fe25dbd63d24ffd2a222f5f84f75d858ab989be925af570ad6d45bd28ce61b5139e1dd2f0b7795fe072e6e83acbb5e7b777a70c641e4cab2af40eed69abc334cd2703c3273204fac580c6a3d6680427e5f7d051e8380a53f93a180f4556ecea4530b9a2d5948dad63d415b6874f6b90e767d6d265be86351b53ba690780bb57c21b57418c5b97559e840c68257f839e7583a4bf7c7645c5987d40cc1ba79a218c35edfacdabe581d950e4bb7a481ebe64d61d00e75b1f25f1ce5f5462334a5b9038a697aa0937a3f8017e05d2c9c05dcb05c0b02508dea619b137f5444b6f088eb3cb2c66788f88afdfbba8faa1c490485624c88ae11e57347a676902e7553f056188493209bdbb30acc63c9e41e16a9d6c009416b520a76ba38f57628170c43626b5cb46179dc5bf65de865085f84bf741c223fbe474d2d19d8f43914fbd6586351089e73babf344f988b7963fe44528457d7aad3c564f6bcbd0d772a4c9fd328e6022d1c7c9f86726f8d5a23797d309c0f653ab1ac687833eb2700f156296062a8b377078f45f6b68c3d07cae1913ba8d5a6f9bf7525a3439eb932d4cefc4bf8e1b07b48ca13ece366cbc3e0388915915d1757475103a9e9454e7e6355de2d6acbf4710f9a63e4f6d3cd70c2d6fca88dd8a14448fdb63ce9350fdaafbe0b8bd1c5d307dae76dfed799aef2d8f23d5608d37d1330dd38b94860905dbeebf78d7b7318b7d42aed40d3f9899e9f420cbd92a6eeae3026f7725694e0e4bee016ba346fed2c21172bdb4a461cebe0cfe38e76645226ac127a259c193264d735ce8c8a57e17dd3f0579e2e86dc295ad1f45ba2d85db35044da61f7d401274b31eefbeb34e8d2ae596e9b4541aae117bdac5ed0b324c20539c27c07a411d5288b0b5f6fa16e9a7df85dc319fa6b71cd08a859c06a3f7b0289e1750adbf182f9750fea96fea5ab7aa3473340607cd7ed2c626f5382491c26d5d5bea61401dee7319c94d418f297e61ceac8f258ee8c23831bda081591f5a918e96855774ddedffc51e5b180f1971806d42fc333020b734aeb45adb0bc47325d0cea5f6713a786558022afc39d573892aa3635efbfd8bcb11c57f306c72146afe8b45388125cb7bf9ecf965a7ba4f768c77be366470dcdcf214b7f6a5a9460ed4fe44ae559d85e2fdc2094de83fff12ea8804db1215c4ca865871bdd7f8ef32ab799bf923ffb02c1ded7d129beadad46c5eda31ab1a6f43da05ea08bff7ffa88d8966353d01830558c39b930b01d175e437124d8edd0d2698fd8932f2b2c9b14746e52879c57a395538150f390264f00e60d470711202f4194499ff79037ca9885dc8d695f7d917a3086ca88e8f8d0243efee09302cf39e039eb7cc8dd19d28120d5fe533b5727cd39133181c729ca6f90a015ed30be7668d5cb5ecc33a53ee69bf7d1a5ecbdb153803743c6adaaabd36bf84e5be38d3f04a5d5dbfd67bdcd3b176e65bd1391ade775cc32ce43a847fb6c672a3fe97a5d4081c4986959ec5fb898f42a9397ba2b3ec2c1018f8d76d057f2366bd0e4465514ad6560c599664fb85621fe771e00f43d39b591b2a6a321100f4d1ef23a376d5ae3eeedbfe23da73dff0ee4d16b34ebddd8f5f053db9824105fc7300dbee7ea6af56b112319e3e215a0fc79ae946f6b5227453ec7fcaf17cf7651f71499a50d81221404d5f129ac50ea7528ff0e0069ec4ab8acb7919d81749ab37a870c5ef2cc5a15cf96709d3c65b4addc77e7416847160bcabb94ea36377e0ef71be80b5cc53effd5444888044a353574c72c924bba2a8b4e8354188ebfedc852f59073f4347a8c8a28c99e21 -MAC = c6e5d1810fd878ac6b844c66cef36a22 - -# Length 2063. -Key = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f -Input = 248ac31085b6c2adaaa38259a0d7192c5c35d1bb4ef39ad94c38d1c82479e2dd2159a077024b0589bc8a20101b506f0a1ad0bbab76e83a83f1b94be6beae74e874cab692c5963a75436b776121ec9f62399a3e66b2d22707dae81933b6277f3c8516bcbe26dbbd86f373103d7cf4cad1888c952118fbfbd0d7b4bedc4ae4936aff91157e7aa47c54442ea78d6ac251d324a0fbe49d89cc3521b66d16e9c66a3709894e4eb0a4eedc4ae19468e66b81f271351b1d921ea551047abcc6b87a901fde7db79fa1818c11336dbc07244a40eb14cf77bde35e78ae9ad7d3f57ed7e7f23926c9172f82d77684ea5ed7d74ebc6f142b997036bcb7cce8df1bbc0d5b35a46509c954fc9469d214d6238f166cbf872156b4c41d7aac5942cffb175023078252a3f36e315c5d4ce0e39928a018252862becacef96a19f03bdcf46d75584299d1f8b03c0169e9e407d937145b5e5024139e7022a1978f114f24cdfa23780a119735c41da8fb759bbb3f025c6ec30e6c6e9bce8615be68e392fce59fd26a8e6a6cc5c606e3848116e4d01d29565a1facfb524b6d29643b826eee1e42869fc76df229dd79b39a2b1df28bb335c3a5f15a855d0121e4a6da34b5e4d5b7b5d5746a03ecff70811e1516fcec1bf7462e8876a2d21710aa168c78f45a6a15015950e221da85d3ec822ad6d0a6931b25a06b7bb5f3c10bb36cd4d647f9561982fde9818de5d4bf8db7f86c53b4ff14928ac15f79023b61861e73e44216540bb302153770da2533de9795252ab5fb77ad924c9338c8144c23d4c90dab9a18feac1a1574d4545e1435eb405e6c4c439fc724fce992ae85badf345bad16d85fbd338f04433703614754d0e7e54c4ccde2670587d52ecfb5a70a14a501bacc727722649931d8515b13d020a78e511fe136d45fbf97f9c7f689fcc677cfb3683723878350ffe9d08130cc6e567b6179e01b7eb2b3bbcf0873e1308eec018edeb8cce946338e15d5bf68c71916a83a99358039ef071e009546a2df936879dffbba397a93925d229a469fd17d71b7f524e03a30da6ee927542f8b369bed4734fe25dbd63d24ffd2a222f5f84f75d858ab989be925af570ad6d45bd28ce61b5139e1dd2f0b7795fe072e6e83acbb5e7b777a70c641e4cab2af40eed69abc334cd2703c3273204fac580c6a3d6680427e5f7d051e8380a53f93a180f4556ecea4530b9a2d5948dad63d415b6874f6b90e767d6d265be86351b53ba690780bb57c21b57418c5b97559e840c68257f839e7583a4bf7c7645c5987d40cc1ba79a218c35edfacdabe581d950e4bb7a481ebe64d61d00e75b1f25f1ce5f5462334a5b9038a697aa0937a3f8017e05d2c9c05dcb05c0b02508dea619b137f5444b6f088eb3cb2c66788f88afdfbba8faa1c490485624c88ae11e57347a676902e7553f056188493209bdbb30acc63c9e41e16a9d6c009416b520a76ba38f57628170c43626b5cb46179dc5bf65de865085f84bf741c223fbe474d2d19d8f43914fbd6586351089e73babf344f988b7963fe44528457d7aad3c564f6bcbd0d772a4c9fd328e6022d1c7c9f86726f8d5a23797d309c0f653ab1ac687833eb2700f156296062a8b377078f45f6b68c3d07cae1913ba8d5a6f9bf7525a3439eb932d4cefc4bf8e1b07b48ca13ece366cbc3e0388915915d1757475103a9e9454e7e6355de2d6acbf4710f9a63e4f6d3cd70c2d6fca88dd8a14448fdb63ce9350fdaafbe0b8bd1c5d307dae76dfed799aef2d8f23d5608d37d1330dd38b94860905dbeebf78d7b7318b7d42aed40d3f9899e9f420cbd92a6eeae3026f7725694e0e4bee016ba346fed2c21172bdb4a461cebe0cfe38e76645226ac127a259c193264d735ce8c8a57e17dd3f0579e2e86dc295ad1f45ba2d85db35044da61f7d401274b31eefbeb34e8d2ae596e9b4541aae117bdac5ed0b324c20539c27c07a411d5288b0b5f6fa16e9a7df85dc319fa6b71cd08a859c06a3f7b0289e1750adbf182f9750fea96fea5ab7aa3473340607cd7ed2c626f5382491c26d5d5bea61401dee7319c94d418f297e61ceac8f258ee8c23831bda081591f5a918e96855774ddedffc51e5b180f1971806d42fc333020b734aeb45adb0bc47325d0cea5f6713a786558022afc39d573892aa3635efbfd8bcb11c57f306c72146afe8b45388125cb7bf9ecf965a7ba4f768c77be366470dcdcf214b7f6a5a9460ed4fe44ae559d85e2fdc2094de83fff12ea8804db1215c4ca865871bdd7f8ef32ab799bf923ffb02c1ded7d129beadad46c5eda31ab1a6f43da05ea08bff7ffa88d8966353d01830558c39b930b01d175e437124d8edd0d2698fd8932f2b2c9b14746e52879c57a395538150f390264f00e60d470711202f4194499ff79037ca9885dc8d695f7d917a3086ca88e8f8d0243efee09302cf39e039eb7cc8dd19d28120d5fe533b5727cd39133181c729ca6f90a015ed30be7668d5cb5ecc33a53ee69bf7d1a5ecbdb153803743c6adaaabd36bf84e5be38d3f04a5d5dbfd67bdcd3b176e65bd1391ade775cc32ce43a847fb6c672a3fe97a5d4081c4986959ec5fb898f42a9397ba2b3ec2c1018f8d76d057f2366bd0e4465514ad6560c599664fb85621fe771e00f43d39b591b2a6a321100f4d1ef23a376d5ae3eeedbfe23da73dff0ee4d16b34ebddd8f5f053db9824105fc7300dbee7ea6af56b112319e3e215a0fc79ae946f6b5227453ec7fcaf17cf7651f71499a50d81221404d5f129ac50ea7528ff0e0069ec4ab8acb7919d81749ab37a870c5ef2cc5a15cf96709d3c65b4addc77e7416847160bcabb94ea36377e0ef71be80b5cc53effd5444888044a353574c72c924bba2a8b4e8354188ebfedc852f59073f4347a8c8a28c99e21df -MAC = f6eaae369c3cb5c05748e8d919178e00 - -# Regression test for https://rt.openssl.org/Ticket/Display.html?id=4439 -Key = 2d773be37adb1e4d683bf0075e79c4ee037918535a7f99ccb7040fb5f5f43aea -Input = 89dab80b7717c1db5db437860a3f70218e93e1b8f461fb677f16f35f6f87e2a91c99bc3a47ace47640cc95c345be5ecca5a3523c35cc01893af0b64a620334270372ec12482d1b1e363561698a578b359803495bb4e2ef1930b17a5190b580f141300df30adbeca28f6427a8bc1a999fd51c554a017d095d8c3e3127daf9f595 -MAC = c85d15ed44c378d6b00e23064c7bcd51 - -# Regression tests for https://rt.openssl.org/Ticket/Display.html?id=4483 - -Key = 7f1b02640000000000000000000000000000000000000000cccccccccccccccc -Input = cccccccccccccccccccccccccccccccccccccccccccccccccc80ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccceccccccccccccccccccccccccccccccccccccc5cccccccccccccccccccccccccccccccccccccccccce3ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccaccccccccccccccccccccce6cccccccccc000000afccccccccccccccccccfffffff5000000000000000000000000000000000000000000000000000000ffffffe70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000719205a8521dfc -MAC = 8559b876eceed66eb37798c0457baff9 - -Key = e00016000000000000000000000000000000aaaaaaaaaaaaaaaaaaaaaaaaaaaa -Input = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa000000000000000000800264 -MAC = 00bd1258978e205444c9aaaa82006fed - -Key = 0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c -Input = 02fc -MAC = 06120c0c0c0c0c0c0c0c0c0c0c0c0c0c - -Key = 00ff000000000000000000000000000000000000001e00000000000000007b7b -Input = 7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7a7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b5c7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b6e7b007b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7a7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b5c7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b6e7b001300000000b300000000000000000000000000000000000000000000f20000000000000000000000000000000000002000efff0009000000000000000000000000100000000009000000640000000000000000000000001300000000b300000000000000000000000000000000000000000000f20000000000000000000000000000000000002000efff00090000000000000000007a000010000000000900000064000000000000000000000000000000000000000000000000fc -MAC = 33205bbf9e9f8f7212ab9e2ab9b7e4a5 diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/aead/quic.rs temporalio-1.3.0/vendor/ring-0.16.20/src/aead/quic.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/aead/quic.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/aead/quic.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,186 +0,0 @@ -// Copyright 2018 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -//! QUIC Header Protection. -//! -//! See draft-ietf-quic-tls. - -use crate::{ - aead::{aes, chacha}, - cpu, error, hkdf, -}; -use core::convert::{TryFrom, TryInto}; - -/// A key for generating QUIC Header Protection masks. -pub struct HeaderProtectionKey { - inner: KeyInner, - algorithm: &'static Algorithm, -} - -#[allow(clippy::large_enum_variant, variant_size_differences)] -enum KeyInner { - Aes(aes::Key), - ChaCha20(chacha::Key), -} - -impl From> for HeaderProtectionKey { - fn from(okm: hkdf::Okm<&'static Algorithm>) -> Self { - let mut key_bytes = [0; super::MAX_KEY_LEN]; - let algorithm = *okm.len(); - let key_bytes = &mut key_bytes[..algorithm.key_len()]; - okm.fill(key_bytes).unwrap(); - Self::new(algorithm, key_bytes).unwrap() - } -} - -impl HeaderProtectionKey { - /// Create a new header protection key. - /// - /// `key_bytes` must be exactly `algorithm.key_len` bytes long. - pub fn new( - algorithm: &'static Algorithm, - key_bytes: &[u8], - ) -> Result { - Ok(Self { - inner: (algorithm.init)(key_bytes, cpu::features())?, - algorithm, - }) - } - - /// Generate a new QUIC Header Protection mask. - /// - /// `sample` must be exactly `self.algorithm().sample_len()` bytes long. - pub fn new_mask(&self, sample: &[u8]) -> Result<[u8; 5], error::Unspecified> { - let sample = <&[u8; SAMPLE_LEN]>::try_from(sample)?; - - let out = (self.algorithm.new_mask)(&self.inner, *sample); - Ok(out) - } - - /// The key's algorithm. - #[inline(always)] - pub fn algorithm(&self) -> &'static Algorithm { - self.algorithm - } -} - -const SAMPLE_LEN: usize = super::TAG_LEN; - -/// QUIC sample for new key masks -pub type Sample = [u8; SAMPLE_LEN]; - -/// A QUIC Header Protection Algorithm. -pub struct Algorithm { - init: fn(key: &[u8], cpu_features: cpu::Features) -> Result, - - new_mask: fn(key: &KeyInner, sample: Sample) -> [u8; 5], - - key_len: usize, - id: AlgorithmID, -} - -impl hkdf::KeyType for &'static Algorithm { - #[inline] - fn len(&self) -> usize { - self.key_len() - } -} - -impl Algorithm { - /// The length of the key. - #[inline(always)] - pub fn key_len(&self) -> usize { - self.key_len - } - - /// The required sample length. - #[inline(always)] - pub fn sample_len(&self) -> usize { - SAMPLE_LEN - } -} - -derive_debug_via_id!(Algorithm); - -#[derive(Debug, Eq, PartialEq)] -enum AlgorithmID { - AES_128, - AES_256, - CHACHA20, -} - -impl PartialEq for Algorithm { - fn eq(&self, other: &Self) -> bool { - self.id == other.id - } -} - -impl Eq for Algorithm {} - -/// AES-128. -pub static AES_128: Algorithm = Algorithm { - key_len: 16, - init: aes_init_128, - new_mask: aes_new_mask, - id: AlgorithmID::AES_128, -}; - -/// AES-256. -pub static AES_256: Algorithm = Algorithm { - key_len: 32, - init: aes_init_256, - new_mask: aes_new_mask, - id: AlgorithmID::AES_256, -}; - -fn aes_init_128(key: &[u8], cpu_features: cpu::Features) -> Result { - let aes_key = aes::Key::new(key, aes::Variant::AES_128, cpu_features)?; - Ok(KeyInner::Aes(aes_key)) -} - -fn aes_init_256(key: &[u8], cpu_features: cpu::Features) -> Result { - let aes_key = aes::Key::new(key, aes::Variant::AES_256, cpu_features)?; - Ok(KeyInner::Aes(aes_key)) -} - -fn aes_new_mask(key: &KeyInner, sample: Sample) -> [u8; 5] { - let aes_key = match key { - KeyInner::Aes(key) => key, - _ => unreachable!(), - }; - - aes_key.new_mask(sample) -} - -/// ChaCha20. -pub static CHACHA20: Algorithm = Algorithm { - key_len: chacha::KEY_LEN, - init: chacha20_init, - new_mask: chacha20_new_mask, - id: AlgorithmID::CHACHA20, -}; - -fn chacha20_init(key: &[u8], _todo: cpu::Features) -> Result { - let chacha20_key: [u8; chacha::KEY_LEN] = key.try_into()?; - Ok(KeyInner::ChaCha20(chacha::Key::from(chacha20_key))) -} - -fn chacha20_new_mask(key: &KeyInner, sample: Sample) -> [u8; 5] { - let chacha20_key = match key { - KeyInner::ChaCha20(key) => key, - _ => unreachable!(), - }; - - chacha20_key.new_mask(sample) -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/aead/shift.rs temporalio-1.3.0/vendor/ring-0.16.20/src/aead/shift.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/aead/shift.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/aead/shift.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,51 +0,0 @@ -// Copyright 2018 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -use super::block::{Block, BLOCK_LEN}; - -#[cfg(target_arch = "x86")] -pub fn shift_full_blocks(in_out: &mut [u8], in_prefix_len: usize, mut transform: F) -where - F: FnMut(&[u8; BLOCK_LEN]) -> Block, -{ - use core::convert::TryFrom; - - let in_out_len = in_out.len().checked_sub(in_prefix_len).unwrap(); - - for i in (0..in_out_len).step_by(BLOCK_LEN) { - let block = { - let input = - <&[u8; BLOCK_LEN]>::try_from(&in_out[(in_prefix_len + i)..][..BLOCK_LEN]).unwrap(); - transform(input) - }; - let output = <&mut [u8; BLOCK_LEN]>::try_from(&mut in_out[i..][..BLOCK_LEN]).unwrap(); - *output = *block.as_ref(); - } -} - -pub fn shift_partial((in_prefix_len, in_out): (usize, &mut [u8]), transform: F) -where - F: FnOnce(&[u8]) -> Block, -{ - let (block, in_out_len) = { - let input = &in_out[in_prefix_len..]; - let in_out_len = input.len(); - if in_out_len == 0 { - return; - } - debug_assert!(in_out_len < BLOCK_LEN); - (transform(input), in_out_len) - }; - in_out[..in_out_len].copy_from_slice(&block.as_ref()[..in_out_len]); -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/aead.rs temporalio-1.3.0/vendor/ring-0.16.20/src/aead.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/aead.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/aead.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,679 +0,0 @@ -// Copyright 2015-2016 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -//! Authenticated Encryption with Associated Data (AEAD). -//! -//! See [Authenticated encryption: relations among notions and analysis of the -//! generic composition paradigm][AEAD] for an introduction to the concept of -//! AEADs. -//! -//! [AEAD]: http://www-cse.ucsd.edu/~mihir/papers/oem.html -//! [`crypto.cipher.AEAD`]: https://golang.org/pkg/crypto/cipher/#AEAD - -use self::block::{Block, BLOCK_LEN}; -use crate::{constant_time, cpu, error, hkdf, polyfill}; -use core::ops::RangeFrom; - -pub use self::{ - aes_gcm::{AES_128_GCM, AES_256_GCM}, - chacha20_poly1305::CHACHA20_POLY1305, - nonce::{Nonce, NONCE_LEN}, -}; - -/// A sequences of unique nonces. -/// -/// A given `NonceSequence` must never return the same `Nonce` twice from -/// `advance()`. -/// -/// A simple counter is a reasonable (but probably not ideal) `NonceSequence`. -/// -/// Intentionally not `Clone` or `Copy` since cloning would allow duplication -/// of the sequence. -pub trait NonceSequence { - /// Returns the next nonce in the sequence. - /// - /// This may fail if "too many" nonces have been requested, where how many - /// is too many is up to the implementation of `NonceSequence`. An - /// implementation may that enforce a maximum number of records are - /// sent/received under a key this way. Once `advance()` fails, it must - /// fail for all subsequent calls. - fn advance(&mut self) -> Result; -} - -/// An AEAD key bound to a nonce sequence. -pub trait BoundKey: core::fmt::Debug { - /// Constructs a new key from the given `UnboundKey` and `NonceSequence`. - fn new(key: UnboundKey, nonce_sequence: N) -> Self; - - /// The key's AEAD algorithm. - fn algorithm(&self) -> &'static Algorithm; -} - -/// An AEAD key for authenticating and decrypting ("opening"), bound to a nonce -/// sequence. -/// -/// Intentionally not `Clone` or `Copy` since cloning would allow duplication -/// of the nonce sequence. -pub struct OpeningKey { - key: UnboundKey, - nonce_sequence: N, -} - -impl BoundKey for OpeningKey { - fn new(key: UnboundKey, nonce_sequence: N) -> Self { - Self { - key, - nonce_sequence, - } - } - - #[inline] - fn algorithm(&self) -> &'static Algorithm { - self.key.algorithm - } -} - -impl core::fmt::Debug for OpeningKey { - fn fmt(&self, f: &mut core::fmt::Formatter) -> Result<(), core::fmt::Error> { - f.debug_struct("OpeningKey") - .field("algorithm", &self.algorithm()) - .finish() - } -} - -impl OpeningKey { - /// Authenticates and decrypts (“opensâ€) data in place. - /// - /// `aad` is the additional authenticated data (AAD), if any. - /// - /// On input, `in_out` must be the ciphertext followed by the tag. When - /// `open_in_place()` returns `Ok(plaintext)`, the input ciphertext - /// has been overwritten by the plaintext; `plaintext` will refer to the - /// plaintext without the tag. - /// - /// When `open_in_place()` returns `Err(..)`, `in_out` may have been - /// overwritten in an unspecified way. - #[inline] - pub fn open_in_place<'in_out, A>( - &mut self, - aad: Aad, - in_out: &'in_out mut [u8], - ) -> Result<&'in_out mut [u8], error::Unspecified> - where - A: AsRef<[u8]>, - { - self.open_within(aad, in_out, 0..) - } - - /// Authenticates and decrypts (“opensâ€) data in place, with a shift. - /// - /// `aad` is the additional authenticated data (AAD), if any. - /// - /// On input, `in_out[ciphertext_and_tag]` must be the ciphertext followed - /// by the tag. When `open_within()` returns `Ok(plaintext)`, the plaintext - /// will be at `in_out[0..plaintext.len()]`. In other words, the following - /// two code fragments are equivalent for valid values of - /// `ciphertext_and_tag`, except `open_within` will often be more efficient: - /// - /// - /// ```skip - /// let plaintext = key.open_within(aad, in_out, cipertext_and_tag)?; - /// ``` - /// - /// ```skip - /// let ciphertext_and_tag_len = in_out[ciphertext_and_tag].len(); - /// in_out.copy_within(ciphertext_and_tag, 0); - /// let plaintext = key.open_in_place(aad, &mut in_out[..ciphertext_and_tag_len])?; - /// ``` - /// - /// Similarly, `key.open_within(aad, in_out, 0..)` is equivalent to - /// `key.open_in_place(aad, in_out)`. - /// - /// When `open_in_place()` returns `Err(..)`, `in_out` may have been - /// overwritten in an unspecified way. - /// - /// The shifting feature is useful in the case where multiple packets are - /// being reassembled in place. Consider this example where the peer has - /// sent the message “Split stream reassembled in place†split into - /// three sealed packets: - /// - /// ```ascii-art - /// Packet 1 Packet 2 Packet 3 - /// Input: [Header][Ciphertext][Tag][Header][Ciphertext][Tag][Header][Ciphertext][Tag] - /// | +--------------+ | - /// +------+ +-----+ +----------------------------------+ - /// v v v - /// Output: [Plaintext][Plaintext][Plaintext] - /// “Split stream reassembled in place†- /// ``` - /// - /// This reassembly be accomplished with three calls to `open_within()`. - #[inline] - pub fn open_within<'in_out, A>( - &mut self, - aad: Aad, - in_out: &'in_out mut [u8], - ciphertext_and_tag: RangeFrom, - ) -> Result<&'in_out mut [u8], error::Unspecified> - where - A: AsRef<[u8]>, - { - open_within_( - &self.key, - self.nonce_sequence.advance()?, - aad, - in_out, - ciphertext_and_tag, - ) - } -} - -#[inline] -fn open_within_<'in_out, A: AsRef<[u8]>>( - key: &UnboundKey, - nonce: Nonce, - Aad(aad): Aad, - in_out: &'in_out mut [u8], - ciphertext_and_tag: RangeFrom, -) -> Result<&'in_out mut [u8], error::Unspecified> { - fn open_within<'in_out>( - key: &UnboundKey, - nonce: Nonce, - aad: Aad<&[u8]>, - in_out: &'in_out mut [u8], - ciphertext_and_tag: RangeFrom, - ) -> Result<&'in_out mut [u8], error::Unspecified> { - let in_prefix_len = ciphertext_and_tag.start; - let ciphertext_and_tag_len = in_out - .len() - .checked_sub(in_prefix_len) - .ok_or(error::Unspecified)?; - let ciphertext_len = ciphertext_and_tag_len - .checked_sub(TAG_LEN) - .ok_or(error::Unspecified)?; - check_per_nonce_max_bytes(key.algorithm, ciphertext_len)?; - let (in_out, received_tag) = in_out.split_at_mut(in_prefix_len + ciphertext_len); - let Tag(calculated_tag) = (key.algorithm.open)( - &key.inner, - nonce, - aad, - in_prefix_len, - in_out, - key.cpu_features, - ); - if constant_time::verify_slices_are_equal(calculated_tag.as_ref(), received_tag).is_err() { - // Zero out the plaintext so that it isn't accidentally leaked or used - // after verification fails. It would be safest if we could check the - // tag before decrypting, but some `open` implementations interleave - // authentication with decryption for performance. - for b in &mut in_out[..ciphertext_len] { - *b = 0; - } - return Err(error::Unspecified); - } - // `ciphertext_len` is also the plaintext length. - Ok(&mut in_out[..ciphertext_len]) - } - - open_within( - key, - nonce, - Aad::from(aad.as_ref()), - in_out, - ciphertext_and_tag, - ) -} - -/// An AEAD key for encrypting and signing ("sealing"), bound to a nonce -/// sequence. -/// -/// Intentionally not `Clone` or `Copy` since cloning would allow duplication -/// of the nonce sequence. -pub struct SealingKey { - key: UnboundKey, - nonce_sequence: N, -} - -impl BoundKey for SealingKey { - fn new(key: UnboundKey, nonce_sequence: N) -> Self { - Self { - key, - nonce_sequence, - } - } - - #[inline] - fn algorithm(&self) -> &'static Algorithm { - self.key.algorithm - } -} - -impl core::fmt::Debug for SealingKey { - fn fmt(&self, f: &mut core::fmt::Formatter) -> Result<(), core::fmt::Error> { - f.debug_struct("SealingKey") - .field("algorithm", &self.algorithm()) - .finish() - } -} - -impl SealingKey { - /// Deprecated. Renamed to `seal_in_place_append_tag()`. - #[deprecated(note = "Renamed to `seal_in_place_append_tag`.")] - #[inline] - pub fn seal_in_place( - &mut self, - aad: Aad, - in_out: &mut InOut, - ) -> Result<(), error::Unspecified> - where - A: AsRef<[u8]>, - InOut: AsMut<[u8]> + for<'in_out> Extend<&'in_out u8>, - { - self.seal_in_place_append_tag(aad, in_out) - } - - /// Encrypts and signs (“sealsâ€) data in place, appending the tag to the - /// resulting ciphertext. - /// - /// `key.seal_in_place_append_tag(aad, in_out)` is equivalent to: - /// - /// ```skip - /// key.seal_in_place_separate_tag(aad, in_out.as_mut()) - /// .map(|tag| in_out.extend(tag.as_ref())) - /// ``` - #[inline] - pub fn seal_in_place_append_tag( - &mut self, - aad: Aad, - in_out: &mut InOut, - ) -> Result<(), error::Unspecified> - where - A: AsRef<[u8]>, - InOut: AsMut<[u8]> + for<'in_out> Extend<&'in_out u8>, - { - self.seal_in_place_separate_tag(aad, in_out.as_mut()) - .map(|tag| in_out.extend(tag.as_ref())) - } - - /// Encrypts and signs (“sealsâ€) data in place. - /// - /// `aad` is the additional authenticated data (AAD), if any. This is - /// authenticated but not encrypted. The type `A` could be a byte slice - /// `&[u8]`, a byte array `[u8; N]` for some constant `N`, `Vec`, etc. - /// If there is no AAD then use `Aad::empty()`. - /// - /// The plaintext is given as the input value of `in_out`. `seal_in_place()` - /// will overwrite the plaintext with the ciphertext and return the tag. - /// For most protocols, the caller must append the tag to the ciphertext. - /// The tag will be `self.algorithm.tag_len()` bytes long. - #[inline] - pub fn seal_in_place_separate_tag( - &mut self, - aad: Aad, - in_out: &mut [u8], - ) -> Result - where - A: AsRef<[u8]>, - { - seal_in_place_separate_tag_( - &self.key, - self.nonce_sequence.advance()?, - Aad::from(aad.as_ref()), - in_out, - ) - } -} - -#[inline] -fn seal_in_place_separate_tag_( - key: &UnboundKey, - nonce: Nonce, - aad: Aad<&[u8]>, - in_out: &mut [u8], -) -> Result { - check_per_nonce_max_bytes(key.algorithm, in_out.len())?; - Ok((key.algorithm.seal)( - &key.inner, - nonce, - aad, - in_out, - key.cpu_features, - )) -} - -/// The additionally authenticated data (AAD) for an opening or sealing -/// operation. This data is authenticated but is **not** encrypted. -/// -/// The type `A` could be a byte slice `&[u8]`, a byte array `[u8; N]` -/// for some constant `N`, `Vec`, etc. -pub struct Aad>(A); - -impl> Aad { - /// Construct the `Aad` from the given bytes. - #[inline] - pub fn from(aad: A) -> Self { - Aad(aad) - } -} - -impl AsRef<[u8]> for Aad -where - A: AsRef<[u8]>, -{ - fn as_ref(&self) -> &[u8] { - self.0.as_ref() - } -} - -impl Aad<[u8; 0]> { - /// Construct an empty `Aad`. - pub fn empty() -> Self { - Self::from([]) - } -} - -/// An AEAD key without a designated role or nonce sequence. -pub struct UnboundKey { - inner: KeyInner, - algorithm: &'static Algorithm, - cpu_features: cpu::Features, -} - -impl core::fmt::Debug for UnboundKey { - fn fmt(&self, f: &mut core::fmt::Formatter) -> Result<(), core::fmt::Error> { - f.debug_struct("UnboundKey") - .field("algorithm", &self.algorithm) - .finish() - } -} - -#[allow(clippy::large_enum_variant, variant_size_differences)] -enum KeyInner { - AesGcm(aes_gcm::Key), - ChaCha20Poly1305(chacha20_poly1305::Key), -} - -impl UnboundKey { - /// Constructs an `UnboundKey`. - /// - /// Fails if `key_bytes.len() != algorithm.key_len()`. - pub fn new( - algorithm: &'static Algorithm, - key_bytes: &[u8], - ) -> Result { - let cpu_features = cpu::features(); - Ok(Self { - inner: (algorithm.init)(key_bytes, cpu_features)?, - algorithm, - cpu_features, - }) - } - - /// The key's AEAD algorithm. - #[inline] - pub fn algorithm(&self) -> &'static Algorithm { - self.algorithm - } -} - -impl From> for UnboundKey { - fn from(okm: hkdf::Okm<&'static Algorithm>) -> Self { - let mut key_bytes = [0; MAX_KEY_LEN]; - let key_bytes = &mut key_bytes[..okm.len().key_len]; - let algorithm = *okm.len(); - okm.fill(key_bytes).unwrap(); - Self::new(algorithm, key_bytes).unwrap() - } -} - -impl hkdf::KeyType for &'static Algorithm { - #[inline] - fn len(&self) -> usize { - self.key_len() - } -} - -/// Immutable keys for use in situations where `OpeningKey`/`SealingKey` and -/// `NonceSequence` cannot reasonably be used. -/// -/// Prefer to use `OpeningKey`/`SealingKey` and `NonceSequence` when practical. -pub struct LessSafeKey { - key: UnboundKey, -} - -impl LessSafeKey { - /// Constructs a `LessSafeKey` from an `UnboundKey`. - pub fn new(key: UnboundKey) -> Self { - Self { key } - } - - /// Like [`OpeningKey::open_in_place()`], except it accepts an arbitrary nonce. - /// - /// `nonce` must be unique for every use of the key to open data. - #[inline] - pub fn open_in_place<'in_out, A>( - &self, - nonce: Nonce, - aad: Aad, - in_out: &'in_out mut [u8], - ) -> Result<&'in_out mut [u8], error::Unspecified> - where - A: AsRef<[u8]>, - { - self.open_within(nonce, aad, in_out, 0..) - } - - /// Like [`OpeningKey::open_within()`], except it accepts an arbitrary nonce. - /// - /// `nonce` must be unique for every use of the key to open data. - #[inline] - pub fn open_within<'in_out, A>( - &self, - nonce: Nonce, - aad: Aad, - in_out: &'in_out mut [u8], - ciphertext_and_tag: RangeFrom, - ) -> Result<&'in_out mut [u8], error::Unspecified> - where - A: AsRef<[u8]>, - { - open_within_(&self.key, nonce, aad, in_out, ciphertext_and_tag) - } - - /// Deprecated. Renamed to `seal_in_place_append_tag()`. - #[deprecated(note = "Renamed to `seal_in_place_append_tag`.")] - #[inline] - pub fn seal_in_place( - &self, - nonce: Nonce, - aad: Aad, - in_out: &mut InOut, - ) -> Result<(), error::Unspecified> - where - A: AsRef<[u8]>, - InOut: AsMut<[u8]> + for<'in_out> Extend<&'in_out u8>, - { - self.seal_in_place_append_tag(nonce, aad, in_out) - } - - /// Like [`SealingKey::seal_in_place_append_tag()`], except it accepts an - /// arbitrary nonce. - /// - /// `nonce` must be unique for every use of the key to seal data. - #[inline] - pub fn seal_in_place_append_tag( - &self, - nonce: Nonce, - aad: Aad, - in_out: &mut InOut, - ) -> Result<(), error::Unspecified> - where - A: AsRef<[u8]>, - InOut: AsMut<[u8]> + for<'in_out> Extend<&'in_out u8>, - { - self.seal_in_place_separate_tag(nonce, aad, in_out.as_mut()) - .map(|tag| in_out.extend(tag.as_ref())) - } - - /// Like `SealingKey::seal_in_place_separate_tag()`, except it accepts an - /// arbitrary nonce. - /// - /// `nonce` must be unique for every use of the key to seal data. - #[inline] - pub fn seal_in_place_separate_tag( - &self, - nonce: Nonce, - aad: Aad, - in_out: &mut [u8], - ) -> Result - where - A: AsRef<[u8]>, - { - seal_in_place_separate_tag_(&self.key, nonce, Aad::from(aad.as_ref()), in_out) - } - - /// The key's AEAD algorithm. - #[inline] - pub fn algorithm(&self) -> &'static Algorithm { - &self.key.algorithm - } -} - -impl core::fmt::Debug for LessSafeKey { - fn fmt(&self, f: &mut core::fmt::Formatter) -> Result<(), core::fmt::Error> { - f.debug_struct("LessSafeKey") - .field("algorithm", self.algorithm()) - .finish() - } -} - -/// An AEAD Algorithm. -pub struct Algorithm { - init: fn(key: &[u8], cpu_features: cpu::Features) -> Result, - - seal: fn( - key: &KeyInner, - nonce: Nonce, - aad: Aad<&[u8]>, - in_out: &mut [u8], - cpu_features: cpu::Features, - ) -> Tag, - open: fn( - key: &KeyInner, - nonce: Nonce, - aad: Aad<&[u8]>, - in_prefix_len: usize, - in_out: &mut [u8], - cpu_features: cpu::Features, - ) -> Tag, - - key_len: usize, - id: AlgorithmID, - - /// Use `max_input_len!()` to initialize this. - // TODO: Make this `usize`. - max_input_len: u64, -} - -const fn max_input_len(block_len: usize, overhead_blocks_per_nonce: usize) -> u64 { - // Each of our AEADs use a 32-bit block counter so the maximum is the - // largest input that will not overflow the counter. - ((1u64 << 32) - polyfill::u64_from_usize(overhead_blocks_per_nonce)) - * polyfill::u64_from_usize(block_len) -} - -impl Algorithm { - /// The length of the key. - #[inline(always)] - pub fn key_len(&self) -> usize { - self.key_len - } - - /// The length of a tag. - /// - /// See also `MAX_TAG_LEN`. - #[inline(always)] - pub fn tag_len(&self) -> usize { - TAG_LEN - } - - /// The length of the nonces. - #[inline(always)] - pub fn nonce_len(&self) -> usize { - NONCE_LEN - } -} - -derive_debug_via_id!(Algorithm); - -#[derive(Debug, Eq, PartialEq)] -enum AlgorithmID { - AES_128_GCM, - AES_256_GCM, - CHACHA20_POLY1305, -} - -impl PartialEq for Algorithm { - fn eq(&self, other: &Self) -> bool { - self.id == other.id - } -} - -impl Eq for Algorithm {} - -/// An authentication tag. -#[must_use] -#[repr(C)] -pub struct Tag([u8; TAG_LEN]); - -impl AsRef<[u8]> for Tag { - fn as_ref(&self) -> &[u8] { - self.0.as_ref() - } -} - -const MAX_KEY_LEN: usize = 32; - -// All the AEADs we support use 128-bit tags. -const TAG_LEN: usize = BLOCK_LEN; - -/// The maximum length of a tag for the algorithms in this module. -pub const MAX_TAG_LEN: usize = TAG_LEN; - -fn check_per_nonce_max_bytes(alg: &Algorithm, in_out_len: usize) -> Result<(), error::Unspecified> { - if polyfill::u64_from_usize(in_out_len) > alg.max_input_len { - return Err(error::Unspecified); - } - Ok(()) -} - -#[derive(Clone, Copy)] -enum Direction { - Opening { in_prefix_len: usize }, - Sealing, -} - -mod aes; -mod aes_gcm; -mod block; -mod chacha; -mod chacha20_poly1305; -pub mod chacha20_poly1305_openssh; -mod counter; -mod gcm; -mod iv; -mod nonce; -mod poly1305; -pub mod quic; -mod shift; diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/agreement.rs temporalio-1.3.0/vendor/ring-0.16.20/src/agreement.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/agreement.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/agreement.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,320 +0,0 @@ -// Copyright 2015-2017 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -//! Key Agreement: ECDH, including X25519. -//! -//! # Example -//! -//! Note that this example uses X25519, but ECDH using NIST P-256/P-384 is done -//! exactly the same way, just substituting -//! `agreement::ECDH_P256`/`agreement::ECDH_P384` for `agreement::X25519`. -//! -//! ``` -//! use ring::{agreement, rand}; -//! -//! let rng = rand::SystemRandom::new(); -//! -//! let my_private_key = agreement::EphemeralPrivateKey::generate(&agreement::X25519, &rng)?; -//! -//! // Make `my_public_key` a byte slice containing my public key. In a real -//! // application, this would be sent to the peer in an encoded protocol -//! // message. -//! let my_public_key = my_private_key.compute_public_key()?; -//! -//! let peer_public_key = { -//! // In a real application, the peer public key would be parsed out of a -//! // protocol message. Here we just generate one. -//! let peer_public_key = { -//! let peer_private_key = -//! agreement::EphemeralPrivateKey::generate(&agreement::X25519, &rng)?; -//! peer_private_key.compute_public_key()? -//! }; -//! -//! agreement::UnparsedPublicKey::new(&agreement::X25519, peer_public_key) -//! }; -//! -//! agreement::agree_ephemeral( -//! my_private_key, -//! &peer_public_key, -//! ring::error::Unspecified, -//! |_key_material| { -//! // In a real application, we'd apply a KDF to the key material and the -//! // public keys (as recommended in RFC 7748) and then derive session -//! // keys from the result. We omit all that here. -//! Ok(()) -//! }, -//! )?; -//! -//! # Ok::<(), ring::error::Unspecified>(()) -//! ``` - -// The "NSA Guide" steps here are from from section 3.1, "Ephemeral Unified -// Model." - -use crate::{cpu, debug, ec, error, rand}; - -pub use crate::ec::{ - curve25519::x25519::X25519, - suite_b::ecdh::{ECDH_P256, ECDH_P384}, -}; - -/// A key agreement algorithm. -pub struct Algorithm { - pub(crate) curve: &'static ec::Curve, - pub(crate) ecdh: fn( - out: &mut [u8], - private_key: &ec::Seed, - peer_public_key: untrusted::Input, - ) -> Result<(), error::Unspecified>, -} - -derive_debug_via_field!(Algorithm, curve); - -impl Eq for Algorithm {} -impl PartialEq for Algorithm { - fn eq(&self, other: &Algorithm) -> bool { - self.curve.id == other.curve.id - } -} - -/// An ephemeral private key for use (only) with `agree_ephemeral`. The -/// signature of `agree_ephemeral` ensures that an `EphemeralPrivateKey` can be -/// used for at most one key agreement. -pub struct EphemeralPrivateKey { - private_key: ec::Seed, - algorithm: &'static Algorithm, -} - -derive_debug_via_field!( - EphemeralPrivateKey, - stringify!(EphemeralPrivateKey), - algorithm -); - -impl EphemeralPrivateKey { - /// Generate a new ephemeral private key for the given algorithm. - pub fn generate( - alg: &'static Algorithm, - rng: &dyn rand::SecureRandom, - ) -> Result { - let cpu_features = cpu::features(); - - // NSA Guide Step 1. - // - // This only handles the key generation part of step 1. The rest of - // step one is done by `compute_public_key()`. - let private_key = ec::Seed::generate(&alg.curve, rng, cpu_features)?; - Ok(Self { - private_key, - algorithm: alg, - }) - } - - /// Computes the public key from the private key. - #[inline(always)] - pub fn compute_public_key(&self) -> Result { - // NSA Guide Step 1. - // - // Obviously, this only handles the part of Step 1 between the private - // key generation and the sending of the public key to the peer. `out` - // is what should be sent to the peer. - self.private_key - .compute_public_key() - .map(|public_key| PublicKey { - algorithm: self.algorithm, - bytes: public_key, - }) - } - - /// The algorithm for the private key. - #[inline] - pub fn algorithm(&self) -> &'static Algorithm { - self.algorithm - } - - #[cfg(test)] - pub fn bytes(&self) -> &[u8] { - self.private_key.bytes_less_safe() - } -} - -/// A public key for key agreement. -#[derive(Clone)] -pub struct PublicKey { - algorithm: &'static Algorithm, - bytes: ec::PublicKey, -} - -impl AsRef<[u8]> for PublicKey { - fn as_ref(&self) -> &[u8] { - self.bytes.as_ref() - } -} - -impl core::fmt::Debug for PublicKey { - fn fmt(&self, f: &mut core::fmt::Formatter) -> Result<(), core::fmt::Error> { - f.debug_struct("PublicKey") - .field("algorithm", &self.algorithm) - .field("bytes", &debug::HexStr(self.as_ref())) - .finish() - } -} - -impl PublicKey { - /// The algorithm for the public key. - #[inline] - pub fn algorithm(&self) -> &'static Algorithm { - self.algorithm - } -} - -/// An unparsed, possibly malformed, public key for key agreement. -pub struct UnparsedPublicKey> { - algorithm: &'static Algorithm, - bytes: B, -} - -impl Copy for UnparsedPublicKey where B: AsRef<[u8]> {} - -impl Clone for UnparsedPublicKey -where - B: AsRef<[u8]>, -{ - fn clone(&self) -> Self { - Self { - algorithm: self.algorithm, - bytes: self.bytes.clone(), - } - } -} - -impl core::fmt::Debug for UnparsedPublicKey -where - B: AsRef<[u8]>, -{ - fn fmt(&self, f: &mut core::fmt::Formatter) -> Result<(), core::fmt::Error> { - f.debug_struct("UnparsedPublicKey") - .field("algorithm", &self.algorithm) - .field("bytes", &debug::HexStr(self.bytes.as_ref())) - .finish() - } -} - -impl> UnparsedPublicKey { - /// Constructs a new `UnparsedPublicKey`. - pub fn new(algorithm: &'static Algorithm, bytes: B) -> Self { - Self { algorithm, bytes } - } - - /// TODO: doc - #[inline] - pub fn algorithm(&self) -> &'static Algorithm { - self.algorithm - } - - /// TODO: doc - #[inline] - pub fn bytes(&self) -> &B { - &self.bytes - } -} - -/// Performs a key agreement with an ephemeral private key and the given public -/// key. -/// -/// `my_private_key` is the ephemeral private key to use. Since it is moved, it -/// will not be usable after calling `agree_ephemeral`, thus guaranteeing that -/// the key is used for only one key agreement. -/// -/// `peer_public_key` is the peer's public key. `agree_ephemeral` will return -/// `Err(error_value)` if it does not match `my_private_key's` algorithm/curve. -/// `agree_ephemeral` verifies that it is encoded in the standard form for the -/// algorithm and that the key is *valid*; see the algorithm's documentation for -/// details on how keys are to be encoded and what constitutes a valid key for -/// that algorithm. -/// -/// `error_value` is the value to return if an error occurs before `kdf` is -/// called, e.g. when decoding of the peer's public key fails or when the public -/// key is otherwise invalid. -/// -/// After the key agreement is done, `agree_ephemeral` calls `kdf` with the raw -/// key material from the key agreement operation and then returns what `kdf` -/// returns. -#[inline] -pub fn agree_ephemeral, F, R, E>( - my_private_key: EphemeralPrivateKey, - peer_public_key: &UnparsedPublicKey, - error_value: E, - kdf: F, -) -> Result -where - F: FnOnce(&[u8]) -> Result, -{ - let peer_public_key = UnparsedPublicKey { - algorithm: peer_public_key.algorithm, - bytes: peer_public_key.bytes.as_ref(), - }; - agree_ephemeral_(my_private_key, peer_public_key, error_value, kdf) -} - -fn agree_ephemeral_( - my_private_key: EphemeralPrivateKey, - peer_public_key: UnparsedPublicKey<&[u8]>, - error_value: E, - kdf: F, -) -> Result -where - F: FnOnce(&[u8]) -> Result, -{ - // NSA Guide Prerequisite 1. - // - // The domain parameters are hard-coded. This check verifies that the - // peer's public key's domain parameters match the domain parameters of - // this private key. - if peer_public_key.algorithm != my_private_key.algorithm { - return Err(error_value); - } - - let alg = &my_private_key.algorithm; - - // NSA Guide Prerequisite 2, regarding which KDFs are allowed, is delegated - // to the caller. - - // NSA Guide Prerequisite 3, "Prior to or during the key-agreement process, - // each party shall obtain the identifier associated with the other party - // during the key-agreement scheme," is delegated to the caller. - - // NSA Guide Step 1 is handled by `EphemeralPrivateKey::generate()` and - // `EphemeralPrivateKey::compute_public_key()`. - - let mut shared_key = [0u8; ec::ELEM_MAX_BYTES]; - let shared_key = &mut shared_key[..alg.curve.elem_scalar_seed_len]; - - // NSA Guide Steps 2, 3, and 4. - // - // We have a pretty liberal interpretation of the NIST's spec's "Destroy" - // that doesn't meet the NSA requirement to "zeroize." - (alg.ecdh)( - shared_key, - &my_private_key.private_key, - untrusted::Input::from(peer_public_key.bytes), - ) - .map_err(|_| error_value)?; - - // NSA Guide Steps 5 and 6. - // - // Again, we have a pretty liberal interpretation of the NIST's spec's - // "Destroy" that doesn't meet the NSA requirement to "zeroize." - kdf(shared_key) -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/arithmetic/bigint_elem_exp_consttime_tests.txt temporalio-1.3.0/vendor/ring-0.16.20/src/arithmetic/bigint_elem_exp_consttime_tests.txt --- temporalio-1.3.0/vendor/ring-0.16.20/src/arithmetic/bigint_elem_exp_consttime_tests.txt 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/arithmetic/bigint_elem_exp_consttime_tests.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,123 +0,0 @@ -# ModExp tests. -# -# -# These test vectors satisfy A ^ E = ModExp (mod M) and 0 <= ModExp < M. -# Additionally, and unlike BoringSSL, these test vectors satisify: -# -# * A != 0. Test vectors where A == 0 (mod M) were removed. -# * 0 < A < M. Values of A that were negative or larger than M were reduced -# (mod M) to be in range. -# * M requires at least 4 (64-bit) words to represent. - -ModExp = bbad67352704a6321809f742826bf3d1c31c0ad057bf81432abeb30dc9913c896c03e69eb1cde6b78ffcb320c4625bd38ef23a08d6c64dc86aec951b72d74b097e209ce63092959894614e3865a6153ec0ff6fda639e44071a33763f6b18edc1c22094c3f844f04a86d414c4cb618e9812991c61289360c7ba60f190f75038d0 -A = 855144760f2be2f2038d8ff628f03a902ae2e07736f2695ec980f84a1781665ab65e2b4e53d31856f431a32fd58d8a7727acee54cc54a62161b035c0293714ca294e2161ea4a48660bf084b885f504ad23ea338030460310bd19186be9030ab5136f09fe6a9223962bce385aaaf9c39fe6ed6d005fa96163fe15cdfa08fc914d -E = bb552be12c02ae8b9e90c8beb5689ffefe3378d2c30f12a6d14496250ecce30317c642857535a741642c3df689a8d71a276d247ed482b07b50135357da6143ac2f5c74f6c739c5ff6ada21e1ab35439f6445a1019d6b607950bffb0357c6009a2bfc88cd7f4f883dc591d4eb45b1d787e85aba5c10ee4fe05ea47bf556aec94d -M = dcc24236a1bb94c71d9ec162a6aa4697b932717e82b667cad08b6bd1bbcbddf7cd167b7458de2b0b780486b39574e749d6405f9ede774a021d6b547271523e9e84a6fdd3a98315607ccf93356f54daa9c75e1e311e1672d0dc163be13f9ed6762f7dd301f5b0a1bb2398b608f40ac357ae34fc8a87d4fef3b961cbdb806d9061 - -ModExp = 24eaead5b57883c2f454928f8edd470a344bfe07a953194f7d635d705ef13ddfc64140c8ad6f363d4c828e7c7891a6b6d4df37335de4552c319dafd1c06d1f743240082a3535df4da1475d3eea3fead20e40815fd5a0876c881c162ab65a1eda494280c258901ca953d1d039a998bf0e9aa09273bbef4865f3054663b72d75ff -A = a31618b4532f53729ba22efb2221432fab1dbb70853d6a1159b42fd19fc949965c709b209de106a652aa422d88922ce51dae47f7f6deaf0055202e13db79ee84fc3d3c6f4c003ef96597c49d6895fa53c22ac9e4819f7048146b5272f6279424fdb389819a0b251c823c76f4bebf4f1246de455aafe82a0d34454f5039e90839 -E = 9f43dcb641f3ecf4dbc97450f2bdf3b7ec6a2f3e8e96bb1df2bf34b8d2d78e1a9018d04d960ffd0e932cfc60d3b9b923e3f9f29b3f3d61cae3a9f7245078143475c7fcb896ff200f7d94c4f2708bb42750e37c185a31c876814e4f06a00771707654e1da2fb69c16b6500b16385e3b933e2276ad3569977473f699b1c7926c3b -M = cd607549668469b792f495c141e500871880b0611c8004293a561ec7f9ab6561f8a9b90872742386adafb5cd1890e8204ae12aec529cca0a9e382c96439137f09de9973b12c8492c62847e107deabb7dd946ffbb9d0ac73b462c481092bd65326a17f21d8d6527c47a5dba50aaa20c7048b8788a49eb3ea5f29bd5cfce24eb3b - -# Craft inputs whose Montgomery representation is 1, i.e., shorter than M, in - -# order to test the const time precomputation scattering/gathering. - -ModExp = 9442d2eca2905ad796383947b14ddfcc341f5be8fec079135c36f6f0d9b8b2212f43e08bf29c46167ff0fe16b247cd365df4417d96cc31c94db1cf44b73b0ee3ebcc4920d9b0d003b68e49c1df91e61bc7758a8a1d2d6192ff4e1590b1a792f8be3a1b83db3ad9667d14398d873faf5d885ec3a2bef955026fae6dbf64daea2b -A = 3a4b4c57e62c5e9d1a9065191f8268fed9d5f6f424d071acef66f0662b8210f4c029ed991512e40c9c912043c816d2c4c5b53fa0e5c253e16808aad4225130dafbbb89fd4f30cdfc1c2f2179b636a7ddc4be579795820b4b9377637bd8a21a0ef5a90d0e0f865321eee23d9be2a3b7320b4012d02941b892df2c40bdc85c1898 -E = a2c56ea1362511cac0301918e15a9afe7d37edd438a5c3538d258ea01f0a6df758de07111e868b3ad8fc89b629b4955d78a1b3af902be1806410ddde25ccc6a196ba5949395c1ad5d8725b18815dc1cd5ac1c7dd17773f571e3f2e628255af14476e0494be23a4a4dfd18e23142f33d7a59c236fec61660e360d9676a747c69f -M = ede35a3a7afac817d413373a2032abbc067b1493f709ae6e1282ee5469743391d891b904938857168802b7872d3cd7ac18ab249a9e540a86f970b1d0f310a4cc29df1cc9d4063d98c554f1a32f4ca5eba3523cdfb142e0fc609907c7a92bb0187009d97ec471db3545f42dd5fd29c07b7816085d09477ba31fcf90084660116d - -ModExp = c15ae334455d9f4d1030cd33e734726a27c63624c2afc576238cce5e0498298a4a0c93090a0d19568b41290303c4b558f3d9dd74f9cde8798710f68569ea0d6fd971ce67ec5b54495031de3d8842b8b49288725bee5c9f72b99054d64986ccd4e18d70d5f33943f08cd694eff538f84438ea993ebaba0910c95b3a694f213510 -A = def633b955a917569df3ba8517455eef0655e7a35985edda27097a063e0d82c7c3a76dc36c5d8a71ba9d540790ddd0ea514aaed98925f9a1808eb288d387aaf9605a9ef8a333ebee7ad7057bca012efd619d5867f02266f65976ef4b16da17468426ac4f99b3e8921707e01b4de20f6f9a068e6a19d872079a27f3a44449db83 -E = a465c47b0d15d48e01bb8b1d8e3b3253e11515f6874dbed6c25818adf1a8fd927124d5593beb367f685c11e46f18415be73ccdf16fa2e93a600b728163d21d232849e5278c3749d903edad3f1c4535a2f55a2ab65e7ebc64888bd2a0527e876ecf38cec3ab1980d08138709fad8eb88ae65d960adc3f0f8e92f784fe96fcb693 -M = e43cb9ac1446154356cdc31ec771c79b0e461e22d95185bbe1a279c0945e3af07903a0cb54d553380716fcdcafb4b7cf5dc6da481dc74a8c583d75ff6c1f8e429182d200246ebc473bb56e173787987c1b7fb2dd23f5b2e438a97bc4a1df628bc044fdd1e80c0cf37030adb7b04784dab827d0dcd64f0dbf37c980612570ce11 - -# RSAZ 512-bit. - -# - -# These are regression tests for code which historically reached the RSAZ-512 - -# code. That has since been removed, but the test vectors remain. Note that the - -# lengths of the inputs, especially the *bit* length of |M|, matter a lot. - -# Control: No relationship between A and M except that A < M and they're the -# same number of limbs. - -ModExp = 7f34c1cd63377bc3abf2bb5b2d1bf5f06454e1e8040fe19a72245ce9731cbee1bf9e84532300776c8021ed4f3a8de508d85b4cf320bd82065a013754857b50c4 -A = 8e4e67da6ff890643d0599387955996ef6f0c2045eb9944576ddb965ca64cdb6247727ce128ef178d4a84e5a56d2e67eb0fe389ecbf691f9244ae80f4c11b364 -E = 0be99d8f0650e540b9b191e9cf96f74881b902e32ed169ffd8a1776c3f3e80f0ac765aa14615713e1549f250a20fe4ee48c4e0c6176162fc7842a0dd64d640d1 -M = f12f2c19ee1ecf2c999b87bdafde60eace3790faad8f9adec13b14c6dfb69f8795a1d0fe65494250b59534014b918453042012952ae6f5786342999600725491 - -# Same as above except A was negative. - -ModExp = 71fa6a4c8ae75368eda8cc6282c26afa69e2af12a97fb9444f16b7dd6c99e0a5d6034cab4248cae4357346b211039f4a2bc4c5a20a297372094162417af703cd -A = 62e0c43f7e263ec85c95ee853688c77bd746cef64ed606994a5d5b611551d1d1712aa93052ba50d7e0ece5a6f4be9dd45321d9f65ef0637f3ef7b186b460a12d -E = 0be99d8f0650e540b9b191e9cf96f74881b902e32ed169ffd8a1776c3f3e80f0ac765aa14615713e1549f250a20fe4ee48c4e0c6176162fc7842a0dd64d640d1 -M = f12f2c19ee1ecf2c999b87bdafde60eace3790faad8f9adec13b14c6dfb69f8795a1d0fe65494250b59534014b918453042012952ae6f5786342999600725491 - -# A == M - 1 == -1 (mod M) and the exponent is odd so A ^ E (mod M) == A. - -ModExp = f12f2c19ee1ecf2c999b87bdafde60eace3790faad8f9adec13b14c6dfb69f8795a1d0fe65494250b59534014b918453042012952ae6f5786342999600725490 -A = f12f2c19ee1ecf2c999b87bdafde60eace3790faad8f9adec13b14c6dfb69f8795a1d0fe65494250b59534014b918453042012952ae6f5786342999600725490 -E = 0be99d8f0650e540b9b191e9cf96f74881b902e32ed169ffd8a1776c3f3e80f0ac765aa14615713e1549f250a20fe4ee48c4e0c6176162fc7842a0dd64d640d1 -M = f12f2c19ee1ecf2c999b87bdafde60eace3790faad8f9adec13b14c6dfb69f8795a1d0fe65494250b59534014b918453042012952ae6f5786342999600725491 - -# Same inputs as above except A was negative. Note that A mod M with a "correct -# top" isn't the right length for RSAZ. - -ModExp = 01 -A = 01 -E = 0be99d8f0650e540b9b191e9cf96f74881b902e32ed169ffd8a1776c3f3e80f0ac765aa14615713e1549f250a20fe4ee48c4e0c6176162fc7842a0dd64d640d1 -M = f12f2c19ee1ecf2c999b87bdafde60eace3790faad8f9adec13b14c6dfb69f8795a1d0fe65494250b59534014b918453042012952ae6f5786342999600725491 - -# A was negative, and A (mod M) is the right length for RSAZ. - -ModExp = 8d76eb0f8c7bc3160cc8bb0e0c3590fbed26c5932f5f525b48045c0bd46dda287ba5483f97c851fb7c12c2e858ee7a4a4d1af745cbfb3eb311fa54bea12cde25 -A = 712f2c19ee1ecf2c999b87bdafde60eace3790faad8f9adec13b14c6dfb69f8795a1d0fe65494250b59534014b918453042012952ae6f5786342999600725491 -E = 0be99d8f0650e540b9b191e9cf96f74881b902e32ed169ffd8a1776c3f3e80f0ac765aa14615713e1549f250a20fe4ee48c4e0c6176162fc7842a0dd64d640d1 -M = f12f2c19ee1ecf2c999b87bdafde60eace3790faad8f9adec13b14c6dfb69f8795a1d0fe65494250b59534014b918453042012952ae6f5786342999600725491 - -# RSAZ 1024-bit. - -# Note that the lengths of the inputs, especially the *bit* length of |M|, -# matter a lot. - -# Control: No relationship between A and M except that A < M and they're the -# same number of limbs. - -ModExp = 8984f8c16044f9c0ad7bd72347af90f58e6e003acda92b76e3c7c4a56ea8e918409d8e9b34884d4c89d0b17cb40fe898f2627c084a0f1698e46beccbf6f48eecc281e11ea9e5135adba460ddae157f2c655b5f589ce29b254d43a960a71cede8a08dbb86be4dac22458da232fb1ec2470856827302ed772c9ddafa408c931aa7 -A = 21158da5fe20356825e72b3f5384ec57720d22f727b27ce2f945c8ee311db781add73bf8fae96b775c909bd22fca75c44c2b0584284a5bb1c07f8eefcd6b0a44047a02b185df34f897f11d4fb9a86c9eb841b4cb8d0383441fdc5af3ef385b5e8380f605d73ed41bb42eb2c2a5704d6034b3ad058dafffce83dbbfb6295daaf8 -E = ecdebd112b3b5788669449dcddbd479a203ee9ab72a9bb9c406b97623513bf0ab9a22f1f23634d269e16bfd6d3b64202b71fc355057411967b6ac70f8d9cef0a4e06819a9a18cc06bbe438243fa9759303d98be8a65dc1cb13595ee9b99f138554425d50f6fbc025d8ffa3eaea828d6f3b82a3584146bafde34da257995f0575 -M = ff3a3e023db3bba929ca4ededbace13d0d1264387b5ef62734e177eaf47a78af56b58aacc8ac5d46f5b066bafb95d93d4442bb948653613eec76837b4ffb7991cb080b6c8b403fb09bc817d026e283ee47ab2fc9af274b12f626eda2fe02004a8e27b9ed7d3b614e8955c7e7c2c0700edd079455237c4475fbd41857e206e4b7 - -# Same as above except A was negative. - -ModExp = 75b54540dd6ec1e87c4e77bb93fd50477ea463fdadb5cab05119b34585d18f971617fc1194240ffa6bdfb53e4785f0a451e03f8c3c444aa6080a96af5906eaa508862a4de15b2c55c023b6f278cd04c1e24fd0711244afeda8e3444256e51261ed99fe66beedb52c43c825b4c7a1adc7d4b111e2208ecd495df91e175573ca10 -A = de24b05c3f93864103e3239f8827f4e59b05414153ac79443b9baefcc35cc12da8de4eb3cdc2f1cf991fcae8cbcb6378f817b6105e09058d2bf6f48b82906f4dc68e08bb05610ab803d6fa806d3a174f8f697afe2223c7ced64a92af0ec9a4ec0aa6c3e7a5fc8d32d52715251d5022aea853e74f95cc44a777f858a1b8a939bf -E = ecdebd112b3b5788669449dcddbd479a203ee9ab72a9bb9c406b97623513bf0ab9a22f1f23634d269e16bfd6d3b64202b71fc355057411967b6ac70f8d9cef0a4e06819a9a18cc06bbe438243fa9759303d98be8a65dc1cb13595ee9b99f138554425d50f6fbc025d8ffa3eaea828d6f3b82a3584146bafde34da257995f0575 -M = ff3a3e023db3bba929ca4ededbace13d0d1264387b5ef62734e177eaf47a78af56b58aacc8ac5d46f5b066bafb95d93d4442bb948653613eec76837b4ffb7991cb080b6c8b403fb09bc817d026e283ee47ab2fc9af274b12f626eda2fe02004a8e27b9ed7d3b614e8955c7e7c2c0700edd079455237c4475fbd41857e206e4b7 - -# A == M - 1 == -1 (mod M) and the exponent is odd so A ^ E (mod M) == A. - -ModExp = b5d257b2c50b050d42f0852eff5cfa2571157c500cd0bd9aa0b2ccdd89c531c9609d520eb81d928fb52b06da25dc713561aa0bd365ee56db9e62ac6787a85936990f44438363560f7af9e0c16f378e5b83f658252390d849401817624da97ec613a1b855fd901847352f434a777e4e32af0cb4033c7547fb6437d067fcd3d964 -A = b5d257b2c50b050d42f0852eff5cfa2571157c500cd0bd9aa0b2ccdd89c531c9609d520eb81d928fb52b06da25dc713561aa0bd365ee56db9e62ac6787a85936990f44438363560f7af9e0c16f378e5b83f658252390d849401817624da97ec613a1b855fd901847352f434a777e4e32af0cb4033c7547fb6437d067fcd3d964 -E = 61803d4973ae68cfb2ba6770dbed70d36760fa42c01a16d1482eacf0d01adf7a917bc86ece58a73b920295c1291b90f49167ef856ecad149330e1fd49ec71392fb62d47270b53e6d4f3c8f044b80a5736753364896932abc6d872c4c5e135d1edb200597a93ceb262ff6c99079177cd10808b9ed20c8cd7352d80ac7f6963103 -M = b5d257b2c50b050d42f0852eff5cfa2571157c500cd0bd9aa0b2ccdd89c531c9609d520eb81d928fb52b06da25dc713561aa0bd365ee56db9e62ac6787a85936990f44438363560f7af9e0c16f378e5b83f658252390d849401817624da97ec613a1b855fd901847352f434a777e4e32af0cb4033c7547fb6437d067fcd3d965 - -# Same inputs as above except A was negative. Note that A mod M with a "correct -# top" isn't the right length for RSAZ. - -ModExp = 01 -A = 01 -E = 61803d4973ae68cfb2ba6770dbed70d36760fa42c01a16d1482eacf0d01adf7a917bc86ece58a73b920295c1291b90f49167ef856ecad149330e1fd49ec71392fb62d47270b53e6d4f3c8f044b80a5736753364896932abc6d872c4c5e135d1edb200597a93ceb262ff6c99079177cd10808b9ed20c8cd7352d80ac7f6963103 -M = b5d257b2c50b050d42f0852eff5cfa2571157c500cd0bd9aa0b2ccdd89c531c9609d520eb81d928fb52b06da25dc713561aa0bd365ee56db9e62ac6787a85936990f44438363560f7af9e0c16f378e5b83f658252390d849401817624da97ec613a1b855fd901847352f434a777e4e32af0cb4033c7547fb6437d067fcd3d965 - -# A was negative, and A (mod M) is the right length for RSAZ. - -ModExp = 9cf810b9e89d5cbc4b79ae64e123ea06d92965e2bab077df97a1b906dc2e1ddcf96a9c4ed14e2cd96309b829ea9cc2a74a7d4b43c5f34d792a7c583201427754b8f78b783608070a84b61f18913e3ced7f7f530972de7764667c54e29d756eea38a93cd1703c676a4587231b0ebfeadddf908e2877a7a84b5bfc370ecf0d158d -A = 35d257b2c50b050d42f0852eff5cfa2571157c500cd0bd9aa0b2ccdd89c531c9609d520eb81d928fb52b06da25dc713561aa0bd365ee56db9e62ac6787a85936990f44438363560f7af9e0c16f378e5b83f658252390d849401817624da97ec613a1b855fd901847352f434a777e4e32af0cb4033c7547fb6437d067fcd3d965 -E = 61803d4973ae68cfb2ba6770dbed70d36760fa42c01a16d1482eacf0d01adf7a917bc86ece58a73b920295c1291b90f49167ef856ecad149330e1fd49ec71392fb62d47270b53e6d4f3c8f044b80a5736753364896932abc6d872c4c5e135d1edb200597a93ceb262ff6c99079177cd10808b9ed20c8cd7352d80ac7f6963103 -M = b5d257b2c50b050d42f0852eff5cfa2571157c500cd0bd9aa0b2ccdd89c531c9609d520eb81d928fb52b06da25dc713561aa0bd365ee56db9e62ac6787a85936990f44438363560f7af9e0c16f378e5b83f658252390d849401817624da97ec613a1b855fd901847352f434a777e4e32af0cb4033c7547fb6437d067fcd3d965 diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/arithmetic/bigint_elem_exp_vartime_tests.txt temporalio-1.3.0/vendor/ring-0.16.20/src/arithmetic/bigint_elem_exp_vartime_tests.txt --- temporalio-1.3.0/vendor/ring-0.16.20/src/arithmetic/bigint_elem_exp_vartime_tests.txt 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/arithmetic/bigint_elem_exp_vartime_tests.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,13 +0,0 @@ -# ModExp tests. -# -# These test vectors satisfy A ^ E = ModExp (mod M) and 0 <= ModExp < M. -# Additionally, These test vectors satisfy the following constraints: -# -# * 0 <= A < M. -# * E is odd, and the number of bits in E is in [2, 33]. -# * M requires at least 4 (64-bit) words to represent. -# -# XXX: Unfortunately, the above criteria exclude all BoringSSL test vectors; -# i.e. none of the BoringSSL test vectors were suitable for testing the -# variable-time exponentiation used in RSA verification in *ring*. TODO: Make -# new test vectors. diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/arithmetic/bigint_elem_mul_tests.txt temporalio-1.3.0/vendor/ring-0.16.20/src/arithmetic/bigint_elem_mul_tests.txt --- temporalio-1.3.0/vendor/ring-0.16.20/src/arithmetic/bigint_elem_mul_tests.txt 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/arithmetic/bigint_elem_mul_tests.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,782 +0,0 @@ -# ModMul tests. -# -# These test vectors satisfy A * B = ModMul (mod M) and 0 <= ModMul < M. These -# are the subset of test vectors from BoringSSL where the modulus is at least -# 4 64-bit words long. - -# These test vectors satisfy A * B = ModMul (mod M) and 0 <= ModMul < M. -# Further, unlike in BoringSSL's set, these vectors satisfy 0 <= A, B < M. Any -# A and B values not in range (negative and/or too large) in BoringSSL's set -# were reduced mod M. - -ModMul = 09fcf6a47addfa336557749821a88ccd2573a5ce2c3094a17d9a29b33e043bea165499e89fd2c939f17a670694aff05e9af46836b62c96e597c83681092d63ab9d6e22751aa8fd4b9ea94a90a373876ef0f6514304a495edb5ca1795c9ade7965c70f9aa92f8ea460ccb670e9a62c81e9c -A = 071b93fbad39b1c2755f2051ff7d532d59c985756410d58aed3947d6ae737ace5aadc35e7e0d29c684b9d4bec9c0fa277996bb30230f70431cb7b905 -B = 0167be8381a3392dd4df62e150025e13b388bf366922ba8632614928922cc290772135857d1b5234d51c27862cb1a055c1b86260b6ec -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 8e2ba940fc5165c6c5f7f4cb55cd89d1d5f59e90e78730bd66fb120a814514784879dc43ad4f355030ddb3486a59bc34b601474978a94ddbceafdc0ee23cb18708bdbd824d37cc32577802ac6057fef29a71f168e816309fc80cc46f251e7289c6a57fd222d5868263360af63dd73e7c8b1dd6b3f3b6939849580b9231940a4d -A = 1220ac4bde4feca135268550ddc79d8b05ff72f483b39f77436f348c4f5360c22c598f7dfb76697bf6d2ae86c68e90748b8b729b25f932b2e5fd33f3b5 -B = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9907b5bac6168216cc456c082ec793bafddf883bebc38372fc842b01cc47fa9cc16a8f07069b1314f77f20f33130cee31ca9b4cfddd79c45 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 8e2ba940fc5165c6c5f7bcac0e449b64801e75134a390f120acc58cbee43888f50d07f7aa6dc2b33643c025cf745434d20eb1aeda8fcee5fa3fa5baf10d67c21390297857aa50bbcc4a29a6b10885f97fea60f1b88fc72512c111b938142ee8d67545efe386622162e8fd50418b09769b8c22efe54fdacd652580d609f0528bf -A = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f4253911356f785368d3bb46a073963c8beeb9739df5b75cd3ecd3b6b228a6757a7444b7e06442c1cdb66aa4c900722e807ae756e1c21c172947c289ee5a295 -B = 74147c93e729707111d0d531b1c135453f3e59f63a7e082b43dceb8b16cc5debdb6d7c0ce0c00ec9b5ca51e7673e411c3cab34938124db6a -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 043c47d7e319c32a758360dd726a1d91e2cf5c57f73cdf9ad2040e61a9c282a2962d96d300e04288461eb1ed37df19e6b88f104a250f9885898740f6487b081515314e0a217df2d4345d3cf81eabb2bfb346b634b9c251624748f6e9407cb677aff4c53fcf42cc027de267e6ec011e14bc7f3bc6666f693d21 -A = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4d5c014b0eb5d5b5c839a5d5b7572ac8329de6665a5a87fd00e438d2441d47dcf1b19b535b18d53296dcac91075597851013912155313915e06865901ce22d68 -B = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c623c36607369964fb48dd46fe84d9dacfae837c588fe9a6bab47cdb7d1219fc57a5f62d44da48f835937d1a60c9d7f1ff5b4e909c4fef5dcf7c00 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 768293c84c431b9c8dc6e538ca3f856c60ae5e1aaf42325865418b7bed16c7fc2589968319cf41cb370657c8edc7b969de10e0566b64ec796470b630e22477e7aafb38e99b6012f100c9d23d5517d486e3cab1fc60c1568c0228c9b55d2d77d23b1351fe37ad4fbf9c07f29330a539de4a32709d043dfc9e21aa1a -A = 06bbaeec78b6a41818b7eec42fa3be7d639dfd86fbace2bc14e0369dba6dd3f04ede8b808743d809f43f70f1146dfdb1d649546441919e27f1f7a9760da4a3b152 -B = 1199dc2f52868a0cf440f6666b576541c7aec1e9cee14c1d22010ab0f53fe8bbf3029c639ff78d89dce82de85fd8eda4e67395d435df60158623c5 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 8e2b90afbdafa02ce68d537ae807b4e7f3e05a66b20b84cff309941fc3150f99d083841ddaf6f19f5a76886ad5d853c73051a0457e95eeb0fe3776a084a027ee77d14f3825713a59622ea163a679cff904db33bf6ab23b06eb4b31f4e34fb122c8c170321164439db783e7bec1c265eed33f33bd9cb6d1611c00aa18a9b4b90d -A = 1c4821515167f7073d4b7cfa318ead1da1131499c12497447846caa84176a9d4af576fe549fd8b0f77bf8dbebf6c395f84dffd40400101bf28b1dda0bbdcc5da255e -B = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf557465589a08cecc3c6c45f7d537ddde56f33de3ac83426348c53cdb3f78d4dfbf23f8902b8839ee1bcc5ff6faa180a5dba95522a4ffd354f07491cbc2 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 33e8e8e193b4b99d8bb382c29c1fc5403190d7654f43cd77e28d1bf77bc3a728dde9de9a89c6522ebc7222d25f46833fd1753a44275b04485c77b675d816090280b3541ca61bfa33921a79f7286830131d6eba13acc46cc2c449b3a359f1cb49d67a4d0cc1245f3f8b59b1684aa0c3ff1c928b8e880a3375ed811dffc991fd1d -A = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6dcf2f4d4e43e42756582fc51bafaafa1032ec1edeaa1ef606bb49906b5053a72b7a1e379587d75eec2c84cdaab7a419d60ec6b4fbb0bc45fc4ef8dcdfb5771cddbe1c8f -B = 049ff858c7081392defc3ba12ea8869fd61188ff15d9339be72657b00530b851de53b1fcbe16034816e73251fe1ec97bcecd8bccc470373974287ca328af -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 2c88dc40414969e8b614bf8db05fbc38fb2b7ce144d7e707f9f8eca40ae2309c1fc67e713a8da5fbb20e808ad20aeb369cb72a77fd285e38a7895ec0fc795ade4ef1f1680f3a3b3cee4569cc9d5e699984daab3385815d2e515ba5d67d21dd1defc12ca81bc8ea645f8f8d103b4a0a9cdc92eb50690c07a037df274bbd5217e4 -A = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3e06321ee2696a19ec7b419af70b234534841284d8b2775789ca6e8ebfd01171ae8a064df04a074fe1003967eba4f81c805fcdd2d665a0fb1f6d58c20411cb5fd820f0aec9 -B = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f20c758c506fa6efeb577db1da2f76a34fdc71c83882bd63ab72e7727590a1135337032b5b2538d79f6894be4a4561f8056c95410047b7b2b5b68ebad20159e -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 0674885ca3ef617a53eaedb9564cf96bcde131760ac541a81f4b25c174a6fe1444c2c206f7171e343e1bb43f81610162994c497419e75aaa25b664c122ed2b27640b45bf646fc5da1703fbf1cc66e10a3c306eb69ae5f937081a1a18dfc8db376ea18f4c1c499109b0cf8806eb32cb1f28985da790047bd7b32c1f67bffb9761 -A = 0413cbcbbb5851a4ae12555801f7f80ccd888bb82ef1b5c31b99e1901d7e0ab91ee489c84044bc21fa2010f11aac21d0531fac09feb482fda579cb9f224c3149dd6249b0225a -B = 01b6bfea70f1d80350eeb45f9a5cebda954d72cf5cd27a299ef5a42e1ed0b50a541d1657b70e50b0cab69b22e31d0944fd735957b1ff764865d9385af302bb802b -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 8d74ba5fdc67733ced4d468f6eb6ec4c1ebd79c97682c1d4daa06105788ed9c5144992e555d903804d7ed0dd9b29ef2648568ab7ff462a03e0bceb5482485afc3b91448fcfeba435dc587db6f3a022428d37fa0e85392d0e48e7d4ed6b21253084e653da8175587b3b709e28426cddfec8d9dc582d4ac2f3d540305c0fe17327 -A = 17c0b7f0e2cdf316e4d32f040e26d41dbde1e6689d98f0652da1c380daf5dfeb6a511b72d82f1b32d3852e9aa2f594be10776a8fc89a8a35c160e8e41b42a06a342fa1c309fd82 -B = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e20210fd8419b49f890a1a7ceb4118b85670e3ab9a5410a9c26f852de0edfefb003e303e4d06c2398d730641a5849ac5cf7984febf3a6465387c6cdcc348d237dbaea13 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 57e60f79b4e156ccec4c253e70df8d86e4aef326150d612a5ac4dc285761e88ede412d28d9dfa5a6f5c073d3c91a65ba9c86067d81f296935f0d0ebd2af82e7f6b5b336422429cc3b8427fd8d3f5a6fe936f4208362632093bdd3cec1aa8f4b176d260f605caf4a12cc011f3d1b76135ac2507346674e41673eb16c0f55d8010 -A = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7ae0e0f17d667641f443e6a865e9d2597d7f2ae957fdc4c1f68bf280d032bbb325a2fcc156b9c3063546008180884fdfb712ae15feeb185252500fc928116539fdb8e9a0b24ae6b39a -B = 723db98a78f42aa45496f31cf78695583526d25e167da48ec310e447ad3540be2636813a2c2f7b8c622795ac451992e91bb8e43e5737f0dd95623282e729d815b08ed8 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 0237eb5726e2c628a515104bafd44348dbf099569815784eca5d6a415d3c12421c8c70fee23d6d82f7b5b136b70ffed3b6d9e98cb47854e79239d96c26f2ec955e4ea8dabc29a1b0765c9b7af6ef09ca673d1ee21c680e4b8cfebf47bbc74c993d017ead6cb6f3319ce4de9e9765cdb3ed8fcc57a1b153327e1a6a965e5dfa89 -A = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763ad7e109313b9830bbdadbec27cbbc9b3d25b0f0882bed6846d14770e56874eb5068533b8ff5988dff7d9748d2ed04b670390ead5ad7a060e77c29f040969a229308a27f5e2e33ee9f90a -B = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3b821bb5db6fee060cb22e5bbc7d2f950d181f1f39642acbebca9b295a63272bc3d7dd2f560ae637ca4db44b323e303d3fe20f2c71091e71aa64ec4c3980ffdebd83192136 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 2f1d500443fc4f4b86e7ec93e4d0dfd3faabda35a6dd31445021928373be14c37fec369ce80ebcb77aff2151b7ea94d21592da1823ebfa0af196f286d7a69ea54799573bdcd4d09ca4f33b8a3a93b35de5ff7f65099d59367914f1c79440b471ced6773b0802bd8ca99cf531b62892eb1e78d67f8210592208859b0aa1754b14 -A = 0572de2984fe2ed0d5ebb5bc3f62b197fd592795d91cb16b48a0c898991ee3e884e5870b92405f248036ef9b3898c5ee6100a09ede5a48bf7edf3a067e4fc77e7e6bf6a6e3d4f538e3d66f -B = 12c379402b18a34dc8b80c0dcd25be16c99d6f76d5d64b6050b90910cce594bc022794640735710c7ded857ebd44fe5b2e51574a2296f7d7a61b59c0123051bf2ba4a168cf8f -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 4001c734e1391a88640007893f167eb79ef61e4717d5eb14b8d80c25ed59c753be63fc8e54bdaded22c9c7d3e49753eb49efa010439807dba0d90ec4f9b498aa97f109af542bb41922936223213ddedac4d0fad8f1446498f4228b758aafdf1d9692f59029c76ca2832125ba50e811cb95f2b982a7a4d87b4726e6dd8b1963fe -A = 16792909716b581a936287d0a8550a1f3e840935f0f3ddca75aa32e3489269b078fd19a16f8d6b2326eebaf46da76e90890c0ead3b35689bfda8c1ead17a4f672588f982cfd3da2c2b9bdad9 -B = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2f60af132627de89a4bda1ecb8d38fb8f26e5501e4d7d4b7f98a7af2c8ef53ed37ecf8ff31150e4bb9be0e520ee1a212a1e3a81dba46e4f469fa8f2cd9754beb63f7c1af6cabd001 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 1bfad44b58d3f8bc987116d4cc7ac98f89f838a8712d81d726189e9e1469cf46fe04675dc0b82e6e556b02c350ef4e30ec6203c7f1df937ea80f435af7c10f48538fe7755ba78993f304e64ca0d783b0f46f61bd14fd3fd30768f233c59018ce911a94b495f58eb96438e416ca3c7eba5b1bca9dea5a770c1d2d9f2f62f821e5 -A = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d1b500bcc03a4bb2951f3738cf8019af41f326f1cb11a4b994a0d6bc78d8f901434b6ff1a30e498a2a826f80c91608b12b6de650dbfff61ebae61265ae25da83e67ac5bbba6c95e9e70b9370d81c -B = 04920f870cf9f371050e64a419ebe07ac92dd3525b41e8ecf6939a267e1ba853d54862dfc95dd21b3526eb0a0a7a7f8fb67df2e9472dbec81e15cb13266257177c5f2b92fced4cea5d -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 6b0b84505907a5ca37abeff9a5ba169975792c69b5751d9845c0f09dea833fb679c8dfbf3895bc470529e0cc736c9b4a0d08b75d709a1d04525ae583c5ba082d3bca1355055c7bb674aa1b92689cfdec4dbac84a96e81c855280e417f60e7e4931ef4f428420c0b85d2cd11c1030a47788d6ee6af0a76b5364fcf23b270e9d4f -A = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd3033f8e55637ffe56fdfc4cb8360a8733ad2dffe3369c98477e6277e7b303093df796dd63be8d650acc21b259787097a4ffaa8c997da01f2fadd78535cefe9bf6aa9684dc36d05722f4a080f9cad2899b -B = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da76389a6557af54b3487afde915c649b73b87e3c33d79883c54f73b623fbde12516b52fa84bc2fb0361c09580a1fb7482db75d5718afd8918522ea0f83d62f95527e4154ba016856c10c2ed8 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 6bce40524278ce242b0b5292d27751a3dc414f962d9c1cacb45fa3ee693ac6890d2ff1647abe578c40ea8d4b326a2e0e2fa7cdec28fe2da089338b5fed91c4277cc5be37537eec2f17edbf48a45fbe38f15c58c3e733d408d001262dbd40c9d246c323e7978df4fb7207aa9270a12921743cee2a483e7e71b221b09a6b2c667a -A = 0402671b0cfe14655bc650bd35dd0c36ce7f65de274a0cc4b708c6f6c3e84c2125ab2430e702421904950b29aa8a03b049910305127890457cd0cc97a3e05df67f29d28b0452969986959df02f59d207 -B = 01648c29205f19fe4c646eb62e8ae9b65260c2cb8424a526423c6bc04ed55870cefef9b8ba808f8ed2e1ab170e2e411f68b934abb1a22776969f79f9420f8bcbef28417582942e26646af60a -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 40db38dcdc201648da555f1062bbbb92c632c29b66902eabf90d98dec69ab3f3b28e60cad1571e7246f4c9e6aa62ad26a6d0bc08598c7a8571fa830cae4c2875c5c95a59f3295f998681edba7749b7e38cbece8887a7823b4752165e1a897e638836d408f439f009d0fb6c196e83e83ca3289d2bd0f0eb36b721331e4f9f80fd -A = 14361ace8ec5223bf0165b78913b77ef921b7089bb5e28891d120bd3db6513ddc90404a4e6cd027f9b51fbc02e80d376d59e1f2b043954199ef8218bf26cacdc5e749f668ad3b4ab35cd796f94c06307e6 -B = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22555c011f02ef45c8d3f764b2426d4782881936d561ea99fc32451431712a0abfa195b32546c1a749b14ec8f78bbde852f3a1da097fbdf1bc6dec05a2cdc3e020c6b960a3ad6cbcba146103aab -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 4b085796665458b798f824d1c1a88c23ecca456fb88713b433228ca8735141a616633ccec4bc53ea4f6e0c74e4aab6fece2e4cc4c4efb479638cf54caf55d4addf75908076f5fb487ed00d540e5b984acb8f81cae3ef51db926a06382a288092b352793de721c23c371fd0ce7a789486b2e8b867d35f47b5daac2d339d22dbde -A = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac7127ebd9ddfbcf524d3b79f6b9a32ff89b0df3a496eb286f4f2e2497a75ef26f04c3d9e8a1f461e1c9be3a8d16b8b75617e60104c4970761de1d6a56a5a4281f14c74e7eef2371b8da83767388108f5c0da0ca7 -B = 4f22597947638b9a9e9b9b7c2a8d37f77259f1bb1c7db65003b6e1a1c807469c84c89a75b80bbe0324fc3aeefaedc6ad9c0d9e470dac9c30bc48f6abbbdce9547ad7624f0ce9ff3cb6be23e47bc7 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 2b90a57349ea94ea818207fe15c164f9d3530c7cdffcae178557274552f79c4ab56acd78033a570bd6c3e45789704ef0b0ef586594fe4cae3ccfbf9ceef46e769589b084adcee3ef8345375b7103232465b991273df724964248737d5eccbac558e35e4190112571d3e7c291baa7aa8b1800121bd573b8419f627c0091e1bba8 -A = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac5a2037055e9c8e076e6cdc81847fbbd11f10059d46cc9521b1684f848f706002520ebdd60a8fc545f51a08eaa60872d6afed2226a6f182d9ee7d4314232de1382fa77f5b4ff7a72483cc039c26891df60ca5ae6 -B = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd2ff66f81a2fbb2016b210df612743b1dbdd8ddb2a931bc785a7a6b7d723e9de746f31c260467bd955616176b327bae3aedae613a1827713a2397325259fdfae0947fcee980a13902653a818ba43f1f2d4 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 4cd4da762c7576d582572d3427abc4b4297f740705fc14a32b46347541b152d0d1e3a11f27213badcea1e2009e34a63350c7a59e4d43654b28298d2757d6b54c4d82f580e98de4230cd119ba350416452cd4b8adff29b9f35ae0c533f666cfed716838e2b91941dfbea8d6a978a369d5f27554ef411f15e5a89850655d7f3f5a -A = 04f4a28af27b926d8ac347503d6ac0bfec388a6c0b38a577501c3ca4aa709c69601824ddeb5eba4d9e437a97f3e4477e1487d5ce7b4a35b90fb863657a5b2d901bb8c3c838db40b89b495ee9875e8eee607d7b8013 -B = 13ca192603bc8b2da29dae67159e4f8d32f351a503434ed9e4e24f74abb5908ef7da80781c71b1a5ce64fefd13a16cc1eab05a370bfba2a97e6cf90cfe98d3a487ba72dde0762c36c10e1da175f1c1b5fc -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 3812e9e835ae355fdf328b29ed8b86dc3f6895e379b8b5d65a5de41eab5fb20ad3e2290c8ca69f9500248ff883d9715f59d0db6257d13c5cd612211bb1fb99867161daffc77968bdffc1fe48bcde0fcce02ca93975b3cd9e93b56974ab4beb59582c3d0ef2a65957f701549f8bf858de0c5bc98af3e5722f1450de391876a2d9 -A = 14ca6101af00d67139b985ac9f149accc260336237dd2dee802b5cc6e506e217b74c1a007ec10c20012f071ddad34e7407012669109ec1f385566ff04cf1a1ab7562353c0af1ba1be0baaef920a188c60db27970f64d -B = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac7123b1c800e638fc5c56e2bcabb6f12b962b37367d8ab77e87894395ba23a6a525b72f2a4d6f12efd8f24298377e640b5158443241dbad589ef8dfb1f6d36a934e020b303920f2f2eb662429df171f4e3a2ac50 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 5ad7411cef0581b2e675d03b0ecb9969102a283eba5e779bdcbb7646d94e843083a07269c932d18b973b57abe54eaaad0aa76cf7b61f30505a263bc95aa063efb264ae829eb1d1d5f7d380a0b4db59839de9ae6230ba51901e71b3e3d59e8c34a79678e751c8b7ab139123bdb2f04d90a18ed81d2046ae86da1a73c8dae4fc4f -A = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed40c31b8fb13cde21f2e86870cdda0b4542efd681542a3c38343f5e00d14c174f5ea06b1d018edd9c82d587144eecefca6db5b6e70cadca1ad5ffee9f4a993270e5caa9ca71ed39146901611688a79aff0293477bd6f9ed5 -B = 04a0d48e31cb8c24a3b2c9c95fd19edbe46823032ef4c97fe65d0a30d5c2cad7a4fbbe89e0ebc9940ed9f9ccb8ab18bac269759a9740a7985809d0f38259e680f0703febe7fa012d1ded47f0cace4a133f59a721 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 2b2953981db406ebc544c39dfeb08a8b089064533221536c7fa2bf2a7a0d3a1192859b7dc0ea5036eeab5aa371e3e0070c3980433adb3e3a5202ff257bb546bcb9550423201a35501fd717ed4c0016eb3a675ed399340bac7f058a04e69c1774590fe747ffb9c27e78ba50fcee30ce533a1659fc49dc080a60f21357a6265d24 -A = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05db1f0b382d2e76a22a2788439b6a2d571b49836383c68b45393ae5d6e6f2d73babda499420de469ac6bab7222ce957adeab7aebd3ddafb75189705d73cba31a54d9e2b46391bf9cd23e5258d9ee1730d577d5b789dc9997b1 -B = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d0e72f8ec8f5d254a7147b2241390bcdf201835e1e89d2963112fcdde1902faa8b45232feb7d9c88d8879b234b61429c7ad79b1b60b254287d38d8ed174257621220bd8c1f3d2387721c5f735a7edc8c0f03a207fb60 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 02104dfef151526e072c09a4a277eb981a035379de3b1a55a88cb060681706f26131c388f5572c5646826b119c85ed450207f32733487e3c4e1e9d701a65058c4b4ef0cd1db090495643038229ed177b54695ac32110619038f1c1cece14faa693d88476e3d70329b0084d0ba5d547bbaa5b59ba1ce1fad5aa2f1c11a75bc7c0 -A = 07b79e6f1330fefffaf8521089c3348593e40ab7e8d4da3d4346571b43b12740958336580afd13619be3dc2d42eefd9e30599405da3e32e7f3a5655ece8b77a367059668021aa092460de75e627526da08e6206b0f8f539ef40e -B = 0156e234931907c0c0970c1fe6bd4b24225ed94d5f5b1be4693c8e141e9a6032425b4a47b6eac6265afbeb9d796eb230efa707d5ac4a73808225181cf814b319142e9d175ac461c75e6d479bb6bea53954bb981062eb16 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 2a392c5fc96c29df2f5ae9eaf76e7d981dc1e2f3b47b43a98eaf556a9465ae8727c622188123c64658053ec50c25e54ac5c6c8bc279b134d326e911f14c873357647866eccb4f9038ed0cef5082c2058ebd71e1619f7c8f8f2fb80871ebbca3fbfb7845bd855d307d2efd853f1bfd467fbe030862f165e53a9cfa633d0d3fa23 -A = 1e0430e7cf15173d00592037e83e717c90d7dab4f54a5b2f0f5772762fb5f56bc0b2a53ec1bc3b960afc35e7b043f9d85d0af6c29288486af3e186e52bae6300b58917647231b40a12648cc8c020a797683a9bd7ff34eb6d41b928 -B = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ec64a99eaffabe42c22517c8492c63f6fdfb82bffd693a451d62fece2f56a5606fccd9f3e86e2718417bad2c1df9502f2f0214e12261a060a6934c0ea8483894224e4367246b4727606274037b4f05d5767177f9d4e5e00a8 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 2608f68632ef14dc3979725c8cf1a0db10a1651f17d91247edfae9935b53f6364d233b030eb99871a87b7bd876ab2cfd5a643387a7af9d337e81770db04a14f4f8dbda2cff604838c9af9a31e8dccf9277d453176589ba33abf77855b9501e63370b2e6cd22831e1e70ff1815302c0a026c70042957d08e74dfaff940a91a7b9 -A = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a18674c977d9484d2fbefd9b54d9b955d05a6965f522ec56a647bef486f85f59e7cb3bee2a3af6100fdb6e2c17ab1526267db3004084c78770682f4be127263141867fb04692e6feecc8d342b0fee5b9a6eea64f58276ae6ef809c1cc748 -B = 47f81f65ea1af04f702757c02a175a299b23cd8ad551fdb67020c50cbb4110b5371dc5790b12484e9ce647eeb24c0220a5e62aaec3461a9dcdaf1a22814b6f22d66372cc5ee31944bef33469f905458c172ec7871d9dc9c301 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 5735109bd21d31b5f54e9221bbed78c54cf387e39c13d31557e8173e173f786b2d2f1acf3966c3bf4552fe9bc802d0868a5a7632404cb91609a7a45fe0fb83fea8d83b0319666c1b0ac520169c15be708343359447f2fd37960c1e96d32799ac9394e839b391f59dd347acfb79bcc4e34e76490880d163ac97ee69e3a0a6e68f -A = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a011d0eb96be3284170951a6faaa10836f1196f53ee084d42a0c9d92dbb378d080c9f7c0ca8e015f323e3e64859a2f9fecc27a3f4ae87fecb8568c0ac2f5380ddb984bc23f574d8b56cf1250a0f06b90af2914e55a68cbdb7084ababad0b -B = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fc35df5e7c50ffc2283069f8a00ce91e5d561b5d6b06c81dc66e6c50ee1af260eda95de46017effa03234ebd6204e18a009ed2a53c76f76ed621aa6606abd91c0805f324d628b90e4c2c44a0a505911c7b0c097e001fac29efeba5 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 3b4ad19b75e1301d19b57ba9b68e0666c28c7c5c99df1d5fbbe0685dc1d3489ff39c919222719c5d8b7ce2d7ff967730d776a02b36a86064ed66a02011bab82eb575390f85f0104715f6e4954a1bb28518450182a8ef58af35d00e2fe417f07ba25dd9c85e00c3451082becd22e3aa0c9bcedaa96e6423c7df6c375b4c799c65 -A = 058e1ce4a9b512eb0632b02cf1207936d6707b802140540fbcbbdd712e5ac1426b4f36e74a9a9ddc812e572855d4fe4fca8a0de6644226f5698fb46a5f2a479dfc8b588aa8e02ddb15acdc79ed3d17143e290f1317274f425b869df54a4807 -B = 14e341cbb5f5a7f3b4dd864172b82ceed2887fcf20aae7d0598b3d8afafd2f10c27bc7456c1488abb570be3df04f43d892dc6a8dbe7621f55bccb0ee3acb1ade989a510b4e0cbe29b6b93968f323f0016d87944c908824d249769f8b -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 7fe0bbbccad6032069b1a335b3f2dac16089051cd9321f903181fad23be6853e2d209958e8c48e008be94a62c6206b34b4e994ca08b8f24a2df0e6394ea65b3b7aadb3bc43d04dc9d35a77e673c4476dedefd4568b4ade5d16f9d89486f3d5ed0566b1eb428cb0b688f10fe3901037744f278385754fca481f937cb630f60308 -A = 1cc0e3ed58090db55063c9ba11401636f89262d6ec096d361f448496e05181c5f7f2604333f26d511c13534618e90637adc807d622097f7eabfc03266135cb626e1bad20997e72da71bf2b3f65a4973dc27d2a594b1fd96b7bf7ec14b9e4b983 -B = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a0ff4ae3c00601161a9d435c2a6850c89867009c3dbd9b10fb1f640dd698880aebba08c2220358050e51a3a667184b29d8e76c8855527aef2dd86698f91d4b6595db25644529f9cd8daca93fdd773a001a9022c7f825e7e9e54ac770b9f9 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 35d7ac5cbc7e6c262ffa41be168b02a3bde9e112c512d1f68421d705ea34461ce3e0dafde67f44d44cf31d91b38d4d5f2fbf8c6c6a44ec3ed0298dd58f3d45c04346c11e57229dc3d2cdfea02c802732d9a811d7be5e81094d72172cd04caaa3c9d55a951c09f454f42add6e89e2d8a98e124aac86379df377606e7af9bc6baa -A = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f654d28e889079e28a54bbe330be57c70d6af97c5000e019a3c3e29bef35379584ce4e39dcf53f81f1dae04e2b97e815f4b6be7d2261c1fafe17113651e9a107ac7704a505c55194196e5220178c3d3337bb072a3b53ecf0dabf4fba203df9c29154 -B = 072dc8973f7af7122a05c90df190bbf1e39abca908c197590dc7ac41fd0712f48f838ca62a72a177a293ee6b2afa7a10c21e7993347c3df4f161a5641ff62ba123999bf1eabef29ec0d33ed0919818f4b7c35b5f41e654759fc9abdc0f80e7 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 5d83a9b34631dd6c63c05a0c012adf97b4d0f20f61907e1c2145330211e9a7e38128517b058e0a85e993c385068d1cec768deb814bea1323dbd333de091ad2cad72431f20c1e70ff7e1b119768ba44e14292c38b88dae7e55ac9e10ff98e9bcd5f0ac05af499196b4be0c6222d1a63227ee895fa6a8221a4a182a1323183cd7f -A = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff28887b65a61118c8bc013ad24480a8f95b4e695fe5ddc014ff85bda86629d4b36c066383f76f18d5962474674a62646e7d30bce6b05edd6d8dd389eef93648a230615fa9459bfa8f3f9637b2629900e7b73feb6fa7b51eda0445f348f3658897b6997489 -B = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a38c040ae26eb02ce1dbac7096bf004a4b48fb3ca9a1c117535f261d0aecb063712caade24be40e2605a8e204d0da58bd95d36c86669b917a483330b812af4528dc0a070aebed4a9d2aa09d10d5b3c3c171b5acebd87a3bbbfaa2c16cd7245f411 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 7fc1c65eade94d9de7440eb8dfaecf1004905135efd4f98257c3295b1e76ccf1e2ab6808d158d360b7419c6210c50efe960610973d9ae855c72ec0e81d423e5863c80b542ad455700d2d0dee5fc403dc01eab460c24687401cf6a3179642e59f2a30268df95fa80dcdac230702352bbf6b60acb9ff5d45c5b09a3403b954d173 -A = 07906bd8d3bebb1303c1df1fea0b2503b0abe9c69b4f4f5bd01eec9e314788cb7d44b93428adbcef570477e8ecac2a64822e481bdf520fc381e1bb0b2cdae2fe94e484cef5236dd524e4dc364b72f4c06d57f29dd3c5079e532b1ab1e71dd6a65b3362df -B = 01479ef2807b9c23c094d0416f513894cc92e023b134f44a5333360dbbe98b8161ab899302f4fa11b470b97dca0c4e8ab7ae47e5fd0962834e6cc1763618193f4ee027f667368da580c623080de137b5869c3081128e6081b9d5e2dbafd791773242 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 730c04094b1ce944588e8291f7e6cf763c70b79cf362dc8a1bc63bb8790cd4cfe4eb51cf15a45a8464d69ddc3e1b9383cfbfd643f317108cd9ca6a6eaaea177c5c8b6747bbf40108cbc0437eb8f11bd2a0939da59b70c0c6129e2c249823897f2ee536b0427bc45035f121d2cbe7441c175899b97c490e6c3ca01539bcd05848 -A = 102cf23cc3b81785c73ac3613c816de47fd585c7d5f175185818dbb4bf0bd47d0dda9702bce97b29d66e48bfaae0fd07b47b40be2b48ed702ef21c54b10bb927f9d6b43604bec4f4b2796b44aa6b4e83f8bcd00f2fa3871dd901570e1a32888d8691454c40 -B = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff287d316f18074f0628caf7e230c5ecc2200108b30485917287ed9cc704afd58fa98a44ef04e39c6760fccfb16d9da1b5e6101a38fb24e6970b65e1546cd6f8c87d8233be4dba90ac05725252ec7b8d407c5fb05ce7e18561281019054935f1439dd3142a -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 1cfe1842a53d00e4619265e2fce7cb566ffbd912c9213925d01408a956af304eacb85e29fb6edb812a95e90769bf1c3d62b0cf6cd5bb8f8992391d2ad70f38a14fb9d1d1eb522aa7b7fd9f1b52790beebfc887193882377b7ce567d317d8432e1d9a908d6ccfe8d2de7de497d77b023b3959cc042ae30aefcc0229617fd2a146 -A = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f12c2038c450fc51fab9029d91eed64b9ed4ce05fa1c99da1acf103668541efcafe7bc7d6afb392b2471d699203a7feffe5471d883f8b1939b6cb3b80fb5ab8f8f51d382237a7954578d2caf5728678ad3b3011392f2d1e4f95d3e40826e5e3c45763ef941b01 -B = 675d9d2a05288b438ddcb330acbd59e4639375f3f14ac2d0e9e8b72de6ffc1d217ce62f997577f7eaddbe4603541b132cd41f2f2740363d9c331ef22df92029d143fc8495ed0152b918aed7ff22f564c7cd94fd3fe4178c90365ace43def8fe30ab05c0e -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 83ed1948276d689bb7fde814e67fcea72c4e3509c48873c3e7349a8fa1c08ae11ea4d814d8deb1021eb8b8ceec342cba5002a2ca45d5f340ae1aa500af4c7db120d0402c6cc8a840404be7221bbc46ffa10236043e5ce4415d3ef1355bde26d2d26eb7127326d4b8d671bb96a08e38a2c1dcc281830ac77202903a5e4777ff02 -A = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d1d0e8176011cf118575177fee3174fa27b8a90e74bb861627460da83e4d7d6099a9c6f89cabc953ccf0e86b78834b1e60571722abb4185bc42fbe61ec2112cf4d1be7c82d73d3b97c6902712c48b3fc3af8b5cb033435ae832d1d34f91191d4db0d84afef943dcf -B = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6bad22ea470bfe7098ec697270333ca4e149fdf57e32c9ea8a35849d394b41c3d2d62feffec5a9ea8543927d475bf5f2e9093879de6d599f6be17e67916a60f05711f2655bd8555881a01e0d230c8e11b9a6f157d72f826f4a6f66697eeac3e5dc6d53f117cf -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 0402525e19b6b68942253d1a51fd9b2ca36fc84cf938d80b3d52fd4302de142b9d93d1663e89340fff10c2b5efc8cd47fc3b5cc5ccd49a6ea3038ead6454bf190b7f88f52c56bcf00c6ad5b0f5dfb7615915ee8af137dd99cd3d21172ab772f36d291a6856a8e7912750139c09aa024b930a0a6b9eccc83c2c5c0ee2473ea32c -A = 065e5db532ecae639bd56dd63045bca39b33b4d70b2db82ca3d0ee8ca436e671828cde80217b48eae7487fe110830589ab1be889f1e1463f3b0757d529b2f0cdd2ac92c35e8ec141885bbefb6040a3b5e00e64a541913a38fe05824a929f8c5a2c46568c61989c3ca7 -B = 1d9c73eef8373cbb1e8393feb26d55c33a245c33d7031c234abffb2f06a1601f7f3a79ef1e8664c51ce5dba5f5aaf3b9a9e42470d381219b4616ae93c7f6e64792d23bae523b6a224c1f714ebc82a11f9be42618922b8d2eb7b55e4d45572e68a19fb0ba72228b -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 7a9cdb5dcdfb6e04351057d731fddb9e85f41eb432f01c0d980673d294d05ba9b0180133a89930e74cfce78ed54991b494a19e7f80f310b85904784cebc5639bbc631e80751807868e7fe16719e8ffcd1f2cbd1b9f303c3ed488b647670be3080668b5fa0e53b6342c33c87f0ca1efe1ddb1c877bfe2556aeb61805b06f41343 -A = 1e412c3d66aea2c503f3aa5dbad368a61d969a2951c0094f9da32d2794e47f3bf4c481ae23636baabdebdcf0753d431426b1865e62de8eae7238a9245d62820ad7f17b5380d701f5db776cd4e1ddbdfd542901731ffcea5bcdc247fa9c83f7e08a9389e5a76d38be21bd -B = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c88023b951080528d09f2da8c2fb8ed7cc736044d8e086f55c89dabd2d1a0ad2221e9ed664636e0c285375266486981175410951c1690ead03896dff707b60b41f3d9d7588379c93a6e602e3b56f15c017eabb3e12ff4942901cd927fe6b1bb93280fff775cb0f18292a -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 712580a1ffde78c8cf98ba71843c8130e835fee3afbb45e372d04c04cc388e403c9efac742611d7974bbae982c3aadfd1893f5da280afe0c1db1d81a9ed73b6ed9b7f05a20ce828316103259112d7754560d66733041e9470ae0d4dc95fd0484bfd56d66739f38ead7efa4051187ea41f7bea8fe5d958a29af41328246e2bc35 -A = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651052030b76e95256709f642442e56d07be9c4f098ba79856b80eb6de39868758869ffd34925ab6a807b64fca9cca893aa44538585a76a35bbdd7fe09df9c553d8c17be4764662316e3dbf0f401d31418c4340fd3414fe4c599b8536b71d51d430d94430ea2e555860a69495e -B = 05bda68c0a64218d3609d75eb4832d5468298f19498507d7d515f4c410f04dee535947571a5e75f1af7f94a5b3b05fb742fde23e7cf3f8b3dbee0a569e5a36d7a3d31a26c4a48a299044fd72339d2cee1a68966c851e76b93ae34130b75f4abe4f2260207d2254d23f56 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 4a1a514aa4d1ada84fa841d0b668930c904783fac521377a7d622201867d773ad23dbb667e0d4181616358f3cb088cd157c8e72bcd03db64647b37aa1813f870cbb0318ae0a3667f8e6c19f6e0706217646ce633f0cc8bf4e8f0f4d7329a8647252ca6d376416d545e73cb9a3cba40f8f9465d85d57c2481b84b6d95dd42d50a -A = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687633a0deaa80fa8b7717e7f26dd7834679d52e58de4905c032e7fbc427b4ec183e2287b2131071fd68a043c279e7cf1cc047723c6ecdf1bec72c54926c3cd6229b4bc15afebb90530b5008a8ba858f98c247bbcec545dd495b72768107cc98672f7d04fd8f0a7142d47b38462ab -B = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651064f6675d36585a5f9d7264f3b9f9dcc09c4911928783af66bfaabfa2bc7f530dd03ae6da1cea24776877c409f550267d02e13105880a4dd9ba76fd026d0d5de495d4c74b8021bc08d9014d6fe01589c7f757513090dac2d8eaee630381a912ecf9bab775fc740f1905ed68 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 3fe24e66e381eca525b24cf767215837019f44ed4fac6ab118d02cdbd658066505ee5b0feb7af51859992ecb97d727121e38873f748a61d70201cc43228a7732156a80dbe399e05764be19e37dc1b93222bcdcbc45b1a4817460f7021dcf1d70e632bc6a306628790201222bb522f4cc80adcc907463a539b02f74004d42adff -A = 0773454a43f495959dd55b8a064d70b1b1ffe45c084f5f9553582e24fb402b564de68e5379a8d9d02af101594e717a6c6db2e7173e557a64d2f28fd45c4e06041deda040705d99acacf8086830af19c7ab5e27f91738ffbd937dc27e5b7869bb6caa12c2d7930366ff75eadc570a -B = 013d884a2396268f1a8186748a15722156a172a56dd3d8c77b9cb7001b6ee06720653507eba9bb9918f2f699cb37f3b5ae514f5180108a704647f19b0fc075826153edda66dc1105c1008ea8ec6f8c10057f8e8e479e1a1274edfed9ef719b30827a30f26da78820c3696d01aa -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 715bab8708e53f76d2ef2afbb845bdaaf978b54ce25f84dbbf9074f16d30a18733a02a4ba5d7b092fa6c25d3b9b0d8243c743910f1b7b785d9cb02343fc6d59eb0817bcff05646030ce4fbb2b9ff76781cb1af66b46553d365d02c61e677ae97defe92d057d4378dadf8cba9824b0022c086e0d78b5442bf3d3263ba22c643f7 -A = 168186208c734383d472374fbedc2d5d430e85690a4881b740008623120a4f7f83b2cdf85dc28bfaae5870abcd7ff1bc782ef11c78a75c99d41f8aacb52fceeb5f10266dc65eb00b0868937340146d8850887686d54218badb97647a6d82c0c6650ca1f9078d73fc6222aab95c2967 -B = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab67df3f23e8f1b6e4395bca9102e09a76464a81036886a8f33e4f75af3adb74cc993cfdb32c84315ddb22bc1f52a8c04f728dca7f207ef3ba232cbd06b2c1bb63f0f89f2d72d59bb287bd5b164e2ce1bc18466876f9ce944d3be34706158f037d3b63b40546d720406da0401b9615c -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 2714b99dcde70d6c3be8b671d78abc155793f13105fd4b7c5d760a4c68ae89987311dabf2a9238d18299f983b8aca69a9ce398fdf2c9775d90b11b3dba17bcd8edf661efb6e9c50b4e37553cbecb54eb214fed1d0847287732810e550a4c86b51d4e5da1cb7722ce4317e69644620ad806d6d1c94e1e3fb4d87de6178a997453 -A = 8e2ba940fc5165c6c5f7f4cb56a6fde285936891917bce3c4bc572858192433a88a5d77e63bbf31cdcbea067e71dae417109d3ec4a96c9ea4e22a0b88cb25404e003c22ca6ab49083b8bba437c6cd501c5f268fb4a1defc685eb8fcd5d23385501056eb8d77afa5c628989bc33e9d7743d69125f1e77c40854aa72e58ea6f313 -B = 5aadfe65df0e5b877fe45d42d7ca02882cb6c686d486374da5ece6f87771675153c84d74b6f40df1db567b7e1e3c60c41d21816f958f5576fd2ce2f84a8c3be4749dfc7e5561266b7c9698c7581292d0d813cb77955458d63bf94ce87472924c4ca79504d1ae9d5f025c7a2504156f -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 6613b1c8ccac0cb8fe2f59e76fef4dd05acf1f1b2bfc20aa3f193622ce3e9d4c7824ad544477553bc68f05f0b546e7c1ee87301e111af7929d1f40525291b88e211db7175f4e5c0953141914fcb4fb951dbf77442e7cb28fde495704f1b5141de1e50fbd0e359d0d86ad709c8f564c84dac81c7602717c269219ab1cf12e809c -A = 8e2ba940fc5165c6c5f7f4cb56a6fc26f72d0c623eac124cf0cf551b1c6934cb1882967f9ebdb5b36cfd6d1fde5559f584db39a0ce8461dffbc0d35ceecba29e71605a6024f2049603bec70181c2af20b27e308910747b11efeec8a65d2ca886df718062fbec60bc322c6829801e3c3b5b62d50a2dde0c0075eb335097a9d9b6 -B = 8e2ba940fc5165c6c5f7f4cb56a6fddf2592e9a694e5eb8353684eb05b940d5f643ace64314e1b29324f2f4a06bde7f6e4e84680eed276f8eeb02fe242dc47be6bf5eaec2edf36d4320db0cd22e95cfa5ee71c86d3f78d43d9a865c3a6a7a007afb98052c033d7eb32a0650810b3deeb9a07f2413df201b4741ae0fe1019f3cf -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 3a7fc5680aae875b9241200b9f4112a82cd624ffd9044138ae3cd65200631ee9d7b918fbffadcad7e598791a9f0bef3e23005d6bc0048ba92461283492df3bce74c66e417b082ee052fd8f808d71f3ab18f9ffc40f8fb51ebbb936d09c26a3514bf868141f7cf238c1abb3d88e5d50dfc188902254f07d63fb8cb611ef8e4149 -A = 04a30f32d467b29dc83b40bca2fc4ccee5f08a64069cb87f20e63387b2219b12aa312400c4ca59608f50a71d2535cde40a6d248290793fe01693ca40b93a5cded2dcfbc9aeb36e187c9d650782d12bea917daadbc6525f266e074037803e4b2f300778ca8dcb304658cdb502c93c94a16c6261 -B = 1ca5e5218dade077fecb81d579e1c9290431b34df5ec84aefaaf233d68f17dcf60ee010db26320685af13a821b6daa9d73d8f3a30826c3ae7b2bc5e219cadcff826283cd7dddd04cea7a5e0585d6e7c9f23b27f14ff815fe53bcd75fe700b1b91671bddaba737fb43bfecd2a77e5b752a206 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 768d312175ce7d2601f30bb38339f046e4c2ba5c19ae5f7ca5a562cc2462c579fce9985e9e8afe2578db542c8d9e7693e0c74ba161334b249ce720d568e9c18f09c87cd701e6f2080b752362f2fe6252a1d0caaaf1fa18199776e4c6078d89d520b9c63db159d5fba7e0838811e68794b1413c248f3f7173ef29eff28f15b656 -A = 149353e91bdb70cdca8f06648388508511a64d05221305cad7187ea40d9ccef91fe17ceb1e79667bf66e8e6b7a57faa90a83bad119c02984a8f860bc1f23ffd33d4ad84896610301cd2e8e80a5ca7e8d3ee63e7dfa459793c9dbaef3569eb4f8a021c6a3d032a9c94d3f6b8278274d0088a98228 -B = 8e2ba940fc5165c6c5f7f4cb55ff32279073391a0e6c975206452902a8c522f8e8a014bcc239720c346bbf7df93506eb95ef2f322138dba8b5df6db51c3a381fb2c2ef9875f5cbefba72732dff4da6144c8f3564e5385f277be7a637252a880bfea80ce2230b88491c40db00f1138a8b08f830a673ce4a7cc1d9f38d35b283b7 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 0763912f4b16549e6ccd60eaf7a0a1f64d9c3bc83e4a9b87e209a3959ba3cf609cf47183bc543f08e346b6e12b8bdd5d1c07c603f74b286ad432d58d7001299ec7a4dcdb56ca875dfc7ee5c75bcfe2aaba14959bf3facaebf8df92bc12937cfd4a4865b3dd74b243ff62ba256d110b01b4089730cf48efdc66fe272f9241014e -A = 8e2ba940fc5165c6c5f7f47d631d62a2259a038a455598cf900c13317339e33a90c42906c2f9cab8056b5137a3a5220062c0c6b3bb88ffee3b4ab453b8134e976a8e7c3785bd223c31c96f46ff59705e688a427b8bc6e985c755963ab731d779bdd1aa54ea223b62f5b707c12efde079d98187f7d7edb00bbfc0010f889709ce -B = 0450eff382e73f2f38bc3a4abecd5f8de478f80a6b99fb6252173c90d7099629afe859442bb1f796855ee9a2940f21d1f9dc44f462edd74b479e1f2926ff6faefeb55adbc6152b5c97967b1dc8c44dfb85b5e02e870d2920b75422c8a427e99e35e2a4be92cb0ddc04cb7f4044f716be97b36f045a -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 56ef57d56c6d1b94cf0fcdedd3611a8ee444c2e25522b9ad175587619598da341916b183be03b1e73be300f9969120d8f3a23750cd8c4ffdb87124a2139e8ff2c15d8dc944bc3c3a066aa16dbe6dba4a74925e16acdb2b2e83cd7fd5cedade6a7f7409a509c00dadc182b2860609cc9a375cb8bbdcc350bcb2c0df9b3bff882e -A = 8e2ba940fc5165c6c5f6b1005d11466abfa370afbb80500e54891dcf47754289eb6dee4eb33b8f37749ad543fc8a178a3f580832b977d8aaab2ad01c57e937fbe73efe0aa2ed20c938766a5571eeff14415d1a954d3f26d7ed1063eb01ddc0ee2e29e6dba9ce9c9d4df20eb92b0535857020cbf05c56113ad072c3a167c34056 -B = 8e2ba940fc5165c6c5f7c4a55ca1388ad3f286db5f7286c8ff8877b65dca8d7802812c6d30da7b2d743eaae7570493cc8d40c8ea51f418261e84880dac7ccf0fd1b338a61c576eb456cd47b4ec89a3ad6c689f58db3b3668938c66f850754ec3bbdcf95346dbb440bc08d1b98ea6e4e4f7dc2a9ee93a836587d6973c4121d326 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 42f363c34c20c443c1ea7a1c54f98c6977b6671164a80308000533b2404a7f280adb1f3b98101cba25249131288f7ac68b0ae2572c7777e7381c1f4d05fd82188c4b1ed5636652e0bfca4d096bbf4189a9358b79f6b6333b99e5c4b7a940c2f7d1413bf9f47a2ef66b620b5e220b2c3dd7267452eb1b9d8d9cfb17bbfcdb6abb -A = 0499d05de867bda3118a8cb82b80ac91fc505e0fbc6c7dac5fb61713cb6e715f56a31ae8af4b400461d7ad1687a2631faecd90d7829f67d1b9e36ed7d55704b3f2aea65eac061172d698384daea710ed92cf1140cd4da427174bebd173c2ff1675b2407a84649b0a318602f33105006fe4d5ed8d0e015b99 -B = 017a426a12a0175bb46bf7a7e727eb5238af383cee6f4d5e2bd82b0d29b9fed35f3d8ec95cfdfcac49bee47b25d3b5f375a3340fa83f8dd9330a593a974d208debb7e567e59dbb7251b54e42dab2cd50fc63aab050a41bd88282373f8195c94c35f61bb48aa921f574cb4ff0984ccedc070efea8c46e5cf8 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 2f03374e9596cb56cbbd89794090ca7a4b437f4c05fa38a09db60e5ca900b208fb85b52f71c29fd35e62c9f9529d7ffe46fcc54607ccb07f6f8e13fdd4ff1185033ba4fcefb1ed4bfc42c3ea9f05276767d8dc9b7b4aea4c8bc0ce84951d1f590cec0751f73667db19060e2bff64da30fc048a1f5700fe3f489920675cc3540a -A = 1073531f678877ba854fd1e7f857659614c526847ffbe8ed131dc9f2ccf69e1f1e917bb44a7b905f7ff758f61c06dd59ee09567d9f0df2550fcb98b776ed1381ce052988aa08fc5153e31c621c6a51ca61b386e3a9163a5cd69608b3e200476a8ada35d906c41d044bafe71ef5c6f732935f15b53bf36f7ef8 -B = 8e2ba940fc5165b8e2a1bba60f58a9da18716f19b8a69f9e6dd8a39c39ad4afba8caaf2ee532d61955674e56751994d9c656debfd5b8fbf448362f09feee6bb9df2c31983cdf1907dd8340ecd309ac805b9beff1d5d9755e2b07d1a21c7dd093691b9b2b52ddbfcae977b04b6842c6d8770bb890183b60e33cb1c9425f43c312 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 01aa22f9013bc1cdebbdfecedf710c1bcaa41c696a3d7dfc1c8c601fcfcc1c85c8cc24be7df2cf3c7311b3b17a4ef2dbce545dc467d2a92d371e02a196a9977cb9042b236acf99d8c0d34a1c4dd8792d3497cffbc87c397ccee5d01fc2c89ef051324a7061e423720d0a3821a36739797393bdf7a45b5fc600824a17043312bc -A = 8e2ba940fc511613e1fa122a9053ed96f339c11f7407938866cc974c11575b3b8a0b7ab2ef456a6d2db6e40073d145c52ad2b706836eeab58d595a0e0c39c6c91de40d0c1bcd6a9e6a630b510ccc1b2ca0f1bf1b3ebb3934140ca50f92d522a253af48272d89b40e2111e88b0f69a848871c0ddb492c3d7ed919d5dab8f6c777 -B = 63702537a07971e399aa9a1a0795db052d6c8185c79107216babe11d6d8d472b61e604cecf9eaa6d44a2fcdd1ef0b6b52226ea0c6902d929b09e16576e6d1a6921765b2134c5d23c69ed61f36ea9a5552e5819350366240693558fac7a9d09ecd3702076c8c758a4bf6843fa843dfd688bef3f73515db31bfc26 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 6acb23ea695d4b60cce53079390da3cb3a4bc3a6486c238c421f3bf6c93c027a0475f656c3e5435f0211e90458ae81772aa956ef284093020f7b58ccd9373f3fdd39fdf4adb8dd64590f4a7fc05238ba20017bdad07f5f9a6f076b71554a7741bdd8c98ec68f8fee88396cb1f47c64d6da4c228caa3dfc7a9a1c032a9ba4fedc -A = 8e2ba940fa9f1c57ccce38642664647812a75f9e54c688d91189eedb1990fafa2cd1fb7554906bf54ac082e5d490e800b2af5c5d3025d5e17214f3dc85905f9625c9fdb98e666b19ff940f1f8c892274c026a99c3b2e86878d459a40a706f3865eaccba6f04fe78d91dc407b8481873487c42f8fbd4a97a1c6fadb821ed06e86 -B = 8e2ba940f9cdcca65b1572be300153d71cf1f72d9a38ab77d742bbb505e138e1110501f9f7459e46e10c2913bcd189d9795ef2790a669f78c892ff4e8dbda75e86c90a2153b2963338d8575a8c64859ffdadb7069eec250a126f1eff83c0f89283ee408330f5acfbc6e1e0b9f90abb37d11e5d0b07d27670848846bbed6f7851 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 0c012c4d17ea4c95a360218adfc3363f6d89f5aa524aec70049ef94c2c05e59a66ce01e25588e164bf2412f9517b7740de53d037e71ec3a1d426f05b18b128c41a878da75421e8c8ef3ebd5effd40735c00818eeb1ec63182b44e817403c9f1f6c1a0155334be63a3a15109be6d45ac0d1b1ef5cc99e9b284b00c487d91e5472 -A = 0796fba6276fb7129eef2d1572b305f63d7b8c49371cfb3b2c67b141071e66ccdb5e321fa2c1bcf624c77317e2aa135e1137dfa46a34c3ffefa2fa3e316be81f45614d422bf86fe4518c2fdb7e416bec199de033cb5fef7f193a80c0f0e6ee924a12c8f705f5ed3793ab770914924b45cf2578bdd09c701169f0a881e6 -B = 12cf934763127284e642ddc232b1c889cd86617307b6ad72a9fe0d48befd7c5c5370a0062dfbde2add256dc0af850813b22320ceeaeed347eb9319bf22320b2fcadeb51c4bb26a160f7459fc172c27a91d367d5a232d00cf7bb778fba83afb744177bf1ddf45446baa035fcd0065f9b493d92eda37e9138f4fecf3ec55 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 3de123bbd50c35805b943e76e97b7e664eb9feb99860750bf97e275029e836217375cc1910c13269ffbd0bd72bb82ca445ccc4b693742a96d19d3dc23f78e5ccbba46d9ff5975f239551c36403ad5fe86997536456c4a5ce54807c24e3b5317b1c7b2a1661aad85b63859d427f0703b460cf72b9acd3f87e2e69d7f8f15e972d -A = 1d0433d84f1de082d2058475e0168ceb369013a67aa9417f066c29c28272a0b3f8be5ac7190ab78591ae72a1dc8ce628c683281a9ad563e134387b9258b9c96d2df288fc118a8cff068ee49d635343772c2fcc252facdfc93112358414e1734d6948b909b53e46263e9a0cbffa141ef77bc98e7fae8ae2bd85bd875aa7c1 -B = 8e2b0626a5045573c013757b969a2f422cbe330fa813135c43734c1834d45c61214a6edbb164530131b81a0db29ff27f8a670a93331bde04c9fc884d805e49456b2b03f111696d5a310c588a0c9b51f2fbf4b248bf1bda761fd061a7a234eb33ca90aced1f6fa567dbcb7f5a7a3b3df1546b0bd5e15a0bb1a051884523853ad8 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 770f0c3104c0f3395fabeb75ddfa2c21a111d23438463941239f7c63e4b6e6832b84508ebf3cde1d90cff0a2801beee05cd5118f9a726a987eb58def6780be899b473ea71c697557ff63a4c6db894e9438595acdd98abfb529d75bdf3c1d619d6165a9edb6aaab8ada50b61a3a84de654706a9aedb7321b0523558e8f18116fd -A = 8dcbf983b2c404b826ce3140fa3ad7b7894f577b26d17971cc741a6b9854b853e293878136828beecc7053214fb1596000fb4314712a5e38619ee38ed88068a14baea580080050f16e32c65a5cde87f7a14ce58403385055c3b4837853a77aa23793c8fe14140ba5c424f9707080752a01e4acc1ee916c950afb505015311b4a -B = 0552155ef110c126afcb87dd20251220c7a43bd0215ecd22249a21c93583e120ba6f046c6fe03086ef3c97311c4d520110a450470a473d8633e3560d2cb44c25559af07516aff50d6d176e8782c06cd9aadd3354cc695c4ea8dbf85e01dad479c8e8438154351fd5fcc6fc7e9d2162ce2f0179247f756f0b9b34b54be74821c5 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 2e9ed66317734668c4c354d720a011fc65bb67439b2ac9203dca65a8f567682be40cbad4f55a83e836f1fc135596b624e4327acb085a61b6398237fef5a6e6560b488d4a673b5ae7d734b896d9647d71087621cc81e94d58e01fc2cc2dc775f9ab1b6031840a672fb715b77bd636e3d87b4949ec7bd60721bec8f9907b7c072f -A = 03d2b4ec637124206318b20e6ebe82bbb0b3b90e6fa82a13e95dfa1150f0c42b9d8bbe49a674b18dafa71477336a03f4084338fe670df97f25eff08b4299926c4081e112e5a95f48663108d02906730d5cd798c1055b0c3ddbb001cad8b4e56792d526b6b18d6460a8fd4c52a3f541650332afa575ab73ad0209feb67c071763 -B = 57e1c76664d6bc3df10a85c7e0ebc9e0f8a40a4a8c2954e648fd657a2caef53233e8375ed863819bfcbc08dc36e72f88af3835c70cc983dd82958aebe3cc85ffa40391e312e6302da870ae0d862f0554df2d4cd18004d983b38f2b5a1235776a35fb1ada3483b406efe006b448a7ccc51af9ac2646d6fd9781e07313b2415242 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 6455ff7c12bf3bc37120fe3f1302a9916a6ffdae6ee6a37fc23ca2f3a7ad910dc0e1027d4dc304a8eb4eccbcf3c87cf52a13dde472c07e2df2420c1d36bdd5e88c3d76e774ccd2ecaf6a0ef55b8c60231b1348a738f812a4fd9d0c158fd5a9fb19cc7cf9f000860d4cb6509271c8e43ae4193843324db02a029beb58ec2955ad -A = 5cd8b7c0da2092108c3717a3fd14da2ffceb9f40a1bf944c4016ae338fb17d932d7ba3347c3dd4be4ba1ae79620e68d20a59efe1ff1a2843544109d9a189809ea872a69d31708d2ae9955e8719257dcc293fe9ab3f57cb7329cd26ae5e87c93fa0fdb1a3436d24b547afc66caf029a88cd020344b3210077af84a044548864fa -B = 5d99d7a7c2500c33b40676365607fa94efd8edee4bf352346c7269791271acef3edbd04aa15fb909ff20381c49b8c3fc2b56bb57f5066dc4dee5482abf50e57e31ffbc09f7fa837d6c45ab1829710aa0827d8ad38186cd12d4ae931c5367ead9830dbd5a8765963ec0464d6aa6c392ba54d1c3448feda0a5af10e33a9abdcd07 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 64104f6c06e563ec66de4442d35d88117f2535edf9e012897f44daab5a1b8a8696f84db7a68d64ae24a394debb993bf6734c9df542c7e473b2e497396ce39a064789d5d7b339b65766b002a18096e7fb9f312ea5997c2a85463fbd6fc18f25769ac2a2123ccb0e72f14b0608c4c22add72bda138b83f986e78d5c9da31b15b9d -A = 832633b728946b3d84faf290c00d9472a8d190fcdab924afaad5e17f6362ba6791e9c1ccdb06d611d3bcf91deab8a59610ecf0c128393ad7d85c01de485fadcb249b7144c628976c7218f5ac4065392ea01da1d68c5ebf91a49bdfc32530b969c4350f76ed7880766ac67dd864da6b6358c1bdd67844b5bc61eb72d38212ac61 -B = 415e6e6744df0741a8806c80f13bc66fa2dbb15e4df697cb199ca122cfa1b3654bb16db15fe56a750352c41b58e25dd7870cd2f90eed089fe62babb8e39e8448010d861ae606b7d595970dd52a526183a2f8b7bfe761ffb3a32a026c5647e09e83dce75dfe5b697a1d92102f5679b8f337d95b3a69c8305a1fad61dad2737c26 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 11913c40d577f70a5346ff1cfdca492ff52b640eaf257510d311872c8df7ba9756973da5b9206c6e5254bcbbb4bcfdad5fc4594e41ee44e77f168e2d20a4b228480a9908b102dafddd039ba7f7619eed7057e8af3a72ee491a61dd049bd947e5b09a94ef94d5f336945f47104fddb8493ef22fb648ff5376b68e96c0555d74ca -A = 08c4b48ed89e8e8dd9cedaea845bc8fe09ab8391134a7300224a9b127e8dd620e0a83600f2d15c449fb64c1f07da51e12521f726caecdff70e928664ea6d2c40f8771d45448479764c12efd179a39def63b887738b2b282cdf8f2cc2845d2d4726abce29d7034ffcdf40cc632386c476cba9ef65b1d8de1711070b9af78271ce -B = 23261f6f36e21c2512fbe4e2512e4da39665f8f4060f085a2a86a580f46b4997c961e11919b6e7505d0da61128d86b99c37486c4919de5e2040c845b829b913eeb022ab0170367392a9598b51138ef0c00af91948e4bf08e64a1532278b99877f23c750b7fe6741ac2b48300d7d0234474314fadeb740e1e04a00676fa2922f7 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 42f420adf5c6b32ce53fe23af4e392517e37013b8c3a7d035a93f6ff45142b0b0bd5525cde85f9b7bd9ce219bd3514617e89ef4d9279cb9a3e89e44f1994d72febd23ffbdb0a4f19cb76448199b31c5cc6d7ec1e46fdb67be1211c0ccd93c123d56ac0d9cd2ad11f0c58c713165003495b75b60665047ef80f6a393474cb727f -A = 67026f46f89b5ffb44960e3229a4e81e2c5884028ecfb34a329c113b1125a35717740d5fdeaafac5967c4a9928e6497017b0c0b29429d3fb71301eed8b3cafccedddacfd428d4be8910d5b694ebd14c506f1631b45341f2729cbbb2b7caf02b28573be48fc6bf3c8a5835a424ab79a3bf2e62c7c2dd8d9601635bf7a28786c6b -B = 6144c9c7a2bdc1d882ca1bcfed3e1ca1e4f89e6678cc04940433d415ca74784cf57b465d1288b18e5ca5924ca769bda3aaa1dd6bfee13f46c985786d2405378f400ab65425267856e54ef4bdb2e91507cdd023517f87a94e349c625ca79e57f6bf025a770a5654039834b96814af80a47d4deae220afc9ae7be470e8986c62ca -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 2239459025b257fd0b6659f54b8874f93f07f4d6240f8ad761c9da288cf1537d8bd001eced284bddf78edd611c7f28f1393c6fb879aab6e7df8eefd347d63628b1ae086148f488b01272f67ca19db71a2b284eb17e17aaf1e3e8f23ea253595de474d5cf47c16aecfae360eab7855868b8af361491f6ad96f893f9d3eb66d07d -A = 38e10202997872f9eafd13a4382f579a6abd4394e69a7fe34f2e17dc3d855fca8cea470ef550b6c2005b141665f7d054b052f82c7a66b40680e1f0264eaa9f6735847f654b948fdd127d9f3b91fb33aaf7271723af0b51932596e6dda8ff0c5dc45b8a283d3682c6cb554ebe283512b3e086879dae357fcb8364baf75af712e7 -B = 355a943b90003754968202c6a98a983ced7f66da5a89175e95b6b5ce57d87a8ab31b33d52a1c54dbe7a52ea2ae6ddc91ffee1f498d1e210f243d5336c7f0453553971b962e94a94f1d4358106908c736d929f3c139a26098fe14522427c615a206f4c223d809a93c310387a438d439ecb0b9abf38a32d5246dbd0d6700144144 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 7650985e7c6e5461268867dfa9782cd8154bd6a4bb5857d6555e9d9746ee79b37e44638940bf8d5e974911327f0e53bbcfda0739056bae2248015c35839f35e7e359e93d3a339e7af38c0cb43eac5b41e1406e34cdd4afd458a5d126f70b5d683415b490e0ad61269ffe7ea8972eda6addd447d97e60891e5099ee920e18f233 -A = 62c18b51ed61c3850fe76d89266e5a947cca047796f29967a6eca0ec23c8b9813709df26c896c6e8defad39527ace9c5efe319d0ac98fc796ce3ef0ee12aaeb13f9bf75490f7a4630332105589ab646aa05c18537820a1806cd5e4fc8abe18fd612fc22f22e0eb1af386d011595fc27529b5c4136c15c1aa5732fa93259742d7 -B = 89f6646504ad95294658ae769e1a79f7de32ababdf36d0ab67469d0c1a69ffeb3eb251558226153bcbb436a5c1358e9b3e6eb7ee540ccff6ad186b20a2f0ef2c730ef19727f1d33f9ad17353a71d7d46faa385a3bae2c44f7ad6db3ab43ba3ae9c10e9f2f2d911466d823ebd4317328c904dc464864fdf563a8445409d53ecee -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 35d48c3e43070a10dac0e256afb83b219aacc0036f554bd998b9092ce3bf87bb5d3b00947f2c86fd4e7ab830502d15fb2d4e47ead087f5c779a9ba56e272ea86116e2c81345d379dda6b581e9c8f4df8ea56c78f04d4f7412d245e00ac645847af6ae97d5d2ab27e48cc878d8b510c2dc753f6ceb1b9e7bdd923e0e065a6c11e -A = 179be517743dcd4e06e8f7a217f2a4726c8b3461c0c1da9fc0f2c96b924c1d588d3e54b1b0c970b3851b1dceeee6089247a28f029eedc3959b4b1aefa44e2c3fe370ffb4542523e65629cbd07190dbde3c5a8ed4e45c07143d06ce880fb15d0b1439714ea48271a8cfdddefcba01eb9f1cb4fb825577363c19be4a0c6cb1c2d0 -B = 1c46d2fc55b249973d2dc30d0385423f987999980e528b1918c8d080a59f2790a59e21cc855a76ba6438071c9f6204836666aec5888cd32ceb765263b37919a6b34bc3b1da853ab8955468aecc5c09997777f34ff82453538488523a420824e3835d87b2cd631d07262f436e808ddc64579dc452afbaead9e5b068363c1d9d72 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 445039f359b55eec647296fbff4f22beac09cad32cae79c13d591e314fafc2b77839816aa4f641250938865b0a2c30a10e23da71a6dff5985ebf3df4429fe64c327557b12d987ad9e9971f7c7b1e4ad01c94e1e5322dbcbc4707a959a401624619029558fd6f5b14564469b13146f9a2555916491e4d77caa70f51716b299135 -A = 452129b508a60de52c82622985b9bfa12b5a4a91604017b675fde339a1527389dea5c126ce6d8a18a84bef68e10d9944ca9fab4f7e305ec20fe70397539c3f0b75048d4ec45445fd081341d6e7483a4993e0a20a74f10727f89f326edb3884544a87e6d4860ef23b3f9619f0fc24a6f2aebd0aef503aeda46faaedd5d847d703 -B = 39cea0a78df8bdc3413fc2cff3d15d81e33ce494fa2ae94ece6969bd9a0658fcc687b1e5c31d10ac484791152fc012a59b954eaca0ce6da84b69475753308864299350f52bd65f8e50f2076794163e01195b94daba7f6a2a8f0a60ae49e46ae2c949f62a1cb78d49a1006f0efcc51ae81b0f1566b50b5363025ffa795af9d1b3 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 6727c0d0ecb4a375d0fd1bc52146da1242099d445ed9e87b1fad4daf8369fbeeec49027d88bd98efb425c1e3f73e412fb327680068ae57d4a53992f3759af0ac1b96a92f56c2cf552e6682d1fa90c3910bbc5c0b1754862ee13c5ebd62d5b98bfe8dbbf9bf53bf9ed0b967f3c9da24d4334b9f3f75314b429b05b8e27142623c -A = 0f4eea56b810bd1a0869d3cad0bb3dc823f9ae47d81a1cfb8e872bab2c1cdc49cfcc5f6b970ef7762c1f8803e469b1cd772909f5c3f0c1f342cef54b47cd7bcaa19c0d15d98cbde8f596a0c5e27c04136b581b351dd855f1c8e04216027a454933d0f5de0f43a1a758e696856d2929eaf02c281617e05fb3f41e1da33fb54a7b -B = 785a1e5aedc264203f899ff52bf6a1ccda3b9ac6ea29ab867bf2af9605ea088f5de20e172f3b5b2a3d1de676ab203ffaf07c45f32dd82df33b080647b3d7c0fed9b66d24f4a5af1369d63718e896443749f55f9fdd2f5d9008185b086022f5cc65150f2e9d8462234c5ef57118c2b92cec80efb2a853123c157a34ec2363a188 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 6e9947beae4d934253e481d27e854a59c4047eeee4fdc7df7e174a8f045776109c148ba3721685195b8fb59263def88891c5953b5a0ae85fcdbf02abc76f4d3c0f5d9496327d063ce8b3ba875b4f119dcd8beefb3ac884c25955af61c35a69d0670c3c349564e5b84f7df4252d6d3b29d9a75f09e9ef79f0fa9f797bf75b8ccb -A = 4493bb04deffc492cf31f39878767cc29e3b7421904a730e1345a6280d600c2f90e298fa5ca14da726579413b520c26a1b98eafb05f7c9cbf0191254837cee14f1d28d8f16d099792430e4a89636006cee4b26e5bcebaed25bb7f12f3e409218775dd7b91b5f4f18f6173035cdf8c040115af4f1a539f684c33e6491e331c1c6 -B = 0f31d7128ca48d0ccfb0b44d8dcb492b26278863797bec9d705e90274a01fceeeb94f2d87ebd1be1e27766d50d3ccdb489bd7ff37209bbe8a553aefc6ee6064439d56ae12b0b3309c29216aa5620f81482d452a42175b466e123dd33b8f0e6c287fb4a05c346f261598c2d1a596ec2b6b6d6868a8803ba311f91fda60577cc47 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 3f4a8d90017dbe8e77205e65fa7a0875a1ace6f3f215c2974e47dbac779804143da3dbce92db391c2614c078997c7d1a15439ffb51a5787f5bbaf98a4dcef576a6317b9b92dd8141a8fadc05d3be7c150630668e620a4e07b4b00519f34e422610a160de112f1ab8adf09a9169ba95b60242c89196ac6e155021dd84b3054511 -A = 07aa39d8bbbecb27551eedfc95fcb4d2e16a546b9370714638a57d0a0aae7b828ee7f406c53719c1aceb08f24420fff3c48c5c3ad55ac58b8d771b26d46208f0f2ca4b9a529592e77e72a79d245c0df66b4eb98db345719104b1bb402171a76c31ec6c1fb4a89a1ddbdc0cdfdf63ec1668a6aa67d4f059ebbfffd34d81733955 -B = 3fb86ebc3d9871c0ee555c8b58171f5b902890cddfd56af10363ab6501f905ff71b956a8fe05a5aab30e754985cf89e0b57b584b19baaf13de6033b90de7e981a5c0481e5395c722574ad38710a09467c78a4af758314ace4b916b66b77254d5cf3651c604e2db74d52a7f7d6a0d6330521130a7d3d3f4abf1188ca05a94c625 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 8a7f3cde3230af1f1fc25e0c0e9ebeb69161d3864fa5a03e5d7f8c82d9940ded285df35c008f61cc151b4578e2677b2f2cff3236935de5bb1d113597eee448496fe29bb18343687f6e9f1c783863e949a0954de2993d47a03607423b458bfd18c844ab57e9e2a43930df159ce8564edb5a2a37a06425626502e3ff9363b73c79 -A = 4f61db5497413668948f9dca639fa0b8c309827d09ba1bee51c9b9cb6e2505e1080e9f37b7ced0429108d2865be341d28a8dc113d2fb0c54701ba26b447537fc4ae4e9b663e431c21114edb04bfe80ca5ac6c8ae544db2a03cb886a47cc3d02895c12e358501e4bc0b78f11dd0a9e0b5cbeb93ca26af464a4f941a04d96caa43 -B = 07012f2a22b4feed36e3c42564d8e522d636854fd67d0cee672752a49d7d662d3a402c462b44e55d4cc9f528e8ecf5192d823606ea064ecb07cbeff7f3f8981f0c98d6936f78b856e55087fdc349c41f178732c63c86441a9e50f7540a200ac5ef0bc456818ea6bce8449493f78376247a6ac5ceeb987ca6d593b042970500cb -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 76f8b44df8d8547f8b3d8537393d2805c699eb37d19bd115bd5539adb6b6a00d004def3b7793d5c71e0ccd2b7e9fb87103c1a5f56a8f18ede1bfe1607a346297166596aa78dc584c7c32832e11b72fb4f2d40ae1591f341919bc0157080ee8febb7fee5461a918d2178fa407c37a8243e24206ce2c19c3addcc2b7c3c1912b6e -A = 7d77c556f07bf2a064615d8fb92797ef10a47ee09b6a0570bab9c0a75f6c974af941c0616a3dfde8207b2e5e521b1ce0d3df0d472b2fc2525afc382ead0fbbc93b4b3e94ee5092fc803ce3044a4177023c44f1ad593610f6738471543d9038915786abf1e80b3f88245f1fbd28c7c9831a99a286f63feccbd4cea9cd35998be9 -B = 0edf46c2f7d7ca2c0104347292bb7c2593b3e2fa771407925d2390564d3002b11092b735c0df368eed29b09c0b173d1d438a0f80c53311751c0c0e8fb489dcf6ec9113ec9598027fba1d7512d00d3c6819095e654f530e58f7e290b6fc6d08e383a6d6eb72c9e1bfc7da13cc9329568357207f127db545de6283682a81aef02f -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 0f580f9d2438b22700c3ebb23d1dc296f3d33deae2d32dea51c7ed3a0ce7b06af11046bc1cc279bb744bc31e7f822c17ffcc5dcbbdabe213bf97bb85c7e19ee71a513bf59b25b3b5787e42e9f3ef6aa1acb8705d69924a107b4f88e0cf9276c2c7c47fa4bf56c4900b557aa5587418f0ddd899630ad3ff678b5b907c07247b2b -A = 559a8425772b6bae495d89502ec0b0f612ce05901a75f5b123b9b739e83ba7288bf50d9f1d60a35e0231bd55415eb627547811f9e1d116fd42fbe05b55ecc65580df3274f04216e5b8112fe355c616eedab5b884df886f8a68268665779d317e8106a91965df837fa7cd8e243d86ea8735250ff6e52e9dbca9eb4fc081367218 -B = 27d368393d97aa7053f13fd6d289c8dc75e95ed80902023fd4bc5d451dc9f6f80a1c9c9093764c7fa8712834bc57ee79146332ffec2f99b4f53ac916c4fc42cd19c6bde275bb6a1086ae30ea83782728383dcab31727182fb6e3f080309b5e2b64681c57b0b94d9b22f6f6f7de7f1c0f6a41d15506ee0a180d4ffff0a41b3d80 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 0be05efeee19cc91e30a9277a6551aaea63aa3861b63f6061efbb0b92296e09f4709529eb849d9f40406fc59c526a4697144cef9661b556040458940ffd6a87ed56cb073d2ee0e6d1f05936fddd1b9a8974a3088577847ddde6bbdfb3d69158d5b3899c13ec78fb5cb6aa7204efe308bbe0b52f18381fe838536707a8a27ba0d -A = 2c8d9eb4e2a58670184fb9c00ffa47029868b84ac0142f439a79e45f81440d56961f9a141d7c93ec675cc8f919ea78c94a811521c96275e3c37ea3b0802464243f6ef8ad4bc80592d260ed1db89d1943148eb3fc7af6b8637502a39bd1a0f96abfb0b8bdf190a4219b316df401fd89b6cd62a005168e9bbbe4ee212aaf6d6597 -B = 0b62c2b93aa90eaf11bdec69c71db10c98634b260bc38ba8b99f5196163eaab0ebe5f5d8a8b270ff0da4ff4d1455230db7b10a3c91b4112d7cbd9d7e9a11978764524769956e869d4c74085ad7db55b519cabc90d3b8ceebe16b6f79ca4cff4372eb4785075f850fa0b39d187bf78470bebab071130ee81b84a4b2d428cd09d6 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 705bf20b7d92e68a69019cfd721b27373c7ff22f911066907f556321371fba70dbcb9774d3a26ca43e44ab20c586a3c1546fc3152ce011be66e04a59c6631bc8bde18efb7bf1743b9ed75a7a6c5bf5a4117368b81b112a3cd4e1c44a621f534a11c426451ea5fde880939ee5bb28d9843730e284520a976cd9f60c94751050ec -A = 80f8ccda42d67c71e2b300cf66dd8004796910249f21b2dae58fe8a2dd397c2e097eeb590095b7441fd99c2f8be6782dd31d1278bf2dc04cdee056591084ce99750b1c00f8adb53790cedc30304243bc6f745df5063fae339b17d47ddfb5acc84371e1788e589627c30c90d03f1cb83ed6c2b318f14ae7ea362531e19ff73834 -B = 2949c6fee310778299a7239f3972d7901a434328400440bf455c59ac1befb910af7e66460467880b85566e6645b284c0ff489f81c93fc4bb09384c294fe0a5bc9dca8d471aa5e3af2d59895fe80471171c294fa3033789bb171b7e9c5d6f4d402babce5a598b516c64669cb66440b5757022b40a27a1aa5ece6c3e496287c8ec -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 7306e3172929c00c29ca1db360eb4ce82066f237e9cf6aae368d1f531620e9b61eb64f5b3e2b735a3b565587d7e955d052df94a20e4aaabe493dba2c18e85fcfb65df166cc48733632d165129b112598bf5e4c58dff662e558e5f71b25f36708d3ab6536b1cbdb5aa2ee56d9e019a9c3629185b188af909831629ffceab634fc -A = 5cbde68abeff0a10330ffd04371c3dfc3027a2388812cb2b5586927d200ef3a4571960ba68b4fd8afdaee122424dc12f411d3d199537692e4cbccfb87fda40a50fcc2928e5bae460f10752119f46041e3377ca072f28a994826e459a5081fb923011ca94dbc635e4d16c144731ab0a90be090d3425ce59fd48f2bc73e3d56b45 -B = 3d680b0583f51341126fc355c7f65186b77e9a239eee80ea88e397612d1bf8e8f50ad7175b27fb7dceb6d93ac46efb41154b2fea43118261fa7ded03e72e48a6f20610cf7adeaa308cbb987576de3d7f0bf7f8d6836d62eaa36c59fc7defdbe23cf9687038c3f2108581ed86c0071fd67d36082a7d50de10ba891830cee92171 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 361ce44d153f4d251952c0b90681a19b7d2d8df7a6c5d459691a80c06107b2e818f93f30f8dad352d2dd87b01530d51fd1c67cede9b1a6167697098e41bdc5dc5e7a3c310116aed0c7b5fd99dfcdb3517c13daaba6ad10879f600eab846cdc110d392d9bdc0e8ab34b317840a725a7a12ceb48c75e8dfeffe2947aa85b2a5158 -A = 0cd89a84f0db9a32187b94818f89a93f19ce1f85181b88b2d657fed5e4fa85403a59f05a2e8fdbf4db8147c5d4a2b8ac33558a1195b51bc7460cdc6f393c4136235a1d4bd14edf4fdc74f4224ae57334e28c45cd7fa5abfee294a4b9d3d86c2b1cf1ce6211447e15d15102fbb95d16c812f583af13b7244da2a72147e0f7b3b1 -B = 2739adb776f387626bf0e1534d5f0ca0947d633d357af4238c906cb097acd033a224f12bad014827985a976dc93ec8ce625e62ed3e035295e0f50f757f52e1f00f240c3f422d319495921c590902e9f15a57731d3810b7e319d57b18d99be2750af6b475e1b8ed2d788a2dcae1736dbbb66c97f61502b8721a38c4e0c0081151 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 3aeb3ff6e797d271fd2271499a740a91569f300d7392a7b5898084012a3c5ad379a57d5169e43089cd58fc7210314758d5368dabca2f0ec5cf6786801bc99b45cd60403c732d9f98936aed76da724bd3e7d4b622dc690778f11fb0310fd4cd980b220627f7a864e107f93a6259081c6581e5dddba4890508af8057c1af29a745 -A = 3c01ac611a38dd8753dc7f9412d7cfaafc28e0f8f3259c692570d9340e443bde62045ce708f12931c365df1a63100c51279ffaf5eb9cd5fbe4a0d5e9d361978590541c4136aa0102d83eb3fba92c6b4b7b56fbd7161628aeebbbb6317a99f4752f13ab189b944f4423706ec58dbc4f3b601905f5125fdb82e8d5ab32c01cca44 -B = 87dd023be26dfda2cf0f97f7643feb6e066afb10e143e4497ecd813a4403cef4f00dab4c4fb45d6e2f7d11e43159b2791598acacd3accf342603409ca0a8a5b6a9d7e95e08d6af4e08fc438ce60ad022ca042e49940141f83db841b6f9386fd4aae6139e921d45f11f8b0e55fad6736d77f6d0805d4b77bd7eff96121f489d0c -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 734a429c91f5b0f06fd47725ded06222c0193dd407e9daf136696f203e153c9bf6df59016849284cef93fbd35edef2cd31c9b956fbe562d2a22100f177254144718ac7d22c99783fd523b642984794bd7beb0d0b363e28d3f3469ee332ee364faaafef25c1d4a11b5e517e44a412ba717a113ea9e1e8f2d6db8fad6f10d06950 -A = 1905086d5baeb48978c09bef95673d3164a6593338c921cb80436fb6cf623a7692de245ecaf0b77621441a81478c08b833110c2e8ed60d2e386977e14815a79c78d6238f952c26cede7d30601411b23e337f12e9dcb38754072bc2780dc083ef234e3e41efd91e77e9467d901b1818d718dfaf29ee1ef758a41d74fcd96f1382 -B = 6e52f31eb94cd75b1a5985454f87b07d2449479299c9767d0b2e8e91b183027d2eaff0039b60de6be980a2556197a1e5e268f3149041690d47e93ad82ee48802ee045f455cf35b265e0268e905defc63df179a11d6d28e0451eccf24a478b2a696e17d5ee2cc194b2805d3ef25318a0401dc6662ecf43822f31916947e0a1da8 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 427609751f28edb62c717bd98ddf999cfcf65128b652be1b5aac0dfe1bc0f7687c580ec70c8290455a9448c69dcb550c0cfdd109af561ece2ec8707c1d02e8097e780f32ddd932e706f81f68711acda0e7610f4dd0fd55f6ac7ca3a3184f655b0b29d2d62974739b43ded96b413b9e3f0033ca1edace24b6bb610bf06b5d940a -A = 39f9d6a8602f69d9caa78a6680e86232afb933f8087bfee6197706aaad1b5d986e01a23ab0e68a5d48615f3e95d1cdf3bedea4a36e9404b55061b11c7595e550e871dabeeb2f77aec6db0c62d1d1f4b1541c65d5fdf54d309e1f1b419f98ad657a9bf12de0204243887de1efbb3283c3db069ad3288be1c31b6bd8261f1f7f90 -B = 3bb5fef79b7f3c7a1abc9854fa661a55418659771168f02ce505255619658517385147e32abdbd4b1570320041deb73fd3756c46bacb4ce19eef7d6620fa20947e5d7e4fb97a90d1d9ada857b55a1775fe1a51a8744ba504f562930f116623b0e01bc264a292c0215cb6e4f1709e952e9e37bd2c22243eb218fef8ad1e277dfd -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 533d6d8d7384e6e65569ba0daae0a8cffbec1d20e417a6edb42d401a59de0a91a7e6854db081ce33b76faa63f6d866993c245e69ddbe6c86d339f7107a4807856cbca23cee2bf5496388ae8fd8d7c78767d0775acd7bd6202dd75451b424034e2766185969b5663b638d539f718e50a9f752f406c224c000bf1ae1fdd60a2a82 -A = 7d8a8c8f86383c51df46aae55a1b2125db3fd05a10113b977bf8c6c217d558501a50cbdd66a7faa6d3869f760d39f5f83eca0d2b550843819c716c69b9ba5c80c171d8a5e2f6445d53d1dfc0775d28b26b78175e27571af7643d45495806a890a8ac24a7749b6c2869ccf2641d2dc51d3a2a2400b4b94870c8b34934c8f0260d -B = 151f9170ef6b8731f80be191eeef40887a11a9614a370aaec248e37dd1e281662d2f36b6fb9980feb42f7946079b6255134033be7e5a63737c0c2f035aefab18af0ae0f00f597c1ba60d2c1a77dcc33cd660934c3640b0bbd31239fbb9f3a7ec0fb3385c70582bf75bce7ce4f35c3f59429b5ac8759cbbc091d7e17aa10cc905 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 33960d7ceac73f342d46275e04fed56563decf2fa4c0e9307c90288e911ac8782f8e1354fb051a9da8e2db83d7c710b5d2b611495e72ed42259ce783a7e7a8f601c07061ec749481d39a082f29dda1f9c7f444a33ae1c1055d37a677b848af371cd3bd41c851d31a07e144d7add66df39576b8200a8b918201630b3da8e664c3 -A = 063815fc3637712e3dbccc140f837a689488bc3585f8df9b5f6dddc6379f65b9029b5e5fe228c257575001b257e4612bb3c3884ac0ec5e9b40b1ff9024022e55f49c9ee2519681d4d9969e97f78418555bdad61db7d99784227774d06769a906584bbaa02d8c4adde53c37cb2c9c63a4390f39f87e76606a5f889446586b5214 -B = 61a95ac8d7450c1e84c4f878cf578a36a75f9eacbb2fa19ffb6452bfa8b326a703f48e09cf56f95f67cce9d5df6813be4d29c9021111a3c30d8454494a3d4e89302bc1912ad9de486066059bd0374e55edbb5ef90f380d799b4ab5ed0d57bcbbda3741aad1b3bb7702891ba4deb2ef2c76f2e9603331565a96b085f2aefc05ff -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 3a1ea3fccd6f336e6d444d68af1753b83145131954c20f1e3c433a89eeb7e267425a34d91f67fd65191dce85769ece2fc7ab12d032f3e30f8509095ecc05148e47a85391b21a18257c338a6a3ca9816987abc8143fe443342b34afd8a52fff00dda2e42b1b39322bd38c6a1f711051f791d6cad2a47ebd423a9b933485fd5861 -A = 8cd0fd6e7d3c80dd431bcaea37c32a7f49af6fe2b5cb40b3b7b137971e321b7fed8c83a9e3288882509f0c862389c5d8af892b799613f621fc03470d8a0505156933f7dc3b2b813a813892067371499a316e63bd9f94681b18ef35ec046c2f430e54d239fb4ae3daf110c1654da8142e9ddc0f9f3a6c98a1d46cef2f259e8ccb -B = 73123b70cf137a3c0d3bbff4d81547dd884bbe6309234be5d7185a8a3de97172b7e302237d0b8300cfde75957ec4225b2cc3264cbd73125c172cad54bd0f99b327a98761ae4d15521323f14a3727bdcce3da113ea2f26089bb4c775eb540c4527da96531330db60fe72db6a4a43f7d4ceb21a06d2f73652c5a23bcdc89056029 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 4331f18a94c169cf0253136bc4eb7480c9fa4401c18db1194371dd53e5f7b75f07ec2e1e1c4116a5d2a8b2cded4b22925b67a88af9b8479c6e821d58cec7ed9f780a4c41e729982cb33f69b87d01c11cb9a8f7952db1920b6eb2124fd5d820555a99327117d7e8e26d18e748fea3ebc17e1d07161fda57a21a70c7f4e251612c -A = 167c0966a64416255c97f30185c67f3b1c39b4e1cec80da6fcecbd56639590ef0916121df9d8b872be7365d78db36b7d995d7a422340355c03c5b8e8c735422bc5fac038434c56ab278995fb206b8b01e95580d95de6ae87b4fa885eca58f86dddef351aacc9832b87daea0d29ea8f75c414980c354516302b64030ceb2a58c0 -B = 75a596c8c1d90226fdbdd0872ab3f6f68dd2614465790bd318141844000fb78d01c4de3edde912256298aa806bf076bae134d2bb46954aa7b11ecba23ee42adf0c49b19eccd4a37c919d5424b7ab7148a8d5a16d429d409903e399ae078b4c6854c872caa949d2118e5aac44c58dddf88da3e613b92d1a93f92ce658f9eb5aca -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 2468cdb1a26eaee34db3d2724e37f023c8a1788526b3dca99321b574685cc8303c609c85401a58fe6da181daf4111fe8c6d4b7428b1cd301cdb9bf8cb6f33140756c8b490d3b2e538ff294fd6471c4d17b9d9e4adeae0df088cb9daee18e825a368be57af4a096056b9e76b94c8d3b911b6a074ed41082926773a585007752ce -A = 1dba6d3450c6aeaf768b5f22560d53808be49609dd7909e3291a684326ab94108d019735883d7b2e2746a1349376084d362d9fcd233eae998c4c4e1298e040e7195e4eb18c0e8235482e9df34fb7ead4d97e07ed298cbb6dc1f6cd9b43ac0a3c4bb5602f72d1cf4ec969200e541da69f29055959afbf09568b5f058eb00f5b71 -B = 1256752129bc0749fbf301a7515b7da2b3b02e4867ea38ffb8d182102a0560de5afd088820faa5fabfa891ebf81646476e914faeb94ffc0f1b8857ba737b03004c49726f098adf08fdc079926ad127b04f9cfd108b85dce48985491668a8fdcff33e73c09ed7ead2b10e3ffd7e3018771f48f5dfaab6cd613eeeb00db9e2c5fd -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 2909d3aef7a21244efc9b5b16626e260907ac11f3d00647f2170ba37197e47b9767030195c2f6d5eda717a83a152141bffed2e26777417ecd8e27aed8666698c2e85a414dddd52b07b52b0da7e08b3217fa6a331f84820d21086a4424974e1e8cfed3501eb054242a9f8bf0803a94981b7b81776eca6d07cd50c050dddf81d68 -A = 1fe3344276193338b148d24a283da1232a79e3c4511c515cbc656d51765639791d33149435ddd0203b022ad6792da6db6d747fbab3b8f621e396f270a8cea2ceae20d2fe35075f26899665a530aa885120dee3ad0ceae78fc90a4ab8b24768bad013a3583cabf5f887d32eb9d7b653869e8f1d02e64d007fd2bb3a1ddf1dc0ab -B = 771b74a9409159b2390b2e2356fa4d234e010703634c41a0aaa3c0bf1f86aeaddb225f6f1c00ef02022ef365e6893060927502aacc1764c742939e52bd0713708c9f537b9377fe6fdedba1c7b6932fd5d9554d4e4728cde31311fe4a597f6855a134c805a1a61491e9413ef6aa639e0943a8d03a6f4a04ba23ca83133322d581 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 22407e4fe280ff5a10eaf46d8e1f5a1e77a07410cba4106466d703b11764c60124fa355733b47327e952a12869476306926cabbd797fc80b4a6dedfbec0b7718ee754d447825cc405a98b85f1e09ebb9294c4a4636aebfc61af4545b921cbe759d3f389beece3f29c2c7c07691a4c46a1a72ce418a239fdec80df48732627866 -A = 7a2d6098d57699d749c4586436bc7f4a2a1813c5584e315cfd268ed87e1798f5e86297e0c35e5ec7e2923613325831d10a8f38c64a48d9a21c15736ec3b32dbd9a2dd6c6e8aeba8280ce7d13d0ec83335ac6e4b7949973f711dff25d8a206db602368fdea2fa68d5b29f8bcd923462bff0bad141ebea067d64168b81586efb27 -B = 44b1244138b185fe57267e68dc127801b7772d9c98cb9edad0103a7f9278407b8a6278a72084eb0df065019678e53e55a47591ef4871272b5a55eb643a300ae080bedec742dc8fca1cce92b54113c19cb5feab2801f26f87694de2351e056260716671771f843c67bc60398ae66631e0658a892fd408b955aa9467e89255fd7e -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 385ba217033463cd9cb882fe30373c2d8e8475dee54aba1ca9713a709f40844905c2544ad792784cc8eafbb412dd68de6f98522dfca1c3de8e3bf4cbd09bee4656c4341153b17c98f9ac09411d16ec9880835cae772bdd8eee51eaba7c02ca6a1034c2c5d2d48e7ae3eb0e22f59bf69537ab6f1e49e58a71c64b8934113eb069 -A = 7d3ffacbc5b44ef4e8b876bda0aaf996ce8468a2bc9c90eea56ad07b459667b226c7f4913e8a26c76d7897e8416728255bedca9d3699342e542424b6ab31247015b87aa73caf13762ff7f4982e9d5ec47a731aeb5237bd0007ccdec785ab3d36893b3fe95222bdc80027ac067d92e1e0c2528e29856287704a767a83e9e8a10b -B = 2db682f1ed91a8f6aab4711a43374f7ddce626e2203844943923327a75560b9358caf635a6a0367a871adb52cf1d69d2ac16e029f1386eb24e69662a3211498c13134007f53b24e8cc19dc8579187a44f71c39692ddb63c97db6b495f2a477874556f598de1654addf4d2acc640925e8d6dcb0cf8aa505ea94bc6d32c68b6ffe -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 7865f718cb30026837ca006f5cd997c5b917726ac6d9bd8c3fb9eabda0854d528d6cfc10e4cd3f93f6848582690c6a83955072daefc6959d33192fcf42a111650e50776ba9ae43d3d26e0ef2c6b60c3871aec33eda8c56353903e7ae96592fbf350b88d2f56e03f7f327022a2aa9b7c484a000135b85bbaba6f8836cbfc81901 -A = 7c2990afcd18e3caa1fd69d3d34012df8f224b31834c6caa18fe955c9358aa1e5baa5d5e55fd8575e8b4842d0ebe1d085f5d0b265d85e1c410fb56250e5bbb53ea1c877a01508199960da3baeccbd789bc18cec6f5e11468429131d4ce6ba21ed1d3282acc79f1c712c9e100701649076c6619ce63687a584999be1fc36c637a -B = 2da8f89ea6ed4852352fa7134218a60afe222a13350865dcc5386fa0dbddb31104447d85e747d4e03c14249b914ee0e33810c26a0c9642412cfc87b7bca63cc5474ce3a080a9944a9ecb01687d47c2007e3304ceec2d2c3fb62288d707f12c36a2a3a4d7d4788d5e02e7e6933484fcd0a13ea34ddbbbc23c43c987b29e6a6566 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 2d3dfd14e7ec60f842d1db83e29a0f6b052990fe8900887dc44476ed3948870c57e72e91e1941c476baa6aa86f76dd8ab6e6ea41707242c46d39b54215bebdb1f28e59d719fde18bea9994610214ea68ad9f2da24e1ad8a06f8bc698f8e76379ff332a2745af472d52a4b8e57d60280e19f93d5be669e0832824321e9ad8e76b -A = 7acf033f16023d08fd1ce59bf509b356780e3a3f67d8e51d113acd842a2e631f78939c7ccfb759c2c23d1f6551df12a37152d310ea3c87944000d693b80a8348d4e2d8deb20afa2b680d60d175885793a356909e9f30c0fbb86416387b6fccd5c283ab24c2f25975d03f4f63ead50677d4f36d4abc6a587e24f4f84f5a479d40 -B = 8d9fed484222a3b0feae346149e97d6d426484a23109dedf713f796f2ac4869c48052619a0c6dd93f83a2000ad2e17ba5d07b03499f780795777b60e8a6e029b4192cd951aeb96110c2e7f9b222e222ea1b3b0f6915ce082cf89bc9eda3b093a6d6e6073558d639e36b338d39ee1071aea397af849776ddfd3b0fbae1bd22c7e -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 3f66970f600a9d09d73fd1ff813e977f539d69fe1784b8a2f99506d868418e4b47338ee0cbceed555f88824f98ffed39befb69e8907a5822ef7cd2a9950a070aec8fe4db9d68e1c0620f9eab4ab529c7e69466e325fe1c6c011bf7ab62bfd1a136597d7d5c47e8eb161ea048477bedc88fa30e4f7ddab2cfeec3fd0bb3fb61a3 -A = 5fa80de456bbca574fa714911b9ca94af1173eb72b070c02ef2d9d309bc9a2280da161737520d188f7773713b49609d0f464b7f9ee4e6f543d7b4afe587f5528e48dfc5d0f57e2f80854d19b1a79014d7810307738f8ee9c95ebd7a14f57dabd1a65306ad9490402cd5197b4b875edb11c7a8c8a2d84ff18c90374986736ae30 -B = 2b8d6d657673207af8dc9736ae4403cbe18cf5a7342db3a642cd64cfee3c7169626d964a11f0d729f50bf4f1d168ddd25925122513f212b22d469246a5d29139dca4b672c05f5f0fbba8f3ebb155b50827222509fac81a29569d3afb54637a23521297424b038c7d494cd17f034cb3f4391618f9be7b83ef9eb0b9291204cd8f -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 54e95e86e87bc220c8f53f8485402327885be34e34063a1b81e52a23fc3056758cea1c039ac4e513f70ed9d394f5806fb771dca8e342368184e674e6296b9a705c6380bdaf11550cffc73f9f55b9385c85fb648f105f11138a3e1f9dc0a39a0f9755f8328701484d45784e3e4b2ebddb32c9d9132867c6513201116428b791cf -A = 0b173f5024117f01e232da94030550f07a8238d9bf01f724556b8c9f2b9844eca40739099b26dd07d8e7f987cc990c4219fd6b85928caa5ad34ceb345768a3edce117ae13f8c24a0fb1bdc7a447f17a545801518e4672699461b90b49fd063d1e9a9282b92a145df17abfab8984a08b12cf99fc89669b84672f2541860fdce26 -B = 63ccb7ff8fb3f8b0b81d40ca99315bfd75a59b7094b349bab7964707e13d45c5adaca7384f9528e327bd7e581ee626e99afb854ca310bc712f63cd54071d22944a20d722bfa2dee0b1df774b36fcb22e383120122e34d1cf03d89e61ce08d1a2b3429926a6485450c810edfa32e93b798d1d21b2837de2dda41ce43ea92b9f6b -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 6e0160eaac8e1c31cd3cb6c5fb91ba086d033b4b69e41dfffce7569e61770f6629f23e12f0074c47c46653bbba94701ca798e1a242f7c4e25708d3acb5af6ea307b95cfa220f8879cb4cfff96b843d6eeed2b15c8f1bb21bb2b511cefbad0618d49d9ba33cade6da6ab3b846a6a24e35fb36d41201d3b85be831522b9bf509e0 -A = 0a1b0cde1403c856bf5060fb62659d4d77168dbdd0555e143f913e4e3e59a85c2f5acb33183efe10451011bf55b5349b580cc4c77b0c2e4e43c3701a47ed77861bdd1cfc72815648f9e4cebd0ff5de14569c9e2fb4f28fe5353b6c02c29e5d59cdd85ffb4d7b00cc838fe94efddbb0add5961eec10a305d8717c746640779cd0 -B = 4adb59a7382dd54a507e5c43540edf84b787096c678eebcbd518b92bd18201bbe08bee538061036df61e7b776d719bded24abb5d9da435d9c5a6d65a8adf98298ac1940e92f92ce8c998858860efeb80e094ab12cbb762d1c08ab67dc417d52cf875f111bd296a5c116fa622a8d55c46791022f3e6c232b351be54509c472450 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 8dd91f390c1f85f153f332de17e5de82979755d835398cdf3dbda1ee73c68f8e7565a964ae33fd5b1f1060572bb3af67eec79c4c3e2eb4de118d471f74351b80a5dcafc682bc3cfde642e611ac1d5bc2c49b308c30985b1161c4d78cf7621b503e2dfaceed886befc004f3a729b4a9bcbb8f13791d973bf38fb8101d6b7a4d4d -A = 842b8a197700ac4ae9ced798cae3568d338559d8d3f26f413efe95ebc71217d5d2d5a7a8bfc9cfda8f9df82aec12dd16b8ea1ec87f32445e4e69965399894c5c3eedbbf5125fc105f43987d88a9635047918cdd8fcaa66cce9b8feacbdb378894f80eebd9854cd0f8fee40977b0a460cd3d6de2913d3cd5c4b18f9b0d20fcf35 -B = 76c704cc65ddbe15e475a9d2010cb4830ebdfbe0db44e2b1c8238c1e01c3dde1f7efeb872b1d3b248c1c60d2be99f998b07d4fa31766764e020f02582c6740163d1d4f65351415cd0d5f51b4777c9c3e7c53691043e4fce0f70347940723ea5ed38a0ba978dc6c9010c0c16a64175346b619fa523927bf5b0a3a96e489f1322d -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 2b591d2c57f6a5484b43cd7ca247c48a1b38319e843257331c8807d499c7763de4eefed529e70d4c144e5e843ac00ee8d106d0d82163cfb7afe528a7daad8e7ed105942d1128a67e38d59325cffc0c3dab9185247e0082e3ccca82a900d917c9bd0f892d4b518a752f8e9d38eab2acaf3b3b59f15b0fe4cb9a3dabe6e0191493 -A = 4d424d97df47db6bdf0f0ce58e0fc09db1455b7aeed444c9e099a344a8622cba9f20efd478bd1f542ba7a33bb7da8460f0b6b0489b410865e879a490df70bb417db6f0646761dfa1898a032372e06c15cbe34d176567f2e4f921733a8190603dbd6d3dab47de0b14031d98ce53679c390231197553971d0d315b2fed8f6506bb -B = 0f6d57ed815e0238a33f7028e552e40172546b96996dca7fe407f297164b5047d57c0b927db499abd6617199b62c3b307c9300ce4a1c8f03160d41004d2ad54a94402d6fc17521f1f4ceb3eda248d58de6d1660f803c45d210ea11f56c07c6bd975e533834c80f535e2d5afefa54857b3aea1381674c94d7484c7955459e8aaf -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 2f53bdd643b5b22445e2af3667a93de52f8bc7bc151e196c0ab0bf3b4e4dc0e5dae9e507508711a9e3de52e2aeece6aff7fc8a1db65588de3272839390a35a847e29204d3b9b70e10352c88a10c86cd33e067fb530d20a3a5ffe67938c5a7a9218f1164f36a73324adef64da64d5fa5540d29a76a87ce010fb7d73a59b109280 -A = 20d5bd41685173e10f25a46f4f276cb6b99e5cc361b4ea50e119c872ea538585d3255a005b4263fd86c5e51e75d83a7b923fbfc631d2b1759517e7983e6fec7035620839de347e43a814da4895c515c23b3dcb8829ee4920a6ffd2d7f8b3cc08b1390867c9de0d03f1adb06bb22b18c956026377f79322f78b28edac65823bf9 -B = c24e1143b337bb49c2a51d4546d45b24a754d2df0ef7b1c424a2224377c0bc560742ae8c9101ddf0ade3a0f5bc74f6c2354f9918baf48ec5c5395cf7368a0c933730742687e82f71da221f72dd7a8136d4bf38a608d266fe663aebac855ea7ec7f61c5546cef55d629b5a60744ef06feb1e8d29643c3f7792bec897915d88e -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 32d16f7ae2632b5cec2e90c34d191599acd9a1b5f97845595988c1d0d4ceb9acfafbc4aeee9924ce55e109ec88c57610fddc664316e0f9a5e3ed56ea447111c0383ecdf117ab42351b80e72720a4b1d98d4c73f5235507c5b4f7849d5e9b527d054858c0436ac3d2de2704c4bc25de4cc702f5880d5ae34094766938bee555c8 -A = 7a7a8caa1ca12e3eab5b6c974852f45f53b697db1ecdd17b04c5de36a4b4c90984e68a3c331c363a2b0c7d8e2c5886a49fc8f433c0e641801da54c4f40cc6f2cebe9bdd531524c8d3a19d232b40793e7b568c30b07488f939a8a2893b8bfdfa63f26cde242466b82d8d5567387c836b2c402255adbbacc23914ba234078d3531 -B = 8193b601cddaedefee05758ef0a550142eaa2b1fda6ad1e20a5a0e0d546315e8562781faddfe3c8271187a0d363673f817b3b3eff03a78064bd1c038297cb0cd749531c5acbafb87fa7a251e45291473d2709392a0dd29cc881a7d352bd93fe8272898ff57789aff3152f101afb73cc93047471cf52cd4f66f30d0d3015ecb47 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 20877c7f53fca97f8e484ba31f23dcf51ac0f4fe4c5121eec576e043c6ec5492725f1b9f9ecfa64195f71909500a69fab2e591377cc2120bd5f60d3fb3812f9e80b2f6c787e0081c1439dbea76b819ab44bf6bffe87dffd771a870e4f5502609249c5260f91175fb217a9eece4166540be877d564049389306e0d6b313706297 -A = 2ecd5ffd075fc75b53d8e43a57b0d3a4846ecad5ec51cd3648aa734ce2ac560ac098efeb6d29ead3d58d8d90ad3051a800dde6637b2cebee2aa2d35b659c1f8952546baf3519a860b6cddfa17a0cdab71f80239b749fbc904a1422f0253453f63edf45ef4416b7f90dc07054afca84b3766716fe32f4747fecb1a290fcd4b5ac -B = 565ce4bdc7eca8d5bd99cd99ff6fb8ee8d47f717a0d2a58c30bed1b4faa46a4071a7aab50095af5fddf9fdbdbf2bdcdcfdc01b5300c07c078800d9ad2dcffaff29b762eafd00851fa6f7b4bac7dcac547f4d7a11ee5a4bf3de51f2cfc55cd592cca37c67d43f2f12a691b8aaff2ccb90fa34d17cacecdf27f132bca026ce6d83 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 24823628d4fe9540103ce5f611f8a6ccf18788120280179a40c2636f30a13e5076503e8a4b6b6ffca21da5b0f9f0d85feb2ce10b51292ed069f35289ebf5130972d720d20dfb8e6ee80c3ac598570d38e57ba33dbd75f1b03eab7847d865c3e8e471ccaf302461a6136dd13b8d31c9f163799a3c24c7284b8826608a9543816d -A = 2e930c17984ed30e28ffab9684c369fa37ca2f39f6d03e2f7f7714c9a7d8afd41c64277fc5777f5be047e78b06c294e6f13cc25651be8f02b49cff58091de0b6137b7c5fcb9045be33a250895db9bbf1436f8fdfbe5721f281f0d1bc689c07fbd6199ae567c35587b51561d9ee3e0fb650d85c825f63ec11c1ef043588abfd0a -B = 4e5a846cbd6e04d987c003d84d4c62db6c3130fc019b76d8798d1d0f0f01b104e91e86a4c71ff86f059a49b5c4fdebddb77bc3f79a584e94939414481def37ec40f04f5ddc425044f4b13b5eba12f670da79663d89877e35e3f501e496a412ba99316bbfbfab65339acaaa85c01563792abeddb8a3262bb6589cdef770a775ce -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 02c4bc23d0b4b1f79141be9149ee20cc9f1b58ee0a76d5f4205e0862492c18daa20171285d6ff0b600c358be487e78cb5450d151efcff8d53004eece94c5a37f49a15fb2b5f62a79568382cf0a4232407b139e1ec5a9595bee8435b4f138dd72fdc2946b03817e49864812b7b61f179bdd8389791178a95bb6311df0a5c60db2 -A = 34a806fb93c97f5a660926cdb21d66f8fb65f3585980c9157929226a48a9cf933f4dbfc8d5642f3a1cdb71f3e0f3d34a886093d1550e7a834797cf0a2765ec71bc40c0f6d1180e09c21d91be88057232fa9d0d321d6029eb65e8220963dc497edcd2688ec3350cb8d205000aa0ef0c7f03e5b9e310693f0f1e0c114ef3ceebc2 -B = 5dbdd8f9e6a63c183f3307d1678402953e333b19b5de0f637c4a5cec2e087b00eb389b2be8807332843f62696f9cdd1393777bcfa98edbad0a6cb677044e0e3733c15742d7561ea119f0f7a387341cfe1b7e4cf54616f27a487a34fb761f741c588c60f9d3a4e28ecb7b1cdbc0292bbfbf00baa44bc7c06da9a00ae0318400c3 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 36e1e0b44e5afc35d1e19e88e75f030569eb99d326721ced9bd7416ea7367a98305354eeafd204f1f8a652a8442eb0823d2e6644e6320933ac481a3709777381dce8a7c165b23aebf31b2ea2745ce5b352acdf0707234c824da9e1af98bbedf80e940fba00c229539f310838bd625f1fc103f267265ac1243855622c5df72c17 -A = 737962a54816deb28edbe9f7b92ced834b5ae03e65b7af3c70e218f9343f8a0a6a67bfbb163d8af18d40012111a5eaf873f48bacb730bdfa12991939ae0171a0758e101393fc65d3f58c636f900f6d68b7d3f45d05e21fe7271f477bc0551995018da1010dc74d548cdc576eda728492386086ccb225e80561b3217354d696ce -B = 2f01dfad0b016691167e2db9392554cbb502d8e6018c8d95e5c9d830368ed80358387529df98b420423c08122852ef7969a5ca11c73b24910685c683fa3f0a08efdd4da6a06ef89336d32c0704851d361bbabd0163bff2b8680b5e86157a2ffa94c559291852520c1c94e65a59e2e3c26ac9c4deddf9029780d702e96e9129da -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 77eb3cb5277ced02b72368e41f04a35796c2c6cc1273f109336fdfa745aba7c755b6ff3833e9b124d9c78584f6bfda1c94273522f020371107870c288592b7c23964320729d2308bac8813586e72078119852e1d7706d8e15c195486b8d94358736869b15d59c037ba4dc8032ceaa31eac3a9e3dc51ee17706a6956cff8537b8 -A = 7c780aaaeaa1c54e74efb2e896b3ea0fb8be1dc263c73d0934024b28c932d5abf960a3a2bcf5d6befb8ad1f7a8c0a463b08638cf04dc2a65d8c69772299f7210445aad11a31dac561dfdad8fbd608567c9e872e07074ad13a47e2d153332b12074f4165a013134a79c6ba6020999c3c5efb7d01354db50bae7a4e4270d17a133 -B = 302f31190e24f25cf3bd902c25fb1ce7463da9239df24e9da7c362d977bc5932aa39455417328185394301d5510a404707bc70304fe357c090eec66202b42dd871e1d37b3b75d563dc54395af212dacfbbac501bcaf5b0f3dc83ba88b362950400f977790346a9f7f27277272731693960eefefcc82f507077b5b63d48016d94 -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 660a1f378a23fc3b47f693a347d90640fef43add9729d74546933f4b78a26968cc9a70ad6fe8d85bf28164881bf7a99e8b96683c6f4fb54162c144f99a27e3feb736f0d382d7e5b934cfa835c723191e5692b7672cf6918c4a7a93b24af00b1beaf1b80320b14cf2d1539e3376779872542406a5df961f765e59f3480e1cd40b -A = 518a4f172c7dede92821376b9da08aef36716b3d4744b1583ef82a18bb2429b22620b27b7470a3a038c588019f6c4ebc6010f2c18441a0f2f50f4172b7c4b8ab3f178e6e4a60e38b5c928817f62a4561fbe517c705622f4c48e4ba788ceb1077d1e0c9c13c90ad34c113056fff45f8b1fbaf3c3bd7c1e3c543848e75f8116a73 -B = 41de4428d0ee5534e1c77590dbddc8b86460561d2d9834a50a32cda9d5d210fa0ec5dd0cf0c4c3013b7eca2ffd48196c24a5fe08dbfe2694ee391bb950745ee67b32194688ff41af5886b616f8f109050bec544737d5ed8c00149b90cb8dda4f708d8e3f67141dc9ae34cddec5531e1090441114ba5b8e6af3338071c03e856a -M = 8e2ba940fc5165c6c5f7f4cb56a6fde2fab687651099c880d38f6eff2889f6a3b2a3a186d1fee05ed452d11ac712cfd30340d22da763af7b2ff65a3f6e202e8b4f42cf5652c625fd9913b4a032ea9448591b9a839b8c25d2323cc2d0d3bf7a6d15896aa85237b6ac4c9c9a854a23449e30e6a2b7c4a2aee199bc20d30af280fb - -ModMul = 872164b92b9426b237858c4cdafe1694f96b0e0e4c19e894a0 -A = 0c3255cb24a813e27c3dc410f0 -B = 0b144f39e7c2d33605ba7bee16 -M = f3639f4dfb782f3107eb402fabb5fc878903acb5e02e129077 - -ModMul = a8b3fc0b53df3b92753edecd6fbcc5f4840dad3a44da704e34 -A = 0b36249e259b303e453757721c -B = 0f0c1db50670d92abd93bdc84b -M = b05cf978bf2dc7e093d7d164e46d547219c480382df32b33d9 - -ModMul = 76ff291a02715fc87ebfb3e99153c04e53358dbd7beae43478 -A = 0997c4a7b537d9500d73a205a4 -B = 0c679ce666af284a459ae5a26e -M = d0d0fd4922953941acad8beb65c00603b19eb44fb8ca51e3c9 - -ModMul = 8f4b8a585415adff3a7bc35fa88891ba31e4a82672c664fb14 -A = 09a2b56a54bd0727ab4be57ff2 -B = 0edf1781b4296567990773005a -M = c5a7c3b97ba00d6f174a019c6d37eda52036c528f351bef0f1 - -ModMul = 7f8447dd983b113f04c6288f9539e53a2e9cddbca8b2fefcc0 -A = 0f67636b03821c8f13f21217a5 -B = 08473a29f4ae33f36a0d2c6dc0 -M = b829af37b557c3ddbb5257c8b19144b90708a45a274d6655f5 - -ModMul = 9fef1c18778a8691c5e71c0b5208e82778e9bfb632da0b7e28 -A = 0bd162c90bed25e84dd5b6b77c -B = 0d887ee03020c5df356f091db6 -M = a2c2d45fe9decd93a0ca3edab8fee46d27ba23fad9b5294d5f - -ModMul = 69b2dfb3f1d8dbb13e9e479f38edcc427d5968acb7751a226a -A = 08019266c548982a520ab48eff -B = 0d33c3e3b13576dcdb3ffaa796 -M = e6255103732475604df7c6f7ef7e6b49a8ef9e2b0c717925a1 - -ModMul = 88b4d86b2c1e1bd780e8d2499c2221e05fab4f9b7047c2a044 -A = 0a38eceb9c551f0e69a544072c -B = 0d5f8e7c2d534b2b8985bfd213 -M = ff81809b84fb8eed3508ad891d3d8208249d8a902a12d6acf7 - -ModMul = bc5f0076a8c2f6cc8f4e61540d2d6f6d6b13b775b363dcd71c -A = 0c170eaddca5295d6ec6272dc2 -B = 0f94a5685ced7661df2efbd34e -M = fa6bc46aa05033af72aa42793e9174af2e3ba38992f33572fd - -ModMul = 697238dbe3d395e81f20c9fcc8db30c234a1f75f3b2bc27438 -A = 0930b04224bc097ac1d8bae8be -B = 0b79496a80e45212c4663e5b64 -M = 8ff7e19d967d317c255380411898d73e3786269f09079f19f1 - -ModMul = 8ce1e17972f1a9d2e9437d0c5219354728a5f31337808d7650 -A = 090e5d18b017118177ffb080da -B = 0f8e7e09032574f6c66e623ec8 -M = da795e6ef63ff7dc4baef5c327022ccf65d44e3c4e24823f11 - -ModMul = 61d0ee0786963906a028a1df01f836841ab6d39d88ca2717c0 -A = 08e57680f213d088ff1a1e7db3 -B = 0afebecc9943b0093f87022940 -M = b6201f68a45265d7e9183c3255feb4c110c05dadbcb13881bb - -ModMul = 861e7ef401866f815b983ba18a612913ecc20a67016d79cfac -A = 0fc41a9ce06e882942f751be7a -B = 0881c05a51d1ba8134d126a48e -M = b12200b39526c33b70e8aa23ebc400dea0d4d8fe42be103d5f - -ModMul = 814030123025d287aaa8b826792999d72f2d589e0c7f7f3dbf -A = 0c3b33f391e78bee97ceddf313 -B = 0a9136f3af450fdeb245eff425 -M = b6aa9c517eaecb70781e597b907583bbb569e970d229235a35 - -ModMul = 8b16b82f064f471983c7154abc9f9ba355111bacb90400372a -A = 0acff8da571e1c96810bf95707 -B = 0cdd23e5504cc26d0c34a62b06 -M = f38902a99190ae0b5ef26849a6e943d651925666fea271fee7 - -ModMul = a31401dfa761bbe82b66b5f094151865b18a4ba75bb9b3dedf -A = 0e6f48c027284856aaf3b96425 -B = 0b4c326f72a6a22fd4b93ba5b3 -M = e57d9608ac6e5b129b2c014958bfc59137f63838b1ba88a4ab - -ModMul = 4a8573dd8dc50a4fa39f3579d3869745eb8c1153ca508deefd -A = 0855f941d085305725da617f5d -B = 08f09b7d2c36e0340523da5421 -M = fd8caa05edeaa81beefa01957eed97a981ab34bdeb6d8c704b - -ModMul = 81df390c9e51b30bd639db15adb464c7cb1d011cb5e260be58 -A = 0c237eb242c40960861c938c08 -B = 0ab2f481f0d768eebd90d2574b -M = 8697d7a28a5f42c9a7b31949b8b568f861142f44fe66c6cd3f - -ModMul = 0761438baf5b02dc095b7040e082da7b167c2b9ace956284ed -A = 0fd91701ed2151f8e994bf4ee1 -B = 088b66e735b76972bccd9db182 -M = 8008b2d1274456aa68dc627b1ec3e1762c6ed2d660c64a1a55 - -ModMul = 6e99aa5b8107399848cf24fbd88ed6350efb68d737e505b466 -A = 0ca6c51ba2f410d09bf71d60fe -B = 08bdfa8fe5ef3b2ad02bc63c4d -M = 84daecf412b8c50ad6dfdb546c3eb783dcc6f32003eda914bb - -ModMul = 0536175913582e73c1002083cb0cfce5471d4193a5b717881e60abfe927c829d -A = 0161d774df9a787bb5861d45ff4933ced42254532e799233793c81fad319c566 -B = 047c09252d9efed9086fb2fb1fed44d7157a48e642a056824790d6e81b4c1f2e -M = 05efaeebe212752b28b5441a5d0b2600190504467c6359e9ab26320ee72cffcb - -ModMul = 06161cceee2b74e7965a926fdf5344ddf8cc41994d72154a8b6014c18cf71634 -A = 05f37c973d1aadc7e8a15a6cc3d2c7b20d2c1e30fbeb7554dfb4cb93334edbb2 -B = 06d98b39fc484fadc8eecd32c5d1652c3dca69343f07337e9d25618b3fe1b36b -M = 07c3e3b8b1a6110da82674aaf88c288cef4cfddf22e7c9b75640fd67fa5fad59 - -ModMul = 2acd55bdcccd55882eff0bb262bb62f78bff8e932aefc9d32f54d5d4e9b8bd76 -A = 17ef930743334d382bf1f66d37add6e8ee819545997ea6a5c58e833acf159045 -B = 28af21f28b148683ad053aa552db604236f03d61d398f29995b9e091460b7888 -M = 43760c71742e9cf22cae6fc262c008b7f1b97a78c8063957b74aa4cd370c1eeb - -ModMul = 504c11e38284a30e3647c1ddfaed94503d833bcecdff05e749422ad1d9442540 -A = 9231bd46ae8543102fb06042e019c9411c5a3b67f540d730f359e9e77f1f4645 -B = 1c46a398183f9a162b211d4487ede53d4ddfe0a35661fa87c9b5884cd67f5df8 -M = d79fab3eb31189268b2a0689cafdaa0826f07d432591e8aa8bd3c7cdce1470a7 - -ModMul = 13a6431c57ddf0ed3979412ba8454a0dd9a2694a0dd76453aae63366c46e41db -A = 0aa2149ea0f02dfd92841cc2c44164bfa6d4c06f2bc8df7b2e027a2b82a60336 -B = 16b9ed5257ac10c4727e467b3bd012f6ab3cb59b666e6f287bbe49e3c4a0f92a -M = 182572149b860615dd853f37f7d51a35e85f5e4a4249a60fde58dc68e0dd7401 - -ModMul = 0145a44566bd75103083b7556a822ea6008ed3a6a1bf135b68fcf87a294c09b4 -A = 10bf9cf97ae92b444afb3f94b355175560f9edc033f9635f29d97ae10e434427 -B = 29509e418f2dd8a84ebb52ef1112df765987f1036149f6baf7be82c96a11bfe9 -M = 29b060ee2aef7e43e02163d279ce49259127198adf462d13aa195c7dccf573a1 - -ModMul = b00740cef7791692d45f5a7110f3eeb260638f19f87c9245436fc0422de90658 -A = 8f82b047f3e2a9bce8699d4ca12ce4662b04239cb817bb36ca4ab5ed460bac59 -B = 3caa56f9c57ec4862263e6cc2b422b3d8e98517771f8f7b95c87b44a7a202818 -M = f975a94fa62b4c0e68df5c3ac5917d18927c0a6d9cf39c26f6ed97a81cedf227 - -ModMul = 0dc04b6ba2eb1e34ea8942a50d1d0c5479dd22109895796ffdc9cd32b53d4764 -A = 1abd1fbaac8fc366dc669f2abf2b5cf4c710823f6c57d0fce95f34079c9fa291 -B = 1fb2f5fc58e3802dd9cf0a72a99d0f9641acc9f1815f0face7cae83ef1a81792 -M = 22e2856f4c2b6c01448d4aef74aaaee3a14e9660b5b277200f2e67464ecadfab - -ModMul = 19299c9e960ce15087e9fbd66f95cafe82546431b92d70db1de87c3425c1bef2 -A = 6e30e65129c92bf2b24a6ce45592045db370f9411153de793e2af9cc0fcc0f78 -B = 9fcd13fb2e81666f168bb764bca62894aeb6a1630bb07940708e6b1f374e8b57 -M = ab6b4e3d3909512f5d1d62a30c1ab8dd5e584cadbce9dffd12fe203f8936ee93 - -ModMul = 4f88ad4e30e6e8e38cba0452d98d4a3547c680f16308692e33e5577772658764 -A = 04a4f1814509cb369bc9f20d641848fa4358217818381d0f8aa4debd43d0ec4e -B = 9b6ec67a72b0868053f926be4177def0e8bef7915ab48d239e6ca9aea4207147 -M = 9ba20dd78923d8ef82897ac46a509cf22c9b7986a4facf42e5416bfe3576a735 - -ModMul = 0985a4d2a7431e09fcad03e6a3f926582dbc0aedc588f17aa5db40c2d3566233 -A = bc1795a68aa5236a8c1d93aa4720717d4d77e19bffa34d5126a0c3d97f5ccd68 -B = 60aac3751c58eef00fa2ee3fe096bd7060d05974175bfeb6a3f444010d789514 -M = c66842e0a11ed6ad1e8f192ea97f5f244536cfc5234c7fdae1ff905123c72793 - -ModMul = 0133d7b31537b627da2c042217cd28625437c28c3e06258427d9a4384046a1f4 -A = 037f8b1280f927ea374c105b87489355be4f9bd26cda85c1d76af4c6fe38eb14 -B = 03ce98c25f69f6301590b3d163b462239f42e0202af1f692663b40d59bfd0982 -M = 03eae4f0d6c7e1fb9de1a4c160404a8767783c7f839fe27a543f5c389c679d47 - -ModMul = 7f4576a315bad5c7fbb1616e8b26c5b34ca6f701b9b1adf0485fec181c41dee9 -A = 281bebabe6be0c8dbc84f47725180a673c6bc3c8f49159665f5749d6ac1efcd8 -B = 48affb05091c691dc0c6ae2f0fe497be1824d2a33a87bed6b29cef431555f5c1 -M = 9975d8e7f2a4d9d1ff8d442b93ff269a83fee43a18bbfa8c2ccd7ca5fac3a8d3 - -ModMul = 57ebfb39605d4fa6ef5fd03bd8e4fd685664297c29b7ad75a40b133e15fc5ae9 -A = 6080c661828ae2be3bc23874b6f6b23a125ba03db461382bbb79a8619e8c0845 -B = 39e1fcfd15db0040413690d12683bbd68ed496c5d51769fd3a6ad78016de0677 -M = 7704390c4b1da86d51ff817003e5451d601a5352296e339e5da219ec5a330479 - -ModMul = 040b6b0d44cf8a5ca7f4fd03dd6e1e2a11f74f3911dcd8727e57db8d65cd490d -A = 3a9479beb52316aa872fa1d97646419987d7ebc3b1f5009a58afb4d0126cbd04 -B = 3538929797e8f26ff071e734a3f61aa99d36150b8feac5eb605fbd6c03fd9823 -M = 5c0781a87b84ecb4362b09c623d511de53c085671dd4f08e9a551685b55ddfd1 - -ModMul = 6b778ae9822221e6a8376379e0032d7edb14d7b5e32a7310897b54d1d5626113 -A = 21dea2aee0302de380cd990954b4a18e1d52b5f30a0cb70f06c40290c9d3c6c9 -B = 6e1afa44d3135a7dcb416031297c91b1d4193490573b4050f9c77613579f73d7 -M = 7f5978c0c066132a9bdcb00727bb802b72777b9e8e4265f76b80cfdc3a788817 - -ModMul = 5c717e5dd25abe60f761d6f9326ed056416add4c1384682d87b7ff12e112f855 -A = 51f5a2f115ff6fbb007c54a677dc2049f9bd99e1fa1b88989962106cc3d2f53d -B = 7e120151b055335cecbe78f2d5f129e034fc6b30ee463feb50cf95d016b1db99 -M = a6c789884c66c7f028099e0367b3ed86871277bf070c541ee12fc02fcb6181d7 - -ModMul = 04452688244f542125168853f1d444f96ab0f82903bb12a97e59f0db633edfd6 -A = 136aaaec4b34d7878effa8057d78012c897d1757a5ff2fa251cf673b793afa81 -B = 19447559b08dced853b2359d15e098d70a3d04328a0177f471617d5231925088 -M = 2c245d407a78903ef2b279ddbe32106e6333b6f44cabf87b8641b047c79ea06b - -ModMul = 375f8474ee47df6b9a038512002e56cddd374d69c69719d8d369232c64a839e2 -A = 0aa566b24fd87925fe8f9690f62586e4afb979c65419d7b11dac582fa0ba050c -B = 2e0b85b7f590a1a8e8d0e3575ffd5fe12196b7fd066d430944181720e5134096 -M = 4f506313a4f49873a405f2e5a6e9cfae9cd5e9f67b5ef900153366570e28a955 - -ModMul = 036fb0733a26902f0f8f11625305a3c94fcdfffe294eb6ccba110aa628a314df -A = 09a8939689b47fb66ac3ad543034302046a47c8ac325ee4d18155e2cafcb8de8 -B = 09b568319788264cfc18d36fd50c1375a43f2e524fa44fbc65fe12c96e2d7990 -M = 09d7c334aa33634f9f313b71b42476a3b627a6c5bb8ac1d07a8d732d5c087bd9 - -ModMul = 4a377267508eb045e00cea66a417112dac07545304bbeac6315625275b7cbfad -A = a29e606ad0e4926a3458b5853ce04196edf42dcd88f49936a90655019b633ed4 -B = b119f89e0b3ef234456b0421778e42f086498a2ec67bb32ab43bc8e0012f3141 -M = ea0477e7f1a02cb6c21171066f3dab69d4e24429043b0f049de660fc80e51937 - -ModMul = 7952dfdb91252658430e365adeefd9093740de92cfc9dd3d92294f2dab6ca0b6 -A = 9e1693d9e37c1135acef80e49ae1a74e9b244a36179a2984f5c4fce69b1dde2b -B = 5adb9fc6429f638912159f876356ff09157e7bff1073ef8318a1397cc81f89c1 -M = aa46853682af960824140c35d145a6dcff6283b2c59994b30ecf9b8def41a025 - -ModMul = 1aacec7f7e66b0cf4eb2dfda9d8d3fbf4eb8e928cbbc967d13e3e38612f0346d -A = 514599c8c352c6fc850809c6dddebcdd61c6a66edde608e5b88661120c54a44b -B = 059dbf4bea3fb19fbe0ded8c4b0c97fe7b2009fad54775c46d4ceb5f674e11a2 -M = ac4f0a2b22df691331ded955a5d0e7d1910d7920a59d4a87636b2635397b7335 - -ModMul = 2c25d180156fa7d2fc20c9bd6d9ff0b111c9ad76ada0784e2f8fa0bd06413f66 -A = 15dbf10ef83b811d7ef146856243b071f11b25ccca14e62e4b7b4894d91a44ec -B = 556803f5718085a69926a0b4216f6d17b78e1da6db3ff343b34a338a5ffebf0b -M = 65c9d79a09a820adbc9beb152bef387c1439147ed50cef872d36a69f1c7d5fe1 - -ModMul = 56ec8624fc199e7b4e68358f88f1a99f1d4d02577b8c6f7e28e4ccfdd981f995 -A = 57ffc478a3080928ed66505778554e38b40c0f47904fde89191c9c6a3453e82e -B = 4b11a10e8160e6e4dbc4ccf3075daa86943f90322dcbc0ad63f6a9afc9d94772 -M = 73882376ca850c125ce9f20c291e550ee48f0eb0d571109ab08c22d6719496e9 - -ModMul = acceebe131aa34ff21b3235f045bccc8a8f762dca20c1dd1ef6eb461ea971c6c -A = 74ecd7b4f7e0425b4934e0f15949af3ee0f1205227874fb536df33ba6b16a955 -B = 958ad144e29c894d6346d514d1e52eb0c561473615c61377f0f2c8f7cdd7cf9a -M = c52ae49e1a4b21ec392b76844ad559653b7b9f67a58b3bba6c2ce250017eab09 - -ModMul = 62b5b04dc84bb4ee04934c03ef361bc6e59b42144dc117b9f7771525c67c3688 -A = 0c518f9c8afea0eefaf1c57283e5034b2b32fd5f64dc69f4baaf3c38bd337de0 -B = 2e8cd7003baae3fc40353d2e9abacaaf4482a85014363393850e0593fd538ea1 -M = f73398c32191b436d14a0b76c6069b1d61395568753c832dd0c707780a232dc9 - -ModMul = 5613c8fb0721bd3f605089def48fb2c38a4862bb387886c1edc1bc37d10f0e15 -A = 1c685e64660dec256a9e80822e029bfd90c556453a0b80311d6c1895adc6916b -B = 34674001cd0977d54e600640c4d07510bcc0b69f6bf7c991e8a49351880348f6 -M = df8344fa848d1066afe4f8d985cff65441751677dcf3a4e99b40365fc3c978e9 - -ModMul = 30325f7ccbc2c69e11d739ad7132a947c53377aa902ec70b152f3a75e050c244 -A = 94d84fbeb43247cceed9743c5bb60afa789c674ef02423b0c21da2c4a059cb -B = 176be45cf53003f3885361d9f4a1146acbf11926e7640dc79abc0f1c84918a7e -M = 43d57108eb0ab9bebaa8ce137628ea825951c6accb9acb7f1e991c93b8563897 - -ModMul = 1975db7b72434ad32c9aee412645f6670b7f4af1f8a424a5031c559d3e18dce6 -A = 1d135f8832d2730000bb6489e74bf27990b464f2a0df66daee2b80445b3aeab0 -B = 27792d4be70d7f7f3e6900ef689a474edd84a2eacea94ce6384289ced66ddf12 -M = 39d57af763eabe569dac1a103e169e6e3b4375168e41e5c3b961b6e743915923 - -ModMul = 3bbb5bde9e3e240694326571360090e1fc0a4ea7b2311c1e0bd3961f6c159385 -A = e769a7536b8df131ace032cd184a2e40812d83276635a5592e97a201d8770e59 -B = 87adc45fe2433e78d6ac5d6f1678186a1daf336bed3c03ed6c993349e40f7d8e -M = f3b9833a303eb540cf8b6cbc3cf16394b1634ef517be57684e42d364d8bec3e5 - -ModMul = 2d8174211f0367233b3a8df7c5bf0066d6aa792be7cdc5e850a477454d5c829f -A = 2e8b2ffb36d54495286df23d1a5c8d230c23da069106830c829c7e3170ddcddb -B = 71105099df4e2dbe198631aef3475c60ac10828c7beec4cd8d027324ec531fe9 -M = 7eacffe21f88413af94155a2a8e37f70a431a59653738afda04a1bec72d0d9ed - -# Regression tests for CVE-2016-7055. - -ModMul = ccd6f75b5f24b7c5ce2ce755fa89c2450c6a7d96ce8c8791e659eab84577a7695e3b2caa7c980fb23f60634233e9798499c28b0338c1f1a326d0ca89fd41f2fd88b759f317889832966b551a950043ec7a4b6152d3e2cbfb40e88458e70ab783b96f12d271f828d5b39e198ccaf8665411d85026282dbead5d24cd01b6c8a8e9 -A = 7878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878 -B = 095d72c08c097ba488c5e439c655a192eafb6380073d8c2664668eddb4060744e16e57fb4edb9ae10a0cefcdc28a894f689a128379db279d48a2e20849d685939b7803bcf46cebf5c533fb0dd35b080593de5472e3fe5db951b8bff9b4cb8f039cc638a5ee8cdd703719f8000e6a9f63beed5f2fcd52ff293ea05a251bb4ab81 -M = d78af684e71db0c39cff4e64fb9db567132cb9c50cc98009feb820b26f2ded9b91b9b5e2b83ae0ae4eb4e0523ca726bfbe969b89fd754f674ce99118c3f2d1c5d81fdc7c54e02b60262b241d53c040e99e45826eca37a804668e690e1afc1ca42c9a15d84d4954425f0b7642fc0bd9d7b24e2618d2dcc9b729d944badacfddaf - -ModMul = ccd6f75b5f24b7c5ce2ce755fa89c2450c6a7d96ce8c8791e659eab84577a7695e3b2caa7c980fb23f60634233e9798499c28b0338c1f1a326d0ca89fd41f2fd88b759f317889832966b551a950043ec7a4b6152d3e2cbfb40e88458e70ab783b96f12d271f828d5b39e198ccaf8665411d85026282dbead5d24cd01b6c8a8e9 -A = 095d72c08c097ba488c5e439c655a192eafb6380073d8c2664668eddb4060744e16e57fb4edb9ae10a0cefcdc28a894f689a128379db279d48a2e20849d685939b7803bcf46cebf5c533fb0dd35b080593de5472e3fe5db951b8bff9b4cb8f039cc638a5ee8cdd703719f8000e6a9f63beed5f2fcd52ff293ea05a251bb4ab81 -B = 7878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878 -M = d78af684e71db0c39cff4e64fb9db567132cb9c50cc98009feb820b26f2ded9b91b9b5e2b83ae0ae4eb4e0523ca726bfbe969b89fd754f674ce99118c3f2d1c5d81fdc7c54e02b60262b241d53c040e99e45826eca37a804668e690e1afc1ca42c9a15d84d4954425f0b7642fc0bd9d7b24e2618d2dcc9b729d944badacfddaf diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/arithmetic/bigint_elem_reduced_once_tests.txt temporalio-1.3.0/vendor/ring-0.16.20/src/arithmetic/bigint_elem_reduced_once_tests.txt --- temporalio-1.3.0/vendor/ring-0.16.20/src/arithmetic/bigint_elem_reduced_once_tests.txt 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/arithmetic/bigint_elem_reduced_once_tests.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,39 +0,0 @@ -# 2**1024 - 105 is the largest 1024-bit prime. -# Q == 2**1023 + 1155 is the smallest 1024-bit prime. -# -# import Math.NumberTheory.Prime; -# -# main = mapM_ (putStrLn . show) [prevPrime (2^1024), nextPrime (2^1023)] -# -# cabal install HaskellForMaths -# ghc -O2 prime.hs - -# N = P * Q -# P == 2**1024 - 105 -# Q == 2**1023 + 1155 -# QQ = Q**2 -# A == N - 1 > QQ -R = 3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe9cb3b -A = 800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe2644 -QQ = 40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004830000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000145b09 -N = 800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe2645 - -# N = P * Q -# P == 2**1024 - 105 -# Q == 2**1023 + 1155 -# QQ = Q**2 -# A == QQ + 1 > QQ -R = 01 -A = 40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004830000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000145b0a -QQ = 40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004830000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000145b09 -N = 800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe2645 - -# N = P * Q -# P == 2**1024 - 105 -# Q == 2**1023 + 1155 -# QQ = Q**2 -# A == QQ -R = 00 -A = 40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004830000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000145b09 -QQ = 40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004830000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000145b09 -N = 800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe2645 diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/arithmetic/bigint_elem_reduced_tests.txt temporalio-1.3.0/vendor/ring-0.16.20/src/arithmetic/bigint_elem_reduced_tests.txt --- temporalio-1.3.0/vendor/ring-0.16.20/src/arithmetic/bigint_elem_reduced_tests.txt 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/arithmetic/bigint_elem_reduced_tests.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,171 +0,0 @@ -# R = A % M where 0 <= A < M**2. - -# A == 0 -R = 00 -A = 00 -M = 813bc46ee19ffeab364073a89f96913f340d43ee72129ea9edac1beb4ebe1336450d2eabc7b26e51c400cec60d6ee459033b - -# A == M -R = 00 -A = 813bc46ee19ffeab364073a89f96913f340d43ee72129ea9edac1beb4ebe1336450d2eabc7b26e51c400cec60d6ee459033b -M = 813bc46ee19ffeab364073a89f96913f340d43ee72129ea9edac1beb4ebe1336450d2eabc7b26e51c400cec60d6ee459033b - -# A == M - 1 -R = 813bc46ee19ffeab364073a89f96913f340d43ee72129ea9edac1beb4ebe1336450d2eabc7b26e51c400cec60d6ee459033a -A = 813bc46ee19ffeab364073a89f96913f340d43ee72129ea9edac1beb4ebe1336450d2eabc7b26e51c400cec60d6ee459033a -M = 813bc46ee19ffeab364073a89f96913f340d43ee72129ea9edac1beb4ebe1336450d2eabc7b26e51c400cec60d6ee459033b - -# A == M**2 - 1. -R = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe -A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0000000000000000000000000000000000000000000000000000000000000000 -M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff - -# Test vector adapted from the regression test for CVE-2015-3193, A is the -# square of the original test vector's A. -R = 19324b647d967d644b3219 -A = 19324b647d967d644b3219 -M = 414141414141414141414127414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 - -# Test vector adapted from the regression test for CVE-2017-3732. A is the -# square of the original test vector's A. -R = fffffffdfffffd01000009000002f6fffdf403000312000402f3fff5f602fe080a0005fdfafffa00010001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000002000002fefffff7fffffd07000109fdfffef3fffdfd06000405ff00fdfbfffe00010001 -A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00000000000001fffffffe00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fffffffffffffe00000002000000fffffffe00000200fffffffffffdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00000000000003fffffffdfffffe00000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fffffffffffffe000000000000010000000000000000 -M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000ffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff - - -# These vectors were adapted from BoringSSL's "Quotient" BIGNUM tests in the -# following ways: -# -# * The quotient in each vector was removed (*ring* only calculates -# remainders, never quotients). -# * B was renamed to M and Remainder was renamed to R. -# * Only the test vectors with positive inputs were imported. -# * Only the test vectors with odd moduli were imported. -# * A < M**2; any larger values of A were split up into multiple reduction -# steps. The first step uses the initial A and the smallest power of the -# original M that makes A < M**2 true, the subsequent steps have smaller -# powers of M using the result R from the previous step as A, and where the -# last step has the initial value of M. -# * Only test vectors with moduli that require at least 4 64-bit words to -# represent are included (*ring*'s modular multiplication has this lower -# bound, and modular multiplication is used as part of reduction). - -# Step 1 -R = 04 -A = 0813bc46ee19ffeab364073a89f96913f340d43ee72129ea9edac1beb4ebe1336450d2eabc7b26e51c400cec60d6ee459033b4 -M = 813bc46ee19ffeab364073a89f96913f340d43ee72129ea9edac1beb4ebe1336450d2eabc7b26e51c400cec60d6ee459033b - -# Step 1 -R = 18 -A = 966df62c26acab2d3d1dbe729e48d0181c68e9f5eba45f6caefa38d60e34057d09fe620abb8640cec8cac755957aaad7c6fd000018 -M = 966df62c26acab2d3d1dbe729e48d0181c68e9f5eba45f6caefa38d60e34057d09fe620abb8640cec8cac755957aaad7c6fd - -# Step 1 -R = 20 -A = 89a2f1792afc54467955839eddc9ef2e37d391ce7a1a4a205291220c1f49f59ee31fc7a7a7f7706c199bf5c8c951a0d0743d00000020 -M = 89a2f1792afc54467955839eddc9ef2e37d391ce7a1a4a205291220c1f49f59ee31fc7a7a7f7706c199bf5c8c951a0d0743d - -# Step 1 -R = 24 -A = 0877f1caf75e7166ef18484d0718947893fd1ec016984387debc55c19e378a487a5ddbb03a80a88316f6fca16ae148933e719000000024 -M = 877f1caf75e7166ef18484d0718947893fd1ec016984387debc55c19e378a487a5ddbb03a80a88316f6fca16ae148933e719 - -# Step 1 -R = 2c -A = 087bd03a64d9c56fe340137065ba36bd07b556119546dd1fc3ae087ead32bc79ca7efb5c7230ea7bfb00ad419096d9279fbe10000000002c -M = 87bd03a64d9c56fe340137065ba36bd07b556119546dd1fc3ae087ead32bc79ca7efb5c7230ea7bfb00ad419096d9279fbe1 - -# Step 1 -R = 30 -A = d00fec043edadc093673e5f5abef0c6bacdf1f3faa49a831a645bf80db7539d657f69403b122a5c6f879eb8e63be54d35ed7000000000030 -M = d00fec043edadc093673e5f5abef0c6bacdf1f3faa49a831a645bf80db7539d657f69403b122a5c6f879eb8e63be54d35ed7 - -# Step 1 -R = 458f5c63c063b09790a28c6cbd9afc98ded6d6c1d12c8e4e081e4f6a5638a5319a548fe711b3142d6d32827f415a41d457048783c3 -A = 01280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -M = 4e5d7ec324e42afb2d8b381c6d07869985cd3b3de3cbc06853a387c076e6525fd93c3b6de887f31a7580bafb0546f45b785c4e5199 - -# Step 2 -R = 029abc8898d5ef85f87323c2a6fa36ab6e1bdbcc0ca742b1a2347e -A = 458f5c63c063b09790a28c6cbd9afc98ded6d6c1d12c8e4e081e4f6a5638a5319a548fe711b3142d6d32827f415a41d457048783c3 -M = 08da37bc9c7c9bdc62f49cadcd40e156e776b7f4c8f7ad543f463b - -# Step 1 -R = 2000f9c8569d20abce69ced0d66a44ae47a9516205732183408c6ab6c135cd172880f0c0d160862d49a0003656276f3884e88a3c9664d45f -A = 01280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -M = 8406162ef2dd175cc81e309b0e1460dc5a007e3fd5937813e6ddb894a208a249c8448a782379e757d3533a0ef008d597579ebae1b4cd95e9 - -# Step 2 -R = 6c9e547a77c98eaba1b021777dbd98ea88f7fd37c95a2b182f2b9067 -A = 2000f9c8569d20abce69ced0d66a44ae47a9516205732183408c6ab6c135cd172880f0c0d160862d49a0003656276f3884e88a3c9664d45f -M = b7d7b1f95f4fe2f267af88b81af88fbdf603e54ab6de73ccd000c32d - -# Step 1 -R = 0bbfaf15a90e744dc4a1caceda3cb339e5491e4507a1118613c5e9739f976b -A = 01280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -M = 82ae783b8a13e2e65d52dd3a6d6b057163347872f4d72245ff364dbf2421ff - -# Step 1 -R = 82e3fb3f7252dd87b5370d26d9e8b9e98c7d333701f0ce8a05c337054c7aeb343d04d7e342 -A = 01280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -M = 8faf8c0a3ef94ab1069394998e5412a7d84f44aff97edf63abc46d96f897172c38faa0b13f - -# Step 1 -R = 65bf2ef1c2f8e94d98060aa305f85e6cb869c74eabad99877010d30654aa2e578ef6aa3c5f1122e3 -A = 01280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -M = 83cfc25e90a61cf8686e3d5857b2f958674d478622c54cf8427275ca5e9312ed24e44ed4a1b5e413 - -# Step 1 -R = 02c89373720b834d718ff3df985ae47c3a7cde0e0309f682f5fd48dc97a1ff3d69fa0dcaa1245e956445 -A = 01280d26263c574f655ea63006f2930666fbaa4de1b09a11ab0e47dbe0054711aab90a05b1185454dcf046745436391a673426000000000031 -M = 0d6721300e877a8145d05f4f3d8085697c2ca5f34a5357fed0bdb7169f83b6f8d855232eeea594846b79 - -# Step 1 -R = 1b02a7b97f9ac1f6306aa00fff0e59f55fce463ffdc640364a950df29474e08b67cdfcec0628e973d42fa1e4f98e988ec4c47e4915651a1731b71d5e36a10a0d1b3420427dbb79ba7d52 -A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -M = 3f74cafe9ab0c1b307cd7571fd442665fa3205fb2f45b3811b92d1d38b096a2025b8170663a29c52ca84da102e62048e583fba96a594c0b23952fec587814857c25221ff2cd0533cba6d - -# Step 1 -R = 13849ef93cbc77460c3c496e8f31f7e01a98c21cdfcd6877547161f9601680665b394933d3a0824f0d32854508c89f0e4a0873280c779c7ca636cd89cf6ee5d42a917b4f382be3b9654039f623c11b43164827f870fa0f0781 -A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -M = 23ab6042240a7709d43de7ee17332a9710bd0d913c42b3591341527bf48d5bc30abb962482292d45a15cb03c9457cc8d78d1e00aaa63358427b000e59e4260bfe1e2cc603e175d7fcf02bd9f61fae3740cb8e10a510ea3d1d5 - -# Step 1 -R = 0d8c77134a75584ecd5ab29e97a909ec139464901f9cfcb1d3d9e29a63d204615b6845d466c8710873980f107c40ab54eca9f8933ef6d726f9bd0f3e9e97eade5eb1a9bcaa7b01b6ad51ff3ecf67d6e4d345f128e990494a2db434fcd3ab -A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -M = 3e7dd961be36c0c286eb9e78bf3b33e6f9bdf2c2137a0c660f1d21dea31ac9a044e526bf47ec8190e137a60f1f55e947046b9cd04a2485679e48cac80a1bb064a915208889289d63a6e338cf7069ad799861c31ec6eafe02a4ef2c2641c9 - -# Step 1 -R = 0a1a70f674cb141a896c4adace0dc58cdcbe2503fd0ad36ce348dc5b8afc96d0f2f8c65bbbadabf2920012798b7ccaedbe8d896dd2674082ad3cc75b54c5c190ad56ff34e8cb5dd29c031656497d48571295d6da396d5f4cdb652732d874a79a674d06a1d7b979f5 -A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -M = 21917f48bb8e65646c618068fd9069c06e22ce8c679a845f9c4ec843849010abeee12e2d3c61fb963297abca30813c446f2ae82e909ca6ac7839fb58974fa65f3b5d91fb8b3f99d948519ed56653d50026d694060208cf48e3c757f64885b4ed4328c6f071e9f5d5 - -# Step 1 -R = 252d055186ec896cb3142c9e4e49c441e2ddad365b86ad21ae4ef1c522d3306c2834d6993a5e1f8c64a1ed582bad8ab746f7e773fc004b1c47814f73560db72f7237ef6e2f671d3b19a8777be2e4c662a76db87ea64f32c48ea371b1ffb15df26726854a417e18afcf49054c6d2e0e337e71 -A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -M = 2b6eb2caa3ca650be02fa199e9ea6c48646a76434e268713753a547e49571f9817ad396f2cb7b16d307801fc8892f0af3e7f93ce08f7955a8acfbc0b56add4b4c7ef7351f60e402b9a8ef7fe02ccdcb4b00b7ffe78c7009268dbcf1d606c3a1b5307d9a8ee6121c6a635a742b8bf36b56cc7 - -# Step 1 -R = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -M = 3a8682d0e5a4efa985dfa8bbddc2c0d72a4400b8b070a8cf7450aa8f831d8a91c9ae3542641b7a4ad793e232a0d301b82664fe2c7f20bd9bf8275828a2a20027d6056b211638b9b0220fa4252d058bb485dd3c4622b1eac97d54b9634b558ff1bd5bd11085d4f3d288f7965af52beaa922b23ac0207d5763c24c085076128e0ef7370eeaa19d - -# Step 1 -R = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -M = 33aeafda3cfc20710f0b4a3d9ace4817eed80ca57ce6c82dc2e7946058a40983c9204ac95a1399fa633bc96cb10af3ddeee3ad2337c64391a42dc7794fca629e3e1e4e03a2ae24a000e7113b91c1b6230cce9592e45b6ee7984680b45aa0aabd7f56cab1a64ec310cefe5211821a75deef2e0c8e43eb467dea79dc8c03d2d523734498d079d5493c904a2ebfd8a3a9bd - -# Step 1 -R = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -M = 3083421e375f0722b9397e156de47f77635d62ba1d51794469371b473b71c02e3722841bca2ca06b5d1cf1492bbacfa0abfe394dfdaa7bb8787550ddbd953540e9c97631d9a1efe0c8f8e14f395c82d20245cec6d8021f8564b4d66e7779c3245734c56fb74481172f4e349d9a113cd0ee5263c69ebf746c5285cd4c0fa91d9531f769fea3610c2972ccfe9a22c00aa62ebf52b3a4c6135f3069 - -# Step 1 -R = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -M = 2f26e156b3b1117f7cec542b20fcc06ca66cec03a19b6f5eeebf22b4c0fc265df5ff06fc9dcac569735135bdc142b526b295225711efb71577b10aacda2fa446f5208487c725407c2188b3185237740c813e4455a6f1dde4f62916237f23164a3471aac0fcfe24ad1ce1dd81a6144f5861ad0cf22dc337abe10fc4a88b36116dc4929602ab48eb971fdd7a5ff747d6b9e0b2bff75c59621550991966a0a19f - -# Step 1 -R = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -A = ea87c57f6cdbfd4f836431be3e9950c90ee8ecc291eb4efb881617512fd62e2d86caefce713cfd8a20f4b4925bfc7dba1fcbe99c72932725b5d11eccefde4c5e505952754891e9ded499ec453a1c01a82152c8933f7db4f2b4b19e97baac322eb483cd661a43e458774ef27a29a19c3562ba466381056a3b92c35d9b8b71372b -M = 2a8f2c530342bb6ce683a760540e956a1155c0fe065476e400caec59861ca97ca71e51a11b3213b2baea1a41a29449998778e0f533fcc181698d293f05e28bff2750ef4095170de98a19a36ddcf59a65f3789a3808ead51680245070262c9544e446f23652eba47065a2bc4701c55378bd49733619ed2c213f8ed12a4a317c465f37efe07ff2df8e88fc33d3eb42cde9408dda28215702bfa607030839285a8bbf89b5e8842fa7d7f50d83fd4ab5 diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/arithmetic/bigint_elem_squared_tests.txt temporalio-1.3.0/vendor/ring-0.16.20/src/arithmetic/bigint_elem_squared_tests.txt --- temporalio-1.3.0/vendor/ring-0.16.20/src/arithmetic/bigint_elem_squared_tests.txt 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/arithmetic/bigint_elem_squared_tests.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,26 +0,0 @@ -# ModSquare tests. -# -# These test vectors satisfy A * A = ModSquare (mod M) and 0 <= ModSquare < M. - -# Regression test for CVE-2015-3193 (carry propagation bug in sqr8x_reduction). -# XXX: It's pretty unclear if this is actually exercising the code that had the -# bug. In fact it seems like it almost definitely isn't. This is here mostly -# because it is convenient to add the test, and also to track the issue of the -# lack of a real regression test. TODO: Fix this. -ModSquare = 19324b647d967d644b3219 -A = 050505050505 -M = 414141414141414141414127414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 - -# Regression test for CVE-2017-3732. -ModSquare = fffffffdfffffd01000009000002f6fffdf403000312000402f3fff5f602fe080a0005fdfafffa00010001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000002000002fefffff7fffffd07000109fdfffef3fffdfd06000405ff00fdfbfffe00010001 -A = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000ffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff00000000 -M = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000ffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff - -ModSquare = 40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004830000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000145b09 -A = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000483 -M = 800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe2645 - -# Regression test for CVE-2017-3736 -ModSquare = fe06fe0b06160c09 -A = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8f8f8f800000000000010000000006c000000000000000000000000000000000000000000000000000000000000000000000000000000000000fffffffffffff8f8f8f800000000000010000000006c000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffffffff00fcfdfc -M = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8f8f8f800000000000010000000006c000000000000000000000000000000000000000000000000000000000000000000000000000000000000fffffffffffff8f8f8f800000000000010000000006c000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffffffff diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/arithmetic/bigint.rs temporalio-1.3.0/vendor/ring-0.16.20/src/arithmetic/bigint.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/arithmetic/bigint.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/arithmetic/bigint.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,1627 +0,0 @@ -// Copyright 2015-2016 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -//! Multi-precision integers. -//! -//! # Modular Arithmetic. -//! -//! Modular arithmetic is done in finite commutative rings ℤ/mℤ for some -//! modulus *m*. We work in finite commutative rings instead of finite fields -//! because the RSA public modulus *n* is not prime, which means ℤ/nℤ contains -//! nonzero elements that have no multiplicative inverse, so ℤ/nℤ is not a -//! finite field. -//! -//! In some calculations we need to deal with multiple rings at once. For -//! example, RSA private key operations operate in the rings ℤ/nℤ, ℤ/pℤ, and -//! ℤ/qℤ. Types and functions dealing with such rings are all parameterized -//! over a type `M` to ensure that we don't wrongly mix up the math, e.g. by -//! multiplying an element of ℤ/pℤ by an element of ℤ/qℤ modulo q. This follows -//! the "unit" pattern described in [Static checking of units in Servo]. -//! -//! `Elem` also uses the static unit checking pattern to statically track the -//! Montgomery factors that need to be canceled out in each value using it's -//! `E` parameter. -//! -//! [Static checking of units in Servo]: -//! https://blog.mozilla.org/research/2014/06/23/static-checking-of-units-in-servo/ - -use crate::{ - arithmetic::montgomery::*, - bits, bssl, c, error, - limb::{self, Limb, LimbMask, LIMB_BITS, LIMB_BYTES}, -}; -use alloc::{borrow::ToOwned as _, boxed::Box, vec, vec::Vec}; -use core::{ - marker::PhantomData, - ops::{Deref, DerefMut}, -}; - -pub unsafe trait Prime {} - -struct Width { - num_limbs: usize, - - /// The modulus *m* that the width originated from. - m: PhantomData, -} - -/// All `BoxedLimbs` are stored in the same number of limbs. -struct BoxedLimbs { - limbs: Box<[Limb]>, - - /// The modulus *m* that determines the size of `limbx`. - m: PhantomData, -} - -impl Deref for BoxedLimbs { - type Target = [Limb]; - #[inline] - fn deref(&self) -> &Self::Target { - &self.limbs - } -} - -impl DerefMut for BoxedLimbs { - #[inline] - fn deref_mut(&mut self) -> &mut Self::Target { - &mut self.limbs - } -} - -// TODO: `derive(Clone)` after https://github.com/rust-lang/rust/issues/26925 -// is resolved or restrict `M: Clone`. -impl Clone for BoxedLimbs { - fn clone(&self) -> Self { - Self { - limbs: self.limbs.clone(), - m: self.m, - } - } -} - -impl BoxedLimbs { - fn positive_minimal_width_from_be_bytes( - input: untrusted::Input, - ) -> Result { - // Reject leading zeros. Also reject the value zero ([0]) because zero - // isn't positive. - if untrusted::Reader::new(input).peek(0) { - return Err(error::KeyRejected::invalid_encoding()); - } - let num_limbs = (input.len() + LIMB_BYTES - 1) / LIMB_BYTES; - let mut r = Self::zero(Width { - num_limbs, - m: PhantomData, - }); - limb::parse_big_endian_and_pad_consttime(input, &mut r) - .map_err(|error::Unspecified| error::KeyRejected::unexpected_error())?; - Ok(r) - } - - fn minimal_width_from_unpadded(limbs: &[Limb]) -> Self { - debug_assert_ne!(limbs.last(), Some(&0)); - Self { - limbs: limbs.to_owned().into_boxed_slice(), - m: PhantomData, - } - } - - fn from_be_bytes_padded_less_than( - input: untrusted::Input, - m: &Modulus, - ) -> Result { - let mut r = Self::zero(m.width()); - limb::parse_big_endian_and_pad_consttime(input, &mut r)?; - if limb::limbs_less_than_limbs_consttime(&r, &m.limbs) != LimbMask::True { - return Err(error::Unspecified); - } - Ok(r) - } - - #[inline] - fn is_zero(&self) -> bool { - limb::limbs_are_zero_constant_time(&self.limbs) == LimbMask::True - } - - fn zero(width: Width) -> Self { - Self { - limbs: vec![0; width.num_limbs].into_boxed_slice(), - m: PhantomData, - } - } - - fn width(&self) -> Width { - Width { - num_limbs: self.limbs.len(), - m: PhantomData, - } - } -} - -/// A modulus *s* that is smaller than another modulus *l* so every element of -/// ℤ/sℤ is also an element of ℤ/lℤ. -pub unsafe trait SmallerModulus {} - -/// A modulus *s* where s < l < 2*s for the given larger modulus *l*. This is -/// the precondition for reduction by conditional subtraction, -/// `elem_reduce_once()`. -pub unsafe trait SlightlySmallerModulus: SmallerModulus {} - -/// A modulus *s* where √l <= s < l for the given larger modulus *l*. This is -/// the precondition for the more general Montgomery reduction from ℤ/lℤ to -/// ℤ/sℤ. -pub unsafe trait NotMuchSmallerModulus: SmallerModulus {} - -pub unsafe trait PublicModulus {} - -/// The x86 implementation of `GFp_bn_mul_mont`, at least, requires at least 4 -/// limbs. For a long time we have required 4 limbs for all targets, though -/// this may be unnecessary. TODO: Replace this with -/// `n.len() < 256 / LIMB_BITS` so that 32-bit and 64-bit platforms behave the -/// same. -pub const MODULUS_MIN_LIMBS: usize = 4; - -pub const MODULUS_MAX_LIMBS: usize = 8192 / LIMB_BITS; - -/// The modulus *m* for a ring ℤ/mℤ, along with the precomputed values needed -/// for efficient Montgomery multiplication modulo *m*. The value must be odd -/// and larger than 2. The larger-than-1 requirement is imposed, at least, by -/// the modular inversion code. -pub struct Modulus { - limbs: BoxedLimbs, // Also `value >= 3`. - - // n0 * N == -1 (mod r). - // - // r == 2**(N0_LIMBS_USED * LIMB_BITS) and LG_LITTLE_R == lg(r). This - // ensures that we can do integer division by |r| by simply ignoring - // `N0_LIMBS_USED` limbs. Similarly, we can calculate values modulo `r` by - // just looking at the lowest `N0_LIMBS_USED` limbs. This is what makes - // Montgomery multiplication efficient. - // - // As shown in Algorithm 1 of "Fast Prime Field Elliptic Curve Cryptography - // with 256 Bit Primes" by Shay Gueron and Vlad Krasnov, in the loop of a - // multi-limb Montgomery multiplication of a * b (mod n), given the - // unreduced product t == a * b, we repeatedly calculate: - // - // t1 := t % r |t1| is |t|'s lowest limb (see previous paragraph). - // t2 := t1*n0*n - // t3 := t + t2 - // t := t3 / r copy all limbs of |t3| except the lowest to |t|. - // - // In the last step, it would only make sense to ignore the lowest limb of - // |t3| if it were zero. The middle steps ensure that this is the case: - // - // t3 == 0 (mod r) - // t + t2 == 0 (mod r) - // t + t1*n0*n == 0 (mod r) - // t1*n0*n == -t (mod r) - // t*n0*n == -t (mod r) - // n0*n == -1 (mod r) - // n0 == -1/n (mod r) - // - // Thus, in each iteration of the loop, we multiply by the constant factor - // n0, the negative inverse of n (mod r). - // - // TODO(perf): Not all 32-bit platforms actually make use of n0[1]. For the - // ones that don't, we could use a shorter `R` value and use faster `Limb` - // calculations instead of double-precision `u64` calculations. - n0: N0, - - oneRR: One, -} - -impl core::fmt::Debug for Modulus { - fn fmt(&self, fmt: &mut ::core::fmt::Formatter) -> Result<(), ::core::fmt::Error> { - fmt.debug_struct("Modulus") - // TODO: Print modulus value. - .finish() - } -} - -impl Modulus { - pub fn from_be_bytes_with_bit_length( - input: untrusted::Input, - ) -> Result<(Self, bits::BitLength), error::KeyRejected> { - let limbs = BoxedLimbs::positive_minimal_width_from_be_bytes(input)?; - Self::from_boxed_limbs(limbs) - } - - pub fn from_nonnegative_with_bit_length( - n: Nonnegative, - ) -> Result<(Self, bits::BitLength), error::KeyRejected> { - let limbs = BoxedLimbs { - limbs: n.limbs.into_boxed_slice(), - m: PhantomData, - }; - Self::from_boxed_limbs(limbs) - } - - fn from_boxed_limbs(n: BoxedLimbs) -> Result<(Self, bits::BitLength), error::KeyRejected> { - if n.len() > MODULUS_MAX_LIMBS { - return Err(error::KeyRejected::too_large()); - } - if n.len() < MODULUS_MIN_LIMBS { - return Err(error::KeyRejected::unexpected_error()); - } - if limb::limbs_are_even_constant_time(&n) != LimbMask::False { - return Err(error::KeyRejected::invalid_component()); - } - if limb::limbs_less_than_limb_constant_time(&n, 3) != LimbMask::False { - return Err(error::KeyRejected::unexpected_error()); - } - - // n_mod_r = n % r. As explained in the documentation for `n0`, this is - // done by taking the lowest `N0_LIMBS_USED` limbs of `n`. - #[allow(clippy::useless_conversion)] - let n0 = { - extern "C" { - fn GFp_bn_neg_inv_mod_r_u64(n: u64) -> u64; - } - - // XXX: u64::from isn't guaranteed to be constant time. - let mut n_mod_r: u64 = u64::from(n[0]); - - if N0_LIMBS_USED == 2 { - // XXX: If we use `<< LIMB_BITS` here then 64-bit builds - // fail to compile because of `deny(exceeding_bitshifts)`. - debug_assert_eq!(LIMB_BITS, 32); - n_mod_r |= u64::from(n[1]) << 32; - } - N0::from(unsafe { GFp_bn_neg_inv_mod_r_u64(n_mod_r) }) - }; - - let bits = limb::limbs_minimal_bits(&n.limbs); - let oneRR = { - let partial = PartialModulus { - limbs: &n.limbs, - n0: n0.clone(), - m: PhantomData, - }; - - One::newRR(&partial, bits) - }; - - Ok(( - Self { - limbs: n, - n0, - oneRR, - }, - bits, - )) - } - - #[inline] - fn width(&self) -> Width { - self.limbs.width() - } - - fn zero(&self) -> Elem { - Elem { - limbs: BoxedLimbs::zero(self.width()), - encoding: PhantomData, - } - } - - // TODO: Get rid of this - fn one(&self) -> Elem { - let mut r = self.zero(); - r.limbs[0] = 1; - r - } - - pub fn oneRR(&self) -> &One { - &self.oneRR - } - - pub fn to_elem(&self, l: &Modulus) -> Elem - where - M: SmallerModulus, - { - // TODO: Encode this assertion into the `where` above. - assert_eq!(self.width().num_limbs, l.width().num_limbs); - let limbs = self.limbs.clone(); - Elem { - limbs: BoxedLimbs { - limbs: limbs.limbs, - m: PhantomData, - }, - encoding: PhantomData, - } - } - - fn as_partial(&self) -> PartialModulus { - PartialModulus { - limbs: &self.limbs, - n0: self.n0.clone(), - m: PhantomData, - } - } -} - -struct PartialModulus<'a, M> { - limbs: &'a [Limb], - n0: N0, - m: PhantomData, -} - -impl PartialModulus<'_, M> { - // TODO: XXX Avoid duplication with `Modulus`. - fn zero(&self) -> Elem { - let width = Width { - num_limbs: self.limbs.len(), - m: PhantomData, - }; - Elem { - limbs: BoxedLimbs::zero(width), - encoding: PhantomData, - } - } -} - -/// Elements of ℤ/mℤ for some modulus *m*. -// -// Defaulting `E` to `Unencoded` is a convenience for callers from outside this -// submodule. However, for maximum clarity, we always explicitly use -// `Unencoded` within the `bigint` submodule. -pub struct Elem { - limbs: BoxedLimbs, - - /// The number of Montgomery factors that need to be canceled out from - /// `value` to get the actual value. - encoding: PhantomData, -} - -// TODO: `derive(Clone)` after https://github.com/rust-lang/rust/issues/26925 -// is resolved or restrict `M: Clone` and `E: Clone`. -impl Clone for Elem { - fn clone(&self) -> Self { - Self { - limbs: self.limbs.clone(), - encoding: self.encoding, - } - } -} - -impl Elem { - #[inline] - pub fn is_zero(&self) -> bool { - self.limbs.is_zero() - } -} - -impl Elem { - fn decode_once(self, m: &Modulus) -> Elem::Output> { - // A multiplication isn't required since we're multiplying by the - // unencoded value one (1); only a Montgomery reduction is needed. - // However the only non-multiplication Montgomery reduction function we - // have requires the input to be large, so we avoid using it here. - let mut limbs = self.limbs; - let num_limbs = m.width().num_limbs; - let mut one = [0; MODULUS_MAX_LIMBS]; - one[0] = 1; - let one = &one[..num_limbs]; // assert!(num_limbs <= MODULUS_MAX_LIMBS); - limbs_mont_mul(&mut limbs, &one, &m.limbs, &m.n0); - Elem { - limbs, - encoding: PhantomData, - } - } -} - -impl Elem { - #[inline] - pub fn into_unencoded(self, m: &Modulus) -> Elem { - self.decode_once(m) - } -} - -impl Elem { - pub fn from_be_bytes_padded( - input: untrusted::Input, - m: &Modulus, - ) -> Result { - Ok(Elem { - limbs: BoxedLimbs::from_be_bytes_padded_less_than(input, m)?, - encoding: PhantomData, - }) - } - - #[inline] - pub fn fill_be_bytes(&self, out: &mut [u8]) { - // See Falko Strenzke, "Manger's Attack revisited", ICICS 2010. - limb::big_endian_from_limbs(&self.limbs, out) - } - - pub fn into_modulus(self) -> Result, error::KeyRejected> { - let (m, _bits) = - Modulus::from_boxed_limbs(BoxedLimbs::minimal_width_from_unpadded(&self.limbs))?; - Ok(m) - } - - fn is_one(&self) -> bool { - limb::limbs_equal_limb_constant_time(&self.limbs, 1) == LimbMask::True - } -} - -pub fn elem_mul( - a: &Elem, - b: Elem, - m: &Modulus, -) -> Elem::Output> -where - (AF, BF): ProductEncoding, -{ - elem_mul_(a, b, &m.as_partial()) -} - -fn elem_mul_( - a: &Elem, - mut b: Elem, - m: &PartialModulus, -) -> Elem::Output> -where - (AF, BF): ProductEncoding, -{ - limbs_mont_mul(&mut b.limbs, &a.limbs, &m.limbs, &m.n0); - Elem { - limbs: b.limbs, - encoding: PhantomData, - } -} - -fn elem_mul_by_2(a: &mut Elem, m: &PartialModulus) { - extern "C" { - fn LIMBS_shl_mod(r: *mut Limb, a: *const Limb, m: *const Limb, num_limbs: c::size_t); - } - unsafe { - LIMBS_shl_mod( - a.limbs.as_mut_ptr(), - a.limbs.as_ptr(), - m.limbs.as_ptr(), - m.limbs.len(), - ); - } -} - -pub fn elem_reduced_once>( - a: &Elem, - m: &Modulus, -) -> Elem { - let mut r = a.limbs.clone(); - assert!(r.len() <= m.limbs.len()); - limb::limbs_reduce_once_constant_time(&mut r, &m.limbs); - Elem { - limbs: BoxedLimbs { - limbs: r.limbs, - m: PhantomData, - }, - encoding: PhantomData, - } -} - -#[inline] -pub fn elem_reduced>( - a: &Elem, - m: &Modulus, -) -> Elem { - let mut tmp = [0; MODULUS_MAX_LIMBS]; - let tmp = &mut tmp[..a.limbs.len()]; - tmp.copy_from_slice(&a.limbs); - - let mut r = m.zero(); - limbs_from_mont_in_place(&mut r.limbs, tmp, &m.limbs, &m.n0); - r -} - -fn elem_squared( - mut a: Elem, - m: &PartialModulus, -) -> Elem::Output> -where - (E, E): ProductEncoding, -{ - limbs_mont_square(&mut a.limbs, &m.limbs, &m.n0); - Elem { - limbs: a.limbs, - encoding: PhantomData, - } -} - -pub fn elem_widen>( - a: Elem, - m: &Modulus, -) -> Elem { - let mut r = m.zero(); - r.limbs[..a.limbs.len()].copy_from_slice(&a.limbs); - r -} - -// TODO: Document why this works for all Montgomery factors. -pub fn elem_add(mut a: Elem, b: Elem, m: &Modulus) -> Elem { - extern "C" { - // `r` and `a` may alias. - fn LIMBS_add_mod( - r: *mut Limb, - a: *const Limb, - b: *const Limb, - m: *const Limb, - num_limbs: c::size_t, - ); - } - unsafe { - LIMBS_add_mod( - a.limbs.as_mut_ptr(), - a.limbs.as_ptr(), - b.limbs.as_ptr(), - m.limbs.as_ptr(), - m.limbs.len(), - ) - } - a -} - -// TODO: Document why this works for all Montgomery factors. -pub fn elem_sub(mut a: Elem, b: &Elem, m: &Modulus) -> Elem { - extern "C" { - // `r` and `a` may alias. - fn LIMBS_sub_mod( - r: *mut Limb, - a: *const Limb, - b: *const Limb, - m: *const Limb, - num_limbs: c::size_t, - ); - } - unsafe { - LIMBS_sub_mod( - a.limbs.as_mut_ptr(), - a.limbs.as_ptr(), - b.limbs.as_ptr(), - m.limbs.as_ptr(), - m.limbs.len(), - ); - } - a -} - -// The value 1, Montgomery-encoded some number of times. -pub struct One(Elem); - -impl One { - // Returns RR = = R**2 (mod n) where R = 2**r is the smallest power of - // 2**LIMB_BITS such that R > m. - // - // Even though the assembly on some 32-bit platforms works with 64-bit - // values, using `LIMB_BITS` here, rather than `N0_LIMBS_USED * LIMB_BITS`, - // is correct because R**2 will still be a multiple of the latter as - // `N0_LIMBS_USED` is either one or two. - fn newRR(m: &PartialModulus, m_bits: bits::BitLength) -> Self { - let m_bits = m_bits.as_usize_bits(); - let r = (m_bits + (LIMB_BITS - 1)) / LIMB_BITS * LIMB_BITS; - - // base = 2**(lg m - 1). - let bit = m_bits - 1; - let mut base = m.zero(); - base.limbs[bit / LIMB_BITS] = 1 << (bit % LIMB_BITS); - - // Double `base` so that base == R == 2**r (mod m). For normal moduli - // that have the high bit of the highest limb set, this requires one - // doubling. Unusual moduli require more doublings but we are less - // concerned about the performance of those. - // - // Then double `base` again so that base == 2*R (mod n), i.e. `2` in - // Montgomery form (`elem_exp_vartime_()` requires the base to be in - // Montgomery form). Then compute - // RR = R**2 == base**r == R**r == (2**r)**r (mod n). - // - // Take advantage of the fact that `elem_mul_by_2` is faster than - // `elem_squared` by replacing some of the early squarings with shifts. - // TODO: Benchmark shift vs. squaring performance to determine the - // optimal value of `lg_base`. - let lg_base = 2usize; // Shifts vs. squaring trade-off. - debug_assert_eq!(lg_base.count_ones(), 1); // Must 2**n for n >= 0. - let shifts = r - bit + lg_base; - let exponent = (r / lg_base) as u64; - for _ in 0..shifts { - elem_mul_by_2(&mut base, m) - } - let RR = elem_exp_vartime_(base, exponent, m); - - Self(Elem { - limbs: RR.limbs, - encoding: PhantomData, // PhantomData - }) - } -} - -impl AsRef> for One { - fn as_ref(&self) -> &Elem { - &self.0 - } -} - -/// A non-secret odd positive value in the range -/// [3, PUBLIC_EXPONENT_MAX_VALUE]. -#[derive(Clone, Copy, Debug)] -pub struct PublicExponent(u64); - -impl PublicExponent { - pub fn from_be_bytes( - input: untrusted::Input, - min_value: u64, - ) -> Result { - if input.len() > 5 { - return Err(error::KeyRejected::too_large()); - } - let value = input.read_all(error::KeyRejected::invalid_encoding(), |input| { - // The exponent can't be zero and it can't be prefixed with - // zero-valued bytes. - if input.peek(0) { - return Err(error::KeyRejected::invalid_encoding()); - } - let mut value = 0u64; - loop { - let byte = input - .read_byte() - .map_err(|untrusted::EndOfInput| error::KeyRejected::invalid_encoding())?; - value = (value << 8) | u64::from(byte); - if input.at_end() { - return Ok(value); - } - } - })?; - - // Step 2 / Step b. NIST SP800-89 defers to FIPS 186-3, which requires - // `e >= 65537`. We enforce this when signing, but are more flexible in - // verification, for compatibility. Only small public exponents are - // supported. - if value & 1 != 1 { - return Err(error::KeyRejected::invalid_component()); - } - debug_assert!(min_value & 1 == 1); - debug_assert!(min_value <= PUBLIC_EXPONENT_MAX_VALUE); - if min_value < 3 { - return Err(error::KeyRejected::invalid_component()); - } - if value < min_value { - return Err(error::KeyRejected::too_small()); - } - if value > PUBLIC_EXPONENT_MAX_VALUE { - return Err(error::KeyRejected::too_large()); - } - - Ok(Self(value)) - } -} - -// This limit was chosen to bound the performance of the simple -// exponentiation-by-squaring implementation in `elem_exp_vartime`. In -// particular, it helps mitigate theoretical resource exhaustion attacks. 33 -// bits was chosen as the limit based on the recommendations in [1] and -// [2]. Windows CryptoAPI (at least older versions) doesn't support values -// larger than 32 bits [3], so it is unlikely that exponents larger than 32 -// bits are being used for anything Windows commonly does. -// -// [1] https://www.imperialviolet.org/2012/03/16/rsae.html -// [2] https://www.imperialviolet.org/2012/03/17/rsados.html -// [3] https://msdn.microsoft.com/en-us/library/aa387685(VS.85).aspx -const PUBLIC_EXPONENT_MAX_VALUE: u64 = (1u64 << 33) - 1; - -/// Calculates base**exponent (mod m). -// TODO: The test coverage needs to be expanded, e.g. test with the largest -// accepted exponent and with the most common values of 65537 and 3. -pub fn elem_exp_vartime( - base: Elem, - PublicExponent(exponent): PublicExponent, - m: &Modulus, -) -> Elem { - let base = elem_mul(m.oneRR().as_ref(), base, &m); - elem_exp_vartime_(base, exponent, &m.as_partial()) -} - -/// Calculates base**exponent (mod m). -fn elem_exp_vartime_(base: Elem, exponent: u64, m: &PartialModulus) -> Elem { - // Use what [Knuth] calls the "S-and-X binary method", i.e. variable-time - // square-and-multiply that scans the exponent from the most significant - // bit to the least significant bit (left-to-right). Left-to-right requires - // less storage compared to right-to-left scanning, at the cost of needing - // to compute `exponent.leading_zeros()`, which we assume to be cheap. - // - // During RSA public key operations the exponent is almost always either 65537 - // (0b10000000000000001) or 3 (0b11), both of which have a Hamming weight - // of 2. During Montgomery setup the exponent is almost always a power of two, - // with Hamming weight 1. As explained in [Knuth], exponentiation by squaring - // is the most efficient algorithm when the Hamming weight is 2 or less. It - // isn't the most efficient for all other, uncommon, exponent values but any - // suboptimality is bounded by `PUBLIC_EXPONENT_MAX_VALUE`. - // - // This implementation is slightly simplified by taking advantage of the - // fact that we require the exponent to be a positive integer. - // - // [Knuth]: The Art of Computer Programming, Volume 2: Seminumerical - // Algorithms (3rd Edition), Section 4.6.3. - assert!(exponent >= 1); - assert!(exponent <= PUBLIC_EXPONENT_MAX_VALUE); - let mut acc = base.clone(); - let mut bit = 1 << (64 - 1 - exponent.leading_zeros()); - debug_assert!((exponent & bit) != 0); - while bit > 1 { - bit >>= 1; - acc = elem_squared(acc, m); - if (exponent & bit) != 0 { - acc = elem_mul_(&base, acc, m); - } - } - acc -} - -// `M` represents the prime modulus for which the exponent is in the interval -// [1, `m` - 1). -pub struct PrivateExponent { - limbs: BoxedLimbs, -} - -impl PrivateExponent { - pub fn from_be_bytes_padded( - input: untrusted::Input, - p: &Modulus, - ) -> Result { - let dP = BoxedLimbs::from_be_bytes_padded_less_than(input, p)?; - - // Proof that `dP < p - 1`: - // - // If `dP < p` then either `dP == p - 1` or `dP < p - 1`. Since `p` is - // odd, `p - 1` is even. `d` is odd, and an odd number modulo an even - // number is odd. Therefore `dP` must be odd. But then it cannot be - // `p - 1` and so we know `dP < p - 1`. - // - // Further we know `dP != 0` because `dP` is not even. - if limb::limbs_are_even_constant_time(&dP) != LimbMask::False { - return Err(error::Unspecified); - } - - Ok(Self { limbs: dP }) - } -} - -impl PrivateExponent { - // Returns `p - 2`. - fn for_flt(p: &Modulus) -> Self { - let two = elem_add(p.one(), p.one(), p); - let p_minus_2 = elem_sub(p.zero(), &two, p); - Self { - limbs: p_minus_2.limbs, - } - } -} - -#[cfg(not(target_arch = "x86_64"))] -pub fn elem_exp_consttime( - base: Elem, - exponent: &PrivateExponent, - m: &Modulus, -) -> Result, error::Unspecified> { - use crate::limb::Window; - - const WINDOW_BITS: usize = 5; - const TABLE_ENTRIES: usize = 1 << WINDOW_BITS; - - let num_limbs = m.limbs.len(); - - let mut table = vec![0; TABLE_ENTRIES * num_limbs]; - - fn gather(table: &[Limb], i: Window, r: &mut Elem) { - extern "C" { - fn LIMBS_select_512_32( - r: *mut Limb, - table: *const Limb, - num_limbs: c::size_t, - i: Window, - ) -> bssl::Result; - } - Result::from(unsafe { - LIMBS_select_512_32(r.limbs.as_mut_ptr(), table.as_ptr(), r.limbs.len(), i) - }) - .unwrap(); - } - - fn power( - table: &[Limb], - i: Window, - mut acc: Elem, - mut tmp: Elem, - m: &Modulus, - ) -> (Elem, Elem) { - for _ in 0..WINDOW_BITS { - acc = elem_squared(acc, &m.as_partial()); - } - gather(table, i, &mut tmp); - let acc = elem_mul(&tmp, acc, m); - (acc, tmp) - } - - let tmp = m.one(); - let tmp = elem_mul(m.oneRR().as_ref(), tmp, m); - - fn entry(table: &[Limb], i: usize, num_limbs: usize) -> &[Limb] { - &table[(i * num_limbs)..][..num_limbs] - } - fn entry_mut(table: &mut [Limb], i: usize, num_limbs: usize) -> &mut [Limb] { - &mut table[(i * num_limbs)..][..num_limbs] - } - let num_limbs = m.limbs.len(); - entry_mut(&mut table, 0, num_limbs).copy_from_slice(&tmp.limbs); - entry_mut(&mut table, 1, num_limbs).copy_from_slice(&base.limbs); - for i in 2..TABLE_ENTRIES { - let (src1, src2) = if i % 2 == 0 { - (i / 2, i / 2) - } else { - (i - 1, 1) - }; - let (previous, rest) = table.split_at_mut(num_limbs * i); - let src1 = entry(previous, src1, num_limbs); - let src2 = entry(previous, src2, num_limbs); - let dst = entry_mut(rest, 0, num_limbs); - limbs_mont_product(dst, src1, src2, &m.limbs, &m.n0); - } - - let (r, _) = limb::fold_5_bit_windows( - &exponent.limbs, - |initial_window| { - let mut r = Elem { - limbs: base.limbs, - encoding: PhantomData, - }; - gather(&table, initial_window, &mut r); - (r, tmp) - }, - |(acc, tmp), window| power(&table, window, acc, tmp, m), - ); - - let r = r.into_unencoded(m); - - Ok(r) -} - -/// Uses Fermat's Little Theorem to calculate modular inverse in constant time. -pub fn elem_inverse_consttime( - a: Elem, - m: &Modulus, -) -> Result, error::Unspecified> { - elem_exp_consttime(a, &PrivateExponent::for_flt(&m), m) -} - -#[cfg(target_arch = "x86_64")] -pub fn elem_exp_consttime( - base: Elem, - exponent: &PrivateExponent, - m: &Modulus, -) -> Result, error::Unspecified> { - // The x86_64 assembly was written under the assumption that the input data - // is aligned to `MOD_EXP_CTIME_MIN_CACHE_LINE_WIDTH` bytes, which was/is - // 64 in OpenSSL. Similarly, OpenSSL uses the x86_64 assembly functions by - // giving it only inputs `tmp`, `am`, and `np` that immediately follow the - // table. The code seems to "work" even when the inputs aren't exactly - // like that but the side channel defenses might not be as effective. All - // the awkwardness here stems from trying to use the assembly code like - // OpenSSL does. - - use crate::limb::Window; - - const WINDOW_BITS: usize = 5; - const TABLE_ENTRIES: usize = 1 << WINDOW_BITS; - - let num_limbs = m.limbs.len(); - - const ALIGNMENT: usize = 64; - assert_eq!(ALIGNMENT % LIMB_BYTES, 0); - let mut table = vec![0; ((TABLE_ENTRIES + 3) * num_limbs) + ALIGNMENT]; - let (table, state) = { - let misalignment = (table.as_ptr() as usize) % ALIGNMENT; - let table = &mut table[((ALIGNMENT - misalignment) / LIMB_BYTES)..]; - assert_eq!((table.as_ptr() as usize) % ALIGNMENT, 0); - table.split_at_mut(TABLE_ENTRIES * num_limbs) - }; - - fn entry(table: &[Limb], i: usize, num_limbs: usize) -> &[Limb] { - &table[(i * num_limbs)..][..num_limbs] - } - fn entry_mut(table: &mut [Limb], i: usize, num_limbs: usize) -> &mut [Limb] { - &mut table[(i * num_limbs)..][..num_limbs] - } - - const ACC: usize = 0; // `tmp` in OpenSSL - const BASE: usize = ACC + 1; // `am` in OpenSSL - const M: usize = BASE + 1; // `np` in OpenSSL - - entry_mut(state, BASE, num_limbs).copy_from_slice(&base.limbs); - entry_mut(state, M, num_limbs).copy_from_slice(&m.limbs); - - fn scatter(table: &mut [Limb], state: &[Limb], i: Window, num_limbs: usize) { - extern "C" { - fn GFp_bn_scatter5(a: *const Limb, a_len: c::size_t, table: *mut Limb, i: Window); - } - unsafe { - GFp_bn_scatter5( - entry(state, ACC, num_limbs).as_ptr(), - num_limbs, - table.as_mut_ptr(), - i, - ) - } - } - - fn gather(table: &[Limb], state: &mut [Limb], i: Window, num_limbs: usize) { - extern "C" { - fn GFp_bn_gather5(r: *mut Limb, a_len: c::size_t, table: *const Limb, i: Window); - } - unsafe { - GFp_bn_gather5( - entry_mut(state, ACC, num_limbs).as_mut_ptr(), - num_limbs, - table.as_ptr(), - i, - ) - } - } - - fn gather_square(table: &[Limb], state: &mut [Limb], n0: &N0, i: Window, num_limbs: usize) { - gather(table, state, i, num_limbs); - assert_eq!(ACC, 0); - let (acc, rest) = state.split_at_mut(num_limbs); - let m = entry(rest, M - 1, num_limbs); - limbs_mont_square(acc, m, n0); - } - - fn gather_mul_base(table: &[Limb], state: &mut [Limb], n0: &N0, i: Window, num_limbs: usize) { - extern "C" { - fn GFp_bn_mul_mont_gather5( - rp: *mut Limb, - ap: *const Limb, - table: *const Limb, - np: *const Limb, - n0: &N0, - num: c::size_t, - power: Window, - ); - } - unsafe { - GFp_bn_mul_mont_gather5( - entry_mut(state, ACC, num_limbs).as_mut_ptr(), - entry(state, BASE, num_limbs).as_ptr(), - table.as_ptr(), - entry(state, M, num_limbs).as_ptr(), - n0, - num_limbs, - i, - ); - } - } - - fn power(table: &[Limb], state: &mut [Limb], n0: &N0, i: Window, num_limbs: usize) { - extern "C" { - fn GFp_bn_power5( - r: *mut Limb, - a: *const Limb, - table: *const Limb, - n: *const Limb, - n0: &N0, - num: c::size_t, - i: Window, - ); - } - unsafe { - GFp_bn_power5( - entry_mut(state, ACC, num_limbs).as_mut_ptr(), - entry_mut(state, ACC, num_limbs).as_mut_ptr(), - table.as_ptr(), - entry(state, M, num_limbs).as_ptr(), - n0, - num_limbs, - i, - ); - } - } - - // table[0] = base**0. - { - let acc = entry_mut(state, ACC, num_limbs); - acc[0] = 1; - limbs_mont_mul(acc, &m.oneRR.0.limbs, &m.limbs, &m.n0); - } - scatter(table, state, 0, num_limbs); - - // table[1] = base**1. - entry_mut(state, ACC, num_limbs).copy_from_slice(&base.limbs); - scatter(table, state, 1, num_limbs); - - for i in 2..(TABLE_ENTRIES as Window) { - if i % 2 == 0 { - // TODO: Optimize this to avoid gathering - gather_square(table, state, &m.n0, i / 2, num_limbs); - } else { - gather_mul_base(table, state, &m.n0, i - 1, num_limbs) - }; - scatter(table, state, i, num_limbs); - } - - let state = limb::fold_5_bit_windows( - &exponent.limbs, - |initial_window| { - gather(table, state, initial_window, num_limbs); - state - }, - |state, window| { - power(table, state, &m.n0, window, num_limbs); - state - }, - ); - - extern "C" { - fn GFp_bn_from_montgomery( - r: *mut Limb, - a: *const Limb, - not_used: *const Limb, - n: *const Limb, - n0: &N0, - num: c::size_t, - ) -> bssl::Result; - } - Result::from(unsafe { - GFp_bn_from_montgomery( - entry_mut(state, ACC, num_limbs).as_mut_ptr(), - entry(state, ACC, num_limbs).as_ptr(), - core::ptr::null(), - entry(state, M, num_limbs).as_ptr(), - &m.n0, - num_limbs, - ) - })?; - let mut r = Elem { - limbs: base.limbs, - encoding: PhantomData, - }; - r.limbs.copy_from_slice(entry(state, ACC, num_limbs)); - Ok(r) -} - -/// Verified a == b**-1 (mod m), i.e. a**-1 == b (mod m). -pub fn verify_inverses_consttime( - a: &Elem, - b: Elem, - m: &Modulus, -) -> Result<(), error::Unspecified> { - if elem_mul(a, b, m).is_one() { - Ok(()) - } else { - Err(error::Unspecified) - } -} - -#[inline] -pub fn elem_verify_equal_consttime( - a: &Elem, - b: &Elem, -) -> Result<(), error::Unspecified> { - if limb::limbs_equal_limbs_consttime(&a.limbs, &b.limbs) == LimbMask::True { - Ok(()) - } else { - Err(error::Unspecified) - } -} - -/// Nonnegative integers. -pub struct Nonnegative { - limbs: Vec, -} - -impl Nonnegative { - pub fn from_be_bytes_with_bit_length( - input: untrusted::Input, - ) -> Result<(Self, bits::BitLength), error::Unspecified> { - let mut limbs = vec![0; (input.len() + LIMB_BYTES - 1) / LIMB_BYTES]; - // Rejects empty inputs. - limb::parse_big_endian_and_pad_consttime(input, &mut limbs)?; - while limbs.last() == Some(&0) { - let _ = limbs.pop(); - } - let r_bits = limb::limbs_minimal_bits(&limbs); - Ok((Self { limbs }, r_bits)) - } - - #[inline] - pub fn is_odd(&self) -> bool { - limb::limbs_are_even_constant_time(&self.limbs) != LimbMask::True - } - - pub fn verify_less_than(&self, other: &Self) -> Result<(), error::Unspecified> { - if !greater_than(other, self) { - return Err(error::Unspecified); - } - Ok(()) - } - - pub fn to_elem(&self, m: &Modulus) -> Result, error::Unspecified> { - self.verify_less_than_modulus(&m)?; - let mut r = m.zero(); - r.limbs[0..self.limbs.len()].copy_from_slice(&self.limbs); - Ok(r) - } - - pub fn verify_less_than_modulus(&self, m: &Modulus) -> Result<(), error::Unspecified> { - if self.limbs.len() > m.limbs.len() { - return Err(error::Unspecified); - } - if self.limbs.len() == m.limbs.len() { - if limb::limbs_less_than_limbs_consttime(&self.limbs, &m.limbs) != LimbMask::True { - return Err(error::Unspecified); - } - } - Ok(()) - } -} - -// Returns a > b. -fn greater_than(a: &Nonnegative, b: &Nonnegative) -> bool { - if a.limbs.len() == b.limbs.len() { - limb::limbs_less_than_limbs_vartime(&b.limbs, &a.limbs) - } else { - a.limbs.len() > b.limbs.len() - } -} - -#[derive(Clone)] -#[repr(transparent)] -struct N0([Limb; 2]); - -const N0_LIMBS_USED: usize = 64 / LIMB_BITS; - -impl From for N0 { - #[inline] - fn from(n0: u64) -> Self { - #[cfg(target_pointer_width = "64")] - { - Self([n0, 0]) - } - - #[cfg(target_pointer_width = "32")] - { - Self([n0 as Limb, (n0 >> LIMB_BITS) as Limb]) - } - } -} - -/// r *= a -fn limbs_mont_mul(r: &mut [Limb], a: &[Limb], m: &[Limb], n0: &N0) { - debug_assert_eq!(r.len(), m.len()); - debug_assert_eq!(a.len(), m.len()); - - #[cfg(any( - target_arch = "aarch64", - target_arch = "arm", - target_arch = "x86_64", - target_arch = "x86" - ))] - unsafe { - GFp_bn_mul_mont( - r.as_mut_ptr(), - r.as_ptr(), - a.as_ptr(), - m.as_ptr(), - n0, - r.len(), - ) - } - - #[cfg(not(any( - target_arch = "aarch64", - target_arch = "arm", - target_arch = "x86_64", - target_arch = "x86" - )))] - { - let mut tmp = [0; 2 * MODULUS_MAX_LIMBS]; - let tmp = &mut tmp[..(2 * a.len())]; - limbs_mul(tmp, r, a); - limbs_from_mont_in_place(r, tmp, m, n0); - } -} - -fn limbs_from_mont_in_place(r: &mut [Limb], tmp: &mut [Limb], m: &[Limb], n0: &N0) { - extern "C" { - fn GFp_bn_from_montgomery_in_place( - r: *mut Limb, - num_r: c::size_t, - a: *mut Limb, - num_a: c::size_t, - n: *const Limb, - num_n: c::size_t, - n0: &N0, - ) -> bssl::Result; - } - Result::from(unsafe { - GFp_bn_from_montgomery_in_place( - r.as_mut_ptr(), - r.len(), - tmp.as_mut_ptr(), - tmp.len(), - m.as_ptr(), - m.len(), - &n0, - ) - }) - .unwrap() -} - -#[cfg(not(any( - target_arch = "aarch64", - target_arch = "arm", - target_arch = "x86_64", - target_arch = "x86" -)))] -fn limbs_mul(r: &mut [Limb], a: &[Limb], b: &[Limb]) { - debug_assert_eq!(r.len(), 2 * a.len()); - debug_assert_eq!(a.len(), b.len()); - let ab_len = a.len(); - - crate::polyfill::slice::fill(&mut r[..ab_len], 0); - for (i, &b_limb) in b.iter().enumerate() { - r[ab_len + i] = unsafe { - GFp_limbs_mul_add_limb( - (&mut r[i..][..ab_len]).as_mut_ptr(), - a.as_ptr(), - b_limb, - ab_len, - ) - }; - } -} - -/// r = a * b -#[cfg(not(target_arch = "x86_64"))] -fn limbs_mont_product(r: &mut [Limb], a: &[Limb], b: &[Limb], m: &[Limb], n0: &N0) { - debug_assert_eq!(r.len(), m.len()); - debug_assert_eq!(a.len(), m.len()); - debug_assert_eq!(b.len(), m.len()); - - #[cfg(any( - target_arch = "aarch64", - target_arch = "arm", - target_arch = "x86_64", - target_arch = "x86" - ))] - unsafe { - GFp_bn_mul_mont( - r.as_mut_ptr(), - a.as_ptr(), - b.as_ptr(), - m.as_ptr(), - n0, - r.len(), - ) - } - - #[cfg(not(any( - target_arch = "aarch64", - target_arch = "arm", - target_arch = "x86_64", - target_arch = "x86" - )))] - { - let mut tmp = [0; 2 * MODULUS_MAX_LIMBS]; - let tmp = &mut tmp[..(2 * a.len())]; - limbs_mul(tmp, a, b); - limbs_from_mont_in_place(r, tmp, m, n0) - } -} - -/// r = r**2 -fn limbs_mont_square(r: &mut [Limb], m: &[Limb], n0: &N0) { - debug_assert_eq!(r.len(), m.len()); - #[cfg(any( - target_arch = "aarch64", - target_arch = "arm", - target_arch = "x86_64", - target_arch = "x86" - ))] - unsafe { - GFp_bn_mul_mont( - r.as_mut_ptr(), - r.as_ptr(), - r.as_ptr(), - m.as_ptr(), - n0, - r.len(), - ) - } - - #[cfg(not(any( - target_arch = "aarch64", - target_arch = "arm", - target_arch = "x86_64", - target_arch = "x86" - )))] - { - let mut tmp = [0; 2 * MODULUS_MAX_LIMBS]; - let tmp = &mut tmp[..(2 * r.len())]; - limbs_mul(tmp, r, r); - limbs_from_mont_in_place(r, tmp, m, n0) - } -} - -extern "C" { - #[cfg(any( - target_arch = "aarch64", - target_arch = "arm", - target_arch = "x86_64", - target_arch = "x86" - ))] - // `r` and/or 'a' and/or 'b' may alias. - fn GFp_bn_mul_mont( - r: *mut Limb, - a: *const Limb, - b: *const Limb, - n: *const Limb, - n0: &N0, - num_limbs: c::size_t, - ); - - // `r` must not alias `a` - #[cfg(any( - test, - not(any( - target_arch = "aarch64", - target_arch = "arm", - target_arch = "x86_64", - target_arch = "x86" - )) - ))] - #[must_use] - fn GFp_limbs_mul_add_limb(r: *mut Limb, a: *const Limb, b: Limb, num_limbs: c::size_t) -> Limb; -} - -#[cfg(test)] -mod tests { - use super::*; - use crate::test; - use alloc::format; - - // Type-level representation of an arbitrary modulus. - struct M {} - - unsafe impl PublicModulus for M {} - - #[test] - fn test_elem_exp_consttime() { - test::run( - test_file!("bigint_elem_exp_consttime_tests.txt"), - |section, test_case| { - assert_eq!(section, ""); - - let m = consume_modulus::(test_case, "M"); - let expected_result = consume_elem(test_case, "ModExp", &m); - let base = consume_elem(test_case, "A", &m); - let e = { - let bytes = test_case.consume_bytes("E"); - PrivateExponent::from_be_bytes_padded(untrusted::Input::from(&bytes), &m) - .expect("valid exponent") - }; - let base = into_encoded(base, &m); - let actual_result = elem_exp_consttime(base, &e, &m).unwrap(); - assert_elem_eq(&actual_result, &expected_result); - - Ok(()) - }, - ) - } - - // TODO: fn test_elem_exp_vartime() using - // "src/rsa/bigint_elem_exp_vartime_tests.txt". See that file for details. - // In the meantime, the function is tested indirectly via the RSA - // verification and signing tests. - #[test] - fn test_elem_mul() { - test::run( - test_file!("bigint_elem_mul_tests.txt"), - |section, test_case| { - assert_eq!(section, ""); - - let m = consume_modulus::(test_case, "M"); - let expected_result = consume_elem(test_case, "ModMul", &m); - let a = consume_elem(test_case, "A", &m); - let b = consume_elem(test_case, "B", &m); - - let b = into_encoded(b, &m); - let a = into_encoded(a, &m); - let actual_result = elem_mul(&a, b, &m); - let actual_result = actual_result.into_unencoded(&m); - assert_elem_eq(&actual_result, &expected_result); - - Ok(()) - }, - ) - } - - #[test] - fn test_elem_squared() { - test::run( - test_file!("bigint_elem_squared_tests.txt"), - |section, test_case| { - assert_eq!(section, ""); - - let m = consume_modulus::(test_case, "M"); - let expected_result = consume_elem(test_case, "ModSquare", &m); - let a = consume_elem(test_case, "A", &m); - - let a = into_encoded(a, &m); - let actual_result = elem_squared(a, &m.as_partial()); - let actual_result = actual_result.into_unencoded(&m); - assert_elem_eq(&actual_result, &expected_result); - - Ok(()) - }, - ) - } - - #[test] - fn test_elem_reduced() { - test::run( - test_file!("bigint_elem_reduced_tests.txt"), - |section, test_case| { - assert_eq!(section, ""); - - struct MM {} - unsafe impl SmallerModulus for M {} - unsafe impl NotMuchSmallerModulus for M {} - - let m = consume_modulus::(test_case, "M"); - let expected_result = consume_elem(test_case, "R", &m); - let a = - consume_elem_unchecked::(test_case, "A", expected_result.limbs.len() * 2); - - let actual_result = elem_reduced(&a, &m); - let oneRR = m.oneRR(); - let actual_result = elem_mul(oneRR.as_ref(), actual_result, &m); - assert_elem_eq(&actual_result, &expected_result); - - Ok(()) - }, - ) - } - - #[test] - fn test_elem_reduced_once() { - test::run( - test_file!("bigint_elem_reduced_once_tests.txt"), - |section, test_case| { - assert_eq!(section, ""); - - struct N {} - struct QQ {} - unsafe impl SmallerModulus for QQ {} - unsafe impl SlightlySmallerModulus for QQ {} - - let qq = consume_modulus::(test_case, "QQ"); - let expected_result = consume_elem::(test_case, "R", &qq); - let n = consume_modulus::(test_case, "N"); - let a = consume_elem::(test_case, "A", &n); - - let actual_result = elem_reduced_once(&a, &qq); - assert_elem_eq(&actual_result, &expected_result); - - Ok(()) - }, - ) - } - - #[test] - fn test_modulus_debug() { - let (modulus, _) = Modulus::::from_be_bytes_with_bit_length(untrusted::Input::from( - &[0xff; LIMB_BYTES * MODULUS_MIN_LIMBS], - )) - .unwrap(); - assert_eq!("Modulus", format!("{:?}", modulus)); - } - - #[test] - fn test_public_exponent_debug() { - let exponent = - PublicExponent::from_be_bytes(untrusted::Input::from(&[0x1, 0x00, 0x01]), 65537) - .unwrap(); - assert_eq!("PublicExponent(65537)", format!("{:?}", exponent)); - } - - fn consume_elem( - test_case: &mut test::TestCase, - name: &str, - m: &Modulus, - ) -> Elem { - let value = test_case.consume_bytes(name); - Elem::from_be_bytes_padded(untrusted::Input::from(&value), m).unwrap() - } - - fn consume_elem_unchecked( - test_case: &mut test::TestCase, - name: &str, - num_limbs: usize, - ) -> Elem { - let value = consume_nonnegative(test_case, name); - let mut limbs = BoxedLimbs::zero(Width { - num_limbs, - m: PhantomData, - }); - limbs[0..value.limbs.len()].copy_from_slice(&value.limbs); - Elem { - limbs, - encoding: PhantomData, - } - } - - fn consume_modulus(test_case: &mut test::TestCase, name: &str) -> Modulus { - let value = test_case.consume_bytes(name); - let (value, _) = - Modulus::from_be_bytes_with_bit_length(untrusted::Input::from(&value)).unwrap(); - value - } - - fn consume_nonnegative(test_case: &mut test::TestCase, name: &str) -> Nonnegative { - let bytes = test_case.consume_bytes(name); - let (r, _r_bits) = - Nonnegative::from_be_bytes_with_bit_length(untrusted::Input::from(&bytes)).unwrap(); - r - } - - fn assert_elem_eq(a: &Elem, b: &Elem) { - if elem_verify_equal_consttime(&a, b).is_err() { - panic!("{:x?} != {:x?}", &*a.limbs, &*b.limbs); - } - } - - fn into_encoded(a: Elem, m: &Modulus) -> Elem { - elem_mul(m.oneRR().as_ref(), a, m) - } - - #[test] - // TODO: wasm - fn test_mul_add_words() { - const ZERO: Limb = 0; - const MAX: Limb = ZERO.wrapping_sub(1); - static TEST_CASES: &[(&[Limb], &[Limb], Limb, Limb, &[Limb])] = &[ - (&[0], &[0], 0, 0, &[0]), - (&[MAX], &[0], MAX, 0, &[MAX]), - (&[0], &[MAX], MAX, MAX - 1, &[1]), - (&[MAX], &[MAX], MAX, MAX, &[0]), - (&[0, 0], &[MAX, MAX], MAX, MAX - 1, &[1, MAX]), - (&[1, 0], &[MAX, MAX], MAX, MAX - 1, &[2, MAX]), - (&[MAX, 0], &[MAX, MAX], MAX, MAX, &[0, 0]), - (&[0, 1], &[MAX, MAX], MAX, MAX, &[1, 0]), - (&[MAX, MAX], &[MAX, MAX], MAX, MAX, &[0, MAX]), - ]; - - for (i, (r_input, a, w, expected_retval, expected_r)) in TEST_CASES.iter().enumerate() { - extern crate std; - let mut r = std::vec::Vec::from(*r_input); - assert_eq!(r.len(), a.len()); // Sanity check - let actual_retval = - unsafe { GFp_limbs_mul_add_limb(r.as_mut_ptr(), a.as_ptr(), *w, a.len()) }; - assert_eq!(&r, expected_r, "{}: {:x?} != {:x?}", i, &r[..], expected_r); - assert_eq!( - actual_retval, *expected_retval, - "{}: {:x?} != {:x?}", - i, actual_retval, *expected_retval - ); - } - } -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/arithmetic/constant.rs temporalio-1.3.0/vendor/ring-0.16.20/src/arithmetic/constant.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/arithmetic/constant.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/arithmetic/constant.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,13 +0,0 @@ -#[cfg(target_pointer_width = "32")] -macro_rules! limbs { - ( $($limb:expr),+ ) => { - [ $($limb),+ ] - }; -} - -#[cfg(target_pointer_width = "64")] -macro_rules! limbs { - ( $($limb_lo:expr, $limb_hi:expr),+) => { - [ $((($limb_hi | 0u64) << 32) | $limb_lo),+ ] - }; -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/arithmetic/montgomery.rs temporalio-1.3.0/vendor/ring-0.16.20/src/arithmetic/montgomery.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/arithmetic/montgomery.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/arithmetic/montgomery.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,88 +0,0 @@ -// Copyright 2017 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -// Indicates that the element is not encoded; there is no *R* factor -// that needs to be canceled out. -#[derive(Copy, Clone)] -pub enum Unencoded {} - -// Indicates that the element is encoded; the value has one *R* -// factor that needs to be canceled out. -#[derive(Copy, Clone)] -pub enum R {} - -// Indicates the element is encoded twice; the value has two *R* -// factors that need to be canceled out. -#[derive(Copy, Clone)] -pub enum RR {} - -// Indicates the element is inversely encoded; the value has one -// 1/*R* factor that needs to be canceled out. -#[derive(Copy, Clone)] -pub enum RInverse {} - -pub trait Encoding {} - -impl Encoding for RR {} -impl Encoding for R {} -impl Encoding for Unencoded {} -impl Encoding for RInverse {} - -/// The encoding of the result of a reduction. -pub trait ReductionEncoding { - type Output: Encoding; -} - -impl ReductionEncoding for RR { - type Output = R; -} -impl ReductionEncoding for R { - type Output = Unencoded; -} -impl ReductionEncoding for Unencoded { - type Output = RInverse; -} - -/// The encoding of the result of a multiplication. -pub trait ProductEncoding { - type Output: Encoding; -} - -impl ProductEncoding for (Unencoded, E) { - type Output = E::Output; -} - -impl ProductEncoding for (R, E) { - type Output = E; -} - -impl ProductEncoding for (RInverse, E) -where - E::Output: ReductionEncoding, -{ - type Output = <::Output as ReductionEncoding>::Output; -} - -// XXX: Rust doesn't allow overlapping impls, -// TODO (if/when Rust allows it): -// impl ProductEncoding for -// (E1, E2) { -// type Output = <(E2, E1) as ProductEncoding>::Output; -// } -impl ProductEncoding for (RR, Unencoded) { - type Output = <(Unencoded, RR) as ProductEncoding>::Output; -} -impl ProductEncoding for (RR, RInverse) { - type Output = <(RInverse, RR) as ProductEncoding>::Output; -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/arithmetic.rs temporalio-1.3.0/vendor/ring-0.16.20/src/arithmetic.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/arithmetic.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/arithmetic.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -// Copyright 2017 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -#[macro_use] -pub mod constant; - -#[cfg(feature = "alloc")] -pub mod bigint; - -pub mod montgomery; diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/bits.rs temporalio-1.3.0/vendor/ring-0.16.20/src/bits.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/bits.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/bits.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,64 +0,0 @@ -// Copyright 2016 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -use crate::error; - -#[derive(Clone, Copy, Debug, Eq, PartialEq, PartialOrd)] -pub struct BitLength(usize); - -// Lengths measured in bits, where all arithmetic is guaranteed not to -// overflow. -impl BitLength { - #[inline] - pub const fn from_usize_bits(bits: usize) -> Self { - Self(bits) - } - - #[inline] - pub fn from_usize_bytes(bytes: usize) -> Result { - let bits = bytes.checked_mul(8).ok_or(error::Unspecified)?; - Ok(Self::from_usize_bits(bits)) - } - - #[cfg(feature = "alloc")] - #[inline] - pub fn half_rounded_up(&self) -> Self { - let round_up = self.0 & 1; - Self((self.0 / 2) + round_up) - } - - #[inline] - pub fn as_usize_bits(&self) -> usize { - self.0 - } - - #[cfg(feature = "alloc")] - #[inline] - pub fn as_usize_bytes_rounded_up(&self) -> usize { - // Equivalent to (self.0 + 7) / 8, except with no potential for - // overflow and without branches. - - // Branchless round_up = if self.0 & 0b111 != 0 { 1 } else { 0 }; - let round_up = ((self.0 >> 2) | (self.0 >> 1) | self.0) & 1; - - (self.0 / 8) + round_up - } - - #[cfg(feature = "alloc")] - #[inline] - pub fn try_sub_1(self) -> Result { - let sum = self.0.checked_sub(1).ok_or(error::Unspecified)?; - Ok(BitLength(sum)) - } -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/bssl.rs temporalio-1.3.0/vendor/ring-0.16.20/src/bssl.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/bssl.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/bssl.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,59 +0,0 @@ -// Copyright 2015 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -use crate::{c, error}; - -/// An `int` returned from a foreign function containing **1** if the function -/// was successful or **0** if an error occurred. This is the convention used by -/// C code in `ring`. -#[derive(Clone, Copy, Debug)] -#[must_use] -#[repr(transparent)] -pub struct Result(c::int); - -impl From for core::result::Result<(), error::Unspecified> { - fn from(ret: Result) -> Self { - match ret.0 { - 1 => Ok(()), - c => { - debug_assert_eq!(c, 0, "`bssl::Result` value must be 0 or 1"); - Err(error::Unspecified) - } - } - } -} - -#[cfg(test)] -mod tests { - mod result { - use crate::{bssl, c}; - use core::mem; - - #[test] - fn size_and_alignment() { - type Underlying = c::int; - assert_eq!(mem::size_of::(), mem::size_of::()); - assert_eq!( - mem::align_of::(), - mem::align_of::() - ); - } - - #[test] - fn semantics() { - assert!(Result::from(bssl::Result(0)).is_err()); - assert!(Result::from(bssl::Result(1)).is_ok()); - } - } -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/constant_time.rs temporalio-1.3.0/vendor/ring-0.16.20/src/constant_time.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/constant_time.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/constant_time.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,49 +0,0 @@ -// Copyright 2015-2016 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -//! Constant-time operations. - -use crate::{c, error}; - -/// Returns `Ok(())` if `a == b` and `Err(error::Unspecified)` otherwise. -/// The comparison of `a` and `b` is done in constant time with respect to the -/// contents of each, but NOT in constant time with respect to the lengths of -/// `a` and `b`. -pub fn verify_slices_are_equal(a: &[u8], b: &[u8]) -> Result<(), error::Unspecified> { - if a.len() != b.len() { - return Err(error::Unspecified); - } - let result = unsafe { GFp_memcmp(a.as_ptr(), b.as_ptr(), a.len()) }; - match result { - 0 => Ok(()), - _ => Err(error::Unspecified), - } -} - -extern "C" { - fn GFp_memcmp(a: *const u8, b: *const u8, len: c::size_t) -> c::int; -} - -#[cfg(test)] -mod tests { - use crate::{bssl, error}; - - #[test] - fn test_constant_time() -> Result<(), error::Unspecified> { - extern "C" { - fn bssl_constant_time_test_main() -> bssl::Result; - } - Result::from(unsafe { bssl_constant_time_test_main() }) - } -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/cpu.rs temporalio-1.3.0/vendor/ring-0.16.20/src/cpu.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/cpu.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/cpu.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,378 +0,0 @@ -// Copyright 2016 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -/// A witness indicating that CPU features have been detected and cached. -/// -/// TODO: Eventually all feature detection logic should be done through -/// functions that accept a `Features` parameter, to guarantee that nothing -/// tries to read the cached values before they are written. -/// -/// This is a zero-sized type so that it can be "stored" wherever convenient. -#[derive(Copy, Clone)] -pub(crate) struct Features(()); - -#[inline(always)] -pub(crate) fn features() -> Features { - // We don't do runtime feature detection on aarch64-apple-* as all AAarch64 - // features we use are available on every device since the first devices. - #[cfg(any( - target_arch = "x86", - target_arch = "x86_64", - all( - any(target_arch = "aarch64", target_arch = "arm"), - any(target_os = "android", target_os = "fuchsia", target_os = "linux") - ) - ))] - { - static INIT: spin::Once<()> = spin::Once::new(); - let () = INIT.call_once(|| { - #[cfg(any(target_arch = "x86", target_arch = "x86_64"))] - { - extern "C" { - fn GFp_cpuid_setup(); - } - unsafe { - GFp_cpuid_setup(); - } - } - - #[cfg(all( - any(target_arch = "aarch64", target_arch = "arm"), - any(target_os = "android", target_os = "fuchsia", target_os = "linux") - ))] - { - arm::setup(); - } - }); - } - - Features(()) -} - -pub(crate) mod arm { - #[cfg(all( - any(target_os = "android", target_os = "linux"), - any(target_arch = "aarch64", target_arch = "arm") - ))] - pub fn setup() { - use libc::c_ulong; - - // XXX: The `libc` crate doesn't provide `libc::getauxval` consistently - // across all Android/Linux targets, e.g. musl. - extern "C" { - fn getauxval(type_: c_ulong) -> c_ulong; - } - - const AT_HWCAP: c_ulong = 16; - - #[cfg(target_arch = "aarch64")] - const HWCAP_NEON: c_ulong = 1 << 1; - - #[cfg(target_arch = "arm")] - const HWCAP_NEON: c_ulong = 1 << 12; - - let caps = unsafe { getauxval(AT_HWCAP) }; - - // We assume NEON is available on AARCH64 because it is a required - // feature. - #[cfg(target_arch = "aarch64")] - debug_assert!(caps & HWCAP_NEON == HWCAP_NEON); - - // OpenSSL and BoringSSL don't enable any other features if NEON isn't - // available. - if caps & HWCAP_NEON == HWCAP_NEON { - let mut features = NEON.mask; - - #[cfg(target_arch = "aarch64")] - const OFFSET: c_ulong = 3; - - #[cfg(target_arch = "arm")] - const OFFSET: c_ulong = 0; - - #[cfg(target_arch = "arm")] - let caps = { - const AT_HWCAP2: c_ulong = 26; - unsafe { getauxval(AT_HWCAP2) } - }; - - const HWCAP_AES: c_ulong = 1 << 0 + OFFSET; - const HWCAP_PMULL: c_ulong = 1 << 1 + OFFSET; - const HWCAP_SHA2: c_ulong = 1 << 3 + OFFSET; - - if caps & HWCAP_AES == HWCAP_AES { - features |= AES.mask; - } - if caps & HWCAP_PMULL == HWCAP_PMULL { - features |= PMULL.mask; - } - if caps & HWCAP_SHA2 == HWCAP_SHA2 { - features |= SHA256.mask; - } - - unsafe { GFp_armcap_P = features }; - } - } - - #[cfg(all(target_os = "fuchsia", target_arch = "aarch64"))] - pub fn setup() { - type zx_status_t = i32; - - #[link(name = "zircon")] - extern "C" { - fn zx_system_get_features(kind: u32, features: *mut u32) -> zx_status_t; - } - - const ZX_OK: i32 = 0; - const ZX_FEATURE_KIND_CPU: u32 = 0; - const ZX_ARM64_FEATURE_ISA_ASIMD: u32 = 1 << 2; - const ZX_ARM64_FEATURE_ISA_AES: u32 = 1 << 3; - const ZX_ARM64_FEATURE_ISA_PMULL: u32 = 1 << 4; - const ZX_ARM64_FEATURE_ISA_SHA2: u32 = 1 << 6; - - let mut caps = 0; - let rc = unsafe { zx_system_get_features(ZX_FEATURE_KIND_CPU, &mut caps) }; - - // OpenSSL and BoringSSL don't enable any other features if NEON isn't - // available. - if rc == ZX_OK && (caps & ZX_ARM64_FEATURE_ISA_ASIMD == ZX_ARM64_FEATURE_ISA_ASIMD) { - let mut features = NEON.mask; - - if caps & ZX_ARM64_FEATURE_ISA_AES == ZX_ARM64_FEATURE_ISA_AES { - features |= AES.mask; - } - if caps & ZX_ARM64_FEATURE_ISA_PMULL == ZX_ARM64_FEATURE_ISA_PMULL { - features |= PMULL.mask; - } - if caps & ZX_ARM64_FEATURE_ISA_SHA2 == ZX_ARM64_FEATURE_ISA_SHA2 { - features |= 1 << 4; - } - - unsafe { GFp_armcap_P = features }; - } - } - - macro_rules! features { - { - $( - $name:ident { - mask: $mask:expr, - - /// Should we assume that the feature is always available - /// for aarch64-apple-* targets? The first AArch64 iOS - /// device used the Apple A7 chip. - // TODO: When we can use `if` in const expressions: - // ``` - // aarch64_apple: $aarch64_apple, - // ``` - aarch64_apple: true, - } - ),+ - , // trailing comma is required. - } => { - $( - #[allow(dead_code)] - pub(crate) const $name: Feature = Feature { - mask: $mask, - }; - )+ - - // TODO: When we can use `if` in const expressions, do this: - // ``` - // const ARMCAP_STATIC: u32 = 0 - // $( - // | ( if $aarch64_apple && - // cfg!(all(target_arch = "aarch64", - // target_vendor = "apple")) { - // $name.mask - // } else { - // 0 - // } - // ) - // )+; - // ``` - // - // TODO: Add static feature detection to other targets. - // TODO: Combine static feature detection with runtime feature - // detection. - #[cfg(all(target_arch = "aarch64", target_vendor = "apple"))] - const ARMCAP_STATIC: u32 = 0 - $( | $name.mask - )+; - #[cfg(not(all(target_arch = "aarch64", target_vendor = "apple")))] - const ARMCAP_STATIC: u32 = 0; - - #[cfg(all(target_arch = "aarch64", target_vendor = "apple"))] - #[test] - fn test_armcap_static_available() { - let features = crate::cpu::features(); - $( - assert!($name.available(features)); - )+ - } - } - } - - #[allow(dead_code)] - pub(crate) struct Feature { - mask: u32, - } - - impl Feature { - #[allow(dead_code)] - #[inline(always)] - pub fn available(&self, _: super::Features) -> bool { - if self.mask == self.mask & ARMCAP_STATIC { - return true; - } - - #[cfg(all( - any(target_os = "android", target_os = "fuchsia", target_os = "linux"), - any(target_arch = "arm", target_arch = "aarch64") - ))] - { - if self.mask == self.mask & unsafe { GFp_armcap_P } { - return true; - } - } - - false - } - } - - features! { - // Keep in sync with `ARMV7_NEON`. - NEON { - mask: 1 << 0, - aarch64_apple: true, - }, - - // Keep in sync with `ARMV8_AES`. - AES { - mask: 1 << 2, - aarch64_apple: true, - }, - - // Keep in sync with `ARMV8_SHA256`. - SHA256 { - mask: 1 << 4, - aarch64_apple: true, - }, - - // Keep in sync with `ARMV8_PMULL`. - PMULL { - mask: 1 << 5, - aarch64_apple: true, - }, - } - - // Some non-Rust code still checks this even when it is statically known - // the given feature is available, so we have to ensure that this is - // initialized properly. Keep this in sync with the initialization in - // BoringSSL's crypto.c. - // - // TODO: This should have "hidden" visibility but we don't have a way of - // controlling that yet: https://github.com/rust-lang/rust/issues/73958. - #[cfg(any(target_arch = "arm", target_arch = "aarch64"))] - #[no_mangle] - static mut GFp_armcap_P: u32 = ARMCAP_STATIC; - - #[cfg(all( - any(target_arch = "arm", target_arch = "aarch64"), - target_vendor = "apple" - ))] - #[test] - fn test_armcap_static_matches_armcap_dynamic() { - assert_eq!(ARMCAP_STATIC, 1 | 4 | 16 | 32); - assert_eq!(ARMCAP_STATIC, unsafe { GFp_armcap_P }); - } -} - -#[cfg_attr( - not(any(target_arch = "x86", target_arch = "x86_64")), - allow(dead_code) -)] -pub(crate) mod intel { - pub(crate) struct Feature { - word: usize, - mask: u32, - } - - impl Feature { - #[allow(clippy::needless_return)] - #[inline(always)] - pub fn available(&self, _: super::Features) -> bool { - #[cfg(any(target_arch = "x86", target_arch = "x86_64"))] - { - extern "C" { - static mut GFp_ia32cap_P: [u32; 4]; - } - return self.mask == self.mask & unsafe { GFp_ia32cap_P[self.word] }; - } - - #[cfg(not(any(target_arch = "x86", target_arch = "x86_64")))] - { - return false; - } - } - } - - pub(crate) const FXSR: Feature = Feature { - word: 0, - mask: 1 << 24, - }; - - pub(crate) const PCLMULQDQ: Feature = Feature { - word: 1, - mask: 1 << 1, - }; - - pub(crate) const SSSE3: Feature = Feature { - word: 1, - mask: 1 << 9, - }; - - #[cfg(target_arch = "x86_64")] - pub(crate) const SSE41: Feature = Feature { - word: 1, - mask: 1 << 19, - }; - - #[cfg(target_arch = "x86_64")] - pub(crate) const MOVBE: Feature = Feature { - word: 1, - mask: 1 << 22, - }; - - pub(crate) const AES: Feature = Feature { - word: 1, - mask: 1 << 25, - }; - - #[cfg(target_arch = "x86_64")] - pub(crate) const AVX: Feature = Feature { - word: 1, - mask: 1 << 28, - }; - - #[cfg(all(target_arch = "x86_64", test))] - mod x86_64_tests { - use super::*; - - #[test] - fn test_avx_movbe_mask() { - // This is the OpenSSL style of testing these bits. - assert_eq!((AVX.mask | MOVBE.mask) >> 22, 0x41); - } - } -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/c.rs temporalio-1.3.0/vendor/ring-0.16.20/src/c.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/c.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/c.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,51 +0,0 @@ -// Copyright 2016-2019 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -//! C types. -//! -//! Avoid using the `libc` crate to get C types since `libc` doesn't support -//! all the targets we need to support. It turns out that the few types we need -//! are all uniformly defined on the platforms we care about. This will -//! probably change if/when we support 16-bit platforms or platforms where -//! `usize` and `uintptr_t` are different sizes. - -// Keep in sync with the checks in base.h that verify these assumptions. - -pub(crate) type int = i32; -pub(crate) type uint = u32; -pub(crate) type size_t = usize; - -#[cfg(all(test, any(unix, windows)))] -mod tests { - use crate::c; - - #[test] - fn test_libc_compatible() { - { - let x: c::int = 1; - let _x: libc::c_int = x; - } - - { - let x: c::uint = 1; - let _x: libc::c_uint = x; - } - - { - let x: c::size_t = 1; - let _x: libc::size_t = x; - let _x: usize = x; - } - } -} Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/ring-0.16.20/src/data/alg-rsa-encryption.der and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/ring-0.16.20/src/data/alg-rsa-encryption.der differ diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/debug.rs temporalio-1.3.0/vendor/ring-0.16.20/src/debug.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/debug.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/debug.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,84 +0,0 @@ -// Copyright 2018 Trent Clarke. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -// Generates an implementation of the Debug trait for a type that defers to the -// Debug implementation for a given field. -macro_rules! derive_debug_via_id { - ($typename:ident) => { - impl ::core::fmt::Debug for $typename { - fn fmt(&self, f: &mut ::core::fmt::Formatter) -> Result<(), ::core::fmt::Error> { - ::core::fmt::Debug::fmt(&self.id, f) - } - } - }; -} - -macro_rules! derive_debug_via_field { - ($type:ty, $field:ident) => { - derive_debug_via_field!($type, stringify!($type), $field); - }; - - ($type:ty, $typename:expr, $field:ident) => { - impl ::core::fmt::Debug for $type { - fn fmt(&self, f: &mut ::core::fmt::Formatter) -> Result<(), ::core::fmt::Error> { - f.debug_struct($typename) - .field(stringify!($field), &self.$field) - .finish() - } - } - }; -} - -// Generates an implementation of the Debug trait for a type that outputs the -// hex encoding of the byte slice representation of the value. -macro_rules! derive_debug_self_as_ref_hex_bytes { - ($typename:ident) => { - impl ::core::fmt::Debug for $typename { - fn fmt(&self, f: &mut ::core::fmt::Formatter) -> Result<(), ::core::fmt::Error> { - crate::debug::write_hex_tuple(f, stringify!($typename), self) - } - } - }; -} - -pub(crate) fn write_hex_tuple( - fmt: &mut core::fmt::Formatter, - type_name: &str, - value: &dyn AsRef<[u8]>, -) -> Result<(), ::core::fmt::Error> { - fmt.debug_tuple(type_name) - .field(&HexStr(value.as_ref())) - .finish() -} - -pub struct HexStr<'a>(pub &'a [u8]); - -impl core::fmt::Debug for HexStr<'_> { - fn fmt(&self, fmt: &mut core::fmt::Formatter) -> Result<(), core::fmt::Error> { - fmt.write_str("\"")?; - write_hex_bytes(fmt, self.0)?; - fmt.write_str("\"")?; - Ok(()) - } -} - -pub(crate) fn write_hex_bytes( - fmt: &mut core::fmt::Formatter, - bytes: &[u8], -) -> Result<(), ::core::fmt::Error> { - for byte in bytes { - write!(fmt, "{:02x}", byte)?; - } - Ok(()) -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/digest/sha1.rs temporalio-1.3.0/vendor/ring-0.16.20/src/digest/sha1.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/digest/sha1.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/digest/sha1.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,111 +0,0 @@ -// Copyright 2015-2016 Brian Smith. -// Copyright 2016 Simon Sapin. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -use super::sha2::{ch, maj, Word}; -use crate::c; -use core::{convert::TryInto, num::Wrapping}; - -pub const BLOCK_LEN: usize = 512 / 8; -pub const CHAINING_LEN: usize = 160 / 8; -pub const OUTPUT_LEN: usize = 160 / 8; -const CHAINING_WORDS: usize = CHAINING_LEN / 4; - -type W32 = Wrapping; - -// FIPS 180-4 4.1.1 -#[inline] -fn parity(x: W32, y: W32, z: W32) -> W32 { - x ^ y ^ z -} - -type State = [W32; CHAINING_WORDS]; -const ROUNDS: usize = 80; - -pub(super) extern "C" fn block_data_order( - state: &mut super::State, - data: *const u8, - num: c::size_t, -) { - let state = unsafe { &mut state.as32 }; - let state: &mut State = (&mut state[..CHAINING_WORDS]).try_into().unwrap(); - let data = data as *const [::InputBytes; 16]; - let blocks = unsafe { core::slice::from_raw_parts(data, num) }; - *state = block_data_order_(*state, blocks) -} - -#[inline] -#[rustfmt::skip] -fn block_data_order_(mut H: State, M: &[[::InputBytes; 16]]) -> State { - for M in M { - // FIPS 180-4 6.1.2 Step 1 - let mut W: [W32; ROUNDS] = [W32::ZERO; ROUNDS]; - for t in 0..16 { - W[t] = W32::from_be_bytes(M[t]); - } - for t in 16..ROUNDS { - let wt = W[t - 3] ^ W[t - 8] ^ W[t - 14] ^ W[t - 16]; - W[t] = rotl(wt, 1); - } - - // FIPS 180-4 6.1.2 Step 2 - let a = H[0]; - let b = H[1]; - let c = H[2]; - let d = H[3]; - let e = H[4]; - - // FIPS 180-4 6.1.2 Step 3 with constants and functions from FIPS 180-4 {4.1.1, 4.2.1} - let (a, b, c, d, e) = step3(a, b, c, d, e, W[ 0..20].try_into().unwrap(), Wrapping(0x5a827999), ch); - let (a, b, c, d, e) = step3(a, b, c, d, e, W[20..40].try_into().unwrap(), Wrapping(0x6ed9eba1), parity); - let (a, b, c, d, e) = step3(a, b, c, d, e, W[40..60].try_into().unwrap(), Wrapping(0x8f1bbcdc), maj); - let (a, b, c, d, e) = step3(a, b, c, d, e, W[60..80].try_into().unwrap(), Wrapping(0xca62c1d6), parity); - - // FIPS 180-4 6.1.2 Step 4 - H[0] += a; - H[1] += b; - H[2] += c; - H[3] += d; - H[4] += e; - } - - H -} - -#[inline(always)] -fn step3( - mut a: W32, - mut b: W32, - mut c: W32, - mut d: W32, - mut e: W32, - W: [W32; 20], - k: W32, - f: impl Fn(W32, W32, W32) -> W32, -) -> (W32, W32, W32, W32, W32) { - for W_t in W.iter() { - let T = rotl(a, 5) + f(b, c, d) + e + k + W_t; - e = d; - d = c; - c = rotl(b, 30); - b = a; - a = T; - } - (a, b, c, d, e) -} - -#[inline(always)] -fn rotl(x: W32, n: u32) -> W32 { - Wrapping(x.0.rotate_left(n)) -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/digest/sha2.rs temporalio-1.3.0/vendor/ring-0.16.20/src/digest/sha2.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/digest/sha2.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/digest/sha2.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,392 +0,0 @@ -// Copyright 2019 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -use crate::c; -use core::{ - num::Wrapping, - ops::{Add, AddAssign, BitAnd, BitOr, BitXor, Not, Shr}, -}; - -#[cfg(not(any(target_arch = "aarch64", target_arch = "arm", target_arch = "x86_64")))] -pub(super) extern "C" fn GFp_sha256_block_data_order( - state: &mut super::State, - data: *const u8, - num: c::size_t, -) { - let state = unsafe { &mut state.as32 }; - *state = block_data_order(*state, data, num) -} - -#[cfg(not(any(target_arch = "aarch64", target_arch = "arm", target_arch = "x86_64")))] -pub(super) extern "C" fn GFp_sha512_block_data_order( - state: &mut super::State, - data: *const u8, - num: c::size_t, -) { - let state = unsafe { &mut state.as64 }; - *state = block_data_order(*state, data, num) -} - -#[cfg_attr( - any(target_arch = "aarch64", target_arch = "arm", target_arch = "x86_64"), - allow(dead_code) -)] -#[inline] -fn block_data_order( - mut H: [S; CHAINING_WORDS], - M: *const u8, - num: c::size_t, -) -> [S; CHAINING_WORDS] { - let M = M as *const [S::InputBytes; 16]; - let M: &[[S::InputBytes; 16]] = unsafe { core::slice::from_raw_parts(M, num) }; - - for M in M { - // FIPS 180-4 {6.2.2, 6.4.2} Step 1 - // - // TODO: Use `let W: [S::ZERO; S::ROUNDS]` instead of allocating - // `MAX_ROUNDS` items and then slicing to `K.len()`; depends on - // https://github.com/rust-lang/rust/issues/43408. - let mut W = [S::ZERO; MAX_ROUNDS]; - let W: &[S] = { - let W = &mut W[..S::K.len()]; - for (W, M) in W.iter_mut().zip(M) { - *W = S::from_be_bytes(*M); - } - for t in M.len()..S::K.len() { - W[t] = sigma_1(W[t - 2]) + W[t - 7] + sigma_0(W[t - 15]) + W[t - 16] - } - - W - }; - - // FIPS 180-4 {6.2.2, 6.4.2} Step 2 - let mut a = H[0]; - let mut b = H[1]; - let mut c = H[2]; - let mut d = H[3]; - let mut e = H[4]; - let mut f = H[5]; - let mut g = H[6]; - let mut h = H[7]; - - // FIPS 180-4 {6.2.2, 6.4.2} Step 3 - for (Kt, Wt) in S::K.iter().zip(W.iter()) { - let T1 = h + SIGMA_1(e) + ch(e, f, g) + *Kt + *Wt; - let T2 = SIGMA_0(a) + maj(a, b, c); - h = g; - g = f; - f = e; - e = d + T1; - d = c; - c = b; - b = a; - a = T1 + T2; - } - - // FIPS 180-4 {6.2.2, 6.4.2} Step 4 - H[0] += a; - H[1] += b; - H[2] += c; - H[3] += d; - H[4] += e; - H[5] += f; - H[6] += g; - H[7] += h; - } - - H -} - -// FIPS 180-4 {4.1.1, 4.1.2, 4.1.3} -#[inline(always)] -pub(super) fn ch(x: W, y: W, z: W) -> W { - (x & y) | (!x & z) -} - -// FIPS 180-4 {4.1.1, 4.1.2, 4.1.3} -#[inline(always)] -pub(super) fn maj(x: W, y: W, z: W) -> W { - (x & y) | (x & z) | (y & z) -} - -// FIPS 180-4 {4.1.2, 4.1.3} -#[inline(always)] -fn SIGMA_0(x: S) -> S { - x.rotr(S::BIG_SIGMA_0.0) ^ x.rotr(S::BIG_SIGMA_0.1) ^ x.rotr(S::BIG_SIGMA_0.2) -} - -// FIPS 180-4 {4.1.2, 4.1.3} -#[inline(always)] -fn SIGMA_1(x: S) -> S { - x.rotr(S::BIG_SIGMA_1.0) ^ x.rotr(S::BIG_SIGMA_1.1) ^ x.rotr(S::BIG_SIGMA_1.2) -} - -// FIPS 180-4 {4.1.2, 4.1.3} -#[inline(always)] -fn sigma_0(x: S) -> S { - x.rotr(S::SMALL_SIGMA_0.0) ^ x.rotr(S::SMALL_SIGMA_0.1) ^ (x >> S::SMALL_SIGMA_0.2) -} - -// FIPS 180-4 {4.1.2, 4.1.3} -#[inline(always)] -fn sigma_1(x: S) -> S { - x.rotr(S::SMALL_SIGMA_1.0) ^ x.rotr(S::SMALL_SIGMA_1.1) ^ (x >> S::SMALL_SIGMA_1.2) -} - -// Commonality between SHA-1 and SHA-2 words. -pub(super) trait Word: - 'static - + Sized - + Copy - + Add - + AddAssign - + BitAnd - + BitOr - + Not -{ - const ZERO: Self; - - type InputBytes: Copy; - - fn from_be_bytes(input: Self::InputBytes) -> Self; - - fn rotr(self, count: u32) -> Self; -} - -/// A SHA-2 input word. -trait Sha2: Word + BitXor + Shr { - const BIG_SIGMA_0: (u32, u32, u32); - const BIG_SIGMA_1: (u32, u32, u32); - const SMALL_SIGMA_0: (u32, u32, usize); - const SMALL_SIGMA_1: (u32, u32, usize); - - const K: &'static [Self]; -} - -const MAX_ROUNDS: usize = 80; -pub(super) const CHAINING_WORDS: usize = 8; - -impl Word for Wrapping { - const ZERO: Self = Wrapping(0); - type InputBytes = [u8; 4]; - - #[inline(always)] - fn from_be_bytes(input: Self::InputBytes) -> Self { - Wrapping(u32::from_be_bytes(input)) - } - - #[inline(always)] - fn rotr(self, count: u32) -> Self { - Wrapping(self.0.rotate_right(count)) - } -} - -// SHA-256 -impl Sha2 for Wrapping { - // FIPS 180-4 4.1.2 - const BIG_SIGMA_0: (u32, u32, u32) = (2, 13, 22); - const BIG_SIGMA_1: (u32, u32, u32) = (6, 11, 25); - const SMALL_SIGMA_0: (u32, u32, usize) = (7, 18, 3); - const SMALL_SIGMA_1: (u32, u32, usize) = (17, 19, 10); - - // FIPS 180-4 4.2.2 - const K: &'static [Self] = &[ - Self(0x428a2f98), - Self(0x71374491), - Self(0xb5c0fbcf), - Self(0xe9b5dba5), - Self(0x3956c25b), - Self(0x59f111f1), - Self(0x923f82a4), - Self(0xab1c5ed5), - Self(0xd807aa98), - Self(0x12835b01), - Self(0x243185be), - Self(0x550c7dc3), - Self(0x72be5d74), - Self(0x80deb1fe), - Self(0x9bdc06a7), - Self(0xc19bf174), - Self(0xe49b69c1), - Self(0xefbe4786), - Self(0x0fc19dc6), - Self(0x240ca1cc), - Self(0x2de92c6f), - Self(0x4a7484aa), - Self(0x5cb0a9dc), - Self(0x76f988da), - Self(0x983e5152), - Self(0xa831c66d), - Self(0xb00327c8), - Self(0xbf597fc7), - Self(0xc6e00bf3), - Self(0xd5a79147), - Self(0x06ca6351), - Self(0x14292967), - Self(0x27b70a85), - Self(0x2e1b2138), - Self(0x4d2c6dfc), - Self(0x53380d13), - Self(0x650a7354), - Self(0x766a0abb), - Self(0x81c2c92e), - Self(0x92722c85), - Self(0xa2bfe8a1), - Self(0xa81a664b), - Self(0xc24b8b70), - Self(0xc76c51a3), - Self(0xd192e819), - Self(0xd6990624), - Self(0xf40e3585), - Self(0x106aa070), - Self(0x19a4c116), - Self(0x1e376c08), - Self(0x2748774c), - Self(0x34b0bcb5), - Self(0x391c0cb3), - Self(0x4ed8aa4a), - Self(0x5b9cca4f), - Self(0x682e6ff3), - Self(0x748f82ee), - Self(0x78a5636f), - Self(0x84c87814), - Self(0x8cc70208), - Self(0x90befffa), - Self(0xa4506ceb), - Self(0xbef9a3f7), - Self(0xc67178f2), - ]; -} - -impl Word for Wrapping { - const ZERO: Self = Wrapping(0); - type InputBytes = [u8; 8]; - - #[inline(always)] - fn from_be_bytes(input: Self::InputBytes) -> Self { - Wrapping(u64::from_be_bytes(input)) - } - - #[inline(always)] - fn rotr(self, count: u32) -> Self { - Wrapping(self.0.rotate_right(count)) - } -} - -// SHA-384 and SHA-512 -impl Sha2 for Wrapping { - // FIPS 180-4 4.1.3 - const BIG_SIGMA_0: (u32, u32, u32) = (28, 34, 39); - const BIG_SIGMA_1: (u32, u32, u32) = (14, 18, 41); - const SMALL_SIGMA_0: (u32, u32, usize) = (1, 8, 7); - const SMALL_SIGMA_1: (u32, u32, usize) = (19, 61, 6); - - // FIPS 180-4 4.2.3 - const K: &'static [Self] = &[ - Self(0x428a2f98d728ae22), - Self(0x7137449123ef65cd), - Self(0xb5c0fbcfec4d3b2f), - Self(0xe9b5dba58189dbbc), - Self(0x3956c25bf348b538), - Self(0x59f111f1b605d019), - Self(0x923f82a4af194f9b), - Self(0xab1c5ed5da6d8118), - Self(0xd807aa98a3030242), - Self(0x12835b0145706fbe), - Self(0x243185be4ee4b28c), - Self(0x550c7dc3d5ffb4e2), - Self(0x72be5d74f27b896f), - Self(0x80deb1fe3b1696b1), - Self(0x9bdc06a725c71235), - Self(0xc19bf174cf692694), - Self(0xe49b69c19ef14ad2), - Self(0xefbe4786384f25e3), - Self(0x0fc19dc68b8cd5b5), - Self(0x240ca1cc77ac9c65), - Self(0x2de92c6f592b0275), - Self(0x4a7484aa6ea6e483), - Self(0x5cb0a9dcbd41fbd4), - Self(0x76f988da831153b5), - Self(0x983e5152ee66dfab), - Self(0xa831c66d2db43210), - Self(0xb00327c898fb213f), - Self(0xbf597fc7beef0ee4), - Self(0xc6e00bf33da88fc2), - Self(0xd5a79147930aa725), - Self(0x06ca6351e003826f), - Self(0x142929670a0e6e70), - Self(0x27b70a8546d22ffc), - Self(0x2e1b21385c26c926), - Self(0x4d2c6dfc5ac42aed), - Self(0x53380d139d95b3df), - Self(0x650a73548baf63de), - Self(0x766a0abb3c77b2a8), - Self(0x81c2c92e47edaee6), - Self(0x92722c851482353b), - Self(0xa2bfe8a14cf10364), - Self(0xa81a664bbc423001), - Self(0xc24b8b70d0f89791), - Self(0xc76c51a30654be30), - Self(0xd192e819d6ef5218), - Self(0xd69906245565a910), - Self(0xf40e35855771202a), - Self(0x106aa07032bbd1b8), - Self(0x19a4c116b8d2d0c8), - Self(0x1e376c085141ab53), - Self(0x2748774cdf8eeb99), - Self(0x34b0bcb5e19b48a8), - Self(0x391c0cb3c5c95a63), - Self(0x4ed8aa4ae3418acb), - Self(0x5b9cca4f7763e373), - Self(0x682e6ff3d6b2b8a3), - Self(0x748f82ee5defb2fc), - Self(0x78a5636f43172f60), - Self(0x84c87814a1f0ab72), - Self(0x8cc702081a6439ec), - Self(0x90befffa23631e28), - Self(0xa4506cebde82bde9), - Self(0xbef9a3f7b2c67915), - Self(0xc67178f2e372532b), - Self(0xca273eceea26619c), - Self(0xd186b8c721c0c207), - Self(0xeada7dd6cde0eb1e), - Self(0xf57d4f7fee6ed178), - Self(0x06f067aa72176fba), - Self(0x0a637dc5a2c898a6), - Self(0x113f9804bef90dae), - Self(0x1b710b35131c471b), - Self(0x28db77f523047d84), - Self(0x32caab7b40c72493), - Self(0x3c9ebe0a15c9bebc), - Self(0x431d67c49c100d4c), - Self(0x4cc5d4becb3e42b6), - Self(0x597f299cfc657e2a), - Self(0x5fcb6fab3ad6faec), - Self(0x6c44198c4a475817), - ]; -} - -#[cfg(any(target_arch = "aarch64", target_arch = "arm", target_arch = "x86_64"))] -extern "C" { - pub(super) fn GFp_sha256_block_data_order( - state: &mut super::State, - data: *const u8, - num: c::size_t, - ); - pub(super) fn GFp_sha512_block_data_order( - state: &mut super::State, - data: *const u8, - num: c::size_t, - ); -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/digest.rs temporalio-1.3.0/vendor/ring-0.16.20/src/digest.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/digest.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/digest.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,594 +0,0 @@ -// Copyright 2015-2019 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -//! SHA-2 and the legacy SHA-1 digest algorithm. -//! -//! If all the data is available in a single contiguous slice then the `digest` -//! function should be used. Otherwise, the digest can be calculated in -//! multiple steps using `Context`. - -// Note on why are we doing things the hard way: It would be easy to implement -// this using the C `EVP_MD`/`EVP_MD_CTX` interface. However, if we were to do -// things that way, we'd have a hard dependency on `malloc` and other overhead. -// The goal for this implementation is to drive the overhead as close to zero -// as possible. - -use crate::{ - c, cpu, debug, - endian::{self, BigEndian}, - polyfill, -}; -use core::num::Wrapping; - -mod sha1; -mod sha2; - -#[derive(Clone)] -pub(crate) struct BlockContext { - state: State, - - // Note that SHA-512 has a 128-bit input bit counter, but this - // implementation only supports up to 2^64-1 input bits for all algorithms, - // so a 64-bit counter is more than sufficient. - completed_data_blocks: u64, - - /// The context's algorithm. - pub algorithm: &'static Algorithm, - - cpu_features: cpu::Features, -} - -impl BlockContext { - pub(crate) fn new(algorithm: &'static Algorithm) -> Self { - Self { - state: algorithm.initial_state, - completed_data_blocks: 0, - algorithm, - cpu_features: cpu::features(), - } - } - - #[inline] - pub(crate) fn update(&mut self, input: &[u8]) { - let num_blocks = input.len() / self.algorithm.block_len; - assert_eq!(num_blocks * self.algorithm.block_len, input.len()); - if num_blocks > 0 { - unsafe { - (self.algorithm.block_data_order)(&mut self.state, input.as_ptr(), num_blocks); - } - self.completed_data_blocks = self - .completed_data_blocks - .checked_add(polyfill::u64_from_usize(num_blocks)) - .unwrap(); - } - } - - pub(crate) fn finish(mut self, pending: &mut [u8], num_pending: usize) -> Digest { - let block_len = self.algorithm.block_len; - assert_eq!(pending.len(), block_len); - assert!(num_pending <= pending.len()); - - let mut padding_pos = num_pending; - pending[padding_pos] = 0x80; - padding_pos += 1; - - if padding_pos > block_len - self.algorithm.len_len { - polyfill::slice::fill(&mut pending[padding_pos..block_len], 0); - unsafe { - (self.algorithm.block_data_order)(&mut self.state, pending.as_ptr(), 1); - } - // We don't increase |self.completed_data_blocks| because the - // padding isn't data, and so it isn't included in the data length. - padding_pos = 0; - } - - polyfill::slice::fill(&mut pending[padding_pos..(block_len - 8)], 0); - - // Output the length, in bits, in big endian order. - let completed_data_bits = self - .completed_data_blocks - .checked_mul(polyfill::u64_from_usize(block_len)) - .unwrap() - .checked_add(polyfill::u64_from_usize(num_pending)) - .unwrap() - .checked_mul(8) - .unwrap(); - pending[(block_len - 8)..block_len].copy_from_slice(&u64::to_be_bytes(completed_data_bits)); - - unsafe { - (self.algorithm.block_data_order)(&mut self.state, pending.as_ptr(), 1); - } - - Digest { - algorithm: self.algorithm, - value: (self.algorithm.format_output)(self.state), - } - } -} - -/// A context for multi-step (Init-Update-Finish) digest calculations. -/// -/// # Examples -/// -/// ``` -/// use ring::digest; -/// -/// let one_shot = digest::digest(&digest::SHA384, b"hello, world"); -/// -/// let mut ctx = digest::Context::new(&digest::SHA384); -/// ctx.update(b"hello"); -/// ctx.update(b", "); -/// ctx.update(b"world"); -/// let multi_part = ctx.finish(); -/// -/// assert_eq!(&one_shot.as_ref(), &multi_part.as_ref()); -/// ``` -#[derive(Clone)] -pub struct Context { - block: BlockContext, - // TODO: More explicitly force 64-bit alignment for |pending|. - pending: [u8; MAX_BLOCK_LEN], - num_pending: usize, -} - -impl Context { - /// Constructs a new context. - pub fn new(algorithm: &'static Algorithm) -> Self { - Self { - block: BlockContext::new(algorithm), - pending: [0u8; MAX_BLOCK_LEN], - num_pending: 0, - } - } - - pub(crate) fn clone_from(block: &BlockContext) -> Self { - Self { - block: block.clone(), - pending: [0u8; MAX_BLOCK_LEN], - num_pending: 0, - } - } - - /// Updates the digest with all the data in `data`. `update` may be called - /// zero or more times until `finish` is called. It must not be called - /// after `finish` has been called. - pub fn update(&mut self, data: &[u8]) { - let block_len = self.block.algorithm.block_len; - if data.len() < block_len - self.num_pending { - self.pending[self.num_pending..(self.num_pending + data.len())].copy_from_slice(data); - self.num_pending += data.len(); - return; - } - - let mut remaining = data; - if self.num_pending > 0 { - let to_copy = block_len - self.num_pending; - self.pending[self.num_pending..block_len].copy_from_slice(&data[..to_copy]); - self.block.update(&self.pending[..block_len]); - remaining = &remaining[to_copy..]; - self.num_pending = 0; - } - - let num_blocks = remaining.len() / block_len; - let num_to_save_for_later = remaining.len() % block_len; - self.block.update(&remaining[..(num_blocks * block_len)]); - if num_to_save_for_later > 0 { - self.pending[..num_to_save_for_later] - .copy_from_slice(&remaining[(remaining.len() - num_to_save_for_later)..]); - self.num_pending = num_to_save_for_later; - } - } - - /// Finalizes the digest calculation and returns the digest value. `finish` - /// consumes the context so it cannot be (mis-)used after `finish` has been - /// called. - pub fn finish(mut self) -> Digest { - let block_len = self.block.algorithm.block_len; - self.block - .finish(&mut self.pending[..block_len], self.num_pending) - } - - /// The algorithm that this context is using. - #[inline(always)] - pub fn algorithm(&self) -> &'static Algorithm { - self.block.algorithm - } -} - -/// Returns the digest of `data` using the given digest algorithm. -/// -/// # Examples: -/// -/// ``` -/// # #[cfg(feature = "alloc")] -/// # { -/// use ring::{digest, test}; -/// let expected_hex = "09ca7e4eaa6e8ae9c7d261167129184883644d07dfba7cbfbc4c8a2e08360d5b"; -/// let expected: Vec = test::from_hex(expected_hex).unwrap(); -/// let actual = digest::digest(&digest::SHA256, b"hello, world"); -/// -/// assert_eq!(&expected, &actual.as_ref()); -/// # } -/// ``` -pub fn digest(algorithm: &'static Algorithm, data: &[u8]) -> Digest { - let mut ctx = Context::new(algorithm); - ctx.update(data); - ctx.finish() -} - -/// A calculated digest value. -/// -/// Use `as_ref` to get the value as a `&[u8]`. -#[derive(Clone, Copy)] -pub struct Digest { - value: Output, - algorithm: &'static Algorithm, -} - -impl Digest { - /// The algorithm that was used to calculate the digest value. - #[inline(always)] - pub fn algorithm(&self) -> &'static Algorithm { - self.algorithm - } -} - -impl AsRef<[u8]> for Digest { - #[inline(always)] - fn as_ref(&self) -> &[u8] { - let as64 = unsafe { &self.value.as64 }; - &endian::as_byte_slice(as64)[..self.algorithm.output_len] - } -} - -impl core::fmt::Debug for Digest { - fn fmt(&self, fmt: &mut core::fmt::Formatter) -> core::fmt::Result { - write!(fmt, "{:?}:", self.algorithm)?; - debug::write_hex_bytes(fmt, self.as_ref()) - } -} - -/// A digest algorithm. -pub struct Algorithm { - /// The length of a finalized digest. - pub output_len: usize, - - /// The size of the chaining value of the digest function, in bytes. For - /// non-truncated algorithms (SHA-1, SHA-256, SHA-512), this is equal to - /// `output_len`. For truncated algorithms (e.g. SHA-384, SHA-512/256), - /// this is equal to the length before truncation. This is mostly helpful - /// for determining the size of an HMAC key that is appropriate for the - /// digest algorithm. - pub chaining_len: usize, - - /// The internal block length. - pub block_len: usize, - - /// The length of the length in the padding. - len_len: usize, - - block_data_order: unsafe extern "C" fn(state: &mut State, data: *const u8, num: c::size_t), - format_output: fn(input: State) -> Output, - - initial_state: State, - - id: AlgorithmID, -} - -#[derive(Debug, Eq, PartialEq)] -enum AlgorithmID { - SHA1, - SHA256, - SHA384, - SHA512, - SHA512_256, -} - -impl PartialEq for Algorithm { - fn eq(&self, other: &Self) -> bool { - self.id == other.id - } -} - -impl Eq for Algorithm {} - -derive_debug_via_id!(Algorithm); - -/// SHA-1 as specified in [FIPS 180-4]. Deprecated. -/// -/// [FIPS 180-4]: http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf -pub static SHA1_FOR_LEGACY_USE_ONLY: Algorithm = Algorithm { - output_len: sha1::OUTPUT_LEN, - chaining_len: sha1::CHAINING_LEN, - block_len: sha1::BLOCK_LEN, - len_len: 64 / 8, - block_data_order: sha1::block_data_order, - format_output: sha256_format_output, - initial_state: State { - as32: [ - Wrapping(0x67452301u32), - Wrapping(0xefcdab89u32), - Wrapping(0x98badcfeu32), - Wrapping(0x10325476u32), - Wrapping(0xc3d2e1f0u32), - Wrapping(0), - Wrapping(0), - Wrapping(0), - ], - }, - id: AlgorithmID::SHA1, -}; - -/// SHA-256 as specified in [FIPS 180-4]. -/// -/// [FIPS 180-4]: http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf -pub static SHA256: Algorithm = Algorithm { - output_len: SHA256_OUTPUT_LEN, - chaining_len: SHA256_OUTPUT_LEN, - block_len: 512 / 8, - len_len: 64 / 8, - block_data_order: sha2::GFp_sha256_block_data_order, - format_output: sha256_format_output, - initial_state: State { - as32: [ - Wrapping(0x6a09e667u32), - Wrapping(0xbb67ae85u32), - Wrapping(0x3c6ef372u32), - Wrapping(0xa54ff53au32), - Wrapping(0x510e527fu32), - Wrapping(0x9b05688cu32), - Wrapping(0x1f83d9abu32), - Wrapping(0x5be0cd19u32), - ], - }, - id: AlgorithmID::SHA256, -}; - -/// SHA-384 as specified in [FIPS 180-4]. -/// -/// [FIPS 180-4]: http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf -pub static SHA384: Algorithm = Algorithm { - output_len: SHA384_OUTPUT_LEN, - chaining_len: SHA512_OUTPUT_LEN, - block_len: SHA512_BLOCK_LEN, - len_len: SHA512_LEN_LEN, - block_data_order: sha2::GFp_sha512_block_data_order, - format_output: sha512_format_output, - initial_state: State { - as64: [ - Wrapping(0xcbbb9d5dc1059ed8), - Wrapping(0x629a292a367cd507), - Wrapping(0x9159015a3070dd17), - Wrapping(0x152fecd8f70e5939), - Wrapping(0x67332667ffc00b31), - Wrapping(0x8eb44a8768581511), - Wrapping(0xdb0c2e0d64f98fa7), - Wrapping(0x47b5481dbefa4fa4), - ], - }, - id: AlgorithmID::SHA384, -}; - -/// SHA-512 as specified in [FIPS 180-4]. -/// -/// [FIPS 180-4]: http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf -pub static SHA512: Algorithm = Algorithm { - output_len: SHA512_OUTPUT_LEN, - chaining_len: SHA512_OUTPUT_LEN, - block_len: SHA512_BLOCK_LEN, - len_len: SHA512_LEN_LEN, - block_data_order: sha2::GFp_sha512_block_data_order, - format_output: sha512_format_output, - initial_state: State { - as64: [ - Wrapping(0x6a09e667f3bcc908), - Wrapping(0xbb67ae8584caa73b), - Wrapping(0x3c6ef372fe94f82b), - Wrapping(0xa54ff53a5f1d36f1), - Wrapping(0x510e527fade682d1), - Wrapping(0x9b05688c2b3e6c1f), - Wrapping(0x1f83d9abfb41bd6b), - Wrapping(0x5be0cd19137e2179), - ], - }, - id: AlgorithmID::SHA512, -}; - -/// SHA-512/256 as specified in [FIPS 180-4]. -/// -/// This is *not* the same as just truncating the output of SHA-512, as -/// SHA-512/256 has its own initial state distinct from SHA-512's initial -/// state. -/// -/// [FIPS 180-4]: http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf -pub static SHA512_256: Algorithm = Algorithm { - output_len: SHA512_256_OUTPUT_LEN, - chaining_len: SHA512_OUTPUT_LEN, - block_len: SHA512_BLOCK_LEN, - len_len: SHA512_LEN_LEN, - block_data_order: sha2::GFp_sha512_block_data_order, - format_output: sha512_format_output, - initial_state: State { - as64: [ - Wrapping(0x22312194fc2bf72c), - Wrapping(0x9f555fa3c84c64c2), - Wrapping(0x2393b86b6f53b151), - Wrapping(0x963877195940eabd), - Wrapping(0x96283ee2a88effe3), - Wrapping(0xbe5e1e2553863992), - Wrapping(0x2b0199fc2c85b8aa), - Wrapping(0x0eb72ddc81c52ca2), - ], - }, - id: AlgorithmID::SHA512_256, -}; - -#[derive(Clone, Copy)] // XXX: Why do we need to be `Copy`? -#[repr(C)] -union State { - as64: [Wrapping; sha2::CHAINING_WORDS], - as32: [Wrapping; sha2::CHAINING_WORDS], -} - -#[derive(Clone, Copy)] -#[repr(C)] -union Output { - as64: [BigEndian; 512 / 8 / core::mem::size_of::>()], - as32: [BigEndian; 256 / 8 / core::mem::size_of::>()], -} - -/// The maximum block length (`Algorithm::block_len`) of all the algorithms in -/// this module. -pub const MAX_BLOCK_LEN: usize = 1024 / 8; - -/// The maximum output length (`Algorithm::output_len`) of all the algorithms -/// in this module. -pub const MAX_OUTPUT_LEN: usize = 512 / 8; - -/// The maximum chaining length (`Algorithm::chaining_len`) of all the -/// algorithms in this module. -pub const MAX_CHAINING_LEN: usize = MAX_OUTPUT_LEN; - -fn sha256_format_output(input: State) -> Output { - let input = unsafe { &input.as32 }; - Output { - as32: [ - BigEndian::from(input[0]), - BigEndian::from(input[1]), - BigEndian::from(input[2]), - BigEndian::from(input[3]), - BigEndian::from(input[4]), - BigEndian::from(input[5]), - BigEndian::from(input[6]), - BigEndian::from(input[7]), - ], - } -} - -fn sha512_format_output(input: State) -> Output { - let input = unsafe { &input.as64 }; - Output { - as64: [ - BigEndian::from(input[0]), - BigEndian::from(input[1]), - BigEndian::from(input[2]), - BigEndian::from(input[3]), - BigEndian::from(input[4]), - BigEndian::from(input[5]), - BigEndian::from(input[6]), - BigEndian::from(input[7]), - ], - } -} - -/// The length of the output of SHA-1, in bytes. -pub const SHA1_OUTPUT_LEN: usize = sha1::OUTPUT_LEN; - -/// The length of the output of SHA-256, in bytes. -pub const SHA256_OUTPUT_LEN: usize = 256 / 8; - -/// The length of the output of SHA-384, in bytes. -pub const SHA384_OUTPUT_LEN: usize = 384 / 8; - -/// The length of the output of SHA-512, in bytes. -pub const SHA512_OUTPUT_LEN: usize = 512 / 8; - -/// The length of the output of SHA-512/256, in bytes. -pub const SHA512_256_OUTPUT_LEN: usize = 256 / 8; - -/// The length of a block for SHA-512-based algorithms, in bytes. -const SHA512_BLOCK_LEN: usize = 1024 / 8; - -/// The length of the length field for SHA-512-based algorithms, in bytes. -const SHA512_LEN_LEN: usize = 128 / 8; - -#[cfg(test)] -mod tests { - - mod max_input { - use super::super::super::digest; - use crate::polyfill; - use alloc::vec; - - macro_rules! max_input_tests { - ( $algorithm_name:ident ) => { - mod $algorithm_name { - use super::super::super::super::digest; - - #[test] - fn max_input_test() { - super::max_input_test(&digest::$algorithm_name); - } - - #[test] - #[should_panic] - fn too_long_input_test_block() { - super::too_long_input_test_block(&digest::$algorithm_name); - } - - #[test] - #[should_panic] - fn too_long_input_test_byte() { - super::too_long_input_test_byte(&digest::$algorithm_name); - } - } - }; - } - - fn max_input_test(alg: &'static digest::Algorithm) { - let mut context = nearly_full_context(alg); - let next_input = vec![0u8; alg.block_len - 1]; - context.update(&next_input); - let _ = context.finish(); // no panic - } - - fn too_long_input_test_block(alg: &'static digest::Algorithm) { - let mut context = nearly_full_context(alg); - let next_input = vec![0u8; alg.block_len]; - context.update(&next_input); - let _ = context.finish(); // should panic - } - - fn too_long_input_test_byte(alg: &'static digest::Algorithm) { - let mut context = nearly_full_context(alg); - let next_input = vec![0u8; alg.block_len - 1]; - context.update(&next_input); // no panic - context.update(&[0]); - let _ = context.finish(); // should panic - } - - fn nearly_full_context(alg: &'static digest::Algorithm) -> digest::Context { - // All implementations currently support up to 2^64-1 bits - // of input; according to the spec, SHA-384 and SHA-512 - // support up to 2^128-1, but that's not implemented yet. - let max_bytes = 1u64 << (64 - 3); - let max_blocks = max_bytes / polyfill::u64_from_usize(alg.block_len); - digest::Context { - block: digest::BlockContext { - state: alg.initial_state, - completed_data_blocks: max_blocks - 1, - algorithm: alg, - cpu_features: crate::cpu::features(), - }, - pending: [0u8; digest::MAX_BLOCK_LEN], - num_pending: 0, - } - } - - max_input_tests!(SHA1_FOR_LEGACY_USE_ONLY); - max_input_tests!(SHA256); - max_input_tests!(SHA384); - max_input_tests!(SHA512); - } -} Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/ring-0.16.20/src/ec/curve25519/ed25519/ed25519_pkcs8_v2_template.der and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/ring-0.16.20/src/ec/curve25519/ed25519/ed25519_pkcs8_v2_template.der differ diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/ec/curve25519/ed25519/signing.rs temporalio-1.3.0/vendor/ring-0.16.20/src/ec/curve25519/ed25519/signing.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/ec/curve25519/ed25519/signing.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/ec/curve25519/ed25519/signing.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,270 +0,0 @@ -// Copyright 2015-2016 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -//! EdDSA Signatures. - -use super::{super::ops::*, eddsa_digest, ED25519_PUBLIC_KEY_LEN}; -use crate::{ - digest, error, - io::der, - pkcs8, rand, - signature::{self, KeyPair as SigningKeyPair}, -}; -use core::convert::TryInto; - -/// An Ed25519 key pair, for signing. -pub struct Ed25519KeyPair { - // RFC 8032 Section 5.1.6 calls this *s*. - private_scalar: Scalar, - - // RFC 8032 Section 5.1.6 calls this *prefix*. - private_prefix: Prefix, - - // RFC 8032 Section 5.1.5 calls this *A*. - public_key: PublicKey, -} - -derive_debug_via_field!(Ed25519KeyPair, stringify!(Ed25519KeyPair), public_key); - -impl Ed25519KeyPair { - /// Generates a new key pair and returns the key pair serialized as a - /// PKCS#8 document. - /// - /// The PKCS#8 document will be a v2 `OneAsymmetricKey` with the public key, - /// as described in [RFC 5958 Section 2]; see [RFC 8410 Section 10.3] for an - /// example. - /// - /// [RFC 5958 Section 2]: https://tools.ietf.org/html/rfc5958#section-2 - /// [RFC 8410 Section 10.3]: https://tools.ietf.org/html/rfc8410#section-10.3 - pub fn generate_pkcs8( - rng: &dyn rand::SecureRandom, - ) -> Result { - let seed: [u8; SEED_LEN] = rand::generate(rng)?.expose(); - let key_pair = Self::from_seed_(&seed); - Ok(pkcs8::wrap_key( - &PKCS8_TEMPLATE, - &seed[..], - key_pair.public_key().as_ref(), - )) - } - - /// Constructs an Ed25519 key pair by parsing an unencrypted PKCS#8 v2 - /// Ed25519 private key. - /// - /// `openssl genpkey -algorithm ED25519` generates PKCS# v1 keys, which - /// require the use of `Ed25519KeyPair::from_pkcs8_maybe_unchecked()` - /// instead of `Ed25519KeyPair::from_pkcs8()`. - /// - /// The input must be in PKCS#8 v2 format, and in particular it must contain - /// the public key in addition to the private key. `from_pkcs8()` will - /// verify that the public key and the private key are consistent with each - /// other. - /// - /// If you need to parse PKCS#8 v1 files (without the public key) then use - /// `Ed25519KeyPair::from_pkcs8_maybe_unchecked()` instead. - pub fn from_pkcs8(pkcs8: &[u8]) -> Result { - let (seed, public_key) = - unwrap_pkcs8(pkcs8::Version::V2Only, untrusted::Input::from(pkcs8))?; - Self::from_seed_and_public_key( - seed.as_slice_less_safe(), - public_key.unwrap().as_slice_less_safe(), - ) - } - - /// Constructs an Ed25519 key pair by parsing an unencrypted PKCS#8 v1 or v2 - /// Ed25519 private key. - /// - /// `openssl genpkey -algorithm ED25519` generates PKCS# v1 keys. - /// - /// It is recommended to use `Ed25519KeyPair::from_pkcs8()`, which accepts - /// only PKCS#8 v2 files that contain the public key. - /// `from_pkcs8_maybe_unchecked()` parses PKCS#2 files exactly like - /// `from_pkcs8()`. It also accepts v1 files. PKCS#8 v1 files do not contain - /// the public key, so when a v1 file is parsed the public key will be - /// computed from the private key, and there will be no consistency check - /// between the public key and the private key. - /// - /// PKCS#8 v2 files are parsed exactly like `Ed25519KeyPair::from_pkcs8()`. - pub fn from_pkcs8_maybe_unchecked(pkcs8: &[u8]) -> Result { - let (seed, public_key) = - unwrap_pkcs8(pkcs8::Version::V1OrV2, untrusted::Input::from(pkcs8))?; - if let Some(public_key) = public_key { - Self::from_seed_and_public_key( - seed.as_slice_less_safe(), - public_key.as_slice_less_safe(), - ) - } else { - Self::from_seed_unchecked(seed.as_slice_less_safe()) - } - } - - /// Constructs an Ed25519 key pair from the private key seed `seed` and its - /// public key `public_key`. - /// - /// It is recommended to use `Ed25519KeyPair::from_pkcs8()` instead. - /// - /// The private and public keys will be verified to be consistent with each - /// other. This helps avoid misuse of the key (e.g. accidentally swapping - /// the private key and public key, or using the wrong private key for the - /// public key). This also detects any corruption of the public or private - /// key. - pub fn from_seed_and_public_key( - seed: &[u8], - public_key: &[u8], - ) -> Result { - let pair = Self::from_seed_unchecked(seed)?; - - // This implicitly verifies that `public_key` is the right length. - // XXX: This rejects ~18 keys when they are partially reduced, though - // those keys are virtually impossible to find. - if public_key != pair.public_key.as_ref() { - let err = if public_key.len() != pair.public_key.as_ref().len() { - error::KeyRejected::invalid_encoding() - } else { - error::KeyRejected::inconsistent_components() - }; - return Err(err); - } - - Ok(pair) - } - - /// Constructs a Ed25519 key pair from the private key seed `seed`. - /// - /// It is recommended to use `Ed25519KeyPair::from_pkcs8()` instead. When - /// that is not practical, it is recommended to use - /// `Ed25519KeyPair::from_seed_and_public_key()` instead. - /// - /// Since the public key is not given, the public key will be computed from - /// the private key. It is not possible to detect misuse or corruption of - /// the private key since the public key isn't given as input. - pub fn from_seed_unchecked(seed: &[u8]) -> Result { - let seed = seed - .try_into() - .map_err(|_| error::KeyRejected::invalid_encoding())?; - Ok(Self::from_seed_(seed)) - } - - fn from_seed_(seed: &Seed) -> Self { - let h = digest::digest(&digest::SHA512, seed); - let (private_scalar, private_prefix) = h.as_ref().split_at(SCALAR_LEN); - - let private_scalar = - MaskedScalar::from_bytes_masked(private_scalar.try_into().unwrap()).into(); - - let mut a = ExtPoint::new_at_infinity(); - unsafe { - GFp_x25519_ge_scalarmult_base(&mut a, &private_scalar); - } - - Self { - private_scalar, - private_prefix: private_prefix.try_into().unwrap(), - public_key: PublicKey(a.into_encoded_point()), - } - } - - /// Returns the signature of the message `msg`. - pub fn sign(&self, msg: &[u8]) -> signature::Signature { - signature::Signature::new(|signature_bytes| { - extern "C" { - fn GFp_x25519_sc_muladd( - s: &mut [u8; SCALAR_LEN], - a: &Scalar, - b: &Scalar, - c: &Scalar, - ); - } - - let (signature_bytes, _unused) = signature_bytes.split_at_mut(ELEM_LEN + SCALAR_LEN); - let (signature_r, signature_s) = signature_bytes.split_at_mut(ELEM_LEN); - let nonce = { - let mut ctx = digest::Context::new(&digest::SHA512); - ctx.update(&self.private_prefix); - ctx.update(msg); - ctx.finish() - }; - let nonce = Scalar::from_sha512_digest_reduced(nonce); - - let mut r = ExtPoint::new_at_infinity(); - unsafe { - GFp_x25519_ge_scalarmult_base(&mut r, &nonce); - } - signature_r.copy_from_slice(&r.into_encoded_point()); - let hram_digest = eddsa_digest(signature_r, &self.public_key.as_ref(), msg); - let hram = Scalar::from_sha512_digest_reduced(hram_digest); - unsafe { - GFp_x25519_sc_muladd( - signature_s.try_into().unwrap(), - &hram, - &self.private_scalar, - &nonce, - ); - } - - SIGNATURE_LEN - }) - } -} - -impl signature::KeyPair for Ed25519KeyPair { - type PublicKey = PublicKey; - - fn public_key(&self) -> &Self::PublicKey { - &self.public_key - } -} - -#[derive(Clone, Copy)] -pub struct PublicKey([u8; ED25519_PUBLIC_KEY_LEN]); - -impl AsRef<[u8]> for PublicKey { - fn as_ref(&self) -> &[u8] { - self.0.as_ref() - } -} - -derive_debug_self_as_ref_hex_bytes!(PublicKey); - -fn unwrap_pkcs8( - version: pkcs8::Version, - input: untrusted::Input, -) -> Result<(untrusted::Input, Option), error::KeyRejected> { - let (private_key, public_key) = pkcs8::unwrap_key(&PKCS8_TEMPLATE, version, input)?; - let private_key = private_key - .read_all(error::Unspecified, |input| { - der::expect_tag_and_get_value(input, der::Tag::OctetString) - }) - .map_err(|error::Unspecified| error::KeyRejected::invalid_encoding())?; - Ok((private_key, public_key)) -} - -extern "C" { - fn GFp_x25519_ge_scalarmult_base(h: &mut ExtPoint, a: &Scalar); -} - -type Prefix = [u8; PREFIX_LEN]; -const PREFIX_LEN: usize = digest::SHA512_OUTPUT_LEN - SCALAR_LEN; - -const SIGNATURE_LEN: usize = ELEM_LEN + SCALAR_LEN; - -type Seed = [u8; SEED_LEN]; -const SEED_LEN: usize = 32; - -static PKCS8_TEMPLATE: pkcs8::Template = pkcs8::Template { - bytes: include_bytes!("ed25519_pkcs8_v2_template.der"), - alg_id_range: core::ops::Range { start: 7, end: 12 }, - curve_id_index: 0, - private_key_index: 0x10, -}; diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/ec/curve25519/ed25519/verification.rs temporalio-1.3.0/vendor/ring-0.16.20/src/ec/curve25519/ed25519/verification.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/ec/curve25519/ed25519/verification.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/ec/curve25519/ed25519/verification.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,84 +0,0 @@ -// Copyright 2015-2016 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -//! EdDSA Signatures. - -use super::{super::ops::*, eddsa_digest}; -use crate::{error, sealed, signature}; -use core::convert::TryInto; - -/// Parameters for EdDSA signing and verification. -pub struct EdDSAParameters; - -impl core::fmt::Debug for EdDSAParameters { - fn fmt(&self, f: &mut core::fmt::Formatter) -> Result<(), core::fmt::Error> { - write!(f, "ring::signature::ED25519") - } -} - -/// Verification of [Ed25519] signatures. -/// -/// Ed25519 uses SHA-512 as the digest algorithm. -/// -/// [Ed25519]: https://ed25519.cr.yp.to/ -pub static ED25519: EdDSAParameters = EdDSAParameters {}; - -impl signature::VerificationAlgorithm for EdDSAParameters { - fn verify( - &self, - public_key: untrusted::Input, - msg: untrusted::Input, - signature: untrusted::Input, - ) -> Result<(), error::Unspecified> { - let public_key: &[u8; ELEM_LEN] = public_key.as_slice_less_safe().try_into()?; - let (signature_r, signature_s) = signature.read_all(error::Unspecified, |input| { - let signature_r: &[u8; ELEM_LEN] = input - .read_bytes(ELEM_LEN)? - .as_slice_less_safe() - .try_into()?; - let signature_s: &[u8; SCALAR_LEN] = input - .read_bytes(SCALAR_LEN)? - .as_slice_less_safe() - .try_into()?; - Ok((signature_r, signature_s)) - })?; - - let signature_s = Scalar::from_bytes_checked(*signature_s)?; - - let mut a = ExtPoint::from_encoded_point_vartime(public_key)?; - a.invert_vartime(); - - let h_digest = eddsa_digest(signature_r, public_key, msg.as_slice_less_safe()); - let h = Scalar::from_sha512_digest_reduced(h_digest); - - let mut r = Point::new_at_infinity(); - unsafe { GFp_x25519_ge_double_scalarmult_vartime(&mut r, &h, &a, &signature_s) }; - let r_check = r.into_encoded_point(); - if *signature_r != r_check { - return Err(error::Unspecified); - } - Ok(()) - } -} - -impl sealed::Sealed for EdDSAParameters {} - -extern "C" { - fn GFp_x25519_ge_double_scalarmult_vartime( - r: &mut Point, - a_coeff: &Scalar, - a: &ExtPoint, - b_coeff: &Scalar, - ); -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/ec/curve25519/ed25519.rs temporalio-1.3.0/vendor/ring-0.16.20/src/ec/curve25519/ed25519.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/ec/curve25519/ed25519.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/ec/curve25519/ed25519.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,32 +0,0 @@ -// Copyright 2015-2016 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -//! EdDSA Signatures. - -use super::ops::ELEM_LEN; -use crate::digest; - -pub mod signing; -pub mod verification; - -/// The length of an Ed25519 public key. -pub const ED25519_PUBLIC_KEY_LEN: usize = ELEM_LEN; - -pub fn eddsa_digest(signature_r: &[u8], public_key: &[u8], msg: &[u8]) -> digest::Digest { - let mut ctx = digest::Context::new(&digest::SHA512); - ctx.update(signature_r); - ctx.update(public_key); - ctx.update(msg); - ctx.finish() -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/ec/curve25519/ops.rs temporalio-1.3.0/vendor/ring-0.16.20/src/ec/curve25519/ops.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/ec/curve25519/ops.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/ec/curve25519/ops.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,155 +0,0 @@ -// Copyright 2015-2017 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -//! Elliptic curve operations on the birationally equivalent curves Curve25519 -//! and Edwards25519. - -pub use super::scalar::{MaskedScalar, Scalar, SCALAR_LEN}; -use crate::{ - bssl, error, - limb::{Limb, LIMB_BITS}, -}; -use core::marker::PhantomData; - -// Elem` is `fe` in curve25519/internal.h. -// Elem is `fe_loose` in curve25519/internal.h. -// Keep this in sync with curve25519/internal.h. -#[repr(C)] -pub struct Elem { - limbs: [Limb; ELEM_LIMBS], // This is called `v` in the C code. - encoding: PhantomData, -} - -pub trait Encoding {} -pub struct T; -impl Encoding for T {} - -const ELEM_LIMBS: usize = 5 * 64 / LIMB_BITS; - -impl Elem { - fn zero() -> Self { - Self { - limbs: Default::default(), - encoding: PhantomData, - } - } -} - -impl Elem { - fn negate(&mut self) { - unsafe { - GFp_x25519_fe_neg(self); - } - } -} - -// An encoding of a curve point. If on Curve25519, it should be encoded as -// described in Section 5 of [RFC 7748]. If on Edwards25519, it should be -// encoded as described in section 5.1.2 of [RFC 8032]. -// -// [RFC 7748] https://tools.ietf.org/html/rfc7748#section-5 -// [RFC 8032] https://tools.ietf.org/html/rfc8032#section-5.1.2 -pub type EncodedPoint = [u8; ELEM_LEN]; -pub const ELEM_LEN: usize = 32; - -// Keep this in sync with `ge_p3` in curve25519/internal.h. -#[repr(C)] -pub struct ExtPoint { - x: Elem, - y: Elem, - z: Elem, - t: Elem, -} - -impl ExtPoint { - pub fn new_at_infinity() -> Self { - Self { - x: Elem::zero(), - y: Elem::zero(), - z: Elem::zero(), - t: Elem::zero(), - } - } - - pub fn from_encoded_point_vartime(encoded: &EncodedPoint) -> Result { - let mut point = Self::new_at_infinity(); - - Result::from(unsafe { GFp_x25519_ge_frombytes_vartime(&mut point, encoded) }) - .map(|()| point) - } - - pub fn into_encoded_point(self) -> EncodedPoint { - encode_point(self.x, self.y, self.z) - } - - pub fn invert_vartime(&mut self) { - self.x.negate(); - self.t.negate(); - } -} - -// Keep this in sync with `ge_p2` in curve25519/internal.h. -#[repr(C)] -pub struct Point { - x: Elem, - y: Elem, - z: Elem, -} - -impl Point { - pub fn new_at_infinity() -> Self { - Self { - x: Elem::zero(), - y: Elem::zero(), - z: Elem::zero(), - } - } - - pub fn into_encoded_point(self) -> EncodedPoint { - encode_point(self.x, self.y, self.z) - } -} - -fn encode_point(x: Elem, y: Elem, z: Elem) -> EncodedPoint { - let mut bytes = [0; ELEM_LEN]; - - let sign_bit: u8 = unsafe { - let mut recip = Elem::zero(); - GFp_x25519_fe_invert(&mut recip, &z); - - let mut x_over_z = Elem::zero(); - GFp_x25519_fe_mul_ttt(&mut x_over_z, &x, &recip); - - let mut y_over_z = Elem::zero(); - GFp_x25519_fe_mul_ttt(&mut y_over_z, &y, &recip); - GFp_x25519_fe_tobytes(&mut bytes, &y_over_z); - - GFp_x25519_fe_isnegative(&x_over_z) - }; - - // The preceding computations must execute in constant time, but this - // doesn't need to. - bytes[ELEM_LEN - 1] ^= sign_bit << 7; - - bytes -} - -extern "C" { - fn GFp_x25519_fe_invert(out: &mut Elem, z: &Elem); - fn GFp_x25519_fe_isnegative(elem: &Elem) -> u8; - fn GFp_x25519_fe_mul_ttt(h: &mut Elem, f: &Elem, g: &Elem); - fn GFp_x25519_fe_neg(f: &mut Elem); - fn GFp_x25519_fe_tobytes(bytes: &mut EncodedPoint, elem: &Elem); - fn GFp_x25519_ge_frombytes_vartime(h: &mut ExtPoint, s: &EncodedPoint) -> bssl::Result; -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/ec/curve25519/scalar.rs temporalio-1.3.0/vendor/ring-0.16.20/src/ec/curve25519/scalar.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/ec/curve25519/scalar.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/ec/curve25519/scalar.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,78 +0,0 @@ -// Copyright 2015-2019 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -use crate::{digest, error, limb}; -use core::convert::TryInto; - -#[repr(transparent)] -pub struct Scalar([u8; SCALAR_LEN]); - -pub const SCALAR_LEN: usize = 32; - -impl Scalar { - // Constructs a `Scalar` from `bytes`, failing if `bytes` encodes a scalar - // that not in the range [0, n). - pub fn from_bytes_checked(bytes: [u8; SCALAR_LEN]) -> Result { - const ORDER: [limb::Limb; SCALAR_LEN / limb::LIMB_BYTES] = - limbs![0x5cf5d3ed, 0x5812631a, 0xa2f79cd6, 0x14def9de, 0, 0, 0, 0x10000000]; - - // `bytes` is in little-endian order. - let mut reversed = bytes; - reversed.reverse(); - - let mut limbs = [0; SCALAR_LEN / limb::LIMB_BYTES]; - limb::parse_big_endian_in_range_and_pad_consttime( - untrusted::Input::from(&reversed), - limb::AllowZero::Yes, - &ORDER, - &mut limbs, - )?; - - Ok(Self(bytes)) - } - - // Constructs a `Scalar` from `digest` reduced modulo n. - pub fn from_sha512_digest_reduced(digest: digest::Digest) -> Self { - extern "C" { - fn GFp_x25519_sc_reduce(s: &mut UnreducedScalar); - } - let mut unreduced = [0u8; digest::SHA512_OUTPUT_LEN]; - unreduced.copy_from_slice(digest.as_ref()); - unsafe { GFp_x25519_sc_reduce(&mut unreduced) }; - Self((&unreduced[..SCALAR_LEN]).try_into().unwrap()) - } -} - -#[repr(transparent)] -pub struct MaskedScalar([u8; SCALAR_LEN]); - -impl MaskedScalar { - pub fn from_bytes_masked(bytes: [u8; SCALAR_LEN]) -> Self { - extern "C" { - fn GFp_x25519_sc_mask(a: &mut [u8; SCALAR_LEN]); - } - let mut r = Self(bytes); - unsafe { GFp_x25519_sc_mask(&mut r.0) }; - r - } -} - -impl From for Scalar { - fn from(MaskedScalar(scalar): MaskedScalar) -> Self { - Self(scalar) - } -} - -type UnreducedScalar = [u8; UNREDUCED_SCALAR_LEN]; -const UNREDUCED_SCALAR_LEN: usize = SCALAR_LEN * 2; diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/ec/curve25519/x25519.rs temporalio-1.3.0/vendor/ring-0.16.20/src/ec/curve25519/x25519.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/ec/curve25519/x25519.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/ec/curve25519/x25519.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,170 +0,0 @@ -// Copyright 2015-2016 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -//! X25519 Key agreement. - -use super::{ops, scalar::SCALAR_LEN}; -use crate::{agreement, constant_time, cpu, ec, error, rand}; -use core::convert::TryInto; - -static CURVE25519: ec::Curve = ec::Curve { - public_key_len: PUBLIC_KEY_LEN, - elem_scalar_seed_len: ELEM_AND_SCALAR_LEN, - id: ec::CurveID::Curve25519, - check_private_key_bytes: x25519_check_private_key_bytes, - generate_private_key: x25519_generate_private_key, - public_from_private: x25519_public_from_private, -}; - -/// X25519 (ECDH using Curve25519) as described in [RFC 7748]. -/// -/// Everything is as described in RFC 7748. Key agreement will fail if the -/// result of the X25519 operation is zero; see the notes on the -/// "all-zero value" in [RFC 7748 section 6.1]. -/// -/// [RFC 7748]: https://tools.ietf.org/html/rfc7748 -/// [RFC 7748 section 6.1]: https://tools.ietf.org/html/rfc7748#section-6.1 -pub static X25519: agreement::Algorithm = agreement::Algorithm { - curve: &CURVE25519, - ecdh: x25519_ecdh, -}; - -fn x25519_check_private_key_bytes(bytes: &[u8]) -> Result<(), error::Unspecified> { - debug_assert_eq!(bytes.len(), PRIVATE_KEY_LEN); - Ok(()) -} - -fn x25519_generate_private_key( - rng: &dyn rand::SecureRandom, - out: &mut [u8], -) -> Result<(), error::Unspecified> { - rng.fill(out) -} - -fn x25519_public_from_private( - public_out: &mut [u8], - private_key: &ec::Seed, -) -> Result<(), error::Unspecified> { - let public_out = public_out.try_into()?; - - #[cfg(target_arch = "arm")] - let cpu_features = private_key.cpu_features; - - let private_key: &[u8; SCALAR_LEN] = private_key.bytes_less_safe().try_into()?; - let private_key = ops::MaskedScalar::from_bytes_masked(*private_key); - - #[cfg(all(not(target_os = "ios"), target_arch = "arm"))] - { - if cpu::arm::NEON.available(cpu_features) { - static MONTGOMERY_BASE_POINT: [u8; 32] = [ - 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, - ]; - x25519_neon(public_out, &private_key, &MONTGOMERY_BASE_POINT); - return Ok(()); - } - } - - extern "C" { - fn GFp_x25519_public_from_private_generic_masked( - public_key_out: &mut PublicKey, - private_key: &PrivateKey, - ); - } - unsafe { - GFp_x25519_public_from_private_generic_masked(public_out, &private_key); - } - - Ok(()) -} - -fn x25519_ecdh( - out: &mut [u8], - my_private_key: &ec::Seed, - peer_public_key: untrusted::Input, -) -> Result<(), error::Unspecified> { - let cpu_features = my_private_key.cpu_features; - let my_private_key: &[u8; SCALAR_LEN] = my_private_key.bytes_less_safe().try_into()?; - let my_private_key = ops::MaskedScalar::from_bytes_masked(*my_private_key); - let peer_public_key: &[u8; PUBLIC_KEY_LEN] = peer_public_key.as_slice_less_safe().try_into()?; - - #[cfg_attr( - not(all(not(target_os = "ios"), target_arch = "arm")), - allow(unused_variables) - )] - fn scalar_mult( - out: &mut ops::EncodedPoint, - scalar: &ops::MaskedScalar, - point: &ops::EncodedPoint, - cpu_features: cpu::Features, - ) { - #[cfg(all(not(target_os = "ios"), target_arch = "arm"))] - { - if cpu::arm::NEON.available(cpu_features) { - return x25519_neon(out, scalar, point); - } - } - - extern "C" { - fn GFp_x25519_scalar_mult_generic_masked( - out: &mut ops::EncodedPoint, - scalar: &ops::MaskedScalar, - point: &ops::EncodedPoint, - ); - } - unsafe { - GFp_x25519_scalar_mult_generic_masked(out, scalar, point); - } - } - - scalar_mult( - out.try_into()?, - &my_private_key, - peer_public_key, - cpu_features, - ); - - let zeros: SharedSecret = [0; SHARED_SECRET_LEN]; - if constant_time::verify_slices_are_equal(out, &zeros).is_ok() { - // All-zero output results when the input is a point of small order. - return Err(error::Unspecified); - } - - Ok(()) -} - -#[cfg(all(not(target_os = "ios"), target_arch = "arm"))] -fn x25519_neon(out: &mut ops::EncodedPoint, scalar: &ops::MaskedScalar, point: &ops::EncodedPoint) { - extern "C" { - fn GFp_x25519_NEON( - out: &mut ops::EncodedPoint, - scalar: &ops::MaskedScalar, - point: &ops::EncodedPoint, - ); - } - unsafe { GFp_x25519_NEON(out, scalar, point) } -} - -const ELEM_AND_SCALAR_LEN: usize = ops::ELEM_LEN; - -type PrivateKey = ops::MaskedScalar; -const PRIVATE_KEY_LEN: usize = ELEM_AND_SCALAR_LEN; - -// An X25519 public key as an encoded Curve25519 point. -type PublicKey = [u8; PUBLIC_KEY_LEN]; -const PUBLIC_KEY_LEN: usize = ELEM_AND_SCALAR_LEN; - -// An X25519 shared secret as an encoded Curve25519 point. -type SharedSecret = [u8; SHARED_SECRET_LEN]; -const SHARED_SECRET_LEN: usize = ELEM_AND_SCALAR_LEN; diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/ec/curve25519.rs temporalio-1.3.0/vendor/ring-0.16.20/src/ec/curve25519.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/ec/curve25519.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/ec/curve25519.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -// Copyright 2016 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -//! Elliptic curve operations and schemes using Curve25519. - -pub mod ed25519; -pub mod x25519; - -mod ops; -mod scalar; diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/ec/keys.rs temporalio-1.3.0/vendor/ring-0.16.20/src/ec/keys.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/ec/keys.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/ec/keys.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,90 +0,0 @@ -use super::{Curve, ELEM_MAX_BYTES, SEED_MAX_BYTES}; -use crate::{cpu, error, rand}; - -pub struct KeyPair { - seed: Seed, - public_key: PublicKey, -} - -impl KeyPair { - pub fn derive(seed: Seed) -> Result { - let public_key = seed.compute_public_key()?; - Ok(Self { seed, public_key }) - } - - pub fn public_key(&self) -> &PublicKey { - &self.public_key - } - pub fn split(self) -> (Seed, PublicKey) { - (self.seed, self.public_key) - } -} - -pub struct Seed { - bytes: [u8; SEED_MAX_BYTES], - curve: &'static Curve, - pub(crate) cpu_features: cpu::Features, -} - -impl Seed { - pub(crate) fn generate( - curve: &'static Curve, - rng: &dyn rand::SecureRandom, - cpu_features: cpu::Features, - ) -> Result { - let mut r = Self { - bytes: [0u8; SEED_MAX_BYTES], - curve, - cpu_features, - }; - (curve.generate_private_key)(rng, &mut r.bytes[..curve.elem_scalar_seed_len])?; - Ok(r) - } - - pub(crate) fn from_bytes( - curve: &'static Curve, - bytes: untrusted::Input, - cpu_features: cpu::Features, - ) -> Result { - let bytes = bytes.as_slice_less_safe(); - if curve.elem_scalar_seed_len != bytes.len() { - return Err(error::Unspecified); - } - (curve.check_private_key_bytes)(bytes)?; - let mut r = Self { - bytes: [0; SEED_MAX_BYTES], - curve, - cpu_features, - }; - r.bytes[..curve.elem_scalar_seed_len].copy_from_slice(bytes); - Ok(r) - } - - pub fn bytes_less_safe(&self) -> &[u8] { - &self.bytes[..self.curve.elem_scalar_seed_len] - } - - pub fn compute_public_key(&self) -> Result { - let mut public_key = PublicKey { - bytes: [0u8; PUBLIC_KEY_MAX_LEN], - len: self.curve.public_key_len, - }; - (self.curve.public_from_private)(&mut public_key.bytes[..public_key.len], self)?; - Ok(public_key) - } -} - -#[derive(Copy, Clone)] -pub struct PublicKey { - bytes: [u8; PUBLIC_KEY_MAX_LEN], - len: usize, -} - -impl AsRef<[u8]> for PublicKey { - fn as_ref(&self) -> &[u8] { - &self.bytes[..self.len] - } -} - -/// The maximum length, in bytes, of an encoded public key. -pub const PUBLIC_KEY_MAX_LEN: usize = 1 + (2 * ELEM_MAX_BYTES); diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/curve.rs temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/curve.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/curve.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/curve.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,83 +0,0 @@ -// Copyright 2015-2017 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -use crate::{ec, error, rand}; - -/// A key agreement algorithm. -macro_rules! suite_b_curve { - ( $NAME:ident, $bits:expr, $private_key_ops:expr, $id:expr, - $check_private_key_bytes:ident, $generate_private_key:ident, - $public_from_private:ident) => { - /// Public keys are encoding in uncompressed form using the - /// Octet-String-to-Elliptic-Curve-Point algorithm in - /// [SEC 1: Elliptic Curve Cryptography, Version 2.0]. Public keys are - /// validated during key agreement according to - /// [NIST Special Publication 800-56A, revision 2] and Appendix B.3 of - /// the NSA's [Suite B Implementer's Guide to NIST SP 800-56A]. - /// - /// [SEC 1: Elliptic Curve Cryptography, Version 2.0]: - /// http://www.secg.org/sec1-v2.pdf - /// [NIST Special Publication 800-56A, revision 2]: - /// http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-56Ar2.pdf - /// [Suite B Implementer's Guide to NIST SP 800-56A]: - /// https://github.com/briansmith/ring/blob/main/doc/ecdh.pdf - pub static $NAME: ec::Curve = ec::Curve { - public_key_len: 1 + (2 * (($bits + 7) / 8)), - elem_scalar_seed_len: ($bits + 7) / 8, - id: $id, - check_private_key_bytes: $check_private_key_bytes, - generate_private_key: $generate_private_key, - public_from_private: $public_from_private, - }; - - fn $check_private_key_bytes(bytes: &[u8]) -> Result<(), error::Unspecified> { - debug_assert_eq!(bytes.len(), $bits / 8); - ec::suite_b::private_key::check_scalar_big_endian_bytes($private_key_ops, bytes) - } - - fn $generate_private_key( - rng: &dyn rand::SecureRandom, - out: &mut [u8], - ) -> Result<(), error::Unspecified> { - ec::suite_b::private_key::generate_private_scalar_bytes($private_key_ops, rng, out) - } - - fn $public_from_private( - public_out: &mut [u8], - private_key: &ec::Seed, - ) -> Result<(), error::Unspecified> { - ec::suite_b::private_key::public_from_private($private_key_ops, public_out, private_key) - } - }; -} - -suite_b_curve!( - P256, - 256, - &ec::suite_b::ops::p256::PRIVATE_KEY_OPS, - ec::CurveID::P256, - p256_check_private_key_bytes, - p256_generate_private_key, - p256_public_from_private -); - -suite_b_curve!( - P384, - 384, - &ec::suite_b::ops::p384::PRIVATE_KEY_OPS, - ec::CurveID::P384, - p384_check_private_key_bytes, - p384_generate_private_key, - p384_public_from_private -); diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ecdh.rs temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ecdh.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ecdh.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ecdh.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,236 +0,0 @@ -// Copyright 2015-2017 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -//! ECDH key agreement using the P-256 and P-384 curves. - -use super::{ops::*, private_key::*, public_key::*}; -use crate::{agreement, ec, error}; - -/// A key agreement algorithm. -macro_rules! ecdh { - ( $NAME:ident, $curve:expr, $name_str:expr, $private_key_ops:expr, - $public_key_ops:expr, $ecdh:ident ) => { - #[doc = "ECDH using the NSA Suite B"] - #[doc=$name_str] - #[doc = "curve."] - /// - /// Public keys are encoding in uncompressed form using the - /// Octet-String-to-Elliptic-Curve-Point algorithm in - /// [SEC 1: Elliptic Curve Cryptography, Version 2.0]. Public keys are - /// validated during key agreement according to - /// [NIST Special Publication 800-56A, revision 2] and Appendix B.3 of - /// the NSA's [Suite B Implementer's Guide to NIST SP 800-56A]. - /// - /// [SEC 1: Elliptic Curve Cryptography, Version 2.0]: - /// http://www.secg.org/sec1-v2.pdf - /// [NIST Special Publication 800-56A, revision 2]: - /// http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-56Ar2.pdf - /// [Suite B Implementer's Guide to NIST SP 800-56A]: - /// https://github.com/briansmith/ring/blob/main/doc/ecdh.pdf - pub static $NAME: agreement::Algorithm = agreement::Algorithm { - curve: $curve, - ecdh: $ecdh, - }; - - fn $ecdh( - out: &mut [u8], - my_private_key: &ec::Seed, - peer_public_key: untrusted::Input, - ) -> Result<(), error::Unspecified> { - ecdh( - $private_key_ops, - $public_key_ops, - out, - my_private_key, - peer_public_key, - ) - } - }; -} - -ecdh!( - ECDH_P256, - &ec::suite_b::curve::P256, - "P-256 (secp256r1)", - &p256::PRIVATE_KEY_OPS, - &p256::PUBLIC_KEY_OPS, - p256_ecdh -); - -ecdh!( - ECDH_P384, - &ec::suite_b::curve::P384, - "P-384 (secp384r1)", - &p384::PRIVATE_KEY_OPS, - &p384::PUBLIC_KEY_OPS, - p384_ecdh -); - -fn ecdh( - private_key_ops: &PrivateKeyOps, - public_key_ops: &PublicKeyOps, - out: &mut [u8], - my_private_key: &ec::Seed, - peer_public_key: untrusted::Input, -) -> Result<(), error::Unspecified> { - // The NIST SP 800-56Ar2 steps are from section 5.7.1.2 Elliptic Curve - // Cryptography Cofactor Diffie-Hellman (ECC CDH) Primitive. - // - // The "NSA Guide" steps are from section 3.1 of the NSA guide, "Ephemeral - // Unified Model." - - // NSA Guide Step 1 is handled separately. - - // NIST SP 800-56Ar2 5.6.2.2.2. - // NSA Guide Step 2. - // - // `parse_uncompressed_point` verifies that the point is not at infinity - // and that it is on the curve, using the Partial Public-Key Validation - // Routine. - let peer_public_key = parse_uncompressed_point(public_key_ops, peer_public_key)?; - - // NIST SP 800-56Ar2 Step 1. - // NSA Guide Step 3 (except point at infinity check). - // - // Note that the cofactor (h) is one since we only support prime-order - // curves, so we can safely ignore the cofactor. - // - // It is impossible for the result to be the point at infinity because our - // private key is in the range [1, n) and the curve has prime order and - // `parse_uncompressed_point` verified that the peer public key is on the - // curve and not at infinity. However, since the standards require the - // check, we do it using `assert!`. - // - // NIST SP 800-56Ar2 defines "Destroy" thusly: "In this Recommendation, to - // destroy is an action applied to a key or a piece of secret data. After - // a key or a piece of secret data is destroyed, no information about its - // value can be recovered." We interpret "destroy" somewhat liberally: we - // assume that since we throw away the values to be destroyed, no - // information about their values can be recovered. This doesn't meet the - // NSA guide's explicit requirement to "zeroize" them though. - // TODO: this only needs common scalar ops - let my_private_key = private_key_as_scalar(private_key_ops, my_private_key); - let product = private_key_ops.point_mul(&my_private_key, &peer_public_key); - - // NIST SP 800-56Ar2 Steps 2, 3, 4, and 5. - // NSA Guide Steps 3 (point at infinity check) and 4. - // - // Again, we have a pretty liberal interpretation of the NIST's spec's - // "Destroy" that doesn't meet the NSA requirement to "zeroize." - // `big_endian_affine_from_jacobian` verifies that the result is not at - // infinity and also does an extra check to verify that the point is on - // the curve. - big_endian_affine_from_jacobian(private_key_ops, Some(out), None, &product) - - // NSA Guide Step 5 & 6 are deferred to the caller. Again, we have a - // pretty liberal interpretation of the NIST's spec's "Destroy" that - // doesn't meet the NSA requirement to "zeroize." -} - -#[cfg(test)] -mod tests { - use super::super::ops; - use crate::{agreement, ec, limb, test}; - - static SUPPORTED_SUITE_B_ALGS: [(&str, &agreement::Algorithm, &ec::Curve, &ops::CommonOps); 2] = [ - ( - "P-256", - &agreement::ECDH_P256, - &super::super::curve::P256, - &super::super::ops::p256::COMMON_OPS, - ), - ( - "P-384", - &agreement::ECDH_P384, - &super::super::curve::P384, - &super::super::ops::p384::COMMON_OPS, - ), - ]; - - #[test] - fn test_agreement_suite_b_ecdh_generate() { - // Generates a string of bytes 0x00...00, which will always result in - // a scalar value of zero. - let random_00 = test::rand::FixedByteRandom { byte: 0x00 }; - - // Generates a string of bytes 0xFF...FF, which will be larger than the - // group order of any curve that is supported. - let random_ff = test::rand::FixedByteRandom { byte: 0xff }; - - for &(_, alg, curve, ops) in SUPPORTED_SUITE_B_ALGS.iter() { - // Test that the private key value zero is rejected and that - // `generate` gives up after a while of only getting zeros. - assert!(agreement::EphemeralPrivateKey::generate(alg, &random_00).is_err()); - - // Test that the private key value larger than the group order is - // rejected and that `generate` gives up after a while of only - // getting values larger than the group order. - assert!(agreement::EphemeralPrivateKey::generate(alg, &random_ff).is_err()); - - // Test that a private key value exactly equal to the group order - // is rejected and that `generate` gives up after a while of only - // getting that value from the PRNG. - let mut n_bytes = [0u8; ec::SCALAR_MAX_BYTES]; - let num_bytes = curve.elem_scalar_seed_len; - limb::big_endian_from_limbs(&ops.n.limbs[..ops.num_limbs], &mut n_bytes[..num_bytes]); - { - let n_bytes = &mut n_bytes[..num_bytes]; - let rng = test::rand::FixedSliceRandom { bytes: n_bytes }; - assert!(agreement::EphemeralPrivateKey::generate(alg, &rng).is_err()); - } - - // Test that a private key value exactly equal to the group order - // minus 1 is accepted. - let mut n_minus_1_bytes = n_bytes; - { - let n_minus_1_bytes = &mut n_minus_1_bytes[..num_bytes]; - n_minus_1_bytes[num_bytes - 1] -= 1; - let rng = test::rand::FixedSliceRandom { - bytes: n_minus_1_bytes, - }; - let key = agreement::EphemeralPrivateKey::generate(alg, &rng).unwrap(); - assert_eq!(&n_minus_1_bytes[..], key.bytes()); - } - - // Test that n + 1 also fails. - let mut n_plus_1_bytes = n_bytes; - { - let n_plus_1_bytes = &mut n_plus_1_bytes[..num_bytes]; - n_plus_1_bytes[num_bytes - 1] += 1; - let rng = test::rand::FixedSliceRandom { - bytes: n_plus_1_bytes, - }; - assert!(agreement::EphemeralPrivateKey::generate(alg, &rng).is_err()); - } - - // Test recovery from initial RNG failure. The first value will be - // n, then n + 1, then zero, the next value will be n - 1, which - // will be accepted. - { - let bytes = [ - &n_bytes[..num_bytes], - &n_plus_1_bytes[..num_bytes], - &[0u8; ec::SCALAR_MAX_BYTES][..num_bytes], - &n_minus_1_bytes[..num_bytes], - ]; - let rng = test::rand::FixedSliceSequenceRandom { - bytes: &bytes, - current: core::cell::UnsafeCell::new(0), - }; - let key = agreement::EphemeralPrivateKey::generate(alg, &rng).unwrap(); - assert_eq!(&n_minus_1_bytes[..num_bytes], key.bytes()); - } - } - } -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ecdsa/digest_scalar.rs temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ecdsa/digest_scalar.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ecdsa/digest_scalar.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ecdsa/digest_scalar.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,131 +0,0 @@ -// Copyright 2015-2016 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -//! ECDSA Signatures using the P-256 and P-384 curves. - -use crate::{ - digest, - ec::suite_b::ops::*, - limb::{self, LIMB_BYTES}, -}; - -/// Calculate the digest of `msg` using the digest algorithm `digest_alg`. Then -/// convert the digest to a scalar in the range [0, n) as described in -/// NIST's FIPS 186-4 Section 4.2. Note that this is one of the few cases where -/// a `Scalar` is allowed to have the value zero. -/// -/// NIST's FIPS 186-4 4.2 says "When the length of the output of the hash -/// function is greater than N (i.e., the bit length of q), then the leftmost N -/// bits of the hash function output block shall be used in any calculation -/// using the hash function output during the generation or verification of a -/// digital signature." -/// -/// "Leftmost N bits" means "N most significant bits" because we interpret the -/// digest as a bit-endian encoded integer. -/// -/// The NSA guide instead vaguely suggests that we should convert the digest -/// value to an integer and then reduce it mod `n`. However, real-world -/// implementations (e.g. `digest_to_bn` in OpenSSL and `hashToInt` in Go) do -/// what FIPS 186-4 says to do, not what the NSA guide suggests. -/// -/// Why shifting the value right by at most one bit is sufficient: P-256's `n` -/// has its 256th bit set; i.e. 2**255 < n < 2**256. Once we've truncated the -/// digest to 256 bits and converted it to an integer, it will have a value -/// less than 2**256. If the value is larger than `n` then shifting it one bit -/// right will give a value less than 2**255, which is less than `n`. The -/// analogous argument applies for P-384. However, it does *not* apply in -/// general; for example, it doesn't apply to P-521. -pub fn digest_scalar(ops: &ScalarOps, msg: digest::Digest) -> Scalar { - digest_scalar_(ops, msg.as_ref()) -} - -#[cfg(test)] -pub(crate) fn digest_bytes_scalar(ops: &ScalarOps, digest: &[u8]) -> Scalar { - digest_scalar_(ops, digest) -} - -// This is a separate function solely so that we can test specific digest -// values like all-zero values and values larger than `n`. -fn digest_scalar_(ops: &ScalarOps, digest: &[u8]) -> Scalar { - let cops = ops.common; - let num_limbs = cops.num_limbs; - let digest = if digest.len() > num_limbs * LIMB_BYTES { - &digest[..(num_limbs * LIMB_BYTES)] - } else { - digest - }; - - scalar_parse_big_endian_partially_reduced_variable_consttime( - cops, - limb::AllowZero::Yes, - untrusted::Input::from(digest), - ) - .unwrap() -} - -#[cfg(test)] -mod tests { - use super::digest_bytes_scalar; - use crate::{ - digest, - ec::suite_b::ops::*, - limb::{self, LIMB_BYTES}, - test, - }; - - #[test] - fn test() { - test::run( - test_file!("ecdsa_digest_scalar_tests.txt"), - |section, test_case| { - assert_eq!(section, ""); - - let curve_name = test_case.consume_string("Curve"); - let digest_name = test_case.consume_string("Digest"); - let input = test_case.consume_bytes("Input"); - let output = test_case.consume_bytes("Output"); - - let (ops, digest_alg) = match (curve_name.as_str(), digest_name.as_str()) { - ("P-256", "SHA256") => (&p256::PUBLIC_SCALAR_OPS, &digest::SHA256), - ("P-256", "SHA384") => (&p256::PUBLIC_SCALAR_OPS, &digest::SHA384), - ("P-384", "SHA256") => (&p384::PUBLIC_SCALAR_OPS, &digest::SHA256), - ("P-384", "SHA384") => (&p384::PUBLIC_SCALAR_OPS, &digest::SHA384), - _ => { - panic!("Unsupported curve+digest: {}+{}", curve_name, digest_name); - } - }; - - let num_limbs = ops.public_key_ops.common.num_limbs; - assert_eq!(input.len(), digest_alg.output_len); - assert_eq!( - output.len(), - ops.public_key_ops.common.num_limbs * LIMB_BYTES - ); - - let expected = scalar_parse_big_endian_variable( - ops.public_key_ops.common, - limb::AllowZero::Yes, - untrusted::Input::from(&output), - ) - .unwrap(); - - let actual = digest_bytes_scalar(ops.scalar_ops, &input); - - assert_eq!(actual.limbs[..num_limbs], expected.limbs[..num_limbs]); - - Ok(()) - }, - ); - } -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ecdsa/ecdsa_digest_scalar_tests.txt temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ecdsa/ecdsa_digest_scalar_tests.txt --- temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ecdsa/ecdsa_digest_scalar_tests.txt 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ecdsa/ecdsa_digest_scalar_tests.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,82 +0,0 @@ -# Test vectors for the conversion of digest values to scalars. - -# Minimum Digest Values. - -Curve = P-256 -Digest = SHA256 -Input = 0000000000000000000000000000000000000000000000000000000000000000 -Output = 0000000000000000000000000000000000000000000000000000000000000000 - -Curve = P-256 -Digest = SHA384 -Input = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -Output = 0000000000000000000000000000000000000000000000000000000000000000 - -Curve = P-384 -Digest = SHA256 -Input = 0000000000000000000000000000000000000000000000000000000000000000 -Output = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - -Curve = P-384 -Digest = SHA384 -Input = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -Output = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - -# The truncated digest value is equal to n - 1 (not possible when digest is -# shorter than the curve's scalars). - -Curve = P-256 -Digest = SHA256 -Input = FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632550 -Output = FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632550 - -Curve = P-256 -Digest = SHA384 -Input = FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC63255000000000000000000000000000000000 -Output = FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632550 - -Curve = P-384 -Digest = SHA384 -Input = FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F4372DDF581A0DB248B0A77AECEC196ACCC52972 -Output = FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F4372DDF581A0DB248B0A77AECEC196ACCC52972 - -# The truncated digest value is equal to n (not possible when digest is shorter -# than the curve's scalars). - -Curve = P-256 -Digest = SHA256 -Input = FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551 -Output = 0000000000000000000000000000000000000000000000000000000000000000 - -Curve = P-256 -Digest = SHA384 -Input = FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC63255100000000000000000000000000000000 -Output = 0000000000000000000000000000000000000000000000000000000000000000 - -Curve = P-384 -Digest = SHA384 -Input = FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F4372DDF581A0DB248B0A77AECEC196ACCC52973 -Output = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - - -# Maximum digest values. - -Curve = P-256 -Digest = SHA256 -Input = FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -Output = 00000000FFFFFFFF00000000000000004319055258E8617B0C46353D039CDAAE - -Curve = P-256 -Digest = SHA384 -Input = FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -Output = 00000000FFFFFFFF00000000000000004319055258E8617B0C46353D039CDAAE - -Curve = P-384 -Digest = SHA256 -Input = FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -Output = 00000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - -Curve = P-384 -Digest = SHA384 -Input = FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -Output = 000000000000000000000000000000000000000000000000389CB27E0BC8D220A7E5F24DB74F58851313E695333AD68C diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ecdsa/ecdsa_sign_asn1_tests.txt temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ecdsa/ecdsa_sign_asn1_tests.txt --- temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ecdsa/ecdsa_sign_asn1_tests.txt 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ecdsa/ecdsa_sign_asn1_tests.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -# Tests from NIST CAVP 186-4 ECDSA2VS Test Vectors, Signature Generation Test -# http://csrc.nist.gov/groups/STM/cavp/documents/dss/186-3ecdsatestvectors.zip -# -# CAVS 11.2 -# "SigVer" information for "ecdsa_values" -# Curves/SHAs selected: P-224,SHA-224 P-224,SHA-256 P-224,SHA-384 P-224,SHA-512 P-256,SHA-224 P-256,SHA-256 P-256,SHA-384 P-256,SHA-512 P-384,SHA-224 P-384,SHA-256 P-384,SHA-384 P-384,SHA-512 P-521,SHA-224 P-521,SHA-256 P-521,SHA-384 P-521,SHA-512 K-233,SHA-224 K-233,SHA-256 K-233,SHA-384 K-233,SHA-512 K-283,SHA-224 K-283,SHA-256 K-283,SHA-384 K-283,SHA-512 K-409,SHA-224 K-409,SHA-256 K-409,SHA-384 K-409,SHA-512 K-571,SHA-224 K-571,SHA-256 K-571,SHA-384 K-571,SHA-512 B-233,SHA-224 B-233,SHA-256 B-233,SHA-384 B-233,SHA-512 B-283,SHA-224 B-283,SHA-256 B-283,SHA-384 B-283,SHA-512 B-409,SHA-224 B-409,SHA-256 B-409,SHA-384 B-409,SHA-512 BB-571,SHA-224 B-571,SHA-256 B-571,SHA-384 B-571,SHA-512 -# Generated on Tue Aug 16 15:27:42 2011 - -# [P-256,SHA-256] - -Curve = P-256 -Digest = SHA256 -Msg = 5905238877c77421f73e43ee3da6f2d9e2ccad5fc942dcec0cbd25482935faaf416983fe165b1a045ee2bcd2e6dca3bdf46c4310a7461f9a37960ca672d3feb5473e253605fb1ddfd28065b53cb5858a8ad28175bf9bd386a5e471ea7a65c17cc934a9d791e91491eb3754d03799790fe2d308d16146d5c9b0d0debd97d79ce8 -d = 519b423d715f8b581f4fa8ee59f4771a5b44c8130b4e3eacca54a56dda72b464 -Q = 041ccbe91c075fc7f4f033bfa248db8fccd3565de94bbfb12f3c59ff46c271bf83ce4014c68811f9a21a1fdb2c0e6113e06db7ca93b7404e78dc7ccd5ca89a4ca9 -k = 94a1bbb14b906a61a280f245f9e93c7f3b4a6247824f5d33b9670787642a68de -Sig = 3046022100f3ac8061b514795b8843e3d6629527ed2afd6b1f6a555a7acabb5e6f79c8c2ac0221008bf77819ca05a6b2786c76262bf7371cef97b218e96f175a3ccdda2acc058903 - diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ecdsa/ecdsa_sign_fixed_tests.txt temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ecdsa/ecdsa_sign_fixed_tests.txt --- temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ecdsa/ecdsa_sign_fixed_tests.txt 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ecdsa/ecdsa_sign_fixed_tests.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,251 +0,0 @@ -# Tests from NIST CAVP 186-4 ECDSA2VS Test Vectors, Signature Generation Test -# http://csrc.nist.gov/groups/STM/cavp/documents/dss/186-3ecdsatestvectors.zip -# -# CAVS 11.2 -# "SigVer" information for "ecdsa_values" -# Curves/SHAs selected: P-224,SHA-224 P-224,SHA-256 P-224,SHA-384 P-224,SHA-512 P-256,SHA-224 P-256,SHA-256 P-256,SHA-384 P-256,SHA-512 P-384,SHA-224 P-384,SHA-256 P-384,SHA-384 P-384,SHA-512 P-521,SHA-224 P-521,SHA-256 P-521,SHA-384 P-521,SHA-512 K-233,SHA-224 K-233,SHA-256 K-233,SHA-384 K-233,SHA-512 K-283,SHA-224 K-283,SHA-256 K-283,SHA-384 K-283,SHA-512 K-409,SHA-224 K-409,SHA-256 K-409,SHA-384 K-409,SHA-512 K-571,SHA-224 K-571,SHA-256 K-571,SHA-384 K-571,SHA-512 B-233,SHA-224 B-233,SHA-256 B-233,SHA-384 B-233,SHA-512 B-283,SHA-224 B-283,SHA-256 B-283,SHA-384 B-283,SHA-512 B-409,SHA-224 B-409,SHA-256 B-409,SHA-384 B-409,SHA-512 BB-571,SHA-224 B-571,SHA-256 B-571,SHA-384 B-571,SHA-512 -# Generated on Tue Aug 16 15:27:42 2011 - -# [P-256,SHA-256] - -Curve = P-256 -Digest = SHA256 -Msg = 5905238877c77421f73e43ee3da6f2d9e2ccad5fc942dcec0cbd25482935faaf416983fe165b1a045ee2bcd2e6dca3bdf46c4310a7461f9a37960ca672d3feb5473e253605fb1ddfd28065b53cb5858a8ad28175bf9bd386a5e471ea7a65c17cc934a9d791e91491eb3754d03799790fe2d308d16146d5c9b0d0debd97d79ce8 -d = 519b423d715f8b581f4fa8ee59f4771a5b44c8130b4e3eacca54a56dda72b464 -Q = 041ccbe91c075fc7f4f033bfa248db8fccd3565de94bbfb12f3c59ff46c271bf83ce4014c68811f9a21a1fdb2c0e6113e06db7ca93b7404e78dc7ccd5ca89a4ca9 -k = 94a1bbb14b906a61a280f245f9e93c7f3b4a6247824f5d33b9670787642a68de -Sig = f3ac8061b514795b8843e3d6629527ed2afd6b1f6a555a7acabb5e6f79c8c2ac8bf77819ca05a6b2786c76262bf7371cef97b218e96f175a3ccdda2acc058903 - -Curve = P-256 -Digest = SHA256 -Msg = c35e2f092553c55772926bdbe87c9796827d17024dbb9233a545366e2e5987dd344deb72df987144b8c6c43bc41b654b94cc856e16b96d7a821c8ec039b503e3d86728c494a967d83011a0e090b5d54cd47f4e366c0912bc808fbb2ea96efac88fb3ebec9342738e225f7c7c2b011ce375b56621a20642b4d36e060db4524af1 -d = 0f56db78ca460b055c500064824bed999a25aaf48ebb519ac201537b85479813 -Q = 04e266ddfdc12668db30d4ca3e8f7749432c416044f2d2b8c10bf3d4012aeffa8abfa86404a2e9ffe67d47c587ef7a97a7f456b863b4d02cfc6928973ab5b1cb39 -k = 6d3e71882c3b83b156bb14e0ab184aa9fb728068d3ae9fac421187ae0b2f34c6 -Sig = 976d3a4e9d23326dc0baa9fa560b7c4e53f42864f508483a6473b6a11079b2db1b766e9ceb71ba6c01dcd46e0af462cd4cfa652ae5017d4555b8eeefe36e1932 - -Curve = P-256 -Digest = SHA256 -Msg = 3c054e333a94259c36af09ab5b4ff9beb3492f8d5b4282d16801daccb29f70fe61a0b37ffef5c04cd1b70e85b1f549a1c4dc672985e50f43ea037efa9964f096b5f62f7ffdf8d6bfb2cc859558f5a393cb949dbd48f269343b5263dcdb9c556eca074f2e98e6d94c2c29a677afaf806edf79b15a3fcd46e7067b7669f83188ee -d = e283871239837e13b95f789e6e1af63bf61c918c992e62bca040d64cad1fc2ef -Q = 0474ccd8a62fba0e667c50929a53f78c21b8ff0c3c737b0b40b1750b2302b0bde829074e21f3a0ef88b9efdf10d06aa4c295cc1671f758ca0e4cd108803d0f2614 -k = ad5e887eb2b380b8d8280ad6e5ff8a60f4d26243e0124c2f31a297b5d0835de2 -Sig = 35fb60f5ca0f3ca08542fb3cc641c8263a2cab7a90ee6a5e1583fac2bb6f6bd1ee59d81bc9db1055cc0ed97b159d8784af04e98511d0a9a407b99bb292572e96 - -Curve = P-256 -Digest = SHA256 -Msg = 0989122410d522af64ceb07da2c865219046b4c3d9d99b01278c07ff63eaf1039cb787ae9e2dd46436cc0415f280c562bebb83a23e639e476a02ec8cff7ea06cd12c86dcc3adefbf1a9e9a9b6646c7599ec631b0da9a60debeb9b3e19324977f3b4f36892c8a38671c8e1cc8e50fcd50f9e51deaf98272f9266fc702e4e57c30 -d = a3d2d3b7596f6592ce98b4bfe10d41837f10027a90d7bb75349490018cf72d07 -Q = 04322f80371bf6e044bc49391d97c1714ab87f990b949bc178cb7c43b7c22d89e13c15d54a5cc6b9f09de8457e873eb3deb1fceb54b0b295da6050294fae7fd999 -k = 24fc90e1da13f17ef9fe84cc96b9471ed1aaac17e3a4bae33a115df4e5834f18 -Sig = d7c562370af617b581c84a2468cc8bd50bb1cbf322de41b7887ce07c0e5884cab46d9f2d8c4bf83546ff178f1d78937c008d64e8ecc5cbb825cb21d94d670d89 - -Curve = P-256 -Digest = SHA256 -Msg = dc66e39f9bbfd9865318531ffe9207f934fa615a5b285708a5e9c46b7775150e818d7f24d2a123df3672fff2094e3fd3df6fbe259e3989dd5edfcccbe7d45e26a775a5c4329a084f057c42c13f3248e3fd6f0c76678f890f513c32292dd306eaa84a59abe34b16cb5e38d0e885525d10336ca443e1682aa04a7af832b0eee4e7 -d = 53a0e8a8fe93db01e7ae94e1a9882a102ebd079b3a535827d583626c272d280d -Q = 041bcec4570e1ec2436596b8ded58f60c3b1ebc6a403bc5543040ba829630572448af62a4c683f096b28558320737bf83b9959a46ad2521004ef74cf85e67494e1 -k = 5d833e8d24cc7a402d7ee7ec852a3587cddeb48358cea71b0bedb8fabe84e0c4 -Sig = 18caaf7b663507a8bcd992b836dec9dc5703c080af5e51dfa3a9a7c38718260477c68928ac3b88d985fb43fb615fb7ff45c18ba5c81af796c613dfa98352d29c - -Curve = P-256 -Digest = SHA256 -Msg = 600974e7d8c5508e2c1aab0783ad0d7c4494ab2b4da265c2fe496421c4df238b0be25f25659157c8a225fb03953607f7df996acfd402f147e37aee2f1693e3bf1c35eab3ae360a2bd91d04622ea47f83d863d2dfecb618e8b8bdc39e17d15d672eee03bb4ce2cc5cf6b217e5faf3f336fdd87d972d3a8b8a593ba85955cc9d71 -d = 4af107e8e2194c830ffb712a65511bc9186a133007855b49ab4b3833aefc4a1d -Q = 04a32e50be3dae2c8ba3f5e4bdae14cf7645420d425ead94036c22dd6c4fc59e00d623bf641160c289d6742c6257ae6ba574446dd1d0e74db3aaa80900b78d4ae9 -k = e18f96f84dfa2fd3cdfaec9159d4c338cd54ad314134f0b31e20591fc238d0ab -Sig = 8524c5024e2d9a73bde8c72d9129f57873bbad0ed05215a372a84fdbc78f2e68d18c2caf3b1072f87064ec5e8953f51301cada03469c640244760328eb5a05cb - -Curve = P-256 -Digest = SHA256 -Msg = dfa6cb9b39adda6c74cc8b2a8b53a12c499ab9dee01b4123642b4f11af336a91a5c9ce0520eb2395a6190ecbf6169c4cba81941de8e76c9c908eb843b98ce95e0da29c5d4388040264e05e07030a577cc5d176387154eabae2af52a83e85c61c7c61da930c9b19e45d7e34c8516dc3c238fddd6e450a77455d534c48a152010b -d = 78dfaa09f1076850b3e206e477494cddcfb822aaa0128475053592c48ebaf4ab -Q = 048bcfe2a721ca6d753968f564ec4315be4857e28bef1908f61a366b1f03c974790f67576a30b8e20d4232d8530b52fb4c89cbc589ede291e499ddd15fe870ab96 -k = 295544dbb2da3da170741c9b2c6551d40af7ed4e891445f11a02b66a5c258a77 -Sig = c5a186d72df452015480f7f338970bfe825087f05c0088d95305f87aacc9b25484a58f9e9d9e735344b316b1aa1ab5185665b85147dc82d92e969d7bee31ca30 - -Curve = P-256 -Digest = SHA256 -Msg = 51d2547cbff92431174aa7fc7302139519d98071c755ff1c92e4694b58587ea560f72f32fc6dd4dee7d22bb7387381d0256e2862d0644cdf2c277c5d740fa089830eb52bf79d1e75b8596ecf0ea58a0b9df61e0c9754bfcd62efab6ea1bd216bf181c5593da79f10135a9bc6e164f1854bc8859734341aad237ba29a81a3fc8b -d = 80e692e3eb9fcd8c7d44e7de9f7a5952686407f90025a1d87e52c7096a62618a -Q = 04a88bc8430279c8c0400a77d751f26c0abc93e5de4ad9a4166357952fe041e7672d365a1eef25ead579cc9a069b6abc1b16b81c35f18785ce26a10ba6d1381185 -k = 7c80fd66d62cc076cef2d030c17c0a69c99611549cb32c4ff662475adbe84b22 -Sig = 9d0c6afb6df3bced455b459cc21387e14929392664bb8741a3693a1795ca6902d7f9ddd191f1f412869429209ee3814c75c72fa46a9cccf804a2f5cc0b7e739f - -Curve = P-256 -Digest = SHA256 -Msg = 558c2ac13026402bad4a0a83ebc9468e50f7ffab06d6f981e5db1d082098065bcff6f21a7a74558b1e8612914b8b5a0aa28ed5b574c36ac4ea5868432a62bb8ef0695d27c1e3ceaf75c7b251c65ddb268696f07c16d2767973d85beb443f211e6445e7fe5d46f0dce70d58a4cd9fe70688c035688ea8c6baec65a5fc7e2c93e8 -d = 5e666c0db0214c3b627a8e48541cc84a8b6fd15f300da4dff5d18aec6c55b881 -Q = 041bc487570f040dc94196c9befe8ab2b6de77208b1f38bdaae28f9645c4d2bc3aec81602abd8345e71867c8210313737865b8aa186851e1b48eaca140320f5d8f -k = 2e7625a48874d86c9e467f890aaa7cd6ebdf71c0102bfdcfa24565d6af3fdce9 -Sig = 2f9e2b4e9f747c657f705bffd124ee178bbc5391c86d056717b140c153570fd9f5413bfd85949da8d83de83ab0d19b2986613e224d1901d76919de23ccd03199 - -Curve = P-256 -Digest = SHA256 -Msg = 4d55c99ef6bd54621662c3d110c3cb627c03d6311393b264ab97b90a4b15214a5593ba2510a53d63fb34be251facb697c973e11b665cb7920f1684b0031b4dd370cb927ca7168b0bf8ad285e05e9e31e34bc24024739fdc10b78586f29eff94412034e3b606ed850ec2c1900e8e68151fc4aee5adebb066eb6da4eaa5681378e -d = f73f455271c877c4d5334627e37c278f68d143014b0a05aa62f308b2101c5308 -Q = 04b8188bd68701fc396dab53125d4d28ea33a91daf6d21485f4770f6ea8c565dde423f058810f277f8fe076f6db56e9285a1bf2c2a1dae145095edd9c04970bc4a -k = 62f8665fd6e26b3fa069e85281777a9b1f0dfd2c0b9f54a086d0c109ff9fd615 -Sig = 1cc628533d0004b2b20e7f4baad0b8bb5e0673db159bbccf92491aef61fc9620880e0bbf82a8cf818ed46ba03cf0fc6c898e36fca36cc7fdb1d2db7503634430 - -Curve = P-256 -Digest = SHA256 -Msg = f8248ad47d97c18c984f1f5c10950dc1404713c56b6ea397e01e6dd925e903b4fadfe2c9e877169e71ce3c7fe5ce70ee4255d9cdc26f6943bf48687874de64f6cf30a012512e787b88059bbf561162bdcc23a3742c835ac144cc14167b1bd6727e940540a9c99f3cbb41fb1dcb00d76dda04995847c657f4c19d303eb09eb48a -d = b20d705d9bd7c2b8dc60393a5357f632990e599a0975573ac67fd89b49187906 -Q = 0451f99d2d52d4a6e734484a018b7ca2f895c2929b6754a3a03224d07ae61166ce4737da963c6ef7247fb88d19f9b0c667cac7fe12837fdab88c66f10d3c14cad1 -k = 72b656f6b35b9ccbc712c9f1f3b1a14cbbebaec41c4bca8da18f492a062d6f6f -Sig = 9886ae46c1415c3bc959e82b760ad760aab66885a84e620aa339fdf102465c422bf3a80bc04faa35ebecc0f4864ac02d349f6f126e0f988501b8d3075409a26c - -Curve = P-256 -Digest = SHA256 -Msg = 3b6ee2425940b3d240d35b97b6dcd61ed3423d8e71a0ada35d47b322d17b35ea0472f35edd1d252f87b8b65ef4b716669fc9ac28b00d34a9d66ad118c9d94e7f46d0b4f6c2b2d339fd6bcd351241a387cc82609057048c12c4ec3d85c661975c45b300cb96930d89370a327c98b67defaa89497aa8ef994c77f1130f752f94a4 -d = d4234bebfbc821050341a37e1240efe5e33763cbbb2ef76a1c79e24724e5a5e7 -Q = 048fb287f0202ad57ae841aea35f29b2e1d53e196d0ddd9aec24813d64c0922fb71f6daff1aa2dd2d6d3741623eecb5e7b612997a1039aab2e5cf2de969cfea573 -k = d926fe10f1bfd9855610f4f5a3d666b1a149344057e35537373372ead8b1a778 -Sig = 490efd106be11fc365c7467eb89b8d39e15d65175356775deab211163c2504cb644300fc0da4d40fb8c6ead510d14f0bd4e1321a469e9c0a581464c7186b7aa7 - -Curve = P-256 -Digest = SHA256 -Msg = c5204b81ec0a4df5b7e9fda3dc245f98082ae7f4efe81998dcaa286bd4507ca840a53d21b01e904f55e38f78c3757d5a5a4a44b1d5d4e480be3afb5b394a5d2840af42b1b4083d40afbfe22d702f370d32dbfd392e128ea4724d66a3701da41ae2f03bb4d91bb946c7969404cb544f71eb7a49eb4c4ec55799bda1eb545143a7 -d = b58f5211dff440626bb56d0ad483193d606cf21f36d9830543327292f4d25d8c -Q = 0468229b48c2fe19d3db034e4c15077eb7471a66031f28a980821873915298ba76303e8ee3742a893f78b810991da697083dd8f11128c47651c27a56740a80c24c -k = e158bf4a2d19a99149d9cdb879294ccb7aaeae03d75ddd616ef8ae51a6dc1071 -Sig = e67a9717ccf96841489d6541f4f6adb12d17b59a6bef847b6183b8fcf16a32eb9ae6ba6d637706849a6a9fc388cf0232d85c26ea0d1fe7437adb48de58364333 - -Curve = P-256 -Digest = SHA256 -Msg = 72e81fe221fb402148d8b7ab03549f1180bcc03d41ca59d7653801f0ba853add1f6d29edd7f9abc621b2d548f8dbf8979bd16608d2d8fc3260b4ebc0dd42482481d548c7075711b5759649c41f439fad69954956c9326841ea6492956829f9e0dc789f73633b40f6ac77bcae6dfc7930cfe89e526d1684365c5b0be2437fdb01 -d = 54c066711cdb061eda07e5275f7e95a9962c6764b84f6f1f3ab5a588e0a2afb1 -Q = 040a7dbb8bf50cb605eb2268b081f26d6b08e012f952c4b70a5a1e6e7d46af98bbf26dd7d799930062480849962ccf5004edcfd307c044f4e8f667c9baa834eeae -k = 646fe933e96c3b8f9f507498e907fdd201f08478d0202c752a7c2cfebf4d061a -Sig = b53ce4da1aa7c0dc77a1896ab716b921499aed78df725b1504aba1597ba0c64bd7c246dc7ad0e67700c373edcfdd1c0a0495fc954549ad579df6ed1438840851 - -Curve = P-256 -Digest = SHA256 -Msg = 21188c3edd5de088dacc1076b9e1bcecd79de1003c2414c3866173054dc82dde85169baa77993adb20c269f60a5226111828578bcc7c29e6e8d2dae81806152c8ba0c6ada1986a1983ebeec1473a73a04795b6319d48662d40881c1723a706f516fe75300f92408aa1dc6ae4288d2046f23c1aa2e54b7fb6448a0da922bd7f34 -d = 34fa4682bf6cb5b16783adcd18f0e6879b92185f76d7c920409f904f522db4b1 -Q = 04105d22d9c626520faca13e7ced382dcbe93498315f00cc0ac39c4821d0d737376c47f3cbbfa97dfcebe16270b8c7d5d3a5900b888c42520d751e8faf3b401ef4 -k = a6f463ee72c9492bc792fe98163112837aebd07bab7a84aaed05be64db3086f4 -Sig = 542c40a18140a6266d6f0286e24e9a7bad7650e72ef0e2131e629c076d9626634f7f65305e24a6bbb5cff714ba8f5a2cee5bdc89ba8d75dcbf21966ce38eb66f - -# [P-384,SHA-384] - -Curve = P-384 -Digest = SHA384 -Msg = 6b45d88037392e1371d9fd1cd174e9c1838d11c3d6133dc17e65fa0c485dcca9f52d41b60161246039e42ec784d49400bffdb51459f5de654091301a09378f93464d52118b48d44b30d781eb1dbed09da11fb4c818dbd442d161aba4b9edc79f05e4b7e401651395b53bd8b5bd3f2aaa6a00877fa9b45cadb8e648550b4c6cbe -d = 201b432d8df14324182d6261db3e4b3f46a8284482d52e370da41e6cbdf45ec2952f5db7ccbce3bc29449f4fb080ac97 -Q = 04c2b47944fb5de342d03285880177ca5f7d0f2fcad7678cce4229d6e1932fcac11bfc3c3e97d942a3c56bf34123013dbf37257906a8223866eda0743c519616a76a758ae58aee81c5fd35fbf3a855b7754a36d4a0672df95d6c44a81cf7620c2d -k = dcedabf85978e090f733c6e16646fa34df9ded6e5ce28c6676a00f58a25283db8885e16ce5bf97f917c81e1f25c9c771 -Sig = 50835a9251bad008106177ef004b091a1e4235cd0da84fff54542b0ed755c1d6f251609d14ecf18f9e1ddfe69b946e320475f3d30c6463b646e8d3bf2455830314611cbde404be518b14464fdb195fdcc92eb222e61f426a4a592c00a6a89721 - -Curve = P-384 -Digest = SHA384 -Msg = d768f41e6e8ec2125d6cf5786d1ba96668ac6566c5cdbbe407f7f2051f3ad6b1acdbfe13edf0d0a86fa110f405406b69085219b5a234ebdb93153241f785d45811b3540d1c37424cc7194424787a51b79679266484c787fb1ded6d1a26b9567d5ea68f04be416caf3be9bd2cafa208fe2a9e234d3ae557c65d3fe6da4cb48da4 -d = 23d9f4ea6d87b7d6163d64256e3449255db14786401a51daa7847161bf56d494325ad2ac8ba928394e01061d882c3528 -Q = 045d42d6301c54a438f65970bae2a098cbc567e98840006e356221966c86d82e8eca515bca850eaa3cd41f175f03a0cbfd4aef5a0ceece95d382bd70ab5ce1cb77408bae42b51a08816d5e5e1d3da8c18fcc95564a752730b0aabea983ccea4e2e -k = 67ba379366049008593eac124f59ab017358892ee0c063d38f3758bb849fd25d867c3561563cac1532a323b228dc0890 -Sig = fb318f4cb1276282bb43f733a7fb7c567ce94f4d02924fc758635ab2d1107108bf159b85db080cdc3b30fbb5400016f3588e3d7af5da03eae255ecb1813100d95edc243476b724b22db8e85377660d7645ddc1c2c2ee4eaea8b683dbe22f86ca - -Curve = P-384 -Digest = SHA384 -Msg = 6af6652e92a17b7898e40b6776fabaf0d74cf88d8f0ebfa6088309cbe09fac472eeac2aa8ea96b8c12e993d14c93f8ef4e8b547afe7ae5e4f3973170b35deb3239898918c70c1056332c3f894cd643d2d9b93c2561aac069577bbab45803250a31cd62226cab94d8cba7261dce9fe88c210c212b54329d76a273522c8ba91ddf -d = b5f670e98d8befc46f6f51fb2997069550c2a52ebfb4e5e25dd905352d9ef89eed5c2ecd16521853aadb1b52b8c42ae6 -Q = 0444ffb2a3a95e12d87c72b5ea0a8a7cb89f56b3bd46342b2303608d7216301c21b5d2921d80b6628dc512ccb84e2fc278e4c1002f1828abaec768cadcb7cf42fbf93b1709ccae6df5b134c41fae2b9a188bfbe1eccff0bd348517d7227f2071a6 -k = 229e67638f712f57bea4c2b02279d5ccad1e7c9e201c77f6f01aeb81ea90e62b44b2d2107fd66d35e56608fff65e28e4 -Sig = b11db592e4ebc75b6472b879b1d8ce57452c615aef20f67a280f8bca9b11a30ad4ac9d69541258c7dd5d0b4ab8dd7d494eb51db8004e46d438359abf060a9444616cb46b4f99c9a05b53ba6df02e914c9c0b6cc3a9791d804d2e4c0984dab1cc - -Curve = P-384 -Digest = SHA384 -Msg = b96d74b2265dd895d94e25092fb9262dc4f2f7a328a3c0c3da134b2d0a4e2058ca994e3445c5ff4f812738e1b0c0f7a126486942a12e674a21f22d0886d68df2375f41685d694d487a718024933a7c4306f33f1a4267d469c530b0fed4e7dea520a19dd68bf0203cc87cad652260ed43b7b23f6ed140d3085875190191a0381a -d = de5975d8932533f092e76295ed6b23f10fc5fba48bfb82c6cc714826baf0126813247f8bd51d5738503654ab22459976 -Q = 04f1fabafc01fec7e96d982528d9ef3a2a18b7fe8ae0fa0673977341c7ae4ae8d8d3d67420343d013a984f5f61da29ae381a31cf902c46343d01b2ebb614bc789c313b5f91f9302ad9418e9c797563e2fa3d44500f47b4e26ad8fdec1a816d1dcf -k = fc5940e661542436f9265c34bce407eff6364bd471aa79b90c906d923e15c9ed96eea4e86f3238ea86161d13b7d9359d -Sig = c2fbdd6a56789024082173725d797ef9fd6accb6ae664b7260f9e83cb8ab2490428c8b9c52e153612295432fec4d59cd8056c5bb57f41f73082888b234fcda320a33250b5da012ba1fdb4924355ae679012d81d2c08fc0f8634c708a4833232f - -Curve = P-384 -Digest = SHA384 -Msg = 7cec7480a037ff40c232c1d2d6e8cd4c080bbeecdaf3886fccc9f129bb6d202c316eca76c8ad4e76079afe622f833a16f4907e817260c1fa68b10c7a151a37eb8c036b057ed4652c353db4b4a34b37c9a2b300fb5f5fcfb8aa8adae13db359160f70a9241546140e550af0073468683377e6771b6508327408c245d78911c2cc -d = 11e0d470dc31fab0f5722f87b74a6c8d7414115e58ceb38bfcdced367beac3adbf1fe9ba5a04f72e978b1eb54597eabc -Q = 041950166989164cbfd97968c7e8adb6fbca1873ebef811ea259eb48b7d584627f0e6d6c64defe23cbc95236505a252aa141ef424b5cb076d4e32accd9250ea75fcf4ffd81814040c050d58c0a29b06be11edf67c911b403e418b7277417e52906 -k = e56904028226eb04f8d071e3f9cefec91075a81ca0fa87b44cae148fe1ce9827b5d1910db2336d0eb9813ddba3e4d7b5 -Sig = c38ef30f55624e8935680c29f8c24824877cf48ffc0ef015e62de1068893353030d1193bf9d34237d7ce6ba92c98b0fe651b8c3d5c9d5b936d300802a06d82ad54f7b1ba4327b2f031c0c5b0cb215ad4354edc7f932d934e877dfa1cf51b13fe - -Curve = P-384 -Digest = SHA384 -Msg = 00ce978603229710345c9ad7c1c2dba3596b196528eea25bd822d43ca8f76a024e29217703dd0652c8a615284fc3edcc1c5ad1c8d5a8521c8e104c016a24e50c2e25066dcb56596f913b872767e3627aa3e55ec812e9fdac7c2f1beade83aef093e24c9c953982adf431a776880ae4583be158e11cdab1cbca3ad3a66900213d -d = 5c6bbf9fbcbb7b97c9535f57b431ed1ccae1945b7e8a4f1b032016b07810bd24a9e20055c0e9306650df59ef7e2cd8c2 -Q = 042e01c5b59e619e00b79060a1e8ef695472e23bf9a511fc3d5ed77a334a242557098e40972713732c5291c97adf9cf2cf563e3fe4ad807e803b9e961b08da4dde4cea8925649da0d93221ce4cdceabc6a1db7612180a8c6bef3579c65539b97e9 -k = 03d23f1277b949cb6380211ad9d338e6f76c3eedac95989b91d0243cfb734a54b19bca45a5d13d6a4b9f815d919eea77 -Sig = abab65308f0b79c4f3a9ff28dd490acb0c320434094cef93e75adfe17e5820dc1f77544cfaaacdc8cf9ac8b38e174bef11b783d879a6de054b316af7d56e526c3dce96c85289122e3ad927cfa77bfc50b4a96c97f85b1b8221be2df083ff58fb - -Curve = P-384 -Digest = SHA384 -Msg = 54a255c18692c6162a46add176a0ae8361dcb8948f092d8d7bac83e160431794d3b9812849bf1994bcdcfba56e8540c8a9ee5b93414548f2a653191b6bb28bda8dc70d45cc1b92a489f58a2d54f85766cb3c90de7dd88e690d8ebc9a79987eee1989df35af5e35522f83d85c48dda89863171c8b0bf4853ae28c2ac45c764416 -d = ffc7dedeff8343721f72046bc3c126626c177b0e48e247f44fd61f8469d4d5f0a74147fabaa334495cc1f986ebc5f0b1 -Q = 0451c78c979452edd53b563f63eb3e854a5b23e87f1b2103942b65f77d024471f75c8ce1cc0dfef83292b368112aa5126e313e6aaf09caa3ba30f13072b2134878f14a4a01ee86326cccbff3d079b4df097dc57985e8c8c834a10cb9d766169366 -k = c3de91dbe4f777698773da70dd610ef1a7efe4dc00d734399c7dd100728006a502822a5a7ff9129ffd8adf6c1fc1211a -Sig = f4f477855819ad8b1763f53691b76afbc4a31a638b1e08c293f9bcd55decf797f9913ca128d4b45b2e2ea3e82c6cf5657c26be29569ef95480a6d0c1af49dc10a51a0a8931345e48c0c39498bfb94d62962980b56143a7b41a2fddc8794c1b7f - -Curve = P-384 -Digest = SHA384 -Msg = 692a78f90d4f9d5aee5da536314a78d68c1feabbfe5d1ccea7f6059a66c4b310f8051c411c409ccf6e19a0cbd8b8e100c48317fe8c6d4f8a638b9551ce7ee178020f04f7da3001a0e6855225fb3c9b375e4ed964588a1a41a095f3f476c42d52ffd23ce1702c93b56d4425d3befcf75d0951b6fd5c05b05455bdaf205fe70ca2 -d = adca364ef144a21df64b163615e8349cf74ee9dbf728104215c532073a7f74e2f67385779f7f74ab344cc3c7da061cf6 -Q = 04ef948daae68242330a7358ef73f23b56c07e37126266db3fa6eea233a04a9b3e4915233dd6754427cd4b71b75854077d009453ef1828eaff9e17c856d4fc1895ab60051312c3e1db1e3766566438b2990cbf9945c2545619e3e0145bc6a79004 -k = a2da3fae2e6da3cf11b49861afb34fba357fea89f54b35ce5ed7434ae09103fe53e2be75b93fc579fedf919f6d5e407e -Sig = dda994b9c428b57e9f8bbaebba0d682e3aac6ed828e3a1e99a7fc4c804bff8df151137f539c7389d80e23d9f3ee497bfa0d6b10ceffd0e1b29cf784476f9173ba6ecd2cfc7929725f2d6e24e0db5a4721683640eaa2bbe151fb57560f9ce594b - -Curve = P-384 -Digest = SHA384 -Msg = 3b309bb912ab2a51681451ed18ad79e95d968abc35423a67036a02af92f575a0c89f1b668afe22c7037ad1199e757a8f06b281c33e9a40bab69c9874e0bb680b905d909b9dc24a9fe89bb3d7f7d47082b25093c59754f8c19d1f81f30334a8cdd50a3cb72f96d4b3c305e60a439a7e93aeb640dd3c8de37d63c60fb469c2d3ed -d = 39bea008ec8a217866dcbdb1b93da34d1d3e851d011df9ef44b7828b3453a54aa70f1df9932170804eacd207e4f7e91d -Q = 045709ec4305a9c3271c304face6c148142490b827a73a4c17affcfd01fffd7eaa65d2fdedfa2419fc64ed910823513fafb083cda1cf3be6371b6c06e729ea6299213428db57119347247ec1fcd44204386cc0bca3f452d9d864b39efbfc89d6b2 -k = 3c90cc7b6984056f570542a51cbe497ce4c11aeae8fc35e8fd6a0d9adeb650e8644f9d1d5e4341b5adc81e27f284c08f -Sig = d13646895afb1bfd1953551bb922809c95ad65d6abe94eb3719c899aa1f6dba6b01222c7f283900fe98628b7597b6ea64a9a38afda04c0a6b0058943b679bd02205b14d0f3d49b8f31aac289129780cdb1c555def8c3f9106b478729e0c7efaa - -Curve = P-384 -Digest = SHA384 -Msg = f072b72b8783289463da118613c43824d11441dba364c289de03ff5fab3a6f60e85957d8ff211f1cb62fa90216fb727106f692e5ae0844b11b710e5a12c69df3ed895b94e8769ecd15ff433762d6e8e94d8e6a72645b213b0231344e2c968056766c5dd6b5a5df41971858b85e99afbf859400f839b42cd129068efabeea4a26 -d = e849cf948b241362e3e20c458b52df044f2a72deb0f41c1bb0673e7c04cdd70811215059032b5ca3cc69c345dcce4cf7 -Q = 0406c037a0cbf43fdf335dff33de06d34348405353f9fdf2ce1361efba30fb204aea9dbd2e30da0a10fd2d876188371be6360d38f3940e34679204b98fbf70b8a4d97f25443e46d0807ab634ed5891ad864dd7703557aa933cd380e26eea662a43 -k = 32386b2593c85e877b70e5e5495936f65dc49553caef1aa6cc14d9cd370c442a0ccfab4c0da9ec311b67913b1b575a9d -Sig = 5886078d3495767e330c7507b7ca0fa07a50e59912a416d89f0ab1aa4e88153d6eaf00882d1b4aa64153153352d853b52cc10023bf1bf8ccfd14b06b82cc2114449a352389c8ff9f6f78cdc4e32bde69f3869da0e17f691b329682ae7a36e1aa - -Curve = P-384 -Digest = SHA384 -Msg = cf4945350be8133b575c4ad6c9585e0b83ff1ed17989b6cd6c71b41b5264e828b4e115995b1ae77528e7e9002ac1b5669064442645929f9d7dd70927cb93f95edeb73e8624f4bc897ec4c2c7581cb626916f29b2d6e6c2fba8c59a71e30754b459d81b912a12798182bcff4019c7bdfe929cc769bcc2414befe7d2906add4271 -d = d89607475d509ef23dc9f476eae4280c986de741b63560670fa2bd605f5049f1972792c0413a5b3b4b34e7a38b70b7ca -Q = 0449a1c631f31cf5c45b2676b1f130cbf9be683d0a50dffae0d147c1e9913ab1090c6529a84f47ddc7cf025921b771355a1e207eece62f2bcc6bdabc1113158145170be97469a2904eaaa93aad85b86a19719207f3e423051f5b9cbbe2754eefcb -k = 78613c570c8d33b7dd1bd1561d87e36282e8cf4843e7c344a2b2bb6a0da94756d670eeaffe434f7ae7c780f7cf05ca08 -Sig = 66f92b39aa3f4aeb9e2dc03ac3855406fa3ebbab0a6c88a78d7a03482f0c9868d7b78bc081ede0947c7f37bf193074bae5c64ed98d7f3701193f25dd237d59c91c0da6e26215e0889d82e6d3e416693f8d58843cf30ab10ab8d0edd9170b53ad - -Curve = P-384 -Digest = SHA384 -Msg = d9b5cf0b50416573ff3c63133275a18394dd4326be2041e8d97e6e4e3855a4a177e9d26dfd223fe8aa74564edb49bd72de19916fb6f001f44530d5c18e2c332bce1b7415df5927ece5f3824f34d174b963136b53aef1fb78fb0c06a201a40b2db38e4d8216fc1e392a798c8ab4b3a314496b7f1087804ebfa89bf96e9cdb80c0 -d = 083e7152734adf342520ae377087a223688de2899b10cfcb34a0b36bca500a4dfa530e2343e6a39da7ae1eb0862b4a0d -Q = 0470a0f16b6c61172659b027ed19b18fd8f57bd28dc0501f207bd6b0bb065b5671cf3dd1ed13d388dcf6ccc766597aa6044f845bf01c3c3f6126a7368c3454f51425801ee0b72e63fb6799b4420bfdebe3e37c7246db627cc82c09654979c700bb -k = 28096ababe29a075fbdf894709a20d0fdedb01ed3eeacb642a33a0da6aed726e13caf6cf206792ec359f0c9f9b567552 -Sig = ee2923f9b9999ea05b5e57f505bed5c6ba0420def42c6fa90eef7a6ef770786525546de27cdeb2f8586f8f29fb4ee67c50ef923fb217c4cf65a48b94412fda430fac685f0da7bd574557c6c50f5b22e0c8354d99f2c2f2c2691f252f93c7d84a - -Curve = P-384 -Digest = SHA384 -Msg = 9e4042d8438a405475b7dab1cd783eb6ce1d1bffa46ac9dfda622b23ac31057b922eced8e2ed7b3241efeafd7c9ab372bf16230f7134647f2956fb793989d3c885a5ae064e85ed971b64f5f561e7ddb79d49aa6ebe727c671c67879b794554c04de0e05d68264855745ef3c9567bd646d5c5f8728b797c181b6b6a876e167663 -d = 63578d416215aff2cc78f9b926d4c7740a77c142944e104aa7422b19a616898262d46a8a942d5e8d5db135ee8b09a368 -Q = 04cadbacef4406099316db2ce3206adc636c2bb0a835847ed7941efb02862472f3150338f13f4860d47f39b7e098f0a390752ad0f22c9c264336cde11bbc95d1816ed4d1b1500db6b8dce259a42832e613c31178c2c7995206a62e201ba108f570 -k = 7b69c5d5b4d05c9950dc94c27d58403b4c52c004b80a80418ad3a89aabc5d34f21926729e76afd280cc8ee88c9805a2a -Sig = db054addb6161ee49c6ce2e4d646d7670754747b6737ca8516e9d1e87859937c3ef9b1d2663e10d7e4bd00ec85b7a97afcc504e0f00ef29587e4bc22faada4db30e2cb1ac552680a65785ae87beb666c792513f2be7a3180fc544296841a0e27 - -Curve = P-384 -Digest = SHA384 -Msg = 0b14a7484a40b68a3ce1273b8a48b8fdb65ba900d98541c4bbd07b97e31bcc4c85545a03e9deab3c563f47a036ff60d0361684ba241b5aa68bb46f440da22181ee328a011de98eff34ba235ec10612b07bdfa6b3dc4ccc5e82d3a8d057e1862fef3def5a1804696f84699fda2ec4175a54a4d08bcb4f0406fdac4eddadf5e29b -d = ed4df19971658b74868800b3b81bc877807743b25c65740f1d6377542afe2c6427612c840ada31a8eb794718f37c7283 -Q = 0433093a0568757e8b58df5b72ea5fe5bf26e6f7aeb541b4c6a8c189c93721749bcaceccf2982a2f0702586a9f812fc66febe320d09e1f0662189d50b85a20403b821ac0d000afdbf66a0a33f304726c69e354d81c50b94ba3a5250efc31319cd1 -k = d9b4cd1bdfa83e608289634dbfcee643f07315baf743fc91922880b55a2feda3b38ddf6040d3ba10985cd1285fc690d5 -Sig = 009c74063e206a4259b53decff5445683a03f44fa67252b76bd3581081c714f882f882df915e97dbeab061fa8b3cc4e7d40e09d3468b46699948007e8f59845766dbf694b9c62066890dd055c0cb9a0caf0aa611fb9f466ad0bbb00dbe29d7eb - -Curve = P-384 -Digest = SHA384 -Msg = 0e646c6c3cc0f9fdedef934b7195fe3837836a9f6f263968af95ef84cd035750f3cdb649de745c874a6ef66b3dd83b66068b4335bc0a97184182e3965c722b3b1aee488c3620adb835a8140e199f4fc83a88b02881816b366a09316e25685217f9221157fc05b2d8d2bc855372183da7af3f0a14148a09def37a332f8eb40dc9 -d = e9c7e9a79618d6ff3274da1abd0ff3ed0ec1ae3b54c3a4fd8d68d98fb04326b7633fc637e0b195228d0edba6bb1468fb -Q = 04a39ac353ca787982c577aff1e8601ce192aa90fd0de4c0ed627f66a8b6f02ae51315543f72ffc1c48a7269b25e7c289a9064a507b66b340b6e0e0d5ffaa67dd20e6dafc0ea6a6faee1635177af256f9108a22e9edf736ab4ae8e96dc207b1fa9 -k = b094cb3a5c1440cfab9dc56d0ec2eff00f2110dea203654c70757254aa5912a7e73972e607459b1f4861e0b08a5cc763 -Sig = ee82c0f90501136eb0dc0e459ad17bf3be1b1c8b8d05c60068a9306a346326ff7344776a95f1f7e2e2cf9477130e735caf10b90f203af23b7500e070536e64629ba19245d6ef39aab57fcdb1b73c4c6bf7070c6263544633d3d358c12a178138 Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ecdsa/ecPublicKey_p256_pkcs8_v1_template.der and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ecdsa/ecPublicKey_p256_pkcs8_v1_template.der differ Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ecdsa/ecPublicKey_p384_pkcs8_v1_template.der and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ecdsa/ecPublicKey_p384_pkcs8_v1_template.der differ diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ecdsa/signing.rs temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ecdsa/signing.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ecdsa/signing.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ecdsa/signing.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,597 +0,0 @@ -// Copyright 2015-2016 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -//! ECDSA Signatures using the P-256 and P-384 curves. - -use super::digest_scalar::digest_scalar; -use crate::{ - arithmetic::montgomery::*, - cpu, digest, - ec::{ - self, - suite_b::{ops::*, private_key}, - }, - error, - io::der, - limb, pkcs8, rand, sealed, signature, -}; -/// An ECDSA signing algorithm. -pub struct EcdsaSigningAlgorithm { - curve: &'static ec::Curve, - private_scalar_ops: &'static PrivateScalarOps, - private_key_ops: &'static PrivateKeyOps, - digest_alg: &'static digest::Algorithm, - pkcs8_template: &'static pkcs8::Template, - format_rs: fn(ops: &'static ScalarOps, r: &Scalar, s: &Scalar, out: &mut [u8]) -> usize, - id: AlgorithmID, -} - -#[derive(Debug, Eq, PartialEq)] -enum AlgorithmID { - ECDSA_P256_SHA256_FIXED_SIGNING, - ECDSA_P384_SHA384_FIXED_SIGNING, - ECDSA_P256_SHA256_ASN1_SIGNING, - ECDSA_P384_SHA384_ASN1_SIGNING, -} - -derive_debug_via_id!(EcdsaSigningAlgorithm); - -impl PartialEq for EcdsaSigningAlgorithm { - fn eq(&self, other: &Self) -> bool { - self.id == other.id - } -} - -impl Eq for EcdsaSigningAlgorithm {} - -impl sealed::Sealed for EcdsaSigningAlgorithm {} - -/// An ECDSA key pair, used for signing. -pub struct EcdsaKeyPair { - d: Scalar, - nonce_key: NonceRandomKey, - alg: &'static EcdsaSigningAlgorithm, - public_key: PublicKey, -} - -derive_debug_via_field!(EcdsaKeyPair, stringify!(EcdsaKeyPair), public_key); - -impl EcdsaKeyPair { - /// Generates a new key pair and returns the key pair serialized as a - /// PKCS#8 document. - /// - /// The PKCS#8 document will be a v1 `OneAsymmetricKey` with the public key - /// included in the `ECPrivateKey` structure, as described in - /// [RFC 5958 Section 2] and [RFC 5915]. The `ECPrivateKey` structure will - /// not have a `parameters` field so the generated key is compatible with - /// PKCS#11. - /// - /// [RFC 5915]: https://tools.ietf.org/html/rfc5915 - /// [RFC 5958 Section 2]: https://tools.ietf.org/html/rfc5958#section-2 - pub fn generate_pkcs8( - alg: &'static EcdsaSigningAlgorithm, - rng: &dyn rand::SecureRandom, - ) -> Result { - let private_key = ec::Seed::generate(alg.curve, rng, cpu::features())?; - let public_key = private_key.compute_public_key()?; - Ok(pkcs8::wrap_key( - &alg.pkcs8_template, - private_key.bytes_less_safe(), - public_key.as_ref(), - )) - } - - /// Constructs an ECDSA key pair by parsing an unencrypted PKCS#8 v1 - /// id-ecPublicKey `ECPrivateKey` key. - /// - /// The input must be in PKCS#8 v1 format. It must contain the public key in - /// the `ECPrivateKey` structure; `from_pkcs8()` will verify that the public - /// key and the private key are consistent with each other. The algorithm - /// identifier must identify the curve by name; it must not use an - /// "explicit" encoding of the curve. The `parameters` field of the - /// `ECPrivateKey`, if present, must be the same named curve that is in the - /// algorithm identifier in the PKCS#8 header. - pub fn from_pkcs8( - alg: &'static EcdsaSigningAlgorithm, - pkcs8: &[u8], - ) -> Result { - let key_pair = ec::suite_b::key_pair_from_pkcs8( - alg.curve, - alg.pkcs8_template, - untrusted::Input::from(pkcs8), - cpu::features(), - )?; - let rng = rand::SystemRandom::new(); // TODO: make this a parameter. - Self::new(alg, key_pair, &rng) - } - - /// Constructs an ECDSA key pair from the private key and public key bytes - /// - /// The private key must encoded as a big-endian fixed-length integer. For - /// example, a P-256 private key must be 32 bytes prefixed with leading - /// zeros as needed. - /// - /// The public key is encoding in uncompressed form using the - /// Octet-String-to-Elliptic-Curve-Point algorithm in - /// [SEC 1: Elliptic Curve Cryptography, Version 2.0]. - /// - /// This is intended for use by code that deserializes key pairs. It is - /// recommended to use `EcdsaKeyPair::from_pkcs8()` (with a PKCS#8-encoded - /// key) instead. - /// - /// [SEC 1: Elliptic Curve Cryptography, Version 2.0]: - /// http://www.secg.org/sec1-v2.pdf - pub fn from_private_key_and_public_key( - alg: &'static EcdsaSigningAlgorithm, - private_key: &[u8], - public_key: &[u8], - ) -> Result { - let key_pair = ec::suite_b::key_pair_from_bytes( - alg.curve, - untrusted::Input::from(private_key), - untrusted::Input::from(public_key), - cpu::features(), - )?; - let rng = rand::SystemRandom::new(); // TODO: make this a parameter. - Self::new(alg, key_pair, &rng) - } - - fn new( - alg: &'static EcdsaSigningAlgorithm, - key_pair: ec::KeyPair, - rng: &dyn rand::SecureRandom, - ) -> Result { - let (seed, public_key) = key_pair.split(); - let d = private_key::private_key_as_scalar(alg.private_key_ops, &seed); - let d = alg - .private_scalar_ops - .scalar_ops - .scalar_product(&d, &alg.private_scalar_ops.oneRR_mod_n); - - let nonce_key = NonceRandomKey::new(alg, &seed, rng)?; - Ok(Self { - d, - nonce_key, - alg, - public_key: PublicKey(public_key), - }) - } - - /// Deprecated. Returns the signature of the `message` using a random nonce - /// generated by `rng`. - pub fn sign( - &self, - rng: &dyn rand::SecureRandom, - message: &[u8], - ) -> Result { - // Step 4 (out of order). - let h = digest::digest(self.alg.digest_alg, message); - - // Incorporate `h` into the nonce to hedge against faulty RNGs. (This - // is not an approved random number generator that is mandated in - // the spec.) - let nonce_rng = NonceRandom { - key: &self.nonce_key, - message_digest: &h, - rng, - }; - - self.sign_digest(h, &nonce_rng) - } - - #[cfg(test)] - fn sign_with_fixed_nonce_during_test( - &self, - rng: &dyn rand::SecureRandom, - message: &[u8], - ) -> Result { - // Step 4 (out of order). - let h = digest::digest(self.alg.digest_alg, message); - - self.sign_digest(h, rng) - } - - /// Returns the signature of message digest `h` using a "random" nonce - /// generated by `rng`. - fn sign_digest( - &self, - h: digest::Digest, - rng: &dyn rand::SecureRandom, - ) -> Result { - // NSA Suite B Implementer's Guide to ECDSA Section 3.4.1: ECDSA - // Signature Generation. - - // NSA Guide Prerequisites: - // - // Prior to generating an ECDSA signature, the signatory shall - // obtain: - // - // 1. an authentic copy of the domain parameters, - // 2. a digital signature key pair (d,Q), either generated by a - // method from Appendix A.1, or obtained from a trusted third - // party, - // 3. assurance of the validity of the public key Q (see Appendix - // A.3), and - // 4. assurance that he/she/it actually possesses the associated - // private key d (see [SP800-89] Section 6). - // - // The domain parameters are hard-coded into the source code. - // `EcdsaKeyPair::generate_pkcs8()` can be used to meet the second - // requirement; otherwise, it is up to the user to ensure the key pair - // was obtained from a trusted private key. The constructors for - // `EcdsaKeyPair` ensure that #3 and #4 are met subject to the caveats - // in SP800-89 Section 6. - - let ops = self.alg.private_scalar_ops; - let scalar_ops = ops.scalar_ops; - let cops = scalar_ops.common; - let private_key_ops = self.alg.private_key_ops; - - for _ in 0..100 { - // XXX: iteration conut? - // Step 1. - let k = private_key::random_scalar(self.alg.private_key_ops, rng)?; - let k_inv = scalar_ops.scalar_inv_to_mont(&k); - - // Step 2. - let r = private_key_ops.point_mul_base(&k); - - // Step 3. - let r = { - let (x, _) = private_key::affine_from_jacobian(private_key_ops, &r)?; - let x = cops.elem_unencoded(&x); - elem_reduced_to_scalar(cops, &x) - }; - if cops.is_zero(&r) { - continue; - } - - // Step 4 is done by the caller. - - // Step 5. - let e = digest_scalar(scalar_ops, h); - - // Step 6. - let s = { - let dr = scalar_ops.scalar_product(&self.d, &r); - let e_plus_dr = scalar_sum(cops, &e, &dr); - scalar_ops.scalar_product(&k_inv, &e_plus_dr) - }; - if cops.is_zero(&s) { - continue; - } - - // Step 7 with encoding. - return Ok(signature::Signature::new(|sig_bytes| { - (self.alg.format_rs)(scalar_ops, &r, &s, sig_bytes) - })); - } - - Err(error::Unspecified) - } -} - -/// Generates an ECDSA nonce in a way that attempts to protect against a faulty -/// `SecureRandom`. -struct NonceRandom<'a> { - key: &'a NonceRandomKey, - message_digest: &'a digest::Digest, - rng: &'a dyn rand::SecureRandom, -} - -impl core::fmt::Debug for NonceRandom<'_> { - fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { - f.debug_struct("NonceRandom").finish() - } -} - -impl rand::sealed::SecureRandom for NonceRandom<'_> { - fn fill_impl(&self, dest: &mut [u8]) -> Result<(), error::Unspecified> { - // Use the same digest algorithm that will be used to digest the - // message. The digest algorithm's output is exactly the right size; - // this is checked below. - // - // XXX(perf): The single iteration will require two digest block - // operations because the amount of data digested is larger than one - // block. - let digest_alg = self.key.0.algorithm(); - let mut ctx = digest::Context::new(digest_alg); - - // Digest the randomized digest of the private key. - let key = self.key.0.as_ref(); - ctx.update(key); - - // The random value is digested between the key and the message so that - // the key and the message are not directly digested in the same digest - // block. - assert!(key.len() <= digest_alg.block_len / 2); - { - let mut rand = [0u8; digest::MAX_BLOCK_LEN]; - let rand = &mut rand[..digest_alg.block_len - key.len()]; - assert!(rand.len() >= dest.len()); - self.rng.fill(rand)?; - ctx.update(rand); - } - - ctx.update(self.message_digest.as_ref()); - - let nonce = ctx.finish(); - - // `copy_from_slice()` panics if the lengths differ, so we don't have - // to separately assert that the lengths are the same. - dest.copy_from_slice(nonce.as_ref()); - - Ok(()) - } -} - -impl<'a> sealed::Sealed for NonceRandom<'a> {} - -struct NonceRandomKey(digest::Digest); - -impl NonceRandomKey { - fn new( - alg: &EcdsaSigningAlgorithm, - seed: &ec::Seed, - rng: &dyn rand::SecureRandom, - ) -> Result { - let mut rand = [0; digest::MAX_OUTPUT_LEN]; - let rand = &mut rand[0..alg.curve.elem_scalar_seed_len]; - - // XXX: `KeyRejected` isn't the right way to model failure of the RNG, - // but to fix that we'd need to break the API by changing the result type. - // TODO: Fix the API in the next breaking release. - rng.fill(rand) - .map_err(|error::Unspecified| error::KeyRejected::rng_failed())?; - - let mut ctx = digest::Context::new(alg.digest_alg); - ctx.update(rand); - ctx.update(seed.bytes_less_safe()); - Ok(NonceRandomKey(ctx.finish())) - } -} - -impl signature::KeyPair for EcdsaKeyPair { - type PublicKey = PublicKey; - - fn public_key(&self) -> &Self::PublicKey { - &self.public_key - } -} - -#[derive(Clone, Copy)] -pub struct PublicKey(ec::PublicKey); - -derive_debug_self_as_ref_hex_bytes!(PublicKey); - -impl AsRef<[u8]> for PublicKey { - fn as_ref(&self) -> &[u8] { - self.0.as_ref() - } -} - -fn format_rs_fixed(ops: &'static ScalarOps, r: &Scalar, s: &Scalar, out: &mut [u8]) -> usize { - let scalar_len = ops.scalar_bytes_len(); - - let (r_out, rest) = out.split_at_mut(scalar_len); - limb::big_endian_from_limbs(&r.limbs[..ops.common.num_limbs], r_out); - - let (s_out, _) = rest.split_at_mut(scalar_len); - limb::big_endian_from_limbs(&s.limbs[..ops.common.num_limbs], s_out); - - 2 * scalar_len -} - -fn format_rs_asn1(ops: &'static ScalarOps, r: &Scalar, s: &Scalar, out: &mut [u8]) -> usize { - // This assumes `a` is not zero since neither `r` or `s` is allowed to be - // zero. - fn format_integer_tlv(ops: &ScalarOps, a: &Scalar, out: &mut [u8]) -> usize { - let mut fixed = [0u8; ec::SCALAR_MAX_BYTES + 1]; - let fixed = &mut fixed[..(ops.scalar_bytes_len() + 1)]; - limb::big_endian_from_limbs(&a.limbs[..ops.common.num_limbs], &mut fixed[1..]); - - // Since `a_fixed_out` is an extra byte long, it is guaranteed to start - // with a zero. - debug_assert_eq!(fixed[0], 0); - - // There must be at least one non-zero byte since `a` isn't zero. - let first_index = fixed.iter().position(|b| *b != 0).unwrap(); - - // If the first byte has its high bit set, it needs to be prefixed with 0x00. - let first_index = if fixed[first_index] & 0x80 != 0 { - first_index - 1 - } else { - first_index - }; - let value = &fixed[first_index..]; - - out[0] = der::Tag::Integer as u8; - - // Lengths less than 128 are encoded in one byte. - assert!(value.len() < 128); - out[1] = value.len() as u8; - - out[2..][..value.len()].copy_from_slice(&value); - - 2 + value.len() - } - - out[0] = der::Tag::Sequence as u8; - let r_tlv_len = format_integer_tlv(ops, r, &mut out[2..]); - let s_tlv_len = format_integer_tlv(ops, s, &mut out[2..][r_tlv_len..]); - - // Lengths less than 128 are encoded in one byte. - let value_len = r_tlv_len + s_tlv_len; - assert!(value_len < 128); - out[1] = value_len as u8; - - 2 + value_len -} - -/// Signing of fixed-length (PKCS#11 style) ECDSA signatures using the -/// P-256 curve and SHA-256. -/// -/// See "`ECDSA_*_FIXED` Details" in `ring::signature`'s module-level -/// documentation for more details. -pub static ECDSA_P256_SHA256_FIXED_SIGNING: EcdsaSigningAlgorithm = EcdsaSigningAlgorithm { - curve: &ec::suite_b::curve::P256, - private_scalar_ops: &p256::PRIVATE_SCALAR_OPS, - private_key_ops: &p256::PRIVATE_KEY_OPS, - digest_alg: &digest::SHA256, - pkcs8_template: &EC_PUBLIC_KEY_P256_PKCS8_V1_TEMPLATE, - format_rs: format_rs_fixed, - id: AlgorithmID::ECDSA_P256_SHA256_FIXED_SIGNING, -}; - -/// Signing of fixed-length (PKCS#11 style) ECDSA signatures using the -/// P-384 curve and SHA-384. -/// -/// See "`ECDSA_*_FIXED` Details" in `ring::signature`'s module-level -/// documentation for more details. -pub static ECDSA_P384_SHA384_FIXED_SIGNING: EcdsaSigningAlgorithm = EcdsaSigningAlgorithm { - curve: &ec::suite_b::curve::P384, - private_scalar_ops: &p384::PRIVATE_SCALAR_OPS, - private_key_ops: &p384::PRIVATE_KEY_OPS, - digest_alg: &digest::SHA384, - pkcs8_template: &EC_PUBLIC_KEY_P384_PKCS8_V1_TEMPLATE, - format_rs: format_rs_fixed, - id: AlgorithmID::ECDSA_P384_SHA384_FIXED_SIGNING, -}; - -/// Signing of ASN.1 DER-encoded ECDSA signatures using the P-256 curve and -/// SHA-256. -/// -/// See "`ECDSA_*_ASN1` Details" in `ring::signature`'s module-level -/// documentation for more details. -pub static ECDSA_P256_SHA256_ASN1_SIGNING: EcdsaSigningAlgorithm = EcdsaSigningAlgorithm { - curve: &ec::suite_b::curve::P256, - private_scalar_ops: &p256::PRIVATE_SCALAR_OPS, - private_key_ops: &p256::PRIVATE_KEY_OPS, - digest_alg: &digest::SHA256, - pkcs8_template: &EC_PUBLIC_KEY_P256_PKCS8_V1_TEMPLATE, - format_rs: format_rs_asn1, - id: AlgorithmID::ECDSA_P256_SHA256_ASN1_SIGNING, -}; - -/// Signing of ASN.1 DER-encoded ECDSA signatures using the P-384 curve and -/// SHA-384. -/// -/// See "`ECDSA_*_ASN1` Details" in `ring::signature`'s module-level -/// documentation for more details. -pub static ECDSA_P384_SHA384_ASN1_SIGNING: EcdsaSigningAlgorithm = EcdsaSigningAlgorithm { - curve: &ec::suite_b::curve::P384, - private_scalar_ops: &p384::PRIVATE_SCALAR_OPS, - private_key_ops: &p384::PRIVATE_KEY_OPS, - digest_alg: &digest::SHA384, - pkcs8_template: &EC_PUBLIC_KEY_P384_PKCS8_V1_TEMPLATE, - format_rs: format_rs_asn1, - id: AlgorithmID::ECDSA_P384_SHA384_ASN1_SIGNING, -}; - -static EC_PUBLIC_KEY_P256_PKCS8_V1_TEMPLATE: pkcs8::Template = pkcs8::Template { - bytes: include_bytes!("ecPublicKey_p256_pkcs8_v1_template.der"), - alg_id_range: core::ops::Range { start: 8, end: 27 }, - curve_id_index: 9, - private_key_index: 0x24, -}; - -static EC_PUBLIC_KEY_P384_PKCS8_V1_TEMPLATE: pkcs8::Template = pkcs8::Template { - bytes: include_bytes!("ecPublicKey_p384_pkcs8_v1_template.der"), - alg_id_range: core::ops::Range { start: 8, end: 24 }, - curve_id_index: 9, - private_key_index: 0x23, -}; - -#[cfg(test)] -mod tests { - use crate::{signature, test}; - - #[test] - fn signature_ecdsa_sign_fixed_test() { - test::run( - test_file!("ecdsa_sign_fixed_tests.txt"), - |section, test_case| { - assert_eq!(section, ""); - - let curve_name = test_case.consume_string("Curve"); - let digest_name = test_case.consume_string("Digest"); - let msg = test_case.consume_bytes("Msg"); - let d = test_case.consume_bytes("d"); - let q = test_case.consume_bytes("Q"); - let k = test_case.consume_bytes("k"); - - let expected_result = test_case.consume_bytes("Sig"); - - let alg = match (curve_name.as_str(), digest_name.as_str()) { - ("P-256", "SHA256") => &signature::ECDSA_P256_SHA256_FIXED_SIGNING, - ("P-384", "SHA384") => &signature::ECDSA_P384_SHA384_FIXED_SIGNING, - _ => { - panic!("Unsupported curve+digest: {}+{}", curve_name, digest_name); - } - }; - - let private_key = - signature::EcdsaKeyPair::from_private_key_and_public_key(alg, &d, &q).unwrap(); - let rng = test::rand::FixedSliceRandom { bytes: &k }; - - let actual_result = private_key - .sign_with_fixed_nonce_during_test(&rng, &msg) - .unwrap(); - - assert_eq!(actual_result.as_ref(), &expected_result[..]); - - Ok(()) - }, - ); - } - - #[test] - fn signature_ecdsa_sign_asn1_test() { - test::run( - test_file!("ecdsa_sign_asn1_tests.txt"), - |section, test_case| { - assert_eq!(section, ""); - - let curve_name = test_case.consume_string("Curve"); - let digest_name = test_case.consume_string("Digest"); - let msg = test_case.consume_bytes("Msg"); - let d = test_case.consume_bytes("d"); - let q = test_case.consume_bytes("Q"); - let k = test_case.consume_bytes("k"); - - let expected_result = test_case.consume_bytes("Sig"); - - let alg = match (curve_name.as_str(), digest_name.as_str()) { - ("P-256", "SHA256") => &signature::ECDSA_P256_SHA256_ASN1_SIGNING, - ("P-384", "SHA384") => &signature::ECDSA_P384_SHA384_ASN1_SIGNING, - _ => { - panic!("Unsupported curve+digest: {}+{}", curve_name, digest_name); - } - }; - - let private_key = - signature::EcdsaKeyPair::from_private_key_and_public_key(alg, &d, &q).unwrap(); - let rng = test::rand::FixedSliceRandom { bytes: &k }; - - let actual_result = private_key - .sign_with_fixed_nonce_during_test(&rng, &msg) - .unwrap(); - - assert_eq!(actual_result.as_ref(), &expected_result[..]); - - Ok(()) - }, - ); - } -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ecdsa/verification.rs temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ecdsa/verification.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ecdsa/verification.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ecdsa/verification.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,344 +0,0 @@ -// Copyright 2015-2016 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -//! ECDSA Signatures using the P-256 and P-384 curves. - -use super::digest_scalar::digest_scalar; -use crate::{ - arithmetic::montgomery::*, - digest, - ec::suite_b::{ops::*, public_key::*, verify_jacobian_point_is_on_the_curve}, - error, - io::der, - limb, sealed, signature, -}; - -/// An ECDSA verification algorithm. -pub struct EcdsaVerificationAlgorithm { - ops: &'static PublicScalarOps, - digest_alg: &'static digest::Algorithm, - split_rs: - for<'a> fn( - ops: &'static ScalarOps, - input: &mut untrusted::Reader<'a>, - ) - -> Result<(untrusted::Input<'a>, untrusted::Input<'a>), error::Unspecified>, - id: AlgorithmID, -} - -#[derive(Debug)] -enum AlgorithmID { - ECDSA_P256_SHA256_ASN1, - ECDSA_P256_SHA256_FIXED, - ECDSA_P256_SHA384_ASN1, - ECDSA_P384_SHA256_ASN1, - ECDSA_P384_SHA384_ASN1, - ECDSA_P384_SHA384_FIXED, -} - -derive_debug_via_id!(EcdsaVerificationAlgorithm); - -impl signature::VerificationAlgorithm for EcdsaVerificationAlgorithm { - fn verify( - &self, - public_key: untrusted::Input, - msg: untrusted::Input, - signature: untrusted::Input, - ) -> Result<(), error::Unspecified> { - let e = { - // NSA Guide Step 2: "Use the selected hash function to compute H = - // Hash(M)." - let h = digest::digest(self.digest_alg, msg.as_slice_less_safe()); - - // NSA Guide Step 3: "Convert the bit string H to an integer e as - // described in Appendix B.2." - digest_scalar(self.ops.scalar_ops, h) - }; - - self.verify_digest(public_key, e, signature) - } -} - -impl EcdsaVerificationAlgorithm { - /// This is intentionally not public. - fn verify_digest( - &self, - public_key: untrusted::Input, - e: Scalar, - signature: untrusted::Input, - ) -> Result<(), error::Unspecified> { - // NSA Suite B Implementer's Guide to ECDSA Section 3.4.2. - - let public_key_ops = self.ops.public_key_ops; - let scalar_ops = self.ops.scalar_ops; - - // NSA Guide Prerequisites: - // - // Prior to accepting a verified digital signature as valid the - // verifier shall have: - // - // 1. assurance of the signatory’s claimed identity, - // 2. an authentic copy of the domain parameters, (q, FR, a, b, SEED, - // G, n, h), - // 3. assurance of the validity of the public key, and - // 4. assurance that the claimed signatory actually possessed the - // private key that was used to generate the digital signature at - // the time that the signature was generated. - // - // Prerequisites #1 and #4 are outside the scope of what this function - // can do. Prerequisite #2 is handled implicitly as the domain - // parameters are hard-coded into the source. Prerequisite #3 is - // handled by `parse_uncompressed_point`. - let peer_pub_key = parse_uncompressed_point(public_key_ops, public_key)?; - - let (r, s) = signature.read_all(error::Unspecified, |input| { - (self.split_rs)(scalar_ops, input) - })?; - - // NSA Guide Step 1: "If r and s are not both integers in the interval - // [1, n − 1], output INVALID." - let r = scalar_parse_big_endian_variable(public_key_ops.common, limb::AllowZero::No, r)?; - let s = scalar_parse_big_endian_variable(public_key_ops.common, limb::AllowZero::No, s)?; - - // NSA Guide Step 4: "Compute w = s**−1 mod n, using the routine in - // Appendix B.1." - let w = scalar_ops.scalar_inv_to_mont(&s); - - // NSA Guide Step 5: "Compute u1 = (e * w) mod n, and compute - // u2 = (r * w) mod n." - let u1 = scalar_ops.scalar_product(&e, &w); - let u2 = scalar_ops.scalar_product(&r, &w); - - // NSA Guide Step 6: "Compute the elliptic curve point - // R = (xR, yR) = u1*G + u2*Q, using EC scalar multiplication and EC - // addition. If R is equal to the point at infinity, output INVALID." - let product = twin_mul(self.ops.private_key_ops, &u1, &u2, &peer_pub_key); - - // Verify that the point we computed is on the curve; see - // `verify_affine_point_is_on_the_curve_scaled` for details on why. It - // would be more secure to do the check on the affine coordinates if we - // were going to convert to affine form (again, see - // `verify_affine_point_is_on_the_curve_scaled` for details on why). - // But, we're going to avoid converting to affine for performance - // reasons, so we do the verification using the Jacobian coordinates. - let z2 = verify_jacobian_point_is_on_the_curve(public_key_ops.common, &product)?; - - // NSA Guide Step 7: "Compute v = xR mod n." - // NSA Guide Step 8: "Compare v and r0. If v = r0, output VALID; - // otherwise, output INVALID." - // - // Instead, we use Greg Maxwell's trick to avoid the inversion mod `q` - // that would be necessary to compute the affine X coordinate. - let x = public_key_ops.common.point_x(&product); - fn sig_r_equals_x( - ops: &PublicScalarOps, - r: &Elem, - x: &Elem, - z2: &Elem, - ) -> bool { - let cops = ops.public_key_ops.common; - let r_jacobian = cops.elem_product(z2, r); - let x = cops.elem_unencoded(x); - ops.elem_equals(&r_jacobian, &x) - } - let r = self.ops.scalar_as_elem(&r); - if sig_r_equals_x(self.ops, &r, &x, &z2) { - return Ok(()); - } - if self.ops.elem_less_than(&r, &self.ops.q_minus_n) { - let r_plus_n = self.ops.elem_sum(&r, &public_key_ops.common.n); - if sig_r_equals_x(self.ops, &r_plus_n, &x, &z2) { - return Ok(()); - } - } - - Err(error::Unspecified) - } -} - -impl sealed::Sealed for EcdsaVerificationAlgorithm {} - -fn split_rs_fixed<'a>( - ops: &'static ScalarOps, - input: &mut untrusted::Reader<'a>, -) -> Result<(untrusted::Input<'a>, untrusted::Input<'a>), error::Unspecified> { - let scalar_len = ops.scalar_bytes_len(); - let r = input.read_bytes(scalar_len)?; - let s = input.read_bytes(scalar_len)?; - Ok((r, s)) -} - -fn split_rs_asn1<'a>( - _ops: &'static ScalarOps, - input: &mut untrusted::Reader<'a>, -) -> Result<(untrusted::Input<'a>, untrusted::Input<'a>), error::Unspecified> { - der::nested(input, der::Tag::Sequence, error::Unspecified, |input| { - let r = der::positive_integer(input)?.big_endian_without_leading_zero_as_input(); - let s = der::positive_integer(input)?.big_endian_without_leading_zero_as_input(); - Ok((r, s)) - }) -} - -fn twin_mul( - ops: &PrivateKeyOps, - g_scalar: &Scalar, - p_scalar: &Scalar, - p_xy: &(Elem, Elem), -) -> Point { - // XXX: Inefficient. TODO: implement interleaved wNAF multiplication. - let scaled_g = ops.point_mul_base(g_scalar); - let scaled_p = ops.point_mul(p_scalar, p_xy); - ops.common.point_sum(&scaled_g, &scaled_p) -} - -/// Verification of fixed-length (PKCS#11 style) ECDSA signatures using the -/// P-256 curve and SHA-256. -/// -/// See "`ECDSA_*_FIXED` Details" in `ring::signature`'s module-level -/// documentation for more details. -pub static ECDSA_P256_SHA256_FIXED: EcdsaVerificationAlgorithm = EcdsaVerificationAlgorithm { - ops: &p256::PUBLIC_SCALAR_OPS, - digest_alg: &digest::SHA256, - split_rs: split_rs_fixed, - id: AlgorithmID::ECDSA_P256_SHA256_FIXED, -}; - -/// Verification of fixed-length (PKCS#11 style) ECDSA signatures using the -/// P-384 curve and SHA-384. -/// -/// See "`ECDSA_*_FIXED` Details" in `ring::signature`'s module-level -/// documentation for more details. -pub static ECDSA_P384_SHA384_FIXED: EcdsaVerificationAlgorithm = EcdsaVerificationAlgorithm { - ops: &p384::PUBLIC_SCALAR_OPS, - digest_alg: &digest::SHA384, - split_rs: split_rs_fixed, - id: AlgorithmID::ECDSA_P384_SHA384_FIXED, -}; - -/// Verification of ASN.1 DER-encoded ECDSA signatures using the P-256 curve -/// and SHA-256. -/// -/// See "`ECDSA_*_ASN1` Details" in `ring::signature`'s module-level -/// documentation for more details. -pub static ECDSA_P256_SHA256_ASN1: EcdsaVerificationAlgorithm = EcdsaVerificationAlgorithm { - ops: &p256::PUBLIC_SCALAR_OPS, - digest_alg: &digest::SHA256, - split_rs: split_rs_asn1, - id: AlgorithmID::ECDSA_P256_SHA256_ASN1, -}; - -/// *Not recommended*. Verification of ASN.1 DER-encoded ECDSA signatures using -/// the P-256 curve and SHA-384. -/// -/// In most situations, P-256 should be used only with SHA-256 and P-384 -/// should be used only with SHA-384. However, in some cases, particularly TLS -/// on the web, it is necessary to support P-256 with SHA-384 for compatibility -/// with widely-deployed implementations that do not follow these guidelines. -/// -/// See "`ECDSA_*_ASN1` Details" in `ring::signature`'s module-level -/// documentation for more details. -pub static ECDSA_P256_SHA384_ASN1: EcdsaVerificationAlgorithm = EcdsaVerificationAlgorithm { - ops: &p256::PUBLIC_SCALAR_OPS, - digest_alg: &digest::SHA384, - split_rs: split_rs_asn1, - id: AlgorithmID::ECDSA_P256_SHA384_ASN1, -}; - -/// *Not recommended*. Verification of ASN.1 DER-encoded ECDSA signatures using -/// the P-384 curve and SHA-256. -/// -/// In most situations, P-256 should be used only with SHA-256 and P-384 -/// should be used only with SHA-384. However, in some cases, particularly TLS -/// on the web, it is necessary to support P-256 with SHA-384 for compatibility -/// with widely-deployed implementations that do not follow these guidelines. -/// -/// See "`ECDSA_*_ASN1` Details" in `ring::signature`'s module-level -/// documentation for more details. -pub static ECDSA_P384_SHA256_ASN1: EcdsaVerificationAlgorithm = EcdsaVerificationAlgorithm { - ops: &p384::PUBLIC_SCALAR_OPS, - digest_alg: &digest::SHA256, - split_rs: split_rs_asn1, - id: AlgorithmID::ECDSA_P384_SHA256_ASN1, -}; - -/// Verification of ASN.1 DER-encoded ECDSA signatures using the P-384 curve -/// and SHA-384. -/// -/// See "`ECDSA_*_ASN1` Details" in `ring::signature`'s module-level -/// documentation for more details. -pub static ECDSA_P384_SHA384_ASN1: EcdsaVerificationAlgorithm = EcdsaVerificationAlgorithm { - ops: &p384::PUBLIC_SCALAR_OPS, - digest_alg: &digest::SHA384, - split_rs: split_rs_asn1, - id: AlgorithmID::ECDSA_P384_SHA384_ASN1, -}; - -#[cfg(test)] -mod tests { - use super::*; - use crate::test; - use alloc::vec::Vec; - - #[test] - fn test_digest_based_test_vectors() { - test::run( - test_file!("../../../../crypto/fipsmodule/ecdsa/ecdsa_verify_tests.txt"), - |section, test_case| { - assert_eq!(section, ""); - - let curve_name = test_case.consume_string("Curve"); - - let public_key = { - let mut public_key = Vec::new(); - public_key.push(0x04); - public_key.extend(&test_case.consume_bytes("X")); - public_key.extend(&test_case.consume_bytes("Y")); - public_key - }; - - let digest = test_case.consume_bytes("Digest"); - - let sig = { - let mut sig = Vec::new(); - sig.extend(&test_case.consume_bytes("R")); - sig.extend(&test_case.consume_bytes("S")); - sig - }; - - let invalid = test_case.consume_optional_string("Invalid"); - - let alg = match curve_name.as_str() { - "P-256" => &ECDSA_P256_SHA256_FIXED, - "P-384" => &ECDSA_P384_SHA384_FIXED, - _ => { - panic!("Unsupported curve: {}", curve_name); - } - }; - - let digest = super::super::digest_scalar::digest_bytes_scalar( - &alg.ops.scalar_ops, - &digest[..], - ); - let actual_result = alg.verify_digest( - untrusted::Input::from(&public_key[..]), - digest, - untrusted::Input::from(&sig[..]), - ); - assert_eq!(actual_result.is_ok(), invalid.is_none()); - - Ok(()) - }, - ); - } -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ecdsa.rs temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ecdsa.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ecdsa.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ecdsa.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ -mod digest_scalar; -pub mod signing; -pub mod verification; diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/elem.rs temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/elem.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/elem.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/elem.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,120 +0,0 @@ -// Copyright 2017 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -use crate::{ - arithmetic::montgomery::{Encoding, ProductEncoding}, - limb::{Limb, LIMB_BITS}, -}; -use core::marker::PhantomData; - -/// Elements of ℤ/mℤ for some modulus *m*. Elements are always fully reduced -/// with respect to *m*; i.e. the 0 <= x < m for every value x. -#[derive(Clone, Copy)] -pub struct Elem { - // XXX: pub - pub limbs: [Limb; MAX_LIMBS], - - /// The modulus *m* for the ring ℤ/mℤ for which this element is a value. - pub m: PhantomData, - - /// The number of Montgomery factors that need to be canceled out from - /// `value` to get the actual value. - pub encoding: PhantomData, -} - -impl Elem { - // There's no need to convert `value` to the Montgomery domain since - // 0 * R**2 (mod m) == 0, so neither the modulus nor the encoding are needed - // as inputs for constructing a zero-valued element. - pub fn zero() -> Self { - Self { - limbs: [0; MAX_LIMBS], - m: PhantomData, - encoding: PhantomData, - } - } -} - -#[inline] -pub fn mul_mont( - f: unsafe extern "C" fn(r: *mut Limb, a: *const Limb, b: *const Limb), - a: &Elem, - b: &Elem, -) -> Elem::Output> -where - (EA, EB): ProductEncoding, -{ - binary_op(f, a, b) -} - -// let r = f(a, b); return r; -#[inline] -pub fn binary_op( - f: unsafe extern "C" fn(r: *mut Limb, a: *const Limb, b: *const Limb), - a: &Elem, - b: &Elem, -) -> Elem { - let mut r = Elem { - limbs: [0; MAX_LIMBS], - m: PhantomData, - encoding: PhantomData, - }; - unsafe { f(r.limbs.as_mut_ptr(), a.limbs.as_ptr(), b.limbs.as_ptr()) } - r -} - -// a := f(a, b); -#[inline] -pub fn binary_op_assign( - f: unsafe extern "C" fn(r: *mut Limb, a: *const Limb, b: *const Limb), - a: &mut Elem, - b: &Elem, -) { - unsafe { f(a.limbs.as_mut_ptr(), a.limbs.as_ptr(), b.limbs.as_ptr()) } -} - -// let r = f(a); return r; -#[inline] -pub fn unary_op( - f: unsafe extern "C" fn(r: *mut Limb, a: *const Limb), - a: &Elem, -) -> Elem { - let mut r = Elem { - limbs: [0; MAX_LIMBS], - m: PhantomData, - encoding: PhantomData, - }; - unsafe { f(r.limbs.as_mut_ptr(), a.limbs.as_ptr()) } - r -} - -// a := f(a); -#[inline] -pub fn unary_op_assign( - f: unsafe extern "C" fn(r: *mut Limb, a: *const Limb), - a: &mut Elem, -) { - unsafe { f(a.limbs.as_mut_ptr(), a.limbs.as_ptr()) } -} - -// a := f(a, a); -#[inline] -pub fn unary_op_from_binary_op_assign( - f: unsafe extern "C" fn(r: *mut Limb, a: *const Limb, b: *const Limb), - a: &mut Elem, -) { - unsafe { f(a.limbs.as_mut_ptr(), a.limbs.as_ptr(), a.limbs.as_ptr()) } -} - -pub const MAX_LIMBS: usize = (384 + (LIMB_BITS - 1)) / LIMB_BITS; diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p256_elem_mul_tests.txt temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p256_elem_mul_tests.txt --- temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p256_elem_mul_tests.txt 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p256_elem_mul_tests.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,32 +0,0 @@ - -a = 00 -b = 00 -r = 00 - -a = 00 -b = ffffffff00000001000000000000000000000000fffffffffffffffffffffffe -r = 00 - -a = 01 -b = ffffffff00000001000000000000000000000000fffffffffffffffffffffffe -r = fffffffd00000002fffffffdffffffff00000001fffffffcffffffff - -a = 02 -b = ffffffff00000001000000000000000000000000fffffffffffffffffffffffe -r = 01fffffffa00000005fffffffbfffffffe00000003fffffff9fffffffe - -a = 03 -b = ffffffff00000001000000000000000000000000fffffffffffffffffffffffe -r = 02fffffff700000008fffffff9fffffffd00000005fffffff6fffffffd - -a = 7fffffff800000008000000000000000000000007fffffffffffffffffffffff -b = 02 -r = fffffffd00000002fffffffdffffffff00000001fffffffcffffffff - -a = 7fffffff80000000800000000000000000000000800000000000000000000000 -b = 02 -r = fffffffe00000003fffffffd0000000200000001fffffffe0000000300000000 - -a = 8000000000000000000000000000000000000000000000000000000000000000 -b = 02 -r = 01 diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p256_elem_neg_tests.txt temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p256_elem_neg_tests.txt --- temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p256_elem_neg_tests.txt 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p256_elem_neg_tests.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,24 +0,0 @@ - -a = 00 -b = 00 - -a = 01 -b = ffffffff00000001000000000000000000000000fffffffffffffffffffffffe - -a = 02 -b = ffffffff00000001000000000000000000000000fffffffffffffffffffffffd - -a = 03 -b = ffffffff00000001000000000000000000000000fffffffffffffffffffffffc - -a = ffffffff00000001000000000000000000000000fffffffffffffffffffffffe -b = 01 - -a = 7fffffff800000008000000000000000000000007fffffffffffffffffffffff -b = 7fffffff80000000800000000000000000000000800000000000000000000000 - -a = 7fffffff80000000800000000000000000000000800000000000000000000000 -b = 7fffffff800000008000000000000000000000007fffffffffffffffffffffff - -a = 8000000000000000000000000000000000000000000000000000000000000000 -b = 7fffffff00000001000000000000000000000000ffffffffffffffffffffffff diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p256_elem_sum_tests.txt temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p256_elem_sum_tests.txt --- temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p256_elem_sum_tests.txt 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p256_elem_sum_tests.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,1048 +0,0 @@ -# Montgomery Arithmetic; values are in the range [0, q). - - -a = 00 -b = 00 -r = 00 - -a = 00 -b = 01 -r = 01 - -a = 00 -b = ffffffff00000001000000000000000000000000fffffffffffffffffffffffe -r = ffffffff00000001000000000000000000000000fffffffffffffffffffffffe - -a = 01 -b = ffffffff00000001000000000000000000000000fffffffffffffffffffffffe -r = 00 - -a = 02 -b = ffffffff00000001000000000000000000000000fffffffffffffffffffffffe -r = 01 - -a = 03 -b = ffffffff00000001000000000000000000000000fffffffffffffffffffffffe -r = 02 - -a = 7fffffff800000008000000000000000000000007fffffffffffffffffffffff -b = 7fffffff80000000800000000000000000000000800000000000000000000000 -r = 00 - -a = 7fffffff80000000800000000000000000000000800000000000000000000000 -b = 7fffffff80000000800000000000000000000000800000000000000000000000 -r = 01 - -a = 8000000000000000000000000000000000000000000000000000000000000000 -b = 8000000000000000000000000000000000000000000000000000000000000000 -r = fffffffeffffffffffffffffffffffff000000000000000000000001 - -a = 8000000000000000000000000000000000000000000000000000000000000000 -b = 8000000000000000000000000000000000000000000000000000000000000000 -r = fffffffeffffffffffffffffffffffff000000000000000000000001 - -a = 800000007fffffff7fffffffffffffffffffffff800000000000000000000001 -b = 7fffffff800000008000000000000000000000007fffffffffffffffffffffff -r = fffffffeffffffffffffffffffffffff000000000000000000000001 - -a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 8000000000000000000000000000000000000000000000000000000000000000 -r = fffffffeffffffffffffffffffffffff000000000000000000000000 - -a = 800000007fffffff7fffffffffffffffffffffff800000000000000000000000 -b = 7fffffff800000008000000000000000000000007fffffffffffffffffffffff -r = fffffffeffffffffffffffffffffffff000000000000000000000000 - -# Carry Propagation. - -a = ff -b = 01 -r = 0100 - -a = 01ff -b = 01 -r = 0200 - -a = 03ff -b = 01 -r = 0400 - -a = 07ff -b = 01 -r = 0800 - -a = 0fff -b = 01 -r = 1000 - -a = 1fff -b = 01 -r = 2000 - -a = 3fff -b = 01 -r = 4000 - -a = 7fff -b = 01 -r = 8000 - -a = ffff -b = 01 -r = 010000 - -a = 01ffff -b = 01 -r = 020000 - -a = 03ffff -b = 01 -r = 040000 - -a = 07ffff -b = 01 -r = 080000 - -a = 0fffff -b = 01 -r = 100000 - -a = 1fffff -b = 01 -r = 200000 - -a = 3fffff -b = 01 -r = 400000 - -a = 7fffff -b = 01 -r = 800000 - -a = ffffff -b = 01 -r = 01000000 - -a = 01ffffff -b = 01 -r = 02000000 - -a = 03ffffff -b = 01 -r = 04000000 - -a = 07ffffff -b = 01 -r = 08000000 - -a = 0fffffff -b = 01 -r = 10000000 - -a = 1fffffff -b = 01 -r = 20000000 - -a = 3fffffff -b = 01 -r = 40000000 - -a = 7fffffff -b = 01 -r = 80000000 - -a = ffffffff -b = 01 -r = 0100000000 - -a = 01ffffffff -b = 01 -r = 0200000000 - -a = 03ffffffff -b = 01 -r = 0400000000 - -a = 07ffffffff -b = 01 -r = 0800000000 - -a = 0fffffffff -b = 01 -r = 1000000000 - -a = 1fffffffff -b = 01 -r = 2000000000 - -a = 3fffffffff -b = 01 -r = 4000000000 - -a = 7fffffffff -b = 01 -r = 8000000000 - -a = ffffffffff -b = 01 -r = 010000000000 - -a = 01ffffffffff -b = 01 -r = 020000000000 - -a = 03ffffffffff -b = 01 -r = 040000000000 - -a = 07ffffffffff -b = 01 -r = 080000000000 - -a = 0fffffffffff -b = 01 -r = 100000000000 - -a = 1fffffffffff -b = 01 -r = 200000000000 - -a = 3fffffffffff -b = 01 -r = 400000000000 - -a = 7fffffffffff -b = 01 -r = 800000000000 - -a = ffffffffffff -b = 01 -r = 01000000000000 - -a = 01ffffffffffff -b = 01 -r = 02000000000000 - -a = 03ffffffffffff -b = 01 -r = 04000000000000 - -a = 07ffffffffffff -b = 01 -r = 08000000000000 - -a = 0fffffffffffff -b = 01 -r = 10000000000000 - -a = 1fffffffffffff -b = 01 -r = 20000000000000 - -a = 3fffffffffffff -b = 01 -r = 40000000000000 - -a = 7fffffffffffff -b = 01 -r = 80000000000000 - -a = ffffffffffffff -b = 01 -r = 0100000000000000 - -a = 01ffffffffffffff -b = 01 -r = 0200000000000000 - -a = 03ffffffffffffff -b = 01 -r = 0400000000000000 - -a = 07ffffffffffffff -b = 01 -r = 0800000000000000 - -a = 0fffffffffffffff -b = 01 -r = 1000000000000000 - -a = 1fffffffffffffff -b = 01 -r = 2000000000000000 - -a = 3fffffffffffffff -b = 01 -r = 4000000000000000 - -a = 7fffffffffffffff -b = 01 -r = 8000000000000000 - -a = ffffffffffffffff -b = 01 -r = 010000000000000000 - -a = 01ffffffffffffffff -b = 01 -r = 020000000000000000 - -a = 03ffffffffffffffff -b = 01 -r = 040000000000000000 - -a = 07ffffffffffffffff -b = 01 -r = 080000000000000000 - -a = 0fffffffffffffffff -b = 01 -r = 100000000000000000 - -a = 1fffffffffffffffff -b = 01 -r = 200000000000000000 - -a = 3fffffffffffffffff -b = 01 -r = 400000000000000000 - -a = 7fffffffffffffffff -b = 01 -r = 800000000000000000 - -a = ffffffffffffffffff -b = 01 -r = 01000000000000000000 - -a = 01ffffffffffffffffff -b = 01 -r = 02000000000000000000 - -a = 03ffffffffffffffffff -b = 01 -r = 04000000000000000000 - -a = 07ffffffffffffffffff -b = 01 -r = 08000000000000000000 - -a = 0fffffffffffffffffff -b = 01 -r = 10000000000000000000 - -a = 1fffffffffffffffffff -b = 01 -r = 20000000000000000000 - -a = 3fffffffffffffffffff -b = 01 -r = 40000000000000000000 - -a = 7fffffffffffffffffff -b = 01 -r = 80000000000000000000 - -a = ffffffffffffffffffff -b = 01 -r = 0100000000000000000000 - -a = 01ffffffffffffffffffff -b = 01 -r = 0200000000000000000000 - -a = 03ffffffffffffffffffff -b = 01 -r = 0400000000000000000000 - -a = 07ffffffffffffffffffff -b = 01 -r = 0800000000000000000000 - -a = 0fffffffffffffffffffff -b = 01 -r = 1000000000000000000000 - -a = 1fffffffffffffffffffff -b = 01 -r = 2000000000000000000000 - -a = 3fffffffffffffffffffff -b = 01 -r = 4000000000000000000000 - -a = 7fffffffffffffffffffff -b = 01 -r = 8000000000000000000000 - -a = ffffffffffffffffffffff -b = 01 -r = 010000000000000000000000 - -a = 01ffffffffffffffffffffff -b = 01 -r = 020000000000000000000000 - -a = 03ffffffffffffffffffffff -b = 01 -r = 040000000000000000000000 - -a = 07ffffffffffffffffffffff -b = 01 -r = 080000000000000000000000 - -a = 0fffffffffffffffffffffff -b = 01 -r = 100000000000000000000000 - -a = 1fffffffffffffffffffffff -b = 01 -r = 200000000000000000000000 - -a = 3fffffffffffffffffffffff -b = 01 -r = 400000000000000000000000 - -a = 7fffffffffffffffffffffff -b = 01 -r = 800000000000000000000000 - -a = ffffffffffffffffffffffff -b = 01 -r = 01000000000000000000000000 - -a = 01ffffffffffffffffffffffff -b = 01 -r = 02000000000000000000000000 - -a = 03ffffffffffffffffffffffff -b = 01 -r = 04000000000000000000000000 - -a = 07ffffffffffffffffffffffff -b = 01 -r = 08000000000000000000000000 - -a = 0fffffffffffffffffffffffff -b = 01 -r = 10000000000000000000000000 - -a = 1fffffffffffffffffffffffff -b = 01 -r = 20000000000000000000000000 - -a = 3fffffffffffffffffffffffff -b = 01 -r = 40000000000000000000000000 - -a = 7fffffffffffffffffffffffff -b = 01 -r = 80000000000000000000000000 - -a = ffffffffffffffffffffffffff -b = 01 -r = 0100000000000000000000000000 - -a = 01ffffffffffffffffffffffffff -b = 01 -r = 0200000000000000000000000000 - -a = 03ffffffffffffffffffffffffff -b = 01 -r = 0400000000000000000000000000 - -a = 07ffffffffffffffffffffffffff -b = 01 -r = 0800000000000000000000000000 - -a = 0fffffffffffffffffffffffffff -b = 01 -r = 1000000000000000000000000000 - -a = 1fffffffffffffffffffffffffff -b = 01 -r = 2000000000000000000000000000 - -a = 3fffffffffffffffffffffffffff -b = 01 -r = 4000000000000000000000000000 - -a = 7fffffffffffffffffffffffffff -b = 01 -r = 8000000000000000000000000000 - -a = ffffffffffffffffffffffffffff -b = 01 -r = 010000000000000000000000000000 - -a = 01ffffffffffffffffffffffffffff -b = 01 -r = 020000000000000000000000000000 - -a = 03ffffffffffffffffffffffffffff -b = 01 -r = 040000000000000000000000000000 - -a = 07ffffffffffffffffffffffffffff -b = 01 -r = 080000000000000000000000000000 - -a = 0fffffffffffffffffffffffffffff -b = 01 -r = 100000000000000000000000000000 - -a = 1fffffffffffffffffffffffffffff -b = 01 -r = 200000000000000000000000000000 - -a = 3fffffffffffffffffffffffffffff -b = 01 -r = 400000000000000000000000000000 - -a = 7fffffffffffffffffffffffffffff -b = 01 -r = 800000000000000000000000000000 - -a = ffffffffffffffffffffffffffffff -b = 01 -r = 01000000000000000000000000000000 - -a = 01ffffffffffffffffffffffffffffff -b = 01 -r = 02000000000000000000000000000000 - -a = 03ffffffffffffffffffffffffffffff -b = 01 -r = 04000000000000000000000000000000 - -a = 07ffffffffffffffffffffffffffffff -b = 01 -r = 08000000000000000000000000000000 - -a = 0fffffffffffffffffffffffffffffff -b = 01 -r = 10000000000000000000000000000000 - -a = 1fffffffffffffffffffffffffffffff -b = 01 -r = 20000000000000000000000000000000 - -a = 3fffffffffffffffffffffffffffffff -b = 01 -r = 40000000000000000000000000000000 - -a = 7fffffffffffffffffffffffffffffff -b = 01 -r = 80000000000000000000000000000000 - -a = ffffffffffffffffffffffffffffffff -b = 01 -r = 0100000000000000000000000000000000 - -a = 01ffffffffffffffffffffffffffffffff -b = 01 -r = 0200000000000000000000000000000000 - -a = 03ffffffffffffffffffffffffffffffff -b = 01 -r = 0400000000000000000000000000000000 - -a = 07ffffffffffffffffffffffffffffffff -b = 01 -r = 0800000000000000000000000000000000 - -a = 0fffffffffffffffffffffffffffffffff -b = 01 -r = 1000000000000000000000000000000000 - -a = 1fffffffffffffffffffffffffffffffff -b = 01 -r = 2000000000000000000000000000000000 - -a = 3fffffffffffffffffffffffffffffffff -b = 01 -r = 4000000000000000000000000000000000 - -a = 7fffffffffffffffffffffffffffffffff -b = 01 -r = 8000000000000000000000000000000000 - -a = ffffffffffffffffffffffffffffffffff -b = 01 -r = 010000000000000000000000000000000000 - -a = 01ffffffffffffffffffffffffffffffffff -b = 01 -r = 020000000000000000000000000000000000 - -a = 03ffffffffffffffffffffffffffffffffff -b = 01 -r = 040000000000000000000000000000000000 - -a = 07ffffffffffffffffffffffffffffffffff -b = 01 -r = 080000000000000000000000000000000000 - -a = 0fffffffffffffffffffffffffffffffffff -b = 01 -r = 100000000000000000000000000000000000 - -a = 1fffffffffffffffffffffffffffffffffff -b = 01 -r = 200000000000000000000000000000000000 - -a = 3fffffffffffffffffffffffffffffffffff -b = 01 -r = 400000000000000000000000000000000000 - -a = 7fffffffffffffffffffffffffffffffffff -b = 01 -r = 800000000000000000000000000000000000 - -a = ffffffffffffffffffffffffffffffffffff -b = 01 -r = 01000000000000000000000000000000000000 - -a = 01ffffffffffffffffffffffffffffffffffff -b = 01 -r = 02000000000000000000000000000000000000 - -a = 03ffffffffffffffffffffffffffffffffffff -b = 01 -r = 04000000000000000000000000000000000000 - -a = 07ffffffffffffffffffffffffffffffffffff -b = 01 -r = 08000000000000000000000000000000000000 - -a = 0fffffffffffffffffffffffffffffffffffff -b = 01 -r = 10000000000000000000000000000000000000 - -a = 1fffffffffffffffffffffffffffffffffffff -b = 01 -r = 20000000000000000000000000000000000000 - -a = 3fffffffffffffffffffffffffffffffffffff -b = 01 -r = 40000000000000000000000000000000000000 - -a = 7fffffffffffffffffffffffffffffffffffff -b = 01 -r = 80000000000000000000000000000000000000 - -a = ffffffffffffffffffffffffffffffffffffff -b = 01 -r = 0100000000000000000000000000000000000000 - -a = 01ffffffffffffffffffffffffffffffffffffff -b = 01 -r = 0200000000000000000000000000000000000000 - -a = 03ffffffffffffffffffffffffffffffffffffff -b = 01 -r = 0400000000000000000000000000000000000000 - -a = 07ffffffffffffffffffffffffffffffffffffff -b = 01 -r = 0800000000000000000000000000000000000000 - -a = 0fffffffffffffffffffffffffffffffffffffff -b = 01 -r = 1000000000000000000000000000000000000000 - -a = 1fffffffffffffffffffffffffffffffffffffff -b = 01 -r = 2000000000000000000000000000000000000000 - -a = 3fffffffffffffffffffffffffffffffffffffff -b = 01 -r = 4000000000000000000000000000000000000000 - -a = 7fffffffffffffffffffffffffffffffffffffff -b = 01 -r = 8000000000000000000000000000000000000000 - -a = ffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 010000000000000000000000000000000000000000 - -a = 01ffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 020000000000000000000000000000000000000000 - -a = 03ffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 040000000000000000000000000000000000000000 - -a = 07ffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 080000000000000000000000000000000000000000 - -a = 0fffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 100000000000000000000000000000000000000000 - -a = 1fffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 200000000000000000000000000000000000000000 - -a = 3fffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 400000000000000000000000000000000000000000 - -a = 7fffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 800000000000000000000000000000000000000000 - -a = ffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 01000000000000000000000000000000000000000000 - -a = 01ffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 02000000000000000000000000000000000000000000 - -a = 03ffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 04000000000000000000000000000000000000000000 - -a = 07ffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 08000000000000000000000000000000000000000000 - -a = 0fffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 10000000000000000000000000000000000000000000 - -a = 1fffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 20000000000000000000000000000000000000000000 - -a = 3fffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 40000000000000000000000000000000000000000000 - -a = 7fffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 80000000000000000000000000000000000000000000 - -a = ffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 0100000000000000000000000000000000000000000000 - -a = 01ffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 0200000000000000000000000000000000000000000000 - -a = 03ffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 0400000000000000000000000000000000000000000000 - -a = 07ffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 0800000000000000000000000000000000000000000000 - -a = 0fffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 1000000000000000000000000000000000000000000000 - -a = 1fffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 2000000000000000000000000000000000000000000000 - -a = 3fffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 4000000000000000000000000000000000000000000000 - -a = 7fffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 8000000000000000000000000000000000000000000000 - -a = ffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 010000000000000000000000000000000000000000000000 - -a = 01ffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 020000000000000000000000000000000000000000000000 - -a = 03ffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 040000000000000000000000000000000000000000000000 - -a = 07ffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 080000000000000000000000000000000000000000000000 - -a = 0fffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 100000000000000000000000000000000000000000000000 - -a = 1fffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 200000000000000000000000000000000000000000000000 - -a = 3fffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 400000000000000000000000000000000000000000000000 - -a = 7fffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 800000000000000000000000000000000000000000000000 - -a = ffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 01000000000000000000000000000000000000000000000000 - -a = 01ffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 02000000000000000000000000000000000000000000000000 - -a = 03ffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 04000000000000000000000000000000000000000000000000 - -a = 07ffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 08000000000000000000000000000000000000000000000000 - -a = 0fffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 10000000000000000000000000000000000000000000000000 - -a = 1fffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 20000000000000000000000000000000000000000000000000 - -a = 3fffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 40000000000000000000000000000000000000000000000000 - -a = 7fffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 80000000000000000000000000000000000000000000000000 - -a = ffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 0100000000000000000000000000000000000000000000000000 - -a = 01ffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 0200000000000000000000000000000000000000000000000000 - -a = 03ffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 0400000000000000000000000000000000000000000000000000 - -a = 07ffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 0800000000000000000000000000000000000000000000000000 - -a = 0fffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 1000000000000000000000000000000000000000000000000000 - -a = 1fffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 2000000000000000000000000000000000000000000000000000 - -a = 3fffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 4000000000000000000000000000000000000000000000000000 - -a = 7fffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 8000000000000000000000000000000000000000000000000000 - -a = ffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 010000000000000000000000000000000000000000000000000000 - -a = 01ffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 020000000000000000000000000000000000000000000000000000 - -a = 03ffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 040000000000000000000000000000000000000000000000000000 - -a = 07ffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 080000000000000000000000000000000000000000000000000000 - -a = 0fffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 100000000000000000000000000000000000000000000000000000 - -a = 1fffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 200000000000000000000000000000000000000000000000000000 - -a = 3fffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 400000000000000000000000000000000000000000000000000000 - -a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 800000000000000000000000000000000000000000000000000000 - -a = ffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 01000000000000000000000000000000000000000000000000000000 - -a = 01ffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 02000000000000000000000000000000000000000000000000000000 - -a = 03ffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 04000000000000000000000000000000000000000000000000000000 - -a = 07ffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 08000000000000000000000000000000000000000000000000000000 - -a = 0fffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 10000000000000000000000000000000000000000000000000000000 - -a = 1fffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 20000000000000000000000000000000000000000000000000000000 - -a = 3fffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 40000000000000000000000000000000000000000000000000000000 - -a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 80000000000000000000000000000000000000000000000000000000 - -a = ffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 0100000000000000000000000000000000000000000000000000000000 - -a = 01ffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 0200000000000000000000000000000000000000000000000000000000 - -a = 03ffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 0400000000000000000000000000000000000000000000000000000000 - -a = 07ffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 0800000000000000000000000000000000000000000000000000000000 - -a = 0fffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 1000000000000000000000000000000000000000000000000000000000 - -a = 1fffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 2000000000000000000000000000000000000000000000000000000000 - -a = 3fffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 4000000000000000000000000000000000000000000000000000000000 - -a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 8000000000000000000000000000000000000000000000000000000000 - -a = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 010000000000000000000000000000000000000000000000000000000000 - -a = 01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 020000000000000000000000000000000000000000000000000000000000 - -a = 03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 040000000000000000000000000000000000000000000000000000000000 - -a = 07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 080000000000000000000000000000000000000000000000000000000000 - -a = 0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 100000000000000000000000000000000000000000000000000000000000 - -a = 1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 200000000000000000000000000000000000000000000000000000000000 - -a = 3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 400000000000000000000000000000000000000000000000000000000000 - -a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 800000000000000000000000000000000000000000000000000000000000 - -a = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 01000000000000000000000000000000000000000000000000000000000000 - -a = 01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 02000000000000000000000000000000000000000000000000000000000000 - -a = 03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 04000000000000000000000000000000000000000000000000000000000000 - -a = 07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 08000000000000000000000000000000000000000000000000000000000000 - -a = 0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 10000000000000000000000000000000000000000000000000000000000000 - -a = 1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 20000000000000000000000000000000000000000000000000000000000000 - -a = 3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 40000000000000000000000000000000000000000000000000000000000000 - -a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 80000000000000000000000000000000000000000000000000000000000000 - -a = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 0100000000000000000000000000000000000000000000000000000000000000 - -a = 01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 0200000000000000000000000000000000000000000000000000000000000000 - -a = 03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 0400000000000000000000000000000000000000000000000000000000000000 - -a = 07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 0800000000000000000000000000000000000000000000000000000000000000 - -a = 0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 1000000000000000000000000000000000000000000000000000000000000000 - -a = 1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 2000000000000000000000000000000000000000000000000000000000000000 - -a = 3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 4000000000000000000000000000000000000000000000000000000000000000 - -a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 8000000000000000000000000000000000000000000000000000000000000000 diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p256_point_double_tests.txt temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p256_point_double_tests.txt --- temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p256_point_double_tests.txt 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p256_point_double_tests.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,20 +0,0 @@ - -# G doubled once. -a = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 8571ff1825885d85d2e88688dd21f3258b4ab8e4ba19e45cddf25357ce95560a, 00000000fffffffeffffffffffffffffffffffff000000000000000000000001 -r = f6bb32e43dcf3a3b732205038d1490d9aa6ae3c1a433827d850046d410ddd64d, 78c577510a5b8a3b19a8fb0e92042dbe152cd7cbeb236ff82f3648d361bee1a5 - -# Point at infinity doubled. This uses the (0, 0, 0) representation of -# the point at infinity instead of the classic (1, 1, 0) -# representation. -a = 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000 -r = inf - -# Point at infinity doubled. This form is the result of multiplying -# n * G (affine), which is more interesting than the above case -# because only the Z coordinate is zero. -a = 2b11cb945c8cf152ffa4c9c2b1c965b019b35d0b7626919ef0ae6cb9d232f8af, 6d333da42e30f7011245b6281015ded14e0f100968e758a1b6c3c083afc14ea0, 0000000000000000000000000000000000000000000000000000000000000000 -r = inf - -# (n - 1) * G doubled. -a = 2b11cb945c8cf152ffa4c9c2b1c965b019b35d0b7626919ef0ae6cb9d232f8af, 6d333da42e30f7011245b6281015ded14e0f100968e758a1b6c3c083afc14ea0, 3c396f06c1dc69e4f4b2dce51cd660f761064a4ab098ef61ba3868961f0ef178 -r = f6bb32e43dcf3a3b732205038d1490d9aa6ae3c1a433827d850046d410ddd64d, 873a88adf5a475c5e65704f16dfbd241ead3283514dc9007d0c9b72c9e411e5a diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p256_point_mul_base_tests.txt temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p256_point_mul_base_tests.txt --- temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p256_point_mul_base_tests.txt 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p256_point_mul_base_tests.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,1280 +0,0 @@ - -g_scalar = 00 -r = inf - -g_scalar = 01 -r = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 8571ff1825885d85d2e88688dd21f3258b4ab8e4ba19e45cddf25357ce95560a - -g_scalar = 02 -r = f6bb32e43dcf3a3b732205038d1490d9aa6ae3c1a433827d850046d410ddd64d, 78c577510a5b8a3b19a8fb0e92042dbe152cd7cbeb236ff82f3648d361bee1a5 - -g_scalar = 03 -r = 26936a3fb6ff747e66ad77dd87cbbc98b027f84a087d81fbffac3f904eebc127, d5f06a29e587cc07788208311a2ee98e583e47ad0861fe1ab04c5c1fc983a7eb - -g_scalar = 04 -r = 577362f541b0176b0cdaacace8100af24650a6edc623c17374b0b50d46918dcc, 84b14c394c5ab8636b6c36dee5ddd22e17628471fad6f4472d96f24ce4cbaba6 - -g_scalar = 05 -r = c9079605890523c8941cb5aad076c20c90ec649a94b9537dbe1b8aaec45c61f5, 73a076bb2dd1e9163540a9877e7a1f6873c568efe5eb882beb309b4ae7ba4f10 - -g_scalar = 06 -r = 13074b5954213673d50a961a5b17a3ad55ae744f346cee3e403947373e77664a, a4c9916d4a07f75ff424d44cef639f11299c2b53adff14b593d36220d377e44b - -g_scalar = 07 -r = 13ba5119c3123e03f43eaab50c23bb082bd20213d23c00f70746354ea0173b4f, eaedd9156e240867ef933bdc77c941956742f2f25da67bdd2847d0303f5b9d4d - -g_scalar = 08 -r = b763891eb265230d8f90f02af02cfc6b462ab5c56f9b345527f14cd19499a78f, 56ec12f27706df76123c7b84be60bbf021e3327dcf9eba15f59da3a9532d4977 - -g_scalar = 09 -r = e05b3080f0c4e16b2cc09c0444c8eb00abe6bfed59a7a84175c96e8f264e20e8, 086659cdfd835f9b2b6e019a88b12f1a56af7bedce5d45e31eb7777aa45f3314 - -g_scalar = 0a -r = cc61c94724b3428f737d2cd648250b4998f9868a0fcf81392c18dbd19dc21ec8, 78719a54eb3b4ab55f7d2d65779be5d2c43a8991383fbe080c2b407880dd9e76 - -g_scalar = 0b -r = 3e7090f1649c90731ff3a4158dac1ab59de407956e7fdfe0ea7d260a6245e404, 68930023e125b88e0c0daa891ead643d250f939ee57f61c81a7685612b944e88 - -g_scalar = 0c -r = 4ee1df77cb83e1562409d29dee37385eabdedef5ca345a3304b71aa7d2697768, 7ff57c9553238aca28228cfa8ade6d66170ed2f6ca8956370cac12d91cbb5b43 - -g_scalar = 0d -r = 738477ac5395b759bcbcd43f559e98110e356769856fd30dccc425634b2ed709, fbc08769c9e7b7977cd06422bd1f5bc168748390742ed2e335752b90c00ee17f - -g_scalar = 0e -r = faae7332fd12c72e1717bf54c6832660126e48f77f9707e3a242a35bb0cf664a, 152706dc2eaa1bbbe8e4193e2a65e7dbbe29569e832237c227b52db7995d586b - -g_scalar = 0f -r = e2aa0e430ad3da09ee337424e481937003cc23ee56e27e4b72bcd8b7bc60055b, 2042170a7079adf464efa6de778a4797d766355442a41b2540b8524f6383c45d - -g_scalar = 10 -r = 54d63c809103b723d5ef2f7c2c83f5495882e0753ffe2e6b808b0b650bc6fb80, 64edf7b201efe22055c4623bb1580e9e3670c3194b0b6587f2f11bd652a23f9b - -g_scalar = 11 -r = c1a35c0a6c7a574eb0f139752cfe2dfff17624b6ac0a177b97091dcbd53c5c9d, ebd512263274c3d02f4e247f0d1883bb0575bf30e89cb80e227d314693e79987 - -g_scalar = 12 -r = 675abd1b6f80ebdaa6f247ab412e29794afc964d8f8b403e5f3e51c856ada97a, 6c6fc7d90502394d2626927f1b847bba4b2a5caf8f4f0b3c66a2bd725e485a1d - -g_scalar = 13 -r = fe545c282897c3fcb8842277752c41ac68363aba25e1a16efea912baa5659ae8, f720ee256d12597b85665e9be39508c15806244afba977c52d36e9e7dc4c696b - -g_scalar = 14 -r = e2d1eeb6fe5bfb4e048099d95dd283ba5916868f0f862bdc8a979129d2337a31, 5ee104e1c5fee0d09161c53f8aa95e66a2d4ec17ffffcbae82ef1c417884005d - -g_scalar = 15 -r = ecead9f4c16762fc6d2a506c5a3f3b3074e1b2654783f47d562e4cecc135b208, c086d5f1c9477fa37a75023e7fac29a41b0fadc083bb3c61f29dd4b2e286e5b9 - -g_scalar = 16 -r = fdc777e8e93358a46a0b0685d2f8ba3dc99ffa23e3912a9a0fc611352f6f3076, 793e8d075d5cd0749de917da153a35b5640c2d6a4d23fea494a787bb35415f04 - -g_scalar = 17 -r = af2cea7c1727bf42d0825fa2a358406937c7a7e89e2e1f6ef4f876532de45068, 83d0687b9077666f48068e1371ac2f71e5fda49c27299f4a0360a4fb9e4785a9 - -g_scalar = 18 -r = f97b232f2efc311561d7cbf91d2b469f6d0d755040dd9a356d3883b215d02819, 595dc55eca737b8a7669f03193cb750111ea494988a1e356a551d750b24bcbc7 - -g_scalar = 19 -r = 966742eb65432a2ee395993332f1f3af6fc1b49eed6b67b0a4a319acd837879f, 7b948dc356f7996812068859c9b731ee96cc631243f439504b8dc9feb4966228 - -g_scalar = 1a -r = 994baaa855f2fb101ac7c5eb857ff6fbe6c9267ad8b1753861e4ad32ed1f8008, ed178030d12e5ac714fde97b5fa944f55a39898b628ac50884cf14e11d248018 - -g_scalar = 1b -r = 9f8aa54b2ef7c76a49d2c9eb084ffdd7d36a42d7aebf7313042c2af497e2feb4, 2d431068d84bde312d97d10878eb4cbb3bd0c66fddb7fb589200b7ba09895e70 - -g_scalar = 1c -r = e97f6b6af2aadb9797082ec0cfe153eb7323cb2830a6a8924b523eb7172ccd1f, a9b4cc5f405852784a688b482d0cb71ea6a7f9c7804b2a681d3d393ed1a83da1 - -g_scalar = 1d -r = e266f95948603d48944a70270317b9e2f1be963a0d9258805e5db46acb66e132, 3798142a2a3be21b8a966939777c619f90472447a2fb18a398db66735c208899 - -g_scalar = 1e -r = d0288cb552b6fc3cc5f4d6cd3ac77acda3a14e49b44f65a1b4241cb13298b343, 460d45ce51601f72d667da379b3aa441b675511e06bf9b4ad5cc8c2f1c040abc - -g_scalar = 1f -r = 948dc4f8b1fc87b48ef5689d3cf7600ddd3cf7e7473017e6e2f73c696755ff89, f38ae8914d7b4745faecedfd0c9803fc2d921ca298eb6028d9e9fe814ea53299 - -g_scalar = 20 -r = 39227077695532a4bc6d6a58fead0197befd904c4079dfbfd8c5fccfc5e3a3d8, 6231d7929591c2a47b969c1aad9a2e407e449b64480a990809e23e6ddbef42f5 - -g_scalar = 21 -r = 33ec6868f044b10cac09c4ae65578ab985ceae7c4b68f103871514560f664534, b16c4303c32f63c4f909604f763f15745509d1285847d5ef6ac4832b3a8ec1f1 - -g_scalar = 22 -r = c982ddd4dd303e645b0673a375678d94caa7a5c6a391849db6ab20147ca23cd3, a159100c570d74f8c77332a33c569426bba2cb1f6f876f92fd7b000b5db6f971 - -g_scalar = 23 -r = ca640b8642a3e5210b8e4134efc2b4c8742ee464233e76b7fd16847fdec67ef5, 2ba901628bb47af824e4ab126b237af7313c300c547852d5653a01908ceb6aa9 - -g_scalar = 24 -r = 3569656cd54a3dc30ae4cb10d257576ec691d0bd1b06c57f3d5e58d6a8219bb7, 480b9e11dd6da526450ac0bae251a0c6934e82d3162bfe13e5ebaebd94cda03a - -g_scalar = 25 -r = 2763a387dfa394ebc5748baea677d806b636458c7f178d5500467bc58cce08b5, 58b36143620088a8f63ebce51558462ce7adda3e6f20d850a12b448a7d3cebb6 - -g_scalar = 26 -r = adf0c7dc7c603d6c7463fd85222ef33b512331170fe948ce8a2cc3ca4d63c0ee, d9a4c2809c80c34dbdaa84d68e59319cccaab359bf3804090ec32d3bfe7765e5 - -g_scalar = 27 -r = 5853e4c4363186ac068f237d16fb36646f5ae714ff0b9346a9d89488a059c142, 0c0bc0e56919240847b864fae14e7b1c2ec4a76681828876e2d87d2363c52f98 - -g_scalar = 28 -r = 462d7b0075f732278909984c66f2728083200f0bdf25e13ce4d7681db82e9f3e, 03466612d1aa702fab256ea35ef5435974c6e18c36ab1c34d90ba188f2651798 - -g_scalar = 29 -r = 98100a4fdb01614feeca111539ce22716fdfe0b56f072822624d60492ed22e91, f70bfeec03884a7bc67732591d57d9ceb6f94d2ec87e9a47b6b0daa2a35c628f - -g_scalar = 2a -r = 649c89ce5bfafe43c2e2594c30a92f8fa155cbe31da6a5c75fb35ccfed2bad01, f3a8cfe389bc7d3d4b00b20b906014cf9b359611f32c50aed158667de9ff257a - -g_scalar = 2b -r = 179c85db3db01994b7d9ad900574598180c5bfb4878873fa4ff23ffd248a7d06, 47795f4f95b2dda09e91cd3ba5e6a3184d82d052eadce5a8ba41b06261a6966c - -g_scalar = 2c -r = 5f3425f6a98dd2915f0e2046e381d3b0009194abb29110fbecfd7c1fd55a897c, eb629f90387ba42a397a247dd69d34170423446c4b083b7fbfa06687730d50da - -g_scalar = 2d -r = e94f7d346d8232781b1e8ae057477f580032940b946c6e181ee426ccd5cd79bf, d73acbfe2cd9e6b5772ef6dec7f80c81c5254469f72b33a5c747cb96782ba21a - -g_scalar = 2e -r = cec684c3a42931dca1030d5babf825e0785c339aa06e9eba4075b5b149ee90d9, 033da338c1b7f86557c8b2c055f7835d45431d665ab43f2b42ab62c9c1586e63 - -g_scalar = 2f -r = 4b969974eba78bfd6b20afec715af2c70a624fa936c83906283c7513caa76097, 9bbff86e6dddfd2704819d515ded93d49b944e107baeca13220755ccd921d60e - -g_scalar = 30 -r = c8403902470343ad1a1baaa76d8805bda7496529bbd803a06b34413077adc612, 85efc7e941325cc2a875f5ce529d75e30b26d7fbb7d8c5b739f59f66175adff1 - -g_scalar = 31 -r = abdbe6084fb7db2bff4cd0b228766127ffe7048453dc690921950b421ff6acd3, d394077ef247fa364d78f592f7818ed826147d27f4645b5a837c92285e1109e8 - -g_scalar = 32 -r = 0dceb8db2b7eaba7edfbe268d5b1fa6aa78bfbaa136852780fb9c2d0488c171a, d7d34194c3628c1343b7716bcc143a46efde7ae6a4449c96bf9e80899ae2b710 - -g_scalar = 33 -r = d20ebe0d5c3fa443da1deb852f4318d4e20bc0ba1e5edf3f508cec1c3b3f64c9, d731e383a2f54c2d99a5e23d82681c6261f1511c5e1a5f65370b4ea773241ea3 - -g_scalar = 34 -r = 88f77f34d0e5e542905a3201c67528b72e0ec469af45f9c02692f36e83445904, 7ef2f2269c0f0f8d5c27014b9bbec39e23b92eae22df3562f67a8d295864687c - -g_scalar = 35 -r = ec3a318d306634b0912e8beda8c8acd95f9c3fc492f2467997359638546c4d8d, fba1da5943465283b155bcd2dcafe1973db82f6f522113f280167f41c31cb264 - -g_scalar = 36 -r = bb8a0feaee26c851c1286ff925c4d56c4f2e512ef8557c5fa0425b8eb212cf53, 1a556e3fea9595eb3df277a41d1936b17ee0c444e76265aac28f70d2e7d6107e - -g_scalar = 37 -r = 5cee8449a7b730dd0deb0e4a46c814c131eea5bf07ef5be6258bbbf9e7305683, 25e8013ff14cf3f4c2cf6a6880e518caee759f879e27a6b4eab495c5a0182bde - -g_scalar = 38 -r = ba3f0c4a7451ae636a84438514600044bb1ff3ca9556f36a8fc441407e8d7a14, 83927681026c2c084e9a5bc2a4b596ac01e0db86b1f2214bdfcac25b1f9af32a - -g_scalar = 39 -r = c13298306acf8ccc068212e3fd1eaf381bfeea57c7385b293ec832e77acaca28, da44c6c600017626c5ab2632c79b7a015748060db661782ab909f2db2aac9e59 - -g_scalar = 3a -r = 305f725f648d02cdd66fe3b67ed78be199cac80de4299aaff26c00e8a7ea82f0, 063749945667474117ab562dbe5ffb3efa70533e7a6319ad33ed1bc4623fb21b - -g_scalar = 3b -r = 4c2bab1b8add53b7cb9727eaa2d17c362100d5d3a8d063d169d44ed65c46aa8e, a062499846fb7a8b6651f7017ce477f8778afcd3a837ebeaa084e90c15426704 - -g_scalar = 3c -r = d40c4ccdbc6f9915026f8fe2671c39bc33fc23364189d9c7dc1e6828ed8a6e19, 04820109bbe4e832c40a04bd4f51ad9612c651a022adff2cafa135bbf80e75ca - -g_scalar = 3d -r = 994a44a69b8335fa71cdf6537eceb50a59556621a9404f843667eb1a7f4c04cc, 0d1bc780872bdbf3b6658466da44bba2473c5680eed4350dd7faf819dbeb9b69 - -g_scalar = 3e -r = 0dbcb03ae539b413177aa4c02089a2336ed7e061ed58f5a7e535f175a1962f91, 6b60cfff35ace009dd47ff98814be9ee6472e5ef6806701ee3dc424ebb32e38e - -g_scalar = 3f -r = 0763a43482fc568d95c376329182cb26039c4800f0518eedb8d3d9319ff91fe5, 90876a0140959b7092bf7c8f91230de0ac98b930824e8197707c04d5383e76ba - -g_scalar = 40 -r = 95fb8394569b38c77da70b83c2c61e01380a0913089f73b9db6d96f305968b80, 296720440e8449708010a4a078424bf88f726bb98faeaf829a3c651280edfe2f - -g_scalar = 41 -r = 01628c4706b6090abf639ed67765765e79527db7ba66f4b9dc2306ebfcdbb2b2, 7d096ac42f1747502c90d98cf3e055d633cb7691ba659f4666eb62f1b957b4a1 - -g_scalar = 42 -r = 78ed4fe6e3a7de485a7e384de42f8cb2a3cfa7fd44b81977c7c6e4d1c4ce250f, b12347993e909dfb9c03344b75554fad55912064d0f5bb2aa9231c8ce9e571ca - -g_scalar = 43 -r = e8218ad07de96a54fc88362a891ea186c16d0c52a48a4ddd86f04d3b51f9c391, fd59d7eb9a8f62d9de3ec728c30a96a005af456a06620ae82c735ac12f33af7a - -g_scalar = 44 -r = 031195d5bb4a44b9b2cdb039f99c55fec35d34e70dd71fab8732d5cd6a93954d, f66904b1400c9463440dec9ece0f8c32bb7047347b57df81baa37f5d08a660c8 - -g_scalar = 45 -r = 49d3ad05548efa2ac856868891e9ae0987986a54361bfe259e5da11cc5e79347, 6d37b1fa546fbecc2126ac553a8dd1269bea0d0f2655d14f987b0687f4eb5cf6 - -g_scalar = 46 -r = 100392dc78c04937681d690f2b3a8c597263de1539f76b817c5a2a14f58a379a, c6793ad2e6e2f3b19cc6e22a27c9a2ead11ae42dad0182e407e5e8e85bef953a - -g_scalar = 47 -r = dd421b5d4a210364f94aa89b40750d0149c7cb94fc05804bf19f382e92aa7864, 574cc7b29378679111f947e696cd0572030a119fdd4af1ec56cd001e39df3672 - -g_scalar = 48 -r = c3b025a015b15144eb5d0c75f38fae9cb1ee4879a360fb557331369679c1e3b1, 6fcd0cbb809a06f20368eb1f2e4283e11ba0cb8c9c5d2e6a33ad53540dc40604 - -g_scalar = 49 -r = b2dacdf66ef82fce794922ef17e29b1a2b34a7dc096fb852ae8f8fe1eeb03d1a, c39725521af82878a66d92525e82d5b3b871ba63e405ca09db8dcc81f42911ee - -g_scalar = 4a -r = d176448e35b23e27b00eea8a5d34f708294b12e1ca1b04e046ce85a9e25a441e, 0a48558f2fa1bd2f77c52d75519978d10c45e52db3bfffc85ce885392bb80ef9 - -g_scalar = 4b -r = a22f8fbea42fd1f6f123716223af72e0cfa8ca0e2a7aa6ab616d2c02fb760095, 24a1bde1d0c2302de79807a770456a7e7be19f0ded4437a85072758b78f3d040 - -g_scalar = 4c -r = 1558fe4c7ef5b48a7c703717cd1823b4285bed3c21848f49cd331464c89bdd46, 9b3b040493b83e45ee4826a9937e1ba33fc6e661d47fa3cb19c6602050eaed5f - -g_scalar = 4d -r = db15e4963d5baeb19c30c6422b2f9c49719a87be5a0ec9ce0a2193bfc266f85c, 854dc9d595105f9e2b4f0c7877eb94ea4788522b2e9fdbb283c3139be0d37321 - -g_scalar = 4e -r = c0e78a3897536f3f711f8b7f7b5065a47e96610365013b3aade6af11a6ab1ecf, f8bdf2ea8474d0c8ea2240ccef96b473407bffa1b201137148b4389c464423d3 - -g_scalar = 4f -r = 5ed556aae89327fc58f6428165f89e14dd306e2a05176f8ba40206d330ff0e92, b75df5ec191a421fd07370c450128375097a54ff99227b16c2b1870af8321bb8 - -g_scalar = 50 -r = c0bfffc45263832a2074213db27de57335ff9aa8b5f86a2c492bdc0752b3e584, 2995919ca4cd266052b6a1739220f4281b037d75b320ebfb2429c22a1d49c605 - -g_scalar = 51 -r = e0beeb1aebff18d3b097c711165c6e4c8e9d0af402ba3183d3a5d81fc63d5e79, 7acf4419e85bc145cbdbfdb9cf290d1fa02dbc426fe5b29dfe657f130801937b - -g_scalar = 52 -r = 8d97fd53554fa366b932d0c17527465559d18be925a81aef80ee662fad29cf9c, 18f61f3cdef3f99d4976126318fb05ae41a471e4e93046f2ad5cb247cd789d17 - -g_scalar = 53 -r = cf3086e87a243ca4f87abebf2ab80485125d4714ec67199a2c9ee62dc3363a22, 97f0013247b64be50536a39db19c61265e9b16125625aad75c52b051c64e09dd - -g_scalar = 54 -r = 2f83a889ca881f6c10b429a2811a47eb2cd0bab9941a27e9b7f1695a43020eec, 4cb3c135b6f36034df4741a71b99ec5f67f9ba802e45cbb12563c590f683e890 - -g_scalar = 55 -r = abfc8457b5e11eff36bf2f65ea65641aef617e0025af76773646b0dd7e1ee314, 159751e2e1cbaebebb0066ae1f282369ce91ee270142811b998dfac18f1192b6 - -g_scalar = 56 -r = a9ea1b80f80e4b9023fb74270b4af06e783b9ba6744a6528dd5c2b8142a18dc1, e6c93b31cefdb61d9a9f04f0e8aeaf7d4a2b5ed57defe51b559759f6edca6f38 - -g_scalar = 57 -r = 2bd0204360826caa041252997f6b0670b856664a2d4b409b516329ff7b4d8b2c, af490825d5cff157a8f439ab06e58e3ecd07bc34c235d56c010e522661ddbcb1 - -g_scalar = 58 -r = 948fb3f76932e6311707165bb939f40fabeee3e9369a60677d81fd488418cae4, d8d37d942785971ded5cf82dc911847cbdf176108c7f9dba005a1dffeabd468e - -g_scalar = 59 -r = bd88aca74765b8053ea123446310eb5a62d51e29fd54487dc1ee6264a7eabe67, 7150f87e7211e4457ab49dd209f98f9a640388f83b9fffefb7b284be14fb691a - -g_scalar = 5a -r = 8307d5cb55648a4cf3df44ded7ee64b747305b7483e904469af9d782de992e6e, e485b90d49c0b6a1ad3294fb1c309a59abff56b525d3fdee5376b018e277280a - -g_scalar = 5b -r = 0211de8fd56927054a39f02bbedd4f4727113bb4ae6a94b8d81ad9386982f865, 4a70abf75c554ed3fa8a5b9b0b46a59f2354719f6237fc68d587138c63c92f69 - -g_scalar = 5c -r = aee309e543ae4336e4c8417839093801a8a38bc31487c5269d7127d76294ba47, d15428592faab2944a72075d7f73442a9929ad4e8f48bb12d4b127399359250d - -g_scalar = 5d -r = 0581b4711fdf24984a278686e16396070aeaca9afd36b1af64cfdc70d9453d29, 435ac466954ffbb3ff6c1a78f9a2852f20b021c3df219dc582290e253d61f6d2 - -g_scalar = 5e -r = bf87ea83037278d9c87bdb8203d41796955ef205d59848ebc82a7aefd2df5e7a, 1001f8d7dd85aa7bf8ea79eadfa99607c00286d964135771c5825a638719aea8 - -g_scalar = 5f -r = 76a8f9fea974291f9a127f2bcaa12d0d6684ad762b346fd2263e039bb308cc40, 3f293fda2cd6f439ee1b1cb5344455a165499c990c5dbba0c802049b68aa19e4 - -g_scalar = 60 -r = 11eddf7fd0a0da0d14f356cc6abc354d6d490a4b19dd329b802b8d2333e12b70, 3f2a78b3241a2b7103b48cc47c29bca2fd2f4f8cfd0258131e208328d87fd1d8 - -g_scalar = 61 -r = f1ae5380578181c7ee848e1d2566805eda8cdb78397e43f4dc90323bafceb64d, 1fbd470f53cf3e6984577f1f3260b76785f4d9c45b68b7e72dc7b8e69c70c77c - -g_scalar = 62 -r = a6eecf308794885e74b44206ee3751becc8715abbc82a095d5192c88589b69ff, e9f04cd324c2e3116b5df55fe390da5ba3f98377daa4c864a05a7aa8dd0ce3b4 - -g_scalar = 63 -r = bc438ae1a4e65b07650522fd4a9a3b17b1f1abb66a7b43712d037bf83f9432b4, 4a673fe054fcd65a03a3c2c7b98ff4b37ab58a3f75503e4631b57ea284693c04 - -g_scalar = 64 -r = 55401274eb1385f3f7ac46733fe90a2ffe49233161c52cf8b9a17db9bf61fec5, 63be9e64a17154226aa068c230548cf4adb9e9b685bac6b7a5db852c23fd068f - -g_scalar = 65 -r = e9b1c23914da499e6a610374c569a602bbe914d3b99cd026b7a96e0a4ea6fdf7, 94ce9e0adba8bfc75a8a14644be77793731251826f21687cb5f6f0feadc19a99 - -g_scalar = 66 -r = 0fcaec0ffecf6fedce33e49cdd3dac5cf5284782e9f60f1841a6fe768f9b4748, a2776d9f8417c98ff3d348f820fe78e36445fbcd5bc92aa3ca1ce130a54edfc4 - -g_scalar = 67 -r = f51ec8724c3c386f57670e41bf619241d0a875e919f7f72c564bdda6c71f8d02, 1429b1f8ae1d3ed8a6fae60930a4f9245df79360286166f300aec19ee8bf7d17 - -g_scalar = 68 -r = 1d6de36b734fc1b835d2293fc7ac3efa90ee46554c2a623582d0020682c4bd6a, 6ba92bcade5a0cc175aef88a77b9d084ffccf5e161217dee946ac3bfcff75858 - -g_scalar = 69 -r = 680d5abf65e03a86c08ec1602b1d28fdcb11125c02a9ba44de6ddcb77b371390, d3d6d111ee9e512f4e346db071cbfc97c87057ca3bce7fe5d5ec7bbbf5327839 - -g_scalar = 6a -r = 7145405dff1765ecb81f9fb1279df6ff750c11bbc098aefac4c398cc1e628b51, 262f03eb0757aaea5cbb069b03fe8fac137218257bc27ef73c3d861d83aae16f - -g_scalar = 6b -r = ee206023efce1a7028f9cdebe9f6e8773571e4d1592ce3342ca0ba9c3796f4c7, ccd7e9418ea700c1e008039e02de2ff12754e4260a7f687cb2159e08b76369dc - -g_scalar = 6c -r = 9d873705000a079bd1a8678742e1cbf414d147984d7df1ff2871263f72371e17, 0d66cfc94b5d416d08e545f1b13e2b493633966c70094e6a3a7f4ad5e01ffe00 - -g_scalar = 6d -r = 3720b2475548de20e7b092174df861f4fd4f61e491ae8d13aec63acbdd10edd0, 5fdaee391cab12c70cd622baeb879899e7229d8956cd660daf419847ebf3df78 - -g_scalar = 6e -r = e7009ee6652405a945ae78ba39dcab99b1fc8c8c23fbbe6e76fbedb5a463fbad, 798ca99e4ef37e3c270c706c6e4840f15761490f7f000956b9a8fc5f8c0531e8 - -g_scalar = 6f -r = 0cf804d77a9b6a20098f37bb0832c416327dac318072f08dd87f4ae086653aa8, f9af0acd904d4731270adcc57148b1351cc0d4cea23afa674b9c5438a67e2173 - -g_scalar = 70 -r = 71704d008938c16745ab5a4d7832ba0c94e258f604a428f26a9505760a99cbca, 65000c24c7973a41e70352687d367d8056feb92ec00eb207db97ab0ef88b8b70 - -g_scalar = 71 -r = 734e0d078a2b0d3acc3a5ecb983538693289e86e10ec0d40a125e6c1b7ebcb88, 61d8209d49f3a53dd13cca90747f19ecfa6bcdb1786076b9e0d92e9a51933360 - -g_scalar = 72 -r = 08e2f429f216dc997afec8bb9b4e920c18849f8ebc30d62c751e03f0216f7c55, bc0eec86924dd15496b984140a9f867197b596a14d7bf8475e5ddf821d6cc33e - -g_scalar = 73 -r = 7c3ff661d8ecca6e8a2627c4851b5bc7f15b920fa8dfce56ad19e039119f6cab, e95dd9d8889821b2dc8df855fe2f493756b76c57baa43b27b9dd2bf2d5f5b5bf - -g_scalar = 74 -r = d8f1fc5f6a92b9aac9f08a5659cb1b6e4b3de89bb2f5f79c87f9793bc9826344, a9c8a4b42b9157daf06c2c8c70549a5753c30bbe65b80f1686357f9eb412595e - -g_scalar = 75 -r = bbdbec7d79af29b17890e8d54796883355a3bb1ad9699e9208e4c4901b620dc4, 2cdf7f854480ffe39dc33392fa67285c50cf6d11ad91a35092750de73e51e1bc - -g_scalar = 76 -r = 4977379654d7a19e24869d65bb07ad54f8f1d8415512ec1c24c00de93f5f68a6, c9c4d63998e59b626cf96715c527a656741bf80a03bc88e604f357d1f061cede - -g_scalar = 77 -r = 6ed0b988157b7f562be22ba0f3a49fb4062afb7c1e314dde87af199e6cc47305, fedf1014fe6ee703d7e814380f67b51417d29c64877b74978162cf502d653fd9 - -g_scalar = 78 -r = 9c7ea21245a2473fb62aaf7c37e7454e094e7ddf4f6ab73a6ebdb7bcd0303ba4, d007ec78a47a715248cd158b2c1eb5419a278a9daaa03497ca76e7549488d036 - -g_scalar = 79 -r = e1a8d418f77f10e127d2bf4f683b30d1d71602d5b0e5fe2014d7251a8c03e3f4, ae839cd80e99505caaf4d4e193394872ff318484da0a4996a4941a1e76a0ead7 - -g_scalar = 7a -r = 62280f9a573fbfa8bf357e0c9358983ad183a961caf64cbd536eeea92f4ff97a, 7aa3b3ccb2a104b24c6b9954bd51f9056ea945bdb1901d3d001da1b77e9176b3 - -g_scalar = 7b -r = 2d7ca4d8f1e354871783d1b6917e47255a71497198a5ea8c62ea859803b58b02, aeb9041c69e788c55870726c16e3e02ada04cc898e17ff543f69b4d49b4d4324 - -g_scalar = 7c -r = d8c0472156db126649b1dfca7f1412750a10ed1576d7996d10f264bc85fc00a2, 8448ecae901289fe9b94c4ad4c99e43958d85051e4dd905a43dfabf3cd768437 - -g_scalar = 7d -r = a9fe2396bb85b9cb04b76d2d1ed32559f72dab6d225733faaab54cfc93740130, b16d6af8c3febbc151dc5fac145ff0d52292393b579f3ce2128b0d24bf2219f0 - -g_scalar = 7e -r = 6941195b752838c39a7d703660ab52e9519a47b4807a9d289c9635be52bf127a, 91a4ea6d215215f65f153f56aa36de2d8459f5705276171860ffbe2e70da613f - -g_scalar = 7f -r = 15fe6a86904a36cf6072a061ae619f2870e9016cdddfd92836e84bb6dee35b41, 76759223abe3c14bd0a8879244f403f2fd1c4a970ad602d09ab6968bf6005965 - -g_scalar = 80 -r = ad311f2c46d5a6173749bba4b3ad9db57ef2b6b9ac62ff5463c5cb817a2ad62a, fa38d320ec008188f8aa266d75d6b138b46feaf3367834ffb77a8087c2ff3b6d - -g_scalar = 0200000000000000000000000000000000000000000000000000000000000000 -r = 135dc5395b54827dd161d2cacf780900bcef72873566cc63b2330fef4e4ca463, 8b0c573826152c8fe973586d6d3321da10a224f007dfa06c638f052e27bf1bc6 - -g_scalar = 0400000000000000000000000000000000000000000000000000000000000000 -r = 15b4488b29fd9fd06e1da8c39a33c6771fe19e357fe4364e9910ba6b23a5d896, f2c4f79cb6ec839b3fd1b24907e5658e920a8a70ab8163e81f4392541a1f22bf - -g_scalar = 0600000000000000000000000000000000000000000000000000000000000000 -r = e78c2ec0fc61206741311f8a38038a5d8f860c7943ef881c84cea0691416a6a5, 35beef7a9e36c39eff558aecf3612cbab4cc9e0059604097494d2e815ad73581 - -g_scalar = 0800000000000000000000000000000000000000000000000000000000000000 -r = 0bdec21162bc679298204cb64fcf68e15d2b0ac6c717370e8b5c619c76497ee8, 037248e9d2d4fcb45efb693e3d0e0c8bf9e3fa97e0de1ac56973ccefa63b1011 - -g_scalar = 0a00000000000000000000000000000000000000000000000000000000000000 -r = fe2bc235e52800a089fa443d07d3e75e96e9793ed510053ccf57fca29849e95b, ee52747dc960b0e1217e4005e541e592b5852a49e72222631c208b8c0ac7e740 - -g_scalar = 0c00000000000000000000000000000000000000000000000000000000000000 -r = 69aada7f6d6180a56183291b6ed77d1c62699718e770b20dd3694e2ab20364e4, d53e48d228dc87eed6a2308a7fb96d8dfd7e84567870107751f9054bf185509b - -g_scalar = 0e00000000000000000000000000000000000000000000000000000000000000 -r = 1280aafbed23f0d182293299cdf809af94589aac6656bbe13e858c2ffceac518, 9bfafcccca58cca2d5cb00b340f02322e010a39acfaec17fdeab0c677306e2a4 - -g_scalar = 1000000000000000000000000000000000000000000000000000000000000000 -r = 7be5ed0dc475c1293f06d66c530cb4f3d8772d353381060380802dc91ec34f9e, 0aec44147285bbcab92118c692a1b45ec63d2857c9ff6b4ccb9e3c1931e82b10 - -g_scalar = 1200000000000000000000000000000000000000000000000000000000000000 -r = f82412db37333f2074feaff5e72c2666cb98c3ea2233117dba89095174f9fd77, 4aee7f5ee5034187ca7413a653e62c9f81a497847abb71aacdc3f3af9d271ca0 - -g_scalar = 1400000000000000000000000000000000000000000000000000000000000000 -r = 5ec40582c9a82fa78d5d177c64ff8578982be4fd46700b8b37071afbe8316c45, ad4b4f6fc0c14de6312f39604bbbb74c24e809f49f0312845518e37bcfa86678 - -g_scalar = 1600000000000000000000000000000000000000000000000000000000000000 -r = 2a1ef7d7822e8cc963aa5cca4fd924a2b44de63e08ae4169cf62c250869027b8, 80a30ac6ffd127228c82e7333a87f1ef82842bc04b8636ebe41b37c66eb35f3c - -g_scalar = 1800000000000000000000000000000000000000000000000000000000000000 -r = f3b4962f5f3e6c3e028a81514f3cf2dc6415834bac4ab3aba3d6f4868eb6e843, 1b77791d06871332c31cdd6b9b149ed6437a6d8ae10bce559119ae90987dd2f2 - -g_scalar = 1a00000000000000000000000000000000000000000000000000000000000000 -r = d9025fff8a8af1c635761c8ee1f6176d54c439b0391fa36e2f41e643356317fd, 6babe94f55e3b77f7aedb7c7f54a2ba4bb48dd1395a4745b8c826f3cf7cc4474 - -g_scalar = 1c00000000000000000000000000000000000000000000000000000000000000 -r = 1eb6a9688f95277ca3fd22fbcea3f029965a774094e746409c34b650e16e05e9, 12109c4aacef5cbdea92c1669b840d48ad917201f58f2fee2520a63d7bad84f6 - -g_scalar = 1e00000000000000000000000000000000000000000000000000000000000000 -r = 870ae6bdc2754097035ebe4addc4f080ed400a2232cdc71aee20415c2245134a, 4f6d77b2755de5a2e959fe3e5cfa8ca6f57f1956e4f55982a192e684c048d72d - -g_scalar = 2000000000000000000000000000000000000000000000000000000000000000 -r = b7a23f34b68e19f8d0107914ceaae10ecbe906f04c93302efc189ae71e29a3ef, 3cf0bbf83d44303865591bf64da1711303198c6efcadc9c8e9d875c2efd2119d - -g_scalar = 2200000000000000000000000000000000000000000000000000000000000000 -r = 68a9969c8e2256288644ef1cdfceb8ab862ae25e2ece8f72d32d7cec0094e84c, 79f2826cc85b9705cbd09a659bf0cdb6308a6e1882ba242bdf209e27b3117876 - -g_scalar = 2400000000000000000000000000000000000000000000000000000000000000 -r = ada4cfdd7ecfa8408c94a21ab972da90598d0bf8849be4b7ab293027aad991c1, af9346e9eb8562e0900424eb6a652a557ca617a203219a3493d4b9c0fbcec63a - -g_scalar = 2600000000000000000000000000000000000000000000000000000000000000 -r = f6e29e442433b4c681d700b2c6fa654a9edd11a6b7a82bb80ef6a240c793c0cd, d5dde3b07207c7a0154da1d18488497a8863e0e1ac1d5f51aadd3d5899f01b1d - -g_scalar = 2800000000000000000000000000000000000000000000000000000000000000 -r = 54476778acd2f1b6c92becfa390b3ef2b1643ab5911bc478c3e04d7902381461, bb04730090b0790aee182910b5a13ac32bc1287b2c21c65a8daa0c4d66bf3aaf - -g_scalar = 2a00000000000000000000000000000000000000000000000000000000000000 -r = 574fc2b081704bde30651575aab5306d953939f44ead0fd9d6d8bbd2f2338d2a, f2d45a7b49c99a13ed542a652c51e949e72b8a05eb63f38f3402081f4132f2f0 - -g_scalar = 2c00000000000000000000000000000000000000000000000000000000000000 -r = 17f904ba45b0995e765a50db1a6fd0ffc5772beefdc3a47b83766947d17d4e0b, c8fa426a142fd4d56738d94f46cb1fd9f56db7f3c270aaedcee643832883487e - -g_scalar = 2e00000000000000000000000000000000000000000000000000000000000000 -r = 5090d91f0b80bcb946d480d77119c60ed7799b31b313c052bfe48a8ff43daf9d, 3fdaf62162e1d85a769be02bb1d5928c16e69b4f9915aa0ac94c4c1e873bd7bf - -g_scalar = 3000000000000000000000000000000000000000000000000000000000000000 -r = 389caef34ec5b10982159d07de7d6f2c945353e1b2d4c63aae485bb72b724759, 73429bb9c14208a3816fa3ed83f2405f2dc2cb7edd99de434a8ebb53db65ef14 - -g_scalar = 3200000000000000000000000000000000000000000000000000000000000000 -r = f5aa74e43a64439e577793fce12c68ab07de7ab35133e5a2768978afed08d68c, a2577185ed42cc08a611d41c8ef20f302003ddd41d4459026457d90c4505e9f4 - -g_scalar = 3400000000000000000000000000000000000000000000000000000000000000 -r = 58c8a77ac0d58abd9947c636a9b6e05a8d98277b4a837f6908ed8febd56daf06, fbe185ec38e1eb47ecbd1958e3fb0c5d16cd67c71076d3d3f45496a45f121e4f - -g_scalar = 3600000000000000000000000000000000000000000000000000000000000000 -r = 9bc6c2af18eaf22cf81a4b3e0fd97269d8f158f5d6df29e581ea0bc89b6956e1, 63b4b278d7075e1c4339549d8f2f593c03bbfa0f9251ed45c1d3ce5e6d62552b - -g_scalar = 3800000000000000000000000000000000000000000000000000000000000000 -r = 98fe1c61f5b61d31fd025001b905b499dd4d06aff39e7832b7ef9760ff79d2ee, 08e213122c3832dfa322b09f514eb16d376e3b783009cd9aa9f83980c5f12805 - -g_scalar = 3a00000000000000000000000000000000000000000000000000000000000000 -r = d7d80165dd6861d485715b2edb2589d37b0b8307280d1be142c772b68b61c205, 458ae65ccb0f3654205e28984256ddbb1095adfa3b8abd756235746580870184 - -g_scalar = 3c00000000000000000000000000000000000000000000000000000000000000 -r = beeb3ea58c37888ea76697bd602e90655dc516824ddbc0b6aea68626dc4ad4f4, 6ca1346292cc09fd9fb560949ae44df2e48b820ca35f44841ec4a2f214569113 - -g_scalar = 3e00000000000000000000000000000000000000000000000000000000000000 -r = 782b816e9f5238b55631049161a549b25d485fac31ca379550e1b82c5de1691e, 1b102a8b5984701daecf22dedfce0da0a9ffada33f2952a013f2b973463d034f - -g_scalar = 4000000000000000000000000000000000000000000000000000000000000000 -r = 412c9e1e9fa403a4d1b299b504aea4a9047e2ccde180b2dcb618d590b01e6e27, 178851bc75122b973a1b6fcce668de1949c50136f332b8e388d28a3679407552 - -g_scalar = 4200000000000000000000000000000000000000000000000000000000000000 -r = 4b782ecabc2251e29f1ee33c0910e35e65854fd78777a63d723ee82acb8c9fb4, 838a3cf0c1e978c538fefe60d32301bcf5f641d622da95345a06824d45f07856 - -g_scalar = 4400000000000000000000000000000000000000000000000000000000000000 -r = 720d5901fc5cb4c4f2876026ea269465bee5f33e85425bfe3d16740409d9735d, 59af953a94d4d6172b30b9649be40d5479e30056938b9bc5410357864dac8c11 - -g_scalar = 4600000000000000000000000000000000000000000000000000000000000000 -r = a4fe196b936adcd72b999e56f814d996687afcc16c6ac81b2bba2fcb7bd03b00, e547a7310d5e981fd5dd716dc07c21d2111d82a22d9ab330d7165c2a897d9f1b - -g_scalar = 4800000000000000000000000000000000000000000000000000000000000000 -r = 47f93e8f0d2f339d2df4486ef3b4e2e0fca35bdae5182b8d7f4b55864f6dcecb, 203de9a1f28da96eca2b45f4462b7cf03e07e2bb1c09ae9c471dbd283e36c4f7 - -g_scalar = 4a00000000000000000000000000000000000000000000000000000000000000 -r = 4b5a7b2307c5f1098b5c3d0371c68991750aa51875c77f94fb78df45414657c3, b30352343b2825bbdfd9248609e5e644ff564852517f1beb482484863e7fbdee - -g_scalar = 4c00000000000000000000000000000000000000000000000000000000000000 -r = ffab5705044464f22bac283b351571b3b88e7c47d8d42a028b002254c72340d5, 6616e62a9c8552a942e384cb8242f342e40ef31b1a8c8ca89700dd41addda21f - -g_scalar = 4e00000000000000000000000000000000000000000000000000000000000000 -r = 5ea74c730418d46d3da600eade1864dfc4ae8bbb8b383d060471cf0dac517b4b, bbddf0fe206581d430920bec53ccf2f3729794bcde6e83aed2935c8dbdd0739f - -g_scalar = 5000000000000000000000000000000000000000000000000000000000000000 -r = a35aa23fbf846bbbd43da670d2f74daed61257ce383c8ce9b1e13752fb85fa4c, 50d05aab9bc6d22e34d7f52a3c4aa158f6df8ee0c363473b5e74235d4421fc83 - -g_scalar = 5200000000000000000000000000000000000000000000000000000000000000 -r = 4644b8fb9aa64d9150c9f363b5117831ef6feacd1584fb54adb84fb6c1127e87, a50d957e7a2eedd563de80073a74db77bf746812f4dbe25c7520cb714df7be07 - -g_scalar = 5400000000000000000000000000000000000000000000000000000000000000 -r = 91c3a88a5b6e8c279d0a1f05fd8884e9f1539d9e4c076aa9d334b37c4b8e12cb, 43c450343061cf41d5e6b70871e075d933836e740b98d179b92ea188ba7aa4a1 - -g_scalar = 5600000000000000000000000000000000000000000000000000000000000000 -r = 5e76ec2fd83f56287099228335b50df42b516dd73422c5c118d919e2ba9fa405, 215b92835941e6391d53cef079e691830ee524a532dd167c1b779bf89d2c8ce5 - -g_scalar = 5800000000000000000000000000000000000000000000000000000000000000 -r = 3ff4444fd2ad3a96e5d755618de929cdad07e3c765ba422be4db7c0067eb93d4, 3c1172ef4a9b38d8590a7aa07ef7fa514ebb46fca5534cb835d53ebc71f14e5d - -g_scalar = 5a00000000000000000000000000000000000000000000000000000000000000 -r = abe32380275a9ef53b7cd6098dc0954228abf7b7a9c7d8a5ec69d5a37aed7fc2, 2760436fe662ce524908b1c152c98e5cb143e958be997ffec824b1faa68f9d75 - -g_scalar = 5c00000000000000000000000000000000000000000000000000000000000000 -r = deb035fcce7723a22ca3e0a1d449c1004ff211619adcd4bb4fc56a1be50edb52, e3b01067868e00e93da1a02a95b3c970d15d3b601d9c35c606a90a818855d505 - -g_scalar = 5e00000000000000000000000000000000000000000000000000000000000000 -r = 7c0fd64417a177b5010b2e0df05981da66d63eab9af46f4588f0367ae686a10d, 9cc89067fc5544e084859663ef2c83e10670c8e054a309b866ce10045a78b655 - -g_scalar = 6000000000000000000000000000000000000000000000000000000000000000 -r = 50235a0fdc91927053b2bb803ee35067bc56637b5f29cd078c56e735a64785f4, 8881065b5ec0f80f80400ba5f0f805bac34758318396023b191ab6d8f2c4aa65 - -g_scalar = 6200000000000000000000000000000000000000000000000000000000000000 -r = 2dc1b8bb6885309fb1e70bcfd44571115df7fee1116cd289c547a21465944d7c, a5b5defe5200f553f4e9d93004744d802eb3d19473d8a4193827dfec742dc4f7 - -g_scalar = 6400000000000000000000000000000000000000000000000000000000000000 -r = f1445d07414974411c75d37565dfd734bddc1fd9d5a52b5d45ab2440e4c3c19f, a3ff3123e96dfbb148d9cbd09098f9e90ef785a5b32643dc3fb416769d45f137 - -g_scalar = 6600000000000000000000000000000000000000000000000000000000000000 -r = d1609bf2cd28c8fdc8b4a3a98a9fed30e6959e40b4a07fa19ffe9f1de32e3a6c, b5e1f94bc9fbe1d5d2b32c22031428bbeceec1c7af4b3cb2d046e723b9329392 - -g_scalar = 6800000000000000000000000000000000000000000000000000000000000000 -r = 237c88057388378848d61dc507b6f556b2c6a5f201dbed52cb4f805a3e4e7d6c, daf7d5011bb307bfeb90b445e5c9c0d939feab8df098fe30cdf1b1838fa60a0b - -g_scalar = 6a00000000000000000000000000000000000000000000000000000000000000 -r = 845a882c8859bbc2e883d25ff51993083258a70ad731721eddbead4a788e09c4, 6ab31c3ff968c9f8f6655a5e3471a59f7a47d44bc5145873ff614cc9b13bd412 - -g_scalar = 6c00000000000000000000000000000000000000000000000000000000000000 -r = 4d6eec323a1f89e99267af0a5dee21c6d56850cf6466696a53c474abad6c4e7b, 3d620c8a7f89f8d167d3a4762229b54cc7d35c308d9c659e56dbf513573b08ba - -g_scalar = 6e00000000000000000000000000000000000000000000000000000000000000 -r = d28527c6a3824aa9d34030745566465654a149071f100d40b1b006aebc0d6863, 30a82b3f8ae892685b221411648e40d3abe5a927d3815d8acea8ea167d1daa26 - -g_scalar = 7000000000000000000000000000000000000000000000000000000000000000 -r = 8f12502ee0138997ad364df067b256dfde2d4ad1860b8bfbc370e522cc1b5e83, 03511dcdcba5dba53f89b744d3064ba6e80014adc0bc866a503fa0dc7783920a - -g_scalar = 7200000000000000000000000000000000000000000000000000000000000000 -r = 88a0df625c0cd66e4523b7dcd2c772806d46968e6a3bd9ad34f365ff3405157d, 65ff8cd309c966cc43c7fda55ba4408f83a5028dceda14e831f390f0c4591506 - -g_scalar = 7400000000000000000000000000000000000000000000000000000000000000 -r = 350fed185a914c72b1ead64104f9670908dcf2b70004539e0f58cec54e27d357, aacc0f0d9e66d9a362c306869a449d5145f8b46f46d04ac744f43523c5147854 - -g_scalar = 7600000000000000000000000000000000000000000000000000000000000000 -r = 721595eece728342af86c88034fb313add3f191127a10139823002854cd4d5e2, 60c44e259fe4b513848a5b75cda0ac98bbc4b1385076ae4c561a4d050d3f67ba - -g_scalar = 7800000000000000000000000000000000000000000000000000000000000000 -r = 394c3ca1652f359aa37951abff9f5089563ed687c3db1e5fec79a10fae256721, 4efb24bea05c73001333ccc2feb45e46102c640f0a492130b6ae4cdc253f146d - -g_scalar = 7a00000000000000000000000000000000000000000000000000000000000000 -r = 829bec8ffbbc8adbcaa9b2f496d71f842e0d323fc98fb2ed918ad277a25ed969, d7e993dd450011b77fd50ed4dcc2db1d573f92160504d1ccc5b2d540b0a840c2 - -g_scalar = 7c00000000000000000000000000000000000000000000000000000000000000 -r = 114608474b9883e7e6183976a85cf4eaabd1eb6c8fbb831a86d4cd28294b04f8, 686c24f9f2e55be24ce0258ea8f8753a0cfb6c61aa4f3ea4a3185fe73caef54d - -g_scalar = 7e00000000000000000000000000000000000000000000000000000000000000 -r = 8ccebd9296f0b3dbe251932fabb53deb5f020d8cd37bc364b63fd5141593f8c0, cb327c1a879a9b22e65a7ae03cb0f93933358298acb501e46d0790bb64930db2 - -g_scalar = 8000000000000000000000000000000000000000000000000000000000000000 -r = 9211e489de7f4f8a426eca29484c2ece9c4e7ad63c6341fb197dd46d95a7b1a2, 25f92e470f60e01817286a6e1c3eede82b2c09100657458614997f6ec78ef1f4 - -g_scalar = 8200000000000000000000000000000000000000000000000000000000000000 -r = 0695d25fcba9327ba26e5822d699d95b7a6c1acdf37b2836203a31d5a56c98ef, 0aa018cb90f6f3a69438e11059ada186448060e1e6b21a4055ddc74148431893 - -g_scalar = 8400000000000000000000000000000000000000000000000000000000000000 -r = 95e360666c4165c8b8e2959954327c6554009f1e6d947506e4cf728185967fad, 587c76421d9ba792e3221ff31f0e5f79505f09934933a10d39bf3074a3b3f527 - -g_scalar = 8600000000000000000000000000000000000000000000000000000000000000 -r = 3805f4e7a74465b996976624e2d6122797e8092e1a7c6add2ab55f653e360df9, efa55067d6b676840d99ae5a033531efc006b014a204ed4161223dea0a456eb9 - -g_scalar = 8800000000000000000000000000000000000000000000000000000000000000 -r = c48d07aad919b53f72bfcbbf25a2f91f7112f4122205eb70be6dd7fc6b7733ae, 4e873d9c7d35199d38f52714422d39da24504c146efec5713ea468c126a1f691 - -g_scalar = 8a00000000000000000000000000000000000000000000000000000000000000 -r = ef1117f3334d256570ec0990a1bb0900c512ae94e04e361fbd7055ffbd4132b6, e1ea4cb9efc6827777c9f2d8e753987a771143afc0313b2a53d94be882a88c45 - -g_scalar = 8c00000000000000000000000000000000000000000000000000000000000000 -r = b36ddb5a551266fc72a174550b384fab97c8f9d8b94fdd362441c4c0ca8f86c8, f4d28e65ef714ddc20760054070a8a1f3c306bd0f975bd668ce8a71234127c81 - -g_scalar = 8e00000000000000000000000000000000000000000000000000000000000000 -r = 1f07fd1a9ee01d68891d265bb9f79dc8d31da5b74b957a08455930bfd7425424, eef295c42eee7336a82c0ca3bdc0a6fd2cc99c24d290dccab10911c75da30291 - -g_scalar = 9000000000000000000000000000000000000000000000000000000000000000 -r = e0e5daeb54dd3739389f747caf3c3030703ef60057feea5b805c564631890a36, 4a1bd7b5f95a8c3b37183de2af20bf297e4bf176b5393962fe24a4c3c9c9f155 - -g_scalar = 9200000000000000000000000000000000000000000000000000000000000000 -r = 11a4ff0222e558e644144f890e8ff816669d7b57254db82633e0f086aef314c5, 5abafbd19e0e870c6e29235b0555dacdf757c2592e540c0bc8e5326f243efbe6 - -g_scalar = 9400000000000000000000000000000000000000000000000000000000000000 -r = ac45249aec82d6d8a5e1d3c6e19adb253f01996cbb97d0320130abf38cb5ab31, dacb1586f624faf0efb81538eba8bf94fd211c65b681d483c276ef2e5cfbfdf6 - -g_scalar = 9600000000000000000000000000000000000000000000000000000000000000 -r = c738cbcb5a8e43bad9f6002307a003ad81351ce14ffa84fabe1b922b396fae20, c9d2de063135f1936737fe3e62b46bfbf10047a165d1817db5465ec8c9defa53 - -g_scalar = 9800000000000000000000000000000000000000000000000000000000000000 -r = d723ad15da12d3f14aa86124ac83299759198011fda9f625e8ffb637410eaba3, e8d872c4801b2b3a921c79f249602f98ad3084c9edba98ac55ddc53f2da6810c - -g_scalar = 9a00000000000000000000000000000000000000000000000000000000000000 -r = 5bddf84d01fb6ab7717df9c3adcedc68fbe6587456a7fbaf7cc7479be15036a4, 159078eac888fcc8901b2bf9c90c29bb7b7efae9324861aac330a36e5c6c7f9e - -g_scalar = 9c00000000000000000000000000000000000000000000000000000000000000 -r = 0617a8dfe008a218c2700de3e39cfdf9d6b37e5eadb39a5c5e6afed1778930bb, 4b39280254b5248bbf2813099a8fa83410bffb7b65fe50a73e994417ebf1e6ae - -g_scalar = 9e00000000000000000000000000000000000000000000000000000000000000 -r = e19854ec7a29e8cf8765ed78b03c224b072454d8cf4f0b1b746bf4ffcd5eb860, 6869db2586f038ea0c2bf32a39d92c4f42598a6fd2621444499a1924aae5d08d - -g_scalar = a000000000000000000000000000000000000000000000000000000000000000 -r = 6372def79b2bafe8b18e2c1354107588281fc8dd7b87f257a83b969946191d3d, e3bcefafe42700aa1eace32d84310cf43f2dd4b756167a3fdaf4bb480d8972ca - -g_scalar = a200000000000000000000000000000000000000000000000000000000000000 -r = 9e15ebed69c53ab58cb605eda605ea2cb0766c76159bb5814ecfd1490d4d367e, f704a6321f2c0b3344ed22ea847dcbed8da47d36c3dd99d1f5b16de3f0516372 - -g_scalar = a400000000000000000000000000000000000000000000000000000000000000 -r = 3b082784ac9daa213e9231dde959e9257f81bfeceb104d11989cd51d81ffd706, d3bb418ca5f9a35c8e72fb72f2813e703d3f6638c14faed9e28e02ff027f1a57 - -g_scalar = a600000000000000000000000000000000000000000000000000000000000000 -r = ed37bac889c8cd093feb1494b52fe95b30df23d4bf8ad1baab45ff2f3b264155, 1d59a9bc917e7b53af4db00969712c98aa54ea60a5eb3223d4cc02f4e78aebca - -g_scalar = a800000000000000000000000000000000000000000000000000000000000000 -r = 3eb44ebaa26cfda9ec294f9bd82e3b0c7adcdc636cfec330698970dcc1c88910, 6702ce3ff233fd7ae6b382ff1868400da4d780cd8c7d34ed2f488c9ca79ee104 - -g_scalar = aa00000000000000000000000000000000000000000000000000000000000000 -r = 6fd044f86e7c58d93fc322e9763408262abc70bfac2a8c9eacd17f62a70bedca, e351f3762a24e6bf71049b174d8d3a774afa5a849cb3f817584c4855c17a97d3 - -g_scalar = ac00000000000000000000000000000000000000000000000000000000000000 -r = 03e6e884142b953fcf6e45c2f0b7938f042782b6c788822f7caff2a8dd7f4788, 63fc02447f948e02f548a883d347cc7b1e5b425236cb6b7ac6b32c2f748f7fbc - -g_scalar = ae00000000000000000000000000000000000000000000000000000000000000 -r = 541f1c670f8d83510a4f0dce10075d18a773c212de55a51ab85d636205e61d13, e7d652a370ffcdc3de32e541a473b58679b8353f2d2041f627ce3096f0c12a9a - -g_scalar = b000000000000000000000000000000000000000000000000000000000000000 -r = 35e8048ee03c366502e23d41dfc6514aa5db5ab62ea604675fe5691ed785e73d, 1343d185dbd0e40fe8cacc6e2c6646b828ec3b4584ce1a5a3f8b118f1adaa0f8 - -g_scalar = b200000000000000000000000000000000000000000000000000000000000000 -r = d8e96623f2e1ed0f96c490c17b199bba4831540870192a511fd78414f227c4a5, ce0bae6ef7736b606a626da351e5f48aa91730a91e569bed63cc47ecde7e0cf3 - -g_scalar = b400000000000000000000000000000000000000000000000000000000000000 -r = ed1b755f2815d3cf2138d71106187ec35898b1930650dd7ce81907220b4ebbfe, 4c7fa9337d3ab5d5aa78724c853652b08a7c8ab93a11682f54155e144f394514 - -g_scalar = b600000000000000000000000000000000000000000000000000000000000000 -r = fb909a74cc54235e35059c6f94d6bfbf9aa5d2c1bd5a35267217348749af1daf, b0be2db59a9947bcf853ecbfbae332d526883fe01b998b9831bfe5d7f389e929 - -g_scalar = b800000000000000000000000000000000000000000000000000000000000000 -r = 12128b2fd412db03d45acfecc1c397c7110ef147732ebbe02e605d97ce76aebb, d05746ae395ac2650a9295d2a0cb6962eba2732db2236813027ef0992a4d35e4 - -g_scalar = ba00000000000000000000000000000000000000000000000000000000000000 -r = df8df34707ba78f463d2778a91308c54034c07d0eaef09eb0d13b0393524a32e, c7de1146399c30471b4eaa5f7343cb8bb17f477a56f9244daadb189f64900000 - -g_scalar = bc00000000000000000000000000000000000000000000000000000000000000 -r = 570f50b9ade5e185d379afd6bbac1e92f1ca3c3639b1290c6b3eda297e866baa, 3f62e47b7d386fb0a919e766cfad95ba9a8729d3a8c1ab808daf3d6fff88f997 - -g_scalar = be00000000000000000000000000000000000000000000000000000000000000 -r = d9b588174709218a1980177d765796027ca43bcb2bc83e9c14dd8c3678ffb696, f904a4e4e73a0a3b5964a6a9a7f6f77a5becb8a8987c8bc5829b009167c19b38 - -g_scalar = c000000000000000000000000000000000000000000000000000000000000000 -r = b37b515f042eeec8d64cd42d9c875d9a1a1db7e49924182ae5d7f844caaa358c, 55a481c08236ca007dee410259b7e17efc322ed9e206eff34d4dd4097b165fbe - -g_scalar = c200000000000000000000000000000000000000000000000000000000000000 -r = 1e6f624584d42c5a9fd11c23e1b2374586dd7cdb056b372c9a7bfb76f3086c58, 0c3468b965d25df2d1f1563829563068d8d156ab799b8fa8b0efc8b0f47a92b2 - -g_scalar = c400000000000000000000000000000000000000000000000000000000000000 -r = def3204ff622e0f51e7dfc2f11b5036e56aceaa0609c4809389ca9c3b1d2d491, 9eb080e2c4003d74e3667bbc9d705924eaa2dc67b712a88a4e2efa93d2feb754 - -g_scalar = c600000000000000000000000000000000000000000000000000000000000000 -r = ac2244a68510d43ed03eb697c84cbed4e8e7b7e5495fac838defc208af8cb7e5, 748620b2ee30108ffaa231090d98ee944ae45533797fe8e4bf2d0c017b291e8a - -g_scalar = c800000000000000000000000000000000000000000000000000000000000000 -r = 3b2b115548841c4bac23208fd26485e9f65a3640454ef41ff86d13f9e149e73f, 55867cb65a7240c065e50b02fd8a798096500e3972b44b056e922c0653e1fa12 - -g_scalar = ca00000000000000000000000000000000000000000000000000000000000000 -r = fbede0865908334ae1e330f9c70cbc1a87382d6f40abd3c3eb3a10b1e94b9d1f, 3dd4bd39d7699c15f1271203bb2ddcdeae155b4e9f004328e4550b34ddfd4514 - -g_scalar = cc00000000000000000000000000000000000000000000000000000000000000 -r = db88c71bbeaf13bc07a69a30ef6276ed02b0c293cb37d658dc2d1be24becfdb6, 7802d95d4f739cddb7061f336fcffe88c2e36dce9c8cd8d7d4386ef5c97ffe33 - -g_scalar = ce00000000000000000000000000000000000000000000000000000000000000 -r = af06ff2bd95601e3e6b95f2fdee3d5596a0d1bea32ab6a5c6b768e347d563eb6, 89fc97a1a530cf2eb04215b861ba7a5be0c5018bd089f8f22cef2c735f8a91b2 - -g_scalar = d000000000000000000000000000000000000000000000000000000000000000 -r = 956b31e003c45e52a078868ef78edd391571580605d6297b8c885312c23fc975, 8b37b6344c14a975419227b47e2f2598c8d5dc3a0c7e673f470275d5ff7b33a6 - -g_scalar = d200000000000000000000000000000000000000000000000000000000000000 -r = f7ae11128858d4bd081e8fb419b8ae87f8b465db160c6066244bf1db2540eb02, 622f8ffb2a8430a2b4db4ec54ae887dda6c90d66a15f5e44945a36fa107b1802 - -g_scalar = d400000000000000000000000000000000000000000000000000000000000000 -r = 7e8caa24bbb577974f1bfe0fde5e42def5eae8c7f89acdaff3022fb6e646703a, 1c51897148de3dd703c995b69226c8fd51e066afd52bf3e445eb9c742c570f45 - -g_scalar = d600000000000000000000000000000000000000000000000000000000000000 -r = 726cd1b8f826237f899ae92398f41b6f681817c7c9c515ff302c3cfad169508a, 9bef669a5f57c92a2fca18c156cdf1c5f848d43a7aceee1628cc5ca8b512b56a - -g_scalar = d800000000000000000000000000000000000000000000000000000000000000 -r = 2cd615404fa3c57214f08f32b806bbb3c97bf51d0ffac3078f75eab499646d05, 474c7d9f869b581877f70bfb6411ef40835934552e3fdb09f80d50762a913b60 - -g_scalar = da00000000000000000000000000000000000000000000000000000000000000 -r = 44e6235a685fa8c247bd7309a9de5fa66db2fee880a40b64c0b8debf4aa4d144, f7cc4793a3e6270753724b3609098e94764b9d140c4f3dcb35155aa0affeb7d9 - -g_scalar = dc00000000000000000000000000000000000000000000000000000000000000 -r = 3027a162030cd7c2ba74f8354822722008faee4e603bb73e4565f9a834ddc625, ef1b14b212342d60ebf809f9d37f37579b8ee17af351af8448c6c7ecf72ca3a3 - -g_scalar = de00000000000000000000000000000000000000000000000000000000000000 -r = fe35f5c66e9d40a301eee42e3d4f9f3ec28f13ad81f4f013096bb45b738230f3, e46ffbebbabc0d7430ec627d406e1bbdb1843e7fae23b141e72c7d734e0177a1 - -g_scalar = e000000000000000000000000000000000000000000000000000000000000000 -r = 9f40ac3bae92032334e5d0dcb987a24a5e0e8c3e803e25dcd0667ed68b11888c, 7ef1ec27c47bde35491ccd7cda64f1b7a128bf926b6328f95463de9534e0f63a - -g_scalar = e200000000000000000000000000000000000000000000000000000000000000 -r = b9c9c244af407478c96adb0c950359af1d0243f09da21539499d4934d78d5664, 9a9f02b9c6f6ac05800b3daa30d0ea90d96d68a41e822ee4d77655971b5fe2fa - -g_scalar = e400000000000000000000000000000000000000000000000000000000000000 -r = bca14b180256394e833badcb026fbed49d4cac5be7b7f4d976fdb4d8d72905a3, ec67af7ed909d15e2699e6ab07111f87b3ebaeeb6de16ae709eb7554d2dfa217 - -g_scalar = e600000000000000000000000000000000000000000000000000000000000000 -r = 9e84b1429d952dea1a5702fde822c43a6440a71137d7a6d5b1a124a2e982371a, 40f7881d6809e7a532e57be2f72c9bb32b9547bdf3b8c6b3f9a25a6e707ef853 - -g_scalar = e800000000000000000000000000000000000000000000000000000000000000 -r = 5774d975adf3dd428b24580ccbb8bfc2082ec7feeac69a05a84eadc3c6f859bb, a4f85e5d69dddf30f442b4315724f6090a8b1fdeb62b2057f302f1c1fb18545c - -g_scalar = ea00000000000000000000000000000000000000000000000000000000000000 -r = 18b7629228d8a479ef8c3fc19f7258a24084cd681c0bfed585b4a7b6c5b52828, aedaaaf8428b0efa574f47076250e4f54fae49a87cab5893d7a01feafbe6fc5f - -g_scalar = ec00000000000000000000000000000000000000000000000000000000000000 -r = a9269757ad6c71aecd89a9d614befaa9c670d56c86853eddeff93c2d3edf7a05, a4f07fcdd7acca82ab3fd51b72ae50a26d356b17b15f40fa3be313ca58770e90 - -g_scalar = ee00000000000000000000000000000000000000000000000000000000000000 -r = b5ed7a9125881c7719ff07a13ee17b6081df350185faadc70c267dd0ae0c2b14, d40ec72633c833eacaede52ecf0b134aa9c47e6a2dc783cc117d3230ba9c4cab - -g_scalar = f000000000000000000000000000000000000000000000000000000000000000 -r = 80f1a439c929319d7a3a6453d4fb689735dc136663621bc1a857240fa36a2737, 50d7c67d372ab09cfb0d49241e01d0efb0b537668078c5ebfc18274bf8cb0ba0 - -g_scalar = f200000000000000000000000000000000000000000000000000000000000000 -r = 728fc5136ff083f3eb5c80bd85a5f16d33075ddccce277ec4182e4aa4bf75924, 20458e590c1c99290a8dffd60ac0fea619539bd3c1195aeca3c78e8fbf7992ab - -g_scalar = f400000000000000000000000000000000000000000000000000000000000000 -r = c02fe1c417b27af67e00049f9ab0deefd6ef61aff90e37bb06c9f96c6e75e767, e3d3f45da588df43db9829701886b5db90f3e6f2dad02337c82cf700840ef4dc - -g_scalar = f600000000000000000000000000000000000000000000000000000000000000 -r = a883f42917abdea70042d1b7833a576b51a3fb710ce3673f85d05386724c3c80, 5e930c0875653ecc219a96afb9fae1b9eeed99c9b88a535b4b07e8b02f551714 - -g_scalar = f800000000000000000000000000000000000000000000000000000000000000 -r = 5f2f286449c33aa7ac7d0e1c1fb049783f46e326ce433bc6dfffa17e057a3df0, e52d864891f945f1ac7e4c217bc5dc88eb665d859a96d81e40b2e8e311715d42 - -g_scalar = fa00000000000000000000000000000000000000000000000000000000000000 -r = a8b7e8a7068a16707ae69dc317ec34c204b86de7b0a0125589502abd170b0b8e, b5ab8a1239d9ffbb7093e3672489a8e4ccf0516c9ea9316ef31c6e9512a2b866 - -g_scalar = fc00000000000000000000000000000000000000000000000000000000000000 -r = 7d6dbe6556c0f8f08208e6ce3c650c05791a0732e423b40f16ff861277c713f8, c8f21b5d95a05c5219d877e66d0740e53df5baaec2d1bdfb50fdc2c38cd2bcf1 - -g_scalar = fe00000000000000000000000000000000000000000000000000000000000000 -r = 8ec353c2064ebf7c5df16fb0f8867456296c7b9e57af9e532eabd53494b13f3e, 849f2f20957c715f0b11793fbb0250eabf97c7146277a093361518688f5b87db - -# g_scalar = n - 128 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324d1 -r = ad311f2c46d5a6173749bba4b3ad9db57ef2b6b9ac62ff5463c5cb817a2ad62a, 05c72cde13ff7e780755d9928a294ec74b90150dc987cb0048857f783d00c492 - -# g_scalar = n - 127 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324d2 -r = 15fe6a86904a36cf6072a061ae619f2870e9016cdddfd92836e84bb6dee35b41, 898a6ddb541c3eb52f57786dbb0bfc0d02e3b569f529fd2f6549697409ffa69a - -# g_scalar = n - 126 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324d3 -r = 6941195b752838c39a7d703660ab52e9519a47b4807a9d289c9635be52bf127a, 6e5b1591deadea0aa0eac0a955c921d27ba60a90ad89e8e79f0041d18f259ec0 - -# g_scalar = n - 125 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324d4 -r = a9fe2396bb85b9cb04b76d2d1ed32559f72dab6d225733faaab54cfc93740130, 4e9295063c01443fae23a053eba00f2add6dc6c5a860c31ded74f2db40dde60f - -# g_scalar = n - 124 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324d5 -r = d8c0472156db126649b1dfca7f1412750a10ed1576d7996d10f264bc85fc00a2, 7bb713506fed7602646b3b52b3661bc6a727afaf1b226fa5bc20540c32897bc8 - -# g_scalar = n - 123 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324d6 -r = 2d7ca4d8f1e354871783d1b6917e47255a71497198a5ea8c62ea859803b58b02, 5146fbe29618773ba78f8d93e91c1fd525fb337771e800abc0964b2b64b2bcdb - -# g_scalar = n - 122 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324d7 -r = 62280f9a573fbfa8bf357e0c9358983ad183a961caf64cbd536eeea92f4ff97a, 855c4c324d5efb4eb39466ab42ae06fa9156ba434e6fe2c2ffe25e48816e894c - -# g_scalar = n - 121 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324d8 -r = e1a8d418f77f10e127d2bf4f683b30d1d71602d5b0e5fe2014d7251a8c03e3f4, 517c6326f166afa4550b2b1e6cc6b78d00ce7b7c25f5b6695b6be5e1895f1528 - -# g_scalar = n - 120 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324d9 -r = 9c7ea21245a2473fb62aaf7c37e7454e094e7ddf4f6ab73a6ebdb7bcd0303ba4, 2ff813865b858eaeb732ea74d3e14abe65d87563555fcb68358918ab6b772fc9 - -# g_scalar = n - 119 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324da -r = 6ed0b988157b7f562be22ba0f3a49fb4062afb7c1e314dde87af199e6cc47305, 0120efea019118fd2817ebc7f0984aebe82d639c78848b687e9d30afd29ac026 - -# g_scalar = n - 118 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324db -r = 4977379654d7a19e24869d65bb07ad54f8f1d8415512ec1c24c00de93f5f68a6, 363b29c5671a649e930698ea3ad859a98be407f6fc437719fb0ca82e0f9e3121 - -# g_scalar = n - 117 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324dc -r = bbdbec7d79af29b17890e8d54796883355a3bb1ad9699e9208e4c4901b620dc4, d3208079bb7f001d623ccc6d0598d7a3af3092ef526e5caf6d8af218c1ae1e43 - -# g_scalar = n - 116 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324dd -r = d8f1fc5f6a92b9aac9f08a5659cb1b6e4b3de89bb2f5f79c87f9793bc9826344, 56375b4ad46ea8260f93d3738fab65a8ac3cf4429a47f0e979ca80614beda6a1 - -# g_scalar = n - 115 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324de -r = 7c3ff661d8ecca6e8a2627c4851b5bc7f15b920fa8dfce56ad19e039119f6cab, 16a226267767de4e237207aa01d0b6c8a94893a9455bc4d84622d40d2a0a4a40 - -# g_scalar = n - 114 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324df -r = 08e2f429f216dc997afec8bb9b4e920c18849f8ebc30d62c751e03f0216f7c55, 43f113786db22eac69467bebf560798e684a695fb28407b8a1a2207de2933cc1 - -# g_scalar = n - 113 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324e0 -r = 734e0d078a2b0d3acc3a5ecb983538693289e86e10ec0d40a125e6c1b7ebcb88, 9e27df61b60c5ac32ec3356f8b80e6130594324f879f89461f26d165ae6ccc9f - -# g_scalar = n - 112 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324e1 -r = 71704d008938c16745ab5a4d7832ba0c94e258f604a428f26a9505760a99cbca, 9afff3da3868c5bf18fcad9782c9827fa90146d23ff14df8246854f10774748f - -# g_scalar = n - 111 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324e2 -r = 0cf804d77a9b6a20098f37bb0832c416327dac318072f08dd87f4ae086653aa8, 0650f5316fb2b8cfd8f5233a8eb74ecae33f2b325dc50598b463abc75981de8c - -# g_scalar = n - 110 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324e3 -r = e7009ee6652405a945ae78ba39dcab99b1fc8c8c23fbbe6e76fbedb5a463fbad, 86735660b10c81c4d8f38f9391b7bf0ea89eb6f180fff6a9465703a073face17 - -# g_scalar = n - 109 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324e4 -r = 3720b2475548de20e7b092174df861f4fd4f61e491ae8d13aec63acbdd10edd0, a02511c5e354ed39f329dd451478676618dd6277a93299f250be67b8140c2087 - -# g_scalar = n - 108 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324e5 -r = 9d873705000a079bd1a8678742e1cbf414d147984d7df1ff2871263f72371e17, f2993035b4a2be93f71aba0e4ec1d4b6c9cc69948ff6b195c580b52a1fe001ff - -# g_scalar = n - 107 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324e6 -r = ee206023efce1a7028f9cdebe9f6e8773571e4d1592ce3342ca0ba9c3796f4c7, 332816bd7158ff3f1ff7fc61fd21d00ed8ab1bdaf58097834dea61f7489c9623 - -# g_scalar = n - 106 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324e7 -r = 7145405dff1765ecb81f9fb1279df6ff750c11bbc098aefac4c398cc1e628b51, d9d0fc13f8a85516a344f964fc017053ec8de7db843d8108c3c279e27c551e90 - -# g_scalar = n - 105 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324e8 -r = 680d5abf65e03a86c08ec1602b1d28fdcb11125c02a9ba44de6ddcb77b371390, 2c292eed1161aed1b1cb924f8e340368378fa836c431801a2a1384440acd87c6 - -# g_scalar = n - 104 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324e9 -r = 1d6de36b734fc1b835d2293fc7ac3efa90ee46554c2a623582d0020682c4bd6a, 9456d43421a5f33f8a51077588462f7b00330a1f9ede82116b953c403008a7a7 - -# g_scalar = n - 103 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324ea -r = f51ec8724c3c386f57670e41bf619241d0a875e919f7f72c564bdda6c71f8d02, ebd64e0651e2c128590519f6cf5b06dba2086ca0d79e990cff513e61174082e8 - -# g_scalar = n - 102 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324eb -r = 0fcaec0ffecf6fedce33e49cdd3dac5cf5284782e9f60f1841a6fe768f9b4748, 5d88925f7be836710c2cb707df01871c9bba0433a436d55c35e31ecf5ab1203b - -# g_scalar = n - 101 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324ec -r = e9b1c23914da499e6a610374c569a602bbe914d3b99cd026b7a96e0a4ea6fdf7, 6b3161f424574039a575eb9bb418886c8cedae7e90de97834a090f01523e6566 - -# g_scalar = n - 100 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324ed -r = 55401274eb1385f3f7ac46733fe90a2ffe49233161c52cf8b9a17db9bf61fec5, 9c41619a5e8eabde955f973dcfab730b5246164a7a4539485a247ad3dc02f970 - -# g_scalar = n - 99 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324ee -r = bc438ae1a4e65b07650522fd4a9a3b17b1f1abb66a7b43712d037bf83f9432b4, b598c01eab0329a6fc5c3d3846700b4c854a75c18aafc1b9ce4a815d7b96c3fb - -# g_scalar = n - 98 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324ef -r = a6eecf308794885e74b44206ee3751becc8715abbc82a095d5192c88589b69ff, 160fb32bdb3d1cef94a20aa01c6f25a45c067c89255b379b5fa5855722f31c4b - -# g_scalar = n - 97 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324f0 -r = f1ae5380578181c7ee848e1d2566805eda8cdb78397e43f4dc90323bafceb64d, e042b8efac30c1977ba880e0cd9f48987a0b263ca4974818d2384719638f3883 - -# g_scalar = n - 96 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324f1 -r = 11eddf7fd0a0da0d14f356cc6abc354d6d490a4b19dd329b802b8d2333e12b70, c0d5874bdbe5d48ffc4b733b83d6435d02d0b07402fda7ece1df7cd727802e27 - -# g_scalar = n - 95 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324f2 -r = 76a8f9fea974291f9a127f2bcaa12d0d6684ad762b346fd2263e039bb308cc40, c0d6c024d3290bc711e4e34acbbbaa5e9ab66367f3a2445f37fdfb649755e61b - -# g_scalar = n - 94 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324f3 -r = bf87ea83037278d9c87bdb8203d41796955ef205d59848ebc82a7aefd2df5e7a, effe0727227a558507158615205669f83ffd79279beca88e3a7da59c78e65157 - -# g_scalar = n - 93 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324f4 -r = 0581b4711fdf24984a278686e16396070aeaca9afd36b1af64cfdc70d9453d29, bca53b986ab0044d0093e587065d7ad0df4fde3d20de623a7dd6f1dac29e092d - -# g_scalar = n - 92 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324f5 -r = aee309e543ae4336e4c8417839093801a8a38bc31487c5269d7127d76294ba47, 2eabd7a5d0554d6cb58df8a2808cbbd566d652b270b744ed2b4ed8c66ca6daf2 - -# g_scalar = n - 91 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324f6 -r = 0211de8fd56927054a39f02bbedd4f4727113bb4ae6a94b8d81ad9386982f865, b58f5407a3aab12d0575a464f4b95a60dcab8e619dc803972a78ec739c36d096 - -# g_scalar = n - 90 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324f7 -r = 8307d5cb55648a4cf3df44ded7ee64b747305b7483e904469af9d782de992e6e, 1b7a46f1b63f495f52cd6b04e3cf65a65400a94bda2c0211ac894fe71d88d7f5 - -# g_scalar = n - 89 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324f8 -r = bd88aca74765b8053ea123446310eb5a62d51e29fd54487dc1ee6264a7eabe67, 8eaf07808dee1bbb854b622df60670659bfc7708c4600010484d7b41eb0496e5 - -# g_scalar = n - 88 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324f9 -r = 948fb3f76932e6311707165bb939f40fabeee3e9369a60677d81fd488418cae4, 272c826ad87a68e312a307d236ee7b83420e89f073806245ffa5e2001542b971 - -# g_scalar = n - 87 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324fa -r = 2bd0204360826caa041252997f6b0670b856664a2d4b409b516329ff7b4d8b2c, 50b6f7d92a300ea9570bc654f91a71c132f843cc3dca2a93fef1add99e22434e - -# g_scalar = n - 86 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324fb -r = a9ea1b80f80e4b9023fb74270b4af06e783b9ba6744a6528dd5c2b8142a18dc1, 1936c4cd310249e36560fb0f17515082b5d4a12b82101ae4aa68a609123590c7 - -# g_scalar = n - 85 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324fc -r = abfc8457b5e11eff36bf2f65ea65641aef617e0025af76773646b0dd7e1ee314, ea68ae1c1e34514244ff9951e0d7dc96316e11d9febd7ee46672053e70ee6d49 - -# g_scalar = n - 84 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324fd -r = 2f83a889ca881f6c10b429a2811a47eb2cd0bab9941a27e9b7f1695a43020eec, b34c3ec9490c9fcc20b8be58e46613a098064580d1ba344eda9c3a6f097c176f - -# g_scalar = n - 83 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324fe -r = cf3086e87a243ca4f87abebf2ab80485125d4714ec67199a2c9ee62dc3363a22, 680ffeccb849b41bfac95c624e639ed9a164e9eea9da5528a3ad4fae39b1f622 - -# g_scalar = n - 82 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324ff -r = 8d97fd53554fa366b932d0c17527465559d18be925a81aef80ee662fad29cf9c, e709e0c2210c0663b689ed9ce704fa51be5b8e1c16cfb90d52a34db8328762e8 - -# g_scalar = n - 81 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632500 -r = e0beeb1aebff18d3b097c711165c6e4c8e9d0af402ba3183d3a5d81fc63d5e79, 8530bbe517a43ebb3424024630d6f2e05fd243be901a4d62019a80ecf7fe6c84 - -# g_scalar = n - 80 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632501 -r = c0bfffc45263832a2074213db27de57335ff9aa8b5f86a2c492bdc0752b3e584, d66a6e625b32d9a0ad495e8c6ddf0bd7e4fc828b4cdf1404dbd63dd5e2b639fa - -# g_scalar = n - 79 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632502 -r = 5ed556aae89327fc58f6428165f89e14dd306e2a05176f8ba40206d330ff0e92, 48a20a12e6e5bde12f8c8f3bafed7c8af685ab0166dd84e93d4e78f507cde447 - -# g_scalar = n - 78 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632503 -r = c0e78a3897536f3f711f8b7f7b5065a47e96610365013b3aade6af11a6ab1ecf, 07420d147b8b2f3815ddbf3310694b8cbf84005f4dfeec8eb74bc763b9bbdc2c - -# g_scalar = n - 77 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632504 -r = db15e4963d5baeb19c30c6422b2f9c49719a87be5a0ec9ce0a2193bfc266f85c, 7ab236296aefa062d4b0f38788146b15b877add5d160244d7c3cec641f2c8cde - -# g_scalar = n - 76 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632505 -r = 1558fe4c7ef5b48a7c703717cd1823b4285bed3c21848f49cd331464c89bdd46, 64c4fbfa6c47c1bb11b7d9566c81e45cc039199f2b805c34e6399fdfaf1512a0 - -# g_scalar = n - 75 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632506 -r = a22f8fbea42fd1f6f123716223af72e0cfa8ca0e2a7aa6ab616d2c02fb760095, db5e421d2f3dcfd31867f8588fba9581841e60f312bbc857af8d8a74870c2fbf - -# g_scalar = n - 74 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632507 -r = d176448e35b23e27b00eea8a5d34f708294b12e1ca1b04e046ce85a9e25a441e, f5b7aa6fd05e42d1883ad28aae66872ef3ba1ad34c400037a3177ac6d447f106 - -# g_scalar = n - 73 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632508 -r = b2dacdf66ef82fce794922ef17e29b1a2b34a7dc096fb852ae8f8fe1eeb03d1a, 3c68daace507d78859926dada17d2a4c478e459d1bfa35f62472337e0bd6ee11 - -# g_scalar = n - 72 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632509 -r = c3b025a015b15144eb5d0c75f38fae9cb1ee4879a360fb557331369679c1e3b1, 9032f3437f65f90efc9714e0d1bd7c1ee45f347463a2d195cc52acabf23bf9fb - -# g_scalar = n - 71 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63250a -r = dd421b5d4a210364f94aa89b40750d0149c7cb94fc05804bf19f382e92aa7864, a8b3384c6c87986fee06b8196932fa8dfcf5ee6122b50e13a932ffe1c620c98d - -# g_scalar = n - 70 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63250b -r = 100392dc78c04937681d690f2b3a8c597263de1539f76b817c5a2a14f58a379a, 3986c52c191d0c4f63391dd5d8365d152ee51bd352fe7d1bf81a1717a4106ac5 - -# g_scalar = n - 69 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63250c -r = 49d3ad05548efa2ac856868891e9ae0987986a54361bfe259e5da11cc5e79347, 92c84e04ab904134ded953aac5722ed96415f2f1d9aa2eb06784f9780b14a309 - -# g_scalar = n - 68 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63250d -r = 031195d5bb4a44b9b2cdb039f99c55fec35d34e70dd71fab8732d5cd6a93954d, 0996fb4dbff36b9dbbf2136131f073cd448fb8cc84a8207e455c80a2f7599f37 - -# g_scalar = n - 67 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63250e -r = e8218ad07de96a54fc88362a891ea186c16d0c52a48a4ddd86f04d3b51f9c391, 02a6281365709d2721c138d73cf5695ffa50ba96f99df517d38ca53ed0cc5085 - -# g_scalar = n - 66 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63250f -r = 78ed4fe6e3a7de485a7e384de42f8cb2a3cfa7fd44b81977c7c6e4d1c4ce250f, 4edcb865c16f620563fccbb48aaab052aa6edf9c2f0a44d556dce373161a8e35 - -# g_scalar = n - 65 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632510 -r = 01628c4706b6090abf639ed67765765e79527db7ba66f4b9dc2306ebfcdbb2b2, 82f6953ad0e8b8b0d36f26730c1faa29cc34896f459a60b999149d0e46a84b5e - -# g_scalar = n - 64 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632511 -r = 95fb8394569b38c77da70b83c2c61e01380a0913089f73b9db6d96f305968b80, d698dfbaf17bb6907fef5b5f87bdb407708d94477051507d65c39aed7f1201d0 - -# g_scalar = n - 63 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632512 -r = 0763a43482fc568d95c376329182cb26039c4800f0518eedb8d3d9319ff91fe5, 6f7895fdbf6a64906d4083706edcf21f536746d07db17e688f83fb2ac7c18945 - -# g_scalar = n - 62 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632513 -r = 0dbcb03ae539b413177aa4c02089a2336ed7e061ed58f5a7e535f175a1962f91, 949f2fffca531ff722b800677eb416119b8d1a1197f98fe11c23bdb144cd1c71 - -# g_scalar = n - 61 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632514 -r = 994a44a69b8335fa71cdf6537eceb50a59556621a9404f843667eb1a7f4c04cc, f2e4387e78d4240d499a7b9925bb445db8c3a980112bcaf2280507e624146496 - -# g_scalar = n - 60 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632515 -r = d40c4ccdbc6f9915026f8fe2671c39bc33fc23364189d9c7dc1e6828ed8a6e19, fb7dfef5441b17ce3bf5fb42b0ae5269ed39ae60dd5200d3505eca4407f18a35 - -# g_scalar = n - 59 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632516 -r = 4c2bab1b8add53b7cb9727eaa2d17c362100d5d3a8d063d169d44ed65c46aa8e, 5f9db666b904857599ae08fe831b88078875032d57c814155f7b16f3eabd98fb - -# g_scalar = n - 58 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632517 -r = 305f725f648d02cdd66fe3b67ed78be199cac80de4299aaff26c00e8a7ea82f0, f9c8b66aa998b8bfe854a9d241a004c1058facc2859ce652cc12e43b9dc04de4 - -# g_scalar = n - 57 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632518 -r = c13298306acf8ccc068212e3fd1eaf381bfeea57c7385b293ec832e77acaca28, 25bb3938fffe89da3a54d9cd386485fea8b7f9f3499e87d546f60d24d55361a6 - -# g_scalar = n - 56 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632519 -r = ba3f0c4a7451ae636a84438514600044bb1ff3ca9556f36a8fc441407e8d7a14, 7c6d897dfd93d3f8b165a43d5b4a6953fe1f247a4e0ddeb420353da4e0650cd5 - -# g_scalar = n - 55 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63251a -r = 5cee8449a7b730dd0deb0e4a46c814c131eea5bf07ef5be6258bbbf9e7305683, da17febf0eb30c0c3d3095977f1ae735118a607961d8594b154b6a3a5fe7d421 - -# g_scalar = n - 54 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63251b -r = bb8a0feaee26c851c1286ff925c4d56c4f2e512ef8557c5fa0425b8eb212cf53, e5aa91bf156a6a15c20d885be2e6c94e811f3bbc189d9a553d708f2d1829ef81 - -# g_scalar = n - 53 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63251c -r = ec3a318d306634b0912e8beda8c8acd95f9c3fc492f2467997359638546c4d8d, 045e25a5bcb9ad7d4eaa432d23501e68c247d091addeec0d7fe980be3ce34d9b - -# g_scalar = n - 52 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63251d -r = 88f77f34d0e5e542905a3201c67528b72e0ec469af45f9c02692f36e83445904, 810d0dd863f0f073a3d8feb464413c61dc46d152dd20ca9d098572d6a79b9783 - -# g_scalar = n - 51 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63251e -r = d20ebe0d5c3fa443da1deb852f4318d4e20bc0ba1e5edf3f508cec1c3b3f64c9, 28ce1c7b5d0ab3d3665a1dc27d97e39d9e0eaee4a1e5a09ac8f4b1588cdbe15c - -# g_scalar = n - 50 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63251f -r = 0dceb8db2b7eaba7edfbe268d5b1fa6aa78bfbaa136852780fb9c2d0488c171a, 282cbe6a3c9d73edbc488e9433ebc5b91021851a5bbb636940617f76651d48ef - -# g_scalar = n - 49 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632520 -r = abdbe6084fb7db2bff4cd0b228766127ffe7048453dc690921950b421ff6acd3, 2c6bf8800db805cab2870a6d087e7127d9eb82d90b9ba4a57c836dd7a1eef617 - -# g_scalar = n - 48 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632521 -r = c8403902470343ad1a1baaa76d8805bda7496529bbd803a06b34413077adc612, 7a103815becda33e578a0a31ad628a1cf4d9280548273a48c60a6099e8a5200e - -# g_scalar = n - 47 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632522 -r = 4b969974eba78bfd6b20afec715af2c70a624fa936c83906283c7513caa76097, 64400790922202d9fb7e62aea2126c2b646bb1f0845135ecddf8aa3326de29f1 - -# g_scalar = n - 46 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632523 -r = cec684c3a42931dca1030d5babf825e0785c339aa06e9eba4075b5b149ee90d9, fcc25cc63e48079ba8374d3faa087ca2babce29aa54bc0d4bd549d363ea7919c - -# g_scalar = n - 45 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632524 -r = e94f7d346d8232781b1e8ae057477f580032940b946c6e181ee426ccd5cd79bf, 28c53400d326194b88d109213807f37e3adabb9708d4cc5a38b8346987d45de5 - -# g_scalar = n - 44 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632525 -r = 5f3425f6a98dd2915f0e2046e381d3b0009194abb29110fbecfd7c1fd55a897c, 149d606ec7845bd6c685db822962cbe8fbdcbb94b4f7c480405f99788cf2af25 - -# g_scalar = n - 43 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632526 -r = 179c85db3db01994b7d9ad900574598180c5bfb4878873fa4ff23ffd248a7d06, b886a0af6a4d2260616e32c45a195ce7b27d2fae15231a5745be4f9d9e596993 - -# g_scalar = n - 42 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632527 -r = 649c89ce5bfafe43c2e2594c30a92f8fa155cbe31da6a5c75fb35ccfed2bad01, 0c57301b764382c3b4ff4df46f9feb3064ca69ef0cd3af512ea799821600da85 - -# g_scalar = n - 41 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632528 -r = 98100a4fdb01614feeca111539ce22716fdfe0b56f072822624d60492ed22e91, 08f40112fc77b5853988cda6e2a826314906b2d2378165b8494f255d5ca39d70 - -# g_scalar = n - 40 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632529 -r = 462d7b0075f732278909984c66f2728083200f0bdf25e13ce4d7681db82e9f3e, fcb999ec2e558fd154da915ca10abca68b391e74c954e3cb26f45e770d9ae867 - -# g_scalar = n - 39 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63252a -r = 5853e4c4363186ac068f237d16fb36646f5ae714ff0b9346a9d89488a059c142, f3f43f1996e6dbf8b8479b051eb184e3d13b589a7e7d77891d2782dc9c3ad067 - -# g_scalar = n - 38 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63252b -r = adf0c7dc7c603d6c7463fd85222ef33b512331170fe948ce8a2cc3ca4d63c0ee, 265b3d7e637f3cb342557b2971a6ce6333554ca740c7fbf6f13cd2c401889a1a - -# g_scalar = n - 37 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63252c -r = 2763a387dfa394ebc5748baea677d806b636458c7f178d5500467bc58cce08b5, a74c9ebb9dff775809c1431aeaa7b9d3185225c290df27af5ed4bb7582c31449 - -# g_scalar = n - 36 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63252d -r = 3569656cd54a3dc30ae4cb10d257576ec691d0bd1b06c57f3d5e58d6a8219bb7, b7f461ed22925adabaf53f451dae5f396cb17d2de9d401ec1a1451426b325fc5 - -# g_scalar = n - 35 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63252e -r = ca640b8642a3e5210b8e4134efc2b4c8742ee464233e76b7fd16847fdec67ef5, d456fe9c744b8508db1b54ed94dc8508cec3cff4ab87ad2a9ac5fe6f73149556 - -# g_scalar = n - 34 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63252f -r = c982ddd4dd303e645b0673a375678d94caa7a5c6a391849db6ab20147ca23cd3, 5ea6eff2a8f28b08388ccd5cc3a96bd9445d34e19078906d0284fff4a249068e - -# g_scalar = n - 33 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632530 -r = 33ec6868f044b10cac09c4ae65578ab985ceae7c4b68f103871514560f664534, 4e93bcfb3cd09c3c06f69fb089c0ea8baaf62ed8a7b82a10953b7cd4c5713e0e - -# g_scalar = n - 32 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632531 -r = 39227077695532a4bc6d6a58fead0197befd904c4079dfbfd8c5fccfc5e3a3d8, 9dce286c6a6e3d5c846963e55265d1bf81bb649cb7f566f7f61dc1922410bd0a - -# g_scalar = n - 31 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632532 -r = 948dc4f8b1fc87b48ef5689d3cf7600ddd3cf7e7473017e6e2f73c696755ff89, 0c75176db284b8bb05131202f367fc03d26de35e67149fd72616017eb15acd66 - -# g_scalar = n - 30 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632533 -r = d0288cb552b6fc3cc5f4d6cd3ac77acda3a14e49b44f65a1b4241cb13298b343, b9f2ba30ae9fe08e299825c864c55bbe498aaee2f94064b52a3373d0e3fbf543 - -# g_scalar = n - 29 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632534 -r = e266f95948603d48944a70270317b9e2f1be963a0d9258805e5db46acb66e132, c867ebd4d5c41de5756996c688839e606fb8dbb95d04e75c6724998ca3df7766 - -# g_scalar = n - 28 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632535 -r = e97f6b6af2aadb9797082ec0cfe153eb7323cb2830a6a8924b523eb7172ccd1f, 564b339fbfa7ad88b59774b7d2f348e1595806397fb4d597e2c2c6c12e57c25e - -# g_scalar = n - 27 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632536 -r = 9f8aa54b2ef7c76a49d2c9eb084ffdd7d36a42d7aebf7313042c2af497e2feb4, d2bcef9627b421cfd2682ef78714b344c42f3991224804a76dff4845f676a18f - -# g_scalar = n - 26 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632537 -r = 994baaa855f2fb101ac7c5eb857ff6fbe6c9267ad8b1753861e4ad32ed1f8008, 12e87fce2ed1a539eb021684a056bb0aa5c676759d753af77b30eb1ee2db7fe7 - -# g_scalar = n - 25 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632538 -r = 966742eb65432a2ee395993332f1f3af6fc1b49eed6b67b0a4a319acd837879f, 846b723ba9086698edf977a63648ce1169339ceebc0bc6afb47236014b699dd7 - -# g_scalar = n - 24 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632539 -r = f97b232f2efc311561d7cbf91d2b469f6d0d755040dd9a356d3883b215d02819, a6a23aa0358c847689960fce6c348afeee15b6b7775e1ca95aae28af4db43438 - -# g_scalar = n - 23 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63253a -r = af2cea7c1727bf42d0825fa2a358406937c7a7e89e2e1f6ef4f876532de45068, 7c2f97836f889991b7f971ec8e53d08e1a025b64d8d660b5fc9f5b0461b87a56 - -# g_scalar = n - 22 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63253b -r = fdc777e8e93358a46a0b0685d2f8ba3dc99ffa23e3912a9a0fc611352f6f3076, 86c172f7a2a32f8c6216e825eac5ca4a9bf3d296b2dc015b6b587844cabea0fb - -# g_scalar = n - 21 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63253c -r = ecead9f4c16762fc6d2a506c5a3f3b3074e1b2654783f47d562e4cecc135b208, 3f792a0d36b8805d858afdc18053d65be4f052407c44c39e0d622b4d1d791a46 - -# g_scalar = n - 20 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63253d -r = e2d1eeb6fe5bfb4e048099d95dd283ba5916868f0f862bdc8a979129d2337a31, a11efb1d3a011f306e9e3ac07556a1995d2b13e9000034517d10e3be877bffa2 - -# g_scalar = n - 19 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63253e -r = fe545c282897c3fcb8842277752c41ac68363aba25e1a16efea912baa5659ae8, 08df11d992eda6857a99a1641c6af73ea7f9dbb60456883ad2c9161823b39694 - -# g_scalar = n - 18 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63253f -r = 675abd1b6f80ebdaa6f247ab412e29794afc964d8f8b403e5f3e51c856ada97a, 93903825fafdc6b3d9d96d80e47b8445b4d5a35170b0f4c3995d428da1b7a5e2 - -# g_scalar = n - 17 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632540 -r = c1a35c0a6c7a574eb0f139752cfe2dfff17624b6ac0a177b97091dcbd53c5c9d, 142aedd8cd8b3c30d0b1db80f2e77c44fa8a40d0176347f1dd82ceb96c186678 - -# g_scalar = n - 16 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632541 -r = 54d63c809103b723d5ef2f7c2c83f5495882e0753ffe2e6b808b0b650bc6fb80, 9b12084cfe101de0aa3b9dc44ea7f161c98f3ce7b4f49a780d0ee429ad5dc064 - -# g_scalar = n - 15 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632542 -r = e2aa0e430ad3da09ee337424e481937003cc23ee56e27e4b72bcd8b7bc60055b, dfbde8f48f86520c9b1059218875b8682899caacbd5be4dabf47adb09c7c3ba2 - -# g_scalar = n - 14 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632543 -r = faae7332fd12c72e1717bf54c6832660126e48f77f9707e3a242a35bb0cf664a, ead8f922d155e445171be6c1d59a182441d6a9627cddc83dd84ad24866a2a794 - -# g_scalar = n - 13 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632544 -r = 738477ac5395b759bcbcd43f559e98110e356769856fd30dccc425634b2ed709, 043f789536184869832f9bdd42e0a43e978b7c708bd12d1cca8ad46f3ff11e80 - -# g_scalar = n - 12 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632545 -r = 4ee1df77cb83e1562409d29dee37385eabdedef5ca345a3304b71aa7d2697768, 800a8369acdc7536d7dd730575219299e8f12d0a3576a9c8f353ed26e344a4bc - -# g_scalar = n - 11 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632546 -r = 3e7090f1649c90731ff3a4158dac1ab59de407956e7fdfe0ea7d260a6245e404, 976cffdb1eda4772f3f25576e1529bc2daf06c621a809e37e5897a9ed46bb177 - -# g_scalar = n - 10 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632547 -r = cc61c94724b3428f737d2cd648250b4998f9868a0fcf81392c18dbd19dc21ec8, 878e65aa14c4b54ba082d29a88641a2d3bc5766fc7c041f7f3d4bf877f226189 - -# g_scalar = n - 9 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632548 -r = e05b3080f0c4e16b2cc09c0444c8eb00abe6bfed59a7a84175c96e8f264e20e8, f799a631027ca065d491fe65774ed0e5a950841331a2ba1ce14888855ba0cceb - -# g_scalar = n - 8 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632549 -r = b763891eb265230d8f90f02af02cfc6b462ab5c56f9b345527f14cd19499a78f, a913ed0c88f9208aedc3847b419f440fde1ccd83306145ea0a625c56acd2b688 - -# g_scalar = n - 7 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254a -r = 13ba5119c3123e03f43eaab50c23bb082bd20213d23c00f70746354ea0173b4f, 151226e991dbf799106cc4238836be6a98bd0d0ea2598422d7b82fcfc0a462b2 - -# g_scalar = n - 6 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254b -r = 13074b5954213673d50a961a5b17a3ad55ae744f346cee3e403947373e77664a, 5b366e91b5f808a10bdb2bb3109c60eed663d4ad5200eb4a6c2c9ddf2c881bb4 - -# g_scalar = n - 5 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254c -r = c9079605890523c8941cb5aad076c20c90ec649a94b9537dbe1b8aaec45c61f5, 8c5f8943d22e16eacabf56788185e0978c3a97111a1477d414cf64b51845b0ef - -# g_scalar = n - 4 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254d -r = 577362f541b0176b0cdaacace8100af24650a6edc623c17374b0b50d46918dcc, 7b4eb3c5b3a5479d9493c9211a222dd1e89d7b8f05290bb8d2690db31b345459 - -# g_scalar = n - 3 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254e -r = 26936a3fb6ff747e66ad77dd87cbbc98b027f84a087d81fbffac3f904eebc127, 2a0f95d51a7833f9877df7cee5d11671a7c1b853f79e01e54fb3a3e0367c5814 - -# g_scalar = n - 2 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f -r = f6bb32e43dcf3a3b732205038d1490d9aa6ae3c1a433827d850046d410ddd64d, 873a88adf5a475c5e65704f16dfbd241ead3283514dc9007d0c9b72c9e411e5a - -# g_scalar = n - 1 -g_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550 -r = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p256_point_mul_serialized_tests.txt temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p256_point_mul_serialized_tests.txt --- temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p256_point_mul_serialized_tests.txt 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p256_point_mul_serialized_tests.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,13 +0,0 @@ -# Similar to p256_point_mul_tests.txt, but tests point decoding and point -# encoding too. In particular, the inputs coordinates here are not Montgomery -# encoded, but the inputs in p256_point_mul_tests.txt are. - -# Regression Test from https://github.com/golang/go/issues/20040 - -p_scalar = 2a265f8bcbdcaf94d58519141e578124cb40d64a501fba9c11847b28965bc737 -p = 04023819813ac969847059028ea88a1f30dfbcde03fc791d3a252c6b41211882eaf93e4ae433cc12cf2a43fc0ef26400c0e125508224cdb649380f25479148a4ad -r = 044d4de80f1534850d261075997e3049321a0864082d24a917863366c0724f5ae3a22d2b7f7818a3563e0f7a76c9bf0921ac55e06e2e4d11795b233824b1db8cc0 - -p_scalar = 313f72ff9fe811bf573176231b286a3bdb6f1b14e05c40146590727a71c3bccd -p = 04cc11887b2d66cbae8f4d306627192522932146b42f01d3c6f92bd5c8ba739b06a2f08a029cd06b46183085bae9248b0ed15b70280c7ef13a457f5af382426031 -r = 04831c3f6b5f762d2f461901577af41354ac5f228c2591f84f8a6e51e2e3f1799193f90934cd0ef2c698cc471c60a93524e87ab31ca2412252337f364513e43684 diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p256_point_mul_tests.txt temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p256_point_mul_tests.txt --- temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p256_point_mul_tests.txt 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p256_point_mul_tests.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,1665 +0,0 @@ -# Scalar Bit Pattern Coverage tests - -p_scalar = 00 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = inf - -p_scalar = 01 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 - -p_scalar = 02 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = f6bb32e43dcf3a3b732205038d1490d9aa6ae3c1a433827d850046d410ddd64d, 873a88adf5a475c5e65704f16dfbd241ead3283514dc9007d0c9b72c9e411e5a - -p_scalar = 03 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 26936a3fb6ff747e66ad77dd87cbbc98b027f84a087d81fbffac3f904eebc127, 2a0f95d51a7833f9877df7cee5d11671a7c1b853f79e01e54fb3a3e0367c5814 - -p_scalar = 04 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 577362f541b0176b0cdaacace8100af24650a6edc623c17374b0b50d46918dcc, 7b4eb3c5b3a5479d9493c9211a222dd1e89d7b8f05290bb8d2690db31b345459 - -p_scalar = 05 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = c9079605890523c8941cb5aad076c20c90ec649a94b9537dbe1b8aaec45c61f5, 8c5f8943d22e16eacabf56788185e0978c3a97111a1477d414cf64b51845b0ef - -p_scalar = 06 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 13074b5954213673d50a961a5b17a3ad55ae744f346cee3e403947373e77664a, 5b366e91b5f808a10bdb2bb3109c60eed663d4ad5200eb4a6c2c9ddf2c881bb4 - -p_scalar = 07 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 13ba5119c3123e03f43eaab50c23bb082bd20213d23c00f70746354ea0173b4f, 151226e991dbf799106cc4238836be6a98bd0d0ea2598422d7b82fcfc0a462b2 - -p_scalar = 08 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = b763891eb265230d8f90f02af02cfc6b462ab5c56f9b345527f14cd19499a78f, a913ed0c88f9208aedc3847b419f440fde1ccd83306145ea0a625c56acd2b688 - -p_scalar = 09 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = e05b3080f0c4e16b2cc09c0444c8eb00abe6bfed59a7a84175c96e8f264e20e8, f799a631027ca065d491fe65774ed0e5a950841331a2ba1ce14888855ba0cceb - -p_scalar = 0a -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = cc61c94724b3428f737d2cd648250b4998f9868a0fcf81392c18dbd19dc21ec8, 878e65aa14c4b54ba082d29a88641a2d3bc5766fc7c041f7f3d4bf877f226189 - -p_scalar = 0b -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 3e7090f1649c90731ff3a4158dac1ab59de407956e7fdfe0ea7d260a6245e404, 976cffdb1eda4772f3f25576e1529bc2daf06c621a809e37e5897a9ed46bb177 - -p_scalar = 0c -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 4ee1df77cb83e1562409d29dee37385eabdedef5ca345a3304b71aa7d2697768, 800a8369acdc7536d7dd730575219299e8f12d0a3576a9c8f353ed26e344a4bc - -p_scalar = 0d -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 738477ac5395b759bcbcd43f559e98110e356769856fd30dccc425634b2ed709, 043f789536184869832f9bdd42e0a43e978b7c708bd12d1cca8ad46f3ff11e80 - -p_scalar = 0e -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = faae7332fd12c72e1717bf54c6832660126e48f77f9707e3a242a35bb0cf664a, ead8f922d155e445171be6c1d59a182441d6a9627cddc83dd84ad24866a2a794 - -p_scalar = 0f -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = e2aa0e430ad3da09ee337424e481937003cc23ee56e27e4b72bcd8b7bc60055b, dfbde8f48f86520c9b1059218875b8682899caacbd5be4dabf47adb09c7c3ba2 - -p_scalar = 10 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 54d63c809103b723d5ef2f7c2c83f5495882e0753ffe2e6b808b0b650bc6fb80, 9b12084cfe101de0aa3b9dc44ea7f161c98f3ce7b4f49a780d0ee429ad5dc064 - -p_scalar = 11 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = c1a35c0a6c7a574eb0f139752cfe2dfff17624b6ac0a177b97091dcbd53c5c9d, 142aedd8cd8b3c30d0b1db80f2e77c44fa8a40d0176347f1dd82ceb96c186678 - -p_scalar = 12 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 675abd1b6f80ebdaa6f247ab412e29794afc964d8f8b403e5f3e51c856ada97a, 93903825fafdc6b3d9d96d80e47b8445b4d5a35170b0f4c3995d428da1b7a5e2 - -p_scalar = 13 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = fe545c282897c3fcb8842277752c41ac68363aba25e1a16efea912baa5659ae8, 08df11d992eda6857a99a1641c6af73ea7f9dbb60456883ad2c9161823b39694 - -p_scalar = 14 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = e2d1eeb6fe5bfb4e048099d95dd283ba5916868f0f862bdc8a979129d2337a31, a11efb1d3a011f306e9e3ac07556a1995d2b13e9000034517d10e3be877bffa2 - -p_scalar = 15 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = ecead9f4c16762fc6d2a506c5a3f3b3074e1b2654783f47d562e4cecc135b208, 3f792a0d36b8805d858afdc18053d65be4f052407c44c39e0d622b4d1d791a46 - -p_scalar = 16 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = fdc777e8e93358a46a0b0685d2f8ba3dc99ffa23e3912a9a0fc611352f6f3076, 86c172f7a2a32f8c6216e825eac5ca4a9bf3d296b2dc015b6b587844cabea0fb - -p_scalar = 17 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = af2cea7c1727bf42d0825fa2a358406937c7a7e89e2e1f6ef4f876532de45068, 7c2f97836f889991b7f971ec8e53d08e1a025b64d8d660b5fc9f5b0461b87a56 - -p_scalar = 18 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = f97b232f2efc311561d7cbf91d2b469f6d0d755040dd9a356d3883b215d02819, a6a23aa0358c847689960fce6c348afeee15b6b7775e1ca95aae28af4db43438 - -p_scalar = 19 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 966742eb65432a2ee395993332f1f3af6fc1b49eed6b67b0a4a319acd837879f, 846b723ba9086698edf977a63648ce1169339ceebc0bc6afb47236014b699dd7 - -p_scalar = 1a -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 994baaa855f2fb101ac7c5eb857ff6fbe6c9267ad8b1753861e4ad32ed1f8008, 12e87fce2ed1a539eb021684a056bb0aa5c676759d753af77b30eb1ee2db7fe7 - -p_scalar = 1b -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 9f8aa54b2ef7c76a49d2c9eb084ffdd7d36a42d7aebf7313042c2af497e2feb4, d2bcef9627b421cfd2682ef78714b344c42f3991224804a76dff4845f676a18f - -p_scalar = 1c -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = e97f6b6af2aadb9797082ec0cfe153eb7323cb2830a6a8924b523eb7172ccd1f, 564b339fbfa7ad88b59774b7d2f348e1595806397fb4d597e2c2c6c12e57c25e - -p_scalar = 1d -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = e266f95948603d48944a70270317b9e2f1be963a0d9258805e5db46acb66e132, c867ebd4d5c41de5756996c688839e606fb8dbb95d04e75c6724998ca3df7766 - -p_scalar = 1e -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = d0288cb552b6fc3cc5f4d6cd3ac77acda3a14e49b44f65a1b4241cb13298b343, b9f2ba30ae9fe08e299825c864c55bbe498aaee2f94064b52a3373d0e3fbf543 - -p_scalar = 1f -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 948dc4f8b1fc87b48ef5689d3cf7600ddd3cf7e7473017e6e2f73c696755ff89, 0c75176db284b8bb05131202f367fc03d26de35e67149fd72616017eb15acd66 - -p_scalar = 20 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 39227077695532a4bc6d6a58fead0197befd904c4079dfbfd8c5fccfc5e3a3d8, 9dce286c6a6e3d5c846963e55265d1bf81bb649cb7f566f7f61dc1922410bd0a - -p_scalar = 21 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 33ec6868f044b10cac09c4ae65578ab985ceae7c4b68f103871514560f664534, 4e93bcfb3cd09c3c06f69fb089c0ea8baaf62ed8a7b82a10953b7cd4c5713e0e - -p_scalar = 22 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = c982ddd4dd303e645b0673a375678d94caa7a5c6a391849db6ab20147ca23cd3, 5ea6eff2a8f28b08388ccd5cc3a96bd9445d34e19078906d0284fff4a249068e - -p_scalar = 23 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = ca640b8642a3e5210b8e4134efc2b4c8742ee464233e76b7fd16847fdec67ef5, d456fe9c744b8508db1b54ed94dc8508cec3cff4ab87ad2a9ac5fe6f73149556 - -p_scalar = 24 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 3569656cd54a3dc30ae4cb10d257576ec691d0bd1b06c57f3d5e58d6a8219bb7, b7f461ed22925adabaf53f451dae5f396cb17d2de9d401ec1a1451426b325fc5 - -p_scalar = 25 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 2763a387dfa394ebc5748baea677d806b636458c7f178d5500467bc58cce08b5, a74c9ebb9dff775809c1431aeaa7b9d3185225c290df27af5ed4bb7582c31449 - -p_scalar = 26 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = adf0c7dc7c603d6c7463fd85222ef33b512331170fe948ce8a2cc3ca4d63c0ee, 265b3d7e637f3cb342557b2971a6ce6333554ca740c7fbf6f13cd2c401889a1a - -p_scalar = 27 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 5853e4c4363186ac068f237d16fb36646f5ae714ff0b9346a9d89488a059c142, f3f43f1996e6dbf8b8479b051eb184e3d13b589a7e7d77891d2782dc9c3ad067 - -p_scalar = 28 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 462d7b0075f732278909984c66f2728083200f0bdf25e13ce4d7681db82e9f3e, fcb999ec2e558fd154da915ca10abca68b391e74c954e3cb26f45e770d9ae867 - -p_scalar = 29 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 98100a4fdb01614feeca111539ce22716fdfe0b56f072822624d60492ed22e91, 08f40112fc77b5853988cda6e2a826314906b2d2378165b8494f255d5ca39d70 - -p_scalar = 2a -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 649c89ce5bfafe43c2e2594c30a92f8fa155cbe31da6a5c75fb35ccfed2bad01, 0c57301b764382c3b4ff4df46f9feb3064ca69ef0cd3af512ea799821600da85 - -p_scalar = 2b -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 179c85db3db01994b7d9ad900574598180c5bfb4878873fa4ff23ffd248a7d06, b886a0af6a4d2260616e32c45a195ce7b27d2fae15231a5745be4f9d9e596993 - -p_scalar = 2c -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 5f3425f6a98dd2915f0e2046e381d3b0009194abb29110fbecfd7c1fd55a897c, 149d606ec7845bd6c685db822962cbe8fbdcbb94b4f7c480405f99788cf2af25 - -p_scalar = 2d -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = e94f7d346d8232781b1e8ae057477f580032940b946c6e181ee426ccd5cd79bf, 28c53400d326194b88d109213807f37e3adabb9708d4cc5a38b8346987d45de5 - -p_scalar = 2e -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = cec684c3a42931dca1030d5babf825e0785c339aa06e9eba4075b5b149ee90d9, fcc25cc63e48079ba8374d3faa087ca2babce29aa54bc0d4bd549d363ea7919c - -p_scalar = 2f -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 4b969974eba78bfd6b20afec715af2c70a624fa936c83906283c7513caa76097, 64400790922202d9fb7e62aea2126c2b646bb1f0845135ecddf8aa3326de29f1 - -p_scalar = 30 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = c8403902470343ad1a1baaa76d8805bda7496529bbd803a06b34413077adc612, 7a103815becda33e578a0a31ad628a1cf4d9280548273a48c60a6099e8a5200e - -p_scalar = 31 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = abdbe6084fb7db2bff4cd0b228766127ffe7048453dc690921950b421ff6acd3, 2c6bf8800db805cab2870a6d087e7127d9eb82d90b9ba4a57c836dd7a1eef617 - -p_scalar = 32 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 0dceb8db2b7eaba7edfbe268d5b1fa6aa78bfbaa136852780fb9c2d0488c171a, 282cbe6a3c9d73edbc488e9433ebc5b91021851a5bbb636940617f76651d48ef - -p_scalar = 33 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = d20ebe0d5c3fa443da1deb852f4318d4e20bc0ba1e5edf3f508cec1c3b3f64c9, 28ce1c7b5d0ab3d3665a1dc27d97e39d9e0eaee4a1e5a09ac8f4b1588cdbe15c - -p_scalar = 34 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 88f77f34d0e5e542905a3201c67528b72e0ec469af45f9c02692f36e83445904, 810d0dd863f0f073a3d8feb464413c61dc46d152dd20ca9d098572d6a79b9783 - -p_scalar = 35 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = ec3a318d306634b0912e8beda8c8acd95f9c3fc492f2467997359638546c4d8d, 045e25a5bcb9ad7d4eaa432d23501e68c247d091addeec0d7fe980be3ce34d9b - -p_scalar = 36 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = bb8a0feaee26c851c1286ff925c4d56c4f2e512ef8557c5fa0425b8eb212cf53, e5aa91bf156a6a15c20d885be2e6c94e811f3bbc189d9a553d708f2d1829ef81 - -p_scalar = 37 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 5cee8449a7b730dd0deb0e4a46c814c131eea5bf07ef5be6258bbbf9e7305683, da17febf0eb30c0c3d3095977f1ae735118a607961d8594b154b6a3a5fe7d421 - -p_scalar = 38 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = ba3f0c4a7451ae636a84438514600044bb1ff3ca9556f36a8fc441407e8d7a14, 7c6d897dfd93d3f8b165a43d5b4a6953fe1f247a4e0ddeb420353da4e0650cd5 - -p_scalar = 39 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = c13298306acf8ccc068212e3fd1eaf381bfeea57c7385b293ec832e77acaca28, 25bb3938fffe89da3a54d9cd386485fea8b7f9f3499e87d546f60d24d55361a6 - -p_scalar = 3a -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 305f725f648d02cdd66fe3b67ed78be199cac80de4299aaff26c00e8a7ea82f0, f9c8b66aa998b8bfe854a9d241a004c1058facc2859ce652cc12e43b9dc04de4 - -p_scalar = 3b -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 4c2bab1b8add53b7cb9727eaa2d17c362100d5d3a8d063d169d44ed65c46aa8e, 5f9db666b904857599ae08fe831b88078875032d57c814155f7b16f3eabd98fb - -p_scalar = 3c -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = d40c4ccdbc6f9915026f8fe2671c39bc33fc23364189d9c7dc1e6828ed8a6e19, fb7dfef5441b17ce3bf5fb42b0ae5269ed39ae60dd5200d3505eca4407f18a35 - -p_scalar = 3d -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 994a44a69b8335fa71cdf6537eceb50a59556621a9404f843667eb1a7f4c04cc, f2e4387e78d4240d499a7b9925bb445db8c3a980112bcaf2280507e624146496 - -p_scalar = 3e -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 0dbcb03ae539b413177aa4c02089a2336ed7e061ed58f5a7e535f175a1962f91, 949f2fffca531ff722b800677eb416119b8d1a1197f98fe11c23bdb144cd1c71 - -p_scalar = 3f -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 0763a43482fc568d95c376329182cb26039c4800f0518eedb8d3d9319ff91fe5, 6f7895fdbf6a64906d4083706edcf21f536746d07db17e688f83fb2ac7c18945 - -p_scalar = 40 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 95fb8394569b38c77da70b83c2c61e01380a0913089f73b9db6d96f305968b80, d698dfbaf17bb6907fef5b5f87bdb407708d94477051507d65c39aed7f1201d0 - -p_scalar = 41 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 01628c4706b6090abf639ed67765765e79527db7ba66f4b9dc2306ebfcdbb2b2, 82f6953ad0e8b8b0d36f26730c1faa29cc34896f459a60b999149d0e46a84b5e - -p_scalar = 42 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 78ed4fe6e3a7de485a7e384de42f8cb2a3cfa7fd44b81977c7c6e4d1c4ce250f, 4edcb865c16f620563fccbb48aaab052aa6edf9c2f0a44d556dce373161a8e35 - -p_scalar = 43 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = e8218ad07de96a54fc88362a891ea186c16d0c52a48a4ddd86f04d3b51f9c391, 02a6281365709d2721c138d73cf5695ffa50ba96f99df517d38ca53ed0cc5085 - -p_scalar = 44 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 031195d5bb4a44b9b2cdb039f99c55fec35d34e70dd71fab8732d5cd6a93954d, 0996fb4dbff36b9dbbf2136131f073cd448fb8cc84a8207e455c80a2f7599f37 - -p_scalar = 45 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 49d3ad05548efa2ac856868891e9ae0987986a54361bfe259e5da11cc5e79347, 92c84e04ab904134ded953aac5722ed96415f2f1d9aa2eb06784f9780b14a309 - -p_scalar = 46 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 100392dc78c04937681d690f2b3a8c597263de1539f76b817c5a2a14f58a379a, 3986c52c191d0c4f63391dd5d8365d152ee51bd352fe7d1bf81a1717a4106ac5 - -p_scalar = 47 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = dd421b5d4a210364f94aa89b40750d0149c7cb94fc05804bf19f382e92aa7864, a8b3384c6c87986fee06b8196932fa8dfcf5ee6122b50e13a932ffe1c620c98d - -p_scalar = 48 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = c3b025a015b15144eb5d0c75f38fae9cb1ee4879a360fb557331369679c1e3b1, 9032f3437f65f90efc9714e0d1bd7c1ee45f347463a2d195cc52acabf23bf9fb - -p_scalar = 49 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = b2dacdf66ef82fce794922ef17e29b1a2b34a7dc096fb852ae8f8fe1eeb03d1a, 3c68daace507d78859926dada17d2a4c478e459d1bfa35f62472337e0bd6ee11 - -p_scalar = 4a -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = d176448e35b23e27b00eea8a5d34f708294b12e1ca1b04e046ce85a9e25a441e, f5b7aa6fd05e42d1883ad28aae66872ef3ba1ad34c400037a3177ac6d447f106 - -p_scalar = 4b -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = a22f8fbea42fd1f6f123716223af72e0cfa8ca0e2a7aa6ab616d2c02fb760095, db5e421d2f3dcfd31867f8588fba9581841e60f312bbc857af8d8a74870c2fbf - -p_scalar = 4c -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 1558fe4c7ef5b48a7c703717cd1823b4285bed3c21848f49cd331464c89bdd46, 64c4fbfa6c47c1bb11b7d9566c81e45cc039199f2b805c34e6399fdfaf1512a0 - -p_scalar = 4d -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = db15e4963d5baeb19c30c6422b2f9c49719a87be5a0ec9ce0a2193bfc266f85c, 7ab236296aefa062d4b0f38788146b15b877add5d160244d7c3cec641f2c8cde - -p_scalar = 4e -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = c0e78a3897536f3f711f8b7f7b5065a47e96610365013b3aade6af11a6ab1ecf, 07420d147b8b2f3815ddbf3310694b8cbf84005f4dfeec8eb74bc763b9bbdc2c - -p_scalar = 4f -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 5ed556aae89327fc58f6428165f89e14dd306e2a05176f8ba40206d330ff0e92, 48a20a12e6e5bde12f8c8f3bafed7c8af685ab0166dd84e93d4e78f507cde447 - -p_scalar = 50 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = c0bfffc45263832a2074213db27de57335ff9aa8b5f86a2c492bdc0752b3e584, d66a6e625b32d9a0ad495e8c6ddf0bd7e4fc828b4cdf1404dbd63dd5e2b639fa - -p_scalar = 51 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = e0beeb1aebff18d3b097c711165c6e4c8e9d0af402ba3183d3a5d81fc63d5e79, 8530bbe517a43ebb3424024630d6f2e05fd243be901a4d62019a80ecf7fe6c84 - -p_scalar = 52 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 8d97fd53554fa366b932d0c17527465559d18be925a81aef80ee662fad29cf9c, e709e0c2210c0663b689ed9ce704fa51be5b8e1c16cfb90d52a34db8328762e8 - -p_scalar = 53 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = cf3086e87a243ca4f87abebf2ab80485125d4714ec67199a2c9ee62dc3363a22, 680ffeccb849b41bfac95c624e639ed9a164e9eea9da5528a3ad4fae39b1f622 - -p_scalar = 54 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 2f83a889ca881f6c10b429a2811a47eb2cd0bab9941a27e9b7f1695a43020eec, b34c3ec9490c9fcc20b8be58e46613a098064580d1ba344eda9c3a6f097c176f - -p_scalar = 55 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = abfc8457b5e11eff36bf2f65ea65641aef617e0025af76773646b0dd7e1ee314, ea68ae1c1e34514244ff9951e0d7dc96316e11d9febd7ee46672053e70ee6d49 - -p_scalar = 56 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = a9ea1b80f80e4b9023fb74270b4af06e783b9ba6744a6528dd5c2b8142a18dc1, 1936c4cd310249e36560fb0f17515082b5d4a12b82101ae4aa68a609123590c7 - -p_scalar = 57 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 2bd0204360826caa041252997f6b0670b856664a2d4b409b516329ff7b4d8b2c, 50b6f7d92a300ea9570bc654f91a71c132f843cc3dca2a93fef1add99e22434e - -p_scalar = 58 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 948fb3f76932e6311707165bb939f40fabeee3e9369a60677d81fd488418cae4, 272c826ad87a68e312a307d236ee7b83420e89f073806245ffa5e2001542b971 - -p_scalar = 59 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = bd88aca74765b8053ea123446310eb5a62d51e29fd54487dc1ee6264a7eabe67, 8eaf07808dee1bbb854b622df60670659bfc7708c4600010484d7b41eb0496e5 - -p_scalar = 5a -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 8307d5cb55648a4cf3df44ded7ee64b747305b7483e904469af9d782de992e6e, 1b7a46f1b63f495f52cd6b04e3cf65a65400a94bda2c0211ac894fe71d88d7f5 - -p_scalar = 5b -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 0211de8fd56927054a39f02bbedd4f4727113bb4ae6a94b8d81ad9386982f865, b58f5407a3aab12d0575a464f4b95a60dcab8e619dc803972a78ec739c36d096 - -p_scalar = 5c -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = aee309e543ae4336e4c8417839093801a8a38bc31487c5269d7127d76294ba47, 2eabd7a5d0554d6cb58df8a2808cbbd566d652b270b744ed2b4ed8c66ca6daf2 - -p_scalar = 5d -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 0581b4711fdf24984a278686e16396070aeaca9afd36b1af64cfdc70d9453d29, bca53b986ab0044d0093e587065d7ad0df4fde3d20de623a7dd6f1dac29e092d - -p_scalar = 5e -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = bf87ea83037278d9c87bdb8203d41796955ef205d59848ebc82a7aefd2df5e7a, effe0727227a558507158615205669f83ffd79279beca88e3a7da59c78e65157 - -p_scalar = 5f -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 76a8f9fea974291f9a127f2bcaa12d0d6684ad762b346fd2263e039bb308cc40, c0d6c024d3290bc711e4e34acbbbaa5e9ab66367f3a2445f37fdfb649755e61b - -p_scalar = 60 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 11eddf7fd0a0da0d14f356cc6abc354d6d490a4b19dd329b802b8d2333e12b70, c0d5874bdbe5d48ffc4b733b83d6435d02d0b07402fda7ece1df7cd727802e27 - -p_scalar = 61 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = f1ae5380578181c7ee848e1d2566805eda8cdb78397e43f4dc90323bafceb64d, e042b8efac30c1977ba880e0cd9f48987a0b263ca4974818d2384719638f3883 - -p_scalar = 62 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = a6eecf308794885e74b44206ee3751becc8715abbc82a095d5192c88589b69ff, 160fb32bdb3d1cef94a20aa01c6f25a45c067c89255b379b5fa5855722f31c4b - -p_scalar = 63 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = bc438ae1a4e65b07650522fd4a9a3b17b1f1abb66a7b43712d037bf83f9432b4, b598c01eab0329a6fc5c3d3846700b4c854a75c18aafc1b9ce4a815d7b96c3fb - -p_scalar = 64 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 55401274eb1385f3f7ac46733fe90a2ffe49233161c52cf8b9a17db9bf61fec5, 9c41619a5e8eabde955f973dcfab730b5246164a7a4539485a247ad3dc02f970 - -p_scalar = 65 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = e9b1c23914da499e6a610374c569a602bbe914d3b99cd026b7a96e0a4ea6fdf7, 6b3161f424574039a575eb9bb418886c8cedae7e90de97834a090f01523e6566 - -p_scalar = 66 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 0fcaec0ffecf6fedce33e49cdd3dac5cf5284782e9f60f1841a6fe768f9b4748, 5d88925f7be836710c2cb707df01871c9bba0433a436d55c35e31ecf5ab1203b - -p_scalar = 67 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = f51ec8724c3c386f57670e41bf619241d0a875e919f7f72c564bdda6c71f8d02, ebd64e0651e2c128590519f6cf5b06dba2086ca0d79e990cff513e61174082e8 - -p_scalar = 68 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 1d6de36b734fc1b835d2293fc7ac3efa90ee46554c2a623582d0020682c4bd6a, 9456d43421a5f33f8a51077588462f7b00330a1f9ede82116b953c403008a7a7 - -p_scalar = 69 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 680d5abf65e03a86c08ec1602b1d28fdcb11125c02a9ba44de6ddcb77b371390, 2c292eed1161aed1b1cb924f8e340368378fa836c431801a2a1384440acd87c6 - -p_scalar = 6a -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 7145405dff1765ecb81f9fb1279df6ff750c11bbc098aefac4c398cc1e628b51, d9d0fc13f8a85516a344f964fc017053ec8de7db843d8108c3c279e27c551e90 - -p_scalar = 6b -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = ee206023efce1a7028f9cdebe9f6e8773571e4d1592ce3342ca0ba9c3796f4c7, 332816bd7158ff3f1ff7fc61fd21d00ed8ab1bdaf58097834dea61f7489c9623 - -p_scalar = 6c -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 9d873705000a079bd1a8678742e1cbf414d147984d7df1ff2871263f72371e17, f2993035b4a2be93f71aba0e4ec1d4b6c9cc69948ff6b195c580b52a1fe001ff - -p_scalar = 6d -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 3720b2475548de20e7b092174df861f4fd4f61e491ae8d13aec63acbdd10edd0, a02511c5e354ed39f329dd451478676618dd6277a93299f250be67b8140c2087 - -p_scalar = 6e -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = e7009ee6652405a945ae78ba39dcab99b1fc8c8c23fbbe6e76fbedb5a463fbad, 86735660b10c81c4d8f38f9391b7bf0ea89eb6f180fff6a9465703a073face17 - -p_scalar = 6f -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 0cf804d77a9b6a20098f37bb0832c416327dac318072f08dd87f4ae086653aa8, 0650f5316fb2b8cfd8f5233a8eb74ecae33f2b325dc50598b463abc75981de8c - -p_scalar = 70 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 71704d008938c16745ab5a4d7832ba0c94e258f604a428f26a9505760a99cbca, 9afff3da3868c5bf18fcad9782c9827fa90146d23ff14df8246854f10774748f - -p_scalar = 71 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 734e0d078a2b0d3acc3a5ecb983538693289e86e10ec0d40a125e6c1b7ebcb88, 9e27df61b60c5ac32ec3356f8b80e6130594324f879f89461f26d165ae6ccc9f - -p_scalar = 72 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 08e2f429f216dc997afec8bb9b4e920c18849f8ebc30d62c751e03f0216f7c55, 43f113786db22eac69467bebf560798e684a695fb28407b8a1a2207de2933cc1 - -p_scalar = 73 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 7c3ff661d8ecca6e8a2627c4851b5bc7f15b920fa8dfce56ad19e039119f6cab, 16a226267767de4e237207aa01d0b6c8a94893a9455bc4d84622d40d2a0a4a40 - -p_scalar = 74 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = d8f1fc5f6a92b9aac9f08a5659cb1b6e4b3de89bb2f5f79c87f9793bc9826344, 56375b4ad46ea8260f93d3738fab65a8ac3cf4429a47f0e979ca80614beda6a1 - -p_scalar = 75 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = bbdbec7d79af29b17890e8d54796883355a3bb1ad9699e9208e4c4901b620dc4, d3208079bb7f001d623ccc6d0598d7a3af3092ef526e5caf6d8af218c1ae1e43 - -p_scalar = 76 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 4977379654d7a19e24869d65bb07ad54f8f1d8415512ec1c24c00de93f5f68a6, 363b29c5671a649e930698ea3ad859a98be407f6fc437719fb0ca82e0f9e3121 - -p_scalar = 77 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 6ed0b988157b7f562be22ba0f3a49fb4062afb7c1e314dde87af199e6cc47305, 0120efea019118fd2817ebc7f0984aebe82d639c78848b687e9d30afd29ac026 - -p_scalar = 78 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 9c7ea21245a2473fb62aaf7c37e7454e094e7ddf4f6ab73a6ebdb7bcd0303ba4, 2ff813865b858eaeb732ea74d3e14abe65d87563555fcb68358918ab6b772fc9 - -p_scalar = 79 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = e1a8d418f77f10e127d2bf4f683b30d1d71602d5b0e5fe2014d7251a8c03e3f4, 517c6326f166afa4550b2b1e6cc6b78d00ce7b7c25f5b6695b6be5e1895f1528 - -p_scalar = 7a -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 62280f9a573fbfa8bf357e0c9358983ad183a961caf64cbd536eeea92f4ff97a, 855c4c324d5efb4eb39466ab42ae06fa9156ba434e6fe2c2ffe25e48816e894c - -p_scalar = 7b -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 2d7ca4d8f1e354871783d1b6917e47255a71497198a5ea8c62ea859803b58b02, 5146fbe29618773ba78f8d93e91c1fd525fb337771e800abc0964b2b64b2bcdb - -p_scalar = 7c -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = d8c0472156db126649b1dfca7f1412750a10ed1576d7996d10f264bc85fc00a2, 7bb713506fed7602646b3b52b3661bc6a727afaf1b226fa5bc20540c32897bc8 - -p_scalar = 7d -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = a9fe2396bb85b9cb04b76d2d1ed32559f72dab6d225733faaab54cfc93740130, 4e9295063c01443fae23a053eba00f2add6dc6c5a860c31ded74f2db40dde60f - -p_scalar = 7e -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 6941195b752838c39a7d703660ab52e9519a47b4807a9d289c9635be52bf127a, 6e5b1591deadea0aa0eac0a955c921d27ba60a90ad89e8e79f0041d18f259ec0 - -p_scalar = 7f -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 15fe6a86904a36cf6072a061ae619f2870e9016cdddfd92836e84bb6dee35b41, 898a6ddb541c3eb52f57786dbb0bfc0d02e3b569f529fd2f6549697409ffa69a - -p_scalar = 80 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = ad311f2c46d5a6173749bba4b3ad9db57ef2b6b9ac62ff5463c5cb817a2ad62a, 05c72cde13ff7e780755d9928a294ec74b90150dc987cb0048857f783d00c492 - -p_scalar = 0200000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 135dc5395b54827dd161d2cacf780900bcef72873566cc63b2330fef4e4ca463, 74f3a8c6d9ead371168ca79292ccde25ef5ddb10f8205f939c70fad1d840e439 - -p_scalar = 0400000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 15b4488b29fd9fd06e1da8c39a33c6771fe19e357fe4364e9910ba6b23a5d896, 0d3b086249137c65c02e4db6f81a9a716df57590547e9c17e0bc6dabe5e0dd40 - -p_scalar = 0600000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = e78c2ec0fc61206741311f8a38038a5d8f860c7943ef881c84cea0691416a6a5, ca41108461c93c6200aa75130c9ed3454b336200a69fbf68b6b2d17ea528ca7e - -p_scalar = 0800000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 0bdec21162bc679298204cb64fcf68e15d2b0ac6c717370e8b5c619c76497ee8, fc8db7152d2b034ca10496c1c2f1f374061c05691f21e53a968c331059c4efee - -p_scalar = 0a00000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = fe2bc235e52800a089fa443d07d3e75e96e9793ed510053ccf57fca29849e95b, 11ad8b81369f4f1fde81bffa1abe1a6d4a7ad5b718dddd9ce3df7473f53818bf - -p_scalar = 0c00000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 69aada7f6d6180a56183291b6ed77d1c62699718e770b20dd3694e2ab20364e4, 2ac1b72cd7237812295dcf758046927202817baa878fef88ae06fab40e7aaf64 - -p_scalar = 0e00000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 1280aafbed23f0d182293299cdf809af94589aac6656bbe13e858c2ffceac518, 6405033235a7335e2a34ff4cbf0fdcdd1fef5c6630513e802154f3988cf91d5b - -p_scalar = 1000000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 7be5ed0dc475c1293f06d66c530cb4f3d8772d353381060380802dc91ec34f9e, f513bbea8d7a443646dee7396d5e4ba139c2d7a9360094b33461c3e6ce17d4ef - -p_scalar = 1200000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = f82412db37333f2074feaff5e72c2666cb98c3ea2233117dba89095174f9fd77, b51180a01afcbe79358bec59ac19d3607e5b687c85448e55323c0c5062d8e35f - -p_scalar = 1400000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 5ec40582c9a82fa78d5d177c64ff8578982be4fd46700b8b37071afbe8316c45, 52b4b08f3f3eb21aced0c69fb44448b3db17f60c60fced7baae71c8430579987 - -p_scalar = 1600000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 2a1ef7d7822e8cc963aa5cca4fd924a2b44de63e08ae4169cf62c250869027b8, 7f5cf538002ed8de737d18ccc5780e107d7bd440b479c9141be4c839914ca0c3 - -p_scalar = 1800000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = f3b4962f5f3e6c3e028a81514f3cf2dc6415834bac4ab3aba3d6f4868eb6e843, e48886e1f978ecce3ce3229464eb6129bc8592761ef431aa6ee6516f67822d0d - -p_scalar = 1a00000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = d9025fff8a8af1c635761c8ee1f6176d54c439b0391fa36e2f41e643356317fd, 945416afaa1c4881851248380ab5d45b44b722ed6a5b8ba4737d90c30833bb8b - -p_scalar = 1c00000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 1eb6a9688f95277ca3fd22fbcea3f029965a774094e746409c34b650e16e05e9, edef63b45310a343156d3e99647bf2b7526e8dff0a70d011dadf59c284527b09 - -p_scalar = 1e00000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 870ae6bdc2754097035ebe4addc4f080ed400a2232cdc71aee20415c2245134a, b092884c8aa21a5e16a601c1a30573590a80e6aa1b0aa67d5e6d197b3fb728d2 - -p_scalar = 2000000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = b7a23f34b68e19f8d0107914ceaae10ecbe906f04c93302efc189ae71e29a3ef, c30f4406c2bbcfc89aa6e409b25e8eecfce673920352363716278a3d102dee62 - -p_scalar = 2200000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 68a9969c8e2256288644ef1cdfceb8ab862ae25e2ece8f72d32d7cec0094e84c, 860d7d9237a468fb342f659a640f3249cf7591e87d45dbd420df61d84cee8789 - -p_scalar = 2400000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = ada4cfdd7ecfa8408c94a21ab972da90598d0bf8849be4b7ab293027aad991c1, 506cb915147a9d206ffbdb14959ad5aa8359e85efcde65cb6c2b463f043139c5 - -p_scalar = 2600000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = f6e29e442433b4c681d700b2c6fa654a9edd11a6b7a82bb80ef6a240c793c0cd, 2a221c4e8df83860eab25e2e7b77b685779c1f1f53e2a0ae5522c2a7660fe4e2 - -p_scalar = 2800000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 54476778acd2f1b6c92becfa390b3ef2b1643ab5911bc478c3e04d7902381461, 44fb8cfe6f4f86f611e7d6ef4a5ec53cd43ed785d3de39a57255f3b29940c550 - -p_scalar = 2a00000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 574fc2b081704bde30651575aab5306d953939f44ead0fd9d6d8bbd2f2338d2a, 0d2ba583b63665ed12abd59ad3ae16b618d475fb149c0c70cbfdf7e0becd0d0f - -p_scalar = 2c00000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 17f904ba45b0995e765a50db1a6fd0ffc5772beefdc3a47b83766947d17d4e0b, 3705bd94ebd02b2b98c726b0b934e0260a92480d3d8f55123119bc7cd77cb781 - -p_scalar = 2e00000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 5090d91f0b80bcb946d480d77119c60ed7799b31b313c052bfe48a8ff43daf9d, c02509dd9d1e27a689641fd44e2a6d73e91964b166ea55f536b3b3e178c42840 - -p_scalar = 3000000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 389caef34ec5b10982159d07de7d6f2c945353e1b2d4c63aae485bb72b724759, 8cbd64453ebdf75d7e905c127c0dbfa0d23d3482226621bcb57144ac249a10eb - -p_scalar = 3200000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = f5aa74e43a64439e577793fce12c68ab07de7ab35133e5a2768978afed08d68c, 5da88e7912bd33f859ee2be3710df0cfdffc222ce2bba6fd9ba826f3bafa160b - -p_scalar = 3400000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 58c8a77ac0d58abd9947c636a9b6e05a8d98277b4a837f6908ed8febd56daf06, 041e7a12c71e14b91342e6a71c04f3a2e9329839ef892c2c0bab695ba0ede1b0 - -p_scalar = 3600000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 9bc6c2af18eaf22cf81a4b3e0fd97269d8f158f5d6df29e581ea0bc89b6956e1, 9c4b4d8628f8a1e4bcc6ab6270d0a6c3fc4405f16dae12ba3e2c31a1929daad4 - -p_scalar = 3800000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 98fe1c61f5b61d31fd025001b905b499dd4d06aff39e7832b7ef9760ff79d2ee, f71dececd3c7cd215cdd4f60aeb14e92c891c488cff632655607c67f3a0ed7fa - -p_scalar = 3a00000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = d7d80165dd6861d485715b2edb2589d37b0b8307280d1be142c772b68b61c205, ba7519a234f0c9acdfa1d767bda92244ef6a5206c475428a9dca8b9a7f78fe7b - -p_scalar = 3c00000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = beeb3ea58c37888ea76697bd602e90655dc516824ddbc0b6aea68626dc4ad4f4, 935ecb9c6d33f603604a9f6b651bb20d1b747df45ca0bb7be13b5d0deba96eec - -p_scalar = 3e00000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 782b816e9f5238b55631049161a549b25d485fac31ca379550e1b82c5de1691e, e4efd573a67b8fe35130dd212031f25f5600525dc0d6ad5fec0d468cb9c2fcb0 - -p_scalar = 4000000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 412c9e1e9fa403a4d1b299b504aea4a9047e2ccde180b2dcb618d590b01e6e27, e877ae428aedd469c5e49033199721e6b63afeca0ccd471c772d75c986bf8aad - -p_scalar = 4200000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 4b782ecabc2251e29f1ee33c0910e35e65854fd78777a63d723ee82acb8c9fb4, 7c75c30e3e16873bc701019f2cdcfe430a09be2add256acba5f97db2ba0f87a9 - -p_scalar = 4400000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 720d5901fc5cb4c4f2876026ea269465bee5f33e85425bfe3d16740409d9735d, a6506ac46b2b29e9d4cf469b641bf2ab861cffaa6c74643abefca879b25373ee - -p_scalar = 4600000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = a4fe196b936adcd72b999e56f814d996687afcc16c6ac81b2bba2fcb7bd03b00, 1ab858cdf2a167e12a228e923f83de2deee27d5ed2654ccf28e9a3d5768260e4 - -p_scalar = 4800000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 47f93e8f0d2f339d2df4486ef3b4e2e0fca35bdae5182b8d7f4b55864f6dcecb, dfc2165d0d72569235d4ba0bb9d4830fc1f81d45e3f65163b8e242d7c1c93b08 - -p_scalar = 4a00000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 4b5a7b2307c5f1098b5c3d0371c68991750aa51875c77f94fb78df45414657c3, 4cfcadcac4d7da452026db79f61a19bb00a9b7aeae80e414b7db7b79c1804211 - -p_scalar = 4c00000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = ffab5705044464f22bac283b351571b3b88e7c47d8d42a028b002254c72340d5, 99e919d4637aad57bd1c7b347dbd0cbd1bf10ce5e573735768ff22be52225de0 - -p_scalar = 4e00000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 5ea74c730418d46d3da600eade1864dfc4ae8bbb8b383d060471cf0dac517b4b, 44220f00df9a7e2ccf6df413ac330d0c8d686b4421917c512d6ca372422f8c60 - -p_scalar = 5000000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = a35aa23fbf846bbbd43da670d2f74daed61257ce383c8ce9b1e13752fb85fa4c, af2fa55364392dd2cb280ad5c3b55ea7092071203c9cb8c4a18bdca2bbde037c - -p_scalar = 5200000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 4644b8fb9aa64d9150c9f363b5117831ef6feacd1584fb54adb84fb6c1127e87, 5af26a8085d1122b9c217ff8c58b2488408b97ee0b241da38adf348eb20841f8 - -p_scalar = 5400000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 91c3a88a5b6e8c279d0a1f05fd8884e9f1539d9e4c076aa9d334b37c4b8e12cb, bc3bafcacf9e30bf2a1948f78e1f8a26cc7c918cf4672e8646d15e7745855b5e - -p_scalar = 5600000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 5e76ec2fd83f56287099228335b50df42b516dd73422c5c118d919e2ba9fa405, dea46d7ba6be19c7e2ac310f86196e7cf11adb5bcd22e983e488640762d3731a - -p_scalar = 5800000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 3ff4444fd2ad3a96e5d755618de929cdad07e3c765ba422be4db7c0067eb93d4, c3ee8d0fb564c728a6f5855f810805aeb144b9045aacb347ca2ac1438e0eb1a2 - -p_scalar = 5a00000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = abe32380275a9ef53b7cd6098dc0954228abf7b7a9c7d8a5ec69d5a37aed7fc2, d89fbc8f199d31aeb6f74e3ead3671a34ebc16a84166800137db4e055970628a - -p_scalar = 5c00000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = deb035fcce7723a22ca3e0a1d449c1004ff211619adcd4bb4fc56a1be50edb52, 1c4fef977971ff17c25e5fd56a4c368f2ea2c4a0e263ca39f956f57e77aa2afa - -p_scalar = 5e00000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 7c0fd64417a177b5010b2e0df05981da66d63eab9af46f4588f0367ae686a10d, 63376f9703aabb207b7a699c10d37c1ef98f3720ab5cf6479931effba58749aa - -p_scalar = 6000000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 50235a0fdc91927053b2bb803ee35067bc56637b5f29cd078c56e735a64785f4, 777ef9a3a13f07f17fbff45a0f07fa453cb8a7cf7c69fdc4e6e549270d3b559a - -p_scalar = 6200000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 2dc1b8bb6885309fb1e70bcfd44571115df7fee1116cd289c547a21465944d7c, 5a4a2100adff0aad0b1626cffb8bb27fd14c2e6c8c275be6c7d820138bd23b08 - -p_scalar = 6400000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = f1445d07414974411c75d37565dfd734bddc1fd9d5a52b5d45ab2440e4c3c19f, 5c00cedb1692044fb726342f6f670616f1087a5b4cd9bc23c04be98962ba0ec8 - -p_scalar = 6600000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = d1609bf2cd28c8fdc8b4a3a98a9fed30e6959e40b4a07fa19ffe9f1de32e3a6c, 4a1e06b336041e2b2d4cd3ddfcebd74413113e3950b4c34d2fb918dc46cd6c6d - -p_scalar = 6800000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 237c88057388378848d61dc507b6f556b2c6a5f201dbed52cb4f805a3e4e7d6c, 25082afde44cf841146f4bba1a363f26c60154730f6701cf320e4e7c7059f5f4 - -p_scalar = 6a00000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 845a882c8859bbc2e883d25ff51993083258a70ad731721eddbead4a788e09c4, 954ce3bf06973608099aa5a1cb8e5a6085b82bb53aeba78c009eb3364ec42bed - -p_scalar = 6c00000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 4d6eec323a1f89e99267af0a5dee21c6d56850cf6466696a53c474abad6c4e7b, c29df3748076072f982c5b89ddd64ab3382ca3d072639a61a9240aeca8c4f745 - -p_scalar = 6e00000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = d28527c6a3824aa9d34030745566465654a149071f100d40b1b006aebc0d6863, cf57d4bf75176d98a4ddebee9b71bf2c541a56d92c7ea275315715e982e255d9 - -p_scalar = 7000000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 8f12502ee0138997ad364df067b256dfde2d4ad1860b8bfbc370e522cc1b5e83, fcaee231345a245bc07648bb2cf9b45917ffeb533f437995afc05f23887c6df5 - -p_scalar = 7200000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 88a0df625c0cd66e4523b7dcd2c772806d46968e6a3bd9ad34f365ff3405157d, 9a00732bf6369934bc38025aa45bbf707c5afd733125eb17ce0c6f0f3ba6eaf9 - -p_scalar = 7400000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 350fed185a914c72b1ead64104f9670908dcf2b70004539e0f58cec54e27d357, 5533f0f16199265d9d3cf97965bb62aeba074b91b92fb538bb0bcadc3aeb87ab - -p_scalar = 7600000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 721595eece728342af86c88034fb313add3f191127a10139823002854cd4d5e2, 9f3bb1d9601b4aed7b75a48a325f5367443b4ec8af8951b3a9e5b2faf2c09845 - -p_scalar = 7800000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 394c3ca1652f359aa37951abff9f5089563ed687c3db1e5fec79a10fae256721, b104db405fa38d00eccc333d014ba1b9efd39bf1f5b6decf4951b323dac0eb92 - -p_scalar = 7a00000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 829bec8ffbbc8adbcaa9b2f496d71f842e0d323fc98fb2ed918ad277a25ed969, 28166c21baffee49802af12b233d24e2a8c06deafafb2e333a4d2abf4f57bf3d - -p_scalar = 7c00000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 114608474b9883e7e6183976a85cf4eaabd1eb6c8fbb831a86d4cd28294b04f8, 9793db050d1aa41eb31fda7157078ac5f304939f55b0c15b5ce7a018c3510ab2 - -p_scalar = 7e00000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 8ccebd9296f0b3dbe251932fabb53deb5f020d8cd37bc364b63fd5141593f8c0, 34cd83e4786564de19a5851fc34f06c6ccca7d68534afe1b92f86f449b6cf24d - -p_scalar = 8000000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 9211e489de7f4f8a426eca29484c2ece9c4e7ad63c6341fb197dd46d95a7b1a2, da06d1b7f09f1fe8e8d79591e3c11217d4d3f6f0f9a8ba79eb66809138710e0b - -p_scalar = 8200000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 0695d25fcba9327ba26e5822d699d95b7a6c1acdf37b2836203a31d5a56c98ef, f55fe7336f090c5a6bc71eefa6525e79bb7f9f1f194de5bfaa2238beb7bce76c - -p_scalar = 8400000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 95e360666c4165c8b8e2959954327c6554009f1e6d947506e4cf728185967fad, a78389bce264586e1cdde00ce0f1a086afa0f66db6cc5ef2c640cf8b5c4c0ad8 - -p_scalar = 8600000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 3805f4e7a74465b996976624e2d6122797e8092e1a7c6add2ab55f653e360df9, 105aaf972949897cf26651a5fccace103ff94fec5dfb12be9eddc215f5ba9146 - -p_scalar = 8800000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = c48d07aad919b53f72bfcbbf25a2f91f7112f4122205eb70be6dd7fc6b7733ae, b178c26282cae663c70ad8ebbdd2c625dbafb3ec91013a8ec15b973ed95e096e - -p_scalar = 8a00000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = ef1117f3334d256570ec0990a1bb0900c512ae94e04e361fbd7055ffbd4132b6, 1e15b34510397d8988360d2718ac678588eebc513fcec4d5ac26b4177d5773ba - -p_scalar = 8c00000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = b36ddb5a551266fc72a174550b384fab97c8f9d8b94fdd362441c4c0ca8f86c8, 0b2d7199108eb224df89ffabf8f575e0c3cf9430068a4299731758edcbed837e - -p_scalar = 8e00000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 1f07fd1a9ee01d68891d265bb9f79dc8d31da5b74b957a08455930bfd7425424, 110d6a3ad1118cca57d3f35c423f5902d33663dc2d6f23354ef6ee38a25cfd6e - -p_scalar = 9000000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = e0e5daeb54dd3739389f747caf3c3030703ef60057feea5b805c564631890a36, b5e4284906a573c5c8e7c21d50df40d681b40e8a4ac6c69d01db5b3c36360eaa - -p_scalar = 9200000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 11a4ff0222e558e644144f890e8ff816669d7b57254db82633e0f086aef314c5, a545042d61f178f491d6dca4faaa253208a83da7d1abf3f4371acd90dbc10419 - -p_scalar = 9400000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = ac45249aec82d6d8a5e1d3c6e19adb253f01996cbb97d0320130abf38cb5ab31, 2534ea7809db05101047eac71457406b02dee39b497e2b7c3d8910d1a3040209 - -p_scalar = 9600000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = c738cbcb5a8e43bad9f6002307a003ad81351ce14ffa84fabe1b922b396fae20, 362d21f8ceca0e6d98c801c19d4b94040effb85f9a2e7e824ab9a137362105ac - -p_scalar = 9800000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = d723ad15da12d3f14aa86124ac83299759198011fda9f625e8ffb637410eaba3, 17278d3a7fe4d4c66de3860db69fd06752cf7b3712456753aa223ac0d2597ef3 - -p_scalar = 9a00000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 5bddf84d01fb6ab7717df9c3adcedc68fbe6587456a7fbaf7cc7479be15036a4, ea6f8714377703386fe4d40636f3d64484810517cdb79e553ccf5c91a3938061 - -p_scalar = 9c00000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 0617a8dfe008a218c2700de3e39cfdf9d6b37e5eadb39a5c5e6afed1778930bb, b4c6d7fcab4adb7540d7ecf6657057cbef4004859a01af58c166bbe8140e1951 - -p_scalar = 9e00000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = e19854ec7a29e8cf8765ed78b03c224b072454d8cf4f0b1b746bf4ffcd5eb860, 979624d9790fc716f3d40cd5c626d3b0bda675912d9debbbb665e6db551a2f72 - -p_scalar = a000000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 6372def79b2bafe8b18e2c1354107588281fc8dd7b87f257a83b969946191d3d, 1c43104f1bd8ff56e1531cd27bcef30bc0d22b49a9e985c0250b44b7f2768d35 - -p_scalar = a200000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 9e15ebed69c53ab58cb605eda605ea2cb0766c76159bb5814ecfd1490d4d367e, 08fb59cce0d3f4cdbb12dd157b823412725b82ca3c22662e0a4e921c0fae9c8d - -p_scalar = a400000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 3b082784ac9daa213e9231dde959e9257f81bfeceb104d11989cd51d81ffd706, 2c44be725a065ca4718d048d0d7ec18fc2c099c83eb051261d71fd00fd80e5a8 - -p_scalar = a600000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = ed37bac889c8cd093feb1494b52fe95b30df23d4bf8ad1baab45ff2f3b264155, e2a656426e8184ad50b24ff6968ed36755ab15a05a14cddc2b33fd0b18751435 - -p_scalar = a800000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 3eb44ebaa26cfda9ec294f9bd82e3b0c7adcdc636cfec330698970dcc1c88910, 98fd31bf0dcc0286194c7d00e797bff25b287f337382cb12d0b7736358611efb - -p_scalar = aa00000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 6fd044f86e7c58d93fc322e9763408262abc70bfac2a8c9eacd17f62a70bedca, 1cae0c88d5db19418efb64e8b272c588b505a57c634c07e8a7b3b7aa3e85682c - -p_scalar = ac00000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 03e6e884142b953fcf6e45c2f0b7938f042782b6c788822f7caff2a8dd7f4788, 9c03fdba806b71fe0ab7577c2cb83384e1a4bdaec9349485394cd3d08b708043 - -p_scalar = ae00000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 541f1c670f8d83510a4f0dce10075d18a773c212de55a51ab85d636205e61d13, 1829ad5b8f00323d21cd1abe5b8c4a798647cac1d2dfbe09d831cf690f3ed565 - -p_scalar = b000000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 35e8048ee03c366502e23d41dfc6514aa5db5ab62ea604675fe5691ed785e73d, ecbc2e79242f1bf117353391d399b947d713c4bb7b31e5a5c074ee70e5255f07 - -p_scalar = b200000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = d8e96623f2e1ed0f96c490c17b199bba4831540870192a511fd78414f227c4a5, 31f45190088c94a0959d925cae1a0b7556e8cf57e1a964129c33b8132181f30c - -p_scalar = b400000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = ed1b755f2815d3cf2138d71106187ec35898b1930650dd7ce81907220b4ebbfe, b38056cb82c54a2b55878db37ac9ad4f75837547c5ee97d0abeaa1ebb0c6baeb - -p_scalar = b600000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = fb909a74cc54235e35059c6f94d6bfbf9aa5d2c1bd5a35267217348749af1daf, 4f41d2496566b84407ac1340451ccd2ad977c020e4667467ce401a280c7616d6 - -p_scalar = b800000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 12128b2fd412db03d45acfecc1c397c7110ef147732ebbe02e605d97ce76aebb, 2fa8b950c6a53d9bf56d6a2d5f34969d145d8cd34ddc97ecfd810f66d5b2ca1b - -p_scalar = ba00000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = df8df34707ba78f463d2778a91308c54034c07d0eaef09eb0d13b0393524a32e, 3821eeb8c663cfb9e4b155a08cbc34744e80b886a906dbb25524e7609b6fffff - -p_scalar = bc00000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 570f50b9ade5e185d379afd6bbac1e92f1ca3c3639b1290c6b3eda297e866baa, c09d1b8382c7905056e6189930526a456578d62d573e547f7250c29000770668 - -p_scalar = be00000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = d9b588174709218a1980177d765796027ca43bcb2bc83e9c14dd8c3678ffb696, 06fb5b1a18c5f5c5a69b595658090885a41347586783743a7d64ff6e983e64c7 - -p_scalar = c000000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = b37b515f042eeec8d64cd42d9c875d9a1a1db7e49924182ae5d7f844caaa358c, aa5b7e3e7dc936008211befda6481e8103cdd1271df9100cb2b22bf684e9a041 - -p_scalar = c200000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 1e6f624584d42c5a9fd11c23e1b2374586dd7cdb056b372c9a7bfb76f3086c58, f3cb97459a2da20e2e0ea9c7d6a9cf97272ea955866470574f10374f0b856d4d - -p_scalar = c400000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = def3204ff622e0f51e7dfc2f11b5036e56aceaa0609c4809389ca9c3b1d2d491, 614f7f1c3bffc28c1c998443628fa6db155d239948ed5775b1d1056c2d0148ab - -p_scalar = c600000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = ac2244a68510d43ed03eb697c84cbed4e8e7b7e5495fac838defc208af8cb7e5, 8b79df4c11cfef71055dcef6f267116bb51baacd8680171b40d2f3fe84d6e175 - -p_scalar = c800000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 3b2b115548841c4bac23208fd26485e9f65a3640454ef41ff86d13f9e149e73f, aa798348a58dbf409a1af4fd0275867f69aff1c78d4bb4fa916dd3f9ac1e05ed - -p_scalar = ca00000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = fbede0865908334ae1e330f9c70cbc1a87382d6f40abd3c3eb3a10b1e94b9d1f, c22b42c5289663eb0ed8edfc44d2232151eaa4b260ffbcd71baaf4cb2202baeb - -p_scalar = cc00000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = db88c71bbeaf13bc07a69a30ef6276ed02b0c293cb37d658dc2d1be24becfdb6, 87fd26a1b08c632348f9e0cc903001773d1c9232637327282bc7910a368001cc - -p_scalar = ce00000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = af06ff2bd95601e3e6b95f2fdee3d5596a0d1bea32ab6a5c6b768e347d563eb6, 7603685d5acf30d24fbdea479e4585a41f3afe752f76070dd310d38ca0756e4d - -p_scalar = d000000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 956b31e003c45e52a078868ef78edd391571580605d6297b8c885312c23fc975, 74c849cab3eb568bbe6dd84b81d0da67372a23c6f38198c0b8fd8a2a0084cc59 - -p_scalar = d200000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = f7ae11128858d4bd081e8fb419b8ae87f8b465db160c6066244bf1db2540eb02, 9dd07003d57bcf5e4b24b13ab51778225936f29a5ea0a1bb6ba5c905ef84e7fd - -p_scalar = d400000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 7e8caa24bbb577974f1bfe0fde5e42def5eae8c7f89acdaff3022fb6e646703a, e3ae768db721c229fc366a496dd93702ae1f99512ad40c1bba14638bd3a8f0ba - -p_scalar = d600000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 726cd1b8f826237f899ae92398f41b6f681817c7c9c515ff302c3cfad169508a, 64109964a0a836d6d035e73ea9320e3a07b72bc6853111e9d733a3574aed4a95 - -p_scalar = d800000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 2cd615404fa3c57214f08f32b806bbb3c97bf51d0ffac3078f75eab499646d05, b8b3825f7964a7e88808f4049bee10bf7ca6cbabd1c024f607f2af89d56ec49f - -p_scalar = da00000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 44e6235a685fa8c247bd7309a9de5fa66db2fee880a40b64c0b8debf4aa4d144, 0833b86b5c19d8f9ac8db4c9f6f6716b89b462ecf3b0c234caeaa55f50014826 - -p_scalar = dc00000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 3027a162030cd7c2ba74f8354822722008faee4e603bb73e4565f9a834ddc625, 10e4eb4cedcbd2a01407f6062c80c8a864711e860cae507bb739381308d35c5c - -p_scalar = de00000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = fe35f5c66e9d40a301eee42e3d4f9f3ec28f13ad81f4f013096bb45b738230f3, 1b9004134543f28ccf139d82bf91e4424e7bc18151dc4ebe18d3828cb1fe885e - -p_scalar = e000000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 9f40ac3bae92032334e5d0dcb987a24a5e0e8c3e803e25dcd0667ed68b11888c, 810e13d73b8421cbb6e33283259b0e485ed7406e949cd706ab9c216acb1f09c5 - -p_scalar = e200000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = b9c9c244af407478c96adb0c950359af1d0243f09da21539499d4934d78d5664, 6560fd45390953fb7ff4c255cf2f156f2692975ce17dd11b2889aa68e4a01d05 - -p_scalar = e400000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = bca14b180256394e833badcb026fbed49d4cac5be7b7f4d976fdb4d8d72905a3, 1398508026f62ea2d9661954f8eee0784c145115921e9518f6148aab2d205de8 - -p_scalar = e600000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 9e84b1429d952dea1a5702fde822c43a6440a71137d7a6d5b1a124a2e982371a, bf0877e197f6185bcd1a841d08d3644cd46ab8430c47394c065da5918f8107ac - -p_scalar = e800000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 5774d975adf3dd428b24580ccbb8bfc2082ec7feeac69a05a84eadc3c6f859bb, 5b07a1a1962220d00bbd4bcea8db09f6f574e02249d4dfa80cfd0e3e04e7aba3 - -p_scalar = ea00000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 18b7629228d8a479ef8c3fc19f7258a24084cd681c0bfed585b4a7b6c5b52828, 51255506bd74f106a8b0b8f89daf1b0ab051b6588354a76c285fe015041903a0 - -p_scalar = ec00000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = a9269757ad6c71aecd89a9d614befaa9c670d56c86853eddeff93c2d3edf7a05, 5b0f80312853357e54c02ae48d51af5d92ca94e94ea0bf05c41cec35a788f16f - -p_scalar = ee00000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = b5ed7a9125881c7719ff07a13ee17b6081df350185faadc70c267dd0ae0c2b14, 2bf138d8cc37cc1635121ad130f4ecb5563b8196d2387c33ee82cdcf4563b354 - -p_scalar = f000000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 80f1a439c929319d7a3a6453d4fb689735dc136663621bc1a857240fa36a2737, af283981c8d54f6404f2b6dbe1fe2f104f4ac89a7f873a1403e7d8b40734f45f - -p_scalar = f200000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 728fc5136ff083f3eb5c80bd85a5f16d33075ddccce277ec4182e4aa4bf75924, dfba71a5f3e366d7f5720029f53f0159e6ac642d3ee6a5135c38717040866d54 - -p_scalar = f400000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = c02fe1c417b27af67e00049f9ab0deefd6ef61aff90e37bb06c9f96c6e75e767, 1c2c0ba15a7720bd2467d68fe7794a246f0c190e252fdcc837d308ff7bf10b23 - -p_scalar = f600000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = a883f42917abdea70042d1b7833a576b51a3fb710ce3673f85d05386724c3c80, a16cf3f68a9ac134de65695046051e46111266374775aca4b4f8174fd0aae8eb - -p_scalar = f800000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 5f2f286449c33aa7ac7d0e1c1fb049783f46e326ce433bc6dfffa17e057a3df0, 1ad279b66e06ba0f5381b3de843a23771499a27b656927e1bf4d171cee8ea2bd - -p_scalar = fa00000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = a8b7e8a7068a16707ae69dc317ec34c204b86de7b0a0125589502abd170b0b8e, 4a5475ecc62600458f6c1c98db76571b330fae946156ce910ce3916aed5d4799 - -p_scalar = fc00000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 7d6dbe6556c0f8f08208e6ce3c650c05791a0732e423b40f16ff861277c713f8, 370de4a16a5fa3aee627881992f8bf1ac20a45523d2e4204af023d3c732d430e - -p_scalar = fe00000000000000000000000000000000000000000000000000000000000000 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 8ec353c2064ebf7c5df16fb0f8867456296c7b9e57af9e532eabd53494b13f3e, 7b60d0de6a838ea1f4ee86c044fdaf15406838ec9d885f6cc9eae79770a47824 - -# p_scalar = n - 128 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324d1 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = ad311f2c46d5a6173749bba4b3ad9db57ef2b6b9ac62ff5463c5cb817a2ad62a, fa38d320ec008188f8aa266d75d6b138b46feaf3367834ffb77a8087c2ff3b6d - -# p_scalar = n - 127 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324d2 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 15fe6a86904a36cf6072a061ae619f2870e9016cdddfd92836e84bb6dee35b41, 76759223abe3c14bd0a8879244f403f2fd1c4a970ad602d09ab6968bf6005965 - -# p_scalar = n - 126 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324d3 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 6941195b752838c39a7d703660ab52e9519a47b4807a9d289c9635be52bf127a, 91a4ea6d215215f65f153f56aa36de2d8459f5705276171860ffbe2e70da613f - -# p_scalar = n - 125 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324d4 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = a9fe2396bb85b9cb04b76d2d1ed32559f72dab6d225733faaab54cfc93740130, b16d6af8c3febbc151dc5fac145ff0d52292393b579f3ce2128b0d24bf2219f0 - -# p_scalar = n - 124 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324d5 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = d8c0472156db126649b1dfca7f1412750a10ed1576d7996d10f264bc85fc00a2, 8448ecae901289fe9b94c4ad4c99e43958d85051e4dd905a43dfabf3cd768437 - -# p_scalar = n - 123 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324d6 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 2d7ca4d8f1e354871783d1b6917e47255a71497198a5ea8c62ea859803b58b02, aeb9041c69e788c55870726c16e3e02ada04cc898e17ff543f69b4d49b4d4324 - -# p_scalar = n - 122 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324d7 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 62280f9a573fbfa8bf357e0c9358983ad183a961caf64cbd536eeea92f4ff97a, 7aa3b3ccb2a104b24c6b9954bd51f9056ea945bdb1901d3d001da1b77e9176b3 - -# p_scalar = n - 121 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324d8 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = e1a8d418f77f10e127d2bf4f683b30d1d71602d5b0e5fe2014d7251a8c03e3f4, ae839cd80e99505caaf4d4e193394872ff318484da0a4996a4941a1e76a0ead7 - -# p_scalar = n - 120 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324d9 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 9c7ea21245a2473fb62aaf7c37e7454e094e7ddf4f6ab73a6ebdb7bcd0303ba4, d007ec78a47a715248cd158b2c1eb5419a278a9daaa03497ca76e7549488d036 - -# p_scalar = n - 119 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324da -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 6ed0b988157b7f562be22ba0f3a49fb4062afb7c1e314dde87af199e6cc47305, fedf1014fe6ee703d7e814380f67b51417d29c64877b74978162cf502d653fd9 - -# p_scalar = n - 118 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324db -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 4977379654d7a19e24869d65bb07ad54f8f1d8415512ec1c24c00de93f5f68a6, c9c4d63998e59b626cf96715c527a656741bf80a03bc88e604f357d1f061cede - -# p_scalar = n - 117 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324dc -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = bbdbec7d79af29b17890e8d54796883355a3bb1ad9699e9208e4c4901b620dc4, 2cdf7f854480ffe39dc33392fa67285c50cf6d11ad91a35092750de73e51e1bc - -# p_scalar = n - 116 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324dd -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = d8f1fc5f6a92b9aac9f08a5659cb1b6e4b3de89bb2f5f79c87f9793bc9826344, a9c8a4b42b9157daf06c2c8c70549a5753c30bbe65b80f1686357f9eb412595e - -# p_scalar = n - 115 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324de -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 7c3ff661d8ecca6e8a2627c4851b5bc7f15b920fa8dfce56ad19e039119f6cab, e95dd9d8889821b2dc8df855fe2f493756b76c57baa43b27b9dd2bf2d5f5b5bf - -# p_scalar = n - 114 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324df -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 08e2f429f216dc997afec8bb9b4e920c18849f8ebc30d62c751e03f0216f7c55, bc0eec86924dd15496b984140a9f867197b596a14d7bf8475e5ddf821d6cc33e - -# p_scalar = n - 113 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324e0 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 734e0d078a2b0d3acc3a5ecb983538693289e86e10ec0d40a125e6c1b7ebcb88, 61d8209d49f3a53dd13cca90747f19ecfa6bcdb1786076b9e0d92e9a51933360 - -# p_scalar = n - 112 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324e1 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 71704d008938c16745ab5a4d7832ba0c94e258f604a428f26a9505760a99cbca, 65000c24c7973a41e70352687d367d8056feb92ec00eb207db97ab0ef88b8b70 - -# p_scalar = n - 111 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324e2 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 0cf804d77a9b6a20098f37bb0832c416327dac318072f08dd87f4ae086653aa8, f9af0acd904d4731270adcc57148b1351cc0d4cea23afa674b9c5438a67e2173 - -# p_scalar = n - 110 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324e3 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = e7009ee6652405a945ae78ba39dcab99b1fc8c8c23fbbe6e76fbedb5a463fbad, 798ca99e4ef37e3c270c706c6e4840f15761490f7f000956b9a8fc5f8c0531e8 - -# p_scalar = n - 109 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324e4 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 3720b2475548de20e7b092174df861f4fd4f61e491ae8d13aec63acbdd10edd0, 5fdaee391cab12c70cd622baeb879899e7229d8956cd660daf419847ebf3df78 - -# p_scalar = n - 108 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324e5 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 9d873705000a079bd1a8678742e1cbf414d147984d7df1ff2871263f72371e17, 0d66cfc94b5d416d08e545f1b13e2b493633966c70094e6a3a7f4ad5e01ffe00 - -# p_scalar = n - 107 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324e6 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = ee206023efce1a7028f9cdebe9f6e8773571e4d1592ce3342ca0ba9c3796f4c7, ccd7e9418ea700c1e008039e02de2ff12754e4260a7f687cb2159e08b76369dc - -# p_scalar = n - 106 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324e7 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 7145405dff1765ecb81f9fb1279df6ff750c11bbc098aefac4c398cc1e628b51, 262f03eb0757aaea5cbb069b03fe8fac137218257bc27ef73c3d861d83aae16f - -# p_scalar = n - 105 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324e8 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 680d5abf65e03a86c08ec1602b1d28fdcb11125c02a9ba44de6ddcb77b371390, d3d6d111ee9e512f4e346db071cbfc97c87057ca3bce7fe5d5ec7bbbf5327839 - -# p_scalar = n - 104 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324e9 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 1d6de36b734fc1b835d2293fc7ac3efa90ee46554c2a623582d0020682c4bd6a, 6ba92bcade5a0cc175aef88a77b9d084ffccf5e161217dee946ac3bfcff75858 - -# p_scalar = n - 103 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324ea -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = f51ec8724c3c386f57670e41bf619241d0a875e919f7f72c564bdda6c71f8d02, 1429b1f8ae1d3ed8a6fae60930a4f9245df79360286166f300aec19ee8bf7d17 - -# p_scalar = n - 102 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324eb -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 0fcaec0ffecf6fedce33e49cdd3dac5cf5284782e9f60f1841a6fe768f9b4748, a2776d9f8417c98ff3d348f820fe78e36445fbcd5bc92aa3ca1ce130a54edfc4 - -# p_scalar = n - 101 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324ec -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = e9b1c23914da499e6a610374c569a602bbe914d3b99cd026b7a96e0a4ea6fdf7, 94ce9e0adba8bfc75a8a14644be77793731251826f21687cb5f6f0feadc19a99 - -# p_scalar = n - 100 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324ed -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 55401274eb1385f3f7ac46733fe90a2ffe49233161c52cf8b9a17db9bf61fec5, 63be9e64a17154226aa068c230548cf4adb9e9b685bac6b7a5db852c23fd068f - -# p_scalar = n - 99 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324ee -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = bc438ae1a4e65b07650522fd4a9a3b17b1f1abb66a7b43712d037bf83f9432b4, 4a673fe054fcd65a03a3c2c7b98ff4b37ab58a3f75503e4631b57ea284693c04 - -# p_scalar = n - 98 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324ef -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = a6eecf308794885e74b44206ee3751becc8715abbc82a095d5192c88589b69ff, e9f04cd324c2e3116b5df55fe390da5ba3f98377daa4c864a05a7aa8dd0ce3b4 - -# p_scalar = n - 97 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324f0 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = f1ae5380578181c7ee848e1d2566805eda8cdb78397e43f4dc90323bafceb64d, 1fbd470f53cf3e6984577f1f3260b76785f4d9c45b68b7e72dc7b8e69c70c77c - -# p_scalar = n - 96 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324f1 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 11eddf7fd0a0da0d14f356cc6abc354d6d490a4b19dd329b802b8d2333e12b70, 3f2a78b3241a2b7103b48cc47c29bca2fd2f4f8cfd0258131e208328d87fd1d8 - -# p_scalar = n - 95 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324f2 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 76a8f9fea974291f9a127f2bcaa12d0d6684ad762b346fd2263e039bb308cc40, 3f293fda2cd6f439ee1b1cb5344455a165499c990c5dbba0c802049b68aa19e4 - -# p_scalar = n - 94 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324f3 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = bf87ea83037278d9c87bdb8203d41796955ef205d59848ebc82a7aefd2df5e7a, 1001f8d7dd85aa7bf8ea79eadfa99607c00286d964135771c5825a638719aea8 - -# p_scalar = n - 93 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324f4 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 0581b4711fdf24984a278686e16396070aeaca9afd36b1af64cfdc70d9453d29, 435ac466954ffbb3ff6c1a78f9a2852f20b021c3df219dc582290e253d61f6d2 - -# p_scalar = n - 92 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324f5 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = aee309e543ae4336e4c8417839093801a8a38bc31487c5269d7127d76294ba47, d15428592faab2944a72075d7f73442a9929ad4e8f48bb12d4b127399359250d - -# p_scalar = n - 91 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324f6 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 0211de8fd56927054a39f02bbedd4f4727113bb4ae6a94b8d81ad9386982f865, 4a70abf75c554ed3fa8a5b9b0b46a59f2354719f6237fc68d587138c63c92f69 - -# p_scalar = n - 90 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324f7 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 8307d5cb55648a4cf3df44ded7ee64b747305b7483e904469af9d782de992e6e, e485b90d49c0b6a1ad3294fb1c309a59abff56b525d3fdee5376b018e277280a - -# p_scalar = n - 89 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324f8 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = bd88aca74765b8053ea123446310eb5a62d51e29fd54487dc1ee6264a7eabe67, 7150f87e7211e4457ab49dd209f98f9a640388f83b9fffefb7b284be14fb691a - -# p_scalar = n - 88 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324f9 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 948fb3f76932e6311707165bb939f40fabeee3e9369a60677d81fd488418cae4, d8d37d942785971ded5cf82dc911847cbdf176108c7f9dba005a1dffeabd468e - -# p_scalar = n - 87 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324fa -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 2bd0204360826caa041252997f6b0670b856664a2d4b409b516329ff7b4d8b2c, af490825d5cff157a8f439ab06e58e3ecd07bc34c235d56c010e522661ddbcb1 - -# p_scalar = n - 86 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324fb -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = a9ea1b80f80e4b9023fb74270b4af06e783b9ba6744a6528dd5c2b8142a18dc1, e6c93b31cefdb61d9a9f04f0e8aeaf7d4a2b5ed57defe51b559759f6edca6f38 - -# p_scalar = n - 85 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324fc -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = abfc8457b5e11eff36bf2f65ea65641aef617e0025af76773646b0dd7e1ee314, 159751e2e1cbaebebb0066ae1f282369ce91ee270142811b998dfac18f1192b6 - -# p_scalar = n - 84 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324fd -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 2f83a889ca881f6c10b429a2811a47eb2cd0bab9941a27e9b7f1695a43020eec, 4cb3c135b6f36034df4741a71b99ec5f67f9ba802e45cbb12563c590f683e890 - -# p_scalar = n - 83 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324fe -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = cf3086e87a243ca4f87abebf2ab80485125d4714ec67199a2c9ee62dc3363a22, 97f0013247b64be50536a39db19c61265e9b16125625aad75c52b051c64e09dd - -# p_scalar = n - 82 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324ff -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 8d97fd53554fa366b932d0c17527465559d18be925a81aef80ee662fad29cf9c, 18f61f3cdef3f99d4976126318fb05ae41a471e4e93046f2ad5cb247cd789d17 - -# p_scalar = n - 81 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632500 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = e0beeb1aebff18d3b097c711165c6e4c8e9d0af402ba3183d3a5d81fc63d5e79, 7acf4419e85bc145cbdbfdb9cf290d1fa02dbc426fe5b29dfe657f130801937b - -# p_scalar = n - 80 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632501 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = c0bfffc45263832a2074213db27de57335ff9aa8b5f86a2c492bdc0752b3e584, 2995919ca4cd266052b6a1739220f4281b037d75b320ebfb2429c22a1d49c605 - -# p_scalar = n - 79 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632502 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 5ed556aae89327fc58f6428165f89e14dd306e2a05176f8ba40206d330ff0e92, b75df5ec191a421fd07370c450128375097a54ff99227b16c2b1870af8321bb8 - -# p_scalar = n - 78 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632503 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = c0e78a3897536f3f711f8b7f7b5065a47e96610365013b3aade6af11a6ab1ecf, f8bdf2ea8474d0c8ea2240ccef96b473407bffa1b201137148b4389c464423d3 - -# p_scalar = n - 77 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632504 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = db15e4963d5baeb19c30c6422b2f9c49719a87be5a0ec9ce0a2193bfc266f85c, 854dc9d595105f9e2b4f0c7877eb94ea4788522b2e9fdbb283c3139be0d37321 - -# p_scalar = n - 76 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632505 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 1558fe4c7ef5b48a7c703717cd1823b4285bed3c21848f49cd331464c89bdd46, 9b3b040493b83e45ee4826a9937e1ba33fc6e661d47fa3cb19c6602050eaed5f - -# p_scalar = n - 75 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632506 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = a22f8fbea42fd1f6f123716223af72e0cfa8ca0e2a7aa6ab616d2c02fb760095, 24a1bde1d0c2302de79807a770456a7e7be19f0ded4437a85072758b78f3d040 - -# p_scalar = n - 74 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632507 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = d176448e35b23e27b00eea8a5d34f708294b12e1ca1b04e046ce85a9e25a441e, 0a48558f2fa1bd2f77c52d75519978d10c45e52db3bfffc85ce885392bb80ef9 - -# p_scalar = n - 73 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632508 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = b2dacdf66ef82fce794922ef17e29b1a2b34a7dc096fb852ae8f8fe1eeb03d1a, c39725521af82878a66d92525e82d5b3b871ba63e405ca09db8dcc81f42911ee - -# p_scalar = n - 72 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632509 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = c3b025a015b15144eb5d0c75f38fae9cb1ee4879a360fb557331369679c1e3b1, 6fcd0cbb809a06f20368eb1f2e4283e11ba0cb8c9c5d2e6a33ad53540dc40604 - -# p_scalar = n - 71 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63250a -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = dd421b5d4a210364f94aa89b40750d0149c7cb94fc05804bf19f382e92aa7864, 574cc7b29378679111f947e696cd0572030a119fdd4af1ec56cd001e39df3672 - -# p_scalar = n - 70 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63250b -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 100392dc78c04937681d690f2b3a8c597263de1539f76b817c5a2a14f58a379a, c6793ad2e6e2f3b19cc6e22a27c9a2ead11ae42dad0182e407e5e8e85bef953a - -# p_scalar = n - 69 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63250c -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 49d3ad05548efa2ac856868891e9ae0987986a54361bfe259e5da11cc5e79347, 6d37b1fa546fbecc2126ac553a8dd1269bea0d0f2655d14f987b0687f4eb5cf6 - -# p_scalar = n - 68 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63250d -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 031195d5bb4a44b9b2cdb039f99c55fec35d34e70dd71fab8732d5cd6a93954d, f66904b1400c9463440dec9ece0f8c32bb7047347b57df81baa37f5d08a660c8 - -# p_scalar = n - 67 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63250e -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = e8218ad07de96a54fc88362a891ea186c16d0c52a48a4ddd86f04d3b51f9c391, fd59d7eb9a8f62d9de3ec728c30a96a005af456a06620ae82c735ac12f33af7a - -# p_scalar = n - 66 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63250f -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 78ed4fe6e3a7de485a7e384de42f8cb2a3cfa7fd44b81977c7c6e4d1c4ce250f, b12347993e909dfb9c03344b75554fad55912064d0f5bb2aa9231c8ce9e571ca - -# p_scalar = n - 65 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632510 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 01628c4706b6090abf639ed67765765e79527db7ba66f4b9dc2306ebfcdbb2b2, 7d096ac42f1747502c90d98cf3e055d633cb7691ba659f4666eb62f1b957b4a1 - -# p_scalar = n - 64 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632511 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 95fb8394569b38c77da70b83c2c61e01380a0913089f73b9db6d96f305968b80, 296720440e8449708010a4a078424bf88f726bb98faeaf829a3c651280edfe2f - -# p_scalar = n - 63 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632512 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 0763a43482fc568d95c376329182cb26039c4800f0518eedb8d3d9319ff91fe5, 90876a0140959b7092bf7c8f91230de0ac98b930824e8197707c04d5383e76ba - -# p_scalar = n - 62 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632513 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 0dbcb03ae539b413177aa4c02089a2336ed7e061ed58f5a7e535f175a1962f91, 6b60cfff35ace009dd47ff98814be9ee6472e5ef6806701ee3dc424ebb32e38e - -# p_scalar = n - 61 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632514 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 994a44a69b8335fa71cdf6537eceb50a59556621a9404f843667eb1a7f4c04cc, 0d1bc780872bdbf3b6658466da44bba2473c5680eed4350dd7faf819dbeb9b69 - -# p_scalar = n - 60 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632515 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = d40c4ccdbc6f9915026f8fe2671c39bc33fc23364189d9c7dc1e6828ed8a6e19, 04820109bbe4e832c40a04bd4f51ad9612c651a022adff2cafa135bbf80e75ca - -# p_scalar = n - 59 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632516 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 4c2bab1b8add53b7cb9727eaa2d17c362100d5d3a8d063d169d44ed65c46aa8e, a062499846fb7a8b6651f7017ce477f8778afcd3a837ebeaa084e90c15426704 - -# p_scalar = n - 58 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632517 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 305f725f648d02cdd66fe3b67ed78be199cac80de4299aaff26c00e8a7ea82f0, 063749945667474117ab562dbe5ffb3efa70533e7a6319ad33ed1bc4623fb21b - -# p_scalar = n - 57 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632518 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = c13298306acf8ccc068212e3fd1eaf381bfeea57c7385b293ec832e77acaca28, da44c6c600017626c5ab2632c79b7a015748060db661782ab909f2db2aac9e59 - -# p_scalar = n - 56 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632519 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = ba3f0c4a7451ae636a84438514600044bb1ff3ca9556f36a8fc441407e8d7a14, 83927681026c2c084e9a5bc2a4b596ac01e0db86b1f2214bdfcac25b1f9af32a - -# p_scalar = n - 55 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63251a -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 5cee8449a7b730dd0deb0e4a46c814c131eea5bf07ef5be6258bbbf9e7305683, 25e8013ff14cf3f4c2cf6a6880e518caee759f879e27a6b4eab495c5a0182bde - -# p_scalar = n - 54 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63251b -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = bb8a0feaee26c851c1286ff925c4d56c4f2e512ef8557c5fa0425b8eb212cf53, 1a556e3fea9595eb3df277a41d1936b17ee0c444e76265aac28f70d2e7d6107e - -# p_scalar = n - 53 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63251c -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = ec3a318d306634b0912e8beda8c8acd95f9c3fc492f2467997359638546c4d8d, fba1da5943465283b155bcd2dcafe1973db82f6f522113f280167f41c31cb264 - -# p_scalar = n - 52 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63251d -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 88f77f34d0e5e542905a3201c67528b72e0ec469af45f9c02692f36e83445904, 7ef2f2269c0f0f8d5c27014b9bbec39e23b92eae22df3562f67a8d295864687c - -# p_scalar = n - 51 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63251e -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = d20ebe0d5c3fa443da1deb852f4318d4e20bc0ba1e5edf3f508cec1c3b3f64c9, d731e383a2f54c2d99a5e23d82681c6261f1511c5e1a5f65370b4ea773241ea3 - -# p_scalar = n - 50 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63251f -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 0dceb8db2b7eaba7edfbe268d5b1fa6aa78bfbaa136852780fb9c2d0488c171a, d7d34194c3628c1343b7716bcc143a46efde7ae6a4449c96bf9e80899ae2b710 - -# p_scalar = n - 49 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632520 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = abdbe6084fb7db2bff4cd0b228766127ffe7048453dc690921950b421ff6acd3, d394077ef247fa364d78f592f7818ed826147d27f4645b5a837c92285e1109e8 - -# p_scalar = n - 48 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632521 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = c8403902470343ad1a1baaa76d8805bda7496529bbd803a06b34413077adc612, 85efc7e941325cc2a875f5ce529d75e30b26d7fbb7d8c5b739f59f66175adff1 - -# p_scalar = n - 47 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632522 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 4b969974eba78bfd6b20afec715af2c70a624fa936c83906283c7513caa76097, 9bbff86e6dddfd2704819d515ded93d49b944e107baeca13220755ccd921d60e - -# p_scalar = n - 46 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632523 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = cec684c3a42931dca1030d5babf825e0785c339aa06e9eba4075b5b149ee90d9, 033da338c1b7f86557c8b2c055f7835d45431d665ab43f2b42ab62c9c1586e63 - -# p_scalar = n - 45 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632524 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = e94f7d346d8232781b1e8ae057477f580032940b946c6e181ee426ccd5cd79bf, d73acbfe2cd9e6b5772ef6dec7f80c81c5254469f72b33a5c747cb96782ba21a - -# p_scalar = n - 44 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632525 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 5f3425f6a98dd2915f0e2046e381d3b0009194abb29110fbecfd7c1fd55a897c, eb629f90387ba42a397a247dd69d34170423446c4b083b7fbfa06687730d50da - -# p_scalar = n - 43 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632526 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 179c85db3db01994b7d9ad900574598180c5bfb4878873fa4ff23ffd248a7d06, 47795f4f95b2dda09e91cd3ba5e6a3184d82d052eadce5a8ba41b06261a6966c - -# p_scalar = n - 42 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632527 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 649c89ce5bfafe43c2e2594c30a92f8fa155cbe31da6a5c75fb35ccfed2bad01, f3a8cfe389bc7d3d4b00b20b906014cf9b359611f32c50aed158667de9ff257a - -# p_scalar = n - 41 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632528 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 98100a4fdb01614feeca111539ce22716fdfe0b56f072822624d60492ed22e91, f70bfeec03884a7bc67732591d57d9ceb6f94d2ec87e9a47b6b0daa2a35c628f - -# p_scalar = n - 40 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632529 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 462d7b0075f732278909984c66f2728083200f0bdf25e13ce4d7681db82e9f3e, 03466612d1aa702fab256ea35ef5435974c6e18c36ab1c34d90ba188f2651798 - -# p_scalar = n - 39 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63252a -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 5853e4c4363186ac068f237d16fb36646f5ae714ff0b9346a9d89488a059c142, 0c0bc0e56919240847b864fae14e7b1c2ec4a76681828876e2d87d2363c52f98 - -# p_scalar = n - 38 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63252b -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = adf0c7dc7c603d6c7463fd85222ef33b512331170fe948ce8a2cc3ca4d63c0ee, d9a4c2809c80c34dbdaa84d68e59319cccaab359bf3804090ec32d3bfe7765e5 - -# p_scalar = n - 37 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63252c -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 2763a387dfa394ebc5748baea677d806b636458c7f178d5500467bc58cce08b5, 58b36143620088a8f63ebce51558462ce7adda3e6f20d850a12b448a7d3cebb6 - -# p_scalar = n - 36 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63252d -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 3569656cd54a3dc30ae4cb10d257576ec691d0bd1b06c57f3d5e58d6a8219bb7, 480b9e11dd6da526450ac0bae251a0c6934e82d3162bfe13e5ebaebd94cda03a - -# p_scalar = n - 35 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63252e -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = ca640b8642a3e5210b8e4134efc2b4c8742ee464233e76b7fd16847fdec67ef5, 2ba901628bb47af824e4ab126b237af7313c300c547852d5653a01908ceb6aa9 - -# p_scalar = n - 34 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63252f -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = c982ddd4dd303e645b0673a375678d94caa7a5c6a391849db6ab20147ca23cd3, a159100c570d74f8c77332a33c569426bba2cb1f6f876f92fd7b000b5db6f971 - -# p_scalar = n - 33 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632530 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 33ec6868f044b10cac09c4ae65578ab985ceae7c4b68f103871514560f664534, b16c4303c32f63c4f909604f763f15745509d1285847d5ef6ac4832b3a8ec1f1 - -# p_scalar = n - 32 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632531 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 39227077695532a4bc6d6a58fead0197befd904c4079dfbfd8c5fccfc5e3a3d8, 6231d7929591c2a47b969c1aad9a2e407e449b64480a990809e23e6ddbef42f5 - -# p_scalar = n - 31 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632532 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 948dc4f8b1fc87b48ef5689d3cf7600ddd3cf7e7473017e6e2f73c696755ff89, f38ae8914d7b4745faecedfd0c9803fc2d921ca298eb6028d9e9fe814ea53299 - -# p_scalar = n - 30 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632533 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = d0288cb552b6fc3cc5f4d6cd3ac77acda3a14e49b44f65a1b4241cb13298b343, 460d45ce51601f72d667da379b3aa441b675511e06bf9b4ad5cc8c2f1c040abc - -# p_scalar = n - 29 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632534 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = e266f95948603d48944a70270317b9e2f1be963a0d9258805e5db46acb66e132, 3798142a2a3be21b8a966939777c619f90472447a2fb18a398db66735c208899 - -# p_scalar = n - 28 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632535 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = e97f6b6af2aadb9797082ec0cfe153eb7323cb2830a6a8924b523eb7172ccd1f, a9b4cc5f405852784a688b482d0cb71ea6a7f9c7804b2a681d3d393ed1a83da1 - -# p_scalar = n - 27 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632536 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 9f8aa54b2ef7c76a49d2c9eb084ffdd7d36a42d7aebf7313042c2af497e2feb4, 2d431068d84bde312d97d10878eb4cbb3bd0c66fddb7fb589200b7ba09895e70 - -# p_scalar = n - 26 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632537 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 994baaa855f2fb101ac7c5eb857ff6fbe6c9267ad8b1753861e4ad32ed1f8008, ed178030d12e5ac714fde97b5fa944f55a39898b628ac50884cf14e11d248018 - -# p_scalar = n - 25 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632538 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 966742eb65432a2ee395993332f1f3af6fc1b49eed6b67b0a4a319acd837879f, 7b948dc356f7996812068859c9b731ee96cc631243f439504b8dc9feb4966228 - -# p_scalar = n - 24 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632539 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = f97b232f2efc311561d7cbf91d2b469f6d0d755040dd9a356d3883b215d02819, 595dc55eca737b8a7669f03193cb750111ea494988a1e356a551d750b24bcbc7 - -# p_scalar = n - 23 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63253a -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = af2cea7c1727bf42d0825fa2a358406937c7a7e89e2e1f6ef4f876532de45068, 83d0687b9077666f48068e1371ac2f71e5fda49c27299f4a0360a4fb9e4785a9 - -# p_scalar = n - 22 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63253b -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = fdc777e8e93358a46a0b0685d2f8ba3dc99ffa23e3912a9a0fc611352f6f3076, 793e8d075d5cd0749de917da153a35b5640c2d6a4d23fea494a787bb35415f04 - -# p_scalar = n - 21 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63253c -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = ecead9f4c16762fc6d2a506c5a3f3b3074e1b2654783f47d562e4cecc135b208, c086d5f1c9477fa37a75023e7fac29a41b0fadc083bb3c61f29dd4b2e286e5b9 - -# p_scalar = n - 20 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63253d -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = e2d1eeb6fe5bfb4e048099d95dd283ba5916868f0f862bdc8a979129d2337a31, 5ee104e1c5fee0d09161c53f8aa95e66a2d4ec17ffffcbae82ef1c417884005d - -# p_scalar = n - 19 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63253e -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = fe545c282897c3fcb8842277752c41ac68363aba25e1a16efea912baa5659ae8, f720ee256d12597b85665e9be39508c15806244afba977c52d36e9e7dc4c696b - -# p_scalar = n - 18 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63253f -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 675abd1b6f80ebdaa6f247ab412e29794afc964d8f8b403e5f3e51c856ada97a, 6c6fc7d90502394d2626927f1b847bba4b2a5caf8f4f0b3c66a2bd725e485a1d - -# p_scalar = n - 17 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632540 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = c1a35c0a6c7a574eb0f139752cfe2dfff17624b6ac0a177b97091dcbd53c5c9d, ebd512263274c3d02f4e247f0d1883bb0575bf30e89cb80e227d314693e79987 - -# p_scalar = n - 16 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632541 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 54d63c809103b723d5ef2f7c2c83f5495882e0753ffe2e6b808b0b650bc6fb80, 64edf7b201efe22055c4623bb1580e9e3670c3194b0b6587f2f11bd652a23f9b - -# p_scalar = n - 15 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632542 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = e2aa0e430ad3da09ee337424e481937003cc23ee56e27e4b72bcd8b7bc60055b, 2042170a7079adf464efa6de778a4797d766355442a41b2540b8524f6383c45d - -# p_scalar = n - 14 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632543 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = faae7332fd12c72e1717bf54c6832660126e48f77f9707e3a242a35bb0cf664a, 152706dc2eaa1bbbe8e4193e2a65e7dbbe29569e832237c227b52db7995d586b - -# p_scalar = n - 13 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632544 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 738477ac5395b759bcbcd43f559e98110e356769856fd30dccc425634b2ed709, fbc08769c9e7b7977cd06422bd1f5bc168748390742ed2e335752b90c00ee17f - -# p_scalar = n - 12 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632545 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 4ee1df77cb83e1562409d29dee37385eabdedef5ca345a3304b71aa7d2697768, 7ff57c9553238aca28228cfa8ade6d66170ed2f6ca8956370cac12d91cbb5b43 - -# p_scalar = n - 11 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632546 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 3e7090f1649c90731ff3a4158dac1ab59de407956e7fdfe0ea7d260a6245e404, 68930023e125b88e0c0daa891ead643d250f939ee57f61c81a7685612b944e88 - -# p_scalar = n - 10 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632547 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = cc61c94724b3428f737d2cd648250b4998f9868a0fcf81392c18dbd19dc21ec8, 78719a54eb3b4ab55f7d2d65779be5d2c43a8991383fbe080c2b407880dd9e76 - -# p_scalar = n - 9 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632548 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = e05b3080f0c4e16b2cc09c0444c8eb00abe6bfed59a7a84175c96e8f264e20e8, 086659cdfd835f9b2b6e019a88b12f1a56af7bedce5d45e31eb7777aa45f3314 - -# p_scalar = n - 8 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632549 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = b763891eb265230d8f90f02af02cfc6b462ab5c56f9b345527f14cd19499a78f, 56ec12f27706df76123c7b84be60bbf021e3327dcf9eba15f59da3a9532d4977 - -# p_scalar = n - 7 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254a -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 13ba5119c3123e03f43eaab50c23bb082bd20213d23c00f70746354ea0173b4f, eaedd9156e240867ef933bdc77c941956742f2f25da67bdd2847d0303f5b9d4d - -# p_scalar = n - 6 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254b -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 13074b5954213673d50a961a5b17a3ad55ae744f346cee3e403947373e77664a, a4c9916d4a07f75ff424d44cef639f11299c2b53adff14b593d36220d377e44b - -# p_scalar = n - 5 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254c -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = c9079605890523c8941cb5aad076c20c90ec649a94b9537dbe1b8aaec45c61f5, 73a076bb2dd1e9163540a9877e7a1f6873c568efe5eb882beb309b4ae7ba4f10 - -# p_scalar = n - 4 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254d -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 577362f541b0176b0cdaacace8100af24650a6edc623c17374b0b50d46918dcc, 84b14c394c5ab8636b6c36dee5ddd22e17628471fad6f4472d96f24ce4cbaba6 - -# p_scalar = n - 3 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254e -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 26936a3fb6ff747e66ad77dd87cbbc98b027f84a087d81fbffac3f904eebc127, d5f06a29e587cc07788208311a2ee98e583e47ad0861fe1ab04c5c1fc983a7eb - -# p_scalar = n - 2 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = f6bb32e43dcf3a3b732205038d1490d9aa6ae3c1a433827d850046d410ddd64d, 78c577510a5b8a3b19a8fb0e92042dbe152cd7cbeb236ff82f3648d361bee1a5 - -# p_scalar = n - 1 -p_scalar = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550 -p = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 8571ff1825885d85d2e88688dd21f3258b4ab8e4ba19e45cddf25357ce95560a diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p256_point_sum_mixed_tests.txt temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p256_point_sum_mixed_tests.txt --- temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p256_point_sum_mixed_tests.txt 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p256_point_sum_mixed_tests.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,80 +0,0 @@ - -# inf + inf == 2 * inf == inf -a = 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000 -b = 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000 -r = inf - -# inf (n*G) + inf (n*G) == 2 * inf == inf -a = 2b11cb945c8cf152ffa4c9c2b1c965b019b35d0b7626919ef0ae6cb9d232f8af, 6d333da42e30f7011245b6281015ded14e0f100968e758a1b6c3c083afc14ea0, 0000000000000000000000000000000000000000000000000000000000000000 -b = 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000 -r = inf - -# inf (n*G) + inf == 2 * inf == inf -a = 2b11cb945c8cf152ffa4c9c2b1c965b019b35d0b7626919ef0ae6cb9d232f8af, 6d333da42e30f7011245b6281015ded14e0f100968e758a1b6c3c083afc14ea0, 0000000000000000000000000000000000000000000000000000000000000000 -b = 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000 -r = inf - -# inf + inf (n*G) == 2 * inf == inf -a = 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000 -b = 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000 -r = inf - -# G + inf == G -a = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 8571ff1825885d85d2e88688dd21f3258b4ab8e4ba19e45cddf25357ce95560a, 00000000fffffffeffffffffffffffffffffffff000000000000000000000001 -b = 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000 -r = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 8571ff1825885d85d2e88688dd21f3258b4ab8e4ba19e45cddf25357ce95560a - -# G + inf (n*G) == G -a = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 8571ff1825885d85d2e88688dd21f3258b4ab8e4ba19e45cddf25357ce95560a, 00000000fffffffeffffffffffffffffffffffff000000000000000000000001 -b = 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000 -r = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 8571ff1825885d85d2e88688dd21f3258b4ab8e4ba19e45cddf25357ce95560a - -# inf + G == G -a = 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000 -b = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 8571ff1825885d85d2e88688dd21f3258b4ab8e4ba19e45cddf25357ce95560a -r = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 8571ff1825885d85d2e88688dd21f3258b4ab8e4ba19e45cddf25357ce95560a - -# inf (n*G) + G == G -a = 2b11cb945c8cf152ffa4c9c2b1c965b019b35d0b7626919ef0ae6cb9d232f8af, 6d333da42e30f7011245b6281015ded14e0f100968e758a1b6c3c083afc14ea0, 0000000000000000000000000000000000000000000000000000000000000000 -b = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 8571ff1825885d85d2e88688dd21f3258b4ab8e4ba19e45cddf25357ce95560a -r = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 8571ff1825885d85d2e88688dd21f3258b4ab8e4ba19e45cddf25357ce95560a - -# G + (n-1)*G == inf; note that -G is (n-1)*G -a = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 8571ff1825885d85d2e88688dd21f3258b4ab8e4ba19e45cddf25357ce95560a, 00000000fffffffeffffffffffffffffffffffff000000000000000000000001 -b = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = inf - -# (n-1)*G + -(n-1)*G == inf -a = 2b11cb945c8cf152ffa4c9c2b1c965b019b35d0b7626919ef0ae6cb9d232f8af, 6d333da42e30f7011245b6281015ded14e0f100968e758a1b6c3c083afc14ea0, 3c396f06c1dc69e4f4b2dce51cd660f761064a4ab098ef61ba3868961f0ef178 -b = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 8571ff1825885d85d2e88688dd21f3258b4ab8e4ba19e45cddf25357ce95560a -r = inf - -# -(n-1)*G + (n-1)*G == inf -a = 2b11cb945c8cf152ffa4c9c2b1c965b019b35d0b7626919ef0ae6cb9d232f8af, 92ccc25ad1cf08ffedba49d7efea212eb1f0eff79718a75e493c3f7c503eb15f, 3c396f06c1dc69e4f4b2dce51cd660f761064a4ab098ef61ba3868961f0ef178 -b = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = inf - -# -(n-1)*G (affine) + (n-1)*G == inf -a = 2b11cb945c8cf152ffa4c9c2b1c965b019b35d0b7626919ef0ae6cb9d232f8af, 92ccc25ad1cf08ffedba49d7efea212eb1f0eff79718a75e493c3f7c503eb15f, 3c396f06c1dc69e4f4b2dce51cd660f761064a4ab098ef61ba3868961f0ef178 -b = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = inf - -# -(n-1)*G + -G == inf; note that -G is (n-1)*G (affine) -a = 2b11cb945c8cf152ffa4c9c2b1c965b019b35d0b7626919ef0ae6cb9d232f8af, 92ccc25ad1cf08ffedba49d7efea212eb1f0eff79718a75e493c3f7c503eb15f, 3c396f06c1dc69e4f4b2dce51cd660f761064a4ab098ef61ba3868961f0ef178 -b = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = inf - -# -G + -(n-1)*G == inf; note that -G is (n-1)*G (affine) -a = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5, 00000000fffffffeffffffffffffffffffffffff000000000000000000000001 -b = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 8571ff1825885d85d2e88688dd21f3258b4ab8e4ba19e45cddf25357ce95560a -r = inf - -# -G + G == inf; note that -G is (n-1)*G (affine) -a = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5, 00000000fffffffeffffffffffffffffffffffff000000000000000000000001 -b = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 8571ff1825885d85d2e88688dd21f3258b4ab8e4ba19e45cddf25357ce95560a -r = inf - -# G + -G == inf; note that -G is (n-1)*G (affine) -a = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 8571ff1825885d85d2e88688dd21f3258b4ab8e4ba19e45cddf25357ce95560a, 00000000fffffffeffffffffffffffffffffffff000000000000000000000001 -b = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5 -r = inf diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p256_point_sum_tests.txt temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p256_point_sum_tests.txt --- temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p256_point_sum_tests.txt 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p256_point_sum_tests.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,120 +0,0 @@ - -# inf + inf == 2 * inf == inf -a = 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000 -b = 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000 -r = inf - -# inf (n*G) + inf (n*G) == 2 * inf == inf -a = 2b11cb945c8cf152ffa4c9c2b1c965b019b35d0b7626919ef0ae6cb9d232f8af, 6d333da42e30f7011245b6281015ded14e0f100968e758a1b6c3c083afc14ea0, 0000000000000000000000000000000000000000000000000000000000000000 -b = 2b11cb945c8cf152ffa4c9c2b1c965b019b35d0b7626919ef0ae6cb9d232f8af, 6d333da42e30f7011245b6281015ded14e0f100968e758a1b6c3c083afc14ea0, 0000000000000000000000000000000000000000000000000000000000000000 -r = inf - -# inf (n*G) + inf == 2 * inf == inf -a = 2b11cb945c8cf152ffa4c9c2b1c965b019b35d0b7626919ef0ae6cb9d232f8af, 6d333da42e30f7011245b6281015ded14e0f100968e758a1b6c3c083afc14ea0, 0000000000000000000000000000000000000000000000000000000000000000 -b = 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000 -r = inf - -# inf + inf (n*G) == 2 * inf == inf -a = 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000 -b = 2b11cb945c8cf152ffa4c9c2b1c965b019b35d0b7626919ef0ae6cb9d232f8af, 6d333da42e30f7011245b6281015ded14e0f100968e758a1b6c3c083afc14ea0, 0000000000000000000000000000000000000000000000000000000000000000 -r = inf - -# G + inf == G -a = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 8571ff1825885d85d2e88688dd21f3258b4ab8e4ba19e45cddf25357ce95560a, 00000000fffffffeffffffffffffffffffffffff000000000000000000000001 -b = 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000 -r = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 8571ff1825885d85d2e88688dd21f3258b4ab8e4ba19e45cddf25357ce95560a - -# G + inf (n*G) == G -a = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 8571ff1825885d85d2e88688dd21f3258b4ab8e4ba19e45cddf25357ce95560a, 00000000fffffffeffffffffffffffffffffffff000000000000000000000001 -b = 2b11cb945c8cf152ffa4c9c2b1c965b019b35d0b7626919ef0ae6cb9d232f8af, 6d333da42e30f7011245b6281015ded14e0f100968e758a1b6c3c083afc14ea0, 0000000000000000000000000000000000000000000000000000000000000000 -r = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 8571ff1825885d85d2e88688dd21f3258b4ab8e4ba19e45cddf25357ce95560a - -# inf + G == G -a = 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000, 0000000000000000000000000000000000000000000000000000000000000000 -b = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 8571ff1825885d85d2e88688dd21f3258b4ab8e4ba19e45cddf25357ce95560a, 00000000fffffffeffffffffffffffffffffffff000000000000000000000001 -r = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 8571ff1825885d85d2e88688dd21f3258b4ab8e4ba19e45cddf25357ce95560a - -# inf (n*G) + G == G -a = 2b11cb945c8cf152ffa4c9c2b1c965b019b35d0b7626919ef0ae6cb9d232f8af, 6d333da42e30f7011245b6281015ded14e0f100968e758a1b6c3c083afc14ea0, 0000000000000000000000000000000000000000000000000000000000000000 -b = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 8571ff1825885d85d2e88688dd21f3258b4ab8e4ba19e45cddf25357ce95560a, 00000000fffffffeffffffffffffffffffffffff000000000000000000000001 -r = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 8571ff1825885d85d2e88688dd21f3258b4ab8e4ba19e45cddf25357ce95560a - -# G + G == 2*G -a = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 8571ff1825885d85d2e88688dd21f3258b4ab8e4ba19e45cddf25357ce95560a, 00000000fffffffeffffffffffffffffffffffff000000000000000000000001 -b = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 8571ff1825885d85d2e88688dd21f3258b4ab8e4ba19e45cddf25357ce95560a, 00000000fffffffeffffffffffffffffffffffff000000000000000000000001 -r = f6bb32e43dcf3a3b732205038d1490d9aa6ae3c1a433827d850046d410ddd64d, 78c577510a5b8a3b19a8fb0e92042dbe152cd7cbeb236ff82f3648d361bee1a5 - -# (n-1)*G + G == inf; note that -G is (n-1)*G -a = 2b11cb945c8cf152ffa4c9c2b1c965b019b35d0b7626919ef0ae6cb9d232f8af, 6d333da42e30f7011245b6281015ded14e0f100968e758a1b6c3c083afc14ea0, 3c396f06c1dc69e4f4b2dce51cd660f761064a4ab098ef61ba3868961f0ef178 -b = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 8571ff1825885d85d2e88688dd21f3258b4ab8e4ba19e45cddf25357ce95560a, 00000000fffffffeffffffffffffffffffffffff000000000000000000000001 -r = inf - -# G + (n-1)*G == inf; note that -G is (n-1)*G -a = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 8571ff1825885d85d2e88688dd21f3258b4ab8e4ba19e45cddf25357ce95560a, 00000000fffffffeffffffffffffffffffffffff000000000000000000000001 -b = 2b11cb945c8cf152ffa4c9c2b1c965b019b35d0b7626919ef0ae6cb9d232f8af, 6d333da42e30f7011245b6281015ded14e0f100968e758a1b6c3c083afc14ea0, 3c396f06c1dc69e4f4b2dce51cd660f761064a4ab098ef61ba3868961f0ef178 -r = inf - -# (n-1)*G + (n-1)*G == 2*(n-1)*G -a = 2b11cb945c8cf152ffa4c9c2b1c965b019b35d0b7626919ef0ae6cb9d232f8af, 6d333da42e30f7011245b6281015ded14e0f100968e758a1b6c3c083afc14ea0, 3c396f06c1dc69e4f4b2dce51cd660f761064a4ab098ef61ba3868961f0ef178 -b = 2b11cb945c8cf152ffa4c9c2b1c965b019b35d0b7626919ef0ae6cb9d232f8af, 6d333da42e30f7011245b6281015ded14e0f100968e758a1b6c3c083afc14ea0, 3c396f06c1dc69e4f4b2dce51cd660f761064a4ab098ef61ba3868961f0ef178 -r = f6bb32e43dcf3a3b732205038d1490d9aa6ae3c1a433827d850046d410ddd64d, 873a88adf5a475c5e65704f16dfbd241ead3283514dc9007d0c9b72c9e411e5a - -# (n-1)*G (affine) + (n-1)*G == 2*(n-1)*G -a = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5, 00000000fffffffeffffffffffffffffffffffff000000000000000000000001 -b = 2b11cb945c8cf152ffa4c9c2b1c965b019b35d0b7626919ef0ae6cb9d232f8af, 6d333da42e30f7011245b6281015ded14e0f100968e758a1b6c3c083afc14ea0, 3c396f06c1dc69e4f4b2dce51cd660f761064a4ab098ef61ba3868961f0ef178 -r = f6bb32e43dcf3a3b732205038d1490d9aa6ae3c1a433827d850046d410ddd64d, 873a88adf5a475c5e65704f16dfbd241ead3283514dc9007d0c9b72c9e411e5a - -# (n-1)*G + -(n-1)*G == inf -a = 2b11cb945c8cf152ffa4c9c2b1c965b019b35d0b7626919ef0ae6cb9d232f8af, 6d333da42e30f7011245b6281015ded14e0f100968e758a1b6c3c083afc14ea0, 3c396f06c1dc69e4f4b2dce51cd660f761064a4ab098ef61ba3868961f0ef178 -b = 2b11cb945c8cf152ffa4c9c2b1c965b019b35d0b7626919ef0ae6cb9d232f8af, 92ccc25ad1cf08ffedba49d7efea212eb1f0eff79718a75e493c3f7c503eb15f, 3c396f06c1dc69e4f4b2dce51cd660f761064a4ab098ef61ba3868961f0ef178 -r = inf - -# -(n-1)*G + (n-1)*G == inf -a = 2b11cb945c8cf152ffa4c9c2b1c965b019b35d0b7626919ef0ae6cb9d232f8af, 92ccc25ad1cf08ffedba49d7efea212eb1f0eff79718a75e493c3f7c503eb15f, 3c396f06c1dc69e4f4b2dce51cd660f761064a4ab098ef61ba3868961f0ef178 -b = 2b11cb945c8cf152ffa4c9c2b1c965b019b35d0b7626919ef0ae6cb9d232f8af, 6d333da42e30f7011245b6281015ded14e0f100968e758a1b6c3c083afc14ea0, 3c396f06c1dc69e4f4b2dce51cd660f761064a4ab098ef61ba3868961f0ef178 -r = inf - -# -(n-1)*G (affine) + (n-1)*G == inf -a = 2b11cb945c8cf152ffa4c9c2b1c965b019b35d0b7626919ef0ae6cb9d232f8af, 92ccc25ad1cf08ffedba49d7efea212eb1f0eff79718a75e493c3f7c503eb15f, 3c396f06c1dc69e4f4b2dce51cd660f761064a4ab098ef61ba3868961f0ef178 -b = 2b11cb945c8cf152ffa4c9c2b1c965b019b35d0b7626919ef0ae6cb9d232f8af, 6d333da42e30f7011245b6281015ded14e0f100968e758a1b6c3c083afc14ea0, 3c396f06c1dc69e4f4b2dce51cd660f761064a4ab098ef61ba3868961f0ef178 -r = inf - -# -(n-1)*G + -G == inf; note that -G is (n-1)*G (affine) -a = 2b11cb945c8cf152ffa4c9c2b1c965b019b35d0b7626919ef0ae6cb9d232f8af, 92ccc25ad1cf08ffedba49d7efea212eb1f0eff79718a75e493c3f7c503eb15f, 3c396f06c1dc69e4f4b2dce51cd660f761064a4ab098ef61ba3868961f0ef178 -b = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5, 00000000fffffffeffffffffffffffffffffffff000000000000000000000001 -r = inf - -# -G + -(n-1)*G == inf; note that -G is (n-1)*G (affine) -a = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5, 00000000fffffffeffffffffffffffffffffffff000000000000000000000001 -b = 2b11cb945c8cf152ffa4c9c2b1c965b019b35d0b7626919ef0ae6cb9d232f8af, 92ccc25ad1cf08ffedba49d7efea212eb1f0eff79718a75e493c3f7c503eb15f, 3c396f06c1dc69e4f4b2dce51cd660f761064a4ab098ef61ba3868961f0ef178 -r = inf - -# (n-1)*G + -G; == -2*G; note that -G == (n-1)*G (affine) -a = 2b11cb945c8cf152ffa4c9c2b1c965b019b35d0b7626919ef0ae6cb9d232f8af, 6d333da42e30f7011245b6281015ded14e0f100968e758a1b6c3c083afc14ea0, 3c396f06c1dc69e4f4b2dce51cd660f761064a4ab098ef61ba3868961f0ef178 -b = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5, 00000000fffffffeffffffffffffffffffffffff000000000000000000000001 -r = f6bb32e43dcf3a3b732205038d1490d9aa6ae3c1a433827d850046d410ddd64d, 873a88adf5a475c5e65704f16dfbd241ead3283514dc9007d0c9b72c9e411e5a - -# -G + (n-1)*G == -2*G; note that -G is (n-1)*G (affine) -a = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5, 00000000fffffffeffffffffffffffffffffffff000000000000000000000001 -b = 2b11cb945c8cf152ffa4c9c2b1c965b019b35d0b7626919ef0ae6cb9d232f8af, 6d333da42e30f7011245b6281015ded14e0f100968e758a1b6c3c083afc14ea0, 3c396f06c1dc69e4f4b2dce51cd660f761064a4ab098ef61ba3868961f0ef178 -r = f6bb32e43dcf3a3b732205038d1490d9aa6ae3c1a433827d850046d410ddd64d, 873a88adf5a475c5e65704f16dfbd241ead3283514dc9007d0c9b72c9e411e5a - -# (n-1)*G + -G == -2*G; note that -G is (n-1)*G (affine) -a = 2b11cb945c8cf152ffa4c9c2b1c965b019b35d0b7626919ef0ae6cb9d232f8af, 6d333da42e30f7011245b6281015ded14e0f100968e758a1b6c3c083afc14ea0, 3c396f06c1dc69e4f4b2dce51cd660f761064a4ab098ef61ba3868961f0ef178 -b = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5, 00000000fffffffeffffffffffffffffffffffff000000000000000000000001 -r = f6bb32e43dcf3a3b732205038d1490d9aa6ae3c1a433827d850046d410ddd64d, 873a88adf5a475c5e65704f16dfbd241ead3283514dc9007d0c9b72c9e411e5a - -# -G + (n-1)*G == -2*G; note that -G = (n-1)*G -a = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5, 00000000fffffffeffffffffffffffffffffffff000000000000000000000001 -b = 2b11cb945c8cf152ffa4c9c2b1c965b019b35d0b7626919ef0ae6cb9d232f8af, 6d333da42e30f7011245b6281015ded14e0f100968e758a1b6c3c083afc14ea0, 3c396f06c1dc69e4f4b2dce51cd660f761064a4ab098ef61ba3868961f0ef178 -r = f6bb32e43dcf3a3b732205038d1490d9aa6ae3c1a433827d850046d410ddd64d, 873a88adf5a475c5e65704f16dfbd241ead3283514dc9007d0c9b72c9e411e5a - -# -G + G == inf; note that -G is (n-1)*G (affine) -a = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5, 00000000fffffffeffffffffffffffffffffffff000000000000000000000001 -b = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 8571ff1825885d85d2e88688dd21f3258b4ab8e4ba19e45cddf25357ce95560a, 00000000fffffffeffffffffffffffffffffffff000000000000000000000001 -r = inf - -# G + -G == inf; note that -G is (n-1)*G (affine) -a = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 8571ff1825885d85d2e88688dd21f3258b4ab8e4ba19e45cddf25357ce95560a, 00000000fffffffeffffffffffffffffffffffff000000000000000000000001 -b = 18905f76a53755c679fb732b7762251075ba95fc5fedb60179e730d418a9143c, 7a8e00e6da77a27b2d17797722de0cda74b5471c45e61ba3220daca8316aa9f5, 00000000fffffffeffffffffffffffffffffffff000000000000000000000001 -r = inf diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p256.rs temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p256.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p256.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p256.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,382 +0,0 @@ -// Copyright 2016 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -use super::{ - elem::{binary_op, binary_op_assign}, - elem_sqr_mul, elem_sqr_mul_acc, Modulus, *, -}; -use core::marker::PhantomData; - -macro_rules! p256_limbs { - [ $($limb:expr),+ ] => { - limbs![$($limb),+, 0, 0, 0, 0] - }; -} - -pub static COMMON_OPS: CommonOps = CommonOps { - num_limbs: 256 / LIMB_BITS, - - q: Modulus { - p: p256_limbs![ - 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000001, - 0xffffffff - ], - rr: p256_limbs![ - 0x00000003, 0x00000000, 0xffffffff, 0xfffffffb, 0xfffffffe, 0xffffffff, 0xfffffffd, - 0x00000004 - ], - }, - - n: Elem { - limbs: p256_limbs![ - 0xfc632551, 0xf3b9cac2, 0xa7179e84, 0xbce6faad, 0xffffffff, 0xffffffff, 0x00000000, - 0xffffffff - ], - m: PhantomData, - encoding: PhantomData, // Unencoded - }, - - a: Elem { - limbs: p256_limbs![ - 0xfffffffc, 0xffffffff, 0xffffffff, 0x00000003, 0x00000000, 0x00000000, 0x00000004, - 0xfffffffc - ], - m: PhantomData, - encoding: PhantomData, // R - }, - b: Elem { - limbs: p256_limbs![ - 0x29c4bddf, 0xd89cdf62, 0x78843090, 0xacf005cd, 0xf7212ed6, 0xe5a220ab, 0x04874834, - 0xdc30061d - ], - m: PhantomData, - encoding: PhantomData, // R - }, - - elem_add_impl: GFp_nistz256_add, - elem_mul_mont: GFp_nistz256_mul_mont, - elem_sqr_mont: GFp_nistz256_sqr_mont, - - point_add_jacobian_impl: GFp_nistz256_point_add, -}; - -pub static PRIVATE_KEY_OPS: PrivateKeyOps = PrivateKeyOps { - common: &COMMON_OPS, - elem_inv_squared: p256_elem_inv_squared, - point_mul_base_impl: p256_point_mul_base_impl, - point_mul_impl: GFp_nistz256_point_mul, -}; - -fn p256_elem_inv_squared(a: &Elem) -> Elem { - // Calculate a**-2 (mod q) == a**(q - 3) (mod q) - // - // The exponent (q - 3) is: - // - // 0xffffffff00000001000000000000000000000000fffffffffffffffffffffffc - - #[inline] - fn sqr_mul(a: &Elem, squarings: usize, b: &Elem) -> Elem { - elem_sqr_mul(&COMMON_OPS, a, squarings, b) - } - - #[inline] - fn sqr_mul_acc(a: &mut Elem, squarings: usize, b: &Elem) { - elem_sqr_mul_acc(&COMMON_OPS, a, squarings, b) - } - - let b_1 = &a; - let b_11 = sqr_mul(b_1, 1, b_1); - let b_111 = sqr_mul(&b_11, 1, b_1); - let f_11 = sqr_mul(&b_111, 3, &b_111); - let fff = sqr_mul(&f_11, 6, &f_11); - let fff_111 = sqr_mul(&fff, 3, &b_111); - let fffffff_11 = sqr_mul(&fff_111, 15, &fff_111); - let ffffffff = sqr_mul(&fffffff_11, 2, &b_11); - - // ffffffff00000001 - let mut acc = sqr_mul(&ffffffff, 31 + 1, b_1); - - // ffffffff00000001000000000000000000000000ffffffff - sqr_mul_acc(&mut acc, 96 + 32, &ffffffff); - - // ffffffff00000001000000000000000000000000ffffffffffffffff - sqr_mul_acc(&mut acc, 32, &ffffffff); - - // ffffffff00000001000000000000000000000000fffffffffffffffffffffff_11 - sqr_mul_acc(&mut acc, 30, &fffffff_11); - - // ffffffff00000001000000000000000000000000fffffffffffffffffffffffc - COMMON_OPS.elem_square(&mut acc); - COMMON_OPS.elem_square(&mut acc); - - acc -} - -fn p256_point_mul_base_impl(g_scalar: &Scalar) -> Point { - let mut r = Point::new_at_infinity(); - - // Keep this in sync with the logic for defining `GFp_USE_LARGE_TABLE` and - // with the logic for deciding whether to test `GFp_nistz256_point_add_affine` - // in suite_b/ops.rs. - - #[cfg(any(target_arch = "aarch64", target_arch = "x86", target_arch = "x86_64"))] - { - extern "C" { - fn GFp_nistz256_point_mul_base( - r: *mut Limb, // [3][COMMON_OPS.num_limbs] - g_scalar: *const Limb, // [COMMON_OPS.num_limbs] - ); - } - unsafe { - GFp_nistz256_point_mul_base(r.xyz.as_mut_ptr(), g_scalar.limbs.as_ptr()); - } - } - - #[cfg(not(any(target_arch = "aarch64", target_arch = "x86", target_arch = "x86_64")))] - { - static GENERATOR: (Elem, Elem) = ( - Elem { - limbs: p256_limbs![ - 0x18a9143c, 0x79e730d4, 0x5fedb601, 0x75ba95fc, 0x77622510, 0x79fb732b, - 0xa53755c6, 0x18905f76 - ], - m: PhantomData, - encoding: PhantomData, - }, - Elem { - limbs: p256_limbs![ - 0xce95560a, 0xddf25357, 0xba19e45c, 0x8b4ab8e4, 0xdd21f325, 0xd2e88688, - 0x25885d85, 0x8571ff18 - ], - m: PhantomData, - encoding: PhantomData, - }, - ); - - unsafe { - GFp_nistz256_point_mul( - r.xyz.as_mut_ptr(), - g_scalar.limbs.as_ptr(), - GENERATOR.0.limbs.as_ptr(), - GENERATOR.1.limbs.as_ptr(), - ); - } - } - - r -} - -pub static PUBLIC_KEY_OPS: PublicKeyOps = PublicKeyOps { - common: &COMMON_OPS, -}; - -pub static SCALAR_OPS: ScalarOps = ScalarOps { - common: &COMMON_OPS, - scalar_inv_to_mont_impl: p256_scalar_inv_to_mont, - scalar_mul_mont: GFp_p256_scalar_mul_mont, -}; - -pub static PUBLIC_SCALAR_OPS: PublicScalarOps = PublicScalarOps { - scalar_ops: &SCALAR_OPS, - public_key_ops: &PUBLIC_KEY_OPS, - private_key_ops: &PRIVATE_KEY_OPS, - - q_minus_n: Elem { - limbs: p256_limbs![0x039cdaae, 0x0c46353d, 0x58e8617b, 0x43190553, 0, 0, 0, 0], - m: PhantomData, - encoding: PhantomData, // Unencoded - }, -}; - -pub static PRIVATE_SCALAR_OPS: PrivateScalarOps = PrivateScalarOps { - scalar_ops: &SCALAR_OPS, - - oneRR_mod_n: Scalar { - limbs: p256_limbs![ - 0xbe79eea2, 0x83244c95, 0x49bd6fa6, 0x4699799c, 0x2b6bec59, 0x2845b239, 0xf3d95620, - 0x66e12d94 - ], - m: PhantomData, - encoding: PhantomData, // R - }, -}; - -fn p256_scalar_inv_to_mont(a: &Scalar) -> Scalar { - // Calculate the modular inverse of scalar |a| using Fermat's Little - // Theorem: - // - // a**-1 (mod n) == a**(n - 2) (mod n) - // - // The exponent (n - 2) is: - // - // 0xffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f - - #[inline] - fn mul(a: &Scalar, b: &Scalar) -> Scalar { - binary_op(GFp_p256_scalar_mul_mont, a, b) - } - - #[inline] - fn sqr(a: &Scalar) -> Scalar { - unary_op(GFp_p256_scalar_sqr_mont, a) - } - - // Returns (`a` squared `squarings` times) * `b`. - fn sqr_mul(a: &Scalar, squarings: Limb, b: &Scalar) -> Scalar { - debug_assert!(squarings >= 1); - let mut tmp = Scalar::zero(); - unsafe { GFp_p256_scalar_sqr_rep_mont(tmp.limbs.as_mut_ptr(), a.limbs.as_ptr(), squarings) } - mul(&tmp, b) - } - - // Sets `acc` = (`acc` squared `squarings` times) * `b`. - fn sqr_mul_acc(acc: &mut Scalar, squarings: Limb, b: &Scalar) { - debug_assert!(squarings >= 1); - unsafe { - GFp_p256_scalar_sqr_rep_mont(acc.limbs.as_mut_ptr(), acc.limbs.as_ptr(), squarings) - } - binary_op_assign(GFp_p256_scalar_mul_mont, acc, b); - } - - fn to_mont(a: &Scalar) -> Scalar { - static N_RR: Scalar = Scalar { - limbs: p256_limbs![ - 0xbe79eea2, 0x83244c95, 0x49bd6fa6, 0x4699799c, 0x2b6bec59, 0x2845b239, 0xf3d95620, - 0x66e12d94 - ], - m: PhantomData, - encoding: PhantomData, - }; - binary_op(GFp_p256_scalar_mul_mont, a, &N_RR) - } - - // Indexes into `d`. - const B_1: usize = 0; - const B_10: usize = 1; - const B_11: usize = 2; - const B_101: usize = 3; - const B_111: usize = 4; - const B_1111: usize = 5; - const B_10101: usize = 6; - const B_101111: usize = 7; - const DIGIT_COUNT: usize = 8; - - let mut d = [Scalar::zero(); DIGIT_COUNT]; - - d[B_1] = to_mont(a); - d[B_10] = sqr(&d[B_1]); - d[B_11] = mul(&d[B_10], &d[B_1]); - d[B_101] = mul(&d[B_10], &d[B_11]); - d[B_111] = mul(&d[B_101], &d[B_10]); - let b_1010 = sqr(&d[B_101]); - d[B_1111] = mul(&b_1010, &d[B_101]); - d[B_10101] = sqr_mul(&b_1010, 0 + 1, &d[B_1]); - let b_101010 = sqr(&d[B_10101]); - d[B_101111] = mul(&b_101010, &d[B_101]); - let b_111111 = mul(&b_101010, &d[B_10101]); - - let ff = sqr_mul(&b_111111, 0 + 2, &d[B_11]); - let ffff = sqr_mul(&ff, 0 + 8, &ff); - let ffffffff = sqr_mul(&ffff, 0 + 16, &ffff); - - // ffffffff00000000ffffffff - let mut acc = sqr_mul(&ffffffff, 32 + 32, &ffffffff); - - // ffffffff00000000ffffffffffffffff - sqr_mul_acc(&mut acc, 0 + 32, &ffffffff); - - // The rest of the exponent, in binary, is: - // - // 1011110011100110111110101010110110100111000101111001111010000100 - // 1111001110111001110010101100001011111100011000110010010101001111 - - static REMAINING_WINDOWS: [(u8, u8); 26] = [ - (6, B_101111 as u8), - (2 + 3, B_111 as u8), - (2 + 2, B_11 as u8), - (1 + 4, B_1111 as u8), - (5, B_10101 as u8), - (1 + 3, B_101 as u8), - (3, B_101 as u8), - (3, B_101 as u8), - (2 + 3, B_111 as u8), - (3 + 6, B_101111 as u8), - (2 + 4, B_1111 as u8), - (1 + 1, B_1 as u8), - (4 + 1, B_1 as u8), - (2 + 4, B_1111 as u8), - (2 + 3, B_111 as u8), - (1 + 3, B_111 as u8), - (2 + 3, B_111 as u8), - (2 + 3, B_101 as u8), - (1 + 2, B_11 as u8), - (4 + 6, B_101111 as u8), - (2, B_11 as u8), - (3 + 2, B_11 as u8), - (3 + 2, B_11 as u8), - (2 + 1, B_1 as u8), - (2 + 5, B_10101 as u8), - (2 + 4, B_1111 as u8), - ]; - - for &(squarings, digit) in &REMAINING_WINDOWS { - sqr_mul_acc(&mut acc, Limb::from(squarings), &d[usize::from(digit)]); - } - - acc -} - -extern "C" { - fn GFp_nistz256_add( - r: *mut Limb, // [COMMON_OPS.num_limbs] - a: *const Limb, // [COMMON_OPS.num_limbs] - b: *const Limb, // [COMMON_OPS.num_limbs] - ); - fn GFp_nistz256_mul_mont( - r: *mut Limb, // [COMMON_OPS.num_limbs] - a: *const Limb, // [COMMON_OPS.num_limbs] - b: *const Limb, // [COMMON_OPS.num_limbs] - ); - fn GFp_nistz256_sqr_mont( - r: *mut Limb, // [COMMON_OPS.num_limbs] - a: *const Limb, // [COMMON_OPS.num_limbs] - ); - - fn GFp_nistz256_point_add( - r: *mut Limb, // [3][COMMON_OPS.num_limbs] - a: *const Limb, // [3][COMMON_OPS.num_limbs] - b: *const Limb, // [3][COMMON_OPS.num_limbs] - ); - fn GFp_nistz256_point_mul( - r: *mut Limb, // [3][COMMON_OPS.num_limbs] - p_scalar: *const Limb, // [COMMON_OPS.num_limbs] - p_x: *const Limb, // [COMMON_OPS.num_limbs] - p_y: *const Limb, // [COMMON_OPS.num_limbs] - ); - - fn GFp_p256_scalar_mul_mont( - r: *mut Limb, // [COMMON_OPS.num_limbs] - a: *const Limb, // [COMMON_OPS.num_limbs] - b: *const Limb, // [COMMON_OPS.num_limbs] - ); - fn GFp_p256_scalar_sqr_mont( - r: *mut Limb, // [COMMON_OPS.num_limbs] - a: *const Limb, // [COMMON_OPS.num_limbs] - ); - fn GFp_p256_scalar_sqr_rep_mont( - r: *mut Limb, // [COMMON_OPS.num_limbs] - a: *const Limb, // [COMMON_OPS.num_limbs] - rep: Limb, - ); -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p256_scalar_mul_tests.txt temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p256_scalar_mul_tests.txt --- temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p256_scalar_mul_tests.txt 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p256_scalar_mul_tests.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,86 +0,0 @@ - -a = 00 -b = 00 -r = 00 - -a = 00 -b = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550 -r = 00 - -a = 01 -b = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550 -r = 9f2f99cbb6fa3e17f80749fbe19f88da020806cb63c12ed5259e01cb6049a8d8 - -a = 02 -b = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550 -r = 3e5f33986df47c2ef00e93f7c33f11b4472912e9206abf25578238d3c4302c5f - -a = 03 -b = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550 -r = dd8ecd6424eeba46e815ddf3a4de9a8e493119b4842bedfa7d203a9f2479d537 - -a = 7fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192a8 -b = 02 -r = 9f2f99cbb6fa3e17f80749fbe19f88da020806cb63c12ed5259e01cb6049a8d8 - -a = 7fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192a9 -b = 02 -r = 60d066334905c1e907f8b6041e607725badef3e243566fafce1bc8f79c197c79 - -a = 8000000000000000000000000000000000000000000000000000000000000000 -b = 02 -r = 01 - -# From BoringSSL - -a = 0000000000000000000000000000000000000000000000000000000000000000 -b = b4e9b0aea84aa5ed86964a22881a4d0e58f88e9225f30990c18751e7d4b9ec95 -r = 0000000000000000000000000000000000000000000000000000000000000000 - -a = 00000000ffffffff00000000000000004319055258e8617b0c46353d039cdaaf -b = 5d24e62244973fbd829573d5a579b4e89a6512933a2c3d255bbdbc1c89028323 -r = 5d24e62244973fbd829573d5a579b4e89a6512933a2c3d255bbdbc1c89028323 - -a = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550 -b = abafdc695e4c2c850f8fc60f1efdbf7406a3cd2c6c59bb7e608985723896c187 -r = 917b1214c7b31a7ee7e53be0b41a139e435ff576b51ec6af1e1a944412bea38b - -a = cf0f01b83670a1c79154ea16f3574ca2d4c688a3c3b6017795cbe54854418904 -b = c5ec4d3b00fb2e11fb3b1aa09e60f7d187f7c515977d1343dab9745961fcbb43 -r = 7aaddcee32e3b340af5ad06f854284cbbce5a1ab919e9b7771c3b0e937093438 - -a = 50023f9913879ac4020bc45a89a0ea89082db6265b96b851af29969dd8a9661c -b = 7c165b1cba80808db114441563aa0fbfba41b9e8acff77312a2dd2138b74ef89 -r = 3d2ca1705d8d38cbc76a5409c6535044733cafcb95d12654af1d14de177978b5 - -a = 4d5341ea735e53d2e4f2934755642adee209bd0e5a1506206513227f3c48b270 -b = 6e48f2b60eb8fb86760134abaf3d61692557862924069c599ceb31309ea18704 -r = 37cde3e35c814d4287bd345b910d687983929907b7a08afa2acd8596832ea86c - -a = 33d06c3f5a595a41a6f9c4356f8ab2b8c550d4c64b806eab5560af247c5fa9ed -b = 0e52f34adf5754343bcf3529d652620da3c05b5dd9cdcddfb08b674a1ad21a09 -r = 9dc64d7b4c1bc33b930e0daee2a24fc41f770378659ee71b846d2239b0fea8ea - -a = 8f211780cce4f93b7193b9378e6f83e1147fb3602b052eef782de8cc833e54ab -b = e1e4f7f1feb15be64292cff86b47cd9730bcb15b133340022b824d591a660cdf -r = dfa2b683b1ae23027c7c109e0abb40a1366eda027ad2cad1a09061a57bee391f - -a = 803c279c7e4c11a5568290c0a5789ceab6860f51a942bf646501a45e1ec0a6bf -b = c0a1145a12037129c571f5f939bf16ea0b8b480f08ec774c045d059841f7d5ed -r = ab48fa3b4aa692a7c077cc55ee3c3fff895118a23728c2fa5f361b30730d955a - -a = 0e5c95158297d75dbf0b02c3090730f65bf14704495b14837dd907af569407f1 -b = 5a03e3787c8772b2fb7ab07d7fe7fe653a58bdae7fde3174c6ed305e524f5728 -r = 71296d305dcf9ce39010ea4f4bbf9f7c1064a413597bdc7574c13dea3fa514dc - -a = 366299be07886f7846fc74231db624b169360e3c8f60196a1afc9f2101e03922 -b = d6d7c830a6edb6861868b964519a6b68f6f24f7c09d66003f3f88eadd1e00158 -r = 0b89596bf5054ebe95a39dab6e975b58190160610b09b2a4f93331ecc0e79fd3 - -a = 8f36f0ef275a72192c3b7388e84df2b8acf66fc53aaf556e3be05c76b3f782c0 -b = 704e519363d44e8df8d91f5f347eb61e8d3e85c8fc1b82980c370a379b2bc81c -r = b70a392e3ce5e85b5efbbded9b8c16a3068ba9b93b4cbed9a9a71dffaad6b58a - -a = bf4466ef4dea9f06f0f3b4f14e01140a774262c7e0706584f4d7dac19be46d58 -b = 4af12d528b2cef0f6714961bca2ab682f8abaa97600ea8181f71563d56f8a9f5 -r = 7b6827c0881b9846e32499e13277efb07917cf4b8c8c72bfb3daa8c1786a8e15 diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p256_scalar_square_tests.txt temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p256_scalar_square_tests.txt --- temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p256_scalar_square_tests.txt 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p256_scalar_square_tests.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,65 +0,0 @@ - -a = 00 -r = 00 - -a = 00 -r = 00 - -a = 01 -r = 60d066334905c1e907f8b6041e607725badef3e243566fafce1bc8f79c197c79 - -a = 02 -r = 834198ce241707a31fe2d8107981dc972e94d4db6642203a44b5591b7402cc93 - -a = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550 -r = 60d066334905c1e907f8b6041e607725badef3e243566fafce1bc8f79c197c79 - -a = ffffffff80000000600000002fffffff -r = 965f4779ac1ddbac28a14bd1e0c28dcb091d48820b4116d22afbc3f00f90f476 - -a = ffffffff800000006000000030000000 -r = 9e07cb5cdf45939f41541805d2c24625e1cb1719e37a89efc755b5e58e585515 - -a = 8000000000000000000000000000000000000000000000000000000000000000 -r = 4000000000000000000000000000000000000000000000000000000000000000 - -# From BoringSSL - -a = 0000000000000000000000000000000000000000000000000000000000000000 -r = 0000000000000000000000000000000000000000000000000000000000000000 - -a = 00000000ffffffff00000000000000004319055258e8617b0c46353d039cdaaf -r = 00000000ffffffff00000000000000004319055258e8617b0c46353d039cdaaf - -a = ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550 -r = 60d066334905c1e907f8b6041e607725badef3e243566fafce1bc8f79c197c79 - -a = da43b8dd7fe8830a4fe8980ec585ccbe903a2965a695cdff398200b74b2ede41 -r = 5ec68604412205b380e26ee4e4081eccc10ac7d1417b09cd534f8517b0de81ec - -a = a82a2b8bdbf8a37dc7cb5799691494a8c9fbf649686a4d250dc30697feb0fa47 -r = 552c094a8841621d6cc26b3b54ce5da5664283888445196a6433d3cfdcad3aee - -a = d785006e250410d9dcc6d7740795a7374c25b00b9c9a37b8285694a07307eacd -r = 971aaa9e70ad082cf43725f2e65bc73f4bf762459cee13167545072ec7bdcaf8 - -a = 69d6d9f5417e87d603a3fb6acafa0d1f974abf94ca57ce58d718a0ad5d02a496 -r = eb3284e5799fbe93171f08e6de9f792cd17f036b3a17671b0310e49b48e589b3 - -a = 1c28f742c3e26e74901d0425f2eb4d5272524668d2405875b32cf6433f212900 -r = 74f70a95399b7ad061a2200fa50528d68eee4654341c8158101e1e3f8f16e642 - -a = 026b2f69f0259d221920b2f358b378a79826f0332ee36afa257765043e3d6732 -r = e1e9cfa4724995bb50971ca22f3c028cd31cb51fbef8a37c31f10fd1d468f13b - -a = 376ed4fadcc1c6c4160a0c9c2ab7c62260367968b08d304d47c65f25625d7d60 -r = b9ccb67f377e1278f1d2eeda26e5eed76f32406c9deed9764fc0aa346d91e02b - -a = 50f66867d0a4ef389678d760d2a4db886583b4c068d0e240f7ddf3472c871304 -r = 82c3467bc5f7ca8b45f4ee61546745e2f53755a02e87f65f572418d60e471c8b - -a = 5b8bd82b37206d2b727f19ad2d02f63773470074dde7d43d2a77c448ddf2f978 -r = dbf3c2fc67a0688c3b5ff12cab1739d50b6093c5d98943d388652b1207e4a0f2 - -a = bed7b3a4dada0e16984eb59ee239005ab212e5b1772cdd5d240c8ee268f65c81 -r = 9232aa2759ca9c5efbaefb0cf45cc6bc9c89def8c25e5c169fe623f30787df36 diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p384_elem_div_by_2_tests.txt temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p384_elem_div_by_2_tests.txt --- temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p384_elem_div_by_2_tests.txt 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p384_elem_div_by_2_tests.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,27 +0,0 @@ - -a = 00 -r = 00 - -a = 00 -r = 00 - -a = 01 -r = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffff800000000000000080000000 - -a = 02 -r = 01 - -a = 03 -r = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffff800000000000000080000001 - -a = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffe -r = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffff80000000000000007fffffff - -a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffff80000000000000007fffffff -r = bfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3fffffff4000000000000000bfffffff - -a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffff800000000000000080000000 -r = 3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfffffffc00000000000000040000000 - -a = 800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p384_elem_mul_tests.txt temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p384_elem_mul_tests.txt --- temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p384_elem_mul_tests.txt 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p384_elem_mul_tests.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,32 +0,0 @@ - -a = 00 -b = 00 -r = 00 - -a = 00 -b = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffe -r = 00 - -a = 01 -b = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffe -r = ffffffebffffffebfffffff3fffffffd0000000300000005000000040000000100000013000000270000001ffffffff9 - -a = 02 -b = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffe -r = ffffffd7ffffffd7ffffffe7fffffffa000000060000000a0000000800000003000000270000004e0000003efffffff3 - -a = 03 -b = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffe -r = ffffffc3ffffffc3ffffffdbfffffff7000000090000000f0000000c000000050000003b000000750000005dffffffed - -a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffff80000000000000007fffffff -b = 02 -r = ffffffebffffffebfffffff3fffffffd0000000300000005000000040000000100000013000000270000001ffffffff9 - -a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffff800000000000000080000000 -b = 02 -r = 14000000140000000c00000002fffffffcfffffffafffffffbfffffffdffffffebffffffd8ffffffe100000006 - -a = 800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -b = 02 -r = 01 diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p384_elem_neg_tests.txt temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p384_elem_neg_tests.txt --- temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p384_elem_neg_tests.txt 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p384_elem_neg_tests.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,24 +0,0 @@ - -a = 00 -b = 00 - -a = 01 -b = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffe - -a = 02 -b = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffd - -a = 03 -b = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffc - -a = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffe -b = 01 - -a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffff80000000000000007fffffff -b = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffff800000000000000080000000 - -a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffff800000000000000080000000 -b = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffff80000000000000007fffffff - -a = 800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -b = 7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p384_elem_sum_tests.txt temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p384_elem_sum_tests.txt --- temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p384_elem_sum_tests.txt 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p384_elem_sum_tests.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,1559 +0,0 @@ -# Montgomery Arithmetic; values are in the range [0, q). - -a = 00 -b = 00 -r = 00 - -a = 00 -b = 01 -r = 01 - -a = 00 -b = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffe -r = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffe - -a = 01 -b = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffe -r = 00 - -a = 02 -b = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffe -r = 01 - -a = 03 -b = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffe -r = 02 - -a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffff80000000000000007fffffff -b = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffff800000000000000080000000 -r = 00 - -a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffff800000000000000080000000 -b = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffff800000000000000080000000 -r = 01 - -a = 800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -b = 800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 0100000000ffffffffffffffff00000001 - -a = 800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -b = 800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 0100000000ffffffffffffffff00000001 - -a = 8000000000000000000000000000000000000000000000000000000000000000800000007fffffffffffffff80000001 -b = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffff80000000000000007fffffff -r = 0100000000ffffffffffffffff00000001 - -a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 0100000000ffffffffffffffff00000000 - -a = 8000000000000000000000000000000000000000000000000000000000000000800000007fffffffffffffff80000000 -b = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffff80000000000000007fffffff -r = 0100000000ffffffffffffffff00000000 - -# Carry Propagation. - -a = ff -b = 01 -r = 0100 - -a = 01ff -b = 01 -r = 0200 - -a = 03ff -b = 01 -r = 0400 - -a = 07ff -b = 01 -r = 0800 - -a = 0fff -b = 01 -r = 1000 - -a = 1fff -b = 01 -r = 2000 - -a = 3fff -b = 01 -r = 4000 - -a = 7fff -b = 01 -r = 8000 - -a = ffff -b = 01 -r = 010000 - -a = 01ffff -b = 01 -r = 020000 - -a = 03ffff -b = 01 -r = 040000 - -a = 07ffff -b = 01 -r = 080000 - -a = 0fffff -b = 01 -r = 100000 - -a = 1fffff -b = 01 -r = 200000 - -a = 3fffff -b = 01 -r = 400000 - -a = 7fffff -b = 01 -r = 800000 - -a = ffffff -b = 01 -r = 01000000 - -a = 01ffffff -b = 01 -r = 02000000 - -a = 03ffffff -b = 01 -r = 04000000 - -a = 07ffffff -b = 01 -r = 08000000 - -a = 0fffffff -b = 01 -r = 10000000 - -a = 1fffffff -b = 01 -r = 20000000 - -a = 3fffffff -b = 01 -r = 40000000 - -a = 7fffffff -b = 01 -r = 80000000 - -a = ffffffff -b = 01 -r = 0100000000 - -a = 01ffffffff -b = 01 -r = 0200000000 - -a = 03ffffffff -b = 01 -r = 0400000000 - -a = 07ffffffff -b = 01 -r = 0800000000 - -a = 0fffffffff -b = 01 -r = 1000000000 - -a = 1fffffffff -b = 01 -r = 2000000000 - -a = 3fffffffff -b = 01 -r = 4000000000 - -a = 7fffffffff -b = 01 -r = 8000000000 - -a = ffffffffff -b = 01 -r = 010000000000 - -a = 01ffffffffff -b = 01 -r = 020000000000 - -a = 03ffffffffff -b = 01 -r = 040000000000 - -a = 07ffffffffff -b = 01 -r = 080000000000 - -a = 0fffffffffff -b = 01 -r = 100000000000 - -a = 1fffffffffff -b = 01 -r = 200000000000 - -a = 3fffffffffff -b = 01 -r = 400000000000 - -a = 7fffffffffff -b = 01 -r = 800000000000 - -a = ffffffffffff -b = 01 -r = 01000000000000 - -a = 01ffffffffffff -b = 01 -r = 02000000000000 - -a = 03ffffffffffff -b = 01 -r = 04000000000000 - -a = 07ffffffffffff -b = 01 -r = 08000000000000 - -a = 0fffffffffffff -b = 01 -r = 10000000000000 - -a = 1fffffffffffff -b = 01 -r = 20000000000000 - -a = 3fffffffffffff -b = 01 -r = 40000000000000 - -a = 7fffffffffffff -b = 01 -r = 80000000000000 - -a = ffffffffffffff -b = 01 -r = 0100000000000000 - -a = 01ffffffffffffff -b = 01 -r = 0200000000000000 - -a = 03ffffffffffffff -b = 01 -r = 0400000000000000 - -a = 07ffffffffffffff -b = 01 -r = 0800000000000000 - -a = 0fffffffffffffff -b = 01 -r = 1000000000000000 - -a = 1fffffffffffffff -b = 01 -r = 2000000000000000 - -a = 3fffffffffffffff -b = 01 -r = 4000000000000000 - -a = 7fffffffffffffff -b = 01 -r = 8000000000000000 - -a = ffffffffffffffff -b = 01 -r = 010000000000000000 - -a = 01ffffffffffffffff -b = 01 -r = 020000000000000000 - -a = 03ffffffffffffffff -b = 01 -r = 040000000000000000 - -a = 07ffffffffffffffff -b = 01 -r = 080000000000000000 - -a = 0fffffffffffffffff -b = 01 -r = 100000000000000000 - -a = 1fffffffffffffffff -b = 01 -r = 200000000000000000 - -a = 3fffffffffffffffff -b = 01 -r = 400000000000000000 - -a = 7fffffffffffffffff -b = 01 -r = 800000000000000000 - -a = ffffffffffffffffff -b = 01 -r = 01000000000000000000 - -a = 01ffffffffffffffffff -b = 01 -r = 02000000000000000000 - -a = 03ffffffffffffffffff -b = 01 -r = 04000000000000000000 - -a = 07ffffffffffffffffff -b = 01 -r = 08000000000000000000 - -a = 0fffffffffffffffffff -b = 01 -r = 10000000000000000000 - -a = 1fffffffffffffffffff -b = 01 -r = 20000000000000000000 - -a = 3fffffffffffffffffff -b = 01 -r = 40000000000000000000 - -a = 7fffffffffffffffffff -b = 01 -r = 80000000000000000000 - -a = ffffffffffffffffffff -b = 01 -r = 0100000000000000000000 - -a = 01ffffffffffffffffffff -b = 01 -r = 0200000000000000000000 - -a = 03ffffffffffffffffffff -b = 01 -r = 0400000000000000000000 - -a = 07ffffffffffffffffffff -b = 01 -r = 0800000000000000000000 - -a = 0fffffffffffffffffffff -b = 01 -r = 1000000000000000000000 - -a = 1fffffffffffffffffffff -b = 01 -r = 2000000000000000000000 - -a = 3fffffffffffffffffffff -b = 01 -r = 4000000000000000000000 - -a = 7fffffffffffffffffffff -b = 01 -r = 8000000000000000000000 - -a = ffffffffffffffffffffff -b = 01 -r = 010000000000000000000000 - -a = 01ffffffffffffffffffffff -b = 01 -r = 020000000000000000000000 - -a = 03ffffffffffffffffffffff -b = 01 -r = 040000000000000000000000 - -a = 07ffffffffffffffffffffff -b = 01 -r = 080000000000000000000000 - -a = 0fffffffffffffffffffffff -b = 01 -r = 100000000000000000000000 - -a = 1fffffffffffffffffffffff -b = 01 -r = 200000000000000000000000 - -a = 3fffffffffffffffffffffff -b = 01 -r = 400000000000000000000000 - -a = 7fffffffffffffffffffffff -b = 01 -r = 800000000000000000000000 - -a = ffffffffffffffffffffffff -b = 01 -r = 01000000000000000000000000 - -a = 01ffffffffffffffffffffffff -b = 01 -r = 02000000000000000000000000 - -a = 03ffffffffffffffffffffffff -b = 01 -r = 04000000000000000000000000 - -a = 07ffffffffffffffffffffffff -b = 01 -r = 08000000000000000000000000 - -a = 0fffffffffffffffffffffffff -b = 01 -r = 10000000000000000000000000 - -a = 1fffffffffffffffffffffffff -b = 01 -r = 20000000000000000000000000 - -a = 3fffffffffffffffffffffffff -b = 01 -r = 40000000000000000000000000 - -a = 7fffffffffffffffffffffffff -b = 01 -r = 80000000000000000000000000 - -a = ffffffffffffffffffffffffff -b = 01 -r = 0100000000000000000000000000 - -a = 01ffffffffffffffffffffffffff -b = 01 -r = 0200000000000000000000000000 - -a = 03ffffffffffffffffffffffffff -b = 01 -r = 0400000000000000000000000000 - -a = 07ffffffffffffffffffffffffff -b = 01 -r = 0800000000000000000000000000 - -a = 0fffffffffffffffffffffffffff -b = 01 -r = 1000000000000000000000000000 - -a = 1fffffffffffffffffffffffffff -b = 01 -r = 2000000000000000000000000000 - -a = 3fffffffffffffffffffffffffff -b = 01 -r = 4000000000000000000000000000 - -a = 7fffffffffffffffffffffffffff -b = 01 -r = 8000000000000000000000000000 - -a = ffffffffffffffffffffffffffff -b = 01 -r = 010000000000000000000000000000 - -a = 01ffffffffffffffffffffffffffff -b = 01 -r = 020000000000000000000000000000 - -a = 03ffffffffffffffffffffffffffff -b = 01 -r = 040000000000000000000000000000 - -a = 07ffffffffffffffffffffffffffff -b = 01 -r = 080000000000000000000000000000 - -a = 0fffffffffffffffffffffffffffff -b = 01 -r = 100000000000000000000000000000 - -a = 1fffffffffffffffffffffffffffff -b = 01 -r = 200000000000000000000000000000 - -a = 3fffffffffffffffffffffffffffff -b = 01 -r = 400000000000000000000000000000 - -a = 7fffffffffffffffffffffffffffff -b = 01 -r = 800000000000000000000000000000 - -a = ffffffffffffffffffffffffffffff -b = 01 -r = 01000000000000000000000000000000 - -a = 01ffffffffffffffffffffffffffffff -b = 01 -r = 02000000000000000000000000000000 - -a = 03ffffffffffffffffffffffffffffff -b = 01 -r = 04000000000000000000000000000000 - -a = 07ffffffffffffffffffffffffffffff -b = 01 -r = 08000000000000000000000000000000 - -a = 0fffffffffffffffffffffffffffffff -b = 01 -r = 10000000000000000000000000000000 - -a = 1fffffffffffffffffffffffffffffff -b = 01 -r = 20000000000000000000000000000000 - -a = 3fffffffffffffffffffffffffffffff -b = 01 -r = 40000000000000000000000000000000 - -a = 7fffffffffffffffffffffffffffffff -b = 01 -r = 80000000000000000000000000000000 - -a = ffffffffffffffffffffffffffffffff -b = 01 -r = 0100000000000000000000000000000000 - -a = 01ffffffffffffffffffffffffffffffff -b = 01 -r = 0200000000000000000000000000000000 - -a = 03ffffffffffffffffffffffffffffffff -b = 01 -r = 0400000000000000000000000000000000 - -a = 07ffffffffffffffffffffffffffffffff -b = 01 -r = 0800000000000000000000000000000000 - -a = 0fffffffffffffffffffffffffffffffff -b = 01 -r = 1000000000000000000000000000000000 - -a = 1fffffffffffffffffffffffffffffffff -b = 01 -r = 2000000000000000000000000000000000 - -a = 3fffffffffffffffffffffffffffffffff -b = 01 -r = 4000000000000000000000000000000000 - -a = 7fffffffffffffffffffffffffffffffff -b = 01 -r = 8000000000000000000000000000000000 - -a = ffffffffffffffffffffffffffffffffff -b = 01 -r = 010000000000000000000000000000000000 - -a = 01ffffffffffffffffffffffffffffffffff -b = 01 -r = 020000000000000000000000000000000000 - -a = 03ffffffffffffffffffffffffffffffffff -b = 01 -r = 040000000000000000000000000000000000 - -a = 07ffffffffffffffffffffffffffffffffff -b = 01 -r = 080000000000000000000000000000000000 - -a = 0fffffffffffffffffffffffffffffffffff -b = 01 -r = 100000000000000000000000000000000000 - -a = 1fffffffffffffffffffffffffffffffffff -b = 01 -r = 200000000000000000000000000000000000 - -a = 3fffffffffffffffffffffffffffffffffff -b = 01 -r = 400000000000000000000000000000000000 - -a = 7fffffffffffffffffffffffffffffffffff -b = 01 -r = 800000000000000000000000000000000000 - -a = ffffffffffffffffffffffffffffffffffff -b = 01 -r = 01000000000000000000000000000000000000 - -a = 01ffffffffffffffffffffffffffffffffffff -b = 01 -r = 02000000000000000000000000000000000000 - -a = 03ffffffffffffffffffffffffffffffffffff -b = 01 -r = 04000000000000000000000000000000000000 - -a = 07ffffffffffffffffffffffffffffffffffff -b = 01 -r = 08000000000000000000000000000000000000 - -a = 0fffffffffffffffffffffffffffffffffffff -b = 01 -r = 10000000000000000000000000000000000000 - -a = 1fffffffffffffffffffffffffffffffffffff -b = 01 -r = 20000000000000000000000000000000000000 - -a = 3fffffffffffffffffffffffffffffffffffff -b = 01 -r = 40000000000000000000000000000000000000 - -a = 7fffffffffffffffffffffffffffffffffffff -b = 01 -r = 80000000000000000000000000000000000000 - -a = ffffffffffffffffffffffffffffffffffffff -b = 01 -r = 0100000000000000000000000000000000000000 - -a = 01ffffffffffffffffffffffffffffffffffffff -b = 01 -r = 0200000000000000000000000000000000000000 - -a = 03ffffffffffffffffffffffffffffffffffffff -b = 01 -r = 0400000000000000000000000000000000000000 - -a = 07ffffffffffffffffffffffffffffffffffffff -b = 01 -r = 0800000000000000000000000000000000000000 - -a = 0fffffffffffffffffffffffffffffffffffffff -b = 01 -r = 1000000000000000000000000000000000000000 - -a = 1fffffffffffffffffffffffffffffffffffffff -b = 01 -r = 2000000000000000000000000000000000000000 - -a = 3fffffffffffffffffffffffffffffffffffffff -b = 01 -r = 4000000000000000000000000000000000000000 - -a = 7fffffffffffffffffffffffffffffffffffffff -b = 01 -r = 8000000000000000000000000000000000000000 - -a = ffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 010000000000000000000000000000000000000000 - -a = 01ffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 020000000000000000000000000000000000000000 - -a = 03ffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 040000000000000000000000000000000000000000 - -a = 07ffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 080000000000000000000000000000000000000000 - -a = 0fffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 100000000000000000000000000000000000000000 - -a = 1fffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 200000000000000000000000000000000000000000 - -a = 3fffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 400000000000000000000000000000000000000000 - -a = 7fffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 800000000000000000000000000000000000000000 - -a = ffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 01000000000000000000000000000000000000000000 - -a = 01ffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 02000000000000000000000000000000000000000000 - -a = 03ffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 04000000000000000000000000000000000000000000 - -a = 07ffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 08000000000000000000000000000000000000000000 - -a = 0fffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 10000000000000000000000000000000000000000000 - -a = 1fffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 20000000000000000000000000000000000000000000 - -a = 3fffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 40000000000000000000000000000000000000000000 - -a = 7fffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 80000000000000000000000000000000000000000000 - -a = ffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 0100000000000000000000000000000000000000000000 - -a = 01ffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 0200000000000000000000000000000000000000000000 - -a = 03ffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 0400000000000000000000000000000000000000000000 - -a = 07ffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 0800000000000000000000000000000000000000000000 - -a = 0fffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 1000000000000000000000000000000000000000000000 - -a = 1fffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 2000000000000000000000000000000000000000000000 - -a = 3fffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 4000000000000000000000000000000000000000000000 - -a = 7fffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 8000000000000000000000000000000000000000000000 - -a = ffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 010000000000000000000000000000000000000000000000 - -a = 01ffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 020000000000000000000000000000000000000000000000 - -a = 03ffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 040000000000000000000000000000000000000000000000 - -a = 07ffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 080000000000000000000000000000000000000000000000 - -a = 0fffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 100000000000000000000000000000000000000000000000 - -a = 1fffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 200000000000000000000000000000000000000000000000 - -a = 3fffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 400000000000000000000000000000000000000000000000 - -a = 7fffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 800000000000000000000000000000000000000000000000 - -a = ffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 01000000000000000000000000000000000000000000000000 - -a = 01ffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 02000000000000000000000000000000000000000000000000 - -a = 03ffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 04000000000000000000000000000000000000000000000000 - -a = 07ffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 08000000000000000000000000000000000000000000000000 - -a = 0fffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 10000000000000000000000000000000000000000000000000 - -a = 1fffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 20000000000000000000000000000000000000000000000000 - -a = 3fffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 40000000000000000000000000000000000000000000000000 - -a = 7fffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 80000000000000000000000000000000000000000000000000 - -a = ffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 0100000000000000000000000000000000000000000000000000 - -a = 01ffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 0200000000000000000000000000000000000000000000000000 - -a = 03ffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 0400000000000000000000000000000000000000000000000000 - -a = 07ffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 0800000000000000000000000000000000000000000000000000 - -a = 0fffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 1000000000000000000000000000000000000000000000000000 - -a = 1fffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 2000000000000000000000000000000000000000000000000000 - -a = 3fffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 4000000000000000000000000000000000000000000000000000 - -a = 7fffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 8000000000000000000000000000000000000000000000000000 - -a = ffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 010000000000000000000000000000000000000000000000000000 - -a = 01ffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 020000000000000000000000000000000000000000000000000000 - -a = 03ffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 040000000000000000000000000000000000000000000000000000 - -a = 07ffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 080000000000000000000000000000000000000000000000000000 - -a = 0fffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 100000000000000000000000000000000000000000000000000000 - -a = 1fffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 200000000000000000000000000000000000000000000000000000 - -a = 3fffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 400000000000000000000000000000000000000000000000000000 - -a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 800000000000000000000000000000000000000000000000000000 - -a = ffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 01000000000000000000000000000000000000000000000000000000 - -a = 01ffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 02000000000000000000000000000000000000000000000000000000 - -a = 03ffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 04000000000000000000000000000000000000000000000000000000 - -a = 07ffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 08000000000000000000000000000000000000000000000000000000 - -a = 0fffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 10000000000000000000000000000000000000000000000000000000 - -a = 1fffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 20000000000000000000000000000000000000000000000000000000 - -a = 3fffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 40000000000000000000000000000000000000000000000000000000 - -a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 80000000000000000000000000000000000000000000000000000000 - -a = ffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 0100000000000000000000000000000000000000000000000000000000 - -a = 01ffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 0200000000000000000000000000000000000000000000000000000000 - -a = 03ffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 0400000000000000000000000000000000000000000000000000000000 - -a = 07ffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 0800000000000000000000000000000000000000000000000000000000 - -a = 0fffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 1000000000000000000000000000000000000000000000000000000000 - -a = 1fffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 2000000000000000000000000000000000000000000000000000000000 - -a = 3fffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 4000000000000000000000000000000000000000000000000000000000 - -a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 8000000000000000000000000000000000000000000000000000000000 - -a = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 010000000000000000000000000000000000000000000000000000000000 - -a = 01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 020000000000000000000000000000000000000000000000000000000000 - -a = 03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 040000000000000000000000000000000000000000000000000000000000 - -a = 07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 080000000000000000000000000000000000000000000000000000000000 - -a = 0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 100000000000000000000000000000000000000000000000000000000000 - -a = 1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 200000000000000000000000000000000000000000000000000000000000 - -a = 3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 400000000000000000000000000000000000000000000000000000000000 - -a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 800000000000000000000000000000000000000000000000000000000000 - -a = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 01000000000000000000000000000000000000000000000000000000000000 - -a = 01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 02000000000000000000000000000000000000000000000000000000000000 - -a = 03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 04000000000000000000000000000000000000000000000000000000000000 - -a = 07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 08000000000000000000000000000000000000000000000000000000000000 - -a = 0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 10000000000000000000000000000000000000000000000000000000000000 - -a = 1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 20000000000000000000000000000000000000000000000000000000000000 - -a = 3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 40000000000000000000000000000000000000000000000000000000000000 - -a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 80000000000000000000000000000000000000000000000000000000000000 - -a = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 0100000000000000000000000000000000000000000000000000000000000000 - -a = 01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 0200000000000000000000000000000000000000000000000000000000000000 - -a = 03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 0400000000000000000000000000000000000000000000000000000000000000 - -a = 07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 0800000000000000000000000000000000000000000000000000000000000000 - -a = 0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 1000000000000000000000000000000000000000000000000000000000000000 - -a = 1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 2000000000000000000000000000000000000000000000000000000000000000 - -a = 3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 4000000000000000000000000000000000000000000000000000000000000000 - -a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 8000000000000000000000000000000000000000000000000000000000000000 - -a = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 010000000000000000000000000000000000000000000000000000000000000000 - -a = 01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 020000000000000000000000000000000000000000000000000000000000000000 - -a = 03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 040000000000000000000000000000000000000000000000000000000000000000 - -a = 07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 080000000000000000000000000000000000000000000000000000000000000000 - -a = 0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 100000000000000000000000000000000000000000000000000000000000000000 - -a = 1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 200000000000000000000000000000000000000000000000000000000000000000 - -a = 3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 400000000000000000000000000000000000000000000000000000000000000000 - -a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 800000000000000000000000000000000000000000000000000000000000000000 - -a = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 01000000000000000000000000000000000000000000000000000000000000000000 - -a = 01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 02000000000000000000000000000000000000000000000000000000000000000000 - -a = 03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 04000000000000000000000000000000000000000000000000000000000000000000 - -a = 07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 08000000000000000000000000000000000000000000000000000000000000000000 - -a = 0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 10000000000000000000000000000000000000000000000000000000000000000000 - -a = 1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 20000000000000000000000000000000000000000000000000000000000000000000 - -a = 3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 40000000000000000000000000000000000000000000000000000000000000000000 - -a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 80000000000000000000000000000000000000000000000000000000000000000000 - -a = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 0100000000000000000000000000000000000000000000000000000000000000000000 - -a = 01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 0200000000000000000000000000000000000000000000000000000000000000000000 - -a = 03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 0400000000000000000000000000000000000000000000000000000000000000000000 - -a = 07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 0800000000000000000000000000000000000000000000000000000000000000000000 - -a = 0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 1000000000000000000000000000000000000000000000000000000000000000000000 - -a = 1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 2000000000000000000000000000000000000000000000000000000000000000000000 - -a = 3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 4000000000000000000000000000000000000000000000000000000000000000000000 - -a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 8000000000000000000000000000000000000000000000000000000000000000000000 - -a = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 010000000000000000000000000000000000000000000000000000000000000000000000 - -a = 01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 020000000000000000000000000000000000000000000000000000000000000000000000 - -a = 03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 040000000000000000000000000000000000000000000000000000000000000000000000 - -a = 07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 080000000000000000000000000000000000000000000000000000000000000000000000 - -a = 0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 100000000000000000000000000000000000000000000000000000000000000000000000 - -a = 1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 200000000000000000000000000000000000000000000000000000000000000000000000 - -a = 3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 400000000000000000000000000000000000000000000000000000000000000000000000 - -a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 800000000000000000000000000000000000000000000000000000000000000000000000 - -a = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 01000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 02000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 04000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 08000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 10000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 20000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 40000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 80000000000000000000000000000000000000000000000000000000000000000000000000 - -a = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 0100000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 0200000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 0400000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 0800000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 1000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 2000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 4000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 8000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 010000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 020000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 040000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 080000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 100000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 200000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 400000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 800000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 01000000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 02000000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 04000000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 08000000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 10000000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 20000000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 40000000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 80000000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 0100000000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 0200000000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 0400000000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 0800000000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 1000000000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 2000000000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 4000000000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 010000000000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 020000000000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 040000000000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 080000000000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 100000000000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 200000000000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 400000000000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 800000000000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 01000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 02000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 04000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 08000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 10000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 20000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 40000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 80000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 0800000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 08000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 0800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - -a = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -b = 01 -r = 800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p384_point_double_tests.txt temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p384_point_double_tests.txt --- temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p384_point_double_tests.txt 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p384_point_double_tests.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,20 +0,0 @@ - -# G doubled once. -a = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, 2b78abc25a15c5e9dd8002263969a840c6c3521968f4ffd98bade7562e83b050a1bfa8bf7bb4a9ac23043dad4b03a4fe, 000000000000000000000000000000000000000000000000000000000000000100000000ffffffffffffffff00000001 -r = db93b776427460c39c90a4fd2de4b506da821495f0687f503504e6f0ff9d48a18e6c8f2e022b53f0c8229e55783dde91, e34947f7123df0c2070d430900b0e68409f1fe415172bad915e4f18bdc588258e8e8e4a8c2aaccd842ea84633140bfda - -# Point at infinity doubled. This uses the (0, 0, 0) representation of -# the point at infinity instead of the classic (1, 1, 0) -# representation. -a = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = inf - -# Point at infinity doubled. This form is the result of multiplying -# n * G (affine), which is more interesting than the above case -# because only the Z coordinate is zero. -a = 4a0fd63f894499928e4b2b72aced45cfc589976f4ff86f78c904d59da9379a62b702d968c1184834c11db28c7356ceb6, be113b04484cd4bc215a9f2a33a674c3764c38ca4de135dd50ce8dcf3c85d55a5aad0e171860bdb6c58201e6212d9ac5, 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = inf - -# (n - 1) * G doubled. -a = f3ee335326d22614d01b5d7cd0be73f1bfdd75982c9c273f72d0abfeecbca0431601a1bcafcdeb07e21ecf4d91c7b520, 57b82ca1527c5a01b78bc8ccb9febe74178b04b7c6fde1c1c4ef9a220c4320bb560cb078542256a3900df61c107de6c5, 53b3adc887551c0e17c07ecb42d1a5ec105aeec6b0f040a936ed4f756e83939226232b4e11191b3eb1d841c650682ca0 -r = db93b776427460c39c90a4fd2de4b506da821495f0687f503504e6f0ff9d48a18e6c8f2e022b53f0c8229e55783dde91, 1cb6b808edc20f3df8f2bcf6ff4f197bf60e01beae8d4526ea1b0e7423a77da617171b563d553327bd157b9dcebf4025 diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p384_point_mul_base_tests.txt temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p384_point_mul_base_tests.txt --- temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p384_point_mul_base_tests.txt 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p384_point_mul_base_tests.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,1280 +0,0 @@ - -g_scalar = 00 -r = inf - -g_scalar = 01 -r = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, 2b78abc25a15c5e9dd8002263969a840c6c3521968f4ffd98bade7562e83b050a1bfa8bf7bb4a9ac23043dad4b03a4fe - -g_scalar = 02 -r = db93b776427460c39c90a4fd2de4b506da821495f0687f503504e6f0ff9d48a18e6c8f2e022b53f0c8229e55783dde91, e34947f7123df0c2070d430900b0e68409f1fe415172bad915e4f18bdc588258e8e8e4a8c2aaccd842ea84633140bfda - -g_scalar = 03 -r = d283fe68e7c1c3ace36f7e2d263aa4703a48d732d51c6c3e6b2034e9a170ccf0c54ea9fff04f779c05e4dbe6c1dc4073, 465465fc983292aff6db68b15102b33968012d5ad2e1d0b4132663c04ef6744692d789a77ae0e36d7e284821c04ee157 - -g_scalar = 04 -r = cfeee6dd34179228fb40f647d685d979078358d4736400ad2e4f153b0aecac4630594ccbee0421e30aae8477ebb68f2c, 50946875303df319e607b9e33820017d147162d30418c6938e3e61a34c542ad1e74bb7f17bfec97e54f3e8e79b3a03b2 - -g_scalar = 05 -r = e1bb26b11d178ffbc676b987e2e8e4c660db2cf5aacc05e67f1eb1b5293c703bc185c0cbcc873466bb595eba68f1f0df, 4db1c9d6e209e4a3e6c5944024de236d4b237faf982c041180b61b3101c35b9922c16e2e72f345662b694ba07073fa21 - -g_scalar = 06 -r = c482e189f0430c404f0f6a962b02d33b2a33f6661bdf6015ec52930f580d57f2cb2454b339d3413a7eb5c9317d56dad8, c9962152af2a9eba586d8ededf21559a93c9e5f61b546f058bd4bffcb79e33b0739ac69d5b3d4dce3f62b16ea7b08203 - -g_scalar = 07 -r = 932c9f811c89025bf893db589db2df555f4215d1659753ed731edcf8211faa954ce6415f874774b1df13b9d17d69222b, d90a16b6af6c9b3ef57f238e693b07060ff37c0401fff78065aad76f50130844135349d5a8641c790996b2207706a61e - -g_scalar = 08 -r = 5db4f184349cd9b11c7b5fe116b664231d9aebd64f3ddb371c5c2e7193d7e30f9e336de5ae9b587a23f60a05dd9bcbba, 3c0c6dd70d27ef617008d943c48ecf0ee9923263a42dbba2701754bf7d8686e4836dbb36b7e55e870d2cfe83e6655a44 - -g_scalar = 09 -r = 5cab1d1d53636c6a26d464c6dad54d6adc351dc13cbfff3f26094833a96d745de35d87293fd7e4f92f5d200e2353b92f, e770633431e8f5c67d9429f4ee69a754a6ecaccc68ead0d827f061c7033ca7c23777e270d742aa2ff2813072b18ec0b0 - -g_scalar = 0a -r = a91a5280db1c212ec2f646025c4845ec54a612d7eb32cabee9f6368eab225fa32a15a9a6e58d6787845539d3c8d99c02, 6eb995bec80174e83e03370a47a9b8aa81961b8ccfd7fd1d592ac0ba794eabfd03a530eb13b9e85cbb971f78e67b5fce - -g_scalar = 0b -r = 9c19e9fc7ba9c437f8d89885f0561d7901b8bf56147b66020dcc67706cdad64f4532077c44377abac7708b19b68b8c7d, 9aa62f9f3533f91841821d0c3a53287a2e070f36fe9e682e3ce813298a77e780604fe46bac144b83764eb146bdc4ba25 - -g_scalar = 0c -r = 627b415f9c35b26d523c40dbcf9ab45cf67eb42235d77d8303aced26c8edfee1d4258cc55d9704203db8477270313de0, 0c6e430ef9c4af3d0329eab1f7942f0e40c64a4e66bed5af8c79848fd0e102ac80d60af627aa651afacc45e48be55ed8 - -g_scalar = 0d -r = b51c56e18cf23c94d2657265ed22df97db5203a8d9c1bd568a7a8e4633b7d4aeb25e28c5f6749a959b7aeb7e75ccbdfb, 4617adb7cc6979e181fdbd1c3b490ec3b7feac2dfec38d60789a2a48cf4d0fe3d8e88f1a87cae0c2f4d394596c3d812d - -g_scalar = 0e -r = 46d227c432f6b1ba8058994c5710c0c944ce05ff88957166ca6b1af8b1f85c2ad02225fb01ec909f5865e5018f75244c, 4429839ddefbadf5647d24db13690a7472445345d9c3b6911ecc8585e11dbbbf540b8b82730a99d1be4b4a9003cb68e5 - -g_scalar = 0f -r = fb62d26f4903026b0fc01fd4eb08599359500917789b307583ccf19550e07b342b7210e2ec3dabd8446ad8884709f4a9, 5a68c6fed0bc27168733fc41400c5797dddc2866d898f4704b23d3a0de06610c61609cbd144bd5862309cc9d6fe989bb - -g_scalar = 10 -r = a10896aa435abaa137065f5313bdc3fa317b63ea2887d5ff37cf65517917652a992afb5b0ecdd2d8da6e8a7f7c33ed91, 659db48181ef251351c305c6a72d1967b333bdfbc88ee148914871dc154d410feb07ddea230cf00d9b21615fefabca26 - -g_scalar = 11 -r = 524f166ee475ce709f6928555330455e7be3737d524ffefce6fc3f2af655a10d3ea4ea4c8ff1f43e8903e1304b4a3cd0, ac37986f55b164c925eb5df1b3c2677af87d6d854a54504a49ce6993336bf1834e23b6ffd5b9c0da3fcc69cd6c12f055 - -g_scalar = 12 -r = 57505d8d6749703068a232435567169355a96a6879909f083bd1c8f62edb0dbd198fd3f0f38f66625dfee73ce5b82700, 91700b247eb1be639bdd6a092945a7576ffcfc7ca4cfd9bbc266eb844112985854b867b7f78aa7de8a60717f75c64513 - -g_scalar = 13 -r = fa0f1f450390d706b3b6639c539802ae23891298fc38538eca109c3b154aad5e22c4cc5f41a8c91282a2ed4abaa84c08, a1d47b23e957776415d1dc778264b6723f5a799bb67f30c39170b3786ff2f643a8c72d3cc3da2eac46b78e5db0dc21d0 - -g_scalar = 14 -r = 1d1cdf7b5f22346598ca8dd42d96c936f78cff0cd467f03a713466708cbaffc7cd96f20591e71d16ad610a2d94a70ec1, ab9dd81052ebfb015e01b72b4718bbc7422da643ffe6132b9933fb25dccd4df325f546ab321828ffe27a189460d4db60 - -g_scalar = 15 -r = ab16c626dac012b51b1a0f6c5df0e5372e59ab62bd9ebe6930128aa06177f75d88e0d496dd2f9e2108265e510422ce2f, 21824f411353ccba266ad15aacea5817b454111e8527cd59262ebb498a149098aa740a9e38f17bea8014214b008c5de7 - -g_scalar = 16 -r = e082882d69059095fd7a8b13f0681fcac382472ebe0e1fdbccd57831927ed783981b788d16f325b84f595351262bb775, 671d69c98fcd841850fc847215809cddc764edf840d0fcf77b1ab489cbf837b7f9d62fd9c9576c694d1c3049faa71fdc - -g_scalar = 17 -r = 80826a69eea8f22461e4ca2b905432f01c75b8ab2a351783b9d3dd25429c0a18990ed20b569b8ef6d1b4e74d12e3683b, 9dfccb0de2212559282d2437566718c1f0138950eaf22c7e7ad8a132a527cebe0bcca3f0a65e48137fc33a6bec52abad - -g_scalar = 18 -r = 4f13f901fc55723f38076e8fca77d74f563361909bd5c2f7540c045a409c930b20c1b8e0d809afcd259f272cfab816a7, 150808e625a302c91395a87966a4e904e8277439a0f9ad3adf5579fa4bea82dd98d82ad1da247ec8890932d7bd3d10c3 - -g_scalar = 19 -r = c29c6e2ca5bb73313809ab50de2480249bd51b99208abe1e57d0f3d2e2be174abb280dfa3cb3fb361e93722758ce3b83, 1fe6fb42e97809dcda3e1a3d4cebc96ed6a2f51dea8e434401628f059424a3cc83ccbc4e9009e3919944fd2e61124f05 - -g_scalar = 1a -r = 37a45bdb091cbb80f14b309f03fa90f2808497b7b0bba4a76efedb8023bf0b90b0391b37897b93f56423197d2afd473d, 47d98a9df092241cbf2c0862697c08fd5d512df99d42a72725c7b9146f5f24c7db3f422d95e16d6eedda4ae48a8f5dcb - -g_scalar = 1b -r = e8ca780e373e5aec2f7e8d509c6a58fe7228e2d5d18f14d08e0d4168482396f9cf1912934d78291da04482d2467d66e4, 17820a0bc5134ed767e67195d44d3cdf7d26540638c85a85d779adfe31da1bea58a6d7f569e2f8f442aad1d61b68e9f8 - -g_scalar = 1c -r = 55be5764d37da1a2d8232f8b4e492aa88fb0c597a4da3e15550e0bee8ff22c6f4169b4117b3c1220c76afaa373b64643, 05cdca3fe7988176792377fbf8eb8319c48ee6f3b033c112184bd4733ad6983a9ff769c4875fee0ff1bc89b628e77f9e - -g_scalar = 1d -r = c8b00ae8187cea1f2065b7cba7df26e43dc22d490e3feb0fce3c15ed55c9764725846b66780443d6019d6ac5d3021470, 1d2a1c015977f16cf6f57e7190c820338e6db10b404505fbab178d26cce851b3293c164920c83de21a5284a0865dded3 - -g_scalar = 1e -r = 92cea8f4c4360dd87002990485ba414315f9abe1feb6b100519b9fd50a18323276aad8b8131263886a7a3464d0cbcea0, 941292e500f88cb2f569446a2755569296c21b29f6a167f23117dd04d47a41dc1846eefcdd3eb156dc6c5d1dc12748a1 - -g_scalar = 1f -r = 6c07c4040a3305d11afb51a3e3ba8285d42f7dc953c149652ecf8340f0df4fe6b6e7ecdd9e821ee6a39c89317c8906a4, 475a3e756398a19d5b3d0d6d36beecc4d7dd464f045a7a1c402a9bab42eb20ddbc0a699b374c4b08dab83288127fc1da - -g_scalar = 20 -r = 5dd2a4a0626b3d793a9865baa631cfb0ba8953d612e8dc871896b9fcc651b1dd0d784cf208f779d5ad852b878c0a64a4, c510ad93aabca99f73b42725b35b4ff04bcb06f00a2377b677315f9e9448fd08a372dfc2f2a52bfd1148bc72687c20bb - -g_scalar = 21 -r = cc9e97a46c833e9d68af622641d5c400da631fc160f09efbbbc7c7ee955ef3afdf330d9d5b943c8661333a382fb3ba63, a7fd2b619057dad76fcc93a1b8c310728a416eb9bb6f0aba08467cea48b90b9113bf6124c209e55e7fd73e8e3a625e76 - -g_scalar = 22 -r = cdb55e6ba07b7cae7ec2bc1cd50b3e6d9d6ac102b4e2520145700722abb9102f0648c2cd2d668c4180b309dd2ada5bf4, a964eefbfdadd24e03c050a06152072602d00cfb8a76b2d69e1418a4554557c3470ddc68f8a57f48ebcbda0786da3943 - -g_scalar = 23 -r = d6149f75e9417bc6832bd8e34fc7852365f16273a02583fd4a508620dde6bd0abb3800d52d7c2fb458a5b5433720ec9b, b13a8ad830e23f26ac8a877f52ccd35c22f19fab28f35eee50018998988092a20ce18088a55e0956feb026e93deeb52a - -g_scalar = 24 -r = 1608643883061d376f01faee26946e789f82b7fbab52606ca39180d45c2c7ce14a13260770b1b757f216aa2531238ed0, f699887b806085b7df33eed7b73401b16a3258ec33f5567510209418c167fd201d11bc5ed6e28138597edf370fb077bc - -g_scalar = 25 -r = 1eba28f3defc58b59261ede87ef27114acb60a7597482b86a129e2dff5b54a5d4027704bb5630ef20202d57de44f61a3, fa0e07b7fe85bf85284fcbb5638ca337b50649a894047d1f2ea912435d2ca0342f1643d514594bee6c91c0c98be5589e - -g_scalar = 26 -r = 47ba96091da7b1476b464412bc9a48c7479ecf018173fb32f3d752f5ad6cbeac018843c01c0d77024703cd85891f8ffe, 1f466694520618f2129be314974320a4f300e1c648347f9adae2479844956b9387c183c3e1a0e06c91af26eaabc13488 - -g_scalar = 27 -r = 587df4d6b89b1fc2c9985040b76c066536a1cd6dde9b62306d7edf642b7f006fd984244a8e3d2c467d894f80506e0e42, 2d7bc128074968fb1a95355f1cd60340b646e453436d9fe2345c553ab53153b87b2b0ab3e82947474c0638476a71ae7a - -g_scalar = 28 -r = 51c4b1b36a4d6e813b021cf316d7a9adae78bc3a3134216c86fcfe4760be3ebc43a53ff21beb359e6048c6949399c38a, dfd92b6da914bb01dbb22c9ddeb46e6c63a00a0a60e0aa2a98ff87f7370eb7441df8cc84a69ea3a354b9cd8db593d816 - -g_scalar = 29 -r = 8764cd2cda92245de3bc778895fd71ae89746c8d852ca03573a82933a80d68f341dfd24d456a201ead148e87bca6d14c, 82ea702eeb18f1c5679952c7d193272ebdc9d6c34f9f589a57860ce121646f315ac762e00f3c9d6ea2fe2c4782eb23e2 - -g_scalar = 2a -r = 7438b4933c1e593ce983e169ffff96c73fd72a308f234c864b21c4f3eb6c7e6231b22efc5df46c6618ef56cd5d76b881, db6829c2f002bb6e50029568472a7175e739fb61eaa6776325d0caaeda1eadf40d959ba9796d9129863a23a3a553e8e3 - -g_scalar = 2b -r = 35178bad22dab3935cf095a901fefb567314f5f0416dbd86dad9f5b239c4943d09112fc50578bc8c37fa935500846d44, 8f3f1f63c9632b78a974b09415cbf948aaf8e0f6bd0628dfbce78aa9ede314bb1b7ee42d749e5498cf79fc1b36baf1a7 - -g_scalar = 2c -r = 9c7e7754a320d35204ce2a21986c5ce6d50a288981ea36c2767b4ad7f8f99b51ae97af8bf240b30a1c5f0e5b36a400d3, 5fb28e322a1dd73bade6096d02e543ae47678afb27dda8e5c680176505c7ad6c7cc82a4df1698fb2c3336331bbad8346 - -g_scalar = 2d -r = 9c94c858b2ac340599e1c0c61f2bb599b0040c0e8d6fcf13ffe8e0bb39eb8f59d4af65c673ad9112d4c411564fddda5b, 42eb2979db83a48517477722bd2af19e16f96676b7234e93eb3b44a9e5b5691862b2f54351fcca3f8f8878d76eeed85d - -g_scalar = 2e -r = 374aa9069481ed0dd9c79db8005412579266634957719f5460976b01b472d7899f24fba649ddd10ea618d7479fc4f435, fc539eb3e259c7dbc82d5998ec090d0619ab802314eb4ab9d7a198a4185a849ca1590c30ecf5864360efb1147fdc2d7a - -g_scalar = 2f -r = ea5b37c5da233371504f21b1570cf950780abff7d878acd0bfb185125f5b07a065c788785f0dc66c6f888f7df0c668ca, ac9dfec7dfa72a8beef006912e20fc23dfeea1a265e0fc91f86562a898fb34ff9c701758249cf9b7487ae8bd22437ed1 - -g_scalar = 30 -r = 66e4794bae7d740062e5c5d3e73a1bc940d01ff53a7d2f3c4f504e06ea52bef92d368d48e7f30c2b3ccf806ab35bf6cf, 271e42a12624a58348eab00eb5c9462c2605ca009da2a2ca5c3ca10d04bab9854580609da766ddf13d30625e5ffef312 - -g_scalar = 31 -r = 0b470bb250e4ea9e1197832bcea03f5647c56c115b6e3386a669156542e365a48ea5af63a5ea6fb8fa5c3aef697136c6, 2d1cc518e28b2bdb771e64415b57be2f2487edd57f82bdd3fc4486ee49c9ebe88d6c174ed2497d483113c74313b25712 - -g_scalar = 32 -r = a820e8303a5d50d19cbf755b46f97ac7beabb91ac3c90051510bd675cb2ec3f1172cfe4ecb5af900a96763d2fba32d1f, 6f58fa8b7181c2a16f7bfa7e13a4f7d6c1b444139333e4056124642f0f32b151df7dc7053048461a83a9f17e308c4545 - -g_scalar = 33 -r = 16634a504f35cb3c3dba16e9daaabc27464ae8d241a84de7a5e0fb598c5a78d91947c0caec4a22b82c4ccac72070ac8d, 518b047dcbaa0d97c69489e2373f1a0d0b2240003c887d36daeac0c3570543f0324d067e7359dd35adc18bf9b16ec84f - -g_scalar = 34 -r = 4b820d9b31d83660252b48f5cd8d7d770bedaa85e5377c005687d1dca6ccfd358a944b316b3262328f6468656f9201b9, c5cc339dcba1fd4b222465866e5ede7690e2aead7f78aaf86d0a166ced3c3b7a0a8930fc1208b9faa9e5af3ccae07f15 - -g_scalar = 35 -r = a8ba8f10e0f383ea642ec4e615c3aae2cf485c74a7c54b160b0110610f0422a2daed7c268a0915cc3b1bddc6fbde49ef, edf2e3eb7ecc9485adc93d9a481765e2d2c71ad1390699635786a19a4e2fa83eebec6442089efa8b2a2054b495618501 - -g_scalar = 36 -r = 4576a6497cb8944248c075daaadd6150075134ebabd64a6acff00bd23c9b5a41ab2f15202175fbf411853add834e6c54, 420eb673906a29496e9e86bb7b1eb77a1ae1dd97d13444bb0bf879d693b44ea68dbb571c77fcd1f4340a767034adeda3 - -g_scalar = 37 -r = b3fcd5d1690cd408fa5cbfda60f4554f6078d8bf085faeb3a4fb7867e3a142d6fd6622bc1718ec3cbcab5f60069f3367, 7460257314ceeed46a91e73997d0fa0617c6b5cbbe2334f88de3107c3d079f6182af23aa180a63a74ebdee7d281f7884 - -g_scalar = 38 -r = 7772a913e6436cc1e9981ea6820da79f2629ba4fd1deca258b6fc785e692fdd2d4215b4fc7a8baa1483350a5ebb8cdad, 31ff648e0f88b82d56fefff326f349ce05826192490bb572b623a1aeeb8cc21c28179e6cc852f64bd141235c553fb41d - -g_scalar = 39 -r = 814d7fa07a78c189c052f3eb1c99ceef1e9dd1509bf446e0a14967dfac4bbf6273bae4c1694b8b0db14ba61cf97f865c, 0a823b9a4b26df63d2e130552952c1fc8f427bc473c81d5b0d60bab7e809a13c7788c258a1737b65a101a483ab74b05d - -g_scalar = 3a -r = 104cec0666ac72e09e9520bf57acc87aa58db4ea4f96af4fdab9dc0015b0fa13341cf9d9c46785af941c5c257d0be180, 2b51995f794da901c08595e35548fbeae11699e909fa58a1b5f157aa569b57d8b8b4ac9ffa80380a9f3f7baa1929e675 - -g_scalar = 3b -r = 9ba039679267b6463703435b0de64db996a917cf1ed0e31564473b595c322738dfca6897f929974caf467ce227bf64c9, ff336f12504655c196d9ba0bd9e3ca196fb34b3028463cceaccf2edd7b05970341bdb741b335eff0df0c2aae3a522fbe - -g_scalar = 3c -r = 95bb80cece47968c61bba736a55b527784b7c2fed74cccd40402d5c4eb809f85a61fada6fb4f60e8c711d5d1c425543e, 8dd21bf0b4ea4f5129fc3b284892e676bb45a51f948a8375acd70b86ad2a20fcf0e0f4f7e682aa2909f92adc16eb7b95 - -g_scalar = 3d -r = c93ea049ef6ba0062366467300fe51fd5ff77ff2332982d06035e34f772ae08054fb5a34222241e848da1fd3fc60a6e0, c4cc11451fc69829b0a6c77201466d230dda19ffe5275767e6a7885370d303eb394d32cd6ae9f4ac6640f1177d381266 - -g_scalar = 3e -r = cb4c0a54561fedf2d194b7054b14d11703b9f1cebfec21da0c7d749907dbb9af1e659730c1fb476e49a04dc0f5acf772, 0902cc23149446b8cac324ec82c4faa73d2508922ba9239b65609e59d9ff0aba5f5e9b1fd630c145af623d3f21da4d42 - -g_scalar = 3f -r = 1c9bf0b0f1e52d1ef6159e519a049f7acd7e35f76e2b71aa7a50f7458c949f8f6ce8ead6149a1896c5c0e6d7aaed89c0, 52bb3712a0a689e8f5af7b8e3735df22dc89bd4997d4048d3bb034e888d17f198d3a5f621ecd7b1a3bb6c1f518202c80 - -g_scalar = 40 -r = 4f5d5ab6d1b30e5cfc8e87cf3be44d56a309199dca57b7bde04b3d30f8a0580d957c980f297a9a37ed4de4f88e89b258, 888b708b9404ca513ee127895ecd3fe86d97cabc301fe259fe51bbbf1090fede0fd1c52df091bc01b213c6a030a9325b - -g_scalar = 41 -r = b84c3a6a5fd4266f8b0350b2650b22534597ec8abdd5f002cf9edc15edb63c80becda43b0d1d279f8e469454839b9679, ea6f2528a55bb1c9a2866c24c8f9f08719763d6d889d66ddab784b2cde2bc266b6a487833ad995d30e16d83d30fc79f9 - -g_scalar = 42 -r = 3418c841ef19aa6cab34164b3870beb7acd0361f5decad089983c10a492b899ae22c691d99c0b909b60fb64e52990b5c, b287be9507f55d0492b480eed70d6c3a6fd331a3b0d5aea54ed3fd192a684508a580d040c2c889076cf203a6209b336d - -g_scalar = 43 -r = e462ca48e153035af9af3e4d90909d25556e637e6ef3d8f765d75edaa55d6185eac7dd3b0b634f686efc5cbc8b1772ca, 8322cb8aac794994096a6bf01362c5f95990b746c6ebc0031a7e35ed3f59e4bc104ab1a642785d0652763b7b0a109ed1 - -g_scalar = 44 -r = f6a8130b3a7741e35508c2b38bdb088aee34bd1706035fdea4160def7fe6923a2fd77b5ae6018776af78aa17286ac2fb, d467b0e82fc4663ed9c5d61f09f68f4c29b049577e0fca014277e8927030cc9a59a9e6886b1e723fc02ed662797cc7d4 - -g_scalar = 45 -r = 59d65d78a3f735f42c86ee164fdd3ccad4bcc8b125abfd65cc66c8aa0f19981b5ccb2859a1115e28f8d3df74670c2752, fbcd0100271dbd7a6f2c9e8b73167a320aceee4882ed66bcd13ae4892bd423a457769d6245d3994d035ade287c0c55ce - -g_scalar = 46 -r = 2bd44119aa9079b7d8436f83a2ce4101a4c793741489a3c09c2e8aec0cdf6d91edfdd44e94cf7a32bcef0b6a37548a32, 443df50ac7469f4a5c599917d3a76debc4077657cfcdb6b7cc8ad6658c725a7ce2a2b0996761e5389f0415bd9bff2a34 - -g_scalar = 47 -r = 0b4faa5a537ecd702b123738fe255dda27bbde143508ac5493ba15cfe58d0a92bf5731b3abb11441c42ece45effefcb1, f9a7ea28732ad01cbdb924ee071395662144daf1ce64373a154f285025b3e31986793c4d0801523d6a44d084ddec83c6 - -g_scalar = 48 -r = 0966d45a6517888e2ac250f6058daca83b7debe494eaf32810757e2e3f599369f4445a249b234eff668240536434688c, 312c1d2f36824d3ab010acdc097afa217854f8bcc3f0ad3ac7b43619ab96774699cd9dc9d77437097555cc79e7693b1e - -g_scalar = 49 -r = b89d83e72bf4673cb08db04de8caa7d29029a9252d3731c25b8d230bdf8b9b24a9c2a9b11de8963b43385c32d851a702, 6f65af3b7c98a1620b15740387b8637304e21e0392265a59af9fc87b4f1d216e9f89b6d6e1e8d616a8fd39bfe1f24424 - -g_scalar = 4a -r = ca50bae743ca3e45a0dd8e3cc10c4f6c40d420cb5c36dc4c02ae1f9150f6a5cc7f3bc516e1b24b64126d4cde13dcbd9f, ac30d6dc35b9ab9eb9dd7248bd7085c75aa7e563ca19ed0f2458c9ef13cf22bc35dd6dcf7125d169f074bee9efdd2b40 - -g_scalar = 4b -r = a1e0ae0fe6ca7a154a7ee23df367b5c85d4631b4392f8f665b28cf8991549a96c8cbc40a420ab7ef6b5d4014867303de, fd42d862417d6562d7870042957fe44564e239e3f0402e1d6762ab69430aed71a531c2c450fab9012a655ee1139fa27c - -g_scalar = 4c -r = e677b97c61007b808b8d434e90bfa219a7253817daee85404552fc68956bce558c547a520c8d74e1fb2f775e4230e336, e7871c313937b80f64172dc31901ee2241bba1911ba3dd06a7a69a24e4f855bf96eb8cb3603263f9bfeae6f2f71abc74 - -g_scalar = 4d -r = 63d23607fa5c9816742e060b28a126270ca930b998ce78a327ccb6c0212a6125114a9b40334793a79f2134c12a501a3f, d44b1075302cfd2ece61c3e5572941a6dd03950030c9cfb21500850e49fd3c3d34cd7e2ef34d1d23774dcba4ec1f91dc - -g_scalar = 4e -r = 02781ecd4db639eea1560f9775dae55bd35175d9a506191dd3338ff4b743bdfc47842147688c1ced3c80145ddb9f0b60, 3e795421ae8fbd6cd47a03074e3c8f2c84238e64c4a7a4fbc4870c9dbce600336c62bff32c45eaac993a302d23dce536 - -g_scalar = 4f -r = 23b245a5d53912dab3cc818a7069cb7c491c312dd15d01f0e58901a204ca55712cdac248c3b74585ca11d9d4e9a6c224, 4b9728f81d7ab255941c66c9f30281f9617b301b08632eb3403243e9eeb95ec1a052eb3e3277555230f7838ba6b0b163 - -g_scalar = 50 -r = 1e8568cca446324620fe8c27a715ace6dd2ec6d351fea1dc49066428b121360923e5c6b90e42d1f9194924b4ad0a415d, 530abb420614a6f9b960b5efeecd8ae42413063a1378e68fbc7a903c6484641d98e97f1cd923637700c213bbfcce7e6a - -g_scalar = 51 -r = 0984c2e37cdf344f11238a859f436faff2c3118feaf138afd8cb3560e07b1bfbde45473e86c087853cbdd3cbdb06f682, 9dd7b7609745b87e5de38d63ae2706a701047a5ee5dd278d56add2f018f2637d959a14d4736fa240e1083c17c382584f - -g_scalar = 52 -r = e6db24057f12bea3dfc6d038305bfc7c87e75dfbed69216bd6021049cbfbd0c2e8c09f59ec5cc866783cc5bb88f82a12, 6009a59ebcd30d2869eb7bd2feee7fe5ed736fffa734994fe40d04ef6068512884fa39d54bb007bb6469e146b7a3a2d2 - -g_scalar = 53 -r = a075b16ac03d7805c25baa03520a8926eeb88ca1c7a4aab58487aa0d4a6694eb44cf847ed2f05eb48e61f0bf44e94071, 773dfeda69ce1cf9b72a7cd0563c78e40aa262ba2251bcdacf21a95749e604294e3c13706009643ec357a48a13d970c3 - -g_scalar = 54 -r = 00eb5c040d16b7fcb048b60e740c04a52686cba73934e93664a8bdc7c791db8094b80b8f691e858b3c712c3c6323cd05, 3e5c6ffb3adfb941dc98abd94341fd4987e3e34d8d8145a014e572f21cce9e0d9ffcb850d7c9b5b080c0d8914ddc8276 - -g_scalar = 55 -r = c835025446e64d4db0a08fe1114e6f01d953aaff73256a577bbdcadd053153d82148bbb88207255a935d2cdf9b06762d, 6c218d92c993f213a231839fe2895195c3d455d22caf52f27422a72a0bebe314392aae0271fbe969e7cfbad800dbc157 - -g_scalar = 56 -r = 94dc48fab7e8cfcde61e6c2984cb7e449e30229d0a06f838361494cc0b162b571234181c1dbb4629c7364268d94ab449, 43d6196f8de4857a143c6e832c92df61a32f70e6a0c3e1a57a9910d501c47967a4fe5f5fab20b37f0d7e44f289b66806 - -g_scalar = 57 -r = 1c1b3417a500bb22c4840320387b6b2ef30a928d9a3c3af1df0ec1ba8b80919559424730109677754f11a02e4aa0372e, 9f046faee996fe68bdac81880e7b4db731944175e7559f09dedf2454f984a88f18246d74a7909681690ee6c7bf3266f2 - -g_scalar = 58 -r = 9398236759e97922f158f85541bb965c782840d1edd794907774056232329baff0041e2423786267db52eb03d1db891d, c41a6fd431583d521af2a631ee1859834284651c3e6724b407f97c1df8ba4302a6f5384c2f5ccd104b40ccb8e384778c - -g_scalar = 59 -r = d0d105de164b7361d63dd29d19e0e2b667d3644ac8e55b7b463df30b0096721f18a49fdc4bf163e00c62094b2d71d4ac, 01c7e939b8df37f31d28243540b962d9147701090b4de4c065ccf0512daa253c7861b71b2093cf7ee5865c4e0217188e - -g_scalar = 5a -r = 4347b760969bd7f7b560d7e63dc77e7bb34f09fbd045d31e28bd6aae6e6e8e57672649def3c36ba79b35cdf7a7871029, 9fce477feb7d3671effe5f50722fecaedeeb339129c4724952f2cabe13d6dbeb23ceae28feaced8d2f161a085e5496e5 - -g_scalar = 5b -r = eb0f52348bf223b0e7e7382759dc3eb7b04b977d42d74f5fa4f6e534bbc2618a35c2421b14ae3f635dea409c9cba0858, 47cac703f116c6e20b09b3bd9ab88478cb78e0c863a2cba009d0b3319236343dd012811a3fde2c6d991c51670fc75158 - -g_scalar = 5c -r = 1031cbfcdef715d74efeec75e724f56cb8a88d32c7b6b5a626905570df79b6048f97bc3df1b9f55b91b6e58f1036e450, 3e080b351a206fe25e43c16b90f38d1d3deda082a8a691f9a4d6871d472ad231cee9644726ca94dcaaead60f2dcb2306 - -g_scalar = 5d -r = 813355b3430aa2d72df91689cfd151547a3545de7cfdb00e1c634764b16142cd1b1cc24f5380675eebd14d71e32d80af, c071f38f66bf9d09c71b395490a268e5572a425b71670dcbfe7ca8103cb06698d9e303f7e03abb7916dce2c985f2ca7e - -g_scalar = 5e -r = ed9602dc7912de8d89dabf40cf9eed19f4db0ad3ad1bd1192e2bfb0c25998b5d4259f70ee435a0deb134a04174225251, 843c41be9c6cecdf6010c639db73da1103f4f9dcebcddc087d15f243cdcbcaf878632b48408989ef585b6d18c19f9213 - -g_scalar = 5f -r = b8f42fe52fead1e4257b0bb5ad7f23e10be90befa27d2b794a607b9d0ef989779f74ca169bc0cbb10fc0f2630dbc3c91, bb6d4ba542df286e65364ded55ab93f98c0f64e83bc7b59145cc3f14dd99f9fb505fe7ebfd79617dde78e4315f93b592 - -g_scalar = 60 -r = 8bf3dccc39c18b96cb4aa43c9741eb4226de4c6581998af2ee21597e52ce08f68fd61e31148840d4dc5293851d15bba7, b257fb6c5a4434a4cee0842f5d5680b8f9d19ea0c831254b8545396f305ee4f0507e24057dd87c3966e1d5dad872984e - -g_scalar = 61 -r = 8c081acd170d807f87b1e51bac06961610241ed16fef9d9d8f273e3065278f98c1f0db004a49492c7cd2035d7f5c54e2, 83c6b78ec4f030064c3e2491c4f56964cb47e4ed7889a39ed7d24ef430e05dd3e4eb5512d6865bf4005051ea1c73b598 - -g_scalar = 62 -r = 458ac76d0f40ec396e6880f15c434085ca861b4d97740fcab1bcd42525fc2c50f05e0ddedb37f6ddd2872262b0a9e00d, a77104bcffe021f349c17dbc262820737b96a6edffb612df003c91f554ee9d59d70204dd7088d2da5fd094ff848ae412 - -g_scalar = 63 -r = 648c5f00bb28223ad49cae0982d9d6bdb9b2e6b479c8f8bd1b41177c708ba469bb4f9e0f41aa174e6e3835a9b05f84a1, 03e1698b322d63bd1f7493b176190d98d6f759d8d1a0ea086675138f708247e1fe3096dd81a0a38d04f485765d8cc4a5 - -g_scalar = 64 -r = d884d30b2f03f287419f4d2eab386382b0e595a155fac50e100134e2338c10e0f9d9c4dbaf282e57a350c4fc01834066, edc690c903e2fcb28a8aecc74afdb92910fe926075034f722a4dd35433dac6b48a14723f4922997f4a7e5936f6075163 - -g_scalar = 65 -r = 7e2392bf7bc814db9cdd943547a18710d73b1fad8b8b5cfc73ddcd2c2eccfb1ab539f5fe50c66d708e66c6f69b8adeac, 73872d361702e1de909b656f420ec104a73e1d9af53e80541fef41850ad68693ffeddc211d67c04d914193c06c8f74e8 - -g_scalar = 66 -r = 180783fc39489b2827c614bfddbdd7a57befff1cb90a319f1c0f6241bb2863c829591fcce7274c8803802ee80fa4f860, 60a4d22a26f6a5df4c6c8fc838175105a47fbda3bed5e5259e8d5e0bba3a023a5464baea1b373ba72a89af6579ae9e06 - -g_scalar = 67 -r = 590da88e64671048113a7902e3da530d1ad95a94f23d84fcd3f0d14329c21de1ddcbb10eafd402bdd24cabaa21355d5f, 0c9e71377273dbedd6e2d5a62de40552601bd1c358fad1c397ebbb4ed86f4dfd1a52e4e7e62e6e0bf4a58282925bf0da - -g_scalar = 68 -r = 7117756e39dcddad381f4f06f473127497d1e75fd9f408b53dd4f91683002cf1cfd364cca03bfa6367126ced901410ec, ed306706377f04cfb06434324e2c7f76f5f40731eb8fedc1f3513c3b9c9e5f9ca3b9dd6e230c2f53e206f13b96d88ae7 - -g_scalar = 69 -r = d0ab3e3a99ebd09c022c75441a806542862ef39c275075e3077f30e5dd2c23bec367d6aea6e201bce6e91985e5802845, cc3ae72c6d8973a5cebaf145152f1923d3d57a9547202560372c23a9a91fff8ca5cf364fa9ad136b7d67ef60d99028b8 - -g_scalar = 6a -r = b380f170bff65e1c2633179cfa6a8ac6442e0f1f36905deda01780587776c7fea1295b179d724fdf3d303c72138de192, f1c69141971d1d5bb5a31d6abf10c960069f47e10aed184b1e0b982b4632f0a407c34b8181b17d37af66ced6d590155d - -g_scalar = 6b -r = 77964d793f740b4850994c4960a91622ccd4f456753f40d027c6ec25a0075d4673c21e204f761490d718e8e1f4363f23, 5182a7172afcedf2e1d99f78c7438e3995d6ad45b8659463488374d1a27f3f9f844fc79ae4193d79f4c955e2f647ed02 - -g_scalar = 6c -r = 2a532f0ac16a417882f24a114cb0b8671b23e3f7afef0b5d589f30567bb8dad3d81b74529a67044fa26631ef443c7161, 629a90bf9aee303f7499b3191ed0dde33c58b5e63c40024984d81e8e66d45390a985daa26e4abce9276d170f40383ceb - -g_scalar = 6d -r = 6e3c27bbf13f24033cd18c33b9cff887a911a58af0d93abb5841c5f8a8dcbdc89c7d35833cc1184b0efc2e27b2deb1fa, f4c46c56198c770587e19a4e7f7c756875ad33caf5a1411d2db57fb4f560daf435cdd90b54294c055b391712ea533ae6 - -g_scalar = 6e -r = 26956a5b83e5bd0bfa63d67feafb4dc8bdc1c92475053732ce481ae68d2624c8a4ba394e85d138d693f846d4906ef776, c59ff978106e08bfb775af8769e4422061d7272e75c0564abf9c791c76e941515426eb05ff14810bfac270f270cae3a5 - -g_scalar = 6f -r = a158aabcb9bdef14c3907b518b02667f27552012c727be036744720b50447fd908e0805000765fab8db3b74805be74b8, 09ca776808279da9c64b47b82300d9feccf8e1f94aeb2685a2ff54bc93c326191095bee4e305fb96aaddfa03f49cc56f - -g_scalar = 70 -r = b4a6714762f45dce83f2fd2cd8296a52fb25e37c9710b70b2b5609d5504c81290d20370a5d66455a2e20654839d6e2af, f82bb94445ed204db9a19eb57c182141473e6877caa846883e7ee43a2ec76a1716a71ccc0b6c4c64a818b9bea15c6a6c - -g_scalar = 71 -r = 869fcd17ff86a9864a5bdb048d7fa0c2e9815b09139b7fc5e72215ef852bd27fd2c616d1bbe33572f85b86b79b0bda12, a10b3df255f7944b3d0ed17c31b87757bf7fded9fc31bb676998722ae7b12029b9c007f1d6664d043278521791daf6be - -g_scalar = 72 -r = f80f423bb48af0e8e53bd76b6e4b3bc543c2a97d5743877a559b40a286dcfd8831ec9ab137796cdcebbc6b4cac6a280f, 0cc71a320bc4646e499467386204acd06ca075224dc4a5e8da508de78539d530f4a727682b1c4f45390696a8d488cc7a - -g_scalar = 73 -r = 274c69657350982d84442a4123c50746a97accf432406bfd33e868f326a488269120f7b3a043456daa4e673b34498f56, c0c5bdf6cf5a11db75029e32cf121f03df9a343af6312ec600dc39b8848a5b863ebf1db1ec7ae2413106b7fb95dc9eaa - -g_scalar = 74 -r = a40dbba76a0c98442700a45b812fab5c2e56dde7119ced404060d22edb6e808b6d812dba7e29445309e7d232ccd1c14b, c0ad2701581c66c57d04f5b9c910c402fe084c3f269a8382819b165ec127165cb49514f0e988e2f90a1c7cbe9cb66303 - -g_scalar = 75 -r = f26774cd7823568b517a6bae23acba53ad9e749a9aea738d613e5294fe8579619532b30ea229d070fdcce7a80723559a, 70509ab082b097737a546582bff1585ba6729b8db27984816d99c05f06aef600c6cb3a4beb8c057b940767a1ae53114d - -g_scalar = 76 -r = b8027be64a5eed689d19bd63befa48da4496f5a023133af12541da528e6a2448d1f2d42a406775a028f0ab7a080bfca5, ab9386aa4a3ef7e79966399f963aee20f35524d0b44501ccac13b8149df3fd7307819492dd5cde2308c7d5a296b0684f - -g_scalar = 77 -r = d2fc5c57998b057713167fb8ec9cf4cda4630ba1875fab27cd55e7b421cf9dde59f9078dab73bcc4732595ac7329d8d1, b16536288a40a5cd9a1bb1ac9221b7a3eb9ecabc9109b7e5d677a64899dc8f46b2db96f206cf9ceb761360c15ff51b6f - -g_scalar = 78 -r = f392f9632f3b0feda03a6787986794dbcd411e349499fe4eaf07a03eb8994b40d3259f2810248af41b3ea621f3c6f15a, 539875879a1da4c861bf593f532e0ecc3c967a464c37dda4ccbe6fba3778c83889e73d9a54d7c388f37166f8c08a1237 - -g_scalar = 79 -r = 79cd3f1e3891db8165df3c959329f7e0c29afbd47772778a6c33d5d6ba6744e48c9a16e3a896ab1e5198ba40189dfa8d, 11aeeda1c64d0916473d0df9f8265b7e9c1d39a8b716f21b95507a54ae4d8985f5404f6be9028e62caaa8f0bd784019b - -g_scalar = 7a -r = d109b62984083890da5fddab7e28aceae3da87e136a2812ddfffe0dd4cbeecde89a9a5422a1a0fad53b912fb21a3720b, 14411c67bfb77d57f6b8dd99613a733b02b77ffc1077afc76ce67450eb4d4ce0f0ef6939293f99667744095c728d3ee1 - -g_scalar = 7b -r = 8e4a4f6321dc82a6d4d6fd78550418d24b3d05ee4295440514a9c3ebea80907b46b07d4a2a1018fe151198480c4c0b80, 74c462ed1a798add03babcecc25ccf338a86ab0f498f447b5a82af3e9f30f7e883c6ba0470788c9f1be4d7f7a178b9d9 - -g_scalar = 7c -r = b4bb1133ad9267aa51cb20d25f083167238df4864cb95a00bdb4385fa6f8277692f3dbfda1435507f9e5ed57d99f5989, 49a89c9cf7a12be9b9e99d533cfb098b9544dbb2d4eb6e31045ce25c5e93210c55a4951bc8a66567bf4d13ab4f115bfc - -g_scalar = 7d -r = 03b2dab245cf48ae7ad6ebad036703ac9436a8cf3450356d50ea65aa46f614e270f25677719d6ada9612b8bc3cfb44bb, 8933bff572f35ccb7cd5a74bb0095802551f41bc219187aaecf53641e119ab8edf3fb730ed4f55a421953d2a4117061e - -g_scalar = 7e -r = ee82cb5d4c686f3145940572b53625a29c14d45c4d73654245b97c7577b60ca7135cfd8fd9f0f5f0ee101c5ade346cdf, 07b33602c5e1ecacbdf3a4d1afba7f8cf99d6754e04af855f9732cbb4f41b9c31525eb38bfca96d3aa1136b6b0c47624 - -g_scalar = 7f -r = bbe34e740f395db4a92bb11bd6e0f09d96fde63874231e0feef28f34522c62792aacfa4c569604aff7753246eca101ec, c7e92a61e3948069f3d6832e367b2f949e29e339ad180b0e88d22a44a467c5195698bdbe018ad5aaaa6e59ddbf943cf9 - -g_scalar = 80 -r = a6661cc4c241720a0336aab8777a16d2f313389118eb5195c0dd449e7c1c39840f4fa5eff21af80ae484fd9f8258030f, 239dcab2a277ac5b2657eedda5791ce3b01f1e0434a02a6b5d85a0e4a022c7a4228968656461e382678db970a7efacd0 - -g_scalar = 020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 4ee443f91860144e0b7f54eb7e4cf44aa177ad14077777efcdc4753ba05068eacfc4718769f60e03c84f917203bdf6d6, ecff7dd78d65f38ac5bd6cde7b2c6d8ebc4f93f4a0c7614aebc958fab8cdb6ce511137d7436c1b541279ed4d42bb6a93 - -g_scalar = 040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = bab3aa8c60a8a7a71cd9c342e31644be358bbd6e8948b6e231811365ee61bc954043079cd23ad193ffec6674f65de0f5, 813054feed0991144eb2e364b2aee6d7c96a040173750d6e8957c03b8517ae8af7d0b0414439990ce065519fa375beb6 - -g_scalar = 060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 304eaea00e786d5f4d6a091dfab87b368618aa02c421c69415aaed42cca2f15037ba0db6f0f49278ffe3104b684456b1, 57580c615f46086e7f7fca496dcf60205928791809de860f6094823b7a70d421f57e3a19ad387a8d0be977472c114074 - -g_scalar = 080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = bd6066681a87cd4a06737e54f91d813ef972804fbd39a2bc6be6abe3b91f14827be330a822fbbe61bb39a17a7c34f095, 5d0bc923f9671d8a9d7f416d067e2c198853cdf6ac0511b07a93aedfa58af042b8206a8134afd68fbf88b2e5f538d56e - -g_scalar = 0a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = f20e5b8a6c7e9f94c3bf31d408595dea5caacb6256583c442822598ac5d6878a19eda013c543171e9468777a2b389b27, d0afdf5b9d883c58b8c0d1352cbdaf23481a5a2f7cdc0d7c2bd47584bd688e0173ae5d0d2939aa75254897370ba8a1c8 - -g_scalar = 0c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = dc74d638c785f1439114cdd012def474f016adf1c094b38cbf75bb57da4d6ac4f60262b5dbbb9e4cf3b6fd79dd3532a7, 5b843830271041ee8c601615cb08f34f381dfc0c636ea6b6552685b79ddee1f51f141878cbcd0d4cdea060d6a8d90bbb - -g_scalar = 0e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 7b81ecddcfc2ca46b9e0718a467f042b49a6481891dc89ff535ee486e03c0851ae3ecda2761b94ba2d268da9b28bdac2, 89104b6e85bbff54b98c3dc02b382474382e3fee338270c7e4dbf739c7625e9bd44a2420aebbab8f3ae95ed0c166648d - -g_scalar = 100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = a24c76d1da73b71a2ce33c2eee858bc3f02750715adf71d715f1ddc63eb317f94f1d082ed0e418512e7d0a16204be028, 6cad67cc0a4582e182cfaac2a2ea7b24d11122a1a47019739f5bf5a67502de64efcf170505cf96129ef6a70a6c70c483 - -g_scalar = 120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = d061fcb5f69a732f7c30fc84cca23e9d1671eeea9772efc6276d435bd2141b0ade8b59ae0034465b3055ed97444bde46, 3fb7d83ca8bb65857e9a06f182c8cf961078a2a0431e5293f3053a22002f5f90cec08d256e800eda8fc734fb6f5b4f20 - -g_scalar = 140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 3ec851d706c4d48507b3e8b9191a320efce43e873cbb2b3faa299008a84ace074399615939ffcb3b139d9fef6bfc08e4, 4c71b7aa4df8a1b2ccb178a0b29be48cdd6f8b5134f6613758b79d01c439ab23b6a5dcb213c31d5c03d8a672a4bb8477 - -g_scalar = 160000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 0c80134604501d21436c61161861628a33b080bbc3350983e151f53b35fce45855b20bc8b9ca1f6d3d7718adaf4b5201, ec4885df66cf4d6d8a2448a43cd92f7582229794b6cc154c6976b0bcfb7c8e36d3962457332d7fc38597180f63cefa64 - -g_scalar = 180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = b82c99d2e7c3018092587306f37f0bed46d4729f1771c5d3f05086ec827e6cf877253434ae2c30f292bf8c4508359896, a7a413318961204ecfed795f2736bce61a1ad3eea5d782045c583347165c238c7fa984be994ddaf5ee0141dcb1684841 - -g_scalar = 1a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = e9ba9558a68b98f9bd1e67afadc744e38aa99096770fda49bc4bcd77827b62965a01e68261e78db2d859799609f11ae9, 008e70995c29ccb22189ee16407df414d5b2734288f2a5c00483e97c5cecb4b5689baec35f0d88b25c9d3225ca4c3082 - -g_scalar = 1c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 2f6fb08031e6e76933cf684789a9d8aee4b51dd0c9f579443a5902cee85717c53aace28e3573ecf687451ca71400851d, 5ef2562d0c8012a4b8c457c3bc17d1fca2c932c9a2098f4684d76151965109ab2d73fef4e78096384bf3da323b78dad1 - -g_scalar = 1e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 79512b8991d197c27b814ed800fe704761c1b06eee7c1e8878b310ee8b5624461fad39ee9819618481657860b1637988, 5a3de830cc8f5386617e5957c5ed0a036f1e2e87d76bc70004873d713a22660b174b640c477bb5af60433526dae6f367 - -g_scalar = 200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 4ebd334b35f68229c85eb23d57d002931fad8b304521d7e612449c4fbe35109c72913696e37f500696a1e74f51e4de5e, aed4dbde0ef567dc72a6af75bbba88c0eaab81be3a1c866b067b0456757cd570c2b4da6e5463de2e7c5b86682df5acf1 - -g_scalar = 220000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = c51c0559814f7d9f39d71b35a50c71074a2d6ca29d6b6d55e462100285a8942994ee3cc9bc3e8cc1ef3a7281fad592da, 7bbce68c1760111324e69af34577cf0c4a034b36f131cc26ee5a08fa45c69c446885625d46719d58a883c21a5339bcde - -g_scalar = 240000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 381e5b521d3f2ddd9386a35d4868dbb2031febb3374661eaaed46bbc35052bd18fb9294a8cf4e306085e33cd9273818a, 8dc0511f267d5c14042707ffa7443354bae262ae490c1969f446dfa92b9dacbcb0fc99f49dc95af1a938a3a5179617ed - -g_scalar = 260000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 0dc856f4656e00edffe544b3f3263dfa315acfccee43b8b5e10e7ed2dae76c71a9f177e1273679c8fc9aea79a04464ab, 8c225452496c1d6d54cbbd4056a4924725cfc139b1fe79ec5554a1ebe10252a4f0c735fb63a36ab88cd1ac907cfad555 - -g_scalar = 280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = b4315ab11afe8540cf6ba7db0f63dc797ad61b8ca57dbcbc1f719f7036fb5a4ed86e85a483e43c268f0e1908fac2674d, c158a2710b6dbd459b70bc8c60d2a62455867b5645149689ce98589b9eab87def51969ef8838a51d0448e852425c4df3 - -g_scalar = 2a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 7c18a7a8fa5753e85b6fd841f76a7b01cf6220d49d0216138213e04ad04e93359c03aa457c714b9ac4645ddfc70e9172, 30528343eb43d78d4a8b8cbf5174f2929c3cf0cac7402d75b75ebc0c35720ce2f197059e22168ffdd8747f67b6e9d715 - -g_scalar = 2c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 0005bca678d1c0ec1a7c4af600d31e7ff4a4f3afab047cdb8ce2db1f4645152c64ba3bc73d501e010b262f808f1915f2, f7468e8a92d281c71494c6050dc3c22c105b9dd2fc657b724fa387e5fccb58f5a299b1002ea9abdff5ed135f6fe5ebb0 - -g_scalar = 2e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 8f21250473e722c5d76624e1c9fe92200eb5e4ff0b57513b30bb969b7a4289a53dc876ac1ac8a2fc9d420780b42108d0, d07bda4ec5c1a49a8ee95aaec496d9c8e643e936e9ef5a002a6ab465048c03d103c089de722b382dece006c9e640a463 - -g_scalar = 300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = af51c5bbf42e0e7c92f031be99275c32ce5ab665d8d544e60b06aff65c27f5f6264a09f3f9288555597a26ffb4dc8600, 5adb28dd9a2acc9bb8c8a6df334d4f57fcd999a86e2ccad9e73fd299f93fb7dc583fba6a8473543a5bb28b061e37b36d - -g_scalar = 320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = f2038e9fe8e9ad7b08d7d0b167b00a8b732a3b217f4e0b07fa70e3732c9139e3c6dcbc31b570e7e381eedabc8f38b7cb, 17f1e19d8f8d4f1ae3a56e099e87e8a5a3933d71e9581abf1cc21ab87f56595e01b54b247251e090c30dd7d38fcbe329 - -g_scalar = 340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 308b37a8d48b9574d1ef46340be2d8415267ded09aa9a5c005037f26de2f444ac6d97d37e7a97f33c760823646dd14f3, f99e952f24f8bd3b126505999bff252f71bfb8bc0b80f3bb2d8adde62c39c75a1d5169d938b7c1ef102f7878487bad5b - -g_scalar = 360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 4ab1773e6c85c123d67aed02d15b1f9de20b10f1f1021adf76cbc49717204f9387590cedf4db6d03c3db1f37120b62d4, 3255a34b29d1067d2cc2f92027d52c47d442a634f9ac58d3dd42c53bc0459adfe2d7f9695073039a5c4e64b578618661 - -g_scalar = 380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = e9ecf6ce198c99f00f6c5993c82e2013e2f87d5e2973be1d4200e00670744f159fc75c0aec6afe4324496a8b7a8a6d47, 8f02df83bcfcb9304f24ba23f3d93d73e4273a124bcffc618e962ffbd0fbb134bef4b8c8325d1d93cbdf72058b37d828 - -g_scalar = 3a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 4a7788de2d65774a2c8a2246a3e93b3391e674f5503557f209fd4dea45f979bba7f9f7519579f6d40c595629484cba20, 892fb605ef305ffae4751a325d1088af129a351bedd41f381d7f2c58f5f882beae702203863b049a9594c59414690f4a - -g_scalar = 3c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 30568303868326be1f28862ef23931d5623d44b9e4a0bb425bdd4382a7b62effca4ca7cd5a03c014985c8f4b0614348a, 6d990c16f6f5c9a42f50395d155eae927b32249baf3f0dbb62b74879b1e70a9af4dc02330ac4a153850d2a0d82e76f04 - -g_scalar = 3e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 37eea04d226c0de31df6b241f5ad41bb711e5b378c68c6d120f84bcbc82761b390c700aaa28b9162a408aa1b48819870, 09145c9f5e82ee78456f2ff137a46fe0c8f8bb0822ed1ddc6b1c960e7130079f628ad18ef2cd3f99c2b06d8b44c41c2b - -g_scalar = 400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 7fcf0ecc91251b6e64f27976d5d7412b1a6ea51a2a883b7f340c8ee3ba4a3301ecf10abc47bb619e3afdee277d221ab6, 89325d7a7f96e023d373931e8e7d712bf08398d5d542676dde3b73d6ad61b2cb38e48b96e2e13e585f3f8f41365b18b7 - -g_scalar = 420000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 7e3e4b94ddaca7970a21251f7cc002a4391e974f262a7c900fa492995a642da315257c37b24074d0000d342aee928391, 53b272171804202c5c1d316ad8ab1a429fdffc17c7f4d0572b214816ad88cd68bbdeef04e8c08e47c80c4510743e1114 - -g_scalar = 440000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 63102e93ff029787e2a938890afc827f951f92186359cf06536c999ce295c45100614bf206b7e166eb2e48c10bf4e94d, e6aa9eabae2ae9e3487ce890e10ee83736b7e9711cc2f3b4c0934ca6c86043047354df74928742bfab297c7d2ac89645 - -g_scalar = 460000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 5508188555d35077eab1751b07c4cf3c9cd6be7b2601743ac8eeeb6ad5b89ac7e6a752c4783e3da875218ff22509a1df, 807893527f1ce4ef7f53fe8406c6a5ce4cb21d96e11e734910ca143b1285e27ff265d0abf1e40048e315baa104764080 - -g_scalar = 480000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 3838356a53264b8a5239b5c4109797d6ae7b59c5fbe10a477fd7fd8eb3c2eff77db868f3a950dfa26e7a578340517347, 25ca45046cdbe5fede6af0ff83282fbd3df64ef5a06f3cf3fe1aad846241a50a67c86ef46958fa2c8df8454c320a8c5a - -g_scalar = 4a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = f27d64f3900000b28c140f1444bee3bf74ae1bb86f57ac995957f390ab2f9f38b6c4ad7e6725e6bcf7d0024dbbf692e0, 36c1f5a7f9f706f442cdc68447ffa0369a7b2a986150dfa43b5de0af2e50ca8f1c6441f777dcc42105df256b72fdc686 - -g_scalar = 4c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 1969eca437dd1341ca98c4364aaf2f73c0c88af6aec23cd24bea31ad623e7e55101f055acb1b1cd5a319340d6e6c0deb, c0213ec56844da05a7e5670079911cf9c3d1069474f262e9199ec0e93d6ea9c4afdc99532eaf5b086b03989f97866dc3 - -g_scalar = 4e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 2117cae94f663d08e5bd0119ed5225f74fed82fbb2d8dbdf78482d89dae531a4ad937387f2e050ade0732f6de3a1e252, 72b9ff99a67a5bac399ae62b881be3145d5e71b8e9b5b6a3296b1335bf341f2c589e22809e86c55a99b47ee3ea1f9b78 - -g_scalar = 500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = b942add81ef8465b860578cf416ccf69f307823e718c8aa3f9fbce33a82d37361c77a3054f1e0d095adf3d9a111792b9, cc7a9ceb854fe9da6bf6694891a626321f521c2dcbf3ccb8f99b9a8dc09da90be6792eefb01528a89ee0cf97cd9472e1 - -g_scalar = 520000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 5f3fe3e3209d9fc047f02c4abc4c0e4ed15761fea5957703efaa521a05781b37a23f342d40f5ab43c72957c2b56c62ad, 8ea834b98cbc794316670382932d4183c743947400bf71245577e542aeac3cb5fcab0ca1117138ab1c1598df561b137b - -g_scalar = 540000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 84422ba89c2d7eb037b11137f15f0cd229b0341dafb73ad113fe0588ba057fe284c5d6a71a50c560fc9660a3c8808373, c88f0cf685c54d31535e8540116e2db870cdeb0c9f242a42908895a9e02d77fcd7a8303f08b37a840b595ac52554ef7f - -g_scalar = 560000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = d2fcedcd2a1986bab43adf697bfedda152ae359080ec87ec825104bc4ec82e0f6dbc484f2356b6a44dbfa5831af13e99, ad9e025b3e6da3e05f33f11ebbe4c690f088dfdeac7b2f9ce25dcfaec32d5809f74d9267c6fe4f5734951159045ad785 - -g_scalar = 580000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 0c5be4a1ab204fb0ab8802bab8da8e68be6bd7b92c078aa8716574c5e9ae3da03d081c0d7f15c9e3f534f145e2290eba, ab2bc89575ba5c996b532891e6550d3c855367c4924ec2d29c6e2ce0bb5cd2fd3929d0d78fc9b7a5ad25c5ee0d3f12b3 - -g_scalar = 5a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 58ec20b5fa1aa22b08285f05e94af0d0e9245a047205187c5d74a59ee05637183b0b3ca6276cf8c41cecc6cd72c1dbda, b0e13fd36ad9560fb749ceaad9da4802cc74af38ff812ae36757a5c06d40592d0bfefe8d9b5c84757d367150c1220085 - -g_scalar = 5c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 71d663c80482a61b9e9c222607f4b670c77375da47644b079d86bcac8b5c43fccfa41da6f89ce836b56b035e2a0349ad, 46115292ae0c97d38a2bd7fed4dd03de9b463559631b985009e0cb2a7ca7548bf1cedf7e48832b5bb423e739ef237431 - -g_scalar = 5e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 1ddaad3e57a8a6ce086cf9d3c08d007d4980b91eae21ee2813a6eab45a5f233af7bd1613d7e0ea774be55e045320c643, c16aaed957e5a62c33587da0f82147cb54941191f098f87980dda6bc17c4e9dc4da655da00cc3d4107d0c19db8c6b532 - -g_scalar = 600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 5016c8533573235fb1fae2fbf363100ac12df68cce52defb1004254501c4e17190cab0eb9d74e3f6e44e3f864b3759cf, c1da40d31f5867b241c7611ff54e48765abfa961308772e9324985835a4e118e8a20d42317f84ef28d4deb661d922e9b - -g_scalar = 620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 976a426e7e387e5c86346adfc17b570aa537fb6be3a14ebf219a097cca4d32e7607683d6d30481954490d42249f884ab, 622cc08030b6aefc8bf4b8321496b6541a6d9ccb5e20adea3407694184546e81f870516b4b009441cdd13f0664fa241b - -g_scalar = 640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 972877d5c351148008e952e365e5ebabea435fa0e9ceaf442a773270df98069e7dea27ea124874854df02a7d3088aebc, 7d5f05a3faa1be224b72a1e6193547517d9878e811c89153bbb792e2c3225f20e50abe68b8c7c796ef5685f859a04cd0 - -g_scalar = 660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 9c3eb2bcc338e60ca5e4a81611e943ceea32131487917fb3ff4d80e7182e7578122d7b16cd1909a4a9c5286d78c8e4f7, 3a8745f4519dcddaf346b75a9538fb01980f87c8f605c9584c9ef41d9b15d60be1c92fb8b5217ea220e58adc72476919 - -g_scalar = 680000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 762b3406c6577d810accb4a7922d3b253a998cdcc8995cace659cbd6ace07e138540213ea7a3f2f761dd7692f27eed54, c27d13df98b867b536815de2c724284ab6d72f7ce6490808080a522673b98cd37f78e02d8cc9bc5fa09db4f57e043740 - -g_scalar = 6a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 8df49d947bc531c51cc8fa418508b201bd7dd40b7a34781499b5020891035d21e8d66a73fbc1180d5f29d3aaa7d9e25d, 8db14a1dba6f378f3cebe7e079393df73fb41991aebc0e3b56c448174ae09d13854dba16f2f6917f572cc562f0c8665e - -g_scalar = 6c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 490753350b7e4afcb041ec67cf575de55f49ef880115b9a54771281390833f18b5e8876c499a1455bfeffd5356adb6e4, 868d06baff60e943fdf76899c1e4f8b433ee16e27993eed6a84431a6e6ed51989dbb181edafad9a5ad4dc4a15f0b9f24 - -g_scalar = 6e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = d93bd14b4b11ac38c8de9fdf7506b004184b98d7ebbb8c4dc3c2cba3492a416a313c0cbcbb713c2501b7f6985f7f481b, e8ffeec6163e34a582b65a57276cefd26331de3919b3882df3a5bacc08ece1b892bdd75b9f6e7821471119db51bb7d4b - -g_scalar = 700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = ada548c3b46f1e376b9fd3f7f19df4bc7f7009d735b193cfd8e497fff172c7cfa80a8c0d2771235b46303171491ccb92, fedd3a7011a6a30f33803a10b77840dc29a6d5d779b8f5cc2a121042539eab95ef2245d6ae78ef9987c6eaa9c7a20270 - -g_scalar = 720000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 2d56966a409303d605de72b7f70a3994bbaeed33041120a96122ec75d132b62c870346945bf287ec264b3d9d11eeb9e1, 42b1ee108ec7069ffcc4a5271566115518cceb0e66f4debfa90f02531e45559aaa2c0e009a84256bb5d2a629e73a0b47 - -g_scalar = 740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 24ad6b0ca28c80673f16d1ed3b5fe8d68ec00d9fc04d8cd5937a15f52a67b12bc1413da46682c7795d782a0778664144, dcd9e4e8120b38813770e54d16bd75b2d686eb7239384e157d863f5b2ac0c23862c4c2beab2fa785dd1eecc532732b19 - -g_scalar = 760000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 326448a0597de5b3e6361a339e0e1c54fc3e322c7496d0809030804ef95021bcd40b4963d24a2b6eb9f1b4ae3e29ef63, 0252a9b99e9793e560cbc4f2287857e213731c2735ba183196af3f106cc7ef543613bcad0c6218776b95c41a2c74527e - -g_scalar = 780000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 20b358444182aa555d43a4a6191cc808919081881990c13c49b13eb95acc557287bc4d75b1baaa7ce3052838df5147e1, 14101ec7326c4d3885b6c505470fbe135db7d06920f68ec58d130b3900c5ae9ec6e6e061722e91e770d49a4a670b1fd1 - -g_scalar = 7a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = f04df323cee02f61cd5a7a956b1f77beee55d9e0594c44ac013ec26cee34c1dc43011b315c10da9bcbd0f599c8e64d24, c4409631dc14adb19dfe638a11b9f3e7cf019abdd3531546a029482b423ca901b3c436c152ec76c9cd4026d1d96e851a - -g_scalar = 7c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 010865380377ba8f43a195425fed884fd7323e01a856ae6b6c8e22676e97f5af75921e487576c3ddeef03450e10e8018, 210d6016e25a2073ddf723ec0a11fb830c8d328bdd918524ae098b7f9e67bed0c6fce58bf0fd42817cdbd06ac82a8f67 - -g_scalar = 7e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = eebb047e6d7c9413a7235359a60a123952d9264a3ba048ebbfb45e7b89486d643ee8c19f0b66d8180150d085890f1e7a, 7ae63ab9d214faedcd833fa6420136d7dda482d4320786f171e24d58264265e0cc43f5763d6f21692afe72ea99eff33e - -g_scalar = 800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 60ad991e4e4eac458e5c12139ee4718f77b9b6dd6816b0099aca885c1a0d58e235414174e52691403c90a59f85adde98, 5e9bfc5c290405122e7b49c76f7a882f5f99092d42a87e32cba1ffc75eaf3eaaacbf4eb25bc5fd2ac00c35694d71f624 - -g_scalar = 820000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 1f1b6cc936184c1f444217e60b4b3953db3e9066d9772914d5968b29ac900f4c39dd0be4c1125a63782903630deecb3f, 95f412236ee17cb99ca45b884179b279df74bc7c4b15781d9c94aca42b2ad238d4d435352c5b300f016170c37e873b7a - -g_scalar = 840000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 9db0ee0b907f2cfdf5b944c9040b7ad4d4447c1b20eefa54e8804ab3329a0b9a9713a5e04894f486a31d3524b295958d, 1e7a7fca9b447bd44f952109f1172bcd2b47ca0622d4deefe0663b5ab29c3cff3137241ea83517640b1a1f3a5384a999 - -g_scalar = 860000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 2f6bdb104cbbe283f9c8e74d26b173fb5cd20671daeb6361192707699fd1661b8ad7721233e84ecf88f2de40a7b3fe4a, 247805475c8c8aa5a9c90bdfa1886bae3417f527a3ff3a510c10b90efbd02188b3df0b25e67e3852f8c33386d8796519 - -g_scalar = 880000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 6847c20de211c90eed3a6508ea56be90d9b625dcf9ce0cde6459720f8eeefff520d0c4740dcd66f6c9898355ecf2a473, 6c7c065add370f7749cedc634470e754cac8f277d145b8313155874750209b4d9222eab23023d16e36d86bed71a73cee - -g_scalar = 8a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = b1516b4697bf25d1c1c0468307a8949bdf7187596ece704b26adc1564300df17ec96212c96174bf6bb114c0747f74319, dcb074825d92d8f2c13d11c350c7aed054be86810945e3b8c23ea6101f426a499d93d21a6664d9609d83fa5148b60820 - -g_scalar = 8c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 02a37213fac8a477162aaad842f412c5aff5505f1070737afb8a08285bb5202d1ff2549ec4c9347646a95735f8171804, d7aa1d2378d82f9aa2006f207e6ee867e657e8c782d04913373a9039db1e5a409be6a0b29fc6678705ff9238932f08e2 - -g_scalar = 8e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 80e70362a61f6b8e5b9d91d31e8f6424ebba130bb3663e1b6a9f149f55dcae398360743ca827378dfa8cd197722395eb, 0e1d6bd572a38c9c5f50d1af56f0674602d7f0008e445809a7e00178e83b6101d09f7ae147cd387c0f569fe2df0d96c1 - -g_scalar = 900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 3a34819d7eceec8835d9fafccf45b75b22bbd01853e14183e09f04e6223a0ce868ff316015c6f7f5fa070e22142403d1, 335c8d36b7784e7c19e12d0565e800aa8e77d9f05f7edc6a0c8005659eb2a79a431036d5841d1505d9cf7568d33262d2 - -g_scalar = 920000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = e70634860b99a9811d923a955e2994097a0a8df4a85fab6ec4a354244dc0e8bcd1b7191b3cfdbab92ca47e98ac1b85fd, 41cf4463651dd58c61df35a2872fb3389054ff7cf92744f7ce7b2c34274700c5382c5952a9ddc0372d6a573bc4066501 - -g_scalar = 940000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = a6e5585e996d20338e857069e462cfa8f60ce5d991f1d4875c240cefa3ef520288322d8bc225ce6edcac39d87c1d9f4d, 1bb28be140089be5f8cb9c26a5325b8c74b14432148922915343a0a2a3231eeccd90c140f907ebf0709675a556281e6a - -g_scalar = 960000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 0a14f23eb0470188da64bf1e5628f2863ba37c232de1294438d28dcfa9312a5e224f404933c384e47b7bd39f39e00e98, c42dc328091678ee839334b1f7b077cd7f81c9f49d1206a69ce1716ab4aaec2b9c8dbe79044c3f2b2546b252c1e279ef - -g_scalar = 980000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 6189f5e41a991ea2da296dacfe7d778f186d3d934f810d8fbac785aeac0939e3c7c9e5f1d27d1f312bb6e7ec3092d0b2, 6f670479e22efa03720cd3908d1363fda447a31ed83044a609d718487196dfa804aaf59a88a4dcca098f794e9634363e - -g_scalar = 9a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 1dcb9da2e49ff45c55a12128a50853d180f745e27f7209ce78b59db06f2c572163a394e1404b5b23cbb76478b52110e1, 2fb48e2c66241e371d10aeb29d2f0d8c854417e329d324feb5951f413db491f31c2d9362850112c8ca76464c896fba5f - -g_scalar = 9c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 9bace7adf8a7c0bacccb784f77921ca4d56ec8f223a1656e16ddefa50589fd01f3dc472a8e2c58e9aa452e81cdf60f9a, 5a446de871ba27a5c828fcc77a21add6033647c392a209513599817883ce8674a70c0579c34e7cb5c94ef3ef51f052e2 - -g_scalar = 9e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 7a51381b1772fc22ca98304759d16a8b665870899d73fb3bfb3339ee5b1cd14117a70200b441bfd0f943b61f038af8d1, 69177896bbe85f1969ae68d02e13af263f388dd5b8607a50b75759eb4663d9a45d1ad5200cc384a85231f7e02c6dd801 - -g_scalar = a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 282358aa2ff95cfe76ed6fe718bd01b79f67567fe0a7ad0b990e3425ca7b8369b69e308bf8ae956575cba9d530a3ada1, 54d845b93d962c14b89f3ae81dcd916454f8664c26330782969bb272b6a7b8f989d1533fccd67c8128d2ea41410f8841 - -g_scalar = a20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 6d7604cffe8d69d781c5409e908e92f8e7dd1034ac8f1eb78fee1bd6e78c1828a32243ccb026239500cce541ad148e09, 904505603fc9a558c5f565033265f4f50922057669559f2d83dc4cd6bb887bd193403956a36123ec210830de2eb271bc - -g_scalar = a40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 30369ea0ee12356a6aed101a5295e728e964dc9c9aabc3fc885253779336b2b939b1a9c697b17ee608ba5b61fde4ca03, aca079354468e4199e528623e854d7cfd16c7a85a1a5e5043b2f7aab5590750c3a769ef0df9f47c0e081e022c8e80e5e - -g_scalar = a60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 6f261a720ebf3f5d30519b089ab91b5eea5b069985bbf511bd196739a548a22078cf85c78720ea377868bbc67f777fd8, f6f0e6c179d0e8c66d82e4b6a56ba80bdc94cf7759426145238dd0a4ee913d94d5c64a5e614695e2776b7343033e612e - -g_scalar = a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 33a95de702001e8cafbf32372a69ad0d093c3dc2769de89117779f5e7bbc58fef517c925b79aa0ebee521c0af93098bf, f259795816fa1b16e5cd9c39cab3387104f0bb334fca052ff1c069251604a646b379a3f425bc7d9a3b30afc73410a2b0 - -g_scalar = aa0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 35edc49ca54239bd0adc36938b9046147f82050a305601877ee84419f5dfa296664ca68b46f5d9044033ece91c1f582e, ee2fe77309f54b6071c9dd5cb2a538e9b04cb2d370c923cfb180f8055004fd5934513baccad673e88e0ca3ac10854021 - -g_scalar = ac0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = a1cae78c7b491c4d752d98f6018d7c6455d40c1b2eb7f0fd55f7680599440d4bb16ca18bd8e94e49291d65c801189d9a, 7f87b4412a9a02720deaa373e92656f4583b336aa5683ef8b8f9498dfaa9451fbb48956a3ceecd27898fc8c78f66b8d3 - -g_scalar = ae0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 3c9e1bb5534739e879ab7a5bc5b76b4fbe21ff8d02a855fc4fd1fd2cde268c8c809a6b6cc5a362e31ee1b6033b28bcbd, 9f8101706c09daffbc05ccc588e874af045f5abf2690cf6c3ac1c2d3f29402a2c2a2b45d85a211d06ba4d9a7a58bbd09 - -g_scalar = b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = f1d5b458dc7dd67fd6f1b8df647cad2f805b4048e097047f15b28ac7b871c3f3ee702764a35d24ea8b2fc4e96484fd40, 5f6ec65d882935e193ad20e74cbebf1a283ed89d28f284f4af14751e95148b55f6185ebe21274faf324c529c25148803 - -g_scalar = b20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = fce39cd1e1a9d1708bc1da4093b5b983b727f6a0f7728c1ae7f34f712b796613950ef6a86c660602cc862ba801631411, bf09816bd0a0afef4270cd9a7eec7bbb142fefb1e4319697c10e9f0a2c74217759ba530e18d34abbf19e723e9493357a - -g_scalar = b40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = f08cbfe771c4d06186628102bdf579e6675f12cca4fa74a94ebfbda7cf3dab12907e4f38199c51764b0c7d0c69c284cb, 83c09192eb103fe01c071597924baeb18d978a8110d1e8817cad28c370c0b7bfb6d0d48b4c7279159dde390e03bc1cb9 - -g_scalar = b60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 0e1f061a92f572f08000fb5849e023a3884a0bfdef058b6faa278acb01a177dc1c919775c21b9dde3169bc090cc65977, 189092064329b28b4e5917c682138a439f26e75ef93913dc44f8c04af09a402421e6a59d820d7e6d2cc96f2fdbe0247f - -g_scalar = b80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = e4c35c2244ab2fcc5bd45adcdc6938b91588c4712a3f012d38a1ec5ce16b874de239b1d404b6fc45494dbd2665925506, 56eb022838caa90104616318263ea256caf679765bb0fddf3a0e55c7982a492892a9c3b2144fd3ee87cbd9ff887108a2 - -g_scalar = ba0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 2d2542568fd9f423f6d41b65310fafd4a5591868498f151f764ab40ace8713c9023872c88f2d14ff40fd181041ad343d, aa4016646be126ec39dbfed5502f7fcf94945e512d32ca7a20bda998e6d6f6e5538bb2f6e19b255d35a163172fa4ee80 - -g_scalar = bc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = fd96bd168940c7665927968beb0f6ca5717c302a766b69dad2d9da967e155bd5323bd638835a4edf2f7de141a48da000, d35a825190e43169a836a6ad53b7e6e988f31e162314c0ce7e639523a3d57aa84ba9cd8bd870954ff89f7539a334fd71 - -g_scalar = be0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = eb7c7b187673dfc835238e9ac5d8b3ccc2493d3db86726814381646777c6b7eab211af35bed7aea0a101c2f02838469f, 8a072506b9ede54cf5d581b34cfff8097502808145cd4df20fa690f0143b29885304cd1869ee2b769a08446474ea8788 - -g_scalar = c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 024cdcfd74a513932dcc51180f94f4d767ef024eb3dbe034f4ac2b677dec20d2f9fa4483d8b4d6bcb3984b176c0f3509, 053113221defbe00a0c0fe6040411c15eccb0521817bc8d1b00ce5567062cb0bffc18f81d3a7414ff1c0fead20e7abcb - -g_scalar = c20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 217e60f334f621e52a4d3ec6d979444c99758103696866db3ee3d96da9de154c65382a2312055ff2a6730cb7311cc98a, 2acf783576e3dd6ef3d9c0864cd087f3366b49a4ac4b2b6c5e9c62063177abd6d7856a5d5d3a2fbfe62886616bc56f0c - -g_scalar = c40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = ab3ae700d1a378c565bd03584590bf03605e7a32d2e2bcf1d69b7c83177305ff6f206002d878a97a74faca8a6af7e742, 7708617f1989244e1e704c3bd7924df112c6d168e67756b182a18f03492b01d483625ae0a7c451c6037e79028a929b0d - -g_scalar = c60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = ed111a7a3bd0c935557d173489ac563e8476e71696aae3352dbb2f572373797325d250419c736f9a583dccc1918722ca, 58d3857219e15bd18b377061a65f4b1c2dc9e0349fb5102e473a13397c60ed02ea17b3b814dd3ec3a47ccef10b0615f1 - -g_scalar = c80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = d363e435d58d42d2d9f3982e3ec5f7ff162cf27f36ba3ceb1ceee947c3f392126a55edf1c354f4334c98c61d097bde48, 0a4f9c10525dbccf89d23e8b6de529945010582e923c1acd61d94ed8d7c27fe7d916df56ebfbf51c2ee90d7bad36681d - -g_scalar = ca0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = bc61bbaba368819180d7ec75226d534da72e9ae08144a60f51e4475e9f97151bc404defedbaf8b42178b590f1c477d9d, 730cd43523c6c257e43c1ebdaefc387258eaff8bc9a218f7f088ec4816bdea361c74b961c5a091ddd01aa30fea2aea81 - -g_scalar = cc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 218e7fb1b71a25a46888444f98a9add79be8a33f67d61b2ed78ecebfec57d967a4af7a2d749862107778fad7e65573e2, 68fefc83f624665a29c25cc3fe3bdeee3a37965f71fe847b23692f85fc6837ca2f8610ad11a52cd9f75a6b795f46323b - -g_scalar = ce0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = bba8c7b11cc64bb5a6581582454dc4f3d92b8ac4d708451051375d6af7acf0bcdad4e4b8dd0ee7526c79a60950a78a78, 9497fb38430bdab3d55200ec8918e0d0587a6ce79d8b271c6459e58b6aad83062af531adaa50ba8b6b8c42c89a52527b - -g_scalar = d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = ced5e4cf2b4313900490c970f5aa2fc4547bd050b48bdd872e0bf749e05b18e763ad235fec1ceb74e222eba4a4dcefe9, 925a8e7c11b85640d8ee724f8d890a9855f7905e50510da6a4ada2305037fce844b72442083b57d407d8270451d2898e - -g_scalar = d20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 5526e694909f969fbc6d93d12b1ecf5da54322ea0b5c08c1d151433074d7b4608b7e7552cfc6aa6e17f7e937cdf7bd50, e8d38ff491dff6592d1f6672746949222745021fbc62869644b0df3d2132566a477480ecaec1966d7195a9a4726c431a - -g_scalar = d40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = f79e2d39b2e8fac1bf3cd96c034d021b15245ac616c11ef494035a1f0c82ab81c749a6a77709a52b8357d8bb460e77b2, 6cfe44c63f488c2e89d0c4c5da7830b316f34bdd553a8e68b2584aabdda9acf2341f9b53b3143bf7387015194b6cf1bd - -g_scalar = d60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 7bd84d4848a7403bb88ee110d4c2aca40e7ca13cdcc93ab719e453d26360d0b1160eeaa784e7e36db3ca02e33c34e954, 77eafee6b4388e98009e51eb2912e1776d2a36102ea95493d118e90b7413e79a631998ddb8d0fdfc2e8d3d031ca838f8 - -g_scalar = d80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 058ff1904c89c9a87b6e3e4d1f54ef38a901f2551406ec90b28f476b59a7eb995ea6a57c699397bfee536a26d4bcaa59, b33ea619b01958523e1957812ce0f9693ebe84466964b9ae6181fa1675362f5dfe98793145e142685690fa10fca546cc - -g_scalar = da0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = b5f1a6c4605f84ccade63185d292887e6000e8b97de5f75dacdf3c75960857e5a56359b898797f27f6666dbd1e720925, c44f3da9c30ac7611159b5ed472b66acfe60d8144ec4fa790f0977b76c70738cc26cfc824b2f4be14c77f69461c7e0e4 - -g_scalar = dc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 13db3201919c187099c2ff0b948ac53b031fc087255e8c5eab4bb08268cc66781f72c1f8911316f6eef402410ec537ac, 2221798b9f4337d5e08e4213817ea56033a9fe40bd21effe748d2e93d97167e2bdffa226ff7a44cbdec81fd312057a3c - -g_scalar = de0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = cfc013b68f5c17418ca6fcc4789fbee8efe3a068daa3ed3a85ce557932132eca1c048aa58f30fb6a7912ca4e168fecd6, 68c1cbe20070491721f97889d9a0fb29499a28ed6765f23262c2ddb7115a89d837d96dd573be5978d1986f75e6ce6f9b - -g_scalar = e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = f58b321ed1f9bce830bf1ee34f114abc72483dc5b3e1d84f0eed233cc25c696a5e9abf67d640c2a1da828fe556467257, f0d0ced355035432d8afda341fa2f06decf5649dfeef88629da43ceb72a982dddc2f105e1e453229cb26564c97524f33 - -g_scalar = e20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = aaf3726a32ec147e505f5eb8a58e699214f3ee55fc5144da5629e0626bc5035c0a3de8f6666dcfb1695089a73532e60d, 1732ab634996103eea5a145d3af12f79b86e5b4bc6884f242e81ff821a1d8e28f49ce51b7ea1eec7496fef2e71eb7799 - -g_scalar = e40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 7f517c9c01f3f401b21e275d8b991b2903c6831675f0f13991217a6be34fe2e0e4d168e75b0b727bec22bb32205a5301, 8f1fd1bd5716ed9b08647a158d2ab0ba242cb06bbfd24bacb88be15c7cc1367dc5470808504514b1bbe95d19e55e49fa - -g_scalar = e60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 8aed67b865bac360c6dce3bb1fd8ee17442ae6052b0dbd5d807d8c25d5126552b050787598a85112aad13b2f80f89c8f, 5762947321262e1fdcfdd945855bd37a8b89bba354066b5b6859bc5ad6787215a698c82256f8a4889641c91279038efe - -g_scalar = e80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 1690687e164c44ba8b5101310dd4e1d4b120589021649255e7d94f4697b97d7c243622f9e8a47507e787054518ba5236, 9d3eaa58c5b0f8e74d2cda1c81cca7deccaddeaf391ad03d2aa11707c463a975fffffee70a684c3d65bb4d8cf100fef5 - -g_scalar = ea0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 152fe43844ecf2464c549c0e5375bafd29a9b8a5787c26f8979564774ff41b268a370b2f4897efbcaf2c49c193eeaaeb, 90ef55d72e7302ed5e5b65408484a45a931392d01e03117874a6973313129d1a10a3f1f5b62aa404b45da2103332ff90 - -g_scalar = ec0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = d4b25ed3883ebf03e1ee7508c3ff73564f4576a12c9c77446bdf53fc46c1f31b3024ce311a7194613d92ecc18f8802df, c7edb5db6c742e1b6960312ff19fa66aeb82b33740ed314336e175265e9693f5376ebbfa11ecefa91dc46052420c3ac9 - -g_scalar = ee0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 1a0ab3fe3e1aa3b2da05dfc0faf576dcb6743901254cca1a54fe2ed1821745a31e6d2cc15044f8e3aed505fefec299b5, 5c070feddbad43935b066cdebe027cd079d50a1f256ddbe05e3587f3fa6333404dca34fadee620c74dfdf356b6434dc7 - -g_scalar = f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = edcff8331d6dc79d7cfa71e1cf1cb8b3c11c95a22527c1ade6f0ad9bc0579c3e593f085a6dcf56bf5bfa10cd1ca459ed, 79d53dad0091bc903fb148b8d721d034ed555e37e2606ec054c38b71be3a107bbf620096144e11a0581c4bbe432521c9 - -g_scalar = f20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 91d26e18089b6194c58fed0143bfa89695f4f8a7c76e93579b34ffa032e7bad15a5e1b61f59698d9f12d87d33dad94a4, 8e5cfd1643f60ce9edc913822c32d8d857d63f10b73137d07b6bc3fafff00c4321b9d7a0a897a35ac218da26d62bdedf - -g_scalar = f40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 4a95f7f3ad4777a41ee7797f6590d0ecbc2c3b8d7a81382003d42e96afc190c3887071bbcac96dab4b98cb69c5c8a182, df206f19be8f2e7e1b00fb28a2171c8b759fee1c8b53025af9874bf6974c0a8e7f8c6751ad78dab67a36de4e2a8d2736 - -g_scalar = f60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 92fc21e8098c5b74dcce4b866dcc347a56485fc5055a1e76d2413d03360766ac3a0699eb49cb60f46fe114183c5d5268, c600f4375b6eb0c0b53e970c73c2308a8a45d99a9028c820b1cafe29b04194d9960ea3a5924cf515e18ee91f68707ae9 - -g_scalar = f80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 0b2d3d2ee01df4e90f17d421a6542ac0bbf2d5477007f2e9840210ee61ff9d1e7734dc91f8fe7a42e6bbcf0bf8ed6302, 633a2ac888531d81eef1c6710b09ffe22dfa176cc44153bbdcfc96ae6e50d8368362f7b1431106b7520e4fbb84f3703f - -g_scalar = fa0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 051860f8db9d37b374ddf359c387adeacbea730d7b0b1b3dc9ef099a6d40b18658ec13e188173f1b430f3082d997bb97, 0879ac02fd3f45cb6abb20c30a400fcb8be482395c7d44222798b7f0a1acb1c52dd2fd248977979ad65443bd231491a9 - -g_scalar = fc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 977b4bce597694b4780ec65de871b7928025224f7ad39d9aa441e5035bcf0e19dc504f01d3ce296729262b6d7636a78d, 37e9158235c16a0f6f7f2fc47d31bf61f5da63e0f8f90368b669c1d60c34153a1cff87ac9748b10ee05eaeb87fe3ef11 - -g_scalar = fe0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 75c5b10bcac05c018d3e2eea122e7ff2b2f9d05f3cccc6b797a1f8404db70676b7b8f12986a52261b0428d6baa542b1f, 741623d5932bbc56910fe7424a0eaa765b464e18535a5866c6b4571c54a598e1c51a6f08e6edbbcfcd80f0d9b5def90a - -# g_scalar = n - 128 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc528f3 -r = a6661cc4c241720a0336aab8777a16d2f313389118eb5195c0dd449e7c1c39840f4fa5eff21af80ae484fd9f8258030f, dc62354d5d8853a4d9a811225a86e31c4fe0e1fbcb5fd594a27a5f1b5fdd385add7697999b9e1c7d987246905810532f - -# g_scalar = n - 127 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc528f4 -r = bbe34e740f395db4a92bb11bd6e0f09d96fde63874231e0feef28f34522c62792aacfa4c569604aff7753246eca101ec, 3816d59e1c6b7f960c297cd1c984d06b61d61cc652e7f4f1772dd5bb5b983ae5a9674240fe752a555591a623406bc306 - -# g_scalar = n - 126 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc528f5 -r = ee82cb5d4c686f3145940572b53625a29c14d45c4d73654245b97c7577b60ca7135cfd8fd9f0f5f0ee101c5ade346cdf, f84cc9fd3a1e1353420c5b2e50458073066298ab1fb507aa068cd344b0be463beada14c64035692c55eec94a4f3b89db - -# g_scalar = n - 125 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc528f6 -r = 03b2dab245cf48ae7ad6ebad036703ac9436a8cf3450356d50ea65aa46f614e270f25677719d6ada9612b8bc3cfb44bb, 76cc400a8d0ca334832a58b44ff6a7fdaae0be43de6e7855130ac9be1ee6547020c048ce12b0aa5bde6ac2d6bee8f9e1 - -# g_scalar = n - 124 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc528f7 -r = b4bb1133ad9267aa51cb20d25f083167238df4864cb95a00bdb4385fa6f8277692f3dbfda1435507f9e5ed57d99f5989, b6576363085ed416461662acc304f6746abb244d2b1491cefba31da3a16cdef2aa5b6ae337599a9840b2ec55b0eea403 - -# g_scalar = n - 123 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc528f8 -r = 8e4a4f6321dc82a6d4d6fd78550418d24b3d05ee4295440514a9c3ebea80907b46b07d4a2a1018fe151198480c4c0b80, 8b3b9d12e5867522fc4543133da330cc757954f0b670bb84a57d50c160cf08167c3945fa8f877360e41b28095e874626 - -# g_scalar = n - 122 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc528f9 -r = d109b62984083890da5fddab7e28aceae3da87e136a2812ddfffe0dd4cbeecde89a9a5422a1a0fad53b912fb21a3720b, ebbee398404882a8094722669ec58cc4fd488003ef88503893198baf14b2b31e0f1096c5d6c0669988bbf6a48d72c11e - -# g_scalar = n - 121 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc528fa -r = 79cd3f1e3891db8165df3c959329f7e0c29afbd47772778a6c33d5d6ba6744e48c9a16e3a896ab1e5198ba40189dfa8d, ee51125e39b2f6e9b8c2f20607d9a48163e2c65748e90de46aaf85ab51b276790abfb09316fd719d355570f5287bfe64 - -# g_scalar = n - 120 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc528fb -r = f392f9632f3b0feda03a6787986794dbcd411e349499fe4eaf07a03eb8994b40d3259f2810248af41b3ea621f3c6f15a, ac678a7865e25b379e40a6c0acd1f133c36985b9b3c8225b33419045c88737c67618c264ab283c770c8e99083f75edc8 - -# g_scalar = n - 119 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc528fc -r = d2fc5c57998b057713167fb8ec9cf4cda4630ba1875fab27cd55e7b421cf9dde59f9078dab73bcc4732595ac7329d8d1, 4e9ac9d775bf5a3265e44e536dde485c146135436ef6481a298859b7662370b84d24690cf930631489ec9f3fa00ae490 - -# g_scalar = n - 118 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc528fd -r = b8027be64a5eed689d19bd63befa48da4496f5a023133af12541da528e6a2448d1f2d42a406775a028f0ab7a080bfca5, 546c7955b5c108186699c66069c511df0caadb2f4bbafe3353ec47eb620c028bf87e6b6c22a321dcf7382a5e694f97b0 - -# g_scalar = n - 117 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc528fe -r = f26774cd7823568b517a6bae23acba53ad9e749a9aea738d613e5294fe8579619532b30ea229d070fdcce7a80723559a, 8faf654f7d4f688c85ab9a7d400ea7a4598d64724d867b7e92663fa0f95109fe3934c5b31473fa846bf8985f51aceeb2 - -# g_scalar = n - 116 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc528ff -r = a40dbba76a0c98442700a45b812fab5c2e56dde7119ced404060d22edb6e808b6d812dba7e29445309e7d232ccd1c14b, 3f52d8fea7e3993a82fb0a4636ef3bfd01f7b3c0d9657c7d7e64e9a13ed8e9a24b6aeb0e16771d06f5e3834263499cfc - -# g_scalar = n - 115 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52900 -r = 274c69657350982d84442a4123c50746a97accf432406bfd33e868f326a488269120f7b3a043456daa4e673b34498f56, 3f3a420930a5ee248afd61cd30ede0fc2065cbc509ced139ff23c6477b75a478c140e24d13851dbecef948056a236155 - -# g_scalar = n - 114 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52901 -r = f80f423bb48af0e8e53bd76b6e4b3bc543c2a97d5743877a559b40a286dcfd8831ec9ab137796cdcebbc6b4cac6a280f, f338e5cdf43b9b91b66b98c79dfb532f935f8addb23b5a1725af72187ac62ace0b58d896d4e3b0bac6f969582b773385 - -# g_scalar = n - 113 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52902 -r = 869fcd17ff86a9864a5bdb048d7fa0c2e9815b09139b7fc5e72215ef852bd27fd2c616d1bbe33572f85b86b79b0bda12, 5ef4c20daa086bb4c2f12e83ce4788a84080212603ce449896678dd5184edfd5463ff80d2999b2fbcd87ade96e250941 - -# g_scalar = n - 112 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52903 -r = b4a6714762f45dce83f2fd2cd8296a52fb25e37c9710b70b2b5609d5504c81290d20370a5d66455a2e20654839d6e2af, 07d446bbba12dfb2465e614a83e7debeb8c197883557b977c1811bc5d13895e7e958e332f493b39b57e746425ea39593 - -# g_scalar = n - 111 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52904 -r = a158aabcb9bdef14c3907b518b02667f27552012c727be036744720b50447fd908e0805000765fab8db3b74805be74b8, f6358897f7d8625639b4b847dcff260133071e06b514d97a5d00ab436c3cd9e5ef6a411a1cfa0469552205fd0b633a90 - -# g_scalar = n - 110 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52905 -r = 26956a5b83e5bd0bfa63d67feafb4dc8bdc1c92475053732ce481ae68d2624c8a4ba394e85d138d693f846d4906ef776, 3a600687ef91f740488a5078961bbddf9e28d8d18a3fa9b5406386e38916beadabd914f900eb7ef4053d8f0e8f351c5a - -# g_scalar = n - 109 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52906 -r = 6e3c27bbf13f24033cd18c33b9cff887a911a58af0d93abb5841c5f8a8dcbdc89c7d35833cc1184b0efc2e27b2deb1fa, 0b3b93a9e67388fa781e65b180838a978a52cc350a5ebee2d24a804b0a9f250aca3226f3abd6b3faa4c6e8ee15acc519 - -# g_scalar = n - 108 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52907 -r = 2a532f0ac16a417882f24a114cb0b8671b23e3f7afef0b5d589f30567bb8dad3d81b74529a67044fa26631ef443c7161, 9d656f406511cfc08b664ce6e12f221cc3a74a19c3bffdb67b27e171992bac6e567a255c91b54316d892e8f1bfc7c314 - -# g_scalar = n - 107 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52908 -r = 77964d793f740b4850994c4960a91622ccd4f456753f40d027c6ec25a0075d4673c21e204f761490d718e8e1f4363f23, ae7d58e8d503120d1e26608738bc71c66a2952ba479a6b9cb77c8b2e5d80c05f7bb038641be6c2860b36aa1e09b812fd - -# g_scalar = n - 106 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52909 -r = b380f170bff65e1c2633179cfa6a8ac6442e0f1f36905deda01780587776c7fea1295b179d724fdf3d303c72138de192, 0e396ebe68e2e2a44a5ce29540ef369ff960b81ef512e7b4e1f467d4b9cd0f5af83cb47d7e4e82c85099312a2a6feaa2 - -# g_scalar = n - 105 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5290a -r = d0ab3e3a99ebd09c022c75441a806542862ef39c275075e3077f30e5dd2c23bec367d6aea6e201bce6e91985e5802845, 33c518d392768c5a31450ebaead0e6dc2c2a856ab8dfda9fc8d3dc5656e000725a30c9af5652ec94829810a0266fd747 - -# g_scalar = n - 104 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5290b -r = 7117756e39dcddad381f4f06f473127497d1e75fd9f408b53dd4f91683002cf1cfd364cca03bfa6367126ced901410ec, 12cf98f9c880fb304f9bcbcdb1d380890a0bf8ce1470123e0caec3c46361a0625c462290dcf3d0ac1df90ec569277518 - -# g_scalar = n - 103 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5290c -r = 590da88e64671048113a7902e3da530d1ad95a94f23d84fcd3f0d14329c21de1ddcbb10eafd402bdd24cabaa21355d5f, f3618ec88d8c2412291d2a59d21bfaad9fe42e3ca7052e3c681444b12790b201e5ad1b1719d191f40b5a7d7e6da40f25 - -# g_scalar = n - 102 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5290d -r = 180783fc39489b2827c614bfddbdd7a57befff1cb90a319f1c0f6241bb2863c829591fcce7274c8803802ee80fa4f860, 9f5b2dd5d9095a20b3937037c7e8aefa5b80425c412a1ada6172a1f445c5fdc4ab9b4514e4c8c458d576509b865161f9 - -# g_scalar = n - 101 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5290e -r = 7e2392bf7bc814db9cdd943547a18710d73b1fad8b8b5cfc73ddcd2c2eccfb1ab539f5fe50c66d708e66c6f69b8adeac, 8c78d2c9e8fd1e216f649a90bdf13efb58c1e2650ac17fabe010be7af529796b001223dde2983fb26ebe6c4093708b17 - -# g_scalar = n - 100 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5290f -r = d884d30b2f03f287419f4d2eab386382b0e595a155fac50e100134e2338c10e0f9d9c4dbaf282e57a350c4fc01834066, 12396f36fc1d034d75751338b50246d6ef016d9f8afcb08dd5b22cabcc25394a75eb8dbfb6dd6680b581a6ca09f8ae9c - -# g_scalar = n - 99 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52910 -r = 648c5f00bb28223ad49cae0982d9d6bdb9b2e6b479c8f8bd1b41177c708ba469bb4f9e0f41aa174e6e3835a9b05f84a1, fc1e9674cdd29c42e08b6c4e89e6f2672908a6272e5f15f7998aec708f7db81d01cf69217e5f5c72fb0b7a8aa2733b5a - -# g_scalar = n - 98 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52911 -r = 458ac76d0f40ec396e6880f15c434085ca861b4d97740fcab1bcd42525fc2c50f05e0ddedb37f6ddd2872262b0a9e00d, 588efb43001fde0cb63e8243d9d7df8c846959120049ed20ffc36e0aab1162a528fdfb218f772d25a02f6b017b751bed - -# g_scalar = n - 97 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52912 -r = 8c081acd170d807f87b1e51bac06961610241ed16fef9d9d8f273e3065278f98c1f0db004a49492c7cd2035d7f5c54e2, 7c3948713b0fcff9b3c1db6e3b0a969b34b81b1287765c61282db10bcf1fa22b1b14aaec2979a40bffafae16e38c4a67 - -# g_scalar = n - 96 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52913 -r = 8bf3dccc39c18b96cb4aa43c9741eb4226de4c6581998af2ee21597e52ce08f68fd61e31148840d4dc5293851d15bba7, 4da80493a5bbcb5b311f7bd0a2a97f47062e615f37cedab47abac690cfa11b0eaf81dbf9822783c6991e2a26278d67b1 - -# g_scalar = n - 95 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52914 -r = b8f42fe52fead1e4257b0bb5ad7f23e10be90befa27d2b794a607b9d0ef989779f74ca169bc0cbb10fc0f2630dbc3c91, 4492b45abd20d7919ac9b212aa546c0673f09b17c4384a6eba33c0eb22660603afa0181302869e8221871bcfa06c4a6d - -# g_scalar = n - 94 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52915 -r = ed9602dc7912de8d89dabf40cf9eed19f4db0ad3ad1bd1192e2bfb0c25998b5d4259f70ee435a0deb134a04174225251, 7bc3be41639313209fef39c6248c25eefc0b0623143223f782ea0dbc32343506879cd4b6bf767610a7a492e83e606dec - -# g_scalar = n - 93 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52916 -r = 813355b3430aa2d72df91689cfd151547a3545de7cfdb00e1c634764b16142cd1b1cc24f5380675eebd14d71e32d80af, 3f8e0c70994062f638e4c6ab6f5d971aa8d5bda48e98f234018357efc34f9966261cfc071fc54486e9231d377a0d3581 - -# g_scalar = n - 92 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52917 -r = 1031cbfcdef715d74efeec75e724f56cb8a88d32c7b6b5a626905570df79b6048f97bc3df1b9f55b91b6e58f1036e450, c1f7f4cae5df901da1bc3e946f0c72e2c2125f7d57596e065b2978e2b8d52dcd31169bb7d9356b23551529f1d234dcf9 - -# g_scalar = n - 91 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52918 -r = eb0f52348bf223b0e7e7382759dc3eb7b04b977d42d74f5fa4f6e534bbc2618a35c2421b14ae3f635dea409c9cba0858, b83538fc0ee9391df4f64c4265477b8734871f379c5d345ff62f4cce6dc9cbc12fed7ee4c021d39266e3ae99f038aea7 - -# g_scalar = n - 90 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52919 -r = 4347b760969bd7f7b560d7e63dc77e7bb34f09fbd045d31e28bd6aae6e6e8e57672649def3c36ba79b35cdf7a7871029, 6031b8801482c98e1001a0af8dd013512114cc6ed63b8db6ad0d3541ec292413dc3151d601531272d0e9e5f8a1ab691a - -# g_scalar = n - 89 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5291a -r = d0d105de164b7361d63dd29d19e0e2b667d3644ac8e55b7b463df30b0096721f18a49fdc4bf163e00c62094b2d71d4ac, fe3816c64720c80ce2d7dbcabf469d26eb88fef6f4b21b3f9a330faed255dac2879e48e3df6c30811a79a3b2fde8e771 - -# g_scalar = n - 88 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5291b -r = 9398236759e97922f158f85541bb965c782840d1edd794907774056232329baff0041e2423786267db52eb03d1db891d, 3be5902bcea7c2ade50d59ce11e7a67cbd7b9ae3c198db4bf80683e20745bcfc590ac7b2d0a332efb4bf33481c7b8873 - -# g_scalar = n - 87 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5291c -r = 1c1b3417a500bb22c4840320387b6b2ef30a928d9a3c3af1df0ec1ba8b80919559424730109677754f11a02e4aa0372e, 60fb90511669019742537e77f184b248ce6bbe8a18aa60f62120dbab067b576fe7db928a586f697e96f1193940cd990d - -# g_scalar = n - 86 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5291d -r = 94dc48fab7e8cfcde61e6c2984cb7e449e30229d0a06f838361494cc0b162b571234181c1dbb4629c7364268d94ab449, bc29e690721b7a85ebc3917cd36d209e5cd08f195f3c1e5a8566ef2afe3b86975b01a09f54df4c80f281bb0e764997f9 - -# g_scalar = n - 85 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5291e -r = c835025446e64d4db0a08fe1114e6f01d953aaff73256a577bbdcadd053153d82148bbb88207255a935d2cdf9b06762d, 93de726d366c0dec5dce7c601d76ae6a3c2baa2dd350ad0d8bdd58d5f4141ceac6d551fc8e04169618304528ff243ea8 - -# g_scalar = n - 84 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5291f -r = 00eb5c040d16b7fcb048b60e740c04a52686cba73934e93664a8bdc7c791db8094b80b8f691e858b3c712c3c6323cd05, c1a39004c52046be23675426bcbe02b6781c1cb2727eba5feb1a8d0de33161f1600347ae28364a4f7f3f276fb2237d89 - -# g_scalar = n - 83 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52920 -r = a075b16ac03d7805c25baa03520a8926eeb88ca1c7a4aab58487aa0d4a6694eb44cf847ed2f05eb48e61f0bf44e94071, 88c201259631e30648d5832fa9c3871bf55d9d45ddae432530de56a8b619fbd5b1c3ec8e9ff69bc13ca85b76ec268f3c - -# g_scalar = n - 82 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52921 -r = e6db24057f12bea3dfc6d038305bfc7c87e75dfbed69216bd6021049cbfbd0c2e8c09f59ec5cc866783cc5bb88f82a12, 9ff65a61432cf2d79614842d0111801a128c900058cb66b01bf2fb109f97aed67b05c629b44ff8449b961eba485c5d2d - -# g_scalar = n - 81 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52922 -r = 0984c2e37cdf344f11238a859f436faff2c3118feaf138afd8cb3560e07b1bfbde45473e86c087853cbdd3cbdb06f682, 6228489f68ba4781a21c729c51d8f958fefb85a11a22d872a9522d0fe70d9c816a65eb2a8c905dbf1ef7c3e93c7da7b0 - -# g_scalar = n - 80 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52923 -r = 1e8568cca446324620fe8c27a715ace6dd2ec6d351fea1dc49066428b121360923e5c6b90e42d1f9194924b4ad0a415d, acf544bdf9eb5906469f4a101132751bdbecf9c5ec87197043856fc39b7b9be1671680e226dc9c88ff3dec4503318195 - -# g_scalar = n - 79 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52924 -r = 23b245a5d53912dab3cc818a7069cb7c491c312dd15d01f0e58901a204ca55712cdac248c3b74585ca11d9d4e9a6c224, b468d707e2854daa6be399360cfd7e069e84cfe4f79cd14cbfcdbc161146a13d5fad14c0cd88aaadcf087c75594f4e9c - -# g_scalar = n - 78 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52925 -r = 02781ecd4db639eea1560f9775dae55bd35175d9a506191dd3338ff4b743bdfc47842147688c1ced3c80145ddb9f0b60, c186abde517042932b85fcf8b1c370d37bdc719b3b585b043b78f3624319ffcb939d400bd3ba155366c5cfd3dc231ac9 - -# g_scalar = n - 77 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52926 -r = 63d23607fa5c9816742e060b28a126270ca930b998ce78a327ccb6c0212a6125114a9b40334793a79f2134c12a501a3f, 2bb4ef8acfd302d1319e3c1aa8d6be5922fc6affcf36304deaff7af1b602c3c1cb3281d00cb2e2dc88b2345c13e06e23 - -# g_scalar = n - 76 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52927 -r = e677b97c61007b808b8d434e90bfa219a7253817daee85404552fc68956bce558c547a520c8d74e1fb2f775e4230e336, 1878e3cec6c847f09be8d23ce6fe11ddbe445e6ee45c22f9585965db1b07aa3f6914734b9fcd9c064015190e08e5438b - -# g_scalar = n - 75 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52928 -r = a1e0ae0fe6ca7a154a7ee23df367b5c85d4631b4392f8f665b28cf8991549a96c8cbc40a420ab7ef6b5d4014867303de, 02bd279dbe829a9d2878ffbd6a801bba9b1dc61c0fbfd1e2989d5496bcf5128d5ace3d3aaf0546fed59aa11fec605d83 - -# g_scalar = n - 74 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52929 -r = ca50bae743ca3e45a0dd8e3cc10c4f6c40d420cb5c36dc4c02ae1f9150f6a5cc7f3bc516e1b24b64126d4cde13dcbd9f, 53cf2923ca46546146228db7428f7a38a5581a9c35e612f0dba73610ec30dd42ca22922f8eda2e960f8b41171022d4bf - -# g_scalar = n - 73 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5292a -r = b89d83e72bf4673cb08db04de8caa7d29029a9252d3731c25b8d230bdf8b9b24a9c2a9b11de8963b43385c32d851a702, 909a50c483675e9df4ea8bfc78479c8cfb1de1fc6dd9a5a650603784b0e2de90607649281e1729e95702c6411e0dbbdb - -# g_scalar = n - 72 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5292b -r = 0966d45a6517888e2ac250f6058daca83b7debe494eaf32810757e2e3f599369f4445a249b234eff668240536434688c, ced3e2d0c97db2c54fef5323f68505de87ab07433c0f52c5384bc9e6546988b866326235288bc8f68aaa33871896c4e1 - -# g_scalar = n - 71 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5292c -r = 0b4faa5a537ecd702b123738fe255dda27bbde143508ac5493ba15cfe58d0a92bf5731b3abb11441c42ece45effefcb1, 065815d78cd52fe34246db11f8ec6a99debb250e319bc8c5eab0d7afda4c1ce57986c3b1f7feadc295bb2f7c22137c39 - -# g_scalar = n - 70 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5292d -r = 2bd44119aa9079b7d8436f83a2ce4101a4c793741489a3c09c2e8aec0cdf6d91edfdd44e94cf7a32bcef0b6a37548a32, bbc20af538b960b5a3a666e82c5892143bf889a8303249483375299a738da5821d5d4f65989e1ac760fbea436400d5cb - -# g_scalar = n - 69 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5292e -r = 59d65d78a3f735f42c86ee164fdd3ccad4bcc8b125abfd65cc66c8aa0f19981b5ccb2859a1115e28f8d3df74670c2752, 0432feffd8e2428590d361748ce985cdf53111b77d1299432ec51b76d42bdc5aa889629cba2c66b2fca521d883f3aa31 - -# g_scalar = n - 68 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5292f -r = f6a8130b3a7741e35508c2b38bdb088aee34bd1706035fdea4160def7fe6923a2fd77b5ae6018776af78aa17286ac2fb, 2b984f17d03b99c1263a29e0f60970b3d64fb6a881f035febd88176d8fcf3364a656197694e18dc03fd1299e8683382b - -# g_scalar = n - 67 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52930 -r = e462ca48e153035af9af3e4d90909d25556e637e6ef3d8f765d75edaa55d6185eac7dd3b0b634f686efc5cbc8b1772ca, 7cdd34755386b66bf695940fec9d3a06a66f48b939143ffce581ca12c0a61b42efb54e58bd87a2f9ad89c485f5ef612e - -# g_scalar = n - 66 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52931 -r = 3418c841ef19aa6cab34164b3870beb7acd0361f5decad089983c10a492b899ae22c691d99c0b909b60fb64e52990b5c, 4d78416af80aa2fb6d4b7f1128f293c5902cce5c4f2a515ab12c02e6d597baf65a7f2fbe3d3776f8930dfc5adf64cc92 - -# g_scalar = n - 65 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52932 -r = b84c3a6a5fd4266f8b0350b2650b22534597ec8abdd5f002cf9edc15edb63c80becda43b0d1d279f8e469454839b9679, 1590dad75aa44e365d7993db37060f78e689c292776299225487b4d321d43d98495b787bc5266a2cf1e927c3cf038606 - -# g_scalar = n - 64 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52933 -r = 4f5d5ab6d1b30e5cfc8e87cf3be44d56a309199dca57b7bde04b3d30f8a0580d957c980f297a9a37ed4de4f88e89b258, 77748f746bfb35aec11ed876a132c01792683543cfe01da601ae4440ef6f0120f02e3ad10f6e43fe4dec3960cf56cda4 - -# g_scalar = n - 63 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52934 -r = 1c9bf0b0f1e52d1ef6159e519a049f7acd7e35f76e2b71aa7a50f7458c949f8f6ce8ead6149a1896c5c0e6d7aaed89c0, ad44c8ed5f5976170a508471c8ca20dd237642b6682bfb72c44fcb17772e80e572c5a09ce13284e5c4493e0be7dfd37f - -# g_scalar = n - 62 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52935 -r = cb4c0a54561fedf2d194b7054b14d11703b9f1cebfec21da0c7d749907dbb9af1e659730c1fb476e49a04dc0f5acf772, f6fd33dceb6bb947353cdb137d3b0558c2daf76dd456dc649a9f61a62600f544a0a164df29cf3eba509dc2c1de25b2bd - -# g_scalar = n - 61 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52936 -r = c93ea049ef6ba0062366467300fe51fd5ff77ff2332982d06035e34f772ae08054fb5a34222241e848da1fd3fc60a6e0, 3b33eebae03967d64f59388dfeb992dcf225e6001ad8a898195877ac8f2cfc13c6b2cd3195160b5399bf0ee982c7ed99 - -# g_scalar = n - 60 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52937 -r = 95bb80cece47968c61bba736a55b527784b7c2fed74cccd40402d5c4eb809f85a61fada6fb4f60e8c711d5d1c425543e, 722de40f4b15b0aed603c4d7b76d198944ba5ae06b757c8a5328f47952d5df020f1f0b07197d55d6f606d524e914846a - -# g_scalar = n - 59 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52938 -r = 9ba039679267b6463703435b0de64db996a917cf1ed0e31564473b595c322738dfca6897f929974caf467ce227bf64c9, 00cc90edafb9aa3e692645f4261c35e6904cb4cfd7b9c3315330d12284fa68fbbe4248bd4cca100f20f3d552c5add041 - -# g_scalar = n - 58 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52939 -r = 104cec0666ac72e09e9520bf57acc87aa58db4ea4f96af4fdab9dc0015b0fa13341cf9d9c46785af941c5c257d0be180, d4ae66a086b256fe3f7a6a1caab704151ee96616f605a75e4a0ea855a964a826474b535f057fc7f560c08456e6d6198a - -# g_scalar = n - 57 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5293a -r = 814d7fa07a78c189c052f3eb1c99ceef1e9dd1509bf446e0a14967dfac4bbf6273bae4c1694b8b0db14ba61cf97f865c, f57dc465b4d9209c2d1ecfaad6ad3e0370bd843b8c37e2a4f29f454817f65ec288773da65e8c849a5efe5b7d548b4fa2 - -# g_scalar = n - 56 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5293b -r = 7772a913e6436cc1e9981ea6820da79f2629ba4fd1deca258b6fc785e692fdd2d4215b4fc7a8baa1483350a5ebb8cdad, ce009b71f07747d2a901000cd90cb631fa7d9e6db6f44a8d49dc5e5114733de2d7e8619237ad09b42ebedca4aac04be2 - -# g_scalar = n - 55 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5293c -r = b3fcd5d1690cd408fa5cbfda60f4554f6078d8bf085faeb3a4fb7867e3a142d6fd6622bc1718ec3cbcab5f60069f3367, 8b9fda8ceb31112b956e18c6682f05f9e8394a3441dccb07721cef83c2f8609d7d50dc54e7f59c58b1421183d7e0877b - -# g_scalar = n - 54 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5293d -r = 4576a6497cb8944248c075daaadd6150075134ebabd64a6acff00bd23c9b5a41ab2f15202175fbf411853add834e6c54, bdf1498c6f95d6b69161794484e14885e51e22682ecbbb44f40786296c4bb1587244a8e288032e0bcbf58990cb52125c - -# g_scalar = n - 53 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5293e -r = a8ba8f10e0f383ea642ec4e615c3aae2cf485c74a7c54b160b0110610f0422a2daed7c268a0915cc3b1bddc6fbde49ef, 120d1c1481336b7a5236c265b7e89a1d2d38e52ec6f9669ca8795e65b1d057c014139bbcf7610574d5dfab4c6a9e7afe - -# g_scalar = n - 52 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5293f -r = 4b820d9b31d83660252b48f5cd8d7d770bedaa85e5377c005687d1dca6ccfd358a944b316b3262328f6468656f9201b9, 3a33cc62345e02b4dddb9a7991a121896f1d51528087550792f5e99312c3c484f576cf02edf74605561a50c4351f80ea - -# g_scalar = n - 51 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52940 -r = 16634a504f35cb3c3dba16e9daaabc27464ae8d241a84de7a5e0fb598c5a78d91947c0caec4a22b82c4ccac72070ac8d, ae74fb823455f268396b761dc8c0e5f2f4ddbfffc37782c925153f3ca8fabc0ecdb2f9808ca622ca523e74074e9137b0 - -# g_scalar = n - 50 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52941 -r = a820e8303a5d50d19cbf755b46f97ac7beabb91ac3c90051510bd675cb2ec3f1172cfe4ecb5af900a96763d2fba32d1f, 90a705748e7e3d5e90840581ec5b08293e4bbbec6ccc1bfa9edb9bd0f0cd4ead208238f9cfb7b9e57c560e82cf73baba - -# g_scalar = n - 49 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52942 -r = 0b470bb250e4ea9e1197832bcea03f5647c56c115b6e3386a669156542e365a48ea5af63a5ea6fb8fa5c3aef697136c6, d2e33ae71d74d42488e19bbea4a841d0db78122a807d422c03bb7911b63614167293e8b02db682b7ceec38bdec4da8ed - -# g_scalar = n - 48 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52943 -r = 66e4794bae7d740062e5c5d3e73a1bc940d01ff53a7d2f3c4f504e06ea52bef92d368d48e7f30c2b3ccf806ab35bf6cf, d8e1bd5ed9db5a7cb7154ff14a36b9d3d9fa35ff625d5d35a3c35ef2fb454679ba7f9f615899220ec2cf9da2a0010ced - -# g_scalar = n - 47 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52944 -r = ea5b37c5da233371504f21b1570cf950780abff7d878acd0bfb185125f5b07a065c788785f0dc66c6f888f7df0c668ca, 536201382058d574110ff96ed1df03dc20115e5d9a1f036e079a9d576704caff638fe8a6db630648b7851743ddbc812e - -# g_scalar = n - 46 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52945 -r = 374aa9069481ed0dd9c79db8005412579266634957719f5460976b01b472d7899f24fba649ddd10ea618d7479fc4f435, 03ac614c1da6382437d2a66713f6f2f9e6547fdceb14b546285e675be7a57b625ea6f3ce130a79bc9f104eec8023d285 - -# g_scalar = n - 45 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52946 -r = 9c94c858b2ac340599e1c0c61f2bb599b0040c0e8d6fcf13ffe8e0bb39eb8f59d4af65c673ad9112d4c411564fddda5b, bd14d686247c5b7ae8b888dd42d50e61e906998948dcb16c14c4bb561a4a96e69d4d0abbae0335c070778729911127a2 - -# g_scalar = n - 44 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52947 -r = 9c7e7754a320d35204ce2a21986c5ce6d50a288981ea36c2767b4ad7f8f99b51ae97af8bf240b30a1c5f0e5b36a400d3, a04d71cdd5e228c45219f692fd1abc51b8987504d822571a397fe89afa3852928337d5b10e96704d3ccc9ccf44527cb9 - -# g_scalar = n - 43 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52948 -r = 35178bad22dab3935cf095a901fefb567314f5f0416dbd86dad9f5b239c4943d09112fc50578bc8c37fa935500846d44, 70c0e09c369cd487568b4f6bea3406b755071f0942f9d72043187556121ceb43e4811bd18b61ab67308603e5c9450e58 - -# g_scalar = n - 42 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52949 -r = 7438b4933c1e593ce983e169ffff96c73fd72a308f234c864b21c4f3eb6c7e6231b22efc5df46c6618ef56cd5d76b881, 2497d63d0ffd4491affd6a97b8d58e8a18c6049e1559889cda2f355125e1520af26a645586926ed679c5dc5d5aac171c - -# g_scalar = n - 41 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5294a -r = 8764cd2cda92245de3bc778895fd71ae89746c8d852ca03573a82933a80d68f341dfd24d456a201ead148e87bca6d14c, 7d158fd114e70e3a9866ad382e6cd8d14236293cb060a765a879f31ede9b90cda5389d1ef0c362915d01d3b97d14dc1d - -# g_scalar = n - 40 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5294b -r = 51c4b1b36a4d6e813b021cf316d7a9adae78bc3a3134216c86fcfe4760be3ebc43a53ff21beb359e6048c6949399c38a, 2026d49256eb44fe244dd362214b91939c5ff5f59f1f55d567007808c8f148bae207337a59615c5cab4632734a6c27e9 - -# g_scalar = n - 39 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5294c -r = 587df4d6b89b1fc2c9985040b76c066536a1cd6dde9b62306d7edf642b7f006fd984244a8e3d2c467d894f80506e0e42, d2843ed7f8b69704e56acaa0e329fcbf49b91bacbc92601dcba3aac54aceac4684d4f54b17d6b8b8b3f9c7b9958e5185 - -# g_scalar = n - 38 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5294d -r = 47ba96091da7b1476b464412bc9a48c7479ecf018173fb32f3d752f5ad6cbeac018843c01c0d77024703cd85891f8ffe, e0b9996badf9e70ded641ceb68bcdf5b0cff1e39b7cb8065251db867bb6a946b783e7c3b1e5f1f936e50d916543ecb77 - -# g_scalar = n - 37 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5294e -r = 1eba28f3defc58b59261ede87ef27114acb60a7597482b86a129e2dff5b54a5d4027704bb5630ef20202d57de44f61a3, 05f1f848017a407ad7b0344a9c735cc84af9b6576bfb82e0d156edbca2d35fcad0e9bc29eba6b411936e3f37741aa761 - -# g_scalar = n - 36 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5294f -r = 1608643883061d376f01faee26946e789f82b7fbab52606ca39180d45c2c7ce14a13260770b1b757f216aa2531238ed0, 096677847f9f7a4820cc112848cbfe4e95cda713cc0aa98aefdf6be73e9802dee2ee43a0291d7ec7a68120c9f04f8843 - -# g_scalar = n - 35 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52950 -r = d6149f75e9417bc6832bd8e34fc7852365f16273a02583fd4a508620dde6bd0abb3800d52d7c2fb458a5b5433720ec9b, 4ec57527cf1dc0d953757880ad332ca3dd0e6054d70ca111affe7667677f6d5cf31e7f765aa1f6a9014fd917c2114ad5 - -# g_scalar = n - 34 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52951 -r = cdb55e6ba07b7cae7ec2bc1cd50b3e6d9d6ac102b4e2520145700722abb9102f0648c2cd2d668c4180b309dd2ada5bf4, 569b110402522db1fc3faf5f9eadf8d9fd2ff30475894d2961ebe75baabaa83bb8f22396075a80b7143425f97925c6bc - -# g_scalar = n - 33 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52952 -r = cc9e97a46c833e9d68af622641d5c400da631fc160f09efbbbc7c7ee955ef3afdf330d9d5b943c8661333a382fb3ba63, 5802d49e6fa8252890336c5e473cef8d75be91464490f545f7b98315b746f46dec409eda3df61aa18028c172c59da189 - -# g_scalar = n - 32 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52953 -r = 5dd2a4a0626b3d793a9865baa631cfb0ba8953d612e8dc871896b9fcc651b1dd0d784cf208f779d5ad852b878c0a64a4, 3aef526c554356608c4bd8da4ca4b00fb434f90ff5dc884988cea0616bb702f65c8d203c0d5ad402eeb7438e9783df44 - -# g_scalar = n - 31 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52954 -r = 6c07c4040a3305d11afb51a3e3ba8285d42f7dc953c149652ecf8340f0df4fe6b6e7ecdd9e821ee6a39c89317c8906a4, b8a5c18a9c675e62a4c2f292c941133b2822b9b0fba585e3bfd56454bd14df2143f59663c8b3b4f72547cd78ed803e25 - -# g_scalar = n - 30 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52955 -r = 92cea8f4c4360dd87002990485ba414315f9abe1feb6b100519b9fd50a18323276aad8b8131263886a7a3464d0cbcea0, 6bed6d1aff07734d0a96bb95d8aaa96d693de4d6095e980dcee822fb2b85be22e7b9110222c14ea92393a2e33ed8b75e - -# g_scalar = n - 29 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52956 -r = c8b00ae8187cea1f2065b7cba7df26e43dc22d490e3feb0fce3c15ed55c9764725846b66780443d6019d6ac5d3021470, e2d5e3fea6880e93090a818e6f37dfcc71924ef4bfbafa0454e872d93317ae4bd6c3e9b5df37c21de5ad7b6079a2212c - -# g_scalar = n - 28 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52957 -r = 55be5764d37da1a2d8232f8b4e492aa88fb0c597a4da3e15550e0bee8ff22c6f4169b4117b3c1220c76afaa373b64643, fa3235c018677e8986dc880407147ce63b71190c4fcc3eede7b42b8cc52967c46008963a78a011f00e43764ad7188061 - -# g_scalar = n - 27 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52958 -r = e8ca780e373e5aec2f7e8d509c6a58fe7228e2d5d18f14d08e0d4168482396f9cf1912934d78291da04482d2467d66e4, e87df5f43aecb12898198e6a2bb2c32082d9abf9c737a57a28865201ce25e414a7592809961d070bbd552e2ae4971607 - -# g_scalar = n - 26 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52959 -r = 37a45bdb091cbb80f14b309f03fa90f2808497b7b0bba4a76efedb8023bf0b90b0391b37897b93f56423197d2afd473d, b82675620f6ddbe340d3f79d9683f702a2aed20662bd58d8da3846eb90a0db3724c0bdd16a1e92911225b51c7570a234 - -# g_scalar = n - 25 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5295a -r = c29c6e2ca5bb73313809ab50de2480249bd51b99208abe1e57d0f3d2e2be174abb280dfa3cb3fb361e93722758ce3b83, e01904bd1687f62325c1e5c2b3143691295d0ae21571bcbbfe9d70fa6bdb5c327c3343b06ff61c6e66bb02d29eedb0fa - -# g_scalar = n - 24 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5295b -r = 4f13f901fc55723f38076e8fca77d74f563361909bd5c2f7540c045a409c930b20c1b8e0d809afcd259f272cfab816a7, eaf7f719da5cfd36ec6a5786995b16fb17d88bc65f0652c520aa8605b4157d216727d52d25db813776f6cd2942c2ef3c - -# g_scalar = n - 23 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5295c -r = 80826a69eea8f22461e4ca2b905432f01c75b8ab2a351783b9d3dd25429c0a18990ed20b569b8ef6d1b4e74d12e3683b, 620334f21ddedaa6d7d2dbc8a998e73e0fec76af150dd38185275ecd5ad83140f4335c0e59a1b7ec803cc59513ad5452 - -# g_scalar = n - 22 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5295d -r = e082882d69059095fd7a8b13f0681fcac382472ebe0e1fdbccd57831927ed783981b788d16f325b84f595351262bb775, 98e2963670327be7af037b8dea7f6322389b1207bf2f030884e54b763407c8470629d02536a89396b2e3cfb70558e023 - -# g_scalar = n - 21 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5295e -r = ab16c626dac012b51b1a0f6c5df0e5372e59ab62bd9ebe6930128aa06177f75d88e0d496dd2f9e2108265e510422ce2f, de7db0beecac3345d9952ea55315a7e84babeee17ad832a6d9d144b675eb6f66558bf560c70e84157febdeb5ff73a218 - -# g_scalar = n - 20 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5295f -r = 1d1cdf7b5f22346598ca8dd42d96c936f78cff0cd467f03a713466708cbaffc7cd96f20591e71d16ad610a2d94a70ec1, 546227efad1404fea1fe48d4b8e74438bdd259bc0019ecd466cc04da2332b20bda0ab953cde7d7001d85e76c9f2b249f - -# g_scalar = n - 19 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52960 -r = fa0f1f450390d706b3b6639c539802ae23891298fc38538eca109c3b154aad5e22c4cc5f41a8c91282a2ed4abaa84c08, 5e2b84dc16a8889bea2e23887d9b498dc0a586644980cf3c6e8f4c87900d09bb5738d2c23c25d153b94871a34f23de2f - -# g_scalar = n - 18 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52961 -r = 57505d8d6749703068a232435567169355a96a6879909f083bd1c8f62edb0dbd198fd3f0f38f66625dfee73ce5b82700, 6e8ff4db814e419c642295f6d6ba58a8900303835b3026443d99147bbeed67a6ab47984708755821759f8e818a39baec - -# g_scalar = n - 17 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52962 -r = 524f166ee475ce709f6928555330455e7be3737d524ffefce6fc3f2af655a10d3ea4ea4c8ff1f43e8903e1304b4a3cd0, 53c86790aa4e9b36da14a20e4c3d98850782927ab5abafb5b631966ccc940e7bb1dc48ff2a463f25c033963393ed0faa - -# g_scalar = n - 16 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52963 -r = a10896aa435abaa137065f5313bdc3fa317b63ea2887d5ff37cf65517917652a992afb5b0ecdd2d8da6e8a7f7c33ed91, 9a624b7e7e10daecae3cfa3958d2e6984ccc420437711eb76eb78e23eab2beef14f82214dcf30ff264de9ea1105435d9 - -# g_scalar = n - 15 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52964 -r = fb62d26f4903026b0fc01fd4eb08599359500917789b307583ccf19550e07b342b7210e2ec3dabd8446ad8884709f4a9, a59739012f43d8e978cc03bebff3a8682223d79927670b8fb4dc2c5f21f99ef29e9f6341ebb42a79dcf6336390167644 - -# g_scalar = n - 14 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52965 -r = 46d227c432f6b1ba8058994c5710c0c944ce05ff88957166ca6b1af8b1f85c2ad02225fb01ec909f5865e5018f75244c, bbd67c622104520a9b82db24ec96f58b8dbbacba263c496ee1337a7a1ee2443fabf4747c8cf5662e41b4b570fc34971a - -# g_scalar = n - 13 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52966 -r = b51c56e18cf23c94d2657265ed22df97db5203a8d9c1bd568a7a8e4633b7d4aeb25e28c5f6749a959b7aeb7e75ccbdfb, b9e852483396861e7e0242e3c4b6f13c480153d2013c729f8765d5b730b2f01b271770e478351f3d0b2c6ba793c27ed2 - -# g_scalar = n - 12 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52967 -r = 627b415f9c35b26d523c40dbcf9ab45cf67eb42235d77d8303aced26c8edfee1d4258cc55d9704203db8477270313de0, f391bcf1063b50c2fcd6154e086bd0f1bf39b5b199412a5073867b702f1efd527f29f508d8559ae50533ba1c741aa127 - -# g_scalar = n - 11 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52968 -r = 9c19e9fc7ba9c437f8d89885f0561d7901b8bf56147b66020dcc67706cdad64f4532077c44377abac7708b19b68b8c7d, 6559d060cacc06e7be7de2f3c5acd785d1f8f0c9016197d1c317ecd67588187e9fb01b9353ebb47c89b14eba423b45da - -# g_scalar = n - 10 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52969 -r = a91a5280db1c212ec2f646025c4845ec54a612d7eb32cabee9f6368eab225fa32a15a9a6e58d6787845539d3c8d99c02, 91466a4137fe8b17c1fcc8f5b85647557e69e473302802e2a6d53f4586b15401fc5acf13ec4617a34468e0881984a031 - -# g_scalar = n - 9 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5296a -r = 5cab1d1d53636c6a26d464c6dad54d6adc351dc13cbfff3f26094833a96d745de35d87293fd7e4f92f5d200e2353b92f, 188f9ccbce170a39826bd60b119658ab5913533397152f27d80f9e38fcc3583cc8881d8e28bd55d00d7ecf8e4e713f4f - -# g_scalar = n - 8 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5296b -r = 5db4f184349cd9b11c7b5fe116b664231d9aebd64f3ddb371c5c2e7193d7e30f9e336de5ae9b587a23f60a05dd9bcbba, c3f39228f2d8109e8ff726bc3b7130f1166dcd9c5bd2445d8fe8ab408279791a7c9244c8481aa178f2d3017d199aa5bb - -# g_scalar = n - 7 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5296c -r = 932c9f811c89025bf893db589db2df555f4215d1659753ed731edcf8211faa954ce6415f874774b1df13b9d17d69222b, 26f5e949509364c10a80dc7196c4f8f9f00c83fbfe00087f9a552890afecf7baecacb629579be386f6694de088f959e1 - -# g_scalar = n - 6 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5296d -r = c482e189f0430c404f0f6a962b02d33b2a33f6661bdf6015ec52930f580d57f2cb2454b339d3413a7eb5c9317d56dad8, 3669dead50d56145a792712120deaa656c361a09e4ab90fa742b40034861cc4e8c653961a4c2b231c09d4e92584f7dfc - -# g_scalar = n - 5 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5296e -r = e1bb26b11d178ffbc676b987e2e8e4c660db2cf5aacc05e67f1eb1b5293c703bc185c0cbcc873466bb595eba68f1f0df, b24e36291df61b5c193a6bbfdb21dc92b4dc805067d3fbee7f49e4cefe3ca465dd3e91d08d0cba99d496b4608f8c05de - -# g_scalar = n - 4 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5296f -r = cfeee6dd34179228fb40f647d685d979078358d4736400ad2e4f153b0aecac4630594ccbee0421e30aae8477ebb68f2c, af6b978acfc20ce619f8461cc7dffe82eb8e9d2cfbe7396c71c19e5cb3abd52d18b4480d84013681ab0c171964c5fc4d - -# g_scalar = n - 3 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52970 -r = d283fe68e7c1c3ace36f7e2d263aa4703a48d732d51c6c3e6b2034e9a170ccf0c54ea9fff04f779c05e4dbe6c1dc4073, b9ab9a0367cd6d500924974eaefd4cc697fed2a52d1e2f4becd99c3fb1098bb86d287657851f1c9281d7b7df3fb11ea8 - -# g_scalar = n - 2 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52971 -r = db93b776427460c39c90a4fd2de4b506da821495f0687f503504e6f0ff9d48a18e6c8f2e022b53f0c8229e55783dde91, 1cb6b808edc20f3df8f2bcf6ff4f197bf60e01beae8d4526ea1b0e7423a77da617171b563d553327bd157b9dcebf4025 - -# g_scalar = n - 1 -g_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972 -r = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p384_point_mul_tests.txt temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p384_point_mul_tests.txt --- temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p384_point_mul_tests.txt 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p384_point_mul_tests.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,1664 +0,0 @@ - -p_scalar = 00 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = inf - -p_scalar = 01 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 - -p_scalar = 02 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = db93b776427460c39c90a4fd2de4b506da821495f0687f503504e6f0ff9d48a18e6c8f2e022b53f0c8229e55783dde91, 1cb6b808edc20f3df8f2bcf6ff4f197bf60e01beae8d4526ea1b0e7423a77da617171b563d553327bd157b9dcebf4025 - -p_scalar = 03 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = d283fe68e7c1c3ace36f7e2d263aa4703a48d732d51c6c3e6b2034e9a170ccf0c54ea9fff04f779c05e4dbe6c1dc4073, b9ab9a0367cd6d500924974eaefd4cc697fed2a52d1e2f4becd99c3fb1098bb86d287657851f1c9281d7b7df3fb11ea8 - -p_scalar = 04 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = cfeee6dd34179228fb40f647d685d979078358d4736400ad2e4f153b0aecac4630594ccbee0421e30aae8477ebb68f2c, af6b978acfc20ce619f8461cc7dffe82eb8e9d2cfbe7396c71c19e5cb3abd52d18b4480d84013681ab0c171964c5fc4d - -p_scalar = 05 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = e1bb26b11d178ffbc676b987e2e8e4c660db2cf5aacc05e67f1eb1b5293c703bc185c0cbcc873466bb595eba68f1f0df, b24e36291df61b5c193a6bbfdb21dc92b4dc805067d3fbee7f49e4cefe3ca465dd3e91d08d0cba99d496b4608f8c05de - -p_scalar = 06 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = c482e189f0430c404f0f6a962b02d33b2a33f6661bdf6015ec52930f580d57f2cb2454b339d3413a7eb5c9317d56dad8, 3669dead50d56145a792712120deaa656c361a09e4ab90fa742b40034861cc4e8c653961a4c2b231c09d4e92584f7dfc - -p_scalar = 07 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 932c9f811c89025bf893db589db2df555f4215d1659753ed731edcf8211faa954ce6415f874774b1df13b9d17d69222b, 26f5e949509364c10a80dc7196c4f8f9f00c83fbfe00087f9a552890afecf7baecacb629579be386f6694de088f959e1 - -p_scalar = 08 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 5db4f184349cd9b11c7b5fe116b664231d9aebd64f3ddb371c5c2e7193d7e30f9e336de5ae9b587a23f60a05dd9bcbba, c3f39228f2d8109e8ff726bc3b7130f1166dcd9c5bd2445d8fe8ab408279791a7c9244c8481aa178f2d3017d199aa5bb - -p_scalar = 09 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 5cab1d1d53636c6a26d464c6dad54d6adc351dc13cbfff3f26094833a96d745de35d87293fd7e4f92f5d200e2353b92f, 188f9ccbce170a39826bd60b119658ab5913533397152f27d80f9e38fcc3583cc8881d8e28bd55d00d7ecf8e4e713f4f - -p_scalar = 0a -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = a91a5280db1c212ec2f646025c4845ec54a612d7eb32cabee9f6368eab225fa32a15a9a6e58d6787845539d3c8d99c02, 91466a4137fe8b17c1fcc8f5b85647557e69e473302802e2a6d53f4586b15401fc5acf13ec4617a34468e0881984a031 - -p_scalar = 0b -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 9c19e9fc7ba9c437f8d89885f0561d7901b8bf56147b66020dcc67706cdad64f4532077c44377abac7708b19b68b8c7d, 6559d060cacc06e7be7de2f3c5acd785d1f8f0c9016197d1c317ecd67588187e9fb01b9353ebb47c89b14eba423b45da - -p_scalar = 0c -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 627b415f9c35b26d523c40dbcf9ab45cf67eb42235d77d8303aced26c8edfee1d4258cc55d9704203db8477270313de0, f391bcf1063b50c2fcd6154e086bd0f1bf39b5b199412a5073867b702f1efd527f29f508d8559ae50533ba1c741aa127 - -p_scalar = 0d -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = b51c56e18cf23c94d2657265ed22df97db5203a8d9c1bd568a7a8e4633b7d4aeb25e28c5f6749a959b7aeb7e75ccbdfb, b9e852483396861e7e0242e3c4b6f13c480153d2013c729f8765d5b730b2f01b271770e478351f3d0b2c6ba793c27ed2 - -p_scalar = 0e -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 46d227c432f6b1ba8058994c5710c0c944ce05ff88957166ca6b1af8b1f85c2ad02225fb01ec909f5865e5018f75244c, bbd67c622104520a9b82db24ec96f58b8dbbacba263c496ee1337a7a1ee2443fabf4747c8cf5662e41b4b570fc34971a - -p_scalar = 0f -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = fb62d26f4903026b0fc01fd4eb08599359500917789b307583ccf19550e07b342b7210e2ec3dabd8446ad8884709f4a9, a59739012f43d8e978cc03bebff3a8682223d79927670b8fb4dc2c5f21f99ef29e9f6341ebb42a79dcf6336390167644 - -p_scalar = 10 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = a10896aa435abaa137065f5313bdc3fa317b63ea2887d5ff37cf65517917652a992afb5b0ecdd2d8da6e8a7f7c33ed91, 9a624b7e7e10daecae3cfa3958d2e6984ccc420437711eb76eb78e23eab2beef14f82214dcf30ff264de9ea1105435d9 - -p_scalar = 11 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 524f166ee475ce709f6928555330455e7be3737d524ffefce6fc3f2af655a10d3ea4ea4c8ff1f43e8903e1304b4a3cd0, 53c86790aa4e9b36da14a20e4c3d98850782927ab5abafb5b631966ccc940e7bb1dc48ff2a463f25c033963393ed0faa - -p_scalar = 12 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 57505d8d6749703068a232435567169355a96a6879909f083bd1c8f62edb0dbd198fd3f0f38f66625dfee73ce5b82700, 6e8ff4db814e419c642295f6d6ba58a8900303835b3026443d99147bbeed67a6ab47984708755821759f8e818a39baec - -p_scalar = 13 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = fa0f1f450390d706b3b6639c539802ae23891298fc38538eca109c3b154aad5e22c4cc5f41a8c91282a2ed4abaa84c08, 5e2b84dc16a8889bea2e23887d9b498dc0a586644980cf3c6e8f4c87900d09bb5738d2c23c25d153b94871a34f23de2f - -p_scalar = 14 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 1d1cdf7b5f22346598ca8dd42d96c936f78cff0cd467f03a713466708cbaffc7cd96f20591e71d16ad610a2d94a70ec1, 546227efad1404fea1fe48d4b8e74438bdd259bc0019ecd466cc04da2332b20bda0ab953cde7d7001d85e76c9f2b249f - -p_scalar = 15 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = ab16c626dac012b51b1a0f6c5df0e5372e59ab62bd9ebe6930128aa06177f75d88e0d496dd2f9e2108265e510422ce2f, de7db0beecac3345d9952ea55315a7e84babeee17ad832a6d9d144b675eb6f66558bf560c70e84157febdeb5ff73a218 - -p_scalar = 16 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = e082882d69059095fd7a8b13f0681fcac382472ebe0e1fdbccd57831927ed783981b788d16f325b84f595351262bb775, 98e2963670327be7af037b8dea7f6322389b1207bf2f030884e54b763407c8470629d02536a89396b2e3cfb70558e023 - -p_scalar = 17 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 80826a69eea8f22461e4ca2b905432f01c75b8ab2a351783b9d3dd25429c0a18990ed20b569b8ef6d1b4e74d12e3683b, 620334f21ddedaa6d7d2dbc8a998e73e0fec76af150dd38185275ecd5ad83140f4335c0e59a1b7ec803cc59513ad5452 - -p_scalar = 18 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 4f13f901fc55723f38076e8fca77d74f563361909bd5c2f7540c045a409c930b20c1b8e0d809afcd259f272cfab816a7, eaf7f719da5cfd36ec6a5786995b16fb17d88bc65f0652c520aa8605b4157d216727d52d25db813776f6cd2942c2ef3c - -p_scalar = 19 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = c29c6e2ca5bb73313809ab50de2480249bd51b99208abe1e57d0f3d2e2be174abb280dfa3cb3fb361e93722758ce3b83, e01904bd1687f62325c1e5c2b3143691295d0ae21571bcbbfe9d70fa6bdb5c327c3343b06ff61c6e66bb02d29eedb0fa - -p_scalar = 1a -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 37a45bdb091cbb80f14b309f03fa90f2808497b7b0bba4a76efedb8023bf0b90b0391b37897b93f56423197d2afd473d, b82675620f6ddbe340d3f79d9683f702a2aed20662bd58d8da3846eb90a0db3724c0bdd16a1e92911225b51c7570a234 - -p_scalar = 1b -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = e8ca780e373e5aec2f7e8d509c6a58fe7228e2d5d18f14d08e0d4168482396f9cf1912934d78291da04482d2467d66e4, e87df5f43aecb12898198e6a2bb2c32082d9abf9c737a57a28865201ce25e414a7592809961d070bbd552e2ae4971607 - -p_scalar = 1c -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 55be5764d37da1a2d8232f8b4e492aa88fb0c597a4da3e15550e0bee8ff22c6f4169b4117b3c1220c76afaa373b64643, fa3235c018677e8986dc880407147ce63b71190c4fcc3eede7b42b8cc52967c46008963a78a011f00e43764ad7188061 - -p_scalar = 1d -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = c8b00ae8187cea1f2065b7cba7df26e43dc22d490e3feb0fce3c15ed55c9764725846b66780443d6019d6ac5d3021470, e2d5e3fea6880e93090a818e6f37dfcc71924ef4bfbafa0454e872d93317ae4bd6c3e9b5df37c21de5ad7b6079a2212c - -p_scalar = 1e -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 92cea8f4c4360dd87002990485ba414315f9abe1feb6b100519b9fd50a18323276aad8b8131263886a7a3464d0cbcea0, 6bed6d1aff07734d0a96bb95d8aaa96d693de4d6095e980dcee822fb2b85be22e7b9110222c14ea92393a2e33ed8b75e - -p_scalar = 1f -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 6c07c4040a3305d11afb51a3e3ba8285d42f7dc953c149652ecf8340f0df4fe6b6e7ecdd9e821ee6a39c89317c8906a4, b8a5c18a9c675e62a4c2f292c941133b2822b9b0fba585e3bfd56454bd14df2143f59663c8b3b4f72547cd78ed803e25 - -p_scalar = 20 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 5dd2a4a0626b3d793a9865baa631cfb0ba8953d612e8dc871896b9fcc651b1dd0d784cf208f779d5ad852b878c0a64a4, 3aef526c554356608c4bd8da4ca4b00fb434f90ff5dc884988cea0616bb702f65c8d203c0d5ad402eeb7438e9783df44 - -p_scalar = 21 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = cc9e97a46c833e9d68af622641d5c400da631fc160f09efbbbc7c7ee955ef3afdf330d9d5b943c8661333a382fb3ba63, 5802d49e6fa8252890336c5e473cef8d75be91464490f545f7b98315b746f46dec409eda3df61aa18028c172c59da189 - -p_scalar = 22 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = cdb55e6ba07b7cae7ec2bc1cd50b3e6d9d6ac102b4e2520145700722abb9102f0648c2cd2d668c4180b309dd2ada5bf4, 569b110402522db1fc3faf5f9eadf8d9fd2ff30475894d2961ebe75baabaa83bb8f22396075a80b7143425f97925c6bc - -p_scalar = 23 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = d6149f75e9417bc6832bd8e34fc7852365f16273a02583fd4a508620dde6bd0abb3800d52d7c2fb458a5b5433720ec9b, 4ec57527cf1dc0d953757880ad332ca3dd0e6054d70ca111affe7667677f6d5cf31e7f765aa1f6a9014fd917c2114ad5 - -p_scalar = 24 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 1608643883061d376f01faee26946e789f82b7fbab52606ca39180d45c2c7ce14a13260770b1b757f216aa2531238ed0, 096677847f9f7a4820cc112848cbfe4e95cda713cc0aa98aefdf6be73e9802dee2ee43a0291d7ec7a68120c9f04f8843 - -p_scalar = 25 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 1eba28f3defc58b59261ede87ef27114acb60a7597482b86a129e2dff5b54a5d4027704bb5630ef20202d57de44f61a3, 05f1f848017a407ad7b0344a9c735cc84af9b6576bfb82e0d156edbca2d35fcad0e9bc29eba6b411936e3f37741aa761 - -p_scalar = 26 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 47ba96091da7b1476b464412bc9a48c7479ecf018173fb32f3d752f5ad6cbeac018843c01c0d77024703cd85891f8ffe, e0b9996badf9e70ded641ceb68bcdf5b0cff1e39b7cb8065251db867bb6a946b783e7c3b1e5f1f936e50d916543ecb77 - -p_scalar = 27 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 587df4d6b89b1fc2c9985040b76c066536a1cd6dde9b62306d7edf642b7f006fd984244a8e3d2c467d894f80506e0e42, d2843ed7f8b69704e56acaa0e329fcbf49b91bacbc92601dcba3aac54aceac4684d4f54b17d6b8b8b3f9c7b9958e5185 - -p_scalar = 28 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 51c4b1b36a4d6e813b021cf316d7a9adae78bc3a3134216c86fcfe4760be3ebc43a53ff21beb359e6048c6949399c38a, 2026d49256eb44fe244dd362214b91939c5ff5f59f1f55d567007808c8f148bae207337a59615c5cab4632734a6c27e9 - -p_scalar = 29 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 8764cd2cda92245de3bc778895fd71ae89746c8d852ca03573a82933a80d68f341dfd24d456a201ead148e87bca6d14c, 7d158fd114e70e3a9866ad382e6cd8d14236293cb060a765a879f31ede9b90cda5389d1ef0c362915d01d3b97d14dc1d - -p_scalar = 2a -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 7438b4933c1e593ce983e169ffff96c73fd72a308f234c864b21c4f3eb6c7e6231b22efc5df46c6618ef56cd5d76b881, 2497d63d0ffd4491affd6a97b8d58e8a18c6049e1559889cda2f355125e1520af26a645586926ed679c5dc5d5aac171c - -p_scalar = 2b -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 35178bad22dab3935cf095a901fefb567314f5f0416dbd86dad9f5b239c4943d09112fc50578bc8c37fa935500846d44, 70c0e09c369cd487568b4f6bea3406b755071f0942f9d72043187556121ceb43e4811bd18b61ab67308603e5c9450e58 - -p_scalar = 2c -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 9c7e7754a320d35204ce2a21986c5ce6d50a288981ea36c2767b4ad7f8f99b51ae97af8bf240b30a1c5f0e5b36a400d3, a04d71cdd5e228c45219f692fd1abc51b8987504d822571a397fe89afa3852928337d5b10e96704d3ccc9ccf44527cb9 - -p_scalar = 2d -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 9c94c858b2ac340599e1c0c61f2bb599b0040c0e8d6fcf13ffe8e0bb39eb8f59d4af65c673ad9112d4c411564fddda5b, bd14d686247c5b7ae8b888dd42d50e61e906998948dcb16c14c4bb561a4a96e69d4d0abbae0335c070778729911127a2 - -p_scalar = 2e -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 374aa9069481ed0dd9c79db8005412579266634957719f5460976b01b472d7899f24fba649ddd10ea618d7479fc4f435, 03ac614c1da6382437d2a66713f6f2f9e6547fdceb14b546285e675be7a57b625ea6f3ce130a79bc9f104eec8023d285 - -p_scalar = 2f -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = ea5b37c5da233371504f21b1570cf950780abff7d878acd0bfb185125f5b07a065c788785f0dc66c6f888f7df0c668ca, 536201382058d574110ff96ed1df03dc20115e5d9a1f036e079a9d576704caff638fe8a6db630648b7851743ddbc812e - -p_scalar = 30 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 66e4794bae7d740062e5c5d3e73a1bc940d01ff53a7d2f3c4f504e06ea52bef92d368d48e7f30c2b3ccf806ab35bf6cf, d8e1bd5ed9db5a7cb7154ff14a36b9d3d9fa35ff625d5d35a3c35ef2fb454679ba7f9f615899220ec2cf9da2a0010ced - -p_scalar = 31 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 0b470bb250e4ea9e1197832bcea03f5647c56c115b6e3386a669156542e365a48ea5af63a5ea6fb8fa5c3aef697136c6, d2e33ae71d74d42488e19bbea4a841d0db78122a807d422c03bb7911b63614167293e8b02db682b7ceec38bdec4da8ed - -p_scalar = 32 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = a820e8303a5d50d19cbf755b46f97ac7beabb91ac3c90051510bd675cb2ec3f1172cfe4ecb5af900a96763d2fba32d1f, 90a705748e7e3d5e90840581ec5b08293e4bbbec6ccc1bfa9edb9bd0f0cd4ead208238f9cfb7b9e57c560e82cf73baba - -p_scalar = 33 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 16634a504f35cb3c3dba16e9daaabc27464ae8d241a84de7a5e0fb598c5a78d91947c0caec4a22b82c4ccac72070ac8d, ae74fb823455f268396b761dc8c0e5f2f4ddbfffc37782c925153f3ca8fabc0ecdb2f9808ca622ca523e74074e9137b0 - -p_scalar = 34 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 4b820d9b31d83660252b48f5cd8d7d770bedaa85e5377c005687d1dca6ccfd358a944b316b3262328f6468656f9201b9, 3a33cc62345e02b4dddb9a7991a121896f1d51528087550792f5e99312c3c484f576cf02edf74605561a50c4351f80ea - -p_scalar = 35 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = a8ba8f10e0f383ea642ec4e615c3aae2cf485c74a7c54b160b0110610f0422a2daed7c268a0915cc3b1bddc6fbde49ef, 120d1c1481336b7a5236c265b7e89a1d2d38e52ec6f9669ca8795e65b1d057c014139bbcf7610574d5dfab4c6a9e7afe - -p_scalar = 36 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 4576a6497cb8944248c075daaadd6150075134ebabd64a6acff00bd23c9b5a41ab2f15202175fbf411853add834e6c54, bdf1498c6f95d6b69161794484e14885e51e22682ecbbb44f40786296c4bb1587244a8e288032e0bcbf58990cb52125c - -p_scalar = 37 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = b3fcd5d1690cd408fa5cbfda60f4554f6078d8bf085faeb3a4fb7867e3a142d6fd6622bc1718ec3cbcab5f60069f3367, 8b9fda8ceb31112b956e18c6682f05f9e8394a3441dccb07721cef83c2f8609d7d50dc54e7f59c58b1421183d7e0877b - -p_scalar = 38 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 7772a913e6436cc1e9981ea6820da79f2629ba4fd1deca258b6fc785e692fdd2d4215b4fc7a8baa1483350a5ebb8cdad, ce009b71f07747d2a901000cd90cb631fa7d9e6db6f44a8d49dc5e5114733de2d7e8619237ad09b42ebedca4aac04be2 - -p_scalar = 39 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 814d7fa07a78c189c052f3eb1c99ceef1e9dd1509bf446e0a14967dfac4bbf6273bae4c1694b8b0db14ba61cf97f865c, f57dc465b4d9209c2d1ecfaad6ad3e0370bd843b8c37e2a4f29f454817f65ec288773da65e8c849a5efe5b7d548b4fa2 - -p_scalar = 3a -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 104cec0666ac72e09e9520bf57acc87aa58db4ea4f96af4fdab9dc0015b0fa13341cf9d9c46785af941c5c257d0be180, d4ae66a086b256fe3f7a6a1caab704151ee96616f605a75e4a0ea855a964a826474b535f057fc7f560c08456e6d6198a - -p_scalar = 3b -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 9ba039679267b6463703435b0de64db996a917cf1ed0e31564473b595c322738dfca6897f929974caf467ce227bf64c9, 00cc90edafb9aa3e692645f4261c35e6904cb4cfd7b9c3315330d12284fa68fbbe4248bd4cca100f20f3d552c5add041 - -p_scalar = 3c -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 95bb80cece47968c61bba736a55b527784b7c2fed74cccd40402d5c4eb809f85a61fada6fb4f60e8c711d5d1c425543e, 722de40f4b15b0aed603c4d7b76d198944ba5ae06b757c8a5328f47952d5df020f1f0b07197d55d6f606d524e914846a - -p_scalar = 3d -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = c93ea049ef6ba0062366467300fe51fd5ff77ff2332982d06035e34f772ae08054fb5a34222241e848da1fd3fc60a6e0, 3b33eebae03967d64f59388dfeb992dcf225e6001ad8a898195877ac8f2cfc13c6b2cd3195160b5399bf0ee982c7ed99 - -p_scalar = 3e -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = cb4c0a54561fedf2d194b7054b14d11703b9f1cebfec21da0c7d749907dbb9af1e659730c1fb476e49a04dc0f5acf772, f6fd33dceb6bb947353cdb137d3b0558c2daf76dd456dc649a9f61a62600f544a0a164df29cf3eba509dc2c1de25b2bd - -p_scalar = 3f -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 1c9bf0b0f1e52d1ef6159e519a049f7acd7e35f76e2b71aa7a50f7458c949f8f6ce8ead6149a1896c5c0e6d7aaed89c0, ad44c8ed5f5976170a508471c8ca20dd237642b6682bfb72c44fcb17772e80e572c5a09ce13284e5c4493e0be7dfd37f - -p_scalar = 40 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 4f5d5ab6d1b30e5cfc8e87cf3be44d56a309199dca57b7bde04b3d30f8a0580d957c980f297a9a37ed4de4f88e89b258, 77748f746bfb35aec11ed876a132c01792683543cfe01da601ae4440ef6f0120f02e3ad10f6e43fe4dec3960cf56cda4 - -p_scalar = 41 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = b84c3a6a5fd4266f8b0350b2650b22534597ec8abdd5f002cf9edc15edb63c80becda43b0d1d279f8e469454839b9679, 1590dad75aa44e365d7993db37060f78e689c292776299225487b4d321d43d98495b787bc5266a2cf1e927c3cf038606 - -p_scalar = 42 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 3418c841ef19aa6cab34164b3870beb7acd0361f5decad089983c10a492b899ae22c691d99c0b909b60fb64e52990b5c, 4d78416af80aa2fb6d4b7f1128f293c5902cce5c4f2a515ab12c02e6d597baf65a7f2fbe3d3776f8930dfc5adf64cc92 - -p_scalar = 43 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = e462ca48e153035af9af3e4d90909d25556e637e6ef3d8f765d75edaa55d6185eac7dd3b0b634f686efc5cbc8b1772ca, 7cdd34755386b66bf695940fec9d3a06a66f48b939143ffce581ca12c0a61b42efb54e58bd87a2f9ad89c485f5ef612e - -p_scalar = 44 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = f6a8130b3a7741e35508c2b38bdb088aee34bd1706035fdea4160def7fe6923a2fd77b5ae6018776af78aa17286ac2fb, 2b984f17d03b99c1263a29e0f60970b3d64fb6a881f035febd88176d8fcf3364a656197694e18dc03fd1299e8683382b - -p_scalar = 45 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 59d65d78a3f735f42c86ee164fdd3ccad4bcc8b125abfd65cc66c8aa0f19981b5ccb2859a1115e28f8d3df74670c2752, 0432feffd8e2428590d361748ce985cdf53111b77d1299432ec51b76d42bdc5aa889629cba2c66b2fca521d883f3aa31 - -p_scalar = 46 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 2bd44119aa9079b7d8436f83a2ce4101a4c793741489a3c09c2e8aec0cdf6d91edfdd44e94cf7a32bcef0b6a37548a32, bbc20af538b960b5a3a666e82c5892143bf889a8303249483375299a738da5821d5d4f65989e1ac760fbea436400d5cb - -p_scalar = 47 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 0b4faa5a537ecd702b123738fe255dda27bbde143508ac5493ba15cfe58d0a92bf5731b3abb11441c42ece45effefcb1, 065815d78cd52fe34246db11f8ec6a99debb250e319bc8c5eab0d7afda4c1ce57986c3b1f7feadc295bb2f7c22137c39 - -p_scalar = 48 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 0966d45a6517888e2ac250f6058daca83b7debe494eaf32810757e2e3f599369f4445a249b234eff668240536434688c, ced3e2d0c97db2c54fef5323f68505de87ab07433c0f52c5384bc9e6546988b866326235288bc8f68aaa33871896c4e1 - -p_scalar = 49 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = b89d83e72bf4673cb08db04de8caa7d29029a9252d3731c25b8d230bdf8b9b24a9c2a9b11de8963b43385c32d851a702, 909a50c483675e9df4ea8bfc78479c8cfb1de1fc6dd9a5a650603784b0e2de90607649281e1729e95702c6411e0dbbdb - -p_scalar = 4a -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = ca50bae743ca3e45a0dd8e3cc10c4f6c40d420cb5c36dc4c02ae1f9150f6a5cc7f3bc516e1b24b64126d4cde13dcbd9f, 53cf2923ca46546146228db7428f7a38a5581a9c35e612f0dba73610ec30dd42ca22922f8eda2e960f8b41171022d4bf - -p_scalar = 4b -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = a1e0ae0fe6ca7a154a7ee23df367b5c85d4631b4392f8f665b28cf8991549a96c8cbc40a420ab7ef6b5d4014867303de, 02bd279dbe829a9d2878ffbd6a801bba9b1dc61c0fbfd1e2989d5496bcf5128d5ace3d3aaf0546fed59aa11fec605d83 - -p_scalar = 4c -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = e677b97c61007b808b8d434e90bfa219a7253817daee85404552fc68956bce558c547a520c8d74e1fb2f775e4230e336, 1878e3cec6c847f09be8d23ce6fe11ddbe445e6ee45c22f9585965db1b07aa3f6914734b9fcd9c064015190e08e5438b - -p_scalar = 4d -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 63d23607fa5c9816742e060b28a126270ca930b998ce78a327ccb6c0212a6125114a9b40334793a79f2134c12a501a3f, 2bb4ef8acfd302d1319e3c1aa8d6be5922fc6affcf36304deaff7af1b602c3c1cb3281d00cb2e2dc88b2345c13e06e23 - -p_scalar = 4e -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 02781ecd4db639eea1560f9775dae55bd35175d9a506191dd3338ff4b743bdfc47842147688c1ced3c80145ddb9f0b60, c186abde517042932b85fcf8b1c370d37bdc719b3b585b043b78f3624319ffcb939d400bd3ba155366c5cfd3dc231ac9 - -p_scalar = 4f -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 23b245a5d53912dab3cc818a7069cb7c491c312dd15d01f0e58901a204ca55712cdac248c3b74585ca11d9d4e9a6c224, b468d707e2854daa6be399360cfd7e069e84cfe4f79cd14cbfcdbc161146a13d5fad14c0cd88aaadcf087c75594f4e9c - -p_scalar = 50 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 1e8568cca446324620fe8c27a715ace6dd2ec6d351fea1dc49066428b121360923e5c6b90e42d1f9194924b4ad0a415d, acf544bdf9eb5906469f4a101132751bdbecf9c5ec87197043856fc39b7b9be1671680e226dc9c88ff3dec4503318195 - -p_scalar = 51 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 0984c2e37cdf344f11238a859f436faff2c3118feaf138afd8cb3560e07b1bfbde45473e86c087853cbdd3cbdb06f682, 6228489f68ba4781a21c729c51d8f958fefb85a11a22d872a9522d0fe70d9c816a65eb2a8c905dbf1ef7c3e93c7da7b0 - -p_scalar = 52 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = e6db24057f12bea3dfc6d038305bfc7c87e75dfbed69216bd6021049cbfbd0c2e8c09f59ec5cc866783cc5bb88f82a12, 9ff65a61432cf2d79614842d0111801a128c900058cb66b01bf2fb109f97aed67b05c629b44ff8449b961eba485c5d2d - -p_scalar = 53 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = a075b16ac03d7805c25baa03520a8926eeb88ca1c7a4aab58487aa0d4a6694eb44cf847ed2f05eb48e61f0bf44e94071, 88c201259631e30648d5832fa9c3871bf55d9d45ddae432530de56a8b619fbd5b1c3ec8e9ff69bc13ca85b76ec268f3c - -p_scalar = 54 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 00eb5c040d16b7fcb048b60e740c04a52686cba73934e93664a8bdc7c791db8094b80b8f691e858b3c712c3c6323cd05, c1a39004c52046be23675426bcbe02b6781c1cb2727eba5feb1a8d0de33161f1600347ae28364a4f7f3f276fb2237d89 - -p_scalar = 55 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = c835025446e64d4db0a08fe1114e6f01d953aaff73256a577bbdcadd053153d82148bbb88207255a935d2cdf9b06762d, 93de726d366c0dec5dce7c601d76ae6a3c2baa2dd350ad0d8bdd58d5f4141ceac6d551fc8e04169618304528ff243ea8 - -p_scalar = 56 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 94dc48fab7e8cfcde61e6c2984cb7e449e30229d0a06f838361494cc0b162b571234181c1dbb4629c7364268d94ab449, bc29e690721b7a85ebc3917cd36d209e5cd08f195f3c1e5a8566ef2afe3b86975b01a09f54df4c80f281bb0e764997f9 - -p_scalar = 57 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 1c1b3417a500bb22c4840320387b6b2ef30a928d9a3c3af1df0ec1ba8b80919559424730109677754f11a02e4aa0372e, 60fb90511669019742537e77f184b248ce6bbe8a18aa60f62120dbab067b576fe7db928a586f697e96f1193940cd990d - -p_scalar = 58 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 9398236759e97922f158f85541bb965c782840d1edd794907774056232329baff0041e2423786267db52eb03d1db891d, 3be5902bcea7c2ade50d59ce11e7a67cbd7b9ae3c198db4bf80683e20745bcfc590ac7b2d0a332efb4bf33481c7b8873 - -p_scalar = 59 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = d0d105de164b7361d63dd29d19e0e2b667d3644ac8e55b7b463df30b0096721f18a49fdc4bf163e00c62094b2d71d4ac, fe3816c64720c80ce2d7dbcabf469d26eb88fef6f4b21b3f9a330faed255dac2879e48e3df6c30811a79a3b2fde8e771 - -p_scalar = 5a -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 4347b760969bd7f7b560d7e63dc77e7bb34f09fbd045d31e28bd6aae6e6e8e57672649def3c36ba79b35cdf7a7871029, 6031b8801482c98e1001a0af8dd013512114cc6ed63b8db6ad0d3541ec292413dc3151d601531272d0e9e5f8a1ab691a - -p_scalar = 5b -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = eb0f52348bf223b0e7e7382759dc3eb7b04b977d42d74f5fa4f6e534bbc2618a35c2421b14ae3f635dea409c9cba0858, b83538fc0ee9391df4f64c4265477b8734871f379c5d345ff62f4cce6dc9cbc12fed7ee4c021d39266e3ae99f038aea7 - -p_scalar = 5c -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 1031cbfcdef715d74efeec75e724f56cb8a88d32c7b6b5a626905570df79b6048f97bc3df1b9f55b91b6e58f1036e450, c1f7f4cae5df901da1bc3e946f0c72e2c2125f7d57596e065b2978e2b8d52dcd31169bb7d9356b23551529f1d234dcf9 - -p_scalar = 5d -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 813355b3430aa2d72df91689cfd151547a3545de7cfdb00e1c634764b16142cd1b1cc24f5380675eebd14d71e32d80af, 3f8e0c70994062f638e4c6ab6f5d971aa8d5bda48e98f234018357efc34f9966261cfc071fc54486e9231d377a0d3581 - -p_scalar = 5e -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = ed9602dc7912de8d89dabf40cf9eed19f4db0ad3ad1bd1192e2bfb0c25998b5d4259f70ee435a0deb134a04174225251, 7bc3be41639313209fef39c6248c25eefc0b0623143223f782ea0dbc32343506879cd4b6bf767610a7a492e83e606dec - -p_scalar = 5f -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = b8f42fe52fead1e4257b0bb5ad7f23e10be90befa27d2b794a607b9d0ef989779f74ca169bc0cbb10fc0f2630dbc3c91, 4492b45abd20d7919ac9b212aa546c0673f09b17c4384a6eba33c0eb22660603afa0181302869e8221871bcfa06c4a6d - -p_scalar = 60 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 8bf3dccc39c18b96cb4aa43c9741eb4226de4c6581998af2ee21597e52ce08f68fd61e31148840d4dc5293851d15bba7, 4da80493a5bbcb5b311f7bd0a2a97f47062e615f37cedab47abac690cfa11b0eaf81dbf9822783c6991e2a26278d67b1 - -p_scalar = 61 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 8c081acd170d807f87b1e51bac06961610241ed16fef9d9d8f273e3065278f98c1f0db004a49492c7cd2035d7f5c54e2, 7c3948713b0fcff9b3c1db6e3b0a969b34b81b1287765c61282db10bcf1fa22b1b14aaec2979a40bffafae16e38c4a67 - -p_scalar = 62 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 458ac76d0f40ec396e6880f15c434085ca861b4d97740fcab1bcd42525fc2c50f05e0ddedb37f6ddd2872262b0a9e00d, 588efb43001fde0cb63e8243d9d7df8c846959120049ed20ffc36e0aab1162a528fdfb218f772d25a02f6b017b751bed - -p_scalar = 63 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 648c5f00bb28223ad49cae0982d9d6bdb9b2e6b479c8f8bd1b41177c708ba469bb4f9e0f41aa174e6e3835a9b05f84a1, fc1e9674cdd29c42e08b6c4e89e6f2672908a6272e5f15f7998aec708f7db81d01cf69217e5f5c72fb0b7a8aa2733b5a - -p_scalar = 64 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = d884d30b2f03f287419f4d2eab386382b0e595a155fac50e100134e2338c10e0f9d9c4dbaf282e57a350c4fc01834066, 12396f36fc1d034d75751338b50246d6ef016d9f8afcb08dd5b22cabcc25394a75eb8dbfb6dd6680b581a6ca09f8ae9c - -p_scalar = 65 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 7e2392bf7bc814db9cdd943547a18710d73b1fad8b8b5cfc73ddcd2c2eccfb1ab539f5fe50c66d708e66c6f69b8adeac, 8c78d2c9e8fd1e216f649a90bdf13efb58c1e2650ac17fabe010be7af529796b001223dde2983fb26ebe6c4093708b17 - -p_scalar = 66 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 180783fc39489b2827c614bfddbdd7a57befff1cb90a319f1c0f6241bb2863c829591fcce7274c8803802ee80fa4f860, 9f5b2dd5d9095a20b3937037c7e8aefa5b80425c412a1ada6172a1f445c5fdc4ab9b4514e4c8c458d576509b865161f9 - -p_scalar = 67 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 590da88e64671048113a7902e3da530d1ad95a94f23d84fcd3f0d14329c21de1ddcbb10eafd402bdd24cabaa21355d5f, f3618ec88d8c2412291d2a59d21bfaad9fe42e3ca7052e3c681444b12790b201e5ad1b1719d191f40b5a7d7e6da40f25 - -p_scalar = 68 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 7117756e39dcddad381f4f06f473127497d1e75fd9f408b53dd4f91683002cf1cfd364cca03bfa6367126ced901410ec, 12cf98f9c880fb304f9bcbcdb1d380890a0bf8ce1470123e0caec3c46361a0625c462290dcf3d0ac1df90ec569277518 - -p_scalar = 69 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = d0ab3e3a99ebd09c022c75441a806542862ef39c275075e3077f30e5dd2c23bec367d6aea6e201bce6e91985e5802845, 33c518d392768c5a31450ebaead0e6dc2c2a856ab8dfda9fc8d3dc5656e000725a30c9af5652ec94829810a0266fd747 - -p_scalar = 6a -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = b380f170bff65e1c2633179cfa6a8ac6442e0f1f36905deda01780587776c7fea1295b179d724fdf3d303c72138de192, 0e396ebe68e2e2a44a5ce29540ef369ff960b81ef512e7b4e1f467d4b9cd0f5af83cb47d7e4e82c85099312a2a6feaa2 - -p_scalar = 6b -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 77964d793f740b4850994c4960a91622ccd4f456753f40d027c6ec25a0075d4673c21e204f761490d718e8e1f4363f23, ae7d58e8d503120d1e26608738bc71c66a2952ba479a6b9cb77c8b2e5d80c05f7bb038641be6c2860b36aa1e09b812fd - -p_scalar = 6c -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 2a532f0ac16a417882f24a114cb0b8671b23e3f7afef0b5d589f30567bb8dad3d81b74529a67044fa26631ef443c7161, 9d656f406511cfc08b664ce6e12f221cc3a74a19c3bffdb67b27e171992bac6e567a255c91b54316d892e8f1bfc7c314 - -p_scalar = 6d -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 6e3c27bbf13f24033cd18c33b9cff887a911a58af0d93abb5841c5f8a8dcbdc89c7d35833cc1184b0efc2e27b2deb1fa, 0b3b93a9e67388fa781e65b180838a978a52cc350a5ebee2d24a804b0a9f250aca3226f3abd6b3faa4c6e8ee15acc519 - -p_scalar = 6e -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 26956a5b83e5bd0bfa63d67feafb4dc8bdc1c92475053732ce481ae68d2624c8a4ba394e85d138d693f846d4906ef776, 3a600687ef91f740488a5078961bbddf9e28d8d18a3fa9b5406386e38916beadabd914f900eb7ef4053d8f0e8f351c5a - -p_scalar = 6f -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = a158aabcb9bdef14c3907b518b02667f27552012c727be036744720b50447fd908e0805000765fab8db3b74805be74b8, f6358897f7d8625639b4b847dcff260133071e06b514d97a5d00ab436c3cd9e5ef6a411a1cfa0469552205fd0b633a90 - -p_scalar = 70 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = b4a6714762f45dce83f2fd2cd8296a52fb25e37c9710b70b2b5609d5504c81290d20370a5d66455a2e20654839d6e2af, 07d446bbba12dfb2465e614a83e7debeb8c197883557b977c1811bc5d13895e7e958e332f493b39b57e746425ea39593 - -p_scalar = 71 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 869fcd17ff86a9864a5bdb048d7fa0c2e9815b09139b7fc5e72215ef852bd27fd2c616d1bbe33572f85b86b79b0bda12, 5ef4c20daa086bb4c2f12e83ce4788a84080212603ce449896678dd5184edfd5463ff80d2999b2fbcd87ade96e250941 - -p_scalar = 72 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = f80f423bb48af0e8e53bd76b6e4b3bc543c2a97d5743877a559b40a286dcfd8831ec9ab137796cdcebbc6b4cac6a280f, f338e5cdf43b9b91b66b98c79dfb532f935f8addb23b5a1725af72187ac62ace0b58d896d4e3b0bac6f969582b773385 - -p_scalar = 73 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 274c69657350982d84442a4123c50746a97accf432406bfd33e868f326a488269120f7b3a043456daa4e673b34498f56, 3f3a420930a5ee248afd61cd30ede0fc2065cbc509ced139ff23c6477b75a478c140e24d13851dbecef948056a236155 - -p_scalar = 74 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = a40dbba76a0c98442700a45b812fab5c2e56dde7119ced404060d22edb6e808b6d812dba7e29445309e7d232ccd1c14b, 3f52d8fea7e3993a82fb0a4636ef3bfd01f7b3c0d9657c7d7e64e9a13ed8e9a24b6aeb0e16771d06f5e3834263499cfc - -p_scalar = 75 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = f26774cd7823568b517a6bae23acba53ad9e749a9aea738d613e5294fe8579619532b30ea229d070fdcce7a80723559a, 8faf654f7d4f688c85ab9a7d400ea7a4598d64724d867b7e92663fa0f95109fe3934c5b31473fa846bf8985f51aceeb2 - -p_scalar = 76 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = b8027be64a5eed689d19bd63befa48da4496f5a023133af12541da528e6a2448d1f2d42a406775a028f0ab7a080bfca5, 546c7955b5c108186699c66069c511df0caadb2f4bbafe3353ec47eb620c028bf87e6b6c22a321dcf7382a5e694f97b0 - -p_scalar = 77 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = d2fc5c57998b057713167fb8ec9cf4cda4630ba1875fab27cd55e7b421cf9dde59f9078dab73bcc4732595ac7329d8d1, 4e9ac9d775bf5a3265e44e536dde485c146135436ef6481a298859b7662370b84d24690cf930631489ec9f3fa00ae490 - -p_scalar = 78 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = f392f9632f3b0feda03a6787986794dbcd411e349499fe4eaf07a03eb8994b40d3259f2810248af41b3ea621f3c6f15a, ac678a7865e25b379e40a6c0acd1f133c36985b9b3c8225b33419045c88737c67618c264ab283c770c8e99083f75edc8 - -p_scalar = 79 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 79cd3f1e3891db8165df3c959329f7e0c29afbd47772778a6c33d5d6ba6744e48c9a16e3a896ab1e5198ba40189dfa8d, ee51125e39b2f6e9b8c2f20607d9a48163e2c65748e90de46aaf85ab51b276790abfb09316fd719d355570f5287bfe64 - -p_scalar = 7a -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = d109b62984083890da5fddab7e28aceae3da87e136a2812ddfffe0dd4cbeecde89a9a5422a1a0fad53b912fb21a3720b, ebbee398404882a8094722669ec58cc4fd488003ef88503893198baf14b2b31e0f1096c5d6c0669988bbf6a48d72c11e - -p_scalar = 7b -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 8e4a4f6321dc82a6d4d6fd78550418d24b3d05ee4295440514a9c3ebea80907b46b07d4a2a1018fe151198480c4c0b80, 8b3b9d12e5867522fc4543133da330cc757954f0b670bb84a57d50c160cf08167c3945fa8f877360e41b28095e874626 - -p_scalar = 7c -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = b4bb1133ad9267aa51cb20d25f083167238df4864cb95a00bdb4385fa6f8277692f3dbfda1435507f9e5ed57d99f5989, b6576363085ed416461662acc304f6746abb244d2b1491cefba31da3a16cdef2aa5b6ae337599a9840b2ec55b0eea403 - -p_scalar = 7d -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 03b2dab245cf48ae7ad6ebad036703ac9436a8cf3450356d50ea65aa46f614e270f25677719d6ada9612b8bc3cfb44bb, 76cc400a8d0ca334832a58b44ff6a7fdaae0be43de6e7855130ac9be1ee6547020c048ce12b0aa5bde6ac2d6bee8f9e1 - -p_scalar = 7e -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = ee82cb5d4c686f3145940572b53625a29c14d45c4d73654245b97c7577b60ca7135cfd8fd9f0f5f0ee101c5ade346cdf, f84cc9fd3a1e1353420c5b2e50458073066298ab1fb507aa068cd344b0be463beada14c64035692c55eec94a4f3b89db - -p_scalar = 7f -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = bbe34e740f395db4a92bb11bd6e0f09d96fde63874231e0feef28f34522c62792aacfa4c569604aff7753246eca101ec, 3816d59e1c6b7f960c297cd1c984d06b61d61cc652e7f4f1772dd5bb5b983ae5a9674240fe752a555591a623406bc306 - -p_scalar = 80 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = a6661cc4c241720a0336aab8777a16d2f313389118eb5195c0dd449e7c1c39840f4fa5eff21af80ae484fd9f8258030f, dc62354d5d8853a4d9a811225a86e31c4fe0e1fbcb5fd594a27a5f1b5fdd385add7697999b9e1c7d987246905810532f - -p_scalar = 020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 4ee443f91860144e0b7f54eb7e4cf44aa177ad14077777efcdc4753ba05068eacfc4718769f60e03c84f917203bdf6d6, 13008228729a0c753a42932184d3927143b06c0b5f389eb51436a70547324930aeeec827bc93e4abed8612b3bd44956c - -p_scalar = 040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = bab3aa8c60a8a7a71cd9c342e31644be358bbd6e8948b6e231811365ee61bc954043079cd23ad193ffec6674f65de0f5, 7ecfab0112f66eebb14d1c9b4d5119283695fbfe8c8af29176a83fc47ae85174082f4fbdbbc666f31f9aae615c8a4149 - -p_scalar = 060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 304eaea00e786d5f4d6a091dfab87b368618aa02c421c69415aaed42cca2f15037ba0db6f0f49278ffe3104b684456b1, a8a7f39ea0b9f791808035b692309fdfa6d786e7f62179f09f6b7dc4858f2bdd0a81c5e552c78572f41688b9d3eebf8b - -p_scalar = 080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = bd6066681a87cd4a06737e54f91d813ef972804fbd39a2bc6be6abe3b91f14827be330a822fbbe61bb39a17a7c34f095, a2f436dc0698e2756280be92f981d3e677ac320953faee4f856c51205a750fbc47df957dcb50297040774d1b0ac72a91 - -p_scalar = 0a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = f20e5b8a6c7e9f94c3bf31d408595dea5caacb6256583c442822598ac5d6878a19eda013c543171e9468777a2b389b27, 2f5020a46277c3a7473f2ecad34250dcb7e5a5d08323f283d42b8a7b429771fd8c51a2f1d6c6558adab768c9f4575e37 - -p_scalar = 0c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = dc74d638c785f1439114cdd012def474f016adf1c094b38cbf75bb57da4d6ac4f60262b5dbbb9e4cf3b6fd79dd3532a7, a47bc7cfd8efbe11739fe9ea34f70cb0c7e203f39c915949aad97a4862211e09e0ebe7863432f2b3215f9f2a5726f444 - -p_scalar = 0e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 7b81ecddcfc2ca46b9e0718a467f042b49a6481891dc89ff535ee486e03c0851ae3ecda2761b94ba2d268da9b28bdac2, 76efb4917a4400ab4673c23fd4c7db8bc7d1c011cc7d8f381b2408c6389da1632bb5dbde51445470c516a1303e999b72 - -p_scalar = 100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = a24c76d1da73b71a2ce33c2eee858bc3f02750715adf71d715f1ddc63eb317f94f1d082ed0e418512e7d0a16204be028, 93529833f5ba7d1e7d30553d5d1584db2eeedd5e5b8fe68c60a40a598afd219a1030e8f9fa3069ed610958f6938f3b7c - -p_scalar = 120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = d061fcb5f69a732f7c30fc84cca23e9d1671eeea9772efc6276d435bd2141b0ade8b59ae0034465b3055ed97444bde46, c04827c357449a7a8165f90e7d373069ef875d5fbce1ad6c0cfac5ddffd0a06e313f72d9917ff1257038cb0590a4b0df - -p_scalar = 140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 3ec851d706c4d48507b3e8b9191a320efce43e873cbb2b3faa299008a84ace074399615939ffcb3b139d9fef6bfc08e4, b38e4855b2075e4d334e875f4d641b73229074aecb099ec8a74862fe3bc654db495a234cec3ce2a3fc27598e5b447b88 - -p_scalar = 160000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 0c80134604501d21436c61161861628a33b080bbc3350983e151f53b35fce45855b20bc8b9ca1f6d3d7718adaf4b5201, 13b77a209930b29275dbb75bc326d08a7ddd686b4933eab396894f43048371c82c69dba7ccd2803c7a68e7f19c31059b - -p_scalar = 180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = b82c99d2e7c3018092587306f37f0bed46d4729f1771c5d3f05086ec827e6cf877253434ae2c30f292bf8c4508359896, 585becce769edfb1301286a0d8c94319e5e52c115a287dfba3a7ccb8e9a3dc7280567b4066b2250a11febe244e97b7be - -p_scalar = 1a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = e9ba9558a68b98f9bd1e67afadc744e38aa99096770fda49bc4bcd77827b62965a01e68261e78db2d859799609f11ae9, ff718f66a3d6334dde7611e9bf820beb2a4d8cbd770d5a3ffb7c1683a3134b499764513ba0f2774da362cddb35b3cf7d - -p_scalar = 1c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 2f6fb08031e6e76933cf684789a9d8aee4b51dd0c9f579443a5902cee85717c53aace28e3573ecf687451ca71400851d, a10da9d2f37fed5b473ba83c43e82e035d36cd365df670b97b289eae69aef653d28c010a187f69c7b40c25cec487252e - -p_scalar = 1e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 79512b8991d197c27b814ed800fe704761c1b06eee7c1e8878b310ee8b5624461fad39ee9819618481657860b1637988, a5c217cf3370ac799e81a6a83a12f5fc90e1d178289438fffb78c28ec5dd99f3e8b49bf2b8844a509fbccada25190c98 - -p_scalar = 200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 4ebd334b35f68229c85eb23d57d002931fad8b304521d7e612449c4fbe35109c72913696e37f500696a1e74f51e4de5e, 512b2421f10a98238d59508a4445773f15547e41c5e37994f984fba98a832a8e3d4b2590ab9c21d183a47998d20a530e - -p_scalar = 220000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = c51c0559814f7d9f39d71b35a50c71074a2d6ca29d6b6d55e462100285a8942994ee3cc9bc3e8cc1ef3a7281fad592da, 84431973e89feeecdb19650cba8830f3b5fcb4c90ece33d911a5f705ba3963ba977a9da1b98e62a7577c3de6acc64321 - -p_scalar = 240000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 381e5b521d3f2ddd9386a35d4868dbb2031febb3374661eaaed46bbc35052bd18fb9294a8cf4e306085e33cd9273818a, 723faee0d982a3ebfbd8f80058bbccab451d9d51b6f3e6960bb92056d46253424f03660a6236a50e56c75c5be869e812 - -p_scalar = 260000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 0dc856f4656e00edffe544b3f3263dfa315acfccee43b8b5e10e7ed2dae76c71a9f177e1273679c8fc9aea79a04464ab, 73ddabadb693e292ab3442bfa95b6db8da303ec64e018613aaab5e141efdad5a0f38ca039c5c9547732e537083052aaa - -p_scalar = 280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = b4315ab11afe8540cf6ba7db0f63dc797ad61b8ca57dbcbc1f719f7036fb5a4ed86e85a483e43c268f0e1908fac2674d, 3ea75d8ef49242ba648f43739f2d59dbaa7984a9baeb69763167a764615478200ae6960f77c75ae2fbb717aebda3b20c - -p_scalar = 2a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 7c18a7a8fa5753e85b6fd841f76a7b01cf6220d49d0216138213e04ad04e93359c03aa457c714b9ac4645ddfc70e9172, cfad7cbc14bc2872b5747340ae8b0d6d63c30f3538bfd28a48a143f3ca8df31c0e68fa60dde97002278b8099491628ea - -p_scalar = 2c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 0005bca678d1c0ec1a7c4af600d31e7ff4a4f3afab047cdb8ce2db1f4645152c64ba3bc73d501e010b262f808f1915f2, 08b971756d2d7e38eb6b39faf23c3dd3efa4622d039a848db05c781a0334a7095d664efed15654200a12eca1901a144f - -p_scalar = 2e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 8f21250473e722c5d76624e1c9fe92200eb5e4ff0b57513b30bb969b7a4289a53dc876ac1ac8a2fc9d420780b42108d0, 2f8425b13a3e5b657116a5513b69263719bc16c91610a5ffd5954b9afb73fc2dfc3f76208dd4c7d2131ff93719bf5b9c - -p_scalar = 300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = af51c5bbf42e0e7c92f031be99275c32ce5ab665d8d544e60b06aff65c27f5f6264a09f3f9288555597a26ffb4dc8600, a524d72265d5336447375920ccb2b0a80326665791d3352618c02d6606c04822a7c045947b8cabc5a44d74fae1c84c92 - -p_scalar = 320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = f2038e9fe8e9ad7b08d7d0b167b00a8b732a3b217f4e0b07fa70e3732c9139e3c6dcbc31b570e7e381eedabc8f38b7cb, e80e1e627072b0e51c5a91f66178175a5c6cc28e16a7e540e33de54780a9a6a0fe4ab4da8dae1f6f3cf2282d70341cd6 - -p_scalar = 340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 308b37a8d48b9574d1ef46340be2d8415267ded09aa9a5c005037f26de2f444ac6d97d37e7a97f33c760823646dd14f3, 06616ad0db0742c4ed9afa666400dad08e404743f47f0c44d2752219d3c638a4e2ae9625c7483e10efd08788b78452a4 - -p_scalar = 360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 4ab1773e6c85c123d67aed02d15b1f9de20b10f1f1021adf76cbc49717204f9387590cedf4db6d03c3db1f37120b62d4, cdaa5cb4d62ef982d33d06dfd82ad3b82bbd59cb0653a72c22bd3ac43fba651f1d280695af8cfc65a3b19b4b879e799e - -p_scalar = 380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = e9ecf6ce198c99f00f6c5993c82e2013e2f87d5e2973be1d4200e00670744f159fc75c0aec6afe4324496a8b7a8a6d47, 70fd207c430346cfb0db45dc0c26c28c1bd8c5edb430039e7169d0042f044eca410b4736cda2e26c34208dfb74c827d7 - -p_scalar = 3a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 4a7788de2d65774a2c8a2246a3e93b3391e674f5503557f209fd4dea45f979bba7f9f7519579f6d40c595629484cba20, 76d049fa10cfa0051b8ae5cda2ef7750ed65cae4122be0c7e280d3a70a077d40518fddfb79c4fb656a6b3a6ceb96f0b5 - -p_scalar = 3c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 30568303868326be1f28862ef23931d5623d44b9e4a0bb425bdd4382a7b62effca4ca7cd5a03c014985c8f4b0614348a, 9266f3e9090a365bd0afc6a2eaa1516d84cddb6450c0f2449d48b7864e18f5640b23fdcbf53b5eac7af2d5f37d1890fb - -p_scalar = 3e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 37eea04d226c0de31df6b241f5ad41bb711e5b378c68c6d120f84bcbc82761b390c700aaa28b9162a408aa1b48819870, f6eba360a17d1187ba90d00ec85b901f370744f7dd12e22394e369f18ecff85f9d752e700d32c0663d4f9275bb3be3d4 - -p_scalar = 400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 7fcf0ecc91251b6e64f27976d5d7412b1a6ea51a2a883b7f340c8ee3ba4a3301ecf10abc47bb619e3afdee277d221ab6, 76cda28580691fdc2c8c6ce171828ed40f7c672a2abd989221c48c29529e4d33c71b74681d1ec1a7a0c070bfc9a4e748 - -p_scalar = 420000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 7e3e4b94ddaca7970a21251f7cc002a4391e974f262a7c900fa492995a642da315257c37b24074d0000d342aee928391, ac4d8de8e7fbdfd3a3e2ce952754e5bd602003e8380b2fa8d4deb7e952773296442110fa173f71b837f3baf08bc1eeeb - -p_scalar = 440000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 63102e93ff029787e2a938890afc827f951f92186359cf06536c999ce295c45100614bf206b7e166eb2e48c10bf4e94d, 1955615451d5161cb783176f1ef117c8c948168ee33d0c4b3f6cb359379fbcfa8cab208a6d78bd4054d68383d53769ba - -p_scalar = 460000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 5508188555d35077eab1751b07c4cf3c9cd6be7b2601743ac8eeeb6ad5b89ac7e6a752c4783e3da875218ff22509a1df, 7f876cad80e31b1080ac017bf9395a31b34de2691ee18cb6ef35ebc4ed7a1d7f0d9a2f530e1bffb71cea455ffb89bf7f - -p_scalar = 480000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 3838356a53264b8a5239b5c4109797d6ae7b59c5fbe10a477fd7fd8eb3c2eff77db868f3a950dfa26e7a578340517347, da35bafb93241a0121950f007cd7d042c209b10a5f90c30c01e5527b9dbe5af49837910a96a705d37207bab4cdf573a5 - -p_scalar = 4a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = f27d64f3900000b28c140f1444bee3bf74ae1bb86f57ac995957f390ab2f9f38b6c4ad7e6725e6bcf7d0024dbbf692e0, c93e0a580608f90bbd32397bb8005fc96584d5679eaf205bc4a21f50d1af356fe39bbe0788233bdefa20da958d023979 - -p_scalar = 4c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 1969eca437dd1341ca98c4364aaf2f73c0c88af6aec23cd24bea31ad623e7e55101f055acb1b1cd5a319340d6e6c0deb, 3fdec13a97bb25fa581a98ff866ee3063c2ef96b8b0d9d16e6613f16c291563a502366abd150a4f794fc67616879923c - -p_scalar = 4e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 2117cae94f663d08e5bd0119ed5225f74fed82fbb2d8dbdf78482d89dae531a4ad937387f2e050ade0732f6de3a1e252, 8d4600665985a453c66519d477e41ceba2a18e47164a495cd694ecca40cbe0d2a761dd7e61793aa5664b811d15e06487 - -p_scalar = 500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = b942add81ef8465b860578cf416ccf69f307823e718c8aa3f9fbce33a82d37361c77a3054f1e0d095adf3d9a111792b9, 338563147ab01625940996b76e59d9cde0ade3d2340c3347066465723f6256f31986d10f4fead757611f3069326b8d1e - -p_scalar = 520000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 5f3fe3e3209d9fc047f02c4abc4c0e4ed15761fea5957703efaa521a05781b37a23f342d40f5ab43c72957c2b56c62ad, 7157cb46734386bce998fc7d6cd2be7c38bc6b8bff408edbaa881abd5153c3490354f35dee8ec754e3ea6721a9e4ec84 - -p_scalar = 540000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 84422ba89c2d7eb037b11137f15f0cd229b0341dafb73ad113fe0588ba057fe284c5d6a71a50c560fc9660a3c8808373, 3770f3097a3ab2ceaca17abfee91d2478f3214f360dbd5bd6f776a561fd288022857cfbff74c857bf4a6a53bdaab1080 - -p_scalar = 560000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = d2fcedcd2a1986bab43adf697bfedda152ae359080ec87ec825104bc4ec82e0f6dbc484f2356b6a44dbfa5831af13e99, 5261fda4c1925c1fa0cc0ee1441b396f0f7720215384d0631da230513cd2a7f508b26d973901b0a8cb6aeea7fba5287a - -p_scalar = 580000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 0c5be4a1ab204fb0ab8802bab8da8e68be6bd7b92c078aa8716574c5e9ae3da03d081c0d7f15c9e3f534f145e2290eba, 54d4376a8a45a36694acd76e19aaf2c37aac983b6db13d2d6391d31f44a32d01c6d62f277036485a52da3a12f2c0ed4c - -p_scalar = 5a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 58ec20b5fa1aa22b08285f05e94af0d0e9245a047205187c5d74a59ee05637183b0b3ca6276cf8c41cecc6cd72c1dbda, 4f1ec02c9526a9f048b631552625b7fd338b50c7007ed51c98a85a3f92bfa6d1f401017164a37b8a82c98eb03eddff7a - -p_scalar = 5c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 71d663c80482a61b9e9c222607f4b670c77375da47644b079d86bcac8b5c43fccfa41da6f89ce836b56b035e2a0349ad, b9eead6d51f3682c75d428012b22fc2164b9caa69ce467aff61f34d58358ab730e312080b77cd4a44bdc18c710dc8bce - -p_scalar = 5e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 1ddaad3e57a8a6ce086cf9d3c08d007d4980b91eae21ee2813a6eab45a5f233af7bd1613d7e0ea774be55e045320c643, 3e955126a81a59d3cca7825f07deb834ab6bee6e0f6707867f225943e83b1622b259aa24ff33c2bef82f3e6347394acd - -p_scalar = 600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 5016c8533573235fb1fae2fbf363100ac12df68cce52defb1004254501c4e17190cab0eb9d74e3f6e44e3f864b3759cf, 3e25bf2ce0a7984dbe389ee00ab1b789a540569ecf788d16cdb67a7ca5b1ee7075df2bdbe807b10d72b2149ae26dd164 - -p_scalar = 620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 976a426e7e387e5c86346adfc17b570aa537fb6be3a14ebf219a097cca4d32e7607683d6d30481954490d42249f884ab, 9dd33f7fcf495103740b47cdeb6949abe5926334a1df5215cbf896be7bab917d078fae93b4ff6bbe322ec0fa9b05dbe4 - -p_scalar = 640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 972877d5c351148008e952e365e5ebabea435fa0e9ceaf442a773270df98069e7dea27ea124874854df02a7d3088aebc, 82a0fa5c055e41ddb48d5e19e6cab8ae82678717ee376eac44486d1d3cdda0de1af541964738386910a97a08a65fb32f - -p_scalar = 660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 9c3eb2bcc338e60ca5e4a81611e943ceea32131487917fb3ff4d80e7182e7578122d7b16cd1909a4a9c5286d78c8e4f7, c578ba0bae6232250cb948a56ac704fe67f0783709fa36a7b3610be264ea29f31e36d0464ade815ddf1a75248db896e6 - -p_scalar = 680000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 762b3406c6577d810accb4a7922d3b253a998cdcc8995cace659cbd6ace07e138540213ea7a3f2f761dd7692f27eed54, 3d82ec206747984ac97ea21d38dbd7b54928d08319b6f7f7f7f5add98c46732b80871fd1733643a05f624b0b81fbc8bf - -p_scalar = 6a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 8df49d947bc531c51cc8fa418508b201bd7dd40b7a34781499b5020891035d21e8d66a73fbc1180d5f29d3aaa7d9e25d, 724eb5e24590c870c314181f86c6c208c04be66e5143f1c4a93bb7e8b51f62eb7ab245e80d096e80a8d33a9e0f3799a1 - -p_scalar = 6c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 490753350b7e4afcb041ec67cf575de55f49ef880115b9a54771281390833f18b5e8876c499a1455bfeffd5356adb6e4, 7972f945009f16bc020897663e1b074bcc11e91d866c112957bbce591912ae666244e7e02505265a52b23b5fa0f460db - -p_scalar = 6e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = d93bd14b4b11ac38c8de9fdf7506b004184b98d7ebbb8c4dc3c2cba3492a416a313c0cbcbb713c2501b7f6985f7f481b, 17001139e9c1cb5a7d49a5a8d893102d9cce21c6e64c77d20c5a4533f7131e466d4228a3609187deb8eee625ae4482b4 - -p_scalar = 700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = ada548c3b46f1e376b9fd3f7f19df4bc7f7009d735b193cfd8e497fff172c7cfa80a8c0d2771235b46303171491ccb92, 0122c58fee595cf0cc7fc5ef4887bf23d6592a2886470a33d5edefbdac61546910ddba285187106678391557385dfd8f - -p_scalar = 720000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 2d56966a409303d605de72b7f70a3994bbaeed33041120a96122ec75d132b62c870346945bf287ec264b3d9d11eeb9e1, bd4e11ef7138f960033b5ad8ea99eeaae73314f1990b214056f0fdace1baaa6455d3f1fe657bda944a2d59d718c5f4b8 - -p_scalar = 740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 24ad6b0ca28c80673f16d1ed3b5fe8d68ec00d9fc04d8cd5937a15f52a67b12bc1413da46682c7795d782a0778664144, 23261b17edf4c77ec88f1ab2e9428a4d2979148dc6c7b1ea8279c0a4d53f3dc69d3b3d4054d0587a22e1133bcd8cd4e6 - -p_scalar = 760000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 326448a0597de5b3e6361a339e0e1c54fc3e322c7496d0809030804ef95021bcd40b4963d24a2b6eb9f1b4ae3e29ef63, fdad564661686c1a9f343b0dd787a81dec8ce3d8ca45e7ce6950c0ef933810aac9ec4351f39de788946a3be6d38bad81 - -p_scalar = 780000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 20b358444182aa555d43a4a6191cc808919081881990c13c49b13eb95acc557287bc4d75b1baaa7ce3052838df5147e1, ebefe138cd93b2c77a493afab8f041eca2482f96df09713a72ecf4c6ff3a516039191f9d8dd16e188f2b65b698f4e02e - -p_scalar = 7a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = f04df323cee02f61cd5a7a956b1f77beee55d9e0594c44ac013ec26cee34c1dc43011b315c10da9bcbd0f599c8e64d24, 3bbf69ce23eb524e62019c75ee460c1830fe65422caceab95fd6b7d4bdc356fd4c3bc93dad13893632bfd92f26917ae5 - -p_scalar = 7c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 010865380377ba8f43a195425fed884fd7323e01a856ae6b6c8e22676e97f5af75921e487576c3ddeef03450e10e8018, def29fe91da5df8c2208dc13f5ee047cf372cd74226e7adb51f674806198412e39031a730f02bd7e83242f9637d57098 - -p_scalar = 7e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = eebb047e6d7c9413a7235359a60a123952d9264a3ba048ebbfb45e7b89486d643ee8c19f0b66d8180150d085890f1e7a, 8519c5462deb0512327cc059bdfec928225b7d2bcdf8790e8e1db2a7d9bd9a1e33bc0a88c290de96d5018d1666100cc1 - -p_scalar = 800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 60ad991e4e4eac458e5c12139ee4718f77b9b6dd6816b0099aca885c1a0d58e235414174e52691403c90a59f85adde98, a16403a3d6fbfaedd184b638908577d0a066f6d2bd5781cd345e0038a150c1545340b14ca43a02d53ff3ca97b28e09db - -p_scalar = 820000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 1f1b6cc936184c1f444217e60b4b3953db3e9066d9772914d5968b29ac900f4c39dd0be4c1125a63782903630deecb3f, 6a0beddc911e8346635ba477be864d86208b4383b4ea87e2636b535bd4d52dc62b2bcac9d3a4cff0fe9e8f3d8178c485 - -p_scalar = 840000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 9db0ee0b907f2cfdf5b944c9040b7ad4d4447c1b20eefa54e8804ab3329a0b9a9713a5e04894f486a31d3524b295958d, e185803564bb842bb06adef60ee8d432d4b835f9dd2b21101f99c4a54d63c2ffcec8dbe057cae89bf4e5e0c6ac7b5666 - -p_scalar = 860000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 2f6bdb104cbbe283f9c8e74d26b173fb5cd20671daeb6361192707699fd1661b8ad7721233e84ecf88f2de40a7b3fe4a, db87fab8a373755a5636f4205e779451cbe80ad85c00c5aef3ef46f1042fde764c20f4d91981c7ad073ccc7a27869ae6 - -p_scalar = 880000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 6847c20de211c90eed3a6508ea56be90d9b625dcf9ce0cde6459720f8eeefff520d0c4740dcd66f6c9898355ecf2a473, 9383f9a522c8f088b631239cbb8f18ab35370d882eba47ceceaa78b8afdf64b16ddd154ccfdc2e91c92794138e58c311 - -p_scalar = 8a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = b1516b4697bf25d1c1c0468307a8949bdf7187596ece704b26adc1564300df17ec96212c96174bf6bb114c0747f74319, 234f8b7da26d270d3ec2ee3caf38512fab41797ef6ba1c473dc159efe0bd95b5626c2de4999b269f627c05afb749f7df - -p_scalar = 8c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 02a37213fac8a477162aaad842f412c5aff5505f1070737afb8a08285bb5202d1ff2549ec4c9347646a95735f8171804, 2855e2dc8727d0655dff90df8191179819a817387d2fb6ecc8c56fc624e1a5be64195f4c60399878fa006dc86cd0f71d - -p_scalar = 8e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 80e70362a61f6b8e5b9d91d31e8f6424ebba130bb3663e1b6a9f149f55dcae398360743ca827378dfa8cd197722395eb, f1e2942a8d5c7363a0af2e50a90f98b9fd280fff71bba7f6581ffe8717c49efd2f60851db832c783f0a9601e20f2693e - -p_scalar = 900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 3a34819d7eceec8835d9fafccf45b75b22bbd01853e14183e09f04e6223a0ce868ff316015c6f7f5fa070e22142403d1, cca372c94887b183e61ed2fa9a17ff557188260fa0812395f37ffa9a614d5864bcefc9297be2eafa26308a982ccd9d2d - -p_scalar = 920000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = e70634860b99a9811d923a955e2994097a0a8df4a85fab6ec4a354244dc0e8bcd1b7191b3cfdbab92ca47e98ac1b85fd, be30bb9c9ae22a739e20ca5d78d04cc76fab008306d8bb083184d3cbd8b8ff39c7d3a6ac56223fc8d295a8c53bf99afe - -p_scalar = 940000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = a6e5585e996d20338e857069e462cfa8f60ce5d991f1d4875c240cefa3ef520288322d8bc225ce6edcac39d87c1d9f4d, e44d741ebff7641a073463d95acda4738b4ebbcdeb76dd6eacbc5f5d5cdce112326f3ebe06f8140f8f698a5ba9d7e195 - -p_scalar = 960000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 0a14f23eb0470188da64bf1e5628f2863ba37c232de1294438d28dcfa9312a5e224f404933c384e47b7bd39f39e00e98, 3bd23cd7f6e987117c6ccb4e084f8832807e360b62edf959631e8e954b5513d363724185fbb3c0d4dab94dae3e1d8610 - -p_scalar = 980000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 6189f5e41a991ea2da296dacfe7d778f186d3d934f810d8fbac785aeac0939e3c7c9e5f1d27d1f312bb6e7ec3092d0b2, 9098fb861dd105fc8df32c6f72ec9c025bb85ce127cfbb59f628e7b78e692056fb550a64775b2335f67086b269cbc9c1 - -p_scalar = 9a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 1dcb9da2e49ff45c55a12128a50853d180f745e27f7209ce78b59db06f2c572163a394e1404b5b23cbb76478b52110e1, d04b71d399dbe1c8e2ef514d62d0f2737abbe81cd62cdb014a6ae0bec24b6e0be3d26c9c7afeed373589b9b4769045a0 - -p_scalar = 9c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 9bace7adf8a7c0bacccb784f77921ca4d56ec8f223a1656e16ddefa50589fd01f3dc472a8e2c58e9aa452e81cdf60f9a, a5bb92178e45d85a37d7033885de5229fcc9b83c6d5df6aeca667e877c31798a58f3fa853cb1834a36b10c11ae0fad1d - -p_scalar = 9e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 7a51381b1772fc22ca98304759d16a8b665870899d73fb3bfb3339ee5b1cd14117a70200b441bfd0f943b61f038af8d1, 96e887694417a0e69651972fd1ec50d9c0c7722a479f85af48a8a614b99c265aa2e52adef33c7b57adce0820d39227fe - -p_scalar = a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 282358aa2ff95cfe76ed6fe718bd01b79f67567fe0a7ad0b990e3425ca7b8369b69e308bf8ae956575cba9d530a3ada1, ab27ba46c269d3eb4760c517e2326e9bab0799b3d9ccf87d69644d8d49584705762eacbf3329837ed72d15bfbef077be - -p_scalar = a20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 6d7604cffe8d69d781c5409e908e92f8e7dd1034ac8f1eb78fee1bd6e78c1828a32243ccb026239500cce541ad148e09, 6fbafa9fc0365aa73a0a9afccd9a0b0af6ddfa8996aa60d27c23b3294477842d6cbfc6a85c9edc13def7cf22d14d8e43 - -p_scalar = a40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 30369ea0ee12356a6aed101a5295e728e964dc9c9aabc3fc885253779336b2b939b1a9c697b17ee608ba5b61fde4ca03, 535f86cabb971be661ad79dc17ab28302e93857a5e5a1afbc4d08554aa6f8af2c589610e2060b83f1f7e1fde3717f1a1 - -p_scalar = a60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 6f261a720ebf3f5d30519b089ab91b5eea5b069985bbf511bd196739a548a22078cf85c78720ea377868bbc67f777fd8, 090f193e862f1739927d1b495a9457f4236b3088a6bd9ebadc722f5b116ec26a2a39b5a09eb96a1d88948cbdfcc19ed1 - -p_scalar = a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 33a95de702001e8cafbf32372a69ad0d093c3dc2769de89117779f5e7bbc58fef517c925b79aa0ebee521c0af93098bf, 0da686a7e905e4e91a3263c6354cc78efb0f44ccb035fad00e3f96dae9fb59b84c865c0ada438265c4cf5039cbef5d4f - -p_scalar = aa0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 35edc49ca54239bd0adc36938b9046147f82050a305601877ee84419f5dfa296664ca68b46f5d9044033ece91c1f582e, 11d0188cf60ab49f8e3622a34d5ac7164fb34d2c8f36dc304e7f07faaffb02a5cbaec45235298c1771f35c54ef7abfde - -p_scalar = ac0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = a1cae78c7b491c4d752d98f6018d7c6455d40c1b2eb7f0fd55f7680599440d4bb16ca18bd8e94e49291d65c801189d9a, 80784bbed565fd8df2155c8c16d9a90ba7c4cc955a97c1074706b6720556badf44b76a94c31132d8767037397099472c - -p_scalar = ae0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 3c9e1bb5534739e879ab7a5bc5b76b4fbe21ff8d02a855fc4fd1fd2cde268c8c809a6b6cc5a362e31ee1b6033b28bcbd, 607efe8f93f6250043fa333a77178b50fba0a540d96f3093c53e3d2c0d6bfd5c3d5d4ba17a5dee2f945b26595a7442f6 - -p_scalar = b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = f1d5b458dc7dd67fd6f1b8df647cad2f805b4048e097047f15b28ac7b871c3f3ee702764a35d24ea8b2fc4e96484fd40, a09139a277d6ca1e6c52df18b34140e5d7c12762d70d7b0b50eb8ae16aeb74a909e7a140ded8b050cdb3ad64daeb77fc - -p_scalar = b20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = fce39cd1e1a9d1708bc1da4093b5b983b727f6a0f7728c1ae7f34f712b796613950ef6a86c660602cc862ba801631411, 40f67e942f5f5010bd8f326581138444ebd0104e1bce69683ef160f5d38bde87a645acf0e72cb5440e618dc26b6cca85 - -p_scalar = b40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = f08cbfe771c4d06186628102bdf579e6675f12cca4fa74a94ebfbda7cf3dab12907e4f38199c51764b0c7d0c69c284cb, 7c3f6e6d14efc01fe3f8ea686db4514e7268757eef2e177e8352d73c8f3f483f492f2b73b38d86ea6221c6f2fc43e346 - -p_scalar = b60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 0e1f061a92f572f08000fb5849e023a3884a0bfdef058b6faa278acb01a177dc1c919775c21b9dde3169bc090cc65977, e76f6df9bcd64d74b1a6e8397dec75bc60d918a106c6ec23bb073fb50f65bfdade195a617df28192d33690d1241fdb80 - -p_scalar = b80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = e4c35c2244ab2fcc5bd45adcdc6938b91588c4712a3f012d38a1ec5ce16b874de239b1d404b6fc45494dbd2665925506, a914fdd7c73556fefb9e9ce7d9c15da935098689a44f0220c5f1aa3867d5b6d66d563c4cebb02c1178342601778ef75d - -p_scalar = ba0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 2d2542568fd9f423f6d41b65310fafd4a5591868498f151f764ab40ace8713c9023872c88f2d14ff40fd181041ad343d, 55bfe99b941ed913c624012aafd080306b6ba1aed2cd3585df42566719290919ac744d081e64daa2ca5e9ce9d05b117f - -p_scalar = bc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = fd96bd168940c7665927968beb0f6ca5717c302a766b69dad2d9da967e155bd5323bd638835a4edf2f7de141a48da000, 2ca57dae6f1bce9657c95952ac481916770ce1e9dceb3f31819c6adc5c2a8556b4563273278f6ab007608ac75ccb028e - -p_scalar = be0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = eb7c7b187673dfc835238e9ac5d8b3ccc2493d3db86726814381646777c6b7eab211af35bed7aea0a101c2f02838469f, 75f8daf946121ab30a2a7e4cb30007f68afd7f7eba32b20df0596f0febc4d676acfb32e69611d48965f7bb9c8b157877 - -p_scalar = c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 024cdcfd74a513932dcc51180f94f4d767ef024eb3dbe034f4ac2b677dec20d2f9fa4483d8b4d6bcb3984b176c0f3509, faceecdde21041ff5f3f019fbfbee3ea1334fade7e84372e4ff31aa98f9d34f3003e707d2c58beb00e3f0153df185434 - -p_scalar = c20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 217e60f334f621e52a4d3ec6d979444c99758103696866db3ee3d96da9de154c65382a2312055ff2a6730cb7311cc98a, d53087ca891c22910c263f79b32f780cc994b65b53b4d493a1639df9ce885428287a95a1a2c5d04019d7799f943a90f3 - -p_scalar = c40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = ab3ae700d1a378c565bd03584590bf03605e7a32d2e2bcf1d69b7c83177305ff6f206002d878a97a74faca8a6af7e742, 88f79e80e676dbb1e18fb3c4286db20eed392e971988a94e7d5e70fcb6d4fe2a7c9da51e583bae39fc8186fe756d64f2 - -p_scalar = c60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = ed111a7a3bd0c935557d173489ac563e8476e71696aae3352dbb2f572373797325d250419c736f9a583dccc1918722ca, a72c7a8de61ea42e74c88f9e59a0b4e3d2361fcb604aefd1b8c5ecc6839f12fc15e84c46eb22c13c5b83310ff4f9ea0e - -p_scalar = c80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = d363e435d58d42d2d9f3982e3ec5f7ff162cf27f36ba3ceb1ceee947c3f392126a55edf1c354f4334c98c61d097bde48, f5b063efada24330762dc174921ad66bafefa7d16dc3e5329e26b127283d801726e920a814040ae3d116f28552c997e2 - -p_scalar = ca0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = bc61bbaba368819180d7ec75226d534da72e9ae08144a60f51e4475e9f97151bc404defedbaf8b42178b590f1c477d9d, 8cf32bcadc393da81bc3e1425103c78da7150074365de7080f7713b7e94215c8e38b469d3a5f6e222fe55cf115d5157e - -p_scalar = cc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 218e7fb1b71a25a46888444f98a9add79be8a33f67d61b2ed78ecebfec57d967a4af7a2d749862107778fad7e65573e2, 9701037c09db99a5d63da33c01c42111c5c869a08e017b84dc96d07a0397c834d079ef51ee5ad32608a59487a0b9cdc4 - -p_scalar = ce0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = bba8c7b11cc64bb5a6581582454dc4f3d92b8ac4d708451051375d6af7acf0bcdad4e4b8dd0ee7526c79a60950a78a78, 6b6804c7bcf4254c2aadff1376e71f2fa78593186274d8e39ba61a7495527cf8d50ace5155af45749473bd3865adad84 - -p_scalar = d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = ced5e4cf2b4313900490c970f5aa2fc4547bd050b48bdd872e0bf749e05b18e763ad235fec1ceb74e222eba4a4dcefe9, 6da57183ee47a9bf27118db07276f567aa086fa1afaef2595b525dcfafc80316bb48dbbcf7c4a82bf827d8fcae2d7671 - -p_scalar = d20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 5526e694909f969fbc6d93d12b1ecf5da54322ea0b5c08c1d151433074d7b4608b7e7552cfc6aa6e17f7e937cdf7bd50, 172c700b6e2009a6d2e0998d8b96b6ddd8bafde0439d7969bb4f20c2decda994b88b7f12513e69928e6a565c8d93bce5 - -p_scalar = d40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = f79e2d39b2e8fac1bf3cd96c034d021b15245ac616c11ef494035a1f0c82ab81c749a6a77709a52b8357d8bb460e77b2, 9301bb39c0b773d1762f3b3a2587cf4ce90cb422aac571974da7b5542256530ccbe064ab4cebc408c78feae7b4930e42 - -p_scalar = d60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 7bd84d4848a7403bb88ee110d4c2aca40e7ca13cdcc93ab719e453d26360d0b1160eeaa784e7e36db3ca02e33c34e954, 881501194bc77167ff61ae14d6ed1e8892d5c9efd156ab6c2ee716f48bec18649ce66721472f0203d172c2fde357c707 - -p_scalar = d80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 058ff1904c89c9a87b6e3e4d1f54ef38a901f2551406ec90b28f476b59a7eb995ea6a57c699397bfee536a26d4bcaa59, 4cc159e64fe6a7adc1e6a87ed31f0696c1417bb9969b46519e7e05e98ac9d0a1016786cdba1ebd97a96f05f0035ab933 - -p_scalar = da0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = b5f1a6c4605f84ccade63185d292887e6000e8b97de5f75dacdf3c75960857e5a56359b898797f27f6666dbd1e720925, 3bb0c2563cf5389eeea64a12b8d49953019f27ebb13b0586f0f68848938f8c723d93037cb4d0b41eb388096c9e381f1b - -p_scalar = dc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 13db3201919c187099c2ff0b948ac53b031fc087255e8c5eab4bb08268cc66781f72c1f8911316f6eef402410ec537ac, ddde867460bcc82a1f71bdec7e815a9fcc5601bf42de10018b72d16c268e981c42005dd80085bb342137e02dedfa85c3 - -p_scalar = de0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = cfc013b68f5c17418ca6fcc4789fbee8efe3a068daa3ed3a85ce557932132eca1c048aa58f30fb6a7912ca4e168fecd6, 973e341dff8fb6e8de068776265f04d6b665d712989a0dcd9d3d2248eea57626c82692298c41a6872e67908b19319064 - -p_scalar = e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = f58b321ed1f9bce830bf1ee34f114abc72483dc5b3e1d84f0eed233cc25c696a5e9abf67d640c2a1da828fe556467257, 0f2f312caafcabcd275025cbe05d0f92130a9b620110779d625bc3148d567d2123d0efa0e1bacdd634d9a9b468adb0cc - -p_scalar = e20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = aaf3726a32ec147e505f5eb8a58e699214f3ee55fc5144da5629e0626bc5035c0a3de8f6666dcfb1695089a73532e60d, e8cd549cb669efc115a5eba2c50ed0864791a4b43977b0dbd17e007de5e271d60b631ae3815e1138b69010d28e148866 - -p_scalar = e40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 7f517c9c01f3f401b21e275d8b991b2903c6831675f0f13991217a6be34fe2e0e4d168e75b0b727bec22bb32205a5301, 70e02e42a8e91264f79b85ea72d54f45dbd34f94402db45347741ea3833ec9813ab8f7f6afbaeb4e4416a2e71aa1b605 - -p_scalar = e60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 8aed67b865bac360c6dce3bb1fd8ee17442ae6052b0dbd5d807d8c25d5126552b050787598a85112aad13b2f80f89c8f, a89d6b8cded9d1e0230226ba7aa42c857476445cabf994a497a643a529878de9596737dca9075b7769be36ee86fc7101 - -p_scalar = e80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 1690687e164c44ba8b5101310dd4e1d4b120589021649255e7d94f4697b97d7c243622f9e8a47507e787054518ba5236, 62c155a73a4f0718b2d325e37e33582133522150c6e52fc2d55ee8f83b9c568900000117f597b3c29a44b2740eff010a - -p_scalar = ea0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 152fe43844ecf2464c549c0e5375bafd29a9b8a5787c26f8979564774ff41b268a370b2f4897efbcaf2c49c193eeaaeb, 6f10aa28d18cfd12a1a49abf7b7b5ba56cec6d2fe1fcee878b5968cceced62e4ef5c0e0949d55bfb4ba25df0cccd006f - -p_scalar = ec0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = d4b25ed3883ebf03e1ee7508c3ff73564f4576a12c9c77446bdf53fc46c1f31b3024ce311a7194613d92ecc18f8802df, 38124a24938bd1e4969fced00e605995147d4cc8bf12cebcc91e8ad9a1696c09c8914404ee131056e23b9faebdf3c536 - -p_scalar = ee0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 1a0ab3fe3e1aa3b2da05dfc0faf576dcb6743901254cca1a54fe2ed1821745a31e6d2cc15044f8e3aed505fefec299b5, a3f8f0122452bc6ca4f9932141fd832f862af5e0da92241fa1ca780c059cccbeb235cb042119df38b2020caa49bcb238 - -p_scalar = f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = edcff8331d6dc79d7cfa71e1cf1cb8b3c11c95a22527c1ade6f0ad9bc0579c3e593f085a6dcf56bf5bfa10cd1ca459ed, 862ac252ff6e436fc04eb74728de2fcb12aaa1c81d9f913fab3c748e41c5ef83409dff68ebb1ee5fa7e3b442bcdade36 - -p_scalar = f20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 91d26e18089b6194c58fed0143bfa89695f4f8a7c76e93579b34ffa032e7bad15a5e1b61f59698d9f12d87d33dad94a4, 71a302e9bc09f3161236ec7dd3cd2727a829c0ef48cec82f84943c05000ff3bbde46285e57685ca53de725da29d42120 - -p_scalar = f40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 4a95f7f3ad4777a41ee7797f6590d0ecbc2c3b8d7a81382003d42e96afc190c3887071bbcac96dab4b98cb69c5c8a182, 20df90e64170d181e4ff04d75de8e3748a6011e374acfda50678b40968b3f570807398ad5287254985c921b2d572d8c9 - -p_scalar = f60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 92fc21e8098c5b74dcce4b866dcc347a56485fc5055a1e76d2413d03360766ac3a0699eb49cb60f46fe114183c5d5268, 39ff0bc8a4914f3f4ac168f38c3dcf7575ba26656fd737df4e3501d64fbe6b2569f15c596db30aea1e7116e1978f8516 - -p_scalar = f80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 0b2d3d2ee01df4e90f17d421a6542ac0bbf2d5477007f2e9840210ee61ff9d1e7734dc91f8fe7a42e6bbcf0bf8ed6302, 9cc5d53777ace27e110e398ef4f6001dd205e8933bbeac442303695191af27c87c9d084dbceef948adf1b0457b0c8fc0 - -p_scalar = fa0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 051860f8db9d37b374ddf359c387adeacbea730d7b0b1b3dc9ef099a6d40b18658ec13e188173f1b430f3082d997bb97, f78653fd02c0ba349544df3cf5bff034741b7dc6a382bbddd867480f5e534e39d22d02da7688686529abbc43dceb6e56 - -p_scalar = fc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 977b4bce597694b4780ec65de871b7928025224f7ad39d9aa441e5035bcf0e19dc504f01d3ce296729262b6d7636a78d, c816ea7dca3e95f09080d03b82ce409e0a259c1f0706fc9749963e29f3cbeac4e300785268b74ef11fa15148801c10ee - -p_scalar = fe0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 75c5b10bcac05c018d3e2eea122e7ff2b2f9d05f3cccc6b797a1f8404db70676b7b8f12986a52261b0428d6baa542b1f, 8be9dc2a6cd443a96ef018bdb5f15589a4b9b1e7aca5a799394ba8e3ab5a671d3ae590f619124430327f0f274a2106f5 - -# p_scalar = n - 128 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc528f3 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = a6661cc4c241720a0336aab8777a16d2f313389118eb5195c0dd449e7c1c39840f4fa5eff21af80ae484fd9f8258030f, 239dcab2a277ac5b2657eedda5791ce3b01f1e0434a02a6b5d85a0e4a022c7a4228968656461e382678db970a7efacd0 - -# p_scalar = n - 127 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc528f4 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = bbe34e740f395db4a92bb11bd6e0f09d96fde63874231e0feef28f34522c62792aacfa4c569604aff7753246eca101ec, c7e92a61e3948069f3d6832e367b2f949e29e339ad180b0e88d22a44a467c5195698bdbe018ad5aaaa6e59ddbf943cf9 - -# p_scalar = n - 126 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc528f5 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = ee82cb5d4c686f3145940572b53625a29c14d45c4d73654245b97c7577b60ca7135cfd8fd9f0f5f0ee101c5ade346cdf, 07b33602c5e1ecacbdf3a4d1afba7f8cf99d6754e04af855f9732cbb4f41b9c31525eb38bfca96d3aa1136b6b0c47624 - -# p_scalar = n - 125 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc528f6 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 03b2dab245cf48ae7ad6ebad036703ac9436a8cf3450356d50ea65aa46f614e270f25677719d6ada9612b8bc3cfb44bb, 8933bff572f35ccb7cd5a74bb0095802551f41bc219187aaecf53641e119ab8edf3fb730ed4f55a421953d2a4117061e - -# p_scalar = n - 124 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc528f7 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = b4bb1133ad9267aa51cb20d25f083167238df4864cb95a00bdb4385fa6f8277692f3dbfda1435507f9e5ed57d99f5989, 49a89c9cf7a12be9b9e99d533cfb098b9544dbb2d4eb6e31045ce25c5e93210c55a4951bc8a66567bf4d13ab4f115bfc - -# p_scalar = n - 123 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc528f8 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 8e4a4f6321dc82a6d4d6fd78550418d24b3d05ee4295440514a9c3ebea80907b46b07d4a2a1018fe151198480c4c0b80, 74c462ed1a798add03babcecc25ccf338a86ab0f498f447b5a82af3e9f30f7e883c6ba0470788c9f1be4d7f7a178b9d9 - -# p_scalar = n - 122 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc528f9 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = d109b62984083890da5fddab7e28aceae3da87e136a2812ddfffe0dd4cbeecde89a9a5422a1a0fad53b912fb21a3720b, 14411c67bfb77d57f6b8dd99613a733b02b77ffc1077afc76ce67450eb4d4ce0f0ef6939293f99667744095c728d3ee1 - -# p_scalar = n - 121 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc528fa -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 79cd3f1e3891db8165df3c959329f7e0c29afbd47772778a6c33d5d6ba6744e48c9a16e3a896ab1e5198ba40189dfa8d, 11aeeda1c64d0916473d0df9f8265b7e9c1d39a8b716f21b95507a54ae4d8985f5404f6be9028e62caaa8f0bd784019b - -# p_scalar = n - 120 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc528fb -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = f392f9632f3b0feda03a6787986794dbcd411e349499fe4eaf07a03eb8994b40d3259f2810248af41b3ea621f3c6f15a, 539875879a1da4c861bf593f532e0ecc3c967a464c37dda4ccbe6fba3778c83889e73d9a54d7c388f37166f8c08a1237 - -# p_scalar = n - 119 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc528fc -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = d2fc5c57998b057713167fb8ec9cf4cda4630ba1875fab27cd55e7b421cf9dde59f9078dab73bcc4732595ac7329d8d1, b16536288a40a5cd9a1bb1ac9221b7a3eb9ecabc9109b7e5d677a64899dc8f46b2db96f206cf9ceb761360c15ff51b6f - -# p_scalar = n - 118 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc528fd -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = b8027be64a5eed689d19bd63befa48da4496f5a023133af12541da528e6a2448d1f2d42a406775a028f0ab7a080bfca5, ab9386aa4a3ef7e79966399f963aee20f35524d0b44501ccac13b8149df3fd7307819492dd5cde2308c7d5a296b0684f - -# p_scalar = n - 117 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc528fe -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = f26774cd7823568b517a6bae23acba53ad9e749a9aea738d613e5294fe8579619532b30ea229d070fdcce7a80723559a, 70509ab082b097737a546582bff1585ba6729b8db27984816d99c05f06aef600c6cb3a4beb8c057b940767a1ae53114d - -# p_scalar = n - 116 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc528ff -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = a40dbba76a0c98442700a45b812fab5c2e56dde7119ced404060d22edb6e808b6d812dba7e29445309e7d232ccd1c14b, c0ad2701581c66c57d04f5b9c910c402fe084c3f269a8382819b165ec127165cb49514f0e988e2f90a1c7cbe9cb66303 - -# p_scalar = n - 115 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52900 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 274c69657350982d84442a4123c50746a97accf432406bfd33e868f326a488269120f7b3a043456daa4e673b34498f56, c0c5bdf6cf5a11db75029e32cf121f03df9a343af6312ec600dc39b8848a5b863ebf1db1ec7ae2413106b7fb95dc9eaa - -# p_scalar = n - 114 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52901 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = f80f423bb48af0e8e53bd76b6e4b3bc543c2a97d5743877a559b40a286dcfd8831ec9ab137796cdcebbc6b4cac6a280f, 0cc71a320bc4646e499467386204acd06ca075224dc4a5e8da508de78539d530f4a727682b1c4f45390696a8d488cc7a - -# p_scalar = n - 113 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52902 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 869fcd17ff86a9864a5bdb048d7fa0c2e9815b09139b7fc5e72215ef852bd27fd2c616d1bbe33572f85b86b79b0bda12, a10b3df255f7944b3d0ed17c31b87757bf7fded9fc31bb676998722ae7b12029b9c007f1d6664d043278521791daf6be - -# p_scalar = n - 112 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52903 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = b4a6714762f45dce83f2fd2cd8296a52fb25e37c9710b70b2b5609d5504c81290d20370a5d66455a2e20654839d6e2af, f82bb94445ed204db9a19eb57c182141473e6877caa846883e7ee43a2ec76a1716a71ccc0b6c4c64a818b9bea15c6a6c - -# p_scalar = n - 111 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52904 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = a158aabcb9bdef14c3907b518b02667f27552012c727be036744720b50447fd908e0805000765fab8db3b74805be74b8, 09ca776808279da9c64b47b82300d9feccf8e1f94aeb2685a2ff54bc93c326191095bee4e305fb96aaddfa03f49cc56f - -# p_scalar = n - 110 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52905 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 26956a5b83e5bd0bfa63d67feafb4dc8bdc1c92475053732ce481ae68d2624c8a4ba394e85d138d693f846d4906ef776, c59ff978106e08bfb775af8769e4422061d7272e75c0564abf9c791c76e941515426eb05ff14810bfac270f270cae3a5 - -# p_scalar = n - 109 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52906 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 6e3c27bbf13f24033cd18c33b9cff887a911a58af0d93abb5841c5f8a8dcbdc89c7d35833cc1184b0efc2e27b2deb1fa, f4c46c56198c770587e19a4e7f7c756875ad33caf5a1411d2db57fb4f560daf435cdd90b54294c055b391712ea533ae6 - -# p_scalar = n - 108 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52907 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 2a532f0ac16a417882f24a114cb0b8671b23e3f7afef0b5d589f30567bb8dad3d81b74529a67044fa26631ef443c7161, 629a90bf9aee303f7499b3191ed0dde33c58b5e63c40024984d81e8e66d45390a985daa26e4abce9276d170f40383ceb - -# p_scalar = n - 107 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52908 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 77964d793f740b4850994c4960a91622ccd4f456753f40d027c6ec25a0075d4673c21e204f761490d718e8e1f4363f23, 5182a7172afcedf2e1d99f78c7438e3995d6ad45b8659463488374d1a27f3f9f844fc79ae4193d79f4c955e2f647ed02 - -# p_scalar = n - 106 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52909 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = b380f170bff65e1c2633179cfa6a8ac6442e0f1f36905deda01780587776c7fea1295b179d724fdf3d303c72138de192, f1c69141971d1d5bb5a31d6abf10c960069f47e10aed184b1e0b982b4632f0a407c34b8181b17d37af66ced6d590155d - -# p_scalar = n - 105 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5290a -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = d0ab3e3a99ebd09c022c75441a806542862ef39c275075e3077f30e5dd2c23bec367d6aea6e201bce6e91985e5802845, cc3ae72c6d8973a5cebaf145152f1923d3d57a9547202560372c23a9a91fff8ca5cf364fa9ad136b7d67ef60d99028b8 - -# p_scalar = n - 104 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5290b -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 7117756e39dcddad381f4f06f473127497d1e75fd9f408b53dd4f91683002cf1cfd364cca03bfa6367126ced901410ec, ed306706377f04cfb06434324e2c7f76f5f40731eb8fedc1f3513c3b9c9e5f9ca3b9dd6e230c2f53e206f13b96d88ae7 - -# p_scalar = n - 103 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5290c -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 590da88e64671048113a7902e3da530d1ad95a94f23d84fcd3f0d14329c21de1ddcbb10eafd402bdd24cabaa21355d5f, 0c9e71377273dbedd6e2d5a62de40552601bd1c358fad1c397ebbb4ed86f4dfd1a52e4e7e62e6e0bf4a58282925bf0da - -# p_scalar = n - 102 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5290d -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 180783fc39489b2827c614bfddbdd7a57befff1cb90a319f1c0f6241bb2863c829591fcce7274c8803802ee80fa4f860, 60a4d22a26f6a5df4c6c8fc838175105a47fbda3bed5e5259e8d5e0bba3a023a5464baea1b373ba72a89af6579ae9e06 - -# p_scalar = n - 101 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5290e -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 7e2392bf7bc814db9cdd943547a18710d73b1fad8b8b5cfc73ddcd2c2eccfb1ab539f5fe50c66d708e66c6f69b8adeac, 73872d361702e1de909b656f420ec104a73e1d9af53e80541fef41850ad68693ffeddc211d67c04d914193c06c8f74e8 - -# p_scalar = n - 100 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5290f -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = d884d30b2f03f287419f4d2eab386382b0e595a155fac50e100134e2338c10e0f9d9c4dbaf282e57a350c4fc01834066, edc690c903e2fcb28a8aecc74afdb92910fe926075034f722a4dd35433dac6b48a14723f4922997f4a7e5936f6075163 - -# p_scalar = n - 99 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52910 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 648c5f00bb28223ad49cae0982d9d6bdb9b2e6b479c8f8bd1b41177c708ba469bb4f9e0f41aa174e6e3835a9b05f84a1, 03e1698b322d63bd1f7493b176190d98d6f759d8d1a0ea086675138f708247e1fe3096dd81a0a38d04f485765d8cc4a5 - -# p_scalar = n - 98 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52911 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 458ac76d0f40ec396e6880f15c434085ca861b4d97740fcab1bcd42525fc2c50f05e0ddedb37f6ddd2872262b0a9e00d, a77104bcffe021f349c17dbc262820737b96a6edffb612df003c91f554ee9d59d70204dd7088d2da5fd094ff848ae412 - -# p_scalar = n - 97 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52912 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 8c081acd170d807f87b1e51bac06961610241ed16fef9d9d8f273e3065278f98c1f0db004a49492c7cd2035d7f5c54e2, 83c6b78ec4f030064c3e2491c4f56964cb47e4ed7889a39ed7d24ef430e05dd3e4eb5512d6865bf4005051ea1c73b598 - -# p_scalar = n - 96 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52913 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 8bf3dccc39c18b96cb4aa43c9741eb4226de4c6581998af2ee21597e52ce08f68fd61e31148840d4dc5293851d15bba7, b257fb6c5a4434a4cee0842f5d5680b8f9d19ea0c831254b8545396f305ee4f0507e24057dd87c3966e1d5dad872984e - -# p_scalar = n - 95 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52914 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = b8f42fe52fead1e4257b0bb5ad7f23e10be90befa27d2b794a607b9d0ef989779f74ca169bc0cbb10fc0f2630dbc3c91, bb6d4ba542df286e65364ded55ab93f98c0f64e83bc7b59145cc3f14dd99f9fb505fe7ebfd79617dde78e4315f93b592 - -# p_scalar = n - 94 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52915 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = ed9602dc7912de8d89dabf40cf9eed19f4db0ad3ad1bd1192e2bfb0c25998b5d4259f70ee435a0deb134a04174225251, 843c41be9c6cecdf6010c639db73da1103f4f9dcebcddc087d15f243cdcbcaf878632b48408989ef585b6d18c19f9213 - -# p_scalar = n - 93 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52916 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 813355b3430aa2d72df91689cfd151547a3545de7cfdb00e1c634764b16142cd1b1cc24f5380675eebd14d71e32d80af, c071f38f66bf9d09c71b395490a268e5572a425b71670dcbfe7ca8103cb06698d9e303f7e03abb7916dce2c985f2ca7e - -# p_scalar = n - 92 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52917 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 1031cbfcdef715d74efeec75e724f56cb8a88d32c7b6b5a626905570df79b6048f97bc3df1b9f55b91b6e58f1036e450, 3e080b351a206fe25e43c16b90f38d1d3deda082a8a691f9a4d6871d472ad231cee9644726ca94dcaaead60f2dcb2306 - -# p_scalar = n - 91 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52918 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = eb0f52348bf223b0e7e7382759dc3eb7b04b977d42d74f5fa4f6e534bbc2618a35c2421b14ae3f635dea409c9cba0858, 47cac703f116c6e20b09b3bd9ab88478cb78e0c863a2cba009d0b3319236343dd012811a3fde2c6d991c51670fc75158 - -# p_scalar = n - 90 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52919 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 4347b760969bd7f7b560d7e63dc77e7bb34f09fbd045d31e28bd6aae6e6e8e57672649def3c36ba79b35cdf7a7871029, 9fce477feb7d3671effe5f50722fecaedeeb339129c4724952f2cabe13d6dbeb23ceae28feaced8d2f161a085e5496e5 - -# p_scalar = n - 89 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5291a -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = d0d105de164b7361d63dd29d19e0e2b667d3644ac8e55b7b463df30b0096721f18a49fdc4bf163e00c62094b2d71d4ac, 01c7e939b8df37f31d28243540b962d9147701090b4de4c065ccf0512daa253c7861b71b2093cf7ee5865c4e0217188e - -# p_scalar = n - 88 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5291b -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 9398236759e97922f158f85541bb965c782840d1edd794907774056232329baff0041e2423786267db52eb03d1db891d, c41a6fd431583d521af2a631ee1859834284651c3e6724b407f97c1df8ba4302a6f5384c2f5ccd104b40ccb8e384778c - -# p_scalar = n - 87 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5291c -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 1c1b3417a500bb22c4840320387b6b2ef30a928d9a3c3af1df0ec1ba8b80919559424730109677754f11a02e4aa0372e, 9f046faee996fe68bdac81880e7b4db731944175e7559f09dedf2454f984a88f18246d74a7909681690ee6c7bf3266f2 - -# p_scalar = n - 86 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5291d -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 94dc48fab7e8cfcde61e6c2984cb7e449e30229d0a06f838361494cc0b162b571234181c1dbb4629c7364268d94ab449, 43d6196f8de4857a143c6e832c92df61a32f70e6a0c3e1a57a9910d501c47967a4fe5f5fab20b37f0d7e44f289b66806 - -# p_scalar = n - 85 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5291e -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = c835025446e64d4db0a08fe1114e6f01d953aaff73256a577bbdcadd053153d82148bbb88207255a935d2cdf9b06762d, 6c218d92c993f213a231839fe2895195c3d455d22caf52f27422a72a0bebe314392aae0271fbe969e7cfbad800dbc157 - -# p_scalar = n - 84 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5291f -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 00eb5c040d16b7fcb048b60e740c04a52686cba73934e93664a8bdc7c791db8094b80b8f691e858b3c712c3c6323cd05, 3e5c6ffb3adfb941dc98abd94341fd4987e3e34d8d8145a014e572f21cce9e0d9ffcb850d7c9b5b080c0d8914ddc8276 - -# p_scalar = n - 83 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52920 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = a075b16ac03d7805c25baa03520a8926eeb88ca1c7a4aab58487aa0d4a6694eb44cf847ed2f05eb48e61f0bf44e94071, 773dfeda69ce1cf9b72a7cd0563c78e40aa262ba2251bcdacf21a95749e604294e3c13706009643ec357a48a13d970c3 - -# p_scalar = n - 82 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52921 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = e6db24057f12bea3dfc6d038305bfc7c87e75dfbed69216bd6021049cbfbd0c2e8c09f59ec5cc866783cc5bb88f82a12, 6009a59ebcd30d2869eb7bd2feee7fe5ed736fffa734994fe40d04ef6068512884fa39d54bb007bb6469e146b7a3a2d2 - -# p_scalar = n - 81 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52922 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 0984c2e37cdf344f11238a859f436faff2c3118feaf138afd8cb3560e07b1bfbde45473e86c087853cbdd3cbdb06f682, 9dd7b7609745b87e5de38d63ae2706a701047a5ee5dd278d56add2f018f2637d959a14d4736fa240e1083c17c382584f - -# p_scalar = n - 80 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52923 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 1e8568cca446324620fe8c27a715ace6dd2ec6d351fea1dc49066428b121360923e5c6b90e42d1f9194924b4ad0a415d, 530abb420614a6f9b960b5efeecd8ae42413063a1378e68fbc7a903c6484641d98e97f1cd923637700c213bbfcce7e6a - -# p_scalar = n - 79 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52924 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 23b245a5d53912dab3cc818a7069cb7c491c312dd15d01f0e58901a204ca55712cdac248c3b74585ca11d9d4e9a6c224, 4b9728f81d7ab255941c66c9f30281f9617b301b08632eb3403243e9eeb95ec1a052eb3e3277555230f7838ba6b0b163 - -# p_scalar = n - 78 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52925 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 02781ecd4db639eea1560f9775dae55bd35175d9a506191dd3338ff4b743bdfc47842147688c1ced3c80145ddb9f0b60, 3e795421ae8fbd6cd47a03074e3c8f2c84238e64c4a7a4fbc4870c9dbce600336c62bff32c45eaac993a302d23dce536 - -# p_scalar = n - 77 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52926 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 63d23607fa5c9816742e060b28a126270ca930b998ce78a327ccb6c0212a6125114a9b40334793a79f2134c12a501a3f, d44b1075302cfd2ece61c3e5572941a6dd03950030c9cfb21500850e49fd3c3d34cd7e2ef34d1d23774dcba4ec1f91dc - -# p_scalar = n - 76 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52927 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = e677b97c61007b808b8d434e90bfa219a7253817daee85404552fc68956bce558c547a520c8d74e1fb2f775e4230e336, e7871c313937b80f64172dc31901ee2241bba1911ba3dd06a7a69a24e4f855bf96eb8cb3603263f9bfeae6f2f71abc74 - -# p_scalar = n - 75 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52928 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = a1e0ae0fe6ca7a154a7ee23df367b5c85d4631b4392f8f665b28cf8991549a96c8cbc40a420ab7ef6b5d4014867303de, fd42d862417d6562d7870042957fe44564e239e3f0402e1d6762ab69430aed71a531c2c450fab9012a655ee1139fa27c - -# p_scalar = n - 74 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52929 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = ca50bae743ca3e45a0dd8e3cc10c4f6c40d420cb5c36dc4c02ae1f9150f6a5cc7f3bc516e1b24b64126d4cde13dcbd9f, ac30d6dc35b9ab9eb9dd7248bd7085c75aa7e563ca19ed0f2458c9ef13cf22bc35dd6dcf7125d169f074bee9efdd2b40 - -# p_scalar = n - 73 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5292a -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = b89d83e72bf4673cb08db04de8caa7d29029a9252d3731c25b8d230bdf8b9b24a9c2a9b11de8963b43385c32d851a702, 6f65af3b7c98a1620b15740387b8637304e21e0392265a59af9fc87b4f1d216e9f89b6d6e1e8d616a8fd39bfe1f24424 - -# p_scalar = n - 72 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5292b -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 0966d45a6517888e2ac250f6058daca83b7debe494eaf32810757e2e3f599369f4445a249b234eff668240536434688c, 312c1d2f36824d3ab010acdc097afa217854f8bcc3f0ad3ac7b43619ab96774699cd9dc9d77437097555cc79e7693b1e - -# p_scalar = n - 71 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5292c -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 0b4faa5a537ecd702b123738fe255dda27bbde143508ac5493ba15cfe58d0a92bf5731b3abb11441c42ece45effefcb1, f9a7ea28732ad01cbdb924ee071395662144daf1ce64373a154f285025b3e31986793c4d0801523d6a44d084ddec83c6 - -# p_scalar = n - 70 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5292d -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 2bd44119aa9079b7d8436f83a2ce4101a4c793741489a3c09c2e8aec0cdf6d91edfdd44e94cf7a32bcef0b6a37548a32, 443df50ac7469f4a5c599917d3a76debc4077657cfcdb6b7cc8ad6658c725a7ce2a2b0996761e5389f0415bd9bff2a34 - -# p_scalar = n - 69 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5292e -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 59d65d78a3f735f42c86ee164fdd3ccad4bcc8b125abfd65cc66c8aa0f19981b5ccb2859a1115e28f8d3df74670c2752, fbcd0100271dbd7a6f2c9e8b73167a320aceee4882ed66bcd13ae4892bd423a457769d6245d3994d035ade287c0c55ce - -# p_scalar = n - 68 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5292f -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = f6a8130b3a7741e35508c2b38bdb088aee34bd1706035fdea4160def7fe6923a2fd77b5ae6018776af78aa17286ac2fb, d467b0e82fc4663ed9c5d61f09f68f4c29b049577e0fca014277e8927030cc9a59a9e6886b1e723fc02ed662797cc7d4 - -# p_scalar = n - 67 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52930 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = e462ca48e153035af9af3e4d90909d25556e637e6ef3d8f765d75edaa55d6185eac7dd3b0b634f686efc5cbc8b1772ca, 8322cb8aac794994096a6bf01362c5f95990b746c6ebc0031a7e35ed3f59e4bc104ab1a642785d0652763b7b0a109ed1 - -# p_scalar = n - 66 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52931 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 3418c841ef19aa6cab34164b3870beb7acd0361f5decad089983c10a492b899ae22c691d99c0b909b60fb64e52990b5c, b287be9507f55d0492b480eed70d6c3a6fd331a3b0d5aea54ed3fd192a684508a580d040c2c889076cf203a6209b336d - -# p_scalar = n - 65 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52932 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = b84c3a6a5fd4266f8b0350b2650b22534597ec8abdd5f002cf9edc15edb63c80becda43b0d1d279f8e469454839b9679, ea6f2528a55bb1c9a2866c24c8f9f08719763d6d889d66ddab784b2cde2bc266b6a487833ad995d30e16d83d30fc79f9 - -# p_scalar = n - 64 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52933 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 4f5d5ab6d1b30e5cfc8e87cf3be44d56a309199dca57b7bde04b3d30f8a0580d957c980f297a9a37ed4de4f88e89b258, 888b708b9404ca513ee127895ecd3fe86d97cabc301fe259fe51bbbf1090fede0fd1c52df091bc01b213c6a030a9325b - -# p_scalar = n - 63 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52934 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 1c9bf0b0f1e52d1ef6159e519a049f7acd7e35f76e2b71aa7a50f7458c949f8f6ce8ead6149a1896c5c0e6d7aaed89c0, 52bb3712a0a689e8f5af7b8e3735df22dc89bd4997d4048d3bb034e888d17f198d3a5f621ecd7b1a3bb6c1f518202c80 - -# p_scalar = n - 62 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52935 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = cb4c0a54561fedf2d194b7054b14d11703b9f1cebfec21da0c7d749907dbb9af1e659730c1fb476e49a04dc0f5acf772, 0902cc23149446b8cac324ec82c4faa73d2508922ba9239b65609e59d9ff0aba5f5e9b1fd630c145af623d3f21da4d42 - -# p_scalar = n - 61 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52936 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = c93ea049ef6ba0062366467300fe51fd5ff77ff2332982d06035e34f772ae08054fb5a34222241e848da1fd3fc60a6e0, c4cc11451fc69829b0a6c77201466d230dda19ffe5275767e6a7885370d303eb394d32cd6ae9f4ac6640f1177d381266 - -# p_scalar = n - 60 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52937 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 95bb80cece47968c61bba736a55b527784b7c2fed74cccd40402d5c4eb809f85a61fada6fb4f60e8c711d5d1c425543e, 8dd21bf0b4ea4f5129fc3b284892e676bb45a51f948a8375acd70b86ad2a20fcf0e0f4f7e682aa2909f92adc16eb7b95 - -# p_scalar = n - 59 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52938 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 9ba039679267b6463703435b0de64db996a917cf1ed0e31564473b595c322738dfca6897f929974caf467ce227bf64c9, ff336f12504655c196d9ba0bd9e3ca196fb34b3028463cceaccf2edd7b05970341bdb741b335eff0df0c2aae3a522fbe - -# p_scalar = n - 58 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52939 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 104cec0666ac72e09e9520bf57acc87aa58db4ea4f96af4fdab9dc0015b0fa13341cf9d9c46785af941c5c257d0be180, 2b51995f794da901c08595e35548fbeae11699e909fa58a1b5f157aa569b57d8b8b4ac9ffa80380a9f3f7baa1929e675 - -# p_scalar = n - 57 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5293a -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 814d7fa07a78c189c052f3eb1c99ceef1e9dd1509bf446e0a14967dfac4bbf6273bae4c1694b8b0db14ba61cf97f865c, 0a823b9a4b26df63d2e130552952c1fc8f427bc473c81d5b0d60bab7e809a13c7788c258a1737b65a101a483ab74b05d - -# p_scalar = n - 56 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5293b -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 7772a913e6436cc1e9981ea6820da79f2629ba4fd1deca258b6fc785e692fdd2d4215b4fc7a8baa1483350a5ebb8cdad, 31ff648e0f88b82d56fefff326f349ce05826192490bb572b623a1aeeb8cc21c28179e6cc852f64bd141235c553fb41d - -# p_scalar = n - 55 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5293c -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = b3fcd5d1690cd408fa5cbfda60f4554f6078d8bf085faeb3a4fb7867e3a142d6fd6622bc1718ec3cbcab5f60069f3367, 7460257314ceeed46a91e73997d0fa0617c6b5cbbe2334f88de3107c3d079f6182af23aa180a63a74ebdee7d281f7884 - -# p_scalar = n - 54 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5293d -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 4576a6497cb8944248c075daaadd6150075134ebabd64a6acff00bd23c9b5a41ab2f15202175fbf411853add834e6c54, 420eb673906a29496e9e86bb7b1eb77a1ae1dd97d13444bb0bf879d693b44ea68dbb571c77fcd1f4340a767034adeda3 - -# p_scalar = n - 53 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5293e -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = a8ba8f10e0f383ea642ec4e615c3aae2cf485c74a7c54b160b0110610f0422a2daed7c268a0915cc3b1bddc6fbde49ef, edf2e3eb7ecc9485adc93d9a481765e2d2c71ad1390699635786a19a4e2fa83eebec6442089efa8b2a2054b495618501 - -# p_scalar = n - 52 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5293f -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 4b820d9b31d83660252b48f5cd8d7d770bedaa85e5377c005687d1dca6ccfd358a944b316b3262328f6468656f9201b9, c5cc339dcba1fd4b222465866e5ede7690e2aead7f78aaf86d0a166ced3c3b7a0a8930fc1208b9faa9e5af3ccae07f15 - -# p_scalar = n - 51 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52940 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 16634a504f35cb3c3dba16e9daaabc27464ae8d241a84de7a5e0fb598c5a78d91947c0caec4a22b82c4ccac72070ac8d, 518b047dcbaa0d97c69489e2373f1a0d0b2240003c887d36daeac0c3570543f0324d067e7359dd35adc18bf9b16ec84f - -# p_scalar = n - 50 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52941 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = a820e8303a5d50d19cbf755b46f97ac7beabb91ac3c90051510bd675cb2ec3f1172cfe4ecb5af900a96763d2fba32d1f, 6f58fa8b7181c2a16f7bfa7e13a4f7d6c1b444139333e4056124642f0f32b151df7dc7053048461a83a9f17e308c4545 - -# p_scalar = n - 49 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52942 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 0b470bb250e4ea9e1197832bcea03f5647c56c115b6e3386a669156542e365a48ea5af63a5ea6fb8fa5c3aef697136c6, 2d1cc518e28b2bdb771e64415b57be2f2487edd57f82bdd3fc4486ee49c9ebe88d6c174ed2497d483113c74313b25712 - -# p_scalar = n - 48 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52943 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 66e4794bae7d740062e5c5d3e73a1bc940d01ff53a7d2f3c4f504e06ea52bef92d368d48e7f30c2b3ccf806ab35bf6cf, 271e42a12624a58348eab00eb5c9462c2605ca009da2a2ca5c3ca10d04bab9854580609da766ddf13d30625e5ffef312 - -# p_scalar = n - 47 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52944 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = ea5b37c5da233371504f21b1570cf950780abff7d878acd0bfb185125f5b07a065c788785f0dc66c6f888f7df0c668ca, ac9dfec7dfa72a8beef006912e20fc23dfeea1a265e0fc91f86562a898fb34ff9c701758249cf9b7487ae8bd22437ed1 - -# p_scalar = n - 46 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52945 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 374aa9069481ed0dd9c79db8005412579266634957719f5460976b01b472d7899f24fba649ddd10ea618d7479fc4f435, fc539eb3e259c7dbc82d5998ec090d0619ab802314eb4ab9d7a198a4185a849ca1590c30ecf5864360efb1147fdc2d7a - -# p_scalar = n - 45 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52946 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 9c94c858b2ac340599e1c0c61f2bb599b0040c0e8d6fcf13ffe8e0bb39eb8f59d4af65c673ad9112d4c411564fddda5b, 42eb2979db83a48517477722bd2af19e16f96676b7234e93eb3b44a9e5b5691862b2f54351fcca3f8f8878d76eeed85d - -# p_scalar = n - 44 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52947 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 9c7e7754a320d35204ce2a21986c5ce6d50a288981ea36c2767b4ad7f8f99b51ae97af8bf240b30a1c5f0e5b36a400d3, 5fb28e322a1dd73bade6096d02e543ae47678afb27dda8e5c680176505c7ad6c7cc82a4df1698fb2c3336331bbad8346 - -# p_scalar = n - 43 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52948 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 35178bad22dab3935cf095a901fefb567314f5f0416dbd86dad9f5b239c4943d09112fc50578bc8c37fa935500846d44, 8f3f1f63c9632b78a974b09415cbf948aaf8e0f6bd0628dfbce78aa9ede314bb1b7ee42d749e5498cf79fc1b36baf1a7 - -# p_scalar = n - 42 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52949 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 7438b4933c1e593ce983e169ffff96c73fd72a308f234c864b21c4f3eb6c7e6231b22efc5df46c6618ef56cd5d76b881, db6829c2f002bb6e50029568472a7175e739fb61eaa6776325d0caaeda1eadf40d959ba9796d9129863a23a3a553e8e3 - -# p_scalar = n - 41 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5294a -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 8764cd2cda92245de3bc778895fd71ae89746c8d852ca03573a82933a80d68f341dfd24d456a201ead148e87bca6d14c, 82ea702eeb18f1c5679952c7d193272ebdc9d6c34f9f589a57860ce121646f315ac762e00f3c9d6ea2fe2c4782eb23e2 - -# p_scalar = n - 40 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5294b -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 51c4b1b36a4d6e813b021cf316d7a9adae78bc3a3134216c86fcfe4760be3ebc43a53ff21beb359e6048c6949399c38a, dfd92b6da914bb01dbb22c9ddeb46e6c63a00a0a60e0aa2a98ff87f7370eb7441df8cc84a69ea3a354b9cd8db593d816 - -# p_scalar = n - 39 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5294c -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 587df4d6b89b1fc2c9985040b76c066536a1cd6dde9b62306d7edf642b7f006fd984244a8e3d2c467d894f80506e0e42, 2d7bc128074968fb1a95355f1cd60340b646e453436d9fe2345c553ab53153b87b2b0ab3e82947474c0638476a71ae7a - -# p_scalar = n - 38 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5294d -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 47ba96091da7b1476b464412bc9a48c7479ecf018173fb32f3d752f5ad6cbeac018843c01c0d77024703cd85891f8ffe, 1f466694520618f2129be314974320a4f300e1c648347f9adae2479844956b9387c183c3e1a0e06c91af26eaabc13488 - -# p_scalar = n - 37 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5294e -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 1eba28f3defc58b59261ede87ef27114acb60a7597482b86a129e2dff5b54a5d4027704bb5630ef20202d57de44f61a3, fa0e07b7fe85bf85284fcbb5638ca337b50649a894047d1f2ea912435d2ca0342f1643d514594bee6c91c0c98be5589e - -# p_scalar = n - 36 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5294f -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 1608643883061d376f01faee26946e789f82b7fbab52606ca39180d45c2c7ce14a13260770b1b757f216aa2531238ed0, f699887b806085b7df33eed7b73401b16a3258ec33f5567510209418c167fd201d11bc5ed6e28138597edf370fb077bc - -# p_scalar = n - 35 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52950 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = d6149f75e9417bc6832bd8e34fc7852365f16273a02583fd4a508620dde6bd0abb3800d52d7c2fb458a5b5433720ec9b, b13a8ad830e23f26ac8a877f52ccd35c22f19fab28f35eee50018998988092a20ce18088a55e0956feb026e93deeb52a - -# p_scalar = n - 34 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52951 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = cdb55e6ba07b7cae7ec2bc1cd50b3e6d9d6ac102b4e2520145700722abb9102f0648c2cd2d668c4180b309dd2ada5bf4, a964eefbfdadd24e03c050a06152072602d00cfb8a76b2d69e1418a4554557c3470ddc68f8a57f48ebcbda0786da3943 - -# p_scalar = n - 33 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52952 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = cc9e97a46c833e9d68af622641d5c400da631fc160f09efbbbc7c7ee955ef3afdf330d9d5b943c8661333a382fb3ba63, a7fd2b619057dad76fcc93a1b8c310728a416eb9bb6f0aba08467cea48b90b9113bf6124c209e55e7fd73e8e3a625e76 - -# p_scalar = n - 32 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52953 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 5dd2a4a0626b3d793a9865baa631cfb0ba8953d612e8dc871896b9fcc651b1dd0d784cf208f779d5ad852b878c0a64a4, c510ad93aabca99f73b42725b35b4ff04bcb06f00a2377b677315f9e9448fd08a372dfc2f2a52bfd1148bc72687c20bb - -# p_scalar = n - 31 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52954 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 6c07c4040a3305d11afb51a3e3ba8285d42f7dc953c149652ecf8340f0df4fe6b6e7ecdd9e821ee6a39c89317c8906a4, 475a3e756398a19d5b3d0d6d36beecc4d7dd464f045a7a1c402a9bab42eb20ddbc0a699b374c4b08dab83288127fc1da - -# p_scalar = n - 30 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52955 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 92cea8f4c4360dd87002990485ba414315f9abe1feb6b100519b9fd50a18323276aad8b8131263886a7a3464d0cbcea0, 941292e500f88cb2f569446a2755569296c21b29f6a167f23117dd04d47a41dc1846eefcdd3eb156dc6c5d1dc12748a1 - -# p_scalar = n - 29 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52956 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = c8b00ae8187cea1f2065b7cba7df26e43dc22d490e3feb0fce3c15ed55c9764725846b66780443d6019d6ac5d3021470, 1d2a1c015977f16cf6f57e7190c820338e6db10b404505fbab178d26cce851b3293c164920c83de21a5284a0865dded3 - -# p_scalar = n - 28 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52957 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 55be5764d37da1a2d8232f8b4e492aa88fb0c597a4da3e15550e0bee8ff22c6f4169b4117b3c1220c76afaa373b64643, 05cdca3fe7988176792377fbf8eb8319c48ee6f3b033c112184bd4733ad6983a9ff769c4875fee0ff1bc89b628e77f9e - -# p_scalar = n - 27 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52958 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = e8ca780e373e5aec2f7e8d509c6a58fe7228e2d5d18f14d08e0d4168482396f9cf1912934d78291da04482d2467d66e4, 17820a0bc5134ed767e67195d44d3cdf7d26540638c85a85d779adfe31da1bea58a6d7f569e2f8f442aad1d61b68e9f8 - -# p_scalar = n - 26 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52959 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 37a45bdb091cbb80f14b309f03fa90f2808497b7b0bba4a76efedb8023bf0b90b0391b37897b93f56423197d2afd473d, 47d98a9df092241cbf2c0862697c08fd5d512df99d42a72725c7b9146f5f24c7db3f422d95e16d6eedda4ae48a8f5dcb - -# p_scalar = n - 25 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5295a -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = c29c6e2ca5bb73313809ab50de2480249bd51b99208abe1e57d0f3d2e2be174abb280dfa3cb3fb361e93722758ce3b83, 1fe6fb42e97809dcda3e1a3d4cebc96ed6a2f51dea8e434401628f059424a3cc83ccbc4e9009e3919944fd2e61124f05 - -# p_scalar = n - 24 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5295b -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 4f13f901fc55723f38076e8fca77d74f563361909bd5c2f7540c045a409c930b20c1b8e0d809afcd259f272cfab816a7, 150808e625a302c91395a87966a4e904e8277439a0f9ad3adf5579fa4bea82dd98d82ad1da247ec8890932d7bd3d10c3 - -# p_scalar = n - 23 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5295c -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 80826a69eea8f22461e4ca2b905432f01c75b8ab2a351783b9d3dd25429c0a18990ed20b569b8ef6d1b4e74d12e3683b, 9dfccb0de2212559282d2437566718c1f0138950eaf22c7e7ad8a132a527cebe0bcca3f0a65e48137fc33a6bec52abad - -# p_scalar = n - 22 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5295d -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = e082882d69059095fd7a8b13f0681fcac382472ebe0e1fdbccd57831927ed783981b788d16f325b84f595351262bb775, 671d69c98fcd841850fc847215809cddc764edf840d0fcf77b1ab489cbf837b7f9d62fd9c9576c694d1c3049faa71fdc - -# p_scalar = n - 21 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5295e -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = ab16c626dac012b51b1a0f6c5df0e5372e59ab62bd9ebe6930128aa06177f75d88e0d496dd2f9e2108265e510422ce2f, 21824f411353ccba266ad15aacea5817b454111e8527cd59262ebb498a149098aa740a9e38f17bea8014214b008c5de7 - -# p_scalar = n - 20 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5295f -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 1d1cdf7b5f22346598ca8dd42d96c936f78cff0cd467f03a713466708cbaffc7cd96f20591e71d16ad610a2d94a70ec1, ab9dd81052ebfb015e01b72b4718bbc7422da643ffe6132b9933fb25dccd4df325f546ab321828ffe27a189460d4db60 - -# p_scalar = n - 19 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52960 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = fa0f1f450390d706b3b6639c539802ae23891298fc38538eca109c3b154aad5e22c4cc5f41a8c91282a2ed4abaa84c08, a1d47b23e957776415d1dc778264b6723f5a799bb67f30c39170b3786ff2f643a8c72d3cc3da2eac46b78e5db0dc21d0 - -# p_scalar = n - 18 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52961 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 57505d8d6749703068a232435567169355a96a6879909f083bd1c8f62edb0dbd198fd3f0f38f66625dfee73ce5b82700, 91700b247eb1be639bdd6a092945a7576ffcfc7ca4cfd9bbc266eb844112985854b867b7f78aa7de8a60717f75c64513 - -# p_scalar = n - 17 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52962 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 524f166ee475ce709f6928555330455e7be3737d524ffefce6fc3f2af655a10d3ea4ea4c8ff1f43e8903e1304b4a3cd0, ac37986f55b164c925eb5df1b3c2677af87d6d854a54504a49ce6993336bf1834e23b6ffd5b9c0da3fcc69cd6c12f055 - -# p_scalar = n - 16 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52963 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = a10896aa435abaa137065f5313bdc3fa317b63ea2887d5ff37cf65517917652a992afb5b0ecdd2d8da6e8a7f7c33ed91, 659db48181ef251351c305c6a72d1967b333bdfbc88ee148914871dc154d410feb07ddea230cf00d9b21615fefabca26 - -# p_scalar = n - 15 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52964 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = fb62d26f4903026b0fc01fd4eb08599359500917789b307583ccf19550e07b342b7210e2ec3dabd8446ad8884709f4a9, 5a68c6fed0bc27168733fc41400c5797dddc2866d898f4704b23d3a0de06610c61609cbd144bd5862309cc9d6fe989bb - -# p_scalar = n - 14 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52965 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 46d227c432f6b1ba8058994c5710c0c944ce05ff88957166ca6b1af8b1f85c2ad02225fb01ec909f5865e5018f75244c, 4429839ddefbadf5647d24db13690a7472445345d9c3b6911ecc8585e11dbbbf540b8b82730a99d1be4b4a9003cb68e5 - -# p_scalar = n - 13 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52966 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = b51c56e18cf23c94d2657265ed22df97db5203a8d9c1bd568a7a8e4633b7d4aeb25e28c5f6749a959b7aeb7e75ccbdfb, 4617adb7cc6979e181fdbd1c3b490ec3b7feac2dfec38d60789a2a48cf4d0fe3d8e88f1a87cae0c2f4d394596c3d812d - -# p_scalar = n - 12 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52967 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 627b415f9c35b26d523c40dbcf9ab45cf67eb42235d77d8303aced26c8edfee1d4258cc55d9704203db8477270313de0, 0c6e430ef9c4af3d0329eab1f7942f0e40c64a4e66bed5af8c79848fd0e102ac80d60af627aa651afacc45e48be55ed8 - -# p_scalar = n - 11 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52968 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 9c19e9fc7ba9c437f8d89885f0561d7901b8bf56147b66020dcc67706cdad64f4532077c44377abac7708b19b68b8c7d, 9aa62f9f3533f91841821d0c3a53287a2e070f36fe9e682e3ce813298a77e780604fe46bac144b83764eb146bdc4ba25 - -# p_scalar = n - 10 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52969 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = a91a5280db1c212ec2f646025c4845ec54a612d7eb32cabee9f6368eab225fa32a15a9a6e58d6787845539d3c8d99c02, 6eb995bec80174e83e03370a47a9b8aa81961b8ccfd7fd1d592ac0ba794eabfd03a530eb13b9e85cbb971f78e67b5fce - -# p_scalar = n - 9 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5296a -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 5cab1d1d53636c6a26d464c6dad54d6adc351dc13cbfff3f26094833a96d745de35d87293fd7e4f92f5d200e2353b92f, e770633431e8f5c67d9429f4ee69a754a6ecaccc68ead0d827f061c7033ca7c23777e270d742aa2ff2813072b18ec0b0 - -# p_scalar = n - 8 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5296b -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 5db4f184349cd9b11c7b5fe116b664231d9aebd64f3ddb371c5c2e7193d7e30f9e336de5ae9b587a23f60a05dd9bcbba, 3c0c6dd70d27ef617008d943c48ecf0ee9923263a42dbba2701754bf7d8686e4836dbb36b7e55e870d2cfe83e6655a44 - -# p_scalar = n - 7 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5296c -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 932c9f811c89025bf893db589db2df555f4215d1659753ed731edcf8211faa954ce6415f874774b1df13b9d17d69222b, d90a16b6af6c9b3ef57f238e693b07060ff37c0401fff78065aad76f50130844135349d5a8641c790996b2207706a61e - -# p_scalar = n - 6 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5296d -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = c482e189f0430c404f0f6a962b02d33b2a33f6661bdf6015ec52930f580d57f2cb2454b339d3413a7eb5c9317d56dad8, c9962152af2a9eba586d8ededf21559a93c9e5f61b546f058bd4bffcb79e33b0739ac69d5b3d4dce3f62b16ea7b08203 - -# p_scalar = n - 5 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5296e -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = e1bb26b11d178ffbc676b987e2e8e4c660db2cf5aacc05e67f1eb1b5293c703bc185c0cbcc873466bb595eba68f1f0df, 4db1c9d6e209e4a3e6c5944024de236d4b237faf982c041180b61b3101c35b9922c16e2e72f345662b694ba07073fa21 - -# p_scalar = n - 4 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5296f -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = cfeee6dd34179228fb40f647d685d979078358d4736400ad2e4f153b0aecac4630594ccbee0421e30aae8477ebb68f2c, 50946875303df319e607b9e33820017d147162d30418c6938e3e61a34c542ad1e74bb7f17bfec97e54f3e8e79b3a03b2 - -# p_scalar = n - 3 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52970 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = d283fe68e7c1c3ace36f7e2d263aa4703a48d732d51c6c3e6b2034e9a170ccf0c54ea9fff04f779c05e4dbe6c1dc4073, 465465fc983292aff6db68b15102b33968012d5ad2e1d0b4132663c04ef6744692d789a77ae0e36d7e284821c04ee157 - -# p_scalar = n - 2 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52971 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = db93b776427460c39c90a4fd2de4b506da821495f0687f503504e6f0ff9d48a18e6c8f2e022b53f0c8229e55783dde91, e34947f7123df0c2070d430900b0e68409f1fe415172bad915e4f18bdc588258e8e8e4a8c2aaccd842ea84633140bfda - -# p_scalar = n - 1 -p_scalar = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972 -p = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01 -r = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, 2b78abc25a15c5e9dd8002263969a840c6c3521968f4ffd98bade7562e83b050a1bfa8bf7bb4a9ac23043dad4b03a4fe diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p384_point_sum_tests.txt temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p384_point_sum_tests.txt --- temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p384_point_sum_tests.txt 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p384_point_sum_tests.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,120 +0,0 @@ - -# inf + inf == 2 * inf == inf -a = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -b = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = inf - -# inf (n*G) + inf (n*G) == 2 * inf == inf -a = 4a0fd63f894499928e4b2b72aced45cfc589976f4ff86f78c904d59da9379a62b702d968c1184834c11db28c7356ceb6, be113b04484cd4bc215a9f2a33a674c3764c38ca4de135dd50ce8dcf3c85d55a5aad0e171860bdb6c58201e6212d9ac5, 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -b = 4a0fd63f894499928e4b2b72aced45cfc589976f4ff86f78c904d59da9379a62b702d968c1184834c11db28c7356ceb6, be113b04484cd4bc215a9f2a33a674c3764c38ca4de135dd50ce8dcf3c85d55a5aad0e171860bdb6c58201e6212d9ac5, 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = inf - -# inf (n*G) + inf == 2 * inf == inf -a = 4a0fd63f894499928e4b2b72aced45cfc589976f4ff86f78c904d59da9379a62b702d968c1184834c11db28c7356ceb6, be113b04484cd4bc215a9f2a33a674c3764c38ca4de135dd50ce8dcf3c85d55a5aad0e171860bdb6c58201e6212d9ac5, 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -b = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = inf - -# inf + inf (n*G) == 2 * inf == inf -a = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -b = 4a0fd63f894499928e4b2b72aced45cfc589976f4ff86f78c904d59da9379a62b702d968c1184834c11db28c7356ceb6, be113b04484cd4bc215a9f2a33a674c3764c38ca4de135dd50ce8dcf3c85d55a5aad0e171860bdb6c58201e6212d9ac5, 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = inf - -# G + inf == G -a = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, 2b78abc25a15c5e9dd8002263969a840c6c3521968f4ffd98bade7562e83b050a1bfa8bf7bb4a9ac23043dad4b03a4fe, 000000000000000000000000000000000000000000000000000000000000000100000000ffffffffffffffff00000001 -b = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, 2b78abc25a15c5e9dd8002263969a840c6c3521968f4ffd98bade7562e83b050a1bfa8bf7bb4a9ac23043dad4b03a4fe - -# G + inf (n*G) == G -a = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, 2b78abc25a15c5e9dd8002263969a840c6c3521968f4ffd98bade7562e83b050a1bfa8bf7bb4a9ac23043dad4b03a4fe, 000000000000000000000000000000000000000000000000000000000000000100000000ffffffffffffffff00000001 -b = 4a0fd63f894499928e4b2b72aced45cfc589976f4ff86f78c904d59da9379a62b702d968c1184834c11db28c7356ceb6, be113b04484cd4bc215a9f2a33a674c3764c38ca4de135dd50ce8dcf3c85d55a5aad0e171860bdb6c58201e6212d9ac5, 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -r = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, 2b78abc25a15c5e9dd8002263969a840c6c3521968f4ffd98bade7562e83b050a1bfa8bf7bb4a9ac23043dad4b03a4fe - -# inf + G == G -a = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -b = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, 2b78abc25a15c5e9dd8002263969a840c6c3521968f4ffd98bade7562e83b050a1bfa8bf7bb4a9ac23043dad4b03a4fe, 000000000000000000000000000000000000000000000000000000000000000100000000ffffffffffffffff00000001 -r = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, 2b78abc25a15c5e9dd8002263969a840c6c3521968f4ffd98bade7562e83b050a1bfa8bf7bb4a9ac23043dad4b03a4fe - -# inf (n*G) + G == G -a = 4a0fd63f894499928e4b2b72aced45cfc589976f4ff86f78c904d59da9379a62b702d968c1184834c11db28c7356ceb6, be113b04484cd4bc215a9f2a33a674c3764c38ca4de135dd50ce8dcf3c85d55a5aad0e171860bdb6c58201e6212d9ac5, 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -b = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, 2b78abc25a15c5e9dd8002263969a840c6c3521968f4ffd98bade7562e83b050a1bfa8bf7bb4a9ac23043dad4b03a4fe, 000000000000000000000000000000000000000000000000000000000000000100000000ffffffffffffffff00000001 -r = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, 2b78abc25a15c5e9dd8002263969a840c6c3521968f4ffd98bade7562e83b050a1bfa8bf7bb4a9ac23043dad4b03a4fe - -# G + G == 2*G -a = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, 2b78abc25a15c5e9dd8002263969a840c6c3521968f4ffd98bade7562e83b050a1bfa8bf7bb4a9ac23043dad4b03a4fe, 000000000000000000000000000000000000000000000000000000000000000100000000ffffffffffffffff00000001 -b = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, 2b78abc25a15c5e9dd8002263969a840c6c3521968f4ffd98bade7562e83b050a1bfa8bf7bb4a9ac23043dad4b03a4fe, 000000000000000000000000000000000000000000000000000000000000000100000000ffffffffffffffff00000001 -r = db93b776427460c39c90a4fd2de4b506da821495f0687f503504e6f0ff9d48a18e6c8f2e022b53f0c8229e55783dde91, e34947f7123df0c2070d430900b0e68409f1fe415172bad915e4f18bdc588258e8e8e4a8c2aaccd842ea84633140bfda - -# (n-1)*G + G == inf; note that -G is (n-1)*G -a = f3ee335326d22614d01b5d7cd0be73f1bfdd75982c9c273f72d0abfeecbca0431601a1bcafcdeb07e21ecf4d91c7b520, 57b82ca1527c5a01b78bc8ccb9febe74178b04b7c6fde1c1c4ef9a220c4320bb560cb078542256a3900df61c107de6c5, 53b3adc887551c0e17c07ecb42d1a5ec105aeec6b0f040a936ed4f756e83939226232b4e11191b3eb1d841c650682ca0 -b = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, 2b78abc25a15c5e9dd8002263969a840c6c3521968f4ffd98bade7562e83b050a1bfa8bf7bb4a9ac23043dad4b03a4fe, 000000000000000000000000000000000000000000000000000000000000000100000000ffffffffffffffff00000001 -r = inf - -# G + (n-1)*G == inf; note that -G is (n-1)*G -a = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, 2b78abc25a15c5e9dd8002263969a840c6c3521968f4ffd98bade7562e83b050a1bfa8bf7bb4a9ac23043dad4b03a4fe, 000000000000000000000000000000000000000000000000000000000000000100000000ffffffffffffffff00000001 -b = f3ee335326d22614d01b5d7cd0be73f1bfdd75982c9c273f72d0abfeecbca0431601a1bcafcdeb07e21ecf4d91c7b520, 57b82ca1527c5a01b78bc8ccb9febe74178b04b7c6fde1c1c4ef9a220c4320bb560cb078542256a3900df61c107de6c5, 53b3adc887551c0e17c07ecb42d1a5ec105aeec6b0f040a936ed4f756e83939226232b4e11191b3eb1d841c650682ca0 -r = inf - -# (n-1)*G + (n-1)*G == 2*(n-1)*G -a = f3ee335326d22614d01b5d7cd0be73f1bfdd75982c9c273f72d0abfeecbca0431601a1bcafcdeb07e21ecf4d91c7b520, 57b82ca1527c5a01b78bc8ccb9febe74178b04b7c6fde1c1c4ef9a220c4320bb560cb078542256a3900df61c107de6c5, 53b3adc887551c0e17c07ecb42d1a5ec105aeec6b0f040a936ed4f756e83939226232b4e11191b3eb1d841c650682ca0 -b = f3ee335326d22614d01b5d7cd0be73f1bfdd75982c9c273f72d0abfeecbca0431601a1bcafcdeb07e21ecf4d91c7b520, 57b82ca1527c5a01b78bc8ccb9febe74178b04b7c6fde1c1c4ef9a220c4320bb560cb078542256a3900df61c107de6c5, 53b3adc887551c0e17c07ecb42d1a5ec105aeec6b0f040a936ed4f756e83939226232b4e11191b3eb1d841c650682ca0 -r = db93b776427460c39c90a4fd2de4b506da821495f0687f503504e6f0ff9d48a18e6c8f2e022b53f0c8229e55783dde91, 1cb6b808edc20f3df8f2bcf6ff4f197bf60e01beae8d4526ea1b0e7423a77da617171b563d553327bd157b9dcebf4025 - -# (n-1)*G (affine) + (n-1)*G == 2*(n-1)*G -a = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01, 000000000000000000000000000000000000000000000000000000000000000100000000ffffffffffffffff00000001 -b = f3ee335326d22614d01b5d7cd0be73f1bfdd75982c9c273f72d0abfeecbca0431601a1bcafcdeb07e21ecf4d91c7b520, 57b82ca1527c5a01b78bc8ccb9febe74178b04b7c6fde1c1c4ef9a220c4320bb560cb078542256a3900df61c107de6c5, 53b3adc887551c0e17c07ecb42d1a5ec105aeec6b0f040a936ed4f756e83939226232b4e11191b3eb1d841c650682ca0 -r = db93b776427460c39c90a4fd2de4b506da821495f0687f503504e6f0ff9d48a18e6c8f2e022b53f0c8229e55783dde91, 1cb6b808edc20f3df8f2bcf6ff4f197bf60e01beae8d4526ea1b0e7423a77da617171b563d553327bd157b9dcebf4025 - -# (n-1)*G + -(n-1)*G == inf -a = f3ee335326d22614d01b5d7cd0be73f1bfdd75982c9c273f72d0abfeecbca0431601a1bcafcdeb07e21ecf4d91c7b520, 57b82ca1527c5a01b78bc8ccb9febe74178b04b7c6fde1c1c4ef9a220c4320bb560cb078542256a3900df61c107de6c5, 53b3adc887551c0e17c07ecb42d1a5ec105aeec6b0f040a936ed4f756e83939226232b4e11191b3eb1d841c650682ca0 -b = f3ee335326d22614d01b5d7cd0be73f1bfdd75982c9c273f72d0abfeecbca0431601a1bcafcdeb07e21ecf4d91c7b520, a847d35ead83a5fe487437334601418be874fb4839021e3e3b1065ddf3bcdf43a9f34f86abdda95c6ff209e4ef82193a, 53b3adc887551c0e17c07ecb42d1a5ec105aeec6b0f040a936ed4f756e83939226232b4e11191b3eb1d841c650682ca0 -r = inf - -# -(n-1)*G + (n-1)*G == inf -a = f3ee335326d22614d01b5d7cd0be73f1bfdd75982c9c273f72d0abfeecbca0431601a1bcafcdeb07e21ecf4d91c7b520, a847d35ead83a5fe487437334601418be874fb4839021e3e3b1065ddf3bcdf43a9f34f86abdda95c6ff209e4ef82193a, 53b3adc887551c0e17c07ecb42d1a5ec105aeec6b0f040a936ed4f756e83939226232b4e11191b3eb1d841c650682ca0 -b = f3ee335326d22614d01b5d7cd0be73f1bfdd75982c9c273f72d0abfeecbca0431601a1bcafcdeb07e21ecf4d91c7b520, 57b82ca1527c5a01b78bc8ccb9febe74178b04b7c6fde1c1c4ef9a220c4320bb560cb078542256a3900df61c107de6c5, 53b3adc887551c0e17c07ecb42d1a5ec105aeec6b0f040a936ed4f756e83939226232b4e11191b3eb1d841c650682ca0 -r = inf - -# -(n-1)*G (affine) + (n-1)*G == inf -a = f3ee335326d22614d01b5d7cd0be73f1bfdd75982c9c273f72d0abfeecbca0431601a1bcafcdeb07e21ecf4d91c7b520, a847d35ead83a5fe487437334601418be874fb4839021e3e3b1065ddf3bcdf43a9f34f86abdda95c6ff209e4ef82193a, 53b3adc887551c0e17c07ecb42d1a5ec105aeec6b0f040a936ed4f756e83939226232b4e11191b3eb1d841c650682ca0 -b = f3ee335326d22614d01b5d7cd0be73f1bfdd75982c9c273f72d0abfeecbca0431601a1bcafcdeb07e21ecf4d91c7b520, 57b82ca1527c5a01b78bc8ccb9febe74178b04b7c6fde1c1c4ef9a220c4320bb560cb078542256a3900df61c107de6c5, 53b3adc887551c0e17c07ecb42d1a5ec105aeec6b0f040a936ed4f756e83939226232b4e11191b3eb1d841c650682ca0 -r = inf - -# -(n-1)*G + -G == inf; note that -G is (n-1)*G (affine) -a = f3ee335326d22614d01b5d7cd0be73f1bfdd75982c9c273f72d0abfeecbca0431601a1bcafcdeb07e21ecf4d91c7b520, a847d35ead83a5fe487437334601418be874fb4839021e3e3b1065ddf3bcdf43a9f34f86abdda95c6ff209e4ef82193a, 53b3adc887551c0e17c07ecb42d1a5ec105aeec6b0f040a936ed4f756e83939226232b4e11191b3eb1d841c650682ca0 -b = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01, 000000000000000000000000000000000000000000000000000000000000000100000000ffffffffffffffff00000001 -r = inf - -# -G + -(n-1)*G == inf; note that -G is (n-1)*G (affine) -a = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01, 000000000000000000000000000000000000000000000000000000000000000100000000ffffffffffffffff00000001 -b = f3ee335326d22614d01b5d7cd0be73f1bfdd75982c9c273f72d0abfeecbca0431601a1bcafcdeb07e21ecf4d91c7b520, a847d35ead83a5fe487437334601418be874fb4839021e3e3b1065ddf3bcdf43a9f34f86abdda95c6ff209e4ef82193a, 53b3adc887551c0e17c07ecb42d1a5ec105aeec6b0f040a936ed4f756e83939226232b4e11191b3eb1d841c650682ca0 -r = inf - -# (n-1)*G + -G; == -2*G; note that -G == (n-1)*G (affine) -a = f3ee335326d22614d01b5d7cd0be73f1bfdd75982c9c273f72d0abfeecbca0431601a1bcafcdeb07e21ecf4d91c7b520, 57b82ca1527c5a01b78bc8ccb9febe74178b04b7c6fde1c1c4ef9a220c4320bb560cb078542256a3900df61c107de6c5, 53b3adc887551c0e17c07ecb42d1a5ec105aeec6b0f040a936ed4f756e83939226232b4e11191b3eb1d841c650682ca0 -b = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01, 000000000000000000000000000000000000000000000000000000000000000100000000ffffffffffffffff00000001 -r = db93b776427460c39c90a4fd2de4b506da821495f0687f503504e6f0ff9d48a18e6c8f2e022b53f0c8229e55783dde91, 1cb6b808edc20f3df8f2bcf6ff4f197bf60e01beae8d4526ea1b0e7423a77da617171b563d553327bd157b9dcebf4025 - -# -G + (n-1)*G == -2*G; note that -G is (n-1)*G (affine) -a = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01, 000000000000000000000000000000000000000000000000000000000000000100000000ffffffffffffffff00000001 -b = f3ee335326d22614d01b5d7cd0be73f1bfdd75982c9c273f72d0abfeecbca0431601a1bcafcdeb07e21ecf4d91c7b520, 57b82ca1527c5a01b78bc8ccb9febe74178b04b7c6fde1c1c4ef9a220c4320bb560cb078542256a3900df61c107de6c5, 53b3adc887551c0e17c07ecb42d1a5ec105aeec6b0f040a936ed4f756e83939226232b4e11191b3eb1d841c650682ca0 -r = db93b776427460c39c90a4fd2de4b506da821495f0687f503504e6f0ff9d48a18e6c8f2e022b53f0c8229e55783dde91, 1cb6b808edc20f3df8f2bcf6ff4f197bf60e01beae8d4526ea1b0e7423a77da617171b563d553327bd157b9dcebf4025 - -# (n-1)*G + -G == -2*G; note that -G is (n-1)*G (affine) -a = f3ee335326d22614d01b5d7cd0be73f1bfdd75982c9c273f72d0abfeecbca0431601a1bcafcdeb07e21ecf4d91c7b520, 57b82ca1527c5a01b78bc8ccb9febe74178b04b7c6fde1c1c4ef9a220c4320bb560cb078542256a3900df61c107de6c5, 53b3adc887551c0e17c07ecb42d1a5ec105aeec6b0f040a936ed4f756e83939226232b4e11191b3eb1d841c650682ca0 -b = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01, 000000000000000000000000000000000000000000000000000000000000000100000000ffffffffffffffff00000001 -r = db93b776427460c39c90a4fd2de4b506da821495f0687f503504e6f0ff9d48a18e6c8f2e022b53f0c8229e55783dde91, 1cb6b808edc20f3df8f2bcf6ff4f197bf60e01beae8d4526ea1b0e7423a77da617171b563d553327bd157b9dcebf4025 - -# -G + (n-1)*G == -2*G; note that -G = (n-1)*G -a = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01, 000000000000000000000000000000000000000000000000000000000000000100000000ffffffffffffffff00000001 -b = f3ee335326d22614d01b5d7cd0be73f1bfdd75982c9c273f72d0abfeecbca0431601a1bcafcdeb07e21ecf4d91c7b520, 57b82ca1527c5a01b78bc8ccb9febe74178b04b7c6fde1c1c4ef9a220c4320bb560cb078542256a3900df61c107de6c5, 53b3adc887551c0e17c07ecb42d1a5ec105aeec6b0f040a936ed4f756e83939226232b4e11191b3eb1d841c650682ca0 -r = db93b776427460c39c90a4fd2de4b506da821495f0687f503504e6f0ff9d48a18e6c8f2e022b53f0c8229e55783dde91, 1cb6b808edc20f3df8f2bcf6ff4f197bf60e01beae8d4526ea1b0e7423a77da617171b563d553327bd157b9dcebf4025 - -# -G + G == inf; note that -G is (n-1)*G (affine) -a = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01, 000000000000000000000000000000000000000000000000000000000000000100000000ffffffffffffffff00000001 -b = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, 2b78abc25a15c5e9dd8002263969a840c6c3521968f4ffd98bade7562e83b050a1bfa8bf7bb4a9ac23043dad4b03a4fe, 000000000000000000000000000000000000000000000000000000000000000100000000ffffffffffffffff00000001 -r = inf - -# G + -G == inf; note that -G is (n-1)*G (affine) -a = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, 2b78abc25a15c5e9dd8002263969a840c6c3521968f4ffd98bade7562e83b050a1bfa8bf7bb4a9ac23043dad4b03a4fe, 000000000000000000000000000000000000000000000000000000000000000100000000ffffffffffffffff00000001 -b = 4d3aadc2299e1513812ff723614ede2b6454868459a30eff879c3afc541b4d6e20e378e2a0d6ce383dd0756649c0b528, d487543da5ea3a16227ffdd9c69657bf393cade6970b0026745218a9d17c4fae5e40573f844b5653dcfbc253b4fc5b01, 000000000000000000000000000000000000000000000000000000000000000100000000ffffffffffffffff00000001 -r = inf diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p384.rs temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p384.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p384.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p384.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,370 +0,0 @@ -// Copyright 2016 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -use super::{ - elem::{binary_op, binary_op_assign}, - elem_sqr_mul, elem_sqr_mul_acc, Modulus, *, -}; -use core::marker::PhantomData; - -macro_rules! p384_limbs { - [$($limb:expr),+] => { - limbs![$($limb),+] - }; -} - -pub static COMMON_OPS: CommonOps = CommonOps { - num_limbs: 384 / LIMB_BITS, - - q: Modulus { - p: p384_limbs![ - 0xffffffff, 0x00000000, 0x00000000, 0xffffffff, 0xfffffffe, 0xffffffff, 0xffffffff, - 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff - ], - rr: p384_limbs![1, 0xfffffffe, 0, 2, 0, 0xfffffffe, 0, 2, 1, 0, 0, 0], - }, - n: Elem { - limbs: p384_limbs![ - 0xccc52973, 0xecec196a, 0x48b0a77a, 0x581a0db2, 0xf4372ddf, 0xc7634d81, 0xffffffff, - 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff - ], - m: PhantomData, - encoding: PhantomData, // Unencoded - }, - - a: Elem { - limbs: p384_limbs![ - 0xfffffffc, 0x00000003, 0x00000000, 0xfffffffc, 0xfffffffb, 0xffffffff, 0xffffffff, - 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff - ], - m: PhantomData, - encoding: PhantomData, // Unreduced - }, - b: Elem { - limbs: p384_limbs![ - 0x9d412dcc, 0x08118871, 0x7a4c32ec, 0xf729add8, 0x1920022e, 0x77f2209b, 0x94938ae2, - 0xe3374bee, 0x1f022094, 0xb62b21f4, 0x604fbff9, 0xcd08114b - ], - m: PhantomData, - encoding: PhantomData, // Unreduced - }, - - elem_add_impl: GFp_p384_elem_add, - elem_mul_mont: GFp_p384_elem_mul_mont, - elem_sqr_mont: GFp_p384_elem_sqr_mont, - - point_add_jacobian_impl: GFp_nistz384_point_add, -}; - -pub static PRIVATE_KEY_OPS: PrivateKeyOps = PrivateKeyOps { - common: &COMMON_OPS, - elem_inv_squared: p384_elem_inv_squared, - point_mul_base_impl: p384_point_mul_base_impl, - point_mul_impl: GFp_nistz384_point_mul, -}; - -fn p384_elem_inv_squared(a: &Elem) -> Elem { - // Calculate a**-2 (mod q) == a**(q - 3) (mod q) - // - // The exponent (q - 3) is: - // - // 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe\ - // ffffffff0000000000000000fffffffc - - #[inline] - fn sqr_mul(a: &Elem, squarings: usize, b: &Elem) -> Elem { - elem_sqr_mul(&COMMON_OPS, a, squarings, b) - } - - #[inline] - fn sqr_mul_acc(a: &mut Elem, squarings: usize, b: &Elem) { - elem_sqr_mul_acc(&COMMON_OPS, a, squarings, b) - } - - let b_1 = &a; - let b_11 = sqr_mul(b_1, 1, b_1); - let b_111 = sqr_mul(&b_11, 1, b_1); - let f_11 = sqr_mul(&b_111, 3, &b_111); - let fff = sqr_mul(&f_11, 6, &f_11); - let fff_111 = sqr_mul(&fff, 3, &b_111); - let fffffff_11 = sqr_mul(&fff_111, 15, &fff_111); - - let fffffffffffffff = sqr_mul(&fffffff_11, 30, &fffffff_11); - - let ffffffffffffffffffffffffffffff = sqr_mul(&fffffffffffffff, 60, &fffffffffffffff); - - // ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff - let mut acc = sqr_mul( - &ffffffffffffffffffffffffffffff, - 120, - &ffffffffffffffffffffffffffffff, - ); - - // fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff_111 - sqr_mul_acc(&mut acc, 15, &fff_111); - - // fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff - sqr_mul_acc(&mut acc, 1 + 30, &fffffff_11); - sqr_mul_acc(&mut acc, 2, &b_11); - - // fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff - // 0000000000000000fffffff_11 - sqr_mul_acc(&mut acc, 64 + 30, &fffffff_11); - - // fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff - // 0000000000000000fffffffc - COMMON_OPS.elem_square(&mut acc); - COMMON_OPS.elem_square(&mut acc); - - acc -} - -fn p384_point_mul_base_impl(a: &Scalar) -> Point { - // XXX: Not efficient. TODO: Precompute multiples of the generator. - static GENERATOR: (Elem, Elem) = ( - Elem { - limbs: p384_limbs![ - 0x49c0b528, 0x3dd07566, 0xa0d6ce38, 0x20e378e2, 0x541b4d6e, 0x879c3afc, 0x59a30eff, - 0x64548684, 0x614ede2b, 0x812ff723, 0x299e1513, 0x4d3aadc2 - ], - m: PhantomData, - encoding: PhantomData, - }, - Elem { - limbs: p384_limbs![ - 0x4b03a4fe, 0x23043dad, 0x7bb4a9ac, 0xa1bfa8bf, 0x2e83b050, 0x8bade756, 0x68f4ffd9, - 0xc6c35219, 0x3969a840, 0xdd800226, 0x5a15c5e9, 0x2b78abc2 - ], - m: PhantomData, - encoding: PhantomData, - }, - ); - - PRIVATE_KEY_OPS.point_mul(a, &GENERATOR) -} - -pub static PUBLIC_KEY_OPS: PublicKeyOps = PublicKeyOps { - common: &COMMON_OPS, -}; - -pub static SCALAR_OPS: ScalarOps = ScalarOps { - common: &COMMON_OPS, - scalar_inv_to_mont_impl: p384_scalar_inv_to_mont, - scalar_mul_mont: GFp_p384_scalar_mul_mont, -}; - -pub static PUBLIC_SCALAR_OPS: PublicScalarOps = PublicScalarOps { - scalar_ops: &SCALAR_OPS, - public_key_ops: &PUBLIC_KEY_OPS, - private_key_ops: &PRIVATE_KEY_OPS, - - q_minus_n: Elem { - limbs: p384_limbs![ - 0x333ad68c, 0x1313e696, 0xb74f5885, 0xa7e5f24c, 0x0bc8d21f, 0x389cb27e, 0, 0, 0, 0, 0, - 0 - ], - - m: PhantomData, - encoding: PhantomData, // Unencoded - }, -}; - -pub static PRIVATE_SCALAR_OPS: PrivateScalarOps = PrivateScalarOps { - scalar_ops: &SCALAR_OPS, - - oneRR_mod_n: Scalar { - limbs: N_RR_LIMBS, - m: PhantomData, - encoding: PhantomData, // R - }, -}; - -fn p384_scalar_inv_to_mont(a: &Scalar) -> Scalar { - // Calculate the modular inverse of scalar |a| using Fermat's Little - // Theorem: - // - // a**-1 (mod n) == a**(n - 2) (mod n) - // - // The exponent (n - 2) is: - // - // 0xffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf\ - // 581a0db248b0a77aecec196accc52971. - - fn mul(a: &Scalar, b: &Scalar) -> Scalar { - binary_op(GFp_p384_scalar_mul_mont, a, b) - } - - fn sqr(a: &Scalar) -> Scalar { - binary_op(GFp_p384_scalar_mul_mont, a, a) - } - - fn sqr_mut(a: &mut Scalar) { - unary_op_from_binary_op_assign(GFp_p384_scalar_mul_mont, a); - } - - // Returns (`a` squared `squarings` times) * `b`. - fn sqr_mul(a: &Scalar, squarings: usize, b: &Scalar) -> Scalar { - debug_assert!(squarings >= 1); - let mut tmp = sqr(a); - for _ in 1..squarings { - sqr_mut(&mut tmp); - } - mul(&tmp, b) - } - - // Sets `acc` = (`acc` squared `squarings` times) * `b`. - fn sqr_mul_acc(acc: &mut Scalar, squarings: usize, b: &Scalar) { - debug_assert!(squarings >= 1); - for _ in 0..squarings { - sqr_mut(acc); - } - binary_op_assign(GFp_p384_scalar_mul_mont, acc, b) - } - - fn to_mont(a: &Scalar) -> Scalar { - static N_RR: Scalar = Scalar { - limbs: N_RR_LIMBS, - m: PhantomData, - encoding: PhantomData, - }; - binary_op(GFp_p384_scalar_mul_mont, a, &N_RR) - } - - // Indexes into `d`. - const B_1: usize = 0; - const B_11: usize = 1; - const B_101: usize = 2; - const B_111: usize = 3; - const B_1001: usize = 4; - const B_1011: usize = 5; - const B_1101: usize = 6; - const B_1111: usize = 7; - const DIGIT_COUNT: usize = 8; - - let mut d = [Scalar::zero(); DIGIT_COUNT]; - d[B_1] = to_mont(a); - let b_10 = sqr(&d[B_1]); - for i in B_11..DIGIT_COUNT { - d[i] = mul(&d[i - 1], &b_10); - } - - let ff = sqr_mul(&d[B_1111], 0 + 4, &d[B_1111]); - let ffff = sqr_mul(&ff, 0 + 8, &ff); - let ffffffff = sqr_mul(&ffff, 0 + 16, &ffff); - - let ffffffffffffffff = sqr_mul(&ffffffff, 0 + 32, &ffffffff); - - let ffffffffffffffffffffffff = sqr_mul(&ffffffffffffffff, 0 + 32, &ffffffff); - - // ffffffffffffffffffffffffffffffffffffffffffffffff - let mut acc = sqr_mul(&ffffffffffffffffffffffff, 0 + 96, &ffffffffffffffffffffffff); - - // The rest of the exponent, in binary, is: - // - // 1100011101100011010011011000000111110100001101110010110111011111 - // 0101100000011010000011011011001001001000101100001010011101111010 - // 1110110011101100000110010110101011001100110001010010100101110001 - - static REMAINING_WINDOWS: [(u8, u8); 39] = [ - (2, B_11 as u8), - (3 + 3, B_111 as u8), - (1 + 2, B_11 as u8), - (3 + 2, B_11 as u8), - (1 + 4, B_1001 as u8), - (4, B_1011 as u8), - (6 + 4, B_1111 as u8), - (3, B_101 as u8), - (4 + 1, B_1 as u8), - (4, B_1011 as u8), - (4, B_1001 as u8), - (1 + 4, B_1101 as u8), - (4, B_1101 as u8), - (4, B_1111 as u8), - (1 + 4, B_1011 as u8), - (6 + 4, B_1101 as u8), - (5 + 4, B_1101 as u8), - (4, B_1011 as u8), - (2 + 4, B_1001 as u8), - (2 + 1, B_1 as u8), - (3 + 4, B_1011 as u8), - (4 + 3, B_101 as u8), - (2 + 3, B_111 as u8), - (1 + 4, B_1111 as u8), - (1 + 4, B_1011 as u8), - (4, B_1011 as u8), - (2 + 3, B_111 as u8), - (1 + 2, B_11 as u8), - (5 + 2, B_11 as u8), - (2 + 4, B_1011 as u8), - (1 + 3, B_101 as u8), - (1 + 2, B_11 as u8), - (2 + 2, B_11 as u8), - (2 + 2, B_11 as u8), - (3 + 3, B_101 as u8), - (2 + 3, B_101 as u8), - (2 + 3, B_101 as u8), - (2, B_11 as u8), - (3 + 1, B_1 as u8), - ]; - - for &(squarings, digit) in &REMAINING_WINDOWS[..] { - sqr_mul_acc(&mut acc, usize::from(squarings), &d[usize::from(digit)]); - } - - acc -} - -unsafe extern "C" fn GFp_p384_elem_sqr_mont( - r: *mut Limb, // [COMMON_OPS.num_limbs] - a: *const Limb, // [COMMON_OPS.num_limbs] -) { - // XXX: Inefficient. TODO: Make a dedicated squaring routine. - GFp_p384_elem_mul_mont(r, a, a); -} - -const N_RR_LIMBS: [Limb; MAX_LIMBS] = p384_limbs![ - 0x19b409a9, 0x2d319b24, 0xdf1aa419, 0xff3d81e5, 0xfcb82947, 0xbc3e483a, 0x4aab1cc5, 0xd40d4917, - 0x28266895, 0x3fb05b7a, 0x2b39bf21, 0x0c84ee01 -]; - -extern "C" { - fn GFp_p384_elem_add( - r: *mut Limb, // [COMMON_OPS.num_limbs] - a: *const Limb, // [COMMON_OPS.num_limbs] - b: *const Limb, // [COMMON_OPS.num_limbs] - ); - fn GFp_p384_elem_mul_mont( - r: *mut Limb, // [COMMON_OPS.num_limbs] - a: *const Limb, // [COMMON_OPS.num_limbs] - b: *const Limb, // [COMMON_OPS.num_limbs] - ); - - fn GFp_nistz384_point_add( - r: *mut Limb, // [3][COMMON_OPS.num_limbs] - a: *const Limb, // [3][COMMON_OPS.num_limbs] - b: *const Limb, // [3][COMMON_OPS.num_limbs] - ); - fn GFp_nistz384_point_mul( - r: *mut Limb, // [3][COMMON_OPS.num_limbs] - p_scalar: *const Limb, // [COMMON_OPS.num_limbs] - p_x: *const Limb, // [COMMON_OPS.num_limbs] - p_y: *const Limb, // [COMMON_OPS.num_limbs] - ); - - fn GFp_p384_scalar_mul_mont( - r: *mut Limb, // [COMMON_OPS.num_limbs] - a: *const Limb, // [COMMON_OPS.num_limbs] - b: *const Limb, // [COMMON_OPS.num_limbs] - ); -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p384_scalar_mul_tests.txt temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p384_scalar_mul_tests.txt --- temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p384_scalar_mul_tests.txt 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops/p384_scalar_mul_tests.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,32 +0,0 @@ - -a = 00 -b = 00 -r = 00 - -a = 00 -b = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972 -r = 00 - -a = 01 -b = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972 -r = caa357821c6244e05eafdf931b0e6b53872b45a79929e877e4c3adcae9998bc585acc2c6a24bb9ca8be13114da045062 - -a = 02 -b = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972 -r = 9546af0438c489c0bd5fbf26361cd6a70e568b4f3253d0f002240e13defbe9abb33f77dafbe6cc1a2ad648bee7437751 - -a = 03 -b = ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972 -r = 5fea06865526cea11c0f9eb9512b41fa9581d0f6cb7db9681f846e5cd45e4791e0d22cef5581de69c9cb6068f4829e40 - -a = 7fffffffffffffffffffffffffffffffffffffffffffffffe3b1a6c0fa1b96efac0d06d9245853bd76760cb5666294b9 -b = 02 -r = caa357821c6244e05eafdf931b0e6b53872b45a79929e877e4c3adcae9998bc585acc2c6a24bb9ca8be13114da045062 - -a = 7fffffffffffffffffffffffffffffffffffffffffffffffe3b1a6c0fa1b96efac0d06d9245853bd76760cb5666294ba -b = 02 -r = 355ca87de39dbb1fa150206ce4f194ac78d4ba5866d61787e29f9fb70a9da219d26d4aeba664edb0610ae855f2c0d911 - -a = 800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -b = 02 -r = 01 diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops.rs temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/ops.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,1181 +0,0 @@ -// Copyright 2016 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -use crate::{arithmetic::montgomery::*, c, error, limb::*}; -use core::marker::PhantomData; - -pub use self::elem::*; - -/// A field element, i.e. an element of ℤ/qℤ for the curve's field modulus -/// *q*. -pub type Elem = elem::Elem; - -/// Represents the (prime) order *q* of the curve's prime field. -#[derive(Clone, Copy)] -pub enum Q {} - -/// A scalar. Its value is in [0, n). Zero-valued scalars are forbidden in most -/// contexts. -pub type Scalar = elem::Elem; - -/// Represents the prime order *n* of the curve's group. -#[derive(Clone, Copy)] -pub enum N {} - -pub struct Point { - // The coordinates are stored in a contiguous array, where the first - // `ops.num_limbs` elements are the X coordinate, the next - // `ops.num_limbs` elements are the Y coordinate, and the next - // `ops.num_limbs` elements are the Z coordinate. This layout is dictated - // by the requirements of the GFp_nistz256 code. - xyz: [Limb; 3 * MAX_LIMBS], -} - -impl Point { - pub fn new_at_infinity() -> Point { - Point { - xyz: [0; 3 * MAX_LIMBS], - } - } -} - -static ONE: Elem = Elem { - limbs: limbs![1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - m: PhantomData, - encoding: PhantomData, -}; - -/// Operations and values needed by all curve operations. -pub struct CommonOps { - pub num_limbs: usize, - q: Modulus, - pub n: Elem, - - pub a: Elem, // Must be -3 mod q - pub b: Elem, - - // In all cases, `r`, `a`, and `b` may all alias each other. - elem_add_impl: unsafe extern "C" fn(r: *mut Limb, a: *const Limb, b: *const Limb), - elem_mul_mont: unsafe extern "C" fn(r: *mut Limb, a: *const Limb, b: *const Limb), - elem_sqr_mont: unsafe extern "C" fn(r: *mut Limb, a: *const Limb), - - point_add_jacobian_impl: unsafe extern "C" fn(r: *mut Limb, a: *const Limb, b: *const Limb), -} - -impl CommonOps { - #[inline] - pub fn elem_add(&self, a: &mut Elem, b: &Elem) { - binary_op_assign(self.elem_add_impl, a, b) - } - - #[inline] - pub fn elems_are_equal(&self, a: &Elem, b: &Elem) -> LimbMask { - limbs_equal_limbs_consttime(&a.limbs[..self.num_limbs], &b.limbs[..self.num_limbs]) - } - - #[inline] - pub fn elem_unencoded(&self, a: &Elem) -> Elem { - self.elem_product(a, &ONE) - } - - #[inline] - pub fn elem_mul(&self, a: &mut Elem, b: &Elem) { - binary_op_assign(self.elem_mul_mont, a, b) - } - - #[inline] - pub fn elem_product( - &self, - a: &Elem, - b: &Elem, - ) -> Elem<<(EA, EB) as ProductEncoding>::Output> - where - (EA, EB): ProductEncoding, - { - mul_mont(self.elem_mul_mont, a, b) - } - - #[inline] - pub fn elem_square(&self, a: &mut Elem) { - unary_op_assign(self.elem_sqr_mont, a); - } - - #[inline] - pub fn elem_squared(&self, a: &Elem) -> Elem { - unary_op(self.elem_sqr_mont, a) - } - - #[inline] - pub fn is_zero(&self, a: &elem::Elem) -> bool { - limbs_are_zero_constant_time(&a.limbs[..self.num_limbs]) == LimbMask::True - } - - pub fn elem_verify_is_not_zero(&self, a: &Elem) -> Result<(), error::Unspecified> { - if self.is_zero(a) { - Err(error::Unspecified) - } else { - Ok(()) - } - } - - pub fn point_sum(&self, a: &Point, b: &Point) -> Point { - let mut r = Point::new_at_infinity(); - unsafe { - (self.point_add_jacobian_impl)(r.xyz.as_mut_ptr(), a.xyz.as_ptr(), b.xyz.as_ptr()) - } - r - } - - pub fn point_x(&self, p: &Point) -> Elem { - let mut r = Elem::zero(); - r.limbs[..self.num_limbs].copy_from_slice(&p.xyz[0..self.num_limbs]); - r - } - - pub fn point_y(&self, p: &Point) -> Elem { - let mut r = Elem::zero(); - r.limbs[..self.num_limbs].copy_from_slice(&p.xyz[self.num_limbs..(2 * self.num_limbs)]); - r - } - - pub fn point_z(&self, p: &Point) -> Elem { - let mut r = Elem::zero(); - r.limbs[..self.num_limbs] - .copy_from_slice(&p.xyz[(2 * self.num_limbs)..(3 * self.num_limbs)]); - r - } -} - -struct Modulus { - p: [Limb; MAX_LIMBS], - rr: [Limb; MAX_LIMBS], -} - -/// Operations on private keys, for ECDH and ECDSA signing. -pub struct PrivateKeyOps { - pub common: &'static CommonOps, - elem_inv_squared: fn(a: &Elem) -> Elem, - point_mul_base_impl: fn(a: &Scalar) -> Point, - point_mul_impl: unsafe extern "C" fn( - r: *mut Limb, // [3][num_limbs] - p_scalar: *const Limb, // [num_limbs] - p_x: *const Limb, // [num_limbs] - p_y: *const Limb, // [num_limbs] - ), -} - -impl PrivateKeyOps { - #[inline(always)] - pub fn point_mul_base(&self, a: &Scalar) -> Point { - (self.point_mul_base_impl)(a) - } - - #[inline(always)] - pub fn point_mul(&self, p_scalar: &Scalar, (p_x, p_y): &(Elem, Elem)) -> Point { - let mut r = Point::new_at_infinity(); - unsafe { - (self.point_mul_impl)( - r.xyz.as_mut_ptr(), - p_scalar.limbs.as_ptr(), - p_x.limbs.as_ptr(), - p_y.limbs.as_ptr(), - ); - } - r - } - - #[inline] - pub fn elem_inverse_squared(&self, a: &Elem) -> Elem { - (self.elem_inv_squared)(a) - } -} - -/// Operations and values needed by all operations on public keys (ECDH -/// agreement and ECDSA verification). -pub struct PublicKeyOps { - pub common: &'static CommonOps, -} - -impl PublicKeyOps { - // The serialized bytes are in big-endian order, zero-padded. The limbs - // of `Elem` are in the native endianness, least significant limb to - // most significant limb. Besides the parsing, conversion, this also - // implements NIST SP 800-56A Step 2: "Verify that xQ and yQ are integers - // in the interval [0, p-1] in the case that q is an odd prime p[.]" - pub fn elem_parse(&self, input: &mut untrusted::Reader) -> Result, error::Unspecified> { - let encoded_value = input.read_bytes(self.common.num_limbs * LIMB_BYTES)?; - let parsed = elem_parse_big_endian_fixed_consttime(self.common, encoded_value)?; - let mut r = Elem::zero(); - // Montgomery encode (elem_to_mont). - // TODO: do something about this. - unsafe { - (self.common.elem_mul_mont)( - r.limbs.as_mut_ptr(), - parsed.limbs.as_ptr(), - self.common.q.rr.as_ptr(), - ) - } - Ok(r) - } -} - -// Operations used by both ECDSA signing and ECDSA verification. In general -// these must be side-channel resistant. -pub struct ScalarOps { - pub common: &'static CommonOps, - - scalar_inv_to_mont_impl: fn(a: &Scalar) -> Scalar, - scalar_mul_mont: unsafe extern "C" fn(r: *mut Limb, a: *const Limb, b: *const Limb), -} - -impl ScalarOps { - // The (maximum) length of a scalar, not including any padding. - pub fn scalar_bytes_len(&self) -> usize { - self.common.num_limbs * LIMB_BYTES - } - - /// Returns the modular inverse of `a` (mod `n`). Panics of `a` is zero, - /// because zero isn't invertible. - pub fn scalar_inv_to_mont(&self, a: &Scalar) -> Scalar { - assert!(!self.common.is_zero(a)); - (self.scalar_inv_to_mont_impl)(a) - } - - #[inline] - pub fn scalar_product( - &self, - a: &Scalar, - b: &Scalar, - ) -> Scalar<<(EA, EB) as ProductEncoding>::Output> - where - (EA, EB): ProductEncoding, - { - mul_mont(self.scalar_mul_mont, a, b) - } -} - -/// Operations on public scalars needed by ECDSA signature verification. -pub struct PublicScalarOps { - pub scalar_ops: &'static ScalarOps, - pub public_key_ops: &'static PublicKeyOps, - - // XXX: `PublicScalarOps` shouldn't depend on `PrivateKeyOps`, but it does - // temporarily until `twin_mul` is rewritten. - pub private_key_ops: &'static PrivateKeyOps, - - pub q_minus_n: Elem, -} - -impl PublicScalarOps { - #[inline] - pub fn scalar_as_elem(&self, a: &Scalar) -> Elem { - Elem { - limbs: a.limbs, - m: PhantomData, - encoding: PhantomData, - } - } - - pub fn elem_equals(&self, a: &Elem, b: &Elem) -> bool { - for i in 0..self.public_key_ops.common.num_limbs { - if a.limbs[i] != b.limbs[i] { - return false; - } - } - true - } - - pub fn elem_less_than(&self, a: &Elem, b: &Elem) -> bool { - let num_limbs = self.public_key_ops.common.num_limbs; - limbs_less_than_limbs_vartime(&a.limbs[..num_limbs], &b.limbs[..num_limbs]) - } - - #[inline] - pub fn elem_sum(&self, a: &Elem, b: &Elem) -> Elem { - binary_op(self.public_key_ops.common.elem_add_impl, a, b) - } -} - -#[allow(non_snake_case)] -pub struct PrivateScalarOps { - pub scalar_ops: &'static ScalarOps, - - pub oneRR_mod_n: Scalar, // 1 * R**2 (mod n). TOOD: Use One. -} - -// This assumes n < q < 2*n. -pub fn elem_reduced_to_scalar(ops: &CommonOps, elem: &Elem) -> Scalar { - let num_limbs = ops.num_limbs; - let mut r_limbs = elem.limbs; - limbs_reduce_once_constant_time(&mut r_limbs[..num_limbs], &ops.n.limbs[..num_limbs]); - Scalar { - limbs: r_limbs, - m: PhantomData, - encoding: PhantomData, - } -} - -pub fn scalar_sum(ops: &CommonOps, a: &Scalar, b: &Scalar) -> Scalar { - let mut r = Scalar::zero(); - unsafe { - LIMBS_add_mod( - r.limbs.as_mut_ptr(), - a.limbs.as_ptr(), - b.limbs.as_ptr(), - ops.n.limbs.as_ptr(), - ops.num_limbs, - ) - } - r -} - -// Returns (`a` squared `squarings` times) * `b`. -fn elem_sqr_mul(ops: &CommonOps, a: &Elem, squarings: usize, b: &Elem) -> Elem { - debug_assert!(squarings >= 1); - let mut tmp = ops.elem_squared(a); - for _ in 1..squarings { - ops.elem_square(&mut tmp); - } - ops.elem_product(&tmp, b) -} - -// Sets `acc` = (`acc` squared `squarings` times) * `b`. -fn elem_sqr_mul_acc(ops: &CommonOps, acc: &mut Elem, squarings: usize, b: &Elem) { - debug_assert!(squarings >= 1); - for _ in 0..squarings { - ops.elem_square(acc); - } - ops.elem_mul(acc, b) -} - -#[inline] -pub fn elem_parse_big_endian_fixed_consttime( - ops: &CommonOps, - bytes: untrusted::Input, -) -> Result, error::Unspecified> { - parse_big_endian_fixed_consttime(ops, bytes, AllowZero::Yes, &ops.q.p[..ops.num_limbs]) -} - -#[inline] -pub fn scalar_parse_big_endian_fixed_consttime( - ops: &CommonOps, - bytes: untrusted::Input, -) -> Result { - parse_big_endian_fixed_consttime(ops, bytes, AllowZero::No, &ops.n.limbs[..ops.num_limbs]) -} - -#[inline] -pub fn scalar_parse_big_endian_variable( - ops: &CommonOps, - allow_zero: AllowZero, - bytes: untrusted::Input, -) -> Result { - let mut r = Scalar::zero(); - parse_big_endian_in_range_and_pad_consttime( - bytes, - allow_zero, - &ops.n.limbs[..ops.num_limbs], - &mut r.limbs[..ops.num_limbs], - )?; - Ok(r) -} - -pub fn scalar_parse_big_endian_partially_reduced_variable_consttime( - ops: &CommonOps, - allow_zero: AllowZero, - bytes: untrusted::Input, -) -> Result { - let mut r = Scalar::zero(); - parse_big_endian_in_range_partially_reduced_and_pad_consttime( - bytes, - allow_zero, - &ops.n.limbs[..ops.num_limbs], - &mut r.limbs[..ops.num_limbs], - )?; - Ok(r) -} - -fn parse_big_endian_fixed_consttime( - ops: &CommonOps, - bytes: untrusted::Input, - allow_zero: AllowZero, - max_exclusive: &[Limb], -) -> Result, error::Unspecified> { - if bytes.len() != ops.num_limbs * LIMB_BYTES { - return Err(error::Unspecified); - } - let mut r = elem::Elem::zero(); - parse_big_endian_in_range_and_pad_consttime( - bytes, - allow_zero, - max_exclusive, - &mut r.limbs[..ops.num_limbs], - )?; - Ok(r) -} - -extern "C" { - fn LIMBS_add_mod( - r: *mut Limb, - a: *const Limb, - b: *const Limb, - m: *const Limb, - num_limbs: c::size_t, - ); -} - -#[cfg(test)] -mod tests { - use super::*; - use crate::test; - use alloc::{format, vec, vec::Vec}; - - const ZERO_SCALAR: Scalar = Scalar { - limbs: [0; MAX_LIMBS], - m: PhantomData, - encoding: PhantomData, - }; - - fn q_minus_n_plus_n_equals_0_test(ops: &PublicScalarOps) { - let cops = ops.scalar_ops.common; - let mut x = ops.q_minus_n; - cops.elem_add(&mut x, &cops.n); - assert!(cops.is_zero(&x)); - } - - #[test] - fn p256_q_minus_n_plus_n_equals_0_test() { - q_minus_n_plus_n_equals_0_test(&p256::PUBLIC_SCALAR_OPS); - } - - #[test] - fn p384_q_minus_n_plus_n_equals_0_test() { - q_minus_n_plus_n_equals_0_test(&p384::PUBLIC_SCALAR_OPS); - } - - #[test] - fn p256_elem_add_test() { - elem_add_test( - &p256::PUBLIC_SCALAR_OPS, - test_file!("ops/p256_elem_sum_tests.txt"), - ); - } - - #[test] - fn p384_elem_add_test() { - elem_add_test( - &p384::PUBLIC_SCALAR_OPS, - test_file!("ops/p384_elem_sum_tests.txt"), - ); - } - - fn elem_add_test(ops: &PublicScalarOps, test_file: test::File) { - test::run(test_file, |section, test_case| { - assert_eq!(section, ""); - - let cops = ops.public_key_ops.common; - let a = consume_elem(cops, test_case, "a"); - let b = consume_elem(cops, test_case, "b"); - let expected_sum = consume_elem(cops, test_case, "r"); - - let mut actual_sum = a; - ops.public_key_ops.common.elem_add(&mut actual_sum, &b); - assert_limbs_are_equal(cops, &actual_sum.limbs, &expected_sum.limbs); - - let mut actual_sum = b; - ops.public_key_ops.common.elem_add(&mut actual_sum, &a); - assert_limbs_are_equal(cops, &actual_sum.limbs, &expected_sum.limbs); - - Ok(()) - }) - } - - // XXX: There's no `GFp_nistz256_sub` in *ring*; it's logic is inlined into - // the point arithmetic functions. Thus, we can't test it. - - #[test] - fn p384_elem_sub_test() { - extern "C" { - fn GFp_p384_elem_sub(r: *mut Limb, a: *const Limb, b: *const Limb); - } - elem_sub_test( - &p384::COMMON_OPS, - GFp_p384_elem_sub, - test_file!("ops/p384_elem_sum_tests.txt"), - ); - } - - fn elem_sub_test( - ops: &CommonOps, - elem_sub: unsafe extern "C" fn(r: *mut Limb, a: *const Limb, b: *const Limb), - test_file: test::File, - ) { - test::run(test_file, |section, test_case| { - assert_eq!(section, ""); - - let a = consume_elem(ops, test_case, "a"); - let b = consume_elem(ops, test_case, "b"); - let r = consume_elem(ops, test_case, "r"); - - let mut actual_difference = Elem::::zero(); - unsafe { - elem_sub( - actual_difference.limbs.as_mut_ptr(), - r.limbs.as_ptr(), - b.limbs.as_ptr(), - ); - } - assert_limbs_are_equal(ops, &actual_difference.limbs, &a.limbs); - - let mut actual_difference = Elem::::zero(); - unsafe { - elem_sub( - actual_difference.limbs.as_mut_ptr(), - r.limbs.as_ptr(), - a.limbs.as_ptr(), - ); - } - assert_limbs_are_equal(ops, &actual_difference.limbs, &b.limbs); - - Ok(()) - }) - } - - // XXX: There's no `GFp_nistz256_div_by_2` in *ring*; it's logic is inlined - // into the point arithmetic functions. Thus, we can't test it. - - #[test] - fn p384_elem_div_by_2_test() { - extern "C" { - fn GFp_p384_elem_div_by_2(r: *mut Limb, a: *const Limb); - } - elem_div_by_2_test( - &p384::COMMON_OPS, - GFp_p384_elem_div_by_2, - test_file!("ops/p384_elem_div_by_2_tests.txt"), - ); - } - - fn elem_div_by_2_test( - ops: &CommonOps, - elem_div_by_2: unsafe extern "C" fn(r: *mut Limb, a: *const Limb), - test_file: test::File, - ) { - test::run(test_file, |section, test_case| { - assert_eq!(section, ""); - - let a = consume_elem(ops, test_case, "a"); - let r = consume_elem(ops, test_case, "r"); - - let mut actual_result = Elem::::zero(); - unsafe { - elem_div_by_2(actual_result.limbs.as_mut_ptr(), a.limbs.as_ptr()); - } - assert_limbs_are_equal(ops, &actual_result.limbs, &r.limbs); - - Ok(()) - }) - } - - // TODO: Add test vectors that test the range of values above `q`. - #[test] - fn p256_elem_neg_test() { - extern "C" { - fn GFp_nistz256_neg(r: *mut Limb, a: *const Limb); - } - elem_neg_test( - &p256::COMMON_OPS, - GFp_nistz256_neg, - test_file!("ops/p256_elem_neg_tests.txt"), - ); - } - - #[test] - fn p384_elem_neg_test() { - extern "C" { - fn GFp_p384_elem_neg(r: *mut Limb, a: *const Limb); - } - elem_neg_test( - &p384::COMMON_OPS, - GFp_p384_elem_neg, - test_file!("ops/p384_elem_neg_tests.txt"), - ); - } - - fn elem_neg_test( - ops: &CommonOps, - elem_neg: unsafe extern "C" fn(r: *mut Limb, a: *const Limb), - test_file: test::File, - ) { - test::run(test_file, |section, test_case| { - assert_eq!(section, ""); - - let a = consume_elem(ops, test_case, "a"); - let b = consume_elem(ops, test_case, "b"); - - // Verify -a == b. - { - let mut actual_result = Elem::::zero(); - unsafe { - elem_neg(actual_result.limbs.as_mut_ptr(), a.limbs.as_ptr()); - } - assert_limbs_are_equal(ops, &actual_result.limbs, &b.limbs); - } - - // Verify -b == a. - { - let mut actual_result = Elem::::zero(); - unsafe { - elem_neg(actual_result.limbs.as_mut_ptr(), b.limbs.as_ptr()); - } - assert_limbs_are_equal(ops, &actual_result.limbs, &a.limbs); - } - - Ok(()) - }) - } - - #[test] - fn p256_elem_mul_test() { - elem_mul_test(&p256::COMMON_OPS, test_file!("ops/p256_elem_mul_tests.txt")); - } - - #[test] - fn p384_elem_mul_test() { - elem_mul_test(&p384::COMMON_OPS, test_file!("ops/p384_elem_mul_tests.txt")); - } - - fn elem_mul_test(ops: &CommonOps, test_file: test::File) { - test::run(test_file, |section, test_case| { - assert_eq!(section, ""); - - let mut a = consume_elem(ops, test_case, "a"); - let b = consume_elem(ops, test_case, "b"); - let r = consume_elem(ops, test_case, "r"); - ops.elem_mul(&mut a, &b); - assert_limbs_are_equal(ops, &a.limbs, &r.limbs); - - Ok(()) - }) - } - - #[test] - fn p256_scalar_mul_test() { - scalar_mul_test( - &p256::SCALAR_OPS, - test_file!("ops/p256_scalar_mul_tests.txt"), - ); - } - - #[test] - fn p384_scalar_mul_test() { - scalar_mul_test( - &p384::SCALAR_OPS, - test_file!("ops/p384_scalar_mul_tests.txt"), - ); - } - - fn scalar_mul_test(ops: &ScalarOps, test_file: test::File) { - test::run(test_file, |section, test_case| { - assert_eq!(section, ""); - let cops = ops.common; - let a = consume_scalar(cops, test_case, "a"); - let b = consume_scalar_mont(cops, test_case, "b"); - let expected_result = consume_scalar(cops, test_case, "r"); - let actual_result = ops.scalar_product(&a, &b); - assert_limbs_are_equal(cops, &actual_result.limbs, &expected_result.limbs); - - Ok(()) - }) - } - - #[test] - fn p256_scalar_square_test() { - extern "C" { - fn GFp_p256_scalar_sqr_rep_mont(r: *mut Limb, a: *const Limb, rep: Limb); - } - scalar_square_test( - &p256::SCALAR_OPS, - GFp_p256_scalar_sqr_rep_mont, - test_file!("ops/p256_scalar_square_tests.txt"), - ); - } - - // XXX: There's no `p384_scalar_square_test()` because there's no dedicated - // `GFp_p384_scalar_sqr_rep_mont()`. - - fn scalar_square_test( - ops: &ScalarOps, - sqr_rep: unsafe extern "C" fn(r: *mut Limb, a: *const Limb, rep: Limb), - test_file: test::File, - ) { - test::run(test_file, |section, test_case| { - assert_eq!(section, ""); - let cops = &ops.common; - let a = consume_scalar(cops, test_case, "a"); - let expected_result = consume_scalar(cops, test_case, "r"); - - { - let mut actual_result: Scalar = Scalar { - limbs: [0; MAX_LIMBS], - m: PhantomData, - encoding: PhantomData, - }; - unsafe { - sqr_rep(actual_result.limbs.as_mut_ptr(), a.limbs.as_ptr(), 1); - } - assert_limbs_are_equal(cops, &actual_result.limbs, &expected_result.limbs); - } - - { - let actual_result = ops.scalar_product(&a, &a); - assert_limbs_are_equal(cops, &actual_result.limbs, &expected_result.limbs); - } - - Ok(()) - }) - } - - #[test] - #[should_panic(expected = "!self.common.is_zero(a)")] - fn p256_scalar_inv_to_mont_zero_panic_test() { - let _ = p256::SCALAR_OPS.scalar_inv_to_mont(&ZERO_SCALAR); - } - - #[test] - #[should_panic(expected = "!self.common.is_zero(a)")] - fn p384_scalar_inv_to_mont_zero_panic_test() { - let _ = p384::SCALAR_OPS.scalar_inv_to_mont(&ZERO_SCALAR); - } - - #[test] - fn p256_point_sum_test() { - point_sum_test( - &p256::PRIVATE_KEY_OPS, - test_file!("ops/p256_point_sum_tests.txt"), - ); - } - - #[test] - fn p384_point_sum_test() { - point_sum_test( - &p384::PRIVATE_KEY_OPS, - test_file!("ops/p384_point_sum_tests.txt"), - ); - } - - fn point_sum_test(ops: &PrivateKeyOps, test_file: test::File) { - test::run(test_file, |section, test_case| { - assert_eq!(section, ""); - - let a = consume_jacobian_point(ops, test_case, "a"); - let b = consume_jacobian_point(ops, test_case, "b"); - let r_expected = consume_point(ops, test_case, "r"); - - let r_actual = ops.common.point_sum(&a, &b); - assert_point_actual_equals_expected(ops, &r_actual, &r_expected); - - Ok(()) - }); - } - - // Keep this in sync with the logic for defining `GFp_USE_LARGE_TABLE` and - // with the corresponding code in p256.rs that decides which base point - // multiplication to use. - #[cfg(any(target_arch = "aarch64", target_arch = "x86", target_arch = "x86_64"))] - #[test] - fn p256_point_sum_mixed_test() { - extern "C" { - fn GFp_nistz256_point_add_affine( - r: *mut Limb, // [p256::COMMON_OPS.num_limbs*3] - a: *const Limb, // [p256::COMMON_OPS.num_limbs*3] - b: *const Limb, // [p256::COMMON_OPS.num_limbs*2] - ); - } - point_sum_mixed_test( - &p256::PRIVATE_KEY_OPS, - GFp_nistz256_point_add_affine, - test_file!("ops/p256_point_sum_mixed_tests.txt"), - ); - } - - // XXX: There is no `GFp_nistz384_point_add_affine()`. - - #[cfg(any(target_arch = "aarch64", target_arch = "x86", target_arch = "x86_64"))] - fn point_sum_mixed_test( - ops: &PrivateKeyOps, - point_add_affine: unsafe extern "C" fn( - r: *mut Limb, // [ops.num_limbs*3] - a: *const Limb, // [ops.num_limbs*3] - b: *const Limb, // [ops.num_limbs*2] - ), - test_file: test::File, - ) { - test::run(test_file, |section, test_case| { - assert_eq!(section, ""); - - let a = consume_jacobian_point(ops, test_case, "a"); - let b = consume_affine_point(ops, test_case, "b"); - let r_expected = consume_point(ops, test_case, "r"); - - let mut r_actual = Point::new_at_infinity(); - unsafe { - point_add_affine(r_actual.xyz.as_mut_ptr(), a.xyz.as_ptr(), b.xy.as_ptr()); - } - - assert_point_actual_equals_expected(ops, &r_actual, &r_expected); - - Ok(()) - }); - } - - #[test] - fn p256_point_double_test() { - extern "C" { - fn GFp_nistz256_point_double( - r: *mut Limb, // [p256::COMMON_OPS.num_limbs*3] - a: *const Limb, // [p256::COMMON_OPS.num_limbs*3] - ); - } - point_double_test( - &p256::PRIVATE_KEY_OPS, - GFp_nistz256_point_double, - test_file!("ops/p256_point_double_tests.txt"), - ); - } - - #[test] - fn p384_point_double_test() { - extern "C" { - fn GFp_nistz384_point_double( - r: *mut Limb, // [p384::COMMON_OPS.num_limbs*3] - a: *const Limb, // [p384::COMMON_OPS.num_limbs*3] - ); - } - point_double_test( - &p384::PRIVATE_KEY_OPS, - GFp_nistz384_point_double, - test_file!("ops/p384_point_double_tests.txt"), - ); - } - - fn point_double_test( - ops: &PrivateKeyOps, - point_double: unsafe extern "C" fn( - r: *mut Limb, // [ops.num_limbs*3] - a: *const Limb, // [ops.num_limbs*3] - ), - test_file: test::File, - ) { - test::run(test_file, |section, test_case| { - assert_eq!(section, ""); - - let a = consume_jacobian_point(ops, test_case, "a"); - let r_expected = consume_point(ops, test_case, "r"); - - let mut r_actual = Point::new_at_infinity(); - unsafe { - point_double(r_actual.xyz.as_mut_ptr(), a.xyz.as_ptr()); - } - - assert_point_actual_equals_expected(ops, &r_actual, &r_expected); - - Ok(()) - }); - } - - #[test] - fn p256_point_mul_test() { - point_mul_tests( - &p256::PRIVATE_KEY_OPS, - test_file!("ops/p256_point_mul_tests.txt"), - ); - } - - #[test] - fn p384_point_mul_test() { - point_mul_tests( - &p384::PRIVATE_KEY_OPS, - test_file!("ops/p384_point_mul_tests.txt"), - ); - } - - fn point_mul_tests(ops: &PrivateKeyOps, test_file: test::File) { - test::run(test_file, |section, test_case| { - assert_eq!(section, ""); - let p_scalar = consume_scalar(ops.common, test_case, "p_scalar"); - let (x, y) = match consume_point(ops, test_case, "p") { - TestPoint::Infinity => { - panic!("can't be inf."); - } - TestPoint::Affine(x, y) => (x, y), - }; - let expected_result = consume_point(ops, test_case, "r"); - let actual_result = ops.point_mul(&p_scalar, &(x, y)); - assert_point_actual_equals_expected(ops, &actual_result, &expected_result); - Ok(()) - }) - } - - #[test] - fn p256_point_mul_serialized_test() { - point_mul_serialized_test( - &p256::PRIVATE_KEY_OPS, - &p256::PUBLIC_KEY_OPS, - test_file!("ops/p256_point_mul_serialized_tests.txt"), - ); - } - - fn point_mul_serialized_test( - priv_ops: &PrivateKeyOps, - pub_ops: &PublicKeyOps, - test_file: test::File, - ) { - let cops = pub_ops.common; - - test::run(test_file, |section, test_case| { - assert_eq!(section, ""); - let p_scalar = consume_scalar(cops, test_case, "p_scalar"); - - let p = test_case.consume_bytes("p"); - let p = super::super::public_key::parse_uncompressed_point( - pub_ops, - untrusted::Input::from(&p), - ) - .expect("valid point"); - - let expected_result = test_case.consume_bytes("r"); - - let product = priv_ops.point_mul(&p_scalar, &p); - - let mut actual_result = vec![4u8; 1 + (2 * (cops.num_limbs * LIMB_BYTES))]; - { - let (x, y) = actual_result[1..].split_at_mut(cops.num_limbs * LIMB_BYTES); - super::super::private_key::big_endian_affine_from_jacobian( - priv_ops, - Some(x), - Some(y), - &product, - ) - .expect("successful encoding"); - } - - assert_eq!(expected_result, actual_result); - - Ok(()) - }) - } - - #[test] - fn p256_point_mul_base_test() { - point_mul_base_tests( - &p256::PRIVATE_KEY_OPS, - test_file!("ops/p256_point_mul_base_tests.txt"), - ); - } - - #[test] - fn p384_point_mul_base_test() { - point_mul_base_tests( - &p384::PRIVATE_KEY_OPS, - test_file!("ops/p384_point_mul_base_tests.txt"), - ); - } - - fn point_mul_base_tests(ops: &PrivateKeyOps, test_file: test::File) { - test::run(test_file, |section, test_case| { - assert_eq!(section, ""); - let g_scalar = consume_scalar(ops.common, test_case, "g_scalar"); - let expected_result = consume_point(ops, test_case, "r"); - let actual_result = ops.point_mul_base(&g_scalar); - assert_point_actual_equals_expected(ops, &actual_result, &expected_result); - Ok(()) - }) - } - - fn assert_point_actual_equals_expected( - ops: &PrivateKeyOps, - actual_point: &Point, - expected_point: &TestPoint, - ) { - let cops = ops.common; - let actual_x = &cops.point_x(&actual_point); - let actual_y = &cops.point_y(&actual_point); - let actual_z = &cops.point_z(&actual_point); - match expected_point { - TestPoint::Infinity => { - let zero = Elem::zero(); - assert_elems_are_equal(cops, &actual_z, &zero); - } - TestPoint::Affine(expected_x, expected_y) => { - let zz_inv = ops.elem_inverse_squared(&actual_z); - let x_aff = cops.elem_product(&actual_x, &zz_inv); - let y_aff = { - let zzzz_inv = cops.elem_squared(&zz_inv); - let zzz_inv = cops.elem_product(&actual_z, &zzzz_inv); - cops.elem_product(&actual_y, &zzz_inv) - }; - - assert_elems_are_equal(cops, &x_aff, &expected_x); - assert_elems_are_equal(cops, &y_aff, &expected_y); - } - } - } - - fn consume_jacobian_point( - ops: &PrivateKeyOps, - test_case: &mut test::TestCase, - name: &str, - ) -> Point { - let input = test_case.consume_string(name); - let elems = input.split(", ").collect::>(); - assert_eq!(elems.len(), 3); - let mut p = Point::new_at_infinity(); - consume_point_elem(ops.common, &mut p.xyz, &elems, 0); - consume_point_elem(ops.common, &mut p.xyz, &elems, 1); - consume_point_elem(ops.common, &mut p.xyz, &elems, 2); - p - } - - #[cfg(any(target_arch = "aarch64", target_arch = "x86", target_arch = "x86_64"))] - struct AffinePoint { - xy: [Limb; 2 * MAX_LIMBS], - } - - #[cfg(any(target_arch = "aarch64", target_arch = "x86", target_arch = "x86_64"))] - fn consume_affine_point( - ops: &PrivateKeyOps, - test_case: &mut test::TestCase, - name: &str, - ) -> AffinePoint { - let input = test_case.consume_string(name); - let elems = input.split(", ").collect::>(); - assert_eq!(elems.len(), 2); - let mut p = AffinePoint { - xy: [0; 2 * MAX_LIMBS], - }; - consume_point_elem(ops.common, &mut p.xy, &elems, 0); - consume_point_elem(ops.common, &mut p.xy, &elems, 1); - p - } - - fn consume_point_elem(ops: &CommonOps, limbs_out: &mut [Limb], elems: &[&str], i: usize) { - let bytes = test::from_hex(elems[i]).unwrap(); - let bytes = untrusted::Input::from(&bytes); - let r: Elem = elem_parse_big_endian_fixed_consttime(ops, bytes).unwrap(); - // XXX: “Transmute†this to `Elem` limbs. - limbs_out[(i * ops.num_limbs)..((i + 1) * ops.num_limbs)] - .copy_from_slice(&r.limbs[..ops.num_limbs]); - } - - enum TestPoint { - Infinity, - Affine(Elem, Elem), - } - - fn consume_point(ops: &PrivateKeyOps, test_case: &mut test::TestCase, name: &str) -> TestPoint { - fn consume_point_elem(ops: &CommonOps, elems: &[&str], i: usize) -> Elem { - let bytes = test::from_hex(elems[i]).unwrap(); - let bytes = untrusted::Input::from(&bytes); - let unencoded: Elem = - elem_parse_big_endian_fixed_consttime(ops, bytes).unwrap(); - // XXX: “Transmute†this to `Elem` limbs. - Elem { - limbs: unencoded.limbs, - m: PhantomData, - encoding: PhantomData, - } - } - - let input = test_case.consume_string(name); - if input == "inf" { - return TestPoint::Infinity; - } - let elems = input.split(", ").collect::>(); - assert_eq!(elems.len(), 2); - let x = consume_point_elem(ops.common, &elems, 0); - let y = consume_point_elem(ops.common, &elems, 1); - TestPoint::Affine(x, y) - } - - fn assert_elems_are_equal(ops: &CommonOps, a: &Elem, b: &Elem) { - assert_limbs_are_equal(ops, &a.limbs, &b.limbs) - } - - fn assert_limbs_are_equal( - ops: &CommonOps, - actual: &[Limb; MAX_LIMBS], - expected: &[Limb; MAX_LIMBS], - ) { - for i in 0..ops.num_limbs { - if actual[i] != expected[i] { - let mut s = alloc::string::String::new(); - for j in 0..ops.num_limbs { - let formatted = format!("{:016x}", actual[ops.num_limbs - j - 1]); - s.push_str(&formatted); - } - panic!("Actual != Expected,\nActual = {}", s); - } - } - } - - fn consume_elem(ops: &CommonOps, test_case: &mut test::TestCase, name: &str) -> Elem { - let bytes = consume_padded_bytes(ops, test_case, name); - let bytes = untrusted::Input::from(&bytes); - let r: Elem = elem_parse_big_endian_fixed_consttime(ops, bytes).unwrap(); - // XXX: “Transmute†this to an `Elem`. - Elem { - limbs: r.limbs, - m: PhantomData, - encoding: PhantomData, - } - } - - fn consume_scalar(ops: &CommonOps, test_case: &mut test::TestCase, name: &str) -> Scalar { - let bytes = test_case.consume_bytes(name); - let bytes = untrusted::Input::from(&bytes); - scalar_parse_big_endian_variable(ops, AllowZero::Yes, bytes).unwrap() - } - - fn consume_scalar_mont( - ops: &CommonOps, - test_case: &mut test::TestCase, - name: &str, - ) -> Scalar { - let bytes = test_case.consume_bytes(name); - let bytes = untrusted::Input::from(&bytes); - let s = scalar_parse_big_endian_variable(ops, AllowZero::Yes, bytes).unwrap(); - // “Transmute†it to a `Scalar`. - Scalar { - limbs: s.limbs, - m: PhantomData, - encoding: PhantomData, - } - } - - fn consume_padded_bytes( - ops: &CommonOps, - test_case: &mut test::TestCase, - name: &str, - ) -> Vec { - let unpadded_bytes = test_case.consume_bytes(name); - let mut bytes = vec![0; (ops.num_limbs * LIMB_BYTES) - unpadded_bytes.len()]; - bytes.extend(&unpadded_bytes); - bytes - } -} - -mod elem; -pub mod p256; -pub mod p384; diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/private_key.rs temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/private_key.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/private_key.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/private_key.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,203 +0,0 @@ -// Copyright 2016 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -//! Functionality shared by operations on private keys (ECC keygen and -//! ECDSA signing). - -use super::{ops::*, verify_affine_point_is_on_the_curve}; -use crate::{ - arithmetic::montgomery::R, - ec, error, - limb::{self, LIMB_BYTES}, - rand, -}; - -/// Generates a random scalar in the range [1, n). -pub fn random_scalar( - ops: &PrivateKeyOps, - rng: &dyn rand::SecureRandom, -) -> Result { - let num_limbs = ops.common.num_limbs; - let mut bytes = [0; ec::SCALAR_MAX_BYTES]; - let bytes = &mut bytes[..(num_limbs * LIMB_BYTES)]; - generate_private_scalar_bytes(ops, rng, bytes)?; - scalar_from_big_endian_bytes(ops, bytes) -} - -pub fn generate_private_scalar_bytes( - ops: &PrivateKeyOps, - rng: &dyn rand::SecureRandom, - out: &mut [u8], -) -> Result<(), error::Unspecified> { - // [NSA Suite B Implementer's Guide to ECDSA] Appendix A.1.2, and - // [NSA Suite B Implementer's Guide to NIST SP 800-56A] Appendix B.2, - // "Key Pair Generation by Testing Candidates". - // - // [NSA Suite B Implementer's Guide to ECDSA]: doc/ecdsa.pdf. - // [NSA Suite B Implementer's Guide to NIST SP 800-56A]: doc/ecdh.pdf. - - // TODO: The NSA guide also suggests, in appendix B.1, another mechanism - // that would avoid the need to use `rng.fill()` more than once. It works - // by generating an extra 64 bits of random bytes and then reducing the - // output (mod n). Supposedly, this removes enough of the bias towards - // small values from the modular reduction, but it isn't obvious that it is - // sufficient. TODO: Figure out what we can do to mitigate the bias issue - // and switch to the other mechanism. - - let candidate = out; - - // XXX: The value 100 was chosen to match OpenSSL due to uncertainty of - // what specific value would be better, but it seems bad to try 100 times. - for _ in 0..100 { - // NSA Guide Steps 1, 2, and 3. - // - // Since we calculate the length ourselves, it is pointless to check - // it, since we can only check it by doing the same calculation. - - // NSA Guide Step 4. - // - // The requirement that the random number generator has the - // requested security strength is delegated to `rng`. - rng.fill(candidate)?; - - // NSA Guide Steps 5, 6, and 7. - if check_scalar_big_endian_bytes(ops, candidate).is_err() { - continue; - } - - // NSA Guide Step 8 is done in `public_from_private()`. - - // NSA Guide Step 9. - return Ok(()); - } - - Err(error::Unspecified) -} - -// The underlying X25519 and Ed25519 code uses an [u8; 32] to store the private -// key. To make the ECDH and ECDSA code similar to that, we also store the -// private key that way, which means we have to convert it to a Scalar whenever -// we need to use it. -#[inline] -pub fn private_key_as_scalar(ops: &PrivateKeyOps, private_key: &ec::Seed) -> Scalar { - // This cannot fail because we know the private key is valid. - scalar_from_big_endian_bytes(ops, private_key.bytes_less_safe()).unwrap() -} - -pub fn check_scalar_big_endian_bytes( - ops: &PrivateKeyOps, - bytes: &[u8], -) -> Result<(), error::Unspecified> { - debug_assert_eq!(bytes.len(), ops.common.num_limbs * LIMB_BYTES); - scalar_from_big_endian_bytes(ops, bytes).map(|_| ()) -} - -// Parses a fixed-length (zero-padded) big-endian-encoded scalar in the range -// [1, n). This is constant-time with respect to the actual value *only if* the -// value is actually in range. In other words, this won't leak anything about a -// valid value, but it might leak small amounts of information about an invalid -// value (which constraint it failed). -pub fn scalar_from_big_endian_bytes( - ops: &PrivateKeyOps, - bytes: &[u8], -) -> Result { - // [NSA Suite B Implementer's Guide to ECDSA] Appendix A.1.2, and - // [NSA Suite B Implementer's Guide to NIST SP 800-56A] Appendix B.2, - // "Key Pair Generation by Testing Candidates". - // - // [NSA Suite B Implementer's Guide to ECDSA]: doc/ecdsa.pdf. - // [NSA Suite B Implementer's Guide to NIST SP 800-56A]: doc/ecdh.pdf. - // - // Steps 5, 6, and 7. - // - // XXX: The NSA guide says that we should verify that the random scalar is - // in the range [0, n - 1) and then add one to it so that it is in the range - // [1, n). Instead, we verify that the scalar is in the range [1, n). This - // way, we avoid needing to compute or store the value (n - 1), we avoid the - // need to implement a function to add one to a scalar, and we avoid needing - // to convert the scalar back into an array of bytes. - scalar_parse_big_endian_fixed_consttime(ops.common, untrusted::Input::from(bytes)) -} - -pub fn public_from_private( - ops: &PrivateKeyOps, - public_out: &mut [u8], - my_private_key: &ec::Seed, -) -> Result<(), error::Unspecified> { - let elem_and_scalar_bytes = ops.common.num_limbs * LIMB_BYTES; - debug_assert_eq!(public_out.len(), 1 + (2 * elem_and_scalar_bytes)); - let my_private_key = private_key_as_scalar(ops, my_private_key); - let my_public_key = ops.point_mul_base(&my_private_key); - public_out[0] = 4; // Uncompressed encoding. - let (x_out, y_out) = (&mut public_out[1..]).split_at_mut(elem_and_scalar_bytes); - - // `big_endian_affine_from_jacobian` verifies that the point is not at - // infinity and is on the curve. - big_endian_affine_from_jacobian(ops, Some(x_out), Some(y_out), &my_public_key) -} - -pub fn affine_from_jacobian( - ops: &PrivateKeyOps, - p: &Point, -) -> Result<(Elem, Elem), error::Unspecified> { - let z = ops.common.point_z(p); - - // Since we restrict our private key to the range [1, n), the curve has - // prime order, and we verify that the peer's point is on the curve, - // there's no way that the result can be at infinity. But, use `assert!` - // instead of `debug_assert!` anyway - assert!(ops.common.elem_verify_is_not_zero(&z).is_ok()); - - let x = ops.common.point_x(p); - let y = ops.common.point_y(p); - - let zz_inv = ops.elem_inverse_squared(&z); - - let x_aff = ops.common.elem_product(&x, &zz_inv); - - // `y_aff` is needed to validate the point is on the curve. It is also - // needed in the non-ECDH case where we need to output it. - let y_aff = { - let zzzz_inv = ops.common.elem_squared(&zz_inv); - let zzz_inv = ops.common.elem_product(&z, &zzzz_inv); - ops.common.elem_product(&y, &zzz_inv) - }; - - // If we validated our inputs correctly and then computed (x, y, z), then - // (x, y, z) will be on the curve. See - // `verify_affine_point_is_on_the_curve_scaled` for the motivation. - verify_affine_point_is_on_the_curve(ops.common, (&x_aff, &y_aff))?; - - Ok((x_aff, y_aff)) -} - -pub fn big_endian_affine_from_jacobian( - ops: &PrivateKeyOps, - x_out: Option<&mut [u8]>, - y_out: Option<&mut [u8]>, - p: &Point, -) -> Result<(), error::Unspecified> { - let (x_aff, y_aff) = affine_from_jacobian(ops, p)?; - let num_limbs = ops.common.num_limbs; - if let Some(x_out) = x_out { - let x = ops.common.elem_unencoded(&x_aff); - limb::big_endian_from_limbs(&x.limbs[..num_limbs], x_out); - } - if let Some(y_out) = y_out { - let y = ops.common.elem_unencoded(&y_aff); - limb::big_endian_from_limbs(&y.limbs[..num_limbs], y_out); - } - - Ok(()) -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/public_key.rs temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/public_key.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/public_key.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/public_key.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,107 +0,0 @@ -// Copyright 2016 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -//! Functionality shared by operations on public keys (ECDSA verification and -//! ECDH agreement). - -use super::{ops::*, verify_affine_point_is_on_the_curve}; -use crate::{arithmetic::montgomery::*, error}; - -/// Parses a public key encoded in uncompressed form. The key is validated -/// using the ECC Partial Public-Key Validation Routine from -/// [NIST SP 800-56A, revision 2] Section 5.6.2.3.3, the NSA's -/// "Suite B Implementer's Guide to NIST SP 800-56A," Appendix B.3, and the -/// NSA's "Suite B Implementer's Guide to FIPS 186-3 (ECDSA)," Appendix A.3. -/// -/// [NIST SP 800-56A, revision 2]: -/// http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-56Ar2.pdf -pub fn parse_uncompressed_point( - ops: &PublicKeyOps, - input: untrusted::Input, -) -> Result<(Elem, Elem), error::Unspecified> { - // NIST SP 800-56A Step 1: "Verify that Q is not the point at infinity. - // This can be done by inspection if the point is entered in the standard - // affine representation." (We do it by inspection since we only accept - // the affine representation.) - let (x, y) = input.read_all(error::Unspecified, |input| { - // The encoding must be 4, which is the encoding for "uncompressed". - let encoding = input.read_byte()?; - if encoding != 4 { - return Err(error::Unspecified); - } - - // NIST SP 800-56A Step 2: "Verify that xQ and yQ are integers in the - // interval [0, p-1] in the case that q is an odd prime p[.]" - let x = ops.elem_parse(input)?; - let y = ops.elem_parse(input)?; - Ok((x, y)) - })?; - - // NIST SP 800-56A Step 3: "If q is an odd prime p, verify that - // yQ**2 = xQ**3 + axQ + b in GF(p), where the arithmetic is performed - // modulo p." - verify_affine_point_is_on_the_curve(ops.common, (&x, &y))?; - - // NIST SP 800-56A Note: "Since its order is not verified, there is no - // check that the public key is in the correct EC subgroup." - // - // NSA Suite B Implementer's Guide Note: "ECC Full Public-Key Validation - // includes an additional check to ensure that the point has the correct - // order. This check is not necessary for curves having prime order (and - // cofactor h = 1), such as P-256 and P-384." - - Ok((x, y)) -} - -#[cfg(test)] -mod tests { - use super::{super::ops, *}; - use crate::test; - - #[test] - fn parse_uncompressed_point_test() { - test::run( - test_file!("suite_b_public_key_tests.txt"), - |section, test_case| { - assert_eq!(section, ""); - - let curve_name = test_case.consume_string("Curve"); - - let public_key = test_case.consume_bytes("Q"); - let public_key = untrusted::Input::from(&public_key); - let is_valid = test_case.consume_string("Result") == "P"; - - let curve_ops = public_key_ops_from_curve_name(&curve_name); - - let result = parse_uncompressed_point(curve_ops, public_key); - assert_eq!(is_valid, result.is_ok()); - - // TODO: Verify that we when we re-serialize the parsed (x, y), the - // output is equal to the input. - - Ok(()) - }, - ); - } - - fn public_key_ops_from_curve_name(curve_name: &str) -> &'static PublicKeyOps { - if curve_name == "P-256" { - &ops::p256::PUBLIC_KEY_OPS - } else if curve_name == "P-384" { - &ops::p384::PUBLIC_KEY_OPS - } else { - panic!("Unsupported curve: {}", curve_name); - } - } -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/suite_b_public_key_tests.txt temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/suite_b_public_key_tests.txt --- temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/suite_b_public_key_tests.txt 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b/suite_b_public_key_tests.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,233 +0,0 @@ -# Test vectors for public key validation. - -# Invalid Curve Attack from -# https://web-in-security.blogspot.ca/2015/09/practical-invalid-curve-attacks.html -# https://www.nds.rub.de/media/nds/veroeffentlichungen/2015/09/14/main-full.pdf -Curve = P-256 -Q = 04b70bf043c144935756f8f4578c369cf960ee510a5a0f90e93a373a21f0d1397f4a2e0ded57a5156bb82eb4314c37fd4155395a7e51988af289cce531b9c17192 -Result = F - - -# Test vectors for Public Key Point Validation. -# -# These test vectors were generated by applying the patch in -# util/generate-tests.patch to BoringSSL, and then running -# `bssl generate-tests ecc-public-key`. -# - -# X == 0, decompressed with y_bit == 0. This verifies that the -# implementation doesn't reject zero-valued field elements (they -# aren't scalars). -Curve = P-256 -Q = 04000000000000000000000000000000000000000000000000000000000000000066485c780e2f83d72433bd5d84a06bb6541c2af31dae871728bf856a174f93f4 -Result = P - -# X == q. This is invalid because q isn't a valid field element. Some -# broken implementations might accept this if they reduce X mod q -# since q mod q == 0 and the Y coordinate matches the one from the -# x == 0 test case above. -Curve = P-256 -Q = 04ffffffff00000001000000000000000000000000ffffffffffffffffffffffff66485c780e2f83d72433bd5d84a06bb6541c2af31dae871728bf856a174f93f4 -Result = F (X is out of range) - -# X == 0, decompressed with y_bit == 1. -Curve = P-256 -Q = 04000000000000000000000000000000000000000000000000000000000000000099b7a386f1d07c29dbcc42a27b5f9449abe3d50de25178e8d7407a95e8b06c0b -Result = P - -# X == q, decompressed with y_bit == 1. See the previous X == q test -# case. -Curve = P-256 -Q = 04ffffffff00000001000000000000000000000000ffffffffffffffffffffffff99b7a386f1d07c29dbcc42a27b5f9449abe3d50de25178e8d7407a95e8b06c0b -Result = F (X is out of range) - -# The largest valid X coordinate, decompressed with y_bit == 0. This -# helps ensure that the upper bound on coordinate values is not too -# low. -Curve = P-256 -Q = 04ffffffff00000001000000000000000000000000fffffffffffffffffffffffce68e641309515ec1da369202838e0adda2b37040614a5f5460c616e871aa3ede -Result = P - -# X == 0, decompressed with y_bit == 0. This verifies that the -# implementation doesn't reject zero-valued field elements (they -# aren't scalars). -Curve = P-384 -Q = 040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003cf99ef04f51a5ea630ba3f9f960dd593a14c9be39fd2bd215d3b4b08aaaf86bbf927f2c46e52ab06fb742b8850e521e -Result = P - -# X == q. This is invalid because q isn't a valid field element. Some -# broken implementations might accept this if they reduce X mod q -# since q mod q == 0 and the Y coordinate matches the one from the -# x == 0 test case above. -Curve = P-384 -Q = 04fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff3cf99ef04f51a5ea630ba3f9f960dd593a14c9be39fd2bd215d3b4b08aaaf86bbf927f2c46e52ab06fb742b8850e521e -Result = F (X is out of range) - -# X == 0, decompressed with y_bit == 1. -Curve = P-384 -Q = 04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c306610fb0ae5a159cf45c06069f22a6c5eb3641c602d42dea2c4b4f75550793406d80d2b91ad54f9048bd487af1ade1 -Result = P - -# X == q, decompressed with y_bit == 1. See the previous X == q test -# case. -Curve = P-384 -Q = 04fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffffc306610fb0ae5a159cf45c06069f22a6c5eb3641c602d42dea2c4b4f75550793406d80d2b91ad54f9048bd487af1ade1 -Result = F (X is out of range) - -# The largest valid X coordinate, decompressed with y_bit == 0. This -# helps ensure that the upper bound on coordinate values is not too -# low. -Curve = P-384 -Q = 04fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffe8cdeadbbd04911a3c1931e26df3fa6439dca9c7eb286fbd46fc319f0e2bb780232baf57825fc0c1912ada2fefe84024c -Result = P - - -# RFC 5903 (IKE and IKEv2 ECDH) Test Vectors -# Q is (grx, gry) in uncompressed encoding. - -Curve = P-256 -Q = 04D12DFB5289C8D4F81208B70270398C342296970A0BCCB74C736FC7554494BF6356FBF3CA366CC23E8157854C13C58D6AAC23F046ADA30F8353E74F33039872AB -Result = P - -Curve = P-384 -Q = 04E558DBEF53EECDE3D3FCCFC1AEA08A89A987475D12FD950D83CFA41732BC509D0D1AC43A0336DEF96FDA41D0774A3571DCFBEC7AACF3196472169E838430367F66EEBE3C6E70C416DD5F0C68759DD1FFF83FA40142209DFF5EAAD96DB9E6386C -Result = P - -# Tweaks of the RFC 5903 vectors for testing malformed (syntactically) public -# keys - -Curve = P-256 -Q = "" -Result = F (Peer public key is empty.) - -Curve = P-384 -Q = "" -Result = F (Peer public key is empty.) - -Curve = P-256 -Q = 00 -Result = F (Peer public key is the special encoding of the point at infinity.) - -Curve = P-384 -Q = 00 -Result = F (Peer public key is the special encoding of the point at infinity.) - -Curve = P-256 -Q = 01 -Result = F (Peer public key consists of (only) an invalid encoding indicator.) - -Curve = P-384 -Q = 01 -Result = F (Peer public key consists of (only) an invalid encoding indicator.) - -Curve = P-256 -Q = 02 -Result = F (Peer public key consists of (only) a compressed encoding indicator (0x02).) - -Curve = P-384 -Q = 02 -Result = F (Peer public key consists of (only) a compressed encoding indicator (0x02).) - -Curve = P-256 -Q = 03 -Result = F (Peer public key consists of (only) a compressed encoding indicator (0x03).) - -Curve = P-384 -Q = 03 -Result = F (Peer public key consists of (only) a compressed encoding indicator (0x03).) - -Curve = P-256 -Q = 04 -Result = F (Peer public key consists of (only) a uncompressed encoding indicator.) - -Curve = P-384 -Q = 04 -Result = F (Peer public key consists of (only) a compressed encoding indicator.) - -Curve = P-256 -Q = 04 -Result = F (Peer public key consists of (only) an invalid encoding indicator (0x05).) - -Curve = P-384 -Q = 04 -Result = F (Peer public key consists of (only) an invalid encoding indicator (0x05).) - -Curve = P-256 -Q = 01D12DFB5289C8D4F81208B70270398C342296970A0BCCB74C736FC7554494BF6356FBF3CA366CC23E8157854C13C58D6AAC23F046ADA30F8353E74F33039872AB -Result = F (Peer public key starts with a completely invalid encoding indicator byte (0x01).) - -Curve = P-384 -Q = 01E558DBEF53EECDE3D3FCCFC1AEA08A89A987475D12FD950D83CFA41732BC509D0D1AC43A0336DEF96FDA41D0774A3571DCFBEC7AACF3196472169E838430367F66EEBE3C6E70C416DD5F0C68759DD1FFF83FA40142209DFF5EAAD96DB9E6386C -Result = F (Peer public key starts with a completely invalid encoding indicator byte (0x01).) - -Curve = P-256 -Q = 02D12DFB5289C8D4F81208B70270398C342296970A0BCCB74C736FC7554494BF6356FBF3CA366CC23E8157854C13C58D6AAC23F046ADA30F8353E74F33039872AB -Result = F (Peer public key encoding's first byte is 0x02, should be 0x04.) - -Curve = P-384 -Q = 02E558DBEF53EECDE3D3FCCFC1AEA08A89A987475D12FD950D83CFA41732BC509D0D1AC43A0336DEF96FDA41D0774A3571DCFBEC7AACF3196472169E838430367F66EEBE3C6E70C416DD5F0C68759DD1FFF83FA40142209DFF5EAAD96DB9E6386C -Result = F (Peer public key encoding's first byte is 0x02, should be 0x04.) - -Curve = P-256 -Q = 03D12DFB5289C8D4F81208B70270398C342296970A0BCCB74C736FC7554494BF6356FBF3CA366CC23E8157854C13C58D6AAC23F046ADA30F8353E74F33039872AB -Result = F (Peer public key encoding's first byte is 0x03, should be 0x04.) - -Curve = P-384 -Q = 03E558DBEF53EECDE3D3FCCFC1AEA08A89A987475D12FD950D83CFA41732BC509D0D1AC43A0336DEF96FDA41D0774A3571DCFBEC7AACF3196472169E838430367F66EEBE3C6E70C416DD5F0C68759DD1FFF83FA40142209DFF5EAAD96DB9E6386C -Result = F (Peer public key encoding's first byte is 0x03, should be 0x04.) - -Curve = P-256 -Q = 05D12DFB5289C8D4F81208B70270398C342296970A0BCCB74C736FC7554494BF6356FBF3CA366CC23E8157854C13C58D6AAC23F046ADA30F8353E74F33039872AB -Result = F (Peer public key starts with a completely invalid encoding indicator byte (0x05).) - -Curve = P-384 -Q = 05E558DBEF53EECDE3D3FCCFC1AEA08A89A987475D12FD950D83CFA41732BC509D0D1AC43A0336DEF96FDA41D0774A3571DCFBEC7AACF3196472169E838430367F66EEBE3C6E70C416DD5F0C68759DD1FFF83FA40142209DFF5EAAD96DB9E6386C -Result = F (Peer public key starts with a completely invalid encoding indicator byte (0x05).) - -Curve = P-256 -Q = FFD12DFB5289C8D4F81208B70270398C342296970A0BCCB74C736FC7554494BF6356FBF3CA366CC23E8157854C13C58D6AAC23F046ADA30F8353E74F33039872AB -Result = F (Peer public key starts with a completely invalid encoding indicator byte (0xff).) - -Curve = P-384 -Q = FFE558DBEF53EECDE3D3FCCFC1AEA08A89A987475D12FD950D83CFA41732BC509D0D1AC43A0336DEF96FDA41D0774A3571DCFBEC7AACF3196472169E838430367F66EEBE3C6E70C416DD5F0C68759DD1FFF83FA40142209DFF5EAAD96DB9E6386C -Result = F (Peer public key starts with a completely invalid encoding indicator byte (0xff).) - -Curve = P-256 -Q = D12DFB5289C8D4F81208B70270398C342296970A0BCCB74C736FC7554494BF6356FBF3CA366CC23E8157854C13C58D6AAC23F046ADA30F8353E74F33039872AB -Result = F (Peer public key is missing the encoding indicator byte.) - -Curve = P-384 -Q = E558DBEF53EECDE3D3FCCFC1AEA08A89A987475D12FD950D83CFA41732BC509D0D1AC43A0336DEF96FDA41D0774A3571DCFBEC7AACF3196472169E838430367F66EEBE3C6E70C416DD5F0C68759DD1FFF83FA40142209DFF5EAAD96DB9E6386C -Result = F (Peer public key is missing the encoding indicator byte.) - -Curve = P-256 -Q = 04D12DFB5289C8D4F81208B70270398C342296970A0BCCB74C736FC7554494BF6356FBF3CA366CC23E8157854C13C58D6AAC23F046ADA30F8353E74F33039872 -Result = F (Peer public key has the last byte truncated.) - -Curve = P-384 -Q = 04E558DBEF53EECDE3D3FCCFC1AEA08A89A987475D12FD950D83CFA41732BC509D0D1AC43A0336DEF96FDA41D0774A3571DCFBEC7AACF3196472169E838430367F66EEBE3C6E70C416DD5F0C68759DD1FFF83FA40142209DFF5EAAD96DB9E638 -Result = F (Peer public key has the last byte truncated.) - -Curve = P-256 -Q = 04D12DFB5289C8D4F81208B70270398C342296970A0BCCB74C736FC7554494BF63 -Result = F (Peer public key is missing the Y coordinate completely.) - -Curve = P-384 -Q = 04E558DBEF53EECDE3D3FCCFC1AEA08A89A987475D12FD950D83CFA41732BC509D0D1AC43A0336DEF96FDA41D0774A3571 -Result = F (Peer public key is missing the Y coordinate completely.) - -Curve = P-256 -Q = 02D12DFB5289C8D4F81208B70270398C342296970A0BCCB74C736FC7554494BF63 -Result = F (Peer public key is in compressed form (0x02).) - -Curve = P-384 -Q = 02E558DBEF53EECDE3D3FCCFC1AEA08A89A987475D12FD950D83CFA41732BC509D0D1AC43A0336DEF96FDA41D0774A3571 -Result = F (Peer public key is in compressed form (0x02).) - -Curve = P-256 -Q = 03D12DFB5289C8D4F81208B70270398C342296970A0BCCB74C736FC7554494BF63 -Result = F (Peer public key is in compressed form (0x03).) - -Curve = P-384 -Q = 03E558DBEF53EECDE3D3FCCFC1AEA08A89A987475D12FD950D83CFA41732BC509D0D1AC43A0336DEF96FDA41D0774A3571 -Result = F (Peer public key is in compressed form (0x03).) diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b.rs temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/ec/suite_b.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,237 +0,0 @@ -// Copyright 2016 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -//! Elliptic curve operations on P-256 & P-384. - -use self::ops::*; -use crate::{arithmetic::montgomery::*, cpu, ec, error, io::der, limb::LimbMask, pkcs8}; - -// NIST SP 800-56A Step 3: "If q is an odd prime p, verify that -// yQ**2 = xQ**3 + axQ + b in GF(p), where the arithmetic is performed modulo -// p." -// -// That is, verify that (x, y) is on the curve, which is true iif: -// -// y**2 == x**3 + a*x + b (mod q) -// -// Or, equivalently, but more efficiently: -// -// y**2 == (x**2 + a)*x + b (mod q) -// -fn verify_affine_point_is_on_the_curve( - ops: &CommonOps, - (x, y): (&Elem, &Elem), -) -> Result<(), error::Unspecified> { - verify_affine_point_is_on_the_curve_scaled(ops, (x, y), &ops.a, &ops.b) -} - -// Use `verify_affine_point_is_on_the_curve` instead of this function whenever -// the affine coordinates are available or will become available. This function -// should only be used then the affine coordinates are never calculated. See -// the notes for `verify_affine_point_is_on_the_curve_scaled`. -// -// The value `z**2` is returned on success because it is useful for ECDSA -// verification. -// -// This function also verifies that the point is not at infinity. -fn verify_jacobian_point_is_on_the_curve( - ops: &CommonOps, - p: &Point, -) -> Result, error::Unspecified> { - let z = ops.point_z(p); - - // Verify that the point is not at infinity. - ops.elem_verify_is_not_zero(&z)?; - - let x = ops.point_x(p); - let y = ops.point_y(p); - - // We are given Jacobian coordinates (x, y, z). So, we have: - // - // (x/z**2, y/z**3) == (x', y'), - // - // where (x', y') are the affine coordinates. The curve equation is: - // - // y'**2 == x'**3 + a*x' + b == (x'**2 + a)*x' + b - // - // Substituting our Jacobian coordinates, we get: - // - // / y \**2 / / x \**2 \ / x \ - // | ---- | == | | ---- | + a | * | ---- | + b - // \ z**3 / \ \ z**2 / / \ z**2 / - // - // Simplify: - // - // y**2 / x**2 \ x - // ---- == | ---- + a | * ---- + b - // z**6 \ z**4 / z**2 - // - // Multiply both sides by z**6: - // - // z**6 / x**2 \ z**6 - // ---- * y**2 == | ---- + a | * ---- * x + (z**6) * b - // z**6 \ z**4 / z**2 - // - // Simplify: - // - // / x**2 \ - // y**2 == | ---- + a | * z**4 * x + (z**6) * b - // \ z**4 / - // - // Distribute z**4: - // - // / z**4 \ - // y**2 == | ---- * x**2 + z**4 * a | * x + (z**6) * b - // \ z**4 / - // - // Simplify: - // - // y**2 == (x**2 + z**4 * a) * x + (z**6) * b - // - let z2 = ops.elem_squared(&z); - let z4 = ops.elem_squared(&z2); - let z4_a = ops.elem_product(&z4, &ops.a); - let z6 = ops.elem_product(&z4, &z2); - let z6_b = ops.elem_product(&z6, &ops.b); - verify_affine_point_is_on_the_curve_scaled(ops, (&x, &y), &z4_a, &z6_b)?; - Ok(z2) -} - -// Handles the common logic of point-is-on-the-curve checks for both affine and -// Jacobian cases. -// -// When doing the check that the point is on the curve after a computation, -// to avoid fault attacks or mitigate potential bugs, it is better for security -// to use `verify_affine_point_is_on_the_curve` on the affine coordinates, -// because it provides some protection against faults that occur in the -// computation of the inverse of `z`. See the paper and presentation "Fault -// Attacks on Projective-to-Affine Coordinates Conversion" by Diana Maimuţ, -// Cédric Murdica, David Naccache, Mehdi Tibouchi. That presentation concluded -// simply "Check the validity of the result after conversion to affine -// coordinates." (It seems like a good idea to verify that -// z_inv * z == 1 mod q too). -// -// In the case of affine coordinates (x, y), `a_scaled` and `b_scaled` are -// `a` and `b`, respectively. In the case of Jacobian coordinates (x, y, z), -// the computation and comparison is the same, except `a_scaled` and `b_scaled` -// are (z**4 * a) and (z**6 * b), respectively. Thus, performance is another -// reason to prefer doing the check on the affine coordinates, as Jacobian -// computation requires 3 extra multiplications and 2 extra squarings. -// -// An example of a fault attack that isn't mitigated by a point-on-the-curve -// check after multiplication is given in "Sign Change Fault Attacks On -// Elliptic Curve Cryptosystems" by Johannes Blömer, Martin Otto, and -// Jean-Pierre Seifert. -fn verify_affine_point_is_on_the_curve_scaled( - ops: &CommonOps, - (x, y): (&Elem, &Elem), - a_scaled: &Elem, - b_scaled: &Elem, -) -> Result<(), error::Unspecified> { - let lhs = ops.elem_squared(y); - - let mut rhs = ops.elem_squared(x); - ops.elem_add(&mut rhs, a_scaled); - ops.elem_mul(&mut rhs, x); - ops.elem_add(&mut rhs, b_scaled); - - if ops.elems_are_equal(&lhs, &rhs) != LimbMask::True { - return Err(error::Unspecified); - } - - Ok(()) -} - -pub(crate) fn key_pair_from_pkcs8( - curve: &'static ec::Curve, - template: &pkcs8::Template, - input: untrusted::Input, - cpu_features: cpu::Features, -) -> Result { - let (ec_private_key, _) = pkcs8::unwrap_key(template, pkcs8::Version::V1Only, input)?; - let (private_key, public_key) = - ec_private_key.read_all(error::KeyRejected::invalid_encoding(), |input| { - // https://tools.ietf.org/html/rfc5915#section-3 - der::nested( - input, - der::Tag::Sequence, - error::KeyRejected::invalid_encoding(), - |input| key_pair_from_pkcs8_(template, input), - ) - })?; - key_pair_from_bytes(curve, private_key, public_key, cpu_features) -} - -fn key_pair_from_pkcs8_<'a>( - template: &pkcs8::Template, - input: &mut untrusted::Reader<'a>, -) -> Result<(untrusted::Input<'a>, untrusted::Input<'a>), error::KeyRejected> { - let version = der::small_nonnegative_integer(input) - .map_err(|error::Unspecified| error::KeyRejected::invalid_encoding())?; - if version != 1 { - return Err(error::KeyRejected::version_not_supported()); - } - - let private_key = der::expect_tag_and_get_value(input, der::Tag::OctetString) - .map_err(|error::Unspecified| error::KeyRejected::invalid_encoding())?; - - // [0] parameters (optional). - if input.peek(u8::from(der::Tag::ContextSpecificConstructed0)) { - let actual_alg_id = - der::expect_tag_and_get_value(input, der::Tag::ContextSpecificConstructed0) - .map_err(|error::Unspecified| error::KeyRejected::invalid_encoding())?; - if actual_alg_id != template.curve_oid() { - return Err(error::KeyRejected::wrong_algorithm()); - } - } - - // [1] publicKey. The RFC says it is optional, but we require it - // to be present. - let public_key = der::nested( - input, - der::Tag::ContextSpecificConstructed1, - error::Unspecified, - der::bit_string_with_no_unused_bits, - ) - .map_err(|error::Unspecified| error::KeyRejected::invalid_encoding())?; - - Ok((private_key, public_key)) -} - -pub(crate) fn key_pair_from_bytes( - curve: &'static ec::Curve, - private_key_bytes: untrusted::Input, - public_key_bytes: untrusted::Input, - cpu_features: cpu::Features, -) -> Result { - let seed = ec::Seed::from_bytes(curve, private_key_bytes, cpu_features) - .map_err(|error::Unspecified| error::KeyRejected::invalid_component())?; - - let r = ec::KeyPair::derive(seed) - .map_err(|error::Unspecified| error::KeyRejected::unexpected_error())?; - if public_key_bytes != *r.public_key().as_ref() { - return Err(error::KeyRejected::inconsistent_components()); - } - - Ok(r) -} - -pub mod curve; -pub mod ecdh; -pub mod ecdsa; - -mod ops; - -mod private_key; -mod public_key; diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/ec.rs temporalio-1.3.0/vendor/ring-0.16.20/src/ec.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/ec.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/ec.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,62 +0,0 @@ -// Copyright 2015-2017 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -use crate::{error, rand}; - -pub use self::keys::{KeyPair, PublicKey, Seed}; - -pub struct Curve { - pub public_key_len: usize, - pub elem_scalar_seed_len: usize, - - pub id: CurveID, - - // Precondition: `bytes` is the correct length. - check_private_key_bytes: fn(bytes: &[u8]) -> Result<(), error::Unspecified>, - - generate_private_key: - fn(rng: &dyn rand::SecureRandom, &mut [u8]) -> Result<(), error::Unspecified>, - - public_from_private: - fn(public_out: &mut [u8], private_key: &Seed) -> Result<(), error::Unspecified>, -} - -derive_debug_via_id!(Curve); - -#[derive(Clone, Copy, Debug, PartialEq)] -pub enum CurveID { - Curve25519, - P256, - P384, -} - -const ELEM_MAX_BITS: usize = 384; -pub const ELEM_MAX_BYTES: usize = (ELEM_MAX_BITS + 7) / 8; - -pub const SCALAR_MAX_BYTES: usize = ELEM_MAX_BYTES; -const SEED_MAX_BYTES: usize = ELEM_MAX_BYTES; - -/// The maximum length of a PKCS#8 documents generated by *ring* for ECC keys. -/// -/// This is NOT the maximum length of a PKCS#8 document that can be consumed by -/// `pkcs8::unwrap_key()`. -/// -/// `40` is the length of the P-384 template. It is actually one byte shorter -/// than the P-256 template, but the private key and the public key are much -/// longer. -pub const PKCS8_DOCUMENT_MAX_LEN: usize = 40 + SCALAR_MAX_BYTES + keys::PUBLIC_KEY_MAX_LEN; - -pub mod curve25519; -mod keys; -pub mod suite_b; diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/endian.rs temporalio-1.3.0/vendor/ring-0.16.20/src/endian.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/endian.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/endian.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,154 +0,0 @@ -use core::num::Wrapping; - -/// An `Encoding` of a type `T` can be converted to/from its byte -/// representation without any byte swapping or other computation. -/// -/// The `Self: Copy` constraint addresses `clippy::declare_interior_mutable_const`. -pub trait Encoding: From + Into -where - Self: Copy, -{ - const ZERO: Self; -} - -/// Allow access to a slice of of `Encoding` as a slice of bytes. -pub fn as_byte_slice, T>(x: &[E]) -> &[u8] { - unsafe { - core::slice::from_raw_parts(x.as_ptr() as *const u8, x.len() * core::mem::size_of::()) - } -} - -/// Work around the inability to implement `AsRef` for arrays of `Encoding`s -/// due to the coherence rules. -pub trait ArrayEncoding { - fn as_byte_array(&self) -> &T; -} - -/// Work around the inability to implement `from` for arrays of `Encoding`s -/// due to the coherence rules. -pub trait FromByteArray { - fn from_byte_array(a: &T) -> Self; -} - -macro_rules! define_endian { - ($endian:ident) => { - #[repr(transparent)] - pub struct $endian(T); - - impl $endian { - #[deprecated] - pub fn into_raw_value(self) -> T { - self.0 - } - } - - impl Copy for $endian where T: Copy {} - - impl Clone for $endian - where - T: Clone, - { - fn clone(&self) -> Self { - Self(self.0.clone()) - } - } - }; -} - -macro_rules! impl_from_byte_array { - ($endian:ident, $base:ident, $elems:expr) => { - impl FromByteArray<[u8; $elems * core::mem::size_of::<$base>()]> - for [$endian<$base>; $elems] - { - fn from_byte_array(a: &[u8; $elems * core::mem::size_of::<$base>()]) -> Self { - unsafe { core::mem::transmute_copy(a) } - } - } - }; -} - -macro_rules! impl_array_encoding { - ($endian:ident, $base:ident, $elems:expr) => { - impl ArrayEncoding<[u8; $elems * core::mem::size_of::<$base>()]> - for [$endian<$base>; $elems] - { - fn as_byte_array(&self) -> &[u8; $elems * core::mem::size_of::<$base>()] { - // TODO: When we can require Rust 1.47.0 or later we could avoid - // `as` and `unsafe` here using - // `as_byte_slice(self).try_into().unwrap()`. - let as_bytes_ptr = - self.as_ptr() as *const [u8; $elems * core::mem::size_of::<$base>()]; - unsafe { &*as_bytes_ptr } - } - } - - impl_from_byte_array!($endian, $base, $elems); - }; -} - -macro_rules! impl_endian { - ($endian:ident, $base:ident, $to_endian:ident, $from_endian:ident, $size:expr) => { - impl Encoding<$base> for $endian<$base> { - const ZERO: Self = Self(0); - } - - impl From<[u8; $size]> for $endian<$base> { - #[inline] - fn from(bytes: [u8; $size]) -> Self { - Self($base::from_ne_bytes(bytes)) - } - } - - impl From<$endian<$base>> for [u8; $size] { - #[inline] - fn from(encoded: $endian<$base>) -> Self { - $base::to_ne_bytes(encoded.0) - } - } - - impl From<$base> for $endian<$base> { - #[inline] - fn from(value: $base) -> Self { - Self($base::$to_endian(value)) - } - } - - impl From> for $endian<$base> { - #[inline] - fn from(Wrapping(value): Wrapping<$base>) -> Self { - Self($base::$to_endian(value)) - } - } - - impl From<$endian<$base>> for $base { - #[inline] - fn from($endian(value): $endian<$base>) -> Self { - $base::$from_endian(value) - } - } - - impl_array_encoding!($endian, $base, 1); - impl_array_encoding!($endian, $base, 2); - impl_array_encoding!($endian, $base, 3); - impl_array_encoding!($endian, $base, 4); - impl_array_encoding!($endian, $base, 8); - }; -} - -define_endian!(BigEndian); -define_endian!(LittleEndian); -impl_endian!(BigEndian, u32, to_be, from_be, 4); -impl_endian!(BigEndian, u64, to_be, from_be, 8); -impl_endian!(LittleEndian, u32, to_le, from_le, 4); -impl_endian!(LittleEndian, u64, to_le, from_le, 8); - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn test_big_endian() { - let x = BigEndian::from(1u32); - assert_eq!(u32::from(x), 1); - } -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/error.rs temporalio-1.3.0/vendor/ring-0.16.20/src/error.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/error.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/error.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,226 +0,0 @@ -// Copyright 2016 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -//! Error reporting. - -#[cfg(feature = "std")] -extern crate std; - -/// An error with absolutely no details. -/// -/// *ring* uses this unit type as the error type in most of its results -/// because (a) usually the specific reasons for a failure are obvious or are -/// not useful to know, and/or (b) providing more details about a failure might -/// provide a dangerous side channel, and/or (c) it greatly simplifies the -/// error handling logic. -/// -/// `Result` is mostly equivalent to -/// `Result`. However, `ring::error::Unspecified` implements -/// [`std::error::Error`] and users of *ring* can implement -/// `From` to map this to their own error types, as -/// described in [“Error Handling†in the Rust Book]: -/// -/// ``` -/// use ring::rand::{self, SecureRandom}; -/// -/// enum Error { -/// CryptoError, -/// -/// # #[cfg(feature = "alloc")] -/// IOError(std::io::Error), -/// // [...] -/// } -/// -/// impl From for Error { -/// fn from(_: ring::error::Unspecified) -> Self { Error::CryptoError } -/// } -/// -/// fn eight_random_bytes() -> Result<[u8; 8], Error> { -/// let rng = rand::SystemRandom::new(); -/// let mut bytes = [0; 8]; -/// -/// // The `From` implementation above makes this -/// // equivalent to -/// // `rng.fill(&mut bytes).map_err(|_| Error::CryptoError)?`. -/// rng.fill(&mut bytes)?; -/// -/// Ok(bytes) -/// } -/// -/// assert!(eight_random_bytes().is_ok()); -/// ``` -/// -/// Experience with using and implementing other crypto libraries like has -/// shown that sophisticated error reporting facilities often cause significant -/// bugs themselves, both within the crypto library and within users of the -/// crypto library. This approach attempts to minimize complexity in the hopes -/// of avoiding such problems. In some cases, this approach may be too extreme, -/// and it may be important for an operation to provide some details about the -/// cause of a failure. Users of *ring* are encouraged to report such cases so -/// that they can be addressed individually. -/// -/// [`std::error::Error`]: https://doc.rust-lang.org/std/error/trait.Error.html -/// [“Error Handling†in the Rust Book]: -/// https://doc.rust-lang.org/book/first-edition/error-handling.html#the-from-trait -#[derive(Clone, Copy, Debug, PartialEq)] -pub struct Unspecified; - -impl Unspecified { - fn description_() -> &'static str { - "ring::error::Unspecified" - } -} - -// This is required for the implementation of `std::error::Error`. -impl core::fmt::Display for Unspecified { - fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result { - f.write_str(Self::description_()) - } -} - -#[cfg(feature = "std")] -impl std::error::Error for Unspecified { - #[inline] - fn cause(&self) -> Option<&dyn std::error::Error> { - None - } - - fn description(&self) -> &str { - Self::description_() - } -} - -impl From for Unspecified { - fn from(_: untrusted::EndOfInput) -> Self { - Unspecified - } -} - -impl From for Unspecified { - fn from(_: core::array::TryFromSliceError) -> Self { - Unspecified - } -} - -/// An error parsing or validating a key. -/// -/// The `Display` implementation and `::description()` -/// will return a string that will help you better understand why a key was -/// rejected change which errors are reported in which situations while -/// minimizing the likelihood that any applications will be broken. -/// -/// Here is an incomplete list of reasons a key may be unsupported: -/// -/// * Invalid or Inconsistent Components: A component of the key has an invalid -/// value, or the mathematical relationship between two (or more) components -/// required for a valid key does not hold. -/// -/// * The encoding of the key is invalid. Perhaps the key isn't in the correct -/// format; e.g. it may be Base64 ("PEM") encoded, in which case the Base64 -/// encoding needs to be undone first. -/// -/// * The encoding includes a versioning mechanism and that mechanism indicates -/// that the key is encoded in a version of the encoding that isn't supported. -/// This might happen for multi-prime RSA keys (keys with more than two -/// private prime factors), which aren't supported, for example. -/// -/// * Too small or too Large: One of the primary components of the key is too -/// small or two large. Too-small keys are rejected for security reasons. Some -/// unnecessarily large keys are rejected for performance reasons. -/// -/// * Wrong algorithm: The key is not valid for the algorithm in which it was -/// being used. -/// -/// * Unexpected errors: Report this as a bug. -#[derive(Copy, Clone, Debug)] -pub struct KeyRejected(&'static str); - -impl KeyRejected { - /// The value returned from ::description() - pub fn description_(&self) -> &'static str { - self.0 - } - - pub(crate) fn inconsistent_components() -> Self { - KeyRejected("InconsistentComponents") - } - - pub(crate) fn invalid_component() -> Self { - KeyRejected("InvalidComponent") - } - - #[inline] - pub(crate) fn invalid_encoding() -> Self { - KeyRejected("InvalidEncoding") - } - - // XXX: See the comment at the call site. - pub(crate) fn rng_failed() -> Self { - KeyRejected("RNG failed") - } - - pub(crate) fn public_key_is_missing() -> Self { - KeyRejected("PublicKeyIsMissing") - } - - #[cfg(feature = "alloc")] - pub(crate) fn too_small() -> Self { - KeyRejected("TooSmall") - } - - #[cfg(feature = "alloc")] - pub(crate) fn too_large() -> Self { - KeyRejected("TooLarge") - } - - pub(crate) fn version_not_supported() -> Self { - KeyRejected("VersionNotSupported") - } - - pub(crate) fn wrong_algorithm() -> Self { - KeyRejected("WrongAlgorithm") - } - - #[cfg(feature = "alloc")] - pub(crate) fn private_modulus_len_not_multiple_of_512_bits() -> Self { - KeyRejected("PrivateModulusLenNotMultipleOf512Bits") - } - - pub(crate) fn unexpected_error() -> Self { - KeyRejected("UnexpectedError") - } -} - -#[cfg(feature = "std")] -impl std::error::Error for KeyRejected { - fn cause(&self) -> Option<&dyn std::error::Error> { - None - } - - fn description(&self) -> &str { - self.description_() - } -} - -impl core::fmt::Display for KeyRejected { - fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result { - f.write_str(self.description_()) - } -} - -impl From for Unspecified { - fn from(_: KeyRejected) -> Self { - Unspecified - } -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/hkdf.rs temporalio-1.3.0/vendor/ring-0.16.20/src/hkdf.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/hkdf.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/hkdf.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,233 +0,0 @@ -// Copyright 2015 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -//! HMAC-based Extract-and-Expand Key Derivation Function. -//! -//! HKDF is specified in [RFC 5869]. -//! -//! [RFC 5869]: https://tools.ietf.org/html/rfc5869 - -use crate::{error, hmac}; - -/// An HKDF algorithm. -#[derive(Clone, Copy, Debug, Eq, PartialEq)] -pub struct Algorithm(hmac::Algorithm); - -impl Algorithm { - /// The underlying HMAC algorithm. - #[inline] - pub fn hmac_algorithm(&self) -> hmac::Algorithm { - self.0 - } -} - -/// HKDF using HMAC-SHA-1. Obsolete. -pub static HKDF_SHA1_FOR_LEGACY_USE_ONLY: Algorithm = - Algorithm(hmac::HMAC_SHA1_FOR_LEGACY_USE_ONLY); - -/// HKDF using HMAC-SHA-256. -pub static HKDF_SHA256: Algorithm = Algorithm(hmac::HMAC_SHA256); - -/// HKDF using HMAC-SHA-384. -pub static HKDF_SHA384: Algorithm = Algorithm(hmac::HMAC_SHA384); - -/// HKDF using HMAC-SHA-512. -pub static HKDF_SHA512: Algorithm = Algorithm(hmac::HMAC_SHA512); - -impl KeyType for Algorithm { - fn len(&self) -> usize { - self.0.digest_algorithm().output_len - } -} - -/// A salt for HKDF operations. -#[derive(Debug)] -pub struct Salt(hmac::Key); - -impl Salt { - /// Constructs a new `Salt` with the given value based on the given digest - /// algorithm. - /// - /// Constructing a `Salt` is relatively expensive so it is good to reuse a - /// `Salt` object instead of re-constructing `Salt`s with the same value. - pub fn new(algorithm: Algorithm, value: &[u8]) -> Self { - Salt(hmac::Key::new(algorithm.0, value)) - } - - /// The [HKDF-Extract] operation. - /// - /// [HKDF-Extract]: https://tools.ietf.org/html/rfc5869#section-2.2 - pub fn extract(&self, secret: &[u8]) -> Prk { - // The spec says that if no salt is provided then a key of - // `digest_alg.output_len` bytes of zeros is used. But, HMAC keys are - // already zero-padded to the block length, which is larger than the output - // length of the extract step (the length of the digest). Consequently the - // `Key` constructor will automatically do the right thing for a - // zero-length string. - let salt = &self.0; - let prk = hmac::sign(salt, secret); - Prk(hmac::Key::new(salt.algorithm(), prk.as_ref())) - } - - /// The algorithm used to derive this salt. - #[inline] - pub fn algorithm(&self) -> Algorithm { - Algorithm(self.0.algorithm()) - } -} - -impl From> for Salt { - fn from(okm: Okm<'_, Algorithm>) -> Self { - Self(hmac::Key::from(Okm { - prk: okm.prk, - info: okm.info, - len: okm.len().0, - len_cached: okm.len_cached, - })) - } -} - -/// The length of the OKM (Output Keying Material) for a `Prk::expand()` call. -pub trait KeyType { - /// The length that `Prk::expand()` should expand its input to. - fn len(&self) -> usize; -} - -/// A HKDF PRK (pseudorandom key). -#[derive(Clone, Debug)] -pub struct Prk(hmac::Key); - -impl Prk { - /// Construct a new `Prk` directly with the given value. - /// - /// Usually one can avoid using this. It is useful when the application - /// intentionally wants to leak the PRK secret, e.g. to implement - /// `SSLKEYLOGFILE` functionality. - pub fn new_less_safe(algorithm: Algorithm, value: &[u8]) -> Self { - Self(hmac::Key::new(algorithm.hmac_algorithm(), value)) - } - - /// The [HKDF-Expand] operation. - /// - /// [HKDF-Expand]: https://tools.ietf.org/html/rfc5869#section-2.3 - /// - /// Fails if (and only if) `len` is too large. - #[inline] - pub fn expand<'a, L: KeyType>( - &'a self, - info: &'a [&'a [u8]], - len: L, - ) -> Result, error::Unspecified> { - let len_cached = len.len(); - if len_cached > 255 * self.0.algorithm().digest_algorithm().output_len { - return Err(error::Unspecified); - } - Ok(Okm { - prk: self, - info, - len, - len_cached, - }) - } -} - -impl From> for Prk { - fn from(okm: Okm) -> Self { - Self(hmac::Key::from(Okm { - prk: okm.prk, - info: okm.info, - len: okm.len().0, - len_cached: okm.len_cached, - })) - } -} - -/// An HKDF OKM (Output Keying Material) -/// -/// Intentionally not `Clone` or `Copy` as an OKM is generally only safe to -/// use once. -#[derive(Debug)] -pub struct Okm<'a, L: KeyType> { - prk: &'a Prk, - info: &'a [&'a [u8]], - len: L, - len_cached: usize, -} - -impl Okm<'_, L> { - /// The `OkmLength` given to `Prk::expand()`. - #[inline] - pub fn len(&self) -> &L { - &self.len - } - - /// Fills `out` with the output of the HKDF-Expand operation for the given - /// inputs. - /// - /// Fails if (and only if) the requested output length is larger than 255 - /// times the size of the digest algorithm's output. (This is the limit - /// imposed by the HKDF specification due to the way HKDF's counter is - /// constructed.) - #[inline] - pub fn fill(self, out: &mut [u8]) -> Result<(), error::Unspecified> { - fill_okm(self.prk, self.info, out, self.len_cached) - } -} - -fn fill_okm( - prk: &Prk, - info: &[&[u8]], - out: &mut [u8], - len: usize, -) -> Result<(), error::Unspecified> { - if out.len() != len { - return Err(error::Unspecified); - } - - let digest_alg = prk.0.algorithm().digest_algorithm(); - assert!(digest_alg.block_len >= digest_alg.output_len); - - let mut ctx = hmac::Context::with_key(&prk.0); - - let mut n = 1u8; - let mut out = out; - loop { - for info in info { - ctx.update(info); - } - ctx.update(&[n]); - - let t = ctx.sign(); - let t = t.as_ref(); - - // Append `t` to the output. - out = if out.len() < digest_alg.output_len { - let len = out.len(); - out.copy_from_slice(&t[..len]); - &mut [] - } else { - let (this_chunk, rest) = out.split_at_mut(digest_alg.output_len); - this_chunk.copy_from_slice(t); - rest - }; - - if out.is_empty() { - return Ok(()); - } - - ctx = hmac::Context::with_key(&prk.0); - ctx.update(t); - n = n.checked_add(1).unwrap(); - } -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/hmac_generate_serializable_tests.txt temporalio-1.3.0/vendor/ring-0.16.20/src/hmac_generate_serializable_tests.txt --- temporalio-1.3.0/vendor/ring-0.16.20/src/hmac_generate_serializable_tests.txt 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/hmac_generate_serializable_tests.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,11 +0,0 @@ -HMAC = SHA1 -Key = 000102030405060708090a0b0c0d0e0f10111213 - -HMAC = SHA256 -Key = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f - -HMAC = SHA384 -Key = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f - -HMAC = SHA512 -Key = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/hmac.rs temporalio-1.3.0/vendor/ring-0.16.20/src/hmac.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/hmac.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/hmac.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,385 +0,0 @@ -// Copyright 2015-2016 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -//! HMAC is specified in [RFC 2104]. -//! -//! After a `Key` is constructed, it can be used for multiple signing or -//! verification operations. Separating the construction of the key from the -//! rest of the HMAC operation allows the per-key precomputation to be done -//! only once, instead of it being done in every HMAC operation. -//! -//! Frequently all the data to be signed in a message is available in a single -//! contiguous piece. In that case, the module-level `sign` function can be -//! used. Otherwise, if the input is in multiple parts, `Context` should be -//! used. -//! -//! # Examples: -//! -//! ## Signing a value and verifying it wasn't tampered with -//! -//! ``` -//! use ring::{hmac, rand}; -//! -//! let rng = rand::SystemRandom::new(); -//! let key = hmac::Key::generate(hmac::HMAC_SHA256, &rng)?; -//! -//! let msg = "hello, world"; -//! -//! let tag = hmac::sign(&key, msg.as_bytes()); -//! -//! // [We give access to the message to an untrusted party, and they give it -//! // back to us. We need to verify they didn't tamper with it.] -//! -//! hmac::verify(&key, msg.as_bytes(), tag.as_ref())?; -//! -//! # Ok::<(), ring::error::Unspecified>(()) -//! ``` -//! -//! ## Using the one-shot API: -//! -//! ``` -//! use ring::{digest, hmac, rand}; -//! use ring::rand::SecureRandom; -//! -//! let msg = "hello, world"; -//! -//! // The sender generates a secure key value and signs the message with it. -//! // Note that in a real protocol, a key agreement protocol would be used to -//! // derive `key_value`. -//! let rng = rand::SystemRandom::new(); -//! let key_value: [u8; digest::SHA256_OUTPUT_LEN] = rand::generate(&rng)?.expose(); -//! -//! let s_key = hmac::Key::new(hmac::HMAC_SHA256, key_value.as_ref()); -//! let tag = hmac::sign(&s_key, msg.as_bytes()); -//! -//! // The receiver (somehow!) knows the key value, and uses it to verify the -//! // integrity of the message. -//! let v_key = hmac::Key::new(hmac::HMAC_SHA256, key_value.as_ref()); -//! hmac::verify(&v_key, msg.as_bytes(), tag.as_ref())?; -//! -//! # Ok::<(), ring::error::Unspecified>(()) -//! ``` -//! -//! ## Using the multi-part API: -//! ``` -//! use ring::{digest, hmac, rand}; -//! use ring::rand::SecureRandom; -//! -//! let parts = ["hello", ", ", "world"]; -//! -//! // The sender generates a secure key value and signs the message with it. -//! // Note that in a real protocol, a key agreement protocol would be used to -//! // derive `key_value`. -//! let rng = rand::SystemRandom::new(); -//! let mut key_value: [u8; digest::SHA384_OUTPUT_LEN] = rand::generate(&rng)?.expose(); -//! -//! let s_key = hmac::Key::new(hmac::HMAC_SHA384, key_value.as_ref()); -//! let mut s_ctx = hmac::Context::with_key(&s_key); -//! for part in &parts { -//! s_ctx.update(part.as_bytes()); -//! } -//! let tag = s_ctx.sign(); -//! -//! // The receiver (somehow!) knows the key value, and uses it to verify the -//! // integrity of the message. -//! let v_key = hmac::Key::new(hmac::HMAC_SHA384, key_value.as_ref()); -//! let mut msg = Vec::::new(); -//! for part in &parts { -//! msg.extend(part.as_bytes()); -//! } -//! hmac::verify(&v_key, &msg.as_ref(), tag.as_ref())?; -//! -//! # Ok::<(), ring::error::Unspecified>(()) -//! ``` -//! -//! [RFC 2104]: https://tools.ietf.org/html/rfc2104 -//! [code for `ring::pbkdf2`]: -//! https://github.com/briansmith/ring/blob/main/src/pbkdf2.rs -//! [code for `ring::hkdf`]: -//! https://github.com/briansmith/ring/blob/main/src/hkdf.rs - -use crate::{constant_time, digest, error, hkdf, rand}; - -/// An HMAC algorithm. -#[derive(Clone, Copy, Debug, PartialEq, Eq)] -pub struct Algorithm(&'static digest::Algorithm); - -impl Algorithm { - /// The digest algorithm this HMAC algorithm is based on. - #[inline] - pub fn digest_algorithm(&self) -> &'static digest::Algorithm { - self.0 - } -} - -/// HMAC using SHA-1. Obsolete. -pub static HMAC_SHA1_FOR_LEGACY_USE_ONLY: Algorithm = Algorithm(&digest::SHA1_FOR_LEGACY_USE_ONLY); - -/// HMAC using SHA-256. -pub static HMAC_SHA256: Algorithm = Algorithm(&digest::SHA256); - -/// HMAC using SHA-384. -pub static HMAC_SHA384: Algorithm = Algorithm(&digest::SHA384); - -/// HMAC using SHA-512. -pub static HMAC_SHA512: Algorithm = Algorithm(&digest::SHA512); - -/// A deprecated alias for `Tag`. -#[deprecated(note = "`Signature` was renamed to `Tag`. This alias will be removed soon.")] -pub type Signature = Tag; - -/// An HMAC tag. -/// -/// For a given tag `t`, use `t.as_ref()` to get the tag value as a byte slice. -#[derive(Clone, Copy, Debug)] -pub struct Tag(digest::Digest); - -impl AsRef<[u8]> for Tag { - #[inline] - fn as_ref(&self) -> &[u8] { - self.0.as_ref() - } -} - -/// A key to use for HMAC signing. -#[derive(Clone)] -pub struct Key { - inner: digest::BlockContext, - outer: digest::BlockContext, -} - -/// `hmac::SigningKey` was renamed to `hmac::Key`. -#[deprecated(note = "Renamed to `hmac::Key`.")] -pub type SigningKey = Key; - -/// `hmac::VerificationKey` was merged into `hmac::Key`. -#[deprecated( - note = "The distinction between verification & signing keys was removed. Use `hmac::Key`." -)] -pub type VerificationKey = Key; - -impl core::fmt::Debug for Key { - fn fmt(&self, f: &mut core::fmt::Formatter) -> Result<(), core::fmt::Error> { - f.debug_struct("Key") - .field("algorithm", self.algorithm().digest_algorithm()) - .finish() - } -} - -impl Key { - /// Generate an HMAC signing key using the given digest algorithm with a - /// random value generated from `rng`. - /// - /// The key will be `digest_alg.output_len` bytes long, based on the - /// recommendation in [RFC 2104 Section 3]. - /// - /// [RFC 2104 Section 3]: https://tools.ietf.org/html/rfc2104#section-3 - pub fn generate( - algorithm: Algorithm, - rng: &dyn rand::SecureRandom, - ) -> Result { - Self::construct(algorithm, |buf| rng.fill(buf)) - } - - fn construct(algorithm: Algorithm, fill: F) -> Result - where - F: FnOnce(&mut [u8]) -> Result<(), error::Unspecified>, - { - let mut key_bytes = [0; digest::MAX_OUTPUT_LEN]; - let key_bytes = &mut key_bytes[..algorithm.0.output_len]; - fill(key_bytes)?; - Ok(Self::new(algorithm, key_bytes)) - } - - /// Construct an HMAC signing key using the given digest algorithm and key - /// value. - /// - /// `key_value` should be a value generated using a secure random number - /// generator (e.g. the `key_value` output by - /// `SealingKey::generate_serializable()`) or derived from a random key by - /// a key derivation function (e.g. `ring::hkdf`). In particular, - /// `key_value` shouldn't be a password. - /// - /// As specified in RFC 2104, if `key_value` is shorter than the digest - /// algorithm's block length (as returned by `digest::Algorithm::block_len`, - /// not the digest length returned by `digest::Algorithm::output_len`) then - /// it will be padded with zeros. Similarly, if it is longer than the block - /// length then it will be compressed using the digest algorithm. - /// - /// You should not use keys larger than the `digest_alg.block_len` because - /// the truncation described above reduces their strength to only - /// `digest_alg.output_len * 8` bits. Support for such keys is likely to be - /// removed in a future version of *ring*. - pub fn new(algorithm: Algorithm, key_value: &[u8]) -> Self { - let digest_alg = algorithm.0; - let mut key = Self { - inner: digest::BlockContext::new(digest_alg), - outer: digest::BlockContext::new(digest_alg), - }; - - let key_hash; - let key_value = if key_value.len() <= digest_alg.block_len { - key_value - } else { - key_hash = digest::digest(digest_alg, key_value); - key_hash.as_ref() - }; - - const IPAD: u8 = 0x36; - - let mut padded_key = [IPAD; digest::MAX_BLOCK_LEN]; - let padded_key = &mut padded_key[..digest_alg.block_len]; - - // If the key is shorter than one block then we're supposed to act like - // it is padded with zero bytes up to the block length. `x ^ 0 == x` so - // we can just leave the trailing bytes of `padded_key` untouched. - for (padded_key, key_value) in padded_key.iter_mut().zip(key_value.iter()) { - *padded_key ^= *key_value; - } - key.inner.update(&padded_key); - - const OPAD: u8 = 0x5C; - - // Remove the `IPAD` masking, leaving the unmasked padded key, then - // mask with `OPAD`, all in one step. - for b in padded_key.iter_mut() { - *b ^= IPAD ^ OPAD; - } - key.outer.update(&padded_key); - - key - } - - /// The digest algorithm for the key. - #[inline] - pub fn algorithm(&self) -> Algorithm { - Algorithm(self.inner.algorithm) - } -} - -impl hkdf::KeyType for Algorithm { - fn len(&self) -> usize { - self.digest_algorithm().output_len - } -} - -impl From> for Key { - fn from(okm: hkdf::Okm) -> Self { - Key::construct(*okm.len(), |buf| okm.fill(buf)).unwrap() - } -} - -/// A context for multi-step (Init-Update-Finish) HMAC signing. -/// -/// Use `sign` for single-step HMAC signing. -#[derive(Clone)] -pub struct Context { - inner: digest::Context, - outer: digest::BlockContext, -} - -/// `hmac::SigningContext` was renamed to `hmac::Context`. -#[deprecated(note = "Renamed to `hmac::Context`.")] -pub type SigningContext = Context; - -impl core::fmt::Debug for Context { - fn fmt(&self, f: &mut core::fmt::Formatter) -> Result<(), core::fmt::Error> { - f.debug_struct("Context") - .field("algorithm", self.inner.algorithm()) - .finish() - } -} - -impl Context { - /// Constructs a new HMAC signing context using the given digest algorithm - /// and key. - pub fn with_key(signing_key: &Key) -> Self { - Self { - inner: digest::Context::clone_from(&signing_key.inner), - outer: signing_key.outer.clone(), - } - } - - /// Updates the HMAC with all the data in `data`. `update` may be called - /// zero or more times until `finish` is called. - pub fn update(&mut self, data: &[u8]) { - self.inner.update(data); - } - - /// Finalizes the HMAC calculation and returns the HMAC value. `sign` - /// consumes the context so it cannot be (mis-)used after `sign` has been - /// called. - /// - /// It is generally not safe to implement HMAC verification by comparing - /// the return value of `sign` to a tag. Use `verify` for verification - /// instead. - pub fn sign(self) -> Tag { - let algorithm = self.inner.algorithm(); - let mut pending = [0u8; digest::MAX_BLOCK_LEN]; - let pending = &mut pending[..algorithm.block_len]; - let num_pending = algorithm.output_len; - pending[..num_pending].copy_from_slice(self.inner.finish().as_ref()); - Tag(self.outer.finish(pending, num_pending)) - } -} - -/// Calculates the HMAC of `data` using the key `key` in one step. -/// -/// Use `Context` to calculate HMACs where the input is in multiple parts. -/// -/// It is generally not safe to implement HMAC verification by comparing the -/// return value of `sign` to a tag. Use `verify` for verification instead. -pub fn sign(key: &Key, data: &[u8]) -> Tag { - let mut ctx = Context::with_key(key); - ctx.update(data); - ctx.sign() -} - -/// Calculates the HMAC of `data` using the signing key `key`, and verifies -/// whether the resultant value equals `tag`, in one step. -/// -/// This is logically equivalent to, but more efficient than, constructing a -/// `Key` with the same value as `key` and then using `verify`. -/// -/// The verification will be done in constant time to prevent timing attacks. -pub fn verify(key: &Key, data: &[u8], tag: &[u8]) -> Result<(), error::Unspecified> { - constant_time::verify_slices_are_equal(sign(key, data).as_ref(), tag) -} - -#[cfg(test)] -mod tests { - use crate::{hmac, rand}; - - // Make sure that `Key::generate` and `verify_with_own_key` aren't - // completely wacky. - #[test] - pub fn hmac_signing_key_coverage() { - let rng = rand::SystemRandom::new(); - - const HELLO_WORLD_GOOD: &[u8] = b"hello, world"; - const HELLO_WORLD_BAD: &[u8] = b"hello, worle"; - - for algorithm in &[ - hmac::HMAC_SHA1_FOR_LEGACY_USE_ONLY, - hmac::HMAC_SHA256, - hmac::HMAC_SHA384, - hmac::HMAC_SHA512, - ] { - let key = hmac::Key::generate(*algorithm, &rng).unwrap(); - let tag = hmac::sign(&key, HELLO_WORLD_GOOD); - assert!(hmac::verify(&key, HELLO_WORLD_GOOD, tag.as_ref()).is_ok()); - assert!(hmac::verify(&key, HELLO_WORLD_BAD, tag.as_ref()).is_err()) - } - } -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/io/der.rs temporalio-1.3.0/vendor/ring-0.16.20/src/io/der.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/io/der.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/io/der.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,311 +0,0 @@ -// Copyright 2015 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -//! Building blocks for parsing DER-encoded ASN.1 structures. -//! -//! This module contains the foundational parts of an ASN.1 DER parser. - -use super::Positive; -use crate::error; - -pub const CONSTRUCTED: u8 = 1 << 5; -pub const CONTEXT_SPECIFIC: u8 = 2 << 6; - -#[derive(Clone, Copy, PartialEq)] -#[repr(u8)] -pub enum Tag { - Boolean = 0x01, - Integer = 0x02, - BitString = 0x03, - OctetString = 0x04, - Null = 0x05, - OID = 0x06, - Sequence = CONSTRUCTED | 0x10, // 0x30 - UTCTime = 0x17, - GeneralizedTime = 0x18, - - ContextSpecificConstructed0 = CONTEXT_SPECIFIC | CONSTRUCTED | 0, - ContextSpecificConstructed1 = CONTEXT_SPECIFIC | CONSTRUCTED | 1, - ContextSpecificConstructed3 = CONTEXT_SPECIFIC | CONSTRUCTED | 3, -} - -impl From for usize { - fn from(tag: Tag) -> Self { - tag as Self - } -} - -impl From for u8 { - fn from(tag: Tag) -> Self { - tag as Self - } // XXX: narrowing conversion. -} - -pub fn expect_tag_and_get_value<'a>( - input: &mut untrusted::Reader<'a>, - tag: Tag, -) -> Result, error::Unspecified> { - let (actual_tag, inner) = read_tag_and_get_value(input)?; - if usize::from(tag) != usize::from(actual_tag) { - return Err(error::Unspecified); - } - Ok(inner) -} - -pub fn read_tag_and_get_value<'a>( - input: &mut untrusted::Reader<'a>, -) -> Result<(u8, untrusted::Input<'a>), error::Unspecified> { - let tag = input.read_byte()?; - if (tag & 0x1F) == 0x1F { - return Err(error::Unspecified); // High tag number form is not allowed. - } - - // If the high order bit of the first byte is set to zero then the length - // is encoded in the seven remaining bits of that byte. Otherwise, those - // seven bits represent the number of bytes used to encode the length. - let length = match input.read_byte()? { - n if (n & 0x80) == 0 => usize::from(n), - 0x81 => { - let second_byte = input.read_byte()?; - if second_byte < 128 { - return Err(error::Unspecified); // Not the canonical encoding. - } - usize::from(second_byte) - } - 0x82 => { - let second_byte = usize::from(input.read_byte()?); - let third_byte = usize::from(input.read_byte()?); - let combined = (second_byte << 8) | third_byte; - if combined < 256 { - return Err(error::Unspecified); // Not the canonical encoding. - } - combined - } - _ => { - return Err(error::Unspecified); // We don't support longer lengths. - } - }; - - let inner = input.read_bytes(length)?; - Ok((tag, inner)) -} - -pub fn bit_string_with_no_unused_bits<'a>( - input: &mut untrusted::Reader<'a>, -) -> Result, error::Unspecified> { - nested(input, Tag::BitString, error::Unspecified, |value| { - let unused_bits_at_end = value.read_byte().map_err(|_| error::Unspecified)?; - if unused_bits_at_end != 0 { - return Err(error::Unspecified); - } - Ok(value.read_bytes_to_end()) - }) -} - -// TODO: investigate taking decoder as a reference to reduce generated code -// size. -pub fn nested<'a, F, R, E: Copy>( - input: &mut untrusted::Reader<'a>, - tag: Tag, - error: E, - decoder: F, -) -> Result -where - F: FnOnce(&mut untrusted::Reader<'a>) -> Result, -{ - let inner = expect_tag_and_get_value(input, tag).map_err(|_| error)?; - inner.read_all(error, decoder) -} - -fn nonnegative_integer<'a>( - input: &mut untrusted::Reader<'a>, - min_value: u8, -) -> Result, error::Unspecified> { - // Verify that |input|, which has had any leading zero stripped off, is the - // encoding of a value of at least |min_value|. - fn check_minimum(input: untrusted::Input, min_value: u8) -> Result<(), error::Unspecified> { - input.read_all(error::Unspecified, |input| { - let first_byte = input.read_byte()?; - if input.at_end() && first_byte < min_value { - return Err(error::Unspecified); - } - let _ = input.read_bytes_to_end(); - Ok(()) - }) - } - - let value = expect_tag_and_get_value(input, Tag::Integer)?; - - value.read_all(error::Unspecified, |input| { - // Empty encodings are not allowed. - let first_byte = input.read_byte()?; - - if first_byte == 0 { - if input.at_end() { - // |value| is the legal encoding of zero. - if min_value > 0 { - return Err(error::Unspecified); - } - return Ok(value); - } - - let r = input.read_bytes_to_end(); - r.read_all(error::Unspecified, |input| { - let second_byte = input.read_byte()?; - if (second_byte & 0x80) == 0 { - // A leading zero is only allowed when the value's high bit - // is set. - return Err(error::Unspecified); - } - let _ = input.read_bytes_to_end(); - Ok(()) - })?; - check_minimum(r, min_value)?; - return Ok(r); - } - - // Negative values are not allowed. - if (first_byte & 0x80) != 0 { - return Err(error::Unspecified); - } - - let _ = input.read_bytes_to_end(); - check_minimum(value, min_value)?; - Ok(value) - }) -} - -/// Parse as integer with a value in the in the range [0, 255], returning its -/// numeric value. This is typically used for parsing version numbers. -#[inline] -pub fn small_nonnegative_integer(input: &mut untrusted::Reader) -> Result { - let value = nonnegative_integer(input, 0)?; - value.read_all(error::Unspecified, |input| { - let r = input.read_byte()?; - Ok(r) - }) -} - -/// Parses a positive DER integer, returning the big-endian-encoded value, -/// sans any leading zero byte. -pub fn positive_integer<'a>( - input: &mut untrusted::Reader<'a>, -) -> Result, error::Unspecified> { - Ok(Positive::new_non_empty_without_leading_zeros( - nonnegative_integer(input, 1)?, - )) -} - -#[cfg(test)] -mod tests { - use super::*; - use crate::error; - - fn with_good_i(value: &[u8], f: F) - where - F: FnOnce(&mut untrusted::Reader) -> Result, - { - let r = untrusted::Input::from(value).read_all(error::Unspecified, f); - assert!(r.is_ok()); - } - - fn with_bad_i(value: &[u8], f: F) - where - F: FnOnce(&mut untrusted::Reader) -> Result, - { - let r = untrusted::Input::from(value).read_all(error::Unspecified, f); - assert!(r.is_err()); - } - - static ZERO_INTEGER: &[u8] = &[0x02, 0x01, 0x00]; - - static GOOD_POSITIVE_INTEGERS: &[(&[u8], u8)] = &[ - (&[0x02, 0x01, 0x01], 0x01), - (&[0x02, 0x01, 0x02], 0x02), - (&[0x02, 0x01, 0x7e], 0x7e), - (&[0x02, 0x01, 0x7f], 0x7f), - // Values that need to have an 0x00 prefix to disambiguate them from - // them from negative values. - (&[0x02, 0x02, 0x00, 0x80], 0x80), - (&[0x02, 0x02, 0x00, 0x81], 0x81), - (&[0x02, 0x02, 0x00, 0xfe], 0xfe), - (&[0x02, 0x02, 0x00, 0xff], 0xff), - ]; - - static BAD_NONNEGATIVE_INTEGERS: &[&[u8]] = &[ - &[], // At end of input - &[0x02], // Tag only - &[0x02, 0x00], // Empty value - // Length mismatch - &[0x02, 0x00, 0x01], - &[0x02, 0x01], - &[0x02, 0x01, 0x00, 0x01], - &[0x02, 0x01, 0x01, 0x00], // Would be valid if last byte is ignored. - &[0x02, 0x02, 0x01], - // Negative values - &[0x02, 0x01, 0x80], - &[0x02, 0x01, 0xfe], - &[0x02, 0x01, 0xff], - // Values that have an unnecessary leading 0x00 - &[0x02, 0x02, 0x00, 0x00], - &[0x02, 0x02, 0x00, 0x01], - &[0x02, 0x02, 0x00, 0x02], - &[0x02, 0x02, 0x00, 0x7e], - &[0x02, 0x02, 0x00, 0x7f], - ]; - - #[test] - fn test_small_nonnegative_integer() { - with_good_i(ZERO_INTEGER, |input| { - assert_eq!(small_nonnegative_integer(input)?, 0x00); - Ok(()) - }); - for &(test_in, test_out) in GOOD_POSITIVE_INTEGERS.iter() { - with_good_i(test_in, |input| { - assert_eq!(small_nonnegative_integer(input)?, test_out); - Ok(()) - }); - } - for &test_in in BAD_NONNEGATIVE_INTEGERS.iter() { - with_bad_i(test_in, |input| { - let _ = small_nonnegative_integer(input)?; - Ok(()) - }); - } - } - - #[test] - fn test_positive_integer() { - with_bad_i(ZERO_INTEGER, |input| { - let _ = positive_integer(input)?; - Ok(()) - }); - for &(test_in, test_out) in GOOD_POSITIVE_INTEGERS.iter() { - with_good_i(test_in, |input| { - let test_out = [test_out]; - assert_eq!( - positive_integer(input)?.big_endian_without_leading_zero_as_input(), - untrusted::Input::from(&test_out[..]) - ); - Ok(()) - }); - } - for &test_in in BAD_NONNEGATIVE_INTEGERS.iter() { - with_bad_i(test_in, |input| { - let _ = positive_integer(input)?; - Ok(()) - }); - } - } -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/io/der_writer.rs temporalio-1.3.0/vendor/ring-0.16.20/src/io/der_writer.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/io/der_writer.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/io/der_writer.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,67 +0,0 @@ -// Copyright 2018 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -use super::{der::*, writer::*, *}; -use alloc::boxed::Box; - -pub(crate) fn write_positive_integer(output: &mut dyn Accumulator, value: &Positive) { - let first_byte = value.first_byte(); - let value = value.big_endian_without_leading_zero_as_input(); - write_tlv(output, Tag::Integer, |output| { - if (first_byte & 0x80) != 0 { - output.write_byte(0); // Disambiguate negative number. - } - write_copy(output, value) - }) -} - -pub(crate) fn write_all(tag: Tag, write_value: &dyn Fn(&mut dyn Accumulator)) -> Box<[u8]> { - let length = { - let mut length = LengthMeasurement::zero(); - write_tlv(&mut length, tag, write_value); - length - }; - - let mut output = Writer::with_capacity(length); - write_tlv(&mut output, tag, write_value); - - output.into() -} - -fn write_tlv(output: &mut dyn Accumulator, tag: Tag, write_value: F) -where - F: Fn(&mut dyn Accumulator), -{ - let length: usize = { - let mut length = LengthMeasurement::zero(); - write_value(&mut length); - length.into() - }; - - output.write_byte(tag as u8); - if length < 0x80 { - output.write_byte(length as u8); - } else if length < 0x1_00 { - output.write_byte(0x81); - output.write_byte(length as u8); - } else if length < 0x1_00_00 { - output.write_byte(0x82); - output.write_byte((length / 0x1_00) as u8); - output.write_byte(length as u8); - } else { - unreachable!(); - }; - - write_value(output); -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/io/positive.rs temporalio-1.3.0/vendor/ring-0.16.20/src/io/positive.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/io/positive.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/io/positive.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,53 +0,0 @@ -// Copyright 2018 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -//! Serialization and deserialization. - -/// A serialized positive integer. -#[derive(Copy, Clone)] -pub struct Positive<'a>(untrusted::Input<'a>); - -impl<'a> Positive<'a> { - #[inline] - pub(crate) fn new_non_empty_without_leading_zeros(input: untrusted::Input<'a>) -> Self { - debug_assert!(!input.is_empty()); - debug_assert!(input.len() == 1 || input.as_slice_less_safe()[0] != 0); - Self(input) - } - - /// Returns the value, ordered from significant byte to least significant - /// byte, without any leading zeros. The result is guaranteed to be - /// non-empty. - #[inline] - pub fn big_endian_without_leading_zero(&self) -> &'a [u8] { - self.big_endian_without_leading_zero_as_input() - .as_slice_less_safe() - } - - #[inline] - pub(crate) fn big_endian_without_leading_zero_as_input(&self) -> untrusted::Input<'a> { - self.0 - } -} - -impl Positive<'_> { - /// Returns the first byte. - /// - /// Will not panic because the value is guaranteed to have at least one - /// byte. - pub fn first_byte(&self) -> u8 { - // This won't panic because - self.0.as_slice_less_safe()[0] - } -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/io/writer.rs temporalio-1.3.0/vendor/ring-0.16.20/src/io/writer.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/io/writer.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/io/writer.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,79 +0,0 @@ -// Copyright 2018 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -use alloc::{boxed::Box, vec::Vec}; - -pub trait Accumulator { - fn write_byte(&mut self, value: u8); - fn write_bytes(&mut self, value: &[u8]); -} - -pub(super) struct LengthMeasurement { - len: usize, -} - -impl Into for LengthMeasurement { - fn into(self) -> usize { - self.len - } -} - -impl LengthMeasurement { - pub fn zero() -> Self { - Self { len: 0 } - } -} - -impl Accumulator for LengthMeasurement { - fn write_byte(&mut self, _value: u8) { - self.len += 1; - } - fn write_bytes(&mut self, value: &[u8]) { - self.len += value.len(); - } -} - -pub(super) struct Writer { - bytes: Vec, - requested_capacity: usize, -} - -impl Writer { - pub(super) fn with_capacity(capacity: LengthMeasurement) -> Self { - Self { - bytes: Vec::with_capacity(capacity.len), - requested_capacity: capacity.len, - } - } -} - -impl Into> for Writer { - fn into(self) -> Box<[u8]> { - assert_eq!(self.requested_capacity, self.bytes.len()); - self.bytes.into_boxed_slice() - } -} - -impl Accumulator for Writer { - fn write_byte(&mut self, value: u8) { - self.bytes.push(value); - } - fn write_bytes(&mut self, value: &[u8]) { - self.bytes.extend(value); - } -} - -pub fn write_copy(accumulator: &mut dyn Accumulator, to_copy: untrusted::Input) { - accumulator.write_bytes(to_copy.as_slice_less_safe()) -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/io.rs temporalio-1.3.0/vendor/ring-0.16.20/src/io.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/io.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/io.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,28 +0,0 @@ -// Copyright 2018 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -//! Serialization and deserialization. - -#[doc(hidden)] -pub mod der; - -#[cfg(feature = "alloc")] -mod writer; - -#[cfg(feature = "alloc")] -pub(crate) mod der_writer; - -pub(crate) mod positive; - -pub use self::positive::Positive; diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/lib.rs temporalio-1.3.0/vendor/ring-0.16.20/src/lib.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/lib.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,135 +0,0 @@ -// Copyright 2015-2016 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -//! Safe, fast, small crypto using Rust with BoringSSL's cryptography -//! primitives. -//! -//! # Feature Flags -//! -//! -//!
Feature -//! Description -//!
alloc (default) -//! Enable features that require use of the heap, RSA in particular. -//!
dev_urandom_fallback (default) -//! This is only applicable to Linux. On Linux, by default, -//! ring::rand::SystemRandom will fall back to reading -//! from /dev/urandom if the getrandom() -//! syscall isn't supported at runtime. When the -//! dev_urandom_fallback feature is disabled, such -//! fallbacks will not occur. See the documentation for -//! rand::SystemRandom for more details. -//!
std -//! Enable features that use libstd, in particular -//! std::error::Error integration. Implies `alloc`. -//!
wasm32_c -//! Enables features that require a C compiler on wasm32 targets, such as -//! the constant_time module, HMAC verification, and PBKDF2 -//! verification. Without this feature, only a subset of functionality -//! is provided to wasm32 targets so that a C compiler isn't needed. A -//! typical invocation would be: -//! TARGET_CC=clang-10 TARGET_AR=llvm-ar-10 cargo test --target=wasm32-unknown-unknown --features=wasm32_c -//! with llvm-ar-10 and clang-10 in $PATH. -//! (Going forward more functionality should be enabled by default, without -//! requiring these hacks, and without requiring a C compiler.) -//!
- -#![doc(html_root_url = "https://briansmith.org/rustdoc/")] -#![allow( - clippy::collapsible_if, - clippy::identity_op, - clippy::len_without_is_empty, - clippy::len_zero, - clippy::let_unit_value, - clippy::many_single_char_names, - clippy::needless_range_loop, - clippy::new_without_default, - clippy::neg_cmp_op_on_partial_ord, - clippy::range_plus_one, - clippy::too_many_arguments, - clippy::trivially_copy_pass_by_ref, - clippy::type_complexity, - clippy::unreadable_literal, - missing_copy_implementations, - missing_debug_implementations, - non_camel_case_types, - non_snake_case, - unsafe_code -)] -// `#[derive(...)]` uses `trivial_numeric_casts` and `unused_qualifications` -// internally. -#![deny(missing_docs, unused_qualifications, variant_size_differences)] -#![forbid(unused_results)] -#![no_std] - -#[cfg(feature = "alloc")] -extern crate alloc; - -#[macro_use] -mod debug; - -#[macro_use] -pub mod test; - -#[macro_use] -mod arithmetic; - -#[macro_use] -mod bssl; - -#[macro_use] -mod polyfill; - -pub mod aead; -pub mod agreement; - -mod bits; - -pub(crate) mod c; -pub mod constant_time; - -pub mod io; - -mod cpu; -pub mod digest; -mod ec; -mod endian; -pub mod error; -pub mod hkdf; -pub mod hmac; -mod limb; -pub mod pbkdf2; -pub mod pkcs8; -pub mod rand; - -#[cfg(feature = "alloc")] -mod rsa; - -pub mod signature; - -mod sealed { - /// Traits that are designed to only be implemented internally in *ring*. - // - // Usage: - // ``` - // use crate::sealed; - // - // pub trait MyType: sealed::Sealed { - // // [...] - // } - // - // impl sealed::Sealed for MyType {} - // ``` - pub trait Sealed {} -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/limb.rs temporalio-1.3.0/vendor/ring-0.16.20/src/limb.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/limb.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/limb.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,604 +0,0 @@ -// Copyright 2016 David Judd. -// Copyright 2016 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -//! Unsigned multi-precision integer arithmetic. -//! -//! Limbs ordered least-significant-limb to most-significant-limb. The bits -//! limbs use the native endianness. - -use crate::{c, error}; - -#[cfg(feature = "alloc")] -use crate::bits; - -#[cfg(feature = "alloc")] -use core::num::Wrapping; - -// XXX: Not correct for x32 ABIs. -#[cfg(target_pointer_width = "64")] -pub type Limb = u64; -#[cfg(target_pointer_width = "32")] -pub type Limb = u32; -#[cfg(target_pointer_width = "64")] -pub const LIMB_BITS: usize = 64; -#[cfg(target_pointer_width = "32")] -pub const LIMB_BITS: usize = 32; - -#[cfg(target_pointer_width = "64")] -#[derive(Debug, PartialEq)] -#[repr(u64)] -pub enum LimbMask { - True = 0xffff_ffff_ffff_ffff, - False = 0, -} - -#[cfg(target_pointer_width = "32")] -#[derive(Debug, PartialEq)] -#[repr(u32)] -pub enum LimbMask { - True = 0xffff_ffff, - False = 0, -} - -pub const LIMB_BYTES: usize = (LIMB_BITS + 7) / 8; - -#[inline] -pub fn limbs_equal_limbs_consttime(a: &[Limb], b: &[Limb]) -> LimbMask { - extern "C" { - fn LIMBS_equal(a: *const Limb, b: *const Limb, num_limbs: c::size_t) -> LimbMask; - } - - assert_eq!(a.len(), b.len()); - unsafe { LIMBS_equal(a.as_ptr(), b.as_ptr(), a.len()) } -} - -#[inline] -pub fn limbs_less_than_limbs_consttime(a: &[Limb], b: &[Limb]) -> LimbMask { - assert_eq!(a.len(), b.len()); - unsafe { LIMBS_less_than(a.as_ptr(), b.as_ptr(), b.len()) } -} - -#[inline] -pub fn limbs_less_than_limbs_vartime(a: &[Limb], b: &[Limb]) -> bool { - limbs_less_than_limbs_consttime(a, b) == LimbMask::True -} - -#[inline] -#[cfg(feature = "alloc")] -pub fn limbs_less_than_limb_constant_time(a: &[Limb], b: Limb) -> LimbMask { - unsafe { LIMBS_less_than_limb(a.as_ptr(), b, a.len()) } -} - -#[inline] -pub fn limbs_are_zero_constant_time(limbs: &[Limb]) -> LimbMask { - unsafe { LIMBS_are_zero(limbs.as_ptr(), limbs.len()) } -} - -#[cfg(feature = "alloc")] -#[inline] -pub fn limbs_are_even_constant_time(limbs: &[Limb]) -> LimbMask { - unsafe { LIMBS_are_even(limbs.as_ptr(), limbs.len()) } -} - -#[cfg(feature = "alloc")] -#[inline] -pub fn limbs_equal_limb_constant_time(a: &[Limb], b: Limb) -> LimbMask { - unsafe { LIMBS_equal_limb(a.as_ptr(), b, a.len()) } -} - -/// Returns the number of bits in `a`. -// -// This strives to be constant-time with respect to the values of all bits -// except the most significant bit. This does not attempt to be constant-time -// with respect to `a.len()` or the value of the result or the value of the -// most significant bit (It's 1, unless the input is zero, in which case it's -// zero.) -#[cfg(feature = "alloc")] -pub fn limbs_minimal_bits(a: &[Limb]) -> bits::BitLength { - for num_limbs in (1..=a.len()).rev() { - let high_limb = a[num_limbs - 1]; - - // Find the number of set bits in |high_limb| by a linear scan from the - // most significant bit to the least significant bit. This works great - // for the most common inputs because usually the most significant bit - // it set. - for high_limb_num_bits in (1..=LIMB_BITS).rev() { - let shifted = unsafe { LIMB_shr(high_limb, high_limb_num_bits - 1) }; - if shifted != 0 { - return bits::BitLength::from_usize_bits( - ((num_limbs - 1) * LIMB_BITS) + high_limb_num_bits, - ); - } - } - } - - // No bits were set. - bits::BitLength::from_usize_bits(0) -} - -/// Equivalent to `if (r >= m) { r -= m; }` -#[inline] -pub fn limbs_reduce_once_constant_time(r: &mut [Limb], m: &[Limb]) { - assert_eq!(r.len(), m.len()); - unsafe { LIMBS_reduce_once(r.as_mut_ptr(), m.as_ptr(), m.len()) }; -} - -#[derive(Clone, Copy, PartialEq)] -pub enum AllowZero { - No, - Yes, -} - -/// Parses `input` into `result`, reducing it via conditional subtraction -/// (mod `m`). Assuming 2**((self.num_limbs * LIMB_BITS) - 1) < m and -/// m < 2**(self.num_limbs * LIMB_BITS), the value will be reduced mod `m` in -/// constant time so that the result is in the range [0, m) if `allow_zero` is -/// `AllowZero::Yes`, or [1, m) if `allow_zero` is `AllowZero::No`. `result` is -/// padded with zeros to its length. -pub fn parse_big_endian_in_range_partially_reduced_and_pad_consttime( - input: untrusted::Input, - allow_zero: AllowZero, - m: &[Limb], - result: &mut [Limb], -) -> Result<(), error::Unspecified> { - parse_big_endian_and_pad_consttime(input, result)?; - limbs_reduce_once_constant_time(result, m); - if allow_zero != AllowZero::Yes { - if limbs_are_zero_constant_time(&result) != LimbMask::False { - return Err(error::Unspecified); - } - } - Ok(()) -} - -/// Parses `input` into `result`, verifies that the value is less than -/// `max_exclusive`, and pads `result` with zeros to its length. If `allow_zero` -/// is not `AllowZero::Yes`, zero values are rejected. -/// -/// This attempts to be constant-time with respect to the actual value *only if* -/// the value is actually in range. In other words, this won't leak anything -/// about a valid value, but it might leak small amounts of information about an -/// invalid value (which constraint it failed). -pub fn parse_big_endian_in_range_and_pad_consttime( - input: untrusted::Input, - allow_zero: AllowZero, - max_exclusive: &[Limb], - result: &mut [Limb], -) -> Result<(), error::Unspecified> { - parse_big_endian_and_pad_consttime(input, result)?; - if limbs_less_than_limbs_consttime(&result, max_exclusive) != LimbMask::True { - return Err(error::Unspecified); - } - if allow_zero != AllowZero::Yes { - if limbs_are_zero_constant_time(&result) != LimbMask::False { - return Err(error::Unspecified); - } - } - Ok(()) -} - -/// Parses `input` into `result`, padding `result` with zeros to its length. -/// This attempts to be constant-time with respect to the value but not with -/// respect to the length; it is assumed that the length is public knowledge. -pub fn parse_big_endian_and_pad_consttime( - input: untrusted::Input, - result: &mut [Limb], -) -> Result<(), error::Unspecified> { - if input.is_empty() { - return Err(error::Unspecified); - } - - // `bytes_in_current_limb` is the number of bytes in the current limb. - // It will be `LIMB_BYTES` for all limbs except maybe the highest-order - // limb. - let mut bytes_in_current_limb = input.len() % LIMB_BYTES; - if bytes_in_current_limb == 0 { - bytes_in_current_limb = LIMB_BYTES; - } - - let num_encoded_limbs = (input.len() / LIMB_BYTES) - + (if bytes_in_current_limb == LIMB_BYTES { - 0 - } else { - 1 - }); - if num_encoded_limbs > result.len() { - return Err(error::Unspecified); - } - - for r in &mut result[..] { - *r = 0; - } - - // XXX: Questionable as far as constant-timedness is concerned. - // TODO: Improve this. - input.read_all(error::Unspecified, |input| { - for i in 0..num_encoded_limbs { - let mut limb: Limb = 0; - for _ in 0..bytes_in_current_limb { - let b: Limb = input.read_byte()?.into(); - limb = (limb << 8) | b; - } - result[num_encoded_limbs - i - 1] = limb; - bytes_in_current_limb = LIMB_BYTES; - } - Ok(()) - }) -} - -pub fn big_endian_from_limbs(limbs: &[Limb], out: &mut [u8]) { - let num_limbs = limbs.len(); - let out_len = out.len(); - assert_eq!(out_len, num_limbs * LIMB_BYTES); - for i in 0..num_limbs { - let mut limb = limbs[i]; - for j in 0..LIMB_BYTES { - out[((num_limbs - i - 1) * LIMB_BYTES) + (LIMB_BYTES - j - 1)] = (limb & 0xff) as u8; - limb >>= 8; - } - } -} - -#[cfg(feature = "alloc")] -pub type Window = Limb; - -/// Processes `limbs` as a sequence of 5-bit windows, folding the windows from -/// most significant to least significant and returning the accumulated result. -/// The first window will be mapped by `init` to produce the initial value for -/// the accumulator. Then `f` will be called to fold the accumulator and the -/// next window until all windows are processed. When the input's bit length -/// isn't divisible by 5, the window passed to `init` will be partial; all -/// windows passed to `fold` will be full. -/// -/// This is designed to avoid leaking the contents of `limbs` through side -/// channels as long as `init` and `fold` are side-channel free. -/// -/// Panics if `limbs` is empty. -#[cfg(feature = "alloc")] -pub fn fold_5_bit_windows R, F: Fn(R, Window) -> R>( - limbs: &[Limb], - init: I, - fold: F, -) -> R { - #[derive(Clone, Copy)] - #[repr(transparent)] - struct BitIndex(Wrapping); - - const WINDOW_BITS: Wrapping = Wrapping(5); - - extern "C" { - fn LIMBS_window5_split_window( - lower_limb: Limb, - higher_limb: Limb, - index_within_word: BitIndex, - ) -> Window; - fn LIMBS_window5_unsplit_window(limb: Limb, index_within_word: BitIndex) -> Window; - } - - let num_limbs = limbs.len(); - let mut window_low_bit = { - let num_whole_windows = (num_limbs * LIMB_BITS) / 5; - let mut leading_bits = (num_limbs * LIMB_BITS) - (num_whole_windows * 5); - if leading_bits == 0 { - leading_bits = WINDOW_BITS.0; - } - BitIndex(Wrapping(LIMB_BITS - leading_bits)) - }; - - let initial_value = { - let leading_partial_window = - unsafe { LIMBS_window5_split_window(*limbs.last().unwrap(), 0, window_low_bit) }; - window_low_bit.0 -= WINDOW_BITS; - init(leading_partial_window) - }; - - let mut low_limb = 0; - limbs - .iter() - .rev() - .fold(initial_value, |mut acc, current_limb| { - let higher_limb = low_limb; - low_limb = *current_limb; - - if window_low_bit.0 > Wrapping(LIMB_BITS) - WINDOW_BITS { - let window = - unsafe { LIMBS_window5_split_window(low_limb, higher_limb, window_low_bit) }; - window_low_bit.0 -= WINDOW_BITS; - acc = fold(acc, window); - }; - while window_low_bit.0 < Wrapping(LIMB_BITS) { - let window = unsafe { LIMBS_window5_unsplit_window(low_limb, window_low_bit) }; - // The loop exits when this subtraction underflows, causing `window_low_bit` to - // wrap around to a very large value. - window_low_bit.0 -= WINDOW_BITS; - acc = fold(acc, window); - } - window_low_bit.0 += Wrapping(LIMB_BITS); // "Fix" the underflow. - - acc - }) -} - -extern "C" { - #[cfg(feature = "alloc")] - fn LIMB_shr(a: Limb, shift: c::size_t) -> Limb; - - #[cfg(feature = "alloc")] - fn LIMBS_are_even(a: *const Limb, num_limbs: c::size_t) -> LimbMask; - fn LIMBS_are_zero(a: *const Limb, num_limbs: c::size_t) -> LimbMask; - #[cfg(feature = "alloc")] - fn LIMBS_equal_limb(a: *const Limb, b: Limb, num_limbs: c::size_t) -> LimbMask; - fn LIMBS_less_than(a: *const Limb, b: *const Limb, num_limbs: c::size_t) -> LimbMask; - #[cfg(feature = "alloc")] - fn LIMBS_less_than_limb(a: *const Limb, b: Limb, num_limbs: c::size_t) -> LimbMask; - fn LIMBS_reduce_once(r: *mut Limb, m: *const Limb, num_limbs: c::size_t); -} - -#[cfg(test)] -mod tests { - use super::*; - - const MAX: Limb = LimbMask::True as Limb; - - #[test] - fn test_limbs_are_even() { - static EVENS: &[&[Limb]] = &[ - &[], - &[0], - &[2], - &[0, 0], - &[2, 0], - &[0, 1], - &[0, 2], - &[0, 3], - &[0, 0, 0, 0, MAX], - ]; - for even in EVENS { - assert_eq!(limbs_are_even_constant_time(even), LimbMask::True); - } - static ODDS: &[&[Limb]] = &[ - &[1], - &[3], - &[1, 0], - &[3, 0], - &[1, 1], - &[1, 2], - &[1, 3], - &[1, 0, 0, 0, MAX], - ]; - for odd in ODDS { - assert_eq!(limbs_are_even_constant_time(odd), LimbMask::False); - } - } - - static ZEROES: &[&[Limb]] = &[ - &[], - &[0], - &[0, 0], - &[0, 0, 0], - &[0, 0, 0, 0], - &[0, 0, 0, 0, 0], - &[0, 0, 0, 0, 0, 0, 0], - &[0, 0, 0, 0, 0, 0, 0, 0], - &[0, 0, 0, 0, 0, 0, 0, 0, 0], - ]; - - static NONZEROES: &[&[Limb]] = &[ - &[1], - &[0, 1], - &[1, 1], - &[1, 0, 0, 0], - &[0, 1, 0, 0], - &[0, 0, 1, 0], - &[0, 0, 0, 1], - ]; - - #[test] - fn test_limbs_are_zero() { - for zero in ZEROES { - assert_eq!(limbs_are_zero_constant_time(zero), LimbMask::True); - } - for nonzero in NONZEROES { - assert_eq!(limbs_are_zero_constant_time(nonzero), LimbMask::False); - } - } - - #[test] - fn test_limbs_equal_limb() { - for zero in ZEROES { - assert_eq!(limbs_equal_limb_constant_time(zero, 0), LimbMask::True); - } - for nonzero in NONZEROES { - assert_eq!(limbs_equal_limb_constant_time(nonzero, 0), LimbMask::False); - } - static EQUAL: &[(&[Limb], Limb)] = &[ - (&[1], 1), - (&[MAX], MAX), - (&[1, 0], 1), - (&[MAX, 0, 0], MAX), - (&[0b100], 0b100), - (&[0b100, 0], 0b100), - ]; - for &(a, b) in EQUAL { - assert_eq!(limbs_equal_limb_constant_time(a, b), LimbMask::True); - } - static UNEQUAL: &[(&[Limb], Limb)] = &[ - (&[0], 1), - (&[2], 1), - (&[3], 1), - (&[1, 1], 1), - (&[0b100, 0b100], 0b100), - (&[1, 0, 0b100, 0, 0, 0, 0, 0], 1), - (&[1, 0, 0, 0, 0, 0, 0, 0b100], 1), - (&[MAX, MAX], MAX), - (&[MAX, 1], MAX), - ]; - for &(a, b) in UNEQUAL { - assert_eq!(limbs_equal_limb_constant_time(a, b), LimbMask::False); - } - } - - #[test] - #[cfg(feature = "alloc")] - fn test_limbs_less_than_limb_constant_time() { - static LESSER: &[(&[Limb], Limb)] = &[ - (&[0], 1), - (&[0, 0], 1), - (&[1, 0], 2), - (&[2, 0], 3), - (&[2, 0], 3), - (&[MAX - 1], MAX), - (&[MAX - 1, 0], MAX), - ]; - for &(a, b) in LESSER { - assert_eq!(limbs_less_than_limb_constant_time(a, b), LimbMask::True); - } - static EQUAL: &[(&[Limb], Limb)] = &[ - (&[0], 0), - (&[0, 0, 0, 0], 0), - (&[1], 1), - (&[1, 0, 0, 0, 0, 0, 0], 1), - (&[MAX], MAX), - ]; - static GREATER: &[(&[Limb], Limb)] = &[ - (&[1], 0), - (&[2, 0], 1), - (&[3, 0, 0, 0], 1), - (&[0, 1, 0, 0], 1), - (&[0, 0, 1, 0], 1), - (&[0, 0, 1, 1], 1), - (&[MAX], MAX - 1), - ]; - for &(a, b) in EQUAL.iter().chain(GREATER.iter()) { - assert_eq!(limbs_less_than_limb_constant_time(a, b), LimbMask::False); - } - } - - #[test] - fn test_parse_big_endian_and_pad_consttime() { - const LIMBS: usize = 4; - - { - // Empty input. - let inp = untrusted::Input::from(&[]); - let mut result = [0; LIMBS]; - assert!(parse_big_endian_and_pad_consttime(inp, &mut result).is_err()); - } - - // The input is longer than will fit in the given number of limbs. - { - let inp = [1, 2, 3, 4, 5, 6, 7, 8, 9]; - let inp = untrusted::Input::from(&inp); - let mut result = [0; 8 / LIMB_BYTES]; - assert!(parse_big_endian_and_pad_consttime(inp, &mut result[..]).is_err()); - } - - // Less than a full limb. - { - let inp = [0xfe]; - let inp = untrusted::Input::from(&inp); - let mut result = [0; LIMBS]; - assert_eq!( - Ok(()), - parse_big_endian_and_pad_consttime(inp, &mut result[..]) - ); - assert_eq!(&[0xfe, 0, 0, 0], &result); - } - - // A whole limb for 32-bit, half a limb for 64-bit. - { - let inp = [0xbe, 0xef, 0xf0, 0x0d]; - let inp = untrusted::Input::from(&inp); - let mut result = [0; LIMBS]; - assert_eq!(Ok(()), parse_big_endian_and_pad_consttime(inp, &mut result)); - assert_eq!(&[0xbeeff00d, 0, 0, 0], &result); - } - - // XXX: This is a weak set of tests. TODO: expand it. - } - - #[test] - fn test_big_endian_from_limbs_same_length() { - #[cfg(target_pointer_width = "32")] - let limbs = [ - 0xbccddeef, 0x89900aab, 0x45566778, 0x01122334, 0xddeeff00, 0x99aabbcc, 0x55667788, - 0x11223344, - ]; - - #[cfg(target_pointer_width = "64")] - let limbs = [ - 0x8990_0aab_bccd_deef, - 0x0112_2334_4556_6778, - 0x99aa_bbcc_ddee_ff00, - 0x1122_3344_5566_7788, - ]; - - let expected = [ - 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, - 0xff, 0x00, 0x01, 0x12, 0x23, 0x34, 0x45, 0x56, 0x67, 0x78, 0x89, 0x90, 0x0a, 0xab, - 0xbc, 0xcd, 0xde, 0xef, - ]; - - let mut out = [0xabu8; 32]; - big_endian_from_limbs(&limbs[..], &mut out); - assert_eq!(&out[..], &expected[..]); - } - - #[should_panic] - #[test] - fn test_big_endian_from_limbs_fewer_limbs() { - #[cfg(target_pointer_width = "32")] - // Two fewer limbs. - let limbs = [ - 0xbccddeef, 0x89900aab, 0x45566778, 0x01122334, 0xddeeff00, 0x99aabbcc, - ]; - - // One fewer limb. - #[cfg(target_pointer_width = "64")] - let limbs = [ - 0x8990_0aab_bccd_deef, - 0x0112_2334_4556_6778, - 0x99aa_bbcc_ddee_ff00, - ]; - - let mut out = [0xabu8; 32]; - - big_endian_from_limbs(&limbs[..], &mut out); - } - - #[test] - fn test_limbs_minimal_bits() { - const ALL_ONES: Limb = LimbMask::True as Limb; - static CASES: &[(&[Limb], usize)] = &[ - (&[], 0), - (&[0], 0), - (&[ALL_ONES], LIMB_BITS), - (&[ALL_ONES, 0], LIMB_BITS), - (&[ALL_ONES, 1], LIMB_BITS + 1), - (&[0, 0], 0), - (&[1, 0], 1), - (&[0, 1], LIMB_BITS + 1), - (&[0, ALL_ONES], 2 * LIMB_BITS), - (&[ALL_ONES, ALL_ONES], 2 * LIMB_BITS), - (&[ALL_ONES, ALL_ONES >> 1], 2 * LIMB_BITS - 1), - (&[ALL_ONES, 0b100_0000], LIMB_BITS + 7), - (&[ALL_ONES, 0b101_0000], LIMB_BITS + 7), - (&[ALL_ONES, ALL_ONES >> 1], LIMB_BITS + (LIMB_BITS) - 1), - ]; - for (limbs, bits) in CASES { - assert_eq!(limbs_minimal_bits(limbs).as_usize_bits(), *bits); - } - } -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/pbkdf2.rs temporalio-1.3.0/vendor/ring-0.16.20/src/pbkdf2.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/pbkdf2.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/pbkdf2.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,272 +0,0 @@ -// Copyright 2015 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -//! PBKDF2 derivation and verification. -//! -//! Use `derive` to derive PBKDF2 outputs. Use `verify` to verify secret -//! against previously-derived outputs. -//! -//! PBKDF2 is specified in [RFC 2898 Section 5.2] with test vectors given in -//! [RFC 6070]. See also [NIST Special Publication 800-132]. -//! -//! [RFC 2898 Section 5.2]: https://tools.ietf.org/html/rfc2898#section-5.2 -//! [RFC 6070]: https://tools.ietf.org/html/rfc6070 -//! [NIST Special Publication 800-132]: -//! http://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-132.pdf -//! -//! # Examples -//! -//! ## Password Database Example -//! -//! ``` -//! use ring::{digest, pbkdf2}; -//! use std::{collections::HashMap, num::NonZeroU32}; -//! -//! static PBKDF2_ALG: pbkdf2::Algorithm = pbkdf2::PBKDF2_HMAC_SHA256; -//! const CREDENTIAL_LEN: usize = digest::SHA256_OUTPUT_LEN; -//! pub type Credential = [u8; CREDENTIAL_LEN]; -//! -//! enum Error { -//! WrongUsernameOrPassword -//! } -//! -//! struct PasswordDatabase { -//! pbkdf2_iterations: NonZeroU32, -//! db_salt_component: [u8; 16], -//! -//! // Normally this would be a persistent database. -//! storage: HashMap, -//! } -//! -//! impl PasswordDatabase { -//! pub fn store_password(&mut self, username: &str, password: &str) { -//! let salt = self.salt(username); -//! let mut to_store: Credential = [0u8; CREDENTIAL_LEN]; -//! pbkdf2::derive(PBKDF2_ALG, self.pbkdf2_iterations, &salt, -//! password.as_bytes(), &mut to_store); -//! self.storage.insert(String::from(username), to_store); -//! } -//! -//! pub fn verify_password(&self, username: &str, attempted_password: &str) -//! -> Result<(), Error> { -//! match self.storage.get(username) { -//! Some(actual_password) => { -//! let salt = self.salt(username); -//! pbkdf2::verify(PBKDF2_ALG, self.pbkdf2_iterations, &salt, -//! attempted_password.as_bytes(), -//! actual_password) -//! .map_err(|_| Error::WrongUsernameOrPassword) -//! }, -//! -//! None => Err(Error::WrongUsernameOrPassword) -//! } -//! } -//! -//! // The salt should have a user-specific component so that an attacker -//! // cannot crack one password for multiple users in the database. It -//! // should have a database-unique component so that an attacker cannot -//! // crack the same user's password across databases in the unfortunate -//! // but common case that the user has used the same password for -//! // multiple systems. -//! fn salt(&self, username: &str) -> Vec { -//! let mut salt = Vec::with_capacity(self.db_salt_component.len() + -//! username.as_bytes().len()); -//! salt.extend(self.db_salt_component.as_ref()); -//! salt.extend(username.as_bytes()); -//! salt -//! } -//! } -//! -//! fn main() { -//! // Normally these parameters would be loaded from a configuration file. -//! let mut db = PasswordDatabase { -//! pbkdf2_iterations: NonZeroU32::new(100_000).unwrap(), -//! db_salt_component: [ -//! // This value was generated from a secure PRNG. -//! 0xd6, 0x26, 0x98, 0xda, 0xf4, 0xdc, 0x50, 0x52, -//! 0x24, 0xf2, 0x27, 0xd1, 0xfe, 0x39, 0x01, 0x8a -//! ], -//! storage: HashMap::new(), -//! }; -//! -//! db.store_password("alice", "@74d7]404j|W}6u"); -//! -//! // An attempt to log in with the wrong password fails. -//! assert!(db.verify_password("alice", "wrong password").is_err()); -//! -//! // Normally there should be an expoentially-increasing delay between -//! // attempts to further protect against online attacks. -//! -//! // An attempt to log in with the right password succeeds. -//! assert!(db.verify_password("alice", "@74d7]404j|W}6u").is_ok()); -//! } - -use crate::{constant_time, digest, error, hmac, polyfill}; -use core::num::NonZeroU32; - -/// A PBKDF2 algorithm. -#[derive(Clone, Copy, PartialEq, Eq)] -pub struct Algorithm(hmac::Algorithm); - -/// PBKDF2 using HMAC-SHA1. -pub static PBKDF2_HMAC_SHA1: Algorithm = Algorithm(hmac::HMAC_SHA1_FOR_LEGACY_USE_ONLY); - -/// PBKDF2 using HMAC-SHA256. -pub static PBKDF2_HMAC_SHA256: Algorithm = Algorithm(hmac::HMAC_SHA256); - -/// PBKDF2 using HMAC-SHA384. -pub static PBKDF2_HMAC_SHA384: Algorithm = Algorithm(hmac::HMAC_SHA384); - -/// PBKDF2 using HMAC-SHA512. -pub static PBKDF2_HMAC_SHA512: Algorithm = Algorithm(hmac::HMAC_SHA512); - -/// Fills `out` with the key derived using PBKDF2 with the given inputs. -/// -/// Do not use `derive` as part of verifying a secret; use `verify` instead, to -/// minimize the effectiveness of timing attacks. -/// -/// `out.len()` must be no larger than the digest length * (2**32 - 1), per the -/// PBKDF2 specification. -/// -/// | Parameter | RFC 2898 Section 5.2 Term -/// |-------------|------------------------------------------- -/// | digest_alg | PRF (HMAC with the given digest algorithm) -/// | iterations | c (iteration count) -/// | salt | S (salt) -/// | secret | P (password) -/// | out | dk (derived key) -/// | out.len() | dkLen (derived key length) -/// -/// # Panics -/// -/// `derive` panics if `out.len()` is larger than (2**32 - 1) * the digest -/// algorithm's output length, per the PBKDF2 specification. -pub fn derive( - algorithm: Algorithm, - iterations: NonZeroU32, - salt: &[u8], - secret: &[u8], - out: &mut [u8], -) { - let digest_alg = algorithm.0.digest_algorithm(); - let output_len = digest_alg.output_len; - - // This implementation's performance is asymptotically optimal as described - // in https://jbp.io/2015/08/11/pbkdf2-performance-matters/. However, it - // hasn't been optimized to the same extent as fastpbkdf2. In particular, - // this implementation is probably doing a lot of unnecessary copying. - - let secret = hmac::Key::new(algorithm.0, secret); - - // Clear |out|. - polyfill::slice::fill(out, 0); - - let mut idx: u32 = 0; - - for chunk in out.chunks_mut(output_len) { - idx = idx.checked_add(1).expect("derived key too long"); - derive_block(&secret, iterations, salt, idx, chunk); - } -} - -fn derive_block(secret: &hmac::Key, iterations: NonZeroU32, salt: &[u8], idx: u32, out: &mut [u8]) { - let mut ctx = hmac::Context::with_key(secret); - ctx.update(salt); - ctx.update(&u32::to_be_bytes(idx)); - - let mut u = ctx.sign(); - - let mut remaining: u32 = iterations.into(); - loop { - for i in 0..out.len() { - out[i] ^= u.as_ref()[i]; - } - - if remaining == 1 { - break; - } - remaining -= 1; - - u = hmac::sign(secret, u.as_ref()); - } -} - -/// Verifies that a previously-derived (e.g., using `derive`) PBKDF2 value -/// matches the PBKDF2 value derived from the other inputs. -/// -/// The comparison is done in constant time to prevent timing attacks. The -/// comparison will fail if `previously_derived` is empty (has a length of -/// zero). -/// -/// | Parameter | RFC 2898 Section 5.2 Term -/// |----------------------------|-------------------------------------------- -/// | digest_alg | PRF (HMAC with the given digest algorithm). -/// | `iterations` | c (iteration count) -/// | `salt` | S (salt) -/// | `secret` | P (password) -/// | `previously_derived` | dk (derived key) -/// | `previously_derived.len()` | dkLen (derived key length) -/// -/// # Panics -/// -/// `verify` panics if `out.len()` is larger than (2**32 - 1) * the digest -/// algorithm's output length, per the PBKDF2 specification. -pub fn verify( - algorithm: Algorithm, - iterations: NonZeroU32, - salt: &[u8], - secret: &[u8], - previously_derived: &[u8], -) -> Result<(), error::Unspecified> { - let digest_alg = algorithm.0.digest_algorithm(); - - if previously_derived.is_empty() { - return Err(error::Unspecified); - } - - let mut derived_buf = [0u8; digest::MAX_OUTPUT_LEN]; - - let output_len = digest_alg.output_len; - let secret = hmac::Key::new(algorithm.0, secret); - let mut idx: u32 = 0; - - let mut matches = 1; - - for previously_derived_chunk in previously_derived.chunks(output_len) { - idx = idx.checked_add(1).expect("derived key too long"); - - let derived_chunk = &mut derived_buf[..previously_derived_chunk.len()]; - polyfill::slice::fill(derived_chunk, 0); - - derive_block(&secret, iterations, salt, idx, derived_chunk); - - // XXX: This isn't fully constant-time-safe. TODO: Fix that. - let current_block_matches = - if constant_time::verify_slices_are_equal(derived_chunk, previously_derived_chunk) - .is_ok() - { - 1 - } else { - 0 - }; - - matches &= current_block_matches; - } - - if matches == 0 { - return Err(error::Unspecified); - } - - Ok(()) -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/pkcs8.rs temporalio-1.3.0/vendor/ring-0.16.20/src/pkcs8.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/pkcs8.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/pkcs8.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,201 +0,0 @@ -// Copyright 2017 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -//! PKCS#8 is specified in [RFC 5958]. -//! -//! [RFC 5958]: https://tools.ietf.org/html/rfc5958. - -use crate::{ec, error, io::der}; - -pub(crate) enum Version { - V1Only, - V1OrV2, - V2Only, -} - -/// A template for constructing PKCS#8 documents. -/// -/// Note that this only works for ECC. -pub(crate) struct Template { - pub bytes: &'static [u8], - - // The range within `bytes` that holds the value (not including the tag and - // length) for use in the PKCS#8 document's privateKeyAlgorithm field. - pub alg_id_range: core::ops::Range, - - // `bytes[alg_id_range][curve_id_index..]` contains the OID identifying the, - // curve, including the tag and length. - pub curve_id_index: usize, - - // `bytes` will be split into two parts at `private_key_index`, where the - // first part is written before the private key and the second part is - // written after the private key. The public key is written after the second - // part. - pub private_key_index: usize, -} - -impl Template { - #[inline] - fn alg_id_value(&self) -> untrusted::Input { - untrusted::Input::from(self.alg_id_value_()) - } - - fn alg_id_value_(&self) -> &[u8] { - &self.bytes[self.alg_id_range.start..self.alg_id_range.end] - } - - #[inline] - pub fn curve_oid(&self) -> untrusted::Input { - untrusted::Input::from(&self.alg_id_value_()[self.curve_id_index..]) - } -} - -/// Parses an unencrypted PKCS#8 private key, verifies that it is the right type -/// of key, and returns the key value. -/// -/// PKCS#8 is specified in [RFC 5958]. -/// -/// [RFC 5958]: https://tools.ietf.org/html/rfc5958. -pub(crate) fn unwrap_key<'a>( - template: &Template, - version: Version, - input: untrusted::Input<'a>, -) -> Result<(untrusted::Input<'a>, Option>), error::KeyRejected> { - unwrap_key_(template.alg_id_value(), version, input) -} - -/// Parses an unencrypted PKCS#8 private key, verifies that it is the right type -/// of key, and returns the key value. -/// -/// `alg_id` must be the encoded value (not including the outermost `SEQUENCE` -/// tag and length) of the `AlgorithmIdentifier` that identifies the key type. -/// The result will be an encoded `RSAPrivateKey` or `ECPrivateKey` or similar. -/// -/// PKCS#8 is specified in [RFC 5958]. -/// -/// [RFC 5958]: https://tools.ietf.org/html/rfc5958. -pub(crate) fn unwrap_key_<'a>( - alg_id: untrusted::Input, - version: Version, - input: untrusted::Input<'a>, -) -> Result<(untrusted::Input<'a>, Option>), error::KeyRejected> { - input.read_all(error::KeyRejected::invalid_encoding(), |input| { - der::nested( - input, - der::Tag::Sequence, - error::KeyRejected::invalid_encoding(), - |input| unwrap_key__(alg_id, version, input), - ) - }) -} - -fn unwrap_key__<'a>( - alg_id: untrusted::Input, - version: Version, - input: &mut untrusted::Reader<'a>, -) -> Result<(untrusted::Input<'a>, Option>), error::KeyRejected> { - let actual_version = der::small_nonnegative_integer(input) - .map_err(|error::Unspecified| error::KeyRejected::invalid_encoding())?; - - // Do things in a specific order to return more useful errors: - // 1. Check for completely unsupported version. - // 2. Check for algorithm mismatch. - // 3. Check for algorithm-specific version mismatch. - - if actual_version > 1 { - return Err(error::KeyRejected::version_not_supported()); - }; - - let actual_alg_id = der::expect_tag_and_get_value(input, der::Tag::Sequence) - .map_err(|error::Unspecified| error::KeyRejected::invalid_encoding())?; - if actual_alg_id != alg_id { - return Err(error::KeyRejected::wrong_algorithm()); - } - - let require_public_key = match (actual_version, version) { - (0, Version::V1Only) => false, - (0, Version::V1OrV2) => false, - (1, Version::V1OrV2) | (1, Version::V2Only) => true, - _ => { - return Err(error::KeyRejected::version_not_supported()); - } - }; - - let private_key = der::expect_tag_and_get_value(input, der::Tag::OctetString) - .map_err(|error::Unspecified| error::KeyRejected::invalid_encoding())?; - - // Ignore any attributes that are present. - if input.peek(der::Tag::ContextSpecificConstructed0 as u8) { - let _ = der::expect_tag_and_get_value(input, der::Tag::ContextSpecificConstructed0) - .map_err(|error::Unspecified| error::KeyRejected::invalid_encoding())?; - } - - let public_key = if require_public_key { - if input.at_end() { - return Err(error::KeyRejected::public_key_is_missing()); - } - let public_key = der::nested( - input, - der::Tag::ContextSpecificConstructed1, - error::Unspecified, - der::bit_string_with_no_unused_bits, - ) - .map_err(|error::Unspecified| error::KeyRejected::invalid_encoding())?; - Some(public_key) - } else { - None - }; - - Ok((private_key, public_key)) -} - -/// A generated PKCS#8 document. -pub struct Document { - bytes: [u8; ec::PKCS8_DOCUMENT_MAX_LEN], - len: usize, -} - -impl AsRef<[u8]> for Document { - #[inline] - fn as_ref(&self) -> &[u8] { - &self.bytes[..self.len] - } -} - -pub(crate) fn wrap_key(template: &Template, private_key: &[u8], public_key: &[u8]) -> Document { - let mut result = Document { - bytes: [0; ec::PKCS8_DOCUMENT_MAX_LEN], - len: template.bytes.len() + private_key.len() + public_key.len(), - }; - wrap_key_( - template, - private_key, - public_key, - &mut result.bytes[..result.len], - ); - result -} - -/// Formats a private key "prefix||private_key||middle||public_key" where -/// `template` is "prefix||middle" split at position `private_key_index`. -fn wrap_key_(template: &Template, private_key: &[u8], public_key: &[u8], bytes: &mut [u8]) { - let (before_private_key, after_private_key) = - template.bytes.split_at(template.private_key_index); - let private_key_end_index = template.private_key_index + private_key.len(); - bytes[..template.private_key_index].copy_from_slice(before_private_key); - bytes[template.private_key_index..private_key_end_index].copy_from_slice(&private_key); - bytes[private_key_end_index..(private_key_end_index + after_private_key.len())] - .copy_from_slice(after_private_key); - bytes[(private_key_end_index + after_private_key.len())..].copy_from_slice(public_key); -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/polyfill.rs temporalio-1.3.0/vendor/ring-0.16.20/src/polyfill.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/polyfill.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/polyfill.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,39 +0,0 @@ -// Copyright 2015-2016 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -//! Polyfills for functionality that will (hopefully) be added to Rust's -//! standard library soon. - -#[inline(always)] -pub const fn u64_from_usize(x: usize) -> u64 { - x as u64 -} - -pub fn usize_from_u32(x: u32) -> usize { - x as usize -} - -pub mod slice { - // https://github.com/rust-lang/rust/issues/27750 - // https://internals.rust-lang.org/t/stabilizing-basic-functions-on-arrays-and-slices/2868 - #[inline(always)] - pub fn fill(dest: &mut [T], value: T) - where - T: Copy, - { - for d in dest { - *d = value; - } - } -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/rand.rs temporalio-1.3.0/vendor/ring-0.16.20/src/rand.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/rand.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/rand.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,433 +0,0 @@ -// Copyright 2015-2016 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -//! Cryptographic pseudo-random number generation. -//! -//! An application should create a single `SystemRandom` and then use it for -//! all randomness generation. Functions that generate random bytes should take -//! a `&dyn SecureRandom` parameter instead of instantiating their own. Besides -//! being more efficient, this also helps document where non-deterministic -//! (random) outputs occur. Taking a reference to a `SecureRandom` also helps -//! with testing techniques like fuzzing, where it is useful to use a -//! (non-secure) deterministic implementation of `SecureRandom` so that results -//! can be replayed. Following this pattern also may help with sandboxing -//! (seccomp filters on Linux in particular). See `SystemRandom`'s -//! documentation for more details. - -use crate::error; - -/// A secure random number generator. -pub trait SecureRandom: sealed::SecureRandom { - /// Fills `dest` with random bytes. - fn fill(&self, dest: &mut [u8]) -> Result<(), error::Unspecified>; -} - -impl SecureRandom for T -where - T: sealed::SecureRandom, -{ - #[inline(always)] - fn fill(&self, dest: &mut [u8]) -> Result<(), error::Unspecified> { - self.fill_impl(dest) - } -} - -/// A random value constructed from a `SecureRandom` that hasn't been exposed -/// through any safe Rust interface. -/// -/// Intentionally does not implement any traits other than `Sized`. -pub struct Random(T); - -impl Random { - /// Expose the random value. - #[inline] - pub fn expose(self) -> T { - self.0 - } -} - -/// Generate the new random value using `rng`. -#[inline] -pub fn generate( - rng: &dyn SecureRandom, -) -> Result, error::Unspecified> -where - T: RandomlyConstructable, -{ - let mut r = T::zero(); - rng.fill(r.as_mut_bytes())?; - Ok(Random(r)) -} - -pub(crate) mod sealed { - use crate::error; - - pub trait SecureRandom: core::fmt::Debug { - /// Fills `dest` with random bytes. - fn fill_impl(&self, dest: &mut [u8]) -> Result<(), error::Unspecified>; - } - - pub trait RandomlyConstructable: Sized { - fn zero() -> Self; // `Default::default()` - fn as_mut_bytes(&mut self) -> &mut [u8]; // `AsMut<[u8]>::as_mut` - } - - macro_rules! impl_random_arrays { - [ $($len:expr)+ ] => { - $( - impl RandomlyConstructable for [u8; $len] { - #[inline] - fn zero() -> Self { [0; $len] } - - #[inline] - fn as_mut_bytes(&mut self) -> &mut [u8] { &mut self[..] } - } - )+ - } - } - - impl_random_arrays![4 8 16 32 48 64 128 256]; -} - -/// A type that can be returned by `ring::rand::generate()`. -pub trait RandomlyConstructable: self::sealed::RandomlyConstructable {} -impl RandomlyConstructable for T where T: self::sealed::RandomlyConstructable {} - -/// A secure random number generator where the random values come directly -/// from the operating system. -/// -/// A single `SystemRandom` may be shared across multiple threads safely. -/// -/// `new()` is guaranteed to always succeed and to have low latency; it won't -/// try to open or read from a file or do similar things. The first call to -/// `fill()` may block a substantial amount of time since any and all -/// initialization is deferred to it. Therefore, it may be a good idea to call -/// `fill()` once at a non-latency-sensitive time to minimize latency for -/// future calls. -/// -/// On Linux (including Android), `fill()` will use the [`getrandom`] syscall. -/// If the kernel is too old to support `getrandom` then by default `fill()` -/// falls back to reading from `/dev/urandom`. This decision is made the first -/// time `fill` *succeeds*. The fallback to `/dev/urandom` can be disabled by -/// disabling the `dev_urandom_fallback` default feature; this should be done -/// whenever the target system is known to support `getrandom`. When -/// `/dev/urandom` is used, a file handle for `/dev/urandom` won't be opened -/// until `fill` is called; `SystemRandom::new()` will not open `/dev/urandom` -/// or do other potentially-high-latency things. The file handle will never be -/// closed, until the operating system closes it at process shutdown. All -/// instances of `SystemRandom` will share a single file handle. To properly -/// implement seccomp filtering when the `dev_urandom_fallback` default feature -/// is disabled, allow `getrandom` through. When the fallback is enabled, allow -/// file opening, `getrandom`, and `read` up until the first call to `fill()` -/// succeeds; after that, allow `getrandom` and `read`. -/// -/// On macOS and iOS, `fill()` is implemented using `SecRandomCopyBytes`. -/// -/// On wasm32-unknown-unknown (non-WASI), `fill()` is implemented using -/// `window.crypto.getRandomValues()`. It must be used in a context where the -/// global object is a `Window`; i.e. it must not be used in a Worker or a -/// non-browser context. -/// -/// On Windows, `fill` is implemented using the platform's API for secure -/// random number generation. -/// -/// [`getrandom`]: http://man7.org/linux/man-pages/man2/getrandom.2.html -#[derive(Clone, Debug)] -pub struct SystemRandom(()); - -impl SystemRandom { - /// Constructs a new `SystemRandom`. - #[inline(always)] - pub fn new() -> Self { - Self(()) - } -} - -impl sealed::SecureRandom for SystemRandom { - #[inline(always)] - fn fill_impl(&self, dest: &mut [u8]) -> Result<(), error::Unspecified> { - fill_impl(dest) - } -} - -impl crate::sealed::Sealed for SystemRandom {} - -#[cfg(any( - all( - any(target_os = "android", target_os = "linux"), - not(feature = "dev_urandom_fallback") - ), - target_arch = "wasm32", - windows -))] -use self::sysrand::fill as fill_impl; - -#[cfg(all( - any(target_os = "android", target_os = "linux"), - feature = "dev_urandom_fallback" -))] -use self::sysrand_or_urandom::fill as fill_impl; - -#[cfg(any( - target_os = "dragonfly", - target_os = "freebsd", - target_os = "illumos", - target_os = "netbsd", - target_os = "openbsd", - target_os = "solaris", -))] -use self::urandom::fill as fill_impl; - -#[cfg(any(target_os = "macos", target_os = "ios"))] -use self::darwin::fill as fill_impl; - -#[cfg(any(target_os = "fuchsia"))] -use self::fuchsia::fill as fill_impl; - -#[cfg(any(target_os = "android", target_os = "linux"))] -mod sysrand_chunk { - use crate::{c, error}; - - #[inline] - pub fn chunk(dest: &mut [u8]) -> Result { - use libc::c_long; - - // See `SYS_getrandom` in #include . - - #[cfg(target_arch = "aarch64")] - const SYS_GETRANDOM: c_long = 278; - - #[cfg(target_arch = "arm")] - const SYS_GETRANDOM: c_long = 384; - - #[cfg(target_arch = "x86")] - const SYS_GETRANDOM: c_long = 355; - - #[cfg(target_arch = "x86_64")] - const SYS_GETRANDOM: c_long = 318; - - let chunk_len: c::size_t = dest.len(); - let r = unsafe { libc::syscall(SYS_GETRANDOM, dest.as_mut_ptr(), chunk_len, 0) }; - if r < 0 { - let errno; - - #[cfg(target_os = "linux")] - { - errno = unsafe { *libc::__errno_location() }; - } - - #[cfg(target_os = "android")] - { - errno = unsafe { *libc::__errno() }; - } - - if errno == libc::EINTR { - // If an interrupt occurs while getrandom() is blocking to wait - // for the entropy pool, then EINTR is returned. Returning 0 - // will cause the caller to try again. - return Ok(0); - } - return Err(error::Unspecified); - } - Ok(r as usize) - } -} - -#[cfg(all( - target_arch = "wasm32", - target_vendor = "unknown", - target_os = "unknown", - target_env = "", -))] -mod sysrand_chunk { - use crate::error; - - pub fn chunk(mut dest: &mut [u8]) -> Result { - // This limit is specified in - // https://www.w3.org/TR/WebCryptoAPI/#Crypto-method-getRandomValues. - const MAX_LEN: usize = 65_536; - if dest.len() > MAX_LEN { - dest = &mut dest[..MAX_LEN]; - }; - - let _ = web_sys::window() - .ok_or(error::Unspecified)? - .crypto() - .map_err(|_| error::Unspecified)? - .get_random_values_with_u8_array(dest) - .map_err(|_| error::Unspecified)?; - - Ok(dest.len()) - } -} - -#[cfg(windows)] -mod sysrand_chunk { - use crate::{error, polyfill}; - - #[inline] - pub fn chunk(dest: &mut [u8]) -> Result { - use winapi::shared::wtypesbase::ULONG; - - assert!(core::mem::size_of::() >= core::mem::size_of::()); - let len = core::cmp::min(dest.len(), polyfill::usize_from_u32(ULONG::max_value())); - let result = unsafe { - winapi::um::ntsecapi::RtlGenRandom( - dest.as_mut_ptr() as *mut winapi::ctypes::c_void, - len as ULONG, - ) - }; - if result == 0 { - return Err(error::Unspecified); - } - - Ok(len) - } -} - -#[cfg(any( - target_os = "android", - target_os = "linux", - target_arch = "wasm32", - windows -))] -mod sysrand { - use super::sysrand_chunk::chunk; - use crate::error; - - pub fn fill(dest: &mut [u8]) -> Result<(), error::Unspecified> { - let mut read_len = 0; - while read_len < dest.len() { - let chunk_len = chunk(&mut dest[read_len..])?; - read_len += chunk_len; - } - Ok(()) - } -} - -// Keep the `cfg` conditions in sync with the conditions in lib.rs. -#[cfg(all( - any(target_os = "android", target_os = "linux"), - feature = "dev_urandom_fallback" -))] -mod sysrand_or_urandom { - use crate::error; - - enum Mechanism { - Sysrand, - DevURandom, - } - - #[inline] - pub fn fill(dest: &mut [u8]) -> Result<(), error::Unspecified> { - use once_cell::sync::Lazy; - static MECHANISM: Lazy = Lazy::new(|| { - let mut dummy = [0u8; 1]; - if super::sysrand_chunk::chunk(&mut dummy[..]).is_err() { - Mechanism::DevURandom - } else { - Mechanism::Sysrand - } - }); - - match *MECHANISM { - Mechanism::Sysrand => super::sysrand::fill(dest), - Mechanism::DevURandom => super::urandom::fill(dest), - } - } -} - -#[cfg(any( - all( - any(target_os = "android", target_os = "linux"), - feature = "dev_urandom_fallback" - ), - target_os = "dragonfly", - target_os = "freebsd", - target_os = "netbsd", - target_os = "openbsd", - target_os = "solaris", - target_os = "illumos" -))] -mod urandom { - use crate::error; - - #[cfg_attr(any(target_os = "android", target_os = "linux"), cold, inline(never))] - pub fn fill(dest: &mut [u8]) -> Result<(), error::Unspecified> { - extern crate std; - - use once_cell::sync::Lazy; - - static FILE: Lazy> = - Lazy::new(|| std::fs::File::open("/dev/urandom")); - - match *FILE { - Ok(ref file) => { - use std::io::Read; - (&*file).read_exact(dest).map_err(|_| error::Unspecified) - } - Err(_) => Err(error::Unspecified), - } - } -} - -#[cfg(any(target_os = "macos", target_os = "ios"))] -mod darwin { - use crate::{c, error}; - - pub fn fill(dest: &mut [u8]) -> Result<(), error::Unspecified> { - let r = unsafe { SecRandomCopyBytes(kSecRandomDefault, dest.len(), dest.as_mut_ptr()) }; - match r { - 0 => Ok(()), - _ => Err(error::Unspecified), - } - } - - // XXX: This is emulating an opaque type with a non-opaque type. TODO: Fix - // this when - // https://github.com/rust-lang/rfcs/pull/1861#issuecomment-274613536 is - // resolved. - #[repr(C)] - struct SecRandomRef([u8; 0]); - - #[link(name = "Security", kind = "framework")] - extern "C" { - static kSecRandomDefault: &'static SecRandomRef; - - // For now `rnd` must be `kSecRandomDefault`. - #[must_use] - fn SecRandomCopyBytes( - rnd: &'static SecRandomRef, - count: c::size_t, - bytes: *mut u8, - ) -> c::int; - } -} - -#[cfg(any(target_os = "fuchsia"))] -mod fuchsia { - use crate::error; - - pub fn fill(dest: &mut [u8]) -> Result<(), error::Unspecified> { - unsafe { - zx_cprng_draw(dest.as_mut_ptr(), dest.len()); - } - Ok(()) - } - - #[link(name = "zircon")] - extern "C" { - fn zx_cprng_draw(buffer: *mut u8, length: usize); - } -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/rsa/convert_nist_rsa_test_vectors.py temporalio-1.3.0/vendor/ring-0.16.20/src/rsa/convert_nist_rsa_test_vectors.py --- temporalio-1.3.0/vendor/ring-0.16.20/src/rsa/convert_nist_rsa_test_vectors.py 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/rsa/convert_nist_rsa_test_vectors.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,246 +0,0 @@ -#!/usr/bin/env python2 -# -# Copyright 2016 Dirkjan Ochtman. -# -# Permission to use, copy, modify, and/or distribute this software for any -# purpose with or without fee is hereby granted, provided that the above -# copyright notice and this permission notice appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -# SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -# OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -''' -Script to generate *ring* test file for RSA PKCS1 v1.5 signing test vectors -from the NIST FIPS 186-4 test vectors. Takes as single argument on the -command-line the path to the test vector file (tested with SigGen15_186-3.txt). - -Requires the cryptography library from pyca. -''' - -from cryptography.hazmat.backends import default_backend -from cryptography.hazmat.primitives import serialization, hashes -from cryptography.hazmat.primitives.asymmetric import rsa, padding -import hashlib -import sys, copy -import codecs - -DIGEST_OUTPUT_LENGTHS = { - 'SHA1': 80, - 'SHA256': 128, - 'SHA384': 192, - 'SHA512': 256 -} - -# Prints reasons for skipping tests -DEBUG = False - -def debug(str, flag): - if flag: - sys.stderr.write(str + "\n") - sys.stderr.flush() - -def decode_hex(s): - decoder = codecs.getdecoder("hex_codec") - return decoder(s)[0] - -# Some fields in the input files are encoded without a leading "0", but -# `decode_hex` requires every byte to be encoded with two hex digits. -def from_hex(hex): - return decode_hex(hex if len(hex) % 2 == 0 else "0" + hex) - -def to_hex(bytes): - return ''.join('{:02x}'.format(b) for b in bytes) - -# Some fields in the input files are encoded without a leading "0", but the -# *ring* test framework requires every byte to be encoded with two hex digits. -def reformat_hex(hex): - return to_hex(from_hex(hex)) - -def parse(fn, last_field): - '''Parse input test vector file, leaving out comments and empty lines, and - returns a list of self-contained test cases. Depends on the last_field - being the last value in each test case.''' - cases = [] - with open(fn) as f: - cur = {} - for ln in f: - if not ln.strip(): - continue - if ln[0] in {'#', '['}: - continue - name, val = ln.split('=', 1) - cur[name.strip()] = val.strip() - if name.strip() == last_field: - cases.append(cur) - cur = copy.copy(cur) - return cases - -def print_sign_test(case, n, e, d, padding_alg): - # Recover the prime factors and CRT numbers. - p, q = rsa.rsa_recover_prime_factors(n, e, d) - # cryptography returns p, q with p < q by default. *ring* requires - # p > q, so swap them here. - p, q = max(p, q), min(p, q) - dmp1 = rsa.rsa_crt_dmp1(d, p) - dmq1 = rsa.rsa_crt_dmq1(d, q) - iqmp = rsa.rsa_crt_iqmp(p, q) - - # Create a private key instance. - pub = rsa.RSAPublicNumbers(e, n) - - priv = rsa.RSAPrivateNumbers(p, q, d, dmp1, dmq1, iqmp, pub) - key = priv.private_key(default_backend()) - - msg = decode_hex(case['Msg']) - - # Recalculate and compare the signature to validate our processing. - if padding_alg == 'PKCS#1 1.5': - sig = key.sign(msg, padding.PKCS1v15(), - getattr(hashes, case['SHAAlg'])()) - hex_sig = to_hex(sig) - assert hex_sig == case['S'] - elif padding_alg == "PSS": - # PSS is randomised, can't recompute this way - pass - else: - print("Invalid padding algorithm") - quit() - - # Serialize the private key in DER format. - der = key.private_bytes(serialization.Encoding.DER, - serialization.PrivateFormat.TraditionalOpenSSL, - serialization.NoEncryption()) - - # Print the test case data in the format used by *ring* test files. - print('Digest = %s' % case['SHAAlg']) - print('Key = %s' % to_hex(der)) - print('Msg = %s' % reformat_hex(case['Msg'])) - - if padding_alg == "PSS": - print('Salt = %s' % reformat_hex(case['SaltVal'])) - - print('Sig = %s' % reformat_hex(case['S'])) - print('Result = Pass') - print('') - -def print_verify_test(case, n, e): - # Create a private key instance. - pub = rsa.RSAPublicNumbers(e, n) - key = pub.public_key(default_backend()) - - der = key.public_bytes(serialization.Encoding.DER, - serialization.PublicFormat.PKCS1) - - # Print the test case data in the format used by *ring* test files. - print('Digest = %s' % case['SHAAlg']) - print('Key = %s' % to_hex(der)) - print('Msg = %s' % reformat_hex(case['Msg'])) - print('Sig = %s' % reformat_hex(case['S'])) - print('Result = %s' % case['Result']) - print('') - -def main(fn, test_type, padding_alg): - input_file_digest = hashlib.sha384(open(fn, 'rb').read()).hexdigest() - # File header - print("# RSA %(padding_alg)s Test Vectors for FIPS 186-4 from %(fn)s in" % \ - { "fn": fn, "padding_alg": padding_alg }) - print("# http://csrc.nist.gov/groups/STM/cavp/documents/dss/186-3rsatestvectors.zip") - print("# accessible from") - print("# http://csrc.nist.gov/groups/STM/cavp/digital-signatures.html#test-vectors") - print("# with SHA-384 digest %s" % (input_file_digest)) - print("# filtered and reformatted using %s." % __file__) - print("#") - print("# Digest = SHAAlg.") - if test_type == "verify": - print("# Key is (n, e) encoded in an ASN.1 (DER) sequence.") - elif test_type == "sign": - print("# Key is an ASN.1 (DER) RSAPrivateKey.") - else: - print("Invalid test_type: %s" % test_type) - quit() - - print("# Sig = S.") - print() - - num_cases = 0 - - # Each test type has a different field as the last entry per case - # For verify tests,PKCS "Result" is always the last field. - # Otherwise, for signing tests, it is dependent on the padding used. - if test_type == "verify": - last_field = "Result" - else: - if padding_alg == "PSS": - last_field = "SaltVal" - else: - last_field = "S" - - for case in parse(fn, last_field): - if case['SHAAlg'] == 'SHA224': - # SHA224 not supported in *ring*. - debug("Skipping due to use of SHA224", DEBUG) - continue - - if padding_alg == "PSS": - if case['SHAAlg'] == 'SHA1': - # SHA-1 with PSS not supported in *ring*. - debug("Skipping due to use of SHA1 and PSS.", DEBUG) - continue - - # *ring* only supports PSS where the salt length is equal to the - # output length of the hash algorithm. - if len(case['SaltVal']) * 2 != DIGEST_OUTPUT_LENGTHS[case['SHAAlg']]: - debug("Skipping due to unsupported salt length.", DEBUG) - continue - - # Read private key components. - n = int(case['n'], 16) - e = int(case['e'], 16) - d = int(case['d'], 16) - - if test_type == 'sign': - if n.bit_length() // 8 < 2048 // 8: - debug("Skipping due to modulus length (too small).", DEBUG) - continue - if n.bit_length() > 4096: - debug("Skipping due to modulus length (too large).", DEBUG) - continue - - print_sign_test(case, n, e, d, padding_alg) - else: - legacy = case['SHAAlg'] in ["SHA1", "SHA256", "SHA512"] - if (n.bit_length() // 8 < 2048 // 8 and not legacy) or n.bit_length() // 8 < 1024 // 8: - debug("Skipping due to modulus length (too small).", DEBUG) - continue - print_verify_test(case, n, e) - - num_cases += 1 - - debug("%d test cases output." % num_cases, True) - -if __name__ == '__main__': - if len(sys.argv) != 2: - print("Usage:\n python %s " % sys.argv[0]) - else: - fn = sys.argv[1] - if 'PSS' in fn: - pad_alg = 'PSS' - elif '15' in fn: - pad_alg = 'PKCS#1 1.5' - else: - print("Could not determine padding algorithm,") - quit() - - if 'Gen' in fn: - test_type = 'sign' - elif 'Ver' in fn: - test_type = 'verify' - else: - print("Could not determine test type.") - quit() - - main(sys.argv[1], test_type, pad_alg) diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/rsa/padding.rs temporalio-1.3.0/vendor/ring-0.16.20/src/rsa/padding.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/rsa/padding.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/rsa/padding.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,601 +0,0 @@ -// Copyright 2015-2016 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -use super::PUBLIC_KEY_PUBLIC_MODULUS_MAX_LEN; -use crate::{bits, digest, error, io::der}; - -#[cfg(feature = "alloc")] -use crate::rand; - -/// Common features of both RSA padding encoding and RSA padding verification. -pub trait Padding: 'static + Sync + crate::sealed::Sealed + core::fmt::Debug { - // The digest algorithm used for digesting the message (and maybe for - // other things). - fn digest_alg(&self) -> &'static digest::Algorithm; -} - -/// An RSA signature encoding as described in [RFC 3447 Section 8]. -/// -/// [RFC 3447 Section 8]: https://tools.ietf.org/html/rfc3447#section-8 -#[cfg(feature = "alloc")] -pub trait RsaEncoding: Padding { - #[doc(hidden)] - fn encode( - &self, - m_hash: &digest::Digest, - m_out: &mut [u8], - mod_bits: bits::BitLength, - rng: &dyn rand::SecureRandom, - ) -> Result<(), error::Unspecified>; -} - -/// Verification of an RSA signature encoding as described in -/// [RFC 3447 Section 8]. -/// -/// [RFC 3447 Section 8]: https://tools.ietf.org/html/rfc3447#section-8 -pub trait Verification: Padding { - fn verify( - &self, - m_hash: &digest::Digest, - m: &mut untrusted::Reader, - mod_bits: bits::BitLength, - ) -> Result<(), error::Unspecified>; -} - -/// PKCS#1 1.5 padding as described in [RFC 3447 Section 8.2]. -/// -/// See "`RSA_PSS_*` Details\" in `ring::signature`'s module-level -/// documentation for more details. -/// -/// [RFC 3447 Section 8.2]: https://tools.ietf.org/html/rfc3447#section-8.2 -#[derive(Debug)] -pub struct PKCS1 { - digest_alg: &'static digest::Algorithm, - digestinfo_prefix: &'static [u8], -} - -impl crate::sealed::Sealed for PKCS1 {} - -impl Padding for PKCS1 { - fn digest_alg(&self) -> &'static digest::Algorithm { - self.digest_alg - } -} - -#[cfg(feature = "alloc")] -impl RsaEncoding for PKCS1 { - fn encode( - &self, - m_hash: &digest::Digest, - m_out: &mut [u8], - _mod_bits: bits::BitLength, - _rng: &dyn rand::SecureRandom, - ) -> Result<(), error::Unspecified> { - pkcs1_encode(&self, m_hash, m_out); - Ok(()) - } -} - -impl Verification for PKCS1 { - fn verify( - &self, - m_hash: &digest::Digest, - m: &mut untrusted::Reader, - mod_bits: bits::BitLength, - ) -> Result<(), error::Unspecified> { - // `mod_bits.as_usize_bytes_rounded_up() <= - // PUBLIC_KEY_PUBLIC_MODULUS_MAX_LEN` is ensured by `verify_rsa_()`. - let mut calculated = [0u8; PUBLIC_KEY_PUBLIC_MODULUS_MAX_LEN]; - let calculated = &mut calculated[..mod_bits.as_usize_bytes_rounded_up()]; - pkcs1_encode(&self, m_hash, calculated); - if m.read_bytes_to_end() != *calculated { - return Err(error::Unspecified); - } - Ok(()) - } -} - -// Implement padding procedure per EMSA-PKCS1-v1_5, -// https://tools.ietf.org/html/rfc3447#section-9.2. This is used by both -// verification and signing so it needs to be able to handle moduli of the -// minimum and maximum sizes for both operations. -fn pkcs1_encode(pkcs1: &PKCS1, m_hash: &digest::Digest, m_out: &mut [u8]) { - let em = m_out; - - let digest_len = pkcs1.digestinfo_prefix.len() + pkcs1.digest_alg.output_len; - - // The specification requires at least 8 bytes of padding. Since we - // disallow keys smaller than 1024 bits, this should always be true. - assert!(em.len() >= digest_len + 11); - let pad_len = em.len() - digest_len - 3; - em[0] = 0; - em[1] = 1; - for i in 0..pad_len { - em[2 + i] = 0xff; - } - em[2 + pad_len] = 0; - - let (digest_prefix, digest_dst) = em[3 + pad_len..].split_at_mut(pkcs1.digestinfo_prefix.len()); - digest_prefix.copy_from_slice(pkcs1.digestinfo_prefix); - digest_dst.copy_from_slice(m_hash.as_ref()); -} - -macro_rules! rsa_pkcs1_padding { - ( $PADDING_ALGORITHM:ident, $digest_alg:expr, $digestinfo_prefix:expr, - $doc_str:expr ) => { - #[doc=$doc_str] - pub static $PADDING_ALGORITHM: PKCS1 = PKCS1 { - digest_alg: $digest_alg, - digestinfo_prefix: $digestinfo_prefix, - }; - }; -} - -rsa_pkcs1_padding!( - RSA_PKCS1_SHA1_FOR_LEGACY_USE_ONLY, - &digest::SHA1_FOR_LEGACY_USE_ONLY, - &SHA1_PKCS1_DIGESTINFO_PREFIX, - "PKCS#1 1.5 padding using SHA-1 for RSA signatures." -); -rsa_pkcs1_padding!( - RSA_PKCS1_SHA256, - &digest::SHA256, - &SHA256_PKCS1_DIGESTINFO_PREFIX, - "PKCS#1 1.5 padding using SHA-256 for RSA signatures." -); -rsa_pkcs1_padding!( - RSA_PKCS1_SHA384, - &digest::SHA384, - &SHA384_PKCS1_DIGESTINFO_PREFIX, - "PKCS#1 1.5 padding using SHA-384 for RSA signatures." -); -rsa_pkcs1_padding!( - RSA_PKCS1_SHA512, - &digest::SHA512, - &SHA512_PKCS1_DIGESTINFO_PREFIX, - "PKCS#1 1.5 padding using SHA-512 for RSA signatures." -); - -macro_rules! pkcs1_digestinfo_prefix { - ( $name:ident, $digest_len:expr, $digest_oid_len:expr, - [ $( $digest_oid:expr ),* ] ) => { - static $name: [u8; 2 + 8 + $digest_oid_len] = [ - der::Tag::Sequence as u8, 8 + $digest_oid_len + $digest_len, - der::Tag::Sequence as u8, 2 + $digest_oid_len + 2, - der::Tag::OID as u8, $digest_oid_len, $( $digest_oid ),*, - der::Tag::Null as u8, 0, - der::Tag::OctetString as u8, $digest_len, - ]; - } -} - -pkcs1_digestinfo_prefix!( - SHA1_PKCS1_DIGESTINFO_PREFIX, - 20, - 5, - [0x2b, 0x0e, 0x03, 0x02, 0x1a] -); - -pkcs1_digestinfo_prefix!( - SHA256_PKCS1_DIGESTINFO_PREFIX, - 32, - 9, - [0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01] -); - -pkcs1_digestinfo_prefix!( - SHA384_PKCS1_DIGESTINFO_PREFIX, - 48, - 9, - [0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x02] -); - -pkcs1_digestinfo_prefix!( - SHA512_PKCS1_DIGESTINFO_PREFIX, - 64, - 9, - [0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x03] -); - -/// RSA PSS padding as described in [RFC 3447 Section 8.1]. -/// -/// See "`RSA_PSS_*` Details\" in `ring::signature`'s module-level -/// documentation for more details. -/// -/// [RFC 3447 Section 8.1]: https://tools.ietf.org/html/rfc3447#section-8.1 -#[derive(Debug)] -pub struct PSS { - digest_alg: &'static digest::Algorithm, -} - -impl crate::sealed::Sealed for PSS {} - -// Maximum supported length of the salt in bytes. -// In practice, this is constrained by the maximum digest length. -const MAX_SALT_LEN: usize = digest::MAX_OUTPUT_LEN; - -impl Padding for PSS { - fn digest_alg(&self) -> &'static digest::Algorithm { - self.digest_alg - } -} - -impl RsaEncoding for PSS { - // Implement padding procedure per EMSA-PSS, - // https://tools.ietf.org/html/rfc3447#section-9.1. - fn encode( - &self, - m_hash: &digest::Digest, - m_out: &mut [u8], - mod_bits: bits::BitLength, - rng: &dyn rand::SecureRandom, - ) -> Result<(), error::Unspecified> { - let metrics = PSSMetrics::new(self.digest_alg, mod_bits)?; - - // The `m_out` this function fills is the big-endian-encoded value of `m` - // from the specification, padded to `k` bytes, where `k` is the length - // in bytes of the public modulus. The spec says "Note that emLen will - // be one less than k if modBits - 1 is divisible by 8 and equal to k - // otherwise." In other words we might need to prefix `em` with a - // leading zero byte to form a correct value of `m`. - let em = if metrics.top_byte_mask == 0xff { - m_out[0] = 0; - &mut m_out[1..] - } else { - m_out - }; - assert_eq!(em.len(), metrics.em_len); - - // Steps 1 and 2 are done by the caller to produce `m_hash`. - - // Step 3 is done by `PSSMetrics::new()` above. - - // Step 4. - let mut salt = [0u8; MAX_SALT_LEN]; - let salt = &mut salt[..metrics.s_len]; - rng.fill(salt)?; - - // Step 5 and 6. - let h_hash = pss_digest(self.digest_alg, m_hash, salt); - - // Re-order steps 7, 8, 9 and 10 so that we first output the db mask - // into `em`, and then XOR the value of db. - - // Step 9. First output the mask into the out buffer. - let (mut masked_db, digest_terminator) = em.split_at_mut(metrics.db_len); - mgf1(self.digest_alg, h_hash.as_ref(), &mut masked_db)?; - - { - // Steps 7. - let masked_db = masked_db.iter_mut(); - // `PS` is all zero bytes, so skipping `ps_len` bytes is equivalent - // to XORing `PS` onto `db`. - let mut masked_db = masked_db.skip(metrics.ps_len); - - // Step 8. - *(masked_db.next().ok_or(error::Unspecified)?) ^= 0x01; - - // Step 10. - for (masked_db_b, salt_b) in masked_db.zip(salt) { - *masked_db_b ^= *salt_b; - } - } - - // Step 11. - masked_db[0] &= metrics.top_byte_mask; - - // Step 12. - digest_terminator[..metrics.h_len].copy_from_slice(h_hash.as_ref()); - digest_terminator[metrics.h_len] = 0xbc; - - Ok(()) - } -} - -impl Verification for PSS { - // RSASSA-PSS-VERIFY from https://tools.ietf.org/html/rfc3447#section-8.1.2 - // where steps 1, 2(a), and 2(b) have been done for us. - fn verify( - &self, - m_hash: &digest::Digest, - m: &mut untrusted::Reader, - mod_bits: bits::BitLength, - ) -> Result<(), error::Unspecified> { - let metrics = PSSMetrics::new(self.digest_alg, mod_bits)?; - - // RSASSA-PSS-VERIFY Step 2(c). The `m` this function is given is the - // big-endian-encoded value of `m` from the specification, padded to - // `k` bytes, where `k` is the length in bytes of the public modulus. - // The spec. says "Note that emLen will be one less than k if - // modBits - 1 is divisible by 8 and equal to k otherwise," where `k` - // is the length in octets of the RSA public modulus `n`. In other - // words, `em` might have an extra leading zero byte that we need to - // strip before we start the PSS decoding steps which is an artifact of - // the `Verification` interface. - if metrics.top_byte_mask == 0xff { - if m.read_byte()? != 0 { - return Err(error::Unspecified); - } - }; - let em = m; - - // The rest of this function is EMSA-PSS-VERIFY from - // https://tools.ietf.org/html/rfc3447#section-9.1.2. - - // Steps 1 and 2 are done by the caller to produce `m_hash`. - - // Step 3 is done by `PSSMetrics::new()` above. - - // Step 5, out of order. - let masked_db = em.read_bytes(metrics.db_len)?; - let h_hash = em.read_bytes(metrics.h_len)?; - - // Step 4. - if em.read_byte()? != 0xbc { - return Err(error::Unspecified); - } - - // Step 7. - let mut db = [0u8; PUBLIC_KEY_PUBLIC_MODULUS_MAX_LEN]; - let db = &mut db[..metrics.db_len]; - - mgf1(self.digest_alg, h_hash.as_slice_less_safe(), db)?; - - masked_db.read_all(error::Unspecified, |masked_bytes| { - // Step 6. Check the top bits of first byte are zero. - let b = masked_bytes.read_byte()?; - if b & !metrics.top_byte_mask != 0 { - return Err(error::Unspecified); - } - db[0] ^= b; - - // Step 8. - for i in 1..db.len() { - db[i] ^= masked_bytes.read_byte()?; - } - Ok(()) - })?; - - // Step 9. - db[0] &= metrics.top_byte_mask; - - // Step 10. - let ps_len = metrics.ps_len; - for i in 0..ps_len { - if db[i] != 0 { - return Err(error::Unspecified); - } - } - if db[metrics.ps_len] != 1 { - return Err(error::Unspecified); - } - - // Step 11. - let salt = &db[(db.len() - metrics.s_len)..]; - - // Step 12 and 13. - let h_prime = pss_digest(self.digest_alg, m_hash, salt); - - // Step 14. - if h_hash != *h_prime.as_ref() { - return Err(error::Unspecified); - } - - Ok(()) - } -} - -struct PSSMetrics { - #[cfg_attr(not(feature = "alloc"), allow(dead_code))] - em_len: usize, - db_len: usize, - ps_len: usize, - s_len: usize, - h_len: usize, - top_byte_mask: u8, -} - -impl PSSMetrics { - fn new( - digest_alg: &'static digest::Algorithm, - mod_bits: bits::BitLength, - ) -> Result { - let em_bits = mod_bits.try_sub_1()?; - let em_len = em_bits.as_usize_bytes_rounded_up(); - let leading_zero_bits = (8 * em_len) - em_bits.as_usize_bits(); - debug_assert!(leading_zero_bits < 8); - let top_byte_mask = 0xffu8 >> leading_zero_bits; - - let h_len = digest_alg.output_len; - - // We require the salt length to be equal to the digest length. - let s_len = h_len; - - // Step 3 of both `EMSA-PSS-ENCODE` is `EMSA-PSS-VERIFY` requires that - // we reject inputs where "emLen < hLen + sLen + 2". The definition of - // `emBits` in RFC 3447 Sections 9.1.1 and 9.1.2 says `emBits` must be - // "at least 8hLen + 8sLen + 9". Since 9 bits requires two bytes, these - // two conditions are equivalent. 9 bits are required as the 0x01 - // before the salt requires 1 bit and the 0xbc after the digest - // requires 8 bits. - let db_len = em_len.checked_sub(1 + s_len).ok_or(error::Unspecified)?; - let ps_len = db_len.checked_sub(h_len + 1).ok_or(error::Unspecified)?; - - debug_assert!(em_bits.as_usize_bits() >= (8 * h_len) + (8 * s_len) + 9); - - Ok(PSSMetrics { - em_len, - db_len, - ps_len, - s_len, - h_len, - top_byte_mask, - }) - } -} - -// Mask-generating function MGF1 as described in -// https://tools.ietf.org/html/rfc3447#appendix-B.2.1. -fn mgf1( - digest_alg: &'static digest::Algorithm, - seed: &[u8], - mask: &mut [u8], -) -> Result<(), error::Unspecified> { - let digest_len = digest_alg.output_len; - - // Maximum counter value is the value of (mask_len / digest_len) rounded up. - let ctr_max = (mask.len() - 1) / digest_len; - assert!(ctr_max <= u32::max_value() as usize); - for (i, mask_chunk) in mask.chunks_mut(digest_len).enumerate() { - let mut ctx = digest::Context::new(digest_alg); - ctx.update(seed); - ctx.update(&u32::to_be_bytes(i as u32)); - let digest = ctx.finish(); - let mask_chunk_len = mask_chunk.len(); - mask_chunk.copy_from_slice(&digest.as_ref()[..mask_chunk_len]); - } - - Ok(()) -} - -fn pss_digest( - digest_alg: &'static digest::Algorithm, - m_hash: &digest::Digest, - salt: &[u8], -) -> digest::Digest { - // Fixed prefix. - const PREFIX_ZEROS: [u8; 8] = [0u8; 8]; - - // Encoding step 5 and 6, Verification step 12 and 13. - let mut ctx = digest::Context::new(digest_alg); - ctx.update(&PREFIX_ZEROS); - ctx.update(m_hash.as_ref()); - ctx.update(salt); - ctx.finish() -} - -macro_rules! rsa_pss_padding { - ( $PADDING_ALGORITHM:ident, $digest_alg:expr, $doc_str:expr ) => { - #[doc=$doc_str] - pub static $PADDING_ALGORITHM: PSS = PSS { - digest_alg: $digest_alg, - }; - }; -} - -rsa_pss_padding!( - RSA_PSS_SHA256, - &digest::SHA256, - "RSA PSS padding using SHA-256 for RSA signatures.\n\nSee - \"`RSA_PSS_*` Details\" in `ring::signature`'s module-level - documentation for more details." -); -rsa_pss_padding!( - RSA_PSS_SHA384, - &digest::SHA384, - "RSA PSS padding using SHA-384 for RSA signatures.\n\nSee - \"`RSA_PSS_*` Details\" in `ring::signature`'s module-level - documentation for more details." -); -rsa_pss_padding!( - RSA_PSS_SHA512, - &digest::SHA512, - "RSA PSS padding using SHA-512 for RSA signatures.\n\nSee - \"`RSA_PSS_*` Details\" in `ring::signature`'s module-level - documentation for more details." -); - -#[cfg(test)] -mod test { - use super::*; - use crate::{digest, error, test}; - use alloc::vec; - - #[test] - fn test_pss_padding_verify() { - test::run( - test_file!("rsa_pss_padding_tests.txt"), - |section, test_case| { - assert_eq!(section, ""); - - let digest_name = test_case.consume_string("Digest"); - let alg = match digest_name.as_ref() { - "SHA256" => &RSA_PSS_SHA256, - "SHA384" => &RSA_PSS_SHA384, - "SHA512" => &RSA_PSS_SHA512, - _ => panic!("Unsupported digest: {}", digest_name), - }; - - let msg = test_case.consume_bytes("Msg"); - let msg = untrusted::Input::from(&msg); - let m_hash = digest::digest(alg.digest_alg(), msg.as_slice_less_safe()); - - let encoded = test_case.consume_bytes("EM"); - let encoded = untrusted::Input::from(&encoded); - - // Salt is recomputed in verification algorithm. - let _ = test_case.consume_bytes("Salt"); - - let bit_len = test_case.consume_usize_bits("Len"); - let is_valid = test_case.consume_string("Result") == "P"; - - let actual_result = - encoded.read_all(error::Unspecified, |m| alg.verify(&m_hash, m, bit_len)); - assert_eq!(actual_result.is_ok(), is_valid); - - Ok(()) - }, - ); - } - - // Tests PSS encoding for various public modulus lengths. - #[cfg(feature = "alloc")] - #[test] - fn test_pss_padding_encode() { - test::run( - test_file!("rsa_pss_padding_tests.txt"), - |section, test_case| { - assert_eq!(section, ""); - - let digest_name = test_case.consume_string("Digest"); - let alg = match digest_name.as_ref() { - "SHA256" => &RSA_PSS_SHA256, - "SHA384" => &RSA_PSS_SHA384, - "SHA512" => &RSA_PSS_SHA512, - _ => panic!("Unsupported digest: {}", digest_name), - }; - - let msg = test_case.consume_bytes("Msg"); - let salt = test_case.consume_bytes("Salt"); - let encoded = test_case.consume_bytes("EM"); - let bit_len = test_case.consume_usize_bits("Len"); - let expected_result = test_case.consume_string("Result"); - - // Only test the valid outputs - if expected_result != "P" { - return Ok(()); - } - - let rng = test::rand::FixedSliceRandom { bytes: &salt }; - - let mut m_out = vec![0u8; bit_len.as_usize_bytes_rounded_up()]; - let digest = digest::digest(alg.digest_alg(), &msg); - alg.encode(&digest, &mut m_out, bit_len, &rng).unwrap(); - assert_eq!(m_out, encoded); - - Ok(()) - }, - ); - } -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/rsa/rsa_pss_padding_tests.txt temporalio-1.3.0/vendor/ring-0.16.20/src/rsa/rsa_pss_padding_tests.txt --- temporalio-1.3.0/vendor/ring-0.16.20/src/rsa/rsa_pss_padding_tests.txt 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/rsa/rsa_pss_padding_tests.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,745 +0,0 @@ -# Test vectors for RSA-PSS padding verification -# Including multiple modulus lengths and failing verification cases. -# -# Digest = SHAAlg. -# Len gives the public modulus length in bits. -# -# The salt is the fixed byte string 0xf0 repeated to be the same length as the -# hash digest. -# - -Digest = SHA256 -Msg = "" -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 23e55cbec753a80ab764cb3f9fa29b05a24f2f0b388a5e1082babf37f7d7f60c566e4452dd03fe9153f009aafc0cda10a01cf9f72a8754f618fc0b67de8b2a0cd2ba9e6c241267dcee3b04f26f23fbfa3ace11e8f1a6ca6627efe30ad1973a42983a5e29c1646ebc3a50dd34e5f4b7a28a190cd8998d55ace1f46f8c23adf039ce5b9f0eea14b2d158076d194de8d15ac28d8b907002252e224e53cf3f6d4eda63f761395a9178d0d0c3d34e4db38d4574818ee596ac34bbcdf861f13ef86b2018199c2557363663979c3c92aee2f83567d393efd19ce1a51e5c62f580aa5d330868d2907d2999dd1a1ec37bb025f47b92f505dc9315ef35d57fafa7abb11fbc -Len = 2048 -Result = P - -Digest = SHA384 -Msg = "" -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 137a60205de7c9f40c29d65a035bd96da8ec95a909f129a8f7c0be2b3ecf539f62667e51db71b8685da2cb3a727651e8fa399715262c9a4ab88bff1d8514ee299a196c75a09fbfd6b069bbc5c2d1fce2107e68fa4605086160b803a13d221d47e68c8dfd94e6cf54175588c363f5ba311a77c056c45d90fc9a60ba36ac8f07e319baf84003d2af51d313d6209aaa5ae8a3308cacaa35577a01742ea42e5cdcd65de51efc2d1947879c42e9a3dbf5986063c821f99e5ba6daead8d6e0c50f0754fbc5122978334914d12303ab1313a9c29889474c5b1dea85c5ec55cc2d5ad5d6776b2d234b96e2e80ed049c3cfc645967f5d5efb1d5c707585e8fa8bbb5653bc -Len = 2048 -Result = P - -Digest = SHA512 -Msg = "" -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 485255700ee4e6964ba0a867b650f5d3cac3380b59ec58c72a5d44156f7273f7ccf88edb48a3c7f6c07dfd03b9f8a907f0e7d98e38ee174edf9fe79159cddebafe1cbd586fdaf192d347d56867b3a3eb756ee3c51afbb9f4b1ccb00059abcfa51ef3facd58af14362db77c6c8bb387a5228d105388ff31b21c0b30d90e44949d4ddd6eebe14dc6dd94110e791abed1251eb798e7b559a7d37f9b3e47b83b1c44a9ecf9c591d6cfd21b5f3d9639174289c677b567a24c703f1757bee874c3405a2413f759483bf8b4d9956f463798028cfc5695d8cee89506eb5b4a61cd63cbb5b7738cfee0edd94be6ffa6f7c57f258f816015e9f20daeb061150e698596c3bc -Len = 2048 -Result = P - -Digest = SHA256 -Msg = 546869732069732061206c6f6e676572207465737420737472696e672e -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 0b5546c0e8bf9966ac52887133aa89150a5fe745492fe94790b6e8c06b5f091c147bf46a88b96b4e1ff39b6d8ddd999cc7271718763df7e885e53817d0d607f53aac52eec202d7183c04caa17f975c8eae3d78ac3da5c881b864ed438adaae827036756cd9df4f8fa24ef85aec221b35740c65e252880422ebf7ddf3e52b87346f8d8ed92f459fb76e866e8bf631a5b7e6d86968e5f7f64d499db7d0143ad40770c158039a3ed1205ba7ce959e837a4c23249cfec9ec56f02602c6d98cb844514920b1123c69f35cc6fda327b632218e575eafff76b23cb0b7e5e3a1b6ac6b84d00ae842b10f54bcb018216001f446f680e7167b3553706c1641d9b8ef5253bc -Len = 2048 -Result = P - -Digest = SHA384 -Msg = 546869732069732061206c6f6e676572207465737420737472696e672e -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 65b562e2aa341868b4aa78ff86c220330e7159bb0871f8939aed509b4e5bcb2c4ecb2cbf4c85f8a11cb3f1c9efa748225f0d944c983dd86e6faadcf3cf7cff781653300d3f826cb1dfde256c056fff1772dbbe0715c2c85615a47d07a944449f4cad63dc06cf1b0a0ed799bdccd93078888e39beacde047625fd9cfe74c2098c701ff5e6436d2d845883cb8cf8aa134a57023226bbfccbe078e356eac19b34204ef123291bc8cdd39177be702e5fa6ad3f759155cee55dc6fbdc10472ffe5d10d619a15ab22f369c49621e5966429f9f6fc1a02d20dab5c900706608a19028d4a283939d2d16a495ae184bda4fdb488229e0f64334c15daf197dbc6dd213a0bc -Len = 2048 -Result = P - -Digest = SHA512 -Msg = 546869732069732061206c6f6e676572207465737420737472696e672e -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 563a1aafa96215f6ff698694f59fe97523399f214683f450f3024e6bb2523c7407ccd7024284522b957dc42aff3ef2a5738daaa88b38092880fc42b98ecdd3e09677db0c189c105f0777981d7620c0fb014c57a3e080cb5afc9ad4c0e47a0e46157ef96b01453a9aa7c99ef80976d425ccafcce990425969a30b5ce55b3fe3eafa595c1a7b272a9c427e73a4a32d392d6384bf33d4137d3a95c6199c692e66af77d56fe6411728c1e47ef2c70610305a1258807f6053d7b06259dba586ea40a6320af4d65c4ab46dd1277a6995eb127f0aaa207dc3ee0d4c65d1224ac96da10d15ba220d096e8cc25c5f0ae0886dd76e0f3d08efb9c5fc0190d81f12261c5bbc -Len = 2048 -Result = P - -Digest = SHA256 -Msg = "" -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 0023e55cbec753a80ab764cb3f9fa29b05a24f2f0b388a5e1082babf37f7d7f60c566e4452dd03fe9153f009aafc0cda10a01cf9f72a8754f618fc0b67de8b2a0cd2ba9e6c241267dcee3b04f26f23fbfa3ace11e8f1a6ca6627efe30ad1973a42983a5e29c1646ebc3a50dd34e5f4b7a28a190cd8998d55ace1f46f8c23adf039ce5b9f0eea14b2d158076d194de8d15ac28d8b907002252e224e53cf3f6d4eda63f761395a9178d0d0c3d34e4db38d4574818ee596ac34bbcdf861f13ef86b2018199c2557363663979c3c92aee2f83567d393efd19ce1a51e5c62f580aa5d330868d2907d2999dd1a1ec37bb025f47b92f505dc9315ef35d57fafa7abb11fbc -Len = 2049 -Result = P - -Digest = SHA384 -Msg = "" -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 00937a60205de7c9f40c29d65a035bd96da8ec95a909f129a8f7c0be2b3ecf539f62667e51db71b8685da2cb3a727651e8fa399715262c9a4ab88bff1d8514ee299a196c75a09fbfd6b069bbc5c2d1fce2107e68fa4605086160b803a13d221d47e68c8dfd94e6cf54175588c363f5ba311a77c056c45d90fc9a60ba36ac8f07e319baf84003d2af51d313d6209aaa5ae8a3308cacaa35577a01742ea42e5cdcd65de51efc2d1947879c42e9a3dbf5986063c821f99e5ba6daead8d6e0c50f0754fbc5122978334914d12303ab1313a9c29889474c5b1dea85c5ec55cc2d5ad5d6776b2d234b96e2e80ed049c3cfc645967f5d5efb1d5c707585e8fa8bbb5653bc -Len = 2049 -Result = P - -Digest = SHA512 -Msg = "" -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 00485255700ee4e6964ba0a867b650f5d3cac3380b59ec58c72a5d44156f7273f7ccf88edb48a3c7f6c07dfd03b9f8a907f0e7d98e38ee174edf9fe79159cddebafe1cbd586fdaf192d347d56867b3a3eb756ee3c51afbb9f4b1ccb00059abcfa51ef3facd58af14362db77c6c8bb387a5228d105388ff31b21c0b30d90e44949d4ddd6eebe14dc6dd94110e791abed1251eb798e7b559a7d37f9b3e47b83b1c44a9ecf9c591d6cfd21b5f3d9639174289c677b567a24c703f1757bee874c3405a2413f759483bf8b4d9956f463798028cfc5695d8cee89506eb5b4a61cd63cbb5b7738cfee0edd94be6ffa6f7c57f258f816015e9f20daeb061150e698596c3bc -Len = 2049 -Result = P - -Digest = SHA256 -Msg = 546869732069732061206c6f6e676572207465737420737472696e672e -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 008b5546c0e8bf9966ac52887133aa89150a5fe745492fe94790b6e8c06b5f091c147bf46a88b96b4e1ff39b6d8ddd999cc7271718763df7e885e53817d0d607f53aac52eec202d7183c04caa17f975c8eae3d78ac3da5c881b864ed438adaae827036756cd9df4f8fa24ef85aec221b35740c65e252880422ebf7ddf3e52b87346f8d8ed92f459fb76e866e8bf631a5b7e6d86968e5f7f64d499db7d0143ad40770c158039a3ed1205ba7ce959e837a4c23249cfec9ec56f02602c6d98cb844514920b1123c69f35cc6fda327b632218e575eafff76b23cb0b7e5e3a1b6ac6b84d00ae842b10f54bcb018216001f446f680e7167b3553706c1641d9b8ef5253bc -Len = 2049 -Result = P - -Digest = SHA384 -Msg = 546869732069732061206c6f6e676572207465737420737472696e672e -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 00e5b562e2aa341868b4aa78ff86c220330e7159bb0871f8939aed509b4e5bcb2c4ecb2cbf4c85f8a11cb3f1c9efa748225f0d944c983dd86e6faadcf3cf7cff781653300d3f826cb1dfde256c056fff1772dbbe0715c2c85615a47d07a944449f4cad63dc06cf1b0a0ed799bdccd93078888e39beacde047625fd9cfe74c2098c701ff5e6436d2d845883cb8cf8aa134a57023226bbfccbe078e356eac19b34204ef123291bc8cdd39177be702e5fa6ad3f759155cee55dc6fbdc10472ffe5d10d619a15ab22f369c49621e5966429f9f6fc1a02d20dab5c900706608a19028d4a283939d2d16a495ae184bda4fdb488229e0f64334c15daf197dbc6dd213a0bc -Len = 2049 -Result = P - -Digest = SHA512 -Msg = 546869732069732061206c6f6e676572207465737420737472696e672e -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 00d63a1aafa96215f6ff698694f59fe97523399f214683f450f3024e6bb2523c7407ccd7024284522b957dc42aff3ef2a5738daaa88b38092880fc42b98ecdd3e09677db0c189c105f0777981d7620c0fb014c57a3e080cb5afc9ad4c0e47a0e46157ef96b01453a9aa7c99ef80976d425ccafcce990425969a30b5ce55b3fe3eafa595c1a7b272a9c427e73a4a32d392d6384bf33d4137d3a95c6199c692e66af77d56fe6411728c1e47ef2c70610305a1258807f6053d7b06259dba586ea40a6320af4d65c4ab46dd1277a6995eb127f0aaa207dc3ee0d4c65d1224ac96da10d15ba220d096e8cc25c5f0ae0886dd76e0f3d08efb9c5fc0190d81f12261c5bbc -Len = 2049 -Result = P - -Digest = SHA256 -Msg = "" -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 23e55cbec753a80ab764cb3f9fa29b05a24f2f0b388a5e1082babf37f7d7f60c566e4452dd03fe9153f009aafc0cda10a01cf9f72a8754f618fc0b67de8b2a0cd2ba9e6c241267dcee3b04f26f23fbfa3ace11e8f1a6ca6627efe30ad1973a42983a5e29c1646ebc3a50dd34e5f4b7a28a190cd8998d55ace1f46f8c23adf039ce5b9f0eea14b2d158076d194de8d15ac28d8b907002252e224e53cf3f6d4eda63f761395a9178d0d0c3d34e4db38d4574818ee596ac34bbcdf861f13ef86ad118199c2557363663979c3c92aee2f83567d393efd19ce1a51e5c62f580aa5d73330868d2907d2999dd1a1ec37bb025f47b92f505dc9315ef35d57fafa7abb11fbc -Len = 2055 -Result = P - -Digest = SHA384 -Msg = "" -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 137a60205de7c9f40c29d65a035bd96da8ec95a909f129a8f7c0be2b3ecf539f62667e51db71b8685da2cb3a727651e8fa399715262c9a4ab88bff1d8514ee299a196c75a09fbfd6b069bbc5c2d1fce2107e68fa4605086160b803a13d221d47e68c8dfd94e6cf54175588c363f5ba311a77c056c45d90fc9a60ba36ac8f07e319baf84003d2af51d313d6209aaa5ae8a3308cacaa35577a01742ea42e5cdd275de51efc2d1947879c42e9a3dbf5986063c821f99e5ba6daead8d6e0c50f0754fbc5122978334914d12303ab1313a923c29889474c5b1dea85c5ec55cc2d5ad5d6776b2d234b96e2e80ed049c3cfc645967f5d5efb1d5c707585e8fa8bbb5653bc -Len = 2055 -Result = P - -Digest = SHA512 -Msg = "" -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 085255700ee4e6964ba0a867b650f5d3cac3380b59ec58c72a5d44156f7273f7ccf88edb48a3c7f6c07dfd03b9f8a907f0e7d98e38ee174edf9fe79159cddebafe1cbd586fdaf192d347d56867b3a3eb756ee3c51afbb9f4b1ccb00059abcfa51ef3facd58af14362db77c6c8bb387a5228d105388ff31b21c0b30d90e44956c4ddd6eebe14dc6dd94110e791abed1251eb798e7b559a7d37f9b3e47b83b1c44a9ecf9c591d6cfd21b5f3d9639174289c677b567a24c703f1757bee874c3408d5a2413f759483bf8b4d9956f463798028cfc5695d8cee89506eb5b4a61cd63cbb5b7738cfee0edd94be6ffa6f7c57f258f816015e9f20daeb061150e698596c3bc -Len = 2055 -Result = P - -Digest = SHA256 -Msg = 546869732069732061206c6f6e676572207465737420737472696e672e -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 0b5546c0e8bf9966ac52887133aa89150a5fe745492fe94790b6e8c06b5f091c147bf46a88b96b4e1ff39b6d8ddd999cc7271718763df7e885e53817d0d607f53aac52eec202d7183c04caa17f975c8eae3d78ac3da5c881b864ed438adaae827036756cd9df4f8fa24ef85aec221b35740c65e252880422ebf7ddf3e52b87346f8d8ed92f459fb76e866e8bf631a5b7e6d86968e5f7f64d499db7d0143ad40770c158039a3ed1205ba7ce959e837a4c23249cfec9ec56f02602c6d98cb845a04920b1123c69f35cc6fda327b632218e575eafff76b23cb0b7e5e3a1b6ac6b0e84d00ae842b10f54bcb018216001f446f680e7167b3553706c1641d9b8ef5253bc -Len = 2055 -Result = P - -Digest = SHA384 -Msg = 546869732069732061206c6f6e676572207465737420737472696e672e -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 25b562e2aa341868b4aa78ff86c220330e7159bb0871f8939aed509b4e5bcb2c4ecb2cbf4c85f8a11cb3f1c9efa748225f0d944c983dd86e6faadcf3cf7cff781653300d3f826cb1dfde256c056fff1772dbbe0715c2c85615a47d07a944449f4cad63dc06cf1b0a0ed799bdccd93078888e39beacde047625fd9cfe74c2098c701ff5e6436d2d845883cb8cf8aa134a57023226bbfccbe078e356eac19b35d14ef123291bc8cdd39177be702e5fa6ad3f759155cee55dc6fbdc10472ffe5d10d619a15ab22f369c49621e5966429fa69f6fc1a02d20dab5c900706608a19028d4a283939d2d16a495ae184bda4fdb488229e0f64334c15daf197dbc6dd213a0bc -Len = 2055 -Result = P - -Digest = SHA512 -Msg = 546869732069732061206c6f6e676572207465737420737472696e672e -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 163a1aafa96215f6ff698694f59fe97523399f214683f450f3024e6bb2523c7407ccd7024284522b957dc42aff3ef2a5738daaa88b38092880fc42b98ecdd3e09677db0c189c105f0777981d7620c0fb014c57a3e080cb5afc9ad4c0e47a0e46157ef96b01453a9aa7c99ef80976d425ccafcce990425969a30b5ce55b3fe21bfa595c1a7b272a9c427e73a4a32d392d6384bf33d4137d3a95c6199c692e66af77d56fe6411728c1e47ef2c70610305a1258807f6053d7b06259dba586ea4051a6320af4d65c4ab46dd1277a6995eb127f0aaa207dc3ee0d4c65d1224ac96da10d15ba220d096e8cc25c5f0ae0886dd76e0f3d08efb9c5fc0190d81f12261c5bbc -Len = 2055 -Result = P - -Digest = SHA256 -Msg = "" -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 23e55cbec753a80ab764cb3f9fa29b05a24f2f0b388a5e1082babf37f7d7f60c566e4452dd03fe9153f009aafc0cda10a01cf9f72a8754f618fc0b67de8b2a0cd2ba9e6c241267dcee3b04f26f23fbfa3ace11e8f1a6ca6627efe30ad1973a42983a5e29c1646ebc3a50dd34e5f4b7a28a190cd8998d55ace1f46f8c23adf039ce5b9f0eea14b2d158076d194de8d15ac28d8b907002252e224e53cf3f6d4eda63f761395a9178d0d0c3d34e4db38d4574818ee596ac34bbcdf861f13ef86ad118199c2557363663979c3c92aee2f83567d393efd19ce1a51e5c62f580aa5d73330868d2907d2999dd1a1ec37bb025f47b92f505dc9315ef35d57fafa7abb11fbc -Len = 2056 -Result = P - -Digest = SHA384 -Msg = "" -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 137a60205de7c9f40c29d65a035bd96da8ec95a909f129a8f7c0be2b3ecf539f62667e51db71b8685da2cb3a727651e8fa399715262c9a4ab88bff1d8514ee299a196c75a09fbfd6b069bbc5c2d1fce2107e68fa4605086160b803a13d221d47e68c8dfd94e6cf54175588c363f5ba311a77c056c45d90fc9a60ba36ac8f07e319baf84003d2af51d313d6209aaa5ae8a3308cacaa35577a01742ea42e5cdd275de51efc2d1947879c42e9a3dbf5986063c821f99e5ba6daead8d6e0c50f0754fbc5122978334914d12303ab1313a923c29889474c5b1dea85c5ec55cc2d5ad5d6776b2d234b96e2e80ed049c3cfc645967f5d5efb1d5c707585e8fa8bbb5653bc -Len = 2056 -Result = P - -Digest = SHA512 -Msg = "" -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 485255700ee4e6964ba0a867b650f5d3cac3380b59ec58c72a5d44156f7273f7ccf88edb48a3c7f6c07dfd03b9f8a907f0e7d98e38ee174edf9fe79159cddebafe1cbd586fdaf192d347d56867b3a3eb756ee3c51afbb9f4b1ccb00059abcfa51ef3facd58af14362db77c6c8bb387a5228d105388ff31b21c0b30d90e44956c4ddd6eebe14dc6dd94110e791abed1251eb798e7b559a7d37f9b3e47b83b1c44a9ecf9c591d6cfd21b5f3d9639174289c677b567a24c703f1757bee874c3408d5a2413f759483bf8b4d9956f463798028cfc5695d8cee89506eb5b4a61cd63cbb5b7738cfee0edd94be6ffa6f7c57f258f816015e9f20daeb061150e698596c3bc -Len = 2056 -Result = P - -Digest = SHA256 -Msg = 546869732069732061206c6f6e676572207465737420737472696e672e -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 0b5546c0e8bf9966ac52887133aa89150a5fe745492fe94790b6e8c06b5f091c147bf46a88b96b4e1ff39b6d8ddd999cc7271718763df7e885e53817d0d607f53aac52eec202d7183c04caa17f975c8eae3d78ac3da5c881b864ed438adaae827036756cd9df4f8fa24ef85aec221b35740c65e252880422ebf7ddf3e52b87346f8d8ed92f459fb76e866e8bf631a5b7e6d86968e5f7f64d499db7d0143ad40770c158039a3ed1205ba7ce959e837a4c23249cfec9ec56f02602c6d98cb845a04920b1123c69f35cc6fda327b632218e575eafff76b23cb0b7e5e3a1b6ac6b0e84d00ae842b10f54bcb018216001f446f680e7167b3553706c1641d9b8ef5253bc -Len = 2056 -Result = P - -Digest = SHA384 -Msg = 546869732069732061206c6f6e676572207465737420737472696e672e -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 65b562e2aa341868b4aa78ff86c220330e7159bb0871f8939aed509b4e5bcb2c4ecb2cbf4c85f8a11cb3f1c9efa748225f0d944c983dd86e6faadcf3cf7cff781653300d3f826cb1dfde256c056fff1772dbbe0715c2c85615a47d07a944449f4cad63dc06cf1b0a0ed799bdccd93078888e39beacde047625fd9cfe74c2098c701ff5e6436d2d845883cb8cf8aa134a57023226bbfccbe078e356eac19b35d14ef123291bc8cdd39177be702e5fa6ad3f759155cee55dc6fbdc10472ffe5d10d619a15ab22f369c49621e5966429fa69f6fc1a02d20dab5c900706608a19028d4a283939d2d16a495ae184bda4fdb488229e0f64334c15daf197dbc6dd213a0bc -Len = 2056 -Result = P - -Digest = SHA512 -Msg = 546869732069732061206c6f6e676572207465737420737472696e672e -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 563a1aafa96215f6ff698694f59fe97523399f214683f450f3024e6bb2523c7407ccd7024284522b957dc42aff3ef2a5738daaa88b38092880fc42b98ecdd3e09677db0c189c105f0777981d7620c0fb014c57a3e080cb5afc9ad4c0e47a0e46157ef96b01453a9aa7c99ef80976d425ccafcce990425969a30b5ce55b3fe21bfa595c1a7b272a9c427e73a4a32d392d6384bf33d4137d3a95c6199c692e66af77d56fe6411728c1e47ef2c70610305a1258807f6053d7b06259dba586ea4051a6320af4d65c4ab46dd1277a6995eb127f0aaa207dc3ee0d4c65d1224ac96da10d15ba220d096e8cc25c5f0ae0886dd76e0f3d08efb9c5fc0190d81f12261c5bbc -Len = 2056 -Result = P - -Digest = SHA256 -Msg = "" -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 0023e55cbec753a80ab764cb3f9fa29b05a24f2f0b388a5e1082babf37f7d7f60c566e4452dd03fe9153f009aafc0cda10a01cf9f72a8754f618fc0b67de8b2a0cd2ba9e6c241267dcee3b04f26f23fbfa3ace11e8f1a6ca6627efe30ad1973a42983a5e29c1646ebc3a50dd34e5f4b7a28a190cd8998d55ace1f46f8c23adf039ce5b9f0eea14b2d158076d194de8d15ac28d8b907002252e224e53cf3f6d4eda63f761395a9178d0d0c3d34e4db38d4574818ee596ac34bbcdf861f13ef86ad118199c2557363663979c3c92aee2f83567d393efd19ce1a51e5c62f580aa5d73330868d2907d2999dd1a1ec37bb025f47b92f505dc9315ef35d57fafa7abb11fbc -Len = 2057 -Result = P - -Digest = SHA384 -Msg = "" -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 00937a60205de7c9f40c29d65a035bd96da8ec95a909f129a8f7c0be2b3ecf539f62667e51db71b8685da2cb3a727651e8fa399715262c9a4ab88bff1d8514ee299a196c75a09fbfd6b069bbc5c2d1fce2107e68fa4605086160b803a13d221d47e68c8dfd94e6cf54175588c363f5ba311a77c056c45d90fc9a60ba36ac8f07e319baf84003d2af51d313d6209aaa5ae8a3308cacaa35577a01742ea42e5cdd275de51efc2d1947879c42e9a3dbf5986063c821f99e5ba6daead8d6e0c50f0754fbc5122978334914d12303ab1313a923c29889474c5b1dea85c5ec55cc2d5ad5d6776b2d234b96e2e80ed049c3cfc645967f5d5efb1d5c707585e8fa8bbb5653bc -Len = 2057 -Result = P - -Digest = SHA512 -Msg = "" -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 00485255700ee4e6964ba0a867b650f5d3cac3380b59ec58c72a5d44156f7273f7ccf88edb48a3c7f6c07dfd03b9f8a907f0e7d98e38ee174edf9fe79159cddebafe1cbd586fdaf192d347d56867b3a3eb756ee3c51afbb9f4b1ccb00059abcfa51ef3facd58af14362db77c6c8bb387a5228d105388ff31b21c0b30d90e44956c4ddd6eebe14dc6dd94110e791abed1251eb798e7b559a7d37f9b3e47b83b1c44a9ecf9c591d6cfd21b5f3d9639174289c677b567a24c703f1757bee874c3408d5a2413f759483bf8b4d9956f463798028cfc5695d8cee89506eb5b4a61cd63cbb5b7738cfee0edd94be6ffa6f7c57f258f816015e9f20daeb061150e698596c3bc -Len = 2057 -Result = P - -Digest = SHA256 -Msg = 546869732069732061206c6f6e676572207465737420737472696e672e -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 008b5546c0e8bf9966ac52887133aa89150a5fe745492fe94790b6e8c06b5f091c147bf46a88b96b4e1ff39b6d8ddd999cc7271718763df7e885e53817d0d607f53aac52eec202d7183c04caa17f975c8eae3d78ac3da5c881b864ed438adaae827036756cd9df4f8fa24ef85aec221b35740c65e252880422ebf7ddf3e52b87346f8d8ed92f459fb76e866e8bf631a5b7e6d86968e5f7f64d499db7d0143ad40770c158039a3ed1205ba7ce959e837a4c23249cfec9ec56f02602c6d98cb845a04920b1123c69f35cc6fda327b632218e575eafff76b23cb0b7e5e3a1b6ac6b0e84d00ae842b10f54bcb018216001f446f680e7167b3553706c1641d9b8ef5253bc -Len = 2057 -Result = P - -Digest = SHA384 -Msg = 546869732069732061206c6f6e676572207465737420737472696e672e -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 00e5b562e2aa341868b4aa78ff86c220330e7159bb0871f8939aed509b4e5bcb2c4ecb2cbf4c85f8a11cb3f1c9efa748225f0d944c983dd86e6faadcf3cf7cff781653300d3f826cb1dfde256c056fff1772dbbe0715c2c85615a47d07a944449f4cad63dc06cf1b0a0ed799bdccd93078888e39beacde047625fd9cfe74c2098c701ff5e6436d2d845883cb8cf8aa134a57023226bbfccbe078e356eac19b35d14ef123291bc8cdd39177be702e5fa6ad3f759155cee55dc6fbdc10472ffe5d10d619a15ab22f369c49621e5966429fa69f6fc1a02d20dab5c900706608a19028d4a283939d2d16a495ae184bda4fdb488229e0f64334c15daf197dbc6dd213a0bc -Len = 2057 -Result = P - -Digest = SHA512 -Msg = 546869732069732061206c6f6e676572207465737420737472696e672e -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 00d63a1aafa96215f6ff698694f59fe97523399f214683f450f3024e6bb2523c7407ccd7024284522b957dc42aff3ef2a5738daaa88b38092880fc42b98ecdd3e09677db0c189c105f0777981d7620c0fb014c57a3e080cb5afc9ad4c0e47a0e46157ef96b01453a9aa7c99ef80976d425ccafcce990425969a30b5ce55b3fe21bfa595c1a7b272a9c427e73a4a32d392d6384bf33d4137d3a95c6199c692e66af77d56fe6411728c1e47ef2c70610305a1258807f6053d7b06259dba586ea4051a6320af4d65c4ab46dd1277a6995eb127f0aaa207dc3ee0d4c65d1224ac96da10d15ba220d096e8cc25c5f0ae0886dd76e0f3d08efb9c5fc0190d81f12261c5bbc -Len = 2057 -Result = P - -Digest = SHA256 -Msg = "" -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 23e55cbec753a80ab764cb3f9fa29b05a24f2f0b388a5e1082babf37f7d7f60c566e4452dd03fe9153f009aafc0cda10a01cf9f72a8754f618fc0b67de8b2a0cd2ba9e6c241267dcee3b04f26f23fbfa3ace11e8f1a6ca6627efe30ad1973a42983a5e29c1646ebc3a50dd34e5f4b7a28a190cd8998d55ace1f46f8c23adf039ce5b9f0eea14b2d158076d194de8d15ac28d8b907002252e224e53cf3f6d4eda63f761395a9178d0d0c3d34e4db38d4574818ee596ac34bbcdf861f13ef86ad0e8e96cd5a7c6c693676ccc625e1208c59723631f216c1155eeac9205705aad83b01a11926d8ca477d047449d3fa2068660cdc61bef02439aea352bd32da7d2e5cf2ddaccdcd6a6eb7492f3b5af9a0bdf93427ef99218bef4d72588f943bd9b8f2a404ba061feb1d48c8430b3f2fe5de5c4fe9af5a48359bd91fa5d93a4d83d96b27177769f91e1d1cb1959790e607f9d30ee44339bc4da863eb6fe8b7457b533c5e22e0bc4855a20229c7ecd193e917cb695b26a84d721f4707dac53e9485234ebeed7bb505f0fa1393aff820462bdd1e26c14c541e551ab6ffb9d7b7e280e33f7b2ec30eb14f4d635a57fb568bf9c420f197673a5cb4d8b15f9e8c743af983232796e8de52887a9f5f194ba589332fbc9de824d33c05de9d1b71fe7e5e628330868d2907d2999dd1a1ec37bb025f47b92f505dc9315ef35d57fafa7abb11fbc -Len = 4095 -Result = P - -Digest = SHA384 -Msg = "" -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 137a60205de7c9f40c29d65a035bd96da8ec95a909f129a8f7c0be2b3ecf539f62667e51db71b8685da2cb3a727651e8fa399715262c9a4ab88bff1d8514ee299a196c75a09fbfd6b069bbc5c2d1fce2107e68fa4605086160b803a13d221d47e68c8dfd94e6cf54175588c363f5ba311a77c056c45d90fc9a60ba36ac8f07e319baf84003d2af51d313d6209aaa5ae8a3308cacaa35577a01742ea42e5cdd26ad15ee0cdde9b7776cb219532b0568909338d1096eab562a1a28261035fff7a40b35e2d988c3b9e421d3f35be3e359d325a25ce856a9077fa884fe96a287ce32eb28f5ce4a854f00575fad8fb53b5b8e405fbb3273d14eeda5141971d34d19cd50620a4ac5041c0622e43224e49df105dec2a4bd93536dfc470b363f0464ffda82ca5dfb7e2620fe210ccbc42344b85d937c6937f40ad69a5db1dc2b5b4d930cb8036d0b95644e792661f872cbe47b65f62c1fcd884c2387938fe303d3b7f1a20e989b5ed979398778924f70439df29482182478048afbb1be1da0e5961ecc38c1e9037b05bee4364877e2d090107abf8a9c46603e16c7013a370376c05daedf3dfa80ae9c6d7916e1029d7468f6c363d9a1b3dc7d01476894b4ea893df8d92b237289bcbf874608978c4ae30c680ac29889474c5b1dea85c5ec55cc2d5ad5d6776b2d234b96e2e80ed049c3cfc645967f5d5efb1d5c707585e8fa8bbb5653bc -Len = 4095 -Result = P - -Digest = SHA512 -Msg = "" -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 085255700ee4e6964ba0a867b650f5d3cac3380b59ec58c72a5d44156f7273f7ccf88edb48a3c7f6c07dfd03b9f8a907f0e7d98e38ee174edf9fe79159cddebafe1cbd586fdaf192d347d56867b3a3eb756ee3c51afbb9f4b1ccb00059abcfa51ef3facd58af14362db77c6c8bb387a5228d105388ff31b21c0b30d90e44956dbd2d9e1b11bd362d64e1fe89ea4e21d5ee47681745a957238f6bceb748cbecb4591c093561263f22ebafcd66c9e7b2793687459752bc80cfe7a74e188433b07d941689697fbdb5eb4850f5534315360fe5b439559a93f57e3a0cad473a3debcc92304b08112c9b6ef227206d5f14a7037fd417d1c37f600c9df6f0083de6db4070781e60d3dffd4eebefe15f1adcdc74610273296a4112e8b6a4305d7f88eb3029a27e7d96dcc9549c33b1de6ec8485c925065773a0eba301b892777c4a62a0390109153e86bb012234cf2510db791618756df830a49cfa2a27fae064df4d245430084111690f21ee89507fcad3de886c9a476e75d4c18b3913db58bbdb632e7c0f69724b77be966601e11b62be6b6a838eec417d62b131e15bf95a5c6976a917bf80e662f87a5b3775de4648598f678ef971d4e286b21406b2db5cdde48b35a2413f759483bf8b4d9956f463798028cfc5695d8cee89506eb5b4a61cd63cbb5b7738cfee0edd94be6ffa6f7c57f258f816015e9f20daeb061150e698596c3bc -Len = 4095 -Result = P - -Digest = SHA256 -Msg = 546869732069732061206c6f6e676572207465737420737472696e672e -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 0b5546c0e8bf9966ac52887133aa89150a5fe745492fe94790b6e8c06b5f091c147bf46a88b96b4e1ff39b6d8ddd999cc7271718763df7e885e53817d0d607f53aac52eec202d7183c04caa17f975c8eae3d78ac3da5c881b864ed438adaae827036756cd9df4f8fa24ef85aec221b35740c65e252880422ebf7ddf3e52b87346f8d8ed92f459fb76e866e8bf631a5b7e6d86968e5f7f64d499db7d0143ad40770c158039a3ed1205ba7ce959e837a4c23249cfec9ec56f02602c6d98cb845a1b9d041e2cc9903ac360d53d746c2d17ea7ae5f0f8642cc4047151351465c9bfe0770aa65f8ee2c3ebcd6fecd005cad15eaf6dc3a81a9d704fb5cfb13af6a848b276cdce43b5feb9c0d4b7e85f946f80ce625ba4fe885f13d1fc709df121143c3f17bf8a50845cc80d066989eaea92bd5735e753cfc9545d5bcb43f0391d4ae4569447927130efabe6e8455ed9533ebb8370a4439097dca51994c3c2ba8686e89570d9cb1f87680865371df21975b696cdc00541347008793dc641ae435b86150e5f6f06414e80f50d07cde583efb79c276d90b637935412f611552c4816c8fddf62f080e9edaba61d939c3b2d302a9e5db80f380ad73bf5c1866d8d7b25146464511ca13672bd3be2a95bf10fa736ce411cded82af15ba8f5340dc9098f7cf84d00ae842b10f54bcb018216001f446f680e7167b3553706c1641d9b8ef5253bc -Len = 4095 -Result = P - -Digest = SHA384 -Msg = 546869732069732061206c6f6e676572207465737420737472696e672e -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 25b562e2aa341868b4aa78ff86c220330e7159bb0871f8939aed509b4e5bcb2c4ecb2cbf4c85f8a11cb3f1c9efa748225f0d944c983dd86e6faadcf3cf7cff781653300d3f826cb1dfde256c056fff1772dbbe0715c2c85615a47d07a944449f4cad63dc06cf1b0a0ed799bdccd93078888e39beacde047625fd9cfe74c2098c701ff5e6436d2d845883cb8cf8aa134a57023226bbfccbe078e356eac19b35d0be01d3d9eb383d2361874e80deaf565dcf8561a53e15ad360b2ce0b7df0eade026e951aa42dfc66cb992eea996b26f56d8a224970a4d1e42d925786d3b23215c7cc8f30377f4bec31491c865bb91760acdfb13cd500fa865741f58841fee3938203a766c72397e7ada29cc56b3f6aef82588ca993e0b6af48d2ac6274511b74e9cf06b89a8c73ca741602e7a0c6f9a6e47e87105108d55aff9afb70c14e6e74fa62ed51220fbf46be9a3101dfe1d64d4fea487e05be823fcfaeadad994f11b98b9c9b7390a96b356a32af6d4be2da0861b5b253942aa706000349e5bdead4a931ce48c99c588c9032b71963b9faf26a250483a14c10328a6a5b1ba24639ccc15e842250eb55cba18ed1a7cb5fd0f75e845434fa4c35c8c22b4a8afc1de1f70db96eca9d055b95a107934c7c1f361f19f6fc1a02d20dab5c900706608a19028d4a283939d2d16a495ae184bda4fdb488229e0f64334c15daf197dbc6dd213a0bc -Len = 4095 -Result = P - -Digest = SHA512 -Msg = 546869732069732061206c6f6e676572207465737420737472696e672e -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 163a1aafa96215f6ff698694f59fe97523399f214683f450f3024e6bb2523c7407ccd7024284522b957dc42aff3ef2a5738daaa88b38092880fc42b98ecdd3e09677db0c189c105f0777981d7620c0fb014c57a3e080cb5afc9ad4c0e47a0e46157ef96b01453a9aa7c99ef80976d425ccafcce990425969a30b5ce55b3fe21a0aa9acea8bd7da6cb28e835453ddc9dd93744fc324e38dca6536e96c99de965f87259f16b1e7d831148e0237f6e0c0aae2a8708f90a3274092a92b55761ab0a12ee732ddfc2acb7d559b4a0d8d5f8426c9751f5545282b8fe8748b18144bbf6f3a9fb47b9642565736fbc616fb886c28f1089123278c082b7b78bce947bd5285b9f8f5787233dba8313554b8c79686f9817626c8c1a6d641996bbfb32e8d4c0e0a07c6979976a18f0534bf31a658fdc9bd2fa3018a22c3cfbc83640c53fccd833aaf6f08ca2834a9e5c7d56302671b88605734f34189d4612d30fe6d056c77f80eda3ca6976b9ce56d90aad4ae7aad112bb47472e6402bb4c915711e2a2d038c2d6ef94f2fc8fdc90b51aa413e3b0c1f7a8807072f0255fe94e3f0a9a7d7a8c5727d5a0c287df9ebdf184d51e726e4334925b3e7f119272bf7ef3cd3dceab1a6320af4d65c4ab46dd1277a6995eb127f0aaa207dc3ee0d4c65d1224ac96da10d15ba220d096e8cc25c5f0ae0886dd76e0f3d08efb9c5fc0190d81f12261c5bbc -Len = 4095 -Result = P - -Digest = SHA256 -Msg = "" -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 23e55cbec753a80ab764cb3f9fa29b05a24f2f0b388a5e1082babf37f7d7f60c566e4452dd03fe9153f009aafc0cda10a01cf9f72a8754f618fc0b67de8b2a0cd2ba9e6c241267dcee3b04f26f23fbfa3ace11e8f1a6ca6627efe30ad1973a42983a5e29c1646ebc3a50dd34e5f4b7a28a190cd8998d55ace1f46f8c23adf039ce5b9f0eea14b2d158076d194de8d15ac28d8b907002252e224e53cf3f6d4eda63f761395a9178d0d0c3d34e4db38d4574818ee596ac34bbcdf861f13ef86ad0e8e96cd5a7c6c693676ccc625e1208c59723631f216c1155eeac9205705aad83b01a11926d8ca477d047449d3fa2068660cdc61bef02439aea352bd32da7d2e5cf2ddaccdcd6a6eb7492f3b5af9a0bdf93427ef99218bef4d72588f943bd9b8f2a404ba061feb1d48c8430b3f2fe5de5c4fe9af5a48359bd91fa5d93a4d83d96b27177769f91e1d1cb1959790e607f9d30ee44339bc4da863eb6fe8b7457b533c5e22e0bc4855a20229c7ecd193e917cb695b26a84d721f4707dac53e9485234ebeed7bb505f0fa1393aff820462bdd1e26c14c541e551ab6ffb9d7b7e280e33f7b2ec30eb14f4d635a57fb568bf9c420f197673a5cb4d8b15f9e8c743af983232796e8de52887a9f5f194ba589332fbc9de824d33c05de9d1b71fe7e5e628330868d2907d2999dd1a1ec37bb025f47b92f505dc9315ef35d57fafa7abb11fbc -Len = 4096 -Result = P - -Digest = SHA384 -Msg = "" -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 137a60205de7c9f40c29d65a035bd96da8ec95a909f129a8f7c0be2b3ecf539f62667e51db71b8685da2cb3a727651e8fa399715262c9a4ab88bff1d8514ee299a196c75a09fbfd6b069bbc5c2d1fce2107e68fa4605086160b803a13d221d47e68c8dfd94e6cf54175588c363f5ba311a77c056c45d90fc9a60ba36ac8f07e319baf84003d2af51d313d6209aaa5ae8a3308cacaa35577a01742ea42e5cdd26ad15ee0cdde9b7776cb219532b0568909338d1096eab562a1a28261035fff7a40b35e2d988c3b9e421d3f35be3e359d325a25ce856a9077fa884fe96a287ce32eb28f5ce4a854f00575fad8fb53b5b8e405fbb3273d14eeda5141971d34d19cd50620a4ac5041c0622e43224e49df105dec2a4bd93536dfc470b363f0464ffda82ca5dfb7e2620fe210ccbc42344b85d937c6937f40ad69a5db1dc2b5b4d930cb8036d0b95644e792661f872cbe47b65f62c1fcd884c2387938fe303d3b7f1a20e989b5ed979398778924f70439df29482182478048afbb1be1da0e5961ecc38c1e9037b05bee4364877e2d090107abf8a9c46603e16c7013a370376c05daedf3dfa80ae9c6d7916e1029d7468f6c363d9a1b3dc7d01476894b4ea893df8d92b237289bcbf874608978c4ae30c680ac29889474c5b1dea85c5ec55cc2d5ad5d6776b2d234b96e2e80ed049c3cfc645967f5d5efb1d5c707585e8fa8bbb5653bc -Len = 4096 -Result = P - -Digest = SHA512 -Msg = "" -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 485255700ee4e6964ba0a867b650f5d3cac3380b59ec58c72a5d44156f7273f7ccf88edb48a3c7f6c07dfd03b9f8a907f0e7d98e38ee174edf9fe79159cddebafe1cbd586fdaf192d347d56867b3a3eb756ee3c51afbb9f4b1ccb00059abcfa51ef3facd58af14362db77c6c8bb387a5228d105388ff31b21c0b30d90e44956dbd2d9e1b11bd362d64e1fe89ea4e21d5ee47681745a957238f6bceb748cbecb4591c093561263f22ebafcd66c9e7b2793687459752bc80cfe7a74e188433b07d941689697fbdb5eb4850f5534315360fe5b439559a93f57e3a0cad473a3debcc92304b08112c9b6ef227206d5f14a7037fd417d1c37f600c9df6f0083de6db4070781e60d3dffd4eebefe15f1adcdc74610273296a4112e8b6a4305d7f88eb3029a27e7d96dcc9549c33b1de6ec8485c925065773a0eba301b892777c4a62a0390109153e86bb012234cf2510db791618756df830a49cfa2a27fae064df4d245430084111690f21ee89507fcad3de886c9a476e75d4c18b3913db58bbdb632e7c0f69724b77be966601e11b62be6b6a838eec417d62b131e15bf95a5c6976a917bf80e662f87a5b3775de4648598f678ef971d4e286b21406b2db5cdde48b35a2413f759483bf8b4d9956f463798028cfc5695d8cee89506eb5b4a61cd63cbb5b7738cfee0edd94be6ffa6f7c57f258f816015e9f20daeb061150e698596c3bc -Len = 4096 -Result = P - -Digest = SHA256 -Msg = 546869732069732061206c6f6e676572207465737420737472696e672e -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 0b5546c0e8bf9966ac52887133aa89150a5fe745492fe94790b6e8c06b5f091c147bf46a88b96b4e1ff39b6d8ddd999cc7271718763df7e885e53817d0d607f53aac52eec202d7183c04caa17f975c8eae3d78ac3da5c881b864ed438adaae827036756cd9df4f8fa24ef85aec221b35740c65e252880422ebf7ddf3e52b87346f8d8ed92f459fb76e866e8bf631a5b7e6d86968e5f7f64d499db7d0143ad40770c158039a3ed1205ba7ce959e837a4c23249cfec9ec56f02602c6d98cb845a1b9d041e2cc9903ac360d53d746c2d17ea7ae5f0f8642cc4047151351465c9bfe0770aa65f8ee2c3ebcd6fecd005cad15eaf6dc3a81a9d704fb5cfb13af6a848b276cdce43b5feb9c0d4b7e85f946f80ce625ba4fe885f13d1fc709df121143c3f17bf8a50845cc80d066989eaea92bd5735e753cfc9545d5bcb43f0391d4ae4569447927130efabe6e8455ed9533ebb8370a4439097dca51994c3c2ba8686e89570d9cb1f87680865371df21975b696cdc00541347008793dc641ae435b86150e5f6f06414e80f50d07cde583efb79c276d90b637935412f611552c4816c8fddf62f080e9edaba61d939c3b2d302a9e5db80f380ad73bf5c1866d8d7b25146464511ca13672bd3be2a95bf10fa736ce411cded82af15ba8f5340dc9098f7cf84d00ae842b10f54bcb018216001f446f680e7167b3553706c1641d9b8ef5253bc -Len = 4096 -Result = P - -Digest = SHA384 -Msg = 546869732069732061206c6f6e676572207465737420737472696e672e -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 65b562e2aa341868b4aa78ff86c220330e7159bb0871f8939aed509b4e5bcb2c4ecb2cbf4c85f8a11cb3f1c9efa748225f0d944c983dd86e6faadcf3cf7cff781653300d3f826cb1dfde256c056fff1772dbbe0715c2c85615a47d07a944449f4cad63dc06cf1b0a0ed799bdccd93078888e39beacde047625fd9cfe74c2098c701ff5e6436d2d845883cb8cf8aa134a57023226bbfccbe078e356eac19b35d0be01d3d9eb383d2361874e80deaf565dcf8561a53e15ad360b2ce0b7df0eade026e951aa42dfc66cb992eea996b26f56d8a224970a4d1e42d925786d3b23215c7cc8f30377f4bec31491c865bb91760acdfb13cd500fa865741f58841fee3938203a766c72397e7ada29cc56b3f6aef82588ca993e0b6af48d2ac6274511b74e9cf06b89a8c73ca741602e7a0c6f9a6e47e87105108d55aff9afb70c14e6e74fa62ed51220fbf46be9a3101dfe1d64d4fea487e05be823fcfaeadad994f11b98b9c9b7390a96b356a32af6d4be2da0861b5b253942aa706000349e5bdead4a931ce48c99c588c9032b71963b9faf26a250483a14c10328a6a5b1ba24639ccc15e842250eb55cba18ed1a7cb5fd0f75e845434fa4c35c8c22b4a8afc1de1f70db96eca9d055b95a107934c7c1f361f19f6fc1a02d20dab5c900706608a19028d4a283939d2d16a495ae184bda4fdb488229e0f64334c15daf197dbc6dd213a0bc -Len = 4096 -Result = P - -Digest = SHA512 -Msg = 546869732069732061206c6f6e676572207465737420737472696e672e -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 563a1aafa96215f6ff698694f59fe97523399f214683f450f3024e6bb2523c7407ccd7024284522b957dc42aff3ef2a5738daaa88b38092880fc42b98ecdd3e09677db0c189c105f0777981d7620c0fb014c57a3e080cb5afc9ad4c0e47a0e46157ef96b01453a9aa7c99ef80976d425ccafcce990425969a30b5ce55b3fe21a0aa9acea8bd7da6cb28e835453ddc9dd93744fc324e38dca6536e96c99de965f87259f16b1e7d831148e0237f6e0c0aae2a8708f90a3274092a92b55761ab0a12ee732ddfc2acb7d559b4a0d8d5f8426c9751f5545282b8fe8748b18144bbf6f3a9fb47b9642565736fbc616fb886c28f1089123278c082b7b78bce947bd5285b9f8f5787233dba8313554b8c79686f9817626c8c1a6d641996bbfb32e8d4c0e0a07c6979976a18f0534bf31a658fdc9bd2fa3018a22c3cfbc83640c53fccd833aaf6f08ca2834a9e5c7d56302671b88605734f34189d4612d30fe6d056c77f80eda3ca6976b9ce56d90aad4ae7aad112bb47472e6402bb4c915711e2a2d038c2d6ef94f2fc8fdc90b51aa413e3b0c1f7a8807072f0255fe94e3f0a9a7d7a8c5727d5a0c287df9ebdf184d51e726e4334925b3e7f119272bf7ef3cd3dceab1a6320af4d65c4ab46dd1277a6995eb127f0aaa207dc3ee0d4c65d1224ac96da10d15ba220d096e8cc25c5f0ae0886dd76e0f3d08efb9c5fc0190d81f12261c5bbc -Len = 4096 -Result = P - -Digest = SHA256 -Msg = "" -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 0023e55cbec753a80ab764cb3f9fa29b05a24f2f0b388a5e1082babf37f7d7f60c566e4452dd03fe9153f009aafc0cda10a01cf9f72a8754f618fc0b67de8b2a0cd2ba9e6c241267dcee3b04f26f23fbfa3ace11e8f1a6ca6627efe30ad1973a42983a5e29c1646ebc3a50dd34e5f4b7a28a190cd8998d55ace1f46f8c23adf039ce5b9f0eea14b2d158076d194de8d15ac28d8b907002252e224e53cf3f6d4eda63f761395a9178d0d0c3d34e4db38d4574818ee596ac34bbcdf861f13ef86ad0e8e96cd5a7c6c693676ccc625e1208c59723631f216c1155eeac9205705aad83b01a11926d8ca477d047449d3fa2068660cdc61bef02439aea352bd32da7d2e5cf2ddaccdcd6a6eb7492f3b5af9a0bdf93427ef99218bef4d72588f943bd9b8f2a404ba061feb1d48c8430b3f2fe5de5c4fe9af5a48359bd91fa5d93a4d83d96b27177769f91e1d1cb1959790e607f9d30ee44339bc4da863eb6fe8b7457b533c5e22e0bc4855a20229c7ecd193e917cb695b26a84d721f4707dac53e9485234ebeed7bb505f0fa1393aff820462bdd1e26c14c541e551ab6ffb9d7b7e280e33f7b2ec30eb14f4d635a57fb568bf9c420f197673a5cb4d8b15f9e8c743af983232796e8de52887a9f5f194ba589332fbc9de824d33c05de9d1b71fe7e5e628330868d2907d2999dd1a1ec37bb025f47b92f505dc9315ef35d57fafa7abb11fbc -Len = 4097 -Result = P - -Digest = SHA384 -Msg = "" -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 00937a60205de7c9f40c29d65a035bd96da8ec95a909f129a8f7c0be2b3ecf539f62667e51db71b8685da2cb3a727651e8fa399715262c9a4ab88bff1d8514ee299a196c75a09fbfd6b069bbc5c2d1fce2107e68fa4605086160b803a13d221d47e68c8dfd94e6cf54175588c363f5ba311a77c056c45d90fc9a60ba36ac8f07e319baf84003d2af51d313d6209aaa5ae8a3308cacaa35577a01742ea42e5cdd26ad15ee0cdde9b7776cb219532b0568909338d1096eab562a1a28261035fff7a40b35e2d988c3b9e421d3f35be3e359d325a25ce856a9077fa884fe96a287ce32eb28f5ce4a854f00575fad8fb53b5b8e405fbb3273d14eeda5141971d34d19cd50620a4ac5041c0622e43224e49df105dec2a4bd93536dfc470b363f0464ffda82ca5dfb7e2620fe210ccbc42344b85d937c6937f40ad69a5db1dc2b5b4d930cb8036d0b95644e792661f872cbe47b65f62c1fcd884c2387938fe303d3b7f1a20e989b5ed979398778924f70439df29482182478048afbb1be1da0e5961ecc38c1e9037b05bee4364877e2d090107abf8a9c46603e16c7013a370376c05daedf3dfa80ae9c6d7916e1029d7468f6c363d9a1b3dc7d01476894b4ea893df8d92b237289bcbf874608978c4ae30c680ac29889474c5b1dea85c5ec55cc2d5ad5d6776b2d234b96e2e80ed049c3cfc645967f5d5efb1d5c707585e8fa8bbb5653bc -Len = 4097 -Result = P - -Digest = SHA512 -Msg = "" -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 00485255700ee4e6964ba0a867b650f5d3cac3380b59ec58c72a5d44156f7273f7ccf88edb48a3c7f6c07dfd03b9f8a907f0e7d98e38ee174edf9fe79159cddebafe1cbd586fdaf192d347d56867b3a3eb756ee3c51afbb9f4b1ccb00059abcfa51ef3facd58af14362db77c6c8bb387a5228d105388ff31b21c0b30d90e44956dbd2d9e1b11bd362d64e1fe89ea4e21d5ee47681745a957238f6bceb748cbecb4591c093561263f22ebafcd66c9e7b2793687459752bc80cfe7a74e188433b07d941689697fbdb5eb4850f5534315360fe5b439559a93f57e3a0cad473a3debcc92304b08112c9b6ef227206d5f14a7037fd417d1c37f600c9df6f0083de6db4070781e60d3dffd4eebefe15f1adcdc74610273296a4112e8b6a4305d7f88eb3029a27e7d96dcc9549c33b1de6ec8485c925065773a0eba301b892777c4a62a0390109153e86bb012234cf2510db791618756df830a49cfa2a27fae064df4d245430084111690f21ee89507fcad3de886c9a476e75d4c18b3913db58bbdb632e7c0f69724b77be966601e11b62be6b6a838eec417d62b131e15bf95a5c6976a917bf80e662f87a5b3775de4648598f678ef971d4e286b21406b2db5cdde48b35a2413f759483bf8b4d9956f463798028cfc5695d8cee89506eb5b4a61cd63cbb5b7738cfee0edd94be6ffa6f7c57f258f816015e9f20daeb061150e698596c3bc -Len = 4097 -Result = P - -Digest = SHA256 -Msg = 546869732069732061206c6f6e676572207465737420737472696e672e -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 008b5546c0e8bf9966ac52887133aa89150a5fe745492fe94790b6e8c06b5f091c147bf46a88b96b4e1ff39b6d8ddd999cc7271718763df7e885e53817d0d607f53aac52eec202d7183c04caa17f975c8eae3d78ac3da5c881b864ed438adaae827036756cd9df4f8fa24ef85aec221b35740c65e252880422ebf7ddf3e52b87346f8d8ed92f459fb76e866e8bf631a5b7e6d86968e5f7f64d499db7d0143ad40770c158039a3ed1205ba7ce959e837a4c23249cfec9ec56f02602c6d98cb845a1b9d041e2cc9903ac360d53d746c2d17ea7ae5f0f8642cc4047151351465c9bfe0770aa65f8ee2c3ebcd6fecd005cad15eaf6dc3a81a9d704fb5cfb13af6a848b276cdce43b5feb9c0d4b7e85f946f80ce625ba4fe885f13d1fc709df121143c3f17bf8a50845cc80d066989eaea92bd5735e753cfc9545d5bcb43f0391d4ae4569447927130efabe6e8455ed9533ebb8370a4439097dca51994c3c2ba8686e89570d9cb1f87680865371df21975b696cdc00541347008793dc641ae435b86150e5f6f06414e80f50d07cde583efb79c276d90b637935412f611552c4816c8fddf62f080e9edaba61d939c3b2d302a9e5db80f380ad73bf5c1866d8d7b25146464511ca13672bd3be2a95bf10fa736ce411cded82af15ba8f5340dc9098f7cf84d00ae842b10f54bcb018216001f446f680e7167b3553706c1641d9b8ef5253bc -Len = 4097 -Result = P - -Digest = SHA384 -Msg = 546869732069732061206c6f6e676572207465737420737472696e672e -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 00e5b562e2aa341868b4aa78ff86c220330e7159bb0871f8939aed509b4e5bcb2c4ecb2cbf4c85f8a11cb3f1c9efa748225f0d944c983dd86e6faadcf3cf7cff781653300d3f826cb1dfde256c056fff1772dbbe0715c2c85615a47d07a944449f4cad63dc06cf1b0a0ed799bdccd93078888e39beacde047625fd9cfe74c2098c701ff5e6436d2d845883cb8cf8aa134a57023226bbfccbe078e356eac19b35d0be01d3d9eb383d2361874e80deaf565dcf8561a53e15ad360b2ce0b7df0eade026e951aa42dfc66cb992eea996b26f56d8a224970a4d1e42d925786d3b23215c7cc8f30377f4bec31491c865bb91760acdfb13cd500fa865741f58841fee3938203a766c72397e7ada29cc56b3f6aef82588ca993e0b6af48d2ac6274511b74e9cf06b89a8c73ca741602e7a0c6f9a6e47e87105108d55aff9afb70c14e6e74fa62ed51220fbf46be9a3101dfe1d64d4fea487e05be823fcfaeadad994f11b98b9c9b7390a96b356a32af6d4be2da0861b5b253942aa706000349e5bdead4a931ce48c99c588c9032b71963b9faf26a250483a14c10328a6a5b1ba24639ccc15e842250eb55cba18ed1a7cb5fd0f75e845434fa4c35c8c22b4a8afc1de1f70db96eca9d055b95a107934c7c1f361f19f6fc1a02d20dab5c900706608a19028d4a283939d2d16a495ae184bda4fdb488229e0f64334c15daf197dbc6dd213a0bc -Len = 4097 -Result = P - -Digest = SHA512 -Msg = 546869732069732061206c6f6e676572207465737420737472696e672e -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 00d63a1aafa96215f6ff698694f59fe97523399f214683f450f3024e6bb2523c7407ccd7024284522b957dc42aff3ef2a5738daaa88b38092880fc42b98ecdd3e09677db0c189c105f0777981d7620c0fb014c57a3e080cb5afc9ad4c0e47a0e46157ef96b01453a9aa7c99ef80976d425ccafcce990425969a30b5ce55b3fe21a0aa9acea8bd7da6cb28e835453ddc9dd93744fc324e38dca6536e96c99de965f87259f16b1e7d831148e0237f6e0c0aae2a8708f90a3274092a92b55761ab0a12ee732ddfc2acb7d559b4a0d8d5f8426c9751f5545282b8fe8748b18144bbf6f3a9fb47b9642565736fbc616fb886c28f1089123278c082b7b78bce947bd5285b9f8f5787233dba8313554b8c79686f9817626c8c1a6d641996bbfb32e8d4c0e0a07c6979976a18f0534bf31a658fdc9bd2fa3018a22c3cfbc83640c53fccd833aaf6f08ca2834a9e5c7d56302671b88605734f34189d4612d30fe6d056c77f80eda3ca6976b9ce56d90aad4ae7aad112bb47472e6402bb4c915711e2a2d038c2d6ef94f2fc8fdc90b51aa413e3b0c1f7a8807072f0255fe94e3f0a9a7d7a8c5727d5a0c287df9ebdf184d51e726e4334925b3e7f119272bf7ef3cd3dceab1a6320af4d65c4ab46dd1277a6995eb127f0aaa207dc3ee0d4c65d1224ac96da10d15ba220d096e8cc25c5f0ae0886dd76e0f3d08efb9c5fc0190d81f12261c5bbc -Len = 4097 -Result = P - -Digest = SHA256 -Msg = "" -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 23e55cbec753a80ab764cb3f9fa29b05a24f2f0b388a5e1082babf37f7d7f60c566e4452dd03fe9153f009aafc0cda10a01cf9f72a8754f618fc0b67de8b2a0cd2ba9e6c241267dcee3b04f26f23fbfa3ace11e8f1a6ca6627efe30ad1973a42983a5e29c1646ebc3a50dd34e5f4b7a28a190cd8998d55ace1f46f8c23adf039ce5b9f0eea14b2d158076d194de8d15ac28d8b907002252e224e53cf3f6d4eda63f761395a9178d0d0c3d34e4db38d4574818ee596ac34bbcdf861f13ef86ad0e8e96cd5a7c6c693676ccc625e1208c59723631f216c1155eeac9205705aad83b01a11926d8ca477d047449d3fa2068660cdc61bef02439aea352bd32da7d2e5cf2ddaccdcd6a6eb7492f3b5af9a0bdf93427ef99218bef4d72588f943bd9b8f2a404ba061feb1d48c8430b3f2fe5de5c4fe9af5a48359bd91fa5d93a4d83d96b27177769f91e1d1cb1959790e607f9d30ee44339bc4da863eb6fe8b7457b533c5e22e0bc4855a20229c7ecd193e917cb695b26a84d721f4707dac53e9485234ebeed7bb505f0fa1393aff820462bdd1e26c14c541e551ab6ffb9d7b7e280e33f7b2ec30eb14f4d635a57fb568bf9c420f197673a5cb4d8b15f9e8c743af99c2c2899e7d15d877590501644aa863c20b392e72bdc330ad192147ef171516d815c02fe0e375317b76c9df2052bd2de1b116192785b2282119f875dd89ffaf5a5c36f0524b3a4376f0381184591473a7c131d5f58bbb00b921030a96f260ee78cf1c2c25337e69b4cc42fcbd85034bd41f2c62e990fdd298fd53b453a4232b61426ac0764a5d6b8c45fb1d3004e27a1afc5ed38cf2ec4ab70521e6af5c1a2cf22306c523f87100c140525862efdd2d7eec690f34ad9a3c96c946472e622f830bf21b0c1d0690ebf6c8c98e0595e67b277d9ff43ed93ab568cab9684829f9392ab9eca7dacd191b7f263997bf5a03d4eb5115e84afcb92609554cd14ab304d912c8e9e201350a9460955edba75ba18ba4b5ef91d67950102ebc48432320ab90142fb25dd9decd6d5747255cb1fd7320f2297306c2282286338ab64b060dc0bdfd2271bbd0382d69d38988731bc80b6438a063b8d1af71c2153719a8d8dee2eebf85605a5bfcbc2d364ff291796b7c13506a33fc05dafd939ba9c700a7335cef47b0ced0bcf02722ba17821f144752ac92dda4134b0091b43141a35c53bdc896b4de809337d64caf0e9af200284f88d0f1318903a75df0d1d27f879d9b743a6eeaa9c167ef9cee9a7d0e67bf61872ce528663e4699b54231e6fc12ad41c45518aa53c24fe0cb97fe0d98c696561568d844e64a401ad70db439c978d3f1819f67e017901a307ad26556708f4e62217ab6f4575a0d4800259ea8590e3aa718ac0523330868d2907d2999dd1a1ec37bb025f47b92f505dc9315ef35d57fafa7abb11fbc -Len = 8191 -Result = P - -Digest = SHA384 -Msg = "" -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 137a60205de7c9f40c29d65a035bd96da8ec95a909f129a8f7c0be2b3ecf539f62667e51db71b8685da2cb3a727651e8fa399715262c9a4ab88bff1d8514ee299a196c75a09fbfd6b069bbc5c2d1fce2107e68fa4605086160b803a13d221d47e68c8dfd94e6cf54175588c363f5ba311a77c056c45d90fc9a60ba36ac8f07e319baf84003d2af51d313d6209aaa5ae8a3308cacaa35577a01742ea42e5cdd26ad15ee0cdde9b7776cb219532b0568909338d1096eab562a1a28261035fff7a40b35e2d988c3b9e421d3f35be3e359d325a25ce856a9077fa884fe96a287ce32eb28f5ce4a854f00575fad8fb53b5b8e405fbb3273d14eeda5141971d34d19cd50620a4ac5041c0622e43224e49df105dec2a4bd93536dfc470b363f0464ffda82ca5dfb7e2620fe210ccbc42344b85d937c6937f40ad69a5db1dc2b5b4d930cb8036d0b95644e792661f872cbe47b65f62c1fcd884c2387938fe303d3b7f1a20e989b5ed979398778924f70439df29482182478048afbb1be1da0e5961ecc38c1e9037b05bee4364877e2d090107abf8a9c46603e16c7013a370376c05daf2fcd0a705e6c9d89e611f26d84980633932951432c8df1b79864441a79cd0829dbd382794c4f77b6f8677cba13fc98fad99057289cf906d7ae2abed25e6fb4d555ebb86a5252e50eb6659ef7b7f2e1bff9a7d3910f1b0521c8108688003408bcc4aaa75c7efb27817c55fe1640fea83cbadc4e3f2a13cc56d0a544b84a7a50a34399f3d964d7ea0e9ea80001d6fd36a1516a5bca75bd83be639453a4b59cfcddebfda1e3022ece95efdc82b253c0b64b54c504f83f5cf375a1767e90eb68fe7cb93a43532c3db7e8c6446e6ac94a47e420e70531e62be6e99509ff0ba6040e39c2acb5c9d3a8c6dd92cc56962e495a1d3b67b896527902a9dd956b9e47a67b5461515b6c1211e17d05e69a7d866ed7839efab26089569867ba9736bfdba5fb8517af81410c15f1da525cb58ff8c005345a4cb42e555c8ecadb4d0f345b9afdff4fc60d810ee665327eaac60443c4ae1dc5704f8d7059630100b5ddecdaad5f114caac6a8a580ac9b7bad82195cd9561d3d4f81827f3776650c2a3f0c573c955bde7367b665d0a5a8ebd646cc230db4b4c904e6006b0a2e6546b932cbcd84a7d4ab0b2761ece96606fee0ca5fb1ed47f7a3956778bdeba4f065595b68e9e54e4c10650bf1eb23147e5ce5028a1f363f2cc17dfadf7e3bd33db5b31904ea67ba9107e83061a154fb455a6b3790228ecadf1ab3623e374e1b46b4eb4571d6bbe1632e20c4ab7a601860e662b8b23eaf5690b519c4d052f464bf886fa4d92ae6b179e7782914ffb6b31271e7e06382d59da1c29889474c5b1dea85c5ec55cc2d5ad5d6776b2d234b96e2e80ed049c3cfc645967f5d5efb1d5c707585e8fa8bbb5653bc -Len = 8191 -Result = P - -Digest = SHA512 -Msg = "" -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 085255700ee4e6964ba0a867b650f5d3cac3380b59ec58c72a5d44156f7273f7ccf88edb48a3c7f6c07dfd03b9f8a907f0e7d98e38ee174edf9fe79159cddebafe1cbd586fdaf192d347d56867b3a3eb756ee3c51afbb9f4b1ccb00059abcfa51ef3facd58af14362db77c6c8bb387a5228d105388ff31b21c0b30d90e44956dbd2d9e1b11bd362d64e1fe89ea4e21d5ee47681745a957238f6bceb748cbecb4591c093561263f22ebafcd66c9e7b2793687459752bc80cfe7a74e188433b07d941689697fbdb5eb4850f5534315360fe5b439559a93f57e3a0cad473a3debcc92304b08112c9b6ef227206d5f14a7037fd417d1c37f600c9df6f0083de6db4070781e60d3dffd4eebefe15f1adcdc74610273296a4112e8b6a4305d7f88eb3029a27e7d96dcc9549c33b1de6ec8485c925065773a0eba301b892777c4a62a0390109153e86bb012234cf2510db791618756df830a49cfa2a27fae064df4d245430084111690f21ee89507fcad3de886c9a476e75d4c18b3913db58bbdb63317300667d4478b199690eee146db164658c81e34e726dbe3eee54f655536679a618b08fe96df77554387ad1494756806881f67edbed89bd1b09bdd453d2eb84349aa813fbf982e83f1ec4dbdabc9a1f54691566f479d465cd82372d267ab98c28c5547f558b8708535a426fda410797ebd41b755cd72f7d798475d443a73271c3664c5f1ed6cc61d5f55a01b5107eb8f42123f70220dac7b3a543e8c91c5c67e20dfd41619b15e1ce4de0142b6e73ccc0994d23de5243c155020f7ad8c0e66882157da99bf76def2decbe6cb55730f1626ee24ee2e68d12efc0efa06aff03c6c25ecb292cc4645a7bd97725a3b32f0d8c4ace785991e88406541b5875db86cf8d19daeaa19f6834aafb46b8f9b0606a0905ea0f0b3671c5fb3d552acee4ce34b6fd33bd58ac36cf97e179096973c1f75b4b49e7efd931a8f3396dd2e9c22a98288933ce97ee90da8b84405fb51c78f998aaff125ee2817b5fbb45d004f6a73be6fab9a09ef86509658fefbb4cc7c1cbd3e4b0a8fc15a32d2e5e0d394c2504afa1ee72a19e72a1dc92a296047a09b557ec3e25ec430de6edd84d5a5dbf4f5344218a8921443aa1f20679e1be0e9bdbee226898c1b4bf100c0fa069ca9d11ca2560aff9a87caf328c4aa07796a9acac94bb501fbee6add688547132f1c3c37ee6e5e475f9ed97b19a47b62786826995073ffda44f8899c9ba08191777b228d33aec6e9fdd4fd20d10cc36e45d4c8b31905c0be8110add3dc573ce006bb08eb34cea61703cd8fa05e26de042be50d6f42a0ae6363bf6c5e9a3a202f41de1d098e525a2413f759483bf8b4d9956f463798028cfc5695d8cee89506eb5b4a61cd63cbb5b7738cfee0edd94be6ffa6f7c57f258f816015e9f20daeb061150e698596c3bc -Len = 8191 -Result = P - -Digest = SHA256 -Msg = 546869732069732061206c6f6e676572207465737420737472696e672e -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 0b5546c0e8bf9966ac52887133aa89150a5fe745492fe94790b6e8c06b5f091c147bf46a88b96b4e1ff39b6d8ddd999cc7271718763df7e885e53817d0d607f53aac52eec202d7183c04caa17f975c8eae3d78ac3da5c881b864ed438adaae827036756cd9df4f8fa24ef85aec221b35740c65e252880422ebf7ddf3e52b87346f8d8ed92f459fb76e866e8bf631a5b7e6d86968e5f7f64d499db7d0143ad40770c158039a3ed1205ba7ce959e837a4c23249cfec9ec56f02602c6d98cb845a1b9d041e2cc9903ac360d53d746c2d17ea7ae5f0f8642cc4047151351465c9bfe0770aa65f8ee2c3ebcd6fecd005cad15eaf6dc3a81a9d704fb5cfb13af6a848b276cdce43b5feb9c0d4b7e85f946f80ce625ba4fe885f13d1fc709df121143c3f17bf8a50845cc80d066989eaea92bd5735e753cfc9545d5bcb43f0391d4ae4569447927130efabe6e8455ed9533ebb8370a4439097dca51994c3c2ba8686e89570d9cb1f87680865371df21975b696cdc00541347008793dc641ae435b86150e5f6f06414e80f50d07cde583efb79c276d90b637935412f611552c4816c8fddf62f080e9edaba61d939c3b2d302a9e5db80f380ad73bf5c1866d8d7b25147b6b5e13ae397db234eda654fe00a839c14e13d1d725fe54a7fa3b02c6068073f7576e8b01d53f54d1287f4105ffd9d6097bed8537b9a0f97bdda2b2393a983f08fbea11ccaa7656c9347b51cb30f4f6fc22f6667309f458b8db00c9a26d733cc75465a59122e34a66d1331ffd6935f028cd2a726a5d99011b9e1806afde624bb789eb934ff2154e0c52ed22002ca86c6ab46e166923e9b91119bf1cfa7635f4053a7369adfd53df69625e6e816bb8c60cd000e4ecb5b2e40a8251ec828efca270108bde76c652e4cc3ee7e1c4dcff37a9e172c1f58f5dcb0e36c76ebc1222afbf7c4bcaf43f683e6619079a3baed0860b5ba587e7fa78f0f01c108506ffc051b4dd61e2cc0ee06093e8abb100151d37a42727001bf53186aa88d7e7cb1bb64de05bf66fb2da084740c752cb967c7b2fa15bc94a4162d3060dc074aa5f02be6b8662db73894823bb341783bb77769627347dbf481dc898a80d74a66410280c82e54b0192d45ccfa67421a9c1e23c0cd3714dc4114aa8e75ead05cf0e1521f598878ead0553d1f0924032c8ec8b62d3bea3f65286351d00c550bf22bfbdbf3f02580414ca4f97dc6d788431c9a18d56c111bf85a4fa26875fc0b4545ebb7247d8ef78f42ce715f5868602c560b77d9e51981cde571b3f53b2675c4dae28f55839106919383800a585e1d10a396f96349621957ab95fe4280ea6fcc57182e5898d67a37c85c771ce3c1eef72da0dee37dedf8f7ed741d3bad59b09bbb30defcc29484d00ae842b10f54bcb018216001f446f680e7167b3553706c1641d9b8ef5253bc -Len = 8191 -Result = P - -Digest = SHA384 -Msg = 546869732069732061206c6f6e676572207465737420737472696e672e -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 25b562e2aa341868b4aa78ff86c220330e7159bb0871f8939aed509b4e5bcb2c4ecb2cbf4c85f8a11cb3f1c9efa748225f0d944c983dd86e6faadcf3cf7cff781653300d3f826cb1dfde256c056fff1772dbbe0715c2c85615a47d07a944449f4cad63dc06cf1b0a0ed799bdccd93078888e39beacde047625fd9cfe74c2098c701ff5e6436d2d845883cb8cf8aa134a57023226bbfccbe078e356eac19b35d0be01d3d9eb383d2361874e80deaf565dcf8561a53e15ad360b2ce0b7df0eade026e951aa42dfc66cb992eea996b26f56d8a224970a4d1e42d925786d3b23215c7cc8f30377f4bec31491c865bb91760acdfb13cd500fa865741f58841fee3938203a766c72397e7ada29cc56b3f6aef82588ca993e0b6af48d2ac6274511b74e9cf06b89a8c73ca741602e7a0c6f9a6e47e87105108d55aff9afb70c14e6e74fa62ed51220fbf46be9a3101dfe1d64d4fea487e05be823fcfaeadad994f11b98b9c9b7390a96b356a32af6d4be2da0861b5b253942aa706000349e5bdead4a931ce48c99c588c9032b71963b9faf26a250483a14c10328a6a5b1ba24639ccde518b2d5fe45ac4ae81dea8c450dff8518b5b3bf5433ac7cd244585f312eef802b661c5920a549aae089c437310391019d17390ea03deb9e22be790287b3901e3e91c6ec32e00906d6475e8d5d3db229bae7321a36b5b0fc2d15a12bf63b4671029e9d9e15577aa89e6118d878f320b165e7a4a3daac770f6ee78b091644c8b542de73ca5556448b59f7c3b8653c0d9749b28e7b22dae2a788c5af003ddf5b5515413e40eb3b67f52fea4779f570585ecc0b8b535df5ce4d8db38647ec1974703e618ce52bfec5cbbea94cb8d17242f8ac9c34d209f477159d47be654a6045bba3a7ad572c1bcf3fa1ddd80dc9c98b3a2ce01dd50ae41814faa0996779e8204e3d6e36f949c5609e1a3875aa4cb00ee6f9a6a7d342feef53208ebd8167ed45c1d4720d2d781c946424b053eca7a814b6fed8dacc61c29aeaefef0f653a85324ef48b371d8873f3445bbac0833c8f5abf7aa8f4cae39567d2c902145b1c7ece8b6f0ee2ebbe6b3e571e95cc1230468e905cc2f5eb768236fa82bdffa1d9fe5d49527851ec30995559c9b60f28e8b19c1d6f69c47d782fb8a13136eed564f59aae0a0dfbb66128d83208d073adb6442de7498bd747e18214683f62b06547fa77520482d6b7e046db5dcc9a10809e8b3248e8a033ce1a8e71589c90bcd2d449f890936f8906f32b9f656056c9414c836565fc1fe8251bca7be8975ac305739569ef80df15059b408750be12ea42878ae8f617d378a6d3874ea92c700ea1b805665e1b673bdbb9dc1e2b67959d9c44d3f3fa9f6fc1a02d20dab5c900706608a19028d4a283939d2d16a495ae184bda4fdb488229e0f64334c15daf197dbc6dd213a0bc -Len = 8191 -Result = P - -Digest = SHA512 -Msg = 546869732069732061206c6f6e676572207465737420737472696e672e -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 163a1aafa96215f6ff698694f59fe97523399f214683f450f3024e6bb2523c7407ccd7024284522b957dc42aff3ef2a5738daaa88b38092880fc42b98ecdd3e09677db0c189c105f0777981d7620c0fb014c57a3e080cb5afc9ad4c0e47a0e46157ef96b01453a9aa7c99ef80976d425ccafcce990425969a30b5ce55b3fe21a0aa9acea8bd7da6cb28e835453ddc9dd93744fc324e38dca6536e96c99de965f87259f16b1e7d831148e0237f6e0c0aae2a8708f90a3274092a92b55761ab0a12ee732ddfc2acb7d559b4a0d8d5f8426c9751f5545282b8fe8748b18144bbf6f3a9fb47b9642565736fbc616fb886c28f1089123278c082b7b78bce947bd5285b9f8f5787233dba8313554b8c79686f9817626c8c1a6d641996bbfb32e8d4c0e0a07c6979976a18f0534bf31a658fdc9bd2fa3018a22c3cfbc83640c53fccd833aaf6f08ca2834a9e5c7d56302671b88605734f34189d4612d30fe6d056c77f80eda3ca6976b9ce56d90aad4ae7aad112bb47472e6402bb4c915711e2a2d027cdd9e09bfdf380d39fba15ab1cecbfcef8a78f7f7dff2a50e6413005957275835828daafcd88d091b2fe8bda117d614c3b9d5431701e9d7db071fcc232c1a4182c4dfdd233c1fb1fe6522801019ad037357139d3bba905facfd8f0314d8e4ed919972f735729bf98eb1b39483fa7d179e4b470e68868c32cefb1aed52fa4ab650d60c6655c7a8a10f82f2a427a8c3524a76318565df250027986e89f1cc18e3fc13fc32b03bfebf777aaf0155579f99befb56d043df8a99d7d7570b8af5d3c8812d3e5c9f452e894ff8686dd3a0c6849e1f24ab049497bd69ce08c9c291783f3bf3070819fcdb265aa1b40cb182782ed14f3061efca5e8da124ad48486498cfc7eaff9d2617ee1fae45b5d37d7472cf7c93d561e9208270a01adf7d3dfccb1a70fad3155c41b7f8be37b5f2d4bd3d1476f3ee11de31244ded7bf0fd85e941a50d1f28ff198bf188b7ea1bc9da2d968b519667203418d6005b3c84c13027346db4099968106a2540197f8cd87eed4eb969911707bf29160ed9178d876b284f9004d35bbb0f5ea939532fb29a2db4a052fc06e76fa7f031489fa32e25fb03fe01c7840fc01b741f4e1c2b08030222e6b59951c233354e0fa57321481e5204c792923f4b34d9521bbbad3dd2ea96debb8638dd1049b92a3356e0b4530d71bc22611ad7ee3cbd17ad425c9c17a0957c95ef8ff04832fa44993d273e927ed5e56dcef1c133f6cb57aab63eff0a420db877d424add66924efd59b9584cfa1515a8b393bfd205ecaddf4196d9a16639669b016a90ab349b65ac733112103b6610458a1a6320af4d65c4ab46dd1277a6995eb127f0aaa207dc3ee0d4c65d1224ac96da10d15ba220d096e8cc25c5f0ae0886dd76e0f3d08efb9c5fc0190d81f12261c5bbc -Len = 8191 -Result = P - -Digest = SHA256 -Msg = "" -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 23e55cbec753a80ab764cb3f9fa29b05a24f2f0b388a5e1082babf37f7d7f60c566e4452dd03fe9153f009aafc0cda10a01cf9f72a8754f618fc0b67de8b2a0cd2ba9e6c241267dcee3b04f26f23fbfa3ace11e8f1a6ca6627efe30ad1973a42983a5e29c1646ebc3a50dd34e5f4b7a28a190cd8998d55ace1f46f8c23adf039ce5b9f0eea14b2d158076d194de8d15ac28d8b907002252e224e53cf3f6d4eda63f761395a9178d0d0c3d34e4db38d4574818ee596ac34bbcdf861f13ef86ad0e8e96cd5a7c6c693676ccc625e1208c59723631f216c1155eeac9205705aad83b01a11926d8ca477d047449d3fa2068660cdc61bef02439aea352bd32da7d2e5cf2ddaccdcd6a6eb7492f3b5af9a0bdf93427ef99218bef4d72588f943bd9b8f2a404ba061feb1d48c8430b3f2fe5de5c4fe9af5a48359bd91fa5d93a4d83d96b27177769f91e1d1cb1959790e607f9d30ee44339bc4da863eb6fe8b7457b533c5e22e0bc4855a20229c7ecd193e917cb695b26a84d721f4707dac53e9485234ebeed7bb505f0fa1393aff820462bdd1e26c14c541e551ab6ffb9d7b7e280e33f7b2ec30eb14f4d635a57fb568bf9c420f197673a5cb4d8b15f9e8c743af99c2c2899e7d15d877590501644aa863c20b392e72bdc330ad192147ef171516d815c02fe0e375317b76c9df2052bd2de1b116192785b2282119f875dd89ffaf5a5c36f0524b3a4376f0381184591473a7c131d5f58bbb00b921030a96f260ee78cf1c2c25337e69b4cc42fcbd85034bd41f2c62e990fdd298fd53b453a4232b61426ac0764a5d6b8c45fb1d3004e27a1afc5ed38cf2ec4ab70521e6af5c1a2cf22306c523f87100c140525862efdd2d7eec690f34ad9a3c96c946472e622f830bf21b0c1d0690ebf6c8c98e0595e67b277d9ff43ed93ab568cab9684829f9392ab9eca7dacd191b7f263997bf5a03d4eb5115e84afcb92609554cd14ab304d912c8e9e201350a9460955edba75ba18ba4b5ef91d67950102ebc48432320ab90142fb25dd9decd6d5747255cb1fd7320f2297306c2282286338ab64b060dc0bdfd2271bbd0382d69d38988731bc80b6438a063b8d1af71c2153719a8d8dee2eebf85605a5bfcbc2d364ff291796b7c13506a33fc05dafd939ba9c700a7335cef47b0ced0bcf02722ba17821f144752ac92dda4134b0091b43141a35c53bdc896b4de809337d64caf0e9af200284f88d0f1318903a75df0d1d27f879d9b743a6eeaa9c167ef9cee9a7d0e67bf61872ce528663e4699b54231e6fc12ad41c45518aa53c24fe0cb97fe0d98c696561568d844e64a401ad70db439c978d3f1819f67e017901a307ad26556708f4e62217ab6f4575a0d4800259ea8590e3aa718ac0523330868d2907d2999dd1a1ec37bb025f47b92f505dc9315ef35d57fafa7abb11fbc -Len = 8192 -Result = P - -Digest = SHA384 -Msg = "" -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 137a60205de7c9f40c29d65a035bd96da8ec95a909f129a8f7c0be2b3ecf539f62667e51db71b8685da2cb3a727651e8fa399715262c9a4ab88bff1d8514ee299a196c75a09fbfd6b069bbc5c2d1fce2107e68fa4605086160b803a13d221d47e68c8dfd94e6cf54175588c363f5ba311a77c056c45d90fc9a60ba36ac8f07e319baf84003d2af51d313d6209aaa5ae8a3308cacaa35577a01742ea42e5cdd26ad15ee0cdde9b7776cb219532b0568909338d1096eab562a1a28261035fff7a40b35e2d988c3b9e421d3f35be3e359d325a25ce856a9077fa884fe96a287ce32eb28f5ce4a854f00575fad8fb53b5b8e405fbb3273d14eeda5141971d34d19cd50620a4ac5041c0622e43224e49df105dec2a4bd93536dfc470b363f0464ffda82ca5dfb7e2620fe210ccbc42344b85d937c6937f40ad69a5db1dc2b5b4d930cb8036d0b95644e792661f872cbe47b65f62c1fcd884c2387938fe303d3b7f1a20e989b5ed979398778924f70439df29482182478048afbb1be1da0e5961ecc38c1e9037b05bee4364877e2d090107abf8a9c46603e16c7013a370376c05daf2fcd0a705e6c9d89e611f26d84980633932951432c8df1b79864441a79cd0829dbd382794c4f77b6f8677cba13fc98fad99057289cf906d7ae2abed25e6fb4d555ebb86a5252e50eb6659ef7b7f2e1bff9a7d3910f1b0521c8108688003408bcc4aaa75c7efb27817c55fe1640fea83cbadc4e3f2a13cc56d0a544b84a7a50a34399f3d964d7ea0e9ea80001d6fd36a1516a5bca75bd83be639453a4b59cfcddebfda1e3022ece95efdc82b253c0b64b54c504f83f5cf375a1767e90eb68fe7cb93a43532c3db7e8c6446e6ac94a47e420e70531e62be6e99509ff0ba6040e39c2acb5c9d3a8c6dd92cc56962e495a1d3b67b896527902a9dd956b9e47a67b5461515b6c1211e17d05e69a7d866ed7839efab26089569867ba9736bfdba5fb8517af81410c15f1da525cb58ff8c005345a4cb42e555c8ecadb4d0f345b9afdff4fc60d810ee665327eaac60443c4ae1dc5704f8d7059630100b5ddecdaad5f114caac6a8a580ac9b7bad82195cd9561d3d4f81827f3776650c2a3f0c573c955bde7367b665d0a5a8ebd646cc230db4b4c904e6006b0a2e6546b932cbcd84a7d4ab0b2761ece96606fee0ca5fb1ed47f7a3956778bdeba4f065595b68e9e54e4c10650bf1eb23147e5ce5028a1f363f2cc17dfadf7e3bd33db5b31904ea67ba9107e83061a154fb455a6b3790228ecadf1ab3623e374e1b46b4eb4571d6bbe1632e20c4ab7a601860e662b8b23eaf5690b519c4d052f464bf886fa4d92ae6b179e7782914ffb6b31271e7e06382d59da1c29889474c5b1dea85c5ec55cc2d5ad5d6776b2d234b96e2e80ed049c3cfc645967f5d5efb1d5c707585e8fa8bbb5653bc -Len = 8192 -Result = P - -Digest = SHA512 -Msg = "" -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 485255700ee4e6964ba0a867b650f5d3cac3380b59ec58c72a5d44156f7273f7ccf88edb48a3c7f6c07dfd03b9f8a907f0e7d98e38ee174edf9fe79159cddebafe1cbd586fdaf192d347d56867b3a3eb756ee3c51afbb9f4b1ccb00059abcfa51ef3facd58af14362db77c6c8bb387a5228d105388ff31b21c0b30d90e44956dbd2d9e1b11bd362d64e1fe89ea4e21d5ee47681745a957238f6bceb748cbecb4591c093561263f22ebafcd66c9e7b2793687459752bc80cfe7a74e188433b07d941689697fbdb5eb4850f5534315360fe5b439559a93f57e3a0cad473a3debcc92304b08112c9b6ef227206d5f14a7037fd417d1c37f600c9df6f0083de6db4070781e60d3dffd4eebefe15f1adcdc74610273296a4112e8b6a4305d7f88eb3029a27e7d96dcc9549c33b1de6ec8485c925065773a0eba301b892777c4a62a0390109153e86bb012234cf2510db791618756df830a49cfa2a27fae064df4d245430084111690f21ee89507fcad3de886c9a476e75d4c18b3913db58bbdb63317300667d4478b199690eee146db164658c81e34e726dbe3eee54f655536679a618b08fe96df77554387ad1494756806881f67edbed89bd1b09bdd453d2eb84349aa813fbf982e83f1ec4dbdabc9a1f54691566f479d465cd82372d267ab98c28c5547f558b8708535a426fda410797ebd41b755cd72f7d798475d443a73271c3664c5f1ed6cc61d5f55a01b5107eb8f42123f70220dac7b3a543e8c91c5c67e20dfd41619b15e1ce4de0142b6e73ccc0994d23de5243c155020f7ad8c0e66882157da99bf76def2decbe6cb55730f1626ee24ee2e68d12efc0efa06aff03c6c25ecb292cc4645a7bd97725a3b32f0d8c4ace785991e88406541b5875db86cf8d19daeaa19f6834aafb46b8f9b0606a0905ea0f0b3671c5fb3d552acee4ce34b6fd33bd58ac36cf97e179096973c1f75b4b49e7efd931a8f3396dd2e9c22a98288933ce97ee90da8b84405fb51c78f998aaff125ee2817b5fbb45d004f6a73be6fab9a09ef86509658fefbb4cc7c1cbd3e4b0a8fc15a32d2e5e0d394c2504afa1ee72a19e72a1dc92a296047a09b557ec3e25ec430de6edd84d5a5dbf4f5344218a8921443aa1f20679e1be0e9bdbee226898c1b4bf100c0fa069ca9d11ca2560aff9a87caf328c4aa07796a9acac94bb501fbee6add688547132f1c3c37ee6e5e475f9ed97b19a47b62786826995073ffda44f8899c9ba08191777b228d33aec6e9fdd4fd20d10cc36e45d4c8b31905c0be8110add3dc573ce006bb08eb34cea61703cd8fa05e26de042be50d6f42a0ae6363bf6c5e9a3a202f41de1d098e525a2413f759483bf8b4d9956f463798028cfc5695d8cee89506eb5b4a61cd63cbb5b7738cfee0edd94be6ffa6f7c57f258f816015e9f20daeb061150e698596c3bc -Len = 8192 -Result = P - -Digest = SHA256 -Msg = 546869732069732061206c6f6e676572207465737420737472696e672e -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 0b5546c0e8bf9966ac52887133aa89150a5fe745492fe94790b6e8c06b5f091c147bf46a88b96b4e1ff39b6d8ddd999cc7271718763df7e885e53817d0d607f53aac52eec202d7183c04caa17f975c8eae3d78ac3da5c881b864ed438adaae827036756cd9df4f8fa24ef85aec221b35740c65e252880422ebf7ddf3e52b87346f8d8ed92f459fb76e866e8bf631a5b7e6d86968e5f7f64d499db7d0143ad40770c158039a3ed1205ba7ce959e837a4c23249cfec9ec56f02602c6d98cb845a1b9d041e2cc9903ac360d53d746c2d17ea7ae5f0f8642cc4047151351465c9bfe0770aa65f8ee2c3ebcd6fecd005cad15eaf6dc3a81a9d704fb5cfb13af6a848b276cdce43b5feb9c0d4b7e85f946f80ce625ba4fe885f13d1fc709df121143c3f17bf8a50845cc80d066989eaea92bd5735e753cfc9545d5bcb43f0391d4ae4569447927130efabe6e8455ed9533ebb8370a4439097dca51994c3c2ba8686e89570d9cb1f87680865371df21975b696cdc00541347008793dc641ae435b86150e5f6f06414e80f50d07cde583efb79c276d90b637935412f611552c4816c8fddf62f080e9edaba61d939c3b2d302a9e5db80f380ad73bf5c1866d8d7b25147b6b5e13ae397db234eda654fe00a839c14e13d1d725fe54a7fa3b02c6068073f7576e8b01d53f54d1287f4105ffd9d6097bed8537b9a0f97bdda2b2393a983f08fbea11ccaa7656c9347b51cb30f4f6fc22f6667309f458b8db00c9a26d733cc75465a59122e34a66d1331ffd6935f028cd2a726a5d99011b9e1806afde624bb789eb934ff2154e0c52ed22002ca86c6ab46e166923e9b91119bf1cfa7635f4053a7369adfd53df69625e6e816bb8c60cd000e4ecb5b2e40a8251ec828efca270108bde76c652e4cc3ee7e1c4dcff37a9e172c1f58f5dcb0e36c76ebc1222afbf7c4bcaf43f683e6619079a3baed0860b5ba587e7fa78f0f01c108506ffc051b4dd61e2cc0ee06093e8abb100151d37a42727001bf53186aa88d7e7cb1bb64de05bf66fb2da084740c752cb967c7b2fa15bc94a4162d3060dc074aa5f02be6b8662db73894823bb341783bb77769627347dbf481dc898a80d74a66410280c82e54b0192d45ccfa67421a9c1e23c0cd3714dc4114aa8e75ead05cf0e1521f598878ead0553d1f0924032c8ec8b62d3bea3f65286351d00c550bf22bfbdbf3f02580414ca4f97dc6d788431c9a18d56c111bf85a4fa26875fc0b4545ebb7247d8ef78f42ce715f5868602c560b77d9e51981cde571b3f53b2675c4dae28f55839106919383800a585e1d10a396f96349621957ab95fe4280ea6fcc57182e5898d67a37c85c771ce3c1eef72da0dee37dedf8f7ed741d3bad59b09bbb30defcc29484d00ae842b10f54bcb018216001f446f680e7167b3553706c1641d9b8ef5253bc -Len = 8192 -Result = P - -Digest = SHA384 -Msg = 546869732069732061206c6f6e676572207465737420737472696e672e -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 65b562e2aa341868b4aa78ff86c220330e7159bb0871f8939aed509b4e5bcb2c4ecb2cbf4c85f8a11cb3f1c9efa748225f0d944c983dd86e6faadcf3cf7cff781653300d3f826cb1dfde256c056fff1772dbbe0715c2c85615a47d07a944449f4cad63dc06cf1b0a0ed799bdccd93078888e39beacde047625fd9cfe74c2098c701ff5e6436d2d845883cb8cf8aa134a57023226bbfccbe078e356eac19b35d0be01d3d9eb383d2361874e80deaf565dcf8561a53e15ad360b2ce0b7df0eade026e951aa42dfc66cb992eea996b26f56d8a224970a4d1e42d925786d3b23215c7cc8f30377f4bec31491c865bb91760acdfb13cd500fa865741f58841fee3938203a766c72397e7ada29cc56b3f6aef82588ca993e0b6af48d2ac6274511b74e9cf06b89a8c73ca741602e7a0c6f9a6e47e87105108d55aff9afb70c14e6e74fa62ed51220fbf46be9a3101dfe1d64d4fea487e05be823fcfaeadad994f11b98b9c9b7390a96b356a32af6d4be2da0861b5b253942aa706000349e5bdead4a931ce48c99c588c9032b71963b9faf26a250483a14c10328a6a5b1ba24639ccde518b2d5fe45ac4ae81dea8c450dff8518b5b3bf5433ac7cd244585f312eef802b661c5920a549aae089c437310391019d17390ea03deb9e22be790287b3901e3e91c6ec32e00906d6475e8d5d3db229bae7321a36b5b0fc2d15a12bf63b4671029e9d9e15577aa89e6118d878f320b165e7a4a3daac770f6ee78b091644c8b542de73ca5556448b59f7c3b8653c0d9749b28e7b22dae2a788c5af003ddf5b5515413e40eb3b67f52fea4779f570585ecc0b8b535df5ce4d8db38647ec1974703e618ce52bfec5cbbea94cb8d17242f8ac9c34d209f477159d47be654a6045bba3a7ad572c1bcf3fa1ddd80dc9c98b3a2ce01dd50ae41814faa0996779e8204e3d6e36f949c5609e1a3875aa4cb00ee6f9a6a7d342feef53208ebd8167ed45c1d4720d2d781c946424b053eca7a814b6fed8dacc61c29aeaefef0f653a85324ef48b371d8873f3445bbac0833c8f5abf7aa8f4cae39567d2c902145b1c7ece8b6f0ee2ebbe6b3e571e95cc1230468e905cc2f5eb768236fa82bdffa1d9fe5d49527851ec30995559c9b60f28e8b19c1d6f69c47d782fb8a13136eed564f59aae0a0dfbb66128d83208d073adb6442de7498bd747e18214683f62b06547fa77520482d6b7e046db5dcc9a10809e8b3248e8a033ce1a8e71589c90bcd2d449f890936f8906f32b9f656056c9414c836565fc1fe8251bca7be8975ac305739569ef80df15059b408750be12ea42878ae8f617d378a6d3874ea92c700ea1b805665e1b673bdbb9dc1e2b67959d9c44d3f3fa9f6fc1a02d20dab5c900706608a19028d4a283939d2d16a495ae184bda4fdb488229e0f64334c15daf197dbc6dd213a0bc -Len = 8192 -Result = P - -Digest = SHA512 -Msg = 546869732069732061206c6f6e676572207465737420737472696e672e -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 563a1aafa96215f6ff698694f59fe97523399f214683f450f3024e6bb2523c7407ccd7024284522b957dc42aff3ef2a5738daaa88b38092880fc42b98ecdd3e09677db0c189c105f0777981d7620c0fb014c57a3e080cb5afc9ad4c0e47a0e46157ef96b01453a9aa7c99ef80976d425ccafcce990425969a30b5ce55b3fe21a0aa9acea8bd7da6cb28e835453ddc9dd93744fc324e38dca6536e96c99de965f87259f16b1e7d831148e0237f6e0c0aae2a8708f90a3274092a92b55761ab0a12ee732ddfc2acb7d559b4a0d8d5f8426c9751f5545282b8fe8748b18144bbf6f3a9fb47b9642565736fbc616fb886c28f1089123278c082b7b78bce947bd5285b9f8f5787233dba8313554b8c79686f9817626c8c1a6d641996bbfb32e8d4c0e0a07c6979976a18f0534bf31a658fdc9bd2fa3018a22c3cfbc83640c53fccd833aaf6f08ca2834a9e5c7d56302671b88605734f34189d4612d30fe6d056c77f80eda3ca6976b9ce56d90aad4ae7aad112bb47472e6402bb4c915711e2a2d027cdd9e09bfdf380d39fba15ab1cecbfcef8a78f7f7dff2a50e6413005957275835828daafcd88d091b2fe8bda117d614c3b9d5431701e9d7db071fcc232c1a4182c4dfdd233c1fb1fe6522801019ad037357139d3bba905facfd8f0314d8e4ed919972f735729bf98eb1b39483fa7d179e4b470e68868c32cefb1aed52fa4ab650d60c6655c7a8a10f82f2a427a8c3524a76318565df250027986e89f1cc18e3fc13fc32b03bfebf777aaf0155579f99befb56d043df8a99d7d7570b8af5d3c8812d3e5c9f452e894ff8686dd3a0c6849e1f24ab049497bd69ce08c9c291783f3bf3070819fcdb265aa1b40cb182782ed14f3061efca5e8da124ad48486498cfc7eaff9d2617ee1fae45b5d37d7472cf7c93d561e9208270a01adf7d3dfccb1a70fad3155c41b7f8be37b5f2d4bd3d1476f3ee11de31244ded7bf0fd85e941a50d1f28ff198bf188b7ea1bc9da2d968b519667203418d6005b3c84c13027346db4099968106a2540197f8cd87eed4eb969911707bf29160ed9178d876b284f9004d35bbb0f5ea939532fb29a2db4a052fc06e76fa7f031489fa32e25fb03fe01c7840fc01b741f4e1c2b08030222e6b59951c233354e0fa57321481e5204c792923f4b34d9521bbbad3dd2ea96debb8638dd1049b92a3356e0b4530d71bc22611ad7ee3cbd17ad425c9c17a0957c95ef8ff04832fa44993d273e927ed5e56dcef1c133f6cb57aab63eff0a420db877d424add66924efd59b9584cfa1515a8b393bfd205ecaddf4196d9a16639669b016a90ab349b65ac733112103b6610458a1a6320af4d65c4ab46dd1277a6995eb127f0aaa207dc3ee0d4c65d1224ac96da10d15ba220d096e8cc25c5f0ae0886dd76e0f3d08efb9c5fc0190d81f12261c5bbc -Len = 8192 -Result = P - -Digest = SHA256 -Msg = "" -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 23e55cbec753a80ab764cb3f9fa29b05a24f2f0b388a5e1082babf37f7d7f60c566e4452dd03fe9153f009aafc0cda10a01cf9f72a8754f618fc0b67de8b2a0cd2ba9e6c241267dcee3b04f26f23fbfa3ace11e8f1a6ca6627efe30ad1973a42983a5e29c1646ebc3a50dd34e5f4b7a28a190cd8998d55ace1f46f8c23adf039ce5b9f0eea14b2d158076d194de8d15ac28d8b907002252e224e53cf3f6d4eda63f761395a9178d0d0c3d34e4db38d4574818ee596ac34bbcdf861f13ef86b2018199c2557363663979c3c92aee2f83567d393efd19ce1a51e5c62f580aa5d330868d2907d2999dd1a1ec37bb025f47b92f505dc9315ef35d57fafa7abb11f00 -Len = 2048 -Result = F (Incorrect last byte) - -Digest = SHA256 -Msg = "" -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = dce55cbec753a80ab764cb3f9fa29b05a24f2f0b388a5e1082babf37f7d7f60c566e4452dd03fe9153f009aafc0cda10a01cf9f72a8754f618fc0b67de8b2a0cd2ba9e6c241267dcee3b04f26f23fbfa3ace11e8f1a6ca6627efe30ad1973a42983a5e29c1646ebc3a50dd34e5f4b7a28a190cd8998d55ace1f46f8c23adf039ce5b9f0eea14b2d158076d194de8d15ac28d8b907002252e224e53cf3f6d4eda63f761395a9178d0d0c3d34e4db38d4574818ee596ac34bbcdf861f13ef86b2018199c2557363663979c3c92aee2f83567d393efd19ce1a51e5c62f580aa5d330868d2907d2999dd1a1ec37bb025f47b92f505dc9315ef35d57fafa7abb11fbc -Len = 2048 -Result = F (Incorrect top bits) - -Digest = SHA256 -Msg = "" -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 23e45cbec753a80ab764cb3f9fa29b05a24f2f0b388a5e1082babf37f7d7f60c566e4452dd03fe9153f009aafc0cda10a01cf9f72a8754f618fc0b67de8b2a0cd2ba9e6c241267dcee3b04f26f23fbfa3ace11e8f1a6ca6627efe30ad1973a42983a5e29c1646ebc3a50dd34e5f4b7a28a190cd8998d55ace1f46f8c23adf039ce5b9f0eea14b2d158076d194de8d15ac28d8b907002252e224e53cf3f6d4eda63f761395a9178d0d0c3d34e4db38d4574818ee596ac34bbcdf861f13ef86b2018199c2557363663979c3c92aee2f83567d393efd19ce1a51e5c62f580aa5d330868d2907d2999dd1a1ec37bb025f47b92f505dc9315ef35d57fafa7abb11fbc -Len = 2048 -Result = F (First byte of PS is not zero) - -Digest = SHA256 -Msg = "" -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 23e55cbec753a80ab764cb3f9fa29b05a24f2f0b388a5e1082babf37f7d7f60c566e4452dd03fe9153f009aafc0cda10a01cf9f72a8754f618fc0b67de8b2a0cd2ba9e6c241267dcee3b04f26f23fbfa3ace11e8f1a6ca6627efe30ad1973a42983a5e29c1646ebc3a50dd34e5f4b7a28a190cd8998d55ace1f46f8c23adf039ce5b9f0eea14b2d158076d194de8d15ac28d8b907002252e224e53cf3f6d4eda63f761395a9178d0d0c3d34e4db38d4574818ee596ac34bbcdf861f13ef96b2018199c2557363663979c3c92aee2f83567d393efd19ce1a51e5c62f580aa5d330868d2907d2999dd1a1ec37bb025f47b92f505dc9315ef35d57fafa7abb11fbc -Len = 2048 -Result = F (Last byte of PS is not zero) - -Digest = SHA256 -Msg = "" -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 23e55cbec753a80ab764cb3f9fa29b05a24f2f0b388a5e1082babf37f7d7f60c566e4452dd03fe9153f009aafc0cda10a01cf9f72a8754f618fc0b67de8b2a0cd2ba9e6c241267dcee3b04f26f23fbfa3ace11e8f1a6ca6627efe30ad1973a42983a5e29c1646ebc3a50dd34e5f4b7a28a190cd8998d55ace1f46f8c23adf039ce5b9f0eea14b2d158076d194de8d15ac28d8b907002252e224e53cf3f6d4eda63f761395a9178d0d0c3d34e4db38d4574818ee596ac34bbcdf861f13ef86a2018199c2557363663979c3c92aee2f83567d393efd19ce1a51e5c62f580aa5d330868d2907d2999dd1a1ec37bb025f47b92f505dc9315ef35d57fafa7abb11fbc -Len = 2048 -Result = F (Byte following PS is not 0x01) - -Digest = SHA256 -Msg = "" -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 23e55cbec753a80ab764cb3f9fa29b05a24f2f0b388a5e1082babf37f7d7f60c566e4452dd03fe9153f009aafc0cda10a01cf9f72a8754f618fc0b67de8b2a0cd2ba9e6c241267dcee3b04f26f23fbfa3ace11e8f1a6ca6627efe30ad1973a42983a5e29c1646ebc3a50dd34e5f4b7a28a190cd8998d55ace1f46f8c23adf039ce5b9f0eea14b2d158076d194de8d15ac28d8b907002252e224e53cf3f6d4eda63f761395a9178d0d0c3d34e4db38d4574818ee596ac34bbcdf861f13ef86bdf18199c2557363663979c3c92aee2f83567d393efd19ce1a51e5c62f580aa5d330868d2907d2999dd1a1ec37bb025f47b92f505dc9315ef35d57fafa7abb11fbc -Len = 2048 -Result = F (Incorrect salt) - -Digest = SHA256 -Msg = "" -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 4d13c3bd731930511a0dda4c05e5de6a44f134bbd8574de0fc9eefdfb84c3823bfce96f9f0266c7a68fc99e8e507cedec9fbd9666c13fccb8d92ffed8b803f0d07b057d79522241a7a4a5adc3a88a291c4fbfab492d08847e18b80b76c3e33f5b37ec45d12b815a8fddbf94cdf80c0c4111e2a0c25924faa1cd045c4237c8007ff70064aaf1fd96d0fb34b68b045a695bd1d2bb758a1e04134a336be9fe5c4095f5944cd4ee1f4ade9ae83ef70801b96be4d7e1c3a6e14299b9668ef07cdb900dc33ecd892481b1b30c9e7bcf739d6d4fa93b6366a4c8540f566678597bae01b54519e7ede927a1e43914b1fc965bfdf3940b9bdafe34ba91e8766f8b2a439bc -Len = 2048 -Result = F (Incorrect message hash) - -Digest = SHA256 -Msg = 546869732069732061206c6f6e676572207465737420737472696e672e -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 0b5546c0e8bf9966ac52887133aa89150a5fe745492fe94790b6e8c06b5f091c147bf46a88b96b4e1ff39b6d8ddd999cc7271718763df7e885e53817d0d607f53aac52eec202d7183c04caa17f975c8eae3d78ac3da5c881b864ed438adaae827036756cd9df4f8fa24ef85aec221b35740c65e252880422ebf7ddf3e52b87346f8d8ed92f459fb76e866e8bf631a5b7e6d86968e5f7f64d499db7d0143ad40770c158039a3ed1205ba7ce959e837a4c23249cfec9ec56f02602c6d98cb844514920b1123c69f35cc6fda327b632218e575eafff76b23cb0b7e5e3a1b6ac6b84d00ae842b10f54bcb018216001f446f680e7167b3553706c1641d9b8ef525300 -Len = 2048 -Result = F (Incorrect last byte) - -Digest = SHA256 -Msg = 546869732069732061206c6f6e676572207465737420737472696e672e -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = f45546c0e8bf9966ac52887133aa89150a5fe745492fe94790b6e8c06b5f091c147bf46a88b96b4e1ff39b6d8ddd999cc7271718763df7e885e53817d0d607f53aac52eec202d7183c04caa17f975c8eae3d78ac3da5c881b864ed438adaae827036756cd9df4f8fa24ef85aec221b35740c65e252880422ebf7ddf3e52b87346f8d8ed92f459fb76e866e8bf631a5b7e6d86968e5f7f64d499db7d0143ad40770c158039a3ed1205ba7ce959e837a4c23249cfec9ec56f02602c6d98cb844514920b1123c69f35cc6fda327b632218e575eafff76b23cb0b7e5e3a1b6ac6b84d00ae842b10f54bcb018216001f446f680e7167b3553706c1641d9b8ef5253bc -Len = 2048 -Result = F (Incorrect top bits) - -Digest = SHA256 -Msg = 546869732069732061206c6f6e676572207465737420737472696e672e -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 0b5446c0e8bf9966ac52887133aa89150a5fe745492fe94790b6e8c06b5f091c147bf46a88b96b4e1ff39b6d8ddd999cc7271718763df7e885e53817d0d607f53aac52eec202d7183c04caa17f975c8eae3d78ac3da5c881b864ed438adaae827036756cd9df4f8fa24ef85aec221b35740c65e252880422ebf7ddf3e52b87346f8d8ed92f459fb76e866e8bf631a5b7e6d86968e5f7f64d499db7d0143ad40770c158039a3ed1205ba7ce959e837a4c23249cfec9ec56f02602c6d98cb844514920b1123c69f35cc6fda327b632218e575eafff76b23cb0b7e5e3a1b6ac6b84d00ae842b10f54bcb018216001f446f680e7167b3553706c1641d9b8ef5253bc -Len = 2048 -Result = F (First byte of PS is not zero) - -Digest = SHA256 -Msg = 546869732069732061206c6f6e676572207465737420737472696e672e -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 0b5546c0e8bf9966ac52887133aa89150a5fe745492fe94790b6e8c06b5f091c147bf46a88b96b4e1ff39b6d8ddd999cc7271718763df7e885e53817d0d607f53aac52eec202d7183c04caa17f975c8eae3d78ac3da5c881b864ed438adaae827036756cd9df4f8fa24ef85aec221b35740c65e252880422ebf7ddf3e52b87346f8d8ed92f459fb76e866e8bf631a5b7e6d86968e5f7f64d499db7d0143ad40770c158039a3ed1205ba7ce959e837a4c23249cfec9ec56f02602c6d98cb944514920b1123c69f35cc6fda327b632218e575eafff76b23cb0b7e5e3a1b6ac6b84d00ae842b10f54bcb018216001f446f680e7167b3553706c1641d9b8ef5253bc -Len = 2048 -Result = F (Last byte of PS is not zero) - -Digest = SHA256 -Msg = 546869732069732061206c6f6e676572207465737420737472696e672e -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 0b5546c0e8bf9966ac52887133aa89150a5fe745492fe94790b6e8c06b5f091c147bf46a88b96b4e1ff39b6d8ddd999cc7271718763df7e885e53817d0d607f53aac52eec202d7183c04caa17f975c8eae3d78ac3da5c881b864ed438adaae827036756cd9df4f8fa24ef85aec221b35740c65e252880422ebf7ddf3e52b87346f8d8ed92f459fb76e866e8bf631a5b7e6d86968e5f7f64d499db7d0143ad40770c158039a3ed1205ba7ce959e837a4c23249cfec9ec56f02602c6d98cb845514920b1123c69f35cc6fda327b632218e575eafff76b23cb0b7e5e3a1b6ac6b84d00ae842b10f54bcb018216001f446f680e7167b3553706c1641d9b8ef5253bc -Len = 2048 -Result = F (Byte following PS is not 0x01) - -Digest = SHA256 -Msg = 546869732069732061206c6f6e676572207465737420737472696e672e -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 0b5546c0e8bf9966ac52887133aa89150a5fe745492fe94790b6e8c06b5f091c147bf46a88b96b4e1ff39b6d8ddd999cc7271718763df7e885e53817d0d607f53aac52eec202d7183c04caa17f975c8eae3d78ac3da5c881b864ed438adaae827036756cd9df4f8fa24ef85aec221b35740c65e252880422ebf7ddf3e52b87346f8d8ed92f459fb76e866e8bf631a5b7e6d86968e5f7f64d499db7d0143ad40770c158039a3ed1205ba7ce959e837a4c23249cfec9ec56f02602c6d98cb844ae4920b1123c69f35cc6fda327b632218e575eafff76b23cb0b7e5e3a1b6ac6b84d00ae842b10f54bcb018216001f446f680e7167b3553706c1641d9b8ef5253bc -Len = 2048 -Result = F (Incorrect salt) - -Digest = SHA256 -Msg = 546869732069732061206c6f6e676572207465737420737472696e672e -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 4d13c3bd731930511a0dda4c05e5de6a44f134bbd8574de0fc9eefdfb84c3823bfce96f9f0266c7a68fc99e8e507cedec9fbd9666c13fccb8d92ffed8b803f0d07b057d79522241a7a4a5adc3a88a291c4fbfab492d08847e18b80b76c3e33f5b37ec45d12b815a8fddbf94cdf80c0c4111e2a0c25924faa1cd045c4237c8007ff70064aaf1fd96d0fb34b68b045a695bd1d2bb758a1e04134a336be9fe5c4095f5944cd4ee1f4ade9ae83ef70801b96be4d7e1c3a6e14299b9668ef07cdb900dc33ecd892481b1b30c9e7bcf739d6d4fa93b6366a4c8540f566678597bae01b54519e7ede927a1e43914b1fc965bfdf3940b9bdafe34ba91e8766f8b2a439bc -Len = 2048 -Result = F (Incorrect message hash) - -Digest = SHA256 -Msg = "" -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 0023e55cbec753a80ab764cb3f9fa29b05a24f2f0b388a5e1082babf37f7d7f60c566e4452dd03fe9153f009aafc0cda10a01cf9f72a8754f618fc0b67de8b2a0cd2ba9e6c241267dcee3b04f26f23fbfa3ace11e8f1a6ca6627efe30ad1973a42983a5e29c1646ebc3a50dd34e5f4b7a28a190cd8998d55ace1f46f8c23adf039ce5b9f0eea14b2d158076d194de8d15ac28d8b907002252e224e53cf3f6d4eda63f761395a9178d0d0c3d34e4db38d4574818ee596ac34bbcdf861f13ef86b2018199c2557363663979c3c92aee2f83567d393efd19ce1a51e5c62f580aa5d330868d2907d2999dd1a1ec37bb025f47b92f505dc9315ef35d57fafa7abb11f00 -Len = 2049 -Result = F (Incorrect last byte) - -Digest = SHA256 -Msg = "" -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 23e55cbec753a80ab764cb3f9fa29b05a24f2f0b388a5e1082babf37f7d7f60c566e4452dd03fe9153f009aafc0cda10a01cf9f72a8754f618fc0b67de8b2a0cd2ba9e6c241267dcee3b04f26f23fbfa3ace11e8f1a6ca6627efe30ad1973a42983a5e29c1646ebc3a50dd34e5f4b7a28a190cd8998d55ace1f46f8c23adf039ce5b9f0eea14b2d158076d194de8d15ac28d8b907002252e224e53cf3f6d4eda63f761395a9178d0d0c3d34e4db38d4574818ee596ac34bbcdf861f13ef86b2018199c2557363663979c3c92aee2f83567d393efd19ce1a51e5c62f580aa5d330868d2907d2999dd1a1ec37bb025f47b92f505dc9315ef35d57fafa7abb11fbc -Len = 2049 -Result = F (Missing leading zero byte) - -Digest = SHA256 -Msg = "" -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 0123e55cbec753a80ab764cb3f9fa29b05a24f2f0b388a5e1082babf37f7d7f60c566e4452dd03fe9153f009aafc0cda10a01cf9f72a8754f618fc0b67de8b2a0cd2ba9e6c241267dcee3b04f26f23fbfa3ace11e8f1a6ca6627efe30ad1973a42983a5e29c1646ebc3a50dd34e5f4b7a28a190cd8998d55ace1f46f8c23adf039ce5b9f0eea14b2d158076d194de8d15ac28d8b907002252e224e53cf3f6d4eda63f761395a9178d0d0c3d34e4db38d4574818ee596ac34bbcdf861f13ef86b2018199c2557363663979c3c92aee2f83567d393efd19ce1a51e5c62f580aa5d330868d2907d2999dd1a1ec37bb025f47b92f505dc9315ef35d57fafa7abb11fbc -Len = 2049 -Result = F (Incorrect leading byte) - -Digest = SHA256 -Msg = "" -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 0023e45cbec753a80ab764cb3f9fa29b05a24f2f0b388a5e1082babf37f7d7f60c566e4452dd03fe9153f009aafc0cda10a01cf9f72a8754f618fc0b67de8b2a0cd2ba9e6c241267dcee3b04f26f23fbfa3ace11e8f1a6ca6627efe30ad1973a42983a5e29c1646ebc3a50dd34e5f4b7a28a190cd8998d55ace1f46f8c23adf039ce5b9f0eea14b2d158076d194de8d15ac28d8b907002252e224e53cf3f6d4eda63f761395a9178d0d0c3d34e4db38d4574818ee596ac34bbcdf861f13ef86b2018199c2557363663979c3c92aee2f83567d393efd19ce1a51e5c62f580aa5d330868d2907d2999dd1a1ec37bb025f47b92f505dc9315ef35d57fafa7abb11fbc -Len = 2049 -Result = F (First byte of PS is not zero) - -Digest = SHA256 -Msg = "" -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 0023e55cbec753a80ab764cb3f9fa29b05a24f2f0b388a5e1082babf37f7d7f60c566e4452dd03fe9153f009aafc0cda10a01cf9f72a8754f618fc0b67de8b2a0cd2ba9e6c241267dcee3b04f26f23fbfa3ace11e8f1a6ca6627efe30ad1973a42983a5e29c1646ebc3a50dd34e5f4b7a28a190cd8998d55ace1f46f8c23adf039ce5b9f0eea14b2d158076d194de8d15ac28d8b907002252e224e53cf3f6d4eda63f761395a9178d0d0c3d34e4db38d4574818ee596ac34bbcdf861f13ef96b2018199c2557363663979c3c92aee2f83567d393efd19ce1a51e5c62f580aa5d330868d2907d2999dd1a1ec37bb025f47b92f505dc9315ef35d57fafa7abb11fbc -Len = 2049 -Result = F (Last byte of PS is not zero) - -Digest = SHA256 -Msg = "" -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 0023e55cbec753a80ab764cb3f9fa29b05a24f2f0b388a5e1082babf37f7d7f60c566e4452dd03fe9153f009aafc0cda10a01cf9f72a8754f618fc0b67de8b2a0cd2ba9e6c241267dcee3b04f26f23fbfa3ace11e8f1a6ca6627efe30ad1973a42983a5e29c1646ebc3a50dd34e5f4b7a28a190cd8998d55ace1f46f8c23adf039ce5b9f0eea14b2d158076d194de8d15ac28d8b907002252e224e53cf3f6d4eda63f761395a9178d0d0c3d34e4db38d4574818ee596ac34bbcdf861f13ef86a2018199c2557363663979c3c92aee2f83567d393efd19ce1a51e5c62f580aa5d330868d2907d2999dd1a1ec37bb025f47b92f505dc9315ef35d57fafa7abb11fbc -Len = 2049 -Result = F (Byte following PS is not 0x01) - -Digest = SHA256 -Msg = "" -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 0023e55cbec753a80ab764cb3f9fa29b05a24f2f0b388a5e1082babf37f7d7f60c566e4452dd03fe9153f009aafc0cda10a01cf9f72a8754f618fc0b67de8b2a0cd2ba9e6c241267dcee3b04f26f23fbfa3ace11e8f1a6ca6627efe30ad1973a42983a5e29c1646ebc3a50dd34e5f4b7a28a190cd8998d55ace1f46f8c23adf039ce5b9f0eea14b2d158076d194de8d15ac28d8b907002252e224e53cf3f6d4eda63f761395a9178d0d0c3d34e4db38d4574818ee596ac34bbcdf861f13ef86bdf18199c2557363663979c3c92aee2f83567d393efd19ce1a51e5c62f580aa5d330868d2907d2999dd1a1ec37bb025f47b92f505dc9315ef35d57fafa7abb11fbc -Len = 2049 -Result = F (Incorrect salt) - -Digest = SHA256 -Msg = "" -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 00cd13c3bd731930511a0dda4c05e5de6a44f134bbd8574de0fc9eefdfb84c3823bfce96f9f0266c7a68fc99e8e507cedec9fbd9666c13fccb8d92ffed8b803f0d07b057d79522241a7a4a5adc3a88a291c4fbfab492d08847e18b80b76c3e33f5b37ec45d12b815a8fddbf94cdf80c0c4111e2a0c25924faa1cd045c4237c8007ff70064aaf1fd96d0fb34b68b045a695bd1d2bb758a1e04134a336be9fe5c4095f5944cd4ee1f4ade9ae83ef70801b96be4d7e1c3a6e14299b9668ef07cdb900dc33ecd892481b1b30c9e7bcf739d6d4fa93b6366a4c8540f566678597bae01b54519e7ede927a1e43914b1fc965bfdf3940b9bdafe34ba91e8766f8b2a439bc -Len = 2049 -Result = F (Incorrect message hash) - -Digest = SHA256 -Msg = "" -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 23e55cbec753a80ab764cb3f9fa29b05a24f2f0b388a5e1082babf37f7d7f60c566e4452dd03fe9153f009aafc0cda10a01cf9f72a8754f618fc0b67de8b2a0cd2ba9e6c241267dcee3b04f26f23fbfa3ace11e8f1a6ca6627efe30ad1973a42983a5e29c1646ebc3a50dd34e5f4b7a28a190cd8998d55ace1f46f8c23adf039ce5b9f0eea14b2d158076d194de8d15ac28d8b907002252e224e53cf3f6d4eda63f761395a9178d0d0c3d34e4db38d4574818ee596ac34bbcdf861f13ef86ad0e8e96cd5a7c6c693676ccc625e1208c59723631f216c1155eeac9205705aad83b01a11926d8ca477d047449d3fa2068660cdc61bef02439aea352bd32da7d2e5cf2ddaccdcd6a6eb7492f3b5af9a0bdf93427ef99218bef4d72588f943bd9b8f2a404ba061feb1d48c8430b3f2fe5de5c4fe9af5a48359bd91fa5d93a4d83d96b27177769f91e1d1cb1959790e607f9d30ee44339bc4da863eb6fe8b7457b533c5e22e0bc4855a20229c7ecd193e917cb695b26a84d721f4707dac53e9485234ebeed7bb505f0fa1393aff820462bdd1e26c14c541e551ab6ffb9d7b7e280e33f7b2ec30eb14f4d635a57fb568bf9c420f197673a5cb4d8b15f9e8c743af983232796e8de52887a9f5f194ba589332fbc9de824d33c05de9d1b71fe7e5e628330868d2907d2999dd1a1ec37bb025f47b92f505dc9315ef35d57fafa7abb11f00 -Len = 4095 -Result = F (Incorrect last byte) - -Digest = SHA256 -Msg = "" -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = dce55cbec753a80ab764cb3f9fa29b05a24f2f0b388a5e1082babf37f7d7f60c566e4452dd03fe9153f009aafc0cda10a01cf9f72a8754f618fc0b67de8b2a0cd2ba9e6c241267dcee3b04f26f23fbfa3ace11e8f1a6ca6627efe30ad1973a42983a5e29c1646ebc3a50dd34e5f4b7a28a190cd8998d55ace1f46f8c23adf039ce5b9f0eea14b2d158076d194de8d15ac28d8b907002252e224e53cf3f6d4eda63f761395a9178d0d0c3d34e4db38d4574818ee596ac34bbcdf861f13ef86ad0e8e96cd5a7c6c693676ccc625e1208c59723631f216c1155eeac9205705aad83b01a11926d8ca477d047449d3fa2068660cdc61bef02439aea352bd32da7d2e5cf2ddaccdcd6a6eb7492f3b5af9a0bdf93427ef99218bef4d72588f943bd9b8f2a404ba061feb1d48c8430b3f2fe5de5c4fe9af5a48359bd91fa5d93a4d83d96b27177769f91e1d1cb1959790e607f9d30ee44339bc4da863eb6fe8b7457b533c5e22e0bc4855a20229c7ecd193e917cb695b26a84d721f4707dac53e9485234ebeed7bb505f0fa1393aff820462bdd1e26c14c541e551ab6ffb9d7b7e280e33f7b2ec30eb14f4d635a57fb568bf9c420f197673a5cb4d8b15f9e8c743af983232796e8de52887a9f5f194ba589332fbc9de824d33c05de9d1b71fe7e5e628330868d2907d2999dd1a1ec37bb025f47b92f505dc9315ef35d57fafa7abb11fbc -Len = 4095 -Result = F (Incorrect top bits) - -Digest = SHA256 -Msg = "" -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 23e45cbec753a80ab764cb3f9fa29b05a24f2f0b388a5e1082babf37f7d7f60c566e4452dd03fe9153f009aafc0cda10a01cf9f72a8754f618fc0b67de8b2a0cd2ba9e6c241267dcee3b04f26f23fbfa3ace11e8f1a6ca6627efe30ad1973a42983a5e29c1646ebc3a50dd34e5f4b7a28a190cd8998d55ace1f46f8c23adf039ce5b9f0eea14b2d158076d194de8d15ac28d8b907002252e224e53cf3f6d4eda63f761395a9178d0d0c3d34e4db38d4574818ee596ac34bbcdf861f13ef86ad0e8e96cd5a7c6c693676ccc625e1208c59723631f216c1155eeac9205705aad83b01a11926d8ca477d047449d3fa2068660cdc61bef02439aea352bd32da7d2e5cf2ddaccdcd6a6eb7492f3b5af9a0bdf93427ef99218bef4d72588f943bd9b8f2a404ba061feb1d48c8430b3f2fe5de5c4fe9af5a48359bd91fa5d93a4d83d96b27177769f91e1d1cb1959790e607f9d30ee44339bc4da863eb6fe8b7457b533c5e22e0bc4855a20229c7ecd193e917cb695b26a84d721f4707dac53e9485234ebeed7bb505f0fa1393aff820462bdd1e26c14c541e551ab6ffb9d7b7e280e33f7b2ec30eb14f4d635a57fb568bf9c420f197673a5cb4d8b15f9e8c743af983232796e8de52887a9f5f194ba589332fbc9de824d33c05de9d1b71fe7e5e628330868d2907d2999dd1a1ec37bb025f47b92f505dc9315ef35d57fafa7abb11fbc -Len = 4095 -Result = F (First byte of PS is not zero) - -Digest = SHA256 -Msg = "" -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 23e55cbec753a80ab764cb3f9fa29b05a24f2f0b388a5e1082babf37f7d7f60c566e4452dd03fe9153f009aafc0cda10a01cf9f72a8754f618fc0b67de8b2a0cd2ba9e6c241267dcee3b04f26f23fbfa3ace11e8f1a6ca6627efe30ad1973a42983a5e29c1646ebc3a50dd34e5f4b7a28a190cd8998d55ace1f46f8c23adf039ce5b9f0eea14b2d158076d194de8d15ac28d8b907002252e224e53cf3f6d4eda63f761395a9178d0d0c3d34e4db38d4574818ee596ac34bbcdf861f13ef86ad0e8e96cd5a7c6c693676ccc625e1208c59723631f216c1155eeac9205705aad83b01a11926d8ca477d047449d3fa2068660cdc61bef02439aea352bd32da7d2e5cf2ddaccdcd6a6eb7492f3b5af9a0bdf93427ef99218bef4d72588f943bd9b8f2a404ba061feb1d48c8430b3f2fe5de5c4fe9af5a48359bd91fa5d93a4d83d96b27177769f91e1d1cb1959790e607f9d30ee44339bc4da863eb6fe8b7457b533c5e22e0bc4855a20229c7ecd193e917cb695b26a84d721f4707dac53e9485234ebeed7bb505f0fa1393aff820462bdd1e26c14c541e551ab6ffb9d7b7e280e33f7b2ec30eb14f4d635a57fb568bf9c420f197673a5cb4d8b15f9e8c743ae983232796e8de52887a9f5f194ba589332fbc9de824d33c05de9d1b71fe7e5e628330868d2907d2999dd1a1ec37bb025f47b92f505dc9315ef35d57fafa7abb11fbc -Len = 4095 -Result = F (Last byte of PS is not zero) - -Digest = SHA256 -Msg = "" -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 23e55cbec753a80ab764cb3f9fa29b05a24f2f0b388a5e1082babf37f7d7f60c566e4452dd03fe9153f009aafc0cda10a01cf9f72a8754f618fc0b67de8b2a0cd2ba9e6c241267dcee3b04f26f23fbfa3ace11e8f1a6ca6627efe30ad1973a42983a5e29c1646ebc3a50dd34e5f4b7a28a190cd8998d55ace1f46f8c23adf039ce5b9f0eea14b2d158076d194de8d15ac28d8b907002252e224e53cf3f6d4eda63f761395a9178d0d0c3d34e4db38d4574818ee596ac34bbcdf861f13ef86ad0e8e96cd5a7c6c693676ccc625e1208c59723631f216c1155eeac9205705aad83b01a11926d8ca477d047449d3fa2068660cdc61bef02439aea352bd32da7d2e5cf2ddaccdcd6a6eb7492f3b5af9a0bdf93427ef99218bef4d72588f943bd9b8f2a404ba061feb1d48c8430b3f2fe5de5c4fe9af5a48359bd91fa5d93a4d83d96b27177769f91e1d1cb1959790e607f9d30ee44339bc4da863eb6fe8b7457b533c5e22e0bc4855a20229c7ecd193e917cb695b26a84d721f4707dac53e9485234ebeed7bb505f0fa1393aff820462bdd1e26c14c541e551ab6ffb9d7b7e280e33f7b2ec30eb14f4d635a57fb568bf9c420f197673a5cb4d8b15f9e8c743af993232796e8de52887a9f5f194ba589332fbc9de824d33c05de9d1b71fe7e5e628330868d2907d2999dd1a1ec37bb025f47b92f505dc9315ef35d57fafa7abb11fbc -Len = 4095 -Result = F (Byte following PS is not 0x01) - -Digest = SHA256 -Msg = "" -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 23e55cbec753a80ab764cb3f9fa29b05a24f2f0b388a5e1082babf37f7d7f60c566e4452dd03fe9153f009aafc0cda10a01cf9f72a8754f618fc0b67de8b2a0cd2ba9e6c241267dcee3b04f26f23fbfa3ace11e8f1a6ca6627efe30ad1973a42983a5e29c1646ebc3a50dd34e5f4b7a28a190cd8998d55ace1f46f8c23adf039ce5b9f0eea14b2d158076d194de8d15ac28d8b907002252e224e53cf3f6d4eda63f761395a9178d0d0c3d34e4db38d4574818ee596ac34bbcdf861f13ef86ad0e8e96cd5a7c6c693676ccc625e1208c59723631f216c1155eeac9205705aad83b01a11926d8ca477d047449d3fa2068660cdc61bef02439aea352bd32da7d2e5cf2ddaccdcd6a6eb7492f3b5af9a0bdf93427ef99218bef4d72588f943bd9b8f2a404ba061feb1d48c8430b3f2fe5de5c4fe9af5a48359bd91fa5d93a4d83d96b27177769f91e1d1cb1959790e607f9d30ee44339bc4da863eb6fe8b7457b533c5e22e0bc4855a20229c7ecd193e917cb695b26a84d721f4707dac53e9485234ebeed7bb505f0fa1393aff820462bdd1e26c14c541e551ab6ffb9d7b7e280e33f7b2ec30eb14f4d635a57fb568bf9c420f197673a5cb4d8b15f9e8c743af98cd32796e8de52887a9f5f194ba589332fbc9de824d33c05de9d1b71fe7e5e628330868d2907d2999dd1a1ec37bb025f47b92f505dc9315ef35d57fafa7abb11fbc -Len = 4095 -Result = F (Incorrect salt) - -Digest = SHA256 -Msg = "" -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 0d13c3bd731930511a0dda4c05e5de6a44f134bbd8574de0fc9eefdfb84c3823bfce96f9f0266c7a68fc99e8e507cedec9fbd9666c13fccb8d92ffed8b803f0d07b057d79522241a7a4a5adc3a88a291c4fbfab492d08847e18b80b76c3e33f5b37ec45d12b815a8fddbf94cdf80c0c4111e2a0c25924faa1cd045c4237c8007ff70064aaf1fd96d0fb34b68b045a695bd1d2bb758a1e04134a336be9fe5c4095f5944cd4ee1f4ade9ae83ef70801b96be4d7e1c3a6e14299b9668ef07cdb8f02cc31c2862b8ebebc039174c07c926240a6346c69abc75b005969775674a102f664b86f945ff2854879087d364f3117a276492dee29b317249180bd8cb9b6f10aefc6d5b0a09f278fc85f82055a45ebf2b67f75dfb913f72317ff2b1ef96edfce03fbe2e4ffa06078e9546a7f603b8af643be504b537309cfa93a0a1a0aa6352d84f955999b8f275249126a1d5239d043b6208355be3ab515c525ff9f37232f1ef4bc87ef807c7e6f9b80c58a190b2d80cbca97b380708f2902477663a0ebc751fdf4e6fb12a581a271cd8c1ac1b76460bc6618467ff770835bdd2aae4aa5e7438ba762d6b6204b0bcadc2b9b6737aa73befbb09673f0b647365c3ee3fc8aa3612c702d923d93338ef2b692f2fbaed51fd04624f0005aae511853dd00312861b54519e7ede927a1e43914b1fc965bfdf3940b9bdafe34ba91e8766f8b2a439bc -Len = 4095 -Result = F (Incorrect message hash) - -Digest = SHA384 -Msg = "" -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 137a60205de7c9f40c29d65a035bd96da8ec95a909f129a8f7c0be2b3ecf539f62667e51db71b8685da2cb3a727651e8fa399715262c9a4ab88bff1d8514ee299a196c75a09fbfd6b069bbc5c2d1fce2107e68fa4605086160b803a13d221d47e68c8dfd94e6cf54175588c363f5ba311a77c056c45d90fc9a60ba36ac8f07e319baf84003d2af51d313d6209aaa5ae8a3308cacaa35577a01742ea42e5cdd26ad15ee0cdde9b7776cb219532b0568909338d1096eab562a1a28261035fff7a40b35e2d988c3b9e421d3f35be3e359d325a25ce856a9077fa884fe96a287ce32eb28f5ce4a854f00575fad8fb53b5b8e405fbb3273d14eeda5141971d34d19cd50620a4ac5041c0622e43224e49df105dec2a4bd93536dfc470b363f0464ffda82ca5dfb7e2620fe210ccbc42344b85d937c6937f40ad69a5db1dc2b5b4d930cb8036d0b95644e792661f872cbe47b65f62c1fcd884c2387938fe303d3b7f1a20e989b5ed979398778924f70439df29482182478048afbb1be1da0e5961ecc38c1e9037b05bee4364877e2d090107abf8a9c46603e16c7013a370376c05daedf3dfa80ae9c6d7916e1029d7468f6c363d9a1b3dc7d01476894b4ea893df8d92b237289bcbf874608978c4ae30c680ac29889474c5b1dea85c5ec55cc2d5ad5d6776b2d234b96e2e80ed049c3cfc645967f5d5efb1d5c707585e8fa8bbb565300 -Len = 4096 -Result = F (Incorrect last byte) - -Digest = SHA384 -Msg = "" -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = ec7a60205de7c9f40c29d65a035bd96da8ec95a909f129a8f7c0be2b3ecf539f62667e51db71b8685da2cb3a727651e8fa399715262c9a4ab88bff1d8514ee299a196c75a09fbfd6b069bbc5c2d1fce2107e68fa4605086160b803a13d221d47e68c8dfd94e6cf54175588c363f5ba311a77c056c45d90fc9a60ba36ac8f07e319baf84003d2af51d313d6209aaa5ae8a3308cacaa35577a01742ea42e5cdd26ad15ee0cdde9b7776cb219532b0568909338d1096eab562a1a28261035fff7a40b35e2d988c3b9e421d3f35be3e359d325a25ce856a9077fa884fe96a287ce32eb28f5ce4a854f00575fad8fb53b5b8e405fbb3273d14eeda5141971d34d19cd50620a4ac5041c0622e43224e49df105dec2a4bd93536dfc470b363f0464ffda82ca5dfb7e2620fe210ccbc42344b85d937c6937f40ad69a5db1dc2b5b4d930cb8036d0b95644e792661f872cbe47b65f62c1fcd884c2387938fe303d3b7f1a20e989b5ed979398778924f70439df29482182478048afbb1be1da0e5961ecc38c1e9037b05bee4364877e2d090107abf8a9c46603e16c7013a370376c05daedf3dfa80ae9c6d7916e1029d7468f6c363d9a1b3dc7d01476894b4ea893df8d92b237289bcbf874608978c4ae30c680ac29889474c5b1dea85c5ec55cc2d5ad5d6776b2d234b96e2e80ed049c3cfc645967f5d5efb1d5c707585e8fa8bbb5653bc -Len = 4096 -Result = F (Incorrect top bits) - -Digest = SHA384 -Msg = "" -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 137b60205de7c9f40c29d65a035bd96da8ec95a909f129a8f7c0be2b3ecf539f62667e51db71b8685da2cb3a727651e8fa399715262c9a4ab88bff1d8514ee299a196c75a09fbfd6b069bbc5c2d1fce2107e68fa4605086160b803a13d221d47e68c8dfd94e6cf54175588c363f5ba311a77c056c45d90fc9a60ba36ac8f07e319baf84003d2af51d313d6209aaa5ae8a3308cacaa35577a01742ea42e5cdd26ad15ee0cdde9b7776cb219532b0568909338d1096eab562a1a28261035fff7a40b35e2d988c3b9e421d3f35be3e359d325a25ce856a9077fa884fe96a287ce32eb28f5ce4a854f00575fad8fb53b5b8e405fbb3273d14eeda5141971d34d19cd50620a4ac5041c0622e43224e49df105dec2a4bd93536dfc470b363f0464ffda82ca5dfb7e2620fe210ccbc42344b85d937c6937f40ad69a5db1dc2b5b4d930cb8036d0b95644e792661f872cbe47b65f62c1fcd884c2387938fe303d3b7f1a20e989b5ed979398778924f70439df29482182478048afbb1be1da0e5961ecc38c1e9037b05bee4364877e2d090107abf8a9c46603e16c7013a370376c05daedf3dfa80ae9c6d7916e1029d7468f6c363d9a1b3dc7d01476894b4ea893df8d92b237289bcbf874608978c4ae30c680ac29889474c5b1dea85c5ec55cc2d5ad5d6776b2d234b96e2e80ed049c3cfc645967f5d5efb1d5c707585e8fa8bbb5653bc -Len = 4096 -Result = F (First byte of PS is not zero) - -Digest = SHA384 -Msg = "" -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 137a60205de7c9f40c29d65a035bd96da8ec95a909f129a8f7c0be2b3ecf539f62667e51db71b8685da2cb3a727651e8fa399715262c9a4ab88bff1d8514ee299a196c75a09fbfd6b069bbc5c2d1fce2107e68fa4605086160b803a13d221d47e68c8dfd94e6cf54175588c363f5ba311a77c056c45d90fc9a60ba36ac8f07e319baf84003d2af51d313d6209aaa5ae8a3308cacaa35577a01742ea42e5cdd26ad15ee0cdde9b7776cb219532b0568909338d1096eab562a1a28261035fff7a40b35e2d988c3b9e421d3f35be3e359d325a25ce856a9077fa884fe96a287ce32eb28f5ce4a854f00575fad8fb53b5b8e405fbb3273d14eeda5141971d34d19cd50620a4ac5041c0622e43224e49df105dec2a4bd93536dfc470b363f0464ffda82ca5dfb7e2620fe210ccbc42344b85d937c6937f40ad69a5db1dc2b5b4d930cb8036d0b95644e792661f872cbe47b65f62c1fcd884c2387938fe303d3b7f1a20e989b5ed979398778924f70439df29482182478048afbb1be1da0e5961ecc38c1e9037b05bee4364877e2d090107abf8a9c46603e16c7013a370376c05caedf3dfa80ae9c6d7916e1029d7468f6c363d9a1b3dc7d01476894b4ea893df8d92b237289bcbf874608978c4ae30c680ac29889474c5b1dea85c5ec55cc2d5ad5d6776b2d234b96e2e80ed049c3cfc645967f5d5efb1d5c707585e8fa8bbb5653bc -Len = 4096 -Result = F (Last byte of PS is not zero) - -Digest = SHA384 -Msg = "" -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 137a60205de7c9f40c29d65a035bd96da8ec95a909f129a8f7c0be2b3ecf539f62667e51db71b8685da2cb3a727651e8fa399715262c9a4ab88bff1d8514ee299a196c75a09fbfd6b069bbc5c2d1fce2107e68fa4605086160b803a13d221d47e68c8dfd94e6cf54175588c363f5ba311a77c056c45d90fc9a60ba36ac8f07e319baf84003d2af51d313d6209aaa5ae8a3308cacaa35577a01742ea42e5cdd26ad15ee0cdde9b7776cb219532b0568909338d1096eab562a1a28261035fff7a40b35e2d988c3b9e421d3f35be3e359d325a25ce856a9077fa884fe96a287ce32eb28f5ce4a854f00575fad8fb53b5b8e405fbb3273d14eeda5141971d34d19cd50620a4ac5041c0622e43224e49df105dec2a4bd93536dfc470b363f0464ffda82ca5dfb7e2620fe210ccbc42344b85d937c6937f40ad69a5db1dc2b5b4d930cb8036d0b95644e792661f872cbe47b65f62c1fcd884c2387938fe303d3b7f1a20e989b5ed979398778924f70439df29482182478048afbb1be1da0e5961ecc38c1e9037b05bee4364877e2d090107abf8a9c46603e16c7013a370376c05dafdf3dfa80ae9c6d7916e1029d7468f6c363d9a1b3dc7d01476894b4ea893df8d92b237289bcbf874608978c4ae30c680ac29889474c5b1dea85c5ec55cc2d5ad5d6776b2d234b96e2e80ed049c3cfc645967f5d5efb1d5c707585e8fa8bbb5653bc -Len = 4096 -Result = F (Byte following PS is not 0x01) - -Digest = SHA384 -Msg = "" -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 137a60205de7c9f40c29d65a035bd96da8ec95a909f129a8f7c0be2b3ecf539f62667e51db71b8685da2cb3a727651e8fa399715262c9a4ab88bff1d8514ee299a196c75a09fbfd6b069bbc5c2d1fce2107e68fa4605086160b803a13d221d47e68c8dfd94e6cf54175588c363f5ba311a77c056c45d90fc9a60ba36ac8f07e319baf84003d2af51d313d6209aaa5ae8a3308cacaa35577a01742ea42e5cdd26ad15ee0cdde9b7776cb219532b0568909338d1096eab562a1a28261035fff7a40b35e2d988c3b9e421d3f35be3e359d325a25ce856a9077fa884fe96a287ce32eb28f5ce4a854f00575fad8fb53b5b8e405fbb3273d14eeda5141971d34d19cd50620a4ac5041c0622e43224e49df105dec2a4bd93536dfc470b363f0464ffda82ca5dfb7e2620fe210ccbc42344b85d937c6937f40ad69a5db1dc2b5b4d930cb8036d0b95644e792661f872cbe47b65f62c1fcd884c2387938fe303d3b7f1a20e989b5ed979398778924f70439df29482182478048afbb1be1da0e5961ecc38c1e9037b05bee4364877e2d090107abf8a9c46603e16c7013a370376c05dae203dfa80ae9c6d7916e1029d7468f6c363d9a1b3dc7d01476894b4ea893df8d92b237289bcbf874608978c4ae30c680ac29889474c5b1dea85c5ec55cc2d5ad5d6776b2d234b96e2e80ed049c3cfc645967f5d5efb1d5c707585e8fa8bbb5653bc -Len = 4096 -Result = F (Incorrect salt) - -Digest = SHA384 -Msg = "" -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 5c7fa159e0a1850fe9e68ae0b5c7bf5463e4d9dee092853d51b8ddf33246548c4590ebe1032a5cf9a681b755d57d830dc8080189c8865a5262eea7d3b06d0aa6da2aca63ff513153ae49abd3bed5946ad823bf635fc4ae2d3b44e724b4ed7c5d414099b9bd0170259ca2a330b78de35091531a6701f8558590e5c02342ac082dbdbb8e766c45ff7b29bf5fc018af30967fbe694aedc85543a2aed12483a79b7b5e2e29bc2975cf3e766a62f24bd845d9388a2f9c34bbe716db0afd82f01603cd0b2ab94c0a48f8b583566d41fde7a5374bd048db0d63d9c03f5b2cf5e9f925c96b9fdf6f267e4121ed6ca72bd645bd41d443ffe6e729d069602344d02e3fccab3b9189511cfa0500e175715b9c4924f55d7b32482a396b36ad44a847b11564c2d3a1a0a48500d9784f3b7b6e2c63778f61bcf9afada5a35c1121f17f465477ef437b506e92b5cad3b95ed4683047003e0fffd2ecde0d0c89381b2a4e3b295084fd926db58f9b80261183725564b8d654f0302d5cfe8d9af0132ca11720f60a0d72db898c25d2784069a3c2d46c637371e96bcb3c53f15194c1318962fd4357d552fd14842615976aef266ed9637a33d90bbf3ab69595369a7065be90f0f24b21203de20cb30374b473919f8aca7b0c4544f976e720c05f87d02b4efa8871318da27238ad1b6414d83ad6499efe86071e6fe0b3c396d408593d60a2a524630bbc -Len = 4096 -Result = F (Incorrect message hash) - -Digest = SHA512 -Msg = "" -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 485255700ee4e6964ba0a867b650f5d3cac3380b59ec58c72a5d44156f7273f7ccf88edb48a3c7f6c07dfd03b9f8a907f0e7d98e38ee174edf9fe79159cddebafe1cbd586fdaf192d347d56867b3a3eb756ee3c51afbb9f4b1ccb00059abcfa51ef3facd58af14362db77c6c8bb387a5228d105388ff31b21c0b30d90e44956dbd2d9e1b11bd362d64e1fe89ea4e21d5ee47681745a957238f6bceb748cbecb4591c093561263f22ebafcd66c9e7b2793687459752bc80cfe7a74e188433b07d941689697fbdb5eb4850f5534315360fe5b439559a93f57e3a0cad473a3debcc92304b08112c9b6ef227206d5f14a7037fd417d1c37f600c9df6f0083de6db4070781e60d3dffd4eebefe15f1adcdc74610273296a4112e8b6a4305d7f88eb3029a27e7d96dcc9549c33b1de6ec8485c925065773a0eba301b892777c4a62a0390109153e86bb012234cf2510db791618756df830a49cfa2a27fae064df4d245430084111690f21ee89507fcad3de886c9a476e75d4c18b3913db58bbdb63317300667d4478b199690eee146db164658c81e34e726dbe3eee54f655536679a618b08fe96df77554387ad1494756806881f67edbed89bd1b09bdd453d2eb84349aa813fbf982e83f1ec4dbdabc9a1f54691566f479d465cd82372d267ab98c28c5547f558b8708535a426fda410797ebd41b755cd72f7d798475d443a73271c3664c5f1ed6cc61d5f55a01b5107eb8f42123f70220dac7b3a543e8c91c5c67e20dfd41619b15e1ce4de0142b6e73ccc0994d23de5243c155020f7ad8c0e66882157da99bf76def2decbe6cb55730f1626ee24ee2e68d12efc0efa06aff03c6c25ecb292cc4645a7bd97725a3b32f0d8c4ace785991e88406541b5875db86cf8d19daeaa19f6834aafb46b8f9b0606a0905ea0f0b3671c5fb3d552acee4ce34b6fd33bd58ac36cf97e179096973c1f75b4b49e7efd931a8f3396dd2e9c22a98288933ce97ee90da8b84405fb51c78f998aaff125ee2817b5fbb45d004f6a73be6fab9a09ef86509658fefbb4cc7c1cbd3e4b0a8fc15a32d2e5e0d394c2504afa1ee72a19e72a1dc92a296047a09b557ec3e25ec430de6edd84d5a5dbf4f5344218a8921443aa1f20679e1be0e9bdbee226898c1b4bf100c0fa069ca9d11ca2560aff9a87caf328c4aa07796a9acac94bb501fbee6add688547132f1c3c37ee6e5e475f9ed97b19a47b62786826995073ffda44f8899c9ba08191777b228d33aec6e9fdd4fd20d10cc36e45d4c8b31905c0be8110add3dc573ce006bb08eb34cea61703cd8fa05e26de042be50d6f42a0ae6363bf6c5e9a3a202f41de1d098e525a2413f759483bf8b4d9956f463798028cfc5695d8cee89506eb5b4a61cd63cbb5b7738cfee0edd94be6ffa6f7c57f258f816015e9f20daeb061150e698596c300 -Len = 8192 -Result = F (Incorrect last byte) - -Digest = SHA512 -Msg = "" -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = b75255700ee4e6964ba0a867b650f5d3cac3380b59ec58c72a5d44156f7273f7ccf88edb48a3c7f6c07dfd03b9f8a907f0e7d98e38ee174edf9fe79159cddebafe1cbd586fdaf192d347d56867b3a3eb756ee3c51afbb9f4b1ccb00059abcfa51ef3facd58af14362db77c6c8bb387a5228d105388ff31b21c0b30d90e44956dbd2d9e1b11bd362d64e1fe89ea4e21d5ee47681745a957238f6bceb748cbecb4591c093561263f22ebafcd66c9e7b2793687459752bc80cfe7a74e188433b07d941689697fbdb5eb4850f5534315360fe5b439559a93f57e3a0cad473a3debcc92304b08112c9b6ef227206d5f14a7037fd417d1c37f600c9df6f0083de6db4070781e60d3dffd4eebefe15f1adcdc74610273296a4112e8b6a4305d7f88eb3029a27e7d96dcc9549c33b1de6ec8485c925065773a0eba301b892777c4a62a0390109153e86bb012234cf2510db791618756df830a49cfa2a27fae064df4d245430084111690f21ee89507fcad3de886c9a476e75d4c18b3913db58bbdb63317300667d4478b199690eee146db164658c81e34e726dbe3eee54f655536679a618b08fe96df77554387ad1494756806881f67edbed89bd1b09bdd453d2eb84349aa813fbf982e83f1ec4dbdabc9a1f54691566f479d465cd82372d267ab98c28c5547f558b8708535a426fda410797ebd41b755cd72f7d798475d443a73271c3664c5f1ed6cc61d5f55a01b5107eb8f42123f70220dac7b3a543e8c91c5c67e20dfd41619b15e1ce4de0142b6e73ccc0994d23de5243c155020f7ad8c0e66882157da99bf76def2decbe6cb55730f1626ee24ee2e68d12efc0efa06aff03c6c25ecb292cc4645a7bd97725a3b32f0d8c4ace785991e88406541b5875db86cf8d19daeaa19f6834aafb46b8f9b0606a0905ea0f0b3671c5fb3d552acee4ce34b6fd33bd58ac36cf97e179096973c1f75b4b49e7efd931a8f3396dd2e9c22a98288933ce97ee90da8b84405fb51c78f998aaff125ee2817b5fbb45d004f6a73be6fab9a09ef86509658fefbb4cc7c1cbd3e4b0a8fc15a32d2e5e0d394c2504afa1ee72a19e72a1dc92a296047a09b557ec3e25ec430de6edd84d5a5dbf4f5344218a8921443aa1f20679e1be0e9bdbee226898c1b4bf100c0fa069ca9d11ca2560aff9a87caf328c4aa07796a9acac94bb501fbee6add688547132f1c3c37ee6e5e475f9ed97b19a47b62786826995073ffda44f8899c9ba08191777b228d33aec6e9fdd4fd20d10cc36e45d4c8b31905c0be8110add3dc573ce006bb08eb34cea61703cd8fa05e26de042be50d6f42a0ae6363bf6c5e9a3a202f41de1d098e525a2413f759483bf8b4d9956f463798028cfc5695d8cee89506eb5b4a61cd63cbb5b7738cfee0edd94be6ffa6f7c57f258f816015e9f20daeb061150e698596c3bc -Len = 8192 -Result = F (Incorrect top bits) - -Digest = SHA512 -Msg = "" -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 485355700ee4e6964ba0a867b650f5d3cac3380b59ec58c72a5d44156f7273f7ccf88edb48a3c7f6c07dfd03b9f8a907f0e7d98e38ee174edf9fe79159cddebafe1cbd586fdaf192d347d56867b3a3eb756ee3c51afbb9f4b1ccb00059abcfa51ef3facd58af14362db77c6c8bb387a5228d105388ff31b21c0b30d90e44956dbd2d9e1b11bd362d64e1fe89ea4e21d5ee47681745a957238f6bceb748cbecb4591c093561263f22ebafcd66c9e7b2793687459752bc80cfe7a74e188433b07d941689697fbdb5eb4850f5534315360fe5b439559a93f57e3a0cad473a3debcc92304b08112c9b6ef227206d5f14a7037fd417d1c37f600c9df6f0083de6db4070781e60d3dffd4eebefe15f1adcdc74610273296a4112e8b6a4305d7f88eb3029a27e7d96dcc9549c33b1de6ec8485c925065773a0eba301b892777c4a62a0390109153e86bb012234cf2510db791618756df830a49cfa2a27fae064df4d245430084111690f21ee89507fcad3de886c9a476e75d4c18b3913db58bbdb63317300667d4478b199690eee146db164658c81e34e726dbe3eee54f655536679a618b08fe96df77554387ad1494756806881f67edbed89bd1b09bdd453d2eb84349aa813fbf982e83f1ec4dbdabc9a1f54691566f479d465cd82372d267ab98c28c5547f558b8708535a426fda410797ebd41b755cd72f7d798475d443a73271c3664c5f1ed6cc61d5f55a01b5107eb8f42123f70220dac7b3a543e8c91c5c67e20dfd41619b15e1ce4de0142b6e73ccc0994d23de5243c155020f7ad8c0e66882157da99bf76def2decbe6cb55730f1626ee24ee2e68d12efc0efa06aff03c6c25ecb292cc4645a7bd97725a3b32f0d8c4ace785991e88406541b5875db86cf8d19daeaa19f6834aafb46b8f9b0606a0905ea0f0b3671c5fb3d552acee4ce34b6fd33bd58ac36cf97e179096973c1f75b4b49e7efd931a8f3396dd2e9c22a98288933ce97ee90da8b84405fb51c78f998aaff125ee2817b5fbb45d004f6a73be6fab9a09ef86509658fefbb4cc7c1cbd3e4b0a8fc15a32d2e5e0d394c2504afa1ee72a19e72a1dc92a296047a09b557ec3e25ec430de6edd84d5a5dbf4f5344218a8921443aa1f20679e1be0e9bdbee226898c1b4bf100c0fa069ca9d11ca2560aff9a87caf328c4aa07796a9acac94bb501fbee6add688547132f1c3c37ee6e5e475f9ed97b19a47b62786826995073ffda44f8899c9ba08191777b228d33aec6e9fdd4fd20d10cc36e45d4c8b31905c0be8110add3dc573ce006bb08eb34cea61703cd8fa05e26de042be50d6f42a0ae6363bf6c5e9a3a202f41de1d098e525a2413f759483bf8b4d9956f463798028cfc5695d8cee89506eb5b4a61cd63cbb5b7738cfee0edd94be6ffa6f7c57f258f816015e9f20daeb061150e698596c3bc -Len = 8192 -Result = F (First byte of PS is not zero) - -Digest = SHA512 -Msg = "" -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 485255700ee4e6964ba0a867b650f5d3cac3380b59ec58c72a5d44156f7273f7ccf88edb48a3c7f6c07dfd03b9f8a907f0e7d98e38ee174edf9fe79159cddebafe1cbd586fdaf192d347d56867b3a3eb756ee3c51afbb9f4b1ccb00059abcfa51ef3facd58af14362db77c6c8bb387a5228d105388ff31b21c0b30d90e44956dbd2d9e1b11bd362d64e1fe89ea4e21d5ee47681745a957238f6bceb748cbecb4591c093561263f22ebafcd66c9e7b2793687459752bc80cfe7a74e188433b07d941689697fbdb5eb4850f5534315360fe5b439559a93f57e3a0cad473a3debcc92304b08112c9b6ef227206d5f14a7037fd417d1c37f600c9df6f0083de6db4070781e60d3dffd4eebefe15f1adcdc74610273296a4112e8b6a4305d7f88eb3029a27e7d96dcc9549c33b1de6ec8485c925065773a0eba301b892777c4a62a0390109153e86bb012234cf2510db791618756df830a49cfa2a27fae064df4d245430084111690f21ee89507fcad3de886c9a476e75d4c18b3913db58bbdb63317300667d4478b199690eee146db164658c81e34e726dbe3eee54f655536679a618b08fe96df77554387ad1494756806881f67edbed89bd1b09bdd453d2eb84349aa813fbf982e83f1ec4dbdabc9a1f54691566f479d465cd82372d267ab98c28c5547f558b8708535a426fda410797ebd41b755cd72f7d798475d443a73271c3664c5f1ed6cc61d5f55a01b5107eb8f42123f70220dac7b3a543e8c91c5c67e20dfd41619b15e1ce4de0142b6e73ccc0994d23de5243c155020f7ad8c0e66882157da99bf76def2decbe6cb55730f1626ee24ee2e68d12efc0efa06aff03c6c25ecb292cc4645a7bd97725a3b32f0d8c4ace785991e88406541b5875db86cf8d19daeaa19f6834aafb46b8f9b0606a0905ea0f0b3671c5fb3d552acee4ce34b6fd33bd58ac36cf97e179096973c1f75b4b49e7efd931a8f3396dd2e9c22a98288933ce97ee90da8b84405fb51c78f998aaff125ee2817b5fbb45d004f6a73be6fab9a09ef86509658fefbb4cc7c1cbd3e4b0a8fc15a32d2e5e0d394c2504afa1ee72a19e72a1dc92a296047a09b557ec3e25ec430de6edd84d5a5dbf4f5344218a8921443aa1f20679e1be0e9bdbee226898c1b4bf100c0fa069ca9d11ca2560aff9a87caf328c4aa07796a9acac94bb501fbee6add688547132f1c3c37ee6e5e475f9ed97b19a47b62786826995073ffda44f8899c9ba08191777b228d32aec6e9fdd4fd20d10cc36e45d4c8b31905c0be8110add3dc573ce006bb08eb34cea61703cd8fa05e26de042be50d6f42a0ae6363bf6c5e9a3a202f41de1d098e525a2413f759483bf8b4d9956f463798028cfc5695d8cee89506eb5b4a61cd63cbb5b7738cfee0edd94be6ffa6f7c57f258f816015e9f20daeb061150e698596c3bc -Len = 8192 -Result = F (Last byte of PS is not zero) - -Digest = SHA512 -Msg = "" -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 485255700ee4e6964ba0a867b650f5d3cac3380b59ec58c72a5d44156f7273f7ccf88edb48a3c7f6c07dfd03b9f8a907f0e7d98e38ee174edf9fe79159cddebafe1cbd586fdaf192d347d56867b3a3eb756ee3c51afbb9f4b1ccb00059abcfa51ef3facd58af14362db77c6c8bb387a5228d105388ff31b21c0b30d90e44956dbd2d9e1b11bd362d64e1fe89ea4e21d5ee47681745a957238f6bceb748cbecb4591c093561263f22ebafcd66c9e7b2793687459752bc80cfe7a74e188433b07d941689697fbdb5eb4850f5534315360fe5b439559a93f57e3a0cad473a3debcc92304b08112c9b6ef227206d5f14a7037fd417d1c37f600c9df6f0083de6db4070781e60d3dffd4eebefe15f1adcdc74610273296a4112e8b6a4305d7f88eb3029a27e7d96dcc9549c33b1de6ec8485c925065773a0eba301b892777c4a62a0390109153e86bb012234cf2510db791618756df830a49cfa2a27fae064df4d245430084111690f21ee89507fcad3de886c9a476e75d4c18b3913db58bbdb63317300667d4478b199690eee146db164658c81e34e726dbe3eee54f655536679a618b08fe96df77554387ad1494756806881f67edbed89bd1b09bdd453d2eb84349aa813fbf982e83f1ec4dbdabc9a1f54691566f479d465cd82372d267ab98c28c5547f558b8708535a426fda410797ebd41b755cd72f7d798475d443a73271c3664c5f1ed6cc61d5f55a01b5107eb8f42123f70220dac7b3a543e8c91c5c67e20dfd41619b15e1ce4de0142b6e73ccc0994d23de5243c155020f7ad8c0e66882157da99bf76def2decbe6cb55730f1626ee24ee2e68d12efc0efa06aff03c6c25ecb292cc4645a7bd97725a3b32f0d8c4ace785991e88406541b5875db86cf8d19daeaa19f6834aafb46b8f9b0606a0905ea0f0b3671c5fb3d552acee4ce34b6fd33bd58ac36cf97e179096973c1f75b4b49e7efd931a8f3396dd2e9c22a98288933ce97ee90da8b84405fb51c78f998aaff125ee2817b5fbb45d004f6a73be6fab9a09ef86509658fefbb4cc7c1cbd3e4b0a8fc15a32d2e5e0d394c2504afa1ee72a19e72a1dc92a296047a09b557ec3e25ec430de6edd84d5a5dbf4f5344218a8921443aa1f20679e1be0e9bdbee226898c1b4bf100c0fa069ca9d11ca2560aff9a87caf328c4aa07796a9acac94bb501fbee6add688547132f1c3c37ee6e5e475f9ed97b19a47b62786826995073ffda44f8899c9ba08191777b228d33afc6e9fdd4fd20d10cc36e45d4c8b31905c0be8110add3dc573ce006bb08eb34cea61703cd8fa05e26de042be50d6f42a0ae6363bf6c5e9a3a202f41de1d098e525a2413f759483bf8b4d9956f463798028cfc5695d8cee89506eb5b4a61cd63cbb5b7738cfee0edd94be6ffa6f7c57f258f816015e9f20daeb061150e698596c3bc -Len = 8192 -Result = F (Byte following PS is not 0x01) - -Digest = SHA512 -Msg = "" -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 485255700ee4e6964ba0a867b650f5d3cac3380b59ec58c72a5d44156f7273f7ccf88edb48a3c7f6c07dfd03b9f8a907f0e7d98e38ee174edf9fe79159cddebafe1cbd586fdaf192d347d56867b3a3eb756ee3c51afbb9f4b1ccb00059abcfa51ef3facd58af14362db77c6c8bb387a5228d105388ff31b21c0b30d90e44956dbd2d9e1b11bd362d64e1fe89ea4e21d5ee47681745a957238f6bceb748cbecb4591c093561263f22ebafcd66c9e7b2793687459752bc80cfe7a74e188433b07d941689697fbdb5eb4850f5534315360fe5b439559a93f57e3a0cad473a3debcc92304b08112c9b6ef227206d5f14a7037fd417d1c37f600c9df6f0083de6db4070781e60d3dffd4eebefe15f1adcdc74610273296a4112e8b6a4305d7f88eb3029a27e7d96dcc9549c33b1de6ec8485c925065773a0eba301b892777c4a62a0390109153e86bb012234cf2510db791618756df830a49cfa2a27fae064df4d245430084111690f21ee89507fcad3de886c9a476e75d4c18b3913db58bbdb63317300667d4478b199690eee146db164658c81e34e726dbe3eee54f655536679a618b08fe96df77554387ad1494756806881f67edbed89bd1b09bdd453d2eb84349aa813fbf982e83f1ec4dbdabc9a1f54691566f479d465cd82372d267ab98c28c5547f558b8708535a426fda410797ebd41b755cd72f7d798475d443a73271c3664c5f1ed6cc61d5f55a01b5107eb8f42123f70220dac7b3a543e8c91c5c67e20dfd41619b15e1ce4de0142b6e73ccc0994d23de5243c155020f7ad8c0e66882157da99bf76def2decbe6cb55730f1626ee24ee2e68d12efc0efa06aff03c6c25ecb292cc4645a7bd97725a3b32f0d8c4ace785991e88406541b5875db86cf8d19daeaa19f6834aafb46b8f9b0606a0905ea0f0b3671c5fb3d552acee4ce34b6fd33bd58ac36cf97e179096973c1f75b4b49e7efd931a8f3396dd2e9c22a98288933ce97ee90da8b84405fb51c78f998aaff125ee2817b5fbb45d004f6a73be6fab9a09ef86509658fefbb4cc7c1cbd3e4b0a8fc15a32d2e5e0d394c2504afa1ee72a19e72a1dc92a296047a09b557ec3e25ec430de6edd84d5a5dbf4f5344218a8921443aa1f20679e1be0e9bdbee226898c1b4bf100c0fa069ca9d11ca2560aff9a87caf328c4aa07796a9acac94bb501fbee6add688547132f1c3c37ee6e5e475f9ed97b19a47b62786826995073ffda44f8899c9ba08191777b228d33ae39e9fdd4fd20d10cc36e45d4c8b31905c0be8110add3dc573ce006bb08eb34cea61703cd8fa05e26de042be50d6f42a0ae6363bf6c5e9a3a202f41de1d098e525a2413f759483bf8b4d9956f463798028cfc5695d8cee89506eb5b4a61cd63cbb5b7738cfee0edd94be6ffa6f7c57f258f816015e9f20daeb061150e698596c3bc -Len = 8192 -Result = F (Incorrect salt) - -Digest = SHA512 -Msg = "" -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 6ee75da53caedcd3b27c1e9b670651eb6d8ccf564da7c2a4b2e6e831f28256a21d44f347f0338cd778834586fb5a3d0e91cb1e9db444c294881614930b40af9502fc4c8667712ee46c7d89ae313949fad6fb1a11da6a71bb757786061cfbd24723d0114f02b58a4fbe00d43416d7870966919abbbfb9ac76b68fe7d1356f1a279c7054696a019c4d43bd75a67ab919f99980eef066991057787d5e1b328833f791350d29d4524478b4751facd1c0852d4e375a0df1a51e7a0915eb7fb046087039fdb5e8c67e5901ad688f3a0569debcfd177fa51882de254b8cb281bdd45475d02365cabcc7d4939d0507cb80fe042845e52853c1db12a73b7fe2ced4722679f074e6b9468431aeb06b88287412b93d729fd7c63babc4926f493a26aa0ee487e7754d92d8b6110dcdcc966a0fd4418b073ef461b1a338aa300b80d56b215635dcf4794d15eae0713da7a7cc74b9775edeea777065415be1cc55ad96b7d1badc5fc16414756faf69ebe7148f05e47ca6ceae4804167ef0bb876ed5cbeb81de01abf22cd419bdc14caa8c3829383988e2d7c54be3b9d64ccd584b6f0ed7fff83cf2039a457c0684f4e6f847b629465da61c3b8a7d711ebebc67214e2e4eda47847576a43a58b7f00cfc2efa207e7bca5930e3253bb520e8cbecd216336e2c62405de992da3797625a3bc79d9c2b28e908db98d543b794df1e9b58995669a044e46abb3a7b1fe231351014f6d9c4dac1f145f47661c3cab5330362406da10e3758f51195cb7d48fecc7026b0845e7d7695c87649e99d30bfc1dc36d7446a11eab59f70bafd5996435958abf656821c146e5fb86e371294c5432145eb0c20e0323e95c93130de92a189987710d4266d07c1298e97df863ce662e06c01afbb5b51d32546378d43993fde40474710c49656d4b0b596050498d5fc8a14b52acc34d69aefd1faf0a3f68d48d9162f6f0d1377b21b2ef5ae97513f1603d3d86293d5326fa1428c26a11df67349cf8bfdeb623047d6a84bdce4b58c6c03e69abed6342dc301d0d376447bb30df46afed76a3487b778928e814fbb0dcac7b94c4fd1f569e66d217818dbb45c481df1c3e2351d4d5ece2e3639ef82bf58880d4459ae118e7c2ff2f2107110ea7ea1bce4d19646d10c1eac9d44e9f8d316186086ab61d214f96ae68b7cd1f1eda9f05488e30b0e452767f4e7395b072d721f566873bdae6e45313ec3ec2d4bfb04be3095091e34d48e185ba1d46ee6b61195e2df9528cfb9247a1921ef83de4152cd60f5dc9f9eeae0efe47b566a26043ca8d3a5640fe6388aa84e1083c07cd1ec1555f528f1893cddc2a01f6da125f692fbc9c7a9832dc602de8b5dab65d8025994c0a871259654275ba3786ea3004a33ab12a42d995c71976b519adec222c75e1ab59daa4111e3ff21d8f4ccca6e15a4144669711854ccbc -Len = 8192 -Result = F (Incorrect message hash) - -Digest = SHA256 -Msg = "" -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 23e55cbec753a80ab764cb3f9fa29b05a24f2f0b388a5e1082babf37f7d7f60c -Len = 256 -Result = F (Invalid length) - -Digest = SHA256 -Msg = "" -Salt = f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 -EM = 23e55cbec753a80ab764cb3f9fa29b05a24f2f0b388a5e1082babf37f7d7f60c566e4452dd03fe9153f009aafc0cda10a01cf9f72a8754f618fc0b67de8b2a0c -Len = 512 -Result = F (Invalid length) - Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/ring-0.16.20/src/rsa/signature_rsa_example_private_key.der and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/ring-0.16.20/src/rsa/signature_rsa_example_private_key.der differ Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/ring-0.16.20/src/rsa/signature_rsa_example_public_key.der and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/ring-0.16.20/src/rsa/signature_rsa_example_public_key.der differ diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/rsa/signing.rs temporalio-1.3.0/vendor/ring-0.16.20/src/rsa/signing.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/rsa/signing.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/rsa/signing.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,645 +0,0 @@ -// Copyright 2015-2016 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -use super::{ - bigint::{self, Prime}, - verification, RsaEncoding, N, -}; -/// RSA PKCS#1 1.5 signatures. -use crate::{ - arithmetic::montgomery::R, - bits, digest, - error::{self, KeyRejected}, - io::{self, der, der_writer}, - pkcs8, rand, signature, -}; -use alloc::boxed::Box; - -/// An RSA key pair, used for signing. -pub struct RsaKeyPair { - p: PrivatePrime

, - q: PrivatePrime, - qInv: bigint::Elem, - qq: bigint::Modulus, - q_mod_n: bigint::Elem, - public: verification::Key, - public_key: RsaSubjectPublicKey, -} - -derive_debug_via_field!(RsaKeyPair, stringify!(RsaKeyPair), public_key); - -impl RsaKeyPair { - /// Parses an unencrypted PKCS#8-encoded RSA private key. - /// - /// Only two-prime (not multi-prime) keys are supported. The public modulus - /// (n) must be at least 2047 bits. The public modulus must be no larger - /// than 4096 bits. It is recommended that the public modulus be exactly - /// 2048 or 3072 bits. The public exponent must be at least 65537. - /// - /// This will generate a 2048-bit RSA private key of the correct form using - /// OpenSSL's command line tool: - /// - /// ```sh - /// openssl genpkey -algorithm RSA \ - /// -pkeyopt rsa_keygen_bits:2048 \ - /// -pkeyopt rsa_keygen_pubexp:65537 | \ - /// openssl pkcs8 -topk8 -nocrypt -outform der > rsa-2048-private-key.pk8 - /// ``` - /// - /// This will generate a 3072-bit RSA private key of the correct form: - /// - /// ```sh - /// openssl genpkey -algorithm RSA \ - /// -pkeyopt rsa_keygen_bits:3072 \ - /// -pkeyopt rsa_keygen_pubexp:65537 | \ - /// openssl pkcs8 -topk8 -nocrypt -outform der > rsa-3072-private-key.pk8 - /// ``` - /// - /// Often, keys generated for use in OpenSSL-based software are stored in - /// the Base64 “PEM†format without the PKCS#8 wrapper. Such keys can be - /// converted to binary PKCS#8 form using the OpenSSL command line tool like - /// this: - /// - /// ```sh - /// openssl pkcs8 -topk8 -nocrypt -outform der \ - /// -in rsa-2048-private-key.pem > rsa-2048-private-key.pk8 - /// ``` - /// - /// Base64 (“PEMâ€) PKCS#8-encoded keys can be converted to the binary PKCS#8 - /// form like this: - /// - /// ```sh - /// openssl pkcs8 -nocrypt -outform der \ - /// -in rsa-2048-private-key.pem > rsa-2048-private-key.pk8 - /// ``` - /// - /// The private key is validated according to [NIST SP-800-56B rev. 1] - /// section 6.4.1.4.3, crt_pkv (Intended Exponent-Creation Method Unknown), - /// with the following exceptions: - /// - /// * Section 6.4.1.2.1, Step 1: Neither a target security level nor an - /// expected modulus length is provided as a parameter, so checks - /// regarding these expectations are not done. - /// * Section 6.4.1.2.1, Step 3: Since neither the public key nor the - /// expected modulus length is provided as a parameter, the consistency - /// check between these values and the private key's value of n isn't - /// done. - /// * Section 6.4.1.2.1, Step 5: No primality tests are done, both for - /// performance reasons and to avoid any side channels that such tests - /// would provide. - /// * Section 6.4.1.2.1, Step 6, and 6.4.1.4.3, Step 7: - /// * *ring* has a slightly looser lower bound for the values of `p` - /// and `q` than what the NIST document specifies. This looser lower - /// bound matches what most other crypto libraries do. The check might - /// be tightened to meet NIST's requirements in the future. Similarly, - /// the check that `p` and `q` are not too close together is skipped - /// currently, but may be added in the future. - /// - The validity of the mathematical relationship of `dP`, `dQ`, `e` - /// and `n` is verified only during signing. Some size checks of `d`, - /// `dP` and `dQ` are performed at construction, but some NIST checks - /// are skipped because they would be expensive and/or they would leak - /// information through side channels. If a preemptive check of the - /// consistency of `dP`, `dQ`, `e` and `n` with each other is - /// necessary, that can be done by signing any message with the key - /// pair. - /// - /// * `d` is not fully validated, neither at construction nor during - /// signing. This is OK as far as *ring*'s usage of the key is - /// concerned because *ring* never uses the value of `d` (*ring* always - /// uses `p`, `q`, `dP` and `dQ` via the Chinese Remainder Theorem, - /// instead). However, *ring*'s checks would not be sufficient for - /// validating a key pair for use by some other system; that other - /// system must check the value of `d` itself if `d` is to be used. - /// - /// In addition to the NIST requirements, *ring* requires that `p > q` and - /// that `e` must be no more than 33 bits. - /// - /// See [RFC 5958] and [RFC 3447 Appendix A.1.2] for more details of the - /// encoding of the key. - /// - /// [NIST SP-800-56B rev. 1]: - /// http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-56Br1.pdf - /// - /// [RFC 3447 Appendix A.1.2]: - /// https://tools.ietf.org/html/rfc3447#appendix-A.1.2 - /// - /// [RFC 5958]: - /// https://tools.ietf.org/html/rfc5958 - pub fn from_pkcs8(pkcs8: &[u8]) -> Result { - const RSA_ENCRYPTION: &[u8] = include_bytes!("../data/alg-rsa-encryption.der"); - let (der, _) = pkcs8::unwrap_key_( - untrusted::Input::from(&RSA_ENCRYPTION), - pkcs8::Version::V1Only, - untrusted::Input::from(pkcs8), - )?; - Self::from_der(der.as_slice_less_safe()) - } - - /// Parses an RSA private key that is not inside a PKCS#8 wrapper. - /// - /// The private key must be encoded as a binary DER-encoded ASN.1 - /// `RSAPrivateKey` as described in [RFC 3447 Appendix A.1.2]). In all other - /// respects, this is just like `from_pkcs8()`. See the documentation for - /// `from_pkcs8()` for more details. - /// - /// It is recommended to use `from_pkcs8()` (with a PKCS#8-encoded key) - /// instead. - /// - /// [RFC 3447 Appendix A.1.2]: - /// https://tools.ietf.org/html/rfc3447#appendix-A.1.2 - /// - /// [NIST SP-800-56B rev. 1]: - /// http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-56Br1.pdf - pub fn from_der(input: &[u8]) -> Result { - untrusted::Input::from(input).read_all(KeyRejected::invalid_encoding(), |input| { - der::nested( - input, - der::Tag::Sequence, - error::KeyRejected::invalid_encoding(), - Self::from_der_reader, - ) - }) - } - - fn from_der_reader(input: &mut untrusted::Reader) -> Result { - let version = der::small_nonnegative_integer(input) - .map_err(|error::Unspecified| KeyRejected::invalid_encoding())?; - if version != 0 { - return Err(KeyRejected::version_not_supported()); - } - - fn positive_integer<'a>( - input: &mut untrusted::Reader<'a>, - ) -> Result, KeyRejected> { - der::positive_integer(input) - .map_err(|error::Unspecified| KeyRejected::invalid_encoding()) - } - - let n = positive_integer(input)?; - let e = positive_integer(input)?; - let d = positive_integer(input)?.big_endian_without_leading_zero_as_input(); - let p = positive_integer(input)?.big_endian_without_leading_zero_as_input(); - let q = positive_integer(input)?.big_endian_without_leading_zero_as_input(); - let dP = positive_integer(input)?.big_endian_without_leading_zero_as_input(); - let dQ = positive_integer(input)?.big_endian_without_leading_zero_as_input(); - let qInv = positive_integer(input)?.big_endian_without_leading_zero_as_input(); - - let (p, p_bits) = bigint::Nonnegative::from_be_bytes_with_bit_length(p) - .map_err(|error::Unspecified| KeyRejected::invalid_encoding())?; - let (q, q_bits) = bigint::Nonnegative::from_be_bytes_with_bit_length(q) - .map_err(|error::Unspecified| KeyRejected::invalid_encoding())?; - - // Our implementation of CRT-based modular exponentiation used requires - // that `p > q` so swap them if `p < q`. If swapped, `qInv` is - // recalculated below. `p != q` is verified implicitly below, e.g. when - // `q_mod_p` is constructed. - let ((p, p_bits, dP), (q, q_bits, dQ, qInv)) = match q.verify_less_than(&p) { - Ok(_) => ((p, p_bits, dP), (q, q_bits, dQ, Some(qInv))), - Err(error::Unspecified) => { - // TODO: verify `q` and `qInv` are inverses (mod p). - ((q, q_bits, dQ), (p, p_bits, dP, None)) - } - }; - - // XXX: Some steps are done out of order, but the NIST steps are worded - // in such a way that it is clear that NIST intends for them to be done - // in order. TODO: Does this matter at all? - - // 6.4.1.4.3/6.4.1.2.1 - Step 1. - - // Step 1.a is omitted, as explained above. - - // Step 1.b is omitted per above. Instead, we check that the public - // modulus is 2048 to `PRIVATE_KEY_PUBLIC_MODULUS_MAX_BITS` bits. - // XXX: The maximum limit of 4096 bits is primarily due to lack of - // testing of larger key sizes; see, in particular, - // https://www.mail-archive.com/openssl-dev@openssl.org/msg44586.html - // and - // https://www.mail-archive.com/openssl-dev@openssl.org/msg44759.html. - // Also, this limit might help with memory management decisions later. - - // Step 1.c. We validate e >= 65537. - let public_key = verification::Key::from_modulus_and_exponent( - n.big_endian_without_leading_zero_as_input(), - e.big_endian_without_leading_zero_as_input(), - bits::BitLength::from_usize_bits(2048), - super::PRIVATE_KEY_PUBLIC_MODULUS_MAX_BITS, - 65537, - )?; - - // 6.4.1.4.3 says to skip 6.4.1.2.1 Step 2. - - // 6.4.1.4.3 Step 3. - - // Step 3.a is done below, out of order. - // Step 3.b is unneeded since `n_bits` is derived here from `n`. - - // 6.4.1.4.3 says to skip 6.4.1.2.1 Step 4. (We don't need to recover - // the prime factors since they are already given.) - - // 6.4.1.4.3 - Step 5. - - // Steps 5.a and 5.b are omitted, as explained above. - - // Step 5.c. - // - // TODO: First, stop if `p < (√2) * 2**((nBits/2) - 1)`. - // - // Second, stop if `p > 2**(nBits/2) - 1`. - let half_n_bits = public_key.n_bits.half_rounded_up(); - if p_bits != half_n_bits { - return Err(KeyRejected::inconsistent_components()); - } - - // TODO: Step 5.d: Verify GCD(p - 1, e) == 1. - - // Steps 5.e and 5.f are omitted as explained above. - - // Step 5.g. - // - // TODO: First, stop if `q < (√2) * 2**((nBits/2) - 1)`. - // - // Second, stop if `q > 2**(nBits/2) - 1`. - if p_bits != q_bits { - return Err(KeyRejected::inconsistent_components()); - } - - // TODO: Step 5.h: Verify GCD(p - 1, e) == 1. - - let q_mod_n_decoded = q - .to_elem(&public_key.n) - .map_err(|error::Unspecified| KeyRejected::inconsistent_components())?; - - // TODO: Step 5.i - // - // 3.b is unneeded since `n_bits` is derived here from `n`. - - // 6.4.1.4.3 - Step 3.a (out of order). - // - // Verify that p * q == n. We restrict ourselves to modular - // multiplication. We rely on the fact that we've verified - // 0 < q < p < n. We check that q and p are close to sqrt(n) and then - // assume that these preconditions are enough to let us assume that - // checking p * q == 0 (mod n) is equivalent to checking p * q == n. - let q_mod_n = bigint::elem_mul( - public_key.n.oneRR().as_ref(), - q_mod_n_decoded.clone(), - &public_key.n, - ); - let p_mod_n = p - .to_elem(&public_key.n) - .map_err(|error::Unspecified| KeyRejected::inconsistent_components())?; - let pq_mod_n = bigint::elem_mul(&q_mod_n, p_mod_n, &public_key.n); - if !pq_mod_n.is_zero() { - return Err(KeyRejected::inconsistent_components()); - } - - // 6.4.1.4.3/6.4.1.2.1 - Step 6. - - // Step 6.a, partial. - // - // First, validate `2**half_n_bits < d`. Since 2**half_n_bits has a bit - // length of half_n_bits + 1, this check gives us 2**half_n_bits <= d, - // and knowing d is odd makes the inequality strict. - let (d, d_bits) = bigint::Nonnegative::from_be_bytes_with_bit_length(d) - .map_err(|_| error::KeyRejected::invalid_encoding())?; - if !(half_n_bits < d_bits) { - return Err(KeyRejected::inconsistent_components()); - } - // XXX: This check should be `d < LCM(p - 1, q - 1)`, but we don't have - // a good way of calculating LCM, so it is omitted, as explained above. - d.verify_less_than_modulus(&public_key.n) - .map_err(|error::Unspecified| KeyRejected::inconsistent_components())?; - if !d.is_odd() { - return Err(KeyRejected::invalid_component()); - } - - // Step 6.b is omitted as explained above. - - // 6.4.1.4.3 - Step 7. - - // Step 7.a. - let p = PrivatePrime::new(p, dP)?; - - // Step 7.b. - let q = PrivatePrime::new(q, dQ)?; - - let q_mod_p = q.modulus.to_elem(&p.modulus); - - // Step 7.c. - let qInv = if let Some(qInv) = qInv { - bigint::Elem::from_be_bytes_padded(qInv, &p.modulus) - .map_err(|error::Unspecified| KeyRejected::invalid_component())? - } else { - // We swapped `p` and `q` above, so we need to calculate `qInv`. - // Step 7.f below will verify `qInv` is correct. - let q_mod_p = bigint::elem_mul(p.modulus.oneRR().as_ref(), q_mod_p.clone(), &p.modulus); - bigint::elem_inverse_consttime(q_mod_p, &p.modulus) - .map_err(|error::Unspecified| KeyRejected::unexpected_error())? - }; - - // Steps 7.d and 7.e are omitted per the documentation above, and - // because we don't (in the long term) have a good way to do modulo - // with an even modulus. - - // Step 7.f. - let qInv = bigint::elem_mul(p.modulus.oneRR().as_ref(), qInv, &p.modulus); - bigint::verify_inverses_consttime(&qInv, q_mod_p, &p.modulus) - .map_err(|error::Unspecified| KeyRejected::inconsistent_components())?; - - let qq = bigint::elem_mul(&q_mod_n, q_mod_n_decoded, &public_key.n).into_modulus::()?; - - let public_key_serialized = RsaSubjectPublicKey::from_n_and_e(n, e); - - Ok(Self { - p, - q, - qInv, - q_mod_n, - qq, - public: public_key, - public_key: public_key_serialized, - }) - } - - /// Returns the length in bytes of the key pair's public modulus. - /// - /// A signature has the same length as the public modulus. - pub fn public_modulus_len(&self) -> usize { - self.public_key - .modulus() - .big_endian_without_leading_zero_as_input() - .as_slice_less_safe() - .len() - } -} - -impl signature::KeyPair for RsaKeyPair { - type PublicKey = RsaSubjectPublicKey; - - fn public_key(&self) -> &Self::PublicKey { - &self.public_key - } -} - -/// A serialized RSA public key. -#[derive(Clone)] -pub struct RsaSubjectPublicKey(Box<[u8]>); - -impl AsRef<[u8]> for RsaSubjectPublicKey { - fn as_ref(&self) -> &[u8] { - self.0.as_ref() - } -} - -derive_debug_self_as_ref_hex_bytes!(RsaSubjectPublicKey); - -impl RsaSubjectPublicKey { - fn from_n_and_e(n: io::Positive, e: io::Positive) -> Self { - let bytes = der_writer::write_all(der::Tag::Sequence, &|output| { - der_writer::write_positive_integer(output, &n); - der_writer::write_positive_integer(output, &e); - }); - RsaSubjectPublicKey(bytes) - } - - /// The public modulus (n). - pub fn modulus(&self) -> io::Positive { - // Parsing won't fail because we serialized it ourselves. - let (public_key, _exponent) = - super::parse_public_key(untrusted::Input::from(self.as_ref())).unwrap(); - public_key - } - - /// The public exponent (e). - pub fn exponent(&self) -> io::Positive { - // Parsing won't fail because we serialized it ourselves. - let (_public_key, exponent) = - super::parse_public_key(untrusted::Input::from(self.as_ref())).unwrap(); - exponent - } -} - -struct PrivatePrime { - modulus: bigint::Modulus, - exponent: bigint::PrivateExponent, -} - -impl PrivatePrime { - /// Constructs a `PrivatePrime` from the private prime `p` and `dP` where - /// dP == d % (p - 1). - fn new(p: bigint::Nonnegative, dP: untrusted::Input) -> Result { - let (p, p_bits) = bigint::Modulus::from_nonnegative_with_bit_length(p)?; - if p_bits.as_usize_bits() % 512 != 0 { - return Err(error::KeyRejected::private_modulus_len_not_multiple_of_512_bits()); - } - - // [NIST SP-800-56B rev. 1] 6.4.1.4.3 - Steps 7.a & 7.b. - let dP = bigint::PrivateExponent::from_be_bytes_padded(dP, &p) - .map_err(|error::Unspecified| KeyRejected::inconsistent_components())?; - - // XXX: Steps 7.d and 7.e are omitted. We don't check that - // `dP == d % (p - 1)` because we don't (in the long term) have a good - // way to do modulo with an even modulus. Instead we just check that - // `1 <= dP < p - 1`. We'll check it, to some unknown extent, when we - // do the private key operation, since we verify that the result of the - // private key operation using the CRT parameters is consistent with `n` - // and `e`. TODO: Either prove that what we do is sufficient, or make - // it so. - - Ok(PrivatePrime { - modulus: p, - exponent: dP, - }) - } -} - -fn elem_exp_consttime( - c: &bigint::Elem, - p: &PrivatePrime, -) -> Result, error::Unspecified> -where - M: bigint::NotMuchSmallerModulus, - M: Prime, -{ - let c_mod_m = bigint::elem_reduced(c, &p.modulus); - // We could precompute `oneRRR = elem_squared(&p.oneRR`) as mentioned - // in the Smooth CRT-RSA paper. - let c_mod_m = bigint::elem_mul(p.modulus.oneRR().as_ref(), c_mod_m, &p.modulus); - let c_mod_m = bigint::elem_mul(p.modulus.oneRR().as_ref(), c_mod_m, &p.modulus); - bigint::elem_exp_consttime(c_mod_m, &p.exponent, &p.modulus) -} - -// Type-level representations of the different moduli used in RSA signing, in -// addition to `super::N`. See `super::bigint`'s modulue-level documentation. - -#[derive(Copy, Clone)] -enum P {} -unsafe impl Prime for P {} -unsafe impl bigint::SmallerModulus for P {} -unsafe impl bigint::NotMuchSmallerModulus for P {} - -#[derive(Copy, Clone)] -enum QQ {} -unsafe impl bigint::SmallerModulus for QQ {} -unsafe impl bigint::NotMuchSmallerModulus for QQ {} - -// `q < p < 2*q` since `q` is slightly smaller than `p` (see below). Thus: -// -// q < p < 2*q -// q*q < p*q < 2*q*q. -// q**2 < n < 2*(q**2). -unsafe impl bigint::SlightlySmallerModulus for QQ {} - -#[derive(Copy, Clone)] -enum Q {} -unsafe impl Prime for Q {} -unsafe impl bigint::SmallerModulus for Q {} -unsafe impl bigint::SmallerModulus

for Q {} - -// q < p && `p.bit_length() == q.bit_length()` implies `q < p < 2*q`. -unsafe impl bigint::SlightlySmallerModulus

for Q {} - -unsafe impl bigint::SmallerModulus for Q {} -unsafe impl bigint::NotMuchSmallerModulus for Q {} - -impl RsaKeyPair { - /// Sign `msg`. `msg` is digested using the digest algorithm from - /// `padding_alg` and the digest is then padded using the padding algorithm - /// from `padding_alg`. The signature it written into `signature`; - /// `signature`'s length must be exactly the length returned by - /// `public_modulus_len()`. `rng` may be used to randomize the padding - /// (e.g. for PSS). - /// - /// Many other crypto libraries have signing functions that takes a - /// precomputed digest as input, instead of the message to digest. This - /// function does *not* take a precomputed digest; instead, `sign` - /// calculates the digest itself. - /// - /// Lots of effort has been made to make the signing operations close to - /// constant time to protect the private key from side channel attacks. On - /// x86-64, this is done pretty well, but not perfectly. On other - /// platforms, it is done less perfectly. - pub fn sign( - &self, - padding_alg: &'static dyn RsaEncoding, - rng: &dyn rand::SecureRandom, - msg: &[u8], - signature: &mut [u8], - ) -> Result<(), error::Unspecified> { - let mod_bits = self.public.n_bits; - if signature.len() != mod_bits.as_usize_bytes_rounded_up() { - return Err(error::Unspecified); - } - - let m_hash = digest::digest(padding_alg.digest_alg(), msg); - padding_alg.encode(&m_hash, signature, mod_bits, rng)?; - - // RFC 8017 Section 5.1.2: RSADP, using the Chinese Remainder Theorem - // with Garner's algorithm. - - let n = &self.public.n; - - // Step 1. The value zero is also rejected. - let base = bigint::Elem::from_be_bytes_padded(untrusted::Input::from(signature), n)?; - - // Step 2 - let c = base; - - // Step 2.b.i. - let m_1 = elem_exp_consttime(&c, &self.p)?; - let c_mod_qq = bigint::elem_reduced_once(&c, &self.qq); - let m_2 = elem_exp_consttime(&c_mod_qq, &self.q)?; - - // Step 2.b.ii isn't needed since there are only two primes. - - // Step 2.b.iii. - let p = &self.p.modulus; - let m_2 = bigint::elem_widen(m_2, p); - let m_1_minus_m_2 = bigint::elem_sub(m_1, &m_2, p); - let h = bigint::elem_mul(&self.qInv, m_1_minus_m_2, p); - - // Step 2.b.iv. The reduction in the modular multiplication isn't - // necessary because `h < p` and `p * q == n` implies `h * q < n`. - // Modular arithmetic is used simply to avoid implementing - // non-modular arithmetic. - let h = bigint::elem_widen(h, n); - let q_times_h = bigint::elem_mul(&self.q_mod_n, h, n); - let m_2 = bigint::elem_widen(m_2, n); - let m = bigint::elem_add(m_2, q_times_h, n); - - // Step 2.b.v isn't needed since there are only two primes. - - // Verify the result to protect against fault attacks as described - // in "On the Importance of Checking Cryptographic Protocols for - // Faults" by Dan Boneh, Richard A. DeMillo, and Richard J. Lipton. - // This check is cheap assuming `e` is small, which is ensured during - // `KeyPair` construction. Note that this is the only validation of `e` - // that is done other than basic checks on its size, oddness, and - // minimum value, since the relationship of `e` to `d`, `p`, and `q` is - // not verified during `KeyPair` construction. - { - let verify = bigint::elem_exp_vartime(m.clone(), self.public.e, n); - let verify = verify.into_unencoded(n); - bigint::elem_verify_equal_consttime(&verify, &c)?; - } - - // Step 3. - // - // See Falko Strenzke, "Manger's Attack revisited", ICICS 2010. - m.fill_be_bytes(signature); - - Ok(()) - } -} - -#[cfg(test)] -mod tests { - // We intentionally avoid `use super::*` so that we are sure to use only - // the public API; this ensures that enough of the API is public. - use crate::{rand, signature}; - use alloc::vec; - - // `KeyPair::sign` requires that the output buffer is the same length as - // the public key modulus. Test what happens when it isn't the same length. - #[test] - fn test_signature_rsa_pkcs1_sign_output_buffer_len() { - // Sign the message "hello, world", using PKCS#1 v1.5 padding and the - // SHA256 digest algorithm. - const MESSAGE: &[u8] = b"hello, world"; - let rng = rand::SystemRandom::new(); - - const PRIVATE_KEY_DER: &[u8] = include_bytes!("signature_rsa_example_private_key.der"); - let key_pair = signature::RsaKeyPair::from_der(PRIVATE_KEY_DER).unwrap(); - - // The output buffer is one byte too short. - let mut signature = vec![0; key_pair.public_modulus_len() - 1]; - - assert!(key_pair - .sign(&signature::RSA_PKCS1_SHA256, &rng, MESSAGE, &mut signature) - .is_err()); - - // The output buffer is the right length. - signature.push(0); - assert!(key_pair - .sign(&signature::RSA_PKCS1_SHA256, &rng, MESSAGE, &mut signature) - .is_ok()); - - // The output buffer is one byte too long. - signature.push(0); - assert!(key_pair - .sign(&signature::RSA_PKCS1_SHA256, &rng, MESSAGE, &mut signature) - .is_err()); - } -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/rsa/verification.rs temporalio-1.3.0/vendor/ring-0.16.20/src/rsa/verification.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/rsa/verification.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/rsa/verification.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,337 +0,0 @@ -// Copyright 2015-2016 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -//! Verification of RSA signatures. - -use super::{parse_public_key, RsaParameters, N, PUBLIC_KEY_PUBLIC_MODULUS_MAX_LEN}; -use crate::{ - arithmetic::{bigint, montgomery::Unencoded}, - bits, cpu, digest, error, - limb::LIMB_BYTES, - sealed, signature, -}; - -#[derive(Debug)] -pub struct Key { - pub n: bigint::Modulus, - pub e: bigint::PublicExponent, - pub n_bits: bits::BitLength, -} - -impl Key { - pub fn from_modulus_and_exponent( - n: untrusted::Input, - e: untrusted::Input, - n_min_bits: bits::BitLength, - n_max_bits: bits::BitLength, - e_min_value: u64, - ) -> Result { - // This is an incomplete implementation of NIST SP800-56Br1 Section - // 6.4.2.2, "Partial Public-Key Validation for RSA." That spec defers - // to NIST SP800-89 Section 5.3.3, "(Explicit) Partial Public Key - // Validation for RSA," "with the caveat that the length of the modulus - // shall be a length that is specified in this Recommendation." In - // SP800-89, two different sets of steps are given, one set numbered, - // and one set lettered. TODO: Document this in the end-user - // documentation for RSA keys. - - // Step 3 / Step c for `n` (out of order). - let (n, n_bits) = bigint::Modulus::from_be_bytes_with_bit_length(n)?; - - // `pkcs1_encode` depends on this not being small. Otherwise, - // `pkcs1_encode` would generate padding that is invalid (too few 0xFF - // bytes) for very small keys. - const N_MIN_BITS: bits::BitLength = bits::BitLength::from_usize_bits(1024); - - // Step 1 / Step a. XXX: SP800-56Br1 and SP800-89 require the length of - // the public modulus to be exactly 2048 or 3072 bits, but we are more - // flexible to be compatible with other commonly-used crypto libraries. - assert!(n_min_bits >= N_MIN_BITS); - let n_bits_rounded_up = - bits::BitLength::from_usize_bytes(n_bits.as_usize_bytes_rounded_up()) - .map_err(|error::Unspecified| error::KeyRejected::unexpected_error())?; - if n_bits_rounded_up < n_min_bits { - return Err(error::KeyRejected::too_small()); - } - if n_bits > n_max_bits { - return Err(error::KeyRejected::too_large()); - } - - // Step 2 / Step b. - // Step 3 / Step c for `e`. - let e = bigint::PublicExponent::from_be_bytes(e, e_min_value)?; - - // If `n` is less than `e` then somebody has probably accidentally swapped - // them. The largest acceptable `e` is smaller than the smallest acceptable - // `n`, so no additional checks need to be done. - - // XXX: Steps 4 & 5 / Steps d, e, & f are not implemented. This is also the - // case in most other commonly-used crypto libraries. - - Ok(Self { n, e, n_bits }) - } -} - -impl signature::VerificationAlgorithm for RsaParameters { - fn verify( - &self, - public_key: untrusted::Input, - msg: untrusted::Input, - signature: untrusted::Input, - ) -> Result<(), error::Unspecified> { - let (n, e) = parse_public_key(public_key)?; - verify_rsa_( - self, - ( - n.big_endian_without_leading_zero_as_input(), - e.big_endian_without_leading_zero_as_input(), - ), - msg, - signature, - ) - } -} - -impl sealed::Sealed for RsaParameters {} - -macro_rules! rsa_params { - ( $VERIFY_ALGORITHM:ident, $min_bits:expr, $PADDING_ALGORITHM:expr, - $doc_str:expr ) => { - #[doc=$doc_str] - /// - /// Only available in `alloc` mode. - pub static $VERIFY_ALGORITHM: RsaParameters = RsaParameters { - padding_alg: $PADDING_ALGORITHM, - min_bits: bits::BitLength::from_usize_bits($min_bits), - }; - }; -} - -rsa_params!( - RSA_PKCS1_1024_8192_SHA1_FOR_LEGACY_USE_ONLY, - 1024, - &super::padding::RSA_PKCS1_SHA1_FOR_LEGACY_USE_ONLY, - "Verification of signatures using RSA keys of 1024-8192 bits, - PKCS#1.5 padding, and SHA-1.\n\nSee \"`RSA_PKCS1_*` Details\" in - `ring::signature`'s module-level documentation for more details." -); -rsa_params!( - RSA_PKCS1_2048_8192_SHA1_FOR_LEGACY_USE_ONLY, - 2048, - &super::padding::RSA_PKCS1_SHA1_FOR_LEGACY_USE_ONLY, - "Verification of signatures using RSA keys of 2048-8192 bits, - PKCS#1.5 padding, and SHA-1.\n\nSee \"`RSA_PKCS1_*` Details\" in - `ring::signature`'s module-level documentation for more details." -); -rsa_params!( - RSA_PKCS1_1024_8192_SHA256_FOR_LEGACY_USE_ONLY, - 1024, - &super::RSA_PKCS1_SHA256, - "Verification of signatures using RSA keys of 1024-8192 bits, - PKCS#1.5 padding, and SHA-256.\n\nSee \"`RSA_PKCS1_*` Details\" in - `ring::signature`'s module-level documentation for more details." -); -rsa_params!( - RSA_PKCS1_2048_8192_SHA256, - 2048, - &super::RSA_PKCS1_SHA256, - "Verification of signatures using RSA keys of 2048-8192 bits, - PKCS#1.5 padding, and SHA-256.\n\nSee \"`RSA_PKCS1_*` Details\" in - `ring::signature`'s module-level documentation for more details." -); -rsa_params!( - RSA_PKCS1_2048_8192_SHA384, - 2048, - &super::RSA_PKCS1_SHA384, - "Verification of signatures using RSA keys of 2048-8192 bits, - PKCS#1.5 padding, and SHA-384.\n\nSee \"`RSA_PKCS1_*` Details\" in - `ring::signature`'s module-level documentation for more details." -); -rsa_params!( - RSA_PKCS1_2048_8192_SHA512, - 2048, - &super::RSA_PKCS1_SHA512, - "Verification of signatures using RSA keys of 2048-8192 bits, - PKCS#1.5 padding, and SHA-512.\n\nSee \"`RSA_PKCS1_*` Details\" in - `ring::signature`'s module-level documentation for more details." -); -rsa_params!( - RSA_PKCS1_1024_8192_SHA512_FOR_LEGACY_USE_ONLY, - 1024, - &super::RSA_PKCS1_SHA512, - "Verification of signatures using RSA keys of 1024-8192 bits, - PKCS#1.5 padding, and SHA-512.\n\nSee \"`RSA_PKCS1_*` Details\" in - `ring::signature`'s module-level documentation for more details." -); -rsa_params!( - RSA_PKCS1_3072_8192_SHA384, - 3072, - &super::RSA_PKCS1_SHA384, - "Verification of signatures using RSA keys of 3072-8192 bits, - PKCS#1.5 padding, and SHA-384.\n\nSee \"`RSA_PKCS1_*` Details\" in - `ring::signature`'s module-level documentation for more details." -); - -rsa_params!( - RSA_PSS_2048_8192_SHA256, - 2048, - &super::RSA_PSS_SHA256, - "Verification of signatures using RSA keys of 2048-8192 bits, - PSS padding, and SHA-256.\n\nSee \"`RSA_PSS_*` Details\" in - `ring::signature`'s module-level documentation for more details." -); -rsa_params!( - RSA_PSS_2048_8192_SHA384, - 2048, - &super::RSA_PSS_SHA384, - "Verification of signatures using RSA keys of 2048-8192 bits, - PSS padding, and SHA-384.\n\nSee \"`RSA_PSS_*` Details\" in - `ring::signature`'s module-level documentation for more details." -); -rsa_params!( - RSA_PSS_2048_8192_SHA512, - 2048, - &super::RSA_PSS_SHA512, - "Verification of signatures using RSA keys of 2048-8192 bits, - PSS padding, and SHA-512.\n\nSee \"`RSA_PSS_*` Details\" in - `ring::signature`'s module-level documentation for more details." -); - -/// Low-level API for the verification of RSA signatures. -/// -/// When the public key is in DER-encoded PKCS#1 ASN.1 format, it is -/// recommended to use `ring::signature::verify()` with -/// `ring::signature::RSA_PKCS1_*`, because `ring::signature::verify()` -/// will handle the parsing in that case. Otherwise, this function can be used -/// to pass in the raw bytes for the public key components as -/// `untrusted::Input` arguments. -// -// There are a small number of tests that test this directly, but the -// test coverage for this function mostly depends on the test coverage for the -// `signature::VerificationAlgorithm` implementation for `RsaParameters`. If we -// change that, test coverage for `verify_rsa()` will need to be reconsidered. -// (The NIST test vectors were originally in a form that was optimized for -// testing `verify_rsa` directly, but the testing work for RSA PKCS#1 -// verification was done during the implementation of -// `signature::VerificationAlgorithm`, before `verify_rsa` was factored out). -#[derive(Debug)] -pub struct RsaPublicKeyComponents + core::fmt::Debug> { - /// The public modulus, encoded in big-endian bytes without leading zeros. - pub n: B, - - /// The public exponent, encoded in big-endian bytes without leading zeros. - pub e: B, -} - -impl Copy for RsaPublicKeyComponents where B: AsRef<[u8]> + core::fmt::Debug {} - -impl Clone for RsaPublicKeyComponents -where - B: AsRef<[u8]> + core::fmt::Debug, -{ - fn clone(&self) -> Self { - Self { - n: self.n.clone(), - e: self.e.clone(), - } - } -} - -impl RsaPublicKeyComponents -where - B: AsRef<[u8]> + core::fmt::Debug, -{ - /// Verifies that `signature` is a valid signature of `message` using `self` - /// as the public key. `params` determine what algorithm parameters - /// (padding, digest algorithm, key length range, etc.) are used in the - /// verification. - pub fn verify( - &self, - params: &RsaParameters, - message: &[u8], - signature: &[u8], - ) -> Result<(), error::Unspecified> { - let _ = cpu::features(); - verify_rsa_( - params, - ( - untrusted::Input::from(self.n.as_ref()), - untrusted::Input::from(self.e.as_ref()), - ), - untrusted::Input::from(message), - untrusted::Input::from(signature), - ) - } -} - -pub(crate) fn verify_rsa_( - params: &RsaParameters, - (n, e): (untrusted::Input, untrusted::Input), - msg: untrusted::Input, - signature: untrusted::Input, -) -> Result<(), error::Unspecified> { - let max_bits = bits::BitLength::from_usize_bytes(PUBLIC_KEY_PUBLIC_MODULUS_MAX_LEN)?; - - // XXX: FIPS 186-4 seems to indicate that the minimum - // exponent value is 2**16 + 1, but it isn't clear if this is just for - // signing or also for verification. We support exponents of 3 and larger - // for compatibility with other commonly-used crypto libraries. - let Key { n, e, n_bits } = Key::from_modulus_and_exponent(n, e, params.min_bits, max_bits, 3)?; - - // The signature must be the same length as the modulus, in bytes. - if signature.len() != n_bits.as_usize_bytes_rounded_up() { - return Err(error::Unspecified); - } - - // RFC 8017 Section 5.2.2: RSAVP1. - - // Step 1. - let s = bigint::Elem::from_be_bytes_padded(signature, &n)?; - if s.is_zero() { - return Err(error::Unspecified); - } - - // Step 2. - let m = bigint::elem_exp_vartime(s, e, &n); - let m = m.into_unencoded(&n); - - // Step 3. - let mut decoded = [0u8; PUBLIC_KEY_PUBLIC_MODULUS_MAX_LEN]; - let decoded = fill_be_bytes_n(m, n_bits, &mut decoded); - - // Verify the padded message is correct. - let m_hash = digest::digest(params.padding_alg.digest_alg(), msg.as_slice_less_safe()); - untrusted::Input::from(decoded).read_all(error::Unspecified, |m| { - params.padding_alg.verify(&m_hash, m, n_bits) - }) -} - -/// Returns the big-endian representation of `elem` that is -/// the same length as the minimal-length big-endian representation of -/// the modulus `n`. -/// -/// `n_bits` must be the bit length of the public modulus `n`. -fn fill_be_bytes_n( - elem: bigint::Elem, - n_bits: bits::BitLength, - out: &mut [u8; PUBLIC_KEY_PUBLIC_MODULUS_MAX_LEN], -) -> &[u8] { - let n_bytes = n_bits.as_usize_bytes_rounded_up(); - let n_bytes_padded = ((n_bytes + (LIMB_BYTES - 1)) / LIMB_BYTES) * LIMB_BYTES; - let out = &mut out[..n_bytes_padded]; - elem.fill_be_bytes(out); - let (padding, out) = out.split_at(n_bytes_padded - n_bytes); - assert!(padding.iter().all(|&b| b == 0)); - out -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/rsa.rs temporalio-1.3.0/vendor/ring-0.16.20/src/rsa.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/rsa.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/rsa.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,70 +0,0 @@ -// Copyright 2015-2016 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -// *R* and *r* in Montgomery math refer to different things, so we always use -// `R` to refer to *R* to avoid confusion, even when that's against the normal -// naming conventions. Also the standard camelCase names are used for `KeyPair` -// components. - -/// RSA signatures. -use crate::{ - arithmetic::bigint, - bits, error, - io::{self, der}, - limb, -}; - -mod padding; - -// `RSA_PKCS1_SHA1` is intentionally not exposed. -pub use self::padding::{ - RsaEncoding, RSA_PKCS1_SHA256, RSA_PKCS1_SHA384, RSA_PKCS1_SHA512, RSA_PSS_SHA256, - RSA_PSS_SHA384, RSA_PSS_SHA512, -}; - -// Maximum RSA modulus size supported for signature verification (in bytes). -const PUBLIC_KEY_PUBLIC_MODULUS_MAX_LEN: usize = bigint::MODULUS_MAX_LIMBS * limb::LIMB_BYTES; - -// Keep in sync with the documentation comment for `KeyPair`. -const PRIVATE_KEY_PUBLIC_MODULUS_MAX_BITS: bits::BitLength = bits::BitLength::from_usize_bits(4096); - -/// Parameters for RSA verification. -#[derive(Debug)] -pub struct RsaParameters { - padding_alg: &'static dyn padding::Verification, - min_bits: bits::BitLength, -} - -fn parse_public_key( - input: untrusted::Input, -) -> Result<(io::Positive, io::Positive), error::Unspecified> { - input.read_all(error::Unspecified, |input| { - der::nested(input, der::Tag::Sequence, error::Unspecified, |input| { - let n = der::positive_integer(input)?; - let e = der::positive_integer(input)?; - Ok((n, e)) - }) - }) -} - -// Type-level representation of an RSA public modulus *n*. See -// `super::bigint`'s modulue-level documentation. -#[derive(Copy, Clone)] -pub enum N {} - -unsafe impl bigint::PublicModulus for N {} - -pub mod verification; - -pub mod signing; diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/signature.rs temporalio-1.3.0/vendor/ring-0.16.20/src/signature.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/signature.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/signature.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,406 +0,0 @@ -// Copyright 2015-2017 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -//! Public key signatures: signing and verification. -//! -//! Use the `verify` function to verify signatures, passing a reference to the -//! algorithm that identifies the algorithm. See the documentation for `verify` -//! for examples. -//! -//! For signature verification, this API treats each combination of parameters -//! as a separate algorithm. For example, instead of having a single "RSA" -//! algorithm with a verification function that takes a bunch of parameters, -//! there are `RSA_PKCS1_2048_8192_SHA256`, `RSA_PKCS1_2048_8192_SHA384`, etc., -//! which encode sets of parameter choices into objects. This is designed to -//! reduce the risks of algorithm agility and to provide consistency with ECDSA -//! and EdDSA. -//! -//! Currently this module does not support digesting the message to be signed -//! separately from the public key operation, as it is currently being -//! optimized for Ed25519 and for the implementation of protocols that do not -//! requiring signing large messages. An interface for efficiently supporting -//! larger messages may be added later. -//! -//! -//! # Algorithm Details -//! -//! ## `ECDSA_*_ASN1` Details: ASN.1-encoded ECDSA Signatures -//! -//! The signature is a ASN.1 DER-encoded `Ecdsa-Sig-Value` as described in -//! [RFC 3279 Section 2.2.3]. This is the form of ECDSA signature used in -//! X.509-related structures and in TLS's `ServerKeyExchange` messages. -//! -//! The public key is encoding in uncompressed form using the -//! Octet-String-to-Elliptic-Curve-Point algorithm in -//! [SEC 1: Elliptic Curve Cryptography, Version 2.0]. -//! -//! During verification, the public key is validated using the ECC Partial -//! Public-Key Validation Routine from Section 5.6.2.3.3 of -//! [NIST Special Publication 800-56A, revision 2] and Appendix A.3 of the -//! NSA's [Suite B implementer's guide to FIPS 186-3]. Note that, as explained -//! in the NSA guide, ECC Partial Public-Key Validation is equivalent to ECC -//! Full Public-Key Validation for prime-order curves like this one. -//! -//! ## `ECDSA_*_FIXED` Details: Fixed-length (PKCS#11-style) ECDSA Signatures -//! -//! The signature is *r*||*s*, where || denotes concatenation, and where both -//! *r* and *s* are both big-endian-encoded values that are left-padded to the -//! maximum length. A P-256 signature will be 64 bytes long (two 32-byte -//! components) and a P-384 signature will be 96 bytes long (two 48-byte -//! components). This is the form of ECDSA signature used PKCS#11 and DNSSEC. -//! -//! The public key is encoding in uncompressed form using the -//! Octet-String-to-Elliptic-Curve-Point algorithm in -//! [SEC 1: Elliptic Curve Cryptography, Version 2.0]. -//! -//! During verification, the public key is validated using the ECC Partial -//! Public-Key Validation Routine from Section 5.6.2.3.3 of -//! [NIST Special Publication 800-56A, revision 2] and Appendix A.3 of the -//! NSA's [Suite B implementer's guide to FIPS 186-3]. Note that, as explained -//! in the NSA guide, ECC Partial Public-Key Validation is equivalent to ECC -//! Full Public-Key Validation for prime-order curves like this one. -//! -//! ## `RSA_PKCS1_*` Details: RSA PKCS#1 1.5 Signatures -//! -//! The signature is an RSASSA-PKCS1-v1_5 signature as described in -//! [RFC 3447 Section 8.2]. -//! -//! The public key is encoded as an ASN.1 `RSAPublicKey` as described in -//! [RFC 3447 Appendix-A.1.1]. The public key modulus length, rounded *up* to -//! the nearest (larger) multiple of 8 bits, must be in the range given in the -//! name of the algorithm. The public exponent must be an odd integer of 2-33 -//! bits, inclusive. -//! -//! -//! ## `RSA_PSS_*` Details: RSA PSS Signatures -//! -//! The signature is an RSASSA-PSS signature as described in -//! [RFC 3447 Section 8.1]. -//! -//! The public key is encoded as an ASN.1 `RSAPublicKey` as described in -//! [RFC 3447 Appendix-A.1.1]. The public key modulus length, rounded *up* to -//! the nearest (larger) multiple of 8 bits, must be in the range given in the -//! name of the algorithm. The public exponent must be an odd integer of 2-33 -//! bits, inclusive. -//! -//! During verification, signatures will only be accepted if the MGF1 digest -//! algorithm is the same as the message digest algorithm and if the salt -//! length is the same length as the message digest. This matches the -//! requirements in TLS 1.3 and other recent specifications. -//! -//! During signing, the message digest algorithm will be used as the MGF1 -//! digest algorithm. The salt will be the same length as the message digest. -//! This matches the requirements in TLS 1.3 and other recent specifications. -//! Additionally, the entire salt is randomly generated separately for each -//! signature using the secure random number generator passed to `sign()`. -//! -//! -//! [SEC 1: Elliptic Curve Cryptography, Version 2.0]: -//! http://www.secg.org/sec1-v2.pdf -//! [NIST Special Publication 800-56A, revision 2]: -//! http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-56Ar2.pdf -//! [Suite B implementer's guide to FIPS 186-3]: -//! https://github.com/briansmith/ring/blob/main/doc/ecdsa.pdf -//! [RFC 3279 Section 2.2.3]: -//! https://tools.ietf.org/html/rfc3279#section-2.2.3 -//! [RFC 3447 Section 8.2]: -//! https://tools.ietf.org/html/rfc3447#section-7.2 -//! [RFC 3447 Section 8.1]: -//! https://tools.ietf.org/html/rfc3447#section-8.1 -//! [RFC 3447 Appendix-A.1.1]: -//! https://tools.ietf.org/html/rfc3447#appendix-A.1.1 -//! -//! -//! # Examples -//! -//! ## Signing and verifying with Ed25519 -//! -//! ``` -//! use ring::{ -//! rand, -//! signature::{self, KeyPair}, -//! }; -//! -//! # fn main() -> Result<(), ring::error::Unspecified> { -//! // Generate a key pair in PKCS#8 (v2) format. -//! let rng = rand::SystemRandom::new(); -//! let pkcs8_bytes = signature::Ed25519KeyPair::generate_pkcs8(&rng)?; -//! -//! // Normally the application would store the PKCS#8 file persistently. Later -//! // it would read the PKCS#8 file from persistent storage to use it. -//! -//! let key_pair = signature::Ed25519KeyPair::from_pkcs8(pkcs8_bytes.as_ref())?; -//! -//! // Sign the message "hello, world". -//! const MESSAGE: &[u8] = b"hello, world"; -//! let sig = key_pair.sign(MESSAGE); -//! -//! // Normally an application would extract the bytes of the signature and -//! // send them in a protocol message to the peer(s). Here we just get the -//! // public key key directly from the key pair. -//! let peer_public_key_bytes = key_pair.public_key().as_ref(); -//! -//! // Verify the signature of the message using the public key. Normally the -//! // verifier of the message would parse the inputs to this code out of the -//! // protocol message(s) sent by the signer. -//! let peer_public_key = -//! signature::UnparsedPublicKey::new(&signature::ED25519, peer_public_key_bytes); -//! peer_public_key.verify(MESSAGE, sig.as_ref())?; -//! -//! # Ok(()) -//! # } -//! ``` -//! -//! ## Signing and verifying with RSA (PKCS#1 1.5 padding) -//! -//! By default OpenSSL writes RSA public keys in SubjectPublicKeyInfo format, -//! not RSAPublicKey format, and Base64-encodes them (“PEM†format). -//! -//! To convert the PEM SubjectPublicKeyInfo format (“BEGIN PUBLIC KEYâ€) to the -//! binary RSAPublicKey format needed by `verify()`, use: -//! -//! ```sh -//! openssl rsa -pubin \ -//! -in public_key.pem \ -//! -inform PEM \ -//! -RSAPublicKey_out \ -//! -outform DER \ -//! -out public_key.der -//! ``` -//! -//! To extract the RSAPublicKey-formatted public key from an ASN.1 (binary) -//! DER-encoded RSAPrivateKey format private key file, use: -//! -//! ```sh -//! openssl rsa -in private_key.der \ -//! -inform DER \ -//! -RSAPublicKey_out \ -//! -outform DER \ -//! -out public_key.der -//! ``` -//! -//! ``` -//! use ring::{rand, signature}; -//! -//! # #[cfg(feature = "std")] -//! fn sign_and_verify_rsa(private_key_path: &std::path::Path, -//! public_key_path: &std::path::Path) -//! -> Result<(), MyError> { -//! // Create an `RsaKeyPair` from the DER-encoded bytes. This example uses -//! // a 2048-bit key, but larger keys are also supported. -//! let private_key_der = read_file(private_key_path)?; -//! let key_pair = signature::RsaKeyPair::from_der(&private_key_der) -//! .map_err(|_| MyError::BadPrivateKey)?; -//! -//! // Sign the message "hello, world", using PKCS#1 v1.5 padding and the -//! // SHA256 digest algorithm. -//! const MESSAGE: &'static [u8] = b"hello, world"; -//! let rng = rand::SystemRandom::new(); -//! let mut signature = vec![0; key_pair.public_modulus_len()]; -//! key_pair.sign(&signature::RSA_PKCS1_SHA256, &rng, MESSAGE, &mut signature) -//! .map_err(|_| MyError::OOM)?; -//! -//! // Verify the signature. -//! let public_key = -//! signature::UnparsedPublicKey::new(&signature::RSA_PKCS1_2048_8192_SHA256, -//! read_file(public_key_path)?); -//! public_key.verify(MESSAGE, &signature) -//! .map_err(|_| MyError::BadSignature) -//! } -//! -//! #[derive(Debug)] -//! enum MyError { -//! # #[cfg(feature = "std")] -//! IO(std::io::Error), -//! BadPrivateKey, -//! OOM, -//! BadSignature, -//! } -//! -//! # #[cfg(feature = "std")] -//! fn read_file(path: &std::path::Path) -> Result, MyError> { -//! use std::io::Read; -//! -//! let mut file = std::fs::File::open(path).map_err(|e| MyError::IO(e))?; -//! let mut contents: Vec = Vec::new(); -//! file.read_to_end(&mut contents).map_err(|e| MyError::IO(e))?; -//! Ok(contents) -//! } -//! # -//! # #[cfg(not(feature = "std"))] -//! # fn sign_and_verify_rsa(_private_key_path: &std::path::Path, -//! # _public_key_path: &std::path::Path) -//! # -> Result<(), ()> { -//! # Ok(()) -//! # } -//! # -//! # fn main() { -//! # let private_key_path = -//! # std::path::Path::new("src/rsa/signature_rsa_example_private_key.der"); -//! # let public_key_path = -//! # std::path::Path::new("src/rsa/signature_rsa_example_public_key.der"); -//! # sign_and_verify_rsa(&private_key_path, &public_key_path).unwrap() -//! # } -//! ``` - -use crate::{cpu, ec, error, sealed}; - -pub use crate::ec::{ - curve25519::ed25519::{ - signing::Ed25519KeyPair, - verification::{EdDSAParameters, ED25519}, - ED25519_PUBLIC_KEY_LEN, - }, - suite_b::ecdsa::{ - signing::{ - EcdsaKeyPair, EcdsaSigningAlgorithm, ECDSA_P256_SHA256_ASN1_SIGNING, - ECDSA_P256_SHA256_FIXED_SIGNING, ECDSA_P384_SHA384_ASN1_SIGNING, - ECDSA_P384_SHA384_FIXED_SIGNING, - }, - verification::{ - EcdsaVerificationAlgorithm, ECDSA_P256_SHA256_ASN1, ECDSA_P256_SHA256_FIXED, - ECDSA_P256_SHA384_ASN1, ECDSA_P384_SHA256_ASN1, ECDSA_P384_SHA384_ASN1, - ECDSA_P384_SHA384_FIXED, - }, - }, -}; - -#[cfg(feature = "alloc")] -pub use crate::rsa::{ - signing::RsaKeyPair, - signing::RsaSubjectPublicKey, - - verification::{ - RsaPublicKeyComponents, RSA_PKCS1_1024_8192_SHA1_FOR_LEGACY_USE_ONLY, - RSA_PKCS1_1024_8192_SHA256_FOR_LEGACY_USE_ONLY, - RSA_PKCS1_1024_8192_SHA512_FOR_LEGACY_USE_ONLY, - RSA_PKCS1_2048_8192_SHA1_FOR_LEGACY_USE_ONLY, RSA_PKCS1_2048_8192_SHA256, - RSA_PKCS1_2048_8192_SHA384, RSA_PKCS1_2048_8192_SHA512, RSA_PKCS1_3072_8192_SHA384, - RSA_PSS_2048_8192_SHA256, RSA_PSS_2048_8192_SHA384, RSA_PSS_2048_8192_SHA512, - }, - - RsaEncoding, - RsaParameters, - - // `RSA_PKCS1_SHA1` is intentionally not exposed. At a minimum, we'd need - // to create test vectors for signing with it, which we don't currently - // have. But, it's a bad idea to use SHA-1 anyway, so perhaps we just won't - // ever expose it. - RSA_PKCS1_SHA256, - RSA_PKCS1_SHA384, - RSA_PKCS1_SHA512, - - RSA_PSS_SHA256, - RSA_PSS_SHA384, - RSA_PSS_SHA512, -}; - -/// A public key signature returned from a signing operation. -#[derive(Clone, Copy)] -pub struct Signature { - value: [u8; MAX_LEN], - len: usize, -} - -impl Signature { - // Panics if `value` is too long. - pub(crate) fn new(fill: F) -> Self - where - F: FnOnce(&mut [u8; MAX_LEN]) -> usize, - { - let mut r = Self { - value: [0; MAX_LEN], - len: 0, - }; - r.len = fill(&mut r.value); - r - } -} - -impl AsRef<[u8]> for Signature { - fn as_ref(&self) -> &[u8] { - &self.value[..self.len] - } -} - -/// Key pairs for signing messages (private key and public key). -pub trait KeyPair: core::fmt::Debug + Send + Sized + Sync { - /// The type of the public key. - type PublicKey: AsRef<[u8]> + core::fmt::Debug + Clone + Send + Sized + Sync; - - /// The public key for the key pair. - fn public_key(&self) -> &Self::PublicKey; -} - -/// The longest signature is an ASN.1 P-384 signature where *r* and *s* are of -/// maximum length with the leading high bit set on each. Then each component -/// will have a tag, a one-byte length, and a one-byte “I'm not negative†-/// prefix, and the outer sequence will have a two-byte length. -pub(crate) const MAX_LEN: usize = 1/*tag:SEQUENCE*/ + 2/*len*/ + - (2 * (1/*tag:INTEGER*/ + 1/*len*/ + 1/*zero*/ + ec::SCALAR_MAX_BYTES)); - -/// A signature verification algorithm. -pub trait VerificationAlgorithm: core::fmt::Debug + Sync + sealed::Sealed { - /// Verify the signature `signature` of message `msg` with the public key - /// `public_key`. - fn verify( - &self, - public_key: untrusted::Input, - msg: untrusted::Input, - signature: untrusted::Input, - ) -> Result<(), error::Unspecified>; -} - -/// An unparsed, possibly malformed, public key for signature verification. -pub struct UnparsedPublicKey> { - algorithm: &'static dyn VerificationAlgorithm, - bytes: B, -} - -impl Copy for UnparsedPublicKey where B: AsRef<[u8]> {} - -impl Clone for UnparsedPublicKey -where - B: AsRef<[u8]>, -{ - fn clone(&self) -> Self { - Self { - algorithm: self.algorithm, - bytes: self.bytes.clone(), - } - } -} - -impl> UnparsedPublicKey { - /// Construct a new `UnparsedPublicKey`. - /// - /// No validation of `bytes` is done until `verify()` is called. - #[inline] - pub fn new(algorithm: &'static dyn VerificationAlgorithm, bytes: B) -> Self { - Self { algorithm, bytes } - } - - /// Parses the public key and verifies `signature` is a valid signature of - /// `message` using it. - /// - /// See the [crate::signature] module-level documentation for examples. - pub fn verify(&self, message: &[u8], signature: &[u8]) -> Result<(), error::Unspecified> { - let _ = cpu::features(); - self.algorithm.verify( - untrusted::Input::from(self.bytes.as_ref()), - untrusted::Input::from(message), - untrusted::Input::from(signature), - ) - } -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/test_1_syntax_error_tests.txt temporalio-1.3.0/vendor/ring-0.16.20/src/test_1_syntax_error_tests.txt --- temporalio-1.3.0/vendor/ring-0.16.20/src/test_1_syntax_error_tests.txt 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/test_1_syntax_error_tests.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -Key: 0 diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/test_1_tests.txt temporalio-1.3.0/vendor/ring-0.16.20/src/test_1_tests.txt --- temporalio-1.3.0/vendor/ring-0.16.20/src/test_1_tests.txt 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/test_1_tests.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ -Key = Value - - diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/test_3_tests.txt temporalio-1.3.0/vendor/ring-0.16.20/src/test_3_tests.txt --- temporalio-1.3.0/vendor/ring-0.16.20/src/test_3_tests.txt 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/test_3_tests.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ -Key = 0 - -Key = 1 - -Key = 2 diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/src/test.rs temporalio-1.3.0/vendor/ring-0.16.20/src/test.rs --- temporalio-1.3.0/vendor/ring-0.16.20/src/test.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/src/test.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,640 +0,0 @@ -// Copyright 2015-2016 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -//! Testing framework. -//! -//! Unlike the rest of *ring*, this testing framework uses panics pretty -//! liberally. It was originally designed for internal use--it drives most of -//! *ring*'s internal tests, and so it is optimized for getting *ring*'s tests -//! written quickly at the expense of some usability. The documentation is -//! lacking. The best way to learn it is to look at some examples. The digest -//! tests are the most complicated because they use named sections. Other tests -//! avoid named sections and so are easier to understand. -//! -//! # Examples -//! -//! ## Writing Tests -//! -//! Input files look like this: -//! -//! ```text -//! # This is a comment. -//! -//! HMAC = SHA1 -//! Input = "My test data" -//! Key = "" -//! Output = 61afdecb95429ef494d61fdee15990cabf0826fc -//! -//! HMAC = SHA256 -//! Input = "Sample message for keylen -//! at C:\Users\Example\example\:4 -//! 9: 0x7ff65496d49c - example_test -//! at C:\Users\Example\example\src\example.rs:652 -//! 10: 0x7ff6549d192a - test::stats::Summary::new::ha139494ed2e4e01f -//! 11: 0x7ff6549d51a2 - test::stats::Summary::new::ha139494ed2e4e01f -//! 12: 0x7ff654a0a911 - _rust_maybe_catch_panic -//! 13: 0x7ff6549d56dd - test::stats::Summary::new::ha139494ed2e4e01f -//! 14: 0x7ff654a03783 - std::sys::thread::Thread::new::h2b08da6cd2517f79 -//! 15: 0x7ff968518101 - BaseThreadInitThunk -//! ``` -//! -//! Notice that the output shows the name of the data file -//! (`src/example_tests.txt`), the test inputs that led to the failure, and the -//! stack trace to the line in the test code that panicked: entry 9 in the -//! stack trace pointing to line 652 of the file `example.rs`. - -#[cfg(feature = "alloc")] -use alloc::{format, string::String, vec::Vec}; - -#[cfg(feature = "alloc")] -use crate::{bits, digest, error}; - -#[cfg(any(feature = "std", feature = "test_logging"))] -extern crate std; - -/// `compile_time_assert_clone::();` fails to compile if `T` doesn't -/// implement `Clone`. -pub fn compile_time_assert_clone() {} - -/// `compile_time_assert_copy::();` fails to compile if `T` doesn't -/// implement `Copy`. -pub fn compile_time_assert_copy() {} - -/// `compile_time_assert_send::();` fails to compile if `T` doesn't -/// implement `Send`. -pub fn compile_time_assert_send() {} - -/// `compile_time_assert_sync::();` fails to compile if `T` doesn't -/// implement `Sync`. -pub fn compile_time_assert_sync() {} - -/// `compile_time_assert_std_error_error::();` fails to compile if `T` -/// doesn't implement `std::error::Error`. -#[cfg(feature = "std")] -pub fn compile_time_assert_std_error_error() {} - -/// A test case. A test case consists of a set of named attributes. Every -/// attribute in the test case must be consumed exactly once; this helps catch -/// typos and omissions. -/// -/// Requires the `alloc` default feature to be enabled. -#[cfg(feature = "alloc")] -#[derive(Debug)] -pub struct TestCase { - attributes: Vec<(String, String, bool)>, -} - -#[cfg(feature = "alloc")] -impl TestCase { - /// Maps the string "true" to true and the string "false" to false. - pub fn consume_bool(&mut self, key: &str) -> bool { - match self.consume_string(key).as_ref() { - "true" => true, - "false" => false, - s => panic!("Invalid bool value: {}", s), - } - } - - /// Maps the strings "SHA1", "SHA256", "SHA384", and "SHA512" to digest - /// algorithms, maps "SHA224" to `None`, and panics on other (erroneous) - /// inputs. "SHA224" is mapped to None because *ring* intentionally does - /// not support SHA224, but we need to consume test vectors from NIST that - /// have SHA224 vectors in them. - pub fn consume_digest_alg(&mut self, key: &str) -> Option<&'static digest::Algorithm> { - let name = self.consume_string(key); - match name.as_ref() { - "SHA1" => Some(&digest::SHA1_FOR_LEGACY_USE_ONLY), - "SHA224" => None, // We actively skip SHA-224 support. - "SHA256" => Some(&digest::SHA256), - "SHA384" => Some(&digest::SHA384), - "SHA512" => Some(&digest::SHA512), - "SHA512_256" => Some(&digest::SHA512_256), - _ => panic!("Unsupported digest algorithm: {}", name), - } - } - - /// Returns the value of an attribute that is encoded as a sequence of an - /// even number of hex digits, or as a double-quoted UTF-8 string. The - /// empty (zero-length) value is represented as "". - pub fn consume_bytes(&mut self, key: &str) -> Vec { - let s = self.consume_string(key); - if s.starts_with('\"') { - // The value is a quoted UTF-8 string. - - let mut bytes = Vec::with_capacity(s.as_bytes().len() - 2); - let mut s = s.as_bytes().iter().skip(1); - loop { - let b = match s.next() { - Some(b'\\') => { - match s.next() { - // We don't allow all octal escape sequences, only "\0" for null. - Some(b'0') => 0u8, - Some(b't') => b'\t', - Some(b'n') => b'\n', - // "\xHH" - Some(b'x') => { - let hi = s.next().expect("Invalid hex escape sequence in string."); - let lo = s.next().expect("Invalid hex escape sequence in string."); - if let (Ok(hi), Ok(lo)) = (from_hex_digit(*hi), from_hex_digit(*lo)) - { - (hi << 4) | lo - } else { - panic!("Invalid hex escape sequence in string."); - } - } - _ => { - panic!("Invalid hex escape sequence in string."); - } - } - } - Some(b'"') => { - if s.next().is_some() { - panic!("characters after the closing quote of a quoted string."); - } - break; - } - Some(b) => *b, - None => panic!("Missing terminating '\"' in string literal."), - }; - bytes.push(b); - } - bytes - } else { - // The value is hex encoded. - match from_hex(&s) { - Ok(s) => s, - Err(err_str) => { - panic!("{} in {}", err_str, s); - } - } - } - } - - /// Returns the value of an attribute that is an integer, in decimal - /// notation. - pub fn consume_usize(&mut self, key: &str) -> usize { - let s = self.consume_string(key); - s.parse::().unwrap() - } - - /// Returns the value of an attribute that is an integer, in decimal - /// notation, as a bit length. - #[cfg(feature = "alloc")] - pub fn consume_usize_bits(&mut self, key: &str) -> bits::BitLength { - let s = self.consume_string(key); - let bits = s.parse::().unwrap(); - bits::BitLength::from_usize_bits(bits) - } - - /// Returns the raw value of an attribute, without any unquoting or - /// other interpretation. - pub fn consume_string(&mut self, key: &str) -> String { - self.consume_optional_string(key) - .unwrap_or_else(|| panic!("No attribute named \"{}\"", key)) - } - - /// Like `consume_string()` except it returns `None` if the test case - /// doesn't have the attribute. - pub fn consume_optional_string(&mut self, key: &str) -> Option { - for (name, value, consumed) in &mut self.attributes { - if key == name { - if *consumed { - panic!("Attribute {} was already consumed", key); - } - *consumed = true; - return Some(value.clone()); - } - } - None - } -} - -/// References a test input file. -#[cfg(feature = "alloc")] -#[macro_export] -macro_rules! test_file { - ($file_name:expr) => { - crate::test::File { - file_name: $file_name, - contents: include_str!($file_name), - } - }; -} - -/// A test input file. -#[cfg(feature = "alloc")] -pub struct File<'a> { - /// The name (path) of the file. - pub file_name: &'a str, - - /// The contents of the file. - pub contents: &'a str, -} - -/// Parses test cases out of the given file, calling `f` on each vector until -/// `f` fails or until all the test vectors have been read. `f` can indicate -/// failure either by returning `Err()` or by panicking. -/// -/// Requires the `alloc` default feature to be enabled -#[cfg(feature = "alloc")] -pub fn run(test_file: File, mut f: F) -where - F: FnMut(&str, &mut TestCase) -> Result<(), error::Unspecified>, -{ - let lines = &mut test_file.contents.lines(); - - let mut current_section = String::from(""); - let mut failed = false; - - while let Some(mut test_case) = parse_test_case(&mut current_section, lines) { - let result = match f(¤t_section, &mut test_case) { - Ok(()) => { - if !test_case - .attributes - .iter() - .any(|&(_, _, consumed)| !consumed) - { - Ok(()) - } else { - failed = true; - Err("Test didn't consume all attributes.") - } - } - Err(error::Unspecified) => Err("Test returned Err(error::Unspecified)."), - }; - - if result.is_err() { - failed = true; - } - - #[cfg(feature = "test_logging")] - { - if let Err(msg) = result { - std::println!("{}: {}", test_file.file_name, msg); - - for (name, value, consumed) in test_case.attributes { - let consumed_str = if consumed { "" } else { " (unconsumed)" }; - std::println!("{}{} = {}", name, consumed_str, value); - } - }; - } - } - - if failed { - panic!("Test failed.") - } -} - -/// Decode an string of hex digits into a sequence of bytes. The input must -/// have an even number of digits. -#[cfg(feature = "alloc")] -pub fn from_hex(hex_str: &str) -> Result, String> { - if hex_str.len() % 2 != 0 { - return Err(String::from( - "Hex string does not have an even number of digits", - )); - } - - let mut result = Vec::with_capacity(hex_str.len() / 2); - for digits in hex_str.as_bytes().chunks(2) { - let hi = from_hex_digit(digits[0])?; - let lo = from_hex_digit(digits[1])?; - result.push((hi * 0x10) | lo); - } - Ok(result) -} - -#[cfg(feature = "alloc")] -fn from_hex_digit(d: u8) -> Result { - use core::ops::RangeInclusive; - const DECIMAL: (u8, RangeInclusive) = (0, b'0'..=b'9'); - const HEX_LOWER: (u8, RangeInclusive) = (10, b'a'..=b'f'); - const HEX_UPPER: (u8, RangeInclusive) = (10, b'A'..=b'F'); - for (offset, range) in &[DECIMAL, HEX_LOWER, HEX_UPPER] { - if range.contains(&d) { - return Ok(d - range.start() + offset); - } - } - Err(format!("Invalid hex digit '{}'", d as char)) -} - -#[cfg(feature = "alloc")] -fn parse_test_case( - current_section: &mut String, - lines: &mut dyn Iterator, -) -> Option { - let mut attributes = Vec::new(); - - let mut is_first_line = true; - loop { - let line = lines.next(); - - #[cfg(feature = "test_logging")] - { - if let Some(text) = &line { - std::println!("Line: {}", text); - } - } - - match line { - // If we get to EOF when we're not in the middle of a test case, - // then we're done. - None if is_first_line => { - return None; - } - - // End of the file on a non-empty test cases ends the test case. - None => { - return Some(TestCase { attributes }); - } - - // A blank line ends a test case if the test case isn't empty. - Some(ref line) if line.is_empty() => { - if !is_first_line { - return Some(TestCase { attributes }); - } - // Ignore leading blank lines. - } - - // Comments start with '#'; ignore them. - Some(ref line) if line.starts_with('#') => (), - - Some(ref line) if line.starts_with('[') => { - assert!(is_first_line); - assert!(line.ends_with(']')); - current_section.truncate(0); - current_section.push_str(line); - let _ = current_section.pop(); - let _ = current_section.remove(0); - } - - Some(ref line) => { - is_first_line = false; - - let parts: Vec<&str> = line.splitn(2, " = ").collect(); - if parts.len() != 2 { - panic!("Syntax error: Expected Key = Value."); - }; - - let key = parts[0].trim(); - let value = parts[1].trim(); - - // Don't allow the value to be ommitted. An empty value can be - // represented as an empty quoted string. - assert_ne!(value.len(), 0); - - // Checking is_none() ensures we don't accept duplicate keys. - attributes.push((String::from(key), String::from(value), false)); - } - } - } -} - -/// Deterministic implementations of `ring::rand::SecureRandom`. -/// -/// These implementations are particularly useful for testing implementations -/// of randomized algorithms & protocols using known-answer-tests where the -/// test vectors contain the random seed to use. They are also especially -/// useful for some types of fuzzing. -#[doc(hidden)] -pub mod rand { - use crate::{error, polyfill, rand}; - - /// An implementation of `SecureRandom` that always fills the output slice - /// with the given byte. - #[derive(Debug)] - pub struct FixedByteRandom { - pub byte: u8, - } - - impl rand::sealed::SecureRandom for FixedByteRandom { - fn fill_impl(&self, dest: &mut [u8]) -> Result<(), error::Unspecified> { - polyfill::slice::fill(dest, self.byte); - Ok(()) - } - } - - /// An implementation of `SecureRandom` that always fills the output slice - /// with the slice in `bytes`. The length of the slice given to `slice` - /// must match exactly. - #[derive(Debug)] - pub struct FixedSliceRandom<'a> { - pub bytes: &'a [u8], - } - - impl rand::sealed::SecureRandom for FixedSliceRandom<'_> { - fn fill_impl(&self, dest: &mut [u8]) -> Result<(), error::Unspecified> { - dest.copy_from_slice(self.bytes); - Ok(()) - } - } - - /// An implementation of `SecureRandom` where each slice in `bytes` is a - /// test vector for one call to `fill()`. *Not thread-safe.* - /// - /// The first slice in `bytes` is the output for the first call to - /// `fill()`, the second slice is the output for the second call to - /// `fill()`, etc. The output slice passed to `fill()` must have exactly - /// the length of the corresponding entry in `bytes`. `current` must be - /// initialized to zero. `fill()` must be called exactly once for each - /// entry in `bytes`. - #[derive(Debug)] - pub struct FixedSliceSequenceRandom<'a> { - /// The value. - pub bytes: &'a [&'a [u8]], - pub current: core::cell::UnsafeCell, - } - - impl rand::sealed::SecureRandom for FixedSliceSequenceRandom<'_> { - fn fill_impl(&self, dest: &mut [u8]) -> Result<(), error::Unspecified> { - let current = unsafe { *self.current.get() }; - let bytes = self.bytes[current]; - dest.copy_from_slice(bytes); - // Remember that we returned this slice and prepare to return - // the next one, if any. - unsafe { *self.current.get() += 1 }; - Ok(()) - } - } - - impl Drop for FixedSliceSequenceRandom<'_> { - fn drop(&mut self) { - // Ensure that `fill()` was called exactly the right number of - // times. - assert_eq!(unsafe { *self.current.get() }, self.bytes.len()); - } - } -} - -#[cfg(test)] -mod tests { - use crate::{error, test}; - - #[test] - fn one_ok() { - test::run(test_file!("test_1_tests.txt"), |_, test_case| { - let _ = test_case.consume_string("Key"); - Ok(()) - }); - } - - #[test] - #[should_panic(expected = "Test failed.")] - fn one_err() { - test::run(test_file!("test_1_tests.txt"), |_, test_case| { - let _ = test_case.consume_string("Key"); - Err(error::Unspecified) - }); - } - - #[test] - #[should_panic(expected = "Oh noes!")] - fn one_panics() { - test::run(test_file!("test_1_tests.txt"), |_, test_case| { - let _ = test_case.consume_string("Key"); - panic!("Oh noes!"); - }); - } - - #[test] - #[should_panic(expected = "Test failed.")] - fn first_err() { - err_one(0) - } - - #[test] - #[should_panic(expected = "Test failed.")] - fn middle_err() { - err_one(1) - } - - #[test] - #[should_panic(expected = "Test failed.")] - fn last_err() { - err_one(2) - } - - fn err_one(test_to_fail: usize) { - let mut n = 0; - test::run(test_file!("test_3_tests.txt"), |_, test_case| { - let _ = test_case.consume_string("Key"); - let result = if n != test_to_fail { - Ok(()) - } else { - Err(error::Unspecified) - }; - n += 1; - result - }); - } - - #[test] - #[should_panic(expected = "Oh Noes!")] - fn first_panic() { - panic_one(0) - } - - #[test] - #[should_panic(expected = "Oh Noes!")] - fn middle_panic() { - panic_one(1) - } - - #[test] - #[should_panic(expected = "Oh Noes!")] - fn last_panic() { - panic_one(2) - } - - fn panic_one(test_to_fail: usize) { - let mut n = 0; - test::run(test_file!("test_3_tests.txt"), |_, test_case| { - let _ = test_case.consume_string("Key"); - if n == test_to_fail { - panic!("Oh Noes!"); - }; - n += 1; - Ok(()) - }); - } - - #[test] - #[should_panic(expected = "Syntax error: Expected Key = Value.")] - fn syntax_error() { - test::run(test_file!("test_1_syntax_error_tests.txt"), |_, _| Ok(())); - } -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/tests/aead_aes_128_gcm_tests.txt temporalio-1.3.0/vendor/ring-0.16.20/tests/aead_aes_128_gcm_tests.txt --- temporalio-1.3.0/vendor/ring-0.16.20/tests/aead_aes_128_gcm_tests.txt 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/tests/aead_aes_128_gcm_tests.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,552 +0,0 @@ -# The AES-128-GCM test cases from cipher_test.txt have been merged into this -# file. - -# The test cases marked "FAILS = WRONG_NONCE_LENGTH" would succeed if nonces -# with lengths other than 96 bits were supported; i.e. those test cases -# describe valid outputs for the given inputs, and they are only rejected -# because nonces that aren't exactly 96 bits are rejected as a matter of -# policy. - - -KEY = d480429666d48b400633921c5407d1d1 -NONCE = 3388c676dc754acfa66e172a -IN = "" -AD = "" -CT = "" -TAG = 7d7daf44850921a34e636b01adeb104f - -KEY = 3881e7be1bb3bbcaff20bdb78e5d1b67 -NONCE = dcf5b7ae2d7552e2297fcfa9 -IN = 0a2714aa7d -AD = c60c64bbf7 -CT = 5626f96ecb -TAG = ff4c4f1d92b0abb1d0820833d9eb83c7 - -KEY = ea4f6f3c2fed2b9dd9708c2e721ae00f -NONCE = f975809ddb5172382745634f -IN = 8d6c08446cb10d9a2075 -AD = 5c65d4f261d2c54ffe6a -CT = 0f51f7a83c5b5aa796b9 -TAG = 70259cddfe8f9a15a5c5eb485af578fb - -KEY = cdbc90e60aab7905bdffdfd8d13c0138 -NONCE = 9d987184c4b4e873d4774931 -IN = cb75a0f9134c579bebbd27fe4a3011 -AD = 7dc79f38e1df9383e5d3a1378b56ef -CT = c6a899758b6c11208241627c8a0096 -TAG = 7525125e650d397d0e176fa21315f09a - -KEY = 819bc8d2f41996baca697441f982ad37 -NONCE = 08b7a15f388fafb16711ce19 -IN = 9b1ddd177d2842a701b794450e3c81f151f195a1 -AD = 277c372784559784b0e047c6f8b7e9efb6f7491e -CT = de9b9c8fe09f705f558c62dc6d40b75e3aa625b6 -TAG = 52e2d2f153a4235eb6fac87ff6b96926 - -KEY = 682769d52fa0bfeaebe0d0c898d3cda7 -NONCE = 6af0738b249d09547837883c -IN = 3461523cd98a6e8bdddd01150812e6c58d5cfa25d385cdbbc4 -AD = abe8302d7d5595698d9f31011c24d4d180a637597098361354 -CT = aa3ecb46b9330554b36d0cf6f6ac4cf5e27bfd5f602da1b3c9 -TAG = 0ba547961eba5c58726c418f51d31311 - -KEY = e2b30b9b040bce7902c54ca7eec00d09 -NONCE = 28ccf218e8de56ea91422a25 -IN = 483080d7e2fb42580dfb862d2d266fad9fdce7cdcdb1158d415f84b6e269 -AD = 9f06fbe67eb2ace15c8011032feeaf72fdf6d316e1e08ef4cc0a176588af -CT = 67e1980ced4cd232ce893938e40b0798b17a1692476342e520b480a18570 -TAG = 9994185d4329cfa5f4bbeb170ef3a54b - -KEY = eaafa992ef6dbcc29cc58b6b8684f7c7 -NONCE = 1ded022dbc56e9ad733e880f -IN = 900951f487221c7125aa140104b776ba77e7b656194933fa4b94a6d7f9722aad51b2fe -AD = 863ceb297cb90c445dbcf2fcffe85b71db88d8c935158f697023e2cea103ec39766679 -CT = e0b3aaa890e45f1c39ad4f13ba7592f5251d6a02ca40fe3633651b35fba74a579f48c5 -TAG = 5c95fd941b272bafbd757553f394991b - -KEY = a43859049b2702e8807ac55b0ad27b0e -NONCE = bbe8c571342cac7fcc5d66cd -IN = 8673d6ee2903265c92446ce110d5bb30aa2dd1b1ac5558029f23974acb8a2fbf4c74858fc73d6104 -AD = f77c998ad3ace0839a8657e350bed15ffbd58f152a0dc04ffc227d6beb5738ad061d0f83c2a26999 -CT = 40e201a513979b093637445275b2db5ed4cb1fa050af0e20e43b21af6bc56dec654541e55b295b72 -TAG = 41bbef45727d19ee544fba5b360312f0 - -KEY = 68fd608c8697243d30bd3f1f028c5b74 -NONCE = 319a210b33c523d8bc39fbea -IN = 2c088f38f7a58e68bdd92632da84770303cd1ff115d6364479fb0aa706571f68d51be745f5c1d1b44fa1501cd5 -AD = 1417a65249b85a918622472a49df50bdb2766aae7bc74a6230b056549851b3c2f0cef727dc805ba2160727fbb2 -CT = 9d376b147620c2ac6a5eaa8ee44f82f179f61c9bc8acdd21680a7ff03acec953437a3cc9660c7ecb1204563944 -TAG = 05a4fb5be11e3edd89e34d0b7132d0fa - -KEY = 6edd3bd2aa318f78b4a51103cb08d489 -NONCE = ef0027b144691bc9716fbeca -IN = e98f2f99680dc748fe0b57390df38a99950faaf555a888d463d005ef4e4b1c22663d3d3daa812b20ae35ac934c2e187cbba7 -AD = 97337902507391de0f15c88462aa5ffc5e4760543850719ccd8a0cfef89484d8095c23ff8c1d06eae4ff6d758c95e65cc3b5 -CT = 3c54842c2099b73daa9c3f1cb64bb913c0527955d923510f3f3046df471c1365db97333bc5a86dc7c5f23047e938fac976c0 -TAG = 375b2a25421434e5e3a021d434fb2d04 - -KEY = f70482d53d3ef70cdc3cd3c4a37aeb2b -NONCE = e69d3de363e225749cb1666f -IN = 4cb68874e69125e1a6f6e68669b48317e1b361d0f7f95ec4cf613b7da2c835832010e8f95eaef4e6800b79bd86cd7cda869d2df258c267 -AD = d72975f15721bd0957f5cb1edecaad2d1ef047afb0e779035f777f94cd7ed1bdf8ca9d4f357d2a1e195f195e7483dea1476133235f7e6b -CT = caa1e48decbda18e314057c5ec32f8733a5cf03ed0d05c3654531bf56faa70751a6c7f70fbd7d39f7e9775a772aba8fe7731cd0230beab -TAG = 47d909cbdd1c7f8b485fc3232bb7185f - -KEY = 98a12fe16a02ec2a4b3a45c82138ae82 -NONCE = 4b3404684825dfcf81966e96 -IN = 899710fc8333c0d2d87f4496436349259cf57c592e98ec1e3c54c037bc7ef24d039a8c573ec7868e8ce9610b0404ea1b553ae10cc8cec26468cc975c -AD = ea1a99cee666bf56c8c3667ef4c73c2e1e6534800d6e39a97de3bd5d39068bb3e2f74f96c03463afa18f1ee88c21209bae87f37e5d0269b68db370fe -CT = 0431b7fc4889ae401eab5edba07a60f9682fe58419d4140cbf4f20c62d79d8a3cc1f23fabead0e96e1c8c90929756ea1efab508336e1d0ed552eafd0 -TAG = 01053ceeb4f9c797eef9426930573d23 - -KEY = 6538e8c8753928960ffc9356d43306b6 -NONCE = eee386a2b1e310665e335746 -IN = a92eb9a93a90fdbb2c74dea91d273a48efe9582f8af7a4e3a377b114770a69ca45421959fcf36107815e53dc61b7bf018fc42965fb71d1eafce0961d7698fabbd4 -AD = c5e572e464718398374c8b45ff8749cd9f517bbd97767f77a96cd021176c49c0acec8b055ef761f49aa6d910375a45b2f572cd5420b99153971a682b377ac88f09 -CT = f36353de609d0b5246f64a519d89a4dfcd9d53325a2d2cf910e7692e68391b0357b056b944e0b53e41568f304bea8822f9ff7a0375a5a8087509799226862f707f -TAG = f7f9b891089d02cac1181337d95b6725 - -KEY = cabdcf541aebf917bac019f13925d267 -NONCE = 2c34c00c42dae382279d7974 -IN = 88cc1e07dfde8e08082e6766e0a88103384742af378d7b6b8a87fce036af7441c13961c25afea7f6e56193f54bee0011cb78642c3ab9e6d5b2e35833ec16cd355515af1a190f -AD = dd10e371b22e15671c31afee552bf1dea07cbbf685e2caa0e0363716a276e120c6c0eb4acb1a4d1ba73fde6615f708aaa46bc76c7ff345a4f76bda117fe56f0dc9b939040ddd -CT = 049453baf1578787d68ed5478726c0b8a636337a0b8a82b86836f91cde25e6e44c345940e819a0c505751e603cb8f8c4fe98719185562794a185e5dec415c81f2f162cdcd650 -TAG = dce7198728bfc1b5f949b9b5374199c6 - -KEY = fd1dd6a237a12d7f64f68eb96890c872 -NONCE = 459ced97ebc385ab3a8da8d5 -IN = 04a9709fdc0a4edb423fe8cf61c33a40043f1a585d5458c7512ec8e4e066a0f95e2e6609abf3c95a5d3ae2c738269533855daedd92eca20bdedbbd5677cd4eee84b7a1efae0904364f1e54 -AD = d253b829a2fbc5877b0fbe92e7b79f38886a49ca889ae72b91f2c3aebe257a3ffe0d390b5d320bea22d6a5536cd9213612f5ed6e3b0ea33ac91cfee284cb25eaaf6b85b15f7ca894317182 -CT = 4a565d3ba4f2ec461c9bd8dd0f96bc00d2a561bfb56443c8cf47681bdf1c61f55854bea060c4219696cac79c09aa9400a7e5c59c6b6ca556f38c619a662905fc5f0e8437b906af6138e3fb -TAG = be5f93201d7980af4c5bceb24ac1d238 - -KEY = b09a4d99112e1637d7f89a058988b417 -NONCE = 74348f7126c0cac836e9de5d -IN = 6b3c4cfd1eb139b62d91ed5d1d8b0f3b52278d5c48787ce46f12b9f026e3eed1bfbc8c6684c6662f06614c69440b3d7cff7c46b2e4aebaa4b5b89236a3cc75535bc600104f240d01de91e0fb3bcad02c -AD = 7883ad259fa5d856ce283419f6da371b444b9b64ea0ddb371b17ec0a9ada27b0eb61b53bd3605f21a848b1e7ed91162f3d51f25481f32d61ec902a7f2cbd6938a7ce466a37e4467e4ec2b2c82b4e66ca -CT = 5e1b783b20fd740310333eddde99a06b5740428cb1a910812219fabd394b72a22a6e3ca31df0afae0a965f0bc0ae631feeaa5ce4c9a38cd5233140b8557bde9f878e65e8932b9e3c3f6e57a73cda36cc -TAG = 784b73ee7824adf7279c0a18e46d9a2b - -KEY = 284bd8c4b5d7b16aebce1b12988fa1d3 -NONCE = 7ff05007c5d018b17562f803 -IN = 903416331583dcbd31420906c64dc76e14d0c5044d728cd9b605b531ddc350fdaadeabe67d08f0b4c7179f82a1044696716cd96459506453141e9ec3130e893d8c2ff9b8b4c241b73866ca4fc1f712d17d7a88bf4a -AD = d0a1f92f80094c1fad630ca584edd953bf44cdde404f22c8e476df8708a97a0712e7fbd8054caa7d65144d0be3b30442d0dfa5469ba720afe1d00aa6bb53c79c1c178ed42fce596eeb6c638c8a8dedf76a431976c5 -CT = 9bc3708f70a68fc16bcc33099325c821a0ae9a2fd0a6a98382fa21b42ddb3a9ac6c34a13c4805d3beb92586cdf0f4dce3885793d49abce33190685e7009a79242dd93594722a1ceaa44886371c30bcc8312fa2bf67 -TAG = 3fd8a4d760d5b878852b1ca2d34dde6e - -KEY = 6d76dd7dea607a5cf5c21cd44c21a315 -NONCE = c1d13e56b080a500f1cb80bd -IN = cb959b92e777f835afc4ae4149b190638851238b7b13c9bf65343adb3130e8ad2356101037f30997d4a5fcc0a1d6415210179fdec881236a799f6e90dd43ea3817819b432611eaafd072368b9c7036c7a88c8b7774a8ed986134 -AD = 92a2bc3b6b6ca9de0cef10d8bdeaadf6f54782cdb2b09e66cce8cb5b56895636e982f7a3c7bd9d221ade62c9ecf68bde70becf683804386606ab1c48ac764c4e11620064545c5beaa5911c118856dfc5cdb8df50052b01762c6c -CT = 522ba9bfb47efc624cd8933fc9e17784919d2b3ccfaeec46af414c1b316355f65b9f9fd7f0be6ac3064b4016e43b8fb2028459f0fa0d81fb6656be0ab8fd841d05d24682b4a57c7c59d89af384db22c2f77ce10abc4d1c352a1a -TAG = 5ea4a77381679876e0e272b53519d533 - -KEY = 1dbcbe45a47e527e3b6f9c5c9c89e675 -NONCE = 98f2da8ed8aa23e137148913 -IN = bb23b884c897103b7850b83f65b2fea85264784737d40f93ecf867bfdba1052f41f10d2c5607127da2c10c23b1fbd3a05ce378a9583b1a29c0efbf78a84b382698346e27469330a898b341ec1554d7bf408cf979d81807c0cc78260afdb214 -AD = 46f1bde51f6c97a9dae712e653fcac4da639d93a10b39350956681e121fb9ea969d9dc8ef6ddfb2203fad7ab7e3ef7b71eb90b5089844d60d666e8b55388d8afb261f92b6252f4d56240fe8c6c48bfde63e54bd994ff17e0bf9380ebfb653b -CT = 0d90e869d2f4c85b511fdf85b947ba3ab75c6b1845d8191634770413d7574a6fbd9d86897cb3d3b5d3d8e6f74fac3bd2a9b783cb16cfbec55dd7d2f7fc5c39fe85d39bf186a3fdd3564bc27d86f4019ae0cb73f5f516b602331433689c1b08 -TAG = 8777f2002d5a5214a7bd8ef5a3ccfbbb - -KEY = fe33f47136506e5cc14114eb62d26d64 -NONCE = 9534a10af0c96d8981eaf6b3 -IN = 3ca38385513eaf1fcd03ac837e4db95c0ed1a2528b7ab3ac8e09ecc95698d52b7d90bf974bf96d8f791aa595965e2527aa466fb76da53b5743eda30bb3ebd9f6a8a7721fbfe71fe637d99a7b4b622e6da89e0824ac8aea299ea15e43250d2eccb0d4d553 -AD = 50b7bd342df76bea99b2e9118a525c0f7041c7acdf4a3b17912b5cbb9650900246ed945cfc7db2b34a988af822c763451ac2e769ec67361eded9bcab37ac41f04cdb1d2471c9520a02db9673daaf07001570f9d9f4ac38f09da03ff1c56fdefe16a855ac -CT = 927fe3c924d914a7aae6695ddad54961142b7dd5ff4c0ba5ca3e0cf3d73bdb576afd59bd2b54d820d2a5da03286c124507a48008c571c28a0ce76f0ed68dbac3a61848e7e2162be8e0bee8147b9bf60da625cdab8601bfb37dfcd165f533e94a32c26952 -TAG = 9bd47a4a2acaf865a8a260179aabf8ad - -KEY = dec1b34b7b81fb19586c6ec948ecf462 -NONCE = d9faf07e72e3c39a0165fecd -IN = f7b0bbe9f0ff4dcf162792e9ee14d1ed286114f411c834ad06b143cadbbe10a6fbc86f6664e0e07ff7c6876d4543e5b01ff5ddb629f896c30c8cefd56c15d9f24dfd2ed590304a6aae24caac5870ddafc0e672ac3aacae1867891942998c712d45efbfa4d99a8a6f03 -AD = d3c4fc4838cb3cda3937455229ddaf1cb9102e815cb9f519a5434677c68b11a0bae1280faee82f1a5bee593e669e6f81d5ece3675b8af63f1491bb298531aacc940f53678ba56ae96fc66be92b904bc35f2d5b68b3ed98569a4d04e8f8a9689ad9fa4b51db0938a9f3 -CT = 2f44ecf549077b98ba551819538097bb80304a55c48ef853e20ed8c3f808dc8cb5eb41c2463d19fed2606b59cee4b458958ea75715f7654146df4519dc63524a0569a00d7bbc4b32a372f82d955be5f190d09d35c267da1017e8b16096ae84f8a671b45aaf0d1ca59c -TAG = bc3af80cf9388d35deadecff5455d515 - -KEY = 021add6030bd9f3fed8b0d1f16f83783 -NONCE = 4e460f51fe6b5eb9558c4571 -IN = d9aa1d0db5de536cfbacb59bb75c592ae3f34a5f9c5ff4f22d14e8e4bd0754af19570221893797f60c89a251cd6a19c2953662dca51264afc21099ed5c80077b0e10a5295b3c4c6fe47d3c1c84fee69ebf7d8a7d9b1b338dae162e657e6cf5277ca70d47b9290aa7efe67b0ce574 -AD = 38d99cfd7578d40ffa1749d5fe83500362ceee76c5af38935806837b2f2d1b3422a5057bf617b07868dd95d8e5f4a24e74f96177d53a0275450b429a2b1f364805030765e376151ae35001d6a4872200142fdce82017f3e976ab0edac1a08d2649d297648320e7dd9143b554fa3d -CT = 8863ad51578fd1c9dc40702e34236adee885955f0478ad9a094a6941f95f900e466882dcd5b86e1563ba89aa105f56f3ba5ed860ec3338ee1b750a2f9332acb3f0f61718de7e40fb80442d046b35f147f178bd05362f0559a20a53ebbf78e920fe14c9d80d1c9fb21bee152f8ab2 -TAG = 614539247fdcf1a2aa851102d25bb3bc - -KEY = 311c2045d5486bfadd698e5e14faa58a -NONCE = f1cd8b373cec6451ae405618 -IN = bd154e428369aac5c13128d29bd3031364939abd071c34bacac6ea7292b657b794b2e717d9bcb5d7d01496d805283fffd8f7de6a3493ddd8d1dd7f58835a44d43ea22d95468d1239ca5567d6c80bdf432fce2afc544a731a2852ef733667b9f8f4f8923eaa9de3aa32addddf99b607efce966f -AD = f70cb7e67b2842207df55fc7582013bbddff8c7f3bd9ebbaf43827aa40f8490e65397934ee6a412de6272cd568566ea172789a006a92e5920140ca5f93f292b47dc262cefc66b75543f94365c08795b7c5e9c6c29b7dc67b2532fbf8a6487d40a3eff504e75c3f2bb2cc3969621028e2112e67 -CT = f88f4ef0431d0f23911aaa38a4022e700d3a33c31e0c7bdebe00f62ca3b55d358385de25ceb0538242871eb9c24530e557d7981fa0182436e1e49272d52689541f09517fd147a8da0f0d2bb32d54911a36eded0b87bcba54d6842edf461b45839df1cab5176e2c82c871b3be4ec1bced67ec5d -TAG = ae8d847f106e914ffadbdfe7cb57beba - -KEY = ceab57de6220b2c80e67f0c088e97b36 -NONCE = 8cf438aeb0cb29dd67506b9c -IN = ce2a7a5663449cf6e0068085e3c373c5ca6f027544e327bbc09ac00f1571268bee186d51a00bbc16da7429e4d3d5235d8d54ac96b6ecb2fb7d77a6e5b9e70d431dd4dce78ceb972e9e4b63059e350efaff841c2c42bc29c139b7fd070097556b6281b58e074d5271d9f66c6744ec6dd3b9db2f4a21aeeb7d -AD = 03e464d111ac9228d39d22a00120c6ee671fe5bbf462b1ee3fdf348b34999518998ac4e175ed48189c29b49b5527c27c43094eecbeaeacd3cdb48cd15aa82573e884a7b97bbcdad610a6955f7d8b04f6f98a13a907bc2bec4c940b77582b248f5fced1771f810977b2d0a4fa48bd4d78e4bc383bb92743fd -CT = 1fa9c379c78b92fa3c1e478443ae38d7b4b50235448ce2a88467514bc9db95844ec1baf4dbdbd1b0720e377d05d82c3b58b52af8c9c50417b39ad225e373c7ff18ac5a6ea5d182b255f1c8a2766e31e3e4e3d55dc08dfc64b818ead40a0e824b06ab24f0dc9f4f0c383db7cd4d40016b31701bb401b126dd -TAG = a9a885578467430504731d1a8f537e3c - -KEY = 585bbac0ab4508afb8b72d84167551aa -NONCE = 774c82af194277a5506e45ba -IN = d788112213d2b8b5b66b056e8b3e344a7876f6193b59a480c51fc04d3ec2e5166344c833187b14117276fd671a20937a4553181c29d3d85afe385dd86093708226f082a2ea4ec3288f372c772ca7ceae86b746ff428e8add17b0f34f8553e3db63f55224c39edf41f138a2c28be49d56aa8b4c93502b9794a16310f78b -AD = a29665261a8eb58c88803bcf623dd1a14e76af49ec5db72a267f2ebcbc479385fb6b32bafcb1239515d74a8282b228e83daf282d1ab228099b315bbed0f0e6b3427e029cc28c025460a8bf0914bd584c13e7de7830ab77fb4a9258dfdc9fdaa96ca941546477f04cea19a365a27de34e23e154e7419aefb0be0e871bbe -CT = 24f2856e4e40c0b2b8b47e43d94c1faba498884f59d2ae1cdf58c73770279c96feeee3025ec698cd8f0ae25bf0c9fbf2b350674c317e52bad50aa6ed9845e194f294eb71ff192604af50ac7192f308583a3edaf6c7aeb588990be81b801dc916ffd621dd4016e2b76e9078c89fac9da39f3a88f6548006a48b0199a732 -TAG = a5c8f9daa30b045bd3e1c1b01f438518 - -KEY = c5d727d159dd328b4160ff45a183226b -NONCE = 881c0802db519ce1595573ff -IN = 88b4be77bb8a2f37bc5e84ef9da92a4b8c3777dbcccfed13b97e93c19674c8c3f13119363ace377a14e5f36501ba9a3898fc09340886d91bf0a17ef0d028f2a92ec150071623a4a5db8e56e99e764629679943ea879ec7634fad1480e8617fe834c26210276d7db208b13f9b4c2060f2867aacb1b47c8e110830beff721dd8d120de -AD = 5f6513ad3d490f784dd68ca1df41e8c8e1ab9a240ea8e9bc22d0b1d7353da94d5d37c94f0dcd1a2dedd6d8e1c79a383e7e214cbb6ee2ccb7c6d894ffce5d01b6cf13876ae2648d36adccd88710d7d2ab6d43826d37ee0ee3b434972a2cb8f4db1c3304cee0a352bbef76f05de0e6f55a410eea5e697afb197f2483f0200d0abee224 -CT = 66bbee209eb11c675ecd3303c38cf1087b010c532e1357732c4911ca9db78c67805c95c829194cd413b635a900a08454c6eb9cfa3597ab531fc9ddfdc5b02b290be2a618df7d03b1ab465d6d03e8b87a430bf4e80d8cb9916145cf2d2342a91fc79defa151b1f3c695608e76ca2abc4c0383897f1cbb9d4bd9969b2f33813e2b5502 -TAG = 43daa08e6eac70e3238ce655adb65005 - -KEY = 16af56326046c92afca49fe173d643ad -NONCE = d32a935b4e56472d92d9f2ce -IN = c49c8e5769670384d23d9af9834026395d3f3bd32d88e61ed06b2e00e52a5ae4fe3867993c2af95203cd4006470a89677864431fb9edbed17412913bad4bb3eaff0fccaa150c9b13f83b9bf06698af844841a640d6f94d845296638ac27fb5ed87c310dbbd36415161310b284b8f84b4e025267906e0a4c822b76a682d44a70f9afde9bcf48ac2 -AD = f713886f4086026779a7e479fa646cb33574e6c977d70b8da49c8fdbb395dc7c149a59e219db8e4fff053cb00e2a1df9850fce94e52fd34661fd3d4cd8ad3ffe0b4bc7ccfbbf42eeef3e30ce13cdfd77dbd067ae9f5aebfa068f6b7ae2c17ad956dc03511dfcc38eac9fa3c0c0e9a340f5c58e39d868b77dede54fea1173216c0bb8f0a6c2990f -CT = d5d7d1ed0ae3e3481e2ccee201857ce1f427734fbb4fbe82a2b90601104008b8ad4daf74514b8ab3e42b6f6b509159ca04489b1175ce1e3fe33d36ea521e0aedff8c69fd00aa588d7a2eb9d2d551e2b8fea321f573e2a1df147535a873d540a3169d3ebc099ea6c33cefc04a2d55dc2d47237b95ad269fcdcd3c3750af426beb4edfe7837b413f -TAG = cbe0fb9509c224bb0e8e33f7ef9b49e6 - -KEY = b3df227e6dc2c846095e2a3b825d7645 -NONCE = 578bc24ca3845e23204df661 -IN = bf69be81cf0b340b006badc9f644d10376f4f9a7a78c997edb8729e3786447f21e97e4c1e0c0c74e01ef655d0a84ffc04ff7c6712ad65adc9a0da2e3078d4c9e796c9bcd71e7a9da26b987990d366b5e00a23a93652e10942e07a6aa01375af27080c9cbab5f554497abc48260937a6fe895361e79cd3d5e78c1a65c6723d4a4fbe9b3dcae3c05699cf6d3fb -AD = 00898eedad307fc017917a3296bcedabaad8a505edd34e93d92f3b61797ddccf3fc31144ef70f255be3b0c165c97eb8706f14c495f4aa9b3f15d2dafd65bf6741d67fe240967efbf0e75e610db9a8f722035e039b5e9246d258084a04c12ee8ad1668032f8caec737481fd894dba2ef702d3e6089acbb0fe0bdd6daa2a5cd47fc62603499fe3ea37365072e5 -CT = cfeb249551a695ddfec5f789e7f0a9f916abc8ee01d6233c32744c10a09b5b19ff9ed15e9f10de8f93c8ca1ae3c34e26fdbbb7f3b0f5f8b064501830d3cc982da99b294ce51bd33085c98b0ac0bfe44a8f4a5a26511afa3461aa88b770f076fe119ec90f33d8c9e7777f30b8cc95864f06e04dd8e328ad7a2c7dab83b03abfdde065bcd0c7d6dd47389108c4 -TAG = 3dedd1054f1a29286a51817264317b83 - -KEY = 58a57f04d1d5cbdd1bfbe01dd5f7e915 -NONCE = 47affabd7dbb4cce76661081 -IN = 5f82d481a6a3856c6f0be2aca54d666f16de88294a4d763134dd51ef03661bab45da94b9871d94e5b574a52214b22c92cf9690ecbffca9b108fe796abed9e608778c0b99d7bea1daec08dae89d5f7229c04fd52cc906b5f5b9fc0f0fc1e0b2272dcf4865286ee22bd9edcce1afadb579ec72cdf6038cfc75c2dbab5a1fd64b6f8e200d1ad0afcf25863293fdb7276648de -AD = 4b662822b48005fbd85bb99e6a946eaa74403909f646d914a236eecc5f4558b60b2efb1584b1f32d936b90428dda6568515801d21d24d6fb622e6463897c70be01f81fef741d6dd5c6556d163c3f048abe49f21817b41850ce79d7ec1fdfeba32935b58d898e964fa4b36f79c0f1f560b0afec3887ab325e1a025fa7662f9baf8e08a9ee714b8369621a2f1e6d2e96896a -CT = 31ab08ce0aaa883628f4b33369e5f6e5a54ee4a6596f25ecd54eeea30e81b41d357cb6c671adb6acd3d4e6654feb2ab1f3259692502efb33c5121e0852cbcb2dc5d9a4c65752debe9c4bf5e995fc909a2881621d46cc220806703795e61c0fe74c99e3c1230521b1f97bcbf4e95326e2d581f0cc879a2fc06ef88226a4413f9e9985edc913c418cc198c4df13cd46afc24 -TAG = 1e54066c6cc37f35c62b47426b609457 - -KEY = 64011470970333b7b677d4ad8ebf3ea2 -NONCE = 17031c5133a426d96de93123 -IN = 882cac1ece2d22a1db7f8339332379eb68516c8b7dcb3c089a5bfecceb49f48a169215313686eb5708135f379d89962af478cae865841e0c97ab47a57a456f634282c4e03c99abf7f7cc4e8360deb48160288f06e96cb09114877f9d91dae98828285626a1528aac87f39cfb8ad3db344fe4318aeef6f6ba14bd1edf9caab548c09f8eea091229a90dbc4b0fa34fda2bf13d300a1f9c -AD = 0394bb920cf58806b909d90c046402c745f6876af85d8a281081e22a1908f8475126594b39a0e191a070bda7c78d30dc4867e69ea522cfc962fa5f9915daea9133e998eab22f32a18957a3cf7d91c6f3d54cea94875d60be694ee841fef01e69bf5997ba4f25e846558431eb592605265f235211c2bb2d4807278f4b9c314039d0768df24e9c098c6a01c689d6a143073fb1a29f4400 -CT = dd347d6a3d4a71b2bcae0a0c690ca311f012c6ceda4f7fc054b8f9b59bad54237b64b93331b99f1305801640a68e7d50cef581a57ff2564c90995a8dbf57fa8cff046d0b946af5f68e0aa3d73262965622fe6d35c78f949a6cf9e4f62ba71accbf403b690e31f610305faa6737a19efba1e1ee97084cff2d125bd69a5a4ff99aa399df650452daa835b3e54114b295f00d94fc60e2f8 -TAG = e5e72cda6755bfb3a44377945adb5ca1 - -KEY = 4852e546fdea545d7dd12493a687e895 -NONCE = 7a3e136cd961191570c1b0b7 -IN = 30c10d7a63b614bcae1b79b07c252dc55f322554ac34ca664910fe4a0c9a33e30698e124d91cbb55cf34e931807cbe591a87667f2284c1c18dacd108163aa7a82e274ae659c4ea144191e3fc0f82d4cac929969a50b98ed9fbee52cdf465a1f0535d7d7df15a9a6eff3f4a14e254571cc47f82716d7a835dfa839213677c4da8c8623517244891993ad5956f65d318d9bba16f1eb54d2974a741ac -AD = c5ded7f545d2eaccbc2cf5cbd1b38b0ec3b6bbc054ba25a16efdd448e5a47b0085974e469c1b0df22441340170d6677f5158e4ccd71446d7ac73dcf5fcfe4ad7248c4ddcfab4c8ccab0968d74d66d9c9561650eb98c088d87766440fc9967e8463febcd12ed07f7e44fef47cabf05274002d0014c4e31f230a41171868db68bf5a83c902724397ed181dd8c6768a898e0c78f6aeb886df95442e99 -CT = f798de4998683da7fa9ca030a23dbc493f36c48bb52cd1113c3ea97ef2b67433c00195000777fa3b75a3f689a66b148159524a1fe9576587948760b279cda56164a23748564ec66ea51368ba2a900c97169eb33cf1e557f46100193575737dba670175035f0d921675d45415c6591cae079698e6b1f74e82d4b9216c20e907b148a1d514b2cf653d2e4994f7f668dcfe88dc49c29c544de96d8dd0 -TAG = 3663fb2672223154981b4c580ed3d2d9 - -KEY = a65b520a2ab67a24fb8fc669c41f2753 -NONCE = 3bd6c7e8d29242abecc4c108 -IN = 9d1559d283f7a38847088116f2156b19a8feab0731f04d0d499c6b0d21b8563a89a9c284230c1298b28a622cbdd38dbceb098ab896a7259caaabfcc7b0d9ea797178c18aaaa351c7f516342dcb9d3e91405882c8faa9a28f7c67f3db8913b31c0dcd56472d8ebbfb20cda2896a66bff2706b12ae0d9bc8c6c123c02f1f0bbaa418c1806482423eac72d718cad0dbccd208eb81663a9d9043d6ae7a52cf32b1fa -AD = 2538529cc6eec03f70df2ab085027ce015279484981422f31e58aeee31e79703d72752af2b8822dce9b385f1530f19e692e00e20ef973d333f4bd585ecf122bd4ed9b0626cef46baff0302c71411d27e372361f36c7245096faff21f0236f3dd675646760d5687b3cf1544dbcaa863f1267bce04bca976616b890c7c6ff3448d16072c3938f9b62377609950ff7818cbdd21fba2560bf1954a93517962181b18 -CT = c3194fbb5c319a94c0f61c432a730ce7611a005cfc78266ac4e5d7c95351e71d613f06f52d9d008b9d886f4d9a57bcc232d47e0c75ab755dfccc057a9c7558d7fb696a8c29843a8b9199e2406d23cd6507d35a872fa54cb95e2cb9af45405ebc6b6ee353e8a80debc393329bb9499c61c6344a6380c118f30fcd76376a9765517652e1b21ecafa63c0d19c1875658f1eda89c15ac2daf1a6f526ca72ee792a4f -TAG = fc16cd532c926ba01e2e6b15327bfb3a - -KEY = 84215d2c8f86e5b7bf93cb0620da6bb7 -NONCE = b35e99ce89dffd1ec616ed92 -IN = dfe500919f97713f6d9c4f53913175b162b8b7587d85d5b63f0cd5f51def23119e2e02c224142ecfba7f0a519aaea3c28be20b9c2a9c98eb145afd4db523b7f0b822e67dad630846b2a192bb146dcbeae00198c81b80c290d881125c24a6b01ec901b8912bad5b081ec7d97d6997b33052ec287f692489df928ce36cba1e3d6a41cf10c697a9e1f4aaf75dc5be054b98965ec3ce173be7e127c4c5387048ae6ab5a8d247f3 -AD = 6bf6222e64a46c90f83f47305554d090bc8d3838b7a856f0e5e1d92c4e7231eda6af1d9eb7ff6ce914f2256a3b0c853453b9bc75e46109cf8d7e8a9dca224e022d3d1a139d00476775622799541edf9d53eb645a40f6d98ea559e181d96e4df0141e51fe067542300581c0424f534d2c2e3b1b27153c0cd496a1c03301226beeed2b5cce0710d1f485e68b44a918b63fd8db610c7ff894514e272b6ed7ae33a38907e0698b -CT = 6c6faa54df62ba5659d45f64a5f014684138c93bf152da8a495e9d067b13a30b9fb84847f56231b2da4d87e6cd509a3e38a9ff47589c627e5b5a1196e27fc7afaa14a8432c2d10d8fbfd5d6d394e4b947c456420708a76c2aa638df7de119c160636fc8dfba32227c5de12e5ef429da933ab04e77b489f2eb761d0c753738647ad6793cad64b8942f621ac67b13bd0cab106ffeff21f24c79de69424e50ae550f2241d4029 -TAG = 202b232472d050b9bbc68b59a0c02040 - -KEY = 7c02b6bc3db61e23736c5f36faddd942 -NONCE = b958decc680d5f79ea7b8632 -IN = 7e5992ed0474f4224b8da1d038eeb78413fc2f9614fab7120043e75986a4bf1114a80703780a149fcc8dfd115b768f45917065c85176a3f00be40b427fe3765d3919a5b741708624e29bcae876d251fd46dd8d36a8ef66f671c25f984761cf7f75f4329de7093937cdabe32f130b77531ab1aa0a1bc38fbe2758c2664eded828b2589fc5c34d9a0d57a5a4463163736f419b65f0543f50207fff4cf1065a551bc00ffe9466538b673b2a -AD = 76e430fce1a7d8340104e6001f1c2048d457ac335c5453e48727244b75c3c4f04f55afbb5ce55ba6f8632dbc168ed715b83968a32e5b8e91cb24abc9efee6dcb7a8bed9394a546f0b9efc5823ecaa192df061eb41c671bd863498c2130f322074a711ee43791a1cc02b5cacccf25119ecdd99233abf3b131c83ddb8c62c93a0d653e91499e7481303adc8dbac615ec464eb8640ea138f6236b0ee31cea060f97ea9145a22d15e28eaf6b -CT = 14cfd190ae0521f94ee6b36bfcc403139782bfac3d33fe95c81f53e83c7d0c9a8fdebbddd79746b550a383ece1b5c93316b2fdf5aa36b4e97f739f78ccd2de9963ee7fb4d77b581cf676bb679b2dc4a48d977b45564f21181dc60ecee84d736f2324196c20327495d18973660ccb5dae69b79853d12e48ee0706c8ed821b7f722e46f35c8dee2b7b55ebee01dd3ea1e8ef80493cab6b27c264a67596cee06c15062e3a96b140d0d9ba38 -TAG = b6c47410e6f4a2f2b172c6a4490732f8 - -KEY = 1f58ccb33649d0dc91c50f2aedc95cbc -NONCE = b3a392b1fff0157e95f82a44 -IN = 738e04dc5a8188d775262c2cdaa04468844755dc912a4edf9db308efb3c229b8e46b2b34aee2c6330219bcd29d3493e3cead142cef5f192b043502b8a4cf0419f9b3f5e001a640541c84141e36d585b05a2f702356bd39bda518c42b461564326969983d22c3ac5a2aa214807ede803d57a61c9547505dd7e08402cc43e6ed1574a48366cf5b5573afcc7aa3c4d4721b362d20a58cbf251315f2b5f9e2c97c5ef6bff44beaa5004e5b7c7f28295df2 -AD = 93f7f5054605edc769efc30b35018ee6c929a83bc6454352c69ba9c72e4b4ea6f51c9ed06f314b5682be6a701c719087765d0a7022e5c9d495f28a9053bd435b8b834045c3670856149b08dae742b372a15a0184375d50eb09877bf94f63859e64228606791c516e76c5695a4e529b9dc5f76eff1d4641a22597e4460aea4eff107348077d4ed2d6262744b0a2d6610f25264d905133309ace10bb52f7138674c25e5d43ededbd87c13dc8fd9d3b1b -CT = a002b47b18d1febaf64842fe9011484d618a2e855c4efcccc7d08f02dc9b53d0bd4fc8013e01e21fbf2d9bc7fdda69e68be0c06d32003d045dca6bd251c0bb8c2cbe3693b252265c8694295772b767f83661ecefd57353f6f1c442f9d21ed98c55cbe1db8171ef7b54fe3e3a1a253b4dd48416b5fbc7c18d73692e9fc90dc75d4b88de1fa47c9ad33ddfa4e582d3fc61ca2a8b1eab898b9992c8e56d170730454ca50cd4f28d2759388cb8e302be10 -TAG = ac502a9a52fb3a68a7e90dc639c7ad42 - -KEY = c67510714f556ea1744af9207917eb60 -NONCE = 71b347a21653cec3d113087a -IN = 7040fde3513cf7f1886d7be9c0f371a3b75415e94c3bdfbef485081199bec4494beeee76dcea05b6601ebd4c8fe231fa16d3b0f046eb3e9c9ed8baef25bb0ff6bc85469b2eb41b929fe904735f819b241b01230c68c0b61577899426bf0dd30e085cccb4ac290244d8c1cd7514412a3ebc51aecb6bb4be1a5a4a8d2ff3fc99191f7d7d0b44fe2cc4ec34deccf901f54e3dbe19d2dfe663855fa9d93a01ab14faed7f00c14834f63e1d153441c6fabb3cf22506e8 -AD = 6d28b410c788dba025c387f5b94c0bc392c69ef646b9cdce53dc169326359de26a721703d9a7c5017631a469da13b2d9ad9115de7d06922ed6f093792ac25ae2e27993ad6be5217dc4f6c51e18f230d4eabb01a474704b71b1407d9cff921bd98e28bb60c4fc019b4d609667c747e83eef779ee62000b6800ba2666f415dccb12d43af4f585d3185d66ba2ecf0b0fcddf762445dd1b6154591dd069f03977243b45b113b6f9b110f9fdd96f0b74e2c9843a45c6a -CT = f2a2cdb4f890241f44e00b3373769542cc3dd24c3d07502ed162dfa10be9906871051b991f36b2d5c4240df483c2ad704be14b9efe79ca704e8eeb9dc250e75a92ebf5800c59fb9a6a32228fa1121d21e0b423b77e20010d36b9e6c68dbc000f69bddbd521a1f7bbc9d7e431e4e46e5094be96a928c6729293d2d805c468a3993fb7439f192b1142272a78585e3b7fcedd2f7cced52ab2bc42e2521603b89ba7633fa3b4d07d9a314d1159d7bd5b2dc5198b0c34 -TAG = 0b386c3a58ad23e9a45f00ae107d319c - -KEY = 171d25e195bae2eaf666993f3b42d690 -NONCE = fc16bde0c69d5c894642f1f3 -IN = 8775d6aa2e46ffea6ad4439000a968bcd4fce86535b7265684071a498e0bfb37646f56fad79e0fdc4d6016fd1e935dac5ad74b11c69f5261c3321efdb9cf03f9b7ec681a7f708ba8e3f66648b24c41485a5147df31385809c800155d0d4bbf41d248453302c3754eed4909b267893309ba5249588cb4a4a14b4a29496f1e799559ac9f4baba7a9b4cb5bace1c11dc0e7ef7a2ddd2596c29cdaa378b97c7d3c50db49bcadb8e1840c6b9fa12ad88c0b8152fd753efb04ead427 -AD = ebb169a863dd05cffb9deb866bdd130a1c6852046881f3f8e9013158c83bfcbaa98743957ed4b0619eb88d7ff69b3a5d06da74076c3cc2dff83dc0375236d363c0e2b1fb60c9cf10ecc0fec94757b1b719abc7066af15ff9b66788b38083f766d67005369319967995407ea20339ba27e7bf1dc263fdd54ddd8088232a500f605ba825fedfed69cccca75c207b06594d1d0070ed12a259d4f574f352d2e2ea6fa45199213b6a42d53a7c717250715e0404f2fe7b64e3ec7e89 -CT = 8694eac2bb3968303f795bf0118e43c132c9dd22ec320ecffefbe878ebe6b1e0833d19515c07ebc83f12cd9bb50d2658e6d7fe44a9fbcc2225e93ed58e1bebd78edecbe6c8b3491eedfdcc957cc8ddc95d8116d50cc50b1999ac420802605cc652134ce51a41533e00fe232344e805df146a952b40ce27a2f5c6bbba2154489ca40cbb617476ce6ceac1a6b9c0175ee33615f252377f52583e970f77795b573610baf5cbf5edc6d2837244f88bc155f71588c9c4c1c802be9c -TAG = f6725998336b3ef020b99818e0d932ac - -KEY = f7db0fd345ca6ca82ec8624950f8e672 -NONCE = 3e7ee1a209b1a191f0a00370 -IN = fa86869e14df0fd8e77eba7fe5a933fd1bc58654deab310a03aa7202a089713e323a323f4932b4b8f6b40982d6738aef48951f621aeb82a747d290d93d1eb5bdec6a62fe66774209a4aea7261acff80af9512af090e0eb0f5905ce8baf2a0ec50ed89906d8d67f370639e6f16eafbdfa982897cd5a3f88929d7f1032a8b3355223bf666be94ba9945fb5cafe655d59af69829ef92365f54ff3eebc45e01ffc439b16e23ce892ba6db7e661fc3676a175a8ede746000ca147db57a14303a1 -AD = f7b826afe62356f985e8e10ff356dc9b5b9d9df24486523c3bab7db355c84ec7e4bbdf66482b74fc6b4c6aaeccd7717fba44eb4820a40f03639076776719ea7aabd3a815c201146428bf4c6bf1e8b056b5a22ebcb214fbba64de54089a20ababda5c860ec301f36e1801fc55fe8fa189f35722a2cbf83ae921a9537be2b4f060d918af9b12f9111909d59db7cad24418896ce49762223d8a20a3a83fdf24b64703c19c78f528daecaa8689f307da7fe0befa1d6b1bef24ac8d9f5f12b6c1 -CT = acdacc648833698eff4d42a5dc0b123cdf6f2985ef05e6f2d42c9cd04663635d240648da18dce158b21cc0a3f7a2c35441799a4f1f5622e11051c874b2bcc64314bf0b94c2589d2a24d996af57d22085a64f10135322cb68428fbb951d8b14683bf6fc96b1395829a0b05ec83eeb20e54daf7a413e070ae1e0b73bde56faac630363fe215f1883cd9eef9c3b7d076bbb56f6f5ffcce0d31570f79be8864482b6b3666424dadb674f873a1b52ae6e3d8ec8984edf54186e38c71602098308 -TAG = 4dba5b1385565427a987c9d0b030f4b2 - -KEY = ca80ac4cf4057182d06d65dcdc09763a -NONCE = 63cdd8090e041baa9dca5bec -IN = 701c739ba0c146983b9e1fe0a9723850caeb818514860c3d4adef10dc5e020a8dd7f2fa282896170f9039d5b3fa629dbee3bcb81db44d0d68f9522477619269a59ec1a9ed399d4902f25271dff5c42f3747ab0f4b61c26a2c1bfe1c0fed02282fc2ef88b47825cdfb11df3ced0fe0227e8264132dd62af2d31f23d0c0e253f01c80400127c37806762eb28bc71f31807229172c78ae994b4ad800d6247ea12d3f4f902bb50b72c132902dd4faee05e67836facc7001c8f58475366668ed20d4899aec4 -AD = 0e91b38fdc70951b97e43aa9ea2c6f78d445d90ddf4faabd3e6e0ef74f528fbd5c3d4da18cc3d8bd3167b756da495cba49ea35e2db849bc37f6db8370b492d7f82f2efafa5444ac62835cb5602796cdbe85caa50084e51eec2651996d2da0dc18fe10bd6f374168d4c9ea0a36ba665148192252ce9d05cb78429c55256fbb65f1bbffb8799d63bf41701d1d706a44e3f27eb245cf720f2a329ea24fbea803c575513830fff579a1bde3daa975eecdb8d3956ddd374fe252637aac86ed3c702c4ec63e6 -CT = ca46eac0addd544bb45a97a4989d45d21599ec70f843d9db38157d186716dc39a5d1a5c0624e6c825b5b7f1fd41aa542ac846ec0edfe6bc28f727823667a33cf6cb5ba1ba6654cd023857c53ff00a63b34d2c17ebae5d46dbd073edb7b2f9e02842dbf663bbe36238f3eaeb7a23e328b0d3d50f49674253898f360c0243722af266c934f021e4f2fb8747fae728d06717b2d68cadbff762956826c910cc8ad2d4aea4518d5ac4deec978a13072fd1675a272539ebea31d736c759227f31abc911e0e76 -TAG = 9f0202c228ec48f4be6b2f876fd05a83 - -KEY = 9c2daabcfae974ae165a2ea58ecb212a -NONCE = 4b9317e4be2256a467e2831c -IN = 09169c1f5d873f03821393bef013bbcafcd82314cc986675922e2d43031417c8e65e625ce737af4621aabea6fe75030b84acf96967e791f8427b8f052051d6247a897006c6ddedd49cb7148afa5109a561e78abff7c55b97091f356e31b5667270d5653a497e2503d75e5856ac1efdcf3fb6e80b8deba8802acc064905e2b09d45e446d7d810971e5996540ee9c01fac1b4331f99ad329565a8db38eb93f2e2a8ca37d64d73cc8a7f4fe3234cc155226393f1f2ad17d0f01d5e60537ea44835dea853e027dd597f7 -AD = 1feb0ca13b3022456a4801d8f5382cad95f7a50e466a102d2208e7482dc8ba5c710d1721de7103000fe8811bb13fdf698844257dd164f1e21b0707251f228ca8bd437994526ed5684c4165c9754d1cefe7eb18f9e116a455c28db1f7c04feab74ab06af029819f51ed96f453fb6a634f73ba8c80e19dc62384e82feac70a12d42e3125c360ec2a97f4ce0a07039687ffc37c5dc1df1ed24f05a37591fcd5c34a3fc5f825c79213adbbdef65078f5e41a4062517334a67560ab215fedde53cd8129a51f27baa80f53 -CT = 8a4d4ae0842f8032d83b2e4eecfaea439f745f1d0d07808bee4b68e3b58fcb65a4c8fd9b93cba2d5b4781d28a9cc01508e9e85796551064867551f9083cce342ba1aac4d2b8f5b0b0e4e3d7c82082c441467e47aa2b0f47e167b28fd29cb8d5ee52c2298c1f87cf811061d922f056214346c1ec3d2534045c5c485ccddac7d9998d3d08a80a62eceb2ee18e1a27f97616969df52ec486015974f160745667d6be25ffc20b143d89bcc8b6eab9dff82ce3c8f95a034316a8f2f2a52674105f1246b2daa28edfd829d -TAG = 0361e65b1fdb9d967492ded32e1fe811 - -KEY = c98ed84949749efd2ee41eaeec51edba -NONCE = 7b056c9c7b393b0b04382946 -IN = 41b87fe62c82bd34cbdc70033ca8d2ec5f13eb2c14947f97fbb5d97da7323f8eb5c2eba210be11b1ab9554feaa516aa493822af4a264c8849e9c6ff41f690f44966bb49c9c1df5995de8070a2fcfa42d0b0b5115a36738102134f571988ba4fb210edc3202d3c74b5f8801a7d1e217b90caa27acb49ece590ebe6637fb6e2f5f0b849f29804efdeb8c102b3e3d2abfc4f6f2c5f71f0a6e4d5daa5cf16561914f14601edc40547d55f7d11eb4768d5c64fc621d04e8c64aa3aa1245c7192852d2ccaaabd448e06f806eae66da1b -AD = 2fdac5a70356c2c8d70def497321c6bee8ebb08a5abc8dd508d83f03bf1a09942d7f7a387d4f875a1ff16c7b5abb53d32bcc372012eab7a3b848a93f7af634eff8c5deb3269d418be698a3026f6f08f55a6e31543105cf1ccf56193cd1af802f32e10512a6bcd3101b7b54a8f3efdba03018d5f2475b51bd65e5e183a62ab11c9462450883e3e87a9640eac909f72b83da8bbd34431ed87d14c6f7e79957067c1cf2a12b5fa083496f903269a3c6c8ccd5e3f9cc287904223ee62bffc4f157f0db409e82101e3ca5e05d962378 -CT = 384ddc8e7ed6868aa722f6785fab15eb69caadf43246521b97c8d016afd976360365bbfc9f48c08b0eaf5437af8a9c23061dcbdd0d22e1d58c92951b43e013689afa6b1587f79fe9ad3104ee1f80b3c95388e35b0b9a5a3b733b32a3e62fc143e6255d0e5b1b55bc9439d3c1cbed610d36c3667378bbc1ac20d93a5a7e5563409a5b94ec799a5281213d724e46f4987588e6bc7e9e6468bbcf340d5f1a1eb1b45dc9fe9c832befff54c8a85db9c07196d7d45cc389fc9d62f4bf1f4bb82801cfa9c408498331eef4ae1ee2809e -TAG = e8cbdc1d6d51ac64f16cf08725f81370 - -KEY = 42ece9aeffc9d2e8ea02e73d1a4de834 -NONCE = b59e0770c689d60823c06c69 -IN = eccbb9a2c1241c88d17204cb0f0c069e20512bb1d31f966349add203d84cbb79d88f7add957a0a8370b9a0e04c9f17215531cd48d08c4612bbeeecf3dce68d41724166e06a331e7897e8c7c6a6affb7bf07dae1874bf3bec044d38227bef5c228f4cface9ea37255e15d6b27e154b349b16048b0e7984f17cffa03da07924b190f9b91d6222db1124c1e4e77c2b989fe2a7c338c7316a49c7df0be173d0420e8790bad669f6da96745cf34cd2eb429d18eeb61a8e80a5e03294dcf3a5886bd1865e2a55a72574db8db04a9560f969711aa7a -AD = 2aeb8ee162a7aafe5a72a8d8873ce3bc43a65fd7bbdef1f6ba71b61e5a9c3bd033e7e8eaa55e08ae381362ad0991d65bf22c99a425019c4cd7768622f108f5917a4be22b4ab65ede66c58191e402f8cdad69decf6552dd52b62e8d62268b84122b64145c97115373a26d2d5e59e69b7dca5f96c48106e9fb3f7fc7e0ab11c78a1fafc697fc73603d3f08fdfc0ee885f84572fb04fda718a21744c7e5dbace91b0e141fa82fbd4d1a7dc35edafaba7c5894778c5952ec787bb547a37e509b035c684a8f51ceac5e12ae71b165dfe957c6de15 -CT = c5874137f5e75ef02521b37f0759b5724798aaab8a1e62df81b73175690ca1d32cab6e7a9d7803a8aea420ab273fb46eab9e5f0773b7f5457d7a8c0058ed9675a6e1a7f15805c7fb695d277ba06adc3963606ead0cedb342614cb410f4197f4fad0b5df2187f8d2ebfe85ad3d5f59bbf652364c7e8c3542c5d7f15bc6e6c24eeb1d3232bcddf6588ab1c1953085bd0a1516046b76714d2b97718ce57ad23cd213507f6cda95ee9c5c23036cc7d4133c84a1d36393979f9d1bbc613350252a6de78d905607adf51368175a20106f81aa9ff9d -TAG = eab1c7790a5941270f2ae49895b3113d - -KEY = 6ace8b5fa16054558c9d0e272573a7a1 -NONCE = 358c73828e032f0e0db608fa -IN = 915466e994705239afebb8025aa965626973e41a750bd75f9e8ccc7c1078ec555fa618120b4f4b5e273fb9b262df73d39950fe5cc1c265c06a08e2318efa83c63dfc689de80966f45cab0d2dba603bf116b9ef7242bf4d9cc691a775f78148d2c75059d6049c861da5dc40d5f94848c7247a724db956d050975d613433066ab89bf91936e0fc85c61af5c2c61cd1eb414b9df0dc125a31a3805903a886b427fb78551bc696610833a9e55c7776ec1622abf839d733594864de06999be8d483f8dbc4da99f541c6f7e21d946cce229a104a57e4b823bfea -AD = e54b90d037c375238f4989910d423bc58d32ccc06ddee558dc6a0c2f9a0f13b2332883e2c4ef9cce41d72cd636516b3506f28f914dcc88311fd7c79bff0ad32770e4847362affd98ad468117cf0daa0f5747c86359615ad6087ee18e6c58453be60f3bf30f8c61c1466d107116f88499fb1b5df9a01eb762317676d5413b839c66e5c1b74121f6f2f7408825745fafa2b10ba7450f4ce207a9cc682d1e1442f972a86d5d4039c4856ccbc00c43b5b3412f5b3f87c16508ffa527c8080a556944d359f388f787f9cbc033fb3333e72127e94c455b433222 -CT = 37be446820f5635c1b5ca1d8ccc2c5ab5b393243ef5229999a2c084fbb54a330bb338963740ba470973adc86e640fcc167a88bb940e5ad1723a01089b5e804b932138efed6fa0ed99c1ac4e9c607f466c829af04407a4a2e5cba486685f693a7b973921746902ad8a0242e02075cab66204084e6b281d58430f2d62bf55ad56ad279bdab0fc8c3d570fc3371dc3280ef3aea70d686c855d40ff205c04d457adb518d904f5715fc6a9a5f30bf1cc74703b175d70a1470cc810a366cb8927fb937aecc200928db6b73873935c429e2f8d595b418c5b1bf9c -TAG = 01b05fbaa9f2257b3c23ed3cf91bcbd0 - -KEY = c5bf40aa1127073b03c114b10f3f78f2 -NONCE = b4ac4fe9920fbb4e032f6aa6 -IN = 164906110c34354a0d4cb6370e1ccc17a739350cbb11d6570f398d50efe3d9db1a97f00d031a579f56d23da2441295af18a640a4e33c29dfdc848d722786d9b73550bfb76da1676af24a7bdf5fd3301090bf342369a24ba830c7f8883db6ed77a2ced83bb85205ca31f75a16a58fbbbd163a3af5e5021bee2d2cece33c08442e89d3f4d6d2359b94a7ec6cac388208a689b584d5dd1103fcf6af10ea2c7cda4f690ea0e4c7376fe2c3e69365d982da28c5bc18d58fe384c9ad2689f4047f9575e54970961a02419d9f2bac8061ce943f132edae1b9622738593cde52 -AD = 9f05d0391cb128690cd8bd120120f21725a79e5d2d0ef9e8322c04bf775f7215a82ce1ffdcf0f6562c188e84cb520f30842b8dcbdec36436725633325020cfdda7ed1af3323d86b2bc72d1b4a326f02be2231fcf133762c4fa76c8a7d5d3ac31cd19f63411a220eba4fcbdec40b8eb01e4ef33c6620978d09a8d428ce0e74d02c140881f46f6f81c2850edd82dc46f3460b5d5fe0b54f09a3f31548dc520f1dd46ed657995e63297b6834df57525408b944badf56234eb2b9a43b1422a5c6a59bc58be683e47753803f7341cbb0075b5795228b586cc571c1bca70d5 -CT = 5c75ee10a917651c49eab6a1187ed631c7069134e492bdb5e5698f8ccd5503cea5b1902d779c2f6e6c03b0108cee3fba03f2b47803e390930060ee4ac984b1ceb9488b4cce80e329d3427851aa7da2213eca2dc5f79366caf601c49a6b7a8ab068f1a9bb899b81a23c99a9de20466fe01398bc071c724b2942640cb1a00489e0ca7052f7a06398ad42500780f194078e3e77142df5710ae88540761b902084f57d87c2b0ec57bcb7eacee6743d419d8877d61666f93a127d22ccb49b5db0b93e4f4ac0dd9393d6351780dafa412380205a90fc8daad3dfcb1b7ffaff -TAG = 8048088e7e9dadc4ef98777c0f6cb661 - -KEY = b628ee6726a4d7925734ab1db3ec4645 -NONCE = c830b0d1b4113f4c9aae46b2 -IN = cdccda3718f2b0963414d965a3c36bce0a165f8e88aa70ca9eb3de6510d02b0b49c29cda4a7f6d439c18cc8fd80b932d0a4190236a13edc9994b1c4a71dbdb694ea5dea53ef781ed398e453ce372a99c204a138739edf5b606160e38cc8444c8fb6e9cfc3aeecc1760e90d13d01692ca894572a0bcb02e13f61d8604a75bb98e96f5f36d10e70a48bbb4f73771ef97031c7da23550b3a12554c2c436115fe56713dd303d1c3d87bcebf25f61710eecc9f01c555494facac496c68ef44344aae40bbe1199de793096d4630018a725b130a27d38ab2e8c629e61d2d8d37b5974f9b7 -AD = f4d345e55ebd1ef9faf967d76736f7ef38e5eb9d659bf8a89fd3c6c3c674161bb54758f1c14856281a7dff7c9cec16cc138384f644544881d50c7692bf22513223b63274e3cb7509c8a410a389277f86cefc801d026b0049c13d85b26da1dbcc7cb387084a3d4a469788ef85b6da02ed2ba0412ba999c8cd83c9c6716cd66b65760c42d4ef3e324b470c2a5e031846fde97cadc448e87bec15164da006c10d3a846adab2b09c29ecc27ec8a9134d5fcfd2c54f17fb23f1a05dc8da46e737f317db42e927818ed00d36af8dabfef09c8641159fabfcfaed344b03a1dd6f9b883f7e -CT = 4f39b8fbd8ecbc8aaea871db2e67583a5b06cb83ed8035ff639dbc9af92c4e3f9fe57b970f4e998a0262dbf77dc024d5e208d3678ae0d90e6fa5d45e2c7f0cf90676368c8784c851d3818e221abaa87c5e54298229a2f4d3f82505ef7bf45686aaf12e8322210a727cfd57c74a5f23bb5d8222115b28503eae7a5c600ebc4765011161736a346b535e1bfcded85c198c6ce6fccfcff0fdb0c2fc480bc6e71fd5de77355932d82f8eae245091bcf5abfa0d62123302e5805ab1f5006a976bc1468e3bed0452c5844029d7d4ea6cbd4a907e905dfc796c01bbeb69c54807354a5bd8 -TAG = 2b55edb998ac9971e53ebc8973c4e8fc - -KEY = 095b26bf096971842fae34af6833c77c -NONCE = d59d30bd5384b86b19b33c13 -IN = 3be9eeac265ec4eb947dd32583ac2e595505b363d660f8b8c2ef631390bb152f016ba7c75bf7c2e5e23c980d6967772ca4535bcbf4871ac1bf70b53826a34174e5a2e6118d7ff86d4836736c9a1f9de44c80b236c5530bb5f80e5fbce9814f3b0843a088afd029f4cd2e6190dd51fa804f8216448e7acc785ddc5478287b101bab80256977494fae87d0c13054fa4470c3827b2e8172224944c8c4f78b0a33dd78ee2bff16fabff15e5909f62c49beb455dd655ee1188b8eff35bfba72f2ec5e4ebad63d7db8b6338660f9b818c6832954241860925ea9b7eb07479dd6de27489d64b1a9191b -AD = 2ff9a8d12980e63a378d6d635d319c26e8f747435aa5d797c6e21aa69fe21f653f56da7db7d67cbf54451f336f683aa9cf373ab40c16738c44efd3e664ecc6eec40d6af82df2b3e58d7abcf26b1d9ebbe6263176ce4ef8087d14b0d5ae1c16917141d2ebdc76a0834e8d83c4ef76add82e957ae376b210ce2d94d2684a045a109454799f3cb453279d89c60ba9d038a1dcb99540fac078d7216ee94f96f5cce939eca9b5f9715b1cf3c9f1e6be982897c2f25225919db3e31595713a4e281e9919bc2c5a88c46835ce05411d0757eb738ac9e45ab3f1a42ffcd6dbd09f17f656f40f1cc2c050 -CT = 4723fb7339048f811434eaaf1db24759fc232466f5f53926b84e740b67f457c8c76f902f4d70ebfd97696380de95e8e40e62434ab1089e3a5308cb066fd4cc7e862a391c2f727a63a01bfd9fdb8ceae55067fd9d6f55312f73bc2c38e4b12b3aa96edd156dd758e9175e67a64a17aedd27c9c70945a065216773d756f533b035f2ab53335a159d9ed3f97b2b7a57aef676fad95c46e3b82eb800197c03812ca4e580916c5f7cdbd4aa1308ab16096a8af5290a0a2330902966a58dcf2e72eea7ce799a8f05c986c6457b05e3eec2adfdd4ed38926a3dc07ef208c91a619848917b96a082ac27 -TAG = 3ff349a628f7fa8d3f970aff8a6302f0 - -KEY = e27171ed1baad563d3d299abc0968b75 -NONCE = 5931a4414d5a90e93d2ac47b -IN = 1d209b32a772e87c5bc593fe943d3d7a1497f390ecdccfefac50ce14595b98b682111f82957278241f291e655b3af108a9cc1523721652b6d446f34cdba2e61464a3217b29344e18ce8f47f10da88c2845a009b7491bbd1e1f36ec49997a0fb09764ee25355de29e56eae7af42a8c96aa137c02268078b7f145fb1249bdd74f2d4e4685de75be4dd7fcf29482eb26b5dfa5028accbd23c3c654bc202c1c0ae7a597ef15f4d14f7b8a14fd45698470ac6355e04fe4a14e3b2907bcade18e4152c68631f313cbef48341008482f434c017bf8e1dbd048f0d6d207446e697fea68202be7283188d1227f21ae4 -AD = af2f6abc40ca82d92901de02113cb8f7638f0a510f6a03bf056a75b02beb10157c97632320fe14fdf0610235e3a06172b6b6e80d2fe18263b11e9a5e3a07758c55131ffca0a6c9b121c37a0c85658125d5bc2edc8e4e247a636d7793a1cde364ac22bf754844607daec0a6b939d05fff5a8c44ad030181aad2361ff61f20a224f2bbf2083b2fc2a5b92f5a66bf2f9b4c49b39dcc23cd3ba66b5e7c19c5b7b74a766c3da0c2b02ac80ac22c006e8eaddf48ce6f6887f69fff1fd0aaba0a0f70ef84b54280830a62d8b0dba55ddaa5b0385c586dee60d1a05a28863a081cb9b41edbf3ee9ebff98cff983917 -CT = 673ae48b6080a3dbd08034312c36201d18508f4e1ee178ae2632a9a5ce0938687ac7e6cb238cff852ecfc736bb8b3c04b42752fe65cbf6ff897e207582e85533f7c238b0be14bb1deb4cdaff524b013661e4f2c96807bcd928e15e4e159390e1eeed036ce776b579d9f3fadcad81adfcbb99986babc9a8465def3de8de0cae19bdbf6488c12534a9b6b7d6fdaeb1d4c3be36b4adf7444a0b9fc69c69a46f7bdeced1214743f3357803d2eae24dc50933a733defc653dec56f0e0bfb8928de76699d4f7029fce9175b3b7cfb6c7ab1018f6f3eeb2b9401115c8cd382b06e4b9b43a097f42bebcc1493a49d4 -TAG = 285c1a0028fed3ab2a4d68946399d700 - -KEY = cfea8c059d7b866051aa54b8977befe3 -NONCE = e54e684ef16a2fa8e25786d9 -IN = 5a20333c4dd9b7378bfb773b7d64ab80379d16c0a56eb1f48f53c19d0fc4519d0b5f478e37f16d6e5085af31dc63488f9f2cbde3e49ba954b674b0a4e20df811098f7b8e716efaee6a4109f16afe128ddb0e54034d66bd00d13a6c69c9ef2e5a065825701f5e85634e118c69ff0fd71bfccc25030fe94e778e7f474136cd3722eb5bfd88bc99fb45dbc3060a24ac2bdadc5c82d883c5c63ccc0f7aaf5384f4c7fb07310b66a7c767d025c1a02dc9aa3d7aa921a72084906ae6039f837454493aac3e3549ad3722a735dfce4211819a2d7ec279221d43360edd9a4cb930815c8565c22b94b4849a979d5e2a57b2da8ecb -AD = 376d8e02071a93c892293902e369b8c7c44a4c9541b5050347b016243935408d0c9557b0f66c6cd493c1b8da68c8635f4c868e685674aed42f196ee9b6e56ee44510eb9b9e89108d878be917454dca0c62d207fa462a563a267270d6b1602d6795717475bc6fb5c87b747589328e39b1d4db3cb19f0fbe9791aa4232e33abd9e14b5fa3abe4705ee988c657677fa063aa349f1a05de045f3ee66da03af18b6b8b83e29b203e12bb02a4cbaf79eab3cfeb83a5a997daaf8f36fa9e12faee86c9cb351ff361351d98ee3a10af999799955a02fc46ddf56c23070319b3fe0cb42d07d811ae976f242670e618eed113b4342 -CT = 06ccc7336773919c2b1bd832e7c48ae4a569db96545363ae0b28061fede28a25ab6cc0382aae3e6b31efaa4c225073640d0148878524a7f381f53b4d21a43e39afd4c12cfdcda442d5023a8d2a8ad49f4a002ecc8354c86520524017e561fe891b6962682d168a860210e0def1cb4be1bfc6590121c1b1988254757fc5a37ef916827a5fc258ae772773a6902b084817f3641c21d3d1d1e8818b9851dd05aa49ea74e16778593f6f486957345462732ab92b1e4b06c32b5ad3270c5ef3d80b4e4bd08451e92c26acebcac1a4592e08ea434a1fbc6dfedc677151ae9471661913db19723184d9ef4bb49342606f784d98 -TAG = e7be877dad60c889d397726bf1b6ea89 - -KEY = 40d35704108a944f1e7582503018cc85 -NONCE = 26048431289e7e100481e2bb -IN = 515f9bd4935dc10e77dadd81f5a4e0b53eb858ded393979ed75330b80adb36f6b81288dcbc581e8d93b0e4705c07be3e200422397ca3648c9676952e60ea26d12198add3e33cdc589ee5a800a750d77978976344dd5dc710e56dbad462fab7fbd08c057a9f8765c4caa9418e6380038d288e09a90befeffb1e8d60e79925dcb3772cbb3258b15544f9c9554181df3483784b89b73bb6f9ca55f6d644c02fbd7e31bfbff45cc40132d2bbd08db6a27f5a302e1dce2f0afe4ef5bd4ca844c7900ba18faa1896a36896a1c80307cb37162174205665613b39cabd0a5b2dd1d5f8b6fee948006f0b2e31488c0c613c1d178b7800dddcfc -AD = 9c86692c874fa785e0d9384061bfce8d8332871ecc195621ed478706c46057bb4fff80515ed65b5fbbca3d463a62e227c228a340143bf012233b1c05a50fdb4ed04b840d983f47e00e001844a0d2ce14f6dcea58069c9b0bd8824537d2420147be7caf4a88dc9912853a7fde6d2a5cc21f85eeabca7902b94eb79d5fa143d02585acd57b93e4eb6bcdbe289a51c6631f7aea7bd9dc0f6cc2ee8426b37220216f834033fde15e3543422612fb3d972b8eacaece9614a4b759d93dcdeed026cc90ea058d7dc985c10859d4ef14ac5cb14849d4ae404badbcd98c28663eaf7274aade4bb7527c4f960875ca703ee6732c9a3720b629f2 -CT = 89a21a1d502ba947ac1921efd3c998bfdb437c2da0802e5eefff66de3af00bde934fb9109e961f179771c52de783680683f4bb752f877897882103146d030bea5bc3c03f923b477443e640450244cdf66d7d346954f6e862a3a577820d49151a82f4205340ccf2e11e4575b53f7ffeef09ec640df65a0b8c04b37f6dad7f940cf2d7446a6fc5bc2dc31854c27567b2badf6f8e94294ed5d899a458a080f38d6e72df59f13f5c8f736264fa2b302d5375d6e3f8c3abe4811f4f85cb6e302e2c12a892a1e7a78a5a33e4b555c02917330ea7a45f20cb59fa991f183d1e2a5bb1761005b73fb728124fa2082f41cdbc88bb06389eb165 -TAG = 5476c08e9561442745fd2f222d08b535 - -KEY = 2c6796d0773d12455829a3242ac7d480 -NONCE = b43c0e7842006f6a7953d598 -IN = e0f7ac13e8cdf4da6c17f1221df18b98267277e79c362ec2793dbb842bb9662b5e2fa34e43cea12f71b4eb53d9c862f176efc5d91f06b5c532d9c30206eb4355ad442127d325ae2c30ec436889e3d7a56b683ee09c7d79768d6876ebeb67b5a2cc13df02ab93646386106e0473149ed77ad0ec91dd282712d0aa26f30bfc44f93cad39504356e3472c5bfcbbf9557cd85b53e33e1a88d2f08686955a3d876e4eacfe783e5f6089b3106295899d4a73fbbdc1bd22e1408a2b93a9d89c9489cfe7a9a7cda7c92b06560a189f5ed04d1f02489685c602f8741baeef3fddf610b1a25ed26d88daf9a05aa0a476c8000dbbf798de92b0ab8779add7b7 -AD = 1048769719a44958dbafe1a59a159ddf2427c5dd8746a8454180dbf59f48ff6467d760f8e06aae8d2d2a79efefaef2dd2abf33ba1929073685d0320a583a56e8748288b50c7eac551aa859b274629f3d3cdca5fd7b2a08f0bc830e929584bcba85f80e2eb12bf83de607e4749eaf7631c3545f06ac236d55769c8a08427abce0174c52718c2c08b02afc7e418bd7aa7715de95a930eaf92f54c7dfa2f3ff3691187a21c6bb9b238d2fe2dac7266de30c94c7ee96fa60caf5ec0f5aae5cef28264933cbbc295cade787321f4c12f63ddd85185997a63fec48fc5ddb83be3b47a94e15dda3f315e7495098bc7a0b7d26802e12fdfc6a94bc6c5a76 -CT = 794ba0a7df144e66e6e7fc83ee290431818d149673d1821e1df496565aa7996f9e581fcfe9499c01d8716fd3f6d67acd6641285b70f8457108063933126c95b665e551925722af60aed5343e429e645574a65cb6fd767b204ca8fa91979c6fe49377fe4b43fb9994e619e1dd962fa49a8ae5ae0b8eb630f112c43a4e9c28ad91fee9b5bec0b27c5472e30c2699e984dcd9f984a3eb7a7b7209a165b2f4a74bca555dceb81e3495a3d39115d32609f372d8dfce820aded274ac567112d295de5b261b10c01f4939ac532d4a0591f87742d9502d7a2201178b4cb4c069b1873c44b73a901e299d4a41e57dabdefa39907dc559b44e99f2b950e09c -TAG = ae5afc2bc4096e308cffe8063277ef88 - -KEY = 092e4a78c47bcd0b169aa35343c885f6 -NONCE = adb73023c873661f02bf4ea6 -IN = 0751fac5f54602181fac252cd2fc408ea3763fe229b80149bfb4b0044f541801843c8a20ffa1ec931830bdbde31efa998e0875c09eadaba6906c870549dcc650b865665c56b5cf29b75da63de088fe4d79cce59499518a04a17dce18879e3e33ed11ad808d470b2811da4617039758109f56fe75eeee696ff51c18d5ac04fe895518fe59435ed1f073b56079dec1701999ce0e5ab45829cbb85cb1f94dc67c9ad28815728f6de85fb7ae12203eff28420393c1ae5cf644bfb5633156e9189beb02294d7199e54ca0d2012bee2dcd6322eb90f41b3c6086cf0ac6b3888b21131f3e57643f2ab60141aeb17d9d07daa213658b52503482fabc4a0ba17bbe3a1a -AD = 60fbcd82efaa99e17f3cb16a4d2a1e04659d13d84a83135a5e332366ba5e6716bb3674d27e6b2df4269180a0df25841e2235eed7d8eaba571b34178ac1a1041623138641f500a7d4ceb28efdc0ab45274cf26c0dd16174c77dcdbb79a7980e04d48b35efd3656e501e352b605bdd1b57cb7f9ceca5ca14a3953b2dc77d18fe1c4e1b859d2b02feffd3da7e259fbbf27721d330049f0d1c2729ed2f8048abfdc0e7b3609d2e6b4f5b42ece472f0fc330247880fd04768b678fbe20ba9581f3db18bf3668fa0c80751d78286e1927aa6e27ecce63fe883ee88e7a05f8ca2a387b86246f7d1a4791881b14f619a340163da62f4130b2a2c0bf39f463ef0af4120 -CT = eb0fffeb17e3309d1104c9a9c211bfbd585f9516f775793c365d36352e93af1b4db15430b454d1e7aa913f2af994191c365d76a4d49eda531fa7ce9c49b98bad4d591c868fb066a2e00a6bf4b1bf529002d403313c5df306ae34b8c62e939569bb5401eb7ba87080ba505e5c40a3856d2e177d247a5d8c727b32a13014a00a57e9f01cdeacb4d1abd16f1548256d661c45da12c2fe3ab561375875c7b6e273bbff5659749631fe26cef86e02742d0cc3f63a76ae5ece59b6556ab27da9de1a20c627da8bef3c596ebd7b246505006d1a381c2a24dda70e52b126b919471acfce274b89e07d125bc69bd94f2c65bddb82441897973566014fef625bca7e342f -TAG = 8f2dbbcc01538ccc45436e7176c2df47 - -KEY = ab1405116f454a3b1f106fd491cdfc8e -NONCE = a9e9a06e4bb83c215fc59a00 -IN = f64f0ed5ca25e118f2a2dbf069a9dc0169ab0079d91c6552d4a7e8d0314c910ce0614e1f6157b0f758ed6d3fb3fc3e2eaaa9718ef30e8d0c136c8bd6dcff97c0f5ff8a5d3808d8c23f2a9ccc35fb9427afd10dc1c298e95b335044b8d33e414ecc17d7b34901608284bc175418910116410a40b29dbb379eacf4ead521db3ab2a3d9956081af6d7438714c0631147b7d1e9ee4789751d4260b57630bb573739a3fd0b19a7ee8c301d7f1b09f86e60e31d5f2a86c7a65b244d5e4d591df3df3caab80887ea5f1dbb569516672eee351db5d5ee4d662a3d3c0e48cca108966ac6dfa6e4f9b88e5e577752826d2da05f2677dac7c31774eb64b1b0fc938580a78e4a296889c -AD = 3726f25fea1d10c2712d157e1a1bfa75d6f9e5bda448944ea2b7b85c7d4ff4ac00f68988f2a290cff3d5dfd6af33770a021b03fadd5741bffb7532924f3f2841a7f7658c49c6b915b1dc41ee4bb9ee89386c9911974979f43e71297bcb34ad6ed085177ea91300c9b42524503bbbbfcdcaea03e3f2c939d6b1dfc9c6b6e53e221568d2557bc3055752f4fd487b903a2a0bb7697a19a763fb7c615c7edd099f72e87849f57722cb0987651bfc476a0acfe13d02d6b01f761784d247301bf514a14a990cd4b59664f826649e0f389787641c1e5b87388cff42fec144d6ff3f382b85062bc21368c93019bacb56b643808a848c60bb3d804aa64e2b8fa1c128d6914663d9d3 -CT = bc1c14f1df6ca46e6b4daafb016daa235718fcccfc1ac698a061885c33479c0a7fd44e46e805869383232168940b1a9379bc652c565059ba81b4ec2ab435eb9b91de5bc03cb0a7dc11805690ed9abbadafeab2add15f9fd69b5ff4bf4ab5cdb4a6fd3164ceb7820530641d8460b83929b13860bd2e64b984407dbfd2de51e865d88c63554ea1f04305ab72bfc991fa5573bd6b41c4f8c848fff4b0c5d2398a57b4de4678ca4dfcb16a7612773a24088893444a8ea3d0916e4b460b33657f41d2b04d0c28653ed068a3653975402c31088cd74722d3bc09c50679d0ec94c1e84844886b1a56c4fc3b14614634f08c5b0868d276e9f8f992f94b2c55be5f2e408a498d27c7 -TAG = ee43dba528a9ce84a53ed8fc1fbcd871 - -KEY = 7990cd12d13fbb929fa541bdb8e3107e -NONCE = ff7b2818b62e856952aa2cac -IN = 5ba2afc1da8c18d8be3936a2e515bf9eabb93e44905a86773a38de7f959c49ca56d7f1fb43213cf7fe394b49733b031334729ce6c7ef17d843790fde814672ca982807b76475350210871ddf8309f59fb280a7d41726ba7f00ed2fd96b4a17aeb7d157130cb7e49c8a454cd08622824d20f86b4ba062bb3b3f9d4a9c1402a9d80f3324e4127ee57ad94f87d6ccfda76145363fa70df95341d483dfcc304757da7541a0f148036b2e2dc7f93697d8d275456107a016b425542a89ee33ec02289f5260257176369d990c8c89df73892d7e67227086c0c2c258e5fbfff8bf9129a230c229356fb0935738d2d6fb82992c3465ca5a9472ec06c7b5a29240b611837225c61a0e14ca2dd30f -AD = 865a9b2706eea62f3fd3164805cd8fe4740d1ba7be809cad9fb39cac26f7c57d4c449f4eac03d87f87dcf219c562b9ee07ab3ce22abd46237eef8221049fe499c9189f789948af92bc434b24aa44fff600c2d698593bdfcaea878f8780adbe8dad2cf453d253e8668631a6eb831be01db9c7f1b7b8bfedfae83bcdfef3501cf2b2ea48bcb19f40a70733f3e4c3dd90e17912d5797fa46ec852edcd49b0780bf6287679aaad13a926f750ad7d3ca1ccab577b74fc0ce4cb22e5c619d2d668292c9db4a98c5acc4c49561a77275c06f5c3fd514ed8555db3e2f50dde5c23e84a38129e7a91cec8d168bc828d09239a5c6bbb180bf69950540d8876f9fac5d1a258543a771610991b92ec -CT = 1901c8f9b5a99c46c9cbdf8ace9db03f36ac17183295544d8170fdc3a16c7194a2fda400f8f0b251a3eccf639f539cc356ed3fd09383954a8119b536290865c30a629d44e467acff5fc323d2be97f29fb9b4ef7cf2c18a63dabfefd7f75e696c574372f4a35249897a3387a2b10c1a50ae23ea74560b498c9d06bede78f4c8c9d879667c8c8e137a0a254f3f881ce8d183588546e066314bf1989d1acadbae61f7836fa633de9fd0fcc5b3f72aa03ac432be8f7a14c8e86b45bee416acfdace44b783137e3135a801342061781007ab939a52c68d686f5e3b401240bb10e764211a059fb0aa00e2f635ef214322918fffd0326ae38ee939b4045c6039df7e7def36fdad7f5b65c20dd -TAG = 3e003897b4d9411cbd449cd8dca5b58b - -KEY = 64f0a8065987a4713e35dede10afb708 -NONCE = d6ee984b82f1097331400f38 -IN = 29327f95b41119679b80c3b51fb5240490689880ebb5ff7b59a62ae5e08f7cf0993c09b13fd845ffb32a99ce18c22bb8825c137c3aa622cf3a8390042c6a1a159aa1dcb6b6b21f4e07fada584dd21620b2fe0aef64dc609aac925d8b8d26915fc101031b68a4bc89898bb92146a0a580103da265cad1946791c5735b95d85d3f0f1f39a88f47b9c52e61307627c084d68d14bd14e3572825e190bc7146080bca423099f643d53ee3989386b87fe3dd9c383f6a58fc0437fdb2087b5211df2069bfd981d8ca785384cab31545ecfc35345f38837883dbde917155e631a46ed1444ea0ea8a5441bebd54e5f6ff914fcdd66d62efd223f34e16a880370a529b2ce6ade88e907102021dc87aba9900b6 -AD = c8116196a12363785d4d6fc593b23226a5fe83b00a77ba24c69644d2e52291dc59d2af3c6ae102707439f22c33251a01c41867f54ecc552396a5aa98ffc687e3a88d8d0dcf826645bc78ff9c1a3052481933c3e8ba8e30bc249e6d095699ebdc51684696a15dcc9e28d09cac757e51336f79a0cd5ce8d070579e12956a740666d28ead49c47bae10db20fff8dfe6fb0260a87cc6f5a879cd0b2f949dbff046d90cf42c7ab51337e8908302935e50755a4503107c84fc94f7db3d3f0e8eac9c0def7435676701c9acd7f4c2349c3b7324622dfc4d6ddd8265a810c000158260aa6a7e3af973f8b178959de409792652e9c4ed1d50fce2e5e6bcf205c6889ed717db7f4b14500aa8641b8514150cab -CT = 3e04445e0ba21e8788f6f192b710b466d5d3433463f0308a3c0fbf7f1666fe01853b9d340f496bb0c2212ae3e3d34b0fa1adaf33f039201d1962f2b51031c2a4dd9aedc08f7c895682d1352e9a21225d81c98ac7fd4b4de6efe3dbe437d255e4464a1258d4497e2a1d4ef6c319869b78fdbcf4632743825112fc21acc0a1431d8cf8eb8865e695c0f3668ff5acd8e850373331ed7ae3bbe515b42c1d0ca0b9caa4df0048425fcd08850f23a86b4adc859291b5c49ed54e41778c7ee2a11da9598396aa889dda9513afb9fa0b66c0affa555bf76849d754702163004fe3e77ae5a7c46f3696bbd52cb8680583aa5cac22608c6d45b96770dbbfca14312fba61b3fd0d7041ded80d8dfbdc3f901b10 -TAG = f42a0e4e6e6a1e0654aca2ab7877350d - -KEY = 2c351f0b77cf0920873fb57c910cea15 -NONCE = 4f844d27dd26df3015608119 -IN = 227ae9330bfd5a662af4137ca7fa164f383a63e5bc33eba94726a0e7a27f666887fe484680899ad8aaf6fc5426600760f5e6ba53b0484615d0089d9b1e75f5952ce0665d16a045b272c3c50194ab7b3831b313dbd800168a24e576cab5dca4319660fc6add76bb400376fa29cbcaa25adf3cac81f3e66a6baeb0d94ed92aa37271d2cbd8219c0647f0af6a4ba8a8e169c10cf6354122054a547ba046e67cf1fb424271d3d3eee5b51e94019d450de6c1f770395316421b61c5ee9ff00c910103e58d423946c68369730a974a392c21be3fc8223cd816e7432200390fd7cc3f5160795422c9daffed23df42a7f8259e295d43fe57f75f674886c6405bc6954d17c2a36348761ba09694964646cb86c0d8c64c00 -AD = 9d7d5e5f63267154bab863a7b53e0ba159a6d8a57a8c49e084b513b463a1e812e94611116dce9c1ceab2b7e18b4d69f7dfd225d2bdf5b7750d0d9dc131f22987bc812da5b0a8ecbe9d0ca2210cf6ed8a791d95c3f72898497226f69c8971c2da342500b75367842d14983384b5985041eda7f1cd73e2b5c71bbbec6537390313583bbd53d2d563848fc93d81579d8db321d1bec973f7c4e8f34b6cab8bd7b5789a7b40f599f2f8c43f6d7f8fdf940577ca8b5159e699d449ffb00acee0940937d491a71a81ee9da0949f8fa1d780f3957908819221941f0c5d011bfb2560acf2d7386f973358d68487954e26ea9ad3068c65b797307831e03aef7d1f1bba9ddbba2f251329e85172ed8efb1a689f8026b5068c -CT = 4ef2a097a8e507143b6354ecd94d072c0068c68698fd04f2211a771bec45d616d8eb7eaf90140850c135cf468dab9e9f3dbf059b56efcf616b32992df407bdb735a8b5ac2c361973abf47029bcde46dd5b13728add772264f2faf60f3de10494b0606618c383c8929377f2390c4a104141a11711ba7e3a3c83396761d7d62a997e8782822f51ffd0eaa0e6c9e02ae4effc0686af29f2805039c1cabc8b826d1ceb75c4274e95f854a9f5be709ddf1002481272586aa021acc2fcfe3e6cb0b2a47d124bd8b83585b43bc38599a497d0de3979c30c81536ab06a1649a3cf5dc2c2a6e52bcbb05a76e35139c668dc8a3c038ffd1fde8c1b4a31de48341b5fd586c674e35bef3b104e4b84063889907c268226dc73 -TAG = 12aa2a46a9014800b3243d1020290d1b - -KEY = d94582550b2e0d42255f13a8753f8e82 -NONCE = 82f7abb31dfc28491697b347 -IN = 53ba297d691fc3abd93ea8b6f3d629584370ac045934b1b738a73c09a8236bf5f99f357b1cbb120414c68ee64d304b7751c88c563d5d16fa094602c0ad3c803a8f116f3a5071c049a4b88f19ba2d500a171565c719fa64e691bd4a9c4588077b0c2b91733a30a214e474d868ac6b301898dc85346523bdd4f6c9807ef69941a5369b4b7ff7fdfd252729d3829a7bde65427639de0b2b154b4830f57ac13894bbe705f02362f8b75367ec7962c53bd6aebbf15d72b25c08570392592b6a83d4f44d2037da8cbfea2456696cc39a3272e46a5b4fb837bc6e4bcd9606afa58d3b260e9f6f58bb5d0f07438f378b6a36c1931e9eaf923c2a3679a789e7ef5865c7e799ff4633f1b2acfb79a5a0fe9cdda9cf347b9664568def93 -AD = 2bfb6a6726c6564b31cca749bec29a8c9fd7bfa22f26af0a80db5e6b13a3b10367be6ad87325abc59252453422535466347059b7d57fd2b1eda1d6d37dcfa9da7df34746e1bbc98baeb4bae17281a537fff85c0785f9f27617e77333f11be28f9aa3704651e4ddd72502c79cb2a810c4686147cedf056b5f035566eb34d117c83ae7815e7e1e83163907020cf0736ff1862371e87269e5c8c1926e0bafbc10610a6ba6cfc273c9d9bec0922726dea04acf72b3f88a5fffc57e0af6dddd0396b4937d2e7d52feaf60d29dddc5b4cc139eb855acbb794b99d74b8a93e3731f9092b92b9bd50c846eecb6eaed2e51290cd1f98dccf3fe746c5293e0b970dde72835c44b3a445dc1f2bd67fff6b1a7e378611eaa42889fb92de1 -CT = 1afa2fec98728ce39fba26bcc769e9766993c8276f88613db574773c84c91fce6ee7dc6ba4281b8d2dfe13820723526f0d6f20cc21f305b792e9a2bb1622c742fbc05ca1f0121cb9f6e1ad6c3ba80891e2043adaac4f1bdf29260a44a182cb165f58f480be5f16b51fddfd0d264bc4a18bec589d24817f586fc8bad15df7cb4d48d788fe7fbe69f821b5558b0a664ee12ba8ddc6bbd325f9b83a024245b4e68b310f2282f4cc6005209f7b7aa6ccc025d435441e3bb990e81bcd4c8218b8360163ab266be4a1f5603059db2bb67e541e1edbe8e7762ac522a81f495f5ff8bf99948050e61c86e83134f4e1212f879c86f7fccff472fd9753e27a0601f914655a5f803061cc986431445021c907b3ae0f060fac13f3723867 -TAG = 5ef1ed1e2bf562893b094d58516c11a9 - -KEY = 31d93fd51c2d6450cf35d9edd71413f4 -NONCE = 28f6f0c288c9f92e80252e1e -IN = e78eba6c58f93cc2374932fc21e54f695f2daeda3bd1e0121a77d178e3bf5c0e824a99042e8f2522df829d014e4d35a756780e8c07f53ca8fb78db6fb76754ad461665051c4572b2514804d0a9cbae1a1a013b796565eee13a7832ab8834b8406b1185332552d38754dde2344ff4f6e4823390964ba2dc43de136f2235b1d919e0f4ad60813d30f0ac1dad35abe3bee9479337c7b430841d2c722f12aeaf931cedd8a82053f697fff8d07f0af6013da7da58a5dfcf45561943e7ccdfd8d11fbe96a68a5a27982e47346500c0284caf8e6b63c6621e80503a7365d6693dc9a249093dc45221cfd88562e25910034c2c123e44e3b09d8a8a15547285d2596b98c7a0ee9d10b2cdb032d08a6caee1212420b6854181a583c15e046aa202dd -AD = a4fdd42aad5475ffc1b122170024486406033c8640233cd9b23c286fdd40c5b69eee39cfbf965f7a10c73663f9804e6821c4f62980f8362a580bab446325b009a004b60b1dbd12566b55b42e58d8037d86c1050cd6ecaaac2fb0ef616a15bc5bcd8252fd459165795c500bbb2fb1476e5cfef9549db733be65bde391c810d099e3745a2cc7a94debe1f4ff6653b338123ef7d2f9a602bc9a4bbe757a63f932a802014f2f06c6688faf14332a355b1025f33687124399f55b6a5adb4864727ec6c5334c41d78d1463400925f6c29c0f611f35c9640045a740dad5b4f0dcb632e7f9a3478b526aa9f97cd9f8d3ad094b7922890e7b6d9c67fcc4f747d04ddcd115fba0a8f0433c6fb1bf6011a9cd153f866c76b26d427a25aebc60d10540 -CT = 8d668fb50efda82552aeb5d075ff3977c37929d73f6639289e7c6da8c89c664df80b2387e788d12398d62d3c0ed2f9f918010d41021c464d54f016c4e10e85e29ba3a45793df2ebd6cdf30045363434387bb0d20439f4986e6eb7ae9fd85fe776f7b8035025624c2413ca8491cc6e79fe901b9c40ff3a0e37a7c7e88b56de4fee65861865162821e046846d253982e4ecd17bd26214b0923a4297d4ed9423395d856940829ca5ee74488c3b4d8aa3c5ceade17d8a3f2e45d3ba91360ac1c76d6a29f8243bf49c1d75aa41ba239fa6f3b123e198ba799e3b70c674607c5371894800954eda0264b3b82606433f71371dabc5f1fb3d703232533662920a241f613c38d16b0bad24f4aa3b336af89cdcd2f371e1bed7aaa47c56d17100a01 -TAG = 594ee5c93636cfb5fde940e3d561440a - -KEY = b06d694a83b14768ae26a8f00fb78ecf -NONCE = af11369ee342454cddb8db62 -IN = c01130afd7d3f4276dcfc1ffaf4bb636a85d18e0778df6c6791b6edb92a617894b84cffef6556c834a4800b336dc295e80b699b28cf478a01c54052ab0d0d4208e1865edd6906e3a263862c05f033668d7eb5b42baf36c702d102a6a5c723974e63bec848c89d16584f0d1ec429c87686b1ccffd7626e0a83f9c471cb615541ccb02cb58d10e63ffef171f1affca492ace4d39fbf33bb5126c575963e6b6ef9fd2ee4d6efcae5afe422bbfd9c3dc22b6b47cab8dc04127ff93b016e0f92f5d8518d5bd3bc6edd45e0397440f1a4a0c7c9c2773c0a0cd3b890effb010dbcc00237dbed1177b86bf60913309bfda9376b4192da59a360afc5bcfaf8be16ea8313de97b417aaddceadc63a1c3a355693616413ed4101ad68f6e6aaa99c839dd2a9ff536 -AD = 18e3195358bae4ccf43ff8daa34902fe48f99fc1371d34060aaa442a43016a1d756f795fa5c9c4a828525554571e18c27134f46094790dd1e68471ee40c17bfa02f175b2c2f7f2aef20f00e4d71926560b58f015de19c871d808acdd341675d8fc19d1e6d4028e1e8926df500c4685c14729c6a056898cf919bf3ae429fa3ca8746495716d78c9a8f2ecde596f985b1c25ad0e73aa305a86259319176b4c4f3bb231fdaa478a856f46416ddb10a14ed23c96dcb86f5bea3114568a44d8fc6ff4bb47fd0e2538b70d964842910a682e7bc7c7263249832c21b7083a1e8b143828de0f3dea8b404cbd82efb19a11e4d60aeef13abd86621ccbc3d8f220715730eabbe04a6bf0e11a4f78cd2c4369ce2447a76f4fa48ef8d322a8a28a67039c24c4bfbf -CT = 6beeb306c71318cedabe3877ec916ce2074b2c3f1df887cc3a3e8019c10d353854b6b65c947359138d5decc62a42d50921dc8f6cf63a16062af47aa8cd50d0b2dcbc3300ba0d7d069a5e4b4fe03bbf7062c6001e276be116fdd00d15a6399d1b0db71c58f396f8bc7e51c2b1f47430d4ebd6c5d05328b29aa79bcb26927ea5a40c82715aa0e36cc83ca6d250812c1305c02ed4291a25762cd709cb3d808031b5f918ce253f622c1afcb83c43707edc493d18ec6f0dba4353a1cde7184db65654088fa13baf45f7643f0dfedf4058e6095156b791ed30827c556a7721658314356e7a3f3c62cd62fe938b008cda56ceca71442fa0ffeb78b13c5847a3ee9668bcd2a01c753bd797c240378505d1e8f2b8905428b23bf589de9af390f94f21630d1826 -TAG = df5a21a399354b2b3346a9eb6820b81f - -KEY = 06a4c6a8aa189134f5784a525d46ff10 -NONCE = 0f765d3893af99f5c3e6d9e1 -IN = 706b754094869313523493089e591d34868b708cbde9bd8b42cba8175d1fdb6a8769bb9ec156d44bcb8f9cbf2685a0dc18b5a802dcf7a12570bb9042a0aa53dfb19af8c0f13763f388d9626a480d6d435dd90fbdbb4292d9015a5633252aa0583498d6f7ec54460d8589c1d6a6d16a349d10ec6070e1cc52e5fb996f810d333675a7130e4f3db9f4db0e3fd3541d32e0b2efbd40ba70cd59295bc8d08481f0f137832b01bac1778ffd7450376e174067b3ec23d0495cbf936bdc176cabc3f42e2991947a4fa87dd8343c32fa3d7ac0e2d22660a0c128a00e1b51a8742fdb2aff44540e39e588c5920ea16293aaa522513c944d3b77f3a0e90bd9105319c170886202e336893d100b0a25aa609a49a8255f78233561f7b88256386d1c3c002c3ee68f2775585c65 -AD = 18e2ed6d500b176e49f7e1b5074c0b7dbfdefdf00a63d9fa2fea8c5e78a1c4ae00f17b23442933543ac864097629e112a099f3dce6d5beb1e3f3c8e19522c6b8f615cbe23444bc91a802edf8a08995a55125da805ebb073fd89863996ef708f7293069a744ad95db8c17cbcfedc331119e85020df8852d74b8092fd38ad424f3da41b4775beac19536ed801ac1069925b12303d8ad2c52c36ca5b4ec95e96f02ebc5725ee6cdc099e666d9055b789e39ded77a8fdca0fe2d94b8039be55b6a75209cbee4fc7864957402b50427db71bc75a0b1e3d2ed6ea20f12a980c5ee916067d0dde7d686570d075da4df7088fe5dccf0d440064a96998da6f318b603d513104c723f27484780bdad586ee358d821b480f9569e4dbdd1a45ab9056f8d8e5a879789a0d65338 -CT = 5f3627bd53f8da0bbe6f3c9246d6f96fe9abb91cdecf66ddd42f833d98f4d4634c2e1e1ad4088c84c22191bdb9d99ef227320e455dd112c4a9e9cca95724fcc9ae024ed12bf60a802d0b87b99d9bf22590786567c2962171d2b05bec9754c627608e9eba7bccc70540aa4da72e1e04b26d8f968b10230f707501c0091a8ac118f86e87aae1ac00257aee29c3345bd3839154977acd378fc1b2197f5c1fd8e12262f9c2974fb92dc481eeb51aadd44a8851f61b93a84ba57f2870df0423d289bfdcfe634f9ecb7d7c6110a95b49418a2dd6663377690275c205b3efa79a0a77c92567fb429d8ee437312a39df7516dc238f7b9414938223d7ec24d256d3fb3a5954a7c75dbd79486d49ba6bb38a7ccce0f58700260b71319adf98ab8684e34913abe2d9d97193e2 -TAG = e690e89af39ff367f5d40a1b7c7ccd4f - -KEY = 31323334353637383930313233343536 -NONCE = 31323334353637383930313233343536 -IN = 48656c6c6f2c20576f726c64 -AD = "" -CT = cec189d0e8419b90fb16d555 -TAG = 32893832a8d609224d77c2e56a922282 -FAILS = WRONG_NONCE_LENGTH - -# AES GCM test vectors from http://csrc.nist.gov/groups/ST/toolkit/BCM/documents/proposedmodes/gcm/gcm-spec.pdf - -KEY = 00000000000000000000000000000000 -NONCE = 000000000000000000000000 -IN = "" -CT = "" -AD = "" -TAG = 58e2fccefa7e3061367f1d57a4e7455a - -KEY = 00000000000000000000000000000000 -NONCE = 000000000000000000000000 -IN = 00000000000000000000000000000000 -CT = 0388dace60b6a392f328c2b971b2fe78 -AD = "" -TAG = ab6e47d42cec13bdf53a67b21257bddf - -KEY = feffe9928665731c6d6a8f9467308308 -NONCE = cafebabefacedbaddecaf888 -IN = d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b391aafd255 -CT = 42831ec2217774244b7221b784d0d49ce3aa212f2c02a4e035c17e2329aca12e21d514b25466931c7d8f6a5aac84aa051ba30b396a0aac973d58e091473f5985 -AD = "" -TAG = 4d5c2af327cd64a62cf35abd2ba6fab4 - -KEY = feffe9928665731c6d6a8f9467308308 -NONCE = cafebabefacedbaddecaf888 -IN = d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39 -CT = 42831ec2217774244b7221b784d0d49ce3aa212f2c02a4e035c17e2329aca12e21d514b25466931c7d8f6a5aac84aa051ba30b396a0aac973d58e091 -AD = feedfacedeadbeeffeedfacedeadbeefabaddad2 -TAG = 5bc94fbc3221a5db94fae95ae7121a47 - -KEY = feffe9928665731c6d6a8f9467308308 -NONCE = cafebabefacedbad -IN = d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39 -CT = 61353b4c2806934a777ff51fa22a4755699b2a714fcdc6f83766e5f97b6c742373806900e49f24b22b097544d4896b424989b5e1ebac0f07c23f4598 -AD = feedfacedeadbeeffeedfacedeadbeefabaddad2 -TAG = 3612d2e79e3b0785561be14aaca2fccb -FAILS = WRONG_NONCE_LENGTH - -KEY = feffe9928665731c6d6a8f9467308308 -NONCE = 9313225df88406e555909c5aff5269aa6a7a9538534f7da1e4c303d2a318a728c3c0c95156809539fcf0e2429a6b525416aedbf5a0de6a57a637b39b -IN = d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39 -CT = 8ce24998625615b603a033aca13fb894be9112a5c3a211a8ba262a3cca7e2ca701e4a9a4fba43c90ccdcb281d48c7c6fd62875d2aca417034c34aee5 -AD = feedfacedeadbeeffeedfacedeadbeefabaddad2 -TAG = 619cc5aefffe0bfa462af43c1699d050 -FAILS = WRONG_NONCE_LENGTH - -# local add-ons, primarily streaming ghash tests - -# 128 bytes AD -KEY = 00000000000000000000000000000000 -NONCE = 000000000000000000000000 -IN = "" -CT = "" -AD = d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b391aafd255522dc1f099567d07f47f37a32a84427d643a8cdcbfe5c0c97598a2bd2555d1aa8cb08e48590dbb3da7b08b1056828838c5f61e6393ba7a0abcc9f662898015ad -TAG = 5fea793a2d6f974d37e68e0cb8ff9492 - -# 48 bytes plaintext -KEY = 00000000000000000000000000000000 -NONCE = 000000000000000000000000 -IN = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -CT = 0388dace60b6a392f328c2b971b2fe78f795aaab494b5923f7fd89ff948bc1e0200211214e7394da2089b6acd093abe0 -AD = "" -TAG = 9dd0a376b08e40eb00c35f29f9ea61a4 - -# 80 bytes plaintext -KEY = 00000000000000000000000000000000 -NONCE = 000000000000000000000000 -IN = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -CT = 0388dace60b6a392f328c2b971b2fe78f795aaab494b5923f7fd89ff948bc1e0200211214e7394da2089b6acd093abe0c94da219118e297d7b7ebcbcc9c388f28ade7d85a8ee35616f7124a9d5270291 -AD = "" -TAG = 98885a3a22bd4742fe7b72172193b163 - -# 128 bytes plaintext -KEY = 00000000000000000000000000000000 -NONCE = 000000000000000000000000 -IN = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -CT = 0388dace60b6a392f328c2b971b2fe78f795aaab494b5923f7fd89ff948bc1e0200211214e7394da2089b6acd093abe0c94da219118e297d7b7ebcbcc9c388f28ade7d85a8ee35616f7124a9d527029195b84d1b96c690ff2f2de30bf2ec89e00253786e126504f0dab90c48a30321de3345e6b0461e7c9e6c6b7afedde83f40 -AD = "" -TAG = cac45f60e31efd3b5a43b98a22ce1aa1 - -# 192 bytes plaintext, iv is chosen so that initial counter LSB is 0xFF -KEY = 00000000000000000000000000000000 -NONCE = ffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -IN = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -CT = 56b3373ca9ef6e4a2b64fe1e9a17b61425f10d47a75a5fce13efc6bc784af24f4141bdd48cf7c770887afd573cca5418a9aeffcd7c5ceddfc6a78397b9a85b499da558257267caab2ad0b23ca476a53cb17fb41c4b8b475cb4f3f7165094c229c9e8c4dc0a2a5ff1903e501511221376a1cdb8364c5061a20cae74bc4acd76ceb0abc9fd3217ef9f8c90be402ddf6d8697f4f880dff15bfb7a6b28241ec8fe183c2d59e3f9dfff653c7126f0acb9e64211f42bae12af462b1070bef1ab5e3606 -AD = "" -TAG = 566f8ef683078bfdeeffa869d751a017 -FAILS = WRONG_NONCE_LENGTH - -# 288 bytes plaintext, iv is chosen so that initial counter LSB is 0xFF -KEY = 00000000000000000000000000000000 -NONCE = ffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -IN = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -CT = 56b3373ca9ef6e4a2b64fe1e9a17b61425f10d47a75a5fce13efc6bc784af24f4141bdd48cf7c770887afd573cca5418a9aeffcd7c5ceddfc6a78397b9a85b499da558257267caab2ad0b23ca476a53cb17fb41c4b8b475cb4f3f7165094c229c9e8c4dc0a2a5ff1903e501511221376a1cdb8364c5061a20cae74bc4acd76ceb0abc9fd3217ef9f8c90be402ddf6d8697f4f880dff15bfb7a6b28241ec8fe183c2d59e3f9dfff653c7126f0acb9e64211f42bae12af462b1070bef1ab5e3606872ca10dee15b3249b1a1b958f23134c4bccb7d03200bce420a2f8eb66dcf3644d1423c1b5699003c13ecef4bf38a3b60eedc34033bac1902783dc6d89e2e774188a439c7ebcc0672dbda4ddcfb2794613b0be41315ef778708a70ee7d75165c -AD = "" -TAG = 8b307f6b33286d0ab026a9ed3fe1e85f -FAILS = WRONG_NONCE_LENGTH - -# 80 bytes plaintext, submitted by Intel -KEY = 843ffcf5d2b72694d19ed01d01249412 -NONCE = dbcca32ebf9b804617c3aa9e -IN = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f -AD = 00000000000000000000000000000000101112131415161718191a1b1c1d1e1f -CT = 6268c6fa2a80b2d137467f092f657ac04d89be2beaa623d61b5a868c8f03ff95d3dcee23ad2f1ab3a6c80eaf4b140eb05de3457f0fbc111a6b43d0763aa422a3013cf1dc37fe417d1fbfc449b75d4cc5 -TAG = 3b629ccfbc1119b7319e1dce2cd6fd6d - -# Long enough to detect counter misuse issues such as the one in BoringSSL -# commit a3d9528e, when the AVX2 code path is enabled, using its EVP interface. -KEY = 3de7b368783bd7287f2b9b731814c876 -NONCE = 90dedcfff100eb1f1db9d935 -IN = 8d766795cadc0961c0f448c62df3827eef3a8664599b3adbaab0cfd63875bceb8f992b4f7447dca10ddd716aa0bc4fe925e1aa3e3fd1d5c430c650fe3546d6b9a24d576a857c5f04e8c0a3b149df277aa19cfa64ee235891d3b8ec0e840d268b1e70dd8a4bf97628a0c7aea38aa21eeb8fb1a8437f2abfee05e0d2c30659e312ec03d30da51b7c19073a2341c17df806e27e796d581143d39e4de8d3f8d46aa6d6fc1a98d94fa69b92dab751d930cc12de21fb1a7468af09e3c12ff6c3db3967d10cf140bc46f17a16e24b010b6cba5ebf777341c52042596ee53008389c48d9690ab9f5625795c3e588f72f7a1670b2b25a9f4eee1c8845ac90f1bf47ae4ea4b607a50aca88ed304cbb700d02d5486139b0bc81ec042e574abf986972fa008b83ef22dbfe720c2f2f6355c87c975932cec545ebed657e5e7570c503e9aa7f0b87d0b2648e421ed1d34749637c95d1e931af8925236387e50454f0ba2e22ed05f90450fad46f4eb7ddb08656511dd065c0f852a7e42f618a961a6c6bec42226c6b6043580b009ec9837cf99844cb74794a82c269ff648e0bae9ae50256a0ad98ad9f5a35057b3004ac96f469f9ee966dadc16dc47616586cf242706df96bb2f7ee43d3bd1c65d2eac7b82ef242e77ab509afb9639e5f3995380e926305729ca762c487f4411ec2a9c688b8347e5287216dbb38c3fe2281a89fcb47ee2ee7ddf79bfa3ab61cd56a00981019bbcea8aa0444eb75958e5fa56ea0036d2de4950a7db886f4a318b433bd41e00905ab158171e0ef13172293bdf70064b9dc7b243bf9dc927589bf9e99468d1cb330639dbff1850cc51929b8971b0b2ede9d06bc5f6ba39d4551b587f09bf6f8206e8f1524f55714612581d6aa45d8fb83425f84a736576deeecafdcbfbb8670d14cd2ab2a7f8b7f374c07881b7bac2605fd5ff7ff7cf43e30cf49910961a9079c0343b8601be8c3e9fe38f49fdab0b7e1a8c1536cf84e4d80d26ae5ec37570839b5cda02929221898d611525c3a88fc444167ffc532b256cdd0a8f31ff08097d75b629fab99c9e1062d1d9962b211e15ec8709934029c4934e64db8d7a2f32e23dc541be306e9a57a3419115994cbc3a8f8d5ea2a6f45b9ea9ac0e51ed0c6680fa029f4552a6c8665aab00ab77928342e7284c321e9500ad4774ef1fed0f596d5aea371fe1793271aef38cde55547f34701a525526e83a72673385a85f44db511bc87ce1f831fc6ccf8204ca4f4a20eac09897aae93684f14ede21bcaf40a09c08012b92600d6a839ebdf8bdca7b34192c6c50bad8796b3be3c375dbae6217815d2c75cc878d39b4e842d4eaa5f5df2242cf230e44a240e18e47827f089b18bf880fd41a2516eac8e6ba3fc2db64a4bc28789860d7b18d9edeae8b3059f4d945b15d0ee27b1f74842dd1df117fe83a8fdade23a47c93902eedc4d33f2dbfcd1996e6dc1458409fde2302830e8d44c58c5ae67486b9950dd938f14c38bc4c9484fdc4ded93a0f90875773453fc14d428cd6e7beb0c705d61229d2b3df09632ebb30b325fefe2aebbf2a7aa8e4ad46277ca4b8b078818b63d04e7652057f6cbbab7c43ac355537e0d3918b4a73c00dbe6b30a27ee7a6fa213d3347ae478e8edc323404b8322b9c7b0173ed61c38ed25f3576a675d527d22edd51d6dfa5767560d3a50a91226338e8c4e6436eedbcd3d2efe9dc1e686b15d2f57d553abcfda57dc316ca453a690f20148f0dfa20c1c4a58240aaf7195095fedfa56d839d0230d55ce9a8ca1b9d1acd6fe98d583148ba0f4a4e3413c76e6ec57ddb79428d3a90079f64d3321c791f60d501c3fd02c8403f0f5e6c6836bbc96430c1b48e83350c3a3cfd017f15bee3e4bb1295d821dc98b85ab3145555cce2c34a8142fe50f8db19918b514a165d12ff6301fb2296788760ac0b6d9e3a57770ad5111cde5d24b6321918cb0b0887a282b827a8749733171914b000e7d3c0edad1d42ca60da37f0698554bb2a1749f73b3120dbeaa32951f8217a781a200467d5b569d16f56fc9b7dff0ac524f03fee0617f4c692d94613b1e13b18075dc9f0d32811d4a8949a95f6b5fa46aeb83597adb409e68b2a0177c36dcc95dcb2e7dd4fb7337ff97c013364fe139e185014948fa698741d822044fa3f6978b16afd18138c845587c405ebf7a6cd1c28610ce67e992ed49e406658a0a202feed9709500d064b6f53eecfca57dd4b38363ce3aae9d59126d8ae7e140a373851188ae28c909181d0ac64770df70dd2475809350cb367825b59d521d5e457b4e36aea6dedd90a2266898b753b57fa359d43cd388e7d6c7ed90bc4c2af34ceafe88a3af6ac376fec35f1240f08af4f3eb30bc53dd68e5762e6d39e6b16f63003fbe0bee828d0d7adc58c41e857c2c44702215b202701fc696eae021af19c79e59c3e32627cd571f5db99b17f1772b5d746196befabb0b7446687827f3315b391d5dff069b1c39c00bb143218ef458e3b397e1c99640d57fc8db2e0083d3d22ed4111a8fc9e0e6f55fe6a56e946dbee43909bdd7d516fdf756ed8099ba80b1e17a5e279119345104379a36962ca9c8b2a53c414d79eb09fe79862ca749a9eabd9185ad1df57215945882f5894868a134bfc35c835e040e77ecf077d6a98a73ee022963d70b036be3fe5718280ae52c5d751211b22950c0597aaedd35af41f7dd5999e5f7ee34a37edcf97df54a46742b0252b196eaee454ff0c30685b15f8de087de208906be1d971f0fd89f7cdff2af0bdc96759d6889fba9ef092ad1c8deab0404562a7f3977d211c28dfd1573aebd5427a8773f03986101703fa19cd4ab96a381c76a747f63b63f7a9a3a08e251cdc593a024f63b443b76d17dd9e151809da3c582fbd334fa6dd0221b6d410c6a78ba95bb0154bb8999f619f2e084a6b9755ceee4ca3c7e0481a47776c8814f13054e627e37630d593bd09d5f10a049c66c9999f4b0b037e81ef70615d674c7c7975972994a053c069675fad3fae5ae3e779233b70254fb87f25d44c104afc3d5911b8b695173f9337130e39a02cf97356cb817f6cd23f55ef74dd06bd24ce5887a7001ef576262ffaa99f9bb5e3f55bda2aa0f199115909af48bb4d6b1a0a0847774515302cafebe75aad1f63362b1f38141e8721851c3ef1a247931b3b450581eb5d09027b9e3ba60ae9801d629b74991b7fd65520eac561d47115a85141d9a757bc75710bedff1630561ae05254ea541a7ff1846ed5e164834417556dd562c45543c88d8030bb56451fd5b3cbf10fb0164c5288789d2aac7e7a836e79bc3dd401a8e3e05aa6714ffb2dfddb3037c35fa1ebed62a073b2da42133f2620ae88de5e3f46cc69f2b9b3c9b88e39b8b108059ac6bd493be5f7a39f6b53ee825f4593b77ec9238f5ab804d533f48803e7d8187291ee25cfac4da5d8c9279517adfb09c422f6d704711726c73828a5082b4c7b3d85611b8f496d3e0f78c5c4f1dd1c722b1b11d55861f232beee6aaef8a00fd2eeeb45f182af191ca6de8eaa25ceda5451416fbf6d1abc0670b8c10e2815076f271044c690bdcb64856b91265bac202043a28f6bbeb807535aad4bd89e572a9427c826b170d3862f4cca70ddffb4769d6593a1cc6c42fd06cf68642835fe474a23e6f63df316f8361bab959b768d78e20c03c2a99913c162a9662bd9981eee55922f36792de0af68da04ab49dca72e3d9b0de79df828b433bcf6be073f851a36418c03a717d54d48c1014ccb793577c8393b7cb53cad6bc7060a54cc6363734f6ad388763519ca09b533078d3cfa61d7bdd4c4dd0ffe64d68d501b55903d3f4a1f310a3826ac2ca700de01d656188dcf577fd1b63e305614b8d13471f6f84a5d4b12c5e119870a63d1e3dbd39d3b5c26b09f9d80f8a59ce836b20bc933496923d278a022c00f3aac204d07d2e5075bbcef1e4820d633a3a2b35974f72a033484a91a1d6a9913239c93e5783b01833073c98f358e3465efd5087af37ad60b7285550e776d67ea7019e788776c5a456102358c32eb4e7c28096af88b9a20d8ce379ba3928a10ffd539c106f4927e7ac0f382c74017d6e4438fb128c660affd45e9bb68452de72b574eeffe3ce239d0718908c3800bc7e8ecd2fc7d9754171506017fd7868594c9373a96579fed475a28811649ce5dc8a3107bd0d8578748878ce4998684620931dc3981a2499568c2f61174c3b3fc46a7010468e8ff75c08cd43ac764d95e2ad1659f9db62e9554f811e0f43bb74779d923c8c243d12a5314d3c0c6ec84fe60e1d2b2e2b20d3e64054d62049ef9233ff55223a319c285e4e3f4c98dc95b2ca81230d7fed9bb99fd7d97430eb32c9c11647992bd85dcb47cfd58ea3e221d095bcf9374a6baa7c8333581f62b9e489282483023fdd18451f09bec764146b587209160b3d1d7a3d2e145fdb640c4bc382541e0d84255122d51a710887ebe1ccf29d41b4dd7fd7368d68ada250d3968d6f0971f0849c13c09abadb9db8b08960a18f84f0346ea0aa71227afa55b90cabc062d549b616400d36450b19adb67d7358e48c043fa1135abfca89374c906f8d1a6a845debf6b37f055d390b029c7f4524958bdf8d7e2755dde3b957f0926f9d3b8821ba96044d3cad2d637b973bfb657fcc06ff44c17965acf572ab7a0c87604c7dd1cfd136a0ad02b22e8ef320e101ea09772588e8c5b4d88f40fe1be18d27146a2b9559491949671700cebff9a709f297c2621ca9d5d1749623abc20a326ff5be55cb9435c03bf49b147b1e0a4a918bfdc3642df90b396a474f81d75c953d87b3f3b4e31fced630bd7c481c63acbb84dd31249101ac5277a36dcdfc80d8d9a2e928e9b2d65bb257bce97ccda83b187da8a7886dc96eab93d0864d88c358105f9cfe1ad0f0a8508b5b3985ff95de652e684da970b57669aa3fdfbe590a631522abe8246393639709a9a6cd549e78e3c2d1acf84643e9f554c5e076f75a5c1dce1be20a66722d0b896837b7036509ab8d473d5d2b7a8374d6a575f69d54afe3e7e18f4faf4e917be8a74e55c271b96d966e0c0b883f84b3ef2e4f278daeda2efd3ce770801d2c4bda5eb9b646deeab9fa55324e917e63e4eb6aeb4176cb4e43af3db61aea1546fbf16e76a12fcdbe726b565710e3f9866551023e5fbac0038678717e6ab4d3e92dcc53049e8cb65c00216d31a8869ff4d3539313fe2fd7ce0f53b255e3659e7dfc5f92b7627dd9ba42972f0ba72b888932d870ab97226040c4c0f4826be131fe1d2cdc21005ec2addd7796f0927501251ab26b0e5f3f9d2a1cb346a774e18bc233cc89aa69f5f70e3d5c17098eed350ec419c82837153b5c7f5813bf5918defc8df143063f3fe45125deded2b15892d5cebce589b60f2ada0f9d608983e8d107d8e6482b5f542c6650b014445e8c055aac142f16cfc59229fc9626f7aaa40cefacef777e494e13dfa93d27c201788ca9f60e572af8d65ffb513473dade5fe494cbf7377bd1ed03db2571d65af3be4b0bf27c1f069797bfb67ef0bd8a88c6286af6712c106df9c418d88054e3b46c88296a2e63894d6bee0dda8833c373d6a1b27637e1510fea3eb2fb34ae27354571369653a282a8d19f2c34f9e5ec34555b4ed24327dc5d246df13736bd41021697104f80c85bd0ae920e9aeb4e628fb8aec269d55858df149af298b06d61250b043c8a14a15f0646d0aaa18109d031c449e66dd7336044dbdec912b1bb615fae2a3df480bd64cbed74be65c8f1acac247e80bbaeb6f9dab38c6addf4f3b094d5934ef5c9749053b9159e280034e601731a12d6688ff27ee3581ae289de424d16676fb750d2ccd5b3f964dd77bdefc15bb204e2350632822384cc194cf9130f1ee81bfc3887d3366ec0b48cbbe0fe674281ae7445f03791887873659825680448f162452cef57d783821a73047078a8cf94c416850092ac772ef0b2e48517ef101ee0681b5259aa27fd56edf3c01e6dba6298ccc91b09bb304b637eccf8c673b816e74bd7f8ceffa6b17ab03df7ee9ca4098d24d044015a07df782a309cb6761528272632a6e1323c4e18284b463dfcabed708e4fc95cef133865cdbec8bfdde100621c65a92762cc3141ff37b66dea8fa6e3aad61dcbf3b512467c4773d36e58989e12a636389c1678c191137a5f7f59668c8a527dddcdd0c3fbb14cf48b8f3ea306850a5eda76c57aad06312d7bbfc18969d7b611f512358a7bdf959cc2f41de1c408133ef02b1fb2cdf8efe9973c27536434e56fc1bb4880db7fe901087b53ef3c0de18aafa47c25f1cd62c362f2e5da41c2dbff0e13adaba26c1e0829f027dc0320442e851eaed9507b70ac17180725349f6ea7b59bf39c095a9d10790e87221c7c2d24b8bca184ee95a3ef7449aad6c1d905f688498ae7a0cd1b01f76dabc342fb2be0295ca1484bece3c9b8a1b91e53de2d2587f3607a7f348f5cbefaa7a6dcf61bbbcae9444e2d25a77b016cbd1508c8cd319e9812b43b0bbca52df155d418dacb6ab1360a9e605fb53c6e20588a10bef42d884989e836b2ff16fbcdd2c1704f75dc8c1ac2cc6aeb92726f5d46e4784c70e1e249c102be6da506e5e3c2cef6a8bc4a60dac7adf3cacca8679f8f792ddc27613e44a70fd849b7617e042da46d65a3e6cf425f59b83cbae5b6e911142abd13a0a8cdf06d041435ee20e2ca417e905d2dc49c15b863ae5920ff7f9380a86bb0c86b69a000c157cd35245bf71f9dfdefbd1760af90ec3e554ebc511aebf650633221ca9157226f613f41406872765f8d7b916ff3877266f017b8d840dca0697ec3dffce7912ea9eafb62cc2f2d0a112c9bc0727444b47b62766bddf5b5f26d391f653b6894b069069979d0cf8cc7fc4143626a8420bc0a3866db3860096cc128d620ceff059d1614487004adbdf6b0c4428ac8897dcf16e6b11a692a6b465a92b40010f3480b444d4d2e24b0af8467666905c2a6233bdd6502521b621d3cdd4a5e1f268d65bf6a1879608ffd3abf635c5f0948f3cec7e087485c72b00258ba69783cfe7d611bc41c27814ef5674185791dbe626e1f276cf2c399a4eb264f19c77ee95d94252f546528f629188318e9ede65a927aafd2f2af56ff32c0ef39862d2f92268bc9400afa8ddeff591f3ef99681263a33b873bd9e01a59c8b281da30875245cbffee5268563c7f6f20b9e22d998934131dd219624d3cef6df2f3d2d6401833f72c619d6f763837141dbf93179d0f01375581ebe227185166aa7988eb9fd453d510ca6616cc013d551d23a33a4241e85aac3201284344977d496d768f5d920c5670b1d8bb608efc1b99abd261afb0a4ebe191605cc5c2e20523a13b3b94dd1fb24a27009d9a5b6329336f3516a327642386ba64c8769da1324a8a3d1f304cf0700df2b3e38215a954523e1d40ae96d0046e2929a815bf70785e94bc9b89246ab6aded60d65170eeb49b0ee0a57ee2e57db92409105c25f2d0c1a17b5556d06511bd0991a426258372c7f2b402dd533a75aa175524eb5d6b9575300b81fdb2258bd74429add8aa477bd1182db57107d411d16147defc3582861c68f5ce82e0a0316edd5d0f3cf36825a2c79a33e376cce2e63274b3b41bcbdd755845ad9ed2a3bdacb6fa3fa9484b7b60edeb1d9ef84772e78e39adca14c9fa0bb3ad1f1c17fb9449270e9b4c97b5b320839947fc73853fc58304ee9c9e86f3775f5469554d5006eb7ce9d02d5f900c771806c275ee7022e2b55d111338dd93ad51d14008df4c13d8c03fd9bb3689607e5cbdd499c3a372b487af74cb140f6300cd2dc2acda07277ea3dab57ecf09f1a8f2d6abf7c44fcdaa6dcb1f6e791164004b20b3b4c860f409c1483c7044b6fa445f7224606894e386ba08057a387b48920d4de203b1acc4dbe2b0b4cbdc3f7d7bbb097abbf81e01db09e120eab83def925a059cdb513efe6bc93f0579ebf75638df3c3d7f9eba3c36a169e9d88495c452888853640d93ee70f254f86e2d2d3fbb5e8883b36fbd2da105cf3a75cfe998068203186bb37f1d1ebead8ce1f9383b816f1da2fd0a9e01377b6ebfed4f05bec08b4ff9b90e385736fd13a3af7980c21b0dab58decea8e9545af5d0fb11bb51aeda2c8616960e8f6f84e6c2fc4f50d7e413afe030f75475509fbcf49cbe14445d267994fd3f38f41a1339f2895c0b2969a9bf9c59b85e629486c7bb5107c7a6b069793be7690f7a7c96c93b09a9d610594a156ab27a32d5557a5b1ec8920761cd2f559ad808dff3da64717ea5f10fba87b8ff2712ce322eb3c288939e0007f779a3920f45fdd533369f6f85a8cce21f91552fe03702ef81a926af0e402b418fbb25a6a3dad0ec18ec663126b3f48c341e2725abfeae865352d5ad275a9e3ca20393c64d118968023daac84bdc724a3c522d97a5878ed788cf8e44f80f8803d57584d8c8688cff24dd8c0e881b62d16ea30104d62007a4bec051da7fdc95d1df8556ebdf607383a0825ae503e24661ceb8ba773b793360c3f4ed3b761bd372570cb17e7c2030f07b0b45a7974e45ee6fcf5bd7ae9e9abde5421b42cff6af0c6eb7fc73f4deb67bb4e0b3dc9b4008da30c67071243cda649091a14b89bdacf2ae98dd230e932d9b277d6968c65e0006a8ff63f283f2cd9c21615dfd82e0b24af6ff559c97922a3d112ff0ef4af9d6583bec1f84d1aa8bbae705b9bcf458f5d93059b90fc2217ab27d0072a38aec3229d13266beb3015ac2389a06dec3120c6c04e540886091597919da293a4a8c0812d6cd336d5c5faeb64162ec0459e252d219bed78c4b6bb61c1213939bb3cca12a625ce5a45001d7408f6d40fa9466377caa43afe961b5c1602679220258fae72a8de2ac69c0dc97c90c270e306dbd8eb681ba9c092896b19a8d42665b94ff4d5b8b188f19f7c44abc8f88d4ad7b5df1cce3465de377072c70dd20dbd6779336f05ce328ad741d1e4606dce7065347df111c7d3282c8a3fa4a9458561c04d1056cd53ec5a8ddd6bd4434ac910c69cea0443fd09ee32d1256da44ab7896867a0c97fe4faa4a53b6db5cbfe3812a6667f04cd318f3da127a0dd46170cfbaadfcca863e0d4240ebec1cb2a5952881fe89804892d36dc5bd6484cc78db41bed868ed1b321a680a293bc29c420cffb5305d15fba05c76c2138b986f799b6a3d061658e498204c2b641f2f2ba73d633538eef6b5a01117951eedb7611742c120ff24261bea605e94d21e452ddb9ad27af08ed972b7d5e1eae010ec5d83e4505f6a2b7d9a0bb32a1fbba32a2a8c7823e736a69f516b781fb5354be4b0a67343c009a09b8f656c34ab895f9213531fdeee911d677d1cbc5e72c0fd1ad1f3b4b8bc735e14c3f75f1828ea28c90cda40e0cbdc40dec37031ff3d50305d5a8bba1d53d2f176895e53faa3067129a5c97505799967e55e4e9d87faf5920d71055009fd060ad06691b78583f63881b566d4a06b639c55796b23531ea79c6de24092c0e6fb4d3dc739f6d82ee3ee39f229de4c844aba36432d6119be0d2f02e5f72ef1d95fb2494522a7221e18e92cf22e00010ffd93b89fe60b6895a37fca91aa2fefa8debdae3147fe4f01a6adbfa0a59a5203516b2cc7de5faf821a2e72d43beafa30ac379791ad1e5da3286abecfc7a546b80191b7b892cdd01c25e95506471f5eb74568257439aea03300e80699909cc06db2fd607f3279651f7392f80bf4fc61d66f0dfed7b7db09744139d7374d3cdd18d153dede2a65f26130506acc51d5c721a7989485a145dac9565ef6d3cc938c5a51f31ccc88bb0739920ef8f0a01145f4ddccc74790a22a3099a4b57e31b3a01b4118c9e6c393c1304cc51ca1784db5633eb96ccdc88f8b732815b92c9072dbeb61a2cc1e6b2e7098d883e6174f5af7bd4f129389250926e041ba94d1ac543aab6525f151294060791fd26b668d09302c3482c78e5f3271c0150c437b4e78b1cff6f2b8660dc310965f2df14a1f2ad45cd2759433c4f3952402fefd79fff00dd309c3f09a58600223441c11693cdeeaf0a6100d38d612a759a8e01f753982803af30c7470f7bfd1ccf2c08aa0b187382d25868a9fdf729da10bb0aa0e1cd9c6e695eb2c80c6b6ce62737c3e655246edbce5b8f7ae21c473762db0969dc216a93d4db239f67dea74a1de21d50336793d1ae45e931d975bc706ea718a2ab10d66a59d9d23f76969d870ac279611246ed3aab0f79e11611b312624d78b88a9d1a49dc68d6968f7428c33f0a7a65675826422f7ac058101d2f85663de331345b3a25cf76b7c8fe0988a13278be9599b8e4708526b44a70bc31ac5c278ab739e3e6f0927b72507f34b0034e7fdf43364c466bb75b559e03d4d18c864714eb6061f83a6331b3f59dd62f39bfc2529d5cc68bb6ce63db1075105cbd7d7c4d4ab68c9e65a32092e34e76c3178382a965f49386bd4aae307128242a2ffe3022fd7dc1a824b330b9f032d55573c2f004a6905178a2479ba8a2d5b3140ed5f3e10d986265d8b4cf262295658f301b4d36281611d9c61624928da9abc51ff9a6eb481310511772fcb1c1786203d25295e4a319b9c6d65ccc966b4c5795e6e30b2b3ae8246c38b4a911d1904145de63dbd4470fac47f8ee3eeb3f58b5e665c26a316362382ccc6bf8db7699fa3334cb2ce61c746a7d3af24d8030df6759835f5890b7dd1de538cac1dfe843ad06eba2e887f08d9a49b39246fb26eff5cacc937d63c8d0136f7a8ed2af4cf473f3f0d9064f97fb4fe9938d631f7cea3c617c38771553eddd606ab80bf792f34b44111933796fe1fb8bb104223a4de9e16e17321ea7f8de3306e75a2bc79aa5e9c0ec8dde9b3dd1f2ae42a6a278410afa8fb62c16282f1e3dc1e2f8c28d4538a75b5da7645101253dd43aaa150b273f73e505d490490314606264c737bb344b616a80a4931825043a740ea4f75847e98cc99c6880d3085787903e54c63e90b60f03192234ab20cb41c70c6e82b00e0575a1bb0b0f435831c9ceb9dacd1fab8a7328eb3e28533d5bfbeace430e21758cac204631bf033752f947f78ac2bbd9423c2baf4dea22fcc65c96c332ece9abb20fed504643e82f3ba0fff213635910789a2fe1f2cedef68799fcf4a86d63ab0ccd395d6d4f393f7ee8905eb77df32d97592fb34ac86dcf20cbe5afbf9e9cff37bc34d75af046a09a1781cbf51ee2e0b0f40096d85413a30de974c4d1d16ec06c0fad00716c4e10f8dae46ef3cf27ccde74502b657d3dd26b5481d9787f5c6034083ff88807896da55fd2c951a28f15c8c9e6c86ab50c369e5ba4f6311de505c07c7b85573b5a539785820c672557cee4b58dcda948fb51c95674c23f1275b423ee5bf3a646df19bb5dfa22747857fb5c605669f334d116710bd9f1495e242bf47d6b607c1c9d9c706ee770808484ba552c978ef64daabb642a7caddf5a55facba474b8a63577ac817dc57e48ab072bc6a2cc5f5ae96edc45af41c896cecd8acfc36604db3b7fed9d2d17d429f94bd2542b194a3d3405f46c1021ecf6bb907fdfb4b53fe445d5adb18501aa772c9ba75619214384260306ab68a5ab59161b -AD = 85ddde4720659e80e25168585a354eb1e021c0b5d2ee289f2314dd5aae52bdf1fd44755bb56a6e659111a1d4b4da73315bde01c7d2c15a4f7114aefd68c141049fac27acfdca24e65c51fb1c27d307cd948e13af2963166bbc9411401d124f1ddf20f890db5611385257f52aa05c09b467e3ae886decf5744ec3749e5879f2a60017f601bbee11a66604d5f3d521d2c48cea1794f77366f29c7bd12a8aa51d34a4f3fb52809561b527016bc6badf9d136156c330e1d69d1aab98c7caa9cb46e782a898b4c66e4ee3e2445fbfacaadf9a8f73c4cbcb2a1ceb604ba5637b51337fcbe0fc366da98e805ceeb29feaf05420113b16e1005079c0e88af33f5970b3d7a8b51d0d9f5120a0795063db508171b75ed07705ac6d6bfe4ecc59243091d48865536515e036860affa880bfc91aae2fd1700de15994792aefc4a176e5d49d0f9135c7d670f3cb8798bfbe83fe73de7427e0f3e6a2df561cfa15ffe6ae80d5016096c8875b0beac8cee8fb530fb421b9a8ada4d551a528d0a0b521086f5a2db371a3bf12a2ef861f831fcb44cb2baede907a9306d3e5a3af796e0a50ba2c8dd61fb03727df5f0654d837dabee2fd90eecb7b2e8f303b0d57f97dc6a52d8281574d8457c89c6a9f5d80e0bd86c90ed39b1db4253affee614e8cf1ff05166c66e7d2a2aa2fe8a81c4741339683debe189c126e7f553a5f2dc16fc16672f74aebf94c7e3041c758fbc6d0c7f71c192cfd0fb2ec52d0a0705b05815d567f3d19f9b5d553a2adce9a79159b0e38980851bf64e97f896c028a6df8363cf1f13f4654265a7b0c0b24198efcf4418c32772bafd3980dbc689fab12e85b3ef4a491e2e5ffaa2fadaaf3deb392105a42380797d3b41ef61303a6016b269ec9a9f6e3f26070ff33cb467435ecb325dc7e18728a5c2e882e720c8f876fef10f5bffd5a925cdc9689d934272019e90e3a3bbf63a295f207faa5c014e1517c7d5c18c3ed70e92304d51944dcd3604c999d4aa8d8dbf2a4c69cbbc08635c968a20dcb80f438d43c57851c4cafec0b9568dd6c19932fd3f1294afd16f019f20e40ec87f6f5dffc7717470614b2de6e9000969e6b7e561cf91c06dd379a09c6c25c7841330dc78fc5be1d9b86581a81f55c0289531128638441fc98a1ad9472d74e2be2f874aff2fcf9c941502f59f716185a4c39289ca368c6dbf5257b5dc5e57a420792c26e602e4ecbc4f17c8787004eb88ea091d6b6ddc3c85dc110b5d1f46f6e1d872723176f4c73664ecb4219258fedce19ae22360354fa4894fe51d69434c2e58e1ec665b5cc33bb295053c591b474b6ae178c8834667bef971604279440170ebf3e739a4ff19704e5886767f81edce95a3dd93d1147995e7eb6c794b7be136658ed23cec7c374705ec0d8479dfb44cc7213076668e5fbe6a508537a9157815c6e5187b89f -CT = 66c03198b3422cf3fd8291080f6fb3ebd9ad863e41cdff169becde726946a342ffa0ee547a27bae28cc782d95a90b0a618f717e3beb577354bd91e00a7a57485588265ad2dd0ab946926fea7c754c42751ec7247ee84c17262c0ed092186ec57d6044f0ac9deb21da6714ec7452e441e687e138ff144ea95636286263685419afd35f002830765d810b6f60e8dee0e6879995e9272c798b067d5f99f49e460b86d67c641f48240b61a16dc7cc27b048e8b8e8e80016470ecd2fc4225e29bb127ab48dfe7e7d5a65542176dd7ad40c07ac8b92891d595bbd7afb63fb6f9e1c2aa2fc659aa101f9b6a5c346625acec86fccf17f0d45809f3b9ee81572e5627f1afeed4ba96c6d3ed7e9232358dec01a1231ae7b94ad4675239f3b456adccec439b3cdd45504c5475bbc77dfd242e5e9671d103ba71a4601a7322e0e295357f335fa8d5651d528dda66575d106308338993e615b1c5bd7e95bf3f755ff726b4ac6dd5a43ef061ac9783f8f2804c68f66486f5844969103a36278ee0d10798bf8a802d3fee3a31294bf00ee74f087749ab3325c027d42b55b197469a5312bdc5c9b316b20093154e66605941d58f4db8d46a815c06f209c1dce2363771b5a794dd8d17e93a2fa7b194c6a0b79793c06f002638e5e3052365221232cc4b30adf161cc6e7865cf02911e2ac9b0a75f000e7ef3aa4f3c7438433513da7246d421f208b179763651f18e22a793961e5976a74744696912f22915244fcfbefdc472baee0be1e591d6503f2d9511ee1eededd9f5547c95eb94de134d0c2186109935207a23b2b8420a5858d831ed78202be855cc6b98d6663c1c52e1a0022ed7ebe0eea6b107da4cf50c1c7fced9744a914a66d4604a081587ce4b7e0f96ed408b8a9a2964314b1334a123d5184889958e6467a6d16e7615e5364e09aab75994e2758345511113321a3436db79351c63a282095ec6b99b6d775a5c09ea3f3225716e39e14df260bdefb2ecfe9a65c73ab4b3712ec842e43ccdfb535e3685fa39b4912719e67bbe195e5f0fe6c3aaada2d81b669c4565921f6c183d708b50c3f7172ba841815e9351fe5fbfe2fb1fabeb7cec9bd1dcf2d6332372f1b972b5144aa7ed6c5a985132f9a54469097e2e981b9e75a7df48fa79d0736c6f8a201c7c7d0ac8ac6512a7089514bf58442dbae0529135a7f2455e0ee5716c6610bd7600b3159197bcb20ca055695a36597bf7d3b18ecd08031b4ce3a643951e231c7ad15481e32ed7a3edd2b379c8e96d3288d5b93b562972a04f1b7e0abcc5090cb8655422cf5e9dac0b49678138faec81c78f113255eaa6110e95406a7e7417a6e221a8ec7fb9d55643bd589ace2da70fcb41722e66e0efce932cd7a34218375b6dfa3df1747953b24a41f94e50b84bad4d130d5dab4194665338e06f102f46badc5dad7aa06edb01f8a31244dceebe5e2006d6ab4a31582ff46731b19071c08ad1db79ba018687f3e6afbe703b1de26c11bc8b62fd6b2fa3219fa7190379504820abc97ff6c034f7850e2c7fd335462725db6748fe45920c213c539356b691f22eb490faca24e99f0a044a9f727d0786566ad00635983692ef324bbf1f80c42b269e9d5a8df3249873c51521c81400c729ed7a5e73995928abe94d189cddf2774f1735bc2060bb2240e558699c365dee45fa68801e6a1745e03736ced1b89fc2755565e3b36c2102594d43c451122d94f4a263664bd26b2fb5bc7700319f6b08796864f92d0fdb41710910bbc13aa9cc7baac3b48a24e4f3573f315448c317c149ddb433d9ddd2a2f0cfc81c22d3dab31f184975355b41e4b36fd8f22e8efa01d61a5cbb0e4fcdd273cdf68ac73fee745faff44d44d93c5a111aefe4a5ca8e8e7c075ffdb738cc5b6466dff78ddd837c72c54941707b04d60bc126a3a2fae9540ec2e4672ae13de0d927a7bd363f8abb5a56364d6d564df90a46df9fd59e2c54d5bcb8280415257a6976d8fb24c33330af32600cd1559e0eb05d55b34be456d434bca98252fa531486ce2a24c8bdea1d57d93a550ec586920903a39ca61cbfbce79b8f3a5b1653794872b2c614458177e748f8dfd43840e5bb0d608c26389347673fd0b005f60f52c56731ee5faec6c8d0617fb53d5f2415c2e7906ea0e6d0066354b213b3e94f4dfc311e4ec6afa7e8d1c69a63cccf8326741456a5e0bd0a359b7a37c117f7892969ad7b70cba9bea0a975ada7cf67e0d7255be8d2c6e7b8788b9ff14c5d1449d6173e07b5f9d94560d46f474ab2a67056fe9f4a9fd617a617d23143adb4e7ea35f2d5cc1398fb9ed43ddcd10f28debb27eb13533110005e6c78ca4a874db68c65081ecb8bff1b64eb1e2d7b76a1da3b375dce8a92d32a6277ed847879345717b9649f27e846a701549311c7e69a96d61df616157a114bdf1663ad93a26c28e1a62ee4a7c72bccb9785639eaf1e569decf777bb0548ad9ee36788cfa1150eee3ca3c96f09052ba2300cfb7526b9424b6f7418c27a1e9bc13e4d9868e5c330c051c3885e44714bddf7cb090fbd0f36b826aacbe191dc8c35c219e19fe736198c29dc4fa1a98b5fb1805dc29ecd02f74d4510a3928448b5ee61b5991e46644850a4885bb1ee272883faf27962430de1922d0883e7e80215cf5fe7e8f3fd0e2a49bd50727af793cb7e5b40860e80a1fbb9d5b5696bdf2f741909ab5a713de47716332df6c4f78288edcd6ea130d895fdb2f29f94635bbf2061de55f1801bd6a24294aa199d78021a1ba771c651de4bc08f032fe6ad7a5caf6a6afc6de649b901f783a0ee0fea9b803beeb0f431400d0707f159d7dc29c0c334a918fa08a653137a4a8bc86066c8800e1d171f1dbddf1fab8a3eff6b5023da96f002e7e217e826fa378b15dc8a376db30228f5d6b629f331a162d63e53e5b5bd7ff9ec098b4314285908281930ff0a8aa86a6d89411e6b5bc6b9c9e931623ccca6741fd6d36311e6a8e323a37ad40b7a2797b84694e736d9c135e52d149c760e727598726378cd674b0f4df1c361de0a12a2b8232e611d789bfbea699e8e77b99f3449609caff3d6ef7233df8cfc624376c905eea46c6f77c0b01d288868a19db77e227dbb5bfea5cc3f49d219c7477f7f2b3447b0b8efe08eab8f69579d727555e547c13ec7ae13b83386f2adf634140c311b6e2759cfb9c8aca1c32bb7c002d0f46ecc526916589a29e328ded9679c2163838f071b5b85b35e5e7d99c3c45d25bb9d37d7bafb8350ad4695a6e0cb7ea7d93868c30bb54e301e21147696b7dda156226a5ef8c62121e6b2cad0c4e192116192012468eaad46bea69a140aa3cb9056dec87c911636a1e55695b9e5a27c63cd8c03f31570d4b7507d13731ea31f082b33c6db8dd6e22282f9790be41350a96abfc4dc3de78e0a698930f540dbda3fee923a463a4c4a66bf00bb2cdd6d22b62a47af96b78b1f0f0a174e4ec5b785b3820f47d3c8cc1691d4751ce4e4ab78a4551956158a36717dc35488e890d0631241906db565603205e054815aaaaf17945c3372dfc7193369871e2e88fb84c15a2b9071101e1208177fc18397e6af17b5843e1fa75392d8d3ed214975d50f2b19c24e83f010f8c394ec1edbb1cb912e61627d2760b0e630b986bba2ae113b8f3b51ba00ddc495520274a85e6f6fa7573ac4ec6e2a86a1da9199ceb007aa6f132e5ab8ab8fdca7c829f452ff17524fec475b8f485b29fc6f0d972eea4ce98e242b5d58f6ddc1b3a71256de1c584c9914a3cf1e469f0033165d934fae68a7559011dac7a4e0c72e3b398fab8f8cc2fb67963b0f9220f410e5ba13026a27288a1d49edfaa51e8f220503fb5ec476147cbea975994fffde3ddc51bb189c470078978d238f5287fb2629d23989875d74b006a4122f6a342c996d4a244e8c5e4b804a44c301ac4d6054181a07964b279e0a44c158364395a2ead40053d2f3350ea0529a57552ed835513f533ee0c4b94ef674f31851616a4fa2d0302d13cd4aabf5f96ce28219c0b5bc0e5410fe0fa387ba1009a6f2280f9e7bbe20c33be5eb411a5f6327714b3443b4152cbc54c4012473237dd98b0490fc4228ded74afc81be2a58a22e03ca987faef5310e474f4f5a183f6b7ebede5a8df8a0f94a87a41852826b29466fd761f40b416ad0f263dd34e5497867766a361af1654c3fcd6ee7e6bb3f72d64cc980f04305b63bd574f116d1aa35b4bd642cab0cde6a29139aaa163805c6c40384313d4ec6027c891023083988c1b0d2edbdd9b1afe102fbda285a6f897efff72a0d7fc19a3cb6756cfaa2371e13be3cd167cddb90d525cba7da69608b9995cef92a6424a14df6b860ef0f09830fd7189497a432347680de0f463c0aff82df8098cc4f7753f7680c8c7374d01046b05c63be73f3a1623be778fdb0bdb90d4fb4b458af2890d15f108b0927304c91c8d62cb148c35cc93797db3ef9bba1014d89859a91da0c0a971f330600d71565d30e9c9ea8c07e7f629e1a6d578da04d37e597261cae8ab7d9a952bbf71573f1bf70e064f36c032cc624e3c980e5ea46d36232d61a57fa598347b7fb6b28401e34628b051d6ca3dea190d1d3c343fcc83175f70f77a8fc5e8791b9788989df1e37cc4881648f4fc673772003079adae55c83cf02a894b98561e4a6e4416bea3df18d6f702ad5c4f40faedec6b53cfdb5b3a52d7d43b97ee23ccfa2d30c7264ec555b15f1d9e7e19cd9890a7e8e01ff21d3b8b451e50932f189a420d18e7c7e2f103332c78c84600e5e8fdedd84f055a8b39be9a52782d47c6205c0de41644b09c0931f2da269a7e58e669f3b61ebda28ab8e3f9b83ff3d2bce37864af494860b2f01b000abeb737fbeaf8f9fa6378366606dcd0fc33031b94f9a7a0e562c08ea720a671ff92520047f69b138b4e032c3828874ec4c29e49aab302089956566372b20c0216b601c3958ed9691bbd89f1df45c6613d469e3b9758a70c860fddf768b10a6bf70237a454a2c0b70dd5d02da612a91fc5731513012a4a6fbc16d01550bdfdccaeca22bba104ccf6aeb19f21d4cdd3da231af8ec5bf2a726ee9cc7c85b8ed46d2f6fa4f1b010b2561fb69690d5a9df76d729450a6e139962bdaa2bec0254c5a252b97e7ce7eab1817f454c6121130952b8c40628065dc9b77b0f953552f5aa3ff983b6a51a51dd87c2b51a18e14adb8c80e002d0b47c61cb357babbbe3ed51d371941a8f111837ecf0e45020cb941de170c4a1b5e61bb928b1b11a8d902febd2ba016771f171b8a7ae825fcc4642d95649d53675d0027822e4ff79ffd302bfab1a0ff26f3648c7ab00c10f8d95f21e40ca2b40691bd4be79bb9ccc0bf760a05be4728bbc0a64e585207d1d09393a80d5f574442d6a933966777ab05f699c4e84aabbf753059287e7261d972745906a4fd8967bfc80ae9b6ec2ee1b22a81775f4f24999987365ae2dfb6739902ed51b9a4394fdf29f216c34567102d9db301661b09b728a79e377cf4bdfcf5c83b110a2e267abf6d40947e643ae2ff0c244af168c9f33e7685474ac30611ef95f218e0dd280899a92a41e7a759d03ce3709c2a140ebd35e199f1dbb96f7351cbe1f3de8da8c49758a49b9e724ebd3220ed6f51112944f70c0d1e9178f68a2c9476a913de00abbd1f5bcffa646f926da77a9e9fbdf81cdeaf7f9b13e843afefbca81c93614f8f1675325965b5836b8a77620a5ff162e25366718d8da7781e1a7e01fe2e9e56cf958c6273473abf5c2c8c7fb209307544e1c0726d5571e521621b18b6da3064b473423536b1b76ed75b21b4ee205d7ab5f081bada63062706bd155672dccf84614210d72660095437c6bc2213d9c904a4ba1bfda14d350fa3dce7141e817a50859b1a74aa64560b2ebc67add9f945b6e85577589817078c8ae54a9fc311593d2cbdb6692b089ee6264cebcc7719753f80e30dbe48b64fcfd1037fb9ddab69a5ff9e5898bd8aa947d9ad827c26df67c6786edcacb3478a20bded1ad8c48018ae0d439bb5afad5d39bb8fbaf22d72ffd759c4fa2e94a5a89f41358ebdc4c3aea5110f1965a049fdadff9cf703eabe9628e2680fa4e70320d304ecaed13f513f27220db1916ca1500f1c2e091671fb71329dec0bd6e310c83e67af61b8ab60ee1a8d559a508d174648b1bca451ef0ab0ee2ef74f4fcfaad1cc5ea6cadb8f1bffcb1f2c05122011ebbf6abc16838e452fc47653821589da4cb5bbac10deeea3ba0e0a6241338e64cc78d7a923d018e8b5b51c4442070e5b0e6f1e8c2b83791e930899c5897a602c401c1b85827962ff56d19c06f5af033059bc7fb1bd29b65f66aa5b4397834e846935e523b16438a42c1f990ebe4f83182163ca5fc60a4c6d77fc182e81fcda943a962e9e7f00f6399728b48bbe38d8178fae3582c8d9998e49df5f28e32d541636df3cdc8ac00df45db12da2e5e76f366c1ea8667ba5f3542d21f58ead7c55d06a4b35251b8f77dd34d3de262947379107a06d2f4891ffa0ad3a3e5bb2bbbb978af4953310d4cbe5525ab344ebb98ed24d003600de8f3af36ff3d0a7efeada963845d573685bec2221403b994f97b1e714fd7dccc300b62c2a516e9c6780983062eddde0178e93fcbb2ed4f06f60767356a11d22ca37078fda1ddb3cb907d1020f62ba85d09044574ba28aa3df36988eb8a41e4305e5b0687abe43a90e4f68f0374b6b05049aff5b065d7688cbbfb0e96ab03df38903bfa1c269f43a114085eb4596aec87ced88701b42f0b7426389727308bf10aee9d8f15ebdc411ce1e764a290a12faa2d7c1126dc7b5076f219b826ac8d380b69af7f95d69fc3929a97f5c7da1db6270e9ee1f2a5f7fa3a1b6bfcca00463655121f681d3a627d03efdf0b5fd045fb153bc4488a9a8b7264373c710ebfdb1c267fdca37723b21d5c3eaef48e784bd76e27c133cbc24d114f610c79f2a1f2c30d87ddba395887030b65097ca5566eb0361e70615b46d4b86c2759f1cc2efa3915b4cebdf51a745fb3c6cec69a1fda2ec5e884dce228e30af362815d2d8b59a14f89606bc77439042109369a9648db7d71024ed6df06c8ebd22e8623f48feea77f48b5e88827fafa84b0564151a5997b7f29c4d3d18068e34f2690a293d54003d0ea8f3bab9387ca72212cedb5f4602ad047dbffae2ab3a4cd2865bf896cd96f78b90e4017eb7e3c7092320c0a37f81dd65a5c4817a4e7053e6d2bcb23b11e09f681587f3a9361e974ad54b88c72c296629b1ab754d25be15e87c414cff975fafb3d7cb68167b21f1889685a48966705222b525fa47143b00041df94817c275d93c2550fdd82471cb3cc1b5644338060b767e807bca902c180b3e535c77be2651b3962287b6d1f6403033de4e0aa3a20615ab59d290f4b167325959c1524ef216dda2ffce86b50cb6b56b62a20a043d9d78c704479c22340151df5a1907670f8d4f8c90d93f7b5d94d04a4d383914867aa3c0e5ac85fc299a4d2801a3f80f4b0f046fb62c1c8c539a83b21c7549df0afe200537b52c80ebdbad8a438e430cf876cbbfee9ceb1bc5270577c27d53b40ac153cab377a565b1a9fbdee8bf8e94839c0fc04f7f664383bc90d56ccd1cc01b465c250b158b5e6f321c20db245602d10aab80c553d52f17282b095b5e2234c6c689a84b096112100359816cef7e92029fdfc048058f847cd2f2369ceec9fd171a0487bd7acfed6b0319832df6d59affbfd460ce8d12e4171da0f094e872a2888fe74925c5ef0621c4edad337f7006086748913b24d4d48ce36e662fefbe672b6d476456b1fbac6d80030ab93da93acb4a7e10f955547e7e20a0abcdbf909f05a2ee2e0b7485fa16be652b9d9fbfbf01f082488a81022bdb69af9e6fbe753e9eb92a1762afbb4df49f83ffc0cf03db563aa96fc5ba1af6d4d7eede6067749e8ecec79b63e09742e29e99e1c960dfb0688b0222c49ed919379ac66e3fa1c72645122d1664721e78fefdd1224c0b886f6e214e37d268ca9acab76ab3adc9f5549e5dcdbb3d31ac34ac472894d004eed71f88ca2377fcfa48d3ae43805dc612891dadd06c263ed8617194f890bcbb964f010d277ddce1f6682e661577ecd51a4d5421f00935a5b24fef0ea1809fa5c4fe9cf8c453046f61136ec8872915d2462157d73a205d56d77bb83cf16b88cadf6430c0e5397fae1f91a6a11b177bf04b065a2e55df81d5c086ec8dc8a0a660eed37d41fe4d8b3e3f22238e2a63b6e4feee1fe9a140ed37b2be4193f75c2d038aac7f6b7dad2a3b37e5b9b660615ec1db77a9b7ab416f43e66c872b71cb67c9245c757dc87723ab3b9544fdd8a16c9486e8ec3c4a44cefd98535d6e5683426c1cc8c888b8e0c2e7528bd7eb89b80d9e00969efd2f0a0fb09845426edf0d1d9a0809648e7e46ea0a8c9988bf9df475be12a72c7326c1f2bf01afafb190cf6f649133c7dc14ecf9b8c971135bd303c8894bac637e08257d45e1b68edf550d896c41682c002396e8f1eb7c1e2f4e0ed9b8b7010fc7847e6fb1c5907c17b2d2b7cd24c96f47406bd04cfcb2099d82dc2902d6f91e2f8f3a05bc62019af536309e7847fc06c10dbf7272a1509079fd16bb16a85ae2e078f97f9ce66bba66d6329c7ee70f9688f6d91aa38b25c7f4884658a72ad8cbf96d7d7a9652673273ee1b3d4d17780dfe9ca865416e318bdcbe9efd8e071fcb15ceb0743df5af4f7d598b31e38677e65af61c1109fdbb11fb11e3952e6c3ae8abc3f894ccdf205ae55dafce1dd05dca6b899877f57d712223dde4e7fdec7e0ed4f0a29ad359e318eb36ddb42fb205adca400f5b2615947c4f0ede95788093a1152d88acbbbb272750823151e245354e658452a95f21fef05bbfd98a10c1c975ad1a08c59fa3efa9fc73588407a83d0b26a53f1b4115f83780bc70ee2619d7374ca45b9e200055df1b93977e17aca89a009110a6e74caec7f86114f91975bc6e8bcdc7267ed2920cf12cd7137840628e1b8a0ea181dfef18dc5f74e752f842ea91bdce4b420ee709bca72c4514e92bcff55902e5529d77fd95f5837c8f4fffce80c813630550a0dde24092a25f65eba90790a06f4d4c3e739aaa8194a147fb32e81c71d3e8def79251c33637661b0a621a2a6b302dea00d34a9dbe9b621c1dabd0464e85241aa6712d90b4287cb23c17bf1e4d0e6dbed372e6b49c4a843305b3b0e5cab0b0964a93ad0bbc99ee711afa7f2d0a296a375fdb3176c65a957ddd9b88e9d57df736acdeb02a71b924cc2e972f51ba68a597215678573bede9ca5b3a0a2461b2d3b9ea57a5af8c91d40779bf917ded32f14a66d96e28e1415fea1e9306654c6b84d8a64243a5271c1f11590423c718961aecf5f659b49f67efa78e02ef2524d0966ebcc446d73d49ab7ec31f0c009069d14ccd63f926169291b83a3e37610054b0b964741e2ed8771d20bfa225eac0280b4d5af0c09d3218bd497a035536f5af0816884d606f1a872b8161a266466b56e0be8b80a7bde65ac706eea8cacf1749e5e71ff9fa3e69ce878427a0728d44e666eff977026abfe18cf3ad156a943b917e72ad65725a9a8d60b7b5740494fa63143a7f2a94fe6d8b319be55d6fe1a988244deb798f345f30dcafdb6af9e9cee9e35733274bdf3896750897371563ed2516c4ca6c3c3c994b48cc94b67e8129d234a0e19dabe39e500214c0ed5f0e5d61b2f58d7355d147102d93b2689bc5185dd4c0a18efd11a307b887d4d0fa84fd992731b3a80dbd027dd36cd6933766c537e8e9e27d35d5187e8276b0f59fbe7b6d629d3416b782e7981d85e1e890853c3aa94a93c1667a55044ae42badefab979fe7d525c6a180307c5ee3a9c3933038028c3e1d15d1e78fbf53b6ea61ac5e02db0161719398a31570c55f73cb47ddec8f99e3e14af5adb8d5cd179f4204d080331e75bd391b19d38eb81f148c36af3e8a3ebe76209bb75c9741a89b5d0708bb0fbb0945fc6fcd6ce142d19faf0947c338dbc8d976963281866b5216421c00cbd77c0907d1e16f5e925319cf6c62f8c6e8eff0c2f831c504e7a1c0df09a54e2af708ceef39ed7d0f63d83429e9b0920c03cf85c2244f2fbac3958847113bed577dbde8992cd91be5833c75faedd5e2005d4f7b66fab8fa9305927406f863d1795dfe04028940b765bd79de6972dc7094fe1c2503a73d7b50208835216c23aab3e47094587549fdd74bb50ae21cd1354daab632fd0907e63f4c2b2d39d7fdc4fc216bfa742b4608238623cb7fa01bd851c1e7ad5ef5215173a71f363fbb7dae8092486f4a1549e32ae53b14c1343ff7fb5e2b1487d9c594a1b56e22625d275e41535534d225b7b2c9deeb0d30dba7188cf75d680d4545ed05044a0661c690a37fa14a73ba8c68357e2c948e290b5d9a4b51822824614ef2938d19ea4b650041f59f3b548f0a305b86f55e69760f37f09dfdad62651aa5fd84eef28a4431136b34a49c9bf1f2891364f86b0aae70b0414e821e3db1533b0f1db5fd232308bf118f858aab5ae974c10583f61b283a3870eb82aaa8ea3c4e2ee3c3a3d7169aa8e975ddee7f620f6c5bcf3eaaef0101b62cd54495cb8809052c9e3151690cff7c1efcc4f63b22472111a7c5d9d7d2a2be951510f60dec8c426f14700c8630f8a14dfd359addf5d9b7ae031a745ecb4e17321b385799c90f924c4780287ac187530a40b064064b9036cc46e3f87c4d23aeeed1bc22a5411c7c503594d5d1261eb9fc4da242493beee9f671485a978a32e965faf9b0e2c13f78e31e1630b72d35b4be691e90b3798e18223c1b514b39a8e1eeb7897c22fdee1e33fc76e2b2f9298ad4fd89f44163aaab23d754d98c7890e58708b81b3832aee31aeca85e76416133710aeba0e5d9f17695e607d09ae3f94be191553bc39c6df03cefb4ee05516fc02d66c9866e4eb0d89a662e309379a347159db2e070abceee226f2b8b62847ef7c51d69c5f12eb567fa13af4b4f90b3f3d9d4b6a3f68bc4dd77075081e2e99833c18b154d0d6ac360141de2a25af61d551f10a34e03e1419a37409b4c177c51a8d248157b411868eb607c34d2daaa453a0954fade5eac45d5f21f50efba8bbc9c87ff0435c70f064b42cb2d158384fe0a4d9c90030ace7723af0a6c8faecd8f97f9850e2a489a94ebcc655301e2e14711de9eb08726638a9ddb57160c5545c152a26860a17dd18172bfac138a300f60431fc49eff18c93f71400e887f878f4dd637cf5df8c1e2b12c0f87e31ba2754ac1748479eda0c4184b528554106128320dcce349939e5e6cd3434f86dc7adfee28c008a21ddf9d0dbc87ceb14cc3afbef1e06fb3f9908a4b14f5e6c43b23ba783b75a6cbfa2ebac6533661b8c1143a34e8e2a9723389c4b7087dc07701c53b169894551084aedbb423bcce2f470881fdc7240c26b3b76fd6cfeebf8eb2828b4741e5e8698b19fa0a44703cb4e4c8ed6a7e4d6063f5fab724e08a159f4f04a2f351dcfb6335ae6697dbeca25c76b55e6ec9045eaaa8706902df492b8c8cfbf68c4cc1be5d1e5a173262e38bde051656ea85ffe35d97f1b25f6a47381bc327a946f7cbf6210adfd957b2921 -TAG = 469e3ef168a64945f76d7a2013f27b68 diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/tests/aead_aes_256_gcm_tests.txt temporalio-1.3.0/vendor/ring-0.16.20/tests/aead_aes_256_gcm_tests.txt --- temporalio-1.3.0/vendor/ring-0.16.20/tests/aead_aes_256_gcm_tests.txt 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/tests/aead_aes_256_gcm_tests.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,484 +0,0 @@ -# The AES-256-GCM test cases from cipher_test.txt have been merged into this -# file. - -# The test cases marked "FAILS = WRONG_NONCE_LENGTH" would succeed if nonces -# with lengths other than 96 bits were supported; i.e. those test cases -# describe valid outputs for the given inputs, and they are only rejected -# because nonces that aren't exactly 96 bits are rejected as a matter of -# policy. - - -KEY = e5ac4a32c67e425ac4b143c83c6f161312a97d88d634afdf9f4da5bd35223f01 -NONCE = 5bf11a0951f0bfc7ea5c9e58 -IN = "" -AD = "" -CT = "" -TAG = d7cba289d6d19a5af45dc13857016bac - -KEY = 73ad7bbbbc640c845a150f67d058b279849370cd2c1f3c67c4dd6c869213e13a -NONCE = a330a184fc245812f4820caa -IN = f0535fe211 -AD = e91428be04 -CT = e9b8a896da -TAG = 9115ed79f26a030c14947b3e454db9e7 - -KEY = 80e2e561886eb2a953cf923aaac1653ed2db0111ee62e09cb20d9e2652bd3476 -NONCE = 5daf201589654da8884c3c68 -IN = 96669d2d3542a4d49c7c -AD = e51e5bce7cbceb660399 -CT = 4521953e7d39497e4563 -TAG = 2083e3c0d84d663066bbe2961b08dcf7 - -KEY = 881cca012ef9d6f1241b88e4364084d8c95470c6022e59b62732a1afcc02e657 -NONCE = 172ec639be736062bba5c32f -IN = 8ed8ef4c09360ef70bb22c716554ef -AD = 98c115f2c3bbe22e3a0c562e8e67ff -CT = 06a761987a7eb0e57a31979043747d -TAG = cf07239b9d40a759e0f4f8ef088f016a - -KEY = a6efd2e2b0056d0f955e008ca88ca59fb21a8f5fc0e9aa6d730fbfc5a28b5f90 -NONCE = f6775dca7cd8674c16fdb4ee -IN = 5dc495d949f4b2c8a709092b120ac8078cdfd104 -AD = 86a597f5e2c398fff963fcfe126eae1bc13f097f -CT = 04416e23586ee364b1cf3fb75405f8ef28fddbde -TAG = e7b9d5ecb2cf30162a28c8f645f62f87 - -KEY = 8d6ed9a6d410989e3bd37874edb5a89f9ab355fa395967dcbbfa216ec9ce3f45 -NONCE = 55debbb289b9439eb47834ab -IN = 52939c7416220822a77435a46687f134cebc70a2f1a4c33d37 -AD = 7790af913d84a04c1b72d4484ea2e09fdaa802d8b1733b8470 -CT = d7bddae8929ed6bbc9ac077e2415d9fbafae4a0432f8f7eb6b -TAG = e6383b16ed9c32521dcaeef3a7b9b67f - -KEY = 525429d45a66b9d860c83860111cc65324ab91ff77938bbc30a654220bb3e526 -NONCE = 31535d82b9b46f5ad75a1629 -IN = 677eca74660499acf2e2fd6c7800fd6da2d0273a31906a691205b5765b85 -AD = 513bc218acee89848e73ab108401bfc4f9c2aa70310a4e543644c37dd2f3 -CT = f1e6032ee3ce224b2e8f17f91055c81a480398e07fd9366ad69d84dca712 -TAG = e39da5658f1d2994a529646d692c55d8 - -KEY = 630b506aa4b15c555cf279dc4a7ee9add213219d2c68163ceaeda903fb892c30 -NONCE = 79eca200a5cdf92b28be5a7a -IN = b12e6f1f8160cd65278c48f68ad53c8c82fd17c2c39bbb109f077c17fdcb8a0b3a5dbf -AD = 46cb18593b3b26ba75e4cb20a252caef31d00be31093d2369e93572a393d650c68313f -CT = 9a9ad1f78b4d411afe450d2e46347a7df98f39daa4fd478b9ab6e6b417878bcd52743a -TAG = 55453a003b021c8a247379cdc4fa6da6 - -KEY = d10bb6641e9ba0a3f1b016317831ad4232f81c2137adac0940ecd7fa36de0563 -NONCE = 99c922d37c95ebeda8e81ae8 -IN = 8b9089df5bb048cebbe709cb61e178ec768515a0031288d95b7cc4dfffeb51b836e126a237ec50cc -AD = f1cbf6c83493b2087d9f88e02121a114f45ed51817e46ffc0b66a783350eae89c6700db3f3be5f4a -CT = 8a838c51a8ef8134481e9951033295ae686624aa4df72f869d140980347a5e69a6d7cb3d7119b303 -TAG = 9152bef766579a3e9a1e36abd7ebb64c - -KEY = ca665229adcc7554f1b1c8f50e7444c6d4059c525f9c0da1406ffb35d50cae97 -NONCE = 8e2df19123ce0ad41df416d4 -IN = 12365eaac86b270e9c61b3ae7702a6f3583ef4accb80a98454c56e34e2ab97d8afa23ddee34e7e3a522497f985 -AD = bf539d8e9e3a02f3e5834970e7efd40cc7cb340a075041428d6a69ed9fa5105e4bc63720be9a7040ce5b4af6e1 -CT = 96027efdcd4433df8e7f6181c05be365cdce550b09d45cfc96fe258eab6d55976a9306a0070c9589ef08cf7a42 -TAG = ec9fb5e79cdf8ad4c8a79c900975159d - -KEY = 5033338bf7526cca0425f4a620424662ebc58364c8d985d130e525fd1f598f3f -NONCE = b40842b30758aa3eef7cda62 -IN = 69a62b8c5f9b81cebee3a9345f4e49ea089b0d9c1cc57b4ef707956d0287de83fcca6d8f5270a9393e00693075028189bda7 -AD = 3efe0ed6fbafa61070388abc59c0d06589309736b02418df5534c8c594d61a2afefbee17af8283d01634b6ca3e8e2aeadff8 -CT = d6184677a21978b6443d99d7de1fd01c6b6334cf01b7e7d58456267453f4de96708b62301172c8c87e970f91c5301e0ff61e -TAG = f8ac7aef208712845d137b8b176c89f1 - -KEY = f33c39140999a2cb69e43129cb5df18fffeb3513ec3560792e9909784daee43b -NONCE = 70608463f1dfabb1fc4451e9 -IN = e2802c4d290468177fdb031a717345753cd7c3028ed07dea428db84e7c50c3eb7b24f7381a167b4ee31bf88dcaf5251fdb90ecbb74ac2f -AD = 10a6f463dc59d4791b3c2b4c93cbe2dec579a154962cb2c4cc77664e8c2b106c574fe115fd43dad94b8b1bf2f74820e28435b4444b2b82 -CT = a27419a46037323c033d7cf2a716777fedc02a5ddd8bfbdbca82ffbdea3037bc1cc80df7c5e502b32276ae88ad6fd0f0cfe72604648812 -TAG = b1ae330d47fd399aaaa687e141e23fc7 - -KEY = 2121056225a7b2316a93c4bfeb970486fa9c586c14ba8b40be5844a31e9449c0 -NONCE = b4b7d1e8fa7d0e2334c92315 -IN = 2038e2c6cdf5282f081292448f8febbb60a1520fa3771cbfef387f48c5915a1438ab709628e8d4c81623ddbc2f6f159c3c9a8922905c4994269898b8 -AD = b07f66508a39c4932b04c16172d6462d78273cd9463e52284bb73e3b8b8e7047bdf10c5ace1f903e5a5eacbf67c9351f82c74bda140df2fe0480c80a -CT = 7b54618ae09b37ee72e51873c82cdd20b6dca37c334af89548f52f34df3a757e632cc0d453fc97270898eb50ce2f2a98c4cbd4cbb22a5b7c7564406b -TAG = de3a9e2aab2439675c4f7f0b61216d5a - -KEY = efb15235bc91771aa32d51472877b0eb364de2f88766908eebc6e6b57a702099 -NONCE = 1a510b42dc20d1d0fb34fb52 -IN = 4eff604dd4bba67f143dab0728b8597e269d4e0ecb4ce80c9850afc645d96da239d9db360605bb4268d74e1fe3431a44242ae862fa2340c076db13315f615b85f0 -AD = e8dad34f727e77444a96cf06425640f1fc80fe3b01dafd1d91476140afe8204286d01b0ebdadc0270a3d218516ff5f08a69a7ba251ac325983caccbe0d9e1de359 -CT = 989fef0145e2fe93b9f99fd90123632d83d9df8f37d8e1f80dac329dbe0c214c2191009e31232538fec63a29665f0fc1c77dc86b2f5f2050b86b3ae48e85d63116 -TAG = 6816304faeb45da4e4772f5c35730f8a - -KEY = 998c22912d5687fc3faac262a902783fcb0c738520b5c4135a8dd2cdbd7b0dfb -NONCE = eeb535c5bd6edfd696655b60 -IN = 1f6ae10d425923c882b7d2f556571acfc10333ec665b07bfad9f8948a3b8c5e5f163a4e99d4726da1a35359c657c848f327b7fd9b5f61987440ab12b9399db24715715a2d1c8 -AD = 9a3c76dbaeb69a6481a89318caeb6358267ef51a1a364a48387bf77526837c9c70afb6f105cd47d2b976dbda7d2b6bfea7b76b135810c53437472f7b80ffc8ce4dc95c7e5045 -CT = 87f4e2c80a4f15f92a8e94f468e70fe7f0e0f83c0a7799a1d465043d25210ac6f0f39a5e9765b4daca637864d1bcc090d2ef33ddfccded2d2dad61dab443b3cfcc683147c490 -TAG = 0744d928a5b5ec95f3087cc2623f0031 - -KEY = e12effa8da2c90a5d35d257c07d1b467991bd5f75fecd7129aea4e26b9e27ff1 -NONCE = 4edd0b4cc349d37eb77f5576 -IN = 21dc87984edca46a629ed95ffb04471397da8806c525a781d9a71818422e344e4af577f38e7cdbc556d4766770a9a3c95bea59ad497fe0127816ec4dcecb6b999486719b0b86cdb2c9d09e -AD = bc158e6570fb0a08d73367dba65b80a8c8e57ba6c7b99493ebdaef0424e18d8ab1f7c88670cf51c4d91b77eb9ce0f89a46ed1316141e4299ec6c3d6e712ec9e92d3db44640402aa4ac00ba -CT = 07ab8c623d683ff83030392e2864edd4b8e3d296d60579a226a8d2aff6bc5af3c4598a18cc1e8d7db4ac8eb56a082af864ac52a324851dd29af51a0945cee4bf303ea111b9b627aabf5ff8 -TAG = 53e69b7be969c39560c016c6bc1aa4e1 - -KEY = 3d9723c9235939df8647529b7e4a57b8536476d5b71b424e2c27ba4d0b82b0e8 -NONCE = 60163d2eb7822af7fad64c04 -IN = b44face0f45e4a8da19aa0c5cbe3aa960ed6b74fe3d3d9201f52523dfe7651756b2ce482e759c87bde4ec670a0e808fb4883e437c7cbcf2f6470352174327824200cb0897edc4def1736f51e229addaa -AD = a4b2b7bf36a70a5246feee52c474058100bc618fb0e3d32e8c1f76153edec47fab3045dcc7eed9ca1886bb2593703c9ffb8883c45386d2f4e3fbb0b7c722d19f2eca94767174d9127450549e8993ae33 -CT = 66fa63ded066ac67bf218af7bc21169a875f4bd695f44fbdff906f0a9b8a067be721fd260571c53a8b51661c8d49fe178dcb28c31deb3fa71b096b387f9fc8f3657d280404c05d2b6443eba7e60b562e -TAG = 59d5450872510c4bfb590d9497524331 - -KEY = 75b0a20935c4a5e2126ac7420d632bfda8d41bc947c2402bed4759b6e617ff92 -NONCE = 0c3edf0dcd1125d7e263b897 -IN = 8edc98e70030e40bea1548f6f56b4561272be0c333f3b7ae53ff3e27c35a91b1aa42d39e6305ec4811e75931e5cae2261d88a6f7d6c5b05bfb48802264e9cac782411f1de579e29d464ba56840b126a3fad07f01c4 -AD = 7e35081ef652424da6304852243ce43ff711da17f7881d5e0433b1ad7535e755a8531b93d67ce99ffe66e59fbb24f6b42655524b39f2c84daa5cdacb5e7916266c05711a118b2128930b95de83ff1a67e53337474a -CT = 858dc74dbec6fdbe4ef15a3596ff7201c8f4fcca765bf5452f678b1493a66ed9852a6fa174a73099acf951a35699f33289ec50625538c01eaa456dc658013a29e4d133b856eb969c1f221f99e11fadc98b0ee08243 -TAG = 3d8f17838c4fc69f04d7e2b76eebbc0b - -KEY = 7a3823191abcebadb7970d1b65c2a8dab8a908151737bd5400b3b6c0d59e3b08 -NONCE = e32eb00e5106097e2ef0e8ba -IN = 220db5400dce604adee4cb698cdc02d2ca61622bbdeebe347b0bfef55cc45319b940f93773a9878725c5f55485d7a26363251b9ce0d3da1f8f6e34ad5329dc9f752ec7dc12b2d259ac89a8059085996a431a56cc2dc2400a26b4 -AD = a83b6dc78931cb7500eddcf77792e810c1edbd5f4e33f85018807a8539a3cace094fb794fa9ea058e82c830d42d5a6b3e22b7785698774aec5c73edd92731c51106a23c569c0c0fef18d13da1562a9a42aa435b243c4fbc9fe42 -CT = 5ce6ec0e1d67ced5a6aa46c909b9b8907b372be03331dd0940ceb6d87e928c14a1a1e8ef9096c9b63ab4cd93242ec7be7e38b80643f9c52e7e90ffa06b8f2d238fa63dcd97af74ae37802d124623b8a272e68ca18b3432b7c017 -TAG = e21c61d604253bc5b5d58283756b9eb3 - -KEY = 53ff6dc0af3e89fc2de7370caa433f539d068609fcfed6400a5b9fda4c83e3aa -NONCE = 91a824c5e023283959858062 -IN = fc23e07b4018460279f8392e86423ecfe465b25b60382f58995ef5fa1f9ca235e4bf87112554aa0e72836831d7b5f39125df11518b8aeb1809d804419beb05ae013482213012e4ce980ddd1c58e11608b775d12b450ecace83e678c69d2c5d -AD = b3a1db2d467780480f166859e0e7aab212738b85e88237c2782496c9c503347de02f3dad6bfc671fda71a04ff1e4661767c11303daa0c36d944346d39e3e29ec63d695cdcd83b2b57181582c5ac692b13e4299ab5e86c59d09c2dc6194ebe9 -CT = 88af588ec33bdac2cc748a01ee3eec97e5bbfdf69de1d66176f42b66383bbffa8b185cdedc25b11a62237d334d68120fccfd68c2f9447b3b8e1f623f33f7f97ad8815d29bf11bc0c65641ba8fca4a087783f4694fb1d574450191825f84402 -TAG = 2c4973323e635a885f78ee106eddf19e - -KEY = ca2b4d335598f26d3d3607e62b9ef853d3543e741350f92f3050894721d3d450 -NONCE = 2431b5cee8c3ecec4caad278 -IN = 75e29e46350d1fa99403b1e5baa414e41a8e714910f313f8e850cf3076508ff650011af766b51283fbd5626166d775fd4b4cb7124d26d77b41eb17bf642bf67a34c1caf0fa9b43eec12103f864e56c5ccdc81b89c1a35e394362688d05dd94eda3d05dd2 -AD = 31c3ce532bc1bae65b5ced69449129b112019cc6078268b853dd17c41832ecae07f9c6b068ef6cba2b55f352904afd6096ff8432081aed408d9340c319fd8e2029c389b6e3a4bdc38853444c3f7be9385ff1ca27e59c43b542e99799bb4ce56b8e26d6c1 -CT = 90c13ec26d01b7b96bdd6816d3ee57df57efeabdb15ba602229ff71d71793fe8081eb1b462e8b2967bc4af96fd6dc72cee3d2b6495c7f04c9068b2ad0b073e11cd5999df541ad705c6315eefa8da49c5dbc258f7ba922908489c1ce672971c3bfb6e8482 -TAG = 3a7741a094be92b838850c32e4b06c6d - -KEY = 49fbbdb5ae21cd955be7f7603cb8563ea0b02b77a9ea14016baa5cffc55d20c9 -NONCE = c0a4463350506d2af9e35d8f -IN = f31003aaf5d8fd6261c01c5bb1e7bf6af248e0be3cf8aac67ccaeb0b7468a40d98be526a8e4f692dd23763563e601915ebcb59ecbf03bf9c665c4c5313c318939a911888fd427d5297b9b2fd91dd33eb7ed38e2f0f6ab74ec263989cdd9915811a022d4a46ed35eef0 -AD = 17e01af2386531ce67d5bc3325d8f83b53a87b38f1c305f99c0798380a7e59d3ecddf33a5ad23a82e33f0fa34eb2438b17e958451439774ab642fafd3794f80a0ee1b9bc165f32df705a6175310670ba54af3a204e446db35170ab02670086c47a475c22d1f14cbe44 -CT = bd661836d1b74244baca62d7d1cb6717e17e2fb0bcbc8d36b3265a983d557c562b0be60708499d0e7e9626825bc049db79a0ef4d2393fef6024d849089455e55693fd4da3d910eac11496492a645e4376855732765e1b3580461a2a2533cebb482736ac928cba175bb -TAG = 4596e3802109c899f27f6cfcbdceac5d - -KEY = 30d0e4f6425e38c92ac34dcaa06a815166f301289ca9cb0ed08156617d87bdf4 -NONCE = 525618ac9e317405c7d44367 -IN = 06f2204ca864dd3f7c9d0290f6fe3d0337eb9442cd5d2b586d1d5c30e58951fc2f4e99831ac7bca4356db4609a0428c482f2580b9e8cf5fd00d86d474fd88ac3b2413f44c1ff66e59e7538c090b2444396f02004ff636aca05ec40439f4e3f470a24916fa4033cb60127223addc1 -AD = 23c1a3e1083904f7226be7242027abb7af9d62f1115340cd4a57611be88303955cbcbeba44eab5488c80aed3e063c70cb7bbdd9ac289c8c8977868c3702be63d0358836838a97b31f6aee148f2b8615ad7c5dc0de7c48db7752e5f1ae8637f8c70335bbecf1313ae1b972ffb9442 -CT = afe3e71953bad46ad28113b7c8f2092fdebaeb81626bf94bd7e9dd59e000e8ba31c1ce7f728fe19dbbb42322e54aab278e3c29beb59b2d085e65cb8e54ea45d6a9fb1f561bac0bb74afe18cc8de51abf962c2fbc974c7ed54ccf2c063ff148b3e6cccdaa65cc89ab19fcd9cd0436 -TAG = e9f5edea1fdfc31cd5da693b50b72094 - -KEY = 661309741227606892db13ab553070b456c5e421cca59087144873ae6d59e590 -NONCE = 9f07692c017e1391a981e70e -IN = 40b5f8081b5dd173203e02e90a6c171fc41f804b2903ea18109edcf77c03dba687b47ca389c55389bd7b0ac59bfaefaf43b5f97065df6a5375c1fbb95d95cad589c2a45cd9e1e7960b1d13622440f7180aa565863b4f9dfe26ed336ff4318653e1a520bdb830e01db78a7e598f251834d0c9bb -AD = e8540d084f24b80414af554f470048b29a5af8adb2f9d55c9759e5ff1595ca74884af67027324587131d90c77ca72b2d15b66564549ce93df7f667d0218a6e874848563a33886c6a0c5a9d00fa435dfabaa9053243b4c8c25779a4dbf79eb4b8530a7c7bf4263ea824713a90cee92dec78c449 -CT = d543f49e6cbe26f1d8a6e058769d5b16e6f8255a28b4d73ba2cbdf664bbc5ded73f9dea12a11b86b6a6acd578f685afabc232dbe9ff8431a5318ec7f0202959a310595b147353a7ca89c9d1fc2d2b92ea610cf6d9ad2716df2dfed70f5b74d498edab114058c22c96873a2a64abc254c82af46 -TAG = 31a8441886d0e4c6bfcd6d74f6a5ee5e - -KEY = a248b0d683973d205ef2d3f86468cf5a343d6ad7c5aaac0b9b6b2a412eed3552 -NONCE = 8f62ffac4027f4dfeacf3df2 -IN = c2d7d29256832def577392acb9fe4f249eb4859025ea55cc0c4a67806caba3e1cb81bc7f5717d94e1c91ff06607b23c238daafcb0fa96905616f02205b702508970fe3bfca87270ed1102a9ab96df57ebdcfd86ef6e9c4c4242b4febd82b0220b0d6f76d8c2d0fba33ca49279907f6bcf7e8401d1419ed58 -AD = c738cdbde6dc277ab81dae20fbbb4a50d71bcf0ac1ee0ec6a39747ccd87be40b1f0f2c37f2c6b32ea99722979fcfddd0ddc2e4ff34a2e6113b591cbfda317c6f4b021ad30325276f8d8dd78f757618b53297fec091f029f9b00850b35f3863a3801c882422b318b4a1bdd89002f928371ea05c6fabcb1792 -CT = 7a837df292ad2e58f21b89da43a74de411e1746556fe47db55a136757513bd249384bf67887a5c1f605e7f7e3057596e17039701ea351e5ccaf0fd4882559e87197144632977cf07cf9e86784a959fa7399476a4fd196d7c507fe3876d759e2b37bd37edb3c12b89716f29ddc8b64974263a1ec1b6364b0e -TAG = 291098a2376a0faa5da6fb2606b4f2a4 - -KEY = 80634a8baea1c4fe5dedb664c9b5d714422dd1726d642e60d15e02364195206e -NONCE = 725ee5023ae08fece15d621a -IN = 4d1d8855b4d155e77bd1bf34b3d049ef09b2b94f4e604306406b015a2d520e8772b084ed668b868e32c7563085f2a82e7d99219da549e507aff9515e45a045c7cd5292c0e09a3a38c769acfd0a11826b27d8bf05184971670200e79c49754debbfc57d9ebc661b25f22f241c4d143bd922f7b0981a48c6a63462cb5cfd -AD = 12b3fa94a64454dc5b47433df1ce0a7dd5e8066d05b2433c6cbcb83087bb7d22d153a19c05aeb76141431c5f9801cb13531691655939c0c812611c6a30083ed3ec27e63e6868f186be559c48367a00b18085ffb8c7727638e833a7b907ff8465e3a01d654b52432767b18b855c05a9cfb5d4aabae19164f0dc2ca6346c -CT = 6b01e934916823f391cd0d2829c224a12eeddc79f18351d2484ef6cb5d492ec9ec4d8c4bd3354f01d538bbd81327f6360a7d157feee64b539489bfdd1be4d7f724d2a6dfa1af91e4108dbfffd529afa71388b07e5079236644da289ae236100b2fbeda0c17bf2a01e76cd1f88081682c2d074223fb8a41d59e70a37870 -TAG = 55762e95d897a33c4c75106449112986 - -KEY = 4f2edc967b11983f05ef5ee2a4364039ac02dbcccef3f3719913ae2719c8217c -NONCE = 255f8209b0c67a6277bdb42e -IN = f8217163bcaf77c1383089e396b271e22c517e8ccda244256cc39315fab7d0c291078d90e9b6e336992f015282caa1ec0ea858a179c9735b7a2f0d50f6f1eecaf3b9308772279ebb95f8aa53826e9dd60fb354de0c50c10001c98812b59d7c0f36daa1aecda6782ca36130fbb559363fe07704b0b91ea85be319ada027e47840c764 -AD = 1dc7065f1585384b88be47598ca484782716c78f49b3b6bf5d24a5b0d24fbd7831f18d77d80951d2c4fafb6f939d46362a69b558afadb3bb4d8aa27f7fcf3dd9624e1e075fce9bb239926d51ea9dff03619d64d5828103a414e360adcda8fd864fca55c21df86c76972c3765ab1d68ce89f708e7e5a3e06cd4de08573cf750c6f5f9 -CT = 6719849b7cea3f7f2a8e4de13d7a864d581b7c638f49fb06378a768d2034548179963c33f0ad099254c2edda9ef771daf5d299f58850033e2e449d7bc21ca3f7d3b7408429b596da615c8582886a6d8c1a9ba81fec4a41a38b7cbf1a80ee0ec8bd71451e727051fbf2a1d1e3c6ca98ee113e47650ba4fe80451e79b04abc8bb99a2a -TAG = 2ac7f962553a8007de3369c7795bc876 - -KEY = 51c5cf1f0c76ec96f4a5f9aa50a36185521f3ba259145ac6cb4da3cd12467696 -NONCE = c751e5e7e3d75874acfd2bfa -IN = fcda42cd098b7936f4bebaa37d5850cb0fdd6526966b1b5734f23d5050ee44466627576e1144957929123198e40b64eaef74476870afecd7b70f7583208603a1b5247074c6c77e10b9bbd41a3d468ff41db89895b0e9ca95be77526ddb30d4c5eb0796ba97d7d5c56d0eece344dde3ebd7de586226c00da224b04e74d9abe832686797df067c52 -AD = 343ae5e73fd1da48dce92ba7b86d21de0a203ba8587536fbaf4646bc45051a7feb343e38916f6c4c75b65f940045e830857c7b62b34a44622a36b34268b8a397892ed3e4de5df3fa7384d4ca50202b5b0833f921349c877931f4b735cec45db6b95410c8042ba49c1a39870276e0165f09c73b14bdf7f36d19084f958695c7ad2cc56f0487eae9 -CT = 04192659d6a2f1b7be472372c8f969a7de388c97d37b4a89653593e48b630947d2160b569379698e94de49b21572ef0b4dd330487a8be814a84e959a1a8e3cf33dcc9f7464fd44814d0cd7ab85e4c01c9d015f42ce3723c8ef8c311222b0c78eb83d81696c217992be725faf27701b4922c6e6099442787ddde2b7572500a5320a4d0c787b786e -TAG = 23c7a866574976dca8f401c4b5b58292 - -KEY = 1cec3efc0311d623f34b6853b3dc97e470fa728cdfd65993d9d48fdc192b28e9 -NONCE = 320fe742ef171b7b8cb615cc -IN = 722e503a97166a07974dcbf136fbaec6c03668fa52495b040383433ca59f6311103f2fc6a95ba4c925f8637167537321eff6949aa3051269fc094393a7b17d1ac8d29af052760835665b0ee89adda5dae7738656af9e8513c96e8a532a46ef34cd7430832d2be51c586a14e9aaec2458c1911bbc0f90b496737e838a12ff37d3db058bda9360d7d33e11629a -AD = fd5ccf6b6948c3eb96543aa40f107fafe94e5206c326dd8900ea510c6b61d1bcf746151a75404e31406c8e991fbf6e660db7c18e243fd2608aa22dd7ca9de88f277037661ce6dea4ff0a86809dbfe1708cd47d3061a34657cad143e6577549c9944e081f79c276300bb406378b26f349a91fa87de02a1405d712c516ae11b4bcf30ac9d56e677d03eb33e3be -CT = 363c1d6b806a6d97e2fddf53b242378e1d2b818828863fbb3f856f7737d63998a84e02d6c91e1df5f5eb6cf89f7ef53e16d10ad52f82362292d3acafaa02c23be7da7616a8b8daf8ee3ae74ee1078742c4ddc3e5a110e510417b9f43fbcbb00e17af3301b2fbcb784fb0a05b66469e771fbd78114fce3c4352c42928bf5a0ecc49228a3c930b0790bde7ad7b -TAG = 669482999be99149f9b723b60fec62d3 - -KEY = d3465cdecaecbf25943b7bbf8084ccabc15474a4228c46cbe652a99be24a861b -NONCE = 04fc836de3a1420b8e7136ca -IN = 81e0e984ce0a4074a44524f93e375eabc650a847a42393f5c524c65523368d38a7e2b677fe08502dd3bc42311775016b5689c660cc0ca8cb33a09b89f3ed3d02fa0fb75ca5bf0dc3c27c546b369ab5e7731f93bc074d37ee50d6f8366f6c8a45f73ac92b05c4aa552ecc5266041dc122a0df69a36ad625a26edb57bfff43a84e527ea0d9d3cf076f8de9eda28eb09de3ff -AD = e4adc14ac4bbf3ae7ec7d97f5c0e6090bf8127a75e8b70e9b86496a62a759dba5a4eef64a8c679c362785501260d29b58e1af647782564947950428dbf14edab8e6841c7afaf9e7949b560419c44bae30315c597f6f6e02204da7ec605a4d9a8753de1268bb0b1c84c972b4e7296da5c969781feeb35a44d2aef799ed228aa399ea04e21cf9f7d5600a2c07b047aa78388 -CT = d7995e7b610eede708526c05c584039d48b9b4356fc71b0c37ec2559309a688a7c69ac9655f94e178cd2311db58587863b0fbb990554dc9a6aa849571f945c61e5611ae7e1a96903be725a1aa75adc381b86e43fbc68a36f44e0e0cb8fe5c494caa91f758597b6ef3b80a879154cd8a7e5f570893b4f768105b24b58efb67c5f07c6db60e0f48eba9563f17d38aaf0847e -TAG = cc3fe61642c2d7fcbd579048fdfb19ec - -KEY = 1a0dfe2a6bc6a69659c68942ad0858e1df905890f47dab728ab9c73f742f469f -NONCE = f8f76b014116ba61392597de -IN = d93eead436e835a061ca061e3a53c3f9c66c6f011b21682b8a6fed098bde2018a2462aa5ab542c69bfa2805612cf6146c9150888b9720db1dcd0f359c1fa3416df4cd225dd0b0d949e917adfb3e83bf5ba2b967d48908e6b6d8aabc545335014d951a67390d7b5c7cd7dcbcf66e4e3f02aa4e5e9cccaf73e75622bad006c63433d36cb1c6aa4aa253dd1b2eacac75c548aa6648ecf9d -AD = 56ca2d5340629ca75de4e98921da352941559bd79f47ef0ab42d1d5857059352f96ee877f5458f090ca237e4eef5b08a53311c8dfd4c4582f18a93aaa8cf75080734cb2ea3389c9c74d2b04ead614eb54512ea93f0e3434e9a9366454b303a8129d6ce6cf96b1d6dd4f751311c736b517dcb50a6f6e0962c46637b4f5aaf0f34bff518cbd551a7aad3fa615708b17cf6d8fbc864f580 -CT = 8dc4d8483dc665b174ba32d6b6244da5f2a8fcc4b1865d662ec23057838b332a07ff073ecc893d413696f3fffc6dca5d107a5673f14abe8e0457a02e61138380d25e269686cbbd23cb7da3060f482f62bf80a40dcc2e711ecf5f7836ca14e456c4b73a48bef90749024393f5f8af01b73302e81bc37c4110dc26174702231d831cd14231905d2dd3f375cf2bef0425084d5b19f1039f -TAG = 825e7b7e195f65c454ce9fdd637138c1 - -KEY = 03cec87d0a947822493b5b67b918b5c6a6bbdebe45d016ec5cb6779c3ddfb35d -NONCE = eb7d261a6b56a179c88e88ad -IN = 2326102c58524326759ad399222c5b5a563cd01a29809d6aed4d49772a4723cfdf30c9f85f031063e838f543c201412d6f085a8f5435b0b2fe94659aaf70cf7bde99309239ed5b815b48342d4f81011f5aefe10ba105ac15601c64a91076c29c3cdafaa12bdd5706dd7305b48e923873cf06944b5027b210c59d79856f602bd6481980ea909152216756d77362c59d57673cedb91ee6f56a40061e -AD = 4d0fbeb69c1869d2d23198ec49b3dc23149005a84aace7025293c3afb8cb2e38c167a822e25c2fdf667d3677f4e94ed6574529c987de506d26b7ffccf3b7a36d9adac48bca76084710338eeb5bfca9df1bf6b403e33e90761a0b3152afac333071a5ef4f54010b945d03b51f123865673e8877f41ca23359e60518f076cc64232b306bd858634417e92e546ede4ac6231635c9cfcf43aab1f8fc1e -CT = 06746f993843901ce72f2fcd4af7d15e64b3102d2f9bec0fe72cdd0b97e43177a1a2238c9c1dfc3311f701196653249e767a73dbe819b660cee07a5f3bb8f25823875fb4b4d34a5a3a212d2e166311bbe11fb1d36f4e725c3b74054ed7fffb7082203ccb5e9d65873cb8a1ce28d5c6e2b6555c1a864a725e6c7d5555d37dcaf1d0884264be72d38cc4b65bc2f0d039d542c5055da56c57e084b804 -TAG = d36a4b6d2f592d4f0d347d906fc319cc - -KEY = 7f4b4bfa26719d9610c80ba3f474c43127f4aa3414fb070fc2f389e5219886e1 -NONCE = b144d4df961d4f1c25342d12 -IN = 638982b95d66ddb689b7b92e3adb683ac0ac19480148bac9db550be034cd18dbd10f2459c915e99c385cd8dc4dc6ec48b75f97e818030fc2d8fcdf66d66b80df64f0ca4af91bba83a74f3946b17af405bbbc6e216435641f5633ad3ee24c1a2ed1b39f649acce59ee56c282a3aebaee6e97f96b34cfc63d5b0482fec20d755f399dd5f61688fe55878713cc55d562c2d72236eb674a340d1a64932cdd8534a06 -AD = f2fe3d27bfc278cdcf16fffc541846d428b31534ec5cf51c30c8b6d988dc36cd6c0d41a4485a3f4469e92ea0fc7e694065bd8130c2854c95549630bd9cbaab2205f27a6efdc2c918c3be53f2d12f8f7cc8e6a81dc8be7cccd217be1fa2e6887cea7d637d2e2a390f50d2c5be10a32a9b380a400cddbdd40eac67f1fe9ba6033d4bfa88c563eaf57272c8a7052916cf4460f31ad026a0ac2588a45d082fbb5c0e -CT = 0d4de3489e09c7239972b675063579e409acbb663bea76bee8fb3f7e8785158ebe1c26db9219a9b97ea29e74762999518613249c3a87fbcd0128f651e2db8e2167f10ab532eced3464b56bcaa09780e5ece18182a6e092477ad933bd8de015c80e67c6802257a97a647fe2b1e9ab6a76c1cbf7d905deeb824aba2a34095f84b276d55ff940d6ab788c16cd63d9b16e0908d718c851a3230b0a37257751df5a38 -TAG = 9f0a882d4456847f44c7287c8ff3ba04 - -KEY = 9799ae8045d58250e4d9c3b0ccc8897a04b5b9fb164e54019dc58d7d77b65459 -NONCE = 0f20d002dbcd06528a23d5e0 -IN = 8f323018b1b636617c935791e1c8023f887da67974080af07378b533a7573424f1de9193c5d38f55e9af870f6c60ab49c80d7d1ad1f18f1a34893fd2892d49c315ee668c431f5f35e3f60ecfd534b4b09b64cc77cd16b0e1b8882872cd109a5ca377518e5b660d75052e9a4228e3935705b6bf6b4f4249346b7bf4afb891641a76621cd315cd75de391c898959be945ccca7a96073f2569f217617b08502f7d569bd2f80e0 -AD = 3f1e297bd91a276a4a4b613add617b0488414a57ede2ac75d10934e03be58ec518a418e98a4dbb39d2365889db7c5f389b2a16d8c702cf21b888a4cbf77b356df48a30298c825fb86128de45d7fa0e5f4b0b7bf82a2c4cad2470f33c231802263901fbda54a6edbf2df638716492157ec1407e7fc2eb6c663d9a215afbec3612778b8115e78a5fd68cf6ce66c12c0ca26e5c1f7ab079bc09c3bc7b673d21835671a13dd2a0 -CT = 9a5758dad7997a766db05d698b43fd491bdcec21352032cc023bcf10e136523219745a56f0360efee75a37de55da23cc7d8184a50ccebb110bcb960dcf6b25fe731e21f26290281d9c1c7715c4e6ff3dc0026cce52929163ba222f123d4f50e1d3cf67725fb4737f4010ee2b5b163ca6251c50efe05c5ab0b1ff57b97ffa24c98653f5c82690d40c791047a3d5e553a0142fa2f4346cfcd1c849a9647885c0daaac9efe222 -TAG = 5b85501a476217f100be680b2f5882cb - -KEY = a26c0e3864a7dd3b589d17a74a7c9c1f7e8f9adb4aafa0e75c083d10956b6bf6 -NONCE = b54a2a43ca3f84aef3824375 -IN = 6fd4ec60613646490791d82de30ded1a12e61fd270f1642d2221272dbb150ef63ef2604213e203b740dfc9c4bcdf722b3c85aa20abb1197949de710d7e8311956c8649524afc72a9bf5eddf0b284c7fc6d48a741b82c215a0dcd73bb8afd08d5532a6f7f99b5c6beb2ad793d6da53a81e6523b2240729924ddac996a723421f57125f928990daa7a55a5b6b53d7361d9728f66590d969659aacd9aa5c0ec627d991b55e9fd0bf9c3210f -AD = d6d8b570eca29a48a4d408d5b27ec6aec291d70cfefcd02bbfe8d8ba8aeb6db770bfd723d2c3a4859f1992767d24e7b33e3e241874292af640e2bd22a5b77e0e9e1e0d5e485041cac41d4694ac929ae1fbc08e7591e1cef689028f5db26f95fc9e0868887fb9c635579fc6335757697f63b4f2b46664ae338eafdd827988c8f2ebad80ea9787871ed8d6b302d5dbf7e8019f2e139c59036cb5964a3701ec049b839e19e33e68b83539c8 -CT = 2420e09adb24098038b2750c946551a5f6a5bdf23b126947348ddb5e938b3fcb874b33fbac6407095e05ce62df999e7234cd2b4e413009c71d855b23993cd58c1e26ba0deed891dc88f099fdf852cec0aab45f488a90edd8feb6f4c837036945bd304edbf7a2737921a2f8c1b00a1daaf9e25b908a65a8f69963fc767bc975b5b7bcc215ce37009009dc90b5c7edb1a1174a10ad28f4c1d1a2241e7ffc215edef4f847ceedf7b64f2d15 -TAG = 20521b35310385ae66557740b435d204 - -KEY = 53ef3dc7a10e435650dd20550cf3ec2b997afc8d9e79cca8f7062622afac3496 -NONCE = 257a205ed0f84016183f4613 -IN = 081e2769935f945419aa06fb5fa7d8412efd1f9b52a45863808022850836c1974d53d2b2c5c0cd420711a71e6d1a09e984366b8b677e6c61bbce8f3adf9f5a9fb5860887617a08c923171d681c4fbc6d569690f6a183d42b52a80ef0693862efd22bf83b7b4014a7008424c356b5022df1842309b3a4a2caee0fd3f4d3fc52a17d53959daccf8e0ca889578ee2905dd8c17d52e76712dc104344148e8184c82af8165ea8386f91de585b54fc8535c3 -AD = 5b73ae02bf4a70e57f5d48fbf45f85b8496ae8514c8aeb779c184f9cf823d8c1883c9e5a42b2c099d959c2298ace2d86c4479059256d6a4325e109fa4b6c4ce90f84a8228316e80aa86de9b5e111d88b2be447a29297b35ca90a8eb280d4c0fe92a1d593cb966cb0010bc06831efb0c72c1e222b031e900ef06ab8da542a5abe2870a0efbe92351d5915ab545b14900e41a27c5ca9d75d6277afafe7ae861131c2767eb314c0c3da5c264f8f2b4ac7 -CT = 20ecb6cda861b660656d692c626436227bd4ac17a9bc71f6c84a1917ef3b5a0f6ba370f00fa2e7f1bd5aa8d6c15032572090482c23e4ab7376ef1f4dfb77f79d5dc065792fe3476c9c37614e32f493e461981b519dd7d10234c2c69264ffe5be06a8e14c81022b652c8cfa24adcc7c7536a55a2fc41e9ffcd09e1c483541cba814eafd5e09e9e44477018a41b073e387c9257c07d97e40f0761fe295d015e1f2df5be65b13f34b6ef0fe1b109ad109 -TAG = c129ba4c10bc9e9c2b7d67f5f249d971 - -KEY = 15ddf0d794b1bf2e67db1af47b45b8abb0c62ff5fe09b29659f63ff943815c39 -NONCE = a6e6b4fd129bee3ab8144da1 -IN = 9c82ac83e3dd227d0cb9692703dbf41292fbaf4961e28b7407ef069e33850371ce2838b1808ec1f837511dae9899a867959183ef3d988ac20758d7a1a6859cedf687d8a42f3dd53fa4b5843e5be61422fb8774c9eb0fd22cbda5950155caa0ceaa00417f1e89a863fcc08cbf911776fbea8d7c14a6d819c070c9abe76a7f0d04598188d07fcbb822758081172e654c025703bb24c523cee2dfdc31c8d2c84534a60e7efa9f52f7e74e19c859889f9bd024f28763 -AD = 892bc04375e9ad5ad2b5c117d1aacc202a74ee4cd4125019f38ed4d716ce361b8b50463ec3255a00670f5f95d361e79349e90bfccbf084586cb5fa145b9eece8a10187c13055ba0d17c0fa526ba7985f00f3eb4a2cd53b6da488827fa8481cf47f6be58771d1e40125652732a7dd5adc49cf99ed6b085fa9fe8721c86f7241b6efb6002e65ae5f72e16ce6a09ce81365485b20f1fc2e092216024b1acd0bb4c2b4ffe28d62a9a813fcc389774688eedd76c0b041 -CT = e30465518e7dab44b9ca4ab6c86fd7b701e334b050a7889fefd08aa12c9e381acc7875ad5f8574fa44f8550bfc820b6d9a5600cfb82d1f98721a875610a91c8f47960ea64445c0e22fd3ebe94b3564e98b9b00a68e9bd941eef5382a67782c5e24ac44b928fc986c62a02fc702b145843b1c6882188dcbbb6f6b51ce1aa7784da03cbdc3efb1a01c1cfd7e90dc3332fc6e912a6a967ef1f239cfdc9752e235dfe75dab8088f8cc207a4a28994f122859aeb52d01 -TAG = 62e7455cd6b95319efa3ae0d14b88452 - -KEY = dc0cff51030582f29676482ec8dbf0490a135a4cf3e444edfb7d1ec733cdf7b9 -NONCE = 58c892d618ceb6027afbabb9 -IN = d6c4d49a9431d51bfda5bd4b07997690748fdc3df196d27d219a62480dfcb6300c5a234d675aec1239280446cc134bd4e0e0b5ebf6f10bb11b788caf949c0c3553497b62e729f08700b66c6720c35f1f434f16b15a4e404d627fd054ae1394a77d5ba728f3422aad5d99a608c2aa52b058946a76a408c5dfb210d280629ac999e86ab1f9da8f2b7b79ec07cb666105582564974180ace98c63bdb962e4580692abe58929d29f066d2f7e25c23a3824483d9e49cb6f5fc4a1b0 -AD = ee3bc8d875a4d43c278cfeefed8ced8a3da946adaef93dc356001da151010548990fe08b62edda46634db320601c7f4b50956e29868bda9ae5df186f15c3ab4a19d7cec274209cecc71602e45c37c273b7e4b2a168de5c29278042a3dd1fbea0998d7d9707d412f476ac8de7936e2e5c268a2f22646f682e664e526f88004e7c461bd42337dd21b1cb39ff678974adb67c2ea1b7055ca98697ec16c4b3bfa95b4dcbd7fb015480135634c34acb20f58549f7e7e11e20a991a1 -CT = 54eedf8ca21f31d21067af5a05dc3cb99c3dc046540d2cd1664abb32fc7714ac057d039cebdeb124e1ca9511bc71f92ddfd4c6bd3edc8a1934f2fa2511503944f2a0818e30b9bdd26bd3c51b9673f55ad3f2ee5e41de114ccc55abcdce06a5bcf63a5bd61fe71dbbfc97e1c7f3417fcb9c1462e244ad91725081c9176a0b91d3485400d273a16eecd870ec1e9e016a7f4af2fab39a0bc93576ffd1eeef9cc15b7e47feaef85b21de422666ec722cbaef26edd1941e7dc03f72 -TAG = 1cc8c395b2ccae3a685183667ee7bd34 - -KEY = 90da49f8f64e8a585697a43644a48bcbef33a8ed23c1a93c65e59a217c04a1e0 -NONCE = 0812f87792508dee6868d454 -IN = 26dac57d9f30bae5831f98ed074cbc9af9731a52b2322cdd23f1f0abbf78092c48d6d24a43c7d49edb3fa66086030f37dd9dc67847714437b11577d2bec645b3210baa8f7a540cbfc20deec5973b7489b7607eafe72e249df5d0fed95e29f03cf7f0c7a22fb2f06a0bc75214446b06d25a45ab8087270eec56af3960f53b80412a4ea7b45e54a2c374e8a3789e8eb57e656e22107503920313ee3e4025836b9e1a98541446c23bd5674cb83483642f2f3e8270bd1f77c85bcfb205a9133c -AD = f2168cef97c27a902d93cbca07b03f35c5c3ed934192d29a743c3a6c480c5a62172c088fc89cb2d8651b8979e5bd1864272ff179be8003c6dee18789c17583dc1de4e8b4fec80e5c7575838e621cac4b5b51ce5952f22e06b1c196101d2ac8d05e797323e5baacc49d1e74db97142e1bed723d46ab858d59fd36d5d08eaa63f696b610eebdc9662e504992fd3481de1264bcac8ac426b09fbc641ebc93f72c5d460088fe0b08420d88fae219b6a5a67420a5f9d1201bf8d64b2ab3e9050a -CT = 82196d89624689bb172e4ff71619046a91149c8ea99ebbaa3f2c32c77938b5ac466481575dd82a008c7f5867bc46ee44faf95fa40b6237c8c3b62474af2efcf07c771e23a63e65b48b0bd8ed26fc64dffe03e71fac6d3857b1248df63d888567d7d3618c68d6b8f1c88029bd7af8677d3b51f70ccccb4eec9e100768515637ad8a4b2e2e317902e456974ce9fe23095cc68566e85cd913e8b64119444f124640d16ef3e98136f32d618eef78f7ffbafb64227b3185bda8f541c0e7ee8405 -TAG = 71fffdbd6358f755dd22f1dbe42c4aca - -KEY = 0b1b256665284390a9193b7b7aa4e3ad15a3d2a58e79d75da8ec284c02fa3a2f -NONCE = 346ae65660de8920605fe8d1 -IN = acfa83f56f137ac39d6447d98c5f7d5e812d1d8e7c7fa7f7beea9a87c59961449683fcf5332c9ef1587135030309a1c2d95257114b790b18cc32f65f4c7d1652c0106e3331f826e9b8b0dffc50aa6723d0827076b71c668370ddc8156db3831559a72e48266b3886a6d88318e6ca646ff561ed4f71e665abb7a60089f0a115c7b7fad9cbba6c4cb0c242b9e1f17705825d98f4bc10bacd8ab2e11cf579f29b2a0b085d8c96a372434785856b483c3fc9ae909029b0c931098d7e59f233cb6450fe0b0d -AD = 64347fc132379d39cf142ca81d7e49c010f54f354ca3365d5195a7e43175c9a47603062c5ca61aaf2b381f5cd538bbf48f50d620ff2b5980c086049a378aca69570ab7c406b510a6aa6b7e8682ade6a091b1f822a97ce671fcf7c911c43c4795b78ce1c86e990e32bc5c9fa34a8a4b22a20d6f7c46722d1bafd49443b4da9634db4615f7cabc3d5bd9a8921e67de45dac261f54bcd0af2b2f845e255a16f2d2f1ffe26e88238f5dbdbe111393aab3409e08dee8b9bc85c51b385c191ee9290454236ab -CT = 9d7421330f0c2a525495bc360cd5c2273531d050d461336a254c9af8611d07c3559931cd6804fbdc6e6c9c997283cf40bc23596efd1bf116fffcc6620e45d1c738569af012a7ed0d575ace3c12662f88f3ee480af30ee015ae70db112bf4a185e220660a912f9ad840346e7cc0715e853dcd9b415ca9e865d5e4de2321e6a1b7cd8a35c760abd3f099d395576a91503147bdd51cb4bd1452c4043b42dd526de6f61bcbe819cfa3c122c6f62e0d4c38b443f5a138325a5f0ff8a9a2071c2773ce62edda -TAG = 2af508d74bcf8157ae9c55b28b5d2db9 - -KEY = c055bfc7828d9fe8fa8d9851d33f3e4888e0f7e286e1eed455e14832369f26fa -NONCE = 2804e5ec079eada8bb3946e4 -IN = a26a9b189ada0ccafab92a79711360c7c396374c6170de395bd8ed80dc5db96ef1534adc4dcd419fdf1801add1444a195367213e374eb1ab093f1f54cd82eaba5c1cde6b867e0d8fff99cdab4d96e69aee0c58a64120ce0cfd923f15cdf65076a12e06e53ab37463096d9ccb11ec654e401c24309fda7afa45ee26e5e4b8adc8febbddaff1e7cecacad1d825a6b16a115287b4b3c9f8a29b30fa6236ca6e883abda412177af38b93e0e64b012d33d7bf52ed18c4219bdf07f36151b7ea4c53091ddfe58b6c9beeca -AD = a184e4811d5565849a08d0b312f009143ac954d426ca8d563ad47550688c82dbddc1edbdea672f3a94a3c145676de66085ded7bcf356c5b7e798f5ab3bb3a11bd63c485fbcded50c3b31f914d020840cbc936c24e0b3245fead8c2f0f3e10b165d5f9c3f6be8f8d9e99b97efda5c6722051d5b81a343a7d107e30d9319c94dbc7c31c23b06a4ae948f276d0eabd050394c05781712b879317ac03eb7752462f048bcd0dccb5440f6740ad0a3a4c742c3da32a49dfda82ed1b66380a8cfd09dda73178ffa49236d20 -CT = 58dca29b5008f74bf132947df768dc85e2492a381429f151a3bad3132e63a4a977aa09f10879d206f43f27a26909495d0a2c8cb252fbcb3abd953f6e0ef0f6d5e89d89a1d9ecdb0e44686fbf5567a6fe7557a084a8a5ef5316890917bc432164266a331118c828fad4f5d1776645d163dc5444c2e12def608efb47adeb8f9928a5ffd3c46f963a749c310688e78525e34a510f529472a14bc7a5b65594338f6f5ea1d95bb5bddc6e8e1d1a449d126442accd162e4e03c10824fd48b32df763de5d7700dafc54206b -TAG = 141c80e1d044e1e9cf1c217bd881589c - -KEY = a54a347a7a388c2e0661d4ae1b5743d1c2f9116c0a7aa2d6c778a21e2bf691a9 -NONCE = bd3456b0dd0e971451627522 -IN = 3d17e3d9b5020d51295f7bd72e524027e763b94e045755af4b3cc4f86bce632a1286f71734e051dbcac95780b9817b5f1b272c419e6bc00d90c27496ac5ab8a65d63c2ea16eeeebe4b06457e66beeed20fc8d23a9b844ba2cc3eb3d87e16e1230fdb6a9134bad3e42eadccd49baed5e03e055f389a488d939c276982e4bc77f0a1c738fcdee222e2641b06fe12ed63ede2ab2fee3c54d7901d0911c32980b7c663a67d35ece23136c77f8e4536464225ab427d937e7a4260460d55bb5fdd7ea2f105604c4b0cf129dec49b81b1 -AD = c12d1ffb08acf27d51e63f5c0e311180b687438e825204074d4456d70b7c5ba9903ad0b0778a5fe36c3e12e82718c00f5d1ce585e5c73b23d6c5e41ac4a180c97c9418b07ccccbfc58c678e97882ea36395c0a05572b4cd25ddb3c32fa580c89c48a0e3066b8032e3823893a5721a4fd1e59c7d012a01b9e9afc12f3bea93e9d1a2cf5cab26e064576b36bb65606de62fe2887ace0cf399dec08da618954ce55362c8a2bcf31457a1804bbfff68a76d752f9aea81be8868bbca8f1af3375f7137941a1924b8a2b178f06a9e33f -CT = 938f8f596e17eae6920410f602c805ad9715833087e1d543eb20b1b313771266dc6a8f86f2ba033609fadec92ac38c1f1f0f728e568fe8bcecbae2ade7b9c4128fb3133c8b4107ad5c29cacbd5937f66905e18cc52d9239c14e4c8edbb2db89b26f5f4a9ff0f2045192fd212af6c65e448834580deb8787b612d6345466483dbec00b03fee4751f543a6155f2dbb745c1094e9721aea3e544a894e4a19a14645725cb8fdc21d259e086b1e411fb1bdb11293d0224ada25da2896dfe0d35095230af6894404d27d901540b0ec35 -TAG = c55c870a5eac5c0c774dd10dbadd3fec - -KEY = b262f6a609c4ad6da3710d58530b634fd7bed875956d426bf4b2412209902233 -NONCE = 0b455031d28e4e17a45b7a60 -IN = 9cff6ec8832bd0e62d9063e43821db6a1e0f3ae7947ab4d029643b0e7db8224f8bd00a2c011b246a4d5eccf9801fb314aeadc0532fa71cffe188e801d7c045e81b9dfc5cf6ae1e310b363adec4e7ca52fa754ece2540545a5161eaf9ed5748070b6e232125fa8e0fb7548fd3eed57a6be72ce0a9112f166776816a0a4ccf8151b6b93780875d03ea3d59ac57e7904c83b90b7666de85f055b25f9e342af4cb04b0c3f123ea0906c04f252f2b16b28d612e37b2a7b788d66beb8b361385efb73a825ccfb1a5ca55d60afde0349e5dad8096c7 -AD = fb99bc661b51464c0df92ba4f64c4c56d601622287bb1bf8e0a082ed3793e74db6a2f5a546391ef55dc45fd2f24878834bdc2903054d9d02ac05bd5ff122b65555d7ab1664cc36b630039e4432315445f303837e57149fdf6bf8d6856ba97abc5a18b6cd2f8f28cd3ac079355b314561c50126812861c39180fd94f9aa24edbec37bead760093d32b96ce30e389f63b2b271fc051b42952b3f5cf3950def581f7cbb2b4aa5b151a16ed3773166761232c106d3ff57851895640ea12befd69daadecc4122b4a481e85088edb093e02d5d3d8a -CT = 5341e8c7e67303d5374e3f5693c28dd9f9a5c9368efaaf82d900b4a4ab44337f7d53364544bbd822020d79443e2ab0fd2381bc73750203caa3d28858a8f9a6dba57a7c5248361ebb152a81a89c00b1bf49de9e2d08c0243b38eefe316ef89164b4907515f340468291e0b51009c9d80cf5a998d9cd8fce41d0c7405fc2d1854aae873f0e24cfad253ee07d9f4cd27080ee8ec85d787459080a06d290e6e721d23738470835f173ed815f1a15f293ffe95ad973210486372e19a9cc737c73928572cbc03f64201d1b6fd23ebb7b49d12f2eef -TAG = 5e0ac1993ceccc89d44cfa37bb319d1c - -KEY = 9b4387e01c03d2e039a44ca2991aa8557dea6179d19259d819d70ab2d5179eb0 -NONCE = 852124b4e04d7d1d63743d74 -IN = 92c6f01cd2cd959495bd8aca704f948060bee01ca61c46005b4db43e2e7655af4c0d96656cd75d904325ecc325f5fc9a5fff3eeafde6f81323b0e3b64269028cb64c9fbe866b400e76487f1759d6ab8fc66589e23df0c008974e1613bb4ec556bd1a6a0751f6dbbbaeff219874c57dffca59a955e0aae62e8fd6a904a50fa7eaacccc6dfd4a2b8c6c040505d3448ed2217b7024224bbc4335c63b2ae8172d7d3088b819edbaa17991a4729bcd5a456cad20ba20dbee99ae56f8ef669dff93c99a995c8f5dcb5d113db4178a49516206a1cba7d872682b1 -AD = 92a1d2574182f850e37aa62338b19f403fe99dbc7ddbe1e6524ac67c4092cfe296b5ee9b94eddb5c228c902c18ec1ec26e1ef0263d05c5caf1c71ed9e5ff987e9964b46f27be05a83e20867f1f2107db26b6bc7066af2b0efdcad2b65f2ebe8b31fbe2f3c30171f2e4969f1650c9642ae47c8db5bda47e57e8a9af210a6fd4894dcc2934b4ecf823cc841cdb3c93ecc779b455b8cc796d7d60437da201c3f848dcd5f45e88973e06364e7cd01afd2d49fd3032550f1c1a60c4ba48137398f4d58e5fd0093c06042b103ce0064f2cd1cfdd39b7440121d7 -CT = 28b87d324854d5c9c6ebb303fb802b12d946ed681ed5b3384dce2cd782bfbd022f213f193bcac579176440bbf2af378b019d21dde5d70e42d257722d15417a9fecc8e56430551ea3bee798a01faf74d0fb09be6dd0c14cd03feaae29c7d17581e1fda0b4bce632ef790202e98c8c4f8f842fb3e33b3fa5e8700c8644ed6d64280652bc2a5d40b3ee0e47dd5a9f3535e15b1fabb30264515afd4f9b1caa5c224574636935baebf6d1992bf1a7a3d698d457db4248a2b38a803837ac4fab7998722d52de61bfab4f98e1933a77046bfb3941bb7988acebce -TAG = 1b07d58be48b81f7007e5683b399dc28 - -KEY = 9d36155d429b90b5ff22ded128c9f0cfe77ed514d410998091bfca4dce7e3c88 -NONCE = a7b73ba1b2b0e846c3f635aa -IN = 2510210b420b12300d51ee4a7ad233c9c97d71672c0f9a7b9041d32172fdf3a6ce274aca77a0db6961d7921d1681ede2c1088a7618382481296778e7f56d2c0074c7c545ccda313495ae2a6dfd042474b07d2b59c79a0cd8c3dc16132beff1687111a48ee3d291ac556987e73c5a3807923c2deb3b9a59a135a8fa0d85d5b39016edfe0649dc13be672a639db58839d3362eaeca046767fa1182ef8a63abc104e7cdc8610b1e956aac89af76b40844a358fe6f7343d217e1838aad19587ab4b1c765d2cd7bf7018e338c0207d4c9dabdb1625af0c75749e9a20a0d8d -AD = 39e96c8d824bee306189a3bc8a8d4862df55e8016726222a528d76de169746a363e82e82e359b774d061a6e98e3c35aca8ba802a5956a2c512501fed44ae341cfa65ec9d95485763d99cbd9aea078ce551f7f82272bf54dfb6420ae7653f275ef145b2c87720c9ccfa56bd286c61cb822d0473dc2cc3fa22d50fd16bc0358e7c615aa1791b990f30b1d737f798219f4446d173e80fa62380dfdfebdb36b1284a62c2b6638f28fc370034812d09b57d27e5b7d589075bbab42fcd6a91fa2714538be6286e4c7b2657b80f045df7f8954738efa7d49a38e5a55a2af934 -CT = 8cb991b10218bfefa522e2f808dc973620ea391623947cb260b852efd28939ccca4c8b1f02d66fd6d0d7058854fac028fa0f23e8de801ed9a4361bf7e5a23e6a7086624a64a29815bedd5e5ebe4d9f9386d47e1408286971654b38ff8e5dd1fef7686d7614ef01900ad33bf97896b4ad02e7445782b1794b45af967ca3ba72a2e5cd5252a9ff0ff550ee56fdd8aa555bbb0bf8a5dd534fd65b13235fa6650761dfe2a28b2757077a2680ef88c84eaada743d1f0d25de38fdd1974ffc07dbb9c7fa67cacca309a10753c6e2561c4784470f5c7e116e12070fb3d87131 -TAG = 665fe87506f8df07d173fedcc401d18b - -KEY = bd187500219308edd6ac7340d72813ee20054d6d4b1bc2ebcde466046e96a255 -NONCE = aab93d3181e7a04cedf17031 -IN = 55b824816e045702526f8b5def71a0d023a2e42257fc1e06f9a8531ef9f7717474ba4f469e442b471d5da6e71aa635a307205c0a935a54b8a59be8856144dec435e29aa1a3568073aa6bd3439bc0f219fa1179ba0a316f7d966ea379da16be4db2f1fdac2fa6d00bef9351b78bb2773bc30ddc9d019e6e7d78dfaf38010080027afac33e751c0429ef6c70a1f2d01f103482818e9353e39a3a4b785a7dd2c7e1ba7a4c36a5f3836d5465c002bcd1ac576d90ad276952ac155dabba6873e6d92b5278280a540071b205ba99b77b7568862e70e6ddbd804906c33fa130f8b0862001 -AD = 11b35743bbcd0113d2c188f75d382df44e874a2d4b3c3148ecf8e0406479305f29197a3a71dc7bcd71b6136ab11a7cf46de80140e15046acfa18774cbcc755e9f3beb37202fc308c03b1c20470b3128f5b91d925bd6703dfb3277d65159688f656d5ccd83d2beadfd778854472b1cb8fe440bdb7efe806f4cb95249cddf69fa0013dc5a626eb8ab69a48b3ddb1a317b35f7772f711221cee1cee9469e2639c44448c5942c95324dc2fcfdc952e05aa336ddbaf57cec2d1b33981ecb8f70ccd34a279b211c50a7784906f2981a2d2ad8fb130100c4f6bdb09c95dfcf4b0eb7ac6d5 -CT = 1e99d06f82333ec8e4fa1e81014458c81325e5d69db561449b153727da35c0b540c570b60488aca6aae58f75f84792388d0160dc45e4e5bef552c49228d806fcc22259f0f94da2f786cc94a3ecf3cc15ac67719379d86abaa54ce41e868110ed2b56dbeeaad4a444eab51a96aed404a4f4b9677d22345fdb67ed0df091d23d8acd70bf6cd29f19c99910888b3281b65637590af984e493ac70011486ca88e72fd14ef1cba06a50070f138dfaed35ab12690a14b1c8ac319f597bb690cae28019d64c868acf9a58fde1d8aa18dc1ec9c3c4a0ee9c4cfff8912b1bf23c805af6df48 -TAG = 1a43147e6e097a46b61f8b05c7dbbe1b - -KEY = ce53e967bb4675a51652a9e6e87da6be36d16245c1e37ee00bae09cc30ed8528 -NONCE = 0f53ed18bfdd28918c3993d9 -IN = 3f2416477ff2ce7da3e5766f043e7a06ea2b87fdf06320d296c71cbaec4b115da356f8c7f34220f91e90c97a5cbbb7fcf0048fb89414eddeb2ec1062d08cc75a39a1f9f214fc3efd6fc8e70d78418007d7d28944b3f37fa5667ff79098d7af36a9324419b53efa76e98a311e1436ecedd977397cd02cc8d377ea8558edca35ff4c71ec31943119b76af4c78a435033eafe73c7079224bf2328b49ed58acef9b043ae3c7ff17a66b521e190d6ca2b2835ed8edc2c173f04616af237391a4440fc5306366c834f6a504e902dca6d3e9e1554088eaf5b15db7fc1fa19f0867ece90ded639ee8072 -AD = 64a596ffca0889833fcb537f58d94791f9ba9b6b7ce0c7f144f2f1a95d62ce334f7bf7f0d2ef0c6e7afa2324b069dc6a7a522f19a001c335cc0252ac4a26079c3f267cdca1e3f933069f52fe72e1a00c83d8fcbd2e76149a912c7b37663c2e7967a3a80656c87094d349af6b9d64b3873f467ed376eaa1e0abae06180c847e981c6a12d32b580acd34f779c343f8b79df1b5004d333a5c37a8be7a94c6f6400f819ffbe6d54d3c1a92824fb15c279fc8121c735b6c42248ee22e665245966d40eadc51f12904cd64110d69354cc9d9fc415b3469317d5e4643942dd4b649de0ee2fc5d200701 -CT = be462da8cc9d8cdf343f7025df0b8b41c24f7b6060cea2d3c63338b6c3e83f0797e966b8c5dd889bf1b5058fb4d694be2178fb33d9be1a351812046a6d3bd36c84ee3665d39fb98159e4d30f8a25a60064caf980f744fc519e2dc451f5fbcc0834b72920d32f0492abedc1022b0db4f2f44b91ec48c588334775fac91f174a4714b3825e96fa53cad3de94807f3b888950c8776189cc18fdf379cdc9d6054952c6ed2b3fb7f6b49beebacee7ddcb19a3eaee2b2e2b7a5d6476e5fc1f216ca443b859a9a661dcf2f7709f87361186368a62f255d78150f09ad4ab1a20e7329f3d96fa2a33cbf6 -TAG = 1cf74908f6fbfa5b2b309ebeff2f3ad1 - -KEY = 093d932ed969cfae63f07e0c04c7f9eaf1b36f656095f8d5f112517dfc430cdc -NONCE = ce36a837ae93a280d2fffc63 -IN = d9da99635f8d728843dd587cbb24e68e1df2f81b5f7abfe233a224cdbd48cd8b82da3711d2ab6c1ca722610b87f426a2cdee4456b50781e3b25da037ca636f2a5eea01f4eeea52d0feb7f1f6c2594d63d8c05c2adf339839449cb1d2aca94852d1b64b5641a572c2da02ebe299c7d1ff4da8706f44b14602f44c0ced711fc78005f87b1686106250d3d3860b67f5b38788db1891150f88d4c5276751afa0b2e37a59587cd8b718767455e65eef25bddaf787d52b88556710f740f117b02f244edd47cf0e45646d40e789671ae61ab06336e24fad8b64cd8f60b427ea1f58af443c6f55d54028edd5f40d78 -AD = 5e9c95c3449cee3f9f726be031089b2358ee92fe7b408b355739c8da6369304f3b287ca60dde4685bdc59879e1530ffd8f6589449196abf0f0dc6dcd82ba7fba481f13376cf29b32af2ecca24a161e6e57b6db70a7e02ee2154cc0bb5280b08f8dca35b1a342fa18b8025c7a805cebaed99e30b43c139de7c37adc25b0b6b5d873ed86530622ef2d0ed3ab19e9c27df98a4a15324f902c35a23adcad4598c6e990c64893355be15fa7320c1935b4ad3c069c068d6b3c8f43d6fe0588b59170bf567ac3a53a50db68e4be17964f55acfe695638cb5fdea5c40805334a385c2d35aa836637ccdf71390487d9 -CT = 40380718f069f44c88932af22a10f80513821caa71fd7a9e5c4f37e1c756c43fe491ac13f244bd1299844cc78d7812110f570b693e63614e639ec7395cf65c206eb6fc9bba86f89d03dd19e45d5ec64c7d3a308ced4ac1f59cf4e13be64e49acd9ebee209afc508c97ac817f1367629af9d59b0cd48f138d23abb61f92dac530351f46a4e7f70ac87388e44f6e9548d3e6a26884bb7611f632da7db2a12fd9174773e685df316ea9401d8b352135b6b32a374eef8661b77eeedc34fa4178d0a5731ac9bfc14bce1dfe96af095b0088371ab1a04b2062625f0c4fdf01fc0a6bbf1661cca11932e93690501a -TAG = ef7f960b146747ba4f25c705d942f8c7 - -KEY = 86875efa72ec1827f133a8935193292463ecef801bf3b461c96b0312cfcf32e1 -NONCE = 738136465c8935d77c8d4ea4 -IN = d692d3ef47a5c9d0d9a3b6a0d498e90a3ea06278134ce90cc1d69da2159d9a1f5d0a9ef4b4ce5f873e26e8f9d53ced79991491325ba5511be4d9e6563b70459b10e60d8c5da45d3b0b34dad86772b0560314f0215bef7b55c6ae53999cb2d6a14a35b50fe5a1598adb7ebeee097968ee7624bde42862824900c8cb45b12785d9c4d50ef38133d31a66a612d8638008d03edd19c4d7edb5f9b9f195c60883a7d6aa85bc3ca3b59c395b85dbe9bb30ef6896c4ebae8d72cbecfadfa451bf36631aefddd3feb36978aa8d9a45c9fa09bfa0b2c040d9a422840e68f4dcc3eb902f6be1d91b11e1749183d89715761b6cf22c -AD = 17208cfe5a96adf0ec903c7618d994492d3eb77275fe5bfce5ab1f67d27431c7746314e52934b8c44481e5760cc8f6b0e17d1fcac7fd5b476196e3152c3dc90adeb58c2c9c62cd684b4b18d4a94f8e5b4336ed3f1758b58a254f48b3aecd9cfa63cf758f2df54c52eb246d046198b6eabc90b2a0dd6c5323e915a117235174fc9089cc9bcb1a3bb49080cbcc24367e7f4e17e27a2054bdda0ad8996df1cfc6bcf43f70cd854f4d97aaa4badb5826dd86765d36a2ecc83d3daaf31594eff02999a423185356d693f26025a576037336c156543353423dd3b5da75f45e297c60dd8e091b961f60eb6786fc988f6324f9e8 -CT = 55f48dc2b6836b8603e19264382ddfc568b1bf06e678de255d355fd865ef03339f644312c4372494386589431d4ae7af2eaee5dd3c16340ecae3e87dda9220a5f9b9fe6cc3eaa226d9608385b7e8a6216e7da71997088eaf7c67b5402be01c0b182383ed3c0e72e91fc51fc99c59cc8271660dd7a59ee0e7d9626ccd4439bb9a1499c71492807f8126891ce09451d07d9c5525c5f185559ec44aa31498be3fc574389cf948640dcc37d0b122249060bb7d5d7e5194d4b7a7bb64d98d82a1155e30970a854f7c0d294fbb1a9e058f3b9f4762972c21086e0bf228768d0d879a9cdb110f9e3a172feca7417d48b3fa0b0b -TAG = e588a9849c6b7556b2f9068d5f9ead57 - -KEY = e9467b3a75dde39b0dd44e7cbf2b70ba1757ba6a2f70cc233d5258e321d5b3ad -NONCE = a9756c7b8e2e2f4e0459f1bb -IN = d6d7f6112947be12e7ec8d27ce02924503f548456d0ba407bf23e848b9ecc310e4a0c7b00c0de141777a94cb4b84a5cc34b2b05c8a37cda08b6c2dba80e80853f2a18bcc41341a719f84262b601610a93721f638a8ca651a2f6c03c3cf1070f32b92c4ab7a4982a8f5e8ae70800f7513405f3ae28ba97a9ce8241608eeb5351e6cef5560c4209790ee528b3876896846e013a0bd3a1aa89edaefe08fb4b73b3fa64c0c8b0f7ab70653ee138456319230174f0f1f7f3477f0cfc80eab8a96e29e85e20658cebb830ba216b1d8281ce499f729278dcfeb59cde3a043ef3fe2c42705f311a422e9f80fc3b58ca849dd4b99e5e66a958c -AD = ccab7afe4d320e94f77963d779ade1343e66ae80446eaa5f9ec4d3e3bb3166255e4aac5707ab407b284dfcdbb18ff515cf08790f0470cf335946040438c7de2d2a342096d7607e1920d86b519e96cec1715f4b0dfe375c5959644bd664d23d879b825dffbbdc458ea9da5ede5682ce1ad1cff33dd8820761b1c067cec638873a3cae79c7682ee8d4f97cb96a413dbbded1c242ca669d50ebb6de3c27eca3041fa8aee8974c3d17b0cf79c32c7bbfe20dcfd57303cc40334fbdc43e925df1d63fde57bf60553d7790fc56bd95e675db934dabb1125eb97cded95f397b32bfb3a2d40703e3f11c6c226633b3cb7f9da1e3367de2ba4d -CT = 47bb258ddc0945079a0b99ed5cdc0186f453f8e0393cfea258412e423dde4a00c014ac298c4dfe7c03b0d9bbd4ad189624cb6fbaf13e60ec2b4d83c5bc3294dfec30bd6c8f7125e11d7be145a966dfd78fd77af68099b855989fe077cd9f427d4381b4930abc1daae55722540e4bcbe1b560fde208ef1c2dfcaa2c51b76072e67da311c2556eaa2c25413bfc43d00dd84aa8859b296e05945683e028699d60a29227de1363c4138b9ec2db8f3b502fe09d368c5f2ffd81abe50cc1ec1ef216f27f401456d061429d1910623af00bcf500cbc6509c5aebf7de9c956e40a3f0b0d562775b03c282c204e33c0b380ce1475eb5c0441f6 -TAG = 9ea19333f5050354a7937fed68e38dd4 - -KEY = 4e323dedb68bb5cc4cf2edfe3a54a19b410f849492ed6f66fc053d8903c3d766 -NONCE = f77b876eff796db621eabe88 -IN = a7514c4111d7d8bce2d56faee25d9f5fbb527162576b444fadebf42d48d2631cfed344b0437ce8a7609bf30bf0a44aef172f8b12ea7567cfa5dccbd08bb3115efec59437ff02e7128df9d9e5193794373e30dff7b3d8ec0fcd6cd3872d755c0314f1cd9cb996e4c6ca8ee2e35f9b64a1f0bd1669369f9b333a356ba58e553ff9bf9cb6c5522599dccca2f7f57a91006e7dca4095d11955e5aabff69febb98a408aee92293c0abc12ff23482ebe9d541bf8fc7493eef2c68044dd185eb243b54a2bad9844d831d9b0766a0ef013ad3ac03627b1feeb287e5e61875bb1d0a01315761bae6323a9d678cdcd3c4a85be71b70213d081b348c63fc603 -AD = 9bd10dc97ab5e9b35e1c8c36ef37f90a11bae7dd18af436fa8b283eafe04a5bbb16bede6ce1260187299ae6474628e706cc08b3627f5243f1a9ab469455666e6d5f2ab597b6799bd60a365a9248341decc36d473fa52ac5ac469b965cb2023d43b437dded84ad49de95a6dfc6ae4bbefaf86f9b06e3a33ec90d32ea3af541fd2c43387c75dbd94d44b9582e8ea41afba5e49f1d158d48e979d04888fbd42876e12bfd6695cb99640c537f2f9223d37cf6b627207b9318bd1f4c64556b5db1101c486c53dd8dccd7405e148d6d9b38b7ac875a44bd6df75edfa4da8594a9c43b223e7a6f5b81a5cb8dd6e06e9a976ef156e45520af332e4d56035 -CT = 9885d7a11004ec546955fb7a8c77ae57588fa2e7fedcc8e9000123495b9016d1a101fec1e6724302e93eb8e01bd05efbe8502eb97b1064bafa9bba5658b1677819cec4998dbf02df1f1eef51bb3e75c19f570efdda98b0b8dc5dd9250eae8396090ca9ebecdb90f32c5e2085e86b64e57464d251af62d9f8c01d7bd6cec5f9dfa5eb7c4cd412077571bd071a4eff5098883940d63b917c08bf373916cccd7a446abff0aa5c687518703c25cd8d3c5d724f348e20be54f77fd18dbf6344d1d25c788ccb5a5747d575435829b1825e31f9e94abc33c0d2750fb62ae167a7a74fc9e39db620d43e0b8514d5f70a647e53dd5764254b7785b1519474 -TAG = 936072d637b12b0b6a4141050f4024ce - -KEY = e57e74595d230e8eae078df1dbc071c66a979a912e2252257e28447e97fc82a7 -NONCE = b613d6d5fff507e917674f2f -IN = f1ecbb2a45f04ca844616528b10ffa4d2c5d522ed4ae3366888fb371b6ee7eb4be53c8204783e43265931f58f308623f7b2733384c173540aa0bdf879fad0283c2be6c42a7b4feb2b29265fffdb518ea77d33507dbbff7d9921bd97fd27f1100402e02135f7df4b5df85f7472fa75618facca3e24d487453e831efa91242e62ee9d32880bc20f7ec016eb12edb589dc8a669f7c78375f915d7c2b03457b00ac2aceaf37c0369a85c3f6fe7c0447c022d66bb5acaee62163837a36e882cfb8579ba9182d3153a25623f339758ede5a62f67b199fc8abe235fe4b607a6804fd4d15378c76e0c26c1edf1cd637b7ea59edc66cd5ef9b8cf79b95ff89c235ab195 -AD = bf4c0737e461c1d6fc45b87175fd7833625c98a03e089c4e3d47c6b21f4bf38cb4b7666322217eb8fa022afae473df56ba3502c88cf702276bf39c6fcccf01e629925a83816a5096e612458af6380dcb7f63cfc0eae99d63475616b18b44111a1927b05503c4ce46ca48321b0f8f247a54919fc844fbabd3a2481e83bed8a5ee8086d7559db00fd1d64f4892ee9363d59829ce1e10af66696c28e86297b43190800251f346bec1b577446120529d486266a271c71011528b24ff4caf2c30f9748a2b03c788dd583541368a643075a52127c48b3b6f0c6ef413e61479c9afdbeb4bda44340ff0d81c7bc0321d3de4080cf7e108dda3fd4e480e685b202c6bfc -CT = afb2aae2dce03cb0bd3467447ef6895a132cec06b9f7764ee24d90078660dc820b8384c01375e03c20a6c688a780d7d7fbe5837d477e8f3d7ab3ab865dacb0eedb5694d3276ea914a421b03b9d4e4f586227a3af7e8d5d579bd832450f038eaa7bac57aab996df55367ddf59b338e5d370e310124e8ef43c9fe54e5d23d60023aee266054ea66c9f32170ce97998b527073fd178ed4e1752cb9c515c0b32766b363c39c513c2e9ff6d1c24807afb43af3c5a317f1536087d8576fa3be3b007d3a77ab0422303cd0b142c4ad194e1bb86471b91861235dc336dfe9666f4f2c6a32a92b8fc52b99873f9792cb359476a2aea21996d21c17ab814de4a52eeeb33 -TAG = 05906cbf531931559cf2d86c383c145e - -KEY = 847eb274561fdf0c1af8b565a92da74641f17261a0ea4cf63ba5f36ba7028192 -NONCE = a379511688390ade6f0318bb -IN = 1e588cd0636f34b656b140b591a9adafb8dc68d0abb75531942e3c6ec1d29e4f67853e3d718dbe61b733490525c7f9ce6746f8639e4d271267a95f0940b3406c67ded0aaed36374b9a4bb8c753579051c6dc3244d6126a8a97d4a912569ba139d55dd00c380e7ec450d44f6c7b9482c2594b21f61ef8d165666c830867139262be5ad3a31f44a286d7e86d4e5c9bd6118147efc8e606c522ad0e9a218aea4daa39d1653157e4c3730240fff67a42e4f34186de1c13ddcb1e44020b7a31d21ba6ba96b3f42360dd1d754a7bae75b6fdb6eb3c76412cc1fd8e900d7aacf4d897f4224f19a1d44a77e06c95eda5fe76b11c6f5088e8ca75c87e07edc64c09a6a31371552449 -AD = 331d48e814f660516f3a796b08afb1312625b3b17218819cfdbbbca4c333378b57fd93482d971992b5b15b62f0724d6e7b9beb5ddffd3c70b6f8bdd3cd826663eeb91d37734a686c987efeb4d4906b80c5378fcd07806d2dbf3eb528472a110743df8cd96b6eb67e98b13ac506c9bda167f045a412c93d78e860c9b4bbd7a2d71adbd3530f30253847b4112d4b898b520c7a14fd075e62605b05084f26fd138179c2791fd6e8d3bfbb2735002ae12d986f92d7d300fd6f1dc12c993449f8522f6f32f506a677c8a981aef9815e83019713b2f9943acc8d5b3f6f65b9e2b9a14ad2e300d636166da2d35a6a0a756a76d08709a043d65341695490124971a7574cf0b5845a -CT = fc1f0d7309e6420b42d59740c9b9d4b97075b874015251ad55483068b00f87502b18182b140db07c70a80fd884fd79b7b5fef1d307ca4db0ff046494443e1cae83478d275c31402035f1fc24e26214b78d9a4dac78d074150012f9fee810a121d87a16d8e1eec5700e9facba350029788480a259d9f30df1c2b8df7691629314391719853c0b68614134f6028865700b1fc4e7f34ff28f449c6abc3027f38d7a7f6d84b8f27f7cc5afa09478c809eec346bb58244ab42a3bef61a14ae7640d76591343983de9fe5f1b985ce56c9fcfb2e3f6220779ca6f92a6b8aa726573b38ed7663ebe4c85066ae3f488ea3309593fa41dba8efd2b8f44b9fa8f7a427823c1228093a3 -TAG = f1832022e06228c36181856325d4eb68 - -KEY = 3828b138f72f8fe793d46c55ad413bab31a51e7a9093cdd10fddb4739e28e678 -NONCE = a60413c0ab529ccf3de58468 -IN = fec017c1c51da5ce9dcd8e84cdc03a43145b31edfd039c7c85d8811a2f58efe7a2d7590149a98cf0b5af82d3e0a325223bc9d5585ceb1afc4cdd96024be6c8064c2abac14f68e65de49e25e3e967500ce5b4504d00a9cbad1e86bbdcf65c01a7a92de27583b7b92122b6a4923b7192994a1edf00b75d14a982f92559dbc2d5e427a75ad29715375d90193ddbb39b9a52c1a23d75629c539e0a6ce822c7c08fc77dcd3adc357893215df4694673a16d34513de21217ce86897c8f0575d213ce0c66eb1d1985fe73dd86da3ab5e89df4243e1be9dd95af94f878995d02929ee42a062100d6d4d3884730f54593d5ff7b7ae53e03d4f0e10f6f4c3077206499ab7d4de1e825d532d0918f -AD = e2b16ff2b6c73c9374704ffb4cdfe7bad9eeee32157f2eedf427f99c2cce80c5aa4d9145e85af0cb08e6ed477cbe79ee168ded5c0895f9f4f939c21916b3dd5c9d268b3aabdefb85d953bce9b70732fc9acf6c7b727f78d8c9aaca9e022d7cf0f95583e81744227d87fa34ae19de44d202ba01e3d03993f38c9b2fb00b54dfb677d67e6f5a15f46c29eb5597ae3d5384b37bbeca3f3d825e2b7cceaaeb36a8c1273062259608956dd0c79877cc460d0268de27355e34b9d8d1188c062ac5e10a73f2d70fd0636304b3de06cffeedd246e2db19b8b66785f9f9c62b8f0198f29d37a4ab5280f4aa0320559810f89a1618844d0ad5f3a4f5a0e834ab31e56798b7158217f834d372c36f -CT = 88ea11ef6b6ee6fb0be77bcbf227e77508922550ef0d7534bf05668ae5fcab2f4defe643747716e7e000950e36c6cb24b79987389a150382c091d39ddf841b0a5e31d763d9c59753a3ef36a23b81f38e6e715357395ce715d30c14d6ab5b7454804ecf633daa39b6107f562fae6a646efb25c1119dd17955bb9e640105a21566345408f72f2acc8f2726a0be465551f9ae566da559fc0b92c36764c5ca20a18a316c02e606030a53450e7ae1146050a48a64c600d33cb84389b0bdac7ff45d3d1f2f669a6e365ef722d76d2fe9bef2df93c58bbdd6965e18111b5de0f4a62dbb874161bf8adfa61e9cdecd97b4fff668b3efeb3e32eeb929cf58d94ad8077c0a2ca79e80877c5d9329 -TAG = 9b47afc5816b7229213cd3c9135545ed - -KEY = 91ea63dc27d9d6bbc279ec6cecdce6c45ff0b247cfb8e26b6ab15f9b63b031a4 -NONCE = 80a134fac73eca30459d5964 -IN = a848e41c77ac8c733370435b5b6a9960af36031e96260d5703ce15b003606875a7901cd11e4571bf88dda29a627c0b98065a8b4e6d382852dfa4f47d86fa08e48ad8f5a98e55c305900b83200d44029f304abd21e0264115192a3fd7b0eb69b9f8ca7865b3be93f4ba5a28468fd7bbb584c32ae867f5146efbeb1412d3ac36c30cb308c327a6f207e30f561d6efe0a535446c693e14176e9e714ffb5a5b1075812909a362a6c4bbe18322e15690c2c9cf5a18e0120c11551cb7055b5aee97e7a56d7c24fdf1214641c8eacb196d74f3d96a7fbecdd4fe52dc7b6ead9041cafd5a3fdf91fd3614e63189b488d4d7c1ea3c6351d112a2223b29d390ac3ab7f09a60bbd3df6e0d606d902aa44244334 -AD = 47940a0694183b2fcb5e760c9ef6dbe4cbff6ccf33208337a981138f9d35c03f8adbd810e94636acaebef6791b531a65e99b03fc78e7eb48036615874e97cf762fa6ca5d880bb2c2f644f1aed70c667880f98834d501caa277cb8ef1095ff882e79c3a92ea8982abebf63ea9ed7e9a24d32cb81d5d98e891974e3d636a59e165984e00f05a040d33f07b39eccb924fb24780a422a6b2b7bddb5b316beddcf6fad20e4cee7d0141c2f7c4e4f759db8691dc7b8525ccbc3ee6071a2ead63e750d6d92dde7eb1303d5b1194702b6c3e0c2e6f9649e60eeddec9c1f71cf309af0672cd2ffcf94ba7e6c3d7cee020a224a9a956274d1d36ba16030e215d90a165756666eff066a8e51bf7d4babe8b7d8d -CT = b90449af99327afb1124bb24f1c8b5cb878423b0370d5f7cd297b28cc4135ee77d6f1913a221cfeee119bafa873072bfa79e303fe377bbed05add41ce3a42ca4632b98f40a36227de1a9ba84d6176c01eca9d33d954d0ebdf4e40f136e0f6a56156fbb33b344a8a433941fd6e08774bd00075aedb0e396c2bc37d1250541248dbeb899e1b5170cdfeaf7b89995b049428bb277c501354f8cd48fb58f6f04f956dfd099c48778dbdbb4c95b7c9d6797cf6d3bcd1d00e88cea885ee4a10d94356509e148990a0e10dd89103a9d5c8434a7bdbed6c0ac1271e0709eba144abf3cf075c020e9f7835d5a98fb2439b399e377ae6e19fc5f32df9ddfb9e936190d3e9c62de99835249d1f32ca3f92ecd44 -TAG = 6ccaf7c142d86b83e4d0b4289b49c4d4 - -KEY = 1344db082889367fd48c5f06bc39f9cb9e3ad4b92fa484ccf49418dd4caa2e19 -NONCE = c04a98e7e29326b5330818d4 -IN = b0e12e3122c1ebfdcadded5a45163a6208548e9bdf95cfd18ea504e5d2e97372e58dbfe460a57b724d38f3bc0ce02a54015779bcf127343474d7d4c1402d598bee56897203b903da5b819e2218bd0d1a2af11c542544f02c46969cd2bfac683b76a8de61698ccba63361a1a0b570adf69d24e9a7e466873c8c12e25e0bcead7828386179a4d65d5bbdb800eb52fc01b67498d7b5f9864270162158a8572eccf541b07833f001848672098c57708eb479855799567c318b1aa097efa70db0d8a8d36fe0ac22ebcc2870baacac690a79e07ab286acad9f7a877939cf2989cd6200eb86dfa7a41e969a3683ceacc7c97d1cd5487f13c439a9777a67770687657d38267a347a0b6d3aa3cf64e7f31017246e4369da -AD = c96db14dbc2aa0ce3ac63794f75c7e78037dac6763282edb307821a7938de4baa3d2e35a8cfe0c8724c2a8d870d0a462ea157e15aacc69a3c881d9c819225ea8be479872d55e655c897936c95b9ab340820264567495fc5e4e3354f42b84e191b470ca9f4d8fc25d011bf9c9e73e1590e1bb919dd2f288b26935fbfb8c93e54331dc8edad5e1cc4aec103c2f3320d59870c1770319f105ee790b704ed655be423e63ab040f1153f41e7070ae3a0f34d217c4649c180c84814463902d99a9396f8c7c85a3a4c8ae2f01737649fae478a40fc72303a108822775e9c421f945cc0eea992730790a9aa0c0d014518dab371b52d30b5a560f34946a9344cfb8a19b09ee9b123bcb8f642780697508f04983b790dd2d -CT = ffda075dbde7b874995230e1324f17894689baaa7f1354e26100befb546ea23dc74807818e43a3cee00ec1bbb95c82180489ae5f3a1c482dec28f96ecaf5ca4655ff7f33c814197cb1973cf02a0b720a5c44068d8ddff0789fc1e7f20ef408c1a438133fce4f7a3e8c85d95a381b94e949ce47a85895c4be7cbfad468e52a160dee34b8ddeef2ab280eaaed4990ecec790ac16de3c74aac6fe2d5e28ea2b66a921c894a3971cee4a2158054c3567e0d941f867ded5ed1d21d8ab090848fb3eddfb1559bf11815db52b8eed871cfc117980f297da79da31da32de3f162a03d95090d3329da3662df29e6ec9b236e0f7c1d7d957cfd54d5efc99c694b9dece989912388254798513d881e5943ce830729a8e2ddf -TAG = 81c55fe9aa2de0d63efe3f74a3d8096f - -KEY = 31dbefe589b661af00a6fbad426e013f30f448c763f957bbcbaf9c09764f4a95 -NONCE = 147fe99bba0f606c57242314 -IN = 908bd801b70d85085dd480e1207a4a4b7ef179dac495a9befb16afe5adf7cb6f6d734882e6e96f587d38bfc080341dc8d5428a5fe3498b9d5faa497f60646bcb1155d2342f6b26381795daeb261d4ab1415f35c6c8ac9c8e90ea34823122df25c6ddae365cc66d92fc2fe2941f60895e00233b2e5968b01e2811c8c6f7a0a229f1c301a72715bd5c35234c1be81ef7d5cc2779e146314d3783a7aa72d87a8f107654b93cb66e3648c26fc9e4a2f0378fa178c586d096092f6a80e2e03708da72d6e4d7316c2384a522459a4ad369c82d192f6f695b0d90fcc47c6f86b8bbc6f2f4ea303aa64f5ce8b8710da62482147bcc29c8238116549256a7a011fd9c78bbb8c40e278740dc156c2cc99c3591fec2918cdeb5240fb428 -AD = 5a32d7044f003b2ffefffe5896933f4d8d64909fa03e321a1bdf063099b9f89752d72e877291d8da12340c5dd570d7d42984ffab5177824fc5483b4faf488504e6822e371dca9af541c6a97312b9cbf341b4198b0902cd2985ac10a8b5b5fe9691bb29a88344f863c980e4e871a72a8b74f92eef68c176e9d2ef037898ff567298e186af52ec62eb7429a8004ac46b945678b82859396d36d388ec3d67653aec35cf1da2684bbc6c78a5f9e3ce1b355af3b207f64e0fa73501c5d48a14638d0906c87eaa876debcf1a532c1475d80ed3d4b96458d2236eb9f67988863bc6d5c16b96b93d898683d248d7bc601b5035fc365481b89465e37a8f7dd64635e19a0282639cecde72c6b1638e0aa6e56f9c00d031cdadc59ce37e -CT = aeab9db30a579ca54195e54a9e6c787f40100c6d12ceee35643f36ae45f618cc9bb66aa4c0fae0ec2686cb4101a5b23a46877460c7e020b38b0d8d1f533ecfa99df03d346bc854a578276d7d5685ad1fb03655683a64aae4159c9efa6781f053057e0811226c7c533967a94587f4025353b28cc3a2ce5763783b4c31e7818b8ad9195bc03be8f294f9f6ceac578f9d30b22b1f5a68d647d46cf6db4a9c3a8a5c06fa97c9efb4578f501ea96db1f40942e3f24c44a7e4070a6b931c39947d9692930b67767357015de51a39e46fff94b6019e4bc1ad9d216a571ba0dc88859c49d2c487ca657384e49b4d382d86a60c8d5195320909c4e82fc077a3b22bd4eccf0f067e66ec78eed642b2d16f0f304f60f1d9ba69e205c982 -TAG = 17ca09e3084504fc22e914ee28312c8e - -KEY = 0ecc44c9036961fba57c841ace4ca3c547c51d9f126567bf41626765cfcbd53b -NONCE = aa98b6ddff7e4b2041f29d70 -IN = e49a2a5713f507bfa00c140dfbefc0c43e37bcb932e0741db03f0055da61cd837b6e2d8f99115d70750fb23685a17121b52e98a37c87204e0207729fd9219d11a48e57970d790338793cf329f7b239512a44dd4409fe9d157f92123dfc5cba24af106442644dedda87e1d9e95fd395f2f0ad8f7d27f313e6ce1a07d9845dec5ad732e6e4749b3a161527c8ce42331f5de1d700650072fb68e9c7645a0e0e529d0563d2727e3fb38ed341f74ef1ad95a0216a440e1384d0e7ef71cde38cecdc9e2b2d563f19014c40c1f92ea0af3b4f6da9146d433ae85f647153db326a28ef6ea2e0ebac0cc1aff157067c7dba7cc4317d56920ee9deab5764368e7e5b3ce8bebd0fa129f869b15897c09659c53188bf8efb7b6ac7d265c9b85fe96166 -AD = df41db4ef5350d4afcaa88b4a577b3370b96699bbd73e59aeebca6ea856cf22694a9399ae7f97a3bec226d82f5598f8949dfb92530dcfe77770f066f2af988fba5543b8ba7655bc43f8dca032981a34a1beff695c6908169d475c55b2119fe5578623f68a9dd85b653656881b0db4006d3336fdfc784d1805e48ff478fdc196601f044c9d33fca3ddde2db0102f90fff0b370f520e00e3786c2a9b0b4a9a7ea6f9d866f77d870c8ef0f3a8bedef17949a32598512af665679dfbe71e1c3efc3dee8f5d4499e20dc63281191751f67e51f201973a6675896484527d66bed94d6aaceff65fbc4192cec19452b8873f22d72bf2f4981fe656285cb24be5c58e77dafd3e096166b230f18d3f4197fe16f6ec84c060ce0793ae6848311a18b7 -CT = b15b2bc4b9e8ecc5d9c4a6359a805b7590bdb4bfaa9b3fc4d7676d721edc4b3b1ef71b18a3d78f1b31a477cf25e55b278eb3ed774805ae8e5a2a0204f7291d9587663c4d8b1b744154f3b7cef796e0b91590161f3bde82f1d8139cb8d017606ae6d0552ba144788fd8caf435ab09a43a1f4057776af49bad98fc35cefefb159cfebfed76f2e4d18b7be143677ff8b3d6e2b440fe68475b5a1193bcd19ab157d0d2257f33de8e50091ea3388648c3410aa68c830566a0413d92454e4eff433c3edc74e8f7516ec17b2c01cf57a2d7c48db97b706b8d7da0b68051f2d6a87c417f46cf217a48611980890f669d39b478c35d834ed2c79299df2381a1215d6db303cb63e2795fe517649874226e0a6dbfe2c86370b9fbdd8c5de349bfa25f -TAG = 7082c7ef72c82d23e0ba524132acd208 - -KEY = c05dc14b5def43f2e8f86c3008ef44e4dc6513768812e9218b2b216818c4cec6 -NONCE = 5cfe0dca6e599ed9aa89ba97 -IN = 8a06e2997b8e5f8040b22e07978c83c48d0f90bd2b2f8b426b43feea0b614d3b0681745ea4224cabcaa25ca45c3053a6300c47ffa4f72e838db135ae35c27939aad4cf7f75fb61daa3148d869057598e4e8b44c6fb19b0d9281e18676d8bc137489bb77a51a3a8f807a896d558f00040e8729ea9bbdc7db6102c8b99c8a1eacb0735577bc6533cd1d8147013935b6344116090a1bdef1f2e38a877a50c8fc0f394bafede31375c57476ba06d95ae734e6dae771a32e5091dff71d845c5f7385b9b9069ced12fcfea34a510880b088bb0016e94a5932c89baee038cbafbf06b3d09426afd2d5dd5e392636362e9ffa9186b5c753eb84f82f68fb1286ed06c58a5a936cad018ebc4269037b49f2ea0349373adea99f06062e5dbb0bf94f2883f5c0556 -AD = f2a3f7af8ea984bbd85953f14202c6e478f98d0bcaacd414329ec480d0c29fb4c1a052d3228c883928448f0bef12cee5b69829b4a3eb4680084131867cfc3d3af84fcc0d80c2292d3fe02405634f6cfb20b0fb90345da3a557fb30582175c32e432be66ad096f9425ff4060df54d6741fd6567a1e2fc5f6f3ed95cefc806ff64ae91ae82920b5c829ea026f83fd90d760e240da3c9ddaafe4d08507f4af1049056dc6d09657779a3dbd889d851e97d4ac60dc66df2d24979ba8947a7890a304bb301d0d42b67824e0c68fc882e90cb6deee50c2e3d9f0da59ab23c997b05635a0d56c71fc39aa0e6b19c43a7fe12d4e4145453cd7fbd8a3f33bf5451addf05052df7ef044a33513bc5f1a4cfc8b68015664bb5c8e4bf54a85efff109ee96af75d4a5 -CT = 2cf630548d6f2b449057c7861920308958199f77b123a142c6b7c89c4982f4ed0efa2fe899914ddbf4543e70865a5e683b0721d6c8443df2e697acf31e11c8809aba94196409020a7c64d396fe136826455aec973af23a6c7733cb567f5ea550e50e0b796623a97807d042855568e3c568990cfc818c31a1bf415337f43e9baed57fada2fb2ad3c3543f2b7f2777e03f84040c1c854c310ab1cc5dc7f2a5fb213af79ac068b46c7d9475bea126adf079e2100bb57904a931faf248e0f7d5832ca83ea8a283e0136979737132afb1f4ab38d307ac0774814f4d5ecdc4aad79185c05f8a706f579b78f2c1c7004cb38e6cd22c2080735b34c3f6134955ed3bc36b1ad5c8e33209c9f3c658fb07b59b6002b2526cd8d853a5c624b7108573d7df60c827 -TAG = 3dcdabcd1c82002a551cea41921570e5 - -KEY = b33f449deccc2ef0d7616f22b4a00fcd84c51a8383782f66f1696bc6405005ee -NONCE = 6afa8baf923f986b5779ac6a -IN = b0af85a6deae5fcaa94778bce015ce2da7400ab768f3e114cc1b645fb2716789e2aeb96894fda6da5bc24fcf2466124720d6ba99e5475d77e5bcf2c2f8c8e5becf5eb73ad650861bbdeb51ba5ee789c227478934200fc18f36e4fe392c99d4c3fe0b38b40d2e84f831b8ef9bce9ac1362c755943521ecf5b5cf8fbcdf08f2d47ff7cd62838597dd342695a1b037bcede69500bf70bf1edbb40a17b44695bd8ff8bc8664b3211a6bbfdcbd1bffbfb1a2ea0141cfbc6ac841c803b137be5eeb2666c46c09cc1c4fa82be43bfd56e7a2b8ceeecb6efc1933a90213a0e1bc7aca2af35f2d1dad5f0d9002561064a699f1ce76c39d9c2224ae596e88a1517e19c2115370768d50107f3f2a55051838ae5897acf2ac0814ccd864eee2f6b5d7a6728c6ac6e6a57327102 -AD = 2134f74e882a44e457c38b6580cd58ce20e81267baeb4a9d50c41ababc2a91ddf300c39963643d3c0797b628c75a5fc39c058d319e7d6deb836334dbe8e1fe3cc5704b90c712e1fb60a3c8b58d474a73d65fae886394f8b2c029e420b923f2af4d54c9de3c7fa2bccaa1e96664ccf681cacbbf9845069a4bfd6c135c4392d7d6be338eca414e3a45f50510718e2a5a3e5815eafa0c50172cf5f147510645d2269929843bbbab682deb5823d4cdf42bd250bdbd20c43e2919d7a6e48973f43a4cab73454b97cdca96721ebd83b6dbaaec7e12cf0dae678a57c431b81421657037dd47dccbee73a41f56495fd7c25c75744fe8f55cbd1eac4a174d8f7dd6f6ba57b3e53449a9ce7806517e3e07cf6546a0fa62c7b1fa244d42eee64a3182461792edb628e567b23a -CT = 0fe35823610ea698aeb5b571f3ebbaf0ac3586ecb3b24fcc7c56943d4426f7fdf4e4a53fb430751456d41551f8e5502faa0e1ac5f452b27b13c1dc63e9231c6b192f8dd2978300293298acb6293459d3204429e374881085d49ed6ad76f1d85e3f6dd5455a7a5a9d7127386a30f80658395dc8eb158e5ca052a7137feef28aa247e176cceb9c031f73fb8d48139e3bdb30e2e19627f7fc3501a6d6287e2fb89ad184cefa1774585aa663586f289c778462eee3cd88071140274770e4ed98b9b83cd4fa659fcdd2d1fde7e58333c6cf7f83fe285b97ad8f276a375fafa15f88e6167f5f2bfb95af1aefee80b0620a9bc09402ab79036e716f0c8d518ae2fa15094f6ea4c5e8b283f97cc27f2f1d0b6367b4b508c7bad16f1539325751bd785e9e08cd508bdb3b84 -TAG = 1976d7e121704ce463a8d4fe1b93d90f - -# AES GCM test vectors from http://csrc.nist.gov/groups/ST/toolkit/BCM/documents/proposedmodes/gcm/gcm-spec.pdf - -KEY = 0000000000000000000000000000000000000000000000000000000000000000 -NONCE = 000000000000000000000000 -IN = "" -CT = "" -AD = "" -TAG = 530f8afbc74536b9a963b4f1c4cb738b - -KEY = 0000000000000000000000000000000000000000000000000000000000000000 -NONCE = 000000000000000000000000 -IN = 00000000000000000000000000000000 -CT = cea7403d4d606b6e074ec5d3baf39d18 -AD = "" -TAG = d0d1c8a799996bf0265b98b5d48ab919 - -KEY = feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308 -NONCE = cafebabefacedbaddecaf888 -IN = d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b391aafd255 -CT = 522dc1f099567d07f47f37a32a84427d643a8cdcbfe5c0c97598a2bd2555d1aa8cb08e48590dbb3da7b08b1056828838c5f61e6393ba7a0abcc9f662898015ad -AD = "" -TAG = b094dac5d93471bdec1a502270e3cc6c - -KEY = feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308 -NONCE = cafebabefacedbaddecaf888 -IN = d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39 -CT = 522dc1f099567d07f47f37a32a84427d643a8cdcbfe5c0c97598a2bd2555d1aa8cb08e48590dbb3da7b08b1056828838c5f61e6393ba7a0abcc9f662 -AD = feedfacedeadbeeffeedfacedeadbeefabaddad2 -TAG = 76fc6ece0f4e1768cddf8853bb2d551b - -KEY = feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308 -NONCE = cafebabefacedbad -IN = d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39 -CT = c3762df1ca787d32ae47c13bf19844cbaf1ae14d0b976afac52ff7d79bba9de0feb582d33934a4f0954cc2363bc73f7862ac430e64abe499f47c9b1f -AD = feedfacedeadbeeffeedfacedeadbeefabaddad2 -TAG = 3a337dbf46a792c45e454913fe2ea8f2 -FAILS = WRONG_NONCE_LENGTH - -KEY = feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308 -NONCE = 9313225df88406e555909c5aff5269aa6a7a9538534f7da1e4c303d2a318a728c3c0c95156809539fcf0e2429a6b525416aedbf5a0de6a57a637b39b -IN = d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39 -CT = 5a8def2f0c9e53f1f75d7853659e2a20eeb2b22aafde6419a058ab4f6f746bf40fc0c3b780f244452da3ebf1c5d82cdea2418997200ef82e44ae7e3f -AD = feedfacedeadbeeffeedfacedeadbeefabaddad2 -TAG = a44a8266ee1c8eb0c8b5d4cf5ae9f19a -FAILS = WRONG_NONCE_LENGTH - -# Long enough to detect counter misuse issues such as the one in BoringSSL -# commit a3d9528e, when the AVX2 code path is enabled, using its EVP interface. -KEY = 53a6f0d9b8a81818f2fd7525acd65acbaac82684cda4fd357b1ceb6146b31ee4 -NONCE = 05d8a92b5a510c3a3dacbbc0 -IN = ac0ae17d3d0ee5935e18675c36d9e43967f6da38dddec14c7ec574ff8473e11ae5019e638232323c175b7672a7462df6709f5014bbe12a1370a1ffb570177927106f995dc8f35bd6e6228de7c16acb71e583c87477dcc7b17a908ce01543496c2cab8a14a21c43b18fab52d8a882dd1d999b4275db34c7f32bcba624d128580d7566a2da4bcfcc4136d58816c437d21e90456fc86381b946b8955f0448e83564165a629cb2edb978e5941010ee9153b054ee429b315058334ad7899aacedbc0bf423de69f57c633b56033c6531dde29258694045c46a797987471ae6af8fee8ad0c1be4149605064aaebafd1c5592e61beca9b5c7771410a276c3ae517490735ddd6af499ff705b9fa68d50650e60c19f5ae2c88dbb6d612afc7be28a5f55556a2163b6f66609f7d9ba7e97c074ea39a618727421fbfbb6453ffeefa643decf11404764515d28fce8ba66b8c85d077c47a54125a38bcb6b0adf6d248ba0a9ea129c887c66ef537c45e9fd3c17ce352e3936cf139e13a5946a7dc9dcb6423ca6a051bf560cfc572ef366940e71c81aa302cb9701f9a5206e9eacfe9835bdacb6425d058022a27fe73e5edeeba98c7a3edb761578ab2ad5a442c2dc1cb3c143c6f18dbe525fedd2a9cee0ada3b2c116465c5cca9a7e5d4374b29aa4ad8adaff8d6b0d1ac3990685240ce022faaa07241f9ff445566b9e0463350792cadcafd5fdf5c37706c0025b3c627185b356d39dcb2244b15566e6e3f8942f730fd6d855daa1456fe294f9156c4b5131e5bde7f2d938ceb6c7f5deb0f847a98b7fd11a3f5d0163eef9bbeb83cfc96dd8eedd447901ff4d3a35c0ea1f691b01385eb39fd265f756bbd77bb61b1741db0502947b4b985382a08a5916da809a8afd3fb1d78d9e16f8e37f51aba100d031d9da8613e9cd2cc621025b47150b3e76775ab23412d74334bcd79746cf601407481310a923047ac68a4e6a7f7b96bcd85bb6f24e38f03c80ad41a0a581b4246ea4715ee561cdc5384a51a6fc9ed8569ba6b12bcd95e6202ecf834dd9062ec539cc8cc4ed64ab9ff85998da0e63161e7391b14de47dfde41523b6c614618bf2fd1edd68a5de1c03c4181569b6c361d955c637abbf4efdb5dbf2f0dd2544329c44b77081a48f53231fa9d4cf6f2186427e469d0cfbcd698f7e7cf773240dd2b807a2fe699f0ceb4a2339e9cde01114b2aa5c3591a82a3a27b308e1e7f092af8ad97bbe7b28d78ecd80c0c0a28372193d66bdbadc0b58e4d5408acace53bd5e12101fcb25754f8c545340fbbd1328287044a29d18f40a24b4084febebe228b67cefd970df6d44ffdc033a50534e5977bda660c589c6e3c3a28b4c500b29ff4a1c3eaefb068784a29914ecab7868a43999833b0b37ae79afe58875a0425262e0ec7e10ee8a6bc1c97d332bc2a6195de239a166486a3c1ad8de3a026e5b1757f9a778a511024a260c9809ae3b22d78f18ac483281a796b1ccbfe7a9b9f357d12d340e20bdf2037e8bb91ef858cdf2eb9d7161a756d8c244c55524f8f5be2e4f18641bc4c2409c14816846c4655be716276d8356e516640da49e8412fcfc7ac0e084a079129b23e54952d8030e1f8ceaafcd322dfb4bd189bb5d940ac83231de0585783387d0642a245183f7a251779bdb12c63e9edbf3d0c94281140598fea9e73e951ce650c984cfb1398f8813abf8f8827af5eb64a65dfd1305bccc45086438ac439a9265790fb225c509ce3c9d39e25d2276d7f3c06d7cc28d33b2c21bb38b50dca5b10afc09da83ba12ee878e0f6054e8d3e78d731671de4f9d5a7b97298b01f37c7e78e5fcf5188554bcf5d42559d3b15153bb3cd5a0d1cc4a96d02ae8b1b115d1ff617b6ad894ce0585f46a2a5f4cc1b83065c1d7b5d2f25f3f4bf9966b4c7d7156931861d5edd199c126f1ee4ff6345023419d0a4c87f3388fcfbecbb6c1e2f4745922b88085d21d4551e4c127eb423db87a51c9f9a140f8a7415dbd70c4b0173e687a40f895404f2203e14ccd61e0e5b0d5aa3fbd1c8affb5807d787d840916ece24c56c50d3d9ed9f19d73f2c80c461b5b3c07dedcdb41402c3826a958d74be48382dc741dcf3e0eb8955397da33941fc47288147736d778914a57effbafccd4cf293e6ed1c7d19b55433bc0363e41546b3638a4c630eb35dc6a074f90185cb9daaa6eab54825a4daf76f49ad918e90e5777a826d6d5d52f32f7ceaf818f87251ab4d1b5406ae94e41cc97fe022b144f26335829d9c81725b3daead621a0df71313d18214ff8dc687a7ab86b8eec3070ee1ca9f62005a0cc15ca6e2f4fd893de8fd91f6210f6c96a576024678535c962a2dab06f56be377dfa74bca089adb7327abd05c3ad7646b5e9e6fc2f29916b34c8642f3c0caedb53b8f30c2a77d1757103b7ed156cdc703911366b02cde87ce7343886987f7a8c028921a7b87c5c0aca7ada34970a6d0d32eb1b177ed8e64c1fc6839b9d08acec19560bf4a815ca6187635f0cabb8bf062e8216d3b09b7abd99e956734129e16a7c4f3beb850fe2b1548729355f9015c9bba336d3e26a27b3d75d75722f7a8170d15ebf77f325c97778a5a9d7c76d3e101eeae354e54e6fa60b58cbdd900751854ede326b58fa5caca073c630f3719d6f52afe675f10d464e8b58e5fde75a4f225063ca48d76efd1b645e4bc89d98215beae765601f635a3bc8cfc08d74722f3d95ccb4cb4e3ea977d0c534a4abb866fb9a31771222cfd998231c30bd16b6844ef71038b67d72c910cca40db7260dff0b74162449a9e2cf15d7dfbfb3a685080e6c83ff4341c95819c0317502ed49af7ae688b52c9866518f74d69b4144500ab9d5a0829b9287d5fb67b78801119ddae7a76e80be8c4dbcec7866ffa7d081406e51cf617be061530b539cca7e1ef9118cc06e8eb2a01425b45947a1d2332e360acd0654bba8f1fa43ece68467690d36f6802a32f03f9ea056e57fd548dd4a3225ad5006c6c931aef1990639498dc88a23895ff1f75520a8009dbde4debc20ecc546e378eb7ed5ea3740d2244036588471d96e4751390b6b76b39816d853944cb5677b493b36de9736ba0fa404ad4b3a7d7c54d0c15072c040064b871401b25b88559d059a9519c7e2446b0d110a4aba9c12555e5f620680d1fea2359bc85cd15b5c0bfd6b3715d647514118cd60483dbc9c83e285192108f4ea6bcbee1f0935044610c68d052ccaba23258d09465d5521e2664d59358621ebbb8f28a4627362c8397f0a9852e5d8daf53a961d4ee66299e2b54d8adf5134ceedef57011f810aea76262422236c3e1a478a759584c7880fb3f32389c4bd4b637caad7b2bd6fd295aefb150754799434e99e0fd45c1cc4698ab14d1f63eeb06e53797cbdddd45e7f87e85b45a3dd0df6335c3b1addee87ba953bde29ed98042d745c1465a967ef922993798966e1c8b96ad6f68404136be0caa2264e24d8d93aa1b99da9316c7780904753d4e0b45cf282b43a0c91bc9ff83cb25cacea2ea72563b2e759b69cabbb6a50d6a0a5ba545622e5ce576cc301ba35afadbfd1e26668782e1d741feed8aae894b564a425141442fb8470b325cf7c8e1552973463bf4e67a2ad58d15417e418bb91d2df4b1310a0a70ac744bbb4245efd2ae642609079a44cbf6be19809a5ff7ad6847432368c9749cfb336ddcc0e6f52a699b910cd24671f38af5dc39268a3c87771f07d53bf220b7c2d5058cc7b0bcd492abfedf9bb295ec304107130f0e98dacaac6dab998b511f176d48daeb81db53643ad194690b6e28c5ed2927e09a1e959c494b90db401681f67bf1e23fe9ef4c903f666ef39332a91a25c63efe9bc518e9aff61842007dda72dcc0264aa47543c0a8b1f0d25749ddfbed487282241140d4c64def1831c4d75ca975fdb03258ddd013445e08bfb479a516b011fe3a12e4bfca439407c0022889e46914cd41a4d92a25eaa57a55bc7337e5fbbd11584dca34adb5643105c8171e53cf04b1412c3107e72330ebf1b52f524b4e72570cfdc0ab179991f3782d05091ea57b1a233048bf062e88939cfeefb61e8beaa90395faf61c4d974b23723a4a5cd39d70f92620f8f4f27bc99ca67bed7fb6e594913991ca3025480ad791bc94a0def36fca491a206440ec31e32bb85850c3606c875708309be63c2b4f5c477521aa08e1d059cedaafe4fbef5523b79f88b57d0c81bbdd09202095f10f13e2609e833ff41b862b2214c22e8f2b04a363b38d26bf95c07b184b9f909ad3a92122e158d3566d2204b22d4f2f3ce11a65544ccecb01a4a5ef62bc969fddcb648224a5c7bd94f8da9a7d4df393d880f537a377888874c19dad357a0564d303a5c1485c1451ea55d68779dc0c11c7c38025660684ba3f70cbbab00d15b34c0f2342207ad548eacb32ebad95292e85211a8669b586d05b0d0b9f278a35ea4d78e97fd5dafca6b72d8e1fbf3e704a60a8ec60befe2e3e4d3d37f9d33a0feb88add59f0171ddeba0b79a52feb9a1f4a7a6ee7c6927bd10968fba788a807409346a0fccd4f7daac3c8591fc689aed881829d479e8d360cdb5819d5eac718a6f860f2d9ef6a0d36ef6e10efbb37819bb7b03ab7649173447b2cd47f3433a2422b1611dff91cee0b10c6d060d4e84a9e3f4dc194514cb67f1e3985be05c845fc92b41955d0f61aeba6268789998bbf341a8b37af48f07b13a676a11d27330529cabcd52365842be559857cbc2a63a4ea1c77fa8619040e79705c5b51f473e13b73fc09c28598e070dbbb63ce884c2843ec365d4c5bebbf815ee3314dde0bab6b0a71a398e2d9ee8ba2f832863fae7eb0c18adcdd17f1dee0df29a8409acabf516c8e6dfea5a264c1c6657f774c86a14cf96eecac18a41b1650a9e652c6c9264b03aa2fd30e333a9f24cd6b0313358e3c00943a1de63ca970b7da2cb8a0fd1109cefbf12176f5dfb59457480428b194e88449bffd8b8d87d05d30f9ffe9ac3a7442b0df3418acf9165b14242489a54b6b47ea543fed5de74a00f61ab2af553b60d8d21c76c42052c72e4841bd94cf88185c39287c04d05f6336ae581cf7528a59b2874795caca79f5600ac64ad5820a91c711ae5a1c3762028242c5c8a9aae89177ec4db5785cd07402d45805a2e2e970059e4e6483074df1bcc01f57470fb66f45ab475ebb5343b727168e355a6c25d42384e39802d7b4a8c54ac94d82de12f8de13630ec8c19f008f98c505dbbfb21b363472e23d0147d1ac555f0981e2bfd07c62d097acf930094dcf239a40699421b207ac2575b7edf9b1d772ab066362820c182c2c5097a47d1dd25ca9e0dd9c3ae94e9a8f0dece74cdeeec3a17803d5e11f037820ea20364234079286a7c291f3424292b0eec3e956513cc6b078a76a3b8ab42c5fb5efdcea1d438f7ae08507275b48f9588a15be763ad094885269efa7330f6fc9d4746997c98d9f5feeb6dff2734d75afc6a11196b35bb9fd0c0af428cacef0df2c5ad4e5fb4559f0f93af2fafad6fb77f453238f409ec71a912350d7b62952e4858927f620d31569242615345265ff1cbbd7fdfaff35a45732628da663bfff3d3af3d7b537337754554458a2d1af0e16aa8ad9436096f42e243109cad32fac1adc58d714cd3d0d8483c783006991f3da263ef5ae1ff2ea06584e45849d64a07170675c29f0b2abcf1eedbb63b6f5d9dba600996c7d5edce9ac69448d05c0704fb9f84e831b60c376b8a5d33ea22030e2dd3dd421d8e0a810a77c085a3861fcba214a8baf592d624d673fb34f906581d923d80b06186db8ce5fbef2bb750166f7556adfe93d4951a825d55b0bf92c9f25776df784f6aec808ae221cc98d05ce988fe6a13ff96083dba15500e149409b54345274e3633fa8f6685d6fed40c20a5c5705f8b37099a5949846ca15def5a6a427eb4eec72747f116366adcb9b74d3de0b125bdee23ca98ee6312f41fa3d9bba43a8d343552c969c41f766ab4341a42ec4cd6f4d1d4c4b1f16979e5389fea36a150580418d95520506fe0cb1a1d861e09d21c57d88c46e10a3c5ad1aedc8f2743f5c06f10d6da9b2bb3ec783c6f5788ce9400795022cdcec197f9dd3ee4cd26531e7f057b6d9418a0c52ecdb35a24a2a079b3d396017feca8b31aa55e3d5ef79c9ea9ccc7e3d0b47f28f273276666fa1763b3a452672fedc94557d984c3353344a8bc9fc833dee685e33d63540d0801d8068cf66cc48ddcb0d42cec881eae36fc2614f96ad67fceb5c98ec33fbade0e3049178d503c13c2d5d71f32f4582d1cb0f47a2ace578b903796768a906998bed2995798251d7eb92faacc19255bf12c0024a94971c185841113faa288beb7e58d4a98289630fb3d230f936eb1b9d9c7b94b5ac9d3a211c0b454a26e29bdffb522548a65e8dde3730918fdf0575245e71ba013ce08f6e698342a61a81b1355d2483e97c06462cae1cdc7787f4bcee4396a08dac9c14981f2a8f4614a31b019c83782d5d8370acf9db467d9d95e8efbe44274fefde5860c2333cf81593a2ada9f5bb6c2362ba97fd7c3e5bc836c327c66b57c0f023efc0c0ff6feae0e625df2f4e21057060170c844c86412700d7d337b1f7835a0dafee5206cbd76104c5a36623c7783213f8dd457b5e69a86b74030a27b3c30074242b1d97e65a233885a681ec5a8532bce9dca1998dc32c6b40dd997b99a6ed6288e0b9b09447e356bc5345b2133571e65d47db2c736a391970879103d4137cab6c0724b8e67064167cd5521f32135fb6ca43c1e118adcded8227c9dbfdc18cdce154108eba5d8c60e5362e8fffc5c9ae6ac2572188617e4ce0f432e2476c74a4227af64b58e0ebafaf0b1ce01723ecd36a2a4167b7991e28b6a9e81992fcaf7b4b906d0361add02104db83914f28baea26b50561faa46293ba5247e8263ac0347509c36405747866d2fa2beef44f366108f6a4047e282a477c28654511075ddfaad9b9844e18e67320a831e647d923b2720d65ddd9ece165c222231d3c3e7f0001d15e3c690e9831ceb369a8edf183133814bfd20dd25d50973bda58ad03c4cbda8008556fc653ef401ff76ee858c1f79a0b09b4232768e72dd06e42078923d5647cb310bb644feb24d6b7e9d1167c3676cd96f79965a066aca314089db60bdc40c2be4b69c569ec76b3bb74a43fe731bc869c9222ab5404304a513d4f7d2ec5af278f7c3d664fcde579bba7bd472bdc00a1eb4c46ff69fb7e45e5712919e8656a8887afa28cadd66461fc57f53d574c92105818a89f210d7e8aee6de2e78228b2cb03b850a6e77627f70f51bb919bddf61837a978dd4cec2db138c657214ac07b67134bd53b071e2bffa3608a0b0bac88b0ddcfc1ba4dea17191c9ad76ab8de72118893256a7e13e15a3bf98bb5757a78c58328cc4b380f3786f22c6be81884d213ec3cc2784583a47a4003a59ebea08bd06e290a892c937448e664dac672942b068b839593c442f6e1d22875e01859cd24c17d108696a3196ea4794ddfdf25721d3dd3e754d1ea884e5086479819452991403a39014297fcc734e56f8daae4d49d5c47016fc3ead550783df895542229ff3b034b5b722ae2a2b04ba70e42c174e9ddb89ffa60024aa16f297ac9383b2ccad53de4bbe4ea2fa3fe3d059d16b4b4fe9959ba3c4e58922e7fa2673f50be5b636ee7c79b445471ddf5b851ec3ac505980bb184c8fe44c7776ae9aab4e66ce31fe1bc00efced390a82f96b4866e31ba3ff832a25b1e1d00ec44bf525ae523b7102ba60c1d3a2e2bed004524afc90a064b325a258eb36315b1496c748f5407e922914787acb8b47bdc495e521518e0637eac4b1b4fe1adede145181ec7ef038d48c473d6f296b349d7cf874d329c71f272883eb7e77ff303957e159fd417d5055d82687448950dd149e1074a1785518ebaf7ac167e07f1f559893a20d133b59aa294efebdae1e19a30ec9a3e257203eb9a854096395825ef4d1e4ecf1f8daeadfa049ea6c435c50d67fd21c6f6b11a8be46502f0dda1715f5349df5330454316498660b7996432e679c73f1af33e529ac669496bde538890cc093122842e3e2e4bff937708dd4b1b1d3fc066a63824266461e4af9245032d690aac0ea5636c29606473820ee57b112e2bd68c0ce1936b7e76a7873cad678b26b560d7bb10a7dcad3f69bbf226faf2f572c105741a121fa1c55ff30b2d0b7339ed9aa4c9a3671e6e4b572800afcbc8764b16f0a61c4c1ff24c3b64992cd84f39d1a4d5532a7dbd9f7bc847258a33c509a945e53236cbc46b61fc6fad662c523eef0c1eaa4bc0a49610c8d09659e7bdfa858d2494dc3da0a54fcce229951d366fd17f4120f27ac77e5e6b777693641a853eacec09cc4dc08ff6ba22295acec61c5e6215eaf2a3a012461eaade8faa9cba630c5ce2bee6f1a4676d54b4a38b7b5cfb6c98106a4882ed88153a4f0bad3e0f3d04dc1ae5318e3b8f4ab1d122a548eed47f70edad1a164a9c5c3eb10fdecb24b0b68005b2e958980481834c4f673478d3f47d07836d3c1c513dd920042381f70f1a68671acee2fdd453a7552eba497af27127999a13a33104f0086390e01635d1a0b79d92dd43211c74047804e82d9ab26f97ee88e664871dab52a2a79443e39f06a6e8ac9d5e986252529b389d9ed0b2f55fb16ca65f6e90cc9a149065f499630f973996c1e2b6c53f2ab391b7d78cc6926b1684d066a3a74b86b3b633baaf3730acd28deaf18fb926e1ec9c1f8a2345103cc4cbec05345db57c5adcf062412f289607f5fa41194f69bc2f426a30c7a6f8d1027ee8dc96c9957e90fbd9b16475b82dfd8698195159bd7b4860004beb1fa85e6843eca1acbbb0b8c7ec0b865ed108e297a2d5f915304167e18d01e51497e6e3ea76ae99bcb849f7595fa74c2a6263e2bef65f1063bce05483980ed51eac5289307117f17e99d761337e9b1fb625a1b900e6179f3b02de57a0b5f52352298c8a2d2c816182ec169d2b9c0490097ad98e2edc99c6df683a4b5b6eb73ccee0aaf07e8cf8f2f632381ac407c5c578bc1c5a8d0915dc231b01b92dbd25c2bfd412995780582793736572f1e23ef690bfe6872c2572285cd737a4be91f4dcafef09232de77b315d73f5beb23d03625e031d2438081222b063c343f52565ae314ac47a4fe518b45d0c12f2ceabc5e05c20f607b97035afbe0e29249e47961d9cf9b385c065966b0c7ea91cfa9ed1b55a58b9aaa9de080ca05c6405fdf15bcef74177226eb225a47d532bcbc82a5ffed7fd86c2609b146d86f566d0b84f638d46d6eb696bfbbc62c4fc981a94c1d6ccb9f3f7ed7976ea7e8ff1d2a2d79986fb27f1401f25d5a83f64844fa9e839fc8855007b417b261d325b6e7cb124b27ede8ad18d2b6da8bfc4d4f50c3960d5a1c82e4557b16d05471602d2a31462e4bac9535c9a57389ae0613a674815c2ec10c19f529c9274896dfe49ab06889da517d482145ed8f57ba4b7c0434ce24090ef2459682a4f6342ecc382b4cd3409c3415bcb7f1bbaadfb7ec308eea8b6cb2912469b707c99a55c1754db0650616754735b85a41433a30b28e3946754f90caeb03c7579fc9982e6ec5501d6f23e0f2b6392acc435907d79ea11eb6955723a81c4f02bfc78e2eeb1d0408f8f06b4d2f6d20d90f7698c4e58bcfa993884424f8fcb602ef35d23737fb6aff220927e28c19043ae708fd9755256a8a1660d9c5827bab1b836a10aa23aea9c92fa3b25428b3791c5d25f3f1b63befd5480ac4192c966350edceea8938ecc608e0f063d16d427049ad62625f5177470e7a0d811e8d4273aea8f7377d51db07fc34d9f18497a0c2b5c0bc5e8778e06bf7460f0487eed54d661d74346eeada9090957159b86f8b68183e33d0c3fc134d87e068badd8789d4c7adb829fe08e4558bada5ef3f526afb2c7b6184244af0d07aa5cb525c519ed32298bb6241d900ead0532b0b1fc77a6577963e7a44627ed326741af254ab957ca0298a74323d2ee4f1bca70e20ff796491424e108e03c20f2eed7374c0aa2474a91f3ced6f46165c886a510734d606ceaa08822bfced69def33cea3662512fb42ecefee341d1b499b826ad882542374b032e907a7e6a4dddc4620a5d1002b5aee25711fd2dd6e9d4e90ee350f2889d6c1f4328e4b711fc919ef3c655311637b83b4eff39c157e0510807ec61714b843bc9eb22a0f4dac7e5cc07b8e9ed587b701d9aca2a239e76ac9a16338b74d50578956e06b1ac35ee3b822ca779922d89de7d915afd7d80831e8534b8f8a2eaed252fd862abc99aadde62d4520d9a7c3c3da86081fc36927de60e3479096a2b5025b9a789da01da969cfb0ab2f252c82db9e6663dce3888146b365080f649cf94f991312817147d8f0d1774d8d44ba4afd846060df2de1d1043659c3b94b1eff51fff84e5a81a0c635aedcf677285e0d722e3335449fd0f49a41264fb963ea5bba31dae469c789047812071d8853291fd8003cc31a8968ce7acb68a6e0172ba6ee0e9dedbebeb62143047336c5a91c77085afb01fc075938b306d7e36383ecdfda55b9b5dfdab53aa34000289c398f617a146c4a06404737600484d8d4ea960061ec2cb575dc485f65f275540d0ce7550da08417632b6f0f7d044f6f719ff839aa3e5c9db94d45225a1cf0bdb0c5bffa781572ad605ad37aa988240858c9493dee9f00ed281e93532d89aba5e9e59ec430cdd5edfdfc2ef65e094eeab71cc40b59c997943a0e0dbbc80f1e11834bf3b53153ba1c1f0ccf63b3c802439b2ef1430be6994300d9b2efe4b84e25bd3bf8a566d4851e7fff57cada544d722438e8980a31563ef0558fdd8db9bdd6f1a3e34f06104b680f63c1f80a08ec6ed74bca69bb1023fe63d24c7e7a14ce85db6e21173f2ddf14f233f3787a37e4b347e4d64907fc0a23c3da017c81c27df9fafd4695886d0ddec8c47982912eceef886ab5680a130bfacbf3c67bb4f0cc118274bdfed43bbc2ba56f048d6a390e48932469b30ac84fdfc2e812f32d00a85349bb22f2d8091e64282fca1b40811db756059de5d03861d6a22cfc6289097d23c26c5e3f000f9b34a0e1b28a1269d8673d09107b29ccaa1adc8939bdca312c69ae4a238f45410d8f1b27392d594ceea2a6b42899ee5c5857965b29bea1bc413da618899b1894f2adff3b3a7b05a626e50e42379f5d0e0a148ded33d815f59d1401b197a85656466eaf88ed30d1ad4a87985570291efbb3a2c6f22c0b111e65c843ca3c6179e94335f0f91d4696e1a31107948a042f55f264c32a35e719668483957c9c8e13fd01e5f751870a509f5f06ba41ad63cbd5f706f25b1e598f6c9709ee6bab627211bc38494962e930779ed4ea2a8471d309c4c4f0603238959cb13476b673489696c87ad9da5fef0d6467145a77ae0b1089c8626988278a85be3292680d9d7e4c6866f19b78595d611f15f9a5e37b3d145d5aff4a5b58a3286bd25a862904817afe8e9b9105584af15f54554ca5e7dceaa0fbd1111aae126d74f68bb6f0ce98094dc9a59a31d9526729efa171beda9ac5b7db9118aa94b9b5ad58dc20ae1c328e31269244d636139 -CT = d248b9e47c303f735b0d29f6111a742d93509ae051466688d56b587104a74fab1b259da64475fc0d2c3e28d87ca4edfeaa5715c23dc0e5281eb0c0c14e22182bb02f9f7d3c24555cd6a3ff766c774e67730a920db5f85d47dc23bbbee460f0922cd7ddba81ccbe727b4b489e79a19db2d012dad2a732273dafabc0fbded3c47dbe5b6b585570c39eb62850dc47f4aa0c29bf5fadf334041fdd4658fa6cc29a81192a53dcf47c03ddca9d03b33b06e5b3808be77925b7e7d8cf51fa939e023161d969f92430917d73f3aa10b83d5b7402410280561a27c376ce0b5151a51be2ef4eb9057eed25a0715436233615dcad1559fdbd81042544441857cdf46d72f5f50ee552cfd3bf166c530e57fd97f34e2e71bff8a90b30b4c4cc3e843b0f06e4eb2ff82675e428f5303aa9141dbeb615cf6aca5540fd7cb756fe5f9b08a4abdc6eb90b2eaef51c21eb9ae79a0e44b0755b3ed48f5e6e57f3148ce02501528dd3dd2b0bbec2650710a183e38510990002ce6498dc5ce7bf33d699dd18b66c0f8031d958b11d678674c355a635f4b5e8d863785f5dc2f99eba9ce74595493c017697344b651dcc2a0b1d5386b73abd8bb2dc77a2d92173d3688d0d704da9e44a6385af9fb3a81db68822b1eac9ab284f0155c20f6bc34af85d8518d0dfd32fdaece1379abca339a00e1326b624b3e4050be5db8dced5e6c4b88b82b6ee2a48c373d236ea3565ecc072e953ffe01b624c6ecbf534678aad9c3f8a07d7dd7232134b6b397d0c96ab5f795f9e3af65b96e7a765283d8081dab9f953113abe06e8d150bf9a8416d8932fac17b032dc346be43736dbf066ed239328803510f6f62bc8abc92f6df9a82c02cbf85de91739bc8d7805d392341be99798079419540dc952fa0d3ceca4b806ab1db3b717f0d720038343465a8bc0da8e8964e58634e8a2d6c99230af2ac7c89acd3f86a22075dc40818028f3c632b36a39c0e064e3ca2a078c617a3e73aaea56ef11114f9efaac90a3ec8f8d9b18921a80d74b09ada83efee127f41179dc6c19c7965f3e7f43e22f636534b123e9246172f9920f253d2a2652a5e8c337ff93b2d479bef5e96e972a9b9cd8af057c750bd711010d59ce065ad50fdd487b5dde616301d0ae6373b6f9efae99d8972f242dd7a6bc61caee70201869be202fd384a992478dfc133b84171f013244c5d17585934aed3b43b818926246227d255bf832ff481f5f8d074ab159a11d6d17ed0ac50f727b870db966e0373bd3b1eecbf9ed66aa66caf33ac57cffe4ac6df3cf7b0e54ac54be4f3d50f61b33557c2990c908a710c85000ef6fa62716960daf918ae3d81ee60b3813e65673bd911ce468510bd230b9c2d215afe86ec12e49e0ae87e4235baf3df237188f5e0af2e61c22a4bf77190dd5dc804b4cc330b360c3dc093ef208c37d299ea0cd2ba906084011e16ac5f4fc9646538d5b538a99546d34a4599c8529c1524fc4b394d6a9cd762855905233ed92e72c8b538372ffe2f0df7085eb074616c7e695d7de40779e384d5fdb49fe02385424ea991dc05c6ae813f76c673eb45d6105bcdcfdbf04dcdd20caa6e30efcf3537bcf72947e1ac37d1e8c600ba9238569a4b3afa590d61acceb2572da85885146a142c8f8c60afe4d53ee4d61f33c47e5a99da9a346bcfbd013754ef39a4d7f16c4c5fbfa53d7f180c16e2b64f97dcfd65349939b5fc167c7a78926f638f1893fe9a81e897beea3258a4175d14f41dc123ddd846e45a87f35154db8a5ac27c7a0fc95d3b3113cfa9e7c828f83a1f0d91ab7789c33be5f55ecbb8eb0c81bcc0fccc880011b21000e2f10773388b198ce79c5d694472d3ef6b2e55c342b29c70e4f33fe59e2e0bd3f9ef617733dd3329a0e426338d9c007bcdd382522cb96e59b223825a39b01b52809f5e8518f64b81c99022d8215b5c435d87cc1a57bd440b31a19b197b277b2072968595ccd64c135ae1b218046e27a7f2685d013ce3173efd07586dc72a28ac4792e804d44f9efd785ef005213df928560a20daa4c24ab07f081479270a0dcee3c26331c48a164e4b9d79a7c30c77ab06b00e9b72c190d35fb873bc095d5e6231a89b52a0737a99532079bcc72ee221b48f0d0d9ba9105f981beb4225f6efc1230d6da10fd2b58a65112a98e4bbbe1accd6e8589eb6d9c771bb911cccf42aa6cbc68d1976f0da7eff1e70277e8c5f83734ec1efb2b00708fef08e986bd6519a0fa4b5772e585ac8e37fd2a2af07aa382579498b3b75863fe792461492b8e71c4a1a2f4421705696a96601317cfff1632784b5d75fc2036ed3fa650354620781b9fcfd53f1927223fa045edf4abe7b2144512f3e3aee99f7ac3e46028bc2427aeb18e9cb40db57b696ea884658abc9b7bae0d8117f93074a3ef903528f8b55c7687cf9f0119a1f246cc9e993219c6384359e7e5e639bb294b264048060224ae168d7b9f1f795c07eaafcddb10b61ac2be3ab3e1fddf75c1f47559f38d24f0c773d0e8bc5fa85d7d33e3aa8d0f15583b8c1e7aab6f5d0e085b7175678bf11cfee8eb069b78220377819e3f4d28eb833d3d21efff543d5c6357fffb4a8fdd6ce399fca42e2d71c53c50f6b20bcbaa1650b57ff483837c39a37d5e978393c332b43021508b8ef27773164d69d0af3c0dfdc125cf30a7c49a7d8e5320d68a35e80cdfd62a0b7ce6a412f08c8062e35265fad5d1f226d590e9b068d09e48772711d7dbd786a38c0325b3d5665c2ff45ad0a20c174dc5739896ac727b34f11c7af299d36d30c69bbdc35770138cf891cfdd8123489fdef2dfaffa9c2548ebd60b0f0bcedff44691979b4e92b364753120364dc2e3b895095da828e8659575a85cca587ba05ca625480f977a6fe10181ab6ce005defbcd8894f8c71811909cd6b56eb7ffe327f46793a9e98bd7fe8951400276bb9c7607f8ba1e633034b73d7f0d040197c3f346394eba68c8accccefe05f59cb7ea9ab1ae2e172d8f466ee21c6531cec2c9dfeebc477a6d98195c28bccc1d5e23ae50e3a1ddd7de189e36ffe0e387df7be43427b194b16e18b42eacd517bba78edc9f56a2c7e89e6f13513718869da7c8c529bc337217a69e14e35cf97ff7db2c23700347f0a33ad25a299fc52b35f63949735ad864aa127053797541864b07168f89ffb7ba5c9a8bfbcb4248383a95f45461a7aee9c658c5679205f47144ba4a06175e746037b8cb6556f06405e0d537d0f2bcd898dd5fb987d96dbce33001a50abff5b9cb0161dbfe30f5df5a161ddd8a750b0cb33898c110415881fc81239f2e25440bca41a5bc46fbd3787e6c8fe8a463415cd9a82be368a02566da740dca8e40e686e1213d9c15de2d3556a1e1180b298ba3074b4ab93e469dd9a39ac0c8a173b04a5ad913e72e4d7b5ff520f108e1a1747c11b6b2fcfaa89b3ef7e669f8ad9620364b4f4f0f9ab274e76bdd631df033357a24723653e427324d907a9eceb3c375c43ee36cdeb046a6374be19ab04922da93d4dc07c5914df06fee97dd813f5fd501ca75e3c5ad53574837f2e51ba6a257134e8ee0f4127c59840ba8b1bb13592dcbe47aea50e453c7837e91bb12ad1c74fd0f149479bc0334c511a822145690a3a408caa32671ed05c2dd219ea360c67727c1fe6a6cd842301761e94bedc73f93de7091b8b6d2783a788313b2fa12595904bf5d1167a5ddc4ee151b1522de60b7293b72a62c4d08b396ed682b6a6262a212ddc8c70dbec1a972cedc09f593e21d843279561884f9759a593da7b17a147db7559f19d5d6f43ea98012872f974306037dc0d344c55403b35a5903f766359341bee5bccb696fc0fd1c7aa8803e4c2f9e6e23d386d3a202027c5792e355592efab9330af330392a7c91e3cacc4e645359edafd78b77829374cd4b644817322b7650696fa763a0cc7143f9ec7e2f6ab3c9ec2443b0c0b0a31e9eeafb7bb8c375232357f08256959a10a6d4bc98d6cd9314a2ce7feaa8c0eb1eeb15047f715d6ae9ebd64238d648ed6bc50617a360d8ff9a01aa0ce0e29338d34bb9612751445372ac6d74837c7d2d67729760216ee33476cce1a154086ec31d986cc5a14e86561c6929554fb280646164bb03e8e52588a1b947960a77d61c2d2499212a742e1a5b78805b5b64fed141d3c4834301b8a8bef31ce65edb539fd9469b590a6980d0d1bd29e34a09f87438059a09b1ea234d1bb29882e67599fc1e417db9d86332077cfb05fe440ad1243e26a67a0ea30e63cdee8850a543d76e810140547412fb1400ac87a10e3bc77d3918750a5cc3e7a0efbd736c7ed4139cd5855ddba47143362bf40b91fcbf27222017c1552360466483e67ed125745724cc713c713dcf7ef6ea3081d65d8d78b903382717848bee7410431e1040ec92373f75a1bf229816f55dcfffb6e6da33ed8e1e8b05f9348cdcd6938f053eb9f93e0de639e922627bf61a6688f9649bb9cdfce6236a176db8b9b53ce4b5f9eb9c0680c92128bd327aa7f04a745025faaf117a18d5664027ab0e3f5898b834e1a75cd4b4087637733416f8bac1ccd67cb4457005945676d03f76fd0453fdb9968643fec98d28da7c8cd7070a803b14a2459f073ea075fd023a896d3306fdabc54416e95907103cd2fb642e301c71cc48e8eabedaae356582761a14e0b3b0ef1de06002c2acf594c85820ae3a094e5b4680566b592221543c1dc5192d6b208e86b5aca91d4e3454564eedb3b8208169ce97e1632b864f1d9d4c4c4c0fd4bcc5206e8f6d64c7cdf212d718cb5b7c7ee21593ada3f33f5952e12bba4f46cb99044978fe75349c6ca735db35891351d7e5f02a93354bc45a9ec756453f053cb87430b3e9211807f81ad99b6fceb8ef1b2d655910e1f5fd22f2ee90e42abab230f8f39a8345eed6ad294a0d32416a253f829093ecae209bc1dbfadae04a373080f9ea8394a28ddfe1134309bb53ae571d2019ff2bd4be94f8176d90987fcebad323f0b2921b85b2610852973f383a2ff4a5fa82a77b13cfd50a33f29164a9ff409422cc4cbd772132856cbd08470b220ace957a6b8e02c8003d750539a38a8df19a5b662907b72e3098d77c2fc3ece0693b47ff19ce911a93b6adce75653d48ace6af10b8f1141437f9206658707b16794e349db3f1a02606ea167d0213ce3644f64ced64de3799b1729210fc31ba1811b0c226306f2466b230ae35e6d8fa11c8f932e27da8cb1bd311919bf9178ef08bb7a2b4ca2d2e6e9585ee9f916991cfcd4862f5de9fbbc63bee6edbdcfcec9173a252eb59fc6d6e58258ca8b2a4475acfc1e09a0c9566d23d92e9ada97de51895bfb0867c42025c8d089c65bba67f4dd84d7c5155a930329345cdf3b1d6e910e730df273e183190beb900344bbce8c3bdb13a7e4ecbe967a61d47921aa55bac2bbb24e3e03d386ddbfafb3b32235b5ed922ed6ac2c89ded1316b69079b826507d708a6cca14ce2244a67be90fb91ddcb0c97432703729bceb432bc856f5eb9d2f169800a04283b080f0e053670a21468df9414fda9f4153eaf1669a19ede7925f832280800f0063ceee34b9d3b0f8da2012525fa7927e76bda71954714d5f51405b920391eca2ad71160acef4091878b907974573b4cf1b377baca0340ab0e4ec546fcaa6130603ad633c3ef980e88d8f44ec5de743cdc6cd9e0e4cbdb97a5c076be9ada8f26bc54d711facec16a2401292cc167bb98cdd320ec9321414bd97498f6d9b54dbb45ffe4b3e3f88260657ee23e19de48a93595c8e3a289a02d76a27ceead05d591633464709aca117c26aa49b64667f2a3b6371984f813d7098fae7a6ba1841775b52314a06c80b4c994ef8100e233ab3115ba2c39b97f2d5082a145720ad0b12b8a7cb275ba848b3fae14fc0c82bf0353195c056b302e508982f73a8519cca722892482b9d9e6a58bfb4d862fa393eabe6aedeae1be5ed772ea3c94a0df1d9684a131c35246c68b32e46aaf89f3649e58b2e99bd6bb3923d3ab43cbf73b6b3d19fe3b62bef178f46c79ba85e23ee4b25bc561e8fa97f51605bc0b210b02aa28242e81dae9489076d259f17d25b93b0e8a2010584d907314e3bd55482f0fa43d37ae9535629d28d6f837360bb35ec869d2a959789dc49b9c8c515942a1e03650566b736551a5180a60279bdb0ff9c387beebeb9e59ed930b3746464a010a6f7ef1de3c7d76fc6899b1e5ed98213813ffb333d969ad72fd8537ef4e12ca7b78d35c24f44ac82da4a7116492ca2efd86ee6a4474014e72a5cfeee7f729b77cfdd1a5d10a03f3cf28f1d314fca36d31ef2ecb3cfccecbcdfd22367b0a0e04435654286ae3d4fee13f56bb7cdab40b4e1dd01f9ef857f94a67c1e237e24819949935ff3bd73b0461ee9020fd0a2db2cc6312ace97e4a8a33c295271453a12822db8d1438f22ed0d466150990dcb39ed042424eef7a1210c83224c856923e3251484a81a15cddb4d7ada8bb7968dcc8f85e39ca99ece8ce2ed7753fcee6900cc9b7b5691f2d67ef9be13f70d195bbd0047908025df01b4f4d581fd59239836578627d9d585ebe9b053d807e9d3ba25405029a148938a746636decdade02b1afb5ccbf2f0e14a27c98a1e130d9208bbf7da4bb4e572927eb348568921d4a3309a2c24f367c935c2a8e1524c3024ff350ac7da8d2849586817bc9d46a08a21aef035a6151e608ed93b1556a484e455819f9ac2fb155020738962e7255a82a0854b31fe20cdd351c10a33eb693c9be1a51a932e04d0364ced41ee1bf800d0c12ab5eb37fe52563666e52827720e856d4f24eb06e0aba446910aabbe36513f2274362fedba4c19398433029495284ccb499bb559a9cdbc94a0d1b733136969a743945a04e1d2d4e77fed21550af35f22651c7de802eab7a3942d7ec55a3a5002bde8d5cccc1d4ac4bb7f4926615fcece543fe5d9092d2c4f50d94fd9868775a072f4a5bcf2e5fd10795f7f172a3341ce33505ba68e7ebedc9c1e9165864244ed31bbe5c308dceff858cc42010ad8c281a24689cf2dee8a549b1abab9981d70a912174944b403ce664d8608b2f723150f5c12164e4caf28676e7a25c3928ca2a4dbe96355ef8f282e57888d40715df07bd8b5895549ad957e758abf868def1c1f5e260d26498616e2ac962bcaa33b879874569f198a91ce4e50fc50da77fea1df9f9ea900c834dcdd462d338efcf8e612aedebf254fac596507d175d30a90543627cfcef6852c7cda8b430e255c4d6d417de31eb5dba123e3ce9e2269867d9a94fdcd8ccac40a9451953085109f5ae0c3e04daadb4a2a47b0e176917660eb3c9f1aae0ec6b00635fa387e056623947c0621f0a12e86fac1881ed1dc1b9f523388d6b6596a152b3e732c561972879dcd3f0232ef0773a4fb195a90c3186c4688ea58967ce7f18386b80bd38e90cfd4cb899337ab27cba8db6523e979b4c449645bb2f320ccd28578bc7ec38f47225273fa61a2e5df97c4d76c556fbe2b0fd30e615f5fc82c3de7194caed9f5946c151c22b7a0c48f4a7cf78aa153414f2913c5eb95e3dbcea7ca544272cd13a1c52fa87759aeb430aab144fab418c835344605df3a044825965ca15de6ba0e59b2080f5844b2d110d71587e19acf14264cec2de5b8c77d18893215d1c1da0a940e7c2ee429a99e2633c216aecb7675a2314a09044951ca5a8eac798f8878fb5ea65f4ddccac53ee0c786e597169079fb6e8ceb37a71580b0904a97450909ca454a690821e249aebb75449e582fe1b30f1fa9f6464bdef654daa5ede6d4f223f4589ea25a25f4672cfbe974d51008bce296628556f55d26646e40b59f40e3149273760b40806ace3b5171e0b79865c6adb53513da2f24c4115de243150cec76107b48ca8da19117f00b5870e67eb8357e43c1b7b593c9875795d46ede26a109e05406b69fda988947e49ab195f22454c3c743c2ec51b91370b4df8d38653b353e51bb83215d122bcfa591009c007bbb6124bc590fed3f9c5699180b3b1424ad02f7c90a149b77d22dea5c996aba675c2a1a20e206d9c25d9446247d495a26486c0d0bfb09d0b5a1a177a09fa749dc36cee73af0116a6b779c2b827512a04ff0f60b483edbcdb33d2a18339463c498ae67ffa9da0aa3f3beb6bc99212f9e6961afde89045520b1f3f2e2761666a333d76030f443f53322f099035584a60978ef8b49f46d7d4d8c5c758ea52a04b59c1a3a1c2f9df3f3b6f5c45cf4b3547043b18c1d615a2c965c3918d090cc72946e8fd0b938e60e03464f4bc71fb719a1d173b0931930e58bf7f6d4403971d36b40f83be6b57244a7029e1d41dc908764d57a5442557218b509faeda4e9fcf31debbc54ae671ef636871233f29e0013c0e33933543f4b59df1978ec89b109c3977b0cf938b7f6166d6c93be5e87684a703c8b7b5fe1a8bfe153a179b55575ff05e599b39e32ed10d958699a1ffe07136081f0719b18c69dc74f66f211103e9c544f3c81a88ba9f66a9bc7017d9ca9e2cd97634052694a598476b99daf1cdfb6122869375ca5873d32d5c1e07d9b5b380b4f09dbe04478cfb1a13853eafacfed70c8abcd444ed095f78d07c0e8b4093be95c3aa24b2e5b6bfe3a06e9d2d9fedfcfeac4cea2490627e6da6a5cca383351952f654ce2b0ad359c0f7f4ad3f8d1d4a030a947d4a2e417bb79102729115cc8b6558c3362b1d805fb48ce4858deff97677e60375ed13e150a12ee7dcc8ccc64d9710c7f516555c1f7a1a08f0d7c6fd21f864fcf28c8f748c40494e01fc32006f977a5100577f86a484d11b82c90cfe6b4d6b1902fef486cc6f3e033904e150e67283e49a5382961dabd244412ca9657b48796e476a82443167e277d5a65c0c563a6abca77d316e5d3ab639a1ecfb1110af2d29f146508bd9874486dbb56328d6f59479e2766692821660462aa60b6bc8a710707ceeb0ea6429e5113e03c9f41ce0d69c7589deb547527673e8a9f9a9a74e9e4bbcabf2e306b35504c1da99730ae86e94cd047b2e6ea5e97e63a492430d37ec446434fb3b066adde08b17d7d903ad194a4a863d6cfe181a45c8c97b5062bf7c4e44d69c0d1a7e1f5029b805b7c21d1b5e56e697999a32557870ebaae8d87dcb5ca5eea2c5547a16b3f30ef9df8df821028c106f86e091050ff8b6ea4171e59dc2592d405073bea53f8ea62edf112dfbc7ca69809db8005783d63557d3d90d123a944be395c1dc3b5e1476dff188346327769fea65f3cf9363e88ed67335870ec8ef13eb9d9ff5317c4e24dfce9d11699e5f47b4233cc8f9d1b915e716a5730a5898ee65d30b1628b484a5e82eda95a590964a8d8bc89dd3c5cf6c4f9137b8c6ee9d6a692e0c0d1d858dd5b3c12de48badade4d01bff312c56ce3ddb34b0fdde3b0c2706fc292b9fac7e1a0dcd0b6534c968117f7de15eba84d2754e4bcb8093a5440297605598659f686075e2b1b464b6b3ec68abb13cde263b1c607545c45746338b9b207b5c381da690f653b35e363e1249551ad938b9fd7b0a944151cda07127bf9ba76958e926472f4aa1de8512ce834cfcae5414b226f23acdb1fe5cf685d2201b78167ad35fc1da282744c2a43cc49d49242f968f7e06de14455e7ef5adedc5b33184346018114e2d1fc7a5349e378da9b2af5b328c213888652aca9f1145363809eca7c1fd8e64a5cc3255418736e048a731f3053db77971f67014e6121a8e464833e5dbd02ea6caf385e43e9f378bfba657986bf852b32adb55e35a2675bfc8d70d43a902032a61f59f57dad2dd7d7963322136233200cb9a90c952074e9ba0fc0654f1b6fd6f7f0eb77c0fa6d8143213ce6e8b0c178f73e17a7c64839f9bebca2fc955ea8ae406a13b80a9045fa8d129fd859faa46fd27c48bde7b890f98ee938c0d78889f84181ae2f5711304fe554d4251bbc6437ced59d577a2a1f26da736193c3674adb13cef9f4cb4aa6585c4d6874b0309ecde300493b1642c595746f09e03977c8902f3a4a877db1153b248f295a0ca2f1e437d15fcab8fd77c5f967304efb5c4920b990674ae61b954af40be17a8559dc377c591b68067fdcaf2d27bd9a22041b981a84be3de50d5962b58f8c4a22fa05192c5ac99a0a9423284fe62a3a59f085136cec72cda2a53af106a2eb5bda28b6e02c299118cd91714c2e7d045346c78d9ed1b41c73231a21e42c298949f70122277f4134ed5c56639edbf3c3e717310e3d1f03dc5a94e64c4ce148bc5c6bde64eb80b17d5979892786a31225eb89bf9f5a582bcf65b83ff7aa361ccd9238d144f6a22a3f77dd8a01382df4ee90a2057dd310a6b0c4b81dfc92a2cc0c606d3be8b18fbe64ddfdf2004eeabea892be2f914edd1edd8e8829dc7704d71bbaaf08c41824dd0f4b34c9eedead9e10e53bfc6fc0bd37417de0c5c71cff0754d672f29c262d8e27b524427e12bc4e4705ab311d3bedcb1ddd09a3ca0c268c05c64951b7d724a9dafe4d249aaabda91d68633aaab845bf78f9a22d467c7e0c5fc70fc9a318b01d7492efea7fffd329d70692e76647ae665c62b280da0d62f870a52e4dc4cd92c9150c96aab16f8c23475e3152d4debb41b6756f000c3d8aceef18b49e295be7a71da1eeadf4eb96509d45d7cc42af4b7013d8bb445f577e8d4cff92770b8ba0e451f3e24c6d981efdb68c7f2dfafee40b8a425955796e369f0d4da3e998c1626ae0fa583334475f1fdde68ca211c3f2e9afb003f553191702e11f8b731c89ea26059ea4466f2bd0a1a5601025ca9417006bca5c9a57dfdba44c603ef9ad38922623b40feda036d84425c47fa42973e348a180a7570e1215044c375313ab08d6f521052dda415707ebb74d6c4774e039bb04cadc2799224bde1802e2ee2a018032e3a341700c0fa2aa28bf93cc479231efe7da0e9f68e572415348c08cf648117e9b6d1267fef6617f5927252c86cc087775db3e30180feb5ce7e1ac9c3761161e07a4853aa6d97e525aa88302954cf9390fde81f8e11d97a11c79e3bad261364c18890dd1f8fc71127edefe3571518a42be611a46a0426a33221aa25a0ae6514daaf96038cb59aaba898de49e3b215a4464e0af614e638c2d9b6e676ec427fc906bc516331a18121f306a5246d179e2d3d0f38ab8393f7ea5a2d24585e7cca649637b9983924a15483c167e8780f8dd7aa1154cbf731745a8d8d54a8c4f8d854371bb8172303f9ba3c8c7cfe8c378ee56bc35c6376aafe907d3294ee9a8786281b7deff78ff125761f1a31d0e8fffe04a52a7574eeb8679670ca3bfb740167a559488d4337819613d32752d8a89013622f6a8d70f3c64b84a4215f4b7bb282a2d17c36a326167e3270757b8f1d9a0137bfc5ec278e8ca35a69e49779cfc25b95a89cc18732b5b9d1986b18878c57e118506909207207ad0b4edf32fb2b35b6e70546f45d0849bd139ffff9d8ae547787e7b51403b54f110e2ac65468cd0910d80a4e321deafd46e9af19609bee1efa41b762b8ace989dd681503539e7d9948664cf7a73ffac9ce2a34b514253c4f21bbccd38057a6d68732930dcdfc9a32219b53339d100db0037a8bbd101e71f5054f3 -AD = 7b3b9c07148fcd897f657ecfcc87e530191536b8e77f9309e8d7323888b3b21477f2ab7c885c105d9c29ac96aed23b366f9fde4177401b7038c6770c7bd2ee8b4335105cc0eab9e367f0cea90d6f1ae3fa76cd21ceb9f3500ce7fb4b2a3f9e90f900a231ec693aeced7afb6821391d1f5b1b957895777aa7a2b71d9571c00336f26d54d756392cdb74bfb67d5a621d517db20441f74d0940180baf613b09452f64224f8af7bbc864ab4a8434ff624d0c0646ee07132fd376506951899bde975df8c836ab4ed9cc084f1f6d500ad56345d2f250a0d6991b9e458c62b6023191f341c8659e8a38c878cfac12b032674503df9c9bb01c4340c709eb6dd7c74907d769a317f4dd7317843c47bdb4c5e1f07f2380d464b0c47269389cc8a43a09adba86f6aa8f44c8fe514e73b5fe8d344769c1aa20a4538ecfbf47562ca79fa497b0f02f103f75522db9ead50d56dbe86997d6085f1b5aa7a4cab9e51a1247ce4f724a14983b6bafd17369fac973c6be268e20d800de870928e100990ebb0d3bedfceda36c64be3a729b603bce677a49e8caf282c9159b6e3e1e775129bd30dc3f5c9849535d86a27474be03bb5749b4c0115e2614f8feaa7405cc69b1de479b3b57e551f876a9c8c57ab9879cc68bb2ea110b2e77e59dd6a65eaa67cc4d4b2f4d6e646b2a298d3c80fb43969275d4414734e74726145dab06124c040656c39a94846e8fd58d326f4f9eafe5b95d85254765a21993f55070fcb9e85db5d42ab6b9464ce66de3f236dd2a0a26c4e5535dbdcd6eb350209a65aee785c6647ad4103d092a8ac932470880eb314f7c98cdff34fdf35ee2d36f09bd443b5defad7a5acb9df55965421fd043def6f4771e1bb27385b30ba22c0d8972aead6b654085a7dd3b60c4004a0dae22e25100e54e0badd0cadf909799329ddff699de8066dd6c3822d80c73c52d87e6fcbdb2dbbf852e37804b1256e23e76dbe43f30be4a577bc23c7941a3d708d1e1f579e9c6eebc219c74768168f6790a41f883790e08cd1e88ad09a544eb97b3d1d5af67eea666b9c027e5c7c976921189b955a9e605f6cc9c012c1c2e197c5b02504cb9ffbcb0f3ed778d540d5194fdf5d38dba6340c93da7c5501a082689616f337d8b59c2a92c25e777515726e1d7f6cc9552693cc7c30f1294b37f97d49814250d6c1e3eb335c5d214ef3641739d508b87106eaaf367902433a148ca962ec694409acb82d7749e1c88938ad382d0ca6e6cbe8255746832fe737c3e71dae8397f260c98d4a292a126ec21935c24096d2f91ae114194af659455d8a4206197495a28474dd2809debf5f550d77ffac2b0db521559910c352f23472d7aa9f4dbbdb158f40aa36912cbd918ae4c642e76d78d57ade1075c4fe1086ddee3d554353b4693bbcef1cfa87e49890838c36156af0edf384b0413d6d7aa -TAG = 51cbcf4a2fd82f221de1bfebf86a8c24 diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/tests/aead_chacha20_poly1305_openssh_tests.txt temporalio-1.3.0/vendor/ring-0.16.20/tests/aead_chacha20_poly1305_openssh_tests.txt --- temporalio-1.3.0/vendor/ring-0.16.20/tests/aead_chacha20_poly1305_openssh_tests.txt 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/tests/aead_chacha20_poly1305_openssh_tests.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,281 +0,0 @@ -KEY = 247a041f6780baf0de3741aa4436024b6a5169b0eab8a090a291f5900bf566a54ac2c64c0f38cab14a143111bc39d1873013f52f2e92062e375c1a5378ad9b32 -SEQUENCE_NUMBER = 94 -IN = 000000100f000000000000000000000000000000 -CT = c87186a24d89e672f37df98a95d0a0653e9f0fe4 -TAG = 075bc727e855c8d487bb3060c42267cd - -KEY = 50c985a29c39c3b75d6326e5f92d2bbc1341ff49b9eda105a853deab9125de9217856e27887b29b61989b8ba4f4169875f402289aeaef239457eceb8e8c2fcf7 -SEQUENCE_NUMBER = 52 -IN = 000000100e610000000000000000000000000000 -CT = b6cbf6d61986eb477ae0e4edfab641effc148824 -TAG = 7b476f69d8abc8b948ddc5f45f422f8b - -KEY = a1c0efe5bda4f6f95a55fc739c076d03515efdd22681ae0317e859dcefc247f0f5dd24c8cc30eda86adedcd96ca276ec446d84f5de6361cae806fdf37e5adfd3 -SEQUENCE_NUMBER = 83 -IN = 000000100d616200000000000000000000000000 -CT = 86805874b9db60ef614a96713a0b9bf974d5e615 -TAG = 3842b3a4ed2f1ffe7718d64ec95a178b - -KEY = 558f82aac8b8a7325dff1142bdf82956d2f053b6e5fcecd15f4a093896c5b15d35f695dc4e1e87738be0b8ef857c18d11d4f028fab34294de24434edbb03f01b -SEQUENCE_NUMBER = 167 -IN = 000000100c616263000000000000000000000000 -CT = 38a55e905cbafa6d79ea8ea269954314e5412a14 -TAG = 243b307d2586e8c8cc110917b18fe542 - -KEY = c88f4b95ac8cbe01c25868d57ea4f8566a0c4f2121d148de52e767eb9980e3c1c8d9a59d980a328cf7b44aaaa02b316872373795cf455da89e606498378542f9 -SEQUENCE_NUMBER = 101 -IN = 000000100b616263640000000000000000000000 -CT = 0d71526d3966e7c57786197ec4b06186a366629e -TAG = b89cff146eb8c1114a8b2e106c26ca66 - -KEY = 228780d2a7509f7a2558c2ec404b355ee7fc3028280d632b7f96c0a3eaf6471d9d2d16a79719d371ccddcc00bec9df03117f0383cbecba12c234f49fd2948c21 -SEQUENCE_NUMBER = 244 -IN = 000000100a616263646500000000000000000000 -CT = 1042673c3c557a61ff50d5e0ec36d1177c05442e -TAG = b9457a825592b0f7e01f9e7d697ac16b - -KEY = 163f3940226dbe821210e403a333dca05e061bdd17f44d33ded87c5def0cc85f11d8aaed4635dd7a9e6b982a67eb3d6c396afe455b483ed4c84e41e5d4e46565 -SEQUENCE_NUMBER = 242 -IN = 0000001009616263646566000000000000000000 -CT = 8b73429d2990476ed1842d4acb3392b217b1ce51 -TAG = 7cd635f03f9febc0debcff7a42aec7e5 - -KEY = 3898a07d0717c3143bb90f8073a78757fa39ae936fed0124524c4871e91d0e56b79d645ea0e00fa5fde3d725af662b1c5fdc4059b5a07c7a6824b4c19cee016e -SEQUENCE_NUMBER = 224 -IN = 0000001008616263646566670000000000000000 -CT = 2ac8116b7d18ca54995aba0651bf9982cb1880ab -TAG = 7a74631c17148c06bdfa5c3a66459aeb - -KEY = 31bb45d44639c499ac5ea60c7f94933b158ce82b2479149fb595654e2ba9cb7f710ba19b35c7a9150a1478f027adc706be98b3966462579a2c784887420033f9 -SEQUENCE_NUMBER = 51 -IN = 0000001007616263646566676800000000000000 -CT = ee8570b7d96a494cd4aad090710e17fd3d46c46a -TAG = c5e62468a33c591d120b73967b88291a - -KEY = 4470511419b640eccc103ed560e05e910f7430cfa22cd06eac335a6e30e067adc1305400c0585130a722f09dfd9728aa20c1b1c91ee8837165dc4cf10ad1105d -SEQUENCE_NUMBER = 86 -IN = 0000001006616263646566676869000000000000 -CT = 6374e59fb470d35c74912f37e574ded425263d81 -TAG = 9a2ede4f3d52bf51d096c351b259802a - -KEY = 166da003239df87cdb35f27804c9ae0c9269ca901eb322846c91fee8febff944c10b1c092012d0beb6e1d95dcc383bfbea85eebdd63e5ff39f584297e7c737d3 -SEQUENCE_NUMBER = 242 -IN = 00000010056162636465666768696a0000000000 -CT = 503cf64139aa6cd5310579bf7b22ecabfd37945c -TAG = c199946b567076d4e615311fbfed69b6 - -KEY = 389c2acc794e55d888297a63cf65525396780ad225ea696e8d6d24852483f71ec6d47e904e75d823902f8599453b548ff42c2f6c847d041cb9a89f3b0a530747 -SEQUENCE_NUMBER = 216 -IN = 00000010046162636465666768696a6b00000000 -CT = ef9ea674e7908aed8fdb9128163061dcb5d24f41 -TAG = ef9900822dda3f698bfd4a57c77498e7 - -KEY = 4a3042e117e06543aeb7fc450dab16b8652fe0a79378f78d6cb0c23f50bdbf4ac00c92a0b330bd035d6cd3918ff1daeb65d0fe329d88305f0728661dccd7278d -SEQUENCE_NUMBER = 204 -IN = 000000180b6162636465666768696a6b6c0000000000000000000000 -CT = 60bbfcf8be81835fe6fa7a1e482a0a6fdd8d11599c3786e3c7976893 -TAG = 411803ef2f1b4187c1019fb47290d0d1 - -KEY = 635638619b3f7fb60edf16361791d85b87a6c0537199c41f3dd087339d2a6699845f6e437879ac929a14ad12721c56b30a98019e51ffcf6f1f0d11028579592f -SEQUENCE_NUMBER = 51 -IN = 000000180a6162636465666768696a6b6c6d00000000000000000000 -CT = 0448a57007a3fa04f64ddcfe19074d18fa8fc9f559f3e4df91df5af9 -TAG = 2b26bca6a9b3e8cbe6f6ec480a831382 - -KEY = 9db759c1e3e2223ee1dff2c8fb3b17728b40565160de8ced8b5b9d45a7f20891fd3d98fbbd42d6e7f518b9071097aa41b4378e64981e928735ea7b817720256e -SEQUENCE_NUMBER = 121 -IN = 00000018096162636465666768696a6b6c6d6e000000000000000000 -CT = 4ea47a2c6b0b7a8f59a0a8ff643d914c4253a8f3a3489845ee1ec041 -TAG = 0e10c42a3328aeb49e6b4e3ab3fe31f8 - -KEY = d56bdf0abeefa000a0bb483abc5e510f23f0b57162f16eec1d3c9a6e8384389d59a9b252a76eaeef7fa420009fc58a2d57f33a9bb1d56d04f2a15b38c394cf36 -SEQUENCE_NUMBER = 222 -IN = 00000018086162636465666768696a6b6c6d6e6f0000000000000000 -CT = 60037819e401c7a4bb49be3e12c58406f571ba2bc3af39cf336759c8 -TAG = 15aa3637c6248c7310a37dd7f95edc95 - -KEY = f0d219074fb736b538e642cde19899cb25d9da4d2e2ad1f6ffca03493080f3ae53a3f2e6eb17ddcb47921d8d0ee8d4a9a7df64bd4c82708469dd86249897f8a9 -SEQUENCE_NUMBER = 89 -IN = 00000018076162636465666768696a6b6c6d6e6f7000000000000000 -CT = 9303e62a70c4bba867d816f29b08fe05871250fa619c9dfa185eec37 -TAG = c5beb415452669e7fdbbfd25cd2082b2 - -KEY = c8af470f7b3e22551209d91c47db94fab3eb93b854d220dcad4495f72ac548f0a368090c1b3860d48584fa3e62e5569bee3559147971dc962d80096ffe7bee08 -SEQUENCE_NUMBER = 214 -IN = 00000018066162636465666768696a6b6c6d6e6f7071000000000000 -CT = 9536fac8b646ee969df606e6d64d40fbe05e9b495e821b300038c041 -TAG = 8e422bb115b662a6a4b11e713d598f24 - -KEY = e68567491a8684c2cf71daa7ccf99c186a79b6cf328874f8a5d656ccbf6ed2c0384d05cc5ce49525f9eb9953e09ebad5d6fec3007b35c4700a0d2996c16c8884 -SEQUENCE_NUMBER = 162 -IN = 00000018056162636465666768696a6b6c6d6e6f7071720000000000 -CT = 5cc13e4c2a33f124ba14fb839ac8b209fdffb5cf9849db01b7985e86 -TAG = 3289f355b13403b1bf667d63afe74d7e - -KEY = cfcd2c688a4a02da67dce7bdb1e3bc2a058b71ea033e28fc9eaa779602ed10c417018ff175f7e7530919e9999fef36369bb8c5b82983f2c8b7bda8c2ddbfa99c -SEQUENCE_NUMBER = 201 -IN = 00000018046162636465666768696a6b6c6d6e6f7071727300000000 -CT = 893c85250a37ee0fdf2a68a47e80c2c763c9bf39a8b51b0c800e5329 -TAG = 4fbf24214608f9ae7c24ebe720b5031d - -KEY = 82891b6e9fa6c259413a2893df1d5b931c421e779affd244b7d7e380c1b6f86bb653bb308de56e6460ae29e3baaa216434c53c1edef973ba4b6a6716a50f2584 -SEQUENCE_NUMBER = 15 -IN = 000000200b6162636465666768696a6b6c6d6e6f70717273740000000000000000000000 -CT = ff041f7e3aed8e76b2e6ecf6808453f618d5335b26f390181b2466fb0fc15f5b358eac7b -TAG = d74db4633f889ab3b79fbfe3b63ac92d - -KEY = 8e293454cda0da79e46ec00694bcd1d558e37d007c80e8cad3545fd9204b62780fae8a6a7c274e251d25801772c3bebf971c7ef5388d7d5872bd6229a8136f2e -SEQUENCE_NUMBER = 99 -IN = 000000200a6162636465666768696a6b6c6d6e6f70717273747500000000000000000000 -CT = 5314b3c960fd718e5db7cfe620745e4ca000152d4d6fcf4e013d8fb7b3e694edee9a0c98 -TAG = c67158f2c97f55741da930c1539e447f - -KEY = f3e8f40daa829cf112b6342733fd00a9264db1a7b9e570f852a1080efee3885bcfce36d16bc90dc0c1b0a7255ffe341d243fbafc0159d28cee444175643a7981 -SEQUENCE_NUMBER = 98 -IN = 00000020096162636465666768696a6b6c6d6e6f70717273747576000000000000000000 -CT = 8dc028c1fdce0b24ac16b50d1b06a1b2eb870c7c61b018cb4db8af1762e776189e128860 -TAG = ec01334504efbca042d3281c59227a0d - -KEY = 89db04faedbead197f637f6de4efec82844a8b0cafae5aeb3a575071a5cc288bcf25e901c45a836de5cf491e2222c9f3c61a75bc709587edf7a2b087aead865e -SEQUENCE_NUMBER = 72 -IN = 00000020086162636465666768696a6b6c6d6e6f70717273747576770000000000000000 -CT = a911e28f149ba1163140e033d85a18d99da72f8f89130cbe65f5619eabb8711b812de08c -TAG = 943f28926c39ea16d4922d250d78620b - -KEY = e8baf3e7abf88dee1331fac29a671c3a9e082335249667fe40a7453ce5ee840cd9a1d0915f008e5b8f1837282888ec06293ca3f26b586e09fc5e59f2cc9d46da -SEQUENCE_NUMBER = 229 -IN = 00000020076162636465666768696a6b6c6d6e6f70717273747576777800000000000000 -CT = 2216092216da36450d9289f0f067b5260ee3c02a7e25c6af3b1e9bc4b46c8fa384b502fe -TAG = 898e5c68627311981a8c0464da16849a - -KEY = e0f96cc3aa2eab959d38963506fa998a7af61b8497a92b6bb5d5480c86cc91f29db3c7bc9239a738729bf59b61667e0d461ecc5bd55826fb5e5487889726a9bd -SEQUENCE_NUMBER = 68 -IN = 00000020066162636465666768696a6b6c6d6e6f70717273747576777879000000000000 -CT = 72fcc3e97bd4d7d1b012fe3db46fd4a5a8ebab38dfb690b5d77f0db0b6ebb839b8297535 -TAG = b12ffcb38bc3ce4213dea2d4e234fa0d - -KEY = 25d7735519841b062d5d80cc71af7343e1381c495a845fd8b16afccebb11116defff108af7bb79f1ae1f94f2a6f99ba803008cabbfe6b970083512d6295fb1ac -SEQUENCE_NUMBER = 75 -IN = 00000020056162636465666768696a6b6c6d6e6f707172737475767778797a0000000000 -CT = b21973084ddee1cc3a39fd30d0b079d4e7a230941330a93c4dc60cd2f275a79f8c591cc3 -TAG = 9d2faca7ad12bd14ffe7573671ecb8ac - -KEY = fcfc5287ef501bb44062700e71b23abc15887a1811078186e8bc5ecdd89a14daf34c48b052d1adb0421075997409f0869f3b82c2d57e4cc954e290d95c3972a1 -SEQUENCE_NUMBER = 123 -IN = 00000020046162636465666768696a6b6c6d6e6f707172737475767778797a4100000000 -CT = 01a66de55a4ecf37f34cc817e7b3915cb0981ac8b9ec79fa21affa63190de50e313c31d2 -TAG = 3e446d3cf4c6eb1c417aee561d0b9189 - -KEY = 1512c3fce6b96693b7471f4d4fbf6e874099439da98b60eb5fb493315f9e0f2da9391bdabb811dd736bfd7d20a233f78f473f8dc094b4d15f69561e4178dc8b1 -SEQUENCE_NUMBER = 221 -IN = 000000280b6162636465666768696a6b6c6d6e6f707172737475767778797a41420000000000000000000000 -CT = 98f720a10212103d0f87ef434cf92000a8449c00fdfe9f61006f13558b2f38b8e1956a8e613477edefc59784 -TAG = 92c27399431a38e15dc6ed72d0c25732 - -KEY = cff80b763e4901929b8799656763e132d034ba9a073bef211d4a759693a961c6b97dac140e6612ce1b0fac7a10d0a10d8277cec0878c81bf181ea66728f29b0d -SEQUENCE_NUMBER = 173 -IN = 000000280a6162636465666768696a6b6c6d6e6f707172737475767778797a41424300000000000000000000 -CT = 0dcb2e7e213ed8c9d380134d94992f50287ff485254d0d066ab47c06499847d8588914bf83163ea2f92d480c -TAG = cc0a9ee25ef053e75409b1f65d76618e - -KEY = 570216cefc554a08864362d11a0df5fb80cc8a7d72e4934e3dfa45cd8862411d7cf2b1a07231264b6a953d3fe5cf0871192d41a4514558c1c169226160316306 -SEQUENCE_NUMBER = 77 -IN = 00000028096162636465666768696a6b6c6d6e6f707172737475767778797a41424344000000000000000000 -CT = 96e568fda7a734f57c1da802bb81e517db255885a7270987e3fa38e0f279d072b9ef99cd25de1af7e871ab41 -TAG = aeb507091dab6999308d81b18854e144 - -KEY = 11353b93163bcdc55f3f53373a95760a458a036c18b70f4cc7916b6f48ff686b29ea0def8d5a1fc52b4e30407edd25e2c3baf6b24fa9f585d141aabc2e19d832 -SEQUENCE_NUMBER = 165 -IN = 00000028086162636465666768696a6b6c6d6e6f707172737475767778797a41424344450000000000000000 -CT = 3f70cb60c11c579b9a8e254a70b80a6f21ae42ab41db8123e9285b0e0dd300cc69e251fd10821dd909d23e0b -TAG = badf5fed288cf6657cff798ff252c85c - -KEY = f690749ae24d2d5e5710a46b2d3a6eb929bd0cd9ebd501b7760191dd104dc34d1787205f7da01f279913703a8ab6813f8d265c2b2e93e35cf81c750df3d41aa4 -SEQUENCE_NUMBER = 254 -IN = 00000028076162636465666768696a6b6c6d6e6f707172737475767778797a41424344454600000000000000 -CT = 1bd7494c9f159342b1eb72ec456ccd2a81d62e77befcd8f86d3132c625db3060feb742562bb9b6a48e952df4 -TAG = c25f2198717e2fd726dfc00513ce1b9a - -KEY = 16c94fe1a75e6b0d40747a8afd0f0eb6c93dd4508fbc769d2b1e0c08eafdee3e067498792233dfd1cbcdc21092fb3e992ecff738e02376eda848ad5faba1c263 -SEQUENCE_NUMBER = 145 -IN = 00000028066162636465666768696a6b6c6d6e6f707172737475767778797a41424344454630000000000000 -CT = 07743e9894a44db0f47c3eceaac0e24a166920e97c8ac18633fd0c0aee798f73cff483836241dd2c938bc5c7 -TAG = bfdc5f251698843111031c70c46cf7f7 - -KEY = c8a2dc33fe6b05ee86680255a160df7a73f8290c4cb778e086534aeeac3cdcbb0932b48ba767678b1f896bd16814d365052018af197566c6075f6b39f89a94c9 -SEQUENCE_NUMBER = 78 -IN = 00000028056162636465666768696a6b6c6d6e6f707172737475767778797a41424344454630310000000000 -CT = a40c4541268a28eeec6818f369c2887eb3472ab9c7f381c8cc896aef25692a7874c2ea1d6a014b04c2b9d03e -TAG = e45d5cb5c3815a851d55d0426cb23477 - -KEY = 1b92da5305b9a1e7234a2d6eca68511dc97fe79fdc7450454dc2313de8f06e068445fa61e14faa1fce49e527943c67475e10e9918f54d410d7ca507076231518 -SEQUENCE_NUMBER = 189 -IN = 00000028046162636465666768696a6b6c6d6e6f707172737475767778797a41424344454630313200000000 -CT = c12861016065604ee867c2b71e8f09bd0cf03b55ca477ca204cb5c1607733e9c651861944438d0b36cef247a -TAG = f9af9a7ebecddf168d04f52218763aa7 - -KEY = aa3f42ae78356f6529dc4eafbf3dd7aabfa6921188627e6b31f39fc4930b2c7f5f13cfea36e47000a59897a2aafde1ae53590a913dc90434d0a18bf1c39f15ee -SEQUENCE_NUMBER = 62 -IN = 000000300b6162636465666768696a6b6c6d6e6f707172737475767778797a414243444546303132330000000000000000000000 -CT = 54a9962b5f227c41bdcd901279f2db09e91bf4f1320ae053f6b2625abdc06f12774d759bc1998d42799ef5656f964502e9509dbf -TAG = 65b3b25f3f1bef915414b8348b2c8d5b - -KEY = e8fca7c957865ae62032c6de787488afb071a691cadf0a8c8d40562cbf80b6513c791a96791f001a2543930998816ba9b44413afe49cbd1695dadee2aec06965 -SEQUENCE_NUMBER = 158 -IN = 000000300a6162636465666768696a6b6c6d6e6f707172737475767778797a414243444546303132333400000000000000000000 -CT = ce31226c64cc9f72745d09df797884651a5946842f47a7ecafea736bf458f52bed38450a8f8521c279fa00eace3af900d68d56b7 -TAG = 3762da294869a8b6b2300d0f19527c42 - -KEY = b21cd69cb3c867e3ce049c7f2584ad26d021ca0f2e94552425f264c442ab6276f2f86509da3bd7e17c5112275d6371cd2a60f490d296db84a6f79608497bfe1a -SEQUENCE_NUMBER = 125 -IN = 00000030096162636465666768696a6b6c6d6e6f707172737475767778797a414243444546303132333435000000000000000000 -CT = fb882b59236f5d4f52b6f11b16b60b1c309d0a2eed260475703aa55baa04ac050e8ef46c25cfdc618381e0ec5babddb3bac43beb -TAG = 9249fec7f5c071a24a896c4c004c6e86 - -KEY = 542f6b64b56093ac155c4302174c1dbc69b28b5380297a05b66d2b4812e78c1f8bf504545b80d18e3dacb49d1dac9c3d2a02368b703365a517e4aadbf6f8d670 -SEQUENCE_NUMBER = 99 -IN = 00000030086162636465666768696a6b6c6d6e6f707172737475767778797a414243444546303132333435360000000000000000 -CT = 779ddcecbd4aa16a9e6f2cbd23bd7dd03f4bdff66a5eac48172b9d5973f5cbc822ce9ed5ac09410297538265c9ffa3b44255ab84 -TAG = 62a287ea3a6352f654eb126fd982cdf5 - -KEY = 12d33230a04520cdd8370e10a82ac97c66a543db2f170b8fbd5651b9d8c340f9e4f82621e365a37fd410e746c652961fad19f262a249d1bd4855d70206fed407 -SEQUENCE_NUMBER = 237 -IN = 00000030076162636465666768696a6b6c6d6e6f707172737475767778797a414243444546303132333435363700000000000000 -CT = ca9d827499866f9942bee540624aba657afe3776d80da0505a15dd9ddca46eabb5c8383039a485f418049135e24e4ca484604f0f -TAG = 5155e0ae129d8855d7b7c0ac56c547b6 - -KEY = 9221b183ce2915a6b6e5d34e1e5cc0299f61a1e757e6e51dadf93bfac086a49bd8507916761b3f69cb3923f920885400256e6d356fc13878175d549492775c62 -SEQUENCE_NUMBER = 138 -IN = 00000030066162636465666768696a6b6c6d6e6f707172737475767778797a414243444546303132333435363738000000000000 -CT = 0199593a687e852219b18a1325bc32b4e697e33888b56687f013e8b0b487215583e8cf6951d84c8559f7c53a753d8f9c89e19529 -TAG = 9f5032a30e40cc2da4993976af9954b6 - -KEY = f3237fb44613c2a6a1db060a3fd25118fff04db48d4d02088e33ca760e030554a8a762c6054c527ff3770ed155ce28dd5cb74e8ea45865f45f1c483817ee6ec5 -SEQUENCE_NUMBER = 187 -IN = 00000030056162636465666768696a6b6c6d6e6f707172737475767778797a414243444546303132333435363738390000000000 -CT = 5b15b628f774cdcbfb83b4ee6448139e1efe320c108a42be0526c33b7cf2b29f44e0cc0258126acf1e2f243a850c843361bd20eb -TAG = f99defa15dcabe76dbf13c2f643694d9 - -KEY = 7497bd5af9e8e9115533233d4f2fec5ae687473504b172a2da54eefefbf063860e2af83a1fa6a7ccbb02c49cef7d5c063b2bbc807c51f9f605cdea2678bf8478 -SEQUENCE_NUMBER = 218 -IN = 00000030046162636465666768696a6b6c6d6e6f707172737475767778797a414243444546303132333435363738396100000000 -CT = a6148988572c42545bff1c45aa3a4340492e004b81cbbf1897ff876d8306f211edaddf60fd97b539261527080b9afa4a14282043 -TAG = f507d8d51b57f41afb9c69780251b20f - -KEY = 8bca240f2520e87d0211bae810e04c2e69ca38d1dd44213e7277f6c9dfa15aa585520a4f288a30aef91a97a0c02caec7cc0fc2dba66162406cadf65e85d8f3af -SEQUENCE_NUMBER = 59 -IN = 000000380b6162636465666768696a6b6c6d6e6f707172737475767778797a4142434445463031323334353637383961620000000000000000000000 -CT = 270fea0aa9e530a49aff4acda9d5c1954c3153f2184ee80cf80f959bf1146c0b66e38754733304194e297712a6174fc6344f4448bc3dbd2a88266d71 -TAG = bed23e779e7e238854be5f62fe751780 - -KEY = 843c5d6c6d26e92c34391bd5b7c89cd612d15a88ed667f59040dcb1afe0f736b7357017d9b82f9b63c8e01bc6d9b842b9a69241c5b3c063cb695978c5f33af32 -SEQUENCE_NUMBER = 156 -IN = 000000380a6162636465666768696a6b6c6d6e6f707172737475767778797a4142434445463031323334353637383961626300000000000000000000 -CT = f29ec1fb4e72c9c261bee5855ba5e1c6e2a63670f891cfd175065e6674494870b7a1a5944f328407c559a0ce7f318630729708e7cd42714a4fae2910 -TAG = 8c88ab81fbc1009d9714d8e111c5b9ac - -KEY = 6c7841f1605b3944ad68ec2eba5f0d57882b7dd004a9c788d6134b56b0704a74e131eb4943e0a61b0fa8a82236901576a0699e83c803f95a767cbef53848baac -SEQUENCE_NUMBER = 0 -IN = 00000038096162636465666768696a6b6c6d6e6f707172737475767778797a4142434445463031323334353637383961626364000000000000000000 -CT = b1d5d1e5d77fb49ac824463235901289e1658ac30f801ef96bfca359473f00af65ec2cdc5184896bcd2234aa7064e468b728d91aa30ead75c0af5bbc -TAG = 0d59f94c58537d96078ff4e6d5f08794 diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/tests/aead_chacha20_poly1305_tests.txt temporalio-1.3.0/vendor/ring-0.16.20/tests/aead_chacha20_poly1305_tests.txt --- temporalio-1.3.0/vendor/ring-0.16.20/tests/aead_chacha20_poly1305_tests.txt 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/tests/aead_chacha20_poly1305_tests.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,484 +0,0 @@ -# Test vector from RFC 7539 Section 2.8.1. - -KEY = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f -NONCE = 070000004041424344454647 -IN = "Ladies and Gentlemen of the class of '99: If I could offer you only one tip for the future, sunscreen would be it." -AD = 50515253c0c1c2c3c4c5c6c7 -CT = d31a8d34648e60db7b86afbc53ef7ec2a4aded51296e08fea9e2b5a736ee62d63dbea45e8ca9671282fafb69da92728b1a71de0a9e060b2905d6a5b67ecd3b3692ddbd7f2d778b8c9803aee328091b58fab324e4fad675945585808b4831d7bc3ff4def08e4b7a9de576d26586cec64b6116 -TAG = 1ae10b594f09e26a7e902ecbd0600691 - -# Test padding AD with 15 zeros in the tag calculation. -KEY = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f -NONCE = 070000004041424344454647 -IN = "123456789abcdef0" -AD = "1" -CT = ae49da6934cb77822c83ed9852e46c9e -TAG = dac9c841c168379dcf8f2bb8e22d6da2 - -# Test padding IN with 15 zeros in the tag calculation. -KEY = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f -NONCE = 070000004041424344454647 -IN = "1" -AD = "123456789abcdef0" -CT = ae -TAG = 3ed2f824f901a8994052f852127c196a - -# Test padding AD with 1 zero in the tag calculation. -KEY = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f -NONCE = 070000004041424344454647 -IN = "123456789abcdef0" -AD = "123456789abcdef" -CT = ae49da6934cb77822c83ed9852e46c9e -TAG = 2e9c9b1689adb5ec444002eb920efb66 - -# Test padding IN with 1 zero in the tag calculation. -KEY = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f -NONCE = 070000004041424344454647 -IN = "123456789abcdef" -AD = "123456789abcdef0" -CT = ae49da6934cb77822c83ed9852e46c -TAG = 05b2937f8bbc64fed21f0fb74cd7147c - -# Test maximal nonce value. -KEY = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f -NONCE = ffffffffffffffffffffffff -IN = "123456789abcdef0" -AD = "123456789abcdef0" -CT = e275aeb341e1fc9a70c4fd4496fc7cdb -TAG = 41acd0560ea6843d3e5d4e5babf6e946 - -# Test 64-bit nonce value. This is a copy of a test below with the leading -# zeros in the nonce removed. -KEY = bcb2639bf989c6251b29bf38d39a9bdce7c55f4b2ac12a39c8a37b5d0a5cc2b5 -NONCE = 1e8b4c510f5ca083 -IN = 8c8419bc27 -AD = 34ab88c265 -CT = 1a7c2f33f5 -TAG = 2a63876a887f4f080c9df418813fc1fd -FAILS = WRONG_NONCE_LENGTH - -# Test vectors from chacha20_poly1305_deprecated_tests.txt, modified for the -# RFC 7539 AEAD construction. - -KEY = 9a97f65b9b4c721b960a672145fca8d4e32e67f9111ea979ce9c4826806aeee6 -NONCE = 000000003de9c0da2bd7f91e -IN = "" -AD = "" -CT = "" -TAG = 5a6e21f4ba6dbee57380e79e79c30def - -KEY = bcb2639bf989c6251b29bf38d39a9bdce7c55f4b2ac12a39c8a37b5d0a5cc2b5 -NONCE = 000000001e8b4c510f5ca083 -IN = 8c8419bc27 -AD = 34ab88c265 -CT = 1a7c2f33f5 -TAG = 2a63876a887f4f080c9df418813fc1fd - -KEY = 4290bcb154173531f314af57f3be3b5006da371ece272afa1b5dbdd1100a1007 -NONCE = 00000000cd7cf67be39c794a -IN = 86d09974840bded2a5ca -AD = 87e229d4500845a079c0 -CT = e3e446f7ede9a19b62a4 -TAG = 356d9eda66d08016b853d87c08b5c1b3 - -KEY = 422a5355b56dcf2b436aa8152858106a88d9ba23cdfe087b5e74e817a52388b3 -NONCE = 000000001d12d6d91848f2ea -IN = 537a645387f22d6f6dbbea568d3feb -AD = bef267c99aec8af56bc238612bfea6 -CT = 281a366705c5a24b94e56146681e44 -TAG = 59143dab187449060a3ec2a1681613cc - -KEY = ec7b864a078c3d05d970b6ea3ba6d33d6bb73dfa64c622a4727a96ede876f685 -NONCE = 000000002bca0e59e39508d3 -IN = b76733895c871edd728a45ed1a21f15a9597d49d -AD = cc1243ea54272db602fb0853c8e7027c56338b6c -CT = 1fb9b2958fce47a5cada9d895fbb0c00d3569858 -TAG = 219b4252deb16a43b292165aabc5d5ce - -KEY = 2c4c0fdb611df2d4d5e7898c6af0022795364adb8749155e2c68776a090e7d5c -NONCE = 0000000013ce7382734c4a71 -IN = 0dc6ff21a346e1337dd0db81d8f7d9f6fd1864418b98aadcdb -AD = 0115edcb176ab8bfa947d1f7c3a86a845d310bf6706c59a8f9 -CT = dad65e4244a1a17ce59d88b00af4f7434bd7830ffdd4c5558f -TAG = 7ae32f186cf9ec59b41b764b34307d4f - -KEY = c66e89fbab01208f6a60847f4f34b38d27b554c119cf8d9e0b118aa7266ab865 -NONCE = 000000005d9856060c54ab06 -IN = f9e3e9b5ed07b2080db8c1ffc37e4a6cb3cd544608921e18610d00b17c6e -AD = 85c112a1efe0a20ef3a550526a7afbc98f6367ebbede4e703099abd78f51 -CT = b5cc754f6dd19ef2d66f90e6bc9a322ddf216ef248cbe76b5ab6dd53bc36 -TAG = d3f7b9c295f374651a84138648a5919a - -KEY = a8b9766f404dea8cf7d7dfaf5822f53df9ccd092e332a57f007b301b507d5e14 -NONCE = 00000000c7f2f7a233104a2d -IN = 4d6faeaee39179a7c892faae3719656cc614c7e6ecd8fcb570a3b82c4dace969090338 -AD = c6d83b6a56408a356e68d0494d4eff150530b09551d008373d6dee2b8d6b5619d67fdb -CT = a15443f083316eef627a371f4c9ac654d0dd75255d8a303125e9f51af4233ff4ceb7fe -TAG = 63c2b4e0973096299488b0a66ffa54c1 - -KEY = 5e8d0e5f1467f7a750c55144d0c670f7d91075f386795b230c9bf1c04ba250bc -NONCE = 0000000088049f44ba61b88f -IN = 51a1eebcc348e0582196a0bce16ed1f8ac2e91c3e8a690e04a9f4b5cf63313d7ad08d1efbff85c89 -AD = 5d09bf0be90026f9fc51f73418d6d864b6d197ea030b3de072bd2c2f5cab5860a342abbd29dba9dc -CT = 35aa4bd4537aa611fd7578fc227df50ebcb00c692a1cf6f02e50ed9270bd93af3bc68f4c75b96638 -TAG = 4461139c4055333106cf7f7556fd4171 - -KEY = 21a9f07ec891d488805e9b92bb1b2286f3f0410c323b07fee1dc6f7379e22e48 -NONCE = 00000000066215be6567377a -IN = c1b0affaf2b8d7ef51cca9aacf7969f92f928c2e3cc7db2e15f47ee1f65023910d09f209d007b7436ee898133d -AD = dfdfdf4d3a68b47ad0d48828dc17b2585da9c81c3a8d71d826b5fa8020fee002397e91fc9658e9d61d728b93eb -CT = 8ff4ceb600e7d45696d02467f8e30df0d33864a040a41ffb9e4c2da09b92e88b6f6b850e9f7258d827b9aaf346 -TAG = b2ad07b86aca1b3ab34033c12d6a08cc - -KEY = 54c93db9aa0e00d10b45041c7a7e41ee9f90ab78ae4c1bba18d673c3b370abde -NONCE = 000000003f2d44e7b352360f -IN = 1241e7d6fbe5eef5d8af9c2fb8b516e0f1dd49aa4ebe5491205194fe5aea3704efaf30d392f44cc99e0925b84460d4873344 -AD = f1d1b08dd6fe96c46578c1d1ad38881840b10cb5eae41e5f05fe5287223fa72242aea48cb374a80be937b541f9381efa66bb -CT = 027b86865b80b4c4da823a7d3dbcf5845bf57d58ee334eb357e82369cc628979e2947830d9d4817efd3d0bc4779f0b388943 -TAG = 6de01091d749f189c4e25aa315b31495 - -KEY = 808e0e73e9bcd274d4c6f65df2fe957822a602f039d4752616ba29a28926ef4a -NONCE = 000000001b9cd73d2fc3cb8e -IN = 3436c7b5be2394af7e88320c82326a6db37887ff9de41961c7d654dd22dd1f7d40444d48f5c663b86ff41f3e15b5c8ca1337f97635858f -AD = d57cfbe5f2538044282e53b2f0bb4e86ea2233041fb36adb8338ded092148f8c2e894ef8766a7ec2dd02c6ac5dbab0c3703c5e9119e37c -CT = 9b950b3caf7d25eaf5fca6fa3fe12ed077d80dcd5579851233c766bb8bb613ec91d925a939bb52fb88d5eda803cfe2a8cda2e055b962fd -TAG = 0887ec7d5e1a4e532746ec247a30825a - -KEY = 4adfe1a26c5636536cd7cb72aa5bded0b1aa64487ad0e4078f311e8782768e97 -NONCE = 00000000d69e54badec11560 -IN = 19b3f9411ce875fcb684cbdc07938c4c1347e164f9640d37b22f975b4b9a373c4302ae0e7dfdeba1e0d00ced446e338f4c5bc01b4becef5115825276 -AD = bda1b0f6c2f4eb8121dcbd2eebd91a03ae1d6e0523b9b6f34b6f16ceca0d086654fb0552bfd5c8e1887730e1449ea02d7f647ae835bc2dab4bbc65b9 -CT = ea765a829d961e08bacaed801237ef4067df38ad3737b7c6de4db587a102a86fc4abbaabea0ee97c95ca7f571c7bab6f38cbae60cd6e6a4ce3c7a320 -TAG = a27f18846f5a4f7fcc724656c91cf4f3 - -KEY = eb3db86c14b7cc2e494345d0dfb4841bbd3aa1e2bc640cca0c6c405520685639 -NONCE = 0000000088b54b28d6da8c81 -IN = f75c0a357271430b1ecff07a307b6c29325c6e66935046704a19845e629f87a9e3b8aa6c1df55dd426a487d533bb333e46f0d3418464ac1bef059231f8e87e6284 -AD = 34b08bb0df821c573dcb56f5b8b4a9920465067f3b5bf3e3254ea1da1a7fc9847fd38bdfe6b30927945263a91fa288c7cf1bee0fddb0fadf5948c5d83eb4623575 -CT = 146ec84f5dc1c9fe9de3307a9182dbaa75965bf85f5e64563e68d039a5b659aa8863b89228edb93ff3d8c3323ab0d03300476aa4aca206d4626a6b269b2078912d -TAG = 854cbb42bade86a09597482c8604681a - -KEY = dd5b49b5953e04d926d664da3b65ebcffbbf06abbe93a3819dfc1abbecbaab13 -NONCE = 00000000c5c8009459b9e31a -IN = f21f6706a4dc33a361362c214defd56d353bcb29811e5819ab3c5c2c13950c7aa0000b9d1fe69bb46454514dcce88a4a5eda097c281b81e51d6a4dba47c80326ba6cea8e2bab -AD = fe6f4cbb00794adea59e9de8b03c7fdf482e46f6c47a35f96997669c735ed5e729a49416b42468777e6a8d7aa173c18b8177418ded600124a98cbb65489f9c24a04f1e7127ce -CT = 911ead61b2aa81d00c5eff53aeea3ab713709ed571765890d558fb59d3993b45f598a39e5eff4be844c4d4bd1ef9622e60412b21140007d54dcf31b2c0e3e98cf33a00fd27f0 -TAG = 2865d2a26f413cc92416340f9491e1be - -KEY = 3b319e40148a67dc0bb19271d9272b327bc5eee087173d3d134ad56c8c7dc020 -NONCE = 00000000ce5cf6fef84d0010 -IN = 27b5627b17a2de31ad00fc2ecb347da0a399bb75cc6eadd4d6ee02de8fbd6a2168d4763ba9368ba982e97a2db8126df0343cdad06d2bc7d7e12eec731d130f8b8745c1954bfd1d717b4ea2 -AD = a026b6638f2939ec9cc28d935fb7113157f3b5b7e26c12f8f25b36412b0cd560b7f11b62788a76bd171342e2ae858bcecb8266ff8482bbaed593afe818b9829e05e8e2b281ae7799580142 -CT = 368fb69892447b75778f1c5236e1e9d5d89255c3d68d565a5bba4f524d6ad27de13087f301e2ef4c08f5e2c6128b1d3e26de845c4ac4869e4c8bd8858ad0d26dec3b5d61a9e3666a3911ba -TAG = 1414f1b91966340417c38226ccca9d3d - -KEY = 43bf97407a82d0f684bb85342380d66b85fcc81c3e22f1c0d972cd5bfdf407f4 -NONCE = 000000008b6ba494c540fba4 -IN = 4b4c7e292a357f56fdf567c32fc0f33608110d7ce5c69112987d7b5a0bd46d8627a721b0aed070b54ea9726084188c518cba829f3920365afc9382c6a5eb0dd332b84612366735be2479b63c9efc7ff5 -AD = 1e0acf4070e8d6758b60d81b6d289a4ecdc30e3de4f9090c13691d5b93d5bbcef984f90956de53c5cf44be6c70440661fa58e65dec2734ff51d6d03f57bddda1f47807247e3194e2f7ddd5f3cafd250f -CT = d0076c88ad4bc12d77eb8ae8d9b5bf3a2c5888a8d4c15297b38ece5d64f673191dc81547240a0cbe066c9c563f5c3424809971b5a07dcc70b107305561ce85aecb0b0ea0e8b4ff4d1e4f84836955a945 -TAG = c5ca34599c6a8b357c6723ee12b24da8 - -KEY = 12fc0bc94104ed8150bde1e56856ce3c57cd1cf633954d22552140e1f4e7c65d -NONCE = 00000000d3875d1b6c808353 -IN = 24592082d6e73eb65c409b26ceae032e57f6877514947fc45eb007b8a6034494dde5563ac586ea081dc12fa6cda32266be858e4748be40bb20f71320711bf84c3f0e2783a63ad6e25a63b44c373a99af845cdf452c -AD = b8be08463e84a909d071f5ff87213391b7da889dc56fd2f1e3cf86a0a03e2c8eaa2f539bf73f90f5298c26f27ef4a673a12784833acb4d0861562142c974ee37b09ae7708a19f14d1ad8c402bd1ecf5ea280fab280 -CT = 9d9ae6328711fb897a88462d20b8aa1b278134cdf7b23e1f1c809fa408b68a7bfc2be61a790008edaa98823381f45ae65f71042689d88acfa5f63332f0fba737c4772c972eba266640056452903d6522cefd3f264e -TAG = e84211b6cfd43543f8b1b4db07a494d1 - -KEY = 7b6300f7dc21c9fddeaa71f439d53b553a7bf3e69ff515b5cb6495d652a0f99c -NONCE = 0000000040b32e3fdc646453 -IN = 572f60d98c8becc8ba80dd6b8d2d0f7b7bbfd7e4abc235f374abd44d9035c7650a79d1dd545fa2f6fb0b5eba271779913e5c5eb450528e4128909a96d11a652bf3f7ae9d0d17adbf612ec9ca32e73ef6e87d7f4e21fe3412ce14 -AD = 9ff377545a35cf1bfb77c734ad900c703aee6c3174fdb3736664863036a3a9d09163c2992f093e2408911b8751f001e493decc41e4eeeed04f698b6daed48452a7e1a74ec3b4f3dcf2151ca249fa568aa084c8428a41f20be5fd -CT = 229da76844426639e2fd3ef253a195e0a93f08452ba37219b6773f103134f3f87b1345f9b4bf8cfc11277c311780a2b6e19a363b6ac2efe6c4cc54a39b144e29c94b9ebbde6fd094c30f59d1b770ebf9fcad2a5c695dc003bf51 -TAG = 55e025a1eb87bc84d4be00c775c92ad2 - -KEY = 4aeb62f024e187606ee7cc9f5865c391c43df1963f459c87ba00e44bb163a866 -NONCE = 000000009559bd08718b75af -IN = c5d586ceece6f41812c969bcf1e727fe6ff8d1ae8c8c52367c612caa7cdf50e0662f5dffc5ea7d3cc39400dfe3dc1897905f6490fd7747b5f5f9842739c67d07ce7c339a5b3997a7fb4cd0d8e4817ff8916b251c11ef919167f858e41504b9 -AD = 51f5b503b73a5de8b96534c2a3f2d859ece0bd063ea6dfa486a7eec99f6c020983f7148cccb86202cf9685cc1cc266930f04e536ad8bc26094252baa4606d883bd2aeed6b430152202e9b6cc797ff24fc365315ed67391374c1357c9a845f2 -CT = 252ea42b6e5740306816974a4fe67b66e793ebe0914778ef485d55288eb6c9c45fa34ac853dc7a39252520514c3cb34c72b973b14b32bc257687d398f36f64cc2a668faffa7305ab240171343b5f9f49b6c2197e4fbe187b10540d7cdcfa37 -TAG = ab1d8a5a1f3eda9b5609c0028737477f - -KEY = 9a19e72f005cae1ae78b8e350d7aabe59fc8845999e8c52fad545b942c225eaf -NONCE = 00000000d9dae2ea8d2ffc31 -IN = 2110378d856ded07eb2be8e8f43308e0c75bc8a3fcc7b1773b0725b7de49f6a166c4528e64120bdf7c9776615d3ce6feeb03de964a7b919206a77392f80437faceb6745845cafc166e1c13b68e70ca2a1d00c71737b8fcbbbd50902565c32159e05fcd23 -AD = 1cd73b72c4e103afbefd7c777e0480f3f5e68c60b85bd2e71ef5caebb175d7fc6535d39f38f92c24f2eb0fe97d878ed3d5967c0bb4394a5d41f7d34cda6e1523d3848f049cde554a7d31e1afeab5d3e6150f85858335cbd28c8a7f87d528058df50eea06 -CT = 5f009fbce4ec8e4ca9d8d42258b1a3e4e920b2fbad33d5e9f07557d9595e841025193b521ba440110dd83958e8ee30219d952b418e98a6c624894aa248aedc0678f2d263e7bfaf54ca379fef6c5d2f7ac422ea4b4369408b82d6225a7a2cf9a9f46fd4ef -TAG = 1c6bdff7d8b9554dc7bf40e50b37d352 - -KEY = ba1d0b3329ecc009f1da0fab4c854b00ad944870fdca561838e38bad364da507 -NONCE = 000000008a81c92b37221f2f -IN = 6289944ffa3ccea4bf25cd601b271f64e6deb0eba77d65efb4d69ca93e01996e4727168b6f74f3ccf17bd44715f23ceb8fc030c0e035e77f53263db025021fd2d04b87a1b54b12229c5e860481452a80a125cb0693a2ba1b47e28ee7cbaf9e683c178232c7f6d34f97 -AD = e57883961b8d041d9b9eeaddcfd61fa9f59213f66571fadffffdd1498b9b014f1ef2e7e56c3044d7f9fa7a1403a1169e86430a2a782137093f5456e142aad03a5f7a66d38009dd01b7fc02c9cf61642dedaf7cc8d46066c281ee17780674c3a36eae66c58d2d765075 -CT = 9c44d9135db0dbf81c862c1f69bec55a279794cdd29a58e61909aa29ec4c120c9c5a508d856b9e56138095714a4bb58402a1ad06774cf4ecdf2273839c0007cb88b5444b25c76f6d2424281101d043fc6369ebb3b2ff63cdb0f11a6ea1b8a7dafc80cdaef2813fa661 -TAG = 689a141bc11159d306dad7a4ecf6ad9d - -KEY = 0cf8c73a6cffc1b8b2f5d320da1d859d314374e4a9468db7fd42c8d270b7613a -NONCE = 000000003c4c6f0281841aff -IN = 4434728d234603c916e2faa06b25d83bad3348990ecde2344368d1a7af1309bd04251bb2e0b72044948f8dea33cce2618283b6af742073a9586b26c1089335fe735141e099785a1235810a3a67ff309e2f0ce68220ba0077ad1a5dc1a4aef898a3b9ff8f5ad7fe60149bd0bd6d83 -AD = a38d09a4f1c9241623c639b7688d8d35345ea5824080c9d74e4352919db63c74d318f19e1cbb9b14eebd7c74b0ad0119247651911f3551583e749ea50ff648858dcaaa789b7419d9e93a5bf6c8167188dbac2f36804380db325201982b8b06597efeb7684546b272642941591e92 -CT = bdfbfea261b1f4c134445321db9e6e40476e2dd2f4e4dbe86e31d6a116d25830762e065b07b11a3799aab93a94b4f98c31c0faeb77ec52c02048e9579257e67f5a6bae9bc65210c25b37fc16ee93bda88fd5f30a533e470b6188c6ce5739fa3e90f77120b490fc1027964f277f40 -TAG = 780cc54bb6f1c9b78545c1562cd9d550 - -KEY = 69f4e5788d486a75adf9207df1bd262dd2fe3dd3a0236420390d16e2a3040466 -NONCE = 000000006255bf5c71bb27d1 -IN = c15048ca2941ef9600e767a5045aa98ac615225b805a9fbda3ac6301cd5a66aef611400fa3bc04838ead9924d382bef8251a47f1e487d2f3ca4bccd3476a6ca7f13e94fd639a259ef23cc2f8b8d248a471d30ac9219631c3e6985100dc45e0b59b8fc62046309165ddb6f092da3a4f067c8a44 -AD = 0c83039504c8464b49d63b7f944802f0d39c85e9f3745e250f10119fa2c960490f75ae4dced8503b156d072a69f20400e9494ab2fa58446c255d82ff0be4b7e43046580bc1cf34060c6f076c72ea455c3687381a3b908e152b10c95c7b94155b0b4b303b7764a8a27d1db0a885f1040d5dbcc3 -CT = f0bb2b73d94f2a7cef70fe77e054f206998eacf2b86c05c4fa3f40f2b8cebf034fe17bcbee4dea821f51c18c0aa85b160f8508bd1dc455cc7f49668b1fb25557cdae147bf2399e07fcacaca18eccded741e026ef25365a6b0f44a6b3dd975ee6bb580f5fccd040b73c18b0fbf8f63199ba10fe -TAG = 2ecccea4607d14dbb2d2475792aeb468 - -KEY = ad7b9409147a896648a2a2fe2128f79022a70d96dc482730cd85c70db492b638 -NONCE = 00000000a28a6dedf3f2b01a -IN = 791d293ff0a3b8510b4d494b30f50b38a01638bf130e58c7601904f12cb8900871e8cf3d50abd4d34fda122c76dfee5b7f82cd6e8590647535c915ae08714e427da52f80aef09f40040036034ca52718ea68313c534e7a045cd51745ec52f2e1b59463db07de7ca401c6f6453841d247f370341b2dbc1212 -AD = 9a6defddb9b8d5c24a26dd8096f5b8c3af7a89e1f7d886f560fabbe64f14db838d6eb9d6879f4f0b769fe1f9eebf67fcd47b6f9ceb4840b2dba7587e98dc5cae186ef2a0f8601060e8058d9dda812d91387c583da701d2ba3347f285c5d44385a2b0bf07150cbc95e7fcfa8ae07132849a023c98817c03d2 -CT = c2f109d6d94f77a7289c8a2ab33bc6a98d976554721b0c726cbf4121069473e62ba36e7090e02414f3edc25c5d83ac80b49ad528cda1e3ad815b5a8c8ae9ad0753de725319df236983abd3f69ab4465d9b806c075b1896d40bdba72d73ba84c4a530896eb94ffccf5fb67eb59119e66a1861872218f928cf -TAG = 17ec6cf2b172f01e3c456ad047196805 - -KEY = 48470da98228c9b53f58747673504f74ca1737d7d4bb6dbf7c0cba6ca42f80b9 -NONCE = 0000000056fb4923a97e9320 -IN = bc6626d651e2b237f22ee51608ddcffeba5f31c26df72f443f701f2b085d6f34f806e29673584cb21522179edb62a82427d946acabce065b88b2878e9eb87ed1004e55ef58f51ec46375ac542c5782725ff013136cb506fcf99496e13fcd224b8a74a971cc8ddb8b393ccc6ac910bd1906ea9f2ed8a5d066dc639c20cd -AD = df8ab634d3dca14e2e091b15ecc78f91e229a1a13cba5edd6526d182525ec575aa45bc70fb6193ffcd59bad3c347159099c4f139c323c30a230753d070018786b2e59b758dd4a97d1a88e8f672092bef780b451fd66ba7431cbb5660ea7816cdf26e19a6ebb9aadc3088e6923f29f53f877a6758068f79a6f2a182b4bf -CT = a62e313ecf258cc9087cbb94fcc12643eb722d255c3f98c39f130e10058a375f0809662442c7b18044feb1602d89be40facae8e89ca967015f0b7f8c2e4e4a3855dbb46a066e49abf9cef67e6036400c8ff46b241fc99ba1974ba3ba6ea20dc52ec6753f6fc7697adbccd02b0bbea1df8352629b03b43cc3d632576787 -TAG = d29a8968067aeb457ffc114c3a9efb95 - -KEY = b62fb85c1decd0faf242ce662140ad1b82975e99a3fa01666cac2385ab91da54 -NONCE = 000000002f4a5ca096a4faf8 -IN = 03b14f13c0065e4a4421de62ab1d842bffb80f3da30bf47d115c09857f5bdd5756fd7c9ac3d9af1c9fb94f2640f7f4386cfba74db468e5288dbe4dd78bfe4f69e41480ca6138e8beacc6eaa3374157c713cfa900c07dd836eaecc8827fa3e70e052ae09e8473e2ae1a10b1bb669ef60a8dd957f6553daa8114918e17371f2ac327bd -AD = cfe3b7ab7550b0e8e2e8235fa0dcef95647ce6814abd3dc3f5a3bd7d6d282504660c34ad8341e4d11402c7d46c83a494d7ddb105e1002979023e0e3dc2978c9ae53e10eb8567e7a02b60e51e945c7040d832ca900d132b4205a35034fed939a1b7965183c25654931a9b744401c4649c945710b0d9733b87451348b32ba81de30ea7 -CT = 8965db3d3ae4fb483208f147276e7d81b71a86e7202ffc9b1eaade009bc016838dc09ca4bcf30887b2f4243fbd652cd90ebed1ceef8151ff17ea70518d03b0f2a24960aa7de9b30fa65c2e2d57360061aae6d9376e984e9fcd5e5dd0911a4bc8deca832ffb76f252bd7da523076593ba6b174f7d9fb0377e066ecbb6638036241e86 -TAG = 28a5284696ed82714eaa94c9ebe6e815 - -KEY = de9c657258774d4ebc09d109a0fc79d66493ae578797cac4eb8830a6a4b547e0 -NONCE = 00000000b5e35fe3398efa34 -IN = 4d68fb683aa4f4c7a16ba1114fc0b1b8d8898610fa2763e435ded8771b3651078bef73d4dfd14e76a34cd5eb9ef4db4ead4da9e83f4ce50fe059977b2d17d687c29335a04d87389d211f8215449749969f7652dc1935a0f9a94538dc81dc9a39af63446a6517609076987920547d0098a9c6766cf5e704883ea32feaea1889b1554b5eb0ce5ecc -AD = 436ea5a5fee8293b93e4e8488116c94d3269c19f1d5050def23d280515457b931bbed64a542b317cc5023d648330a4b7adca14dd6f3783207b94f86ccaa0a0ac39b7db00ac87a99e3cd8a764ed9c75da8454479636ab2b29e770b166a5b75cacc425c919bf1ce9ac34afe6b4425c3d9fd2e48bc81e7d15516d60e592bfcc2ebefb660f0995f2b5 -CT = 97a97b8f0f5420845ae8d57567f9bba693d30e6db916fad0b971f553ad7d993f806f27ab8b458d8046062ced4778c004b4f958a4436141637c6039963308dea2f54008b7feab79650295ed41bf9e65e1a2d75ab1c7b2a70ebb9e9f38d07a9a672d3e95ea78afe9ac02f2566b48b0251aef6eeeca8bd15bd8d43b559426aa9d15d960ee35cb3edf -TAG = 4ef49e8a0c2ef85826d7f03e81c577f2 - -KEY = 6885bd333c336c7672db8ebdf24c1a1b605c5a4ae279f0f698162f47e6c73401 -NONCE = 00000000f0c4a213a6168aab -IN = fa905a2bfa5b5bad767239fb070a7bc0b303d1503ecd2b429418cc8feba843e5444ed89022fdb379c3b155a0f9ceab2979000a0f60292a631771f2fde4ef065aa746426609082969530a9c70ad145308c30ba389ea122fd766081511a031ce3a0bd9f9f583c7000b333b79ac004fbde6ec3eb2d905977ff95dcff77858e3c424fe8932a6a12139e6ec8d5e98 -AD = 8ded368f919efb522bb6a9ad009e02ffbc6a16536e34d95cdb34f1153d7cb7b0f3c2b13dd05cedae27cfe68ec3aca8047e0930a29c9d0770c1b83c234dcb0385deae7ae85da73a5f8de3dfb28612a001f4e552c4f67ae0e2ec53853289b7017a58591fd6f70b0e954876bb2f7ec33001e298856a64bb16181017ba924648c09fc63c62eff262c80d614679bd -CT = 0cb3d6c31e0f4029eca5524f951244df042fc637c4162511fea512a52d3f7581af097eb642e79e48666cb1086edbd38c4777c535a20945fabc23e7c9277e2b960aac46865f1026eb6da82759108b9baece5da930ccfc1052b1656b0eadaa120ed0c45ad04b24ae8cdb22ceab76c5f180b46a392ab45b1b99c612546e6b947f4d5c06ad5abee92ff96345ad43 -TAG = fad7d5a5193dfb121c68529ba8c0c35d - -KEY = fbc978abb1240a6937ccc16735b8d6ed5411cdbc1897214165a174e16f4e699b -NONCE = 000000007968379a8ce88117 -IN = 1a8196cd4a1389ec916ef8b7da5078a2afa8e9f1081223fa72f6524ac0a1a8019e44a09563a953615587429295052cc904b89f778ef446ed341430d7d8f747cf2db4308478524639f44457253ae5a4451c7efca8ae0b6c5c051aaa781e9c505489b381a6dcba87b157edc7f820a8fbaf2a52e484dc121f33d9d8b9ac59d4901d6ed8996ed4f62d9d4d82274c449cd74efa -AD = 3913cd01299b8a4e507f067d887d7e9a6ded16dd9f9bb3115c5779aa14239fd33ee9f25756d45262dc3011069356425b5c81a4729594e17c9747119f81463e85625d5603d05e00f568b0c800bb181eb717be8d7a93166a504ce1bc817e15530c5bd2b3df1d4222245ea78a38bc10f66c5cf68d661503131f11af885c8a910b6dce70bc3a7448dfae00595beb707fe054d3 -CT = d152bcb4c24c3711b0fad28548dc4db605bbc89237cdbea7dbf956b8855d1161a0781f27bd56d798141e2ace339955efb98fe05d9b44cd011e645106bf47726183958cb6df34ce5766695f60bc70b6fe0fabb9afa009a8ef043dbf75f861881368fa07726625448fe608d578cdc48277f2dc53eaaf1bdc075269a42f9302a57cad387a82c6969608acacda20e1cac4596c -TAG = 96ae06cd7c72456e5568a42317046158 - -KEY = 77d1a857fbadfe01aba7974eea2dfb3dc7bf41de73686aece403993e5016c714 -NONCE = 00000000fdd913a321c40eb0 -IN = db8915bfe651e2ecb3ce0b27d99a6bfa7a7c507cfcb2987293018636c365a459c6a138b4428be538413db15bda69e697cbb92b154b7f4d2cbb07965225aa6865d7dcd1ba2c17c484b00b1986fed63e889f25a4966dc3ed4273f1577768f665362d7d3e824484f0dded7f82b8be8797ad951719719365e45abbf76324bc7d657799d4d4f4bb1dba67d96ab1c88519a5bee704f7214814 -AD = 3cb2c06c20cb0832bbacebfc205d77393ca1816346ea2681de4d3ab1fadb774ad273e4713290454496f5281ebc65e04cfe84ed37cd0aedc4bbe3decbd8d79d04a4e434876650e0d64309e336bfb10e924066a64acb92260b2dbd96735d03af03909aa6a80a6e89fda81037257aec21fe9be7e91a64e88e0a58fa38ecba4c4c4cffb61958f3c486cbb0b1d0b0014a2d1d3df248eec1ca -CT = acb825e6023b44b03b2efc265603e887954e8612b2ee134bdcb61501cfb9492952bf67be597c3a005b09af74d9e421a576d2c65e98104780feab838d8cb1bd135452ea39dc8907a4c1a6a9161805e4fa3e16989e6a418a7eea2582bf895da967028eab7c95d846a6de4b9980785814cf00484baa2f6de609912fff689bce6e854261ffe866bd8e63274605c7c5ad677bd7897ade543e -TAG = bcf523a9bcf772e157941753c6d7401e - -KEY = b7e9b90dc02b5cd6df5df7283ef293ed4dc07513d9e67331b606f4d42dec7d29 -NONCE = 00000000a6c191f6d1818f8e -IN = 2ada0e3c7ca6db1f780ce8c79472af4e8e951ddc828e0d6e8a67df520638ff5f14a2f95a5e5931749ae2c4e9946ae4d5eb5de42fb5b77d2236e2e2bd817df51be40b1b8a6c21015a7c79fe06dba4a08b34013dfa02747b5f03930268404c455dc54a74d9c6e35485e10026da573cb41cd50b64cfafe4cfcdf3c9684ef877e45d84e22bd5e15fa6c8fd5be921366ff0dc6fe2df45f7252972c9b303 -AD = 0f4269ed5ef0bfff7be39946a4e86e8bf79f84b70cd0b14fecb7be3c071316ce86de3d99d6871e0ba5667d9d7bba7dcaba10cb2a36668b6c3e2fb6c102938b75008bb9c213ebf9b85b5e91a802df0d31d7f11d764b2289f6225212694ab6b7c0e3ff36e84245d9f4f43fc5f98e654dea7ba9bd918658879c5bb4a1642af0d83113e3cf935d3c0d5208318f66f654eb17d8c28a602543e77ad3e815 -CT = 22586fe7338e99cdaad9f85bd724ba4cfe6249b8a71399f9a3707b5c4323b8d96679568dfc8d230aefb453df596e13eb3e8a439249bd64bc93a58f95089a62b94f6562b821c83d91f56c55147381e9de4beb4ae81bd6fe7caef7e7e9a2078f2fba8f3e70d4910da9accc92b8e81a61b0fefbece4bd89443e66e8ddda8e47a66a62f17fd0e7d0a4852ce1a4d43d72a0b5e8914bbec698f060f2b092 -TAG = bd05336ed6426de412aac37661953052 - -KEY = 6b2cb2678d1102f2fbbd028794a79f14585c223d405e1ae904c0361e9b241e99 -NONCE = 000000007b3ae31f8f938251 -IN = b3cb745930e05f3ab8c926c0a343a6eb14809fd21b8390a6fcc58adb5579e5432021765b2d249a0ecf6ba678634c4f53f71495865f031ee97aa159f9ead3a3fcb823ee5238bdf12706a9c6137d236e2e7110ce650c321e41daf0afd62bab2a8fe55d7018de49a14efe6d83a15b2f256d595e998d25309f23633360f5745c50c4e5af8ccc9a8a2cb47064105a023e919c7795d2dc331d3f2afb8c42e5c0bcc26d -AD = 1c32fd3df22b3e440e2a3c7a7624990194cb16a5f74af36f87fd6ca7d410ce9064316a2d091945deef7d9b35ceec8396069307caced2b80afd7d53ec479c35cedf2dfd4c95c3dd8400f71ad34028c6e4f8681d93d0774064ba38f3fb9b0c1dfa1f5f0c7d20676a5911d999fb6a1d41367a8e99d852bf3d3b7b3f4c233249ed1ca135389a674ff48232ded3f6800a97b6d409c40e6cd70d09bf9d2ad25d9b9485 -CT = ef70c7de98ab1d4ad817024a970be463443640eb0cd7ff234bdd00e653074a77a1d5749e698bd526dc709f82df06f4c0e64046b3dc5f3c7044aef53aebb807d32239d0652dd990362c44ec25bf5aeae641e27bf716e0c4a1c9fbd37bbf602bb0d0c35b0638be20dd5d5891d446137e842f92c0ee075c68225e4dbacb63cc6fb32442b4bcda5e62cb500a4df2741a4059034d2ccb71b0b8b0112bf1c4ca6eec74 -TAG = d48657033095db3f873c33445fec8d35 - -KEY = 4dbc80a402c9fceaa755e1105dc49ef6489016776883e06fcf3aed93bf7f6af7 -NONCE = 000000002358ae0ce3fb8e9f -IN = 197c06403eb896d2fa6465e4d64426d24cc7476aa1ae4127cd2bd8a48ce2c99c16b1cbf3064856e84073b6cf12e7406698ef3dd1240c026cbd1ab04ee603e1e6e735c9b7551fd0d355202b4f64b482dd4a7c7d82c4fe2eb494d0d5e17788982d704c1356c41a94655530deda23118cba281d0f717e149fbeb2c59b22d0c0574c1a2e640afad1a6ceb92e1bf1dde71752a1c991e9a5517fe98688a16b073dbf6884cfde61ac -AD = cf6ce7b899fb700a90d2a5466d54d31358ecf0562e02b330a27ba0138006b342b7ed6349d73c4c5c6d29bde75a25089b11dac5b27adea7e7640ca1a7ceb050e3aae84a47e11640a6e485bd54ae9fdb547edc7313d24a0328429fcffd8b18f39880edd616447344ebeec9eadb2dcb1fa7e67179e7f913c194ebd8f5a58aea73b0c5d1133561245b6d9c5cfd8bb0c25b38ffb37db5e2de5cdded6b57355e9d215cb095b8731f -CT = aa87f9a83048b6919c8f2b050315db4e2adae4a9c2ca0109b81961b520e63299dcb028cec0b9d3249a945ee67dd029b40f361245c740f004f8cf0d2214fcfa65e6124a3e74b78aa94345c46fdc158d34823ed249ee550431eaae9218367321cdd6e6a477650469bb3cc137a8f48d9cf27934b16703608b383d2145659922fb83bb2e7ee2ef938a90f2ff846a4a949129b1fb74dde55c5ae013c2f285de84f7dac7d1662f23 -TAG = 298f84c8312029a7b1f38c5ea6021f57 - -KEY = 9e4a62016dae4b3223fed1d01d0787e31d30694f79e8142224fe4c4735248a83 -NONCE = 00000000263a2fc06a2872e7 -IN = 5a46946601f93a0cee5993c69575e599cc24f51aafa2d7c28d816a5b9b4decda2e59c111075fb60a903d701ad2680bb14aeda14af2ae9c07a759d8388b30446f28b85f0a05cd150050bd2e715ff550ebbd24da3ebb1eac15aba23d448659de34be962ab3ab31cb1758db76c468b5bb8ce44b06c4e4db9bd2f0615b1e727f053f6b4ffb6358d248f022bcad6ca973044bed23d3920906a89a9a9c5d8024ec67d7f061f64529a955ce16b3 -AD = 4cd65f68f9f88c0516231f2a425c8f8a287de47d409d5ecde3ad151e906b3839fb01bb91a456f20ea9d394d4b06604ab1f9009ef29019af7968d965d1643161ab33a5354cda2fdc9f1d21ec9cb71c325c65964a14f9b26eb16560beb9792075a1597394000fd5f331bd8b7d20d88e5f89cf8d0b33e4e78e4904bb59c9c8d5d31ac86b893e4a0667af1be85fdb77f7ec3e2594a68048d20c2fb9422f5879078772ee26a1c560cbcbb2113 -CT = e944bb2ab06d138ad633c16ce82706ecf0ef5d119be1f3460c9ce101d9c4e04ef1677707fca40d1f8ca181e07273707b06624d6d7063c3b7b0bb0151b757b3e5237fb8004c161233d8bc7e5f28ea1c18da1874b3d54c5ad6ff0835eed35c8853704585cf83996e5e7cec68180af414e04f08134d3b0384ebdf0393c9310b55d8698fe10cb362defc0995e9a13b48b42cff61ffd9fe4c3c8c6dab355713b88f6e98a02e7231a0c6644ec4 -TAG = 6234e81e089b779d0d509d14e566b5d7 - -KEY = 18ca3ea3e8baeed1b341189297d33cef7f4e0a2fab40ec3b6bb67385d0969cfe -NONCE = 00000000b6aef34c75818e7c -IN = ef6d1bb4094782f602fcf41561cba4970679661c63befe35ff2ca7ad1a280bf6b1e7f153fa848edfeffe25153f540b71253e8baba9aeb719a02752cda60ea5938aab339eead5aabf81b19b0fc5c1ed556be6ad8970ea43c303d3046205b12c419dea71c4245cfedd0a31b0f4150b5a9fe80052790188529ab32f5e61d8ccde5973ed30bdf290cbfbd5f073c0c6a020eac0332fced17a9a08cef6f9217bd6bef68c1505d6eed40953e15508d87f08fc -AD = f40f03beaa023db6311bad9b4d5d0d66a58d978e0bcbbf78acebde1f4eb9a284095628955a0b15afc454152f962ec3ea2b9a3b089b99658e68ede4dee5acd56672025eb7323bcbc6ba5d91c94310f18c918e3914bbbf869e1b8721476f9def31b9d32c471a54132481aa89f6c735ab193369496d8dbeb49b130d85fbff3f9cb7dccea4c1da7a2846eef5e6929d9009a9149e39c6c8ec150c9ab49a09c18c4749a0a9fcba77057cdea6efd4d142256c -CT = c531633c0c98230dcf059c1081d1d69c96bab71c3143ae60f9fc2b9cd18762314496ab6e90bf6796252cb9f667a1f08da47fc2b0eecda813228cae00d4c0d71f5e01b6ce762fa636efffe55d0e89fdc89ba42521cc019ab9d408fcd79c14914e8bbf0ea44d8a1d35743ad628327e432fdcfeb0b6679ddca8c92b998473732abd55dba54eefff83c78488eee5f92b145a74b6866531476fc46279d4fde24d049c1ce2b42358ff3ab2ba3a8866e547af -TAG = e3b4192f6e50528c4f4f70267f094c56 - -KEY = 95fdd2d3d4296069055b6b79e5d1387628254a7be647baafdf99dd8af354d817 -NONCE = 00000000cd7ed9e70f608613 -IN = 0248284acffa4b2c46636bdf8cc70028dd151a6d8e7a5a5bc2d39acc1020e736885031b252bfe9f96490921f41d1e174bf1ac03707bc2ae5088a1208a7c664583835e8bb93c787b96dea9fc4b884930c57799e7b7a6649c61340376d042b9f5faee8956c70a63cf1cff4fc2c7cb8535c10214e73cec6b79669d824f23ff8c8a2ca1c05974dd6189cfee484d0906df487b6bd85671ce2b23825052e44b84803e2839a96391abc25945cb867b527cdd9b373fbfb83 -AD = 24a45a3a0076a5bcfd5afe1c54f7b77496117d29f4c0909f1e6940b81dde3abacb71ec71f0f4db8a7e540bd4c2c60faee21dd3ce72963855be1b0ce54fb20ad82dbc45be20cd6c171e2bebb79e65e7d01567ad0eeb869883e4e814c93688607a12b3b732c1703b09566c308d29ce676a5c762a85700639b70d82aaef408cf98821a372c6a0614a73ba9918a7951ea8b2bb77cd9896d26988086d8586d72edc92af2042ff5e5f1429a22f61065e03cfcd7edc2a93 -CT = 40c6318d9e383e107cdd3e1c8951562193c3ef64ee442432a63e2edefc78f32ab07772aeac172cb67ecf4d21f8b448423527bbeb9d8ddd0b46bdb27f74096ceb24e41963b4cdca176676a75bdbe3abc270b349ac0c6cbd9c3a5cd5bce20202fc5cc0c1bdd4fd25e121e0a24bd7bbeb9b19b1912467bf5338ee2ce88aa383c082b42cc399c9654ca325f35523e81438beb3f8926be79c378822d7c8f785614408a5f7cac49e4543188725643e6c1a70b46d0ec400 -TAG = 874875c9a0ba3060a0680291c3dc85a2 - -KEY = 6ae1102f84ed4dc114bb9d63f4dc78d7dbb1ab63f1659dd95f47940a7b7a811f -NONCE = 00000000c965d578ba91d227 -IN = b82a8a9209618f1f5be9c2c32aba3dc45b4947007b14c851cd694456b303ad59a465662803006705673d6c3e29f1d3510dfc0405463c03414e0e07e359f1f1816c68b2434a19d3eee0464873e23c43f3ab60a3f606a0e5be81e3ab4aa27fb7707a57b949f00d6cd3a11ae4827d4889dd455a0b6d39e99012fd40db23fb50e79e11f8a6451669beb2fbd913effd49ad1b43926311f6e13a6e7a09cf4bebb1c0bf63ce59cd5a08e4b8d8dbf9d002e8a3d9e80c7995bb0b485280 -AD = dfd4ac3e80b2904623ff79ea8ee87862268939decf5306c07a175b6b9da0eb13ac209b4d164755929e03240a0fe26599f136fb2afdffd12bb20354aa1d20e5799839abb68ae46d50c8974e13e361d87ef550fe6d82e8b5b172cf5cd08482efdef793ede3530d24667faf3a1e96348867c2942641f4c036981b83f50236b8e8a10b83ebf6909aad0076302f1083f72de4cf4a1a3183fe6ec6bfe2e73e2af8e1e8c9d85079083fd179ccc2ee9ff002f213dbd7333053a46c5e43 -CT = a9aeb8f0a2b3ca141ac71a808dcc0c9798ac117c5d2bd09b3cfe622693a9f8ca62e841b58bddb2042f888e3099b53638b88dfc930b7a6ee4272d77e4b1d7e442bab6afbde96ab0b432f0092d9ca50eef42f63c60c09e7b8de019b32ebe4030c37b8183cc1e3b913b0ce4ee4d744398fa03f9af1c070bed8cdafd65b3a84140cb4deadc70184de757332ce3780af84353f540755227e886a8d7ad980f3dd6fd68263d82e93f883381dec888bc9f4f48349aa2b4c342cb9f48c6 -TAG = f6dcad5412b95994f5e4d6829c2eba98 - -KEY = 405bb7b94715b875df068655f00513cb1ae23ffaac977ce273e57d3f83b43663 -NONCE = 000000005c6da1259451119a -IN = f9f143c0c52c94b4ba7b0608b144156a49e7b5d27c97315743d171911e3645ab7957c80924e3c6b9c22ab7a1cac4b7e9c0de84e49fd5e4a2d1ab51d764fc5670318688ec942f7ab34c331dce8f90fea6972e07f0dadec29d8eb3b7b6521ddd678a6527a962f4d8af78c077e27f7a0b2ef7eabd19e92b7f8c1e8fb166d4763ce9c40c888cf49aa9cdfc3e997c8fe1cce3fe802441bbd698de269ff316f31c196e62d12c6bb5cd93fb3c79ca6369f8c1ac9102daf818975ea7f513bb38576a -AD = 6fe6446505677bf08b385e2f6d83ef70e1547712208d9cebc010cba8c16ea4ece058d73c72273eed650afdc9f954f35aa1bdf90f1118b1173368acbc8d38d93ebf85bd30d6dc6d1b90913790c3efa55f34d31531f70c958759b2ba6f956c6fcdd289b58cb4c26e9515bf550f0fd71ab8527f062c9505cbb16e8e037d34de1756bef02a133dbf4a9c00ac03befc3fb7f137af04e12595ce9560f98b612480fcdba3b8be01db56ebec40f9deae532c3b0370b5c23a2a6b02a4de69efa8900c -CT = 1a4b073881922c6366680cc9c2a127b26f264148651b29abb0c388cf6c9b1865dba5a991e1f8309efbdb91bce44b278772c58fd41273526c33fec84beb53d1689b9da8483f71be6db73a73417069bb4cd3f195236e8d0a00d124eed3a6b6f89415b19a27fbe35774f6a1a6ee4bd4350b252b975f0db2d2eea82f4836350850d6290901e726e8af13644e2d98bc1d569c20800521e6affe976bd407049a2e6d9dd23f88d52e651391ecd2fc45b864310824aaadfa203762a77c1d64562dae -TAG = 90fcc2544880250f1c3abe8a3761ba08 - -KEY = 8c602bd94c630cd00c7a9c508067a5a9f133d12f06d9f6fe2a7b68dce4786d8a -NONCE = 00000000760de0f7b7cb67e2 -IN = c3ff559cf1d6ba6c0cc793ca09a0ba573a28359386a6ec93e1bacd8e630209e0b477a20aedec3c9cbf513ee6a1e3887112218d6155b9875f7e6c4bbba2c31972e905d19f529f4f0f9502996199f94f8728ba8d6424bb15f87fcacd88bb42c63fcc513759712bd0172b1e87c9da122f1993ffb7efd3a5c34b240dd3db89dddea36dbeb2836d9f8648f8e7cd428c0f948097af753b35f9876059e7702027bb00dc69071206e785f48fcbf81b39cc0343974ac70784a2e60c0df93b40379bea4ad8cac625 -AD = 9e14907c3a8e96c2636db1f3d78eb1f673d6ef043cbbb349467f1fe29bf60f23d5d5d1c3b133a8ad72065d822347541c13d1574baf737eb3cc3382fb479e6d5193b9c8e7d2444c66971ef099dc7f37f6cd97b9f7959d46e2cf25e8a5b3111b4d9e2ef906d905f0ee2d17587f7082d7c8e9a51509bde03d3d64338e1838d71700f1b4fcb100b5e0402969da462f26f974b4f9e766121f8fd54be99fc10beb9a606e13fbb1f960062815d19e67f80093360324013095719273c65542b0e31b1a2a3d928f -CT = 2794e6e133f6892f23837fff60cf7c28ee9942f8982ef8089db117903d0143293fdf12ea1cc014bcd8806fb83c19570eed7af522db0de489bbc87133a13434518bcfb9cda4d9f6d832a69209657a447abf8afd816ae15f313c7ea95ec4bc694efc2386cdd8d915dc475e8fadf3421fbb0319a3c0b3b6dfa80ca3bb22c7aab07fe14a3fea5f0aee17ab1302338eeac010a04e505e20096a95f3347dc2b4510f62d6a4c1fae6b36939503a6ac22780a62d72f2fc3849d4ef21267fffdef23196d88fbb9b -TAG = 7fa630c9bcb455e89f13d7a99d5e8dbe - -KEY = bd68ff5eb296c71cfe6bc903c14907f7726bcb1331f0c75f7801cd1b7948f3a1 -NONCE = 0000000065a748004b352ba6 -IN = 52bf78c00f6e5dca2fc60e2e9a52e827df97808e9cf727773860cafc89f4b64178a19b30b46ed813fe00c8f09b25a6a1b6e350d5b005122934a59bfbd5e6e0c635c84a5226c3f2f7dcf951560f18ac220453d583015fdb2e446c69c6e6fdecf2e595e04fab1b0c506e3c6bd5e4414a35f15021e97f447aa334f54a8f1ef942dec6273511b5668b696fca97188ff15ed84b2f46145cce031c1a7f00bd88bb83d90797edc46161b3fda7a2299173496d73b812139556e8b4eb318078b9eb2ae5046e83b79dd3d45950 -AD = 5557b08a5010cbc9f46bb140c2505f68684eb24889324bff44b27234fd7a95a99cfb4ff90a8f9982085b725f78ac42eca6ce7f3314e457dc41f404008681a9d29ba765660de2e05bb679d65b81f5e797d8417b94eb9aabbd0576b5c57f86eae25f6050a7918e4c8021a85b47f7a83b4c8446898441c5cc4e0229776ef3e809cb085d71f3c75ec03378730cb066150f07e60f96aec983c0e7e72bf6bf87ae42228dfda195f97855fcdf4e6d1c4479d978abcfa276d16ed60ecbfbfc664041335ce65a40a2ca3424df -CT = a5c8cf42287d4760fca755e2111817b981c47e85b0047de270ec301ca5f7b3679f4749210892b6ea6568f3a6a4344734a0efc0120ffedecf212d55cbcbb67815ac964875af45f735b70092a8f8435f52fc01b981ae971d486026fb69a9c3927acfe1f2eab0340ae95f8dbee41b2548e400805ece191db5fd1f0804053f1dbfaf7f8d6fded3874cb92d99a2729d3faaa60522060cf0b8101b463b3eb35b380fcddb6406c027d73fe701a5090c8dd531c203ce979e26b9ced3431e2b726a7244a20d9377bd62951bf5 -TAG = 82c6194de4d27aac4c54b023b9831634 - -KEY = 934fd043c32d16a88fad01c3506469b077cb79d258b5664fa55ad8521afdcaa2 -NONCE = 00000000c7091f6afbbeb360 -IN = 2bdd1fc4f011ef97ea52ec643819941c7e0fb39023c2f3c7683804a0ddee14a5d1784a5246966d533b3538edc7d8742d27061c3cab88df0318ab242102de3a54d03632eeb871b72c7e8f8065b49f4a91e95e15f3f46b29fd76b8fcea0d23570c5530e3bbb8a6aafa9ae32c1b3eac653c5ed5fdb2da5a986075808f6385870c85b1913e26042a9d8e78f5bc2ea6de5a64f8aeafa22adcffc7f6932d543c29bb3a04614783f948680e433a71573568d2ce984d249fb4fc06a9f358c76aa3e64a357f4eae924c1356bd5baccf7e0f -AD = f737dd85638eb324dd3891219c5eef7c2dd053cfd055d447a411eba304a4b27dce981d112c4540590933c153d603022c91ebd2b4a58069d27e6ca17a462ef822ca41bffa80b43a68b1b564644cb3c5a7f0fddf7a13a30ff24437fddd8ef93c6f6f205d054f81890d982bd4d4ece0b1563677e843fe48c1f54e9a57ed4da66061482712e710a401073be5080d5b8b96525bffa67de5af31d50385fbbf1a87c21bf0e0a1fdff69ec32c7b7103e0b8ee6c844245e0fc84b9f89fcce62966cea68e2871d3b82e8df424c76309fc88d -CT = dd13fbf22c8d18354d774bcd18f7eb814e9b528e9e424abc4e3f2463195e8018576565d16ab48845d11c9277f2865ebb4dc412fd5b27078f8325eadf971e6944c66542e34d9dda971e2aba70dbd3e94a1e638d521477a027776b52acf90520ca229ebc760b73128879475d1cbe1f70fc598b549cd92d8a9ac6833e500c138c56474db84cb3d70b7aa4f293a4c2b4d818b0ff9fd85918dc590a12a8c0e375c4d98b7fc87596547eb960676aad5559834588f00f251a9d53f95c47af4df3c4299175d5211779c148cfc988a5e9d9 -TAG = aeb0a4eb29886f0a7a12ec0516bd4af5 - -KEY = f9f6eb9ad736a8f66e7459fef5ec2890188dc26baf34a95f6f0384e79f5c6559 -NONCE = 000000007858dfc084fe4b0f -IN = a644ca6e7cc076e87eb2929fd257693fce0f6fb64fd632f7f07c648ebd03696c8e262e6a810d7b7c4e5eef8c65b5323c99dbba50a70b4a9e5c2a9e7315973cd67f35d8052ce9a85a206416dd3031929f4f929b13d0a5fb10cb73c65f6c0ace019da146b51c5274a099f44e3669d26add6f2ff081e886f3cf952fe0dbbe6b0534c23e307574bd35fbd657f5fcbd5dc19fb382a1dc0a2dc8285a0350f71554e4c601497749e35567dd4a273cddc9a48ce53a5f1d297fd8baf8d1b9feb35d9151114345abada4d90db947bb9a743c175f5653d1 -AD = 2048d1c2ddfb5ec385b201832c7a993f229ba72ec16d6ebf723ef0c5032b9966209a9e8a63151b40412e96b82f86728ea6588c7e8e11ac71cc8eabab8c4b54de866658d9c5011def61fb3dbe4e630158a45ea41a2ed55ebd1efb1abeda7637de6fa5fd2f151c6d2f385bf6cd002ca8b4a2896e0d65944ee913e3c784669dd201b1985ef3577f7f123a5f9bcffa176c8f557c4f729133cac518642f27d9b22ca9b97faaafe5b669a10b79ace4a7d5727df146c77ce681357d69f9c2d65b4401bd73cd113387e3b3a05d897adad7a24c485e7b -CT = 4146faffd7313f5d9f625370d20413cc62ab65f4acfa3c7ee1125b937dd7a39f638fc46c8ed004fb525698de5d8620ec153435571817c3de257b0d0e648ebb92940c86a98262d54e764f28cbdd4f7d9bea970291f2110414f62064d7229c6332236c507b3dac742e651d85a2a22fb243c0cc7cc2d016e5bea38f33f9a9ce048944a5fe8b078d71d23168e12dfe5a0f0b829771edc7073fb96032b7be471337a37aca0cf7c0cdd543eed686cd34934717fd79a3f18492eef72f9f450b880aa7e2e1b65e3b04c22e72301338b43aa32ceec2e6 -TAG = 61c6d4d6918b04fc1b72a7a0e9a3b799 - -KEY = 29b19636cdd32507fd98ec4ee26caab1a917646fb8f05b0dc01728a9f4a127f0 -NONCE = 0000000006699d245916686d -IN = 5fdf913aceab1d6dbaf7d9a29352fa8a3eb22718043a79cffa2fe8c35c820aec7c07644b8785dcf7a433b4189abb257fb12b06fae0662641011a069873c3e3c5ccc78e7358184a62c2005c44b8a92254958eb5ff460d73cd80284d6daba22c3faba046c5426fe8b7cacec64b235a8f8d3e2641e5bc378830594bcfb27c177aea745951ee5780a63705727ef42c4ad3abf556d88e3830f3db6b09e93edd09485cbf907f79de61f8dc5cb5fb7665ffa0ef53cb48702f6a81d8ad421cef20c1dbdf402b8fafed56a5361b2f93f914a2380fdd0557faf1f4de -AD = 39116c49cc13adb065b92cb7635f73d5f6bf6b5ccbf72a3f65a5df6bd4a661105015358d9e69f42e98aed795e8161282bc113058b7ef3b9e23fcd8eeab34a392e03f4d6329c112cb968385ec52a7afc98bb8695785af6b27b700973cc952630b7247ce226b4fbb99b8a486370bf6345d4516c52c64e33f407c4f2d1ba90545c88732d98bbd97972ac5e94c694624a9b3782b0099824651cb7567914d25b3e13181a791dbcd40e76e836b3350d310a52151bf835d3c357c9871482c2928e8404c6e533406d4d6fa8f63366f2c4ed828141f1ff00f01a536 -CT = 01e237220b619054a1f3670928fe67d40484b5af40fbd04d032500aac5acaa3b4584dd99a58c390627636a50de5d744f76a56a33205f9e3b00e16162eb47ff3333e1e208ca200f1a5338a86e17bd92dd2d16af8bb022a7dc05b923d019e05247f1a0d0b4bfcfce58dd6d83830705707676d55739abee89fcd5cb94b8fde006a5da02df64b00a467f45970b5ca440f22319b9735a55d454b9fba0588fef0c59d3d83823eba6e0601a96e10233826c5adeea6b2a51d386a07a9e047ad405b23d4c3d89f30c31e3199f0c8f927bfac43ceea1f969de0a8c0f -TAG = b9fec6da464c7b85b2a4726694562fe9 - -KEY = bae06b9b5456707551c7b0e207aae02a19b4848ad8ca4ce40705bf8c856a6e52 -NONCE = 000000009c27065c3ef2d522 -IN = 50cdd88137ff428a88e87b5845be4924f6387537bb5c0b654c80107ab5698db75b2e131848e7aec156d31aed0766d31c379fece4095d38264c6d5945974d25f729c3b0ba11ea853e9cebdb6f03bb670fce08adff74d0a8f02d633fb34e0fb7337a8e66e1c12084d914fb6173b8105684db822752c6751a372bb16690284d661b8b8bc6a6dfbddf45ebc2219596f9f2f878c118df69030de38b4d99dde43b9b9e20a3dab691645dd518342f49b06a0fe0a397adf261e99f07af5b0b3798b1022ba0939c42a54d3b93641cffa3c2e174bce9ab7ad7e7c7924308d1a77a -AD = 5d5590db1bd316eb7a0e30e4c7a6dfdbef9d3287fdb8d824389599c3c2ee262b2192eb5b9708e66e22dbc7eca83fa1a995da3ce64c86fe5aa08b826d476dc439497e2d12e2702c63c8d27aa7f09fedee816dc8bffe1351d53271a34d4292b613b7efcedb7e3cf3e6ad389eef12471e9e20e38e7ae22a323abbadfe8f2e84271bffb1819feb4f77b82843cb8757cfae293631bc6d39669107e7015c85d7343ffa6fc1bbe6f5ab4de30cd752a281e03061ea89de2a3f5e90e20da22fd6e8525c100738667f42212b2cf45fcb23bbb54b21c117484b22c6e514685314df -CT = 66b7f69ac49fab4e5975aeb6fa9287d8eac02ac312c4de78f77f59da16cbcf87274e66801c4b862c33ea79cdc76528862bb2956c06db8b8acfac4794ebf39e35ac03cc73a4351a4ff762f681a48d6f25cad36e2814c9b5c40b9ae92509e58429106847789454d376836936bebc7a80e6c66e7aa52936d6b361378a41f849ad4e48f9ee2d3e92217a908fa8eb35736ac8ada7d32ae05391f2d807be3512543c36138a5fe660dd4cd4cd184bb43b6ba6bc0bae634e2fa9669304cd510ed5103f630068ff76d3375738de60a381842b421477e25a490cdd6894b2704125 -TAG = 94118ccc68de1921d480aab43d1ef0d1 - -KEY = 2cb374cb048c168f2e43597f028d9e73cade1b458284ffc260d4fc6b9011c414 -NONCE = 000000009fb909169bc9f4e9 -IN = 39eb929482784b463546f5d84f80510f2019923d465b99d194246d68c7ae343f91971d8f7059cebb86aa5dd099289aa648248b8c5ca04e66ac5e9bf06776e3883495397618a0227f035666806e636836b47d3d2d255a49db79866cf00d9ddabda259c4f968a1e01e651c7811cebbee2ee71803ea1d9d23487eb221f2d9555756800aba5e6abbefd6fb72b3151cc99ced599cd86df2a9b1ce94f89f347eeb124d9e7f0d9cc48d3dedd819e6d3dbac57ecee199547b266116a2035c9acc4c8ca3271ac74952372897c4a5f2cb84e2d81817fec9d6774f6d8a5b2021684132db4fca3 -AD = 0c7bd4f3a30ee944ccf9489181e6911684dcffad4593a9b65a67dfc80718c69b35897d01281016b7731e12c15cad8482e79458e08a755622e3f3f22a23ef6c8487a36ad1771ba06c641f06f85de0db3776cc6df06ad8fe3b4d60d58508de943083f17cbb9dc0d390ac94d8429e8c6fcfe063f424fbde0f62f6a7f91a626d195dc498a6e69bd93109c4e9ba13e7330aba456d710a4b0cc279d4045660406e26d61dff70d4a33c4f1052869f9248024e7a0f85f1effb32f6f7ccb1f860f3ef04e8f7b29096e6bcf9d4b3e0ce703e9bf228fdf515c2ff9cbabd16987be0f9babd3d8a -CT = 91ddadb86b7ebef798ddaa59da51d71316fcf6c9678143178227d778750dc9827fc6cc21e605c505023e6db25849df7fb6fc1ca4d223aa215f8c85b724643c83bf8218815a9f9e2952384e0ca6a80a3760b39daf91a3c6154c4728c2371fd181fa3764753d0b0c23808a82cd8f0497246e3a0f17f8906a07c725d2891ce968a9d432c2b102d85c05510b28e715bb60d0403a77490e7f18be81218bc4f39287b9bb09f50227dd2f55e4fb70c4438da8ba3c8ffbced87d90155913faa9979fc57e6cbeddfaba3d3ab4163c0eebc7d94279c27d3ed56338893dba542eaefba30f8c3b -TAG = 8980e8e4fe796428b733f4f8e1954a45 - -KEY = f0f16b6f12b3840bbd1c4a6a0811eef237f1521b45de9986daec9f28fca6485c -NONCE = 000000007ac93e754e290323 -IN = 0530556424d823f90a7f1c524c4baa706aad2807e289e9479301e3e7a71f2a5e14e6232ea785f339c669af2e6d25f1d5a261096a548d23864945c3a589b67b09b0304a784d61b42b2419139485242e0d51fcbe9e8fed996d214de8717e6a71f8987ccad65eb92e66707034a5ae38e6486e26eb4374c565aad5df949dab209f7f7bcd8eb6fc52761a26cfe5d01fd349e59f4042e6dbe6b232f9301b971dee121d8aa1e62d40f043a42f3aa859d867eb809b1ced5ae1ec62cacf94a69fafd0631a8b5dfd66d855900fb295eec90ae5fcbf77beae267a79d24081bb322d8c4e0630fed252541b36 -AD = 13bfcc17b810099cda31ca53a1323db9b07633ceb2088a42263a4cbd6a4d47978776005c9a20203319c3a3ae434e9a26fb541047dc9df38dc36c095267272e203d0b24d119a70a7e96041b6d82b7c4d5570e1e4a1cf2f6e44ae63fe005a1f5b900778c482f7bd89e2e02305e35b8f61b7bb2c78a13aebfce0145d1c5aa0bf1d10d23616d5a3a446de550302f56f81dc56fe4f3700f14242688d9b92d8a427979b403c8de8c493a2cde510eaf6b285e6675b173aa0314a386b635c7577d5aff0d868a0cb3f73c8d2005f8c7c9dab5a060ef80102c9d4a4af988838afe87aff04c0689e8c3c7f9 -CT = 2c14c3931e98e84507c4c165c2ed47ad4a178f0e216cd7ac2453bbbf9f85dd06bd8ef54a9ff1fd3dd8e0cafb635d8f2de861a0db5b14d03f17aaea8c89b3010797c71c13a0e666899d7ff6e53c4f08be8ddb3e37688b5afa088079b6c7519b833e16560073e699530302028a3496e05edddec01a23a4c7983956250e8d9e616f7b940856955cde81c1efabf6b7b92f153d03f4cd17e7f7d2907670cfc84d45c1d7936775a3fce47968504278ffaecacea0871b227f250e2979516f6fa310fec0d8df1af7872e5a534e82870aa05f43ef0a455846b93ce938064fa33e92de262e4156dae56775 -TAG = 16c972829819b8fb030b2c5f40dab717 - -KEY = 3792943c0396f1840496917ce8ad89608385007e796febeea3805f3f4cbeccf7 -NONCE = 0000000023b2f9068b2c4c85 -IN = be6b67eb943ee7b5c785cd882f653e73a8f75b4a41a2a7c56ae5a10f729caf39948fe48ad0e51240e2e7aa43193c7ec6ce7f4909fc94c9f99e38e6a0ad7e98eb29c5c2e61c99e9cbe890f154185cec213a74725d23c1a4e4d0cb9b1a36b78c87e5eee20d2aa29aae80d4759eb0c51c5dc3a95bdbbf7e14eb434419a6c88a954ac03d0c98739f4211b8732acd71c297f578b8cb64ccac45f7235ddc7f2a3f5f997525c1ed39dc550126cdf9cedaf55425489085e91b170be6205a5a395f2dd4084a3e8dbc4fd8b13252f7effae067b571cb94a1e54aba45b1b9841308db0cc75b03cfce4ddafe89ce20f2d1 -AD = 7eb6d7b7bbaaa3c202a4f0f1de2263767169eb4a64853240d48c0f8d5d31b08d5baf42977614a57aad99426cde76d242cb37d2956d8c77dc4fd62a3abf30e8ac6cd58c8ef35e67497022960138c57787818892460f3bfc16e37ff388b1edc6ce2bc53c22717edc7a03d4c78b0dbbe9121c7fd8a3e3993b87a4fe389bff13bdae3b349de0b6db561602c53f746022aeb4483c723b67825042f4af20b7dd1e6031cf54215266295c524ac8e1370424c5c5e607fb3e23e97c8eebe64656775edf616422a8b974e1acf13ab45c9a367a7dd9b2d62f48bbc05819b65eccb813ca813f57b22ee4c280dbb5a9d8d5 -CT = 0b316ab2bcf5359900fa4082d5d253b49ad94b70e3fab544f98bd111cbcef6766cf953deec08cae1f489fe12f7acc0032db8a6b0c0eee0c206ea5fb973feaebf90f690e840094db5e13fdd7157ba127368c995b426529435a1bcdd1f14ce9125b8a0e4c96b6ec09e3c36a180adf81941c002d19c19d53c2009be803b987504606b7d43bdee5e0b32ff23c466b6cccfcd0d4e88fd1332e73712b5ab725c1a383e584f34f80daff29d285ae5e43cf1d0cc7a828e75c25daced3a581a93d7a50f313b33f38dddfaa23cd5b9914797db820ee2400d52bf5fa982277fe9b5881ac42981633b3957b0e935051828 -TAG = c549aa944d6d97e52e0793ed572682c0 - -KEY = fe4be6054773f634356ac328591fbc6f833b0d1beeb38dd5b6feb7481b4489d4 -NONCE = 000000000b3f16f898a5a7d5 -IN = 76ced1ade6d1ef4069afddb32e7432d4ff2fd06685121f7b16464e7a72d365744f547d2ccf53486310e38b42d8bacaf711e54c5458d2d68c4dbcc8de31ab6732f4430e88a64565f5b287640775aaa2af1cc461d3e415bb275c6246b1b58517aa72667eae291a2982eda175d1b22c5a58e6fec2b3743d55712f201ca24ba5c0ae8c25724871b2ec2fb914a8da5a52670ab9b43a83b8568ce74db5c634061cb80530c8070c38b8f48c33ba136cb9f2158ee7eda8b65f2192fc94d1291f182f101795b7190c74b319d2d3e02a97c824d9c9471a83797e4936310b207e3a1e0bcf75f7c3e3ee48a747641cdc4377f2d55082 -AD = 834cd775cbefe4b33a3ca53a00c06a3c4a666983e4115a029f15729460daa45d1505e95172d3695625a186b28b8be173a925af04665f209267b3c5123e8be13da447ee1ae856bb0925f35aaa76e04a7bca8460f76c2024de2149f38a8cfba81694b854885d72568105571b6b213a0bc188a44cc7fe13153cbf261401b238cf12a95e23cb56f240114f16e2f1e3a514615aab4449c0c49e4d900b0e17d1a8dabb53d43dca32fa052d576b73dd9b40856b515d6d7efc2a5c17e0ebcb17bd59dc86f22ce909301a2652f134e82ef0e4519487ed12d51536024f2ae8f75d937c42d003076e5dea8de0c684cda1f34253d8fc -CT = f8defb6fe95dfec499b909996a1f75a198a90e4d6c6464d00a357a555311c42fe92dbbc4b79c935e4f0b1a95e44fdbc1380bebabca28db4dd0d2870daaafc38ef27908c3509e945714801cc51f1a07b2430c74fa64f2a7c2f7fd1551d258c9c3be020873fc1bf19f33ab6c660911dcf2317195d0efee82d20ec26d22611f9cf86c51a64e28b3a1f344500018e0855c88dae3c07acaeaa10b60388484dce93e16e6e1a6e69e899806648a92568c8780e9f4baacd98cbb353ac2f908e775d92303cfab843f15be0e0c322a958802fb1a60fcc7631f151f4c2b8cb965d2d296acef250275a2fecc0cea803ce7c058b12dd2 -TAG = baf9a51180f172e5c0cc2c946ce55055 - -KEY = a288b11ce5382ec724ce4ab2d7efa8e777e91ebd04367935e15f9dac483e9596 -NONCE = 00000000874144dbf648b325 -IN = 4c9195280a79a509919af4947e9e07231695fd7c5088539f23936ce88770ce07d9ad3ae4a463b3a57d0634d3a77ceaadf347a334682b04be8e58b8e86fb94a1f93255132b8cdb0df86f5bea354eea4e8315fea83e3fdf6e58aa9f26e93caa08e5e2551a94bd916a51fed29ec16f66800cda6a0aa24ec308bf5fb885afba272685de27c1edcdd3668048ef07b06e90d464a8aa28664903cac45e154e8e1e39c257e1ff506b9d95cef4f300bb73b899e7828602c3c1d290b8cf55ee5fd72ecce9e6efc9293aebf674a70e2a7673e75629c12950622dff71d3ec0992e57776c788c6927d30b4e24b749191c3ce8017f0ada6276e43720 -AD = 04abe8588c8c8c39a182092e5e7840442bd1c1149da102c4ee412bd8b82baa5087ef7291b5cd077c177c42770b0023e0e462b06e7553f191bcb0315a34918dcdbffe2b99c3e011b4220cc1775debcc0db55fa60df9b52234f3d3fa9606508badc26f30b47cdb4f1c0f4708d417b6853e66c2f1f67f6200daf760ceb64ffc43db27f057ad3ee973e31d7e5d5deb050315c1c687980c0c148ee1a492d47acfcd6132334176c11258c89b19ba02e6acc55d852f87b6a2169ed34a6147caa60906ac8c0813c0f05522af7b7f0faddb4bc297405e28ecf5a0f6aac6258422d29cfe250d61402840f3c27d0ce39b3e2d5f1e520541d2965e -CT = 0afce770a12f15d67ac104ba0640aab95922390607473cbda71321156a5559906be933fb0980da56f27e89796eaa1054f5aacf1668d9f273cc69071b9e8e22af6a205a6a88f7ad918e22f616bddbb07c78913c7e056e769e6fcf91c7600c2740212e3a176e4110cac9e361a59a773457064d2dc652dd115d04f1c3756c0e1d39f6737a16b4508663e310934c49c58058b3c7b9af7bb2334c8a163608c42499658986927cda365e2aead3ac29de16e47e954383ea566f8fb245a4e5a934c767bb3bf7e0eb8a477fd0e1f61bcb238462a0d19c5cea9293ca58ade76829413216a7882cd2846323046694f78cd8b0347792ebb75abdc1 -TAG = eb9b2ee43e9a3ae1e33561800169d868 - -KEY = 65b63ed53750c88c508c44881ae59e6fff69c66288f3c14cfec503391262cafc -NONCE = 000000007f5e560a1de434ba -IN = 845ef27b6615fb699d37971db6b597930a7ef1e6f90054791eb04ddfe7252b5f88fd60eba5af469bc09661c0987a496fa540621afeec51bebda786826800943d977039dee76235248112ff8b743f25ed5f3cb0d3307f5e118d84fdbb9c3f5531bc177fb84549c994ea4496c65e5249da987dd755d46dc1788f582410266a10f291c1474f732183a2a39afe603771bb9c423fe3e8906f2be44a0c9a7c3f0ceb09d1d0f92d942383a875c0567c7869f045e56dd1a4d6e90c58d44fe0c5760bb4fd01de55439db52b56831e5a26a47de14249453a4f8e7da3cb3282c6622916197ebfaad85dd65c61e7d2d3ba626276366746f396394c1bf75f51ce -AD = 51a3588398808e1d6a98505c6e5601ae2a2766f1f28f8f69d1ccbcad18038c157b41525be58ae4527a073748b7a04809e52a5df0c7988417607738e63d7ead47db795a346b04e740186e73ccad79f725b58ee22dc6e30d1f0a218eda1791e2229b253d4ab2b963a43e12318c8b0785c20fca3abcf220c08745d9f9602f0ece544a05736d76b12d249699c9e3e99f3f13cf4e5dc13a04125c949a5b30d034b23cb364c8781964bc6c30e5e5ca9673d517ef5f35965d8a8cf1be017e343df97b6bee37b30638b154286d1f36d2f9a0eaa23cc484eac5a05b15d9efc537d989dbc8b3106c0dc1a56e97e6aec2eff54a82cf7ae9df2af46b4c860f83 -CT = 027b14197b4012256b133b78ddc94e72fb4d724fefa4ae329f5a5fa3fa784fe6d7e1e805e3f7a75557de64de506d38237b467fa577efb59e7cfe2356bed6655c5aa4e238dcfeb75c16549a0917268768a96acb5e20546a1fb7e3a7cff887f49f2cd7a135f72a98a779150f3207bf733e88861fd79eadbf77fa3bfe97bfe8b6a991cb3bcc2cde8287f7e89384846561934b0f3e05e0646e0e1907770df67a7594161a4d0763faa6fa844080932159999d528ee0558710058ce16f97d13ac9fd9bf5044191188bbfb598d0fafbdf790b61ce0781ecc04218a30ded45efd498cc9ba03562ed2b4a993ee98876b3ab7a9bc07829f1c4ca6ead98c06b -TAG = e0bf9b6837428843f5a233ee5ddb8a1e - -KEY = 4986fd62d6cb86b2eaf219174bec681bebcdef86c8be291f27d3e5dc69e2feba -NONCE = 00000000d08d486620ed2e84 -IN = 3a22ad5de387db4fdd5d62a1b728c23a8dddc50b1e89f54f6198b90499f9da3122ebeb38ebf5fdfe30309734f79aff01e3de1e196b35bffa33bae451f31f74b8aec03763f9e0861a34fe5db0b40c76e57c7fc582bfa19c94ee25b5e168270f379bf9f8a0a18bed05de256f8f0dd7c23ba2ff1c7f721409462f04cc611ad9bd4c3c9acf30742acfb9518a6375cbb15d65a1bc6993ea434894f93d4f6e05996ebc1bd56579296309a2c6b8fde95072168b5fd31927c4c0abaa056bcd16221d5f220be47591f43255013a262dce439817f534830ba82155347e5fe3101f8011b89365a6568214ed0661914e8cb3431d6c8f2347dfc1209a3eca4aaf0a111f47fe -AD = 7dd3f656a03c001b45ca0680bc3ac9d68c6e96b591d3c69eb8c65e489009d845cb331c98b82e627e06d5bf01e74c573df268c2386f12628c019951d42f55991ff20d72a7b2c45f41d0be7af428c92f324aaab8df70d900301cdf09a3d93eb711c919d34a86fff9cb078322ee2e0ad48dbdf3b7884f0f2dc5c36262c59bcfd75ac6200f59c6fcd0ce10ff5005fef5df8f0432377dfbfc1db8f559e27e1aeef3380ea3864867d36a25a18654779a751586cad3b8a46b90864ee697b08605673b8d2123433c020a21c4db243dde2420c12fd4d54a2704a0c8c376454a1b5e80fd6db89aabd56d9b421f29649e474824dfa56cb5c673c504d10be52b53751709fe -CT = c40180afd53001663ff4834110f56e6b0f178cd3c0e7f7de5d0089ee41d8403ffb98e84922706544a344d7e2625b12cf66b9c966f9f57d7b94e3e4b34e6f0aaed1763ce012782e2f5e1682e6c343fc7961fedddd0919d0b910e9923c17e36406979b256b85aec24ee352f03b48c1302eab419c83dccc5372cc059e9de596224fa70098eb32fc9579e97917b923914fa2efc30ab29b457bf14e45583b3771486bdc0876f3ea6e1a646746c4f8c5cb2641a1557c8473e6ea67d4811a67485ae9a678ff3a2408ca845c3b51957e189eef47dfc1d46bde4b9d754d7df13f828ddadb06e4ebddb5f0dafbdb28de4c5e6078926f20cdf9e97ecd58e309e640f74f06 -TAG = 2e8eb9ff4467c0f61c2abf6ca10893ef - -KEY = 7d28a60810e43d3dfa32e97c07957ec069fc80cc6a50061830aa29b3aa777dfc -NONCE = 0000000047738ac8f10f2c3a -IN = b50278ae0f0fa2f918bb9a5ed3a0797c328e452974d33cbf26a1e213aa20c03d0d89490869754abf84dbbe231d7bccdced77d53fd4527356d8e02b681fc89a535ae87308bf7fbc26197a5ea85bdb3aa033b8da5cd197ea6d72f96f63b03f4ecc7adedf399a5043776cdb32c08f30b77f34df85f8adb8e02649a04b020b03e17d445ca63e4ed73ae432c481392e031eba2f9d2f7f981d1e50917822bd6ff71c239d33444ada3523a59dfbce5457eadec1ab926c9e6c5299c7521e3f204b96901a712504fcc782e8cea80ba12a7f7e71cec3d0871899b6ca059061da037715f7d13fed01c9cade1e687b4fbb1f4ac4b040db3b43800f112fb900e4f772d61b921cbce4da6f -AD = 324292813b7df15bc070cc5d8a4bf74ead036430be63abc43304cf653959a24a91c7de5a671c50fa8a87e21bb82b069999aadfb6895d8bda4c3083d17b8ca55b9ab1511ed8c4b39d8c28c11a22ef90c08a983e3fe2d988df9e02b16a20b24f39ddb28429625f511db08298c4dc321f6c268fc836a6191df6232f51c463a397a8d8b33374abe94e62c0f5c322387e1fc4a1c1980a04a1a3c2c31b32f183a11c3268c6dca521149dc16af120a78be6627210e8ddbc44472bc24d66ce3681c7579b3d9a425212a704a4f5105cb80f0d18ee860953d10b59c114826779bbc368d7a0eece9f223e47cd8e5fd453607d101d9d9c2bd9a658d6520b87d7b4263f6d845a524a36e4 -CT = 2c217e969c04740a1acfa30117eb5b32dc573df3354f4cc3bf8f696ff905f1e640f3b2c250473b376622e0c9bda13b94640521be1ef0fc660b4c10dbe2bfc093030753e04f6aaecf813b43b61f960455974b8bb8a9b461d1e8fd3802315e863c00448f24dd38deb90e135493274eb14ccbde15c50dcad734ed815a806be6622492a84cd062e3ba567b909a205a1d0d2bedd40169697d261c7b6c2e0b1f069853fd470e8f364a142c386c439a6dbe192ded5a3d0fbf73799f588c59e58c60249d980ddcf0d9693631cd9b3f972509c3a77123d38d9e267ecad06e1208e3f1c0a69fbca7c3bb1a48fda19493d0f8f48398820057b94120f3ef97d87e9e8a1b301a2534c68f -TAG = ce507bdb0c71f8e89f5078495f7995b8 - -KEY = a76e9b916f5a67b78a5949651c8c3a9741a1bc3c41cdf85fd2c8f3e9a0616098 -NONCE = 000000000808da8292dc14e0 -IN = 9c149eeb09345c3c22462b03e49eb4dba6bc98b269b1086d752bcd8eea53b8977b238a04a994baf915591686baab90b79a3bf7d9adb2c6c2e31acd3e72f0813fb745aa5fb2e3da408f78001c9c09bd26a1a2646011b6120aaa2bbacc4a16c39fb5257b9b2ea2ad8bf70bcc9855cf11841116c2767310cf3cd49d1aa44cd505f079761e064d5bc7cea4a7173b086882a77d3fc179efc86fc4db8a373491d2ed81eabc63c950e832db17d09f474d4ec46bde47830caf26fabaa0372b81fccc449c0e19ccd630caf693a7b43bb1c408a54e03f50c44280a05ad89fb6e8f01d8ac278edf556e5d86ceb4b614fb2ef133819c6e1ff6abb86c54a135256204b5cd400b93624d3932e7c2b046 -AD = 6aeb7031e4a2e23eea93f05fdc562aa2bf43b8998bea7344377aaddc60fbdb7bcb1491d379ed0cb613ee757cfb66490db61bb431d2fad34b38ddd55bc5b22aa6c4773b9992f34b878c5663f6e8cdb5f80a17f4d312bf342492e48d1ce4c6d754076a634fece61500acf8168d47381af4faf980c6cac2bfd5da8c09b6edb0f543bf0fe02643e38d73fa37d8ae87fb66193f22e57faf4393c007d48c8631a685d520578f8f89db684fb371ea02f3a58b1e2168f0216321139472e0d03b6d90ba8aab65402e1c1ac4f9172a60e27e3d997b9b05e2f672120d6c87bcafa6d4c9b4cf8ba8a82932d92840368fc53dc5b48526103dcab5f1531038aabe89171327ac559b98a3cf4ea70bf051 -CT = 9c3faab9261a63cea9477b3269007283995b06ba77ef83d9e693f7e4ee9855550eef94855be39a7a435b6a3584b202973777c7b2482376ba47b49311947a64983b60236756ee4455d4cfada8c36af8eb06b06ba2f6b79ffb1185c89f2b2a831cfaa3855fc1841d8910908be5078352011168a67d36372d851a3217cabf593ea462dcd325cf9a4f67e85418fd5c924e9b92ab026cbee4e7ab1067066cb5949dfc699a68fe539e1abb13cec33904e5207e6963d24f5a0b770613b8b00014e791bfff88f9c25ca126127a2f8d1d1e9794efd28dce98b53e228073faae8d5047530d502184fc341321c3f55fcbf41187fc31262c325b97f519959b6a29b36c71f76f60196bb1457b77c8bb -TAG = 73b00b1705602479aab944dcc1b282a2 - -KEY = 98cd2477a7a072c69f375b88d09ed9d7b9c3df3f87e36ce621726f76e3b41a1d -NONCE = 0000000077d185aaf715aa48 -IN = 42b31eefdacab0f03ef6060156000c8195adb0976cabbe1a42bfcc09f85659c60b98638401f2d2e2facfb9a97a62926bb0cecaf3af0180a01bfb6e576babf7fc43331937a92abd30cddfa3e450f895e9dd914dea3fafd759c136d685310ebce28ac0613ccdbf30115946c9634b67510b77d0e37f07714b2ddac9d7095b8d4bd887c132c4a9127eb01c8dedb4c39c87b98a741316656f9a8d5a5b0c0ac84789aa2347a5f99ca5ad55cd1bcf98f703eb4b00badb8a8555f38b3b368db8ba7ceea94e8b219f51edce75d84166b5602156ed5962a93a51db73c59d87e906179d7a74a2a2a69d8ad99f323225c87e475d3f771b4a203a2e2b03b458401044649fa6536dfab24d7037807dcbf6518e6578 -AD = f5bb1496052a4361dddf72a288e36953a3d815d6876c013f1d6ba839e127f721b052b1f7d8ca20c7dc0386a7d459ebd7eb9fc8cb08941e6ca9ddb980f3115f65bc1928a414d441ae71dcb879d5bfe0cde0562bc37f8fde0d5291ad405c92fcbb860c43b55ac0fe663b54b3d0616aca13a5c82b7b5d34125a05c2acb5530141030e6f2aa0c8322b2c8fa307e7518918e550e9f48921c6168f094d8758e16b9f815fd0458095c4143f0922adb1840d0e685636825a9c90ee90ee537f4b8dceecbc4287c82dc9a00d7e51671e37ea284ee3ca501b1b2596459d3f592f70186f41125739e342c9f6be9241973b1414dfe5fb8cba1af82e679278cfcf95420df0c5364af4d7e72ad57d5c871fcbc35462 -CT = 7a3bf3e3ad5ae3ab71fb1f7121c3d8fb511099484b50af7ca128ee0337ed4b828dc4cde0b88dc1e8089101fa82c9beb3eb48fdcf0f5b16da441f5a3fce9a590022af95a94aed6a3e71e505f60f303c78c356f274ea85a55354078530664ecda32c80e77dc20974b3b38f4825b8fbee8c3970769a2f42c5181608a8d7d76ef4d093961b665ee42b9708fcafe2c82d3a307173e2a25ad2528c3bf83352b9265e45b70722d7cf8c9b80826d21335234ee3db69d0d37871c83222365900c96c17a7e9f5742d0bfe383be24d0d44590d4b0f29f7abe0c65daaffb968b3f2657b1eb300534eacb52ec7a6b6f9f57a50a91b1799f491361cf613c934b7f520dc4eeeb40ffc45e10be0a95e76f366d4eac14 -TAG = 69302888812eea030d621b640e7bcf7c - -KEY = 2f0f4631ab1c1bcf8f3ad0559c818d50e0af7d8cd63faa357f2069f30881d9cb -NONCE = 000000007d0ced2fdb1c9173 -IN = 6516ba1d29357144eebfa486d21decf223da3aa76ec29bbfcbe7f1eeaf4a847710e5080177f7e5a7c8b4752c219b1cc70aef4db861ba67d0fa6222d9f4a1dc756a0ba44e62906f9374a960c16198866d867854d88f528a60e212eb91645787e75685b2e215c0a41990abc344a77236ec0186ba63a664592938cc5a8ac1d3eb99c95ce00e19fbe249263083d85b052d48bfdffc01585dc57bb2a2c6c4a819604c1ec0548c6f0f78dc05e4418b36277dc07233c7532f9c289d6aed0cc6bc7df4fd0a536c497b982e2dad2c30d2db1c6545a845c5dfa83a4ac49ef06fc9c919079d3e299e31b5c3be370814ae5022ae469d3ee55246a41bd0dc4e64351cc38c3c09af0a1aee3b388a6892deff0df3f93cd92d722b -AD = 1ccfa1ececc8de1e200d0ecc19dcf67b7c96bea3a282c2bccba61035db5c14776387b8b8f58e5757deb0129d4e5e315f64df354a5985d2e47ebbbeafe0c914f7cf1d63dd0311ace19e69a8b6ff0ab25cc8df0408d22132205e89e5eb679268d82b2913e64e3f885bbf4a6d379b760b94590e3140dd7275ab4713cb56d0b716e2718f11316640cb394802862d39e77a46d0c065af3caf7dec14e887039d8aa8c3d3a8ac1ee06026f49d00b2f59d971b54735e95a51f199389a93a4fc24ebaba1f7a2eef7412f61febf79084fbf481afc6fb6b204084e5ef5df71f30506459dea074f11fc055cd2a8c0fc922c4811a849984352a56a15659b7d07a4cc90b88623638ea00c4c8bc13884df2237b359f2877aa41d6 -CT = e580093789ba17ffb46672dc326f09278aca08598d3e5458eaa53e6ed45d5c71a396e35b5ea3fe7b7c0496a734d24f1c75420694be2ff095d5172fd3407794e4b99fd7c374fbe8d1564a048614d3f355bfb5866de1a53e1a51f9f5e8312253cfd82f36efaa1898c850ca0d975ad1e8b0d9597a5a9e6516fe2a3c92efb7495557a8afc3da15b0d3e2ba58f612519836946cf2d15b898320d16a026c8c00a1be2e35f0ebe68f28d91c6c45d24c3f3c157cb132fa659b7794df883d90741fa2d2afcc4f27858e13ecd41b154a35d24947ae7361170060c107d8ecacb393ea67104b60457278a392fdf1794bab97d3b02b71a4eb015eaa38a4b4c944c2bc7cd5e329da4a1ab2937a6af81a6caa5fce752331fdefd4 -TAG = 19bbacfac768bb0ce71e39c5d4d3e9a0 - -KEY = a48b9b6df475e566aba7671fbd76772cb0eff0b12499967978ce3e25fac92feb -NONCE = 000000002ccbf0d6c40cb302 -IN = 09da1cacd001dce4f7573a065a4406fe0da04ab367a2d87780a2762e168957a88d3fa78f0a4b6978d449026e5a801d32884b6e14fdaaaf864214f928ebc03dead081fee96683ebb032362d5088c4c2a3b1e242f055f2604919f4dd551db777a258cf9da6d95a2bde249247812b9efc7985cf08707620808524d6dd3079b0b63bf0f71ea5de834ccb8b7c6a97125fd6ca49148e866d3134bbf1d8a6b714e9a80fe549c8bfefe342f41be2ba2300e0028f78cefab65274632dfdbe70bf7d655ec4036df561f2d4fc4d56a482bbe2f9f2ae279b3aa216b39afee75e53602de319484db89a51e844f38c361634e474f8f1f01c340f3f3594860d671346449c6d08ee38de22d246309bc7e4a252a29c86aa6d94b5b4fa58904c70 -AD = 1c2503d5aa1aad193f0da12874074ea0432bb76a61cd43a3017061514da0759846a0f3ae3a49fdb0b6d29f713de665beacb6568f2694112ca380d13f3c1698316866a7a7f87f1d7503a92176ab84fc08977b46ba664508a858e7525753c45511b3d2f407d5e993c6ede77f13d12975707e5195704970a89f71fc30828049f92f944f3aa93d6a5297e678e08952919beb7eac5919df1919cab3c3da6aa696a1eeab6371f310f7e81143e7d240b0213ae554524b52000306160dd4877bf13ba0f13bbe867da7c7d707f31335eef4cd942938ac890a0829ec66bd30ae01a2188a6e5ea0f17cd7dc875e17f03c0ab5dd18e36db8a1fc1f72859ee046b62368f168b3bea2234e0432c07b7d8e1b9277f21e692c513b9e816e6860 -CT = 7d35cfe4be56bd6e0e09dedcd01735b915bc1891a4d1f6a541abc4bcd0ebe89dcb8e365e5813742e8ec65777b6159422fada747da99394252baf8a046fc1b60ad79755f545f4448627b7acaf403000894f5641e78d3f946dfca29ec617f0660dcd6e8d8827e67e1022a245c595d86e60fbd176bf721b171bbe5ecaf4ae671b9f3dd3920146e6ad431bd8fc431820e19454b6ca209723d80fdbee187fca9c937c979206ae97be55f6ba7366a5608770a11d537396485eb0a66586385f4d4cf3905d1fc90831c3e136d5d513fa22be285193142994a3ed477145bacdcbdd791e8b3b88b0d4f1d18b27382550a818c4fd8884bf36f677c6c3ff5677406e510911e696af75e5b3f859bef699bdd16e6215fdb98d874025eada50 -TAG = 0fa4cb2bab84336409aa4349ab99a8bd - -KEY = 923d4b086b9e43b986f7b65e4cea6113a3d8aabefa89323c5e4d5b6f158bb7e0 -NONCE = 00000000a0f73297b87f5deb -IN = 21435e8d5c8edf0684f58c2cba4070c10b4801adf46b6c4d322eb3990a38a9ad338ad704b9df6597f3e68d66cd5b56290c8466db2231e56d6bcb9c44e1bd081f42ca2a894dad369df2bd0d2c63d6c881732d6ea22bb22b5bc9a62eaffa1b094d0845f6b966d2cb095e7b3b8bcbc15e707449d35c8df4aea30c3b7243e977fffd59c80f1c5c9af4bb5a54b9c786fbbe8d21b2b906a87a786caed841a34a3e0cc0ac3209d83c58afba19edd63622dd261532d2cfb0b49d527d8eaa0887a087f5129d897f665264b229f860363d71a88b7d49c8dc6360182b357b0662391bb41337f46010ac32b9fada2d60a2efcb99365d3b27b7ac396900d1c821d0df8b86cc9cc1f2673259a33efea610bf8e1d00d7e9db2afea21da8f58c55f799999d -AD = c853a8b39c0dc597d562f123cd221e4104b65423a062a4f4ba890ba344feb84290f61817e23330c365f58c3583ce08360d3c1171982ead5496d525ac878f23a57480a6ee39d4e65afd6268245bb982a2545fa1195427cdbbcd404cdad5198f55cce2a5a028fae435f71b15921d066e8d43766c32b2f2c3f57c0674e129607dcd3703eca529414adaee79d81fed432153cceb6f3fc53404810d8ec878f7d94be5d379d0e0e1aa9bc404b4b5d396038a9d76a5ce53c9f3759b8e50fb331858ca58cee81bfc3ee58baef5d19c402a3dc8b36370ec1ace5a4aa2527fb94b4f933a4ab8ccaaf6a5af5a779eae5667c2a24ab027e781c8d4f30c377aa5885a2fdaf6507d18cd824a847c35368b4ea984d2c3c3824a5b8ba3042e1852504a21a3 -CT = f2e21052eebbb86a4f5e803360855d8632aa727dca6f5e79dd74d7aff106e442001928d113005b030f8446f8eff2ee951db663978abe43090dd5ad2c51ba97a0ecf988c607d95e486d02524f690fa3c28d5c48c1f75c1f555e7b43fe7e46f2ca2b9fdb408ec4ba18b6cdde2af673183cb7b1a3c23ae77eddd4cac75e1ea14743fc571f8d31ce2e96787524cd48aadaa474181c096a032184574ddc25a6e0ac8441c212bc36298708e33c963ae931e6c6241d1affeef7b6ef759495df44b6ab647447693cf703569e69aa72f1def9a342b8978c1edea9703a421ca75b92cac4de14b88c693200022b8a2ed22b1c4678b99f4d695e080dd1196d7168e14f0d0f8ff880d742e97b9f6d00af1f7118e10b77c5ef3ea6c52f84a20fd6ea46dc -TAG = 9bd8b7743c056bb2334833afd6143e18 - -KEY = df73adab2768559ea983cce85453fe81d79be3b3c57f202b31b94d6635cf2e4b -NONCE = 00000000e7a87e6bf6b5a354 -IN = 0032a37abf661faa18c587fd2aa88885c061deeba81105dd221969bed5d59c7204b09b1a8c4c8de3b9f748c7fc70626ebeaca060233a57b102221b1bf0f3d9fdaaad3d2b1439c24d08f9c67f49f3c47128f92ee530abf4c4f4573bc60ae4b38109f55bca3ca9e1ba9f9fd6e34ba0d174892977a53356e1f5c88c614fe3ff3b3dd0818e7a2285412e3b37444bbe8a80942efcfd03958809a6966cda9430b2f0c9e552f4bced6e19eb3e85fc5758bd7b588297ccbed37ed94c3adc8c08ea8b058462aac9d57a939ec711bc4ecfec944d2b653b7cfc7b02a65d7057c9fdadd51b9da8cc4a3c68dae9da8b9c5319c1a2baa3d6c891c5ac4a39461484b5a01abc64df447ada24c04a4363e605eaccf339a9aa515e724206206da6d22bbd2f52e64cd7c895 -AD = f833e5ab4f8bc89167f80f576b1d6b22cdd0e30721f5f735799746cf645b6eff531d4c7b03584f3dfcb73cbd35ac42736216dc7f0de098a4f42c61ceb4b227ee288e47d697a0a76afc762f084e8fdbf9351c28340c324771c109a469341ab10ca10483ed2af5e878d7d3dc2bced2f72da3d1a25852b103ee9878e8158eb4309c1ce528f3a178ace153b6d3ae0af0d577cb3cb1540489e80427f792217ad8a09b84f027fca7ceb651b4264e98e94b4cb8a37b133390897233e8ba9103628d05b9609e8552c4a4b11e3f2fa8d56af36957390e88cba44656be3edace798cf8cdf7771bac338a256bc3cba6df97728f222f423ca7c6d149c9372d66163a98f79a234b00d4b75fb2ec860dcc2d1998105e4b9c01d68f079f3e0aa21cc534047fc7b858f8 -CT = b842eadfdf431c135bd6581d3eccae54e2267d8890036aa33dfe2d2d9715c44625441210a3a0d666d708d30588fe851ec36e10d8fa3584ed77b095149494b7c54379d62c8935e1d2b9a8f47e4759ad0b3437fdf2cc2fb6c5ea25ad10e0bdc9dc5b0517fc237eb783cc461c46665e2b1d1a5b8008dbf409ea2a63fea0276de23a32c99d92a498807a0f95e208fc6262321a78aafaf0cc3f833fff37bd4efa66f6023a25cdc6702cee3912799563d908a5183c9956a06aa71085d855dc7c809ed6e2889592b361ab3ab39060f8e419152187a794a19c2a1128882201900ea2cd597860674bf78d9720643df8701676718fd201baed4935a88e50558daf86edd08a9ab227ac7afae55c974b68de8dacad4a4d79b13ed6dfe74017a4cb9148e033436fb6 -TAG = ee1ec36804e1d5cdbddb52608c711fd8 - -KEY = 55a4be2448b464c2ea52a2f2664ed6aba865c14ea1fea77f4689331fd105c8d4 -NONCE = 00000000db37c0a405b4626d -IN = d266e66272e5d3462081b004cb42429c8b9741e9f678153754d726f6f9aa513464763c5e793b482fe512fece97585f1426120d4cefb3d0a8cc0a8db4bde93fc72c78f44d4fecca14650c660d3e285b327e7cdd813063e7e867b8a2d059a41bab70432b7f857199894da90dca3fe5272bae1ec694a1a07b60b05df275784d4975637e4673109f3ba846dfd1a048b202ed8e89973be608b91ee4743b1e759900f1443038951fe6189e806638985f3c16338c3c60695df58e621154d79bb973859c4558e9dca90470f77c73f004443ad5db0717abbe43266f90e57397b83ac34d1fef2e897e2483d5bcdcb627abd64b0d1aef525835f25e76d6e9158232cdde6dce970b59f58de8a98e653be32fb58edabbcefa5065d73afdf1c9c4fbf50c1022bd22bfcb98e4b422 -AD = fd6a3fdd879f8880843eac20ae01c1b9dc3487d270a806572088ef2ddc1f1e0de495e71d4813bf5c501ad31e5d791c4b5b3a0a71b63fdddcc8de4b056064ef467989ecccc5d0160d403bf3a025d4892b3b1de3e062bc3581d4410f273338311eb4637529e4a680a6e4a5e26e308630a5b6d49ead6d543f8f2bf9050aa94ce091318721e1d8b96e279f34b9759b65037bec4bf6ccda6929705aeeeebe49e327e4d7a916620c9faf3765120658af34c53fbb97ec07657b3f088fcbdc401aa7949ddeda34d885018c2c23f4f0bb8218bf0d4fc90643658b4d8834f4a8c08e590c2a790995baa9e77627c342d283e454f84fcc05be15e9627a2d9be340c9d72f222bbdfc47905f56616cd9f936d49e4732f319f020513340fb8b22828db251b102b6b137c9533936d6 -CT = bd11ed07b7b4b30eeaf25d6a41a549cca0a5aee71f990ac566a37265d7af2ce3c03703427ee0b2755c2bdfc29f9d826aec6ee4ad28af48079ac23db16580b97424f3a4e35cc23625d39f95699d9ff5143e9a2bc26fcfee4f125f5aa2d968ccfc2faaf9db3c28850f6757f735cbc50c94c498bcde4f23bffafa8dd5f70d1a011e35eb26e905d4e68848fedebeb197be595c085ba33f11ba8398258445051751888e9bba111f800f31b37c447074ca6dce6d54b4dfad6cee5138643d4f6ac045e8047248924e88ea4294c7878bc22c9b41924ce301f22693c33733107bf1ba85e34806c5e4366ea66fc52a5f89dd9bf213239158b3d4d2600dde696c61d76c398b9bf10de9118e812e891c8f3355c0ecc6405f79bc32a58905e37888a1d8395fbedc3ac54eca569f -TAG = 296a397d280d026fc3627f4718971be9 - -# BoringSSL has additional tests here for truncated tags. *ring* doesn't -# support tag truncation, so those tests were removed. diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/tests/aead_tests.rs temporalio-1.3.0/vendor/ring-0.16.20/tests/aead_tests.rs --- temporalio-1.3.0/vendor/ring-0.16.20/tests/aead_tests.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/tests/aead_tests.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,459 +0,0 @@ -// Copyright 2015-2016 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -#![cfg(any(not(target_arch = "wasm32"), feature = "wasm32_c"))] - -#[cfg(target_arch = "wasm32")] -use wasm_bindgen_test::{wasm_bindgen_test, wasm_bindgen_test_configure}; - -#[cfg(target_arch = "wasm32")] -wasm_bindgen_test_configure!(run_in_browser); - -use core::ops::RangeFrom; -use ring::{aead, error, test, test_file}; - -#[test] -#[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -fn aead_aes_gcm_128() { - test_aead( - &aead::AES_128_GCM, - seal_with_key, - open_with_key, - test_file!("aead_aes_128_gcm_tests.txt"), - ); - test_aead( - &aead::AES_128_GCM, - seal_with_less_safe_key, - open_with_less_safe_key, - test_file!("aead_aes_128_gcm_tests.txt"), - ); -} - -#[test] -#[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -fn aead_aes_gcm_256() { - test_aead( - &aead::AES_256_GCM, - seal_with_key, - open_with_key, - test_file!("aead_aes_256_gcm_tests.txt"), - ); - test_aead( - &aead::AES_256_GCM, - seal_with_less_safe_key, - open_with_less_safe_key, - test_file!("aead_aes_256_gcm_tests.txt"), - ); -} - -#[cfg(any( - target_arch = "aarch64", - target_arch = "arm", - target_arch = "x86_64", - target_arch = "x86" -))] -#[test] -fn aead_chacha20_poly1305() { - test_aead( - &aead::CHACHA20_POLY1305, - seal_with_key, - open_with_key, - test_file!("aead_chacha20_poly1305_tests.txt"), - ); - test_aead( - &aead::CHACHA20_POLY1305, - seal_with_less_safe_key, - open_with_less_safe_key, - test_file!("aead_chacha20_poly1305_tests.txt"), - ); -} - -fn test_aead( - aead_alg: &'static aead::Algorithm, - seal: Seal, - open: Open, - test_file: test::File, -) where - Seal: Fn( - &'static aead::Algorithm, - &[u8], - aead::Nonce, - aead::Aad<&[u8]>, - &mut Vec, - ) -> Result<(), error::Unspecified>, - Open: for<'a> Fn( - &'static aead::Algorithm, - &[u8], - aead::Nonce, - aead::Aad<&[u8]>, - &'a mut [u8], - RangeFrom, - ) -> Result<&'a mut [u8], error::Unspecified>, -{ - test_aead_key_sizes(aead_alg); - - test::run(test_file, |section, test_case| { - assert_eq!(section, ""); - let key_bytes = test_case.consume_bytes("KEY"); - let nonce_bytes = test_case.consume_bytes("NONCE"); - let plaintext = test_case.consume_bytes("IN"); - let aad = test_case.consume_bytes("AD"); - let mut ct = test_case.consume_bytes("CT"); - let tag = test_case.consume_bytes("TAG"); - let error = test_case.consume_optional_string("FAILS"); - - match &error { - Some(err) if err == "WRONG_NONCE_LENGTH" => { - assert!(aead::Nonce::try_assume_unique_for_key(&nonce_bytes).is_err()); - return Ok(()); - } - _ => (), - }; - - let mut s_in_out = plaintext.clone(); - let nonce = aead::Nonce::try_assume_unique_for_key(&nonce_bytes).unwrap(); - let s_result = seal( - aead_alg, - &key_bytes[..], - nonce, - aead::Aad::from(&aad[..]), - &mut s_in_out, - ); - - ct.extend(tag); - - if s_result.is_ok() { - assert_eq!(&ct, &s_in_out); - } - - // In release builds, test all prefix lengths from 0 to 4096 bytes. - // Debug builds are too slow for this, so for those builds, only - // test a smaller subset. - - // TLS record headers are 5 bytes long. - // TLS explicit nonces for AES-GCM are 8 bytes long. - static MINIMAL_IN_PREFIX_LENS: [usize; 36] = [ - // No input prefix to overwrite; i.e. the opening is exactly - // "in place." - 0, - 1, - 2, - // Proposed TLS 1.3 header (no explicit nonce). - 5, - 8, - // Probably the most common use of a non-zero `in_prefix_len` - // would be to write a decrypted TLS record over the top of the - // TLS header and nonce. - 5 /* record header */ + 8, /* explicit nonce */ - // The stitched AES-GCM x86-64 code works on 6-block (96 byte) - // units. Some of the ChaCha20 code is even weirder. - 15, // The maximum partial AES block. - 16, // One AES block. - 17, // One byte more than a full AES block. - 31, // 2 AES blocks or 1 ChaCha20 block, minus 1. - 32, // Two AES blocks, one ChaCha20 block. - 33, // 2 AES blocks or 1 ChaCha20 block, plus 1. - 47, // Three AES blocks - 1. - 48, // Three AES blocks. - 49, // Three AES blocks + 1. - 63, // Four AES blocks or two ChaCha20 blocks, minus 1. - 64, // Four AES blocks or two ChaCha20 blocks. - 65, // Four AES blocks or two ChaCha20 blocks, plus 1. - 79, // Five AES blocks, minus 1. - 80, // Five AES blocks. - 81, // Five AES blocks, plus 1. - 95, // Six AES blocks or three ChaCha20 blocks, minus 1. - 96, // Six AES blocks or three ChaCha20 blocks. - 97, // Six AES blocks or three ChaCha20 blocks, plus 1. - 111, // Seven AES blocks, minus 1. - 112, // Seven AES blocks. - 113, // Seven AES blocks, plus 1. - 127, // Eight AES blocks or four ChaCha20 blocks, minus 1. - 128, // Eight AES blocks or four ChaCha20 blocks. - 129, // Eight AES blocks or four ChaCha20 blocks, plus 1. - 143, // Nine AES blocks, minus 1. - 144, // Nine AES blocks. - 145, // Nine AES blocks, plus 1. - 255, // 16 AES blocks or 8 ChaCha20 blocks, minus 1. - 256, // 16 AES blocks or 8 ChaCha20 blocks. - 257, // 16 AES blocks or 8 ChaCha20 blocks, plus 1. - ]; - - let mut more_comprehensive_in_prefix_lengths = [0; 4096]; - let in_prefix_lengths = if cfg!(debug_assertions) { - &MINIMAL_IN_PREFIX_LENS[..] - } else { - #[allow(clippy::needless_range_loop)] - for b in 0..more_comprehensive_in_prefix_lengths.len() { - more_comprehensive_in_prefix_lengths[b] = b; - } - &more_comprehensive_in_prefix_lengths[..] - }; - let mut o_in_out = vec![123u8; 4096]; - - for &in_prefix_len in in_prefix_lengths.iter() { - o_in_out.truncate(0); - o_in_out.resize(in_prefix_len, 123); - o_in_out.extend_from_slice(&ct[..]); - - let nonce = aead::Nonce::try_assume_unique_for_key(&nonce_bytes).unwrap(); - let o_result = open( - aead_alg, - &key_bytes, - nonce, - aead::Aad::from(&aad[..]), - &mut o_in_out, - in_prefix_len.., - ); - match error { - None => { - assert!(s_result.is_ok()); - assert_eq!(&plaintext[..], o_result.unwrap()); - } - Some(ref error) if error == "WRONG_NONCE_LENGTH" => { - assert_eq!(Err(error::Unspecified), s_result); - assert_eq!(Err(error::Unspecified), o_result); - } - Some(error) => { - unreachable!("Unexpected error test case: {}", error); - } - }; - } - - Ok(()) - }); -} - -fn seal_with_key( - algorithm: &'static aead::Algorithm, - key: &[u8], - nonce: aead::Nonce, - aad: aead::Aad<&[u8]>, - in_out: &mut Vec, -) -> Result<(), error::Unspecified> { - let mut s_key: aead::SealingKey = make_key(algorithm, key, nonce); - s_key.seal_in_place_append_tag(aad, in_out) -} - -fn open_with_key<'a>( - algorithm: &'static aead::Algorithm, - key: &[u8], - nonce: aead::Nonce, - aad: aead::Aad<&[u8]>, - in_out: &'a mut [u8], - ciphertext_and_tag: RangeFrom, -) -> Result<&'a mut [u8], error::Unspecified> { - let mut o_key: aead::OpeningKey = make_key(algorithm, key, nonce); - o_key.open_within(aad, in_out, ciphertext_and_tag) -} - -fn seal_with_less_safe_key( - algorithm: &'static aead::Algorithm, - key: &[u8], - nonce: aead::Nonce, - aad: aead::Aad<&[u8]>, - in_out: &mut Vec, -) -> Result<(), error::Unspecified> { - let key = make_less_safe_key(algorithm, key); - key.seal_in_place_append_tag(nonce, aad, in_out) -} - -fn open_with_less_safe_key<'a>( - algorithm: &'static aead::Algorithm, - key: &[u8], - nonce: aead::Nonce, - aad: aead::Aad<&[u8]>, - in_out: &'a mut [u8], - ciphertext_and_tag: RangeFrom, -) -> Result<&'a mut [u8], error::Unspecified> { - let key = make_less_safe_key(algorithm, key); - key.open_within(nonce, aad, in_out, ciphertext_and_tag) -} - -#[allow(clippy::range_plus_one)] -fn test_aead_key_sizes(aead_alg: &'static aead::Algorithm) { - let key_len = aead_alg.key_len(); - let key_data = vec![0u8; key_len * 2]; - - // Key is the right size. - assert!(aead::UnboundKey::new(aead_alg, &key_data[..key_len]).is_ok()); - - // Key is one byte too small. - assert!(aead::UnboundKey::new(aead_alg, &key_data[..(key_len - 1)]).is_err()); - - // Key is one byte too large. - assert!(aead::UnboundKey::new(aead_alg, &key_data[..(key_len + 1)]).is_err()); - - // Key is half the required size. - assert!(aead::UnboundKey::new(aead_alg, &key_data[..(key_len / 2)]).is_err()); - - // Key is twice the required size. - assert!(aead::UnboundKey::new(aead_alg, &key_data[..(key_len * 2)]).is_err()); - - // Key is empty. - assert!(aead::UnboundKey::new(aead_alg, &[]).is_err()); - - // Key is one byte. - assert!(aead::UnboundKey::new(aead_alg, &[0]).is_err()); -} - -// Test that we reject non-standard nonce sizes. -#[allow(clippy::range_plus_one)] -#[test] -fn test_aead_nonce_sizes() -> Result<(), error::Unspecified> { - let nonce_len = aead::NONCE_LEN; - let nonce = vec![0u8; nonce_len * 2]; - - assert!(aead::Nonce::try_assume_unique_for_key(&nonce[..nonce_len]).is_ok()); - assert!(aead::Nonce::try_assume_unique_for_key(&nonce[..(nonce_len - 1)]).is_err()); - assert!(aead::Nonce::try_assume_unique_for_key(&nonce[..(nonce_len + 1)]).is_err()); - assert!(aead::Nonce::try_assume_unique_for_key(&nonce[..(nonce_len / 2)]).is_err()); - assert!(aead::Nonce::try_assume_unique_for_key(&nonce[..(nonce_len * 2)]).is_err()); - assert!(aead::Nonce::try_assume_unique_for_key(&[]).is_err()); - assert!(aead::Nonce::try_assume_unique_for_key(&nonce[..1]).is_err()); - assert!(aead::Nonce::try_assume_unique_for_key(&nonce[..16]).is_err()); // 128 bits. - - Ok(()) -} - -#[cfg(any( - target_arch = "aarch64", - target_arch = "arm", - target_arch = "x86_64", - target_arch = "x86" -))] -#[allow(clippy::range_plus_one)] -#[test] -fn aead_chacha20_poly1305_openssh() { - // TODO: test_aead_key_sizes(...); - - test::run( - test_file!("aead_chacha20_poly1305_openssh_tests.txt"), - |section, test_case| { - assert_eq!(section, ""); - - // XXX: `polyfill::convert` isn't available here. - let key_bytes = { - let as_vec = test_case.consume_bytes("KEY"); - let mut as_array = [0u8; aead::chacha20_poly1305_openssh::KEY_LEN]; - as_array.copy_from_slice(&as_vec); - as_array - }; - - let sequence_number = test_case.consume_usize("SEQUENCE_NUMBER"); - assert_eq!(sequence_number as u32 as usize, sequence_number); - let sequence_num = sequence_number as u32; - let plaintext = test_case.consume_bytes("IN"); - let ct = test_case.consume_bytes("CT"); - let expected_tag = test_case.consume_bytes("TAG"); - - // TODO: Add some tests for when things fail. - //let error = test_case.consume_optional_string("FAILS"); - - let mut tag = [0u8; aead::chacha20_poly1305_openssh::TAG_LEN]; - let mut s_in_out = plaintext.clone(); - let s_key = aead::chacha20_poly1305_openssh::SealingKey::new(&key_bytes); - s_key.seal_in_place(sequence_num, &mut s_in_out[..], &mut tag); - assert_eq!(&ct, &s_in_out); - assert_eq!(&expected_tag, &tag); - let o_key = aead::chacha20_poly1305_openssh::OpeningKey::new(&key_bytes); - - { - let o_result = o_key.open_in_place(sequence_num, &mut s_in_out[..], &tag); - assert_eq!(o_result, Ok(&plaintext[4..])); - } - assert_eq!(&s_in_out[..4], &ct[..4]); - assert_eq!(&s_in_out[4..], &plaintext[4..]); - - Ok(()) - }, - ); -} - -#[test] -#[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -fn test_tag_traits() { - test::compile_time_assert_send::(); - test::compile_time_assert_sync::(); -} - -#[test] -#[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -fn test_aead_key_debug() { - let key_bytes = [0; 32]; - let nonce = [0; aead::NONCE_LEN]; - - let key = aead::UnboundKey::new(&aead::AES_256_GCM, &key_bytes).unwrap(); - assert_eq!( - "UnboundKey { algorithm: AES_256_GCM }", - format!("{:?}", key) - ); - - let sealing_key: aead::SealingKey = make_key( - &aead::AES_256_GCM, - &key_bytes, - aead::Nonce::try_assume_unique_for_key(&nonce).unwrap(), - ); - assert_eq!( - "SealingKey { algorithm: AES_256_GCM }", - format!("{:?}", sealing_key) - ); - - let opening_key: aead::OpeningKey = make_key( - &aead::AES_256_GCM, - &key_bytes, - aead::Nonce::try_assume_unique_for_key(&nonce).unwrap(), - ); - assert_eq!( - "OpeningKey { algorithm: AES_256_GCM }", - format!("{:?}", opening_key) - ); - - let key: aead::LessSafeKey = make_less_safe_key(&aead::AES_256_GCM, &key_bytes); - assert_eq!( - "LessSafeKey { algorithm: AES_256_GCM }", - format!("{:?}", key) - ); -} - -fn make_key>( - algorithm: &'static aead::Algorithm, - key: &[u8], - nonce: aead::Nonce, -) -> K { - let key = aead::UnboundKey::new(algorithm, key).unwrap(); - let nonce_sequence = OneNonceSequence::new(nonce); - K::new(key, nonce_sequence) -} - -fn make_less_safe_key(algorithm: &'static aead::Algorithm, key: &[u8]) -> aead::LessSafeKey { - let key = aead::UnboundKey::new(algorithm, key).unwrap(); - aead::LessSafeKey::new(key) -} - -struct OneNonceSequence(Option); - -impl OneNonceSequence { - /// Constructs the sequence allowing `advance()` to be called - /// `allowed_invocations` times. - fn new(nonce: aead::Nonce) -> Self { - Self(Some(nonce)) - } -} - -impl aead::NonceSequence for OneNonceSequence { - fn advance(&mut self) -> Result { - self.0.take().ok_or(error::Unspecified) - } -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/tests/agreement_tests.rs temporalio-1.3.0/vendor/ring-0.16.20/tests/agreement_tests.rs --- temporalio-1.3.0/vendor/ring-0.16.20/tests/agreement_tests.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/tests/agreement_tests.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,209 +0,0 @@ -// Copyright 2015-2017 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -extern crate alloc; - -use ring::{agreement, error, rand, test, test_file}; - -#[test] -fn agreement_traits() { - use alloc::vec::Vec; - - let rng = rand::SystemRandom::new(); - let private_key = - agreement::EphemeralPrivateKey::generate(&agreement::ECDH_P256, &rng).unwrap(); - - test::compile_time_assert_send::(); - test::compile_time_assert_sync::(); - - assert_eq!( - format!("{:?}", &private_key), - "EphemeralPrivateKey { algorithm: Algorithm { curve: P256 } }" - ); - - let public_key = private_key.compute_public_key().unwrap(); - - test::compile_time_assert_clone::(); - test::compile_time_assert_send::(); - test::compile_time_assert_sync::(); - - // Verify `PublicKey` implements `Debug`. - // - // TODO: Test the actual output. - let _: &dyn core::fmt::Debug = &public_key; - - test::compile_time_assert_clone::>(); - test::compile_time_assert_copy::>(); - test::compile_time_assert_sync::>(); - - test::compile_time_assert_clone::>>(); - test::compile_time_assert_sync::>>(); - - let unparsed_public_key = - agreement::UnparsedPublicKey::new(&agreement::X25519, &[0x01, 0x02, 0x03]); - - assert_eq!( - format!("{:?}", unparsed_public_key), - r#"UnparsedPublicKey { algorithm: Algorithm { curve: Curve25519 }, bytes: "010203" }"# - ); -} - -#[test] -fn agreement_agree_ephemeral() { - let rng = rand::SystemRandom::new(); - - test::run(test_file!("agreement_tests.txt"), |section, test_case| { - assert_eq!(section, ""); - - let curve_name = test_case.consume_string("Curve"); - let alg = alg_from_curve_name(&curve_name); - let peer_public = agreement::UnparsedPublicKey::new(alg, test_case.consume_bytes("PeerQ")); - - match test_case.consume_optional_string("Error") { - None => { - let my_private = test_case.consume_bytes("D"); - let my_private = { - let rng = test::rand::FixedSliceRandom { bytes: &my_private }; - agreement::EphemeralPrivateKey::generate(alg, &rng)? - }; - let my_public = test_case.consume_bytes("MyQ"); - let output = test_case.consume_bytes("Output"); - - assert_eq!(my_private.algorithm(), alg); - - let computed_public = my_private.compute_public_key().unwrap(); - assert_eq!(computed_public.as_ref(), &my_public[..]); - - assert_eq!(my_private.algorithm(), alg); - - let result = - agreement::agree_ephemeral(my_private, &peer_public, (), |key_material| { - assert_eq!(key_material, &output[..]); - Ok(()) - }); - assert_eq!(result, Ok(())); - } - - Some(_) => { - // In the no-heap mode, some algorithms aren't supported so - // we have to skip those algorithms' test cases. - let dummy_private_key = agreement::EphemeralPrivateKey::generate(alg, &rng)?; - fn kdf_not_called(_: &[u8]) -> Result<(), ()> { - panic!( - "The KDF was called during ECDH when the peer's \ - public key is invalid." - ); - } - assert!(agreement::agree_ephemeral( - dummy_private_key, - &peer_public, - (), - kdf_not_called - ) - .is_err()); - } - } - - Ok(()) - }); -} - -#[test] -fn test_agreement_ecdh_x25519_rfc_iterated() { - let mut k = h("0900000000000000000000000000000000000000000000000000000000000000"); - let mut u = k.clone(); - - fn expect_iterated_x25519( - expected_result: &str, - range: core::ops::Range, - k: &mut Vec, - u: &mut Vec, - ) { - for _ in range { - let new_k = x25519(k, u); - *u = k.clone(); - *k = new_k; - } - assert_eq!(&h(expected_result), k); - } - - expect_iterated_x25519( - "422c8e7a6227d7bca1350b3e2bb7279f7897b87bb6854b783c60e80311ae3079", - 0..1, - &mut k, - &mut u, - ); - expect_iterated_x25519( - "684cf59ba83309552800ef566f2f4d3c1c3887c49360e3875f2eb94d99532c51", - 1..1_000, - &mut k, - &mut u, - ); - - // The spec gives a test vector for 1,000,000 iterations but it takes - // too long to do 1,000,000 iterations by default right now. This - // 10,000 iteration vector is self-computed. - expect_iterated_x25519( - "2c125a20f639d504a7703d2e223c79a79de48c4ee8c23379aa19a62ecd211815", - 1_000..10_000, - &mut k, - &mut u, - ); - - if cfg!(feature = "slow_tests") { - expect_iterated_x25519( - "7c3911e0ab2586fd864497297e575e6f3bc601c0883c30df5f4dd2d24f665424", - 10_000..1_000_000, - &mut k, - &mut u, - ); - } -} - -fn x25519(private_key: &[u8], public_key: &[u8]) -> Vec { - x25519_(private_key, public_key).unwrap() -} - -fn x25519_(private_key: &[u8], public_key: &[u8]) -> Result, error::Unspecified> { - let rng = test::rand::FixedSliceRandom { bytes: private_key }; - let private_key = agreement::EphemeralPrivateKey::generate(&agreement::X25519, &rng)?; - let public_key = agreement::UnparsedPublicKey::new(&agreement::X25519, public_key); - agreement::agree_ephemeral( - private_key, - &public_key, - error::Unspecified, - |agreed_value| Ok(Vec::from(agreed_value)), - ) -} - -fn h(s: &str) -> Vec { - match test::from_hex(s) { - Ok(v) => v, - Err(msg) => { - panic!("{} in {}", msg, s); - } - } -} - -fn alg_from_curve_name(curve_name: &str) -> &'static agreement::Algorithm { - if curve_name == "P-256" { - &agreement::ECDH_P256 - } else if curve_name == "P-384" { - &agreement::ECDH_P384 - } else if curve_name == "X25519" { - &agreement::X25519 - } else { - panic!("Unsupported curve: {}", curve_name); - } -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/tests/agreement_tests.txt temporalio-1.3.0/vendor/ring-0.16.20/tests/agreement_tests.txt --- temporalio-1.3.0/vendor/ring-0.16.20/tests/agreement_tests.txt 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/tests/agreement_tests.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,641 +0,0 @@ -# RFC 7748 (X25519) Test Vectors -# -# PeerQ is the "Input u-coordinate." -# D is the "Input scalar." -# XXX: MyQ is not provided in the RFC, so we calculated it ourselves. -# Output is the "Output u-coordinate." - -Curve = X25519 -PeerQ = e6db6867583030db3594c1a424b15f7c726624ec26b3353b10a903a6d0ab1c4c -D = a546e36bf0527c9d3b16154b82465edd62144c0ac1fc5a18506a2244ba449ac4 -MyQ = 1c9fd88f45606d932a80c71824ae151d15d73e77de38e8e000852e614fae7019 -Output = c3da55379de9c6908e94ea4df28d084f32eccf03491c71f754b4075577a28552 - -Curve = X25519 -PeerQ = e5210f12786811d3f4b7959d0538ae2c31dbe7106fc03c3efc4cd549c715a493 -D = 4b66e9d4d1b4673c5ad22691957d6af5c11b6421e0ea01d42ca4169e7918ba0d -MyQ = ff63fe57bfbf43fa3f563628b149af704d3db625369c49983650347a6a71e00e -Output = 95cbde9476e8907d7aade45cb4b873f88b595a68799fa152e6f8f7647aac7957 - - -# Additional X25519 Test Vectors - -Curve = X25519 -PeerQ = "" -Error = Peer public key is empty. - -Curve = X25519 -PeerQ = 00 -Error = Peer public key is too short. - -Curve = X25519 -PeerQ = e5210f12786811d3f4b7959d0538ae2c31dbe7106fc03c3efc4cd549c715a4 -Error = Peer public key is too short. - -Curve = X25519 -PeerQ = e5210f12786811d3f4b7959d0538ae2c31dbe7106fc03c3efc4cd549c715a49300 -Error = Peer public key is too long (zero appended). - -Curve = X25519 -PeerQ = 00e5210f12786811d3f4b7959d0538ae2c31dbe7106fc03c3efc4cd549c715a493 -Error = Peer public key is too long (zero prepended). - - -# RFC 5903 (IKE and IKEv2 ECDH) Test Vectors -# -# PeerQ is (grx, gry) in uncompressed encoding. -# D is i. -# MyQ is (gix, giy) in uncompressed encoding. -# Output is girx. - -Curve = P-256 -PeerQ = 04D12DFB5289C8D4F81208B70270398C342296970A0BCCB74C736FC7554494BF6356FBF3CA366CC23E8157854C13C58D6AAC23F046ADA30F8353E74F33039872AB -D = C88F01F510D9AC3F70A292DAA2316DE544E9AAB8AFE84049C62A9C57862D1433 -MyQ = 04DAD0B65394221CF9B051E1FECA5787D098DFE637FC90B9EF945D0C37725811805271A0461CDB8252D61F1C456FA3E59AB1F45B33ACCF5F58389E0577B8990BB3 -Output = D6840F6B42F6EDAFD13116E0E12565202FEF8E9ECE7DCE03812464D04B9442DE - -Curve = P-384 -PeerQ = 04E558DBEF53EECDE3D3FCCFC1AEA08A89A987475D12FD950D83CFA41732BC509D0D1AC43A0336DEF96FDA41D0774A3571DCFBEC7AACF3196472169E838430367F66EEBE3C6E70C416DD5F0C68759DD1FFF83FA40142209DFF5EAAD96DB9E6386C -D = 099F3C7034D4A2C699884D73A375A67F7624EF7C6B3C0F160647B67414DCE655E35B538041E649EE3FAEF896783AB194 -MyQ = 04667842D7D180AC2CDE6F74F37551F55755C7645C20EF73E31634FE72B4C55EE6DE3AC808ACB4BDB4C88732AEE95F41AA9482ED1FC0EEB9CAFC4984625CCFC23F65032149E0E144ADA024181535A0F38EEB9FCFF3C2C947DAE69B4C634573A81C -Output = 11187331C279962D93D604243FD592CB9D0A926F422E47187521287E7156C5C4D603135569B9E9D09CF5D4A270F59746 - - -# Tweaks of the RFC 5903 vectors for testing malformed (syntactically) public -# keys - -Curve = P-256 -PeerQ = "" -Error = Peer public key is empty. - -Curve = P-384 -PeerQ = "" -Error = Peer public key is empty. - -Curve = P-256 -PeerQ = 00 -Error = Peer public key is the special encoding of the point at infinity. - -Curve = P-384 -PeerQ = 00 -Error = Peer public key is the special encoding of the point at infinity. - -Curve = P-256 -PeerQ = 01 -Error = Peer public key consists of (only) an invalid encoding indicator. - -Curve = P-384 -PeerQ = 01 -Error = Peer public key consists of (only) an invalid encoding indicator. - -Curve = P-256 -PeerQ = 02 -Error = Peer public key consists of (only) a compressed encoding indicator (0x02). - -Curve = P-384 -PeerQ = 02 -Error = Peer public key consists of (only) a compressed encoding indicator (0x02). - -Curve = P-256 -PeerQ = 03 -Error = Peer public key consists of (only) a compressed encoding indicator (0x03). - -Curve = P-384 -PeerQ = 03 -Error = Peer public key consists of (only) a compressed encoding indicator (0x03). - -Curve = P-256 -PeerQ = 04 -Error = Peer public key consists of (only) a uncompressed encoding indicator. - -Curve = P-384 -PeerQ = 04 -Error = Peer public key consists of (only) a compressed encoding indicator. - -Curve = P-256 -PeerQ = 04 -Error = Peer public key consists of (only) an invalid encoding indicator (0x05). - -Curve = P-384 -PeerQ = 04 -Error = Peer public key consists of (only) an invalid encoding indicator (0x05). - -Curve = P-256 -PeerQ = 01D12DFB5289C8D4F81208B70270398C342296970A0BCCB74C736FC7554494BF6356FBF3CA366CC23E8157854C13C58D6AAC23F046ADA30F8353E74F33039872AB -Error = Peer public key starts with a completely invalid encoding indicator byte (0x01). - -Curve = P-384 -PeerQ = 01E558DBEF53EECDE3D3FCCFC1AEA08A89A987475D12FD950D83CFA41732BC509D0D1AC43A0336DEF96FDA41D0774A3571DCFBEC7AACF3196472169E838430367F66EEBE3C6E70C416DD5F0C68759DD1FFF83FA40142209DFF5EAAD96DB9E6386C -Error = Peer public key starts with a completely invalid encoding indicator byte (0x01). - -Curve = P-256 -PeerQ = 02D12DFB5289C8D4F81208B70270398C342296970A0BCCB74C736FC7554494BF6356FBF3CA366CC23E8157854C13C58D6AAC23F046ADA30F8353E74F33039872AB -Error = Peer public key encoding's first byte is 0x02, should be 0x04. - -Curve = P-384 -PeerQ = 02E558DBEF53EECDE3D3FCCFC1AEA08A89A987475D12FD950D83CFA41732BC509D0D1AC43A0336DEF96FDA41D0774A3571DCFBEC7AACF3196472169E838430367F66EEBE3C6E70C416DD5F0C68759DD1FFF83FA40142209DFF5EAAD96DB9E6386C -Error = Peer public key encoding's first byte is 0x02, should be 0x04. - -Curve = P-256 -PeerQ = 03D12DFB5289C8D4F81208B70270398C342296970A0BCCB74C736FC7554494BF6356FBF3CA366CC23E8157854C13C58D6AAC23F046ADA30F8353E74F33039872AB -Error = Peer public key encoding's first byte is 0x03, should be 0x04. - -Curve = P-384 -PeerQ = 03E558DBEF53EECDE3D3FCCFC1AEA08A89A987475D12FD950D83CFA41732BC509D0D1AC43A0336DEF96FDA41D0774A3571DCFBEC7AACF3196472169E838430367F66EEBE3C6E70C416DD5F0C68759DD1FFF83FA40142209DFF5EAAD96DB9E6386C -Error = Peer public key encoding's first byte is 0x03, should be 0x04. - -Curve = P-256 -PeerQ = 05D12DFB5289C8D4F81208B70270398C342296970A0BCCB74C736FC7554494BF6356FBF3CA366CC23E8157854C13C58D6AAC23F046ADA30F8353E74F33039872AB -Error = Peer public key starts with a completely invalid encoding indicator byte (0x05). - -Curve = P-384 -PeerQ = 05E558DBEF53EECDE3D3FCCFC1AEA08A89A987475D12FD950D83CFA41732BC509D0D1AC43A0336DEF96FDA41D0774A3571DCFBEC7AACF3196472169E838430367F66EEBE3C6E70C416DD5F0C68759DD1FFF83FA40142209DFF5EAAD96DB9E6386C -Error = Peer public key starts with a completely invalid encoding indicator byte (0x05). - -Curve = P-256 -PeerQ = FFD12DFB5289C8D4F81208B70270398C342296970A0BCCB74C736FC7554494BF6356FBF3CA366CC23E8157854C13C58D6AAC23F046ADA30F8353E74F33039872AB -Error = Peer public key starts with a completely invalid encoding indicator byte (0xff). - -Curve = P-384 -PeerQ = FFE558DBEF53EECDE3D3FCCFC1AEA08A89A987475D12FD950D83CFA41732BC509D0D1AC43A0336DEF96FDA41D0774A3571DCFBEC7AACF3196472169E838430367F66EEBE3C6E70C416DD5F0C68759DD1FFF83FA40142209DFF5EAAD96DB9E6386C -Error = Peer public key starts with a completely invalid encoding indicator byte (0xff). - -Curve = P-256 -PeerQ = D12DFB5289C8D4F81208B70270398C342296970A0BCCB74C736FC7554494BF6356FBF3CA366CC23E8157854C13C58D6AAC23F046ADA30F8353E74F33039872AB -Error = Peer public key is missing the encoding indicator byte. - -Curve = P-384 -PeerQ = E558DBEF53EECDE3D3FCCFC1AEA08A89A987475D12FD950D83CFA41732BC509D0D1AC43A0336DEF96FDA41D0774A3571DCFBEC7AACF3196472169E838430367F66EEBE3C6E70C416DD5F0C68759DD1FFF83FA40142209DFF5EAAD96DB9E6386C -Error = Peer public key is missing the encoding indicator byte. - -Curve = P-256 -PeerQ = 04D12DFB5289C8D4F81208B70270398C342296970A0BCCB74C736FC7554494BF6356FBF3CA366CC23E8157854C13C58D6AAC23F046ADA30F8353E74F33039872 -Error = Peer public key has the last byte truncated. - -Curve = P-384 -PeerQ = 04E558DBEF53EECDE3D3FCCFC1AEA08A89A987475D12FD950D83CFA41732BC509D0D1AC43A0336DEF96FDA41D0774A3571DCFBEC7AACF3196472169E838430367F66EEBE3C6E70C416DD5F0C68759DD1FFF83FA40142209DFF5EAAD96DB9E638 -Error = Peer public key has the last byte truncated. - -Curve = P-256 -PeerQ = 04D12DFB5289C8D4F81208B70270398C342296970A0BCCB74C736FC7554494BF63 -Error = Peer public key is missing the Y coordinate completely. - -Curve = P-384 -PeerQ = 04E558DBEF53EECDE3D3FCCFC1AEA08A89A987475D12FD950D83CFA41732BC509D0D1AC43A0336DEF96FDA41D0774A3571 -Error = Peer public key is missing the Y coordinate completely. - -Curve = P-256 -PeerQ = 02D12DFB5289C8D4F81208B70270398C342296970A0BCCB74C736FC7554494BF63 -Error = Peer public key is in compressed form (0x02). - -Curve = P-384 -PeerQ = 02E558DBEF53EECDE3D3FCCFC1AEA08A89A987475D12FD950D83CFA41732BC509D0D1AC43A0336DEF96FDA41D0774A3571 -Error = Peer public key is in compressed form (0x02). - -Curve = P-256 -PeerQ = 03D12DFB5289C8D4F81208B70270398C342296970A0BCCB74C736FC7554494BF63 -Error = Peer public key is in compressed form (0x03). - -Curve = P-384 -PeerQ = 03E558DBEF53EECDE3D3FCCFC1AEA08A89A987475D12FD950D83CFA41732BC509D0D1AC43A0336DEF96FDA41D0774A3571 -Error = Peer public key is in compressed form (0x03). - - -# NIST vectors from -# http://csrc.nist.gov/groups/STM/cavp/documents/components/ecccdhtestvectors.zip -# -# Only P-256 and P-384 vectors were copied. The "[P-256]" and "[P-384]" -# headings were replaced with "Curve = P-256" and "Curve = P-384" on each test -# case. -# -# PeerQ is (QCAVSx, QCAVSy) in uncompressed encoding. -# D is dIUT. -# MyQ is (QIUTx, QIUTy) in uncompressed encoding. -# Output is ZIUT. -# -# Note that these test vectors don't seem to test any interesting edge cases, -# and in particular they don't test any cases where the public point is -# invalid. - -Curve = P-256 -PeerQ = 04700c48f77f56584c5cc632ca65640db91b6bacce3a4df6b42ce7cc838833d287db71e509e3fd9b060ddb20ba5c51dcc5948d46fbf640dfe0441782cab85fa4ac -D = 7d7dc5f71eb29ddaf80d6214632eeae03d9058af1fb6d22ed80badb62bc1a534 -MyQ = 04ead218590119e8876b29146ff89ca61770c4edbbf97d38ce385ed281d8a6b23028af61281fd35e2fa7002523acc85a429cb06ee6648325389f59edfce1405141 -Output = 46fc62106420ff012e54a434fbdd2d25ccc5852060561e68040dd7778997bd7b - -Curve = P-256 -PeerQ = 04809f04289c64348c01515eb03d5ce7ac1a8cb9498f5caa50197e58d43a86a7aeb29d84e811197f25eba8f5194092cb6ff440e26d4421011372461f579271cda3 -D = 38f65d6dce47676044d58ce5139582d568f64bb16098d179dbab07741dd5caf5 -MyQ = 04119f2f047902782ab0c9e27a54aff5eb9b964829ca99c06b02ddba95b0a3f6d08f52b726664cac366fc98ac7a012b2682cbd962e5acb544671d41b9445704d1d -Output = 057d636096cb80b67a8c038c890e887d1adfa4195e9b3ce241c8a778c59cda67 - -Curve = P-256 -PeerQ = 04a2339c12d4a03c33546de533268b4ad667debf458b464d77443636440ee7fec3ef48a3ab26e20220bcda2c1851076839dae88eae962869a497bf73cb66faf536 -D = 1accfaf1b97712b85a6f54b148985a1bdc4c9bec0bd258cad4b3d603f49f32c8 -MyQ = 04d9f2b79c172845bfdb560bbb01447ca5ecc0470a09513b6126902c6b4f8d1051f815ef5ec32128d3487834764678702e64e164ff7315185e23aff5facd96d7bc -Output = 2d457b78b4614132477618a5b077965ec90730a8c81a1c75d6d4ec68005d67ec - -Curve = P-256 -PeerQ = 04df3989b9fa55495719b3cf46dccd28b5153f7808191dd518eff0c3cff2b705ed422294ff46003429d739a33206c8752552c8ba54a270defc06e221e0feaf6ac4 -D = 207c43a79bfee03db6f4b944f53d2fb76cc49ef1c9c4d34d51b6c65c4db6932d -MyQ = 0424277c33f450462dcb3d4801d57b9ced05188f16c28eda873258048cd1607e0dc4789753e2b1f63b32ff014ec42cd6a69fac81dfe6d0d6fd4af372ae27c46f88 -Output = 96441259534b80f6aee3d287a6bb17b5094dd4277d9e294f8fe73e48bf2a0024 - -Curve = P-256 -PeerQ = 0441192d2813e79561e6a1d6f53c8bc1a433a199c835e141b05a74a97b0faeb9221af98cc45e98a7e041b01cf35f462b7562281351c8ebf3ffa02e33a0722a1328 -D = 59137e38152350b195c9718d39673d519838055ad908dd4757152fd8255c09bf -MyQ = 04a8c5fdce8b62c5ada598f141adb3b26cf254c280b2857a63d2ad783a73115f6b806e1aafec4af80a0d786b3de45375b517a7e5b51ffb2c356537c9e6ef227d4a -Output = 19d44c8d63e8e8dd12c22a87b8cd4ece27acdde04dbf47f7f27537a6999a8e62 - -Curve = P-256 -PeerQ = 0433e82092a0f1fb38f5649d5867fba28b503172b7035574bf8e5b7100a3052792f2cf6b601e0a05945e335550bf648d782f46186c772c0f20d3cd0d6b8ca14b2f -D = f5f8e0174610a661277979b58ce5c90fee6c9b3bb346a90a7196255e40b132ef -MyQ = 047b861dcd2844a5a8363f6b8ef8d493640f55879217189d80326aad9480dfc149c4675b45eeb306405f6c33c38bc69eb2bdec9b75ad5af4706aab84543b9cc63a -Output = 664e45d5bba4ac931cd65d52017e4be9b19a515f669bea4703542a2c525cd3d3 - -Curve = P-256 -PeerQ = 046a9e0c3f916e4e315c91147be571686d90464e8bf981d34a90b6353bca6eeba740f9bead39c2f2bcc2602f75b8a73ec7bdffcbcead159d0174c6c4d3c5357f05 -D = 3b589af7db03459c23068b64f63f28d3c3c6bc25b5bf76ac05f35482888b5190 -MyQ = 049fb38e2d58ea1baf7622e96720101cae3cde4ba6c1e9fa26d9b1de0899102863d5561b900406edf50802dd7d73e89395f8aed72fba0e1d1b61fe1d22302260f0 -Output = ca342daa50dc09d61be7c196c85e60a80c5cb04931746820be548cdde055679d - -Curve = P-256 -PeerQ = 04a9c0acade55c2a73ead1a86fb0a9713223c82475791cd0e210b046412ce224bbf6de0afa20e93e078467c053d241903edad734c6b403ba758c2b5ff04c9d4229 -D = d8bf929a20ea7436b2461b541a11c80e61d826c0a4c9d322b31dd54e7f58b9c8 -MyQ = 0420f07631e4a6512a89ad487c4e9d63039e579cb0d7a556cb9e661cd59c1e7fa46de91846b3eee8a5ec09c2ab1f41e21bd83620ccdd1bdce3ab7ea6e02dd274f5 -Output = 35aa9b52536a461bfde4e85fc756be928c7de97923f0416c7a3ac8f88b3d4489 - -Curve = P-256 -PeerQ = 0494e94f16a98255fff2b9ac0c9598aac35487b3232d3231bd93b7db7df36f9eb9d8049a43579cfa90b8093a94416cbefbf93386f15b3f6e190b6e3455fedfe69a -D = 0f9883ba0ef32ee75ded0d8bda39a5146a29f1f2507b3bd458dbea0b2bb05b4d -MyQ = 04abb61b423be5d6c26e21c605832c9142dc1dfe5a5fff28726737936e6fbf516d733d2513ef58beab202090586fac91bf0fee31e80ab33473ab23a2d89e58fad6 -Output = 605c16178a9bc875dcbff54d63fe00df699c03e8a888e9e94dfbab90b25f39b4 - -Curve = P-256 -PeerQ = 04e099bf2a4d557460b5544430bbf6da11004d127cb5d67f64ab07c94fcdf5274fd9c50dbe70d714edb5e221f4e020610eeb6270517e688ca64fb0e98c7ef8c1c5 -D = 2beedb04b05c6988f6a67500bb813faf2cae0d580c9253b6339e4a3337bb6c08 -MyQ = 043d63e429cb5fa895a9247129bf4e48e89f35d7b11de8158efeb3e106a2a873950cae9e477ef41e7c8c1064379bb7b554ddcbcae79f9814281f1e50f0403c61f3 -Output = f96e40a1b72840854bb62bc13c40cc2795e373d4e715980b261476835a092e0b - -Curve = P-256 -PeerQ = 04f75a5fe56bda34f3c1396296626ef012dc07e4825838778a645c8248cff0165833bbdf1b1772d8059df568b061f3f1122f28a8d819167c97be448e3dc3fb0c3c -D = 77c15dcf44610e41696bab758943eff1409333e4d5a11bbe72c8f6c395e9f848 -MyQ = 04ad5d13c3db508ddcd38457e5991434a251bed49cf5ddcb59cdee73865f138c9f62cec1e70588aa4fdfc7b9a09daa678081c04e1208b9d662b8a2214bf8e81a21 -Output = 8388fa79c4babdca02a8e8a34f9e43554976e420a4ad273c81b26e4228e9d3a3 - -Curve = P-256 -PeerQ = 042db4540d50230756158abf61d9835712b6486c74312183ccefcaef2797b7674d62f57f314e3f3495dc4e099012f5e0ba71770f9660a1eada54104cdfde77243e -D = 42a83b985011d12303db1a800f2610f74aa71cdf19c67d54ce6c9ed951e9093e -MyQ = 04ab48caa61ea35f13f8ed07ffa6a13e8db224dfecfae1a7df8b1bb6ebaf0cb97d1274530ca2c385a3218bddfbcbf0b4024c9badd5243bff834ebff24a8618dccb -Output = 72877cea33ccc4715038d4bcbdfe0e43f42a9e2c0c3b017fc2370f4b9acbda4a - -Curve = P-256 -PeerQ = 04cd94fc9497e8990750309e9a8534fd114b0a6e54da89c4796101897041d14ecbc3def4b5fe04faee0a11932229fff563637bfdee0e79c6deeaf449f85401c5c4 -D = ceed35507b5c93ead5989119b9ba342cfe38e6e638ba6eea343a55475de2800b -MyQ = 049a8cd9bd72e71752df91440f77c547509a84df98114e7de4f26cdb39234a625dd07cfc84c8e144fab2839f5189bb1d7c88631d579bbc58012ed9a2327da52f62 -Output = e4e7408d85ff0e0e9c838003f28cdbd5247cdce31f32f62494b70e5f1bc36307 - -Curve = P-256 -PeerQ = 0415b9e467af4d290c417402e040426fe4cf236bae72baa392ed89780dfccdb471cdf4e9170fb904302b8fd93a820ba8cc7ed4efd3a6f2d6b05b80b2ff2aee4e77 -D = 43e0e9d95af4dc36483cdd1968d2b7eeb8611fcce77f3a4e7d059ae43e509604 -MyQ = 04f989cf8ee956a82e7ebd9881cdbfb2fd946189b08db53559bc8cfdd48071eb145eff28f1a18a616b04b7d337868679f6dd84f9a7b3d7b6f8af276c19611a541d -Output = ed56bcf695b734142c24ecb1fc1bb64d08f175eb243a31f37b3d9bb4407f3b96 - -Curve = P-256 -PeerQ = 0449c503ba6c4fa605182e186b5e81113f075bc11dcfd51c932fb21e951eee2fa18af706ff0922d87b3f0c5e4e31d8b259aeb260a9269643ed520a13bb25da5924 -D = b2f3600df3368ef8a0bb85ab22f41fc0e5f4fdd54be8167a5c3cd4b08db04903 -MyQ = 0469c627625b36a429c398b45c38677cb35d8beb1cf78a571e40e99fe4eac1cd4e81690112b0a88f20f7136b28d7d47e5fbc2ada3c8edd87589bc19ec9590637bd -Output = bc5c7055089fc9d6c89f83c1ea1ada879d9934b2ea28fcf4e4a7e984b28ad2cf - -Curve = P-256 -PeerQ = 0419b38de39fdd2f70f7091631a4f75d1993740ba9429162c2a45312401636b29c09aed7232b28e060941741b6828bcdfa2bc49cc844f3773611504f82a390a5ae -D = 4002534307f8b62a9bf67ff641ddc60fef593b17c3341239e95bdb3e579bfdc8 -MyQ = 045fe964671315a18aa68a2a6e3dd1fde7e23b8ce7181471cfac43c99e1ae80262d5827be282e62c84de531b963884ba832db5d6b2c3a256f0e604fe7e6b8a7f72 -Output = 9a4e8e657f6b0e097f47954a63c75d74fcba71a30d83651e3e5a91aa7ccd8343 - -Curve = P-256 -PeerQ = 042c91c61f33adfe9311c942fdbff6ba47020feff416b7bb63cec13faf9b0999546cab31b06419e5221fca014fb84ec870622a1b12bab5ae43682aa7ea73ea08d0 -D = 4dfa12defc60319021b681b3ff84a10a511958c850939ed45635934ba4979147 -MyQ = 04c9b2b8496f1440bd4a2d1e52752fd372835b364885e154a7dac49295f281ec7cfbe6b926a8a4de26ccc83b802b1212400754be25d9f3eeaf008b09870ae76321 -Output = 3ca1fc7ad858fb1a6aba232542f3e2a749ffc7203a2374a3f3d3267f1fc97b78 - -Curve = P-256 -PeerQ = 04a28a2edf58025668f724aaf83a50956b7ac1cfbbff79b08c3bf87dfd2828d767dfa7bfffd4c766b86abeaf5c99b6e50cb9ccc9d9d00b7ffc7804b0491b67bc03 -D = 1331f6d874a4ed3bc4a2c6e9c74331d3039796314beee3b7152fcdba5556304e -MyQ = 0459e1e101521046ad9cf1d082e9d2ec7dd22530cce064991f1e55c5bcf5fcb591482f4f673176c8fdaa0bb6e59b15a3e47454e3a04297d3863c9338d98add1f37 -Output = 1aaabe7ee6e4a6fa732291202433a237df1b49bc53866bfbe00db96a0f58224f - -Curve = P-256 -PeerQ = 04a2ef857a081f9d6eb206a81c4cf78a802bdf598ae380c8886ecd85fdc1ed7644563c4c20419f07bc17d0539fade1855e34839515b892c0f5d26561f97fa04d1a -D = dd5e9f70ae740073ca0204df60763fb6036c45709bf4a7bb4e671412fad65da3 -MyQ = 0430b9db2e2e977bcdc98cb87dd736cbd8e78552121925cf16e1933657c2fb23146a45028800b81291bce5c2e1fed7ded650620ebbe6050c6f3a7f0dfb4673ab5c -Output = 430e6a4fba4449d700d2733e557f66a3bf3d50517c1271b1ddae1161b7ac798c - -Curve = P-256 -PeerQ = 04ccd8a2d86bc92f2e01bce4d6922cf7fe1626aed044685e95e2eebd464505f01fe9ddd583a9635a667777d5b8a8f31b0f79eba12c75023410b54b8567dddc0f38 -D = 5ae026cfc060d55600717e55b8a12e116d1d0df34af831979057607c2d9c2f76 -MyQ = 0446c9ebd1a4a3c8c0b6d572b5dcfba12467603208a9cb5d2acfbb733c40cf639146c913a27d044185d38b467ace011e04d4d9bbbb8cb9ae25fa92aaf15a595e86 -Output = 1ce9e6740529499f98d1f1d71329147a33df1d05e4765b539b11cf615d6974d3 - -Curve = P-256 -PeerQ = 04c188ffc8947f7301fb7b53e36746097c2134bf9cc981ba74b4e9c4361f595e4ebf7d2f2056e72421ef393f0c0f2b0e00130e3cac4abbcc00286168e85ec55051 -D = b601ac425d5dbf9e1735c5e2d5bdb79ca98b3d5be4a2cfd6f2273f150e064d9d -MyQ = 047c9e950841d26c8dde8994398b8f5d475a022bc63de7773fcf8d552e01f1ba0acc42b9885c9b3bee0f8d8c57d3a8f6355016c019c4062fa22cff2f209b5cc2e1 -Output = 4690e3743c07d643f1bc183636ab2a9cb936a60a802113c49bb1b3f2d0661660 - -Curve = P-256 -PeerQ = 04317e1020ff53fccef18bf47bb7f2dd7707fb7b7a7578e04f35b3beed222a0eb609420ce5a19d77c6fe1ee587e6a49fbaf8f280e8df033d75403302e5a27db2ae -D = fefb1dda1845312b5fce6b81b2be205af2f3a274f5a212f66c0d9fc33d7ae535 -MyQ = 0438b54db85500cb20c61056edd3d88b6a9dc26780a047f213a6e1b900f76596eb6387e4e5781571e4eb8ae62991a33b5dc33301c5bc7e125d53794a39160d8fd0 -Output = 30c2261bd0004e61feda2c16aa5e21ffa8d7e7f7dbf6ec379a43b48e4b36aeb0 - -Curve = P-256 -PeerQ = 0445fb02b2ceb9d7c79d9c2fa93e9c7967c2fa4df5789f9640b24264b1e524fcb15c6e8ecf1f7d3023893b7b1ca1e4d178972ee2a230757ddc564ffe37f5c5a321 -D = 334ae0c4693d23935a7e8e043ebbde21e168a7cba3fa507c9be41d7681e049ce -MyQ = 043f2bf1589abf3047bf3e54ac9a95379bff95f8f55405f64eca36a7eebe8ffca75212a94e66c5ae9a8991872f66a72723d80ec5b2e925745c456f5371943b3a06 -Output = 2adae4a138a239dcd93c243a3803c3e4cf96e37fe14e6a9b717be9599959b11c - -Curve = P-256 -PeerQ = 04a19ef7bff98ada781842fbfc51a47aff39b5935a1c7d9625c8d323d511c92de6e9c184df75c955e02e02e400ffe45f78f339e1afe6d056fb3245f4700ce606ef -D = 2c4bde40214fcc3bfc47d4cf434b629acbe9157f8fd0282540331de7942cf09d -MyQ = 0429c0807f10cbc42fb45c9989da50681eead716daa7b9e91fd32e062f5eb92ca0ff1d6d1955d7376b2da24fe1163a271659136341bc2eb1195fc706dc62e7f34d -Output = 2e277ec30f5ea07d6ce513149b9479b96e07f4b6913b1b5c11305c1444a1bc0b - -Curve = P-256 -PeerQ = 04356c5a444c049a52fee0adeb7e5d82ae5aa83030bfff31bbf8ce2096cf161c4b57d128de8b2a57a094d1a001e572173f96e8866ae352bf29cddaf92fc85b2f92 -D = 85a268f9d7772f990c36b42b0a331adc92b5941de0b862d5d89a347cbf8faab0 -MyQ = 049cf4b98581ca1779453cc816ff28b4100af56cf1bf2e5bc312d83b6b1b21d3337a5504fcac5231a0d12d658218284868229c844a04a3450d6c7381abe080bf3b -Output = 1e51373bd2c6044c129c436e742a55be2a668a85ae08441b6756445df5493857 - -Curve = P-384 -PeerQ = 04a7c76b970c3b5fe8b05d2838ae04ab47697b9eaf52e764592efda27fe7513272734466b400091adbf2d68c58e0c50066ac68f19f2e1cb879aed43a9969b91a0839c4c38a49749b661efedf243451915ed0905a32b060992b468c64766fc8437a -D = 3cc3122a68f0d95027ad38c067916ba0eb8c38894d22e1b15618b6818a661774ad463b205da88cf699ab4d43c9cf98a1 -MyQ = 049803807f2f6d2fd966cdd0290bd410c0190352fbec7ff6247de1302df86f25d34fe4a97bef60cff548355c015dbb3e5fba26ca69ec2f5b5d9dad20cc9da711383a9dbe34ea3fa5a2af75b46502629ad54dd8b7d73a8abb06a3a3be47d650cc99 -Output = 5f9d29dc5e31a163060356213669c8ce132e22f57c9a04f40ba7fcead493b457e5621e766c40a2e3d4d6a04b25e533f1 - -Curve = P-384 -PeerQ = 0430f43fcf2b6b00de53f624f1543090681839717d53c7c955d1d69efaf0349b7363acb447240101cbb3af6641ce4b88e025e46c0c54f0162a77efcc27b6ea792002ae2ba82714299c860857a68153ab62e525ec0530d81b5aa15897981e858757 -D = 92860c21bde06165f8e900c687f8ef0a05d14f290b3f07d8b3a8cc6404366e5d5119cd6d03fb12dc58e89f13df9cd783 -MyQ = 04ea4018f5a307c379180bf6a62fd2ceceebeeb7d4df063a66fb838aa35243419791f7e2c9d4803c9319aa0eb03c416b6668835a91484f05ef028284df6436fb88ffebabcdd69ab0133e6735a1bcfb37203d10d340a8328a7b68770ca75878a1a6 -Output = a23742a2c267d7425fda94b93f93bbcc24791ac51cd8fd501a238d40812f4cbfc59aac9520d758cf789c76300c69d2ff - -Curve = P-384 -PeerQ = 041aefbfa2c6c8c855a1a216774550b79a24cda37607bb1f7cc906650ee4b3816d68f6a9c75da6e4242cebfb6652f65180419d28b723ebadb7658fcebb9ad9b7adea674f1da3dc6b6397b55da0f61a3eddacb4acdb14441cb214b04a0844c02fa3 -D = 12cf6a223a72352543830f3f18530d5cb37f26880a0b294482c8a8ef8afad09aa78b7dc2f2789a78c66af5d1cc553853 -MyQ = 04fcfcea085e8cf74d0dced1620ba8423694f903a219bbf901b0b59d6ac81baad316a242ba32bde85cb248119b852fab66972e3c68c7ab402c5836f2a16ed451a33120a7750a6039f3ff15388ee622b7065f7122bf6d51aefbc29b37b03404581b -Output = 3d2e640f350805eed1ff43b40a72b2abed0a518bcebe8f2d15b111b6773223da3c3489121db173d414b5bd5ad7153435 - -Curve = P-384 -PeerQ = 048bc089326ec55b9cf59b34f0eb754d93596ca290fcb3444c83d4de3a5607037ec397683f8cef07eab2fe357eae36c449d9d16ce8ac85b3f1e94568521aae534e67139e310ec72693526aa2e927b5b322c95a1a033c229cb6770c957cd3148dd7 -D = 8dd48063a3a058c334b5cc7a4ce07d02e5ee6d8f1f3c51a1600962cbab462690ae3cd974fb39e40b0e843daa0fd32de1 -MyQ = 04e38c9846248123c3421861ea4d32669a7b5c3c08376ad28104399494c84ff5efa3894adb2c6cbe8c3c913ef2eec5bd3c9fa84024a1028796df84021f7b6c9d02f0f4bd1a612a03cbf75a0beea43fef8ae84b48c60172aadf09c1ad016d0bf3ce -Output = 6a42cfc392aba0bfd3d17b7ccf062b91fc09bbf3417612d02a90bdde62ae40c54bb2e56e167d6b70db670097eb8db854 - -Curve = P-384 -PeerQ = 04eb952e2d9ac0c20c6cc48fb225c2ad154f53c8750b003fd3b4ed8ed1dc0defac61bcdde02a2bcfee7067d75d342ed2b0f1828205baece82d1b267d0d7ff2f9c9e15b69a72df47058a97f3891005d1fb38858f5603de840e591dfa4f6e7d489e1 -D = 84ece6cc3429309bd5b23e959793ed2b111ec5cb43b6c18085fcaea9efa0685d98a6262ee0d330ee250bc8a67d0e733f -MyQ = 043222063a2997b302ee60ee1961108ff4c7acf1c0ef1d5fb0d164b84bce71c431705cb9aea9a45f5d73806655a058bee3e61fa9e7fbe7cd43abf99596a3d3a039e99fa9dc93b0bdd9cad81966d17eeaf557068afa7c78466bb5b22032d1100fa6 -Output = ce7ba454d4412729a32bb833a2d1fd2ae612d4667c3a900e069214818613447df8c611de66da200db7c375cf913e4405 - -Curve = P-384 -PeerQ = 04441d029e244eb7168d647d4df50db5f4e4974ab3fdaf022aff058b3695d0b8c814cc88da6285dc6df1ac55c553885003e8025ac23a41d4b1ea2aa46c50c6e479946b59b6d76497cd9249977e0bfe4a6262622f13d42a3c43d66bdbb30403c345 -D = 68fce2121dc3a1e37b10f1dde309f9e2e18fac47cd1770951451c3484cdb77cb136d00e731260597cc2859601c01a25b -MyQ = 04868be0e694841830e424d913d8e7d86b84ee1021d82b0ecf523f09fe89a76c0c95c49f2dfbcf829c1e39709d55efbb3b9195eb183675b40fd92f51f37713317e4a9b4f715c8ab22e0773b1bc71d3a219f05b8116074658ee86b52e36f3897116 -Output = ba69f0acdf3e1ca95caaac4ecaf475bbe51b54777efce01ca381f45370e486fe87f9f419b150c61e329a286d1aa265ec - -Curve = P-384 -PeerQ = 043d4e6bf08a73404accc1629873468e4269e82d90d832e58ad72142639b5a056ad8d35c66c60e8149fac0c797bceb7c2f9b0308dc7f0e6d29f8c277acbc65a21e5adb83d11e6873bc0a07fda0997f482504602f59e10bc5cb476b83d0a4f75e71 -D = b1764c54897e7aae6de9e7751f2f37de849291f88f0f91093155b858d1cc32a3a87980f706b86cc83f927bdfdbeae0bd -MyQ = 04c371222feaa6770c6f3ea3e0dac9740def4fcf821378b7f91ff937c21e0470f70f3a31d5c6b2912195f10926942b48ae047d6b4d765123563f81116bc665b7b8cc6207830d805fd84da7cb805a65baa7c12fd592d1b5b5e3e65d9672a9ef7662 -Output = 1a6688ee1d6e59865d8e3ada37781d36bb0c2717eef92e61964d3927cb765c2965ea80f7f63e58c322ba0397faeaf62b - -Curve = P-384 -PeerQ = 04f5f6bef1d110da03be0017eac760cc34b24d092f736f237bc7054b3865312a813bcb62d297fb10a4f7abf54708fe2d3d06fdf8d7dc032f4e10010bf19cbf6159321252ff415fb91920d438f24e67e60c2eb0463204679fa356af44cea9c9ebf5 -D = f0f7a96e70d98fd5a30ad6406cf56eb5b72a510e9f192f50e1f84524dbf3d2439f7287bb36f5aa912a79deaab4adea82 -MyQ = 0499c8c41cb1ab5e0854a346e4b08a537c1706a61553387c8d94943ab15196d40dbaa55b8210a77a5d00915f2c4ea69eab5531065bdcf17bfb3cb55a02e41a57c7f694c383ad289f900fbd656c2233a93c92e933e7a26f54cbb56f0ad875c51bb0 -Output = d06a568bf2336b90cbac325161be7695eacb2295f599500d787f072612aca313ee5d874f807ddef6c1f023fe2b6e7cd0 - -Curve = P-384 -PeerQ = 047cdec77e0737ea37c67b89b7137fe38818010f4464438ee4d1d35a0c488cad3fde2f37d00885d36d3b795b9f93d23a6728c42ee8d6027c56cf979ba4c229fdb01d234944f8ac433650112c3cf0f02844e888a3569dfef7828a8a884589aa055e -D = 9efb87ddc61d43c482ba66e1b143aef678fbd0d1bebc2000941fabe677fe5b706bf78fce36d100b17cc787ead74bbca2 -MyQ = 044c34efee8f0c95565d2065d1bbac2a2dd25ae964320eb6bccedc5f3a9b42a881a1afca1bb6b880584fa27b01c193cd92d8fb01dbf7cd0a3868c26b951f393c3c56c2858cee901f7793ff5d271925d13a41f8e52409f4eba1990f33acb0bac669 -Output = bb3b1eda9c6560d82ff5bee403339f1e80342338a991344853b56b24f109a4d94b92f654f0425edd4c205903d7586104 - -Curve = P-384 -PeerQ = 048eeea3a319c8df99fbc29cb55f243a720d95509515ee5cc587a5c5ae22fbbd009e626db3e911def0b99a4f7ae304b1ba73877dc94db9adddc0d9a4b24e8976c22d73c844370e1ee857f8d1b129a3bd5f63f40caf3bd0533e38a5f5777074ff9e -D = d787a57fde22ec656a0a525cf3c738b30d73af61e743ea90893ecb2d7b622add2f94ee25c2171467afb093f3f84d0018 -MyQ = 04171546923b87b2cbbad664f01ce932bf09d6a6118168678446bfa9f0938608cb4667a98f4ec8ac1462285c2508f74862fa41cb4db68ae71f1f8a3e8939dc52c2dec61a83c983beb2a02baf29ec49278088882ed0cf56c74b5c173b552ccf63cf -Output = 1e97b60add7cb35c7403dd884c0a75795b7683fff8b49f9d8672a8206bfdcf0a106b8768f983258c74167422e44e4d14 - -Curve = P-384 -PeerQ = 04a721f6a2d4527411834b13d4d3a33c29beb83ab7682465c6cbaf6624aca6ea58c30eb0f29dd842886695400d7254f20f14ba6e26355109ad35129366d5e3a640ae798505a7fa55a96a36b5dad33de00474f6670f522214dd7952140ab0a7eb68 -D = 83d70f7b164d9f4c227c767046b20eb34dfc778f5387e32e834b1e6daec20edb8ca5bb4192093f543b68e6aeb7ce788b -MyQ = 0457cd770f3bbcbe0c78c770eab0b169bc45e139f86378ffae1c2b16966727c2f2eb724572b8f3eb228d130db4ff862c637ec5c8813b685558d83e924f14bc719f6eb7ae0cbb2c474227c5bda88637a4f26c64817929af999592da6f787490332f -Output = 1023478840e54775bfc69293a3cf97f5bc914726455c66538eb5623e218feef7df4befa23e09d77145ad577db32b41f9 - -Curve = P-384 -PeerQ = 04d882a8505c2d5cb9b8851fc676677bb0087681ad53faceba1738286b45827561e7da37b880276c656cfc38b32ade847e34b314bdc134575654573cffaf40445da2e6aaf987f7e913cd4c3091523058984a25d8f21da8326192456c6a0fa5f60c -D = 8f558e05818b88ed383d5fca962e53413db1a0e4637eda194f761944cbea114ab9d5da175a7d57882550b0e432f395a9 -MyQ = 049a2f57f4867ce753d72b0d95195df6f96c1fae934f602efd7b6a54582f556cfa539d89005ca2edac08ad9b72dd1f60bad9b94ee82da9cc601f346044998ba387aee56404dc6ecc8ab2b590443319d0b2b6176f9d0eac2d44678ed561607d09a9 -Output = 6ad6b9dc8a6cf0d3691c501cbb967867f6e4bbb764b60dbff8fcff3ed42dbba39d63cf325b4b4078858495ddee75f954 - -Curve = P-384 -PeerQ = 04815c9d773dbf5fb6a1b86799966247f4006a23c92e68c55e9eaa998b17d8832dd4d84d927d831d4f68dac67c6488219fe79269948b2611484560fd490feec887cb55ef99a4b524880fa7499d6a07283aae2afa33feab97deca40bc606c4d8764 -D = 0f5dee0affa7bbf239d5dff32987ebb7cf84fcceed643e1d3c62d0b3352aec23b6e5ac7fa4105c8cb26126ad2d1892cb -MyQ = 0423346bdfbc9d7c7c736e02bdf607671ff6082fdd27334a8bc75f3b23681ebe614d0597dd614fae58677c835a9f0b273b82ba36290d2f94db41479eb45ab4eaf67928a2315138d59eecc9b5285dfddd6714f77557216ea44cc6fc119d8243efaf -Output = cc9e063566d46b357b3fcae21827377331e5e290a36e60cd7c39102b828ae0b918dc5a02216b07fe6f1958d834e42437 - -Curve = P-384 -PeerQ = 041c0eeda7a2be000c5bdcda0478aed4db733d2a9e341224379123ad847030f29e3b168fa18e89a3c0fba2a6ce1c28fc3bec8c1c83c118c4dbea94271869f2d868eb65e8b44e21e6f14b0f4d9b38c068daefa27114255b9a41d084cc4a1ad85456 -D = 037b633b5b8ba857c0fc85656868232e2febf59578718391b81da8541a00bfe53c30ae04151847f27499f8d7abad8cf4 -MyQ = 048878ac8a947f7d5cb2b47aad24fbb8210d86126585399a2871f84aa9c5fde3074ae540c6bf82275ca822d0feb862bc74632f5cd2f900c2711c32f8930728eb647d31edd8d650f9654e7d33e5ed1b475489d08daa30d8cbcba6bfc3b60d9b5a37 -Output = deff7f03bd09865baf945e73edff6d5122c03fb561db87dec8662e09bed4340b28a9efe118337bb7d3d4f7f568635ff9 - -Curve = P-384 -PeerQ = 04c95c185e256bf997f30b311548ae7f768a38dee43eeeef43083f3077be70e2bf39ac1d4daf360c514c8c6be623443d1a3e63a663eaf75d8a765ab2b9a35513d7933fa5e26420a5244550ec6c3b6f033b96db2aca3d6ac6aab052ce929595aea5 -D = e3d07106bedcc096e7d91630ffd3094df2c7859db8d7edbb2e37b4ac47f429a637d06a67d2fba33838764ef203464991 -MyQ = 04e74a1a2b85f1cbf8dbbdf050cf1aff8acb02fda2fb6591f9d3cfe4e79d0ae938a9c1483e7b75f8db24505d65065cdb181773ee591822f7abaa856a1a60bc0a5203548dbd1cb5025466eff8481bd07614eaa04a16c3db76905913e972a5b6b59d -Output = c8b1038f735ad3bb3e4637c3e47eab487637911a6b7950a4e461948329d3923b969e5db663675623611a457fcda35a71 - -Curve = P-384 -PeerQ = 043497238a7e6ad166df2dac039aa4dac8d17aa925e7c7631eb3b56e3aaa1c545fcd54d2e5985807910fb202b1fc191d2aa49e5c487dcc7aa40a8f234c979446040d9174e3ad357d404d7765183195aed3f913641b90c81a306ebf0d8913861316 -D = f3f9b0c65a49a506632c8a45b10f66b5316f9eeb06fae218f2da62333f99905117b141c760e8974efc4af10570635791 -MyQ = 04a4ad77aa7d86e5361118a6b921710c820721210712f4c347985fdee58aa4effa1e28be80a17b120b139f96300f89b49b1ddf22e07e03f1560d8f45a480094560dba9fae7f9531130c1b57ebb95982496524f31d3797793396fa823f22bdb4328 -Output = d337eaa32b9f716b8747b005b97a553c59dab0c51df41a2d49039cdae705aa75c7b9e7bc0b6a0e8c578c902bc4fff23e - -Curve = P-384 -PeerQ = 0490a34737d45b1aa65f74e0bd0659bc118f8e4b774b761944ffa6573c6df4f41dec0d11b697abd934d390871d4b4532409b590719bb3307c149a7817be355d684893a307764b512eeffe07cb699edb5a6ffbf8d6032e6c79d5e93e94212c2aa4e -D = 59fce7fad7de28bac0230690c95710c720e528f9a4e54d3a6a8cd5fc5c5f21637031ce1c5b4e3d39647d8dcb9b794664 -MyQ = 049c43bf971edf09402876ee742095381f78b1bd3aa39b5132af75dbfe7e98bd78bde10fe2e903c2b6379e1deee175a1b0a6c58ecea5a477bb01bd543b339f1cc49f1371a2cda4d46eb4e53e250597942351a99665a122ffea9bde0636c375daf2 -Output = 32d292b695a4488e42a7b7922e1ae537d76a3d21a0b2e36875f60e9f6d3e8779c2afb3a413b9dd79ae18e70b47d337c1 - -Curve = P-384 -PeerQ = 04dda546acfc8f903d11e2e3920669636d44b2068aeb66ff07aa266f0030e1535b0ed0203cb8a460ac990f1394faf22f1d15bbb2597913035faadf413476f4c70f7279769a40c986f470c427b4ee4962abdf8173bbad81874772925fd32f0b159f -D = 3e49fbf950a424c5d80228dc4bc35e9f6c6c0c1d04440998da0a609a877575dbe437d6a5cedaa2ddd2a1a17fd112aded -MyQ = 045a949594228b1a3d6f599eb3db0d06070fbc551c657b58234ba164ce3fe415fa5f3eb823c08dc29b8c341219c77b6b3d2baad447c8c290cfed25edd9031c41d0b76921457327f42db31122b81f337bbf0b1039ec830ce9061a3761953c75e4a8 -Output = 1220e7e6cad7b25df98e5bbdcc6c0b65ca6c2a50c5ff6c41dca71e475646fd489615979ca92fb4389aeadefde79a24f1 - -Curve = P-384 -PeerQ = 04788be2336c52f4454d63ee944b1e49bfb619a08371048e6da92e584eae70bde1f171c4df378bd1f3c0ab03048a2378024673ebd8db604eaf41711748bab2968a23ca4476ce144e728247f08af752929157b5830f1e26067466bdfa8b65145a33 -D = 50ccc1f7076e92f4638e85f2db98e0b483e6e2204c92bdd440a6deea04e37a07c6e72791c190ad4e4e86e01efba84269 -MyQ = 04756c07df0ce32c839dac9fb4733c9c28b70113a676a7057c38d223f22a3a9095a8d564653af528e04c7e1824be4a651217c2ce6962cbd2a2e066297b39d57dd9bb4680f0191d390f70b4e461419b2972ce68ad46127fdda6c39195774ea86df3 -Output = 793bb9cd22a93cf468faf804a38d12b78cb12189ec679ddd2e9aa21fa9a5a0b049ab16a23574fe04c1c3c02343b91beb - -Curve = P-384 -PeerQ = 04d09bb822eb99e38060954747c82bb3278cf96bbf36fece3400f4c873838a40c135eb3babb9293bd1001bf3ecdee7bf26d416db6e1b87bbb7427788a3b6c7a7ab2c165b1e366f9608df512037584f213a648d47f16ac326e19aae972f63fd76c9 -D = 06f132b71f74d87bf99857e1e4350a594e5fe35533b888552ceccbc0d8923c902e36141d7691e28631b8bc9bafe5e064 -MyQ = 042a3cc6b8ff5cde926e7e3a189a1bd029c9b586351af8838f4f201cb8f4b70ef3b0da06d352c80fc26baf8f42b784459ebf9985960176da6d23c7452a2954ffcbbcb24249b43019a2a023e0b3dabd461f19ad3e775c364f3f11ad49f3099400d3 -Output = 012d191cf7404a523678c6fc075de8285b243720a903047708bb33e501e0dbee5bcc40d7c3ef6c6da39ea24d830da1e8 - -Curve = P-384 -PeerQ = 0413741262ede5861dad71063dfd204b91ea1d3b7c631df68eb949969527d79a1dc59295ef7d2bca6743e8cd77b04d1b580baaeadc7e19d74a8a04451a135f1be1b02fe299f9dc00bfdf201e83d995c6950bcc1cb89d6f7b30bf54656b9a4da586 -D = 12048ebb4331ec19a1e23f1a2c773b664ccfe90a28bfb846fc12f81dff44b7443c77647164bf1e9e67fd2c07a6766241 -MyQ = 04bc18836bc7a9fdf54b5352f37d7528ab8fa8ec544a8c6180511cbfdd49cce377c39e34c031b5240dc9980503ed2f262c8086cbe338191080f0b7a16c7afc4c7b0326f9ac66f58552ef4bb9d24de3429ed5d3277ed58fcf48f2b5f61326bec6c6 -Output = ad0fd3ddffe8884b9263f3c15fe1f07f2a5a22ffdc7e967085eea45f0cd959f20f18f522763e28bcc925e496a52dda98 - -Curve = P-384 -PeerQ = 049e22cbc18657f516a864b37b783348b66f1aa9626cd631f4fa1bd32ad88cf11db52057c660860d39d11fbf024fabd4446b0d53c79681c28116df71e9cee74fd56c8b7f04b39f1198cc72284e98be9562e35926fb4f48a9fbecafe729309e8b6f -D = 34d61a699ca576169fcdc0cc7e44e4e1221db0fe63d16850c8104029f7d48449714b9884328cae189978754ab460b486 -MyQ = 04867f81104ccd6b163a7902b670ef406042cb0cce7dcdc63d1dfc91b2c40e3cdf7595834bf9eceb79849f1636fc8462fc9d4bde8e875ec49697d258d1d59465f8431c6f5531e1c59e9f9ebe3cf164a8d9ce10a12f1979283a959bad244dd83863 -Output = dc4ca392dc15e20185f2c6a8ea5ec31dfc96f56153a47394b3072b13d0015f5d4ae13beb3bed54d65848f9b8383e6c95 - -Curve = P-384 -PeerQ = 042db5da5f940eaa884f4db5ec2139b0469f38e4e6fbbcc52df15c0f7cf7fcb1808c749764b6be85d2fdc5b16f58ad5dc022e8b02dcf33e1b5a083849545f84ad5e43f77cb71546dbbac0d11bdb2ee202e9d3872e8d028c08990746c5e1dde9989 -D = dc60fa8736d702135ff16aab992bb88eac397f5972456c72ec447374d0d8ce61153831bfc86ad5a6eb5b60bfb96a862c -MyQ = 04b69beede85d0f829fec1b893ccb9c3e052ff692e13b974537bc5b0f9feaf7b22e84f03231629b24866bdb4b8cf90891466f85e2bfcaba2843285b0e14ebc07ef7dafff8b424416fee647b59897b619f20eed95a632e6a4206bf7da429c04c560 -Output = d765b208112d2b9ed5ad10c4046e2e3b0dbf57c469329519e239ac28b25c7d852bf757d5de0ee271cadd021d86cfd347 - -Curve = P-384 -PeerQ = 04329647baa354224eb4414829c5368c82d7893b39804e08cbb2180f459befc4b347a389a70c91a23bd9d30c83be5295d3cc8f61923fad2aa8e505d6cfa126b9fabd5af9dce290b75660ef06d1caa73681d06089c33bc4246b3aa30dbcd2435b12 -D = 6fa6a1c704730987aa634b0516a826aba8c6d6411d3a4c89772d7a62610256a2e2f289f5c3440b0ec1e70fa339e251ce -MyQ = 0453de1fc1328e8de14aecab29ad8a40d6b13768f86f7d298433d20fec791f86f8bc73f358098b256a298bb488de257bf4ac28944fd27f17b82946c04c66c41f0053d3692f275da55cd8739a95bd8cd3af2f96e4de959ea8344d8945375905858b -Output = d3778850aeb58804fbe9dfe6f38b9fa8e20c2ca4e0dec335aafceca0333e3f2490b53c0c1a14a831ba37c4b9d74be0f2 - -Curve = P-384 -PeerQ = 0429d8a36d22200a75b7aea1bb47cdfcb1b7fd66de967041434728ab5d533a060df732130600fe6f75852a871fb2938e39e19b53db528395de897a45108967715eb8cb55c3fcbf23379372c0873a058d57544b102ecce722b2ccabb1a603774fd5 -D = 74ad8386c1cb2ca0fcdeb31e0869bb3f48c036afe2ef110ca302bc8b910f621c9fcc54cec32bb89ec7caa84c7b8e54a8 -MyQ = 0427a3e83cfb9d5122e73129d801615857da7cc089cccc9c54ab3032a19e0a0a9f677346e37f08a0b3ed8da6e5dd6910638d60e44aa5e0fd30c918456796af37f0e41957901645e5c596c6d989f5859b03a0bd7d1f4e77936fff3c74d204e5388e -Output = 81e1e71575bb4505498de097350186430a6242fa6c57b85a5f984a23371123d2d1424eefbf804258392bc723e4ef1e35 - - -# Test vectors from NIST where the peer's public key validation fails. -# -# These vectors were taken from the file -# KASValidityTest_ECCEphemeralUnified_KDFConcat_NOKC_init.fax in -# http://csrc.nist.gov/groups/STM/cavp/documents/keymgmt/KASTestVectorsECC2014.zip -# accessible via -# http://csrc.nist.gov/groups/STM/cavp/key-establishment.html#test-vectors. -# -# Only the test vectors where the test fails because the peer's public key is -# invalid are included here. Supporting the other vectors would require -# implementing an entire key exchange protocol; since the omitted test vectors -# don't seem to stress any *edge cases* of the *ECDH* step of the key exchange -# protocol, they don't seem valuable. -# -# PeerQ = (QeCAVSx, QeCAVSy) in uncompressed encoding. -# Error is the error text from the Result field. The errors reference -# "PKV 5.6.2.5" which is section 5.6.2.5 of -# http://csrc.nist.gov/publications/nistpubs/800-56A/SP800-56A_Revision1_Mar08-2007.pdf -# which is section 5.6.2.3.2/5.6.2.3.3 of -# http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-56Ar2.pdf - -# [EC - SHA-256, COUNT = 4] -Curve = P-256 -PeerQ = 04eec6ea7be0362fa496af12e551982a7d9c06b5ef735fadc37990c78ab9be87f4f45058db687e98326036c88eb846476a05385d7bda1d6dd6ca600499b7cc613f -Error = 4 - CAVS's Ephemeral public key Y fails PKV 5.6.2.5 - -# [EC - SHA-256, COUNT = 12] -Curve = P-256 -PeerQ = 0439883b3aadd78b044dadbd9be6a2cc8360da8df4241a4d11665a14e1ce17d19296d5cc675c252d902da5118245e738d57442ca042add79f1d07752bb98a7b805 -Error = 3 - CAVS's Ephemeral public key X fails PKV 5.6.2.5 - -# [EC - SHA-256, COUNT = 12] -Curve = P-256 -PeerQ = 0462ff2c3f5e165afa8dc919b7d705c862855d87869b8440c8d98db2ccb6144e3634a0335ebf64d77dc1c90fd5a5957c0d062593e8891d339f4b3616eb05018103 -Error = 3 - CAVS's Ephemeral public key X fails PKV 5.6.2.5 - -# [EC - SHA-256, COUNT = 20] -Curve = P-256 -PeerQ = 04eaa4b595bd200d3197a35fad5afbee310ac2da532237d5623e1285bdcaa2422177735e831623cd5d67b45e9ca947a48055bdc5f3cca81f75ab124c92ea62091c -Error = 4 - CAVS's Ephemeral public key Y fails PKV 5.6.2.5 - -# [EC - SHA384, COUNT = 3] -Curve = P-256 -PeerQ = 0482022f7a7507a5fdf191b7474d8503f1c2f31ef654096f28d046ff0b1f07d59406b2c2ff0fdcc2d913d6f3fbe02fded8543cd6aff9304213acc9cfd8f4d52803 -Error = 3 - CAVS's Ephemeral public key X fails PKV 5.6.2.5 - -# [EC - SHA384, COUNT = 9] -Curve = P-256 -PeerQ = 045ce1fd24f150bb8714c7c12ed1d85fb8bd597f6e4a8c27eaabd3348903abf91261941a5cd8978c1cfaf6b0f67441dcc5a3686adc7dd1e157f138c9ce48634019 -Error = 4 - CAVS's Ephemeral public key Y fails PKV 5.6.2.5 - -# [EC - SHA384, COUNT = 24] -Curve = P-256 -PeerQ = 04d441c98190cf34cff0ba0dbafbade26c4cadcd5438bb5324e136851b09c009ac14c355a01189339a5a9a4f8a8ed57d7f6537ed161882c1e6912f8e3512faad0f -Error = 3 - CAVS's Ephemeral public key X fails PKV 5.6.2.5 - -# [EC - SHA384, COUNT = 25] -Curve = P-256 -PeerQ = 048dfc7063c55a1fe8684ff6675ad4b53dab503e409c12058ab602c40c143ef84cbe0fce323492ee123e2a543b26b327139f234a08355dd60e2fc2c0babf1a10e3 -Error = 4 - CAVS's Ephemeral public key Y fails PKV 5.6.2.5 - -# [EC - SHA512, COUNT = 0] -Curve = P-256 -PeerQ = 04eb65aaefab96a190a67e566978a179826cf4e04634013f7fe1547a749f3cf6e91d89dfdf23dc14fca68c7c138e90a0d9ee7bcdded8d80e6e409c7f0041d50b80 -Error = 4 - CAVS's Ephemeral public key Y fails PKV 5.6.2.5 - -# [EC - SHA512, COUNT = 5] -Curve = P-256 -PeerQ = 040d0d6e855cd97a1b5a5e52593b8ceac553be06a19090c5442e521731c08e7fc5efa166e25741659bfa5b257a23f36e7d9f08e084610be8dfd8c6844d0ea860b9 -Error = 3 - CAVS's Ephemeral public key X fails PKV 5.6.2.5 - -# [EC - SHA512, COUNT = 26] -Curve = P-256 -PeerQ = 047417e66bbf708b258079648e1a9500d969f2d3860bd606054b611bc853228a324aade59d9ffb73cec6083887f5887c0306deb68e6aa984bbdad141635d078e79 -Error = 3 - CAVS's Ephemeral public key X fails PKV 5.6.2.5 - -# [EC - SHA512, COUNT = 29] -Curve = P-256 -PeerQ = 04d9313d9b7c9abebba2d4cb3c05e3393bd5da667efa74c9d4cc33d2e54446d8d9904240a61c8d7f5ff2028041a81e1408451f4c0e0a18fcf33557546dfc380a06 -Error = 4 - CAVS's Ephemeral public key Y fails PKV 5.6.2.5 - - -# [ED - SHA384, COUNT = 1] -Curve = P-384 -PeerQ = 04eed1bfbefb4c3b568ba187893d0d66f0a266928e57f5903213690cfe55660ce86d7eccf9ad1503932c31ab23917bc759a6e69055c5b84ccd92a414b84283bf89ebb85a850f03e02016a12ff22a4af6f80dd3900f68153b81e02c3f0c3d045d69 -Error = 3 - CAVS's Ephemeral public key X fails PKV 5.6.2.5 - -# [ED - SHA384, COUNT = 2] -Curve = P-384 -PeerQ = 04f081e7e14fcfbf38e3780f57822e8255452e96c673e4b49ebda246b0a5dbca279935e5b31f94eff8ac753aecc810f5ac4dd779b89b0fb7460fe0c50d90006fc5ad7a7a31fe6b827ec059c3b22b40611dbad54c75e653bbdb408fe2e5e24246ae -Error = 4 - CAVS's Ephemeral public key Y fails PKV 5.6.2.5 - -# [ED - SHA384, COUNT = 19] -Curve = P-384 -PeerQ = 0412159e7a89210ff0a5f723904a10c2425a13cfe9016b65cdb48285ec27912b66e415079ced48c94e707963bf5af66cd6ca8c934a135d8d3607f5792b63f127056e715eb4deabd501e6d3e3cfb6eb554c684c10c4a2b31df16fb8d9082131fa09 -Error = 4 - CAVS's Ephemeral public key Y fails PKV 5.6.2.5 - -# [ED - SHA384, COUNT = 28] -Curve = P-384 -PeerQ = 04a308a4cadf229c47fd74de1d1b6e07722ed87fa7506a0ddb8eb2060ca0f93ced5973a76d9e622b7519142ec41969a825fbb34034f8a6ead96a600281a01306b1a8d9a3148e4fb2e9727a4cec6a62b16690f3480a96a5f42dee895a2d456eb0f2 -Error = 3 - CAVS's Ephemeral public key X fails PKV 5.6.2.5 - -# [ED - SHA512, COUNT = 11] -Curve = P-384 -PeerQ = 04ca8e02c55ea6756f5f65d213649c400296a6961d37947025f9d448042ed9c1f3da4e88842f64c1e8a5c2215d57e16cb0697b0923dc80e38fca5381b9a9d59c6f29337adcc7ff183cbb42f267956d130b0b53cb51ba459731001a39093b97db8c -Error = 3 - CAVS's Ephemeral public key X fails PKV 5.6.2.5 - -# [ED - SHA512, COUNT = 13] -Curve = P-384 -PeerQ = 045cb621e4a2186b552961cb7fa8e8191d21335c8fbf2eff27cc44f27a3ae5aa4d000c146279979cbe2cd901ee1619494abd0f8333b8ad65f621271c30386cb455bd66fde88705c57490638c3a6b73c27c4982eba177b0fb867d253d4fccac2361 -Error = 4 - CAVS's Ephemeral public key Y fails PKV 5.6.2.5 - -# [ED - SHA512, COUNT = 20] -Curve = P-384 -PeerQ = 04fd2a7437151a1df4949386fccec7509d731c36dc7ceae03c1ecd9b2b2a413853f5fe2066b4a52082a0a538b0536f6df670132a719f37a02a8fa12ed714876b17fe4d923abe50e7dd371172293336921229fcd44376dd52a2969f459c4a95f11f -Error = 4 - CAVS's Ephemeral public key Y fails PKV 5.6.2.5 - -# [ED - SHA512, COUNT = 28] -Curve = P-384 -PeerQ = 0432d3118ba89149e3f75623098a258d5df0706730a256ee257e04b0a39cf8dfb631c4e31f476d40e538798048dc641138081f05d14000f9dcf2c98245951b6ab55ab9b4687eb36e3aae5391c3c3a0aefff41aebebc6bf027d268aa3153a017bd6 -Error = 3 - CAVS's Ephemeral public key X fails PKV 5.6.2.5 diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/tests/constant_time_tests.rs temporalio-1.3.0/vendor/ring-0.16.20/tests/constant_time_tests.rs --- temporalio-1.3.0/vendor/ring-0.16.20/tests/constant_time_tests.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/tests/constant_time_tests.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,82 +0,0 @@ -// Copyright 2020 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -#![cfg(any(not(target_arch = "wasm32"), feature = "wasm32_c"))] -use ring::{constant_time, error, rand}; - -#[cfg(target_arch = "wasm32")] -use wasm_bindgen_test::{wasm_bindgen_test, wasm_bindgen_test_configure}; - -#[cfg(target_arch = "wasm32")] -wasm_bindgen_test_configure!(run_in_browser); - -// This logic is loosly based on BoringSSL's `TEST(ConstantTimeTest, MemCmp)`. -#[test] -#[cfg_attr(all(target_arch = "wasm32", feature = "wasm32_c"), wasm_bindgen_test)] -fn test_verify_slices_are_equal() { - let initial: [u8; 256] = rand::generate(&rand::SystemRandom::new()).unwrap().expose(); - - { - let copy = initial; - for len in 0..copy.len() { - // Not equal because the lengths do not match. - assert_eq!( - constant_time::verify_slices_are_equal(&initial, ©[..len]), - Err(error::Unspecified) - ); - // Equal lengths and equal contents. - assert_eq!( - constant_time::verify_slices_are_equal(&initial[..len], ©[..len]), - Ok(()) - ); - } - // Equal lengths and equal contents. - assert_eq!( - constant_time::verify_slices_are_equal(&initial, ©), - Ok(()) - ); - } - - for i in 0..initial.len() { - for bit in 0..8 { - let mut copy = initial; - copy[i] ^= 1u8 << bit; - - for len in 0..=initial.len() { - // We flipped at least one bit in `copy`. - assert_ne!(&initial[..], ©[..]); - - let a = &initial[..len]; - let b = ©[..len]; - - let expected_result = if i < len { - // The flipped bit is within `b` so `a` and `b` are not equal. - Err(error::Unspecified) - } else { - // The flipped bit is outside of `b` so `a` and `b` are equal. - Ok(()) - }; - assert_eq!(a == b, expected_result.is_ok()); // Sanity check. - assert_eq!( - constant_time::verify_slices_are_equal(&a, &b), - expected_result - ); - assert_eq!( - constant_time::verify_slices_are_equal(&b, &a), - expected_result - ); - } - } - } -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/tests/digest_tests.rs temporalio-1.3.0/vendor/ring-0.16.20/tests/digest_tests.rs --- temporalio-1.3.0/vendor/ring-0.16.20/tests/digest_tests.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/tests/digest_tests.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,361 +0,0 @@ -// Copyright 2015-2017 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -use ring::{digest, test, test_file}; - -#[cfg(target_arch = "wasm32")] -use wasm_bindgen_test::{wasm_bindgen_test, wasm_bindgen_test_configure}; - -#[cfg(target_arch = "wasm32")] -wasm_bindgen_test_configure!(run_in_browser); - -/// Test vectors from BoringSSL, Go, and other sources. -#[test] -#[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -fn digest_misc() { - test::run(test_file!("digest_tests.txt"), |section, test_case| { - assert_eq!(section, ""); - let digest_alg = test_case.consume_digest_alg("Hash").unwrap(); - let input = test_case.consume_bytes("Input"); - let repeat = test_case.consume_usize("Repeat"); - let expected = test_case.consume_bytes("Output"); - - let mut ctx = digest::Context::new(digest_alg); - let mut data = Vec::new(); - for _ in 0..repeat { - ctx.update(&input); - data.extend(&input); - } - let actual_from_chunks = ctx.finish(); - assert_eq!(&expected, &actual_from_chunks.as_ref()); - - let actual_from_one_shot = digest::digest(digest_alg, &data); - assert_eq!(&expected, &actual_from_one_shot.as_ref()); - - Ok(()) - }); -} - -mod digest_shavs { - use ring::{digest, test}; - - fn run_known_answer_test(digest_alg: &'static digest::Algorithm, test_file: test::File) { - let section_name = &format!("L = {}", digest_alg.output_len); - test::run(test_file, |section, test_case| { - assert_eq!(section_name, section); - let len_bits = test_case.consume_usize("Len"); - - let mut msg = test_case.consume_bytes("Msg"); - // The "msg" field contains the dummy value "00" when the - // length is zero. - if len_bits == 0 { - assert_eq!(msg, &[0u8]); - msg.truncate(0); - } - - assert_eq!(msg.len() * 8, len_bits); - let expected = test_case.consume_bytes("MD"); - let actual = digest::digest(digest_alg, &msg); - assert_eq!(&expected, &actual.as_ref()); - - Ok(()) - }); - } - - macro_rules! shavs_tests { - ( $file_name:ident, $algorithm_name:ident ) => { - #[allow(non_snake_case)] - mod $algorithm_name { - use super::{run_known_answer_test, run_monte_carlo_test}; - use ring::{digest, test_file}; - - #[cfg(target_arch = "wasm32")] - use wasm_bindgen_test::wasm_bindgen_test; - - #[test] - #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] - fn short_msg_known_answer_test() { - run_known_answer_test( - &digest::$algorithm_name, - test_file!(concat!( - "../third_party/NIST/SHAVS/", - stringify!($file_name), - "ShortMsg.rsp" - )), - ); - } - - #[test] - #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] - fn long_msg_known_answer_test() { - run_known_answer_test( - &digest::$algorithm_name, - test_file!(concat!( - "../third_party/NIST/SHAVS/", - stringify!($file_name), - "LongMsg.rsp" - )), - ); - } - - #[test] - #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] - fn monte_carlo_test() { - run_monte_carlo_test( - &digest::$algorithm_name, - test_file!(concat!( - "../third_party/NIST/SHAVS/", - stringify!($file_name), - "Monte.rsp" - )), - ); - } - } - }; - } - - fn run_monte_carlo_test(digest_alg: &'static digest::Algorithm, test_file: test::File) { - let section_name = &format!("L = {}", digest_alg.output_len); - - let mut expected_count: isize = -1; - let mut seed = Vec::with_capacity(digest_alg.output_len); - - test::run(test_file, |section, test_case| { - assert_eq!(section_name, section); - - if expected_count == -1 { - seed.extend(test_case.consume_bytes("Seed")); - expected_count = 0; - return Ok(()); - } - - assert!(expected_count >= 0); - let actual_count = test_case.consume_usize("COUNT"); - assert_eq!(expected_count as usize, actual_count); - expected_count += 1; - - let expected_md = test_case.consume_bytes("MD"); - - let mut mds = Vec::with_capacity(4); - mds.push(seed.clone()); - mds.push(seed.clone()); - mds.push(seed.clone()); - for _ in 0..1000 { - let mut ctx = digest::Context::new(digest_alg); - ctx.update(&mds[0]); - ctx.update(&mds[1]); - ctx.update(&mds[2]); - let md_i = ctx.finish(); - let _ = mds.remove(0); - mds.push(Vec::from(md_i.as_ref())); - } - let md_j = mds.last().unwrap(); - assert_eq!(&expected_md, md_j); - seed = md_j.clone(); - - Ok(()) - }); - - assert_eq!(expected_count, 100); - } - - shavs_tests!(SHA1, SHA1_FOR_LEGACY_USE_ONLY); - shavs_tests!(SHA256, SHA256); - shavs_tests!(SHA384, SHA384); - shavs_tests!(SHA512, SHA512); -} - -/// Test some ways in which `Context::update` and/or `Context::finish` -/// could go wrong by testing every combination of updating three inputs -/// that vary from zero bytes to one byte larger than the block length. -/// -/// These are not run in dev (debug) builds because they are too slow. -macro_rules! test_i_u_f { - ( $test_name:ident, $alg:expr) => { - #[cfg(not(debug_assertions))] - // TODO: #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] - #[test] - fn $test_name() { - let mut input = [0; (digest::MAX_BLOCK_LEN + 1) * 3]; - let max = $alg.block_len + 1; - for i in 0..(max * 3) { - input[i] = (i & 0xff) as u8; - } - - for i in 0..max { - for j in 0..max { - for k in 0..max { - let part1 = &input[..i]; - let part2 = &input[i..(i + j)]; - let part3 = &input[(i + j)..(i + j + k)]; - - let mut ctx = digest::Context::new(&$alg); - ctx.update(part1); - ctx.update(part2); - ctx.update(part3); - let i_u_f = ctx.finish(); - - let one_shot = digest::digest(&$alg, &input[..(i + j + k)]); - - assert_eq!(i_u_f.as_ref(), one_shot.as_ref()); - } - } - } - } - }; -} -test_i_u_f!(digest_test_i_u_f_sha1, digest::SHA1_FOR_LEGACY_USE_ONLY); -test_i_u_f!(digest_test_i_u_f_sha256, digest::SHA256); -test_i_u_f!(digest_test_i_u_f_sha384, digest::SHA384); -test_i_u_f!(digest_test_i_u_f_sha512, digest::SHA512); - -/// See https://bugzilla.mozilla.org/show_bug.cgi?id=610162. This tests the -/// calculation of 8GB of the byte 123. -/// -/// You can verify the expected values in many ways. One way is -/// `python ~/p/write_big.py`, where write_big.py is: -/// -/// ```python -/// chunk = bytearray([123] * (16 * 1024)) -/// with open('tempfile', 'w') as f: -/// for i in xrange(0, 8 * 1024 * 1024 * 1024, len(chunk)): -/// f.write(chunk) -/// ``` -/// Then: -/// -/// ```sh -/// sha1sum -b tempfile -/// sha256sum -b tempfile -/// sha384sum -b tempfile -/// sha512sum -b tempfile -/// ``` -/// -/// This is not run in dev (debug) builds because it is too slow. -macro_rules! test_large_digest { - ( $test_name:ident, $alg:expr, $len:expr, $expected:expr) => { - #[cfg(not(debug_assertions))] - #[test] - // TODO: #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] - fn $test_name() { - let chunk = vec![123u8; 16 * 1024]; - let chunk_len = chunk.len() as u64; - let mut ctx = digest::Context::new(&$alg); - let mut hashed = 0u64; - loop { - ctx.update(&chunk); - hashed += chunk_len; - if hashed >= 8u64 * 1024 * 1024 * 1024 { - break; - } - } - let calculated = ctx.finish(); - let expected: [u8; $len] = $expected; - assert_eq!(&expected[..], calculated.as_ref()); - } - }; -} - -// XXX: This test is too slow on Android ARM. -#[cfg(any(not(target_os = "android"), not(target_arch = "arm")))] -test_large_digest!( - digest_test_large_digest_sha1, - digest::SHA1_FOR_LEGACY_USE_ONLY, - 160 / 8, - [ - 0xCA, 0xC3, 0x4C, 0x31, 0x90, 0x5B, 0xDE, 0x3B, 0xE4, 0x0D, 0x46, 0x6D, 0x70, 0x76, 0xAD, - 0x65, 0x3C, 0x20, 0xE4, 0xBD - ] -); - -test_large_digest!( - digest_test_large_digest_sha256, - digest::SHA256, - 256 / 8, - [ - 0x8D, 0xD1, 0x6D, 0xD8, 0xB2, 0x5A, 0x29, 0xCB, 0x7F, 0xB9, 0xAE, 0x86, 0x72, 0xE9, 0xCE, - 0xD6, 0x65, 0x4C, 0xB6, 0xC3, 0x5C, 0x58, 0x21, 0xA7, 0x07, 0x97, 0xC5, 0xDD, 0xAE, 0x5C, - 0x68, 0xBD - ] -); -test_large_digest!( - digest_test_large_digest_sha384, - digest::SHA384, - 384 / 8, - [ - 0x3D, 0xFE, 0xC1, 0xA9, 0xD0, 0x9F, 0x08, 0xD5, 0xBB, 0xE8, 0x7C, 0x9E, 0xE0, 0x0A, 0x87, - 0x0E, 0xB0, 0xEA, 0x8E, 0xEA, 0xDB, 0x82, 0x36, 0xAE, 0x74, 0xCF, 0x9F, 0xDC, 0x86, 0x1C, - 0xE3, 0xE9, 0xB0, 0x68, 0xCD, 0x19, 0x3E, 0x39, 0x90, 0x02, 0xE1, 0x58, 0x5D, 0x66, 0xC4, - 0x55, 0x11, 0x9B - ] -); -test_large_digest!( - digest_test_large_digest_sha512, - digest::SHA512, - 512 / 8, - [ - 0xFC, 0x8A, 0x98, 0x20, 0xFC, 0x82, 0xD8, 0x55, 0xF8, 0xFF, 0x2F, 0x6E, 0xAE, 0x41, 0x60, - 0x04, 0x08, 0xE9, 0x49, 0xD7, 0xCD, 0x1A, 0xED, 0x22, 0xEB, 0x55, 0xE1, 0xFD, 0x80, 0x50, - 0x3B, 0x01, 0x2F, 0xC6, 0xF4, 0x33, 0x86, 0xFB, 0x60, 0x75, 0x2D, 0xA5, 0xA9, 0x93, 0xE7, - 0x00, 0x45, 0xA8, 0x49, 0x1A, 0x6B, 0xEC, 0x9C, 0x98, 0xC8, 0x19, 0xA6, 0xA9, 0x88, 0x3E, - 0x2F, 0x09, 0xB9, 0x9A - ] -); - -// TODO: test_large_digest!(digest_test_large_digest_sha512_256, -// digest::SHA512_256, 256 / 8, [ ... ]); - -#[test] -#[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -fn test_fmt_algorithm() { - assert_eq!("SHA1", &format!("{:?}", digest::SHA1_FOR_LEGACY_USE_ONLY)); - assert_eq!("SHA256", &format!("{:?}", digest::SHA256)); - assert_eq!("SHA384", &format!("{:?}", digest::SHA384)); - assert_eq!("SHA512", &format!("{:?}", digest::SHA512)); - assert_eq!("SHA512_256", &format!("{:?}", digest::SHA512_256)); -} - -#[test] -#[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -fn digest_test_fmt() { - assert_eq!( - "SHA1:b7e23ec29af22b0b4e41da31e868d57226121c84", - &format!( - "{:?}", - digest::digest(&digest::SHA1_FOR_LEGACY_USE_ONLY, b"hello, world") - ) - ); - assert_eq!( - "SHA256:09ca7e4eaa6e8ae9c7d261167129184883644d\ - 07dfba7cbfbc4c8a2e08360d5b", - &format!("{:?}", digest::digest(&digest::SHA256, b"hello, world")) - ); - assert_eq!( - "SHA384:1fcdb6059ce05172a26bbe2a3ccc88ed5a8cd5\ - fc53edfd9053304d429296a6da23b1cd9e5c9ed3bb34f0\ - 0418a70cdb7e", - &format!("{:?}", digest::digest(&digest::SHA384, b"hello, world")) - ); - assert_eq!( - "SHA512:8710339dcb6814d0d9d2290ef422285c9322b7\ - 163951f9a0ca8f883d3305286f44139aa374848e4174f5\ - aada663027e4548637b6d19894aec4fb6c46a139fbf9", - &format!("{:?}", digest::digest(&digest::SHA512, b"hello, world")) - ); - - assert_eq!( - "SHA512_256:11f2c88c04f0a9c3d0970894ad2472505e\ - 0bc6e8c7ec46b5211cd1fa3e253e62", - &format!("{:?}", digest::digest(&digest::SHA512_256, b"hello, world")) - ); -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/tests/digest_tests.txt temporalio-1.3.0/vendor/ring-0.16.20/tests/digest_tests.txt --- temporalio-1.3.0/vendor/ring-0.16.20/tests/digest_tests.txt 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/tests/digest_tests.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,214 +0,0 @@ -# SHA-1 tests from RFC 3174. - -Hash = SHA1 -Input = "abc" -Repeat = 1 -Output = a9993e364706816aba3e25717850c26c9cd0d89d - -Hash = SHA1 -Input = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" -Repeat = 1 -Output = 84983e441c3bd26ebaae4aa1f95129e5e54670f1 - -Hash = SHA1 -Input = "a" -Repeat = 1000000 -Output = 34aa973cd4c4daa4f61eeb2bdbad27316534016f - -Hash = SHA1 -Input = "0123456701234567012345670123456701234567012345670123456701234567" -Repeat = 10 -Output = dea356a2cddd90c7a7ecedc5ebb563934f460452 - -# SHA-256 tests from NIST. - -Hash = SHA256 -Input = "abc" -Repeat = 1 -Output = ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad - -Hash = SHA256 -Input = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" -Repeat = 1 -Output = 248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1 - -# SHA-384 tests from NIST. - -Hash = SHA384 -Input = "abc" -Repeat = 1 -Output = cb00753f45a35e8bb5a03d699ac65007272c32ab0eded1631a8b605a43ff5bed8086072ba1e7cc2358baeca134c825a7 - -Hash = SHA384 -Input = "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu" -Repeat = 1 -Output = 09330c33f71147e83d192fc782cd1b4753111b173b3b05d22fa08086e3b0f712fcc7c71a557e2db966c3e9fa91746039 - -# SHA-512 tests from NIST - -Hash = SHA512 -Input = "abc" -Repeat = 1 -Output = ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f - -Hash = SHA512 -Input = "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu" -Repeat = 1 -Output = 8e959b75dae313da8cf4f72814fc143f8f7779c6eb9f7fa17299aeadb6889018501d289e4900f7e4331b99dec4b5433ac7d329eeb6dd26545e96e55b874be909 - -# SHA-512/256 tests from Go. - -Hash = SHA512_256 -Input = "" -Repeat = 1 -Output = c672b8d1ef56ed28ab87c3622c5114069bdd3ad7b8f9737498d0c01ecef0967a - -Hash = SHA512_256 -Input = "a" -Repeat = 1 -Output = 455e518824bc0601f9fb858ff5c37d417d67c2f8e0df2babe4808858aea830f8 - -Hash = SHA512_256 -Input = "ab" -Repeat = 1 -Output = 22d4d37ec6370571af7109fb12eae79673d5f7c83e6e677083faa3cfac3b2c14 - -Hash = SHA512_256 -Input = "abc" -Repeat = 1 -Output = 53048e2681941ef99b2e29b76b4c7dabe4c2d0c634fc6d46e0e2f13107e7af23 - -Hash = SHA512_256 -Input = "abcd" -Repeat = 1 -Output = d2891c7978be0e24948f37caa415b87cb5cbe2b26b7bad9dc6391b8a6f6ddcc9 - -Hash = SHA512_256 -Input = "abcde" -Repeat = 1 -Output = de8322b46e78b67d4431997070703e9764e03a1237b896fd8b379ed4576e8363 - -Hash = SHA512_256 -Input = "abcdef" -Repeat = 1 -Output = e4fdcb11d1ac14e698743acd8805174cea5ddc0d312e3e47f6372032571bad84 - -Hash = SHA512_256 -Input = "abcdefg" -Repeat = 1 -Output = a8117f680bdceb5d1443617cbdae9255f6900075422326a972fdd2f65ba9bee3 - -Hash = SHA512_256 -Input = "abcdefgh" -Repeat = 1 -Output = a29b9645d2a02a8b582888d044199787220e316bf2e89d1422d3df26bf545bbe - -Hash = SHA512_256 -Input = "abcdefghi" -Repeat = 1 -Output = b955095330f9c8188d11884ec1679dc44c9c5b25ff9bda700416df9cdd39188f - -Hash = SHA512_256 -Input = "abcdefghij" -Repeat = 1 -Output = 550762913d51eefbcd1a55068fcfc9b154fd11c1078b996df0d926ea59d2a68d - -Hash = SHA512_256 -Input = "Discard medicine more than two years old." -Repeat = 1 -Output = 690c8ad3916cefd3ad29226d9875965e3ee9ec0d4482eacc248f2ff4aa0d8e5b - -Hash = SHA512_256 -Input = "He who has a shady past knows that nice guys finish last." -Repeat = 1 -Output = 25938ca49f7ef1178ce81620842b65e576245fcaed86026a36b516b80bb86b3b - -Hash = SHA512_256 -Input = "I wouldn't marry him with a ten foot pole." -Repeat = 1 -Output = 698e420c3a7038e53d8e73f4be2b02e03b93464ac1a61ebe69f557079921ef65 - -Hash = SHA512_256 -Input = "Free! Free!/A trip/to Mars/for 900/empty jars/Burma Shave" -Repeat = 1 -Output = 839b414d7e3900ee243aa3d1f9b6955720e64041f5ab9bedd3eb0a08da5a2ca8 - -Hash = SHA512_256 -Input = "The days of the digital watch are numbered. -Tom Stoppard" -Repeat = 1 -Output = 5625ecb9d284e54c00b257b67a8cacb25a78db2845c60ef2d29e43c84f236e8e - -Hash = SHA512_256 -Input = "Nepal premier won't resign." -Repeat = 1 -Output = 9b81d06bca2f985e6ad3249096ff3c0f2a9ec5bb16ef530d738d19d81e7806f2 - -Hash = SHA512_256 -Input = "For every action there is an equal and opposite government program." -Repeat = 1 -Output = 08241df8d91edfcd68bb1a1dada6e0ae1475a5c6e7b8f12d8e24ca43a38240a9 - -Hash = SHA512_256 -Input = "His money is twice tainted: 'taint yours and 'taint mine." -Repeat = 1 -Output = 4ff74d9213a8117745f5d37b5353a774ec81c5dfe65c4c8986a56fc01f2c551e - -Hash = SHA512_256 -Input = "There is no reason for any individual to have a computer in their home. -Ken Olsen, 1977" -Repeat = 1 -Output = b5baf747c307f98849ec881cf0d48605ae4edd386372aea9b26e71db517e650b - -Hash = SHA512_256 -Input = "It's a tiny change to the code and not completely disgusting. - Bob Manchek" -Repeat = 1 -Output = 7eef0538ebd7ecf18611d23b0e1cd26a74d65b929a2e374197dc66e755ca4944 - -Hash = SHA512_256 -Input = "size: a.out: bad magic" -Repeat = 1 -Output = d05600964f83f55323104aadab434f32391c029718a7690d08ddb2d7e8708443 - -Hash = SHA512_256 -Input = "The major problem is with sendmail. -Mark Horton" -Repeat = 1 -Output = 53ed5f9b5c0b674ac0f3425d9f9a5d462655b07cc90f5d0f692eec093884a607 - -Hash = SHA512_256 -Input = "Give me a rock, paper and scissors and I will move the world. CCFestoon" -Repeat = 1 -Output = 5a0147685a44eea2435dbd582724efca7637acd9c428e5e1a05115bc3bc2a0e0 - -Hash = SHA512_256 -Input = "If the enemy is within range, then so are you." -Repeat = 1 -Output = 1152c9b27a99dbf4057d21438f4e63dd0cd0977d5ff12317c64d3b97fcac875a - -Hash = SHA512_256 -Input = "It's well we cannot hear the screams/That we create in others' dreams." -Repeat = 1 -Output = 105e890f5d5cf1748d9a7b4cdaf58b69855779deebc2097747c2210a17b2cb51 - -Hash = SHA512_256 -Input = "You remind me of a TV show, but that's all right: I watch it anyway." -Repeat = 1 -Output = 74644ead770da1434365cd912656fe1aca2056d3039d39f10eb1151bddb32cf3 - -Hash = SHA512_256 -Input = "C is as portable as Stonehedge!!" -Repeat = 1 -Output = 50a234625de5587581883dad9ef399460928032a5ea6bd005d7dc7b68d8cc3d6 - -Hash = SHA512_256 -Input = "Even if I could be Shakespeare, I think I should still choose to be Faraday. - A. Huxley" -Repeat = 1 -Output = a7a3846005f8a9935a0a2d43e7fd56d95132a9a3609bf3296ef80b8218acffa0 - -Hash = SHA512_256 -Input = "The fugacity of a constituent in a mixture of gases at a given temperature is proportional to its mole fraction. Lewis-Randall Rule" -Repeat = 1 -Output = 688ff03e367680757aa9906cb1e2ad218c51f4526dc0426ea229a5ba9d002c69 - -Hash = SHA512_256 -Input = "How can you write a big system without C++? -Paul Glick" -Repeat = 1 -Output = 3fa46d52094b01021cff5af9a438982b887a5793f624c0a6644149b6b7c3f485 diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/tests/ecdsa_from_pkcs8_tests.txt temporalio-1.3.0/vendor/ring-0.16.20/tests/ecdsa_from_pkcs8_tests.txt --- temporalio-1.3.0/vendor/ring-0.16.20/tests/ecdsa_from_pkcs8_tests.txt 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/tests/ecdsa_from_pkcs8_tests.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,43 +0,0 @@ -Curve = P-256 -Input = 308187020100301306072a8648ce3d020106082a8648ce3d030107046d306b0201010420090460075f15d2a256248000fb02d83ad77593dde4ae59fc5e96142dffb2bd07a14403420004cf0d13a3a7577231ea1b66cf4021cd54f21f4ac4f5f2fdd28e05bc7d2bd099d1374cd08d2ef654d6f04498db462f73e0282058dd661a4c9b0437af3f7af6e724 - -Curve = P-384 -Input = 3081b6020100301006072a8648ce3d020106052b8104002204819e30819b0201010430fc0603810412769beeabbf97ce9764e104bca45b3b7428006fb42d1fa69a344bf475ce17bf06daf553c4eccffcfecc26a1640362000417e425506a81d85e607a3caeaccbe6cc7ef58b559115b9867175ef9911f66ea77eb5b7f43e42f3129a1fe2841f6717ed4fc02bf8cfe2d10cac06a150dcba7ae9f035ec9b6b034a4ddc554da7c2da4719a1d990097fbb451a3ea1e664fc444cfa - -# A P-256 key where the ECPrivateKey contains a parameters field that matches the PKCS#8 algorithm identifier. -Curve = P-256 -Input = 308193020100301306072a8648ce3d020106082a8648ce3d030107047930770201010420090460075f15d2a256248000fb02d83ad77593dde4ae59fc5e96142dffb2bd07a00a06082a8648ce3d030107a14403420004cf0d13a3a7577231ea1b66cf4021cd54f21f4ac4f5f2fdd28e05bc7d2bd099d1374cd08d2ef654d6f04498db462f73e0282058dd661a4c9b0437af3f7af6e724 - -# A P-384 key where the ECPrivateKey contains a parameters field identifying P-384. -Curve = P-384 -Input = 3081bf020100301006072a8648ce3d020106052b810400220481a73081a40201010430fc0603810412769beeabbf97ce9764e104bca45b3b7428006fb42d1fa69a344bf475ce17bf06daf553c4eccffcfecc26a00706052b81040022a1640362000417e425506a81d85e607a3caeaccbe6cc7ef58b559115b9867175ef9911f66ea77eb5b7f43e42f3129a1fe2841f6717ed4fc02bf8cfe2d10cac06a150dcba7ae9f035ec9b6b034a4ddc554da7c2da4719a1d990097fbb451a3ea1e664fc444cfa - -# A P-256 key where the ECPrivateKey contains a parameters field identifying P-384. -Curve = P-256 -Input = 308190020100301306072a8648ce3d020106082a8648ce3d030107047630740201010420090460075f15d2a256248000fb02d83ad77593dde4ae59fc5e96142dffb2bd07a00706052b81040022a14403420004cf0d13a3a7577231ea1b66cf4021cd54f21f4ac4f5f2fdd28e05bc7d2bd099d1374cd08d2ef654d6f04498db462f73e0282058dd661a4c9b0437af3f7af6e724 -Error = WrongAlgorithm - -# A P-256 key where the ECPrivateKey contains a parameters field containing an entire AlgorithmIdentifier. -Curve = P-256 -Input = 3081a0020100301306072a8648ce3d020106082a8648ce3d0301070481853081820201010420090460075f15d2a256248000fb02d83ad77593dde4ae59fc5e96142dffb2bd07a015301306072a8648ce3d020106082a8648ce3d030107a14403420004cf0d13a3a7577231ea1b66cf4021cd54f21f4ac4f5f2fdd28e05bc7d2bd099d1374cd08d2ef654d6f04498db462f73e0282058dd661a4c9b0437af3f7af6e724 -Error = WrongAlgorithm - -# The curve P-256 is encoded explicitly, instead of as a reference to a named curve. -Curve = P-256 -Input = 308201220201010420c6c1aada15b07661f8142c6caf0fdb241aff2efe46c0938b74f2bcc53052b077a081fa3081f7020101302c06072a8648ce3d0101022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff305b0420ffffffff00000001000000000000000000000000fffffffffffffffffffffffc04205ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b031500c49d360886e704936a6678e1139d26b7819f7e900441046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2964fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551020101 -Error = InvalidEncoding - -# A valid PKCS#8 P-256 private key, but without the public key in the ECPrivateKey. -Curve = P-256 -Input = 308141020100301306072a8648ce3d020106082a8648ce3d030107042730250201010420090460075f15d2a256248000fb02d83ad77593dde4ae59fc5e96142dffb2bd07 -Error = InvalidEncoding - -# The AlgorithmIdentifier is ecPublicKey w/ P-256, but it's an RSAPrivateKey. -Curve = P-256 -Input = 308189020100301306072A8648CE3D020106082A8648CE3D0301070500046d306b0201010420090460075f15d2a256248000fb02d83ad77593dde4ae59fc5e96142dffb2bd07a14403420004cf0d13a3a7577231ea1b66cf4021cd54f21f4ac4f5f2fdd28e05bc7d2bd099d1374cd08d2ef654d6f04498db462f73e0282058dd661a4c9b0437af3f7af6e724 -Error = InvalidEncoding - -# A P-256 ECPrivateKey, but the AlgorithmIdentifier is rsaEncryption. -Curve = P-256 -Input = 308181020100300d06092a864886f70d0101010500046d306b0201010420090460075f15d2a256248000fb02d83ad77593dde4ae59fc5e96142dffb2bd07a14403420004cf0d13a3a7577231ea1b66cf4021cd54f21f4ac4f5f2fdd28e05bc7d2bd099d1374cd08d2ef654d6f04498db462f73e0282058dd661a4c9b0437af3f7af6e724 -Error = WrongAlgorithm Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/ring-0.16.20/tests/ecdsa_test_private_key_p256.p8 and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/ring-0.16.20/tests/ecdsa_test_private_key_p256.p8 differ diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/tests/ecdsa_test_public_key_p256_debug.txt temporalio-1.3.0/vendor/ring-0.16.20/tests/ecdsa_test_public_key_p256_debug.txt --- temporalio-1.3.0/vendor/ring-0.16.20/tests/ecdsa_test_public_key_p256_debug.txt 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/tests/ecdsa_test_public_key_p256_debug.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -PublicKey("04fc116698a3e3236550c4c9efa9bd4d0619602a65d2930e9150ab33e84dbc83f8a6a6b9933f35ab59245e5b5a7af5dca76b33cbe7aeee5981b3ca350bebf52ecd") \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/tests/ecdsa_test_public_key_p256.der temporalio-1.3.0/vendor/ring-0.16.20/tests/ecdsa_test_public_key_p256.der --- temporalio-1.3.0/vendor/ring-0.16.20/tests/ecdsa_test_public_key_p256.der 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/tests/ecdsa_test_public_key_p256.der 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -üf˜£ã#ePÄÉ墳M`*eÒ“‘P«3èM¼ƒø¦¦¹“?5«Y$^[Zzõܧk3Ëç®îY³Ê5 ëõ.Í \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/tests/ecdsa_tests.rs temporalio-1.3.0/vendor/ring-0.16.20/tests/ecdsa_tests.rs --- temporalio-1.3.0/vendor/ring-0.16.20/tests/ecdsa_tests.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/tests/ecdsa_tests.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,314 +0,0 @@ -// Copyright 2015-2016 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -use ring::{ - rand, - signature::{self, KeyPair}, - test, test_file, -}; - -// ECDSA *signing* tests are in src/ec/ecdsa/signing.rs. - -#[test] -fn ecdsa_from_pkcs8_test() { - test::run( - test_file!("ecdsa_from_pkcs8_tests.txt"), - |section, test_case| { - assert_eq!(section, ""); - - let curve_name = test_case.consume_string("Curve"); - let ((this_fixed, this_asn1), (other_fixed, other_asn1)) = match curve_name.as_str() { - "P-256" => ( - ( - &signature::ECDSA_P256_SHA256_FIXED_SIGNING, - &signature::ECDSA_P256_SHA256_ASN1_SIGNING, - ), - ( - &signature::ECDSA_P384_SHA384_FIXED_SIGNING, - &signature::ECDSA_P384_SHA384_ASN1_SIGNING, - ), - ), - "P-384" => ( - ( - &signature::ECDSA_P384_SHA384_FIXED_SIGNING, - &signature::ECDSA_P384_SHA384_ASN1_SIGNING, - ), - ( - &signature::ECDSA_P256_SHA256_FIXED_SIGNING, - &signature::ECDSA_P256_SHA256_ASN1_SIGNING, - ), - ), - _ => unreachable!(), - }; - - let input = test_case.consume_bytes("Input"); - - let error = test_case.consume_optional_string("Error"); - - match ( - signature::EcdsaKeyPair::from_pkcs8(this_fixed, &input), - error.clone(), - ) { - (Ok(_), None) => (), - (Err(e), None) => panic!("Failed with error \"{}\", but expected to succeed", e), - (Ok(_), Some(e)) => panic!("Succeeded, but expected error \"{}\"", e), - (Err(actual), Some(expected)) => assert_eq!(format!("{}", actual), expected), - }; - - match ( - signature::EcdsaKeyPair::from_pkcs8(this_asn1, &input), - error, - ) { - (Ok(_), None) => (), - (Err(e), None) => panic!("Failed with error \"{}\", but expected to succeed", e), - (Ok(_), Some(e)) => panic!("Succeeded, but expected error \"{}\"", e), - (Err(actual), Some(expected)) => assert_eq!(format!("{}", actual), expected), - }; - - assert!(signature::EcdsaKeyPair::from_pkcs8(other_fixed, &input).is_err()); - assert!(signature::EcdsaKeyPair::from_pkcs8(other_asn1, &input).is_err()); - - Ok(()) - }, - ); -} - -// Verify that, at least, we generate PKCS#8 documents that we can read. -#[test] -fn ecdsa_generate_pkcs8_test() { - let rng = rand::SystemRandom::new(); - - for alg in &[ - &signature::ECDSA_P256_SHA256_ASN1_SIGNING, - &signature::ECDSA_P256_SHA256_FIXED_SIGNING, - &signature::ECDSA_P384_SHA384_ASN1_SIGNING, - &signature::ECDSA_P384_SHA384_FIXED_SIGNING, - ] { - let pkcs8 = signature::EcdsaKeyPair::generate_pkcs8(alg, &rng).unwrap(); - println!(); - for b in pkcs8.as_ref() { - print!("{:02x}", *b); - } - println!(); - println!(); - - #[cfg(feature = "alloc")] - let _ = signature::EcdsaKeyPair::from_pkcs8(*alg, pkcs8.as_ref()).unwrap(); - } -} - -#[test] -fn signature_ecdsa_verify_asn1_test() { - test::run( - test_file!("ecdsa_verify_asn1_tests.txt"), - |section, test_case| { - assert_eq!(section, ""); - - let curve_name = test_case.consume_string("Curve"); - let digest_name = test_case.consume_string("Digest"); - let msg = test_case.consume_bytes("Msg"); - let public_key = test_case.consume_bytes("Q"); - let sig = test_case.consume_bytes("Sig"); - let is_valid = test_case.consume_string("Result") == "P (0 )"; - - let alg = match (curve_name.as_str(), digest_name.as_str()) { - ("P-256", "SHA256") => &signature::ECDSA_P256_SHA256_ASN1, - ("P-256", "SHA384") => &signature::ECDSA_P256_SHA384_ASN1, - ("P-384", "SHA256") => &signature::ECDSA_P384_SHA256_ASN1, - ("P-384", "SHA384") => &signature::ECDSA_P384_SHA384_ASN1, - _ => { - panic!("Unsupported curve+digest: {}+{}", curve_name, digest_name); - } - }; - - let actual_result = - signature::UnparsedPublicKey::new(alg, &public_key).verify(&msg, &sig); - assert_eq!(actual_result.is_ok(), is_valid); - - Ok(()) - }, - ); -} - -#[test] -fn signature_ecdsa_verify_fixed_test() { - test::run( - test_file!("ecdsa_verify_fixed_tests.txt"), - |section, test_case| { - assert_eq!(section, ""); - - let curve_name = test_case.consume_string("Curve"); - let digest_name = test_case.consume_string("Digest"); - - let msg = test_case.consume_bytes("Msg"); - let public_key = test_case.consume_bytes("Q"); - let sig = test_case.consume_bytes("Sig"); - let expected_result = test_case.consume_string("Result"); - - let alg = match (curve_name.as_str(), digest_name.as_str()) { - ("P-256", "SHA256") => &signature::ECDSA_P256_SHA256_FIXED, - ("P-384", "SHA384") => &signature::ECDSA_P384_SHA384_FIXED, - _ => { - panic!("Unsupported curve+digest: {}+{}", curve_name, digest_name); - } - }; - - let is_valid = expected_result == "P (0 )"; - - let actual_result = - signature::UnparsedPublicKey::new(alg, &public_key).verify(&msg, &sig); - assert_eq!(actual_result.is_ok(), is_valid); - - Ok(()) - }, - ); -} - -#[test] -fn ecdsa_test_public_key_coverage() { - const PRIVATE_KEY: &[u8] = include_bytes!("ecdsa_test_private_key_p256.p8"); - const PUBLIC_KEY: &[u8] = include_bytes!("ecdsa_test_public_key_p256.der"); - const PUBLIC_KEY_DEBUG: &str = include_str!("ecdsa_test_public_key_p256_debug.txt"); - - let key_pair = signature::EcdsaKeyPair::from_pkcs8( - &signature::ECDSA_P256_SHA256_FIXED_SIGNING, - PRIVATE_KEY, - ) - .unwrap(); - - // Test `AsRef<[u8]>` - assert_eq!(key_pair.public_key().as_ref(), PUBLIC_KEY); - - // Test `Clone`. - #[allow(clippy::clone_on_copy, clippy::redundant_clone)] - let _: ::PublicKey = key_pair.public_key().clone(); - - // Test `Copy`. - let _: ::PublicKey = *key_pair.public_key(); - - // Test `Debug`. - assert_eq!(PUBLIC_KEY_DEBUG, format!("{:?}", key_pair.public_key())); - assert_eq!( - format!("EcdsaKeyPair {{ public_key: {:?} }}", key_pair.public_key()), - format!("{:?}", key_pair) - ); -} - -// This test is not a known-answer test, though it re-uses the known-answer -// test vectors. Because the nonce is randomized, the signature will be -// different each time. Because of that, here we simply verify that the -// signature verifies correctly. The known-answer tests themselves are in -// ecsda/signing.rs. -#[test] -fn signature_ecdsa_sign_fixed_sign_and_verify_test() { - let rng = rand::SystemRandom::new(); - - test::run( - test_file!("../src/ec/suite_b/ecdsa/ecdsa_sign_fixed_tests.txt"), - |section, test_case| { - assert_eq!(section, ""); - - let curve_name = test_case.consume_string("Curve"); - let digest_name = test_case.consume_string("Digest"); - - let msg = test_case.consume_bytes("Msg"); - let d = test_case.consume_bytes("d"); - let q = test_case.consume_bytes("Q"); - - // Ignored since the actual signature will use a randomized nonce. - let _k = test_case.consume_bytes("k"); - let _expected_result = test_case.consume_bytes("Sig"); - - let (signing_alg, verification_alg) = match (curve_name.as_str(), digest_name.as_str()) - { - ("P-256", "SHA256") => ( - &signature::ECDSA_P256_SHA256_FIXED_SIGNING, - &signature::ECDSA_P256_SHA256_FIXED, - ), - ("P-384", "SHA384") => ( - &signature::ECDSA_P384_SHA384_FIXED_SIGNING, - &signature::ECDSA_P384_SHA384_FIXED, - ), - _ => { - panic!("Unsupported curve+digest: {}+{}", curve_name, digest_name); - } - }; - - let private_key = - signature::EcdsaKeyPair::from_private_key_and_public_key(signing_alg, &d, &q) - .unwrap(); - - let signature = private_key.sign(&rng, &msg).unwrap(); - - let public_key = signature::UnparsedPublicKey::new(verification_alg, q); - assert_eq!(public_key.verify(&msg, signature.as_ref()), Ok(())); - - Ok(()) - }, - ); -} - -// This test is not a known-answer test, though it re-uses the known-answer -// test vectors. Because the nonce is randomized, the signature will be -// different each time. Because of that, here we simply verify that the -// signature verifies correctly. The known-answer tests themselves are in -// ecsda/signing.rs. -#[test] -fn signature_ecdsa_sign_asn1_test() { - let rng = rand::SystemRandom::new(); - - test::run( - test_file!("../src/ec/suite_b/ecdsa/ecdsa_sign_asn1_tests.txt"), - |section, test_case| { - assert_eq!(section, ""); - - let curve_name = test_case.consume_string("Curve"); - let digest_name = test_case.consume_string("Digest"); - - let msg = test_case.consume_bytes("Msg"); - let d = test_case.consume_bytes("d"); - let q = test_case.consume_bytes("Q"); - - // Ignored since the actual signature will use a randomized nonce. - let _k = test_case.consume_bytes("k"); - let _expected_result = test_case.consume_bytes("Sig"); - - let (signing_alg, verification_alg) = match (curve_name.as_str(), digest_name.as_str()) - { - ("P-256", "SHA256") => ( - &signature::ECDSA_P256_SHA256_ASN1_SIGNING, - &signature::ECDSA_P256_SHA256_ASN1, - ), - ("P-384", "SHA384") => ( - &signature::ECDSA_P384_SHA384_ASN1_SIGNING, - &signature::ECDSA_P384_SHA384_ASN1, - ), - _ => { - panic!("Unsupported curve+digest: {}+{}", curve_name, digest_name); - } - }; - - let private_key = - signature::EcdsaKeyPair::from_private_key_and_public_key(signing_alg, &d, &q) - .unwrap(); - - let signature = private_key.sign(&rng, &msg).unwrap(); - - let public_key = signature::UnparsedPublicKey::new(verification_alg, q); - assert_eq!(public_key.verify(&msg, signature.as_ref()), Ok(())); - - Ok(()) - }, - ); -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/tests/ecdsa_verify_asn1_tests.txt temporalio-1.3.0/vendor/ring-0.16.20/tests/ecdsa_verify_asn1_tests.txt --- temporalio-1.3.0/vendor/ring-0.16.20/tests/ecdsa_verify_asn1_tests.txt 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/tests/ecdsa_verify_asn1_tests.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,738 +0,0 @@ -# Test vectors for short values of s. - -# S is the maximum length. -Curve = P-256 -Digest = SHA256 -Msg = "" -Q = 0430345fd47ea21a11129be651b0884bfac698377611acc9f689458e13b9ed7d4b9d7599a68dcf125e7f31055ccb374cd04f6d6fd2b217438a63f6f667d50ef2f0 -Sig = 30440220341f6779b75e98bb42e01095dd48356cbf9002dc704ac8bd2a8240b88d3796c60220555843b1b4e264fe6ffe6e2b705a376c05c09404303ffe5d2711f3e3b3a010a1 -Result = P (0 ) - -# S is one byte shorter than the maximum length. -Curve = P-256 -Digest = SHA256 -Msg = "" -Q = 0430345fd47ea21a11129be651b0884bfac698377611acc9f689458e13b9ed7d4b9d7599a68dcf125e7f31055ccb374cd04f6d6fd2b217438a63f6f667d50ef2f0 -Sig = 3044022031ed574e9688aed7016e985c0e742fb788be73d9ad0a895e6182c77751817ed0022000d98eb6d480d64d1729c680693cb13bd6bf0c7b651007e459e667683ff65b92 -Result = P (0 ) - -# S is 2 bytes shorter than the maximum length. -Curve = P-256 -Digest = SHA256 -Msg = "" -Q = 0430345fd47ea21a11129be651b0884bfac698377611acc9f689458e13b9ed7d4b9d7599a68dcf125e7f31055ccb374cd04f6d6fd2b217438a63f6f667d50ef2f0 -Sig = 3043022100f59cf66594cc837415f16494fb52c02f2a6264bf6ce7dccbf2f78c090cdcefb0021e5a8c8a04ba7825f3f8e56517056daa1a51129cd91382a24589ed05d0c13d -Result = P (0 ) - -# S is the maximum length. -Curve = P-384 -Digest = SHA384 -Msg = "" -Q = 045c5e788a805c77d34128b8401cb59b2373b8b468336c9318252bf39fd31d2507557987a5180a9435f9fb8eb971c426f1c485170dcb18fb688a257f89387a09fc4c5b8bd4b320616b54a0a7b1d1d7c6a0c59f6dff78c78ad4e3d6fca9c9a17b96 -Sig = 306502310085ac708d4b0126bac1f5eeebdf911409070a286fdde5649582611b60046de353761660dd03903f58b44148f25142eef80230183475ec1f1392f3d6838abc0c01724709c446888bed7f2ce4642c6839dc18044a2a6ab9ddc960bfac79f6988e62d452 -Result = P (0 ) - -# S is one byte shorter than the maximum length. -Curve = P-384 -Digest = SHA384 -Msg = "" -Q = 045c5e788a805c77d34128b8401cb59b2373b8b468336c9318252bf39fd31d2507557987a5180a9435f9fb8eb971c426f1c485170dcb18fb688a257f89387a09fc4c5b8bd4b320616b54a0a7b1d1d7c6a0c59f6dff78c78ad4e3d6fca9c9a17b96 -Sig = 306302304dec97b54c4150ebaffc2dbfc2bc17c302be47cfc4b541ada34108b1080f2482a3e7f5f2b16f730210bd8c29b6681e0b022f0575984f37064bfbbdda76836f5ef2d632f006c338a9585c8b9108c46ea812ce066110156de9806ae5711153e2ef0b -Result = P (0 ) - -# S is 2 bytes shorter than the maximum length. -Curve = P-384 -Digest = SHA384 -Msg = "" -Q = 045c5e788a805c77d34128b8401cb59b2373b8b468336c9318252bf39fd31d2507557987a5180a9435f9fb8eb971c426f1c485170dcb18fb688a257f89387a09fc4c5b8bd4b320616b54a0a7b1d1d7c6a0c59f6dff78c78ad4e3d6fca9c9a17b96 -Sig = 3064023100ad8e51ec23d5b8130a5e0636a2f0d1740e8b5404c368b7dab5ae82d307d653c6ef70dcee70b112bf678801f87fb8f5a9022f00806d69e0c2834c27666996d55655cf9358b201aa85d3b08891abcc68c854cac6c67c53b3bf92df9a677d11aba13d -Result = P (0 ) - - -# Generated Test vectors. -# -# TODO: Test the range of `r` in addition to the range of `s`. -# TODO: Test what happens when the message digests to zero. -# TODO: Additional test coverage. libsecp256k1 is a good example. - - -# Test vectors for Gregory Maxwell's trick. -# -# In all cases, the `s` component of the signature was selected -# arbitrarily as 4 and then the `r` component was chosen to be the -# smallest value where the public key recovery from the signature -# works. - -# The signature has r < q - n. This is the control case for the next -# test case; this signature is the same but the public key is -# different. Notice that both public keys work for the same signature! -# This signature will validate even if the implementation doesn't -# reduce the X coordinate of the multiplication result (mod n). -Curve = P-256 -Digest = SHA256 -Msg = "" -Q = 041548fc88953e06cd34d4b300804c5322cb48c24aaaa4d07a541b0f0ccfeedeb0ae4991b90519ea405588bdf699f5e6d0c6b2d5217a5c16e8371062737aa1dae1 -Sig = 3006020106020104 -Result = P (0 ) - -# The signature has r < q - n. s Since r < q - n, r + n < q. Notice -# that this signature is the same as the signature in the preceding -# test case, but the public key is different. That the signature -# validates for this case too is what's special about the case where -# r < q - n. If this test case fails it is likely that the -# implementation doesn't reduce the X coordinate of the multiplication -# result (mod n), or it is missing the second step of Gregory -# Maxwell's trick. -Curve = P-256 -Digest = SHA256 -Msg = "" -Q = 04ad8f60e4ec1ebdb6a260b559cb55b1e9d2c5ddd43a41a2d11b0741ef2567d84e166737664104ebbc337af3d861d3524cfbc761c12edae974a0759750c8324f9a -Sig = 3006020106020104 -Result = P (0 ) - -# The signature has r > q - n. The signature is for the public key -# recovered from r. r + n > q since r > q - n. This is the control -# for the next test case; this signature is the same as the signature -# in the following test case but the public key is different. -Curve = P-256 -Digest = SHA256 -Msg = "" -Q = 0445bd879143a64af5746e2e82aa65fd2ea07bba4e35594095a981b59984dacb219d59697387ac721b1f1eccf4b11f43ddc39e8367147abab3084142ed3ea170e4 -Sig = 301502104319055358e8617b0c46353d039cdaae020104 -Result = P (0 ) - -# The signature has r > q - n. The signature is for the public key -# recovered from r + n (mod q). r + n > q since r > q - n, and so -# r + n (mod q) < r because r + n (mod n) != r + n (mod q). Notice -# that this signature is the same as the signature in the preceding -# test case but the public key is different. Also, notice that the -# signature fails to validate in this case, unlike other related test -# cases. If this test case fails (the signature validates), it is -# likely that the implementation didn't guard the second case of -# Gregory Maxwell's trick on the condition r < q - n. -Curve = P-256 -Digest = SHA256 -Msg = "" -Q = 040feb5df4cc78b35ec9c180cc0de5842f75f088b48456978ffa98e716d94883e1e6500b2a1f6c1d9d493428d7ae7d9a8a560fff30a3d14aa160be0c5e7edcd887 -Sig = 301502104319055358e8617b0c46353d039cdaae020104 -Result = F - -# The signature has r < q - n. This is the control case for the next -# test case; this signature is the same but the public key is -# different. Notice that both public keys work for the same signature! -# This signature will validate even if the implementation doesn't -# reduce the X coordinate of the multiplication result (mod n). -Curve = P-384 -Digest = SHA384 -Msg = "" -Q = 0425b890b9597155baf7e7ffb48d8123184cbb76ea3f7b10d8f1702136f969e915188cff306c67950437f816ce6ecb739204cc069edac95929dfbd719313552797962789e2210a0bf270c2f0ffc109a70e40da6303a2599bdd702c19070dd51f42 -Sig = 3006020103020104 -Result = P (0 ) - -# The signature has r < q - n. s Since r < q - n, r + n < q. Notice -# that this signature is the same as the signature in the preceding -# test case, but the public key is different. That the signature -# validates for this case too is what's special about the case where -# r < q - n. If this test case fails it is likely that the -# implementation doesn't reduce the X coordinate of the multiplication -# result (mod n), or it is missing the second step of Gregory -# Maxwell's trick. -Curve = P-384 -Digest = SHA384 -Msg = "" -Q = 045a3c576f0c2a615063c6e8ec40f5bf0dd67e549e9f13f8f881703ec40a8d6d8ecbb0d8e5b20f3aa0f2e581b594cea3e654a450cabcf24bd908cc47da98eba648a0440332ee19fb53da96dddaec521f718f7b52a161b67134d6e0d6e81dc45502 -Sig = 3006020103020104 -Result = P (0 ) - -# The signature has r > q - n. The signature is for the public key -# recovered from r. r + n > q since r > q - n. This is the control -# for the next test case; this signature is the same as the signature -# in the following test case but the public key is different. -Curve = P-384 -Digest = SHA384 -Msg = "" -Q = 04a93588bffb32417bd2b0fa03a6a30d2cf90034e6070b9333d4e7a42fe88bce5a03e8be7f2a84fbc25ec84dc34915c53fd975cfd0db77ec2b5c548994dc9f62756e018882a31d883471b0bbbd8588d9a2acab1aeaaa1eb217f8e528e7114162df -Sig = 301d0218389cb27e0bc8d21fa7e5f24cb74f58851313e696333ad68e020104 -Result = P (0 ) - -# The signature has r > q - n. The signature is for the public key -# recovered from r + n (mod q). r + n > q since r > q - n, and so -# r + n (mod q) < r because r + n (mod n) != r + n (mod q). Notice -# that this signature is the same as the signature in the preceding -# test case but the public key is different. Also, notice that the -# signature fails to validate in this case, unlike other related test -# cases. If this test case fails (the signature validates), it is -# likely that the implementation didn't guard the second case of -# Gregory Maxwell's trick on the condition r < q - n. -Curve = P-384 -Digest = SHA384 -Msg = "" -Q = 04576270f9571c9e99b9c71be1a1a705e5155e46b8c6dd920c14e2aaf0f9f96ed30754e2c8f8464d015a9bc779495ea568ac39c555c3b03de021e8167a27425588d6a82b68cf7a0f6ae389a202d8663ed32b5e1782c0377a8f0dc309ae28143961 -Sig = 301d0218389cb27e0bc8d21fa7e5f24cb74f58851313e696333ad68e020104 -Result = F - - -# Generated Test vectors edge cases of signature (r, s) values. - -# s == 0 (out of range) -Curve = P-256 -Digest = SHA256 -Msg = "" -Q = 0471db746fd153cf5c5a7c7210f9008c0e99c3a936ef0e720b202b304771431a230af53931e70cbe279ca47ce819616ed1db6604490f70abbcef3036732426eb6d -Sig = 3006020106020100 -Result = F - -# s == 1 (minimum allowed) -Curve = P-256 -Digest = SHA256 -Msg = "" -Q = 046e3f95fae7606c1cdfab1f1560de160ed806bbc2a85dc5a2d002aa1c0ac3e1fb5bcd5f7a325415824365cc584f08c144118318ce4d0f5df82b7753b291c4fe96 -Sig = 3006020106020101 -Result = P (0 ) - -# s == n (out of range) -Curve = P-256 -Digest = SHA256 -Msg = "" -Q = 0471db746fd153cf5c5a7c7210f9008c0e99c3a936ef0e720b202b304771431a230af53931e70cbe279ca47ce819616ed1db6604490f70abbcef3036732426eb6d -Sig = 3026020106022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551 -Result = F - -# s == n - 1 (maximum allowed) -Curve = P-256 -Digest = SHA256 -Msg = "" -Q = 04d78f14b53bf825c9f7146193f775458ef5ee46500cd44b18488cb4115c3f00f04b11fc7c6aa1045dc83e4f3e8a14d4a017db8415b5fe3f1a32afba4b8c707ab4 -Sig = 3026020106022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550 -Result = P (0 ) - -# s == 0 (out of range) -Curve = P-384 -Digest = SHA384 -Msg = "" -Q = 04aad95ed7839057e221d46bb203f8b6c977588966fffccf815542429477dc45e61ed6b86fec0a2f3dfb453ea56ac0a6c06933416550a7158ed3f06aca1822c9b83102b40e5ada71651ec153a919a32755ee0292f6a5530d5889c1dc6cb020351f -Sig = 3006020103020100 -Result = F - -# s == 1 (minimum allowed) -Curve = P-384 -Digest = SHA384 -Msg = "" -Q = 042aadde5424928b888e20ecef2525f99d646519aa994c075a4081aa852ec309a6ac63006421ff756c6c0924d611d1bda82df99267266ba603b07ba85c678f4ae69daf4634a5e597d77d0b0338f343d8090b2d4420a29302ab47ef04ad45e1461f -Sig = 3006020103020101 -Result = P (0 ) - -# s == n (out of range) -Curve = P-384 -Digest = SHA384 -Msg = "" -Q = 04aad95ed7839057e221d46bb203f8b6c977588966fffccf815542429477dc45e61ed6b86fec0a2f3dfb453ea56ac0a6c06933416550a7158ed3f06aca1822c9b83102b40e5ada71651ec153a919a32755ee0292f6a5530d5889c1dc6cb020351f -Sig = 3036020103023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973 -Result = F - -# s == n - 1 (maximum allowed) -Curve = P-384 -Digest = SHA384 -Msg = "" -Q = 04a1d58e8df7f27c4483be9369f8d73d3ea968fce26ff5374d822c5cb4286c00f6fef54d525f4c8b180065dcc1f95f7a0c291171ca5894ba3f4d52ae091ec36c81ee2f34a384c59183284d85dddc3b196c6d7deaab1626d662bc628136126eef6b -Sig = 3036020103023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972 -Result = P (0 ) - - -# RFC 6979 Test Vectors - -Curve = P-256 -Digest = SHA256 -Msg = "sample" -Q = 0460FED4BA255A9D31C961EB74C6356D68C049B8923B61FA6CE669622E60F29FB67903FE1008B8BC99A41AE9E95628BC64F2F1B20C2D7E9F5177A3C294D4462299 -Sig = 3046022100EFD48B2AACB6A8FD1140DD9CD45E81D69D2C877B56AAF991C34D0EA84EAF3716022100F7CB1C942D657C41D436C7A1B6E29F65F3E900DBB9AFF4064DC4AB2F843ACDA8 -Result = P (0 ) - -Curve = P-256 -Digest = SHA384 -Msg = "sample" -Q = 0460fed4ba255a9d31c961eb74c6356d68c049b8923b61fa6ce669622e60f29fb67903fe1008b8bc99a41ae9e95628bc64f2f1b20c2d7e9f5177a3c294d4462299 -Sig = 304402200eafea039b20e9b42309fb1d89e213057cbf973dc0cfc8f129edddc800ef771902204861f0491e6998b9455193e34e7b0d284ddd7149a74b95b9261f13abde940954 -Result = P (0 ) - -Curve = P-256 -Digest = SHA256 -Msg = "test" -Q = 0460FED4BA255A9D31C961EB74C6356D68C049B8923B61FA6CE669622E60F29FB67903FE1008B8BC99A41AE9E95628BC64F2F1B20C2D7E9F5177A3C294D4462299 -Sig = 3045022100F1ABB023518351CD71D881567B1EA663ED3EFCF6C5132B354F28D3B0B7D383670220019F4113742A2B14BD25926B49C649155F267E60D3814B4C0CC84250E46F0083 -Result = P (0 ) - -Curve = P-256 -Digest = SHA384 -Msg = "test" -Q = 0460FED4BA255A9D31C961EB74C6356D68C049B8923B61FA6CE669622E60F29FB67903FE1008B8BC99A41AE9E95628BC64F2F1B20C2D7E9F5177A3C294D4462299 -Sig = 304602210083910E8B48BB0C74244EBDF7F07A1C5413D61472BD941EF3920E623FBCCEBEB60221008DDBEC54CF8CD5874883841D712142A56A8D0F218F5003CB0296B6B509619F2C -Result = P (0 ) - -Curve = P-384 -Digest = SHA256 -Msg = "sample" -Q = 04EC3A4E415B4E19A4568618029F427FA5DA9A8BC4AE92E02E06AAE5286B300C64DEF8F0EA9055866064A254515480BC138015D9B72D7D57244EA8EF9AC0C621896708A59367F9DFB9F54CA84B3F1C9DB1288B231C3AE0D4FE7344FD2533264720 -Sig = 3065023021B13D1E013C7FA1392D03C5F99AF8B30C570C6F98D4EA8E354B63A21D3DAA33BDE1E888E63355D92FA2B3C36D8FB2CD023100F3AA443FB107745BF4BD77CB3891674632068A10CA67E3D45DB2266FA7D1FEEBEFDC63ECCD1AC42EC0CB8668A4FA0AB0 -Result = P (0 ) - -Curve = P-384 -Digest = SHA384 -Msg = "sample" -Q = 04EC3A4E415B4E19A4568618029F427FA5DA9A8BC4AE92E02E06AAE5286B300C64DEF8F0EA9055866064A254515480BC138015D9B72D7D57244EA8EF9AC0C621896708A59367F9DFB9F54CA84B3F1C9DB1288B231C3AE0D4FE7344FD2533264720 -Sig = 306602310094EDBB92A5ECB8AAD4736E56C691916B3F88140666CE9FA73D64C4EA95AD133C81A648152E44ACF96E36DD1E80FABE4602310099EF4AEB15F178CEA1FE40DB2603138F130E740A19624526203B6351D0A3A94FA329C145786E679E7B82C71A38628AC8 -Result = P (0 ) - -Curve = P-384 -Digest = SHA256 -Msg = "test" -Q = 04EC3A4E415B4E19A4568618029F427FA5DA9A8BC4AE92E02E06AAE5286B300C64DEF8F0EA9055866064A254515480BC138015D9B72D7D57244EA8EF9AC0C621896708A59367F9DFB9F54CA84B3F1C9DB1288B231C3AE0D4FE7344FD2533264720 -Sig = 306402306D6DEFAC9AB64DABAFE36C6BF510352A4CC27001263638E5B16D9BB51D451559F918EEDAF2293BE5B475CC8F0188636B02302D46F3BECBCC523D5F1A1256BF0C9B024D879BA9E838144C8BA6BAEB4B53B47D51AB373F9845C0514EEFB14024787265 -Result = P (0 ) - -Curve = P-384 -Digest = SHA384 -Msg = "test" -Q = 04EC3A4E415B4E19A4568618029F427FA5DA9A8BC4AE92E02E06AAE5286B300C64DEF8F0EA9055866064A254515480BC138015D9B72D7D57244EA8EF9AC0C621896708A59367F9DFB9F54CA84B3F1C9DB1288B231C3AE0D4FE7344FD2533264720 -Sig = 30660231008203B63D3C853E8D77227FB377BCF7B7B772E97892A80F36AB775D509D7A5FEB0542A7F0812998DA8F1DD3CA3CF023DB023100DDD0760448D42D8A43AF45AF836FCE4DE8BE06B485E9B61B827C2F13173923E06A739F040649A667BF3B828246BAA5A5 -Result = P (0 ) - - -# NIST FIPS 186-4 Test Vectors from the file SigVer.rsp from -# http://csrc.nist.gov/groups/STM/cavp/documents/dss/186-3ecdsatestvectors.zip -# assessible via -# http://csrc.nist.gov/groups/STM/cavp/digital-signatures.html#test-vectors -# -# XXX: Unfortunately, it's not clear what edge cases these test vectors are -# testing. For example, when the problem is caused by Q being tampered with, -# it isn't clear if the new Q is on the curve or off the curve or what. Also, -# the signature is a variable-length value (being an ASN.1 SEQUENCE of a pair -# of ASN.1 INTEGERs), but all the signatures are the same length for each -# curve. -# -# The [Curve, Digest] section headings were replaced with Curve and Digest -# properties on each test case. -# -# Q = (Qx, Qy) in uncompressed form. -# Sig = (R, S) encoded in ASN.1. - -Curve = P-256 -Digest = SHA256 -Msg = e4796db5f785f207aa30d311693b3702821dff1168fd2e04c0836825aefd850d9aa60326d88cde1a23c7745351392ca2288d632c264f197d05cd424a30336c19fd09bb229654f0222fcb881a4b35c290a093ac159ce13409111ff0358411133c24f5b8e2090d6db6558afc36f06ca1f6ef779785adba68db27a409859fc4c4a0 -Q = 0487f8f2b218f49845f6f10eec3877136269f5c1a54736dbdf69f89940cad41555e15f369036f49842fac7a86c8a2b0557609776814448b8f5e84aa9f4395205e9 -Sig = 3046022100d19ff48b324915576416097d2544f7cbdf8768b1454ad20e0baac50e211f23b0022100a3e81e59311cdfff2d4784949f7a2cb50ba6c3a91fa54710568e61aca3e847c6 -Result = F (3 - S changed) - -Curve = P-256 -Digest = SHA256 -Msg = 069a6e6b93dfee6df6ef6997cd80dd2182c36653cef10c655d524585655462d683877f95ecc6d6c81623d8fac4e900ed0019964094e7de91f1481989ae1873004565789cbf5dc56c62aedc63f62f3b894c9c6f7788c8ecaadc9bd0e81ad91b2b3569ea12260e93924fdddd3972af5273198f5efda0746219475017557616170e -Q = 045cf02a00d205bdfee2016f7421807fc38ae69e6b7ccd064ee689fc1a94a9f7d2ec530ce3cc5c9d1af463f264d685afe2b4db4b5828d7e61b748930f3ce622a85 -Sig = 3046022100dc23d130c6117fb5751201455e99f36f59aba1a6a21cf2d0e7481a97451d6693022100d6ce7708c18dbf35d4f8aa7240922dc6823f2e7058cbc1484fcad1599db5018c -Result = F (2 - R changed) - -Curve = P-256 -Digest = SHA256 -Msg = df04a346cf4d0e331a6db78cca2d456d31b0a000aa51441defdb97bbeb20b94d8d746429a393ba88840d661615e07def615a342abedfa4ce912e562af714959896858af817317a840dcff85a057bb91a3c2bf90105500362754a6dd321cdd86128cfc5f04667b57aa78c112411e42da304f1012d48cd6a7052d7de44ebcc01de -Q = 042ddfd145767883ffbb0ac003ab4a44346d08fa2570b3120dcce94562422244cb5f70c7d11ac2b7a435ccfbbae02c3df1ea6b532cc0e9db74f93fffca7c6f9a64 -Sig = 30460221009913111cff6f20c5bf453a99cd2c2019a4e749a49724a08774d14e4c113edda80221009467cd4cd21ecb56b0cab0a9a453b43386845459127a952421f5c6382866c5cc -Result = F (4 - Q changed) - -Curve = P-256 -Digest = SHA256 -Msg = e1130af6a38ccb412a9c8d13e15dbfc9e69a16385af3c3f1e5da954fd5e7c45fd75e2b8c36699228e92840c0562fbf3772f07e17f1add56588dd45f7450e1217ad239922dd9c32695dc71ff2424ca0dec1321aa47064a044b7fe3c2b97d03ce470a592304c5ef21eed9f93da56bb232d1eeb0035f9bf0dfafdcc4606272b20a3 -Q = 04e424dc61d4bb3cb7ef4344a7f8957a0c5134e16f7a67c074f82e6e12f49abf3c970eed7aa2bc48651545949de1dddaf0127e5965ac85d1243d6f60e7dfaee927 -Sig = 3045022100bf96b99aa49c705c910be33142017c642ff540c76349b9dab72f981fd9347f4f022017c55095819089c2e03b9cd415abdf12444e323075d98f31920b9e0f57ec871c -Result = P (0 ) - -Curve = P-256 -Digest = SHA256 -Msg = 73c5f6a67456ae48209b5f85d1e7de7758bf235300c6ae2bdceb1dcb27a7730fb68c950b7fcada0ecc4661d3578230f225a875e69aaa17f1e71c6be5c831f22663bac63d0c7a9635edb0043ff8c6f26470f02a7bc56556f1437f06dfa27b487a6c4290d8bad38d4879b334e341ba092dde4e4ae694a9c09302e2dbf443581c08 -Q = 04e0fc6a6f50e1c57475673ee54e3a57f9a49f3328e743bf52f335e3eeaa3d28647f59d689c91e463607d9194d99faf316e25432870816dde63f5d4b373f12f22a -Sig = 304502201d75830cd36f4c9aa181b2c4221e87f176b7f05b7c87824e82e396c88315c407022100cb2acb01dac96efc53a32d4a0d85d0c2e48955214783ecf50a4f0414a319c05a -Result = P (0 ) - -Curve = P-256 -Digest = SHA256 -Msg = 666036d9b4a2426ed6585a4e0fd931a8761451d29ab04bd7dc6d0c5b9e38e6c2b263ff6cb837bd04399de3d757c6c7005f6d7a987063cf6d7e8cb38a4bf0d74a282572bd01d0f41e3fd066e3021575f0fa04f27b700d5b7ddddf50965993c3f9c7118ed78888da7cb221849b3260592b8e632d7c51e935a0ceae15207bedd548 -Q = 04a849bef575cac3c6920fbce675c3b787136209f855de19ffe2e8d29b31a5ad86bf5fe4f7858f9b805bd8dcc05ad5e7fb889de2f822f3d8b41694e6c55c16b471 -Sig = 3045022025acc3aa9d9e84c7abf08f73fa4195acc506491d6fc37cb9074528a7db87b9d60221009b21d5b5259ed3f2ef07dfec6cc90d3a37855d1ce122a85ba6a333f307d31537 -Result = F (2 - R changed) - -Curve = P-256 -Digest = SHA256 -Msg = 7e80436bce57339ce8da1b5660149a20240b146d108deef3ec5da4ae256f8f894edcbbc57b34ce37089c0daa17f0c46cd82b5a1599314fd79d2fd2f446bd5a25b8e32fcf05b76d644573a6df4ad1dfea707b479d97237a346f1ec632ea5660efb57e8717a8628d7f82af50a4e84b11f21bdff6839196a880ae20b2a0918d58cd -Q = 043dfb6f40f2471b29b77fdccba72d37c21bba019efa40c1c8f91ec405d7dcc5dff22f953f1e395a52ead7f3ae3fc47451b438117b1e04d613bc8555b7d6e6d1bb -Sig = 30450220548886278e5ec26bed811dbb72db1e154b6f17be70deb1b210107decb1ec2a5a022100e93bfebd2f14f3d827ca32b464be6e69187f5edbd52def4f96599c37d58eee75 -Result = F (4 - Q changed) - -Curve = P-256 -Digest = SHA256 -Msg = 1669bfb657fdc62c3ddd63269787fc1c969f1850fb04c933dda063ef74a56ce13e3a649700820f0061efabf849a85d474326c8a541d99830eea8131eaea584f22d88c353965dabcdc4bf6b55949fd529507dfb803ab6b480cd73ca0ba00ca19c438849e2cea262a1c57d8f81cd257fb58e19dec7904da97d8386e87b84948169 -Q = 0469b7667056e1e11d6caf6e45643f8b21e7a4bebda463c7fdbc13bc98efbd0214d3f9b12eb46c7c6fda0da3fc85bc1fd831557f9abc902a3be3cb3e8be7d1aa2f -Sig = 30440220288f7a1cd391842cce21f00e6f15471c04dc182fe4b14d92dc189108797997900220247b3c4e89a3bcadfea73c7bfd361def43715fa382b8c3edf4ae15d6e55e9979 -Result = F (1 - Message changed) - -Curve = P-256 -Digest = SHA256 -Msg = 3fe60dd9ad6caccf5a6f583b3ae65953563446c4510b70da115ffaa0ba04c076115c7043ab8733403cd69c7d14c212c655c07b43a7c71b9a4cffe22c2684788ec6870dc2013f269172c822256f9e7cc674791bf2d8486c0f5684283e1649576efc982ede17c7b74b214754d70402fb4bb45ad086cf2cf76b3d63f7fce39ac970 -Q = 04bf02cbcf6d8cc26e91766d8af0b164fc5968535e84c158eb3bc4e2d79c3cc682069ba6cb06b49d60812066afa16ecf7b51352f2c03bd93ec220822b1f3dfba03 -Sig = 3045022100f5acb06c59c2b4927fb852faa07faf4b1852bbb5d06840935e849c4d293d1bad0220049dab79c89cc02f1484c437f523e080a75f134917fda752f2d5ca397addfe5d -Result = F (3 - S changed) - -Curve = P-256 -Digest = SHA256 -Msg = 983a71b9994d95e876d84d28946a041f8f0a3f544cfcc055496580f1dfd4e312a2ad418fe69dbc61db230cc0c0ed97e360abab7d6ff4b81ee970a7e97466acfd9644f828ffec538abc383d0e92326d1c88c55e1f46a668a039beaa1be631a89129938c00a81a3ae46d4aecbf9707f764dbaccea3ef7665e4c4307fa0b0a3075c -Q = 04224a4d65b958f6d6afb2904863efd2a734b31798884801fcab5a590f4d6da9de178d51fddada62806f097aa615d33b8f2404e6b1479f5fd4859d595734d6d2b9 -Sig = 304502210087b93ee2fecfda54deb8dff8e426f3c72c8864991f8ec2b3205bb3b416de93d202204044a24df85be0cc76f21a4430b75b8e77b932a87f51e4eccbc45c263ebf8f66 -Result = F (2 - R changed) - -Curve = P-256 -Digest = SHA256 -Msg = 4a8c071ac4fd0d52faa407b0fe5dab759f7394a5832127f2a3498f34aac287339e043b4ffa79528faf199dc917f7b066ad65505dab0e11e6948515052ce20cfdb892ffb8aa9bf3f1aa5be30a5bbe85823bddf70b39fd7ebd4a93a2f75472c1d4f606247a9821f1a8c45a6cb80545de2e0c6c0174e2392088c754e9c8443eb5af -Q = 0443691c7795a57ead8c5c68536fe934538d46f12889680a9cb6d055a066228369f8790110b3c3b281aa1eae037d4f1234aff587d903d93ba3af225c27ddc9ccac -Sig = 30460221008acd62e8c262fa50dd9840480969f4ef70f218ebf8ef9584f199031132c6b1ce022100cfca7ed3d4347fb2a29e526b43c348ae1ce6c60d44f3191b6d8ea3a2d9c92154 -Result = F (3 - S changed) - -Curve = P-256 -Digest = SHA256 -Msg = 0a3a12c3084c865daf1d302c78215d39bfe0b8bf28272b3c0b74beb4b7409db0718239de700785581514321c6440a4bbaea4c76fa47401e151e68cb6c29017f0bce4631290af5ea5e2bf3ed742ae110b04ade83a5dbd7358f29a85938e23d87ac8233072b79c94670ff0959f9c7f4517862ff829452096c78f5f2e9a7e4e9216 -Q = 049157dbfcf8cf385f5bb1568ad5c6e2a8652ba6dfc63bc1753edf5268cb7eb596972570f4313d47fc96f7c02d5594d77d46f91e949808825b3d31f029e8296405 -Sig = 3046022100dfaea6f297fa320b707866125c2a7d5d515b51a503bee817de9faa343cc48eeb0221008f780ad713f9c3e5a4f7fa4c519833dfefc6a7432389b1e4af463961f09764f2 -Result = F (1 - Message changed) - -Curve = P-256 -Digest = SHA256 -Msg = 785d07a3c54f63dca11f5d1a5f496ee2c2f9288e55007e666c78b007d95cc28581dce51f490b30fa73dc9e2d45d075d7e3a95fb8a9e1465ad191904124160b7c60fa720ef4ef1c5d2998f40570ae2a870ef3e894c2bc617d8a1dc85c3c55774928c38789b4e661349d3f84d2441a3b856a76949b9f1f80bc161648a1cad5588e -Q = 04072b10c081a4c1713a294f248aef850e297991aca47fa96a7470abe3b8acfdda9581145cca04a0fb94cedce752c8f0370861916d2a94e7c647c5373ce6a4c8f5 -Sig = 3045022009f5483eccec80f9d104815a1be9cc1a8e5b12b6eb482a65c6907b7480cf4f19022100a4f90e560c5e4eb8696cb276e5165b6a9d486345dedfb094a76e8442d026378d -Result = F (4 - Q changed) - -Curve = P-256 -Digest = SHA256 -Msg = 76f987ec5448dd72219bd30bf6b66b0775c80b394851a43ff1f537f140a6e7229ef8cd72ad58b1d2d20298539d6347dd5598812bc65323aceaf05228f738b5ad3e8d9fe4100fd767c2f098c77cb99c2992843ba3eed91d32444f3b6db6cd212dd4e5609548f4bb62812a920f6e2bf1581be1ebeebdd06ec4e971862cc42055ca -Q = 0409308ea5bfad6e5adf408634b3d5ce9240d35442f7fe116452aaec0d25be8c24f40c93e023ef494b1c3079b2d10ef67f3170740495ce2cc57f8ee4b0618b8ee5 -Sig = 304502205cc8aa7c35743ec0c23dde88dabd5e4fcd0192d2116f6926fef788cddb754e730221009c9c045ebaa1b828c32f82ace0d18daebf5e156eb7cbfdc1eff4399a8a900ae7 -Result = F (1 - Message changed) - -Curve = P-256 -Digest = SHA256 -Msg = 60cd64b2cd2be6c33859b94875120361a24085f3765cb8b2bf11e026fa9d8855dbe435acf7882e84f3c7857f96e2baab4d9afe4588e4a82e17a78827bfdb5ddbd1c211fbc2e6d884cddd7cb9d90d5bf4a7311b83f352508033812c776a0e00c003c7e0d628e50736c7512df0acfa9f2320bd102229f46495ae6d0857cc452a84 -Q = 042d98ea01f754d34bbc3003df5050200abf445ec728556d7ed7d5c54c55552b6d9b52672742d637a32add056dfd6d8792f2a33c2e69dafabea09b960bc61e230a -Sig = 3044022006108e525f845d0155bf60193222b3219c98e3d49424c2fb2a0987f825c17959022062b5cdd591e5b507e560167ba8f6f7cda74673eb315680cb89ccbc4eec477dce -Result = P (0 ) - -Curve = P-256 -Digest = SHA384 -Msg = fe9838f007bdc6afcd626974fcc6833f06b6fd970427b962d75c2aeadbef386bec8d018106197fe2547d2af02e7a7949965d5fbc4c5db909a95b9858426a33c080b0b25dae8b56c5cbc6c4eec3dbd81635c79457eaef4fab39e662a1d05b2481eda8c1074ae2d1704c8a3f769686a1f965ef3c87602efc288c7f9ff8cd5e22a4 -Q = 0440ded13dbbe72c629c38f07f7f95cf75a50e2a524897604c84fafde5e4cafb9fa17202e92d7d6a37c438779349fd79567d75a40ef22b7d09ca21ccf4aec9a66c -Sig = 3045022100be34730c31730b4e412e6c52c23edbd36583ace2102b39afa11d24b6848cb77f022003655202d5fd8c9e3ae971b6f080640c406112fd95e7015874e9b6ee77752b10 -Result = F (3 - S changed) - -Curve = P-256 -Digest = SHA384 -Msg = b69043b9b331da392b5dd689142dfc72324265da08f14abcedf03ad8263e6bdccbc75098a2700bbba1979de84c8f12891aa0d000f8a1abad7dde4981533f21da59cc80d9cf94517f3b61d1a7d9eecb2fcf052e1fc9e7188c031b86305e4a436a37948071f046e306befb8511dc03a53dc8769a90a86e9b4fdbf05dcdfa35ab73 -Q = 041f80e19ffeb51dd74f1c397ac3dfd3415ab16ebd0847ed119e6c3b15a1a884b89b395787371dbfb55d1347d7bed1c261d2908121fb78de1d1bf2d00666a62aed -Sig = 30450220249ca2c3eb6e04ac57334c2f75dc5e658bbb485bf187100774f5099dd13ef70702210097363a05202b602d13166346694e38135bbce025be94950e9233f4c8013bf5bf -Result = F (4 - Q changed) - -Curve = P-256 -Digest = SHA384 -Msg = d2fcaaede8b879c064b0aa46e68efc278a469b80a7f7e1939ec2ebc96c76206f23395967279c181fea157ebb79dfadc68e31345f07f13305c80de0d85e4330d3a45f957c5c2526b945838ce5a9c2844b6b2a665c0f70b748b1213a8cf20ba5dbdf8cab231f433da522104a5cd027d3e36bb373c4ed404d9af0cbec6f85ec2193 -Q = 04ce4dcfa7384c83443ace0fb82c4ac1adfa100a9b2c7bf09f093f8b6d084e50c2d98ae7b91abee648d0bfde192703741ac21daad7262af418b50e406d825eb0d6 -Sig = 30440220597e1e04d93a6b444ccc447a48651f17657ff43fb65fe94461d2bf816b01af400220359fe3817963548e676d6da34c2d0866aa42499237b682002889eaf8893814d2 -Result = P (0 ) - -Curve = P-256 -Digest = SHA384 -Msg = 06cd86481865181cef7acdc3202824970ec2d97662b519c4b588dc9e51617c068282b1a11a15bf7efc4858a2f37a3d74b05fb5790eb68338c8009b4da9b4270514d387a2e016a99ee109841e884a7909504ef31a5454e214663f830f23a5a76f91402fca5f5d61699fa874597bdbfb1ecff8f07ddbd07ef61e97d0d5262ef314 -Q = 041b677f535ac69d1acd4592c0d12fac13c9131e5a6f8ab4f9d0afdcb3a3f327e05dca2c73ec89e58ef8267cba2bb5eb0f551f412f9dc087c1a6944f0ce475277a -Sig = 3045022100df0b0cd76d2555d4c38b3d70bfdf964884d0beeb9f74385f0893e87d20c9642d0220128299aabf1f5496112be1fe04365f5f8215b08a040abdfeca4626f4d15c005b -Result = F (2 - R changed) - -Curve = P-256 -Digest = SHA384 -Msg = 59ad297397f3503604a4a2d098a4f00a368ad95c6101b3d38f9d49d908776c5a6c8654b006adb7939ffb6c30afa325b54185d82c3cc0d836850dce54d3408b257c3a961d11fafe2b74ba8bddfc1102fa656d1028baf94c38340c26a11e992aab71ce3732271b767358671b25225926f3a4b9ec5f82c059f0c7d1446d5d9e4251 -Q = 047ffc2853f3e17887dda13b0eb43f183ce50a5ac0f8bba75fb1921172484f9b944cc523d14192f80bd5b27d30b3b41e064da87bfbae15572dd382b9a176c123a2 -Sig = 304402203156176d52eb26f9391229de4251993a41b8172f78970bb70e32a245be4bb653022062827a29e12d2f29b00fb2d02dd5f2d5412e17a4455f4431a5c996881fdfc0ee -Result = F (1 - Message changed) - -Curve = P-256 -Digest = SHA384 -Msg = 8215daca87e689a20392646a6511bb7b5a82d2d995ca9de89bd9d9c0b11464b7cb1e4e9a31e3e01ad8c2cd613d5a2cb44a2a8df6899fce4c282dea1e41af0df6c36be1f320036567f8d0d32aaa79c95fe53b16668f7e1a9e5d7d039ea260fd03711b7d1c177355fc52244d49ca5b238556a5541349014683cb7da326f443b752 -Q = 045569f76dc94243cde819fb6fc85144ec67e2b5d49539f62e24d406d1b68f00581208c38dbe25870deab53c486f793a1e250c9d1b8e7c147ea68b71196c440730 -Sig = 30450220706f2ba4025e7c06b66d6369a3f93b2fec46c51eceff42a158f7431919506cfb022100b4e75ac34a96393237fc4337789e37168d79382705b248051c9c72bcbac5f516 -Result = F (2 - R changed) - -Curve = P-256 -Digest = SHA384 -Msg = a996b1fb800f692517a2eb80e837233193dd3e82484d3f49bd19ee0db8f7b440876b07e384c90aa8b9f7b6603ca0b5a4e06c1da0edb974a2fb9b6e7c720ddf3e5c0e314c2d189402903c08c0836776c361a284db887ebcc33e615de9720b01dadade585eef687b3346468bdafb490e56d657a9e7d44d92014069005a36c1cf63 -Q = 04e4b470c65b2c04db060d7105ec6911589863d3c7f7ce48726ba3f369ea3467e844c38d3ae098de05f5915a5868c17fee296a6e150beb1f000df5f3bec8fc4532 -Sig = 3046022100c9c347ee5717e4c759ddaf09e86f4e1db2c8658593177cfda4e6514b5e3ecb87022100baae01e9e44a7b04d69c8eaaed77c9e3a36ce8962f95cc50a0db146b4e49eb40 -Result = F (4 - Q changed) - -Curve = P-256 -Digest = SHA384 -Msg = 1a6e49a377a08e992353d6acc557b687b1b69a41d83d43a75fadb97b8c928cfebadebaaf99ea7fb13148807f56ea17384a7912e578e62b1b009fefb2aafca5ac85539433619b286f10643a56f8dfa47ba4d01c02510deaec18029ea6b9682022b139dcb70814164c4c90ec717ad9d925485398531cdd5992a2524498b337f97d -Q = 0496050c5fa2ddd1b2e5451d89ee74a0b7b54347364ddc0231715a6ef1146fe8dce0888a9e78aeea87f6e1e9002b2651169f36c4ee53013cfc8c9912b7fd504858 -Sig = 304502202353d6cd3c21b8ea7dbc1cd940519812dbe365a3b15cd6aebba9d11cf269867a02210085f560273cd9e82e6801e4cb1c8cd29cdac34a020da211d77453756b604b8fa7 -Result = P (0 ) - -Curve = P-256 -Digest = SHA384 -Msg = 3e14f737c913931bc82764ebc440b12e3ce1ffe0f858c7b8f1cbd30fbbb1644fa59be1d2cca5f64a6d7dc5ed5c4420f39227516ae8eb3019ef86274d0e4d06cde7bf5e5c413243dfc421d9f141762109810e6b6a451eeb4bd8d4be1ff111426d7e44d0a916b4fe3db3594d8dd01ae90feecf8f1e230b574180cd0b8d43a3d33b -Q = 040c07bb79f44012299fbfd5a0f31397aaf7d757f8a38437407c1b09271c6551a084fe7846d5d403dc92c0091fbd39f3c5cbca3f94c10b5cae44e2e96562131b13 -Sig = 3044022049e9425f82d0a8c503009cead24e12adc9d48a08594094ca4f6d13ad1e3c571d02201f1b70aaa30a8ff639aa0935944e9b88326a213ab8fce5194c1a9dec070eb433 -Result = F (1 - Message changed) - -Curve = P-256 -Digest = SHA384 -Msg = 4000106127a72746db77957cbc6bfd84ae3d1d63b8190087637e93689841331e2adc1930d6df4302935f4520bbee513505cdcfca99ebc6f83af7b23b0f2e7f7defba614022ceeae9c6886e8b13f7ea253a307ac301f3536720cbe3de82ba3e98310361b61801a8304ffc91ff774948e33176ddcddf1b76437b3f02c910578d46 -Q = 0471db1de1a1f38f356c91feaff5cfe395d1a5b9d23cf6aa19f38ae0bcc90a486decdd6ffb174a50f1cc792985c2f9608c399c98b8a64a69d2b5b7cdd9241f67e2 -Sig = 3045022100b0443b33a6f249470d2f943675009d21b9ccbead1525ae57815df86bb20470bf0220316dbee27d998e09128539c269e297ac8f34b9ef8249a0619168c3495c5c1198 -Result = F (3 - S changed) - -Curve = P-256 -Digest = SHA384 -Msg = b42e547d0e7ddd5e1069bb2d158a5b4d5d9c4310942a1bfd09490311a6e684bd3c29b0dcef86a9788b4b26fed7863f3d5e5439796b5b5ffe7aa2545d0f518ad020689ca21230f3a59e7f8cca465fe21df511e78d215fa805f5f0f88938e9d198515e6b9c819930755c6c6aea5114cd2904607243051c09dd7a147756cbc204a5 -Q = 048219b225aa15472262c648cac8de9aad4173d17a231ba24352a5a1c4eea70fad0fee2b08ad39fbf0db0016ef2896ca99adc07efc8c415f640f3720498be26037 -Sig = 30450220134fb689101aaad3954de2819d9fbd12072fe2bc36f496bbf0d13fa72114ab96022100e65c232bd915b59e087e7fd5ec90bf636cfa80526345c79a0adfd75003045d6f -Result = F (1 - Message changed) - -Curve = P-256 -Digest = SHA384 -Msg = aa563223a7d5201febdf13cab80a03dce6077c26e751bc98a941196a28848abc495e0324013c9a2094fb15dc65d100c3e8a136a52c1780b395f42588900b641b6d4361432e2173195a2f60189f3fcc85f4e9659cae52576f20d1852d43c2b400deea3144c8e870e1906d677425d8c85037c7a42a9d249b2da4b516e04476bd45 -Q = 04c934195de33b60cf00461fc3c45dad068e9f5f7af5c7fa78591e95aeb04e2617b588dd5f9965fdaa523b475c2812c251bc6973e2df21d9beaace976abf5728cb -Sig = 3044022071f302440eb4ed2a939b69e33e905e6fdc545c743458d38f7e1a1d456e35f389022054eaa0eb9cd7503b19a9658f0a04955d9f0ab20ebc8a0877e33c89ee88ad068f -Result = F (4 - Q changed) - -Curve = P-256 -Digest = SHA384 -Msg = 98e4babf890f52e5a04bd2a7d79bf0ae9a71967847347d87f29fb3997454c73c7979d15b5c4f4205ec3de7835d1885fb7abcf8dcde94baf08b1d691a0c74845317286540e8c9d378fefaa4762c302492f51023c0d7adbb1cc90b7b0335f11203664e71fea621bc2f59d2dbd0ee76d6597ec75510de59b6d25fa6750a71c59435 -Q = 049e1adcd48e2e3f0e4c213501808228e587c40558f52bb54ddbb6102d4048ea9234eff98704790938e7e0bdf87ae39807a6b77dfdc9ecdfe6dd0f241abae1aeb2 -Sig = 3046022100ce4f0d7480522c8dd1b02dd0eb382f22406642f038c1ede9411883d72b3e7ed00221008546e1ee3b77f9927cdaccbc2f1cf19d6b5576b0f738bb1b86a0c66b39ca56fb -Result = F (3 - S changed) - -Curve = P-256 -Digest = SHA384 -Msg = bb6b03ad60d6ddbf0c4d17246206e61c886f916d252bb4608149da49cef9033484080e861f91bb2400baa0cd6c5d90c2f275e2fabc12d83847f7a1c3ff0eb40c8a3dd83d07d194ba3797d27238415a2f358d7292a1991af687bcb977486980f9138b3140321485638ac7bd22ecda00ffe5009b83b90397eff24ecf22c5495d67 -Q = 0493edbecb0b019c2cc03060f54cb4904b920fdb34eb83badd752be9443036ae13b494e9295e080a9080fe7e73249b3a5904aa84e1c028121eecd3e2cf1a55f598 -Sig = 3046022100eec2986d47b71995892b0915d3d5becc4dcb2ab55206d772e0189541b2184ddf0221008a6c1edeb6452627ad27c8319599c54ac44cdd831ea66f13f49d90affe6ad45b -Result = P (0 ) - -Curve = P-256 -Digest = SHA384 -Msg = 33a5d489f671f396c776bc1acf193bc9a74306f4692dd8e05bcdfe28fdefbd5c09b831c204a1dec81d8e3541f324f7b474d692789013bb1eca066f82fbf3f1cf3ba64e9d8963e9ecc180b9251919e2e8a1ab05847a0d76ff67a47c00e170e38e5b319a56f59cc51038f90961ea27a9a7eb292a0a1aa2f4972568669246907a35 -Q = 043205bae876f9bd50b0713959e72457165e826cbbe3895d67320909daa48b0ebcd1592562273e5e0f57bbfb92cedd9af7f133255684ee050af9b6f02019bbcafa -Sig = 304402200124f3f1c61ec458561a4eaa6c155bd29e59703d14556324924683db3a4cf43b0220688a5c5fc0c7ba92210c50cce5b512a468a880e05acc21ca56571d89f45f603a -Result = F (2 - R changed) - - -Curve = P-384 -Digest = SHA256 -Msg = a444216c9072caf87fa57c1f04aff9cb83dc2ede9968bda41c9d918825e526c2397cb7d771a7e120582424bbea8ecd56a69bb468cd61437f5a65f04953f9d4018c599afd9edbd4d26e861f86829b9496f829f2b601df73e931fff96559e091417c0d8b8c8129443f7efb985d286c7167b66d2b4d5903583a928db3ed6a883117 -Q = 0497c3f446803a61a7014f61cb7f8b3f36486c7ea96d90ee1767f5c7e1d896dd5114255abb36c74be218c1f0a4e7ebba3d553ed1fed72c62851e042f0171454f120029adba4ee26855ab881d9470355f1947aa1d2e806a7ff2583660fedbd037a0 -Sig = 306402307b06d6c2b63f1cc3bfdaa897d07dc15a83bdf35d979f70c34578332b3f4920422bb24867c51bde10831324df424e04ec02304bef715161f400dc98d4b63bd13ff4ad4a6c981ead44bfc662fe9bca4b56cd790698e4deddf9a4bd69327f26bfe801e6 -Result = F (4 - Q changed) - -Curve = P-384 -Digest = SHA256 -Msg = 43c5ffcdf6f9e21aba1b065596745e8738f7b39e1db486a6ae52218d66ce8125fdb155ee281e01b27fa20d0e37d6468a2daedc5fd30573e44b256c5af13df27dea56fd81aef689aad7c022cea77ac3c40a1d64b8c0cf7fb5a128d6a1799da7b8d95308613ceb2260e10b37530edd42925fa5abcdad5d0646ba5bc78c330346eb -Q = 0408bd5c6cdc1f8c611df96485090e20e9188df6abb766bff3c1ba341ed209ad5dfd78b628ec60998ddfdd0dd029352fbdd9831d75dec760e9f405d1aa5e23aac506dc019fb64d44bd57f6c570d017e6609f8fdbb2dc7b28ca9e00e37cd32a3b73 -Sig = 30660231008b372c86ed1eec2163d6f7152e53696b4a10958948d863eb622873b471702ac5b2e75ff852149a499e61510905f98e4c023100b2ed728e8b30787a28f2a6d3740872e47348686c7cb426411379411310241d25f08a026b853789b1157f1fc1a7f6ff49 -Result = F (1 - Message changed) - -Curve = P-384 -Digest = SHA256 -Msg = 5edd325885296a829b50b16b17e3c4fc3491f1d53384103f1c09a21a169329e07b3758d55c52e9d578fb9e35e8754bfab9fa5e319d0c7fdb45444eda6a2a0a9aaeaa9b7702cce742047146228f9f687e7684d9b4aaa3be03813c004f0418c1a2fe3aa8ddb3658137d7e954e3683a08e0eaad26c0cc3ae0031b191909a3ebade5 -Q = 0410a784abb3c549444a62c28df1c926b8aabb20c8d9aa4b1f7ca830258857cbe9718dbc9845fa9cbb78587a373baee80da1ad0c10b5ab6780cad49c8cd3eebd27de8f1b382ddd7a604458cef8e76ca632a7e44e1c63141a742426cec598029e2e -Sig = 3065023100d9e52be2a3f7f566899cf6daaa38116d092473066f3a1bf91f3df44d81bca1deb438d9d25ce1632599c1d3576a30f12802300cad30bce4b3d7f40b3eef762a21bb1a3bad77439838b13024b7b2c70316875a99e80723a74a9e7a404715ca06a5d673 -Result = F (3 - S changed) - -Curve = P-384 -Digest = SHA256 -Msg = 4fb73e9e8cbc3e829f99472671ee8719f796dbed096b3cbdf1080ad7f5c410a4541e3526de816fe35ab9e664bb1c1d1e9add2522b9a91eb461b45ae4426e1dfbab7dad03a1392706b9314c03104ea7b40f3632577b0b7c991d2b92460638707572b3387add6ab0f05f6f553fa1fcc50fefe74783cd8b781a35de5ae0e7fc5a58 -Q = 048760182393132d69011edfa127e36f92eeac8272641c27f52f3337ef8af7451e6d14f4e4590c7eb9fafb76e8c92865cfebc2b123ed871ca570ead40ae8f6f32335393c569b21b38f626d09c064a3c8668e9fb10a4667e0f0c68bf25ca98fd6dc -Sig = 306402301db957e5c2d294035d7f476a0cbc28a4aac2614d8212de5017076cd836bf04ffe237dce8fec91f2fb5ef82449ff1c65d02303e3b9058d0a9c5b417f9c6f86557b9d50e7a902694a7012a1be6bb70708497e4d39fc1f6d6bc60dfa52d23cab173385f -Result = F (4 - Q changed) - -Curve = P-384 -Digest = SHA256 -Msg = b66ca1d77adf6b2b20c6ef68e50d353a9f5cd0be422f5f6fff8f74506280a55d7923cf047dfdb9147b916f6df6cad8c52257360f746b77edb9949ed4ae9a63d08a7da07c4cf32836574a34f316292b8cc5a6b057129a6baa1182be8a5be1c43739e7d9b0abe07801c2d4343a235037b9aaff14694c051fde4b545931ff9e9a3b -Q = 042b1f98d2acdda8347b9a68c75174408eae7de3d6b9c08c26e73ce9ed2ac147b8d90cd82e30ab43909d63f6b457de207133f5e6f5f5793201991e014cce0045d04adc352298e32f45f4e374450111c8456b5c2efaec43d157949b5c191b2bc934 -Sig = 3064023023d046402cbce807d232bcf0dc96d53c72992e0ba1ffce0d79050c0f4c5ad9bfbbdc1c96c730d67ff3aa3edaa3845da902302cd46a4fe5d120b3af3a6d9ea63cc78f4079e8b5520a8fa96828334a4f182ff4d5e3d79470019e4eb8afc4f598b6becb -Result = F (4 - Q changed) - -Curve = P-384 -Digest = SHA256 -Msg = 862cf14c65ff85f4fdd8a39302056355c89c6ea1789c056262b077dab33abbfda0070fce188c6330de84dfc512744e9fa0f7b03ce0c14858db1952750d7bbe6bd9c8726c0eae61e6cf2877c655b1f0e0ce825430a9796e7420e5c174eab7a50459e291510bc515141738900d390217c5a522e4bde547e57287d8139dc916504e -Q = 0486ac12dd0a7fe5b81fdae86b12435d316ef9392a3f50b307ab65d9c6079dd0d2d819dc09e22861459c2ed99fbab66faeac8444077aaed6d6ccacbe67a4caacee0b5a094a3575ca12ea4b4774c030fe1c870c9249023f5dc4d9ad6e333668cc38 -Sig = 30650230798065f1d1cbd3a1897794f4a025ed47565df773843f4fa74c85fe4d30e3a394783ec5723b530fc5f57906f946ce15e8023100b57166044c57c7d9582066805b5885abc06e0bfc02433850c2b74973205ca357a2da94a65172086f5a1580baa697400b -Result = P (0 ) - -Curve = P-384 -Digest = SHA256 -Msg = cc0aac1010fad8555f81423ac25203720853dbe6a465c244388df90839113d59ea3d3521a8a9cbef649f8abe8d6ff8b0cf17ffc199dddb2997511c4b50e944d41cbcdf5d2102dc98d6f9355b211f130d4e89983f63e5dfe6e1b4ffb3caabd1ad96563fb5c0e5905dcb738a59ec2e5d47684707191ff32746a0cbc65b02be7841 -Q = 049e7553eab8cc7e2e7396128f42ab260c6dbb5457cbff2070ea7c0db21def1537939e3f02699e5dd460eca3798d08bd6d892c0c8e47dddf858e89099a8fc1026e8b8333532b22f561f7647f63f9c79dbf5e8dd18fbfe6ff34902233119c5d5aa3 -Sig = 306402302452da6a48c3749b66e576e0f1f768d51728be17aea149164c4e1654c5ce27f625a4610c4a2eeddb3a0626d3abc6c37c0230499504fb58c9db24a7ff5f7921e1312f8aa583c08a308e080f5ef1acf5cdae7927c4101573db069ab0b6de7f4f1cab38 -Result = F (1 - Message changed) - -Curve = P-384 -Digest = SHA256 -Msg = b9d8d5d47edaa2dca7d7d687f98264b6e21a8e1eeb20083efedb71c116d13150d95f62a369a79f0f45233d2751a4b36432c7c12e19c8bef37568fa1a347929398b7ee69046e11911e3db472c3bccbd68653d99e461b4e5cfa617f94d59798f333ccf13abf426ca8be0f6587a453632a50c159d96695ad03dbaac716e811a3586 -Q = 040cf4dc51e71185a29c0c6fa3c075d9da5bd7ede085053344dce5dbbe8329e8ac9045f7246c9d0efed393b8e113c71429fdb7917b73974b355cf9f3bef6a0a460c2d39fdf1fe32a7744be0a54ddd1cfa8d03914cff4b5ca536b40707ff2629aa4 -Sig = 306402303812c2dc2881d7ef7f621993b161672329b261ff100bbd19fb5826c9face09aec2017b6843d69336b813b673c540252702305dc102fab9d6325131c556ec00309c2959d1031a63fbc1e2d5d04996d3234ed33875c0ab98e5878e9bc72742519ed398 -Result = F (2 - R changed) - -Curve = P-384 -Digest = SHA256 -Msg = 6d9cf30d59cc9d6e560e9c52f8be325d19eb3cea592e43bd9584411d76064729c03ad54feb4dce435fb662ff069ca3e19bd16c312567f05018feb8f913caf7553ac728ac787ea3ca073a328633441d7c5cc4d30ec194f248c0701119f7dd80c99e44f469f37cc6726601c97e7d94dc8e549261b46d219a7ea36bee650ccd15cf -Q = 046c590434988155236b43147389c6dbfdd27dcd3387e9b4c2587ece670753a542a13a736579887791cf53d31e5ce9999435a20194ff3f1b55f7ffb2758ddd4b98dd0d9e0cc213e10ed25e8e0430fe861066c1d4423c67f0c93f7ebd87fd3c561e -Sig = 306602310089ff866889245e797926509e563b1746920b78c9370a6cdae52663730d131e558e327d1f5fef8faf9e6c802fa29504ed0231008dd68e2de2f788e598b3e5a60c18d81849a0cc14b3b0e3c931910639f3125e5d6045f00330b1fa989252a80f95419b04 -Result = F (2 - R changed) - -Curve = P-384 -Digest = SHA256 -Msg = 2de0c0671213bd4326ffa5a1070ca605733961b11e9f939f805d2d6974d5286e1b1c00adac360f32bd58432629f8c932e241ffaae742c9336f4c95782d4b73255cac0644c8c2d7099c2ba1fd0cf4243344dd8dc0f77004730f5078479955c385959e06303ef2fda8df81e7237251e3e84a03515505e448aa1330a9a1cd4822a5 -Q = 04499cbdf18ec4e69b88051543c7da80845fa2de8be2b9d9045fee7f104a8b5b7d04e69142de9955c5ab18c5a34ebff075a29cb8d28836b201a389922b6f8f93870f09c80a00242d00d32656a43ac1440fc55bcb123551a73290f603c3469be9ed -Sig = 3065023025d4d243da6fd9b439a9242c3656fade7acb7a306e8cf23ea89e3ff4f9330be19c61aaa42d7b426d12c8e0f96b80dae5023100e7a99cf4b269bb4a6210d185e9654602523b5cfa1cddc94b1db92018aa557ecb6adda44c816975f5ec1756b6df3c44fd -Result = F (3 - S changed) - -Curve = P-384 -Digest = SHA256 -Msg = 69de70edec5001b0f69ee0b0f1dab6fb22a930dee9a12373fe671f9a5c6804ee1cd027872867c9a4e0bdfed523eb14600cfed64fca415188d56eb651d31731cd3e0efec7251c7defde922cf435ba41454a58d2abf5f29ce5b418a836cab1671d8cdc60aa239a17a42072137cfdc0628715c06b19a2ea2e55005701c220c0924f -Q = 049a74ea00203c571bd91ae873ce0ed517f8f0a929c1854d68abd3b83a5051c0b686bb37d12958a54940cfa2de23902da76f20ccf8fa360a9ec03d7bb79ff17ad885f714757ef62995f824908561dc0c3dffc49d873627936a2fff018b82879ced -Sig = 3065023100acc1fcac98c593fb0a0765fce35a601c2e9570d63ea1e612fff8bc99ac2d4d877750bb44cfb1014e52e00b9235e350af02307f53de3afa4146b1447e829ebac8f5645e948cc99e871c07280cc631613cfdaf52ccaeccbe93588a3fd12170a7ec79fa -Result = P (0 ) - -Curve = P-384 -Digest = SHA256 -Msg = 383ab0251157e645e678100ad3431b9ad96c6279e237ada71d85db0ce3a96fcd4805b2e7676e9a395f1d2f14f24535b77160b22d3d1c7d2e02ec4bbd82058f397db468f4d9ff0ab8306f9becd234f7a7b9c5a4ed44b7474913fe984b5b9e995fae9a951e6e8f2975df67a0180cea81fd4c97eea60a25c15e2ba21092ab0eebd5 -Q = 04e22f221809fb7a054ac799a70b3d24744eb7c5096c8671770399527c88ccf9ddaea0257a0ae9430d927ff5d9f109c533af4101d60df9b306ae92da7592f4faf3df422a3e33f1c2ed2973b2b900eefc346b4cf024de650abf537cecd12ac77618 -Sig = 3065023100c39a8e79f0560b9f26504469a470c7b2230c0d25de07c206e87dfbde9aff0a5d85322f56dfb50d4c1fc67c67d615dad702302ad94dd13a39cf4f4cb24c2c81d4c1181652363addd856dc9ba7455458e40ed047cd113129bc87f43949d5a98a0d5205 -Result = F (3 - S changed) - -Curve = P-384 -Digest = SHA256 -Msg = b23e83d372422cad7bf633ff84468b5ca0f1902eea801bb2e6e89b45d2f75ef9e08c47e010decdd2cfbd9280b01511164e00bd8323fd06a019e83d3dd23c8aa0313ad5196925b5b7d5c25ff8fd198ac2a234dbe0a13fbd04c4002ea89856e91e789e07e25d56690e0481cdb776a3035a64f4bd571097ef07bd49994f95d8323f -Q = 04fa8ebc3682d90ac7356f0b75b9e3376e76518676e0bedd176cfa7fa57fea4b3a399dbb2bf735ec90b9c1705cf9fa6f5718c3fbca0150ec10696b3851f31fb3ba62c0b6be509d249e0d4b374c7a08e49338e0922e2a8a9319999e6569ab8d292e -Sig = 3065023100fb58ab09b8a7ef7a6ec05b854eae11af9b713f7c7540e25115f609846e636ad4f88dcf4dd61e311273df23ccda474f030230485be4c21b7c3a9c6b39ffc9f0c39f4050f76d2a6b3fae203d016318c541c1b4ad6cfc0d0950636ff6883895dd49e4e9 -Result = P (0 ) - -Curve = P-384 -Digest = SHA256 -Msg = eeef70ae23d95330a71bdde1feb196d599481e057bdbd5ef519ce445a9b5acb46ede325a9caad720e4fc49c198ff5f0910c56a06d0cf76f450da1ad35fecccdb4442f64daa6149ee6b67ab1307ffb5c4b6ca3e72a644d36d9e71c4dd3283d12041e73e6d20ec19b3b20654593a4cca4b2fd9aa12f17d5b00b7ed43df74548010 -Q = 04e5f331536a2940cd67234bedf813c12e15aefa9a1a68429f8754bf2769a47c9c2efb5c42135e7b01a110d7302e097eac63b2398612c863febd482184e834d3acb51408c49aacbbd35d8719746f37cb13e013c9505ce034cd815aacd10d2f7a0d -Sig = 306502310096c35f22d036785a392dc6abf9b3cfb0ad37b5c59caefcc0b5212e94e86739a2674020ff79258094d90d7d59f09d47a10230373cbc865384734c56952f7a35a1fdecd88e8b343ee3aa073d30f5f25b73506f1e5f5857f668b0080dec6edeb5e1be96 -Result = F (1 - Message changed) - -Curve = P-384 -Digest = SHA256 -Msg = 7875194a0c3261cf414652cd9970219e3bf8185ad978affebd92ffd40c209a0d17dda0d5b79fefaeba3400088720598cc757aea1fb31ce976fb936726fd4b48d396a35cf4b78d16ddda56067ddc64728dc80b874c5286128b7b5da88808c7df5c3323791720e7ead8b50144dedc15590530b89cd022fd7291c97a4b9889d0568 -Q = 04c53ad865beb1e2b92764065f1a6bb465ee94aacabe43426a93c277d02e00fe36be1c859ba08a031fc518a0d0076689796728d42bae9bc097151748ffa0982964bdd16076fa0e7cc15837c1f773b08d02c3dbc57339091ccc34105b84781150b4 -Sig = 3065023100d4f0dd94fc3b657dbd234767949207624082ff946de9ce0aeb0d9993b8c7d7935760e1bf9d8b233bc7d6cd34928f521802300941df05062aa8849610f4b37d184db77ed1bc19ad2bb42f9a12c123017592bf4086bf424b3caad9a404b260a0f69efb -Result = F (2 - R changed) - -Curve = P-384 -Digest = SHA384 -Msg = 4132833a525aecc8a1a6dea9f4075f44feefce810c4668423b38580417f7bdca5b21061a45eaa3cbe2a7035ed189523af8002d65c2899e65735e4d93a16503c145059f365c32b3acc6270e29a09131299181c98b3c76769a18faf21f6b4a8f271e6bf908e238afe8002e27c63417bda758f846e1e3b8e62d7f05ebd98f1f9154 -Q = 041f94eb6f439a3806f8054dd79124847d138d14d4f52bac93b042f2ee3cdb7dc9e09925c2a5fee70d4ce08c61e3b191601c4fd111f6e33303069421deb31e873126be35eeb436fe2034856a3ed1e897f26c846ee3233cd16240989a7990c19d8c -Sig = 306502303c15c3cedf2a6fbff2f906e661f5932f2542f0ce68e2a8182e5ed3858f33bd3c5666f17ac39e52cb004b80a0d4ba73cd0231009de879083cbb0a97973c94f1963d84f581e4c6541b7d000f9850deb25154b23a37dd72267bdd72665cc7027f88164fab -Result = F (2 - R changed) - -Curve = P-384 -Digest = SHA384 -Msg = 9dd789ea25c04745d57a381f22de01fb0abd3c72dbdefd44e43213c189583eef85ba662044da3de2dd8670e6325154480155bbeebb702c75781ac32e13941860cb576fe37a05b757da5b5b418f6dd7c30b042e40f4395a342ae4dce05634c33625e2bc524345481f7e253d9551266823771b251705b4a85166022a37ac28f1bd -Q = 04cb908b1fd516a57b8ee1e14383579b33cb154fece20c5035e2b3765195d1951d75bd78fb23e00fef37d7d064fd9af144cd99c46b5857401ddcff2cf7cf822121faf1cbad9a011bed8c551f6f59b2c360f79bfbe32adbcaa09583bdfdf7c374bb -Sig = 3064023033f64fb65cd6a8918523f23aea0bbcf56bba1daca7aff817c8791dc92428d605ac629de2e847d43cee55ba9e4a0e83ba02304428bb478a43ac73ecd6de51ddf7c28ff3c2441625a081714337dd44fea8011bae71959a10947b6ea33f77e128d3c6ae -Result = P (0 ) - -Curve = P-384 -Digest = SHA384 -Msg = 9c4479977ed377e75f5cc047edfa689ef232799513a2e70280e9b124b6c8d166e107f5494b406853aec4cff0f2ca00c6f89f0f4a2d4ab0267f44512dfff110d1b1b2e5e78832022c14ac06a493ab789e696f7f0f060877029c27157ce40f81258729caa4d9778bae489d3ab0259f673308ae1ec1b1948ad2845f863b36aedffb -Q = 049b3c48d924194146eca4172b6d7d618423682686f43e1dbc54ed909053d075ca53b68ae12f0f16a1633d5d9cb17011ec695039f837b68e59330ee95d11d5315a8fb5602a7b60c15142dbba6e93b5e4aba8ae4469eac39fa6436323eccc60dcb6 -Sig = 30650230202da4e4e9632bcb6bf0f6dafb7e348528d0b469d77e46b9f939e2fa946a608dd1f166bcbcde96cfad551701da69f6c2023100db595b49983882c48df8a396884cd98893a469c4d590e56c6a59b6150d9a0acdf142cf92151052644702ed857a5b7981 -Result = F (3 - S changed) - -Curve = P-384 -Digest = SHA384 -Msg = 21eb31f2b34e4dde8d6c701e976d3fbbf4de6a3384329118d4ddb49adb2bb44465598abf6df25858b450c7767e282ccaca494088274e37353674eef58f583937d3d184ef727317d3672397a74c8fe327919a3df8fd65af0bc8cebbc40095adf89f1bf2c5e6dc6ba44633fd8433b25f065f5e3eb4840af23cc534415406745a31 -Q = 045140108b93b52d9ad572d6129ed6564766f8df3755e49fa53eba41a5a0d6c1d24a483c90070583a66e3cfa52b6fb1f31ff52498446a40c61e60c97554256472625633eda0c1a8b4061481fecfbe9c4503e99dfc69e86c9e85c8cc53dca6b8dc4 -Sig = 3065023100b2726b2ba9da02de35e9953fc283d1e78700860d4c33dce8db04dd41499d904866c1b8debb377f6c0dfcb0704252174f02300775b027068d7ad55121a278a819f52099ace750d5e996eaec9dee7be72758736cf769650148fbd5c411beb9b88f979e -Result = F (4 - Q changed) - -Curve = P-384 -Digest = SHA384 -Msg = 58ea3b1e82f97708053d0b41441d0aa9619050e86ac6c4f7781164e5da3019c47a839366509fa95812e4f64afdc62b627c7a98f633dd05db45c1d8954fc83bdb5042679378bb7e4c7863aacf2026360ca58314983e6c726cf02bb347706b844ddc66aee4177c309cb700769553480cdd6b1cd77341c9a81c05fbb80819bc623f -Q = 0431f4fc2fac3a163a5796f5e414af6f8107ab5e4a98c755d81efa9d5a83c10128c16c863190112fc29d3d5f3057a2edf1fe208743f3e96c3a34b5fff78c9716c074a1ce3dc01c3f0e471ddfae91cd88e7dda38dd0e5e1f91b00b8539da3cc10bc -Sig = 30640230706911812ec9e7370234efd57b2855975eab81e9c2fe783aa8e442dc6e7d681dab2dc0dfc6765f87ab67001108e3facf023042c89efa22d853d32f619c9fe13e9852889ac98a9fed5d4fa47fed238e1cbe70d7970af9f7bdf84e51176af4885f2490 -Result = F (4 - Q changed) - -Curve = P-384 -Digest = SHA384 -Msg = 188cd53097ef3e64b78b9260bf461708c836f25f2bcc98b534af98b96ee4b324e2203a7e62dbc396966f56419fb5135cb124369aaa025f396eac72f05ab45950d9e02cd5a2357eafab9f816117b7f1de192468895327802ec79f5d6b5a3d44d7afbed7b4a308e365655b8db2bde75e143062ee48b7c51688ac5db0bc7c83ec9c -Q = 041f7911dcfe63a6f270cf75b8584d9b1b4a00afc1fa43543c945945b8a821ebeb37fbc705a000f9cc7c35f7d27027b7bbf11835ec80c4ac06d99247e73bf72522109ac255e6109262de4dfbf9619244f74fb6c9ee57694537d7e79c248db34dc4 -Sig = 306402303587c9c6885adf3be1086825f9a41ccd2edfa0bd95e7fc4dba5a9710f41d539132de7772f14c18e318f8992b66d2a86c023073a844d729599d4e3e3c1b63e9c4bf5a73d1f69e0160857fe63a56c381c051f5c37ea6b4cc4caacb6ff26ef9699efe30 -Result = F (4 - Q changed) - -Curve = P-384 -Digest = SHA384 -Msg = 6462bc8c0181db7d596a35aa25d5d323dd3b2798054c2af6c22e841b1ccf3dc3ee514f86d4a0cef7a6f7f566ae448b24dcc8d11eb7a585d44923ea1a06c774a2b3eb7409ab17a0065d5834ab00309ad44312a7317259219543e80ddb0cc2a4381bf6e53cd1bb357eba82e11c59f82e446c4b79314119182c0de96a1b5bae0b08 -Q = 042039661db813d494a9ecb2c4e0cdd7b54068aae8a5d0597009f67f4f36f32c8ee939abe03716e94970bba69f595fead6e2d5236e7e357744514e66a3fb111073336de929598eb79fb4368c5bf80814e7584a3b94118faac9321df37452a846fc -Sig = 30640230164b8ac2b34c4c499b9d6727e130b5ef37c296bd22c306d1396c6aa54ca661f729aa6353b55d7cf1793b80b5a485115f02304e7187f8f735b7272f2c0985315b5602bb9b1a09f32233aa10570c82d1ccedef6e725800336511e47f88ddbbbdc08f54 -Result = F (1 - Message changed) - -Curve = P-384 -Digest = SHA384 -Msg = 13c63a3cb61f15c659720658a77869145ae8a176c6d93d3a8aa9946236d9fb0463db9e48c667cba731afaa814ba0d58357524f8de28d4c4bbe2691dac9b32632a7dd0f99fd4cb240290878305011f7d3e37ecc410cc1fed601e7901e8be6414ea44317584843a2d2ca2e15103e1ea49365bc384355b3c6fa6ccdd452543e9769 -Q = 0446dcf8ee848c6459fa66d1cae91ccd471401a5782cb2d3b9b9264189f0e9ddf7197b05c694931bde3306240cf9d24b7e79d9508f82c5ead05c3f9392f3b1458f6d6c02f44420b9021d656e59402e2645bf3ba1a6b244ddb12edbb69516d5873b -Sig = 306402305ffba3b5bd7c3a89ec40b47884b0b3464e8abb78608c6d61e1e62c2ca98d44fcdf61825d69dffee8408d0849d0623bac02300d2597b5fc3842ffce1957172253a8c9c0e4dbe770ce54f70f139e0545dc34ec639d609e14175bdb2b812ccfda00c9d4 -Result = F (1 - Message changed) - -Curve = P-384 -Digest = SHA384 -Msg = 6939a9118adc307107aa6b0057c280d10fa44a64700c7bd23e1f33a478ad2cfe596c05f72b540cbdb696aac6ab98d9ca8c62f33e182657130b8317a76275a5996333a5d3547e2293b401d0adf60f91e91d2137e34f3336e017c3c6dba6bf5b13dd0de288f9b20a896a92c48e984fbc09f920fab82f3f915d6524b0c11236aca4 -Q = 04097cea75f685cf4d54324ad2124ce3f77b1e490bbaa1ffacde40dd988f7591e1c5d158e6f232500d958762831914af7f716d8bc056daf69ca2edd21b89a6ae9923cfcae87bfda5f9a6e514dd4b9d28d164fcc613ca2afb9660adfece59f09b66 -Sig = 306502301c5d4561d2a3af8835839b543098c101c715c545eb7d00300c5cb05bb08dac29e732ffdc31c50915e691999ad505104c023100c3442f2fb1498fd47c2f959edff37a19783e3ccee80dc6955ca64db087fd188e67358e7b9223535bbb858d21ba6a978c -Result = F (2 - R changed) - -Curve = P-384 -Digest = SHA384 -Msg = c82071e42c45ac3597f255ba27766afe366e31a553a4d2191360b88a2a349ee077291454bf7b323cb3c9d7fec5533e4e4bf4fb5bc2eb16c6319e9378a3d8a444b2d758123438dbb457b26b14b654b3c88d66838adfa673067c0552d1b8a3ade3a9cb777986c00f65cace53f852c1121acf19516a7cf0ba3820b5f51f31c539a2 -Q = 04d2e2b3d262bb1105d914c32c007ea23d15a98197f0ed90b46a17f3d403e406a76c8f752be1a8cd01a94fd45157f6511ae585fba180017b9983b4c853ad3a5dd52e079c5f0ef792d1a0213b6085e390b073de1a4b01749ceab27806e5604980fe -Sig = 3064023049c001c47bbcee10c81c0cdfdb84c86e5b388510801e9c9dc7f81bf667e43f74b6a6769c4ac0a38863dc4f21c558f28602301fb4ff67340cc44f212404ba60f39a2cb8dcd3f354c81b7219289d32e849d4915e9d2f91969ba71e3dd4414f1e8f18f7 -Result = F (3 - S changed) - -Curve = P-384 -Digest = SHA384 -Msg = 137b215c0150ee95e8494b79173d7ae3c3e71efcc7c75ad92f75659ce1b2d7eb555aad8026277ae3709f46e896963964486946b9fe269df444a6ea289ec2285e7946db57ff18f722a583194a9644e863ae452d1457dc5db72ee20c486475f358dc575c621b5ab865c662e483258c7191b4cc218e1f9afeeb3e1cb978ce9657dc -Q = 04cd887c65c01a1f0880bf58611bf360a8435573bc6704bfb249f1192793f6d3283637cd50f3911e5134b0d6130a1db60ef2b3cbf4fe475fd15a7897561e5c898f10caa6d9d73fef10d4345917b527ce30caeaef138e21ac6d0a49ef2fef14bee6 -Sig = 3065023100addfa475b998f391144156c418561d323bdfd0c4f416a2f71a946712c349bb79ba1334c3de5b86c2567b8657fe4ca1f102301c314b1339f73545ff457323470695e0474c4b6860b35d703784fbf66e9c665de6ca3acb60283df61413e0740906f19e -Result = F (2 - R changed) - -Curve = P-384 -Digest = SHA384 -Msg = 93e7e75cfaf3fa4e71df80f7f8c0ef6672a630d2dbeba1d61349acbaaa476f5f0e34dccbd85b9a815d908203313a22fe3e919504cb222d623ad95662ea4a90099742c048341fe3a7a51110d30ad3a48a777c6347ea8b71749316e0dd1902facb304a76324b71f3882e6e70319e13fc2bb9f3f5dbb9bd2cc7265f52dfc0a3bb91 -Q = 04a370cdbef95d1df5bf68ec487122514a107db87df3f8852068fd4694abcadb9b14302c72491a76a64442fc07bd99f02cd397c25dc1a5781573d039f2520cf329bf65120fdbe964b6b80101160e533d5570e62125b9f3276c49244b8d0f3e44ec -Sig = 3065023100c6c7bb516cc3f37a304328d136b2f44bb89d3dac78f1f5bcd36b412a8b4d879f6cdb75175292c696b58bfa9c91fe639102306b711425e1b14f7224cd4b96717a84d65a60ec9951a30152ea1dd3b6ea66a0088d1fd3e9a1ef069804b7d969148c37a0 -Result = P (0 ) - -Curve = P-384 -Digest = SHA384 -Msg = 15493aa10cfb804b3d80703ca02af7e2cfdc671447d9a171b418ecf6ca48b450414a28e7a058a78ab0946186ad2fe297e1b7e20e40547c74f94887a00f27dde7f78a3c15eb1115d704972b35a27caf8f7cdcce02b96f8a72d77f36a20d3f829e915cd3bb81f9c2997787a73616ed5cb0e864231959e0b623f12a18f779599d65 -Q = 04d1cf635ca04f09b58879d29012f2025479a002bda590020e6a238bccc764478131cac7e6980c67027d92ece947fea5a621f7675c2be60c0a5b7d6df2bcc89b56212a2849ec0210c59316200c59864fd86b9a19e1641d206fd8b29af7768b61d3 -Sig = 306402306101d26e76690634b7294b6b162dcc1a5e6233813ba09edf8567fb57a8f707e024abe0eb3ce948675cd518bb3bfd438302304e2a30f71c8f18b74184837f981a90485cd5943c7a184aba9ac787d179f170114a96ddbb8720860a213cc289ae340f1f -Result = F (1 - Message changed) - -Curve = P-384 -Digest = SHA384 -Msg = bc5582967888a425fb757bd4965900f01e6695d1547ed967c1d4f67b1b1de365d203f407698761699fec5f5a614c21e36a9f57a8aaf852e95538f5615785534568811a9a9ccc349843f6c16dc90a4ac96a8f72c33d9589a860f4981d7b4ee7173d1db5d49c4361368504c9a6cbbaedc2c9bff2b12884379ba90433698ceb881d -Q = 04d15ca4b2d944d5539658a19be8ef85874f0c363b870f1cd1f2dc9cb68b2a43a10d37064697c84543e60982ab62bb32c8062fb7dfc379fc6465302ac5d8d11d3b957b594c9ef445cfe856765dd59e6f10f11809e115ac64969baa23543f2e5661 -Sig = 3065023100e2cf123ce15ca4edad5f087778d483d9536e4a37d2d55599541c06f878e60354aa31df250b2fc4ed252b80219552c9580230696707a7e3f9a4b918e7c994e7332103d8e816bbe6d0d1cf72877318e087ed0e230b0d1269902f369acb432b9e97a389 -Result = P (0 ) - -Curve = P-384 -Digest = SHA384 -Msg = 4f31331e20a3273da8fce6b03f2a86712ed5df41120a81e994d2b2f370e98ef35b847f3047d3cf57e88350e27b9ac3f02073ac1838db25b5ad477aee68930882304fc052f273821056df7500dc9eab037ed3ac3c75396e313bf0f4b89b26675af55f3378cf099d9d9a25a4887c1cfd2448f5b2188c41d6fa26045c5e974bf3e4 -Q = 04c83d30de9c4e18167cb41c990781b34b9fceb52793b4627e696796c5803515dbc4d142977d914bc04c153261cc5b537f42318e5c15d65c3f545189781619267d899250d80acc611fe7ed0943a0f5bfc9d4328ff7ccf675ae0aac069ccb4b4d6e -Sig = 3066023100b567c37f7c84107ef72639e52065486c2e5bf4125b861d37ea3b44fc0b75bcd96dcea3e4dbb9e8f4f45923240b2b9e44023100d06266e0f27cfe4be1c6210734a8fa689a6cd1d63240cb19127961365e35890a5f1b464dcb4305f3e8295c6f842ef344 -Result = F (3 - S changed) diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/tests/ecdsa_verify_fixed_tests.txt temporalio-1.3.0/vendor/ring-0.16.20/tests/ecdsa_verify_fixed_tests.txt --- temporalio-1.3.0/vendor/ring-0.16.20/tests/ecdsa_verify_fixed_tests.txt 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/tests/ecdsa_verify_fixed_tests.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,271 +0,0 @@ -# Test vectors for short (zero-padded) values of s. - -# S is the maximum length. -Curve = P-256 -Digest = SHA256 -Msg = "" -Q = 0430345fd47ea21a11129be651b0884bfac698377611acc9f689458e13b9ed7d4b9d7599a68dcf125e7f31055ccb374cd04f6d6fd2b217438a63f6f667d50ef2f0 -Sig = 341f6779b75e98bb42e01095dd48356cbf9002dc704ac8bd2a8240b88d3796c6555843b1b4e264fe6ffe6e2b705a376c05c09404303ffe5d2711f3e3b3a010a1 -Result = P (0 ) - -# S is one byte shorter than the maximum length. -Curve = P-256 -Digest = SHA256 -Msg = "" -Q = 0430345fd47ea21a11129be651b0884bfac698377611acc9f689458e13b9ed7d4b9d7599a68dcf125e7f31055ccb374cd04f6d6fd2b217438a63f6f667d50ef2f0 -Sig = 31ed574e9688aed7016e985c0e742fb788be73d9ad0a895e6182c77751817ed000d98eb6d480d64d1729c680693cb13bd6bf0c7b651007e459e667683ff65b92 -Result = P (0 ) - -# S is 2 bytes shorter than the maximum length. -Curve = P-256 -Digest = SHA256 -Msg = "" -Q = 0430345fd47ea21a11129be651b0884bfac698377611acc9f689458e13b9ed7d4b9d7599a68dcf125e7f31055ccb374cd04f6d6fd2b217438a63f6f667d50ef2f0 -Sig = f59cf66594cc837415f16494fb52c02f2a6264bf6ce7dccbf2f78c090cdcefb000005a8c8a04ba7825f3f8e56517056daa1a51129cd91382a24589ed05d0c13d -Result = P (0 ) - -# S is the maximum length. -Curve = P-384 -Digest = SHA384 -Msg = "" -Q = 045c5e788a805c77d34128b8401cb59b2373b8b468336c9318252bf39fd31d2507557987a5180a9435f9fb8eb971c426f1c485170dcb18fb688a257f89387a09fc4c5b8bd4b320616b54a0a7b1d1d7c6a0c59f6dff78c78ad4e3d6fca9c9a17b96 -Sig = 85ac708d4b0126bac1f5eeebdf911409070a286fdde5649582611b60046de353761660dd03903f58b44148f25142eef8183475ec1f1392f3d6838abc0c01724709c446888bed7f2ce4642c6839dc18044a2a6ab9ddc960bfac79f6988e62d452 -Result = P (0 ) - -# S is one byte shorter than the maximum length. -Curve = P-384 -Digest = SHA384 -Msg = "" -Q = 045c5e788a805c77d34128b8401cb59b2373b8b468336c9318252bf39fd31d2507557987a5180a9435f9fb8eb971c426f1c485170dcb18fb688a257f89387a09fc4c5b8bd4b320616b54a0a7b1d1d7c6a0c59f6dff78c78ad4e3d6fca9c9a17b96 -Sig = 4dec97b54c4150ebaffc2dbfc2bc17c302be47cfc4b541ada34108b1080f2482a3e7f5f2b16f730210bd8c29b6681e0b000575984f37064bfbbdda76836f5ef2d632f006c338a9585c8b9108c46ea812ce066110156de9806ae5711153e2ef0b -Result = P (0 ) - -# S is 2 bytes shorter than the maximum length. -Curve = P-384 -Digest = SHA384 -Msg = "" -Q = 045c5e788a805c77d34128b8401cb59b2373b8b468336c9318252bf39fd31d2507557987a5180a9435f9fb8eb971c426f1c485170dcb18fb688a257f89387a09fc4c5b8bd4b320616b54a0a7b1d1d7c6a0c59f6dff78c78ad4e3d6fca9c9a17b96 -Sig = ad8e51ec23d5b8130a5e0636a2f0d1740e8b5404c368b7dab5ae82d307d653c6ef70dcee70b112bf678801f87fb8f5a90000806d69e0c2834c27666996d55655cf9358b201aa85d3b08891abcc68c854cac6c67c53b3bf92df9a677d11aba13d -Result = P (0 ) - - -# Generated Test vectors. -# -# TODO: Test the range of `r` in addition to the range of `s`. -# TODO: Test what happens when the message digests to zero. -# TODO: Additional test coverage. libsecp256k1 is a good example. - - -# Test vectors for Gregory Maxwell's trick. -# -# In all cases, the `s` component of the signature was selected -# arbitrarily as 4 and then the `r` component was chosen to be the -# smallest value where the public key recovery from the signature -# works. - -# The signature has r < q - n. This is the control case for the next -# test case; this signature is the same but the public key is -# different. Notice that both public keys work for the same signature! -# This signature will validate even if the implementation doesn't -# reduce the X coordinate of the multiplication result (mod n). -Curve = P-256 -Digest = SHA256 -Msg = "" -Q = 041548fc88953e06cd34d4b300804c5322cb48c24aaaa4d07a541b0f0ccfeedeb0ae4991b90519ea405588bdf699f5e6d0c6b2d5217a5c16e8371062737aa1dae1 -Sig = 00000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000004 -Result = P (0 ) - -# The signature has r < q - n. s Since r < q - n, r + n < q. Notice -# that this signature is the same as the signature in the preceding -# test case, but the public key is different. That the signature -# validates for this case too is what's special about the case where -# r < q - n. If this test case fails it is likely that the -# implementation doesn't reduce the X coordinate of the multiplication -# result (mod n), or it is missing the second step of Gregory -# Maxwell's trick. -Curve = P-256 -Digest = SHA256 -Msg = "" -Q = 04ad8f60e4ec1ebdb6a260b559cb55b1e9d2c5ddd43a41a2d11b0741ef2567d84e166737664104ebbc337af3d861d3524cfbc761c12edae974a0759750c8324f9a -Sig = 00000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000004 -Result = P (0 ) - -# The signature has r > q - n. The signature is for the public key -# recovered from r. r + n > q since r > q - n. This is the control -# for the next test case; this signature is the same as the signature -# in the following test case but the public key is different. -Curve = P-256 -Digest = SHA256 -Msg = "" -Q = 0445bd879143a64af5746e2e82aa65fd2ea07bba4e35594095a981b59984dacb219d59697387ac721b1f1eccf4b11f43ddc39e8367147abab3084142ed3ea170e4 -Sig = 000000000000000000000000000000004319055358e8617b0c46353d039cdaae0000000000000000000000000000000000000000000000000000000000000004 -Result = P (0 ) - -# The signature has r > q - n. The signature is for the public key -# recovered from r + n (mod q). r + n > q since r > q - n, and so -# r + n (mod q) < r because r + n (mod n) != r + n (mod q). Notice -# that this signature is the same as the signature in the preceding -# test case but the public key is different. Also, notice that the -# signature fails to validate in this case, unlike other related test -# cases. If this test case fails (the signature validates), it is -# likely that the implementation didn't guard the second case of -# Gregory Maxwell's trick on the condition r < q - n. -Curve = P-256 -Digest = SHA256 -Msg = "" -Q = 040feb5df4cc78b35ec9c180cc0de5842f75f088b48456978ffa98e716d94883e1e6500b2a1f6c1d9d493428d7ae7d9a8a560fff30a3d14aa160be0c5e7edcd887 -Sig = 000000000000000000000000000000004319055358e8617b0c46353d039cdaae0000000000000000000000000000000000000000000000000000000000000004 -Result = F - -# The signature has r < q - n. This is the control case for the next -# test case; this signature is the same but the public key is -# different. Notice that both public keys work for the same signature! -# This signature will validate even if the implementation doesn't -# reduce the X coordinate of the multiplication result (mod n). -Curve = P-384 -Digest = SHA384 -Msg = "" -Q = 0425b890b9597155baf7e7ffb48d8123184cbb76ea3f7b10d8f1702136f969e915188cff306c67950437f816ce6ecb739204cc069edac95929dfbd719313552797962789e2210a0bf270c2f0ffc109a70e40da6303a2599bdd702c19070dd51f42 -Sig = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004 -Result = P (0 ) - -# The signature has r < q - n. s Since r < q - n, r + n < q. Notice -# that this signature is the same as the signature in the preceding -# test case, but the public key is different. That the signature -# validates for this case too is what's special about the case where -# r < q - n. If this test case fails it is likely that the -# implementation doesn't reduce the X coordinate of the multiplication -# result (mod n), or it is missing the second step of Gregory -# Maxwell's trick. -Curve = P-384 -Digest = SHA384 -Msg = "" -Q = 045a3c576f0c2a615063c6e8ec40f5bf0dd67e549e9f13f8f881703ec40a8d6d8ecbb0d8e5b20f3aa0f2e581b594cea3e654a450cabcf24bd908cc47da98eba648a0440332ee19fb53da96dddaec521f718f7b52a161b67134d6e0d6e81dc45502 -Sig = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004 -Result = P (0 ) - -# The signature has r > q - n. The signature is for the public key -# recovered from r. r + n > q since r > q - n. This is the control -# for the next test case; this signature is the same as the signature -# in the following test case but the public key is different. -Curve = P-384 -Digest = SHA384 -Msg = "" -Q = 04a93588bffb32417bd2b0fa03a6a30d2cf90034e6070b9333d4e7a42fe88bce5a03e8be7f2a84fbc25ec84dc34915c53fd975cfd0db77ec2b5c548994dc9f62756e018882a31d883471b0bbbd8588d9a2acab1aeaaa1eb217f8e528e7114162df -Sig = 000000000000000000000000000000000000000000000000389cb27e0bc8d21fa7e5f24cb74f58851313e696333ad68e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004 -Result = P (0 ) - -# The signature has r > q - n. The signature is for the public key -# recovered from r + n (mod q). r + n > q since r > q - n, and so -# r + n (mod q) < r because r + n (mod n) != r + n (mod q). Notice -# that this signature is the same as the signature in the preceding -# test case but the public key is different. Also, notice that the -# signature fails to validate in this case, unlike other related test -# cases. If this test case fails (the signature validates), it is -# likely that the implementation didn't guard the second case of -# Gregory Maxwell's trick on the condition r < q - n. -Curve = P-384 -Digest = SHA384 -Msg = "" -Q = 04576270f9571c9e99b9c71be1a1a705e5155e46b8c6dd920c14e2aaf0f9f96ed30754e2c8f8464d015a9bc779495ea568ac39c555c3b03de021e8167a27425588d6a82b68cf7a0f6ae389a202d8663ed32b5e1782c0377a8f0dc309ae28143961 -Sig = 000000000000000000000000000000000000000000000000389cb27e0bc8d21fa7e5f24cb74f58851313e696333ad68e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004 -Result = F - - -# Generated Test vectors edge cases of signature (r, s) values. - -# s == 0 (out of range) -Curve = P-256 -Digest = SHA256 -Msg = "" -Q = 0471db746fd153cf5c5a7c7210f9008c0e99c3a936ef0e720b202b304771431a230af53931e70cbe279ca47ce819616ed1db6604490f70abbcef3036732426eb6d -Sig = 00000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000 -Result = F - -# s == 1 (minimum allowed) -Curve = P-256 -Digest = SHA256 -Msg = "" -Q = 046e3f95fae7606c1cdfab1f1560de160ed806bbc2a85dc5a2d002aa1c0ac3e1fb5bcd5f7a325415824365cc584f08c144118318ce4d0f5df82b7753b291c4fe96 -Sig = 00000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000001 -Result = P (0 ) - -# s == n (out of range) -Curve = P-256 -Digest = SHA256 -Msg = "" -Q = 0471db746fd153cf5c5a7c7210f9008c0e99c3a936ef0e720b202b304771431a230af53931e70cbe279ca47ce819616ed1db6604490f70abbcef3036732426eb6d -Sig = 0000000000000000000000000000000000000000000000000000000000000006ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551 -Result = F - -# s == n - 1 (maximum allowed) -Curve = P-256 -Digest = SHA256 -Msg = "" -Q = 04d78f14b53bf825c9f7146193f775458ef5ee46500cd44b18488cb4115c3f00f04b11fc7c6aa1045dc83e4f3e8a14d4a017db8415b5fe3f1a32afba4b8c707ab4 -Sig = 0000000000000000000000000000000000000000000000000000000000000006ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550 -Result = P (0 ) - -# s == n - 1 (maximum allowed), missing first zero byte. -Curve = P-256 -Digest = SHA256 -Msg = "" -Q = 04d78f14b53bf825c9f7146193f775458ef5ee46500cd44b18488cb4115c3f00f04b11fc7c6aa1045dc83e4f3e8a14d4a017db8415b5fe3f1a32afba4b8c707ab4 -Sig = 00000000000000000000000000000000000000000000000000000000000006ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550 -Result = F - -# s == n - 1 (maximum allowed), missing last nonzero byte. -Curve = P-256 -Digest = SHA256 -Msg = "" -Q = 04d78f14b53bf825c9f7146193f775458ef5ee46500cd44b18488cb4115c3f00f04b11fc7c6aa1045dc83e4f3e8a14d4a017db8415b5fe3f1a32afba4b8c707ab4 -Sig = 0000000000000000000000000000000000000000000000000000000000000006ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325 -Result = F - -# s == 0 (out of range) -Curve = P-384 -Digest = SHA384 -Msg = "" -Q = 04aad95ed7839057e221d46bb203f8b6c977588966fffccf815542429477dc45e61ed6b86fec0a2f3dfb453ea56ac0a6c06933416550a7158ed3f06aca1822c9b83102b40e5ada71651ec153a919a32755ee0292f6a5530d5889c1dc6cb020351f -Sig = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -Result = F - -# s == 1 (minimum allowed) -Curve = P-384 -Digest = SHA384 -Msg = "" -Q = 042aadde5424928b888e20ecef2525f99d646519aa994c075a4081aa852ec309a6ac63006421ff756c6c0924d611d1bda82df99267266ba603b07ba85c678f4ae69daf4634a5e597d77d0b0338f343d8090b2d4420a29302ab47ef04ad45e1461f -Sig = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 -Result = P (0 ) - -# s == n (out of range) -Curve = P-384 -Digest = SHA384 -Msg = "" -Q = 04aad95ed7839057e221d46bb203f8b6c977588966fffccf815542429477dc45e61ed6b86fec0a2f3dfb453ea56ac0a6c06933416550a7158ed3f06aca1822c9b83102b40e5ada71651ec153a919a32755ee0292f6a5530d5889c1dc6cb020351f -Sig = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973 -Result = F - -# s == n - 1 (maximum allowed) -Curve = P-384 -Digest = SHA384 -Msg = "" -Q = 04a1d58e8df7f27c4483be9369f8d73d3ea968fce26ff5374d822c5cb4286c00f6fef54d525f4c8b180065dcc1f95f7a0c291171ca5894ba3f4d52ae091ec36c81ee2f34a384c59183284d85dddc3b196c6d7deaab1626d662bc628136126eef6b -Sig = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972 -Result = P (0 ) - -# s == n - 1 (maximum allowed), missing first zero byte. -Curve = P-384 -Digest = SHA384 -Msg = "" -Q = 04a1d58e8df7f27c4483be9369f8d73d3ea968fce26ff5374d822c5cb4286c00f6fef54d525f4c8b180065dcc1f95f7a0c291171ca5894ba3f4d52ae091ec36c81ee2f34a384c59183284d85dddc3b196c6d7deaab1626d662bc628136126eef6b -Sig = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972 -Result = F - -# s == n - 1 (maximum allowed), missing last nonzero byte. -Curve = P-384 -Digest = SHA384 -Msg = "" -Q = 04a1d58e8df7f27c4483be9369f8d73d3ea968fce26ff5374d822c5cb4286c00f6fef54d525f4c8b180065dcc1f95f7a0c291171ca5894ba3f4d52ae091ec36c81ee2f34a384c59183284d85dddc3b196c6d7deaab1626d662bc628136126eef6b -Sig = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc529 -Result = F diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/tests/ed25519_from_pkcs8_tests.txt temporalio-1.3.0/vendor/ring-0.16.20/tests/ed25519_from_pkcs8_tests.txt --- temporalio-1.3.0/vendor/ring-0.16.20/tests/ed25519_from_pkcs8_tests.txt 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/tests/ed25519_from_pkcs8_tests.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,45 +0,0 @@ -# v2. The private key ends with a zero byte. -Input = 3053020101300506032b657004220420a22efdb713f0e1600d2a5ce948e321ca3a18137c47f15091a12c7126c1749a00a1230321001aeb8e3ee5ba5afd91113466d19f4ea77fa0feffbd8c5adcb499927f12535f77 - -# v2. The private key's last byte, zero, is omitted. -Input = 3052020101300506032b65700421041fa22efdb713f0e1600d2a5ce948e321ca3a18137c47f15091a12c7126c1749aa1230321001aeb8e3ee5ba5afd91113466d19f4ea77fa0feffbd8c5adcb499927f12535f77 -Error = InvalidEncoding - -# v2. The private key starts with a zero byte. -Input = 3053020101300506032b65700422042000b1a7c20b2b4ed9c78f3686db82f854734cdc95be51def304d98e0cd30bf490a12303210063457cd4dfdd0e98a53796265831d46ac6a5a685f2a54c9697a38b2c800d60ba - -# v2. The private key's first byte, zero, is omitted. -Input = 3052020101300506032b65700421041fb1a7c20b2b4ed9c78f3686db82f854734cdc95be51def304d98e0cd30bf490a12303210063457cd4dfdd0e98a53796265831d46ac6a5a685f2a54c9697a38b2c800d60ba -Error = InvalidEncoding - -# v2. The public key's first byte is zero. -Input = 3053020101300506032b6570042204202dc67de5186d9193021c0b104d9c6ef24bee2bd395ccb5ed5a2db5f37a2fc1f0a12303210000c17e4d8bbff27c1fb618c23fce988703c7efa3cd590aacac12d3f1e3c90c8c - -# v2. The public key's first byte, zero, is omitted. -Input = 3052020101300506032b6570042204202dc67de5186d9193021c0b104d9c6ef24bee2bd395ccb5ed5a2db5f37a2fc1f0a122032000c17e4d8bbff27c1fb618c23fce988703c7efa3cd590aacac12d3f1e3c90c8c -Error = InvalidEncoding - -# v2. The public key's last byte is zero. -Input = 3053020101300506032b657004220420b2579f555a2eabdabac8d46997b1c08fe8ce63858df124efc29c60dfbb86c349a1230321009d421270ce2fcc08672c41e427214876245c9b0f14ab671b8bb9d266a492e400 - -# v2. The public key's last byte, zero, is omitted (valid ASN.1 DER). -Input = 3052020101300506032b657004220420b2579f555a2eabdabac8d46997b1c08fe8ce63858df124efc29c60dfbb86c349a1220320009d421270ce2fcc08672c41e427214876245c9b0f14ab671b8bb9d266a492e4 -Error = InvalidEncoding - -# v2. The public key's last byte, zero, has been truncated (invalid ASN.1 DER). -Input = 3053020101300506032b657004220420b2579f555a2eabdabac8d46997b1c08fe8ce63858df124efc29c60dfbb86c349a1230321009d421270ce2fcc08672c41e427214876245c9b0f14ab671b8bb9d266a492e4 -Error = InvalidEncoding - -# v2. The public key's high bit has been flipped. Ed25519 public keys don't -# have their high bit masked, so this is wrong. -Input = 3053020101300506032b6570042204202dc67de5186d9193021c0b104d9c6ef24bee2bd395ccb5ed5a2db5f37a2fc1f0a12303210000c17e4d8bbff27c1fb618c23fce988703c7efa3cd590aacac12d3f1e3c90c0c -Error = InconsistentComponents - -# v2. Valid except the public key field is missing. -Input = 302e020101300506032b657004220420a22efdb713f0e1600d2a5ce948e321ca3a18137c47f15091a12c7126c1749a00 -Error = PublicKeyIsMissing - -# v2. Valid except the public key is encoded as [0] instead of [1]; i.e. the -# attributes are invalid and the public key is missing. -Input = 3053020101300506032b657004220420a22efdb713f0e1600d2a5ce948e321ca3a18137c47f15091a12c7126c1749a00a0230321001aeb8e3ee5ba5afd91113466d19f4ea77fa0feffbd8c5adcb499927f12535f77 -Error = PublicKeyIsMissing diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/tests/ed25519_from_pkcs8_unchecked_tests.txt temporalio-1.3.0/vendor/ring-0.16.20/tests/ed25519_from_pkcs8_unchecked_tests.txt --- temporalio-1.3.0/vendor/ring-0.16.20/tests/ed25519_from_pkcs8_unchecked_tests.txt 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/tests/ed25519_from_pkcs8_unchecked_tests.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,13 +0,0 @@ -# An Ed25519 private key. (This is from BoringSSL's tests.) -Input = 302e020100300506032b6570042204209d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60 - -# The same as the above, but with an invalid NULL parameter. (This is from BoringSSL's tests.) -Input = 3030020100300706032b65700500042204209d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60 -Error = WrongAlgorithm - -# Sample private key from draft-ietf-curdle-pkix-04. -Input = 302e020100300506032b657004220420d4ee72dbf913584ad5b6d8f1f769f8ad3afe7c28cbf1d4fbe097a88f44755842 - -# v1. valid except it includes publicKey. -Input = 3053020100300506032b657004220420a22efdb713f0e1600d2a5ce948e321ca3a18137c47f15091a12c7126c1749a00a1230321001aeb8e3ee5ba5afd91113466d19f4ea77fa0feffbd8c5adcb499927f12535f77 -Error = InvalidEncoding diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/tests/ed25519_test_private_key.bin temporalio-1.3.0/vendor/ring-0.16.20/tests/ed25519_test_private_key.bin --- temporalio-1.3.0/vendor/ring-0.16.20/tests/ed25519_test_private_key.bin 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/tests/ed25519_test_private_key.bin 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -a±ïýZ`º„Jô’ì,ÄDIÅi{2ip;¬®` \ No newline at end of file Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/ring-0.16.20/tests/ed25519_test_private_key.p8 and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/ring-0.16.20/tests/ed25519_test_private_key.p8 differ diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/tests/ed25519_test_public_key.bin temporalio-1.3.0/vendor/ring-0.16.20/tests/ed25519_test_public_key.bin --- temporalio-1.3.0/vendor/ring-0.16.20/tests/ed25519_test_public_key.bin 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/tests/ed25519_test_public_key.bin 1970-01-01 00:00:00.000000000 +0000 @@ -1,2 +0,0 @@ -×Z˜‚± -·ÕKþÓÉd:áróÚ¦#%¯h÷Q \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/tests/ed25519_test_public_key.der temporalio-1.3.0/vendor/ring-0.16.20/tests/ed25519_test_public_key.der --- temporalio-1.3.0/vendor/ring-0.16.20/tests/ed25519_test_public_key.der 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/tests/ed25519_test_public_key.der 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -X éþöÜìXðòã°Ö~˜€¡Wàƒ¬èX5öÈû¯k} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/tests/ed25519_tests.rs temporalio-1.3.0/vendor/ring-0.16.20/tests/ed25519_tests.rs --- temporalio-1.3.0/vendor/ring-0.16.20/tests/ed25519_tests.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/tests/ed25519_tests.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,187 +0,0 @@ -// Copyright 2015-2017 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -use ring::{ - error, - signature::{self, Ed25519KeyPair, KeyPair}, - test, test_file, -}; - -/// Test vectors from BoringSSL. -#[test] -fn test_signature_ed25519() { - test::run(test_file!("ed25519_tests.txt"), |section, test_case| { - assert_eq!(section, ""); - let seed = test_case.consume_bytes("SEED"); - assert_eq!(32, seed.len()); - - let public_key = test_case.consume_bytes("PUB"); - assert_eq!(32, public_key.len()); - - let msg = test_case.consume_bytes("MESSAGE"); - - let expected_sig = test_case.consume_bytes("SIG"); - - { - let key_pair = Ed25519KeyPair::from_seed_and_public_key(&seed, &public_key).unwrap(); - let actual_sig = key_pair.sign(&msg); - assert_eq!(&expected_sig[..], actual_sig.as_ref()); - } - - // Test PKCS#8 generation, parsing, and private-to-public calculations. - let rng = test::rand::FixedSliceRandom { bytes: &seed }; - let pkcs8 = Ed25519KeyPair::generate_pkcs8(&rng).unwrap(); - let key_pair = Ed25519KeyPair::from_pkcs8(pkcs8.as_ref()).unwrap(); - assert_eq!(public_key, key_pair.public_key().as_ref()); - - // Test Signature generation. - let actual_sig = key_pair.sign(&msg); - assert_eq!(&expected_sig[..], actual_sig.as_ref()); - - // Test Signature verification. - test_signature_verification(&public_key, &msg, &expected_sig, Ok(())); - - let mut tampered_sig = expected_sig; - tampered_sig[0] ^= 1; - - test_signature_verification(&public_key, &msg, &tampered_sig, Err(error::Unspecified)); - - Ok(()) - }); -} - -/// Test vectors from BoringSSL. -#[test] -fn test_signature_ed25519_verify() { - test::run( - test_file!("ed25519_verify_tests.txt"), - |section, test_case| { - assert_eq!(section, ""); - - let public_key = test_case.consume_bytes("PUB"); - let msg = test_case.consume_bytes("MESSAGE"); - let sig = test_case.consume_bytes("SIG"); - let expected_result = match test_case.consume_string("Result").as_str() { - "P" => Ok(()), - "F" => Err(error::Unspecified), - s => panic!("{:?} is not a valid result", s), - }; - test_signature_verification(&public_key, &msg, &sig, expected_result); - Ok(()) - }, - ); -} - -fn test_signature_verification( - public_key: &[u8], - msg: &[u8], - sig: &[u8], - expected_result: Result<(), error::Unspecified>, -) { - assert_eq!( - expected_result, - signature::UnparsedPublicKey::new(&signature::ED25519, public_key).verify(msg, sig) - ); -} - -#[test] -fn test_ed25519_from_seed_and_public_key_misuse() { - const PRIVATE_KEY: &[u8] = include_bytes!("ed25519_test_private_key.bin"); - const PUBLIC_KEY: &[u8] = include_bytes!("ed25519_test_public_key.bin"); - - assert!(Ed25519KeyPair::from_seed_and_public_key(PRIVATE_KEY, PUBLIC_KEY).is_ok()); - - // Truncated private key. - assert!(Ed25519KeyPair::from_seed_and_public_key(&PRIVATE_KEY[..31], PUBLIC_KEY).is_err()); - - // Truncated public key. - assert!(Ed25519KeyPair::from_seed_and_public_key(PRIVATE_KEY, &PUBLIC_KEY[..31]).is_err()); - - // Swapped public and private key. - assert!(Ed25519KeyPair::from_seed_and_public_key(PUBLIC_KEY, PRIVATE_KEY).is_err()); -} - -#[test] -fn test_ed25519_from_pkcs8_unchecked() { - // Just test that we can parse the input. - test::run( - test_file!("ed25519_from_pkcs8_unchecked_tests.txt"), - |section, test_case| { - assert_eq!(section, ""); - let input = test_case.consume_bytes("Input"); - let error = test_case.consume_optional_string("Error"); - - match (Ed25519KeyPair::from_pkcs8_maybe_unchecked(&input), error) { - (Ok(_), None) => (), - (Err(e), None) => panic!("Failed with error \"{}\", but expected to succeed", e), - (Ok(_), Some(e)) => panic!("Succeeded, but expected error \"{}\"", e), - (Err(actual), Some(expected)) => assert_eq!(actual.description_(), expected), - }; - - Ok(()) - }, - ); -} - -#[test] -fn test_ed25519_from_pkcs8() { - // Just test that we can parse the input. - test::run( - test_file!("ed25519_from_pkcs8_tests.txt"), - |section, test_case| { - assert_eq!(section, ""); - let input = test_case.consume_bytes("Input"); - let error = test_case.consume_optional_string("Error"); - - match (Ed25519KeyPair::from_pkcs8(&input), error) { - (Ok(_), None) => (), - (Err(e), None) => panic!("Failed with error \"{}\", but expected to succeed", e), - (Ok(_), Some(e)) => panic!("Succeeded, but expected error \"{}\"", e), - (Err(actual), Some(expected)) => assert_eq!(actual.description_(), expected), - }; - - Ok(()) - }, - ); -} - -#[test] -fn ed25519_test_public_key_coverage() { - const PRIVATE_KEY: &[u8] = include_bytes!("ed25519_test_private_key.p8"); - const PUBLIC_KEY: &[u8] = include_bytes!("ed25519_test_public_key.der"); - const PUBLIC_KEY_DEBUG: &str = - "PublicKey(\"5809e9fef6dcec58f0f2e3b0d67e9880a11957e083ace85835c3b6c8fbaf6b7d\")"; - - let key_pair = signature::Ed25519KeyPair::from_pkcs8(PRIVATE_KEY).unwrap(); - - // Test `AsRef<[u8]>` - assert_eq!(key_pair.public_key().as_ref(), PUBLIC_KEY); - - // Test `Clone`. - #[allow(clippy::clone_on_copy)] - let _: ::PublicKey = key_pair.public_key().clone(); - - // Test `Copy`. - let _: ::PublicKey = *key_pair.public_key(); - - // Test `Debug`. - assert_eq!(PUBLIC_KEY_DEBUG, format!("{:?}", key_pair.public_key())); - assert_eq!( - format!( - "Ed25519KeyPair {{ public_key: {:?} }}", - key_pair.public_key() - ), - format!("{:?}", key_pair) - ); -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/tests/ed25519_tests.txt temporalio-1.3.0/vendor/ring-0.16.20/tests/ed25519_tests.txt --- temporalio-1.3.0/vendor/ring-0.16.20/tests/ed25519_tests.txt 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/tests/ed25519_tests.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,2592 +0,0 @@ -# Additional test vectors from RFC 8032 - -SEED = f5e5767cf153319517630f226876b86c8160cc583bc013744c6bf255f5cc0ee5 -PUB = 278117fc144c72340f67d0f2316e8386ceffbf2b2428c9c51fef7c597f1d426e -MESSAGE = 08b8b2b733424243760fe426a4b54908632110a66c2f6591eabd3345e3e4eb98fa6e264bf09efe12ee50f8f54e9f77b1e355f6c50544e23fb1433ddf73be84d879de7c0046dc4996d9e773f4bc9efe5738829adb26c81b37c93a1b270b20329d658675fc6ea534e0810a4432826bf58c941efb65d57a338bbd2e26640f89ffbc1a858efcb8550ee3a5e1998bd177e93a7363c344fe6b199ee5d02e82d522c4feba15452f80288a821a579116ec6dad2b3b310da903401aa62100ab5d1a36553e06203b33890cc9b832f79ef80560ccb9a39ce767967ed628c6ad573cb116dbefefd75499da96bd68a8a97b928a8bbc103b6621fcde2beca1231d206be6cd9ec7aff6f6c94fcd7204ed3455c68c83f4a41da4af2b74ef5c53f1d8ac70bdcb7ed185ce81bd84359d44254d95629e9855a94a7c1958d1f8ada5d0532ed8a5aa3fb2d17ba70eb6248e594e1a2297acbbb39d502f1a8c6eb6f1ce22b3de1a1f40cc24554119a831a9aad6079cad88425de6bde1a9187ebb6092cf67bf2b13fd65f27088d78b7e883c8759d2c4f5c65adb7553878ad575f9fad878e80a0c9ba63bcbcc2732e69485bbc9c90bfbd62481d9089beccf80cfe2df16a2cf65bd92dd597b0707e0917af48bbb75fed413d238f5555a7a569d80c3414a8d0859dc65a46128bab27af87a71314f318c782b23ebfe808b82b0ce26401d2e22f04d83d1255dc51addd3b75a2b1ae0784504df543af8969be3ea7082ff7fc9888c144da2af58429ec96031dbcad3dad9af0dcbaaaf268cb8fcffead94f3c7ca495e056a9b47acdb751fb73e666c6c655ade8297297d07ad1ba5e43f1bca32301651339e22904cc8c42f58c30c04aafdb038dda0847dd988dcda6f3bfd15c4b4c4525004aa06eeff8ca61783aacec57fb3d1f92b0fe2fd1a85f6724517b65e614ad6808d6f6ee34dff7310fdc82aebfd904b01e1dc54b2927094b2db68d6f903b68401adebf5a7e08d78ff4ef5d63653a65040cf9bfd4aca7984a74d37145986780fc0b16ac451649de6188a7dbdf191f64b5fc5e2ab47b57f7f7276cd419c17a3ca8e1b939ae49e488acba6b965610b5480109c8b17b80e1b7b750dfc7598d5d5011fd2dcc5600a32ef5b52a1ecc820e308aa342721aac0943bf6686b64b2579376504ccc493d97e6aed3fb0f9cd71a43dd497f01f17c0e2cb3797aa2a2f256656168e6c496afc5fb93246f6b1116398a346f1a641f3b041e989f7914f90cc2c7fff357876e506b50d334ba77c225bc307ba537152f3f1610e4eafe595f6d9d90d11faa933a15ef1369546868a7f3a45a96768d40fd9d03412c091c6315cf4fde7cb68606937380db2eaaa707b4c4185c32eddcdd306705e4dc1ffc872eeee475a64dfac86aba41c0618983f8741c5ef68d3a101e8a3b8cac60c905c15fc910840b94c00a0b9d0 -SIG = 0aab4c900501b3e24d7cdf4663326a3a87df5e4843b2cbdb67cbf6e460fec350aa5371b1508f9f4528ecea23c436d94b5e8fcd4f681e30a6ac00a9704a188a03 - -SEED = 833fe62409237b9d62ec77587520911e9a759cec1d19755b7da901b96dca3d42 -PUB = ec172b93ad5e563bf4932c70e1245034c35467ef2efd4d64ebf819683467e2bf -MESSAGE = ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f -SIG = dc2a4459e7369633a52b1bf277839a00201009a3efbf3ecb69bea2186c26b58909351fc9ac90b3ecfdfbc7c66431e0303dca179c138ac17ad9bef1177331a704 - -# These were generated from -# http://ed25519.cr.yp.to/python/sign.input using the following Python script: -# -# import sys -# -# isFirst = True -# -# for line in sys.stdin.readlines(): -# (private, public, message, sig_and_message, _) = line.split(':') -# -# if not isFirst: -# print -# print "PRIV:", private -# print "PUB:", public -# print "MESSAGE:", message -# print "SIG:", sig_and_message[:128] -# isFirst = False -# -# This was adapted for *ring* by s/: / = /, denoting empty inputs with "", -# and replacing "PRIV" with "SEED", the first half of "PRIV". - -SEED = 9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60 -PUB = d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a -MESSAGE = "" -SIG = e5564300c360ac729086e2cc806e828a84877f1eb8e5d974d873e065224901555fb8821590a33bacc61e39701cf9b46bd25bf5f0595bbe24655141438e7a100b - -SEED = 4ccd089b28ff96da9db6c346ec114e0f5b8a319f35aba624da8cf6ed4fb8a6fb -PUB = 3d4017c3e843895a92b70aa74d1b7ebc9c982ccf2ec4968cc0cd55f12af4660c -MESSAGE = 72 -SIG = 92a009a9f0d4cab8720e820b5f642540a2b27b5416503f8fb3762223ebdb69da085ac1e43e15996e458f3613d0f11d8c387b2eaeb4302aeeb00d291612bb0c00 - -SEED = c5aa8df43f9f837bedb7442f31dcb7b166d38535076f094b85ce3a2e0b4458f7 -PUB = fc51cd8e6218a1a38da47ed00230f0580816ed13ba3303ac5deb911548908025 -MESSAGE = af82 -SIG = 6291d657deec24024827e69c3abe01a30ce548a284743a445e3680d7db5ac3ac18ff9b538d16f290ae67f760984dc6594a7c15e9716ed28dc027beceea1ec40a - -SEED = 0d4a05b07352a5436e180356da0ae6efa0345ff7fb1572575772e8005ed978e9 -PUB = e61a185bcef2613a6c7cb79763ce945d3b245d76114dd440bcf5f2dc1aa57057 -MESSAGE = cbc77b -SIG = d9868d52c2bebce5f3fa5a79891970f309cb6591e3e1702a70276fa97c24b3a8e58606c38c9758529da50ee31b8219cba45271c689afa60b0ea26c99db19b00c - -SEED = 6df9340c138cc188b5fe4464ebaa3f7fc206a2d55c3434707e74c9fc04e20ebb -PUB = c0dac102c4533186e25dc43128472353eaabdb878b152aeb8e001f92d90233a7 -MESSAGE = 5f4c8989 -SIG = 124f6fc6b0d100842769e71bd530664d888df8507df6c56dedfdb509aeb93416e26b918d38aa06305df3095697c18b2aa832eaa52edc0ae49fbae5a85e150c07 - -SEED = b780381a65edf8b78f6945e8dbec7941ac049fd4c61040cf0c324357975a293c -PUB = e253af0766804b869bb1595be9765b534886bbaab8305bf50dbc7f899bfb5f01 -MESSAGE = 18b6bec097 -SIG = b2fc46ad47af464478c199e1f8be169f1be6327c7f9a0a6689371ca94caf04064a01b22aff1520abd58951341603faed768cf78ce97ae7b038abfe456aa17c09 - -SEED = 78ae9effe6f245e924a7be63041146ebc670dbd3060cba67fbc6216febc44546 -PUB = fbcfbfa40505d7f2be444a33d185cc54e16d615260e1640b2b5087b83ee3643d -MESSAGE = 89010d855972 -SIG = 6ed629fc1d9ce9e1468755ff636d5a3f40a5d9c91afd93b79d241830f7e5fa29854b8f20cc6eecbb248dbd8d16d14e99752194e4904d09c74d639518839d2300 - -SEED = 691865bfc82a1e4b574eecde4c7519093faf0cf867380234e3664645c61c5f79 -PUB = 98a5e3a36e67aaba89888bf093de1ad963e774013b3902bfab356d8b90178a63 -MESSAGE = b4a8f381e70e7a -SIG = 6e0af2fe55ae377a6b7a7278edfb419bd321e06d0df5e27037db8812e7e3529810fa5552f6c0020985ca17a0e02e036d7b222a24f99b77b75fdd16cb05568107 - -SEED = 3b26516fb3dc88eb181b9ed73f0bcd52bcd6b4c788e4bcaf46057fd078bee073 -PUB = f81fb54a825fced95eb033afcd64314075abfb0abd20a970892503436f34b863 -MESSAGE = 4284abc51bb67235 -SIG = d6addec5afb0528ac17bb178d3e7f2887f9adbb1ad16e110545ef3bc57f9de2314a5c8388f723b8907be0f3ac90c6259bbe885ecc17645df3db7d488f805fa08 - -SEED = edc6f5fbdd1cee4d101c063530a30490b221be68c036f5b07d0f953b745df192 -PUB = c1a49c66e617f9ef5ec66bc4c6564ca33de2a5fb5e1464062e6d6c6219155efd -MESSAGE = 672bf8965d04bc5146 -SIG = 2c76a04af2391c147082e33faacdbe56642a1e134bd388620b852b901a6bc16ff6c9cc9404c41dea12ed281da067a1513866f9d964f8bdd24953856c50042901 - -SEED = 4e7d21fb3b1897571a445833be0f9fd41cd62be3aa04040f8934e1fcbdcacd45 -PUB = 31b2524b8348f7ab1dfafa675cc538e9a84e3fe5819e27c12ad8bbc1a36e4dff -MESSAGE = 33d7a786aded8c1bf691 -SIG = 28e4598c415ae9de01f03f9f3fab4e919e8bf537dd2b0cdf6e79b9e6559c9409d9151a4c40f083193937627c369488259e99da5a9f0a87497fa6696a5dd6ce08 - -SEED = a980f892db13c99a3e8971e965b2ff3d41eafd54093bc9f34d1fd22d84115bb6 -PUB = 44b57ee30cdb55829d0a5d4f046baef078f1e97a7f21b62d75f8e96ea139c35f -MESSAGE = 3486f68848a65a0eb5507d -SIG = 77d389e599630d934076329583cd4105a649a9292abc44cd28c40000c8e2f5ac7660a81c85b72af8452d7d25c070861dae91601c7803d656531650dd4e5c4100 - -SEED = 5b5a619f8ce1c66d7ce26e5a2ae7b0c04febcd346d286c929e19d0d5973bfef9 -PUB = 6fe83693d011d111131c4f3fbaaa40a9d3d76b30012ff73bb0e39ec27ab18257 -MESSAGE = 5a8d9d0a22357e6655f9c785 -SIG = 0f9ad9793033a2fa06614b277d37381e6d94f65ac2a5a94558d09ed6ce922258c1a567952e863ac94297aec3c0d0c8ddf71084e504860bb6ba27449b55adc40e - -SEED = 940c89fe40a81dafbdb2416d14ae469119869744410c3303bfaa0241dac57800 -PUB = a2eb8c0501e30bae0cf842d2bde8dec7386f6b7fc3981b8c57c9792bb94cf2dd -MESSAGE = b87d3813e03f58cf19fd0b6395 -SIG = d8bb64aad8c9955a115a793addd24f7f2b077648714f49c4694ec995b330d09d640df310f447fd7b6cb5c14f9fe9f490bcf8cfadbfd2169c8ac20d3b8af49a0c - -SEED = 9acad959d216212d789a119252ebfe0c96512a23c73bd9f3b202292d6916a738 -PUB = cf3af898467a5b7a52d33d53bc037e2642a8da996903fc252217e9c033e2f291 -MESSAGE = 55c7fa434f5ed8cdec2b7aeac173 -SIG = 6ee3fe81e23c60eb2312b2006b3b25e6838e02106623f844c44edb8dafd66ab0671087fd195df5b8f58a1d6e52af42908053d55c7321010092748795ef94cf06 - -SEED = d5aeee41eeb0e9d1bf8337f939587ebe296161e6bf5209f591ec939e1440c300 -PUB = fd2a565723163e29f53c9de3d5e8fbe36a7ab66e1439ec4eae9c0a604af291a5 -MESSAGE = 0a688e79be24f866286d4646b5d81c -SIG = f68d04847e5b249737899c014d31c805c5007a62c0a10d50bb1538c5f35503951fbc1e08682f2cc0c92efe8f4985dec61dcbd54d4b94a22547d24451271c8b00 - -SEED = 0a47d10452ae2febec518a1c7c362890c3fc1a49d34b03b6467d35c904a8362d -PUB = 34e5a8508c4743746962c066e4badea2201b8ab484de5c4f94476ccd2143955b -MESSAGE = c942fa7ac6b23ab7ff612fdc8e68ef39 -SIG = 2a3d27dc40d0a8127949a3b7f908b3688f63b7f14f651aacd715940bdbe27a0809aac142f47ab0e1e44fa490ba87ce5392f33a891539caf1ef4c367cae54500c - -SEED = f8148f7506b775ef46fdc8e8c756516812d47d6cfbfa318c27c9a22641e56f17 -PUB = 0445e456dacc7d5b0bbed23c8200cdb74bdcb03e4c7b73f0a2b9b46eac5d4372 -MESSAGE = 7368724a5b0efb57d28d97622dbde725af -SIG = 3653ccb21219202b8436fb41a32ba2618c4a133431e6e63463ceb3b6106c4d56e1d2ba165ba76eaad3dc39bffb130f1de3d8e6427db5b71938db4e272bc3e20b - -SEED = 77f88691c4eff23ebb7364947092951a5ff3f10785b417e918823a552dab7c75 -PUB = 74d29127f199d86a8676aec33b4ce3f225ccb191f52c191ccd1e8cca65213a6b -MESSAGE = bd8e05033f3a8bcdcbf4beceb70901c82e31 -SIG = fbe929d743a03c17910575492f3092ee2a2bf14a60a3fcacec74a58c7334510fc262db582791322d6c8c41f1700adb80027ecabc14270b703444ae3ee7623e0a - -SEED = ab6f7aee6a0837b334ba5eb1b2ad7fcecfab7e323cab187fe2e0a95d80eff132 -PUB = 5b96dca497875bf9664c5e75facf3f9bc54bae913d66ca15ee85f1491ca24d2c -MESSAGE = 8171456f8b907189b1d779e26bc5afbb08c67a -SIG = 73bca64e9dd0db88138eedfafcea8f5436cfb74bfb0e7733cf349baa0c49775c56d5934e1d38e36f39b7c5beb0a836510c45126f8ec4b6810519905b0ca07c09 - -SEED = 8d135de7c8411bbdbd1b31e5dc678f2ac7109e792b60f38cd24936e8a898c32d -PUB = 1ca281938529896535a7714e3584085b86ef9fec723f42819fc8dd5d8c00817f -MESSAGE = 8ba6a4c9a15a244a9c26bb2a59b1026f21348b49 -SIG = a1adc2bc6a2d980662677e7fdff6424de7dba50f5795ca90fdf3e96e256f3285cac71d3360482e993d0294ba4ec7440c61affdf35fe83e6e04263937db93f105 - -SEED = 0e765d720e705f9366c1ab8c3fa84c9a44370c06969f803296884b2846a652a4 -PUB = 7fae45dd0a05971026d410bc497af5be7d0827a82a145c203f625dfcb8b03ba8 -MESSAGE = 1d566a6232bbaab3e6d8804bb518a498ed0f904986 -SIG = bb61cf84de61862207c6a455258bc4db4e15eea0317ff88718b882a06b5cf6ec6fd20c5a269e5d5c805bafbcc579e2590af414c7c227273c102a10070cdfe80f - -SEED = db36e326d676c2d19cc8fe0c14b709202ecfc761d27089eb6ea4b1bb021ecfa7 -PUB = 48359b850d23f0715d94bb8bb75e7e14322eaf14f06f28a805403fbda002fc85 -MESSAGE = 1b0afb0ac4ba9ab7b7172cddc9eb42bba1a64bce47d4 -SIG = b6dcd09989dfbac54322a3ce87876e1d62134da998c79d24b50bd7a6a797d86a0e14dc9d7491d6c14a673c652cfbec9f962a38c945da3b2f0879d0b68a921300 - -SEED = c89955e0f7741d905df0730b3dc2b0ce1a13134e44fef3d40d60c020ef19df77 -PUB = fdb30673402faf1c8033714f3517e47cc0f91fe70cf3836d6c23636e3fd2287c -MESSAGE = 507c94c8820d2a5793cbf3442b3d71936f35fe3afef316 -SIG = 7ef66e5e86f2360848e0014e94880ae2920ad8a3185a46b35d1e07dea8fa8ae4f6b843ba174d99fa7986654a0891c12a794455669375bf92af4cc2770b579e0c - -SEED = 4e62627fc221142478aee7f00781f817f662e3b75db29bb14ab47cf8e84104d6 -PUB = b1d39801892027d58a8c64335163195893bfc1b61dbeca3260497e1f30371107 -MESSAGE = d3d615a8472d9962bb70c5b5466a3d983a4811046e2a0ef5 -SIG = 836afa764d9c48aa4770a4388b654e97b3c16f082967febca27f2fc47ddfd9244b03cfc729698acf5109704346b60b230f255430089ddc56912399d1122de70a - -SEED = 6b83d7da8908c3e7205b39864b56e5f3e17196a3fc9c2f5805aad0f5554c142d -PUB = d0c846f97fe28585c0ee159015d64c56311c886eddcc185d296dbb165d2625d6 -MESSAGE = 6ada80b6fa84f7034920789e8536b82d5e4678059aed27f71c -SIG = 16e462a29a6dd498685a3718b3eed00cc1598601ee47820486032d6b9acc9bf89f57684e08d8c0f05589cda2882a05dc4c63f9d0431d6552710812433003bc08 - -SEED = 19a91fe23a4e9e33ecc474878f57c64cf154b394203487a7035e1ad9cd697b0d -PUB = 2bf32ba142ba4622d8f3e29ecd85eea07b9c47be9d64412c9b510b27dd218b23 -MESSAGE = 82cb53c4d5a013bae5070759ec06c3c6955ab7a4050958ec328c -SIG = 881f5b8c5a030df0f75b6634b070dd27bd1ee3c08738ae349338b3ee6469bbf9760b13578a237d5182535ede121283027a90b5f865d63a6537dca07b44049a0f - -SEED = 1d5b8cb6215c18141666baeefcf5d69dad5bea9a3493dddaa357a4397a13d4de -PUB = 94d23d977c33e49e5e4992c68f25ec99a27c41ce6b91f2bfa0cd8292fe962835 -MESSAGE = a9a8cbb0ad585124e522abbfb40533bdd6f49347b55b18e8558cb0 -SIG = 3acd39bec8c3cd2b44299722b5850a0400c1443590fd4861d59aae7496acb3df73fc3fdf7969ae5f50ba47dddc435246e5fd376f6b891cd4c2caf5d614b6170c - -SEED = 6a91b3227c472299089bdce9356e726a40efd840f11002708b7ee55b64105ac2 -PUB = 9d084aa8b97a6b9bafa496dbc6f76f3306a116c9d917e681520a0f914369427e -MESSAGE = 5cb6f9aa59b80eca14f6a68fb40cf07b794e75171fba96262c1c6adc -SIG = f5875423781b66216cb5e8998de5d9ffc29d1d67107054ace3374503a9c3ef811577f269de81296744bd706f1ac478caf09b54cdf871b3f802bd57f9a6cb9101 - -SEED = 93eaa854d791f05372ce72b94fc6503b2ff8ae6819e6a21afe825e27ada9e4fb -PUB = 16cee8a3f2631834c88b670897ff0b08ce90cc147b4593b3f1f403727f7e7ad5 -MESSAGE = 32fe27994124202153b5c70d3813fdee9c2aa6e7dc743d4d535f1840a5 -SIG = d834197c1a3080614e0a5fa0aaaa808824f21c38d692e6ffbd200f7dfb3c8f44402a7382180b98ad0afc8eec1a02acecf3cb7fde627b9f18111f260ab1db9a07 - -SEED = 941cac69fb7b1815c57bb987c4d6c2ad2c35d5f9a3182a79d4ba13eab253a8ad -PUB = 23be323c562dfd71ce65f5bba56a74a3a6dfc36b573d2f94f635c7f9b4fd5a5b -MESSAGE = bb3172795710fe00054d3b5dfef8a11623582da68bf8e46d72d27cece2aa -SIG = 0f8fad1e6bde771b4f5420eac75c378bae6db5ac6650cd2bc210c1823b432b48e016b10595458ffab92f7a8989b293ceb8dfed6c243a2038fc06652aaaf16f02 - -SEED = 1acdbb793b0384934627470d795c3d1dd4d79cea59ef983f295b9b59179cbb28 -PUB = 3f60c7541afa76c019cf5aa82dcdb088ed9e4ed9780514aefb379dabc844f31a -MESSAGE = 7cf34f75c3dac9a804d0fcd09eba9b29c9484e8a018fa9e073042df88e3c56 -SIG = be71ef4806cb041d885effd9e6b0fbb73d65d7cdec47a89c8a994892f4e55a568c4cc78d61f901e80dbb628b86a23ccd594e712b57fa94c2d67ec26634878507 - -SEED = 8ed7a797b9cea8a8370d419136bcdf683b759d2e3c6947f17e13e2485aa9d420 -PUB = b49f3a78b1c6a7fca8f3466f33bc0e929f01fba04306c2a7465f46c3759316d9 -MESSAGE = a750c232933dc14b1184d86d8b4ce72e16d69744ba69818b6ac33b1d823bb2c3 -SIG = 04266c033b91c1322ceb3446c901ffcf3cc40c4034e887c9597ca1893ba7330becbbd8b48142ef35c012c6ba51a66df9308cb6268ad6b1e4b03e70102495790b - -SEED = f2ab396fe8906e3e5633e99cabcd5b09df0859b516230b1e0450b580b65f616c -PUB = 8ea074245159a116aa7122a25ec16b891d625a68f33660423908f6bdc44f8c1b -MESSAGE = 5a44e34b746c5fd1898d552ab354d28fb4713856d7697dd63eb9bd6b99c280e187 -SIG = a06a23d982d81ab883aae230adbc368a6a9977f003cebb00d4c2e4018490191a84d3a282fdbfb2fc88046e62de43e15fb575336b3c8b77d19ce6a009ce51f50c - -SEED = 550a41c013f79bab8f06e43ad1836d51312736a9713806fafe6645219eaa1f9d -PUB = af6b7145474dc9954b9af93a9cdb34449d5b7c651c824d24e230b90033ce59c0 -MESSAGE = 8bc4185e50e57d5f87f47515fe2b1837d585f0aae9e1ca383b3ec908884bb900ff27 -SIG = 16dc1e2b9fa909eefdc277ba16ebe207b8da5e91143cde78c5047a89f681c33c4e4e3428d5c928095903a811ec002d52a39ed7f8b3fe1927200c6dd0b9ab3e04 - -SEED = 19ac3e272438c72ddf7b881964867cb3b31ff4c793bb7ea154613c1db068cb7e -PUB = f85b80e050a1b9620db138bfc9e100327e25c257c59217b601f1f6ac9a413d3f -MESSAGE = 95872d5f789f95484e30cbb0e114028953b16f5c6a8d9f65c003a83543beaa46b38645 -SIG = ea855d781cbea4682e350173cb89e8619ccfddb97cdce16f9a2f6f6892f46dbe68e04b12b8d88689a7a31670cdff409af98a93b49a34537b6aa009d2eb8b4701 - -SEED = ca267de96c93c238fafb1279812059ab93ac03059657fd994f8fa5a09239c821 -PUB = 017370c879090a81c7f272c2fc80e3aac2bc603fcb379afc98691160ab745b26 -MESSAGE = e05f71e4e49a72ec550c44a3b85aca8f20ff26c3ee94a80f1b431c7d154ec9603ee02531 -SIG = ac957f82335aa7141e96b59d63e3ccee95c3a2c47d026540c2af42dc9533d5fd81827d1679ad187aeaf37834915e75b147a9286806c8017516ba43dd051a5e0c - -SEED = 3dff5e899475e7e91dd261322fab09980c52970de1da6e2e201660cc4fce7032 -PUB = f30162bac98447c4042fac05da448034629be2c6a58d30dfd578ba9fb5e3930b -MESSAGE = 938f0e77621bf3ea52c7c4911c5157c2d8a2a858093ef16aa9b107e69d98037ba139a3c382 -SIG = 5efe7a92ff9623089b3e3b78f352115366e26ba3fb1a416209bc029e9cadccd9f4affa333555a8f3a35a9d0f7c34b292cae77ec96fa3adfcaadee2d9ced8f805 - -SEED = 9a6b847864e70cfe8ba6ab22fa0ca308c0cc8bec7141fbcaa3b81f5d1e1cfcfc -PUB = 34ad0fbdb2566507a81c2b1f8aa8f53dccaa64cc87ada91b903e900d07eee930 -MESSAGE = 838367471183c71f7e717724f89d401c3ad9863fd9cc7aa3cf33d3c529860cb581f3093d87da -SIG = 2ab255169c489c54c732232e37c87349d486b1eba20509dbabe7fed329ef08fd75ba1cd145e67b2ea26cb5cc51cab343eeb085fe1fd7b0ec4c6afcd9b979f905 - -SEED = 575be07afca5d063c238cd9b8028772cc49cda34471432a2e166e096e2219efc -PUB = 94e5eb4d5024f49d7ebf79817c8de11497dc2b55622a51ae123ffc749dbb16e0 -MESSAGE = 33e5918b66d33d55fe717ca34383eae78f0af82889caf6696e1ac9d95d1ffb32cba755f9e3503e -SIG = 58271d44236f3b98c58fd7ae0d2f49ef2b6e3affdb225aa3ba555f0e11cc53c23ad19baf24346590d05d7d5390582082cf94d39cad6530ab93d13efb39279506 - -SEED = 15ffb45514d43444d61fcb105e30e135fd268523dda20b82758b179423110441 -PUB = 1772c5abc2d23fd2f9d1c3257be7bc3c1cd79cee40844b749b3a7743d2f964b8 -MESSAGE = da9c5559d0ea51d255b6bd9d7638b876472f942b330fc0e2b30aea68d77368fce4948272991d257e -SIG = 6828cd7624e793b8a4ceb96d3c2a975bf773e5ff6645f353614058621e58835289e7f31f42dfe6af6d736f2644511e320c0fa698582a79778d18730ed3e8cb08 - -SEED = fe0568642943b2e1afbfd1f10fe8df87a4236bea40dce742072cb21886eec1fa -PUB = 299ebd1f13177dbdb66a912bbf712038fdf73b06c3ac020c7b19126755d47f61 -MESSAGE = c59d0862ec1c9746abcc3cf83c9eeba2c7082a036a8cb57ce487e763492796d47e6e063a0c1feccc2d -SIG = d59e6dfcc6d7e3e2c58dec81e985d245e681acf6594a23c59214f7bed8015d813c7682b60b3583440311e72a8665ba2c96dec23ce826e160127e18132b030404 - -SEED = 5ecb16c2df27c8cf58e436a9d3affbd58e9538a92659a0f97c4c4f994635a8ca -PUB = da768b20c437dd3aa5f84bb6a077ffa34ab68501c5352b5cc3fdce7fe6c2398d -MESSAGE = 56f1329d9a6be25a6159c72f12688dc8314e85dd9e7e4dc05bbecb7729e023c86f8e0937353f27c7ede9 -SIG = 1c723a20c6772426a670e4d5c4a97c6ebe9147f71bb0a415631e44406e290322e4ca977d348fe7856a8edc235d0fe95f7ed91aefddf28a77e2c7dbfd8f552f0a - -SEED = d599d637b3c30a82a9984e2f758497d144de6f06b9fba04dd40fd949039d7c84 -PUB = 6791d8ce50a44689fc178727c5c3a1c959fbeed74ef7d8e7bd3c1ab4da31c51f -MESSAGE = a7c04e8ba75d0a03d8b166ad7a1d77e1b91c7aaf7befdd99311fc3c54a684ddd971d5b3211c3eeaff1e54e -SIG = ebf10d9ac7c96108140e7def6fe9533d727646ff5b3af273c1df95762a66f32b65a09634d013f54b5dd6011f91bc336ca8b355ce33f8cfbec2535a4c427f8205 - -SEED = 30ab8232fa7018f0ce6c39bd8f782fe2e159758bb0f2f4386c7f28cfd2c85898 -PUB = ecfb6a2bd42f31b61250ba5de7e46b4719afdfbc660db71a7bd1df7b0a3abe37 -MESSAGE = 63b80b7956acbecf0c35e9ab06b914b0c7014fe1a4bbc0217240c1a33095d707953ed77b15d211adaf9b97dc -SIG = 9af885344cc7239498f712df80bc01b80638291ed4a1d28baa5545017a72e2f65649ccf9603da6eb5bfab9f5543a6ca4a7af3866153c76bf66bf95def615b00c - -SEED = 0ddcdc872c7b748d40efe96c2881ae189d87f56148ed8af3ebbbc80324e38bdd -PUB = 588ddadcbcedf40df0e9697d8bb277c7bb1498fa1d26ce0a835a760b92ca7c85 -MESSAGE = 65641cd402add8bf3d1d67dbeb6d41debfbef67e4317c35b0a6d5bbbae0e034de7d670ba1413d056f2d6f1de12 -SIG = c179c09456e235fe24105afa6e8ec04637f8f943817cd098ba95387f9653b2add181a31447d92d1a1ddf1ceb0db62118de9dffb7dcd2424057cbdff5d41d0403 - -SEED = 89f0d68299ba0a5a83f248ae0c169f8e3849a9b47bd4549884305c9912b46603 -PUB = aba3e795aab2012acceadd7b3bd9daeeed6ff5258bdcd7c93699c2a3836e3832 -MESSAGE = 4f1846dd7ad50e545d4cfbffbb1dc2ff145dc123754d08af4e44ecc0bc8c91411388bc7653e2d893d1eac2107d05 -SIG = 2c691fa8d487ce20d5d2fa41559116e0bbf4397cf5240e152556183541d66cf753582401a4388d390339dbef4d384743caa346f55f8daba68ba7b9131a8a6e0b - -SEED = 0a3c1844e2db070fb24e3c95cb1cc6714ef84e2ccd2b9dd2f1460ebf7ecf13b1 -PUB = 72e409937e0610eb5c20b326dc6ea1bbbc0406701c5cd67d1fbde09192b07c01 -MESSAGE = 4c8274d0ed1f74e2c86c08d955bde55b2d54327e82062a1f71f70d536fdc8722cdead7d22aaead2bfaa1ad00b82957 -SIG = 87f7fdf46095201e877a588fe3e5aaf476bd63138d8a878b89d6ac60631b3458b9d41a3c61a588e1db8d29a5968981b018776c588780922f5aa732ba6379dd05 - -SEED = c8d7a8818b98dfdb20839c871cb5c48e9e9470ca3ad35ba2613a5d3199c8ab23 -PUB = 90d2efbba4d43e6b2b992ca16083dbcfa2b322383907b0ee75f3e95845d3c47f -MESSAGE = 783e33c3acbdbb36e819f544a7781d83fc283d3309f5d3d12c8dcd6b0b3d0e89e38cfd3b4d0885661ca547fb9764abff -SIG = fa2e994421aef1d5856674813d05cbd2cf84ef5eb424af6ecd0dc6fdbdc2fe605fe985883312ecf34f59bfb2f1c9149e5b9cc9ecda05b2731130f3ed28ddae0b - -SEED = b482703612d0c586f76cfcb21cfd2103c957251504a8c0ac4c86c9c6f3e429ff -PUB = fd711dc7dd3b1dfb9df9704be3e6b26f587fe7dd7ba456a91ba43fe51aec09ad -MESSAGE = 29d77acfd99c7a0070a88feb6247a2bce9984fe3e6fbf19d4045042a21ab26cbd771e184a9a75f316b648c6920db92b87b -SIG = 58832bdeb26feafc31b46277cf3fb5d7a17dfb7ccd9b1f58ecbe6feb979666828f239ba4d75219260ecac0acf40f0e5e2590f4caa16bbbcd8a155d347967a607 - -SEED = 84e50dd9a0f197e3893c38dbd91fafc344c1776d3a400e2f0f0ee7aa829eb8a2 -PUB = 2c50f870ee48b36b0ac2f8a5f336fb090b113050dbcc25e078200a6e16153eea -MESSAGE = f3992cde6493e671f1e129ddca8038b0abdb77bb9035f9f8be54bd5d68c1aeff724ff47d29344391dc536166b8671cbbf123 -SIG = 69e6a4491a63837316e86a5f4ba7cd0d731ecc58f1d0a264c67c89befdd8d3829d8de13b33cc0bf513931715c7809657e2bfb960e5c764c971d733746093e500 - -SEED = b322d46577a2a991a4d1698287832a39c487ef776b4bff037a05c7f1812bdeec -PUB = eb2bcadfd3eec2986baff32b98e7c4dbf03ff95d8ad5ff9aa9506e5472ff845f -MESSAGE = 19f1bf5dcf1750c611f1c4a2865200504d82298edd72671f62a7b1471ac3d4a30f7de9e5da4108c52a4ce70a3e114a52a3b3c5 -SIG = c7b55137317ca21e33489ff6a9bfab97c855dc6f85684a70a9125a261b56d5e6f149c5774d734f2d8debfc77b721896a8267c23768e9badb910eef83ec258802 - -SEED = 960cab5034b9838d098d2dcbf4364bec16d388f6376d73a6273b70f82bbc98c0 -PUB = 5e3c19f2415acf729f829a4ebd5c40e1a6bc9fbca95703a9376087ed0937e51a -MESSAGE = f8b21962447b0a8f2e4279de411bea128e0be44b6915e6cda88341a68a0d818357db938eac73e0af6d31206b3948f8c48a447308 -SIG = 27d4c3a1811ef9d4360b3bdd133c2ccc30d02c2f248215776cb07ee4177f9b13fc42dd70a6c2fed8f225c7663c7f182e7ee8eccff20dc7b0e1d5834ec5b1ea01 - -SEED = eb77b2638f23eebc82efe45ee9e5a0326637401e663ed029699b21e6443fb48e -PUB = 9ef27608961ac711de71a6e2d4d4663ea3ecd42fb7e4e8627c39622df4af0bbc -MESSAGE = 99e3d00934003ebafc3e9fdb687b0f5ff9d5782a4b1f56b9700046c077915602c3134e22fc90ed7e690fddd4433e2034dcb2dc99ab -SIG = 18dc56d7bd9acd4f4daa78540b4ac8ff7aa9815f45a0bba370731a14eaabe96df8b5f37dbf8eae4cb15a64b244651e59d6a3d6761d9e3c50f2d0cbb09c05ec06 - -SEED = b625aa89d3f7308715427b6c39bbac58effd3a0fb7316f7a22b99ee5922f2dc9 -PUB = 65a99c3e16fea894ec33c6b20d9105e2a04e2764a4769d9bbd4d8bacfeab4a2e -MESSAGE = e07241dbd3adbe610bbe4d005dd46732a4c25086ecb8ec29cd7bca116e1bf9f53bfbf3e11fa49018d39ff1154a06668ef7df5c678e6a -SIG = 01bb901d83b8b682d3614af46a807ba2691358feb775325d3423f549ff0aa5757e4e1a74e9c70f9721d8f354b319d4f4a1d91445c870fd0ffb94fed64664730d - -SEED = b1c9f8bd03fe82e78f5c0fb06450f27dacdf716434db268275df3e1dc177af42 -PUB = 7fc88b1f7b3f11c629be671c21621f5c10672fafc8492da885742059ee6774cf -MESSAGE = 331da7a9c1f87b2ac91ee3b86d06c29163c05ed6f8d8a9725b471b7db0d6acec7f0f702487163f5eda020ca5b493f399e1c8d308c3c0c2 -SIG = 4b229951ef262f16978f7914bc672e7226c5f8379d2778c5a2dc0a2650869f7acfbd0bcd30fdb0619bb44fc1ae5939b87cc318133009c20395b6c7eb98107701 - -SEED = 6d8cdb2e075f3a2f86137214cb236ceb89a6728bb4a200806bf3557fb78fac69 -PUB = 57a04c7a5113cddfe49a4c124691d46c1f9cdc8f343f9dcb72a1330aeca71fda -MESSAGE = 7f318dbd121c08bfddfeff4f6aff4e45793251f8abf658403358238984360054f2a862c5bb83ed89025d2014a7a0cee50da3cb0e76bbb6bf -SIG = a6cbc947f9c87d1455cf1a708528c090f11ecee4855d1dbaadf47454a4de55fa4ce84b36d73a5b5f8f59298ccf21992df492ef34163d87753b7e9d32f2c3660b - -SEED = 47adc6d6bf571ee9570ca0f75b604ac43e303e4ab339ca9b53cacc5be45b2ccb -PUB = a3f527a1c1f17dfeed92277347c9f98ab475de1755b0ab546b8a15d01b9bd0be -MESSAGE = ce497c5ff5a77990b7d8f8699eb1f5d8c0582f70cb7ac5c54d9d924913278bc654d37ea227590e15202217fc98dac4c0f3be2183d133315739 -SIG = 4e8c318343c306adbba60c92b75cb0569b9219d8a86e5d57752ed235fc109a43c2cf4e942cacf297279fbb28675347e08027722a4eb7395e00a17495d32edf0b - -SEED = 3c19b50b0fe47961719c381d0d8da9b9869d312f13e3298b97fb22f0af29cbbe -PUB = 0f7eda091499625e2bae8536ea35cda5483bd16a9c7e416b341d6f2c83343612 -MESSAGE = 8ddcd63043f55ec3bfc83dceae69d8f8b32f4cdb6e2aebd94b4314f8fe7287dcb62732c9052e7557fe63534338efb5b6254c5d41d2690cf5144f -SIG = efbd41f26a5d62685516f882b6ec74e0d5a71830d203c231248f26e99a9c6578ec900d68cdb8fa7216ad0d24f9ecbc9ffa655351666582f626645395a31fa704 - -SEED = 34e1e9d539107eb86b393a5ccea1496d35bc7d5e9a8c5159d957e4e5852b3eb0 -PUB = 0ecb2601d5f7047428e9f909883a12420085f04ee2a88b6d95d3d7f2c932bd76 -MESSAGE = a6d4d0542cfe0d240a90507debacabce7cbbd48732353f4fad82c7bb7dbd9df8e7d9a16980a45186d8786c5ef65445bcc5b2ad5f660ffc7c8eaac0 -SIG = 32d22904d3e7012d6f5a441b0b4228064a5cf95b723a66b048a087ecd55920c31c204c3f2006891a85dd1932e3f1d614cfd633b5e63291c6d8166f3011431e09 - -SEED = 49dd473ede6aa3c866824a40ada4996c239a20d84c9365e4f0a4554f8031b9cf -PUB = 788de540544d3feb0c919240b390729be487e94b64ad973eb65b4669ecf23501 -MESSAGE = 3a53594f3fba03029318f512b084a071ebd60baec7f55b028dc73bfc9c74e0ca496bf819dd92ab61cd8b74be3c0d6dcd128efc5ed3342cba124f726c -SIG = d2fde02791e720852507faa7c3789040d9ef86646321f313ac557f4002491542dd67d05c6990cdb0d495501fbc5d5188bfbb84dc1bf6098bee0603a47fc2690f - -SEED = 331c64da482b6b551373c36481a02d8136ecadbb01ab114b4470bf41607ac571 -PUB = 52a00d96a3148b4726692d9eff89160ea9f99a5cc4389f361fed0bb16a42d521 -MESSAGE = 20e1d05a0d5b32cc8150b8116cef39659dd5fb443ab15600f78e5b49c45326d9323f2850a63c3808859495ae273f58a51e9de9a145d774b40ba9d753d3 -SIG = 22c99aa946ead39ac7997562810c01c20b46bd610645bd2d56dcdcbaacc5452c74fbf4b8b1813b0e94c30d808ce5498e61d4f7ccbb4cc5f04dfc6140825a9600 - -SEED = 5c0b96f2af8712122cf743c8f8dc77b6cd5570a7de13297bb3dde1886213cce2 -PUB = 0510eaf57d7301b0e1d527039bf4c6e292300a3a61b4765434f3203c100351b1 -MESSAGE = 54e0caa8e63919ca614b2bfd308ccfe50c9ea888e1ee4446d682cb5034627f97b05392c04e835556c31c52816a48e4fb196693206b8afb4408662b3cb575 -SIG = 06e5d8436ac7705b3a90f1631cdd38ec1a3fa49778a9b9f2fa5ebea4e7d560ada7dd26ff42fafa8ba420323742761aca6904940dc21bbef63ff72daab45d430b - -SEED = de84f2435f78dedb87da18194ff6a336f08111150def901c1ac418146eb7b54a -PUB = d3a92bbaa4d63af79c2226a7236e6427428df8b362427f873023b22d2f5e03f2 -MESSAGE = 205135ec7f417c858072d5233fb36482d4906abd60a74a498c347ff248dfa2722ca74e879de33169fadc7cd44d6c94a17d16e1e630824ba3e0df22ed68eaab -SIG = 471ebc973cfdaceec07279307368b73be35bc6f8d8312b70150567369096706dc471126c3576f9f0eb550df5ac6a525181110029dd1fc11174d1aaced48d630f - -SEED = ba4d6e67b2ce67a1e44326494044f37a442f3b81725bc1f9341462718b55ee20 -PUB = f73fa076f84b6db675a5fda5ad67e351a41e8e7f29add16809ca010387e9c6cc -MESSAGE = 4bafdac9099d4057ed6dd08bcaee8756e9a40f2cb9598020eb95019528409bbea38b384a59f119f57297bfb2fa142fc7bb1d90dbddde772bcde48c5670d5fa13 -SIG = 57b9d2a711207f837421bae7dd48eaa18eab1a9a70a0f1305806fee17b458f3a0964b302d1834d3e0ac9e8496f000b77f0083b41f8a957e632fbc7840eee6a06 - -SEED = 0d131c45aea6f3a4e1b9a2cf60c55104587efaa846b222bf0a7b74ce7a3f63b6 -PUB = 3c6729dbe93b499c4e614a2f21beb729438d498e1ac8d14cbad9717a5dbd97cd -MESSAGE = b4291d08b88fb2f7b8f99d0dce40079fcbab718bbd8f4e8eabc3c1428b6a071fb2a3c8eba1cacccfa871b365c708bef2685bc13e6b80bc14a5f249170ffc56d014 -SIG = a9c5ee86fb06d9e46b379c32dda7c92c9c13db274dc24116fbdd878696045488cc75a52fff67d1a5113d06e333ac67ff664b3f2a405fa1d14dd5bbb97409b606 - -SEED = a75e3b6b4170e444781be4eeac3e0fdaa4b4356f705486bcb071a325ae071fba -PUB = 993d38a7d72f0aee15ff6f4fdc37ca7724fd1373a3766b275dbc77e647980e0a -MESSAGE = 4037866f6548b01cc6bcf3a940e3945aa2d188b4b7f182aa77ec4d6b0428ab5b84d85df192a5a38ada089d76fa26bf67736a7041a5eb8f0c5719eb396693c45160f8 -SIG = a5db4d3d3329abe3697959e6b5947ea8601b03ef8e1d6fe202144931272ca0a09b5eb0f390572ea7ef03c6131e9de5f16bf0b034244f7e104ff5311bbf663a0d - -SEED = bcbcf561ecc05a41c7d7e55e696d32ce39b4d03c1f5f3f3a8927fe5e62e844b2 -PUB = 4ddf53fad6a7a9ed30f3afecca136fd7843b72c243090891ae4021a32cadff1a -MESSAGE = 6f6716b6784740980aebc3248807e31c1286ac7b681c00b66c88ff7a336d441fa5c3eb256d20cf6d1ac92ccfe4be6dcc41b1aff846d360c243001cabdfbf1a9b240455 -SIG = 9ff15115f6661f3211d7a40764967629ba6a5263951bdc3c6a4c90d070f7be00024b80d83b6bc27587fcff5f5ccc0eb3cde1497cf56895147a063f61f08adf0b - -SEED = 210532805fa9cc9be916d213cac374e3cd6fc2602a544d0c1ce29d30105d69ab -PUB = 10699e499be99e2b11b98f6f86b67cdc4ccf69f3c53ce094875647d2d0d0ecc5 -MESSAGE = 9fc4d28cfd25e6c0c5e724e19ca39d71e53bf4aa2796c54c3351f108fc70f2611a62e0ab90af6ade5216788e9eb2a873059b1e79d7d59debd68f2d4d80ffe31bf74b928c -SIG = 4c2d31d5bbc42e026dc1e079ecc4dd072c5d2cce65e3db8d8a1dd9057faa0371727f727231a0f060fa27097533b6db3b8f6252f2793d75662caadf5f0fcc710e - -SEED = 185d64b69479e0ba0a5844a10ad84125ba11c4b40d63eda2c57afc7e019c8e0c -PUB = a5764f6398a5ae2266a38f9714533c4bbd8d07826f63e204cbac374b0acef1bd -MESSAGE = 4a0824fe70d4315413d0a0cafbf4f5fe117d5e07e1c3a4effb9d0ae91490234878ccf6792a91f68c6a520de16071f08abe35dc5ea428f1957b663371ce24c609dd55b8f493 -SIG = 43e0387da5ba09a190f6e7b2680578d889769bcc445e5ef571b492871c155c5b9f620bfacfbf2df1fd87444604b71b2e237baaa7ee2093ede4a601edf883e307 - -SEED = cfa9d9164b3c4f6f722635d2066cd7ea5e5533d2c74f8add669c371faa476426 -PUB = 41169a66f9a63f285782a6c2db81cc3f70b3ada21a68c84745c88a74c3b0a2de -MESSAGE = 757621b1675db7cacef7f2782587ff3af51a3ef2f4bcf9279c4ce94002e1f00424bf0eb621982cc85cb4d171e564a0c2f6e3567a1aae2cddb7e9b25f47dc20a51050542969ca -SIG = 01d7c9b5701af71e2f4877ffc9b7b5305f52816d4458e37e41c7719fac1d76a01fff3f50fe1a5875ccc3fb70001c947a33fc8b207de13572ccdb8ba98933ab01 - -SEED = 1acb4a256c2f8993ca24de1e0014606d668b5e756032d269f1d24d351c8eea4a -PUB = cbbdcd8cbc885ab43a057e5f9579f1161954159e7b562ea26cd9a43c88d3f96d -MESSAGE = c46a6d61aa0aed1c1d8547a70b89b7196475d5a4870881b1ecd0f0cb9c745f8a2adc8024e2dc55b53aa5d383a81aabc1a47e8d07d00b7f0b56ceddbfb1f424bb5c02184678a666 -SIG = 05aa76f7fe51892303d78914715995e7d768ff7714ce270f175e56af17ae018d3fa939f5f620de82bcd1549687b205c7871203e624238c4e309fab7f92fbaa05 - -SEED = ace3c46424823622979fc3a84a7da69c1d527d8312e8fb018375bd3a96c29c18 -PUB = 937cf34136d9e1cce0de11b12c70cbfb7455448421e92c82e7c40934bff8c676 -MESSAGE = a9f137bc9021bf105aee25be21cd9ee5b3547cf10cc5f98476fb588bd70e2d6d6b0834e842e4ee94303cf96b09c1715381b36e14a491b80f895ea421b8ec2b1d3c187e02935c5526 -SIG = feb8896dd3fe6001ffea171b37b788a69f7f850193a63406f56376dd263d099aef80ece67e2c43f40eca462c6b71e79406b18db74ae5d49844e3b132bc2a1307 - -SEED = 88f681934e33c35c07dc6e5a832942ae3d59903ccde2f76ccb7587cea7ec41b6 -PUB = 6a4e8aa5adb63d22fd7b14a26fdb03b7c8aa6ccd5a196f2c54b0465adb5092e1 -MESSAGE = 6e8bac1f853b81fef94707e18cc61c6f0a9cbc2a41d078dcc83fc0229c7f8dbe6dbdd90854b1f1ae2b9f2b120b86a8786b4e78ce23ab86baaf88754af0f3d88881dae0bc5261bfd038 -SIG = 45b27bf1b9eac06b62b686f6d546563b2dfe5b175dbef32bf78c35a16c958a9d4f26d291de9bb2066c0a286113cc09172d40a36d4cbd951708860226eb30cd05 - -SEED = 48050a6e0158f6ad253412e4497cff62d5ee555edffe59e4dc401522813295ce -PUB = 975e010abb9a3e56659137b0506057f283982f886ca172c7bc2c500ed9bd26c1 -MESSAGE = ed6eec29fb7049dff707f0a4426ebc8f5b350e95870b9d6198c8139e9c3e1e409937d1a858a0dea482a5cb1a854ed3b5a9397acb63bff6b64039ef2eb1159e99858310bbbd86125c3e0e -SIG = 7216ab60c35168187d0fce4753c86e80058d540b76bf95843a5898841060a99a44de6f439625a3f6365f59c377bf45909bbfef5c50b25f3194e5fbd34ea5e706 - -SEED = 18d13d0c00e8e3386a5cfb30a9e79fe88b1861ed2d1201eb170038e194770403 -PUB = a4afc833401876090d9b880c41267d68cbbeeaa38afb20884e27328f3b7f535e -MESSAGE = 910f6c272dd97931ac47310d244cadb43251365e02ba9f6a5b3c3226be9d7d3a74a2ba4906e8e71a4bf3d3556ebdfc666cd6b12f20c4a00834b88fbb244575199286b0b9344cf334aff007 -SIG = 033988154c5d79d2510be83e778015dfe2fb85b8111f7ec139918b5400e3d656ee80a9f5c9072b5b467a5cc5a57cc8ad1062b5bff10862d9d369dde2cc966701 - -SEED = 4adc8c28646a93a817293a14d29b48e2c6d712a68993547a5c5e4d1452acbc3a -PUB = 7f40473628f23fc0dff0021afd487740d4916a9122e6c97d36433e5ebf04f88c -MESSAGE = 09fb5501f1688f80a0ab9e22d778ae130acaf74d7f5185b4da198c6b9edac4302e2b753e578766e17d4056dc40d95cf4ca8bcc6565795e97d68bcda79fa77c493397716356164caab5d19cfd -SIG = 6d3b4e90ec408311f9b15b9253d3d95c5d152620c260d56302555a8804a5104ba5e8d29ee108e764a64219297298ab7674bbca784dee28773b34e185a386c208 - -SEED = f26e1c84697a4908151b447dcf6c7c7a38b04081db9e7c7738e6fec900bed0c1 -PUB = a86e1422c1235ff8e1aa083470d5e42288cb007ab50e795dd0b4ff87394966c4 -MESSAGE = 54ed47606a1487c2f900cefb6e899dbaf6c31cc88ebe3558b83b93f6d422c31e888e48e520eeaedd7e554a9cd40c2c519d533b6144cee484c389e976b1e4022b50e7dbb87ead7e541a2004daf7 -SIG = 44f3344b9566c9dfd22d6198e1cbf95d9e28f2982fc7f166ab25dda30c46f768c558e0394fb9ab3e1d4db4cf487c17641a13f3f48939e0c64827a75103c57406 - -SEED = cc0c33f3a86f5a17d30c186ce0f3b740bafa5fe3c7090f143541e2b2c1e534bc -PUB = 967a71c7cf9b82cc78cbe109104d8b438a8d1fd71d260d029046a9a4526866ff -MESSAGE = 1944e5e155d75e0d0be92e1be14cec370ad13791f2bfd40f271214e94fcf213c71bc20d7ce0c7584421ac4efc451883cc3f4956f21f73a4216720438bc38ff2cfdf3709905a50a9d94b1d9e7932b -SIG = e277b3dd655c33ff75fa920af1fcc859401e6c7a6ef4c6bfbfac5069638f19ca115baf13c09c82af793facb6abd0cd58e8481b08c1b68ad7a2665c4a614a2806 - -SEED = f0bc979375a7073068dba7f6c094db6598b4e45df7d549583c22fded8048fa2e -PUB = b42b6c57a78f1d90090a7181ab2ae09f426cbc2be96eb2cf27abc70d7d32a4b3 -MESSAGE = 27ab3049b5c6351f6cfe38b13a059f5037257ee3d65d6079656856edc876ea081fd8a9480466f8839478088466f51ecbfaf2d65def25f0c4dd8d08588202812232f57945df8a6fa161ed8c0343b583 -SIG = 19dbc3027f9fae707deb76f588f9fd07aa8eae29bd4e1d04c2c984388286b3b122248a6c03ed67eca35df4db3dc1e4237f267892518497d9552a21de19b5140f - -SEED = 3022975f298c0ad5ddbe90954f20e63ae0c0d2704cf13c221f5b3720af4dba32 -PUB = b845bce38e26ab027b8247463d437a71bbddca2a2381d81fad4c297df9140bd5 -MESSAGE = 9aa19a595d989378cdc06891887ef5f9c246e5f83c0b658710673e4e7db760c76354c4f5d1e90db04a23b4fb434c69384593d010e312b11d299c9f97482de887cecfe82ea723bca79a1bd64d03ef19ee -SIG = ae14a860fad0051b3eb72b3721a82f7b9546b2867261e2b7b638979e2561bdeb89b600768f82450a66c8b0481283fa21cb6c53bde350effb68a7d1114bfdb203 - -SEED = 0f710b6c481f71449589753312ef64932b4652ebe0e07597f7da1c4f3dcffb80 -PUB = 6973ff2932ccddfc1d16c4c0da50c8b29fe6452d1ee84d52064ebf3d628d403e -MESSAGE = 85d85744ad55e9ef9a65ca91e85c8a4f80e4c58f8e4e9354e833986098b7d9fe9fdc0dedb0d75d2539fba00034fc0c2e84344d1edaa09d4f63d5546d67803dd6b54ddcc0b1d3f2582dd75289e31de42e69 -SIG = 02a8d26aee11420fb4f09d1163e14b867df7c6f6c8f8dc7a78034659f0401cad0aa90397efdd0704b798db1936503026e2a1adc297e27974d4be312a3753f804 - -SEED = 7a05f121f60112dd16fee8c91bc2a11479f4b67ee33456042c8de167fc588017 -PUB = b3b05be989cea7197505d4b54335e5e1d77a4b52ba7282604bbc1cf6c4e87a6c -MESSAGE = d9c59e8cc4ede537be2122ab492a5b915a9b0a114b2ade356fc0457ef98722d5f567b86211e28369d14168ec4a3c804076e154adc70a668cf64a20d13cf190d115cd688d036e46938251df4964dc3517b10c -SIG = d30ce8a322b450a2fb1afd329cec8559ccf112bd83965f9ec4736270a0914e061196bf5209778c9f8ccf39c4668bbf0e1363f81afe45dd74e80d5875ddbf6f01 - -SEED = bf381f8dfb5d0c6d64e416ac23e0d0fcb86ebb899b1d146abd911b92a7808eb6 -PUB = 863fad8d1f1bc630a15f6fe8ecefe6b4497b60b21ae8830da46742045fef156f -MESSAGE = 8654f2f5c6dcd2cfcbb6ed8d2bc5fb5fec53e3effb0de65aac507fa56c897732395aa09946d3b6586a92edd6dc99315e1ba74c6a0247c4ba7760b948eb3c0932d9fe1f0e9fea6eb61a548a9ab48ffdf1547329 -SIG = 99b75378738fcac8067669e8509b5d2607e1ef76af9004e13fe5d3932df60b168216f58565340fa4d638055a89044ee7d45e2bd082a53382289a34700648980e - -SEED = 36983241a0a8e60ce02a61b3fafab15a7313a5a270d015b9c9ec070dc42deeda -PUB = 6647984d42b9a5b3b1afa3b7f8f49d4c2b05e38984e99cea8fd68235d2ae4627 -MESSAGE = cebb9e404451818253c0392a4554ee7323c5d5b8b226775700b806ed5b91337916ea7ecbc3d4103fc65e5372ae7e5f9ba2d8f5aee24ccf6e631ae20c4af9b5f728cdf89e8189def1a5b3d35347aa203525ea1d2e -SIG = ee37df8af422f91f85dfe43efe79f62378068ccdbaf3916eecbc3adfed0508bdebaf5ce06b3bc279f78087f0db8db3c6823edfb32c12217830be723d8872b30c - -SEED = d06899f93a408dacb41c969718346f1e289bb5ea65e283ff79c705a074517c35 -PUB = 46bf2a08a076c47d7f11b733f8141c355363ed85d7def26ba6a0ce15ac5f2be8 -MESSAGE = 0864c39ac4fda8eb9048597bd40be0401021fd2dd3a3390a8facce984b260a13fa2c7cfc00d192fadf134a0ad5a181ee89eff0c795eaa0fbfe2f3b26115d07168db42ed21a51303b1958e4a42dc065b22ce48f17a6 -SIG = 6f89de92a66bc5f4144339124950bdf588144cb372f6736245351c9476becc59a258f9a933ffff2bef4b46cd1057395225799fd09dede6823db0e325dbc8140d - -SEED = eebca7966970ee9f2cc4d74c6f1d8e0ebff7c45aebad349fb9f86df628dfff0e -PUB = 89101e0309f767e64ae9c98c4a5d8d2328fb3ef262d082f49b64ca209e1990f6 -MESSAGE = 0fac790adb9f59e5cb0ddcb2b667172f2a21034d93bcaddf188606fa9e776db33a8fcc6bd7f5567883fc0de351aa9afaa36d2075b1ba853bada849b8661d5c8154e7b0afea656dd15e01a9c5ba21589b02f8fc5481c2 -SIG = 7d447ee5328c9fe7f11936cc42998754a56cd1d2a6951af4fee7c4a8eb319d4923707c793c55d79067f822d5b16bb5776e38dffabc67237a916a81a63339b003 - -SEED = 3820b6b15939d0afe18c9cb3d9a2a08f167dd458eb6c7e3f1558b0c6db4c6890 -PUB = 80b85c6559fea8b400e1999cc5bfed507ad7fc294cd9ba0ce2dd2584a91089b0 -MESSAGE = 3e5ad92d44b40e8614d8087c9c743de0c0861a07f1f5146d71cac2f3740024e841cc2d46027cf5d261d3ee7c1875b39551017b5fb1468114fc3e098a899cdbd558b39f098e156b6e9801ebcdd65fed56dbfcaf2c8c787b -SIG = 823ee2c0c8d87faa0ec0141e9ce08b51e57c839792d1fbd97a967207fd415849ebfb5dadb5a1dc2c0a8b7fc63fc354857b8c90c44720e13f45cd01e7aa23140c - -SEED = 0d20fa4a37ff30c4dcc3e44ea7ac501137e5807e9781330ac310982cc3d39dbd -PUB = 67bb0a01bc8617b491eff1a326c1c70f7d0c5b95a5ad48241aedce1c6f0883cf -MESSAGE = 35e0f4b4a517f9c7aa4514f03e6d65f19b27c62cc069f6bf07dd6378bd6afe2b766560006cbd5730a00919ed11191fb0c8dac56e153fc1cea4bdce5046cccb717759a4083e1c16f740763264cc804de0d0e1a4b5a23067af -SIG = deab12ed82ba94b469ca98b66fa20444b4b7881c4f0f853409c9a1504a5b2b6d7860f26ada6bf73459b9cdb573c8017121338efa60f4148086d7a3a8ed59bb07 - -SEED = bee161881d819b370d240d509ba46b06fb828e20310d9f6b309780703e98927b -PUB = 10854380de89162bfb9f7835a2716a3a6e0265671b250b389d01c3bcc03736b8 -MESSAGE = 5a6fe599b6b09b05c0ba6a622df3a92b3d376d24d04ea85ebe767bc2ec4d14e83e6937dc0b914b4809fdb607906841a6fd1dcdf61aaea8f9bb81b2ccaa32df412989ae53646680a71a211c8440eab0f1aec5e4fc00e6a2c96d -SIG = b07d072eb3831fae8a06effa9201797496dce126b8e11fef2fa07f664dc5cf3d4bf9c38a8b3c09fb5f14fa2deb219e7d852fdd27c7ba32d309942f2746dfe404 - -SEED = 70150e9516164a3d7b7e8b6f255b65cac9f07459b32d11bb94b3d277208abc99 -PUB = 2328bec8e40351047882e8b43bc1ab085386fa47987e46ea87608814c5da713c -MESSAGE = 77be8eceaab431a13c2a28d0d1556489d8c392fd7ae41157f7caf082cb54e45f08626be0076be844d38fde901a5eab0e8832d69dac22fb8507fb8ec4faf7c88fd26da308461afe385987972b5e760a34a5e18b9a82b4aaa529b7 -SIG = eda3f5033ea7953a0d583c6457522e84ad78445304d48e577d4d69e8641febe15248d8d90ce0944a8f801d39099bc77494bac4ce2a20b38369c6adfb71e03d0f - -SEED = 3f87fcfdb421422a9c5fb98268313c15128c78844ef9eb3b3713fa77b6718903 -PUB = 533ec59228374bd03a4699e3a8896b86182fcf8fc3085fdb8f5c4671524d6fe0 -MESSAGE = c00fed2d689468bcbacccd446e8d8f299e2a86925e62e59709afaf4857469ff1e006d00fa3e18a3615f8f06b6ebdff785dde58851d2c239038a0c344dce985bd1fc8deb4779ae5f8932e2f9ed5990b6472dbe4e6fef6917657e0b5 -SIG = f6519d7edb6134111974033f03b8d89e9c76caec8965a8e17cd45fff19de2615d73eccdb4a6664a8f0e23adf98988e96251bf26eb7a4ccaac1079f0a772f9b05 - -SEED = 44ceef044ff998d4abeaaf374eb41d086718b63097b1e35f89634c14897132ea -PUB = e83c86677d03ed3a5e8c95f41f0b325ff4333702f2ff6936f57ff30aa31485c7 -MESSAGE = 8d3e2dec4644c7b51633b13e6375ca42ff9138465f43d7800c7313199f67c9cf1b520b1820bd630ecf1c992e2767b38eb5bbc441a4ab8d317db441db35a0fe3abe7a9e4541881c2d7b1a2612306959815d1da41267d9649dd4494ace -SIG = 554552d6b790d421d06b0a67f8e002ad7a1ed01c06cf00cbeaec2a268bda29f1183f0ceafc625fa5fdb847dc86fae1a20406e459d4a0177cb515220a568e0800 - -SEED = 98ef2a44d4c8476dff05aa78dcf9c6dc086cb2f622a06745d60cbf223faaba66 -PUB = 42fdb1daa39f0159119beec1bedf6f0394b26a2a29bd1fde081eccdadecc226a -MESSAGE = c8b5fcfc3c18c7d95957b668e91c731d50c7fcea4f9575bbf784625870e238df546e2cb1a19d2808dd5b230d3871fdec16100ee1fbf9b722fa3744a750a3b396b05f9c21b8c0f61ead57a78c5ecf72b579cfe88a3f404c8acf524f9ab9 -SIG = ab5e8724a3e6ff76058cfb214d574e04d05574ecdd4ffe8c07c7af396e882687c5d79ef1e62fbb4c5f1bd06b9bd897826edde0d111d918e8ef961ff2a00d7700 - -SEED = 93a8c792a239c931917c114824a0174f8bc4ebbf98af8c7e321e0f5bea4015ec -PUB = 9b2eaa8a9c2c25ff4f6e13bb12bae5d06fda0eb1105fafae5880ff168740bb74 -MESSAGE = 901bf4e041caf16e04f2ffde8d6fe97e93d0900f6bc0fc09a9a0179d137b4b7788e57eb92766a9c634f35adb5c2988af1e86208f461998f59cfec99204b484fbcad3951e7ee4405523705d9739b44307db03f713fda78db421ef3121b3ba -SIG = cfe32c4435d911d772dc0727e78d689d0164c5069597cb441b22c1d26236479f1afd7089121b9ab4f61bbb1fae1ab42f7635a92a53784d7170916b703aa5cc09 - -SEED = 7001fa0c4404c28aa5b5fcff30a961f21a22f5b85a9e382e07aea8a8924d0ec1 -PUB = daebb63c4d8f40ceba8ec35e3dd946a6b75bc74fcb29ade7b55eee3cc3aea5ca -MESSAGE = 44f48cfb02f08777a57873855f96be4c0291323f2739b275d90757a15472e5750436e0107408fe3026c00625689983f990eba9becbfce403ccd56356ad2741fd21445dfb23d76112e578b3395cf9d960955f1da8f399ca286f21390e25a59a -SIG = 64eac9ce87460618636b41fd2decc1673bfc48c5f479dfacb51e86686407374b1d10bf65d6d7474214d7770c9e5c7f806c80d53d48b720870e5e78f32e3a7e05 - -SEED = 3adce3a3d3fbc977dd4b300a74749f13a3b04a5d73a2cd75a994e3195efebdac -PUB = 6ff19b1f18d64851d5c74845c6407f0bf596a52e385e020127e83e54cff5ac19 -MESSAGE = fe6c1a31068e332d12aab37d99406568deaa36bdb277cee55304633bd0a267a850e203bb3fabe5110bcc1ca4316698ab1cf00f0b0f1d97ef2180887f0ec0991e8c1111f0c0e1d2b712433ad2b3071bd66e1d81f7fa47bb4bb31ac0f059bb3cb8 -SIG = 7dda89f85b40539f5ad8c6de4953f7094a715b63dda30ec7cf65a785ceae5fc688707ee00be682cecbe7ee37d8fc39ee6d83c64409681708a0898a183b288a06 - -SEED = 14803c1f23a47fcdd35e5d146e20ca630cd712c047d5330b652e31857acbc9e8 -PUB = 36f2d5bd6d8324fa6e9db7f7d854ebe48c0e6299998122e9d44b8adbef54f093 -MESSAGE = 555983679d026e5354b4cc055ae1bc14653c7281ec722372f3feb778e841da821b3d0b8ee7a9a9129ea06824be8379fbbdcb0748f423721ccb172a1bafa1d5ae9fc1c51e93d41dd551c3086079b620286c1c40c1223bbcbb76722e92ca21d8410a -SIG = 07a7de6ce97664b3ea0928e1385c3309be08a47cbf4daa9186a1b948c86fbba39c4efcfcb7a0a3866bc94c6788ffe6be0d4972e56d0c3292d1cc6e25447b9904 - -SEED = 1a61154d3472cd96b328ee674beb4fc86763a969fb410494e0678414e31a46a6 -PUB = 7576d93ac85d0fc61f258c55cf90bd87a635099c0e810ed0b937258d13b42559 -MESSAGE = 64c565efbcb8b9528ed47253f3c6a4035db781d6f0976b5e5ba8447d4ed54b04105293ef4c000d8b2e1b5b75e727e5d2a077743b50d183b491764801a2504d16ee6d7d8ac4fe40e6bfc2a8129c7285a5ac691c35e642ed162cf7fbc64516733a23b3 -SIG = ada1666c9c3b8284b8a21c4f2618ef0808a646f3f10941e470f738e1785e2de9fdd9c8cb526f945c7a8c6994f151b7d066581b1d755307947c62befc8ab7070f - -SEED = f215d34fe2d757cff9cf5c05430994de587987ce45cb0459f61ec6c825c62259 -PUB = 1ed506485b09a6450be7c9337d9fe87ef99c96f8bd11cd631ca160d0fd73067e -MESSAGE = fbed2a7df418ec0e8036312ec239fcee6ef97dc8c2df1f2e14adee287808b788a6072143b851d975c8e8a0299df846b19113e38cee83da71ea8e9bd6f57bdcd3557523f4feb616caa595aea01eb0b3d490b99b525ea4fbb9258bc7fbb0deea8f568cb2 -SIG = cbef65b6f3fd580969fc3340cfae4f7c99df1340cce54626183144ef468871634b0a5c0033534108e1c67c0dc99d3014f01084e98c95e1014b309b1dbb2e6704 - -SEED = 8c9f95083075a43fe426d19f1e87719b40043de88eb0ee971f70e10c7694ce4e -PUB = e91d167aa3ebc23e70aab45dabe905e416262f910e2a955dd8619efc74c24e85 -MESSAGE = b69d70e860f55c427ef2a71df36e05bbc43bb2e06463aa5de34419c6a614eea6695335a87526c1226488d842891d0574df343c9c1e17aed6958ecee87474221eb77a599ecb059344c0d052c0002a66e5a6013185af69a01ba5dbc660d36cae235f67fe0e -SIG = cac555222dafec76a0b47b9d2c586b3b3b9b3b9c8364beb3cae1e8dd7f1ae9dd74f22b8dd4ad2b290f81351a415a99f030f10778be4cda85d1d353331e70f109 - -SEED = d7eb1fba424feed100777eedb4874bf20810ad686b67e31d27ecf610609a33f5 -PUB = a25acb11a6c825713a085fa754692886a87d07fb9be1a53eb961728bb66c9060 -MESSAGE = a1d0f81e3d59089cc2b19e07d2fce43db4cf171faa642f3b0bbde77ae3d53af5c02bf8fc12ffb4e57f7c8a015d6c2d178944fae9f7c8fc969d4b77bea51876ae99d59e94ad2456e0ed72c52cf4e5340da17c44dbff86457a519b6fffe269066290d629fe69 -SIG = 2bf719682b07cc5ecc0480f37e9d123ff6f44c26e6958e59f080466f9cd373a16500daf123dc3f1334774bfc9fa84503b16dbf21a815c1ada6ebef4920461702 - -SEED = 4f6aeb35fce14fbcbb9aa8a4f6451bf95b98df047fa8c43f1ead3b404d3f928f -PUB = bf66a9edd09481db8444a176c8ce0578d2934f0cdc9734e86fcaac05bf3330f1 -MESSAGE = 2dfbb3f59e19ea17d44a5bde4ad227a1a351dda17af840ee0a75da21a5cca89b6d1c567c333e9cc910e2157e05e86ad5d931145064594c47baeea8663a34649c43e90eb95ca10f7d51597b378a722f1f704adf9f22e9f885b89d1f938006a2efcdb42aaff5e3 -SIG = 6adb07e364f2a455cb05867abc511acd9d658977f0cacafc92828e7b724f6bbf98bf0bfb29f4e5e6c74738d4fdd816d9252407ae4f3afc574c4f00614824e203 - -SEED = ef4a6762b400975204ccc13abb47344015454906850ff14940cbb83aa22414ae -PUB = eaca450996f50cfaf2bd7f9d7fa7087f09ad49664206a80bc2e5bbbb85bb668e -MESSAGE = a4b63eaed5a64a94f2cad212ce2ae71092fd3ea744f5bd89562b2fc2a6c9e4d7aa27add56264a5a55016610be6c19ff7d4989e9504740853012715a79ece9e12c301b3317c7d9b6730db862a4a1d28058e0f8b5ddd9738c7c62ea572cfe59eae08e2b8b6593b58 -SIG = 02697d44cad862f1daf5708205f450d408525b10c01ffd06cfee80374f3db16fa9a49c19a9844b345f2f9559ea74aab173baa078c54370a5166700c6dafb780a - -SEED = 55017e5f61f0c5bafbcde6f849f42a31e5e7a878c1d3f9126fc569fd417ea9f2 -PUB = 66914f74ed932fc881ff0166683f675a7c28a926fddd6469cdb3f28e6dec42cc -MESSAGE = 2fc84a0998fa6e168a866410bb68105df249a28cfc76604be94fd7dffff2fc1dedd220199465575e8df860190f16aca4084169be16c6ba32eb67042ffd4f230316a26b2624a42f8f90ad57f6916486fa91fd94ed68aded4e632430ef719446979bfaf345409c387f -SIG = b1a5e7c49b8fc6b4331e0416ce7e4ed59edd56300b802e0d72abca4a6fcb876c03bf331579124ae0d3fe43f7898bc87e93fc2da3970fc8638957d18c6613c808 - -SEED = 0553fba866942341217cf278ac57cb21acd09d9916cc6af0ac46941ea139d545 -PUB = 840c66e57c2d4f52a4a2796d2a53c5709b96a628c2e063fe6efd47f283ef5e82 -MESSAGE = c1fae6262a0e98a6b1235fcb62283b7f0a097f9d002416d318fefc60c5a1584f900ad0ab26ccfae0d6d84aa9aa2df16d4c117ea2724676cb866d4870a872fc829a7c2a5d21ba83340adb339a34c5184c7f5ead0f077289b33677ed6a1ba34be1994e25763bd1d9faec -SIG = bc3364c152ee5c808ac340f49ea2cc404e93517121220cce6f7c30a22500e41bcdb6e820480f8fccdd22ff9ad96da532802f431e94240fb83d4bceaa09b92b0d - -SEED = 7a5ac602de19f3c21040bcddbff42f6aee6f95c1b093868f48e50482dbf4f9c7 -PUB = fbb6c7531cda21e7d17ea903c4d14be6c68b4ca803a16bd87120f5aaf7dce1d4 -MESSAGE = bd1685419279eb81e4cf3c909031f0f09c5ffae7e2ce6ba9d96c2bce87b8ba0dd763231001e532c7ddd62103abf701288e19dd8f5302e8f5d31b64cc339bd8b7a95550c8a116fd486948772bd5af8dfd46001c59767b0d6bdce383a7078992d1022fbcaf90710687b9aa -SIG = 84101dd4b5e8ca3ed98c1e8a06e11d7e424b0d12ca714ee7374b64c29d51a2021cc77ac75389d9b0a646a447623d7d04d1241866b0ca6edd1b7ac015666b700d - -SEED = 50414cf549bcc55b5b6b75ea3782b2ea7c087b6a0106175e469ca2cc764aeb01 -PUB = d0f30c12e997f96e7aeecd1bff6a012ec388ebf8f3f4af664804d1638e4c346a -MESSAGE = 75ad77e8c54b0b05fb2d162e7cadb8a7528081b863f76a441b374469413e5714edf54f800496af0157c17e425583414d4361f2134171c0b87c22ce6820a4850ab49d99a9badce9e36110e7f3060118b3590f82b43771e9fbb081afe62227e024d98de6cdec028d7c49490d -SIG = b309800160de43a63a89a0acb8a6050059589b3eaecac20b256fece438042f69415d8a56883ee3836d3134a7fc1de64fa8c8cecc3ce27589f606058820857a0c - -SEED = 93cb00d8fe9c9777a683631f39ba0f48761482cf1c366bd863cf715101532555 -PUB = 87e94a1ea5258d61180cb828590ff1418a87d01e702686ba8abc2692c8dc3c91 -MESSAGE = 88d8538d31867813d88fef7228d49a7e950d738396f116dda1025f7913547c5d1dc5677a6de4b4a5880507b361780b61b43f7795263db22ff341645f2f5914fd6088c2811211ed4756ac019a6035d66e3170c1d82bfaa30596b396b3260cc1d10d413dd47ebe6daa0c30dc42 -SIG = 09824fa2dfbc4d6ef76a9e4145961116769130553b3edffa50d04f39b8b79facbd237acf71354a53a6e5fee754e823b0b290f9619320a13d561269a221639f03 - -SEED = 2b4cae380e95ce694c26ac7957447347f98e31b4bf02d744e131529071e2301d -PUB = e6fc705a79c98e115b4e28d3aa1506b74ee74276c5fc1109a7f4d89c6fafb889 -MESSAGE = e0b8250e27b7c0291dbc47a6da6f1268987afdf0a1e90be69bcbc4370865217830d5208693be7b7045099a22ea27f952eb3f79a9a0f1b5a87b19367790788d34c219c2e2a6b834020fb4fd149dc56b544fddbb42071a162fc7cb33c146cac05a31b183e9daadc616f3af449b17 -SIG = 555e45656ba9cfbf5155d0e52576e5197abbbc9dd233993eec2a1ee7f6a86409c0b71b0a661978ff5e0acdc9463dc449906f474f8e79bb86168bf70741e34b02 - -SEED = b56491e54999bb5a1715ebfa2feb14a545a3a43c2fdfd4be0c95fc11819ad695 -PUB = cd42bf414f9bfc72ec069882a800557cdf31bc3464fb102c310e6dbd3ae20863 -MESSAGE = eb4418ba30683ec7959bdb1ec7b263f83e81f054ddcdbe0a6738ca7763e246935bac419026c22bfbdd1236336cc16107c53513e3ddf34e120846962c3bdd54f5ad5749597208f15a8bb56667baa895f08340db89b85c435e770931928d8abc99262f839aedd9be2aa138c9259adf -SIG = e3be3e71a89852df3cffd72d68207869dd3eceb49b1f029493eccbb932444ebe8c8c6db5f0a5a67e2194408df9841913a5ac1a606896419a668f4f47c56c2b08 - -SEED = 6579c247dd2cd02ba2f7d7a950a330752681e92c0dc62984bbea279ea521c381 -PUB = 0b087bea1a1b3d15805cb604f4bb8d68edde274faf521fe6df50c55f8ad4a70d -MESSAGE = df7c552ffc89374b9571a6024a8d0471d7eb6be8dfca6f4166b581b65479015a0568129074cc04d6342c758ca18f7987dec536b7033d5f9681504340e20986f027b8cf1f263be76db3525d173422950ea8dceddc585640918aa9d25ca89cba701c2020153873f46108c772cb388d55 -SIG = eccaf801ae0a912e21c6b83a5f0e4e88d4b2713459ff93449fc0b21a9f416050113cbae4e814d20c0a798f76d2f9d326ed83959ea02abdc1ab350a467123f709 - -SEED = 18fba60c5026f3c9dd7aedc04209d5260361de400e190aeb60169e05a3367c9f -PUB = dfff347f3dd255530bf7fb34d02ba486d112bb46e950e2ef80e517014cc95734 -MESSAGE = 34f08a804d7829cc3914f000ce1a3288acce2149c8a02086b9f67afccd83a178b0bcfd4970c056997da7dc3d47562f16663cedc52f82d710850cf4050379efdac23bee17c330a383ad137f788473b2b0723603b6deb1fdbf6c523fc948a0ccc4ff100fb946d874c1f990436ae8c4f3b2 -SIG = 4bc011e40f0f59c618f6bbe230b6f7bc2f50e3617c7faab7f4c21cb84f77eba994cb7c2a1bf10b01bb20084497fdf0a6ab5d9bcd22c4a2c5a78f79926825940f - -SEED = 073cc15b0536285933b2be39253cf4fd696b81610f5dd3adac2e9cbf338ef2f6 -PUB = 00b551d371544375dac5c4e96cd1f0215207e8e166a1fe49d5b0a51ac18443ec -MESSAGE = c285362bc8ef628f7aedf654231ee51acdf2cf69a886b942bb9bfed8155105d9209ded2af24f169ad5fcd451370f5827a85111c7a52e032c5038617c0c0170e2a6c231dc401d12062edb186036114e38793b79089077581b9783f40007103ef17472491c00e7138aecc5084d3c85010470 -SIG = 3aa52a83062a8f28a5d6b7607f484b66cc374896b766123126333c579581316c742806f627b5bc55cad705cc1d4782b044080c8ac840f38c0c50d35e345c7803 - -SEED = fd894a1e8232203b289505d5c68c68791ffc0e54f2a87530fbba5b3a3f2caf00 -PUB = e95ab565945c7ae5d533df5d0cccc7e9abbc838e20a0b61c930f5d41d81a6fe7 -MESSAGE = 2669624a94f2c44a05b7dc3ebf93e58a4bf3a01c273657e7e7878976f6b6ea737fa3f22cc8365b8b220c007d5b642726a408fe2fab69ebb3bd072b349f4dc3377ee7cc752934254215d23989bd3cd02ce999adec9784993f4c19940815f39c9e229247f5205c36cba44e714266369289b4a7 -SIG = f51102219e8804be713e556df4e4afa2f8866fe86541a1c2a0934d24c3c9beb280a70dd8d527fe8b7e0b948214d5f2f9638619914b72d55dc198b0229a848708 - -SEED = 18ef464e28f87ffcfa4d3a9c09a22910951b8c719fdacdb56de62c4b406df00c -PUB = c5064c9d43ee2da75b06bb09c77267dbd0d39128f1cdc6bfa451a03e93af4a70 -MESSAGE = 9c825707d9358365ab9d38f7e728d628aa722a4f1a20a38e47c999fff8fc32417fbe072f96eb6a0e11e4da9b6de9615445280e93c77a3634d3d2c6879856c248f9800f60a0d38dc1cea8b7f31f286cb0374827b4c6ba144a6694f2b908ead68d18340124cb59cf1701863bd4f3efc709f3627a -SIG = d1e7f16e8e597d428adea65591d551b54b667aff2020c464f7f4e53c4773f70433249a3c71b4d11c89c3faa892809227b9f29ef4f7f5d020d4674d4021359405 - -SEED = c911bdf2f9e7cc5fff35c96e15cc12eafd05ab0db31f649f7408acd0cada76e0 -PUB = de44696cd6bd2cbe9b11a0ef18b88164801a969d5e06ed453eb4008cce9a5725 -MESSAGE = 76c471241d17192984b00362696e4d9d4d2b7f839c2064117e50a1598f3a1172b16c55e5396866084752024f3a7eb68bb3ffdb80979a0af6d0f6af26b6f0bc0c0384433bcfd44c75eb654a8a8225cb9c4a7fb3c824c3af6125fd46db287e70492d154632cb8f62432659d958d6281d04a54f5f5f -SIG = d584b5da371ae4f5c9859b25f70dc56c1b7b4e02d1ae6636283b1b7b11217afdcdf65d1b49ca2c8ef17966e9bc65f10c310b77bb5df7aff5ec1b379a2ce55d0d - -SEED = d3703299c41db36d77dd3a49541f3fb21d0b2bad1f6e074affd96f1c40d0f927 -PUB = 862c5ef616a5f066fd87758a56ab45056fea4bd33f008be24f7b540e095e148e -MESSAGE = ac92edbe22257bb06d94aa950e62d18ca2ac0a8fc106000d2231f8a13b8d7a209ccd8cc49a6cd68a7f36c02fb8f728d15595167f0ba8cfe95c8a1e435f327513014ac428b75d4f72e7c834dd70e1a448f1847d3498475f74e3d9334dc7dcc4fed72bf6c7fe3b1d4f53d429616f1df44f19733158b6 -SIG = df28277121eac44630084cce75917ae9f6bec65af5572dc30719bde661cf696b85b8672dd4983cab30bd05cc3a119d7db9babd522d7b3a6bcf3886ecd25e080f - -SEED = d411cd33576d0efe9ec413ccdaabd4fcbafec01a3af4b3cbe34f8b05ef8b59ba -PUB = e870344df98dd3a8702c4519bf9e8b35a9d189e746f7203dbbf9bbfab22d6f63 -MESSAGE = 11d2c2a7f0190988126696431b4bbcd90ab7b56a32da6404ae446aa762a4ddc66094971538eeb85bde0470a510be0d6d85780ee730a9854138728ae6816162268da852858eaed4ec74c7ac62e6e7096dc002df0bdf5fa40da565b41d181a3f0ad0c5e0b976743e315d9db8ed4160abe69c13a2b3f09a -SIG = 83460d15461d6717710bafd6a47a1eaa900a80f2bf8b8aae2468773614ee84bd628c9717476368ef3640cf760acac83ad60232a76963b7d52588b11dc004d70d - -SEED = e10a2f1380c3e4720e8a8707a9bcb25a0f58270d7059cd7626c7153447edfb87 -PUB = a3c717acab366a40b51187bbf35b2d15e97cfeacd7349c06ef1c91ac93e90656 -MESSAGE = 135212a9cf00d0a05220be7323bfa4a5ba7fc5465514007702121a9c92e46bd473062f00841af83cb7bc4b2cd58dc4d5b151244cc8293e795796835ed36822c6e09893ec991b38ada4b21a06e691afa887db4e9d7b1d2afc65ba8d2f5e6926ff53d2d44d55fa095f3fad62545c714f0f3f59e4bfe91af8 -SIG = 094bf6f953ca0eb77df45129b7bf10d192cf6ddeae94ad6202b8eacfbec119e5291578fe64a084ae600fe07efdb8a782610dbdb0b49eb5f2a46c432355552f01 - -SEED = b2e697b3d3efec976ef3369530c792717bdbb428d9ed0c11ec0ea9b2e5f39f82 -PUB = c4d2e4b3c236d6c9b8c74fa384612c4710d83aa16ad7ef01fbb7421d4fb3f0f6 -MESSAGE = 7b436232ac2111a84059510c48362588fcb7383426be5e6f62f372e4f7cca83c81c2357f9b54f4a15291065b6d41aad1ea93cffa776b9acaa58afe2b51644b97af9a3e53f84e40aa6d86051e6914cd039d4170a9a526dd69955ff507c33f74e2176591fb0b3cd7f00ee418f2c258a9981cccee72f01c8430 -SIG = 5047fa38197b8328e78dd8a10e966afb7bd3d43608280f1c257d25ca43bc1c06e94a5747ab6215ece54cdeff8c56567d70d2f91f9ec8c260aa1080a6ab5a7a02 - -SEED = 19a679a7a905a1e2b3038e6e418b3da97c3089c7cd351ea07bc8d1af64eacc46 -PUB = 19f08361f469b4ae1e0ceb94f47a7de7317410a92dd013b16ae0d0532fa4b3ef -MESSAGE = 980c7b4d2939061ac7b9ba441117a19485661781a4083067c55acf93026c082a93cc124f095e1b4f2c3f6c135412a5096228e8a071e8b4b668ba9d9644ea9f4dabfc54a9856c3e965e6363395ab709037dda229baf927cd01f9af5e039afc42f3cec634f5d832d2ab7c7cad3ad7b8cf27ebdac698431ad8236 -SIG = 4347b7b4f7c3c4dd315b8384a0b0caeed84bdabe24b2915f12512dfd04770fc996a1bfb729afef9edd611447081a5330617eaea1c1dab1bf13cea8997204910c - -SEED = f03b8363ee5b0eef7018a49bc02adf731da54ee50a7f03b88a29a2082b189c43 -PUB = 31287ef5a2e64104ab7790b312f35c7ad4af6beb0d7ceb8a58f36a54ce272c3e -MESSAGE = 24191b5464b35ac7bcf4a375f033efba8943b09b9ff0fc403ca7aae702a3cbf396c5131bc008132cf5f12910d586dc1db9c084574a96babee95642f922371c0382ec0402a26feb142e4146bbd3360c2b36834fe45af5e2868d4d56fdd504cebf0c2d7f5791b4429417c8b65a98e0b15c466c137f410524fce737 -SIG = e8fa967e6afadf6a877d87e5f5c52bb634b75a7804199a2bc9d027b63a35654d9ddd06830455641dbfb49edce42e20e7d4104a071c2cbbec23018c297ced9908 - -SEED = 11086b0d11e415ab1ce02aaf8f0621b54430f6fb135c74f40d38e8c64737064b -PUB = 7166dfbc691eb8c201114ba0d1a2c7b87f7a1fd8d0b36058b0d7dcabe1ae30da -MESSAGE = 4b5b2936c5e360a38455503721078f8adb404a7ee7ecc14801dc87a67a152b769569fbeac0afa25a2070a1686b900ac1633d499808cdb2e81ce3916d5a3c04d19c5bb2699a662b8aba4af94d390bac7ccc8ec910ed2acdf86ebb71adb601877885eef3c91662fc30738e352cc74353ccf8d8edeefacc042c10a0e5 -SIG = e907459d5adcd0d0c36418581f19d0eebda7138ebd9faa0b262201f458c856310bb77f4c7de922495dcfe8b248eda2ad0df6a73f47bbfb894baa7d8869875802 - -SEED = efce7667a8ef91228caed14eb477a345e5e8239234080848760ed0970713fa86 -PUB = 9193055a84df1eacca28ce2a08c2a07a50f04c024ecf1fe4a47d2efbaf63ed58 -MESSAGE = aa1bc80d7bcc1d94a23a57cedf5027482477dc46b86890bc0e5ac29ae6c91bbc43130348797305f75543580a8a069b348a7bd8fc3e015230b7c1940c7f80a82b12900910dbcf0630da03f081d44c7f955d4a1172f56ecc7c5ac646696bffdf4eb6d88bdd9cc3843528b72583abb3bad02e56ef7646eed5139551cdeb -SIG = e5a63124db1696b64140b6e9612fa9587b3eef710109398d44ba0ca63c0ebad06f0a6c8994ea34b3a2af91a89bf41ae614d7727d716fd42f8b92e1ac64fdbf03 - -SEED = 88fccaa96ad884d1165be71dd0c4f5f8f4421c60fbfa498bfee9b967462443bd -PUB = c75cb0e0237b45b8656eea9f3d1a9d4acd01a103aa269bb24fd54122fd81f2ac -MESSAGE = 9d0eac98556bfa8672c35705d1d61ac4d0fca19dc0d993015877857d27fd80f74acace666c563485d81e53603a6aef40875fa551cc105f2cc10b39694679cdf4a6b073bc88645fc51a36da179d3d1e3c7722454c5e73577c61aa7d148c4ba50ea46c56a1c3b3b3c470f93100494e08bc5514ac763a85483c42c7cdc27c -SIG = 27d3a197cc9994212063bce8d799e77b6853b7355ebe369bcf1889a418a82caa3a7987a663f621defe86b3ac4ad44faeed16c9116ace28fccf915557fa779903 - -SEED = 670b30626fe367d8b45f43733d6f25b37eccbcb551963f0ac8b666b48041c72d -PUB = 65aa4c6d4ba0ab34bc75b39f09527ca6f2425f52415cdffdf2dff273f8ea612c -MESSAGE = d00bcca7e184d10e1f1fe420b50639e1d5deba52a751236e68c59bb4bff9802f5fc165ed42fd6d534670a7c6fb60e4307d947915a248bf2f93465c2cb44d8f453d2c015afbc8ed58818ea51726a25177930e9ea192ef4514f4bb0eb4e0f5d4ae3c46e357c81187f7ed174733fff959c3f9fae6486cfa1356a95699211de5 -SIG = 1b6b4377d2b98e0f9d24ae8dfe30e2396e2004380d3431488e5843cf8d2d7a0070ab21f8a3b51ce84d2f4ba209f739f922bebf798096693f5622873d79ae6f04 - -SEED = 813c4daed67a190d68bb635d73af6da74f32fdf7c48cca6e59262946b8e8c71f -PUB = a2095457d7697020e2b884d95a96578c2a900a7666ac0dc7bd38f1931d7945d8 -MESSAGE = ce54cb0450e689a0dbef785308b3177472fcd6d38203e58a0590b31fa253f9ea590be5368a922de88b63450102684443fb8189e601282003323b89c81e92eaef2b5ddc4a55c53fa3cfad4160248b3c286ff80d31d161b7b8dee713552b56f1507fb72eadfa89054e9d1600ac874c4b0a961004eb6d0d4bfd2ecb9c734f00ba -SIG = b446574ff6a4bd2b572e487c4ab443ca641075168aa4e1092f71f30bdb068ce46a395efee1ee660b9fac26d54109722c15cdb791bfb87fff63c6596ad4f2270c - -SEED = 8400962bb769f63868cae5a3fec8db6a9c8d3f1c846c8dceeb642b6946efa8e3 -PUB = 98be21001993a7eb1a1277ff74c15504183d25fdfcc05f0d4dea892f6e301890 -MESSAGE = f7e67d982a2ff93ecda4087152b4864c943b1ba7021f5407043ccb4253d348c27b9283acb26c194fd1cbb79e6afc32ff686b55b0b3617218dcf39316b4b66b3c8c0d67267a86db8adf3750801bcf9327d4c25441b96197832b4cde0eac3ff22892a2f0bc17c2c213c02377a333e308ed271658049383b7e2e57b6b8b125512e0 -SIG = 0ad71b0025f3d9a50db338414d6d670e7799b7270a8444f6ae7f12ae7eb71bd03ffd3c4f36631f69fdcc4061468ff582ede495243ef1361a3b3295fa813ba205 - -SEED = 6288722035d1ea699bc7cfdf18d89625423180b683fa74639f4f30f15359cc85 -PUB = e17faa019572861a064e1bc571256dea1468f3a48590a89138aaa85925080cd7 -MESSAGE = 8b6caacac51d8949fb86acbcb1b99d859ff67c64147bc1216909dcab07ee6ef09f403863327394689dc34abc778fcb5c1f5091acf5a08f9d842211d1ae2eb40be9bb8d6679077471547a6c71ff77b519d4b7108e32bc46251c60dee8e332b6229316e6d57c22ab826ff1bc33f2b0213807c19280af110fd26ee27468201cff49cb -SIG = 9dec92b6e89adbe8f4e1b5e93ac4fcf957de7d1970a226770ec4eda647c8e3b3dffb2731a39e16e4a0119d3662a937e560522491ec7a1696be04c076b12e3501 - -SEED = 13038a3a65ef32759a9cd903acb554b252de00e7cdb77bbed1970b20680ee17b -PUB = b6a308e67f9b46c66499456ab5cd135cb2fe84a32eb045358626604da4122c8f -MESSAGE = ddf00b4033a2a088022dabe93356432f50ddc6c6e1a659dc1a93124a4c2ffffd182765a2f56c43ea0bfd8de8015060889ae6941c3f3e255d4421a1c36201be846a2738a71f120cad598ca8527d70ff8d5a0993b55cb5153517110a41962daff42250158f2096d1ddaf7186e50298cbe51fcb429cbea411293f8a7bd9cf069fa237e4 -SIG = 5261558ecc3c98ff36351f42f504cad4a32ffda5a744560960b4c106e4492f02e20478887afee4f770f05597a7e388caceae805ae351e0e45e8e578e6a6ff20c - -SEED = b9de5b063d3ca3a773f114941b2e4227c07511c0f5c06017b9c8845018f23432 -PUB = 5295243c8646e096674dda15979b322b9dd0faf27d024a0ed5771334e1179ed2 -MESSAGE = 9493cc23896b84096046ae1053afe39499e9424254b366fe143f4da321e2dc9e4784208e12a542d899828dde7eff625a7f12416990c2841ffb095bf94c0c610e5a663918b689031ccd6b519349d04de1c212ca2a9d7abf52e1b4fd467bb665b6919ef8f91617e205565bf56647e5f8d508ea200a84467f8fa122e74bc3b9979f1174e5 -SIG = 92ba760d14d1415cfaf218ca847014088ae51ad821113a6f8630356f7ba85c005e2330f1066d0df464806052a4174610050462f3e013d702e7c77185a032580b - -SEED = 8ff0297cc08842b5e67552ec2843e04353a34d74ef89b8565d97205b74ca133a -PUB = 0f7ef98c5ba4af984dfb77bc4e537b2b39e6273bb3e7b95fe1b7e6781952bd4a -MESSAGE = 2bdc3a486c5e4ea62dcfec8a9d4fcf9ea9490dbcc715615d58490a72ce833fa22387ca50a0052508cf0aff1ca727f0fed46ffa7d3c8e23c5bb01d47e90ff06d3858a557d9926481579daf4384aea50e96ec615d2a3bf3c1122f1f24dd6ed98a5de421883589c213998ca5432373e68bbbe89428ca9885d0593d5e6215116b8266386452b -SIG = 0783737f706e6ff36614f850074fca1f485f24fcde2a28af544f37abd69b7a581defd8c771b031e108d19d788c74c5f20bb3f1c21cd92be317bacd8f650b4905 - -SEED = 050d553d282dca3269c83c181768ec067b81c9fe0c94f2a0ebbb0c942d0fcd7c -PUB = 63e230b003c53a5672e832ff7f24430be223e497de840233f595a3e200c7127e -MESSAGE = 15e13b8c01004f6aa5b236dbb281677f746d81e548e0aa80f0e414521521d856cd694e7c9152bb5e43776b60f6b560ed1ad3e4b390dbf3e46ef9257443f39c149e0240a02d021e1e3d7d046b26fd004eee7ca16a8059e126c74cb3f2194db47bf60465ecef5c704d2e2c75e2e50060ea2a31cb72b7b3c6b1b5ec72ab38004085281a22fe86 -SIG = 3f0e83765b31bbe8e1fb92e9678d6cde571a03ba7f1dcc1128461f708525457f4e0e2353aa2b598c063ff1bffdac916b5a2200655156904b0585577a1628560d - -SEED = 69497cd7b4e868cfa0328d92bd6052d772b2767395c14595b279851a9cdd31aa -PUB = 5d276d626e230d18e7bcd61141cb93c90ef0f79e01321212d838ec71457b1aac -MESSAGE = 53cd080a0c61f1a093d3b3a74571c296303f363b4107edbe880b7aa9dfe44ab5d5dc5f74be9c8d876f04d754653491ab51b135fc953f71287b62ff41b67c742bd3445671a9d4f2dc174ca1b0335f78627a0dd4b30650504178039e7393638510ffe84091b57298d3ac9001c367c1452fbcb33dc54a5dc316fb2a5270764a2ac820a0b63fbdc6 -SIG = beafa58340960908e8d86e40329e3a4523fc7be770addb86e34c3772f84cd9fb338d1f3b65bfcdb09f35c6da36d1a3adf8f91f1ffd5782cc830206433a08410d - -SEED = 2165a486b612bbff529cd00346964a3cb8cdcffa51dc3d524dd5adc5ac936d68 -PUB = 7ebc839a465e14f5892476e4a13b3988f83b3cd27ef79e193f86fa16f34a1ce1 -MESSAGE = b728da7a36167c6085bd2d962cf63959facd95c9ad4542028afba90ec9c6c0760bdae935429c3feb3933e2f00042c672ad2cd7348d92bc33f81751e294ae9171b945b193144ef8acb9a1bd9abf0475ce0d0ac789b200c32e9c9a2736b168369ce5f97b1e8d2e7900e1a759178441f1fc430564ae129bae7857740511a668f32c0a3b077a9d8b19 -SIG = 7ec6fba56ba52460a1b4f2738689c1883dda9aaffc8bde17cb6029bdce3a0ebe2fffda55939b70bbd07fdbf6fc5cda87fed8ba58575f894a366e45e5705eea09 - -SEED = 1c64ad63dd147034598e128f7406ec0530746ea1c5b72ecf79e888065486fa1b -PUB = baa6bcc1c3d8d3b11ffc1587adddc58bfd96c2b992b6c6f59fcc50ccbcdd0eb9 -MESSAGE = 9ebd8e337893bb053ef2b9e3269df54848494f03cd63576b33e64b1080be4be015264a403fb9602bbf90ca19b241a9b66863909b9008ce1b2ffcf236efa4c2668f0f47db9ff5fa157d9cb605412be7dd8b07ea878cccae6bf50f935b86d19e1b648b69e528553a56d8afb78221ad53307b7a4ec8d2fd4861b55dc5dae8e93ef387fbbe0b4ce7f788 -SIG = 7477e54158f13b7128c0a110ca6b65f42514fb70cd5cf28a8b1cc6110ea06fcf94290da13f85a11c2351d3bbccbb4c64e0215d6d0f0099e7f27bc94e949b150b - -SEED = 55abbc5dac4128134dc8c6018a213ed4b60fcc8e90cbd41db2d21eda5373e936 -PUB = 251afaa2646926b2a371f2a09d5865b98c9a5eb6ca047cd0d8ee36e5e0416974 -MESSAGE = 47010e1398ad55fabe371dd8648f768d90df4b965a3b396100b303b40a17518bed6d86b09f734ab7c10b5f3a01b53deec5f8534b70c79f3f29b284fdec486f22f44c22ccd5c6463594415267baa611f70b1b316caa1b68b5e0e99b31c5bb0ce13679a23c31a63999698164cbf37d103ba92490188be59937f123043ec786efe3d411f9b0623a6ad972 -SIG = f6a61c2e661a9eb7bde182e38ec99af985f61698a5d7fa430d16e3f1a93709b75522320de48afcc595ab209122ae0ce132cdf4b0391746e7ff341177570c8108 - -SEED = f2dcf4a1a0d46ddb2d72f8fdd80bbec5b7dea5913da4966c2f4d12c261f0bf98 -PUB = d39570a25ca59f2257f93f96600df4f63e684bf63ae8dffd914e4629c3d5095f -MESSAGE = 3b00e808fca4c11651d853d6b90f952ccf5647e102d4ee0ad7a5d181d5b4258c523cd39e3d9825298d84c8cba09f43dbba119988222c76059caf17b4bf9931c45e617448aeade151181497b24552367e52bc45ac79088806d3368207aafefd3057845dce819d5aaaa77b218e2aed3da76d40c1f07699f8172e4a5c803f7a2aceb9a47a8952e1b2f053f2 -SIG = 42882a811dad2d851885e4cbe9044708d91a86f15dfa1d66c3eb304314531f3015208c711b9bdbc5fb233951e569b59d34e415eec4b37ffd374d412c9a360d0c - -SEED = 2246bfb06155859e10a748ff8f5919ad5d1daab756f01057b790d07474775f4f -PUB = fa6349b62dc8c6a2feeef6ffc33ae085c649795c1c9d9898e75c13ae1625db34 -MESSAGE = 63ee1c7bbb15cebe1c22532d481682754bdaf58b8bc997ae30a34c9d23c33f1690c346ab0a7365ff62457424b6105f8421eca0ce3c630acfeb9a1cc416390edf4920e22b2367e9fb5d2ab25bee56da03ea55e3f57882d48b89229314d734cb83c79f4e17ee64bae6f7addbe9b525fcd03a91409a2dde907751db8cc97e08d0ea89c4d18718d26d0b897b64 -SIG = 2be4915a352f7785483046d8ae9625b8b63257af57c073691256ee076d6e1b972a101f551c705d3f96157c33b56ea049be4af4dc561cbe3c1ec5072d7f134e07 - -SEED = c088a3dd2cb8bd5d684db8538dc22473b6f014f64fe86af168b4bb01b90a1dd0 -PUB = aad615a9c28759f03d373abe666691dead8b84f9b8b50a67f8f0aa4a701580d1 -MESSAGE = 74906ae05a5af8e9968b6feb498569d6345a24f9711befb136e6c3b5ed49339e59a7938b4ba1a118f169b9ace0f7842a26a645f14c0ad22ebbcda93e67e4c348efc3d9ecbb1419e6262d0436a58ea82c2202389065ccf67c4f550e45b5f6a12a6c011b2e0a30101d5c62328bbf99c8c95563a6e33bdd9cce72b1f720139c2fd3e04913146ae5bac5288e0e3e -SIG = 3bb459d1ac575a180c1728d8b8924970492a0c8d2a378c29d1d41785c8379a58e2ba3606785e1c5da29e5527552bc6dc89a2b69c27fe51ed253a9f3b565b2700 - -SEED = 45667d1e7b5910979c4a328317968371c864d564a661c5cce557c9ecc61bab9e -PUB = edcdf5e1a170e00c8c687e7e9c18f9893b5fe495cd2977ceb7f446c0149aa9d3 -MESSAGE = cd66cec476c87c8dbf47ec91dac48fb5b42db1282a573e0a5cf0b91768986608e1d7ebd05f5251bcf8b47a17093229acefbd44beb21c0c0c928dd3cd3f8966ecce6910331c508ea76baf904d8c21f6c17c2c58d00afd3259b8bf794c146b12b995cddd1c4289c5be3168ebd616b384c281ce1b38a10e1807808853c681a640a009b4d2acd7934f8c6d07578161 -SIG = 6de668f1ca6f292814625289a0808020c87c89ac94f5b0508e557bdf8000a5ca808f021c9679b50ee2f320064c95a464a8439379828c3b76cfa766455e128c0b - -SEED = 24897428ae6546d85b3190ebe3f1f7bf7c712528ac851a588b07d5c8f94eecd1 -PUB = 5f348fe3ea5b2c023d0af7ede60e55f91aa55199699da15a11c3791d68d710bd -MESSAGE = 5201d9725f1dffa1863fa4d84c301861141acdfb64be1fbfdd5b9386db20ef394099eebcfdfecc62c6268607a84d55c55cd0efdc372ecf3067343e7b0731c2685461e24b953f99949e59ba3e67ed0f0848313793962a292c459814c5e28690ec1f45171f1abab86fdd14568b00caf48581115ee5ea83b000282fbbf0c0b2a1116039a35cfa3f201422207a3d4948 -SIG = 1b5e75def49f51d6b2de008c71fc1a909bd42ca813298dce4eeef717815d7a6c078c2f3d9a3fce1ab5b3ad8ef8d45cdf2eb4901c32eea2d5e018dcf2833cad0c - -SEED = 7b04aca7cf926216cb960a3890786339d0a615967680190123fda3b60c6aeb11 -PUB = cdbc3e70e4e8fd13d0cce2852a3b9372c3a6160cd6deaba90f9b3022f70c91f9 -MESSAGE = 1cb09624b1f14a0260c7f56d8c60b5fe45837114232551ef5966386e0c2b441b75cfdb8df2185785d22cf526fa9df7fd45d9d83881b66c1feee0913e238121eedbb7ab504da0bee8998016684535031991f11bfcd9b95690aad2d19bd6a9de1844ed1362302df4217230b25c0552ce277534c650cae526577f25d8b1fe9f9febca2c814670d4805b21adef852daf94 -SIG = 25d2d361751d52b4fe66ea18e4b9866bde3d121a7312fd9e28a1e295e087e3176c94c874a2e81600f24c4654f43d1b67d47b64822648590ce5ce44f3b5ddc502 - -SEED = ea73bf64a1a97877c3c3e7ca4644b71aaa66314c8f1b66bafaebd5edfb888bcd -PUB = caac93902e5764ade47294edd51faa14620940c668b5c1c392a6928325d4c3fd -MESSAGE = 362eec68b912852786bb4f9afff9ecf7cb28c9de6b18422a8ca940b0d7e6dcb83aa44be0afb5f1806d43f0e31d71f922f853615a26e287a27f08a04fbce3d45a0c6c311d4b7cb17e425bbeb0a6b410b5d6dbb7ac11df9850a131a691e3b60b0b214ebe044106e982433287595267b031b5d4a09262ded8934fdfdf964d868ef9a2c842f804eafddefcb71d9f16a59bf8 -SIG = bd86cb9c70a055279a86a9e64870988b8a7345c3cd2948a0fabcfb38abce3c420b4d5521618e11d2de827d9de569f6bc3be66aad40636cdaa64760ded3b7c209 - -SEED = b8123c116b33bad0dcbc2c4dc06a3d66850dab360cdb5a033c14895c4ee31bfb -PUB = bdca151ba32c6bb31531b05fdf86c6d78c8cd1935611d5ff111a0f00635b1885 -MESSAGE = 7970f6666634548c848bb52338817b26a4d0ca68df3d28afff207c2d028067a18e4c9543025f5b0228aa691e5088513151a94494e15d1f54210328e0df159b352c30aaa7a844f18a9f4c395dcbb3fb9fcfbed1103e0706fbf9c35fe2666848fa35dc2cf5227ebee89e7d3bcfae2721b25fdec3d3174ea7ce267a55dd61d58201e96bda303cf418edf6e32fb92f5dc1a0b1 -SIG = 9cf13eba3dcc37b8fc70ccb2327436b9f08855e726aa7ed82bd5cb7df45fdf9ec1f96afad193f47572d770444b65b74a37cc034fc514cb3f91b2d8ada5b02006 - -SEED = b18e1d0045995ec3d010c387ccfeb984d783af8fbb0f40fa7db126d889f6dadd -PUB = 77f48b59caeda77751ed138b0ec667ff50f8768c25d48309a8f386a2bad187fb -MESSAGE = 916c7d1d268fc0e77c1bef238432573c39be577bbea0998936add2b50a653171ce18a542b0b7f96c1691a3be6031522894a8634183eda38798a0c5d5d79fbd01dd04a8646d71873b77b221998a81922d8105f892316369d5224c9983372d2313c6b1f4556ea26ba49d46e8b561e0fc76633ac9766e68e21fba7edca93c4c7460376d7f3ac22ff372c18f613f2ae2e856af40 -SIG = 6bd710a368c1249923fc7a1610747403040f0cc30815a00f9ff548a896bbda0b4eb2ca19ebcf917f0f34200a9edbad3901b64ab09cc5ef7b9bcc3c40c0ff7509 - -SEED = 93649c63910b35718e48c590d261c48e4ef8336613f6aa077b462676b3ba8829 -PUB = 06a685898b855212ebc289915d105a4320d620d85771b8c6b15bf10a1be6e9b8 -MESSAGE = 2cd1a951056c9ebae1399b6bd2d82c0ae277856290d06920ac56cac8fb42435101c72aa9c08dd2d12426325562c2f0a49cd821b11b939aafa593b4095c021bcb4827b107b9664d68282888bc4a44af3e3bdc861be6af309044c3daab57b77023dc902d47ebc326f9bdd02dbc02cd540ff81b2ddf7cf679a41193dfe5f8c8ca1aaefc41ef740280d9823e30a354717c8431f5d8 -SIG = 6274f2d4f431d5affefa35e7cf584a599017193da99094ca908b75acb608d1bf981857be93a7dafb0fadb3ff0906f48a5ee950456f782c2d605b14095ba0ff0f - -SEED = 1c15cbeb89362d69476a2aa4a5f3ef2089cf87286349e0dfe0e72d9e3e5a66c7 -PUB = 13a882a1064182582c211847e19b4dac59722c9ffd34826d96f33113400fac7a -MESSAGE = 091c9b9b116ae83d23d01a6295211785d446b6228dd687ddf79bd0d5a4daa8c79d2cbfc37365f1f285e361738123e34e2bcbfc664ce1253a11d9e4a7982e58cf9468e1017ea14d2cc6d0865d40fde8cb560241e96ac1617c791f0ca7c6410cadf328611b18aef333d8350ac497f0a4ae2d03fdf0e23e426d34f4514780d1474e113583541f3c043672057172618cb2059eaaed56 -SIG = 5998b2808adfdeeaebe2c3eac026d3f825f9c7f2af97ca324fbd57aac1bedff78a8ee621d037ee3ad2a712e9a009c58ea3e6f2a828f74b86da275a44a4b1e50b - -SEED = 11241ffdf34ae8ab875475e94c6cc3291f0b8820dc85e20f32fc53b24ae68978 -PUB = 09c045e4bd5137314c0ec1d031faf914910c45a4676f5a3cd8f581bcccb03c97 -MESSAGE = 3b89deccb7023e4b2b7aff2c3951870af413a9b04dd86ac78b7c8fd887492d8dde49d8fda149edd54781ae2b508030d14416a9a38bed2b9aebbbb20250b3c931acd4e32fbeeec5a26501beab7268d144fce8951a101c4b5178166fbb5927b1dfb1e1ce90d1d123068e3f472c888fdb01fdf70e7f8de9b0adb284b7119f55354316f84ed090030f9c2662061ca48447cc0aef964126 -SIG = 72ce9f91be2e66cfc90f952595946ffc90bfce53087d49e5dd7c087f3faa8f18f2356de971e4429d985a99194b4f92ced3ef47cd7114379e0b3267a9f8b1e706 - -SEED = 3bdb162465eaceff98d69c86f70039c517d168aefe6bb101b4f769a86b17c972 -PUB = d76cb7be74328289fd1c64be747cca5bb30295dfaccd0f2e43f51703fd5d3683 -MESSAGE = fbf368feaeba87918b1b8c7b8a26832be6e7fc1cbdb8902519281a0654ec73de0bb07101a9d603f745d4ec2357aee9870cb19a56cb44fbd9c91fc34752612fbd83d6fc1a16bf8a85a215d0148e4af37d298467e5cc486b131352ce092182ce8284159a3812b30bacbff595863811bf9a30a9da494565c3ac1814430018ea0eeed39cdbca27f93140e46949db570bfa2ed4f4073f8833 -SIG = 6f1362a402063791f950984f544928e616a4ef79bbeb6854e9615aab9cdbaec483fb9a04bf22de5d97a15bda2d390483c7f61dbee07bb5141fc173b1aa47650d - -SEED = d5efe51d5cd8e108bd922fc0ea126190a94628ffa53c433a518022792ddc78ef -PUB = 426b01cc61ff5e0e724da1d3b297f5325c18c62f64d5eb48d4a5216a8e9a4073 -MESSAGE = 9d17bcfe2dfc742f411cb53a94f359c001abf096c741f34af48679f281e7ce6bbd9e87709fc0728a563db2b9cf8ea4fbdcc344c1848e653ce970c6ce29de2ccd520300649adcddfc753971f846aac1ba42ae4528952d94980aa7c6cfa2142907647f894ae974a74d59035a73ef56a10b6612624809520190ace661c3a47095e0322efd781d50d1163598f2da32f31bc9c4f913d1b14861 -SIG = 2306f58fcd4cff2222d81b05a475532b8b19dc67e6d78ddb4205a3b7621cc5aef0b393d5d24dd96c88ccbc53a3208da323be4587d5ec067c820f0723aa44e90e - -SEED = 18af89025ebfa76bd557cfb2dff148245214641fd5bda159f73da04b08e87c88 -PUB = 0c584459b9ebcccad587b272160bc60b27f4f772b4321de7723afef577edc7b4 -MESSAGE = e82f46652ab914af535d8fb720b557ac95018d9f2a3fcce85771bb40ab14cb9a986e096f3afe5bee829dfd8b97335c536ac971a21655af16a2f8fdba183a4e18564c21492956537a419abbbbb02a4bbdc01481f5c6e658ecf3c34f011ad846f5edcd4939195df85e41303fb9a88fdfbd704396f7559a327318b952b3e60ce8ddde56378579232faf950c78e7f0b17c3b8dece36b788a8473 -SIG = 26bb0882297c2c08a752d3981145dcde55893a11df77f8aa4c19d0b9ed6e5220ed12e9fac3af13d0f0c71568f4a547d30114a6599a236806c4beee6765284408 - -SEED = 0c93d99815fff8fe22b9e45aa02b3e6445ce1d6bf5a65dce3da107aa1055940e -PUB = 4d27a47b0fc80800d84d244eebb1deb4436d97633a83e67125ad52ea01685057 -MESSAGE = 11e877de58c134eaf4c9f1b53c3dc451d3c055f16b09622725b279768512fe10a7adb0765b689ec21d5b6efaa19f1b9d36254df0a9367f441b26bdb90b28cbc403e5074082fa1fed58e140dac97aeaf483e2c13f3cc560abffaba05b763feedb51e60698151cf56efdf1d37d6ce0564486210f052e937f2ea26f63efa5d247ff188329bb1aa83ce3f4f35a3d7dec14599e5feb7b6d5fe4296a -SIG = 7dc4467abcf6431adb7ccfe868eac8cd8a615a0ff65f6a9e338375b1aae3c49a126c9eba79426d1641c6b97c3e92c194e5ee4431efa2439fd450f2cd018c8700 - -SEED = 989e99945635192c023cc5186fc25bbaef47240775d15a56195d88cd07c3748e -PUB = ca0beafdf731d89301f7723c5bb7e5a1c3ff3eab27c97d711bcd76e42054bee4 -MESSAGE = c48414f5c757d03c523ef3f3b8510771b0ff3b4b97de279625d349ec185a29927a66b9593ba19338c2f5e4131f1ac07ea46d2c1b6e4ab5229280b2e2bb9d140d1ef7af7b1692bf2d097b80f811adcfa95d5cbf9eee92a1641c552b4be4a0d734f0afd470b9d7f4e45778951e21fc534f200a128b96adb8373f10cecec2dac2996a062fb3c294315965a9d5d7b077c4b013c64a38429769d23eab -SIG = aef756bfb8a7266e17d15f3f11ee50ed25be420e95a0742271ebd12294e2cb96ead083b8ff0b829d2edeb14da86e402ef25e6d4a5a7958c184ed10c176cb570b - -SEED = 6bdbbe06d9f4219eea6403a357b25e561992fae0f0f614561dd86d23de415a43 -PUB = ed52dd1cce32d9b485e0940746421d36b9fde6cdf0211545b634044d4b3cb8f1 -MESSAGE = 582ada13d69293e49bbd461032dfea1ca2025b52e013a33a0387fcfc5f7c0b8ec955982607fc901e1b7f636a9d371e1f91fe476bdd44856e275d67efa14238164354c231124c84de8f5b89d5a58ea6744b4d3b3d7906905233cce694a64d696f5a7024fc9033b1ce390899a3b441a48e53c7c9b30ba12e7d61f35f15e658c7cc4407e2f689ea8a55d01bf5dbacb11954754f920f09dbd48409bbb5 -SIG = 950206605b0f417c90843e2c8d8e66c828bb10b99b36eeeee8caf2e0e5484d93fe02bf533405f4bb74a50e5585fa0daef4821f0301d01b46321baa31e1f08d03 - -SEED = d761c8c5a9601b9145b7d051249b004107e452e563100c6c788038c9ee8adad7 -PUB = e6488775d6407efc7b2bca890a7fc62266fc54cdac893343b4f59a196d948898 -MESSAGE = 84ead5eabd2fd4b7c79a9a928ab8ee0a16a5fd667a057f8a254663d56daae156d1a49affb2996137b9d8b340e635732f9d2b4c60218442541e72d2b00e1ee7a73c3f67caa499fa9d070b57d076dcde96b0764723c3c659c7a00c1b78b15ccc2223890b51067fc81e23e9458ab0683ba626a53d0c3793a58a9857bb44b3bd85bb6ce53a85694e7f53cc1bd46d50eda37d81f5381b513d1f38339d291b -SIG = 7ab78b64e6db359a2dc8302e1092ed66fa736b536253a1cd90fdb8c10efd78300225e191963599ba549cc859209df0ff61cd069b03d254e6e7d76c798440f907 - -SEED = c5e0c7a7bb8b7ca07bf0a05ea67eff6deebfe3714ee3e1a227f4dc8e242a2fa0 -PUB = 5135efcd9052bec57a4431caabe82680eec0a33afd59b30203b280ba12be485c -MESSAGE = 3770a6786652c4b78a043edce07f3e204d81997c42afc22331f75a5494a826d7cb69ab4314a473721058a1839981d5b7022d0cd8670377daf3320476d25b9f559561d66ee0a709fe17361e2a52898f5753c4fb43bd0c98b368f512adc09cd927c6622676926d8c2d91a14aca32f226f70036c1c858bcffc2b59f54c1c37bf81eb52ecb3f00da602c94361b52a5afddbfd7e05036e377503050333be512 -SIG = 2e7fdeb3484d0a5e8dce94448979496b0642cabc3733a51f8c3c5c51c19ae319018da91091c2385f2f4e9a59edbca2abd0d085ee40d3f0d42061a5a9832a370c - -SEED = 11bb4748d2547e6196be823c9be7aa18150c204b12ca8d73c1bd46b11a54b475 -PUB = efeb42da28d764966403dd300d9f9451b258ab1c80df06fe5943153f5301cccb -MESSAGE = f4b765b258ba35b427525c7f10a46f0bccd357ec1ad52a5b139417a9d3894c512d89eb88e681b1f30aac4c115ccf36545e83f37834c82e8300cc1eb289af4375968c29c0ffefb40e156c20c0432669ac8dc0a83c13b1e855a84ad0133c40c82c87ee1e7dd4084d741c80de8a7a9f7759e843a562099c4d7df875352039ff4d3824651386c97759ff7dba52064e6d3112e080819aee8ce723a1a2aa464d8a -SIG = 44c58da49d2365d27029d1eebb3bebf7c032d858aa07e0756b1c26a5412d22691176031341ad37d7bb7843289eb39db491584c1b2a1da2e4a2649c2293826606 - -SEED = 7452a00156d794edebff4adb1f7a7eec26217fef67c3d268352b2b5460a7dc25 -PUB = 5f4dc338cfbd384b5f1c14c226701446b52b1e3e2a3cba1a40ee2825080d1de6 -MESSAGE = 8c4ee2867656e33f5269414d77b42d8e4750dba93c418bacca10938cc3b570c6603d52c2344488607b2f934f6d269fcb2ad966219b1ab11472f42c672ce20592490ec5baf6a2d2fc8a3ee35374b1902fdefc7870b1b626fa46b12b6cee241f601a9b3fe4c50812e573e6752ce2c7644e3367a6a6b77758d8e4934b58af23abae8fecac25edd734030ee7cf39907e3eed8186a19a807103a9fc49d38f4c8460 -SIG = a8f9fa24a3dea1022e73f0d88b1c37d06d0f0b20bbff0ecdb4a40c86d7e475617c03570a7419d74ba0f1327096bf19f0d0cf9f51d483112f26922378682f4807 - -SEED = 880ef106733f04e76195eba280b3fadda0f25dcf96a6a99c8ccf842c68afdae5 -PUB = 70cee33d41c728ce7b141931e6e8524567d7601eb79f67fdcd07b9d682c650f0 -MESSAGE = f4f38d077f2b03da821bd36fde673d666e52f4832e1c0dcfeef049328acb7bd71ad2bfc49c123516e196c470df0847b3848a45a2c69bea03e2afa7e58205b63b523814fc8e242f059c69ff7e40f97be8125b70a54fdaf35aeafac79114a7b419e6bb9e70bf07adb559819600dc25e51b4b700d27ca5472a0e7cbbfd14e099faa3a72002da538cbe45d621ef0d5252ba29d83f8b3ec8389c9ceb6c6b2e8d8a20f -SIG = ff6caedd8a468aa07d4c6e7131bbda76182ba958649376e711f44c7bbacba6077bea878ba5949cdeeef05cfd4983b0057d275ea3e18c32659468c30c47ac8f0b - -SEED = a2d88f37ecc2b2c05dd6cb3159962c5f646a9815b2fb37791fc7b606e2913ed5 -PUB = 58dd67d7a15d4ca0341a4c869566cad8c4ee16e583a10b4824173b08290d92d1 -MESSAGE = d1b87e9e886dfbbdc8ca8ab9010ecf9bbaf23f72ab3cbe769db1d43c2a474a81651c464e9fb92734634641c9485a0239b3110771e7f75e05252e4d8f4c0aa1ba08626d7e96317c20acde2ad99b23bdadfd6f17468eb402ec5eefa57b47caf972b3dd21d89f0e2989ff87d51ed2e2d639c1644e698cbe0221b8e179f3cfb04a20cb2470216a6882fb4ff799e11536cf64219f0c075176bc7cf0f6c5b7925fcd6155 -SIG = ccf2400cd673e1effd20161d7b68a5fb87c1e99d3635d78c2da1b509fac33346c069163a6c46c7826a48bbbd03b05e6e2351fa62bf89bf7ccf9a9024bd157d07 - -SEED = 42aafd0ae26df1e7aa0276860d752783af97280439bb23eae46e3f84caac78de -PUB = daa2350adb55dba9df7d7af5101998fe515d311c3cba3eeab9138233190c3b4e -MESSAGE = 72131b80ad599b6f5ff698547d16e7499d71275e4e9b30526a5aac0b0c8b14fa4a540cfb1145fc004418bcd318c1a70e6269a3fb69baed86f363f5b8f97f569c20d4f4990e7bb4d0c39921268d636ed0554bd62acfcacd3b8e030217aafac3044c037e0f94da18c6b9a0932c3c5875d3a93fbdadcf67964eec9ec2be69b48f020f6c9874de5f8a5167b5ee024a2c2efd0cdcd2acd8c1f787814141e30b38b163175b -SIG = 116143650b6c133d617859db2429c2913579790b2197d7b7b1b4962b328721032ceeca58b2d56439e233bb84dc525e284ff8df2bde1db4986fafd21b3d7d6a0a - -SEED = b69c33b11ba67841c3d4e6f9234e35370a28b47662ac560b27c078b66ab1b021 -PUB = 9df68e9acf67379261744db5d1e377892f2b692ed5a38b37073c04de5d226737 -MESSAGE = f9ea126d3ab21961aa2433900a3982b83e0ef86d52d13440afa4817f9b822fb582cc3932bf450d4677c9188181fe7526ad6fe5abc61d0ae759f215013c0b2b41064cb6278ba7e39e2f4c10d6cc9605b3869e169d7da42e88eb857870fe6118bb02bc08c8055f0c189b62f79fb146b4c543aa30cc0cd57f037e9ef7a63711f66e6f2878931702202702614277d513f0850b758549336b30cf40ab8bd460e60e12deed04 -SIG = 24368fee5bd848b4c661a3be4f310cfc436e79ec4a78501b81095fe51614231b6ca1ab1269996ad2e98e299781af8e29804b24fe5679ca3ba650c5c4cc58ce01 - -SEED = 7b63613f6dae01cdcd5e6b37686971cd8d8a99542f6329a12854a9d8ff8105ac -PUB = 72ec43faf34d8730177d1f0743c74c20bf72c2394b8a7d471ffe2a04ab00811c -MESSAGE = 1816488f1fc83e1ed5911637dd42ba2077657dfe1ae422ad0aee59df9dd56a2763c2dd0ef61a12bb825b0dac1eda5fbb691c5ed58f3fb325050b4563a4042099982fffa5d6ed742d95823da8e1787cf746ef63b3fbb0e88a6c0beae4f7318366936b4917f507336068b194680900a7bf4a6fb69a5c387b97e31bc7f9be53c2a89e3651ce1de41b10e921b206ebf32e5621ef8081616dcd7a2059437efad014bb8e2c8221 -SIG = 76f50b2b9c2ad97bfb9499ee41928ac072da5e8bc71d0212550942332b62e70c8bfe1c722542394688decd917aec8f95353e1d72624b70ebed5d17f6c5497702 - -SEED = 3558d3a74395bdcba560e2c45a91960cec6cb3edbcd30e722f7f055210f37b51 -PUB = 534f43eba403a84f25967c152d93a0175ec8293e6f4375319eadf957401fbbd2 -MESSAGE = be75444f9ce6be1d83af622a8c478d510127db56f1de6eb8a5126522b09fdc6ca0862cec0b8b2aafa31c17a2cc477da533d276a1ae4f8e0759d6afa0b17411b5170b52f20547c72f3e88d48cb456fe625b62feb0f81317edf1ec09ece534b9f500d4e1b1bda2db21982aa95094226ee9f5b0a65da83f91121c96b3b4010ae7826c9e80636cba00f70c3c8a279b01b95294cb850f91709f4376662a580b15ac2981afe9f854 -SIG = b365b5561a13a54517cf90d88b35eb0967d6d58414b8c1547e693159e01378563654c50fb42323f09dd78ffe28056ddfa54febf44891e8a741b6a1687d728605 - -SEED = a35b92f244063a19bb5e3ed4d699ed2069607116d2bd08113f0d8373613f35b7 -PUB = 7ec93601864ee4995a4f7abcd3dfc101e9e7f369e63de1ae68a07aa7f075b329 -MESSAGE = 65cd36dae0168d69974f95f09dd9a59db799f911e1a15b85a00893b8c9a3d48a2f58ac126bfaa0a606c05d94701d273abf7d68817f2c71b1c541795c4f6095e26c9dff803f032f75663fd1698edd97ff3a0e72e1b7c9948b08bacb5f7de502b2fea67ca2fef190d60eae92d15158da444a49d2e9d5a573e8e177e8bbf7e6c49f907136e71d2a66cb07636d48768ff417c8beccf4323181fefb3124e434049ea45dd5019e40b4 -SIG = a23dbe3757e478dbc84d3db3a933b0428cedb6b01b86d8d73f3959878dae6f0588f505cd4d39f2ab4677b64805d629652a22529825c3a91d043749fc71f03706 - -SEED = 72d4a564ca15499b5e4e75d8ac0f28217d32114a0c649a7c8eaadd0cc78c520b -PUB = c766bd73837c4faa5215502f1efc90c003f711bbef55170091028a34493408a9 -MESSAGE = 6c7e7b62eb244a45d78436e2970dcd6c0f7db82297a86140ea58dd22c2195adbc956d4c4ec05354b21efe24cfcfe10e17622368848180d2c4680cc215e8ceea6cce222161f1e092239253b9746f7887df2425ab5a880bdba98153be786dc838cbeca016b1d06524bd6bfba809a8bb37adab15d42415f86ec0358365ea87b8150b05441d9d49846871485caae6de359736c27189736d8f1765f3e5c5f6b92168396390bee94cfbd -SIG = 8fc4f179330b642dd86ca9362651b83b006d8375ccef811d3c6706f91594651df2769953723046ccb9bfe66a667e0d11fc3ea2d8226234fdd5164765260f7b05 - -SEED = 2e5aaab298e66c2dc1d77ea7421ff895255f9d900db0450d63f9f79c1a7013cf -PUB = 0381f3f19045719b9e8ceb562f0e965dc07b09f371a963a281c749c2532f654a -MESSAGE = 3df0e54c711e3132d7ae953deb7b66869ee531ee40b63ce693206cdb2f4bda0a2569e913ac3e6532c5d9648efd4627780fb8a31d107e033f054d19ed8b7c49dc407d2e949de25f99307221d35843f6d5eb7de5cdf41b91dbbf34cb6c9c530021014b56abc44ac2300313615608a7b4a235e99c14cef8050887032209488b9eaeaa82c09405fc75bec94dd42d6ff1b599a63ee5742f3364093ac92cabab3035822aa867ae56dcc99d -SIG = 7c7430305b361a9e35b2780c4d4408071b2130931d39830ec8d313aafbc83a65dae19cb747d9d1c4ce3f359cc824ea8c92f66a42b8614e7848b884ac8aa4ae02 - -SEED = b636a02448003543db864b40b5d8d6dd9ad611624c9b0fc6890c51ea5592c790 -PUB = 1ef360495968e56e6d3fe740b1c84c4e4490ed682deb4305afd596efb280223b -MESSAGE = 4aa85aac25034f614ed44f7adcdbeeec25fcc2a9eea32ab6a8699506f7a1cad3bc892e9dce934e75b0a8cd14642b778599286cfd8f50a9e4f2edf9f9d6291a2e2979cf1806b93ed8c9a78fae199b2854a03ec406ab3f720835ee263fbbc91cb4ef0758d775fc784c7d5b251ac8937919a9e67be88c9e44cf2ec7f560269aa0f1113d91b84401db15a3c48c7dacff4939ee01babb982fb95625c6c3ad78749060551bfde8cce4fb8a29 -SIG = d4ba80300d5cb51353c03f28c44fd0a424ffe1e40d78ed7bb1133e8fe4e187505293b20a391da962c6a8ac0acec9c67226af3b6195dabe39b3662294da3e0e09 - -SEED = 5ca0543c71f568a00eedf50a9520f4c15b526e3fb0da816c29ea3d50b2f62a12 -PUB = d4a2933ce19454e331b5280100209a6ce8e569f993c2acab51dbe864c5cb2563 -MESSAGE = 4ef8496978d28c10abd54a26356ee55921ceb350dd4b742c4161fbeba8a1601f8ad0484b21a8cf5a294fac00ec8a6f59e3362e47bfae1e28a2e6d017c5caa75fb0f48482808037ca21476954d778ff1a0586da3ef69d6cef6d2d8df4ae7a85442a1e46c998cf407a6ad4c5463a43c248f3b6937fdbc845b60c6d85e0563cc16ba9675d364f525f669aaac95f428bb58205099f9e4a6dbbd0151fb65babe123e5393ad64026935cb488aa -SIG = 436823eeff3edce5d8587d68e5473ef3d8dc9465b558b6e8e7cd3137eccc80b4c4e806edf13619d8e717e69f48d7061b68de02c8209be1f7ac26ba8edf606d02 - -SEED = 5f87117da9bbb6091c94da6b230b7d8f6de0ed2a076413b92eacdc43abbc6897 -PUB = aa786a146226832aa73c434b0edc2d41d2558f820ab8f87e09e6cda91072b9b6 -MESSAGE = 2297c40a2e8365bae4c5f0630c50b13bdd9ad9770a5d9a9451d00874b023d25ecd468b96571b2f16dcb1b0d3d756c1f044fcddd1c51f27727a0369c9cf25bd6aa59551b5b07cf8f807d92b159198639704740fe6eda0f26dba7e75d4530b2800f03fb6aa677d84df75d68d4fbb64ad21001e3fc87b609b9c251e8ccb12bbca927447e2054e07688eb8a20521a52249e7b943bed60e6a93c01e3eb621f0460c18a690b6f6b66edc6e8743a6 -SIG = 0f19e6ea0c05f38185c01c2d6477995daf5065ba9d80173fa6bb23a774dc88b3aae879d8a62471d2d304cc3dc66278a7abcb0bb0771cd278e11e7b932e9f9b0f - -SEED = b53a644c92ba2dc7108b16833f09ad5917846437225a773d32d79c97733c0a58 -PUB = 515818c69c0e0a1706b04143842f3e9e271448fbaf3a899119c32f42566ffd33 -MESSAGE = 13036daaee45fcfde0c53e06d05aa9c01ea94a67e86c6c538ccb283b368daf7078d3fbab580c76ecf82b4e9660f068dcbb500b80595017c5be3c448fbd8a17d97c5643197890e167b35345bf65e75b82c8d65229f2f60aae2772581bc99c49d416bc3d78746ef830f1af944f4a6715ab4ffb01591bac2857f1a9c9d1700888780006a31607338f7af7bedf6efe0b57299ac915526fe5e1e101298708c6e61b84220afe95b53f895987456152 -SIG = 13d2cbac7976ad27f0bf669ad588efb2c91bab8507d57fb16bfea9caff2b0964e75625c4d808d7bbb78c5b464edffe4949ecfbc8b95ff6fdb1bdca2742068100 - -SEED = d27c9eafcf88151990bb5b2fa8443e709b5fd8d78d233803322dc86d93d93295 -PUB = 08e0eff529776714686196d817fdf71eb5b6e8326516ef489bfe186ac5c5bf6d -MESSAGE = 77c35bda32a5967d8b302fa7a47583ceab89c9a609a667b753155fa6996f8631d0ebedfe0ac364c77e85ba37311f0de57a0dc2c1e9e400d58b424a322e1d5771e0a9fd9502ad0232ce544f07d8c66e7c3147f8607ac6189bb69066f2fad631185f457f467eba33228ecc40e894a77b571698a9bfac841a54eac5219da99c6a9125c469a22fe81f3b951433896f19ce39b373fd7e5c7b650a5ef2365ae7510b0da5e49d7c07073cf166a98387e8 -SIG = c254e371445633137442eefe40ad4a82e69b1ebf48a685a2bc6ffbac126d228487b2e3537c97ef7410342091962e50c0cb85de7b39ceb41ac4078d40f3407106 - -SEED = 70213d3a79c65d6dbba542a3679635003a682af5fa58de6b0d65bfa24184901c -PUB = 4402fb92cc1249dd1ae1690f03b3ec4f1e9bdab0de5bfd289f10296830fd403e -MESSAGE = cd6e1cd9c90f566de043d75d7244ecfdb38e8bde2f9a6cd5a4fdac72b5ede6af62d981918c5e610a38789274fa10e527f85fad209b76ca1c281ad5890f9c96d35de522f1ddccb539b8798a0067acdd45b6e344a5d9a97731f545ffa4b17b875c67b48e9d4c4ba72c98a4505583fdbf1e12f22b5a7a494746cc9b6c1b571906c67fcc883a9c15a3806875b659e5816b4276c3190e25cc1ac3de47bf99c49965388f54f3ef8eb569906c6008e5fbbd -SIG = 5b6ce2774d400ecea8a808f5fd0a797ffc6116752376cd7bfa3b2cca3a84d5593f5c03ad3eec1d89532275c47b7ce2a0e9c59cc4028a8a65e5bb9097ea71c208 - -SEED = 5d540b3b14f0c0175c047eaf026c9070659ef13e9d28e0c5c516a428269b14eb -PUB = 1d2d4d551a57c6fb2b04181049d4039d575cf80c0bc6ec7033067f27309344de -MESSAGE = e4c9e8706898cad4ac68d73c130efa04a54f8ca25919ea6bfaa54c8c720ced854c5e9509102c7b885aeddffbd1b7f2c5922583677ac9eea9a108c7e83e8871aed5a084f5440b0f391ad7ffc6bab4574af1b96770f4370e8e988e85ecb1a8d6034fc3d7f49f7422023b9dab5d0c16beab5f5d37b0a4d7de197ad87cd4ff8ce78eb12e1daf739d8b47ab380abe9093356db5b59717751a49e1948472fdacc259ffffc8c1dbae592607d4ec71cc6a8f6b -SIG = 32527da755312889935dd5ee91b1bb117a5d377dd23ef5b7e15baffae9a54391a3fd234bdce073e098c58d05bf195b4c3cc63972383ba4b51072971aebcb620d - -SEED = ca41769caf1717b4e45c93c121dc82a534fbc6ec0986662c3222d71492bd1176 -PUB = af3f89f6187dbcf9217750c67ef89ed47b039f9eb062ffec9df64ab52b0b45cb -MESSAGE = 9de8476c5813848ab1451537841cc178002181a2182af305b12e5f7c3b1d56b22cf46ae6276d1826ec0a8c9a7d9f68083b7225bbfaefce82b3b64594052a7700f309233a79fffdfccc5c21400c91cc0e418d5141d486b5219901d6dd2447c1f7b7cf5a0879e70e1dd658d0f2ecf31ebeee11a5c74440c63b9d8b45318c3465d7ff03365edd0385edf80d4fded51f0f7533ee4099f19e93bc9d08dadcd13485db239522ffc81e2c051f8796d62e979fcf -SIG = 5cda872f7ed6d7c90218ac10bee8e214f3b34d15d25c39255ec9e6b0177aa3cb7368d11cb8ed6ff5cf0c04281d06bc4272b8bc09c23f6f4cd5a810ddc7b9c103 - -SEED = fedd63ffd4cfbf618894962e121a9025eea318a80a1adf169d6490445d2e02a0 -PUB = 542f2244bdb7d84b87e628a8e6a12f17bf74a9a6d0ea46c595dbfdc680c04b26 -MESSAGE = 2e2ae584641be03dd48f9c618077aeaa18212a4241f0c0194ed23e370d741a3ae11a5fec3b040c16eafa4ac8d18abaa7ce8f286967337189f0495ffdd61995cde31dd8dfc3df5700b57a7a29980e9c823fee85d61451176729e72787c6109b47359b93dfd62e1e5a2d642c057242dae500a94ca1a93bc57be1ade76fe4501c0f6377ed0e9246179aecdd9946b671e8190e1ed23f966e96409b948222d8ea5839de904fc51348073b8f40edbd9b4a4b2275 -SIG = ed59d9e23dec3494b0fbc5d10cd02bab86b3eb35abbf9e4d4a926479f134583a44ce72dc4122aca377a4072b7156462b74e8df46b686698636836ef203179c07 - -SEED = 38f2184eaa553656ee2902706bcec4acb5af25157ca0f6a2d48de85285fa3bc0 -PUB = 7ff03fb4c82e9c15d659df424b3e73ed1d78006f3e0b79eb64d98c13aec6ba37 -MESSAGE = c2df77c9e479f61983b6c7483ef93fb85a103b213923926523065ebff2257e85427e05cdc27582ef6c16be353a3b250372d6370eecb6c8962917eb656f2641690189d172a111051557abc2494e32cab65ed0633affe92408b55c4ed8af65e2c5e7aab887a3cc8d28c52e9e1336d0b7bb3fe2cd843e7fa1680342f8a4aafa02c4ab252f08c3d46d5f00fd01484263ee635284f6db26d6298de5b0dd238da40a8d2a93376da0302783a0e3be23d9e7f990d25b -SIG = 4a6413c2c87f2b3856a8decbce493adeae0c69c94134707fb0f18f3049fd3e3d051abdb9d4bee253c6107c02d57ad7cc9f3101db660afac2b7981938e9564f01 - -SEED = 8bfca48462d2536f74b84f6af59f5d8582ff8f7ec28745d672e72eb72e79d3e9 -PUB = 9d10d275c3d3fe459f7fe2901bce389191cc8483c0f51140d9c62b08fade81bb -MESSAGE = 81ee4cb9c45da691dacd7dd09aff59737267bb55c3ade1ba32c17b7d0d2d0c6079c39d5fd5b29ba5f9c1762097709843eee5612bd20bc8185bf64d5c934184e13624e6f877a2a5dda15c0df62afbb97057cc91cac9a18406a0e0109cc39b2e3f812e227a4062d5ef81c92c22a7dc797c845d71eb6ea9e42ec8417fba90a96d2bb1439418330b4bb2f99c6d63d304a0e506dca9653e5de0dd56e309db1a76a0faabab163774f000088cef3d1b7a6cf661d2e1d9 -SIG = 44d77e439ef6ca5eb940c60ff8732ddc16269ea023bb2613bd447eba7fd69851226c4819ce8d44985a49f3f41ac7af33c47ffe5f89304a3256e445f8d686e307 - -SEED = d7480d4272bcb1557b1bbee04915c126a52ca6d6a8bb5314a0e1a52b59bfc99c -PUB = 99c839d36d8f5b8652618ed7b0fe9ec3d94efff4c453c540631476a5979bbbe0 -MESSAGE = 615cc19f942017365ba8bfa256ceccc85ee289a1c34bb1442acc0716c7fc2caeb76a9de19adec106371e47a30d2e1239ce1f7dca25526d604bdd647659d942bcbac368911349c3b946a97da10a42dbcf3c73416d2e6ba22bd29d9f705672e9e338944cef01ad21f009742e07bcd888ca31e1ee953e8c1b1fd954b7dcf1a0b1d5a069065a66cb721adc020f4efe1abdd16742746939285780d753137ae0140bb410fb6ce33676c27aeec593a88cbc73afd9f40511 -SIG = e04dc8442d352173e931818e290858de85688a4649ea3e3c3ae74edaa54ad01b64622ad8a090b6ad60adfd01881882828d39078bb5b2714fd3ea8397a342fd04 - -SEED = 3c2d3650735b41ef9006bb45e4be2e0aa5cde851aeac421ee9c1b492d87aa18a -PUB = 3e46ddce298844fcafa00a1b47eaf3de70596df1bbee3c809d1be7dd94080e34 -MESSAGE = 1425d8d218da1a10a80b6a9c3c2750efe41657984abd5100f451ba949db01046b7126be8402334ed57528bac05622553a86b726722695a8fb331d8565417c4ff0f251a320ad06dedbb750def35d521c3c4cd571a45ada8450653d5e81fe0beb53aaae787b3eb653c2381ed55aaf2590ee5ed8b6626f1c4b0430a54f39658624e6635fefc98fee8fc3e1cc7ff3dd420de9da11a62fcae0e0cb454fc6f7df03954291d26202f1b188b657b3bae07389449b75e67422f -SIG = 3f2af01ad5377ac39040d41a41e36e7b93fa7235b841791f432ecd7f91a3b21ab7196c883ad5a7db446f6c06672460f3f63ef863d9432be9caeabb79e87e2208 - -SEED = 74965996268cdc4c09220bd31ce07b217a03826ee981fa89f3a2359ced095ef1 -PUB = 4096d027c1c5ee4cbfc04b9d534174029fdb50cf5610d3021ef933b4caf33985 -MESSAGE = 45b2f064615bf774fce97f51c464685d7b3e4fefff9231240a719b3b0621cd4ad83305675cd6eaaebff791000b0b1fa31d82d8181b7fe57c5e00cec56ff9022e9ce8db66356e408e3ee262fe627789e65535ef1a63e8fec933be3dee34d2facdb8928cc456abf2f3e8cab47eff1ca42e8b0e48d2c73e7bcc5de3f1056fc523dfef6b0023f32889ed394eeda032abf6bcaadaa7f3ee74118760ab6d91df528bdc5807972c85fa7cb56e387d7332e779e52d0dd7db0cfb -SIG = 8c6628344317a63aca6f78cfaea965b3aa5522ce914195141c08870a1b8dacf34b79c7abc693cd9e5ebe1a2e86f0332d2048db3cbdef01687962d6df249e3800 - -SEED = 0abf069c08b2691c3a26f79dc8ed05cb71d220ff78f3a5c5780ae9da18e45643 -PUB = 9ef3b5cc016cc82dbdda705766aa448bd61fa1aaf1170efe9149daa9fe64a1ae -MESSAGE = 0d055291b2e861eae19ea0fb2069d8c9eef4f1347f3576d78411ae7c0b1c1caf31fde736dc8accacb662df76b620b62ce90b9f92c83309128621d057cf845805949088e938ddbc3d41c5e5541fec8298687ad2f79acda01aa215d25821436eac9d268716d4cd6050260cb4ef6aada4835e073a845821ff211ae2baadceb6e57f06f88345edbf93bfdf54fb74123b57c0fb4a79608d8db6740889e15733507799f7a1fd3017bcd77b28a2bb6c91ecd154e9c5a5ffa0eb62 -SIG = c7566fb3b4d8def667e040f276d3ed98d36dff460126a75b4cc2100386bb01c642f6d8de7e649be6e0818b08d77ce60f4ee5e7717a50884bdee02034ecf1cd0c - -SEED = f3fd5ec5e230b6dad1ac3d3aebadc7863ff89de2a1317f424d15989a3efb0afd -PUB = f99e5d5eeeaed1205cfb5c2cc4e5e9f6b4e7f64129f860104ca6244eb9feb564 -MESSAGE = 71f28973ed3df05945fa0bdb23e9beca651d3ee6bf9fa45ffdc6061e42fa2e8d76235f0e9e2daa65e52631fc3bead33da055bb492e4758e598a030a33b3c40b34371459b233ccc043cccc3a3cbce549e20e0b2b43305b64aec661aadba6556b17d76e3bbed62c4a4eac4f88603996752d2363c8d4a2789d128f6e959945c68c30146d194ccb6839ec65344601652c18b0074e2bc7668311697d960c7066597924d704d02a0193fafbfdf571ee0dfe414dc2f52896912bc32 -SIG = 44b0124663adb0c73aed49f73403461fcb19111b0ba17aa996566f477e37d524b0e1f107612fc52a7c767b181fbf4d629bddc08f30584dec6124c5d39d423102 - -SEED = 738f1310a4e08f917a0a5c1fbaf4ef72f95ee62fcded50868a3daf98856a448d -PUB = 42272c2c8b08470ee5dd8af8849c01b7508d3a3c65b0330e695c841d5dccb2f5 -MESSAGE = f0e7ef6782d04c6943b19eb66ff6226b736e3b0940c09bb126bfc4c4ca7a5e7016c286b7bfd73aa6a79a96031bc81cb5da68cec71a6a0d39780cbe6a0cd4774d3aa06a881610444a8c9d19102294e5f635187aa6f48d11912c7094b38833028d570cb110db60625bb1bdc37affa25ea3c8f8dbfc2514f4365c62b2989a66d27c80384e74ae5fba8c1c2af9c72c4971e64fa6a1dc2517b31ea57ccb0815a7fe2da0f146caa08431d25d151662d9d26e95229d0c62823664123c -SIG = ce1e3577b6a21016b9dd0b517baa0ccb107bc199b8bbaef68f950c8ed58013c853b4d338eedc675079ab1390462ffefa6a959b043f8b5651c6ca375ce0b4a403 - -SEED = 8841d22aded69c131ef5ee0a10ab0a9b77cb754ede8d257a5372726e2b499c6e -PUB = 715ecca63681bc6e9e31d18848902f4d96feaf43b95d008642903b1763bc9fb8 -MESSAGE = 087ca6be2a950c024b3e7467fe00a7d364555d5dc6770f5ebd260642525bd3c0f965db36d7b229a57421eec64e4d991cdde59123034470553f4eb0be81ad2936c8ca26bcab4e5d79040e29798728601684a468323cf3baae4d948d0a1fd905effe16dc44642088df53f6388bc480edf4aa207d0ed161eda345712b4c00cb05fcf635ec2588785bfb8a27cdc28996a1db3e6787023393c075d83c9038fed7899c55fec307de3249c14bda49e8b895860942c36d640bb893779142 -SIG = bb2bab7003f1311be9b8c883fc4fd528adfd51a9c99db3dca8da0fca958da19a10eb22332667b1a0065d3dbc0d06269a1259b6a890484aa2143a52695f145b0a - -SEED = c02135e7b65aac72f63c32bf5bef5b68c7f3b8ed56208e59e4752070e9d07095 -PUB = dcf600f244037a75203ae11ac316e8dbe9986f0dce23473939334bf5cea48b0d -MESSAGE = 86d9491350d2566e708ed356185d610c73465b2a5c7012919958af2cf76af995230d360de400b7137170dd0835f10fcbec224ee4e42c7d1cebb7f580fea8ed6223163bacdd1923a572cbb6dc26ca8b17ade68c6d2808c4ca1eca28eae9a145f68d4079d8d59d140e958228e7e99520e342dbd7457a9159740f48bdc27b93bdabeba465cbf0c8df5ef2c0f9386eebe656f5d749d5f9147f525266910d7b80396a90be5cc188a9a945f93e753fc99bafa18ee0a6dff79bf8484898ef -SIG = dd5cbae479eb5e229574c21ec3bed911113a57a1916d3313457515d55cc5b6e6ebc52c93f821d13988dbba8df5096d55ff9c39e7f9d561cb58930c96a7a5d60b - -SEED = 154a47eba1b8c38362ea61faeb0c0ad7e61e412a3cba4688af0db2a487208b1c -PUB = 16de2c894a50cbd4ca90419a4ca64942cb14bd335c5d3f4a53e239c280bda725 -MESSAGE = bf607e8b6e14d9c8acd96815af0c035ac73c4104c93786ccc1c9f859395dd781900320ebf356aa991cdc9f503fcee9f83675888a7d592002d2a54a573a96994b3fa865538c617ed8ad1ff62018288a674f449be0aab5222f74c4fd475ed6a8dfb27f45287b22b2b6c3bd15179f267d157d7d8a4159679be85b25c2bb2ba850aaed9ae3ae571be4f75836329cf36f412c1c80f1413b7661eab4a8e11b6024244fc62323ff02e38aceb1737bd474bf1e98015dbc788b027bbe217cf4e7 -SIG = f4b6eb1a8d950e887fd2f30f70a23b41871495bfa5b8a4ad3996cd9bf51eb742e07f4c4d2da4b01ab087367a50e2b65b3cef514e40d837540b8c89966485910f - -SEED = d3028431ce2eef73bd940ab84ca29f13fb26436aa25e1b7bf26cb33f17fdf817 -PUB = 63df203e2860bac4d352e722c1c91fe3776e1cbcae8553a4f19890260bf0e457 -MESSAGE = 086335d61275d168eaac0540477f50d4b15f9e50b9be693921ed54a9941bc40643cda62e1d805d0250a81146bd5fe2d39e81444d21e2b21b031c111306cacbf52717f6fb4cd3416f1215f8dddcedd2f0096b0fcfa0a6cc2cde7a2bab7f1e32790b5361df3671424cc722f231bf71895bcdcb7b22ee074e8fb4a9678504e735366c172f07637b7a93149bb21f38883378a1db273fc23239e35337f9ce566d8ddf3b3133cad7f2ce81edb503ce1d27c5a657160b78dca9aeaea379be9c85 -SIG = ce9729a96c3ed28943b27839c73382ecd572960c1f9e90c5eff9dd499ff48f17d25edd1268effe41ee6a81ce48d84de513df9c41442621b2f5491e346be18c04 - -SEED = ee8985dc27504440a8758d4c53e4225215797a00cd8631d59bd93bc66f373d5e -PUB = cd647bb065693d486589156a9fa261437534dc86f46f72d0a800399a7af010f7 -MESSAGE = f2220485addfebce02a833aca33381d1df917ed609950ed24f85e3b02b2b994b4d939784e332f41064c8b4a2630ab36961742aa1cffdcb08c144eeaedeafd48b5dbe96bf24350e14fd68286bc08eeaef8bc6ad9e195d1484afcd30afa8ced4848126d56c81b43c27a5dbbdec1a50c11062ce21c61d860c25a862fbb75c3bd51c8dc07636668669bbf751eacaccb3b51d2c0d4140316cfce2eb18d2908cecd5a188679bc5f5de290f548e7ebc57d41b589a24ce88ee48d97e8d0c7c769960 -SIG = 5bd60ad5e9bad9932ca9c75f231a76889ae7a8b864b91d1fcba5c5d4bfa1d92838adb974842a0710779b3e3094044909e92c7cf046ce519f4c68e8f19ec03c02 - -SEED = 80dfe2bf7387bad4654eb076f8dae9595163e40127f5df492dad7df04c7221c4 -PUB = d1783ceeb9cf8e4d07764c473fa4061b8274397103f2076d703249d758b8fbd5 -MESSAGE = aa09d784bb09dc999931ebb4c00e424cefeca104818d8eaf0661f09728ad025ef47393210571f17404e9aa6d8cbd5fd88cd7dfb8e2e8a108c05de206f3408234a3b463dbe71a07d05587324524b7326ee79d3348ddbed7871b86fcb488031dc9ea93f6b8d7fda6239348a562444faf1e72d31af35443e9df53e762f3e56b48668f9784b3368ab278a48ef4546a26cfad0d0a5161698f26ee8d34fc2b3d6dfb93b009ac296f6afe487ee335eac9f02cfcae5fcbd1a16ba4e71be1b112562fc2 -SIG = 27279e3cdcb03ef557a5defc2f6c58128a6dc3f8b0385958014e709c1f61b0ae6b403576f0e454d5e4c64c173138ee4bbd5fe7b60d06c5abe23fe99ee3b46a00 - -SEED = da1f868542cd7cce7a5ca3fa3c24081b4d2344b21a157f0264a347132d19659d -PUB = cb3a25a53f272ea813804468d6500e96a1eaf822705b7790a8ac3e98cc4e524b -MESSAGE = c6987ef380d5d0e74196443aaa3a32356cbc02636c5a4b6d62a8114b2111bc1abddd9e44b3672c18b58d4ef591af4562e020049f8e1274688e1f8e5296d2f9252e7fc84cd1d0c58e98f0f160530aa22c871eef652e71974ce91b4a65fc25fd09fa1b6c32086e98ec708d9abcb1d9cc8e1a089ed8db2206ee9570236ad69b3de6821862fd2c70cd83a32a68b0486229553d928de48d03a104e87381964abea76683976d527c84163a12eee0a55986cf1431e9c86cba8182ca94689bacd165fbce -SIG = 75c517ade4f08d7746305743d1a776c3c55eb5eedfdfcb5eb1d5634a1bdaf7a4b8d24187d6c8850e3ced6567a03c4c59389a4cf47114ce5473160f230546e60d - -SEED = f13daec0ef33ddd133c7d244d10fd27ddb23705280ff5f1815f0f656d836fe84 -PUB = 2dc7f1367de672c51e005c74f876f982593996873acba079292734c209c2b111 -MESSAGE = ec02ff1804b2b309af3158b66272a14a3aad83c41a719846f7088ca9792af575c78913c432759f0b9a748bdc5568496e41658cc1cdb8da6c91d07c3ec2f4af504249b996aa00c0071cdfa793f82d0ec5d267262f518fc029b88e20b6201fb9e05abd3f9524c5da2fa8978ff2efd48120cf00822d1bee90df816125d8edc0cfb5de66d16be63896a412a62b031b7118ac13fe2c9faa6b1a3342f9ccf7884166cf489a84de26b5ce5b21856a3af289bc6622c0aab9f2142d393f5d4b236779dbb066 -SIG = db771833f7fdbacdab2b5cc80eed50afdf13783b7fe5e903d5dbb4c2e535316a6eef4c34f004d2b9a4e2700bd6e2acdd564c3c80cc68a303f5fb091cb4340f0a - -SEED = 42dc16c57fb6f128945fa101e05bbf548ef7d97726b692fe404069cc57ccefa0 -PUB = 0a1ba5df523996f954b34ddcfabad3f3dee21a5fa7a4ce322d216bd8ccaf438c -MESSAGE = f2714c23a3a6fc11ad15c980b7350fc84217877661188055ff750d82c49c5fef7bc8e6aac574a1b79a3f26d16969c0f406eeab3e9e12850a55709745e30dffa62a69dfb2b64b3c1bd2bc3586e26d4eea714d2a7b71cf79fb8ffbf2aaad00ca3e4f2b6f503cc1fef2eab3656fb44f8d62a8db8ab58f394693949eea57fafecf005f6ebf1287dba4d2d623c02ea171f567e526add20709ebcab962f83d98ef668ebd01ef20488b3665e3a446fbfb13d34050942c749bb2dffc766367fd452e68e5b0c6 -SIG = c75977e83bcfe9df7292a860ed972555b5c24416fd4b7ee3285388fa5b1447608e4a347813cfe093512a7651e422e9867db7b97c0b0867f0b8c7b7f4f02c310d - -SEED = 90b455c6bb9cec83e137357065339d030525d0ea7f5b923a2d5972c3c12aa37b -PUB = 5cef038c16bfa4b4c923a0fe70cd7f25c8bc837fdf5a7efb9d95f21b96be925a -MESSAGE = c62cfdb9d21eee6be47f30727aaee51f0703789a431d32228533350217a93a18900669c95956f3f2ae90dc745a71e18340d058d16b4c6fe33b64af8dad973fe5dc02e8520705c7a8bb3ccbe1838c6c249337f9b6a4c0e1f8a4e5d103196fa79998923d0422e9d079a72cc2a8f86d659031a607d4cca0b947b3abeeeef64c28da420d05de665a5510fe55f77598ecad7faa0ac284800b53829394c4ae90be66678ff04ab46da265ae06402d8c83cad84d61a051de0260559888e779f74b72a5d71c132f -SIG = c9345eec2c4a0aec732386494a69a3fce8b8a1be366bbed1659f131fe97cc037fb1b7c1b68b0f3023945d20090a0cd2c1553a47faec4d66fd816ce121168f309 - -SEED = dc185c2ba0b378dfe5dda510c32feff535ca2e8a02434b326e0158bc878e8848 -PUB = 33d6cc05a434e419280d5864a1af209a2c676814b70f72f8141ac7e0573ee63e -MESSAGE = e276b11912cca5a84bba650c172aef3a4d5f91ac722913bb891a3ab0424ab07ea709cb8bba3a3d11f82f51c2af0162a82f7219ce27b35a30507d536a930817e40f85a22a5a432b94d192c3c8911777cfdb7fe937a67502770d6d75753d3ae88229e08f1ed23b4328d862ac61863c063ea9848f8ab96a0213d7b936c48fe754836c98487859d199b3d940392716a1d569e6c0cb1ba918932cf88525e256c8abb11aaf0b454655d5db55713cebba287ae202651ac872bfc80feaa7e00d47c0be38e658f7c5 -SIG = f1e44514d2ecbcc8d1a7e84bf584ce731835e9894f88974f098d456b60718f575ef4d8062f2182504250cf83bb2af2a79b1f58a6a97bd98da467132d7bec2f05 - -SEED = 90721c43bc366f24bf4e8c993e138024682f1029dba35abeb0d60c7fa710021c -PUB = 7c63a2f13b7b220a0bb752e3800753b8b6b32669378ce131bb77a9a8d230e9ae -MESSAGE = 651c9617cac958c7edd4a5f3fedfb83dc971abfbb69a31e898cca8472ef068034a6d2376ee0e72d0a9bfee275796c3795adac8ebe1d12b66ec268f6b75fa3941154f99e223faf2cbab5b92e2b3ba7b79be7700ef9dba69253cce5356b0c4e74703cfcafdb5546850b46232675c90c02d5e426d33d60cebf0c7930182379dbb007f536163c8ddbbd3157bb2da62340133f00ae2682ec6baa6416b5a01521cc10e04695295f2e5b94c05f00383ffe954830797f6df823172532f98165fe314ab325929af8385 -SIG = d2064a6d6c99c6c3f152d2d435f24e34b5459b082ef11e944a77ff54ddf9862737ecb2ac8d54207d36c51ad41f36490a111ba80e126bfecb09def6accbdf880e - -SEED = 9cec246758e412e7378b4579eafe9fac5a25d5405f9270b5d7e543414ec3d5da -PUB = 975a9e6a152caebb2f9dd0deb76dd922b6dc77055dda03fbae9e7c685d073aa1 -MESSAGE = 17ec9bd47add6ccfbd787af0d9013e9cc979aaf850e09426d3b28edfd71296eb31ff8b21c5fe7be050f536324c3ec48850e0b508a36bb4cb7e754b327183a1b394d88a7941d1ce8dac62a5d8291874d78485e51f29ed05865a206e52ecb12c5d107d4ff96f25d3c5d181d2c4ba6463600db1cca32857fcf597cbdfb2fda2708a8aba281b43c3d28c4a4e7983361509f61a1074e6f0ad6101c7b567ee4078e9839c47f46531b729ff0efeef7c9d1a8d833d9c0f42812a34187c3a778c165c09d6459c9c7ceaa2 -SIG = 9bad1e3b1279ef658f4d071644c63ae2b7a780357e9dc426f1650ec0634dfc520f8eda9dc8f10aa7324c5942d2347ff8802bd90e95fcec313352cdae64f32a04 - -SEED = d1403f63202e080525843bde255eeb6b6783c1caae9d6ed00ba60805bed1941f -PUB = 238aea3ad6d6f27783e70516bbfcca4770366b50ed0fe6a4e966b53af121a721 -MESSAGE = c4f17d442fba4ca0df8dc1d0628d7d7f36b60b5758d7c13b80b8f97a62124d96a23b279565495a8accab5997115b13a4ba220a73957eb7930520acbbfb6f54cf68726b6450c6ffa9470b055ea262914e2bc612633f1ac3d0618a23dff188a733d76bcbcc460f52ab61e19938f9c8caaa792c208d1f6c754728905fda51d881a347a53da744d3baadc0a76c474c558680269095f9084a74471d5c09ffc29141b5bfaf4954dfacbca663d037b17ebf9559882233e5ca5a8bf75cca4fc9c5a4109f32e145f3853b17 -SIG = 8e60e73c063816795e29f5d64ece1159f1b5d5021a6f8f655e261a4d0026f5b94ff2923250499d995298480512e4126276aa4a226d015a95827b3ce692e23302 - -SEED = bdf6bdc31ab0b5313784483abeca6ea5e9cdc68f81b21f350d09c3907bb9b6a1 -PUB = 03627712b755e5069fb9ab8f9e899724029a7f268af9398821eeec9360c9285b -MESSAGE = 90a66aafa5642a98e79f0d88147080167b11e4466518f195cddd8940d12ee4918d31a6d4cb77d0bf5af29983bbe5085610a79daf0c75a78ccbcffbbdab2189c394ae24e265bd8c55fd3f4098e1b175577549518e7a4dcf7452086dd1278dd58ea4c0aa690e917951ef39fcff60cbfa1e90910bab5374928d4722f702bf5ad6028ffda6541fa5ba1a3779ec78b0a95fe3850c748b6c8f42f330ec79541a52a1cf57db72df4f92ce7f748aeef1af33bc5ae0a82c89dff216f23aec168a7dbb510aa632daabcc971b3f -SIG = 38fac603ed246f833f1c0fd4585698b0a71305eff0d14a0049b3cef073bd036dd451b3dabadaaeaea2aeaf83d395746f4e86866ada971cbe482edb0419332f0e - -SEED = 57b3b14ace1cd0cd603e6328bd219ee7d9d094487fa668f28aeec02b43c909a7 -PUB = 24e6b6395f97ea0e237186d469b71923d2113adf403beeeb4a2d27909aaf3eda -MESSAGE = b2e0dedd802eed996dbd5836bf8688b0d1201bf5442ff9bbd351aeefe1a0c21fea2b5c9fe5edee47e921099b05aedaa80367c1ce08821d783a5b64cf059c0f4335083986a5a6ecff8c84fd40e0ba5dd5e5d2f01112a84ce5cf8e0db78beb182d9139c0b0f3e0060a3fa73869e96423f170df9af1cb9c35566d87dff542223f6d439bdb54729d366aff637b0f36a5d14b15d612bd03076cc4d04c1f25b3ba84e0d1fe474e5718d1a17d5a488465662ee4c3f664b4c9274b649d78cea4e85243f3713239048a908ce3e1 -SIG = fc79fdc6d090887a61e43c6b9187b657d2e4d9cbafd6e7caeb7ebdea842825b78fb949d2c49a0cf38b6c73296d82c8ddeb1fe2d40aaddd7964da68acf8c66f0e - -SEED = 018a2c3deea50ab506751f9c2adaadfd9e2192121609931684eb265e193e7f89 -PUB = af410bdddefc644ef12c9899ff71b9e1d0dfa3d69d8c2cd676c1916b34591cfd -MESSAGE = cf7813efac12ad1c7c7322ccbe54aa0e9a8ba4fd4345b06e4ce7a35c8b1cd5e3f7f0688533849ba2cf4c75b6f20926a1194a72df0e1b1b34456a2133112d006722fe811d5e40c4121159ded88990c0ac2bfd34f35af4f07cc402e9a381a675d03fec7ec438c4ad9d929aec8f242def023c993c9e8ba18c7428e88fde68a4711e506d7969f63c8e0bc83ff0de4e1336106c05e09d5922400e8a81bf54885667899785882b70f20dd8fb1e75f5855b765a256da4341bf23ea0ffa18aadda381816946001045669c8d04df0 -SIG = 7a44e6a31932dee6dc2d8394e29a6551d13e6c6ffdfa218fa5b998668d8439db5e05379fbfa0da5b563ed966435ae2c54e3ad16e1a9fca1f5a157a080704ab03 - -SEED = bea445e9b6d3f21235912cd6c42ec0577297ca20a10357880c2b846dd8e2cc77 -PUB = 024174966221699ea4b0a37e517ff9b16598ae4d4e83bfa3ca50bc616841f595 -MESSAGE = 4743c7c099ab815927b3674d0054b6de59af2811abc2cf7fde08f62929185adc238fadd5e75ae3ba0036ff565a79405b424f6552331e2789d9709ac1ecbd839aa1e91c854817597958cc4bd91d07377507c2c8d3c006cfeb6c0a6c5a50eee115e21153dd198ea0a3aff62b7075d5a461788783f050e659c572963d7a59e5afaa2b9c501f43c6ac08ab4797c4566d22b93cdf65a99a2a1d638e79f72b5f4631fe5e9e5f968f6db7a1880df51d8febc14942672f8ea6fc3a72814a44d66d148420a69000f68c330de5b80fc6 -SIG = 6964b9c5903e74e99328acef036558eecd3369150a52e2cbad4bbb97d461b3dfc6b3e8455813a4f4bdca46302e02e683ecea1820171c538e54c3de6c954aa407 - -SEED = 6447540ed7be0a11c2a8de793d83c6e244983db18d78ec9d75f1729c92e0fdf1 -PUB = 391212c8edc4d334a5bec860ef0f5ebb5ec44e8bb51c0f6741998959b2b379fc -MESSAGE = a4381c7638c48799e9b5c43f67fc3aa3cbb5ec4234f37e70ccccced1627a57683d1e53f4e0883d8b462bf83f1308630368c89b491533ddb8c9a5b9e8155002fdd581a9a5be0e430b9086a6beac4720210f87b14e862d97e5cc69286786a7586723f231ef0e3e1b932dbba3a18a0cb221cb07f80e6a8e1300056c13e702b23bfb3250ec7cc864d5c7ec5786240709c56024ea6be5f7b15a4fa5555e39a744a1dc557df5b948db220b3d5745746691dacb4421641cdcc12e7ec0450293f19ec57b09cff135847aabe446a61332 -SIG = 3ab5f88e2f7276b5b6583dffba5639993a905dbf9b88ceeaaaae3335800e4a5f10f83da6d6225a8dbe99ae80075009dd508786b3975113db478e14ba101bee0f - -SEED = 0c587a811add88b994458c3c808ac4e3a83afab26d4cff5c961b9df0b5c83344 -PUB = 06783b0cdcc5028c5638bd748f0bc76f7e94d1aa2015ca948738a3500460aca0 -MESSAGE = f56dc6b76076325b2126ed11d1f09decef9d15c31d0e90cdb1a27e089cc56329f6ec3f665eb6739ec5678b3f37ee1fb37deb9e240092b7a88fd25525acd55e294eb1046f9b1b69a847eb9ceb7b1593b9f6978ef618c15de4e059ecc3bfda3297a19c2df202adf72155cf21eabd03948df15198e8a68b0884f93ad5e36eb0983cca30e45a8b4b5fb8136fdea8a3341dd7877540a557debf7530cc33aeeef6271c3f0af6d09787e815f2f1dd25ce4d2fd09ffa9f53081b469c500da4d44180c04eb1869329cbf2d823187e831c24 -SIG = 33b4f4274f20008a721d1e8d054a2b4e95327e38bb07b33c4bee7e1ce020a442fb2627eda3b7ac93cd3ab0b12b99935a1a9233111604da4acffb5315b907120b - -SEED = 66cf401a2142fcf4a8018046cf4140bca18d76ef6266e7a024757df172a5d653 -PUB = 67d48dfd23743cc2ca40e4dfd6b8cc5d84be82dd2b1120cc476e6af6f25ecc98 -MESSAGE = daa8efb3fd41f12fbc55bd60464157a26d718632d882aedb6bf98e47dd2337879e0b46452e062e6dfbff3e7bca7289e4ef6b3f41d4b03bdc2c842afe97f3029883ed45f6054dde9690649abb2b8dc28f5fe8cecf80fc1ea411bfc40bbf4fd20b218cf47ea8ee118d4d5aefa5c1bfa08a8fb1b30d6de0977cd15e50292c501f2e71ce2740ff828b8432da5a594bab5223760b64792ed3a69dd75e2829234943656513df1a17a2a067a9a8eaa64e19569f46939d34b99271ae50a47d7dbca3620c81255b0e1fd1f3cec851f1b11b35 -SIG = d6b0e80e60bc1b29ab8f74808fc460847795ccb887bac0ecaa8e135297a85097712b24b0a1fbaf7a67c5d530a47d0643fc8702c059d215fb112dbe475e5bca0d - -SEED = 5dbf885aa598e895571f5f65090b72323e9d70b0f58110687afbbc383afedcac -PUB = fa17eba76e3bc3ea6dab3a5b120dc5ecb9ae6f00138f7d36dda9268bc4722174 -MESSAGE = 1e0b6cf15ce03337179c02d65408df5be9200c3782b6004af94ea4decb257999d6fdff301d11d00c98c372fac0d026cb56dfefe3def7eb99ac68d6968e17124d8446f53e8d2d3dd890d37a23c7e0b83a484b3c93bddf6c118e0281959d27bd87d37e843d5785f4a40771398494e6c4322fbb675c1d479321032148f7fe52564ddf7ae7ac269d0cd2e552fec589aeae0fb93fe3eeaef0856096cf4f6b3497e7235cc8494d810a0b46c5eac87f187e505bb7764f8045c9541983f7b025698009a23d9df0bd1a473cbee4cf5e9488ecbc -SIG = e1429dab2e42cd035b7fc602efd6baf94706f16eaf2f8b5fed329239e875605fb172f5dd9ae2bc2eb42eb474567e292f5206e82e694bca0d6d433b867634cb0d - -SEED = 84b3aedd4797a565c351de7dfa0700b9ff7c4d7291c8808d8a8ae505cdd22590 -PUB = d7ad72caa7c22209ec4678d11d5590a6cb28a07117fe5aef57b50751583201a5 -MESSAGE = 532567ffa53b5c0fcd29c39499d2e78ecd20e63123499240e775088b394dc65c8baaa0fe8f6aa7e70181f9e10add8b4a8beb0b2ec38a43309f100cd4be91c6f48e79dc0aee93a15c9403773b354a8d42ed48d8f276230fa6de5ada501ee0a653b4458f0ecf6d5b3c33e2141c662f6ea055f741e54586917d2e0c4eb2b56621f9665fef3246f0bd800b533e3bc615c4021f8d0e2ad233a11e7736c493acc31faee76a097dc40db9efc22446eacf1cc18f51fd10236a2f942d0a53c3ce209108b5938c0a9e536b89ef0ad6b405a10f22c3 -SIG = 9220f0edaaaee1b876350dbe9266061767b86296c351d4cac99d07cd612c6efb24f8f9b0b975f95c42c5b6afedc892f87efedd39d5160294c27658bdcf42850b - -SEED = 6950bfcf480b98ea18a2d5ae5ba6e7668f4c283ff2711357740ffe32cf25819a -PUB = 8e4c6f233f7b86321c9d6799bac28aafcd2503d7aa0a7bded8722727fbbcaeb8 -MESSAGE = a401b922aba57ee0c6ac1c8f1b48296a8562eef137526893886a08306e2203667788618b939864467a31f16edce152a42c25546b640ea8bed189a4f89886a37f106911eae1f50081bf795e70c6504437d2a80cb839479ecbb87c129bcc5fe31d716ef978c206d7f08a793466594f4d75e215bb6374596f8e7d00eea724780943e89bd3863c951bbd24efee23c97c2c797c7fafbf8f2c8b43f37a5f881129a09573fa7a034a285e80dc4ba4bc9564a4dcedeb33167e0b30c5a00b9a109a2231cfa0012b29b2b3450b892eccef0808e503f8 -SIG = 94de5df7a25ecd70205d40bc9499fc7cd7136568060a419a93be6e318664bb6dfce60e2d4e633f7ec148fe4f834ed277c1fec4c4e2a86f44c4589c817888db00 - -SEED = 61b260f5b848b271ef48e5a56d297432d89f2ab85bd538fa668870d0560220e5 -PUB = 6086fe8735f399f1af2e395e0fdfb5629ebcb04b6ed4a54a9e47052c6e8191d4 -MESSAGE = 2826295d79945f675476bc4d45ef800d80b1f0398e4be60e3de4571ed108df989f032de6c2345d9948d677927ea0b8cf1a5ca36fd5f23c25dc0d2ab5bd565a54af46fd97d338d770e3a7b47efb54c07a1664707771eb4e37d9d70ba779251dcdcd3bf6d1248adec53f787259c4d594d5fd4ced8e3db7621d4965d48298178124931a3d0cd269b2d53b7cd261b96d370c5d9693c8ad133ed58945ee3540e10625d924aeba9bdafc656100aab276fa996b1db477bf85ea559081d5b4c7307dc1595654aca82f7b6d2ddaf7357c15a4d7d8b908 -SIG = 9828fec8ff5cf85a98f450770b5bdb4b80daca44379d8f53c91c348e22df64ac48f2b6e2a7b3b642bc8193a194316229e69447ed241cd423d83b6fe7b2d44b00 - -SEED = 936dc1cef6a310747f350088055a39aa762d9a4b52c8c8e4c682794380c2725c -PUB = 03b31800412df4d56f1532c05828c0b72528a67a781bef4c06c1fb6ff2ce324b -MESSAGE = eb58fe86c4ef349c29ae6fb04f10850e38c6823dbe64a09a5bf1e0ce600d394efa6fb96ed6a8f2c9d4bec05e6a5ebd5a1bf4d0c51db934e57b79e5c6a879d975197dbb10475f65c7f8a8c6a77a420384b5062a2740f1401740ee0f5e043aad7a2a2b4260c5d907f705edaf65b0e375dfc7b00bd660db6147f2ebe870a0ee18dc2ba3c92b0b76fae2b90932cdb6c149e46f3feecf4c26f0441f3a9e006678aecff8ccaecaeda73a18a68ac988b62e83a9bb5188aede38df77a9a164abbdd9d58e52a6caf7222389f198e85fbf966236dcdbd4c1 -SIG = 3f994b8ef528f6421c6a6a22e977ade5cee887263de38b719acd12d469bfd8c3f68e7ac07d2fae80a2092778df0b463537ad3a0551997a3d5b51f832d9c8230b - -SEED = f89eed09dec551361fa46f375973d4fbfa5c5c12f1b5e5abf45cfa05ff31a340 -PUB = 3e0efdca3919fa10d4a849cef1de428851bd08efd248594fd89cdeb9deee43b0 -MESSAGE = 4cf9773da05fd322fc147be900ef5cf256c88afdad4b08c230dfc8981fb69f476f7d45ef7c9006bc10032ba53436ac22843e0d76289cf68f9818fa64031d4b40955059aa69110915889f5e22732a1343912581ab3b11a3bae7a471359508596575f888160beef966e5708f0e3147eacfcec1caa3ef240c5e0a14c186546c8eeb64658350b1affc0cfd2ac213af670afca7bbc9dddd28a465b586e69c388cd73478d68efb322bdf86d9213011e711b2b95fefa7bb9b5939761706aa7121024906420bddf1d8800a4338d938fa137cf27e9ffc51c6 -SIG = 897e6f2797c3f326d2cdb1d2673d360631f063304580ff5b4eb43d39ad6851834c9cf891d9f0905bf8de075f7635dfca601adc0f14e7b2c76f7571bfa468ed0c - -SEED = 400796ef60c5cf4084dee1801c4a1975e482e70aef961cd42e2fd5a3fa1a0fbe -PUB = f47da38128f2d012cc5797571d479c83e7d8a3409802f9a7d976c27067cbbe43 -MESSAGE = c473325e785b27df4471eefb9ebebd6461d570800181100ff36caf3c38f67c1921b157ec8e6126f955aebd90ea3fe5385f8042cd704b27cc1d6978c0e2a296695f5ef97b7c2e16ae4ff4d063c688d7f46e964e1f0a00503f357345977683d6e4c3423d56bdb6ce864b6987e085e83e70c7c1a14e0e413f592a72a71e017d505b64c24f1a1a6b813e064e6e0cf8bd4571d0ff2f267a6a13e0cd430463b6ca3b88f0cd40b0fb83d5bedf6f7d47e170e87d0a750093693eda232a6daf98125727b9588ecb894ae373bae3a445a106306469a4c2cd77ff -SIG = 84d3aa3f361844396754d80d9fa05b8b2fa4abf3a0f36b639bee9cfb5c8530a3a9cc34677f92a913c41e800f2e8041f7666d07ed85f16a57d817b1241fc5ee04 - -SEED = 6703a6232c5e2e65e0ab3b92e2aaf9f5fbd33fb46988047d6f4d0ff5387fa029 -PUB = 047cffca8b7b11ac6eacc0eaa0c5b73c75b9c637956973af9d97b2dd5b605d6f -MESSAGE = a26b30a769197932a3a62854968d760151612366778dc994576a2e0e0355496b46200e506948a0d102b6651b2e7334ca6c6eaef8bca44b425970a0b37d6bde0da9d3c1b9f51cbb25bc335cd6fa928a74f2c0dc2c6e99d37a12863a474d4df43aad35415ffcaa24d8c29f914572ab2abec3892db49e679c5ea220c2f519a7d033ac1a2c5a467869e30eda3d2635ca863431473f958d552bdc5582352c290d0ce4fa9cfd0ad42799c227ec90b7c9e5db9f5a7b6d569212eed94d323326805f2b3a0010d6c11eb4107c8283037652f50dc067b6dc81f4db -SIG = cae96879e5b603be866609d4a053bfa12a51378e99b2a2812e4789267d8f32f473243f8af74b9be73f47dea50f0d165ebf49458b73e53d88580c191a182d1904 - -SEED = e0e72f8f178633626733bcbda2ad2a50e653890f15359b6c22fc7345ad333109 -PUB = d13cee540d84b5667d516fe7ec7239bf8da91546ee791f84edd8ffcf3a083e76 -MESSAGE = 791fd613c1095292c8a4a2c86b47ae026155b8465b607dbb416477ef79a297c9d7758ce34af9dcbf1c68474f30909fbe74b7ba429632f2403aad832b486b72c23054ad42f7653a9ddb456cc791f348886a7ae5dcec7c0ba815f7a93a10fe331e903b970f7b5028be49d14bc5620d63792672b98b9488c67ae16646693e112047f0ac8921ff561c92dd0596d32df0a6e507ac1b07de516c98428d570a37db9bcd7c7e61c6948ab3fe91250dd1d5bd671275df9a972f22c2ba36804747aec1ea2416c1f41ab87befde31629b2d43317ce41cda03626286c0 -SIG = 14552171b95245ac0f0e5a6e7a2f541721068db650c6dada04c28cab7c49195f6436712144cb31913c562e30c39d8a8549fb64ffea81c7445143b5f23286da05 - -SEED = 544dafd9960d829756c6d4b3eadd44375fe78051876bf978a381b0decaaa8096 -PUB = ae4f6425c1b67ccb77f9aacfea28eaef769c8cacee035205cdcd787e8d07629d -MESSAGE = 447fe7344cad1fae09d6a7d05f09d503c1b3d3d5dfa584810c35bc41e4955693706154e2d751b2f1b525e1a14547ba7f8b232088a6fc922702d93a11cd82949c27bed645dc351fb4c1242cf41d01575412e792aed214531d94fd66e03dd32e972fd77f6947a353e1ae5e00f5a6ca77992472f096b6e7475fe534e913a77bcb0d681fdfb3a7a0dcb56d274df4aa109d4a8a37794a9276f50006696ff12ca4d0254039df0fb3f72a960da05c9872f2e33ee81d1cf7a6f48bbce0aa18c7c0f06ba55e67689e0af587b500eab79cc7f9640bca104b7fbf31f08e -SIG = a2ae117c8de4ca6d6fe75e466023bd550c26fedd3e74ca13adb625f272e175f14d5df550ace7d82288efefabf96311a123bee23889ad3711bff2b8087946bf0e - -SEED = bfbcd867027a199978d53e359d70318fc78c7cc7bb5c7996ba797c8554f3f0f0 -PUB = 7c5ae3bab9201199dfbe74b7d1ec157125bdbaa4520f501da3f248579dc6c22d -MESSAGE = 117fae13e78777b6219f020214c1b87c57046d1c09ce82ee2b5629898d9b0de74a15cfe99f80548ba913d7036c56285a4cba493b52d2cb70d6365ace3da12b1f34a2778af36ef52ab82ede04cacaf2793f5f89831e3b205a9ee4c1d6fbdab4ba4d9fae65dd79a5fe76b4b39a3092cc7148d211e85ee82ab463d34dcee9061d9c21ded2051bbd50b413f0e21a0e48d1ffa8dcae240b3495be25d93151b57aa271ab99aa708ca28080cab4804fcefa929f5f1ef3f4c6c0fbfb40bef7ea1b509b36ba1260323512379d7bc3fdbb5d3faac9b00e21f12ea1ca2e29 -SIG = e48615b65633e61993b0aaa1fafb74b9629c384fd592bd735fa1f62c5cad11291fcd8c2e91a50bfe0b03b43502fff3a5c382b9c2821907efc34da5ba054af00e - -SEED = df2df8a9d66d5638cdee09324e7b10f8ed29ab91387e3147b7dc03f7cd800508 -PUB = 5c042e157fb7fb12d4d4fef2847141ecfb57c1253e14eaf3004d6513f52fe625 -MESSAGE = 21576615c9346a63dccf0c50ecbd7c6d72ad452cfed43ea73202cc7a98576056b9664b54622905a1e7221720730ac685d3bd3977ec3959d446bfa941e725b6fe16afe5432c4b4bdee7aa0fd8030948ed6fcba7c0bdb40c2e517da97456e74e1f93d5ed676de0f4a8b0aea449404bd15b6da79dc1b813965fe5572410d76f5b5eac663050570311dc9842b6fbf8806aec03151715cacf7f21802e8bf5e98a89c0d7d0d098b73c6efc09962e36b4e030c1a64b5d349f5f2042c74428671e4a2c7fea0caee2422d85c4fcddfed32213859a69955d4e3ebb7e1b2022 -SIG = 9a1074531ed43d07bffc7f2b6c13b8838fc75cba02c7d1ec7ba38bca3cef20dc9badf3a3064a2c93b1842441420b6a8d421a960d70dfb7c70eec295f21f83f0a - -SEED = e8ee065f9907f1efa2daecb23a0425f353094da02bc2c931f0a587efc0d13de1 -PUB = c72651b7fb7ac0337a172977496fd7f2a72aea889385835e563c6b6053a32dc1 -MESSAGE = a2f0c1373473a305d8f1d99138b06b9a9694ffaa8a88222de9f729bee1305175dfb17001cc77f67b6d40c90c1a28fb226c11286db4a13e45e69211242bcdd01cb6e2c454e76c0cab881b4d2d9d3ab100a5d61d1725d866e4fdb66d93d77f5b308693b9b5a333e57fa25d1e5d2e38df6e4e9ec84159bbee1ffea926836a0101c91483bd5bc88a6f1cc4d4e7f008ad08453a0123429dd335781c7cbf8d685a8999ed1177607004a13c4cb5ea4908c542607d3f2cd6690cf1f2a7455bbd38f538f07a103964317efbcee37eb46931c027cf153ef86e43d78281ebd710 -SIG = a510dff42d4559a19a7bf0fe0bea53d3e1f22dfa6be55039895e12a5d07da5f2e37713ccb2eb216011628f6983f871fee286e66fff4be7582c961a1ed7568404 - -SEED = c72e67d8c3fec004ff618718a9099eb8ad7b06ff3b8c542a7e8b9847313475e1 -PUB = 4eb002d3cceb188c6658fec51cb479a65264ac555c75cdc2249cf1ce3defc16d -MESSAGE = a8f34135c0132ec95b64b0cbf51d66900143370406791fbb55f2b8ca953cc74a46e08b002fa2da21b951b8871f7a29bc6d38790afc66a329c397d9f9250bae0e30ae3426e08d8ead0179a3b313c908839192f289a3f3b6e960b4c5cebef0a09daa9c7a15c19d4ebc6fc2ac3cd02232e832b234edd7965d687bfeb758f70fa7963841b7859bb97c971bd557bc8769524ac4c6eeb3579793334b522d176bc62f86b4d5c0d4017036d2b6bd4e4384416ef8263139691a8606170d73c93d6417dcc1a08a537c9ed4400471a46f52907b46b10a8b6889dbb4647a8bbc7149 -SIG = 2d7bab8ebda7fca5bb3c25f51dc51b73e6ff6a3bb1b52acc7811a7d2595cd6fdaf730494418e2f57efdc5617b066fd7b6207680d94fb8c43d3d4740b41cb6901 - -SEED = 696450b557ec3c94cf1af1326475634aa81def3814ff30a02ba7f2044b59c0fe -PUB = 8584773c566b0eed3f43281705b575a434e47d6cf6b251b89803fef53534cb29 -MESSAGE = cc257829f30a5f90dfdbc247d42e388738b76c41ef8a82a5e0225ddf1e386d77080b3b9df86c54b85cdf2c32f367aba0c3b6bf888a5a6903529b6aeb4d5407a10180149114130228fc4356ccf366b77be89796a9e71a0c693f31e584a4f143097ba370363b67b2f2e2fd8d6fe8b4e8dbf0d7dcc1a8360041158aa2aff7e2a325b8e518f193a28bae05e3d52b26621af402026d7f250e86dcee301a58b631eadf4527e958f02a61587f0bb516cefac009fe51052fff53336dbd94e7266d3b43caba8a1b38e5d871c2a24a4c412fff3f7a9a52a8ab23bac9791b2b5a669a -SIG = ce8b0a5779f4f5f401e84d65927a0c28df829e95d09bfa97111b8700078ff894cf7277e34a716144d55306fc9e2f64cd287583cc8003be0e8faf26af7640140e - -SEED = a8dd35f054fb6ff6f0ab094a0d3d1c262832181df35ccd5192545ebd6a9cf529 -PUB = ca412338d3814b886d964b71925e1aabb3ffd07834dbe7dc512568882b53e4a3 -MESSAGE = 55a7ad9132d63ac161e7adb132b9189fdd84c361c1e4f5419a6df73df4d7aeb29a8dc4bf01490d4f484e2d12077517f5fc7ad0bdeda20a6cb0227942290b08c3fe33ab9b2135bc38a6579a54bd982f7d1417ce867117aea918dbd3dd476e7eb5b5d3c3e48a864a2f942a31501aa2b29b53b80513c95d6a411844f0dedf16a29ac267d331e53bdc2539bfcf32dc9b5d640f1231e2cafb0ae94bb5189426863364262efb47b5b5ccdbbc93324216a799b6f50d3704f15ed59af6cc7d910cf062d1be632dca5df213d487d8564f2b2bd7d818bba27c364013d92d7f72625462 -SIG = fa709fbc8382af83d11812618dfaca452eab83e4c53fe9e5858467d07b6767e17975c1e06393d6dde15a34d9473d1cf4d6d8c2d57394520080fac4e43448be07 - -SEED = ae1d2c6b171be24c2e413d364dcda97fa476aaf9123d3366b0be03a142fe6e7d -PUB = d437f57542c681dd543487408ec7a44bd42a5fd545ce2f4c8297d67bb0b3aa7b -MESSAGE = 9e6c2fc76e30f17cd8b498845da44f22d55bec150c6130b411c6339d14b39969ab1033be687569a991a06f70b2a8a6931a777b0e4be6723cd75e5aa7532813ef50b3d37271640fa2fb287c0355257641ea935c851c0b6ac68be72c88dfc5856fb53543fb377b0dbf64808afcc4274aa456855ad28f61267a419bc72166b9ca73cd3bb79bf7dd259baa75911440974b68e8ba95a78cbbe1cb6ad807a33a1cce2f406ff7bcbd058b44a311b38ab4d4e61416c4a74d883d6a6a794abd9cf1c039028bf1b20e3d4990aae86f32bf06cd8349a7a884cce0165e36a0640e987b9d51 -SIG = 909008f3fcfff43988aee1314b15b1822caaa8dab120bd452af494e08335b44a94c313c4b145eadd5166eaac034e29b7e6ac7941d5961fc49d260e1c4820b00e - -SEED = 0265a7944baccfebf417b87ae1e6df2ff2a544ffb58225a08e092be03f026097 -PUB = 63d327615ea0139be0740b618aff1acfa818d4b0c2cfeaf0da93cdd5245fb5a9 -MESSAGE = 874ed712a2c41c26a2d9527c55233fde0a4ffb86af8e8a1dd0a820502c5a26932bf87ee0de72a8874ef2eebf83384d443f7a5f46a1233b4fb514a2469981824894f325bf86aa0fe1217153d40f3556c43a8ea9269444e149fb70e9415ae0766c565d93d1d6368f9a23a0ad76f9a09dbf79634aa97178677734d04ef1a5b3f87ce1ee9fc5a9ac4e7a72c9d7d31ec89e28a845d2e1103c15d6410ce3c723b0cc2209f698aa9fa288bbbecfd9e5f89cdcb09d3c215feb47a58b71ea70e2abead67f1b08ea6f561fb93ef05232eedabfc1c7702ab039bc465cf57e207f1093fc8208 -SIG = b6c445b7eddca5935c61708d44ea5906bd19cc54224eae3c8e46ce99f5cbbd341f26623938f5fe04070b1b02e71fbb7c78a90c0dda66cb143fab02e6a0bae306 - -SEED = 6bce4dfd53bfa5506f2f554d2d994a0dc40cafcdec7e1be050006e5c5a4b38a1 -PUB = c890023728d8397070291771e65e034d34d4aae5e247653e4ff4c074591da702 -MESSAGE = 3239190747ee33d40bf870ac9ad49d88ee320f63c05257e8ab2c60306597ce76d1f1e792ab6a65caa544fbec20892fd4960594f31b3763ef07d4982eae4a2dbf3377dcc1e3f95e46ed39b7f0222f04bb5c3b434c8f9f310de9f122a29f8241e81e206549ae628d2b8ad768972c98847c1188ad04c835356378bef79cd126869405b129fdbdc3bc489cbd1399505dadef7617b5be5da173d3e80e5838c99e349276242729e0219bd7476ae5c4f81a12878fb483a6c0e9b0df2962eb0bf00157782cf768a1b71c010169ee8522def0024ad7e45775a290639c53aaf48198c42de75c -SIG = 99ae6782ff27646c27f61e23636ae1881521cfa5ed256f70bce7ce00b68280ce8e0c82aa765afb8b5a1ff2fe42c57441e458e443dc8b123477ae33d884888c0b - -SEED = 17861a8d4154acd4fa9c8fc947c1886c11290be222872ff4f8cd25939e4d1361 -PUB = 43773f4449065eaebaf8937baf758560b0c4d2de46977839b3b873d5d7d5fd8f -MESSAGE = 184df5ea3215ebe180390b0ff042ba2381155a038dc732f76a01c7e70f82d1ccc9de9a0596b3fee447209c992684f643df21f4cf9d179262790e8623e42472dc351997e6da189c07e1e8882c07f86c6337ec0113912cf92215c8de1982b8fc57bfabc55a3e8736f73610429d97feb51d794f505d0c5a0b3abd48ef7f55a628f90b8567a1c15ea9d190d7bf4ec2bc9334ada6cb92808dfc2064836fcfa46b96fd7a5d6f4b054dab09b73595feb89ed005b9ec9d3188121de69696d64e7c7bbdfc1c469faf148c38a7785970afe1acd06a92c99478fe44974e3bb2095e4467e9b2e996 -SIG = a5ee024ccdbdd4c21a24709ec53dccb7ee17626dd00a093d0884f5b45c4c9d1691840151c33c8aa07b69b34e16f61647ebe793ae4daa70cff48e6ab42ffdbc00 - -SEED = 0a84baa54f11cf17090fec61f3f9401508a3a03887aca1a7939394b1ee40a925 -PUB = 309a73c62d23d740f2e93c18587ac15e7ec480d25ac0794e10f8cd461cc2b130 -MESSAGE = fe70017b14678b0d3ad03e183d6f53314378379ab3da65b3511257b3d54086e86f2031139021391af9d72085ff7c3dc8c1e2d91e53333855423d0f785e2cc5f8b7799fcf1b70e6becb788e53e9020f2995ddb0c383a1f81038fc3d543ce0a38c9c288a9bc4077f4277dcc6c5642263fcfe19688005a603f57675d2434f3ed1f46d32f14eaeb073e83ee7086da2fb67659d3fb68c62320b7727b3b8ea006576bc2c7e6b5f1ecefa8b92e70c92c88951d0c12d91de801c38b7ca5a0a04b4c3429aba86386e96e06afd20d4c5c2fe2b9b4273eb05201a79273abdbeb37ed1830d226b6bdb -SIG = 4d870bd53af8f13f214d9934ec903ac48284092cd9b162a44ccec851fa942de715ccda07b7991d712723e7a4d5b4f0374ab85ac3867e0b53ebc46b530f9fed05 - -SEED = 38379423dafdbf25e19d7231bddd80b4cefcfe2aed932584dfa0cc3c9f9232de -PUB = 597e81dcee9448b77de6829e7921c8a390535d89a0849430aed66364ee140d8b -MESSAGE = 36125ca66668802906237e63a2fe5ae610f11a7cf92520d19e6690a3adfafd5d07a784bc1a0e185273d11d340d5eff901597dedf450c4699d43f3fb168d557f6c9c03077c3cdc370d34832ccdf2a8e3d75796490ed0242899d25ddf44bfc66f329cf4c45168703c31bc9202d890f3969ffd3ac35a12818dca751ceb8808fe81efa26a5e0d200c5ec1d94a5097ea74b6498fe288f30c48d727e9d3d35c8e12d85420702556f2861484ffd09b4f12265cc9abafeb82cf590028895a7d050ff57ccf5f28022d016ab4094b062e48b66fd36d1e19626e5215efa40fb7e3b7062f81e954830c9 -SIG = d8b50a88aed6f2a96d082213adf8b2519f6a0bbd30dd3cb0f3fd3ce1c643fc029946cd43462ed22513f1d65fca24bde3818166baa86daa798792afafe0c1a10a - -SEED = f925d274aaf1fe1a21656237385e97f7783e78090c5d4217fece7057c80f426d -PUB = 3b0fc370be3a4b19a88ab998c59504ffb59a87606338e673df5b3fab4d9bfb8d -MESSAGE = 143caafa5f62b13e43dffa49d420fa99f771b1926d40d6cb2bbb427f27b6c266eb3deb2d8bbbd47b8214ad40251cb1907ad65eb94193e54ad85c6700b4189e80f1cc0154c63ed151a8bbbd30e01637ca58e70aa3ee52ef75d0873078a405014f786eb2d77b7f4422f927823e475e05b24245f9068a67f14f4f3cfb1eb30bfede7b3262230ced9e31361db19636b2c12fdf1b9c14510acd5bc18c0ddf7635e003503e6f71e1c365cdfb4c65ee75b4de0694af87076374d631e6c4b8e240fa51dab5e1f80ca2a06c49f42ea09e0475defb184d9cde9f58f959e64092aac8f2027e468126f2fb -SIG = 79549a317d10a0be322a94a151ad11e77efc4836cc8006a85081273d7602a638963a9caf19c3edf1e25fad1e9d68701a71dea727da6a5c5bcac9339589224b05 - -SEED = 971f806be6f07d41be8830ff8dae704b08638ad6cff722d8432538127b769625 -PUB = af6ac98dce2078a6c73f6097bab63f205caf6953afa284d042bd50a4fce96cb4 -MESSAGE = 013455d049aa54ed995fbd94e6369955495395e4438822259b1060e9a34779042a1a69211f6ea2077399dd234806ba0b353cd79a57e1c49b250ab27106dcde576ecfa115eae461febb12d2da25ffcf17b715f8d95c2f0c425d5a81f700115b70d49e1cfe49fcaa14fa205e28ec85247f1a6e7128bf3bb3060dc08464bda6538540d0ac472093e5a0720fde2f3dc4788e0e9b0dbfe2a2b5f1a0f3f80de984025b15c65af77f671e1c5e2840444de5c7eda025e6dc1a3ff16e26cc54cdeed56be73f9b01ab2b1bc16c8ef58a5b76dd47287807e5c50f0d7c0a5b8120dfde645a012c5cf11491bc -SIG = 2037a0a7674b84ff27d0b22f62b4bac65e2dc0f5fdc899feb7800f25c29981dee641c5a50f8b9410970b49d2d53658c89ee16961dccf5391a6918f2a84eada0b - -SEED = 2bb0652f8fff6901991148c68a3267877271006ae9589149bb206850cdf52fb0 -PUB = c03b77be983e74a234c1986496b292e139992eb7529e70b3afad7ae4fdcf8a66 -MESSAGE = b923ca67e396d8656fa3dbce8289a38bd3c128cefb30efc1862bb944b4507805419824ce2b83d690ef4cf107492817143bf64c024989af1a7d2e1f5ac97874f86bb0d3773ff840f514d9a1394a3959b011d3a6b816a3fae5de17b2a9ff349863d27fbbb50cca734108751000d6358ca0647a93eb49e2e7af06287d48f2c09d5c1c73e4d8f77ea2bcaa7356795b26728719bed5ffdb821578bd5d66bf92edaf8b238b2bbd7d1e2c30a787f901a33d0a76669a9c3c7f2b552ccb8349c7ded5e1a46170cf28e359e2fdd54b05a562f528c68a56974df82d466637c8e53246a7217e4386801e0e3266 -SIG = 4e158deaaec3d88941296af2d27341012b0241d4e0f46e435e375c9875e89f5e32c057b527bc3411af096a77bfceb45b983efe455e3f03155d6bc7b0acc8e60c - -SEED = db9b812cb3c7c03b977f487d3d65ccd9cd2f3dee11602067dbfb72b589ff3f79 -PUB = ffa038ad8c3b378ce75d65844d08e3d6a92d194a1b7862e9d9720d20679b2944 -MESSAGE = a70092c7697cd4a209567c38ba7fb71aa8f15e5827a20876923943fd6adc659c9867ac6f58a61dc7cec3d362411682000c1a9ad1295eb8b70f242d86b5865eb76b87e3f2c6941d2612ee3bcde8f19765566733152ef54e95690943285f78b375f4036585d4739deedeef6d946db61ca458ef4f650da963c385e29dfdee415fe495845f55197a870f8cdeb5a010ba6bbb32bf1a588cc774d4890184c4b2924a5b8073313bce226585f1adfc229c90bc6cc9d212e62f05d33bedac961d77cf8c2620e451de817f8c1bb16a2c59ff804b635a73a8cf8c181b3f9401c3b643d18a2f706ea9cae47071a6 -SIG = a628a77421b2abab576eed35d2ee3d14561b21fa14a6e2fac263c3eadd79f2fc0669f9429b910b8422b4b29ac026a42e98d181be3507c5ed7c748a1fdcf1d807 - -SEED = ce379bbe2fa8abcba51c7a7543de5b7180771b3c44bc6b41892e7b88979bab90 -PUB = 7f3cff89f41babf4fa64cba33a5bb17f413bbf2a1e112b50a8e9b1f821d849bf -MESSAGE = 001a74f095c814d3beed67a8d15fc18efe235dc3f6457812a4039b7a46fe9a0e9de81a7a4e5fbab5ebe9e1e4801bd11b45c9f7ad0636a09bff42164be5749a04c02f0ab61f0ecfdfef799b827da6a274c8d3b39f2e3805a6791287eedb2314d3f842b558b9b489afe1ed37bbbcfc5e60a431d5ac60b39e946d903d6bf6b140e12c7e07f9ed7ac46a3999c6245c8ab1bdb21879a317a3dcd257a5c4f349b7f59e4e43d62d9f1cd16f518f1ca6cad37e2cb20f2598c4134291c6b8a98aae5247e26eefb76aa38c9c8231c17e9dbf271cec80fba5b4a834bd9be81ea841637aa9cdd4c4bf26d7ad24ca3c -SIG = da98dfb189385b2c853b6cf375738046a8f27ef27974abcecea1db02989b951fe433a6ce1e225b3fa82032fe060a7d3f6c183fd1157f791a064b407650571600 - -SEED = 2b2ee809d647023e7b77fc541f44875a35fa941d37f7c5b21fd34934d2391935 -PUB = 2c29d53e1bf2c7879d73d20ba88ca07a0b216d7f6d05d93663a65c3d9e10633a -MESSAGE = c4147d64ebfda41a1be5977262958104e940c3876bcd5b6956acfdec32c660914d62623c210663cb2cbe6249d7f5274991c60e950e8e2809049953c69581d2469f4fe982c7434fedd9d4e00ae08896d62cc1fb984dd233150cc2483e159cff4097df8c036bb633003abbfbe18c8fa79b5a22270838123fc9be39b8892c80384a385028c1a81ec58c8f21060e78afd2c04bfd2d30ca3977c6edad518cc1e2004cdc14bf3d15f5f528e5af277fa182275870e5c012f5f82fb1afd04edde4578ddd2160a1a3dbc050e80bdd811bc88ead79bf93f010cd0fd4433d0bc348dacfd0947cceda62bfa49711d013 -SIG = 12d90685775572c9eabc9be2574ca9ae66f0e652e578b21736cd6e654f7c6b1545883d56bf760ccfc3cf87544e0004c798061257e130030cb997a788369a9a05 - -SEED = 4ea18d6b4af8053b885ec188be48deb86ffb2a69a4cec86637bbd7b41b807c46 -PUB = e5986059976233ed77382c3d9959f34e317962696553e86ed1e5902c4bedd167 -MESSAGE = e9c89a1a1119373206ce40ede3b89a82f89462a1dee9e789e9845eec21f571c0faefd430ad338e4a72c047a39a4259580387fb9aacaddc36a2b51e7b60a87ca1321ff806794cd6dd4549a4df45c2dae3e539c4d7d06b6e6e9f466ffca2fa4978ce3dc792e44a6283880cd138a75a226f985da41ffdc0e32a5a85c85fe9a43ae78fcfe57f4dd7540a6dd3924a49ab39eb69950d421151d96b1e4fd3935890f634cd52a73a755f5c2fb72f9cd5a2e67ea930915e133b47cf6b7c10a9d889c6af6b5f1f4f51094d27fbba228ac2268b344027fd49e426343cc0134399b4b510aaea50234df42c37fa1c4f4d0e -SIG = 27570c002a487d000ca3928b83cb4319722c46dfb4cca260de790ec0e3c1932688f87362952818b54f51bc7aeeb263f960bc0da8964bf312ef93e81f06c80b04 - -SEED = fc1b75d17d3807217351d2aa40d9b04f525b89ed3f5fcdb311bec2aec5cb7ece -PUB = 55e484e774a4392a9d6eeff835a8fbb232cf6276a89c74fc0d1bb2045a8b21be -MESSAGE = d031bd11da308097e3beb6ffdb2600ee6a193ca6d8324501c972b1a25166fa7a369f5bc882ea45612cf02580254d21b40b0363237e835dae2656c1b7f4736e88be53d6b119c07f5729bbd82f67de03588322879243c5990a7e61f56907b24171a57cbb0bbefba2316277af9326f9cbf3538bcbf6780be41825a2ca774b41bdb1cd5c608851ec2339eb2f4feeddaa891a6326b29d97d7fbf311e3bb749c5d4c058dcc14f452f9334991e271c16d6508c818633927f429804ca7a38170f1b9f6bd73ed675e11e8c0d321fac912730b4ba2f7c428534adcaa4dad314c55807e6c642d494c6b2f0e8cd129775cc0 -SIG = 9a68d151fea3909893359e60b96b68b2a3e2946f2b47b875398a1e39eb01463d35eae7d976f833a762b51f2726ee0dccad5ce3600564fd9dd58c23807fdffd05 - -SEED = 0d0bf4d42ef810b179eb841771de6dbde76361caf894e42a14b1e09787ea3e06 -PUB = 7171510b43fc17efa80b15e320b1b0a408332542e0d36e4ab9a649cd941b5aed -MESSAGE = 8e2179975d0a8e5a69fe875a3cb1e79aec49c3853e30dd0320fe3ebfb638b82f89ad1643036b37e56e0b55e0a9e22a4e283d7a27485ce9102db6787d6628b77913e10896774e495c26e8bab26e7f9a94d29aaa36aec9c26ad3f50e5d8c0b7698bb5f01b876d0d65fcf5e9e32cd7b89829ed05b0b8f63a93858985bc9569fce429fd37a211abed650f585c3b55900443b6c5d6e8a48ba67deeed07b76e969fc88430fce2709c0bb5ce926ab7f44e0cd79f4ec359ef76748883fcc3d026edd06c8b9cba54b990d30aa41f1448a10893fb0539280c599d42361433a34cdafd8ebdd92efb9c38a36daf4c74060c696 -SIG = 24446bdf03416a4d08614466fb851db50e91a623cacd1b0b35660f3cf933200e15308708da3499a5ad25f0f0306b7942762e20a765b7ca9b901c750b3a95320a - -SEED = 57b5194d26abe4ab2116c0f03d23dbe116d48825a25e77d64648b43692ae25bf -PUB = 499c02dbad2a4eab3b6ff1aba3944b91c3f273a382c548a6f3a19c83f0a86724 -MESSAGE = b4813c9d13215fe9f63a78ff7ac95173eb810b4613f0f48d6876b2bd3b2c72bc7d98cb1ac32bc41ca47f09896f79204ecfb8264ce8f3c3e76dc124da8ddc6e0dfc1e13b5a529f20c82613fb9a82e5f5d77326a861faedabc7325c59af33dae6744025e649774fc4f79134bf9f6e3d5875dd91bc8a14cc36a66283d01d8d108c13327eca53057ba50bf210c19f139de6494982646198a1246c271b0a368c10aab95cd8961235d742df4545be68bd010dc0db23b673e623609e420ee76b1056c520f9ce8fbe8ee1863df97d17b7174636c3a2b612295091948810d1d4b8a5843760a2887dc55ef512af041ec54fad3 -SIG = 4c7345960c8fd48a7dead71dbd61908468efa865a135568c8f9ca0055483468617a7e335840f57c6cd8f2c9805cd47a9d7cdfde53da8ef4f1adbb6f698aaf100 - -SEED = 068d27b21e2acfcc19c3e9673dd44142d98aacae894930e20ca067439e749a79 -PUB = e22ddd396f955bb90e284776aa76e921e50699d0ca8914a9b7b841eb5ff47d6d -MESSAGE = 1c6815423d1a2c5ebe8828d1646527c17b2006e547f016b5350f010d79b13df4fb8c6ed57ba9c26c3cb0e0a64178b650a3ea5444a4fad5b20a3eb8caa702634011cf7892a0727b6e8150b0770429a37a8a0bb3a7edb891a7c90240bc0360b14e6dd770a990b31b31f33ddbf653988f82742e5eec31b27368eb0e4f1ecf4d676f49214a520d1e5b2bbb59ac2e13267e07a0cbacbed9f94d7473ed697828b0928fcc616ee02e51fcd8db4d8f7533b7b139a05e06f9e0eae32993e3025aef0590b3fbb4292a3ac40765e8584ead00266acdcbdde1457a03b7d57bd5c9e64fb06b64a50f35f0a1ec34b6ddbde767b96ffd -SIG = 0c173c488ad001cbb9c43d7b30a7c071a2fdb08cf7f37daf71d7ae7128dc0d43f0f095b2929c54b773ed4a1f0bf0dc4f364f0601e8d5ae062f5b78c05bfbc702 - -SEED = a34d52563159e0723e9f3fd133bd96e20adae623f8c798013bc36b441489bdc2 -PUB = 1fb658e645de6d3efdb083a73fbd592fcd4b800e03c7bd681aeae6576bfbbe2f -MESSAGE = 1d215f85c089f35f307a746c66c7c1e41d6ba37730d759e6e5622d6c6a198e40f63d37873b715df7518b3c6bb5e95a467726b97c9a0f8f5dfcdbfd1e0de357661ddeab555042b945fd899fad6d382d7917da9e12dfbda0d69900b3975165a73d0ac9de01fd3048b8fe5f0b90be67e03dc22f653a0a13eb4b0b753f3f3bbf787369ebd8bf5e00eb78bf0b3515a91e68b1d5fc6920bf4f4259f8a730efc7f1016d501ef6fb7cb8366fc8e716cfa50ea8b203cca1a316707e0b0fc57eafce82d62f7ff3ae04ac8fd041b55b19a352a69e6d4b79d0e650175168e34fa3358eac816cecf2c8dd1bf2a589113e91bb818f91f8 -SIG = 5fab5a7140d47873684305aa6353d3862f5fc13e54a40c9563cceac8f74008c6c445631fa864e0f1c345b5954f80056aeba25662b78827b5e8e3a9437813720f - -SEED = 58dfe768bf52118494b29975154cf452bd9746dc7de1d6bcd18ee6a05acfd858 -PUB = 0f1476c6cc2a1b4764af75805e77341f14a0d8b09c6a5b2ea287fd517c3fa6b9 -MESSAGE = 609794201c4f6faf488790d61dbff3f41b328c5b0695cbe9aa8a136d72b4977b21b500f216e9f32168ada8c13bff25327647e30d8a244d74d88303abc90b7f71aa07ca04d17bc8a0167d6e63fb88baa1dab81d50f1e91f46f5af77f2e8408b826336a35052efffdf4af79596af1bb2259f83c1bc109cfdc3dd50fd96d310f27ea4c6c7690f21815ea92bd79389680cfe3ed40c80181190688d24222d9a1ed52ce6a16b41dbd9107eb6d2e3594e4494d75dd7c089e3b26ffd00d1003c92c4c39ae5382ef9291491a880ca4ec3ac2b86e66719b92b6f7cea2cb0bbb1cf624d0d1abeae556e5f73909dd546277037ec972fd4 -SIG = 977137a38af44f4b262abff7e07282433c58926d562fbc6180bde6cd9497861fb6d955cf383d999fa1037b8b1754ce888c9ffc1560a451d0e9db8d74d2940604 - -SEED = 5a63ef9bd7dbf0e89fef155983659e8a0a6ca002bc42fad5a45af8e0281923f4 -PUB = e632f4dc994231cc1790c21afadaa977a589b0eb0da19fcb2792911b15ecf8af -MESSAGE = 796bc8361c6e8eec39838b24f53971e820f82361e0510eb4def1db2512387d6bf35bbdfa318879209435d6887b1410b3ebc1455f91f985e0fab1ce1c505c455576bca03539d048ad3a0ed1f11c73bac6809e2ea147975bee27c65261aca117df0fae7008e2c3c130bec5533ab89351c2140c9d1a62bdf688629787f954e1c610cbb75edb86209d7c357cd06ef41931dd5dfd1c7d407fa4ee1ef29393beab5713173802cce2d56229cfa76b601662c4d9a84a4936c52abb1981378b717eb55cb604a68d34f03b219f32226ca0e669348a2d8d2453930eb6e9c2bf66fa4e92c75136e148cdb034130d3f646382e1c71579ac70 -SIG = 75461f99650c0368058113a15ba16bd2337b2e633da38112878c4834fac9ba2e307c866c02af79bea33659614cbb4465c57ec3effd4c478ae38a34a05cf1ed07 - -SEED = 8b2f06141e401163f90f674b04dc90dcb6dd3386419339662ecb0dffadf2500b -PUB = 54da934a659119198553fd4566b660d8d610adc3290cb84829c894148cf3f67e -MESSAGE = 1deb25d43458690323a7d26a26695090993474f467c6fde5ddb34da945be3cea2f6b75652ae21cbc4fd22763a1b45583e1c3e88bbb5fea2049b7336c91159988c01526824ca3bef16b362b9202b8b9754185bd61bea8f539aadf4a1ab135fbc31d2a8e33178073106cbbc02d4cd0d3c8feaa8eb733084356251795afbd78ac3c4f8a3ba19aed755c646f35569c7a6c675b6d6918e834969aca03f71a2e72ccb17003bb75b62e852aaf58b3baea89bcd64a32eb14a6b9e10de48971e53d0e9ac99a78f42de0382ef0e80ed3cfa343f35e4a9983b9aeed986d3a57f47e5e46d40e9d677302809a2d37e4ec011f051b4d031ed600 -SIG = d68e3750dc56432397401c98ff1529db9ed48fea246dd4ed383ec74c1a463aeb784c87b1fda8bbce970fc97aa9807ddbe95d41fb022ea68c1e311654fa1da207 - -SEED = dc649fbb1bee0a44814d6d9e9080d5d90c1fc173ab5fefed826a74723a774e0a -PUB = 0214c89f3867ad2e8870e50f8c2a6254986d9c220e3338411300cd9c6404d4b1 -MESSAGE = 328700a8ae581c1edc4e2c00c78bf4606097f9bd75aade205a243c5fd7434d6222da937e2881a2e3c574356d4d5679301da99e11cf749c27921c8caa2ab2a564d87c5df8ecf1a72b680184824f6986022e3fc98bd2a21c3455abf1154954fb30c89882947b02f35af7b1bfad05237d242e2b74832fc536196f2e59d1acd0c1db6f1943d0f6043bbd6a769083ed66ba0e05a50feb0acf72b6c16ba9af039afb7fe2a4aaeb4d06181c5a1878689e67a3f5d0ad39e794d6239a7e0a12ce820c5be60fd5f1dd79702f49d02b79755fe873f5785c72f74625cd7e2428262597d31482c2c0508801fd96319d61b91ba253a5e722f414cf -SIG = 0e0c5e4e184375da4ef7e2a2e4888050cd84e2fe21d08e84a852db2be3fbc372c472de0954dcd1dc11aec493c569f40fc6f77f03ee524fb06ec40faa1d6cc10f - -SEED = 39b8062da43e64e1676765d62c7fb8e0a99c4fd417d6f7e3319bb13044205f3b -PUB = 6227cefe88ea4fb27b37b5f797778bd72fdafeadccd9aeb67ad437ce08fba6a8 -MESSAGE = 740af679e3069fad059fa4825fa41c59fbd484aa649303c27c4f7a94711c5b713b2a6b8987859e2271a6a71eb0b4a15abde4f5168f6cb9dbdc6a27a2a13d52c9720896a1f4ce3a5345ee793b6cc3ad80d7d58163d5455b9cbd073e2b7adbff95590c7172271bd91fefdbd01657ee1750651036cdc3560b444ca2184bf4f3ea89fc973aab6fb4a8ee5704bbe5a71c99fa3b5ef0d0396249758297699ae202b819690dc7ac4692770346907845e2210d5363adeec03f0fc7761b7e0ec0fea1bcf6b04fc54b3e4c40d19b8fa649ac8479e8f80730c0c94e9f4a1ad506f2bcab0c49540f6decaa77b3d657dc38a02b28a977ece482545a -SIG = c5f626490c0ef4e1efc3edeb0cbc3f7de267057fb7b6eb8f0c813584965bc5c421feedf54241cae001ec6d5e25c9b1fba0385e5dbd95a06ec1d8ae519144960d - -SEED = 52f4675d8ccd0eb909df0a516648db26fa033ba41d43fc3845896d456e14265f -PUB = f39e7dafc97b0a84dcbf7fa14a9403ee1fa92b85e5a7e5d05f031b44ddf1f794 -MESSAGE = 74427110857cb4af0a3342c2b52997bce1a0db6405c74e9651c5b85979acb071e567fe70412c4e0d8c9fa421914f6a62f2ae420b7b2f4cf80c90574221222288b65867eaa66e7e0a0557a26c549f9a7a4e70838ba4074b4cd7a9d758b378b88dd49441df802a444dcbc30624933b59922f33c20f019fe78ee24b8fba79a682f388505ac9c97f4eb87c611880026b4c23306b865173f5d716abc6cd9a9906db3430136f754129c443b20c42be2fbcbcd44034d714f58a4ba8e756607a02b608ef49648f2ad0cea99e7ab30a8dd7814004f725f49301d7b304dcda625c296d928cb581736ab739c86b469241a8259351fd37b4780a9993 -SIG = 4bf668827a720af68898a06ea7b44545a34ca896ecf311feea47e0686d911fadaa03118997153c65361fea15de9bb891b8909872045508ffad0cd9eab21a9702 - -SEED = bad73c9fda4ceb9da6c701c2a6e2efc0467afa0a74f8750c52cf1fd4c8e7489a -PUB = bb0f027a9035376e1aa3206c3d774475e351f5767ef86ef48a72c037c24cce62 -MESSAGE = 74b966cb780771aee63d734df3756702d1d5fdeddf32136c6358b836318a4f984fe71e7716adddbd649eba44cd4282e0055d8c1ed2d35123d66e5a98f1c0838ded563b9a20eb8007538fc7b0713e7e485e3c28f6ebc421a29dce2524db7f29205761036ada62e5b0b7d5b7f294ff17f338232fa5fd42b6f7253304092d848f50735248595da0f7ef28e568e9916bfc56d7ed0d811b59d5d891ae43e1b198071306bf525c678c6343998005fbb7869d1c40f8cac807fe2ef03f3d5b933f58978ef2906fccf7444a2936e63d928c690926c9c994ed3d666263e956fdfea27764bc5f74125bc46bc102dd3e5ff93b5e123e4b38bdef697e15 -SIG = 197d6b6cc88a98c06dfca0c01225edfe38a0b2289f29f8a44ec0816a952d585e2d59b5b08de100c0606296ccf5e92a99e093623144b8b22db87d929225546005 - -SEED = 707327a431dba77639b3966b2bc095f8eedf57f7a200e3b0077ce420389c92fe -PUB = ee2496910864189fdaa3c7757eb3cda9ab1e70fc9e7f71a38a0bfc845931c95a -MESSAGE = 32ef31b64eee700fca2ab21a267f8d9d3bdc689c7538fe959bf713fa995db2c0ad36dde430a8417d437b72c74e26dbe31d93701d4617fe51825cff7a544fc9f44e4345e14b4b11e15f26ffc2af8035f3f970e4dda44c0ebc0363c2b56fde218663bf78839092538fc2f39153d4eb29da0c1a08aa966601cc68ca96e993b01b173a261b2ef327650382f568fe944855b0f4fd9d15e752ac74dcfd37b3786fffcef23339c21e9270dce8891dd5eeeba9608fdc7b6fbcc99fa1b5903daa0968e1b691d19d06f215ded047ef9d76610f5de220f5041b313faf9e96c9fd7db54b5225726af435f9cbd9fd87ab40ce8f2c6940b55f0faae87850ca -SIG = fb99029feca387a5d765961e361d7172b98b7e0f11290bb1e5b57b51bc2123d0bce29020392a4fec9ae6a72c4c386cea1857cb8f9c50aa9a76d7f1687fcf2900 - -SEED = 6aa5c9f008f990473ba4a6286a416614026661f11e1a24efa81ac35852d1d070 -PUB = 605ac9b4dbdd5033d6c828bfafa93c0039440aa11ca724ae834043e07bd032d5 -MESSAGE = b5165d3963f6e6f9ea5657e9f07ff3a321eb338f9a8c3d3c42306b2b278978b31c623a631be3b04c41edfdeddf538e1b765bc8785401c1af29d0467a64411c497395d755dca03ae3272f4bc1fb1918dcc1ed6f04d6498404a8ce1409d447f570a4359522cc54629202ebe507ab693843141bd5ea0573b20f321a483ff383a46897f5926fe0b8afc25572707b63eeed283532928a4144196497942c572ac547605139256b0aa0eaf04db1a256012ed453b173ee19ad6e9b1af3f45ff3044a641f8c8eb0ac7bb45abbded47286b2a069d3908694ee06f2fbd0ef605a7911026ea9ea3c4913f38c04d8b69565a7027867ab3092d05f4cfb18fc7c -SIG = 9756303b90655e935251032ab19cfc95ca1c2a2c3ea28b033bd47066cbd4c7d8982a8b9886f1b9cd02e88a65564da8dcc34f308ba9f10144ba469c2efa49e004 - -SEED = 8efb8b79742be21e6d31de678bc81450ba8621082cd6f0003e22861e2291c481 -PUB = 33381e356c4fd386a3f7b969afd9f5c00d2067b698b3f1f00f3784202d3084cf -MESSAGE = 6b750325d3a0f08a147700b51a9b3725571094818ed69d1f761013eb86f323f73c49f5e439877c2783b336d1f1a674ef3e431fc1ae0180082df5fca69f848139fe6ab6739a0592ebd6d4705c7f0136b22189a11d60d4d3c9bc80fe7d7c00952d5742f9c0c2121fe792df133f221db991fc960ee64b9d32e0178e542bce8efa8d03ac8026cd77ba8bf0b24215b9faed2eaec920e925d5ec46fff6bde725e91c8280e4ada232a5433ae9680ebb53eb55553147c93370574854896154514299c093219a111dca4e637ad5001338c6d4d5ee9098c65832f7af835bcb622128423036c79a5737738a7539f8d4a6b8b221b56d1401aeb74d4571bc009d -SIG = 923005cb4848402aa8f9d5da74030b009444924c214ad600ddbab4c153a6ff022b53cf6364cd7ee99bef34fe144da964edfc38a0ba633312650ebf0e55a06009 - -SEED = ed046d688b2b0a1bc3daf2119dd321a607b16d2a2d1d963add1209c665b5ccba -PUB = 8734f1ffcbd71cfde290017ea6253e580d59e65b541b46521f5e5ec1451eaec6 -MESSAGE = b9cc90fd8de2a141f95116db3b04be83e98522597ec2174964245180b9a473767d6d470a217db5ff5a1ab777e1e28a0b16975e2bacb873020444b47ed8326421b90ebb503688f090c11b3b13617c5c5052c297a41e2893775e34d59ada49d994c0e4a9f5220e9f0315a67705a3ec08af0dc724b5cf67ff34fada8ba7109ed2b5a8907bb403fb1a838b4b059f18c792d7bfec05dee0c9cbbf1753409d7db3aceaf47b4c61398497b0eca6c1f8ac08a7ea1eb9c40bc4e92e888212f7d9ee14fdb73158160944ff9bcdfef1a7469cc70f9474e5f24dfffea585f09eaaab4be2afebbe8e6cf86d35680dc5d1b92913e848256ec736316fd0a2142063b0 -SIG = 721bfd4776cfba13330fd37269e979c1d7b6ce54a51b82f456e137378e582f192a12089da5aba76a7b161813dce56b72892a35330c94f7ff21d09cf09e553504 - -SEED = 76ac8e570a39b3a0232c45497537fb2155acec3617865ed1df210f00b49d1b8d -PUB = 312a3ad899ae6a25507ae6e4524e10b63a6e7ae53d9cffd39cf28521d93533d6 -MESSAGE = 53ced9db2b479e59d3ed643f7cc3784c24b8bd4c63206c72e23fa850028899a41ce1a8bdc003f12b7c29972c9a08bcd231fe0e1a0fef0bafbfa4e0e027d72004075ba37d490eb9964e783bb98f9e503e9c1fd3d23fb0017cc7c7a9f86d171f041e2355d8c5e6229d34c7eeacb6358cf3060d5d265bae2004a558878659a30dfed5f2ec788b4e14397b5d00c29db5d4ebf16639a8df292a3d24f6983cbca760d903e976f5b698642ba1fed49e79c38f4bb3946efccc9d6aefad336d558f78e4f205422e10384a4e531e75807efb389d2af4cab43825fb87f196a9080769fe7585782970a6918affe10d20d629b705845597418d699de3f1de854f94bd -SIG = cf03f525913c44303b2f80079393c21c1158146ecf99636f5d97adfdd9f35839804c23804cbf1e553cfd4b73f689a9143aec298f8276e1e4ee0891f1ba75de04 - -SEED = f64a66ba0f0819f3001416c220bf52d860130a19764aa8ab38d15b2aa75ac022 -PUB = 8125253cd337e00d45b45079b585349561e5f542a81f6d2fcfd985c10feab2af -MESSAGE = 8072862ed0ab35921db5ec2cba8e6aedb0441fdf47491006c01e6456ad70fae3c4152dcfbfdbb8f0fddec5e96b12bf67989ba96793f4861a11b63909ce8d19b8ca64a544b31ce051fbc88e062806d9965cbd2967b01614e86b532fbf59843218dc9c19c80315f044731719371092a3da38878bc4cf77de972e860466b8fc45e465dc3d0ebf94bdea60ef0b9891ced41b997b11b31ee4167db60c9cfc8b85beacfe223cc1829213774085d7c06d2b2e632cc21cd9660df47c4fa918bdd596ddf622dcb652642b67527ba8ed15a819a8e21f48d7ee70247f5200e37c259dffd17eec8c232f970cb03182fe3964132993f6ecb7c4db18ccef390c9eb3639e -SIG = 4de6f5250822d7c9d5bb98582500b5c085f541ebdc450ed1acaf83684827ed1dc77147aae4b19e14a7dc5bbe1f1e4f5771d8a6e4f2351739afb08c806d558701 - -SEED = 8439b1d60aa48460135eb1002cc112792995079a77e6e8ab020b9abaca8920b4 -PUB = eadc3e0c5bddbc3052c3b2f8b0a94566c2b2c879ed17034ac0e6a45f2b3e32d2 -MESSAGE = 5419f6d24eb46635d4a7f8eab803cfd0d04de092afbd86f2a6961a8d1eb8c0d197ba55ee08c991822a5aa702bae0337abd5ca7faa15e1f1ae369946e9b81216c0f5fc22bbd4433c3de93c5caa2741683bbd0e1a78df28dda19174101876334d40339659f021ae766162c6cc5421b79cf9d5c090ed4af07ec84493035bd0b2421b533684295bbe76a70fec596ef8c89c5c9dda3c33b7735d2d2f20b28f1a5402e72d04ba291dd59f14af08adf56eeb086d769c6bec3451891372345fd6bd02dcf95e803af0353150e182e323aaf683e036d9a135d2e6f98cb4d327e2ce7d54247f3592ed067b4ce7627174f996f28165c9c11f07e5ee9cee63851c6b68ea2 -SIG = 62da81e16440821b593b6ee6540e15d1aea75d23e0a1bbfedc808c9548f87e8bbf36915a39a74716f645cca5714d170af907576d4f3705e543d2adddc5ff2303 - -SEED = 3a046397f0afc072bc7f907c74d38fd1b9afdf27e14a3534768b0dd2df3a1c22 -PUB = 99cd70ef3be342493393872f54c47deaa081021892d11a3268f3145ed4f3abe5 -MESSAGE = f08ddef46cc6c34179820c9861375172fddf774f8dc3f7d64aa432da8e5fae644c0a8a9e6908517d505debd612868ac6daf95cd7e1699750022ccd4b88dbae2bbf73546ee4b835d319a842dae8b9ed683323f31e5cc57919bc9dbe3bcfffb2ada48072697ff4a7d310c91adbca81faf26a0eb7bb0c404ac9d8dfec63e9c64e2f420c07d323b7c0dc3b73507283aeb1cee51db4e1a83a692c7c1ea398f6f30940fab85e2138d4b85aa4e231e5424f5b064ed026f0ccb99d1c85a9eb15f5934a11359d411cf94ae8ffa3361a224f46bab852d184a248b4c31fe3a7e7f5134c051031a9f328a7be4a7cbbb1d8d863a400fd2d58daa44f1b9d8e9ddf961ce6322f -SIG = 5024ce60257965687080c5b1fc7d1301c32aa6fcc835497d9cb23a74a6ca2724f55353c1b757827ca5440c9ef8f8c1050913e20aabec35c497b56041b5deb209 - -SEED = 124f7416a80453e4cf1cd7b5e050a9761418258bf7d27beb7f23238c4540be2d -PUB = 0da34ab173990150df7399b6bcddba93c6dbcbf4d176941cb5071e8734c5dc92 -MESSAGE = 9dcb9873ff054db11d0a9b19de6885ffba7f0e681cf7fb8f6cd950c48328d1f919ca46054eeee6c9e57843ebdda7b24bc3503c4d612abb1a314f39f58221d2b54dc755acca7969740e7fa8b1a9523b8c7379fd395253f4e6cd054ee24b75613c3581d49e19246a7b3be1cecb334be44f3d626fe3b7b269e628d44580c20636eba2642f2744b959e65757d0ee601843f188e95d17253fef567068a5405a3a9e677fea3d7d55f7ead19a3f30c5f985671b55fa120cb9d05f471b6e1e8d779a2c803a19e6d0d7cd507887ed647c2a95483f933991ed45ae301a2b0e954a5703d248c78810aa0b199cc2bebb2f1d71cc40487dbd42eee0f745f7d285685b1fb31b15 -SIG = b0572104aa69e529e3465a6fd28f404a4ec20276a993b1725eb8c5f650b4a216f1871b24e368cc46cd1ee0174cda1b5e4ae2200aa9fc44522d975a9c51814908 - -SEED = 25d13b3837601b07a975693e5a33d5337c34c1127fe4c27490612aaf7f642e9a -PUB = 3a07cd68ee2692d51cfad1a80e7763b18a043c74f4e1b01edc55ba9a9e07795a -MESSAGE = 115b3220b45ca8f36c7ff5b53887d47e669b78dac13b98cc7aaca5c2e19fce81ec8617ca410e11c9a9118a668453b329ffb718eaec739172f0a849a0848192a5bdea18ab4f60d8d1a0d338952d77b2cc13efe83c76e8dd58803b1d8b3c9729ef102b20835b7de872bef3010f15a4caddf07cf7bdd222d84b174bc21527cffb1b7ffde81e281d30cb7bce25ea3dffb6ea1fbb06cb70569a95ed1a07e97ca42de70aa218159efd608fa9b0896e0b58518a322f251d133e58c8fc1428ab0a170ed845c75fb403f1ffb97d2d2a6d4f277911d326c1cabbb8516cbc17908ab81ff8d79af44611ea1d05879c1ec81d06936e0f4a0aef6d5748e181d30ec25236597a973d -SIG = 20cbf08392fea6a99cf446a95c199caa0c0f9813cc217b8d228e2ed90bab95ea92cd73ac95834764d33e42243c80a7603491c8d3e49ac715fd8a5b9e4789bb03 - -SEED = 7b3a76decaea60c41e95b05877a7da82064c27278c8d7df5f0bb95f0ad2d0435 -PUB = f80db5c28721b1c611bd87eb145a98bbf383b068045df2458d1a6fda099f7fc2 -MESSAGE = 375fadaedd9cac49b64e1574028046069f4c83654c8a7011abdb64db16b47fa311798172f9072217b0a6a43e5df6ffcc1154bcec1c68e1d35ec05880d012ce76e4cebf301bb2ec983d00b4a0540c937ff1c6df9441c61bdb3be8e0c7c11a35d49b6f55c381269a0e768efbd453447fe48b75ac39646ca82eca7d149304423491871c10dbcfc5973a57fab8371c30cbc4e90becc0b67152226ee177b4ff368ec879b391eb95e36dcbb07b2c16ba395545d4529f727b1a11ef65d120976b7ccc86af4bd204cb9489c921e43ba5e850cfe59899f1c1ec4aa5c92b6dac6914b1952b53dcb540b409231381568987bb2236bc40895df3f17eab7c0274f2244f958612e88e -SIG = 2cd26fb3c4f7440a72affe93564f6f6559adb15cc7a2ba10879fb7d67e47d4ebd02fe4823698a5fbd4a907fd69184c255a170e5f1747fce968102dc219b50d02 - -SEED = 5ff8d4052608eb033a5e94b603ce384d8452f60a26498b9112567f3410c18666 -PUB = c4900de24d9af2482763109926af7c481380fabcda9440c1a53ea1cdc27e6568 -MESSAGE = 138c60557c2e9008afc03d45bec71f961149a0835926751c8ff3935c7d652d83e1b0b1da7d5bbe0b8e171a4e49aae06fd8a9deff78dcde4d25b1aa899998a0f99e1df6f9337a3ea2f24b76c317a7014db4e5283191795a70d8821d217846490f958701d39dc2c8ce47d928938874d87b3558989bc77af820979a351eef9594aa5b94f3341eded4ea20b08c3e7c5610d43267818dfac0a87ddf527fbce8512bbf85b66c9bb5d62f0fe84048f23b19604a5c8d82b1f25a8da02731feb2ecae489b8475f7bd326ddf1a08189e46c08cf50538c2a363e2f4eb2c01a204c7ffbc0b981adc0fd997aafdf2a222ee84c309f6e95ec7de4fa85d4768d5c003165028225e22e09e -SIG = b737d4e5be27deb6d87729c636dff7a406c013f313c38cf683fe14f75a3b3005d9535d7e5815c8f8b37c51d6927111c979f7d9d81a347aa9cc09ed4e6c18e90f - -SEED = eedefc1757e3a7e5ed3946dbedc396a362f683d2c51b0b9f60765d4bfc5134de -PUB = a9872bc2192fc02b189ceed403ab9f270a032a835fdebfaf1c9d6934ed8304bc -MESSAGE = b194db73f994cbdc3cbe630ba72c47c2249bc0592ab547942b1d1b882b44f5b3855e568bdddf92ef05022d88fcfc294e76b64a00e9c74355373763e49a4ebc47243d48a9ad588994a518f80f8615c2b31da587a53e529d435a8697350dfcde02d20cce7d5eeefe3f5ab2aac601259cda38538a1b8301f9832e75ab90f8a932f267eac181003965d5266f206180c6c380ece803577ccb46176bf607159486f24259747e2ca6fb1912db7b78a973b2846387c1208030ee1f400d0c5b5e8bde9635ae55638ba17c734de8638bb85dfcd76629a7f9f40d6ab954d55bf8575fc9c9a595097e0893db5a7b8a6c455ecbd3d22d725e19de2941f467f9eb93d66a0e2bbdbf92ed1c -SIG = d5bea8ea9a5fe9ed6d2bf839930c0c6cd5039e988f551fdedb5437e1c1af0ed7b3897c035711c3c51926be8d1b32024d5cd582f5f8369ad84d18b12502652f07 - -SEED = 09d22bbaa5956cfacbbf9fd5510975128686c40c6ea96b89ef4c0f0c649bcd7f -PUB = e559ea8acbdc61b6709a7d83ae15849a6c78b203923dd0a299239ee4886930ba -MESSAGE = 1c26a0f3a1a5b2d7d5b297af8a6a689d7c62a25267e197d23becd2f2b816c4de92fbdaffb941c3fc8db7a84335a84cfbc92cb3ac806ed58df16b6b8e119a48df4f27c71e931a5938e7d002734885e13a258a15b6e1136efba72f1d096b689f7618f49c968063e8f991fa0b55601e430eee13492a1b09413eb23813591a7a9f070cc396ca9d1facdd4f4ce37c40f7245f55035e10fad6b85b5f01a1daacc0df94069f7de8f6467f96d1fb98648e8a0520a8cd723c98e9dc2dd4b2934d8228f0ae1a415bd3a7cda38d7a9983ce1af6f8c970a2a591635fe12b917536ef815eaf1a3138d70ce70a794264d7c986d9ee3290445f15a9248f2765271e5a992196ae331abd4164bf -SIG = e65275c4328a70ad62408ed7fb1728be87a73a814fee8ebd94f2665c71bc66ab0c1b07a600b30bc081a74c536857c20610384be268d9af3e3ecddd3eb0c14c0c - -SEED = 77826ed351a3f09254ae5692885d774cb3f24410a4809fd90f8a00da9aee9903 -PUB = 3eac8f41ee73e6ef136821f7957a1c27e15638d0e3916e6caac6fb7beb7bcfb0 -MESSAGE = 1ff06c0b3999cecb1900a47d267beafbb35d93d14cb2c8925e3e3fe5d967586925ee4baa41998edd0103205810aad5c0bbdc77874476810246d13089a64db576424fae0bed9664a42a491147d1ee3b9c3b1ba4875be15462392540f9978d9a4630ba4c525499751a45efc299ec7d73b17f9ad275ee71a687e72690d7320242d2dc2bd4d5c5cf0f17a465185dcf60f8efff53903f20b0c2ab2192d44368f2f2fb36048af071f7aa857b14ad1d11461205bebe17e02be2e3ccb6092821885c4e0d4811be3f45b1fea088453e022432f562562b43a355cb56270cedb6c2c42dbf9be850e77192fdc65cfd36834be988dbe9a93e2518c138b090fb9da827cb1c91c8fe52fe7c57f7 -SIG = 977adccdb829b40bbd8e53856a783db346a39dff62041a2972d29009f1c9ff81b8ad54cb901e497c1d3021b50b6c69ee73558fd7be05d625f5727f9af2ce8702 - -SEED = 99a99531c3cd6e3e9c900a9eeb26267e72f09d11b651a897ebb79be016f64c6e -PUB = 9bf9f8b48a2728e02608fc19899d219656839d1cc1e9a8984df674ec26662f41 -MESSAGE = 7a89c0c1952fdc4298dcaea854efc134656be147e9e8e82fc9a449059d80570f75676b81c4a94f76a968200cdeb0988c73f59afc72ad4c3103e19fe63b7e95e140b5cb2efc7b97a6ffbb6c298ddace3be6d2ed3d598b8bdf0c2fe6c97602142a76e978514c196c1b9a88efdc1925fc506155cff9a2f21ab634e2b93e96928a5d8f7ce4cb7326d9689469242ba9c6a01b77496badef87578f5a17284e900a72df141c6199b0e71ab5da4375037617ec6196d4f4e23ae2916a72d0fce796022305ac9fbbbbe4705b340e42b78e1c02bb1001860cdcaf71ed89255dd56cc0b31c59d4596dcef84e22234be562bd801e94111d83a78064c90f9d82fce91f68abb03c73b6bd8d7e02d4 -SIG = 0e89da5d949cf2bf40c7e17c2d0f9ceabc88a092eb4d49cfbfeab7c8bff43245c67b9e2e92f9bcb9b34b3fcf8b01fa2ea7a9649f814c3aa98b3dd04540c31d09 - -SEED = aa58403e763bac405db065eb11eb6be3e3b6cf00ec4a222b52bff4b6e3d156ac -PUB = 167f9b9a4665f93f5d7d3016ace6fbd13420b2e51e72bde59eedf26993b66cae -MESSAGE = 3baa0998ff02b32b90b51f9a840c7b5c5870cfb1810a9b0f77b55909d47ad335147a991c29fbebfc592e9307175c1964129a2d5efc6215807453bcd726969781222bcad1c99a49748b9ee667c4d0c82889e2f50064c115dbd8fb483d72ab0ccadf76bddb2dc727dbc3fa5c4624c283d8921c8aa4425110dcdd69c05e5ed59b359625eeaaec1e27eafe9d9a5ce736c3f9c527ea547818b9bca6811be4cc15058a6f5b683303b80c90c94a83b8b15869713a66b1e0f656331b286d1ef7698834ab3e138417aad6bb3ab3bd9fc78761a482dfc654f3f8628c8d9fc16018898f1641e8622bd272e38d41706cb9cebe6ee5e173576bf61bb1188cf2f39c62220bba88fcb4de4898b25b04 -SIG = 64b598ca5b8f9ae742e46ee0d8c1aaf31458b50c25d267a677e44be5b755f14d51801a30399bfcc38d14071aa0ae93da825a581ab6c20725a0a910b4735dfa0b - -SEED = 1044ee3708c0b0e909a8cb2ba2cd0af8d28a5de01d962e826087fb232df7b2d2 -PUB = 46d241ea0c702c1889d44655824629b67284d4e644a48fa45455d27ac5f62529 -MESSAGE = b8a445455fb66e17e3143d35204c9ea93474eebeef93963ee5c1d377ca217acd4ca63e5755da08fbffdbd4352bf165193896c8d6f76bb4cd3bc2d3a476a4e320824a1210ce74d0014d747f111eec310c5c89ed4d0850e811f80a8bb28dcaf6f411df83e2c1dfd90c4ad23561454eb5d756b63b4ea7f37dc5d466c16ef70d11190c4f5316fe2aa8597440e88bbebaeb35ea5f04f07b0339264158ef909ad5163bfc248cd724133e274f812695f290e57176a96b9393d07bb310299f5d2a6b6dd1dabcb51bf29c5afa7ebb0701c6c84767ac137793091fe0ed6e47d780628a32c84f83e00e9c16742a523ecb63c24f4a338ed299a06194924f44c5a5d3c937ff9b0945982ad24a2d1c79 -SIG = 7d6bed7f87d090abe013c31e1203903bac9c93445d06c7b53d31d15f970d88647a7ed2c3a63050ba19d68043aadd18bd861de1ac4715b8e828b2b16f8a92b001 - -SEED = 95dd1a5e658fa6c8d42507b3e5b8edb5baeca62deb00fc5d4dca8e1ab5835e59 -PUB = 3a5323dd1e07f323bb6d83e9c2db92a29f62e2e003ee0deacd7e2e4e030d8d27 -MESSAGE = 9b7afd48c474604c26367531556840c388668b0f3840063dfc9869ad5b901274b931293d04f3c8e8f7f8eab815a641d7c351284e8bb0437ac551bb29438964e6a7c7ba772344b333f9eda5a77568c8931ddcaf21e32e07b10bf4820fb859bcf87b81c4bff426f24a4d468f2e9aeda8f17d939709970db11df76247e98a39eb8b38f5949f349f2ae05ab48c018517c48fa0205dc7f1566453e105e48c52eb455c0c40802f797b3eefb1e2f3b1f84315aed5b0711c6499a691b74b91f12ef70f76c4c05c1aa1a993e2f3e528ab343dd2368162f4036a61a13a88045dcdefa85d68532275bcf5b8f5f00efdea999a95783175d9ee95a925d48a544934d8c6b262225b6ebea35415dd44df1f -SIG = d02a7523dcbd29576ba809b531037774df41734a41175813119c6a6a788cd9b8ad780865678667699ae66d010919a966a051c08163df67a977ee6e220d0dc30f - -SEED = 1abc0b9aa01dc57ca53efe7380962b1a88d50a964f5cd98640982c74393f2926 -PUB = 8d4fd14394d7c1405700306983fbf76ea9f171b15a6b56612a1feb1cbdae5dd5 -MESSAGE = da2dd940d5e1db6e80bf7e2b782e7e745cd4fd252e981517975887dd05ac77ed837d082961575efedf301fdf24b70718b991b8d92bdd2e6bee17c8aa4bc694a727bcfc78fd85195c42caf883a2c38d161cadd79cfda9a39110e1264d30bd4c5c4a5876777f233b071b1b0b408935f0468954cc744af8063b004ede56cd981c4dd5608abffeaec9e58f3fafaa671467804b7fa2558f4f95174201f183d80a5914065fed53115b41ebc338f78df050053b8a4e75ea7c6fdc354dad27bfd8a2e66fcd7ae2f587d24be0d4a33da30a220e51bc05fa4e412b959fd95d89ea6ec0162516c096a9433a9e7cf599c928bd5305c2173bf7493ed0c1c603cd03f082cce44237a79ffd8be9a672c2ebaa -SIG = f738af2d3e290b3d23d9aff7414bfc5ffa47235dc053687a8ba5c8541b8511f781566cdaa130e0677db55fa8be9d81a092cb58923a8628494d2f62d95c167100 - -SEED = cbffce2c9bd3e23e406e5f66e632dcfa726654d29a955cec983173235fa359d0 -PUB = 49653edd64a55f7cd40eaf3f8e72eb96dbcdee398f34817f2c95867949710b14 -MESSAGE = 1ffde6826e4f0c24a7961f191e74cc0bbc928e3f1aec3efab32765c2501cbc1620e7ee6f61fccfb00cfca9fb98143b529bcc8c3d0fdf89ee7c342f101815fabf7deaf9f302a288fe175826d590d99ee6fd92da74f9596b783c0e7d47d711a32f39ea4165e5212431441b498c6b70db3b09d1f4e4a14a6bae39da5088bb85b3285ce9df2f90681af2c74dece439aeb91e1c1b0712eddbee8d72569828f37cb720c509d02aec476070484e9b16ec7179947ac96caf0e1be8b6b74f372d7235fe6e3999df733bccd482dfe2e631f56b582667dce5e3121763adfacf3b18cf2095f7394dee4927fc2bea6b5824d90cd59e854ec5872b4551b02efaba5ad54a9b7a8f6de5d7cda5825b325b076ded -SIG = e7ced4fa2a7dff73f1068bbad0ec9a1109043c97a62effa148876f0969ed4dc608e28bce797af3b82532c94dec4d6811b7f563679129facf17bb73d69375eb05 - -SEED = 9f91231497484cab39b9e20f861181d397908577bbb2968242d071bca4813ffb -PUB = 8824bc6cd6a6f15a5f41668f2b3bae8fc4967383078d08b51d6d1b2b93a1071f -MESSAGE = 21d4fbc98163c3fb6e09f775c2ab7b18b18792340bafedacb49605622e3c08aa3b2b8d0e0902f361aa1c0f652e2732b10a0c5c6a05098996b588267cc8951a78b5d431e7222bbb508eeef1b5e8b8d01d3991e18dddc6ca8d222ef177ce62938d1810eecf06f4738b28f440946ccad2a12e39d38611bed3a39f93419a179ec2b1b52d5fe5c80c23b84d8803755f5146092cc199b4bdcea5bcf2037bd53ff6346694155f027d8ce2baffe30a5666596c00783aaeade9c77fc8637942ece017d6484c2899b1918d3a480bd5157678d4772d271f9b99768ee1bcc46b2489ae87cd030f47d1333c7672cb902cb4f5fe746e853de57940ba2264d3e629644d653a5b7af78ce64a993f36250f8cb7cb45 -SIG = 0a1c706dd8a13077ab18386c65fa97cf9dfc43542d1846ecbddeb7b3c93f3c66f3ccd0447aacdd4dad8fbf736c4ff9dbdb62bfc14d8883e385bce9bac56a350c - -SEED = 1e2bd5487c5f5ced461f604dccb4e78eb91608f0b821f5afc4e3e534f7960392 -PUB = ef825475cf2051a2017ae532f077d96774347d2767ea7b45f9c1b860ab993506 -MESSAGE = 1dbbbb13cdad88854b809ceded273343d306a8deabf3ff02c9cec6f002b8e9e10ef5d1b0f5711f33267aa91c171b61e960f740457b81d751a473f44f750a080cab80af7ccca7dffcfac9ee4c39dc85cbdf51259ccd3470d9bad3ad30f4ee5dbd4fac6bd5c6c4df7311a470044695a7e1a7e18572207588afa57eebcd4d575b6d424457ee92465ce1863e3c677cf875fdb98d4078ebe7144260807052577144cb8e0359aa42ad155d79dae3deb99c4632c191c799cbfe587d954787068d663bdfc0fab1334f1876bf498c4db5c53db7b0204ed5a521c62f09eaca8d0189f3b394143f29c421cb5c8d07bd751baf4cbe3bf4be1701df4b2207dfb2904d84f4dbda51cba576d5a5bb16efe698edd608 -SIG = 4d33c96a2e3a5db7391adf65c1cc3565fe76eeafd0b5c7abb0b492a0b51e1fa33639946a243b2ddef357552298ce0aa95eac6fbfe660988271877eb2a7da1806 - -SEED = f78db14d6d1a643dd7735baf2635321244e7ec8ca72c5c38c98c809db9cb5a55 -PUB = 5414f75f52f3864afb0c79c2c5c1d06b4bce400fbddf17fe9cfb2a8bac47a0dd -MESSAGE = 05caf1b8edc3b173fbc1ed29b95e2bf06d814ba2407d4b31c728d04ec273d25394423ac7d4fff2ca36ee90273093c756e2bd13c96d4a3dc7f5be1759fcd328eb66c5882b58fa4588e5b2a3713a4154a2340d0b06ad019601b0e028e497f898256b028af95cd8168df5e58a57cd1ebfc0a0c91ced61dbb480aca7df8dca91eb16e98007cd2cd1a2045b0e4477d12d5a4072f365426567c9d61577f3485c8f46605e7f475ef04a3948f60dba8c5508d14bfddb9b11dd044ef2d84c16b9a9038d8e78eda43b91297df35f4361a383b41d49677a687d5b344ad1ab0fc73017b3bebf32306fb3fd7b3d5071f3ab5f6e49aa15540cad6503bea7784cf9421801ce1385839893362a97fae121300d6783af0f -SIG = d7cbd4181f67712007b7f0e18452e0a024464d9dc9b5ff9cf669d1b91169d7573262f83336b97c861bfab3fcf669223ce8caf319f21d23f1fa331a2d89b6ca0b - -SEED = 7dfa328e90a1b849c219e3da832df9ed77448234f0d89ea5d17a3d64e7883daf -PUB = e30ce6fd5f5800389a70cd117364f59945afb180f229927360b06b4835f8dc91 -MESSAGE = e5e495d663f47236714532687a24308f942ca9c33e088f7f106a5a723518cacbbef4a68c939a6950b2dc2589f82d354e575272d42b1383d315ab8a20aa0cdc9d4df678ab3b26612b5dca66e71f9f3fa7d9e731dc481e2bc7127cea3b6203ca6cd8162e90886a73dc46c83ddefc4b9e2d53d29dd387c624e08bd8d53be928a40a9aa8ae8b1c8d0fb6a7bd6dce5f62315b7a2181f627f256bbe7e2a95bf464e6132204c174209629840235b2c39913301a4b40325d118d384bc7ac028cd4f12702e161191b149e4209058a55122bbb8b22b24683ba4f8e2e6ccfc08dc8c8b1bcfb6d60bd8f062196933df319ab16906d085730eba1720d4b02c67daf38cce6aba38e25d68ef95b2f521913a1d77d5eb650 -SIG = 1c61d53b872f8cde598609682c79f6c5df007c513a71cfb3a06dcb82d85c4b00ccc40b00e59f595393088b4cd0432855c67a207da71f87e72c409b3e50279507 - -SEED = 6ce13d3c2ec71fed83131a69d5d030314ab49e6565ef68163fff09ac5d9b47e7 -PUB = 9c7b1118fab91e0e7b192a23d95fb877cb7936cc6c8a330592f48e6784edc292 -MESSAGE = 10bbc311eb2a765e0167ff37618ff70e13f02d7b0617ae4ac06befbbe149c972a994f680ca4dc9a92ec7efa53997fad356b9ff4ebdee629541d1f4dea62ed0d2494f9ccfdf07a9310491f61c4b3e2700b4a3c668d678329a38c2eff9d8cba431fb959e7f7655bd0fbd77d53bbbc2eb8dc51dd718ed98728a181686be122b844d3da331e329d3959b5923f7734325a021026e2754e17a15108be801465ad958dbcf21df890cfe5d5b883ca43c61cedccbdb58b849ea75374f1e918e803e577a5dc7a1c17936eccfcd3481bd2b1eb075b83237ca6f3c07c19e9af9731267be82d4898eee96ebc900d48b059d51b0dd415b1c890660a88d25f5c5f35d8e45e523e0ce3336923ab43670e35c5057d56c758876 -SIG = 608b2bf6f6da05c2ac5bbfd795a2ac32c79c74153f9431dea59768ff4c225e3b693b645a506766b860850ee97ea43032b05b69e56767e8eb9d1918df9afba805 - -SEED = d45ee69a5f1a7cfdd0343f8770d1c6bc026f067a70dbe839a86f2aa068c33f81 -PUB = fc8d9fb0e4f34793090755e0328096e01e281ea351b8d95cd9116e131a5ca54e -MESSAGE = eb5ed8ab79cbfe61c25981b9d1d6b70f10b60194b4161fe17d11aff1767994aa0813e9ece2f4c5d531b99e8adf1888c30a63893eb451aaf55acd5a52ad8c401faa88d6eacf3e49470566114fd0c6a274e9544846b0ae9bfa124d7951eb26715e19253ff7edc8a70965776f23ce46031e034a200723ba3d11e11d353d7e7cd84aede267ff64bed418cb9f28c61cd0f63b6ce2ecae14b20bc6bdaed8c428bad18be4b7d66338364acd8042a8256f258a69969b8d3ca2eab3aea3706e5f21c3b1efcc254a824bb4e7ea7aba8827c8eb82786c665aa973821931ff990a63fd34a74a6d8c22a882b0b935152ccb36fcc76f4eca65d67c8680942f75dfad073439c0916065e83877f7ba209303f33548d9e40d4a6b -SIG = 156c51c5f915d89b8d1400350f8f217a5c02e2629ede9f4a30b6e71d1ea7a953cc6db31ba5c778c269920b649fb4221c6d38cf2cea2a7de3ad423e04faaa0607 - -SEED = 8a76eaab3a21ec5a975c8b9e197a989e8e030899eb45d78968d0fb697b92e46d -PUB = 2d9c813d2d81e2730b0d17d8512bb8b5d33f436cabaa13e141ca1cb785014344 -MESSAGE = c6c78f2e2080461aed9f12b4f77c989b19716780fab60e6ecb9793b4bc7ed69e5f70fa6bdba16e9bd3194969eea6665abfd630deeefa3d717b6d254dd24bc97dde21f0f29f9ed34b8bd7a013380f4f82c984fdbd95af9805b744bcd952c5a71fbb57d11f411c18cc30bc3594f7ad8228cb6099394a1b6b0a818581bdf93cce58f3a4a23e55db3e69ca9d60cfb3a907fb68329e2ffb6c65f1e828d28127109c9e9fb70160f2ef82a2ee9f9bd170c51e13fd3fc1866b22c79fe6d5101217979dbe2724dcad8a9bc69acc42c112dc697bd271eea550e9e50406bfd28245b83b8f012d34db6dbdd55ae6e575745c153d6e7534901027eadc2fcc33a5287ddbca6d3aeab8972294dc6c712b9942547277340e7ad19e -SIG = fceecca4b014fecd90b921b0fa3b15aeaa4e62caa1fb22729c70269232c33cef0d0aeea66432c128afb9a3646bc7f03a12774da8758398c2a0dcce0bbbf6740a - -SEED = 18a8f93648cdcf47133630af1e11c0ceea3de07327314c96580df775597d7a9c -PUB = 2912f41ab4c87e3937a03331802cba87716b4eea14b9fba6f546d0ac2c0973df -MESSAGE = 592093ac7cd671d6070b0027edac1fb015cc205d78bb603f378eb9f8aa388ca830db3cb23420c7e852db0b55241eb88a02cc627aa94143be439aab4bf2634757470406e842f20eb10f0700e3c2da364f588a8000f23850c12ce976f326d2df1bac13e95020b412b175bf74bd7ebbacf3ae55c0daebb5c010bf804feee1d7d49fae050bea55996f53cfe1f15a0cf20727db4ee311c260bad9682d7b965e27a9491f471d4a473aff646c7d424d5a0bdcbb8a0233f4b3060dd04c98ec98dfd05ec7247884e2d8e152d4ae52b3d5865d9efd6706a60e088e1e7c9f624510abc7a2045a2c7a7588e2535e73191dd5cf05421563f556a13e8236670343cd5ba4d466e245c4ee3b5a41e70c9a0f5e6ea2c559ebe61ba81e -SIG = 3b77394cd69f8b45d00cfe3a79a7900628a56518b379ed8a11581fc3a376e5d66807df11e70904f696c741d21d139310fa1b89a93bdc4d2c3997991f5220ee00 - -SEED = 206cd2b8114aae188d81862ccec4cb92c4ef5fc78c24435a19f9ed9b8a22f47e -PUB = 97a67ac2811f529456df532737d76bed7e387da83bd55459372fdfb27ffacff3 -MESSAGE = 480c4800f68c79f5dfc0c3666c0ac429b30fe0c5fe848750db2171380b80c8e9fec0a054b16d08674cefe2f64ec28bb6b0596b35235575f189bee259aca766c222ac0a46cf2af75774da4e34a0b54fc2ac49ec8bedf4887cd9b7be4fdb7f686902ddfab04627e26ea2dc3d97d62a4b1546180218ed8fa113334819b5275cc54afdee44309008596507971675e6d8b8a8edec4718f2d4bd735213cbbd18791faa8054174907a7ac17d7143a4757e493beeec4849d0b836f18bb2b3c9016f25af47fb96199251720549f15d149503d41095e25f26209daac39154485c3ded7cb1a8c3e83a52f5a06ec09cf83df00726b7968f64c0cbae299512fb438560f04b3b644346f938ac8e90486614cd844b54eae078bf678b3 -SIG = 73a40d9da08fb98ea25b67e721557a1a51225294d316b53149af895fa4d63cb4a3f56f688566ef6da42fd2941dffa06d497aa902165d50213a6214116299a90c - -SEED = 59b144a708abec972729a04a6c13f0ea020b4ed4a48298023a568958c21215ec -PUB = c4f4720092ed6179a082ae4d6145df3771786efca9bd9bb79c9f6667d2cb56b3 -MESSAGE = 3857bd260b8aad9d073f06765d37fe893a3f53e23de866ddac33495a39ad33ee9e9d5c22502bc1c4b5470d0e3f3a585223fe4cb93cc4ad2b5ba6d78826a53fc0253dc580a2018cc9ff1cfedbd3ac0b53292deefbc14e589acf496cb5f7670130fdbb6cf38d208953c015a0474675b724bd109f7cb89c33016751fe7aa785d099d09ab20dd5258cd764ac8daf343ce4790ead0863af43121aa527a37a11628f47869668f8eac00d80b6bf9906663d7a2899c1cb678cd7b3eb3bc80226b8b13b6e46877f38f07c3d9c86d3368baac4a6f6b93ccebcec9811474b6a6a4da5c3a5966571eed05edcc0e3fe7cd15915c91f44eee8c149ae451f375518a79fb600a971a39b9433dfa19f91931b1932275747c262eedcbd27f1 -SIG = 1a80850fcbd6e643c6ba8eb684dbef7df015159228daedcf0604709186054db185aa7baacb09d6caad01638eff8e468735a60124de0c5376e94340e541a98007 - -SEED = 8d1621eeab83270de857335c665bbf5726e3722225fd016e23bf90ab47aeec3d -PUB = becdbc024dae6a94ed4e29c80f2aff796aed8feb2c1b3790a8c72d7b048a2c61 -MESSAGE = 97facddc82cccccf788c31b3305e93eba956f89613e6e53542b043267fee544c2b0a8ae8886a31b9d321a63c27623baefea840b2a8af5b2330193ffb5baf873c335528afeae2160163c851c5a2e58154a1b0569c2d1366c0710437623b0e08c686e54fc279ed4c45f3e856868375f78224c777b13d75de10d79173552425d15a561904155f2117b2f14713eb0b04648a3bdeb3302167d1973e788a06cb00d48ccb269fa71af8ba68eae55dbbfd9594d5c2b4dc13ae0321718561acdf67dc8cfcc25bc46bb66e096a1941d9335207d3f7d11e8904904fabe3a50a3883e7078047df252f38b67cd28a6ac45c7d7a1d2a1de8d45747cf09301e01cdafd0cd99a6e91b704d509fce692fbdef2f71a5ce0b35bc15c65f876824 -SIG = e08d6caa5f39327d6e6652ed74dd1a37844b979f5cce747a606f5679f4898bbb7643df7e931b54a2b40ebdefe83003f61ca0f11112f023c6a3e8cc18cafe5f0d - -SEED = f2735d50ee3a9a65b58c8acf551663e98809ec406f73e3e7f4e73bc4ea923874 -PUB = df48a5b94a07af3c2c99b8388762243233c850dc175317d602638e5b86ab49ed -MESSAGE = ae31e94e7197e4e4d0239348025ed6681e513ce1a6e0aa0e5b979373912150ef113e50ef0569c483f7568c4bbc4703c5dacaa80a0de4e738383fa1f10d6d4071a31b99e6485143972316c86522e37c6887a1c307b29b0dd6f9f1b438310af9d8d7346fb41f9b2dd2e80b14c45eb87d4ed48e37a5260b52257b3e99787a13c55392ba930c08e0240e960def0c29b8550745cf149dee53a5d174ec065d2d6677dee1fc42057062c34e27ea5dbcdb861b9f670c6032c7846cec8e87a7c9520e27967b0186ee71b77ed6d029bbdd70949cec4a709329fa37fee002490cc1bc4c2df6f763f9858f33d750c5b505a67e237063c0486f9456d3c620d9ac7c98f1381de0effe41c18259504a150d68a6a28b0a3eea803b855315c9e0 -SIG = 6942a7696417efaa591b95e11f02d763bef5279b932a8e2a7cbb9f583695c14ce5cc556bec66799b33cb592da4df2735f9eef2c3ceca4362164b6cc93da4e105 - -SEED = cad9d21a01c7e1d15df2fbd79c516eb8c3401e9fe28467cc7b21679d4e331a3d -PUB = a7b55c15d6790b40536fcae5ad2892cd66b18689f499c1fdeea66d4a7df39424 -MESSAGE = 70702bf19c919f9836defd7b846fd9992d8b7eb2e106aeb71e60a31b4ea25a41b212dc7de7c91cbd613d58d0595db833cfe7e50584f25569602c7744fa675d156d0f63cd2b7c089c8a00686a437169826a12dc485b38c068a8007142e5163747011a07a415683622ab1e23ce577c732ba14f401fbc3043e0693a9205c19a92298a3d9b08fb7afafae0a9f016bc750ee631a5f5da5db6f9ba2692c74caaaeb4d097e90e3c02d2e3a7fb3aa000040b7c17b74564e646bea16bad611ebc0859a3828804ab4f5cfba417d254515ca3620a3ad683c46ca6267bb49539bb30e369087e67438e9489562750dccba3aa0b1b0a6c267032d20c2adb75e68df1123b5259bfe4eac6cadca6778138a37318adb30e8d669f3bc9692cc74b68 -SIG = 31927d01db9f2472f4df6f63c18ebd83c2b1aaf88d580e848854df8cba6395d3da7bd6bb9edc1fce1c7d7e1360558fcddfa93915be076efb8ea2dc5ea7b20d0a - -SEED = d9be842255e9a16b0a51a8674218cee7cd9a8bdf343508397f4ddb05f3fa0082 -PUB = 7931bc6dfa3324943aab183d1285515919399ffe0b710677f0915d3a5be51e92 -MESSAGE = ac6c55b134663e41f02a6dcb8549eaa1c013f59658d81d812f95b74009513723671945e1324f90f8a3f971369181b587bab45665f788d663ab78140c5a22c1c18d4afedc7448a748afe5bf2387003c1d65ab18482ef98922b470da80ad14c944951ce4aed37390cce79a8e01b24c7dfc1141c0eca2c7f773ed4b11806a34615513486e4ee11af08078a1b4054cf9880298608dd9b3faa1a242a452fe511604b3102c313d14cc27c6f0f8471d94555317eaa264cdf52c69e18f461e47903d21298716b172ee9cb178f08ff2d3c9c162121c2ed21d8734b2f0630d399146cbf76e028a143f2bf7bb50af0f57b9ba8021d264b00c6662f84c86cb6d5952b3d241f7dc3e700c96616cbcfb0d0e753ffd5d21ee320e65e97e25cb8609 -SIG = c93845658c9560d2c0e28f282adbd4652bafd3bb2edec17c94878f7b94d3c77afec906ed292a8dfbf5f8e7c118e8f2ca33dda7909d9b695b8ff5a1c0e97ac807 - -SEED = cfc48cc6f65811fe7d7bba85d1cd84858fd6f7edd638f4f552363ee7685f69ca -PUB = d29c10694c5e8e3f3447ed78d34dbd74a2b301373ba871b5850c333dff7bf8d0 -MESSAGE = 8e7defb9d16d036bd642cf226e32773e605361c5ec4b951255788db0a042c63e5a4367d61524f10e6258991325a39ab6b03612260c3fe3df20b34202d34395bd4ed40bd61373df781a4c8bcfbd15301060f07437732333d8e49736322dee6b22438e787d8856b70c26ec57d6dade9c3c28e27220c5670e393544ed095937298dc3adc73865f777e90037bdef834716476d78f4e6cb4961a4c68a8a836338a9f5da179c4d5e93c3f70dd35eec709653dd8de37996b12056d4eefcb4b6b3c13ba984d832275c4386ebf4a8ff7f078be3d428c1e0d9b162381f06a5b7bb12704003d91f25d1d8fd43626ce70fff59d2927768a76bf7f9ef76ff95489f38edcd1c9e9b8a8b0ef66c32805776d5ae9fbd84a7af4fa6563ec70ac5733a44 -SIG = 80c5d51e96d1cac8efd3459825e79c1e9f65af701d1d29e1f95b036707113b77984b7b3350f04077333c957f8fbc7d9b040c362651417b9899027cd33edb1103 - -SEED = 15c9f7c4d84a5a479041952e6a8cac24e76fd2d275c197e6b521929b43ba6c5d -PUB = 8633c1829d29091df71fd5c0ef640572e4b64974cd097dbebbcddeba041647c0 -MESSAGE = 11730dd45dda80d84d080d92e9bddaeea6878e4a0b3b512d9ea733808e1cef51d49048d6c78116a4bde3c64aceaa52beca86b331ab59e9185c70286a02bb5dd04f5c7f4e9c7e445e77458565f159c783dfd4d976a910e937789d2141d416ed3a7f608d26737a86b20b624e3c36af18d25c7d59b8d7427ec6c4d3d438d7ae0949dd7d748c1ffd6f28e8285d440422d22a3761202e9584f5cdb3504547aa4b685730c982cba213de08020a5e4e46a95fac4b481bea0b630abd030ddd335a20fe2cf7094aef4813956991913c6821f4b5410df4f133fe63e22c08092a0a65972722a27ae42011a807c327b417237c540114eecb9f0e96cda5dcf0246f1d2717f49b9cea9dc6a3da9b396f0270529226f5dcba6499918a6c289fe055fec8 -SIG = 1e36bea5a583767ebd80306cab233155b7b42814b43473cf45cdc5039c939744a9694b87220daf4ccd29f25cea405e7c08db2ef17f3f034dbb49cff60283e306 - -SEED = 6d2d0d823f294746b9a5512e14e73c1d855b5e4bca65fe817729810cc5ef840d -PUB = 1b6480a6a90dfb472984855cef6f1ab31eb7b3f13c8ac00fa556d20b53e5ae17 -MESSAGE = 8772721f72eaf7f73040c068a7c3753bffca7dc2d0930c6525f425e6005c25cd4c0ff5095c9c61a5d8a1967b8c86010c884e509e6b1670f79046e22979ebd354734090d3ada21435c1f8254f7b5222cd5564f064e977640366449f4e5008f870f9c4840565bf4fb5f574c9774ba2568e71a9ccd82ffc59b694f26e7de4ce2e3fd880a0eef387931333ede00dcb065e6d0f79591a2aa956df1948a265cb95750d8a233b15c288a05487c515663f93e740fb1570fbe4bd80c68e8d9297345a8a01cdbd88f4a39bed9c5ef09f144bce5de568bf3733bc53b2039a29cb3e194501adc1c10e86383aac8b0f85c67a6689bbe1470a392476313439ca88d98c021c0eaec25fb2f9a160ce5c786170be0238fb8785dd33bfa9059a6c3702d0de05 -SIG = b515f49eb32ad478692df88f07b7802c6e0e5327aa08a6366e4cb1d1e26f9e65fc81abebe2215d649100f27598273a412b624e842d8130403797e57dec975a0a - -SEED = c0cf799af7395bf27bafa36cab437045e39c903bf807548319ce44f287494fbb -PUB = afbf550ca290c905bdd92fc8831ebe3dfeb6daae4f56005253cc50951e50edc2 -MESSAGE = dbe65780e968de9e40ffb57cf59a60fd93b3f9a5e7d8ed5180adbc578ca1bc48bd9fb60a1324c9c2c1141479a0dcf0f1d07e84936526df42333c0d773e3fed9e4038de5b95ad905c92cbe040487bf55e10e1edb429a0ecc4e0e8d00a988a9cd53e2eb372f4fc4cd9537b269ba3a23cefbc8df6476e75434b81d93e8891bf417c82e363f3e4abf80a4f73aca84ac7df6337f536d63d939d92cba64be742221116069ef251abba0b00af01718bb580ddbeb79973ef10a68b4d0fa023d6ebd3079d6b32a1aa20a21e9202f27590c3f0c0cc253073c3f822aac459d39f50758b70c00710a3c98438416508522e512adaa0afd503a7ceb04fb94a4a932ce80cd5a7f11bb861263f58e5749d542a110de7c7689dfcb0c51afa9d54a58ff89f3f67 -SIG = 5bba01a4c7b25542d06912de70aa1e220423fdf8338a9e693395cb6f0dc1fbfd018e3c77e50aef90a9080f30f1f5792b2431078fe6e3e00464245e17cd8dc107 - -SEED = cdaa50e8527dc7a50fb37e28fa8b9568c37e8567e0b499997b9aed676180c3b0 -PUB = 7c56e164510268c182b423747904f1d3a5809330f6e1b29266ec46e73be1550f -MESSAGE = 94fcfbaaa303dece7b908f874cc5f095061f1754bb35780db666b63ab8290811bf1c521a7f8f785ea270dfb39d0d6ed95ab71955a11ffaeaa268e081ff3e4f2425b41880a987151e678e89111350942d820c3eec36212426663be175e5286b4ad1cc804e3e3a03b9fa3e82838ebbc2615a645f2ca1468ac4a1cdbe523761e83f4381b0c8550ae5e8c8cd1fda57191436e27cb883bc64be86a9dc6110ef3401d88a7debd1b701d9c257a6826cf01e9e2922e3ae577f2834275fb0ecda80ed8cf1801e0bc5e01e26a77c48bdf46a5c4894d22ab53e741827e24bed5f0750ffad05e53f1d5e61dfd316b191d9797ef713131a8b430abe3fac5f3c4a2ca021878b15adc8c5f542114260e687a9d199d230c4e0d3fc696993b59ccfa3ffa9d8d2fb -SIG = 137bd10a50ef609384fe668768fb871de741ca0f53ff8477d7ebfa90aafd5e2681fdf1b89250463c15db8e17a58825fe9427de089c34de13cd07bba18d4aa40d - -SEED = 0fdea9bee6288f947e0adbdda4dfb2baa03891af25024a5e138ac77984d00507 -PUB = 70abd86430d7e8d63209c8b373ec4e4b79e989e6725facefbade3c7574d23cd0 -MESSAGE = cf72c1a180a2bc37d8478d9a7a39acf03bf2a50790f7902f81121222d31d3ec916f4f24cef9d7c41dc021b0e8487bb892e47305e54520303e89b30b263dac4a9ba375d46c40fcf400535c959d2b746a7fc970cf65b472e84b5f1d0ebadcfa1aed6fc47facce16a366a3b1d6e516813c1960975f8f2b43042fb4eeaabe63c6f65db45ddb7db888a19a9d7ba6ca479fcd70c5d1e970f12c14f4d24fb7e2f357bd3a94aa1b868ccc0847f2eef21853e253bafbf07c4e6176a1ef077167841ebbe5629337157f39f75c71d21e7e96c51a1b16fa8dc60f0b1279fcda2641fc8591e3c492f15bf83caf1d95b2cd91332f1b4202fe72862ca2ea2ef92c11db831d82f8fc3d41fe29a76c211a758e2f71bd89d2c6610f201429f348d56e10e3b7af53e27 -SIG = 80c42dd5df03b285a86ac95ce6669f786a978a813a9d7b8c6a23de76fbd09bdb66c5dd1cc9f1a176cba388d5051764a32fa27f0028ba4898068bd01a3ee17208 - -SEED = 03d5e466f8298ab5438a30976d1322a7215a642dd5fb4c3f8519409a7522f092 -PUB = 4b3ed4db080e2a452e16912c14504424920a60975604e4f379258d1c8b193d6f -MESSAGE = 1b47b70013cb53e1f8f4971e0f39563ce87edbc2cedd99e5a35585df8b00a852f7b9c97c7e4a5465fc5605ae8c5c36570a99201a7ad6031287ef0c7b2ba6e57b056d0fc8d6ca43bf6cbdab098934b403197b525d22d45e6b29c78f8d6183e41ffe197dae25ba22b06669ae05badd7e1da6932a7d054cbab3f54e5146223ad8671231bc16fe62679bd2817a6b80e653998c4949f81ff53b6173163e11da3e6d3c76d84c713225b4173d6bf06a85b6988a48be4359cb515503ca563f4353f8e7d45e4d94462c89a04a00f1b3b0ca6422d5db029c507d464834a20c78a713661d84edffc496d69282619894437b4487954cbea2aa7261e6a62b6851154a5d25fb6b4f09c59473d385ce03e91ba865eab66c58c0abb0b7a78e4be927e55460ccd70d82 -SIG = 6d7e4658f26f337c98e03f13542e2f39440ff7bf8d88f3f6dfa4d64948cd96b79051492fc28f65f2cc0d23a0c4d5e2307bb1c47e11e53b371f091b69f80dbd05 - -SEED = 76cc18a1dafffa100586c06a7b40f79c35fe558c339c2999a5f43875cfade03e -PUB = 4b9da8d2f137dc6c857a99a5998dd89dd5f05971a21e8c776670eb47bc1270a5 -MESSAGE = 4522b1d82373f7a318221e7e57617503ddf44fd53997522a1d963c85b708d0b245de372ad52ec7f54f6213d271f7c91d5a1d36d134db389df0b081a06bc0c7a4875f724092793172c9115641c6d054f1d992e0fae4df58695f0ea3449d7a4b3a8857e19803fe49b6d52c9ff3746a574a2756956579f9fb809a0edec92c55e95ffefa3d05f165822f464a21999f29691f6744ac5a3ee49017880645e837edebfd2e0f24997f041145a72e2376ada283186ca2b836362977195baee30a3acc81b243f3ee376a2c4764c783667a4b1177e7951d3e3c7be4f1bd7ae8c60fd5fb0fd91f0c1c14d0d2327e8f20d92c0dfcc53870e9d99fdbf9dd9a17e882509ae7baa8653e39edc8ee569000d624cb93a0754a798d1f811f6a0ef5501a17bcf25fd0f91626 -SIG = db74751c66e6b1866044dd9ae99f19e6334f179e79d8b8e0c8cd71d22cefb9eab7e3e7a9c2da225f2a9d93a313d1cbf1b7fe2597b8d702bf3017a6a6bc7b7b06 - -SEED = 71ad980d58ad8e7d33306689358936a372d5190b24ec7f9bde749cb81150efda -PUB = fd35a75fe5abc20104691a24a4659440b55aeaea902ac3be274af27aa8312869 -MESSAGE = e87ae073ff5dcc5485a19940e4e3ff263a0618a9025ad4032dfb36d171ce881f71c18a49210eb45819806142e2f00db3041835bf2c3bccf1dba02b8b5a5bdaf8fea316c0623dd48a564ec166f037d587c8c01684e5e5c0ba9dba4d23b49a0309244e282a51408622edb05704747e0cdeec976893777071098972c113a8ab639c31f1613233ee460eea8a8c10e1e6e152214529878cf1adaeaf78cf19bac71361815bf57955498fab4f0f2b7586c86f9f4c2ddf8972f9b9e0eb636d84bcc14385b2d038be55a963702efe225a50bdd0c4da92a2a6a09100ea04a211d396458dceb4487116837d139eb0f122538ed3986ad0af4da2dffc89f3269ca88538086e691e5beae9581e7c63d8e612da2c47f74dde1d94951eadb0df60c3897d2a3095c506093b -SIG = 81670b1029e481e9ff3c171f05c16861c846ee79cdf2e21e3bf952bcfac97565f2b1dcedf69d2e7eb35caf5662e8bc671fbb96756a63a596264d1b7f4af97e06 - -SEED = 61594e24e75f996b4fb6b3e563f6a4f9915cfa65ddb199b01fed7f8ed7824ecb -PUB = 8627d2141579cd2521aa076800ac354b9e3a47d71cedc8547434268225e33005 -MESSAGE = bc01b08c7caa236100a012a726477d0ec389dbfadac73d5106424c5d1f3d1cef1695cfd93a7062ec8bf1067047854920162f651357bedf1cd5a92ec29bdb5dff716e8f6025515a9549ba36cdc35ced7c5c0c368e6cd92f2f10ae146a20728c374bba509641ce88cb42fff0cedfd9fd67f310f9d01a3f3690eb21db17bce67ae35c4cd24c209f09f044759d8d5a7d248e2bd966524ba8c0c28974726b43bd05de843433cc400598922974623d9acbfdc761c4c04375a952ce54caffaa96acff6d9dc278742af476e1865cb8c20d13d1c1900863bca231e44c6b0d47cb41d510f7958f48f304d03da033484a3e1f273faf6983375b7d3be03d8a0a002def6365beb2fa8ccf1a94987adcd33d0da1177fc5159b6e56d004301e921dbc12ec0a73f413cf2c48 -SIG = 6302b3ff2710be306c92b9aae30d23c3d4beff394e63201e6ad11713345c4fcb5cc8d3dd10adfb82bb11a189ce7ec3e4222727624fc17881c14788d2710e1608 - -SEED = 54e6bbfbf8c06ff2c066318c2ebf03d506547bf43c2d7a5d4df305a3032b7138 -PUB = 3b71aa1def666d9188f403f82ed30454aba5bc9f470f6eb988da187c92523284 -MESSAGE = 0318d7cb4805af9821dd3f914b0e076fea04a7d2db3a59a00affead3325a2be40c1f87f53276a8552604f228b976e288b9be906a7bd25b2ffab8a8af5d0f6e08786fd034e2fe1eb7ee033979860dd1e5327287e9e615f5dc5a960f17026b56842fc8d44cad002edc8501cfb956001502e4ddc81a7700d9c0be88eb4aaa64a6cbc39de82f13c11086de1a4270d3af97284bac1caef1d3edaa1071666bd83b2ede3962d98b9d93497ddfd8e97dab3089950cf30ed11db77ad1437a0af5889d8efc44e612420e3907267df3acff4bd3fb6e8ca5badf8e72f9de39528653058524456a81da5f84982afac34bef5f71e91f8f90938a6f5f1f287716de56a0946d261e87bc775ce189e41a77baede7320a3c608fc971e55d0a773c4d848d428637f11b4e4460390c -SIG = 3df4d09079f830e3f982283681ba37b50f3c73de2c5d22a291358ebb1fb854e510f63f9a48e9fff7fd8311302ea3e969394e6d49c9e3182054942f6a744cee03 - -SEED = 6862061be0de9dfd998118204b2b98db3ce7d7e819dbc10794af0ab2b06e8434 -PUB = 9c5f7c2265dde1b25e4f27ec71580d52dc89f2c3a712bc1ad5d6d69e711e08d4 -MESSAGE = 1740dde8434a0d689925679b0c180300cdbd0cf6a89ad8fde34653316cee4c571a4105c9e9e0284238fef2c38a09157c5db94340571b390adfb69ff4c0dc5053253a679d42cc1f1bf1ff429229ea0a5044c6f79564e0dd287f53f015b83187d9ad27d91039af062c437b1575a0eab6aeb8aa0d27b27665d6dea9041ff9963a3118b3298a8544e3fd69ac6877e3e4052fe4422bf03560b2c57ec531ee8b5ff53c28dbde35bb45c35077636e6f841b59d7eb77bc7791b6093858a3a80a3aa6d778dbf53db9d06119c50b71c791c0495c576d1b59d396873ed871485352c8299a359da5ee9d7f36ed1455f89851a30851bea719685aecd08f25562609dd106630735277e1d6519bb1687de8b8c68b9671452edbb3491da264cdfa0017c512d2769759cb925fb664 -SIG = 965edb34e8ab8bc3204a3201d22186372de4242600297cfdb57aa1df074ec50ddf10105e9d4c89a266c34db7772aa94cba946429e68ba62bf9a0ac90f5f05b02 - -SEED = b2250bbcb268d2477c8312b1900fd99982baa29a68974fbf8778a1228dc97550 -PUB = 44aa8df1181674b05ade980f7eddbaf3bd7422a920287cb2d2db59a063eebf74 -MESSAGE = 7ef0ae1336a6fab37f99da5fa7d0dec7409c072623ead84f241d53d0596b461705fb1b3c537d36b89e8960febb4cdc0d427ce2fc1be58dbbce151e35acd8b6ace40a19822914a4bd8c4af632f136418ac49b184d55193ebcc32d0d798709b1a8fe294fba8a1fe72d976b4400d4a393242311b0f8cc994e89475b0038ae5d8914938e8f6e87c6f50b9d656c45d7b14231efed97f3c90668913670bf5be2efd5c270c7cbaf01e8572e9800978dfe2e10a2fc0440b855629bf9cd409ea941cb69226cac771b15ea77c0326848806ff8d2e201e6e26cd5f45430dadcff8f59c321c1c9c6a29b94882935447d3e6c2e8804b1161576bdf0320fe53c307d9cde426077a7677cde3c1bc83e18e60a0c4ee6dccd877c213a8e4cca640ee04929804570ae1f96157c04357a -SIG = f2b8d92ed51ebd1000bf9dd3411a9fa9e7aee54c4c86e24ad0f9ad5c55643a12d680019ca03f216bd4bd32c9ce1cd8a528c3ffaa5d5b1dc91a4be56f0e2c5e06 - -SEED = b809361f55cfe8137fbda880fc62cbe44c216e141893346302b336045de21878 -PUB = fd23e42ff06644ead347abcc1b3e03b0e88593b61254981dd8ae59454e61b3e0 -MESSAGE = 17ace197d083aaf1726f53e5ef81b5a8c09222f260ee5f1f5404ab78d900d489688449b843bad3c498aac6d80b4639b76e6e81c55276a6f9c7cecd70b71aaaf2018ef76c0e30154aae86a5c86d4e8d0e4ec68cc427060bd56514f7238086bbef5bfca1f5671b18041838fd013572443dba48fbdd95ca740b0daa4327164a1e34677249708f77bd793e7caa6638b5dc9fbe6f0dfd4120209097209c93cedfaf21b6bf59ca6e99e6209639444f0e827bbcc0a61c3a237ca22a283213223ab658e712c7556238d3a5fe31722d65f5706ef6d64d73232d3043220f14e5cfd3c2c83a83d68e20274b6f96b29de040cec8475030b6a8a87d29808dd381795c3d22acf5dc193b720d95a752d9f123c209ffba004e48dd06dd8c9e172bc9e087d80bc5216c0b0b6e77031241 -SIG = b5b5950d3772d2eef88e1b0f5df5ffae2f2103885e71446d346fbb5daef94967a6b7b6e4be885110065876c665b7812de46ad31ec3bfcbeaee13ed0c1e0b300e - -SEED = eeef8074c2eb9a1cee2f2d3bb05325546a9fb7cbe44b599461fc5885f5fd9cac -PUB = 9b892941a0573b7a1673ef480f081168d9b7496a81f9177dc427ca1f84cbbf7d -MESSAGE = 9ae39feade905affcbedd2e72a6f2429b3d1108e5bc1a9dbaf490a6299bccd94acc413adacc918b14afa85c78bc168cc00740c3da0e08183915f79b7fe3868ce2a7e886b32ad45009805bfb81b8c07b3b1022420c0f009b889d7fc22fd1997ae34198438ca94778575122fcaaf96e6502c33a75a129a2d0dbb073d93820d9c96683db318990be3fef4cafc890afbd9b1504c7439a08a065e7814ee4f9b6f57ee16baed3f0e3aa35dd23d3528a458919ad77048b4e2e6172346be249a50af02bc6c853304c208ae0ba02771262a0d8a465f71fa0635e53eb2ef0a847d56a0bcd7dd3fe077c92bcdca3069a4a682a2859928315ce3eb445c6072a71492ee82e172a20be0b648b756e6c775376f0c7c3df8e64288089c2f81ce9593c6e08bb1cc1b27fcbd392fc7952c55 -SIG = 6f7101984fd6892e2144b7d45619830caeb6713bfab4eebbe217c5becd249bd9d752eb76e9fa995e7c71ff7df86bb260cdda173ff5deec6af204b7dde011de09 - -SEED = 61faeb15f857f6557862c8b8c7ef41f80545520996fcc1127b8c2491822201ae -PUB = 60a290c0fc425a0874673d94f9bb1400f9dacde9954f9f5b05dd48ab747a3950 -MESSAGE = 253b566eccb563bd6e480c69739b8e372519a3437254e0e5029cac86c71638f2df2a6cf9e56db2569934deba90db75547e3671747df64d6f2aaf3c110fa67a7094ccbe4cc5355f0d43235136ee26dbe37f4225d3bbfe245595280585fb548f894e86c516102580291fa7a02859557fb98eb588870828b0990ae9d74f3831da58946bc7a5ce1ba498b4e8be8989a3b50d7e8789f56b8b4fecbc2a33bfa3ef591a0fbcd932fa93e19f3a812ae5e4e3b4b242be7705a5874af73be310b0058266a378f23c1348524715b0ccc18d6634b23636c316ba6a1dd2fd5092c06716a717b54d0eb9fc7f636f85bbf225a2cf035b4b7cfddd75351682c0576c6b3ba5a1c0b25ec594e7709dd09a0079772ff3acc67fb6c1b37bb3742b726e77e80561d9ab73160b73362581da5b9c7f -SIG = 31f90f50b2dc705f1d92f12ca9975d76f1b2826ada3cc185b0ed6c83860777bd8c489b59855a91f64839d49ba467985abb376c47a4908b271b8f77c58d01fd04 - -SEED = e6b9cd4da07cb34f30391cf68f0d87c7cfcf68f810ffa40f9739c95deb037f71 -PUB = 569ede0f04630b43a04c5a66b6a5636b766c75965984a7477e15491960fdd864 -MESSAGE = 69def0523afda696f8448f9c1143abc26533e68695a090df0d9e43d0c0eff43583e6f709d2043c815fbb3f96ba2b0dc3be6fecad5dd38148788e4a0385a9fe7a921fcb8ccee0e4d3aed4bc3d216d84b414f9580b02820c03d92e675e685c4b5851f363bb4df97b417c3fd90022eeafa20dfbe82964f2ff073d255758fbe567c76b2c35e2b09f8a8d7afa32c6f5ad01bc3ebf6e210606db038ecb6820ce1ea4dd529fc1adfbc2a138565ac6d0f4a4109bdd47b8aa6ef4b8bede454680d1dbdb75fe1eb2e548d5de7cb6d792fef3aa0d8480a6030b30f104d7e76b58e9f476ebf2cc832923b50c50c111c3515fc518852323426ca778a596d3195da8585d8c3aa92083313a6e6585b70c98b185b472798a61cde77e62ec272f14b0d9eb4f22f9c7c05817da6fdefe7879a584 -SIG = 1e375c94bd809ca0cdd02f89ecec4e437732dd20a0a84b254eae889d8070e682d113b0be22e41e6cdc3be877680e7eeb7f0995e6622dc0b434fb0949dd994b0c - -SEED = 4d9044f17b5a0977dc5aa9916a924300a244a1ef7f060277ad4978351ea64291 -PUB = ab9c0692a606b2567c19c30f9faa3b4cfe72fb237077767b76d3b2ae1490a6d4 -MESSAGE = 7c8c7189af67327af1c6dd2c30e975f190e3b38d008b4585167e0d450740d46734587f6d208784245cc5cb062a2a277f17ebb2746f9bdf4a8237ca479ab0a430177e19ed7dd3622576b14cdc08282214fe5ee4d76b43c16ac90864c51be8aed45d7b980df7917f290fdf795846465f27fcb7e5730637944f0577c92f32375e995bc0cda9d7196f2c0c1ac8b80d12a0439963ebd2254c347703575816e7964c13d44d629280c312ea265344de38f3b18d9150f8f924afb44b6bfb9eda513d59e65e2ef18666e6c2a21c4018665befe92cae581d3cb14e23e97d830002cb90931ae0210068af394ebe351be5b817f3674bfbf40049030e4fe505d34a1d502a2c50d8e638e926c230676b7edefb6bec77b1c0ce609325287ba5fdd7a9976987bd07fc6a4344956ebf818f08586c -SIG = 6fa48aea4d5b9af65af964cdb709443a11fa84f7d44acddab16e04a6fcefb27ae33c05b36da13c23de517d6e6ac574a03ea630ba4fbb958131129aa7f1354c01 - -SEED = 75ad76bb4c0c229a5adc79e444b13f88a96459862c8cf0ba498d0c996af94a7a -PUB = f074dd2b9c1c309105ec951bb5812a91ddb54023b3809ab379c56af0461af617 -MESSAGE = 0ca8c1c74128d74e9d0a7bf8964291d074917f2f9920efb911520567642a50a615abcbd00aed4abbfef1a983cce333e1d0df3e6404fb9043c6803914cd5fffbc66a0790c7878a24089a571f895662a1d18be3f01ff97fb3323334b6f5baf96551448e4090d033c464294d09133b151d5b5c6321b50e2241de0ef6f882889ccf4ad3540d5a1e3f7548fb13be71c16516606e79d0449c2a08e5dc23148843c84e97ed24069161c8e75208f33e95b3e10d1d49a2faef9d986ab62809f62ad39c7cc871f375a4f5a6faf104d7e11b890cfb0589902685216ec07cb8e8e9e7a7c43635e23212b69ca3b7ed54f0b97949e3d9a6662f8e4b3ab09cd495294c331c047d86ee785ff658bcd7fcf9c480605ce05e810068d60fc9b26b5f063eb9000d2657a5094284ac80f1375d0b66d6f5f -SIG = 0c4643a8be6dc22f4beb6bcc70c6172ec7608378653cb4e99f3ae795eadf4e982a297609ca7938f5df632b095628cb75062d3d51fc0f3323bfa7b22ec4d47205 - -SEED = adc6e9b2e103b62c24ad4346410e83a1a0bd253e4abf77911850c6d9666e09f9 -PUB = fce316e33c910821beeddd634bedc58ee57999a76ece384605283b99b543b78b -MESSAGE = 8cccd98ebbf2439ffdfac41687638faa444e1ca4b63d13e898eaa8355492f28813ab813fd01510e112be106b2045d30f63335d248904d521de181abac03e3d2cb2d16c44b3b012a0c51f9901aef9056c724d7a2c6b2acb0a07555940e4c6e21154890611adeb6489f461d3e5ecd1af5a4d2b0adaf41747436eb414757a8fe4775674e3c6e5de4569d6fc6c788e10905eba32c270a393e6f721a765294e2ac99a9b6e534d3df08d1db97d602ac3195cb0b77f5bd4acaf737fadd6991f0688abc74918047574eac28289739a664e0e0e20574a2c25fde49d14539db1cedd4a9204a70acff0a62c8f25cd768ffab15c4db316840a4d1bc92e212670be07c5bdcf537590607dfbbbb4d9f98b89da0b4df7d88f3eca4814d16bfa20c8d2fa94f9f259f2ee2d3a83c9e4171b1a262c4b99 -SIG = cb017d6d2682c9854366259aa35f30d491cfaa930998c297dbddc6aded5b3d401cf76d80d8a2764de131718b6e0c481d7196bc72579716b0c0f6ff053e68c50c - -SEED = 37fc1beda4060b6c57883ddba0776c2bcf5ac28a651326021cca97723730fbb0 -PUB = 7bd7bf1c99dc82e06f08bb454d8fb288a57927e07ff1b12af15ee2c12fbb6b3d -MESSAGE = 3dfcac0265a024a83cb932674489a163aac314bf3d969f27596e451733b99deba5eeb779210baf95bf545a1ae6b8a915860693ee890f939320e06a844483d18c6a1bcd03c638bb7d1fe2a82eb448a311b1302ea6428f54a39f45a4d560be1557a2b254c45c137f45cc68356836e21bed0b7f73a518ce09db0be393927c339bf2a4b5987539404ce650284de12e3b553b262efe23848332ccfdc35e791a0ab43f139c71ed0fcb2d173bb377ee46b1a9dca9277e77df855f2830251e31e26acd86763c8d7eac22c882fc174f2b5e75ca6ad1ade03f942bb2a13bf541906159158c68363c7480c5b27a99320f8283a2699d4369c071c50dbd90b7792e4772efbc0b195bce84cc4dcfff7072a48968db69f9feddd0f9ced659eb5db7167f35f988cec114887dcbfdf27d02d300b3e1abec -SIG = a01dd65fada27039f168b123419d8abfbda48c572ece24fda06e1a5ec31e084f4ee1cbf9961e88ed51e189fcb7f5f235de1e5b28d08f2bfca190b0f019ecc207 - -SEED = 8d42f4ddd2bbd2b827b0a0d31d8f758ebd13a1b9b3712228948ca610bb8858e5 -PUB = b7354898794f9db0a8af6eeafcdbdf011d3fbef0212ad938a4a4ad27ab16ebbf -MESSAGE = e3a2bebc0496d8974a8f4061880369314ed9e440c1b77e26fe5071ce694ffd2136db0c4d5e880e6000083a75c90d3cf72b9cf5a2b1a9002c2701a2ff59b0699a8f42d79dd8a5fb71a8125453d91fb80080a3f0a16584282f17ec7dfdc2e5c69c4d9bdf484d55944dae273f211cfb76ad37da45871365439af35eea1fbecd4ca679b59b5e01bacf49c7f4e5efaa406ba1daeb085482af5ded89dc6885ffbe3d14d2931b83897e28ad06e5564e2789baea81bd932aa279fe8e324b9a8ef111c2abe2f137d4bb50d8ab76cebc0bd982a23919751ad4d49e88eb14173d3310289a872317e4a451e88d54320891870f15b2d53324430877a9fb5b49bb929f211c5b89764dd9c3a595a1451e9f85a238540002566e53a99ed1e6ddc9b4853f455edb4cf1980d56bbdc1313a36e76ea9cbb048a -SIG = 70764be39c6dca0f067abe1eca490fda951fd4e9499695266e270b9b05eae706ca8d1ca6a92d7c488ec6ad8ba11457a42a5e31702a9c2bce892dc40535c09f01 - -SEED = b62de5a1acfe4ca2d1f0c132afcbdae66fb29a02f297fbc2407fadbbf2454200 -PUB = b63b2d0bf355f7b6d0bac07403411c40afbbb2f707503b3fc2cee8a1c7d0a838 -MESSAGE = e659e51d7b193c4b8e2b3ed73a9d7557ed2bab6153883ab723592f730a914567142b3fa435db3219f83a542dc7a4bd805af666ea865b853146f8e3a9fe870711f90d12b0693492af2a1edf99a16458f781f1266ec437a5296a822ca9d69ce844b5c59097a2a56f3eb8fd273a636116db774300922d45b744657a692f5e8bfbcb06d2422818aeb51e7cda68acfbeda16e7c79580dcccde24e8e3d601b16e063b43a6d0d1407552f7504f5be19882e4ffe32344f5f473e73a8f6ed37b0d8d9e5e0a0dc9828395bcbd8f3a4e3124869249d058be0e045de0b1e12b1c83ba0aa227c95b82bf742c3eac0152b33e6d19be8b33a35bf705daab10622a90aed022ea6e439ed50a9308437929924ba3ab111ad0caa6feb0a6eb165824ebdb0866571efc07e5222ed8686b14d9270bf76b945d52014 -SIG = 5cdb00e98de73eab480be42f8a8a6163809a0d37101b6a5a4eed6a0c92030d09a5562c729080ce6f6594c8fafb1f594772db7a90a9e7da15896e82f70569390d - -SEED = 9732059d7bf0200f5f30412430336be4ef1e3cae62938ad08729ce3ba714cfd4 -PUB = 0de8425f5e30b2b8aebb8072009a30cf0411c3c8238f4e4208760c56c33e434f -MESSAGE = 1a13e7ab603b48eb896fe17173fb31950b0dcd5a35ffdbe1371c7a5bfba593317589d9652d88797729180b8d0e515abfe6548f160421e537d5c94aef2b34c7ebb097420003bc0f361b423e7e14630a803c118202540049f68c9cf46fae0368d162e400d77bb4523cf6c753b975c245bc99ed2f413a9d06c2da6ce0cc0987b6406b809e8eb319033d2de9131dee3b1b7b5c95d653ced8fccf998da1768511eca4d3c5f735adab96503b3551803e4922635095ef811be4c08a6cbac917cbe6cd91a4ae5a330ccec0e8e815371217a3de62f2d2d61466219833f33447132f4d43350c58cbaf422475edb128c56d80a495726b1fdbc56551eb72d0f4fec26ba8bff5eed6774b85039a5292834b5d1cc1b09ba0a3954d29323673f5e71276a12ac4c579355bf1ecca48e6a716b9fcecdc565c51b9 -SIG = fba1749b641dd4df34664bc43c00468c7d75e84afad72de473fd1e9c87da15ea604fc2549a1a867fa80850e9c2a59cd99053886760a8d9764b84dd672676720d - -SEED = 9c7f6f379e3857007e2ac6324cbbced57ac9eee4477813f83a81fc8cefa964d5 -PUB = a54ba396d687634d3eccf41c5782494f5f10a521a1e5d388523d80eeba5b0b2b -MESSAGE = 3f2d3072fe7383e541551ea9abdbaeae6a464ae6b9f0ba786a441b2d08da5bcada3c5424dc6931d6b39523e2de0a0c2e4e6b5b8cda925e5eac938416a2c51bf13d49531d7ec7114b1c82feaf90f3f87591e397d02702f8ec1b30d99f5be7d2203e4fe4db2ea47e7b4589d8ac506248d7347466edbc96ea32bf3a6ea7502dd60c9e84902715ab2c6ca68f5b00e1d909d83aa6ab662d8aea870ecd861fec69f2eec0ae677d2995b0ed688faa8ef78244e0d1195697b07122ceaa11f5a6ea58fbdfa2e2ec2df9d18693ae96d47127556e91f0864982c13419b04a63f208e730d26951882aefe001bca3408bd9862748c6cc876c28cac3bb2eb3395818c2091e0fbd7a0b4468c6b0d00cd008c11c3c3ad01080a1f5a40ae2e4b0c3a071efc8e1d1ba6ace6d4df0ff19829b0c680b3aeb759177ed34 -SIG = 65685f9ca5982e15a22ba3c83a0348348482dfae57cea178f0780c057baebe4af632f984540a26019a7fb34253c9ece7ff308ada233ce0686347ab5b21ce570b - -SEED = a478f35abb73727b6be6ee5e56eec323c9517882fd6919360ebbbf5d5cb8b83a -PUB = 7a6e266a54d135dda0009ccda8a94a4712ae5cb14761e8436e97c4b7814d8e8c -MESSAGE = 0173a34050b43748061ff8f5a3d7c43b6360847786e8bb75e536fb47b645b214f221ba24d83d28bc025024663e534f90f6e83a93d8bddeda2cd8808155652a908c437c2db6f3ed4912f57ca5b97928a73be964af59df4439854bb006fc295a87b7b72239c7fadfec40715509d98579daadfb8d524b4cec6620705efd4104c297144aea722974e12c5ecee5391ef2d93ac2b124e4ac496147c8b70363585d7078ccc53e2ae593350bc25548a0542526ab00afe477a0f4b27397c72bc74a8a8ab156e62b8bb47c3fbb4b34913e459687476bf33142c614702107ffe2cc01e25fa30275e1e2e63cea9168e4a47c02de097d4d853b27675c5bb330b94a974ead85e2bdee8ee17cbb5653346658df2f91f6bd739491dd71988b3a976a3e2e7a9d137410f4acba9feb5f11798c9a43b6adce14365a7c6d -SIG = 9d16fd40b9f8dd9b4a1a8c6d703b9fccbb940b1e0ae77a5970374af0cf726f4479fd30d7dff5cf53494d9a296ab6b9e46ea6c136b4db2c71c21b97c1c8254d0a - -SEED = ffe825148c0959b3a68de86ad8e8af7fa5e078f363dc124213c90020da0c9089 -PUB = 139152a0bd22962dd919ae3e0b1620e03c033c2ad0a3979ec6bcd1705e23d598 -MESSAGE = f125780d0cd088530f0c87b70bd42ebab56adb5ad4345f929ae5deae07fb55322153a8f023d38843bf5d6a93fe993eee71bc2ee563b25a50918f03efdb5dbf7269add69ded3e66953895620d9b6cf46ba2348f8d66d7f092235e378c1e3edfebeb78084bc8dea013f9933aae14a041948276d01f1cb5834b0e590e13d931d19292bb1d8041ff2fe2e1171a2e0b9a059821d0924dde7f3b1bb59813f5e3c63520aafb8801ba62c7097d4d8cf437a568a7f0087c6ea0fce6e568c4883f1cd12c749d06a6feb278f1086a8b04769921f78a9959062ab06f98ee80c2c7854ffa760f86a89ee1a51266053d195e61bb1dbd18dd89ff394e408ace0f641a395d56118ea72b7d8adf78b1655ecece7e8250e8a3a91cb8fca0d9ce0baf8980a387c5ed4318663280e5b4531f3187c47eaea7c329728ddd0e40 -SIG = fe4e89ee31786c0a3d3de3649bb93f0b8aef1caf5a832ec5e4067810705adddf539b8f4e05ad08cf3479e45b42c96528f6d59a4625703ddbf15b63093965d80d - -SEED = 49aff421a7cd12722aa84c48c1fb1c5f8d9e277d0a99ecbc9348c3aaa74be422 -PUB = 88d2c26266f493bc67578ca0b1f51160cf0fdb6a09a906db9faa686f11f8208d -MESSAGE = 70a1ac144b75fda75586a79c36fd39cce5f5cae2e6375852d3b62a9630336a293ea6d2ac6e5b57da21ef364a595bb0750f5bf4d2b320676423870e4b8e0869601f16680619048c4ede276da69f205a70176e25ea04bd089763e709ba343fc8831e52044eabf9441e6997f8ba1aeb9ef0f491170667a7f5fc9627cbd0551b76be27283a4b0c5f667846688226a115ee8020df08042b19b59fe551316a6cb6916860b9ecd74154b4051038a17352372ec14d3c957d2ef50ff786189a8aeb9c08f45eeb5eb8b040339974aa9798c425d7becb228c447a6d0b3cef271893e0f7076e223a7e87c6a3d270a033bc97a4565edce0aa91ffc3f7801775a6f29b230245bd71fa034353de372395d1bfcbdebba081330f7c076be99c2cf4867f15b78d52f46fc7391c9cb95e5d64643baffe72a8e3a650667fbb3e -SIG = 749181284df05dbe5974b91782a1a76ea08642cb0f0c98db586c575c210cdc8b651bd34b757ae38e4b6be9465235bd0eca430e26c3eede561c6e824dfa200e0a - -SEED = 703a6e2b62d0090c61d8659b6a963e03c9d62c1b38f7d70e5f9ff05590cd0360 -PUB = 370c21de6ef2fab534ada999869c90bc9b92ccbf249b79d39d95441d1ede210a -MESSAGE = d42a1756e84df4b4e9773f86f7674a2cd78e71e40aa8f644e6702dfbc2c2c5ca90fc242e9cb0099cc8f2c2d3136baafc0ff695482fdacdef9f565610b6e1900722f435c6385b35e9f6c436ca037e03f64e2233dffa58db3b91cc1daa0bb0c54c8a43e469d2cff7fa2bf8f5d1d877931089c82ed89aba42f2ee2b86e445cfd09f4cd78b35191bf467e784eef75dc987e046d37d4d4e8e9bbe14af80d03a1f40898384b9d3279fac9c57fd9c7eecbe19a5acc15033b84e07fd0e409bdbd5a57f65641183a6c0a8ec426d1f1d223166ff0a1900b2e92b7d85835d019d17775e5093ccd126f90f63cb7d15cbeb531324219cd64ded6714b21a65371af07210dfdf0e4e58ddc7d59f4cfa65c421d814ee2c9bf6dbf64873d579b09ee5dcedd733063e039ac9a5f9ca4c2525a4cc8e984da7185e2d64fad81c8a -SIG = e5fd64da028800c6ceed068a5e596f1621c70a8cb138b31b32647eb4b07bd2ecc5942c18844f367033f67398e314ba2c7ccf299c069787777025d845f2aad60e - -SEED = 76849c188e3edd0ff5f8fb874dc0456645518445e41a7d6833e616c3c48c9868 -PUB = d670e2ea07db60c22ab79a93ebf49d22a6245ee3af07b3be584eda694c37729e -MESSAGE = 1eccb0bc8eca3ab5bee68c5f8caa34536766c705f50827db7ac375d4fe30b58ffb7e2fe490cc71a8ff86c006d6174d05793ab8a55dd51b06de417bc0ac452cdc7cfb0bb00362b6765d20db23eb1848027064a1d9091d3b10ed776f28b76768bdfc08f0bc511f76faeba76cfc4cb5c83dc9ebe8a8d79edca923eccd524009cafedc90e3ad87d1392e1fccf4e60ccab95dc0ab54bf44245a007a96d46634b1b2965b829c3d7daa765972b54a7b365b6f34d77d7176acd8d894f6b417091b6c00edb7a4e81379988bfcecb692e9c3c4310a7e240e5c1063cde113f22a684a50a112ff47d3898812efb92637072b86163ad89316d221195acbfad0a03a1fbc2d967fe83f84c8459fccd490b9c5b3e55d27e9484e943c417f2128d73701da28f49fd3683f33a39cdee234bd305b9491e2f3eb621be3dd1dbbb31b -SIG = 7141399d51daa6eb4519bf3f01b233920fa908fefa612f0cd7d5af8a9a3c44190e3f6384a8d14d37c97030ef5018cf8aee8aeb1569a73d84862a59b7df72fe09 - -SEED = 83ae48ad70da0bb3cdf87481ee2c0c8571c2ca986712f8bc2329e9a3e33383c5 -PUB = b785309000df95f5a04f7d89c4113301057adaeeb29bcd28d99371b537bba2f6 -MESSAGE = b7521d3f71c679fa7037fe7488a641f6b97c49454acc8e36b903d8f9ebb54d89cb56efd19e04ba6a7c8f48a7d3ec9decd3f1cd0faf6e978118e6adce9c6c6be63c6a6a1ae21651828479a46bc9a0f7943040f940a0d470c8e577c5d575cb53c1bf3ab1feb050dcb6fef0ba4447f299fdb9f27ecb0714ecfefd74bad7b122a462c24a209848a03389074578c5bdc36396d809b0f14018da64917e6bf87ef405c8f3e333ff9c3baf6339667620794bb4743f0514b5de7d7fdd947a7e3501ee88efad159e33a1072fbb99c7c71e9d13a502d5a07c4f817eeb7f0c5319aa41a96d5ff4f15a73c29b571fe211090e172c8db518624612a5c371a9d7cef6de35ebef96e88e1a78af3bd5dd35251ab54d73718f3e70d2d59021531dc73184f0fc69c2e92965844ec27c1c02af5e9a3469de355db2256e0ec2a4eba30a -SIG = 43332351d3fb7b45fcf37c607d442ea80dbda2cb69c2884f424e65ea3a331ed8472d4368405cb736b2d6685ad782e239fe833ed789a2923185166f608342ee05 - -SEED = 39e56a65623a0aebade0da12ce1df378bc924073f73a549effaebc465d1a78e2 -PUB = 83da8ad50bad09eb3e94c725df3cc3a119736adc859ca1a10503f48ff2fec596 -MESSAGE = a96dc2ea3fa1351492a4619d9194681f8ec400a97158244482653838ccb7e156a82d564368f83a6ee1be46bc34b817200e8464c3d12b5ef2c50b19565b881c4c3d4563fb947eb47c3ee9c1ee7853269874455bfacba305f307d1ac5309eeae5c07fa5c4d428edbc8b9528c4415243a9ef580aff8fcfb12000a71fceee89de97f90279529bcc822ed3cb34c82ba5fec15f4945663636d67b5feceacc31d25f98aea07f7800d5a1034251cb91dd0963ec2c1a54773a4d96c18357f8d101de58e932f8c6cdde8e3cfcef5a7443fdba7b78320403c0196844724a612183e34bdd808ce7b958861ca37115730eaede1fd0baabe976efefd0365fdf926776c536f47ff80de5c18291bb7e9f1b913ffd1d94468b789752fae6ca897c0cca53ef1e731d00c8bdbe8929ea6b1dce1f31a20688d37b0f3a2b4153b306bdba1 -SIG = 398e8260011f57d8ac8c58d5457bc652c7414aaf6fb2f426b7899056605c0afc28392423b2b571f5e6c3c7f6d60245e53ebd03bdc5ad3c1ad8738cb32214d00f - -SEED = 4b9921852f409a323ae38175e8d76a211fc4d9c654178eea3baa7a767a6fda06 -PUB = 4c723e436b6bd97f44af52503b21cc50d5f6ad6cfc8288345dde8054e995582e -MESSAGE = 3f33d8fb83e68741090a37bedd745cf141aaaed8c92ffa742a52561777885805ace14246ab98a8cb598c9ce3de9b29bae5fa04b1cf828de11aff80a7ef8a3a38aede4f3c3563a25d049badcad5ed7e47fdbba6e111307eebe9ef4906bc989728b76e84afe808e6653b271e21104aa665f1898dd2aab23090e22b4e344a2616fbd8ee4ad8ed8108395eba817fbd14fec5c17dcf56b8220856b2b833e091407d5089b35ddf34b86ff7dc9fde52b21ef12176ef3370b7f3a0a8cb1b058a51aefff3d279d80f51a68bfb592587b45c5c63a7e4d625b887de486a118316c3b6a238575f92ac5b1c94c3f5dbbd96686000d6d39cccd558d420e4d447a8cbc4bc7b8c6a03af0f0034fb3518d93800f0f713e4b13732e16ada51801d7e559cf839d1058f64955698311399345416850dddcc5601a684fd09e6afd3944f5e19 -SIG = cbf1f1642df950eb71fd09590d34c265922c58bd8026bba3fc0e594a6bb1f2b90da3dc1d5f6b6d5b405a896d1dbb71b8685c4dfc444acaffe65ab8331789f507 - -SEED = 1bff652a2c8309a393ac11da3aa97fb078bb284ed5e1b8ccc983652ef8556cd0 -PUB = aaabdc091fc3682354201744e9b73fd2a6cfb281914bf2c70ec3dc1dec7216b0 -MESSAGE = 48d02698a97bdcb3ef078dcfcf5750005f1702d300e7e89bc436e381113401f852b8b4acff60ffbd4ab46d202168d98b8735e79cb350e35b070ff6bdcafd954b551969b6b1a70c9131ebd40d96140291d8d2b091540a8b18d8e5465915c25dbc6b5c9a687942533c372c8b4e95a953677169b950edd3464375cd43132ff9bd541ee22bd418ce23195f65d8b289f633ec8d71e1a801b06c3c827f627e723d2199100ce73e8e4a4440e778317a474910793b47b10ffb55db7f281c7d7a033bd80048b82673b87cf95e99422ba628688f3c971890ca15d12f572fa1977a17307069da304ead3026eb01042668890d17008cd1e92c46cbe9c857e7193de3aba3911e4f86fe0a1698ab7cdb9251a8424b2848b96ad81ea239d365fdea92ea5c0473d0a6bb1e371356bdfad2d0350336d3e1947c936fd0c25195445011731b -SIG = 93c9c33493fc64172d51e16a0a1cd729a0d99e3cb864e89a42987f39dd8cd26545fdfe37581911e803677da4c55b0a683ddf62b728f8f30685ae58f628ebe609 - -SEED = 002fdd1f7641793ab064bb7aa848f762e7ec6e332ffc26eeacda141ae33b1783 -PUB = 77d1d8ebacd13f4e2f8a40e28c4a63bc9ce3bfb69716334bcb28a33eb134086c -MESSAGE = 5ac1dfc324f43e6cb79a87ab0470fa857b51fb944982e19074ca44b1e40082c1d07b92efa7ea55ad42b7c027e0b9e33756d95a2c1796a7c2066811dc41858377d4b835c1688d638884cd2ad8970b74c1a54aadd27064163928a77988b24403aa85af82ceab6b728e554761af7175aeb99215b7421e4474c04d213e01ff03e3529b11077cdf28964b8c49c5649e3a46fa0a09dcd59dcad58b9b922a83210acd5e65065531400234f5e40cddcf9804968e3e9ac6f5c44af65001e158067fc3a660502d13fa8874fa93332138d9606bc41b4cee7edc39d753dae12a873941bb357f7e92a4498847d6605456cb8c0b425a47d7d3ca37e54e903a41e6450a35ebe5237c6f0c1bbbc1fd71fb7cd893d189850295c199b7d88af26bc8548975fda1099ffefee42a52f3428ddff35e0173d3339562507ac5d2c45bbd2c19cfe89b -SIG = 0df3aa0d0999ad3dc580378f52d152700d5b3b057f56a66f92112e441e1cb9123c66f18712c87efe22d2573777296241216904d7cdd7d5ea433928bd2872fa0c - -SEED = 25b0f0bb3dcb422a6f3c6c220eaadb11dbfe489c2d455b276cefe8cba057f9f3 -PUB = fe03c9c4394adc74b13f47654bead8bc855958b4194fdab2097ac1b157933c05 -MESSAGE = 54d99f969efa8870fc20fa9a962bb372619c324439728af3139c2a07e8c1b29c1e4eedc2d40ba722f63ce37670362af6f5202add668c4fb4d62fa8bacbc7d07ff3bd38c15a01064259cc34134861632967460541a99b8d5182bf59347b5a59879aa3b091a1f3e04135bd6301be5226d4895e5e9c2b15e48e5ecdf44129e6122853a606fc118466fa720b5ab165635c3bde04d74289274fa03547accbde780e1fa0bf2c56f8436a53e73878a424a29aa9de385dba419ae6a5d12e004276152b58d325b302400a55333c38cde4908ae1d0121cbeca950809c543314277c1485e68d9f9c0a962d1b1e0dda1d4a52b56f8308a80b92acc9f4ebc3ed45d91a129da8675621af676703def3b84113183b2e3a8c56157f243f13980f3d1756fea7668c91503d35c839a2120c79ec954fb546d7b542f987289534ffdef62d47fd5ec -SIG = da50d5242bf51c3951780cafd926d67bdf5640d5d3bb08433831d56e48e2592a1c375968bb4d2fbea56145abf2d82991363b1565fa1effe214011a686e39950e - -SEED = bf5ba5d6a49dd5ef7b4d5d7d3e4ecc505c01f6ccee4c54b5ef7b40af6a454140 -PUB = 1be034f813017b900d8990af45fad5b5214b573bd303ef7a75ef4b8c5c5b9842 -MESSAGE = 16152c2e037b1c0d3219ced8e0674aee6b57834b55106c5344625322da638ecea2fc9a424a05ee9512d48fcf75dd8bd4691b3c10c28ec98ee1afa5b863d1c36795ed18105db3a9aabd9d2b4c1747adbaf1a56ffcc0c533c1c0faef331cdb79d961fa39f880a1b8b1164741822efb15a7259a465bef212855751fab66a897bfa211abe0ea2f2e1cd8a11d80e142cde1263eec267a3138ae1fcf4099db0ab53d64f336f4bcd7a363f6db112c0a2453051a0006f813aaf4ae948a2090619374fa58052409c28ef76225687df3cb2d1b0bfb43b09f47f1232f790e6d8dea759e57942099f4c4bd3390f28afc2098244961465c643fc8b29766af2bcbc5440b86e83608cfc937be98bb4827fd5e6b689adc2e26513db531076a6564396255a09975b7034dac06461b255642e3a7ed75fa9fc265011f5f6250382a84ac268d63ba64 -SIG = 279cace6fdaf3945e3837df474b28646143747632bede93e7a66f5ca291d2c24978512ca0cb8827c8c322685bd605503a5ec94dbae61bbdcae1e49650602bc07 - -SEED = 65de297b70cbe80980500af0561a24db50001000125f4490366d8300d3128592 -PUB = ba8e2ad929bdcea538741042b57f2067d3153707a453770db9f3c4ca75504d24 -MESSAGE = 131d8f4c2c94b153565b86592e770c987a443461b39aa2408b29e213ab057affc598b583739d6603a83fef0afc514721db0e76f9bd1b72b98c565cc8881af5747c0ba6f58c53dd2377da6c0d3aa805620cc4e75d52aabcba1f9b2849e08bd1b6b92e6f06615b814519606a02dc65a8609f5b29e9c2af5a894f7116ef28cfd1e7b76b64061732f7a5a3f8aa4c2e569e627a3f9749aa597be49d6b94436c352dd5fa7b83c92d2610faa32095ca302152d91a3c9776750e758ee8e9e402c6f5385eaa5df23850e54beb1be437a416c7115ed6aa6de13b55482532787e0bee34b83f3084406765635497c931b62a0518f1fbc2b891dc7262c7c6b67eda594fa530d74c9329bad5be94c287fbcde53aa80272b83322613d9368e5904076fdbcc88b2c0e59c10b02c448e00d1b3e7a9c9640feffb9523a8a60e1d83f04a4b8df69153b -SIG = 7a9b736b01cc92a3349f1a3c32dbd91959825394ff443c567405e899c8185ce8fad9500e1fce89d95a6253c00477435acf04bff993de1b00495def0834ee1f07 - -SEED = 0826e7333324e7ec8c764292f6015d4670e9b8d7c4a89e8d909e8ef435d18d15 -PUB = ffb2348ca8a018058be71d1512f376f91e8b0d552581254e107602217395e662 -MESSAGE = 7f9e3e2f03c9df3d21b990f5a4af8295734afe783accc34fb1e9b8e95a0fd837af7e05c13cda0de8fadac9205265a0792b52563bdc2fee766348befcc56b88bbb95f154414fb186ec436aa62ea6fcabb11c017a9d2d15f67e595980e04c9313bc94fbc8c1134c2f40332bc7e311ac1ce11b505f8572ada7fbe196fba822d9a914492fa7185e9f3bea4687200a524c673a1cdf87eb3a140dcdb6a8875613488a2b00adf7175341c1c257635fa1a53a3e21d60c228399eea0991f112c60f653d7148e2c5ceb98f940831f070db1084d79156cc82c46bc9b8e884f3fa81be2da4cdda46bcaa24cc461f76ee647bb0f0f8c15ac5daa795b945e6f85bb310362e48d8095c782c61c52b481b4b002ad06ea74b8d306eff71abf21db710a8913cbe48332be0a0b3f31e0c7a6eba85ce33f357c7aeccd30bfb1a6574408b66fe404d31c3c5 -SIG = 4bac7fabec8724d81ab09ae130874d70b5213492104372f601ae5abb10532799373c4dad215876441f474e2c006be37c3c8f5f6f017d0870414fd276a8f42808 - -SEED = 00ad6227977b5f38ccda994d928bba9086d2daeb013f8690db986648b90c1d45 -PUB = 91a4ea005752b92cbebf99a8a5cbecd240ae3f016c44ad141b2e57ddc773dc8e -MESSAGE = cb5bc5b98b2efce43543e91df041e0dbb53ed8f67bf0f197c52b2211e7a45e2e1ec818c1a80e10abf6a43535f5b79d974d8ae28a2295c0a6521763b607d5103c6aef3b2786bd5afd7563695660684337bc3090739fb1cd53a9d644139b6d4caec75bda7f2521fbfe676ab45b98cb317aa7ca79fc54a3d7c578466a6aa64e434e923465a7f211aa0c61681bb8486e90206a25250d3fdae6fb03299721e99e2a914910d91760089b5d281e131e6c836bc2de08f7e02c48d323c647e9536c00ec1039201c0362618c7d47aa8e7b9715ffc439987ae1d31154a6198c5aa11c128f4082f556c99baf103ecadc3b2f3b2ec5b469623bc03a53caf3814b16300aedbda538d676d1f607102639db2a62c446707ce6469bd873a0468225be88b0aef5d4020459b94b32fe2b0133e92e7ba54dd2a5397ed85f966ab39ed0730cca8e7dacb8a336 -SIG = dc501db79fd782bc88cae792557d5d273f9ba560c7d90037fe84ac879d684f612a77452c4443e95c07b8be192c35769b17bbdfca42280de796d92119d833670d - -SEED = 1521c6dbd6f724de73eaf7b56264f01035c04e01c1f3eb3cbe83efd26c439ada -PUB = 2f61a26ffb68ba4f6e141529dc2617e8531c7151404808093b4fa7fedaea255d -MESSAGE = 3e3c7c490788e4b1d42f5cbcae3a9930bf617ebdff447f7be2ac2ba7cd5bcfc015760963e6fe5b956fb7cdb35bd5a17f5429ca664f437f08753a741c2bc8692b71a9115c582a25b2f74d329854d60b7817c079b3523aaff8793c2f72fff8cd10592c54e738df1d6452fb72da131c6731ea5c953c62ea177ac1f4735e5154477387109afae15f3ed6eeb08606e28c81d4386f03b9376924b6ef8d221ee29547f82a7ede48e1dc17723e3d42171eeaf96ac84bedc2a01dd86f4d085734fd69f91b5263e439083ff0318536adff4147308e3aafd1b58bb74f6fb0214a46fdcd3524f18df5a719ce57319e791b4ea606b499bfa57a60e707f94e18f1fed22f91bc79e6364a843f9cbf93825c465e9cae9072bc9d3ec4471f21ab2f7e99a633f587aac3db78ae9666a89a18008dd61d60218554411a65740ffd1ae3adc06595e3b7876407b6 -SIG = a817ed23ec398a128601c1832dc6af7643bf3a5f517bcc579450fdb4759028f4966164125f6ebd0d6bf86ff298a39c766d0c21fdb0cbfdf81cd0eb1f03cd8a08 - -SEED = 17e5f0a8f34751babc5c723ecf339306992f39ea065ac140fcbc397d2dd32c4b -PUB = 4f1e23cc0f2f69c88ef9162ab5f8c59fb3b8ab2096b77e782c63c07c8c4f2b60 -MESSAGE = c0fad790024019bd6fc08a7a92f5f2ac35cf6432e2eaa53d482f6e1204935336cb3ae65a63c24d0ec6539a10ee18760f2f520537774cdec6e96b55536011daa8f8bcb9cdaf6df5b34648448ac7d7cb7c6bd80d67fbf330f8765297766046a925ab52411d1604c3ed6a85173040125658a32cf4c854ef2813df2be6f3830e5eee5a6163a83ca8849f612991a31e9f88028e50bf8535e11755fad029d94cf25959f6695d09c1ba4315d40f7cf51b3f8166d02faba7511ecd8b1dded5f10cd6843455cff707ed225396c61d0820d20ada70d0c3619ff679422061c9f7c76e97d5a37af61fd62212d2dafc647ebbb979e61d9070ec03609a07f5fc57d119ae64b7a6ef92a5afae660a30ed48d702cc3128c633b4f19060a0578101729ee979f790f45bdbb5fe1a8a62f01a61a31d61af07030450fa0417323e9407bc76e73130e7c69d62e6a7 -SIG = efe2cb63fe7b4fc98946dc82fb6998e741ed9ce6b9c1a93bb45bc0a7d8396d7405282b43fe363ba5b23589f8e1fae130e157ce888cd72d053d0cc19d257a4300 - -SEED = 0cd7aa7d605e44d5ffb97966b2cb93c189e4c5a85db87fad7ab8d62463c59b59 -PUB = 4889855fe4116b4913927f47f2273bf559c3b394a983631a25ae597033185e46 -MESSAGE = 28a55dda6cd0844b6577c9d6da073a4dc35cbc98ac158ab54cf88fd20cc87e83c4bba2d74d82ce0f4854ec4db513de400465aaa5eee790bc84f16337072d3a91cde40d6e0df1ba0cc0645f5d5cbbb642381d7b9e211d25267a8acf77d1edb69c3a630f5b133d24f046a81bf22ff03b31d8447e12c3f7b77114a70cbd20bbd08b0b3827a6bbcf90409e344447a7fbc59bdd97d729071f8d71dcc33e6ef2cbab1d411edf13734db1dd9703276f5eb2d6aa2cb8952dd6712bfae809ce08c3aa502b8135713fac0a9c25b1d45b6a5831e02421bba65b81a596efa24b0576bd1dc7fdfb49be762875e81bd540722bc06140b9aa2ef7b84a801e41ded68d4546ac4873d9e7ced649b64fadaf0b5c4b6eb8d036315233f4326ca01e03393050cd027c24f67303fb846bd2c6b3dba06bed0d59a36289d24bd648f7db0b3a81346612593e3ddd18c557 -SIG = bf9115fd3d02706e398d4bf3b02a82674ff3041508fd39d29f867e501634b9261f516a794f98738d7c7013a3f2f858ffdd08047fb6bf3dddfb4b4f4cbeef3003 - -SEED = 33371d9e892f9875052ac8e325ba505e7477c1ace24ba7822643d43d0acef3de -PUB = 35929bded27c249c87d8b8d82f59260a575327b546c3a167c69f5992d5b8e006 -MESSAGE = 27a32efba28204be59b7ff5fe488ca158a91d5986091ecc4458b49e090dd37cbfede7c0f46186fabcbdff78d2844155808efffd873ed9c9261526e04e4f7050b8d7bd267a0fe3d5a449378d54a4febbd2f26824338e2aaaf35a32ff0f62504bda5c2e44abc63159f336cf25e6bb40ddb7d8825dff18fd51fc01951eaedcd33707007e1203ca58b4f7d242f8166a907e099932c001bfb1ec9a61e0ef2da4e8446af208201315d69681710d425d2400c387d7b9df321a4aec602b9c656c3e2310bff8756d18b802134b15604f4edc111149a9879e31241dd34f702f4c349617b13529769a772f5e52a89c098e0dca5920667893a250061b17991626eb9319298685be46b6a8b68422444fa5a36bcf3a687e2eccb9322c87dc80165da898930850b98fc863cada1aa99c6d61c451b9ccf4874c7f0e75b0a0c602f044812c71765adaf02025395b0 -SIG = 985ca446ddc007827cc8f2852cbd8115ef8c5975e9d7ce96d74dfed859aa14a4c15254006bea5e08359efe2625d715e0897ee5a16f151203be5010418637de05 - -SEED = beedb8073df58f8c1bffbdbd77ec7decb2c82a9babecefc0331507bdc2c2a7e7 -PUB = b27e908b805e296fc30d2e474b060cd50c0f6f520b3671712183bd89d4e733e9 -MESSAGE = 35ca57f0f915e5209d54ea4b871ffb585354df1b4a4a1796fbe4d6227d3e1aba5171ed0391a79e83e24d82fdafd15c17b28bf6c94d618c74d65264e58faaacd2902872fdd0efa22e8d2d7ce8e3b8197f0c3615b0a385235fa9fd8e4564ee6e6b1650b4cfb94d872c805c32d4f3a18f966461d3adbb605fa525884f8eb197627396ba4d995d78ac02948a0eaabb58519b9a8e2e7985cd1de2c71d8918d96a0168660ce17cddf364e3ec0d4bd90f2104751a1927ee1d23f3e7a69840ed040b00e5f6e4866ec58813149cc382aebf6162608c79574d553f47230e924a0ef1ebf55d8e1a52abb62a2d7ac86027c7c03cc83fa1949da29e2f3037ab986fd2fffe650e3149babae5a50b1ee9696f3babec72e29697c82422814d272085500fd837fe3c7a973ef4c169af12dd7f02700620bb045bdbf84623f326350570b3cadbc9aea4200b28287e17ab -SIG = 8c890cccadc7760e1e82e43c44b3dc0b685a48b479ae13cc0a6b0557d0fb1cbabba63d2a96843412ea8d36c50acbf52b92cfb2dce49dc48af6ddcf8ee47a8608 - -SEED = 9184ef618816832592bc8eb35f4ffd4ff98dfbf7776c90f2aad212ce7e03351e -PUB = 687b7726010d9bde2c90e573cd2a2a702ff28c4a2af70afc7315c94d575601e5 -MESSAGE = 729eb7e54a9d00c58617af18c345b8dc6e5b4e0f57de2f3c02e54a2ec8f1425ec2e240775b5ab0c10f84ac8bafda4584f7e21c655faecd8030a98906bd68398f26b5d58d92b6cf045e9bd9743c74c9a342ec61ce57f37b981eac4d8bf034608866e985bb68686a68b4a2af88b992a2a6d2dc8ce88bfb0a36cf28bbab7024abfa2bea53313b66c906f4f7cf66970f540095bd0104aa4924dd82e15413c22679f847e48cd0c7ec1f677e005fec0177fbd5c559fc39add613991fbaeae4d24d39d309ef74647f8192cc4c62d0642028c76a1b951f6bc9639deb91ecc08be6043f2109705a42c7eae712649d91d96ccbbfb63d8d0dd6dd112160f61361ecdc6793929ca9aef9ab56944a6fa4a7df1e279eaf58ce8323a9cf62c94279fff7440fbc936baa61489c999330badcb9fc0e184bc5093f330cbb242f71fb378738fea10511dd438364d7f76bcc -SIG = b3c24e75132c563475422d5ea412b5c1e8e6e5ea1c08ead1393c412da134c9a1638284ea7e2ca032fe3d3e32a9066a8c8839903f6ef46e966bb5e492d8c2aa00 - -SEED = 354e13152ee1fe748a1252204c6527bdc1b1eb2eb53678150e6359924708d812 -PUB = d45ff6c5fb83e7bb9669aa8960deb7dbc665c988439b6c9ef672c6811dc8bcf6 -MESSAGE = 8e5fccf66b1ba6169cb685733d9d0e0190361c90bcab95c163285a97fe356d2bdcde3c9380268805a384d063da09ccd9969cc3ff7431e60a8e9f869cd62faa0e356151b280bc526e577c2c538c9a724dc48bf88b70321d7e1eeedb3c4af706748c942e67bdabdb41bec2977b1523069e31e29b76300288f88a51b384b80cc2526f1679340ddec3881f5cd28b0378d9cd0a812b68dd3f68f7a23e1b54bee7466ac765cf38df04d67441dfa498c4bffc52045fa6d2dbcdbfa33dfaa77644ffccef0decdb6790c70a0d734ec287cc338cb5a909c0055189301169c4f7702c05c0911a27b16ef9ed934fa6a0ca7b13e413523422535647968030edc40cd73e7d6b345b7581f438316d68e3cd292b846d3f4f7c4862bc7e6b3fb89a27f6f60cd7db2e34ec9aae1013fe37acff8ad888cb9a593ef5e621eae5186c58b31dcfde22870e336d33f440f6b8d49a -SIG = de2b46e65f3decef34332e500f2e11306fbdcf1be85a1c1ee68ba3045dcec2c7be608d22927da1f44c0e2083ae622cf3c29d893887994efcfa2ca594f5051f03 - -SEED = 7ff62d4b3c4d99d342d4bb401d726b21e99f4ef592149fc311b68761f5567ff6 -PUB = 7fdfdb9eca29d3f01d9486d7e112ce03aa37b91326a4283b9c03999c5eda099a -MESSAGE = 99c44c796572a4823fc6c3807730839173774c05dbfc1492ed0d00509a95a1de37274b3135ed0456a1718e576597dc13f2a2ab37a45c06cbb4a2d22afad4d5f3d90ab3d8da4dcdaa06d44f2219088401c5dceee26055c4782f78d7d63a380608e1bef89eeef338c2f0897da106fafce2fb2ebc5db669c7c172c9cfe77d3109d239fe5d005c8ee751511b5a88317c729b0d8b70b52f6bd3cda2fe865c77f36e4f1b635f336e036bd718bec90ee78a802811510c4058c1ba364017253aa842922e1dd7d7a0f0fc9c69e43fc4eaeffaaf1ae5fa5d2d73b43079617baba030923fe5b13d2c1c4fe6fac3f2db74e2020a734b6121a0302fce820ba0580ce6135348fdf0632e0008df03ee112168f5cfa0037a26a1f69b1f1317edf2a3ab367455a77e00691215d7aa3133c2159d3da2b134cf04f0defbf07a6064011e64dd14d4f8f064356655428804c2771a -SIG = 058f79927fbf6178724815c7b11c63baaa90bcc15d7272be082f8a9141861c816433055f6cf6491424853f9ec78bb91ace913a93411b4e5ed58bc4ba5715c60a - -SEED = 6cabadd03f8a2e6ebab96a74f80e18164e4d1b6baa678f5a82e25604af989aaf -PUB = 2a4a3179564194e00100c18bc35351d8b135bbae5b32b28fce1d7b6766ca4b32 -MESSAGE = 279f78cf3b9ccfc6e1b01e1a82f50ed172e9a8e1e702bb15661dd7dc3a456ff7a7a7fdfb081db3867079630c7f70fd753292ec60ecbf50632e9aa45b996505c66e6dc3c6ae892e21b6a8705e4bbae8f16a3378554b31fdb0139dcd15c96a8a7e4b88756a86d18db5dc74fd7691197dd88e2c7d5df52b049344cdc477c9cd7e89eda99ccfb1d00814d0152b9654df3279372ca5f18b1c946f2894a76b079ddb1c3cd61fbb969aeec9193a6b88fb7d136c07f9821e5c1074b4e93bcaf6fa14d0d1d7e1707589d77ec1337206e53a1f06cc26672ff95c13d5ff444766931ba30a0afdcdadd2098e9c41fd87a3f23cd16dbb0efbf8092ce33e327f42610990e1cee6cb8e54951aa081e69765ae4009aeed758e768de50c23d9a22b4a06dc4d19fc8cbd0cdef4c983461755d0a3b5d6a9c12253e09568339ff7e5f78c5fdf7ec89f9186a621a8c0eed11b67022e -SIG = 4e65c6c1d493045e8a9250e397c1d1d30ffed24db66a8961aa458f8f0fcb760c39fe8657d7ab8f84000b96d519717cff71f926522c1efec7f8b2624eae55f60c - -SEED = 0fa0c32c3ae34be51b92f91945405981a8e202488558a8e220c288c7d6a5532d -PUB = d6aee62bd91fc9453635ffcc02b2f38dcab13285140380580ccdff0865df0492 -MESSAGE = 53f44be0e5997ff07264cb64ba1359e2801def8755e64a2362bddaf597e672d021d34fface6d97e0f2b1f6ae625fd33d3c4f6e9ff7d0c73f1da8defb23f324975e921bb2473258177a16612567edf7d5760f3f3e3a6d26aaabc5fde4e2043f73fa70f128020933b1ba3b6bd69498e9503ea670f1ed880d3651f2e4c59e79cabc86e9b703394294112d5d8e213c317423b525a6df70106a9d658a262028b5f45100cb77d1150d8fe461eed434f241015f3276ad7b09a291b4a7f35e3c30051cbf13b1d4a7fa0c81a50f939e7c49673afdc87883c9e3e61f5a1df03755470fda74bf23ea88676b258a97a280d5f90b52b714b596035bae08c8d0fe6d94f8949559b1f27d7116cf59dd3cfbf18202a09c13f5c4fbc8d97225492887d32870c2297e34debd9876d6d01ac27a16b088b079079f2b20feb02537cda314c43cb2dca371b9df37ed11ec97e1a7a6993a -SIG = 7e9ab85ee94fe4b35dcb545329a0ef25923de5c9dc23e7df1a7e77ab0dcfb89e03f4e785ca6429cb2b0df50da6230f733f00f33a45c4e576cd40bdb84f1ae001 - -SEED = 7b06f88026fa86f39fce2426f67cc5996bedd0cfc4b5ebb1b5e3edbb47e080aa -PUB = 3f1469ee6a2e7867e2e9012d402cf5a4861497c01df879a1deb1c539830b58de -MESSAGE = 71175d4e21721297d9176d817f4e785d9600d923f987fe0b26fd79d33a5ea5d1e818b71f0f92b8c73afddabdcc27f6d16e26aafa874cfd77a00e06c36b041487582bb933760f88b419127345776ea418f83522254fed33819bc5c95f8f8404cc144ebf1486c88515409d3433aaf519d9920f5256e629419e9a95580a35b069b8d25533dfcbc98ad36404a951808e01378c03266326d120046975fde07daef3266caacd821c1403499d7fdf17c033c8d8c3f28f162b5f09dfdaca06285f00c6cb986dfdf5151aa6639608b5b13e78d65a4368585b16138754fbd113835a686cd066c2b89bb0953c24d50e77bf0fc457c1e0fcf5d44da8db9a88f062be3b688d5cdcff1d1c00e81ec9d413882295b341fee8fa427dc109adeb5f284eec202f1bef115bf96b1782d3ccdeb682b69bf92d170c007d5df80e1ed962f677dc24a145a1e4e829e8dec0104e5f78365944 -SIG = 42f133e34e3eb7032a133ed781537ec62e44a5ce8381e5e0bf9e13a914a4b2c757811d6d3b1e86672424ea4230d10f7c610abb7069e61e319b4066a2bd7bc900 - -SEED = c3f5e149968a24f4de9119531975f443015ccca305d7119ed4749e8bf6d94fc7 -PUB = 39aaccdb948a4038538a4588322f806bb129b5876c4bec51271afe4f49690045 -MESSAGE = c46370e37f2e0cadcf93402f1f0cb048f52881ba750b7a43f56ab11ce348732fb57e7f9aaf8dfcbe455e14e983c248d026a27e7f148d5db5a53f94635702b895127771047a876d14107386c5e0ff8933345bbd7a936d990d33efa28c2ec4e4864ffd2ff576f7c88f954cfc1c459e883bb712dae3cdf6632066f1f4d13a509615b3360cadc5a307f23e52a51b40a6feebe0b18d0e9ee4e348f33cd81a8def222f6a59b12861d335bd9af85cc004be46f1d3a424f4870ae9dc587e5a4ade136b9370649348c33ac3bf1febeebffea37085ed59cac9d9e696470b234609e9a10a9d431ff91e69cb5135fd117ff58a36539744ebe70cea6973c00c7a4d57b62f4a7136d731b8e46ff18ec0ed69070031905075d8541d568cfce6eeb76242b7819a7b6a93552111bb88f165527cfa6966d39fcbe0a7dea008e39c7a3e577ab307cd1d0ea326833d52654e172955f3fcd4 -SIG = 5fa2b531677b00b85b0a313cbd479f55f4ab3ec5cfce5e454d2b74176ccc3399c899f9d6b51ed4c1e76185ac9fe730c4b4014044f7041185bc3c85722eb2ea02 - -SEED = 42305c9302f45ea6f87e26e2208fd94b3c4ad037b1b6c83cf6677aa1096a013c -PUB = 3b97b1f11ce45ba46ffbb25b76bfc5ad7b77f90cc69ed76115dea4029469d587 -MESSAGE = d110828d449198d675e74e8e39439fd15e75bf2cc1f430abfb245836885bafc420f754b89d2fbbf6dd3490792e7a4f766073cfe3b302d089831ace869e2730fde45c2121ec3ef217aa9c43fa7cc7e9ed0a01ad9f1d2fc3613638ca9fc193c98b37455bf5dbf8f38b64708dfdca6c21f0975f1017c5da5f6434bda9f033cec2a631ab50318e017b170b240bf01eb8b36c7e1cb59e7736ac34444208132a8f59e4f313d65d849c6a4fdf13e20ecaee3823e589a171b39b2489497b06e6ff58c2c9f1dc5d3aa3bd10e6443e22d42d07b783f79fd43a46e1cde314b663a95f7246dea131fcd46d1dc333c5454f86b2c4e2e424dea405cc2230d4dcd39a2eab2f92845cf6a7994192063f1202749ef52dcb96f2b79ed6a98118ca0b99ba2285490860eb4c61ab78b9ddc6acc7ad883fa5e96f9d029171223abf7573e36230e0a81f6c1311151473ee264f4b842e923dcb3b -SIG = 18d05e5d01668e83f40fa3bbee28b388acf318d1b0b5ad668c672f345c8eda14c2f884cd2a9039459ce0810bc5b580fe70d3964a43edb49e73a6ff914bbf040c - -SEED = c57a43dcd7bab8516009546918d71ad459b7345efdca8d4f19929875c839d722 -PUB = 2083b444236b9ab31d4e00c89d55c6260fee71ac1a47c4b5ba227404d382b82d -MESSAGE = a4f6d9c281cf81a28a0b9e77499aa24bde96cc1264374491c008294ee0af6f6e4bbb686396f59068d358e30fe9992db0c6f16680a1c71e27a4a907ac607d39bdc3258c7956482fb37996f4beb3e5051b8148019a1c256e2ee999ebc8ce64c54e07fedb4fbd8953ebd93b7d69ce5a0082edd6209d12d3619b4fd2eae916461f72a4ce727157251a19209bbff9fbdbd289436f3fcacc6b4e1318521a47839cba4b14f7d7a21e7b5d6b6a753d5804afcd2b1eb7779b92abab8afa8aa4fa51caec0b85dcd0fc2a0676036d3f56630a831ffeb502861dd89161c708a9c006c73c930ce5b94756426ff18aa112fb4eb9a68500b48d4eedbd4167b6ffd0a11d49443a173ce9d949436748fc0634f06bb08b8f3423f4463dba7b4d199b64df578117f0a2645f0b2a1e2ada27d286f76733f25b82ed1d48a5c3898d4ad621e50ed9060daad40a39532e4d1bf162ce36804d5d4e2d -SIG = 1edef9bc036971f1fa88edf45393c802e6c1a1631c8a06871a09a320821dce40beca97e53a0361a955a4c6d60b8ca8e400c81340911ccb4f56284041cdbb1804 - -SEED = 2dddb6b8fd04fa90ece1a709f8418f2e5d0c9c43afe7cfce19e6ad15a73476f7 -PUB = 8059de6a7c4776489ecc2e7d707ffce30285bf30a23f78d72db49cfd6ed0d492 -MESSAGE = 474baa590a4cd72d5424e51d8257b3d44325bc4c5063a0033c86ebbe99ed7212184c19944d082a115379dd4cece973faa0bca6485bd25f3744a719e70aa0291e1b5a96e637c140616a98263357c76b6eb0083fe51414e386870d0fdc7dd9abe4ff6fb5bbf1e7b15dac3e08e2615f655c3104ceb32a4cc2c9e9c43cf282d346ac253ccc46b635ae040973b49735720ffb890469a567c5824e0c00d7ccd5509a718092a906461c4d6163eaf422418f5fc6e009fc3f529ac61a2f89bb8e0ed45d940c4c2331ff8d8e1d6d58d417d8fc2656a02e8701aee75aed918724eebe4a2cf4744c5c401e217023df68a6f6a0228bd05a679a697d8de7036b9ed269090d3c65486afb91e27954eb15b964665ede7ad008f12fb3a9d0e69c13b4254f43819e0818a4195f68b8a38ae81f3fcb1879c95ab4cd0ffc38e381089260cca967ace5a085b457ab5eb363852101377570f9ac9e38 -SIG = c634ea7bf72e895a2e796e2834201415b8b45e05e045559284eb9052c0e84f62a5a9f0c9764f7576788c7228b19ef517c195497325a48a9344b147c12fd75509 - -SEED = 5547f1004baedfce5cfc0850b05302374aad24f6163994ecd751df3af3c10620 -PUB = 7ce620787385ee1951ac49a77352ee0d6f8c5cd47df74e9e3216a6324fc7cf7f -MESSAGE = a6c17eeb5b8066c2cd9a89667317a945a0c7c96996e77ae854c509c6cd0631e922ad04503af87a3c4628adafed7600d071c078a22e7f64bda08a362b38b26ca15006d38acf532d0dedea4177a2d33f06956d80e963848ec791b2762fa99449b4f1a1ed9b3f2580be3ac7d7f52fb14421d6222ba76f807750c6cbb0b16f0895fc73d9dfc587e1a9e5d1e58375fbab705b8f0c1fd7df8b3ad446f2f08459e7ed1af59556fbc966dc249c1cf604f3e677c8a09d4363608774bf3811bef0642748c55c516c7a580fa3499050acb30eed870d0d91174cb623e98c3ad121cf81f04e57d49b008424a98a31eeaaf5f38e000f903d48d215ed52f862d636a5a73607de85760167267efe30f8a26ebc5aa0c09f5b258d3361ca69d1d7ee07b59648179ab2170ec50c07f6616f216872529421a6334a4a1ed3d2671ef47bc9a92afb58314e832db8a9003408a0487503fe4f67770dd4b6 -SIG = 29df3ad589009c667baa5e72dabb4e53cb7876de4e7efe5cc21ead7fa878db57f97c1103ddb39a861eb88653c1d4ec3b4306e4584b47b8bc90423119e7e4af00 - -SEED = 3dd7203c237aefe9e38a201ff341490179905f9f100828da18fcbe58768b5760 -PUB = f067d7b2ff3a957e8373a7d42ef0832bcda84ebf287249a184a212a94c99ea5b -MESSAGE = db28ed31ac04b0c2decee7a6b24fc9a082cc262ca7ccf2a247d6372ec3e9120ecedb4542ea593fea30335c5ab9dd318a3b4fd5834299cf3f53d9ef46137b273c390ec3c26a0b4470d0d94b77d82cae4b24587837b167bb7f8166710baeb3ee70af797316cb7d05fa57e468ae3f0bd449404d8528808b41fcca62f5e0a2aa5d8f3acab008cc5f6e5ab02777bdcde87f0a10ef06a4bb37fe02c94815cf76bfb8f5cdd865cc26dcb5cf492edfd547b535e2e6a6d8540956dcba62cfea19a9474406e934337e454270e01036ac45793b6b8aceda187a08d56a2ce4e98f42ea375b101a6b9fcb4231d171aa463eeb43586a4b82a387bcddaf71a80fd5c1f7292efc2bd8e70c11eaa817106061b6c461c4883d613cc06c7e2a03f73d90fc55cdc07265eefd36be72270383d6c676cae37c93691f1ae3d927b3a1cd963e4229757ae5231eea73a9f71515628305410ac2593b325cc631 -SIG = 4c036935a96abc0d050d907bedbe9946fb97439f039c742e051ccf09add7df44d17da98c2ca01bdc2424da1e4debf347f8fff48ac8030d2cc07f9575c044be04 - -SEED = 282775df9ebbd7c5a65f3a2b096e36ee64a8f8ea719da77758739e4e7476111d -PUB = a2b49646033a13937cad6b0e914e3cec54989c252ca5643d076555d8c55e56e0 -MESSAGE = 14cc50c2973ea9d0187a73f71cb9f1ce07e739e049ec2b27e6613c10c26b73a2a966e01ac3be8b505aeaad1485c1c2a3c6c2b00f81b9e5f927b73bfd498601a7622e8544837aad02e72bf72196dc246902e58af253ad7e025e3666d3bfc46b5b02f0eb4a37c9554992abc8651de12fd813177379bb0ce172cd8aaf937f979642bc2ed7c7a430cb14c3cd3101b9f6b91ee3f542acdf017f8c2116297f4564768f4db95dad8a9bcdc8da4d8fb13ef6e2da0b1316d3c8c2f3ed836b35fe2fd33effb409e3bc1b0f85225d2a1de3bfc2d20563946475c4d7ca9fddbaf59ad8f8961d287ae7dd803e7af1fa612329b1bdc04e225600ae731bc01ae0925aed62ac50d46086f3646cf47b072f0d3b044b36f85cec729a8bb2b92883ca4dfb34a8ee8a0273b31af50982bb6131bfa11d55504b1f6f1a0a00438ca26d8ab4f48bcddc9d5a38851abede4151d5b70d720732a00abea2c8b979 -SIG = 15763973859402907d8dcb86adc24a2a168ba3abf2246173d6348afed51ef60b0c0edeff4e10bcef4c6e5778c8bc1f5e9ee0237373445b455155d23de127a202 - -SEED = 4730a5cf9772d7d6665ba787bea4c95252e6ecd63ec62390547bf100c0a46375 -PUB = f9f094f7cc1d40f1926b5b22dce465784468b20ab349bc6d4fdf78d0042bbc5b -MESSAGE = e7476d2e668420e1b0fadfbaa54286fa7fa890a87b8280e26078152295e1e6e55d1241435cc430a8693bb10cde4643f59cbfcc256f45f5090c909a14c7fc49d37bfc25af11e8f4c83f4c32d4aabf43b20fa382bb6622a1848f8ffc4dff3408bb4ec7c67a35b4cdaee5e279c0fc0a66093a9f36a60fdd65e6334a804e845c8530b6fda363b5640337d027243ccfb3c177f43e717896e46ead7f72ca06aa0ff1e77247121baf48be9a445f729ca1390fc46151cbd33fcbd7373f27a6ba55c92cbf6945b09b44b9a4e5800d403070ae66048997b2197f02181a097e563f9b9acc841139258a258bc610d3bd891637356b2edc8c184c35c65af91aaf7b1c16d74a5f5f862548139254ecf550631d5f8849afdb5b64cf366ff2633a93f3a18c39b5150245fb5f33c9e4e2d94af6963a70b88f9e7e519f8fa2a0f2e3749de883d0e6f052a949d0fc7153a8693f6d801d7352eb2f7a465c0e -SIG = 552c7347bdfe131646ce0932d82a36d2c1b76d7c30ee890e0592e19f9d18b9a56f48d7a9b68c017da6b550c943af4a907baf317e419fbbc96f6cf4bfad42de00 - -SEED = 2770aadd1d123e9547832dfb2a837eba089179ef4f23abc4a53f2a714e423ee2 -PUB = 3c5fbb07530dd3a20ff35a500e3708926310fed8a899690232b42c15bd86e5dc -MESSAGE = a5cc2055eba3cf6f0c6332c1f2ab5854870913b03ff7093bc94f335add44332231d9869f027d82efd5f1227144ab56e3222dc3ddccf062d9c1b0c1024d9b416dfa3ee8a7027923003465e0ffaefb75b9f29dc6bcf213adc5e318fd8ba93a7aa5bfb495de9d7c5e1a196cd3a2d7721f8ba785aa9052a1811c7fcc8f93932765059cab9c9b718945895ef26f3ac048d4cabf91a9e6aa83ac14d43156827837914eb763a23cba53f60f150f4b70203ec1833ff105849457a8da7327661fb23a554164e05fcf0146b10674964be6f6aa0acc94c41ad57180e5180d199bd9102f55d740e81789b15671bbd0670e6de5d97e1ae626d8a0ebc32c8fd9d24737274e47d2dd5941a272e72a598928ad109cde937bf248d57f5d2942983c51e2a89f8f054d5c48dfad8fcf1ffa97f7de6a3a43ca15fc6720efaec69f0836d84223f9776d111ec2bbc69b2dfd58be8ca12c072164b718cd7c246d64 -SIG = f267715e9a84c7314f2d5869ef4ab8d2149a13f7e8e1c728c423906293b49ce6283454dd1c7b04741df2eabedc4d6ab1397dc95a679df04d2c17d66c79bb7601 - -SEED = 4fdab7c1600e70114b11f533242376af7614b4d5da046ac4bedea21d8a361598 -PUB = a25c9a94d6e4ecd95a4bd6805f762eb1c457a8d45d243238b1839cbba8f441cc -MESSAGE = da405890d11a872c119dab5efcbff61e931f38eccca457edc626d3ea29ed4fe3154fafec1444da74343c06ad90ac9d17b511bcb73bb49d90bafb7c7ea800bd58411df1275c3cae71b700a5dab491a4261678587956aa4a219e1ac6dd3fb2cb8c46197218e726dc7ed234526a6b01c0d72cb93ab3f4f38a08e5940b3f61a72ad2789a0532000fac1d2d2e3ad632ac8b62bb3ff5b99d53597bf4d44b19674924df9b3db3d0253f74627ccab30031c85e291c58b5fa9167522a46746fc307036745d4f9817786e5d300e6c5d503125fea01dec3e3fedbf3861ca2627a0518fb2b24e5a7a014178719e9b345f7b249ce3a413280c8deb674f59a25be92a8ab6400c7c52b0728ae34e22b2ec200c1cbaba2ccd8af29249d17af60c36007a722fc80258a7bebab1cdaad7462a8b7588c2f7e27c6d07afcf60117fed11bd6859e75e3b4fcee3981881e95dd116827dd4b369af069d3c8f2676f8a -SIG = 5075c090cfbeb6b01802af7f4da5aa4f434d5ee2f3530eebb75c85e08621f83edc08aa96693894a4277633ba81e19e9e55af5c495daa5e1a6f8cbb79c01c7207 - -SEED = 264504604e70d72dc4474dbb34913e9c0f806dfe18c7879a41762a9e4390ec61 -PUB = eb2b518ce7dc71c91f3665581651fd03af84c46bf1fed2433222353bc7ec511d -MESSAGE = 901d70e67ed242f2ec1dda813d4c052cfb31fd00cfe5446bf3b93fdb950f952d94ef9c99d1c264a6b13c3554a264beb97ed20e6b5d66ad84db5d8f1de35c496f947a23270954051f8e4dbe0d3ef9ab3003dd47b859356cecb81c50affa68c15dadb5f864d5e1bb4d3bada6f3aba1c83c438d79a94bfb50b43879e9cef08a2bfb22fad943dbf7683779746e31c486f01fd644905048b112ee258042153f46d1c7772a0624bcd6941e9062cfda75dc8712533f4057335c298038cbca29ebdb560a295a88339692808eb3481fd9735ea414f620c143b2133f57bb64e44778a8ca70918202d157426102e1dfc0a8f7b1ae487b74f02792633154dfe74caa1b7088fda22fa8b9bc354c585f1567706e2955493870f54169e0d7691159df43897961d24a852ea970c514948f3b48f71ee586e72ec78db820f253e08db84f6f312c4333bd0b732fe75883507783e9a1fd4fbab8e5870f9bf7ad58aa -SIG = eea439a00f7e459b402b835150a779eed171ab971bd1b58dcc7f9386dadd583de8dc69e267121dde41f0f9493d450b16219cdf3c22f09482ce402fe17ca49e08 - -SEED = 2ca7447a3668b748b1fd3d52d2080d30e34d397bb2846caf8f659ac168788ca5 -PUB = ab331cd40a31d0173c0c8c1c17002532807bf89e3edb6d34c2dd8294632b9fbc -MESSAGE = a82bcd9424bffda0f2f5e9eae17835dbe468f61b785aab82934737a91c5f602cb7c617cdffe87cad726a4972e15a7b8ee147f062d2a5a4d89706b571fa8aa2b95981c78abeaaae86203fa2c0e07297406ea8c27111a86dbe1d5a7c3b7ae930904d9890f6d4abebd1412a73ad5feea64acf065d3e63b5cbe20cf20bbd2d8b94f9053ed5f66633482530124446605918de66455e8cf4b101a127233c4e27d5d55bf95bd3195d0340d43531fc75faf8dded5275bf89750de838fd10c31745be4ca41fa871cb0f9b016706a1a7e3c44bb90ac7a8ad51e272389292fd6c98ad7a069e76e3f5f3e0cc770b9e9b35a765d0d93712d7cdabd17e5d01dd8183af4ad9365db0a0fa41381fce60a081df1c5ab0f8c18f95a7a8b582dfff7f149ea579df0623b33b7508f0c663f01e3a2dcd9dfbee51cc615220fdaffdab51bdae42cb9f7fa9e3b7c69cc8ada5ccd642529ba514fdc54fcf2720b8f5d08b95 -SIG = f93ada15ae9cd2b54f26f86f0c28392aed5eb6b6b44d01a4e33a54e7da37c38e8d53366f73fd85be642e4ec81236d163f0d025e76c8bbdd65d43df49f09c1f01 - -SEED = 494ea9bcce26885b7d17d1fc114448f239f0ce46e5f247b4c999fa8629692472 -PUB = 6901e5efae57536ba5fdd96b59657359065f25d391a1aa8cdc0d38bb5d53c139 -MESSAGE = 3badbfa5f5a8aa2cce0a60e686cdce654d24452f98fd54872e7395b39464380a0e185557ea134d095730864f4254d3dd946970c10c804fcc0899dfa024205be0f80b1c75449523324fe6a0751e47b4ff4822b8c33e9eaf1d1d96e0de3d4acd89696b7fcc03d49f92f82b9725700b350db1a87615369545561b8599f5ea920a310a8bafc0e8d7468cbf6f3820e943594afdd5166e4e3309dddd7694ef67e694f34fc62724ff96ac3364176f34e8a02b4cf569db5b8f77d58512aedabf0bcd1c2df12db3a9473f948c5c3243309aae46c49efd088b60f31a8a72ad7e5a35acc5d89fa66807eb5d3ba9cdf08d4753cb85089ee36f5c96b432b6928352afad58012225d6157f9e3611426df921b6d1d8374628a63031e9ffb90e42ffbba021f174f68503155430152c9155dc98ffa26c4fab065e1f8e4622c2f28a8cb043110b617441140f8e20adc16f799d1d5096b1f50532be5042d21b81ea46c7 -SIG = 548a093a680361b7dc56f14503b55eeec3b3f4fd4ca99d6aedce0830f7f4ae2f7328539b34c48fc9760922333dae9c7c017e7db73b8faa6c06be05e347992b06 - -SEED = 00d735ebaee75dd579a40dfd82508274d01a1572df99b811d5b01190d82192e4 -PUB = ba02517c0fdd3e2614b3f7bf99ed9b492b80edf0495d230f881730ea45bc17c4 -MESSAGE = 59c0b69af95d074c88fdc8f063bfdc31b5f4a9bc9cecdffa8128e01e7c1937dde5eb0570b51b7b5d0a67a3555b4cdce2bca7a31a4fe8e1d03ab32b4035e6dadbf1532059ee01d3d9a7633a0e706a1154cab22a07cd74c06a3cb601244cf3cf35a35c3100ba47f31372a2da65dcff0d7a80a1055d8aa99212e899aad7f02e949e6fee4d3c9cefa85069eaff1f6ad06fc300c871ab82b2bedb934d20875c2a263242cdb7f9be192a8710b24c7ea98d43daec8baa5553c678a38f0e0adf7d3ff2dcc799a1dbad6eab1c3d9458a9db922f02e75cfab9d65c7336dae71895d5bb15cac203f2b38b9996c410f8655ad22d3c091c20b7f926d45e780128f19747462abc5c58932fbb9e0bc62d53868802f1b083f183b8a1f9434986d5cf97c04e2f3e145730cba98779c7fed0cab1c05d5e4653c6c3f6736260bc78ee4372862ffe9e90371d762c7432781f35ced884a4baca05653ef25f25a6f3d5628308 -SIG = dcdc54611937d2bd06cacd9818b3be15ce7425427a75f50d197a337a3b8ba6714ef48866f243bd5ac7415e914517a2c1c5a953f432b99db0e620d64f74eb8505 - -SEED = 8c34b905440b61911d1d8137c53d46a1a76d4609af973e18eb4c5709295627bb -PUB = b69a8b2fdf5c20e734c2ffb294bc8ae1011d664f11afe7fbc471925cf72fa99d -MESSAGE = 30b57a389b48a0beb1a48432bff6b314bded79c4a1763a5acb57cea1bfb4c6d016cf090f5bd05bbd114e33ae7c17782dfa264f46c45f8c599c603016fe9ff05b6b5a99e92fe713a4cd5c41b292ed2bb2e9cf33a440542e821ec82cbf665c3f02e3dc337d7fdb58e31b27cb2954541468814698510df18c85c81fad12db11ec6b966f4930da5646b991db97445097da30dab61cda53a41083cb96add19de6c5eec323bca9d3530e38c00b35af7360077601be6ac97f3030f930a27b90fe8b6911bae389065adc15e1882300e2a003274d23182d5efd5ba4b9130c07bd5c65fecb8b5cb7eb38836b318befdfd77de4d6ca0181f77ae5740891683225f549dd8426145c97c5818c319f7ab2d868e1a41ceab64c085116069897bf2ca3667652406155ed0646431b6de1ccc03b4279ae4d326679265dce82048e7298e1f87fcec0768ac0f5d8ff84f7210be54d411af8edea7217f4e59413121e148c60da -SIG = 3e0b72073dc9375eedcca6c4fc1cd315938a050c92716bd2284f4629a962beec0b7d7cf16ab923d58f5b90d3901a8e5c75c8f17dab9998e007d8c49511973d0e - -SEED = 77a83e18c9f000eeff7deeac959ecba2206c0aa39d2f0e2aed5729482a7a0229 -PUB = 62b1b316135596bfbca6037ed847c61fb7f09fa36ce90abb7789b86f768b59dd -MESSAGE = f3d5fa2acaefd858f1df26e03059cdcbc2468ad74afc993d0db9c4cde4113f8d55c7da71d38ba06520531c61fddb5f33d5f0353be2376e580711be45c0a30b1fa01b55e228c6fa35e3f95b67909fc7df3fd464d93d661a926f9d11f7550c17fbcc3496526e8f10e0c8916677b2be5b319b688f21e81aaa9482e5c93e64ce8c437b9c1e14fefed70a3fee568811dc31cadab3d5b220254465336dc4d97a3bd096b5e065e0cfbe82849e2c1905aca486533f0da7a61f1e9a55b8e2a83262deeb59f2b13d3a8aef5700845b83b25ae2183c0ddac0ce42f8d25674cb0d0d220a6de7c1858bb07d59a3372344d944602aa451d2b937db0fe6feca0beba81721fc361ea7509e2b6d397e1c191b56f54ab436d0d27ab4c061bd661ad1a4452387e8735754d07fa7ef4d4548b172582425b299046e6301b5ba6b914418f149cf722e10bde2e0d41700f12c8429fc897b7819da92292240cd45565458c9a7b29c12 -SIG = 1eaad8420ac12c99ac1ff4476678e3cbbe94da6a797f174664d5ee0f641433fb1e7cb2f5613e10805df8654cd8e0d45d96230932bc7f20b04eae836435134309 - -SEED = 73b03373ef1fd849005ecd6270dd9906f19f4439e40376cdbc520902bc976812 -PUB = 663719e08ba3ba1666f6069a3f54991866b18cc6be41991b02eb3026ff9e155f -MESSAGE = d5c2deaba795c30aba321bc7de6996f0d90e4d05c747fb4dae8f3451895def6e16e72f38eace756f36635f8fb0b72a3a0c1f54663817a94d4fd346f835ab0e657f001a6f2cecb86d0825bd02639254f7f7f38ca99dbb86c64a633f73baf933aae3563281f4005e2d0e7cec9fbde8e588a957e211068be65b3d3d35bf4e8d5bb3478333df9ced9b2abaf48697994a145e9321499fc5ee560f4fbb6849e1ae8eb3d1de0083a21a03f6a6b28176f0130d3895e50e75e3d7d0947a7bc2c5b9ff69895d27791442ba8d0f2180712b567f712ea912f3b0d92c19342e0106ff1d87b46ad33af300b90855ba9769d366e79425d98e4de19905a04577707cbe625b84691781cd26bf62260b4a8bd605f77af6f970e1b3a112e8918344bd0d8d2e41dfd2ce9895b0246e50887aa3a577ff73be4b6ae60feb0ca36f6a5f8171ed209e5c566529c0940d9b4bd744ccee56e54a9a0c6e4da520dd315c2872b02db563703e -SIG = a40abe98fc69da8a1ff9ff5c2cca93632e975980ee8b82c3c376022d6524ab736d01b072f2b681b5f1cd3ea067012ed6d074e949c42327a366caa9e4750a3c08 - -SEED = eab179e41ed5c889ffe6aabdc054faf1307c395e46e313e17a14fe01023ffa30 -PUB = 86f34746d3f7a01ddbe322f1aca56d22856d38733a3a6900bb08e776450ec803 -MESSAGE = 971095cebe5031530224387c5c31966e389b8566390054cf45264b44e18964b7be52c33c4ffb259af16283438fa15dd66bc7791b7533ef10cb0beab524a6437626f4cc74512851adcc2fb129055a482c61107383fb7c5241831d5551634eef0dc0b8f9053a00971aa8fa1ae0898e4b481b6707e97c0f942040b339d92fc17bbade74675af243d8b2dafb15b1db55d12415b85f3037291930ab61600ba3431f8eb425be4491614728af101e81c091f348bc5ffd1bde6ae6cad5c15b3aa7358078cc4effb54a86e7f0e0c55e4cfe0a54605ed443fdf2aaba016585da617e77341d52889d75dd540d39fe8b7993ed705cfddea0cb0d5a731d6bfcdb816afaff47e963eedebdf241af5593353d6d401a34f029a8cdeb1904cc2caa4f9635cc2ba6b7b1a29da625ffc383be2f5a8f1fa4f39b2d4b4f4c2d8838ce258a04d4a120493fdf07f68c0ffd1c16b768a35c55fea2cac696b5c20efc10865cde8a64627dcd -SIG = 143cb28027c2f82e375e5f340e7fe6e60ce7bd51000b49c74168af85e26ed2ed630ed2672090164cc54b052da694ebdd21a21b3053f4dcfd7895ea5f6c8aa80d - -SEED = fbf146ebd51075570ec51ac410ae9f391db75b610ada6362b4dbd949656cfb66 -PUB = be7c2f5b21d746c8ea3245ce6f268e9da74e00fa85c9c475260c68fa1af6361f -MESSAGE = cd7ad4f17fcff73acc402dc102d09079b29aaf2a0f4b27cf6beeb1e2b23d19ab47deb3ae1becd68861ea279c46691738f4fff47c43047c4f8b56b6bbcc3fde0723d44120dcd307a6310dc4f366b8f3cd52db19b8266a487f7872391c45fe0d3248a7abf2c20022d3769547f683067dcc363cd22fd7cda3cadc15804056f0e2aa2b795008c598be7a961805e6df291ba3041c47ff5640275f46e6ae82092d21abcbcfba11e730216008822de3ce462400596da79f7ae5d1df8389112ad98868fa94fb0546bfe6a67aa8d28c4d32072d2eadd6256255f18c2382e662dfa922a680e06a43622c4871d27d1807f7b2703070c83db8dd929c06038b2183cb8e2b9ec4c778d7ecf9e9ffac77fa7737b055feac2e7982aeeec0b72f1bbca2424e1a844bbac79cb2e7400f81dc449d0560b521a7c16bb4167e6696586058a9b8ed2e5116690b77f2a17e5c0b16a83dcbd2e24552293e258b32ba7f844944379342698627 -SIG = 6768006fe0f201b217dd10eb05d4b82adcfeb2ecfc8373c3308f4150394811eb60491881a2e53d1289d96478e18a64c34b2a19832cdccfd96a2e4a0c469fdc0b - -SEED = dff0eb6b426dea2fd33c1d3fc24df9b31b486facb7edb8502954a3e8da99d9fd -PUB = c245085ece69fb9aa560d0c27fdb634f7a840d41d8463660fbe82483b0f3cc3a -MESSAGE = e7c9e313d86160f4c74aa0ae07369ee22b27f81b3f69097affae28dae48483fb52a5c062306b59610f5cdbff6332b1960cd6f2b8f7b41578c20f0bc9637a0fdfc739d61f699a573f1c1a0b49294506cf4487965e5bb07bbf81803cb3d5cb3829c66c4bee7fc800ede216150934d277dea50edb097b992f11bb669fdf140bf6ae9fec46c3ea32f888fde9d154ea84f01c51265a7d3fef6eefc1ccdbffd1e2c897f05546a3b1ca11d9517cd667c660ec3960f7a8e5e80202a78d3a388b92f5c1dee14ae6acf8e17c841c9557c35a2eeced6e6af6372148e483ccd06c8fe344924e1019fb91cbf7941b9a176a073415867210670410c5dbd0ac4a50e6c0a509ddfdc555f60d696d41c77db8e6c84d5181f872755e64a721b061fcd68c463db4d32c9e01ea501267de22879d7fc12c8ca0379edb45abaa6e64dda2af6d40ccf24fbebad7b5a8d3e52007945ecd3ddc1e3efeb522581ac80e98c863ba0c590a3ed95cd1 -SIG = 6b48b10f545ddb7a89cd5829f4e5b20146cf6bc96e550d06f65de8bdae7ccdded26cd630f86c9266bccf88e924033e04f83a54f8290d7f734cf8673cca8f9703 - -SEED = 9f32958c7679b90fd5036056a75ec2eb2f56ec1effc7c012461dc89a3a167420 -PUB = 1d7269dcb6d1f584e662d4ce251de0aba290ef78b97d448afb1e5333f1976d26 -MESSAGE = a56ba86c71360504087e745c41627092ad6b49a71e9daa5640e1044bf04d4f071ad728779e95d1e2460584e6f0773545da82d4814c9189a120f12f3e3819813e5b240d0f26436f70ee353b4d20cea54a1460b5b8f1008d6f95f3aa2d8f1e908fced50d624e3a096938b9353854b96da463a2798a5a312ec790842c10c446e3350c764bf5c972593b9987bf23256daa8894d47f22e85b97607e66fc08a12c789c4746080368d321bb9015a1155b65523ad8e99bb989b44eac756b0734acd7c6357c70b59743246d1652d91b0f9896965141345b9945cf34980452f3502974edb76b9c785fb0f4395266b055f3b5db8aab68e9d7102a1cd9ee3d142504f0e88b282e603a738e051d98de05d1fcc65b5f7e99c4111cc0aec489abd0ecad311bfc13e7d1653b9c31e81c998037f959d5cd980835aa0e0b09bcbed634391151da02bc01a36c9a5800afb984163a7bb815edbc0226eda0595c724ca9b3f8a71178f0d20a5a -SIG = 9881a5763bdb259a3fefbba3d957162d6c70b804fa94ab613406a6ec42505b8789465ca1a9a33e1895988842270c55e5bdd5483f6b17b31781b593507a6c1808 - -SEED = f86d6f766f88b00717b7d6327eb26cf3ceeba5385184426f9cfd8295e2421ff2 -PUB = cb1d250504754183704dbe21c323d66f9f9011758f6d8dab6f597b199662145b -MESSAGE = da8423a6b7a18f20aa1f90ed2331b17b24067c40175bc25d8109e21d87ac00528eb3b2f66a2b52dc7ef2f8cecb75c76099cfa23db8da897043ba1cce31e2dfea46075f5e073203eaeb3d62c84c107b6dab33a14eaf149aa61850c15f5a58d88a15aba9196f9e495e8dbecbcf7e8444f5dd72a08a099d7f6209990b562974ea829ef11d29a920e3a799d0d92cb50d50f817631ab09de97c31e9a05f4d78d649fcd93a83752078ab3bb0e16c564d4fb07ca923c0374ba5bf1eea7e73668e135031feafcbb47cbc2ae30ec16a39b9c337e0a62eecdd80c0b7a04924ac3972da4fa9299c14b5a53d37b08bf02268b3bac9ea9355090eeb04ad87bee0593ba4e4443dda38a97afbf2db9952df63f178f3b4c52bcc132be8d9e26881213abdeb7e1c44c4061548909f0520f0dd7520fc408ea28c2cebc0f53063a2d30570e05350e52b390dd9b67662984847be9ad9b4cd50b069ffd29dd9c62ef14701f8d012a4a70c8431cc -SIG = ec61c0b292203a8f1d87235ede92b74723c8d23408423773ae50b1e9bc4464e03e446da9dce4c39f6dd159bea26c009ed00120bc36d4a247dc0d24bcefcc110c - -SEED = a5b34cefab9479df8389d7e6f6c146aa8affb0bec837f78af64624a145cc344e -PUB = 7b0f4f24d9972bc6fe83826c52716ad1e0d7d19f123858cb3e99fa636ac9631a -MESSAGE = e21e98af6c2bac70557eb0e864da2c2b4d6c0a39a059d3477251f6178a39676f4749e7fbea623f148a43a8b0fe0610506fa658abd2f5fa39198f2636b724db22d1aebc2ab07b2b6dbffdee8cece81e1af1493ec1964e16bf86ab258ca0feb77e3c8717e44038abe152c14be15660bf93b2d48d92c4ed7074d2494210621bcf204fba88c654d5ffe01e1a53d08f70bb237089dc807216ff6a85dbec3102237d42590778acf6c1dc566d5a2bb9a63bc21c329c272e5965baeeb0fe891de3cc8cbfa8e541a8881df68942e7ff8dc656bd08575f6aaf924a176d663b1a1f43574d11768c701b269561e55438dbebfd443d2115cb933d1cde4a915b54c325c27f499ef02bd012ff1f9a36390922887600fe712bcdc23eb5974a305372ad52951f83f0e58cc49e289841621917f1fcb0235147240dae4cf3b99b6ac6d8de94efe7c4436714508bcd0114c56068ff1b7c16d51bd906437874d6549ab5d8087896872ec8a09d7412 -SIG = 2fbd899d72b6d39e4f45b8b62cbbd5f3c0acb1ad8540913fa585877e91ccfef7bee50a4b0f9fedf5cc1e0d1953ad399c8389a93391e1b7c929af6d6f3b796c08 - -SEED = ad75c9ce299c4d59393367d77a4c9f8df8dcec765c6dbd25b527fb7669913604 -PUB = b9910548fe6312a119c9993eebcfb9dc90030ffb0e4de2b7ccd23cbeb4fef71b -MESSAGE = 62fc5ab67deb1fee9ab6cca3b88a1df1e589f0fd4a88f4aa7738948761fe84372c5b18e4655220c1d84d52acad32e229a5c756c20fc62fe4b4b4e5fd7077ae4ed5397aa796f2307ceedb6505b39297856f4aeb5e70938e36ee24a0ac7d9868306f6b53910623b7dc89a6672ad738576ed5d88831dd338321c8902bc2061f65e94d452fdfa0dc665cefb92308e52301bd4627006b363d06b775a395914d8c863e95a00d6893f3376134c429f56478145e4456f7a12d65bb2b8965d728cb2ddbb708f7125c237095a92195d92fa727a372f3545ae701f3808fee802c8967a76e8a940e55fb2d810bfb47ada156f0eda1829b159cf05c7f36cf3847d7b21de84c3dc0fe658347f79396a01139a508b60022db1c0e5aeef47e445e66f783e62c96597bdb16f209c08a9132c7573136170ee3ebf24261265a89fb4f10333375e20b33ab7403464f5249461c6853c5fddb9f58af816892910393a7077b799fdc3489720998feea86 -SIG = 6b7ef27bcfbf2b714985033764fccff555e3f5bc44610d6c8c62117cb3831a07f4a8bddb0eaed1d46b0289b15de1aa4dcc17d71be96a09e66ba4dc4627c78705 - -SEED = 1ced574529b9b416977e92eb39448a8717cac2934a243a5c44fb44b73ccc16da -PUB = 85e167d5f062fee82014f3c8b1beaed8eefb2c22d8649c424b86b21b11eb8bda -MESSAGE = 1b3b953cce6d15303c61ca707609f70e7250f6c0deba56a8ce522b5986689651cdb848b842b2229661b8eeabfb8570749ed6c2b10a8fbf515053b5ea7d7a9228349e4646f9505e198029fec9ce0f38e4e0ca73625842d64caf8ced070a6e29c743586aa3db6d82993ac71fd38b783162d8fe04ffd0fa5cbc381d0e219c91937df6c973912fc02fda5377312468274c4bee6dca7f79c8b544861ed5babcf5c50e1473491be01708ac7c9ff58f1e40f855497ce9d7cc47b9410f2edd00f6496740243b8d03b2f5fa742b9c630867f77ac42f2b62c14e5ebddc7b647a05fff43670745f2851eff4909f5d27d57ae87f61e965ee60fdf97724c59267f2610b7ad5de919856d64d7c212659ce8656149b6a6d29d8f92b312be50b6e2a431d36ae022b00a6fe360e3af65432899c43be0427e36d21cfec81f21aa53b33db5ed2c37da8f96ac3e7dc67a1de37546cf7de1008c7e1adbe0f34fa7eb2434d94e6a13f4cf86a98d497622f -SIG = e0303aefe08a77738dcc657afbb9b835ed279613a53c73fdc5ddbfb350e5cff4d6c9bb43dc07c95bf4e23b64c40f8804c7169952e3c8d59a7197241bfed0740f - -SEED = f0790d93e2d3b84f61ef4c807147aba410e415e72b71b0d61d01026fed99da3d -PUB = efdf649fb033cf328e0b287796f8a25e9c6e2e871b33c2c21a4028a8a25a4b28 -MESSAGE = 7973e9f32d74805992eb65da0d637335e50eff0ce68ea2d1f3a02de704492b9cfbe7e7ba96fdb42bb821a513d73fc60402e92c855deaed73ffeaf70952029062c833e14ec1b14f144e2207f6a0e727e5a7e3cbab27d5972970f69518a15b093e740cc0ce11bf5248f0826b8a98bde8bf2c7082c97aff158d08371118c89021cc3974ae8f76d86673c3f824b62c79c4b41f40eaa8943738f03300f68cbe175468eb235a9ff0e6537f8714e97e8f08ca444e41191063b5fabd156e85dcf66606b81dad4a95065584b3e0658c20a706eaf4a0777da4d2e0cd2a0fca60109c2b4403db3f03cd4781c1fbb0272202bcb11687808c50cb98f64b7f3fd3d43333bb5a061b9e377090abb1e0a885cb26b73c163e63ff6451ff2f4ec8249c7e152bd03973a1e964e2b5b235281a938399a112a24529e383a560dc50bb1b622ad74ef35658dcb10ffe022568ac3ffae5b465a8ed7643e8561b352ee9944a35d882c712b187788a0abae5a22f -SIG = 08773a6a78762cbb1e25fcbb29139941bdf16f4e09a1fa08fc701f32f933edd74c0ae983c12a0a5b020b6bcf44bb719dde8ed0781a8298265640e1608c98b301 - -SEED = 4cb9df7ce6fae9d62ba09e8eb70e4c969bdeafcb5ec7d7024326e6603b0621bf -PUB = 018069dd0eb44055a35cd8c77c37ca9fb1ad2417271385e134b2f4e81f52033c -MESSAGE = 14627d6ea0e7895460759476dc74c42800ceef994327518151490d9df23067914e44788a12768ccb25471b9c3ba9d14fb436dcba38429b3a0456877763c49175d0e082683e07a9058f3685c6279307b2303d1221b9c29793d8a4877f6df51587384dadf751c5f7bfbd207d519622c37b51ceeee2c20d8269f8cb88d3fe43d6d434d5bbd0e203c1532d97ba552147227496c87f67b50bb76193add0144df1c176657585408362ca2ed04ad62acf1c25e341dfd1498d85b4b1349a8b0b9b02c43523c55853419bfed37d5a2cdf17dfbf1a3bd7759d6ae180f9d27dcd9a8933e29a7c0a30771eea7c2e0fa242925d2336dce585629057d844323964f6d3d11ff0b3f829a3be8c9f0468a6823d8e70ab5a2da21e15fa8b041a29812222e9c30b2bd9a12d1fdee6f87876e8ce81009637a8bb2236129a47ca74289ee4aad429ffe29f47430241ca8cc3848b7200fd6e1470651a9a0a6f72c9033e831df051408a6260f65cbaf6e012b18e -SIG = e33c07836c537d6bfbd0f4592d6e35b163499ba78dc7ffcec565d04f9a7db781943e29e6ce76763e9baddf57437fd9c6b03239a6e6850e4502a356c2e12c3705 - -SEED = a136e009d53e5ef59d0946bc175663a86bc0fcd29eadd95cfc9d266037b1e4fb -PUB = 9c1806ec0454f58314eb8397d64287dee386640d8491aba364607688841715a0 -MESSAGE = a49d1c3d49e13c2eda56868a8824aa9f8d2bf72f21955ebafd07b3bdc8e924de20936cee513d8a64a47173a3bd659eff1accff8244b26aae1a0c27fa891bf4d85e8fb1b76a6cab1e7f74c89ee07bb40d714326f09b3fd40632fad208ea816f9072028c14b5b54ecc1c5b7fc809e7e0786e2f11495e76017eb62aa4563f3d00ee84348d9838cd17649f6929a6d206f60e6fc82e0c3464b27e0e6abd22f4469bdfd4cb54f77e329b80f71bf42129ec13c9dfe192adfaa42ee3ddeeda385816fbad5f411938c63b560f4ecd94534be7d98725cd94c99ce492f0f069ba0ec08f877a7812ef27ae19d7a77be63f66bcf8d6cf3a1a61fc9cfef104c7462a21ca7f03afb5bb1ac8c75124b554e8d044b810d95ff8c9dd09a34484d8c4b6c95f95c3c22823f52ce844293724d5259191f1ba0929e2acdbb8b9a7a8adf0c52e78acdfdf057b0985881afbed4dbebdebbdae0a2b63bd4e90f96afdcbbd78f506309f9bdb650013cb73faed73904e -SIG = bc094ba91c115dee15d753361a75f3f03d6af45c92157e95dbe8d32194b6c5ce72b9dc66f73df12dca0b639f3e791d478616a1f8d7359a42c8eae0dda16b1606 - -SEED = ff0f1c57dd884fbeea6e2917282b79ba67f8a6851267b9f4636dafda33bd2b5b -PUB = fef6378ad12a7c252fa6eb742b05064b41530ff019dc680ab544c027ea2836e7 -MESSAGE = 522a5e5eff5b5e98fad6878a9d72df6eb318622610a1e1a48183f5590ecef5a6df671b28be91c88cdf7ae2881147fe6c37c28b43f64cf981c455c59e765ce94e1b6491631deaeef6d1da9ebca88643c77f83eae2cfdd2d97f604fe45081d1be5c4ae2d875996b8b6fecd707d3fa219a93ba0488e55247b405e330cfb97d31a1361c9b2084bdb13fb0c058925db8c3c649c9a3e937b533cc6310fa3b16126fb3cc9bb2b35c5c8300015488a30fadca3c8871fa70dfdc7055bf8e631f20c9b2528311e324a7c4edd5462079f3441c9ecf55fa999e731372344fdc0d413e417aaa001a1b2d3d9bc000fec1b02bd7a88a812d9d8a66f9464764c070c93041eefb17ce74eff6d4aff75f0cbf6a789a9ecde74abe33130fca0da853aa7c3313ada3f0ae2f595c6796a93685e729dd18a669d6381825ab3f36a391e7525b2a807a52fa5ec2a030a8cf3b77337ac41fceb580e845eed655a48b547238c2e8137c92f8c27e585caad3106eee3814a -SIG = d5008486726cce330a29dd7e4d7474d735798201afd1206feb869a112e5b43523c06976761be3cf9b2716378273c94f93572a7d2b8982634e0755c632b449008 - -SEED = 0bc6af64de5709d3dbc28f7ef6d3fe28b6de529f08f5857ccb910695de454f56 -PUB = fb491fc900237bdc7e9a119f27150cd911935cd3628749ff40ef41f3955bc8ac -MESSAGE = ac7886e4f4172a22c95e8eea37437b375d72accedcee6cc6e816763301a2d8ef4d6f31a2c1d635818b7026a395ce0dafd71c5180893af76b7ea056c972d680eca01dcbdbae6b26f1c5f33fc988b824fbbe00cacc316469a3bae07aa7c8885af7f65f42e75cef94dbb9aab4825143c85070e7716b7612f64ef0b0166011d23eb5654aa098b02d8d71e57c8fa17bff2fe97dc8193177eadc09fb192d80aa92afa98720d4614817ff3c39d3acce18906fa3de09618931d0d7a60c4429cbfa20cf165c947929ac293ae6c06e7e8f25f1264291e3e1c98f5d93e6ecc2389bc60dbbf4a621b132c552a99c95d26d8d1af61138b570a0de4b497ebe8051c7273a98e6e7876d0b327503af3cb2cc4091ce1925cb2f2957f4ec56ee90f8a09dd57d6e83067a356a4cfe65b1b7a4465da2ab133b0efb5e7d4dbb811bcbbde712afbf0f7dd3f326222284b8c74eac7ad6257fa8c632b7da2559a6266e91e0ef90dbb0aa968f75376b693fcaa5da342221 -SIG = dbc7134d1cd6b0813b53352714b6df939498e91cf37c324337d9c088a1b998347d26185b430900412929e4f63e910379fc42e355a4e98f6fee27dafad1957206 - -SEED = 2f5e83bd5b412e71ae3e9084cd369efcc79bf6037c4b174dfd6a11fb0f5da218 -PUB = a22a6da29a5ef6240c49d8896e3a0f1a4281a266c77d383ee6f9d25ffacbb872 -MESSAGE = b766273f060ef3b2ae3340454a391b426bc2e97264f8674553eb00dd6ecfdd59b611d8d662929fec710d0e462020e12cdbf9c1ec8858e85671acf8b7b14424ce92079d7d801e2ad9acac036bc8d2dfaa72aa839bff30c0aa7e414a882c00b645ff9d31bcf5a54382def4d0142efa4f06e823257ff132ee968cdc6738c53f53b84c8df76e9f78dd5056cf3d4d5a80a8f84e3edec48520f2cb4583e708539355ef7aa86fb5a0e87a94dcf14f30a2cca568f139d9ce59eaf459a5c5916cc8f20b26aaf6c7c029379aedb05a07fe585ccac60307c1f58ca9f859157d06d06baa394aace79d51b8cb38cfa2598141e245624e5ab9b9d68731173348905315bf1a5ad61d1e8adaeb810e4e8a86d7c13537b0be860ab2ed35b73399b8808aa91d750f77943f8a8b7e89fdb50728aa3dbbd8a41a6e00756f438c9b9e9d55872df5a9068add8a972b7e43edad9ced2237ca1367be4b7cdb66a54ea12eef129471158610eaf28f99f7f686557dcdf644ea -SIG = 9f80922bc8db32d0cc43f9936affebe7b2bc35a5d82277cd187b5d50dc7fc4c4832fffa34e9543806b485c04548e7c75429425e14d55d91fc1052efd8667430b - -SEED = 722a2da50e42c11a61c9afac7be1a2fed2267d650f8f7d8e5bc706b807c1b91d -PUB = fd0b964562f823721e649c3fedb432a76f91e0aead7c61d35f95ed7726d78589 -MESSAGE = 173e8bb885e1f9081404acac999041d2ecfcb73f945e0db36e631d7cd1ab999eb717f34bf07874bf3d34e2530eb6085f4a9f88ae1b0f7d80f221456a8e9a8890b91a50192deaaacc0a1a615a87841e2c5a9e057957af6e48e78cc86198e32e7aa24dcf6cffa329bc72606d65b11682c8ba736cce22a05785df1146331e41609cf9ca711cf464958297138b58a9073f3bbf06ad8a85d135de66652104d88b49d27ad41e59bcc44c7fab68f53f0502e293ffcabaaf755927dfdffbfde3b35c080b5de4c8b785f4da64ef357bc0d1466a6a96560c3c4f3e3c0b563a003f5f95f237171bce1a001771a04ede7cdd9b8ca770fd36ef90e9fe0000a8d7685fd153cc7282de95920a8f8f0898d00bf0c6c933fe5bb9653ff146c4e2acd1a2e0c23c1244844dacf8652716302c2032f9c114679ed26b3ee3ab4a7b18bc4e3071f0977db57cd0ac68c0727a09b4f125fb64af2850b26c8a484263334e2da902d744737044e79ab1cf5b2f93a022b63d40cd -SIG = c2695a57172aaa31bd0890f231ca8eeec0287a87172669a899ad0891cea4c47579b50420e791cdec8c182c8a0e8dde21b2480b0cfd8111e28e5603347a352d04 - -SEED = 5fe9c3960ed5bd374cc94d42357e6a24dc7e3060788f726365defacf13cd12da -PUB = 0ce7b155c8b20ebdaacdc2aa23627e34b1f9ace980650a2530c7607d04814eb4 -MESSAGE = c9490d83d9c3a9370f06c91af001685a02fe49b5ca667733fff189eee853ec1667a6c1b6c787e9244812d2d532866ab74dfc870d6f14033b6bcd39852a3900f8f08cd95a74cb8cbe02b8b8b51e993a06adfebd7fc9854ae5d29f4df9642871d0c5e470d903cfbcbd5adb3275628f28a80bf8c0f0376687dae673bf7a8547e80d4a9855ae2572fc2b205dc8a198016ddc9b50995f5b39f368f540504a551803d6dd5f874828e5541ded052894d9e2dc5e6aa351087e790c0dd5d9c4decb217e4db81c98a184b264e6daeac0f11e074cae2bfc899f54b419c65dcc22664a915fbfffac35cee0f286eb7b144933db933e16c4bcb650d537722489de236373fd8d65fc86118b6def37ca4608bc6ce927b65436ffda7f02bfbf88b045ae7d2c2b45a0b30c8f2a04df953221088c555fe9a5df260982a3d64df194ee952fa9a98c31b96493db6180d13d67c36716f95f8c0bd7a039ad990667ca34a83ac1a18c37dd7c7736aa6b9b6fc2b1ac0ce119ef77 -SIG = 379f9c54c413af0d192e9bc736b29da9d521e7ba7841d309f9bcc1e742ec4308fe9f7ba51e0b22aed487cb4aa3913b9bebfb3aacd38f4039f9bbbebe1ad80002 - -SEED = ec2fa541ac14b414149c3825eaa7001b795aa1957d4040dda92573904afa7ee4 -PUB = 71b363b2408404d7beecdef1e1f511bb6084658b532f7ea63d4e3f5f01c61d31 -MESSAGE = 2749fc7c4a729e0e0ad71b5b74eb9f9c534ebd02ffc9df4374d813bdd1ae4eb87f1350d5fdc563934515771763e6c33b50e64e0cd114573031d2186b6eca4fc802cddc7cc51d92a61345a17f6ac38cc74d84707a5156be9202dee3444652e79bae7f0d31bd17567961f65dd01a8e4bee38331938ce4b2b550691b99a4bc3c072d186df4b3344a5c8fbfbb9fd2f355f6107e410c3d0c798b68d3fb9c6f7ab5fe27e70871e86767698fe35b77ead4e435a9402cc9ed6a2657b059be0a21003c048bbf5e0ebd93cbb2e71e923cf5c728d1758cd817ad74b454a887126d653b95a7f25e5293b768c9fc5a9c35a2372e3741bc90fd66301427b10824bb4b1e9110bfba84c21a40eb8fed4497e91dc3ffd0438c514c0a8cb4cac6ad0256bf11d5aa7a9c7c00b669b015b0bf81425a21413e2ffb6edc0bd78e385c44fd74558e511c2c25fee1fec18d3990b8690300fa711e93d9854668f0187065e76e7113ae763c30ddd86720b5546a6c3c6f1c43bc67b14 -SIG = 84d18d56f964e3776759bba92c510c2b6d574555c3cddade212da90374554991e7d77e278d63e34693e1958078cc3685f8c41c1f5342e351899638ef61211401 - -SEED = 6132692a5ef27bf476b1e991e6c431a8c764f1aebd470282db3321bb7cb09c20 -PUB = 7a2d166184f9e5f73bea454486b041ceb5fc2314a7bd59cb718e79f0ec989d84 -MESSAGE = a9c0861665d8c2de06f9301da70afb27b3024b744c6b38b24259294c97b1d1cb4f0dcf7575a8ed454e2f0980f50313a77363415183fe9677a9eb1e06cb6d34a467cb7b0758d6f55c564b5ba15603e202b18856d89e72a23ab07d8853ff77da7aff1caebd7959f2c710ef31f5078a9f2cdae92641a1cc5f74d0c143ec42afbaa5f378a9e10d5bf74587fa5f49c156233247dafd3929acde888dc684337e40cdc5932e7eb73ffcc90b85c0ad460416691aefbd7efd07b657c350946a0e366b37a6c8089aba5c5fe3bbca064afbe9d47fbc83914af1cb43c2b2efa98e0a43be32ba823202001def36817251b65f9b0506cef6683642a46ed612f8ca81ee97bb04d317b517343ade2b77126d1f02a87b7604c8653b6748cf5488fa6d43df809faa19e69292d38c5d397dd8e20c7af7c5334ec977f5010a0f7cb5b89479ca06db4d12627f067d6c42186a6b1f8742f36ae709ba720e3cd898116666d81b190b9b9d2a72202cb690a03f3310429a71dc048cde -SIG = eb677f3347e1a1ea929efdf62bf9105a6c8f4993033b4f6d03cb0dbf9c742b270704e383ab7c0676bdb1ad0ce9b16673083c9602ec10ae1dd98e8748b336440b - -SEED = f219b2101164aa9723bde3a7346f68a35061c01f9782072580ba32df903ba891 -PUB = f66b920d5aa1a6085495a1480539beba01ffe60e6a6388d1b2e8eda23355810e -MESSAGE = 015577d3e4a0ec1ab25930106343ff35ab4f1e0a8a2d844aadbb70e5fc5348ccb679c2295c51d702aaae7f6273ce70297b26cb7a253a3db94332e86a15b4a64491232791f7a8b082ee2834af30400e804647a532e9c454d2a0a7320130ab6d4d860073a34667ac25b7e5e2747ba9f5c94594fb68377ae260369c40713b4e32f23195bf91d3d7f1a2719bf408aad8d8a347b112e84b118817cb06513344021763035272a7db728a0ccdaa949c61715d0764140b3e8c01d20ff1593c7f2d55c4e82a1c0cb1ea58442bf80a741bca91f58ab0581b498ee9fe3c92ca654148ef75313543d1aff382befe1a93b02190ce0102175158e2071d02bacad8dbe9fb940fcb610c105ad52c80feb1ec4e524f4c0ec7983e9ce696fa4fcf4bf0514b8f0432b17d5448fc426fea2b01ac7b26c2aed769927534da22576fc1bba726e9d65be01b59f60a648ace2fc3e5e275789fa637cbbd84be3d6ac24457a6292cd656c7b569a52ffea7916b8d04b4f4a75be7ac95142f -SIG = 17f0127ca3bafa5f4ee959cd60f772be87a0034961517e39a0a1d0f4b9e26db1336e60c82b352c4cbacdbbd11771c3774f8cc5a1a795d6e4f4ebd51def36770b - -SEED = fc180035aec0f5ede7bda93bf77ade7a81ed06de07ee2e3aa8576be81608610a -PUB = 4f215e948cae243ee3143b80282ad792c780d2a6b75060ca1d290ca1a8e3151f -MESSAGE = b5e8b01625664b222339e0f05f93a990ba48b56ae65439a17520932df011721e284dbe36f98631c066510098a68d7b692a3863e99d58db76ca5667c8043cb10bd7abbaf506529fbb23a5166be038affdb9a234c4f4fcf43bddd6b8d2ce772dd653ed115c095e232b269dd4888d2368cb1c66be29dd383fca67f66765b296564e37555f0c0e484504c591f006ea8533a12583ad2e48318ff6f324ecaf804b1bae04aa896743e67ef61ca383d58e42acfc6410de30776e3ba262373b9e1441943955101a4e768231ad9c6529eff6118dde5df02f94b8d6df2d99f27863b517243a579e7aaff311ea3a0282e47ca876fabc2280fce7adc984dd0b30885b1650f1471dfcb0522d49fec7d042f32a93bc368f076006ea01ec1c7412bf66f62dc88de2c0b74701a5614e855e9fa728fb1f1171385f96afbde70dea02e9aa94dc21848c26302b50ae91f9693a1864e4e095ae03cdc22ad28a0eb7db596779246712fab5f5da327efec3e79612de0a6ccaa536759b8e -SIG = a43a71c3a19c35660dae6f31a254b8c0ea3593fc8fca74d13640012b9e9473d4afe070db01e7fb399bf4ca6070e062180011285a67dd6858b761e46c6bd32004 - -SEED = a2836a65427912122d25dcdfc99d7046fe9b53d5c1bb23617f11890e94ca93ed -PUB = 8c12bda214c8abb2286acffbf8112425040aab9f4d8bb7870b98da0159e882f1 -MESSAGE = 813d6061c56eae0ff53041c0244aa5e29e13ec0f3fb428d4beb8a99e04bca8c41bddb0db945f487efe38f2fc14a628fafa2462f860e4e34250eb4e93f139ab1b74a2614519e41ee2403be427930ab8bc82ec89ceafb60905bd4ddbbd13bdb19654314fc92373140b962e2258e038d71b9ec66b84ef8319e03551cb707e747f6c40ad476fbefdce71f3a7b67a1af1869bc6440686e7e0855e4f369d1d88b8099fba54714678627bba1aff41e7707bc97eddf890b0c08dce3e9800d24c6f61092ce28d481b5dea5c096c55d72f8946009131fb968e2bc8a054d825adab76740dcf0d758c8bf54ff38659e71b32bfe2e615aaabb0f5293085649cf60b9847bc62011ce3878af628984a5840a4ad5dae3702db367da0f8a165fed0517eb5c442b0145330241b97eeca733ba6688b9c129a61cd1236aff0e27bcf98c28b0fbeea55a3d7c7193d644b2749f986bd46af8938e8faaeafbd9cec3612ab005bd7c3eeafe9a31279ca6102560666ba16136ff1452f850adb -SIG = e6a9a6b436559a4320c45c0c2c4a2aedecb90d416d52c82680ac7330d062aebef3e9ac9f2c5ffa455c9be113013a2b282e5600fd306435ada83b1e48ba2a3605 - -SEED = f051af426d0c3282fafc8bf912ade1c24211a95ad200e1eef549320e1cb1a252 -PUB = fa87955e0ea13dde49d83dc22e63a2bdf1076725c2cc7f93c76511f28e7944f2 -MESSAGE = b48d9f84762b3bcc66e96d76a616fa8fe8e01695251f47cfc1b7b17d60dc9f90d576ef64ee7d388504e2c9079638165a889696471c989a876f8f13b63b58d531fea4dd1229fc631668a047bfae2da281feae1b6de3ebe280abe0a82ee00fbfdc22ce2d10e06a0492ff1404dfc094c40b203bf55721dd787ed4e91d5517aaf58d3bdd35d44a65ae6ba75619b339b650518cefcc17493de27a3b5d41788f87edbde72610f181bf06e208e0eb7cdfe881d91a2d6cc77aa19c0fcf330fedb44675d800eb8cff9505d8887544a503cbe373c4847b19e8f3995726efd6649858595c57ccaf0cbc9eb25de83ba046bc9f1838ac7b8953dd81b81ac0f68d0e9338cb55402552afb6bc16949351b926d151a82efc695e8d7da0dd55099366789718ccbf36030bd2c3c109399be26cdb8b9e2a155f3b2cb1bfa71ab69a23625a4ac118fe91cb2c19788cf52a71d730d576b421d96982a51a2991daec440cda7e6cc3282b8312714278b819bfe2387eb96aa91d40173034f428 -SIG = b8f713578a64466719aceb432fce302a87cf066bf3e102a350616921a840964bfc7e685d8fd17455ac3eb4861edcb8979d35e3a4bd82a078cd707721d733400e - -SEED = a103e92672c65f81ea5da1fff1a4038788479e941d503a756f4a755201a57c1d -PUB = ee63a5b69641217acbaf3339da829ec071b9931e5987153514d30140837a7af4 -MESSAGE = b1984e9eec085d524c1eb3b95c89c84ae085be5dc65c326e19025e1210a1d50edbbba5d1370cf15d68d687eb113233e0fba50f9433c7d358773950c67931db8296bbcbecec888e87e71a2f7579fad2fa162b85fb97473c456b9a5ce2956676969c7bf4c45679085b62f2c224fc7f458794273f6d12c5f3e0d06951824d1cca3e2f904559ed28e2868b366d79d94dc98667b9b5924268f3e39b1291e5abe4a758f77019dacbb22bd8196e0a83a5677658836e96ca5635055a1e63d65d036a68d87ac2fd283fdda390319909c5cc7680368848873d597f298e0c6172308030ffd452bb1363617b316ed7cd949a165dc8abb53f991aef3f3e9502c5dfe4756b7c6bfdfe89f5e00febdd6afb0402818f11cf8d1d5864fe9da1b86e39aa935831506cf2400ea7ed75bd9533b23e202fe875d7d9638c89d11cb2d6e6021ae6bd27c7754810d35cd3a61494f27b16fc794e2cd2f0d3453ada933865db78c579571f8fc5c5c6be8eaffce6a852e5b3b1c524c49313d427abcb -SIG = 2aa2035c2ce5b5e6ae161e168f3ad0d6592bcf2c4a049d3ed342fceb56be9c7cb372027573ae0178e8878ebefca7b030327b8aad41857de58cb78e1a00cbac05 - -SEED = d47c1b4b9e50cbb71fd07d096d91d87213d44b024373044761c4822f9d9df880 -PUB = f4e1cb86c8ca2cfee43e58594a8778436d3ea519704e00c1bbe48bbb1c9454f8 -MESSAGE = 88d7009d51de3d337eef0f215ea66ab830ec5a9e6823761c3b92ad93ea341db92ece67f4ef4ceb84194ae6926c3d014b2d59781f02e0b32f9a611222cb9a5850c6957cb8079ae64e0832a1f05e5d1a3c572f9d08f1437f76bb3b83b52967c3d48c3576848891c9658d4959eb80656d26cdba0810037c8a18318ff122f8aa8985c773cb317efa2f557f1c3896bcb162df5d87681bb787e7813aa2dea3b0c564d646a92861f444ca1407efbac3d12432cbb70a1d0eaffb11741d3718fedee2b83036189a6fc45a52f74fa487c18fd264a7945f6c9e44b011f5d86613f1939b19f4f4fdf53234057be3f005ad64eebf3c8ffb58cb40956c4336df01d4424b706a0e561d601708d12485e21bcb6d799d8d1d044b400064ec0944501406e70253947006cabbdb2dd6bd8cee4497653d9113a44d4de9b68d4c526fca0b9b0c18fe50fb917fdd9a914fb816108a73a6b3fff9e654e69c9cfe02b05c6c1b9d15c4e65cf31018b8100d784633ee1888eee3572aafa6f189ea22d0 -SIG = 627e7ca7e34ed6331d62b9541c1ea9a9292be7b0a65d805e266b5122272a82db7d765acc7e2a290d685804922f91ed04a3c382c03ff21a1768f584413c4e5f00 - -SEED = fc0c32c5eb6c71ea08dc2b300cbcef18fdde3ea20f68f21733237b4ddaab900e -PUB = 47c37d8a080857eb8777a6c0a9a5c927303faf5c320953b5de48e462e12d0062 -MESSAGE = a7b1e2db6bdd96b3d51475603537a76b42b04d7ebd24fe515a887658e4a352e22109335639a59e2534811f4753b70209d0e4698e9d926088826c14689681ea00fa3a2fcaa0047ced3ef287e6172502b215e56497614d86b4cb26bcd77a2e172509360ee58893d01c0d0fb4d4abfe4dbd8d2a2f54190fa2f731c1ceac6829c3ddc9bfb2ffd70c57ba0c2b22d2326fbfe7390db8809f73547ff47b86c36f2bf7454e678c4f1c0fa870bd0e30bbf3278ec8d0c5e9b64aff0af64babc19b70f4cf9a41cb8f95d3cde24f456ba3571c8f021d38e591dec05cb5d1ca7b48f9da4bd734b069a9fd106500c1f408ab7fe8e4a6e6f3ed64da0ed24b01e33df8475f95fa9ed71d04dd30b3cd823755a3401bf5afae10ee7e18ec6fe637c3793fd434b48d7145130447e00299101052558b506554ec9c399f62941c3f414cbc352caa345b930adecfaddac91ee53d1451a65e06201026325de07c931f69bba868a7c87ee23c604ec6794332917dfe2c5b69669b659706917f71eddf96 -SIG = 6887c6e2b98a82af5ee3dfa7ca2cb25d9c10745620a82956acba85cb57c8ec24279fa42f092359a1b6bbeafba050f14b6288209e6ef7bc1e0a2b872c1138f305 - -SEED = a8d73d639a23cc6a967ef31bcabb5d063e53e1eab8fcc7cab9bc3a17fde9c2f8 -PUB = 8daa9f4c8b1a44691bf44521f2f7ca45dc7fc61f6a4ce6f98faa41c2a74977d1 -MESSAGE = fd1fac3d53313b11acd29f5a83ac11896dab2530fa47865b2295c0d99dd67c36ed8e5fa549150c794c5549efb5c1d69114d5d607b23285b7212afaab57846a54ae67b9e880e07b6586607cecf6d4eed516a3a75511fe367d88eb871e6d71b7d6aa1367a01421b1088fc2d75e44954b73625c52da8a3a183c60be9da6050f59a453caa53520593671728d431877bfaac913a765fb6a56b75290b2a8aaac34afb9217ba1b0d5850ba0fdabf80969def0feee794ceb60614e3368e63ef20e4c32d341ec9b0328ea9fe139207ed7a626ff08943b415233db7cfcc845c9b63121d4ed52ec3748ab6a1f36b2103c7dc7e9303acea4ba8af7a3e07184fb491e891ede84f0dc41cadc3973028e879acd2031afc29a16092868e2c7f539fc1b792edab195a25ab9830661346b39ef53915de4af52c421eaf172e9da76a08c283a52df907f705d7e8599c5baae0c2af380c1bb46f93484a03f28374324b278992b50b7afa02552cafa503f034f8d866e9b720271dd68ccb685a85fffd1 -SIG = c4dcef1a2453939b364b340250c3129431431d5ba3f47670ab07ce680c69bf28b678627c76a6360fc40dc109aa7dea371b825e46134f624572182acf3957e70f - -SEED = 79c7dcb7d59a8df6b2b2ba0413059d89680995c20e916da01b8f067dc60cdeb4 -PUB = 298743c73918bd556b28f8d4824a09b814752a7aeae7ee04875c53f4d6b108d9 -MESSAGE = 5fe202f5b33b7788810d2508a13b3114d69b8596e6eacda05a04a2eb597fa3279c208b5a5b65daacb699f144e1d660e78e139b578331abec5c3c35334454f03e832c8d6e2984df5d450ecb5d33582a78808a9c78f26ebcd1244ef52e3fa6dca115c1f0cb56e38eae0e5b39f5fd863dffd0b2fb5b958f2d739db312fc667a17b031c4c9f8c5a2ad577984cc4146c437580efd2152173fe0d5782cc2ae9831a8d9a04177256018ff7631e0b0d8a99cb28f008b320421e27a74c31359188663456d85e098c1ebd281701097b6ae5a871e5ccc02058a501416cb91c12cef5be6f1914370e563f1a1b2aa41f4b8ee84cd32a1d509e529787d14a445438d807ecd620e2fa26de0da6426864784d4a28f54103e609283b99ee9b2b699c980bbb7882c3ea68ddc90802ac232f2c8e84291987bf3c5240921b59cfa214969317673d0be7f34b1ca0e15ea73c7175401ce550be106b49e62f8db68695e740e0f3a3556a19f3c8e6b91ac1cc23e863fcd0f0d9eb7047aa631e0d2eb9bcc6b -SIG = 7b7cbe44c771e4371bae13b0722babcc1064155732962f407cba2acd35381d42210bece822f4681121fd4dab745a1f3077922fba1a78045b712902baccac660e - -SEED = b9ced0412593fefed95e94ac965e5b23ff9d4b0e797db02bf497994d3b793e60 -PUB = c1629a723189959337f5535201e5d395ba0a03ea8c17660d0f8b6f6e6404bb12 -MESSAGE = 555bb39c1899d57cabe428064c2d925f5fc4cf7059b95fb89a8e9e3a7e426c6c922d9e4d76984ea2383cabb4f2befd89c1f20eaa8a00dbe787cfa70ae2ae6aa90331cbbe580fa5a02184ed05e6c8e89d576af28aeeaf7c4e2500f358a00971a0a75920e854849bf332142975404f598c32e96982043d992bcd1a4fe819bb5634ad03467afc4ce05073f88ba1ba4ae8653a04665cf3f71690fe13343885bc5ebc0e5e62d882f43b7c68900ac9438bf4a81ce90169ec129ee63e2c675a1a5a67e27cc798c48cc23f51078f463b3b7cc14e3bcfd2e9b82c75240934cbdc50c4308f282f193122995606f40135100a291c55afdf8934eb8b61d81421674124dec3b88f9a73110a9e616f5b826b9d343f3ac0e9d7bdf4fd8b648b40f0098b3897a3a1cd65a64570059b8bc5c6743883074c88623c1f5a88c58969e21c692aca236833d3470b3eb09815e1138e9d0650c390eee977422193b00918be8a97cc6199b451b05b5730d1d13358cf74610678f7ac7f7895cc2efc456e03873b -SIG = f1b797ded8a6942b12626848340fb719fcddafd98f33e2992d357bfdd35933c7ac561e5b2f939464338c5666854ca885c4d046eb2c54e48a1b5ed266ad34de05 - -SEED = 81da168f02d46bb87cda845da43f8a6cba2c016878d6f49c6f061a60f155a04a -PUB = aff86e98093ca4c71b1b804c5fe451cfdf868250dea30345fa4b89bb09b6a53b -MESSAGE = 6bc6726a34a64aae76ab08c92b179e54ff5d2e65eb2c6c659ae8703cc245cbc2cf45a12b22c468ae61fd9a6627ad0626c9b1e5af412cb483eaee1db11b29f0a510c13e38020e09ae0eee762537a3e9d1a0c7b033d097fdc1f4f82629a9de9ef38da1cf96a940357d5f2e0e7e8dbc29db728a1e6aad876e5e053113d06420272b87cf0c40dfe03a544de96c7aea13ba0029b57b48d99dcc6a650492d78c4cdd1b28e1a115a7e3e7a7cb21333d4ff80858dfb67782c16354b8716596560d7d8e389eb15a052a0bf5d16eb54fb3e4973ad4984e72a187f5347d5b262c32b1647e42b6a53837096cc78c2a05ce1c6e12493a03f1a667584cb97f4fcd57ee944c65b7eed25f7ae0f3f6cede173fdfacf5af1db143730d18096664914ba4cfc6966f392022781c66a9417ca2680b51f63e4fba424ecfdbc6a2f01787d0e7484f8a8ab390aeaa6d1f7ed325d82feaa1692a4984fae43da87329b045da8f0a4f56b695aa935de152ce0385153720979a2b7006d405fcb0fba09e23b85fd19b -SIG = 4aaca947e3f22cc8b8588ee030ace8f6b5f5711c2974f20cc18c3b655b07a5bc1366b59a1708032d12cae01ab794f8cbcc1a330874a75035db1d69422d2fc00c - -SEED = af2e60da0f29bb1614fc3f193cc353331986b73f3f9a0aec9421b9473d6a4b6a -PUB = c8bfe2835822199c6127b806fabeef0cb9ff59f3c81ff0cb89c556f55106af6a -MESSAGE = 7dbb77b88bda94f344416a06b096566c6e8b393931a8243a6cab75c361fde7dc536aec40cded83296a89e8c3bef7d787cfc49401a7b9183f138d5000619ff073c05e2f841d6008358f10a2da7dcfac3d4d70c20d2ec34c7b6d5cd1a734d6bbb11c5fd8d2bce32ac810ef82b4188aa8ea3cfc3032233dc0e2600e9db6e18bc22b10044a31c15baceaf5554de89d2a3466807f244414d080ff2963956c6e83c8e144ed0066088b476ddcb564403447d9159f9089aba2b4d5575c4d8ae66fc8690e7349ed40832e6369c024563ec493bfcc0fc9ac787ac841397fe133167283d80c42f006a99d39e82979da3fa9334bd9ede0d14b41b7466bcebbe8171bc804a645d3723274a1b92bf82fd993358744de92441903d436fd47f23d40052a3829367f202f0553b5e49b76c5e03fa6ce7c3cf5eeb21de967bec4dd355925384ebf96697e823762bac4d43a767c241a4cef724a970d00ff3a8ab3b83eed840075c74e90f306e330013260962161e9d0910de183622ce9a6b8d5144280550fc7 -SIG = 50f9f941a8da9f6240f76d2fa3b06dd6b2292ed32d1c05218097d34d8a19dfe553f76ae3c6b4a2ed20852128461540decf418f52d38e64037eec7771bd1afe00 - -SEED = 605f90b53d8e4a3b48b97d745439f2a0807d83b8502e8e2979f03e8d376ac9fe -PUB = aa3fae4cfa6f6bfd14ba0afa36dcb1a2656f36541ad6b3e67f1794b06360a62f -MESSAGE = 3bcdcac292ac9519024aaecee2b3e999ff5d3445e9f1eb60940f06b91275b6c5db2722ed4d82fe89605226530f3e6b0737b308cde8956184944f388a80042f6cba274c0f7d1192a0a96b0da6e2d6a61b76518fbee555773a414590a928b4cd545fccf58172f35857120eb96e75c5c8ac9ae3add367d51d34ac403446360ec10f553ea9f14fb2b8b78cba18c3e506b2f04097063a43b2d36431cce02caf11c5a4db8c821752e52985d5af1bfbf4c61572e3fadae3ad424acd81662ea5837a1143b9669391d7b9cfe230cffb3a7bb03f6591c25a4f01c0d2d4aca3e74db1997d3739c851f0327db919ff6e77f6c8a20fdd3e1594e92d01901ab9aef194fc893e70d78c8ae0f480001a515d4f9923ae6278e8927237d05db23e984c92a683882f57b1f1882a74a193ab6912ff241b9ffa662a0d47f29205f084dbde845baaeb5dd36ae6439a437642fa763b57e8dbe84e55813f0151e97e5b9de768b234b8db15c496d4bfcfa1388788972bb50ce030bc6e0ccf4fa7d00d343782f6ba8de0 -SIG = dd0212e63288cbe14a4569b4d891da3c7f92727c5e7f9a801cf9d6827085e7095b669d7d45f882ca5f0745dccd24d87a57181320191e5b7a47c3f7f2dccbd707 - -SEED = 9e2c3d189838f4dd52ef0832886874c5ca493983ddadc07cbc570af2ee9d6209 -PUB = f68d3b81e73557ee1f08bd2d3f46a4718256a0f3cd8d2e03eb8fe882aab65c69 -MESSAGE = 19485f5238ba82eadf5eff14ca75cd42e5d56fea69d5718cfb5b1d40d760899b450e66884558f3f25b7c3de9afc4738d7ac09da5dd4689bbfac07836f5e0be432b1ddcf1b1a075bc9815d0debc865d90bd5a0c5f5604d9b46ace816c57694ecc3d40d8f84df0ede2bc4d577775a027f725de0816f563fa88f88e077720ebb6ac02574604819824db7474d4d0b22cd1bc05768e0fb867ca1c1a7b90b34ab7a41afc66957266ac0c915934aaf31c0cf6927a4f03f23285e6f24afd5813849bb08c203ac2d0336dcbf80d77f6cf7120edfbcdf181db107ec8e00f32449c1d3f5c049a92694b4ea2c6ebe5e2b0f64b5ae50ad3374d246b3270057e724a27cf263b633ab65ecb7f5c266b8007618b10ac9ac83db0febc04fd863d9661ab6e58494766f71b9a867c5a7a4555f667c1af2e54588f162a41ce756407cc4161d607b6e0682980934caa1bef036f7330d9eef01ecc553583fee5994e533a46ca916f60f8b961ae01d20f7abf0df6141b604de733c636b42018cd5f1d1ef4f84cee40fc -SIG = 38a31b6b465084738262a26c065fe5d9e2886bf9dd35cde05df9bad0cc7db401c750aa19e66090bce25a3c721201e60502c8c10454346648af065eab0ee7d80f - -SEED = 31010d1d67eb616348e84792b92d5dc128553cb52f6368159fe7b816cd0e7c37 -PUB = 266543d96787ca901fcff06e6e434491ae0970880a5a187d535edb19db5cabeb -MESSAGE = 39f89a5e7aa530b5463d498f8035b9909d55da527cdbd4de6d228379f089e608a9207a2c5b9c42051a60c8ca3fb97a1c06cd747d9d0739970ceb88ce526f971140ea2ec21f090ba075bf8975faa508b1cc10efa494dc172e6d3d3f3f75dc8e0e96f05c0cccb2f96e911cfa7a2c82c9845018bb1f9d75f82e3dfe1139347b2ac058b014ac93760c90f5567ab5c4eba04b49fb09ddadd305be511dfe05c96ebc86fd67b5d0ab57d85f4fe5e2f0fa9d88a68f0f6b6bc8bb944eb3c0b17557e55d5ea187d922a42813e69057c9b6a7f75e49921b7079e58f8a63719ee3e1ad10cf0e8a70c4f1540218b70494bd029ee02ff9727a7d85d377919ec4051479b70f7cd6767723fe42c1c7899c2b7c1f702dd6b4d13b672d488f34a0e969db79cc2cb2524a948a8de4c5b623ecd90d6e82d97033c125637d1cd8c84803d8fbc012846ffe484f6c02149258f9462fa1e99c307dd0062fe0b6f11eee40c2629ef7c0f6a5107259ea5b9ffb6f29f12c32f7b5228cabc986ab66450af9dcc3da09d0e0b9a4 -SIG = 7b1eb677c3e5e6a8b4ba69fcb7f6b1870e42a8d58958a35c674e2db82107481c4c7b37f0f689d39d9f51e181b17b1108c15a3e27b29df3a4315dcc4faf122205 - -SEED = 8ff2398cd51f51d4c2c57869a2218b8486822031f400729f4ac4d5909c48bafe -PUB = a5a88704b68677be3d16c3dc0052cfee6e2b30e08609059d4cba52c6d96061fb -MESSAGE = 993953e47a341188bc592942e1557af29546e4e9368e2f1a5ee9806e2baf66b6190191fc5d2b7e47de37ff054fb2bbb1f031684ada5d607adda3d65433122fa904e0456faa84109bbc517f8ad39660876382adcfed0f7620cf1164622eacd91eb37a8596462ebe9ebe26bdc1e32cc34ad46fb1cea420e73c31215408e6d35425f44a829b132f631a3f6dd4b873a000667e19eb22fffd5903aaa7d4c8fdf21953c3c6178f5f8cb2aa6bff92894ead835888df060a3c9043026e0e2cef275497e7d105df3b644a98f26bf00105c99413ee0af8851954d65ceb8d79ad3071b8bb87f0b19743d2556ffd9819830b6eebf7ecc7e045661f43570ce9fdbbe2d252406fa90d04236f222c429ec16b1287224ada1a532161ae8b481bcab8d47afb3ed0445b3060fd6759179856f4085c1e585fd7c1409799af693cf427bd1d3dc10b5ae3447a8d2a18dc3a12a6860b22175dd5eb53a0950432e2d7aefece8af0ade3d8567743de43690f2d253723c5d7e48bd30d2937593701cecde9154b7665cb611d7d -SIG = 417a647829c92898e520ff5311daa0a139cd8fffcb25a18e6d9b50cb52cbc35424c39ebbb5d5ac6a6d63f1f53c4df212f7025a8aaef8e36493c874c3ce341a0e - -SEED = ef816c8f5ec34ef41f68831d90cd29e52de8973782d003ee4edada2ada2691d6 -PUB = 47f9b363a88a45053a05bb72160852bfe8f7dfefc2f37283de346752caf092cc -MESSAGE = 9593c35cdec535bebb6965da68eab0b646bffcfbd04883bc4cef90d5d01f018c63c9b0ddfb3cef5e786284d5218caaaf060e9288952f16301ed8a4c1bcee256356a0c8bda359fbaa2782b10c86d18e20f7a0ec99b27a0b4dbefc0a262a3bf68fe81444dcae5f693eb0f16e6ee03f8fcbf3a3398146d20ec4d2657761fd0320fee7ea703c49a6a543bc9bba911e7925038710e8c36552d476d6027f58b2c52ba51ad65ea4f039c78f96b889102bb4bdd69b68e9c3d45b5176a2d82b0b95dc321016370dae30c3936515db0464c41774301c74e42d89b8bf4b9c19ed554b12febac0f60ddb3219ccc5603531dbf2eb5f293425d72ccefa0c7f144aba89347b296be87ff18994b4a0c70c930f059303b5dd4c8fe1e6bbc3cd68c6c0d84246dc6e6140a2abd1780b13f1594a6019d1778b7cbb3a3e3a34bfae7297f0b3edc376941c32352a4be314b84a9d8d6d7f1f38a0ad3798020aa2a331a402be9c704484744a730cbdedcb904b6fde708fbd14bfdc29efd461d1d0b5825de0bc79422b69a2722f -SIG = 65c5d10ea7bfdbb38d55364a9968f82b548224dff3363b2ddcf585163dea27dc63b0563eb1a8dfbee951d3c9b33fcd6bbf0921c3abb21786b229069bd9ca000a - -SEED = 45eb0c4dfafa2a7690ef579c095456ceedcd32f0b6144d0c380f87fb744a0b1f -PUB = fc85632c98384b5f9682aed9cd664cf1f48e588be2d568e5c734494df4c712b8 -MESSAGE = 6f66d847405a03d7bd6f8d2897dbdf04e76d7df2d9470a4996b7dd6db88500f8f4f83e960e219a2486e24545add13614550414d827c41a9b08318daf01b15214c64a4266cbf8a5717ada3e62c26729073e16ddbd66f2d520e1e09935de05e4db11c396d477010aec66aafb762e69238d0b9e76b452454bf9e451e76ac79e6990d41b932bc32917093783c91bc9cf0bbe3b514070a1e692ff34fd06b66ea11f39e10af933ee96d8e9b677cb03737e7964eeaa725f121207f9c1b26a96c616df7cb7caef47bda901368ff2ea586e422e65bf21a691bdd2c13e67fff58cfbfed81782049dafa0f727df88623f2f7e8f262daf939542a187b8720a9b6b2b09890e54876b28a43874abbe3bfa981f8138b772c5d51736885f86acac2215a0b010dfc2c6b150845d4f8296252586a3e115f303c3d8a582e20fd2d43f6c446e5d00280ec179823b7fb4c1b0feb94eb4ef1707f5184e3b52461a7562d1f307cb751cdbbf6eae49ffae91862358e74e9548822b8a049fec6bf4c7a99cabbe09206577b657e31f -SIG = 55851de8e1092f78944f6c6dd95bf07e2dbc8df7f57ad576829b978e3af58a7a8e94ed4dccbc0182467edf0bad4bae7ca84aa9a0c17c61a9e0ddff1d7525d704 - -SEED = 709d2e199006f5369a7a0bdd34e74dc784be33880ea3c5dd10ed5c94451e7972 -PUB = 06f989202ba2cbc9c150be611262aca00c45f012f89fbaf89f8ceccba0b1934a -MESSAGE = 62f003140fa09e0387d187a0ff96c4563df9f4e28c2282c0183ac3eede1312354921f780fca5361d3068d29949630b7530cd5914ace0468d014b6f53d839b82e38817dbf2d8392c3ce3424eab86a24d804c7acb1ce7acfe0a1cda4393924283105da4a7741196e027550047f85b7a0a01d454124efc0e299f0ef9ad14350543053482261528baa56e65999ac802c00a336267c635106b26403c19f391d53bd82861d6d48a4380b3043aa91d649536881204eccb0de20d43e5a3755b7f600916eccae42a0c9053b462d9417a13d67d778264a896e8eaf90baf66d29e5438a716781123a89fa9b8beef91d965af2f4a1a5bd5d2e2aaf46d5c94b7709cdd38d05feee4bfb76a359077c16bc4be9116e69001271cda565bc19bf47d4f986bd9c0d184cd8a3520ca1bdb4b505aaf7cb4ec9f94789779d30714e79116dd5019d59b28b17dad96f4e2155ad9c61274addc6b638109504e9ed19f4eda5377762648c4098224e3391043e4c2ad591654c9e7f974efdf0b0504b6fa5f646cecf44cd372412372505 -SIG = 629bf97b0c78ee6a9c8759fbea28224e27abbb6cbe4dea5bb797e6e0fe80c913f953e3a9b623352d13acf4ce6250fb029a1e198d72bd5e7402e60e9e48ca3501 - -SEED = 5151617421aadc9c95a442b45e7ff6de06a2c733b85bd789fbad414ee3c91add -PUB = 14941d559761b30ab0a86d47e0f7d1896b33784527c80af41cb84810cbff9dbf -MESSAGE = 216e9d40bcdc3b2650188d121c9f8ef29e914facd022fe01b90ed11225f2eb93538e5fcee5ab8045e9199aa76a16bdd0616805660e247fecd7e22821b69b1f8e8a58ac3fb85691d75d5957a1daf53ff9ee6476d7c4bc541e6ad38e3a34ea90fc52a48b9399f92d17c9bb0d7fc3104c55d0efb4ea5b831ff9490b3f79f4d9d699594b741566f2b50a8fc78cc403fa40f5abb6638a32f449a8b3ef029c402f46931ad2bd3e8e683108714c989ae21689e9c444b9f55b81119bb5035bcf73e97ce43a2218c7bc3e430d1e814f34dee057265d3194b9f43875d8381f525f78576e64ce692584faa30fb743a12d1b77614d2e10a6b856b52be27cdb630ba1f0d3a6f8ea9844542e584ea0a2777527d0c52aca949aacda45ad83d16d5c83d663adb79cad6f3e39e990fe282a14c353aa2379d7f06adab74cea021b8983a57f1d0cf703292eb05ece89c53f3a1265610e0c1ea8ddd444d1ffd6bc3d03f0a6e4d0df5c5b8dc1f95d9f5558b118afe6bea0f6c2931363f03ab34e757d49364174f658efbbf38dc177 -SIG = fae4773b334460c77bf01ec6366c4fe61c0cab57d8a4b03909c619e11ee3461c13fa21576f63870e423dd04181e4a7013a7524f246fe33853c674162a7815104 - -SEED = 38bed445556de74482bf5fec0506f9af330b151e50d4774dfe8591d7b7e0276b -PUB = 4c0f9c49a42f4047bfe6885551c5e4b856cf771a67af3f89dbf602f9db9220f3 -MESSAGE = 0ff0031df0beeff3710c6b763f9b8ec81719bfa1528ce46519adf3d3412d93fb188fd497d5d17091c0f0345960dd0eb0c09fc4005173665d4d97f95c13828bc76b3492b87a4b64253c8b5fa47aa75fa3b86d5abeea8de5959a602289136f60a69b309e773b2255cde19ed2a2e199c33db11c16ade08a319750b851d92c692924fc9859be523431cbe78ec092db1129210ebbeaa7c2a2c000eeb105ca0301a48f3e45fdfb15b275cbab83ca5c99d737a585320e9e3b317179bd86467fa9694fcdb2ac6ad36ed7144843dbc34e423d35afd7d8972a1c43c199a191abd6ceba4936d395c995a3eb13cb057f88a9dc9490fe98845ee5d26a89fb642a2a516dc3056c54d3637213363a8628a42a395d942b954a89e8ef7a744d8ae5adac88c616efaa90e2077205a60baffede5c87bb14dead306229495f698f3e490616966b1636387d0d86183f945b24a9dcfccf4d36722cd12ebb6bd8e78325752afa2b1abd13c4bdbcadd170869136826242acfb721de5ff27ba8aa0c018b225ed3404803ce9fa2d508d8944 -SIG = f702d0d463282fc7fd5f8f9029b89c626cafd83450c3bb9dd8f6589f0c4b4b71f649ea212e5e33487c59c168ea3ad83150f1fcdfe8c53eba65adc2023c25830f - -SEED = 055460b32dd04d7f4b2311a89807e073fd556565a4771857d882794130a2fe5d -PUB = 260f8fed4bba30b9e12ad8523fbb6f57f0a7a882550061f1da46fbd8ea442221 -MESSAGE = 7407f96ee3e79c69d36ce1f64e4f188655ea68b947e7e2be97b05ebc6d4439e950276ef3f0e6a03dd48b24f66929b49c1580eb468807e1e7a25eb9b94da340c53f984f8b81603efb61047bf3f14b686d9798003d2f68589a79ebfad54409c71c90ff67c11fbd76cc72c2d145f458e42f88b75d250eadcafe66bf37ffc837b62ff006685b7f85a9d875fc078c82e61fe35d1922527a551dab62f9e477499146bad912203e664c417c3679c02d872abac0032f8cc77f77bfe54d3326fdee9276a48ea4eb251350406882d08c830e7649fe6854558a7513ab2d8d2ac3e5ced8a808d2aee454779edabd1aa63bb19f718f470bdc8451cd9b294941e3497063b1e39b6ca184562fe838cbfeee922de24ddfcf9882c5e615b11bf904817fbd647139db80b4e8feb37f11e1852d7e876db9cb63c94d7ee34192f7200b5bc77a0311ae43b806ebd4c2896c53f58f7ebc1625cb20d7107ef9db0da28788523de991ef6c5866b18d8de83a954d3281e06dbf27c4f2382e08cd0e0f6ebae3f961b77fce5a95a9b0621b756f -SIG = 23f4f1627fbabd7891d7d8489631c7231d22de71864e262ab4da84ea8a13a60feac4dcfb1812f1200444b775f121d7266d755ce9b6a9ad796559c0a26b516d02 - -SEED = e9f6d31b936942c526e0f9ec4f5a7ac25fa789e0c434bcd9199d720c743c84c4 -PUB = 32126d26e28231c5b585b13f43a01c6fe542946b07d3a91e57d281523f5cb45c -MESSAGE = e88133f3d17642d5c22779a85316ba0df34c792b4efee49ed7dd93ca3322ef47c72e5b2e4595c77800434b60719adf54e4c1a34c89fa1e27ee8d35a0921f9755ac4a77a6c1684ea0f5c8ee5f759ce59bfe8315800a67aa6c64ddfaac92eabe6c2c613779784b3affafcc620f2a6dc5cb8d8dc7d74aa4d79494678494e5e6394c433c14809ff40c9a592d0d694a81103b44531e1f48bc13965d15af8bf3340488f8cd58f09ae1a6616bf85ac9de7e0c6696aa2f1bec15e17a44da4a84edb4ec6d77247788ba0de3ae12a155cbedc0da2f568eef0b75a877ea5b0c2c0d4bf2c61d468a46faadfaece35fc263a9be9987f4f7f78f05c707784378c7b8f7daf9ac3a122aad39a1677966da9ef286c9e062c4f439ad0bddea26e54b2f7388e238b2a64928450d34564c5a447e7afbbedd1085f1f24c11ae084322d1a32cf8aa473941f00d56b1618213cab3900aa606463d9f800e926f9f42d4b082d8c5ec3a4a025b45f9aadc8bcbd17091b3da49e9453dc55e89b5b5fe6b31f5eddad10b6601572568d8e205d3251a -SIG = 7e3b1c4c716c808e90b974458915f3b2239c42077119fe270788fae520578bd7da6488044132e1bef23e3b23c34d9c1862744f28fcaecda6cac0fd72b93b6a0f - -SEED = 6bf4caaabb96854a38a572f4ce6c7838f7e750118c73f2723582618e2307f838 -PUB = 08126373d056f00e54b8d43d77c35f5f919833e90d8aafd6c8246d27917ad091 -MESSAGE = 4776e9d60085481fa537bf295bdabd8b1cf632a8cd40bce6bd325c129f977000e88468ebf2dc158ac0f207212db00fb60b8ec8bae229372e9a6b01530a7ed1bc9d389ec8913f59030d5b54af56ae1ccc28f37cc96a8e53204e92a677766adfaada99b0281f867f61ac9ff7d972ee3ed427d72faae75d4aec01b5ffc37061b6f0f7e5714c4cf30d5b731b0746065f19e4c8922dde642f80fe24a3c8dcb2e5f1c266e2af6c37decf55a2baa54f0d5cf0839370c3e0b4e77a4f36bbb3162014933a4a4ebcae8c60961ac6dcf134f30828d31402ae74e7e8513c9d2ad8ee46b7a9d53a1f87ebfce04f461bded1749b6fc4c4f25793525692d7a0e426c84e06082cc3e6abb51368370cbb106c7a0897f66d92c9739cff9f2706d6a2980ecea3ac4945f0f47e656bd9637777e853d2a839104327dc049ebc34f049d6c2f80eca99db7b418424acef752260d2d427949323997cd9617edf50d441d0088b1d47912e35cf542315265829f383f45860d3b45e735bb2f8586dcf58db4f2acfb4a68853a96eed7b89769d365613 -SIG = d2113f80d6cf928486a250a679d6e74b35ea9d26061fa94d769e1a8fbfa0a734227f55537e4ebff59336db141cf5d6d482a0711f1e9fc72ff70956a11b4fb909 - -SEED = 5d9585736ab209b0abe8bf74aca4eea4f6d1650b532550a223e044580f8e20de -PUB = e77729edfd2144b2b12078765417fa21f1594f09b269e9b6706802b4f3bdfe85 -MESSAGE = 08693591e6c58a5ead9c85fe8ec58508f81a3467636c2d34fcc1f466e5c6dafdc37c35cbee35589c6997e2b15448132744e5a1e131bb49bf5c2563f87ead3efe01e88cbf24cc1769c78cdfc167e378215b15859c7a28ece70e188fa330267d3fc57b4ace6c1520ec67875067fd33be86f4a1967afb3eb164c797cf28d8072aa69d82afa38374f8e5797c4c28471b7d69f5b9c7b4acdbc19f3c5c5d400808a982a47837aed1b3841d69890eeb31494e10e3e513d12d0ca686c7ce651778092703fef0dcc0214077dfb361251bdea4364dd41b97bceb0fb1475a50e4708f47f7878c74401e9771cc3fceace89169981aa77250850090d181d8358ebba65e290acb0352bece8c579832a601551816d1c05621ccbbee0fbe39ea2f195393199e69c234c2fb1c37e474840860ce609161fcfce2869574be0d38f95e20f4f8725247b9627b46e834905101ac12b934cbf87cb2d190d2f51490a82c4e810eddb81f956a9f36bda497bca506a49ee9cd47fda5b7f2b884a3648cadd12ab61898ada46ecc970f81dc9f876845db -SIG = e7b08e1d5809fdd8529443d65ada5dd655ea55b5415a011393be7071676486d358e8d2a460ebe075b0e701b24c9e3ab5f2b033592d4de3b7f37fd541f6920909 - -SEED = 60b142f165114143ca30a604fef51c686436aa1b9afdb266b3e398ccb3c4d855 -PUB = eaf6c5a76ca99bf7306498888c3b7a1feae98bf8988d7f2e1547f8f53a4528aa -MESSAGE = 1815dee1173b78264720d35b7cc2454a000a65fff214e2473e20bc83f3ecde9c04c1e0696ce6e55519dd2a75ce0464bf601adc381e793ecb9f8ce7ab87b6ca2a3e410f639069451978d14873d3390fab8623969713c3dfcd58d86d124073761ee09a652a48767f9646cb726ac454ac9a1bc5faed3026b703982bc2b1e0758210e1d62519230eb2b2f4a486bc55168560c4363df5ff5adfda11ac7ef51b18196c94337c07aef117990f770c0f1e8c0f88eb6ffc40e8ed7c3a80a632db1e7f63b63096e2ac49e57792b31143e2f4faabceae66b27471681c36fc1139007f9b548cdc6e3b8fbbdaba7a8adb843431238bb461ba24f6e09f62c72d6377b4048cb0134c25a5411a20bfcfc13e48d80e36bfb0da7e0185d33f1928636e15dee0e5df8992a16572b13ea8f7cf85cae32d529f66e8f6d2fb2ad0bbfe7199169b2567ba00c781b20a48e1d70df9fa3119cd7e5bbe58884b0b51218940fa815f85625fa203471cee8084780eb0b9356f9f3d4f6df740301d707ef1ffb3519e3f90b8064b98e70f375d071426881718 -SIG = a621f084ea1a36ef812a9755c9afbb53dadaae6b3a53fa8344ca40d3612a268a35fed0fd398ab75bcd639c547937c94155ab1a7a3467dd4bfddfacab1655e908 - -SEED = 734ba47033c6140232dd4a7a14f1a7743eefe9070bad9662491630cc9d28c1f3 -PUB = 2fa5df3026d60742e2aff6b57842c7126846c8a7bbe9266efa7b3f2398c357ea -MESSAGE = 5d3c659810c3fea52a6df3861e5cdc5b703cc1cef48558c61d8c51d0edea5a1479cfe5063d82ded9ca681e5748887c40ecfb9e1a9a8b7f8509d10776461c3923399693a78189089178d5aabd15f8c846642be47d6d4caf13824edcefb809868fa72ddf035c4de8ef0a9c832264f66f012761ce6955bc3c416e93e29188025ebbb13a553258c1d7c499c9a4aeb10bb36f61d1bb4cec5ae55d175722b9a9696df881951e35200b9653cf6ed4b3d15de087a9d1c319fce8582156bebf3fc91e0e610ff7a15308fd1d2c6069fbbb2947d3110731d245ae2963014bd76dea42db125cecc493c8e9091a76646577729aed4966fce9699fe12e367d665df9e95a9193e1133e143af92f82b66ac7764e5033178690521809a7107d8ae9b88e0ed1f35b1719901b930ad0e1cbce7fb30267b1155204f605f525e49de2988ea7f74be8815177fd976a1bcc126d9c9c135c5b4276d38019c34aefb7a0220f7f5aeff380aed627b070c2c9e21533bb35c08e394c85ae25e6862942599c65dbae5977a584a88180e0c8c71e5a8409e04ef7 -SIG = 9bd074d1d0bd28001baf7d2d4e82435df08c4264d8cbb1c381183c2f01223f79f94923ca178cac75564e16c7f56079088f7ed885de4d509fbc78f438fba3f607 - -SEED = 45e34d0ef4c196fa6d572b6b1774b5218f7c3291304c13500df7070d90e8039e -PUB = 13a7304dff423359177abafa5e6508d26769ca99cf8af45c383f3ff634406003 -MESSAGE = 3d9ed5c64b75e135df2f5e85300d90f21b363935e2817556fc9311751ba7535477dec8356ec385efb82b414062f35bb6d3edeafde305f9900a25e9813c9ee0237d46409650cdcdb5dfa2301a8e2647f8d3819d86f7b7e3070d33440f82c4054b1ab5edebeb27f95b3c4c6fdd468f21600f03b3494da200bab9293c38d02fc44048e52ff5fd0f7217a04d4ce912a180d1628f368280b6892672e8ff98d4629ac28b60c02a301e6c6026c1b9e9ef21cf0392df225008d5a0e0284b282631ad1710f811615697066c98296519948a7cfed5aeeb454ee7a61cc271bd3d499be17df09d3a0e790ee6b9bd99e1b919bed4a063b8d1a34f1afd2e952b9dfefd770969c8b2fc37977abb0fee6317253a23ecc97578168973334c8f91763ab97f29c49baeee7b35f3ae7f5cd3a4a6e697ef255a3c2ec0c752a3396f69f663ca1fc2b332dfe6c0faf78afe9c68d99571e8e896c5093085e9863a27648a9e58f3a9a84cbbfe2b41ca3633dd5cf6e82cb77cecacad8d78b353f48db42d99c36bcad170ea9e98abb2788c33a3c706268f3631 -SIG = b42c1f925f4baccd129efb109db354aca31c6898f4f451294749a26a6da1677bd3a5c04119e35f47319f20cfdfc08bb4528b21009e00bd41ebc0f46863bed10b - -SEED = 888ce2ecceda9ca2b948ac1443c2aedd7595aacf36edaf27255bde7a6991dcc0 -PUB = 016e572b4f98417c6ee297abd784ea48226ff4fbf0050a5ade8806e7046d3ba3 -MESSAGE = 5c801a8e664e7660760a25a5e1431a62159fc3f3aa713780ae7cbce23b8564782799bf2be4817ee2921965bab7e1d44833824c1628d42dcee3e46ae42b2816d0a432a1ab0bd21fcf30adb63d8dd76569544343d0035c760522ca68bea72c404edda1e9095ec90f3325681c6de0f4c12d1afbcba2c7871a1b1e1f19c35b0bed9ec2a87c043d36d819396bd5d099e1aa090391297c733f65a8c5d2120c67635316fab25b4d4847a45fc3f76f2e2426dbee4629975062fce14e2189dba27fb1ded2453f001debfaa899c11660612d2ce2ad2f762ea5dee7e71e58adcdcefa79e8e8b27fc4ccf89aabf176b5d34f82dd15d889f9f087dc9ae8a42a72f3b83583616e170637cd1adf38aa6551cbacca3602bdc7ae210c4a446b3af8db2720e549bbedb8bed215ae00f19da29d8fb0b642d27b2d88575f0ee84f3d129eb774d20f537a1c0fdcf717bdebcfe47f8331a341864346fa6a1c6bbfd178819e387a0d5499a68e81cc9f82ad39e31e4dfe71952d5ea5cc8052a3ceed1751f59dc7ecc9742fad144e18dda8d0582e74e39ca8c4 -SIG = 99d83f148a236ebbef1cad88cb3c7694f4986c9250e21c3603a0d941bff199cf77d6ce99efdb20533188d68ad133de033a1fb3468abb706d2b8b4fbac08dfe03 - -SEED = 617390857dc10cdf82b5c94261f58ce2d44aa2f57d298f08a2d6c74d28147daf -PUB = 89e0c3e0a0f130d1916e0e3849b7286fa2e3ac4c17bd1f716ee5a72f0257fb8d -MESSAGE = 1fd9e7453eaffd7c9b54055622dde170dd58b71cb945de75351d5fceb1f536bde25158f03786155f953dc207a1708f90d95b15aca0aee3097fdcaae85e4ab1c2cdb705c53e6c2ed21a994b304a75caf2ce4fc7d61f561e74e297397e2cde5cc69056940343aa81375d0af18d17d2f34c0a71dcf1de3c4fc488a14c5fa6b3337a3174b1da7958fb00bd5955148221427c60dba04117c80d2488656dbd5343de891287b50ef4df9825eda76b4977f3acd4ab6d3102fa56878306cd76561491bcfdaa1da567e677f7f03bae5dbf4426c3c4a6c3d082f9178b2efdd2bd49eee97ef4dcf3f0f51bbdeffe5ae6601e28019518f827f02e51f6679b8715978bec3e69d577156dd719959371baf034219fbbd17a2369a8541490f6a02013e33e74f4769be37aefa4defb6bfb3f351c2a261482c2fbec49f85f8445456e8f5a474030cd72d095ef6a622030e1e43a0c5debb034731d2f5e8e4ba3990f077d0c162649d1fa3ea4fe1e81d74aa849e21b059d966cbad4c493ca10bafe7a69243e3c0a6ebfd13d697906303392ba65d4fe06b6a5 -SIG = 63e90a6afbbbb0ee696bfb56efd679d68a9851a8947640a97f41f68edfeadd216ed8698e2e43c820c9044caa7adaab5b76762b681831a9f760476a8443c43c06 - -SEED = 877d017436369ec2453fed46e977d6acc3a7be60d31395ad6e7ea9e07480e4c9 -PUB = 4e65422fed334a55e8b673893eba7c181dd724dda002817b0bae28acdc3f7fc0 -MESSAGE = 4ed3f5bdbd41d0e3b0a8a7fc3752eea496d6141678cbfe06757f61e1a168d761b6da83052f7994950d24626f004fbe9b8c9562e0c955fb3b5c08fd2d3d258393a349030c8e156205b40483038be1959f1cba490a87fe13899e4f3752063b68fe3e1c5071f7db0002f01494b4a3ee2e07992bdd200db4316629ee8a95ca347f0b28d6402a6da8b53e6b32581c3691e11ae9b6e0f0494894e649a92d03eb49c4d6833fa1f54f8dcd91d06936a6e62d491e2cea46dd07d9f02d3254b850bc9749f258a61ad3b9cc24b03287331b85a24143aaf8fcccac5f18bfc72dec75c0233516aa6e4589c78c665a186ed902091df97b0d04e83a2d74d789891aea2cacf813fffb5efaf78dbcd7af54ef55c77b1c4c8ace9e9278adc23d76c779d64b3bbbd1fb33b09836ea64a71e4711e89e8da0f709213342176ae22c6e7852c3973b60d9f98889b442aa48d7bfdfdef64c36c586c4fb2ad2e27ebe479f6d722f069fd6106b0d08975d5f721547c3b9c52f9fc5f45bb45b5b632188e80626518a79056bdc4ee1d2be6c6542a21fadea92c6dfb776 -SIG = 7688f3f2401eacaf2dd88e170ff1c4d7e94822a77f6b550b569e82152bbbb434057e01230b05ce58ee1dee5226b5c7cdbe5a8ade3b9465f59aed74145d14330c - -SEED = 4f0b3607d70b0f2698327ef4f1982c5b4b94be78f50c76f43bd642f1f0ede39b -PUB = 942b43089fd031cec0f99e5e550d65307fb6c3e793449fb390ff730fffd7c74b -MESSAGE = 9f700a1d2560f69d9bc105bc83bff539e4258c0248602013a959b978a19cc273280d90c0178089578b50518e06ad1eab790ffe710c63d78887a95569144f3e58a8837f93dd516fcddd22bc97a7f14411d424b2e8e9aa7c280119ad94ce92533fc7fea6c66248644ac3e1beef2553a6f61e91b9379b0fe0c68b40681455b311f40df0c97f53fc954242c375e7708d61bad9f51296247274fa01a7328fa5009d9995f501ae8683552b11a49d2638116723b1319450a90138d278cd9512b80ca5792ed16c683bef92ec87884c9f07f137dc47a13146e511065c2e1b4b80efde88ae12e29431beb7aee365c16d80506b99afa6a1406edb061766875832dba473e519dd7018f402eb1bb3014b7cee4f02e980b1b17127e7d25dfe0c168c5344f1c90044f827707dca03070e4c43cc460047ff62870f075f34591816e4d07ee302e7b2c2ca9255a35e8adec03530e86a13b1bdfa1498813098f9ba59f8187abcafe21ba09d7c4aaa1ad10a2f28334ab53996147c2459c01b6a10839e0301123d91a35ced7af89afbac7d9cf8ac9a38ceebef83 -SIG = f396a11f2f03c61439684f79001bd4f346a348dcf1d3beb2d3bfe33ea73a5ad4eb97506acfbffb784e77548189cd599f8ccf17355dde80e75024ef2a78d5fa03 - -SEED = b8a0010c784d8d002a31da11d022d30188a4197a1d5f14ea4c0dab29a2e40668 -PUB = 8bdc63e50bede13c91a41e4b4b7857b9e553f484e3c1ec167dc04c281ea86622 -MESSAGE = 5c6ccb298be216808b811e56d972f456b69ad39594eee354701ca6b3e38d1f41a359e5512af98a3a0873265fe5191f4f2ecaf66bee75a3ac0b71a4ddf2a759ebdddbd88a6a1c6fd0fcf7d7cb92a84e3307b4a4f98c710abf4f553dee74f652d2ac64bc30f72bf4354ef7e806a19071a051bcfcfb27e37fddd41eceaec1758e94695c670ef4c5a5902178329db9585c65ef0fa3cd62449bb20b1f13aecfdd1c6cf78c51f568ce9fb85259aad05b38c6b485f6b86076928ddb4e2036f45e7b9c6a7ff24ae1776030e2576825019ab463ebf7103a33072033eacbb5b503f53266afb82f9b2454b8dc057d84f30d9d2cb7c3a31a7dbdfba5b8e49231c231396c47ca042c8e48a1a5e3ec9afe4020595390f9990dfb874e0825ae9ae5e752af63af6fd3e787e75e8d8dc4c66302277ac01b30a18a56cb82c8a7ebdc915b7153255a1fedc492e49660262bb249780d173e1fd20d18c4f6b0b69aa2eca024bf3c80d7d5962cc4a129a7943b27f33cc799a36045541275a2cdb92a40e485ba8b737a04b43d29c3e25f76cb3d93a6b94461f88f5696 -SIG = b3f6cf4c0e0f9074ff2c2c47e163202f1e9d6ee117cf757633e4abe74423aa70008ada1509ec1dc117c1c230e9b23786f3d0f29b73aa284536e9580106a8a70c - -SEED = efc86cbe40363abfbb2a4b1fcce5fd6084da96e7e814de71aadf9a618f303625 -PUB = 22f295cee727d28d2b9317153e7d9412da1065c1b16ae2a251dd1fb431c62b01 -MESSAGE = 9e4fa45dc026710f6bef4ed0f07c544b0bb0d88fa79e7177d8448bc209d71cfe9743c10af0c9937d72e1819e5b531d661c58c63141ce8662c8839e664db79e16c54d113abb02a75bdf11b3453d071825bc415741e99483546b8e1e6819de53017092e4ef871f1ca0d3508f937828a4667db11ffff9416eebb94bf9b84d654603094834a99ca70b90f562a86823624dfe9cb2f9e88c173f13464d4ce255f222db50dd63ab42465734e75295c064b64cc3f15e6237e37f33d615f7c243e4ba308960cfd4393402525500bb7902970b3931d48b35666a2d4d2ab08fa12af366a004346c9dd93d39fb1b7340f104e51fedbb533605b5ff39cf6d59513f12856dcfa198d793b0fc875cdea0741f1455746d8a19c3e9d928f0021b01c25131811e48c3c75c6f41422a8810c6c81f35b454eeae8cd17cf3f2e6f0bcd9f290984f496578623ab8e2738d2d10840eb91d101cb4a23722b72e3dd185440c3b9f44d46a393a34c187a20d610bb698c50531741efe96323512329800772a408065a7ef8e4e4105eb1f5bf6d3fd6b217fd836d89f53b96f45 -SIG = f8818310228ca76111524ce94bfcb0246ea63508cee9306592b2f77548edefcf76bd1454508ea715042cec169cea5115ab54235cb1097b10702aa38378028e0c - -SEED = 33556c60de2f2c9a9303b99add378592060505f8e49861085a4b15f072a7ef28 -PUB = 231ec8cd845859f69961275119dbe4f715e5ec5aa98bb8741675b3c2d0c89fee -MESSAGE = 96af540ea2b1923f5fd0aad321ac032070c2d65ba13d164e75c3469758fcf31bb31655cb3a721f9cb34be2c90c77eb65be37f606d32a917a4cb9a709ac0705229930ef6eb6fdb0fa3c0fd3a90ce171674ee3ed06354bafc3c7075467a57445b80385640447902be39262894b1f64fea58287dc322d19875972a7c8be91d31f021c70eb682fdf11a10f8f582a126e064794838c69fdf64f5b6e8ba59d48b4384f8e9fb5c087cc7738295cd32344ba3b697ee6b6a8b78ee7a9575c97972a4d1bb18486f9037a0f3c6f471a90f86498dbc0df5232c07e8c01b690bee75302992a7a36fb4437c25a8bf5e34cf7d5b55572c700a079848d381364f9946a91eb1603ff3de5ebdd523bd92564818e237a53e8f522deaa2c29b897e961586e100ed0fc0ad70d160934e694027e5c957920bc0546e901be39a84535597e1f280c222267abe97f41205d8171820dd2faafc0699419321a9160f69b99fd41180945b62d2dd105cc7bbe821d28605e098edfa8b2309aeb0534e756377f59937c67463fd87c8b92ab58119cf4ce6c665af572fbae1de4a2cc71 -SIG = e06a7a414457bbbef2bac3775ccad087dacb1fa4bf938894e8c929118e09e678dd19938bc88f43ed0f7d31cc6a0e602c4e4d1fee33d41e74a119fa2d1e4e340f - -SEED = 7a5c74314e1183334a4b6226b9a82d70fc2a124e3f87db6a2283ee05b68e34e0 -PUB = beae7d3dd97c67f6273bfaa066131fed8ace7f535fe6464e65791c7e5398576c -MESSAGE = 98bac6724755912992adc2a48b5442376f2d927997a040fb98efe544eb0c8e1866b9616e298d3360316ed976bd946a411fdd3a6b625c0c1a37af0f41cf6569a7884ab8467491a987df3ea7a0b7ebc4692569a34ce3a2ea3503495b2c02d49d7d7db579d13a82cf0cf7a9547a6eaebe68e7267d45a60b8d4772455228cca4036e282e1a1216f34cef7ea68f938270bdb04293c885d005f9f7e638a8b4ead2626c0945174ff2a3e2d6e15a4c0338c09e1260f0928ca9d3499824f3fedc4785da49c5c34a56855e241facc6347a399ddcac4399a8b158198c151461a3b189e58ec1f7efcf2ab2031fb17b6f035ba1f092e9eee2e92c2d6cc2032287f854b41e70fc61c8d11a2e4f0708f02eebd02e8c7e8c7b38a57bfa1a745f3a86c23909f6f89ab16ce7e1813c1d20147f31b4cf2ad0b606fb17e5ac1ab51ef4a7d8093cee9a655f471dc5b146bd1b93e540a3d3d3e2de8105911c10d6ab5ff79c2d06027f7a54561f2071414bd330a8785442251c810e232f83c367f0be7799a93f5238f7f17b5be829fd89123c04833af8b77e5a4363047ceca7 -SIG = c2ab1f6f5114a84f218502582c567b37a8bdbcdf6340fa4622873be89106f0a90b4829505f72129df0ab3d8513268774a34df3ad21ce254b464488addd6c9b04 - -SEED = da8006adc492ca5dc86c2959437a75deb6120ff787d2ecb9c20c30b52c26bc41 -PUB = ff113bf0aa58d546f2385d444ecb7888f8caba43a174a89fd6065f2b7dc17bf0 -MESSAGE = 3eb4324dbc0149d2e7d6df632bb0cbe9a9f6dfa83e227fc07bde1b577b3611fb921c9f8313f068e6295d4913a8196be530f6a01f57c09c028491444b784720e909ea1fb69c1c1dd6304400327b7731b33cc46deb046cdab6ad1b53f1749a0c65cb9a7e376ffa02230f536584aea243c639103adbba764321649d7e0126f82e0b4fd9dcb86c731cbcc517f2016841e916bcd5fde871dc098cd913dc546284d1b2165c63e88f32a2789a500856371b50d22fb8c87d1a3caedcdfd01ee5f870a53c284181d632ec66d48b6bdd5646ac39c9e75338a520212062bc3466ef5c58765570b905f63a93d07f8f1baac3526b016da799f3e9e03a4f7f81355e0f7a76f30a42b807322051b71c626a7a296d75b9d9d1a23bcb13c9ef48a912dc057325d3bcfb3f9fadaf0c249b102aeb854aa3631e34f69ad90c2ab2ed33bacc40b9ed1037fae67cdf799d5a9b43785961127d62f8e0bc1589fd1a06fca2aea7cfc012cbf7b5b207ddc4e677d8ae4aec100045ce36c00b74d1d28250791236dc5dcc1ed313c8c246172666f75217437c6034acd64198cd96df2a -SIG = 1f5375dcb3ad2baaff956d8554ecb424176be9a6eb9ea54e814e0a73df2a5d848ada26ba8e1805cd51c5e16950c1ff7d4d2764daa6f4c7502fb865cbe55aaf0b - -SEED = a284e26b97e538839c808d45bde6f012a354454aef81caa8c55914624f2b7d66 -PUB = 5ae46e34695efaf463a4208fc4e35b81f2c63593238a56f2444b850f058c3c5c -MESSAGE = 9ebfe910b50a5cb719d95b961e5905f00ec7943b55468ab5956692017645b366071f8fbb77eb49ec73ea7d64511405b90de22db98c3eae39c4039c7a133430e8010bdd39a00fd1a528b113dae149cfad3ae340da27dcc507782ecd8929237517afe7463eca2473c7acf6f7aa04efc9f266ae7b6d63bb8cc2a438b344827f0713d1f1736f0cbb65b99353f20355fa0230d4fa707328a8662654e83ad0530a10f9a69e17c099e1e2b5db18e5f6f1dceda5883e8cab79701a5e9089562ed153ad08c674f097c28e4d16633e092969a8f0bdac54527c0ee03bc200e5be612e3d1eabd87091101b4962afa07b310806992f373076d76a58185118137c9d26ee2cd4c618c18283dd19f0e7a089ee37305b6b9518a78d8098436ef62be7d699808acecf67939d61b3e02937cd8c5f1e746d4274334bc9c37fdcba234c166fd712893f3a040832ec5425e57d80f11ef9ca5fbcd6c147fbbf5e2fae746e0ddb605867e3bd050483c3cd1329abe57a60bf88898dc7e80ede0f4517de8fc807e888b621a00f663084ff94b99996628f3b11690a60f0918cb5c9a7ef -SIG = bf110e2e9cecbc31fa3e0c2438cd1f4321f92cd287005a48528addf76cad8d88bb22719ef91b139562a1511838682674faa9ff7e7ade6c9d573f845036d18905 - -SEED = cc97a96301ceed0f922731b685bad8ad4f06207be340f5a44fd187f29903ec20 -PUB = eb563a7bce12db97f1891d0f610bebd55101a3125ca8dbb50b25a6b5050d3784 -MESSAGE = b9ea3b3df7187ea415a3c335e0834e10f440915b2ad41c71f255d6950a4e9120e4d494fd9e672ce53206fdc417d865897b47ac1054e1ca1068195232d4297435e44e1224e66a912d9d7d182946ff5a9f085bb8ba19c54d16b586a9b30461b6773b93950311e1619886f5a5b3f111aaad094bae31c48f1941080968bd0277bb6fa92eebf324b192df5cc969516c78c7b2d12159b4d1c8eb03160c4cd1907f62ed4b854c569ecc481c08e636f44ed7c390e58b5937d2906b2817bc3769dad9da1b0f79391b55942063055da0d6f249a3e452baddaa032998d7f73398ccd0151bfc92c5e2fdfa9b14855e6b0d3746dce248e219672987252ec747df2747fd3fbd8b714c882d707ee302a904950c34754f85350e1aa3f8ea6293cf01f717cefb6b83a22126df5c4f5698aafd06a2244ad7d01f34017ca0ece6f21040048aba6ca4aeb04325b9402bcd43ab130a105788ac3d7b7da01ea9426dd0ea1933a8189933a6c0c6cd648ea316a7469a5fdc6e7c934d9186586097b55dd51ac487bb80ed11d4df8d33626bbce95e4f13bd49922f00c920223f4cbf93cb -SIG = ffbdd3244181cdf6034f4a450fdd95dee4971a933f8be022bb0a4106aef39af3055b721881c9b54d1e99b9409096fbe6dc2c9966e3679964bd7ef4c808cabf01 - -SEED = 679e3e34773abe4ae25cae7d07ccd0eb3b0ec0a35d570257d62570de58ea2516 -PUB = 18acffce253b27259579ed9924f479cae312167bcd876edba88b5d1d73c43dbe -MESSAGE = fb2b648ebb16688244f78b2ee9a273599d56b6198900d438a9e99c191425c72bec4f235847e18e47f57c3cb396655f778921f908580e8e83c96c108b20dd416678021bca259b98518fabb2d3532e4851d9d52add2542c0cb3efa3857a17e512438bc0ec4762e2f9baba429c03e99bec4038e6b0ca42bff5b233b24c333b4caead2de374a87b2ab5d80d6e49e4456329d51ae973bc83d7862f3d315e514481b12854a9dfc09e7d14f0d022c0ba3022578eba8f874deba4aa8c833f2b132861d4d51e50fe9aa4b787bd2f051aac50c375390cbbcfba2002b80ad00cdc12980f8ba8bcb7064afc04d5c4682c1029b10a6d45fe6ecd704245faf598c4659597c5d68a192cc1cd4fa45e84b549e8e5e67daa879ae5a520a6b5550519876a562ac49c6db0aa76ec69bb64dd6b5e1a3af2e131e722e7cdd05be34b5fcc6259aa124ccf814cf5b500d176be28ebc40bb21f03e24ccc131e0f41daa1ca02e6b00c9c53fad1248614e940d4b237760ab7569a767b7515dd2d623e57a2841b7d2441cf43049e4698d2f9c9eae7b2910f6ad65edf9cb2bdbd9b29f606e0d -SIG = 1a51022628ccbb88eae9b21773c3f830b7b6e5bc36c9903ce70fbcf459d6a1ed8a1dceff5b19269ebf5a6fd3d8958860f554461f0e9fc0e29af9b1fb1744a80b - -SEED = 9bfa60923a43ed0c24e2f12f5b86a0716329f93d4d8d3e06238002893278c19a -PUB = fb1c00687781b55b893d6b2f4f49cf5f73d2903c316d1eee75991d983a1868c0 -MESSAGE = a99028b0f4a3aa5e79abef6c0df4a783ef470f1a29ba51eba00f6214e840fe19e5b6dc6021ab599bb2ee3699576015d79a7939af823535b630e3938c723f6e0b9229d46bb3379acdba587c238567e3d89bc3bd3519b727fc694fff1118bf22c8bc8bc82c4df7f5ad38de05fe9f762999ecaa795f3ae630a9a316d26dce9f1568ffa3f22b0295214020b3d3f5337c149568192218132a90709279c01d23baefa669e1c4e42038173f1319c212da144f1c4ea4c52c005cbc0b5bc283e74483a0dca69279deb17ae5b29cfafa7d0063f4e1bc93537efd937e58a8aca737228f937ff2a741890e96c5725da11b45c413a9bbb4180a419987bbf046bfd346295d62f081c76daf2b0e1eb4f6712feebe6f0a92e358e7ddb85896507c340a01f68d1b0f085778b7c44b014aa6673e501796959a17a688db0959058488a7112572f23cf9cdb53b5eb4b45f5953ba0c0c690f86bd75e89a047bebaf847c1dfc345a4f3c7d3beec98b84b0219003e819f5c2adb45f8717903d1f5bd5d71914c56fcabc7a290f9c41699c95584d6a3a16340cb17baa1fc5e5467af7ac3221 -SIG = 55f202efb2a57be8b4e4fd894dcc11a4fc5f8276618ef5cd34a4495adb016a298e6480a35cfc53edb25ff1499fc532a33061cc01a250458aa5e4f7f16f51440d - -SEED = 6e3af45e66e22890c3f3c934f523a4d69427976e6e52625f8bad558993963219 -PUB = e097364e76ff9f2e1d167f6b20c1bc5830085e7ec993c138f8b1b2175637e741 -MESSAGE = 5cfc2f4b559f8205b39102087617f4d86c7ce6cb251e5f89601dfc88ed28e8d7a670ec0087d2ea5d893021c7044da2899a22d776fe90170e51c203250690d37a294555e74af9234cbf1ad8f22cee8974828a0d09e9554b71ee3bcf880ab98325f706272194eb2e80c701d441b5f8668561b88849f827af703ab0954105fd3c54b3f6ec5493596d0e3bc67818048310c4a3e0c556bc80675f201f9bb9c6538a41d99aa40c886fc431467218d819c23e78498aed0613fa6f973e2211df9fb87f44116f3fe4c26d6cb2fa334c87f78c08ca8c9b9041d83a1230677e0af788598a42e44cfdf6964a4ee80e38402ba67c73a581e552baa2282425cb2ca17ca92edfbf98299102fba761b9b71a5452141bb9c18dd95febc2a782de9ceec08bd2ee3f7f0c1bd8946dba99cf9ea086abafd37c9ca60213f0de17c61ff9c391c9818ed5cd8571778b7dcc13224962386fb8ca14f861e99f3b18edac8a5f130f7bfcd45d045d0ff34c81572a512363d6530f93813e5fb10e9cb8338a7f93800491006f4463e89f0ed4530e5f12df674f598904780ad0812b1e3521fcd0f83e -SIG = 26ba562e8a4065708207c25e239b780aee38794cf983a37acbb9d557a65ceed3c0da47d17f3e8b8f4eeb1b65a2c182ea6f29623b63bb0f1c72592683b126b901 - -SEED = 5f1f271844d9ed5a6a6f209a21408daea470f6fd53ba6479d7407105b7de4d65 -PUB = 6085d7fb5a9b2ed806c1fd30a2afde760961f7a36b48f4875246e615a2bd9928 -MESSAGE = eed6b4475dc263bd2207fe9d41d48282b713f680f2e037384f18b4bf224347f5e4c4b060b808d412eaabcf733dc39a40c6bda0505ce71fa823bd1b1794847678dc034e7999c16369340bc60c64d09bb9187b2e326055a053f8e505ea4196861471622db0e46f0f8954d8a1f07332da4d8ac55712626009912f8a15a9cd63a74a03c92f246cb63cc73f92e51dad1bc9715b1ed3fe5f2e1b2959b9b71e0e37360eb29536cf797147fab10864d6146c36b82335a0ce931408479c7ede484ff73e2dbfffc6c9227e16d7a23f4d90f15584514c39594e17bfbb295de9d62adadb589dbbe0b06dc8dac5b3bf517b24c1837b39472a6dd38931ffbbff5b763638805b4e22321f7afe92cdf502fb63d109ddcd9e4051ad6f45598532be179523710851d3931e887d02c345c79c489fc106a4ae162f7df71ab90b751da7038a6df7616cfc11887e21068fb9e33be566402be504f3fc2742b881509bd4fe6a0fc722649883f8cb655598a15a1d4c229dd86b5caeb711a028defd431154bba46b48172a4d8cbd45bc90aaf874b6085fa284f5fed655ad6fa17d67b3b9a796fa3e -SIG = 319bb4deb2178112241b3fb8f46e105c3b8e4ef721eb200d762ef363e2716f2a89f80b5b9e89970890a09892ad6a58808b477e943b3cfa77774a3645bc745f03 - -SEED = 048ac9ec3ecb30a3b1bfda9b3b79a48c0793b490879e3c8a5e23ee2babcd9b7c -PUB = 946c186feafc3580a58ddd526ff229c04720250f4cf6bde0271eef9b12b1c3f3 -MESSAGE = d68be8ef7b4c7a4289f2b18b16ade97f4e4fa16452976afb581693380cc54de38a07587f32e2d4549f26595fee2393bd062e9b00bae72498e4148c8b882a8840e15b585c82b5c0defb233518409916615deb3a55a5f84e6b3aab93844de3b1e4d86e09f889ac71c324eb12d0fbd861cc31229540e843a34f8d5be47c0ec0d23df43e06813fca309439904c167d1043c0dcd444b004be1ff27b7862b00eba9433b94b0fcdc67521da0c1d5358636c78f530431164dde20a1cf164f51e29b8e63eacdecc869b41392c667664d91680d9ac516af548f09e60564e814e36e0b563dbae55c627ffc14158a56d8eb3609e174381b21de4ba82344466dd577f4d1103c43c27fb83cb833d87afdf7412b4090909b1dde264daddce967f496bf6f17112bf351e417db5953b13b8f0fcccbf30f5bcf376861c12ef20eec89ed23cf384ee78dc6eb40fd5811a7b23927c13e7dc5da3a921b883a9b2b1155970fb0da7d2993dcdfd4343642a9d5a6347e43c193b5793e4453ac1537aa3d04dc9f774e840934881d78a39ba250438c507250eed2f6e07cc953f783d6b72b1cc619981 -SIG = 2ecf5b8a59a8e27d25890a2aa32f4a0673275d539b174afa7b2cebf2e76280dffc338ede85ac8f614039560e2806d9e1e3cf9cce2ceb7874ffe1a7e80cdef40b - -SEED = 2f057d20b1678531611f48f003b7d22eba5dbbd7e2dd41b7c79d09071f85e993 -PUB = 620fc4eaa34d787df675ccbf7e893204828db92ead17a1165ac7fa1ab42719d8 -MESSAGE = 6e35f6eaa2bfee06ea6f2b2f7ab15fa97c5180958af2e90af918adfb3db8323f447c7bf26dc534997c38b7fc977f642de288cdf253071cacf3564e3b8ed6dce57ddfba9ff783bad2e76df124828fc1031acfadf01a44d41b42161ad9060301c1af1928b9e5b73b9bd21cac60a842b504dc3cc311c522e3bb048bf221444f53ceb08e77e948590e94ed98f1b604cb9eadc93bbe7431c1149b23193ff93e8569f113e1684d8976ecae6f09e0103614be418a472ef55bb8890d72b341cdd7505b50a45522ab63ed791ce8f82feddd7a620a4f6fb1d2fb0ed0c4560d78446d83b3d1b1bb56b366d196020d0624b1fbdb75ce735dd43e8e8df163c44e236993dca341f5132d825d0a4e393a19d38f61e11e0cf392cb9b646ea23c58099824dd8d9fbe26a49e33b23df80607abf19715799c19acc722ed9bcf94a0c29ad24b78b0b035b3241c64cd86edeac810e66745694b5eb1625060edf2d949de0d34f522df2dc60ae694a193f3b82c1d6f83a0cbb840f46c49a3d7d1cf06deaf96c64f8f9e17bd9ad512ae6309c486d9e2a78dceeca473a0421dd1b643c78754271b53ce -SIG = 30df7b0b1c04fb1efa3517e928d6d57c2ca0d07f4e04ffb1f08b4792c5937dd271ccabdc00dce850afe50af5990f224e8420a681d95f9f7f515afec102efd10e - -SEED = 3a3d27970fe2acb6951edd5ca90dda0fc6dd229c0a56df6eb11a9c54d242dbbf -PUB = 564f0dc3dc4720e68e44dd16711e049e6112000098fa62a1b98c288042f7c3bd -MESSAGE = 4374f61c2cd88a3b8972249bfa79b36ab69e3ed484cc60e5d9541fa7686cf4eed1210c5d0dcf42dd25972501909193ca76ae6eb7f471d8bd0d5fb5a6b431bc3de0e0318d50514524de87c4b83005dfb41245fb1af79b84a97b83d3cac7ad7a53364e2e9b21c97b769bdc57f0703116168380f3cc883689eb4a7fa3b26dbe12bc28f8c40381af64df4b5361d174cf75acbd46428740b0d1322d32bbe94845215966ae588777a8c05336e352306d49278d328e496db65e9ecf6ce6405ed1c893490bc48c13a134e1fb6e80debe6d32fce6ef74783c8d77980a441a26aeb4fd83cc855352cedc188f5279ce211f744a40b23ce7ff24437a1dd3373ec5b290da1f94f43a07a3ffea5b5f67b52c196185bce9e9a858257fcd7a8ebaf9040ed091face5a155aa447fa15e12122d25e8fc36eaee2137c7b3aa30b7e3ff6cc86b6dcb9eaf49c9576f0f462008439cb1a3aba013e897a0faf994cb7d59ede5774bb144774f73ca30e6414a7cc7c74b20c51a1404ddc419ef7624593e9bcfb37c0a762eab68faca5863443e16edb759dbc8788732b9e4f59c11192c3fcc872af55f32d -SIG = 22eb8ea0507349b6a0ace25cf9180cb08e0357b04502905fbe69b4e21b2bd94e22cfbdb851ae716a5c253c70d5e2b24ea78f35bc213292543d94e14110b24106 - -SEED = 06d498318da456242b9c3b9ab6d532a128fce044f53882682e9262149c165288 -PUB = 413517aa63200a17173209a4b3e78ab9383cb4e39efd6794c46a2d13fafa99c0 -MESSAGE = 3fe30ecd55077a6e50df54bb1bf1248bea4063e3fa755f65fcd1159ee046efd0eb5f2fbb38b5c00947c97dc879b36b9e536192286086d0dc12053610386174a7c56f22a85b73ff208c5944f393236c32415809da036e73cad8fc3c30378064a76afa930a3baae9aa357061a8c5e8e756a9cecf94b72df43facd88fa49cb4948c6368318a6b1e5cff52e587ecdfaefdb69081f28c2d13bf8eab81dbaa5e3728c4317fb793dd196bca0fe54a6c242cf26e2d129ba0d82a2c3a45bc8d1dfd6f54f8da4f5189c91ac214fdabf4c597381b2e5c40cc71fa7051cf2ea93906a37d57df12d5c7e5cd77c907e442566315bae51a2222d62e3f42d1767882637d66a1d5305ab4010a0e49c57def69dcea839e1b76a41135ba952cc424950e8d3aac19e1d93de7757c15ff9997b3d2a8613cd9a164781d1be331799fa6109cef614305a1958f62903c8c9ea0b23ba706d49c54baccc1e63cb4bf14785fc7b062a9800349bdb0bb927260b677b60f10e62c8780f3ebb5eb6ff0360263d457ab52fd1125c9ce046a95d89d287350c804cfd4ff2b2ddd18a9e13519f20b4d1e051af624640f -SIG = 8250f76dc599c5128787e4f6d3da23173330ce3320dba959bd714cc8cc07c67945d63e75662c075e267460ab7bf561f24faae3b41dbf676899191e3b02b5af0a - -SEED = 8e8e1db5b1102e22a95c47af3661469f000a33f13b8b87b115d2452a411f6f39 -PUB = 56d7b3169a95c22998ec937925bd7cad13cc65808cd5d34a6c4da870eaf32364 -MESSAGE = b24634fbdd1b7661315d9dc153ba90d66a88622a4158f8bcff25ba9c29e65f297f8e60311800b7331b69fc20c9f85bb7c184bd4086b3a9f9a27102b62362bdb4fa5b201594250fc628fd2e0e0d1be03dcf818c6094c4c29121cb2bf6d908ed8aab427c3771c0c95f0ac1469a0810b603a470282e5980a60729197fe6c20ef681cd1b96932d2058f896ea7416422a7e541f224a5f04253080741c5d4e3eb039db6ba051b4ca5417ce8afdc70214ba4dcc85b623d11e681c6009aee4e6130a83edd0d2c99fb0647e11ede7301ae56b59904ef7025732cde038801ec7e8d90a9a1bba047fe628351b3b89d0bc5ae665a700891f09ebeec05591842adfcc25adc3c71c1ebc4a312e5471be67253b0e9428b0cae37645a0f7ecb89dd79fbd9be2875433667ae07d74a7983c4cea601e72e975c21df993e7fa22a9fabd45455d45e37031558e13a7a4f5f497ea78fb7399f8838c0fd5de4ebb66db290f43a4867d505309f1c1bc27e9fabcbba71302fc1204715ce3fcb0905bfa411c9d1c9ab4a39954e50b8e0cf736c10289563bdfa967553c36cd9e555bc8cc56be594847de9f26f9 -SIG = f6ee5e13cfaa362c8971d5a4a879a7e36966525ccd86c5a48cba08d913ece1a79c4cd146b8e9c65125fbadf17bac1cabcde8fd17cfd68fa1f9c44ea61c08a405 - -SEED = 3884b8b79abfd3be6c13985eb859ab743f157cd9deb81b2fe97ea4d6173e46f5 -PUB = bd7fd9a8def13a542ed2f2fb048886885ba9b5ce59cb7019fb54667986eebc26 -MESSAGE = 12adafe30eaf2b9c7203ca5d44b97ffed4bf6517a49988e4e676c8e314adbdbe23d8f2d3e2b081a7024fa525ab5aae26e60057c101e8f368d3addb9376c4682c1f4224d7f149a8474bb9a8f663ef210e9572ce829da388d8aae72a467141adc153473be3653baaa64b5b1e2e30683f6f06dac2784d5bbf0d082aab47305ed8a8efd0886ce63a179315225d1e4d4ffcf1f24ac2f464cf5ed3a8b6d3998454f1c02cdbf0a444ee2b59ddbe0a174a0d937fa62865088ac647499957d281c6949803a5fbdfdd0dd9e91b6976861f3c5f2126f39aac935be09f4b9715bd4f0d5c55df73a6b9f2c0ad26ce49d822bf85bfa2346f3165b03859a71c3d2a7b86db6e9f2e5d7b169a910eeb7ef38fbdfbbec43a9a25f04bc3acfd3b0691542ab6de9db6f03058f9584024f9918edecd90fbb85735d6dcec5bd593ae63e2cc96553599a310f8f2009ba95371196b4d5b80e7559637f22926778be5e1ccef5126e2443fa939c2a53dddb04961eefd34e538cd8d7f0bec2bff1ef0d3a4bdd358317637f42d595538c1122251a94e963d1f81e7b9aeb164f95da9a4ed7529b845ebc961b27b5c19 -SIG = f4206fcd34502441d54a73323f33a5dbb4c98557319f21246f260ffbbe5844886db567f4b63c47943dbb78fc35657d7c04d4feb042ff8536f672925c319efb09 - -SEED = ecd519f287ad395052b0b30deac341d2a9df13d6567c891c813a0c9ca52e871e -PUB = 8ee94c588e0b343585fc6748fd1b54b5770c64e9937a56357a48d44ae2f51824 -MESSAGE = aa71be5f557e10c9fb5f091a3a274453947c07a0e25b26f9509224541dff76f4d96effd0d5a41d319bc9321a86667d55cf49432fb5c3e715388f3f106c9174b1610c8f3075d5931c290099385ce9249e235128e907c53390036fbf5da968f8d012336958de90c5e8e6b1016ad43fb57c8e288dafe14e90e64b63791e5cbe557e02df8ac9370642a71faf851075e5565f6f9a267f4f6b454ce4c5474810b804844dda38392939719793246aa47454b9b0e82e9803c09935d0027f3995cca9713069bb31027f7b2af12fe5feec7eeb06843d8296ec5682262a07dae747ed7bc821ec17018d899fd167b36a7e3773b427499d99dc583bbe4b429afa6a26593953f943e4673bdd0d2a844256131603cd0903256f334d4f8ec82de115b6ca5338c75c8baa44b4ba963c7c78510d8de9b2a5852f42f3463c685fb3a6da61a8e0892662d6a250fcaa6fef74d450fc457b9871d08bb5be3011294ac888fce215d535c3b1a43bb47efe3ad25da159191aed55195469c59093ffb24f65d60c4020bfbe647ff5db7ab8a01d5e487b0b1b64ef25da156db142e6ad872a4dc1ee9ba668465265379e -SIG = e8f51be73fc4e0235aa153a2e1b354e9c5d2d33a11ae0e333478de1d8e6c4456d2e250824c3246ca0e8d6ae3e16677a97344144108c13b959e1daf51cf0fe501 - -SEED = 193f3c630f0c855b529f34a44e944970f4a6972e6c3859359c2e0c8762ba9eaf -PUB = 3256f2c82e7c801201210140569faf18507e60338c2cc4118bb1ce605b0ebe61 -MESSAGE = 98623f651698085bde02762e8c3321f14da1619b5c3f7c1a568e8c26ff0c62fdcc412475912eb8e8c4b0d30918b8ffeef3509315e58da359cdc2f26bebfb5703953be16b8f3beb1e54a1abee0aebe24e64dbe873402e156f37dfc168eaf8a114ce08a6795d3f64f5151e9a8b8275cc7b49a6b8d8a66b6d4b7632ef80740dc1c1b0a38d1a28f7c1b29fa44541c1aad354d4590c231dae687a2a8fed09e8c1ebbfcc38f347bf06d94577e49ad139f710ed8bb1fd07663c0320846fbb455ab837ef964ae7d4eceea45fd7bd8d509f821e6eb027494efd8dd8e992b88698eec2ebc5e03025be789c18013f201f77aa2d34f5686460e43fb489e08776f98bcde2ceeb9d4fafdffe0375604371ec32f46b81fec474382908e9d250a0ba2780a7d6df407bd2b1eb126748d72511b9b069eb1cd44270f29fe84b9a717751831d04c2818e408f22789376c61c2ca45e32e788ead3a7536bf09da8af4703902f5516a020d89263e93701a2565eef1270418925f35a288e327bab628ac2f0248cfbca3482e265d1621cc343c31f65493f064bad0d7602460715fa486f29426346af53e333b75f5905 -SIG = b12510ac5f2f6d33360cddc67291d6c270fd9ee62dc086b38d932d26473fe9a24efbd4248867ea7e915a30c5bfb3b8b19aa01aa2febf0dac6cfd6638a2ba7e0c - -SEED = a88ad0048d38c44cebe735ea3802ca576e37121c7d4d760dfd88de1663064abb -PUB = 14dd8bb306803e5a758ed68ad21d07d88161d50f1c74713777da1209afbaea0b -MESSAGE = 2ce8bca26178913b1676e90ffefd945bc561982660e2a75d482ff30aaba1ba43f82d2e6b909ec10fc09789ff5cf32a5180b601ea80fadece6d7e7baeef481dc6979e2f658ae0f6d8e416b93298f7d34031bb76f716ed991a16d09a582e58ba4003ac17be8b4469e1a889b2fbb2289e98af1c6d5bbee77756713c0778b0dc446a1f6c48c4d40818ec799905f069bc95341657ca5d02b7a539a13a02cd0376a50e8343c0dc20346de5275b1dcd4ad7af725131ac75e954825d30eaa57a68bb98dfc41cafe5710556647b387d9b7fd4e47651e5138050798f6d40f4ee7120b58f74da94d73cacbfd393d1347388ee00b79b8dbfeb57814121bdda60c627dce147d4d568d79052e97b9a5f3eb5407cc46461a55e18a960d8094a5fea48b6937529cc4ec919cdbedf9185456dc00e8d98ad1537ee10a057f4eec4b81dc60392fc9188d3e561785965092e44317f2a48e36605fc583fc173b05db9dcbc7557d06487390fbbba77af3a014e1ac35139caa1c53a8d17347f178e1c54d0f52b40e91042c93e7e481d792e288fc27e4c2fcf111fe97d9e2337d2fc1c3098f06684a31d55ebf362c027 -SIG = 1341a148da4593c88ebc5a58821eef77f92186390ff633e76207084e7874ccf0eb1f9ec70a3a3f96b58934bcb061ff920124f7e580fa2b0b279583adf9232d0c - -SEED = 3f59d6a018f50a822117e5b473609e30cd64920ca1c2750dcb09eaab807a3eac -PUB = 457d0e59c11f348f3bfbdd3f327de78c0a7577c0aeef42d4c1e56700d108808b -MESSAGE = 7d103a6c6ba2d09087eef2254c1c903f067695a54c4515e4d13bc1fbfb54d6e7a167349c14809976da04a7e58d96b40aac3b2bdd14b9b50322bb11645f05e5e978bc7fbd02492ef88f87d668280fd708373207ff670fcda97df8485d5e46dc3bd04347f4d7527eab2718f7d93d132ba7758218894e75a7deabe693335ba0dc73bf26c288bfe9be8a736d75e5e0eaa7bbe8d0b77abdd5146e0fc9b30db9f07cf4bf36260a1f41410331f8b47c6b38338c6dc9e801ffe1d585f9b7fc31e9778bca3027c232c074cb18e5b72997005ffeee4bf37c8f874b1b246a6345415dacaca7075a60443ac3319236e23cf6b7544740807052114984b8d8f7e857dcc6faec8869cf96b997dfa9af9184ad623f1d90b8ca759b448eabfce18c17cfdf9a3e3312e63e5f084cea904c1c909913cc4b19d044a3720034973c7384949bd6f9ba9256f98cd394c566da83c31180109f16d10347b7e3e9dd6be3bd3c77ff1a7996a078dcf89dcdce2d1b615695f4cc9f8f4f2a08804641bca82662ce88faa53145b6a45955aec8cc2af81cccb5d7c64f9ece1c9983326484a1e5ece4ce36544d63735f7776f21a20 -SIG = d7425ea194a6715c452ec4f6d6c76e6dd374d3ca7ae7a11995d02b942d4a31870dd734c12fca89a8eb0213eb139c14a87a6a33e818603b2e313023fa58737d0e - -SEED = a1212b34dbca63b7093612d05dab7b4cc8f7b676a934ad01f659851b3bb44e4e -PUB = ba2fccea9a080591be71268d7e951f250dedc00416e5f3f908db6cc571254925 -MESSAGE = 07c37c46be3c68d05689577aa64a932b906446b29baf12f6174a6b42bbaefd1f1f373e0bccc473ddfcee1a7f21b96a6260ef0aa1f2d8b2959e71d12c953358a2774cc5e6f379a313e435ed69dfd6d4a59adee3cc7ec4bacbdbb3fee5430b73f6051a6096c60e9bc92cc8fa059fac2a93ef7007d64fbe50064964d5a0ad601175cd9caba453f9103b25485545d301f03c5f9f9478bdf9d414bf1dca3b1c1d9daa9971f9e617fbfaf5b02a7fbd5d4fb894c0975c54592b49a0fc85dd0853f30c51502d98fc1ab85a17cc58961aae9764570ba5cbdbc96dfceb8d11da53364b4025fe0b8ba8a353ad23686720169fe973432ffe291a4b11dedda0aac79a5e42620a64587d2059e787013b40ceec599208f66ed0ca6e1be9092ec27db216ee6dadfebc21705bc4a85aee577e57d239af586efeec22cf38d1cfb3cd74dd0d9a3381aa81e6a297e39b819137ad27d475e2bf54aa426dc29c4ca8176df343137a2d79d12ef9aa7be1cf6775e5d8a4430a85c33db61cd2f35187b4f6ea9ebdd753d1c4ef72471159ff07b77870906496249d4278e3f3ca6bcbf37a265b896539190f9a31f1e7b4b65cd1 -SIG = fa93ed6595bc958dc042ce1645167b79e8f6734c46f80f631fd5484908f5e51a22427ee686f564ff982f6ef4d2ca1f0ca5624910cdd63c11a3c2b16d40973c07 - -SEED = d9682086fe7dda30b87111060193d847566ab94cfd9c97ab6b43e7a8d3f79382 -PUB = 8b0b1372d88733ef7233f6379790d1e46e1e07e9d3fb8b0be252ed04c5fa163d -MESSAGE = e8814be124be3c63cc9adb03af493d442ff20d8b200b20cd249367f417f9a9d893fbbbe85a642be2701d1d1b3cd48a85cf58f159a197273143a578f42e8bcc8b6240f93271900538ffc187c0afc8dbcc492bcd679baaef3af5088434a94586f94b49970bba18f5ea0ebf0d27ee482aa83ad0dd0ee609df59d37f818b2c8d7c15f0f6f544dd4c7e7cb3a16724324f77d58948f8475a60d53e5bd510c17137c99e1cfa515af9bc85569d212a21190729f2817de8c46915e021df70ff6d60215f614fc21139904df3b292b749dc4dea02518b62d15862c92d2a4c996701cdecaed84ab628ee984fc111eecb59e48444efc0d456e2c852518441c3db7630ddd5156249a28730983838ae59ac4cc7110fd6de68101ea5b2ff69fd364e3c9448defefe175bcbe117cc11b4ff7549c33e1025b6b592048a8e31969e818dcc188bb19d7a2440a3baba4eb1b81c45679db46b31bcde7776757d9931ec2063fc6f1fcd761ecc57a7d030a85ea273ef1825b05092ab9645359a444ff7d166b575fac298308d9faa68463d1d0f7b7df8a51c6815d37159adc0b593224a818321d7219f09686cfc952259718dfc -SIG = 1793e497eb521ca74e35d14a63868cbe9499da2f21b4eb5260340fca3c1feca78dbe5b14ac10f3fa76fa2e71e4c91461aa75977e5e70792670ef7ff0e6a28708 - -SEED = b52b249a7aeae0fbd94ffcf9a9fde10de61c3f4cbda14b289fe01f82707334ca -PUB = 735163bfcfd54f9d352e1c2f3c0170c95c1842ccc7421623ae0496980cee791c -MESSAGE = 1d445e8ee36f6e1064ee1281e6b4a4cec50a91c2b667c8305d1e9a5f7b73a3445882581fb0c11e64f6ee92e811f9f2d6c59c6344be7691d116dda493cade51c0ce77372b61a7c4fbb633401333cbf71372ad2f044e992ac035f5879c053004f8223f237a24a409b7894f6ad518e046b8a84c3f4c6260e6169fd944d57fbcf9ba2775f2d60ed772c46ccd63c850b80d587c5208dfb1a25878c02dece3e602e9632fc3c2c79b25ab41034c6e26b869255357a686781dfe6e644beba9b627da1fcb5ec0be497cf188e1ef1af0601bf16b2911fd9ff34f0e97ac95a7fe2cf90ea6ced33ccb0ed1ef2d4160efb07c591a5cb16c70ca1694fb36f2ca19eba52be3d4ad895abcada4b36f0261d65f59e0cfd2a6148a8892ddbb45810db3bf4a9e26e92c15ea2618cfeeb462d8628f254f54d2af27113bab4f9a7d06791811942bdc32f845922d7b2ddba959140928f8c28d98b44e1d19b97fd39cc0f9a5236d349fc835ac492192462e40ac629bebffd2eba72d2788b244bb777ad0f7b7f96f23412399fc1d87a1d087ba089027eabbc05edafee43379e893291331b460bfa7332e0842ec2573393de95306 -SIG = 6f48a9f7f0fa192b66d12175a333612303e180b9fab18edabebcdf6674fdfcc53607089bf980ce35894c2f9babdc4438667ab3297a6248ec0269faa99c724807 - -SEED = 782a93efe0ef06cb2534330efd0e9684e9969b5258123e490239bf24bf9f6523 -PUB = 942fa1406ee2683e29377e49f7ba757cf50ef0723707d4403d2862257045de87 -MESSAGE = 46a4e319a670ac993994a53300c3f79144c2f7fec1116eeeb3621c76ac35da79dbff6e189ca9dbfc9abbda054847b2971b02facebbe926d469eb0a860389ac744162bf6fb13b42cb9bb8c9d72607138e7800121ee0cd633ed535c7ae5f4060bbdd271c9d110abff5e060ea6ee83890b1e92a9256d7b2ba982a3114bb6deffee2696f0a2f9c21aaa5b2defa11aab7076de6e57e86f284bb67f5a49ee685921032c95b74e7e3eac723f175af082c858e0dfa01728c38fbbb4c83581f81ace6c63c6bdaac5620eb9a568e7ebb7b72b3d1a164ef524e7b9f00799ab086715976c14d0df65f7b96bf9ebcda7feeef113422001a03a7633df5e49939a121db899d9b8ac2db4fad0c30cf0b8bdbc9e9802a797c8238e46511ff24068cadcff2448cc0bff92769223348d45d6b6f2c8f1593388c0bbbf44b6ddb50b98cd7f09c730f7de4d008156cb3cde0cab3ad0a58a83954e234a0a8a04b573c9a8e9b929ed38b8b228bf55a3c6e2c6b51f682652fbb708e74640e3313e17b4694d7fdf0111f90608c1b5af422dcdecad9ddb7f50d1bf5bc6378ccaffc3201e6c787b48c443ba240d9d50ff6c0e9df7f1a5b -SIG = 93e7405a4044510166c8ac264ce3b5ba6665d68bad458712dc93c2c390568d7402ef7d57f549b8a1042f7f69a679aa855f34f801d57d79895deb8deadb352308 - -SEED = 6fe7bcf7a684423de1076fd76da783423373b381329efd6157424ec4b2655a94 -PUB = 7740e91afe45324f8bb990ca2a341279ddaf232c3bb415f178b6092fba195fec -MESSAGE = 0baf0ad440612b4c5a136c3a42be1ca2b7c319862a44a9fd50c4ee73541c5e6457efa81825b6dd4a72194a2968688bd49e5a8f4c04dbafc2e7884c0c70c208d4e954cd1675da8e74c65c497cf9dc69424965bdcba5de52936f925f62e201f99505d3777beb3c2e08b2ec9a873e5a9c21fb4a2f3e861f3cf4d6b5dcd1c88bcd9163539ac62cd0659f4ef232c2ce57fc77f90285eb350169edc6a806ff50f61c7e0beeebecec63bfc9d3983f5bb4b261c746471fcbf2892c6108970b68db5e43c4504ddae2d0ffffa28b6759ae1128e16f66d492ad61e3722c960f88692be81a9f412890ffa346e702c867dfa259703b73f525074f3227c49cec1b645a103bd4471f33f9f1bac327d7917861d0ad91abee60222ea2a3c8cac052ae9a2cbd90855d733d5319133f9541bd0b61f0995268351e2863c1ca2ca51e3c976383f5c4c11ff410036fd51d5ac56b023ce9029c620f22557019ad9b4264ed4d71b434f4a4d17a7d5769fa1e14a69f7ae419ccf5947f8c7682697116c2405f5a1959c54b48f0872f596ed45964488ddec12bdb636d0b349e749eb66092ff4511fba59b5962cb93cc85515cc86ab0c6b2 -SIG = 9914cc50fef0935efb89b3d64e3c1c3412aed659b90166222c0d13ec1ce3a68ae6281b7efd9d4ec64b82e73e14479f03fbac8fa3abdb41ea4215c4a4d4949d09 - -SEED = dda48a0d15a29eba9a76305d360e466e72d8040efe2e89c04b6461315a9b8bf4 -PUB = 4f5cc36a809416b58e15d24cc57968cb573b76ad90887a8ef36cde7eca400fcc -MESSAGE = f5ac19b81f2111a0db0ae30d1513ed343e7f57f7f77d65b8ac7ce3a601174baed9bfa136035976f516d5a870f45db1919f1eb1cbecbe88ec32d191e9248821a7e7681fe3abec11584bdb33de1b4ca94891eb66dcb8539ac41163736ccfd69abb83814dd38cd60381318728052a25cb665471058650ccc75756dbee688ab826ecad4ad5a7db57e8f65f1b64abff82dd53334b797ac40228dd817f239d3ee804a19aeac8cfe33eb657ec9ce923d6b388914cfba2e72bfc2bc3d6f985c0d97534db958eede57b16491ffb755c1a58d78ab377faec0d311818e899260e3ebd1ccd29246fa82d0b76622b2c4bc52f549fee72a30f554f331f36d2a74d999ec10a08294f002b4361e590279c2fb1bda4312ccb24d75282ce7c061a0ca5520c74f6f6333b18c4b541cb6c51e01575ba80512ffa7ce0accd22d14027c53aba1f7437835f1114d68e3acf3ff8de94c8e4ef6d3ab312c91d02970157508f54a5816f467a214e9b1284300289e65f365a610a8ea284666cfe5518e435bccd21627501c725f0b8eb5725e0e06e0cef5db201b48ec91ebf878dd57ce8dac7334848a1bc82c18b065955e4f59be3398594dc -SIG = ce71bc82d531d0f93b57bfdc2f7316cf404ee09af88f33bf806c7cad6b8ffa366236ba74e75c15096ddaa6e3a62a8f5eb1c8c3f6b6c94a6a349fc7c0cbfb190d - -SEED = ec57b941adf3ca13e77a780577cfd0df5b49edc85351052da34e99f8a9bf3208 -PUB = 2859c071978a04b7f5407b6d22401a78efd0394bb966b9a04da6b5ef819de3fa -MESSAGE = d2bcbd1bc361ab32c66d72fd48a8e227dc6b8d6b150848ba715ff47dd35c8e49381bb4e2933f42cd26b75b14d9c0039282b62b8556aaa11cd691e828382be306889fc9205137b169d3bf17b7f37693fce286039f03809d7d9d98c8fde46f1101942a279c516706f50191a9112f6a24630e1a26c321e46c9ccc85b6ef942f353a642b9e7ef998c0fce2d3a75b999eeb77f31f9b0813a97e3014c3a86e2558734621a3066dae35845031e35665f1922907dbb739786a8b7658ab60276f2d921d1a51230fc74d19e80184a4f10e9e834abc9a36c429726bc055dc8c063f0eca9c61a8a970bd4bb5f424ee4d04bfc295e3bb1f34becbd9920fe2e77fcf36763f32fc9cfd5e465979c167cabf5a1244b491fc06b8946419046ba516c5b233c414ddefb6da04f2e13daff7a9a0c02a518ede57ad9521de64eddf6f49a9670f632d3f7d42425207d053604fe39d13b9f52c8bc292b0076ea42a560056df25de51ad35881d08543224d7fa5d70b8603ef23ce06339d6cd09e22a95749e50dfbd3b8ad69fd30496b984d1c0a199c8594805f38ba44631a2c59eadc6554d19f9bc98366dfdec2a121d0e4814d2cd3f5871 -SIG = 118e1462126b45b8c6803523755c56dfc4e123e4acbb66ba0ba6fe3e053da4119f5719295e0c82ac64d7c5cb1ac898df263ddfd360f3008d91018b26f6a1730a - -SEED = cbfd91d7695c1f270f69246ab3df90edb21401101ca7f8f26c6d00f4dcb7233e -PUB = 513879cf79d2f46df4b85a5c0949eb2116abf981735a303164cbd85adf20b752 -MESSAGE = 264a933f7d0aecbac13eef644b0b53dd53a1280904100dbc1ab87b51148998f9da0b3a0a6337f5e3486c2b7e548d211259397aaa194ee4695bf98c2d5f4487699f7397e5d3a7e6d5f628fbd05497c556a50a4d05e2b712cdbc351068e42af19538901b8825310e343e1a17a1867dde0eb47ddab456d316f3521554937bf808ae4e4bc1c3c5b4756e4a165ad9e8827f5316f748cac6998ed2d2104f268407c135e62f26a922460eab6d851639a00e5f08b34765ea0244f475bbfeac183e3b5bd1aab798522798a08ec6bf2257d4692f5b03cdd0a2133de970603e3251475aad8d934af6b2bfc7a650b91bdec143f8ad254cfa506bbff28a03beb659ef5e5ddffe76e23230c4ccd46310b37dd91fa6aa68167f62a55c8a69f9ed1ec6cdb144dd81ab0bcbd62643420bcae67869f64c0b169f3cdf3c905895b7d35b6fafda25ccf23c3d10de32e7f271e300d39597da8f843722ef08364a5f7a105b9655172df7c82d7374f98264c9cdccb496f2e10fd8262fb1a9a9965b0b841ac0d0e9c1a3d9493ea7aa600205b8f900be0d7abb4d98a06583d2295c276318be28d421982dedd5bfc33b8865d94ef747d626af99 -SIG = f336137dfe6f42a6669b55f74b80b3035a040367f90656fcef0a644c52272ddc39273cd7726010ebcd8a30a05201ab70b8ff97d0288a2cb94cbc49020647390b - -SEED = 51a4197ab7686f82f6003a0c32f39d0f2e47555f4e9f8deee75bcb1bd1ef69e5 -PUB = 06386df86b61f1f8f4dc45b73edaa841920968bbd131cc5ca1c5294eeed5c8ba -MESSAGE = 2aedb7e82f1fe4ce469ada48345d006d1b3bff40eb21867f51fce965640c409ec13ad4d52f891bd79066d6b4d944ca868d8986d242b57eccc4c4a488291b159c8de4392be4b86febaa75eac5d22d3c4f8d6bef79adb9b92b4914d5ea07c7f021e2c29f58d07be8a084100bc152d51ca897d7c131644d0895322e9440a8339e1aa390a7f4fcb51ddfb6df48aaf5676337d87ddd85b1d925e1a9c29fe0818f514ef72f747a674946476907a7ca99e9db8d209641057a7f44a317b90974bc86f9617a968a76a6b8387cf5853e608190c1a79f1e1d686e0de22db6cd9aeb8532c5c85cc90b5a018579f28e502a770a4ec675263d0dd781b4fa53c9dbf8098d57b33ae2afbaeb3e68266ad9aab7174ba68c6479883992670ccf3e5ac6a17e65e31e1fdc85e269c80935ef574f20d239568486e7d94a4f724ab7006098b24f3f61587691435c7f29ce4e5ca71b2b1874556433a358c8c5ef3c880843030c2d13d51b78c9bf1a8824e62e111844396f5af2e25c3126ef3626e26efafacf99830aa41212332f378a167233a0b42213afe36d83dc4582a79693b9d571a57712a08b8566d361ac902647afc886603e24283efb -SIG = 2c072969ff4719212a121938b506c602995b4d02a22e6198d6e87dd6ae076225ac70bb25ef8c0ee81eb6fe953df6b1815949e8ed0506cb012e873cd36cd09b0a - -SEED = b1119c36118b7a065a195bfb8b79a5c287e09bd287c2daac5e6b01164c5d737f -PUB = 88f218ecba99e770ed214a8d01a92a10400acaf1f6eed420067e136ee2c0c670 -MESSAGE = 8816b1eb206d5f6dcc2e4cc391d23209006de935e318152e93fc8c2cf08e26432bad9adb3203d898df0a2e7f1f83dc2f3ed3205bec8efcfd31adc1aca5755db9bd4efe54cc17073077de4a3fdd11996e84b6a052f034b41099226c9c272eae12528f16581b91b812850c207144dbff3e850cca848ec2b1dd164744d7b59337d7e3efef008162e680bd4a0899ced60b171f8cbeb48c5158df6cbfdb26240881bd58ebb8b6a079587279679cb5ad82f371b53c8013804c35596c887e436d23926f994e09d98fbb8ce2704174ef38b68262a7f1a712da0ef0dec639606814b3bdcaf253ff31c48e8a752c111bd7101031cc3d38efb0c9c7f19c59081584a0e015ee7c75b10a4c51ff543a30e52d5f94d8188c6b08e9df1e84a4e2c807170ac124a771b99465a0d38b1f1c6330403c82543582c5bb61b220de1b9e0ef69bdae26023181ba4cc077a5f0d425732ace132ae0c6ff0bb18baea83e8877afbe650fe0bd02093f00a7b5365728dcb66fbb881f592945058a5b350665af91c557a547250ad295e68b4fb72457cfb9d5ea1a7b2a39c9ab7d7ace0af5d51669cb6c2c4c07b2256d10e5ffc6b97c660006313c4eb8d -SIG = 24ec1e54fc7e722d37551d02cf135d33f5d3ff535773e02991ee85ffd3aa29997f9c464470197fee81dce110609f870b27c18dfbcfd9320548525e93148e2205 - -SEED = cbb587514e0a34ffc34cbc04f28c9b4f6465f1eb225cca19b864876daef37d7f -PUB = 6b705d4677d2d849b6744b1ebed167dbcbf645924b1ff2e6360794bdd0e09788 -MESSAGE = bdf7d17c706796efd3489559b527b1c0584b9022c9cbda3aac5146da340d9cea69f916037cd21b3eb1104348880fd5c5b7c65ff820f7499346016951cb715d8df2b41c88cd3c66105458b7b590c21c1ae2f6ea9ddea7470f25e02027d171e0e574a2bb21642f8f9da508e21d8e7335b5ace5935299407bd1b01bdd1423133ef045234e701f55549434ade94a60be1e1406ca5c758c36799ce1703084476e484fb1740530aee84266d07adfb4cc689f3265133a59cdf992fbb9a4b12defbe241ddbf65d12b2fbddfc05af0fb8de42080775bad29c6b0459841cbb648a9a95e48d6e36ac514480a3deb4b36554d8da620808ae9d47329710d20aaa6e5d7f547d81ad30f84c0e3d239cde5b169d9ddf294832d67a8060ba329c4ef39be94ac46434dd2185931d1231f9b6df878a5af0831e0e9d8a08d08069ded6a961ef7f39fad501ffd17d6d9b7c654653c1f58fcee1a6cd803d2aef166c78ef5514a3276d6998dc7c09a3fa982e427c785aa6a9e256f7ba72d5a6ba33eb46f1f9fe9be2bfc14109f64773c00c063b4d5cb4f4f8a0beca92a9a016c4f540feea9c3a31e313bbcbc2ff5eca9967857f5f8a909a29d7f20d -SIG = 1274d6f356eb641472b6b9e5b3ce65d2654e6cb87d3a83fb49d0f7da9c44be2b532604465f6089d680d2d94b0edd2b6b2b805c5e84c379efc059673d31007a09 - -SEED = 8bde3ff61a16995ab9d539f6053219081bcaea1d458ec33684fc1c01fb565bfa -PUB = cd9d782a356e847b7a04c885a9b0907cc33ba97ad5390d4ea5fee5eb198d08b3 -MESSAGE = a1f40ec5807e7a27069a43b1aebff583ef037028c02c859525eb8fa4c3ba95a901ff3aed78c4f87752fb795522f5bf715be7e3defac10fcf17e3fa5c54b20089a472333327252ec945718fb455e3f27ccfdef823d12d406e62a4aeba3cb9d1c61b2b17e49e200a8418f935f26eeb57602c7aa3b3a24f7e6238d3e08d2d609f2eada0332bc8cb12916cb03b0d4f9cd602002586d3e4cc7e0e0381c045ad2e1ee28298ae7fcf0c10f212808565296f158d2c32e8cb28156581af52bfc3470c3c9582138d2255e8426d648ca237d7aad2856f171638558241d8ae3f62ba92db596568edee3ec0ef370f83626aa0445af08f967863660e8fba5a41c8e8ede1c960514a14687a4a81e776ae0e8e777fb0f250d51a83b55f8c1ffdd78df3bdc97ff177afeca046c72d72af924ad0d0ab2bfc11b7f4abded51c3987a8bb94d640c8710e5fc9a4190e8a008363d7419cea17c40dea20ea5156029f3debf05241918f54af5039e2c4cf2ca2e139f60e45cc65595cdf54a67d92b6ac66fc0c5a290495ca57b07ef5750d05f57d87d0c228f7e4e15ad0ba0178730f951c697583481c66cbfcd48032544aa8d50908304bd81940308706 -SIG = 7464df0b67eb90b4b73ff082ad0d60ebfe0660dae97069b52c3727223bf70e29e48711a2bbb438f5f8d8a33bb9c48fe7b628fa8a542ff0b5ae36269d4007a505 - -SEED = da59bbc523404f07646add7908294977e46645bc8a38bad2809641a23de3b15a -PUB = b22c0f21aa1c2d45f4b2e56cc9b5e02f9e31a2eaa367ecb482f874cbd8e9fe34 -MESSAGE = 097106c3624d774dde2551e0c27e19504e6518cc86369ab26ff810969e7de24abc68b4b53f11d945d49ef078eb4f6ba6bf257ff7b608afdcb30a5c59a756fd77a6c1247f6f2a41100d99fc5206af3bcc6de1d3e4968e28fba0123f6045a1b54d693a42bdfa071b2b914b3c3c0c29b2593d07e8bdc86ca42ac555b7dcd9439df9fbd4bbec730d6327bfae4fc41ed498b4f04a0eb14cee608283aaa6e6aa46676bc88aed5d9939037aad4915661af94bb5f6e653a2cac123287073270e0b13fda1dd4871af6a92f992f539df881712fefb038540d41191123b6b3b4b6ff87ffc929a6be53c6cef02f48f2f0cf2fe64a45fd66025cc2d7ee55ebe2316c000855661165e2a5ba41afc2097957b6fe4c55221204b6fc1f317dd3ba13cac39924026bdb66be4542268875631d277f210107a33767f6d9596e25742d7a90ea791ea4bc9ee84a67fd328b80f791ede96d89663e937f0b755baa9d52bda210cee1db339ff1d3c4b000b653b9bde338049af84364e2177f80dd51e2a1672ee555d6317589f6f1d5abe6c2877358bf94b0b808ff857363fbfbe32e97337e4b8a8c221a9e75962a8dc9b5a3d7ca5f9c9b61c73c1469a72bd -SIG = 1472459cbbae2cf21ce44a15bae9fc85dca40b8182da7d52cbf56ed538d18e03477c140a3ddd0efba43c96aa92f5f9bcdf3481286ce762a7e2bd1e779ba99b0d - -SEED = 40ea82da41fd15b06ffeb99cd616dc6bc8c1b21477ea239466088e2849bf1016 -PUB = 5910e580bf412c31a87451d9ddf32b3ab713f9e4a22c590c641c14a5dfbbe0d7 -MESSAGE = a06c4e02b83ab7e191ad818cb8187b52a8da004fe838db333c4e02548db6bdf791444642e57fdbc8594e59d7023280bbae82986f399805434bb072c8a27a2dcd5aa62f065bc58b0621fcd365f6cdbf4d57d577d91150301fa48f182f87e8dca7ce45a7d64845ff434d1bab0534ccc83aa0974e88b38fc2508cefcbbc82135b73b384c80eccb8a09e2873cc07129021d81ce129a9df65e613410af950197dbf9afc28edc4e65c3e84da40d2ef841b886bc44719a5d59db2c6dc776401c895e2b3c83783d7817bba68baff59470d6015bba8d975f0eb712f3b8902912805523aa71c90499de689d31ae44e210b8446f2484727cc491b92a8e8b199d628e1df79a28c561e5a7d882e30787d08fb2d5196ba61196309b3bf0c5824a3548c700003fe9913befe12223150012685e90720e9ec6bc4db607425aec531c4fa36086d3b9be391a3f04635a8077a447a16a6fd89afbb9a72d0d355cb0b22d562f43f59d4e37128b3e2d906c8ae23d0aa599c70d3778a076c1a39728f1d6937bd48b978740850566138d34852b63075e89a8e2280edba6f4ee8f61511e9b768e95c78d197b693b109e88818b486a9dfdb74b4c5550acdfbd5 -SIG = d298fcc9a8ecb76a98d4a71dfb01d276ab2d9670a95bab34cf1d8364516d1ebdb23903460215307125afd09c758e981a452da95c0ac2c0b958c6917e6874190d - -SEED = 28bb81a17d4584754d52818cd0f1f21baa777e695844a15122ac05344dddc027 -PUB = d5f61d519944d13b84bfa7cd67cb0bea4ef2281efa461f22ade4ba882d11b252 -MESSAGE = 92e84c7a55b0bea03e17cfb65f7085ce3f445b1542bae997de5f092a24ff243380286d137091a598f35e6dae1a1c648f5a494c819dfb240652ff908381f32d70bc513100aca16fe7220295b1c71835f16d9310a9d27a04a980ace297d5af3f7cb7c78b24997ccb41f54ecbab507eb73ea6a3ed470e49590509f5d1e6032a2605db87f4a9b9ec91602583f14e2fe1bdb900ecb8971196b55c0d433489f26be9ca157cbd56572887ba859f39674a8e0ca08f2dbb0f27073551d0b1990685178b1ae9e7885499143d9d72c8571d11e0d85bf58df94e2a74d9b6846557f9125ca0944ce5718d2cbae1672ba02b847c17a6f6b445634d2f0175a75cf6883c62e5b521c57141f218b2fb0994b372a716c4a217434beab75740b8e91c622187d03c85da001e00247312a465225f5d6af232064a427d3018700ded774b9026777a5275fc04754606c86600297bf7b71aaff8b9a746677a3662f3750e81b50166f6237000051ffa15868defdf090057722ae229964a4ea085e0dbc04ce1997722c5bb65d2b47ecb746fd83a9f6a69c81545a9b502f5e76d3130c5afcb1c9af99d918740837ce89d7cd213fef2fd062ce8850f69659e4ad327 -SIG = 9ce45a07dbd28d3f6f1b35630a3fd56f1d548f84ffb1c6ae64b21498ae38e596916e77f79905e609fb1ae0da36138a80f242122167068092cc605796c5669e06 - -SEED = 24bfd4fc45d5093585678101cf563ab8011fd6430de155f2a425f0633ee3b7cd -PUB = 9cf5c5fc0ccfaeb28a08ba67707b18dc84ea0698ffbdbc169a09c28123e6c2ac -MESSAGE = ba54128f45be2001dbb060d5dcc47144997415d4294f6eba8dceba4f6cf2234683c4265f88032205296e9b27d68506232d57b688407648f87ceb342052bde9d0065542ff1715c942027e67482af4bc278ff71966fb3f62a2a5323cb1b4bae1e7b8fedcbc73ea05b4076421b0b4fae8bc3337416a17fe124e7ee465ebb38d8792306429d8279a1bd54c37bee8f9c85eebe3afd1f64489d4e53ac5f50657bb6ffb97120744b75d47c6226d5a9c9c264ee3e6a6ded05062ca1006669118454550010919c2633cf086950345e514af3843148e5c64352e69037dfe60d4a8eab3eb8cb54bd39af2f353d5ded2e2bc8b11c09f612e128c6efa41f6eb2c958087be34c6335a43005d11a9d3b5a529c2d1b0642f77afdd8c6b1d6fb2a9dcb65f42f4eca8ea9a054058be8613667610e3eed8d1df0739eca171954117989d1b12189ab57904aa960b0ca85541746385efa985be9d97b5a9029989a9c71498dfabdb813681f57e276b64db491b8f082a885145469a531b7f9f04ca0a2c2f8dff20ccb99c2861f54e5eafa962cc53eaf18d3d5e50d337af485f19975f05930700a8a7253f11f184130d0aee70969d96fe08f216951d9dced52388 -SIG = dc935b60fde44359af8f50ed7f919f483ce3f24e2320c55ba92f3e7617c19bfb54701903ff183b42cbedfef0875f42b12875d36a0aeec73ffd09509d92b28b0d - -SEED = 2fc2f9b2050ad7d139273e93e2a0451c7b5cce57599aa6b08d3edc5bb07590c8 -PUB = ffe5a17880d718cc7988c2fd9825b03b93450ac1deb8fbd1f1bf3b8f87805954 -MESSAGE = dc1297990cc027d56d1fee265c09bcf207a9583e6bab8d32478228e0bc305b9818154c338ceec34b04c4ade7ac61dcb09bfac8ade00d1f29de317060b8a4daf1987de409ca2c3fe4380088073ccf485e9a69516b5bbb4130f20be69b2dd6a9b465159cca1ac88b328b80c51b66af7f4c50f6228772f28734693ce4805a4163dff14b4d039811ee3fce65935444a6ea9a72d78b915c9c3b766c60b7e0329e43c9c57ede94b91525ce5a075a7297219772ef3c029649b586a95a73bbdf16d8fc20368de4ba44de1064be5826b376be31a86ca478a52efb98f1fa333157719bd6e0da80ed68d0efeafee5a13bcc3b457525258f1f7e031f7b403a461506927b1e6c7d4a0c8d84b5f3dd0eb8bdb13edc2b514a81d088eb077a52c8a831861feee8110e41a325dce206b2d67d25f90ef57e0fde709f3e5a39c04eed31e57c193b283e2da7279ee3f1eed482b3bbcd373902c1df811ac33e1de06429e8f8443f602019650bdc2ee8d7f650036a7a22b8fd88517511229c729a3269b3a3e8fc72b01b5a4b3e33f5272f3ad21629d08b1f717935e9e104add2f0f2033432bec82e2121d98c9c1a58e0daba25536a1be8e5088347f4a14e48d8e3 -SIG = 7aff162a3c0d28dff41715a974af07ecac2132fc18bc43a198fe664659050da19ae22758d52c9cbb94f1358bb02610a8a351c2116279e7245adf69675dfd360a - -SEED = 8afe33a0c08aa3487a97df9f01f05b23277df0bb7e4ce39522aec3d17816e467 -PUB = d004370e6edc34b3e8818667216f5b226b0ff75a58484c8616e1a866444cab57 -MESSAGE = 86fb741f1b9708929195031aa1645fb709a8ae323fff85e5470194452e11b7b1279194b5e2427ce23e1d749c3ddf910b017e4f2dff86dbe482c91bd994e8493f2e6824bba3bc7d7a845f217ae9760b3cd00226d9ff2616d452751a90c3d0d3c36d4ab4b2520f67288171bd3a34b2eacae8d44c1e153dda1f90bcd3595dad37713b8d340156ea90a4e135951ba7169ac175578b81e97a541ab9bfb76328798d7d631c14df2ad613e9c6e1147a0e84062ddba035859d46bade5fadd9b32b43dad483c6b8023b32391e51ef1520c68c6191326c494423080c623dc4ad0aa074748d826c29644c38986a77002f0cab9068e6c9ec73cc2e0c584b80e0bc375721f7a8fc35317a5e240e8c66092fb6305b012c70e17aeaff13386d5e28d06430ca585b0c85b274e7fcbb63e3423a982579e5a64a0262c41908e55dbe43dac1e5cc1bb7298be428720a12e3b072559ec2675d457aaf8f13252e28aad63c1513f5f239564d363c8505ffa4e50f6648c1cb82bba852bff0acb030cbe73f059dd87bbd7318c5586e708618a4f4c9f3bec3f4f07c609eebb24ba878c6bf1e4f2d0fd1450ab94e31755217786fb15182760ffbe5a267cbe998a4ff90a2 -SIG = 63a8aeac025f2dde9a73286e56c2d62dcb79a241ba0b2e2dbaca8752ed2fc8cc7ab8e6600b67645fb5e818a4e82c29180a6b2c3f58d099cb635ce52bdc157004 - -SEED = 6dc7ccf329378e8131b6defcd89370301068946336b0b762ac5ea51487dbd39e -PUB = 04e90d275e79df5f2b6ef4a31505aac05a69459baf2c581b3ce3db29f0f1fc14 -MESSAGE = 20cebbe98401ac8934c3e65a5738cb0ec0cdc75fdb09dc96312894b187c0a46d2c38f4855be3eeccdcdcc56d926a8c08ce6e748e2a858f53532e7e5fc5f7014c8c6f86310cc26efef30ae525a5157940ab535ed8e403112b08e35e2bb3dd91a9ae8f772d2aff37d8c40d2b5cc887a6f15050a0f5bcf0360c3a9d12d5918655edc3c13c86ba6f4a2fa3bfcd405ed38f871cf7dff0f75daf2c321084ee9fa81211adb105b25c2288f0f2f7f93ef656b2de190122e7a4bfd4a1bd9893a8485b509ff0bc46cc961051c1db5a12490c7e741922ccc0a665496470276f69c7b77098c1e670af6b9f851252996875eb8035a817fa9be07f2be0bbb12025e0565414c817e9421ac700373893862f24cb165f9a271a64fd2305c6672c46767f8f075be5d2d4079bfadc3956288b0215605311b5bf32f0037b7c5ad502013e82ae3419d9d8f39c545b5888f47106c94d5fd6084d26034a99f5dcbf26a84eb4ee149c62a0410d8c707b1a9b071f74ed23932585072ce6cbd33d4d54ee917916f5dfc64d26a498018438b455739345dd60ae0f4750625915cc829ab6822d6f05f6d2bda0a7bf5601e9a2ed6de960371d17e6f43709c9678ca743adfbdb45 -SIG = 04509db003a1a6ed3fbcec21ac44ec10cc06d79f2714960882170316275df80423a1c1a112d881fc24d2812526079058aa8b608bfc6b5e57632240c636d6eb00 - -SEED = ccae07d2a021fe3e6ee23836a711b97b04e0a441f169607572731cb08c269488 -PUB = a32265e5328a4f49cf06b467a98b9f9d5b997b85dfb7523ca6a0a1d627d32891 -MESSAGE = a4bf8297d0dc5e4c92bd00ad5b9c09b1238b503d619116ef74260378349a9282b41f3f4676a6215e3ce6d02238480a96043b2942b3feed12620b1fa97f7703b3eb683c1601bd2f51825c450df4fd1f33b0bf9c23c03223789e06e24cf136d3b557403a66981f4b777dcfe890d2ba96da4a4742aeeddd6a611d05fc215694a5d89a5de6760b1d9415155044c049cb02291a1514faa2e77d2ae33d44585bdac6365bf481d9c97833937eab636ed65742a0d5973b24d54089b2daf084d5414765105e4eca14aaadd1053338a8470505232e4ac633345c5cdee1e4653d1d93583af11854b1d9b65fc20281838c56df1148f35ccf9bfe2f3f80ab73f5b791cbed2d920644cf0316f0cb5d3662b9120647da56afbeb47a952953bc1a37de857e4b39fd92b632b85159f46cd05b6abc2338d4632d48e9a178860de8f65d9bc23f24507b7c5629e0bdaac067c476c9c3941d86f788944d744852a61da716f95f3b04f0783a562941bcdda439590fd186b2a8ebf19a5a7e4f4a3aaab7a87a434524fbc9799c9931eb8ce4e34e99b608cac94ab7e74495668df136185f487d9fbcb6605ad725345403ec57f3f6db364a87f38fea4b4c271552e9f2e4a1be -SIG = 0eec754105447f97d4a9cd246c7eede3fd069018f0d01a41dfabca3e90a741835ea4a9d682342267b250fc1c8c547c89632d9f689af536c7929004ded0d96f09 - -SEED = db5d5f41fddd6768709747ab8239bb4f42a31d34b4fa88824d94bf78d3149264 -PUB = 03858ce6b2d24079eead66ca0dfe772ecda9af4d46bc9b5edfdc286b95fe9716 -MESSAGE = 67ee03de45c3e7030db5246ee5b51bf298bba3e4d0934937fc12d9a629604c53c070e30d611999a9cddaf2d9acda6a9f67202b352369d48260eebce0e78e4d5ae54f677521f84a7be0017fab278b2b57275efc5fa57c617186fc1ba49edfbd3308634878d864f2da1583ca8d56ce9fae77c462039abc32d0539c0a60b7bbba5029e9329d275683d9c4ce77d0b908ade98b0e32b4420d9aee2cc10e4be922f9572582dd8967141c1d402e215f20aee0a890e2368e406dea11bd11177f2e038aa2f1a0dff51a128d955d5e5f8d5d0009aaa82440a96864d6c697f910d1df230f467f0e02a2e02bf9e45da95f255410cc5aab8d85f449a5de99aabd44fd763ec14629f3dbab1a247bffb7174648e43b9fb1eb0df5e4109b7a88e05512b20865bad39f9ea79d52f5188e7ca5194405bfb1a09727617f3f6c88192008edbc0c6585dbf261f149dffb593d42716e5a5777f5462beeb1e9a56a2c76e6cb735117cc1183a38d1e00b303d174aa9cf5c731b2c70edd79cc5dc96f4018f1d71d7198bbb7d134cd2ff8c15f9a04280db26a8fa9997eb86b133c022eda15d8ad5e77cc9f62615960bac2f9bbc3ebbd198f72c572b97156fa7fa229a98014e170 -SIG = 5b3d0da7102355486be4d69cfd65886c9d9c8738b293cafb23b2104bfdac8d7d01298eeb18fde3ded6491d41b419cc663752c4e67dbe8986833d20e4ef34180b - -SEED = 7f048dfcc2650cda59491d4ce2b2533aecc89cc4b336885194b7ad917db5cd14 -PUB = 08001b5d40958bcb270beea9baba3387e3a4b900fc42275657c6c691a2e264f2 -MESSAGE = 917519cdb33519680bcae04faa790771ce7d1397c345f1b03dd7625776f3f195809932618b1c64acd93ad000ead09654a33d14f748b46b67aae0ff12df3cc163280f47cedc16a8579034e49884296772ecbdbb71ca29c166233533c8de54012b412ca13cc258f7c5465d83422f524e4c05f806313478319fd143cf5088e69837697d3615d80a7fa7e7443fca65e753ac1b11d8eff3476636ae02d7a20f4b2388dad684002f5ce957caddd2053d0ed533132a81ca19bb080bd43be932028cb5f6b964f008b5b1c1c5993bc9b5485b22bbef701f0a26a3e675ea31122bbae91d864b54d895afdc79ca58d4fe449213353b149f3143b5144d747c5b4697479ae68528485384044aa2c99ba4b17b184e94982269bde2de0b17705d0bfc46d6906a90edefe89195de6bb8f3fb6a374186c7cd086d13d1b3525a3994dc8020e1a00554ac8a82d6047c5bff5e7f12450f4865da161e1a021fd9be8bd33a32bb54a4ddf874512e74b5cfd3fc3cd9ac11edd878433668e3fcc782b97b6d905adb0ebec42c9254ac90f35822c00f97ff3f0c7c39ed3c7cb3920f5608bb45838bb242a52a8637d7cecdcf489fa183b45451c6c9fcbbbf914f5f7e6b223bcb4675 -SIG = 583370971d24652ad213c42615911938fa9aa3d9b7196940e6eb08151200c7b6729d1eff8f4f0904074dab3ddda6af1e4e562b7d6220c1a562683beab268f80e - -SEED = 9feb3df88c494a99849c6fca194201477a2fa7564e29fb06cb44c1154e8cea3a -PUB = c35628ca6ee28ec1c239ddc5bba2a9e09e4846816b143c74dfa2aec1f62551b6 -MESSAGE = 95fb7581bd25ffd442c3ae38a19bea7349c7b7683ba6767e148f0afc15373f67c16d471781202e6da8054ed7fb9ee204cc0f63c210a670a5f9ced4294588196330d31b8e8392bef6b48fe3c92078fae11284b4c3ba20d937e2719de7bf67c00669ad23e61384ebdf8c6e60735428c084fe217fdb4709ccb6083fc0ae4a05273eef739023d34bb73f662dacdf110b6dbd3e74fc1491e8c96596075fae5c36aabe2a0a53052bf77c4462438063aa7bc0c50ab920c9eb288671560ca5ba7af44a53db2e2ff43ca56069ea5517cb214e76faa53dbda100003c4f6175414041be74de22ce155d2281b6f4035be39841afdb96dd89aa808e6865bae62d6bedd919d3e86510b9fa5fedd1977c4131b2b86e0f48d7215eb13d5498ca5d2368f81895ed855a527124657ec9539efe3b2499a3b0b338262f26340e22554c79f4fad2b4e419c70bc1a2107d206456b6368781be4b5e2c54da42d336040fb7ba49c32d752321adcd92986e78bedb226ceac50292089bb579027f702217745afe06a5be136b3998a3604c9ff2acd6fa3f3f71633d3102fbf03047c5486f84c4dc2447d863796383d55f08c981fd4dd7dc1cb72b8ba4435af6abdd74e6f6e6798f1ae2 -SIG = a1c2607835bec1a1d87872fd8ee488d0ae9ed23d49fd6786fc4996725e49b3262118babb4834877c7f78fbeac02df40ab091b8b420dc9951381e3bcda0670502 - -SEED = bff68955dd6ae0e8ba85ab0d0cdaf04a9f5befd5ef6014f49994a78363dc17f7 -PUB = 0ad9493af80b15f07a521ccd674fe9e5212a4a28c17c74f6605ffef78a4aed72 -MESSAGE = d8f5650aa3581c4d39bd1b8afc96c1ad7c4bf723426f9d7fabd1a5c8ac1d2fe54a971fac765e05af6e407d7269bab661b3432292a484f952c11095bbd20a15d77c41f8f3731a504d518ee10cd006c96ee57372de5bea348ec8ba159162170c63e970f1c7a3465a3d592e1d56c6540fbdb60228e340909646320c95f25698cd4896bdff58e2561e3b3d9a73b89747912a1cf467d63e41455fda77477f46fe6937bb0e79d92ccd52e82dba908a05a57c7ecf49554ab44c0b718e3bdd5fc0bf7070d9c58f860591c18bca8b3a9a148a06548e0f01602b1e6f686037c94ff732e155d52d5b0b44703b3d11163e3f56e3b9c1b86476e4dcbfc53fa05984e8c75dd21843cf96f9e494abbae7184aa42736633e3811aeff402b2fcb7d7f702e447241e22a58842fd6d0c03d33ff5b8c792200e173daa7b217e4b2f4433e6c020acce501b9323aa0241144434b08e9d2469139ff67342208900546200fd971a65dbd6db6c21e3ef9172abba1ea9ea2a249addf1a1eaa3ce11938b13e30913cd0dad491fcbb3285ea378b8ef9227f3fa80b586ecfeae137066f8448acdfb78d6d3e9ef4a6b362df4241ad9ae253b8e1597d656e000cea447a02fa4933328609bba0 -SIG = 9319eef740633ada1af0e137644c61fb3e11ba4b01d3c6f25392dc9367872a23be56310d312efcb91bdbab78a75e576ebe9081972415f562db41baf5e2338b07 - -SEED = 1ba919c066bb56e640c3335968e1d1b5bcc093383e2d7cf8b5fff5c61ec47a77 -PUB = 804c90bdc2b3618b01f075e041fa971b83c5b6cfa3b6b3974f3fa43599beacab -MESSAGE = 87c5c75d8ad07d52acd781d1bb95f78c70e21c2dd66f7aa44234152f98234d128358a8aee98ea903a77b441db1447ae6ff3432ddd4570f7f58036122c1fdcc93cb21573739c19ccaa411508e08de2606f3d8f2db89df6a44a46133d57018462627e22f57ef36d1de024de3d4ae41b752df4821155934b447b2effe512487521be0356832a74ce0e2d8301b79f93175e8b6b961b1df637d8acadc884543c6864f8025ececec7c6e4fe0fecfc40dcd95e8d6ab93ce25595384436b598b73c74b03d49ed5002c0f858cfd9d0df61ede937cc41659d6708b96fc5aaadee109e2a68846baf2c246dfcf3d27c28bd1371e35fc9412631442ee75f38c6e4958070a74f6e6a220f75c7280eab4737d97e37882f3624811675f16caf60cb944bce92e75884c56483c61f26b6371b1b51237621a06543eb4abea7becc4fc31dbb5475b3deb9bb3c8992387104830c6072afe1af244bf681a40329c9b37772b09c5e88e78f7dffbc04549ffa13b4144ddfa538fc4b3300540ad830215e25f11446d289f33122c2c880de3da71c453d7e88f7ca4ea3d1255e82f4bc9e5533dc401c33040e16940b2cf9cf21feaca1c2c6c33337cf75e1884b483bf801536d304089115a0 -SIG = 503eb7ed6de1b776c952f255bbd4bcfb0e48bc70c2cc2f1f72bf6881479040c47524ec542ae13f6005ca5016b58b736a50898dd0569d4d38ad298630d68adb0b - -SEED = 9b36247c17710e95261a7d702f57fe81f2971117a50c87920193b386d494ca97 -PUB = 29ae39f273e35fb3f611da091600650efbc4fc4d1e7b4c76aced5a83f82634f3 -MESSAGE = e8d9d53ba27e98edd55df3c6b245eacddc8a40e3efb007bc918ec5a869178a170bb4a635b7f8f742e37ad45d14a74344a6b522830a522106eb960daf192dc1e0fd70f16160e122516892d0e2abd0d4ae0f0d2e5adcc99ad55302e251b3e7a4d0cb33774a497049905c33de1fbbc1ad2b6c645295fe416b4d12b232efe0a33cd2ad8732eba1c3cb0eaeb0b2a57fa03ec567ca29210bf6ff9542a766f496fe68058aa983806cbe7ab10a47920bac8248818e54a41551c9a0959e8994cac60fc868ad48b5a24d5f24a7a5a3fd90b847e817ad3dd5d0d6f8de2d204f642483bd53585a92ef925415a9b38fbbf07fc0f35e707569cf488b205453ce5433eba6fde8781af72b52bfbcab85ead385d9d3175e21ad3373ad535cf0e357ed6b5383ef3829a9d5095b87dc9aadbe0ca7abadf33ec3b6ffd6eb94afdcc12e8d66a6fc05acf97368db0f69565dcd8fef4d1e49d7dd4ac053c218f5240c812d4ebba440dc54cacddb1c39329e5bd0c3c80dc3259a80f059f94679aa0794ca0115cc62af25e124cb8a9d4160eace6d22c7b1c44544f81142a19ebb02a9bda6429c50e783db4a07f0219e857c8d3c5655a582831c8eabc3f19b59ad8d2c714adeaf4039d5cf70 -SIG = 035970a672e93f87eb42cc396f6ea7e1b3dd5c5951572826d1075a15c2d7e454df195b51aae8dc61ef7ab895485f64e5989573d98a062e67ae7356fe5c9e3b0f - -SEED = 6fede7396c462033189acd23d2f9d02b68898d35f3a01a798fc24d488de93a78 -PUB = b34062060b2c20076a98fea939b3b3a50451a5f49f8351c0ad7591dbbebb130f -MESSAGE = 5abcc14b9d8578de08321de0d415e3d40e9de31e1888137475ce62bc6fbee8fdd03b9d47c7b88bbceb804444490bf6a3ccb7a273261e24004ea67cefa3d5d173576d01e38f76c1e0e515083c97e79914acf2be4160ef9360bbe986b36e9ff93346b0e70691d934e47f8a503fa933ab2a50426947cda8e810c9ebe3b36982f09aee6092739fa2358b613c7f129db0dcbe368bee52f2f7f1dfe3d2434605b5afcf256071717d924fd0803bbd0dd1f9555ce834dac781df4cc7aa19e7f11da9fb99cb9e6b9e1e6fb4f7e8dcb2236c28aeb6cbc55a130e03c1b17a991cca1b794e6c13732d5b0a66f6eba860ecb98555aa4c218d112b116bce238295de142741f687be0b2487f58ffc5c12a0a519f1e23793242ef857ed398a20699d4351453fc2f092762abde34f4da2dbe0ce2aabaf6bc4c0159f3fe1aea16a036f7eaecd629538f3e0eed83c9a4dc1abc238f90daaf489fd61b34d937b6f4607a788baa82061943dbab26c1d384d8d49f99348800bf361f871f5d6cda18f689918cec31ad158f1863d13ffac5405c162c32de06e32994cc4106f95bb4fffdbefe7d629ec7797394609fdbfeadb46927370a11fb38471540f951b93c6eb238668dc006c21660ba2 -SIG = 88a83e2012d209ca03b8ebf6de5bb7ef4ccb5e3df5cac78954aa694930e4de82544ef5083c4892db9f05d77bf63f4fdfce15a4d1c3f85bae8077062bec0e7b07 - -SEED = d559580134ab050aca446ea7750ef6b371d92d7645ec7635fe7851100bc4e51e -PUB = de5020cd21a8b32339decbedff24664d9580326327aedf09c5ec6b3fe5405226 -MESSAGE = 6842e3190a110eee96c507d4bcb4c548c3a0ed7b1a8ed77dd93b38613b23c73e830b205e62651921ad8296b08d1e1008ad78f2996e3c7f38032e467cffecd77b8525e243cec021f85296afd545d7be1a62568bb0cfcdb90d614ed798bfb7efc655326816a61082251df01613aac88efcea1e0ea2961b8f921ebe1558dee83374a0113a78c55857ce2055bb2c48badbd3d8f4cb19734d00d0604b619073020d72a99a1923e6160a09946567fd4bda66442ef5a7360786d178dae44922f350ce2edc6af73d1bd80dc03ec3ca7005f4109d10c6d4f7d8fa61735110f8dbaedf91a0bad7d7fb5c04d706373c15c645063ff4b4fbd2d559b0afad432d4c496cd8abfea286fa675dc076726ec522b3a3c2f47aecc539f48a792169c4cc8cd41cd2cb6b63ddbc19373ac9691c2bc2f78f22603d5513715a16d4574e7acc4bea6dcd8ca7f19865a49d3664a210dfad290774b10b7188f255b3be4dc8fa86f8da3f73a4e7c929951df30fe66a17c8cee23e4f2ed2063f0b02ab40372cbe54b9a708df7c48a06566d39b19434c6c766987b3ebb00675f44c4b3c1e9f4504e7a9270589c0d0f4cb734235a58ef074cf9decf3601aeeca9f1d8e356cb2db5fce79cbc36143f34b -SIG = 6fcb1ac9290ab767d59b598c9a24ecdb6c05bb023ec36014a40d908ef0dc378a4528b3760d889a79174e21cae35df45d427ba6ea812bddca16e35a69b5e79f0a - -SEED = 9d4ce975547876636fea25437c2880c9aa8ee6b270d1b2da197c8d7f95e7dccc -PUB = bde4993c030477c35890aae82bb5087e914e64b94ffc64e2d7a5a7c919e2d902 -MESSAGE = ea0fa32a4a288811301b9ee533fa351fdfbf6bc1d0555a7402767a3a9198558f74bba7031857995b9f326226f1dd5df107b06342203eb8d40c5f1dc95b4f3f88975aa24af8769e2670c46671bebb7a0f1b7568729aee477e8988af9c749f3202708171fd94b337ae67ed21a6c44174014b0b0eb5ba71c277978d488c24c4a7841309846b4e30a4fbbcfc45078d7e14014114b1ac64f7c33c9ac25ea5626c2c819fbaa2a4de8a2bf5f1365d6b70407e8094f99197ce1f0c35e11a98fbe372414ea2064a3a12d1cd5c8df8fc0e79f5b770b58f477f91976ca0139895120e246baab5a026f2d39c687dc0788334b5c626d52cdebe05eaf30864b413eebdc5581ef00d439276e52f479c9c05b116395826b60490b3ce700cc0027f61e46ca2f6fbc2c9de2e800806550afb06d4a08eac7a758e24582a4d6d428b433d365fc31d4444607afb64f15e370794005a3a2244e666d5d4c38ad2009c769a51cdbf738d235942f412d07feeb73b3657d0b0c91cb5940bad6a706e14edcdc34225b1c1f38b1abecb2adcaf819155a94fe190fd556822d559d9c470854d3a43bfb868dadd6e443d98ee87e4d8284f5cf3a6dafaf295b902836c640511e610ae7d0cb1b1d3d6079fe6 -SIG = be17444cd465a87a971df84eb102f9c7a626a7c4ff7aea51d32c81353d5dbc07393ca03db897d1ff09945c4d91d98c9d91acbdc7cc7f34144d4d69eb04d81f0c - -SEED = 0273868232f5be48592cfa05134e8d5554ed1f9a57bc7e3982a330c57e5a7f3a -PUB = f172208782db66d466cbe4f4417f6fc477b7349f2a98db56c03a47227546bc5a -MESSAGE = f7a1d4614cc64a3bc48f00c6276304f34d4dfd15e0617b93ccef126c5c638c9d9953aabb7df42df4e0aaa7eac96a4b38c7ba758d860c90d05e3d14e479e545f319b0e5a85ad8f0991b43d6e49c24fa060e3e5df95c98d9451ab833e12aa97f404611bba359496265a6db11917d0da5c6a702d0b102de36dd0c98df5b54806ce626bb96374475f68a6060eb350a7d2aae3204b3dfdf9f1e31be81f7170f8a1b9385413ff8f6881e10c1e8da4c88afb50639ab44887aca2abeecedf110d2958c13fd3390d1b96a762d16ce196920ce85f6c415bed545b1445302a6f001eb8d00e97c751887868d481a0b1e4dfa04b6f761086ee8e697b019e017104bafb98fca242e334c6f18f1db5b6f295f05c559361c6831dabc42c2110703f9d1f64e12ddf26a8679854e9f8ef8479e1f12c35447aac02ea7f242e58632cf2fd063fe665070445b80f3dc6a3303bba96e05fa88eec201c5c2d00ca81b8da6969d0a4dd0483b3477d325a71facd6fa2209b48cb4f6525da73c9c05b2d9789b01448e1527e56a09a9bc6136d9837243c2077b925bbb933f8fb1daac963398c5802aeda3bbca8ae3b8f4a9a871f7ea8e2c0ce898c566217b5c06ff55ff9f4fe78398ae7973641eafb521 -SIG = 15e8d8dc7d5d25359d6a10d04ee41918a9c9df4c87be269fa832434d5301db022481bfa395a3e3466f9554ceee0532a8183a0d0550e7d1abe99fc694c6ff9301 - -SEED = 336a83b55abf4c02e25e540329b5275843c2ecb8df69395b5a5e241bd0d8c10d -PUB = dd60569844570c9f0a82643f446478b5ac6fc542214231a7ca656a92b5fdaa54 -MESSAGE = 9afee8ab482010e29264b406d9b49453d1ce6d550939072182863e4665284ab05d86258e0623b18754c4785238f697f075adfb9e1d31a42e85934ec071ddddecc2e6c2f61334a79526788b4952190716906dde17fba556eea4c8b59727514f6f5615a19ca36da358fae6a6c54f7f4b7a929e31ba7cc71bde7882fa9ffd87300136409caf3ca64eefea616aed58da5dfbf28b668ec1cccffcef6e2e14f8109e9cbf76cfa414f91ac00f48e93eada385dd3d5c16e1a39ea3dd55c761fca361b428f516c05e694fe5c3c345cd94457187a8e604b200a1a0f937ae89f4d6b5421dffcf7ca15f2e2c25378a4113233f7613f4570aa4b909a9135eae4c7b9ead458007ae17126a11d145258af9563db2f7e8925431878b0eeca8affc01ac5913bf5bac4fa3a857c54cc8906d6af77de6b9326b6506151099e87e99b1e819c6fbe082688f34b803d588e416d853169765d62f7e0bdf72c5cd66669a0335562336735e7efb734a2fada327f858bec602d0da08eba4479e7f6dc4def6e4ebdbb730ee91a33445cadc9df52c825ad36149cefbc51ab102033530814bafa7e87961b06367ff896f08ae334a9b1aad703da686706c11a04943ea75e12992dcf6106e372077cd0311029f -SIG = d263f56d59cb9b2896a947267c2ed78a945bac5abdbf3c14dc3ad092b2308cb9315c464942a0a20b2024511d766e85c936499a149cd0bbb209150a1643265200 - -SEED = 88409172618b490393db27d960171cbc187eaf4dd8b320b3d2f824980043718f -PUB = ce2e7c5839ef5632a123dc373dc14b1f0505766e9675407604ca7cf54e8d44b2 -MESSAGE = fb3e82f11bc286267e123817ad8864e077d9f7a8e7a163ac7eeaf93d55dd111de8083b66b53ce7bc771fc5071a2d7ac2f85d6fc6adcfcec446e16aa1046df37209ad7a29cf9665b439a54d6f8d942f89bdaa56f2f11260cc95993038b0e8fbdb3214f142e6c90b61a1d2b142076206af30ac35784a6dc15a1e79251a8c7731a1c53978038f8d76d70c6c1cdf529fbdb84d1507dcffdd42873dfa6a8fe6bd6f7fd29c80e4b2f933d2b6c9e62c9457e665472655059b63b618e2a9a8e5b9e41c3646173a892b8e6d4bcad6a62a6fccd3455890b58ec2681a95cc9776a9fce83c54a9ef312a331959c7ef3f79ee576eb7b79469c9234b1eaef609884708fe4bb0efac662da871ba61ddabb3fcbdeb8f635657dd9a5d7311e639a824858b9a9868d3f9384da612c7f2e771a46bd2624c99ea2b6ccbca996c1d9c375554f2a551619ce6d5e6e4d6b844a4dbea83ba732331fcf46572c1fb0e257ce1041b265df02e690a92814bbf3b5ecac69ee998766a02b0d2f908b3c15f952699616f2c07d589198989e6056c16319aab6cf8771902c078046a88b2570c13bc5edeba2ed1e3ba131daf94e6891862bb3de7d1063fe405307a5cd975693e9d58e17c690eeef4a2603cafc68c2b -SIG = 93b6e29d63945d5c427387d006c7f0b01956a95fc0436ed42b46d0f17b5bb193ea8c0ebbf3d6d13bb539e35c91f3f0f9fa3414a0223c9060bac83653c6fcd906 - -SEED = e571189b5cd9e788302de3919d850c227dcbb615022e568bdaeb37ac5b2939c5 -PUB = edda890f42dd5fbc7316a5fadfbec38556f23f51b8efd2625437f6b5069f1ee5 -MESSAGE = b62c867ad6227435bfa6dab830684e38d196e1f861aade0fd6a7699b6d60901fefb2d799c35c6f3d8bb94deee834403981866bab84946ae9476c75e9f1d3602b42cb2db437bff33a775822f0d6a257d4b75400eba5b8abb314b71fc6b46f8a34e861a9a62abf33de8482f63f9d7169e773a2dcebee03705dac117fd1499b68e7414f51ff9437f253a1d9901ec3b0bba86965a19383655487b58010f804909de1ffb2212c0252ddd9bf2a56ac46bd59c0c34dd59e46598b6babd4e5f3fffde55e48dab0398c22af9e26baddf77275e5f017b35a9b8f8435f9631936b391cb95d7adf35d1d8545a0fd066412d508967bbe9a20245a269e3be2777117e75fbac170dba352be69b254d353b3b2cb3b7e21b721aa9fe044f8916b4b2a6f8c28f8abe66ac92b91323ac73afd93dfbeeaeef26d19bd9f67e99d48cd2ad2d3e55e45d24d54b50f44a39b90e242ebe9b42bebdb230c470bdfde1bc7721c3120008477393dcc2e15fd22b251feb0e18b02883c078aee4fb760655a671dc7b8aadb9a562420a3c2efa2d342e1e0099d951b42242984f594e6914fe282b1ee128735984ef93a669e6ecba26c9fcb9f09f09256645617f1392d35908917cb8d29e0897c7503cddd5de1959686 -SIG = 7f797a31715d7c356f8f1f783700aa9974bb936d661661ad968c7cde1ac9e767be56a2dd49b9230e90110c67c0ed187cb7e75c3053ece844984d296f0d85cb07 - -SEED = 371744ab63c115613929a343709bb019b7357dff72d2a149f1d0f71d3a201efe -PUB = e58abfad4a13859f0acb05d0e47d59638f7b1b4936100b988d61e6e70e22667d -MESSAGE = c219de1e8d7ad8df08c49377396fe7c1f2d57bd2170633a00d708faadee180ceba92849a7778506cbb366875bf9124701894cecdb3385147d0671843922a649aff7c435eb5a9c74927503072d0067978716dc80be1545a2dbf5a1c38536e12bd7720c1965d3803a4e8aa55765192a13b705ca1059ded0e806362fc5bbe6c76a1c9674bb853790f7e90af00753e00436da48cd082ead64fddb689890162082f8482924f33acd604640f69927352b43f64402d27a883fa6b72aa70d241dffaa1701a25cf1079358260793875f76a2978e9f9f9d68634eb3f5f01bde1ce49e5921252f949f082795e4eafed7be5b49a9f95edbb4a13532e3f3b3be62e2652231253a20c1d5477e8f4bc57ed76fa19eaf03a11bba429b6496ce76246170e043bc14f2d2f703d968f1deb09388715c37cb4752da8d464e348e0313c8993e24133a7c545284e3c9c907d01b260c4883f9cb3e3dc5b6f7fb6d75536365f2132eaeddab570e7273afac0bff5c9fc0b820f2078e0336052e1fe7bdec86674d0998ec78da1c3f34751f886727695f35eca1304b14734766ab05c1186306ded9db3eef65d3c0456cdae8181afee04b296c6722a88c7ef3088d26f7fe74bc89cf5285c688f027b7e68600486af -SIG = 5eae4ac72af0174ab256527b7cd337a0e5482e615af068db21dae35a64640742604df73fd4ca02ed9515a5608d73195230fadca7b426f02a2fbfd02061af3600 - -SEED = 498b6ee6492d53231b3532d193578ba75d6a894e2e530034e21ab8ad8d2c0d1f -PUB = d124665b28facd2d17946a04dfe3d129a4561a2b24eb326d84b62b422e44dbcf -MESSAGE = 0498a59b87cdae28695547e10863bce804d97de0ac8008f3d5fb652c1757419fdc9e0f9736f4c59a34f21cfc74599fa788fcc10c6730c7df8c3d2c1b6a786d1230b65585719d1cb5c490359b94435d6dd671f54d6e9a19b9b5aaad7e0f233f8797df997828d88cd92ef089ef7dbf1e95277894a2f7c2fd0c8e4dfdfa6d3d14589ff01916dbf9ddd811c2f5e01e94298990a145a6cfc26895614c7c963fef308a4e3856c32dd3e359bc56d2cca496ad199ff1a568d6430ac5cd208e0e2d07803ca523e0d813ad3733ab50bdcadcb988aee758ea50439bf38ee649997604f151c602c82900a8205d8f6f670c8684bf5abb5f75ff29a37eb9bf8105199fbbfb4707e162e64c715270f853e648b0aa26fea0f6db562896bf424a9ffcb292fae85b76cefb8bd5a4b3ce1fb39bd2a50d0c9e6d933e167ff629b8a494f2a9b774eb303c781ea02aff1a8afadc2465cc616968015ed6a5a33c3120b945ed5351981e32fb9fb96b2212dcf8fe9ac56e3cf41dc524f800631020b025919178ce074eef078d6842012a276efa628db54058d1eb5b5b705f1e1818d2df5164baabb0c61956ecdb8c706e562fc4fd64052870530ae425b221f89dd6f90dab882e763e7a7ffa141bbaa8bf7a3f21b0 -SIG = 112f5c6d3bcb3dd99346d32ad69cbfac3e653bef29c68a33f43231f66cea1d0a195427d6e10c0e77c5d55fe2794287ee32e5e22bafbbd8052ad3606b90f94505 - -SEED = cefcfcd1cff4d8910749279131830b1da19dfc5245f78ca68b8c3c1b622b4551 -PUB = 1d394abd1b4ed1aedf966a60efd3ff882140a7e56b428374ecb443289a9c7f00 -MESSAGE = 5ec94ed06fc1257ae9c183ce56271207aca37a23fdb4b0e74ac9307a1bb112e05ed5a5d047c93109e2e59477b03378346422de36714c2961bb9736a513ca3671c603a68c2be7317b1b52a076dae2aff7bc88cd5eea0aa268faaadae539c938bb4fd4b6069b1945eb6af0c9e6c8aa5ee4a4af37e90c67e248e8d27bd7f9589c4d30e905651baf45364fa049957ea5d9b7146ca68204e5e973d0f1c91a1c4bded66115028a71114f0f4f851bd115faeb954e3f71a01470b2481a0098d99f9d74898c8ba0287cc7834155214173d1fcbafcfe9b08250384439476055883833816c9524cfd5744aaa259db7ebd3a6aa20b5a6546dadefd140668eb0eccb5f668db9fc62983df980850c9d19882a17550d5dca3542cd36003a0d03cffb04575a3e8e1d07015c7b30eca9115cd2b72e46dfddf6a4dda1faa2dbdc89000d433f6ec9adc46146d939f32121b99b28983d98b9dde8c3f6e5779f2b0700cb023db13de656e0aed1da2d5c6ba2652343648ad420f6ab9e55a97482a1a22b3bc2ee598629abad9547edb5ff790990564bd871f81b24b12f2bf8dbdfe7a88375fad9ccbd9fc0ba1d3bba5e3c4813c18a0348aad83fb1b82689054d99b4600dd1760d0dcce44757467bec1946406d530 -SIG = 7d83ff66ec79307b1c0c093fda3968a96cf6044f5c802888584018845e7caf2a135ac6f1677e84d22e458e227e4f930209919bc11b12f7aaf2b8c94302d64200 - -SEED = d107cf26f527db71a206e41d17955321013225bb20f93e12df3dc7399e720ca3 -PUB = 186bf453c95dc0a2fd589a78e2c80040b3f6ddf9a6f8681d146036cf2146e8fc -MESSAGE = 78eb9e13789928a74f360141728ede98389685c836b91fafbf1a7e8c19cfbe21bd3c3d6c6ed83c409ef693f1d735da3fa466497e19f38e30fba2a1023785459070e6e92c1cb7c9bd0c9ba61220157866c3bed2b01e6e6b9b8dd3f0c47c02f181346a0a9b9b5d3d7e18a94d6956855e16e8eaaaab71b10302f35bd8fb1f9b5847304160324926645b0582c2f2f1533a24281461514241db2850ef31c5763b2e3d4fb18fc6d8c1d7e52f7c13392c17e27019ff60008e431f1714370bc0efd9452a61f5c56488d91a185037f1f647f72fa785010d5d78f0a11587ccf66b8088e0e635fff3774193b2edeffd92d6e8a0321128ae64cdb862e631e2ee5ba0da44bbd589dc392b5a113b86a727a8ddb698a334cc668b39b1cde199b88837ca5f00f553f89c622834273641d39bc10c6a24e1eb42587542f03fc1627524ed6b749391f11028706c42364425b2caf20180e1b802c744b49b7bcd9bf7b15c23a0bf1c6965960d341554e1966b6ef82fcfbbe41d1e09d741e309254446777f13c29a67b8bdebc5f7f04d160d60e332e3d0441a0f2f7b192c3e2bdf6dadec2a424f88669806236ee04dea692bd8bb6f91ca0682ece349142575358b9b7be70600b3cb81e1456ba0799fdc01ffd68623 -SIG = 8071d97f324f10358f13ac8c61d424b4f300dd0419571c39e40d99aea5f03140e62ab4c97127ab33e98269966ae1d4557e459bf7f597b313f351a20122f0660e - -SEED = af7ea8e41c8937a4ec475ad81371a171d3d0f9fd7519a04c751ed4ad8ff8fef9 -PUB = 15dfc71585bac71ef20f374987c555a3f2f07d6b9c787066c10d63cf06e02ab0 -MESSAGE = 05f2263f0245ecb9faeb14e57aca436668308c8125df3116c4ee20501d0cde701b366e2b50a1c5edf484144ce16bfb1f7d26dc4275ea9732e264ba4d4a362b40275ba47377dbc332cb65e2f4c8853894aa878a4c175dc5b3b2a757ff3c8d7de660973b89dadf076e2e4fc76239b7bc752a229d44e000ceb667104cb0746bfcf59d69603ae7fc1bcf11d2e33f61dc497ec1b0bd5e4f1dbef435f2f291f30b00a85e833946c8b10484e4abd7d60bdbb1fe6dff5807a53bb89382153013b70ca08efc91b7e9fc5b5dbbb6af123b57be2e140fc471a45d89fa8284cc27e0a1fe771f55598bbdcf068d506dad0a592179ceca39ee9526f9e4fe47bf2bb14fb1486a677d4d7b99a520545676a0f1fa809049aa2414ae7b817d9a036e5c157886e8341d4e819c092a3b48b3606b03acb727c6c2217d0af30121546a94af6b49caa2a8c9b1786fa0c2a524ec7a023e924b5f8a89a53780c7f8781c5b8e869430caa0e6d0437967e3aed44f45c901cbcf1026fbbd4e3dd9a091ecf8b34f7dd5038e543dc7eb6ad5494efb145cf63ec0d355bb8e172f455d8a6b13dacaaddbc56e47de3cf762a1a738ef092f1436680467b5cd82e9e36e2d2b6842b3bd5dce77180ddaf0b643378e698599dd47f5cdbb -SIG = c0f1739167274bf91831c74beb645af790459b28bb3f21325365130f409acb66df1d223759a9758e08fd7253737484e285a6fb47404abe2eba5ef249fd025c0a - -SEED = 0c57cbfcebde10ede02d1cb01df360d41f2e66a50443d58b5d4f0828c9a18bb7 -PUB = c4d761ba189971b9462c61bf46a765f88e2ecaa5bf2211220afb00ac657f7ce5 -MESSAGE = 337703243ab5b4e4d3481ee8dd1f4494507174412658a93988b5c30403a7b7ed8522ceb46fa1ee02753a874ef0675d397c575da0b08caa8cee3393784d0f0db8459837af90b9056df4e38e417f3ad2eb1a100ef207ce2ca6c610018021661e307099f2b7c4ae875991140bdd3f0f99ad2c5d55aacb84cc1cdcd579e08072b6951fd45ed289ac9ff7f0986ac88a4fbb9dc9203d9baf180c90edf937258c9d0a6d48e220f72d250c7f2c777eaa7fb9fa11d50a5798772f9fd976b00599f1f0276f3a2e4d988ae92125467a8dedb7a16f9e3a56e8d00662b3eb67a35b9b60e73bd935077ee238df8f6e833b9a5523386826c1f2917b1c3ec98e0a5fde89c48b1d446da5d0c885fef0e374bff30a997c7bafd5e743c85d0c6aaa6ef10a061211a2327c6d84eb747a56e9bf60fcd5b553b798834d0c5ccadb9d4b54e7237d12c679c193a287bb2f511cd4ee2a2d8549b44b21c11fbe5723381c6c5f784687fd90cebc5b495af9e414f2961b06a1c8433b9aa3292bcff4241c227167f8d1de054ba33ad81da3eb3ec6e40a6e26854af349540171b75d75fb9a8d12937827fd594d317b7a8d9f1c2fcabda56375568c3e9e514c2efffc3878363dcfad9fd95436b022e8772a88cb71e803bf90381962 -SIG = 8af7bbe01b8ab93951d16fca05a9c967d1c52c974bea151ea72e4cebaa20cc783bb61d8d69385cac5bc6d72dbd162beef1fcb5dd0e0a08b48ca0b9f6d9a9880c - -SEED = fe7172278364194bcfefb4783142b79f59d5fd978b1e47c314d78d4cb3f61c8a -PUB = 2e82cce47910c7e2a79bc1f419dc3c3df54f23291fc8193e8258ccd2fd38d548 -MESSAGE = 23509451a059969f2b4bdfcee5388957e9456d1fc0cd857e4f4d3c25a4155d5ee91c2053d558062eea6827950de863bc9c3df9672cde8ba741744ebbddb45ec1f4284570fd0aacd07ea58c581be2afc95ae444e678edc2a02439f387cec982ea3a44814a8a302bb3bfe8228d58de039debdf7c2a7eddb4e71ca474f94f7e2bd89dc65b1610733c91fff89bd499f40154a6198fdf5ec7ad3722d925b292196c429499075be0c5b6da9c090c0791a7019eb5e7366be6ce58ab2f04fecd9127c42718047bf47030691521312c0877aa3f36cc5fbc9caae0fde3945d2a868ee2502a3833208eb850a163cfcbf6da9ee6ad9fe067fe241986fe4436d6ae4edc61561938e2a33f4a33db63f69d3f1a8850ed40028869164103488fb795cd82ca067fe1b4897caa49a7ca9a80f3a8151fd13bbb7ff350e8579f565dc1c4a9ca938d27b15b3f858ef45d3dd78b2c358635356315f55a97528ecfec5d11a5b721503107faa406c17034e601474b3b60cf48692e269261158fc353d4df4274381357790b7756087b00cc79e3b9d28a3f2439febf199e64a8b37c91b5a4334e3354e8faf3a361e856c54bdaa43bfdcd6ee6c9f9679588f6069950832348aacba2bfeebacaa2071ddc7d77898ef0f68793cd25 -SIG = f6c2a4296b9a3407c6d7a5679dae8666b503d1a17eacf71df493791b8ff0c0aa8eed36b327a29ab7828f46f22de868b628b1cfd501e8599fa31693b15f61080f - -SEED = a951e4e6ba9f1f0b354831c986942448faede37e11b0f247da2706dceef73ac7 -PUB = 30362014974bf75c8495c2e271e713d57384384d0a5da88edeea79279c0c58ec -MESSAGE = 20577dcac89174885eedb062489cd512fa72863ec5438e31e95878b75ce2772aee6290a0ba3c8f642c1d0ef55da8d5bc1484f83bb9876c7a8c0b6b609b94d112a06fc83ce8d2c1e08ed6c735e57b244aad6ecf7075363d565ba47865695c8423510909e0a3db4b61ed7aa67a7471331e83a0c58b8220a6245f65661549c1a12d4c0d50c326fb94917cbd07be51e83fe8bb3e46ca01b0a260daaf1d6abe3703d6a925113bb4d57ea1a48b4c7dbdaa03eea814a4b5f02e1dfb545cc623fe17a3bb18e4373f5f7ec2fb5217d23e4fed54a772e11323e730aad7efca8c464400e7679055fcc125a876ef7b8b9de186e229a7abf191d0c56d91815f67872e957bfbc7634aac403576a58f427bdbb30e8c4b6fc6c447741024ebb503a5a9025124a4887f825a43ee940f210a1bd5ae4f6732d60f95f2b83201c4c6dfe279412d7502a5211f8f48f800db30fc3776c4ed3a38bb4634822c98a6d6dd3233be60e42cca45a3163cc84e9e8da647c0711bc4c6ccd65aa1e972c07404d103e74bcc31a7e2c3eea5ac9257ab428947ab3dd3fb153d90694a4073373c4dd9ceb131154fe877473fd996f424f33e316e4eb02b8c7513be6998e516cbba54d94cd0a435e0ffcc2c0a8ef72b630ec24781066aa5efb9 -SIG = 0278c86a15208d9be5b1e1574761861b8af72ae08d40cdcbec354e65a9c3d0a06b5fcbb297d09bef397462395986c3093eeb22644c003c3078178cdf674e990a - -SEED = 38a9b2d49ba8b82f301a5772cea0efc2218455c8b218b22cbaa2aad2d7ad3b35 -PUB = 9df5ea1f78f810a521774602bbba4942f0459238966c8bcd21900afbf3d84293 -MESSAGE = 1778167c49b3a44d4a5ba838b7388553b1e13d36ea4f86d30242e1a822a3bbaff5cea63e2ae2a4635be236fef2b8135d14fb621c0bb773c9c17753f80926eb55d0f115bd09a885d844b818c9f04489a331bb5e032b8e58cda36949c5a8d08b55bb8de965e1f90d3b9cfeecfc6ad9a4ee5cb4047e9450acdc64640166a8c069ea849aebddac1ae4afec91ddd17fa5553fa87c56f7e51ec1cd6b5cc23351d057a4ce4a8923c8ae6ac7a8afdcc0881c0e74ebb024ef7296162cb93c68e50bbb074e651ac87dac9ea59d4c3fbf0fe379f3e97a24566ecae54303bcfb6f0cc9f15f6639430e66b19a427849fdfff833df02689e9de44006c903c559183459b9f4a97f54a0f2a28df7b0e9deeda8239d7b516977f5e7d6971b4502e9885f750af8d1a6669e25e77d5f327c77c87a86e0a1872bc96a76060f5f8a0c40cc973bfc7fe6ed9bca78f884e6a2828b94d489d32a0fd337e69db83fb8789afd4e8ef54c22a78c2587468b9ae071bae3b202d3183ad5f0f8e842e5a8de85bfff49e03c8381bca7fd4278ddccaf0134fb5593a395a77a5cbd434593bc4ad0ff4b8400ec674c4ecaf1d57754be0cb2fa9a6441a9abad7b42197ad82e50827e4a4245573a8f0ef87f58228a2867f4b3b834b6635037940a -SIG = e19e62ac539a9ca251d12d4c71055b0a3f581d19f2682e672404c78ac1f12bbefc91519276a5cbe16f520cf7a7f687a240f0329157c59f50026a58dcdc50fc08 - -SEED = 9a1717873689a03c112dd6b4d76ae73b89b416a598ceec209e27961e7bb1ee8a -PUB = eecad1e0e4b863291881a8c241db9ccfffe4e55d8b5a42f307b4436acd0649a6 -MESSAGE = e26580470901a07ab0931aa23829802ce04da59fdc2f773bc567f1e65b4f2e2d4a1a6aec1f54158adfce9b099790b503a13d22097ae23ebccf923f3bb1986d6e49111a8cf0d4eb8236bfe0d7c9e93a5efc7feb8e6a9cd1b8d921efa21e449ff49e06c1ccfea31f93e033c3c2a54ddb0f653a09fbd18a70b56315f193e7be56e5168f59563821d4bc3bbb0eaa2048286bbeee5aa3f3e7536cf2b750fd322602bb3847ceca39b75474322d76b1de80fa2eadba152d6f8f020d4d931c53f0a2801224d35deb6ec13b014873e689903607de96d9b7a743a887d2f48daf2ed2eefb202abf6082796981123b966e936dcf3483e2d24d694ecb865fbeb6969f347027fb8b175d24a4c045c0bb4ab5e02ddcbe77d4756c46d137b094473a02307a108340acad9d03bae8403af199cb75cae3162f3815813cc68bf2a5e499e594921149f3bbd214da5137e756521559dc80d9a4b74a0f4943022c7cd5fca42315e0bceeae9069615ce67a04382412313a31d67b346c329ad82e742c0a6ce0a6a02454c113e52022f3cc03fda691ebdfe14c53c8ce5ca9b932ca1a386e3eb4e90a4dc6e8ad8533b5af1aaef5003128655ca64f67fcd97c6ac803002404900bc0fae98463bcc31409f9981748789ade2d07783bc32b -SIG = 1af8be095538965800d8eff6d723d028d65d0e9c6eb5e9d125bb3b1783f11ef7079a49a807e27ef1260be26a3b231d03b2ae151e49f6f189f15b1c83eab01c02 - -SEED = 43bd924db8156008c6b3994a8130d427d514db8a613b84dfb0b8e0de6ac30676 -PUB = 1b3461c269d5b0062d5df6fa654a2586f647a0684218a06e5e2f7badfb394131 -MESSAGE = 6184e6480c42e96cc877269b16371545ff9523c45ea88e76a1348c68ae7f318b088fe4610928239185b6b55bfa0f43644c4a4c97c56ed77d08b1f4aad2f4aa069994abeca96b7bf81b8064ea4350d8a8b02297a51308b61c57c8f1873c6f97007aca3180429e730a6643f28733547bcf7b9adfe327e85736bd04af7f1d9f4fb84a7f3affdf4e22b574ecb4bc8836b10b8453aeaa5c1bf132248b826cc5230f75e075fac9f037561136e00643d08253e7ad652f702c0d15b6d7d48aa6f8e9b5f5cc146e3f156fb2522751c3710041bd922f37a50377e028b0c4e4bc3465d7c84af6a5fb427acb3b41378b102bda46d8f6f203a5ffcf395d435e93458a0b0a4c2e7782fafe119f769f67058c6677f6d10d9cf5cb8748e1805798ed233f6f930eee0e5075bc58b97af9177fda75d53708beb04dc4f19a43e768074609f14065f48fdad5077ce109bacc357174a6b7956f6e7f32e38415be526370fa58c3c0b31f51e6cd4b2cf27f8bcbc21259d9e5c3b5c2946a9fc1b00d9d15c3b7d80bfd9d05db91d249d3e42d8956682044548d83bda8d5cc9212442f30b45cf4aead80cce9b3512c39c5c737d3f8d747afbab265af5eeef8ca9362ec76e943b0a0d7a39f3db11eca14458a7b592e5e4ff2275dd48b2853 -SIG = d2a05d88d9d543d94d57ec88ae55681750f20b9be9c1e918cdaf457767f2948dd629e94f068edcf3d9927e330234badc3a02fa5ad3d9d85e948cb0b0cb3cd70a - -SEED = 8fb086206dd95a2621f598560ccb281f8273c8fc72e23611089baac89d3c3c78 -PUB = 20276ef479f4d4523ab77420d424e8819c33c83779ed80c7f666e8f4403f94d7 -MESSAGE = f02903ed4266e849a4485205954fffa8a108c323b7e3f84331043514e48556ab019497233a5a127bff3cd7c97086becef538b3f339d7d06e532dc7325e597ae357f816dea42a6a22c79d22074a2e1ad8023c424b7e096e5ad8897b05ef7d00d30a04aaf2981eddff2b347f1e27e20aabbe7e7a9544978e092b00cce420aba06187374ffbb37b4c22d75f04e57590f610a27347286c298312a6c9b1bdf24fbda8513c4f8356ccf757068ffc11bc65113783a5dde7722faf4ceb19fbb62f40702e2c6e6a8bb49ef40446450c4c59a2990944da4744f6ee770b930c246669813ce5a9f5a47dd80388981bfcc3a56b5be2c4c7e659a2e9182dec0aaafe9031aa3954d4fe7c431196a561a5b78eaba64f3db1b586c53b16f679a84921a642c260e4653a61de108ebde6f7053afa2cb3f3668ede121020dd1bace8418aebac3a5bd5142f105ac26fe49e5fb140c19b22d54a6291dfc954670247881646874defad814995519f6260e9774a8d185c37881b4f2543c4b63fbf1985016ab41c4d728cbc90b3ab876267bed41d0c0902f6b50e8fa906fc4788f7b820467306e0fe9e036a0a00f804f91c3ca718b95ff6d9e2204bc3161bf70fcc17b2964b56bc612e29402d96f50986514bc7d831d58e42793786d5806f -SIG = a9305e001600d597d05ef671699bf09f0dcc0c44475d3ca31e7ff1bffedc0c67daa1f3b76a035948c59cd87f82453a40950a1c9703c2e7d9280e7303966da301 - -SEED = afa1b846c210b52300e97696f81b8ea774d1df12e612527c55747f29c1937396 -PUB = b609566bbd1947bd7afaceb14389e836227169215fab66851aa5d70d6e2e3b89 -MESSAGE = 4cac1b1f4bd48284dcc9afc8b5955b64b436db704b0335d9755cc1f97477f8d323cb6410ef146ab8a9efb9526d8b62e3bbad1f7295f47ba9f0de958f8ec9b77ab42232437ed974856444cd22e20be35e91813bff4b016f810d0f61d89f6b614db33f34bd09985b593fe3e06e065b7bc6cd39d55c2cfbec7b6d59c0b37dd1d0d35135ab1d1b04f2f30c2f04f4ba2b36582738081cf59190f528363db944ed612931d1d514c6214f9ab92abb1833926183ac52fba2a4551e20e4c0ac959a49ddb167a381e0241d40c086e90e52aca017258975dbab2ba451ee539a718f076a58709c6697418d9c6f13e4d391368bf0e8bd8f2932dd95ceaf7aaca1241147d341a3acd08dc32905483572b89a80cc47231468ab8de359dd525a6257cf196c2ecb82fa8a78aa3a851c7c96ca25bf7ca3dcf3ca21453d0dfd3323d5a422dec84316102f684c359f226bb53779c0b9950939281ef79a58c011993eace085497afa4daf64c9687b0a11aa116cfa7b03936241a5567b646e7e42e9fb592405b8fa3c0a821fc3121b45b1753cec9a83947d211a45499bd63790b87f01472fe566d87696efedbb74ed00048c384ba7f027b3aa4298dc4110349fedf52a96cd05d08bd635771ed4510738d8f07a6021244d1903579a3ea739 -SIG = 98b0c6313cecaf7c82cbdeb3d0280641c61a060f65e563aa93ce18300a9b58272dc8680b485e8cd11cf80fdca868fab365378384a142727f2f844f87cfdf1905 - -SEED = c85913a6877877131001623ccda9cdc12b9d4043b8a83793c44696632cd6421c -PUB = 9cc67c6948f7bf6e556d0849d3b8d203457a7b61549b36681d754f1dc0841e96 -MESSAGE = 91b5009e83d0f6103399c2d3feec0084973a305bf4176ec782537560472db187a11b4dcb4b2ffb7f0644feb394b28e5bfe97247c4a4a231cf6e916bf99344ccda88a7f5d831d6de3d563dd102eaeb108c5bdce44e0632d17e6fa55b18067df2fa8d200a9869f6aff920c51d46a1ced2d903b1d9b6b075facbf91cd05eb41ad811a8ef40d9118261012c72b8979f15153dbb8561293da9f8b77c8ff14f75387536f0036d1713a72ce8c35b1062f2c6732aebf32936799b51c2cbcd6572413e7dfaab8641a02c150237381cf7a14e22c74c6c20009de7d3b7e69cd1b4584ac2c01babaf973c56b3814bb0089720e41968106cf26509d4aa546fcad5534af303ffca42b16ae6c93ee06bc3cace12e4ec718844bd30d2224cc486d106d1c456bfa165ea0120fab3df2c5ab3a523bbfa789deed44032ab0be86eb7cc09cdb7c07aa948dd5277c3df1d9d1843567dec84f9288e085b05ae4b8af2cea5d9a184d50bef85550c836613d5d3af5f9c2928e6a89660fa62719ebff773e46b77e34bc0470da4d2cdbc7071da758c4d39fe65201c88aaa8e6603d0bbe7c3e9b2d9e41b634682092f147341ad6d667f20c64e81a68d629467a54dd86e1ce12c560a6f9b64512d6f3886cbb9f37c37eb3985c8ac38dd6682f48fe1 -SIG = 01fccfdb1fb6888b0310a913170f7e366816daebe7650d72513d9506e66f7d62208a49ece0af1871497f4541ef605bde711c9e0a1205ef48f26c03dc1ad4af03 - -SEED = fa1e11dc8364208d8e1cb66a361be7e84c5e368166587d4fdb06aced7f62e17c -PUB = 4d8e6f4b3415df6cedabfb295c1984fd419923c6ac41764e32d22daf372c50fc -MESSAGE = 294e63bacccb801bbf04c1f19d0aee16f5650a6e8eea6fe41110663ec01532bd4960a527f15eca4af2f4e6b7b0fc340cf97aa234e92cf7d69d50e4009c2496e3ed4d9aff000f9e185275b817d26a0bab69b7f7ee1ea30daec8bcee387ae46b4b299c27bdc06eea63f24dbee955a6c0969037eef91c34321e3c5c972fde993183b7d23f6e019c3e0cac7589ae4a1521af87ea42df8c22c2270ec23d6d140f9cf6d4d52fac1b9d6c8939ef8131cb62a035c5261538bcdfd6db419a55ef9fe5d7a5ac44579de700858d74a3434844f28342c565892722e27f407d7f17b74a5934be915b20c2400643235f8ab5795f324e33c50644a04033542cb3816d770fa899e7311c14301c1bd0f5aa60a2eb3165680c720e1efa8096fc25d2779275f1842b2db53b4da0ad3e59c07540c28460cec1fdd3cdb7a3478b91a9caf9ac891cdf3aeaeeca9a9656ac1307259922fca74c5cc69f7e25c6bf587973a4b7d3e3ac0635b0db22a0093a79076881c71736ee1d4d45f8ed2d29a0671a64e6ca2f7a5ef404b1edeb842034f571b699bc59e5a37df02054e8482bf1e7b77d8e8397da15d89d7355a5dce86b1683a9ac4e406c08a94a6eb00e5ae16d96722972e5c50c7bee4a84d0697bbe67ceb7ef295f06aaea5abba44466be0f67 -SIG = e857db087e28d6750bf54e53797251d8439989576c12da2d9c811a14877c3bd46c4efab861a10eebe7da04c0b0b445c7a390a50c13de36f3a3c7ae0157022c0e - -SEED = 24a914ceb499e375e5c66777c1ed2043be56549d5e502a844710364042ba9acb -PUB = 20d21ee764b1f35f94568200d63bd5828aca8c5d3e9047d23f478b925295fa2e -MESSAGE = 3ff9f66fa2646ec66a1bf933c2b4cc0fbf912b4d6db50534257f97d01e698d05485747de2544e9f5a4a4a075388cf4400ab89b0353ce86198202db3a903767b879a2af9daa155843111af15a2bc35efe41bcc92c8207e00113b04f1303007949ffb6ce8df4b0b34248fedf5d9cb2cee94b812ed58ece2a0ce0454cf14c20e49e09fe664d6e25762e87895932cd5cd32eb6a3abb38ee163078c133e93588791dbf6af499a31ea4453bbcc7a85e406c9848a664052f11113fbb4ffa760dee4c261e396942491119da29a33582f821d4125e0b4162f28beb066031a652d05749aa7244dd4f3d3bb15d268328d6a02fce2501815257f8ad5af4ecbe7cb8ae9661e344f9072318791f3e859091121e08aefca8982eaaf66259d9de4f46a31e716dc033d0f95d1fa936b6c6079b137dd1158d1def113018c73f8ebb9807e0f7415404ea9c78544ace7ce463cd1d1c57e31f4091bc091804cbcddad0e15a40ca91acbe1c6224ed13cafb4df2c84ac9f0c3c9b546007d9dd6e524c467072563d4ac0d700cc1bf30febb334313dae5761745ec0a5e9e8815025958f00fa2e58060d7e9a5f2b727f48699f929c8459930892573f784fef5692518b5ca268e2a73ebead6ebdeb7ec24eac92aa7dcb41b598bd6eff3632d069726291 -SIG = 3ae0cc7bca8d73be83a9b809b13338c12706aaef75c4d1a478178f9dc565514c7529e298043ea78d21a5a09dd04f10ae87441e5686a933c92c75548427ad3a03 - -SEED = 5532e09b937ffd3d5f4c1d9f1ffcded26ee74d4da075264844690bd9c8613994 -PUB = 5093969f377bec3e35f59efda01ab4186c5d2a36740cf022675e01096b1a3f0a -MESSAGE = add4d7a9ce3f63d1f946e8679065545d8c7bf0a2cc3a4c00b8f142f0945ae362c4c9462a7576a4059d57861662884bd80b96d90d279a952eda952d37d4f95cf0d70da98f4fbaca39e169f9d945d41f872397bbdd5701454303d77d31e86348271da40a1b8f1e57c36fcd803e14fa17716c5631efa01d3a795dc20b2bde36ab73ff6a2d533bc15cce22328713c3c9ccd072c3e450d7f22c0c9f94919752cbfe45ee655d1b53676593cdb448704102631caaa976952eaa1f6c2e876564e420f0c646a0f88365f76415b4085f60a338b29c51633e540f0bf32d4087e7d0fb685be88c7595dc531c99b489584560ad8234b18e39a107cf5d842dabd421e77d26ea5e0f1405ce35fe792714eb4ee1a8017648ac1ae739a33d7b1e089105d1e5add27a62ce64154570340af9eb14e7fdfc2f9a2c2fcfcdac3cc4227763f4d629497479f849216e5d90ec16dfa36b72517f7b5486baee7fda4450c352cffbbae73926c843224f8ce44b38dae53f3ead21890b52a7801075291684fd5910ed86ad33e8a007f6c3f85c16b209293740184f5890874d431cd4e0ea4087c49c3471d789c813c6dc9a78699363a1d87197d3b92c0286689311823f4df22ce8035e75732cdea7f5621f67db0e2a4ca6616193221c0aa3d6de50d85282ee -SIG = d527ff0d4a219d61f418121206a54ae4985854a310482744486e4d130a7de97c319df8372c82828c936e6a8afd9c5de1828573d8261ae9365b8f237676182402 - -SEED = eb36511009d37a9c46c4d1374d0bbd0d9981e78cee7d188c5aab983ec239e10c -PUB = b1cc212b4521bbe7b19a7693878a558440eec36205d8439d040a46a9902fbf55 -MESSAGE = ba2466e56c1df77f22b6f0241fc7952ae9bc24756419a9446dd2b49e2cb9df594e5b6c77a95aa5fbd9dc57fec83962c7751eebb4ba218253f916a922a5139663e3203e3be482be379ca151c463d9ada21446135f356994fa5449f084478f5bb4f5ba6145c5158eb7b1c43c32ebea25e09c900f01ef91e92f88c03c76504ace9646016ffc2789559d0f3cc9d00fb61bdc6af7d3940f302e588e04f79f7b3d4b91a5d193a4f8222bfeb69bf0347d98ad81ef99d130ebc7b36b0783394eea92a38ddd5e7480d2add4e4def53eb99c449bff94e4718b09f2ea9b1f2b886594a95c33a69e0333154e440ab34b7b6c1134d8179b6f0c56251a9ad8e1b6b0f9b8a5c97081a7f8fd05d0b0affc82dbddc8b0c0ab7e833f300626d4b973b3f60feac55571e89cda0f2b441ed2faa669a70d556cb48f9b1d1cbce32ede5d166b1143e264b11ea327681cb559edd13c364bd2baf1fd54bb781807bd59c868b0e4795a779e67f0bd0d14b5a6b9e440b57a5823328b59affbd027eda7dd785079c5f02b5e32890b038730986a39a5a9834a3fed868b6f45cbdd28acb2709aff556263864f9ae1e757b3278c288dbe2932825712773e431f7c29329857fdaea798ed93920893631402e6b13bab62b4855461edb94620f2d1751865f445c466 -SIG = 9f583724de552eae82f254ac6e2ed483ec1a07346266735c490920690c1e3fb2a9e9a34194ed6473733b300d4f23c9aec0da5a2022054ca43885a15a2984320e - -SEED = 7dbc81902e4eaab3077540f559995c387403cac306d486e959c5eb59e431c0a8 -PUB = e03066139082f613448bdbc27fe53aa3f88994c31ddce002e36bbb2963df3ec8 -MESSAGE = dff798b1557b17085a0634371ded5ddf7a5acb996ef9035475e6826336f64ad8b84b882e30badec2b4a711998752f4a1574bc1f89d4325cf2b39861044dd03691e71d07768b5933a3052cc7c81d571a9de061dc19026c2f1e701f2dcf26a88d3401bc99fb81559dca76d8a31a92044a273587d622a08d1cce61c8f948a34ded1acb318881c9b49f6f37c30a65d495b02d5429e7ab4040d8bebeb78794ff736d1511031a6d67a22cdf341b980811c9d775fb19c6478f05ed98430103ea24c0f414d4cc07d860b72dc542ff22d83845a42f8ba45ca7ff3aab0b1e7de2b1094deac08d16eee01969f91bc16fec29ccc061c54db5345ba64842dacc99ee7729468d80a3f095583d8e8012408519d582cc3ff9a2eb7aebaa22db81ffc78ee90ef4ec589dcce87118dab31a6328e409ad5059a5132c82df3cefe2e4014e476f04c3a7018e45267ec5018ecd7bff1dda9267e90666b6b1417e89ddacb5085943befc7ad2f4df5f1ee0af9431aeeb6b24a5515b93dbcf68640f7daf8c961e567d7534900205c3df2184b6ac2da961c4c1d2bc49b4ea96b8154ffd4efffdc5e55a7119cb8af429e85105dffd41fe4a2ebba48168aa05fa7df27c4298735ff868f1496beb4b2ed0b8980c75ffd939ddd1a17e44a44fe3b02795339b08c8d -SIG = 5b7f652f08f229fda1b0bd759377b3fb726c1b9c9a10ef63426d352dd0869bd54d876c3092f1cd411c3757d3c6b6ea942aa70c3aaeb4217a4c7364d18e76e50f - -SEED = 91b095c8a999e03f3ed749cd9f2faacc0076c3b477a87ab5ccd6631738767446 -PUB = dad174d359daecca9c6b389ba096452ab5ca91e6383c6d042a284ece16ba97b6 -MESSAGE = 9b0d8b00299852d68bbf497fe603961a485466a99a5484005db73d4e4bad814e8574efd54d648bd5c91ae8483c54b2f998b02e1abd6f401a25526843a5f2a23a97bd589d1f7e1ab14915b1e359a396d352c360ae6584325ae4bb7d624f61255c5c7bf0a67acab46c3b57b34534c0ee8431d260576606cbd84d8d1839e73da6fe4b0b8b78f0f958827c2f1d93ba7a346dcc75cb563dffde26f997598e8b5c2f1617c6fefc9be4b28b5401b0006413a251690d1203aaae4f6d8a3fb21f24009ab3bff13737a8a7e6646c02732d9ec5a4a510469e2d299e4cc1ad6480a482aa956f89ddcccc64a136fb15b876b6ecd88c7c86a4dfc60e666207c604167d163440ca9ab9cf87a5e0f7bbc5517de4dee876c037f8cc9d959c8ff5dbe944ff54cd91a771e29231f8b5f17d61de904c955fe2025dc52ed480fb3cc90f232459c607ef7e2adb52c7482becd67ad2149a4128f984038b58aa90176782393604aac74c18209a3d6a78630c01955a7cece5da8384da3baf63aa2ddf5963fae05ba3b81c6a03d86a00ef78edb4184fdc89b1d6bfeb310fd1b5fcce1e219524a3cfb2e972577f06b1dddeba00865dae4979000c008ad99f3b638cceb8e8c7a0f998d34d92143d81c0e1c096a925ceba65c43003ee18d494d003e9c61f77d65759 -SIG = 64ee9efdb0c2601a835f418520641e436c7dd47c333d9fc30cfbb9e390fe764530654708b40b03581899a9ac870efd766ffbb4637152f8ff277964fe35425209 - -SEED = 8c568b310ace7d1f0edecefd603a884000544c792565d481c3d3e06e2d82ca96 -PUB = 5fa6e267c766736841411072d1983d1900acf01d48c3ce11770b26f78da979f7 -MESSAGE = b59f5fe9bb4ecff9289594721f2647047b0da5e0e4941bbe57c5b722b476723f0ac5970b4111f893bcaa411f28fceb4f585a2a7187018a904b70ef8fe1f6569a54d00ada37b69cb5e9c9d26c16a903518148e04a1b936a32329c94ee1a8fb6b591892c3aff00bf6e44dd0a762babe89d7060c17b90390d23bf9d360a293b8308383086916e1182b1ba4336f001b8d20deae9a029f7e85397a9ae5cf3ca10c7f3875588b8ffabb063c00ca26f580f69edc527a1accf4f41397b33766bcf6d55eb8de081a48c981d05c066617b80d8f6f5e60e59dd9b930bc4d04586403bb868df75933bdd86230e447036c175a10de9bb39953dcb1966a1f11912078e358f48c5b209a636c7f783f4d36a93ad2cc2e3244519078e99de1d5158b3961e0fc5a4f260c25f45f5e8585e601db08ba058d2909a1bf4995f4813460d369503c6873685ebcd3330a130b75f2365fb2a5a34ea63d958a2a867e90552d2cec8c390084be0c108b0fd2d83cb9284db5b842cbb5d0c3f6f1e2603c9c30c0f6a9b118e1a143a15e319fd1b607152b7cc0547497954c1f729199d0b23e53865403b0ad680e9b45369a6aa38d6685abd397f07fbca40627ecaf8d8d30133a6d9d5af009192751c9c45f77c0bc011268800bf552512730e69973c5bf362ab164894bf -SIG = debdd8e5d3112fd77b394aa0e36e9426bac91df126fa9c317cea7c9d45957cdd96a45ae3ad760413ee1205afd71a29f9c3cb586cd2d7cd1e93bc1652fc34dc04 - -SEED = 3d09afcee3c432fdfb6bdcead54e3da5b1b4165c50d6d310b7fad787b444d680 -PUB = b0d9028c4d1487d293ed585a76bc94fffbafe2c65d980c494e141e4810a35cb9 -MESSAGE = 767165caae0e578f16537e1750be7de87a789a51ff2de11838f564e2580b2391362d2868a5a4708af15d2e2db7b9be39c16adcc1200b34e6b4d4027ddffc1a2a3595e29e855ec5261b20bd55c428b01309badb59e2ca3edb967fc2f4bac0729ddf54fb6c20057bdda9e7af7cbfc092fba865fd3275b9d3bcb0c346b951d170ac9aa650a86df49855d48a1b37ce56c9f27389f5c8b15f5c2c900c4f107c064f603e4f867ef2e9c10a1b74210e6b89bb011793aa85ded43b51b749ba7f70287b6bc1b89434db8b8c8b5d73b214b41e36b528005bfbfe002e21b1006fb9d24babd72106d093e3c7093b3138aea719d69479084647498cd6c9bbb744509cd7da8dd61a627100f03c21e750acb3fcf4631d7c0f618154d2e5fa6656fb76f74c24795047bbce4579eb110643fa98e1f776ca76d7a2b7b7b8678173c773f4be7e182fd24dd76291ac67d9f26a28c5e3cb025c6813a378b383224642b4aefad0c76a6579517b8f360797dd22613ee682b179381950fb71609a5fb5494d2d57dcb00f26d1e72956f4d6672830e05c01b3779677c07ea00953c6b8f0dc204c8dbdccb381bc01b89c5c261db189ab1f54e46bc3edc4de5ad4f0eb29c0a120e437cd8f37ac67d48c7f0e730278708f02b54aee62b72952bc1c0eb437ca8bd5655437 -SIG = 89739fe441ca0ced08a6eb5796e9bdda0e74fb473528fd4907edb659aab44d3343229046716368faf88e85c1644af66ff2dcaf0b17ac93ca13819f3f241dd300 - -SEED = 41c1a2df9369cdc927164aa5adf7757136abe51395604266334cc5460ad5683e -PUB = 40557834cce8e043580a4272a8804d4f926e88cb10d1df0c5e28b9b67e1b63da -MESSAGE = b64b14ba77d239e6f81abe060accef85f0442b650c44015efc43a0aa2ba10bf48d3018b1953ddfffbcda5bf3bbe0b6b3e4b0d9a32c6b725bbb231e0a2704471ee8bc1d594f5c54226f5dd9dfa163cfc1452c61f93e4f8139ab4ce4476f07ec933661eae91b6d500bf508ac63e4baaf1ffc8f0007d802e005f1b4fc1c88bee4d5e9e76384f5a7043bd660cce71f3b67f01f6ab844298531aac73a39d045370088855005a09c6d04238ea478dfacad1e6b22b2be4c46b0d59b1eba1f060bf7da5d1566cf1fdb5c543a33926af63f01a0db86e1a6711c473dc795ab283c8d93facfb5701fa2f2f6bb99f9b7e3749b071d58607be44a7089bcb503ec1495b5feedb399961fd3677d7493eaa3b3e9cc5e3642f40d47de9bfee7c20b0e519c4eb4a40f4da446ed6ac7aaca053e759c97dabe0a8ec2f58e7f2f9b2072762f9f794a6a4e36060b8872bd2c18d06a85c2c141a78293773ee8cfbf154b9930cd39da31b497e737a7750c90a13f5aaa147cd0dc4311f2e34941252ef198b0c1f50827e56c9f16f595aced6d2a69346531495a6499774d360766ca9be5ed8881c0db26ed7c5e6ff3a4f9b73cd8b654640dc96bf43bd426a0f28c9b25fa704d62ff0288fcceffaaebd3ea3097bcbbd778420ebc520a417730a1b5b3b8c96cda9f4e177d -SIG = b8b2752a097196c289849d78f811d9a62fc767278f0c46628b521f62ed2759d74462a175da22403f15020445cae06da3ed61cca6203b7006362a0e198963d20e - -SEED = a00611489467122c4c164bfb6a616e6a619b9f83c4367206b85d3fbec38cd62c -PUB = 57ab58babb41dc0da0bcd506059aac9f46eca91cd35a61f1ba049a9ac227f3d9 -MESSAGE = 34db02ed7512bf8c67d359e7203a2ea441e20e729766c15aa00fa249a3518fc29ef8905aa5b4670958c6a460d77b3a80efcb473859bbaff862223eee52fe58acfd3315f150f3c6c27ff48fca76552f98f6585b5e793308bf5976bad6ee327b4a7a313214b9ae04b9651b63cd8d9f5b3bec689e0fd000dd501770dd0e99b8f99eafa09c396a245a4a96e56896a29b24190b1ef11063f39b63ee3a586b07627dd3500c4e170b835dc0ec236fa5a35c44184707565c4a50662d8dbccfff7f9a7a68d021b4af64d532b7c3d2747418c2d717bb6aca6b58747ae4dd5641d826f79a8a315c38211a538a929e5b451f623f4fcbbcacdb86c8752ea13a617ab414ab653eb2e68d5420df7c6df92438168dcf9c066581dfe7b2c468194a23707de4659bd67eb634ff024741c5fc8698fd4dc41fe5dfc6299b7a08e6ffca37109c0210c8f94ea2d3ddc977ffc0b3794fe6ba4337c7aab434a68ac665484ea8243a84b79aa181ee6ab5aa37a32d879725edc018f8552181816d7d272ca8818a7b92e6ee4454d1f7828dd8afba1a790364b4ff28d84e028597353ebbef24837bc319e1ae8f2b0b6a851b489c3e170eef53e065f7032653cd6b46d8e57e4e111b789ba950c4230aba35e569e06615403407bce0369aaab4eafaef0cae109ac4cb838fb6c1 -SIG = c771ba0a3d3c4a7b064bd51ad05c9ff27fd326610fbfa09183039e5edf35472dded8fc2275bbcc5df1bf129860c01a2c1311da602fbaffc8b79c249c9cc95502 - -SEED = de1634f3460e02898db53298d6d3821c60853adee2d7f3e8edd8b0239a48cfaf -PUB = 9dc1465b3383f37de00ea2d3c70f2c8fac815f0172029c3f579579c984a5895e -MESSAGE = d10c3e4de7fa2989dba87537e00593d0eed4d75ee65846dab1498b4749d64f40e34b5911c5ce3b53a7e37d2d02bb0dae38ed962a4edc86c00207bee9a8e456eccae8bdf4d87a76746014201af6caffe10566f08d10daaf077160f011feaca25b9c1f6eca9fc53314a80547951754355525257d09a7fdad5bc321b72aa28d1e02d8696d4f9eb0ad3b2196f8bcfaeb1d6148287a3faefef91a7a3e0609c28ce59d0ca14d0b3050dd4f096b7bc2513988ba212128d5026daaa7188846db21c5c1d179ab9487c1a5bd346588127c20398d362d4c759cfab2a677750b9e45676a1e7e092ef02edbf278fb19a58e9bf6c9e996e24edad73f3ce31fa04b6d8533436bf80b4b2f805ed91e7fcda3bc2bab3b2bb157158af0ea8e3f0731dfad459d2e79b6d3715fe7bf1eafc5397593208857e57b7feb2f7387943a8e0913470c161aef4fe205d3637f23177ff26304a4f64eba3fe6f7f272d234a67206a388ddd0366e894eaa4bb05d73a475f1b34ca222bbce1685b1b56e034e43b3c40e81fff79682c19f32aa3f2a895c0709f9f74a4d59d3a49029ecfcb283082b067f1a0d9505750fd867321999484249efa725f52c94c7596206a911f3f505d63f0313254bd445f05be3996b58fe1819af87352e7f0a2ca320d9cc00a5fe77ad41640d50be8436 -SIG = d20506eb846923a0b16ff82fb2c3923b00c1b3bcc6e2f6482fba24807521e8e0223f692e62eac993f498f67102a04fd1acf9c7e3888d857c9a080b8af6361006 - -SEED = c738ef5f0935281ba625fa4014d4a4d0be7e28fed779a9cf658e21dba43cebc1 -PUB = 95799faf706d195e544c76cafddf09d02d1beafc42c9d6c9ead4c1845587d39e -MESSAGE = 168d0bc5598be02f5443bfe7dfb8829985ca5d282af9cf1b1482602f243d486bd82ba039a0750909e9b3c7d4d5f8b8baf45718af0311854f4d1c7837f31d8ee68d3558e7e51e0c646a4a637596ee90057b01ed0a17daa3950b81ab47ae8b94c17d40746913c46ba1478bfca51b167628fc3ee1e22f2f19d6d8daf93df6540cedb7a859d1a2ba5911ba71766e8b7fce0c0e8663616d0180697d78ce3040d438131982f3f8112acca29ae53e539ff8c9ec4106d132f402018518308485f2aa6c9e8d1e62fed60cb249457db33c6fd1fe07445361f08194a2b5a057cb03cc754e5c7d4a7eea53a7f7d207cacca5e68cafa969a3521dbb810399a17f328ee767cf55926b2bd5f029549d3b464579c42655265398472e1c77cc8dd9aff187f7ac34dd456ace999a736ecca6d405d4922c779c600c47b84c9c1df5e5f8ed3b2811d351339113f8453cca4c4411688cb0388258ebbd1872b83610042249494ed560d4cda6a68455d957e806dd0bdd83004c4ca80774b8a0a1665866f17085014eadb3eae7382fa870deb29dd8c931b53019625740e28392f38575c0e2a9e504fc35bd95df56439a898230a2398cd2225c766ef36f12ae7e49b30a9c0aad469d5895bbf721cc0ff51d840c802d4a7eefba84fe5205a2c2f14011922dde561456f79e6161 -SIG = f44371e6c3391639d457ed14648184809411e80a3201f8811670e500fcad92f300aabf7fc68e440191e881d6c3474efd6d28f09dc44312fcfcb82701ba3c290a - -SEED = 5fea38739c61ca83bf7b4ad175a2117627b971a634a305a84fa57fecb8035624 -PUB = ddd14b0fc06768d5104c50764bfd3b952352a34007c50d5ddd224ff51afcdf9c -MESSAGE = 1013c60a73953549e5ed105bdea150b91e60ec39200d43721304bfc8ec439d39609613c2d878044a9da01b26d86d6d65db93d91a137e9c4808a97d4ef286a903f3f1382cc6d1294216b9fafc013c86b9ff68b55a50ea3766e61dc1ce38348e91d62ce732c152d766b9335c68d6cad77be2b4a0cd50b9a1ec632ba55648a6e7e11a14c06853c02aec4809bd147a5ddd9fbc3be9f0c8158d84ab6795d771b42b1814a17a3c7a6ca0f4a8f7b3a0db1c73ba13b16400dfecbd03d216650e4d69704a707246444d5791fa273752f59cb5ae9fd416a5186613d66afdbd1ce691a87bd7d8b67190e9ac687062a080d2ec39fe76ed8335058251872839e85eb62f18ece187caba55b5f7d5edcade01cdc543cc677e50238b89c5635ad5c8fc220f5e0be1bc667d20989753a6d616fa69f8b12940b8ca9e2c48577132d8691b053779a152cbacff3b8b1bd7af692e56c73bbae4634776cfc213c99b9ae458df1befc8c877742664b0a0bb1f6915c8dae3b3f55dd75aba6a3bcc4176b4e3ba03d0c1c04c3c6408778b2b8e5a8a3eb52ed32a7428c00a98a589d8ca9390a210f4a7ac004fa1fe4c6da694f12276e320b41b0b59f75d264a396d450b631ab353f1612709e7a2e6a50d01cb110e53040546dd3b1e11d25732813aa76be5e81fcf7a5773f6815bbd -SIG = f4e274823f2c396f3a329486aa6410c5ff19266f0770fd04fb14a7602d2b69a4a2b00928e9e1d92389f8033359ed6fb2146467aa154cba597dec6a84173f8d07 - -SEED = 60f9a14cce5d43fd9aab4ee8cc8379d575949152693bf29a6790b035e42a44de -PUB = bd4a70740d5acabe49f9a2152082fa2025330e6440437f1d047f313de490dca5 -MESSAGE = dd7f44f9eb728ab48de54ecde6b6184bd5ddd8707545a0129f2e905905b55d3e7fd57e28485d258148f6605e2377d5b267d2eaf4cd4b46e454962219868232b6f41f88a797f9cdd5c39ada51a641214fb9db2c2a9b5a5b16e303575318b625cca970b74348727902a1cf268bd16e107113161c8cbc99303c2b9f235541a7b31e433120feba14febe4bcb0f5b936c7edddd0ecfc72c8d38f64cdb6cfc2910bc29a521c50a51abcbc2aabf789de822cb04f5728fee153dd5501b2db59c59f50cab17c29216d66951019e145b36fd7e841bfbb0a328554b44dd7ef51468c3d5b7d3a1f7b9def58d8cf9d9bcafe92c86cf6d6119e98dba6f38ea57e322ddc9c2198d4bbc3b94ea1329db0d458e01c7081b33925a3e287f599a858c50c3a8f18cc2aa634df63e7f10e403adeab2f41db5578790c3b4f041a8b7a4f69cd6e06215df8201ae5b3e1d1d25a0a39bfc3d041a2f98213ef4141245792a76f06d4de25f6467a0e56f2f5cf69400d22117de7b46149554b70c75b9f99484a4f6f035ad3f10e3753cb14f4f398dcf6a64d10cf6c4fac07c91193cc0f54f0de58c6343e9caaa6b4f475ef91a59e083f9f211f5bc8e7e4516b45cf06bf50beb8fc4ab579d86d4a4190eeac748d06e0852c4b9ba8cfc50dd0a037a7bad7fad55af309a5f13d4c91ed3e0 -SIG = 72f54bb8bdd17e9e422cd339631dd39f57355015d4cbd15acab7542efd784a321c1f6125764c0d154045b32e70dc2e03fbfe1117468ac3e73127b5fac8d42102 - -SEED = a39053c5c58bf31d462b27a620b0b37b8052c6b1c4102b6145663aa15e978718 -PUB = 3642ac2a3280dce52ad8dfcfd3709436edc4e7e4ae1b452d9b220780b08679fa -MESSAGE = f65540d3abeb1ee5ea987062c1b579516d3c29c39cbc6b09d60e18fe274c2befe0f5fe7dbd57c2d5835229bb754ec4341394765776d6a9178c4e6a312cd74bdbaca0e88270628cd84100f472b075f93692830122f00f9bd91ac582836c8bfa714aa48e977003556e1b696df328ef584f413f8ab614760699c4d147c3eea1da0435835c9bf7ad54606f0213eb74a1b476141506ae2cd124cd51d66e7e7e579560576305c5fbe8430be3ebebaacba3f9989dd7d199f5a455a50cdb3755037e1a70674a4fef40b4a3aaf7bd3c95b1ab41bb206211c3a1276d3e37d8a3a5c3d5d0f36ef5b4f3de26b7f20f6b2900716dcc22ab734ebaf1e8d00020e5f019551653b9c2f70a4038dfb2f12d25d6d84e79073a6548fe15e4828fe5de83ac3d8d98b7daf92710482c37f7bd2431a8114c6137657bb177882d8a3c76babf1c671a7055365fe90866167a2d1dbc870be83b3601f09d4a317ae254cac9f98dcc7aead9224cd9c9d8a200abc80a2dd108af28fd46ad7080ae741b50054b9b9a9201efb7838bc4c5c2cc3d76ba0fcc49c46e792c26292b7d0312aff955a9f8edf0c696a70a614f3553ad3869bfde48d26a4d367b6cec057e62a4e548554b48b53ecda790ba7a0ab2e3de587bdc22b02f5947634d73099f547db22ec1bbf82343f9a2ca38bce4eb59be -SIG = f7383e966cb2309deedf860100183aaefac672ca16d5419cd6422ca70e16b3976f5f165afc2786117c868234ba1109ede031f8979b50e567358bd4f8bd958202 - -SEED = e0c29df4de45c47539e0896b3a59bc3de6b802fd14dbdc9f25e717ac82c328f3 -PUB = a69002b0f5ef354ce3b2d6b8d8ba70ab778432b22f144dc9c2eb92d99d99dd2a -MESSAGE = 6a37cb4c749c583590c8d849bce3fa657f10009190cad9be41ede19bf2fdb3c562a6101f27bd37f223cab13ced245a1cedf852f551f857aad9727f62c967c0a921df116f48a80a6040b3c723ab5cb594c4507a3d20cd60514e22164a82b74f19dcfdd83c57bc3652375517414af5d18e0a64ccab36699768d07cf40b7063a83e43d5f607964b1bf0840a45ad50abf83dbc849f40e5b4cfb6a3347b29fec50774046a4b50041032aa4d567e8564b3eed1642040682dd8ae7d7179286cf6e1853dc87d27c3e9e60fa47cf8cb2da0181d53eec40614b07331a4fb7028086d0b1ce2e1115b73a162c527bdd7cab5335b863d108be047bdbca112cc6e776bb453c317314388bb9653efb4444bf5cf1ec8da23b711ba71796c0ae02ba1dcc838455078c3897f07e9e13b76e49274c2e207506b00a0b558883aa122b667db9d670508606a3f54320636cd19f973917fb1875f4363e220f1e12398cc6afd79094743338456813a5826ad3f1aba7cd7beab1fe183859c0cc9ef40a5eab912caf515a8d4c3b93d641b7ab3e76b16c12971ace88ff33e5a1ed9b44e45db8f3085dbf070b256b0d7512ee1069432603d73095db8749ca547963bd71a8a684ab8516b146c4187176386afdf6cb1368a3dd8fcb2cfff77056aaf7823f800b266acce72bf643c6d0c28f0ab -SIG = bb3b8c5c27591fd8b9c5ba489d6b6ee5b0fb4a7b0de51f1639afc673d0e5f75e313aa7e1d0009081dbca7435b687ccd12f64f74a386e772b9e24781b925c8c0c - -SEED = 198b5fd1c03827e0994ad5bfee9b5b7be9966c9c3a267e4d7430343767403c67 -PUB = 6682c6f1a866b49b2f8ee97f2e532fa91666bf38da1b4dd65543a1777794cbee -MESSAGE = 3fdaa15c46f25143db972079d7013c7f69a136f45f3f6ba2ced8b828468eb3daa6b50b4f8d3380fec64a0343be116f6f83b6ee64cc4c1b1d08d54fd42029e4285cfc6c6dd5cd181ab533ffcd411f23a1003da94ec9340e2ec71199d678540d5182e139ffcbc505a170b8f07f4a7e694ca92f58320c0a078564ce9de99b0fa8e66b0d822e467a5aeb83567996a48b89db25cade6457794e5414d67e9d4ab7cd6cc2058bb7a513abd709f4caf24bb67ce1c03ab62dbdfe309ec7db0fa3ea7aae8236f259b922d4536115a63bc89acb2051d09e731cbb0df157d9d345bd9109973c2b594f148efc6f3377de5163b7f69869ffef853eaefeb402e23529594fbd65ca05fe4062c529d8e321abc05200cac1e839e87b1fd3fdf021d68cbb3a4142b69cc3af6f632edd65b83f5aa4cb17da5b6ba3fc03edb17c2a3cb5b04836e7660e63c8a0483e243983371dfa9839f9164ad4da0d5953655e3a9518e136da745737c79243c355fc125cbdcc76aec92216846c4574f4f7f298bcde54fd2444ad3025955c100315de5a4e27c333a00284b2f702fdd3de22ac6c240dbc14bf71e62d131b62f2db992473f2f913f60c916ecf57df5f3f021fb330834395b79472caff19fcfa0a271795c76d69b4db3f85b8d2e5c3441965484dcc39aba59b701274f7fc425246856069 -SIG = f454f35b18538f877e5d614a76b5276a27fc0b433f215dc4e963b3f047694c780c515c6ef6fe2db4b009009bc2733aec4fd46e615357cc0bcc9f1f7fc21e3c02 - -SEED = 4392f7d4fbd68fe154e4ba38ad5207612a0648556056c39ac116ad468f89bd2d -PUB = cbeaef41acac02bf1f780ce934aabd631364b369567be1be28e3906f9db120fa -MESSAGE = cf1709dc9a0867ee908721b136cb93a84229e83b46204777ca8194d08b7a3ca9c912eb243e5bdabfeed352349d20be801b722af0892238e72edf190e6361f57572781ad3c2590b197357641c805383baa1d4972f76c65448532c110834a0baa8f48863e166b706653708cd4057d3a4f9fcb2ceb4120001277d38c43847d822822b777c2bb4da4015a1c24d416d5062a8718491d855aaa5dbf5579c164d8e524a9f2fa3f22eb09861ffe6ad659fe36eb40431222c22d7137a6cabca8db786e39d81f661afde4e39589b4db4d3c51ca53590a14e115d0afc3a877b839a9638bece80c32c19e51b7532024845f76cfe9bfb2ac05130f6758bf7fe993aa93aa272e4e6bd0c75c14099d43e652a223e5bcd64c362d4b8f4b95e016f9350c7fa74e653525d08011558b2c6e9bf4fdf9dbd5ef9b09bbc846afc2bcbc86c4ccc315f6d1ccd489b0cf8ed0d93f2f532a426265c590ba3a59023347d819d9b281ef85310b05316d46c8a8c0365d068a8708664ea4d77ac0cd150a65a56586babd34b74365bb8fe3e6187262284d64432e4c81ea4c0e57c1d71ae980c7f4d1d871032e188bbf9d1758cdc1dff989f2d1288fef4e205e99e7cbf2cc324b8c93046f476c59d3d0a59db6fe37382dc79c5ec16056ab3934a52f7d2880d0471a377b6a8ae84d56ac22d1d54551c -SIG = 86e7ccf06e79362d40cdb7fb75a98978bbd334a1db7590367d60849bd53e2fb1a4bdae590d1f47b5490d8702e7c1a87268b8ee9db612de7bdc2e38fa6deb7e05 - -SEED = 0bea98abe7d63f158390ee668aa050e84a25d2893e49fc83f079f9bba6a55a75 -PUB = 22192ec0d32ef9835665a61bc88bcf4e1604637921152c116af503365bf6be42 -MESSAGE = c178e38d4e83ed2be57ce1c3ab64253a8171e610008181fbfc6d752269f7f1c5a9ec62cb27f19ad99ce1f5116a363d96fdc5a42f358b6dbe7cabdfc9f60718e4012c1bb1f842c5560811ba8374a0637747ff92eac21ca65ddeaf43e9989b7de2d432520afee364ecfba4da669ad4893d0bf69f9f81e7df69657be22b92069745f216c242ccd46d02d35616e16c755e0e37f961a6f3637752534f6dfab8805ab759a032a4e7e4c81953325a2f686bb69a029ce4e03becb3605637c5a65b52e331c26c926ed4711a504d3733bb53c97b80eafe4e75ddd9f415362888c3d4d37bae0e63fa11bf755666437d72f58c91d7a2f8cb619b7620a070b26b18b4d50184c5818712110e36d3e2830f6a8576ba57f9cccb8fff4028bf8ef9cb814825bbca827d649547bf6f2bef931704ca7f6df15f780155ed46eaa7ca7d72e22434ca0483bfb2f7902dc787f617eb9bd41ed4520adfd430948c710805a73c1ba5492e96484c4baa7da24c7435c46a052bf3515d33e42dcef517caa45f36c879121078c688dd10d76656a119762b6a834136fa1f8a643224b9224c543cf0470b3f8ee017d620dbdcc84d985154e9d1ae80e5f14387b88a0f6a5c35905aa57fb3abeb0ea6eccddb004474633cc483b56b8a8e20e8f2e09e979aa09893087875c6b117b5f13847ad8fc05604c4 -SIG = 7eb3139b880fdf66376a2090818840049767c837f3ad0036b141667052b33609817ca5e240ed8cdf3ccf3aee29274534594db0b4ccc5c6e5bba3280b873f2901 - -SEED = c25878b0d1e0925c8f5f04a1e5799080963c413a1399c118afb1687c797f4839 -PUB = 13ac2cad41908c255f671f93934ae5d7be325346725c8b40dc39ea80d70ddf34 -MESSAGE = 6856cc7144b6bddcc4b58954d1a2e7101d6584b5d5e719a0aea0fbbdf221c2a2aacbacdc4020c5c8ce681ff7381acd607b0f5239692335700655be2d94c53d7b5148e92a2bc16338c2f4c1a7d1c595af622c240ce579a5e0f5b651bf562518cec8aa2ce4b4aadb1f2fda6cf6295bc37803b5377dab65c9b9a2949fdd49bf9ddc8f96d260ff951bf8e8ccf9827e6869c44bfd973358cefdb010db5e1fe5dbd9f5d2b2ca393c17d446f637059e692d7a91aadcc7689f5f9e1b3052175d9b6b208f9026787fdb66783f45372a24946b1bd1687bf0cfcc8174ebe4d32e43284fc78d7844de0fa22e2065e07528baabaf015cb34d629c3596ad040de31c5620eb266defa7533ac0401998e5673a754365047debfcf7e137a20d16cdd6a5521982f444cfc3429397c641bd7e74a770bb11fcb29483e337bae5169ee82da9a91adf3af67cd814c2825d29018ef035ea86f8de4c7563aaf66e0c75d17ca68f49f0758ec2d9c5179d01aaed7d4515e91a222b0b06fbde4f07a7d9df2de3bcae37ca2c8460c2a6b3749e9bda36d08e66bcc356b390434b4a18cfa45af557dca3d857ff3ad347cfb07e2358c2acfd5cd53b3b0ea2a41ee5c0802fd473db5f30526334da41eb4bc7518383898a0b7507ad4ca289d66c5e2eb75cf255dff312cb1e04eebeb47f2930b90d5e002eb0 -SIG = 06f55198b4191914b74306f38e381316eac40b5b5adb8a312464f67175ecf612e0147b1cef46c2518750a5606bb03bc6467bb9321514f69dcbebce8f69058002 - -SEED = 0b2ec62763f687593135da1961ef29a288089696d944b265a5f96893cd2d8225 -PUB = c1e234fa8bc96d268e7aad028b03f0a911b697715db3a21c2fc7df48ecda8875 -MESSAGE = a83434c68693d5fced91bda10213fcd50c48920b90cee9b73a9c61081a0974933f4fdb0a67e671f8351b0ed5ec0fe7b5fb0c87586fe582ffb1bfa2db5fcedd3302428234b2bb0e726dedf45b13a70cd35ab3e299d13f34503508278c4458eea5b7351b05836bdad5b05f60e445fc65737ae27d2e52df9c39e5da0286392d08fff7ecb7066820fc90fc8a44d5616561c50b52714702302bca5874de85dba045045f9f0e604eb86d6d7fbd775f72ea493b2c4ef7c3be16db2ca7e4d8bd79eb20cfb5f0f6f05336b75cc86d219f3b8f2e91ba7d52b64fdd6a6664f04f2fbab758cdf984168691c32f53e8616b49f76ab7b192b900903082cc89656a9705804cc9b9288a3e42170984f8dc454e0864b9341672686a178c060050178a36c6d906b2ce070d8faaacd9a58c794a5ea4108b4a485c65811c2dca2ee7bb10bffff75d4586b990f43763a16fbc0b48ae1fafb08a9a36fa4326845dba5ba2fbd32bbf66505c5e8657ed0107e3e16144ef31fa6aae72e774097483f5480aa45540568fd08cba0d577768004f58ae9b95be374ed7f0299fe721275e476e0b9ab72dc06ea328384e39bf3ac331c625484312cd9b06b15a2954d33e7aaba6be2261886ca811db96b1143d06dd6e0f3cba7a1ae9b94eaf67771bb2d24e2f94de9c470fcde7bfdb32f410198b5aa9698e32 -SIG = ff701f34b3594de3b80045f429e5e32dd88d6051d4195f1685be783766e80119368f56b3749725b913f1223f87fb0fb24d9dfa0841d6a0e2eb1fddf775c2d205 - -SEED = 8960d7bee8c6b39ca5934d7cddd16f16b3663e6e03e833c057e2181e4597cb68 -PUB = 43409095d4f50f5eddbd5cd4d2012298cb41a40e99492d5a2db08be5377ea183 -MESSAGE = 308d84c7a5f786e563e5c1ea57aab5e555c00997749d15aee35439efa645da2c3967703115c6c63ed7f94785c5478f38467b86e7626e8fffa4d51a2dc45e6df2a35cec99555eabc9f7a93e2e2b689459b4e0c92b351562c417b1997113754ea59e4a91510728ff3071a2bbd1f465a687f67dae955615031a8ad551fe738a260bbc446b48dca1d979051ab5840832e19d473b666217a9183980d6b27e3d3c76d93665ba2393e6ab1a42c3904d4025932d601a202a59a4c49fdb77f0e02868247de5afdfaa1b894208ac00d77c6bb54c6b2a73a47657e44c85137963b57521af20976248eb261482147cdf7a145c3643e29e0588bfdae6a082904853ce5a10d24970ebdfb7f59d5efdd6a5e7e0d287971c846acd54d84dd45468a4110bab6ef8d9a5b4b2426788900b7e1adfe0624344f98fe59ef8a1e6c405b344eb97bb204773744b6a2d8c6e65d17cea07de03b7f0fe49f1a55c33d5f15ce55df7c9561b251c6ac807a92553e1ce917012dccfd69e7dbd038c7eeecae98623f18fbb650e2218a0bc0fff43a75a116448bb7362f527ee6bc8e10761cccf9bcfc0d000f2127b4cc19211d095a0bdaa4e4be4519e6c8445eab9b3144a45cab9996135bf7f75a78d22275900f4ce1f0a9eac136364103062893dad4390422b77e5f5d1d94d7029c6097b35ca64a7a476fcc7 -SIG = 7213dd4a79fd54dec0c548ef42e6cae015be77802bf515cd2582768f72f563ebb2da36af4aaeac56bbffc9932c2e24ec95daff00a5f7a0acab9c8bd3c23bb40c - -SEED = ef6b9b51fd4f8586ca62658e042fc09a83b943033526ffc326c65eb3a5fb594b -PUB = 1d6eece805e0887821876b7ed6ed5b0714d646fbecda38764f94c8155e61d004 -MESSAGE = a8f3f19665de2390d5cc52b064b4851273677486d8f5563bb7c95fa94db3356161ee622221f10cbb1fa195aac7231ea716d74b46b37bc85a70dba3dfaa1675217b351199e74a971028f729b7ae2b74ae8c6b3a0679c3e3296802844ad5bba343f6f9f7c4661b4a29b44f17e89e114fb220e984cd980e94c3d2bf9873e0605c92301744a3035ef046bad2666b5c63ebecf93cc140291946c0fa170340ce395092deed79841352fbfee03a927eb458f2a633ed3271652f5b0f9960cdf9015d56fdabd89ee71e259af6eb514b4c1bd4a666f5b5a35c90f35b149457af2944dd0aa8d9b542283a7e5412b775e421d2126f89bebc3ca37f73071621f1321eee52e9690486a33cd7ff9c9967fb65ee4e907b6b852211473d21e9d91a93362ac761760e8c7bbea486c3d605f9e11b86136819a7ab3f32f13ffca16817fed197ff880b4d6d9a808f7f878763a045728df72faaa963e4cb1c09cc2b2da920280c8366b7d18bf8972df16cc23448fbe6b2e6e16cbbf0745129854053189637ce115d2398433c15d6f116a205334824af282fa758494c47868ea8f4dfadc705e861aad2eb8ef3dbbed2a4569e15834a760cce0cbbc84b289e779b988346b9069c744c97ab2bf42b086d2fb0a411f5ce99f0819a3086b4fe9d96c7c9908dce28df1ddd30f3501ddaf78110734f9dcdfec3 -SIG = 71d171071cd0fea1c6a9cfad1f7fd835e85ff906778bc6345a4dec4313ecc2bff755a717ebd912a5e02840ac073842f9bfcaa58913e260e3c73393d36685c70e - -SEED = bad47cd4bd89849067cce1e63c3d91e9b787aea8584edb07f3451ef67e7bd79b -PUB = ab0ce9ba1d29bdfb85a0e66b76b5e2e05ff732569e4375ccd75098e9e71d17bf -MESSAGE = b5a61e19e4863e0bb5f3fab6c4970d878596895521fa1e7f678cafa2de53322fd458a98aa6e35805429f651291b95bd9950e155f3ada0b609159a4abda5990c04bc2e764422fb49ef42f12529ff6f6a82029ff0185662e658f83c546eed09f06b5a68e857cdad0eb9ec4eecbfd88f34bc80990f8644a9bfdde1d9f3a90d557a8b828d5ce06a64e3b238582bb4cbeba30edc49e8122c55e95badcf502cc567869c09e9f46c6ff3f6878986b1de00b72a1858046fcd3a6e9cdaf5b073c56f2025063a2d178bd4c1e8cbc1e6e671aa97fb2cb4cc8a62c20be41c776372c8e7be63b482e6c63fa85d7cffbc1b2820bae1fc128343a1e20fcf1bc3502eee81358cc9a74c72af63530f96a25a604648ff570df1eb89d1fddbab28679ba2e9b41977e9a9c1caecdbfc361a1dd055ec51620a9bbdbbaf718c9cc136d2007710399536d13332485ec38879785e0c9ce9915a80251373990a59bce440326031ab1b458bfa5b8a4793da4ee11ab7af20de2a118c9ae521a417b68207fc885e109d8463e9f022787cc730db0b1faaed257bed901710885b74e994f54f6f2aeb64f0f60b59efbf2e3bb6515424603a113c0b8a31ba3c1e9a9b8118c87ec6949b75f49627ea7b1328889391104d4f4a3892cf00f26a73cda2a40f9b7157afc40667f4a04f647dbf93906b84c9a35164e1bc902 -SIG = e5724a1dd463a97d1222c518c4925d322202d10f04cd078e771e0fb3951dbc1493a234460754c3aae3df93008dbbfb310c99592bede735a4aeab0323a1210d0e - -SEED = caba8e0533113a4be173408ba83c0db74260802f9186c391402655acde6015cb -PUB = 2d7bef6164c279fa1028a9788e3e8ee8ac15edcf92a5855062952310b4684547 -MESSAGE = 2413a32bca5ce6e230e565eb858493d5d04e6d2e2a7ab1f89a3b423311676bfa93c67daafd1cfc7109e040bac52cbfe07c28280bb6acf6e3a31073dab2965378dd77f61fe9247135c1a631b79ad668c9ea1cd4112d8d3a064cc21df32aeac7dd718b091fb6915b8bc063bb5815c376e01476312a2e5433417a7a9315d65999b02ff464a474a597e53988773670eca46a6e26cf96e9488e9e6344bc783ddfb535e76bb3b9a603ff4c59c7dbe2d8b6198d5b24490b4ea96c95959ffbf3d8218e760daf20e01e2f36c84bb097115abddee92bed82d16b15a9e192e9893ac638461df507207b0cf595884d8a99fb9c7045f9bff7b73f00ca3fd595a5cec292adb458bd9463be1204d01678d2f4389b8720115fa597c402b4ff694b71ce4f3d330d5e2f3c3ad6d96a9b3439230fc53a44794cda595557c406ca1589bc7be81e2d79636033253fa7bdd600c67fc55936bd96ce0428c3eb97bad1de0a5fbb9b675157de5f18bc62a7c22c9483e2802e679b5b8f89db0fc37f7c7150ad5ac8722ceb999b2435e6997217092336ef1c8a2292dab9a46ff8a9e10d3355765cac9d6598770f4f01ea639125fd031609dd1a507d96280c7d01a3ee987e9b210ec8744cd48c74f8afee961e8ef221f826a1fe6e7df0cb15ad7c7ef4a91f9d0f4c2e1bdea635d275fac8c4bc0601f490dbdbc734 -SIG = ec35ec32c8a4008827e178492b3b8bee22a4954fc6b25f4f225dd7ed23698900de8156756a8edc35c51d10f82b830a2a659676eac911f960244766e0c3c60705 - -SEED = 9bf3fbc7308b46f6036bade0c3ca199fac662b07f103bf75181d52ba6a58be05 -PUB = 2f6ac6fc33bc060c1dc3cb9d1a2b9115845addb16c4b84be37ed33adb3b3d3a8 -MESSAGE = d65e36a6a38195ecb91de3c848b51f639245fa2baba8a6f85947159dec0ed3fae80c5a0f8c66ff24793c89c0c687543bc633547a1f37f730d97012ebbdc7ac339c4890c0856bbfe2ba29b25a7aa6b089c033fecb76db62dd3c00f6421b9e76dd0ea366eb2d4a052ee6cc736e3819191d5ad7a66d2be042cc6539e5f35652b155a727f3888d93f93a9102598f7538a9ab7c777eec79426a6075d6f38d64c485520f6413ff4d358a8a9cbdab01adf4db02adaea26494d1f5d617637f277f8b0e6e7e61e2eeccdd337de2baf0ca264c14c8cb8368000b9c714385f413737d6816e212cae2aecfffc32fd16d46c3ecee6ab074c0d768bdfe99b86cbbc8df9c47cd586d465871268d4a9d1c877236ab78f8859c114e251cabc4be0f8bc25d148c5f543e290745d11803e49f5b53193fe39969c039b3f249b32f2b8598b6acf4ed64d5752bb772ff4ee00ce0f85ecbb4cfc4ce07daf2809868c2903b781e12a274105f06181029e47f2bfb21f49480aa1e444715c0b9ff07ead88975d93585d2ff424832a9783d94906a60f877ae1c85ff15317badca1e61317433c7ce96279b678ec9d174dd0870080b234154f626a53462cfd547842eab8705605b8ee885729ee78d1833aa43f55ac22731989fdeda7dc5fa9c01985f2661e6c7326d346e6db27e6f921fae7c93a2170e10dd0c460bdc -SIG = 0c3136e01f9bcd99e10d3d124b0cdb0772bec18a864be81bd1daa44d818c3d470dfaa8ab6e9a761cf03f93ef9cc78291096ed6d10c08fa2fba3bac04dde20f0c - -SEED = 64e89304a335e903cb36c0bdf1a6412ef368468006b73d3d2d61cb030cc5f8d1 -PUB = a180ef3a661c3c479d5f69807c902748e35e7f725121e37a5d91b8bec88d83a6 -MESSAGE = 2f51074d981bdafafb02a40fe826c45f3171c1b3184d8c260b82b8411fc625cb02ccfe755dc29dc7895bf759e61b2450da1a656a38d4f70d2ee748c518c6420306e5f01ec7a0ffe0e9dceb93f6c077b12662881584f98ce6ab945f87fc6d123c45d6cdfd8237a1ce3635b623a79d020df44c74b89ac14a321fbf33a8c0a2559fea1c2b156076b813908f842ebe4c2b949089e52b1ae40dc6e4b2abbc439a0bf72369679aab6f4c00018be147f7c0a67b9679ee88a53819c49f7b675e30a8b5af39661ee8db21010411294968f88e5d604d0d88d76a7e4864fad3a56f5f624ba1b34ea9cb720850aad3bd4f0a882a7d25fbec2bb7ca86da616da96c1562c6d6a1abcc641e1b58b2c178e1c3bc8a3b36ec9e144dd2e75b0bc8c08ccb0d6e3427b0322b3d6ab93f3f60b9cc5b61dad02385a14949f9b87a8e3af1e0e0fab7a9a928c753fc6110444af7ccaf8027ed641b9ed87fa5d8e1f76cae465d57a70dad9ebfdd3ce7576ac4de89d98f42e282ad87ad6a5042577cbbbc4d951e2a8676fedc8cb1b1bdf76c3a38846385a85aa24706c20a8b38465fe2ae0e41f78e614b8e9642fe2471a9015747db976e0c7848c23ff3f417cb05a8d5ef40130adf855c998a62104d7e2fb7c0f9aa2a496075623ced2c0f7eec10147ff9608a8a042ef98117459b93837fd1b8d5ef03978eada74cac -SIG = 92eb4454814001ecfc18025d6421f64645a5bcbb5cb8fd85c14d772617c503e8be7d3bcf117f5e6801d1c3b96f9090a66ddc67f8cf8ff0f1c125b16b15e2ce07 - -SEED = 6f634387ca2c0cb167a740d6afd89e2a28f5307184e81cba3c037046a5ede23c -PUB = 011f2a9a111c38f3490cad1685be78eceedc6fac4a3221301c69c84b1ec7b3a7 -MESSAGE = 865c20a94ac3f2e3bd5cb85bec9d33726671fe01f9c537017d59c8d5106e43360bf76fc06186705980c8a87ba3633a4a170426ecc0defb6db2670f5f592533774cda50052ae597d48deacc2637063bfd519f2e79bac81775beccb1ab2f5b39712e2e829469b75a2d2dbd08aa6d24723404b25eb948a4834c55246c8079a82ec64354e8c2388f8c5a616b3cdc371e6263fabc9f6099219e861585fe82a67d610dd1eb5c81c96b5cb354a689fd8aac8db76c433f0cb0b31cf1d855b6a30a3d2a212e9b4f7d7afe619951f98d2f1ba2c101085ba81f49b36037cd6457a7eaa8f4f3bedf68d09fc9fa25a9d754db65360285412d1a6da53788905fcf4efa8a80cd86ca48b845633d8c31c2ae06f16c4c6bbbe9cd1afb59e101be50e03535dd8a65e45bba46d45cb14badfc8e93ab5267f4e492ab1f9a95e61fcab81cbf2bd867a3ec7b4baa189a0f08567075596129dcf9ff1c502d3279e8aa6ce56eaf134582a9e430a5aa8ca10c3da8bc793d0256ad19aea7149f0ea7ea95facfac1c5cfd29d7a3fe1a417975739e14da8edc819900472ca8c69716328e8a299f974edff741aabc1c074a761b3ec8761dda2e7eed7af33ef00409849d415497c5ed5dfaa2259a31d076398170b2d9d210208b4a4c7db8c626d1c533562a1f95489f9819e4985fc4e1d1a707be5e82b005481d86377f424e -SIG = fd17c618cdbb5d459ea2aca886f0512c623251284aae3a83eb5d7f60da1d9b2ba083c455a5e2583a3cba736e7b961ba19c1cc8dd90745da82a15dfc662e8e10d - -SEED = 4b2e1ae60fa5d383baba54edc168b9b05e0d05ee9c181321dbfddd1983959154 -PUB = 36c020b18552345619ef8837eb8d5494840e85f46809343b4d6f406125da557d -MESSAGE = fab98b2bbf86aeb05086812a4b0049a1042abb76df9cd2908755706303efedb1ad21e8bc8d7562349e1e98ce0d752f4b3d99e677368bd08c78fe7425ec3b560e383bd42af6499886c35add80a5828b61d6644d7dc443ba2c06f9bad2eccb983d24458f6ada1b10bb5b77172c5cdd56d273d1e41010b25cf48a7d58d7255702ac12f2a6fe2918466395f460d15236d035ae9410ca86c4605128299faaf09015f1adee7768ee1a8f8ca06d10dd7f95c46fa10253065f9d6f90295908809fd779571be29e0ae66e0bcbdeb7913d2bbb76ac302f3452c55ef199a48eceb0e3596c7b4c0386dae7101ea244a33c4cdc830672df83655b35338052307b94d223cab1af69e07f78e58cbb0cb3c5351e3a6b0c4a927f7562c598d2d3df90569f61db1a3cb0140b56ea02cf7745fbeec2028673d67f1ec5f7daf9715f754a9d8ed46a7a63ef722ee0d5899331b63c974fa880429435767f96254ef46c9968f3fedaafeaf3e8f45634b54f5e0a5fc2d2373ab9e98d9acfe3697e642a18e0dfd9fbc2f094866d401f0a4ca2a456edf6a1a77b9c296c3922067eb3d5a5ca0a77f430e4c8611d8f05a1baac1635ef7ba83dfc69d301949856be4d2c8ab61de29cf39250c5794cbf5750cda95d0468afa2b7f23dba4ef5f5295a3bf4140018b7ed061884444f5bb1b7d239312dd739999536c684456ea06b -SIG = 2220119e83d69a6a3eed95fa166d1d1128a3f232ca1b78bc94b4d476c4779443614b8772aa2232cb0720a055eb71d8407f3ab19baa1d962c052c84c0bd589608 - -SEED = b216cebf878024c20dfc86ce4b37bdc47aa28f29203b5b44925065d993a259fe -PUB = c36edbb6254a913f08fe259e238780638f72ec0b3007264bcc60a9e81ee9298f -MESSAGE = 9c8717cc86fe02480bfd9e922bd76bffee2170c4cb1b13df834ac01d45006086297f1b8a26f2ba674d33e1d162f19367feba97352b7df2e75b309d4b6f8b07cc0eb6777e81e268e02d07f2a08f8f39d5a8320bfc01fc8c9227d2cf05e12891ff4de885a1c93371a0910ba53392aff9ba2eed9a2055977ec4157bd65b34df79372f4d50edbc48924353cfa1692319d88a7a5bb726254c209291e9b1d2c1a6c8236398109c59ed42a0ac9e7633c520734eccfea4fea95a47a8f0a068b4275000439cc97c57871e105cc0790e9dcc9c25d5af7063ffd05c4f3780e7bca4c456d0170da709fc6cb3faa72bdcf562908ae9340aef4d0c8b91f0fbccbcf1cd898b1c716f4f1474c3aa316242abdf6368e57a247ff2fd5ce23d187f694f11e38dfbfbc3d9db20903b4ebb449b9049ee020f6e2f508e8b2b165bad7464dbdd178cbd423233765d371e7ae1c3e878cdb5b824b20cb309867c0e473c067e6744008527b6bc076d077f4867622aeed1c253dbde7c6a76c7015962fb73391698600bb318ffa7b0136ee4ccb07daaf01f40ff9c194f98681f9faef8b6f9e99f95df0080da8966a8ba7a9474c537b92df9799e2fd16f788dad7a7bcc745226e1e6371f52ebcdbd144044ddfe632dfc0a43d3a450923170ebc7ae219e50e078a511bc12ef14cd14b5309f38abd65db2b2a7af2243b229c9fd2e -SIG = b7389ee78dd9763f9d2892912edcbe3e8a236b8bdc25f44b9cfdc8c47cd58168ab56eb0402a5bd752ac8f4978d2ea2b65d2fa85265966b9f57227ef4a59ae009 - -SEED = afcecea92439e44a43ed61b673043dcbc4e360f2f30cd07896cda20cb988d4e3 -PUB = d231f69235a2e3a1dd5f6c2a9aaf20c03454b9a29f4e3a29ab94689d0d723e50 -MESSAGE = 0b05f89ebb3397947687afbef0ede87cf3810676277037521d952a3bbbbdc8565988a095d8d4f6f59be572d3d821dd789977ef77a2fd7110ceeed9f3756ed8e188267b97a30ef8957c78aea3a2963deca61860545e0c40824881ebb1db10f607e10ddbddce400ea236ba4745aa99a05641976766789ed0da7db55fdab459ebd4b441a6282f7cfd5a20ea06effa335955e5fd29181671bc92c00052f7f75c39277c9a43b787ac9fb1516e996232a509774d1dc21d8c0513f7844b0a5b5f18957581f99044a14223ccda8a284de12fd424265fe57b270215f8fa9ff2bea517934e4800a47d346fb6c361cfbabeffabd9c4164f45156e245c977edb473642c3940be5ad6fd1a7119a7b18e98d6dc843e0d254c93d0146d18e5c62ede1490f89a605eb454f974778cfae20932e95477bd03bcdb97d5bcb76335942e92ee668f231e69c570ac5446d0f774066737fdf49f10ceb1b52d6d8a4639846a3373a7c6f3b4b3159fe2e7af7eee2f0df172d94d255d017651da3009005e5eac3176c09389ee40d70383bd37117eca083598a1801f592d057186e568e247c252be4b14f723ab7ddb97ae9768c2682fd63acc300779fe04e2b88874751346c9e0f97a2a216772ff9625c33bd7e29fed8003a08dbd33b5d17899c943c25e95ad754fb632e047c112af7f7ceba72362e1a3ddd2935aaf7f818a27c -SIG = a65545cf3df456b28d83a6d94c036a19d0d29fb065edc27e5e93a1f40279897e1c6f25959a725ababc87cf2ae727f3467b79570e902711917191d9cb0d2d660c - -SEED = b834c6e0facbff580dd3b23753959a4c2154c219521b3d27035d071f6599bd02 -PUB = d1c384715e3b3d02c13e090605534c7db740da2aa560f53200a3ced8beae8cf8 -MESSAGE = 6cf147b1605528a36be75716a14b420bcf067c03f1cfe9c4402f14987fbfc9d3ecc3ccf4f8d2d03a55900b8dc79af3b6e77436f69b1417ad4b68fd44e5e333ed90ea7943fbd1122609ec8ff6bb25e42e9914f5920fc72c4d013b6a9685c996fbd8352aafb184c22d9e47871a5280e4ab7dd6a5cfd10a5994a200f670e0b622a9394d4793d0a420e7d8806cb127c7ac690d45a2e94166cea672bcd982b0e9baad56312d2570ddde7e0b9e7f47136f0481d00f66a2aaca4d1b09d7ce6c5a98a76b68cd97d5793968d667073f8217f9054735340f9b149c0dce845b099e88d0709680f0f77603ff0a2331c558fc36d5f24da9a62d69af5190d21b5c857a1e08f014c6d456468665a7f845c66f9111f9c098c68940efcd87b657070cb9164bc9743aceb7439a0d01c0062a11af2e11349397f5d152872b13c5ab32f51cc58f1475ec82ac671561dcbd343cfb3c5f78d0fc73053c6004b0a4ca3f2043ff4b0c54275c4fcb9cadc6baabe57b1d5acd531e972ef9335136cd1d65512ba1f5b6ccc4b66b4250aafa2967dd4211a2742e0f177d8f4063899f61815cbe6d8fbfcdf74812bd40cc10084e46a99ac128058eaf16a49a24b6ae228ecf0109c52dfc06e37d6a333bcb24aba312164c6c0290485d251280538ce9541c0916640e36d6929dcd9588eb99577f5f6d82bcbb198826267e49f5daff2c0d -SIG = 0f19b7066d5792328a9800d9d4f8f67d5b089b541226a167dacd439fa485b0025a5dc7f2c7e23fc4a5c6869e7619d356399700c93650e89cd25b90fb9925e304 - -SEED = 2269a5d8f7ac2cd9048f5f49e349e5c435a159b319fe3b30bfac8d0d505943f4 -PUB = 1c817943dc39c24b01da38a487b175482460c609e4726349a9aa7aea9bc0fb34 -MESSAGE = 7153d4d9e641aa61920db0ff4bd537a6d6130a396554cc94537698f9cad16b99eebefa5f2776f2feaff6bd9a6904120c67e0883f6b96bbbb195e95aec753b699bab3d03944c13c72fc84e3f2cbf6296f645549111c93fae1a759bfcd16fc09e60bb9785535ad27da244ef2f857f2de99a6e92188890e452c7f5b9e3a4b968e11743b6fc7faf1275e5360a5468941797894d770fa7da364a337302239fe83ae0b0d084aa12acdc63462524e0eb10fefe81ba96f71f275f3449a3f8db21d58749a38853d39b0ad8e69891bd204dfca8f6c239dc9a0ac27f54db4238d4706df11d607369dc7f704da1d39f2e82af8c283d220c12431f56d803069b4acb77081c031ae3319fc77fca7845097fd727ad0d080895bba23e873d2def8cdc216c3eed61b08761bb9ebce0282cf502aaf6ce7e8c058637958c3ea1b72fe6e8df8d37ac055db6992587fabbdc467f52475644f918863af620492f34680f2056cbcab75e2323626c094759c0e0e99ef19759527250646ad760120ba386699d53934f956b8bbc7395bb496ceb2dd223c7b501b92d36a95f8f0a02eb5ba4dddf166b9b95b4a59e72a30c63cf21e6085751923d54b30281e52a09618e6f023ba0a21675e7f989b8991588c96c2b56a78f5d2945a7baeb6a0c1bbd5d95af3ee830f5809c794a15ab4b5f89dd2be2dfdcd8fe0520fda2b3f02a1ac0155 -SIG = be0fb3308a076a61a4a92a97f6ac55327190e1341d6dd410d86b41bdaf2d3374093ef720bdb77feb7014e0f77d3b809623c7ca53e2ae4b097113e96db77a2d08 - -SEED = e965b3f257356685c98b42b964a253fc495399cc94b099c2445fc81c759c68e5 -PUB = 689f5410c8e0f4d37bc07c85d7cce6c9b63601f9bdafecaa448a5eed64afc8c6 -MESSAGE = 6f20a9ad27e30dac76b30d4c19a5bd6dfd6d049213f4becdd963d72b8b2dad687b003808201d50f7dd6e599ef58ceb6068c545ed99b9e763f9b0ec1db5fcbd7d490a121ecec6bba1eb5edbd6de85364707c55e300c8b16bb2530f70898136689c988591d5391d9cc347d7931061a9b7696e2c9f35bc0d304a81c2cf954d9c3a88a22e1d67bbe0a85308477f62918c25db504e4762f0e3b4246007908ac701779006b77d72510edc69e17d0f6394c77e5551875a446f81233415d0a91a0460b51c413d644e850f8557281c46699e53b22a7c73b068ea38652cff3b0a7b8ba30971eab18fdbbd8739ee1ee0cd5cbfb7d5d41757b6331271fb7809751e203513c9970f66d91bc0ce062f4fcb28be0a699867b79594c6458a0d307acac91f413c4615877dc53e1b018da5cfce1b63f40be1e55274c4374cdfc21524499a683a231adef779d1921440e5d3fdbd5033dc983cfc931abe638c35d5a95869e9fe3d93eb90bd1861f855ce1f608b7bcad6b5e1bd97edc95ed5ddcbcb715d919f5ff77df2da438f7a3a98286dbd5b6e043fc7372f69704f09d865530f4f0edd3300f185b6d73d8716d32d32b1c9ac2ddf4f902d3f216d35a33f368095ded10be94bb53d6f256560fac2f4af0edf5c5c702143777126e7de32d07493932662129ba0e7fc7cfb36fd2ca531646e8cd2211854fc510af3b1e8cafde7a -SIG = 8d2bc4e1cd256aad8a151dec010dc93a5e5cca58298dec49cbc9c4717b5cfb5460d430be726b0f302cbd926beea19aa3c93aeb452a44f6007af49adf2f05bb04 - -SEED = bc3b1e0bf8d69ea5b4cbbf10bb33fc955adcbe13fc20af8a10872ce9df39d6bd -PUB = accd2628155919bbc7f9d86f91dafec35c711a78c79ad360eddb88fa8a180b2d -MESSAGE = 4c73e04abe0819de1f84d70541eb1bb61c4f42920e1f2d1d9e6281a8a2e8b3eb45537d83969027f99ef0ea27ca085b13f9db480f00c02f3fd7429dd567708953bbf3b9e8e2c6ac4d321ff8f9e4a3154723085a54e9c9573cc7350c09f8973f948b08730373597a5fd0349821ae0a3cd6c84992b189128f3490987e1e9ad4f6574ca538fdfd83284c1eb0953f24c08f74932d4364dbbef922542440dae80424a92eaef27c1889bd08c44f9df03a3af30dffb48fae445e625f4d9265cf387a1da35fe4c231504535db72ea81a186805f856ebe6a6a65241432530fe6c960c5f9be6c22957060304e9dd8efbc1e482e7ddbd8af03bf2382899c986d916611e4f27ae52f817ef01b6a141fe4f685d94dc8cd52830043934587704c1e642e8fe56be6d6b85bf4a6feb2b6858f1f007f99d39ea04c9fe5fa7ef1b91f495ed0e7fa4213dd68cea42b6729f95031907e27c44098094386fabfb04ab9b4de3d6861de462312c59b27c76f7b6a4fc71ea0d5daf6b7320521a67e5cb37504976ad73dae2d649feb75e2eadd3401a7f2f36e16dfbfbdb2af5716cba1bce20cd47ce1c1d7be00697001fbbeb4915aa6e5393b5ab20e0f31f5119149a2cb4c4d452c8156113ac7824f84f09aeb81202e8dd3dac0aa89399b5a38b1e218301960a37d52632eeaefe3687455464288eb17d9e19a3a72ed9de32c17be79a3b9 -SIG = 6ef7f0e91f2cc6715f8e5a98574b4400c261a643e0545ff26747f8e1739899d76640b6451c43c1d03a4775b54fcf9bce18ed3fccad338b7764024fdfa2de8201 - -SEED = 10718fa6e2d7f6ed38fd66cb6dbfa087e8f1e8a8a24fab58d79d7954b8720c3e -PUB = 870d4f666d06fda9f9511b58602eec050d754ea6d8e79cdd19f601c477df1aa0 -MESSAGE = 41259b6eef13d6ffe33cdde799b995c40be782cf978440b66be51c440582abd42f526696bb3cb92265b1ed0e4bba764cae2839830a252635dc80ce5f73d521b3d6ff03ac30e198ad20567e75a34fa825ebf9841508da84cd674236ca7b43de3564c94ab079408fd94137ce3f90a5dd5d3ac39a05ec86715a8f025e4539a7640ab88836f4efbabd5e1652c49ea21613acfe343a880ee5a42f2f9134ef4e3716b16d134a9c4c71c39b3c1a857d3c89439783eef1edd71bf4492d05fd18673a5242ff4187b9de47ad4968da49dba5a6092e95ea27ddfc7448dcf5972d9d228d63e5291ba6e6fbd07e3241f9366ca4976bb04b22d01f0dbae794fa9c1d9029f88a83602b0e0ec55e22c37b201125cadb5341ef73f6da1abbe2b1c475f0750345b1be4259d8c28531ffe7788667c410dac339918c869b00ab80f20bf7990d366f9b3d5e8eb2f48d7ed0e64b85dc9fe3bb998b1eecd1231e902d2d152e09da2d2592bdb32c8cd2e2c489496b2980c03dbb09ec7f8a4ea2c7020f2a0faa657cd6ced48d6da27864cf5e97eea9b3c2f0f34abf8d87bd2adeb60c7272fc4306d955bdc8023d7d3dc2f3dafe9ebe8a8d138965a7f6ce93517cd2099663f67c34552176ddb595ac6ea5609febcf24c7d69d412709e578670a21ac8afccb8bf2b18ff3af7de21dc71d50d60d37b6ed729db04beff7d34b2920d87551ce15 -SIG = e1659186f1f76fe43ac8a11703360fbeff53b5e57b5974aaa08e2575579c27084cf6802e7c206347314475b603197494e7d61fe4b1ee7b78e18d94469352df0c - -SEED = c1d4724c6cb1bc6723b2b43034278b3c5b48fed7f8a3cc2318033e7552047351 -PUB = c27e392e7c3664b9061ea76d2575dd7c41eaf1da3a65f3a986e0a57f6c40c17e -MESSAGE = deee99d7a77d4300c17aec1ab323c571c6e9e73a43491a3c7888b76fc03ec43d07af42a05a2aa322d00c8560acef314106b10b9bd12654357ffa26f2390050da63d668c9e2df548f87639e096a35853f82e761fd711d2a265438f5d4db5e32775708150da6cb686a2b4ca211d7f00dc0abcb2ca150e791116a10a5efcff3514dab8ed80a7092c3a015152cb25d9f86ec0d1ca67ddab44d64eeb1f931bfab2ab188956c743db4814808c5cde1b0745b3edd340eb03ffcc80a78f3db310f4f5c20009fc0279c2c1bcb3cedf990bd0e20c6f9fb7515ad6e933b07e99da6ac32b97141187ef63bdb1062e37220a4dcd419d6244cdcc34ea41d0bcbc3138b1d54aefc0190e30b187db073aa7d6cfe04bd3fd2ac00313e3ddd64a181935ca4b8b2a85d36bc27d97b7626767b93ee38def8b6b2c8da9b00263614342faa9d3e738d2713c45ffbeef8c84bcdbc8da4309c8445530f5c617dc866251f548950a14f075aa3117f96e41f899dbe7340b1d90a1352d3b8fb41b79f16a82bc2e4a193b8a7232400996b73b1fc00b2ec1c667577f82824d39fb7f6e7692dcd97b1d8ce94083ca197e9a5d40fadff0b9ac57e9de761c156e6d31d52c332d513e9f58697dcbdd80a5e42c551702c3de7beccc3db845b1a04c8cbd41695ea7428abba89e0dce3e3d9e70230ae9147c2b88559dc695d6809a51ccbc1dd9e089c585f -SIG = d37a6ec82ed45ca9b4855de9cb942564e883ff70a79b8e712d5f604ec8974de5363ac849cbab28e7aeeff28ed3f2d14b608b3146c2efe0735ad815c7d75a1a01 - -SEED = 37c070d4a53b13be760635110d1bd4f01920225afabec576faaec910f2926d1a -PUB = 0aa85f2ab1dff895d1fad0c119f2bf57126aab601c528d37698e97702d35f525 -MESSAGE = 10c646447f81ad94d015d86d0d98b2452dca60a47ab35264035e33a0942b954e3e23b91d8123b8593c6af7c8d3ecd290e0e5ee36fd4e53b7be633a6cf027a5ac3f0f679eb1bdd210a38ea6e48b0558e303010af474e7f6df2a4e457699fc38e36938b05ffcaa1b694e32f3d1b2cc5d00cf256f12184c873e519089ec1df15b0dc76e7bfe90780df58136fe597fce894ca563e08efa0f2d4d208bede9a874882873d251baf019fe46d1d6504b3bcd243b795351f34d2e7606aa975528ee50d59efb6ee6992a89b2426956c2ca4247e0df0129852983e9767a8eed1bc7335ffca8d0289f04807f67ca7da971f58db8b9bc9fdbe4f83cfe9a00f1ca584798bc71d851ff7cd6c51b8990aaba4d38b416b92240dfb70ee3c12b5e731057762ef90823fbf683ca06d05c20d3ae2b97a83ebe70ae17afff9d16609d546d8d3c74bc281884894f3d49e083f10ae7c11c1dca0effefcfa6e0f1535081fac3a2819fd2e3265527182ae9d391b232bb7542e68455cd267760db652d19e22fb2ed11cd1305ba8d98c1ebf2d1969b24d64f3e319af74e092006d2a3ff744872a20ebf18d17748ab7110805096ea136bce2f968b205e650b803c531d06775ae5ceea28bb92e9a0edec8951ce2009a88ee1b64d9b9e89f69051203384210a102a44d2d6703173b68507dceadd3bf6510df2a5cefd9c80e4f385b2f9e6215813ed32 -SIG = 9da60cc4a64d07dee1346bd3d3010995ce2738208ab35b34c2a8fd1787ae3a1e207fe784525154fae4f5794cd8503045fea85cf77fd92f6a70cd0c5a52c0810e - -SEED = 1126496a582ce58d3d618dd8a3933547aa7a8a30fb54063b8dfdd31671c6c73d -PUB = e10229c623fa8ad8982c3e4c36ff52df0f219b57915b6e980e5fe72ea0962e22 -MESSAGE = 6a4b52d730ddab829b2a179590cbd4c372498e9f439977c0a10dc13c0ae1736eaaff063371434fd0da80360ec5890607d2fae1c9a2e1ab0b7f3d667f5b1b9c418f18b10c9e6fd669d3ebec168efef44163e577a2ebd0f2cb768f80c23188e86069e4d10f410306cedd7a341a61e0f4f3bc25041bc2f922ed073e1e2f1b709c579d10630f33071754d707894a1c62190de18882c564dc4c01dc545dd8966404ed78fa3267a9469f63b6120abb65f9b3ba3eee28d79c2eb4e7020cc6987dfc5c29672f8c0fa3e690d584fe000c64f352610179621bfd5ff3eb30d18f1a0250416db93b1c1e93cf8a3646517560d1cc8fff822b51ef27b200e987b592390753453ef138bd3d29db7cb1b5f45e4795b89c53f49704192752237c6ab274849f9594ee9777f6efe70483129d067f97199d9ae36090703864f7ca4750a6f3b6ff83824c910484394d1e2eceba18446fe4e994ce07433a740ddd05f0e396d482894e6f14acf7b97bae6c7eb88703039fa785d60a3af78b13243a4f88dde1d998617f2e3fa7eafc2f435dd4ac1ea9c238407aa09b4eea8ed434927b406674ac270458cfb3bf29c347f94559613179b9502192321b88e9af0a90e9a4ab9eddaae382e3734d1415ebe32499c34e6fdeaf15b0d9787985e08dfe495460c54f6743d81ff16881e5e30c51f4b092373783f12423c3e1ae8591130a269980caa1cb5c -SIG = b30eb56ca9b120bf849a3a9d56af033de8a590c9e1240c1e36dbc6cf0a71b78a11ec143fb9959a8f25b57711d6a90a67e01be3a4da2b69394869bb8d64b87e0f - -SEED = 9c167aff3b1b788f133d422de8ca9a64316409f9e35bfe22032ec417ae9abc6d -PUB = efb534f0d47c068e77b28a906d95ad8d213a4d4fc1c70542f01e596d57b5f019 -MESSAGE = 68ac0fc2b607ba38e377fae845c808c8f9fa614eb1f31158a9620a937d3e301e85acaa69144bc349a39dfb582041c4a197ae99b4d4d59b7a2ca3d16228b5591cbf57c18a781efd19193c47b16c6023a3a8ba3d668f05a37f1e83b0d7febdd10f63e48ef7a20e015b1c6725d4c300a986c60e3a115469c8e52ba05b51c05d0af40d89fd9ed76f36950aee3c7819898a903cfe0361a91c69100b495141e86ee79d63d17403fb1a1629ef63cb7e9d2720cbfff0002b190bcdc26794124dd38d42bcaa7175405eb0bbcf8e37d65d05a37195b479371fa2bbbb167d91cee88235dd72ea88fc73ce3ce43d33b715f25f192ec215dac124899c5e7586e86340d8cbe53735defbe02e4cc9fde69fb9794d1db72b98c0f19766ee5138bbfa78909aa299b4913c499deaf54b4841d5044829984936700dcf92f36542b2fc7e86441b9925f5d0b78c17a85cfcfcb20b0fd751349c27463abde4d27df74265288713f96dea013b945521808b4996b1b2dc0338b6d236efd6d2b27dafda46ec5fa32b965e8bb5e8bb61bd966edeb774681e0ea8c17b8c99fa7d660f0f66c9bc6d95cbd7dc094724098eb05191b53a3df6566b9c90e0d7dff2943848b61a20d48c22b6d3c958e293d709c8f48110230ff51918562877daf6d920c85a82e07c451fe7ae9759c0a77e97bb298b5d0592a41d08f67a4ed5a1bb41e937b6a68aeb38fd5be9 -SIG = c9ae67fd6415dcbab292fab394ca6c3b7d90ca244dc6a7764e74fd202bf4b2905bd2030e6beb914c3c238db371b1cba6d9261aa392ec871a4b8b12fe9c1c970e - -SEED = e9948805eb341b2867479c668fd3532c309941c0ad4cb2e54231756e6a1bdecb -PUB = 5447a8e34d6a640002d8d60bcf1ddc711e4c465c94c34b50bdef358960ff81f1 -MESSAGE = 91cffd7eb1cf6bd4756bce6a30af9dfba26ddd1cce0394c194a3e39cc3d1cbc221b7eb70bea18d29c267457176a3c9e53c18e47d10a67c464505197702e6b2470d38869db5174b158f9992e4435d02246f540258dedd3ce33df582555a681fb76ecaccb1c2989b177e3b7e454aaa529de59bf5a03123d571df2e7f7cb830805c58b74a653bac0e5a888e08dc2236d6cd496aa06d0d67cf3b335e218c49dedad82fc1be9ef20cac61905c30eb132d739b16ca8a8c906619c0e0d8b33985327e36f3d4b8fda387c186cc50443104db761f7ff9301270204a713e58902101fad000ce931647c577fdec148dca95cdc08918ebed037c60332fadf088f036083ebc92e173b7ddcc30c493f27e69cd17a20d30b78f83a72e4f5a747d86d96c5e1bb7a438166204013e2164d6aabc0d562f54015c365c80445607145e5692ee34f6353077fab7452d88ce3eb01d2b3797dc91b341a3a726301516baae18e851f74dfbdf0866bb2376867de55231e362c472c52116544cd4f81e93571c4ec820e7e653f4e21be0a942576c9de91e7d1251683d859de448f822dcf3d2cf55ede2f9c71b6063d1373061f8f5936b698d1384e65459ea2bc26ec96775ef425207432dda0ac1fe28526c5e4559349c3d8df9918230f4044683cc2c1b858d141ab8d0805bb9336067522aa89c810f3eaa7ac2d8dd28c3751225a19ecec8bcca52439946 -SIG = d3dc62d6ce9c766f2abaf9a7fbe09d6bdb07a4747b56080db09beb4a4e804a70d7ddf4119475c7be834f31956f4a71dad029cdf2363dd0365ce22dc27f078003 - -SEED = b01753efa73bb3de7aa778be7afcbff66a5d3e2c2f8b5aa2b048844050996965 -PUB = d0cc6cf109c999fbf6d16f471fafd0232b0a68d4c46406ec7545dbaba8194158 -MESSAGE = 684e612f27eead0d34844cc81ba911c28aaf6d66e71229e8cc3462f7c7a050daa30cb74471150f07dad459b5a91358476c0598255d8a642dd7c0802811bd88e4cac597efe41ebd96cd0f3b5ce72db4be1a3dbd6b84f5446e3da600d3b1d2b460a009bd31cacd98a91518ce33e9a703d404288736ccc43103fc69e67974f31652fa3dadef3337f6c897a3d201303c8f03597b4a87c98f291ccd58a3f1e898332aa5993b47fcb5ddaa1c0868b643742d0e4a4b9cd427038b3b74999bc89ac3484c0ca13f25aae8e78ae1ccee6218accab81a4f694f5324a347629d49b55e4037504a9acc8df58c6841dddcd4fc4347f7b6f1fd9de0564577e6f329ed951a0a6b9124ff63e22eb36d3a8863bc1bf69cea24c605967e7d8948953f27d5c4c75f0849f872a3e3d16d422fa5a11e1b9a74df6f38b90f277d81fce8437a14d99d2bef189d7cac83ddc61377ed348b3c4fc09ec2b9005925d04a71e26d641667bdf549294331c6ea01cd5c0bd1b6a7ecfda20b0f1929582b74697cb262c3927d6b223f4b5f3043aa6eb4571a78e9da11c2b36f64552580caa7b5fa6b90f929e0162e608d1240d7242cd2f47025c03debe059b1dc94770232bc6765148480bb1d9f50da1ee6448cf9c88b19dd459932c06ed811c4a64a12d5938bd1c757bcfaeaee8933fe5fff21763de740482bcf1ba59afdc8fcf873c3d507bb394e32e45f736519 -SIG = 16b7421227ae09130685cbb1a0c60aa57a5e1afe1bbe6bacea0c281bcc8998e6824a772c3208a6b6b4d236695505c9be82700cf93a783985a39e16e377a7410e - -SEED = 4f4b20d899366f2f23ee628f229b236cf80f43ba183177c97ee34829546f1742 -PUB = c94576641f4a893cdfcee7b39fc21929b86b349976d7b0a46d39a588bcfe4357 -MESSAGE = db8ef02e3033e6b96a56cab05082fb4695f4a1c916250dd75173f430a10c9468817709d37623346ae8245b42bda0da6b60462ccfdfc75a9ab994e66c9ab9fecdd8599610910affe4f10215cb280bf8f9f2700a444796dae93e06c6bea7d8b4fe1301baa79ccec769368feb2442c7de84f095e6b3bff63d388cbafb2b9809dc38e9b12ebd039c0a57f4d522e91ec8d1f2b8d23a4a0ae059af85393bb0a15f749110f6774a1fd731a6ec213e4ff435daab546d31ed9ec3b6d8cc2edacebf4facc5566556eea92e5b3f2542239b25e28012dd4ef40072eebf83ed2a255181f3a442189d68c6c609f4dfdf3db7d67d087a2fcd6d2dc50bbfed8bfbbfcb74d3c41f02a87865b13b8efcf5c3581257be0aa913f60c370527bde11a475c136a17c5eefeb03f5bff28693ed841e8ed1f7c29102f5599dd444009bcea6a92d5574152458e0caf8a36aa72b5dc4908a6461c9b741453005c8fbcc68113ae184208ee14b835480c6efafed18a76000b38e5858290f4d51f52f096cbe490e1eb5cacb226ec495a55a7fa457843d57fab67f8be7e209334785bdd665d7b63e4daf57b6e78928b603c8c0f9bc85464733b61273ef9e2b8a0cd7c3bf8ee0a6872e34d5a27a625e35eaf7ff5440b8b141af704df70c9c18623bd11209513192505105cd7bcfa5f0d919da706948fbe1f761f315846aa3b4813dd9ba3d81b9204e5409c0382b6eb -SIG = 0f80ff5d17488fe26f93c543b04ed959b5f0643fc61c7f2c3bc60132ba9c6210c8b250ea5e84d07b01de68bc174414eeeb31fdc2ba6823e231e312a91ededd02 diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/tests/hkdf_tests.rs temporalio-1.3.0/vendor/ring-0.16.20/tests/hkdf_tests.rs --- temporalio-1.3.0/vendor/ring-0.16.20/tests/hkdf_tests.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/tests/hkdf_tests.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,129 +0,0 @@ -// Copyright 2015 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -use ring::{digest, error, hkdf, test, test_file}; - -#[cfg(target_arch = "wasm32")] -use wasm_bindgen_test::{wasm_bindgen_test, wasm_bindgen_test_configure}; - -#[cfg(target_arch = "wasm32")] -wasm_bindgen_test_configure!(run_in_browser); - -#[test] -#[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -fn hkdf_tests() { - test::run(test_file!("hkdf_tests.txt"), |section, test_case| { - assert_eq!(section, ""); - let alg = { - let digest_alg = test_case - .consume_digest_alg("Hash") - .ok_or(error::Unspecified)?; - if digest_alg == &digest::SHA256 { - hkdf::HKDF_SHA256 - } else { - // TODO: add test vectors for other algorithms - panic!("unsupported algorithm: {:?}", digest_alg); - } - }; - let secret = test_case.consume_bytes("IKM"); - let salt = test_case.consume_bytes("salt"); - let info = test_case.consume_bytes("info"); - let _ = test_case.consume_bytes("PRK"); - let expected_out = test_case.consume_bytes("OKM"); - - let salt = hkdf::Salt::new(alg, &salt); - - // TODO: test multi-part info, especially with empty parts. - let My(out) = salt - .extract(&secret) - .expand(&[&info], My(expected_out.len())) - .unwrap() - .into(); - assert_eq!(out, expected_out); - - Ok(()) - }); -} - -#[test] -#[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -fn hkdf_output_len_tests() { - for &alg in &[hkdf::HKDF_SHA256, hkdf::HKDF_SHA384, hkdf::HKDF_SHA512] { - const MAX_BLOCKS: usize = 255; - - let salt = hkdf::Salt::new(alg, &[]); - let prk = salt.extract(&[]); // TODO: enforce minimum length. - - { - // Test zero length. - let okm = prk.expand(&[b"info"], My(0)).unwrap(); - let result: My> = okm.into(); - assert_eq!(&result.0, &[]); - } - - let max_out_len = MAX_BLOCKS * alg.hmac_algorithm().digest_algorithm().output_len; - - { - // Test maximum length output succeeds. - let okm = prk.expand(&[b"info"], My(max_out_len)).unwrap(); - let result: My> = okm.into(); - assert_eq!(result.0.len(), max_out_len); - } - - { - // Test too-large output fails. - assert!(prk.expand(&[b"info"], My(max_out_len + 1)).is_err()); - } - - { - // Test length mismatch (smaller). - let okm = prk.expand(&[b"info"], My(2)).unwrap(); - let mut buf = [0u8; 1]; - assert_eq!(okm.fill(&mut buf), Err(error::Unspecified)); - } - - { - // Test length mismatch (larger). - let okm = prk.expand(&[b"info"], My(2)).unwrap(); - let mut buf = [0u8; 3]; - assert_eq!(okm.fill(&mut buf), Err(error::Unspecified)); - } - - { - // Control for above two tests. - let okm = prk.expand(&[b"info"], My(2)).unwrap(); - let mut buf = [0u8; 2]; - assert_eq!(okm.fill(&mut buf), Ok(())); - } - } -} - -/// Generic newtype wrapper that lets us implement traits for externally-defined -/// types. -#[derive(Debug, PartialEq)] -struct My(T); - -impl hkdf::KeyType for My { - fn len(&self) -> usize { - self.0 - } -} - -impl From>> for My> { - fn from(okm: hkdf::Okm>) -> Self { - let mut r = vec![0u8; okm.len().0]; - okm.fill(&mut r).unwrap(); - My(r) - } -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/tests/hkdf_tests.txt temporalio-1.3.0/vendor/ring-0.16.20/tests/hkdf_tests.txt --- temporalio-1.3.0/vendor/ring-0.16.20/tests/hkdf_tests.txt 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/tests/hkdf_tests.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,44 +0,0 @@ -# Test Cases from RFC 5869. Note that the parameter L is implied by the length -# of |OKM| and so it was omitted. - -# A.1. Test Case 1 = Basic test case with SHA-256 -Hash = SHA256 -IKM = 0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b -salt = 000102030405060708090a0b0c -info = f0f1f2f3f4f5f6f7f8f9 -PRK = 077709362c2e32df0ddc3f0dc47bba6390b6c73bb50f9c3122ec844ad7c2b3e5 -OKM = 3cb25f25faacd57a90434f64d0362f2a2d2d0a90cf1a5a4c5db02d56ecc4c5bf34007208d5b887185865 - -# A.2. Test Case 2 = Test with SHA-256 and longer inputs/outputs -Hash = SHA256 -IKM = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f -salt = 606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeaf -info = b0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff -PRK = 06a6b88c5853361a06104c9ceb35b45cef760014904671014a193f40c15fc244 -OKM = b11e398dc80327a1c8e7f78c596a49344f012eda2d4efad8a050cc4c19afa97c59045a99cac7827271cb41c65e590e09da3275600c2f09b8367793a9aca3db71cc30c58179ec3e87c14c01d5c1f3434f1d87 - -# A.3. Test Case 3 = Test with SHA-256 and zero-length salt/info -Hash = SHA256 -IKM = 0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b -salt = "" -info = "" -PRK = 19ef24a32c717b167f33a91d6f648bdf96596776afdb6377ac434c1c293ccb04 -OKM = 8da4e775a563c18f715f802a063c5a31b8a11f5c5ee1879ec3454e5f3c738d2d9d201395faa4b61a96c8 - -# Variants of the above tests. - -# Variant of A.1. with zero-length output -Hash = SHA256 -IKM = 0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b -salt = 000102030405060708090a0b0c -info = f0f1f2f3f4f5f6f7f8f9 -PRK = 077709362c2e32df0ddc3f0dc47bba6390b6c73bb50f9c3122ec844ad7c2b3e5 -OKM = "" - -# Variant of A.1. with hash-length output -Hash = SHA256 -IKM = 0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b -salt = 000102030405060708090a0b0c -info = f0f1f2f3f4f5f6f7f8f9 -PRK = 077709362c2e32df0ddc3f0dc47bba6390b6c73bb50f9c3122ec844ad7c2b3e5 -OKM = 3cb25f25faacd57a90434f64d0362f2a2d2d0a90cf1a5a4c5db02d56ecc4c5bf diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/tests/hmac_tests.rs temporalio-1.3.0/vendor/ring-0.16.20/tests/hmac_tests.rs --- temporalio-1.3.0/vendor/ring-0.16.20/tests/hmac_tests.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/tests/hmac_tests.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,113 +0,0 @@ -// Copyright 2015-2016 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -use ring::{digest, error, hmac, test, test_file}; - -#[cfg(target_arch = "wasm32")] -use wasm_bindgen_test::{wasm_bindgen_test, wasm_bindgen_test_configure}; - -#[cfg(target_arch = "wasm32")] -wasm_bindgen_test_configure!(run_in_browser); - -#[test] -#[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -fn hmac_tests() { - test::run(test_file!("hmac_tests.txt"), |section, test_case| { - assert_eq!(section, ""); - let digest_alg = test_case.consume_digest_alg("HMAC"); - let key_value = test_case.consume_bytes("Key"); - let mut input = test_case.consume_bytes("Input"); - let output = test_case.consume_bytes("Output"); - - let algorithm = { - let digest_alg = match digest_alg { - Some(digest_alg) => digest_alg, - None => { - return Ok(()); - } // Unsupported digest algorithm - }; - if digest_alg == &digest::SHA1_FOR_LEGACY_USE_ONLY { - hmac::HMAC_SHA1_FOR_LEGACY_USE_ONLY - } else if digest_alg == &digest::SHA256 { - hmac::HMAC_SHA256 - } else if digest_alg == &digest::SHA384 { - hmac::HMAC_SHA384 - } else if digest_alg == &digest::SHA512 { - hmac::HMAC_SHA512 - } else { - unreachable!() - } - }; - - hmac_test_case_inner(algorithm, &key_value[..], &input[..], &output[..], true)?; - - // Tamper with the input and check that verification fails. - if input.is_empty() { - input.push(0); - } else { - input[0] ^= 1; - } - - hmac_test_case_inner(algorithm, &key_value[..], &input[..], &output[..], false) - }); -} - -fn hmac_test_case_inner( - algorithm: hmac::Algorithm, - key_value: &[u8], - input: &[u8], - output: &[u8], - is_ok: bool, -) -> Result<(), error::Unspecified> { - let key = hmac::Key::new(algorithm, key_value); - - // One-shot API. - { - let signature = hmac::sign(&key, input); - assert_eq!(is_ok, signature.as_ref() == output); - - #[cfg(any(not(target_arch = "wasm32"), feature = "wasm32_c"))] - assert_eq!(is_ok, hmac::verify(&key, input, output).is_ok()); - } - - // Multi-part API, one single part. - { - let mut s_ctx = hmac::Context::with_key(&key); - s_ctx.update(input); - let signature = s_ctx.sign(); - assert_eq!(is_ok, signature.as_ref() == output); - } - - // Multi-part API, byte by byte. - { - let mut ctx = hmac::Context::with_key(&key); - for b in input { - ctx.update(&[*b]); - } - let signature = ctx.sign(); - assert_eq!(is_ok, signature.as_ref() == output); - } - - Ok(()) -} - -#[test] -#[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -fn hmac_debug() { - let key = hmac::Key::new(hmac::HMAC_SHA256, &[0; 32]); - assert_eq!("Key { algorithm: SHA256 }", format!("{:?}", &key)); - - let ctx = hmac::Context::with_key(&key); - assert_eq!("Context { algorithm: SHA256 }", format!("{:?}", &ctx)); -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/tests/hmac_tests.txt temporalio-1.3.0/vendor/ring-0.16.20/tests/hmac_tests.txt --- temporalio-1.3.0/vendor/ring-0.16.20/tests/hmac_tests.txt 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/tests/hmac_tests.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,97 +0,0 @@ -# HMAC tests from NIST test data - -HMAC = SHA1 -Input = "Sample message for keylen=blocklen" -Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F -Output = 5FD596EE78D5553C8FF4E72D266DFD192366DA29 - -HMAC = SHA1 -Input = "Sample message for keylen Ok(()), - "Err" => Err(error::Unspecified), - _ => panic!("Unsupported value of \"Verify\""), - }; - - { - let mut out = vec![0u8; dk.len()]; - pbkdf2::derive(algorithm, iterations, &salt, &secret, &mut out); - assert_eq!(dk == out, verify_expected_result.is_ok() || dk.is_empty()); - } - - #[cfg(any(not(target_arch = "wasm32"), feature = "wasm32_c"))] - assert_eq!( - pbkdf2::verify(algorithm, iterations, &salt, &secret, &dk), - verify_expected_result - ); - - Ok(()) - }); -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/tests/pbkdf2_tests.txt temporalio-1.3.0/vendor/ring-0.16.20/tests/pbkdf2_tests.txt --- temporalio-1.3.0/vendor/ring-0.16.20/tests/pbkdf2_tests.txt 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/tests/pbkdf2_tests.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,266 +0,0 @@ -# The|dkLen| parameter is given implicitly as the length of |DK|. - -# PBKDF2 HMAC-SHA256 Test Vectors from -# https://stackoverflow.com/questions/5130513/pbkdf2-hmac-sha2-test-vectors - -Hash = SHA256 -P = "password" -S = "salt" -c = 1 -DK = 120fb6cffcf8b32c43e7225256c4f837a86548c92ccc35480805987cb70be17b -Verify = OK - -Hash = SHA256 -P = "password" -S = "salt" -c = 2 -DK = ae4d0c95af6b46d32d0adff928f06dd02a303f8ef3c251dfd6e2d85a95474c43 -Verify = OK - -Hash = SHA256 -P = "password" -S = "salt" -c = 4096 -DK = c5e478d59288c841aa530db6845c4c8d962893a001ce4e11a4963873aa98134a -Verify = OK - -# Skipped because of the large number of iterations and the amount of time -# it would add to the test suite. -# Hash = SHA256 -# P = "password" -# S = "salt" -# c = 16777216 -# DK = cf81c66fe8cfc04d1f31ecb65dab4089f7f179e89b3b0bcb17ad10e3ac6eba46 -# Verify = OK - -Hash = SHA256 -P = "passwordPASSWORDpassword" -S = "saltSALTsaltSALTsaltSALTsaltSALTsalt" -c = 4096 -DK = 348c89dbcbd32b2f32d814b8116e84cf2b17347ebc1800181c4e2a1fb8dd53e1c635518c7dac47e9 -Verify = OK - -# P is "pass\0word" S is "sa\0lt" -Hash = SHA256 -P = 7061737300776f7264 -S = 7361006c74 -c = 4096 -DK = 89b69d0516f829893c696226650a8687 -Verify = OK - -# PBKDF2 HMAC-SHA512 Test Vectors from -# https://stackoverflow.com/questions/15593184/pbkdf2-hmac-sha-512-test-vectors - -Hash = SHA512 -P = "password" -S = "salt" -c = 1 -DK = 867f70cf1ade02cff3752599a3a53dc4af34c7a669815ae5d513554e1c8cf252c02d470a285a0501bad999bfe943c08f050235d7d68b1da55e63f73b60a57fce -Verify = OK - -Hash = SHA512 -P = "password" -S = "salt" -c = 2 -DK = e1d9c16aa681708a45f5c7c4e215ceb66e011a2e9f0040713f18aefdb866d53cf76cab2868a39b9f7840edce4fef5a82be67335c77a6068e04112754f27ccf4e -Verify = OK - -Hash = SHA512 -P = "password" -S = "salt" -c = 4096 -DK = d197b1b33db0143e018b12f3d1d1479e6cdebdcc97c5c0f87f6902e072f457b5143f30602641b3d55cd335988cb36b84376060ecd532e039b742a239434af2d5 -Verify = OK - -Hash = SHA512 -P = "passwordPASSWORDpassword" -S = "saltSALTsaltSALTsaltSALTsaltSALTsalt" -c = 4096 -DK = 8c0511f4c6e597c6ac6315d8f0362e225f3c501495ba23b868c005174dc4ee71115b59f9e60cd9532fa33e0f75aefe30225c583a186cd82bd4daea9724a3d3b8 -Verify = OK - -# PBKDF2 test vectors from Ruby OpenSSL -# -# Ruby code used to generate each test vector given in comments (be sure to -# `require "openssl"`) - -# Example with 1 byte output -# -# digest = OpenSSL::Digest::SHA256.new -# OpenSSL::PKCS5.pbkdf2_hmac("1byteboundarytest", "salt", 8, 1, digest).unpack("H*") -Hash = SHA256 -P = "1byteboundarytest" -S = "salt" -c = 8 -DK = 68 -Verify = OK - -# Same as the previous test case, but with a bit flipped. -Hash = SHA256 -P = "1byteboundarytest" -S = "salt" -c = 8 -DK = 69 -Verify = Err - -# Example with 31 byte output -# -# digest = OpenSSL::Digest::SHA256.new -# OpenSSL::PKCS5.pbkdf2_hmac("31byteboundarytest", "salt", 8, 31, digest).unpack("H*") -Hash = SHA256 -P = "31byteboundarytest" -S = "salt" -c = 8 -DK = cb84e165acfa5bfab1b5aa8c78d62e86deb608b983a102cb843c7ecad886e9 -Verify = OK - -# Same as the previous test case, bit with a bit flipped in the first byte. -Hash = SHA256 -P = "31byteboundarytest" -S = "salt" -c = 8 -DK = cc84e165acfa5bfab1b5aa8c78d62e86deb608b983a102cb843c7ecad886e9 -Verify = Err - -# Example with 32 byte output -# -# digest = OpenSSL::Digest::SHA256.new -# OpenSSL::PKCS5.pbkdf2_hmac("32byteboundarytest", "salt", 8, 32, digest).unpack("H*") -Hash = SHA256 -P = "32byteboundarytest" -S = "salt" -c = 8 -DK = 2e0a6832b70598815e6d1350a1705291bc58fc9a66e08a9fb2d89e0b2db26285 -Verify = OK - -# Same as the previous test case, but with a bit flipped in the middle. -Hash = SHA256 -P = "32byteboundarytest" -S = "salt" -c = 8 -DK = 2e0a6832b70598815e6d1350a1715291bc58fc9a66e08a9fb2d89e0b2db26285 -Verify = Err - -# Example with 33 byte output -# -# digest = OpenSSL::Digest::SHA256.new -# OpenSSL::PKCS5.pbkdf2_hmac("33byteboundarytest", "salt", 8, 33, digest).unpack("H*") -Hash = SHA256 -P = "33byteboundarytest" -S = "salt" -c = 8 -DK = b7c1a3d23a03b1d29ebcb46b3e422251bae8d649e45ab00f8815553c76efe5cdeb -Verify = OK - -# Same as the previous test case, but with the first bit flipped. -Hash = SHA256 -P = "33byteboundarytest" -S = "salt" -c = 8 -DK = 37c1a3d23a03b1d29ebcb46b3e422251bae8d649e45ab00f8815553c76efe5cdeb -Verify = Err - -# Same as previous test case, but last bit is flipped. -Hash = SHA256 -P = "33byteboundarytest" -S = "salt" -c = 8 -DK = b7c1a3d23a03b1d29ebcb46b3e422251bae8d649e45ab00f8815553c76efe5cdea -Verify = Err - - -# Example with 63 byte output -# -# digest = OpenSSL::Digest::SHA256.new -# OpenSSL::PKCS5.pbkdf2_hmac("63byteboundarytest", "salt", 8, 63, digest).unpack("H*") -Hash = SHA256 -P = "63byteboundarytest" -S = "salt" -c = 8 -DK = d10fa19eefabe3b543e90394934173547747a1d38e9d5d8f62bf1f49c9e5d306bc8a4e483b855fb6d7c6a2f2f2dcb5d25340ce87b82661f1185c24313723be -Verify = OK - -# Example with 64 byte output -# -# digest = OpenSSL::Digest::SHA256.new -# OpenSSL::PKCS5.pbkdf2_hmac("64byteboundarytest", "salt", 8, 64, digest).unpack("H*") -Hash = SHA256 -P = "64byteboundarytest" -S = "salt" -c = 8 -DK = 76d44b557a1e3062fff1c9035e30e0d3352a21fa9bb0bef446e792a75a6211fe7943e156ea32b2bbba68298792e710971e754e1e9e443f167194c957cdcaa95e -Verify = OK - -# Example with 65 byte output -# -# digest = OpenSSL::Digest::SHA256.new -# OpenSSL::PKCS5.pbkdf2_hmac("65byteboundarytest", "salt", 8, 65, digest).unpack("H*") -Hash = SHA256 -P = "65byteboundarytest" -S = "salt" -c = 8 -DK = 28f8f2177c828fb447b439548603d9b3b3a455bbd339d6186772b9e7b1dfec5be27bfb5713c51181720bed046bb2d162003edb2c4f5c54722d0f68c8d597b7fa52 -Verify = OK - -# Same as the previous test case, but the last bit in the middle block was -# flipped. -Hash = SHA256 -P = "65byteboundarytest" -S = "salt" -c = 8 -DK = 28f8f2177c828fb447b439548603d9b3b3a455bbd339d6186772b9e7b1dfec5be27bfb5713c51181720bed046bb2d162003edb2c4f5c54722d0f68c8d597b7fb52 -Verify = Err - - -# Example with 255 SHA-256 blocks -# -# digest = OpenSSL::Digest::SHA256.new -# OpenSSL::PKCS5.pbkdf2_hmac("255blockboundarytest", "salt", 8, 32 * 255, digest).unpack("H*") -Hash = SHA256 -P = "255blockboundarytest" -S = "salt" -c = 8 -DK = 092c7b59d56a3ccc3d02dc145e8500648f4eb6e6ed6b5c78841fefc8f873e580e4e07ab1895f1cbef00cc2d0e52242bd02a2e35a2b243fafa988bf0d4b394c4d257c6b6dadad614d060840c57875dc553b152ff8ff66cfebb3f8d18429522dcc887e2aee80ca9cdfa8b1d775b39f46356bde051c5085d069b5a62fe334fe8c4f2a7605bc4a7e307ccf94069a874a4c0b898e381c69494b2b950fb819cbb7b1f4ea07c33e70e5e4b9d0bca28f6f45a63cedf9cf9db01e969dcdc70af0bc79e18d70f19bbc53d9590c6f5288063f165f32afa92c5548760117d9207528a2b1cd272439e36267302203d58b70c3cf292c8753c02104d2cf0074ca863dc39c5cc3822bee5b2d7dab6d3fe1bf90b43e955ccf3d7775bcbd3a40d60d474a11713ad4bb748e49b0831f13a565f3704f662187db408e7902448c3532956a7bf0c3cd7264e1f79b55cdc42e26af92de4cf2cc876c31cbff64876e7656037a3f1b783c0be71a81e71fe5a4a8da2cdcc217d36b9157effb28b52169aab6d9f0b4b6b1e8de377a66b9af5dfb17836664b09ddc3022223654f1960309953d807b50e46a12ae2179413509ae78461d0930a58ea55ed96cf4285383368d14341dc29d2507d1af2400f8f637d0118305c5faee69a0099e901dcdfe2d28ecc4511a955b073ebf9dea593d934782fa898ffe12d2973174ba78f919e059f452e97dec18e815fb66b968d0be0541cb087f3ae312941c58ecd372d8ff3dacf80dfd327e20fafaae67aae786f2d720c3c7e08d01479142fc36446b52f1ec02043497eb43389ed200b104f0488f10518ece2e041ec54f272e63fa02cd823e011611853bfd2de9e57a14a38a6172bef54c50a021b6e4a426f1d771ee9d2ab185411ade2c667e9245949f0e942abf9b21e6139e8299bfd7837aa5c9a26fd3a894faf066c6c863eca04c903ad3276c47cea80439b96e20881e9b717e9fd570aa03126e4ae0474c2a0d7c22921cd20e0c602941a2a15108f9324d782ecc3d62409653ab9c936943907645843122417cb0210e6320d66b25e64c3f3a18d7c339d6cf3591ee95e92ca4b9e409f622a12a577d905ee1ccdbc645487a67454a357a898906a9f8a55ceabeb41b09041351ff91e41e4e0863fdbdc406d8a7acacbc743691227d4d7c50b7c0e2f4d98fff1427ede0454b025fc83c8dde62cd1842b8f15002a995b16edd9ac4073e28dfb405de0d847061ce5f154ff0c19d56485a7bcc9eb84f7f04bf13f43951bae41c011c7459de18270670c7df424341ab105cfc3b1d10df9262e23425e8d00e410a5d27f6d9f82aad2881198d098a94f05fc2eb99f72d3fcaa68c5fef8e4b0e1f284a451e5a68574dc770e69255a030ec631691cc90a0ea3ff862d84b34632838e7b3c2ff5af544d476136b9dd62b58646b9f614af9fc3d48d66088a7f63c1186d033f6afa9e01f2037aad14bd2404f79c394cd51ee751014b6905600a0ce9dcf9cc2eb816d081eda3d28afc288fcb35e51bbc1832d76d6b97b6761f75b8f908570ea23823bb7bdd8a57f8c431b7fcb7b88837b26f4d3af523ef684a3875636da46e6008737ca1a85f2569b23908736613c381b555198d7a433bee146273eede269a0443157cc1d31cfe42bb58bad9e5523e9d87a2cb5eb16a82f9b84b51b8fb0540daf3f65b4799916fbf218da9fa742d92616f55fc303d339a52c87eef57fca8468118fe195cd458c2bc43cca66724acb968e88f81a679988ae7a4478674f7003a9c3f76fa9a580fb5b976ce51544ad33aa86bd5bc722d00f84fdebab3a8e19584ef6e5865afebe22207d1bf62167923c78f1e4c9fbda21fb23a3e5956b766f2ed5775482606084b1d0fdce41deb5ba0fdae5fdeee63405e47139cb10a15593cfa037595512e15360897577cc62ce634c3976b1e8f50d276736689d39b8eca4a7871b0d16200a5b191789d4dc5ca42831238dc0833457031419174697dea92e14b9c61eba542dd07038d52782e58845bd988ce14951e2e426c43d9c29ac08e893d93c074d54b500bf7b0c1e6f1f85d0aedb8f96ec07622e919dc856313a44e212597685189fb263daac6039222ab25f46d68f995c1ba74f4b9443f55f0030418cfc39b25be3c3722039364ddb451353a8fc2128969bbdbbb36c4570692143ededb9c0c5c47374deb39a1771d24e688afebd363c381d3a0842822390dd97864c92c42f67f363026cc8116ce5e556437af472eef07e58f52a557df9278e94e505c74dcbfd85611ccf40655cba234ac92f47e8d464934a8a6b1c5a6706da8c9514cc133a938798fa474f8c8cbfbfbebd8c077f22fefaae074720fb2e85ea13dda03c083a9ce202f1c7bc532a39dee3cdb6b3692a61e4bcaad58adb79c178277d17887b7de304ad190cf94dda073a19d6c398384cdebd2d46bb38ee0dd367cb0a089c876580878f52fdc49908f210ebf2ddc0ea076636126c0e84018c9522aa5a68eafd566cc247f841742c4a53665879e3c42af53fd03eb5c525695c62de2a09360729334c04a6b3aa59d3489e1423cade10413b057801caf35756e42b85464c8d24ca3876ddff1ff9ced03968f63500f567aa6023dbe90983a5f57991c61da85c7fd0629bc7f684a6174ff39225d929437c2c9a49493dce56034c975b8220d0aae11edf3dc65658d3fd3e1e6386937d97f7c6053c849e9869fe2080619dcf65fee396ad7d42f1db3a580929ed03667f7537709a85f4dc88d911d7a59b688e4a06c8b7057c1ec9cec7acf3549e8c813a8316221f6f45c9ff1b5c8201e853a295bef0fa48923672879d7a3f3417978cb6821d525e69a05620ba3a73de121ecbfe24f0a308e3c0336f5867cb299c1c39857592b59a44cbefdf49ac22f1295562dcf7fc7dad08453af0637095224a71317d07cf1a84d78601883d87845971756814a7a4b79f382c7c5eac96c0404bcd57190e097c6cdbed81ac6a7fdfb9c15f6b1f435e64cb234154e93ecd72e84bf9ec9e5463ad135914066522f8faadc41dfa20b1e0544002138f286305f7ed28c33724ab022d5f10ecc5766ef112bf4fa883e75bb919faf23200cfed0233d914659df5f93caf0a56dafb4aa98d742f52a848a49f3bc9ad36722b21dd40d0e5a03ffa7b89a73a203984c321b26515ed117a30d70d4daa99308e19f916200dd1bf4dd45333d22fe9e95a35f681ed752255a1e26d9df1b1fce3e4fbbfc95f14400c689914c91182855aefc1ca6f89e229a8764dd22af12cebdd224fe0f8cab04afd5d59d2fe858964f7dd0fa2a7bd94a81464010885a3bbb19a0fb5572b2ceb63d21a6a9804608fa18891edf7c69ad5fdd10d2b34592454eef94dd07b337e1cfdbebd9e3603e590e77165442735a6136eaa661c0e0bf451c8c2fd4caef0445d43cf970fcb9d2e181f7db522fb4555021b24af2b7dd6dee025214b4d5802d1333b228cda450633b5a2a304cb9f46d03a2e1df4ca826488b82d5ad79fecb000fe2633adc01cd03d25beb4fff5adbb3d55769d265e9f3a10f2bc21371c17d139110c8e18058c9c3baa67e483c3548baf0ac95e9740f052c3984a855725a3d49ddadee48eaadc50dc7233debe234c8efd41217998b02034efaacdef456fd5bb560fb54b11c62ce080626509e13278bacd24894373cb90f04eb44a68f9ec58d76c64483148175af6acd0eea6cb473a6eaa5b1e106641c5913d1133bb236090065eb275aed77dea90910c84afea2dc22cd79c192ad1f53e712633a5cad5c85e8e3aad0f30508c759f1c15e7c5d20b95b32c66d32e7b19c2ddebef26725fb96694e5349aa2e679bee20f6132236fe4dfbb1da95a5f7c8512f58d040d6bec97f3385fc886db5d83b989a6d31268049117f56e316ccc23395e032a0477096ca38ad60c34ae16f4e4d329da4f04a0ec002d38084c008b9c6453a5ed70aecfb10b2924b04935be21b7cb7fb05f25530d2cecb9d11cd0eaa73a622757a7fa46d19276b519414fcaa7794f71b6fd489ada9f7b4a9f9ccf8dd4db29e4bca623f48a41d0355c6c011bc30834ff882d41bd4fb6ea232b777c49157d36b0e9a1c51e943a3cf328d45a96f21abbaab1e494ba5adceb428966ffa7ede68e1f4b6e817a9502044617192a1f1079af7800acec0921ce5a123a1b12a82bbf86a2ead639a32c2740c36b1c730196e08d8661fa4679b4e056d2c390ed2b4f22a598b86124f11d046618ac36ecdbc1e7d303a3a798d068ccbc63c9432747dc0c1b8017ae98439c2e5843c4dc3ace66ca7dfa828135533db07bb1bd93a82349966968ad0321edbb5277064baff06c4c104d1c64c75b8f36e2563fa15304178354c218ca9b2fe0b3c6c688312506d4ae714ecbe14e1f6f2115e09fbc8829193eb7599e204c0dec8f032445d94741172ca458df0bf71826fa18143f3cc78a11afe2109adb40647138e2fa6c15aa13a4ba92651210003c0656d8554439124f21367ae4a58f4f970e0da60a083e09938370ee9582a944f5481b3935a0100addf3bf7ebf6b4e91be38755ca143284ffc8aa8cde6e293603a894b6379322175e960abc0bd1684d462bcd2327b477593e515df8eb4dfc8d3d700ea965cce24b7e84b2aa2cb3b7b67f45c81e730c02fe2c151e9bd7564c58a740a15e54ab1c3e333a71aa8fb481f304db1d26e874a84314026a654ab1998671525f22fc2cef3bdc8b0a59f2c1a807e10d062993eec589d61a587911a8f66851774949a333ae8e5e98dae248f0225d4008df783cbc608e2f71fc5af609e058fd22e284e3b8e4b3bce312eac704510e8aa70d73729163b1a544f32cac58534a041c46eb41438e09d03e0dc76677fd62d49d87a0757b6d6f4bcc6f9b551be66196acb58dce7e5360baedfe53861f83c2f05240d28dd4de1882f535e1e9d6410f3eeb320bb3e55c53d5d35b6012cb20c110719aed2a53a8e8779abc6b503711657fb4a4e10c1c6ee1f4e2f13728bc2d10ef28788ac50e61e37ac628679141a56d5a7ea9b21aca604abcbb8992cb9532c87119778dbeeeeb95c812d9fc791e13272cfad80db27b20584add19243a5a26606163c047677aee6f65a83ea1f93fd6c82fb5eee717f7b6257f11e5bc441b9178c5671f59d9511b2af6974d76d85994293483cd3869ab7ea6910b12a5431a81d5dd440ba33bd5adfb29404253243916910d9ece9ff93cbdc95d4f64aad2b0f6e2addfc4dfc0639233dd969a4e25606545533c1d1ecd3ce9542d6cc8a0e77733f8f1bf1aefab3ba697c79f5f5c9e182802e83132fbe8919ebc2f93719389aafc80f750151e06b126d35ac1987c061e4d7b652fe2660c57f9912b681ac7338204cde7e6372e509c29187863a762f504923ecd073ff2ad065fe92d5a324a709e97343e18dd3aa5a9e9f2a5511628af65ba38794dbebb7a5568f71515721dd26e5a59b98ad5d725fd20043d2b856ffc21bed8406bb1a5e2cca14a35306beeb68cbabe31dad783377b00f316062bc5b26492e5f226beace8d0c1017318df728ab4b9aacb84b870fff642cc7d3502604515e1658b1df5ac93d655a6fda063529dd58cd28ea5adb91b07657470d2dee39381ad31e21e6bdaea76a95f33d8e51991a803abcf881b7a5940395bdfd4327da5a5e8ee65af23cd19ef7a3a01b8c09a1ef78d5d7194b174c44bc7ce1e5a2cbe9637b47704dcc6b1ed4cbfe9d48072bf175a2fccba68fce6e10b6190b1721382e65e6ecfb34adca72064b44badec5179bf1bca616beb43cb5d644162ffd00857f1b86c9e59a149577b0dd8abad46aabf58f0a6ec0460dbc6386467c47d29fa15caa707f333ed84e603d77429dd92f4dcdaaf4639dbc8c236dfbb6a77d275e2dd0b6f196346f014d31532716e4f304ec494bc5621c46fcc82b0616f6b305037281ad46cdf8c8d97caaf73189bfb103b753e0fb5a78f886a58f509f09d89b9d1cd407dadb9a979715ff32d21efd8fef8b72bbc3ab26d3da1db2c7069b85967a68ebc1ac534721a8b7530fdf50bb0d00a9e0682f95e0e3134bdfb64f0722dfcbaa75ced56560c15090e3960592d4d4da939fc930b91c75abef23120550e6a74442740fdf631774bec0ad3164b6d3218c998e25ae1d807a96772f9c5cd8e5de469602f4287477660b7403661b560e80a790d57eb2a03f878cf757563d9776daa2747218bfb5c988fc1af5ba000404b76540610b197334ca0edc2cb1eb5957c4eab038d2a72012d9371545e2e6d3e3a9c9edfb350c6d03768c6751a97dc7c63320853df87fb6c0996881ef897a07bfd26d43c854318e54cd83e25af3c3fd85ff5c56fab53383bbf874bfb0a90266a167168a3b8fbb96a3a044b99f17c49e99b305afb7ea4a82329d5d57569c2b062f76b056cfc3afbada04332500cd0b671dd7ef8f7a328e77ac42d174fd310bfb90c5c7ea26740d13bae76a365c1004dd7e91f5e60872ba6d2134046dab707d3d9469c5921d0ddd1104555381bf03da83cc3fea32e6badfa9d51800ca551f3a65a70c402462866eebc02f70a4896a98049329498e270da1b961c4c16ce6121449c58bb059abb018391086374ca2ef1f99d3f0f4f6d5d07eec07db704bea365be1b3a1643b17492be541217e7e53aa1473c32af939a26ba6c4720ec845fe97dc2f7401eca818227ecb87fdeac6837b3eb85222ba6b7a20453a680a7796068195f5f901333ff173da8a9b9c59ff2dd2441b0fc39bc02a3b8b09aa50f76fd1e16bf51700683cd485fc1dbefc272ab4f9a26eb124c3ef804a7cb5e5a1b412a0ff2a55aa4cb48a7edc04fde968542ca685576d0cf49eef082d5773f9c21ff5cb41e889a12e36ddb0fc648951e71aa1a7b8424e733c380eeb2419d6a441088850583029506092d8e7e0851fe79ece3562a6c3842ca326a1b8be5f60235362f2250407f526a65245f964e6f3eef0b4b11d678995a49d1119eb6222a46c8a175fd6d3566dda57df56a28dd6309302cb33b47823edf2cb48483752bec788d4185b54e803c7ed4bb23f70d3b261bd8c9e9523bdf13fd2cf3dae992ec2666bd0a53f9971db67627fc22e4057916014625c35b8016133c3ef25d17d6ad11892b0f619caff8da058ee3718afa66affa6fa0d90e8ff855ddd4b15595798e5a09d4f08e4058f397b4b7323738afbf9f171cf058e06919b298fbc8814ada64ff426cd44ca6d6fafd358ff1f38bc340e1206449da3609a39c90dab6b7f4eab8c4b979e0cb85e13f916d80eb97b5097e46bfd2ae10c872e7e70f5f09f83eea91d30a4b3ceda239e05241a1844eea6532cd3e3168ea3507ef9fc4686aa37f1e9c1362d00c6b9e89ba564dd9cae9a38e9323023e5ba07436911fd3e2d3b1d6259d433a4a1bae7d2ab716e3847162d23525355bc826c5ec7cb117d197d83d1aadf934e5dd36b3c8c52dd10514e31e8d2b2e4565e11d052a2976954915fd4bd38f729eba48ff0a57bd302e506e8e450cbef9a8ee8ca4ae53ea56320bd9ae45ec3e2fe11d2f837106c80744c3e7d523ce2eef4714e8392a412cfc1959566f515944981dea89c80a6fd3fc91b79055bb06befb2b33ac4dbb1d0a213fdecf7afbd208459ddd878bc5e5db380c1ecfec6f53d394304355f8a8f0968037f7a4d4740e12ae5c39575a9c4cad4e5f3a59413b97d83b8f32de8413cacde2895f6e5355f9dc8cbdafeaeff32c84074df35d46570adb6fcec8ce556db0393cbc770191553e240c9cc3b164e954b0db7e255b03f8bb6a35b15b7c95a3f658a6c6ac112601a06a108956d3e7a0303befeb66f637fa63c8446069cd2052947e284097e9aeab292bb806efd4c0ffad56c6c67fdb66169b5fc2b8a191089aa34d7b10ada97d7ce3138560f439330e4ed6037d8acdf22fdc3ebda14a1e97c01e7e60f26e9ae2ffbd5ba592f68ce4d9358d598c4760f40c5aa3b7340fc981e6d45802868444ef54d3803266bc865ef7b5a3e8e607a5514c04139a396b358788ac4c8b38c5e3efe759e3d7cbc43cb42c0e18857c0cd1f5f8eb07ce2ceeb9abf5030184550c309226bb4c711f4a9c1bf4ba1d12620066f3180fa3729df635ed51772829f5bb2c5b530a88917e518058877dbeceba5a26f1e1b7ec75fb863c97f5a81f0dbf41043fb9be593e1cb3036abce075236c4d72273d1c04e58cf815e42a79e9f64804a6704396182444e13bf3fed17e81c79e3623cf75fbc5d5bb394027fe45050a1dc4e034e812b5c6074b3d15c6c0504c0876464fc2d15813f0eee0f6c4a7fb7890f4737bd3da478ab329a0b3580f2121c07ae0a293535526709d16bcaf7def4294147a0062181bdfa2ea32d052bf18daa6e1a1b8207db9b78411884f09c36f0d8f6e6e91a0e5290a4b45e9163ea6f18bb84eb304c9f0cc563af46a10d714c32c096943a29da69f634b9e98ecb302f886240e3ec99cb6b47acf5e084d57da0eec5ee31daf8e9e4337d337d676769910b779f730fe5fbfd7f0bb1e7090e0f1c8592d845eb63a42ef4e69899dadbafc6213605a6d22558ab59490d94667281251ee7621662a1a45ee312d1b7ea9b3a0d4bf25bba61c510de32405a3315aaf3f2ed7e02270e90cb91e323e85dac0316c6fa259e97a1e4710b235db509c3384f89ec00247182e5d5288e4895d9e33dcf56bfd0511debb3f923a2940d1116b852fca180a0a9f6e48fa1a3f795ff88e98f18c1fe4f669a0f60daa9637817de6aa3b8d00df9901fdb9cc259cf3d2449d113aecd8e93afeb1a9af4e8b373836e5a9c9664e9245cc9ee6d00bbc78e191872b2fb112164d2e9fb852e65ada5cae0fd4ba9c177af161760337c99f4f05c58e418de35d824ad300d6409b82476aa22e8039dceda726dbd4a9a9d1fc03d009bace1c9a4769a8c5bd54a6dbf409234a3eca478f3ababc4c972c1d3604ee4635e3d41a5c92e52af2ddf7419f7bc9b10b83742c52c924f3d029238ef636dd68060a9933024dbae1a2b178d749fd139c81ca4cf6025a95d4f6a2c9f09493c68f45592f5b6d3dd741a2d2e88f860f349c4fcd7fc024ec57ca60b23f024625b12a747c432e9f583e192784fb1091fbd5e307d5586ac053d4be4c76632895bbf41e540c29fce4b6abdf337f5e1a960b386958dad96318504de3a0451f9ccd110d8f2337b33f523f2fa8d931df8502b0f0034d8daa17495b9820d3591860698d8bcc1944ca002a139e8df1cc2655e547f8e3444650b62a83bc3746cc55ca7093f3152978e64de46e2ae3b59af83c9dc91da3cc4fb805be717064297264936fca83b53ba4df14f346fb17d5c9273722ca742b7505d100c55210060156ed52eaac24cb2bc97777b9b81bf59941127e60eaca89d0ee02b8c629024dffd738f86f51375a20faf0881a9c0599cfc693f9de5a027c2192ffab49b252a21b5fe0564a71cad0d57b287463a7bcb371f4e317645468a25e168219ea6b2579a82751c18e1922d7f5c30173ed1864ca77403ee9466502889d77d7bb7956e659d7be7fc36ae59b59dedcfc7d3ed6d793655d04c33b1eb6f215f44f23e57a8266fb6d234a8beae54381e64dfdae47b070f905ace092f5c213d1d8cb2fdb2914a6071d6663bc68139bc2a1d6dbd58fd84d5568d811a146f6ed2372afaf4aca312a66bb711d69d0b771796bc4fd9e5e4765c75cd0c863e6a6f0aa2244618ed807ae53410c60fd2a663fb2534f1bc550ae0b659435aa142c5a24c448ea8d771fa0e671f446775d1d21c927b0f61ab570ac60f060c4035548819b821c592846ab8d474649adc3972b0cdcb1bee96f16943d736cd7cbde238208eb7b8a48ebd17608d1e3a75129c6d6e8be35e008305d69525dfd8b0db442f1b405c717b7d949981f8a12f358032525ef084a1c998ff9448ffded7285f6d2523aa155a72bd8eb1bde486a8e4590c0bb7c3ab3684c3c53f9a245713e6064112aa98bc6403292a2e6fbd2bf30c132e42fb1ea79593ee9ba65afbe06d2f8c81a00a6bcaaa22cfc0b7a330687b492580aa64d8c4fa7977aa11800fd1510c5c0a17e48830116a5e35e67a013d59841df849d04d86810399a50224e7f8fc2207cf30775a5fd042c62edf2ff3a3698a305d279f0c9c8b577683637b1040715a2aa3c8089e49caea999ef6ab13b562dbef326e96d710d12387661ff198802177770c7b3adca1b9264582b8ca6bb78ae496e7fa4fa6182260eb44980b3cbfa9ac1bcec8cd2a70bee4fcf7f98be0d93dfd4f0fdae41e6334b1afd8766f3bb9296c01f0d17d60c5c1efd7a926476535e856c36eb24879025cf5a3f1ccb7f8277c5c94aa30d30435d60583d00f2b8efdb1b37a3dd47c83ba2bbf9bcd755b1467825a33c75cbb7c1d52c9832b307cf6f35a9b2ff996573b6ae5bb0e52199ea9249dc4938d8b9d033952fa9eb752e2af5afc693647a1fa28d961ae2888741c6c2c36bfdf7153705464105957ca29a04287fcd28af6d41fd61f3d6b1e7b07af41fe37a066c731361b24104fd7de79b11dc848d6fddce156830e0e2d7b4a6da22f5af689bfa442870ec37e8bb6611f68ecc3453fae14eee94d9b904a6b8fad2564f2d31e88a64226f6099781a4167989d87f9bf704f1108279a0011ace8baab9518365a6de0a69675f218e428c10510187412bfd1c4aab5799eb570b140c5e417627a136358a1438e31f052e80f6da4ee5aed1ea95f2654ad87c5ca8d3550d9d4a64fc013bc1bea7c03b432b4d1976685769d0dc0c53984a0f79bc43af48cd45bc8b3ab3491a4c2c69ce81c6a276a75fc6c5925914724eac1553d684ea3ec7232fee6334ab93bcc2083bea5d136d9795b5872d00761b73bea63bac5560df5341cd825641dda95d8c04a4fd24155008e1caf7ec374e9c6a66c87e93e525f9221e9516018dc872cbe1c71725ce15f603f12a0ddf5813fd57a53a16f5d56dac91ee8fa12c5d8313bbe47d3fdfada6a9d5892744b7d9af7a70c958159f36365d11e3603195f5e3561014642c5bf035d610dc2ed8f8765585a844f82b15a509b40f97fb5d1568367bfea81b759314dd3b9751a6177a49e2bb6dc1dfc9d320ef02504fee836aa66b772d100e4b900002428c021223a6a610ac2b96cf42f1099059026ee5719b9d8cf8ee00bc836ac5e4e0e4544c61e38abf3e0b70151a82baae287c468c400124729bb9435685ef90877a803e97db88227f8fc038cb31791203f8d9392c5a26121b22bfabfb82d3ca7ade3ab3e021ad46eb3e9db01116e02c2306f573e1f02571f6c5d4003d67ae971034030ed38cc64dd8beae01bfc114c9a709667680d992b130f1b0b5843dbf72dc4916b18c0f3dc1ed2e86da6b1bb100f85737a59ed70ceeda3fb9645255566f85bc0d8eab38562d2e6765faf5cc45f8a246da218f6f0d2b966556433ff22b348695bb7e6df8ef81e2de8fbe89a0ab500accb4caea339d06b80d515604416f87906606429a162928b6433eb45a37591ce84e31fb781627c625fe0f4a042de6e1638c6b402e9a5541bdaec1954a09e518a665e4843af96b135398301890f07fa43707575d96b3f49d5f36d1de80a4e670b881b5f6000c590143d7901a45 -Verify = OK - -# Example with 256 SHA-256 blocks -# -# digest = OpenSSL::Digest::SHA256.new -# OpenSSL::PKCS5.pbkdf2_hmac("256blockboundarytest", "salt", 8, 32 * 256, digest).unpack("H*") -Hash = SHA256 -P = "256blockboundarytest" -S = "salt" -c = 8 -DK = eb64bac8e24ae1b54266d757f0fabbc72a57f5dc5d03b8c39e65f2062939bc594d82acdd144120b322ca12fba07e113ea83b1ed2c1b33603d72c67c6ef31ddcf6a9547b5fab0655bf5a7c220a307a21491932dbbffb54f99ac997ec6bf898ff9005a88c72c7ee49126397f368f704e779dc25687af9b419b6ba8cc4e177f805f55242b627e980c0898a1ea46ba633e6c0db0a14f7fb323d26bed1a524387041f8c5f6e9edd0a4ea51e0fbae1b04b009d41049eeccbfa45702716fb57b9f4167082368a36f55e7aac656b3677595868415e9e57e7a5cafdf60eb7a8d66098f0be8f012caf9a78cf2f5c0b4d153f9fd067d781f39b9acd730b6fdc9d27f93946c0e0b184d86f7eaced5a8b734f5beab2b930789c18934296c6c86e28845607e9f6d1035c30a7ef5003b19336a56aea507e3c58360f091e70ff59c5869a9e0bd14d2dca4d0a144bcb607bdf583ef4230edaad75e4db16a8275eb74c4a4cf6163e6aa293ebd6ea10b5be8179693687c2cf9ff038ded9a5a32917bbd2c4a703b0500ee0a0373bb324b409358bbc30bedbb405875eb281e9a7dd58b89ca12a9dc8505c524a2d10cfe120250bd22b9b340a29256b58548dee0da72a16084a130fe6d734bb70811e855d20b85d85f662c9574be68238a88165c22194e4942cab792184050abb3a7e22fec3f58537af84ebfa8d858dc879115b2e71c34aad0f6591c64e11e2ff8218c6841ec9b81dd9affc3ea70cdeb09423e712251f4022fbc4d54e0c5d174e198ddd9c6c8587d0c8f3bdbec79b10d46fda6e354c0a8b3b59ba82dfa164369f3075d1ad93c69a716ba8a377c626b9f44e9591c530e72a65abddb15e3766ecd068fcfe046efb86bbc00bfc24fa50fa6ffdf1f84e6e0c0d335c00637f14414a7369f5d2288bc04f284c0730766b3f9fe8464559b61c2f3f4d6e08b1cbf578f186605601533860d5f69aad06dc993d4f0ad7142249f68e1531c60fb3791ede647dc499a6b9bdfc1efd7bc0b40b95c3caeeba615d0a9c2564151598db35a7752953a7b2a40162359b69a4cf9a591d05f38dce8968dd6b6f16f57609fde9a8af9f16ec3b8a40311aec06a5bbae97e77edf32d22772b72fd61c4bf9cf34049830270653be365cd24b46fb7894150fd9e84ae211493b4ce4a95e7d0aa1f12709ba65f7bd7d8c904a9f967ced8e30789616242f7f9054e596f610d7bed0e55c3c91546b8283d965cbc2a79d5ddc4224e1db662d97bbf35847ecca83ee9e4c23d5b30ac8e2608186930e621e8cfa316dcd02b9dc17d59bcbe7fbdfcb6ecf882ce0c122ac82dd305ee7fc08b18fd2d7f1fab397038b84f9bed0d6aff490d720764aaa32a6f5b73ec6ba2083a5fb0a9e1d97bca1038f235d7b13f1baafea051ae898a3b92dc15bc3f7fd87db77a00dbefb9601157ae806e23386f64683992de57bfa37c8e4bc72ca7894ddeb16b833619f430e7da701859608f609d93044283841154da70b62f9267e15c741d5dd0e86ef58bc3cdc4f64c8fc63b9f466cd5415dd8650f7f400cd5c53544bdfbb6fe68c239e4d8d2c07f6affd864802c495b6b4fd0f1fb968c90934f93ba25d21cd7249dc4e3ef1301746d37e67ba34a861bbfd5ae7ea9ed8d7e853855f0f7bd0314b04697980191f448d71d7aed082781b04e3c01c46cce86ee1b8807bd8cf64988370925305f59814bbcecf0e9d39a8c0daa85625ddea187d19f7e3d970b0739a56f3b5c8de17c946c5692dd0503f8b20a3fc401d6fc6990c2a42e81daa46df79727e6a5f03d5c5a616e33b077f68939df7f9ae8a09599cc3a0e0e36b23ff5df4eca1ea1c8b5223a0cf2abb96808adcdeaf68a49e767ac5f934f499b82d775e995a69cee0822d13492a3038bf78faf01d9f4d87ba1f3311c002b4e603671a2cf007352fca16c30ad307c030d70e5f9c091b2035e164dfd6b9014c9bb365a694f5198566a9d58eed322f6d71b6148c1191f9f8ed4c58c03c403fcc5a1de5ace76fa1c1a42aab81e3be73d312513f278d5de7d67e24c961d709a3bc252e11eb067ea98583543675119f21fbf264024f4d33b2f6f17e98aa06dfb409f16a8692d9c7bf0fa340b13c4826cff8b07efa5ba69defb90870b43f27b632c1b76ea7129865e18d7fc597007530852d307708b51287a85d1d6395b489156f18fcde58157f5100c7c8d595ffe37fb8c1077fa204e97a721d45be4dce7b473a5d02cc31b4346f534d52a7ae7461d12fe12fb80dd7124d95e7683d3ee6b521094c1181a4c84e0272d2e0359bf6615121838c0e7da6b344b479efe17e86b52999fc7de81852bb89e335ee54123c408d9cbca031a5b4d01cb736108f9aa1dae4775d1e970ce179c565bbde3bab82f8bd883afb25a66db21fec824db6f4a140c5008acb4cc3e518b6ca77e446cdc82b4d4d6792a9e1c8fe151e84d531d8e2d1c751967f9b3ea7a2387fe53711fc48ee7524f487a3c1af2590be648f6965869a97b88729ccc6578c3aeab055f16998c1750ee8c9358875ef48c37400d4adca39ed81a0bec5e43f4a5819dca470dc86bcbcd932c8bb4017880b3934844bb76c04e4a65285fda9fc0e4e4622b3b13f1ffbad3754fdff8a3705ad370ad089e590cc8b57c2e5618041042e808dfa003bb19d229cd60a849f345f9bf85f53496b1498caada27565312b909afef165d40d82bbe3405a404ded080ece28834129c2b199a4301d6c4ee6f0502afe3dbb3d7be80da9e6b5cb2188fbb73605b31ed4e6846e75d875ab586d995cb6e20b41765e86ece82db4ce6fc1c3e63fa9bb2d2a273e217a0235e97c7750c5a543757de8759009e243d847f79a1aaba097d540573c2fe0d9fe611fe1d30484b5ae60834206b9fb7ed8fe86813f661eeb01bb608965fd6f91501210cbd17ebe1c1f5965bde456c74b96faa771bcf293a544f862689f2972444b7ae83f536c86ff21b8d8abfe8f3274fcd5d86b3f189546f927cc92196722d2e3cf4a1cd54352ecaa4466b801217200b8b981398e08209f3d597dd4726eb8f3360e757613bfded0b02853cee281b45791d3ae996bbefca334cc35f3d0dfc6f53a3defffbbc4f620e65e916171c0511678ecc512f48a230548aa88dc3886ee91a9d6d6df6d3912fd64dfc80ecc5fa1ebd9a715ad846e0bbe41b09bd33f50fcacb1984ed5610ff1c898d9cb9e948929f3f9d26b8d48ce0014a5f7840d7e85a0f61ed764587e382cb9bb23e5476dd7904e062c66fdc62f26212f66b1f8f9fcf061a2de063a6e510680d7689c05740cb62ac66b97f4060a491aeca2f485d1c1575d85f495bec1619acd001547b05d2e55c661019f67fe2525730e535a235b4e5d1126a66f27c4a9ed3bdba43b94b4bca662731613629dfa088f615cfd4eac538cbe8f137653a9e47a0a6f4c86937f0bcc4a287319f5bd81bb3e187ec84b248005383a955540216385a8efcaa6ea1ad487a01405a636b76c09bd76157a4358fe5326735e0d68c53792d37b26d894e5149d9afd4fe8a18aff58c94d37659cfd1fda6af60cf8dca192bab99336638a4e82ee2e1559571b22bcceb3b2c83e105c526f36abe6deb90d0aa1e8828778e98da0b3e1b24a2ab43851edc6ac887ed3878b764a5da26aafb6269ed3dce51595823ee6d7a4242498159d50417a26a2915492e265a14e9bd3a339f9aaf064da98d8888cd13cd7d13dc18a1431d3ff973c46ef0d487ab619d3cbe5d4acdc658aaea89c02a8255bbc1a824e0df48f2775355be55419edac6c9edce3eed5c2025b8734d0602583b14a573b7236f21dd8dbafa6104b2c49bd2c7179e9e934bd2ecb52b55df6e54aff822b594c8f73dfadcce73727ffc68a4512a3be2f4e28557a6e8262192dc4f83971d4a366c4476d4415b33c6448d6261e69f7563eb1e0d30490f1ef6ae44321fbb291ab2eb8a120094231ef14a4c9caf84cceda7b8f8d3488010e566b8a526fd5ddad414e9f2f14c94a4fb48e4abbf4ea866a48054ab49440fb4d83ca1312f9a3eb82580c1842e8b497e9303bd4b0bce65c63977f3d8dca4b6d55c3b7d67cb4e28f37b469523d3fc1640dead462618806062a703127fdad1fde5e5f5d364c12ada00e306e9592b7f54f9c0e69a32985403f2ee4d33cc37c8709ae05e02f36bcf8d2b92c89a5b29c70fabec2c840dbd5f5adb63434a059c847b163bd79827d1f9af7b47f89f845f31a5d5a6a2f8eca15fb9874d5b6e14d91832d4004cdd59a26c75767d482f565126fb710347930360df8febc3e3566aff94c795d8e7d22e99eb0f8b9696d88ad95b53b74df9b181c5d35103dde3de068141c7d0fa89da6d92cb90012ab815efd7c8481be262987c4dc8db2bb851813988f1ad197f8e5e2c4222c1f0ba0220c5ca2b9abb21ecc4dd0dc21341870f3bcc5597dd6ecb7a7a003434d5cb8f97ebf2c026176e5b3fd14b4eee95c036062a92d19220a341fe0dd73facee271e474d2e43354a03a97ee2096da987e52023f573a703bfef64935e2f5ee5cb692cba060436fe703e0af1abfb19cd85ed8571b051696ff9698368fbcc7695407a479e859b8857520a17f702b45e88440d385ff7dbebfae69e2223e068c87c584041fa7896e864d4c793f3aa3097b3be2c267f73d15c8a37b19fcd658640aed95d1682abdb4933d38c4fd8f057b28a3d31a1c4efab41378cbcf0a08762e27d82979d6b9e6ba717f8e67f6c7e9924a021feea2023b0e8c77a782634d441d8def322151b8415ecda2fb3be81619dabca2e12404d309436b9820cd6a8c186669c678ecfb9591b5fa7651f21fe4efbf4953a5b718618896677fab8762c630a4ef7d37859c89a1395fb926af55bd58b561283e69fcddcb57d3d757005750cfa0aca71f08b44be90725f3670b845298ed96b8584e5615cfc79e6ca295abc9641fca7039253bd4b1b677e230251bf4e6a23465ff595ca740801962f124d6cb658aadbc4e4bd3323f251ac4347f5a71300e2a814cfeb0d52e26f5de00fa5e20cb88490273ade48623afefdd0d8311cc254cb76bff3ce1f6464bff0c610bbe76d96ca96b72d1046b3982fc81f8a0335a448ff423c3932cac3b6b52e3eca4779cdda85838b9f5737eb1ac0ea7e8d788882b18c2fa2753bab41046a5719d14fad1b892258f6a680779546797c7e93d00d3cbafbf8360888233686ab3e60bb556479c9022279435602ce0454c9db189a835eba32b7ec9a722fcb83120f7614939a211d6c7f43c25c5a61abb55ee37999a382139f0e373e6aaa4ee45f095f50de6f636b100452d20be72362fd52bb62bae54c9c4d333efae647e85f21057706a862d6e6a3215181fb42168d4db56fd4d55da007798099e7a5229bb0a50e2f0a6a91f9182d86afaa1317ba0e17b4446f3a64cd44e7904e70dde3faced7a78baadb1d410a63faac63f107b6ca692a6b568bb5bf49b7d8249466c338f1004f0029280ae1d20fc31f0baf884ac6faf8806934391be9fc7f2ea67bf1a69cefd92d2571b7ecba0e8629ffa5eb39a7f3b896a5f201ed6e87112fe710d9a82983f899fd7222e737c8ac2831c002800321cae79702b5e010c4a2e117bc316da9056474d587919cf8c1e1e64731b649968810858dd108ca918e9439945e7ca73497776e1fa8428c92ca4766a9d91660e3b88f890460bfff3086cfe4bb9de117790080299f6f88c0ab0fe080626f1765906c150a1758b14ee5ad28d630f7167d5f14a0ed1c7014b6faf32c482c0c44463712b8dcbdadd5e1e14102faf80c4a5580172249956419cab486a37db73bbb0e5ae322ced6c1f1d5b44ccec14387a1f4e7becf5680ed63e1355c2c895f9eef74c9f8dc6de7051f2e06b555edc92764246390080dc084383d9f52afb23191dd1aa1ce5787dcdd3619c06e00a1506e41a0ddcdd98572dc830797d0ab691c96da19fa7cb5eb415f86fd560b3ea8afb19ec30ad89deb484ef8917b7b36652aefdd18629147bd654be1d444b61a1ef78f833b6beb5169237da428fe1a3322e815e5429e15dd79a09475bd852ed75f4d686ca6fd9ae9b8c9bb592f89382c490d4eb9e29be291e733d85b0dc8a3c7b33f8bb141a3072d8f76b81bdb93fd04a901978f2378512e2b56bef1faae0645cc25ae33a69465161b766f7b8e6db360cfd89b0c6df0922111dc8488e1e871c91c4e660175556d9d3a373fe32677c75d8abd10abaca367c4c2bde573b26b9a667586868a4ed2c11212afc8538577bde92e0c7521f4385ae4ec910b3d46ffa91228b20188e173154c5b3302735c15539c1b1b8999547cfaa76406c18566c9fc26eea88332e8355c18c19464f2f9715640825ccf2081058229265f599b0871c18088a4c69766e65e3cdcae800466045c8eeb46baa6b254abaeb9881581ead324038ec55d341088b0cffaa3dbe62595cc5d70fdf8fda6f0dd704f91c3918ae0e55d0c9bacb00fbd25ae50bf9ae6e2c6b39a7f0eb83e7e65ff71c03fadd5cf0f019afff1d13af69ca52a135e48252997b305d471a81345673f153c25e72a0d5ef5bb432b11f5fa6d655544a6f09be377c0d9a02ed88d6b1aab40545df0392d3c184df739d86d003d0dafb816a6c1d59f54defec6481e875c33a3a620b7ca09207727e7c4458c86f4eefdf1f98b25cbc22d0b9126ac328e52695df3c053b361dad8266ee10444c53545481344fce9a3e6e7265d4f5ab0bf2931029e90741b3e06c95b2ca4b286460695b654cbd0f860fac5f9691d3e7c9440b11210733c8cd6fd1509000d9b96790c3996e4214774419ee338b6d657220aec02a92a4244520124bcf4aab91fea08a8f5a448a6b020098f3eb8be280765159d492607061d1507e7ca1d086406d363deffa149784db21eeae341cef225b79ac9f509f6b3234161d71443c3802f612ffb95a744d9af753714a57fe7dd6832ddfa7d817872a8b21959c1da51e0264d6ab6dfebc532445b485bc9256bb941b8ae2f68f2698804ce8b454f856bfbf68cb87cf47efe5b305bbbd05b35cfff4926e2f29cd2fc5dc79e19623745900a0f381437e5359dc728b3d5a7159abe4395282744d57cd7dba2c9c3dc92a1cc245a18ccc6aee7371c99bde2777619030918875759fa9e3e9d39695544ab43bcdd407d00e818d53c7d6476c4fde7106c6568a6e098f50f27b91a0b7511beaaba617080a8cc252ad6df2dfe36bcfdd4e48dfc985df72424323e0e733b94778fe93a793e7608190d0d3ee0fd70b26adc9ce5110ee579b35a3e9dd0634d532e9131ca7b81f75d0c4f6018449f9e831dbfabe13b8b95562c3f16ff6c767c7db568782027745668bcb1f68e5b2d5f57067e62bce76aa07d7abddeeb4f3d844f0289e16a433f72d979916d44d5dd7917dfc8c79ffbedf4829e5c941d4f094433371a1661b967d62eaf34c11edafadb61cb7cad97221b1def5f757b520d232e8a87eabae2b9c98595b7710861541bc03206bd37b20eafd66a7ec9a8a1acf530de3ad02a11b5c168a06f7238a31185f04548ce2ccfba960b86106c04d441333c2f0a9b1a034fedc3d525b28971ade46af0a612faf10ee0a4ebf72f4cbc3df046f354f7289eb93fcd4a7adb84c1e3d17bdcb2a52bcde29b6056cf73e919e4b09ec0cdea6d4c2ad316d8635aab2ae27a5e6709b0397c9e4f14750ed01f01f1042b8cf5bac1a7f71b937f17bbadefb939461d3109836653e57eaa4b444f501800f399adff23a8a0c571161c9ef952337fdc6f6816125c8223eedfad059d33d6b61f3a976e7cd08abfa46b462083747e8ae250482d0a196ca2a9e3e5abf1541f14aa94faacf1a1c3cc95281774c587fc085bbeccba8565c966941841c0cf05eb2b3dac6e2e340c8f5d658d20d6d4ba6380358d52491609a035774cd5a60c7049afa43dd797db51028b60c550d855c18e1fa80d9da21453e6e7973ff2dbd40ac828ff4e2026dcfc6d1d0b5d8c82a2aa77fccd6d29e218e0524acd9d28f0a1d3073292f4e487af8dffc6dcd1fa20a2918820324e201ac81cda06f52dbbfae9635468f587f7fc2d36dce0891986006a3da26f7db6cf29af463ebd54c05c917ac1e8dcdf5e1a05eb78a56e231b65aacd9784c10deed1668bd293d38b5916ee3f5dfdb1d20f72f138c56cd9e5fb65652b7da41e9c1370ce9abdcbc5c75f41f1a1ddf78392c3af22f29d470d3ff0a3e933ae734c6192f0a9923fc19923253b8ef43e02fc445d2968f5162e56709fd687fdfeee4be2b5362af6d780b025959763bc37dce741909a6ad557e4278ab8656661659e16379df6f6929f4bc0c439d91b320b5fd6ab32369bdb981bad524f305079196b9b9035cae7c818050c68ba6123e5e8a24978d16983753ee1066bd96368467cf26d63107769618946068689bb163e406a7aeded78afda092b3f13ed0a607c8941371579e43bc6913fdb8ff5ef4041778cc52990da86b38fcc99a1e7c2a04cd243f2ecbb8fe2874916741ccd6af8de7aef7aaa8f57a851fc3fca5c6132e3f980417f15c55bb80a429746028f028e1c09057ac370964aedfd0784f8caf4f378c2d7a8adb4124540535dd823968ab6707aa4ae062fff41361cb1b8f23805c262a25c81f4649a8dde4295e8f6649640d6a033da3a5814e47933f56052a19c27add21b009bf4d371972c72138f13511cc3ce647ab9736fe8542557c159b9f8c67db4a99aa9b3de34460ae922cb4e9ca58252dd945f82c5ff382e1c708883793a123d018039b144f7d7da1a86f7af1bfc6eb4bc8c889c2f87dd0bc17b276e1f6d32dd06b87b348c78bcea20e866c42c6984454101d93f1d41378a1664b3f48fc124a385641118e8fad1d5dcbf182b92e4ec0d37fd16cf6f6d77f288be41e90a18c1f284c5fff61cd315097628c894b14284ee5953cb205909648fcf9665cd406cfbae9976f010bc1eaeb6fe62b9eeb3df7522ce31753eac60ea0bd533477fe54052f2af96798cdfa24c801cf2bff25715f52da9e467b59309701ba129b7454c592cbb931b6944d423dac07b41341047e3d7614592945ddf48bf5207deb2bfc59e41514d775e974d86704cfe61c9ba73d279f18f4107c662d49c602f1c041e1d32de6b742bdcb4250273f41a9b304e6bdef2cbcc271d32071c4ab3281ee7e8abf94d128059381bcfd3b113f6dfc59a848f6f47b9a33695ce46e5956ee8d15849acd17720f28d34b7faad46d5d8d8027e76c69c425175eb564d28e748c71dfacec3baa4e8d8bc34b89b64c51ae04e5f44008bdb86149213fe4521587a8a396433f7f09ffaaa603e178131fb628e0122f5f829ce517521c8dd783d0c170f2d945ea8b7721c790b8d8320610e64fbb4ccd6a099566342b7a355ac4bfae8603f005f3ce923a7d54b99b2a4b44aa9f7db887d7bcc655dc1b23bbfec3739bd14947181577ed2561495c9f14229141e3df79ea968e05ffa191ee2d89662a792e479a5d5a7b3cc23f9fa991243caa9b5860f8913739913151ddb1242b7c61a658cfc0e28bd2a058715175046e6a341873f386d97e52f43060c13e961eb577196b4a226a1b57e90a2e6448b319726c28424c232181a1411ac1fbcf241082774e854b6ac0511658bdd679e43feedea2b7f9d609bf7020a6136d766008c8fab7608bf259c2da25069e1e5fcbdbc1b52e0095b3ce136d7f8e844681f5f8aeb3a2b979cdc64b704a9cc0ec68bb09fa9ea22ae4ad9070152da2f305ee6dce978e638c2781db8f4ff20bf56130e8037b92f164c55eaa971c1a58966dffd66e3971afd1212bbe597f36d3be08a7045e5dfabcadd7b830cb2f55d10b83d0ffbc5492cf05d33b1046cfb92a4dfa8ab719548bdd98243ca15ca2e3d5cd956bee98bc0608250c583488f7c1d4ac7abae43b1c49452c352d168ec94b570ca465a358d7c145a6f9d03a2cbb1d4be9c506abced9493cdb4a087de79616bc7ffa74f5a6699bfa83500ccebdb2619a0b485c6ca8a77d0dba45a20d92d44f5f3c0638f6acb457238e0860aa33db923237fcbc91551a44ee71197ed3427faaa51e4ca48a8bf2144e81b5bd97cbfef5093ef204c5945067b7223fcaabf51ee170cdf7c9f2d2f3988341054856703e0f78cc0d3cb264d47d507e1b7c28e1674cd0099a40b73e14c42ad3ca3683fbd13e155d446be2ac05a826cb194d4d564a49064bb1e4d11ed77598c5bcd189755384c94c2ca2002445570245ffda888c0ae1b22feb1c474f79faeb73921590ce1c82c442f11baedef2fe59e4006f6637e046cfc24475b53d0742570abdab779e60a7bade19f01b57bd3e82fd15542b051085e78c323935c6eacd9f18f3a9724ca686b525b189497d1e43df902b4040f63e18d19b8134a32b14685f4b99fef0b98df8d01965a996282a84ea5f27ffb828c899bebbba32827a41caa763beba7aa9237f7e8ccbdbd0bc6ff250c40f7e573c34dc7cf4f8caf53a2ec1c3c3fe5d7233177ba3a25df5b903151381721e7d7fb9cfadb2de316eec54854d971f0230dc2f388d6871985770c0c7b1de30c1fc69fdb88fbdd1df6d5d44278a8f9c3df86dced494dab31c71bdde66a21e6d9ef62962384969d02a578d61ff8717d1a73417a4526f4fb2c90428ace62f17dc84f8438f66f97d1cede7855f7a3d3d9d0383266a1036e1ef1cfb3ebb654f731acab25c922687a239c5759c3d09d457a0bfcb872106427fa5bbc0f1b9f031f97970f05812aafe998d30b7cb6c5704170267a8647b4a4565dc4396a9580c1035bc71cb2ba0569388b69ffa3ae11dd3722d922cbdc318b2f39676a5df27f7066497779059cd997395102c7a29b54a5d2fb2641e0ff8537259e6aabfb5a8c68e1472c2d8b9c72c23a0841f360e8590ad968ce3d0ff99902e20f28eb3c3edba19efa9ac46e630e99b7b54f29366a3cdaa6964608c6cbfb12166656488772b20b64b6ccb6e46b9083adcc850b5bc3c7935500434e75e95313ee15a24650da33e9e3ebaecf8669289c564eb424cc423e894625a11de6094fbb29a59785c9169e2f9a143002c4fb809fc5bfef8ffd9c26a2315f79f6a0b0af1f89d77f114c4c50cb5e02a77692542688dce8c4a39bfb9692623380de001e9751352e2a896d312494adbbf7c8a505145f41c49957077f6452c93b9068ac446430c527399a318995a62cad56d4e2af5cb0579f6d45fa9d56b0d9b43856aea9d394be825a6e182e71e4cfc7a537f86806f6e771cab58de282f12290807460eacc1358e67694e00afc7b93e67d7faf90cd050721302a35fa169c17e1982130c7112a5f3e024bd2ebcd4329ce54f0eb97eab59c5e1599ffb1b61c4f60903f2c8aeba51e5b09fe1c1e8e2306cc11c409fa02f65a90d33383ba70ba0256cac802303e95ba3401bd4667f5461651738d164e890d2b23972e14b675f7c209638a55eacaba3d1874eed6a0605a502a49880fe9cfcf5b0ea99bb731916071a3bed26a4a4309368c8dc9dd23e85c23de846f451b89ba1a7ab5d4e1aa8461775aa4cdddaebc31123860d402332e14fcd415fd139e8cb3be5371bdb79b3bf10f691319b320d28f189de215290ba53617acfc4b1122c8bb5f538b3a24a007b6b6a00c75ebc8aded4d2f874ab909b34ba40a662fa90219c447d85a7 -Verify = OK - -# Same as the previous test case, but the last bit is flipped. -Hash = SHA256 -P = "256blockboundarytest" -S = "salt" -c = 8 -DK = eb64bac8e24ae1b54266d757f0fabbc72a57f5dc5d03b8c39e65f2062939bc594d82acdd144120b322ca12fba07e113ea83b1ed2c1b33603d72c67c6ef31ddcf6a9547b5fab0655bf5a7c220a307a21491932dbbffb54f99ac997ec6bf898ff9005a88c72c7ee49126397f368f704e779dc25687af9b419b6ba8cc4e177f805f55242b627e980c0898a1ea46ba633e6c0db0a14f7fb323d26bed1a524387041f8c5f6e9edd0a4ea51e0fbae1b04b009d41049eeccbfa45702716fb57b9f4167082368a36f55e7aac656b3677595868415e9e57e7a5cafdf60eb7a8d66098f0be8f012caf9a78cf2f5c0b4d153f9fd067d781f39b9acd730b6fdc9d27f93946c0e0b184d86f7eaced5a8b734f5beab2b930789c18934296c6c86e28845607e9f6d1035c30a7ef5003b19336a56aea507e3c58360f091e70ff59c5869a9e0bd14d2dca4d0a144bcb607bdf583ef4230edaad75e4db16a8275eb74c4a4cf6163e6aa293ebd6ea10b5be8179693687c2cf9ff038ded9a5a32917bbd2c4a703b0500ee0a0373bb324b409358bbc30bedbb405875eb281e9a7dd58b89ca12a9dc8505c524a2d10cfe120250bd22b9b340a29256b58548dee0da72a16084a130fe6d734bb70811e855d20b85d85f662c9574be68238a88165c22194e4942cab792184050abb3a7e22fec3f58537af84ebfa8d858dc879115b2e71c34aad0f6591c64e11e2ff8218c6841ec9b81dd9affc3ea70cdeb09423e712251f4022fbc4d54e0c5d174e198ddd9c6c8587d0c8f3bdbec79b10d46fda6e354c0a8b3b59ba82dfa164369f3075d1ad93c69a716ba8a377c626b9f44e9591c530e72a65abddb15e3766ecd068fcfe046efb86bbc00bfc24fa50fa6ffdf1f84e6e0c0d335c00637f14414a7369f5d2288bc04f284c0730766b3f9fe8464559b61c2f3f4d6e08b1cbf578f186605601533860d5f69aad06dc993d4f0ad7142249f68e1531c60fb3791ede647dc499a6b9bdfc1efd7bc0b40b95c3caeeba615d0a9c2564151598db35a7752953a7b2a40162359b69a4cf9a591d05f38dce8968dd6b6f16f57609fde9a8af9f16ec3b8a40311aec06a5bbae97e77edf32d22772b72fd61c4bf9cf34049830270653be365cd24b46fb7894150fd9e84ae211493b4ce4a95e7d0aa1f12709ba65f7bd7d8c904a9f967ced8e30789616242f7f9054e596f610d7bed0e55c3c91546b8283d965cbc2a79d5ddc4224e1db662d97bbf35847ecca83ee9e4c23d5b30ac8e2608186930e621e8cfa316dcd02b9dc17d59bcbe7fbdfcb6ecf882ce0c122ac82dd305ee7fc08b18fd2d7f1fab397038b84f9bed0d6aff490d720764aaa32a6f5b73ec6ba2083a5fb0a9e1d97bca1038f235d7b13f1baafea051ae898a3b92dc15bc3f7fd87db77a00dbefb9601157ae806e23386f64683992de57bfa37c8e4bc72ca7894ddeb16b833619f430e7da701859608f609d93044283841154da70b62f9267e15c741d5dd0e86ef58bc3cdc4f64c8fc63b9f466cd5415dd8650f7f400cd5c53544bdfbb6fe68c239e4d8d2c07f6affd864802c495b6b4fd0f1fb968c90934f93ba25d21cd7249dc4e3ef1301746d37e67ba34a861bbfd5ae7ea9ed8d7e853855f0f7bd0314b04697980191f448d71d7aed082781b04e3c01c46cce86ee1b8807bd8cf64988370925305f59814bbcecf0e9d39a8c0daa85625ddea187d19f7e3d970b0739a56f3b5c8de17c946c5692dd0503f8b20a3fc401d6fc6990c2a42e81daa46df79727e6a5f03d5c5a616e33b077f68939df7f9ae8a09599cc3a0e0e36b23ff5df4eca1ea1c8b5223a0cf2abb96808adcdeaf68a49e767ac5f934f499b82d775e995a69cee0822d13492a3038bf78faf01d9f4d87ba1f3311c002b4e603671a2cf007352fca16c30ad307c030d70e5f9c091b2035e164dfd6b9014c9bb365a694f5198566a9d58eed322f6d71b6148c1191f9f8ed4c58c03c403fcc5a1de5ace76fa1c1a42aab81e3be73d312513f278d5de7d67e24c961d709a3bc252e11eb067ea98583543675119f21fbf264024f4d33b2f6f17e98aa06dfb409f16a8692d9c7bf0fa340b13c4826cff8b07efa5ba69defb90870b43f27b632c1b76ea7129865e18d7fc597007530852d307708b51287a85d1d6395b489156f18fcde58157f5100c7c8d595ffe37fb8c1077fa204e97a721d45be4dce7b473a5d02cc31b4346f534d52a7ae7461d12fe12fb80dd7124d95e7683d3ee6b521094c1181a4c84e0272d2e0359bf6615121838c0e7da6b344b479efe17e86b52999fc7de81852bb89e335ee54123c408d9cbca031a5b4d01cb736108f9aa1dae4775d1e970ce179c565bbde3bab82f8bd883afb25a66db21fec824db6f4a140c5008acb4cc3e518b6ca77e446cdc82b4d4d6792a9e1c8fe151e84d531d8e2d1c751967f9b3ea7a2387fe53711fc48ee7524f487a3c1af2590be648f6965869a97b88729ccc6578c3aeab055f16998c1750ee8c9358875ef48c37400d4adca39ed81a0bec5e43f4a5819dca470dc86bcbcd932c8bb4017880b3934844bb76c04e4a65285fda9fc0e4e4622b3b13f1ffbad3754fdff8a3705ad370ad089e590cc8b57c2e5618041042e808dfa003bb19d229cd60a849f345f9bf85f53496b1498caada27565312b909afef165d40d82bbe3405a404ded080ece28834129c2b199a4301d6c4ee6f0502afe3dbb3d7be80da9e6b5cb2188fbb73605b31ed4e6846e75d875ab586d995cb6e20b41765e86ece82db4ce6fc1c3e63fa9bb2d2a273e217a0235e97c7750c5a543757de8759009e243d847f79a1aaba097d540573c2fe0d9fe611fe1d30484b5ae60834206b9fb7ed8fe86813f661eeb01bb608965fd6f91501210cbd17ebe1c1f5965bde456c74b96faa771bcf293a544f862689f2972444b7ae83f536c86ff21b8d8abfe8f3274fcd5d86b3f189546f927cc92196722d2e3cf4a1cd54352ecaa4466b801217200b8b981398e08209f3d597dd4726eb8f3360e757613bfded0b02853cee281b45791d3ae996bbefca334cc35f3d0dfc6f53a3defffbbc4f620e65e916171c0511678ecc512f48a230548aa88dc3886ee91a9d6d6df6d3912fd64dfc80ecc5fa1ebd9a715ad846e0bbe41b09bd33f50fcacb1984ed5610ff1c898d9cb9e948929f3f9d26b8d48ce0014a5f7840d7e85a0f61ed764587e382cb9bb23e5476dd7904e062c66fdc62f26212f66b1f8f9fcf061a2de063a6e510680d7689c05740cb62ac66b97f4060a491aeca2f485d1c1575d85f495bec1619acd001547b05d2e55c661019f67fe2525730e535a235b4e5d1126a66f27c4a9ed3bdba43b94b4bca662731613629dfa088f615cfd4eac538cbe8f137653a9e47a0a6f4c86937f0bcc4a287319f5bd81bb3e187ec84b248005383a955540216385a8efcaa6ea1ad487a01405a636b76c09bd76157a4358fe5326735e0d68c53792d37b26d894e5149d9afd4fe8a18aff58c94d37659cfd1fda6af60cf8dca192bab99336638a4e82ee2e1559571b22bcceb3b2c83e105c526f36abe6deb90d0aa1e8828778e98da0b3e1b24a2ab43851edc6ac887ed3878b764a5da26aafb6269ed3dce51595823ee6d7a4242498159d50417a26a2915492e265a14e9bd3a339f9aaf064da98d8888cd13cd7d13dc18a1431d3ff973c46ef0d487ab619d3cbe5d4acdc658aaea89c02a8255bbc1a824e0df48f2775355be55419edac6c9edce3eed5c2025b8734d0602583b14a573b7236f21dd8dbafa6104b2c49bd2c7179e9e934bd2ecb52b55df6e54aff822b594c8f73dfadcce73727ffc68a4512a3be2f4e28557a6e8262192dc4f83971d4a366c4476d4415b33c6448d6261e69f7563eb1e0d30490f1ef6ae44321fbb291ab2eb8a120094231ef14a4c9caf84cceda7b8f8d3488010e566b8a526fd5ddad414e9f2f14c94a4fb48e4abbf4ea866a48054ab49440fb4d83ca1312f9a3eb82580c1842e8b497e9303bd4b0bce65c63977f3d8dca4b6d55c3b7d67cb4e28f37b469523d3fc1640dead462618806062a703127fdad1fde5e5f5d364c12ada00e306e9592b7f54f9c0e69a32985403f2ee4d33cc37c8709ae05e02f36bcf8d2b92c89a5b29c70fabec2c840dbd5f5adb63434a059c847b163bd79827d1f9af7b47f89f845f31a5d5a6a2f8eca15fb9874d5b6e14d91832d4004cdd59a26c75767d482f565126fb710347930360df8febc3e3566aff94c795d8e7d22e99eb0f8b9696d88ad95b53b74df9b181c5d35103dde3de068141c7d0fa89da6d92cb90012ab815efd7c8481be262987c4dc8db2bb851813988f1ad197f8e5e2c4222c1f0ba0220c5ca2b9abb21ecc4dd0dc21341870f3bcc5597dd6ecb7a7a003434d5cb8f97ebf2c026176e5b3fd14b4eee95c036062a92d19220a341fe0dd73facee271e474d2e43354a03a97ee2096da987e52023f573a703bfef64935e2f5ee5cb692cba060436fe703e0af1abfb19cd85ed8571b051696ff9698368fbcc7695407a479e859b8857520a17f702b45e88440d385ff7dbebfae69e2223e068c87c584041fa7896e864d4c793f3aa3097b3be2c267f73d15c8a37b19fcd658640aed95d1682abdb4933d38c4fd8f057b28a3d31a1c4efab41378cbcf0a08762e27d82979d6b9e6ba717f8e67f6c7e9924a021feea2023b0e8c77a782634d441d8def322151b8415ecda2fb3be81619dabca2e12404d309436b9820cd6a8c186669c678ecfb9591b5fa7651f21fe4efbf4953a5b718618896677fab8762c630a4ef7d37859c89a1395fb926af55bd58b561283e69fcddcb57d3d757005750cfa0aca71f08b44be90725f3670b845298ed96b8584e5615cfc79e6ca295abc9641fca7039253bd4b1b677e230251bf4e6a23465ff595ca740801962f124d6cb658aadbc4e4bd3323f251ac4347f5a71300e2a814cfeb0d52e26f5de00fa5e20cb88490273ade48623afefdd0d8311cc254cb76bff3ce1f6464bff0c610bbe76d96ca96b72d1046b3982fc81f8a0335a448ff423c3932cac3b6b52e3eca4779cdda85838b9f5737eb1ac0ea7e8d788882b18c2fa2753bab41046a5719d14fad1b892258f6a680779546797c7e93d00d3cbafbf8360888233686ab3e60bb556479c9022279435602ce0454c9db189a835eba32b7ec9a722fcb83120f7614939a211d6c7f43c25c5a61abb55ee37999a382139f0e373e6aaa4ee45f095f50de6f636b100452d20be72362fd52bb62bae54c9c4d333efae647e85f21057706a862d6e6a3215181fb42168d4db56fd4d55da007798099e7a5229bb0a50e2f0a6a91f9182d86afaa1317ba0e17b4446f3a64cd44e7904e70dde3faced7a78baadb1d410a63faac63f107b6ca692a6b568bb5bf49b7d8249466c338f1004f0029280ae1d20fc31f0baf884ac6faf8806934391be9fc7f2ea67bf1a69cefd92d2571b7ecba0e8629ffa5eb39a7f3b896a5f201ed6e87112fe710d9a82983f899fd7222e737c8ac2831c002800321cae79702b5e010c4a2e117bc316da9056474d587919cf8c1e1e64731b649968810858dd108ca918e9439945e7ca73497776e1fa8428c92ca4766a9d91660e3b88f890460bfff3086cfe4bb9de117790080299f6f88c0ab0fe080626f1765906c150a1758b14ee5ad28d630f7167d5f14a0ed1c7014b6faf32c482c0c44463712b8dcbdadd5e1e14102faf80c4a5580172249956419cab486a37db73bbb0e5ae322ced6c1f1d5b44ccec14387a1f4e7becf5680ed63e1355c2c895f9eef74c9f8dc6de7051f2e06b555edc92764246390080dc084383d9f52afb23191dd1aa1ce5787dcdd3619c06e00a1506e41a0ddcdd98572dc830797d0ab691c96da19fa7cb5eb415f86fd560b3ea8afb19ec30ad89deb484ef8917b7b36652aefdd18629147bd654be1d444b61a1ef78f833b6beb5169237da428fe1a3322e815e5429e15dd79a09475bd852ed75f4d686ca6fd9ae9b8c9bb592f89382c490d4eb9e29be291e733d85b0dc8a3c7b33f8bb141a3072d8f76b81bdb93fd04a901978f2378512e2b56bef1faae0645cc25ae33a69465161b766f7b8e6db360cfd89b0c6df0922111dc8488e1e871c91c4e660175556d9d3a373fe32677c75d8abd10abaca367c4c2bde573b26b9a667586868a4ed2c11212afc8538577bde92e0c7521f4385ae4ec910b3d46ffa91228b20188e173154c5b3302735c15539c1b1b8999547cfaa76406c18566c9fc26eea88332e8355c18c19464f2f9715640825ccf2081058229265f599b0871c18088a4c69766e65e3cdcae800466045c8eeb46baa6b254abaeb9881581ead324038ec55d341088b0cffaa3dbe62595cc5d70fdf8fda6f0dd704f91c3918ae0e55d0c9bacb00fbd25ae50bf9ae6e2c6b39a7f0eb83e7e65ff71c03fadd5cf0f019afff1d13af69ca52a135e48252997b305d471a81345673f153c25e72a0d5ef5bb432b11f5fa6d655544a6f09be377c0d9a02ed88d6b1aab40545df0392d3c184df739d86d003d0dafb816a6c1d59f54defec6481e875c33a3a620b7ca09207727e7c4458c86f4eefdf1f98b25cbc22d0b9126ac328e52695df3c053b361dad8266ee10444c53545481344fce9a3e6e7265d4f5ab0bf2931029e90741b3e06c95b2ca4b286460695b654cbd0f860fac5f9691d3e7c9440b11210733c8cd6fd1509000d9b96790c3996e4214774419ee338b6d657220aec02a92a4244520124bcf4aab91fea08a8f5a448a6b020098f3eb8be280765159d492607061d1507e7ca1d086406d363deffa149784db21eeae341cef225b79ac9f509f6b3234161d71443c3802f612ffb95a744d9af753714a57fe7dd6832ddfa7d817872a8b21959c1da51e0264d6ab6dfebc532445b485bc9256bb941b8ae2f68f2698804ce8b454f856bfbf68cb87cf47efe5b305bbbd05b35cfff4926e2f29cd2fc5dc79e19623745900a0f381437e5359dc728b3d5a7159abe4395282744d57cd7dba2c9c3dc92a1cc245a18ccc6aee7371c99bde2777619030918875759fa9e3e9d39695544ab43bcdd407d00e818d53c7d6476c4fde7106c6568a6e098f50f27b91a0b7511beaaba617080a8cc252ad6df2dfe36bcfdd4e48dfc985df72424323e0e733b94778fe93a793e7608190d0d3ee0fd70b26adc9ce5110ee579b35a3e9dd0634d532e9131ca7b81f75d0c4f6018449f9e831dbfabe13b8b95562c3f16ff6c767c7db568782027745668bcb1f68e5b2d5f57067e62bce76aa07d7abddeeb4f3d844f0289e16a433f72d979916d44d5dd7917dfc8c79ffbedf4829e5c941d4f094433371a1661b967d62eaf34c11edafadb61cb7cad97221b1def5f757b520d232e8a87eabae2b9c98595b7710861541bc03206bd37b20eafd66a7ec9a8a1acf530de3ad02a11b5c168a06f7238a31185f04548ce2ccfba960b86106c04d441333c2f0a9b1a034fedc3d525b28971ade46af0a612faf10ee0a4ebf72f4cbc3df046f354f7289eb93fcd4a7adb84c1e3d17bdcb2a52bcde29b6056cf73e919e4b09ec0cdea6d4c2ad316d8635aab2ae27a5e6709b0397c9e4f14750ed01f01f1042b8cf5bac1a7f71b937f17bbadefb939461d3109836653e57eaa4b444f501800f399adff23a8a0c571161c9ef952337fdc6f6816125c8223eedfad059d33d6b61f3a976e7cd08abfa46b462083747e8ae250482d0a196ca2a9e3e5abf1541f14aa94faacf1a1c3cc95281774c587fc085bbeccba8565c966941841c0cf05eb2b3dac6e2e340c8f5d658d20d6d4ba6380358d52491609a035774cd5a60c7049afa43dd797db51028b60c550d855c18e1fa80d9da21453e6e7973ff2dbd40ac828ff4e2026dcfc6d1d0b5d8c82a2aa77fccd6d29e218e0524acd9d28f0a1d3073292f4e487af8dffc6dcd1fa20a2918820324e201ac81cda06f52dbbfae9635468f587f7fc2d36dce0891986006a3da26f7db6cf29af463ebd54c05c917ac1e8dcdf5e1a05eb78a56e231b65aacd9784c10deed1668bd293d38b5916ee3f5dfdb1d20f72f138c56cd9e5fb65652b7da41e9c1370ce9abdcbc5c75f41f1a1ddf78392c3af22f29d470d3ff0a3e933ae734c6192f0a9923fc19923253b8ef43e02fc445d2968f5162e56709fd687fdfeee4be2b5362af6d780b025959763bc37dce741909a6ad557e4278ab8656661659e16379df6f6929f4bc0c439d91b320b5fd6ab32369bdb981bad524f305079196b9b9035cae7c818050c68ba6123e5e8a24978d16983753ee1066bd96368467cf26d63107769618946068689bb163e406a7aeded78afda092b3f13ed0a607c8941371579e43bc6913fdb8ff5ef4041778cc52990da86b38fcc99a1e7c2a04cd243f2ecbb8fe2874916741ccd6af8de7aef7aaa8f57a851fc3fca5c6132e3f980417f15c55bb80a429746028f028e1c09057ac370964aedfd0784f8caf4f378c2d7a8adb4124540535dd823968ab6707aa4ae062fff41361cb1b8f23805c262a25c81f4649a8dde4295e8f6649640d6a033da3a5814e47933f56052a19c27add21b009bf4d371972c72138f13511cc3ce647ab9736fe8542557c159b9f8c67db4a99aa9b3de34460ae922cb4e9ca58252dd945f82c5ff382e1c708883793a123d018039b144f7d7da1a86f7af1bfc6eb4bc8c889c2f87dd0bc17b276e1f6d32dd06b87b348c78bcea20e866c42c6984454101d93f1d41378a1664b3f48fc124a385641118e8fad1d5dcbf182b92e4ec0d37fd16cf6f6d77f288be41e90a18c1f284c5fff61cd315097628c894b14284ee5953cb205909648fcf9665cd406cfbae9976f010bc1eaeb6fe62b9eeb3df7522ce31753eac60ea0bd533477fe54052f2af96798cdfa24c801cf2bff25715f52da9e467b59309701ba129b7454c592cbb931b6944d423dac07b41341047e3d7614592945ddf48bf5207deb2bfc59e41514d775e974d86704cfe61c9ba73d279f18f4107c662d49c602f1c041e1d32de6b742bdcb4250273f41a9b304e6bdef2cbcc271d32071c4ab3281ee7e8abf94d128059381bcfd3b113f6dfc59a848f6f47b9a33695ce46e5956ee8d15849acd17720f28d34b7faad46d5d8d8027e76c69c425175eb564d28e748c71dfacec3baa4e8d8bc34b89b64c51ae04e5f44008bdb86149213fe4521587a8a396433f7f09ffaaa603e178131fb628e0122f5f829ce517521c8dd783d0c170f2d945ea8b7721c790b8d8320610e64fbb4ccd6a099566342b7a355ac4bfae8603f005f3ce923a7d54b99b2a4b44aa9f7db887d7bcc655dc1b23bbfec3739bd14947181577ed2561495c9f14229141e3df79ea968e05ffa191ee2d89662a792e479a5d5a7b3cc23f9fa991243caa9b5860f8913739913151ddb1242b7c61a658cfc0e28bd2a058715175046e6a341873f386d97e52f43060c13e961eb577196b4a226a1b57e90a2e6448b319726c28424c232181a1411ac1fbcf241082774e854b6ac0511658bdd679e43feedea2b7f9d609bf7020a6136d766008c8fab7608bf259c2da25069e1e5fcbdbc1b52e0095b3ce136d7f8e844681f5f8aeb3a2b979cdc64b704a9cc0ec68bb09fa9ea22ae4ad9070152da2f305ee6dce978e638c2781db8f4ff20bf56130e8037b92f164c55eaa971c1a58966dffd66e3971afd1212bbe597f36d3be08a7045e5dfabcadd7b830cb2f55d10b83d0ffbc5492cf05d33b1046cfb92a4dfa8ab719548bdd98243ca15ca2e3d5cd956bee98bc0608250c583488f7c1d4ac7abae43b1c49452c352d168ec94b570ca465a358d7c145a6f9d03a2cbb1d4be9c506abced9493cdb4a087de79616bc7ffa74f5a6699bfa83500ccebdb2619a0b485c6ca8a77d0dba45a20d92d44f5f3c0638f6acb457238e0860aa33db923237fcbc91551a44ee71197ed3427faaa51e4ca48a8bf2144e81b5bd97cbfef5093ef204c5945067b7223fcaabf51ee170cdf7c9f2d2f3988341054856703e0f78cc0d3cb264d47d507e1b7c28e1674cd0099a40b73e14c42ad3ca3683fbd13e155d446be2ac05a826cb194d4d564a49064bb1e4d11ed77598c5bcd189755384c94c2ca2002445570245ffda888c0ae1b22feb1c474f79faeb73921590ce1c82c442f11baedef2fe59e4006f6637e046cfc24475b53d0742570abdab779e60a7bade19f01b57bd3e82fd15542b051085e78c323935c6eacd9f18f3a9724ca686b525b189497d1e43df902b4040f63e18d19b8134a32b14685f4b99fef0b98df8d01965a996282a84ea5f27ffb828c899bebbba32827a41caa763beba7aa9237f7e8ccbdbd0bc6ff250c40f7e573c34dc7cf4f8caf53a2ec1c3c3fe5d7233177ba3a25df5b903151381721e7d7fb9cfadb2de316eec54854d971f0230dc2f388d6871985770c0c7b1de30c1fc69fdb88fbdd1df6d5d44278a8f9c3df86dced494dab31c71bdde66a21e6d9ef62962384969d02a578d61ff8717d1a73417a4526f4fb2c90428ace62f17dc84f8438f66f97d1cede7855f7a3d3d9d0383266a1036e1ef1cfb3ebb654f731acab25c922687a239c5759c3d09d457a0bfcb872106427fa5bbc0f1b9f031f97970f05812aafe998d30b7cb6c5704170267a8647b4a4565dc4396a9580c1035bc71cb2ba0569388b69ffa3ae11dd3722d922cbdc318b2f39676a5df27f7066497779059cd997395102c7a29b54a5d2fb2641e0ff8537259e6aabfb5a8c68e1472c2d8b9c72c23a0841f360e8590ad968ce3d0ff99902e20f28eb3c3edba19efa9ac46e630e99b7b54f29366a3cdaa6964608c6cbfb12166656488772b20b64b6ccb6e46b9083adcc850b5bc3c7935500434e75e95313ee15a24650da33e9e3ebaecf8669289c564eb424cc423e894625a11de6094fbb29a59785c9169e2f9a143002c4fb809fc5bfef8ffd9c26a2315f79f6a0b0af1f89d77f114c4c50cb5e02a77692542688dce8c4a39bfb9692623380de001e9751352e2a896d312494adbbf7c8a505145f41c49957077f6452c93b9068ac446430c527399a318995a62cad56d4e2af5cb0579f6d45fa9d56b0d9b43856aea9d394be825a6e182e71e4cfc7a537f86806f6e771cab58de282f12290807460eacc1358e67694e00afc7b93e67d7faf90cd050721302a35fa169c17e1982130c7112a5f3e024bd2ebcd4329ce54f0eb97eab59c5e1599ffb1b61c4f60903f2c8aeba51e5b09fe1c1e8e2306cc11c409fa02f65a90d33383ba70ba0256cac802303e95ba3401bd4667f5461651738d164e890d2b23972e14b675f7c209638a55eacaba3d1874eed6a0605a502a49880fe9cfcf5b0ea99bb731916071a3bed26a4a4309368c8dc9dd23e85c23de846f451b89ba1a7ab5d4e1aa8461775aa4cdddaebc31123860d402332e14fcd415fd139e8cb3be5371bdb79b3bf10f691319b320d28f189de215290ba53617acfc4b1122c8bb5f538b3a24a007b6b6a00c75ebc8aded4d2f874ab909b34ba40a662fa90219c447d85a6 -Verify = Err - -Hash = SHA256 -P = "EmptyDKTest" -S = "salt" -c = 8 -DK = "" -Verify = Err - -# PBKDF2 test vectors from RFC 7914 - -Hash = SHA256 -P = "passwd" -S = "salt" -c = 1 -DK = 55ac046e56e3089fec1691c22544b605f94185216dde0465e68b9d57c20dacbc49ca9cccf179b645991664b39d77ef317c71b845b1e30bd509112041d3a19783 -Verify = OK - -Hash = SHA256 -P = "Password" -S = "NaCl" -c = 80000 -DK = 4ddcd8f60b98be21830cee5ef22701f9641a4418d04c0414aeff08876b34ab56a1d425a1225833549adb841b51c9b3176a272bdebba1d078478f62b397f33c8d -Verify = OK diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/tests/quic_aes_128_tests.txt temporalio-1.3.0/vendor/ring-0.16.20/tests/quic_aes_128_tests.txt --- temporalio-1.3.0/vendor/ring-0.16.20/tests/quic_aes_128_tests.txt 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/tests/quic_aes_128_tests.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ -KEY = e8904ecc2e37a6e4cc02271e319c804b -SAMPLE = 13484ec85dc4d36349697c7d4ea1a159 -MASK = 67387ebf3a diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/tests/quic_aes_256_tests.txt temporalio-1.3.0/vendor/ring-0.16.20/tests/quic_aes_256_tests.txt --- temporalio-1.3.0/vendor/ring-0.16.20/tests/quic_aes_256_tests.txt 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/tests/quic_aes_256_tests.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ -KEY = 85af7213814aec7b92ace6284a906643912ec8853d00d158a927b8697c7ff585 -SAMPLE = 82a0db90f4cee12fa4afeddb74396cf6 -MASK = 670897adf5 diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/tests/quic_chacha20_tests.txt temporalio-1.3.0/vendor/ring-0.16.20/tests/quic_chacha20_tests.txt --- temporalio-1.3.0/vendor/ring-0.16.20/tests/quic_chacha20_tests.txt 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/tests/quic_chacha20_tests.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ -KEY = 59bdff7a5bcdaacf319d99646c6273ad96687d2c74ace678f15a1c710675bb23 -SAMPLE = 215a7c1688b4ab7d830dcd052aef9f3c -MASK = 6409a6196d diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/tests/quic_tests.rs temporalio-1.3.0/vendor/ring-0.16.20/tests/quic_tests.rs --- temporalio-1.3.0/vendor/ring-0.16.20/tests/quic_tests.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/tests/quic_tests.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,70 +0,0 @@ -// Copyright 2018 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -use ring::{aead::quic, test, test_file}; - -#[test] -fn quic_aes_128() { - test_quic(&quic::AES_128, test_file!("quic_aes_128_tests.txt")); -} - -#[test] -fn quic_aes_256() { - test_quic(&quic::AES_256, test_file!("quic_aes_256_tests.txt")); -} - -#[test] -fn quic_chacha20() { - test_quic(&quic::CHACHA20, test_file!("quic_chacha20_tests.txt")); -} - -fn test_quic(alg: &'static quic::Algorithm, test_file: test::File) { - test_sample_len(alg); - - test::run(test_file, |section, test_case| { - assert_eq!(section, ""); - let key_bytes = test_case.consume_bytes("KEY"); - let sample = test_case.consume_bytes("SAMPLE"); - let mask = test_case.consume_bytes("MASK"); - - let key = quic::HeaderProtectionKey::new(alg, &key_bytes)?; - - assert_eq!(mask.as_ref(), key.new_mask(&sample)?); - - Ok(()) - }); -} - -#[allow(clippy::range_plus_one)] -fn test_sample_len(alg: &'static quic::Algorithm) { - let key_len = alg.key_len(); - let key_data = vec![0u8; key_len]; - - let key = quic::HeaderProtectionKey::new(alg, &key_data).unwrap(); - - let sample_len = 16; - let sample_data = vec![0u8; sample_len + 2]; - - // Sample is the right size. - assert!(key.new_mask(&sample_data[..sample_len]).is_ok()); - - // Sample is one byte too small. - assert!(key.new_mask(&sample_data[..(sample_len - 1)]).is_err()); - - // Sample is one byte too big. - assert!(key.new_mask(&sample_data[..(sample_len + 1)]).is_err()); - - // Sample is empty. - assert!(key.new_mask(&[]).is_err()); -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/tests/rand_tests.rs temporalio-1.3.0/vendor/ring-0.16.20/tests/rand_tests.rs --- temporalio-1.3.0/vendor/ring-0.16.20/tests/rand_tests.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/tests/rand_tests.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,80 +0,0 @@ -// Copyright 2015-2019 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -use ring::{ - rand::{self, SecureRandom as _}, - test, -}; - -#[cfg(target_arch = "wasm32")] -use wasm_bindgen_test::{wasm_bindgen_test, wasm_bindgen_test_configure}; - -#[cfg(target_arch = "wasm32")] -wasm_bindgen_test_configure!(run_in_browser); - -#[test] -#[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -fn test_system_random_lengths() { - const LINUX_LIMIT: usize = 256; - const WEB_LIMIT: usize = 65536; - - // Test that `fill` succeeds for various interesting lengths. `256` and - // multiples thereof are interesting because that's an edge case for - // `getrandom` on Linux. - let lengths = [ - 0, - 1, - 2, - 3, - 96, - LINUX_LIMIT - 1, - LINUX_LIMIT, - LINUX_LIMIT + 1, - LINUX_LIMIT * 2, - 511, - 512, - 513, - 4096, - WEB_LIMIT - 1, - WEB_LIMIT, - WEB_LIMIT + 1, - WEB_LIMIT * 2, - ]; - - for len in lengths.iter() { - let mut buf = vec![0; *len]; - - let rng = rand::SystemRandom::new(); - assert!(rng.fill(&mut buf).is_ok()); - - // If `len` < 96 then there's a big chance of false positives, but - // otherwise the likelihood of a false positive is so too low to - // worry about. - if *len >= 96 { - assert!(buf.iter().any(|x| *x != 0)); - } - } -} - -#[test] -#[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -fn test_system_random_traits() { - test::compile_time_assert_clone::(); - test::compile_time_assert_send::(); - - assert_eq!( - "SystemRandom(())", - format!("{:?}", rand::SystemRandom::new()) - ); -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/tests/rsa_from_pkcs8_tests.txt temporalio-1.3.0/vendor/ring-0.16.20/tests/rsa_from_pkcs8_tests.txt --- temporalio-1.3.0/vendor/ring-0.16.20/tests/rsa_from_pkcs8_tests.txt 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/tests/rsa_from_pkcs8_tests.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,81 +0,0 @@ -# RSA 2048-bit key with e == 65537. -Input = 308204bd020100300d06092a864886f70d0101010500048204a7308204a30201000282010100b9d7af84fa4184a5f22037ec8aff2db5f78bd8c21e714e579ae57c6398c4950f3a694b17bfccf488766159aec5bb7c2c43d59c798cbd45a09c9c86933f126879ee7eadcd404f61ecfc425197cab03946ba381a49ef3b4d0f60b17f8a747cde56a834a7f6008f35ffb2f60a54ceda1974ff2a9963aba7f80d4e2916a93d8c74bb1ba5f3b189a4e8f0377bd3e94b5cc3f9c53cb8c8c7c0af394818755e968b7a76d9cada8da7af5fbe25da2a09737d5e4e4d7092aa16a0718d7322ce8aca767015128d6d35775ea9cb8bb1ac6512e1b787d34015221be780a37b1d69bc3708bfd8832591be6095a768f0fd3b3457927e6ae3641d55799a29a0a269cb4a693bc14b0203010001028201001c5fb7e69fa6dd2fd0f5e653f12ce0b7c5a1ce6864e97bc2985dad4e2f86e4133d21d25b3fe774f658cca83aace9e11d8905d62c20b6cd28a680a77357cfe1afac201f3d1532898afb40cce0560bedd2c49fc833bd98da3d1cd03cded0c637d4173e62de865b572d410f9ba83324cd7a3573359428232f1628f6d104e9e6c5f380898b5570201cf11eb5f7e0c4933139c7e7fba67582287ffb81b84fa81e9a2d9739815a25790c06ead7abcf286bd43c6e3d009d01f15fca3d720bbea48b0c8ccf8764f3c822e61159d8efcbff38c794f8afe040b45df14c976a91b1b6d886a55b8e68969bcb30c7197920d97d7721d78d954d89ffecbcc93c6ee82a86fe754102818100eba1cbe453f5cb2fb7eabc12d697267d25785a8f7b43cc2cb14555d3618c63929b19839dcd4212397ecda8ad872f97ede6ac95ebda7322bbc9409bac2b24ae56ad62202800c670365ae28671195fe934978a5987bee2fcea06561b782630b066b0a35c3f559a281f0f729fc282ef8ebdbb065d60000223da6edb732fa32d82bb02818100c9e81e353315fd88eff53763ed7b3859f419a0a158f5155851ce0fe6e43188e44fb43dd25bcdb7f3839fe84a5db88c6525e5bcbae513bae5ff54398106bd8ae4d241c082f8a64a9089531f7b57b09af52042efa097140702dda55a2141c174dd7a324761267728a6cc4ce386c034393d855ebe985c4e5f2aec2bd3f2e2123ab1028180566889dd9c50798771397a68aa1ad9b970e136cc811676ac3901c51c741c48737dbf187de8c47eec68acc05b8a4490c164230c0366a36c2c52fc075a56a3e7eecf3c39b091c0336c2b5e00913f0de5f62c5046ceb9d88188cc740d34bd44839bd4d0c346527cea93a15596727d139e53c35eed25043bc4ac18950f237c02777b0281800f9dd98049e44088efee6a8b5b19f5c0d765880c12c25a154bb6817a5d5a0b798544aea76f9c58c707fe3d4c4b3573fe7ad0eb291580d22ae9f5ccc0d311a40590d1af1f3236427c2d72f57367d3ec185b9771cb5d041a8ab93409e59a9d68f99c72f91c658a3fe5aed59f9f938c368530a4a45f4a7c7155f3906c4354030ef102818100c89e0ba805c970abd84a70770d8fc57bfaa34748a58b77fcddaf0ca285db91953ef5728c1be7470da5540df6af56bb04c0f5ec500f83b08057664cb1551e1e29c58d8b1e9d70e23ed57fdf9936c591a83c1dc954f6654d4a245b6d8676d045c2089ffce537d234fc88e98d92afa92926c75b286e8fee70e273d762bbe63cd63b - -# The same key as above, with the last byte removed. -Input = 308204bd020100300d06092a864886f70d0101010500048204a7308204a30201000282010100b9d7af84fa4184a5f22037ec8aff2db5f78bd8c21e714e579ae57c6398c4950f3a694b17bfccf488766159aec5bb7c2c43d59c798cbd45a09c9c86933f126879ee7eadcd404f61ecfc425197cab03946ba381a49ef3b4d0f60b17f8a747cde56a834a7f6008f35ffb2f60a54ceda1974ff2a9963aba7f80d4e2916a93d8c74bb1ba5f3b189a4e8f0377bd3e94b5cc3f9c53cb8c8c7c0af394818755e968b7a76d9cada8da7af5fbe25da2a09737d5e4e4d7092aa16a0718d7322ce8aca767015128d6d35775ea9cb8bb1ac6512e1b787d34015221be780a37b1d69bc3708bfd8832591be6095a768f0fd3b3457927e6ae3641d55799a29a0a269cb4a693bc14b0203010001028201001c5fb7e69fa6dd2fd0f5e653f12ce0b7c5a1ce6864e97bc2985dad4e2f86e4133d21d25b3fe774f658cca83aace9e11d8905d62c20b6cd28a680a77357cfe1afac201f3d1532898afb40cce0560bedd2c49fc833bd98da3d1cd03cded0c637d4173e62de865b572d410f9ba83324cd7a3573359428232f1628f6d104e9e6c5f380898b5570201cf11eb5f7e0c4933139c7e7fba67582287ffb81b84fa81e9a2d9739815a25790c06ead7abcf286bd43c6e3d009d01f15fca3d720bbea48b0c8ccf8764f3c822e61159d8efcbff38c794f8afe040b45df14c976a91b1b6d886a55b8e68969bcb30c7197920d97d7721d78d954d89ffecbcc93c6ee82a86fe754102818100eba1cbe453f5cb2fb7eabc12d697267d25785a8f7b43cc2cb14555d3618c63929b19839dcd4212397ecda8ad872f97ede6ac95ebda7322bbc9409bac2b24ae56ad62202800c670365ae28671195fe934978a5987bee2fcea06561b782630b066b0a35c3f559a281f0f729fc282ef8ebdbb065d60000223da6edb732fa32d82bb02818100c9e81e353315fd88eff53763ed7b3859f419a0a158f5155851ce0fe6e43188e44fb43dd25bcdb7f3839fe84a5db88c6525e5bcbae513bae5ff54398106bd8ae4d241c082f8a64a9089531f7b57b09af52042efa097140702dda55a2141c174dd7a324761267728a6cc4ce386c034393d855ebe985c4e5f2aec2bd3f2e2123ab1028180566889dd9c50798771397a68aa1ad9b970e136cc811676ac3901c51c741c48737dbf187de8c47eec68acc05b8a4490c164230c0366a36c2c52fc075a56a3e7eecf3c39b091c0336c2b5e00913f0de5f62c5046ceb9d88188cc740d34bd44839bd4d0c346527cea93a15596727d139e53c35eed25043bc4ac18950f237c02777b0281800f9dd98049e44088efee6a8b5b19f5c0d765880c12c25a154bb6817a5d5a0b798544aea76f9c58c707fe3d4c4b3573fe7ad0eb291580d22ae9f5ccc0d311a40590d1af1f3236427c2d72f57367d3ec185b9771cb5d041a8ab93409e59a9d68f99c72f91c658a3fe5aed59f9f938c368530a4a45f4a7c7155f3906c4354030ef102818100c89e0ba805c970abd84a70770d8fc57bfaa34748a58b77fcddaf0ca285db91953ef5728c1be7470da5540df6af56bb04c0f5ec500f83b08057664cb1551e1e29c58d8b1e9d70e23ed57fdf9936c591a83c1dc954f6654d4a245b6d8676d045c2089ffce537d234fc88e98d92afa92926c75b286e8fee70e273d762bbe63cd6 -Error = InvalidEncoding - -# RSA 3072-bit key with e == 65537. -Input = 308206fd020100300d06092a864886f70d0101010500048206e7308206e30201000282018100ac2d26e81b524ff75bb23d79c5eef2258546a1cbc9ce00cdb453449ad3af0d38d748bab51533ff39aabe9d21a0b1113f57764a6c27d10c97212296e3033814b8b1ec1d4b8cb00a4d8174dce02a7a73149d195ef83c3ee0334a8bf94d86dc0e8ba2a5ac80343e8124ead35dda110f106436813fae364113f8136a79f7791b035549dc7f7a1492ff0cbbbae937eb7e05ed997a3023bc3622def643a13aa4b20f15b4c293ccfd64a26db61623ae4fc69bac32162953cb37c93216c009ca217bc9b4cfa463e22b9d083d1c42f321cb8c248c29090194c0e5e94957ca2a34d62bcab2a12acfbb4565bf2576583a57fd78b810a7f7c70aec118e7e9bb7fba9c80c10acb8154af0e0e21ee4e488393c9dfd977aa7c245925fb5f880bf1074d916710630362c246f0270d70cbb546bd5ef07e423c37f1f446707c4d6c3874f9c7abfe80f873884911a6a98514b34ef147b1e7ff93c9497b57c73653f391d74bce6db9699cfb3fdca698427db519f08e33b16a7105b27f1387aa9958a674d777c1403e03302030100010282018043901045627b415fea7e9dfb0bfdc0cd9267ee139ee41492a3e14cf9887997b1a76125caeb40153616d767a78b7c102d8fef9e32a4c936ac935714688e99d21fcbc9c09125eaea90116dbf42c3c87b222aa78b09d3f2445e3c318329b5f2e24e4f0bbe0e2cf21e1153888fba83992ab07866ed8b3a44fd460ab06c9dfccae9daecf9f697fc3cd692b3941bf25299884ffd3ae26b136f16edf12b06b8916a41db1dac80fd1eadffc31781c68c9f476b4cfdf68e4f105e9ab7ea0f7f87eeedb96f723e2a17e5103af96c3a508d38262577ffe3b2fb7bb4f7150cdc9dfb8d4f3d5cdf349192d1d302182df169403a066ddb28647831041d587884282392f83716b74f201d33fa5a967d5f506a93e4e9506ecf6802869ead17beff0b8903114f154fa3973067d56003409cdefa962578096d664c79d2c5df6e8dbbf67a9bf6e2c7c938608c17ae1ef6e56fce9058fb4823c5cee63e2a1c9f495dca8021fcb50cd92a35a9de5df29755b8f0d6d677d8fb8144dd106f07782e63032e6f40f3c29c0de90281c100def986933a3b7fdcb21c7096a4ef361c6631a23aacc8831f34270efd4850eac191d9284070cc910cf12864efd6d8c676491ba8f810b005dc4143e7e774d2d4fa255007ec75a98f5fc105100ed49327e90d31f01771bfe92b1f47cb36eb8c2d30067d1523980b9329e73ff7ae84a8ae11276a085a201bef0b398f934e4bdd7eba261e676a4a933a4254934f6ad8c17277a977a7782da24000eec12cf8def48d86a73ac84e9dcf5b5e8dad32ceb4d565085c2063f88df9a4b1f200375d2a58c86f0281c100c5ad84dcac6f51bfefa20c2b52611bcec8822739ff907491912b7c0d80ddcdfe1836c264969048133e76d3c4987a563a2d7d3c3b213cf47e1cd9329df1878bc4834e9742e5d0a31c663d4fa8edd8e0abad1c5fe2e6fef1f01c35b93eff619c7ae80873842daa277096dd1f3da4b4182525d06c1041a9c8627be145c3435a79dba4dfe52f63fa51486762d1b55d449fb55f07d304fcc726b9cc1e42484bc6d72704e0192f4bb7e6c6438dbd9aecf8d10626bc2ce1904f96d7594b9fc0e8231e7d0281c050a322f519a92ceb8e8a5479567aa032130f3e21441d5bb62c3137ed877aa3fb8f185ec33747f3e91f49c17f2f4ec42f40ef3ce3417db710d9958a479d6b25d4b52bc541d1a7998f4289e72dc5d8d625253d7b1baf6a7d13b843498dba0fbec3d084e9e12e7a79253d5957e4885b4c602dc5ddf1620d581cd21b4765987029057f059dd6c5d38acd3432f614a90104b99bd30700a2583c175a41085794a21290b0e7c44b122d4c58dc99d77703d4ecade24b607c22343748974156c45dad30070281c100a8d548d2c91bd2b0a1d4bf9c08a214040ad0cefc0440b6aed55454819bfcd5411e2136ea7e8600691f4292202932e38e90e79397d50da0ac4dab5c45f5d21517e4262d9edf75d0ba22c05ed7233dc6b61a06500715cfcd878c307e6545ed729eaeaaf92e7d6a04816ef8b1040f361a213028d10319720f49be106b6b188d9fe26ef12367d476291233eafcbd70497a368851c073540a2c132838f7d79390e295dade23e477413c833d9343cb9c75eee0d8188424ab02af0c82a1ca7212525c690281c012315e04ad315f39c8c0657c93ed32ec2501c9cf2b3c3f6c07fc78ad95d9c5827201ef95d7f549ddba41a75ed1b2a5261037490d235c4f097a123dd454da7f2954a1ea4e612662e5086d6e532adef15506b2adf1aeb5237257df7193d85e2a4d61bbef24122deee62b41b73cf277486da9dee39311904e49fcf7e5cf7c1ba5da0b8e25853da1389b79753a894643ff8299d1c599130c9d0f25db07eafde4a1ee1e66f839c3b775000a5d8576f3b158d2cfe8cbec94376cb81d54c6066a4fc97f - -# RSA 2048-bit key with e == 65537 and p < q. -Input = 308204bd020100300d06092a864886f70d0101010500048204a7308204a30201000282010100a0afb85b74105f49f6836183d67b92602b53ad0d7a65f32a21d8959b8722aae1ec000cb9f22de09b794d7446e04be02a782615a659ceddb5f3344b6e566970718124dc8b8bf23c5aaa7447b7f11905f828e91f1a844d535624b987704ecca430d04cfee0deef46e7e2da65a3f2a1b3aae6cdf96795d24073a07312867aeb414e0bd6c23d80bd9ce6266fd90dac7666b019c141e3516ed51ced0d62a0b1db189860406ec5b7bbbeb49031979dba118ef6ad131365d6bd6994e695ab084592a5d2470341e4a9da14167a1387ec3d513687b7d849d64da896d4038f72f8a8a516c6402225a53eb813c1eb0e675af8880433545a90404946d7d8db2716fdd63898650203010001028201007df2de1548f720499020d0c98ecf931f3036c938fc4c76f9fa479294b2aa98b8b6cc1f2d8cc72afb926c048d1d783bbfee2723e71d13c9b2b96baf0850511b22ccb040f25c82458e6776f7541575a0b9300ff2224dbb726bde235226d48d10d1762433cfbcce5e8c99c2c7d266f71a2605fd42d54f98da8e0720cb4f7f7f70d2668b89cb57fde159ac7922756fd161379a5693168c388b7e1468552f67f896f69740e80e13b9badee87b7116e559c1e428276cc9d4788b0ee25f10ed560daa8339aeb52d8bb2b05a2e1e16e3fb348ae5feb5dbaf53a7d8a318865e1a746374df077d85120b02e3f0ceba47cc734c96ed6dac65f11bde2db2f1ffaec0da5924c102818100c045a3996d1465c73ca839c442b1026c82e418c68a5f96b34ff36557144a86af092b8c2873c42ac08d66e2f471c4094098be48058ed2bb0ebf0beb896f0eb18eea16d475914c901e35dffbcc257f19260819213c46eac7e508aae0114b98770471949f006d42a6c2e07d590e1f5f14747239154f65155daa4bea84f5ee8d2c7102818100d5f20732ea986dd3d1245dce180595a7f48b36c58f1576f6782062a4f1790871bfb2e31b96f1b596c59b6624cc2b56c441e4970fffe70e59c0fca099b598170106a60e32725c35401271ba2216039c627b18a2e319331c1444238724ba7c80e2f35d13fc0662638b414f7c12fe66db22328fa892a4b7632ea2c24f6b06fb3535028180448f5073e0127aec5d73bb0d819e6eb7d4c0931910b45f1f576df9ffe00b67153916df26798944995e92867115b40a7c8f3aa2a1e0b8c1dcd340e3df20cbc382ab7432942d9878775d4c9e13c0771eb79201abf93b6c7294f7cf3e90cc3cf48b9018a7cdd6280320d03dc228a805165d2371b9689329d83966529cd0b91c7bf1028181009f1bbed4d3f9067ca7a63709057e69bd1db5c6c707d13bc6b2b1cb0ac5f6701c4027a694a71e1d2102d6be1111b20d762956fa2d50f0221107e01904173403afa4a52c1bc246e6e73e904b8ffbf535815bf0877b030baa8f3bd97c31096b7c62cc0065d361601c8dbcc5830d911b274ef8713439d2bbfbcbfc092c0cf9852b1d02818058e7d95fe1a95fe10f60b59eba5c8c28c8eeaa82956a3035f37e7570f5ff91a104a5df77ba13a09bedb22018e2ac7461471b5e719ab202032cb3905391b7d15c74b36aff25c83987726e0ef1362c1b8f4f8282f2c4fd6a38a9a15e63400b92bfff31cbfc375313dc40f9cf19e031ededd32c47de6b3a99696a903638c4d6969a - -# RSA 3072-bit key with e == 65537 and p < q. -Input = 308206ff020100300d06092a864886f70d0101010500048206e9308206e50201000282018100a893194cf895bbbfa58f2863ab9bd00671cf5c48604efcb175d6f03a55d32a991c3021d52265369d45b94c4e80210a5d8d3d0738fb98669f1256d406eabafb67ad028de2e25909cd87b723a6f29eaaa46d77c74e998d3ca635ddb71335c2d77143c61d1875b0c6abe15474dd61e69fb0a5bfc381f8ffc251be4a03ff9cdebc6d890cc5d1e1b4da6115afd7d4bd9ec8b12361158eb5526cb9ccd5c1763862f65ac0cf10d7718efdbdc6f4e23325b129625d0e87a1136dc34af0f9e0e2abc7d617abbcfdb8f33d04a2cff977336df6c3956b5b667c399047d720da828370e601ca3e032a81dab5eeb9a5c37ffb4ae255fc0a3093756e9fd039faa87f2ccd396d8c44b51dec14d7a0c00e2a0735102d30ae30edf41e67af3bec5103f7ea969dc1222a0b7fdbd622788aef9fa410a9640312c33f14c322ae3b7ff2dce7c7440e9ea5f2521bfe75e206b16ea5176a7e4b9a7ba326fdc2541bc56fb6b16451a11f23f50217b61a277e3116cb65c6aa40615041e20118bd10fad88602bea3a232ca12f102030100010282018033cb3e72cfcdf1a9a88c9bb443fdd3a4a74336ef65e7deec0770cacea1a007ee932296c28d96db78e6fb4fdeaeaf7827d64571faa812e334ecc590cfaf3f540f3eb112372ba47fc68e744e97f4e39b3a7a07db4ce310ea1987635fe49f180669de90f84f939984f13a826085c496bf69df03546692c2c249ab55c274bf16107ef724dd82e6fe523a92173d113851990813feb848e89d329ac3bcc97c3146f6ba5b9343716e8aa89bae8d7f1287fa2ee4f2028cd988c6a8c255d7f0a8b46ee9f04c36250f4a66b148415c83fe991360231e8f267a9400a31111fedd19aadc93eb0b6833e556c2c91e2a69ee6ae0462eb6a146e1d30680f02bac5e2ec95879e9a42b05c790baf87e6481f0a703a4897a221f2f4604facb45948bef592d61891fe55e5c52b7a44f01a0148641dee97eeb2efd96968fd82310ea551184b4c63c48039e13bcd15abc15029d3c5bd41665895bef92e12513e06706cb03221ff5aa7f6aa64ebfcdcd6882ad2ec765731ee6452d6470a7053a276f51b7c20b7b54d8c0010281c100c9bc1dc851bcfeb8e8d33063be3d8be4d09f816c0567a06935c7b8082dd06c1f2ce9eba3fdadef1a77e087e05f76bb05d625bfc835dbc1cbf5397cdb9e5f67b23fce81bfc7b27f2cebd7db80b8a696bd57b3eae3f498a1b4782f8721c12c685b85ef648575ce81010fbd12e6bbefddc3e073ac309dec8d9671fbed47344b8ca8fb90a974fd4d306c92f2a2f8f6db36c57780faf07baf850454be836c6cca4c9e35327d84babcac06c14ea3295fbc772319d9582ea185e4a685ffdd1316bb2e810281c100d5eb7ff5b91f4068cd2739c0c5c4e609839e07b950307f55a5b5892d8ead0b3f77c8657204cc320e9b52d67af2eeec787dea098ece882abf6e93957ec1fb753f28e17de205a0e4967c7880ad9580b81a3a2315e3466f639a62162e4f0de8f009142bc19488510b2e0e2ef86f0be45f4efa51ea794fbabff294c3c40199c450221c99707026bd1de3649c10c37a4c493fab1aa9511ed64bec38a1724c8af4a9813de028dcdc0bde1639a1b6a4b9ac0480cee494a533fff8214de959a9a6bc8c710281c100c87a9b3a5d08ae3742a1c60009aa0e6159767a5ec84c405cee26495c4f734650010982b4d940c6528e79636ef64ffef280ebc8d885b59bb53e416034bd01e10282688e06f1c5109faacd3c85827b83682d454e94359a8d70d4d39ebe4bc3fefd9d6fd77cce23678e8f7e7dcf314be21e6beb685e7443063e518e643293e4d4a7864130366418169c7fb8837f598b66b5fcda0007875359a481374752341722e742c4a77a853d44d3fdbd5166a78e9af31618298b45d7d2f02e50a4f9f86812810281c100b05497bc6fa4f00db315a348607cc5f58fb542bea0f7e8ee2b52b1498932e073a783db031a2b4b13b93a962af076bb1b3307286bbb98884c1594b784add75db4fb38abf0141da46edb18e550b04c52f4e3792a40963d990797d49ac5753cce275da617c21c7f594cd44a296437943e6fb66cb16edfa69b3415262d39f88ad656d7e62ec573592dfad362c57aac2397b9508c00872a79104a1e000e5c43aa1ad2bab33c5b99527af52cfa3cb819884e89f2807e7a929b6ae7e0f5f97f9b3e0e310281c100b1e8aeff349d9d187e73d86f166a9703a14bc93ec599b203232027a180f3179ed10a51d9b482ef12f218285d2e06c45ae984995405cdbe71e72170f4a602ddd968c3673f1d5262e69eabc3106553ccc07b8bcd8306338346d2fd2bf595d96c48df5f959dd9384561014c79e7305728587bf01821eaf1f85e74f4365fa1492a30cf3ab54cd1080da479fd834bd07c1ec5e72e9ab68d855845cae166c8f885fdc20e946d40ec478628f4498ebc18e37204253765cf41bdfcf0cccd2ca1ef06b6ca - -# RSA 2048-bit key with invalid e == 3. -Input = 308204bc020100300d06092a864886f70d0101010500048204a6308204a20201000282010100bbb126534d64a3a60711730846af3c2f4cf4fee28f48e7c9ca2b0b5a6c8ad51e2509d38b87ea6b039ad3a33ac57e78c444d86438b1938eed73219cba33b06454e429330ce0fcd356624630c58f32a7ab3bef8c7cb3f9843b09c3e61dc92329df330f002451b5910cac3e7b513d3ca1cd58e39a5cc277e64da395058805f69f19bb62571f28525c5a7f781055ea82bddcc8d10c7163060e2040aeb390e6cd8cbba216726875d3b2975fae77d9d092a9e65f545f8a1e282c7096b3e8293d47d15e656717b0ea2d9a170d489c2f3b596cb745fd3f587e10cf3ff043a1f42ed9d030d900c02676761e70e2b5a8fd9387dc658cc95b1ac3ca83ce3b352d6e71514025020103028201007d20c43788edc26eaf60f75ad9ca281f88a354970a309a8686c75ce6f30738bec35be25d0546f2026737c2272e545082d89042d076625f48f76bbdd177caed8ded70ccb340a88ce441842083b4cc6fc77d4a5da877fbad7cb12d4413db6cc694ccb4aac2e123b60872d4523628d31688e5ed11932c4feede6d0e03b003f9bf6556ac08bfb5829df7f6baf74772fd3e22ca571851c5a0efe8330ffb45863a804f870f4535da65761c81c22decb3bd8fe55fb250b09fce0f12f1c1a073ab5349a8b9d8e3fb826a04f441479cf3b4ecb7d61aca60f44a3f1ffbe2bd615cb65c29b11beeff13074c06356ece01581b45fcfc2cab27a8777a631b3361763d59b7f26b02818100f6434d514907d7c9f522c84633148b5e2fccf3bc0fc4e6a5c5f7b88b15a062433dae12c53d5e54e2a47427da06b6ff4e2c4635b90aa8887b365b96e6485584f64138c39ef0d9108dc8f569f5cdac877c5d4bfad3a89dbda8f5e88d05277462b2636618c6f21f845ebbca664f1c7d5534c15ff90f5faffd712ecd2f130b8f808d02818100c31cfcae4f06979c983cd5248af2554a6981743aaacfbf9e2e1f021d87d56a0119d177d270dd2c89f8970b1cbc3f52c02382b0c823ca8d58f5b5e09573f55deb0d68fe18b5b5821ae267c6cbde49d179c081b3166614619d263f02e3f5db2ef4cbb428c2f96490c200b640aa4e218bb68868a68eb0e2f1b43f55ccff5f2dd3f902818100a42cde3630afe5314e17302eccb85ce975334d280a83446e83fa7b0763c04182291eb72e28e98dec6da2c53c0479ff8972d97926071b05a779926499858e58a42b7b2d14a090b5b3db4e46a3de7304fd9387fc8d1b13d3c5f945b358c4f841cc42441084a16a583f27dc4434bda8e37880eaa60a3fcaa8f61f3374b75d0a55b3028181008213531edf59ba68657de36db1f6e386f100f8271c8a7fbec96a01690538f15611364fe1a0937306a5ba07687d7f8c8017ac75dac28708e5f923eb0e4d4e3e9cb39b54107923ac11ec452f32943136512b01220eeeb841136ed4ac97f93cc9f887cd7081fb98608155ced5c6dec107cf059b19b475eca122d4e3ddff94c937fb0281805d84a6c335b77a5d2468b81cab4ab69198906454bb499b00c8094456b855987dd20a95a5be48f21067554b86df117cc9abab45dca04265fb589606b2cbc074808f39862cbf39e3efd1df44e04fcd9f778574528fcb52f5b7e16066267cf08d29ce7a29deb3d9c3671634af765916a865646accbdec557d970de3b242e3450167 -Error = TooSmall - -# RSA 2040-bit key that is valid, but we reject it because it is too small and -# or because the private modulus length isn't a multiple of 512 bits. -Input = 308204b9020100300d06092a864886f70d0101010500048204a33082049f0201000282010000e978633c731dc49958124170096c8dfd536977a5ad78051520be93de8b3040faeebe61b436d02e6015d78dfa2280a7a1c33b87b16b82b367e352545a6de6ce46f83dc0fc421c2997c7149f9c616cd538a311cdd8c7f5b0959c3a9343090f0ba87b02dd44e7dd0c8a2eeb0d7ad2e49527d5d420b72b52301e7ea2f6f18c86a05c8ee5a20ebac5a78f76d4a1443db1c399375293e008ef34835f873f0ccfbb3005d1efd17ac405db1e86a5b64ecfcf3f02819818802f122d1a889ebfbb6658d3d63355894a4141d1aeb4dfcbfc5bf6d2229532326f73810364a42b7cd1b71f05720698b74c58e5e1fdc364f8403f6ec825dab667f6b26653e76f6f7eb8d98b2702030100010282010000bbb8bfda0019845563fa31c17ae25cfcbe8fc3d3643a67a3c8535424113878570b95ea8b73b34a4699e95ad02fe3d06581cc20dbe83d0c31d117069a3b59e4ac2db7c1af531cbfd8b90afd174942afe2bd43788700a8ad166eaaae73ad19fadeba21e07622149b9b94040d2f9fd88991a11dd23c5549dd44f7bfe2dcef87e3da55d5b0c92e321a992600b6aa2205b90f03cbde204ccbf5e4ae729c6a4d1d38f415f559b865b91996973a05103410842a84c8e19e8b4fdad94d498392dbd521691154381ac6cb5bc6d180daf72cdbc06a7d42a2f503cf44ff804b1b6004b2f4f058c2f20712fccca5866cd107a812390c9b2784d5e199b270bcbc0b2ca3f2410281800f5fd9faeb3fc7a0d6f4011b731482e8ab1d5fac10ed36241d95a28fc298e3bf41e75aa9d0d967d79b857d7156496f073003c45ac8d97136862c103a8e2e3d1548e308b4e50f436b86a236b0c15cbe50d812819294db7cffe6f655bcf50113ef79245fa94886be820ee043d1e4ed9984ad8d8157610c433513a96f86398a7aa10281800f2f85807ba2ee028bdf1902a9940629b8844797d41b922f91b81dad222089079979db61890295bd20e02fdc7d8ccf34c569e328abc83b0127ab6a3ffead18f1e3172206fcf0a1b032dc899d142e64c7e5ef1316992f537bef6963f4304a5064d67e8bffb7a16ae165746cdddef21e531ab19fe2c03940ecc9462da340c138c70281800a3ebd6b4fc8b8a69d970c05d6b21c6a1f5cfb9c15cb7d00a4164ab5b1df6024db2de864b11faeeb265fd62fe86816ec9b3a676677e12e683f10addfd74f48b51e54ec405f43c491aaadfdf3db668a0c25706f97d64a4d09da46dceb85f8a9e832b9e2655447363c44dd7d5429518bb3b6534d9584be3f2ae767494210a60f0102818008bf7d8ee8aa91a651e171cd00d7cf3d1598ce8d7e996b7b8fdc9aebf42efe01acbe704d1ddaa95c4ca619ac517f5e96adeb33fb680a6f435910fca2651a5eb669f6179a22f8948ca6a0397e8df3b4071c44bfa0531ada631926837856a158f2de46046c89e2a969b34280bcc8047ec7ad270a4e5c221f6ec8fc6eaa0f51c05d028180083e0d97571b3ca817e899b3699cb4193d331b4ea9d53e2be2a5c81985f1b609d58c15ee596e736e5647c2a89d05c784836182f2874d83c8648dad4550ab51232e88017c82ec6ce8612e77f5842a5615bea94d116bf4ad1d0a478034a3da7a467522ce292fd30b1c5c0c51e0888dd4397d0708a216456935cb2de88398690320 -Error = TooSmall - -# RSA 2046-bit key that is valid, but we reject it because it is too small and -# because the private modulus length isn't a multiple of 512 bits. -Input = 308204b9020100300d06092a864886f70d0101010500048204a33082049f020100028201002d7374f1cd461fb28614fc8f5db38154717c8ec36f61528768ba78910d78042e4655566aa56d81de67247a85a153d14eaa651ff3e4082c6f67b587d7f94d4d2991c59aba31dcac192061811ca39e6cef73169df49283494eeb51d1f28f4438999f7222cf3fcf17955a155ad901c7e058737dda655a17d0a78ba9fb69783e33c208d63c9f9984a2c612994f515d5fd9d71b18439fba6b092d6f8c8562a0e2eea605a218b32e8f84c4dbb8667bd0a5ce88213966429211fe2fbad80f5ece4b70a4ebca26981e5a27d1468d7cfc9c67e6d6eb2c09b62cdceb8e75a4192fe68c15b579d7138ac710e76a63fa0866274c85f94ff5127930c1316def7e7532582bb6fd0203010001028201001e7efa7787b946695d87d5524897b9ee33db545b136fa4955092d574d629b1fc6e9ab1ca0ac7683d16cda61be57c3cd360874ba2345dbb9ae06630089cb0de564705e4648c323992fe640de26e724d3b78e83301b810b8ee67fc55374023912a9a8e5586e3948b895d91388ca4a23d087c2d748d4e9eee148d24779973e1a08e3ee60a3283d203ad4d1d8b92070f180dae0fdd0131735872b1e5a3bd6c25b02cf44c396b4b046ceca986e871d22c60b63f0ff6681b89554309dbc8a03ca1020e64d07e42a4831e326ba17ce44d0ec727c01b6832f07188e6b3c83a999e5d3922987350dfbd994883d3c841412c53eda5b9a131cd981f87a0991e2055749bf06d0281806d352d2ecf4b613356b19186c1d4a110910235213717edd29e1131516e2fce9b59f4ae2a9e2915bbe1a2f5f10c59ddb898ce7ebd1f2a38d7ec52baa3cca0162266a555ac4c8bf4c44a2e5f29449dad674067c37d3e1b84c978947f5ef96761c33d4845a04c2a7106f66868e71982b4c95585ad727e5feb8cbfd479b2c0b5b3630281806a8b553d7d109b1332b2f397bebdcfea592ca801f8abac7da8d3951cffd89615ed588369a16b33bbf256661f68f8397963c33ab3bcea2d2a7ecc7b4cabd0840145a704ea1a7c52eeef57cea22ab7ab4ffd470a6fd0ff6b285f9fa6f0720e10a5a75ebcf1f84cfa20d34db34e245460023ab3b2e1b7aa57dfb9f61c61d1cc6a1f0281805b3a4fdb49a9c3b21a5acda1cfebeafca6d63c41d9ff305980580665eaf11edbe1e2a757ccb5af853af162189263c3f780170802beb50bb53ca2c36d2ff40f697f6be04cc5c928988d0b7dcd4097a3929c57d2139ebd6848d164e39e182447a3cc5ec2632d1d4b3c30bd79dc8c10072c25383d7366a48466189dcb680ad9fed70281805ca34f774a41e1043d45d9856c64afde2cb12657a876e460d2253df6dc01dee5abdc154f07fa251e5ae482a0f6ed3553f5c92f464e9132ba4b4bd23d64fac57c31aaba1c2ef1404ede2e73cd0ee569ffffd200221f0fa685913748b8b202c6b8b2212e9a19721cdde3bc2096660233045d3417ea287ee52ef30b29bc67e59bb302818058ab3d6815ac06d311d3364f8da1ce2ec7616864f90cfd4051668669ceb4ec8e3eed35c83c48ff18595908e6d40f0017d14eb455bdd5c282b21fadb76be331e6bf66d50020775cead697cc62d07cfd14ad1d383afe3b3f7d0dbf181213ccd3df42e7e4481e653333debf7f5523a46722e1231327ba57374c4dc605b04822a7af -Error = PrivateModulusLenNotMultipleOf512Bits - -# RSA 2047-bit key that is valid, but we reject it because the lengths of the -# private primes aren't equal, because it is too small, because the private -# modulus length isn't a multiple of 512 bits. -Input = 308204bc020100300d06092a864886f70d0101010500048204a6308204a2020100028201004edbbf2909ee78cc4ef9914eed0bb1ce5267ac3f141c69b288eda901f73e8e68d4184e8e62b23e10e8fe3da44a2ad6826825581b01741d5cee01964e2561d1ede3cf813eeec832b6aa43e31bfbfc9aa3181cf4d729860fa5bf6477d468374640cac16dbe2c82f8d61c1e3cec8e42a18cc1e3cbbaefe21b2c8490bf3f9dad6f90b9297d44a32899fd88fb9914f8843cc1600ce310d69ea52c9bf26bb9ff030b7a5b01e1809227f59e58a3531559f520028e50bf2e21af4fe53ac19685661d03c0ac75774cb518ffd85f778b16b254b83065bcb09dd4ff2e7e908aa1f90e1f99aa94336844ba04ac228b6edba3f1d2e602868ef042a8ad1f6bbc259ed86e5a06ad0203010001028201000c43318ba126bb141227cec7b626be6475fdf713ebfdab15ff22edc807796bcdb3458059b5d13fc383679d9041943dbd1392d30b88035559910d202150c0d0532cbca4bd73862014b58f4eee9815a4ba3dd2aae41669e95efdcf12af2df182742ad33f4c76417b8e57daffe04d12e16a30f04a4aec687d8f43a1fa8b5aea905182928441401bb9dc7946806b7f21aeda027974e32b08c8d31a60283f36b4fdfaac2763625e792b9dddceebb995a379989e39f79a5f07a26d4cb87504df0e4dc283cf44f0bdd7d313d33d0b1813b53e702e34c0788792ad72479563fbe0f7bfffb7033842ef62456d1d087399fb7e425bf92f78b438027f9a8c81305bbfde8fa102818100ced2d7908326a8085b5b05a46c7933c278bd6dc32e941b1fa5cf78db252ffda3bebe5e8a824f667af2c89d40cd299d23bc898926cf40365ce4c4d90c173dc372cf392d1ba6b9f92ec77d69e59aa37462e80afc75ed491a9ec07ae9464a478f4b3593f1e518271925d13cabcec9eb491257323b6500b2f15c3283dc43ca3e45b9028180619bc84ccbe7df0317658039047d6ed73b063946863498120e4bad94654fcf12447e00c4ee2bdb0017e2f62013ca193cd2de66ba69c54024db2e4233658d1cdd35fd98976d291ebc86bf77334871548c16403801380a5afd9ac3be64d177e80583ad4589371308e44c883b93f7711980e389c661e5673c875bb7feb1e010029502818100b1aec3911c8b664a9fa9882465288f462092a52ccce4629502cf46460721bea72164cd35f393a13839420e8f3072f2d453d258e8e59e85d5b29846dbb34fd58cd9e8860f3e62816825ec61c0e6e44c45f8920fa8846d8c981c46bc082e226241bbcad942f74807bbcc91720cdabdef6df949676b7379480fec3a0a4e96fe7ec90281802f38671147fff7b28e2a0b7b0a020892553ab090beb248f34b392f534023f900546444c90093f4d1b9bc91e778cb67a4363b63a541302cd4e7b81c4cb30f2e6c92070a400f8e3a11687ace16e02ffb7ffdefb968558d24f1d56267046d15be0894e8496095653f02fb4758d33f7cd6a2b4f15d28d50b398c1e420814535a4b7502818100cc6fb56fd8b7b3db0a4171c662a0d76efeada4ce0dbf5891b3b51d60efa31bb8f7e176417579bc35a751de444a9e3479307af73ac1ccf0458d81e021d1e4e33a5203c5d01e5e397ca26e62174ded0d310ca0c78685c17738783c9f06acd286f009a623cb4e651776ff9adad81a08299144c9ef4d07fd3ac1408d9c92c98d9379 -Error = InconsistentComponents - -# RSA 2049-bit key that is valid, but we reject it because the lengths of the -# private primes aren't equal and because the private modulus length isn't a -# multiple of 512 bits. -Input = 308204be020100300d06092a864886f70d0101010500048204a8308204a402010002820101019129387ed5eafe167c7c575ad391104cdb7ac95d25c2b0e3699a98f477de9729755574b112f552b28204480a061cf6a6360e0959000cb1b175301ee7d7accc82735c2388fb7bbf2673a309e25e2e4b26f046c9dfd858e78de52bd36991e0fc1a28f04b9ebdd6b0ab8da95b6467a7869b4e5a19dc1bc189b666729f7edb24a64965f53382ca45e20bb0a315439f7bead07a0bea88cf25a179e2aba7ee8584c1fa58e731246fcb4778e6f9ef455d0e50fc60c044f7745a4380b9f4c82dd4a64dae636461fd351f2e871477d801833bf44e7e4a7e08691776d263433c19d477290f1b844f0555c2995b22525b57681962332271a3cb522464c27989ab7c943f48e1020301000102820101011c7c6b00279bfa8cdfc31dffdf416499dc9bfae8ffba4dcf3838d677a7fa46a0b400e23c2101b09fbeec625a1973b8c6ae56cdf23bc2c4d0e0163c14963288e58a01b18197366e9c4a2d38f93b69010aa022d34ed71255439f5db11390cc487c14c4341c62ec3965af9486a7718ab03ebb15d278f18612af337fddf40c5cb53e46b99d7da4b7d8d9d586be8add8b0da6756a301155f2472b484c0ed8a23c052dcfe7ce40e99b6cae94edd41cc6a24fb5fda50b5ba3958cd3ccaa6aa2674cb9f492e208c8eb966f1d4d9b1c2a39efc324a41b562ebce4cbea0af06a6bdf19f4c45aed56efd9fd892ceeaa9abd3458c151a83a2b80075e1bab92b388a747baa64102818101aa9f633cbbe8135713302e9b0d22bfb7589c710a6516d25521550d98ee4b827183fe8351285387686d15abb3226813f5ec6367fd9138e2f5e5f248bacb3247219490092620f3660c4d7e091c5e61cbcd4992fc10441261aef9e80d4baa74f1fe9e7eb358c5098693954701a62c0309aecb7a32f0a763988d6b5fb26b5be8a07d02818100f0b8b228a6ef97211d25f0962132ec78ef48f99877d49d3b02e969a34b72eef8e289d0c99b8576d0e704ab27cb908b8c791ae9cba56340ceb9ab13436f6d19b07f1f485d8577b72f6bbc42b6edef6f9fe6dff28bbf790f26dae0c85f76689a440663372cf21f660cd860967b69d6ba491b58b7ad817eecb7f088df4053027b35028180265fd5e655a4a770b2aa27d70c946e984861320dd44ffc356a1d236ef92853a07056096bd86bc30752a09b642e991c0a87ebdd23c2d7521afa4713e1b17b614894fb6bc74139839961b30f90bcb0a14b62edd4bc85d2fd7466c847c1e1a0495034e382b05e70dfe91089658d93f1e602120d78dd8ac0fbace4d6a3cee2628765028181008155fb03348e4e59105c2e23bbbaacab5d858bf58b8cc4ddcbf6b5377376514790101409fe717b214abe8b675a4c536e2a3377a25f3e30b7e1b2352b6a56e812987aaa5af5371949754d355b2c0415a9885692eedaf5a45a70078e211c719f51254d717bc8ab6e1d40b4c4a5927c38a2c6faa7d5a55a18bdcb92fec084d934710281803e411557b7c0e6e6e296a1d0473b7bcf5f7a71d03c70bd6cadc3a9fb3a11cd0294dd02893ad1c28f62c20294d3893d6ac77baabf7772dd47be587893c79c8d66701c3037ceaec38088b500e2197994e048b1b357f8fffbbdbbdc94c0c82a7cac7ef0136cd6f7795355aeb3e4179eb2b363315f6ccb0a26434682adbbe7b6ce6b -Error = InconsistentComponents - -# RSA 2050-bit key that is valid, but we reject it because the private modulus -# length isn't a multiple of 512 bits. -Input = 308204c0020100300d06092a864886f70d0101010500048204aa308204a60201000282010102c539e76a413401bebc36a0e09b5acfd299393605da7d25289d085a872fd761b2cf11787287b9c45d285b146e11d8a043c07049947e49f0e89791c99aafa2224d65dd8118067adeb1417e8fd3be306aa6001bdda425c89f691aa1b77ad2c6cdaa890fa764c541e74bf5e1571e7efbee69d1331d5d7544e15d2a7f21de27f268135fb7a4334d45e348d15de362ba649e5bc50cbff86a6775d5d9bdd75441eaaf3a4f4acd1a28cf3d81dd3749a460f87721a73e45adda47134634276c6acbc341fd9c96c4b7b3f6f74b22f93512a39fd4e77f330726d07728f7ae8246a7f2c50cd29625c1365825c8ad257213444ec6dfeef03350bca7091415a3505d5798dd37b7020301000102820101017d721734debcc9f37be725bfa7cebfd7d4f1204d25a609463eaf2f816609c1521a6c9b0b7e543b789f2bdd6115d81cda53b610dcfccf67f2b112880bda4aa98857313b2d60ced4d72112a0e8917218ea0f44ed804b920baacbd80e86d0b67c072c906ec794104e065cc845c2f1292ea15b12d2c8613a1abbb10f8f779ca493b38d5e704ce2644b3798e852d0371214a862b6636fe2d22d5f5c95b794b317438c14ebb28d9c90339f505c90c3fa6ad5430c163c067931df4523490906888f1ba4f55c07fdeb6fe77932b817eaee669f72988a09df346fbcd3abc3b0a6d60546ff52aa28405aa51d1dd83195be0ea21b7995a61a9bcd807d3b0683526b1f79eb8102818101b41a1d8a1fb22acb2f2a827655d9345de5c5c606761d99aa75116d1f50a432079ffce48dcfd9a1c2888b865c92f02a309520291b854759bcca9c4986b85f2c0817e9327bdb69d233f1dae5b52b5cd3f3797c672fcc7fcdf8feb57d2801dc3ca43e4cbac95b919270065a4c617e1e4f11d9a07c7eb87cf9ce7968a9819e79974502818101a05437ace086421b86c6dfc1e7f4ba18e4faeef9ed4d1cc4b6366fb5810ceb5610dc349852b340fea235b0af07adc76ff4ffb91fb73f75bcfd2328d20d6c6c099d4e6b1dd70e75c97e272e3984383657341a8b36978df2bbec2c557357a9bc46cad2703659631dee2df8a61e65841ec80c004adfa169fa0169d476b9253b74cb028181018c3759f53f3ce9a276f4e15950402a52d14af1d2b707c7b055f282393c5421dc49a043ab1057c39ef1de0a321b923652b37a67bec8457e2387d59cfbd891277926f84954bc9195587a798dd01f58947d16384fabded99332918024f8ef4fc08cdcc96bbf3c01b391324462370595d5f2facdd3ae7241a1d8d4f7a161d1b0d91d028181019e24c8b17f33ef0504e0466bd4bb1c787127b19c0ad41f9f0b0741be931e6fe850a34cea8db1e520a7e9b2d59a54e344dab99bc511fbddba5f319f84bc77b34d291f7decd4267d432febf7ce9d5971acf396c80f49599a321830cddc0c433b984c6063e19cafbd715667b7901b39ff88ce6f680be7bccd46a4a906650cc5855b028181009a8f419948a190615b84cd10ea337bfe5fa33b94d2ae506e153a20e6c006c831d025c2fee5a10f67e708631f98532417c2ce89146b279349f9defa5ace677dbf11a9dbffec36a42c0082a912422aa8f641fdc559393276ace5ce985937c3da09220210f381f60eac5cccd0858a8273045c42b96623aeb042d2419be434519dba -Error = PrivateModulusLenNotMultipleOf512Bits - -# RSA 2056-bit key that is valid, but we reject it because the private modulus -# length isn't a multiple of 512 bits. -Input = 308204c1020100300d06092a864886f70d0101010500048204ab308204a70201000282010200ba546c668d1f047853f6d70ea45f0e51926bfff13167985f6bf6056b1d6254255458e4d2145dfb8fbcce9ccc1433da1d34804953487cd1b45b6c16c51f9c0d50cd0118684a96c8a2f6bf98b14ff417b1d591a4f125cfe04c6e6ee7472d45fbf791729824f2adac8edb9b7bd1c2540da03337369106a2b40de64d1f8ac5f106a3aeaf5eb05c25bda6f5d0e2aabcb5901b552559cc7f95fe46af048307f6b8ed954d205cb583d526b63914d1b9425ecc90d598d41c97297016130b1e5cd2c384a04132df6919dba22216b6f962cfbe03859ae0923145e1f60a92dc958f0b1bc12af3215659950a0d4cd28450b943244f37c6f5cc38e52aad4acd64ac4c933e737f4f0203010001028201012e4367e6ce833508eb500e75843a55c3cb2725952d3f1b8615b83000387b818903384f181a167baf64a1a82cc3975c408418961c2793563e01b504b24cf6e2177dcf17d04d34c2fc3367bef1c77843a9d3ed2596fa5c72c48766e1e5ba47f617b1f551f15a8fe49853ce771fcdb030f1e5c57fb6e27ee355d028b5fc2ec9796c83da05f851bcd5798b1b5b71c27a888f8203f5c642c59642f96ed30a62e028cd806a974e4ef3be34845feb67bd879e9eb6a8adbf0b8fd1d87df6e091c45e411c82f764a5e6469120345e39dc896b90b3b677d7d82139908437cd7695b29629cdcce2f23d75f6406039196963868d62a4de9c7b3f299393aa88d4221cef342205810281810e3f428717de170fd9a2a11fdd057211dd95ed2d39998986e064833a186f653018f8e5230ba9ee0f1ec40a5f7aaef80ff900ba71f8af297806780f0bf0a2584c95fc1b9e326cdcfd58dde68b9535d87128aff2920f01210ad57de059c673f0b34903276a02df0fe05b3521027e45907838ab4a7cb09a185fe4d80d5e5733aa9f3b0281810d1413d14b7fabc6ad1840d52a00ff6bb9346e3931289de591ee9772668dd12dee8d4ae0a7f6a808fb48ba2405df36d39842f3081cdbfbfa2e9111b2792964cb6c7959dc5a45dff89aa1b90f0f1bc4e4819d64b83e673937fe8a077895c6544e875e62c8ad4b9d2a1d4b1ea526458de103d2c8c9f95e077af2a39b63c4753e46fd02818107c50e2618a921109ed32765f6268b201d252f94d36ddd67b6267abe8b26ed1b3ef3361b57b813c121392ea30588387695888525b4c6ea29aff577d73e237b5e41099d9237d3d0ed45b2b691770d477de6ff959d7c1b5486d10975f9dfd5c8f62da24fb36bdf748c1991aeefea274bf3948c2df23469c5533ebd6905032f8524930281810a440f46436025031fce20ddf249b434e7bcdb24738cf15c498fa23b7f7aa48ecc69063490439224f2b264c2700585b0d41d014e05f13bba6721226618ab405e59786bec06c44089913f8ed6de422aec3f3dbfd8cbcb14e3fa1e78bcd3bc496316e924db67042a8aeb5192ed89bc21215671f7806b08bf106833ba7eb6b05d413502818105d0bd604f192d745e6f88e5194b2ef390dc4fa61c230a4862d3a12edb3db48178aee3ec577b156a3b0b1474d14e6a9c59276c21202c46410945c7ce6bcb72ab9c61e2c4bf97e3dd4ab47574aad5ca7e0f94698970c07b60ca268f11551dca945ffbbda1acba78d42e9616a6c7da464959c94b44918e6d41423a0ac9deb368efd3 -Error = PrivateModulusLenNotMultipleOf512Bits - -# RSA 2302-bit key that is valid, but we reject it because the private modulus -# length isn't a multiple of 512 bits. -Input = 30820549020100300d06092a864886f70d0101010500048205333082052f020100028201202e8314b5b60f188172bd5b0eacb60b94c15375e3df7fe733d523c37a8470acc8108ac1130301167dcdb2fd3c87f48cf8d1a597a3401cde1c64cd115be2f4f03d5cb8948137ea895b1558b8c836ca2bbe8c4376103a6c490e76fed580338a5da6230680855e6659354525fd3e91e7b238abdebb0a12bd8c52adb49b2eba187d87b577abfaeded16a26b8f2705313975f5214cdb0033e08f800c8d5baccdbee86c435882bdd599667ead13b59c9703f8d82c9bf122f70e80639d98f1559ef57e61cc63593ff0111fb7fde3cbd80531e351b41f258585e4e74afb4ec7793982de1d253ed1e479f6942c48f0d0d2674d3e65a547c11014ca924bb3b01401a7e507455a9de56bf9f74b0a752dca972b463b9113b6acdb0a1ebb9b297e496fca0a1597020301000102820120047c9c98d2d12df9fec9896926fc00adfee0403515304f6b4e9a3e9729037d8767211b72ec0d44d029f1a4401c9558abfffd4b5d7227d6bd42740dc2a168236ca7ef1e5440c29d316e23badf85798732c0711988833a42e9e44cbce7bb1113eb9ce159b083e4b7a24de356449cea8ee4ac9fb5c748fb83f7cdcde8525f9d512eb030b52465a34355b3ae81831cb6804c6a17f756956d9c674d3882b65996b27301f4f467478617432c2d4ddcdb14c77789f29a6c866a975c8c8128043a07535a05e40bc625ddcce0eb295cc3b3bfed4f5d5f6fa2bb84b5580b5ff54de7d601533909807c6497da7dd8c292d9bd247430a6000d00b7b02c3cf82d8faf9653b16dbc344b3e2a7e72461b26600720acd3baee6a11c381281e322e79a2088f543a01028190795c84579a2a729defe281fe5339696f8750942e49b4fc6809a66b628b17948242aa2afe65cf5044a8fca45c5794696085a6c20365df2d7d1b3458b47504a1baf869c61b16c7ea2433094905cbfe311d330d4da8fa81c8f86f6d756f5324931941095e832e0da7862fabefa9b48e8c58aa815654be07ab8c7ec4b739cb990efdbf5b9575fbcb3baec42df70060688917028190621cd2ca19189990fa6adf8f0b1f35385312c501415425094c58b7b6f8a9cc641c3b4b9053bb831622231f7be8b93895acdbc8caedf924e61727504579d6e1911e1346deaf471134aed767b2f4d9e879bc63813d7a9647496c29e1d0166b2fbfa0dfe9d93e7de982af3de427c342baaf3bd0212c386dc50c32f821ccf2059875c36df4437d74a64c94c7986672e9a78102819056eb7635afcadb1056f0e99d9749b54415ac1695186131ade9cb7179c09900da5298c1f63640c70285ed7c624eaf92d178a7b8a8ea5b6f9efcceff01301643274027b1a55129997e97b6fcbfd41c985c8b65e9cb2eafa99a9563d60a0788587a6be423f6dc13177ab9c5f0fea0bcbfb3f95a6cd480cdc985f47d3ba57f367e502aaf935a4f1e7dfe6baf680ab301ebbd028190104ba34307da0b1f86481beb813864b97f2abde7d076ee53d607623414a6f718a58bbfa8301013dca83cd72cd861732180fd5c2340554228a92dd16a48ab44f9ba5a0f4a4b286d962778057436b0bea9017e316809a54e1fc6c44a0a2abf10c62e2d2284ff992020a18491117d9fe6abd62e62641ad73884272f094625e88203053b8cf76cade43511fcf8b6035e0581028190575f40ae0aa97cf56c9f08f6b9e418caa562f9378a17ab36b8e6d503f3f4f975aeeccc162e8870a5942dd2ca8157a208faad72532a11e8f0d9bdf0ba38f91585f49f8b51927bab2fdd22bd99544897a08181e32fe7993173030a2c9fce6c219f44299c96137f9e060da72637546e6837c81cadeed9137f8f18ea5c24025f85a118404b8bdc86626ba24b05e081197390 -Error = PrivateModulusLenNotMultipleOf512Bits - -# RSA 2303-bit key that is valid, but we reject it because the private modulus -# length isn't a multiple of 512 bits and because the private primes aren't -# the same length. -Input = 3082054b020100300d06092a864886f70d010101050004820535308205310201000282012061ca8d93087a5eb0f9a4e5dd47f62651673943ba5f3cfd6aaecbe355e6f37b422d7cbb13fd0675bdb22cf0e5906a224a83701f3256a78f61ba294160cb212dd5a6b42bda1a8bbfb7b21863dcc8a7aaf2a473dc71a9371e8f16e5dc77b2c4025a69fd27c60c7123e33d8c8bd03398566fe99e7601378e4acd97235bdcba08e388107cfab48c0ac6cc713aa09be6eaa4173bebac4141fc8857e09cb136d9e994efdc5a42a2dd2cf0a15a8f67ab8bf2ca5bfe728bbdd06b1d1eaddfa238d28a857e1b376613cd2260bfa7905300af58f8a14e7ecf41fc31cabd45f7f4445bb00d86f15912bcb730216dfdc656b57b94ee5f5c8b3000ca80628713332028b6d48249174fc8a0bd0ec2917b76218764070ae24355c31eaf389d3403d802bf3dc42b7d0203010001028201205268fd0804a4033a871744b3471a93ce13fc392c4d683b73751cd357280ad63bbdd398604ee1ebc551eaf793ae3112f6d26f618aed65c5ba28c4ed98a1763387123651a23aaebc8114afe3304354b1064c3a6b72c9946ec74d17a6c4a4bcf3f2b7d1247c8d2da77daff7ca3749d3be3c0f977f80a50ddfd203e5435beed6e0d0607cc255f6927a57fdafd77baa8ce07caa191b77c5b2b725636fd252f9246c4d26d4734e472e3884a0c205ef9e947b8882f9b27d8b3e305231757826b900aed455252552af86a1cc0f9f405126272d4e86a5b3a4539fa4ec46d1737921ad5a47046a9b2e1fbf9e745e802155b2e8205286b78317d5855494aae4ce94874c527d21027d11979bcef23917eef81bbd3e1fcf7cb04f8b0f61083acb08d94ed990cd02819100e6c1fc3765e9c9eb83316e06bd2e910f04cf23aa7aa5d303001db15f93bfba4fe28f19205499035be6d2c224396c9d669897dedd6a8c4f399dcffdb8181078baddc34d159a10741384db2a1850b4242a8f63b16c5478b72fbc17efef4866a5ae156e4b6222c86c2f4e370a55c9690f20122f6cffb37a1aa71d848bb9b7b84116a511ba76dedf8743751b842fb140ca4f0281906c7d0b982df2ac5d289aa1925f65be3c562373fc8f19171b53d85ffc4989cd30442175e423d4c106cd00e64f3108fe3f8cb3dd8eff6fd380334baa0e4372d98755a82c6d02e63443eb5020dcc2ce6e452bb6c7434a9758f1cb33b9ce6148a4bed5f042da4a14cbe83d161c26450b8c2f0fe4267d7ef0499b4c7b6407aa7e66f2d1ff5724a01ace5d30a3bc0bb2319673028191009c9e73122290b024b2119d8ce36034c24dd04d73caf4bba860aec69189556b1e07367aa64fe4debbc489ad8d2a9086b078c73353729ab2b6f75e90e51f2826d925e5056fb0f693e21f9d251005ce8e71788b0083f73d4b901188e9a7adab45ae470b6a0cbc70edc499c08fba340ea35e70195250a6bf2c51da9df8bbdf6f267639293436b40460e92f15b2fd2fc03acf028190157424f6d31f4a36a1f0f2429fdadee3cfa4f32adea177904fe45a16e9f3f63fb53968b6d4df1dccda7d730df6047142dff031c0358347aff274e40c2e0a6839fb1666b2a8001e15d052e82cbfd952b51b0fea17c488696e6760b33dbcbf40d4fc39a6fec3e798eb34294b27c63fa2592c2b51f13f49054550ba95ed6e29d0f1f3d52ac67362d9ac54120cfdc31f4b410281901ee70df154d97ae00935532cfdb43c4464bfdd0d6f76712fec6ae76f2a08f37f48eb2d54a341c023a1f79b143414f79479f5ace419ebca650a133fd6fa599dc3754851e04a5128bc007cccb1116339844861beacb1ab660ab629fcf0ed70ec41368324848f9fedc296c7104811b85141dfda4e7a51af43483e133d557c906b75590dea5480c2a3b7ad881ae6de3047f3 -Error = InconsistentComponents - -# RSA 2304-bit key that is valid, but we reject it because the private modulus -# length isn't a multiple of 512 bits. -Input = 3082054f020100300d06092a864886f70d010101050004820539308205350201000282012100cd1d23382a2db0444fdac845b1645182df1ae59d14830e6e4fa41ffff1c1dbcb63e8cebcbd8e643702ef0ab6953d65d9e3138509d5be4fdd15aaff1ccd7d34619ce713bdac14838d4a25fb561c6521992ed523158b538eb9dccc902a7955c5f568e6652fa6296370d589b5acc0ec1cbd110b2506ab73d2c9180c77be49cc8c27c4b06e4a102c60414129ed8644e613735a1f8f5ef874a50ca7dd6c42cf5f90ae745d59cfd4b47bb3c8d86a0c5aad1d7f306343f8b12fbc3ebfda03a59a638dfaa519e241c0fe728322df643cf20eb85134ea7625b8414029ff89fa44b4d8955c43382dc574bffefe4a5f3de5908a4d220d525e85b5774380b244ecf667014786c14cf53517c5f15179435c81e97e46e83c20c21e5ac8922544f1c39bb20571b302030100010282012100878559f0d10570f221a4d7301cfdc0516ce193964ea82ccfbbb52023767374aa94af8c70edf977c3551fe57f2f69eab2a4b30ff2a893dea69f9b64857e4bdc61264f131efde46beadd73ecf53f3b9e905c7e1c792e9e1dae35f1becb217207a29715ab036990ed0fef36d69f76b44a64ad2f24de9c47a19c96541e85ceb2e4639e34481a8d4714ade8c53017c7cc104ab6b0df5e2100f42af6ee1a8edadd726f3303321b9d697740b9ae11cad24f5a9edd3dfe5eedeb03eb5322c7725dde8162cc1b5c4bd56e07fdbba2b75b414efe84ac12885350928d2f859e2803261a6f449f92810eda199fcf279e780e2c47aa119a7b0d7b7729a0a0067f3d648db50673042a27f2f714d335c9aa022a2f51b9752dbddaffe039f5ba2a9736aed89cb3c902819100f0e35612fbec84c21e07de8f8a7f1c82bc1fe9d4e487929d88c925c352750dd4ef5bfeeae293f44437d3da88cd377a3926f621f1d92ec2f5b56775fc4a234ef1083ce3fc309bf6974758891e3b4d5d790d84d22b839adbe2d538668843d962a9ccb761a2f7d1329643796fdbbffb9d2a3b06f31a62f6ea24ba96e7f827cb66c4ceb763aa036906cfd126547d18b57e5f02819100d9fb446655a1eff75331b259824d3f1e1e845d3d6f385bba360424ae08ac55beef743b6aebc5f4028dc218d5eb5c31bbfc53a0035e7951ba9014c8e4e6ede6d21763272770058cb8ecb7d995f6ec9cb34c8cd63455eb832ca13783ec52bd789ce47010f141d3364fd6230aabb0045596680225fef8f0e7148c1d52ff630be6bca36ca3cf996507ee3e2b6d618a35a52d028190767d8d0067954f34612b43c9ddb96adfd003eeb47ef9452062817726ddefa02f26d25cd15344adf9c4705c65c0745295bc598416ffdae5a1916ae3f986ca59716cb8eef8453ce28e45550295b15bfbe7a8c3b5d21bb95801fb19f42d811a7452cbd5449cb243e01b53f36f176c172b96f35416cedaf153f95f230dd5de554a26f2fbf8754f9a20f4a68fb12d9bb2e307028191008319d431981f252c232528971cff488edcdbcf183be43186f525d8c9b2fdb3347adff53c81413558b3d9a10647dfd329b4c0b6e44fd5b789f54e0ae560de848ca6f443803ca799d33ecbf4597581295dcd14876042acbae004b656e9b379b128eb5b5b553eb9c15892f9d059222bf92dd4b03619fbaf27cbfbd94729c2704dfdf66c48b97b10808c91679d09a50e4ea102819100835e751035519d3a6c0a6cddfa73d928b5ea0c51eb7ba44c34ddf148edb1971e436c1438ba996c114f0a545bdf3cae1be3da1ecbc6859fac3ce04a7b1beac6c19e5f032ecc7cd9e96e8e6fc2241911f90ef0a26b1c8b9df24e324690f6be4d904a7070d9424120b65c8ebd733a97817f943d4c697dd931e66c8a5eb0bf54d813e0df978828897bfe304cdb799728cdc5 -Error = PrivateModulusLenNotMultipleOf512Bits - -# A valid ECC P-256 key. -Input = 308187020100301306072a8648ce3d020106082a8648ce3d030107046d306b0201010420090460075f15d2a256248000fb02d83ad77593dde4ae59fc5e96142dffb2bd07a14403420004cf0d13a3a7577231ea1b66cf4021cd54f21f4ac4f5f2fdd28e05bc7d2bd099d1374cd08d2ef654d6f04498db462f73e0282058dd661a4c9b0437af3f7af6e724 -Error = WrongAlgorithm - -# An RSAPrivateKey, but with an AlgorithmIdentifier of ecPublicKey w/ P-256. -Input = 308189020100301306072A8648CE3D020106082A8648CE3D0301070500046d306b0201010420090460075f15d2a256248000fb02d83ad77593dde4ae59fc5e96142dffb2bd07a14403420004cf0d13a3a7577231ea1b66cf4021cd54f21f4ac4f5f2fdd28e05bc7d2bd099d1374cd08d2ef654d6f04498db462f73e0282058dd661a4c9b0437af3f7af6e724 -Error = WrongAlgorithm - -# The AlgorithmIdentifier is rsaEncryption, but it contains a P-256 ECPrivateKey. -# TODO: This should be "InvalidEncoding"; that would require delaying the version -# validation until more parsing is done. -Input = 308181020100300d06092a864886f70d0101010500046d306b0201010420090460075f15d2a256248000fb02d83ad77593dde4ae59fc5e96142dffb2bd07a14403420004cf0d13a3a7577231ea1b66cf4021cd54f21f4ac4f5f2fdd28e05bc7d2bd099d1374cd08d2ef654d6f04498db462f73e0282058dd661a4c9b0437af3f7af6e724 -Error = VersionNotSupported diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/tests/rsa_pkcs1_sign_tests.txt temporalio-1.3.0/vendor/ring-0.16.20/tests/rsa_pkcs1_sign_tests.txt --- temporalio-1.3.0/vendor/ring-0.16.20/tests/rsa_pkcs1_sign_tests.txt 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/tests/rsa_pkcs1_sign_tests.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,480 +0,0 @@ -# RSA PKCS#1 1.5 Test Vectors for FIPS 186-4 from SigGen15_186-3.txt in -# http://csrc.nist.gov/groups/STM/cavp/documents/dss/186-3rsatestvectors.zip -# accessible from -# http://csrc.nist.gov/groups/STM/cavp/digital-signatures.html#test-vectors -# with SHA-384 digest ccf23d868984de1112f2b6d089bff30ae3aceaee371655111a6e746487549a5f8661a7f43b9333b3d3f453068140e1cd -# filtered and reformatted using ./src/rsa/convert_nist_rsa_test_vectors.py. -# -# Digest = SHAAlg. -# Key is an ASN.1 (DER) RSAPrivateKey. -# Sig = S. - -Digest = SHA256 -Key = 308204a40201000282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201000997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8d33f10324c55956141891e45b84b49f59ea5bfac6ffa38900aca5099afcd02f6a8257c41ce5bb2e4153832b5c22f91eb389fa2035c3cf9b3374531c483cb30ceb007259b1d02818100d95c0995fabdfcbccfe63e0f3262f806869ab571e1793e97234cbb9bd4b6872a7695389955cf6ce7245345a5df8021f7d9519563afbc2667f5311fad093de2c02cd069109b630d68e3bf767f8a788a6add7ab199f2d8f6a40b7c1910d9dab52ac80d0d333aacab321a9309dc884ddd4db637a0c1115ae3c08efa683f99eb733102818100d4f7ef9f9be947ba9d1b3bce59e5608839a1e464553e1b6d113d0f636758bbb473a89f9949836ead40b6f314eee3ac2244d7b6f379e83f30e17783ad68d5086897889c051c26e1558a4a220bfc242995860644b5d7a3ef513ac612b9c6c0a2021bb6b9cde7dbd21fe5858746c79563e9bab7d06b43aab43a0a5cafab4519a6610281803db2386f174f2ea3ef4b6bd1601749ce2d6afa8be35f051178621f16a23ad36eba03c073136389241969e5b87edb0fcbcf1a0bd6e1aee97bae1f2d97aabe19b17dbe7d9492cdb68a0897f572350e846c669660dc978c5068da598524fca8a136358d3e5f8f6ad5cf78d9089c93f473189162ce0f8c4902a19902b633b3e6926d02818100ddc971183dcf3450c43e06ba2af32379eedeb2d678513fb706b75a006098154041f4b09e6be385d4b25d80ec241c899e4a986a17b0a121daab91a1e4fc5a1802a7074df3fb3f7661f0e1c97799e36d21de937cc4209585db30a56af0a228e001036ed792625e5368ce101574a2e9767f07338949f0afdf358cecd18c6d6f3f55 -Msg = 5af283b1b76ab2a695d794c23b35ca7371fc779e92ebf589e304c7f923d8cf976304c19818fcd89d6f07c8d8e08bf371068bdf28ae6ee83b2e02328af8c0e2f96e528e16f852f1fc5455e4772e288a68f159ca6bdcf902b858a1f94789b3163823e2d0717ff56689eec7d0e54d93f520d96e1eb04515abc70ae90578ff38d31b -Sig = 6b8be97d9e518a2ede746ff4a7d91a84a1fc665b52f154a927650db6e7348c69f8c8881f7bcf9b1a6d3366eed30c3aed4e93c203c43f5528a45de791895747ade9c5fa5eee81427edee02082147aa311712a6ad5fb1732e93b3d6cd23ffd46a0b3caf62a8b69957cc68ae39f9993c1a779599cdda949bdaababb77f248fcfeaa44059be5459fb9b899278e929528ee130facd53372ecbc42f3e8de2998425860406440f248d817432de687112e504d734028e6c5620fa282ca07647006cf0a2ff83e19a916554cc61810c2e855305db4e5cf893a6a96767365794556ff033359084d7e38a8456e68e21155b76151314a29875feee09557161cbc654541e89e42 -Result = Pass - -Digest = SHA256 -Key = 308204a40201000282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201000997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8d33f10324c55956141891e45b84b49f59ea5bfac6ffa38900aca5099afcd02f6a8257c41ce5bb2e4153832b5c22f91eb389fa2035c3cf9b3374531c483cb30ceb007259b1d02818100d95c0995fabdfcbccfe63e0f3262f806869ab571e1793e97234cbb9bd4b6872a7695389955cf6ce7245345a5df8021f7d9519563afbc2667f5311fad093de2c02cd069109b630d68e3bf767f8a788a6add7ab199f2d8f6a40b7c1910d9dab52ac80d0d333aacab321a9309dc884ddd4db637a0c1115ae3c08efa683f99eb733102818100d4f7ef9f9be947ba9d1b3bce59e5608839a1e464553e1b6d113d0f636758bbb473a89f9949836ead40b6f314eee3ac2244d7b6f379e83f30e17783ad68d5086897889c051c26e1558a4a220bfc242995860644b5d7a3ef513ac612b9c6c0a2021bb6b9cde7dbd21fe5858746c79563e9bab7d06b43aab43a0a5cafab4519a6610281803db2386f174f2ea3ef4b6bd1601749ce2d6afa8be35f051178621f16a23ad36eba03c073136389241969e5b87edb0fcbcf1a0bd6e1aee97bae1f2d97aabe19b17dbe7d9492cdb68a0897f572350e846c669660dc978c5068da598524fca8a136358d3e5f8f6ad5cf78d9089c93f473189162ce0f8c4902a19902b633b3e6926d02818100ddc971183dcf3450c43e06ba2af32379eedeb2d678513fb706b75a006098154041f4b09e6be385d4b25d80ec241c899e4a986a17b0a121daab91a1e4fc5a1802a7074df3fb3f7661f0e1c97799e36d21de937cc4209585db30a56af0a228e001036ed792625e5368ce101574a2e9767f07338949f0afdf358cecd18c6d6f3f55 -Msg = c43011f3ee88c9c9adcac8bf37221afa31769d347dec705e53aca98993e74606591867ccd289ba1b4f19365f983e0c578346da76c5e2228a07e4fc9b3d4807163371a52b68b66873201dc7d6b56616ac2e4cb522120787df7f15a5e8763a54c179c635d65816bc19485de3eb35a52040591094fe0e6485a7e0c60e38e7c61551 -Sig = aa3a4e12eb87596c711c9a22bcabcb9dadffcabcecbd16228889e9bb457d5d22571a72f034be4783384f43ce6fffc60534b8331cdd5d7c77f49180bfd194b5fd43a508c66d786c558876735894e6a9300952de792f747045e74d87fd50980230707a34a4df013ce050bbff0d6f570885c9c7bf8dc499132caee071b41d81ff91b8ce21aa2f282cbf52389f239afe1490890be21f9d808b3d70b97efd59c0b60e466088bb42714f212bc90db7e942ebcee60e7b107fff44fb3564ff07d6d02850215fd357d897c4d32bef8661689f2d84ff897637fb6d5568a7270e783426b74b7037493e5155fd7cb3ddddfd36bd8a9c877d71d2a966057c08263d2939c84987 -Result = Pass - -Digest = SHA256 -Key = 308204a40201000282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201000997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8d33f10324c55956141891e45b84b49f59ea5bfac6ffa38900aca5099afcd02f6a8257c41ce5bb2e4153832b5c22f91eb389fa2035c3cf9b3374531c483cb30ceb007259b1d02818100d95c0995fabdfcbccfe63e0f3262f806869ab571e1793e97234cbb9bd4b6872a7695389955cf6ce7245345a5df8021f7d9519563afbc2667f5311fad093de2c02cd069109b630d68e3bf767f8a788a6add7ab199f2d8f6a40b7c1910d9dab52ac80d0d333aacab321a9309dc884ddd4db637a0c1115ae3c08efa683f99eb733102818100d4f7ef9f9be947ba9d1b3bce59e5608839a1e464553e1b6d113d0f636758bbb473a89f9949836ead40b6f314eee3ac2244d7b6f379e83f30e17783ad68d5086897889c051c26e1558a4a220bfc242995860644b5d7a3ef513ac612b9c6c0a2021bb6b9cde7dbd21fe5858746c79563e9bab7d06b43aab43a0a5cafab4519a6610281803db2386f174f2ea3ef4b6bd1601749ce2d6afa8be35f051178621f16a23ad36eba03c073136389241969e5b87edb0fcbcf1a0bd6e1aee97bae1f2d97aabe19b17dbe7d9492cdb68a0897f572350e846c669660dc978c5068da598524fca8a136358d3e5f8f6ad5cf78d9089c93f473189162ce0f8c4902a19902b633b3e6926d02818100ddc971183dcf3450c43e06ba2af32379eedeb2d678513fb706b75a006098154041f4b09e6be385d4b25d80ec241c899e4a986a17b0a121daab91a1e4fc5a1802a7074df3fb3f7661f0e1c97799e36d21de937cc4209585db30a56af0a228e001036ed792625e5368ce101574a2e9767f07338949f0afdf358cecd18c6d6f3f55 -Msg = 61d7b3150131351e7b4c8e5645d38be9335b40289af34cc6b6fc5e48493bf8b7852c73982c99441ef66c7d9d33c29742b1406e02e0aa8dd034b1ac13cb0d775750cc91421fead9caa921eca61a02eb023a457e77915e183acf517d946bc68292896014fd214b7c8c5e14e15944be0f9296127771f736766e4f81dab3708ea2d0 -Sig = 84e92a145ae6be1ff9242d9ed2d68de668e802524e8ac0a79de62fe74048c35491fd2ffdb185057e666dbfaac84c34fde7891263f8b2bc74746230320f67a7bd7319c9b9de4190547014e2d7a2a5060d6200aadc3a44bac029ff3992edd30ec53ab0d9123eaa6b147352a073a98161e64f394bb99492c6977e24f445c7125bfb90f87faf262272134acb18823a99a5228d1495463297fd774877fb63d4918106347e6f29315e48363f39b33299eaa32d8da71b229d8ffee5f66f722ad3aa4175d3f84ece9cc8eca8d6f2f356a85c1524896c18f7b5c8f9bcdef45c496d539179891ddc76e5208ad8353d48c624054f3440eeba4432a10654a11ef53783bd116f -Result = Pass - -Digest = SHA256 -Key = 308204a40201000282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201000997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8d33f10324c55956141891e45b84b49f59ea5bfac6ffa38900aca5099afcd02f6a8257c41ce5bb2e4153832b5c22f91eb389fa2035c3cf9b3374531c483cb30ceb007259b1d02818100d95c0995fabdfcbccfe63e0f3262f806869ab571e1793e97234cbb9bd4b6872a7695389955cf6ce7245345a5df8021f7d9519563afbc2667f5311fad093de2c02cd069109b630d68e3bf767f8a788a6add7ab199f2d8f6a40b7c1910d9dab52ac80d0d333aacab321a9309dc884ddd4db637a0c1115ae3c08efa683f99eb733102818100d4f7ef9f9be947ba9d1b3bce59e5608839a1e464553e1b6d113d0f636758bbb473a89f9949836ead40b6f314eee3ac2244d7b6f379e83f30e17783ad68d5086897889c051c26e1558a4a220bfc242995860644b5d7a3ef513ac612b9c6c0a2021bb6b9cde7dbd21fe5858746c79563e9bab7d06b43aab43a0a5cafab4519a6610281803db2386f174f2ea3ef4b6bd1601749ce2d6afa8be35f051178621f16a23ad36eba03c073136389241969e5b87edb0fcbcf1a0bd6e1aee97bae1f2d97aabe19b17dbe7d9492cdb68a0897f572350e846c669660dc978c5068da598524fca8a136358d3e5f8f6ad5cf78d9089c93f473189162ce0f8c4902a19902b633b3e6926d02818100ddc971183dcf3450c43e06ba2af32379eedeb2d678513fb706b75a006098154041f4b09e6be385d4b25d80ec241c899e4a986a17b0a121daab91a1e4fc5a1802a7074df3fb3f7661f0e1c97799e36d21de937cc4209585db30a56af0a228e001036ed792625e5368ce101574a2e9767f07338949f0afdf358cecd18c6d6f3f55 -Msg = b6771ab0e128b41b32b8b05e05add23ce0fb877b40bfcc3b992f4c8698d1c828abecbcc1c33d401859ea2cb2afbc7fa4588802a5faee2867534639287ad8af84674be18db661de1da8e19c6b6bd452dd9bf3221d0861fb6fba96be42329b9f04f37dcf3b41fc58d2298348b0c15d1190b125300cf27e0dfad60522fc49846053 -Sig = 6276925568626f0cbe6f5150b050e1702582f8daf99a6f880ef75cd96c2d4208fb6e91b01ba6aba2a816b2d3cb975df850b1d268c4662dd1ea3a300c1d7171c633dd2efbac3000c56ab80f989dbc18243e636ba5d4d26a7d3f1965ad3cb0f1a8513f998003f7b67e2ac5c718cb688b3201d56e68f0b9f86257b84794cdffbc1fe3ea24b7bb6e9ef0539bd4fbc1afb55bc1dca39996ea8a63769f6e225707f69047555e1a4ef3c639c5f2a497b889424a90148639bb64df0a06e0b7f0e8ed466a977baca32f482337b2abe3983eaec3fe1075016e5867521760fd0607d799f1766b3ff6e2ae155d69250f8bf08c8edca0b4f31d0f838cfd298cb7312df93f0997 -Result = Pass - -Digest = SHA256 -Key = 308204a40201000282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201000997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8d33f10324c55956141891e45b84b49f59ea5bfac6ffa38900aca5099afcd02f6a8257c41ce5bb2e4153832b5c22f91eb389fa2035c3cf9b3374531c483cb30ceb007259b1d02818100d95c0995fabdfcbccfe63e0f3262f806869ab571e1793e97234cbb9bd4b6872a7695389955cf6ce7245345a5df8021f7d9519563afbc2667f5311fad093de2c02cd069109b630d68e3bf767f8a788a6add7ab199f2d8f6a40b7c1910d9dab52ac80d0d333aacab321a9309dc884ddd4db637a0c1115ae3c08efa683f99eb733102818100d4f7ef9f9be947ba9d1b3bce59e5608839a1e464553e1b6d113d0f636758bbb473a89f9949836ead40b6f314eee3ac2244d7b6f379e83f30e17783ad68d5086897889c051c26e1558a4a220bfc242995860644b5d7a3ef513ac612b9c6c0a2021bb6b9cde7dbd21fe5858746c79563e9bab7d06b43aab43a0a5cafab4519a6610281803db2386f174f2ea3ef4b6bd1601749ce2d6afa8be35f051178621f16a23ad36eba03c073136389241969e5b87edb0fcbcf1a0bd6e1aee97bae1f2d97aabe19b17dbe7d9492cdb68a0897f572350e846c669660dc978c5068da598524fca8a136358d3e5f8f6ad5cf78d9089c93f473189162ce0f8c4902a19902b633b3e6926d02818100ddc971183dcf3450c43e06ba2af32379eedeb2d678513fb706b75a006098154041f4b09e6be385d4b25d80ec241c899e4a986a17b0a121daab91a1e4fc5a1802a7074df3fb3f7661f0e1c97799e36d21de937cc4209585db30a56af0a228e001036ed792625e5368ce101574a2e9767f07338949f0afdf358cecd18c6d6f3f55 -Msg = 6a81cb6c7b268f4b9fb9172adbbb36a237a0dcf1c3c83a95dcb0271aac6ac330f04a5a00fee38bc00631a98598186159660d9d8e4c14a9528dea94836083dac4abb73fd00e38fe0e23c7236604a736540e52193ae56c33fbb8f5cfc5c7c2be2e222e4483b30d325c7ee14f742851fcb8b6d6189e98b822b8e6399d89e90fb997 -Sig = b67991050c083e645097db03fff34758868beb19e9c0c48475f0f913361e71d3d6f27a8c4f0b269b49e8534039e53ad3bab9a3e62abe078ee75e7fb5959006fbfb014ca7b81b3d5afe0ee5f6fc2dfbc450f2839543002f33f4f354f827278c76c041686eea7886ebb2a7afa5995c6cddb1c0b58066ddb8dc54a6927c146c3b2a0fa7cef28903c6c672bc20ef68ffbfab247eb688ab4bde7106d9c59d2153096dc9e5207267038d88e2174e76adc1508ae24eb602332e53c0c2e33154a66a97a0f12f66c61258c7bf6bbf3f1dcbe9caf2fd30ec68c0a9d09f4fd776304b540e62fc8512beaabc4be2107a1ec18e87f61f9db25e871dc0693cef17c2a687fc854f -Result = Pass - -Digest = SHA256 -Key = 308204a40201000282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201000997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8d33f10324c55956141891e45b84b49f59ea5bfac6ffa38900aca5099afcd02f6a8257c41ce5bb2e4153832b5c22f91eb389fa2035c3cf9b3374531c483cb30ceb007259b1d02818100d95c0995fabdfcbccfe63e0f3262f806869ab571e1793e97234cbb9bd4b6872a7695389955cf6ce7245345a5df8021f7d9519563afbc2667f5311fad093de2c02cd069109b630d68e3bf767f8a788a6add7ab199f2d8f6a40b7c1910d9dab52ac80d0d333aacab321a9309dc884ddd4db637a0c1115ae3c08efa683f99eb733102818100d4f7ef9f9be947ba9d1b3bce59e5608839a1e464553e1b6d113d0f636758bbb473a89f9949836ead40b6f314eee3ac2244d7b6f379e83f30e17783ad68d5086897889c051c26e1558a4a220bfc242995860644b5d7a3ef513ac612b9c6c0a2021bb6b9cde7dbd21fe5858746c79563e9bab7d06b43aab43a0a5cafab4519a6610281803db2386f174f2ea3ef4b6bd1601749ce2d6afa8be35f051178621f16a23ad36eba03c073136389241969e5b87edb0fcbcf1a0bd6e1aee97bae1f2d97aabe19b17dbe7d9492cdb68a0897f572350e846c669660dc978c5068da598524fca8a136358d3e5f8f6ad5cf78d9089c93f473189162ce0f8c4902a19902b633b3e6926d02818100ddc971183dcf3450c43e06ba2af32379eedeb2d678513fb706b75a006098154041f4b09e6be385d4b25d80ec241c899e4a986a17b0a121daab91a1e4fc5a1802a7074df3fb3f7661f0e1c97799e36d21de937cc4209585db30a56af0a228e001036ed792625e5368ce101574a2e9767f07338949f0afdf358cecd18c6d6f3f55 -Msg = 056c1e4644599e3183dd8d2f64e4bb2352ff00d012ab763f9ad6e560279f7ff38a5ecea9c2e4ea87d004ef8cc752ae93232aa37b5bf42884baa7e7fc6a8c951cd245de2d220d9bee2b414b3a7520c1e68bcf1ae99a9ff2bf3a93d80f8c1dfe8b85293517895c192e3c9e898295d65be334f44d62f5353eb6c5a29edfb4db2309 -Sig = ae05204e409d727eb9e4dc24be8f863328c2813da4fcef28866e21a5dab21a485321b735274af06bf17e271518e11164d722ab073548f02e1b441923db6f1cee65a017edfbaf3361c67fbc2b39fe038cb5cb65a640f95887389ce8a5ad2ec6e69d3d603505b025f6d6330c8b648802caf7e6fa3fe7b38141659986cb89e6232f106222564d5e5195eda6a25f99068572c2fafe97f147f7f2f4119f21385af1fced97f78632d8bf4fd9a9054d8b9aa2a9f4ded587847a91d42c6391125f103ae288547e8489693ae8686b84891b772b10c4796883f66cd459a8c1a6a4187bd6b387d349e92d7b604953727c9e9fdc449e7345e7ca6b339e26b086f5548898cbe9 -Result = Pass - -Digest = SHA256 -Key = 308204a40201000282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201000997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8d33f10324c55956141891e45b84b49f59ea5bfac6ffa38900aca5099afcd02f6a8257c41ce5bb2e4153832b5c22f91eb389fa2035c3cf9b3374531c483cb30ceb007259b1d02818100d95c0995fabdfcbccfe63e0f3262f806869ab571e1793e97234cbb9bd4b6872a7695389955cf6ce7245345a5df8021f7d9519563afbc2667f5311fad093de2c02cd069109b630d68e3bf767f8a788a6add7ab199f2d8f6a40b7c1910d9dab52ac80d0d333aacab321a9309dc884ddd4db637a0c1115ae3c08efa683f99eb733102818100d4f7ef9f9be947ba9d1b3bce59e5608839a1e464553e1b6d113d0f636758bbb473a89f9949836ead40b6f314eee3ac2244d7b6f379e83f30e17783ad68d5086897889c051c26e1558a4a220bfc242995860644b5d7a3ef513ac612b9c6c0a2021bb6b9cde7dbd21fe5858746c79563e9bab7d06b43aab43a0a5cafab4519a6610281803db2386f174f2ea3ef4b6bd1601749ce2d6afa8be35f051178621f16a23ad36eba03c073136389241969e5b87edb0fcbcf1a0bd6e1aee97bae1f2d97aabe19b17dbe7d9492cdb68a0897f572350e846c669660dc978c5068da598524fca8a136358d3e5f8f6ad5cf78d9089c93f473189162ce0f8c4902a19902b633b3e6926d02818100ddc971183dcf3450c43e06ba2af32379eedeb2d678513fb706b75a006098154041f4b09e6be385d4b25d80ec241c899e4a986a17b0a121daab91a1e4fc5a1802a7074df3fb3f7661f0e1c97799e36d21de937cc4209585db30a56af0a228e001036ed792625e5368ce101574a2e9767f07338949f0afdf358cecd18c6d6f3f55 -Msg = cec5c9b6f84497ac327f68ef886641fec995178b307192304374115efcc5ee96270c03db0b846d674c528f9d10155a3f61becce1d3a2b79d66cdc409ad99b7663080f51a102f4361e9dbd03ffcd876b98e683d448bd1217e6fb2151c66964723b2caa65c4e6ca201d1c532bd94d91cd4173b719da126563927ca0a7f6fe42536 -Sig = c48a8e01d4bbfe0f2f05659337ea71d21f38d7f7a10b00b06e1f899eaf40a8e97ead64bca37f13a55ef1cf3fb52cee279cdcb096085a467afa97b03d78d6076e472b12d6be9647cec32d8d91a26247693771687460ba5269de18e1edef6022533a9579f91d584f9e0cee1100c447b77576b1b4ee163ed4700147a9aa61bdc4e2316d2d818c1028ed1c3e372c9f6a1745572444637248091b83f7b539f9bd58b7675676034c20e4ca119b91c4ca5dc76acbff3d0462898352c591c2ca6f2d8b09e2e6338a84336e06f0cc020e9eb8da785889b497f3b98e827ee7a7d3f1b0b73c1958e16aa97861e6675970ce31d9d119bb340be80fd0f43c3dbe64f2a59d629d -Result = Pass - -Digest = SHA256 -Key = 308204a40201000282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201000997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8d33f10324c55956141891e45b84b49f59ea5bfac6ffa38900aca5099afcd02f6a8257c41ce5bb2e4153832b5c22f91eb389fa2035c3cf9b3374531c483cb30ceb007259b1d02818100d95c0995fabdfcbccfe63e0f3262f806869ab571e1793e97234cbb9bd4b6872a7695389955cf6ce7245345a5df8021f7d9519563afbc2667f5311fad093de2c02cd069109b630d68e3bf767f8a788a6add7ab199f2d8f6a40b7c1910d9dab52ac80d0d333aacab321a9309dc884ddd4db637a0c1115ae3c08efa683f99eb733102818100d4f7ef9f9be947ba9d1b3bce59e5608839a1e464553e1b6d113d0f636758bbb473a89f9949836ead40b6f314eee3ac2244d7b6f379e83f30e17783ad68d5086897889c051c26e1558a4a220bfc242995860644b5d7a3ef513ac612b9c6c0a2021bb6b9cde7dbd21fe5858746c79563e9bab7d06b43aab43a0a5cafab4519a6610281803db2386f174f2ea3ef4b6bd1601749ce2d6afa8be35f051178621f16a23ad36eba03c073136389241969e5b87edb0fcbcf1a0bd6e1aee97bae1f2d97aabe19b17dbe7d9492cdb68a0897f572350e846c669660dc978c5068da598524fca8a136358d3e5f8f6ad5cf78d9089c93f473189162ce0f8c4902a19902b633b3e6926d02818100ddc971183dcf3450c43e06ba2af32379eedeb2d678513fb706b75a006098154041f4b09e6be385d4b25d80ec241c899e4a986a17b0a121daab91a1e4fc5a1802a7074df3fb3f7661f0e1c97799e36d21de937cc4209585db30a56af0a228e001036ed792625e5368ce101574a2e9767f07338949f0afdf358cecd18c6d6f3f55 -Msg = 9193f8b914dfe0e62521f35afa4fa5d42835e198af673809377a3e7a99733142a180dc0e13e6bb7ceb3b60e5e9d515794d82c392e07913423391d22e2bb19aa0bd88afd7f77e27a240ea4e2de085481ac31ff8d37990211f82f2cbf4c90de98d6e1338bbc88e6a80ab9684dae64785dd107248048593abc9ab03f1737a6f6530 -Sig = 5c2fe453a8b08c90b02eb2c9994242d518f3f21b368895cffd624050e48aa714005ae675fe79aa3cadd4df55bdf12bec5be8a41d87538f7e031b782e34d392468e5f14bc613b8f4d28c8fb79a2537e1e601031da720acd7b2c8dcbe9858624a7a9a92a06f91845f732370d67365c6464f7b68f22eb3edfeec97e3285024d7f6943b6d50a16cc96d60f680351deaa25f0bc868948607a6ba7f1949b85943c6a92bd6172e81bcc055014b78a733972e3f39d14099d1607a20ff8681c29ae1ef99ef115ed6a1084b514b81a69d4a15ce1e2576fdcf2b2af615b52fec70132112dcc5bc19ec17f32281460623420317353e8a255fda502bd1fb11a58832ae2c04f9a -Result = Pass - -Digest = SHA256 -Key = 308204a40201000282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201000997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8d33f10324c55956141891e45b84b49f59ea5bfac6ffa38900aca5099afcd02f6a8257c41ce5bb2e4153832b5c22f91eb389fa2035c3cf9b3374531c483cb30ceb007259b1d02818100d95c0995fabdfcbccfe63e0f3262f806869ab571e1793e97234cbb9bd4b6872a7695389955cf6ce7245345a5df8021f7d9519563afbc2667f5311fad093de2c02cd069109b630d68e3bf767f8a788a6add7ab199f2d8f6a40b7c1910d9dab52ac80d0d333aacab321a9309dc884ddd4db637a0c1115ae3c08efa683f99eb733102818100d4f7ef9f9be947ba9d1b3bce59e5608839a1e464553e1b6d113d0f636758bbb473a89f9949836ead40b6f314eee3ac2244d7b6f379e83f30e17783ad68d5086897889c051c26e1558a4a220bfc242995860644b5d7a3ef513ac612b9c6c0a2021bb6b9cde7dbd21fe5858746c79563e9bab7d06b43aab43a0a5cafab4519a6610281803db2386f174f2ea3ef4b6bd1601749ce2d6afa8be35f051178621f16a23ad36eba03c073136389241969e5b87edb0fcbcf1a0bd6e1aee97bae1f2d97aabe19b17dbe7d9492cdb68a0897f572350e846c669660dc978c5068da598524fca8a136358d3e5f8f6ad5cf78d9089c93f473189162ce0f8c4902a19902b633b3e6926d02818100ddc971183dcf3450c43e06ba2af32379eedeb2d678513fb706b75a006098154041f4b09e6be385d4b25d80ec241c899e4a986a17b0a121daab91a1e4fc5a1802a7074df3fb3f7661f0e1c97799e36d21de937cc4209585db30a56af0a228e001036ed792625e5368ce101574a2e9767f07338949f0afdf358cecd18c6d6f3f55 -Msg = 0e57ef40b021bf87f642c5756b6515a0e06c15a01856d716c566a6edb381dfdf44d9033b1cc809e61dfef9a096dfb689b7271be449d04a1a9c354102c077af5ff72005ab6b06cf131d7345c21e821d6201cca4e090440d70be6009d2dd7a98d311751e1605a3b914dce6d2626b16f233a5a3d71d567cc820152f25e473514242 -Sig = 7643aa3fe63e66f79d6b409d145ea820c9f7356f71b4acdcbd43fe1e99f8802cd1662b16240f5cfd94a769b0b3f2cb0b11887e886e5ba43733367490b3fc188f2fb3a0c0c8a68b5d2726c8f7a31902b6b86cd402287d385c3e3c06503ce17fd6e54e582f4a907a91f952d2a360e2fba00028e4d3b02aabf7d220b31d1f8ee7faa070147682ccc8bcc756ca6a68fc20954550c317e87918781a3d1f1923503091090c3c60ca1c0b1c699906fbf85aa70ad9ae48709ff743b82dcc31074cfcea623ea45e48644b19a21772ca107ed64239c56574a087f1a6aadf0f4b00ffe581c1410274c875e4599063e46e5168803f0d28d21fcd3509b4c6222995add7753bf3 -Result = Pass - -Digest = SHA256 -Key = 308204a40201000282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201000997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8d33f10324c55956141891e45b84b49f59ea5bfac6ffa38900aca5099afcd02f6a8257c41ce5bb2e4153832b5c22f91eb389fa2035c3cf9b3374531c483cb30ceb007259b1d02818100d95c0995fabdfcbccfe63e0f3262f806869ab571e1793e97234cbb9bd4b6872a7695389955cf6ce7245345a5df8021f7d9519563afbc2667f5311fad093de2c02cd069109b630d68e3bf767f8a788a6add7ab199f2d8f6a40b7c1910d9dab52ac80d0d333aacab321a9309dc884ddd4db637a0c1115ae3c08efa683f99eb733102818100d4f7ef9f9be947ba9d1b3bce59e5608839a1e464553e1b6d113d0f636758bbb473a89f9949836ead40b6f314eee3ac2244d7b6f379e83f30e17783ad68d5086897889c051c26e1558a4a220bfc242995860644b5d7a3ef513ac612b9c6c0a2021bb6b9cde7dbd21fe5858746c79563e9bab7d06b43aab43a0a5cafab4519a6610281803db2386f174f2ea3ef4b6bd1601749ce2d6afa8be35f051178621f16a23ad36eba03c073136389241969e5b87edb0fcbcf1a0bd6e1aee97bae1f2d97aabe19b17dbe7d9492cdb68a0897f572350e846c669660dc978c5068da598524fca8a136358d3e5f8f6ad5cf78d9089c93f473189162ce0f8c4902a19902b633b3e6926d02818100ddc971183dcf3450c43e06ba2af32379eedeb2d678513fb706b75a006098154041f4b09e6be385d4b25d80ec241c899e4a986a17b0a121daab91a1e4fc5a1802a7074df3fb3f7661f0e1c97799e36d21de937cc4209585db30a56af0a228e001036ed792625e5368ce101574a2e9767f07338949f0afdf358cecd18c6d6f3f55 -Msg = 0c8491fc348d341fe85c46a56115f26035c59e6a2be765c44e2ec83d407ea096d13b57e3d0c758342246c47510a56793e5daeae1b96d4ab988378966876aa341b7d1c31bba59b7dbe6d1a16898eef0caca928f8ce84d5c64e025dc1679922d95e5cd3c6b994a385c5c8346469ef8764c0c74f5336191850c7f7e2b14be0027d8 -Sig = cacc8d9f5ecd34c143488461135c4951676145c6e472b92f12f758046f172142fa388f285f3fff068242028829047e248059ed4fd39d2c5ade469dc7c39345e5114950d2031cc7465fe712c4041d05c756d3f2d88a46ceb99f2e24a52e958a03cd2519a9b137e62d5ca2b353f7b047b625c3602313fdb53c8db23d83951a599db328fedc4ae06da89ce7f56259b5c8222f7bd3d9740478fd28e5810db78aee8623fdd39f603f8ddf98081d7873980c4eb0e22a9cd408f7c4134c12d2049a2d120f4b62e6b382b997fc375ef7ac955fcf80b045c3d6385ff422dad350c68870539068a162a2edbb93ceefed9677939b90bd3dfa0dc053460b4e2332efa692179a -Result = Pass - -Digest = SHA384 -Key = 308204a40201000282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201000997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8d33f10324c55956141891e45b84b49f59ea5bfac6ffa38900aca5099afcd02f6a8257c41ce5bb2e4153832b5c22f91eb389fa2035c3cf9b3374531c483cb30ceb007259b1d02818100d95c0995fabdfcbccfe63e0f3262f806869ab571e1793e97234cbb9bd4b6872a7695389955cf6ce7245345a5df8021f7d9519563afbc2667f5311fad093de2c02cd069109b630d68e3bf767f8a788a6add7ab199f2d8f6a40b7c1910d9dab52ac80d0d333aacab321a9309dc884ddd4db637a0c1115ae3c08efa683f99eb733102818100d4f7ef9f9be947ba9d1b3bce59e5608839a1e464553e1b6d113d0f636758bbb473a89f9949836ead40b6f314eee3ac2244d7b6f379e83f30e17783ad68d5086897889c051c26e1558a4a220bfc242995860644b5d7a3ef513ac612b9c6c0a2021bb6b9cde7dbd21fe5858746c79563e9bab7d06b43aab43a0a5cafab4519a6610281803db2386f174f2ea3ef4b6bd1601749ce2d6afa8be35f051178621f16a23ad36eba03c073136389241969e5b87edb0fcbcf1a0bd6e1aee97bae1f2d97aabe19b17dbe7d9492cdb68a0897f572350e846c669660dc978c5068da598524fca8a136358d3e5f8f6ad5cf78d9089c93f473189162ce0f8c4902a19902b633b3e6926d02818100ddc971183dcf3450c43e06ba2af32379eedeb2d678513fb706b75a006098154041f4b09e6be385d4b25d80ec241c899e4a986a17b0a121daab91a1e4fc5a1802a7074df3fb3f7661f0e1c97799e36d21de937cc4209585db30a56af0a228e001036ed792625e5368ce101574a2e9767f07338949f0afdf358cecd18c6d6f3f55 -Msg = 6cd59fdd3efd893d091afdc3155d354f10d6d88167427a2cf7246207e51791a6ca6200a914cd2834a9b3c79fcd59e26e457e0683bc33d49267edbdd6e5d90902696f1e7b1a4affc4ba371339868c28015ebbb73e262669866c35db974ba69e468f2583b9191d15d686cd66fb0b9e0ff0a3b4721a6dc342f14f2446b4e028595b -Sig = 3974900bec3fcb081f0e5a299adf30d087aabaa633911410e87a4979bbe3fa80c3abcf221686399a49bc2f1e5ac40c35df1700e4b9cb7c805a896646573f4a570a9704d2a2e6baee4b43d916906884ad3cf283529ea265e8fcb5cc1bdf7b7dee85941e4b4fb25c1fc7b951fb129ab393cb069be271c1d954da3c43674309f1d212826fabb8e812de2d53d12597de040d32cb28c9f813159cb18c1b51f7a874cbf229cc222caeb98e35ec5e4bf5c5e22cc8528631f15117e8c2be6eac91f4070eecdd07ecc6db6c46eaa65f472f2006988efef0b51c538c6e04d7519c8e3da4b172b1e2761089ed3ad1197992ef37c168dc881c8b5f8bbfee919f7c7afd25b8fc -Result = Pass - -Digest = SHA384 -Key = 308204a40201000282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201000997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8d33f10324c55956141891e45b84b49f59ea5bfac6ffa38900aca5099afcd02f6a8257c41ce5bb2e4153832b5c22f91eb389fa2035c3cf9b3374531c483cb30ceb007259b1d02818100d95c0995fabdfcbccfe63e0f3262f806869ab571e1793e97234cbb9bd4b6872a7695389955cf6ce7245345a5df8021f7d9519563afbc2667f5311fad093de2c02cd069109b630d68e3bf767f8a788a6add7ab199f2d8f6a40b7c1910d9dab52ac80d0d333aacab321a9309dc884ddd4db637a0c1115ae3c08efa683f99eb733102818100d4f7ef9f9be947ba9d1b3bce59e5608839a1e464553e1b6d113d0f636758bbb473a89f9949836ead40b6f314eee3ac2244d7b6f379e83f30e17783ad68d5086897889c051c26e1558a4a220bfc242995860644b5d7a3ef513ac612b9c6c0a2021bb6b9cde7dbd21fe5858746c79563e9bab7d06b43aab43a0a5cafab4519a6610281803db2386f174f2ea3ef4b6bd1601749ce2d6afa8be35f051178621f16a23ad36eba03c073136389241969e5b87edb0fcbcf1a0bd6e1aee97bae1f2d97aabe19b17dbe7d9492cdb68a0897f572350e846c669660dc978c5068da598524fca8a136358d3e5f8f6ad5cf78d9089c93f473189162ce0f8c4902a19902b633b3e6926d02818100ddc971183dcf3450c43e06ba2af32379eedeb2d678513fb706b75a006098154041f4b09e6be385d4b25d80ec241c899e4a986a17b0a121daab91a1e4fc5a1802a7074df3fb3f7661f0e1c97799e36d21de937cc4209585db30a56af0a228e001036ed792625e5368ce101574a2e9767f07338949f0afdf358cecd18c6d6f3f55 -Msg = acb30be9092b2f18f25934a0d678b6bcd6b67c2b88e75884f47b4fcae3adfa405afe2c7e61e2d6c508b92790ac00f76b77c965082668bf900f70a33762de6413af93af2ea8086fda293ded4475f23c4cc31ad494f98d7dd7b7fd6f7d972bb76cb35adc206804c3fe5acdd0e5b8b54e07c29111f788bc5902f40afac30afdbaf2 -Sig = b5c60d8da9b3943878cb2359cf65e4817c0794f950453ca77c81a5a1c1585591aa50a67468e3b399e4faf1d606bea0d9e6cc1d2d70db8063739e0c27d3dc9f9afe88dea52e73298a07d05c7d9707002efa537c389e38bd37bca74eb0af6261a5da06136202c8ad487eebd50bef74767089c70870be1d8fab9156f9fdbc2f2e9cc330a95018ce7943984becc25621bfa66018ef8320b60059f941156e9cdd87ff0d82cf7be77465e0203e7120aaeced84abd8186947d4ac3daf3f993902aec47c3090475c857b5d359f0a5572d4688e5a76a4653868ff54ce9f999e6bb559d1c11c67c15be9d7fe5f8c1704301d055f3d2907722779d6012036084e950de36f4f -Result = Pass - -Digest = SHA384 -Key = 308204a40201000282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201000997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8d33f10324c55956141891e45b84b49f59ea5bfac6ffa38900aca5099afcd02f6a8257c41ce5bb2e4153832b5c22f91eb389fa2035c3cf9b3374531c483cb30ceb007259b1d02818100d95c0995fabdfcbccfe63e0f3262f806869ab571e1793e97234cbb9bd4b6872a7695389955cf6ce7245345a5df8021f7d9519563afbc2667f5311fad093de2c02cd069109b630d68e3bf767f8a788a6add7ab199f2d8f6a40b7c1910d9dab52ac80d0d333aacab321a9309dc884ddd4db637a0c1115ae3c08efa683f99eb733102818100d4f7ef9f9be947ba9d1b3bce59e5608839a1e464553e1b6d113d0f636758bbb473a89f9949836ead40b6f314eee3ac2244d7b6f379e83f30e17783ad68d5086897889c051c26e1558a4a220bfc242995860644b5d7a3ef513ac612b9c6c0a2021bb6b9cde7dbd21fe5858746c79563e9bab7d06b43aab43a0a5cafab4519a6610281803db2386f174f2ea3ef4b6bd1601749ce2d6afa8be35f051178621f16a23ad36eba03c073136389241969e5b87edb0fcbcf1a0bd6e1aee97bae1f2d97aabe19b17dbe7d9492cdb68a0897f572350e846c669660dc978c5068da598524fca8a136358d3e5f8f6ad5cf78d9089c93f473189162ce0f8c4902a19902b633b3e6926d02818100ddc971183dcf3450c43e06ba2af32379eedeb2d678513fb706b75a006098154041f4b09e6be385d4b25d80ec241c899e4a986a17b0a121daab91a1e4fc5a1802a7074df3fb3f7661f0e1c97799e36d21de937cc4209585db30a56af0a228e001036ed792625e5368ce101574a2e9767f07338949f0afdf358cecd18c6d6f3f55 -Msg = 601a6aad3faa7988d5ae528a6969031b10a6f39216946aa89fd4532c8ed141f9a650b126ef488f7c5cf3fb2daa254cc28bdd55560419e80214ef999896dac4946852d24fcd9fb77610eebfbb6ba58bca26f4567f03ac7e56da553f23817bc103ee485592a058fb5e3bc8299c7290c71a29137e75dbf5328c3a2dcd34165b3f2e -Sig = 301d60d56576f3663a7fbe8036bbe4fbc0fbd82cd6a42e36d7bbc8b206543dc2d56d3198e7911ad138cad222dd99050dd1f85fe19c8a88bf67135e7f8f11b5f5e485c91fc7d478069b72f46ebcdcf2d2ae7de6ac8fe53bb6c04911d122cc231dc210b2147ebe8b052e8b2ccc09f338b349de2025cc87b2619a7b163347ca66a34791a2e46b4e2ac57eb9f6029cdbe024e896d57f7d0491f7783312f8f06c790770150cd139f61fd2b3e7041b37261c6e7ea86d4e06d9300b1a5667cb0288c550b2afb355944834b461cead13794276bb46e5e20aec7b63aaca4d491a500facd59a37c52779cf467d74af1e62b1ebe0fd0be1cacb7ce6d050d86e4eb76cde0693 -Result = Pass - -Digest = SHA384 -Key = 308204a40201000282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201000997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8d33f10324c55956141891e45b84b49f59ea5bfac6ffa38900aca5099afcd02f6a8257c41ce5bb2e4153832b5c22f91eb389fa2035c3cf9b3374531c483cb30ceb007259b1d02818100d95c0995fabdfcbccfe63e0f3262f806869ab571e1793e97234cbb9bd4b6872a7695389955cf6ce7245345a5df8021f7d9519563afbc2667f5311fad093de2c02cd069109b630d68e3bf767f8a788a6add7ab199f2d8f6a40b7c1910d9dab52ac80d0d333aacab321a9309dc884ddd4db637a0c1115ae3c08efa683f99eb733102818100d4f7ef9f9be947ba9d1b3bce59e5608839a1e464553e1b6d113d0f636758bbb473a89f9949836ead40b6f314eee3ac2244d7b6f379e83f30e17783ad68d5086897889c051c26e1558a4a220bfc242995860644b5d7a3ef513ac612b9c6c0a2021bb6b9cde7dbd21fe5858746c79563e9bab7d06b43aab43a0a5cafab4519a6610281803db2386f174f2ea3ef4b6bd1601749ce2d6afa8be35f051178621f16a23ad36eba03c073136389241969e5b87edb0fcbcf1a0bd6e1aee97bae1f2d97aabe19b17dbe7d9492cdb68a0897f572350e846c669660dc978c5068da598524fca8a136358d3e5f8f6ad5cf78d9089c93f473189162ce0f8c4902a19902b633b3e6926d02818100ddc971183dcf3450c43e06ba2af32379eedeb2d678513fb706b75a006098154041f4b09e6be385d4b25d80ec241c899e4a986a17b0a121daab91a1e4fc5a1802a7074df3fb3f7661f0e1c97799e36d21de937cc4209585db30a56af0a228e001036ed792625e5368ce101574a2e9767f07338949f0afdf358cecd18c6d6f3f55 -Msg = 44d3e0fc90100a1c9316063f26b180326cc2e3834ce56e4324528a0bbb015b3d7812958cd26b91bf08a3a0b1121f9f9dd77acb98a02ad75fcd613c53c732d1c235f59b6873ece6363f279452b6a4b65e80bb59fd47b9a2936dcc1e4dfe1f5362e3459b9859db3209a2698d27fa8aedfecd4d35b927daf8686c59d700490f0aa3 -Sig = af2229e94a857b89e0e890daca3a8fe12ebdba04948d1883a7d7816a3b682f7da3032540a8769f9ccac9586cf24e8c204b45b85d1bdcc5a5450a215b4048ea42983b3456fa8c76c6786e024f705e088d694559d668caa8684cad0fc57850fcaf34e458aee8fad4e09e6f196557d4e8860284d982c0105d98ce4912e96c3550e2a0c7e8bad5abc29a9a542f57a8c60579038067b3d5391abc21b4f9deb024ca58f9b0c38c0d1f82373f528e939bd73a24d501c591168814c872c525db0e56cae47df00fa3728dc3a0976965323ce8d2dee2b138b50ab7afd48495114673e91bb3ed2205e26a8455474c3d4ec8739bbff6df39b2b72ee050410930423b1472b6ed -Result = Pass - -Digest = SHA384 -Key = 308204a40201000282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201000997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8d33f10324c55956141891e45b84b49f59ea5bfac6ffa38900aca5099afcd02f6a8257c41ce5bb2e4153832b5c22f91eb389fa2035c3cf9b3374531c483cb30ceb007259b1d02818100d95c0995fabdfcbccfe63e0f3262f806869ab571e1793e97234cbb9bd4b6872a7695389955cf6ce7245345a5df8021f7d9519563afbc2667f5311fad093de2c02cd069109b630d68e3bf767f8a788a6add7ab199f2d8f6a40b7c1910d9dab52ac80d0d333aacab321a9309dc884ddd4db637a0c1115ae3c08efa683f99eb733102818100d4f7ef9f9be947ba9d1b3bce59e5608839a1e464553e1b6d113d0f636758bbb473a89f9949836ead40b6f314eee3ac2244d7b6f379e83f30e17783ad68d5086897889c051c26e1558a4a220bfc242995860644b5d7a3ef513ac612b9c6c0a2021bb6b9cde7dbd21fe5858746c79563e9bab7d06b43aab43a0a5cafab4519a6610281803db2386f174f2ea3ef4b6bd1601749ce2d6afa8be35f051178621f16a23ad36eba03c073136389241969e5b87edb0fcbcf1a0bd6e1aee97bae1f2d97aabe19b17dbe7d9492cdb68a0897f572350e846c669660dc978c5068da598524fca8a136358d3e5f8f6ad5cf78d9089c93f473189162ce0f8c4902a19902b633b3e6926d02818100ddc971183dcf3450c43e06ba2af32379eedeb2d678513fb706b75a006098154041f4b09e6be385d4b25d80ec241c899e4a986a17b0a121daab91a1e4fc5a1802a7074df3fb3f7661f0e1c97799e36d21de937cc4209585db30a56af0a228e001036ed792625e5368ce101574a2e9767f07338949f0afdf358cecd18c6d6f3f55 -Msg = 5af09077a1f534b89822b26c3272adf8500d3c6bd90f9b5e0d8b211f16d0720ee0eaf6462b6c8a80df6d75359fd19d03a0cafb52bc9d4c37c2aa099911a79a92652cc717f0746fdcad627c72f1c216b243d2175f6d00bf07d3f6aa2a04d4fe9f8fbce93218944b92aa07af6b4fcd80cfde2d7ada15c05e96e777ea1c17df08fc -Sig = a56823fa577e8946f1d2f6e351b738b53592544358528af88807ea4f19017dfe81a3d69f62fbff649550d9b310faf27a041fe624f0a02bdcddb79bfb0a465739ec8b64b748cc29e5a02c777e1826d3e2f1eee6fe2edee4a8bcac519c7c7ca5c039e76d630668945a1e5e8618e235864561a440e73e39f6d6842ad7da64ef5b0ce1c4ab88db157b68107174ad7d5c9a6065068768c11c4c96ff67050b5d07b8cd027fcd0d347ec79a197cf43435985bc1aeb479db0022289e8dd3b31bb7c62d8831cfe6952f41d24f89d753789535f918ff68b36950af6fd31dee1ac476a0cf93afe9f4a766f3c4d2c0c3f92825d5572eb2eb8a2b644e329eea1683f90810ed77 -Result = Pass - -Digest = SHA384 -Key = 308204a40201000282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201000997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8d33f10324c55956141891e45b84b49f59ea5bfac6ffa38900aca5099afcd02f6a8257c41ce5bb2e4153832b5c22f91eb389fa2035c3cf9b3374531c483cb30ceb007259b1d02818100d95c0995fabdfcbccfe63e0f3262f806869ab571e1793e97234cbb9bd4b6872a7695389955cf6ce7245345a5df8021f7d9519563afbc2667f5311fad093de2c02cd069109b630d68e3bf767f8a788a6add7ab199f2d8f6a40b7c1910d9dab52ac80d0d333aacab321a9309dc884ddd4db637a0c1115ae3c08efa683f99eb733102818100d4f7ef9f9be947ba9d1b3bce59e5608839a1e464553e1b6d113d0f636758bbb473a89f9949836ead40b6f314eee3ac2244d7b6f379e83f30e17783ad68d5086897889c051c26e1558a4a220bfc242995860644b5d7a3ef513ac612b9c6c0a2021bb6b9cde7dbd21fe5858746c79563e9bab7d06b43aab43a0a5cafab4519a6610281803db2386f174f2ea3ef4b6bd1601749ce2d6afa8be35f051178621f16a23ad36eba03c073136389241969e5b87edb0fcbcf1a0bd6e1aee97bae1f2d97aabe19b17dbe7d9492cdb68a0897f572350e846c669660dc978c5068da598524fca8a136358d3e5f8f6ad5cf78d9089c93f473189162ce0f8c4902a19902b633b3e6926d02818100ddc971183dcf3450c43e06ba2af32379eedeb2d678513fb706b75a006098154041f4b09e6be385d4b25d80ec241c899e4a986a17b0a121daab91a1e4fc5a1802a7074df3fb3f7661f0e1c97799e36d21de937cc4209585db30a56af0a228e001036ed792625e5368ce101574a2e9767f07338949f0afdf358cecd18c6d6f3f55 -Msg = f60a3a543768fabe37f003009a8c26f7dc91f1422d4429ed7f9d744cdd4b552afef75d241acda04ffc39672159ee248e602dab7192449e2ed4552995c258f00a476346e36a29a0126bc249040faa57c9380bdd74b83f62c56790920574433432f8d65c5cd185e24fad13127265c6a5ef8db4f114493d5cfa61d91664981408e9 -Sig = 08d396481deef18cb0bef7c3e826fe6e5c9ecc85e5230d35d66772b8d2d015d4e5f5794fbe0550df2f745730d6f8d1d3b850d164fce4630805e711b59308f8608506b7e01e8e9294ed8b7e7582165677f180e965169dca81b3daf24d7b92fe32d6a9ac63821d48b1a0a144fc7a04b0bfc63a3bc16a0fd837b02037ed76e50d46cbfa3857e658e370c586ab1eed825076321ac8e82be374bacb295e4d3408f0cc1fc4c300b84275a51c3573e9cabfdbe3dc51e4a6f5811d860d725aaf8fd0af19a2437b0f1c80f5ac222f6b25f1fa09e93399a6976b1b3ca76afe6086e9b232aae6c7b818255bf963f31c04ae3fa2136c0a442997d4cf12f395fb804a4755b56b -Result = Pass - -Digest = SHA384 -Key = 308204a40201000282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201000997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8d33f10324c55956141891e45b84b49f59ea5bfac6ffa38900aca5099afcd02f6a8257c41ce5bb2e4153832b5c22f91eb389fa2035c3cf9b3374531c483cb30ceb007259b1d02818100d95c0995fabdfcbccfe63e0f3262f806869ab571e1793e97234cbb9bd4b6872a7695389955cf6ce7245345a5df8021f7d9519563afbc2667f5311fad093de2c02cd069109b630d68e3bf767f8a788a6add7ab199f2d8f6a40b7c1910d9dab52ac80d0d333aacab321a9309dc884ddd4db637a0c1115ae3c08efa683f99eb733102818100d4f7ef9f9be947ba9d1b3bce59e5608839a1e464553e1b6d113d0f636758bbb473a89f9949836ead40b6f314eee3ac2244d7b6f379e83f30e17783ad68d5086897889c051c26e1558a4a220bfc242995860644b5d7a3ef513ac612b9c6c0a2021bb6b9cde7dbd21fe5858746c79563e9bab7d06b43aab43a0a5cafab4519a6610281803db2386f174f2ea3ef4b6bd1601749ce2d6afa8be35f051178621f16a23ad36eba03c073136389241969e5b87edb0fcbcf1a0bd6e1aee97bae1f2d97aabe19b17dbe7d9492cdb68a0897f572350e846c669660dc978c5068da598524fca8a136358d3e5f8f6ad5cf78d9089c93f473189162ce0f8c4902a19902b633b3e6926d02818100ddc971183dcf3450c43e06ba2af32379eedeb2d678513fb706b75a006098154041f4b09e6be385d4b25d80ec241c899e4a986a17b0a121daab91a1e4fc5a1802a7074df3fb3f7661f0e1c97799e36d21de937cc4209585db30a56af0a228e001036ed792625e5368ce101574a2e9767f07338949f0afdf358cecd18c6d6f3f55 -Msg = 2c07a81de58955b676fec0572d48d1955b4875ff62a44b0010c7a1072b299ee44dd0c076f2178a83d0ae76e767e231f1d81e070afab29c97abd4de2164e437b311f507841f8851d6d69ab51ee9e29e654b54bcee45e9b519c6a21787facb927f1d7d6491926614792fcc6346dcd080bb5cf07bf56ad0fc4e083a358214631510 -Sig = 9aa391e7c2f0e920aac27ed9fc2081d3c9caa3735883d01ad7a7e3b11867d0ad624156477bbbdde659f474682d0d774489e2b5b039d1eb35454c9e3eed78cff9c4262e3aecfca1d817542b486096598e1114bfc03f20a45de36f6df70d144d01dc4866a0f83319e7c2b8530f8c27a41b7add9f692d8a8e646455b67c9ec47a4d2ce3dfe35d6a2e89d9be50c5b6da39bb0254bd23a809ab97b2b48a068a87abde6b6a6e35955fc92a9626f9607d5b3f401517271594bef73859812b6a621ed6bdaf3c5f2a90b1e1680f68dcfccacb65e0081f1ccb6a2073709d1ba067065016ed73ebd7ebe9e7a7b60c8c9dd04a56fab30702c8a6df6a353a301047df4c7aff62 -Result = Pass - -Digest = SHA384 -Key = 308204a40201000282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201000997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8d33f10324c55956141891e45b84b49f59ea5bfac6ffa38900aca5099afcd02f6a8257c41ce5bb2e4153832b5c22f91eb389fa2035c3cf9b3374531c483cb30ceb007259b1d02818100d95c0995fabdfcbccfe63e0f3262f806869ab571e1793e97234cbb9bd4b6872a7695389955cf6ce7245345a5df8021f7d9519563afbc2667f5311fad093de2c02cd069109b630d68e3bf767f8a788a6add7ab199f2d8f6a40b7c1910d9dab52ac80d0d333aacab321a9309dc884ddd4db637a0c1115ae3c08efa683f99eb733102818100d4f7ef9f9be947ba9d1b3bce59e5608839a1e464553e1b6d113d0f636758bbb473a89f9949836ead40b6f314eee3ac2244d7b6f379e83f30e17783ad68d5086897889c051c26e1558a4a220bfc242995860644b5d7a3ef513ac612b9c6c0a2021bb6b9cde7dbd21fe5858746c79563e9bab7d06b43aab43a0a5cafab4519a6610281803db2386f174f2ea3ef4b6bd1601749ce2d6afa8be35f051178621f16a23ad36eba03c073136389241969e5b87edb0fcbcf1a0bd6e1aee97bae1f2d97aabe19b17dbe7d9492cdb68a0897f572350e846c669660dc978c5068da598524fca8a136358d3e5f8f6ad5cf78d9089c93f473189162ce0f8c4902a19902b633b3e6926d02818100ddc971183dcf3450c43e06ba2af32379eedeb2d678513fb706b75a006098154041f4b09e6be385d4b25d80ec241c899e4a986a17b0a121daab91a1e4fc5a1802a7074df3fb3f7661f0e1c97799e36d21de937cc4209585db30a56af0a228e001036ed792625e5368ce101574a2e9767f07338949f0afdf358cecd18c6d6f3f55 -Msg = 35ec92afdbc2fcefe48f1e2f6e4829ae53b3da0459cc4ea8a96818b5831891ee2f506fff37c89906d3233a51a5cf1469a62c185061f033085fca6a54e24529c3d6f0d8e904bcb0f089a5cd50869484da1a84f6fb8de4e53fce3dc714201519d11013f6f6aa64e8b5ec5cfeb27b611f0895059d8c47720d55e00b577ca5500920 -Sig = 6b0f5b50e678da083ed0f1b64e943e8c6279c7246af5ad079cdbf223e42a0d471e56314bc0d58f202aa6c5e1e5255985b0795d48eb3d4b8e3fc92240ae02b4088c6ce8ab0e8c79c68dfdc48657d6a28295391b9a5a5f35255126bf8ca53cbcc0082eab52ec109d22a1185f6dc792fc290aa8dbaebb2fbe404f1d039aa6343cd7af9fcb2d1e05def48096c237e10daa7cfac5ae9b3b3022005d0d2d5c9c5c502b2f23594e80d1604bbb8f5dec07cd3afe1f777743b0b58a4e0e4e5caa148830eee047968e7f40661f9f1a02e1a7fd2b6caf19326a75e9565efdc0114bcecb14dda06c329cf322a5bd3e6ab48d95f2d2a9c1c1233a0aa015a738f901f13148b454 -Result = Pass - -Digest = SHA384 -Key = 308204a40201000282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201000997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8d33f10324c55956141891e45b84b49f59ea5bfac6ffa38900aca5099afcd02f6a8257c41ce5bb2e4153832b5c22f91eb389fa2035c3cf9b3374531c483cb30ceb007259b1d02818100d95c0995fabdfcbccfe63e0f3262f806869ab571e1793e97234cbb9bd4b6872a7695389955cf6ce7245345a5df8021f7d9519563afbc2667f5311fad093de2c02cd069109b630d68e3bf767f8a788a6add7ab199f2d8f6a40b7c1910d9dab52ac80d0d333aacab321a9309dc884ddd4db637a0c1115ae3c08efa683f99eb733102818100d4f7ef9f9be947ba9d1b3bce59e5608839a1e464553e1b6d113d0f636758bbb473a89f9949836ead40b6f314eee3ac2244d7b6f379e83f30e17783ad68d5086897889c051c26e1558a4a220bfc242995860644b5d7a3ef513ac612b9c6c0a2021bb6b9cde7dbd21fe5858746c79563e9bab7d06b43aab43a0a5cafab4519a6610281803db2386f174f2ea3ef4b6bd1601749ce2d6afa8be35f051178621f16a23ad36eba03c073136389241969e5b87edb0fcbcf1a0bd6e1aee97bae1f2d97aabe19b17dbe7d9492cdb68a0897f572350e846c669660dc978c5068da598524fca8a136358d3e5f8f6ad5cf78d9089c93f473189162ce0f8c4902a19902b633b3e6926d02818100ddc971183dcf3450c43e06ba2af32379eedeb2d678513fb706b75a006098154041f4b09e6be385d4b25d80ec241c899e4a986a17b0a121daab91a1e4fc5a1802a7074df3fb3f7661f0e1c97799e36d21de937cc4209585db30a56af0a228e001036ed792625e5368ce101574a2e9767f07338949f0afdf358cecd18c6d6f3f55 -Msg = 80c9debdf93174d75750a6cf09af71fc18fd513bff9cb491be60af112a93f000873cf43858a07aca760a37e760c8cb01d276f42d997f01cca5e08a6a602f5fe63edcbed395b8c91fb0b336f21fea49d950e1ff24640c8d8d3b95081ad1596644ce34a558587e4a1e2cd50db9ed1dd3cebbc6dce8084d3e1ba70692e82618ed61 -Sig = 4a15a783adbf274622d5a610bb6fc73337999e445dc2133accb788d6203d70f3cdc63e67daa4171a7952a4986456fab3c077a8941fb259e37a5c0cbb20c408fa24ad0ec850e9bf028c3604609941f5ae2f18bf1ac37a24f755abb9c85ddcd0bf4a12fabd9d253029e081f628e2bbe9f9afe9224954d8315db86c2125512bb98ce9b36930994b091a8a1d7d4e2f4a0e58d0a35876adad14300530b39c8dc11ded3ef2fa95d5f22e67cae34cc21ad5e23f9122b53dfb79f1a2ac63c1844e9ef069a2e41f178d6dcedc518aafcf81e0ebd882556e731cb0ab41d957274a3fbbb7cef2608791000c6b860868cb7393e7d03d945689ffb77555efe08f461451d33c11 -Result = Pass - -Digest = SHA384 -Key = 308204a40201000282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201000997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8d33f10324c55956141891e45b84b49f59ea5bfac6ffa38900aca5099afcd02f6a8257c41ce5bb2e4153832b5c22f91eb389fa2035c3cf9b3374531c483cb30ceb007259b1d02818100d95c0995fabdfcbccfe63e0f3262f806869ab571e1793e97234cbb9bd4b6872a7695389955cf6ce7245345a5df8021f7d9519563afbc2667f5311fad093de2c02cd069109b630d68e3bf767f8a788a6add7ab199f2d8f6a40b7c1910d9dab52ac80d0d333aacab321a9309dc884ddd4db637a0c1115ae3c08efa683f99eb733102818100d4f7ef9f9be947ba9d1b3bce59e5608839a1e464553e1b6d113d0f636758bbb473a89f9949836ead40b6f314eee3ac2244d7b6f379e83f30e17783ad68d5086897889c051c26e1558a4a220bfc242995860644b5d7a3ef513ac612b9c6c0a2021bb6b9cde7dbd21fe5858746c79563e9bab7d06b43aab43a0a5cafab4519a6610281803db2386f174f2ea3ef4b6bd1601749ce2d6afa8be35f051178621f16a23ad36eba03c073136389241969e5b87edb0fcbcf1a0bd6e1aee97bae1f2d97aabe19b17dbe7d9492cdb68a0897f572350e846c669660dc978c5068da598524fca8a136358d3e5f8f6ad5cf78d9089c93f473189162ce0f8c4902a19902b633b3e6926d02818100ddc971183dcf3450c43e06ba2af32379eedeb2d678513fb706b75a006098154041f4b09e6be385d4b25d80ec241c899e4a986a17b0a121daab91a1e4fc5a1802a7074df3fb3f7661f0e1c97799e36d21de937cc4209585db30a56af0a228e001036ed792625e5368ce101574a2e9767f07338949f0afdf358cecd18c6d6f3f55 -Msg = 31395cef349551343a49271a8d812b4c7b65b455b7eda811fcf74161f397112357ae446257be26c93cfce55e4ba7976ded997ec10d1c8b1ac2fe22dc2ee81d05a6eb1361125cda0197e24ae974cd44092aa9f36fe01352ba05ccefd2370ceed6641950562f1776c39522e023d09a3b097bbe9bc5f87d05d80f8830abd7ac8c80 -Sig = 162f387695cf9d82dda89c749318e46c9be895ec364ea4aece97ccfa63925af3710894da2b7b5967e46f4efa80ca25d2a965a7e15f75e0aa1bd4250f8f41099e6e9714c3fc4311077ae9bddfe35ba4727531529c239d546ab1c298187f165f708ccc0ae3979a8da193e34859a59c2c3bc42253c8346688e6bba6fb1b01b10c1ec2c6493dedcc2696269d851bde63e27e37bed357455c8fee5629f94afa7a986695cfd5b99212657a6c884644596086b89e0c7c05e819faebebef745fd295af8866e0750f5479baed50cbb3d059f8a5eb7e0e61e2733ae50f0c1ec42be71f5dff324195cb4f0e941a21561513c3037db92fec9556b772ccab239e34b1876c56b1 -Result = Pass - -Digest = SHA512 -Key = 308204a40201000282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201000997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8d33f10324c55956141891e45b84b49f59ea5bfac6ffa38900aca5099afcd02f6a8257c41ce5bb2e4153832b5c22f91eb389fa2035c3cf9b3374531c483cb30ceb007259b1d02818100d95c0995fabdfcbccfe63e0f3262f806869ab571e1793e97234cbb9bd4b6872a7695389955cf6ce7245345a5df8021f7d9519563afbc2667f5311fad093de2c02cd069109b630d68e3bf767f8a788a6add7ab199f2d8f6a40b7c1910d9dab52ac80d0d333aacab321a9309dc884ddd4db637a0c1115ae3c08efa683f99eb733102818100d4f7ef9f9be947ba9d1b3bce59e5608839a1e464553e1b6d113d0f636758bbb473a89f9949836ead40b6f314eee3ac2244d7b6f379e83f30e17783ad68d5086897889c051c26e1558a4a220bfc242995860644b5d7a3ef513ac612b9c6c0a2021bb6b9cde7dbd21fe5858746c79563e9bab7d06b43aab43a0a5cafab4519a6610281803db2386f174f2ea3ef4b6bd1601749ce2d6afa8be35f051178621f16a23ad36eba03c073136389241969e5b87edb0fcbcf1a0bd6e1aee97bae1f2d97aabe19b17dbe7d9492cdb68a0897f572350e846c669660dc978c5068da598524fca8a136358d3e5f8f6ad5cf78d9089c93f473189162ce0f8c4902a19902b633b3e6926d02818100ddc971183dcf3450c43e06ba2af32379eedeb2d678513fb706b75a006098154041f4b09e6be385d4b25d80ec241c899e4a986a17b0a121daab91a1e4fc5a1802a7074df3fb3f7661f0e1c97799e36d21de937cc4209585db30a56af0a228e001036ed792625e5368ce101574a2e9767f07338949f0afdf358cecd18c6d6f3f55 -Msg = a7c309d44a57188bbd7b726b98b98ce12582228e1415864870a23961d2afb82cd5bc98bec922d5f2ac4168b056da176ef3ba91f6b699ba6acc4144868ff37f26fd06720868d12ad26ecb52572cf10416af68df03ab645a8b704857d2190ffc3f07eabe3a8e2abe34ed6159e884c4fae141d4333d5c3e0db044ff9cccd9cbd67f -Sig = 148af61ed5ea8a87a08b3f403929bf8031db4fd3999b64409ba489f97a3ee5208ea4202d2ec18734f615003a51f77441085be6ac0f11810ffa2dad58f0e186d5520ac2b8a5d3966e8d2abb8074e13b50a4e7de83be10a66fdc7ca18118c5774f781212de9efebc6376fcdddc65a3b1b8f1ab31492fe478259ce719b3db587498d879a01dec96e8eabeb07ff7073f3f3eb446084955ca26329a791315a2c259d225e26b2154b2047b21faba68115bfd962e5e24ec52d7c5d231e3044cbcd8c8804855703cbaa622b15b6ef78c7421a367166f1b02576c87360593da75b7189efafd1082bd59f6857f1701f646c24d70c95273c49d5b11e6afe258821b55c1680c -Result = Pass - -Digest = SHA512 -Key = 308204a40201000282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201000997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8d33f10324c55956141891e45b84b49f59ea5bfac6ffa38900aca5099afcd02f6a8257c41ce5bb2e4153832b5c22f91eb389fa2035c3cf9b3374531c483cb30ceb007259b1d02818100d95c0995fabdfcbccfe63e0f3262f806869ab571e1793e97234cbb9bd4b6872a7695389955cf6ce7245345a5df8021f7d9519563afbc2667f5311fad093de2c02cd069109b630d68e3bf767f8a788a6add7ab199f2d8f6a40b7c1910d9dab52ac80d0d333aacab321a9309dc884ddd4db637a0c1115ae3c08efa683f99eb733102818100d4f7ef9f9be947ba9d1b3bce59e5608839a1e464553e1b6d113d0f636758bbb473a89f9949836ead40b6f314eee3ac2244d7b6f379e83f30e17783ad68d5086897889c051c26e1558a4a220bfc242995860644b5d7a3ef513ac612b9c6c0a2021bb6b9cde7dbd21fe5858746c79563e9bab7d06b43aab43a0a5cafab4519a6610281803db2386f174f2ea3ef4b6bd1601749ce2d6afa8be35f051178621f16a23ad36eba03c073136389241969e5b87edb0fcbcf1a0bd6e1aee97bae1f2d97aabe19b17dbe7d9492cdb68a0897f572350e846c669660dc978c5068da598524fca8a136358d3e5f8f6ad5cf78d9089c93f473189162ce0f8c4902a19902b633b3e6926d02818100ddc971183dcf3450c43e06ba2af32379eedeb2d678513fb706b75a006098154041f4b09e6be385d4b25d80ec241c899e4a986a17b0a121daab91a1e4fc5a1802a7074df3fb3f7661f0e1c97799e36d21de937cc4209585db30a56af0a228e001036ed792625e5368ce101574a2e9767f07338949f0afdf358cecd18c6d6f3f55 -Msg = ca505d4591121664990747d95d9555cc75bfc3fdaeeceeaa60eafab3fc320cfce56eb9138138bf138f25f3c8bb027b136f5d3d90ed4897779b5951c09df5d08ba9ce8cbe17abc4f038687086e93d771b684322266633d0d65d71ec41234a1dbec07abc8f7df28bc43dd8a45b10ceafac06775805413701914e3bb37eb6ba5b5e -Sig = 589ccd4ebf9764f87e6afa7f13c4062579b02228117b15a8738ab39cd64477069cb4f52cd8d5f4574c657b453835ca3cedb824f03b92a573d6d3d91361313f11bdcb34d2059fe2e6ce2b854461af58a9294c88cbfb2a639976b56e4748026f3040e2fd7112d6ad44500689ac777c071d17391969762e186417c4400abdda5c16dce0077642f1fc1354e0e8c14e558c923c1bfb85488b8350f415866a60871ed7151f5fbc5b880500011977c778e17fe8918c5d343f70b00d58f718956125fe28b3a5e2d07604a2b8a877204434ce903b35a030936bc71951ca593df97d24e8e8ad8f2dc9b78f76ef13a1d386ca857ced48f19f3ebe39108f9b33ff59eb0556b1 -Result = Pass - -Digest = SHA512 -Key = 308204a40201000282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201000997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8d33f10324c55956141891e45b84b49f59ea5bfac6ffa38900aca5099afcd02f6a8257c41ce5bb2e4153832b5c22f91eb389fa2035c3cf9b3374531c483cb30ceb007259b1d02818100d95c0995fabdfcbccfe63e0f3262f806869ab571e1793e97234cbb9bd4b6872a7695389955cf6ce7245345a5df8021f7d9519563afbc2667f5311fad093de2c02cd069109b630d68e3bf767f8a788a6add7ab199f2d8f6a40b7c1910d9dab52ac80d0d333aacab321a9309dc884ddd4db637a0c1115ae3c08efa683f99eb733102818100d4f7ef9f9be947ba9d1b3bce59e5608839a1e464553e1b6d113d0f636758bbb473a89f9949836ead40b6f314eee3ac2244d7b6f379e83f30e17783ad68d5086897889c051c26e1558a4a220bfc242995860644b5d7a3ef513ac612b9c6c0a2021bb6b9cde7dbd21fe5858746c79563e9bab7d06b43aab43a0a5cafab4519a6610281803db2386f174f2ea3ef4b6bd1601749ce2d6afa8be35f051178621f16a23ad36eba03c073136389241969e5b87edb0fcbcf1a0bd6e1aee97bae1f2d97aabe19b17dbe7d9492cdb68a0897f572350e846c669660dc978c5068da598524fca8a136358d3e5f8f6ad5cf78d9089c93f473189162ce0f8c4902a19902b633b3e6926d02818100ddc971183dcf3450c43e06ba2af32379eedeb2d678513fb706b75a006098154041f4b09e6be385d4b25d80ec241c899e4a986a17b0a121daab91a1e4fc5a1802a7074df3fb3f7661f0e1c97799e36d21de937cc4209585db30a56af0a228e001036ed792625e5368ce101574a2e9767f07338949f0afdf358cecd18c6d6f3f55 -Msg = 237a7e44b0a6c268bb63364b958ae02b95e7eed36b3ea5bfb18b9b81c38e2663d187144e323f9ceafb479507d184e63cfbec3ecdbb8a05d2dfc8929693ed9e3e79e5f8abfc417ba1e17e3e281e8a0a32f084117f28c3dcbec51b86f5c85b2822441a9423b5b446d3928f977626a334579b39cfaf58f214c98d0cdf640be1ac59 -Sig = af076bc213caf75619f4bd1d787cc198f7df3324a0dd87a88416e0a4b81c2fb9a9db5f98aed43bc15fe2357143a6e4ff701d9c48f51de9eb803670bbc4b0aea7220be2f84b8300318c77a9f615986c4980abda85e3ad0089564dbaf7f44d81b6664eec0311adb194d46de96bb17d5a5d47426845802ca0f49a169eb82b75afa191027a0cc8fce9dd16055350df9745fc7200ff9f4ea3cfbfc66c42848113e3be3293d510382d0999f032515527bd99f66efa2a755e011247b223a68e51258b6bc319a7cdef4aec533e9dcd8ae26e349e5b33c79121907de509a1cb83c2e59a47c1a884bf68e7229316a62e3c49d1f542ebe7105cfc27099268120a7743908471 -Result = Pass - -Digest = SHA512 -Key = 308204a40201000282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201000997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8d33f10324c55956141891e45b84b49f59ea5bfac6ffa38900aca5099afcd02f6a8257c41ce5bb2e4153832b5c22f91eb389fa2035c3cf9b3374531c483cb30ceb007259b1d02818100d95c0995fabdfcbccfe63e0f3262f806869ab571e1793e97234cbb9bd4b6872a7695389955cf6ce7245345a5df8021f7d9519563afbc2667f5311fad093de2c02cd069109b630d68e3bf767f8a788a6add7ab199f2d8f6a40b7c1910d9dab52ac80d0d333aacab321a9309dc884ddd4db637a0c1115ae3c08efa683f99eb733102818100d4f7ef9f9be947ba9d1b3bce59e5608839a1e464553e1b6d113d0f636758bbb473a89f9949836ead40b6f314eee3ac2244d7b6f379e83f30e17783ad68d5086897889c051c26e1558a4a220bfc242995860644b5d7a3ef513ac612b9c6c0a2021bb6b9cde7dbd21fe5858746c79563e9bab7d06b43aab43a0a5cafab4519a6610281803db2386f174f2ea3ef4b6bd1601749ce2d6afa8be35f051178621f16a23ad36eba03c073136389241969e5b87edb0fcbcf1a0bd6e1aee97bae1f2d97aabe19b17dbe7d9492cdb68a0897f572350e846c669660dc978c5068da598524fca8a136358d3e5f8f6ad5cf78d9089c93f473189162ce0f8c4902a19902b633b3e6926d02818100ddc971183dcf3450c43e06ba2af32379eedeb2d678513fb706b75a006098154041f4b09e6be385d4b25d80ec241c899e4a986a17b0a121daab91a1e4fc5a1802a7074df3fb3f7661f0e1c97799e36d21de937cc4209585db30a56af0a228e001036ed792625e5368ce101574a2e9767f07338949f0afdf358cecd18c6d6f3f55 -Msg = ab18939230b096646a37a781629fbd9270f3891a5ceab4a8c3bc6851bc34115dbc066541b764a2ce88cc16a79324e5f8a90807652c639041733c34016fd30af08fed9024e26cf0b07c22811b1ae7911109e9625943447207dcd3fff39c45cb69ee731d22f8f008730ce2efc53f114945573ea2ddebb6e262c527d20f8bb1dc32 -Sig = 95bd0bf2362f34b2e04075b2934f404798703ea472b81ac3cc223aec486e4c3d9c5d1c2f9ee22417132964ed58e49937f5b257d316ca7fffe290b19f5b58103836812bef30ca0327039d8b9ea91295392fc394b881e2d2ac9e30c5a44256700fc9de0dba298273aec30c4f778d2e7127e8b8a88b0274fce04081cc13adbefe555014e1b5d5dcf6224c5ae2775423a66c81818eec014a3faf9ee75a3f6c3e51c556b0a288e8c262946684eb628b88e3f875e62ef6e801cae75f61cee404971c39d24a9712eb342ddc663515dec103b18d97d78ed68212f27900e77c049b60c853002b08022df56f707efa71027589e1a3ca6e415ba5f4437e978b07af3b73ba0d -Result = Pass - -Digest = SHA512 -Key = 308204a40201000282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201000997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8d33f10324c55956141891e45b84b49f59ea5bfac6ffa38900aca5099afcd02f6a8257c41ce5bb2e4153832b5c22f91eb389fa2035c3cf9b3374531c483cb30ceb007259b1d02818100d95c0995fabdfcbccfe63e0f3262f806869ab571e1793e97234cbb9bd4b6872a7695389955cf6ce7245345a5df8021f7d9519563afbc2667f5311fad093de2c02cd069109b630d68e3bf767f8a788a6add7ab199f2d8f6a40b7c1910d9dab52ac80d0d333aacab321a9309dc884ddd4db637a0c1115ae3c08efa683f99eb733102818100d4f7ef9f9be947ba9d1b3bce59e5608839a1e464553e1b6d113d0f636758bbb473a89f9949836ead40b6f314eee3ac2244d7b6f379e83f30e17783ad68d5086897889c051c26e1558a4a220bfc242995860644b5d7a3ef513ac612b9c6c0a2021bb6b9cde7dbd21fe5858746c79563e9bab7d06b43aab43a0a5cafab4519a6610281803db2386f174f2ea3ef4b6bd1601749ce2d6afa8be35f051178621f16a23ad36eba03c073136389241969e5b87edb0fcbcf1a0bd6e1aee97bae1f2d97aabe19b17dbe7d9492cdb68a0897f572350e846c669660dc978c5068da598524fca8a136358d3e5f8f6ad5cf78d9089c93f473189162ce0f8c4902a19902b633b3e6926d02818100ddc971183dcf3450c43e06ba2af32379eedeb2d678513fb706b75a006098154041f4b09e6be385d4b25d80ec241c899e4a986a17b0a121daab91a1e4fc5a1802a7074df3fb3f7661f0e1c97799e36d21de937cc4209585db30a56af0a228e001036ed792625e5368ce101574a2e9767f07338949f0afdf358cecd18c6d6f3f55 -Msg = a280e89ceb2c8cf26297191baf9a955d0d52375da023633e0afcdb0d39dc335d8295852ef4d06714e6511a95d37c04d26818606ada54359b7d0784aa933cc68561ee96a88910aa3d93d10787cd1d7580556731c174a6e3a32d9dcfa416604f0c671481d051f63db6919f4aba4486d1b0fdc6112c1521559f424523c26b4fb738 -Sig = cd60de3b4a1289a84ca761f90fa63f4d5688bd885f4b531c8515add2de1251f993ff7f986bef3fba692ecdebc81942d7429c7a59c5d3f1fb872fc1da1915e94586a5c3d963603619008f7efeded1d70b0a11ce2cd81b5b0d86b3760c9483674f55e9fa47f2f310d588fb2160e8b5c32be4e7a968d5a8d4ac6576b71a2b91cd6af0016cbc816d4aae8c70649e08dce90b3ce52ab49ce2cb5b0ed8a45e33d94cf2d4cfdee1151270b2073aeffeaf717d39e04192b8b693c53f21a6123813280806920b7dc582201c9d117050320671e86139a027976b7ecf413369a9fc28e0bd719ceb5e107de799f1bc2e255a9f29476d4574d1332f66468afb9004ff7b535302 -Result = Pass - -Digest = SHA512 -Key = 308204a40201000282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201000997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8d33f10324c55956141891e45b84b49f59ea5bfac6ffa38900aca5099afcd02f6a8257c41ce5bb2e4153832b5c22f91eb389fa2035c3cf9b3374531c483cb30ceb007259b1d02818100d95c0995fabdfcbccfe63e0f3262f806869ab571e1793e97234cbb9bd4b6872a7695389955cf6ce7245345a5df8021f7d9519563afbc2667f5311fad093de2c02cd069109b630d68e3bf767f8a788a6add7ab199f2d8f6a40b7c1910d9dab52ac80d0d333aacab321a9309dc884ddd4db637a0c1115ae3c08efa683f99eb733102818100d4f7ef9f9be947ba9d1b3bce59e5608839a1e464553e1b6d113d0f636758bbb473a89f9949836ead40b6f314eee3ac2244d7b6f379e83f30e17783ad68d5086897889c051c26e1558a4a220bfc242995860644b5d7a3ef513ac612b9c6c0a2021bb6b9cde7dbd21fe5858746c79563e9bab7d06b43aab43a0a5cafab4519a6610281803db2386f174f2ea3ef4b6bd1601749ce2d6afa8be35f051178621f16a23ad36eba03c073136389241969e5b87edb0fcbcf1a0bd6e1aee97bae1f2d97aabe19b17dbe7d9492cdb68a0897f572350e846c669660dc978c5068da598524fca8a136358d3e5f8f6ad5cf78d9089c93f473189162ce0f8c4902a19902b633b3e6926d02818100ddc971183dcf3450c43e06ba2af32379eedeb2d678513fb706b75a006098154041f4b09e6be385d4b25d80ec241c899e4a986a17b0a121daab91a1e4fc5a1802a7074df3fb3f7661f0e1c97799e36d21de937cc4209585db30a56af0a228e001036ed792625e5368ce101574a2e9767f07338949f0afdf358cecd18c6d6f3f55 -Msg = 85ed1e3dfcd5bca24cad1d01ebe192b7d059ec9b884436e18714a43fbcc9c64f687301352ff240817001e757d27309cd1fbbda9456b267dbfb958470b24d06280cf43382a19477875f3259f4210bac9b831d0a07f5e97e5f0f78818c259c289e1a789b6c7942c97bc1485a220131e5eba586643b9071e5366bc482dd3c3c9279 -Sig = 138134bbecefafc7ca8b102cbe87b012f8aada8878995002cf1887694b5be3b8f0bb616bc6e07962d5482d3a52c52ab91b3ee0064d24558e13c75c80f6a95b7dc498442879d5baf8ffa7e2f638808b97ff70136bb645e30944dd97a997a0205169553a5b9e874c5a9441e18c15ebed76043b639dfd64db79e174847a102724a2a05c649473cc7dacd39e2e1d5666bbb5f01246747048fffcdfcddf782da24a6dcc022b2695f70781bd9f8ff7d03be22eb8fc793f5c071a66d9a6ea46c6a2cf0556526ba8b085073546448081732ac15f12833c1db1701ff7f68344ca65dff86211a003adbf5189cfae79eaa8c8b7141ea378e44cc9c5bf024d2c710ff5cd68af -Result = Pass - -Digest = SHA512 -Key = 308204a40201000282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201000997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8d33f10324c55956141891e45b84b49f59ea5bfac6ffa38900aca5099afcd02f6a8257c41ce5bb2e4153832b5c22f91eb389fa2035c3cf9b3374531c483cb30ceb007259b1d02818100d95c0995fabdfcbccfe63e0f3262f806869ab571e1793e97234cbb9bd4b6872a7695389955cf6ce7245345a5df8021f7d9519563afbc2667f5311fad093de2c02cd069109b630d68e3bf767f8a788a6add7ab199f2d8f6a40b7c1910d9dab52ac80d0d333aacab321a9309dc884ddd4db637a0c1115ae3c08efa683f99eb733102818100d4f7ef9f9be947ba9d1b3bce59e5608839a1e464553e1b6d113d0f636758bbb473a89f9949836ead40b6f314eee3ac2244d7b6f379e83f30e17783ad68d5086897889c051c26e1558a4a220bfc242995860644b5d7a3ef513ac612b9c6c0a2021bb6b9cde7dbd21fe5858746c79563e9bab7d06b43aab43a0a5cafab4519a6610281803db2386f174f2ea3ef4b6bd1601749ce2d6afa8be35f051178621f16a23ad36eba03c073136389241969e5b87edb0fcbcf1a0bd6e1aee97bae1f2d97aabe19b17dbe7d9492cdb68a0897f572350e846c669660dc978c5068da598524fca8a136358d3e5f8f6ad5cf78d9089c93f473189162ce0f8c4902a19902b633b3e6926d02818100ddc971183dcf3450c43e06ba2af32379eedeb2d678513fb706b75a006098154041f4b09e6be385d4b25d80ec241c899e4a986a17b0a121daab91a1e4fc5a1802a7074df3fb3f7661f0e1c97799e36d21de937cc4209585db30a56af0a228e001036ed792625e5368ce101574a2e9767f07338949f0afdf358cecd18c6d6f3f55 -Msg = 0bdba34e35fca65a1781d4d7c933a5f210d3a59483aebc95ec71b32df13ff4abf401916937fd88ff44ab46b78cc369414e9bcaa8bab0bb8557828d73a2a656c2f816f070b5cb45549e8eca9d7c0b4a7b0a27e51c119358dad2a17fb3a45718f9dec3c94af78d65c3ecd36b71e230cf080d1efdd8d07f1cfc26768fd5407bc2b7 -Sig = 9f48deb96bec0b72fbc4f12f08afb46bccf19d9e0cd0368ebeb312d83872626380ac928b612c5cd77438d47aa9ceea905a9de7182c8ef76e8a7a03d6efec8400b6496362bf6a30ceb1ced2185fc7c2117b6a6d888ac20c1687b0f2aa9b76705fd3154889b6acaf4e63be25880c71e6c239ecfb965004cd6321257f846afd2a6590c72ad83146eefc7b0dc4796339a7f64da0fbe359f94ace1fd151c5ac7bb5707b32eacf564fe1622e66e1844e639602ca36274ae01f93e6b2bd1effd34ab63d852cc9caf3ce8446c29c8ae3c6110fb7538cc8371c2a3981249cdc1be2b24b6a0c951764d0b7efa92a22cd8ed165e182863579377997a9ee50c8ac3aa4df1aca -Result = Pass - -Digest = SHA512 -Key = 308204a40201000282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201000997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8d33f10324c55956141891e45b84b49f59ea5bfac6ffa38900aca5099afcd02f6a8257c41ce5bb2e4153832b5c22f91eb389fa2035c3cf9b3374531c483cb30ceb007259b1d02818100d95c0995fabdfcbccfe63e0f3262f806869ab571e1793e97234cbb9bd4b6872a7695389955cf6ce7245345a5df8021f7d9519563afbc2667f5311fad093de2c02cd069109b630d68e3bf767f8a788a6add7ab199f2d8f6a40b7c1910d9dab52ac80d0d333aacab321a9309dc884ddd4db637a0c1115ae3c08efa683f99eb733102818100d4f7ef9f9be947ba9d1b3bce59e5608839a1e464553e1b6d113d0f636758bbb473a89f9949836ead40b6f314eee3ac2244d7b6f379e83f30e17783ad68d5086897889c051c26e1558a4a220bfc242995860644b5d7a3ef513ac612b9c6c0a2021bb6b9cde7dbd21fe5858746c79563e9bab7d06b43aab43a0a5cafab4519a6610281803db2386f174f2ea3ef4b6bd1601749ce2d6afa8be35f051178621f16a23ad36eba03c073136389241969e5b87edb0fcbcf1a0bd6e1aee97bae1f2d97aabe19b17dbe7d9492cdb68a0897f572350e846c669660dc978c5068da598524fca8a136358d3e5f8f6ad5cf78d9089c93f473189162ce0f8c4902a19902b633b3e6926d02818100ddc971183dcf3450c43e06ba2af32379eedeb2d678513fb706b75a006098154041f4b09e6be385d4b25d80ec241c899e4a986a17b0a121daab91a1e4fc5a1802a7074df3fb3f7661f0e1c97799e36d21de937cc4209585db30a56af0a228e001036ed792625e5368ce101574a2e9767f07338949f0afdf358cecd18c6d6f3f55 -Msg = 9aeed85b40ba7f86a228b5a1515ba190b2efff66993a5ece19d18baa9b4e4df92e5152fe1ec56a9fc865f30bac7e949fc4f62f0b158d10b083636b4de9bb05db69fe31b50103fefc5f8daf3af7156b4552ca3667a9d720bbb2e4bcdabadfd4b7f4fc5bc811faa36710a9d17758a98d4a0474fec27e9ef5b74f5c689935442357 -Sig = 9eecdbd7fbf618ddddfb6e75d64440f60445b853c542fe0fbaaa6a431294e6cb6683ae1a71ea055eb49cd2a3cb5154dc93d9aa166399f4e6294f0eb0652800d71e041c1ce1ad849c03c963bc0929dcdd11be5d67a050d02b64b29eaba655642b6436fbfb163690bf432fdceedd106c2f4972ecbf3077ed8b753bb605ec1ea03020839a318a24f8d4c1d7d8df99a7f0010ae41a8b068e2888531056a7dabbe921878dcd3c7d69416867f4012a606ae86855f15aed0da1250e59687706e89c9494baf37f61fb1703b79928795f90ccbe293a1e9472f6e0f4b890fdda3ea2522e3d11d5abdf0069519424d147b5646a5a601f19ec89729a8b48461e71c08bbe9cda -Result = Pass - -Digest = SHA512 -Key = 308204a40201000282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201000997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8d33f10324c55956141891e45b84b49f59ea5bfac6ffa38900aca5099afcd02f6a8257c41ce5bb2e4153832b5c22f91eb389fa2035c3cf9b3374531c483cb30ceb007259b1d02818100d95c0995fabdfcbccfe63e0f3262f806869ab571e1793e97234cbb9bd4b6872a7695389955cf6ce7245345a5df8021f7d9519563afbc2667f5311fad093de2c02cd069109b630d68e3bf767f8a788a6add7ab199f2d8f6a40b7c1910d9dab52ac80d0d333aacab321a9309dc884ddd4db637a0c1115ae3c08efa683f99eb733102818100d4f7ef9f9be947ba9d1b3bce59e5608839a1e464553e1b6d113d0f636758bbb473a89f9949836ead40b6f314eee3ac2244d7b6f379e83f30e17783ad68d5086897889c051c26e1558a4a220bfc242995860644b5d7a3ef513ac612b9c6c0a2021bb6b9cde7dbd21fe5858746c79563e9bab7d06b43aab43a0a5cafab4519a6610281803db2386f174f2ea3ef4b6bd1601749ce2d6afa8be35f051178621f16a23ad36eba03c073136389241969e5b87edb0fcbcf1a0bd6e1aee97bae1f2d97aabe19b17dbe7d9492cdb68a0897f572350e846c669660dc978c5068da598524fca8a136358d3e5f8f6ad5cf78d9089c93f473189162ce0f8c4902a19902b633b3e6926d02818100ddc971183dcf3450c43e06ba2af32379eedeb2d678513fb706b75a006098154041f4b09e6be385d4b25d80ec241c899e4a986a17b0a121daab91a1e4fc5a1802a7074df3fb3f7661f0e1c97799e36d21de937cc4209585db30a56af0a228e001036ed792625e5368ce101574a2e9767f07338949f0afdf358cecd18c6d6f3f55 -Msg = 654e189f06c7d42d5539a5872184f8336cf100691f190818fd02082ad68a7609fd095e62fc32b529853aebddac3dbf0d54dd571be72c90404bcc93d01154a9bfeff65065705f8e7eeadf8575b1ca48e28a1eed516265e34540dd867c79d7f175235d1330cb1706356b709bd796f43abaf6fce993f88eaa2fc67f0ab776daf732 -Sig = af90298bcef615309f235d5c3360f0df11f5fb988789f213d4c46134fee5eb104aa1fabb1307c9a904709de88673ed9951cba93167c67c09d827021b08a22c0505828ab4beb42e59a38832cb4da24ecf91f470a3b412c0712a8a59f6f2739d4e9eb4cc58d2c52592f1452dc65759abe43e8d2bc804e2efb3efc9b23cc1734ff7caefa46b03ba4b397d0714cdb8501a812c1b9f47411c91cba53a3d3b139edbd7cbb543f5bf3829ba7f5fafd8a712c0b111943f53209353afaba176b3f5dc060339d09b1fb3c213dae5d0f004d302828560fb5debf9fe491eaa66f597aa4de23eeef9176358755c952ef96e3672583b6ecd95a02e8ca7b21d7c20cbb7a757af71 -Result = Pass - -Digest = SHA512 -Key = 308204a40201000282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201000997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8d33f10324c55956141891e45b84b49f59ea5bfac6ffa38900aca5099afcd02f6a8257c41ce5bb2e4153832b5c22f91eb389fa2035c3cf9b3374531c483cb30ceb007259b1d02818100d95c0995fabdfcbccfe63e0f3262f806869ab571e1793e97234cbb9bd4b6872a7695389955cf6ce7245345a5df8021f7d9519563afbc2667f5311fad093de2c02cd069109b630d68e3bf767f8a788a6add7ab199f2d8f6a40b7c1910d9dab52ac80d0d333aacab321a9309dc884ddd4db637a0c1115ae3c08efa683f99eb733102818100d4f7ef9f9be947ba9d1b3bce59e5608839a1e464553e1b6d113d0f636758bbb473a89f9949836ead40b6f314eee3ac2244d7b6f379e83f30e17783ad68d5086897889c051c26e1558a4a220bfc242995860644b5d7a3ef513ac612b9c6c0a2021bb6b9cde7dbd21fe5858746c79563e9bab7d06b43aab43a0a5cafab4519a6610281803db2386f174f2ea3ef4b6bd1601749ce2d6afa8be35f051178621f16a23ad36eba03c073136389241969e5b87edb0fcbcf1a0bd6e1aee97bae1f2d97aabe19b17dbe7d9492cdb68a0897f572350e846c669660dc978c5068da598524fca8a136358d3e5f8f6ad5cf78d9089c93f473189162ce0f8c4902a19902b633b3e6926d02818100ddc971183dcf3450c43e06ba2af32379eedeb2d678513fb706b75a006098154041f4b09e6be385d4b25d80ec241c899e4a986a17b0a121daab91a1e4fc5a1802a7074df3fb3f7661f0e1c97799e36d21de937cc4209585db30a56af0a228e001036ed792625e5368ce101574a2e9767f07338949f0afdf358cecd18c6d6f3f55 -Msg = 121f80b43f9757b3fa80906aeab232195f0e2c41e5bf8c091ac0f1e0bc9e43640680a1823d649bdf86aba277fad8bc85fc957da2caf7323053025ff949706c1476ae9b0953283d34d7c6266f8db65eebe96d195fdce8e965a6383320ec3de0230ab2548eaa69a47a96d80398cad57e14ce9eeac0421c1a6eba69559dcd8f0659 -Sig = 06a2d74585f12ea7a80527b8c635a21cc11b45dbb0885a12722126811dd25d657bfa9fda774301ca3498d05dfdfb78a6aa16a9f8a95f40f1f04bd354a522f6a2d62b324efa3c006c22c2314b01fa0e91a3dba49aa35b46b19804b07ad98fe4bc990393a4a273ce8f1c85fc19cd5eae9af0b7d1957bb23409778a010b00c6959e1b67066fdb9f8495b4de4dcbb987358145b1ff6a39ef6fc588cda1744e0ab9e7eb002c29a78531d25157c5c2cd6470551560a02845db6dbee242f965a255406f6ef47b3221a5110edb44d38b94191aeaf433c0ece3480b9d1b06d8b8b6c0a232a04c567888e6372f2e94bc2be6b827f8712af48c6f1e4f223f5528fcf348799d -Result = Pass - -Digest = SHA256 -Key = 308206e40201000282018100dca98304b729e819b340e26cecb730aecbd8930e334c731493b180de970e6d3bc579f86c8d5d032f8cd33c4397ee7ffd019d51b0a7dbe4f52505a1a34ae35d23cfaaf594419d509f469b1369589f9c8616a7d698513bc1d423d70070d3d72b996c23abe68b22ccc39aabd16507124042c88d4da6a7451288ec87c9244be226aac02d1817682f80cc34c6eaf37ec84d247aaedebb56c3bbcaffb5cf42f61fe1b7f3fc89748e213973bf5f679d8b8b42a47ac4afd9e51e1d1214dfe1a7e1169080bd9ad91758f6c0f9b22ae40af6b41403d8f2d96db5a088daa5ef8683f86f501f7ad3f358b6337da55c6cfc003197420c1c75abdb7be1403ea4f3e64259f5c6da3325bb87d605b6e14b5350e6e1455c9d497d81046608e38795dc85aba406c9de1f4f9990d5153b98bbabbdcbd6bb18854312b2da48b411e838f26ae3109f104dfd1619f991824ec819861e5199f26bb9b3b299bfa9ec2fd691271b58a8adecbf0ff627b54336f3df7003d70e37d11ddbd930d9aba7e88ed401acb44092fd53d5020400eaf05d028201802d6db91eb32e36e5d5127deb034d14072fe60c1cd13c8c3dd9adbc87140b5e7136f4f89e61bbee7826f45ac1d99194fbaa8c5a0bb94db31d93723b51419d9c6f6eeb5f3610b67f4b4e2ade05cc6b8990e8832cf4cd40f2df0388c9a52072e27efebae20b4ad5951f4d20dd18943e58b786d8797652b2bb759c319d2b0046dbf69c53c075d00c287b876042fafa23fe4dd705e4e423277c9000311e94ea3f7456e32fd12afe4a2bde358a65824f1055064823c893fc93be3b8c658bb441d7f0b00ac246bf043a9c0053d319f003ef5a5533f74d630d8ce93bab416a82951e05b82c6036593eca89f0ebacd7d51ed9610af43537fcd266e5e47c0d25fedad6d047a1a1ee3eb444367e3eff7c7520ca4f779f2027fe45036204168454df4918b547a4d19e938f3c6db6ca2702ad9bbda1261c64d00b578285bdcfc9851f96a4f2cd14d66b9c1f65742a1344948c9f1da8d338ed4e3deb1ebadf11f8c281944e8849823496f86111f378bdd084c99f65fb9b4ee6271b1d1be424c294d185d9fd9cdf0281c100fa9977bca043a140e06158bc710f33918c7e503f1dd495b4f91920f6214d859f900c6a211849f566bc37417ec8a68f6874ce6160b34707a7341b1c00934e6ba3e60f63c3f4faf486be9780335b4eaee54ddd2f172a91b7a57a07905be685e49921e9d1af40e91b47be5bc1c0dfe3d10ad6b3b6aae0a43f82920c553b2e4932ff630297f2161918c684528373ed0af0d24b069ac4f511d8fd0301eff0365300a1f79e44d4ed21414940103aef3411568aae6f00b7c105453495c7cc6d3a76bcfb0281c100e16ae200e34b1638e158cf98278f3f62f75c97303be14265fbf11816941b366c4f95fdc3a7efe999d74b3919e6b10980ccd6e63e5ca118476b9144e59274c4a4c3f309e0497f9c8e21ce32eda4974cde4f28c66d46b6e63c2ce2bc8c629a974d4256d268dad6c7d5f80c3ad5ed4856d651ed619041acc611d5e2c30a7d11b60e5c665569fd9315120abc590c861e4ecb16df430d9056d517ff060947fe556acc7ba94273398339616f45ada042633bbb1df5e7cc313df660c02f11dc6dd0b96f0281c006d864e60c4be32d580088c14ee2d782fdccb15a5a4d35418f742cea6f410392183b1688d924e3efd42ee87ec26e0a93ab01973ca14955e55556f9ce7efbed1a1474b01e9dd592fb27b01bde028ae3b939c219aebb19d4474afe735e18e9398df62b0e166d7677f0fea0de612e3ce5bca3d5f0d8603356240c8b21f65a4c8dfeadaaddd410f488d430b91f8495b920439ccceab14d12b5eb6ac723a97a382e3efb2a88588bf8f1217d3c2b7d7da4ee64a0c9429a4e1927a8b8aa589353fce4390281c100c3d5f93ebec8efd817d633f1095c7d4d839061701bae2f39cb4d1607e0502ecd8bd58b562dac772906908e0bc63093aa3a1be5da2f6d16b3c593d803ddff8c126e4a8caf51820eb7cbead85a60dc8e46e80bf50bab1c9c5ed90b7d72ceadc30a6bb4f055975e5ef78d1625c662a927f0d9d86a99002fedb60a7c5d752f90adc118068ab1eaf809d7619d7ff3c605e31b1001d96dbf04c622a0192a59ba29369148789423ba5cff12c503c6693c4e515d7775250d1fa52d0d06c093c2226eeeb30281c01af7aa2c6e5de3ebed447b0327ed8c09460a78d700097a147d4b59df7d4ca448ff63f0a4e82f842528b750253309d41c74b0a8e3ab293a69a2ecfb589aa3351fcb9cee01fdf073590d5cc91bd86b44c0dd73ff8ac183a77029ab15adace35707b2e0bb94e02c8badae6860cf6e9d16b913b929a4b32b17872ac278653f7d65cb795c514f15a1944fc78095e9c6567f6cd5882e23e4f4e571a168721c8e70924c1a3d9616fc1f0dd3b05278243bf9aa920fa05b3a53660506f71d3fa0bdc8ff9a -Msg = bcf6074333a7ede592ffc9ecf1c51181287e0a69363f467de4bf6b5aa5b03759c150c1c2b23b023cce8393882702b86fb0ef9ef9a1b0e1e01cef514410f0f6a05e2252fd3af4e566d4e9f79b38ef910a73edcdfaf89b4f0a429614dabab46b08da94405e937aa049ec5a7a8ded33a338bb9f1dd404a799e19ddb3a836aa39c77 -Sig = d1d21b8dfa55f0681e8fa86135cf292d71b7669713c291d8f8dc246464de3bbb961b596dfc8fda6c823c384008d05bcb3dccc36accf1b2bede1a95e52258d7d1bdf1fc44e18072abd45c1392015ee71692690ef8cdaaed337dd8546783f961bb9620eb5c7b8b6716e8c600351fab7765ee38a15d32d8a2c0949825c49a7f25eedd9be7b807bbfd517913786620d249823dae6fe2fd39ac639dd74821b0c120b42f31c2c639d2c61b395f09f86851bc809b34c4981ac65cf25b2e8adcbce190ef2ef67a0189039c9110f26701c3eed731c8d9ead178220ffcac7f0f678aa22268e1d01942ec51e80eef06e2112830855e87bafe8cc9c22fd737c7abbca5eb7a221d3835a86610d24b507b5dcb4618aa421f63a5609ef5d68f5760fddf970135602efad0851bbff98fe87fa58bc365f38ee7ec8ef5aab17fd11d89d91ef4c604e0d1f001d0e08869df9225e3b4cef52ff86815e13b3efdf45776f9353769a8a51fe7d891a7ef7035eecfa259848738376886edc91cc78f6da31c2f07ee362c3d82 -Result = Pass - -Digest = SHA256 -Key = 308206e40201000282018100dca98304b729e819b340e26cecb730aecbd8930e334c731493b180de970e6d3bc579f86c8d5d032f8cd33c4397ee7ffd019d51b0a7dbe4f52505a1a34ae35d23cfaaf594419d509f469b1369589f9c8616a7d698513bc1d423d70070d3d72b996c23abe68b22ccc39aabd16507124042c88d4da6a7451288ec87c9244be226aac02d1817682f80cc34c6eaf37ec84d247aaedebb56c3bbcaffb5cf42f61fe1b7f3fc89748e213973bf5f679d8b8b42a47ac4afd9e51e1d1214dfe1a7e1169080bd9ad91758f6c0f9b22ae40af6b41403d8f2d96db5a088daa5ef8683f86f501f7ad3f358b6337da55c6cfc003197420c1c75abdb7be1403ea4f3e64259f5c6da3325bb87d605b6e14b5350e6e1455c9d497d81046608e38795dc85aba406c9de1f4f9990d5153b98bbabbdcbd6bb18854312b2da48b411e838f26ae3109f104dfd1619f991824ec819861e5199f26bb9b3b299bfa9ec2fd691271b58a8adecbf0ff627b54336f3df7003d70e37d11ddbd930d9aba7e88ed401acb44092fd53d5020400eaf05d028201802d6db91eb32e36e5d5127deb034d14072fe60c1cd13c8c3dd9adbc87140b5e7136f4f89e61bbee7826f45ac1d99194fbaa8c5a0bb94db31d93723b51419d9c6f6eeb5f3610b67f4b4e2ade05cc6b8990e8832cf4cd40f2df0388c9a52072e27efebae20b4ad5951f4d20dd18943e58b786d8797652b2bb759c319d2b0046dbf69c53c075d00c287b876042fafa23fe4dd705e4e423277c9000311e94ea3f7456e32fd12afe4a2bde358a65824f1055064823c893fc93be3b8c658bb441d7f0b00ac246bf043a9c0053d319f003ef5a5533f74d630d8ce93bab416a82951e05b82c6036593eca89f0ebacd7d51ed9610af43537fcd266e5e47c0d25fedad6d047a1a1ee3eb444367e3eff7c7520ca4f779f2027fe45036204168454df4918b547a4d19e938f3c6db6ca2702ad9bbda1261c64d00b578285bdcfc9851f96a4f2cd14d66b9c1f65742a1344948c9f1da8d338ed4e3deb1ebadf11f8c281944e8849823496f86111f378bdd084c99f65fb9b4ee6271b1d1be424c294d185d9fd9cdf0281c100fa9977bca043a140e06158bc710f33918c7e503f1dd495b4f91920f6214d859f900c6a211849f566bc37417ec8a68f6874ce6160b34707a7341b1c00934e6ba3e60f63c3f4faf486be9780335b4eaee54ddd2f172a91b7a57a07905be685e49921e9d1af40e91b47be5bc1c0dfe3d10ad6b3b6aae0a43f82920c553b2e4932ff630297f2161918c684528373ed0af0d24b069ac4f511d8fd0301eff0365300a1f79e44d4ed21414940103aef3411568aae6f00b7c105453495c7cc6d3a76bcfb0281c100e16ae200e34b1638e158cf98278f3f62f75c97303be14265fbf11816941b366c4f95fdc3a7efe999d74b3919e6b10980ccd6e63e5ca118476b9144e59274c4a4c3f309e0497f9c8e21ce32eda4974cde4f28c66d46b6e63c2ce2bc8c629a974d4256d268dad6c7d5f80c3ad5ed4856d651ed619041acc611d5e2c30a7d11b60e5c665569fd9315120abc590c861e4ecb16df430d9056d517ff060947fe556acc7ba94273398339616f45ada042633bbb1df5e7cc313df660c02f11dc6dd0b96f0281c006d864e60c4be32d580088c14ee2d782fdccb15a5a4d35418f742cea6f410392183b1688d924e3efd42ee87ec26e0a93ab01973ca14955e55556f9ce7efbed1a1474b01e9dd592fb27b01bde028ae3b939c219aebb19d4474afe735e18e9398df62b0e166d7677f0fea0de612e3ce5bca3d5f0d8603356240c8b21f65a4c8dfeadaaddd410f488d430b91f8495b920439ccceab14d12b5eb6ac723a97a382e3efb2a88588bf8f1217d3c2b7d7da4ee64a0c9429a4e1927a8b8aa589353fce4390281c100c3d5f93ebec8efd817d633f1095c7d4d839061701bae2f39cb4d1607e0502ecd8bd58b562dac772906908e0bc63093aa3a1be5da2f6d16b3c593d803ddff8c126e4a8caf51820eb7cbead85a60dc8e46e80bf50bab1c9c5ed90b7d72ceadc30a6bb4f055975e5ef78d1625c662a927f0d9d86a99002fedb60a7c5d752f90adc118068ab1eaf809d7619d7ff3c605e31b1001d96dbf04c622a0192a59ba29369148789423ba5cff12c503c6693c4e515d7775250d1fa52d0d06c093c2226eeeb30281c01af7aa2c6e5de3ebed447b0327ed8c09460a78d700097a147d4b59df7d4ca448ff63f0a4e82f842528b750253309d41c74b0a8e3ab293a69a2ecfb589aa3351fcb9cee01fdf073590d5cc91bd86b44c0dd73ff8ac183a77029ab15adace35707b2e0bb94e02c8badae6860cf6e9d16b913b929a4b32b17872ac278653f7d65cb795c514f15a1944fc78095e9c6567f6cd5882e23e4f4e571a168721c8e70924c1a3d9616fc1f0dd3b05278243bf9aa920fa05b3a53660506f71d3fa0bdc8ff9a -Msg = 2bcad6e744f2490ba6a6e0722832417ebd910f9146eb62baaa5c749529f79d6ced0b81a2e2a48852c8558e338735dcbfc2285794ae60f81a25237c66f6ce5d5e801a001e7f9e309b2595cb866de2bb74ac51283b6820ec9f6ebe482e1fd2d5680b7fbd23c1e62a2ee4edff35823fc7e4a295ea4f1c332792aeb53eb44b0bedd2 -Sig = 37d960fe391298bbdc223fa1eb1d3cd9a46ba8c62e1da8c563c89a8f0e67b864fc89837ffc08aab7122b84c435c7f9406e165a1029857c1e4dea653569277273b1d9b0a9f5b0dc24afdd214476d47208ad5221a7d793cab80671fb4987c86bd6144880c59d24871400f64bdc6d496dbd497f3dbf642864fe49af3e21515e62d60f0071db4884f49670eaa9e4e4982f269abe724244288859c2adf60a09faaabb07990e09e56de254babbee14be7eb6eda0cdb22f3d0de8724804673fb99f86efb4263dcc5017abc91bd9cd833679475bfac50a2be8db86296bbf8017889357371314604e83d68b6efecd4b79f0a8afa0dffa448fb7fce6d344709a670e0cff432c3e187bcff7fdc4f4e9abe1095c46b01d88b6044bb950e92859010d9a0e3b2d1f27a096eacaa24263a2a0523d6e0da1fba8af768196f7a51f92fdf152bef062dd1f8327cee1d344c200c2115ac6ec1dd8514cef9e36d0ce8c32e58783c4fcba901aa70c2b42966488002ff171d36414a144bf46775183a8815de9ee3e81f31b -Result = Pass - -Digest = SHA256 -Key = 308206e40201000282018100dca98304b729e819b340e26cecb730aecbd8930e334c731493b180de970e6d3bc579f86c8d5d032f8cd33c4397ee7ffd019d51b0a7dbe4f52505a1a34ae35d23cfaaf594419d509f469b1369589f9c8616a7d698513bc1d423d70070d3d72b996c23abe68b22ccc39aabd16507124042c88d4da6a7451288ec87c9244be226aac02d1817682f80cc34c6eaf37ec84d247aaedebb56c3bbcaffb5cf42f61fe1b7f3fc89748e213973bf5f679d8b8b42a47ac4afd9e51e1d1214dfe1a7e1169080bd9ad91758f6c0f9b22ae40af6b41403d8f2d96db5a088daa5ef8683f86f501f7ad3f358b6337da55c6cfc003197420c1c75abdb7be1403ea4f3e64259f5c6da3325bb87d605b6e14b5350e6e1455c9d497d81046608e38795dc85aba406c9de1f4f9990d5153b98bbabbdcbd6bb18854312b2da48b411e838f26ae3109f104dfd1619f991824ec819861e5199f26bb9b3b299bfa9ec2fd691271b58a8adecbf0ff627b54336f3df7003d70e37d11ddbd930d9aba7e88ed401acb44092fd53d5020400eaf05d028201802d6db91eb32e36e5d5127deb034d14072fe60c1cd13c8c3dd9adbc87140b5e7136f4f89e61bbee7826f45ac1d99194fbaa8c5a0bb94db31d93723b51419d9c6f6eeb5f3610b67f4b4e2ade05cc6b8990e8832cf4cd40f2df0388c9a52072e27efebae20b4ad5951f4d20dd18943e58b786d8797652b2bb759c319d2b0046dbf69c53c075d00c287b876042fafa23fe4dd705e4e423277c9000311e94ea3f7456e32fd12afe4a2bde358a65824f1055064823c893fc93be3b8c658bb441d7f0b00ac246bf043a9c0053d319f003ef5a5533f74d630d8ce93bab416a82951e05b82c6036593eca89f0ebacd7d51ed9610af43537fcd266e5e47c0d25fedad6d047a1a1ee3eb444367e3eff7c7520ca4f779f2027fe45036204168454df4918b547a4d19e938f3c6db6ca2702ad9bbda1261c64d00b578285bdcfc9851f96a4f2cd14d66b9c1f65742a1344948c9f1da8d338ed4e3deb1ebadf11f8c281944e8849823496f86111f378bdd084c99f65fb9b4ee6271b1d1be424c294d185d9fd9cdf0281c100fa9977bca043a140e06158bc710f33918c7e503f1dd495b4f91920f6214d859f900c6a211849f566bc37417ec8a68f6874ce6160b34707a7341b1c00934e6ba3e60f63c3f4faf486be9780335b4eaee54ddd2f172a91b7a57a07905be685e49921e9d1af40e91b47be5bc1c0dfe3d10ad6b3b6aae0a43f82920c553b2e4932ff630297f2161918c684528373ed0af0d24b069ac4f511d8fd0301eff0365300a1f79e44d4ed21414940103aef3411568aae6f00b7c105453495c7cc6d3a76bcfb0281c100e16ae200e34b1638e158cf98278f3f62f75c97303be14265fbf11816941b366c4f95fdc3a7efe999d74b3919e6b10980ccd6e63e5ca118476b9144e59274c4a4c3f309e0497f9c8e21ce32eda4974cde4f28c66d46b6e63c2ce2bc8c629a974d4256d268dad6c7d5f80c3ad5ed4856d651ed619041acc611d5e2c30a7d11b60e5c665569fd9315120abc590c861e4ecb16df430d9056d517ff060947fe556acc7ba94273398339616f45ada042633bbb1df5e7cc313df660c02f11dc6dd0b96f0281c006d864e60c4be32d580088c14ee2d782fdccb15a5a4d35418f742cea6f410392183b1688d924e3efd42ee87ec26e0a93ab01973ca14955e55556f9ce7efbed1a1474b01e9dd592fb27b01bde028ae3b939c219aebb19d4474afe735e18e9398df62b0e166d7677f0fea0de612e3ce5bca3d5f0d8603356240c8b21f65a4c8dfeadaaddd410f488d430b91f8495b920439ccceab14d12b5eb6ac723a97a382e3efb2a88588bf8f1217d3c2b7d7da4ee64a0c9429a4e1927a8b8aa589353fce4390281c100c3d5f93ebec8efd817d633f1095c7d4d839061701bae2f39cb4d1607e0502ecd8bd58b562dac772906908e0bc63093aa3a1be5da2f6d16b3c593d803ddff8c126e4a8caf51820eb7cbead85a60dc8e46e80bf50bab1c9c5ed90b7d72ceadc30a6bb4f055975e5ef78d1625c662a927f0d9d86a99002fedb60a7c5d752f90adc118068ab1eaf809d7619d7ff3c605e31b1001d96dbf04c622a0192a59ba29369148789423ba5cff12c503c6693c4e515d7775250d1fa52d0d06c093c2226eeeb30281c01af7aa2c6e5de3ebed447b0327ed8c09460a78d700097a147d4b59df7d4ca448ff63f0a4e82f842528b750253309d41c74b0a8e3ab293a69a2ecfb589aa3351fcb9cee01fdf073590d5cc91bd86b44c0dd73ff8ac183a77029ab15adace35707b2e0bb94e02c8badae6860cf6e9d16b913b929a4b32b17872ac278653f7d65cb795c514f15a1944fc78095e9c6567f6cd5882e23e4f4e571a168721c8e70924c1a3d9616fc1f0dd3b05278243bf9aa920fa05b3a53660506f71d3fa0bdc8ff9a -Msg = c3978bd050d46da4a79227d8270a2202953482875930fb1aeae4e67f87e79495289de293b4a40d92746fc84cc8318c2318fd30650e2bb9ce02fd734eb683410d44bb31ad54fd53cf9296ccd860b426f5c782ea5cb49371d56184f77911ddf1ba0039a0a49aa7e763eb4f5a04575997808b0ad9f6b330ca38edc19989febf4da5 -Sig = 9aed20a8bdaf26f1f119020d8f3ea6ce915138d4c87dce025e7f4e49536c8ec079edc6caf0d603bf42bd6a454a6d52d0d99fd0f59ffb3b22e9e67b3d0bb2d275d9aedc6da96a72cbff35c43e7f39a996fa8a6d338a0725f785254fe91a20834ba557fedfe7152b9956feddfd941741eff9177c2fbb55e200bbe42162b32a940cc300ab375557dffd48dfa539f50edd52df158d9072d14982e96303bc612c2c2506dbca3a939d626d2e7fb444c6ad7d8d9f3bba8210b2ac2f696783c349fc5280c105402a4b3d86bef5026c3dd999e3b22380f9dcce40e3a9cc9f1d7bc38ef3dd7e9413bb579800c0e6c3e9ab912da8fec1a4ab21398e9680ba0d04f3b4c8d53c02f05c7ae49b70a5611cf82e38de84aa8c2426f0b63ea01b289f201d3af40dad5d6e5bccc75b9959e5c9758e79105af7a9afb12aee577cb3991879db0fd8662c5bc49022752498a301d95f4b1d08c01ebc313f89c00b1ec2735a07983fd528e6388245036f0ed4a2dbb65dd33ab7f124c014ec1679f1c2f11edffb93fa2d1d73 -Result = Pass - -Digest = SHA256 -Key = 308206e40201000282018100dca98304b729e819b340e26cecb730aecbd8930e334c731493b180de970e6d3bc579f86c8d5d032f8cd33c4397ee7ffd019d51b0a7dbe4f52505a1a34ae35d23cfaaf594419d509f469b1369589f9c8616a7d698513bc1d423d70070d3d72b996c23abe68b22ccc39aabd16507124042c88d4da6a7451288ec87c9244be226aac02d1817682f80cc34c6eaf37ec84d247aaedebb56c3bbcaffb5cf42f61fe1b7f3fc89748e213973bf5f679d8b8b42a47ac4afd9e51e1d1214dfe1a7e1169080bd9ad91758f6c0f9b22ae40af6b41403d8f2d96db5a088daa5ef8683f86f501f7ad3f358b6337da55c6cfc003197420c1c75abdb7be1403ea4f3e64259f5c6da3325bb87d605b6e14b5350e6e1455c9d497d81046608e38795dc85aba406c9de1f4f9990d5153b98bbabbdcbd6bb18854312b2da48b411e838f26ae3109f104dfd1619f991824ec819861e5199f26bb9b3b299bfa9ec2fd691271b58a8adecbf0ff627b54336f3df7003d70e37d11ddbd930d9aba7e88ed401acb44092fd53d5020400eaf05d028201802d6db91eb32e36e5d5127deb034d14072fe60c1cd13c8c3dd9adbc87140b5e7136f4f89e61bbee7826f45ac1d99194fbaa8c5a0bb94db31d93723b51419d9c6f6eeb5f3610b67f4b4e2ade05cc6b8990e8832cf4cd40f2df0388c9a52072e27efebae20b4ad5951f4d20dd18943e58b786d8797652b2bb759c319d2b0046dbf69c53c075d00c287b876042fafa23fe4dd705e4e423277c9000311e94ea3f7456e32fd12afe4a2bde358a65824f1055064823c893fc93be3b8c658bb441d7f0b00ac246bf043a9c0053d319f003ef5a5533f74d630d8ce93bab416a82951e05b82c6036593eca89f0ebacd7d51ed9610af43537fcd266e5e47c0d25fedad6d047a1a1ee3eb444367e3eff7c7520ca4f779f2027fe45036204168454df4918b547a4d19e938f3c6db6ca2702ad9bbda1261c64d00b578285bdcfc9851f96a4f2cd14d66b9c1f65742a1344948c9f1da8d338ed4e3deb1ebadf11f8c281944e8849823496f86111f378bdd084c99f65fb9b4ee6271b1d1be424c294d185d9fd9cdf0281c100fa9977bca043a140e06158bc710f33918c7e503f1dd495b4f91920f6214d859f900c6a211849f566bc37417ec8a68f6874ce6160b34707a7341b1c00934e6ba3e60f63c3f4faf486be9780335b4eaee54ddd2f172a91b7a57a07905be685e49921e9d1af40e91b47be5bc1c0dfe3d10ad6b3b6aae0a43f82920c553b2e4932ff630297f2161918c684528373ed0af0d24b069ac4f511d8fd0301eff0365300a1f79e44d4ed21414940103aef3411568aae6f00b7c105453495c7cc6d3a76bcfb0281c100e16ae200e34b1638e158cf98278f3f62f75c97303be14265fbf11816941b366c4f95fdc3a7efe999d74b3919e6b10980ccd6e63e5ca118476b9144e59274c4a4c3f309e0497f9c8e21ce32eda4974cde4f28c66d46b6e63c2ce2bc8c629a974d4256d268dad6c7d5f80c3ad5ed4856d651ed619041acc611d5e2c30a7d11b60e5c665569fd9315120abc590c861e4ecb16df430d9056d517ff060947fe556acc7ba94273398339616f45ada042633bbb1df5e7cc313df660c02f11dc6dd0b96f0281c006d864e60c4be32d580088c14ee2d782fdccb15a5a4d35418f742cea6f410392183b1688d924e3efd42ee87ec26e0a93ab01973ca14955e55556f9ce7efbed1a1474b01e9dd592fb27b01bde028ae3b939c219aebb19d4474afe735e18e9398df62b0e166d7677f0fea0de612e3ce5bca3d5f0d8603356240c8b21f65a4c8dfeadaaddd410f488d430b91f8495b920439ccceab14d12b5eb6ac723a97a382e3efb2a88588bf8f1217d3c2b7d7da4ee64a0c9429a4e1927a8b8aa589353fce4390281c100c3d5f93ebec8efd817d633f1095c7d4d839061701bae2f39cb4d1607e0502ecd8bd58b562dac772906908e0bc63093aa3a1be5da2f6d16b3c593d803ddff8c126e4a8caf51820eb7cbead85a60dc8e46e80bf50bab1c9c5ed90b7d72ceadc30a6bb4f055975e5ef78d1625c662a927f0d9d86a99002fedb60a7c5d752f90adc118068ab1eaf809d7619d7ff3c605e31b1001d96dbf04c622a0192a59ba29369148789423ba5cff12c503c6693c4e515d7775250d1fa52d0d06c093c2226eeeb30281c01af7aa2c6e5de3ebed447b0327ed8c09460a78d700097a147d4b59df7d4ca448ff63f0a4e82f842528b750253309d41c74b0a8e3ab293a69a2ecfb589aa3351fcb9cee01fdf073590d5cc91bd86b44c0dd73ff8ac183a77029ab15adace35707b2e0bb94e02c8badae6860cf6e9d16b913b929a4b32b17872ac278653f7d65cb795c514f15a1944fc78095e9c6567f6cd5882e23e4f4e571a168721c8e70924c1a3d9616fc1f0dd3b05278243bf9aa920fa05b3a53660506f71d3fa0bdc8ff9a -Msg = 0c119502c2a01920a090e43357e7b28e33c7ee858b4330e05c71048931c0ed88468ca931ecf0b79c2fdc1756b7675156ec66b8335e3df09463f5aee7028fbf560f984cf698fe5c4280229ac96a2e5923d8a9d5299449bb665008ecc889797e9bb15d04b88c7210fadb8bf6f238e5d2dc41b9ccd1f80e9a3e6ad147948f273341 -Sig = 8abf2a30774e6e7338eca09cccaca3684399940492fb94b23b5ad62ce3e11d2dbef8966ba5269979eb9653baad719516d3e8399079a2f670275a2ed42c820a9a31fcd703a76637e0d713f32d792b9ae36d7288f60c2d1ae52683bb15941b1cd890d2cd64998b772585e76032a1702e0652cbf259a1ceae695d40cf2f4f6d81341c8bc9082cb96c752c355dfbe296dd21d69846fa37613e73817b2a07046658c9e3fc6d091e17591bb1a4fb6e2ac00a3194c1488e16a9d2903786db86ae90e96acb4de9901aaf1b0651fb76a58dcb3db473efbfb831ef8e30f89967ddd3a6c2f18979a0450657cdaeef6e59377c6db1ec46065f614024a69c518a559942594a46266e0d3ca1334296b968a23a4b11c63a97e29eb16b24c02d545d5b427e6aa585333318e63a204524e0e42ac1edb70d3456780dbead31f785f0b2a77ffeb0d37384cb5f65b4e36ca241f3b2b059105faaa3222d6c135ea5a36651aea396d22fc4ea1b404d7e834b6df1fb838bb5ba0d784a96e2ae2843db3eeea496c7ad2b4241 -Result = Pass - -Digest = SHA256 -Key = 308206e40201000282018100dca98304b729e819b340e26cecb730aecbd8930e334c731493b180de970e6d3bc579f86c8d5d032f8cd33c4397ee7ffd019d51b0a7dbe4f52505a1a34ae35d23cfaaf594419d509f469b1369589f9c8616a7d698513bc1d423d70070d3d72b996c23abe68b22ccc39aabd16507124042c88d4da6a7451288ec87c9244be226aac02d1817682f80cc34c6eaf37ec84d247aaedebb56c3bbcaffb5cf42f61fe1b7f3fc89748e213973bf5f679d8b8b42a47ac4afd9e51e1d1214dfe1a7e1169080bd9ad91758f6c0f9b22ae40af6b41403d8f2d96db5a088daa5ef8683f86f501f7ad3f358b6337da55c6cfc003197420c1c75abdb7be1403ea4f3e64259f5c6da3325bb87d605b6e14b5350e6e1455c9d497d81046608e38795dc85aba406c9de1f4f9990d5153b98bbabbdcbd6bb18854312b2da48b411e838f26ae3109f104dfd1619f991824ec819861e5199f26bb9b3b299bfa9ec2fd691271b58a8adecbf0ff627b54336f3df7003d70e37d11ddbd930d9aba7e88ed401acb44092fd53d5020400eaf05d028201802d6db91eb32e36e5d5127deb034d14072fe60c1cd13c8c3dd9adbc87140b5e7136f4f89e61bbee7826f45ac1d99194fbaa8c5a0bb94db31d93723b51419d9c6f6eeb5f3610b67f4b4e2ade05cc6b8990e8832cf4cd40f2df0388c9a52072e27efebae20b4ad5951f4d20dd18943e58b786d8797652b2bb759c319d2b0046dbf69c53c075d00c287b876042fafa23fe4dd705e4e423277c9000311e94ea3f7456e32fd12afe4a2bde358a65824f1055064823c893fc93be3b8c658bb441d7f0b00ac246bf043a9c0053d319f003ef5a5533f74d630d8ce93bab416a82951e05b82c6036593eca89f0ebacd7d51ed9610af43537fcd266e5e47c0d25fedad6d047a1a1ee3eb444367e3eff7c7520ca4f779f2027fe45036204168454df4918b547a4d19e938f3c6db6ca2702ad9bbda1261c64d00b578285bdcfc9851f96a4f2cd14d66b9c1f65742a1344948c9f1da8d338ed4e3deb1ebadf11f8c281944e8849823496f86111f378bdd084c99f65fb9b4ee6271b1d1be424c294d185d9fd9cdf0281c100fa9977bca043a140e06158bc710f33918c7e503f1dd495b4f91920f6214d859f900c6a211849f566bc37417ec8a68f6874ce6160b34707a7341b1c00934e6ba3e60f63c3f4faf486be9780335b4eaee54ddd2f172a91b7a57a07905be685e49921e9d1af40e91b47be5bc1c0dfe3d10ad6b3b6aae0a43f82920c553b2e4932ff630297f2161918c684528373ed0af0d24b069ac4f511d8fd0301eff0365300a1f79e44d4ed21414940103aef3411568aae6f00b7c105453495c7cc6d3a76bcfb0281c100e16ae200e34b1638e158cf98278f3f62f75c97303be14265fbf11816941b366c4f95fdc3a7efe999d74b3919e6b10980ccd6e63e5ca118476b9144e59274c4a4c3f309e0497f9c8e21ce32eda4974cde4f28c66d46b6e63c2ce2bc8c629a974d4256d268dad6c7d5f80c3ad5ed4856d651ed619041acc611d5e2c30a7d11b60e5c665569fd9315120abc590c861e4ecb16df430d9056d517ff060947fe556acc7ba94273398339616f45ada042633bbb1df5e7cc313df660c02f11dc6dd0b96f0281c006d864e60c4be32d580088c14ee2d782fdccb15a5a4d35418f742cea6f410392183b1688d924e3efd42ee87ec26e0a93ab01973ca14955e55556f9ce7efbed1a1474b01e9dd592fb27b01bde028ae3b939c219aebb19d4474afe735e18e9398df62b0e166d7677f0fea0de612e3ce5bca3d5f0d8603356240c8b21f65a4c8dfeadaaddd410f488d430b91f8495b920439ccceab14d12b5eb6ac723a97a382e3efb2a88588bf8f1217d3c2b7d7da4ee64a0c9429a4e1927a8b8aa589353fce4390281c100c3d5f93ebec8efd817d633f1095c7d4d839061701bae2f39cb4d1607e0502ecd8bd58b562dac772906908e0bc63093aa3a1be5da2f6d16b3c593d803ddff8c126e4a8caf51820eb7cbead85a60dc8e46e80bf50bab1c9c5ed90b7d72ceadc30a6bb4f055975e5ef78d1625c662a927f0d9d86a99002fedb60a7c5d752f90adc118068ab1eaf809d7619d7ff3c605e31b1001d96dbf04c622a0192a59ba29369148789423ba5cff12c503c6693c4e515d7775250d1fa52d0d06c093c2226eeeb30281c01af7aa2c6e5de3ebed447b0327ed8c09460a78d700097a147d4b59df7d4ca448ff63f0a4e82f842528b750253309d41c74b0a8e3ab293a69a2ecfb589aa3351fcb9cee01fdf073590d5cc91bd86b44c0dd73ff8ac183a77029ab15adace35707b2e0bb94e02c8badae6860cf6e9d16b913b929a4b32b17872ac278653f7d65cb795c514f15a1944fc78095e9c6567f6cd5882e23e4f4e571a168721c8e70924c1a3d9616fc1f0dd3b05278243bf9aa920fa05b3a53660506f71d3fa0bdc8ff9a -Msg = ddbd8468bdb036f4799f428bc8b4374ed9b7cde541337ac439d441ac0614cb75b816b80c17d237b8db73d4a11bfd929208333afedbb8f2410c741129c53932b596a7881c6a4d7111ba104d4600d1902f6f4a1608e139b71911c11c390a0dd091df369aa29d670b8a7e3f53825f7659ac74c40a0c3bfef0d3ae8307e4bdd6cd91 -Sig = 4e377e2459815d5b33915fa63cd477b5be7c6b7f7814d1350034ce710be67ed69139db622ef60ec6b7638e94b202368bac631e057702b0e6487b324a6b98ed7e03d1f3f20a9814b00e217a4648e4bbc449a2af405ca4b59f8438ddfd75d34d1064e58bfb325c55bd54ea6cdf7712ba807c3e4c665d620cd59513d7bc0855247eb670ecc292509661812702703275d9b2f87ef279d7700e69d995db98144a14c81774a4cd890ec03d13f858f3769e5048ed55caa81201e8785d3771ce6da51175d017d211fa703794416f469b1129d731abde744da5b2facd7a9b093d6c9743509b0103bab9c81c6e5f38bc9718e3e4faa86475d13725a829ac61df8d15f0b27cb40d0eba0b246b9c360b569b81b3abf380eec27492316bc292e5150ee0607219a2bd80ba984c7e3f1989bc51e4c5da3ae5070676e0c150d037a86a0f91bfc07cde64c19f9c7a7af44d6929970041448d3b17c249d5e0b5862e9a25209e8f97d7a0f030181504fead2266c873fd235983df3d0657b92096e2b490df33ca115733 -Result = Pass - -Digest = SHA256 -Key = 308206e40201000282018100dca98304b729e819b340e26cecb730aecbd8930e334c731493b180de970e6d3bc579f86c8d5d032f8cd33c4397ee7ffd019d51b0a7dbe4f52505a1a34ae35d23cfaaf594419d509f469b1369589f9c8616a7d698513bc1d423d70070d3d72b996c23abe68b22ccc39aabd16507124042c88d4da6a7451288ec87c9244be226aac02d1817682f80cc34c6eaf37ec84d247aaedebb56c3bbcaffb5cf42f61fe1b7f3fc89748e213973bf5f679d8b8b42a47ac4afd9e51e1d1214dfe1a7e1169080bd9ad91758f6c0f9b22ae40af6b41403d8f2d96db5a088daa5ef8683f86f501f7ad3f358b6337da55c6cfc003197420c1c75abdb7be1403ea4f3e64259f5c6da3325bb87d605b6e14b5350e6e1455c9d497d81046608e38795dc85aba406c9de1f4f9990d5153b98bbabbdcbd6bb18854312b2da48b411e838f26ae3109f104dfd1619f991824ec819861e5199f26bb9b3b299bfa9ec2fd691271b58a8adecbf0ff627b54336f3df7003d70e37d11ddbd930d9aba7e88ed401acb44092fd53d5020400eaf05d028201802d6db91eb32e36e5d5127deb034d14072fe60c1cd13c8c3dd9adbc87140b5e7136f4f89e61bbee7826f45ac1d99194fbaa8c5a0bb94db31d93723b51419d9c6f6eeb5f3610b67f4b4e2ade05cc6b8990e8832cf4cd40f2df0388c9a52072e27efebae20b4ad5951f4d20dd18943e58b786d8797652b2bb759c319d2b0046dbf69c53c075d00c287b876042fafa23fe4dd705e4e423277c9000311e94ea3f7456e32fd12afe4a2bde358a65824f1055064823c893fc93be3b8c658bb441d7f0b00ac246bf043a9c0053d319f003ef5a5533f74d630d8ce93bab416a82951e05b82c6036593eca89f0ebacd7d51ed9610af43537fcd266e5e47c0d25fedad6d047a1a1ee3eb444367e3eff7c7520ca4f779f2027fe45036204168454df4918b547a4d19e938f3c6db6ca2702ad9bbda1261c64d00b578285bdcfc9851f96a4f2cd14d66b9c1f65742a1344948c9f1da8d338ed4e3deb1ebadf11f8c281944e8849823496f86111f378bdd084c99f65fb9b4ee6271b1d1be424c294d185d9fd9cdf0281c100fa9977bca043a140e06158bc710f33918c7e503f1dd495b4f91920f6214d859f900c6a211849f566bc37417ec8a68f6874ce6160b34707a7341b1c00934e6ba3e60f63c3f4faf486be9780335b4eaee54ddd2f172a91b7a57a07905be685e49921e9d1af40e91b47be5bc1c0dfe3d10ad6b3b6aae0a43f82920c553b2e4932ff630297f2161918c684528373ed0af0d24b069ac4f511d8fd0301eff0365300a1f79e44d4ed21414940103aef3411568aae6f00b7c105453495c7cc6d3a76bcfb0281c100e16ae200e34b1638e158cf98278f3f62f75c97303be14265fbf11816941b366c4f95fdc3a7efe999d74b3919e6b10980ccd6e63e5ca118476b9144e59274c4a4c3f309e0497f9c8e21ce32eda4974cde4f28c66d46b6e63c2ce2bc8c629a974d4256d268dad6c7d5f80c3ad5ed4856d651ed619041acc611d5e2c30a7d11b60e5c665569fd9315120abc590c861e4ecb16df430d9056d517ff060947fe556acc7ba94273398339616f45ada042633bbb1df5e7cc313df660c02f11dc6dd0b96f0281c006d864e60c4be32d580088c14ee2d782fdccb15a5a4d35418f742cea6f410392183b1688d924e3efd42ee87ec26e0a93ab01973ca14955e55556f9ce7efbed1a1474b01e9dd592fb27b01bde028ae3b939c219aebb19d4474afe735e18e9398df62b0e166d7677f0fea0de612e3ce5bca3d5f0d8603356240c8b21f65a4c8dfeadaaddd410f488d430b91f8495b920439ccceab14d12b5eb6ac723a97a382e3efb2a88588bf8f1217d3c2b7d7da4ee64a0c9429a4e1927a8b8aa589353fce4390281c100c3d5f93ebec8efd817d633f1095c7d4d839061701bae2f39cb4d1607e0502ecd8bd58b562dac772906908e0bc63093aa3a1be5da2f6d16b3c593d803ddff8c126e4a8caf51820eb7cbead85a60dc8e46e80bf50bab1c9c5ed90b7d72ceadc30a6bb4f055975e5ef78d1625c662a927f0d9d86a99002fedb60a7c5d752f90adc118068ab1eaf809d7619d7ff3c605e31b1001d96dbf04c622a0192a59ba29369148789423ba5cff12c503c6693c4e515d7775250d1fa52d0d06c093c2226eeeb30281c01af7aa2c6e5de3ebed447b0327ed8c09460a78d700097a147d4b59df7d4ca448ff63f0a4e82f842528b750253309d41c74b0a8e3ab293a69a2ecfb589aa3351fcb9cee01fdf073590d5cc91bd86b44c0dd73ff8ac183a77029ab15adace35707b2e0bb94e02c8badae6860cf6e9d16b913b929a4b32b17872ac278653f7d65cb795c514f15a1944fc78095e9c6567f6cd5882e23e4f4e571a168721c8e70924c1a3d9616fc1f0dd3b05278243bf9aa920fa05b3a53660506f71d3fa0bdc8ff9a -Msg = f996f3adc2aba505ad4ae52bc5a43371a33d0f28e1950b66d208240670f352ef96185e9a7044f4ce2f2ff9ae01a31ef640e0b682e940c5105117594613dd1df74d8f2ba20c52223b045a782e850a12a2aa5c12fad484f1a256d0cd0872d304e885c201cd7e1e56d594930bb4392136fb4979cc9b88aab7a44bfc2953751c2f4c -Sig = 30b348624faa9985fcd95f9c7ead3afe6456badf8c0fedbdadb3a9003a6702973acdb4e86652367db23e0a8141880d6631834f9f171c94a8fe9c315bcb8680ecfb5a4f59b45d4e4c3c05828b7faaa8e4234aada4e766646cc510d07b42bd3883a83b5bcb92d9e7cc1ddf590a690111bfc62a51af7e55543ea5188c92453d41d3e8fdabee3e1defa9d0afdb85c8153a5019ae45563ea3080a3022668168f0c273a6db1afadcd5edbca5021c2e53f4d951c604206ae10f287f451867271d370482791cdfdcb6a4010f6b3d9b928563d168da19f1c1e570f8c158f3d490b29aa23abd1ffdf20866c34c6e63b9e8a9a02d7a1b196d055f4c53ce82b400e4ab9e1b9d70d0049d6d57cf0a4949cfc68d633882882dcfdfc50cf449df10acf20305c2aa43bda10fd8a10b4ecaa23100aa47e92936dce1bfb8d6595235bbfe2c8585cb1647b2beacb1e1d4b6cef758811a68330fa9c3a82573c08fa2cda5a03f3425554e45d98c1645c5bd27d12e6c20b2c462a746e882a3421a7b1b1e25b4c36c8b16a1 -Result = Pass - -Digest = SHA256 -Key = 308206e40201000282018100dca98304b729e819b340e26cecb730aecbd8930e334c731493b180de970e6d3bc579f86c8d5d032f8cd33c4397ee7ffd019d51b0a7dbe4f52505a1a34ae35d23cfaaf594419d509f469b1369589f9c8616a7d698513bc1d423d70070d3d72b996c23abe68b22ccc39aabd16507124042c88d4da6a7451288ec87c9244be226aac02d1817682f80cc34c6eaf37ec84d247aaedebb56c3bbcaffb5cf42f61fe1b7f3fc89748e213973bf5f679d8b8b42a47ac4afd9e51e1d1214dfe1a7e1169080bd9ad91758f6c0f9b22ae40af6b41403d8f2d96db5a088daa5ef8683f86f501f7ad3f358b6337da55c6cfc003197420c1c75abdb7be1403ea4f3e64259f5c6da3325bb87d605b6e14b5350e6e1455c9d497d81046608e38795dc85aba406c9de1f4f9990d5153b98bbabbdcbd6bb18854312b2da48b411e838f26ae3109f104dfd1619f991824ec819861e5199f26bb9b3b299bfa9ec2fd691271b58a8adecbf0ff627b54336f3df7003d70e37d11ddbd930d9aba7e88ed401acb44092fd53d5020400eaf05d028201802d6db91eb32e36e5d5127deb034d14072fe60c1cd13c8c3dd9adbc87140b5e7136f4f89e61bbee7826f45ac1d99194fbaa8c5a0bb94db31d93723b51419d9c6f6eeb5f3610b67f4b4e2ade05cc6b8990e8832cf4cd40f2df0388c9a52072e27efebae20b4ad5951f4d20dd18943e58b786d8797652b2bb759c319d2b0046dbf69c53c075d00c287b876042fafa23fe4dd705e4e423277c9000311e94ea3f7456e32fd12afe4a2bde358a65824f1055064823c893fc93be3b8c658bb441d7f0b00ac246bf043a9c0053d319f003ef5a5533f74d630d8ce93bab416a82951e05b82c6036593eca89f0ebacd7d51ed9610af43537fcd266e5e47c0d25fedad6d047a1a1ee3eb444367e3eff7c7520ca4f779f2027fe45036204168454df4918b547a4d19e938f3c6db6ca2702ad9bbda1261c64d00b578285bdcfc9851f96a4f2cd14d66b9c1f65742a1344948c9f1da8d338ed4e3deb1ebadf11f8c281944e8849823496f86111f378bdd084c99f65fb9b4ee6271b1d1be424c294d185d9fd9cdf0281c100fa9977bca043a140e06158bc710f33918c7e503f1dd495b4f91920f6214d859f900c6a211849f566bc37417ec8a68f6874ce6160b34707a7341b1c00934e6ba3e60f63c3f4faf486be9780335b4eaee54ddd2f172a91b7a57a07905be685e49921e9d1af40e91b47be5bc1c0dfe3d10ad6b3b6aae0a43f82920c553b2e4932ff630297f2161918c684528373ed0af0d24b069ac4f511d8fd0301eff0365300a1f79e44d4ed21414940103aef3411568aae6f00b7c105453495c7cc6d3a76bcfb0281c100e16ae200e34b1638e158cf98278f3f62f75c97303be14265fbf11816941b366c4f95fdc3a7efe999d74b3919e6b10980ccd6e63e5ca118476b9144e59274c4a4c3f309e0497f9c8e21ce32eda4974cde4f28c66d46b6e63c2ce2bc8c629a974d4256d268dad6c7d5f80c3ad5ed4856d651ed619041acc611d5e2c30a7d11b60e5c665569fd9315120abc590c861e4ecb16df430d9056d517ff060947fe556acc7ba94273398339616f45ada042633bbb1df5e7cc313df660c02f11dc6dd0b96f0281c006d864e60c4be32d580088c14ee2d782fdccb15a5a4d35418f742cea6f410392183b1688d924e3efd42ee87ec26e0a93ab01973ca14955e55556f9ce7efbed1a1474b01e9dd592fb27b01bde028ae3b939c219aebb19d4474afe735e18e9398df62b0e166d7677f0fea0de612e3ce5bca3d5f0d8603356240c8b21f65a4c8dfeadaaddd410f488d430b91f8495b920439ccceab14d12b5eb6ac723a97a382e3efb2a88588bf8f1217d3c2b7d7da4ee64a0c9429a4e1927a8b8aa589353fce4390281c100c3d5f93ebec8efd817d633f1095c7d4d839061701bae2f39cb4d1607e0502ecd8bd58b562dac772906908e0bc63093aa3a1be5da2f6d16b3c593d803ddff8c126e4a8caf51820eb7cbead85a60dc8e46e80bf50bab1c9c5ed90b7d72ceadc30a6bb4f055975e5ef78d1625c662a927f0d9d86a99002fedb60a7c5d752f90adc118068ab1eaf809d7619d7ff3c605e31b1001d96dbf04c622a0192a59ba29369148789423ba5cff12c503c6693c4e515d7775250d1fa52d0d06c093c2226eeeb30281c01af7aa2c6e5de3ebed447b0327ed8c09460a78d700097a147d4b59df7d4ca448ff63f0a4e82f842528b750253309d41c74b0a8e3ab293a69a2ecfb589aa3351fcb9cee01fdf073590d5cc91bd86b44c0dd73ff8ac183a77029ab15adace35707b2e0bb94e02c8badae6860cf6e9d16b913b929a4b32b17872ac278653f7d65cb795c514f15a1944fc78095e9c6567f6cd5882e23e4f4e571a168721c8e70924c1a3d9616fc1f0dd3b05278243bf9aa920fa05b3a53660506f71d3fa0bdc8ff9a -Msg = 6ace052d7e99cd973bb5c9f6679b1c305e07208965fe58c63b10a692f1dbbe22fcd0db15893ab19e107ba2e42c9934a9aafac32adf6c73473f6969e42c983b8f0c96a4639ef77d2c8e88e8cc47d7cfdd08f68d973a7beaf401cb4d1311992ddac3a9c9e067da198adc6304745f5dd312a182e6971c34a515a6c1bae647e57e4c -Sig = 5f0e74f454754a3074faafc605f3c9af47604a8983650a9b6211fb191d9afa5315df4db4501fd4f04c741d764656d4a5d006388ad8fdb219ec6b756908e23b30cb639ffa7bbf2874713bfd5a1062c19d04e0e4a74b14446a7fdf5cb812e9ac7b6012d9ae991c47656d2aded24074bb8a38b1a88b1c2b131e5b09c93757fdb2d6b69aa8265a435fba00aeb36a1f629bc34b876089d28a948dd6ab4c899430da60a26f6c13603fc889c7b2936ca3c5156bd7fa6e34eac9e04800833ef0cb9b6eef788c0ef0021a4536fb8371fa3e2c8bb8befac16e8092d69c571c1e15fd255ec0a07acf9ae9953831efd3dcbef44e0fccebb1af959d71f50130e8acb4fa2319261fba12f2715def82bfafbf40e345ec5dcdab5c1bf5f66b1d0e9f7a9c62c9375746e1ae0c8f14a489184383e81dce2070ad4b525df76b446b1f22921d424d9ba3ce21577501df6280fdc69f0239ae1127b69950759d5f0b693f54e87e0763623bf5d3ff69430081b9c9e2445a05e115675e090bcab2aa1d75ceee2ad619ec8b80 -Result = Pass - -Digest = SHA256 -Key = 308206e40201000282018100dca98304b729e819b340e26cecb730aecbd8930e334c731493b180de970e6d3bc579f86c8d5d032f8cd33c4397ee7ffd019d51b0a7dbe4f52505a1a34ae35d23cfaaf594419d509f469b1369589f9c8616a7d698513bc1d423d70070d3d72b996c23abe68b22ccc39aabd16507124042c88d4da6a7451288ec87c9244be226aac02d1817682f80cc34c6eaf37ec84d247aaedebb56c3bbcaffb5cf42f61fe1b7f3fc89748e213973bf5f679d8b8b42a47ac4afd9e51e1d1214dfe1a7e1169080bd9ad91758f6c0f9b22ae40af6b41403d8f2d96db5a088daa5ef8683f86f501f7ad3f358b6337da55c6cfc003197420c1c75abdb7be1403ea4f3e64259f5c6da3325bb87d605b6e14b5350e6e1455c9d497d81046608e38795dc85aba406c9de1f4f9990d5153b98bbabbdcbd6bb18854312b2da48b411e838f26ae3109f104dfd1619f991824ec819861e5199f26bb9b3b299bfa9ec2fd691271b58a8adecbf0ff627b54336f3df7003d70e37d11ddbd930d9aba7e88ed401acb44092fd53d5020400eaf05d028201802d6db91eb32e36e5d5127deb034d14072fe60c1cd13c8c3dd9adbc87140b5e7136f4f89e61bbee7826f45ac1d99194fbaa8c5a0bb94db31d93723b51419d9c6f6eeb5f3610b67f4b4e2ade05cc6b8990e8832cf4cd40f2df0388c9a52072e27efebae20b4ad5951f4d20dd18943e58b786d8797652b2bb759c319d2b0046dbf69c53c075d00c287b876042fafa23fe4dd705e4e423277c9000311e94ea3f7456e32fd12afe4a2bde358a65824f1055064823c893fc93be3b8c658bb441d7f0b00ac246bf043a9c0053d319f003ef5a5533f74d630d8ce93bab416a82951e05b82c6036593eca89f0ebacd7d51ed9610af43537fcd266e5e47c0d25fedad6d047a1a1ee3eb444367e3eff7c7520ca4f779f2027fe45036204168454df4918b547a4d19e938f3c6db6ca2702ad9bbda1261c64d00b578285bdcfc9851f96a4f2cd14d66b9c1f65742a1344948c9f1da8d338ed4e3deb1ebadf11f8c281944e8849823496f86111f378bdd084c99f65fb9b4ee6271b1d1be424c294d185d9fd9cdf0281c100fa9977bca043a140e06158bc710f33918c7e503f1dd495b4f91920f6214d859f900c6a211849f566bc37417ec8a68f6874ce6160b34707a7341b1c00934e6ba3e60f63c3f4faf486be9780335b4eaee54ddd2f172a91b7a57a07905be685e49921e9d1af40e91b47be5bc1c0dfe3d10ad6b3b6aae0a43f82920c553b2e4932ff630297f2161918c684528373ed0af0d24b069ac4f511d8fd0301eff0365300a1f79e44d4ed21414940103aef3411568aae6f00b7c105453495c7cc6d3a76bcfb0281c100e16ae200e34b1638e158cf98278f3f62f75c97303be14265fbf11816941b366c4f95fdc3a7efe999d74b3919e6b10980ccd6e63e5ca118476b9144e59274c4a4c3f309e0497f9c8e21ce32eda4974cde4f28c66d46b6e63c2ce2bc8c629a974d4256d268dad6c7d5f80c3ad5ed4856d651ed619041acc611d5e2c30a7d11b60e5c665569fd9315120abc590c861e4ecb16df430d9056d517ff060947fe556acc7ba94273398339616f45ada042633bbb1df5e7cc313df660c02f11dc6dd0b96f0281c006d864e60c4be32d580088c14ee2d782fdccb15a5a4d35418f742cea6f410392183b1688d924e3efd42ee87ec26e0a93ab01973ca14955e55556f9ce7efbed1a1474b01e9dd592fb27b01bde028ae3b939c219aebb19d4474afe735e18e9398df62b0e166d7677f0fea0de612e3ce5bca3d5f0d8603356240c8b21f65a4c8dfeadaaddd410f488d430b91f8495b920439ccceab14d12b5eb6ac723a97a382e3efb2a88588bf8f1217d3c2b7d7da4ee64a0c9429a4e1927a8b8aa589353fce4390281c100c3d5f93ebec8efd817d633f1095c7d4d839061701bae2f39cb4d1607e0502ecd8bd58b562dac772906908e0bc63093aa3a1be5da2f6d16b3c593d803ddff8c126e4a8caf51820eb7cbead85a60dc8e46e80bf50bab1c9c5ed90b7d72ceadc30a6bb4f055975e5ef78d1625c662a927f0d9d86a99002fedb60a7c5d752f90adc118068ab1eaf809d7619d7ff3c605e31b1001d96dbf04c622a0192a59ba29369148789423ba5cff12c503c6693c4e515d7775250d1fa52d0d06c093c2226eeeb30281c01af7aa2c6e5de3ebed447b0327ed8c09460a78d700097a147d4b59df7d4ca448ff63f0a4e82f842528b750253309d41c74b0a8e3ab293a69a2ecfb589aa3351fcb9cee01fdf073590d5cc91bd86b44c0dd73ff8ac183a77029ab15adace35707b2e0bb94e02c8badae6860cf6e9d16b913b929a4b32b17872ac278653f7d65cb795c514f15a1944fc78095e9c6567f6cd5882e23e4f4e571a168721c8e70924c1a3d9616fc1f0dd3b05278243bf9aa920fa05b3a53660506f71d3fa0bdc8ff9a -Msg = 0e49740fdcca6bfce294c11f45407805b3da412b01ef3fb513e70e62fd9504c0670db69c36b6bebd69a0bcd240179ba8a47816a0c3437a61fb72adcaf9096f2a22efe0b431fc422d225301e850f2f0f4da87d6944a8529ef79781909ad96d1f20596f93e17c57fb4d756974bbbf900521cb089eee0ded5c956a15b096162b07f -Sig = 7bbb3ddd17a42be7cc4e7eaf456509a4ba58d40c49a3d99573b733e1942f9fca20ba8b910708d6e750367e847302fc603b8063c19af883e7507fb0d9cc2be37479a37cca25b8c7c46f6bf661dc6a3232f88b483f1b8f41b46d49ba3f1795d68eaad4a2556fb5d7873bbb6501ecf06ac558235ed13990b0e16f67965b09366bcb362cfc6fb978f4f68d8146dc8b819804df424e8ca5b63cf1fcf97bbf300d0b998860798a63424383fcd81d37773d59bb13b4fa5d468cd128bbab18a8ce5173be5d9d54d3177f0245788409973df4a9016b944baefbf3bf1146a9393d22e35ec2be0ae6f4c31dc4981f40fc1baf382600699eafcea92cbe24e26ee846fa23bc193b6e721401b7ac3f5f4ebeb633979f8ef35f4ab1117a869d5b9dbb7482f0d5a59e4163548d2512ae067205b57d030c483f720d2c44350428f5268943fc5f6ea1c88e2ec13ab3dc1456e96a3b8e7c121af4d6a5fe4ee55e99fbc3592a487c194bc2f2bf6e79fb79c2876cf3365e075beeacc7db4db7ee69e7f1fe12a327e6cb0f -Result = Pass - -Digest = SHA256 -Key = 308206e40201000282018100dca98304b729e819b340e26cecb730aecbd8930e334c731493b180de970e6d3bc579f86c8d5d032f8cd33c4397ee7ffd019d51b0a7dbe4f52505a1a34ae35d23cfaaf594419d509f469b1369589f9c8616a7d698513bc1d423d70070d3d72b996c23abe68b22ccc39aabd16507124042c88d4da6a7451288ec87c9244be226aac02d1817682f80cc34c6eaf37ec84d247aaedebb56c3bbcaffb5cf42f61fe1b7f3fc89748e213973bf5f679d8b8b42a47ac4afd9e51e1d1214dfe1a7e1169080bd9ad91758f6c0f9b22ae40af6b41403d8f2d96db5a088daa5ef8683f86f501f7ad3f358b6337da55c6cfc003197420c1c75abdb7be1403ea4f3e64259f5c6da3325bb87d605b6e14b5350e6e1455c9d497d81046608e38795dc85aba406c9de1f4f9990d5153b98bbabbdcbd6bb18854312b2da48b411e838f26ae3109f104dfd1619f991824ec819861e5199f26bb9b3b299bfa9ec2fd691271b58a8adecbf0ff627b54336f3df7003d70e37d11ddbd930d9aba7e88ed401acb44092fd53d5020400eaf05d028201802d6db91eb32e36e5d5127deb034d14072fe60c1cd13c8c3dd9adbc87140b5e7136f4f89e61bbee7826f45ac1d99194fbaa8c5a0bb94db31d93723b51419d9c6f6eeb5f3610b67f4b4e2ade05cc6b8990e8832cf4cd40f2df0388c9a52072e27efebae20b4ad5951f4d20dd18943e58b786d8797652b2bb759c319d2b0046dbf69c53c075d00c287b876042fafa23fe4dd705e4e423277c9000311e94ea3f7456e32fd12afe4a2bde358a65824f1055064823c893fc93be3b8c658bb441d7f0b00ac246bf043a9c0053d319f003ef5a5533f74d630d8ce93bab416a82951e05b82c6036593eca89f0ebacd7d51ed9610af43537fcd266e5e47c0d25fedad6d047a1a1ee3eb444367e3eff7c7520ca4f779f2027fe45036204168454df4918b547a4d19e938f3c6db6ca2702ad9bbda1261c64d00b578285bdcfc9851f96a4f2cd14d66b9c1f65742a1344948c9f1da8d338ed4e3deb1ebadf11f8c281944e8849823496f86111f378bdd084c99f65fb9b4ee6271b1d1be424c294d185d9fd9cdf0281c100fa9977bca043a140e06158bc710f33918c7e503f1dd495b4f91920f6214d859f900c6a211849f566bc37417ec8a68f6874ce6160b34707a7341b1c00934e6ba3e60f63c3f4faf486be9780335b4eaee54ddd2f172a91b7a57a07905be685e49921e9d1af40e91b47be5bc1c0dfe3d10ad6b3b6aae0a43f82920c553b2e4932ff630297f2161918c684528373ed0af0d24b069ac4f511d8fd0301eff0365300a1f79e44d4ed21414940103aef3411568aae6f00b7c105453495c7cc6d3a76bcfb0281c100e16ae200e34b1638e158cf98278f3f62f75c97303be14265fbf11816941b366c4f95fdc3a7efe999d74b3919e6b10980ccd6e63e5ca118476b9144e59274c4a4c3f309e0497f9c8e21ce32eda4974cde4f28c66d46b6e63c2ce2bc8c629a974d4256d268dad6c7d5f80c3ad5ed4856d651ed619041acc611d5e2c30a7d11b60e5c665569fd9315120abc590c861e4ecb16df430d9056d517ff060947fe556acc7ba94273398339616f45ada042633bbb1df5e7cc313df660c02f11dc6dd0b96f0281c006d864e60c4be32d580088c14ee2d782fdccb15a5a4d35418f742cea6f410392183b1688d924e3efd42ee87ec26e0a93ab01973ca14955e55556f9ce7efbed1a1474b01e9dd592fb27b01bde028ae3b939c219aebb19d4474afe735e18e9398df62b0e166d7677f0fea0de612e3ce5bca3d5f0d8603356240c8b21f65a4c8dfeadaaddd410f488d430b91f8495b920439ccceab14d12b5eb6ac723a97a382e3efb2a88588bf8f1217d3c2b7d7da4ee64a0c9429a4e1927a8b8aa589353fce4390281c100c3d5f93ebec8efd817d633f1095c7d4d839061701bae2f39cb4d1607e0502ecd8bd58b562dac772906908e0bc63093aa3a1be5da2f6d16b3c593d803ddff8c126e4a8caf51820eb7cbead85a60dc8e46e80bf50bab1c9c5ed90b7d72ceadc30a6bb4f055975e5ef78d1625c662a927f0d9d86a99002fedb60a7c5d752f90adc118068ab1eaf809d7619d7ff3c605e31b1001d96dbf04c622a0192a59ba29369148789423ba5cff12c503c6693c4e515d7775250d1fa52d0d06c093c2226eeeb30281c01af7aa2c6e5de3ebed447b0327ed8c09460a78d700097a147d4b59df7d4ca448ff63f0a4e82f842528b750253309d41c74b0a8e3ab293a69a2ecfb589aa3351fcb9cee01fdf073590d5cc91bd86b44c0dd73ff8ac183a77029ab15adace35707b2e0bb94e02c8badae6860cf6e9d16b913b929a4b32b17872ac278653f7d65cb795c514f15a1944fc78095e9c6567f6cd5882e23e4f4e571a168721c8e70924c1a3d9616fc1f0dd3b05278243bf9aa920fa05b3a53660506f71d3fa0bdc8ff9a -Msg = 0e675dac9aec910106a6ab219b4cceb52ded2549e899c9a24d5ee55177761888a3be1a2def6aa32d62f788132d6227d9309806fdc02db7d8a850ff2c6dff37fcd777f1a0acefdf18bf85f1a12979be86d799253945fc34a288f348b7923d764db27a2a2d5ae20e6b25372ef318f8596529d8ca23fd6f08a8f62e0a1b6d989f23 -Sig = 8052d95f12ce0e6e53a5a356a0eb353bdcc1a66514d6cfb3a3d96155310bdda0a0d1795f97643f3a4496634f2dd9b95a2138ee390e1e74be3134f3f47a919ee7b59f8ecd272ab88c82cbce7c217e5f92d057a5b00fbf0575cdaecd7dc285a4218c8a955216598f0742671e018e8e4e76839a575f50b2102a8b77d1b84f6dce98d78e5758e0a6f92bf35d6a2f18ad400925d7880f9efc774a8c7ebf64885cd2f6f629b54a7c12ec91d39b3c2518241fdc322d9b235a8ea44f77e82f3dc4f728f620c07d1e7ff4094f29c674ab0f0802efa1c9e6481ebb84e0bf13ef468d8cca114570b9edcddf98ac4a834fe7a0d5c6fae8a60a48399f3c8af42ff4026e42a81aac36114ffc053f3f729b7cf9a97a56848ebea0115aa8298341aa226963ebdf57ab2d8e4b9000dd051a6c5d69f60e1dc1b33f2094fdbf8e5b627bc0764db9522cbbc081dbf38c21b13f980813bd2b00c757ebb8c0b21213152e694039f306f7342857651f722bdda01212a8552799bda6ef07c5207dc744ef7969afd5af2e6f12 -Result = Pass - -Digest = SHA256 -Key = 308206e40201000282018100dca98304b729e819b340e26cecb730aecbd8930e334c731493b180de970e6d3bc579f86c8d5d032f8cd33c4397ee7ffd019d51b0a7dbe4f52505a1a34ae35d23cfaaf594419d509f469b1369589f9c8616a7d698513bc1d423d70070d3d72b996c23abe68b22ccc39aabd16507124042c88d4da6a7451288ec87c9244be226aac02d1817682f80cc34c6eaf37ec84d247aaedebb56c3bbcaffb5cf42f61fe1b7f3fc89748e213973bf5f679d8b8b42a47ac4afd9e51e1d1214dfe1a7e1169080bd9ad91758f6c0f9b22ae40af6b41403d8f2d96db5a088daa5ef8683f86f501f7ad3f358b6337da55c6cfc003197420c1c75abdb7be1403ea4f3e64259f5c6da3325bb87d605b6e14b5350e6e1455c9d497d81046608e38795dc85aba406c9de1f4f9990d5153b98bbabbdcbd6bb18854312b2da48b411e838f26ae3109f104dfd1619f991824ec819861e5199f26bb9b3b299bfa9ec2fd691271b58a8adecbf0ff627b54336f3df7003d70e37d11ddbd930d9aba7e88ed401acb44092fd53d5020400eaf05d028201802d6db91eb32e36e5d5127deb034d14072fe60c1cd13c8c3dd9adbc87140b5e7136f4f89e61bbee7826f45ac1d99194fbaa8c5a0bb94db31d93723b51419d9c6f6eeb5f3610b67f4b4e2ade05cc6b8990e8832cf4cd40f2df0388c9a52072e27efebae20b4ad5951f4d20dd18943e58b786d8797652b2bb759c319d2b0046dbf69c53c075d00c287b876042fafa23fe4dd705e4e423277c9000311e94ea3f7456e32fd12afe4a2bde358a65824f1055064823c893fc93be3b8c658bb441d7f0b00ac246bf043a9c0053d319f003ef5a5533f74d630d8ce93bab416a82951e05b82c6036593eca89f0ebacd7d51ed9610af43537fcd266e5e47c0d25fedad6d047a1a1ee3eb444367e3eff7c7520ca4f779f2027fe45036204168454df4918b547a4d19e938f3c6db6ca2702ad9bbda1261c64d00b578285bdcfc9851f96a4f2cd14d66b9c1f65742a1344948c9f1da8d338ed4e3deb1ebadf11f8c281944e8849823496f86111f378bdd084c99f65fb9b4ee6271b1d1be424c294d185d9fd9cdf0281c100fa9977bca043a140e06158bc710f33918c7e503f1dd495b4f91920f6214d859f900c6a211849f566bc37417ec8a68f6874ce6160b34707a7341b1c00934e6ba3e60f63c3f4faf486be9780335b4eaee54ddd2f172a91b7a57a07905be685e49921e9d1af40e91b47be5bc1c0dfe3d10ad6b3b6aae0a43f82920c553b2e4932ff630297f2161918c684528373ed0af0d24b069ac4f511d8fd0301eff0365300a1f79e44d4ed21414940103aef3411568aae6f00b7c105453495c7cc6d3a76bcfb0281c100e16ae200e34b1638e158cf98278f3f62f75c97303be14265fbf11816941b366c4f95fdc3a7efe999d74b3919e6b10980ccd6e63e5ca118476b9144e59274c4a4c3f309e0497f9c8e21ce32eda4974cde4f28c66d46b6e63c2ce2bc8c629a974d4256d268dad6c7d5f80c3ad5ed4856d651ed619041acc611d5e2c30a7d11b60e5c665569fd9315120abc590c861e4ecb16df430d9056d517ff060947fe556acc7ba94273398339616f45ada042633bbb1df5e7cc313df660c02f11dc6dd0b96f0281c006d864e60c4be32d580088c14ee2d782fdccb15a5a4d35418f742cea6f410392183b1688d924e3efd42ee87ec26e0a93ab01973ca14955e55556f9ce7efbed1a1474b01e9dd592fb27b01bde028ae3b939c219aebb19d4474afe735e18e9398df62b0e166d7677f0fea0de612e3ce5bca3d5f0d8603356240c8b21f65a4c8dfeadaaddd410f488d430b91f8495b920439ccceab14d12b5eb6ac723a97a382e3efb2a88588bf8f1217d3c2b7d7da4ee64a0c9429a4e1927a8b8aa589353fce4390281c100c3d5f93ebec8efd817d633f1095c7d4d839061701bae2f39cb4d1607e0502ecd8bd58b562dac772906908e0bc63093aa3a1be5da2f6d16b3c593d803ddff8c126e4a8caf51820eb7cbead85a60dc8e46e80bf50bab1c9c5ed90b7d72ceadc30a6bb4f055975e5ef78d1625c662a927f0d9d86a99002fedb60a7c5d752f90adc118068ab1eaf809d7619d7ff3c605e31b1001d96dbf04c622a0192a59ba29369148789423ba5cff12c503c6693c4e515d7775250d1fa52d0d06c093c2226eeeb30281c01af7aa2c6e5de3ebed447b0327ed8c09460a78d700097a147d4b59df7d4ca448ff63f0a4e82f842528b750253309d41c74b0a8e3ab293a69a2ecfb589aa3351fcb9cee01fdf073590d5cc91bd86b44c0dd73ff8ac183a77029ab15adace35707b2e0bb94e02c8badae6860cf6e9d16b913b929a4b32b17872ac278653f7d65cb795c514f15a1944fc78095e9c6567f6cd5882e23e4f4e571a168721c8e70924c1a3d9616fc1f0dd3b05278243bf9aa920fa05b3a53660506f71d3fa0bdc8ff9a -Msg = f6a7a6e52659125fbbc8727417283b9a64441f87121e27f386d5019f10cc9b961e09f1b3b0db23630cc0caacb3858c6f93afeeea7e1a6a80dbe0c2bd9c7c939570302dec39a4a25cc0cf1d32a71a75b9a0c302bcdd80b046c86651acf30838cd52e30399a8fab8d03fbd140cdc2f1f02f2480405169820ccb32e5974ffb8b1c8 -Sig = 84603acbfe1f2f769f1a62b0f287f306940b225476714a4b6827c02d7bd052f303f30a5fa6da83e60615305669ca9ec177c5b32b1415eebef78620296ebad6dbbd520839d3aacc9781ac8602ddce0736dcfa7290b45f155b8e924d0afdf7dfc8d199bf09509d0176a68b145756eef53de456e17078859849a352a5bb654239d8ebaf8800ca8263d34a868d52bf8f22644dd9f3c05bd891cd92f263530c5896023c6b213ddb64ede1770ff1686c34036e281e911d9dc960354fd844cb7b22dc0cd81a96203ba818401ccc225f857e59a5cb7ba6dfc7f5135ea32781e63daa14fbda1bacc18ebc50824d4028b8fdecda49e810bae5acc8adc0dca2e236fc832a97330a1214fa0aed15cd10c049efb65ce855c060f05befb317b8065843c4eb5a0371fc6f209f6ffb948c881f2f2091caf0f59f60b72c5f67271bae96b913fd21fa1dfa975d5ecd62b0d50873b686d29c880d36edcad33ec3e2216c9cfcfb4f984c23fde815e280a802428608bed3739af9200de1f85edee2834c04942c068aacd2 -Result = Pass - -Digest = SHA384 -Key = 308206e40201000282018100dca98304b729e819b340e26cecb730aecbd8930e334c731493b180de970e6d3bc579f86c8d5d032f8cd33c4397ee7ffd019d51b0a7dbe4f52505a1a34ae35d23cfaaf594419d509f469b1369589f9c8616a7d698513bc1d423d70070d3d72b996c23abe68b22ccc39aabd16507124042c88d4da6a7451288ec87c9244be226aac02d1817682f80cc34c6eaf37ec84d247aaedebb56c3bbcaffb5cf42f61fe1b7f3fc89748e213973bf5f679d8b8b42a47ac4afd9e51e1d1214dfe1a7e1169080bd9ad91758f6c0f9b22ae40af6b41403d8f2d96db5a088daa5ef8683f86f501f7ad3f358b6337da55c6cfc003197420c1c75abdb7be1403ea4f3e64259f5c6da3325bb87d605b6e14b5350e6e1455c9d497d81046608e38795dc85aba406c9de1f4f9990d5153b98bbabbdcbd6bb18854312b2da48b411e838f26ae3109f104dfd1619f991824ec819861e5199f26bb9b3b299bfa9ec2fd691271b58a8adecbf0ff627b54336f3df7003d70e37d11ddbd930d9aba7e88ed401acb44092fd53d5020400eaf05d028201802d6db91eb32e36e5d5127deb034d14072fe60c1cd13c8c3dd9adbc87140b5e7136f4f89e61bbee7826f45ac1d99194fbaa8c5a0bb94db31d93723b51419d9c6f6eeb5f3610b67f4b4e2ade05cc6b8990e8832cf4cd40f2df0388c9a52072e27efebae20b4ad5951f4d20dd18943e58b786d8797652b2bb759c319d2b0046dbf69c53c075d00c287b876042fafa23fe4dd705e4e423277c9000311e94ea3f7456e32fd12afe4a2bde358a65824f1055064823c893fc93be3b8c658bb441d7f0b00ac246bf043a9c0053d319f003ef5a5533f74d630d8ce93bab416a82951e05b82c6036593eca89f0ebacd7d51ed9610af43537fcd266e5e47c0d25fedad6d047a1a1ee3eb444367e3eff7c7520ca4f779f2027fe45036204168454df4918b547a4d19e938f3c6db6ca2702ad9bbda1261c64d00b578285bdcfc9851f96a4f2cd14d66b9c1f65742a1344948c9f1da8d338ed4e3deb1ebadf11f8c281944e8849823496f86111f378bdd084c99f65fb9b4ee6271b1d1be424c294d185d9fd9cdf0281c100fa9977bca043a140e06158bc710f33918c7e503f1dd495b4f91920f6214d859f900c6a211849f566bc37417ec8a68f6874ce6160b34707a7341b1c00934e6ba3e60f63c3f4faf486be9780335b4eaee54ddd2f172a91b7a57a07905be685e49921e9d1af40e91b47be5bc1c0dfe3d10ad6b3b6aae0a43f82920c553b2e4932ff630297f2161918c684528373ed0af0d24b069ac4f511d8fd0301eff0365300a1f79e44d4ed21414940103aef3411568aae6f00b7c105453495c7cc6d3a76bcfb0281c100e16ae200e34b1638e158cf98278f3f62f75c97303be14265fbf11816941b366c4f95fdc3a7efe999d74b3919e6b10980ccd6e63e5ca118476b9144e59274c4a4c3f309e0497f9c8e21ce32eda4974cde4f28c66d46b6e63c2ce2bc8c629a974d4256d268dad6c7d5f80c3ad5ed4856d651ed619041acc611d5e2c30a7d11b60e5c665569fd9315120abc590c861e4ecb16df430d9056d517ff060947fe556acc7ba94273398339616f45ada042633bbb1df5e7cc313df660c02f11dc6dd0b96f0281c006d864e60c4be32d580088c14ee2d782fdccb15a5a4d35418f742cea6f410392183b1688d924e3efd42ee87ec26e0a93ab01973ca14955e55556f9ce7efbed1a1474b01e9dd592fb27b01bde028ae3b939c219aebb19d4474afe735e18e9398df62b0e166d7677f0fea0de612e3ce5bca3d5f0d8603356240c8b21f65a4c8dfeadaaddd410f488d430b91f8495b920439ccceab14d12b5eb6ac723a97a382e3efb2a88588bf8f1217d3c2b7d7da4ee64a0c9429a4e1927a8b8aa589353fce4390281c100c3d5f93ebec8efd817d633f1095c7d4d839061701bae2f39cb4d1607e0502ecd8bd58b562dac772906908e0bc63093aa3a1be5da2f6d16b3c593d803ddff8c126e4a8caf51820eb7cbead85a60dc8e46e80bf50bab1c9c5ed90b7d72ceadc30a6bb4f055975e5ef78d1625c662a927f0d9d86a99002fedb60a7c5d752f90adc118068ab1eaf809d7619d7ff3c605e31b1001d96dbf04c622a0192a59ba29369148789423ba5cff12c503c6693c4e515d7775250d1fa52d0d06c093c2226eeeb30281c01af7aa2c6e5de3ebed447b0327ed8c09460a78d700097a147d4b59df7d4ca448ff63f0a4e82f842528b750253309d41c74b0a8e3ab293a69a2ecfb589aa3351fcb9cee01fdf073590d5cc91bd86b44c0dd73ff8ac183a77029ab15adace35707b2e0bb94e02c8badae6860cf6e9d16b913b929a4b32b17872ac278653f7d65cb795c514f15a1944fc78095e9c6567f6cd5882e23e4f4e571a168721c8e70924c1a3d9616fc1f0dd3b05278243bf9aa920fa05b3a53660506f71d3fa0bdc8ff9a -Msg = bb294b95d913005b110987cde45887484ae6df794873dfc5c41fb7e8992c2fdce70699fcac8004699961b3ad1e1fce9ec8ea5685ccec5e80e4d0792559816f68613434bfaca81a843aac459a6fe35f5369c48e9191e4a32c70789594c5152db8d4bb02260012a8739cf325ddff2aa42fd67b6ee5bfe31591131ff27d0273d292 -Sig = 32637c60798b450bff100bff12838357deff281d5b31e4f4c2cfc96eb779ce6d31b1ce8bd7aa7fa88ddc4279c8c3280604b018ccf452004a1488ed4750181c5025636511ac6724fe51761c27d7cf9a0c8782ea2231268853c4b1f7acb0005e5687c8f3df16c962f02ce56b23d387a2baadc8bec94229c3557526e61707a8b59293a976e32c7fa133285088f3ce3e677788aaa947e7622c757e844b117592be99fe45376f8b3013e8772ec92c5bb0b9fa301b95544599690ad93668d83b2daa7df05c66214e275014780a912d8b1932d7a655058e743f50b074b1d9691ca23a2f95f6affbd516d64ccb2aa43c236eb95d36d272545e3beb8ff5aacd95b30f7f1d6418af042cd9a0cf0189846262322a18875ae4c3e68e4e8ffaa0276cdd99a0047c86c0f71d2deefd50642d29c195e6d14fb46fbac33a508c1f03a232de08aae09faf1da8ed2ba2ae84bcca88b78dccbde9afde08a3beb322dc79356b29c84841698914b050beb75a7b2f6701aa8101a5a4955ee27bafe81b21d03b43e3c77398 -Result = Pass - -Digest = SHA384 -Key = 308206e40201000282018100dca98304b729e819b340e26cecb730aecbd8930e334c731493b180de970e6d3bc579f86c8d5d032f8cd33c4397ee7ffd019d51b0a7dbe4f52505a1a34ae35d23cfaaf594419d509f469b1369589f9c8616a7d698513bc1d423d70070d3d72b996c23abe68b22ccc39aabd16507124042c88d4da6a7451288ec87c9244be226aac02d1817682f80cc34c6eaf37ec84d247aaedebb56c3bbcaffb5cf42f61fe1b7f3fc89748e213973bf5f679d8b8b42a47ac4afd9e51e1d1214dfe1a7e1169080bd9ad91758f6c0f9b22ae40af6b41403d8f2d96db5a088daa5ef8683f86f501f7ad3f358b6337da55c6cfc003197420c1c75abdb7be1403ea4f3e64259f5c6da3325bb87d605b6e14b5350e6e1455c9d497d81046608e38795dc85aba406c9de1f4f9990d5153b98bbabbdcbd6bb18854312b2da48b411e838f26ae3109f104dfd1619f991824ec819861e5199f26bb9b3b299bfa9ec2fd691271b58a8adecbf0ff627b54336f3df7003d70e37d11ddbd930d9aba7e88ed401acb44092fd53d5020400eaf05d028201802d6db91eb32e36e5d5127deb034d14072fe60c1cd13c8c3dd9adbc87140b5e7136f4f89e61bbee7826f45ac1d99194fbaa8c5a0bb94db31d93723b51419d9c6f6eeb5f3610b67f4b4e2ade05cc6b8990e8832cf4cd40f2df0388c9a52072e27efebae20b4ad5951f4d20dd18943e58b786d8797652b2bb759c319d2b0046dbf69c53c075d00c287b876042fafa23fe4dd705e4e423277c9000311e94ea3f7456e32fd12afe4a2bde358a65824f1055064823c893fc93be3b8c658bb441d7f0b00ac246bf043a9c0053d319f003ef5a5533f74d630d8ce93bab416a82951e05b82c6036593eca89f0ebacd7d51ed9610af43537fcd266e5e47c0d25fedad6d047a1a1ee3eb444367e3eff7c7520ca4f779f2027fe45036204168454df4918b547a4d19e938f3c6db6ca2702ad9bbda1261c64d00b578285bdcfc9851f96a4f2cd14d66b9c1f65742a1344948c9f1da8d338ed4e3deb1ebadf11f8c281944e8849823496f86111f378bdd084c99f65fb9b4ee6271b1d1be424c294d185d9fd9cdf0281c100fa9977bca043a140e06158bc710f33918c7e503f1dd495b4f91920f6214d859f900c6a211849f566bc37417ec8a68f6874ce6160b34707a7341b1c00934e6ba3e60f63c3f4faf486be9780335b4eaee54ddd2f172a91b7a57a07905be685e49921e9d1af40e91b47be5bc1c0dfe3d10ad6b3b6aae0a43f82920c553b2e4932ff630297f2161918c684528373ed0af0d24b069ac4f511d8fd0301eff0365300a1f79e44d4ed21414940103aef3411568aae6f00b7c105453495c7cc6d3a76bcfb0281c100e16ae200e34b1638e158cf98278f3f62f75c97303be14265fbf11816941b366c4f95fdc3a7efe999d74b3919e6b10980ccd6e63e5ca118476b9144e59274c4a4c3f309e0497f9c8e21ce32eda4974cde4f28c66d46b6e63c2ce2bc8c629a974d4256d268dad6c7d5f80c3ad5ed4856d651ed619041acc611d5e2c30a7d11b60e5c665569fd9315120abc590c861e4ecb16df430d9056d517ff060947fe556acc7ba94273398339616f45ada042633bbb1df5e7cc313df660c02f11dc6dd0b96f0281c006d864e60c4be32d580088c14ee2d782fdccb15a5a4d35418f742cea6f410392183b1688d924e3efd42ee87ec26e0a93ab01973ca14955e55556f9ce7efbed1a1474b01e9dd592fb27b01bde028ae3b939c219aebb19d4474afe735e18e9398df62b0e166d7677f0fea0de612e3ce5bca3d5f0d8603356240c8b21f65a4c8dfeadaaddd410f488d430b91f8495b920439ccceab14d12b5eb6ac723a97a382e3efb2a88588bf8f1217d3c2b7d7da4ee64a0c9429a4e1927a8b8aa589353fce4390281c100c3d5f93ebec8efd817d633f1095c7d4d839061701bae2f39cb4d1607e0502ecd8bd58b562dac772906908e0bc63093aa3a1be5da2f6d16b3c593d803ddff8c126e4a8caf51820eb7cbead85a60dc8e46e80bf50bab1c9c5ed90b7d72ceadc30a6bb4f055975e5ef78d1625c662a927f0d9d86a99002fedb60a7c5d752f90adc118068ab1eaf809d7619d7ff3c605e31b1001d96dbf04c622a0192a59ba29369148789423ba5cff12c503c6693c4e515d7775250d1fa52d0d06c093c2226eeeb30281c01af7aa2c6e5de3ebed447b0327ed8c09460a78d700097a147d4b59df7d4ca448ff63f0a4e82f842528b750253309d41c74b0a8e3ab293a69a2ecfb589aa3351fcb9cee01fdf073590d5cc91bd86b44c0dd73ff8ac183a77029ab15adace35707b2e0bb94e02c8badae6860cf6e9d16b913b929a4b32b17872ac278653f7d65cb795c514f15a1944fc78095e9c6567f6cd5882e23e4f4e571a168721c8e70924c1a3d9616fc1f0dd3b05278243bf9aa920fa05b3a53660506f71d3fa0bdc8ff9a -Msg = f946c6bd5e1d6b89092f3c487c0568fa07c356fae9b8e831b8320289039746a435b122cfbc4a0d316bf90d481d3b7d979cc50d98c1190af8dc58e0035557dd5e94f437f41fab513202643a77748f76c6b77302bf40c392cd18731da082c99bdedeb70e15cd68bff59619cabcc92adcf122753c55afde0817352bc247d1170b8d -Sig = 50706ba49d9a316688a3ee80a0bd986757d43ec83285af9e78196bd52c900d40b280fa0de54e35ace7d6660012f1a66204092f0e634b97e0e51665b4075e36f1422266c7cad7b2d9981b913df3fa3e6a5a1cadfc6378a8540e0faa26f1cc6fb2fb492a80d0a6945bce5bbc23ddb3b10701f0249b27407a6700802e8842ef3cc761c4823acb5d1453508dcdbb979e7bd8d00128e60a9b3789167c91417d93f0e9fbb00c9af1498e09eb6485eb94cea4883f6a256eab2caa826de4fdac01baca3a216e3d204a3d837ffd4d0be2b2cef711909054c4da1d5b93a8f98451c7002ae84a5e7080d98671c50e3c91c4087d0477b104f916010e742f2d207fb40d122d8f211af6d7c5eca49542d9acb0f166e36abc37155070c12e9f28b907d67a2ca70bfce554e1c44c91520e98fc9ad0c0ee477f750516476a94168066ce47000030a99c23e2c38755de946d5edf0d6aa94212f992315b248c1f82723b29c42216c78cdcb668f11278261cee9252c8fd0ed37d0a8580ca9b9fde7505615943712da19a -Result = Pass - -Digest = SHA384 -Key = 308206e40201000282018100dca98304b729e819b340e26cecb730aecbd8930e334c731493b180de970e6d3bc579f86c8d5d032f8cd33c4397ee7ffd019d51b0a7dbe4f52505a1a34ae35d23cfaaf594419d509f469b1369589f9c8616a7d698513bc1d423d70070d3d72b996c23abe68b22ccc39aabd16507124042c88d4da6a7451288ec87c9244be226aac02d1817682f80cc34c6eaf37ec84d247aaedebb56c3bbcaffb5cf42f61fe1b7f3fc89748e213973bf5f679d8b8b42a47ac4afd9e51e1d1214dfe1a7e1169080bd9ad91758f6c0f9b22ae40af6b41403d8f2d96db5a088daa5ef8683f86f501f7ad3f358b6337da55c6cfc003197420c1c75abdb7be1403ea4f3e64259f5c6da3325bb87d605b6e14b5350e6e1455c9d497d81046608e38795dc85aba406c9de1f4f9990d5153b98bbabbdcbd6bb18854312b2da48b411e838f26ae3109f104dfd1619f991824ec819861e5199f26bb9b3b299bfa9ec2fd691271b58a8adecbf0ff627b54336f3df7003d70e37d11ddbd930d9aba7e88ed401acb44092fd53d5020400eaf05d028201802d6db91eb32e36e5d5127deb034d14072fe60c1cd13c8c3dd9adbc87140b5e7136f4f89e61bbee7826f45ac1d99194fbaa8c5a0bb94db31d93723b51419d9c6f6eeb5f3610b67f4b4e2ade05cc6b8990e8832cf4cd40f2df0388c9a52072e27efebae20b4ad5951f4d20dd18943e58b786d8797652b2bb759c319d2b0046dbf69c53c075d00c287b876042fafa23fe4dd705e4e423277c9000311e94ea3f7456e32fd12afe4a2bde358a65824f1055064823c893fc93be3b8c658bb441d7f0b00ac246bf043a9c0053d319f003ef5a5533f74d630d8ce93bab416a82951e05b82c6036593eca89f0ebacd7d51ed9610af43537fcd266e5e47c0d25fedad6d047a1a1ee3eb444367e3eff7c7520ca4f779f2027fe45036204168454df4918b547a4d19e938f3c6db6ca2702ad9bbda1261c64d00b578285bdcfc9851f96a4f2cd14d66b9c1f65742a1344948c9f1da8d338ed4e3deb1ebadf11f8c281944e8849823496f86111f378bdd084c99f65fb9b4ee6271b1d1be424c294d185d9fd9cdf0281c100fa9977bca043a140e06158bc710f33918c7e503f1dd495b4f91920f6214d859f900c6a211849f566bc37417ec8a68f6874ce6160b34707a7341b1c00934e6ba3e60f63c3f4faf486be9780335b4eaee54ddd2f172a91b7a57a07905be685e49921e9d1af40e91b47be5bc1c0dfe3d10ad6b3b6aae0a43f82920c553b2e4932ff630297f2161918c684528373ed0af0d24b069ac4f511d8fd0301eff0365300a1f79e44d4ed21414940103aef3411568aae6f00b7c105453495c7cc6d3a76bcfb0281c100e16ae200e34b1638e158cf98278f3f62f75c97303be14265fbf11816941b366c4f95fdc3a7efe999d74b3919e6b10980ccd6e63e5ca118476b9144e59274c4a4c3f309e0497f9c8e21ce32eda4974cde4f28c66d46b6e63c2ce2bc8c629a974d4256d268dad6c7d5f80c3ad5ed4856d651ed619041acc611d5e2c30a7d11b60e5c665569fd9315120abc590c861e4ecb16df430d9056d517ff060947fe556acc7ba94273398339616f45ada042633bbb1df5e7cc313df660c02f11dc6dd0b96f0281c006d864e60c4be32d580088c14ee2d782fdccb15a5a4d35418f742cea6f410392183b1688d924e3efd42ee87ec26e0a93ab01973ca14955e55556f9ce7efbed1a1474b01e9dd592fb27b01bde028ae3b939c219aebb19d4474afe735e18e9398df62b0e166d7677f0fea0de612e3ce5bca3d5f0d8603356240c8b21f65a4c8dfeadaaddd410f488d430b91f8495b920439ccceab14d12b5eb6ac723a97a382e3efb2a88588bf8f1217d3c2b7d7da4ee64a0c9429a4e1927a8b8aa589353fce4390281c100c3d5f93ebec8efd817d633f1095c7d4d839061701bae2f39cb4d1607e0502ecd8bd58b562dac772906908e0bc63093aa3a1be5da2f6d16b3c593d803ddff8c126e4a8caf51820eb7cbead85a60dc8e46e80bf50bab1c9c5ed90b7d72ceadc30a6bb4f055975e5ef78d1625c662a927f0d9d86a99002fedb60a7c5d752f90adc118068ab1eaf809d7619d7ff3c605e31b1001d96dbf04c622a0192a59ba29369148789423ba5cff12c503c6693c4e515d7775250d1fa52d0d06c093c2226eeeb30281c01af7aa2c6e5de3ebed447b0327ed8c09460a78d700097a147d4b59df7d4ca448ff63f0a4e82f842528b750253309d41c74b0a8e3ab293a69a2ecfb589aa3351fcb9cee01fdf073590d5cc91bd86b44c0dd73ff8ac183a77029ab15adace35707b2e0bb94e02c8badae6860cf6e9d16b913b929a4b32b17872ac278653f7d65cb795c514f15a1944fc78095e9c6567f6cd5882e23e4f4e571a168721c8e70924c1a3d9616fc1f0dd3b05278243bf9aa920fa05b3a53660506f71d3fa0bdc8ff9a -Msg = 9a337d4c0bb9a005b47f4765d696d19dec58bc8482f2173a4a203a0b6d38b4961f6a852e76468e807c7e457683eead5cb8d98642fb76c0a1eeab36414c1899597d57aaf96782ada586f61a423f57953771d520cc4ead90d569f23d950f8dfedddb8355748576e6bbfb6f2e91b3da71753fd2f4ea229f6d20e27db8d05e9fcb68 -Sig = cff7aa7f875642fb9343e07ef5e7303bbf5f069b44c19fbf83e59d422e25267ef9307414b6b1ef61711ed0013276d1a2ad98390474027a0a703bfe8a6e87706059d89c060980c9c9e60dc7e1fb9f777a41785ab4d2b663ba0e3c1921545c479c2a383a50da8e489cb22b71101d0ec148ac70928732a772195a140d080152762a9c40803a39fa2a6978c2a75ac4d8bd1bccaa1f4204ba65edddf32fedf2d9d0a3aed9b06c47e717733c577812d723dba74a852b2905235c812dc5f1d0df0f0de73dfb86221c6ffdd1eda119bbe98d148add36a4fe50489b06aaeefcb5c2066d90fa79738706cd18e474d69609ff1210c77de7cd23ba2a775a4329cb271a826d602c401a71439019cec10cd9f184c4d04584211827b19eadac3258d8a0f2631613f051aae0c613050cb24442f15ed4fe0dbd290e42629141bd2cd56d20584a1d10e1f2c2a9ec731433d5bcd1d318bed5243b4b7d0f9a7982061c55dfaa86b2c01845c021fdd2a978d42034212f43b3351b6adeb03bdd6caf7de059502f16d77348 -Result = Pass - -Digest = SHA384 -Key = 308206e40201000282018100dca98304b729e819b340e26cecb730aecbd8930e334c731493b180de970e6d3bc579f86c8d5d032f8cd33c4397ee7ffd019d51b0a7dbe4f52505a1a34ae35d23cfaaf594419d509f469b1369589f9c8616a7d698513bc1d423d70070d3d72b996c23abe68b22ccc39aabd16507124042c88d4da6a7451288ec87c9244be226aac02d1817682f80cc34c6eaf37ec84d247aaedebb56c3bbcaffb5cf42f61fe1b7f3fc89748e213973bf5f679d8b8b42a47ac4afd9e51e1d1214dfe1a7e1169080bd9ad91758f6c0f9b22ae40af6b41403d8f2d96db5a088daa5ef8683f86f501f7ad3f358b6337da55c6cfc003197420c1c75abdb7be1403ea4f3e64259f5c6da3325bb87d605b6e14b5350e6e1455c9d497d81046608e38795dc85aba406c9de1f4f9990d5153b98bbabbdcbd6bb18854312b2da48b411e838f26ae3109f104dfd1619f991824ec819861e5199f26bb9b3b299bfa9ec2fd691271b58a8adecbf0ff627b54336f3df7003d70e37d11ddbd930d9aba7e88ed401acb44092fd53d5020400eaf05d028201802d6db91eb32e36e5d5127deb034d14072fe60c1cd13c8c3dd9adbc87140b5e7136f4f89e61bbee7826f45ac1d99194fbaa8c5a0bb94db31d93723b51419d9c6f6eeb5f3610b67f4b4e2ade05cc6b8990e8832cf4cd40f2df0388c9a52072e27efebae20b4ad5951f4d20dd18943e58b786d8797652b2bb759c319d2b0046dbf69c53c075d00c287b876042fafa23fe4dd705e4e423277c9000311e94ea3f7456e32fd12afe4a2bde358a65824f1055064823c893fc93be3b8c658bb441d7f0b00ac246bf043a9c0053d319f003ef5a5533f74d630d8ce93bab416a82951e05b82c6036593eca89f0ebacd7d51ed9610af43537fcd266e5e47c0d25fedad6d047a1a1ee3eb444367e3eff7c7520ca4f779f2027fe45036204168454df4918b547a4d19e938f3c6db6ca2702ad9bbda1261c64d00b578285bdcfc9851f96a4f2cd14d66b9c1f65742a1344948c9f1da8d338ed4e3deb1ebadf11f8c281944e8849823496f86111f378bdd084c99f65fb9b4ee6271b1d1be424c294d185d9fd9cdf0281c100fa9977bca043a140e06158bc710f33918c7e503f1dd495b4f91920f6214d859f900c6a211849f566bc37417ec8a68f6874ce6160b34707a7341b1c00934e6ba3e60f63c3f4faf486be9780335b4eaee54ddd2f172a91b7a57a07905be685e49921e9d1af40e91b47be5bc1c0dfe3d10ad6b3b6aae0a43f82920c553b2e4932ff630297f2161918c684528373ed0af0d24b069ac4f511d8fd0301eff0365300a1f79e44d4ed21414940103aef3411568aae6f00b7c105453495c7cc6d3a76bcfb0281c100e16ae200e34b1638e158cf98278f3f62f75c97303be14265fbf11816941b366c4f95fdc3a7efe999d74b3919e6b10980ccd6e63e5ca118476b9144e59274c4a4c3f309e0497f9c8e21ce32eda4974cde4f28c66d46b6e63c2ce2bc8c629a974d4256d268dad6c7d5f80c3ad5ed4856d651ed619041acc611d5e2c30a7d11b60e5c665569fd9315120abc590c861e4ecb16df430d9056d517ff060947fe556acc7ba94273398339616f45ada042633bbb1df5e7cc313df660c02f11dc6dd0b96f0281c006d864e60c4be32d580088c14ee2d782fdccb15a5a4d35418f742cea6f410392183b1688d924e3efd42ee87ec26e0a93ab01973ca14955e55556f9ce7efbed1a1474b01e9dd592fb27b01bde028ae3b939c219aebb19d4474afe735e18e9398df62b0e166d7677f0fea0de612e3ce5bca3d5f0d8603356240c8b21f65a4c8dfeadaaddd410f488d430b91f8495b920439ccceab14d12b5eb6ac723a97a382e3efb2a88588bf8f1217d3c2b7d7da4ee64a0c9429a4e1927a8b8aa589353fce4390281c100c3d5f93ebec8efd817d633f1095c7d4d839061701bae2f39cb4d1607e0502ecd8bd58b562dac772906908e0bc63093aa3a1be5da2f6d16b3c593d803ddff8c126e4a8caf51820eb7cbead85a60dc8e46e80bf50bab1c9c5ed90b7d72ceadc30a6bb4f055975e5ef78d1625c662a927f0d9d86a99002fedb60a7c5d752f90adc118068ab1eaf809d7619d7ff3c605e31b1001d96dbf04c622a0192a59ba29369148789423ba5cff12c503c6693c4e515d7775250d1fa52d0d06c093c2226eeeb30281c01af7aa2c6e5de3ebed447b0327ed8c09460a78d700097a147d4b59df7d4ca448ff63f0a4e82f842528b750253309d41c74b0a8e3ab293a69a2ecfb589aa3351fcb9cee01fdf073590d5cc91bd86b44c0dd73ff8ac183a77029ab15adace35707b2e0bb94e02c8badae6860cf6e9d16b913b929a4b32b17872ac278653f7d65cb795c514f15a1944fc78095e9c6567f6cd5882e23e4f4e571a168721c8e70924c1a3d9616fc1f0dd3b05278243bf9aa920fa05b3a53660506f71d3fa0bdc8ff9a -Msg = 32fd45e73f6f6949f20cab78c0cc31d814baea6389546a365d35f54f23f1d995b74101187760c89bb0b40b5057b182e2fafb50b8f5cad879e993d3cb6ae59f61f891da34310d3010441a7153a9a5e7f210ebe6bc97e1a4e33fd34bb8a14b4db6dd34f8c2d43f4ab19786060b1e70070e3ed4d5f6d561767c483d879d2fec8b9c -Sig = c389613717ec7476ecda2144d0e8c8f9d66fb469c167c4209ec0bdeebfb471665d33dad47b8f3c319a76fe8a8a9f662b6c690b74903d17f61e2314e5ea8d26670ee4db4dad295b277ca08ade880de2e42d12b92952764c1dc808c266dbbedb670158eef36e896f55a203fb99556ded0597410ba37486b1d841f3d6d5c0b39f2f49f0c5794824fba94a8ec7c2b2c91eadd5c8cbe44895fe3be3bc1727d6fc0e5364f53578639d3b3af696b750a07853694ffe145a28c03620c78dd7377d094d92c3e09546883d4703e62a98ddf81fd01fcdf3c4b215224fe2b1b4992abf31f20d12afa868202390de334a846b2d58b253ea8ab3c5265d84773a659e8bac7af44123d9ea15062e65d4d419cf2d97077d0624f8e5c36f2c7b35ccf95435d5c36886ff9105a6c1ea225e15ea8cbc7b6bf6856151cd76fbb75b5b98f0e3db516a8e218189fcb1cd5de3cafeaa33ef135c5d8b8aa5f881afaacaf4c08bd7281255bc2a33b76d4a36e0b170c45588239e5b38c679b08cf802af73b6d79b3935949461e7 -Result = Pass - -Digest = SHA384 -Key = 308206e40201000282018100dca98304b729e819b340e26cecb730aecbd8930e334c731493b180de970e6d3bc579f86c8d5d032f8cd33c4397ee7ffd019d51b0a7dbe4f52505a1a34ae35d23cfaaf594419d509f469b1369589f9c8616a7d698513bc1d423d70070d3d72b996c23abe68b22ccc39aabd16507124042c88d4da6a7451288ec87c9244be226aac02d1817682f80cc34c6eaf37ec84d247aaedebb56c3bbcaffb5cf42f61fe1b7f3fc89748e213973bf5f679d8b8b42a47ac4afd9e51e1d1214dfe1a7e1169080bd9ad91758f6c0f9b22ae40af6b41403d8f2d96db5a088daa5ef8683f86f501f7ad3f358b6337da55c6cfc003197420c1c75abdb7be1403ea4f3e64259f5c6da3325bb87d605b6e14b5350e6e1455c9d497d81046608e38795dc85aba406c9de1f4f9990d5153b98bbabbdcbd6bb18854312b2da48b411e838f26ae3109f104dfd1619f991824ec819861e5199f26bb9b3b299bfa9ec2fd691271b58a8adecbf0ff627b54336f3df7003d70e37d11ddbd930d9aba7e88ed401acb44092fd53d5020400eaf05d028201802d6db91eb32e36e5d5127deb034d14072fe60c1cd13c8c3dd9adbc87140b5e7136f4f89e61bbee7826f45ac1d99194fbaa8c5a0bb94db31d93723b51419d9c6f6eeb5f3610b67f4b4e2ade05cc6b8990e8832cf4cd40f2df0388c9a52072e27efebae20b4ad5951f4d20dd18943e58b786d8797652b2bb759c319d2b0046dbf69c53c075d00c287b876042fafa23fe4dd705e4e423277c9000311e94ea3f7456e32fd12afe4a2bde358a65824f1055064823c893fc93be3b8c658bb441d7f0b00ac246bf043a9c0053d319f003ef5a5533f74d630d8ce93bab416a82951e05b82c6036593eca89f0ebacd7d51ed9610af43537fcd266e5e47c0d25fedad6d047a1a1ee3eb444367e3eff7c7520ca4f779f2027fe45036204168454df4918b547a4d19e938f3c6db6ca2702ad9bbda1261c64d00b578285bdcfc9851f96a4f2cd14d66b9c1f65742a1344948c9f1da8d338ed4e3deb1ebadf11f8c281944e8849823496f86111f378bdd084c99f65fb9b4ee6271b1d1be424c294d185d9fd9cdf0281c100fa9977bca043a140e06158bc710f33918c7e503f1dd495b4f91920f6214d859f900c6a211849f566bc37417ec8a68f6874ce6160b34707a7341b1c00934e6ba3e60f63c3f4faf486be9780335b4eaee54ddd2f172a91b7a57a07905be685e49921e9d1af40e91b47be5bc1c0dfe3d10ad6b3b6aae0a43f82920c553b2e4932ff630297f2161918c684528373ed0af0d24b069ac4f511d8fd0301eff0365300a1f79e44d4ed21414940103aef3411568aae6f00b7c105453495c7cc6d3a76bcfb0281c100e16ae200e34b1638e158cf98278f3f62f75c97303be14265fbf11816941b366c4f95fdc3a7efe999d74b3919e6b10980ccd6e63e5ca118476b9144e59274c4a4c3f309e0497f9c8e21ce32eda4974cde4f28c66d46b6e63c2ce2bc8c629a974d4256d268dad6c7d5f80c3ad5ed4856d651ed619041acc611d5e2c30a7d11b60e5c665569fd9315120abc590c861e4ecb16df430d9056d517ff060947fe556acc7ba94273398339616f45ada042633bbb1df5e7cc313df660c02f11dc6dd0b96f0281c006d864e60c4be32d580088c14ee2d782fdccb15a5a4d35418f742cea6f410392183b1688d924e3efd42ee87ec26e0a93ab01973ca14955e55556f9ce7efbed1a1474b01e9dd592fb27b01bde028ae3b939c219aebb19d4474afe735e18e9398df62b0e166d7677f0fea0de612e3ce5bca3d5f0d8603356240c8b21f65a4c8dfeadaaddd410f488d430b91f8495b920439ccceab14d12b5eb6ac723a97a382e3efb2a88588bf8f1217d3c2b7d7da4ee64a0c9429a4e1927a8b8aa589353fce4390281c100c3d5f93ebec8efd817d633f1095c7d4d839061701bae2f39cb4d1607e0502ecd8bd58b562dac772906908e0bc63093aa3a1be5da2f6d16b3c593d803ddff8c126e4a8caf51820eb7cbead85a60dc8e46e80bf50bab1c9c5ed90b7d72ceadc30a6bb4f055975e5ef78d1625c662a927f0d9d86a99002fedb60a7c5d752f90adc118068ab1eaf809d7619d7ff3c605e31b1001d96dbf04c622a0192a59ba29369148789423ba5cff12c503c6693c4e515d7775250d1fa52d0d06c093c2226eeeb30281c01af7aa2c6e5de3ebed447b0327ed8c09460a78d700097a147d4b59df7d4ca448ff63f0a4e82f842528b750253309d41c74b0a8e3ab293a69a2ecfb589aa3351fcb9cee01fdf073590d5cc91bd86b44c0dd73ff8ac183a77029ab15adace35707b2e0bb94e02c8badae6860cf6e9d16b913b929a4b32b17872ac278653f7d65cb795c514f15a1944fc78095e9c6567f6cd5882e23e4f4e571a168721c8e70924c1a3d9616fc1f0dd3b05278243bf9aa920fa05b3a53660506f71d3fa0bdc8ff9a -Msg = ab66cc487ec951f2119d6e0fa17a6d8feb7d07149bec7db20718e4f31d88c01f9a53d5ba7ece3a4dbc67af6a35d130eae762cb7962b9ae557ca38452464002223f61bcd3c7353e99d62558ceedfcb9374d4bbf89680c8e2b9585603e076f1cdb0058299b4246845dc79d1043b1422efe84018e4c932c45beb8851fbf485e36d2 -Sig = b51331552b08be35a1698aa6203d84dbfff9001ed5dd776f2be4ddfc07dd4620e9654e82a33465bd20f11863c0ed02a0aea27a44d414c328a938bf877e15838ab99d670d01414262e8865dc1d9fc30fd0812699fa690c34f302f637ec802cd40ac8591e976c0b8bccb1b0137af64a2870210e8fa3dc431fe0956b8addff1e4b18cf07e078aa93af81bb3023c9e594e66595fd92b10226ea126005f4724427352c38e9e85fc2e0723f80af1f61599550b5ef54c5b38ca405738017b89cb9468d9741cd6bdf7112162251ba1d083cc370a4a8261c39b6b94bf21a53b7564531ae9ebc4ccea7ebb8bd314b2e13b58ed1018ae5b415e0f9e3e19a5ead3a44603f90674a190febde25f8ad8778aeead4d0f64fbae37166a54e3a763e35559bf8c3f173f19ff7bab98f3ef803dd56c07628399aff87485ee73dbc3db34ecc7bff3a53226cf87bc81d256e80c09520c8f38e9bcda095e3635128e1bedd9970600546a751eb11dab42e289d6fdfea04bd58d4571a79d24bce4508c54e1ec4cf75b985fd3 -Result = Pass - -Digest = SHA384 -Key = 308206e40201000282018100dca98304b729e819b340e26cecb730aecbd8930e334c731493b180de970e6d3bc579f86c8d5d032f8cd33c4397ee7ffd019d51b0a7dbe4f52505a1a34ae35d23cfaaf594419d509f469b1369589f9c8616a7d698513bc1d423d70070d3d72b996c23abe68b22ccc39aabd16507124042c88d4da6a7451288ec87c9244be226aac02d1817682f80cc34c6eaf37ec84d247aaedebb56c3bbcaffb5cf42f61fe1b7f3fc89748e213973bf5f679d8b8b42a47ac4afd9e51e1d1214dfe1a7e1169080bd9ad91758f6c0f9b22ae40af6b41403d8f2d96db5a088daa5ef8683f86f501f7ad3f358b6337da55c6cfc003197420c1c75abdb7be1403ea4f3e64259f5c6da3325bb87d605b6e14b5350e6e1455c9d497d81046608e38795dc85aba406c9de1f4f9990d5153b98bbabbdcbd6bb18854312b2da48b411e838f26ae3109f104dfd1619f991824ec819861e5199f26bb9b3b299bfa9ec2fd691271b58a8adecbf0ff627b54336f3df7003d70e37d11ddbd930d9aba7e88ed401acb44092fd53d5020400eaf05d028201802d6db91eb32e36e5d5127deb034d14072fe60c1cd13c8c3dd9adbc87140b5e7136f4f89e61bbee7826f45ac1d99194fbaa8c5a0bb94db31d93723b51419d9c6f6eeb5f3610b67f4b4e2ade05cc6b8990e8832cf4cd40f2df0388c9a52072e27efebae20b4ad5951f4d20dd18943e58b786d8797652b2bb759c319d2b0046dbf69c53c075d00c287b876042fafa23fe4dd705e4e423277c9000311e94ea3f7456e32fd12afe4a2bde358a65824f1055064823c893fc93be3b8c658bb441d7f0b00ac246bf043a9c0053d319f003ef5a5533f74d630d8ce93bab416a82951e05b82c6036593eca89f0ebacd7d51ed9610af43537fcd266e5e47c0d25fedad6d047a1a1ee3eb444367e3eff7c7520ca4f779f2027fe45036204168454df4918b547a4d19e938f3c6db6ca2702ad9bbda1261c64d00b578285bdcfc9851f96a4f2cd14d66b9c1f65742a1344948c9f1da8d338ed4e3deb1ebadf11f8c281944e8849823496f86111f378bdd084c99f65fb9b4ee6271b1d1be424c294d185d9fd9cdf0281c100fa9977bca043a140e06158bc710f33918c7e503f1dd495b4f91920f6214d859f900c6a211849f566bc37417ec8a68f6874ce6160b34707a7341b1c00934e6ba3e60f63c3f4faf486be9780335b4eaee54ddd2f172a91b7a57a07905be685e49921e9d1af40e91b47be5bc1c0dfe3d10ad6b3b6aae0a43f82920c553b2e4932ff630297f2161918c684528373ed0af0d24b069ac4f511d8fd0301eff0365300a1f79e44d4ed21414940103aef3411568aae6f00b7c105453495c7cc6d3a76bcfb0281c100e16ae200e34b1638e158cf98278f3f62f75c97303be14265fbf11816941b366c4f95fdc3a7efe999d74b3919e6b10980ccd6e63e5ca118476b9144e59274c4a4c3f309e0497f9c8e21ce32eda4974cde4f28c66d46b6e63c2ce2bc8c629a974d4256d268dad6c7d5f80c3ad5ed4856d651ed619041acc611d5e2c30a7d11b60e5c665569fd9315120abc590c861e4ecb16df430d9056d517ff060947fe556acc7ba94273398339616f45ada042633bbb1df5e7cc313df660c02f11dc6dd0b96f0281c006d864e60c4be32d580088c14ee2d782fdccb15a5a4d35418f742cea6f410392183b1688d924e3efd42ee87ec26e0a93ab01973ca14955e55556f9ce7efbed1a1474b01e9dd592fb27b01bde028ae3b939c219aebb19d4474afe735e18e9398df62b0e166d7677f0fea0de612e3ce5bca3d5f0d8603356240c8b21f65a4c8dfeadaaddd410f488d430b91f8495b920439ccceab14d12b5eb6ac723a97a382e3efb2a88588bf8f1217d3c2b7d7da4ee64a0c9429a4e1927a8b8aa589353fce4390281c100c3d5f93ebec8efd817d633f1095c7d4d839061701bae2f39cb4d1607e0502ecd8bd58b562dac772906908e0bc63093aa3a1be5da2f6d16b3c593d803ddff8c126e4a8caf51820eb7cbead85a60dc8e46e80bf50bab1c9c5ed90b7d72ceadc30a6bb4f055975e5ef78d1625c662a927f0d9d86a99002fedb60a7c5d752f90adc118068ab1eaf809d7619d7ff3c605e31b1001d96dbf04c622a0192a59ba29369148789423ba5cff12c503c6693c4e515d7775250d1fa52d0d06c093c2226eeeb30281c01af7aa2c6e5de3ebed447b0327ed8c09460a78d700097a147d4b59df7d4ca448ff63f0a4e82f842528b750253309d41c74b0a8e3ab293a69a2ecfb589aa3351fcb9cee01fdf073590d5cc91bd86b44c0dd73ff8ac183a77029ab15adace35707b2e0bb94e02c8badae6860cf6e9d16b913b929a4b32b17872ac278653f7d65cb795c514f15a1944fc78095e9c6567f6cd5882e23e4f4e571a168721c8e70924c1a3d9616fc1f0dd3b05278243bf9aa920fa05b3a53660506f71d3fa0bdc8ff9a -Msg = fef7fe89b9a59902a70a1d9caad09ced8bee4145edcbe3ef7fa6dab37635129f3b8c5e0860410ecbd9cec3d8693682f25aec08b071f05dc8213bac8cff5d52b576653560bc01575604e6ab90f67227fb5c901a781eddc027700913e54a7fe51318482c9ab42c9d2b911b7ccc39ccb290f9a420a5dad93394d4d7b8c53fe3f242 -Sig = 45068ca6d82f2c123925cde11971215d8fa4a4df6848bb7654868700978764854638921bea5869280dc6ad9581ab43ff7012969948a5677fa0a66136a316a4bfecb89adf4131b5bedf3d4693b780d133af9bf9c133305be78374afda3ba3854203324481a9d10b9ca9b92dc7d74df531872ddfc76caa82de020e2c415643cbcc4280e6d2f4371fda7d9249314a8f437648991a9b03d71b5839ad38a1555ad34526994ba56870b6ea18011295f2ca2b0713b2e92ad77680c0dc5bed8d3b9b31ac14df769949c4a43ea67f6deeb3dc9ed589ea4e8a2cf6695df46f946f1467b28e875477ae4e645080fafda6dd551d2c02fd6b2b194fc0bdb050e06d4c784105f5a33b53e73098055963071efc1bf397fd325f3a6f4e10d76f0411a001e62ec73729018316f56310f893a59363d1f6fe5c17444b6c728a4933b75212fdfa258e4018b7763951ab4e5096411df9e5bc16df3896e46c973d32ac9276a4e2b5b80e3d8d798dc0470b45096b4d738669ce052ed818e560af1e92c915187d66cc308b70 -Result = Pass - -Digest = SHA384 -Key = 308206e40201000282018100dca98304b729e819b340e26cecb730aecbd8930e334c731493b180de970e6d3bc579f86c8d5d032f8cd33c4397ee7ffd019d51b0a7dbe4f52505a1a34ae35d23cfaaf594419d509f469b1369589f9c8616a7d698513bc1d423d70070d3d72b996c23abe68b22ccc39aabd16507124042c88d4da6a7451288ec87c9244be226aac02d1817682f80cc34c6eaf37ec84d247aaedebb56c3bbcaffb5cf42f61fe1b7f3fc89748e213973bf5f679d8b8b42a47ac4afd9e51e1d1214dfe1a7e1169080bd9ad91758f6c0f9b22ae40af6b41403d8f2d96db5a088daa5ef8683f86f501f7ad3f358b6337da55c6cfc003197420c1c75abdb7be1403ea4f3e64259f5c6da3325bb87d605b6e14b5350e6e1455c9d497d81046608e38795dc85aba406c9de1f4f9990d5153b98bbabbdcbd6bb18854312b2da48b411e838f26ae3109f104dfd1619f991824ec819861e5199f26bb9b3b299bfa9ec2fd691271b58a8adecbf0ff627b54336f3df7003d70e37d11ddbd930d9aba7e88ed401acb44092fd53d5020400eaf05d028201802d6db91eb32e36e5d5127deb034d14072fe60c1cd13c8c3dd9adbc87140b5e7136f4f89e61bbee7826f45ac1d99194fbaa8c5a0bb94db31d93723b51419d9c6f6eeb5f3610b67f4b4e2ade05cc6b8990e8832cf4cd40f2df0388c9a52072e27efebae20b4ad5951f4d20dd18943e58b786d8797652b2bb759c319d2b0046dbf69c53c075d00c287b876042fafa23fe4dd705e4e423277c9000311e94ea3f7456e32fd12afe4a2bde358a65824f1055064823c893fc93be3b8c658bb441d7f0b00ac246bf043a9c0053d319f003ef5a5533f74d630d8ce93bab416a82951e05b82c6036593eca89f0ebacd7d51ed9610af43537fcd266e5e47c0d25fedad6d047a1a1ee3eb444367e3eff7c7520ca4f779f2027fe45036204168454df4918b547a4d19e938f3c6db6ca2702ad9bbda1261c64d00b578285bdcfc9851f96a4f2cd14d66b9c1f65742a1344948c9f1da8d338ed4e3deb1ebadf11f8c281944e8849823496f86111f378bdd084c99f65fb9b4ee6271b1d1be424c294d185d9fd9cdf0281c100fa9977bca043a140e06158bc710f33918c7e503f1dd495b4f91920f6214d859f900c6a211849f566bc37417ec8a68f6874ce6160b34707a7341b1c00934e6ba3e60f63c3f4faf486be9780335b4eaee54ddd2f172a91b7a57a07905be685e49921e9d1af40e91b47be5bc1c0dfe3d10ad6b3b6aae0a43f82920c553b2e4932ff630297f2161918c684528373ed0af0d24b069ac4f511d8fd0301eff0365300a1f79e44d4ed21414940103aef3411568aae6f00b7c105453495c7cc6d3a76bcfb0281c100e16ae200e34b1638e158cf98278f3f62f75c97303be14265fbf11816941b366c4f95fdc3a7efe999d74b3919e6b10980ccd6e63e5ca118476b9144e59274c4a4c3f309e0497f9c8e21ce32eda4974cde4f28c66d46b6e63c2ce2bc8c629a974d4256d268dad6c7d5f80c3ad5ed4856d651ed619041acc611d5e2c30a7d11b60e5c665569fd9315120abc590c861e4ecb16df430d9056d517ff060947fe556acc7ba94273398339616f45ada042633bbb1df5e7cc313df660c02f11dc6dd0b96f0281c006d864e60c4be32d580088c14ee2d782fdccb15a5a4d35418f742cea6f410392183b1688d924e3efd42ee87ec26e0a93ab01973ca14955e55556f9ce7efbed1a1474b01e9dd592fb27b01bde028ae3b939c219aebb19d4474afe735e18e9398df62b0e166d7677f0fea0de612e3ce5bca3d5f0d8603356240c8b21f65a4c8dfeadaaddd410f488d430b91f8495b920439ccceab14d12b5eb6ac723a97a382e3efb2a88588bf8f1217d3c2b7d7da4ee64a0c9429a4e1927a8b8aa589353fce4390281c100c3d5f93ebec8efd817d633f1095c7d4d839061701bae2f39cb4d1607e0502ecd8bd58b562dac772906908e0bc63093aa3a1be5da2f6d16b3c593d803ddff8c126e4a8caf51820eb7cbead85a60dc8e46e80bf50bab1c9c5ed90b7d72ceadc30a6bb4f055975e5ef78d1625c662a927f0d9d86a99002fedb60a7c5d752f90adc118068ab1eaf809d7619d7ff3c605e31b1001d96dbf04c622a0192a59ba29369148789423ba5cff12c503c6693c4e515d7775250d1fa52d0d06c093c2226eeeb30281c01af7aa2c6e5de3ebed447b0327ed8c09460a78d700097a147d4b59df7d4ca448ff63f0a4e82f842528b750253309d41c74b0a8e3ab293a69a2ecfb589aa3351fcb9cee01fdf073590d5cc91bd86b44c0dd73ff8ac183a77029ab15adace35707b2e0bb94e02c8badae6860cf6e9d16b913b929a4b32b17872ac278653f7d65cb795c514f15a1944fc78095e9c6567f6cd5882e23e4f4e571a168721c8e70924c1a3d9616fc1f0dd3b05278243bf9aa920fa05b3a53660506f71d3fa0bdc8ff9a -Msg = 82b3840eeb95c9c57724c70f112b6c2dc617c31785acd0c823f8bcdda285325eb3d308dc790522bc90db93d24ee0063249e55d4219ad97145feaf7f30668623cc8890a70f4f149866f82cf86f98b0053b23c98c8dd5e9107e341460e9bf5d88cc8bcd1f2e4c007cc1c02c4529b93233a0b06bdd15925854ab9e3f156eb925bf5 -Sig = 0593b9fd4421452376d27bc7a280101cfd6e88a6727d7d77cf65ceb723ecd257f32fe10277e85798e0da75917736da1a3bfc22adc7658fbb84da6ebea0b07d1cc405732fb040b585c1b63c8034069bffb8220656f1ac54ce693720d6fb1b5aec67b03c887c8077da148d10f48af7c028f992b18f13c0e57530c086d775483da5f66f3a6a19187868340ac63c6212bcbd6cbb7beda8620afd9b66de47473ef24d1b6a36f4ece9add49514fdf1d84c7a785b7f0e00f382235899790f472d13f48558a4314742f376808dec96edd2e229e943f7b983bea5ec6edfa5e9bb37f588e55ef62ebc9214beaf9da502434e1088df272c6c77c1e1d897c47beab77e3bbe317f8d43d21fd7e94337c7e263e2867bf580a2a8ecb9e36ab7d3e1d5cf9a23230953d59df0d7e23558fb612b7918abba31b164ce178818a1a9e6b6687f4de685d70e16bef6e192faedfe0b2b95477d37b0a3a2d002f33ef4321cb905040ce06fda1c98a008767fbc781a1eaf3375dab8664b590336b99e157b8687a6602fef6a3b -Result = Pass - -Digest = SHA384 -Key = 308206e40201000282018100dca98304b729e819b340e26cecb730aecbd8930e334c731493b180de970e6d3bc579f86c8d5d032f8cd33c4397ee7ffd019d51b0a7dbe4f52505a1a34ae35d23cfaaf594419d509f469b1369589f9c8616a7d698513bc1d423d70070d3d72b996c23abe68b22ccc39aabd16507124042c88d4da6a7451288ec87c9244be226aac02d1817682f80cc34c6eaf37ec84d247aaedebb56c3bbcaffb5cf42f61fe1b7f3fc89748e213973bf5f679d8b8b42a47ac4afd9e51e1d1214dfe1a7e1169080bd9ad91758f6c0f9b22ae40af6b41403d8f2d96db5a088daa5ef8683f86f501f7ad3f358b6337da55c6cfc003197420c1c75abdb7be1403ea4f3e64259f5c6da3325bb87d605b6e14b5350e6e1455c9d497d81046608e38795dc85aba406c9de1f4f9990d5153b98bbabbdcbd6bb18854312b2da48b411e838f26ae3109f104dfd1619f991824ec819861e5199f26bb9b3b299bfa9ec2fd691271b58a8adecbf0ff627b54336f3df7003d70e37d11ddbd930d9aba7e88ed401acb44092fd53d5020400eaf05d028201802d6db91eb32e36e5d5127deb034d14072fe60c1cd13c8c3dd9adbc87140b5e7136f4f89e61bbee7826f45ac1d99194fbaa8c5a0bb94db31d93723b51419d9c6f6eeb5f3610b67f4b4e2ade05cc6b8990e8832cf4cd40f2df0388c9a52072e27efebae20b4ad5951f4d20dd18943e58b786d8797652b2bb759c319d2b0046dbf69c53c075d00c287b876042fafa23fe4dd705e4e423277c9000311e94ea3f7456e32fd12afe4a2bde358a65824f1055064823c893fc93be3b8c658bb441d7f0b00ac246bf043a9c0053d319f003ef5a5533f74d630d8ce93bab416a82951e05b82c6036593eca89f0ebacd7d51ed9610af43537fcd266e5e47c0d25fedad6d047a1a1ee3eb444367e3eff7c7520ca4f779f2027fe45036204168454df4918b547a4d19e938f3c6db6ca2702ad9bbda1261c64d00b578285bdcfc9851f96a4f2cd14d66b9c1f65742a1344948c9f1da8d338ed4e3deb1ebadf11f8c281944e8849823496f86111f378bdd084c99f65fb9b4ee6271b1d1be424c294d185d9fd9cdf0281c100fa9977bca043a140e06158bc710f33918c7e503f1dd495b4f91920f6214d859f900c6a211849f566bc37417ec8a68f6874ce6160b34707a7341b1c00934e6ba3e60f63c3f4faf486be9780335b4eaee54ddd2f172a91b7a57a07905be685e49921e9d1af40e91b47be5bc1c0dfe3d10ad6b3b6aae0a43f82920c553b2e4932ff630297f2161918c684528373ed0af0d24b069ac4f511d8fd0301eff0365300a1f79e44d4ed21414940103aef3411568aae6f00b7c105453495c7cc6d3a76bcfb0281c100e16ae200e34b1638e158cf98278f3f62f75c97303be14265fbf11816941b366c4f95fdc3a7efe999d74b3919e6b10980ccd6e63e5ca118476b9144e59274c4a4c3f309e0497f9c8e21ce32eda4974cde4f28c66d46b6e63c2ce2bc8c629a974d4256d268dad6c7d5f80c3ad5ed4856d651ed619041acc611d5e2c30a7d11b60e5c665569fd9315120abc590c861e4ecb16df430d9056d517ff060947fe556acc7ba94273398339616f45ada042633bbb1df5e7cc313df660c02f11dc6dd0b96f0281c006d864e60c4be32d580088c14ee2d782fdccb15a5a4d35418f742cea6f410392183b1688d924e3efd42ee87ec26e0a93ab01973ca14955e55556f9ce7efbed1a1474b01e9dd592fb27b01bde028ae3b939c219aebb19d4474afe735e18e9398df62b0e166d7677f0fea0de612e3ce5bca3d5f0d8603356240c8b21f65a4c8dfeadaaddd410f488d430b91f8495b920439ccceab14d12b5eb6ac723a97a382e3efb2a88588bf8f1217d3c2b7d7da4ee64a0c9429a4e1927a8b8aa589353fce4390281c100c3d5f93ebec8efd817d633f1095c7d4d839061701bae2f39cb4d1607e0502ecd8bd58b562dac772906908e0bc63093aa3a1be5da2f6d16b3c593d803ddff8c126e4a8caf51820eb7cbead85a60dc8e46e80bf50bab1c9c5ed90b7d72ceadc30a6bb4f055975e5ef78d1625c662a927f0d9d86a99002fedb60a7c5d752f90adc118068ab1eaf809d7619d7ff3c605e31b1001d96dbf04c622a0192a59ba29369148789423ba5cff12c503c6693c4e515d7775250d1fa52d0d06c093c2226eeeb30281c01af7aa2c6e5de3ebed447b0327ed8c09460a78d700097a147d4b59df7d4ca448ff63f0a4e82f842528b750253309d41c74b0a8e3ab293a69a2ecfb589aa3351fcb9cee01fdf073590d5cc91bd86b44c0dd73ff8ac183a77029ab15adace35707b2e0bb94e02c8badae6860cf6e9d16b913b929a4b32b17872ac278653f7d65cb795c514f15a1944fc78095e9c6567f6cd5882e23e4f4e571a168721c8e70924c1a3d9616fc1f0dd3b05278243bf9aa920fa05b3a53660506f71d3fa0bdc8ff9a -Msg = e153cca4431ed9713f4744ba054f5f191cb37b280108ae3a114ad349a872d1308b46211a83758a3b4be32fbeac42ccfee7e23df853ca400147077bb43a44c12f299b917f3aabdf589eeb1709bb3d60b08bc71eaa3ffeba4e2903a5dbd8339aae85fa24b9aee76130000605857a6aa197d00926270dcda58b7de758a6ca67e617 -Sig = a835cd4146bef465642d494936268a311a5490d2c9f9166c6ce98216a9a23a643597300a0050e6445abd5a9bfc7a2d9b70726c824c383bf5acaddddc34d434a31e5314d25fb58e258f518866c136e52855c16fe64ff8f1c4d66c4e9e39b8cb1196d80944d0746c0a3e1769cd4167df72ab5e4c9dbae9cb35f4828e12099f9b36a5a70c48d4aec9872d7b19e1291b33cbdf08a2263d500c0a83b5237ef6ce92de344b3b41d0d07404fcd5467b046b52b8f85fc6b5d7afc437f1ee9e78390ca9bb6cec618885ece29758f2fd6f4e5f4f896935de5f67cc04055a4c4c0fba5def8d2caa179331a85501ed25822ae79da9bc815cc39c6a979211083e8683136c942e1e17e9eb8f84aacf091aa1e51665fae446bc48c304af65391f279afb98b92e04c2b73d9d94e991198fe7781f0f9696fcba2c03485f76e6de30b9535cf3903db2f3afa851a47bcde72d4ed2e8fabf9bb7d4696cb4ab8c289b0c21e1f979ebc532e280cd9010df4ee72f84bb9e82752828f167030c0fe348ebc31ec17b8f07d94b -Result = Pass - -Digest = SHA384 -Key = 308206e40201000282018100dca98304b729e819b340e26cecb730aecbd8930e334c731493b180de970e6d3bc579f86c8d5d032f8cd33c4397ee7ffd019d51b0a7dbe4f52505a1a34ae35d23cfaaf594419d509f469b1369589f9c8616a7d698513bc1d423d70070d3d72b996c23abe68b22ccc39aabd16507124042c88d4da6a7451288ec87c9244be226aac02d1817682f80cc34c6eaf37ec84d247aaedebb56c3bbcaffb5cf42f61fe1b7f3fc89748e213973bf5f679d8b8b42a47ac4afd9e51e1d1214dfe1a7e1169080bd9ad91758f6c0f9b22ae40af6b41403d8f2d96db5a088daa5ef8683f86f501f7ad3f358b6337da55c6cfc003197420c1c75abdb7be1403ea4f3e64259f5c6da3325bb87d605b6e14b5350e6e1455c9d497d81046608e38795dc85aba406c9de1f4f9990d5153b98bbabbdcbd6bb18854312b2da48b411e838f26ae3109f104dfd1619f991824ec819861e5199f26bb9b3b299bfa9ec2fd691271b58a8adecbf0ff627b54336f3df7003d70e37d11ddbd930d9aba7e88ed401acb44092fd53d5020400eaf05d028201802d6db91eb32e36e5d5127deb034d14072fe60c1cd13c8c3dd9adbc87140b5e7136f4f89e61bbee7826f45ac1d99194fbaa8c5a0bb94db31d93723b51419d9c6f6eeb5f3610b67f4b4e2ade05cc6b8990e8832cf4cd40f2df0388c9a52072e27efebae20b4ad5951f4d20dd18943e58b786d8797652b2bb759c319d2b0046dbf69c53c075d00c287b876042fafa23fe4dd705e4e423277c9000311e94ea3f7456e32fd12afe4a2bde358a65824f1055064823c893fc93be3b8c658bb441d7f0b00ac246bf043a9c0053d319f003ef5a5533f74d630d8ce93bab416a82951e05b82c6036593eca89f0ebacd7d51ed9610af43537fcd266e5e47c0d25fedad6d047a1a1ee3eb444367e3eff7c7520ca4f779f2027fe45036204168454df4918b547a4d19e938f3c6db6ca2702ad9bbda1261c64d00b578285bdcfc9851f96a4f2cd14d66b9c1f65742a1344948c9f1da8d338ed4e3deb1ebadf11f8c281944e8849823496f86111f378bdd084c99f65fb9b4ee6271b1d1be424c294d185d9fd9cdf0281c100fa9977bca043a140e06158bc710f33918c7e503f1dd495b4f91920f6214d859f900c6a211849f566bc37417ec8a68f6874ce6160b34707a7341b1c00934e6ba3e60f63c3f4faf486be9780335b4eaee54ddd2f172a91b7a57a07905be685e49921e9d1af40e91b47be5bc1c0dfe3d10ad6b3b6aae0a43f82920c553b2e4932ff630297f2161918c684528373ed0af0d24b069ac4f511d8fd0301eff0365300a1f79e44d4ed21414940103aef3411568aae6f00b7c105453495c7cc6d3a76bcfb0281c100e16ae200e34b1638e158cf98278f3f62f75c97303be14265fbf11816941b366c4f95fdc3a7efe999d74b3919e6b10980ccd6e63e5ca118476b9144e59274c4a4c3f309e0497f9c8e21ce32eda4974cde4f28c66d46b6e63c2ce2bc8c629a974d4256d268dad6c7d5f80c3ad5ed4856d651ed619041acc611d5e2c30a7d11b60e5c665569fd9315120abc590c861e4ecb16df430d9056d517ff060947fe556acc7ba94273398339616f45ada042633bbb1df5e7cc313df660c02f11dc6dd0b96f0281c006d864e60c4be32d580088c14ee2d782fdccb15a5a4d35418f742cea6f410392183b1688d924e3efd42ee87ec26e0a93ab01973ca14955e55556f9ce7efbed1a1474b01e9dd592fb27b01bde028ae3b939c219aebb19d4474afe735e18e9398df62b0e166d7677f0fea0de612e3ce5bca3d5f0d8603356240c8b21f65a4c8dfeadaaddd410f488d430b91f8495b920439ccceab14d12b5eb6ac723a97a382e3efb2a88588bf8f1217d3c2b7d7da4ee64a0c9429a4e1927a8b8aa589353fce4390281c100c3d5f93ebec8efd817d633f1095c7d4d839061701bae2f39cb4d1607e0502ecd8bd58b562dac772906908e0bc63093aa3a1be5da2f6d16b3c593d803ddff8c126e4a8caf51820eb7cbead85a60dc8e46e80bf50bab1c9c5ed90b7d72ceadc30a6bb4f055975e5ef78d1625c662a927f0d9d86a99002fedb60a7c5d752f90adc118068ab1eaf809d7619d7ff3c605e31b1001d96dbf04c622a0192a59ba29369148789423ba5cff12c503c6693c4e515d7775250d1fa52d0d06c093c2226eeeb30281c01af7aa2c6e5de3ebed447b0327ed8c09460a78d700097a147d4b59df7d4ca448ff63f0a4e82f842528b750253309d41c74b0a8e3ab293a69a2ecfb589aa3351fcb9cee01fdf073590d5cc91bd86b44c0dd73ff8ac183a77029ab15adace35707b2e0bb94e02c8badae6860cf6e9d16b913b929a4b32b17872ac278653f7d65cb795c514f15a1944fc78095e9c6567f6cd5882e23e4f4e571a168721c8e70924c1a3d9616fc1f0dd3b05278243bf9aa920fa05b3a53660506f71d3fa0bdc8ff9a -Msg = 9c63899dfc7bdc0db384727244caf71ecfb9b8792b9f57e936b3c2f5695565a9b0979f3c78fd73f00981813a16da342392fe3ceec6e63ffba191cbeb4f4b90050d2fccd83beb0622b2c3fff159d9e608f3abcb843bdd56c03339b975b9f4e3265b32f6bb6ccdfc6c5752d6e0344d749699c74c85b30c04ff95b272dbcfd6c7d3 -Sig = 4d38a297302ad0770d9729ce5b7212eef287ce0250f403e32b4acc3617dc0d2edcccc2d580ddbdbca5722b70704058a3b807f592e400bd563fcaa8b066a614b4906f1433968ed2f520a2f6b034d4b2d6890a241afd1adb8639a6cad9dbfd2e278dfebf79740d75f295759d29130b19ab19983dd68f779de41ffefd4e82b5e62f72f90efb73437f08a2503dd9819dae20ba9706c199de9cf884433eeb756286a85eae14bf9f6dbeb705461d91822282f18efbb10589a578f2c9c345b079a7e9dd07fd4b34051b27119729906c77dfb7d2f8fa6bdd5faa1e132bfba9d391e66395e67f01353fa275eace8b53aa91cb6fb693e19191d42a4c1a85a0c504b1c85f49a4d60936dee4646aca62a94aa4bc7828c1ffafde8be656317d506abec179cc90191d12356ff50644d3e01aa5bcfdd71d3c828dc3539dc0cf3fe8b9b91e0c2524f6a3710379c90affd0d0a50d74387f9ca88b46463ef1bdba58cc9a36e5c2c435a20d968350d15d941c3212cdce815592b310d259860de1dc1a3d70ac22302a51 -Result = Pass - -Digest = SHA384 -Key = 308206e40201000282018100dca98304b729e819b340e26cecb730aecbd8930e334c731493b180de970e6d3bc579f86c8d5d032f8cd33c4397ee7ffd019d51b0a7dbe4f52505a1a34ae35d23cfaaf594419d509f469b1369589f9c8616a7d698513bc1d423d70070d3d72b996c23abe68b22ccc39aabd16507124042c88d4da6a7451288ec87c9244be226aac02d1817682f80cc34c6eaf37ec84d247aaedebb56c3bbcaffb5cf42f61fe1b7f3fc89748e213973bf5f679d8b8b42a47ac4afd9e51e1d1214dfe1a7e1169080bd9ad91758f6c0f9b22ae40af6b41403d8f2d96db5a088daa5ef8683f86f501f7ad3f358b6337da55c6cfc003197420c1c75abdb7be1403ea4f3e64259f5c6da3325bb87d605b6e14b5350e6e1455c9d497d81046608e38795dc85aba406c9de1f4f9990d5153b98bbabbdcbd6bb18854312b2da48b411e838f26ae3109f104dfd1619f991824ec819861e5199f26bb9b3b299bfa9ec2fd691271b58a8adecbf0ff627b54336f3df7003d70e37d11ddbd930d9aba7e88ed401acb44092fd53d5020400eaf05d028201802d6db91eb32e36e5d5127deb034d14072fe60c1cd13c8c3dd9adbc87140b5e7136f4f89e61bbee7826f45ac1d99194fbaa8c5a0bb94db31d93723b51419d9c6f6eeb5f3610b67f4b4e2ade05cc6b8990e8832cf4cd40f2df0388c9a52072e27efebae20b4ad5951f4d20dd18943e58b786d8797652b2bb759c319d2b0046dbf69c53c075d00c287b876042fafa23fe4dd705e4e423277c9000311e94ea3f7456e32fd12afe4a2bde358a65824f1055064823c893fc93be3b8c658bb441d7f0b00ac246bf043a9c0053d319f003ef5a5533f74d630d8ce93bab416a82951e05b82c6036593eca89f0ebacd7d51ed9610af43537fcd266e5e47c0d25fedad6d047a1a1ee3eb444367e3eff7c7520ca4f779f2027fe45036204168454df4918b547a4d19e938f3c6db6ca2702ad9bbda1261c64d00b578285bdcfc9851f96a4f2cd14d66b9c1f65742a1344948c9f1da8d338ed4e3deb1ebadf11f8c281944e8849823496f86111f378bdd084c99f65fb9b4ee6271b1d1be424c294d185d9fd9cdf0281c100fa9977bca043a140e06158bc710f33918c7e503f1dd495b4f91920f6214d859f900c6a211849f566bc37417ec8a68f6874ce6160b34707a7341b1c00934e6ba3e60f63c3f4faf486be9780335b4eaee54ddd2f172a91b7a57a07905be685e49921e9d1af40e91b47be5bc1c0dfe3d10ad6b3b6aae0a43f82920c553b2e4932ff630297f2161918c684528373ed0af0d24b069ac4f511d8fd0301eff0365300a1f79e44d4ed21414940103aef3411568aae6f00b7c105453495c7cc6d3a76bcfb0281c100e16ae200e34b1638e158cf98278f3f62f75c97303be14265fbf11816941b366c4f95fdc3a7efe999d74b3919e6b10980ccd6e63e5ca118476b9144e59274c4a4c3f309e0497f9c8e21ce32eda4974cde4f28c66d46b6e63c2ce2bc8c629a974d4256d268dad6c7d5f80c3ad5ed4856d651ed619041acc611d5e2c30a7d11b60e5c665569fd9315120abc590c861e4ecb16df430d9056d517ff060947fe556acc7ba94273398339616f45ada042633bbb1df5e7cc313df660c02f11dc6dd0b96f0281c006d864e60c4be32d580088c14ee2d782fdccb15a5a4d35418f742cea6f410392183b1688d924e3efd42ee87ec26e0a93ab01973ca14955e55556f9ce7efbed1a1474b01e9dd592fb27b01bde028ae3b939c219aebb19d4474afe735e18e9398df62b0e166d7677f0fea0de612e3ce5bca3d5f0d8603356240c8b21f65a4c8dfeadaaddd410f488d430b91f8495b920439ccceab14d12b5eb6ac723a97a382e3efb2a88588bf8f1217d3c2b7d7da4ee64a0c9429a4e1927a8b8aa589353fce4390281c100c3d5f93ebec8efd817d633f1095c7d4d839061701bae2f39cb4d1607e0502ecd8bd58b562dac772906908e0bc63093aa3a1be5da2f6d16b3c593d803ddff8c126e4a8caf51820eb7cbead85a60dc8e46e80bf50bab1c9c5ed90b7d72ceadc30a6bb4f055975e5ef78d1625c662a927f0d9d86a99002fedb60a7c5d752f90adc118068ab1eaf809d7619d7ff3c605e31b1001d96dbf04c622a0192a59ba29369148789423ba5cff12c503c6693c4e515d7775250d1fa52d0d06c093c2226eeeb30281c01af7aa2c6e5de3ebed447b0327ed8c09460a78d700097a147d4b59df7d4ca448ff63f0a4e82f842528b750253309d41c74b0a8e3ab293a69a2ecfb589aa3351fcb9cee01fdf073590d5cc91bd86b44c0dd73ff8ac183a77029ab15adace35707b2e0bb94e02c8badae6860cf6e9d16b913b929a4b32b17872ac278653f7d65cb795c514f15a1944fc78095e9c6567f6cd5882e23e4f4e571a168721c8e70924c1a3d9616fc1f0dd3b05278243bf9aa920fa05b3a53660506f71d3fa0bdc8ff9a -Msg = 04846c2e676ac73160bf4e45652bdc6cc4d4c9284577b4320ab77f6ebbb59a1fe0e085588e0f90b346cde6441af3c9d0117d1f3bcd962e406bf5a465ab6cda2d51be598fcbb29ea713651aacd7e47d22d8fa3450904730f51792ea374761a4dc1fc6f1bc657b77768f31f463e4267fc8dff61150d4b343b9d53759cdd7b98094 -Sig = 103bee57e25be8c3a2f774e739b47f93435e414932c0494b6b6aa2475bf7c9305c73747e0adf82c2032007b3f75a69c93112617a62566c5a2deaa25fb95209da49fe9c161cb2ffa40fd9d77f1ff660c8b6cd3b54e3e79a759c57c5719802c9311db704ba3c67b4a3113754a41b8da59c645be3909e7db7e7cf7294dab44f74240f81a281eecd6ef31c7cf18b1a19c7d02a312b91d6edfaa954462d34740af5ab708db5a10b00c542be82fa2b2026b09ef38a4001457e27a6023770e4b4d5003267c85c9eea1d5f8d770bd40b554d5b4daf146dccabac3ea8a13a05c3bddfc971c5158fac027ca19b7232621e9d2e37b6a655af545e44a298be78cd475c22a48bff7c3494a5f8a6abdf1a46f9de082e374fd598867d61e4d51daed84152e43cc6a2affae205edc52613480d411aba84fcc9b69d1c28f16f76836901a7c5b3eb2f2c940d0a3fad38a8efab968a0c85eb22e11d3d0861136ced5f06734fdf8d4f151d23861b1cba9b9c580d3350c76d4dc808461d5f872ec548b2b427dff74b1d1a -Result = Pass - -Digest = SHA512 -Key = 308206e40201000282018100dca98304b729e819b340e26cecb730aecbd8930e334c731493b180de970e6d3bc579f86c8d5d032f8cd33c4397ee7ffd019d51b0a7dbe4f52505a1a34ae35d23cfaaf594419d509f469b1369589f9c8616a7d698513bc1d423d70070d3d72b996c23abe68b22ccc39aabd16507124042c88d4da6a7451288ec87c9244be226aac02d1817682f80cc34c6eaf37ec84d247aaedebb56c3bbcaffb5cf42f61fe1b7f3fc89748e213973bf5f679d8b8b42a47ac4afd9e51e1d1214dfe1a7e1169080bd9ad91758f6c0f9b22ae40af6b41403d8f2d96db5a088daa5ef8683f86f501f7ad3f358b6337da55c6cfc003197420c1c75abdb7be1403ea4f3e64259f5c6da3325bb87d605b6e14b5350e6e1455c9d497d81046608e38795dc85aba406c9de1f4f9990d5153b98bbabbdcbd6bb18854312b2da48b411e838f26ae3109f104dfd1619f991824ec819861e5199f26bb9b3b299bfa9ec2fd691271b58a8adecbf0ff627b54336f3df7003d70e37d11ddbd930d9aba7e88ed401acb44092fd53d5020400eaf05d028201802d6db91eb32e36e5d5127deb034d14072fe60c1cd13c8c3dd9adbc87140b5e7136f4f89e61bbee7826f45ac1d99194fbaa8c5a0bb94db31d93723b51419d9c6f6eeb5f3610b67f4b4e2ade05cc6b8990e8832cf4cd40f2df0388c9a52072e27efebae20b4ad5951f4d20dd18943e58b786d8797652b2bb759c319d2b0046dbf69c53c075d00c287b876042fafa23fe4dd705e4e423277c9000311e94ea3f7456e32fd12afe4a2bde358a65824f1055064823c893fc93be3b8c658bb441d7f0b00ac246bf043a9c0053d319f003ef5a5533f74d630d8ce93bab416a82951e05b82c6036593eca89f0ebacd7d51ed9610af43537fcd266e5e47c0d25fedad6d047a1a1ee3eb444367e3eff7c7520ca4f779f2027fe45036204168454df4918b547a4d19e938f3c6db6ca2702ad9bbda1261c64d00b578285bdcfc9851f96a4f2cd14d66b9c1f65742a1344948c9f1da8d338ed4e3deb1ebadf11f8c281944e8849823496f86111f378bdd084c99f65fb9b4ee6271b1d1be424c294d185d9fd9cdf0281c100fa9977bca043a140e06158bc710f33918c7e503f1dd495b4f91920f6214d859f900c6a211849f566bc37417ec8a68f6874ce6160b34707a7341b1c00934e6ba3e60f63c3f4faf486be9780335b4eaee54ddd2f172a91b7a57a07905be685e49921e9d1af40e91b47be5bc1c0dfe3d10ad6b3b6aae0a43f82920c553b2e4932ff630297f2161918c684528373ed0af0d24b069ac4f511d8fd0301eff0365300a1f79e44d4ed21414940103aef3411568aae6f00b7c105453495c7cc6d3a76bcfb0281c100e16ae200e34b1638e158cf98278f3f62f75c97303be14265fbf11816941b366c4f95fdc3a7efe999d74b3919e6b10980ccd6e63e5ca118476b9144e59274c4a4c3f309e0497f9c8e21ce32eda4974cde4f28c66d46b6e63c2ce2bc8c629a974d4256d268dad6c7d5f80c3ad5ed4856d651ed619041acc611d5e2c30a7d11b60e5c665569fd9315120abc590c861e4ecb16df430d9056d517ff060947fe556acc7ba94273398339616f45ada042633bbb1df5e7cc313df660c02f11dc6dd0b96f0281c006d864e60c4be32d580088c14ee2d782fdccb15a5a4d35418f742cea6f410392183b1688d924e3efd42ee87ec26e0a93ab01973ca14955e55556f9ce7efbed1a1474b01e9dd592fb27b01bde028ae3b939c219aebb19d4474afe735e18e9398df62b0e166d7677f0fea0de612e3ce5bca3d5f0d8603356240c8b21f65a4c8dfeadaaddd410f488d430b91f8495b920439ccceab14d12b5eb6ac723a97a382e3efb2a88588bf8f1217d3c2b7d7da4ee64a0c9429a4e1927a8b8aa589353fce4390281c100c3d5f93ebec8efd817d633f1095c7d4d839061701bae2f39cb4d1607e0502ecd8bd58b562dac772906908e0bc63093aa3a1be5da2f6d16b3c593d803ddff8c126e4a8caf51820eb7cbead85a60dc8e46e80bf50bab1c9c5ed90b7d72ceadc30a6bb4f055975e5ef78d1625c662a927f0d9d86a99002fedb60a7c5d752f90adc118068ab1eaf809d7619d7ff3c605e31b1001d96dbf04c622a0192a59ba29369148789423ba5cff12c503c6693c4e515d7775250d1fa52d0d06c093c2226eeeb30281c01af7aa2c6e5de3ebed447b0327ed8c09460a78d700097a147d4b59df7d4ca448ff63f0a4e82f842528b750253309d41c74b0a8e3ab293a69a2ecfb589aa3351fcb9cee01fdf073590d5cc91bd86b44c0dd73ff8ac183a77029ab15adace35707b2e0bb94e02c8badae6860cf6e9d16b913b929a4b32b17872ac278653f7d65cb795c514f15a1944fc78095e9c6567f6cd5882e23e4f4e571a168721c8e70924c1a3d9616fc1f0dd3b05278243bf9aa920fa05b3a53660506f71d3fa0bdc8ff9a -Msg = db6c9d4badb1d9b74d68346448b4d5340631783b5a35ac2458563ed0672cf54197587fb734c4ac189b2dda954cdfb18b41c010a77e90464eea6f863c5da0956bfa8cc636bf0a28be5addfe8d3e7e6f79f71d7fcbbae23ea141783f91d6cc4c8fad125811760ab57133818892471a79c6d04eafef37b2fbe506785318f9398377 -Sig = d480d5a979ad1a0c4ca329ebd88a4aa6948a8cf66a3c0bfee2254409c53054d6fff59f72a46f02c668146a144f8f2ba7c4e6b4de31400eba00ae3ee87589dcb6ea139e70f7704f691bc37d722f62bb3b2cd303a34d92fde4deb54a64dd39184382d59ccaf0c07a7ea4107d0808260ed8d421cb8b1407cdf9e915159282b9f7bffdbf40d877885da7399edebd300a7e77a908f756659a1824f95c8a812aa540ebaa64ab54a233723db55caa8b4466ea9ae6614ad1bb869e9d8e0d032f3901671e94c0b673be6537cd54278ed3da2e1edbc04ee3a9e8070d73ba0ffb93e60f30b87ff3862e9c53908f2c8e99915668c1f46635e05bf7163051ff9d92bc71a626553c69dfdd06a49f7ff1ed51e918f3ed801dae62ca276d7063d72a6ebc136ba06cfedf5aa23277e81008c63b2e0083d0fd6814f6d4b4b40a42e8c0206f3c356a5ec709b7c8a4b74b7b48d53c9d8694d27359c2c7701938d2f0161721a57313bb1a2e11da215872498182493d8517043b4c03f93446aac93830276542026ce83055 -Result = Pass - -Digest = SHA512 -Key = 308206e40201000282018100dca98304b729e819b340e26cecb730aecbd8930e334c731493b180de970e6d3bc579f86c8d5d032f8cd33c4397ee7ffd019d51b0a7dbe4f52505a1a34ae35d23cfaaf594419d509f469b1369589f9c8616a7d698513bc1d423d70070d3d72b996c23abe68b22ccc39aabd16507124042c88d4da6a7451288ec87c9244be226aac02d1817682f80cc34c6eaf37ec84d247aaedebb56c3bbcaffb5cf42f61fe1b7f3fc89748e213973bf5f679d8b8b42a47ac4afd9e51e1d1214dfe1a7e1169080bd9ad91758f6c0f9b22ae40af6b41403d8f2d96db5a088daa5ef8683f86f501f7ad3f358b6337da55c6cfc003197420c1c75abdb7be1403ea4f3e64259f5c6da3325bb87d605b6e14b5350e6e1455c9d497d81046608e38795dc85aba406c9de1f4f9990d5153b98bbabbdcbd6bb18854312b2da48b411e838f26ae3109f104dfd1619f991824ec819861e5199f26bb9b3b299bfa9ec2fd691271b58a8adecbf0ff627b54336f3df7003d70e37d11ddbd930d9aba7e88ed401acb44092fd53d5020400eaf05d028201802d6db91eb32e36e5d5127deb034d14072fe60c1cd13c8c3dd9adbc87140b5e7136f4f89e61bbee7826f45ac1d99194fbaa8c5a0bb94db31d93723b51419d9c6f6eeb5f3610b67f4b4e2ade05cc6b8990e8832cf4cd40f2df0388c9a52072e27efebae20b4ad5951f4d20dd18943e58b786d8797652b2bb759c319d2b0046dbf69c53c075d00c287b876042fafa23fe4dd705e4e423277c9000311e94ea3f7456e32fd12afe4a2bde358a65824f1055064823c893fc93be3b8c658bb441d7f0b00ac246bf043a9c0053d319f003ef5a5533f74d630d8ce93bab416a82951e05b82c6036593eca89f0ebacd7d51ed9610af43537fcd266e5e47c0d25fedad6d047a1a1ee3eb444367e3eff7c7520ca4f779f2027fe45036204168454df4918b547a4d19e938f3c6db6ca2702ad9bbda1261c64d00b578285bdcfc9851f96a4f2cd14d66b9c1f65742a1344948c9f1da8d338ed4e3deb1ebadf11f8c281944e8849823496f86111f378bdd084c99f65fb9b4ee6271b1d1be424c294d185d9fd9cdf0281c100fa9977bca043a140e06158bc710f33918c7e503f1dd495b4f91920f6214d859f900c6a211849f566bc37417ec8a68f6874ce6160b34707a7341b1c00934e6ba3e60f63c3f4faf486be9780335b4eaee54ddd2f172a91b7a57a07905be685e49921e9d1af40e91b47be5bc1c0dfe3d10ad6b3b6aae0a43f82920c553b2e4932ff630297f2161918c684528373ed0af0d24b069ac4f511d8fd0301eff0365300a1f79e44d4ed21414940103aef3411568aae6f00b7c105453495c7cc6d3a76bcfb0281c100e16ae200e34b1638e158cf98278f3f62f75c97303be14265fbf11816941b366c4f95fdc3a7efe999d74b3919e6b10980ccd6e63e5ca118476b9144e59274c4a4c3f309e0497f9c8e21ce32eda4974cde4f28c66d46b6e63c2ce2bc8c629a974d4256d268dad6c7d5f80c3ad5ed4856d651ed619041acc611d5e2c30a7d11b60e5c665569fd9315120abc590c861e4ecb16df430d9056d517ff060947fe556acc7ba94273398339616f45ada042633bbb1df5e7cc313df660c02f11dc6dd0b96f0281c006d864e60c4be32d580088c14ee2d782fdccb15a5a4d35418f742cea6f410392183b1688d924e3efd42ee87ec26e0a93ab01973ca14955e55556f9ce7efbed1a1474b01e9dd592fb27b01bde028ae3b939c219aebb19d4474afe735e18e9398df62b0e166d7677f0fea0de612e3ce5bca3d5f0d8603356240c8b21f65a4c8dfeadaaddd410f488d430b91f8495b920439ccceab14d12b5eb6ac723a97a382e3efb2a88588bf8f1217d3c2b7d7da4ee64a0c9429a4e1927a8b8aa589353fce4390281c100c3d5f93ebec8efd817d633f1095c7d4d839061701bae2f39cb4d1607e0502ecd8bd58b562dac772906908e0bc63093aa3a1be5da2f6d16b3c593d803ddff8c126e4a8caf51820eb7cbead85a60dc8e46e80bf50bab1c9c5ed90b7d72ceadc30a6bb4f055975e5ef78d1625c662a927f0d9d86a99002fedb60a7c5d752f90adc118068ab1eaf809d7619d7ff3c605e31b1001d96dbf04c622a0192a59ba29369148789423ba5cff12c503c6693c4e515d7775250d1fa52d0d06c093c2226eeeb30281c01af7aa2c6e5de3ebed447b0327ed8c09460a78d700097a147d4b59df7d4ca448ff63f0a4e82f842528b750253309d41c74b0a8e3ab293a69a2ecfb589aa3351fcb9cee01fdf073590d5cc91bd86b44c0dd73ff8ac183a77029ab15adace35707b2e0bb94e02c8badae6860cf6e9d16b913b929a4b32b17872ac278653f7d65cb795c514f15a1944fc78095e9c6567f6cd5882e23e4f4e571a168721c8e70924c1a3d9616fc1f0dd3b05278243bf9aa920fa05b3a53660506f71d3fa0bdc8ff9a -Msg = d5dd3b6ce9772d9a97fe21648497783bac5bb5254aad82b6f7cbf43b15a40f386eea8d151967db149e9465865968133f246e1347301adad2345d6572ca77c58c150dda09a87b5f4da36b266d1fa7a59ccd2bb2e7d97f8b2315431923530b762e126eacaf5e5ac02ff1aaef819efb373cf0bb196f0e829e8fe1a698b4790a2a05 -Sig = bf9e8b4f2ae513f73d788958003733dbe20957b147b17c3f4fd6d024e8e83f07b65d9f3dbc3b1fe84da021ceabfccd8c57a014fbe5a2bce3e4051b7d03e09fc0350b6a21fad214ae7a073277c77a40dc44a5aeea5194a756b69c93977b69ee9294360eaa73a574548fa6a974a7cd5a6adcf09e80631156af85a8e5c5317e189eead47e2ead65c381396b5cacde260e937284a8e90eff2cbcb9dee22925f2f7256f74c67cf3ffc7b8ce657e8d135f0f376d9d936a79792c981614d98e3f7d662a4fd46dcda96916b32f366ed27dab188f184b984df0b559710d8ff2040be462f91943501bda4840fdd5c8ec15d189064def756e545db319e007c433f0468a6723357ba47d156ab7652b06ae2b18874f0771c626466dbd6423e6cbc518b5e4ae7b8f15e0f2d0471a9516dfa9591697f742862324d8d103fb631d6c2073d406b65cdee7bda543e2e9ebff9906985d1cb365172ea623ed7aa4c7a322f0984680e34e99bc6231b02e3d14581608bc55bca7fbe22d7f03e904da4552e009e5607f0418 -Result = Pass - -Digest = SHA512 -Key = 308206e40201000282018100dca98304b729e819b340e26cecb730aecbd8930e334c731493b180de970e6d3bc579f86c8d5d032f8cd33c4397ee7ffd019d51b0a7dbe4f52505a1a34ae35d23cfaaf594419d509f469b1369589f9c8616a7d698513bc1d423d70070d3d72b996c23abe68b22ccc39aabd16507124042c88d4da6a7451288ec87c9244be226aac02d1817682f80cc34c6eaf37ec84d247aaedebb56c3bbcaffb5cf42f61fe1b7f3fc89748e213973bf5f679d8b8b42a47ac4afd9e51e1d1214dfe1a7e1169080bd9ad91758f6c0f9b22ae40af6b41403d8f2d96db5a088daa5ef8683f86f501f7ad3f358b6337da55c6cfc003197420c1c75abdb7be1403ea4f3e64259f5c6da3325bb87d605b6e14b5350e6e1455c9d497d81046608e38795dc85aba406c9de1f4f9990d5153b98bbabbdcbd6bb18854312b2da48b411e838f26ae3109f104dfd1619f991824ec819861e5199f26bb9b3b299bfa9ec2fd691271b58a8adecbf0ff627b54336f3df7003d70e37d11ddbd930d9aba7e88ed401acb44092fd53d5020400eaf05d028201802d6db91eb32e36e5d5127deb034d14072fe60c1cd13c8c3dd9adbc87140b5e7136f4f89e61bbee7826f45ac1d99194fbaa8c5a0bb94db31d93723b51419d9c6f6eeb5f3610b67f4b4e2ade05cc6b8990e8832cf4cd40f2df0388c9a52072e27efebae20b4ad5951f4d20dd18943e58b786d8797652b2bb759c319d2b0046dbf69c53c075d00c287b876042fafa23fe4dd705e4e423277c9000311e94ea3f7456e32fd12afe4a2bde358a65824f1055064823c893fc93be3b8c658bb441d7f0b00ac246bf043a9c0053d319f003ef5a5533f74d630d8ce93bab416a82951e05b82c6036593eca89f0ebacd7d51ed9610af43537fcd266e5e47c0d25fedad6d047a1a1ee3eb444367e3eff7c7520ca4f779f2027fe45036204168454df4918b547a4d19e938f3c6db6ca2702ad9bbda1261c64d00b578285bdcfc9851f96a4f2cd14d66b9c1f65742a1344948c9f1da8d338ed4e3deb1ebadf11f8c281944e8849823496f86111f378bdd084c99f65fb9b4ee6271b1d1be424c294d185d9fd9cdf0281c100fa9977bca043a140e06158bc710f33918c7e503f1dd495b4f91920f6214d859f900c6a211849f566bc37417ec8a68f6874ce6160b34707a7341b1c00934e6ba3e60f63c3f4faf486be9780335b4eaee54ddd2f172a91b7a57a07905be685e49921e9d1af40e91b47be5bc1c0dfe3d10ad6b3b6aae0a43f82920c553b2e4932ff630297f2161918c684528373ed0af0d24b069ac4f511d8fd0301eff0365300a1f79e44d4ed21414940103aef3411568aae6f00b7c105453495c7cc6d3a76bcfb0281c100e16ae200e34b1638e158cf98278f3f62f75c97303be14265fbf11816941b366c4f95fdc3a7efe999d74b3919e6b10980ccd6e63e5ca118476b9144e59274c4a4c3f309e0497f9c8e21ce32eda4974cde4f28c66d46b6e63c2ce2bc8c629a974d4256d268dad6c7d5f80c3ad5ed4856d651ed619041acc611d5e2c30a7d11b60e5c665569fd9315120abc590c861e4ecb16df430d9056d517ff060947fe556acc7ba94273398339616f45ada042633bbb1df5e7cc313df660c02f11dc6dd0b96f0281c006d864e60c4be32d580088c14ee2d782fdccb15a5a4d35418f742cea6f410392183b1688d924e3efd42ee87ec26e0a93ab01973ca14955e55556f9ce7efbed1a1474b01e9dd592fb27b01bde028ae3b939c219aebb19d4474afe735e18e9398df62b0e166d7677f0fea0de612e3ce5bca3d5f0d8603356240c8b21f65a4c8dfeadaaddd410f488d430b91f8495b920439ccceab14d12b5eb6ac723a97a382e3efb2a88588bf8f1217d3c2b7d7da4ee64a0c9429a4e1927a8b8aa589353fce4390281c100c3d5f93ebec8efd817d633f1095c7d4d839061701bae2f39cb4d1607e0502ecd8bd58b562dac772906908e0bc63093aa3a1be5da2f6d16b3c593d803ddff8c126e4a8caf51820eb7cbead85a60dc8e46e80bf50bab1c9c5ed90b7d72ceadc30a6bb4f055975e5ef78d1625c662a927f0d9d86a99002fedb60a7c5d752f90adc118068ab1eaf809d7619d7ff3c605e31b1001d96dbf04c622a0192a59ba29369148789423ba5cff12c503c6693c4e515d7775250d1fa52d0d06c093c2226eeeb30281c01af7aa2c6e5de3ebed447b0327ed8c09460a78d700097a147d4b59df7d4ca448ff63f0a4e82f842528b750253309d41c74b0a8e3ab293a69a2ecfb589aa3351fcb9cee01fdf073590d5cc91bd86b44c0dd73ff8ac183a77029ab15adace35707b2e0bb94e02c8badae6860cf6e9d16b913b929a4b32b17872ac278653f7d65cb795c514f15a1944fc78095e9c6567f6cd5882e23e4f4e571a168721c8e70924c1a3d9616fc1f0dd3b05278243bf9aa920fa05b3a53660506f71d3fa0bdc8ff9a -Msg = 591652b6eb1b52c9bebd583256c2228680110b878917dea5ad69e8c5d2ab514277b0ac31e7e2cceab2e5d9c45d77a41f599b38a832f6b2d8097952be4440d1ff84baf51bd70b64f130aeb686145fcd02953869fb841af7f6e34eaa2b996ccd89697c58fa255cc1e81f621400e14146361e31c709e84a56082231199539f7ede9 -Sig = 1de79d7216dde125deb77c34d90ab321a4de5fb11c296656ad9bf9a24653591117ace415e18eadce92823f31afe56fc8e29494e37cf2ba85abc3bac66e019584799aee234ad5559e21c7fd4ffd24d82649f679b4c05d8c15d3d4574a2e76b1f3ee9f8dec0af60b0ced1be8a19c2fa71bcbc1fb190899ec8556958e0782ace7196b36658656cf364d3773de86260fd8987604ef35eae8f38ec2cb0da864cca719219c2ad71c08506c412ec77995f37439c856977b71dfb9647990ef70faf43273ae60839cd0679ec9aa42bf914e421b797cba218a400ff9dbaa206cb9c2b0596c709a322b73cb82721d79f9db24211bf075a1cef74e8f6d2ba07fe0dc8a60f48af511ad469dcd06e07a4ce68072139c46d8be5e721253c3b18b3c94485ce55c0e7c1cbc39b77bc6bb7e5e9f42b1539e442da857658c9e771ccb86be7397647efbc0ccb2c3ad31ac4e32bf248cc0ced3a4f094526b25631cb50247096129b08a9c2cdfb775978b0feee265a6c41991c1dc4452615b78c906c7ed1bd207969d98d0 -Result = Pass - -Digest = SHA512 -Key = 308206e40201000282018100dca98304b729e819b340e26cecb730aecbd8930e334c731493b180de970e6d3bc579f86c8d5d032f8cd33c4397ee7ffd019d51b0a7dbe4f52505a1a34ae35d23cfaaf594419d509f469b1369589f9c8616a7d698513bc1d423d70070d3d72b996c23abe68b22ccc39aabd16507124042c88d4da6a7451288ec87c9244be226aac02d1817682f80cc34c6eaf37ec84d247aaedebb56c3bbcaffb5cf42f61fe1b7f3fc89748e213973bf5f679d8b8b42a47ac4afd9e51e1d1214dfe1a7e1169080bd9ad91758f6c0f9b22ae40af6b41403d8f2d96db5a088daa5ef8683f86f501f7ad3f358b6337da55c6cfc003197420c1c75abdb7be1403ea4f3e64259f5c6da3325bb87d605b6e14b5350e6e1455c9d497d81046608e38795dc85aba406c9de1f4f9990d5153b98bbabbdcbd6bb18854312b2da48b411e838f26ae3109f104dfd1619f991824ec819861e5199f26bb9b3b299bfa9ec2fd691271b58a8adecbf0ff627b54336f3df7003d70e37d11ddbd930d9aba7e88ed401acb44092fd53d5020400eaf05d028201802d6db91eb32e36e5d5127deb034d14072fe60c1cd13c8c3dd9adbc87140b5e7136f4f89e61bbee7826f45ac1d99194fbaa8c5a0bb94db31d93723b51419d9c6f6eeb5f3610b67f4b4e2ade05cc6b8990e8832cf4cd40f2df0388c9a52072e27efebae20b4ad5951f4d20dd18943e58b786d8797652b2bb759c319d2b0046dbf69c53c075d00c287b876042fafa23fe4dd705e4e423277c9000311e94ea3f7456e32fd12afe4a2bde358a65824f1055064823c893fc93be3b8c658bb441d7f0b00ac246bf043a9c0053d319f003ef5a5533f74d630d8ce93bab416a82951e05b82c6036593eca89f0ebacd7d51ed9610af43537fcd266e5e47c0d25fedad6d047a1a1ee3eb444367e3eff7c7520ca4f779f2027fe45036204168454df4918b547a4d19e938f3c6db6ca2702ad9bbda1261c64d00b578285bdcfc9851f96a4f2cd14d66b9c1f65742a1344948c9f1da8d338ed4e3deb1ebadf11f8c281944e8849823496f86111f378bdd084c99f65fb9b4ee6271b1d1be424c294d185d9fd9cdf0281c100fa9977bca043a140e06158bc710f33918c7e503f1dd495b4f91920f6214d859f900c6a211849f566bc37417ec8a68f6874ce6160b34707a7341b1c00934e6ba3e60f63c3f4faf486be9780335b4eaee54ddd2f172a91b7a57a07905be685e49921e9d1af40e91b47be5bc1c0dfe3d10ad6b3b6aae0a43f82920c553b2e4932ff630297f2161918c684528373ed0af0d24b069ac4f511d8fd0301eff0365300a1f79e44d4ed21414940103aef3411568aae6f00b7c105453495c7cc6d3a76bcfb0281c100e16ae200e34b1638e158cf98278f3f62f75c97303be14265fbf11816941b366c4f95fdc3a7efe999d74b3919e6b10980ccd6e63e5ca118476b9144e59274c4a4c3f309e0497f9c8e21ce32eda4974cde4f28c66d46b6e63c2ce2bc8c629a974d4256d268dad6c7d5f80c3ad5ed4856d651ed619041acc611d5e2c30a7d11b60e5c665569fd9315120abc590c861e4ecb16df430d9056d517ff060947fe556acc7ba94273398339616f45ada042633bbb1df5e7cc313df660c02f11dc6dd0b96f0281c006d864e60c4be32d580088c14ee2d782fdccb15a5a4d35418f742cea6f410392183b1688d924e3efd42ee87ec26e0a93ab01973ca14955e55556f9ce7efbed1a1474b01e9dd592fb27b01bde028ae3b939c219aebb19d4474afe735e18e9398df62b0e166d7677f0fea0de612e3ce5bca3d5f0d8603356240c8b21f65a4c8dfeadaaddd410f488d430b91f8495b920439ccceab14d12b5eb6ac723a97a382e3efb2a88588bf8f1217d3c2b7d7da4ee64a0c9429a4e1927a8b8aa589353fce4390281c100c3d5f93ebec8efd817d633f1095c7d4d839061701bae2f39cb4d1607e0502ecd8bd58b562dac772906908e0bc63093aa3a1be5da2f6d16b3c593d803ddff8c126e4a8caf51820eb7cbead85a60dc8e46e80bf50bab1c9c5ed90b7d72ceadc30a6bb4f055975e5ef78d1625c662a927f0d9d86a99002fedb60a7c5d752f90adc118068ab1eaf809d7619d7ff3c605e31b1001d96dbf04c622a0192a59ba29369148789423ba5cff12c503c6693c4e515d7775250d1fa52d0d06c093c2226eeeb30281c01af7aa2c6e5de3ebed447b0327ed8c09460a78d700097a147d4b59df7d4ca448ff63f0a4e82f842528b750253309d41c74b0a8e3ab293a69a2ecfb589aa3351fcb9cee01fdf073590d5cc91bd86b44c0dd73ff8ac183a77029ab15adace35707b2e0bb94e02c8badae6860cf6e9d16b913b929a4b32b17872ac278653f7d65cb795c514f15a1944fc78095e9c6567f6cd5882e23e4f4e571a168721c8e70924c1a3d9616fc1f0dd3b05278243bf9aa920fa05b3a53660506f71d3fa0bdc8ff9a -Msg = 8dffaa9151271ad22622f228c892e1d9748b3c394397f2cbb6febeaa9244a027eef28db48a9a660162152764830f617e1ec6ea1cdb0ed25b6f999a107175a16669d6dfc92b16d50363fac4a570371ea976343a55ae124b6301ea935ed655d44f28320899dba35122505933b3371201a2a45f95ae65ab442a9479125e68ed212a -Sig = b329aef83a56ddc57cd9a0e15eb0b0b7aea7d78d5e8ca3982bd31cc825a0cd1c444d9f7bea9e7a27f3bbb3761060ff95fee1a3e864d2108fc40b64786a96a6d62d201217e03a8ba2c07ee94c267149d1e72cc5779b737e8547acd6aa4bba3ff38bf9687e9e82f511b597ad7ec1d795c36a98bf83a90fc86b0cad41953360738921936a458674b2e9a7012ac3029fdb0a9d12318202d2544a0d976ee536e03b7e8d894b3b9c762dab0110849cc1eaad747e3d88d7dcf49f824df027e645c0b9294e655d9fc9e1ef95eb53aaff5775c349486d4b5d67dba29b6217f8b9976612b57e16fc1f99983f2af04579938606879b7c7253e870714b4f0f24e26dc8c7a6fceffb5f98e3b2fb5db949d2f98cd1ae1aa552696b48c39f678e154351cc756d3e9a97f79279853ebd0db9ae6859fb2d5721385d06f5565a3a8ff0992d517acda1af69a92854a1b32a79cb9e442a90b055bb2ec3af8d9926a0d857e3cb1e7e4a7300d1accb9492ec7832af453529ff0f4a6ad3259757f707f713aaa5df231f7487 -Result = Pass - -Digest = SHA512 -Key = 308206e40201000282018100dca98304b729e819b340e26cecb730aecbd8930e334c731493b180de970e6d3bc579f86c8d5d032f8cd33c4397ee7ffd019d51b0a7dbe4f52505a1a34ae35d23cfaaf594419d509f469b1369589f9c8616a7d698513bc1d423d70070d3d72b996c23abe68b22ccc39aabd16507124042c88d4da6a7451288ec87c9244be226aac02d1817682f80cc34c6eaf37ec84d247aaedebb56c3bbcaffb5cf42f61fe1b7f3fc89748e213973bf5f679d8b8b42a47ac4afd9e51e1d1214dfe1a7e1169080bd9ad91758f6c0f9b22ae40af6b41403d8f2d96db5a088daa5ef8683f86f501f7ad3f358b6337da55c6cfc003197420c1c75abdb7be1403ea4f3e64259f5c6da3325bb87d605b6e14b5350e6e1455c9d497d81046608e38795dc85aba406c9de1f4f9990d5153b98bbabbdcbd6bb18854312b2da48b411e838f26ae3109f104dfd1619f991824ec819861e5199f26bb9b3b299bfa9ec2fd691271b58a8adecbf0ff627b54336f3df7003d70e37d11ddbd930d9aba7e88ed401acb44092fd53d5020400eaf05d028201802d6db91eb32e36e5d5127deb034d14072fe60c1cd13c8c3dd9adbc87140b5e7136f4f89e61bbee7826f45ac1d99194fbaa8c5a0bb94db31d93723b51419d9c6f6eeb5f3610b67f4b4e2ade05cc6b8990e8832cf4cd40f2df0388c9a52072e27efebae20b4ad5951f4d20dd18943e58b786d8797652b2bb759c319d2b0046dbf69c53c075d00c287b876042fafa23fe4dd705e4e423277c9000311e94ea3f7456e32fd12afe4a2bde358a65824f1055064823c893fc93be3b8c658bb441d7f0b00ac246bf043a9c0053d319f003ef5a5533f74d630d8ce93bab416a82951e05b82c6036593eca89f0ebacd7d51ed9610af43537fcd266e5e47c0d25fedad6d047a1a1ee3eb444367e3eff7c7520ca4f779f2027fe45036204168454df4918b547a4d19e938f3c6db6ca2702ad9bbda1261c64d00b578285bdcfc9851f96a4f2cd14d66b9c1f65742a1344948c9f1da8d338ed4e3deb1ebadf11f8c281944e8849823496f86111f378bdd084c99f65fb9b4ee6271b1d1be424c294d185d9fd9cdf0281c100fa9977bca043a140e06158bc710f33918c7e503f1dd495b4f91920f6214d859f900c6a211849f566bc37417ec8a68f6874ce6160b34707a7341b1c00934e6ba3e60f63c3f4faf486be9780335b4eaee54ddd2f172a91b7a57a07905be685e49921e9d1af40e91b47be5bc1c0dfe3d10ad6b3b6aae0a43f82920c553b2e4932ff630297f2161918c684528373ed0af0d24b069ac4f511d8fd0301eff0365300a1f79e44d4ed21414940103aef3411568aae6f00b7c105453495c7cc6d3a76bcfb0281c100e16ae200e34b1638e158cf98278f3f62f75c97303be14265fbf11816941b366c4f95fdc3a7efe999d74b3919e6b10980ccd6e63e5ca118476b9144e59274c4a4c3f309e0497f9c8e21ce32eda4974cde4f28c66d46b6e63c2ce2bc8c629a974d4256d268dad6c7d5f80c3ad5ed4856d651ed619041acc611d5e2c30a7d11b60e5c665569fd9315120abc590c861e4ecb16df430d9056d517ff060947fe556acc7ba94273398339616f45ada042633bbb1df5e7cc313df660c02f11dc6dd0b96f0281c006d864e60c4be32d580088c14ee2d782fdccb15a5a4d35418f742cea6f410392183b1688d924e3efd42ee87ec26e0a93ab01973ca14955e55556f9ce7efbed1a1474b01e9dd592fb27b01bde028ae3b939c219aebb19d4474afe735e18e9398df62b0e166d7677f0fea0de612e3ce5bca3d5f0d8603356240c8b21f65a4c8dfeadaaddd410f488d430b91f8495b920439ccceab14d12b5eb6ac723a97a382e3efb2a88588bf8f1217d3c2b7d7da4ee64a0c9429a4e1927a8b8aa589353fce4390281c100c3d5f93ebec8efd817d633f1095c7d4d839061701bae2f39cb4d1607e0502ecd8bd58b562dac772906908e0bc63093aa3a1be5da2f6d16b3c593d803ddff8c126e4a8caf51820eb7cbead85a60dc8e46e80bf50bab1c9c5ed90b7d72ceadc30a6bb4f055975e5ef78d1625c662a927f0d9d86a99002fedb60a7c5d752f90adc118068ab1eaf809d7619d7ff3c605e31b1001d96dbf04c622a0192a59ba29369148789423ba5cff12c503c6693c4e515d7775250d1fa52d0d06c093c2226eeeb30281c01af7aa2c6e5de3ebed447b0327ed8c09460a78d700097a147d4b59df7d4ca448ff63f0a4e82f842528b750253309d41c74b0a8e3ab293a69a2ecfb589aa3351fcb9cee01fdf073590d5cc91bd86b44c0dd73ff8ac183a77029ab15adace35707b2e0bb94e02c8badae6860cf6e9d16b913b929a4b32b17872ac278653f7d65cb795c514f15a1944fc78095e9c6567f6cd5882e23e4f4e571a168721c8e70924c1a3d9616fc1f0dd3b05278243bf9aa920fa05b3a53660506f71d3fa0bdc8ff9a -Msg = 71d4163e708c121e931bb9692b217dddd35c7346f61cfc9591f7a4313abd4a9262af820bd7eb37e78c2b95b89daf25ec8e783aa1d4b78dbb96852433b4d478b109a6d65eed7d06f3fe122b172149eae7c365ced66578ebb7571ec218c36b65d2ee22dcdebb28c66a7138432cbdd712f7fb8bf78cb14860b25c2b4789706b5a1b -Sig = 2522ee3bda30c0434e54b199da8c9733964fd402b707f5b330f4f754a0502c7a713c7814f0e851a4a4db72690db96ea8b8813bd8629a948bb30c1b8272a816b30a755fc6fb1754167c3eb1f194395907a56cf5a73b4154383a05b78b731fedd9077f3c2267a5cf926697871fe0a4bed9c219552dd1c87aff50613094bcaa2dec42a35380a6bac673da2594f824a8f32f21d7593a3e49c78ee280193a478621d3b095c16dce72935314d4a2323eebe7855ca4738a19b5a31a5f95ab91fbe1289c02fea7a65b91327b7b9790556289e1b988e45d50eb8cea1581de5d5dfd21001c73b43921d8b21b9644b0f2b96ee6b09d73709c33338143d6a2fec559a436c5ec865d3acca5fee654f1325ae57255dfd42188c84dcb1f7c1e86028a74e31d736078741ee97c39a56e4de00fc12b8051835bbd0d8fcae737322099adc1017107022dd15c114da57e78b95681ba9945615b59da90f5a2a99a252eb42b2006eedd6e78476c2905473ee6b4f23c1c5cf0b80451c5426ea009141cb3fcb0df2ded92be -Result = Pass - -Digest = SHA512 -Key = 308206e40201000282018100dca98304b729e819b340e26cecb730aecbd8930e334c731493b180de970e6d3bc579f86c8d5d032f8cd33c4397ee7ffd019d51b0a7dbe4f52505a1a34ae35d23cfaaf594419d509f469b1369589f9c8616a7d698513bc1d423d70070d3d72b996c23abe68b22ccc39aabd16507124042c88d4da6a7451288ec87c9244be226aac02d1817682f80cc34c6eaf37ec84d247aaedebb56c3bbcaffb5cf42f61fe1b7f3fc89748e213973bf5f679d8b8b42a47ac4afd9e51e1d1214dfe1a7e1169080bd9ad91758f6c0f9b22ae40af6b41403d8f2d96db5a088daa5ef8683f86f501f7ad3f358b6337da55c6cfc003197420c1c75abdb7be1403ea4f3e64259f5c6da3325bb87d605b6e14b5350e6e1455c9d497d81046608e38795dc85aba406c9de1f4f9990d5153b98bbabbdcbd6bb18854312b2da48b411e838f26ae3109f104dfd1619f991824ec819861e5199f26bb9b3b299bfa9ec2fd691271b58a8adecbf0ff627b54336f3df7003d70e37d11ddbd930d9aba7e88ed401acb44092fd53d5020400eaf05d028201802d6db91eb32e36e5d5127deb034d14072fe60c1cd13c8c3dd9adbc87140b5e7136f4f89e61bbee7826f45ac1d99194fbaa8c5a0bb94db31d93723b51419d9c6f6eeb5f3610b67f4b4e2ade05cc6b8990e8832cf4cd40f2df0388c9a52072e27efebae20b4ad5951f4d20dd18943e58b786d8797652b2bb759c319d2b0046dbf69c53c075d00c287b876042fafa23fe4dd705e4e423277c9000311e94ea3f7456e32fd12afe4a2bde358a65824f1055064823c893fc93be3b8c658bb441d7f0b00ac246bf043a9c0053d319f003ef5a5533f74d630d8ce93bab416a82951e05b82c6036593eca89f0ebacd7d51ed9610af43537fcd266e5e47c0d25fedad6d047a1a1ee3eb444367e3eff7c7520ca4f779f2027fe45036204168454df4918b547a4d19e938f3c6db6ca2702ad9bbda1261c64d00b578285bdcfc9851f96a4f2cd14d66b9c1f65742a1344948c9f1da8d338ed4e3deb1ebadf11f8c281944e8849823496f86111f378bdd084c99f65fb9b4ee6271b1d1be424c294d185d9fd9cdf0281c100fa9977bca043a140e06158bc710f33918c7e503f1dd495b4f91920f6214d859f900c6a211849f566bc37417ec8a68f6874ce6160b34707a7341b1c00934e6ba3e60f63c3f4faf486be9780335b4eaee54ddd2f172a91b7a57a07905be685e49921e9d1af40e91b47be5bc1c0dfe3d10ad6b3b6aae0a43f82920c553b2e4932ff630297f2161918c684528373ed0af0d24b069ac4f511d8fd0301eff0365300a1f79e44d4ed21414940103aef3411568aae6f00b7c105453495c7cc6d3a76bcfb0281c100e16ae200e34b1638e158cf98278f3f62f75c97303be14265fbf11816941b366c4f95fdc3a7efe999d74b3919e6b10980ccd6e63e5ca118476b9144e59274c4a4c3f309e0497f9c8e21ce32eda4974cde4f28c66d46b6e63c2ce2bc8c629a974d4256d268dad6c7d5f80c3ad5ed4856d651ed619041acc611d5e2c30a7d11b60e5c665569fd9315120abc590c861e4ecb16df430d9056d517ff060947fe556acc7ba94273398339616f45ada042633bbb1df5e7cc313df660c02f11dc6dd0b96f0281c006d864e60c4be32d580088c14ee2d782fdccb15a5a4d35418f742cea6f410392183b1688d924e3efd42ee87ec26e0a93ab01973ca14955e55556f9ce7efbed1a1474b01e9dd592fb27b01bde028ae3b939c219aebb19d4474afe735e18e9398df62b0e166d7677f0fea0de612e3ce5bca3d5f0d8603356240c8b21f65a4c8dfeadaaddd410f488d430b91f8495b920439ccceab14d12b5eb6ac723a97a382e3efb2a88588bf8f1217d3c2b7d7da4ee64a0c9429a4e1927a8b8aa589353fce4390281c100c3d5f93ebec8efd817d633f1095c7d4d839061701bae2f39cb4d1607e0502ecd8bd58b562dac772906908e0bc63093aa3a1be5da2f6d16b3c593d803ddff8c126e4a8caf51820eb7cbead85a60dc8e46e80bf50bab1c9c5ed90b7d72ceadc30a6bb4f055975e5ef78d1625c662a927f0d9d86a99002fedb60a7c5d752f90adc118068ab1eaf809d7619d7ff3c605e31b1001d96dbf04c622a0192a59ba29369148789423ba5cff12c503c6693c4e515d7775250d1fa52d0d06c093c2226eeeb30281c01af7aa2c6e5de3ebed447b0327ed8c09460a78d700097a147d4b59df7d4ca448ff63f0a4e82f842528b750253309d41c74b0a8e3ab293a69a2ecfb589aa3351fcb9cee01fdf073590d5cc91bd86b44c0dd73ff8ac183a77029ab15adace35707b2e0bb94e02c8badae6860cf6e9d16b913b929a4b32b17872ac278653f7d65cb795c514f15a1944fc78095e9c6567f6cd5882e23e4f4e571a168721c8e70924c1a3d9616fc1f0dd3b05278243bf9aa920fa05b3a53660506f71d3fa0bdc8ff9a -Msg = d00e1529228c79a20a1c3668ffa4a54140bb170bc5c669fd7560d9309900175e91d5a0e9c5f5471fdfb714bc385d52b08ff7e4230184d8b735593f0dd8c73b8a49f8595b951a21b6a5bfec63b684f67c0af1b471dda1684e9ba3f241501fe957603dea86784230f0c4fd65666361b82b187330fb4267404c0e059bd4eb52494b -Sig = 1835dd97e5093a33ce1e62d683863f6b3507f358a62fc879b524350fbc7330681cb0c682eef4330419caf8543bd9269b6d91d8e107ec38b6e9c6eaabf906457205d52a900e05579aa11fc581375264e69a925798e5a348e5a16f1567d5d0e40853380b34deac93ad7377aae8a27b090d0d3a92bf7a824d926e2e35a0c3bd0e990b591120d74dd9b052a73568e3c3f29c5a77fb1c921bce9c1e7f764aa67bac119f5839a5303860edeb634814c2386c831fee6200cf55b6bfea058b795a0fcf26eb7216ae1b7587c82e5685e584170cbddc89a77e0989d4ce5c3c7fdb664aaeaadbce1f231e64798f6f9a85456b5a93a502126a80e2d21f46921cc3601f5ecdbd56998a63b865fce7eb299f76af40e91281bfc019f40e0d46811e383691e4024c94566f18024ff2b22aa7e1270233ff16e92f89c68509ea0be2d34511581d472207d1b65f7ede45133de87a5ffb9262c1ff84088ff04c0183f48467996a94d82ba7510cb0b36cf2548209a50603375cb82e678f51493345ca33f9345ffdf54be9 -Result = Pass - -Digest = SHA512 -Key = 308206e40201000282018100dca98304b729e819b340e26cecb730aecbd8930e334c731493b180de970e6d3bc579f86c8d5d032f8cd33c4397ee7ffd019d51b0a7dbe4f52505a1a34ae35d23cfaaf594419d509f469b1369589f9c8616a7d698513bc1d423d70070d3d72b996c23abe68b22ccc39aabd16507124042c88d4da6a7451288ec87c9244be226aac02d1817682f80cc34c6eaf37ec84d247aaedebb56c3bbcaffb5cf42f61fe1b7f3fc89748e213973bf5f679d8b8b42a47ac4afd9e51e1d1214dfe1a7e1169080bd9ad91758f6c0f9b22ae40af6b41403d8f2d96db5a088daa5ef8683f86f501f7ad3f358b6337da55c6cfc003197420c1c75abdb7be1403ea4f3e64259f5c6da3325bb87d605b6e14b5350e6e1455c9d497d81046608e38795dc85aba406c9de1f4f9990d5153b98bbabbdcbd6bb18854312b2da48b411e838f26ae3109f104dfd1619f991824ec819861e5199f26bb9b3b299bfa9ec2fd691271b58a8adecbf0ff627b54336f3df7003d70e37d11ddbd930d9aba7e88ed401acb44092fd53d5020400eaf05d028201802d6db91eb32e36e5d5127deb034d14072fe60c1cd13c8c3dd9adbc87140b5e7136f4f89e61bbee7826f45ac1d99194fbaa8c5a0bb94db31d93723b51419d9c6f6eeb5f3610b67f4b4e2ade05cc6b8990e8832cf4cd40f2df0388c9a52072e27efebae20b4ad5951f4d20dd18943e58b786d8797652b2bb759c319d2b0046dbf69c53c075d00c287b876042fafa23fe4dd705e4e423277c9000311e94ea3f7456e32fd12afe4a2bde358a65824f1055064823c893fc93be3b8c658bb441d7f0b00ac246bf043a9c0053d319f003ef5a5533f74d630d8ce93bab416a82951e05b82c6036593eca89f0ebacd7d51ed9610af43537fcd266e5e47c0d25fedad6d047a1a1ee3eb444367e3eff7c7520ca4f779f2027fe45036204168454df4918b547a4d19e938f3c6db6ca2702ad9bbda1261c64d00b578285bdcfc9851f96a4f2cd14d66b9c1f65742a1344948c9f1da8d338ed4e3deb1ebadf11f8c281944e8849823496f86111f378bdd084c99f65fb9b4ee6271b1d1be424c294d185d9fd9cdf0281c100fa9977bca043a140e06158bc710f33918c7e503f1dd495b4f91920f6214d859f900c6a211849f566bc37417ec8a68f6874ce6160b34707a7341b1c00934e6ba3e60f63c3f4faf486be9780335b4eaee54ddd2f172a91b7a57a07905be685e49921e9d1af40e91b47be5bc1c0dfe3d10ad6b3b6aae0a43f82920c553b2e4932ff630297f2161918c684528373ed0af0d24b069ac4f511d8fd0301eff0365300a1f79e44d4ed21414940103aef3411568aae6f00b7c105453495c7cc6d3a76bcfb0281c100e16ae200e34b1638e158cf98278f3f62f75c97303be14265fbf11816941b366c4f95fdc3a7efe999d74b3919e6b10980ccd6e63e5ca118476b9144e59274c4a4c3f309e0497f9c8e21ce32eda4974cde4f28c66d46b6e63c2ce2bc8c629a974d4256d268dad6c7d5f80c3ad5ed4856d651ed619041acc611d5e2c30a7d11b60e5c665569fd9315120abc590c861e4ecb16df430d9056d517ff060947fe556acc7ba94273398339616f45ada042633bbb1df5e7cc313df660c02f11dc6dd0b96f0281c006d864e60c4be32d580088c14ee2d782fdccb15a5a4d35418f742cea6f410392183b1688d924e3efd42ee87ec26e0a93ab01973ca14955e55556f9ce7efbed1a1474b01e9dd592fb27b01bde028ae3b939c219aebb19d4474afe735e18e9398df62b0e166d7677f0fea0de612e3ce5bca3d5f0d8603356240c8b21f65a4c8dfeadaaddd410f488d430b91f8495b920439ccceab14d12b5eb6ac723a97a382e3efb2a88588bf8f1217d3c2b7d7da4ee64a0c9429a4e1927a8b8aa589353fce4390281c100c3d5f93ebec8efd817d633f1095c7d4d839061701bae2f39cb4d1607e0502ecd8bd58b562dac772906908e0bc63093aa3a1be5da2f6d16b3c593d803ddff8c126e4a8caf51820eb7cbead85a60dc8e46e80bf50bab1c9c5ed90b7d72ceadc30a6bb4f055975e5ef78d1625c662a927f0d9d86a99002fedb60a7c5d752f90adc118068ab1eaf809d7619d7ff3c605e31b1001d96dbf04c622a0192a59ba29369148789423ba5cff12c503c6693c4e515d7775250d1fa52d0d06c093c2226eeeb30281c01af7aa2c6e5de3ebed447b0327ed8c09460a78d700097a147d4b59df7d4ca448ff63f0a4e82f842528b750253309d41c74b0a8e3ab293a69a2ecfb589aa3351fcb9cee01fdf073590d5cc91bd86b44c0dd73ff8ac183a77029ab15adace35707b2e0bb94e02c8badae6860cf6e9d16b913b929a4b32b17872ac278653f7d65cb795c514f15a1944fc78095e9c6567f6cd5882e23e4f4e571a168721c8e70924c1a3d9616fc1f0dd3b05278243bf9aa920fa05b3a53660506f71d3fa0bdc8ff9a -Msg = a35926685561f09f30925e94d74e5661892a2ddd524f751f8321163d611ea1591a08e0dffd46b208e98815a306aa8514b4db859dc1fe7bdcdf50c095554bf8b2f4cb9f884d70e55c2143bc26199c2f94b743f5528dd54689ad69eda660749f5c1bea8becaea632a4bf0c79a577edfcea7baaa6861e9d7f2dd5b4c4f6eb5f3d5f -Sig = b1a9c45a264d2c9af441a7b2d330dd788089ccef205d5d666bfe864367be9738124e9d74648ad99160bd3af81a81858babe667a5d95c980fe2f6ac34861eb2ec9b4b4e8b642ef3820f56ca388a556530d42754c47212e9b2f25238a1ef5afe29be63408cf38caa2d23a78824ae0b925975d3e983558df6d2e9b1d34a18b1d973ffaccc745e527ce76c663e903719355e45cd6d118ed0b85b70cbb8e496411353f84f8866a01fadc819ca0ff95bbe2cc68c8cf78da5581becc96247b911d185ed1fae36c4cad26208eb80883f42a08123dac68d88f2f9893cde02ef5a57661db2b3e1e9269cbb0e15c407bcf55d92e679383c90802cd0bffd469646dcb60ca01a1dead43228934018391dd81f8b7e797e527fbe1815b91bf3cd6a1f2ffbf5dd166acd5526761ca8bab5d463fb9fb820659f5cd50f8150f12f7e8d52e77773c1e6480c2cc184d411d641f71a9dedc2c5fc2ec37a2770a9383bfbf6a489cf32b56a12cf99378e39b50bdadb9f0591b2065f9d44e511c9dfb6158fddddd1bc2cece6 -Result = Pass - -Digest = SHA512 -Key = 308206e40201000282018100dca98304b729e819b340e26cecb730aecbd8930e334c731493b180de970e6d3bc579f86c8d5d032f8cd33c4397ee7ffd019d51b0a7dbe4f52505a1a34ae35d23cfaaf594419d509f469b1369589f9c8616a7d698513bc1d423d70070d3d72b996c23abe68b22ccc39aabd16507124042c88d4da6a7451288ec87c9244be226aac02d1817682f80cc34c6eaf37ec84d247aaedebb56c3bbcaffb5cf42f61fe1b7f3fc89748e213973bf5f679d8b8b42a47ac4afd9e51e1d1214dfe1a7e1169080bd9ad91758f6c0f9b22ae40af6b41403d8f2d96db5a088daa5ef8683f86f501f7ad3f358b6337da55c6cfc003197420c1c75abdb7be1403ea4f3e64259f5c6da3325bb87d605b6e14b5350e6e1455c9d497d81046608e38795dc85aba406c9de1f4f9990d5153b98bbabbdcbd6bb18854312b2da48b411e838f26ae3109f104dfd1619f991824ec819861e5199f26bb9b3b299bfa9ec2fd691271b58a8adecbf0ff627b54336f3df7003d70e37d11ddbd930d9aba7e88ed401acb44092fd53d5020400eaf05d028201802d6db91eb32e36e5d5127deb034d14072fe60c1cd13c8c3dd9adbc87140b5e7136f4f89e61bbee7826f45ac1d99194fbaa8c5a0bb94db31d93723b51419d9c6f6eeb5f3610b67f4b4e2ade05cc6b8990e8832cf4cd40f2df0388c9a52072e27efebae20b4ad5951f4d20dd18943e58b786d8797652b2bb759c319d2b0046dbf69c53c075d00c287b876042fafa23fe4dd705e4e423277c9000311e94ea3f7456e32fd12afe4a2bde358a65824f1055064823c893fc93be3b8c658bb441d7f0b00ac246bf043a9c0053d319f003ef5a5533f74d630d8ce93bab416a82951e05b82c6036593eca89f0ebacd7d51ed9610af43537fcd266e5e47c0d25fedad6d047a1a1ee3eb444367e3eff7c7520ca4f779f2027fe45036204168454df4918b547a4d19e938f3c6db6ca2702ad9bbda1261c64d00b578285bdcfc9851f96a4f2cd14d66b9c1f65742a1344948c9f1da8d338ed4e3deb1ebadf11f8c281944e8849823496f86111f378bdd084c99f65fb9b4ee6271b1d1be424c294d185d9fd9cdf0281c100fa9977bca043a140e06158bc710f33918c7e503f1dd495b4f91920f6214d859f900c6a211849f566bc37417ec8a68f6874ce6160b34707a7341b1c00934e6ba3e60f63c3f4faf486be9780335b4eaee54ddd2f172a91b7a57a07905be685e49921e9d1af40e91b47be5bc1c0dfe3d10ad6b3b6aae0a43f82920c553b2e4932ff630297f2161918c684528373ed0af0d24b069ac4f511d8fd0301eff0365300a1f79e44d4ed21414940103aef3411568aae6f00b7c105453495c7cc6d3a76bcfb0281c100e16ae200e34b1638e158cf98278f3f62f75c97303be14265fbf11816941b366c4f95fdc3a7efe999d74b3919e6b10980ccd6e63e5ca118476b9144e59274c4a4c3f309e0497f9c8e21ce32eda4974cde4f28c66d46b6e63c2ce2bc8c629a974d4256d268dad6c7d5f80c3ad5ed4856d651ed619041acc611d5e2c30a7d11b60e5c665569fd9315120abc590c861e4ecb16df430d9056d517ff060947fe556acc7ba94273398339616f45ada042633bbb1df5e7cc313df660c02f11dc6dd0b96f0281c006d864e60c4be32d580088c14ee2d782fdccb15a5a4d35418f742cea6f410392183b1688d924e3efd42ee87ec26e0a93ab01973ca14955e55556f9ce7efbed1a1474b01e9dd592fb27b01bde028ae3b939c219aebb19d4474afe735e18e9398df62b0e166d7677f0fea0de612e3ce5bca3d5f0d8603356240c8b21f65a4c8dfeadaaddd410f488d430b91f8495b920439ccceab14d12b5eb6ac723a97a382e3efb2a88588bf8f1217d3c2b7d7da4ee64a0c9429a4e1927a8b8aa589353fce4390281c100c3d5f93ebec8efd817d633f1095c7d4d839061701bae2f39cb4d1607e0502ecd8bd58b562dac772906908e0bc63093aa3a1be5da2f6d16b3c593d803ddff8c126e4a8caf51820eb7cbead85a60dc8e46e80bf50bab1c9c5ed90b7d72ceadc30a6bb4f055975e5ef78d1625c662a927f0d9d86a99002fedb60a7c5d752f90adc118068ab1eaf809d7619d7ff3c605e31b1001d96dbf04c622a0192a59ba29369148789423ba5cff12c503c6693c4e515d7775250d1fa52d0d06c093c2226eeeb30281c01af7aa2c6e5de3ebed447b0327ed8c09460a78d700097a147d4b59df7d4ca448ff63f0a4e82f842528b750253309d41c74b0a8e3ab293a69a2ecfb589aa3351fcb9cee01fdf073590d5cc91bd86b44c0dd73ff8ac183a77029ab15adace35707b2e0bb94e02c8badae6860cf6e9d16b913b929a4b32b17872ac278653f7d65cb795c514f15a1944fc78095e9c6567f6cd5882e23e4f4e571a168721c8e70924c1a3d9616fc1f0dd3b05278243bf9aa920fa05b3a53660506f71d3fa0bdc8ff9a -Msg = 1271a0ddb99a0e1e9a501ca33c131b0a1c7820a397790869090fba373703ac38ea00a9a0ddeed199d97be1801ffab45206710a61e5ed894c3319012ded0ff414386e56b548ad915d80afcc2bdb976d7c8adddca7dfa28aeb694033a5612660c644e32f85c2805651d713660a38914d70f0e41fdc4b3d162ef3acd70659eef637 -Sig = bffd010b2ec4e4a32777b77619b87622f8921dab56e102c8d824fe52b5df7a203fe71799eeafdcc0c8872dba6a374407b5639aeb5a30a904712f15097dba0f2d62e845412395cf09540abd6e10c1a2e23dbf2fe1dfd2b02af4eea47515957fa3738b06411a551f8f8dc4b85ea7f5a3a1e26ccc4498bd64af8038c1da5cbd8e80b3cbacdef1a41ec5af205566c8dd80b2eadaf97dd0aa9833ba3fd0e4b673e2f8960b04eda76161643914242b961e74deae497caf005b00515d78492ec2c2deb60a57b9dce36e68dd82007d942ae7c023e1210f0be8a3eb3f004824074b8f725eaf8ac773e60fbbb7cba9630e88b69c8bcb2d74dbdb29bfff8b22545b80bb634e4c05f73e002a928efd5a6aa45621ce1b032a2244de48f4df4358156678cbe039c9ebe4cee945a25b9038469fe00c3092936a8cff9369045f906733a9d2ab3660182069b157ca8f9b99a71fc153c68301e97a38fc3a87ae2b6f03754e6da82d0b0726e0703979c9320289feefbcddcd9d706b71b51e9a1b9dc1412e6ed4b56676 -Result = Pass - -Digest = SHA512 -Key = 308206e40201000282018100dca98304b729e819b340e26cecb730aecbd8930e334c731493b180de970e6d3bc579f86c8d5d032f8cd33c4397ee7ffd019d51b0a7dbe4f52505a1a34ae35d23cfaaf594419d509f469b1369589f9c8616a7d698513bc1d423d70070d3d72b996c23abe68b22ccc39aabd16507124042c88d4da6a7451288ec87c9244be226aac02d1817682f80cc34c6eaf37ec84d247aaedebb56c3bbcaffb5cf42f61fe1b7f3fc89748e213973bf5f679d8b8b42a47ac4afd9e51e1d1214dfe1a7e1169080bd9ad91758f6c0f9b22ae40af6b41403d8f2d96db5a088daa5ef8683f86f501f7ad3f358b6337da55c6cfc003197420c1c75abdb7be1403ea4f3e64259f5c6da3325bb87d605b6e14b5350e6e1455c9d497d81046608e38795dc85aba406c9de1f4f9990d5153b98bbabbdcbd6bb18854312b2da48b411e838f26ae3109f104dfd1619f991824ec819861e5199f26bb9b3b299bfa9ec2fd691271b58a8adecbf0ff627b54336f3df7003d70e37d11ddbd930d9aba7e88ed401acb44092fd53d5020400eaf05d028201802d6db91eb32e36e5d5127deb034d14072fe60c1cd13c8c3dd9adbc87140b5e7136f4f89e61bbee7826f45ac1d99194fbaa8c5a0bb94db31d93723b51419d9c6f6eeb5f3610b67f4b4e2ade05cc6b8990e8832cf4cd40f2df0388c9a52072e27efebae20b4ad5951f4d20dd18943e58b786d8797652b2bb759c319d2b0046dbf69c53c075d00c287b876042fafa23fe4dd705e4e423277c9000311e94ea3f7456e32fd12afe4a2bde358a65824f1055064823c893fc93be3b8c658bb441d7f0b00ac246bf043a9c0053d319f003ef5a5533f74d630d8ce93bab416a82951e05b82c6036593eca89f0ebacd7d51ed9610af43537fcd266e5e47c0d25fedad6d047a1a1ee3eb444367e3eff7c7520ca4f779f2027fe45036204168454df4918b547a4d19e938f3c6db6ca2702ad9bbda1261c64d00b578285bdcfc9851f96a4f2cd14d66b9c1f65742a1344948c9f1da8d338ed4e3deb1ebadf11f8c281944e8849823496f86111f378bdd084c99f65fb9b4ee6271b1d1be424c294d185d9fd9cdf0281c100fa9977bca043a140e06158bc710f33918c7e503f1dd495b4f91920f6214d859f900c6a211849f566bc37417ec8a68f6874ce6160b34707a7341b1c00934e6ba3e60f63c3f4faf486be9780335b4eaee54ddd2f172a91b7a57a07905be685e49921e9d1af40e91b47be5bc1c0dfe3d10ad6b3b6aae0a43f82920c553b2e4932ff630297f2161918c684528373ed0af0d24b069ac4f511d8fd0301eff0365300a1f79e44d4ed21414940103aef3411568aae6f00b7c105453495c7cc6d3a76bcfb0281c100e16ae200e34b1638e158cf98278f3f62f75c97303be14265fbf11816941b366c4f95fdc3a7efe999d74b3919e6b10980ccd6e63e5ca118476b9144e59274c4a4c3f309e0497f9c8e21ce32eda4974cde4f28c66d46b6e63c2ce2bc8c629a974d4256d268dad6c7d5f80c3ad5ed4856d651ed619041acc611d5e2c30a7d11b60e5c665569fd9315120abc590c861e4ecb16df430d9056d517ff060947fe556acc7ba94273398339616f45ada042633bbb1df5e7cc313df660c02f11dc6dd0b96f0281c006d864e60c4be32d580088c14ee2d782fdccb15a5a4d35418f742cea6f410392183b1688d924e3efd42ee87ec26e0a93ab01973ca14955e55556f9ce7efbed1a1474b01e9dd592fb27b01bde028ae3b939c219aebb19d4474afe735e18e9398df62b0e166d7677f0fea0de612e3ce5bca3d5f0d8603356240c8b21f65a4c8dfeadaaddd410f488d430b91f8495b920439ccceab14d12b5eb6ac723a97a382e3efb2a88588bf8f1217d3c2b7d7da4ee64a0c9429a4e1927a8b8aa589353fce4390281c100c3d5f93ebec8efd817d633f1095c7d4d839061701bae2f39cb4d1607e0502ecd8bd58b562dac772906908e0bc63093aa3a1be5da2f6d16b3c593d803ddff8c126e4a8caf51820eb7cbead85a60dc8e46e80bf50bab1c9c5ed90b7d72ceadc30a6bb4f055975e5ef78d1625c662a927f0d9d86a99002fedb60a7c5d752f90adc118068ab1eaf809d7619d7ff3c605e31b1001d96dbf04c622a0192a59ba29369148789423ba5cff12c503c6693c4e515d7775250d1fa52d0d06c093c2226eeeb30281c01af7aa2c6e5de3ebed447b0327ed8c09460a78d700097a147d4b59df7d4ca448ff63f0a4e82f842528b750253309d41c74b0a8e3ab293a69a2ecfb589aa3351fcb9cee01fdf073590d5cc91bd86b44c0dd73ff8ac183a77029ab15adace35707b2e0bb94e02c8badae6860cf6e9d16b913b929a4b32b17872ac278653f7d65cb795c514f15a1944fc78095e9c6567f6cd5882e23e4f4e571a168721c8e70924c1a3d9616fc1f0dd3b05278243bf9aa920fa05b3a53660506f71d3fa0bdc8ff9a -Msg = f30c783b4eaeb465767fa1b96d0af52435d85fab912b6aba10efa5b946ed01e15d427a4ecd0ff9556773791798b66956ecc75288d1e9ba2a9ea94857d3132999a225b1ffaf844670156e7a3ea9f077fe8259a098b9ee759a6ddfb7d20a7acd1bcb9f67777e74615e8859ea56281fe5c400748f02d1a263b1867a3b51748ab70f -Sig = 345e2f60f7c82c89ef7dfd7dff2bc2348bab020479330899d4410213b35e98d9bac92fd8ae806b5bce8a6c4bd8275b0facb4dd13f9d68ba67141fa5085264da6dd685a6d212170a2c9cbf2cf5930180effc250868c984bf50ff69d6069ea28f5bc1b63705d0732416fd829a5f5d6217462c22a33fd4652f7c1d198794646c08406024e8163a7ebe39cfb514c5443897b5894dd19a213e037f27e0ffbd6c5447a805a54dfdf4f65819d4e0fbee25e3dac47fb6b636e8de6190adccbcee937d0977b35b973606b0ca348758b50cdbba028b73d0ef01c56014c031c598fe8db87d2ca4644770aaa0451c376ded82ff5c6b8e7d2ed9d1c8a17c3122c128273c60fd1b0088dfbc9c927f162e43879405964cb11ef7899123feb8f88dd2734df98aa696d936a8df07000e84af90101f7006a9bd2549fdd0ad3f9de093012d32d2afaa828017ee9c607cbf5b54f223666d4b5f3e26e0dfec003961b83d83de39ff6a0e81e1883c1db4aaaf082fec5aa30a7e578553d89774c67907790c96dc4f5be4c8c -Result = Pass - -Digest = SHA512 -Key = 308206e40201000282018100dca98304b729e819b340e26cecb730aecbd8930e334c731493b180de970e6d3bc579f86c8d5d032f8cd33c4397ee7ffd019d51b0a7dbe4f52505a1a34ae35d23cfaaf594419d509f469b1369589f9c8616a7d698513bc1d423d70070d3d72b996c23abe68b22ccc39aabd16507124042c88d4da6a7451288ec87c9244be226aac02d1817682f80cc34c6eaf37ec84d247aaedebb56c3bbcaffb5cf42f61fe1b7f3fc89748e213973bf5f679d8b8b42a47ac4afd9e51e1d1214dfe1a7e1169080bd9ad91758f6c0f9b22ae40af6b41403d8f2d96db5a088daa5ef8683f86f501f7ad3f358b6337da55c6cfc003197420c1c75abdb7be1403ea4f3e64259f5c6da3325bb87d605b6e14b5350e6e1455c9d497d81046608e38795dc85aba406c9de1f4f9990d5153b98bbabbdcbd6bb18854312b2da48b411e838f26ae3109f104dfd1619f991824ec819861e5199f26bb9b3b299bfa9ec2fd691271b58a8adecbf0ff627b54336f3df7003d70e37d11ddbd930d9aba7e88ed401acb44092fd53d5020400eaf05d028201802d6db91eb32e36e5d5127deb034d14072fe60c1cd13c8c3dd9adbc87140b5e7136f4f89e61bbee7826f45ac1d99194fbaa8c5a0bb94db31d93723b51419d9c6f6eeb5f3610b67f4b4e2ade05cc6b8990e8832cf4cd40f2df0388c9a52072e27efebae20b4ad5951f4d20dd18943e58b786d8797652b2bb759c319d2b0046dbf69c53c075d00c287b876042fafa23fe4dd705e4e423277c9000311e94ea3f7456e32fd12afe4a2bde358a65824f1055064823c893fc93be3b8c658bb441d7f0b00ac246bf043a9c0053d319f003ef5a5533f74d630d8ce93bab416a82951e05b82c6036593eca89f0ebacd7d51ed9610af43537fcd266e5e47c0d25fedad6d047a1a1ee3eb444367e3eff7c7520ca4f779f2027fe45036204168454df4918b547a4d19e938f3c6db6ca2702ad9bbda1261c64d00b578285bdcfc9851f96a4f2cd14d66b9c1f65742a1344948c9f1da8d338ed4e3deb1ebadf11f8c281944e8849823496f86111f378bdd084c99f65fb9b4ee6271b1d1be424c294d185d9fd9cdf0281c100fa9977bca043a140e06158bc710f33918c7e503f1dd495b4f91920f6214d859f900c6a211849f566bc37417ec8a68f6874ce6160b34707a7341b1c00934e6ba3e60f63c3f4faf486be9780335b4eaee54ddd2f172a91b7a57a07905be685e49921e9d1af40e91b47be5bc1c0dfe3d10ad6b3b6aae0a43f82920c553b2e4932ff630297f2161918c684528373ed0af0d24b069ac4f511d8fd0301eff0365300a1f79e44d4ed21414940103aef3411568aae6f00b7c105453495c7cc6d3a76bcfb0281c100e16ae200e34b1638e158cf98278f3f62f75c97303be14265fbf11816941b366c4f95fdc3a7efe999d74b3919e6b10980ccd6e63e5ca118476b9144e59274c4a4c3f309e0497f9c8e21ce32eda4974cde4f28c66d46b6e63c2ce2bc8c629a974d4256d268dad6c7d5f80c3ad5ed4856d651ed619041acc611d5e2c30a7d11b60e5c665569fd9315120abc590c861e4ecb16df430d9056d517ff060947fe556acc7ba94273398339616f45ada042633bbb1df5e7cc313df660c02f11dc6dd0b96f0281c006d864e60c4be32d580088c14ee2d782fdccb15a5a4d35418f742cea6f410392183b1688d924e3efd42ee87ec26e0a93ab01973ca14955e55556f9ce7efbed1a1474b01e9dd592fb27b01bde028ae3b939c219aebb19d4474afe735e18e9398df62b0e166d7677f0fea0de612e3ce5bca3d5f0d8603356240c8b21f65a4c8dfeadaaddd410f488d430b91f8495b920439ccceab14d12b5eb6ac723a97a382e3efb2a88588bf8f1217d3c2b7d7da4ee64a0c9429a4e1927a8b8aa589353fce4390281c100c3d5f93ebec8efd817d633f1095c7d4d839061701bae2f39cb4d1607e0502ecd8bd58b562dac772906908e0bc63093aa3a1be5da2f6d16b3c593d803ddff8c126e4a8caf51820eb7cbead85a60dc8e46e80bf50bab1c9c5ed90b7d72ceadc30a6bb4f055975e5ef78d1625c662a927f0d9d86a99002fedb60a7c5d752f90adc118068ab1eaf809d7619d7ff3c605e31b1001d96dbf04c622a0192a59ba29369148789423ba5cff12c503c6693c4e515d7775250d1fa52d0d06c093c2226eeeb30281c01af7aa2c6e5de3ebed447b0327ed8c09460a78d700097a147d4b59df7d4ca448ff63f0a4e82f842528b750253309d41c74b0a8e3ab293a69a2ecfb589aa3351fcb9cee01fdf073590d5cc91bd86b44c0dd73ff8ac183a77029ab15adace35707b2e0bb94e02c8badae6860cf6e9d16b913b929a4b32b17872ac278653f7d65cb795c514f15a1944fc78095e9c6567f6cd5882e23e4f4e571a168721c8e70924c1a3d9616fc1f0dd3b05278243bf9aa920fa05b3a53660506f71d3fa0bdc8ff9a -Msg = 132cf50c66ac4cc54339751a0ebb865e1d3d320562fc905c4abd1e78e464066c46c3a0c02db0371ee35a104d66dda864c6133e37cfad9116e883ebb73b295e7016c34ea9911a309272ef90114d8f59fff0a75193fe5ae31ed99121f9c59209bc4bd507b1dc12bc89b79ffe4d0df9209762a1730136290cdee58ec828ccc88eba -Sig = b12503b7b2f783618884174bcb9be10877960431ed6363c807e12db71b8b6bd9d6401d064e253740158e8b900152d37faf20333a7d80b3d47c7c7a3fa12091ce31cd8aae272a4da15fe2cb5cfdea541195a469c96bcf695e0b526dfa48a59003c6763af8136392c4b8d24db314746f42aca550acc65e074913ab82232eb8593509158a8ba34bc0f0e3125a834a3ed2d6a8cb1d085f234ae868b86aea8d6f82e13a08842485066e48aae4837873150f44475e12602b552dcb34d1f9fdaadbc6bff5134c6fc76263888be67efe63ee1840fa08c49938858a9d48b1058d18976bf2e3bfc625552f75b3ea44eb91dd366865f240a0c336a0110e0fa09d09cd94c70cbc8895ae3d44ae3dff545f0e8c8cc662ecd40f9099a952494396c6b423ebb463409969281cdd54ad87a308e487ce19745b30d5da76b98d2aa9a007a55783b3037e5b8662322810bdd11d86dc3f61451149391fb2f14ed9c17c751623a4042ce7edb875ee27bcd1f19d6dc9283ad06d15e097e2b0b15a7eb7128adbca0aa6adcc -Result = Pass - - -# Additional test vectors. - -# Invalid key, no version -Digest = SHA256 -Key = 308204a10282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201000997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8d33f10324c55956141891e45b84b49f59ea5bfac6ffa38900aca5099afcd02f6a8257c41ce5bb2e4153832b5c22f91eb389fa2035c3cf9b3374531c483cb30ceb007259b1d02818100d95c0995fabdfcbccfe63e0f3262f806869ab571e1793e97234cbb9bd4b6872a7695389955cf6ce7245345a5df8021f7d9519563afbc2667f5311fad093de2c02cd069109b630d68e3bf767f8a788a6add7ab199f2d8f6a40b7c1910d9dab52ac80d0d333aacab321a9309dc884ddd4db637a0c1115ae3c08efa683f99eb733102818100d4f7ef9f9be947ba9d1b3bce59e5608839a1e464553e1b6d113d0f636758bbb473a89f9949836ead40b6f314eee3ac2244d7b6f379e83f30e17783ad68d5086897889c051c26e1558a4a220bfc242995860644b5d7a3ef513ac612b9c6c0a2021bb6b9cde7dbd21fe5858746c79563e9bab7d06b43aab43a0a5cafab4519a6610281803db2386f174f2ea3ef4b6bd1601749ce2d6afa8be35f051178621f16a23ad36eba03c073136389241969e5b87edb0fcbcf1a0bd6e1aee97bae1f2d97aabe19b17dbe7d9492cdb68a0897f572350e846c669660dc978c5068da598524fca8a136358d3e5f8f6ad5cf78d9089c93f473189162ce0f8c4902a19902b633b3e6926d02818100ddc971183dcf3450c43e06ba2af32379eedeb2d678513fb706b75a006098154041f4b09e6be385d4b25d80ec241c899e4a986a17b0a121daab91a1e4fc5a1802a7074df3fb3f7661f0e1c97799e36d21de937cc4209585db30a56af0a228e001036ed792625e5368ce101574a2e9767f07338949f0afdf358cecd18c6d6f3f55 -Msg = 5af283b1b76ab2a695d794c23b35ca7371fc779e92ebf589e304c7f923d8cf976304c19818fcd89d6f07c8d8e08bf371068bdf28ae6ee83b2e02328af8c0e2f96e528e16f852f1fc5455e4772e288a68f159ca6bdcf902b858a1f94789b3163823e2d0717ff56689eec7d0e54d93f520d96e1eb04515abc70ae90578ff38d31b -Sig = 6b8be97d9e518a2ede746ff4a7d91a84a1fc665b52f154a927650db6e7348c69f8c8881f7bcf9b1a6d3366eed30c3aed4e93c203c43f5528a45de791895747ade9c5fa5eee81427edee02082147aa311712a6ad5fb1732e93b3d6cd23ffd46a0b3caf62a8b69957cc68ae39f9993c1a779599cdda949bdaababb77f248fcfeaa44059be5459fb9b899278e929528ee130facd53372ecbc42f3e8de2998425860406440f248d817432de687112e504d734028e6c5620fa282ca07647006cf0a2ff83e19a916554cc61810c2e855305db4e5cf893a6a96767365794556ff033359084d7e38a8456e68e21155b76151314a29875feee09557161cbc654541e89e42 -Result = Fail-Invalid-Key - -# Invalid key, version = -1 -Digest = SHA256 -Key = 308204a40201ff0282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201000997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8d33f10324c55956141891e45b84b49f59ea5bfac6ffa38900aca5099afcd02f6a8257c41ce5bb2e4153832b5c22f91eb389fa2035c3cf9b3374531c483cb30ceb007259b1d02818100d95c0995fabdfcbccfe63e0f3262f806869ab571e1793e97234cbb9bd4b6872a7695389955cf6ce7245345a5df8021f7d9519563afbc2667f5311fad093de2c02cd069109b630d68e3bf767f8a788a6add7ab199f2d8f6a40b7c1910d9dab52ac80d0d333aacab321a9309dc884ddd4db637a0c1115ae3c08efa683f99eb733102818100d4f7ef9f9be947ba9d1b3bce59e5608839a1e464553e1b6d113d0f636758bbb473a89f9949836ead40b6f314eee3ac2244d7b6f379e83f30e17783ad68d5086897889c051c26e1558a4a220bfc242995860644b5d7a3ef513ac612b9c6c0a2021bb6b9cde7dbd21fe5858746c79563e9bab7d06b43aab43a0a5cafab4519a6610281803db2386f174f2ea3ef4b6bd1601749ce2d6afa8be35f051178621f16a23ad36eba03c073136389241969e5b87edb0fcbcf1a0bd6e1aee97bae1f2d97aabe19b17dbe7d9492cdb68a0897f572350e846c669660dc978c5068da598524fca8a136358d3e5f8f6ad5cf78d9089c93f473189162ce0f8c4902a19902b633b3e6926d02818100ddc971183dcf3450c43e06ba2af32379eedeb2d678513fb706b75a006098154041f4b09e6be385d4b25d80ec241c899e4a986a17b0a121daab91a1e4fc5a1802a7074df3fb3f7661f0e1c97799e36d21de937cc4209585db30a56af0a228e001036ed792625e5368ce101574a2e9767f07338949f0afdf358cecd18c6d6f3f55 -Msg = 5af283b1b76ab2a695d794c23b35ca7371fc779e92ebf589e304c7f923d8cf976304c19818fcd89d6f07c8d8e08bf371068bdf28ae6ee83b2e02328af8c0e2f96e528e16f852f1fc5455e4772e288a68f159ca6bdcf902b858a1f94789b3163823e2d0717ff56689eec7d0e54d93f520d96e1eb04515abc70ae90578ff38d31b -Sig = 6b8be97d9e518a2ede746ff4a7d91a84a1fc665b52f154a927650db6e7348c69f8c8881f7bcf9b1a6d3366eed30c3aed4e93c203c43f5528a45de791895747ade9c5fa5eee81427edee02082147aa311712a6ad5fb1732e93b3d6cd23ffd46a0b3caf62a8b69957cc68ae39f9993c1a779599cdda949bdaababb77f248fcfeaa44059be5459fb9b899278e929528ee130facd53372ecbc42f3e8de2998425860406440f248d817432de687112e504d734028e6c5620fa282ca07647006cf0a2ff83e19a916554cc61810c2e855305db4e5cf893a6a96767365794556ff033359084d7e38a8456e68e21155b76151314a29875feee09557161cbc654541e89e42 -Result = Fail-Invalid-Key - -# Invalid key, version = 1 -Digest = SHA256 -Key = 308204a40201010282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201000997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8d33f10324c55956141891e45b84b49f59ea5bfac6ffa38900aca5099afcd02f6a8257c41ce5bb2e4153832b5c22f91eb389fa2035c3cf9b3374531c483cb30ceb007259b1d02818100d95c0995fabdfcbccfe63e0f3262f806869ab571e1793e97234cbb9bd4b6872a7695389955cf6ce7245345a5df8021f7d9519563afbc2667f5311fad093de2c02cd069109b630d68e3bf767f8a788a6add7ab199f2d8f6a40b7c1910d9dab52ac80d0d333aacab321a9309dc884ddd4db637a0c1115ae3c08efa683f99eb733102818100d4f7ef9f9be947ba9d1b3bce59e5608839a1e464553e1b6d113d0f636758bbb473a89f9949836ead40b6f314eee3ac2244d7b6f379e83f30e17783ad68d5086897889c051c26e1558a4a220bfc242995860644b5d7a3ef513ac612b9c6c0a2021bb6b9cde7dbd21fe5858746c79563e9bab7d06b43aab43a0a5cafab4519a6610281803db2386f174f2ea3ef4b6bd1601749ce2d6afa8be35f051178621f16a23ad36eba03c073136389241969e5b87edb0fcbcf1a0bd6e1aee97bae1f2d97aabe19b17dbe7d9492cdb68a0897f572350e846c669660dc978c5068da598524fca8a136358d3e5f8f6ad5cf78d9089c93f473189162ce0f8c4902a19902b633b3e6926d02818100ddc971183dcf3450c43e06ba2af32379eedeb2d678513fb706b75a006098154041f4b09e6be385d4b25d80ec241c899e4a986a17b0a121daab91a1e4fc5a1802a7074df3fb3f7661f0e1c97799e36d21de937cc4209585db30a56af0a228e001036ed792625e5368ce101574a2e9767f07338949f0afdf358cecd18c6d6f3f55 -Msg = 5af283b1b76ab2a695d794c23b35ca7371fc779e92ebf589e304c7f923d8cf976304c19818fcd89d6f07c8d8e08bf371068bdf28ae6ee83b2e02328af8c0e2f96e528e16f852f1fc5455e4772e288a68f159ca6bdcf902b858a1f94789b3163823e2d0717ff56689eec7d0e54d93f520d96e1eb04515abc70ae90578ff38d31b -Sig = 6b8be97d9e518a2ede746ff4a7d91a84a1fc665b52f154a927650db6e7348c69f8c8881f7bcf9b1a6d3366eed30c3aed4e93c203c43f5528a45de791895747ade9c5fa5eee81427edee02082147aa311712a6ad5fb1732e93b3d6cd23ffd46a0b3caf62a8b69957cc68ae39f9993c1a779599cdda949bdaababb77f248fcfeaa44059be5459fb9b899278e929528ee130facd53372ecbc42f3e8de2998425860406440f248d817432de687112e504d734028e6c5620fa282ca07647006cf0a2ff83e19a916554cc61810c2e855305db4e5cf893a6a96767365794556ff033359084d7e38a8456e68e21155b76151314a29875feee09557161cbc654541e89e42 -Result = Fail-Invalid-Key - -# Invalid key, version = 2 -Digest = SHA256 -Key = 308204a40201020282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201000997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8d33f10324c55956141891e45b84b49f59ea5bfac6ffa38900aca5099afcd02f6a8257c41ce5bb2e4153832b5c22f91eb389fa2035c3cf9b3374531c483cb30ceb007259b1d02818100d95c0995fabdfcbccfe63e0f3262f806869ab571e1793e97234cbb9bd4b6872a7695389955cf6ce7245345a5df8021f7d9519563afbc2667f5311fad093de2c02cd069109b630d68e3bf767f8a788a6add7ab199f2d8f6a40b7c1910d9dab52ac80d0d333aacab321a9309dc884ddd4db637a0c1115ae3c08efa683f99eb733102818100d4f7ef9f9be947ba9d1b3bce59e5608839a1e464553e1b6d113d0f636758bbb473a89f9949836ead40b6f314eee3ac2244d7b6f379e83f30e17783ad68d5086897889c051c26e1558a4a220bfc242995860644b5d7a3ef513ac612b9c6c0a2021bb6b9cde7dbd21fe5858746c79563e9bab7d06b43aab43a0a5cafab4519a6610281803db2386f174f2ea3ef4b6bd1601749ce2d6afa8be35f051178621f16a23ad36eba03c073136389241969e5b87edb0fcbcf1a0bd6e1aee97bae1f2d97aabe19b17dbe7d9492cdb68a0897f572350e846c669660dc978c5068da598524fca8a136358d3e5f8f6ad5cf78d9089c93f473189162ce0f8c4902a19902b633b3e6926d02818100ddc971183dcf3450c43e06ba2af32379eedeb2d678513fb706b75a006098154041f4b09e6be385d4b25d80ec241c899e4a986a17b0a121daab91a1e4fc5a1802a7074df3fb3f7661f0e1c97799e36d21de937cc4209585db30a56af0a228e001036ed792625e5368ce101574a2e9767f07338949f0afdf358cecd18c6d6f3f55 -Msg = 5af283b1b76ab2a695d794c23b35ca7371fc779e92ebf589e304c7f923d8cf976304c19818fcd89d6f07c8d8e08bf371068bdf28ae6ee83b2e02328af8c0e2f96e528e16f852f1fc5455e4772e288a68f159ca6bdcf902b858a1f94789b3163823e2d0717ff56689eec7d0e54d93f520d96e1eb04515abc70ae90578ff38d31b -Sig = 6b8be97d9e518a2ede746ff4a7d91a84a1fc665b52f154a927650db6e7348c69f8c8881f7bcf9b1a6d3366eed30c3aed4e93c203c43f5528a45de791895747ade9c5fa5eee81427edee02082147aa311712a6ad5fb1732e93b3d6cd23ffd46a0b3caf62a8b69957cc68ae39f9993c1a779599cdda949bdaababb77f248fcfeaa44059be5459fb9b899278e929528ee130facd53372ecbc42f3e8de2998425860406440f248d817432de687112e504d734028e6c5620fa282ca07647006cf0a2ff83e19a916554cc61810c2e855305db4e5cf893a6a96767365794556ff033359084d7e38a8456e68e21155b76151314a29875feee09557161cbc654541e89e42 -Result = Fail-Invalid-Key - -# 2048-bit key with p < q -Digest = SHA256 -Key = 308204a30201000282010100a0afb85b74105f49f6836183d67b92602b53ad0d7a65f32a21d8959b8722aae1ec000cb9f22de09b794d7446e04be02a782615a659ceddb5f3344b6e566970718124dc8b8bf23c5aaa7447b7f11905f828e91f1a844d535624b987704ecca430d04cfee0deef46e7e2da65a3f2a1b3aae6cdf96795d24073a07312867aeb414e0bd6c23d80bd9ce6266fd90dac7666b019c141e3516ed51ced0d62a0b1db189860406ec5b7bbbeb49031979dba118ef6ad131365d6bd6994e695ab084592a5d2470341e4a9da14167a1387ec3d513687b7d849d64da896d4038f72f8a8a516c6402225a53eb813c1eb0e675af8880433545a90404946d7d8db2716fdd63898650203010001028201007df2de1548f720499020d0c98ecf931f3036c938fc4c76f9fa479294b2aa98b8b6cc1f2d8cc72afb926c048d1d783bbfee2723e71d13c9b2b96baf0850511b22ccb040f25c82458e6776f7541575a0b9300ff2224dbb726bde235226d48d10d1762433cfbcce5e8c99c2c7d266f71a2605fd42d54f98da8e0720cb4f7f7f70d2668b89cb57fde159ac7922756fd161379a5693168c388b7e1468552f67f896f69740e80e13b9badee87b7116e559c1e428276cc9d4788b0ee25f10ed560daa8339aeb52d8bb2b05a2e1e16e3fb348ae5feb5dbaf53a7d8a318865e1a746374df077d85120b02e3f0ceba47cc734c96ed6dac65f11bde2db2f1ffaec0da5924c102818100c045a3996d1465c73ca839c442b1026c82e418c68a5f96b34ff36557144a86af092b8c2873c42ac08d66e2f471c4094098be48058ed2bb0ebf0beb896f0eb18eea16d475914c901e35dffbcc257f19260819213c46eac7e508aae0114b98770471949f006d42a6c2e07d590e1f5f14747239154f65155daa4bea84f5ee8d2c7102818100d5f20732ea986dd3d1245dce180595a7f48b36c58f1576f6782062a4f1790871bfb2e31b96f1b596c59b6624cc2b56c441e4970fffe70e59c0fca099b598170106a60e32725c35401271ba2216039c627b18a2e319331c1444238724ba7c80e2f35d13fc0662638b414f7c12fe66db22328fa892a4b7632ea2c24f6b06fb3535028180448f5073e0127aec5d73bb0d819e6eb7d4c0931910b45f1f576df9ffe00b67153916df26798944995e92867115b40a7c8f3aa2a1e0b8c1dcd340e3df20cbc382ab7432942d9878775d4c9e13c0771eb79201abf93b6c7294f7cf3e90cc3cf48b9018a7cdd6280320d03dc228a805165d2371b9689329d83966529cd0b91c7bf1028181009f1bbed4d3f9067ca7a63709057e69bd1db5c6c707d13bc6b2b1cb0ac5f6701c4027a694a71e1d2102d6be1111b20d762956fa2d50f0221107e01904173403afa4a52c1bc246e6e73e904b8ffbf535815bf0877b030baa8f3bd97c31096b7c62cc0065d361601c8dbcc5830d911b274ef8713439d2bbfbcbfc092c0cf9852b1d02818058e7d95fe1a95fe10f60b59eba5c8c28c8eeaa82956a3035f37e7570f5ff91a104a5df77ba13a09bedb22018e2ac7461471b5e719ab202032cb3905391b7d15c74b36aff25c83987726e0ef1362c1b8f4f8282f2c4fd6a38a9a15e63400b92bfff31cbfc375313dc40f9cf19e031ededd32c47de6b3a99696a903638c4d6969a -Msg = 5af283b1b76ab2a695d794c23b35ca7371fc779e92ebf589e304c7f923d8cf976304c19818fcd89d6f07c8d8e08bf371068bdf28ae6ee83b2e02328af8c0e2f96e528e16f852f1fc5455e4772e288a68f159ca6bdcf902b858a1f94789b3163823e2d0717ff56689eec7d0e54d93f520d96e1eb04515abc70ae90578ff38d31b -Sig = 912209edbd684deaca5855ea6cc89ba16753caca12df2e18f56228f0c2ccaa3bb5e45aa2107dbe2cb5b5c3e1af159c858aa9f665df4433e5b8df78452da436310beded396ce5ab4fc3882ed72ccb1a2a9226ea4177deb2d341ae88aba789106cee2b25ad4049c47a46d05c94ebd39416674adfef4a212cf139a5283b8ec51d54c21461e302cdcbd8ce9f7659b7d88195912d706cfe30f68ca8419054e22f0be31f86e49135b86e3021dd43baec6a0cd24042d81f71f8a1e23079e6ab1f8cd7b3fec2882e93f6e724d3dec5a2e7883c56b8d9773036f116325bc6cb934968a780b66251e4583fde426e63951b8dc380ae29751ba5cfba759c4f192bc373775d44 -Result = Pass - -# 4096-bit key with p < q -Digest = SHA512 -Key = 308209270201000282020100cefe6a02d3b9919783aacc1e555888b6aecc45c76bf28f0efc673a4576d44db983f5669fa28bf31966d1124d01c0f1e9976796a4f7855115f74b59f65aa17d3e56b3a265ef91463a562fd2e770077cf7a0cfc4d0903c812622a141076046bd2b334e2072e21b9cd9d949cbaa010d73fc7c1f5337431a18fc93930509c713ee4e773818134912d7cfbaab4b57038d645cca237b2fc367f76b26200894e174d3c4265f58765ca0e81e2525db528afabc5d149e60ae2aae8e313138b27c4bc901f9612728ab7a32564d3d93aff6ba0033c9e8db84cbc1a2f0de32a275318836c07f07c51cf5ed43c5c727a4e2541a78c91e6a7609edf4c1c0cdfc59fd63621223ff297f63096f876cfa93449994597ef27e47371ae5c3ad575b6fda18fcbc314eda54411aaec457d52e1a44da6ea0d6f43ace949f6a6e9d5a917edca6cb38b217e9bef4279b8b98dcd603ca299dc3173fdb3978fa6926e8a0dacd58162e9337b9c5af7f7260b2c4f4cde6bc7a71f1a56974b72c721c57eb925860562b744d32a65cd2577e70e8e00cfc528d54186bfd6c3fb84a081ee7f5c8a8ff388296f021ca13b99e5ca6e773adfb6a6b7206a23078cdcfb57db1f1cd7d21e283bbd8a7c1e8d2eef46008ad2fd440d6959ed18bb84831d872d79e1ac4260caf481faa9bba227e15a1b61bff8249c9b60d44056118969242b004059f85c0125b1fbc47cfd4772f020301000102820200607f0a3cb727535026f9809ec37aba812f8bdb1bd49f07421d38a259afc3d9581ac4544b2723c6f8988deed22777234f9a5d9844df7f2f05e67b223d4e92ea281d9330aa04bcdcd8654576349e6d5f3cb1a32a457078445cdad801d0c67933c6e7ec0c0482940cd32210dcf92bf47195cae76f8bdba456f1a87a6966dd7fd5208f437f35be6322689cc52e222a6dc7d3da08206d6bd313ecc7a1375ef09bddfd1b46679f061f9d16308b2d6b958ebe3146636efec2b70d62b167950d8ce6f01ca9c5ef97c127a643ebe8e5a7479ec085e8202e102efd1efcf6edf56459f3ec594bee004a4589cab1c53180b16485da7c6b750bbbfad63863ceb8c4ff87c09d368761e95315c1187aa04e86a33144803b14f50b5659a5af214e3338bce3801b06cea9887a10cc17d826429f45dac630bffb0fddee5aec3bd8b85202d4b33e8aed30b9366eda3380feefbc243333ed5d013e7e91cdcd9ca9e5b8b269046e190aea052b62d59394881b0682dbe1c3c075cf9a58bf1a0b3fb87093a18337f8eed96502c24e92176e02d627e468e9d539f5c57e95c0c278e84f75f0bfe57044f94a9f29fc9752f9d625813e46905a3f863d95dc55d43c9cecea0b21624ae92911f270bde30f8174327abb33f4467e7eeb19b58fd6ffcbd4e9a9c24d8443550605a5bc1c47824f9e3da734e3b3999b40fb0cfd9391648ea4ea7a42cc822d384f3e28410282010100d36b7085d0e46e43171c196feb4fb4a620afb13165df1d4704840ddbfda6f5e0211a09ac4ca93a50d1fc4b9a1a6b3cce695240f150f4fc40749381640e03d6443c2e927e76961c95011a20ffe96c0202572e211e0f6ecd30a77d55e15b7d71fc0d2aa8d440212197d13d5449400ae65eae7c464fb5e019fc61f403249fd3c97fabece326d47e4246ed5f8f4a6cc7ef2074807397f25b3eb25c88fa8e394b1d5f25dff6dc7facaa2c4ff4e90b60c5b56841f335d0db13f1bfc2b3a84362f14861245e3010e4816c6261d7b29fa8ebc638eb8cb68bfdca48c426a56ae8fbda8a2db20727b1e372b7f11f56efc2d7e5aaea2d7c0f6b10872c0a3b4a7fcb788ab93d0282010100faa41019d952a30d1472b7185d7eee7aff729027383baf87ce4e691b8c16edbbb5ee7f621d006150761c6757f5cbd00a3a17534b1fb6ca777b7b6507421d7adc94e258c87b15288988cb9e4eaed4759041f34d05eb14468a26b98e2ba435697acd6366884e16d2bee912445a2ad91ba73a058f2fb03db6d4f460c2688303f23712ea5c601551d1a5267b2f782494eb43287a490bbd0118c247dfad2b487d1f20989b0f636ebd4cf28843de937d34e48b35d8eee7d9718f342d825955f4c04ee8d6f4b9e26fb1f7acba75f9b65d85fbc428408f623ed94c1f83f48bec1cbbe6dcbd65e1466052d350f4c17aadf7f3b9a4fe9f12d5dee380f3386478cb784800db028201001f5a649283bb0c9b0877535264ac2a5724abc97450ee38924a9a26d0041ad985c682ed024f501d64d4ef3c6afb16022b7e35038a85fdfed6b43317d235bdddedba9b11808da78f4f8d9d495d8a494936fda4caa6819565fa9c2c1b2b537d140554128a7d0791a240b87806e2e20b7bc478cdd74384ee5a0c329e9444bf2b124bcbbc52a77485d0e061dd750b8d7c4cfb1c2bdc78a12964efe08733d919a809100e36db8e31a4f28ba5c3e53799bf583ac0e5078b14a22d8cc99c090d0d4448fe96fd1cd5b47d790c520441ea298be596956005c656f9c3b6cb2066ed6c44298fc3420a61f820102543078a80f3b18c9a33ea9d02bcadbf1b3955c003f5b964e50282010070f1554010aa2847509b90de2de370db8418bfd4ac8658c6bdb49fb086241ee4a34ae1a3f8a59f347ec4b5dcf129f289693bf190bcadc5f6a97225486c0694c2a96485d571814b4f0e9192b8aa179b1272658ca3ca16cce29c28a964090ef88519e05ce7b72899b6e59811acfff9ed7821b137a0a9ae65a0f8ae516c7efd5c3c6d0da6aab570b523d27f5818af835bb05ba11f2166fe0386289526978686bb6c18d866cacbb009e89076e4e95956685642e18a667799b08a36a7b2520584530aa1328e40f74c1eeb7aea86a822e4a95aef388864212612237176d546847c37bfe8a8ec26a6692c4822c2bce1800617f5bdb738e99f12ad9cec207a3e55e93c590282010037217ba957fea90049c4cbe3b410b44250541ec5e846008a3f80620e7674d56265e22b8c724816d90bd9c111c003c3f2b11f5c56c3205ca47f61e036a7319d6019e06aa18d7e070cb04c7cfc7a66f1f736ef121e970b7a4f6d4f7c3924f135fc01d7cdeba27ea1bb7aecfedf05dcfd2f5311d3f0f458dd4eb3c48ca45ddf5ac2dd6c7ca3367ec8346c8f5e124be3262989aba3bb28012606b8727de275e7c9b5f86eadbb8b6f6acd583fb61ececedf15b02ce6539385f5df185c6e973a336a036506a7499d1e08b3071bb40eb71d166e748c3419642496ca46efe09c1fa0aa77e0a5adeec50536b4ef112a0782a9182661aeb568ced30b24833e7d4199f78f74 -Msg = 5af283b1b76ab2a695d794c23b35ca7371fc779e92ebf589e304c7f923d8cf976304c19818fcd89d6f07c8d8e08bf371068bdf28ae6ee83b2e02328af8c0e2f96e528e16f852f1fc5455e4772e288a68f159ca6bdcf902b858a1f94789b3163823e2d0717ff56689eec7d0e54d93f520d96e1eb04515abc70ae90578ff38d31b -Sig = 98a95ccad59ccd39b1da810b53c9c0ce7b4b0acd65c0ffb788c88c856ea3ecabbe7015d4bf36b7c3de7c4c7c18063428afc567b94d4396048cea1a3b56544928e28b15360f9f5be7e700eb3b4d64b47061df1c0e096015bdf1329ef7a8a507ef56fa9330df4b1f3f097968839a60d1a6f1bb5b247032dc60b2889085d1dea210cff53c444b3f614d051cb41d8f171df025712bf57497f57e3c3e424685a8858f431a90d689dc1f7b41f868f0e1a6ef612710f365ff2bf90f2db89d61d9ab9fffac16581daec6ae1ab9f49c8dfd33a55f7b1e431fdd413649070e0a915f25363d3ddc2091fbfbf0fbeafe49753038dfce6973458af66a3d318eb7caa44d3fea95c46f40976398299db270e04dd20e77360013fcca04874307590429b13301be5f47a9681af6a47e5eaa53dc7ea05cadeef4ac96bc2c8e14ec9d0966e035898525c92fe7f0bc3a8996246f42da5dc0fb14cd856fe5bc51c031b3d83870ae89e9cdb1cbb2605b3f8bf4a978435c80a0e99a1a60b4e1a45d77458ec39fbf0a65b9b5891738ddc44edede2614d96e62303f0138051ab899e67bdce065ac5ec8edc6b591220b2522f8f4920bd9b7d4084b30d9a79cc658de0260b6e76acd7efe0d5c38e7856a7dc22bfbe287fdf88ca393f6c575cc1db8f0d8e47b0456e5a392f27e9f2b0352da61e58d1c1ba23b32de9f82ed35cd862644d63ea6a3f09b3642347ce6 -Result = Pass - -# [mod = 4096] - -Digest = SHA256 -Key = 3082092a0201000282020100b8069f9b94c0075d7448921fde91f517219051eff1d2a7330bb8ca0e848916454a03ea915c754aac3f88da52274f22926c0ff259813bd8cb298ab2d15e9dcaf8db9e612907a73200670207211dae05696f9a9a49280060bfd56a5885a349516a0c8f98e7a46d25248e7a296bc47b058a5b9737cb733f928a104203fb863714c8160557278735eb4ded185199eb1be80a5cd4d8e0264ffbf5f3413051e81ef61d7919df435f28fa6de30ac99a3bdd8660c791ad476dfa080a144fa0c75180700e03c8e1a903298f0c6cb8857fa9c0f5a61cd481b2666316d0c067946622f9b6f9b736ff3cc601c2896c84ec382840ea814b63cd0889373c090f35ebac034592829cc8b71520aa8d84eca21421c91f259a457d71d03d33b96f746952b02f42d730e28920cceed93b2115f4610ba8f0d26e662ef47e11cd2f7ef7f7e9ef26eff09122a2ba34c7348b5f1b5a17099d46c0c1a291cbfae64652ceb78b3d2fd738437f436a0b481725566067040adb98d12841fb142c22774ee2f03d6760edd8f373633a13c39548681b0106411c19693a95fde7273a42aa6a47665a55fd101bc3881f4b8390187b8f2f9358e94fc7d756de376d7fae0d467a2daeb28bd04039c8479c9428dc6417d06ae5fe9f76cd6ffd99b7ce118da237c4002aa945fd3128d92b62f66fc8aa8b9d659e97d03fef1aaeab2c5516fd55a5ccb7382a9296ddcf55895502030100010282020100879ffa0983bb72b2217d4a944a486fc5386b50b7f2153a3c98aafbdf6f36493f8fa90b3b4e54f34fb71379338adcfbb1c60a8aa60464c30617fbac8639a13971e709f6b972767a9769534945d2c5ea1f26ad5e8004072346be56be1edf94ad77e701fdc2da9fc5fc073569498f68cb5088e80daad7a946aa9208d53e8e5011f4d4a5e2f1b2e8be1e945a93e948292cfe56245821fa9a802b67b7e790b5edfb9d051f583822ede483100d673f5057972dc4674cb99407eddcdfd33fbf2605ee8fa5a26b0d50d35425e80aa5f8cc76f59413335ad2cc3ac319de73781f3e2fa3f6ae5cce07503703d49c31ea9608b4af1fd31c1e83e7fcd936240bad40fcb84d9ccc82141f83d43f41f6aa5cc3248b0cab9750478d370c4ebb219ac6e6619e80eb0e35562ec65d98a5a9f7acc105787406cda54eaefc9f93bdbc70d32da626df775ae3fcb02d468d0bde8d012361799956b347610dd4a4220d5ba4f8dd44c6a4c6a1cc2cbed643c775116b36d2795e33cfb75f29f644fe49e53609450aa34867fabb5306dd258204370376de470e7484dd72d7b0955c4b003016c3431bb0391716c8830a9b739f7b224a1fd90d6ec0a719f1bbb6354ad5cc34e22bed8ed54d5ebc6648778979d6b20c6167c319201d61dc1eb556654f732a75d3996ea9046c1bfadf2bcc1de6c00e254f0d87639262213b58f4f49771e65cdfacd900ac1256c8810282010100e96016489e0f3e0f21f3b63383d74b4ca597f77391ac19885921a9f55b9893b38381f1906a7b4e5c328b998f681a7d7ec362d1022eaa0c0ea4fd9017716538eed39c864e1e6941f7c47b5a594b5fcf7c874edc0d9fa74b25d875d9cfab9aa21cfdb7e5aa8dc4fbb67bdd681f7e1b1c73083df4da1a842a32e3cbf2dc94e20a9a09aa8f9db62564a7f544f6f58666b49831036dad02009f3f310af7cf2eb89f238fce322692db963b1362bbd055170cc51f5726d2111983818abfb96b988e1081fa881f658867b5414ff4f833eae5d28975ad3580256e28c5fbceb1daa78278058289c7f97632bab0494a2cc750c9cd58aec851ec97a7c762c947a1b5441acdc90282010100c9ddc7d236a5374cf84db722c7357c8499329766325678bf7023000cc3e87eedb811c8696ae1ac0c00d435eab2a2adbaa56cfccfe37becf217eb889939276203655f96710c466e16e7d0c4723ae4defe4570aa6726834385dc1fd0f8d99c850d84d6995043cd77377e3835bb7d0ee47dec605feac42f73e1cb6bd6c76118d561902a6fdbc66b4813b2ed979271c97ee349191317ce1b1af067b633b5cf45c4699e86c5b047d5d84d486b3bb8e1f053903c881a158773694f106dfaea68b9e2ed5f934ef915452806d2e5bf887a858636b772e1d6f282a659ba20770513e4df0b4dd42d34580fcbd3cca1e608c32f7ed6d6e0759f2af25643dea0e5d3113ef52d02820101009d53c691fbe440ad08f17852303e32a820365b7e50a519ad5e912037a5212de965ed73012d97a4d2e8cc4da06cc8f6f33f1addd63fc92949b216b24deb8716a3828ad1cbd61a957b47bcf4c29fda9e50d012ecac4e860456262004cf485b7d9057c6e29060f47bd0a09e393489da130ac572a71f65a2d5a3eb07b1d8dc91aa1e000838bb5470cef39f9877783bbbff615e21768d9c7cf8de2bdcbe04b0f58b6af8e643ced7502b6df5faa8aca0c0623e7d8b4e436d7daab6e8e7a9438cdbb0eb3f0f0743767a9ba9c5125b44fcc52472c09f1d231f98acea13805b4c1183161078d913b3ebe7f50d24cb5976a0d2fa991f73322f72698c33df8767cf807325690282010100b34d05a6a718fad4a81c475561c21556a5c87507b6206e620415627ef427f74de8d80abdefcc8107ac58d18724a230537f8a1dc7fd53deb36e21ac1404db0148e8eb0d725e27d4b30db6b6368c2f2c0e87d939d22338266aa889ae10cb2126614aa35e4c17dd514dfe13a94e5e173346d2050c4d3772baa84d09fd1cdd16b4b952d70ec2142cc8398f0d503b284c84231793690d14e9a874ee79bcd679438be11088bee103fd6281ca984cd4bc02be06786d9f558e1929e9ab3b34caaeb8a5629828fcd56b5a20e266c2e0ec357f9225d9adf600f928a8df3bde8838ff61a3e7a37a99a84babc42cdd2ed466e60fb2c6dad74642596024d565d25e30aab9d40502820100736f2d8187bccbb042c3ad4f44be780e038673088c5347f452332ecfae5d65bdc44854e3fc6d41f787765d65891d9c36586bcdfd044b0b1f99471ec1ed095eda5027078c0810c150e4499d6b9073bf4a0274a6b19029d752b400c63ecae83bbbdf1c6747f4718f583c3d3c04c4351bf11a9e9df0a5b28ce704132994df8abb73d7c3c4dfc06f0f24735a1dfac76420fd594b3db0046602dec3c6db7d4503aa3016b9ab1128173c13aec99d77b49902df6d5016d634397ee4e5810486e8ffd9cc79106a046154791038c002c622e2f6303ba52178a3abba955f4cfe75a446f7779b5b57a9858dbf228dce49ff3b0c62597178cb0c43a848e47242f019c5ca673b -Msg = 5af283b1b76ab2a695d794c23b35ca7371fc779e92ebf589e304c7f923d8cf976304c19818fcd89d6f07c8d8e08bf371068bdf28ae6ee83b2e02328af8c0e2f96e528e16f852f1fc5455e4772e288a68f159ca6bdcf902b858a1f94789b3163823e2d0717ff56689eec7d0e54d93f520d96e1eb04515abc70ae90578ff38d31b -Sig = 782a4da593daba94dfbf323458d4e1ff250f38689db3f699778d2ba9ebd3e327d636cab93b5f77cf333f9219cc8b9295a3115cc7b406b889f1a301a4757811b17b1a7004b44f25b987a1bf7c3c299f550c4cf41a9a27678137358ab02b8956e045f9cbed8c00aaba672e6b6b279277f97cd0563f51ca495957083ce9c0fe1c33dd254dde9d610df566ced993f6a23000538f8b5ede07db291657ff1dc72c2b919877c64655d0d6f7a08c5692fee15ec4b4658c2e7414be9fc3834d0b47209e9120a5eb5c4ad6d5a9b598b163eddc7555888069ca9dc431b2b67ce18201323f0c20895015fef02d8d1e25a7115552292ddaee50eb658f3bee98ce423c788699b9d37d2da690b8671249b204a5b263ab079c9596396cebbbd04285b98b6b8ea03ef066a2e2a7b0e77b40682540d94decf311d3b49e1d0af607756888fc3ba7ffe05e03c24afa0c855729c30abe93c0acbf5e9166b40eec18c316a01d2409c7c83bf7cd8e57f2d7c8854dea49b704c4bf9c443fce3fac5ba137b0568c1200ff91c0f538d3a7d712154bbabe4862c19a32bb89cc44e8f358359dbd349f98496d9031459fa674827e92213ba5f9ad36e0416f4bfcf8c8b16f88ce77b4f39b1889d0ee648895a36fe4c4322ac9783094e9764adf4d72080b3549faf8d2af95e2fb696fee3d64761c8e719f67ec04339af5327a7227ad1c5f708befabb64e71eb5782fe -Result = Pass - -Digest = SHA384 -Key = 3082092a0201000282020100b8069f9b94c0075d7448921fde91f517219051eff1d2a7330bb8ca0e848916454a03ea915c754aac3f88da52274f22926c0ff259813bd8cb298ab2d15e9dcaf8db9e612907a73200670207211dae05696f9a9a49280060bfd56a5885a349516a0c8f98e7a46d25248e7a296bc47b058a5b9737cb733f928a104203fb863714c8160557278735eb4ded185199eb1be80a5cd4d8e0264ffbf5f3413051e81ef61d7919df435f28fa6de30ac99a3bdd8660c791ad476dfa080a144fa0c75180700e03c8e1a903298f0c6cb8857fa9c0f5a61cd481b2666316d0c067946622f9b6f9b736ff3cc601c2896c84ec382840ea814b63cd0889373c090f35ebac034592829cc8b71520aa8d84eca21421c91f259a457d71d03d33b96f746952b02f42d730e28920cceed93b2115f4610ba8f0d26e662ef47e11cd2f7ef7f7e9ef26eff09122a2ba34c7348b5f1b5a17099d46c0c1a291cbfae64652ceb78b3d2fd738437f436a0b481725566067040adb98d12841fb142c22774ee2f03d6760edd8f373633a13c39548681b0106411c19693a95fde7273a42aa6a47665a55fd101bc3881f4b8390187b8f2f9358e94fc7d756de376d7fae0d467a2daeb28bd04039c8479c9428dc6417d06ae5fe9f76cd6ffd99b7ce118da237c4002aa945fd3128d92b62f66fc8aa8b9d659e97d03fef1aaeab2c5516fd55a5ccb7382a9296ddcf55895502030100010282020100879ffa0983bb72b2217d4a944a486fc5386b50b7f2153a3c98aafbdf6f36493f8fa90b3b4e54f34fb71379338adcfbb1c60a8aa60464c30617fbac8639a13971e709f6b972767a9769534945d2c5ea1f26ad5e8004072346be56be1edf94ad77e701fdc2da9fc5fc073569498f68cb5088e80daad7a946aa9208d53e8e5011f4d4a5e2f1b2e8be1e945a93e948292cfe56245821fa9a802b67b7e790b5edfb9d051f583822ede483100d673f5057972dc4674cb99407eddcdfd33fbf2605ee8fa5a26b0d50d35425e80aa5f8cc76f59413335ad2cc3ac319de73781f3e2fa3f6ae5cce07503703d49c31ea9608b4af1fd31c1e83e7fcd936240bad40fcb84d9ccc82141f83d43f41f6aa5cc3248b0cab9750478d370c4ebb219ac6e6619e80eb0e35562ec65d98a5a9f7acc105787406cda54eaefc9f93bdbc70d32da626df775ae3fcb02d468d0bde8d012361799956b347610dd4a4220d5ba4f8dd44c6a4c6a1cc2cbed643c775116b36d2795e33cfb75f29f644fe49e53609450aa34867fabb5306dd258204370376de470e7484dd72d7b0955c4b003016c3431bb0391716c8830a9b739f7b224a1fd90d6ec0a719f1bbb6354ad5cc34e22bed8ed54d5ebc6648778979d6b20c6167c319201d61dc1eb556654f732a75d3996ea9046c1bfadf2bcc1de6c00e254f0d87639262213b58f4f49771e65cdfacd900ac1256c8810282010100e96016489e0f3e0f21f3b63383d74b4ca597f77391ac19885921a9f55b9893b38381f1906a7b4e5c328b998f681a7d7ec362d1022eaa0c0ea4fd9017716538eed39c864e1e6941f7c47b5a594b5fcf7c874edc0d9fa74b25d875d9cfab9aa21cfdb7e5aa8dc4fbb67bdd681f7e1b1c73083df4da1a842a32e3cbf2dc94e20a9a09aa8f9db62564a7f544f6f58666b49831036dad02009f3f310af7cf2eb89f238fce322692db963b1362bbd055170cc51f5726d2111983818abfb96b988e1081fa881f658867b5414ff4f833eae5d28975ad3580256e28c5fbceb1daa78278058289c7f97632bab0494a2cc750c9cd58aec851ec97a7c762c947a1b5441acdc90282010100c9ddc7d236a5374cf84db722c7357c8499329766325678bf7023000cc3e87eedb811c8696ae1ac0c00d435eab2a2adbaa56cfccfe37becf217eb889939276203655f96710c466e16e7d0c4723ae4defe4570aa6726834385dc1fd0f8d99c850d84d6995043cd77377e3835bb7d0ee47dec605feac42f73e1cb6bd6c76118d561902a6fdbc66b4813b2ed979271c97ee349191317ce1b1af067b633b5cf45c4699e86c5b047d5d84d486b3bb8e1f053903c881a158773694f106dfaea68b9e2ed5f934ef915452806d2e5bf887a858636b772e1d6f282a659ba20770513e4df0b4dd42d34580fcbd3cca1e608c32f7ed6d6e0759f2af25643dea0e5d3113ef52d02820101009d53c691fbe440ad08f17852303e32a820365b7e50a519ad5e912037a5212de965ed73012d97a4d2e8cc4da06cc8f6f33f1addd63fc92949b216b24deb8716a3828ad1cbd61a957b47bcf4c29fda9e50d012ecac4e860456262004cf485b7d9057c6e29060f47bd0a09e393489da130ac572a71f65a2d5a3eb07b1d8dc91aa1e000838bb5470cef39f9877783bbbff615e21768d9c7cf8de2bdcbe04b0f58b6af8e643ced7502b6df5faa8aca0c0623e7d8b4e436d7daab6e8e7a9438cdbb0eb3f0f0743767a9ba9c5125b44fcc52472c09f1d231f98acea13805b4c1183161078d913b3ebe7f50d24cb5976a0d2fa991f73322f72698c33df8767cf807325690282010100b34d05a6a718fad4a81c475561c21556a5c87507b6206e620415627ef427f74de8d80abdefcc8107ac58d18724a230537f8a1dc7fd53deb36e21ac1404db0148e8eb0d725e27d4b30db6b6368c2f2c0e87d939d22338266aa889ae10cb2126614aa35e4c17dd514dfe13a94e5e173346d2050c4d3772baa84d09fd1cdd16b4b952d70ec2142cc8398f0d503b284c84231793690d14e9a874ee79bcd679438be11088bee103fd6281ca984cd4bc02be06786d9f558e1929e9ab3b34caaeb8a5629828fcd56b5a20e266c2e0ec357f9225d9adf600f928a8df3bde8838ff61a3e7a37a99a84babc42cdd2ed466e60fb2c6dad74642596024d565d25e30aab9d40502820100736f2d8187bccbb042c3ad4f44be780e038673088c5347f452332ecfae5d65bdc44854e3fc6d41f787765d65891d9c36586bcdfd044b0b1f99471ec1ed095eda5027078c0810c150e4499d6b9073bf4a0274a6b19029d752b400c63ecae83bbbdf1c6747f4718f583c3d3c04c4351bf11a9e9df0a5b28ce704132994df8abb73d7c3c4dfc06f0f24735a1dfac76420fd594b3db0046602dec3c6db7d4503aa3016b9ab1128173c13aec99d77b49902df6d5016d634397ee4e5810486e8ffd9cc79106a046154791038c002c622e2f6303ba52178a3abba955f4cfe75a446f7779b5b57a9858dbf228dce49ff3b0c62597178cb0c43a848e47242f019c5ca673b -Msg = 6cd59fdd3efd893d091afdc3155d354f10d6d88167427a2cf7246207e51791a6ca6200a914cd2834a9b3c79fcd59e26e457e0683bc33d49267edbdd6e5d90902696f1e7b1a4affc4ba371339868c28015ebbb73e262669866c35db974ba69e468f2583b9191d15d686cd66fb0b9e0ff0a3b4721a6dc342f14f2446b4e028595b -Sig = 166b8b8aa7a806397d8f28c900ea0f650c8cee021d79f7b5bfba2bada0400981dba364873a9f55f9fd002528f16053706623869b93aa8d1c83705c4ab321df3ffe5bedef4de369b345ffa16acc5f5e0b18db4a0dc9e843ef51dc7126b176237d4d8140f6d7bc1babcd135a6e471d06f264bc1e78996d8782c8f15da0fc32009715bfe21a88ee0d34c251c94cde33761c8e398f0ab1878e478700f869a7684103d624a9be0496c85669394f4915bf8cd68fedb0475c9a508c40862bb3c3f8bfa593fdc2a93c16e2866086d5a8be5e94c82ef415ac2cd20eab8bb3bf1c0f68a15ceac46bcff72ff2e0db004f29c4970b86925e60a6b4439bbc7acd95c1d480e0c586cf2af5b62bd56636be646b17f7df1419b02c8ff904b0879518be09c79f0aadb0bbe8f599e44afe9b3dec90f740fd2c586619e47603e9c6782207cffdd522cffec9dcb69d17df3d66ca626b8c14e7075fd8b10fb483f66d01559932793a932d872087e2d904b4b136cd33fe9cc4e83630fe1a192006a787d9e293cc3847fda8e0454f440841e7cb4caed5aee0a395e7040c8e133f52a223e1d402a1269fdc7ea69023f5168756e27479c66c759ef64f432f11f1c1751cb70b47d32e0921a2a415433316090394aa51c7249783cb43aa44255527a9450f60e8df078d0b31089b6f27a18a16a9fc01d45a36ede9fa4d822512467952da83ef5110aa10eef552c7 -Result = Pass - -Digest = SHA512 -Key = 3082092a0201000282020100b8069f9b94c0075d7448921fde91f517219051eff1d2a7330bb8ca0e848916454a03ea915c754aac3f88da52274f22926c0ff259813bd8cb298ab2d15e9dcaf8db9e612907a73200670207211dae05696f9a9a49280060bfd56a5885a349516a0c8f98e7a46d25248e7a296bc47b058a5b9737cb733f928a104203fb863714c8160557278735eb4ded185199eb1be80a5cd4d8e0264ffbf5f3413051e81ef61d7919df435f28fa6de30ac99a3bdd8660c791ad476dfa080a144fa0c75180700e03c8e1a903298f0c6cb8857fa9c0f5a61cd481b2666316d0c067946622f9b6f9b736ff3cc601c2896c84ec382840ea814b63cd0889373c090f35ebac034592829cc8b71520aa8d84eca21421c91f259a457d71d03d33b96f746952b02f42d730e28920cceed93b2115f4610ba8f0d26e662ef47e11cd2f7ef7f7e9ef26eff09122a2ba34c7348b5f1b5a17099d46c0c1a291cbfae64652ceb78b3d2fd738437f436a0b481725566067040adb98d12841fb142c22774ee2f03d6760edd8f373633a13c39548681b0106411c19693a95fde7273a42aa6a47665a55fd101bc3881f4b8390187b8f2f9358e94fc7d756de376d7fae0d467a2daeb28bd04039c8479c9428dc6417d06ae5fe9f76cd6ffd99b7ce118da237c4002aa945fd3128d92b62f66fc8aa8b9d659e97d03fef1aaeab2c5516fd55a5ccb7382a9296ddcf55895502030100010282020100879ffa0983bb72b2217d4a944a486fc5386b50b7f2153a3c98aafbdf6f36493f8fa90b3b4e54f34fb71379338adcfbb1c60a8aa60464c30617fbac8639a13971e709f6b972767a9769534945d2c5ea1f26ad5e8004072346be56be1edf94ad77e701fdc2da9fc5fc073569498f68cb5088e80daad7a946aa9208d53e8e5011f4d4a5e2f1b2e8be1e945a93e948292cfe56245821fa9a802b67b7e790b5edfb9d051f583822ede483100d673f5057972dc4674cb99407eddcdfd33fbf2605ee8fa5a26b0d50d35425e80aa5f8cc76f59413335ad2cc3ac319de73781f3e2fa3f6ae5cce07503703d49c31ea9608b4af1fd31c1e83e7fcd936240bad40fcb84d9ccc82141f83d43f41f6aa5cc3248b0cab9750478d370c4ebb219ac6e6619e80eb0e35562ec65d98a5a9f7acc105787406cda54eaefc9f93bdbc70d32da626df775ae3fcb02d468d0bde8d012361799956b347610dd4a4220d5ba4f8dd44c6a4c6a1cc2cbed643c775116b36d2795e33cfb75f29f644fe49e53609450aa34867fabb5306dd258204370376de470e7484dd72d7b0955c4b003016c3431bb0391716c8830a9b739f7b224a1fd90d6ec0a719f1bbb6354ad5cc34e22bed8ed54d5ebc6648778979d6b20c6167c319201d61dc1eb556654f732a75d3996ea9046c1bfadf2bcc1de6c00e254f0d87639262213b58f4f49771e65cdfacd900ac1256c8810282010100e96016489e0f3e0f21f3b63383d74b4ca597f77391ac19885921a9f55b9893b38381f1906a7b4e5c328b998f681a7d7ec362d1022eaa0c0ea4fd9017716538eed39c864e1e6941f7c47b5a594b5fcf7c874edc0d9fa74b25d875d9cfab9aa21cfdb7e5aa8dc4fbb67bdd681f7e1b1c73083df4da1a842a32e3cbf2dc94e20a9a09aa8f9db62564a7f544f6f58666b49831036dad02009f3f310af7cf2eb89f238fce322692db963b1362bbd055170cc51f5726d2111983818abfb96b988e1081fa881f658867b5414ff4f833eae5d28975ad3580256e28c5fbceb1daa78278058289c7f97632bab0494a2cc750c9cd58aec851ec97a7c762c947a1b5441acdc90282010100c9ddc7d236a5374cf84db722c7357c8499329766325678bf7023000cc3e87eedb811c8696ae1ac0c00d435eab2a2adbaa56cfccfe37becf217eb889939276203655f96710c466e16e7d0c4723ae4defe4570aa6726834385dc1fd0f8d99c850d84d6995043cd77377e3835bb7d0ee47dec605feac42f73e1cb6bd6c76118d561902a6fdbc66b4813b2ed979271c97ee349191317ce1b1af067b633b5cf45c4699e86c5b047d5d84d486b3bb8e1f053903c881a158773694f106dfaea68b9e2ed5f934ef915452806d2e5bf887a858636b772e1d6f282a659ba20770513e4df0b4dd42d34580fcbd3cca1e608c32f7ed6d6e0759f2af25643dea0e5d3113ef52d02820101009d53c691fbe440ad08f17852303e32a820365b7e50a519ad5e912037a5212de965ed73012d97a4d2e8cc4da06cc8f6f33f1addd63fc92949b216b24deb8716a3828ad1cbd61a957b47bcf4c29fda9e50d012ecac4e860456262004cf485b7d9057c6e29060f47bd0a09e393489da130ac572a71f65a2d5a3eb07b1d8dc91aa1e000838bb5470cef39f9877783bbbff615e21768d9c7cf8de2bdcbe04b0f58b6af8e643ced7502b6df5faa8aca0c0623e7d8b4e436d7daab6e8e7a9438cdbb0eb3f0f0743767a9ba9c5125b44fcc52472c09f1d231f98acea13805b4c1183161078d913b3ebe7f50d24cb5976a0d2fa991f73322f72698c33df8767cf807325690282010100b34d05a6a718fad4a81c475561c21556a5c87507b6206e620415627ef427f74de8d80abdefcc8107ac58d18724a230537f8a1dc7fd53deb36e21ac1404db0148e8eb0d725e27d4b30db6b6368c2f2c0e87d939d22338266aa889ae10cb2126614aa35e4c17dd514dfe13a94e5e173346d2050c4d3772baa84d09fd1cdd16b4b952d70ec2142cc8398f0d503b284c84231793690d14e9a874ee79bcd679438be11088bee103fd6281ca984cd4bc02be06786d9f558e1929e9ab3b34caaeb8a5629828fcd56b5a20e266c2e0ec357f9225d9adf600f928a8df3bde8838ff61a3e7a37a99a84babc42cdd2ed466e60fb2c6dad74642596024d565d25e30aab9d40502820100736f2d8187bccbb042c3ad4f44be780e038673088c5347f452332ecfae5d65bdc44854e3fc6d41f787765d65891d9c36586bcdfd044b0b1f99471ec1ed095eda5027078c0810c150e4499d6b9073bf4a0274a6b19029d752b400c63ecae83bbbdf1c6747f4718f583c3d3c04c4351bf11a9e9df0a5b28ce704132994df8abb73d7c3c4dfc06f0f24735a1dfac76420fd594b3db0046602dec3c6db7d4503aa3016b9ab1128173c13aec99d77b49902df6d5016d634397ee4e5810486e8ffd9cc79106a046154791038c002c622e2f6303ba52178a3abba955f4cfe75a446f7779b5b57a9858dbf228dce49ff3b0c62597178cb0c43a848e47242f019c5ca673b -Msg = a7c309d44a57188bbd7b726b98b98ce12582228e1415864870a23961d2afb82cd5bc98bec922d5f2ac4168b056da176ef3ba91f6b699ba6acc4144868ff37f26fd06720868d12ad26ecb52572cf10416af68df03ab645a8b704857d2190ffc3f07eabe3a8e2abe34ed6159e884c4fae141d4333d5c3e0db044ff9cccd9cbd67f -Sig = 72a8d4f11321d8465ba3cf051ecd8e307367014a0ba1677e77a9c500d77e874558e245f3e2f52985e770895827a2cab290b05229168bccd3bfccea7e7128beeae070890de1c1b7f52ac90894ec52403a33187baff155a471f913e8bc2d96e4ff16308838f9f7473bdaa29d0ad5a6dbfb0d8fbc229cc46394c5e25fd19ed6129f28b0c15282793bd288ad491d1324ca431a63212b75ceb510b19d4f635d8fce80ad86e7539b4883c7aefad92cd2de9cecca4e2d7986dea10ca122dd6cf455deb7eb3930937892e713760034c1e9e8b7a0e566bf471845d125d79018f1b3395e2fb4a908ca3c39272a3f2ee733e56bf76930a54efb049fd14cdb67c728ab23f442fb0e8efdbf0389770a086a7451cefbf5b94ffce64ed0430b441897f5a7875420c9df2aa4b3eee7551d0072b021abd579279f8d5b42b129fd13fb4717a23eaa50e0bebbfa64cb973aa249d8095b68ec5944f4f9b73b5f2d6686e9a0d84497d97dde49f8b77a0141a2ea2de47f08d171d16a53fd2e02369c35de96530f5006c35e96857219584053aabe880d246066e225dfc9ac4f59dd295c131796d4b739de118660897c22e9964d7ec8e53272dd2cbbcc2b1342faf9ebbdf4c24cf31b192bdd070eef578ca8cfa02f2c6f29e1643796087cc3867a4a6be8cb35fd63e03f66b9ef2be3fe7975aabe08d7234d116b4c6b41ab5e5de0f93fc60d68b3478ad4ede9 -Result = Pass - -# Invalid key, size = 2040 -Digest = SHA256 -Key = 3082049d0201000282010000baff76a0e86f27d7cb0b843454475348f1a7b474d12c3ed1f479d2d8d34c0bc8a7cf9562bc43b3649585a0325e17d30872c19202af95b407fbbe701811a77937a0c866f863f062f1d36724faf5a44724aa8b0901bc61f8632bf6a1bcad8da8c26b38428b88413317f2975019e9a0c0a4c2ad5cacff643dc3092d053f8607bba83310ca90197e4f38f6507d60d3fcff5c42d0d9e2695b72490c0b622d783e22ce0986dce6047410569e869651acf168f59bba02326f5a2a5d1292766a9b5325f7e17c1820a1ec91aa4257483657f8d13fd3ab071b9ff361f8ddbb071b61aeaec3ec7338694ff2f3f7b43d81cfc9900a6b8cc5c426ef5c26559a5348c16b476b02030100010281ff26030c10456f630000ac44a18688412bd0c3b071169c11e107fb439b03c8af948858301bb3fd67180934f28d8a86f944fc5ed0d96eebd57ed1f3b241924522e4e5f016ce6332584aa4189171da411c9d1d75c9ccea8857bf810e4f6e5531389edcc0c0f6302a60c27b73babaa9bd1dabe04ef149d158851d825dfe751d3fb126355980af98fa7d977e573f58e428a309835958ee689242dfa6018c070d39809b8c21632cbe33fe3ee1a862e38ed13b6147115194b48922bb1de56ffd20679146251c8d2fc192c931c7e538299e7bbcecd81d3b8f8ff5ab95887b5bf3c621653810e2e3fb3b00b0817aed965d21b5ebdce84055c15770cef5d7599c79dee9410281800f522a5da7007ca094340bdc9136edd6ee0a80bbf3c6d1eb062c57d58ae69e170ee629fa269fa7bbe3ac78267a7eb260c5fe064a7ee05f78ba8ec0be8f1d0f471d3af0820bd09756110b4d53c6ef83211b10ee0862d879472e030c9ce0862c5b5aaee108d3f1c011a746629d90cd78d8111f1da85896b93d9e088205c314af510281800c3492d56d1ecee6d51bc376436baeab40a1a3eee530a5faad1f8db149cdc2fc01eb809089a36de466a620a4b997d8112b613c68fda78a7237506c90cc890d260974430ede8942e2bb34fb9473e46adc85aafc42ecac2a84f56fb4bf7d7f8469e791111cbfc75a221bf0e3d252957e5bb0dc78fd73509007e973014476c273fb028180072a6ade3a89a3c0871080abbccf701622678f26593218645012d551ef1145c78b146375b832dc04a8cbb5b6697c70798aa0f0d84ed72a5011114b5cd51ac65680795c9bb662ed2537fb8d432dbc401c6fc84f4c64ced28a541ee0fb4e97f28f17aecb5991a77429cd8ec1f8e80cf2043c9dcd053bc9e301cab437fbf1edeec102818000b46865fa4ef5134eeab376789e170fbc4398fb8a302ce53469c5fc9e8e4adbd2208ee3c98eae21a9eb9da6e53067415687debd1128434e24f377d1447e054c54ef698fca3992ab14b4127297de706d1b2aac3611043fd03d7b9dac10caf41249548ef0620258a9ef8311246bb04603754ac5919cbee21212e0990a22f147510281800e6614d7fe3a6c3ce1c1d2cf1d3eab9b7ae046fd78067141dd841726968e8cfebb4171d94754aa4c71ae8cb53d251b06e420f2b7f0f01a6a2e6b386c3554e0e81a74a94b053bd5c062997729801885f3c36b996b2757b76d09116e11af29d604f70e7dd63225234677796095551c64692aa52ba63aaae2dc836f92cab9def128 -Msg = 61 -Sig = 6041bb20241dd3aaa3eb8175f9642243e1e3cb289e52bad58a4d56bd8a10306bf139ae14d2489fa3575c74f53d851b7dd7c6bb7520718295afbfb5e67ea7b414c332fa0bf3df019c95ca9f6d0389a84c2020ebebeb09ec42a4985f47560c356979a7667937c94de9e16dd26dc4bc4c3a7f34f9b1f5f1166397c6493dab8760e822f41713bb9b1978cd413955a3d356f2d03d973036019a1115e502f65aba3c9b5a3955ba2d6155f106283657541faccce43db657f9aeb93f64e0331f3e71e3f569a26e773e1d103c2c04c59f331ca53bd44c271df15c32279f433359e1b1744fdd587c94e2d42ddbc899ec444718ae6a22e302ebcba861528d08683345e9c3 -Result = Fail-Invalid-Key - -# Invalid key, size = 4104 -Digest = SHA256 -Key = 3082092d0201000282020200da35475cb97abb30a924594d855d9279fecff4bf9b950c5ba8ed23a263429d1e075cc63e2438b34ce5ebf1699ed0ca590c1eec0e93dda1c5a345d01a6aa2b1708c74fefb91cb078b4725996af868ecae9390b836d906288c0d86f3991121f85059b45c24611d97df5d497a56176c3e1b9b83887e8a07f72bc2d45cdc8e5a90439ef77b09ebb1c2e538058dee343004ce2351c6b398f1f4896b165e2ef6ccdb46dadf51db109137e7db57fcbba406c16b4e8c3d741dbac14d1c1a02fbee6a58cd2472737be1c73fadfaf3ab90064bbf1d1b1eeb499283334c9ccaa68a875ce25a025f9cd49c6a64a00a7c065c2693a02cd4c4984879a9b46a7f88274b259ada9d69dcb62dbb9fa5d865841262a76b63018d06cd808659ad4cfa31e022d227a884969346de362697ce192dd839537ef3017f0f73fa080d012a82f596c24eaa9dd01fc10c875020232ffc1635ef094b050a118bf810d8d409df9399f5ccfbb3ebf25a96f438eef72a6b563be8efaa1f5ee5fd2950cacc06f7a208a311f9d5e5e9c97284859cebecd5527f76c7b80dc44f6a5856411fa53148a28ba3025ca02fd9b4f97245fe31fecadf7bf5683a3ebfeebc91695a3910f27f38df143cbf0b9b9553fcef262f16ae5170a1b5018b2f0fdac640afd5c318a9517ca8491bdf231e940e861e4bf3336a0c83a9cf1c1d53d6ba6dc129717f14fdf6261a0cd6c93eab0866c702030100010282020200a9520a6bf3293f33c52c0577d7f30204542bbdf9289b0199e67d0cd7a73a3b7cdfada7cef48062f15ac038f6025c75879f96270a30c71c0ea66137d827c2d2f948a4486fa173f008ad4e89bbadc28d55f1ffac5233194a415305d2e4859cdc784d035d34857f5727e5d56c6e7d826ab735775d65036aa6eb78251d61afbcaa912e3b4f6825522caf7d47221922b9d820b4db71da4ee60120d8cde48b80caf9a40396a287e0552f1264ebe39b1eee770bf349732e351b837f783cdeefead2eed15064d723dbd0a6a33445fc6ca7d603186cc1134665c015006ff1f8452a40730bf1278c2496b3201de7c4d19294049d97ec0a1938b3df71b5e9fc16b1831ea460c6a5813b96b542a809b4e92092d0c850a213936ea8bd48467cb4738e55f79202045a3e58eb46df455f33ab8ed1f798001006f620038b9557d21263dd1b3f849550d7c79d37a816ee6ce8a14bb8b08ce9caee2860815b7ad0c862e40c0639d7d5d129b501405560657a49b99ebfbabc666086a4c9ba394367f29321c7676ffd908b65ca0b5992f6cb65bd5ffe1c5257e584d6f01c04f4a4de223cf39ab3cf1f0e43b933f0f2fdff24dd8f03b0d69ec5d592732c960205e7a94401baaabd7cafc90b972f56a0d096a2ee366f9be53b97b820b9639382cd3508498a7f08543032f8d33fc0968596d4db961e8089ad17be6c1fec0228968e7b21ef164ff8c43479e1d1028201010ee8e72193d6b01c1f603fa872c04d0bbdf690cb4b3dca22a3cec552b788434302390004d118f53532be3774da84c9d2c675b81481d2df4e17abcafdece67250e30e76d7671b145c2accb57a19c1e95029936dd27947af246ec1e522c67f1979575555795cb6637532300f5b1bdf5f55f130d195165eec33522367dcf9331f9a3ac52db8cab35516cb8944f73c1903fb6936820d1430cf6ed6f3c52d2696ba20cc6098dbc91d392d44a0a0d543aa0382998cc4133d3ef3f02a2f563b9c2aede75cb99c40ebb01ad2a622ac376bb72adc2f23a3efb681d6b73e99b68d43ca306f68c42df1d482a490bc01289e2dc81daa76aaf7b4d17456b9d1f4272542be12899d028201010ea29ee81cb4b4ca41b489746ca8ef83675c90bea23224873af5026a01a4f172134f2da20ae520f099b65cb9a6dd7f50f8f0b0db6aecb1cbf3630e975a1f1af37725a8fb88f1a762c3ab790b80d60cdd320582d9b1b6adf8e52ce56d98cccf1770370c3e54cb69100adc2da03a50bb107095e4dd6afa0f8de4c93d6cf27d1a1a11ee21ded0d6fe4da95a3a0df2dc74aecabc5ebc99a30afe4a0efca184c3b4f0f58be76ae282222da06971390d6951f8124bec79a912deae86bf502518d6720e147bd6d74d7ae0e90bb42c420c957bb68498f82e81dfff51c4b9f9725b1553c25c9b49d7181942bed4fc80a1290cda56f2755d1f963b276e152bca36f9ff1286b3028201010e7ad41540fd8bf513e7a68b123e7dd4bc7d1bebc33bd3f6463dc656e9d514f59bcffd9baff25c19791950c45480077d82adcac367bd828ed5e04a78c6bc9b22c110480c339f11ebdcc90829f79fe1d5af3af5ba257c9fb473382d2ed3b595e8c90f1fbe8872bd2e913a297fa31711006707b152e7f1f1d4799dd6fdbcaa90b379060bbc5e674168acecb8249fa1efc317500f876227711cc4f6e37450f8aaf4b567ceac0caa2be031b909d9742845d66d074f591beeea7b408cce637fec1535cf509756594ea30e16b8afa5f71f61298b4242b0c7ff5aa685ce4482f6e6029a00161e44b0ccdbc3904253cf22c9293e6696ed9016a6b49f2c2ec061a86aed97e502820101081f078d07f8e2e5e566186c89ab891562f303c335601bd30acd50e4a03af65c760896eaf79ec4139f4889d5df99c3ff9bd47c5f95caf8b29341a1a42d375b8e44cc9a23d28f3e7258e03b503dd309da68da940cd747e6ec59c7fb1c41114dcdd4d04734037bc8b645407ef50dc724b6efb2ce086c478d001137f6a5113e889074e8aed4e510989761e596978ceff6b3d3fe8997a0adcff8e201c500a01ab5ba8c9770f867ef0ca643009ffaa7cd8cd5dad954c502245d7b7d7c862dbfc5a80ed6210e4bf54bbda8b47ceb9e4f3b582625187987dd3bfe8352665cdcaf5c7b593c6853a64f521d2ea623e4010a357ea786edc79a32946ac1f46f934bc4985da06f028201010d783f2e727336392f1f93272cca34854c0a2afffe94fdf19cbab693c81d17c0f24d3bec537b7be9c0ca6d57450c11cac258332e4d3d0fa82a6d1a2af223dbbb9fa90cd60bc977ead9a5c377ed7123d7b3238b56587780081f29caf322a99e40f982bc6189ce68c959b1106fff19c9aa3ec0a9fbbcfd461de51cb6d3e9b664558124fb88359043162cc144a023c2ff1ef9fdca01f1db3dfad8c4e0aa914f84b42f4bfa9fd4be67c5fe864166d62dfb779aa106f7d99866384f13ed8c6dc34ce9a950f9778d009fa1b8936a67403211d4bc8f99da77f0f82cad1e3e4f594ab7cd377fed95e720dc1acadd0d75d415b0d5bf1257c0c6ee78eb09973cef9773d3ca32 -Msg = 61 -Sig = 3b06ecdd187c947f9007f0c4bb77b1ea60898bbe426505fc9200e09e2ae7fafd8d563c92b57755a6e62dbd7232ebc59158c267bd965ce39e24bb795f819e92a6a5a1de2a1f164353583908b74878e8042e488041d3c9122e8006452544e1bfd279295ede2cbb02334e9dd818cac7b6561d4123898bddd29e9c59843bec5771827e95541bbb82e9e1e9bc9c5d4da43d756f35ebbba0b31d41ca446b3d1be046e062be0a2f585c9ef7764faa71d178daeb153f35ccc9cda28ca40453ea09e3eb7a0f77cff09fe074903a07856ef24a158786d417593c6e9d6d024da4fd7d9bd5eb6262810093e5bf9d250a84fa431f6a36ec713b7b0c8f7df2a551687129a9f1eb0a034d350c30c715d515099f2ae7094a754220f7403b04641b8a1d1e4c5a0fbb0082ead3620ebc21baa06daa561440f43d53baf6ac8ee413935ba1dc2af63bb34abc87e669ced4bab9bb40e4cb7c4d8c136a70a175e55e022d66ac18b43355faaf55ac73eab3f59019e522c4967c492f11a9e80305fe37bc643e2ef61c583d60d9c2afbd1dca9e40d2e66e077c3b2cb4a574f6b9c73fa6ed6aefc03c0e39632529cacab6c1fa6dbd645a6bc05a5b8e91f90264f404bde99fb538bee7ba15624e3790bc088c2a0a27d5dad111802a167d181ce930bfa2f1f8b90e5643f55bea1e0edd57b0997a5a84b7e36d5b107913a2b503edc2093998ca2fbc2f2a085d341cbf -Result = Fail-Invalid-Key - -# Invalid key, halved -Digest = SHA256 -Key = 308204a40201000282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201000997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8 -Msg = 5af283b1b76ab2a695d794c23b35ca7371fc779e92ebf589e304c7f923d8cf976304c19818fcd89d6f07c8d8e08bf371068bdf28ae6ee83b2e02328af8c0e2f96e528e16f852f1fc5455e4772e288a68f159ca6bdcf902b858a1f94789b3163823e2d0717ff56689eec7d0e54d93f520d96e1eb04515abc70ae90578ff38d31b -Sig = 6b8be97d9e518a2ede746ff4a7d91a84a1fc665b52f154a927650db6e7348c69f8c8881f7bcf9b1a6d3366eed30c3aed4e93c203c43f5528a45de791895747ade9c5fa5eee81427edee02082147aa311712a6ad5fb1732e93b3d6cd23ffd46a0b3caf62a8b69957cc68ae39f9993c1a779599cdda949bdaababb77f248fcfeaa44059be5459fb9b899278e929528ee130facd53372ecbc42f3e8de2998425860406440f248d817432de687112e504d734028e6c5620fa282ca07647006cf0a2ff83e19a916554cc61810c2e855305db4e5cf893a6a96767365794556ff033359084d7e38a8456e68e21155b76151314a29875feee09557161cbc654541e89e42 -Result = Fail-Invalid-Key - -# Invalid key, last integer value is malformed. This is designed to test the -# error handling, particularly that we properly free the `BIGNUM`s that we -# created prior to encountering that last integer. -Digest = SHA256 -Key = 308204a40201000282010100cea80475324c1dc8347827818da58bac069d3419c614a6ea1ac6a3b510dcd72cc516954905e9fef908d45e13006adf27d467a7d83c111d1a5df15ef293771aefb920032a5bb989f8e4f5e1b05093d3f130f984c07a772a3683f4dc6fb28a96815b32123ccdd13954f19d5b8b24a103e771a34c328755c65ed64e1924ffd04d30b2142cc262f6e0048fef6dbc652f21479ea1c4b1d66d28f4d46ef7185e390cbfa2e02380582f3188bb94ebbf05d31487a09aff01fcbb4cd4bfd1f0a833b38c11813c84360bb53c7d4481031c40bad8713bb6b835cb08098ed15ba31ee4ba728a8c8e10f7294e1b4163b7aee57277bfd881a6f9d43e02c6925aa3a043fb7fb78d0203260445028201010997634c477c1a039d44c810b2aaa3c7862b0b88d3708272e1e15f66fc9389709f8a11f3ea6a5af7effa2d01c189c50f0d5bcbe3fa272e56cfc4a4e1d388a9dcd65df8628902556c8b6bb6a641709b5a35dd2622c73d4640bfa1359d0e76e1f219f8e33eb9bd0b59ec198eb2fccaae0346bd8b401e12e3c67cb629569c185a2e0f35a2f741644c1cca5ebb139d77a89a2953fc5e30048c0e619f07c8d21d1e56b8af07193d0fdf3f49cd49f2ef3138b5138862f1470bd2d16e34a2b9e7777a6c8c8d4cb94b4e8b5d616cd5393753e7b0f31cc7da559ba8e98d888914e334773baf498ad88d9631eb5fe32e53a4145bf0ba548bf2b0a50c63f67b14e398a34b0d02818100f364e16ef12017ec95b192308c01e087cee619ab50a5d537cc01841dc92b30bcef0d9f2c6bbd5dc10bdf5b9f6c354a4f9f210520caa72b4f5c36b8d33f10324c55956141891e45b84b49f59ea5bfac6ffa38900aca5099afcd02f6a8257c41ce5bb2e4153832b5c22f91eb389fa2035c3cf9b3374531c483cb30ceb007259b1d02818100d95c0995fabdfcbccfe63e0f3262f806869ab571e1793e97234cbb9bd4b6872a7695389955cf6ce7245345a5df8021f7d9519563afbc2667f5311fad093de2c02cd069109b630d68e3bf767f8a788a6add7ab199f2d8f6a40b7c1910d9dab52ac80d0d333aacab321a9309dc884ddd4db637a0c1115ae3c08efa683f99eb733102818100d4f7ef9f9be947ba9d1b3bce59e5608839a1e464553e1b6d113d0f636758bbb473a89f9949836ead40b6f314eee3ac2244d7b6f379e83f30e17783ad68d5086897889c051c26e1558a4a220bfc242995860644b5d7a3ef513ac612b9c6c0a2021bb6b9cde7dbd21fe5858746c79563e9bab7d06b43aab43a0a5cafab4519a6610281803db2386f174f2ea3ef4b6bd1601749ce2d6afa8be35f051178621f16a23ad36eba03c073136389241969e5b87edb0fcbcf1a0bd6e1aee97bae1f2d97aabe19b17dbe7d9492cdb68a0897f572350e846c669660dc978c5068da598524fca8a136358d3e5f8f6ad5cf78d9089c93f473189162ce0f8c4902a19902b633b3e6926d02818100ddc971183dcf3450c43e06ba2af32379eedeb2d678513fb706b75a006098154041f4b09e6be385d4b25d80ec241c899e4a986a17b0a121daab91a1e4fc5a1802a7074df3fb3f7661f0e1c97799e36d21de937cc4209585db30a56af0a228e001036ed792625e5368ce101574a2e9767f07338949f0afdf358cecd18c6d6f3f55 -Msg = 5af283b1b76ab2a695d794c23b35ca7371fc779e92ebf589e304c7f923d8cf976304c19818fcd89d6f07c8d8e08bf371068bdf28ae6ee83b2e02328af8c0e2f96e528e16f852f1fc5455e4772e288a68f159ca6bdcf902b858a1f94789b3163823e2d0717ff56689eec7d0e54d93f520d96e1eb04515abc70ae90578ff38d31b -Sig = 6b8be97d9e518a2ede746ff4a7d91a84a1fc665b52f154a927650db6e7348c69f8c8881f7bcf9b1a6d3366eed30c3aed4e93c203c43f5528a45de791895747ade9c5fa5eee81427edee02082147aa311712a6ad5fb1732e93b3d6cd23ffd46a0b3caf62a8b69957cc68ae39f9993c1a779599cdda949bdaababb77f248fcfeaa44059be5459fb9b899278e929528ee130facd53372ecbc42f3e8de2998425860406440f248d817432de687112e504d734028e6c5620fa282ca07647006cf0a2ff83e19a916554cc61810c2e855305db4e5cf893a6a96767365794556ff033359084d7e38a8456e68e21155b76151314a29875feee09557161cbc654541e89e42 -Result = Fail-Invalid-Key - -# Invalid key, e is too small (e=65535) -Digest = SHA512 -Key = 308204a40201000282010100d3e94ceebdf732da0040d4ac1b3cc89b81718abfbb5661a516c4395d4d01689db558fe2dd875a36dabafa81b532bcd3edfc126e60d3acadf8505a2e45570c7ed19649de601042e10953d40639614437f7e380919c994bace28e249f9f2e28d3fd170faa7245e6836c97cabddeea0bc0c94c16d64348175043c0cf443d4886c39a9faf025e9f1b385a2188f206b726ad34f3a5707804ce448b42b04a25db31888a8e9903f0f842949109e35c0719dbcc2b5d541ffc7f7270fbf912f149ca47e90a4232ca40a87f0a24c37a299f04979553a0700dcb2618f3ca448dcfb2313dc028ee78b151ca7dc46d997cefe5b62b5a6f82535059cf8550d08ecab04956f12df020300ffff028201002e2e83cc82fe83f97a0b9ae4648bf19ba51f2d85da0f3b32bf5ade832dad3e43acaae37f4d2d601ce4891a419eafa8581e072bcb4a295c237616a288390edf00908b37dc3990ecc2d5e8c112f4e5bb63621b0446bceec06c71e1525464bcb7d8e2336b331be616c8174cdc9927fbfb37111a003ad89416de551c7fcfcffed2e4365ce61ea90836505735c36a087d5675c608806e361cbd02b9b5f9d93087fffef5c17d20475ab164323c1b6069dfc3116b99990ee41f6a7230ecf381e838bfc3265857963f92e09e82a658ad054c4593fbb8832d4e6bd42da4d9a6ef365534469c7c8f14843f3f69bb1ab5dd12b4f2150c3c16fdc9201366c910ad19809110cf02818100eed2c519d13351a714b5473fef7921c6f334a099178fe48404a567bb59c125281e05746e188b8eec0fa2f12cda11f386c11ab460de0b37131d1e3bb8ee6ac5bd8de72939d2d0660ba9871e1c96072c8759b36c938308d4876cc9f7df707939b1c1a3a642929a1d0ea277c4e4b217140164cc34d3360072aa55bb1782759e9a5b02818100e327067c378bd8fe8cb78f119d4a4e2abb42caf13aa0693cbb824ff2b0a71230b94e72f3a9ac2beba21707d7a004a6094a95ac891929609c8cbf1eb7fad204a3811da06fc64747451d1500b20a388b4246c63c309b19acbade72218edb41df4525a27d5381140918ac68153e2d3924f604cac5e0202922e6cf8d6bea7491e8cd02818100ea2f2a601918515b0c9345aea0fa01eedd0d29bf076fa9dc7582be17dd7c57718bd1991a45bfae267b039b4c3c28f259c6d77c52b04ce38feb8f3ed2f6eb3d4cb9dfb2b65bc3a0b37430e7e1a3a63079f098f6422330ddc6a09d336115e4944d3753352c6078ea92f2362f110709d431aa0e3ea2918845f7f8046a73e0d523e30281805a268208642fc360e107662ddac32d02c06e056a7bb7cf1baa6224ceac8c2a9342cdf60acb9c20d6579d4d790f7987c26dbd0e4343209ff92110a66898525baba3547e557a5d1a14f6dca1b04a20b4dd1565979ebddc915a86cc803feb21f296aac344521d2729b7557b7011aa123cce63bb40fcf0a063fb4fd026e92606621302818100cc847aa3a8851bdb581b1fc9926abe2760d1fa47b5993e6ff83a4abf3827252e0bcca53331eaef1eedd83bad6cf10327ac573043bb87d822a91c3c5d35989c82a00bac71f2b879d2f0c7efa582d2b3498bc190386f90f02e4a6b5166010439fd7070aca790b597ead9188e295789ac2bfcfb6ca039f235dcd0d0a7c197bc84a2 -Msg = 0123 -Sig = b62bdd9c87f8f409178a5155768b536c1341f52a28c881494baa80b39f4a25a841f664eec49a464adf3cf5c920975cb83de4b06f0c7740685f0174627fcb4d0511bc6a25d473952c33fa5763a8e9bdd00bcdc1e4e5881d061193d77335d7e245987c9333455c9e1a2f0ff45242cff45cbd9ab8859d1c81dda62680ce388caba410be15bb40c0a66ea3a4ef07a3fb1f0f66c656c754dd3b15e694902ea79d1d0496a83408bdc2e94b7bdfef5883fe748ed50027ce0f35380dac8245e042ccdad69cd98440a2f77085a6d02d097f6ef650400b7eb469b9e6ee5284c7c7aee8e6365731114490dffadce428b2d16dd086ae0ef350f8e9dffe22d63203d891394322 -Result = Fail-Invalid-Key - -# TODO: -# Invalid key, p & q are too close -# Digest = SHA256 -# Key = 308209270201000282020100b748949450eb0d3c045a8d34aad4e9c142c4eefca9486ca360f6351ecac183f232604aa81a32d0a5d62fc28d3fd2e1fc2e3e097dc2f53a7929574c46397eb666670d1be2e590f3962982aaf674f7cf345f2d3fc6aee1819b8140e9f97095a75320d5bc3c4e22f4451d4624cb42e9185281383d239b2db3128871a35f5bf02e804206becae433073d987fbb52870a1942c7e449aee9c757ac35c0f34d6ffbd535497dc08fc74fbf314fc5a9c2e98eb6db5ecd231b16196fc346346fd345347d6d3a84c5e98c57e5b39e8baf3573d7bc99f35e725011410ebe60616c1286dbe0bbbecc2b6ac73a2e2e16cdb79e49455d94f5796f353e02548bb5a500829271345ba941471ea5fa87fd36d7aeec29b159f1c0c7e7bdbd5599f4d3ebdcc7e46e37323ab81682d661a8a9cf88b2a1a09ea5fdb0e18745a3c63f51b31ad466617821796c53ba05e34b4e9a1bebb43641cc2fc63e295b6f5d8dd8bbc24568e504789a03bb6a7468c76036ede826f2c96aadb2c24e720906c215e48abdf0f10570aaf09778ef80758c2de408bec35937884d96f50757b29ff4f82824daccd2d4fc174929eaa66fbf8f3a669455db24f54bedfa74f388e01e5d5f6d51c49376ac529634e3be3fe134660eb453e9f0466446768ca1c4a7d854c9ed37b91b81343bde5b136ecd31cfe53c2d7c3b0e072736ea6d24903b228d814ed99e9b78796e148d0456f502030100010282020010d03bb10f6b409f8cd6b1b56f2670fb25a0e33b925bee7b5e5db7a9c777d11edab832a111263035c65c4340a9e6328cebc10d25d8489ec096a6477cf9b142124ac9cd11177620a259d47ed2751076959b558f502ea2c93cf6b279c4442bb659cddd4d934aa7b238d4e2a6656f11eb05468d5e2e7201d3379404b8b3fabf21c4ea49ac1ef8a825b5e4d372dfb33b9ded9e60b6d1b0e874867bb7e399eaf7f32b1c3ec8f767954d38bcd4a92a143adf536872f1117f097e532f9187e09dac9f04f22553f284c95b6d0ad24d945db820b90eb64f4e4106f2cf4c1023d5df41347084a43e27617758dd29825da1cb9eed62c8d206fd9f5e9f5ae1a2ed550d120d7763657bde6ccc337a623709e0dacdf98d26ed746593dea884ab3058f1328ef36e47ef6c104512afaaa1a2c00671b3178f9e4dd10a7e162ddcbbe009e39ac19e286742b5cd85c355a321b1075b61d7ca84fae50170817f9f512f453c58db40217013b24d1b8f569d6fbfc054f135e8fd5accc37d541676247c1723f26b15d7c98f97f2f56cd29b08f4b8e8d8c8d17167dac3dabe875cddf50ad8bd86330753d98613a36455eb5aeffc97ee216c533ce3fa4a5b0867ebda1a07746984881aed86415ee89f0617b43a9926d94eba3a6fcda514aba0ab0762def92f6ca30897e9a4941766c2096e794a935ddf30df230811ea59a355b4456f06e6544b5ac346a39d810282010100d89c9114d87810961378876909759f9ec38cc294f150180567faf3fa709810ed2f1f52a0f28977e6d8d58436605f7a741341f0413ddc0e6505e7e7d2afdb62ca901d525c75a1a9e377795243212c0121db3fadc53f0a5ae4205c32b31223d828c2ea85b46141ce004bcad0bce06288394077a72efcac5a4aea204b39796c22ce2c7ceaa53a15ad61804e642f389b70c6bdce3438bde7daa7ae1db4849adabdbfc54309b0185492003f7abe5ef4ccc3d892dcbc4d6e5861a2463fa9968e58dfe04d9fba774f40df95be126b56bba14c57fd0dce0be7a5e8c33591e15f46d921866eb65781d9d0b75f9ab7a3501735c8e7a2a4325262e23e1264d2f66e3a1929d90282010100d89c9114d87810961378876909759f9ec38cc294f150180567faf3fa709810ed2f1f52a0f28977e6d8d58436605f7a741341f0413ddc0e6505e7e7d2afdb62ca901d525c75a1a9e377795243212c0121db3fadc53f0a5ae4205c32b31223d828c2ea85b46141ce004bcad0bce06288394077a72efcac5a4aea204b39796c22ce2c7ceaa53a15ad61804e642f389b70c6bdce3438bde7daa7ae1db4849adabdbfc54309b0185492003f7abe5ef4ccc3d892dcbc4d6e5861a2463fa9968e58dfe04d9fba774f40df95be126b56bba14c57fd0dce0be7a5e8c33591e15f46d921866eb65781d9d0b75f9ab7a3501735c8e7a2a4325262e23e1264d2f66e3a19287d0282010071abf816d0627191d035f8198ef54306b5e83054a92e36ecdf5c3a9cba6992b8657a328a73bce0472c932006c91c51ce882c9a40228e509f8331e7de109b3884c48c1ea496b677c8fef193d1d69e9919834d2f8bcb414be15b7a06c1224bdd2bc6ddfbbc652d7b457c80ba79e3e6d145fa26d07d3febd2966db6f4c2fc8d5ad687522670fec25172513ad22855b47cc24ee8df4ec799dc8d123a5479222a985902d3e3499dfb03834dccc40a60bcf429bb284b48f7173a654628327ee7c48bf7d1c478be13c11f941d62dd216ee57e82ce316867a6f0d1ed5f3766e5f0f0113fd2e9ad925f13c0a75331fb6a14440d62415f9968d2ab97975f81b600b24c724102820100611e91ce0ee0864f439b9edaf16ad38e938ee10f76c2ba8272048aaf971c173ac10e023637887b41fda67e09035ccbc28f7fd900e7836ad0d0bd11abdd3d38262a477b4e094fdaa42a453324f6128ccf69463bdb5c50804018623e391bc106820022b6a0119b3789da71acf58285ab1e4051659c239e033de38b672ef5ca0e30f2b16f63758f92954cb9d92172f7feb09d197f4091a50adc73accdeb46a31cc086e96fc68ca21e740e0232a8d0899ea5d3f3345a63472d3f5ccfde71aa911e8fab3e1a94b3ec1a53414d70e30a6d5f9573d864b1e1c2f981ccdb03797c828e0d80463125ff4b1d6cb829ee0752e0c29b58c8d5e72a7ed5e5d95edd2ebecdd8e1028201000f8fa951ae728e6ed3ca21449a6d3b4876820526a76797cb6c405f811263333d2d50f67cd983fd9443124806d9506c1b7715a81074fee39bdae8333a89b0dd2a8186852e5dc8abd639dec8da27e678b99ac8fd090543afb995737f3a793611bc4ebcfc5d2469824b0e45be13742a638886d692a189530099fac01cf1bcf3e80483322b56e77bac1673e2523b4ce4e9f0da24259733e540fecdfac7154bdc384c4e2bcdeff5fa4e2aaf3a1aeade1789a7d595be144674b1ae3b7bbef1119518e9200f2724866ddb18bbffda1a17c72c791462d4afef89b63d1aa72b68af054cb50f4f4e60de5c3c40fbaa9e1f8032356bdbde2fc0c4e5961d4681e9faad5e7f54 -# Msg = 68656c6c6f20776f726c64 -# Sig = 5d449a4826dbac7da405ffa5eaa8b140aa0980d2a458ddb23f03702ce2c2b88c75155ade558d5e8a1a386fb49d9b93f202bf17f3e76a5be7640fec12f046453ec8000ee15e65efff8866610c51cac55ae8a5585c2f637db4be528f5eb5d71a5439c2ed908704a75453134673273e1420b90da80ca6705e4244b876947af66a64c409b41e6137243c1da35b3341b6f2f02083af264bb233832341aa0bd38f83eef03b720d36982142171e18c3736641f059c632effbe65f233ffa8ed45fd964f4e674c3b337d9ad7088547b2153d5d0b93a4c6531c3572669c30e90b79ee8481a197022ed9cbc54722b9bd02d74c3f236840656aef762e38638b82a97ee45d4952cd09b86d33cd5dcb57fd03d4a53b7676278f29809e60cd980788fa8ee504b82eb476e3dc9f231e0a62984c4cf2149d2f5dc382882cc826ac9d0e9f9af1c0f47010f2b8a75520fd95f60ae538d47361b52b83e1befdb0545d45ca4bc33bcd0a14334f9f1377ed6e419aab4cc77f73378ff8cb44f5f6a17ed3a0e0b079034471c8a107e96fb5d2074e570678e9cfd5eeeed09302cc4259cbd279dcc352acd958045dea17ed027e827ddf9ddc862fbbb2fe8aeb440248138eecd8ba2d3114e96e6242692aafe282133d3557c3d71768008e41bd841b44d7c5a8af2821f4c40de975bffb2a3e6e0c0ad1ec597c9d3c44c9f837a60768f689de7103ce64ac3dc525f -# Result = Fail-Invalid-Key diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/tests/rsa_pkcs1_verify_tests.txt temporalio-1.3.0/vendor/ring-0.16.20/tests/rsa_pkcs1_verify_tests.txt --- temporalio-1.3.0/vendor/ring-0.16.20/tests/rsa_pkcs1_verify_tests.txt 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/tests/rsa_pkcs1_verify_tests.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,1338 +0,0 @@ -# Variants of NIST tests that test edge cases. - -# e = 2**32 + 1 (0x100000001). See https://www.imperialviolet.org/2012/03/16/rsae.html -Digest = SHA256 -Key = 3082010c0282010100a1a78a0092878cb43263b218d75fc924e915ae80f1d32cd9db690c1c7cf6942ecdb54c0357e0a55f959d53562d1f89abbd59bc24a03557b068449d0753b927a5a68921281fb92e61050fe838136ddd910ba13cd71b31045823b53d0a96e19ec97bd8dffb9923743060f84d6aabbdb44eb0470b34dc3223a91b9e79f68cb86ba616aa5e62ead9627eccc110a72e2b03879c360bfcad3ab0e7f3184e7ac154ee2803b2c7b57824c2fe54f600668087cba6778fdda5bd8dc1a60af7295a8c793520b0f02e35d16ef58e563b7929cb7045f9528e7a335888e5a2ad4a9f7539209924299f7640443bace8c643cf73c249fd43d616f111450baa403a9a8ce118af5e6902050100000001 -Msg = "" -Sig = 13b1addbef54e405580c0df21429fa030f3edfc7f7bd446907626d1e73e69dee8f5a2f1614f548e58b684da033dd8fbb7e9616408e1d1318698d10d536c622237febf2fc73d64718e791192d5c38326217cbfaa319e5fc1ce8cc4685d7d2f0b77c22fb11a0ce00467fbb918d5d0bf6926dd6b3bceefb15040f153abe5e3eb9c6ec80fe1064db69b332bf70cbeb2a483afcb09237420e1413941e2f71650cc393800efba739fecff9bf3a75b9ac88de483af0a0ee08d1a09f1de91f342017c53745fbe658a5980926ce56c14df45088d92e0bba61f16b8847d74f3fc707c60ba82af29face1c5269a54d4185e8efce9e566c3ca0c202ac1a4cc180d5320bf599a -Result = P - -# e = 2**33 - 1 (0x1ffffffff), the largest 33-bit number. -Digest = SHA256 -Key = 3082010c0282010100c2bf9ba415d7c612933ef42f350e621e12dc92cf9f1ab8c4697208e22643d96c0be81a3cb1e841a26b73d354756d3c00e83244b367ee63f171497bf1859841afd35edde7aafe6ceeae279b6762a726c67aaf19506590803c53a22f661496532c90d3969cd44f020290ca91ce9296120bc88d40d7be403e5e3ccc39ba177bfa5fa2f7828bec5e708cdaa1fc8cae1b26f63aa30178bb86ac25e1ee1877c17f37b1428d7125ffb6296098d4c72f4ff2460fd52cf8aa6988eb7447a638a9044969519c60b8ab25b56503708e450fb5af32248932730c261d0d76623c2dc4f75bbb77fe6c3576b2dbec3020d2c8433bef402e2172a243420163319a930997ef5a47e7020501ffffffff -Msg = "" -Sig = 0a5ce0746f099812045cb79a4975cd1a5b60dabc7031cbb36395afb632c600db13aaba61b601219dba672d2dd100b06f270eccb41de0a22542222c05c9fc86f6ece18e25b287ce69fbd5544967a5eb2aa633b9f940fddfb3eb18d5de0966e74be2992db44ad80f96e86ac9c8d06e3d0d0fd7b02f61b706cb59f334a721b5bec83dd941dfd029208d1db617adee196af6f3f23bd46344c97be6697f92ba6bf72d5c404dfffb0d47093cace28b99a6733d442137eb7a4c50c9c4beec38520978743679618a4b8def94ba246bd31c96bc84837caedb2b282886fdb0a0173e2e15c850641de49149fcc2d965891f641f21d401fabda0a7e96f6e5565da4d979871fa -Result = P - -# e = 2**34 - 1 (0x200000001), the smallest odd 34-bit number. -Digest = SHA256 -Key = 3082010c0282010100f29f6bb9c42e2025d15701b7278a301c92162928265ff63d08ec7c41467303159ca453cebc5709b524a76009203b7871464178497d6739d291e7367a1943f0d38b643fbb78e204c2afb99709b579f033e85e181dc6fc6c5ba20a65c5dee9ad7c44085f34fe13192f1be071fbeeabc743ef16b0e19bde382549090f200503c670a63c895b4a3a8f3fe6411b574d89d3b7b0e57f9922df070620421a1e55acc5557aa35671503ac0d21c64af1840fe4c0ffc9e21b3774f3583ac32c5481e3df8a85b79cadc5bac78bc0a37a08b0d51b147d31a6108af6c42a4738b3657b8fdfaa0a7f90f674771987c19d1be67f45ff14aff1adbaef2b9f78d546559cdc0b8d8c902050200000001 -Msg = "" -Sig = 28b85afb66dcff685336be3b7103283d3ea74d38928092dca582188816d59afa25d26d1cc9b8c67de01dd9465475601c9ab7b980f129652a76556b6245b178e4ac52660153ebfc2939ac08ca5ce5d8dae7c1b50f98d83c3419ff2b000bd2e0d2f6dc87539f42248bd4de80169e7015d9cd2184887211414d48a10f4eeaac7968ed1d5d3000bcc73fbf4eacb1e2a6db87c6879e4382e01f46a170cfa60b682af0af7701a40b3eb08e927b8a461dfabad72bb7fdc7769cd188c4ed103eb8ef49737e46e1c48157758f0461eb1ec113ce81b0eeff54743178b8a1b95b38ed7f24a550fcf8d042fe5c0ee0b9aa7d5bfb14c5e2cb5e81772e854122b1cdfdbec12f67 -Result = F - -# e = 3, the smallest accepted exponent. This is also the control case for the -# following test cases. -Digest = SHA256 -Key = 308201080282010100be5b5613b7872a0cb3e0fc3908d0eca9fc9c37887d6262d315c7425f300c56413c18e033f2295671bb843525898d32177edd206543d4fb68ed726ce7c3ed26dbb7ab39caeda2fa51f1f168b10ae7627d25cfa51660e7d599c9f2e1683d184388caf55c20c1a9f691ec325f7a5f89bc3e9c8a5a8620abb73070226ffd24fca570c6c002f4deffa80e1620b131efb195094120ab9a518f0dc974ad4ef63e32ea5b1f95030d04e243a986bff7be7bf3e0c8d2f03b868844beb5fd040db42967d2c2ad873867d9fd6d26f129b7ca3afc4eeee783127dd5a2f3828ec4f123de16871927963e2b5626114fe9894e1ce6365c80d7e2ec7b50ee0d04952f055b3831e1fb020103 -Msg = "" -Sig = 21f1d78d3d3d02eaa30886356f494fd4ce060e12cf4a808c3a4a8011164f948a1b15414f6fe0bafb174468e632b7b843059dcaa2d915028fc79e3252b79060801373a16b6d26e5bc399d66201357f284ac822544176f5d7bbcc402be5335d221deeb2c44ba1cc908e10340056b521a0f965b373cc042dd2b3e3bef68213cd526c78f0a5237a7c1aa74989d86420d0a0cb639362e2f49182e1c4c603e7dc1b494efbc581caebb03fb633720b643e72d524c8403e500f5a7be5caadf5ed0a9653a805df917d0dafc4e589e26373a84970ce6905359ae981bd3d56699132be04dd3ce02bdaa399737ef79c2f3352f4f4ab8ac1f0954111dfdd7fee5655aa408774e -Result = P - -# The public key was tampered with so that e = 1. Signatures are trivially -# forged, since Sig = Pad(Digest(Msg)). -Digest = SHA256 -Key = 308201080282010100be5b5613b7872a0cb3e0fc3908d0eca9fc9c37887d6262d315c7425f300c56413c18e033f2295671bb843525898d32177edd206543d4fb68ed726ce7c3ed26dbb7ab39caeda2fa51f1f168b10ae7627d25cfa51660e7d599c9f2e1683d184388caf55c20c1a9f691ec325f7a5f89bc3e9c8a5a8620abb73070226ffd24fca570c6c002f4deffa80e1620b131efb195094120ab9a518f0dc974ad4ef63e32ea5b1f95030d04e243a986bff7be7bf3e0c8d2f03b868844beb5fd040db42967d2c2ad873867d9fd6d26f129b7ca3afc4eeee783127dd5a2f3828ec4f123de16871927963e2b5626114fe9894e1ce6365c80d7e2ec7b50ee0d04952f055b3831e1fb020101 -Msg = "" -Sig = 0001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff003031300d060960864801650304020105000420e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 -Result = F - -# Length Mismatch: The signature was tampered with by removing the last byte. -Digest = SHA256 -Key = 308201080282010100be5b5613b7872a0cb3e0fc3908d0eca9fc9c37887d6262d315c7425f300c56413c18e033f2295671bb843525898d32177edd206543d4fb68ed726ce7c3ed26dbb7ab39caeda2fa51f1f168b10ae7627d25cfa51660e7d599c9f2e1683d184388caf55c20c1a9f691ec325f7a5f89bc3e9c8a5a8620abb73070226ffd24fca570c6c002f4deffa80e1620b131efb195094120ab9a518f0dc974ad4ef63e32ea5b1f95030d04e243a986bff7be7bf3e0c8d2f03b868844beb5fd040db42967d2c2ad873867d9fd6d26f129b7ca3afc4eeee783127dd5a2f3828ec4f123de16871927963e2b5626114fe9894e1ce6365c80d7e2ec7b50ee0d04952f055b3831e1fb020103 -Msg = "" -Sig = 21f1d78d3d3d02eaa30886356f494fd4ce060e12cf4a808c3a4a8011164f948a1b15414f6fe0bafb174468e632b7b843059dcaa2d915028fc79e3252b79060801373a16b6d26e5bc399d66201357f284ac822544176f5d7bbcc402be5335d221deeb2c44ba1cc908e10340056b521a0f965b373cc042dd2b3e3bef68213cd526c78f0a5237a7c1aa74989d86420d0a0cb639362e2f49182e1c4c603e7dc1b494efbc581caebb03fb633720b643e72d524c8403e500f5a7be5caadf5ed0a9653a805df917d0dafc4e589e26373a84970ce6905359ae981bd3d56699132be04dd3ce02bdaa399737ef79c2f3352f4f4ab8ac1f0954111dfdd7fee5655aa40877 -Result = F - -# Length Mismatch: The signature was tampered with by removing the first byte. -Digest = SHA256 -Key = 308201080282010100be5b5613b7872a0cb3e0fc3908d0eca9fc9c37887d6262d315c7425f300c56413c18e033f2295671bb843525898d32177edd206543d4fb68ed726ce7c3ed26dbb7ab39caeda2fa51f1f168b10ae7627d25cfa51660e7d599c9f2e1683d184388caf55c20c1a9f691ec325f7a5f89bc3e9c8a5a8620abb73070226ffd24fca570c6c002f4deffa80e1620b131efb195094120ab9a518f0dc974ad4ef63e32ea5b1f95030d04e243a986bff7be7bf3e0c8d2f03b868844beb5fd040db42967d2c2ad873867d9fd6d26f129b7ca3afc4eeee783127dd5a2f3828ec4f123de16871927963e2b5626114fe9894e1ce6365c80d7e2ec7b50ee0d04952f055b3831e1fb020103 -Msg = "" -Sig = f1d78d3d3d02eaa30886356f494fd4ce060e12cf4a808c3a4a8011164f948a1b15414f6fe0bafb174468e632b7b843059dcaa2d915028fc79e3252b79060801373a16b6d26e5bc399d66201357f284ac822544176f5d7bbcc402be5335d221deeb2c44ba1cc908e10340056b521a0f965b373cc042dd2b3e3bef68213cd526c78f0a5237a7c1aa74989d86420d0a0cb639362e2f49182e1c4c603e7dc1b494efbc581caebb03fb633720b643e72d524c8403e500f5a7be5caadf5ed0a9653a805df917d0dafc4e589e26373a84970ce6905359ae981bd3d56699132be04dd3ce02bdaa399737ef79c2f3352f4f4ab8ac1f0954111dfdd7fee5655aa408774e -Result = F - -# Length Mismatch: The signature was tampered with by appending a zero byte. -Digest = SHA256 -Key = 308201080282010100be5b5613b7872a0cb3e0fc3908d0eca9fc9c37887d6262d315c7425f300c56413c18e033f2295671bb843525898d32177edd206543d4fb68ed726ce7c3ed26dbb7ab39caeda2fa51f1f168b10ae7627d25cfa51660e7d599c9f2e1683d184388caf55c20c1a9f691ec325f7a5f89bc3e9c8a5a8620abb73070226ffd24fca570c6c002f4deffa80e1620b131efb195094120ab9a518f0dc974ad4ef63e32ea5b1f95030d04e243a986bff7be7bf3e0c8d2f03b868844beb5fd040db42967d2c2ad873867d9fd6d26f129b7ca3afc4eeee783127dd5a2f3828ec4f123de16871927963e2b5626114fe9894e1ce6365c80d7e2ec7b50ee0d04952f055b3831e1fb020103 -Msg = "" -Sig = 21f1d78d3d3d02eaa30886356f494fd4ce060e12cf4a808c3a4a8011164f948a1b15414f6fe0bafb174468e632b7b843059dcaa2d915028fc79e3252b79060801373a16b6d26e5bc399d66201357f284ac822544176f5d7bbcc402be5335d221deeb2c44ba1cc908e10340056b521a0f965b373cc042dd2b3e3bef68213cd526c78f0a5237a7c1aa74989d86420d0a0cb639362e2f49182e1c4c603e7dc1b494efbc581caebb03fb633720b643e72d524c8403e500f5a7be5caadf5ed0a9653a805df917d0dafc4e589e26373a84970ce6905359ae981bd3d56699132be04dd3ce02bdaa399737ef79c2f3352f4f4ab8ac1f0954111dfdd7fee5655aa408774e00 -Result = F - -# Length Mismatch: The signature was tampered with by prepending a zero byte. -Digest = SHA256 -Key = 308201080282010100be5b5613b7872a0cb3e0fc3908d0eca9fc9c37887d6262d315c7425f300c56413c18e033f2295671bb843525898d32177edd206543d4fb68ed726ce7c3ed26dbb7ab39caeda2fa51f1f168b10ae7627d25cfa51660e7d599c9f2e1683d184388caf55c20c1a9f691ec325f7a5f89bc3e9c8a5a8620abb73070226ffd24fca570c6c002f4deffa80e1620b131efb195094120ab9a518f0dc974ad4ef63e32ea5b1f95030d04e243a986bff7be7bf3e0c8d2f03b868844beb5fd040db42967d2c2ad873867d9fd6d26f129b7ca3afc4eeee783127dd5a2f3828ec4f123de16871927963e2b5626114fe9894e1ce6365c80d7e2ec7b50ee0d04952f055b3831e1fb020103 -Msg = "" -Sig = 0021f1d78d3d3d02eaa30886356f494fd4ce060e12cf4a808c3a4a8011164f948a1b15414f6fe0bafb174468e632b7b843059dcaa2d915028fc79e3252b79060801373a16b6d26e5bc399d66201357f284ac822544176f5d7bbcc402be5335d221deeb2c44ba1cc908e10340056b521a0f965b373cc042dd2b3e3bef68213cd526c78f0a5237a7c1aa74989d86420d0a0cb639362e2f49182e1c4c603e7dc1b494efbc581caebb03fb633720b643e72d524c8403e500f5a7be5caadf5ed0a9653a805df917d0dafc4e589e26373a84970ce6905359ae981bd3d56699132be04dd3ce02bdaa399737ef79c2f3352f4f4ab8ac1f0954111dfdd7fee5655aa408774e -Result = F - -# Length Mismatch: The signature was tampered with by making it completely -# empty. -Digest = SHA256 -Key = 308201080282010100be5b5613b7872a0cb3e0fc3908d0eca9fc9c37887d6262d315c7425f300c56413c18e033f2295671bb843525898d32177edd206543d4fb68ed726ce7c3ed26dbb7ab39caeda2fa51f1f168b10ae7627d25cfa51660e7d599c9f2e1683d184388caf55c20c1a9f691ec325f7a5f89bc3e9c8a5a8620abb73070226ffd24fca570c6c002f4deffa80e1620b131efb195094120ab9a518f0dc974ad4ef63e32ea5b1f95030d04e243a986bff7be7bf3e0c8d2f03b868844beb5fd040db42967d2c2ad873867d9fd6d26f129b7ca3afc4eeee783127dd5a2f3828ec4f123de16871927963e2b5626114fe9894e1ce6365c80d7e2ec7b50ee0d04952f055b3831e1fb020103 -Msg = "" -Sig = "" -Result = F - -# The signature is a valid SHA-384 signature and the validation is for SHA-384. -Digest = SHA384 -Key = 308201080282010100be5b5613b7872a0cb3e0fc3908d0eca9fc9c37887d6262d315c7425f300c56413c18e033f2295671bb843525898d32177edd206543d4fb68ed726ce7c3ed26dbb7ab39caeda2fa51f1f168b10ae7627d25cfa51660e7d599c9f2e1683d184388caf55c20c1a9f691ec325f7a5f89bc3e9c8a5a8620abb73070226ffd24fca570c6c002f4deffa80e1620b131efb195094120ab9a518f0dc974ad4ef63e32ea5b1f95030d04e243a986bff7be7bf3e0c8d2f03b868844beb5fd040db42967d2c2ad873867d9fd6d26f129b7ca3afc4eeee783127dd5a2f3828ec4f123de16871927963e2b5626114fe9894e1ce6365c80d7e2ec7b50ee0d04952f055b3831e1fb020103 -Msg = "" -Sig = 2c8b7d5fc1db73df3bf806af732324c19c8374d486848aaf3f3e8f81a89f425987684d4af644d953046345b7ec65022c8658dc144aca59de421de359c54aac4f625f85a2f2092ca3cfff99fb179d5057415cea4b868fa047045071a75b9de26e9a09c69b2d545fa5f8a8d63486a17feab184f8a227a7628d5a3812b66da388fc20cd96df69a6a59da154c0726828588c7df9abdc64090e40a62c8396ceb84067f637680625732e9dd3b277a366977bb1bddeea2917bcdf259f3ace8162222c52d86e394364e28cc1c57d2feb5e9d9fa4a51b88555b9c40a1efbb6846bf6e9d56ce2a43d32ad767e732c81ec598a1f0217c03c7533099b50dc8d0bfbdabe9625c -Result = P - -# The signature is a valid SHA-384 signature but the validation is for SHA-256. -Digest = SHA256 -Key = 308201080282010100be5b5613b7872a0cb3e0fc3908d0eca9fc9c37887d6262d315c7425f300c56413c18e033f2295671bb843525898d32177edd206543d4fb68ed726ce7c3ed26dbb7ab39caeda2fa51f1f168b10ae7627d25cfa51660e7d599c9f2e1683d184388caf55c20c1a9f691ec325f7a5f89bc3e9c8a5a8620abb73070226ffd24fca570c6c002f4deffa80e1620b131efb195094120ab9a518f0dc974ad4ef63e32ea5b1f95030d04e243a986bff7be7bf3e0c8d2f03b868844beb5fd040db42967d2c2ad873867d9fd6d26f129b7ca3afc4eeee783127dd5a2f3828ec4f123de16871927963e2b5626114fe9894e1ce6365c80d7e2ec7b50ee0d04952f055b3831e1fb020103 -Msg = "" -Sig = 2c8b7d5fc1db73df3bf806af732324c19c8374d486848aaf3f3e8f81a89f425987684d4af644d953046345b7ec65022c8658dc144aca59de421de359c54aac4f625f85a2f2092ca3cfff99fb179d5057415cea4b868fa047045071a75b9de26e9a09c69b2d545fa5f8a8d63486a17feab184f8a227a7628d5a3812b66da388fc20cd96df69a6a59da154c0726828588c7df9abdc64090e40a62c8396ceb84067f637680625732e9dd3b277a366977bb1bddeea2917bcdf259f3ace8162222c52d86e394364e28cc1c57d2feb5e9d9fa4a51b88555b9c40a1efbb6846bf6e9d56ce2a43d32ad767e732c81ec598a1f0217c03c7533099b50dc8d0bfbdabe9625c -Result = F - -# The signature is a valid SHA-256 signature but the validation is for SHA-384. -Digest = SHA384 -Key = 308201080282010100be5b5613b7872a0cb3e0fc3908d0eca9fc9c37887d6262d315c7425f300c56413c18e033f2295671bb843525898d32177edd206543d4fb68ed726ce7c3ed26dbb7ab39caeda2fa51f1f168b10ae7627d25cfa51660e7d599c9f2e1683d184388caf55c20c1a9f691ec325f7a5f89bc3e9c8a5a8620abb73070226ffd24fca570c6c002f4deffa80e1620b131efb195094120ab9a518f0dc974ad4ef63e32ea5b1f95030d04e243a986bff7be7bf3e0c8d2f03b868844beb5fd040db42967d2c2ad873867d9fd6d26f129b7ca3afc4eeee783127dd5a2f3828ec4f123de16871927963e2b5626114fe9894e1ce6365c80d7e2ec7b50ee0d04952f055b3831e1fb020103 -Msg = "" -Sig = 21f1d78d3d3d02eaa30886356f494fd4ce060e12cf4a808c3a4a8011164f948a1b15414f6fe0bafb174468e632b7b843059dcaa2d915028fc79e3252b79060801373a16b6d26e5bc399d66201357f284ac822544176f5d7bbcc402be5335d221deeb2c44ba1cc908e10340056b521a0f965b373cc042dd2b3e3bef68213cd526c78f0a5237a7c1aa74989d86420d0a0cb639362e2f49182e1c4c603e7dc1b494efbc581caebb03fb633720b643e72d524c8403e500f5a7be5caadf5ed0a9653a805df917d0dafc4e589e26373a84970ce6905359ae981bd3d56699132be04dd3ce02bdaa399737ef79c2f3352f4f4ab8ac1f0954111dfdd7fee5655aa408774e -Result = F - -# The modulus is 2040 bits. -Digest = SHA256 -Key = 308201070282010000e9bcb0e5fe68c4ebd4dd299f1434ff2378bd1e5261eda8d7466d41e1485a92118888306dc03a7a448f459556fcc2375cf8ca4f26ad2b4203952b6b60f4f23d834e30f19650753a02e44606f39807d9c1cff27114e76cac6d4ee02e3c68aea27bdf5037ce912212725af0294cf4df5173a61349ddd40f1c21bdd4a876d1b52541e1a784d11e1ca5e1615ba0c8f978534e9de112c379f530a31014425e907c9a881449c90c764f12f9831dda121ea43c7c034f5829ce4fd1445749ee461f72b763b2ab4d0cf838d48140499564985132a69dc537259905cb69dcdc658c593620c26e822ee7414c9adb1132341201689a30efa1ed733a6b5b149c81a87e02ae0b020103 -Msg = "" -Sig = 951cea8d14c4fb4ae98746e4c404105f63e880692584155e7f6aa053e9e897ab07ebabf408860c0c725d454b0d206eec7668382dfb2d005f31182b1836ba1f449eb5dcfe026bc500fbe41250070e8f148bb8e4011a5730d1e4f26b228e484fa8c1211234a2d599c55c678cbed083a5dbe7857caad189cb7dd4ec3db5f16f2bef13aa2c517c3ad13511615c6171ea783c742ed87a9d451a73b968de26c2928313ebab7cabfa824988452cbc606c3968c8c7b41de733d9b6f62425512a64f89cd235681abc8498797980a646c51c3ae5dd18fbefbc813637fc6d633bb799d7dbb3c725b2f16b4b68bcdb5a4a859667f5bacb365a358d9266dd2158dbc1bed112 -Result = P - -# There are a ton of 2048- and 3072- bit tests below. - -# The modulus is 4096 bits. -Digest = SHA256 -Key = 308202080282020100d3f6c3ad0a0d40b3ff8048991b6a9ef9f3255294f0d894a1c8917f36d9490ced4471f75a407d34659f319cf9f7813e0201e2a469eaf9ffbe77c7ccb0347c4e34b130efc740ebf83d6689b8aee89292f94f189c717d0644cde45c147358b7575c5d650de0b5f4d28a1745da3cef185017c88ddd83235c5576ef5280a042782cceb12aab22f12ae1378f46d46310028f45a157846694537ab604eb6edbda4fb5762354357005baa8d0867942dc363d3016cab6eb2c7eb5bf5e184e8f0e2e82eed23982647b6d04237f22dfbfe1d444b7220325acb6cd96d9192a233246c2fd650f9bf193c3143ae0cd7f333118b255fe79fe333afdf84fca8485f7a5b0f69ca2ed3c95af14c6f9ec5e37625a091c9dbdfb46ddf625536d43d10fc97f4e0cc1c828665075fa9e40fb7178eedcec9134b51c6d6d504b1de02a773206ab2d467040001ceb8e18e4ec61d03de82b5cc2a317bacad1229efe228e2ab751616740ca2951b9620536cac4eb36db4c9b24c2e05c6511ee09c7ff9729c7fa27ae10b26b156f15c9fef683f67107f5fefac7fec4084bd8cc535d9c7a14733715ac37bbb5318604905e6dcc48b6c78be0fcadf6466407f0cc6666d46fa2163799c7fdd8518a4e4643dc83c1cf7de96d905233da230ddab73279d526f3ab36d2f63f17001f8f0f8c53ac8767f9ca4c9c10c9a0286f3c9b5d3fe4c314d542a1f54b6be1ff05efbf020103 -Msg = "" -Sig = 1dd98725ea75fd3e262b8b6846be45ced065073ae5c1c98a532467359c948bac4d3ed0876bb46fa450e47f964e5b34f806f8340e7987b83cac22c76eae7ed03f98ee47c18b09e0cdbbda07deb2190c8085871b18ca52ebfa06edd5ce83a4973cbc803879f697313d279f02f36289e382163c6de83327f38452c1018d926ef1b2dd0d3a1bd01ceb06fc7e043eacec0db3786883d5d3a99b6502c24264e96e07731d2efa0b4de4e798553e70523555e5e905148d57a74becc1ca0800927e464cf950376dec0190bfb0224cff204ac0c9f62eb3c1c3ce78563a38cd3d0a20b4cbfdbe48b82c5ef27adb262ba65883bc0b6506f4a0d987f559e73d67133fc009d9062e23866db9928e9b1163681d9012bc6c072002bea9f2512f20fa61d3091a979803036e6deac801772ecec18f153d61d6f93cf01e592cdcbe435bddbc436d462991370de5df2b21a37106f56b60c4ba40965d3b1ecee4d9bfab548b38a1beba4ebfe60af8921d69bedc6e2da548e22e4d7b0dcf1d5c7f83bd4e96835fbb2ed73d6ed411ca042221e3b29a90a46579f76618ad324deff1bc873a1f1e9c727ce4b73498e255ebc8975d5ee3bfb4aa4883a60a33900451e7d51b60d21e68ab4f7e80296627bb405745ac14ae583e1658f3bfaea06385b1527fa4293e0b62beac3439bc8f85a87ead36fe702ab412f78c7e26b0e20ac1dfa1074453f660f7409000fd -Result = P - -# The modulus is 8192 bits. -Digest = SHA256 -Key = 308204080282040100cd39f39b27a2731e7b2fefa1379c55e2a86e3a6b6d623a37fcbc535bc9e6453752a06349a85e4133e5daa6eb322590f7caed50309194ab78c290248a041434abf1fd5cdba1ae2922a5616fcf63a8bd1a806e89dc19237f360752210c1f3e082aa1463745bc6072e6a6051d9168fab0b54ac11d3fac3888306f06d44f31306c7b916b50cab75c7ac9cc33610ba87a61d8bf08e471174b517da710d4d5afb4cbb2aee8104b2a6bc78c5c5d3101447eadee776cc96ad874ed4a2e1e941ff73daeeb6eaf9c7014741d68e7fc6d96038b63f07dc4b0b4eade9b3d6f4edd7e8f1b64606a90d9ee4e221c0fb35dd8cd688a5c60cb4dafd22648a0310b2d18a6a2cbcc30f6444e29d07f179847d2ee802399e4a6d98f688a39fdc667d3ba01cd9681c51172b0fdfe6234a329d8d66dfd7709c1eaaecfd747de069f8bb750f0659020e1530cf10197fe95a0783d6c8651235e65868b0c868a1f10073da972050c0e2db911290e15e1a55da024679d3ea266ba3fdd16338827cd2dfe76e3c6c00f33dff27e6edbae1d2e19f54e0c9528a27a75e1247e25b15fc38465e5d6c42f83d9b2f5ab69090d62bf99cc829ec05ca7a1fe3fd9f24f3c08c4b4d531c30c1693510ddf1ce8f296dc60d3076f971c838bca793a75579d8368ef4427215a52d02b28d760a4ae0801f20383ee241f20170081d432124b80bf98629b40b25cf99a328fba652fe35bf4cf63a3946522c78ae874cb77c95989eccdc91ef39a9ccc0d86897a04d4105617c4ccd7816002d89f8ba94a936e82f8d15e615beb4993c67d5c02d606a8395e7319163996d042dcb086a7171bd2df268e2bf229f16a6392cba67b10deb571d69c73acbeb3d5310e24685e639c1b4a02f32b661c630199d62e53d319f4d64b50f90eb5d582ac200a2989e4eec5deb1c9d936300a1d59682eb483cf43ca0131664f647cf0768f12cfb0ba0dd92631ae89ed702bb485581fa3588bc344de1dd05201ddac68019750ee3ff58cf8ac40d45735f4894911e465823e8f0bc4bd3d0b0ce8db310657648b9dd327295b5a23f45e154be6222249fb07d31e6c251848c87544dbc22d5fa5d3475c1c16bf4407819d27415e9cc62e7057ae3fed23eacfad77bfb87b7dc48e4bc82c18654d09bd969a688a840871c005074507c93149d2aa46133e8c66ed10320fe4cd6e4d4e01331068e5d011ad9a4c94ea91287ba39a0647f70820bfca29693457a7446217d9f225df9ce6ee54c9674cba0e5a5c09ce27b11ff9e8b1f68c517712c23beb8debccc6695229c3415f58a8ab158e280bd4b54a4bbf279336bf1871b3e635910081311aaf713f21f9eef5f62b9ecddc49efb4e0cd686bfd65420e6f11022cd86d237e7414bf077a9f8f7ab210389cd455c6ae580f1c77fdcd1dafaa1a1e1a3726b6ce13f50e7c2617a152d10ec9cb03fe0d020103 -Msg = "" -Sig = 3bf15ae5d08a7eaf53c7e6c0f1a789a197ac9aaea21b6c2a14ea9a6175596c92432b224e9219d68f7d58649c476277d8daf5d2fdc61c80ba6eddc513ea0f91363eb9506621c8b32381ae6d0eda72984b2f450fb1aeb144e6c798d0af5117dd35fc4a27163d258a5b227b9e72b83c4fd72886f616b50d59c0886f6aa291b65b4401dfccb855d697bb7fe9ed7e29cda28df50736d3c2b66cd3a039d2f534b580a00395746962bf8d1af5fd4940975aa6ef17cd11b496ef11c3df9aab7434cf4802aae07976e685941b47df1a7a24d097cb19301cd5362d6d742d0f94f6dce97e54cde999c4dd1e201c867c9fcc46d30295178430c2ed8d0f3699b5cc5a9de3044b7b63430bfce3fd7c333f291a1f31e41c71735df949861d43136356239ac51156cc5d11a92dc3bd2921cd05f785557a24a0148abb9678a93f8082d8624e9289a3294921855a1afae7fc41084b3f03829afa6e4abc9952aa9d07d7495427d169fc47d0739c31d71657d44a40ad17184d3510a4db56b4ab5d277f9814b9568686c0ce6b18ae4d69b0176fb3f5aa6798396c6fd390df61ecbccfbf72fc3fcf34dc737a6a6e22884f677b1645a68f65ccf36c90a23f350947b514f89e1521c329b08d109d032e13f7680a68489c97a7ba6cfe66d37bd3eda7d97adf9d49d1430e07d34279207c98d1a589b7aeda8c45b5bed17a75efed9ca22043d9daba1a024f0816568652baf51ac1c8338036614ac834b0f69c6539eb40396d53f5d209f434ecfc3d56bf8295d247cbdb559725b7eb61fe5a93f6b701a6b86c4a2474dcc1014c0c82041b68c817f12d9ed410f871e227abb3d25b9977c3129f70b4663bec7329930eaff732433e6f5df3506d0f714d6119facac3fee635f1e5641db853307f76723eb459f5969376433a7b3cb688175e5caa5e0472bd3ba059992e314d1cbcc318577222a587b4607de7211a26ef6ed73676eba26bc8f12badca267aaa43b1f582e7679d9bd05c1a67675822fb53e6699dcc0a713508f7d7d9f9a99172b48dbe431f54e6fa15e1fece6b33989de0b425b83a7866570e557ebe958b0e384146f592f62e1f708ee010d4020bd580f88e469723d4a2c55ca4bcd278c3971b9d0beeaf93d674b6bd9ef367e3c5c11f24f4356dfef571c7b1aa65162c2f7d5ba0af81e5394672f24aeb9c66d5e9a53c7d4b1d3c526215932a648d131c37cf0fcb03458f05ea8b81f5eec5ff372717e7fd64766798319eee066f5632e8bd9ee89084fa85015dd4ce1853e56a7146f64b6b3a08c9cd7209eaec59a34612b62a1350332631dcfce94db871d735fb5e66c3de124aac76aadc63eacd2b84d1aaa3e8bee57cd2c046f73bb115b4f8aa6b570a37e22d0dbd07552d9fa44ae0c30d884941e9567ef0a33cad9c5068a98799cc711e87a05752dfa6ab5b14d2c25519472f2f31f9d2 -Result = P - -# The modulus is 8193 bits, one bit larger than the maximum. -Digest = SHA256 -Key = 308204080282040101dd858d9b063d894acec656a9bb8b1920bcea0c963191c393acfd4f6765479331d50ac9490125572bbbfa1d551f9b1b8bfea0bb40ff09e581b35bde4e58a54f0e954a6ff639cbcee04c4498be5442098beef6cd9bafea003d6a582bb648a69a723f182251fd1165fddaea382e36a6868e300ec423d0198b404288cc21dc7dc659ba9e7c210f54684dbbb3fa07844761a3afa6de256596ad5b950924b5c50be17a3a9d54df53307202afbc80395b8e0683da5309b9eebd26344e54a328da2a259894626824b811b568086011983d457ba60628df4ab40d0dcdfd903dfabdb55439b10efe38526de229a8ba4c016c84263d857b9ed6c3c3922263e8a37faf23adf9836735e16958f9d6ac73f0129a4d159be1ab7bf991d72fec0ddffbf78d9161048d3c63781bc2e1f7e75f417b2e157f4954460ae9e8132fbaaedd399085bd4bb73f194ecde81539de336e8a04c51c13fc8433e26f12b58572d7a6bba4106dbaad2b1c253e5746d3006296383c72e4c4e51e0bac019f5b9e8f7018da482cf93485ccf6ac233f1d90041a0f5706424852fa57e0c9e5bf15efc504bf954682ee0e1f939b075cc798afe985c7e37f8d63096391f4b8c178cfbf4936ba3a2d115b0dcc73a49c98078a6d068c6716919fc8e81c9536cc0d028be1bd7b1e23be2745561b38d74904867bf2975d6bc1e976f91073916deaccb3bba69626b9547233fb767100a4cfb306c4cfcba1887b6e843cda76d2ae53773220893cdaaa1ab8efaa71f2fd2a6fb69ad96d6ffd4ab45ab38698b87f6b491c58e0f9cc57b9ec1ce669f074f0735f26e8457534fb90ab4a56cef04c79b2245898e58fc1f8f441a69b0e29ec236d1b886b6b086b231af034e5096da42b2fba959cadc246b3a6d7837f8e7bd50d1f6d4ad39431099de63ac3d94206ee296841319e7e2caa2adfe4143425cecc55958e705149265026e58ebddac2b524187ed422963c9c5a5af4633058cb39972991bf1195e641af30109cdee55b45506cc5716039da39e24621054f3105071a037680210e1ee59c8f8c207d73cd8ae1c86f9a393998a74829f980ecca27a1bdc160a733ad3b98703f1d63f07b41df9315f68e014127214e6cdc53cdedac3f77ccf7a58c7735918e49c682716d6b865ade2f7648d21c1dc5a18d24e19c271f3f743a6f37ca904068db40e6b1dead262b29a1d492bd3fd9c50c90d3c5d51072eac1273ee37d91a99e89bfd035f097fe25f7ac1c319a19271d5c46e4f78367c4cf2b017a18716c6e8794d0d04bf580e6bf853552f3501b60da05969c71ed41dfc530531e653629002ee39d3ce489b7bf634ca1a3c9e896f7a17114f4f237c18b555d73fd7ef8553dc94cfa3eb33b77ca25762ea8a8ab446dd8592f6a5ca82e263fdbf0ab143deff6e4187de56412b0f97d4f12fca9b4954fecddfa2e4a79457d63020103 -Msg = "" -Sig = dfc9e4e1c3106605f5b847463dc1809b58494d981d6c067aa9085c9147db821a50bff823e7ffbe20fbc731687101cb3e4abf421f59eec7b5baf8e1a20d31bf114ff0cf02cd0e4bb284c6c74caaaf95f97b0398db80c4f5e70de423bc643eef4a0a96303a6fc0c8d26b2ace4b5dd353f57eea9efe5b444f9cb48a256a9f41201030e1ee226d9b5d66b292de430a1c12be9f30f58d44fc005baab7e5f325711ad8e8a37d79388e0638851fd49b2cf7d977f197f789d2c3dd131a5a0e820c113683f91df9800ed0c68bf1c9f022037805f2e4a1abf02c4154e1420f5dd774a3e824b5bff8d028e21e4fa413c9e35f7293f5aaa4b900dc272c3b407891b536d8a2918128c2eee1f225b145e7a514256792b9d1886013e8c15f2d70258829760794412d8eb32bc749984779b5aec57c22278f89c30d57d97937a1c0536b39e66d00cdc11f2fac0095bad249d2c40504b68f611902c34ff653a782d25509007764b30bc051d4f51e80f806b0a19df377ba5a9d6a85642a5fb87f393b1a1d57f847dbc4cdc2342227d64641c615ed919f2cf05084feaac3f500472e4112d169a0025f4db7ebaf8cd26783518de44d1fb4d15bf128ab63198069a229bd615340b568cd4271bd0999b38d502ee3b2eeca8beb362a330532e8f05f3149101e448f1a670cd350f56217bba47d1c58694b4399dde01bd519b38f4bd5e98599b6a8281346fc23579c151b5f6c193d42156dd4cd819da340c7ed1f74661a75a1272925e317b4999f5c284d872b71942a7055b8fcd59ade776294b7c26d95608b4a94c6142e57e71dda5476f7bbe7751736052a679f176434ce1ec9803a0fb6305162712ddb5e6a25dfd392cba964e4b526bb5ed45933d37649c131cbd40437663008ed3dd0a3130bb2d621d78e01223a493035ffed6d0c9c47ff71fad5e4bda62bab70dc222a5fed7a3e08a708f25958eadf0484d9d5541c35b526ce93dc6abeb6ccc86ab3b342295c112c84072a63074ad87b4fdaa7964e59bb5ba8d0634e13a8714f750e84eb965d46f9709204abf9dcb9a0a39dc82a4e48fe1256069dcac7ace75d0a4c42426d2d0fdc2e82901f4f93b64d923c88a735870bd9e0f59bde0425dd9ea595193e8cfa4ccb331b4c82edb2ec727049a79d25d00e3367c7b9f306cca0208a119b759feb24bf7af5f6c226249d0fb4511f74e1626a50de4251e254b0228fb6aa98abc5320171f9ea9d597ae15046fd4a5325dcdbd49fc54093cf2e02186ca54e97457cfeef373d5c9da7d9e839445429db160af5bd43fde2f3053e0efbda241c750f3d7bb4d12df685a6d060396306040518741d8e0d492a3f2df43abf4988c60b6e6722588bfe2853834c7424c033635727a17d8a7cd4ea007d765b29863d58903f41b517e9d9e6085b422193ff90a9af687ce24d8a393e803106c39b7f6cd964d8 -Result = F - -# 2048-bit modulus, p < q -Digest = SHA256 -Key = 3082010a0282010100a0afb85b74105f49f6836183d67b92602b53ad0d7a65f32a21d8959b8722aae1ec000cb9f22de09b794d7446e04be02a782615a659ceddb5f3344b6e566970718124dc8b8bf23c5aaa7447b7f11905f828e91f1a844d535624b987704ecca430d04cfee0deef46e7e2da65a3f2a1b3aae6cdf96795d24073a07312867aeb414e0bd6c23d80bd9ce6266fd90dac7666b019c141e3516ed51ced0d62a0b1db189860406ec5b7bbbeb49031979dba118ef6ad131365d6bd6994e695ab084592a5d2470341e4a9da14167a1387ec3d513687b7d849d64da896d4038f72f8a8a516c6402225a53eb813c1eb0e675af8880433545a90404946d7d8db2716fdd63898650203010001 -Msg = 5af283b1b76ab2a695d794c23b35ca7371fc779e92ebf589e304c7f923d8cf976304c19818fcd89d6f07c8d8e08bf371068bdf28ae6ee83b2e02328af8c0e2f96e528e16f852f1fc5455e4772e288a68f159ca6bdcf902b858a1f94789b3163823e2d0717ff56689eec7d0e54d93f520d96e1eb04515abc70ae90578ff38d31b -Sig = 912209edbd684deaca5855ea6cc89ba16753caca12df2e18f56228f0c2ccaa3bb5e45aa2107dbe2cb5b5c3e1af159c858aa9f665df4433e5b8df78452da436310beded396ce5ab4fc3882ed72ccb1a2a9226ea4177deb2d341ae88aba789106cee2b25ad4049c47a46d05c94ebd39416674adfef4a212cf139a5283b8ec51d54c21461e302cdcbd8ce9f7659b7d88195912d706cfe30f68ca8419054e22f0be31f86e49135b86e3021dd43baec6a0cd24042d81f71f8a1e23079e6ab1f8cd7b3fec2882e93f6e724d3dec5a2e7883c56b8d9773036f116325bc6cb934968a780b66251e4583fde426e63951b8dc380ae29751ba5cfba759c4f192bc373775d44 -Result = P - -# 4096-bit modulus, p < q -Digest = SHA512 -Key = 3082020a0282020100cefe6a02d3b9919783aacc1e555888b6aecc45c76bf28f0efc673a4576d44db983f5669fa28bf31966d1124d01c0f1e9976796a4f7855115f74b59f65aa17d3e56b3a265ef91463a562fd2e770077cf7a0cfc4d0903c812622a141076046bd2b334e2072e21b9cd9d949cbaa010d73fc7c1f5337431a18fc93930509c713ee4e773818134912d7cfbaab4b57038d645cca237b2fc367f76b26200894e174d3c4265f58765ca0e81e2525db528afabc5d149e60ae2aae8e313138b27c4bc901f9612728ab7a32564d3d93aff6ba0033c9e8db84cbc1a2f0de32a275318836c07f07c51cf5ed43c5c727a4e2541a78c91e6a7609edf4c1c0cdfc59fd63621223ff297f63096f876cfa93449994597ef27e47371ae5c3ad575b6fda18fcbc314eda54411aaec457d52e1a44da6ea0d6f43ace949f6a6e9d5a917edca6cb38b217e9bef4279b8b98dcd603ca299dc3173fdb3978fa6926e8a0dacd58162e9337b9c5af7f7260b2c4f4cde6bc7a71f1a56974b72c721c57eb925860562b744d32a65cd2577e70e8e00cfc528d54186bfd6c3fb84a081ee7f5c8a8ff388296f021ca13b99e5ca6e773adfb6a6b7206a23078cdcfb57db1f1cd7d21e283bbd8a7c1e8d2eef46008ad2fd440d6959ed18bb84831d872d79e1ac4260caf481faa9bba227e15a1b61bff8249c9b60d44056118969242b004059f85c0125b1fbc47cfd4772f0203010001 -Msg = 5af283b1b76ab2a695d794c23b35ca7371fc779e92ebf589e304c7f923d8cf976304c19818fcd89d6f07c8d8e08bf371068bdf28ae6ee83b2e02328af8c0e2f96e528e16f852f1fc5455e4772e288a68f159ca6bdcf902b858a1f94789b3163823e2d0717ff56689eec7d0e54d93f520d96e1eb04515abc70ae90578ff38d31b -Sig = 98a95ccad59ccd39b1da810b53c9c0ce7b4b0acd65c0ffb788c88c856ea3ecabbe7015d4bf36b7c3de7c4c7c18063428afc567b94d4396048cea1a3b56544928e28b15360f9f5be7e700eb3b4d64b47061df1c0e096015bdf1329ef7a8a507ef56fa9330df4b1f3f097968839a60d1a6f1bb5b247032dc60b2889085d1dea210cff53c444b3f614d051cb41d8f171df025712bf57497f57e3c3e424685a8858f431a90d689dc1f7b41f868f0e1a6ef612710f365ff2bf90f2db89d61d9ab9fffac16581daec6ae1ab9f49c8dfd33a55f7b1e431fdd413649070e0a915f25363d3ddc2091fbfbf0fbeafe49753038dfce6973458af66a3d318eb7caa44d3fea95c46f40976398299db270e04dd20e77360013fcca04874307590429b13301be5f47a9681af6a47e5eaa53dc7ea05cadeef4ac96bc2c8e14ec9d0966e035898525c92fe7f0bc3a8996246f42da5dc0fb14cd856fe5bc51c031b3d83870ae89e9cdb1cbb2605b3f8bf4a978435c80a0e99a1a60b4e1a45d77458ec39fbf0a65b9b5891738ddc44edede2614d96e62303f0138051ab899e67bdce065ac5ec8edc6b591220b2522f8f4920bd9b7d4084b30d9a79cc658de0260b6e76acd7efe0d5c38e7856a7dc22bfbe287fdf88ca393f6c575cc1db8f0d8e47b0456e5a392f27e9f2b0352da61e58d1c1ba23b32de9f82ed35cd862644d63ea6a3f09b3642347ce6 -Result = P - -# RSA PKCS#1 1.5 Test Vectors for FIPS 186-4 from SigVer15_186-3.rsp in -# http://csrc.nist.gov/groups/STM/cavp/documents/dss/186-3rsatestvectors.zip -# accessible from -# http://csrc.nist.gov/groups/STM/cavp/digital-signatures.html#test-vectors -# with SHA-384 digest d63a32378adebdd6450ce72175b76baf06e137d1d0091c18af157ee772baec79df341125789e4f23529aad7c13270b5a -# filtered and reformatted using ./src/rsa/convert_nist_rsa_test_vectors.py. -# -# Digest = SHAAlg. -# Key is (n, e) encoded in an ASN.1 (DER) sequence. -# Sig = S. - -Digest = SHA1 -Key = 30818a02818100dd07f43534adefb5407cc163aacc7abe9f93cb749643eaec22a3ef16e77813d77df20e84a755088872fde21d3d3192f9a78d726ef3d0daa9d6bc19daf6822eb834fbf837ed03d0f84a7fc7709be382e880e77ba3ce3d91ca1cbf567fc2e62169843489188a128ec853079e7942e6590508ea2faab1cf87b860b21b9546442455020400fe3fa1 -Msg = 98245960c6d4da684d9da2e78cf59d2a63ca53ac39740c9f44e837c9042e0c911115715a17251a0f1fd5f5ff10fec5ec75900c5e80842f3d4f11d59f6f2390df9f09bfefd66db3ef878a10fe23997650e08c6180b9ff4e28b56c20b06d9ec163c8680cc80a96eb2f0d24bc8acdaefa7e2b2819baeacfb188fe5fdfa10687e946 -Sig = 1ea751e8c5329879a9003f529eba19514c153ee0bdd8caac9c94fbbf95a41ebdb9ad54a976bc1218a94b53e69cf3362b0472a8781b8df4af3e9aa584099c71f9622a6fcc3fd3935b033f68c1c970676eb6d2184056f1b524acec26c51df6dbe9bf3b4e1fc144b8edf563a03f28ad78d457485b4a57ed0ce81e409245f5ce1014 -Result = F - -Digest = SHA1 -Key = 30818a02818100dd07f43534adefb5407cc163aacc7abe9f93cb749643eaec22a3ef16e77813d77df20e84a755088872fde21d3d3192f9a78d726ef3d0daa9d6bc19daf6822eb834fbf837ed03d0f84a7fc7709be382e880e77ba3ce3d91ca1cbf567fc2e62169843489188a128ec853079e7942e6590508ea2faab1cf87b860b21b9546442455020400fe3fa1 -Msg = d7eabc57c2803382d1deb56a146767ac80c89183382e01990bb5aa1d3d2391168ad6eaf768fb7d738d014f92b14d7f0595306eb7441622a49800edee0134492d82320707fceba902af2e0c95fe634a85727bde6f022709a09248752db9a71941c7e75cb107b87dd6414d329b830f8fd521932ad3fbc97d36fe778b03eee6c7f7 -Sig = 9dac630d264a6a53cb81a6901ac0baabfb24d73b60ad3a4ed3a0eb98a2118a573c3cfe294178fbee63da7c27c5826fa5e6d1682eb254da53a961ba4473672f57a27aec22d4b205f79819ab4cb18b0f3842684bbdeca71cfcbc30d1866d22c9f1fa9dbe9e1a2f5f6f68fd4fff6909fd2c1a9904204a3cfa30da4c87de35a769a9 -Result = F - -Digest = SHA1 -Key = 30818a02818100dd07f43534adefb5407cc163aacc7abe9f93cb749643eaec22a3ef16e77813d77df20e84a755088872fde21d3d3192f9a78d726ef3d0daa9d6bc19daf6822eb834fbf837ed03d0f84a7fc7709be382e880e77ba3ce3d91ca1cbf567fc2e62169843489188a128ec853079e7942e6590508ea2faab1cf87b860b21b9546442455020400fe3fa1 -Msg = 73ef115a1dec6d91e1aa51c5e11708ead45b2419fb0313d9565ff39e1928a78f5a662b8c0c91247030f7bc934a5dac9412e99a556d40a6469beb40e7b2ff3c884bfd28537bf7dd8d05f45419cd96bb3e90fac8aad3e04eb6190c0eeb59eccfc5af7ab1b85264be71c66ac25e53085c70b5565620152c32b0388905b3f73689cf -Sig = 25493b7d70cc07e9269a248632c2c89c8514fe8298ed84319ec664f01db980e24bbb59eea5867316792fec36cbe9ee9d3c69346b992377f35c08d19de0d6dd37482074cf5d3c5cd2b54d09a3ed296187f4ee5b30926a7aa794c88a2c0f9d09f721436e5a9bd4fef62e20e43095faee7f5f1e6ce87705c27aa5cdb08d50bd2cf0 -Result = P - -Digest = SHA1 -Key = 30818a02818100dd07f43534adefb5407cc163aacc7abe9f93cb749643eaec22a3ef16e77813d77df20e84a755088872fde21d3d3192f9a78d726ef3d0daa9d6bc19daf6822eb834fbf837ed03d0f84a7fc7709be382e880e77ba3ce3d91ca1cbf567fc2e62169843489188a128ec853079e7942e6590508ea2faab1cf87b860b21b9546442455020400fe3fa1 -Msg = de4dc041a283c488187ef9b75e701ab0a25d6ab6e5cf9cc702ccf02cec05a04e37507acbda58cec933938a8b4b75a4425ce4b82590ebf3c30cb22f982dae5fdf11152ea85a95e32a2e45885a82dc4bbd9921247ac7a2b8b37ba97e157d6c20ae738424ffaaa0cb53137b394f8c0bd7c961fcf6de135cb53e589824cb62a7a963 -Sig = 1cbd45327f5bb1f7a86758ec9125d28cfbcc235fe18269442ea9bb9491241088c20b2652c00dfb08ed0f0002b7c6eabd5299174bcd42f96171cec53d9cee01fb52ebfee08089feaa4fc6e1da5dcf57d123da6a964f6d610e37af8a57ad31857eda5ebbbadafc6e02bf8f326fc4f853734b25cd56fed04ff647d50c3127fa35ed -Result = F - -Digest = SHA1 -Key = 30818a02818100dd07f43534adefb5407cc163aacc7abe9f93cb749643eaec22a3ef16e77813d77df20e84a755088872fde21d3d3192f9a78d726ef3d0daa9d6bc19daf6822eb834fbf837ed03d0f84a7fc7709be382e880e77ba3ce3d91ca1cbf567fc2e62169843489188a128ec853079e7942e6590508ea2faab1cf87b860b21b9546442455020400d20835 -Msg = c2721310ab955a702b78c23fe70032172922593c30ec9fc4cbc55bfb26f54605e36830c56caef1fe8847a3b82d1e0ee696536445943d2f8729b087b1537b88c2263503951d3a7408b2f0345e2c4ff0e2b9a05acdbc841e6a683918788e19c4d0b363f648663ecbd6d1fbdff98d9bc054bb91a39c50c956b5b0e876187fd6e278 -Sig = 4efb676a7f2214898257240803890a42c5b2e746928bcded262af27b68cf38d364ed7d5989ea93bfa8b5194d53708120864bd78367cb14dd76e2f983ee9190fca55468922cb3a7bfea38dffb704e81cb9bfba6a2b1b6c5af6814a812ac53befffa170a1e3f70e969078a9fe9bec58cc4c2d7891171949ce8c7cf20478b4ac1f0 -Result = F - -Digest = SHA1 -Key = 30818a02818100dd07f43534adefb5407cc163aacc7abe9f93cb749643eaec22a3ef16e77813d77df20e84a755088872fde21d3d3192f9a78d726ef3d0daa9d6bc19daf6822eb834fbf837ed03d0f84a7fc7709be382e880e77ba3ce3d91ca1cbf567fc2e62169843489188a128ec853079e7942e6590508ea2faab1cf87b860b21b9546442455020400fe3fa1 -Msg = 43226431830fd187e5fd0ff94bd3b4d1ab40074e12ac1d3ee96e42cf783f9ba3a8ee09220d564f14238e786fd85f736d4bfb01e2d4ebd1cd444ae82d6e314716e672c80308894a6e3ccf0d9e79f15fc108a1793a8b8ba43c3d8ba0987b1d45d384156b7c7d9008bcb82a982f3571c2f2699a38fe3f73dfb45d9930b8a8ebde03 -Sig = 34ba929fd60fa28dbe9f60c08d6b55cce37e888ac2adc9b714e5796a7a600e95449e70bac5814e3f6826df7b23512d17e343e62881c1a96970b254bf26503b0853ae509e39421c94ff844cb65683f84200acac3e759f191fdee7d65969b72873c77d1e13ffb13153940120ce5cbe2076675e844d6f7588a9ac129cbbcfaff3a3 -Result = F - -Digest = SHA256 -Key = 30818a028181008592b5850b9ba96e7faecbdd67e50ed5fb2018fda0bc6a09ab6345910fc445ac6bdb0e7a4c6b72c9441649c9e78109bbaa1d79f9fafb8794a1a06cb638bd8f3c3416d44c43cf862b8ac1d5006310b05a7760d341d07077ae775f1695061d3c7297dd3ab8fc5d03d09ed1602a1bb69891bb377fd0aad6cd90f8b207467db36279020400eef211 -Msg = 23d29062797ec367d664542872324b63a72305caed23d04b0834b594801095d7521078cae54c21f33f04e622793fbe3f70b19c45bee2fb8fe98dba53d9462b6c9060675c150ee491b1c849e75ef1806f7db60d6fc7399fa986efe5e00546a399458c051ff10c33c9947a257f0a91b97b35fa034df170e4224922de45eb5826e6 -Sig = 02d07177f91c0db0b74e34b532aa18673d27fdee370b7aa9094ef765c9a8278b7128f1bd24fd3992e6376f83bdea9e505be10de15163286a7c9d9873bdbcffe0535f9f8cb0dd99ba34e24ec462e4ad03618258b66894daeac9415545e030bd963f2beb8d089183ec7ff1be67e6f94e6871d42fb7d7c694682a9f4af599bfdf81 -Result = F - -Digest = SHA256 -Key = 30818a028181008592b5850b9ba96e7faecbdd67e50ed5fb2018fda0bc6a09ab6345910fc445ac6bdb0e7a4c6b72c9441649c9e78109bbaa1d79f9fafb8794a1a06cb638bd8f3c3416d44c43cf862b8ac1d5006310b05a7760d341d07077ae775f1695061d3c7297dd3ab8fc5d03d09ed1602a1bb69891bb377fd0aad6cd90f8b207467db36279020400eef211 -Msg = 1e422f898ff258a99bc53648541709b3a3bba5828d36d070b42bec6a2117d6e6403f0d762ce6179d2dc220e180b1e52156a9d0291eed64840787dc91c1f20fda841797a0547b32bb83b668a177276fc4aee64b21fefa391522cc4e7372dc5cd5f2b3152f8e1973aaa48757afc3df7041b35b5e91b5c317cc0be48a38bb3d837f -Sig = 2e37c8221597f7e2b1970c40a50db5fefde31b1dff1e9b9d6a70b023acb014971580eddf1d67f15d9fbbddfcdf49cda14ccb7516c33b787a3a3fd43d005d02de10f93ffc99585ae5dfaa766c0f1f5bfa62e50e76a059a4a1e814c1ee9836e01595731dce48f94aa1ae36d9c5165a3eb28013fac271e091f7018fe96ec26009c1 -Result = P - -Digest = SHA256 -Key = 30818a028181008592b5850b9ba96e7faecbdd67e50ed5fb2018fda0bc6a09ab6345910fc445ac6bdb0e7a4c6b72c9441649c9e78109bbaa1d79f9fafb8794a1a06cb638bd8f3c3416d44c43cf862b8ac1d5006310b05a7760d341d07077ae775f1695061d3c7297dd3ab8fc5d03d09ed1602a1bb69891bb377fd0aad6cd90f8b207467db36279020400eef211 -Msg = 084e3b56d68ea7c99068489e2c8080b9d3eb5ffea1e67eaea9c82af33935c5b960956ac0aec4d0ef3b0b71ecea50ebe9ef89a6c18f77b743279004cd703da91e01459b6516898b9d8ff30e1d3ca9fa6b5786135252cae734d410f6a1fe811627f248166c9645a27b9506665ca7f377e713c8eed97249d628b5314894696bd47f -Sig = 1b7dfda3e6da9e67ee9f207a9e03559fb5d7ec88f0310ac051e1e0612119214bcb11d1003bb5fbea088354c2a9c3318baa0264f67f0860f17528bfa63ee35f22908caf0e8e57c0ce63b334b747cc1a31ff90cdd550b27a34b05695a39d48e900a5e1ab4ce3f5030d903315a5dadbdbb0ffae04134a74cde2b99b8f8b5305759c -Result = F - -Digest = SHA256 -Key = 30818a028181008592b5850b9ba96e7faecbdd67e50ed5fb2018fda0bc6a09ab6345910fc445ac6bdb0e7a4c6b72c9441649c9e78109bbaa1d79f9fafb8794a1a06cb638bd8f3c3416d44c43cf862b8ac1d5006310b05a7760d341d07077ae775f1695061d3c7297dd3ab8fc5d03d09ed1602a1bb69891bb377fd0aad6cd90f8b207467db36279020400990d05 -Msg = c65f67c4843110ad555134fa8b9ec51dd9c93ff9ad5d96febffd6c95eaed88be3cd584f749c1c561c46bb11e50bd1bfd939202598cbd7c3e274cedce0f0e7ce3c452c8f6edf2d640ef904f1ebe20e8baf4a621e82041324e606942c83275db0b87609b8819cc2c93ff4776c47ece129d238f026e0ef3a07691dcd54bfa2c8b7c -Sig = 116b58e45693d6c80065cef13ab2f33ed6c4d3b6c5048ca2fac4c793b962c1d8315f6a76e379a0b4daa8e1ffe096291aa9c18b9a182d6f4c5b5bb6ed02b4a0fd39388e4ca5772165538aad34313696fa2a303ff024e25a301997f94860080783d87c7fd24f4eb7791a3b6be09c3f3ad0221ef8268444c40fd845617416119761 -Result = F - -Digest = SHA256 -Key = 30818a028181008592b5850b9ba96e7faecbdd67e50ed5fb2018fda0bc6a09ab6345910fc445ac6bdb0e7a4c6b72c9441649c9e78109bbaa1d79f9fafb8794a1a06cb638bd8f3c3416d44c43cf862b8ac1d5006310b05a7760d341d07077ae775f1695061d3c7297dd3ab8fc5d03d09ed1602a1bb69891bb377fd0aad6cd90f8b207467db36279020400eef211 -Msg = edf40a32aed24e14439d8db48e80d92c4c11035dedd30d90a4ffde5dba8439cd274cf0bb63c155807a90f2cf5fac7add8297ffc5a4dd642ceae1162031dbf746a2229b3586a7b71d5bc2d6ac27324e320c5f73031de10a1d7046010a74105d0885fe7368be8d5b340fbda2148f183f7213f1c8ddffeae6ab5cb907e32b2b525a -Sig = 4e6e6482b8f163fb3c32ff454703a037b9882eec1f82dbd675c94accd79a476e12a347d2e9b4745d30164ce8484635aeddf1116df40b516e6b2af497d27f2194cceb801922aa6d55c935ad166bc477c8e54ab29c07f432b0aa3808e17d28254a0431fd0267e389a6b852f10df0f9a2f317c6a6e762c7395e743b38341828ac10 -Result = F - -Digest = SHA256 -Key = 30818a028181008592b5850b9ba96e7faecbdd67e50ed5fb2018fda0bc6a09ab6345910fc445ac6bdb0e7a4c6b72c9441649c9e78109bbaa1d79f9fafb8794a1a06cb638bd8f3c3416d44c43cf862b8ac1d5006310b05a7760d341d07077ae775f1695061d3c7297dd3ab8fc5d03d09ed1602a1bb69891bb377fd0aad6cd90f8b207467db36279020400eef211 -Msg = b1bd4eedcbef7c57ecab2aed92cbd60052ddeb201181969a7713d53fa18ad16716a06d36fd341f1e8decffa5c41e1d695cf11861fbbfec65aabe0cf188e0b126bff77111b81d13308b53a232ba68c0ff1e1d3df82186e8802eb3a5bb6690c095950a810764730196d0283b1cda7166ca80a8836eed9e32f2ed3ac925a363a7bf -Sig = 7a0225a29a5f3e4592843c5c4d543d14ac544a3eeee9dd5e795ffa87c4e16dabaf07ef75363d773d89ca712df7c32010d3ca024ed84a954ff9625390e498d04e2c676f3c51ebf0a46fe22ccbffa53c52f9a292886e6a8b64efe5717c527dfaed41d2290c79c18ab28a96ab5afd2f071689653550a64be24fdb5f90a8014df659 -Result = F - -Digest = SHA512 -Key = 30818a02818100a9f1795fc64a9fac0edd4553ea5b722b34b5266bef29594fa80dc8c64d33c3459edbfd36fd7b85203dbe4ca17cdf7ae53e5fafdeed8e8a688264858db18124438a3bf3110a721d94276cd47d7e5c2e1547dd5cb80212d594571432506987dbb4a250de62eebdc19a79f876228b2c4d04a1b5910395a8714520e78b997b3b6389020400d43d27 -Msg = b2abe66d1e6dcd75149d42445705b71b7509d393ee38b7d69821850e4268231e98193c91473b88cf61a94e97021d27a9348e04c310bc72cf26091d5b1f8a9349a15e4bc8733ee683e256b41863537acb79be737cd98894d6cde614cad65f2c3b95221cfbeb9e6ef7604d7eaec1d03ae80d4127a493c5a55254607342ae0e755d -Sig = 3f8ee147643e685b325c13557f44945c99efeb0aeabe719ac1da3f6923d02ee74b0767558225548f276d4bab34e8f09c4909a251cdfd7be3cb7f57f4d8f4bcd01dff0fa532ac3116770f0527b56c4415df19fba04858e70703f06b6f02cdd6420d255a21953ae328aa17eb9e151ea1fc0916fe3f3506d8f14ef8e8e09f6e2e26 -Result = P - -Digest = SHA512 -Key = 30818a02818100a9f1795fc64a9fac0edd4553ea5b722b34b5266bef29594fa80dc8c64d33c3459edbfd36fd7b85203dbe4ca17cdf7ae53e5fafdeed8e8a688264858db18124438a3bf3110a721d94276cd47d7e5c2e1547dd5cb80212d594571432506987dbb4a250de62eebdc19a79f876228b2c4d04a1b5910395a8714520e78b997b3b638902040083a029 -Msg = c4d94f011bee04446ce78f805d6950a9de2c6e59f7afbe1fc42ae619bec5c2c53b070614399125c0570c72e0246085ba9c26e1d8f061d45e86689e9a4127d5dd028707896f2ba26cf35d114c054828c3ae67c24e453da8a07e47b53ca32f384220429a89452441ef48c2b3ed8989ff6f1ad659e27fad048eb2ad75266b43b59d -Sig = 4052cd1149655d56d50c46d65c8213a81bc71140558a0d6c0445a180b64ffe3a91a0f3e6c3e9312966927d68fa2b1cdbb342af9fe729c1710076008c123db4901ed4e4a68f4a6c17b8938f2c99a6ae81c821ef65cf7d18a1271291d669d1072581c34a1a4badf4be10b00d2a31e0d611769cfb8576a17760656a6f64dd6817ea -Result = F - -Digest = SHA512 -Key = 30818a02818100a9f1795fc64a9fac0edd4553ea5b722b34b5266bef29594fa80dc8c64d33c3459edbfd36fd7b85203dbe4ca17cdf7ae53e5fafdeed8e8a688264858db18124438a3bf3110a721d94276cd47d7e5c2e1547dd5cb80212d594571432506987dbb4a250de62eebdc19a79f876228b2c4d04a1b5910395a8714520e78b997b3b6389020400d43d27 -Msg = abdffe0b951a91c54c7f00e1ff8e98060b413f131d9cb5589a861a053ed7b1e203b2e3414415873222ae60f527f1e7b529674b737149b7401d4dd3afc3c08d8a57d519c44f3d36af04f7b46f5c6a33afa6b12d92c53637ec918283b37a53aab06fefa87afeb928a5bc020337e721035b4ac6ec5a618bbdc6becc33f9abb98fbe -Sig = 5bdf363c7381eb660c572eaecc4325d0e977244f0bc229abffdcfe6a5e69b29b905b7cc83aa19ca3fa5c50917575c51fc6c299fcfce3d368326bccbc40b2437525fb39c103f32fc9e1aa653e2938afe0921c39a94110443551872b17728f8719d6ab98cd188d4182b62f6063720bb0550bd4f468668f4f4fad1ee3e5c7327fbf -Result = F - -Digest = SHA512 -Key = 30818a02818100a9f1795fc64a9fac0edd4553ea5b722b34b5266bef29594fa80dc8c64d33c3459edbfd36fd7b85203dbe4ca17cdf7ae53e5fafdeed8e8a688264858db18124438a3bf3110a721d94276cd47d7e5c2e1547dd5cb80212d594571432506987dbb4a250de62eebdc19a79f876228b2c4d04a1b5910395a8714520e78b997b3b6389020400d43d27 -Msg = b375b0e73c3a7d7013a9972c01b240228821261ed4c3eff6efca15113472f42a06e52152c25cfe34f1888b9dc3307f3cb91b98a6a1302f9cc7dc0f916ab487676d5cbe7a4fa747df5dfff5ee2608f1fd3080096fe96a4beee06bd3f43574e1904fa12f67cc6181f9bed87d251481bdef5618238296b76c71a33f08427ff9292d -Sig = 5b5341b5bdcb35e167f488f1510513fce5a01a813ee593c97264b2867fbb0846d46166d0eb2e07b0d3804bc0d3e75349a6687c798d82c54333ad5cbdb4d13c452bb479e08a7fcc2f7aecda3dd3946f68c6f02f47b69869246f2c5edd608ac18aabefff4891dc3eafc561a8b4d745c46052fd352ee63e427f21973836587ac4be -Result = F - -Digest = SHA512 -Key = 30818a02818100a9f1795fc64a9fac0edd4553ea5b722b34b5266bef29594fa80dc8c64d33c3459edbfd36fd7b85203dbe4ca17cdf7ae53e5fafdeed8e8a688264858db18124438a3bf3110a721d94276cd47d7e5c2e1547dd5cb80212d594571432506987dbb4a250de62eebdc19a79f876228b2c4d04a1b5910395a8714520e78b997b3b6389020400d43d27 -Msg = 2cb9740e0c1b8867866aa81c64122295854ed681e8eceabf0651bf7a65bc23996acfc8566f4bf42c151b7bf7db94eb57f0fb065546477549e829bafb8d4a67086dd48d87533378edf41d992e7fcfc425759a9c36bb9f4b32eed7767af6566f68ded0adeae25c7a70ca78ec09774d16c8bc357f6d6f7bd441bf62d942c768a580 -Sig = 1aece09a2f10ad4a72dcb389e771ceeaafe0d2b3ed89423da09784089f210e375124e65c040f67c44d2ba2f65ca7852d33e508831ec58e592bb4c9c440959337048072fa09d38b515e64940e35bc2a84764c4864970cd6b7dc6c63d284e6022ed1661149a4bf0c14c83b6f6f5d9fd7e22baf43e9b569ec26d8c42c4a597f026d -Result = F - -Digest = SHA512 -Key = 30818a02818100a9f1795fc64a9fac0edd4553ea5b722b34b5266bef29594fa80dc8c64d33c3459edbfd36fd7b85203dbe4ca17cdf7ae53e5fafdeed8e8a688264858db18124438a3bf3110a721d94276cd47d7e5c2e1547dd5cb80212d594571432506987dbb4a250de62eebdc19a79f876228b2c4d04a1b5910395a8714520e78b997b3b6389020400d43d27 -Msg = 0da95fc957f922a88554a6a14b2be6d22599e1519c99f808c57797c30a8417872c0ee326898fda109b25f56cc2422a6743a590cc9089c3d6ca1c8a428432b7a7ca3b4f0a6172ebad51585e29a16198bc62edcbe4ef79cc2d7217bb47aa1be65bec18eb9f680b1d29aed5290171effa798a59d9c13fd3d9b6c65072fb05a86c4b -Sig = 96c37595427da33321b72448c89addd4ce9e63ae6e32a089bb780d57682099d35c92bacb405aa0979fb70725dbd06af1a9f6e9ad91457e50deeb5b91138db45a6b1e082fe3d9778355cabb6e7f4934f7d0d7a1ce0b8face619a9ce78cc024cdab6ac02f3cb6f8b6adfd1e0b245b227f66441b3863e8ee04cd83ec08b456b0f24 -Result = F - -Digest = SHA1 -Key = 30818a02818100931a92071b310602a55840b8c0aea51e3562513e81010e1b93374cf4bbc50cdd94fa1dcb8d8b609e5dbea182c052e06d2a1c454755d9a279092221dc52d132e55ebe7234728a7692763636845a122e8752a319c5cf5065fb7c576460996bfe1e1b4fd319ed11400df2e6a18461f1a39c83996fe6886ed41be89cbcde6c764fe9020400a71a21 -Msg = 85254daa44d5ba337cf350e0679f416ed930168fd179ea484d4cd698633dac5a8ea8e86c46f6e311d31b4a946263cf2f596f1e2ae87a1347e0e22a5ec9e337452fa557f23c7926e48c5f32bf3ccdb03644ab6e2d07a2091f299660bea17148da0f2382844fe7ea734ec7f0a71c624c4b43edeee058783498cf726000137049e2 -Sig = 6f47d4d0ef70bbc71de2d6a88e044c6920dd81b030e8cb2e422a25101997e4186d00ca17bb6520b6d92075c7ab58ab84c7f4658bd955de37327817e18c3142ea6222b240b260489ea4008227de13b0c078f83909dd65852bfaa01bc9dc7e64ce80f35503fa9badde585652c9cd0fab0e73066d83ff9f343d4137778e3c09a58e -Result = F - -Digest = SHA1 -Key = 30818a02818100931a92071b310602a55840b8c0aea51e3562513e81010e1b93374cf4bbc50cdd94fa1dcb8d8b609e5dbea182c052e06d2a1c454755d9a279092221dc52d132e55ebe7234728a7692763636845a122e8752a319c5cf5065fb7c576460996bfe1e1b4fd319ed11400df2e6a18461f1a39c83996fe6886ed41be89cbcde6c764fe9020400a71a21 -Msg = be5e8dae6e3a61370324e23ba572996d4c0d6288d32c21355162b12fa6db1da554e313e091a795259a40f2dd49edf5f3eaa05c7e4bbd8ba0121e82ad535a0d9062473a6be6bd107e2f9d7e4aca1292f65217ecf1883a71d9a69f449cf147f2dd8e92ec9996033b0a6d446fcb4f6ad83e2b79f92bb52b3aa9b7eddd42a72b3352 -Sig = 206f738f2df12a70b0a1f5670be0c9c0341a1931d8fdd9491268a08bb42ca8dee88571f140bb7d4abc60f82fd284319e06b44aa9e384ba4c38b9a427e44013a2eed009e196a840f357cafd47485a978b7050342a46df3c4840ee4c56b2dbe605e555a3e7f6045d163f0641b6dd1da51a48c1e497d24db15f3b1a959438e18fd5 -Result = F - -Digest = SHA1 -Key = 30818a02818100931a92071b310602a55840b8c0aea51e3562513e81010e1b93374cf4bbc50cdd94fa1dcb8d8b609e5dbea182c052e06d2a1c454755d9a279092221dc52d132e55ebe7234728a7692763636845a122e8752a319c5cf5065fb7c576460996bfe1e1b4fd319ed11400df2e6a18461f1a39c83996fe6886ed41be89cbcde6c764fe9020400a71a21 -Msg = 544c1e697305e865ac0c00da5c17d1d369449101d55c741993581f7799245f0736a41b65a6f58743e4f59b0cbf05c4c6300dd93debc1505e3423b2e1f4494c2b0c612872e9f23b225865e07f9cc3858cbfc0a42c25f9f688677ae3b05e833c857d8c2cd664866cc9b364b77d1cda7eedbd64dc18ac8bcc5fd3649a2efe5997de -Sig = 73d0492938b07e39e4f611ee7f50d4558537dab9ede3f44b49448d88e447ae07790f969ad8f15c327b540486135cdb6e0a9725eaab5e343b64700233edd13c43cdb25cbc2f5311558152af4b2818be52ccb8cd0ed4ec475e7ff75dc7d56dc999b3d15b319d76c5dc6f690ff977407c1789e9531941062881b6ecfebb6dbfad2b -Result = P - -Digest = SHA1 -Key = 30818902818100931a92071b310602a55840b8c0aea51e3562513e81010e1b93374cf4bbc50cdd94fa1dcb8d8b609e5dbea182c052e06d2a1c454755d9a279092221dc52d132e55ebe7234728a7692763636845a122e8752a319c5cf5065fb7c576460996bfe1e1b4fd319ed11400df2e6a18461f1a39c83996fe6886ed41be89cbcde6c764fe90203597bdf -Msg = c18b5b1847b7e397c39a6f90402aefc1d727f11418f31f17aca308ac3956230286c510c3e01c228fbc091baa9d1236f1382b6b13d688eefdfbb0f99645d3cbad965df12f76cbc49eb2bd33be494dc29289a0d38676ba24ee6b979aaf04773d3c3a7983c5d06bd1abefe13f360d849c8a13adb2d7be33cad1458173603deb8098 -Sig = 0e68bca9c9d1332ece050f6ca2cf697b7b00a3aef4f3925dcc34449be05ea7a732165abfbf808e0431d6266d4d24595b94b3921c877105c6dbea351de2047b8e7373f775958ca0e09a7da0fc0c74638d3d2b42a5fdf557d47039a0d3092304627fd2537f907876180a8ac3b4d6182fc8b515b3a12f3601ba002ec59ea0072115 -Result = F - -Digest = SHA1 -Key = 30818a02818100931a92071b310602a55840b8c0aea51e3562513e81010e1b93374cf4bbc50cdd94fa1dcb8d8b609e5dbea182c052e06d2a1c454755d9a279092221dc52d132e55ebe7234728a7692763636845a122e8752a319c5cf5065fb7c576460996bfe1e1b4fd319ed11400df2e6a18461f1a39c83996fe6886ed41be89cbcde6c764fe9020400a71a21 -Msg = 992fe15e5f63f165df61ba064f593894c4db4fbc489974682d6fabe4a1a0b13f82637af5739edeca2ff18ff91df64e8e25c75e11c3c13964598883eeca4b3cfa444a39595d95d54f6216e4adebd1e83ab36b8857a7e93de33dbb4f5d07f9004888ec06d446d03fba20d8a168e273705e17ceb3d81f9ae8ad810ff777823165f4 -Sig = 233ae74861a1c0db26a07165eef66954400a4aaf2f12a4f0b66ba5ac0549669c6688d5b35f1e5b1f8ee054dcfb87d3ffcf55ee5c3df6753f1cf838a109370f1709b1c77f6a8a5189c0eed565f930c01a6630dd35130cffd12ec4a02848d77f5a8661f42e087277382a36e504293492dfa8a689ff35d95343effe0baa9a9a090d -Result = F - -Digest = SHA1 -Key = 30818a02818100931a92071b310602a55840b8c0aea51e3562513e81010e1b93374cf4bbc50cdd94fa1dcb8d8b609e5dbea182c052e06d2a1c454755d9a279092221dc52d132e55ebe7234728a7692763636845a122e8752a319c5cf5065fb7c576460996bfe1e1b4fd319ed11400df2e6a18461f1a39c83996fe6886ed41be89cbcde6c764fe9020400a71a21 -Msg = ae004a585df79c01bff18adc7fffb88ff91c020e9e0208119a43eac4b59450c0776cae3a90cec67a77626e8f50cb934213357e48eb2d56bcdcb6e6cca999a1b2f5fce3e6a8367a9194e265455932dbec858790ff003e33f9a8cc3b0a380de30f6ed973c26dd9c22e6098f96760dd99779839c09ba6dca8b045ac70e829991fc1 -Sig = 3d954f484b59c38ef3103aa65ef334c81d8f4619f55148c2d95f5d23730cf6764accdac01405ab16ac53db30c4c00d62b2a34bd6fdb480b05e72ab02fe0bffb2d67d17f99275cb9ff17d87a1a78ee3531cd5221af5052e3e67b01e9c28e52bd99460ff28a40f618f3c7da8452f3c8172886b7350435dfe64e399e5483c540156 -Result = F - -Digest = SHA256 -Key = 30818a028181008f705d5529b5bf74600abc485bc4bb76deb9627088e51fdd26dd0f37bb3b98a9da4094d275d55011a844884122daf8b4abe99d43d918eb50d9642436647f60577c5f60fb9b810147a910dd7dd610318392dffa3fcc41f89f461bb5be85bf885b672cecf00da3af4d7d90074c4c0144c4bcd2d49145f8097648ec7230747f7033020400d90b53 -Msg = 10c21d2d4afdf3502dac1a791216d0c240b6b12061e0cf3033a7043380fd8756501cbe385d2553a6c7078aa909a3d2c22c2e9a743bd66503f6a8217ccab1b4f50163d916373b2ad80da17d8d211074213d76509fcede06f6984c95fea9e896b68b5f15d0be879f6f65429c2f40a4e066da587ca9043fda92815b09c103ec5521 -Sig = 0411589c7d0860d41c7d4fef4d604b4dca0b160529209e762d5fc73df911e7bfdbe16feb0def70993e64eeb66888e47b3613256dfe04e75142ff2b325fd86b8e02eb01e4cd05b05cc788f014c170d584d092b7220a66133d4f0e949457eddc567eda792abe49b8a8fdfe177c6b6e0d7ac4262e95fa87c1277c46a759f9723cc6 -Result = F - -Digest = SHA256 -Key = 308189028181008f705d5529b5bf74600abc485bc4bb76deb9627088e51fdd26dd0f37bb3b98a9da4094d275d55011a844884122daf8b4abe99d43d918eb50d9642436647f60577c5f60fb9b810147a910dd7dd610318392dffa3fcc41f89f461bb5be85bf885b672cecf00da3af4d7d90074c4c0144c4bcd2d49145f8097648ec7230747f7033020309ffbd -Msg = 393f6cd3c89e67def9579e586c945fe97d567bae23c54a2e18c5f0903bc9df0b32ec9d9d533ec800c55b57dae2432234e065a52db1fd00ef27a043e35c15e9215167a22bd53856daa9586698e19735d08dd7e7a3996568ddf289b027ea5b467eded903e316371954ec7654fc31389fa7ccd3c978a4a489dec1a6c0c4ae42ff08 -Sig = 327269d1d4d871a8be4ee49be39c5a51482fbe89d522c0d6cfb0ea6bf0c6f0b343a94222ef65058e27f5107e4f8d0ce20a064f19ac39189f221c5e62ad4fd7006eb1de620052bd35c268d5c1c6ee0f81e8b3f7f2977d2449167caaee2ca54d458108645268749651de6f7acaff09591d19ac99dc17d480ef3531ed4c14eb85bf -Result = P - -Digest = SHA256 -Key = 308189028181008f705d5529b5bf74600abc485bc4bb76deb9627088e51fdd26dd0f37bb3b98a9da4094d275d55011a844884122daf8b4abe99d43d918eb50d9642436647f60577c5f60fb9b810147a910dd7dd610318392dffa3fcc41f89f461bb5be85bf885b672cecf00da3af4d7d90074c4c0144c4bcd2d49145f8097648ec7230747f7033020309ffbd -Msg = 036f62daacf68776f409d0595509a596a544b085ec7649687390324e1db78538fa90ea7b1abb0d659f9d50231663bde208433e35cb0510b79ec375f1f6eda97e128f186cd5d7cee6d5d22f10b076e8339fe5251a4df005bce9da4a1b795f566b72f553778652b141be2ed5e8c84a0fcf92b1cdfc183e0fbe7a5e1b9351177248 -Sig = 56c4af89728a322066b8c291b4f03da5a038e4a44ffd9b49be9ee5d1a800da1c58e7a852218eaee853f9695dd308e1a5fd95b41a441c2a6bd124088868fa26f384c9ce87849b2eb5edac55cb95d5dcda7bfffea621b3fa66e6b200ce755b947e778fbae07490410509f5036a07280f943b7300562926cdca3b20097f1ffc24e2 -Result = F - -Digest = SHA256 -Key = 308189028181008f705d5529b5bf74600abc485bc4bb76deb9627088e51fdd26dd0f37bb3b98a9da4094d275d55011a844884122daf8b4abe99d43d918eb50d9642436647f60577c5f60fb9b810147a910dd7dd610318392dffa3fcc41f89f461bb5be85bf885b672cecf00da3af4d7d90074c4c0144c4bcd2d49145f8097648ec7230747f7033020309ffbd -Msg = 8c25bd2bed75a33ac134f9c1d445245fd8e580d6148fae11591c2b65382f271772d0941eb0577d2b748c99e7500c207b56efdd56cfa7852a302b47384956a4cec089810ebe987af0e8e47a8b91c488902d2ae4170983539e3adeb74ed451e2815c98ac827f0043930384c335ff3507a347dfbea02be9c172617da42f3fe98a37 -Sig = 56254367f71f6f1fc6944ebd29f8a5592095ebc73ff5222bd815da17bac7f12290f747deaeb29b98c98d31a3ea32508d7683a67d449c59a0d6c16b4855aaa7d6f170c02c5cef61c9b6889207ad021017094d24246c4c90a0de055f02a5984efb67481684667eea36ad6373c36712625fa18d3ed41b1dec22f3bfb0d534e52da6 -Result = F - -Digest = SHA256 -Key = 308189028181008f705d5529b5bf74600abc485bc4bb76deb9627088e51fdd26dd0f37bb3b98a9da4094d275d55011a844884122daf8b4abe99d43d918eb50d9642436647f60577c5f60fb9b810147a910dd7dd610318392dffa3fcc41f89f461bb5be85bf885b672cecf00da3af4d7d90074c4c0144c4bcd2d49145f8097648ec7230747f7033020309ffbd -Msg = 2cb9740e0c1b8867866aa81c64122295854ed681e8eceabf0651bf7a65bc23996acfc8566f4bf42c151b7bf7db94eb57f0fb065546477549e829bafb8d4a67086dd48d87533378edf41d992e7fcfc425759a9c36bb9f4b32eed7767af6566f68ded0adeae25c7a70ca78ec09774d16c8bc357f6d6f7bd441bf62d942c768a580 -Sig = 156747b263be659661e5e35e363d0523303ded9eec1e751575ab3a43156773a056acfd0daaa68625b1cc068458ff9e40ae167594bac846cca2b98bf6e5a4a01e961adfcd70206c05d66e3903a64b61afcbd17391ad0db529944fc2d0d7be3a4da8091cb75910f670d9515ee4f8ff3d62307eb54657e03a330e3cb0661e6fb796 -Result = F - -Digest = SHA256 -Key = 308189028181008f705d5529b5bf74600abc485bc4bb76deb9627088e51fdd26dd0f37bb3b98a9da4094d275d55011a844884122daf8b4abe99d43d918eb50d9642436647f60577c5f60fb9b810147a910dd7dd610318392dffa3fcc41f89f461bb5be85bf885b672cecf00da3af4d7d90074c4c0144c4bcd2d49145f8097648ec7230747f7033020309ffbd -Msg = 127498bf44b97a4a4ed7ad4bbc7c3781e2f83a53149fc95c1a6efa27def23d376866ec4b0c1c23e0e21ed1f677140f17c268b1965aa91b15e62d5749d4fb64024ee7d06569ff897ca026f0f282ff2f17a70dcc2ae8187fd8cfd241004dbaa6b9ab416c96c32b5429703930c543053e88782db49928b39cafc0a4e2d3b1f8ac66 -Sig = 1976fe18cf82bf6ba851626bf94509348f56866930c771c82a6e12c30735c283694a0eeac9337e407525e0a831ba7eff77299c6896a85050b960718a40d5e34b7bf71eae4cdfad0d91d8fa6dfe37f30679ef444ccd360971ddc47e038123b7eceb3072f370796122aaf0b9427563280222328fc0068ae1dbd39a033740789536 -Result = F - -Digest = SHA512 -Key = 30818a02818100c946321761fc295e104cac20c4003e8f6b29ba1bfe247458fd006e27da27dcac8438d1f1b97dd6189f5d98aef968c1ffe5e0976d8a6cb93e9e703519bace48c0cdebe292174745e9fe24bd1283f004a022d2fc3b03db09a0c38a095d064f9dc14abb0490241125af6744535e83d11b252306af61b7d231e843463f79ced2f60f020400a97a77 -Msg = 046a758cd3cb2c2030aaec074068234bf5026c6de0940205461c7ba87581b30e58d406744ad5c24028b9dbe4aa2ae104f39030db668f67dbbcd01b935305ccd6c927171aca022e1e26f486d027f2cf6d21cb29ea4ab19593ccf5a9f2191289f27fed1244fc5b580253e453925fc7d5cea83dbf6134027574a0128f8b6fb0d2a9 -Sig = 3c2a05b92025d230664c230d8546de1d970458cdc68ee8100ee53d5f3ea57593bfa3547a8b91ac6cccfbfe61013c5b313303016d552af8d6c2ef239b30da5c5560539db4cf242edd91517724afd9882f0377536e095f64d7d61bd3b3efe27433717c2d76802f13d676d5f14b561e3e12077c774840dc93d49e9e27a1547d13f7 -Result = F - -Digest = SHA512 -Key = 30818a02818100c946321761fc295e104cac20c4003e8f6b29ba1bfe247458fd006e27da27dcac8438d1f1b97dd6189f5d98aef968c1ffe5e0976d8a6cb93e9e703519bace48c0cdebe292174745e9fe24bd1283f004a022d2fc3b03db09a0c38a095d064f9dc14abb0490241125af6744535e83d11b252306af61b7d231e843463f79ced2f60f020400a97a77 -Msg = eeb93216aa9f6030b5baa3eb3a4bc92d941a0aa2d5bb3a16a2104423450fd30dfdc552ea989b170644d9db85a3686e4a1ddca8187ab2a3f7b0d527daf967667e29bfea953faecb243a07252a2e5ec982960f330aec83bd0577ae12be65dce46f19aee260c65fe4533d4c692003b4449da7bc92c052b6ef08a0a2ea18aef5b6a6 -Sig = 41a8bf967f62204cf9a0e94d9e989907e4d07ce93741be7de06d5c527185c80d60cfb90557dceff13190729582c3fa8af4c28b2a6a43af6e5a13808824541241297af16a138dd281f72a170a00f7d8ef41310ec904477bdab2c32f4e18b1bfd6e3d6d7fdab5d2a23e2450e0e2bae225cfa633d7949cf9d4210e7913d49e5d5bf -Result = F - -Digest = SHA512 -Key = 30818902818100c946321761fc295e104cac20c4003e8f6b29ba1bfe247458fd006e27da27dcac8438d1f1b97dd6189f5d98aef968c1ffe5e0976d8a6cb93e9e703519bace48c0cdebe292174745e9fe24bd1283f004a022d2fc3b03db09a0c38a095d064f9dc14abb0490241125af6744535e83d11b252306af61b7d231e843463f79ced2f60f0203030339 -Msg = f9ea187db1584bae05ec20b78eab1c5f0537e2075799ef8efc3d8773853eef3975e5dd10526c2db1fc07d58a3d251b1ba0f206a0872112f078ea27a5b84ecc7d1ba299001a4bea6326c7dbad3ced7018ba7513ba71ba4464fbbf8ccb4e70b2e5922b3296307feb8c2c341868b48b811ef9c6f39e3debedb42dc69c2c722d093b -Sig = 44b4e5e060265ab860dea7823d1a7d53a1f79fdff6ef2cd4e93ea86e59741817cfcdb88a5517a21b69bd9d73e2426c9429041c40a32845dd098a66cba52d147c32cbc5164144dab8d8642dcbe3dbdadc1cc7589de3a35383165eed8fda2602a54d8a02a9a0a992c95732933efa30c0cd3f4d95519e8d661247ecf9bc5464e543 -Result = F - -Digest = SHA512 -Key = 30818a02818100c946321761fc295e104cac20c4003e8f6b29ba1bfe247458fd006e27da27dcac8438d1f1b97dd6189f5d98aef968c1ffe5e0976d8a6cb93e9e703519bace48c0cdebe292174745e9fe24bd1283f004a022d2fc3b03db09a0c38a095d064f9dc14abb0490241125af6744535e83d11b252306af61b7d231e843463f79ced2f60f020400a97a77 -Msg = e4ae864a45eddc459a59946c7bfd18cfc119394fdf2520bb7612873923d329e89c1c76c3fb6a8cc95943635b9fbf47e599478cc04c9d7d578a1c9589c342f24f1e6b069fc8df90908c0fcabea51ce4f0d099b2f8a592a2db26cdf032994f1dd093229da55656d0e25c46335e341dd8398d9813bf910d778f74ac00fc4c0592b3 -Sig = 8b7a625dbea9214f23cfcffa0554f3a4d64393f80daf01d01422857dcb74772f48b1215750319376cbbdbccfbf241d4cee1f190df04e5bd03e0e4e24e1cff426174a3ad1695ba0401c01fa6711f99fcc91a6852b6c77b2284ae5454d5819278682e6667bde72a69f1c111d1aee504c5a80dcdc6747d19bb287e85cc785714eba -Result = F - -Digest = SHA512 -Key = 30818a02818100c946321761fc295e104cac20c4003e8f6b29ba1bfe247458fd006e27da27dcac8438d1f1b97dd6189f5d98aef968c1ffe5e0976d8a6cb93e9e703519bace48c0cdebe292174745e9fe24bd1283f004a022d2fc3b03db09a0c38a095d064f9dc14abb0490241125af6744535e83d11b252306af61b7d231e843463f79ced2f60f020400a97a77 -Msg = bb825caec83ec0fbb33fb18c1afed63805b394a219bedfbe0f4650906420783751f2752bfd98c2c3f2c654facdefe2723a6684b920c47fcc19895fd9250647499f7a86fe707b6ad982975980783c1d5e9cd580eb1836192d6a3a657f12aa1a918d61b7b087ae60474dfae9a681ab31031148b1be69dd54eae8a1890891d69715 -Sig = 064210dffdb7ea65e1de82f40e0bc3d450590dac4a8ad44427c2d6f13376fa9ae291990023fb678dfbe04a994cb84ac4698d71a613010d886d0aa6015aa092d52bbf857900934f8616444f69b137b651b61105bc64618b1fc69f589cf257d74c0a199c6a2bed8f26e58a0ba72778ab10f4419ddf5b9f3c5ec1c4390c8611713d -Result = F - -Digest = SHA512 -Key = 30818a02818100c946321761fc295e104cac20c4003e8f6b29ba1bfe247458fd006e27da27dcac8438d1f1b97dd6189f5d98aef968c1ffe5e0976d8a6cb93e9e703519bace48c0cdebe292174745e9fe24bd1283f004a022d2fc3b03db09a0c38a095d064f9dc14abb0490241125af6744535e83d11b252306af61b7d231e843463f79ced2f60f020400a97a77 -Msg = 6d47a76b64deb512410e0e8b8b53104e27125fff792a2aa0cccdb006f48e038931ba0c0057ecd0ed2cdcf1f412787892e636d10b27a817a45b519313aeb77f34ddb90ffd5223b2b49180955fd22f687defb966f381628f4946fe3816c706c6b937ebb74a9daae2d136a1ffb514a169770c44239fcf8119f7577da9f885a46282 -Sig = 311263208e8021d33f3125bfcd72677f28e6a807b359ea71bc87b466396e98c6bc5e361b26c4c858ddd129a8dc9cc4dba02b1f39b87a51d184c6a6a1652ae35759477f7939b275e71d09ed52e4fc07900c3ec90785c6b2d6edfe59059a8181aa07a00a56c3bd5dfee7618ac17e0f1ec4e8d252a2c61aaee69abf62212c98f44b -Result = P - -Digest = SHA1 -Key = 30818902818100eb3b1cbf5b0e88bd44b8575e6b40b618103dcb9a51d36e83baf5bf1ab6c0e4261c12664bc1a4d2216820e2dba9ff7c98b23b58ee86e738e0633dc916477e94be2fb8acf19f532842dbb2eb7911f8f7d884ce022395967e4442396e3618f875c856c73f6b89127646df29ff9971c0358fbda0a7673cc08c3f3f26d71411712a5302036ff82f -Msg = caa67650963439fbee5e64bb2f5f5a34f7a9d110ddcb2bfe609803fa1e8606d0475404db50f04613ec972347383ecea6353172847cfa815b2d8449102980c8788108c11b2e820f3802c83a09de86484726e3d5f17263664a860bfb2185c7e354610ad49796b43b721838d18989fe6f20b00623de27cf83d1537741b39923006c -Sig = dec7ad8721af589e22dda67098a77fc1b5dd0216dfb77caa5d71bfd6ae256b49dcd20066694d6c4f7b20b355d8eabcaa92a8d91e077fb0241a62be5e34bc1e577a5fea84af6903dfe94fef4d626709ce5d7abe4b1ce420312f928e00c0f62a4f99409ee3f11efcdd5e390ff2b69af600c9b5738915beae3b7f6d3cce8af4bad0 -Result = F - -Digest = SHA1 -Key = 30818902818100eb3b1cbf5b0e88bd44b8575e6b40b618103dcb9a51d36e83baf5bf1ab6c0e4261c12664bc1a4d2216820e2dba9ff7c98b23b58ee86e738e0633dc916477e94be2fb8acf19f532842dbb2eb7911f8f7d884ce022395967e4442396e3618f875c856c73f6b89127646df29ff9971c0358fbda0a7673cc08c3f3f26d71411712a5302036ff82f -Msg = 1ac33b15b4837e06f6be09f4c0e066cf9766f1154cf1988edb99e0399383288677b632c5e52adfdf75223a4424bcb824b2c7bfe248d464c65e9079f2dc51c7977fee98687fd4794f6f563d5f6445450b59c1ff95d24eadc9c02b68eaa5df64edf81475e5cba8d2bfab021a2fc8a294ea56fcbb163287fafec911b40b365587f0 -Sig = 1ea5f7437790531ab98e5bc93bffd187c1d5a25ec93cb35c02ac5f96b188483fb593ccbb27a4bd9c335657aaf4d5bcaac7c10c7943e4bb4aa66776d35bba92307564cfc7709049b7c9b59e4cce3c6c6cddcbd28d14a0d91afe6439cedc65bca893e6d4347100296cf5b37b889eeb0512121dcdc0ccdc8c10d9215260028be3c4 -Result = F - -Digest = SHA1 -Key = 30818902818100eb3b1cbf5b0e88bd44b8575e6b40b618103dcb9a51d36e83baf5bf1ab6c0e4261c12664bc1a4d2216820e2dba9ff7c98b23b58ee86e738e0633dc916477e94be2fb8acf19f532842dbb2eb7911f8f7d884ce022395967e4442396e3618f875c856c73f6b89127646df29ff9971c0358fbda0a7673cc08c3f3f26d71411712a5302036ff82f -Msg = 0c5b2ceeb622c694a8e3feba0d6a802b19713107f7c2c20b029b8612375680dcea49c10fb9ecf17bbf392ba20a590e784e7c1067da091696ccf7426b817a0c4f50e395b178c1374d564d61aedc05a2f13e9603cdeeff9ad0cbf45ceb96803331a5ef51dcdbebc391d7e549e56cb7651f5187b23f1aee774067597c9b5cb01c0c -Sig = cb554ca80e9c492edd709f35092850a63ee94cd42740397a19cbeadc30306169d47db14b8225e0115437b25c2e2194af74636888a6995d4fbd574c3f3e0ac5896e9864c702019d5f19ae4bf1a5dd3d0f23ba9b0a40b7ab49bf95779cbde4533f81469ee9da651e913bdb62e75c1f166a61a45712d2210cf1267444558710c8d2 -Result = F - -Digest = SHA1 -Key = 30818902818100eb3b1cbf5b0e88bd44b8575e6b40b618103dcb9a51d36e83baf5bf1ab6c0e4261c12664bc1a4d2216820e2dba9ff7c98b23b58ee86e738e0633dc916477e94be2fb8acf19f532842dbb2eb7911f8f7d884ce022395967e4442396e3618f875c856c73f6b89127646df29ff9971c0358fbda0a7673cc08c3f3f26d71411712a5302036ff82f -Msg = cc8e2868722310fb117ca3a52e1839eb85d308b8aa00ed0bf0b76aec8a70eba4f0d14d2d85c5a0e876ce2c8ee59cb36947def6c40a587aa07b368ca8e8a08367018e45b984de0d7f1aa46b977cc18c0cd9b7bb897cbb2814aa0ce8f8c9843e03c86c19f2ba95dd2ac4a466a93aae4b3b05055ff148517ecf43e286c57744a3e1 -Sig = 44263cea7850a2bd4204388df7a14cabbd0bc9f600c3a166d5ab003fc934963165dcb890c90c59eee6893f89fa98b4e162650ce853724e240ff642b68631fc2372a76dd72babe88954bacb6279fd3c92e63115869fcc6e7b6bd95116f9452878508b441227342d99f108dcb8b3408c0f2c49636ebf96e49d7a5b89ce84565243 -Result = P - -Digest = SHA1 -Key = 30818902818100eb3b1cbf5b0e88bd44b8575e6b40b618103dcb9a51d36e83baf5bf1ab6c0e4261c12664bc1a4d2216820e2dba9ff7c98b23b58ee86e738e0633dc916477e94be2fb8acf19f532842dbb2eb7911f8f7d884ce022395967e4442396e3618f875c856c73f6b89127646df29ff9971c0358fbda0a7673cc08c3f3f26d71411712a5302036ff82f -Msg = f2f47bb35772361b88df3595fb27bd1c4bc66da330e8d159afcf332a8e76b4890b749c6dce22ef991b0041214c55ca2a7f16bdf18c09d60f3a2a32fbb24e64d03306c55008c60b29b7471e787c29278cf5dde9ec1fc2549b818e579aa7f0f7afd2749e65eea6b554c47a74a271ebf9ca17e3989cd25b7386eec34a1157a494ae -Sig = c57b082915a8946942059dff585c079a5574f665aa7962eb6c51b8abbc78aaabc40904586bababfa5a9e98030f46db40e7b06320cbb924a16e886b963222c7ace2bec5dfce87964f22e07150124166e58f62e53cba5f6466c6e56caa71be4b5039cf16a43d414e40a56007e86ec995d923db42fb9ec1054cc1f1e4deae73ea81 -Result = F - -Digest = SHA1 -Key = 30818a02818100eb3b1cbf5b0e88bd44b8575e6b40b618103dcb9a51d36e83baf5bf1ab6c0e4261c12664bc1a4d2216820e2dba9ff7c98b23b58ee86e738e0633dc916477e94be2fb8acf19f532842dbb2eb7911f8f7d884ce022395967e4442396e3618f875c856c73f6b89127646df29ff9971c0358fbda0a7673cc08c3f3f26d71411712a530204008aebdf -Msg = 032daa37ba23c04da51121e7e470f7d21c1c377e0ea0d75f6fb43b93f304f0c5ac339c51922035a9636872f7ad2c7f042814f5584a9309a3166d045b3577f3a7479e9f7c7b2bbf055d466d49f0b8d708fdf537e5aa5905cb4eb26a8984fff9bf7f779afe9dcdc62b3eb3fa24d69d65a641c7e46f5779319fc18a58640b236ad6 -Sig = cc71562cb955efc4a5bd0239f688e8828d2268278cd8763761b1274386f7520cd54d229e1ca4799d7efcb6c3e908307ea9233198b148c3e4ece724b9a769abdbe26685238c6ee88299b24c52337eb8c4753d0af63d3163d17093e4da9caa4181f22f1ca36063f8aaf82ea2735fb7d9f0ac161a33e64a7fc89f68c29fcd3a8c89 -Result = F - -Digest = SHA256 -Key = 30818902818100a16c7fcbb8d6fc602277e9cebb1790bd14999ef7670400c0bd0ea6116fc72e29b868c8b62ada0e7b4cd351b5a76c177f158b4f724f1d287d66df114eabd68e3e8d12409b69f96e334c0daff79392d184b9102ea5c4ec13052bfc509d9ae76851e8557a417b86e9d37687d243cf48812ce621c5f39404cd6b22a60beef744a42f0203681201 -Msg = e24695128cc0f0e9905a6dcc1c54e481ef431c0426a13e2a51888984ccbb48864de601e8b927f04d3cccb323985f47cabde033f89b51035c3478f881f5e0fef64621deac6061b59f5e1ba5b8971fcaf22cda70bdddd883a021874621753e48e9f47d95242877292720cdaa55c29d564363bb3a1a953ea43d403fdc2cf5dd0fa9 -Sig = 88b9604e95ccc993514a258d5a6785836b3c0ceda1f9a8359b1ec9592100c9b47572fb17d2c24dbd6b99ab46c408b7bd4b8094a44d05c2cde1145ab516b36926358f980ce1eb2e92793f65f34f09a4053f8deb77025052e12922e3f14823859d7e49aa54b7a7f0b20c1672e1a278ec631f955b4c19da05dd9c1f4487a0e08f31 -Result = F - -Digest = SHA256 -Key = 30818902818100a16c7fcbb8d6fc602277e9cebb1790bd14999ef7670400c0bd0ea6116fc72e29b868c8b62ada0e7b4cd351b5a76c177f158b4f724f1d287d66df114eabd68e3e8d12409b69f96e334c0daff79392d184b9102ea5c4ec13052bfc509d9ae76851e8557a417b86e9d37687d243cf48812ce621c5f39404cd6b22a60beef744a42f0203681201 -Msg = 820e27d35ad139ca305e9eb26c128ff59dcac86f05522e7e5721b458bf437fa22396493ea93903647942bef4c4afcb0a05a021d386c300a0260fd4395bb55c7473530b061f6baf983115501ea5f05b64de5e00e933f1d8f1aa20cbd6033f319ff9ae37d3c4508490e23e1dd717bd862ab36e2b5913c5fe996abc60d6c2c945 -Sig = 519c717e336e7a28d648acf178931f6cb958684979b23e1d53ad32aa242e327699ca1a1f294feeb8b6ad8668b75a3e42ca4ce08a91c3fcae06c7974e6d9e23e622363cae4cdcd1914d31f38f95002b1a6da863e70c244411cb1be90ffea30ca4e345429e58eb751f676ea7ebee4363c552aa5bda5d57908fd5a87142db8d9821 -Result = F - -Digest = SHA256 -Key = 30818902818100a16c7fcbb8d6fc602277e9cebb1790bd14999ef7670400c0bd0ea6116fc72e29b868c8b62ada0e7b4cd351b5a76c177f158b4f724f1d287d66df114eabd68e3e8d12409b69f96e334c0daff79392d184b9102ea5c4ec13052bfc509d9ae76851e8557a417b86e9d37687d243cf48812ce621c5f39404cd6b22a60beef744a42f0203681201 -Msg = d8330fa49a0a75f27470a2898ec1134666515fb467ad6b74be23dde26984d3f59028d467193307167717a2abc25aa6790d9acaa8f4ceb49274ce6f6d00161a2bd0c6dd9e7dee22e0cb0901f2c5c7fba31010ecb379453b39d0c95442f9c058bb40161291edc32e16184ea5a7bf907c8c16bbae1f1e9b6730791b72a97d0af56e -Sig = 5a692ebff6a43c5e63602018577fcac17415fcec4087e4c41065da33dbd7d87862de2e0c003bef2ebd0a411884811c7fbfa893590ea885acfb023857b904b0aff0e5061f2fe3376be5ae4de0510b2c34be6e0192722e63dd6f3fa9a7f8a191b7160997c463d7f7d46577e6cce534da08d1e5245b3a03b780f8144070cb66e6ff -Result = F - -Digest = SHA256 -Key = 30818902818100a16c7fcbb8d6fc602277e9cebb1790bd14999ef7670400c0bd0ea6116fc72e29b868c8b62ada0e7b4cd351b5a76c177f158b4f724f1d287d66df114eabd68e3e8d12409b69f96e334c0daff79392d184b9102ea5c4ec13052bfc509d9ae76851e8557a417b86e9d37687d243cf48812ce621c5f39404cd6b22a60beef744a42f0203681201 -Msg = 243db9a1c203c792db3204bbfb3cea400d6e5efec0c935092f0df759c016e3c04c6b331f8115a1da85ad2989dcb911f18c3927327f7c4a4128382b996ada552eb51b6ba372d4b1bca113ce16c06ed116ef97711f53319908b8e224cd7aaae584a573ea935be90121768b7cca6f0232977fb2c62d03902c442533685bb92d99aa -Sig = 8d1a40fbd8186e3cd1dfbb529e1ee9ab13a6c8e6cf04e663a4de2349c05334f0ab3c694ea89397ca3e70a2a1957ac75a6544842af88cbe3ebf641f68cbce75638da1c953c3f594f8ee8b3825ab4aaafb9fb152f05bb7dcc07e3b666ca8626e69bb262bc240398007b871b7790eca96512d64f3ff94470224fa075ce3164cb1e1 -Result = P - -Digest = SHA256 -Key = 30818a02818100a16c7fcbb8d6fc602277e9cebb1790bd14999ef7670400c0bd0ea6116fc72e29b868c8b62ada0e7b4cd351b5a76c177f158b4f724f1d287d66df114eabd68e3e8d12409b69f96e334c0daff79392d184b9102ea5c4ec13052bfc509d9ae76851e8557a417b86e9d37687d243cf48812ce621c5f39404cd6b22a60beef744a42f020400eefc9f -Msg = 186594f37c9ff1fe3ef55bbb511dfebdcf5b64723cacddf80f4425326e3b411c3a84aa5b4b1ead19fd8e120feb8cfce3fafd10b59a21d9f5480e6b77575d47c9f1237fc459231b617241bace853a7dc13f93200df9cf6a733de5c8ba85f13501452a5c552c14017fa7f79d1fa88f48ffa505dca1e31e581af4b382237f61d16e -Sig = 9301ae4d76e84df108b70d94400c0b2dbf0b024fd5cdd5821c408ca2f52b7d4466a43abcbd8f40e9c07c4e4e56ad1ff471327e2e997d4e372d82c3e9f9db4d40d4d6308b4f7e5ac91c4ee2c194c038f8275dff82b9cce56ccbbd2ac3d12550f184b1cf938cefc85afc588c45c1ea055da0d4dadda266895cb4b84b846d8fac13 -Result = F - -Digest = SHA256 -Key = 30818902818100a16c7fcbb8d6fc602277e9cebb1790bd14999ef7670400c0bd0ea6116fc72e29b868c8b62ada0e7b4cd351b5a76c177f158b4f724f1d287d66df114eabd68e3e8d12409b69f96e334c0daff79392d184b9102ea5c4ec13052bfc509d9ae76851e8557a417b86e9d37687d243cf48812ce621c5f39404cd6b22a60beef744a42f0203681201 -Msg = 2ab6c6ad26e227177b6458a1caf18bc083c162a1f18b0fbc77b0baac19b7223e3df988c8b39dc9bcf4c7ca7ca70d18706a2bd057cef7bddaa397c16777f1763c596314c2e3b4961d774b1801c89f84c79cef6dc0d1333bc99e52891f1c95cb75055c3444bb10d7638c580cd7349015eca37701850127d1b0f04bda7d118c6a11 -Sig = 8a270d2b49cd2897df192e12121ba6b92304e89a429753727e8cd7fd8395ee72788ecd58d91ab99b4385778fb8f9a5458a79790def0c05de8b5646c16f2f8f67652708573216f13335fbac257e4f6e46119fe5b50c309a7c01731c8f8fc240fc68f08f25879a32156dcded375c6ecaf0bf861066de3a034bbc00844dc74b8b6f -Result = F - -Digest = SHA512 -Key = 30818902818100ed88e482e9d7d30dfb6ff2e20bd93b5cf028fd5e49f9415b72f77602e688e9ce0d153c5131cf1223ee78e322f207edc1eab0832efeed4146e3af7715a301fe847605e009d18c05db26b3034ad84ecbf2728a6d384694625528e1002a83f47166e46dac3d0d7d146fc06419a2d2a64a9482267bbf30d666e694e5b2180c3e8f09020322478b -Msg = 079d6e31776603dd6cd9f0856940e75fdf130e4846beb3ab6ba33ca30c635c64a2598dd77e68ba8417f73bb5a33907d8e4b2252645f7648225b54ca473f454767b9d56beff3a3ffe8afe0b980105f1367bdcda69524418917b3355fc121cc9523970b1302365fc136cf64778ac2b0b414b9a155b972e379e13273ef4126223be -Sig = 9563554bdd55d7eba323e370a74810726a6357780b763aa86d8c1e0394893db72bf85cceb76ed11e801483717d746169cdaf652c9cc11e0fa006166e05e54d1c2dbea9f8a01402f929d8d8e8eb0f1f028b98a779d9c44642df01ccc649cac24a4cc760cf52bd7eb4bc0f1809be7cdded3e0965f3462841ae6d0a1626e061bc4d -Result = F - -Digest = SHA512 -Key = 30818902818100ed88e482e9d7d30dfb6ff2e20bd93b5cf028fd5e49f9415b72f77602e688e9ce0d153c5131cf1223ee78e322f207edc1eab0832efeed4146e3af7715a301fe847605e009d18c05db26b3034ad84ecbf2728a6d384694625528e1002a83f47166e46dac3d0d7d146fc06419a2d2a64a9482267bbf30d666e694e5b2180c3e8f09020322478b -Msg = 6284989fb234eeb086e39dadb61cd985c75ff1e00fb88c561a9632de4ddb0f89c930f470939b9feaf1533c0317d32c2a022d042aa5a1d95c436ebb1a1ce87f764bcbc22cefcf2ad6897cef5fa5409ababdbf0dd45a6ac4c77c535a503c3f4f83b0fd08bd0ff717db1507bda9a98cad9dbebc13c6773cd5ff8eee1968f60a0717 -Sig = 0db9d569fd848047e693ef1826fc1b7aaf1fe449882843455dab2829d418fde0b90b6c2a0ab2bf1122ded1708c9442b05a6a44d42bf5313ea793ca1482825e8327247d3f35a7fc43457a3f55c60e3f506d9df6b7037ab5db46b440edf014b4def3936a3ff7c1feb4e4ff366731ef519e4408863ae2e8048bbfbdc9101857e893 -Result = F - -Digest = SHA512 -Key = 30818902818100ed88e482e9d7d30dfb6ff2e20bd93b5cf028fd5e49f9415b72f77602e688e9ce0d153c5131cf1223ee78e322f207edc1eab0832efeed4146e3af7715a301fe847605e009d18c05db26b3034ad84ecbf2728a6d384694625528e1002a83f47166e46dac3d0d7d146fc06419a2d2a64a9482267bbf30d666e694e5b2180c3e8f09020322478b -Msg = 310c04b35510e779f1b1e7177d18d32eeaffd15b2b210054f4ee5b33c284e1111bdbf3d7173ffd511f045884f5756f42f40d21fb9aea67d6437e37003788a844e74256dd74dc0888712a90ddea9af3dea568cad1a715e84bfa153d8eaec8fa141eabf66c75d05145708b57c9656fa72c847894845d8acbdba21a36822e2b21a9 -Sig = 9029571a3b5a0c4c5cd165661cec2868c896240281172a4089d5bff1214d7721a692383bc733d131ff7b5b41f1c8a15428b4d80bb3b225bd381edc5df7ab230e499116e4b336d1b0731e55782b088eacb9c7cc4e31a629d29dd81a31d87f0d169b975f7214e356d28366002ae65dcfe857cb1be25083e8d5c24303a52b73fdce -Result = F - -Digest = SHA512 -Key = 30818902818100ed88e482e9d7d30dfb6ff2e20bd93b5cf028fd5e49f9415b72f77602e688e9ce0d153c5131cf1223ee78e322f207edc1eab0832efeed4146e3af7715a301fe847605e009d18c05db26b3034ad84ecbf2728a6d384694625528e1002a83f47166e46dac3d0d7d146fc06419a2d2a64a9482267bbf30d666e694e5b2180c3e8f09020322478b -Msg = a86c47e276bd53067d97392bbdffc290d338f3b38fd8d409e22176f1fd8d33ebb7ab38052f2a4197b333a430e1fd91d00c9b9858e2186b3e4bc5e68594d24cedcc1cd4676e4664cb410b9ccd7dd2162e2f83ec2fde9a7b4b6f7a67254603e0c0ae6623ee7b38430beec629ead8a9d910029af820cd878b9716e602b95c4975cc -Sig = 85b7f16f782fb9ce2bc1b00114aec5fedf2e279ba0bdc4ae6a0e38e41bab63353ced11ccf3e55c8fd5dc99736f97ff891d13ed59c1f123ba4ce3daffbe08aedbbb7a0a90ac042fdc3f54253eb61b29b64f194610d42087189763baa351e0fa61b50a5c9875c0ca8538bf2187ef37d0cb1e6b5352bd017064955f2a0740db628f -Result = F - -Digest = SHA512 -Key = 30818902818100ed88e482e9d7d30dfb6ff2e20bd93b5cf028fd5e49f9415b72f77602e688e9ce0d153c5131cf1223ee78e322f207edc1eab0832efeed4146e3af7715a301fe847605e009d18c05db26b3034ad84ecbf2728a6d384694625528e1002a83f47166e46dac3d0d7d146fc06419a2d2a64a9482267bbf30d666e694e5b2180c3e8f09020322478b -Msg = 155958a8c08e561a69d5f41efe76304ffb0ffc658a2c8765ee17bd1521f211b3bc027ae6184ebbf5b369e837d58c26cb73e7b28853392537719ff600a2a9402377b3c5e9647334d921cea72e51f07089629b15e4b4bf99c7fd4cfdbeec44070a0c144297ec24462e7dad39ecbbcb96f38fd32d5ff4e66c7c5ac6dc3647e9eed0 -Sig = 5535cc093d3e54097bace607a8f75ec913c4d0219663ce6a3b493480d14bac47e85d23c1b7562f91df292725965c31450558f46904b8e50b42bf2e0b6308056aa83691ca2349e39d167baf17d069d11db8390dcfe04b5550137dca253ed5c614cf9e50eae496bddb27c70ff6615a5c5b8a340fa314dd672dcb5d214728d51002 -Result = P - -Digest = SHA512 -Key = 30818a02818100ed88e482e9d7d30dfb6ff2e20bd93b5cf028fd5e49f9415b72f77602e688e9ce0d153c5131cf1223ee78e322f207edc1eab0832efeed4146e3af7715a301fe847605e009d18c05db26b3034ad84ecbf2728a6d384694625528e1002a83f47166e46dac3d0d7d146fc06419a2d2a64a9482267bbf30d666e694e5b2180c3e8f09020400903695 -Msg = 0a87d48ac27cdc05dfbd93afab38c18a339beb5055180e5a196694c0450880c22bd1ec67c6a8b5630589753e67ccb1b3c8aa54577bfd5c7b9847d45297f602571ee6e1e91828d23807028e659b365fe583879027837a2176c75ac020777ef5d88bcf9d59e184994c8c30c76c70ff31e80c3c85089617c6144da640720b29c10e -Sig = d808e2fc131998e6ac727bf628dee867b9849f47bb92ab663192e83659e5091511db6bd36bd2e5281fee2157549212982748584abaad8b188e389776896f5b60b82441b6fd83b6494ede3f6bb74a795a10c344b557b92b13d8b7f172721720664a5e3031d218ff2dde8aeecd21d6c96ecac396ef78001fec388ea8ac9bb17e9a -Result = F - -Digest = SHA1 -Key = 3082010a0282010100ddc1676352ca011a235db9b4bb41eab81a9f3447a34c3626a531e3319665edd9c9e269788323ac7f2db36b9106f4b2148b7c7a309a0b7482ff08cc97c792bf8e2319f42aa51078a29a4ff90c0e29563059a8608e8809a04bf45f1334b23631d99253ba230dc640ffc3a70c27ce5fc7ebd1adfe68e4462790007b39f5d5b47dd9bd04d0d08ac3b586fd6cc8e178d52ecbc09434d4b89d83cadef6c53cce17788e87b551aa0b507893f308e23da919a4aa01183ddc831a99a3e3c4e5bffdc7e8c8b6800699abdf11569ba66e5892b2e55c6f8578a12f5e304dc28ffbd5ee2dfd2bafabac77ba67031f588e73cf7ba344396d166f5392ad36187b45e15916aaf5b70203748d77 -Msg = 9e7d8a94561c95facc082974fcdbcb813e1b37fdcbb1013a7d9c7c53d6e6dbbd44d7961fa36a106404fd760ead4ceacd61a0e150e144c95bb239f01a212aa1b585a29024c47d7745189d022b13dee9b9e14b5b70ce92a38607b50638a503ea61e7473e4abf3f15c4914f947437770f6f48836f079a81d7e4057887566a5700e9 -Sig = cd0a22729f6a2eb4c7bd6c1ebcb9510ba1aa6e8921109d7c1fff6f7cfc36691b69e89656b9d7cead82356efd740faeddb0e3cba5a98656b841f2e98d296b995b758074fbd97af3baa4b28e9df89e9246eed76ae3eca1bd213a81b5d15411dff648b887a8835fa2f7bb2f78be5c4be8dfb1ef0d6b08319685edc437e56da3c8a532ec8c7382f74859530eef7adffa68ede91e3fe4bd29f43bc8ff813fec7d0a15aee6de202e4f32fbce4621807cfab47bc395ac10368d931bd73a86d40a38cfa898668cf76f0f4eff32223c0e452132c36b2c16f228286abe0f3fd4f0eb73e5ad989ca19872097948c6152320daed43bc2a98c3468a610d13ca086bd8ea89bbce -Result = F - -Digest = SHA1 -Key = 3082010a0282010100ddc1676352ca011a235db9b4bb41eab81a9f3447a34c3626a531e3319665edd9c9e269788323ac7f2db36b9106f4b2148b7c7a309a0b7482ff08cc97c792bf8e2319f42aa51078a29a4ff90c0e29563059a8608e8809a04bf45f1334b23631d99253ba230dc640ffc3a70c27ce5fc7ebd1adfe68e4462790007b39f5d5b47dd9bd04d0d08ac3b586fd6cc8e178d52ecbc09434d4b89d83cadef6c53cce17788e87b551aa0b507893f308e23da919a4aa01183ddc831a99a3e3c4e5bffdc7e8c8b6800699abdf11569ba66e5892b2e55c6f8578a12f5e304dc28ffbd5ee2dfd2bafabac77ba67031f588e73cf7ba344396d166f5392ad36187b45e15916aaf5b70203748d77 -Msg = 2dc3fc128057e1c291f9b55ace78d9473dcd3560a7ac7d1bfc59b301f3bdee5ff1b9593f2cba7e96108ec5bfe2763728a37c884c370655e1c6acaa526347c76feb4a24643056b2e7570864b67f16ee41a49acda3c2ad87d73d38342980073deae41f6468d452041e30109a27ee8085f907cf0a4f91c99b6728a6596e9326d739 -Sig = bb75bbdbaea3269a01bd9b5e492178b7ec11abfb59d417cd5cdabb8a4b922b0f21ae69e9da7a9f628c9cf396bfeb75c836bf734561e68e91fbefeaf0f57f261c936bef741527187a5315dbf584f332fe3ed8a44367688e28998675c31f2b1cc3fa87faa4abcadff5fc64025c9589149e41c45a5037fe1c27d320d5a40ab6119b639ba052ad1d8a0339fd3a03f1356bcbc056c4f604862df36b66685feccfe5f93f2fe0c957a02e8d41a574ab0e56d8672d338de761fc9e9a1b801ac5dbd56c1592efa77f782d1dce3531efa5c7f569ddc313f5dce62466ddf269bd5b780f7c7c68b5232e1f77f7b4a8eef8a978eeb56d691c3e4a95965867c61d3c8e7badda1f -Result = P - -Digest = SHA1 -Key = 3082010a0282010100ddc1676352ca011a235db9b4bb41eab81a9f3447a34c3626a531e3319665edd9c9e269788323ac7f2db36b9106f4b2148b7c7a309a0b7482ff08cc97c792bf8e2319f42aa51078a29a4ff90c0e29563059a8608e8809a04bf45f1334b23631d99253ba230dc640ffc3a70c27ce5fc7ebd1adfe68e4462790007b39f5d5b47dd9bd04d0d08ac3b586fd6cc8e178d52ecbc09434d4b89d83cadef6c53cce17788e87b551aa0b507893f308e23da919a4aa01183ddc831a99a3e3c4e5bffdc7e8c8b6800699abdf11569ba66e5892b2e55c6f8578a12f5e304dc28ffbd5ee2dfd2bafabac77ba67031f588e73cf7ba344396d166f5392ad36187b45e15916aaf5b70203748d77 -Msg = 02e74a1d1d61bc6c856a20fecdd64c6a011542b3e7629c1c843e2d3ee21de557115ff5e56c8134741d95c1b4e4efeace14224df8de2b3d48d1eb68c5a2dbb6c429fb7472ad0bb1ad61fee8182eace06eb3c7d1168b10c8f8ceca4c90da6f424053a30eeb6866fbbf588ddd523573f5f1e9ec1435767a03d682c423c412435174 -Sig = 7aaab14a1a89468ab4b583a8ad03df515e5d34b0c36eeabff6c4532385d448ce99e4ba35c927751cd499fe3080e004a903afe833667965fbd2d97f8a4b617f805ec88bba1133c5c304e2183797887db331a597d1e5f673264f6fcce750b504ed24fc066af248833d42cee935779bcfa02b73dcd29254b4dcbe831b70c289f6998884bd216f320e4615fec8181d17654b7201b62e8610e69dbd8cbad6de1a5cc1b4619b2680e7ddc27c02a9b8dde6efecf0f6c4551bd38b46f10e78692887bfae9cde1cca4e33733797144c6cded6b58cde54c5b877e5d10d4775200c0f4eff5ccde7a42788ac22f762411da48826b670297f2b07435d61a31e063ec1a2791a32 -Result = F - -Digest = SHA1 -Key = 3082010a0282010100ddc1676352ca011a235db9b4bb41eab81a9f3447a34c3626a531e3319665edd9c9e269788323ac7f2db36b9106f4b2148b7c7a309a0b7482ff08cc97c792bf8e2319f42aa51078a29a4ff90c0e29563059a8608e8809a04bf45f1334b23631d99253ba230dc640ffc3a70c27ce5fc7ebd1adfe68e4462790007b39f5d5b47dd9bd04d0d08ac3b586fd6cc8e178d52ecbc09434d4b89d83cadef6c53cce17788e87b551aa0b507893f308e23da919a4aa01183ddc831a99a3e3c4e5bffdc7e8c8b6800699abdf11569ba66e5892b2e55c6f8578a12f5e304dc28ffbd5ee2dfd2bafabac77ba67031f588e73cf7ba344396d166f5392ad36187b45e15916aaf5b70203748d77 -Msg = 4b4f319b5c8c53e7a4749c4ee58b0b25365a96da57721b2044af994c0abaa0ffdad106065ccbdc7e4556a03c2c84b46c9a860f7760b7332b2ddc5f165fa905321a887ec89797fd8ebfefc212f92c905c402a60cf780c57510283f6ac8e4d913330fb02a8b7f89e5d3ac7689af38c853f50cef0aa487b6fdbec2cc6d63eab2a49 -Sig = 1ee9549fc8cf651a593e8c4516cb1b3d58099e6334b2b35c5da1e1c549e4a7769e92d51b52f622d5da43f8778c0e0f860f7e3a02268ab7a64523c0eddfd7db7941896a67bb33895d577be6c8c86af72d4e2feb5968eb2f04e462a2ed9e648c36c2d6667832a640d393fc11494a7379fb4fd6f0bff27718d8c9cfe0c9f2dd82472dbb6b751a5398be3f9aa67919461efa7bac3c6d5fc42b2149acdf29f8a30a98ac89a6a48833a3b2658111094372616986479256617247e60d95bf797b503d0dfc61b6336beed318d36e9f3575454cae1df787ff7f163f40598694ac891e09f743e02f442a1ab5ce1148cb66fde982ccb8ec945e59c57cfd5747cd5de5f3bf12 -Result = F - -Digest = SHA1 -Key = 3082010b0282010100ddc1676352ca011a235db9b4bb41eab81a9f3447a34c3626a531e3319665edd9c9e269788323ac7f2db36b9106f4b2148b7c7a309a0b7482ff08cc97c792bf8e2319f42aa51078a29a4ff90c0e29563059a8608e8809a04bf45f1334b23631d99253ba230dc640ffc3a70c27ce5fc7ebd1adfe68e4462790007b39f5d5b47dd9bd04d0d08ac3b586fd6cc8e178d52ecbc09434d4b89d83cadef6c53cce17788e87b551aa0b507893f308e23da919a4aa01183ddc831a99a3e3c4e5bffdc7e8c8b6800699abdf11569ba66e5892b2e55c6f8578a12f5e304dc28ffbd5ee2dfd2bafabac77ba67031f588e73cf7ba344396d166f5392ad36187b45e15916aaf5b70204008ffac3 -Msg = f62e0e07bb71ca7f93736ce1d2c29a4fe7a5c8769955a364916ab09a19943063238b48648d495e73a376c6ade6249ec20cbcf69447383501ca93b7fc8a7ebbe341557d0cb9519fa247ffcdaf95f1a179a5b3c4121300572b9b369129da08a97b5973f62ac7f355b186f6cb106a916b1cbd727a198616d28a0a3c84489499c1d2 -Sig = 66b378c5fa44c443f0ec885d55dc877612246703342fc8ef38a98c26325e52b9772f30d29f4a23b67153cdab1f84a615208ef809d84be83c57cce32ec9f9dd07a64af14f964c73d5a8f9fbafc07a68dd046cfed8e1c54c6fed3a4bb7c9ec153b64bb6c1591f1f78f834c44153da1dafbaaa9d44b8406108d70577ea8497b33aa09c5f2b63906949f1ac098d34c82a80a37d2f4164ea88bcaa30ead54f3b0391485a8eba084de3be452de37dc52d278d757c70c1b75bc1ce7c1441b0cfed2ec5e045bd77e732715c593e2a3b21ad81f7f92b6eb9ab23f84cfbdadfc89c75dd4474e752bcf479805f2b4fc5b953e2aa82b72044fb865cc93124096c14e0a645947 -Result = F - -Digest = SHA1 -Key = 3082010a0282010100ddc1676352ca011a235db9b4bb41eab81a9f3447a34c3626a531e3319665edd9c9e269788323ac7f2db36b9106f4b2148b7c7a309a0b7482ff08cc97c792bf8e2319f42aa51078a29a4ff90c0e29563059a8608e8809a04bf45f1334b23631d99253ba230dc640ffc3a70c27ce5fc7ebd1adfe68e4462790007b39f5d5b47dd9bd04d0d08ac3b586fd6cc8e178d52ecbc09434d4b89d83cadef6c53cce17788e87b551aa0b507893f308e23da919a4aa01183ddc831a99a3e3c4e5bffdc7e8c8b6800699abdf11569ba66e5892b2e55c6f8578a12f5e304dc28ffbd5ee2dfd2bafabac77ba67031f588e73cf7ba344396d166f5392ad36187b45e15916aaf5b70203748d77 -Msg = 60c3a8bb6b10b30395cb1a4b8faf39cabe5cc3b79057b769115390bdb9afbdb8883f506d564ffa2164e537ae3647c625a5bd5cb7309899d693733b979bb9925b386834aed414f16fe32e0932bb869de2a60f64ab36e29f16d9864f76ad6fa58496c4ba468d6680353b2df99ec675a649ebd943594d3eb1730c1434229ad8de7a -Sig = 5d36b5e092060e763963b87b41b027a1356a1d5068c8ddee205f0b012c27d6906e75ec2fa93cb840d69ff3c149653802659ef116c7d740afd3c4050193cb488493a9bf1025ff3918ffdb073e5b2f705eb771e1e7c91dbb9a9e18b1a36951d60671e25e4042776ca265bbba032b1dd5aae000737c49583450e072c4571ece1b5af9403bec0ee4eeb1e14165c8df6d2eeb93f10ba3dbcb9ff92abc2773d044560fa162e9e5b7f6915184e6ff3548df75ef7fdc8f2c869edbcb1b4a6598fd1acaa394f501eefc3fe5e6945f4143509d6cf8b4c8418e4f26f53400fc50d00cc4491ad16b58785fcc6f123d52b482764225f66998b3abc3b3e2d5e8741f3170ecc574 -Result = F - -Digest = SHA256 -Key = 3082010a0282010100c47abacc2a84d56f3614d92fd62ed36ddde459664b9301dcd1d61781cfcc026bcb2399bee7e75681a80b7bf500e2d08ceae1c42ec0b707927f2b2fe92ae852087d25f1d260cc74905ee5f9b254ed05494a9fe06732c3680992dd6f0dc634568d11542a705f83ae96d2a49763d5fbb24398edf3702bc94bc168190166492b8671de874bb9cecb058c6c8344aa8c93754d6effcd44a41ed7de0a9dcd9144437f212b18881d042d331a4618a9e630ef9bb66305e4fdf8f0391b3b2313fe549f0189ff968b92f33c266a4bc2cffc897d1937eeb9e406f5d0eaa7a14782e76af3fce98f54ed237b4a04a4159a5f6250a296a902880204e61d891c4da29f2d65f34cbb020349d2a1 -Msg = 95123c8d1b236540b86976a11cea31f8bd4e6c54c235147d20ce722b03a6ad756fbd918c27df8ea9ce3104444c0bbe877305bc02e35535a02a58dcda306e632ad30b3dc3ce0ba97fdf46ec192965dd9cd7f4a71b02b8cba3d442646eeec4af590824ca98d74fbca934d0b6867aa1991f3040b707e806de6e66b5934f05509bea -Sig = 51265d96f11ab338762891cb29bf3f1d2b3305107063f5f3245af376dfcc7027d39365de70a31db05e9e10eb6148cb7f6425f0c93c4fb0e2291adbd22c77656afc196858a11e1c670d9eeb592613e69eb4f3aa501730743ac4464486c7ae68fd509e896f63884e9424f69c1c5397959f1e52a368667a598a1fc90125273d9341295d2f8e1cc4969bf228c860e07a3546be2eeda1cde48ee94d062801fe666e4a7ae8cb9cd79262c017b081af874ff00453ca43e34efdb43fffb0bb42a4e2d32a5e5cc9e8546a221fe930250e5f5333e0efe58ffebf19369a3b8ae5a67f6a048bc9ef915bda25160729b508667ada84a0c27e7e26cf2abca413e5e4693f4a9405 -Result = P - -Digest = SHA256 -Key = 3082010a0282010100c47abacc2a84d56f3614d92fd62ed36ddde459664b9301dcd1d61781cfcc026bcb2399bee7e75681a80b7bf500e2d08ceae1c42ec0b707927f2b2fe92ae852087d25f1d260cc74905ee5f9b254ed05494a9fe06732c3680992dd6f0dc634568d11542a705f83ae96d2a49763d5fbb24398edf3702bc94bc168190166492b8671de874bb9cecb058c6c8344aa8c93754d6effcd44a41ed7de0a9dcd9144437f212b18881d042d331a4618a9e630ef9bb66305e4fdf8f0391b3b2313fe549f0189ff968b92f33c266a4bc2cffc897d1937eeb9e406f5d0eaa7a14782e76af3fce98f54ed237b4a04a4159a5f6250a296a902880204e61d891c4da29f2d65f34cbb020349d2a1 -Msg = f89fd2f6c45a8b5066a651410b8e534bfec0d9a36f3e2b887457afd44dd651d1ec79274db5a455f182572fceea5e9e39c3c7c5d9e599e4fe31c37c34d253b419c3e8fb6b916aef6563f87d4c37224a456e5952698ba3d01b38945d998a795bd285d69478e3131f55117284e27b441f16095dca7ce9c5b68890b09a2bfbb010a5 -Sig = ba48538708512d45c0edcac57a9b4fb637e9721f72003c60f13f5c9a36c968cef9be8f54665418141c3d9ecc02a5bf952cfc055fb51e18705e9d8850f4e1f5a344af550de84ffd0805e27e557f6aa50d2645314c64c1c71aa6bb44faf8f29ca6578e2441d4510e36052f46551df341b2dcf43f761f08b946ca0b7081dadbb88e955e820fd7f657c4dd9f4554d167dd7c9a487ed41ced2b40068098deedc951060faf7e15b1f0f80ae67ff2ee28a238d80bf72dd71c8d95c79bc156114ece8ec837573a4b66898d45b45a5eacd0b0e41447d8fa08a367f437645e50c9920b88a16bc0880147acfb9a79de9e351b3fa00b3f4e9f182f45553dffca55e393c5eab6 -Result = F - -Digest = SHA256 -Key = 3082010a0282010100c47abacc2a84d56f3614d92fd62ed36ddde459664b9301dcd1d61781cfcc026bcb2399bee7e75681a80b7bf500e2d08ceae1c42ec0b707927f2b2fe92ae852087d25f1d260cc74905ee5f9b254ed05494a9fe06732c3680992dd6f0dc634568d11542a705f83ae96d2a49763d5fbb24398edf3702bc94bc168190166492b8671de874bb9cecb058c6c8344aa8c93754d6effcd44a41ed7de0a9dcd9144437f212b18881d042d331a4618a9e630ef9bb66305e4fdf8f0391b3b2313fe549f0189ff968b92f33c266a4bc2cffc897d1937eeb9e406f5d0eaa7a14782e76af3fce98f54ed237b4a04a4159a5f6250a296a902880204e61d891c4da29f2d65f34cbb020349d2a1 -Msg = 915c5e4c16acfa0f49de43d6491f0060a944034475ba518572c08366a8d36c7f1e6afc11e5e4649757bf7b9da10a61d57f1d626847871d8a2948e551b54167c79de88d3ebd40a3e35809b996a53348f98a9918c7a7ec606896ed30c271e00c51953dd97aa6a8fe1cd423c3695c83fcf45120ec0a9cd1644642182b60e599a246 -Sig = 3d57ea5961db8fc144301ca4278f799911229d865ea3e992c7fbc4d03c6551729e26034e95dd71da312340e4051c9dd9b12f7700a821fe3b7c37785d5106350b667ac255a57c13da5842d90bcadea9e6b1f720c607d6893a2caa3c5f3c4074e914451a45380a767c291a67cac3f1cab1fbd05adc37036856a8404e7cea3654019466de449ad6e92b27254f3d25949b1b860065406455a13db7c5fe25d1af7a84cddf7792c64e16260c950d60bd86d005924148ad097c126b84947ab6e89d48f61e711d62522b6e48f16186d1339e6ab3f58c359eb24cb68043737591cd7d9390a468c0022b3b253be52f1a7fc408f84e9ffb4c34fa9e01605851d6583aa13032 -Result = F - -Digest = SHA256 -Key = 3082010a0282010100c47abacc2a84d56f3614d92fd62ed36ddde459664b9301dcd1d61781cfcc026bcb2399bee7e75681a80b7bf500e2d08ceae1c42ec0b707927f2b2fe92ae852087d25f1d260cc74905ee5f9b254ed05494a9fe06732c3680992dd6f0dc634568d11542a705f83ae96d2a49763d5fbb24398edf3702bc94bc168190166492b8671de874bb9cecb058c6c8344aa8c93754d6effcd44a41ed7de0a9dcd9144437f212b18881d042d331a4618a9e630ef9bb66305e4fdf8f0391b3b2313fe549f0189ff968b92f33c266a4bc2cffc897d1937eeb9e406f5d0eaa7a14782e76af3fce98f54ed237b4a04a4159a5f6250a296a902880204e61d891c4da29f2d65f34cbb020307485b -Msg = 03d2f0693517cffb2b724c1f30502c5359c051c1bcd88dc1dd54b89e6981009d275a813b2bf016b74d0f6ed0d91e62d0884785c9afd8fd1fb7e99246cd4005cdda71a39cb649197a996d8ad2d23fdfb6bb015f24ec3d7f88af64fb83b4b525eb06607d133eec834cf7d6c9ab817b4c0dda370459d9cfba05ad0c1adc86a909fe -Sig = 511abd82218cab344979b2887b02600d2427f1eb12ac01d97684c2a443a9272834c3f79cded07a39dbee3770dde827a74dc994b17bfd8a26d07b239d26d58c42f79d560264c31b7e1c3dddef6d7556f228c394414f4cec561c3da2686a8eebec7702f32850809a93deeb84b2a02fcdba224d2fd9efb8e056e796f49b57d56e9f3e90d0b49b08bdee93a2e12e676fb4d4fa838c5bd88eda008f1b592a72465587be0ae17d9b156b904f44a7e04d3b58d24ad67b71b0f4c699fa51639546b62b9f83597ff03d465f1bb396ae15e92d0e92e85647d5df113e2c7518d0e3ad2e7aa7dac720c98347aa151e4f37fea081dbed350cc9c93f606b38f21a3e5de6d140d2 -Result = F - -Digest = SHA256 -Key = 3082010a0282010100c47abacc2a84d56f3614d92fd62ed36ddde459664b9301dcd1d61781cfcc026bcb2399bee7e75681a80b7bf500e2d08ceae1c42ec0b707927f2b2fe92ae852087d25f1d260cc74905ee5f9b254ed05494a9fe06732c3680992dd6f0dc634568d11542a705f83ae96d2a49763d5fbb24398edf3702bc94bc168190166492b8671de874bb9cecb058c6c8344aa8c93754d6effcd44a41ed7de0a9dcd9144437f212b18881d042d331a4618a9e630ef9bb66305e4fdf8f0391b3b2313fe549f0189ff968b92f33c266a4bc2cffc897d1937eeb9e406f5d0eaa7a14782e76af3fce98f54ed237b4a04a4159a5f6250a296a902880204e61d891c4da29f2d65f34cbb020349d2a1 -Msg = dffe42bfda886e1a73fe8a8dfcf71c9fb44deb054588a9bb9199d554aecce08f2ff88f2aa6f8a0fb675fb03c8e685c27432ca7c33c189bfd849d34fa7b2979ac1f57eca389632426bae0b98398ad60a3342557e14e96041c1bf4d90b46cf7ad1348322d28caf43c4f7e86c0924ae703c109ec50a84ea2a43df078c3015a52b28 -Sig = 8f4dd479239f2d08dc05d7d40539288b67c4d77210ecb16be76f0b1925e8b088570831e361a1ca57893135f8af64b8e2996b8d635899da4e04c68acb9b1b3813697d57da90c57f18509e0ab6705c704feb448cca5c07d258ecd884ab93f508cefdb25f2bc3061c4006099e2e33b27972c3edb0a0a33114d381c82ab506d041ff680af595ef3400a8bb6774030d2e38dd304272092bd32a553017f7bda4b998b27aa8aca12def327b1f11063a5342b0d55738183417d321c5682fc4ab64e79174216feebb989521e1e3d827647068003be34fe1d093964d28f4877c49b4065672448597a89b91919cfb55ca13836e7e6f3b3fd04f417cf1c16d9872538bf4e87a -Result = F - -Digest = SHA256 -Key = 3082010a0282010100c47abacc2a84d56f3614d92fd62ed36ddde459664b9301dcd1d61781cfcc026bcb2399bee7e75681a80b7bf500e2d08ceae1c42ec0b707927f2b2fe92ae852087d25f1d260cc74905ee5f9b254ed05494a9fe06732c3680992dd6f0dc634568d11542a705f83ae96d2a49763d5fbb24398edf3702bc94bc168190166492b8671de874bb9cecb058c6c8344aa8c93754d6effcd44a41ed7de0a9dcd9144437f212b18881d042d331a4618a9e630ef9bb66305e4fdf8f0391b3b2313fe549f0189ff968b92f33c266a4bc2cffc897d1937eeb9e406f5d0eaa7a14782e76af3fce98f54ed237b4a04a4159a5f6250a296a902880204e61d891c4da29f2d65f34cbb020349d2a1 -Msg = cfe99788f55ec6944942bd0a187d51b80fd8bd4051bd4f07c73e614eb75a8b9f997b176b2642b5f1b1877061ba9ce142c1d2a311583f072b7cbe08ed253681191c209d7b0d438fcdddc284d93d59d6dd80e48333a921dd31c9b6834f88768f8701e01102d3e8bdf074fbe0b8c93d9951f41545ef6eeb3be35530babc079f1fb3 -Sig = 9fd6f6107e838107f906c26cb2910704599f175b6a84db485fbc30776eb7fd53bfe20c38c537b154a3e519b662bd9fdc8e3045e21f6e5ae97d0ff6a9d8632825544525d84f99f80e3ed4e69dc5e219d59ccfbb37c23c84fe3b3e6fb22f402f94e5225c6387fdf8bcdb3508f8832908fe05771521e92234348004e8fe19a8f24bebcab9f074327c88d066bc12081748d696be6135c6aea32220ea786ebd7800e6936365ff25831c28cb6c8a59237ff84f5cf89036cff188ee0f9a6195f2b1aca2e4442af8369f1b49322fa2f891b83a14a97b60c6aeafd6c2928047affda9c8d869ff5294bb5943ad14a6d64e784d126c469d51e292b9ce33e1d8371ba5f467b3 -Result = F - -Digest = SHA384 -Key = 3082010a0282010100c858aea188541c0dd2626eec9a8c98511ca03870353128c1687d94a1be762a4940fca789831a720e108f2f7c1fc20aab38336b5668205d62963c51aad74757183faae7c0c59b9f679e96393e7f93e8a30ce99fed1b8e85e7146bd69a3f8dc5734bbacd51359f4f66aa507fbf4e69708877f7cd7cfb6868006e330869d9eee99f466962b0dee9080d9413bdec2e41445190394a49ecb191167350be411cdd6ade4eb38c4c4bf891b43c91b5981a3bcc8a66f85e5cbaef751e3cbe94c7f193fd78ac55048800250d5cc9e41b89319ac3d0258aa640299e165b0cf7e5e108f76a12f72132f6a2a4c239df0544d3d8407b94f9f38e9156c825a7eae001543fb264eb02032a26db -Msg = 6c1c4396f7b7f9228e832a13692002ba2aff439dcb7fddbfd456c022d133ee8903a2d482562fdaa493ce3916d77a0c51441dab26f6b0340238a36a71f87fc3e179cabca9482b704971ce69f3f20ab64b70413d6c2908532b2a888a9fc224cae1365da410b6f2e298904b63b4a41726321835a4774dd063c211cfc8b5166c2d11 -Sig = 422e70ace2a2c07d2adbecd9dd5714c42d0e768d48bc33fea822974e42ecf99c791276e44936e70b183e712e0dd9b484199b92f24a76c6908faf6bc20fe266fa03886781cead7c82aeeebdd150bf48ae4698e76807ef24d29f3cd5590395f4725dbe7e468540b4d4d8be84e673bff86b0c08af17e738af91cee4f14367dd6bedf71b5e8e148b61ea968f16160604834831d557879542598be7d2fd01c7966f0ae1ec2554d8dd653f20c551a1de6212481e2a19a3e2fa9cf005e5f3ee1962c34e3e85f84104f9172debf89db438c32f2a8061ac15d3cd3f3a6b7d75fd7c3f8ea0c505c6398d1e70eb12e9e16f5a0e4b459c02ec38f0dfc7a4a3139c1fba6f59b4 -Result = F - -Digest = SHA384 -Key = 3082010a0282010100c858aea188541c0dd2626eec9a8c98511ca03870353128c1687d94a1be762a4940fca789831a720e108f2f7c1fc20aab38336b5668205d62963c51aad74757183faae7c0c59b9f679e96393e7f93e8a30ce99fed1b8e85e7146bd69a3f8dc5734bbacd51359f4f66aa507fbf4e69708877f7cd7cfb6868006e330869d9eee99f466962b0dee9080d9413bdec2e41445190394a49ecb191167350be411cdd6ade4eb38c4c4bf891b43c91b5981a3bcc8a66f85e5cbaef751e3cbe94c7f193fd78ac55048800250d5cc9e41b89319ac3d0258aa640299e165b0cf7e5e108f76a12f72132f6a2a4c239df0544d3d8407b94f9f38e9156c825a7eae001543fb264eb02032a26db -Msg = d6a169031049b0b3b582d22bf40b9fca45d2618457146c2b4ac6f6ed1f34291f6de8773955cd2e21b7944caca65794621a7ce181e5ddbb45e9252867877dc4e35b6914ff26ec18890bf31f60fff1df367bc6c59373e58a1d8cb607188a394a2907ede95f6bf096731867f44fe520aacece76b5c3ea75023c9d3f3c080eaee376 -Sig = b9794f252e6907dc4c41de42ea5a0e6361114ac3814c4a92583ca70fd78e98190a0d9215bd5282e8520422093eff2e1cfa335cffcdcc27fe9bafe4516e74445d4aa17a08db754fc69b156d86ff26eb9e814f605142a3051d2fa64305d3e5c5c5f67c7d9e38c5054d069c14b23e4278fa5a73381f61f90a9ec428c883f1366e27ec0219db8c942582a284c161eead307285d0e4df6b0d7dea0e8216d7ef2e4b2ede2296e0b780e5a3f8d15f123f737b9d6170074f758de32b6f1e958b27e422b053df8f5fbbbafbc14119260f7022cd2934e8faeffbd7085aabc44497bfe07387bc0e5aa02399eab99318adb98f99a677aa0683e0c11d638cb13907fc5c3147e5 -Result = P - -Digest = SHA384 -Key = 3082010b0282010100c858aea188541c0dd2626eec9a8c98511ca03870353128c1687d94a1be762a4940fca789831a720e108f2f7c1fc20aab38336b5668205d62963c51aad74757183faae7c0c59b9f679e96393e7f93e8a30ce99fed1b8e85e7146bd69a3f8dc5734bbacd51359f4f66aa507fbf4e69708877f7cd7cfb6868006e330869d9eee99f466962b0dee9080d9413bdec2e41445190394a49ecb191167350be411cdd6ade4eb38c4c4bf891b43c91b5981a3bcc8a66f85e5cbaef751e3cbe94c7f193fd78ac55048800250d5cc9e41b89319ac3d0258aa640299e165b0cf7e5e108f76a12f72132f6a2a4c239df0544d3d8407b94f9f38e9156c825a7eae001543fb264eb020400c74c01 -Msg = eab87ecf61ca1ea8eb29498b510ab371784d0274e2fa77e077ebd18c86c66e6b072fb45e233baf4cf627fb75934ae5034848cde22489cfd2b7e9a2bb19b1bf402ec7c69627211e974c7fdc12f95ae766e717594fad8128ff8776057155e084fae7e87e217766b4b0779bb40b8e2201c1dd246e6186cccb8f6ffac356433c05c0 -Sig = 35720e6883452e78bf0f9ba1566a638c8f5060a8ee313ba66bd2496d67b78d01fa1d5bcd4e3a96aebe6b0e66480335a49a500abd126c5b1beaaa60135db4e51b4efb5a59b662ad3525c2dd1c867bcf609971806895550531d9f5b0ded79f804d1d63c4a00931a64244a2b5f004287b523e9bd23a3ae8b393d2607d1a835062282477c2441cf3176110fa0064350f2cf73b7c67e02bf498eff69161e62e514563d23385be16498c525967350e047392861b7040c9b4039b5a8a49eddb385aaa4593c14e20dc4aa2f67258290a51c6e836e83edc061d4bcf5b8f3db470068372ff76a0109be686c25e70638d15156845dfb8ca1e84d0aef538798014ae1c173a14 -Result = F - -Digest = SHA384 -Key = 3082010a0282010100c858aea188541c0dd2626eec9a8c98511ca03870353128c1687d94a1be762a4940fca789831a720e108f2f7c1fc20aab38336b5668205d62963c51aad74757183faae7c0c59b9f679e96393e7f93e8a30ce99fed1b8e85e7146bd69a3f8dc5734bbacd51359f4f66aa507fbf4e69708877f7cd7cfb6868006e330869d9eee99f466962b0dee9080d9413bdec2e41445190394a49ecb191167350be411cdd6ade4eb38c4c4bf891b43c91b5981a3bcc8a66f85e5cbaef751e3cbe94c7f193fd78ac55048800250d5cc9e41b89319ac3d0258aa640299e165b0cf7e5e108f76a12f72132f6a2a4c239df0544d3d8407b94f9f38e9156c825a7eae001543fb264eb02032a26db -Msg = fd73237a3010d505ea0ca786c5a3ae4d20c4eedbc6232199ce8ab4c9bf6f13bcf8cc26454f2b1b6ff900676baa3c07ccfc1f0cf7154e56d48425a0ca6d4ebdebe693206ba0f0a257caed8083322ba3c5ae3c2560bab710c3628c697463966d478d6f1ad36b88f1262679fbb8a7950a9efcc24100fd88d6cd2f6717ade86eab38 -Sig = 192d8fe5a69a1f9acf186f42893e458b6356b10a8fd0ee45114acf625b61c69d13884f7860b02acd67b5b5082bce20815e384dee608162fc9d19ac977842018e4b3f321d84bfb487c0f4f6a465b3f296c73ca3d8817c771c9969ae1144b1abcf6de251e504d1f662d6094d4e6fcd9ea3f85162883e1179e9fee4a3d7daf95bbadc64221fdc8c144fb4ca502f3eb11df85fe6bba561feed191963ff9f8441b583bd84ee540e47b318629ad59a251b759f060a40e717e50d9c0c0eb43122e6594575725382684c65ecf7f27e42c3e1f7d95c657371978772e111309bf4bae5241fadad0ad9cbd04ebcc8ee76b368439be21493aa41549dac8c356e65435f706d79 -Result = F - -Digest = SHA384 -Key = 3082010a0282010100c858aea188541c0dd2626eec9a8c98511ca03870353128c1687d94a1be762a4940fca789831a720e108f2f7c1fc20aab38336b5668205d62963c51aad74757183faae7c0c59b9f679e96393e7f93e8a30ce99fed1b8e85e7146bd69a3f8dc5734bbacd51359f4f66aa507fbf4e69708877f7cd7cfb6868006e330869d9eee99f466962b0dee9080d9413bdec2e41445190394a49ecb191167350be411cdd6ade4eb38c4c4bf891b43c91b5981a3bcc8a66f85e5cbaef751e3cbe94c7f193fd78ac55048800250d5cc9e41b89319ac3d0258aa640299e165b0cf7e5e108f76a12f72132f6a2a4c239df0544d3d8407b94f9f38e9156c825a7eae001543fb264eb02032a26db -Msg = c17eda0010c4add3f0616155cbe6d43f90568851052d9e825fa002591027e39be03966263f569b1dd94bb0456cb264afd6b8bf987323008da593d8d3b407d505d9a421ff95b26cfb47e827fafee9f3668c0e59f5dc66bbd085fb8af59e57bad9d5477352bbdf0ab562be2f3b2a9468aad8e1be31e8ffb59325628288761f7960 -Sig = 669f6c902798a9c91672addb4fd138ca41ba9b5fbc8efab9bed5e7e25662a40af734240a301d304134e75494ba961740aa6b9fe54a340851791726a864a2d1645daafcbf38f49a5b319ab86101ae4fc5f21b0f15cd12e7979b6e3b2fb61dd049f9d864160110a68cbb9d399eddde358571cfad48f2057dcdf324768d8d3903d0a861a5824ff3a5b715fb7a098a41624ad13219a0af11eaced337e8e8aaf926eb4ad60534422ff986bfb498c63cba0cd6ccea9018a96e9a41e4693586aa70a0d6dc5c6312418d63e9f91aaf5df8d01dcaad7335cf88badf6d8da7fa9cd83e32be840f1b2cca1c8103d73d8a9949d72b4b8c56eb7fbfc523dc1accf80de1023d8c -Result = F - -Digest = SHA384 -Key = 3082010a0282010100c858aea188541c0dd2626eec9a8c98511ca03870353128c1687d94a1be762a4940fca789831a720e108f2f7c1fc20aab38336b5668205d62963c51aad74757183faae7c0c59b9f679e96393e7f93e8a30ce99fed1b8e85e7146bd69a3f8dc5734bbacd51359f4f66aa507fbf4e69708877f7cd7cfb6868006e330869d9eee99f466962b0dee9080d9413bdec2e41445190394a49ecb191167350be411cdd6ade4eb38c4c4bf891b43c91b5981a3bcc8a66f85e5cbaef751e3cbe94c7f193fd78ac55048800250d5cc9e41b89319ac3d0258aa640299e165b0cf7e5e108f76a12f72132f6a2a4c239df0544d3d8407b94f9f38e9156c825a7eae001543fb264eb02032a26db -Msg = 92c641b80aa222fad6c757ad0a8936e0459bf8f4367f63ae5f41a68a19658452d91eb4f0b1c188811a78ceaaf03bf42fbefc6fc13c225c1816396842efe8ee3ba62360bdd8a1e859a6914fc7b8891d7b81bf0278c57b746959cc9aee2b7b6934823d0dc8862c8aad0278a3ac695afbeb174a7ac1da72f2c9b1620235d3053b65 -Sig = 5135f98250db1ebbd738c4d905db5a395c36c99f929d6cbe5bb4de9288575eded2b14220ea49ca7cd04584067b000964df2a4cf0b185b7a080c14ae05cc277b8751b2f1fc061de93b429fdef99c39704a158a5463041a109614c9bb1c9f66df48a67af779bfe85e179f289cca20d5618bda9686c0826ae14f8c86acf28645c5c28613446f202bc952ab1ae4aa06391edb0eb5355712b43d12ff96548292bfa072ff2411e7f9d57e3fc35a43c36743b4a384150f34059c815dbcb26f55da2be86ac5818e2a315a12f01b98e5e7b03a67cb4056a803be2280138d1611a2667c18d4b2a82aff86d9fd21568b2e6575b8e3c0470da8b2d7d6d0a2a172e6415a1b7d2 -Result = F - -Digest = SHA512 -Key = 3082010a0282010100b6515048e1f7a3506d6bf028ea0516592078a2ebd6db04af6040bb5dde8888787e1fd973b1d160da25ba9095450d866625aeb7cf684b522af4edbc20adfad09e9c4c42919b7691e1404afe8815f229001bf7f8e2b1c511d56207972e3efa588f04f7bea82b64c45bc28bbc5e3ca3b1be8652c54a3393e95a58c78c34c7c7ceeca983e91920467d184ecd5aad0114f83d0517e6ee82944cf134e9efdb68f14322517acc10285c892c94e6892c9659fb85af6d11322df94edeb77a379e97c7608e5d23c89b56a722b54d91f0811855c21e0c41ed362ae144e2f46eebb97a9057c673ddccc0f2ce178c3af086d1f93a092a2ae58bb0703ca66318913e69e36fd9970203662f3b -Msg = e5b327e067ed7a242749d21d78e0b1d68d288595dec82a55cdaab1768a5260b4346ff95641b040a71fd9b7aa1b16ac0a838f7550073cfb5865fb750646e0763562cc2af0eb41dce52974bc1662a4e0d2fcab88e4e5d3a60a33ea9ea908994abeb9f141182f4759c58d426aca1232551742a345b9403335527fa0b3c69925e338 -Sig = 488df2a0a8775e6e65c6f457cb9e29dcc8ab6c37a12cf820308732052bfe068e3c6f3c4e73c17615aa6319b76d62df6cf48378b834dc412b9e5875f7fe16bb2670c4ee51cdc259df813d5faa541472581103421a9718e79b8c671b1c7b50f6d4315b96423ba6aca9d060a32372c4c237f02eef44f54f872bf91b5a390adf9c5a7a884416add7d15afd8fb8073243dd587ac8011a88d5566cac84d5dc4ca3f2d6938e0d03a9e8d016b4aea22183425c2bd4696d85501e264bba7dd980c3ac45d77a363955565f4675c5246802abc015236d69005d164c0f18a666d43442902be38fcc381ffb6b5a046af05686b0ad32b25c1e2d82707797016ee63fc9a952d2d5 -Result = F - -Digest = SHA512 -Key = 3082010b0282010100b6515048e1f7a3506d6bf028ea0516592078a2ebd6db04af6040bb5dde8888787e1fd973b1d160da25ba9095450d866625aeb7cf684b522af4edbc20adfad09e9c4c42919b7691e1404afe8815f229001bf7f8e2b1c511d56207972e3efa588f04f7bea82b64c45bc28bbc5e3ca3b1be8652c54a3393e95a58c78c34c7c7ceeca983e91920467d184ecd5aad0114f83d0517e6ee82944cf134e9efdb68f14322517acc10285c892c94e6892c9659fb85af6d11322df94edeb77a379e97c7608e5d23c89b56a722b54d91f0811855c21e0c41ed362ae144e2f46eebb97a9057c673ddccc0f2ce178c3af086d1f93a092a2ae58bb0703ca66318913e69e36fd997020400a3e187 -Msg = 6b7450077038ca8478e7a380292151ad413c1949d78076efe497beb4013f036f7242375864a894d5732b3b906feb1ccd606315fbc79c5e8827a024fac432743cabbc5b35f2894c9f4134c1179261257034aaf24d16dd17ef42649c4ba80488601dcb03c7a343b88cebec7d3c18e9363fc6faf6684baa68cb3cca6ecf341d0784 -Sig = 1933ff9ae5c520efeb711fd17a571a209c2ba9e0469e39a5341a70ca46c6deb2359005fb21c9e914e8a5037345906204261476427ddbdf29212d84c6e4e1dbda61aeb21ceddad1c3789d99ea28ebf72c4fef790f838191b30587e00fa841d63bfebd00bf468b462ae935eaaef2f83ad596b29a0d538ad99b44d615217f0643f0d9bd755fa281e35bedca37b238a89b78f9d911a24c40ab3cf69dade4ce4a30bd3104f890a6cf410a1e76e625e28495f6f9b385d698e6f8a6eadf0df3af03b3e078f4b0c984bddf525f220635cb2993b72ccae40ad3378cdf775431c2ceaa1aaa57f355eefffc0f34b5d70d1a41aac9b052594f0132308b0e329e34c0d2fdc519 -Result = F - -Digest = SHA512 -Key = 3082010b0282010100b6515048e1f7a3506d6bf028ea0516592078a2ebd6db04af6040bb5dde8888787e1fd973b1d160da25ba9095450d866625aeb7cf684b522af4edbc20adfad09e9c4c42919b7691e1404afe8815f229001bf7f8e2b1c511d56207972e3efa588f04f7bea82b64c45bc28bbc5e3ca3b1be8652c54a3393e95a58c78c34c7c7ceeca983e91920467d184ecd5aad0114f83d0517e6ee82944cf134e9efdb68f14322517acc10285c892c94e6892c9659fb85af6d11322df94edeb77a379e97c7608e5d23c89b56a722b54d91f0811855c21e0c41ed362ae144e2f46eebb97a9057c673ddccc0f2ce178c3af086d1f93a092a2ae58bb0703ca66318913e69e36fd997020400a3e187 -Msg = 8b618f6669b9f0450a57cdc57f5dd0bfcc0b4812e1e2c2eacc09d9422cef4fa7e9325c3f22c0450b673c316929a339dd6e2fbe10c97bff198ae9eafc324133702a9aa4e6b47eb4c621495afc45d223b3284d8360fe70680359d515aa9ea02e36b5610f61053c6200a047f186ba33b8ca602f3f0a6709272fa296025258556880 -Sig = ac87aad4ce85038b8552c4a6e93ed94368bb3376ce17ba1d08812e004b43a952e27fc50daee8929094e747dfbe02584a7654d950d21700605e699561c03e64d2016404da7b9c0b0011ff64f206225db1c8b5f974bbeca720a7c2ec73e6fbf58adcc6f5cc24df6d09ade74416f30df70c4449820f24378b90c176f65651ab1c1fc82d3fe834e7b66d0daea47b8d1931a81d1fedd4e6996c56edbe496fa237fbd41876a460780100e4e6f0864b6f9282abae4ecd98630548b5cb42e66cf9eb890e0651f159f356283af40c02913d2f3bbf6d8ebaf6b7d88e6699f482d7825428ccb7ef8129dbc665bd4df8e9a07c339a1134e907e439d0846480ae6c888c1e9be2 -Result = P - -Digest = SHA512 -Key = 3082010b0282010100b6515048e1f7a3506d6bf028ea0516592078a2ebd6db04af6040bb5dde8888787e1fd973b1d160da25ba9095450d866625aeb7cf684b522af4edbc20adfad09e9c4c42919b7691e1404afe8815f229001bf7f8e2b1c511d56207972e3efa588f04f7bea82b64c45bc28bbc5e3ca3b1be8652c54a3393e95a58c78c34c7c7ceeca983e91920467d184ecd5aad0114f83d0517e6ee82944cf134e9efdb68f14322517acc10285c892c94e6892c9659fb85af6d11322df94edeb77a379e97c7608e5d23c89b56a722b54d91f0811855c21e0c41ed362ae144e2f46eebb97a9057c673ddccc0f2ce178c3af086d1f93a092a2ae58bb0703ca66318913e69e36fd997020400a3e187 -Msg = e2a14fdf10cbe13b0afa4294d073af00b19f02c2786987c9e3e80c79573e37aed1c01dfe20570f3f5225b7496c6c65fd5eaca387350c0fdf93fb6a965c17eccfb34eda8c25435b2b23f38830b698c2446ece487e9cf408e2c0d5b62745871cbe6c94b10f87586c0667aadace17bf6fdccb4a1a3013e81bd754bc19b579566f81 -Sig = 0e340359f9f1fc5e974d8ad8c189efdb2849ec93994b152e497e15289015d915014c73503bc69b83803dfa9d8216181fcdc64782c27fe9d464ce12359aa60b44618119df19a8f5defcaa171c44c0c0ebe1991131132aab4b19c02438b0fead22bb34e51bbd565665583bb6eba36e82068e2e3040a177dab3c1d3a6f81d0a3901a934c10e2abd73e8b9ef7a1be29a7fe18b304ce57d073f85b1b6873ab6b8ed94d5a0a0f3e5fc9b4857aed36de4ca72deac235861297fdc51fd9553eed189335935f23b4058f293c8cce8bd9bfc8fbb374ecf4eaa0f2a1f06ccea4ff3071beff69d70efbe07513ef0bfa02dc2c6b19b5ced674a16b6672b6e04a32ae14157fe10 -Result = F - -Digest = SHA512 -Key = 3082010b0282010100b6515048e1f7a3506d6bf028ea0516592078a2ebd6db04af6040bb5dde8888787e1fd973b1d160da25ba9095450d866625aeb7cf684b522af4edbc20adfad09e9c4c42919b7691e1404afe8815f229001bf7f8e2b1c511d56207972e3efa588f04f7bea82b64c45bc28bbc5e3ca3b1be8652c54a3393e95a58c78c34c7c7ceeca983e91920467d184ecd5aad0114f83d0517e6ee82944cf134e9efdb68f14322517acc10285c892c94e6892c9659fb85af6d11322df94edeb77a379e97c7608e5d23c89b56a722b54d91f0811855c21e0c41ed362ae144e2f46eebb97a9057c673ddccc0f2ce178c3af086d1f93a092a2ae58bb0703ca66318913e69e36fd997020400a3e187 -Msg = fb200350b60d1e9b4a3b1b4d7341c55c635bfa791569a438de3bec72450baae8144b1f28afa2e6b5a5312862851a10fff3437e37fa5700b9a40efe96c8af34ea24d365bfab6b4e2e2004dac7e44a94340dcb6118b7fe6f3d9f8469efeeadeda3523e3fdd53723f50e53e984639d93b42d97c0ce4f467da0ef62495455c0fbb5a -Sig = 624183bf2abdb79689a45158a4876a352b19077de88aad06fadf3abcf4d2683b126fbf84c01ef614448c63e8a78d1e8749fd89a9b2550078c18989fea591c2a7c47e6a0bb4491dcb1868a43e75351ae2a7afe27782195f453bbf10643e6c3a23c01f2e713b6ded81e1db7ca4ecb3554fa9ae8005b80316cacdb4530a66dc2a073ec494bc3419df2f275db5a33871d0a8d9cd0d8bcf90aa24f096a79a4c8f5c0dfd8b1887535e59079c974f87d26bfeda7022399685748414df842ce04783b6f57bd2a2dbbe2e225f89c764b9775d7721157498446ce3d613332ea2cc589f7043afe3cae32b779ea8f1ab22fef99f67a0720306dcdf2d2cf7b35b0bf3630e03bb -Result = F - -Digest = SHA512 -Key = 3082010b0282010100b6515048e1f7a3506d6bf028ea0516592078a2ebd6db04af6040bb5dde8888787e1fd973b1d160da25ba9095450d866625aeb7cf684b522af4edbc20adfad09e9c4c42919b7691e1404afe8815f229001bf7f8e2b1c511d56207972e3efa588f04f7bea82b64c45bc28bbc5e3ca3b1be8652c54a3393e95a58c78c34c7c7ceeca983e91920467d184ecd5aad0114f83d0517e6ee82944cf134e9efdb68f14322517acc10285c892c94e6892c9659fb85af6d11322df94edeb77a379e97c7608e5d23c89b56a722b54d91f0811855c21e0c41ed362ae144e2f46eebb97a9057c673ddccc0f2ce178c3af086d1f93a092a2ae58bb0703ca66318913e69e36fd997020400a3e187 -Msg = 64ac0940e3926d11b78494ee758ee6e7f9f034ddb622a99f4a15fe5355bcee188ccbeae909bf0dc4e51e520c0900052d41ce777e934af66bcecffcd365daa7af7eca69f547e401bc899aaaa07f0d9268e8d08de65bef0b1fdb3048acab98c2606331f02b440b313ec98103707ebd75e1157fdfddb719d00398bf48a6cefd2773 -Sig = 3853af577c8f5f96cdb01de108ef8737886118ded95a315a5f2c34ae22f8fed6aad5cc1debcffa3576cc0a5050f572cfd171413275254455f19312054f06e9bc50f9d2dcdd1fac7ff2fbf456c2c9a1217992acbce6f867b48291911de8dcbde4e0b85a92536157d939dab1a42fdeeac9b15e5ed3ca542d1cab43aae3723349e405f998705fd0edb19d9f4631e6c7cf7ad1962e99fbfe11629226a634eacc2ec2bf3ee2d87c2f6fe934a2293f5ff81b4dbeab62eb4d94bdb4ed481bcc4bf400c2050faade7375c811967596ab5415cc6f60fb6169faa95303ceed5ff261a93e0c2a2eb657501db9866fe858694f57ba25ec2f514d8f75980247597a006ab3df80 -Result = F - -Digest = SHA1 -Key = 3082010a02820101008cff9858fa12773ef90c10e8f142f69c0350772f999ff10ba2a5ec71cbee037f3a78a1c46028150a0004fd0198bb8175fa30fd9765a4e2c679124ded055cd37d4102b5e695d91b58bbb44e72c136c5e3da43b4e6d5604edc36774c353a729bb1647f4a33d74ccb70f7b003617bab798887b8f65cbe11aa8349dbfc0f5036042d6cd4c49b10634fdd9d9cbf61d9f85c94ae98cbf77172c61696434ebc2ac6ae8f678f0e4029eacc8fb1699916bdce026cd94780de58a707659ff650dae7599b6b1b6337323832b45a4ede37fba87051658e79248fcebde7c36009954919c87f836a2084d88f5237f72f4d208412e91ff6f3252574df7c00334a0fcf8fcc7ecc2b02030b8f69 -Msg = 3ac87eafcf45920e233638ed4caa54765db4b801dd143ad978130943f5af41bc68f8bc83a9ba2c57045c668232080116880d20776f818c19142a068b619fdbb52baab85eadf1c0f135d5dc801d9b5209fdc99af81fd36dee33f71ec144662dc4eba41a48c33177621c6941eff4a970d623b3cd8dd55404df3d44faec884d6071 -Sig = 80ab1f8e28c9f939a7a15a6f81b41547e8497b5ba2dd08333243352e9d7aa347dcde6200a5e1cfc8136d3c59999ee571347c8a48d91e185d0b08ca31c8ea83d578f0fea6ad38c820d68b10221d493ea93e065fd846340ae09b94c6dcb78cffc79b958540689455734a9adebbbe50bed6e998e957079d11812bc2b4b497f9b9fc1496a639e021337d86c4df2bae4a065fe69e517655a571369a4454a1e29370689f8866375fad63075ef189f0ec3b686b5f3f02ae84c99ea67701d6906ad867d0dabef4f210e533d7daceda12ee0ad2a6826178503ae472f278b7f25d51c1fe8ef4b3d61da0928f4d7315abb27e570ec36fbdfbb4e3158e29b4605e1b082e56ef -Result = P - -Digest = SHA1 -Key = 3082010a02820101008cff9858fa12773ef90c10e8f142f69c0350772f999ff10ba2a5ec71cbee037f3a78a1c46028150a0004fd0198bb8175fa30fd9765a4e2c679124ded055cd37d4102b5e695d91b58bbb44e72c136c5e3da43b4e6d5604edc36774c353a729bb1647f4a33d74ccb70f7b003617bab798887b8f65cbe11aa8349dbfc0f5036042d6cd4c49b10634fdd9d9cbf61d9f85c94ae98cbf77172c61696434ebc2ac6ae8f678f0e4029eacc8fb1699916bdce026cd94780de58a707659ff650dae7599b6b1b6337323832b45a4ede37fba87051658e79248fcebde7c36009954919c87f836a2084d88f5237f72f4d208412e91ff6f3252574df7c00334a0fcf8fcc7ecc2b02030b8f69 -Msg = e88292f68268095c2d1059d6c671ee2cc3bc8734748f97a2896ceb22d56b8ea4512beaf7640e2f9a61a6f9cf526a2df0f4ae230602d20b98b6b989c18e7ca3854c60dd654006a231c9e2e61e1aee0a193aa0005a4e19af3b1b9f994bc74dbb9edf09b4689fb72aca6dac6aeca6664e4c9d7a6456e1cd4c34bf0762e708459e97 -Sig = 4b40e154df4538c2de6fc13cd93522acb23305b40890ae9e9ef33df58d0d1ada511346126fcd55fca4206bf3bf988c2967ade215538b818303596ffc33d4ae05ffb321ff303fa9a2b87b5467723dd1e036633398e15d9abe62d9f7528b1f31f3ad6ab70fd5af6029da4a961d006d7ff0f6b7e2f9181fdc47ed5fe0f74802e9d63249bd394bd6b570187dadb42a1ebb38bf1c78ba5b57c0a97ae29a6c9f8680b493a44c4909790143aaf12152d56df38864a36231f558c624077a00ef3619c58f7ebad4cdf706c4b2a47c6525c76b78f5473b57a0802432dcc67230fce82c87e41282b7e8f9855bf72f0770dd6be3f7fd260a435d51c1f2323257b507f97a7c38 -Result = F - -Digest = SHA1 -Key = 3082010b02820101008cff9858fa12773ef90c10e8f142f69c0350772f999ff10ba2a5ec71cbee037f3a78a1c46028150a0004fd0198bb8175fa30fd9765a4e2c679124ded055cd37d4102b5e695d91b58bbb44e72c136c5e3da43b4e6d5604edc36774c353a729bb1647f4a33d74ccb70f7b003617bab798887b8f65cbe11aa8349dbfc0f5036042d6cd4c49b10634fdd9d9cbf61d9f85c94ae98cbf77172c61696434ebc2ac6ae8f678f0e4029eacc8fb1699916bdce026cd94780de58a707659ff650dae7599b6b1b6337323832b45a4ede37fba87051658e79248fcebde7c36009954919c87f836a2084d88f5237f72f4d208412e91ff6f3252574df7c00334a0fcf8fcc7ecc2b020400d0d14f -Msg = 3853cd6d1384358712da7c1c583afee73fea00ee4aaf41be5c32d2f827a8280ce6b270454f822206c340d953c9ac6292ba041293be285dcff6fca5edfb0e508b88791d3a7309b8cae29f8cc9bbd7d8465ce905da8dcd37eab2a3222646511f55846e7e55675f1e5dd5bf3c861705898a8d607fcba0e6f497f7eef0aaeebabcf4 -Sig = 55dd7641ead751bc1b160724dd86e89497764119a998d5f800f97defe942aedc5cd2c8413918ac107a705dab99bdb182037f051b61932fd4d41f0a890f6db996cf99d210084536e3711653ab4ee5ce5b066a569306983c2f5b6c00c51fa49774f33c13565b95e832588ad2c004b81887c3df340096920908979e6f168c8818062cb04391f5649869e35efe762628f49d6751b7a3e0b184e9f935f591e4f2a1db158cb78f8e256c74c294ff424bc2efd3145cb234af88c623afa67b3eae68b91dc16a99ca36fca81653aa3ea47338c5a5a2a5b2340cff80672767f6e9549c6adebe6a84a4232560ad431a5f42a3ded809fda302ea7ce944ea3e7be7853704e1ea -Result = F - -Digest = SHA1 -Key = 3082010a02820101008cff9858fa12773ef90c10e8f142f69c0350772f999ff10ba2a5ec71cbee037f3a78a1c46028150a0004fd0198bb8175fa30fd9765a4e2c679124ded055cd37d4102b5e695d91b58bbb44e72c136c5e3da43b4e6d5604edc36774c353a729bb1647f4a33d74ccb70f7b003617bab798887b8f65cbe11aa8349dbfc0f5036042d6cd4c49b10634fdd9d9cbf61d9f85c94ae98cbf77172c61696434ebc2ac6ae8f678f0e4029eacc8fb1699916bdce026cd94780de58a707659ff650dae7599b6b1b6337323832b45a4ede37fba87051658e79248fcebde7c36009954919c87f836a2084d88f5237f72f4d208412e91ff6f3252574df7c00334a0fcf8fcc7ecc2b02030b8f69 -Msg = fefde998a5de015f63b0a75ce7f79f4dc681d18dc298aae64b7cbfa74610b3f70ed35b69b81221d19c5ca6551037acc7771132327b79e0b2968fa689d7b9a170e3983e2b3a3ba160bb9248a96b25ebe87205a7db66035cf0cc21545adc4625648536d805b1c04ab5ca3ad3807d2a2659be4678b00c9fe547f6190f41de1e087c -Sig = 17a01e1254dc902e8c6d607226175416c17ea28d28696b20706790dbac60f73732c804b6756df87ce6b1baceb22d582a6e24bf3d1754ccf1ca57e06150e6da60bcb8b116b3b8a31a715e0872b6047c6a4d7f6817ef5f12d13356b2b50fd71f5d9a38a0c35072ca38beed29ba541557b0525fd3d6639661037b5b61bee51aaf4e6c6bf5c577f9dee4811319d671911138050c54bc273db9eed5a7bde3281e65942cbddbf909e87587c58c8d40c081c81950f73a33d80bea61a56ee4a8930ac3b954d4a0706aaf3c753efd304946f90f33a20cfde65e388c266bad024cb1aea8879c78fd0d9bfddaceeb84f10ab66cfce1aa4f0651d7b1f0b4ee808a2e1f490ead -Result = F - -Digest = SHA1 -Key = 3082010a02820101008cff9858fa12773ef90c10e8f142f69c0350772f999ff10ba2a5ec71cbee037f3a78a1c46028150a0004fd0198bb8175fa30fd9765a4e2c679124ded055cd37d4102b5e695d91b58bbb44e72c136c5e3da43b4e6d5604edc36774c353a729bb1647f4a33d74ccb70f7b003617bab798887b8f65cbe11aa8349dbfc0f5036042d6cd4c49b10634fdd9d9cbf61d9f85c94ae98cbf77172c61696434ebc2ac6ae8f678f0e4029eacc8fb1699916bdce026cd94780de58a707659ff650dae7599b6b1b6337323832b45a4ede37fba87051658e79248fcebde7c36009954919c87f836a2084d88f5237f72f4d208412e91ff6f3252574df7c00334a0fcf8fcc7ecc2b02030b8f69 -Msg = c0b2621f30115b296d84c7d4e015981a24435e1877a660cc6cd6ec1de088eb1b2efab889a79233993cc211f67e2e7607c911c573bbdcb7e0eb21aa01d8b03ccf20001916f3d01134c60d6e1d4cf784a3a28089f5caf4a7655adf506e752cd2f5fb8a2bcffd141e847430865232b7eb75185753a68a365ae220d8856c9e43d415 -Sig = 368416eab883a2643e5288ad1d97887941e6a42a54a44336f12336cab4038e693f98ebe3df7378fd501ec9c7f267d6f8fafebc5340744a436d99647b19df668169849032b852df30da848e4605015aa0a9ce39c9ae25368c0575e7957273639d957b392e3556742bc5d0214c4cb82e3d342d3a73f72b7184b72b2ae2225ee830b1ddc528460046d83526c6d07b2bb89d4593b459f248eec995442e4aaad368dc0d3a10907ee779eb23c8a60df52fa461ea99e47e8cea7b761a02bdf81d43e4a7a44992d1317211607e099141de07ea034e95995ae52ebbccd38d0964e3fb4756dd6d57fb01dcc44b6d89852bcc605dabe36398e53029f4397dffef3ece22b939 -Result = F - -Digest = SHA1 -Key = 3082010a02820101008cff9858fa12773ef90c10e8f142f69c0350772f999ff10ba2a5ec71cbee037f3a78a1c46028150a0004fd0198bb8175fa30fd9765a4e2c679124ded055cd37d4102b5e695d91b58bbb44e72c136c5e3da43b4e6d5604edc36774c353a729bb1647f4a33d74ccb70f7b003617bab798887b8f65cbe11aa8349dbfc0f5036042d6cd4c49b10634fdd9d9cbf61d9f85c94ae98cbf77172c61696434ebc2ac6ae8f678f0e4029eacc8fb1699916bdce026cd94780de58a707659ff650dae7599b6b1b6337323832b45a4ede37fba87051658e79248fcebde7c36009954919c87f836a2084d88f5237f72f4d208412e91ff6f3252574df7c00334a0fcf8fcc7ecc2b02030b8f69 -Msg = 84ada4599f0bc0a41db787310f53a1588282b8669ba82e89e7f20fecec974422045d0ac86b5ea366960c4b97c6736e6adebe180771fdad962025da5c2358cb2725679fed559619b0ba9f98a4c6f949942f599b82fa7af38ed91aa219b645142990d5490f863a8948317754a2376d999f1d5c281e5da76838b9d74d69cee385f0 -Sig = 8286a2139ece519ecdf8aebc2db2427c207100212008dd27b1058bf46db2a477ff55bde9f0d02cbc3d93b6a97361bcbb3aad990ee9d255c58a96bd7108311d3d9276247f274d5a0dc9e6e411ff389de34cb693b273b5da7bcaafa101a5fb6ef42fdd6288ff6b6868291ca914f564c75fcad55d7c2ca3bb5da2abe02a3d589686f79c4bbf24876cdba03ffabaab32395245d72051c4aef965c0c18ee7ae1d19d8c179086f6c0495df64c44b618d5e9d07f20e051ac360fd6a84e87f7f7a777059d0ea3eb21a11de8cbc22724944c71cef002b612278ade389530486df058cc5459c20dfd4e9695c04bce91dac8a1ec79f43f80c0d691a1cfd1a7204af2a7a1a96 -Result = F - -Digest = SHA256 -Key = 3082010a0282010100a17a08272e656cf600f4650ef0952b15d568d9fb7f1b3f3559aa3792743f7d895e4e26dec2bf09996de8a99f7c434bc25b0c7d61e83fe5647c213b19902abfa053321a16048642cd3800de26172eb39ccab029130ceb82e5c25c676e89007cb00666a2d8f64e59fea64628cbec9c361abe25841551db01f58b80ab17f02a93cbaaffc2630ffb6f56f206b8a6f8e0f1e5790652e7c7227258dbcd5924e94876f983ed02e4e82272f5d44967bc501d1515d80dc25d5c838d0357d0d1704b0253d6e78802c02931000fea2e865c90b266c8a0b472e8eb17456777973342da6978cb45d2100cf91ca6f6d69ff30ee8f3164bfb180de0b355c067bd8f1a8544b9aac9020366a13d -Msg = 41c00eae64f3e330222e114541eeb5eae1a705ca0c0687a68e7982fa07f1b3de3ee7402ab89df2dd8aa69ec06ba8e4460d611cb7aee88e8dea35e11fd3e4d77c4336379a71590ab0c3e909e0e3b6571915c86c3cc8a0517d6ac1130d816f72f6f8b7d946b6af936f76ff3beed2a0742ba0e4dba082b73a3eb924ff0c3a1bec12 -Sig = 13165444a1f039da049b998e332cf7655149975713b5378ac5772f2e176ddbf338a25e297d873cca5f19eb4e4157c532d06249d1e99c2857f8d74bb74cc7593bc872daf5b45541a373aadc43a0711b3b2f27ccfed06d9578b2a3c7d10a12e398d0302f86e05f154e3cfd2a0e072aae157cae529bd5688fd0ccea22f58181d069eaa0957a5b0eaa2e3f5a4aeaf3d1512a43dd2f8434579eb57e23852d7323c5dd22359e9dfec59dd75ee3b8e234a41863fe0a68c46f777a9f48887a786cfaa40db1c7d9e04efb8a882d8169764b47a013b5d1d15f4cbf758adc83c53e9548e77de20f14b3b5f064465beaaa32ee41755aa48264a14df837ce5fb85a5ab91bf6eb -Result = P - -Digest = SHA256 -Key = 3082010a0282010100a17a08272e656cf600f4650ef0952b15d568d9fb7f1b3f3559aa3792743f7d895e4e26dec2bf09996de8a99f7c434bc25b0c7d61e83fe5647c213b19902abfa053321a16048642cd3800de26172eb39ccab029130ceb82e5c25c676e89007cb00666a2d8f64e59fea64628cbec9c361abe25841551db01f58b80ab17f02a93cbaaffc2630ffb6f56f206b8a6f8e0f1e5790652e7c7227258dbcd5924e94876f983ed02e4e82272f5d44967bc501d1515d80dc25d5c838d0357d0d1704b0253d6e78802c02931000fea2e865c90b266c8a0b472e8eb17456777973342da6978cb45d2100cf91ca6f6d69ff30ee8f3164bfb180de0b355c067bd8f1a8544b9aac90203391c9d -Msg = 671ada018b6132b381978036f19cb9fa9cf7d07334642cbf718c59896113fe2d00d70f1c087743830a13c927be53379398abc3769bddb54772bf1c2abd3ec017a9a35939c315fe940e5fe0eb52f438e1b8307e5e94e1dc348206e203b4d77b5a8a05201e63424b30b4042f4a5786a62a25106bf3c67989d0c8ea13daefe4163c -Sig = 2942af5fb4e5230990bd20c2095fa29e9aefe6e6489111971f0dd397e8d461ab3f59c0f29b86d11ff187984c54c51b0bea35f479a4b83c33dcc8f149f56eb9859a71e45f3a33b83d30eca87bf19803eb5888ead3151d9b673546e2c0dbdb523c34331cbd3a83baae6b55dc465de20d40c5bca9647d74b8399d6e40404828772690afb93b314a55efb5149603c8421fd85ba5b61828c6f679b53f929398d87affb8929e4684631aa2e86d492d3d7c9a90c58e465080442f69623e4eb2080f7af2ed0442c0bb3f0eccf45d4f075e4474a2c058665f25164c457fd19e5852061af9b232cfd2eae7b60001364c013a1155a9af18cbc134d1ee8d30c157cde3a9ffbc -Result = F - -Digest = SHA256 -Key = 3082010a0282010100a17a08272e656cf600f4650ef0952b15d568d9fb7f1b3f3559aa3792743f7d895e4e26dec2bf09996de8a99f7c434bc25b0c7d61e83fe5647c213b19902abfa053321a16048642cd3800de26172eb39ccab029130ceb82e5c25c676e89007cb00666a2d8f64e59fea64628cbec9c361abe25841551db01f58b80ab17f02a93cbaaffc2630ffb6f56f206b8a6f8e0f1e5790652e7c7227258dbcd5924e94876f983ed02e4e82272f5d44967bc501d1515d80dc25d5c838d0357d0d1704b0253d6e78802c02931000fea2e865c90b266c8a0b472e8eb17456777973342da6978cb45d2100cf91ca6f6d69ff30ee8f3164bfb180de0b355c067bd8f1a8544b9aac9020366a13d -Msg = be91864d3728f895c689f09b28484138e0afa29589bba7486a68f0bf4b2ea1e287cc11f46344c7ba9e27a2e049125798d97921847ba3b3d6a7f672b6f875e1e43b875c9ec6fa0ac40b470d3a6c18fb8e510792da78a9a7ec8dcb60a5fbfba39f014bce120851a9f9347299703961166170e25e5f2ad46bd2446e2355fbc9d05c -Sig = 631529e0b149ee1528d514861cac711eab8c01c1c22c7ff6ccbc08783a1ccb2748c22e57a1deefa867dcb1ae74c40b1969db2cee64c0706af8daf4c9e91c12672d8f0849af4bd0c4c5f8e439a3ba7e3ddf38a9b38db545410dec0aa40522d6a3cbc2ab53a838298f0b93ae7d362158f04858fc33ec03fa6d3b7ff0f27d74cc4abcedd25642f4d259d41511456004c24385ec32553ae5d5728a8f68707ddd6bfa51c2f4574e1c96ef4db0715675fa4fbc57b9091759eda387e16057e9d89797f61df9196044b98667866e12c5132928eb735fa2d02c0ee7e08ed68d80fe1f76bd85756a3967c6d3e1378a754fecee72362928cb622731bb01231758ebcb805f5e -Result = F - -Digest = SHA256 -Key = 3082010a0282010100a17a08272e656cf600f4650ef0952b15d568d9fb7f1b3f3559aa3792743f7d895e4e26dec2bf09996de8a99f7c434bc25b0c7d61e83fe5647c213b19902abfa053321a16048642cd3800de26172eb39ccab029130ceb82e5c25c676e89007cb00666a2d8f64e59fea64628cbec9c361abe25841551db01f58b80ab17f02a93cbaaffc2630ffb6f56f206b8a6f8e0f1e5790652e7c7227258dbcd5924e94876f983ed02e4e82272f5d44967bc501d1515d80dc25d5c838d0357d0d1704b0253d6e78802c02931000fea2e865c90b266c8a0b472e8eb17456777973342da6978cb45d2100cf91ca6f6d69ff30ee8f3164bfb180de0b355c067bd8f1a8544b9aac9020366a13d -Msg = 4c2d1103c36e96d179291397b1238177d4af3b6fb9dc622d23ed80258b096be020346d970d7ea100fa7aa068d5f25d02d2d94e7fb081cdde3f0fbd861f2b7092cafcc86cd4539d9d72265fe33a41fd84293805e3eaa00c51557e502537009c0f516b6ca9a355524fea149831677627a6e2b3a7c4ef9fe82d7024812b5bf0b700 -Sig = 4d8b5ba1f5409f476221b3527be6389c1ca3eb50cd62113ad2f712cb2142ceff3178948670c9cb7dccd44896ddec9c0eba228370cb23919610774e9d70d6eade95865042edca6e90cdc007234400591e1cce71bfbf5a546548d483e68905113693a3d1719ce376e72b180b7f3c7ecd13469b8edd7ef95d9e330d78cb36e37b50e87d161b1abdec433421a3a65b49b39cacde0678de41df894d6a2b0f171cf91052bf0f0bb7cc89889bed7699e33540b4ec8f93ca2c690783dc5d80fa5b815aab0feb3ef4f10c0cb46496aaf6dfd2e5b3a7dd64386ab9a4da0319bd927facaea80ba5f4b1d71e16fcc7550fd8211756c35935507a32f204858e2b475d28eb56c8 -Result = F - -Digest = SHA256 -Key = 3082010a0282010100a17a08272e656cf600f4650ef0952b15d568d9fb7f1b3f3559aa3792743f7d895e4e26dec2bf09996de8a99f7c434bc25b0c7d61e83fe5647c213b19902abfa053321a16048642cd3800de26172eb39ccab029130ceb82e5c25c676e89007cb00666a2d8f64e59fea64628cbec9c361abe25841551db01f58b80ab17f02a93cbaaffc2630ffb6f56f206b8a6f8e0f1e5790652e7c7227258dbcd5924e94876f983ed02e4e82272f5d44967bc501d1515d80dc25d5c838d0357d0d1704b0253d6e78802c02931000fea2e865c90b266c8a0b472e8eb17456777973342da6978cb45d2100cf91ca6f6d69ff30ee8f3164bfb180de0b355c067bd8f1a8544b9aac9020366a13d -Msg = e896edb0455f372c01d222d40af9298bc17fdbf450b4d0923dd7e12d4095987752cde6ef079614061d83fc805526791e81d21c7adfa52132a5c6a148ddec09c97320caad8dc352ff1ad23c3eae69c3028d867de20610469602187959dc5e6791731701b27eedd860204848d4bdccef800b2364f66cfc26067b53d326e4f39b18 -Sig = 6e21208ce42d4ec6512c300f6f9c0d43163eef7e05365448380ce3fec34913a701a5e30455556335101af1ba40ea69fc17b30c4192730336e8af2094d36873cc83617a3feebd2b09dccac1b31b9352c1db3c3dbb7ea1e774578e44c92ea925dafd9de71c46d3f25eb015199150e6e8c26ee612edc3fe2f0ca6acdca9274fcaa87d97e104112b1f85d1c3f3e92f0be7932613afe5a683c0e52f9234fd9ef979844e277e31d3c2b725bbebe97a9a8e619f8308c01a9b3ee48e5dfcca5b153e4890effb297ee0fecd30fd71b6dea0694530fbad6c65abc4621f23263ceaf2cfa21fcd19cb180812667e8b1ae108323ec289826412f124547ddd92024c0ea9784654 -Result = F - -Digest = SHA256 -Key = 3082010a0282010100a17a08272e656cf600f4650ef0952b15d568d9fb7f1b3f3559aa3792743f7d895e4e26dec2bf09996de8a99f7c434bc25b0c7d61e83fe5647c213b19902abfa053321a16048642cd3800de26172eb39ccab029130ceb82e5c25c676e89007cb00666a2d8f64e59fea64628cbec9c361abe25841551db01f58b80ab17f02a93cbaaffc2630ffb6f56f206b8a6f8e0f1e5790652e7c7227258dbcd5924e94876f983ed02e4e82272f5d44967bc501d1515d80dc25d5c838d0357d0d1704b0253d6e78802c02931000fea2e865c90b266c8a0b472e8eb17456777973342da6978cb45d2100cf91ca6f6d69ff30ee8f3164bfb180de0b355c067bd8f1a8544b9aac9020366a13d -Msg = 3f49b00ac1f9255907cc03f9b45dc787c250d9d6833fb389e2f746e1ede599d390cbb45ea3b7bc1b28365f16cdc573dcb988d9d5843fa8d4877587ed57fa5b878c9423b1c7f21fbaf3e138fbcac39cf89b3ca9a84b2e0c109be82a17a89abf95b80cc4ad3390975df0365653b23e8b02f3d30ff6e0f62864a4b8f506e9ac0c25 -Sig = 90ac97a93a9f6c5c6e268e3464b6d547dc29bff8797d9f776e2f56fe1c30fefbb679ca9fafba40f400f08a5163d757e638aee083084581b760ab30071e075f90183db328e1ab519fedca1ed92a1e4e473b538e2470606b5379abd2e4b73f4c132e30c115bc34c73019880571c30fa6c6c1e320c13022317cd3acea8c520f87cf054e84be89a952202fc3f8d0d707cd8806b8b22bf2c0d7bf884688607a05b635210b9a7e2e1d2a28e324c1573d363d5a76ea0aaac70480671caa4969e5177448e62e76270197697fcaab720d811588c8ab540f053c8b23b7cefad205fd4c444bd5e73d80c62451158331face2b6f7ddb034dd5e61bec444f68d0c7e39d2df940 -Result = F - -Digest = SHA384 -Key = 3082010b0282010100ce30e07f34619a8a127f0e4401055bbea222f7c9eca47e0ace1d2adf756c0600f88aa165117a6f069746facb76a74ce4769d308669bc7d200763a2919ff119cfe6ec2a614f1bc8d4c4620921b1e60012fce58b39b19ee72ffd76544469d5e996215582fca819b7d6107224c6de0439918702e2de1fdf820b0900d38928877926fe8713f6a81be084cf0f43b7c8b16d065817855ff43a0c453ade8431b6cedf700733853cf534db64e1b7e9cd25f315fe2b66121829356d502d5c833a7240ba27b2eef11cc4943f3f483ae31e5bb9f4006418319520d2baf5821d740bb7ec2df1f573f3fc89ef27090453f9bec58dc0fe8544ad9a6b157fe5183136bc768b39cf020400ee7f0f -Msg = 594007ec8417ba706089919c0659195a06e8fe38094ccf18b5a10028d1a43515aa7ebe7cb5dd5da2754950649fb68b717d5546b690b0b71a79f6216c1a930d99f804d723e3ea6dceda5d549d2982ecfcd460f43f38ef504bf0720a93f60798470a7d5dc75865725e556ca52deae8c265d4b012ba4b312214e1bec587ae285c85 -Sig = 25c7ab6e2f2365bf872dbf31ccf19239ca06542a9fc8fc47c69d25476db031d7869d3a340e1e0a8933fc36b36c49a4ef34af62e53bde304a4ea28fb14e20b3785a543a05bff10c4572753267179b45e32ca403c1e60a49e15086e160b006cbbedd908854e271e5a72c1695411da6078c6157d1d929d1b9be091c41f30f839de4500162ecb8507ae963c0fee43e6a431b7724fa0286d1f34f67f6e41cd6880aedd38c4261e43223eeadfa7d7c21c4ec3a47d04cd2fe5184180e4fb53091b7968df377fe09f02f9fb9ecf4ad929b373c131628fe07296dff3b8c278f50ea61dbb5c1023dc311e67b45e2986ed4121eeb6a345ba4c32eedfdd76e78a036414b1839 -Result = F - -Digest = SHA384 -Key = 3082010b0282010100ce30e07f34619a8a127f0e4401055bbea222f7c9eca47e0ace1d2adf756c0600f88aa165117a6f069746facb76a74ce4769d308669bc7d200763a2919ff119cfe6ec2a614f1bc8d4c4620921b1e60012fce58b39b19ee72ffd76544469d5e996215582fca819b7d6107224c6de0439918702e2de1fdf820b0900d38928877926fe8713f6a81be084cf0f43b7c8b16d065817855ff43a0c453ade8431b6cedf700733853cf534db64e1b7e9cd25f315fe2b66121829356d502d5c833a7240ba27b2eef11cc4943f3f483ae31e5bb9f4006418319520d2baf5821d740bb7ec2df1f573f3fc89ef27090453f9bec58dc0fe8544ad9a6b157fe5183136bc768b39cf020400ee7f0f -Msg = fa742374566394a67041b2671ea19204ca568b0c1588f605c008335dcde1eda4e1309ef8ed3555c00da9b79db152439dfad6dbb267cd8063b0195ec2f27a089e0d5d04f94af58abc428d89aafb1deb93531b1acaa293c3d99b7ada727340dea946a45e61b6ccbc04d59531784528114e9dce503c0f0546cd48d3af57985af62e -Sig = 01c7c3dbf4d817f4c473b23477df5ce1de19da551dbfbf3bc2d1d5ccc0cc0e92b047bde1f953f7bd0617850f9fc9fb6df97cafb51f123006ebe6271e5ebdd9e5a78d3a537c723fe512dfdefcb424caa8918d3c1949e8f495e01ba3c74be7bcc072f9f9708b08d15380d5829553c586797bd8d6879fa705511e5f8471df0eaaa9fa257fa867bb2bfbdeca0d7e333e4551fe9d7fe0d933397b33ecd261ad3f0f2a387be15b86916b18a3c96a782aedca04b9d04c8fe40d6ad607e20d29190ea97114d42b21a5b852c5c60301525f59345e648e2f6729b5f28ac43db465e3538f279c0759ac5784cc0ff8e5c6d667465af27257718029c94ce06665562108a8ef93 -Result = P - -Digest = SHA384 -Key = 3082010b0282010100ce30e07f34619a8a127f0e4401055bbea222f7c9eca47e0ace1d2adf756c0600f88aa165117a6f069746facb76a74ce4769d308669bc7d200763a2919ff119cfe6ec2a614f1bc8d4c4620921b1e60012fce58b39b19ee72ffd76544469d5e996215582fca819b7d6107224c6de0439918702e2de1fdf820b0900d38928877926fe8713f6a81be084cf0f43b7c8b16d065817855ff43a0c453ade8431b6cedf700733853cf534db64e1b7e9cd25f315fe2b66121829356d502d5c833a7240ba27b2eef11cc4943f3f483ae31e5bb9f4006418319520d2baf5821d740bb7ec2df1f573f3fc89ef27090453f9bec58dc0fe8544ad9a6b157fe5183136bc768b39cf020400ee7f0f -Msg = 27291335228e1da94acb8a3b47f7e1e581e7763a88ffeae4b248f55006c363a858fd5d02b6e4ead703d9b6b6e2061139d6f23a39a752de3e0723dc3975f54b76628abecc929fc617c60ab9e89805b27aa6cad9e8f260e59e89b4df0d63eb28a48bf7bdfb7f68ba51da851d38309ccd8f3a96dbb133ce07ec81248635984d0219 -Sig = 017fd9586eab20cfa751dfc278b426ddf05fc29d0c51d1de59f1adc1aacef5c31abd2c5491994f5884f7b6e939c238ba61a25c647eb881d34cd21e99fa44f778db68268b46dc6e7f06dc36f28d9d96706e8e3c02bb2d6a7bf11c8fba3b7477697ed5f43ebf109c3f6a70ac2af0510d91ed7312c131fabe48df9ef578965982649a3aedee8e103845d2ca72f5ea5f33f5f72a191e280f732cfc4d2cbd32981f385518da19755bae7c90d398c15e75492391c4bc06e61ac883ce397ff2a464bba432c3baaf65a053446d6d2b98f15243c00f2b248fcbc3ca46fc732f7c1297ed346a80b93758ab55bf32f8bfea9eb791c26b642ae085321831c0f1df200adf3afa -Result = F - -Digest = SHA384 -Key = 3082010b0282010100ce30e07f34619a8a127f0e4401055bbea222f7c9eca47e0ace1d2adf756c0600f88aa165117a6f069746facb76a74ce4769d308669bc7d200763a2919ff119cfe6ec2a614f1bc8d4c4620921b1e60012fce58b39b19ee72ffd76544469d5e996215582fca819b7d6107224c6de0439918702e2de1fdf820b0900d38928877926fe8713f6a81be084cf0f43b7c8b16d065817855ff43a0c453ade8431b6cedf700733853cf534db64e1b7e9cd25f315fe2b66121829356d502d5c833a7240ba27b2eef11cc4943f3f483ae31e5bb9f4006418319520d2baf5821d740bb7ec2df1f573f3fc89ef27090453f9bec58dc0fe8544ad9a6b157fe5183136bc768b39cf020400ee7f0f -Msg = 7a55bdcc36e6ff6c685ac6e7c3250a6c881aa37c05dcf6fc5c95d38985ea9e0b962ead8d42d5f24ca02cda0d2e4874b4163cd613b090bd0047ee73aa201df62db83456634e075ffda1e678d3fb87cb796e40a6135e79216a4062023fa0e1dddf69cf80f761638eaaf3ee69e131c955e2198cdb2517816c62cc5947ef0e1d9d49 -Sig = 54807d1b14852038dc94c53e2bb8bea76f074fe33897ded6222b52f1ff0c9144ebcb38d83b70f6b2d59600ef9ad089d4e3ad1ed35cda4fb54213b3e4b7b29d5f18725a03e9a9318bb56d96d9538013b110e7d810980aec6a451b52330e7d7f8fe02bb29519ea98053cbcdaa8d3657c0de6a4d268dabb6536d050de9526a03b242ca9f30e7889088645fdb0e46ac09f8a7bd79914ed5873fcd66137f93e19a5e1c372869113adfffc2186c70f87eea2f91b83235ab3113439b5cf1b0fdca9d4db02af34ab48decab4b4b0db27c6fd36f8dad5fae9f395417b3049f8c995318a2e09768869f23a349072fb7c885efb32cd3aee0b35469fd8516ae252e45df0ea25 -Result = F - -Digest = SHA384 -Key = 3082010b0282010100ce30e07f34619a8a127f0e4401055bbea222f7c9eca47e0ace1d2adf756c0600f88aa165117a6f069746facb76a74ce4769d308669bc7d200763a2919ff119cfe6ec2a614f1bc8d4c4620921b1e60012fce58b39b19ee72ffd76544469d5e996215582fca819b7d6107224c6de0439918702e2de1fdf820b0900d38928877926fe8713f6a81be084cf0f43b7c8b16d065817855ff43a0c453ade8431b6cedf700733853cf534db64e1b7e9cd25f315fe2b66121829356d502d5c833a7240ba27b2eef11cc4943f3f483ae31e5bb9f4006418319520d2baf5821d740bb7ec2df1f573f3fc89ef27090453f9bec58dc0fe8544ad9a6b157fe5183136bc768b39cf020400b9bc79 -Msg = 9570e4ae5307f347703324da8bad990a8659faf8d17acf13ec232d3227ee95e0adef19f6c0ebc07046c62c79853b7ac82bd06a2f9108c07140daea55b562e2f861d75667f4bd076ddb5b6faa0770a6e5f12286a4db370ef95887049e0eb1de44bb0ee32976e38ee938db33969ab4e40ae038967c376f80523b13c436bc44516c -Sig = c442aefba90877c319e5b8b2a87b50778bda701fa2bf5af4724d3eb7f894daea3fd719cbf0fa88ace828a1c7ff1701077efca06b8717fc2953f055d69bf8cac6f5b352da3ea459282903d42e886642c5ecf49dc5c8579f22d88c951a562a335b615df1bffed752abaad6a60612b186a4e971ec2eb8c33d3595a47e8fc871412b8b8f5f2fd262306499dd81f373e29144776c04393a2d433e9e3dd221678b2e62e7f7df1d40238c2c10c6f923c83b055e2a14ede1ec3ec1c48ec95faf0d61831e8539dfa62a3723e57d12bda7f75c2a7bf77d8a4a96ad2ba9a01d615b6ef05bdaa85d4e1e4804e316f4d32b8f1c3532366872497f139bea71a4f86ce00edab93e -Result = F - -Digest = SHA384 -Key = 3082010b0282010100ce30e07f34619a8a127f0e4401055bbea222f7c9eca47e0ace1d2adf756c0600f88aa165117a6f069746facb76a74ce4769d308669bc7d200763a2919ff119cfe6ec2a614f1bc8d4c4620921b1e60012fce58b39b19ee72ffd76544469d5e996215582fca819b7d6107224c6de0439918702e2de1fdf820b0900d38928877926fe8713f6a81be084cf0f43b7c8b16d065817855ff43a0c453ade8431b6cedf700733853cf534db64e1b7e9cd25f315fe2b66121829356d502d5c833a7240ba27b2eef11cc4943f3f483ae31e5bb9f4006418319520d2baf5821d740bb7ec2df1f573f3fc89ef27090453f9bec58dc0fe8544ad9a6b157fe5183136bc768b39cf020400ee7f0f -Msg = 33bdcbfd07f82ceb4a4b208a3d3c24316f745360ec1f374ab092df90613031503d8e825e51d564d1eb68bfc253c72450b6b45de7639449c33a17e7af601bb01338ce2a2d8f13ba9f1728b92a1785cbb960076ca1834dcc274163dd43439daaa30cc6eaf32b7ad55cb5d1364af23ec27357b6a815b414697eafbcead2717ec809 -Sig = 2077c18cf72a6a6366fa6632a286e116ae694008cfc3f13b1cbc005fee635a317abea470fdc28fbbe9cefa2f9ed3796488d00a8ef419bae16ac54f5c7c5332f2221b4e753599e20d778d714dc065106d0f023276afbf012c5cfb97ec3a364d27392d2a530acde5b6631b6fe40fb825bf31c7e7dce52e1f9a22fff93f8a5f2a34dfb03fda309c580ba5cd174886ca1af32b24f4733093a4f360c696107943e88e0e9896f78011800e6cda15c94154db4167d4a508e331c08d0127446de659cf2d519f0451a50c38e14572afcaba1e8f0ac218ad250c32cb370b5390e7bb010b6ec10d81c05e86f99c63139bb7190f605fa9ca8c8decacbcfc4d3c6e61d1895c0a -Result = F - -Digest = SHA512 -Key = 3082010a0282010100f5596b5c452079319067a1bb3fd2f9c600abe8a8be658285a99b19dfee65f03c52d7e826943a934bb25e79542b7a9e179b6f95698bcc83e19cc6db49bdf718957206d83621ae4e384eccdf283b52fa3c4e7c0859859b574da49cecdb87249f20f16f0a9d63e6907256d5db57ed3cf12675b0ae63b458a1d4b64a2c508cd6f18a4ec57e5cdf2c62edebf1b739bd01d8a280d3bc88a8a81f9627e4aa83f0656b03ff04710ab4531f4f854a6a9fb326728b8752f61acdcc5e1d8f523e69b32b1aced6e9850a777048f294365ed98fb85fb4c0a0829279d0346c8efc1ec6afe7576116d15339cdcd1a8fbf4999264bfe22e9b6e5b6dace317c7689b866a72152829b0203534f11 -Msg = 142565e97e8f5f95ec31fa8325beec222b3eedd82062bef364146ae2fe53cca53d3e51829e6e00faf189b7fbb814b757d089627553aa4447bc14517b4c176df6adc5327ed649edb62e7be950f4b1f17eded710a900c29b66f0c171a62875822cabe38e45ecc82fb3eb2c1aeaa13aa27f9e4f7eddf151cb3a484255c958151231 -Sig = ec232493d315f0c4ad232653ec9de464c33f956af3718c5b9f1266e7402c61c5ee9c177f14f8dcadd1d074e8f4087516b77b2477e4fdaaf48fd138e89903ff04e11cd0fb07d832ba545025b921496443b52978e215239474a031c44bf96ecb4aef393fbe0fb52e819cae819af3ab41c48b80afc60aaf41eefcf36cd00c2aea08dd09e5aee0056ed1b7f15ba237daae1cf4fd944dd09596e5dc0f029bf83b52017018c046e0cb58e3f24593117a624064d5c9afaf9df69bf92c816b72e625bfa5e9cd96e963c62b0cf82eecdc1852c1c02147030fe540dc270e454b4106f8116cbed3231630c7c1345be5f8847f8627fa082675c680a98ff109649fc4399d40aa -Result = F - -Digest = SHA512 -Key = 3082010a0282010100f5596b5c452079319067a1bb3fd2f9c600abe8a8be658285a99b19dfee65f03c52d7e826943a934bb25e79542b7a9e179b6f95698bcc83e19cc6db49bdf718957206d83621ae4e384eccdf283b52fa3c4e7c0859859b574da49cecdb87249f20f16f0a9d63e6907256d5db57ed3cf12675b0ae63b458a1d4b64a2c508cd6f18a4ec57e5cdf2c62edebf1b739bd01d8a280d3bc88a8a81f9627e4aa83f0656b03ff04710ab4531f4f854a6a9fb326728b8752f61acdcc5e1d8f523e69b32b1aced6e9850a777048f294365ed98fb85fb4c0a0829279d0346c8efc1ec6afe7576116d15339cdcd1a8fbf4999264bfe22e9b6e5b6dace317c7689b866a72152829b0203534f11 -Msg = 53b72306191a180e86830fd37a1f13847739cf6ab30149ca6b8ccd0d791d261e29a315144982fb117f96d969e0757a07bdf5ef0dc0ef3cbb38425192b21a3cb9c9729c9f3fd759e24c6f9270353bd7ec21999953290ddedfae40392bef49fa99da2ca2f123a09a4a9416242ea4f691f94a2cb58213e398fd73906e205833c9 -Sig = 6f17ef5b663a05ad79a4fd77515845d7dcf6fe5eb928f4e6567d7d615277ad7963595baf26971c1ee8db870c9e830d5be09732b8911476b09c1493aa1ce8faa2b527349ebfc882eb93acca56f5c0f5682c784c4094ef86aca1bf36acc97b7a9a96aa349c5f8d2034b92b8a8725be2091f7adaf8c3a1ff14a1e900a35bc6f2eee130595411a3c94aff5d7a0f9f9f5a8df9bbd5b28676ebc587c1f1e26000cc8b789e8c6974cbd49d58c139fa5847a924f14074d340b7bd4f325773f09d82a0da54da2d7df251951c5950762c9a3a0d2db10693f4aeeb97780367698aca99a42fa47b5f185e4c607cb0dda51aa2d93611e2f5bca343baef36dd6b0bac18cfa6b73 -Result = F - -Digest = SHA512 -Key = 3082010a0282010100f5596b5c452079319067a1bb3fd2f9c600abe8a8be658285a99b19dfee65f03c52d7e826943a934bb25e79542b7a9e179b6f95698bcc83e19cc6db49bdf718957206d83621ae4e384eccdf283b52fa3c4e7c0859859b574da49cecdb87249f20f16f0a9d63e6907256d5db57ed3cf12675b0ae63b458a1d4b64a2c508cd6f18a4ec57e5cdf2c62edebf1b739bd01d8a280d3bc88a8a81f9627e4aa83f0656b03ff04710ab4531f4f854a6a9fb326728b8752f61acdcc5e1d8f523e69b32b1aced6e9850a777048f294365ed98fb85fb4c0a0829279d0346c8efc1ec6afe7576116d15339cdcd1a8fbf4999264bfe22e9b6e5b6dace317c7689b866a72152829b0203534f11 -Msg = b286242ed447af64ee029c7f33b5428d440503773f30748ff843be68868d45ea025387a58bc546668d31e9084377208d7bbdc76e9a630d2edf39d535ecf05cdc82cf1cc58ca7f16d5f097b0440b6c37c265721e0c26f5de7bd8d14c941c65d51ba62ad33ded6f8a1ebf319192f5c7481ce3dda75c03aade019a644c98df69070 -Sig = dfc19a45dd3b67cfa9a47615cb7f5365f28b85d5c11ca965846326849a2002e64b8f0e377be83641ca5e795f190aa609bc03f94bae4ea25e681959ac85e0ba28f6d298244c8c6f5c18edd868005c375221729dc434ebeb21e5063fcb281761d2b626276dd14b6e70ab53c3909e8df9f70f8a93a1485ab9794e7ce5c424a530329bde2834b8363e1f857dd9ff8908f4108c305ef2c303018392324fc600617d5ca4d041eea9a77f116ae29766ceb75a1c5f4931674044c5e48c7b214a2bb6f1da81ccd43ca056776da7b1c0702a9f39ba1cbd861251ea25620eee495e6a8cb00bb0a0963b609086ffe552bc8badaa9aa6a06a9710fd96f6047b8b1660a7680b34 -Result = F - -Digest = SHA512 -Key = 3082010a0282010100f5596b5c452079319067a1bb3fd2f9c600abe8a8be658285a99b19dfee65f03c52d7e826943a934bb25e79542b7a9e179b6f95698bcc83e19cc6db49bdf718957206d83621ae4e384eccdf283b52fa3c4e7c0859859b574da49cecdb87249f20f16f0a9d63e6907256d5db57ed3cf12675b0ae63b458a1d4b64a2c508cd6f18a4ec57e5cdf2c62edebf1b739bd01d8a280d3bc88a8a81f9627e4aa83f0656b03ff04710ab4531f4f854a6a9fb326728b8752f61acdcc5e1d8f523e69b32b1aced6e9850a777048f294365ed98fb85fb4c0a0829279d0346c8efc1ec6afe7576116d15339cdcd1a8fbf4999264bfe22e9b6e5b6dace317c7689b866a72152829b0203534f11 -Msg = a5374f49877cfd0734fe20ebe12c360d950416748ae3788ad69cb7cc4ac8d6c69b5ec23fbf84d6b19aa4a4fcdac1f35a200c049660b21a798af938866a8b2de7cd11cea6e5048320eec005b712db65c88ab451dd074f93235060da1e2ca5bd9b8279fde6bfa70a3e787cc9865120953d1d2684b04661eb6e6ff924fd59bf8ecb -Sig = 2e985464b882f7c6672154a107154add844b4be163ceb8053be6b6fd632cfbc86d934e5aea7d11878b4df6e24fb0dce099c5b52bfec0897dc57fb03465adc2067a779d011e64ceadfb1e0a7051c5d248094ec8cc239d80c6e70591d617e54f503158f2b22b93eeebe017897fcc8f44703c815f07a476bda567dafe122bc07363818c83eddb6f777bb9e84f11549f3cbc283b78b3f2277c7a54072c13032a416c6470395472303c84adc17dc6128cd82c6ccd907ccb93adb0990289bc5b2eaf948c2f421ad0caf2655cd5839c86aa854370550ce033bc05b7638b8edf67bb5ea997bd904df293b89a0d16535134b66a6fd5551aec3dc09f29fdecbfc6f474de6b -Result = P - -Digest = SHA512 -Key = 3082010a0282010100f5596b5c452079319067a1bb3fd2f9c600abe8a8be658285a99b19dfee65f03c52d7e826943a934bb25e79542b7a9e179b6f95698bcc83e19cc6db49bdf718957206d83621ae4e384eccdf283b52fa3c4e7c0859859b574da49cecdb87249f20f16f0a9d63e6907256d5db57ed3cf12675b0ae63b458a1d4b64a2c508cd6f18a4ec57e5cdf2c62edebf1b739bd01d8a280d3bc88a8a81f9627e4aa83f0656b03ff04710ab4531f4f854a6a9fb326728b8752f61acdcc5e1d8f523e69b32b1aced6e9850a777048f294365ed98fb85fb4c0a0829279d0346c8efc1ec6afe7576116d15339cdcd1a8fbf4999264bfe22e9b6e5b6dace317c7689b866a72152829b0203534f11 -Msg = dbed25e65429b89264ff6928e6ea9424b862a2df1daf870660fe8f4bbbb55b5a7604260f53bc4ee62a650fb3d18b91933e582522f068cbee8bd8f92cc2a097aa79234e052b05021c8a3d9dc4666b0fbed06b93e67f2a33ac73b88ec8d79fd92a2c742430a4abde1cccaf9cc56e33168db6c27292939ec62960c7d888c45a28c2 -Sig = d5c50cfbf215c17489ba4d29b5e2f84a4ea244ef0dcec72c3a077e12d74d586574aa9683cdd0546c3581a723ca048415c6252894e40d3bd803138f78c7c493fc679aa1104e2844bf51618c3571789175828cf7d59addabeb8fa2745d08a247d5937600f8bc0dfe2e1ea7abd257b3e1c207a3be3e2fef8344979c4e0dbbbbfcaa908e1c9c6da303e510f0bb455f4b91dc7fee576e358fd5b2aa8f1e6440bc229c004c31e6e61123aef01a0d382852689ac04424007f55b6fa6aa298b9a93b3eceb6e585f69a5714231e60e1db27b2cf94f7ca5f6fc4118c0604ee716f41736c7efa6c43a3af42b27b585cb9c6356be864e0514e2bae881f4ad5ddb9aad592d7ab -Result = F - -Digest = SHA512 -Key = 3082010b0282010100f5596b5c452079319067a1bb3fd2f9c600abe8a8be658285a99b19dfee65f03c52d7e826943a934bb25e79542b7a9e179b6f95698bcc83e19cc6db49bdf718957206d83621ae4e384eccdf283b52fa3c4e7c0859859b574da49cecdb87249f20f16f0a9d63e6907256d5db57ed3cf12675b0ae63b458a1d4b64a2c508cd6f18a4ec57e5cdf2c62edebf1b739bd01d8a280d3bc88a8a81f9627e4aa83f0656b03ff04710ab4531f4f854a6a9fb326728b8752f61acdcc5e1d8f523e69b32b1aced6e9850a777048f294365ed98fb85fb4c0a0829279d0346c8efc1ec6afe7576116d15339cdcd1a8fbf4999264bfe22e9b6e5b6dace317c7689b866a72152829b0204008f3795 -Msg = 562eea18d9654547cb566556964ead28616c18e0920dd7f691883c8bcf1cd6f90826deafc597d13c24a65fa9dbc2840c7bcbf55af281bd7d543d28a6dbdfe0e52c0756f7db88635f321930b82e4e5349cbc73ada81a8cdc60f484f52772e853d4a391b98251e43d87c189f2a96da6106d9c9b10748684ffa4a137935adf10f2a -Sig = 4df68855dfccab1e7a94430bebb9c631770e7bd75538a9017e2df5b35117db59f8c9f620c1fe41bbc5bc65155355a83c1c1da767bf7e6c40ed61464a53009d7d8d1ee31e7e82c4b97c520d74a60e0de0597b977d07ee95fbbd4e5486d7ad61ebe302de0cd634be178a04c8b9498c89b7ee1c674a074e70ae0f93e7e5dda89c165808a8ab55337a048ddb7eff91a8b5309ed9941ecdf3ddc3b1e235f7cf139b681b97cfbc584d9c0359b26a8011dccd7d5ff0475d52959d35e30ad66735bfdd06e63749dd775e65d9407375ee9f5f9e73bf77b75fe0a5923fa7fcafac08e10f0563dfedc2aa2abfaff6f73ba293497eb0159cefd63c974553a24cf0602353fd4b -Result = F - -Digest = SHA1 -Key = 3082010a0282010100ca1d2f73de2f586157f15beb1ab7c3cf7b8d99ed818cb89eedd10ce20fa3cdf12c41bf04ed06769b7f78fe493a2d17acd5fee9c147d4944c9df3a6a99e5b4cd0d4e6392733806998a05f546a046a6767d79f23e627dbada0404f2b7dff2e17a5bc537bd8efbe0b87e50f5a4645e4a0dea8a2799d48dc110daaeef895db6d6244627d45cb382bfe394d94cd122f8ad73d3c0ec0946669938c1204f940dafc4cbaa95a91d55ae84264390590dbce3b9bf7a6a085444906c774877ae3a67b1a6d19ce37936adb50cc510018dcbe3ecc964583ada6dbd22b0eb4a89571d98238894b1033764b0c4726fe8511f4207568aa4489cf7a57e84b9c5ff26bdab9b660f91d02031e5e25 -Msg = 014bd8a7ccd4c3924208a8a6021bb7df5f238021062ab5e1e18131223c583aa4278c03581bc07516e0af2f92adc0cc8d92dc6448137c553e16064312ff595dc719a6e22f3883e4a69c3a4d0019671fbf75c200891239f5dacc426ef7256f8323a0427d146a4498a83f5107d58c3639ded17e5bcd4a881e1dceddbab7f7c13320 -Sig = 400994dcf90a8391d448059aa51ef3ef10ac64df165d5b6b22fb745bbfec307bfed443dd912414bde19bddff653f6460d6c2e1be6db883132981bc05d66827540a0f5fdb883645511173dc3b3c900daf1c0c2da808ef4a86061777f0c6f3ef738813f3cbce89cc8daddf6d178d1a45c83da92b3cc0cb68be6de5f5d56e5aad6db077f23979648253a8b1758e6478605646981882445f46738c955c900d74c60771528b91a83c69ced1ec3159be138b7d3872aef5ffd2f58c02b50bebb5dc3164bfdab96e6f325f9d4293a6b41d3f9f53535681454051778b98655849174748b1ef1a3841532b5aacc6a4b68a0cf994993643549ca0df2eba94718b11b73d6c9c -Result = F - -Digest = SHA1 -Key = 3082010a0282010100ca1d2f73de2f586157f15beb1ab7c3cf7b8d99ed818cb89eedd10ce20fa3cdf12c41bf04ed06769b7f78fe493a2d17acd5fee9c147d4944c9df3a6a99e5b4cd0d4e6392733806998a05f546a046a6767d79f23e627dbada0404f2b7dff2e17a5bc537bd8efbe0b87e50f5a4645e4a0dea8a2799d48dc110daaeef895db6d6244627d45cb382bfe394d94cd122f8ad73d3c0ec0946669938c1204f940dafc4cbaa95a91d55ae84264390590dbce3b9bf7a6a085444906c774877ae3a67b1a6d19ce37936adb50cc510018dcbe3ecc964583ada6dbd22b0eb4a89571d98238894b1033764b0c4726fe8511f4207568aa4489cf7a57e84b9c5ff26bdab9b660f91d02031e5e25 -Msg = 26dfc6c8d3f37c12edf9b1e176ba99ea602fd989a3453eaa8eddafe95a1760f805d049415e69d7cd5ccae165b3a7ddf7a902543b26f293950ba2a43ec59c7c9f224876fd63af005b9285949c1667ebe984616d52b8b3ebb825d590ea69b8150e244f35430b4e61843832b4cfc481298798530c188011aed9827d5d366df2930e -Sig = 8b9416808240350eab81f1468367cdb6c2b770b7dd9d88fcca8786db9407179b9401c5f074bf9d7a85c5fe26859e8e3bfd26502175bd1a759d1a6bd79149c043b25d9fa70d80f163696ca4153a3df857c63e709f0c00bfcd47e66467110dc6aa8da6411586101eaf99068585962ff994e8e51b30319561648994f2533bbd8b8adc2dff2126cd753ed8b8abc5913c0cf984e78128e2c18fc1f9d8017c60d2c4dd642633dfd412cc00a0c32569b25e328f242d691d75cd2ae22f8359426548b04e36f15bfb9fd561b1e3f3196296823a3828bb791f19bcb75e172f7c06e30cb2e9576bc83a7b59c67b821fc8c1d4d9775ef0f2b33a44c19d3aad04abfa17b8ac71 -Result = P - -Digest = SHA1 -Key = 3082010a0282010100ca1d2f73de2f586157f15beb1ab7c3cf7b8d99ed818cb89eedd10ce20fa3cdf12c41bf04ed06769b7f78fe493a2d17acd5fee9c147d4944c9df3a6a99e5b4cd0d4e6392733806998a05f546a046a6767d79f23e627dbada0404f2b7dff2e17a5bc537bd8efbe0b87e50f5a4645e4a0dea8a2799d48dc110daaeef895db6d6244627d45cb382bfe394d94cd122f8ad73d3c0ec0946669938c1204f940dafc4cbaa95a91d55ae84264390590dbce3b9bf7a6a085444906c774877ae3a67b1a6d19ce37936adb50cc510018dcbe3ecc964583ada6dbd22b0eb4a89571d98238894b1033764b0c4726fe8511f4207568aa4489cf7a57e84b9c5ff26bdab9b660f91d02031e5e25 -Msg = 59e84c0d700305007789dd765f33fc014241ef0fa4b406befcbdfaf27175d3a4e1ce097d27caeaa39eeb3bd3e1ea22b0d5ac445aea712a439d4fe93e42df02d9003687ed1d167f737b668c9963e0cb16820afcba3167e349faeeed8957bb179abc050c86d8508d1919e316f36e7dbfdb5044605603fef878198350fb3972db8e -Sig = 39daab754cc68ccadaf33a057d76aacccc30ad5341dfad503b33f29243e57636a68453323d81cede8ba0959bb980905f4a464ac21880842cf26eb8e8801c105ebda3a866d0d3e8597d234a21c46adb5dff49174df3c36f7c3deb693362418520af227195d609a548836378f4885af1ef95d2d9373c53ed811884cc534b7d88449281b2155938553205d5b51e39439904757a50d6c877d686b32906dd50049a620c3c3489c9007633a04882ef0186af29c71518ae8ed96f307d68eb33ce40793de205caea711cf9bea7fee8b751cd764f4e4e616c50be2456a868803969d692ff8b8b15a4f0d4ead24f610e231d5012a31247b46a582f1d3fea404a5d29691f7e -Result = F - -Digest = SHA1 -Key = 3082010a0282010100ca1d2f73de2f586157f15beb1ab7c3cf7b8d99ed818cb89eedd10ce20fa3cdf12c41bf04ed06769b7f78fe493a2d17acd5fee9c147d4944c9df3a6a99e5b4cd0d4e6392733806998a05f546a046a6767d79f23e627dbada0404f2b7dff2e17a5bc537bd8efbe0b87e50f5a4645e4a0dea8a2799d48dc110daaeef895db6d6244627d45cb382bfe394d94cd122f8ad73d3c0ec0946669938c1204f940dafc4cbaa95a91d55ae84264390590dbce3b9bf7a6a085444906c774877ae3a67b1a6d19ce37936adb50cc510018dcbe3ecc964583ada6dbd22b0eb4a89571d98238894b1033764b0c4726fe8511f4207568aa4489cf7a57e84b9c5ff26bdab9b660f91d02031e5e25 -Msg = 73e48a5d845d55944fe63aa61db36d80724b2809ecdeaa106dd880827db603e1e91822f1b01861b520db22993d6523f162b249a22b029c1f9174929857d6906ea6bcaee9f4cfbb2d2a68816a055e4954bc1ca2d3e4f65ffb91bddf3ebf9091e0f0f6b6ac162a69e6b2b6dd803e43e790c9b0bc02e161fb8ab5daeedd7b8c0d21 -Sig = 5f566d4ad20bec081e05f610df9b972a69afbb71e2a345f3b4fe8b5e2243cdc6a68044e46996ee9bbdd90e6bc7354238566fd7535e6ef04b7d0ea8eb3cb287b23e2492f1f16c799150bfef616467f1ae535667fe76ad5f6ec16aa0f0491c3ee7afebc6da5d6e4ebcc0194e90fd0bc944b0279c9973e269a7452b87a1a317c3d8131804ba4ab2b7a48a8241fa20506d9dd4d1ad74051d28c32c0e1c7bc4099e25c6056a359132c3f0d8d1f2725fffaec815eb91d9bb902aa8d024b797da8035c024539514ff3346067bd583aae8fe5f2a54be488f053407827445a27faaf635e97a7888246d817e7b291d9ae5939e0ebd0cd4a6cefcdf4bc5a637e294a368ab29 -Result = F - -Digest = SHA1 -Key = 3082010a0282010100ca1d2f73de2f586157f15beb1ab7c3cf7b8d99ed818cb89eedd10ce20fa3cdf12c41bf04ed06769b7f78fe493a2d17acd5fee9c147d4944c9df3a6a99e5b4cd0d4e6392733806998a05f546a046a6767d79f23e627dbada0404f2b7dff2e17a5bc537bd8efbe0b87e50f5a4645e4a0dea8a2799d48dc110daaeef895db6d6244627d45cb382bfe394d94cd122f8ad73d3c0ec0946669938c1204f940dafc4cbaa95a91d55ae84264390590dbce3b9bf7a6a085444906c774877ae3a67b1a6d19ce37936adb50cc510018dcbe3ecc964583ada6dbd22b0eb4a89571d98238894b1033764b0c4726fe8511f4207568aa4489cf7a57e84b9c5ff26bdab9b660f91d020360e097 -Msg = da4c0bf959ae81004fed9e58752e03f486906288f30fd891d7a77e952dbc3bac41b9dc3f64f86610e4e2aa7a3b571bfb8750ddef3ac21e9e13c6a9794df8b8a1161c0aa94208369d41be3f434ed868a0ea294abe89a123ad8b7171c86d70c03941bdc0c05ba69ab04ec9843a177994ed9764d17e477290c527f0fe09f7edf97d -Sig = 8b31638425af6493fdf969789f33b2f44bb0d84923347cf03cdc72ad9f139fad79096d100e567caa8099ae15c2ff5c74a3ddb8b40f5fa5a23da10b6b39d985d2d2219d129a39587983660fc9d51f43b1cefc1ae1a102c6d9634b4748d3a2688197fd445a635bfe40dba7da006e7016b9f1a77c2be92f1f50181c025b22224785d4c9c7062429506ba2a1b18bd719ef72892029df3098e707bf1858f81dee73827f9e1d1f9fb1055d969ed45a513f39870250c2b8a507605468d75f0d3ddf1dd1ac3a8bd245101dcf1eae32822dd208b0dea4ef5722d22518de07712192178f57c523175fe4ba17fdaf7e604efc6ad5e2215e1f327abe9ec2004bf7b70505e492 -Result = F - -Digest = SHA1 -Key = 3082010a0282010100ca1d2f73de2f586157f15beb1ab7c3cf7b8d99ed818cb89eedd10ce20fa3cdf12c41bf04ed06769b7f78fe493a2d17acd5fee9c147d4944c9df3a6a99e5b4cd0d4e6392733806998a05f546a046a6767d79f23e627dbada0404f2b7dff2e17a5bc537bd8efbe0b87e50f5a4645e4a0dea8a2799d48dc110daaeef895db6d6244627d45cb382bfe394d94cd122f8ad73d3c0ec0946669938c1204f940dafc4cbaa95a91d55ae84264390590dbce3b9bf7a6a085444906c774877ae3a67b1a6d19ce37936adb50cc510018dcbe3ecc964583ada6dbd22b0eb4a89571d98238894b1033764b0c4726fe8511f4207568aa4489cf7a57e84b9c5ff26bdab9b660f91d02031e5e25 -Msg = f0d6d7e7eedfec55dbb2e7506ebad1c99ba7ed0a5b1f9b01afb07cdce20ad7d70f6b3b52e45a6627a598663a7454fe52cf9e4b275a1ea7bcdf06ceee9345404d9bfee62cce38f7f4bdd71dbef0cbd4207387134692b42f45e027fcad7e11355d99761e9c35e16765295554016b861bdc8e498e91894af947bafd4e402bd77faf -Sig = c6141f88f387f4250ea16d2bc2b438fdfdaf3f3eff539a4f0573d249502d08c4a57333c511dac0b1d0e85cc3ff3bcd9ede0bddab2e4141157e41003dec0dd494cce39e4e9e4d77e89ab266e74579382fe4c829a090ffe40ae17b53da2653876112acb2b1575613570f4ccb219ae51ddd950078c0554cdb7394906c54ca960fc56bedacf7d62e25b72d5e727d18b9cd378f8131b9de088216929f42420404d75b4e960a257927f82ff353217042b61a45ecb45457a581dd82c57a76f7160273de2be85b594db977a29e92813f74feb1678e35a339c42dc66eaec11c8531869ee64c8f6fdd4bc2d918ac29e8995a35f06edc7fb1ec494a86b04dccadd448620ad2 -Result = F - -Digest = SHA256 -Key = 3082010a0282010100c9548608087bed6be0a4623b9d849aa0b4b4b6114ad0a7d82578076ceefe26ce48d1448e16d69963510e1e5fc658f3cf8f32a489b62d93fec1cdea6e1dde3feba04bb6a034518d83fd6138ea999982ab95d6a03517688ab6f8411c4a96b3e79d4141b8f68338a9baa99f4e2c7845b573981061c5fd29d5fc21833ff1b030b2deb651e51a291168e2b45ab4202dcd97b891925c75338e0e648d9d9ad325c10884e1fcdccc1c547b4a9c36aef939e8802b62405d6e3d358ffa88f206b976b87f8b12b827b0ee7823f9d1955f47f8678f7843b4cd03777e46717060e82bf149b36d4cf3d0bc7e4d0effde51a72f4ced8e8e5b11bdb135825ff08873e2f776929abb02033c7bf9 -Msg = fc8e19e3b26bbf7c8c33a452b7ee02cbcf56fa94a58b7cee3e0866481fd6f013c7ff47d27e4678704d1590d74eb701be26c748c2cfe9cdb99bb80b4375fff0a16a2b87cb6900d4bc478c00110659b6d257e7cc905d5926b0b46fd706b2b48aa6edf921f6fd019b08837e3b276a3ce6b06c9dce24d8454d7a931613ba5d5f84c7 -Sig = 058bcfa4b10ac6a73918a07b9f0a8db1ebab9a0ee5c7f0a2261b98efb3592eeb6bf45fceae24ff20c2683e1b33291f49a7f86d7fe239c58a45910a14748e10c25a4dfa693e5a77138de2fe5f61de0a09078cd0d3c61b1e740bca7a3d4048d4fa12fe69412438efa18216819be40733500acd8087f429da734fce6a97fcdc9c32991dc847e4d653260890304f378a10b7754cb4ac5efd7a3db23bd44b6542b81ae9fc33edca6eb1570b1a39a0b8976626c3892afc42e6fbfa8bfbc191c3d026a6248e7ee391f977ea5f0442306ce87702ced7b3f00bf0a6040604d0a663859737ec6c04dc84763d1cb63c4da8381a08cc52b370ba09515b93d9a6d3e47c5929aa -Result = F - -Digest = SHA256 -Key = 3082010a0282010100c9548608087bed6be0a4623b9d849aa0b4b4b6114ad0a7d82578076ceefe26ce48d1448e16d69963510e1e5fc658f3cf8f32a489b62d93fec1cdea6e1dde3feba04bb6a034518d83fd6138ea999982ab95d6a03517688ab6f8411c4a96b3e79d4141b8f68338a9baa99f4e2c7845b573981061c5fd29d5fc21833ff1b030b2deb651e51a291168e2b45ab4202dcd97b891925c75338e0e648d9d9ad325c10884e1fcdccc1c547b4a9c36aef939e8802b62405d6e3d358ffa88f206b976b87f8b12b827b0ee7823f9d1955f47f8678f7843b4cd03777e46717060e82bf149b36d4cf3d0bc7e4d0effde51a72f4ced8e8e5b11bdb135825ff08873e2f776929abb02033c7bf9 -Msg = 4c587ab2ddd6b13bf7a916b5d571d7613f24258201b1421b9de4dcfb3d8a99f7ebd5f37704024634ea38273ffab4f846be23b913634f21556dfeeea3a91779be63078d16da637990f1cf6487271ee111c9bbc483674733378483008c9171362f1db6f199464373d97334759445f8bb4acab3ebdaf4e09f494a3bb9bfdedef7d2 -Sig = 052bc5efecb052b92821c405e6f22cf374dd1ce4bf691eb8abcc1cd01254a6e51fe9237cfb9cadfe32a8780135949399b048d26f5de49bb9d008d39b749527eadd13066baff87765eb255021517a2ea69e45bd35db1fba9219c94f944b2c9a33a37779505c8eae52d6061988d152f9f51f0002e545973402294dda7f7c7cc3135c37ced8cf723d4011d1ac16bc1d0bd670eb7f63f079f30dad8cf55c326a33bc1684ff17a91509f4ead4f93c3c0eb6679eab612e05fc71b936c99ca8579cdeb9f26200a4bce89e330fd5d84b1ec98cc1d758243001fb18bc325b630a58154c2d38a5a8ac2ae6cfa54a20f7580a745c206990c142e8a580eb36266a3a9602a8bf -Result = F - -Digest = SHA256 -Key = 3082010b0282010100c9548608087bed6be0a4623b9d849aa0b4b4b6114ad0a7d82578076ceefe26ce48d1448e16d69963510e1e5fc658f3cf8f32a489b62d93fec1cdea6e1dde3feba04bb6a034518d83fd6138ea999982ab95d6a03517688ab6f8411c4a96b3e79d4141b8f68338a9baa99f4e2c7845b573981061c5fd29d5fc21833ff1b030b2deb651e51a291168e2b45ab4202dcd97b891925c75338e0e648d9d9ad325c10884e1fcdccc1c547b4a9c36aef939e8802b62405d6e3d358ffa88f206b976b87f8b12b827b0ee7823f9d1955f47f8678f7843b4cd03777e46717060e82bf149b36d4cf3d0bc7e4d0effde51a72f4ced8e8e5b11bdb135825ff08873e2f776929abb020400b53999 -Msg = 425994d102a63f542766b12d5207ace27de9207630c2fdeaf741450413f1654f7061c563d7829e6665500cd33cb4647a78a9c7c9659ff749ef1c6a6b59a99d8532ecab1885121e54517005de386947d07b923602261467888852c27be6ccd5fd71436d77741f6825d20dc5d5b0ecfdeb6fea96a9ddeaf5adac2a74bb2322b4bd -Sig = c1f91aa430083ad84ca80ffae2d1ac2bee9b22bd0947175ffd03bd294f6a3cbb5ac63afdacf02f7a6a274fbc33f8aa25cb08174c9c4aad0cb9cbaf02e6f72a8deb6ac52ba88da773b4fd07b33144b9a28a23a1db150cb095cf03b208e80dda3263806b6b0e8eeeedd624d4eb8028e6b98ef2a3e55f38f1b0041425cf7557c41d35d4b0383448c800076eea2c22ca2f333496bdf53564f39d76822f55cb767cc1c2d516a22b4c6fc1525608ba61eb42c04c788c7050a48b7f3a431b2553dbb52cc065a9869c49cc021d7e448dc7012842d3351f98820bccd4fb7640b85fb431fbccbfd4e2544b6f3c7c270326c8cbbd216333ac82260c5edb47a301acd05c7c7f -Result = F - -Digest = SHA256 -Key = 3082010a0282010100c9548608087bed6be0a4623b9d849aa0b4b4b6114ad0a7d82578076ceefe26ce48d1448e16d69963510e1e5fc658f3cf8f32a489b62d93fec1cdea6e1dde3feba04bb6a034518d83fd6138ea999982ab95d6a03517688ab6f8411c4a96b3e79d4141b8f68338a9baa99f4e2c7845b573981061c5fd29d5fc21833ff1b030b2deb651e51a291168e2b45ab4202dcd97b891925c75338e0e648d9d9ad325c10884e1fcdccc1c547b4a9c36aef939e8802b62405d6e3d358ffa88f206b976b87f8b12b827b0ee7823f9d1955f47f8678f7843b4cd03777e46717060e82bf149b36d4cf3d0bc7e4d0effde51a72f4ced8e8e5b11bdb135825ff08873e2f776929abb02033c7bf9 -Msg = bf082fa4b79f32849e8fae692696fc978ccb648c6e278d9bde4338d7b4632e3228b477e6a0d2cd14c68d51abdeed7c8c577457ec9fa2eff93cbf03c019d4014e1dfb311502d82f9265689e2d19f91b61c17a701c9ef50a69a55aae4cd57e67edc763c3f987ba3e46a2a6ffb680c3c25df46716e61228c832419e9f43916a4959 -Sig = 621120a71ff2a182dd2997beb2480f54be516b79a4c202d1d6f59270f8e4d4dbd625ac52fe0e49c5fd69dc0d15fb19ec58c9312a8161a61cb878abcb11399937f28ff0803877c239ce0b7c4cbc1e23eca22746b071b2716475424c12944660b929b6240aebe847fcb94f63d212f3aa538515dc061e9810fdb0adeb374d0f69d24fd52c94e42668a48fc0a57819952a40efb732cfa08b3d2b371780aea97be34efb5239994d7ee7c6ab9134b76711e76813ad5f5c3a5c95399e907650534dbfafec900c21be1308ddff6eda525f35e4fb3d275de46250ea1e4b96b60bd125b85f6c52b5419a725cd69b10cefd0901abe7f9e15940594cf811e34c60f38768244c -Result = P - -Digest = SHA256 -Key = 3082010a0282010100c9548608087bed6be0a4623b9d849aa0b4b4b6114ad0a7d82578076ceefe26ce48d1448e16d69963510e1e5fc658f3cf8f32a489b62d93fec1cdea6e1dde3feba04bb6a034518d83fd6138ea999982ab95d6a03517688ab6f8411c4a96b3e79d4141b8f68338a9baa99f4e2c7845b573981061c5fd29d5fc21833ff1b030b2deb651e51a291168e2b45ab4202dcd97b891925c75338e0e648d9d9ad325c10884e1fcdccc1c547b4a9c36aef939e8802b62405d6e3d358ffa88f206b976b87f8b12b827b0ee7823f9d1955f47f8678f7843b4cd03777e46717060e82bf149b36d4cf3d0bc7e4d0effde51a72f4ced8e8e5b11bdb135825ff08873e2f776929abb02033c7bf9 -Msg = bb40a410b0183b32df12f739506643bdd2fa7e6aed83974918ecda402cfb09dd1932af4fd7f3b1b5a0e8269c5da268c25e806b204dd34e28653f304cdf6545bfadbe297f6bca7493936b8e91f08bc56455059c4c8ec36626972414ee0ca04c82e1aebba953e5ab531e62d823f16b7f2a1f51b9f6979b07cb16602e309bf545ad -Sig = 3f6909f674d4c9c2c26b66d8ee3d7702c560b193a8fbfd0ddb3a9dc909a6eb7aa74d446b7993cdd5b7e272d826281e4cfa08000d2291c2ebe3ee6a77a4e03a79248385359d0885c61c8ade8cf4de7c8e51e879cc1e6089a91a56dc58d2b239e185e9afebf733e2f0fd061270eee0670122c44fd17af6860b6f59690a1b2a91e16522e6a75903bf4e6c97237825f0b01e4c236052b173a8d91f910b0c903590e16d7104609ff9c0194ffe0c09dac1969ea08b01497c8169c7357e8b1f1040604dc0f8b967bfd075284736aa22b0822d3cd13c48a8169413e0b6b26af56c577c829b38e3fb5c4ff78949634d14ff3a40d0d43584d832d6b51d4065e0900ef197a5 -Result = F - -Digest = SHA256 -Key = 3082010a0282010100c9548608087bed6be0a4623b9d849aa0b4b4b6114ad0a7d82578076ceefe26ce48d1448e16d69963510e1e5fc658f3cf8f32a489b62d93fec1cdea6e1dde3feba04bb6a034518d83fd6138ea999982ab95d6a03517688ab6f8411c4a96b3e79d4141b8f68338a9baa99f4e2c7845b573981061c5fd29d5fc21833ff1b030b2deb651e51a291168e2b45ab4202dcd97b891925c75338e0e648d9d9ad325c10884e1fcdccc1c547b4a9c36aef939e8802b62405d6e3d358ffa88f206b976b87f8b12b827b0ee7823f9d1955f47f8678f7843b4cd03777e46717060e82bf149b36d4cf3d0bc7e4d0effde51a72f4ced8e8e5b11bdb135825ff08873e2f776929abb02033c7bf9 -Msg = 56db10c78e9fab7c1c356bf8b38e4adcc464ebd1a3cedabfe812144016baca547aea625656f0bf2e3f1dc2c9c4d310c650e01672520a4bf79aebb5d00600af805ffce9847e62b086b35270d367a3770fff33fb28047b5f888167b28fad647940cabaae3a4d1c08ea3f7d7d00e326061f9906a2d902499dda652c1263520faffb -Sig = 8432cca3357f5ee765bd37dbe2b2d107dfd840f8f720cf4a80144740f96e47529c553fd503a25bfac61ad76a24386af72d81522e6f05b66299f6aea3b98b23838e7dde04db8f8b0f32ae393f6bc0bd7070e566ba1fea53ca871d680f70cc9585aeece672d7c64c228c49bf1ce877dae73f9d8756433f5edc4331415d51957d23e490d4f25317d09a3ad06ec9229dd706cf593915cb156d7f7a32d68e52ca27aea7087d4fd1e194b6029246694742dc70c5136a26cf41b3abf9cf9cb65cd2e37ade6b9fe5ef6160279871230f35758f02c3b37789c1d74df0dc0f97f28bd789755982dd249c0960e64739b3c74b9c55ab810650529e7243bdafda7edef76fc748 -Result = F - -Digest = SHA384 -Key = 3082010a0282010100ec660e20d2b5c6d192540b0f7331da6f1df6126a35861ce249bd0b6aac48c182dbfc5b6716892616810e8c39f9d9c7230771a64810bd9b0146b965135c38751c1793945cef1ed8a799340990ae73d542e26701907b707c3e383f428f87ef5af2b276d0f8dddf8bbeee36824c524b4c38195b9ac69024b65fe5bd6d768166199f3659936824addd4ee488c42480090bad1fec768c339fc172d9692f0c9d17638884cef77c763539b5995573963f12a852511c410833ae0d4b9086a92754f47453032858e6b5f5f215ad48122bec89830a4de5ad86cece5677dec6d6e01ad94d42933c4820269c595e52fef3694521060280c7e505d090aed94bf0b0a3c1596593020319aee1 -Msg = 2d891e111a8812a6448bc2ac2c234a616997a8579335c36d5fe6acfe0b052358fd715d70a7e104d4ad7880e04a9a7535f0fd8c672e0377f6d7472f80617580348b60c88a424efc31c696eb49096ec7d358fee1663cb9b423a3ec25eb3b9709cf1f7de8c7b57700a7d60d8d5030474823e9c12ebc85fe82dc0afe15a66213c50f -Sig = 7dce8f644be457f76b46f3537cd3c1965832e89ffa636f7bca10a2505db17e9babb7c3e5628fc5323d505efade76ed8a9b702b84c22be49c70b8c3e54b4a1f6daf66c2425ebc03fc6ccb600dbf916048e395aed1a5676db004d917c4021f786cfd0ac332e3e0434907848229af099ee468d6324d54f5b2fd051c7449f55460bf519eb9c076852b017220500168e18cd0358cb2c409acf692b4bfe1c75c4d319a45d465f920fb3f92b5c7025c21479c3e9c85bad8a323ca1fa0f112f448aba0bdfe602734f149f619479b39ae5217a01139c271007748fe5a089294a8c3c3507428c6a11d9ea84ed7c7b35a90d07ac3eee713189d47d4681316de68683c1fc94f -Result = F - -Digest = SHA384 -Key = 3082010b0282010100ec660e20d2b5c6d192540b0f7331da6f1df6126a35861ce249bd0b6aac48c182dbfc5b6716892616810e8c39f9d9c7230771a64810bd9b0146b965135c38751c1793945cef1ed8a799340990ae73d542e26701907b707c3e383f428f87ef5af2b276d0f8dddf8bbeee36824c524b4c38195b9ac69024b65fe5bd6d768166199f3659936824addd4ee488c42480090bad1fec768c339fc172d9692f0c9d17638884cef77c763539b5995573963f12a852511c410833ae0d4b9086a92754f47453032858e6b5f5f215ad48122bec89830a4de5ad86cece5677dec6d6e01ad94d42933c4820269c595e52fef3694521060280c7e505d090aed94bf0b0a3c15965930204009885f3 -Msg = 8e8fa198e16acb264e1d0d9895af5ade743d7586d554bf39469e4e89a9c13eea2d844cfd7d34a0153746ebf49f3db2d595ceeab0c442c4b91d1dca2984fd2b42c8c4538dd9f9bf67356c10bba4195e11254fcec82812679ffdbd217b8dec3f644898dfd05e84d02432d8a3780c0c059a0d084c56698a4ff5d0c77b042d552357 -Sig = 421b51d49f5d95922894f0e44dfa5928f1589c632e2c0051b1e085c174e928d98f035b958564b92daf21408e130815c00b35b32578d320b4e604c77088dfa321fd69f6dbffb2bbcfd53d6d8023d9862598ef38f05f0d44dbe72d108aabcae0076d4dd48e4c38115ee7fccfbeca3fdb69ca26f233284d866aba242c932936a0e1f6d01b668204f7cb534164dac3183e08857b4f150ba6a4a38eb98c4ae2aa983c0c5971e62e687cc63fb9eff8148bf01d14011322cbe85a2bba650200ec39f8e3327196d3587e1f167cfaca4abe538f9f420b3ec5ac95c462ea32a700da870756f7fd759befbfed269956abf4d22d0378096bbef743b0feb15b30e2954cdf3ed2 -Result = F - -Digest = SHA384 -Key = 3082010a0282010100ec660e20d2b5c6d192540b0f7331da6f1df6126a35861ce249bd0b6aac48c182dbfc5b6716892616810e8c39f9d9c7230771a64810bd9b0146b965135c38751c1793945cef1ed8a799340990ae73d542e26701907b707c3e383f428f87ef5af2b276d0f8dddf8bbeee36824c524b4c38195b9ac69024b65fe5bd6d768166199f3659936824addd4ee488c42480090bad1fec768c339fc172d9692f0c9d17638884cef77c763539b5995573963f12a852511c410833ae0d4b9086a92754f47453032858e6b5f5f215ad48122bec89830a4de5ad86cece5677dec6d6e01ad94d42933c4820269c595e52fef3694521060280c7e505d090aed94bf0b0a3c1596593020319aee1 -Msg = 92547ecfdc67a3887d5f686c77bf982d84ef4a951131051d8ad628bcd7b289fd27cd5d54ec5b58b226ef1557e5ebb7e8093bd1c14d43838c8415e61222e8aa52fdc6fed05584b03012f796034e652ce1133a7eb866fc496384815d7f6b60457a9ca52aec20c9f52bc9e1b41aba153f4129541b2364469ecb128254a9bc02a29c -Sig = a4c509864fb912cccf022eff3b7e2f4b568fb08aafc498cdacc1fbfa3c7c276645a7d2d838ed703e2dadc205c77e38e0e326a84c3a9dd3a1d6c5aba50c23e6923378ae1e3edd125751ccdc38d80b91569c20dc517ff1963be1d6cc35d2728bd3cdd0d23d341ba91b58ca868d90490a6a5a88bed3a789d46907b9acb725f187843b57d22b17b3966971deb99030eb72efeb4704a91683ab488160a5b43de32319fcf609cf00485f2a9a5a3a8eef1ff1b9cc646b8645d958bd002bb152327e92f6beb9f4c3c193f4f35de29c6e7a8739761018430e5144dbeb895857bf5a313570f1e94e9ab2522c6c046f0a8190a995bb49be4cb7a3794f89e1a4c8ab295f70c1 -Result = F - -Digest = SHA384 -Key = 3082010a0282010100ec660e20d2b5c6d192540b0f7331da6f1df6126a35861ce249bd0b6aac48c182dbfc5b6716892616810e8c39f9d9c7230771a64810bd9b0146b965135c38751c1793945cef1ed8a799340990ae73d542e26701907b707c3e383f428f87ef5af2b276d0f8dddf8bbeee36824c524b4c38195b9ac69024b65fe5bd6d768166199f3659936824addd4ee488c42480090bad1fec768c339fc172d9692f0c9d17638884cef77c763539b5995573963f12a852511c410833ae0d4b9086a92754f47453032858e6b5f5f215ad48122bec89830a4de5ad86cece5677dec6d6e01ad94d42933c4820269c595e52fef3694521060280c7e505d090aed94bf0b0a3c1596593020319aee1 -Msg = 1a852bf321f978536e0c9638414beb424afbbc711ab742e7d85b01ef3521553fa10a4e7ac080bdf917398fcb0c5e5afa0ded36100f5cceda3a7fb76ce2ab0065ba1c0a754494991c8c452cb416f18ab115509e28ddb2848e9be5e4c344597f4ecb8207eb977e344334f814fa494ca3eecaeb9bbe6e028d8a645631fa4272fb82 -Sig = ed0c530de2798f47c15dfedde11d93fa134b243aa2d7ce2bba3718fb1a228f1ec7f6908f56f57166fc2f37c86c22b097f2324bbdccff72f6ff7650fbec45b0211a43ba885a6aa807470a93b08828e04300df4916640e4d8671f22d57ce20f1f0bc89b2f01b55e4aa5426ece11bcd05aabbb3d7434536cfa5256de9b99849e01ca9ffbeb770cc00aba63515aeaf92dac5e03a29f9f2746c2274d60f04d4353d76a174a17c25255a4dbddf8ff11987e2867da69049981e8ab9c1a200788308bda37c4fad9ddf5ea9b62ba42505bf3ae3ca5ab3d36ec5d67d993817caa1b0a7a225f0b3b42aa5734d7232d2d9e3c0b4cad51b26bd5dd2cefc22fa09ca060ff16801 -Result = F - -Digest = SHA384 -Key = 3082010a0282010100ec660e20d2b5c6d192540b0f7331da6f1df6126a35861ce249bd0b6aac48c182dbfc5b6716892616810e8c39f9d9c7230771a64810bd9b0146b965135c38751c1793945cef1ed8a799340990ae73d542e26701907b707c3e383f428f87ef5af2b276d0f8dddf8bbeee36824c524b4c38195b9ac69024b65fe5bd6d768166199f3659936824addd4ee488c42480090bad1fec768c339fc172d9692f0c9d17638884cef77c763539b5995573963f12a852511c410833ae0d4b9086a92754f47453032858e6b5f5f215ad48122bec89830a4de5ad86cece5677dec6d6e01ad94d42933c4820269c595e52fef3694521060280c7e505d090aed94bf0b0a3c1596593020319aee1 -Msg = 3511607cfd2eea7780877d2c585d1d2043881cebc97ee0ec20b1e73b4c1e07df8a22fb41ef901be14d026b48566cd73e04f7bd3c380cac24a1ae6c30df0e3e28e85964d9abd5e4c2f42c8a1090082ccdb1df3154941154086030a645529ed297175ea52a7924ce823eaee26c4d57a33513ea811925b461fe27dd9e63ecf84d93 -Sig = e91b444f45a604eb9203d83adc877a36894c5fd6d75c521caeee6a8e57904698a887d0c54398bbf82da4c3aaab349bfc706497d991bdb86b9bcebc4c87df1b901b47ba95fdd0b8ff4b5dc5bd3300d36ec48e895208e41d569b2545fc7f3776797de5a21dd228da7ec09ea154c987812b12cb4c349e6029e61b9e5c1d3038994445f9d4b5151246a6b7012576cf2aa23afc2e259255663cc1977ac1fe8daed2b2b5d1ac1d0b1a7b6e32e50be4d4c3b3d818d7b650f85726f9d4b505e5491468d7f286bebb4d97fd4dc0854e0f18c0cd0455fd54d57968aad620a670e0f4aebca070247563d69044c3ddabcc735177e91c99953e00b81de45d01eb3dacc09c1083 -Result = P - -Digest = SHA384 -Key = 3082010a0282010100ec660e20d2b5c6d192540b0f7331da6f1df6126a35861ce249bd0b6aac48c182dbfc5b6716892616810e8c39f9d9c7230771a64810bd9b0146b965135c38751c1793945cef1ed8a799340990ae73d542e26701907b707c3e383f428f87ef5af2b276d0f8dddf8bbeee36824c524b4c38195b9ac69024b65fe5bd6d768166199f3659936824addd4ee488c42480090bad1fec768c339fc172d9692f0c9d17638884cef77c763539b5995573963f12a852511c410833ae0d4b9086a92754f47453032858e6b5f5f215ad48122bec89830a4de5ad86cece5677dec6d6e01ad94d42933c4820269c595e52fef3694521060280c7e505d090aed94bf0b0a3c1596593020319aee1 -Msg = fe627041cc6368abdc8e193d731ea6235fbede7c969b050b1abcd72f1f96ca1570db942c0f94edd91b6f966df75a9a54a950d48e8073b164fa5c3753e4af464dc3f21e21739f22370e77dc80101a40adb8d5359fb1bb511ff1f7e4d0e2603961bf4e180741ac8f2b7c4ff3600386219753f309966f996ea6c735e78c5ed22abb -Sig = 3711a7daa81e0a5b897d3d371ab282b660307168c968cc3a1e4e947b32ff2f0d5d766535450b5c227f7a054b7f5110df9fdb6a8b8cdea54185d6ac90c9ad5afbb922d6ace388d121ce977ca4d778b83299a85a74cebd71234c04a1c2afefc034e9905023774b280a063a99a9c8d70cad6ba0b0cb943a2887caccfb3c0b436748a9880052a16f35c467e78243c0d175dcd92875f3f421313f69d040e8222c6ced1ff5ae12e352e8f45c759bec21a1a645c64611ec0dc94b69bc9fd52f287e828eeeec41f17afe3b62e7436d2940479a936bc5d82ff212967484550f1f552f301fe1f189088135de6af7f8e3a49ec5db80fd450bb2d9d52a95cc9607cc3cd1ce15 -Result = F - -Digest = SHA512 -Key = 3082010a0282010100981ff4f5e7569dde9ea2f3630f0463002799dd234a423f6e960c4b55a57ef478e9bd58b94fe4303c5cf3a97d076e3ff845fdef29be7e9ff293acb652e86a5a260882cb4e7724a44a08ebd11a168fc389588f0cde26847644febd1f7c6c031ca1eae47f9941a4dca32028f1408eb96db40a386bf922a8aed72fa27a937e181f8dcf35c946bd5405897a0f0fbe00f18b66de336abd51ee46b8ffe4cee6667f3de4dec041774fd79a08b0a2be1fa16806c6b58ed795ab9044b732f69a1cf88f61ba862f24462bdb036d5d5701ba205e37c737e8da703e9dff2208051e537939e1f2643efa2261f268ee31021379681cfad9a1c03d91a6f17a316cca2e810a0ffcc3020308475b -Msg = 7120a0657a833d7f9723b647eb6867f5d9f6f1fb1a77e8eb0c9acc954d5b3b6f8986643b9076bfe3ac23fca8315c397b555077ab42534fc16adfe1a91bd90e125316e716d51e641e7c305a00d086a76bd7d9af852e280dd257b682585552310176da0f40710295f7b052b899ef6e1a8c069a82d1037d8ae67c2597eb244c0e05 -Sig = 385f2fe2bb8e9483bbc05c316283ad01f8aea41bd83ad941fec99bad0f066fb1c7dc960d536d4ed5302958a0df7b943836878a1c906b3f3f778e7335407676c7766183ef61624c32da8e79640ad5390660a46610b2b172dfb7fdf48e556408e0da06ddeab4468a00abf93d6e3fd71c04478b49f394e849f1923d4a57b76f6407675fe647f7bcc59f7493128e62c0cbf999dd4b3c62cbba2accfbf77351abf76927b89cb6f57d900d631d2445231f75b7d2c3ef303a51b38f9e7f0d69a68ab397674628a825ae74605f32deab2a0ec2fde1fe820b48d824b68acef3f0bdbd7804eb15899029bc9d349951d732eceeb3c42ed02ab35d112841f8e411b28435ddbb -Result = P - -Digest = SHA512 -Key = 3082010b0282010100981ff4f5e7569dde9ea2f3630f0463002799dd234a423f6e960c4b55a57ef478e9bd58b94fe4303c5cf3a97d076e3ff845fdef29be7e9ff293acb652e86a5a260882cb4e7724a44a08ebd11a168fc389588f0cde26847644febd1f7c6c031ca1eae47f9941a4dca32028f1408eb96db40a386bf922a8aed72fa27a937e181f8dcf35c946bd5405897a0f0fbe00f18b66de336abd51ee46b8ffe4cee6667f3de4dec041774fd79a08b0a2be1fa16806c6b58ed795ab9044b732f69a1cf88f61ba862f24462bdb036d5d5701ba205e37c737e8da703e9dff2208051e537939e1f2643efa2261f268ee31021379681cfad9a1c03d91a6f17a316cca2e810a0ffcc3020400fd8739 -Msg = 77449a132998a90b149b91bd05fb1e53c85e28d7923e16a69cf7a122111edba82a156fc297dc2a9d222ababd8fbdb6efc6eedf7f3488a6ac6edaee59170b120505ae2afd9f968ad089ec8c04847e90078f5a4068529c1947bd84270bedcc0f534f38532e076ed28e93088efaabe8b2846ccbd4fbb6217761d31dd49f5908da78 -Sig = 240add12876bc54e013030c890f3abf774a109f687effbbb6a03d0b828e8e1ada27e424db835c78dc0d6905b212fbfd55885417d571e7da1cb1566a1cb713cb04a334eaa68545cb17cfe55c037230a5a71e941fe51517530392ed35b844ab7e891e9230d67250c7fe73a9d969523815dcbdae4c01322648cb0c686aebba24c4e57cc4859fd0e38a23dd43f86373d7c3250bd03d8400887926df0f98169c132f819180b9fc482ec77304b8af96a5334401912e6d210361218267c21f2c65d3a83c376516b869466278841e267d73237789b33e5a7ac3f1feb2a1a3e9bae60523ed5f814124805f11c151357fbb8a717fb8c858c66e647ddcb59c20c2bb8e86abc -Result = F - -Digest = SHA512 -Key = 3082010a0282010100981ff4f5e7569dde9ea2f3630f0463002799dd234a423f6e960c4b55a57ef478e9bd58b94fe4303c5cf3a97d076e3ff845fdef29be7e9ff293acb652e86a5a260882cb4e7724a44a08ebd11a168fc389588f0cde26847644febd1f7c6c031ca1eae47f9941a4dca32028f1408eb96db40a386bf922a8aed72fa27a937e181f8dcf35c946bd5405897a0f0fbe00f18b66de336abd51ee46b8ffe4cee6667f3de4dec041774fd79a08b0a2be1fa16806c6b58ed795ab9044b732f69a1cf88f61ba862f24462bdb036d5d5701ba205e37c737e8da703e9dff2208051e537939e1f2643efa2261f268ee31021379681cfad9a1c03d91a6f17a316cca2e810a0ffcc3020308475b -Msg = f99ed2fc9e07ccafe0704660b1906e93542e3c7220d8551c81d8303f3f6477e90315b09b179b1ca06daedf9ce3476268c511f61d931aba6f05cfbe3d4d2768659c1e17dde7650700eb5875256f300376c97a5d00a3c81d06ffa6ec9b79cfea70cca151ea98cf557763564e23ddb218666851ba40d7484788764502824bc4c5af -Sig = 268ffe2eef8407c215d1e0d02d3b23d387900877d4b6ab515a9d35e30d6c64830e748ab782191f2f9a9c133765ec3863708dbdd36d5e4ce9dd262f040766829e365ccf8e19b146355770ec4dc3a059581efe466e59fdf1d6a7d0c6a24b052c54b5a0f02e73390cd70ac56c0a004a9e45ae81296b3f5f1677db8c0dbae012295eb884130530215c175239e7160182009b46607a71a6186c48a1b8cb45c1dce3fd2f31aba568065e8e490f021454a674b8dda3e436b375f0daa3294969492ed269e9156011b133de86ada6a84225b1c297b71b3462cd3ca037585bb805179d76864a9083f927e8e1360d9302a2be39166bd5411c997000d882b268623bdc5dc9d9 -Result = F - -Digest = SHA512 -Key = 3082010a0282010100981ff4f5e7569dde9ea2f3630f0463002799dd234a423f6e960c4b55a57ef478e9bd58b94fe4303c5cf3a97d076e3ff845fdef29be7e9ff293acb652e86a5a260882cb4e7724a44a08ebd11a168fc389588f0cde26847644febd1f7c6c031ca1eae47f9941a4dca32028f1408eb96db40a386bf922a8aed72fa27a937e181f8dcf35c946bd5405897a0f0fbe00f18b66de336abd51ee46b8ffe4cee6667f3de4dec041774fd79a08b0a2be1fa16806c6b58ed795ab9044b732f69a1cf88f61ba862f24462bdb036d5d5701ba205e37c737e8da703e9dff2208051e537939e1f2643efa2261f268ee31021379681cfad9a1c03d91a6f17a316cca2e810a0ffcc3020308475b -Msg = 019d049056b4bbaf6c585c6aa4b7670ea52fd6814e6dad83eed6d334b82520d67156b7d56cc49604b88e6b2a983ea9bd33addced8d213ae5b6b97a4d420be913f80bba6bcf2f9d1416d094ddf2d402690d8a052f8dd506c4438d8f5d25225c90ff82b45a653dfa66ece77f8c9abf9a999a8dfb4e34d13cabfd19b96d4bb3a2d5 -Sig = 772e888d14c70c4e546fa77a85d1be25ef85bd24ea52db68c2c0d3889edf96a6d7d31696536a12fead53f44a055847be51567a6466730991383e5aee41da40c90d6c951e36c865fa4638490ab44a27cbaedaad7d415b80a51ab465c8a18df567356988020d7e6ec0404577ce8f02d581e48228bc342f6bfe2d2eb2dec17f66fae7debb40b839b1085c16caa417bf31a7bfa540405f76671c8d80dee48d8a1cd44b456ee61ba601938bb3626805c232ec3978936bd8dcea073ea483ba8cdc29841b442fd28b4b4b1a282298776d83b2174114766b2017e5ad547a1021fcc3b829ba30f0cbdcfbae09c5e0101f8ebf1fdbfa1e1d029bba61c1ca1920fb36ea6e2f -Result = F - -Digest = SHA512 -Key = 3082010a0282010100981ff4f5e7569dde9ea2f3630f0463002799dd234a423f6e960c4b55a57ef478e9bd58b94fe4303c5cf3a97d076e3ff845fdef29be7e9ff293acb652e86a5a260882cb4e7724a44a08ebd11a168fc389588f0cde26847644febd1f7c6c031ca1eae47f9941a4dca32028f1408eb96db40a386bf922a8aed72fa27a937e181f8dcf35c946bd5405897a0f0fbe00f18b66de336abd51ee46b8ffe4cee6667f3de4dec041774fd79a08b0a2be1fa16806c6b58ed795ab9044b732f69a1cf88f61ba862f24462bdb036d5d5701ba205e37c737e8da703e9dff2208051e537939e1f2643efa2261f268ee31021379681cfad9a1c03d91a6f17a316cca2e810a0ffcc3020308475b -Msg = 1c0c43b58a3c85bc56763bb26f8060b645988d11d0651bc6d32e886b624a1b38a2d8cb5ed0b05e998499ce0937bcf03e03585792abb877bbdb6206a0b192a86c7be6cae1c35bcef089786986cfc94aa85b8ffdc2b8b60e3c7e07714fd39f211732a008e96b261fe6eb7dd6d03e91b61dd2a5454afe482a724285911fd15bd160 -Sig = 5be423f5b70087c95d748e060004afca6b49fea89dfb37c2460578af2484c0b9ac384193dd47bd06736c071b557aad22684016e6d97e9597f49d11edd8bc7e6dc44ed1f94403d171b215b00c8f3a6721e1cd4d37cebf67b705dee052a2cc97415fa9fac97180fd60ae20667af437d3caf6b69ac87eb9afc3c951a49719f32a9e12062500b958a5b48136bb41e4d6434d5fb59814384e06a4e4d0a779f044e873d5ceea1249f9648153663234cfe9171f988e12926059c896793bb56630432c5d3305d70b436f041c3eb1b6377cf01b27f507a9a8389f57b2b17010b808123ef23201da72f39febf7ea3841cdbe376d3ac89471f2494e948702f618ce382fde3d -Result = F - -Digest = SHA512 -Key = 3082010a0282010100981ff4f5e7569dde9ea2f3630f0463002799dd234a423f6e960c4b55a57ef478e9bd58b94fe4303c5cf3a97d076e3ff845fdef29be7e9ff293acb652e86a5a260882cb4e7724a44a08ebd11a168fc389588f0cde26847644febd1f7c6c031ca1eae47f9941a4dca32028f1408eb96db40a386bf922a8aed72fa27a937e181f8dcf35c946bd5405897a0f0fbe00f18b66de336abd51ee46b8ffe4cee6667f3de4dec041774fd79a08b0a2be1fa16806c6b58ed795ab9044b732f69a1cf88f61ba862f24462bdb036d5d5701ba205e37c737e8da703e9dff2208051e537939e1f2643efa2261f268ee31021379681cfad9a1c03d91a6f17a316cca2e810a0ffcc3020308475b -Msg = 21ea231df11ec8a62b2bb1fb3a19d608e3ed32a531cf62d4b26c6e43e39ae719e83a32ef8063231b39bdce35e02a99d43cac9699fc83106fed956410701312cc2c5a148600176fff3baf075710deb7d0449ea1d62a4ac33cd103ccc97c532df3521072ea5783d3d89bca0667b27b5885638afc64a46da3c4c77d4d74eea05e16 -Sig = 20d90f8361337e7196010e8778794c721c881492e63ceac4a7bbf56daa41fbb9c1716be12b56b79fc826b090c3a2a73f85fe761c9249f0be8577ca78385d11ece10270c05d07590b8d3c889f4cf9cc0881c066957974804f4a74aa9eed9a7d26871885260b2d67c96b1cdac2a6ea61650d8324dfc37105b916ecc406d604f79bbd7c8a7754cf805cc9c74914dfa1bd2dd6ab62b0e228673ac84faeb9b38c94f3f1a1b74d83188837dc7cdf8521bb61c7378c3db6c2305bfa906ab1c6ba3c2fe557feaa5c97e28304a64f3b4153265cf51910a7636b3723cd56131ea16ab4ad865224088143d36f7fe25c9f18363953b33692c10fa3aed59eb70172d7f4708b -Result = F - -Digest = SHA1 -Key = 3082018b0282018100d8196d0e7875a3d396365b446f520f6706695a8046976fdf7917157e8747a58e5d30d83620703e743271b17f3c9763514c38c6808b49ea42ed3c9ad2514bfe059e095c2f17624b5bc1aa5060c320ca14da57d65024b7f1c09c1611b56a3d62fb104c4e458b18f6760d85c53cdcf0b83ff25b48b046d46c0110f8093f9b4873e99b81756232ab077c7195f711c86ae44de848011e028e666ce8f264ea34cd82193cce9fb055a09cf7d12d1e3cdc57f7efbf48237722e1f1bf499572a7b942a74e634751a1808f475806aa5233d122f7220f3f694b91990a45740d547b62582390ec43417037b05a82b0f72fcdae476f04128f2a3b3cf769c8e8d441db469f29da612ae4de490787eef11127a38510073a127ddf279e5132dd6db07275efac083104cbfa39acc224ac1755dfa8299ad4be9ec44b57d83837c583bd35ed8e857e6369281c41c0227283f137df0b29aa6940d126bcc46ee37c3774ba88cf60e5af2678adc8e1eb5e9b3b96c9e8ab2f6c7e69a2360df666544c5b266ff09d21b373ed020400edc8a7 -Msg = af09df21babe776fcecbb5c5dfa352c790ab27b9a5e74242bbd23970368dbefd7c3c74d161ae01c7e13c65b415f38aa660f51b69ea1c9a504fe1ad31987cb9b26a4db2c37d7b326c50dbc8c91b13925306ff0e6098532dee7282a99c3ddf99f9e1024301f76e31e58271870bd94b9356e892a6a798d422a48c7fd5b80efe855a -Sig = 8005d3a1f6bc9e5b25e4bfe751a511b741d622eddab691d10911019f2589475c2432ab9a90627020ab3117042e468f1847a70d8fc392b09092bfca421292c5d4ecc0540957dedf526914490ce8338de9451cbc1c9c25dbba91d8c3d447dc7d044d9654022c8a21c08ecbadac1e44b0fe2ab462037cb409a8e37f617bc723ff4969e4553f46a8532cdc9429c0a03b8c34cb41812816904c98ea31eefb0d9a5a8f0c182e7d889d13704ba616ef1e91df911ea868df5d03b39d30624f310bff100d404fe6e86fe5986abd597babba200a28bc961d6d8054887a2f44ff269129e9b085891840e926244281cc312282e6da6ff5e70fb44cff6b2a2c48951601b1db25b4f70aabbcddb7e1c33e0521442e81df7835dde8a2852d410b45705e8763b5bbdae5dbf4d84dfe782ae862366ccf37adcbc8e51c9769fd516bab1f1572d8ebcd80ae9d052b1b102a2c13a7ed44465d9c535e6cf202c981c302e4117b74475f1b129d719280facc628fec3c28285bfccdccb67d75a71ae7908aacff6adf55d0ff -Result = F - -Digest = SHA1 -Key = 3082018b0282018100d8196d0e7875a3d396365b446f520f6706695a8046976fdf7917157e8747a58e5d30d83620703e743271b17f3c9763514c38c6808b49ea42ed3c9ad2514bfe059e095c2f17624b5bc1aa5060c320ca14da57d65024b7f1c09c1611b56a3d62fb104c4e458b18f6760d85c53cdcf0b83ff25b48b046d46c0110f8093f9b4873e99b81756232ab077c7195f711c86ae44de848011e028e666ce8f264ea34cd82193cce9fb055a09cf7d12d1e3cdc57f7efbf48237722e1f1bf499572a7b942a74e634751a1808f475806aa5233d122f7220f3f694b91990a45740d547b62582390ec43417037b05a82b0f72fcdae476f04128f2a3b3cf769c8e8d441db469f29da612ae4de490787eef11127a38510073a127ddf279e5132dd6db07275efac083104cbfa39acc224ac1755dfa8299ad4be9ec44b57d83837c583bd35ed8e857e6369281c41c0227283f137df0b29aa6940d126bcc46ee37c3774ba88cf60e5af2678adc8e1eb5e9b3b96c9e8ab2f6c7e69a2360df666544c5b266ff09d21b373ed020400edc8a7 -Msg = 5fa7b357c3630bec6d6e119f4266ff9465391acc638a87a7ad565fa84cd70679d0a8b82f892b64cefa28be108bb690627e5f5030247ff86251ed12270ddd12f18c05e9c161ffd7a4eeef817d1f6543065885c712ab65d7154fb66fe54da717c27d066f95b1a80c75300c826f663bc287d9f2a7fa5f03cbc68ff99f6c75fbbbf5 -Sig = 1e84e79b2c46ca8d7a0e35503e4713f556eeac5b86116ded6c9ae1c14343c4c0c241424fa4ade7f76d93e6f845c62f0f2039e3cfda2d364cda93006199ba774842a7f0a99fc72bb21d583ab440a7ea37c371211c8a99f49772edbf14a18b8c1d112fe78af270c8dd3eafad00c004ba22bd521f3767b2d05a4f4ad87a850c4cd444126c6ecf50487053dab17dd624f9daa9a921d31ccfbe77a56787c13522eec9a7948626e560413cf210e438b61475f0fe3b53c29c038e8962781886eb2bf407b74ef7169a8302113cba712488fb9f2e27743d3a48033ae9b6fb76b768ac7014d73df1f4740721a5da04257c5cd72c0bb3de9e734f800e8db60b5b56e7dd58dbcb02b48e837f0264c2aa8b2543162533081cd579c1651b8ee4cd5981a7b27b7c77450e6d4bf3576e541409c2ebd09975d92ba4c35ffde2a7b2bbfb9628795de7c49805ce553bd632ceeda8e626fef36e5fb118dc0708f785680a5888096046832121d5427d7239e123733ca606fb991cae95f1ffc23ab0457599abf92732a87d -Result = P - -Digest = SHA1 -Key = 3082018b0282018100d8196d0e7875a3d396365b446f520f6706695a8046976fdf7917157e8747a58e5d30d83620703e743271b17f3c9763514c38c6808b49ea42ed3c9ad2514bfe059e095c2f17624b5bc1aa5060c320ca14da57d65024b7f1c09c1611b56a3d62fb104c4e458b18f6760d85c53cdcf0b83ff25b48b046d46c0110f8093f9b4873e99b81756232ab077c7195f711c86ae44de848011e028e666ce8f264ea34cd82193cce9fb055a09cf7d12d1e3cdc57f7efbf48237722e1f1bf499572a7b942a74e634751a1808f475806aa5233d122f7220f3f694b91990a45740d547b62582390ec43417037b05a82b0f72fcdae476f04128f2a3b3cf769c8e8d441db469f29da612ae4de490787eef11127a38510073a127ddf279e5132dd6db07275efac083104cbfa39acc224ac1755dfa8299ad4be9ec44b57d83837c583bd35ed8e857e6369281c41c0227283f137df0b29aa6940d126bcc46ee37c3774ba88cf60e5af2678adc8e1eb5e9b3b96c9e8ab2f6c7e69a2360df666544c5b266ff09d21b373ed0204009fbb4f -Msg = e4bc017c194430d1ae0798c2a122b56aedab0dc4f68cb81c27911fc3dabf040778e8c362e17cd7f20ea29f29f58762c6acf69204d22a4d112be029c18ab03184f49c2b9602ea1d75872f0f9873ad115ef7de8045ea51865c6cb5e0fbc934e4b1a002c27e44350a4262d76e76e439ca1a168b61ee07aa69e53339cbd75ef32476 -Sig = 2e6b315e6ae71c573f396ac918df88f2254b6c29d552dff65d30f37e07fbee166459ad9b21969e19adf0ef493d368ef4e889e002f636eab345a1bcd373904d8137262e7828f50c3a5b0be2d89f5cf0217a5a593bb4b58b93cd59870e3e61e682f8f2778cb907cae1e9650280748011d08cb9b1e437ee26099a876d414e7ed5a1f31aacc632f2503ce38d4a15cdc9b5d8c9a01a379e5cc6315b6d81bf657c4b5d876752e8682177a799c9ae4687b58ca5182d6fcf06c3048b2410285d5d4f98cf94b71d3af8f7328450fb0cd8189a3d354c29b425ab75c33c9a29aacc602bfd0955e57214f1b4def30dc2f06b8abdbd9d609e126699c7994d34312bfdfeda87b23c484a097e614508bbd9f0daf2e0e71ef7c20ae14a943499b82a294ba90787b26df264fd8ce25b88d14b636c6a5b587cff9c80370162859df1ef2bec3a946997f84a5c8c577ea8329f3cdcc97214e6071badf226851ab3b5c7c1c9bfee3feec017393c3a054adf70a58e8596fcd47af32ca062567cdd87c5a53dae3780ba13ee -Result = F - -Digest = SHA1 -Key = 3082018b0282018100d8196d0e7875a3d396365b446f520f6706695a8046976fdf7917157e8747a58e5d30d83620703e743271b17f3c9763514c38c6808b49ea42ed3c9ad2514bfe059e095c2f17624b5bc1aa5060c320ca14da57d65024b7f1c09c1611b56a3d62fb104c4e458b18f6760d85c53cdcf0b83ff25b48b046d46c0110f8093f9b4873e99b81756232ab077c7195f711c86ae44de848011e028e666ce8f264ea34cd82193cce9fb055a09cf7d12d1e3cdc57f7efbf48237722e1f1bf499572a7b942a74e634751a1808f475806aa5233d122f7220f3f694b91990a45740d547b62582390ec43417037b05a82b0f72fcdae476f04128f2a3b3cf769c8e8d441db469f29da612ae4de490787eef11127a38510073a127ddf279e5132dd6db07275efac083104cbfa39acc224ac1755dfa8299ad4be9ec44b57d83837c583bd35ed8e857e6369281c41c0227283f137df0b29aa6940d126bcc46ee37c3774ba88cf60e5af2678adc8e1eb5e9b3b96c9e8ab2f6c7e69a2360df666544c5b266ff09d21b373ed020400edc8a7 -Msg = b6ce2cd484adf679c884c35b885757bd48a50241733f215bfd5ae70547e25eb44311a88bd8418bcf88fe2d9c50601bd6cf979061abc8f5953118a4ec3b06f1fe57fd6bb025295fa8018b9e04e248804b824729a3c0fa0b45427cac2f5eddaa183bbafca933107aea7c51a0fb08b88f04a9da546e797f6d5479af8934781090eb -Sig = 01a0e831fbe4cba0309731c0bff9f3348e919fedca607b59d306e5f691879692ad2eda3a7e911da2dfcc2c1ece81873e8741ebec79dc58cf2884f638f393ad044d18c5147801d3c2238f10bce526f82d8fda18abf635e4c4593b44d4d1b9d390a62a9c3bdb662a0b5346e128c1841bf65780133cbb7ec1efa67f94a2ee8d503fcab70a0d9fa50c0ebbfb94910b0565efc6f0d79f1ea29ffdb0898a21c919ce9aae3d7349b2090a8c09f98e953a4cccfc8b0d19a8cd7a8a34c0dd5adc2f383b7dc2b5bfd7d9aed1a47aaecc54b5998c0c8e735b6f6ae7f737a68ef79d38fdf0756cee89089ceafc9cbefa2a02a0d02a7935c10a7826ecb6aa17a4d34b1c77d6942889457984e8197144907d3ac2a3e65ebe9d974bf522aada84f45bba806ca4b0534cad5b460d1bf5571a1e050e5494138f4c8bfcb4334968b50d9cb50b32c52aba4598fa47603de7d358f85b68e13432fd85b247c3759ff7e24dc1934d01ddd60a0156d4fe9d314681d3fd69f071bdfcc5b3a5b2df626f34eb95043bf160eb0a -Result = F - -Digest = SHA1 -Key = 3082018b0282018100d8196d0e7875a3d396365b446f520f6706695a8046976fdf7917157e8747a58e5d30d83620703e743271b17f3c9763514c38c6808b49ea42ed3c9ad2514bfe059e095c2f17624b5bc1aa5060c320ca14da57d65024b7f1c09c1611b56a3d62fb104c4e458b18f6760d85c53cdcf0b83ff25b48b046d46c0110f8093f9b4873e99b81756232ab077c7195f711c86ae44de848011e028e666ce8f264ea34cd82193cce9fb055a09cf7d12d1e3cdc57f7efbf48237722e1f1bf499572a7b942a74e634751a1808f475806aa5233d122f7220f3f694b91990a45740d547b62582390ec43417037b05a82b0f72fcdae476f04128f2a3b3cf769c8e8d441db469f29da612ae4de490787eef11127a38510073a127ddf279e5132dd6db07275efac083104cbfa39acc224ac1755dfa8299ad4be9ec44b57d83837c583bd35ed8e857e6369281c41c0227283f137df0b29aa6940d126bcc46ee37c3774ba88cf60e5af2678adc8e1eb5e9b3b96c9e8ab2f6c7e69a2360df666544c5b266ff09d21b373ed020400edc8a7 -Msg = 79d92d0766310a0011b4398c59543062ef8dceec5e5386e64949c028f4337cc007ae39448e1f156743e935c910e36714d009064456711f46b081d1c5ac60fa419caa106157684c8a803f0eb00be77d6cfcdf6d4f725f8777e58fa35facf679fbc2357905c9f5f7924f1e8be85149b893fd79cbb6bc0506a070d9fe9ffadf4219 -Sig = 1fd91927e15056b040794544ad1bd99a077f3151d9d705ced12c9a6c41483dc1e1b94bc549e06c91a35816ce9016a9f56b9b95f8ce2c9e4a33b445f701abae9c6301bc9581ae89ea2e83b725431d01a3ce1e266ad3b8cd29b217b27e1db105887423d25dd5c6e0c02b3800df9fbcb9f306b86ecbca65366542da71b03955d4063512998924a30283592516037e51e24ee8e8c6bba339e5cc6a3b64375a7dd96e7efc00d410fc0a63d0833dfc8ef518c74c2dc13f79cacbafc3fdc2253c50cf7a1f79ffc185a96a1602e5b7416123d874b5e4c4b4b35b3523309895113d7d2aa71cd895feed0eb9174ecb5b8dec252c53890e28648e71c87a8528be9c7b23de20550675b0b5072fe52cb1de14c5e1be13896dac73220726adb1e8102fcdce01b92251497a553d74f938c96fd9e5936392f0f5c5efe15a7574e01342cedc17cf4f750825424c7b939d0328d2c5a0a8f744826ed9f8dd4479a40da051b7924a29e81c13e929e4815474bb4a825d564cee8f22ce451d094c19d9661dc413e070c5a6 -Result = F - -Digest = SHA1 -Key = 3082018b0282018100d8196d0e7875a3d396365b446f520f6706695a8046976fdf7917157e8747a58e5d30d83620703e743271b17f3c9763514c38c6808b49ea42ed3c9ad2514bfe059e095c2f17624b5bc1aa5060c320ca14da57d65024b7f1c09c1611b56a3d62fb104c4e458b18f6760d85c53cdcf0b83ff25b48b046d46c0110f8093f9b4873e99b81756232ab077c7195f711c86ae44de848011e028e666ce8f264ea34cd82193cce9fb055a09cf7d12d1e3cdc57f7efbf48237722e1f1bf499572a7b942a74e634751a1808f475806aa5233d122f7220f3f694b91990a45740d547b62582390ec43417037b05a82b0f72fcdae476f04128f2a3b3cf769c8e8d441db469f29da612ae4de490787eef11127a38510073a127ddf279e5132dd6db07275efac083104cbfa39acc224ac1755dfa8299ad4be9ec44b57d83837c583bd35ed8e857e6369281c41c0227283f137df0b29aa6940d126bcc46ee37c3774ba88cf60e5af2678adc8e1eb5e9b3b96c9e8ab2f6c7e69a2360df666544c5b266ff09d21b373ed020400edc8a7 -Msg = 569b513e3a2f031a0fb2b3a2f3d51c321ffdde7dc9997f8248b2afbc79c3d09961ccb52e14a2aa29d589b5077e041c8723ec275ef2c0272c5d3cb7af7c2d4236ac83c6597da8d7e8cb10e6212a12c32688f661ae0d4fdafa468bb20b83c860127de90a283ce9913f3870cd58bfa41af7964213d4e3ed9dd44ac62837573c3113 -Sig = 0202f80676900c6ebdaad6750b5e0600af5caee8b03480b8acfecf719fb3508b41ebc57e7625ee0303675478f17de92710db1855557ef3ad3e29353a53794df804db4ea20e8cc4a9c9ddb78b4be6f2475833fc13d9810de1bb338bc45bd88e76d8bba7b08beec647f3e084a15848591592b0fa7ccadf033a958ff643e8741fac68e7f8e7f6597ddbfe0e696fb68811d910ae817a017e136d100d50e2de6f9f8569593a5a88b535d44466e97baa7f9270334c299a7684059fdf5dc519ddceb050678501637b48ef27614b042365900a060e438ab6f16e3624795d47f448c0e91661c8aae15e46ceb37aa58ba8c413b6a6a812dedd263f2d8de3cd6f7f3b396334248ecc3f4dc5484a4218e33de1359798dda01affcafe7567633076ae95b847b2afcc1919e296cb77c8b00ed4aba717bd8c79b4320adae92bac470019ea631cc2efde91d5e465394c4c616faab83f5875fbb67b6c6ceca73c891ef4288750b02bbf478d532517bc6f76f0fd48dc2c0971888dc94854017c8e5551f0fda68e681a -Result = F - -Digest = SHA256 -Key = 3082018b02820181009bbb099e1ec285594e73f9d11cbe81e7f1fa06fd34f3ec0b799394aed30fc2ed9de7b2a6866fde69846fb55a6ab98e552f9d20f05aa0d55c967817e4e04bdf9bf52fabcfcfa41265a7561b033ca3d56fb8e8a2e4de63e960cfb5a689129b188e5641f20dbf8908dab8e30e82f1d0e288e23869c7cac2b0318602610a776a19c1f93968c652b64f51406e7a4b2508d25b632606834a9638074e2633eb323324b8b30fdbd8e8fdad8602b11f25f3906439055afe947f9b9bcffb45dad88a1df5304c879bb4a6eddb4d3d1846bf907d2ca269845c790b2f0af8154aad9c4acb75e18a5d0e4f9f88137032b9964fe171dfa0d0f286090790f52157179a6734b5f9a64e3d2ed529722c3d3836d4501496f927a0f8e389ca35332b836d99e995f4a3e86f581bf9abdc7a10e06a6b31296ae3b43e6ddc9a0d9a7d0d9c4053af0875e851192d1de7b08d1beb7b857e227f8803a5620726a31920bcab922d3370a78033b315024a0fc1f6c276be565e58de77f294c8089ff4c43fb334d26006ab5757c65b020400ac6db1 -Msg = 921961e184a5d9657697e3e65ceb1ed10204ec56e739df0e4f906ee194c9ed27bd9fbc0d514abe3a6e480cb3155debfcc8d9fc815719b334f7500a769488773b68e31b69cd273c824f79f58306692c0c232fc5c0c83415ef1dd59a73a063e9d7bc6ee7bf9e433c8344b3051ed616c9473a90afdde393ee88e9a5849e5f642b43 -Sig = 55362a6854a7846c4d105dc8a358fd4c02931f117631968457f422939d266682fd705e2091bfd5d1bfb52b4bfad684914489ecdad9038b75c65916a9e967630b16c76656b58404ec11ac46d8684b3e72d4392fb6e7e6c929e43ad4fb6ce6198f241b39e8bcbbc058792dde31b195b91bb14236dcb82c28a5c24d633dd847d1548dd403b3a70149371f46432db1767a00c462758c2298fe9f1f04c2ff4b96858d084ffe5a624cb85c1f9be2a60fed40133b7c571c6c467f46a0f1e48ee6e2e6d65424bf8196b0d927e0fd4141264aa5df4129d52d2fb57b8dac9386a84ecd34ecb1feac3a2b99d055eda977ddf8027f1178348a30e4cb4ecef2291d7f520794018b39f5251fd46d97282ac21f6bce6539d19aa1c21c3c220a2ddb6feed262eceebd753eaf5e0eb98cb3eb7d324a3dac0a415a18b7f36170676e8b9d3e421a6f77046bee6d9591c93f7ef0242f464f15b63132a0aee80949709429b1e76d40d60f79b2a6ab362f12e2cdd0bc66868c80278043e179a36f2815e7916378b0fbdb8e -Result = F - -Digest = SHA256 -Key = 3082018a02820181009bbb099e1ec285594e73f9d11cbe81e7f1fa06fd34f3ec0b799394aed30fc2ed9de7b2a6866fde69846fb55a6ab98e552f9d20f05aa0d55c967817e4e04bdf9bf52fabcfcfa41265a7561b033ca3d56fb8e8a2e4de63e960cfb5a689129b188e5641f20dbf8908dab8e30e82f1d0e288e23869c7cac2b0318602610a776a19c1f93968c652b64f51406e7a4b2508d25b632606834a9638074e2633eb323324b8b30fdbd8e8fdad8602b11f25f3906439055afe947f9b9bcffb45dad88a1df5304c879bb4a6eddb4d3d1846bf907d2ca269845c790b2f0af8154aad9c4acb75e18a5d0e4f9f88137032b9964fe171dfa0d0f286090790f52157179a6734b5f9a64e3d2ed529722c3d3836d4501496f927a0f8e389ca35332b836d99e995f4a3e86f581bf9abdc7a10e06a6b31296ae3b43e6ddc9a0d9a7d0d9c4053af0875e851192d1de7b08d1beb7b857e227f8803a5620726a31920bcab922d3370a78033b315024a0fc1f6c276be565e58de77f294c8089ff4c43fb334d26006ab5757c65b02031ed02d -Msg = 8568ff68d40c9f240b5ff56d8919704a4819fb48b2f0741db6a3608a1aaddd861344d79813dd7f85e2f2f92bf00355adeadbc1d08b14fda5b5dd0f69c0fb37a9120e25a9ef166a0793352d9c7eb71fa3104fb11d55a38474220b205e6196ea04a94f506412be47f347b1f787dc3cb475e2fe31f6b9a6f0d026b6fd32a587dcdf -Sig = 191cae43b354617b1ebedb701c124e76339935835a3633b4f806fb835d0dc4b7e4abf00f8c575fad8467ca35bc0d37b58a90db835f4ecb9f1dbfdfaffffb6ef1e0b894dd65fbf8e36478adb673b116188d864f185be5fcfc17bf1e6cfccd499d632b3cb1722c75776cd4d8ec68d2512c1ca598b970f03f6fff5facb107c0e74d6aefffaac20f8e3aa6e825a1de1690a84c8ad1e766642f2a89d3032b58b8e6ec50ef6a8e69b6afd30a2755d42b55f9e21f69c8d9d993549d198ec6c17d12f09ab4be0209030dcb274afefa77fe461e6469ad51f56dc58ad2f06b620af36ba712fa798d9812d2b6ce8ff4554b58bd2a6a8abdd8d00920bc3ad3b61586e544eb073419a85bbc1dfaf775068dc004a7f0ae789d5023d013f3e6096ead893158ac4ba050b87f8186705179f531be573d9557744a70ee42a4b3eb89c824eb8ae1172212c177557267ef04157f9fcf003c2d1f6039671d3af71339c30fbf772f14b3d59e81739ef82d61ab61475e1b4c835fa50350da15610f45531ae85fae5ff9a31a -Result = F - -Digest = SHA256 -Key = 3082018b02820181009bbb099e1ec285594e73f9d11cbe81e7f1fa06fd34f3ec0b799394aed30fc2ed9de7b2a6866fde69846fb55a6ab98e552f9d20f05aa0d55c967817e4e04bdf9bf52fabcfcfa41265a7561b033ca3d56fb8e8a2e4de63e960cfb5a689129b188e5641f20dbf8908dab8e30e82f1d0e288e23869c7cac2b0318602610a776a19c1f93968c652b64f51406e7a4b2508d25b632606834a9638074e2633eb323324b8b30fdbd8e8fdad8602b11f25f3906439055afe947f9b9bcffb45dad88a1df5304c879bb4a6eddb4d3d1846bf907d2ca269845c790b2f0af8154aad9c4acb75e18a5d0e4f9f88137032b9964fe171dfa0d0f286090790f52157179a6734b5f9a64e3d2ed529722c3d3836d4501496f927a0f8e389ca35332b836d99e995f4a3e86f581bf9abdc7a10e06a6b31296ae3b43e6ddc9a0d9a7d0d9c4053af0875e851192d1de7b08d1beb7b857e227f8803a5620726a31920bcab922d3370a78033b315024a0fc1f6c276be565e58de77f294c8089ff4c43fb334d26006ab5757c65b020400ac6db1 -Msg = 88902b37b0db4246c41b50f180eb1350b1b6dac0477a3dd1accb0c5f541a85fe9637ca9cba15926153ce1edacfe66f574cd4b691adbe0c90ed8563ccb401bc93288e9baa06c7b837f191f8de0a5c9b2bc0a5b730eabfe56f13d43afa142779d8e99b86abbd791e90476ec64759d30194b631c6e425053134c3c0792f9d122296 -Sig = 9d64c3b9a4ba78889747aef7c8565eb075e5bd92a55f9d34d3df6a2d740cd863ff98a04be4866e9f906cc6d99270d208a3dc2e53201cac9f4f758eecbe8a44db0243a3e40400cac37856079f2fe02d54d9748754331d9935595c35b22cc6c45686ea964642ec4ca7e0a88e4a4c0a6166733e361c46a592469cad7009ca3170cf3fbe485b1c8726e23a6e35f9691d9bf4029d82756c64a4d31ad0b8ef57a0ba2d55419d7cfabbab1a23c8baa4bf043a444b127920250551467d7d528425dc7c903c2c824e6b9b65f543ad9d7055300f19500356100411271e15b939d496b4bd4cc3ba4b6aa2ce65f4825275404cb19512ae27cc986b0af6fddff35980c2cc0e96829ecbd9ee19944838e4c83b1eadb6f78669890f556781c4e97d8ede9664080e47b3adaf2f5e04bd42d46012aeace3078f9068d870fee02b088f9674fdc0ca0064e9f0f63205836d7a8771264c553c945eb7c87df2a13d8efd3cdc8409843e7a246089970abd43526f3cc9cf993d419a6beaaaf6830208686a1fde4733f078ac -Result = F - -Digest = SHA256 -Key = 3082018b02820181009bbb099e1ec285594e73f9d11cbe81e7f1fa06fd34f3ec0b799394aed30fc2ed9de7b2a6866fde69846fb55a6ab98e552f9d20f05aa0d55c967817e4e04bdf9bf52fabcfcfa41265a7561b033ca3d56fb8e8a2e4de63e960cfb5a689129b188e5641f20dbf8908dab8e30e82f1d0e288e23869c7cac2b0318602610a776a19c1f93968c652b64f51406e7a4b2508d25b632606834a9638074e2633eb323324b8b30fdbd8e8fdad8602b11f25f3906439055afe947f9b9bcffb45dad88a1df5304c879bb4a6eddb4d3d1846bf907d2ca269845c790b2f0af8154aad9c4acb75e18a5d0e4f9f88137032b9964fe171dfa0d0f286090790f52157179a6734b5f9a64e3d2ed529722c3d3836d4501496f927a0f8e389ca35332b836d99e995f4a3e86f581bf9abdc7a10e06a6b31296ae3b43e6ddc9a0d9a7d0d9c4053af0875e851192d1de7b08d1beb7b857e227f8803a5620726a31920bcab922d3370a78033b315024a0fc1f6c276be565e58de77f294c8089ff4c43fb334d26006ab5757c65b020400ac6db1 -Msg = 973606b2c7e5658a9d8f264b8f5a266d0992cfbd6e9d3ff95c31a69a32c4f0f1cf44a5759d090d5ccf089768e6497b047a9b9f8f3786b8f82681b18b2d65500ada2217005cb06852d249ed17c9d637a9ffa7a5fc6d66882f854e8461b9983ac63c3623fa0cc4bf9530bcf0ff3ee9a086211eaaad1927f8c70300e9c5db45f54d -Sig = 355644f5a26a4ffc638c44ab4d0b7359f37845235bfb994d28e63b114c0e0f97d2e29f448da8b12eb804792ccc686dd807f44211d6af410bdca1196df84016b3cdae180bbb59133aeac5928560ad2cf6be61392dc9e28d7ada11658cf4a873bd2626ca839e697c79a5c4bb3ed4c9b8f48f83f2800e1907376f2e8874c23f1dff8bbf3b3f98bed7895d486079a92557a553a71e18cfafdc155775f39a77455b432b0c2c4f09990d130060143e7310b9d9e1ae6f2b1b83b90b36c6581473f60c3c61a10e286557f84e5d04cc36e12cbce835234d2d773221313ad7287c9957d94a1cda8c1fccd3eec45dd84a5d075d6bf823123fcdc7d549286142ab514db6d998e377429494f07041387de3ab31b02ac1606e590572bd9003e5a62b90b95b00c0eca73c744ccf4eae44374e26ba6033dd2baede95e19cecc840a045bf995a3250ce7b08e0c3267de822616f93a4dd9e629eb38b479bd31071b48976cf73ce52c3734abd93249300dd5c40635842dd2a290276190737a123008a4f0be557ca6628 -Result = F - -Digest = SHA256 -Key = 3082018b02820181009bbb099e1ec285594e73f9d11cbe81e7f1fa06fd34f3ec0b799394aed30fc2ed9de7b2a6866fde69846fb55a6ab98e552f9d20f05aa0d55c967817e4e04bdf9bf52fabcfcfa41265a7561b033ca3d56fb8e8a2e4de63e960cfb5a689129b188e5641f20dbf8908dab8e30e82f1d0e288e23869c7cac2b0318602610a776a19c1f93968c652b64f51406e7a4b2508d25b632606834a9638074e2633eb323324b8b30fdbd8e8fdad8602b11f25f3906439055afe947f9b9bcffb45dad88a1df5304c879bb4a6eddb4d3d1846bf907d2ca269845c790b2f0af8154aad9c4acb75e18a5d0e4f9f88137032b9964fe171dfa0d0f286090790f52157179a6734b5f9a64e3d2ed529722c3d3836d4501496f927a0f8e389ca35332b836d99e995f4a3e86f581bf9abdc7a10e06a6b31296ae3b43e6ddc9a0d9a7d0d9c4053af0875e851192d1de7b08d1beb7b857e227f8803a5620726a31920bcab922d3370a78033b315024a0fc1f6c276be565e58de77f294c8089ff4c43fb334d26006ab5757c65b020400ac6db1 -Msg = 170dcd5458adfbdccc757e0b5abc19278112f24b418b995d395b46410da3624c0a8b49fc0d914fe6a02101ef6765adbfbb5e24739434be92acca9f43e19639bddbb012fef028c7c0449d52a9350b88c2f6e5e52a79648c0c931e8ace5bda5b8bd3a3afc4ca1b6e520012f99f8c57b3167bcec0d8bac30cb1367e8f4a4118d0a0 -Sig = 6a4db2e6c13ee8ec6174bf57ae5bb7555e66dc2e3b618f259d913b5b8b6c16b9760290c9c576b563316f510ad2461cd5086b6d9670551ec74b8a9d15ebd43ccdfdcd74cad660a3fe3f36992c86559cd8e9e4d3568924b1f7e55bc5d8df4cf53f240fb3b945a08d24f205d5a7081410ea3e8136ca282fc99e6be0b1fa2faa742c9d682d08a77b791bb0421241e6a82f84605dda359e4f8475cef346c9f6a54a085492fc4bbb30b1047c66f5fc529ecb6aa9ece561e5a3a62f9a19eca2badbfa32a2aa205713b16081519c2cde2f8e8261726fad49145dce0d9e24f6e085e44bd86f670a114ba98d54389f0ed683d062735cd495e6a8a6eef9fd70355b92b4cf6cf0c24e898b6d3f7fe51dcd1548a1adc67ba585e2d18809ea658d6ec4bb5e33e8501d11a266f5e0928ecb58547e72c27db8b07aae31eefef865bcf6a08485675d3037f432c157e5ee428d292bfc24c654d8fca7a60107dc18461251906521e1e9965fc80c7b5f582ac3dc3798a0a2937e76d7e7fd7122d3fd9083feeb9a44ad7c -Result = P - -Digest = SHA256 -Key = 3082018b02820181009bbb099e1ec285594e73f9d11cbe81e7f1fa06fd34f3ec0b799394aed30fc2ed9de7b2a6866fde69846fb55a6ab98e552f9d20f05aa0d55c967817e4e04bdf9bf52fabcfcfa41265a7561b033ca3d56fb8e8a2e4de63e960cfb5a689129b188e5641f20dbf8908dab8e30e82f1d0e288e23869c7cac2b0318602610a776a19c1f93968c652b64f51406e7a4b2508d25b632606834a9638074e2633eb323324b8b30fdbd8e8fdad8602b11f25f3906439055afe947f9b9bcffb45dad88a1df5304c879bb4a6eddb4d3d1846bf907d2ca269845c790b2f0af8154aad9c4acb75e18a5d0e4f9f88137032b9964fe171dfa0d0f286090790f52157179a6734b5f9a64e3d2ed529722c3d3836d4501496f927a0f8e389ca35332b836d99e995f4a3e86f581bf9abdc7a10e06a6b31296ae3b43e6ddc9a0d9a7d0d9c4053af0875e851192d1de7b08d1beb7b857e227f8803a5620726a31920bcab922d3370a78033b315024a0fc1f6c276be565e58de77f294c8089ff4c43fb334d26006ab5757c65b020400ac6db1 -Msg = b2f72cef31be4b7439191d9b342065e62513792826f950481486dd4289429b6e0ae86a05820c99e1ef0144845cfae05c0f6f144603c3ca50992387c38ab1f76120e2cdeba624cae61dc51a9f3010e76d6ab92936a77bbb34c8ffb4f9ab00f4b15badfda8834e050c292b49f398a9a39f9eb75f01f8684b7d0be10dedd576b9e8 -Sig = 8ca52a9040ac49ec2415054ee86379f297832a2a33892c9dec09de778982fb1bbff68b3787ef43ad15f9aa0c518847ba1b3075613bf187a6fc8a7fd7f0b43a6a24086c1d6c5fcb1db18c93bc508e609396ba019fa43dd19f95194c47003d6092303be35477a3137aa2adaa51b22618db29fce98b5bf791ac70be7e238c558f0fb42a40bcfe0e9c07e178afe7a2db74fcb03693ed46719d54d69d5de43ad6a93b0a5b7da6e05ebf7c4b02da42c7ac1f8997da7c4de00c7747361bbef534461bebc23477e93a48558b3ade7d09dce6fa6a378e68e7204ab35283c58148df0cf9444e5f91ad31cd0474815895555cfd7f9cef9164b91db4f98816d194f85bad581f410a655273e5d14491793141f9d928cb30a322c513935dfd830dfc75030b8b2ba1f46b763ec303bef32b4dbeb01781bc1f2bf2ceba27750082661558cf3d42f03d50409b7db521299009753c25926e3e6502bb1763ab68dd5c19dc0265b16a2d438c3ed23b74e60ecff88708e5601a478986dd1b607a2db0fe049664d136517f -Result = F - -Digest = SHA384 -Key = 3082018a0282018100e1b23c29762d8572f1d41f1e7a846876d9901705bb4b3e0228ae65b2572dd1b3305f4d42a7704dda5934260ae9afb1eb34e7d865bbe11ae16d292f170711487ebce1d7363cd00acda5894f06127c1d4a7d9897373b4767a118b1646bc7a38086bc7d359067e9857b8b8642294cd08bab7646ee8ae0b3c7a51527a58ead49dabd11c3ee8326dade7f803cecb906c73aced669d5c3aed02c373d51bba4ffa98018892245f1ee6b035d52a3ccacb2c28062e572f213d607bb403725b34c65ea54bf70c0613e1a8d0552489787e3dc16c0b8cc7ca2d0b4d3e37d1c448a1ca4dcba20c146e78e2a6b3be888c7f65e49a47fe83e491dc33c684a1fd8acea8be091fdb70945c889df40431241e96a58cf7042f7a54f236ab01214a4e17d713945f79f605a8bc1bb6a2c4a342537b95beb92bcd722b68c14c346a1578c567f3ae277a46c264f4e4ef324ec2cc20ad43fbaf4035df169675575374de658df91cb5b3830bb31f69a8161c98f3b7f9e5983d96cbd9204c5e356980589c2df25188c474191bf02033bd4ff -Msg = 5a145e4a9e0f639fafe50687c28abdb29650e220fa5b58359155710fd2640f1752590ad6462bd20b43a356fa4958240600ded182413b9bc5d89a4d7c8944634551cb6f79ed88bb48a148300c324376d7344e5d4e8c517cbb2dfa185d25b34703ddd254d99c1066814e3d5d658432fd4cbb064e2ce185423f15dd9959af9b0279 -Sig = 89d9b5c50dbf8ae358aa201b9840d1eec03db8797f9d32dc4fc5f6421ede24c52715c698a5d8a6b4ef2c85f4bf2aab139e00edb17f8abe19cdd427c1d72f4e2f9b97aff034dc7fb09ed1de84ae491a04c71ac24fd8b16622a3517746cf63df051b55ed218a2c1e6ab5d603687bf199af4192c1f11f49f0e7a9e0e85563a60139b5829fc907599c7be5d19fca86f17b6fc65b6d039a43447c5d6d3deb41f7ab77a55bebd03dc92157131691a66cabdf721fbeff93250591faada512d7403f6f49912758e030c8abcbda4712775afd2d1b2d0fa31b175fbae92becfeed5b9a34a6c61c761145b8d2147b5834996850fff9ce72f59b5cbb7314bf5fa951e39b0a4e0b6c83ea1632d3b3bffd560ed36e8dfcabc60d8e77787ba1356b47b979c4f734abb5d02463f264d842569826808447365692f9508d69002d9a21893848ff62f3747592cd1c6b2b4d7e8b118a3a89915633958371c373c7c677a499fa32444d21cff20ff35c342e4277ca009e948f56d9e5ca99d281b3624c38c33098c1c18448 -Result = F - -Digest = SHA384 -Key = 3082018a0282018100e1b23c29762d8572f1d41f1e7a846876d9901705bb4b3e0228ae65b2572dd1b3305f4d42a7704dda5934260ae9afb1eb34e7d865bbe11ae16d292f170711487ebce1d7363cd00acda5894f06127c1d4a7d9897373b4767a118b1646bc7a38086bc7d359067e9857b8b8642294cd08bab7646ee8ae0b3c7a51527a58ead49dabd11c3ee8326dade7f803cecb906c73aced669d5c3aed02c373d51bba4ffa98018892245f1ee6b035d52a3ccacb2c28062e572f213d607bb403725b34c65ea54bf70c0613e1a8d0552489787e3dc16c0b8cc7ca2d0b4d3e37d1c448a1ca4dcba20c146e78e2a6b3be888c7f65e49a47fe83e491dc33c684a1fd8acea8be091fdb70945c889df40431241e96a58cf7042f7a54f236ab01214a4e17d713945f79f605a8bc1bb6a2c4a342537b95beb92bcd722b68c14c346a1578c567f3ae277a46c264f4e4ef324ec2cc20ad43fbaf4035df169675575374de658df91cb5b3830bb31f69a8161c98f3b7f9e5983d96cbd9204c5e356980589c2df25188c474191bf02033bd4ff -Msg = 31fd8f67e35675269c8deca6a513b67ad8ad903310195027def430717edb6a3909d10536ebe0ee7098034a4b7b440bc12f22c1eff235b3d357152f543b771e82f999db20e2e14660e7c114ed99dd692e5470a8cab6eb8a6756e06db8b31fefb66b1fbc2dae9fa47bf18cf194e726f74aad5feccc4583fa6c451e93a5d01b055c -Sig = 6d4b0803da15feaeaa9ee2d32af1cf1d209693da7b8847d30a11f6fbeebffe29691c93a9687519bfd79506f33c828d84c4368297067b997379098236db4856a40275256a3803a9bc2c2a748b5f22a5f9802251b650dbb57952abc845d5c10e0587497229b78a09b386d77b17bad1f3dbbd4a539e12f345cc96ecd6aafbb6c163c333a06ec4b1eaab7870dad2cc496e61e0aeb2bd8a23a92d95a7e771591b39de73581fc3f45619ed3f4f4eaec26bf364514d25f52fce545a60856b0d57cabbdfeca6c1da78552e75673d97c544fdb854046249f44d57edac6f50c6fa99d4c29a6d444db13797f064ccc759194da4a228649849379a197e032d6cf9cc9d62cbb46a5217c69947f1324d1743d5ef0863d80ac8d3566e89d0d892095b88397db3e0e07635805593c4d41db8a3528e88671a699a2f4b100b8ca601e341650cc73c6dedf36a9bb860d222fa456e6013419158e680217738551e90b4df4fe3c41ebec266ff230789ad8a5482a9451d52bf9efb8fb44c3e1bcc9f018bec51f8e68e8c19 -Result = F - -Digest = SHA384 -Key = 3082018a0282018100e1b23c29762d8572f1d41f1e7a846876d9901705bb4b3e0228ae65b2572dd1b3305f4d42a7704dda5934260ae9afb1eb34e7d865bbe11ae16d292f170711487ebce1d7363cd00acda5894f06127c1d4a7d9897373b4767a118b1646bc7a38086bc7d359067e9857b8b8642294cd08bab7646ee8ae0b3c7a51527a58ead49dabd11c3ee8326dade7f803cecb906c73aced669d5c3aed02c373d51bba4ffa98018892245f1ee6b035d52a3ccacb2c28062e572f213d607bb403725b34c65ea54bf70c0613e1a8d0552489787e3dc16c0b8cc7ca2d0b4d3e37d1c448a1ca4dcba20c146e78e2a6b3be888c7f65e49a47fe83e491dc33c684a1fd8acea8be091fdb70945c889df40431241e96a58cf7042f7a54f236ab01214a4e17d713945f79f605a8bc1bb6a2c4a342537b95beb92bcd722b68c14c346a1578c567f3ae277a46c264f4e4ef324ec2cc20ad43fbaf4035df169675575374de658df91cb5b3830bb31f69a8161c98f3b7f9e5983d96cbd9204c5e356980589c2df25188c474191bf02033bd4ff -Msg = 8f3b827a1dc3967aa2e26c9d9052a97e64b047c186cf980070528708137a2246763c557ca197f8b8b9240d876cef42669085be79064e1980e51dac06d4060cdbb870d1c5906a9c739c4358b2c554bfe4392120ad56a160efc9d940f9f7b0ddfb9cfe7dbdb1e688919466d587632c27dfa8abf8c43c6f753765adc949421f9e8d -Sig = a5e1136bc2db78827f97e435352303519df3c6ba149748ecea4c493f3355def8f94beb1ab45870d8bb1e32bb10c6cda4546c0bcf90da0758fa1e99b22742302ff17c7d5f0c5580a727304066204f524dd206e1a2a232d4394b74f3daeebc81d8609034dafec29620427caaa72f648fbf39028ff685925b1b7ae4b53e154ca93821b6b152da380217a2f82c864437df45c32253a9e3ecfcda3444f5db879cd12f2fe80d0b88a6fad7cb69303b82e1ed0b761e9f829fafbf4a7027fa2a6164f7701684f7aafd8b5dbf41e6d4031ca28bb4ce360fb3815c33fdb6051c9741ff4f9ebffcfd2f52873ba5567c17d40eb8a92af139b21a184b2e0740e0ade97effeea733cb2e1fe7ff65077c200b36e544f61e90dab2f524a74ed46f10d5244509faadc47f8bb57cac5026e00d1438b24f328dd5fa11fa3add3acd33b20f3c75b1007bcb5379cd8cd8e0f964dacda0157952f41e128ac43878c55acc5967cc2fc631010594248a439820df0ab1b7bd1be5f81bb026016dcc65a674d9ea03bf1958e591 -Result = P - -Digest = SHA384 -Key = 3082018a0282018100e1b23c29762d8572f1d41f1e7a846876d9901705bb4b3e0228ae65b2572dd1b3305f4d42a7704dda5934260ae9afb1eb34e7d865bbe11ae16d292f170711487ebce1d7363cd00acda5894f06127c1d4a7d9897373b4767a118b1646bc7a38086bc7d359067e9857b8b8642294cd08bab7646ee8ae0b3c7a51527a58ead49dabd11c3ee8326dade7f803cecb906c73aced669d5c3aed02c373d51bba4ffa98018892245f1ee6b035d52a3ccacb2c28062e572f213d607bb403725b34c65ea54bf70c0613e1a8d0552489787e3dc16c0b8cc7ca2d0b4d3e37d1c448a1ca4dcba20c146e78e2a6b3be888c7f65e49a47fe83e491dc33c684a1fd8acea8be091fdb70945c889df40431241e96a58cf7042f7a54f236ab01214a4e17d713945f79f605a8bc1bb6a2c4a342537b95beb92bcd722b68c14c346a1578c567f3ae277a46c264f4e4ef324ec2cc20ad43fbaf4035df169675575374de658df91cb5b3830bb31f69a8161c98f3b7f9e5983d96cbd9204c5e356980589c2df25188c474191bf02033bd4ff -Msg = 4fd8f7c586b502fe11ae866254e333b688f33e29b41cf995dca4a60275778d6c1d114cc6899e6f3ebf6040c38552e0c4190b973b22e469ebe75deae5bfbd5351c8f9d46bdcd72cccc15378eba04248e3b935f87754a03e53fb3cff94e6a9678bb75838be68a86230814fd5e38efc939ad03b09e333989f5580078e17d483f1a2 -Sig = c5fcf6db007527d04b7c7b2ab744547521ca009e1644f20e793bb51837922ae9411fff23c646c2b56d99a3cf24b676b7e3cb036b6445c33629bdcc979fbaa280ff8e1c1c9e66b0f453633d3933b788590302746f0cad1be62e6f0ff1457358137cddb8574f9df59be5192a2556b8689beeb266a5adf6b21ba56e6b7cd0d6760f5c350f2ffbda1fe30fda8e2cf563f96d85cec8051c7b635da259dc30e868d917fa31b21e91caddfe5dbd21475a98bf6ab4cbb2d62dd52e35a3320f48b027fe89eafc15bce8f1a5e6c5a402d0d87743d3cf6950dfff4c616da976fac676cc944296381d81ed8c8a782adad29b31e4b2343e92dc8c406e022e566c0b9f5477024c73b21dee60128098d2fcbf67273aa12f44de44ff22bd36a0292723d026e34a0f1d545eec9fe4024214aa647b31af4a5d7c8259a720462476fdac9aa480668d726b9fe4f3c220bb492cd871f86527072089d60872fed7721f4764277903f90bb987af661b2fca1d7ff12694ab654037ef9146480d2c1c8c6c5e52adde601bdbc1 -Result = F - -Digest = SHA384 -Key = 3082018a0282018100e1b23c29762d8572f1d41f1e7a846876d9901705bb4b3e0228ae65b2572dd1b3305f4d42a7704dda5934260ae9afb1eb34e7d865bbe11ae16d292f170711487ebce1d7363cd00acda5894f06127c1d4a7d9897373b4767a118b1646bc7a38086bc7d359067e9857b8b8642294cd08bab7646ee8ae0b3c7a51527a58ead49dabd11c3ee8326dade7f803cecb906c73aced669d5c3aed02c373d51bba4ffa98018892245f1ee6b035d52a3ccacb2c28062e572f213d607bb403725b34c65ea54bf70c0613e1a8d0552489787e3dc16c0b8cc7ca2d0b4d3e37d1c448a1ca4dcba20c146e78e2a6b3be888c7f65e49a47fe83e491dc33c684a1fd8acea8be091fdb70945c889df40431241e96a58cf7042f7a54f236ab01214a4e17d713945f79f605a8bc1bb6a2c4a342537b95beb92bcd722b68c14c346a1578c567f3ae277a46c264f4e4ef324ec2cc20ad43fbaf4035df169675575374de658df91cb5b3830bb31f69a8161c98f3b7f9e5983d96cbd9204c5e356980589c2df25188c474191bf02033bd4ff -Msg = 68e2b0476e66a61efdb9e8e7388840d0e58e4b9812ad3547ff3dc41d38a498c80226b1daf8ff3179f6af63583696fde7b9c0a2c7e902ab817c4627779b23201b44b1215eed9bf46c6a75b0961050f48f1b8c6ddc4dee9e86d8f2e0127e63a7b2f72808bd9361785d20b3d7880edfad31d19ab3bf879995bedbebf6d4298bb4f7 -Sig = c25f7a4c2998ac04d2291a849323fe2af98810e8270474594d9287230da4fb4469e198a6eedb1ff28bdf780320da132de069af846a8c88560722bcb59acfcc0a04533de1a69175d0d16c070098e43042af12fed1d5996c1a5a9550055440146ac83913427c6d60be2cbf0038c2b74d297f981af211aab0e08f89bbf4bf37693ef40fc9f44bb3df2c23ab3fd829c483f6704e541da8c842f1c3096de5c30ab6363fa2ef55b99d7ccc31b65c647893008b5b791f388f55ac1dd6fa786cf317c41a0a8eef2112549b7ce8030d403742995890adfa2f2dca37ded1a60c0fe987b1479a8ffd7272c7165c477e311cf208020d840cbd93892e72f05186a4aefbdfc0c4bf34525bf6d801bc45bdc41e8a1bed2cc7862ba789091bbd388a770b2c1bbff64416d7fbeffbe51a961f0fea7ec7c643b4d3f59beddc4d908dbdaf028c3f1ed10834c3e4b6038a53c24f102d5d5977f2d1573ec0273b0b16b9278e291a542939e63b5854c293bd42a571f286b347769e5d73f38ac034cc14dcc0b961bb0af5cc -Result = F - -Digest = SHA384 -Key = 3082018a0282018100e1b23c29762d8572f1d41f1e7a846876d9901705bb4b3e0228ae65b2572dd1b3305f4d42a7704dda5934260ae9afb1eb34e7d865bbe11ae16d292f170711487ebce1d7363cd00acda5894f06127c1d4a7d9897373b4767a118b1646bc7a38086bc7d359067e9857b8b8642294cd08bab7646ee8ae0b3c7a51527a58ead49dabd11c3ee8326dade7f803cecb906c73aced669d5c3aed02c373d51bba4ffa98018892245f1ee6b035d52a3ccacb2c28062e572f213d607bb403725b34c65ea54bf70c0613e1a8d0552489787e3dc16c0b8cc7ca2d0b4d3e37d1c448a1ca4dcba20c146e78e2a6b3be888c7f65e49a47fe83e491dc33c684a1fd8acea8be091fdb70945c889df40431241e96a58cf7042f7a54f236ab01214a4e17d713945f79f605a8bc1bb6a2c4a342537b95beb92bcd722b68c14c346a1578c567f3ae277a46c264f4e4ef324ec2cc20ad43fbaf4035df169675575374de658df91cb5b3830bb31f69a8161c98f3b7f9e5983d96cbd9204c5e356980589c2df25188c474191bf020310143d -Msg = a0a014cd11ec9b3df8d54647f5ccd580dbaaca2f6197c0551b2bfeeaa9d44c6a2f780690055b6e61af42466d0fd99f52d952ec81484f5a450f0264019392a1b957c1e1d3b7cd791fda93db16e2fa6a5f658f8c98216d0052eb60725de94a4c4701c5d01f9109647e61112cc9d6f9deb068abd2fa55ba5985978e508814c2f51c -Sig = 19382307981e33064a7836168c5302d691c9a364aa0193165d7852145b3ce74cc70439ee2652e598c153f1bf5c0e2e7bd628f15e797a974efd47cd70d368d9cc0c4d7ad8e41973c935e81a391e56c1ba9b486f59653cab41f5f7a0d5ad0f9730d45c6e2d00e5f78056d5a527ff128c584f1735ba1d4436bac48e74e1a387ba7e5de21d94ee419b466d6d01ea81f5fa7dd395ee8c5f0762a08799cd237d4c078ade6222dbc33ec83736760fdd04a0f911d9a1e6c1f97a57b1dcb9deb53471751dfcd83e17539a0dfa5e253aa0616d301dd613a2de4873fcffa324700e2c3f61c24b3cdb0e0e2cd33b33bd97e759d34693e18a6a40029c00c5f7e9d7c2638c3f6b5df9ee16da4ea4c1556f572d4c935ef1d091f313424a6085fdef28f76ab8562818cbb19e0b794669f6e6be366af6f0a43fc85bf82ee0abe8df1deffa4b1e7ad16f8feffc7e6b48995a11bcea982c995ee676985f84d47f93f4f9973de8aef4bb56cb66c9ac2f02b75f9d96a097b18a13007d716158620342e96961d6b7942a57 -Result = F - -Digest = SHA512 -Key = 3082018a02820181009689eb163a617c0abbf01ddc0e6d88c37f8a6b0baec0f6cab8f8a683f372a53d028253a6ba502da462adaf4fd87c8dc2b03b6c07c2b6aacab1d8c8bd043d89f4effe72ea2547c73c6366a2efab9c916945820fb880890bc085564e57ee76f7107a008f71e941e9fd631aec78f82e410ea9c893faa3d553cd1ca628af1087ca1b0c6aef3b66edcee14d1d7dc48293ddd7deed1ccbe487c957585abb9509151038d53f46b068e3e139c7689bf8e8d38669896b8d082e65e458e1f82b8e8ec926e7aa0f97d08526e9636f2c00af4c2bd3d8bffc4bb93cd47b09af18883e11b639d47938d036f7cfeb77db74a2c09a6dee9df98b18eff2fda7d3f4135083bb3b59e2172244ec37bdbdcfe6e199d36dc949cda1cca123fb2be07803d003d76af3d7164453df77d44c7f2599636ca44d0b7a46218326b0c814ed322b9c4279b060f1b9e14b70f55a3751c4343763cdbf9c14637d2210c59fbd037be17ea6706846fdc7b9ab90278c01c458e64442f9256f3ad1cbceb22959d495063aaca1a3959eae0302034df3ed -Msg = 54a8d256702239dee2ebc1dc681938b467ce4740dc5fff1796b5b50fa3f31000085860cbb568319bb746216bb065eec9845fd3d95625159cb359d9720cf838de6a3c958a5dc12e8b35e6f2e5757693528588db3fa7a343182c26c2c5e8e7e375e31b1a9a51765834c593dd53a1954ed7d10f077bb921b2126be418101e08384b -Sig = 869091f55f7e61bd18d88b974ddb408df8a724ca72232b6326de301cfc985e8db211180ad2057a4f4f73c07e48973b00d2833655acf393b31d155c11e9ddc05dd5f4516ac50fbc674cd0c577c79b00e5567629cbcf880b729a7ae0ca9eb040fdcced198243d40f5e3b59f35f2992da079e9f174844f1b2d0f1307624f4d868f558dcd1c6064297a152c816db1ee5848f9e670d8d837911c85b221430b309dcfb4853c3dbf6a2d8c8a6cd3d697ec325da6d8740081bb86e98d092a8794009915f5f55ca9ec074cded2745c50f328af98f78edc94cb6b416cf543d59a4d493824462a21fa6e368943d9d541ac233a7d708fcc7248be670051abf60199c656b8595dfd29e19a207d5c2d33a97dd7b66737023e62bbf522077b8531ededd070a2b17f7d1f9dba47a89585eb72d21c3dc6fb321614604899553bc0834baf3b7647a4aafa046964a805f05477c9e1def5c40430e82d635e7f90713e822e355edd10f2a65c886c4d94bb306bac35dbf307400eb7d8caaa36e167760209c80362e8c763a -Result = F - -Digest = SHA512 -Key = 3082018b02820181009689eb163a617c0abbf01ddc0e6d88c37f8a6b0baec0f6cab8f8a683f372a53d028253a6ba502da462adaf4fd87c8dc2b03b6c07c2b6aacab1d8c8bd043d89f4effe72ea2547c73c6366a2efab9c916945820fb880890bc085564e57ee76f7107a008f71e941e9fd631aec78f82e410ea9c893faa3d553cd1ca628af1087ca1b0c6aef3b66edcee14d1d7dc48293ddd7deed1ccbe487c957585abb9509151038d53f46b068e3e139c7689bf8e8d38669896b8d082e65e458e1f82b8e8ec926e7aa0f97d08526e9636f2c00af4c2bd3d8bffc4bb93cd47b09af18883e11b639d47938d036f7cfeb77db74a2c09a6dee9df98b18eff2fda7d3f4135083bb3b59e2172244ec37bdbdcfe6e199d36dc949cda1cca123fb2be07803d003d76af3d7164453df77d44c7f2599636ca44d0b7a46218326b0c814ed322b9c4279b060f1b9e14b70f55a3751c4343763cdbf9c14637d2210c59fbd037be17ea6706846fdc7b9ab90278c01c458e64442f9256f3ad1cbceb22959d495063aaca1a3959eae03020400fa3751 -Msg = 6459ea1d443df706907ffdd3ca2f193f93f5a349b50357d26748b767cde6ab5cbfe76b1acb2b9eb97da5c4d2ddc8d18e3a3b1a0326d475c1c2c49ca73c0fd3fc9540cbbba85ac52d6811fabd693a3b09a281d535715ab784df3ad7292606d15a70ccd1a7e2b1b48ad92a6a3f736f9fd5522d9a869c7b654446102e9493b3ed9f -Sig = 2b72942573b825cd1f0172119c23440a2b384b7f2a3c5582bb02f764e2b159ea9ad880ca61b3df7ca249134f4bec285083c7ebf984b192808e916af687ef6c6a9a6722a4fa9189fac1521d03853f3dd5a95ff4b9dbdbf3c7077f720650ead01945ab5bfee582ac1643526fbf68efe1bb3b6f7d2b4b01f2155aaea38a2c7ed29add23ee791a703d11e3b1b7c500d9a6b647c1337bf537c071e5bada6faa025bcaf5e5d1196998909c3d64758826939ae7fe1466dc6efc10a2b25e21186c2d135ceace33cdf490b13a0d10c2527e04200aa70bc1d4f3cfb04b5d2bc17aee881d3a788401f45443470bc639232088a9553c8d792aa5707654f075476a66b86368d5a92b4c84a3b4baba1b0b98bdebb85b48b82b8409f2e9c1aa500670329ff3b6e83e25c561110d47b2fe93ea2946a74f9730da9b7d126f8d7c3fa4a51fc30144a827831c186390998d552a1b677afe5afee46e9d4a5774a56355a4d1967677e75d176aef71c3fa061644d7a9582385877de67f87724b0a6e868f3a2eeafb68c53b -Result = P - -Digest = SHA512 -Key = 3082018b02820181009689eb163a617c0abbf01ddc0e6d88c37f8a6b0baec0f6cab8f8a683f372a53d028253a6ba502da462adaf4fd87c8dc2b03b6c07c2b6aacab1d8c8bd043d89f4effe72ea2547c73c6366a2efab9c916945820fb880890bc085564e57ee76f7107a008f71e941e9fd631aec78f82e410ea9c893faa3d553cd1ca628af1087ca1b0c6aef3b66edcee14d1d7dc48293ddd7deed1ccbe487c957585abb9509151038d53f46b068e3e139c7689bf8e8d38669896b8d082e65e458e1f82b8e8ec926e7aa0f97d08526e9636f2c00af4c2bd3d8bffc4bb93cd47b09af18883e11b639d47938d036f7cfeb77db74a2c09a6dee9df98b18eff2fda7d3f4135083bb3b59e2172244ec37bdbdcfe6e199d36dc949cda1cca123fb2be07803d003d76af3d7164453df77d44c7f2599636ca44d0b7a46218326b0c814ed322b9c4279b060f1b9e14b70f55a3751c4343763cdbf9c14637d2210c59fbd037be17ea6706846fdc7b9ab90278c01c458e64442f9256f3ad1cbceb22959d495063aaca1a3959eae03020400fa3751 -Msg = e4dcdd4e122e9466560370fb59ee0c4c323fca47e57772a029ff1b216f194f411f166af725ca43d0ac3d0e4029a381359c8e36f21363511b6f0a620c6aea8d6fd915e80e2fbf24e543f5707c538c9a744857775f3b9d86d539c9d0c44364120799411e3a39f77fcda2945c58dd909f2ebe005535680c58f50fa32cee026e282f -Sig = 02ca1d1fe97e0c3724d649dbe493c4bf8825d72f0e1717a6a8767453a3ef20bbbbc62fdcef7b816af229dc1ee2464a19b63825f47dea9774745dfe4ffd36ea72eaed7137412bcf0d0d5a9ffb02ecf15309aa047fde0a32a16876bcc33363b7290b6ec9c019d82767d36dcecb841b6946dac889cf3e11e614c4dd07e594c50e1557665c6ef76ef2205d57a2c8e6d0950ad7e4e476ce2e095f7e376c21f96c38b53327c94a9c4547982ce396eb2070bb73df03a09efb3bc6fbe5c35dd89e3ce54ff093739c678aeced539f04aee3c4d391b1399cfef4e24529033098a29aad09e715daba9c4323837b48b5292bcbf32b39cf15c6430714a930bd840b8c15d7467e71e99ef6726e1ab3d05a0e96939082391956f7f0492676a05771f695d24d7c7c22c64d7ef99a295ce34cb882153162400a9d6bacb4e1002ee51317477fddd9923fa1af2ef60e40da01fa19a43e446144581b3eb8f4d44d16b31c0b155c7e95ec52da4676c6abc1075ad271e5b39a5b3ac7672f1c65a1f28d402c691e8024559a -Result = F - -Digest = SHA512 -Key = 3082018b02820181009689eb163a617c0abbf01ddc0e6d88c37f8a6b0baec0f6cab8f8a683f372a53d028253a6ba502da462adaf4fd87c8dc2b03b6c07c2b6aacab1d8c8bd043d89f4effe72ea2547c73c6366a2efab9c916945820fb880890bc085564e57ee76f7107a008f71e941e9fd631aec78f82e410ea9c893faa3d553cd1ca628af1087ca1b0c6aef3b66edcee14d1d7dc48293ddd7deed1ccbe487c957585abb9509151038d53f46b068e3e139c7689bf8e8d38669896b8d082e65e458e1f82b8e8ec926e7aa0f97d08526e9636f2c00af4c2bd3d8bffc4bb93cd47b09af18883e11b639d47938d036f7cfeb77db74a2c09a6dee9df98b18eff2fda7d3f4135083bb3b59e2172244ec37bdbdcfe6e199d36dc949cda1cca123fb2be07803d003d76af3d7164453df77d44c7f2599636ca44d0b7a46218326b0c814ed322b9c4279b060f1b9e14b70f55a3751c4343763cdbf9c14637d2210c59fbd037be17ea6706846fdc7b9ab90278c01c458e64442f9256f3ad1cbceb22959d495063aaca1a3959eae03020400fa3751 -Msg = eced7082ee6e916e753959e7dfbec00d9b424b64eb90eb2be7eb22e9c648674859bacc26d82edeeae158cc14beedcc19e713bb6dc71603e1c35cc22f799b29d34549221d0a5435852f14ac3ee77ef50eb69a495c31378b8b05dd73863a03eb9cb982b98f0c4a5fe766533f8ce3d7039410bf3c5aae5b49d0b3557b1692e8774b -Sig = 11aa09883b9f571237215bacf3ea7f100740a1bd72748804bca39e9ef8527692b5a8e1f94d255cab186edd16fbe76bb9d673ecef79f2614fc0bf4e2b3c28a93c39e6fb31de6c21dc93026f8ce717767d57bef1c91839568b9da11c1b48cd7e53e132ea7f9b12f80c3bc1a6b9ba1e7d234ffc4f251e6ada2588b21b457d9bedb51d14b1214144a81a3b987f00b20c6cbb314840363fb4a605495124abd45ac3d7e9d65e8b95dff0ba916d432749dfb24e5fadac418ff716097d86943a6bfa8dc5ff27dda853c63c1b2ce3383bd78197af3e30635d0ae65e203300ded374a790245cdf4d1640ba5d0da8d6ea35ba0263efde90c7b1a8ac1e3cd0f843e5fe57f681055de7ffea80e92af36bc183efaed08a5842f9bc8369626d60ab2c460de622b9b3c36e6e559787264abefaba843bf443cd9443eff990db82feece2cdb5e336f84f641176f82b41efa2377737089792b4a9596a32cad5450a5f6a93f947d249dd734be9b3cb6c825af53c27070eeb7c1713aa607fa89e44a542dac00b80bd246f -Result = F - -Digest = SHA512 -Key = 3082018b02820181009689eb163a617c0abbf01ddc0e6d88c37f8a6b0baec0f6cab8f8a683f372a53d028253a6ba502da462adaf4fd87c8dc2b03b6c07c2b6aacab1d8c8bd043d89f4effe72ea2547c73c6366a2efab9c916945820fb880890bc085564e57ee76f7107a008f71e941e9fd631aec78f82e410ea9c893faa3d553cd1ca628af1087ca1b0c6aef3b66edcee14d1d7dc48293ddd7deed1ccbe487c957585abb9509151038d53f46b068e3e139c7689bf8e8d38669896b8d082e65e458e1f82b8e8ec926e7aa0f97d08526e9636f2c00af4c2bd3d8bffc4bb93cd47b09af18883e11b639d47938d036f7cfeb77db74a2c09a6dee9df98b18eff2fda7d3f4135083bb3b59e2172244ec37bdbdcfe6e199d36dc949cda1cca123fb2be07803d003d76af3d7164453df77d44c7f2599636ca44d0b7a46218326b0c814ed322b9c4279b060f1b9e14b70f55a3751c4343763cdbf9c14637d2210c59fbd037be17ea6706846fdc7b9ab90278c01c458e64442f9256f3ad1cbceb22959d495063aaca1a3959eae03020400fa3751 -Msg = 404f0ccd8f6ae6f81cd7a4efe9a1f630c56ac1987002698e0138507e85f09a89e976347a1a1214fc6addc20b36d217a9c52844d274e017b1109a7a1484ac3d1eb475153ba8efe459ed843a5638231cb44d9205941f062be239f103cd5c1b077a6af4b7f98229de786d7516b639ba8ebb23500bc7bb9c2d8842e5f48f57648205 -Sig = 11368e0d1b3900af8ce2fa432a871bc448e0d49a71eee2b201b67b496ce00854138386c3cccd6e4210f84c2e1de653f70f16d0240666fed5b9fcfb247d8c77f0ae9826fc32d0ed6aff6e94eab735ffa2dd108b842e59e7d04e3eddcdcd087b30a3d65cd9f6566dad10bd2e9d7bd2b6c20167552e77270ca43a1ca5aee8c9e7bb5825970ab74ea79d3ae73b12d34274d58117b568aa724a6766ed40afe8d2649dffd5bb9c1c854a70a10ac5459fb9bfe4bcecbb04103ffba4d314c2c5aebd805acfdb113f5321ebfa19d0c809e8713e35bdaa8c7930c2f2ca5792206aaac8e44b4cdf1434f04acf6c1df428843b14e1c8401555742707bd5f9e4188f38206fe11c13f29947ecd97f5f576d4ebeffd1f29d38e43d76348bb43840d9044fb7785a0d7d04bb27206b2907759c29a70acd14dceb05d21e7c8bd907df3746b666a40e35245f7bcd723446b4e88ab0e2d8d5b3456041ba111a8276df1e4625e5863c5dd6b2c7ec1ac55aac7eb8373cea752a6396558fa7adea9d8c4fe0843241bd67f2a -Result = F - -Digest = SHA512 -Key = 3082018b02820181009689eb163a617c0abbf01ddc0e6d88c37f8a6b0baec0f6cab8f8a683f372a53d028253a6ba502da462adaf4fd87c8dc2b03b6c07c2b6aacab1d8c8bd043d89f4effe72ea2547c73c6366a2efab9c916945820fb880890bc085564e57ee76f7107a008f71e941e9fd631aec78f82e410ea9c893faa3d553cd1ca628af1087ca1b0c6aef3b66edcee14d1d7dc48293ddd7deed1ccbe487c957585abb9509151038d53f46b068e3e139c7689bf8e8d38669896b8d082e65e458e1f82b8e8ec926e7aa0f97d08526e9636f2c00af4c2bd3d8bffc4bb93cd47b09af18883e11b639d47938d036f7cfeb77db74a2c09a6dee9df98b18eff2fda7d3f4135083bb3b59e2172244ec37bdbdcfe6e199d36dc949cda1cca123fb2be07803d003d76af3d7164453df77d44c7f2599636ca44d0b7a46218326b0c814ed322b9c4279b060f1b9e14b70f55a3751c4343763cdbf9c14637d2210c59fbd037be17ea6706846fdc7b9ab90278c01c458e64442f9256f3ad1cbceb22959d495063aaca1a3959eae03020400fa3751 -Msg = abdffe0b951a91c54c7f00e1ff8e98060b413f131d9cb5589a861a053ed7b1e203b2e3414415873222ae60f527f1e7b529674b737149b7401d4dd3afc3c08d8a57d519c44f3d36af04f7b46f5c6a33afa6b12d92c53637ec918283b37a53aab06fefa87afeb928a5bc020337e721035b4ac6ec5a618bbdc6becc33f9abb98fbe -Sig = 183fcc6e78a7811df1b7442c3bf543e198ce6c691ea6b3aa1952bee39d3218a2b1cd55af26efe672b11c640af1de241fc1289cf10643992fbfe604e1e965d2eb9e19f3399d9fe174ec4129bffb0e041b15f8b7e7b25b535882cbd5d6983d8d84dbf91daf22078579670f70e1f46b723e5a0004f1870d88daa8d7d22df709226ee6d7b484ff47a44db43073f65bc6974493a807391861adf95535b560a47e0ae96af5239aaf1e524758ab6c7a2d3bdccc2f2cc173251954504b837e27f32e699e7604a11d8205893d8cbf9a5852af1f65f8e0b1e1851b4f7a80ff929d5f4f796aaeebddcbfc4c3835d6381b2341404b77d90c78be4d97747b2d6fa9b88610963795ee95f70bbc897b486cf4b313ade25d56ced2e8b6584b921567d32cd627e9497f39f743f020930cf5141668e127152fd92df34b44e3cd142c1668fd71f7f83246f2be3b2ff95bc1ed7e193d75adc5369fbea93314f03a305a825946846f59af8c108a14888e894872e4c0086599faef2f5a0edfb4e085c0402cc56e69930f59 -Result = F - -Digest = SHA1 -Key = 3082018b0282018100da3428fb42c2bd8b0a954bb132f3334b804b163913398188d6b7a8433fc66249a300eb5e7ed2b20b7e22e21caef328071993af0200040247c651a57d37160bf41db0af7840aa731be37c3daca590388ab93ca935b9ed94962f3837bf7df344855b2ce7eb4c68485c8455a16bae782d606a246a1a66229be6a4e3fa9b534c5e1c1100b5a15551fb0a70e78612eb2116f1a38fd694028cd2172bc7699105cd6e4c14b5c9da61819048c42b10e31c3019f8c97825f7f70312ee3e6348a38e0b4fe9d567e1a4087cf260944f57cdde56dfd9cd781c846ec73b523bda1539130c1750f24cf0b6d0d160f4492ee38d31bc44d4ca299effb4427e2bd4fff80f7d19042d988713a84d470fdb692a296e6e14c68d561addd58863496aba014ccc423cdaebe43874c90ba0981404398250a062266e372a9ab7f29c236225769f0baea54aa436705f0dad5dce1d608ce27cb34d22ec913c99c5a2d28103b0a88c8cbc3b9b37525ac45bb39d26d0615fb0af055911bcad4d724c208e1cde40259578df24ba3b0204008a381f -Msg = 8bd0e9c0054beaa7d19e08483fa541fa551ee71421af980d4b2b71e2f1117fb8ae5576c3fc63a666bd622a9c14b5639679c8a5a60d092f5b2a3461ee3fd429dcdb07bfd5078192d5d9d3829146ed4f1438e251aae0ec6afd4eb03a7e3fc39106366c2abdceac963c4e7b76ee7e55edbcb9f555e94461313ade26635b98e5a07e -Sig = 4197ec722775cc065adfcecce1af88d2556161466124f358563c84c52eb4ff711b9afa9a6c0bab52ea08f7a6f434ea5a6b4dabd3554baae2330b1de68e62d83c2d6217781c6e38376f142971e13c8806e0bf467089e3dae47b80f9f93e8677209f29d0b20b474ac815a2e2388b9d34b838373401b72a33e30914cc0ce9e1357d00f55d9736107d3db204bb13d77923566d35715a9c986f199d5d185f02aed6481dbd116e3fbc81c3bd4e3438928d3c93f63d9566b4af39bdc6361783286611a0bee9f326ac1678ffd9ef517ea0a6908cc38d3b153e68ce79bcde3c2f33d240cec3066d8c05af6d38008239979dacc67c2bcc14212909f4e2f92b654f7dea995cf006088be930061798d5fd0e4851c65d5a23b9440a83aacca0837059e85f32d16f390b02a57b910c6a9109f8d69af07d7a8a44beb4ddef724bdc475369ad34510b8edb5c2b36c9f9cfc775d1f1840d2406943048ba339d94f7f226763c17425543fc5d2c4f0d9fb0f4ca98e100be9c2917c13ebeb90a9e4fd235671cfca89769 -Result = F - -Digest = SHA1 -Key = 3082018b0282018100da3428fb42c2bd8b0a954bb132f3334b804b163913398188d6b7a8433fc66249a300eb5e7ed2b20b7e22e21caef328071993af0200040247c651a57d37160bf41db0af7840aa731be37c3daca590388ab93ca935b9ed94962f3837bf7df344855b2ce7eb4c68485c8455a16bae782d606a246a1a66229be6a4e3fa9b534c5e1c1100b5a15551fb0a70e78612eb2116f1a38fd694028cd2172bc7699105cd6e4c14b5c9da61819048c42b10e31c3019f8c97825f7f70312ee3e6348a38e0b4fe9d567e1a4087cf260944f57cdde56dfd9cd781c846ec73b523bda1539130c1750f24cf0b6d0d160f4492ee38d31bc44d4ca299effb4427e2bd4fff80f7d19042d988713a84d470fdb692a296e6e14c68d561addd58863496aba014ccc423cdaebe43874c90ba0981404398250a062266e372a9ab7f29c236225769f0baea54aa436705f0dad5dce1d608ce27cb34d22ec913c99c5a2d28103b0a88c8cbc3b9b37525ac45bb39d26d0615fb0af055911bcad4d724c208e1cde40259578df24ba3b0204008a381f -Msg = b8012a53d58a2db0cfa9e680b24a6327a01873cc7493650ea46213f26cea2020291f7d50039a32ffceed5b66323370ac0aebca5b0b066311a63ede782faac7773e8f1baa567a0b10c48bfd04ca14d46ffd63713becdb790b024a5929ae7688bfc0f90c4b174f404d792ed442c21515d641286f565f3b3064812d8eee3077ec61 -Sig = 584351aa09ff6cd9da1771735e122bea891e20c6c3e297966885f7c7768a395c455768a8c6066018cce86d2effd909a719bd7d712072efa0aa530b9ed6a1a24c4c4f589a006c077ffb013f4fd9dc0a9e13b516a3234d09f79ff76e8d46a8c5f1e41f229805d9ffcea507277511b5f8e71d13568574d01759cd851e2b6cdb6a7fca280ee10d7a62ae15db9069c0438ccfdce2b8d83dbc7e5abe6ddb1813ce1b7aafad383455b50da544bdec9dce0d93894927940d17159f1f82bf44dcd8e69631125695b7cbed538ff467d0f53258d815b8a817e79fa238eef0a26e53202ff5e2d57b547831eba68f71ee81b1d4a5af42de2c5c4e9a8e4d3f53d6e9832e71de9590851a5be5e18b381c94536313185db54f9f03d362971b13a8612d3456cd8d3f15644fbeb33f8fb2b9b6b60522f49b6c6bc5d6c3701371f66dd115f95eaf5889893e27df3975ea90ee3e8b9438e7dc26ecee1dd9fdc34843e3188cb020778b4ffb8b52339405f17278be0e6d9a227292363829cce7cc3ac2ba1ff90cf8c09dbc -Result = F - -Digest = SHA1 -Key = 3082018b0282018100da3428fb42c2bd8b0a954bb132f3334b804b163913398188d6b7a8433fc66249a300eb5e7ed2b20b7e22e21caef328071993af0200040247c651a57d37160bf41db0af7840aa731be37c3daca590388ab93ca935b9ed94962f3837bf7df344855b2ce7eb4c68485c8455a16bae782d606a246a1a66229be6a4e3fa9b534c5e1c1100b5a15551fb0a70e78612eb2116f1a38fd694028cd2172bc7699105cd6e4c14b5c9da61819048c42b10e31c3019f8c97825f7f70312ee3e6348a38e0b4fe9d567e1a4087cf260944f57cdde56dfd9cd781c846ec73b523bda1539130c1750f24cf0b6d0d160f4492ee38d31bc44d4ca299effb4427e2bd4fff80f7d19042d988713a84d470fdb692a296e6e14c68d561addd58863496aba014ccc423cdaebe43874c90ba0981404398250a062266e372a9ab7f29c236225769f0baea54aa436705f0dad5dce1d608ce27cb34d22ec913c99c5a2d28103b0a88c8cbc3b9b37525ac45bb39d26d0615fb0af055911bcad4d724c208e1cde40259578df24ba3b0204008a381f -Msg = 0803aa22e7bfadb1ae48bdc6dea805f2951c23650d81d2056509c6c2a432d823fbf963254a4aee46e6bc0bdd9a7b7eaceb85a2b8a01a0959826d638d61a0a19157ef5ab3512c6d62ca6be887dafe281870a442e9dbfda2c69041f2c027323ec4a64f5572024b722be3bd1b6ca8194a5babdfcba0c612e57616ec3c02fed0f6e3 -Sig = bf3adfd66bd872ad41c1b2465bee7befb88bb46c36d1a113ee3df6e0d2547f771fa7e72b7ba22d86673912d70b8ca1bb61e6835da82f6a272ee25b4d603bed423d6febc079a13f9140cfd22fe2aa9994125310b8f4268b3ebd68ec0ec781bd129d921502ee93fad8d96d006996e44d662ddca2932d8c06f088cff205e5826104b7f2860beb589a5161e8c0d5454fa7c522e395e843f025e6b99af27951ce577894adf63516b7fc78a6bebf17c287d199888e5237a17a88a765f929618c53b87a7e4660507dc7fa3e4ffdac8eee8963a960eb34f0f974d83fcac38223f24c79f818fb46e767cb3a807a77d6fdaa4d1b072f9d20ef025329da3f2933ab694b838996b0e6710cee35339f4e1cb7a145e3feac23847049977a6afd55038b8fd9449bee3875ca23708932d693657167ee577fa56d790dbd98537857a5d67bfa5c998c39af621c43c5ebc3976a0de1dc09890929ac3384abcfc22ed1c965254245bb2c6f68399ad3b9c4e6499d1f09ae800a5d6fe871dc7adc98293fd86930aa566523 -Result = F - -Digest = SHA1 -Key = 3082018a0282018100da3428fb42c2bd8b0a954bb132f3334b804b163913398188d6b7a8433fc66249a300eb5e7ed2b20b7e22e21caef328071993af0200040247c651a57d37160bf41db0af7840aa731be37c3daca590388ab93ca935b9ed94962f3837bf7df344855b2ce7eb4c68485c8455a16bae782d606a246a1a66229be6a4e3fa9b534c5e1c1100b5a15551fb0a70e78612eb2116f1a38fd694028cd2172bc7699105cd6e4c14b5c9da61819048c42b10e31c3019f8c97825f7f70312ee3e6348a38e0b4fe9d567e1a4087cf260944f57cdde56dfd9cd781c846ec73b523bda1539130c1750f24cf0b6d0d160f4492ee38d31bc44d4ca299effb4427e2bd4fff80f7d19042d988713a84d470fdb692a296e6e14c68d561addd58863496aba014ccc423cdaebe43874c90ba0981404398250a062266e372a9ab7f29c236225769f0baea54aa436705f0dad5dce1d608ce27cb34d22ec913c99c5a2d28103b0a88c8cbc3b9b37525ac45bb39d26d0615fb0af055911bcad4d724c208e1cde40259578df24ba3b02037e024d -Msg = 66617eec7cb213d31a231ddbd0d4cebf80f32ac36d81bb979559877f416e3fb1da54b9fefe02a0b5d3d66bc59bd98b218945e969d3448fc609fba516a5c7a049e3c6b60ad39a95a2ac69541a6328aaa07c1a5e2d2193fe647102d4bc1a2e16e12ac05d58220258624ce6c2244f4a9104017a71567cf770387477fbbac82c0943 -Sig = 72d24f9b4b3642043b7080ce66d5c2bed95b1a710776ede03cbfef3806760a6ee640def72c6b04477342dc3d1109d06d58a1880bcb8b3ffd8ea15c2e66de6815419c684962f79dd0c0645b2b22cbcea29c7ae85bb5e689ead0f07350a3cc8dd872698daaafea95b014e12132df28b50e63f7c011a9e6a7184376223730119b201e8ac5d61b6bf9e7c2896fff600a119300bfb034a985330de944ffebf67f720a33115fa680e02bca71eed92d0160c83a037be1bc4383c26ada8e1298dd92d0db9d7d918a59baf2c2b2b88e7996f630d5f88675b8cf80be841973e3c1efd0a156ac9f5570eb2797ddd32cd4575fba8c3ed5c39236af3845bfd95020463ffb983b9a0ae24bd244f20a5ada496f58c80fa5b16dd2a8010abc86c7a8474621d4ebee2849ea96e0e94956614ea0818c425c0ccbbff20a62cb7d218573f5aeba6920f75a7fb26ebcf5debc473d4a8daed02e1eab16212ed268caf07c2df497d1ef6700f47287b80c6635edab668c3665ab333617daa98aac9c1f71f749bc1dc2bb2428 -Result = F - -Digest = SHA1 -Key = 3082018b0282018100da3428fb42c2bd8b0a954bb132f3334b804b163913398188d6b7a8433fc66249a300eb5e7ed2b20b7e22e21caef328071993af0200040247c651a57d37160bf41db0af7840aa731be37c3daca590388ab93ca935b9ed94962f3837bf7df344855b2ce7eb4c68485c8455a16bae782d606a246a1a66229be6a4e3fa9b534c5e1c1100b5a15551fb0a70e78612eb2116f1a38fd694028cd2172bc7699105cd6e4c14b5c9da61819048c42b10e31c3019f8c97825f7f70312ee3e6348a38e0b4fe9d567e1a4087cf260944f57cdde56dfd9cd781c846ec73b523bda1539130c1750f24cf0b6d0d160f4492ee38d31bc44d4ca299effb4427e2bd4fff80f7d19042d988713a84d470fdb692a296e6e14c68d561addd58863496aba014ccc423cdaebe43874c90ba0981404398250a062266e372a9ab7f29c236225769f0baea54aa436705f0dad5dce1d608ce27cb34d22ec913c99c5a2d28103b0a88c8cbc3b9b37525ac45bb39d26d0615fb0af055911bcad4d724c208e1cde40259578df24ba3b0204008a381f -Msg = 1c7965099677664f23eeec41046865633a36ef29f6116ebd5101dbfc3d7edfc1bbd5a0674fcedb89b18c330cc6b4c860ced20c02dff8d24692a8a853fcf3676fe0e3087d2217b9c37fad30f17c65405f9c02aa97d6f4351346350148237118e3f1694652f8992b86f4188ef70ec1f4e90b9071eec44ebfadd6718de19a3e19a5 -Sig = 8b7a7e94dd13ad803b61a100b66075f011b9c52d8d443c49560f99256f0eef53a699d24dbd8aceaf85c2fc0eaedb6e34f1bb4e5a58a171b5f08170ff865cda853e599dd6f7b88c32678733198e1ee4eb586cb360f3ef8aa3c034557c49cc39bf02a5bb8b4f17aaf7a736b83d2965c4ae8bbf9cc81f3f7943dcfb74caf216b745f6fa6b941e6dc5d535feb5862864d4ab4d4258d7bd1f93ae81219f88d3b8790cd40e2c222b074a1d396a92f75bee8e088e0e71daa7120256c5842dc4abaf04d9784d25dc6374c0c33126055c4367d841809fb21f3a3cdbbee5aad204bd89b3b7aa4995154b4f2ff3896c936a1b8f41a95db16ffbb733d6abc23889ea2ddb07498a3bb270e259276d4bfbdccb94683a7860de3786c93b19e285685f4397594d1b18c1dafb09e614e8e59760968e14992f9b1b7bfadd283c3493ad5035b79630846b349e3cd294e93952b40cf4580e4fc24fdfbe77aeb92f8c6afe03624be13862880f1f939c21cc895e62fa4c78a3b95341092a6abe7d21b5bf5528b2383c20e6 -Result = F - -Digest = SHA1 -Key = 3082018b0282018100da3428fb42c2bd8b0a954bb132f3334b804b163913398188d6b7a8433fc66249a300eb5e7ed2b20b7e22e21caef328071993af0200040247c651a57d37160bf41db0af7840aa731be37c3daca590388ab93ca935b9ed94962f3837bf7df344855b2ce7eb4c68485c8455a16bae782d606a246a1a66229be6a4e3fa9b534c5e1c1100b5a15551fb0a70e78612eb2116f1a38fd694028cd2172bc7699105cd6e4c14b5c9da61819048c42b10e31c3019f8c97825f7f70312ee3e6348a38e0b4fe9d567e1a4087cf260944f57cdde56dfd9cd781c846ec73b523bda1539130c1750f24cf0b6d0d160f4492ee38d31bc44d4ca299effb4427e2bd4fff80f7d19042d988713a84d470fdb692a296e6e14c68d561addd58863496aba014ccc423cdaebe43874c90ba0981404398250a062266e372a9ab7f29c236225769f0baea54aa436705f0dad5dce1d608ce27cb34d22ec913c99c5a2d28103b0a88c8cbc3b9b37525ac45bb39d26d0615fb0af055911bcad4d724c208e1cde40259578df24ba3b0204008a381f -Msg = d02569c471a2139f9265920ec395fd1803fe857d1e1063e03a2b0f2bac1ab33010dddf8c98ab7ed1a43709e49333faa3d91284cb52138119d77bacb00e2110bb8630c0530329c9a31627654af16771007a07217d9e0ef397e8ade1aa52c5db3c5ba874e15924dc5d11be0e09853b4a780d65c659a90ba19f964a18e01f0bfcfb -Sig = 40bb34f18580db4e1af934834953321a7fda886fb8831041909abfc08db1aedaf64115791699180c18b14584457933033e9cd0347b3e25dfde4c77bf5983f8f1635cadecaf7b109f399ef891604d4ef0b8bdc49d24011e7b1e4af79c34d0616aec06da2fe4a88847dca5f739bbd8c4dd6e4b196d8117f666534538ba180f703bd5cd87a9de0a50cdf2ed4b9e542d4ea9c2eba109754c55bd4432f37dba8708bd528a244e2b8aba7e8e56facb218391ca9dd29d8c1a58d7bf749f047829ff52998649f52ac76cf540ced9bc63c5fbb8e470a91fa0aba01bdd1fb899bac38c7b9e6c5f69591f63af213c2b543078ff3e29d02327aad6242511e6c91b37074a94ead1753546d0db25048fe2f3d10dccad0624495a3e1efd1687c9d0854fccbaf13e1e4892ebaecf2d1336681ee4f3888922a75424ee61d229f2f85984d187c9955ae51e6707bda528586b7e373267834dbf5a31332e640b611be64058e79f02fc4fa02e2e238eaa4cb725c471e9c0e5a48bbcd6efb9fb851cac9617a4da16e17166 -Result = P - -Digest = SHA256 -Key = 3082018a02820181008aa12846ecb9d8b954d2ca0fd3f60826c76d2a98ae615f38f5a662cb6158f17f29050dc6a1bc2f60f3a9db2da6c9b27b8cabe25cfc25d005ad60ce298f6da3415ee0a0a00cd2fbaf1eb67d4fffbe03b2570ab56c10dfee9f4da86c05920993c92c4ac33a246f5102113a258e17736897f981b8b29ae695802fa1bcf9b41a5f1053bd77400a153d1d6efdf4e4c14703a34380da2921deac003b4a7246568527d9e37d0da956766f155d3b9a38ddb747f2706a72268542f594c90e0d2f0ef755f4aa67aa6a25004548c73861c0333597337a944c42f762ca2b54821425477e4e0e2a9b1842ed3f16d68ed31318dc396071b90e1e514cff975d198a581723cc98cb784d18cf197a14dd7b9d5036bd7724b9301f514236bf7c8b290dc5bd93ebb6bb2d18d3fc4f4d480b8d1b62ffa3de1224607976a27d40f912e50b46b915f19556781b2ac88e16c14982a0718bdb4cec77127165bd7151f0181cf56efa1ea345fee075a7b36a02e74a6f3eb035b608cdd2ceda4d738876fbd7ffb009019581685f020374ef0b -Msg = 1d15d87fe7045f2a6650659acf23faeedc28b1bbd64a54f8f3bed617e3438975a6a891f4a08f99e6ef72c52efce3e7a15018f5b3aaa6bb4f4e8dcd069f75c06cf03799bf989f86ca4471cc0992a9010edb077b234fcb083148bedfe1d871d700a4c9d728f6bb8e9d0d556475b8feb0fc23fe2b56f041a5668957f6efb5c038f9 -Sig = 1f1563cbb8650b8a7ff7f71aba6c06ea20643e4620f29e8d1aeb4a1be6f665ff9779ca9303437aad3264aeb0f2b250af32054585edeb44b0a913175e6006d31b43eeb9c97bbd679e5434e8f645b6e096320a5906a64264abdb9cdeefabd5ff61ee3f851484ec6bb0c7957d6db38942be1b3412aeaa7b0700028fac765cc4f03bd7157122420f1acd4828ea01cd32e0cacc55f43fd9bf58ac71961031f72024832191598ae69dc96b458a237cae0e3a81784a98a1b012530936529efe73d073eaf974f8e1680706581e0accb3a189d80dc71b051474e50cd9d8eaaf9e7be4108be1e7d8e6a89709c50c2d85034f0e158b208a205fc4b30922d0e19ca58e15e46384ec15650ff56b6eaef908b44c4f9d71250fd050ce96acc204d68c09493596ab2bf3052792226d60b684e516e92fa0b1585dffbc309fac46457c07a901e901dd659e4fbe4ec0b327f88b8b8bc689c3f678aac3519ec1f7392936a726b7fe4be534b27bac5a35a55e18fdeb08857850940476c14fa12102014872b81bc5dcf292 -Result = F - -Digest = SHA256 -Key = 3082018a02820181008aa12846ecb9d8b954d2ca0fd3f60826c76d2a98ae615f38f5a662cb6158f17f29050dc6a1bc2f60f3a9db2da6c9b27b8cabe25cfc25d005ad60ce298f6da3415ee0a0a00cd2fbaf1eb67d4fffbe03b2570ab56c10dfee9f4da86c05920993c92c4ac33a246f5102113a258e17736897f981b8b29ae695802fa1bcf9b41a5f1053bd77400a153d1d6efdf4e4c14703a34380da2921deac003b4a7246568527d9e37d0da956766f155d3b9a38ddb747f2706a72268542f594c90e0d2f0ef755f4aa67aa6a25004548c73861c0333597337a944c42f762ca2b54821425477e4e0e2a9b1842ed3f16d68ed31318dc396071b90e1e514cff975d198a581723cc98cb784d18cf197a14dd7b9d5036bd7724b9301f514236bf7c8b290dc5bd93ebb6bb2d18d3fc4f4d480b8d1b62ffa3de1224607976a27d40f912e50b46b915f19556781b2ac88e16c14982a0718bdb4cec77127165bd7151f0181cf56efa1ea345fee075a7b36a02e74a6f3eb035b608cdd2ceda4d738876fbd7ffb009019581685f020374ef0b -Msg = 50930141564ac38dfef23056b5cfd10efcf3bb8823fa6f5254f8ff45d4b0725a86076ac0b1b8042b0248006ed53d224cb08bd78b104f1c4b69bf9c96686118387b7c0cd193cd9028297a7cc27f4ccfb4281852b5ca7e787723d689384a68ff9437db319d86f12e2d7871ec7b3b64a2ed6b83722dd8f14b7f8a260e52022bef14 -Sig = 65862ec1d10c408e4278ee1421e773f49ad426e368a48136d6f77d5a6de96ef4643ef3b8f7b451f9ef9ab4d8590752dd7adf1d78ce23411f3586564b67172ef718e8824d357b37f105dd0e38c0578df14220dbd83588c56c4cc658b5d4b07337ba3e40b40aa6d877aeb3cb95256d25e55b702bdb23026bcf05387d58ce020d359348536f9f108d111bf69c3823aca8655bd73a64789d258bc90b5006ad01c0640118e17aacedbc0545c543df8e05f254fb7d8846703723fadbd4179d4a1a5a7c371e980309d33b2d79061f741aae529d4e84c686a4077d3ffc66a8b18fab2f72ed06a3372efee4507425610d317c74d5566f4829b079012e2e066bacde53e43dd702fae3861eaf2721e3fc5818de552b5a9d084b5f03a451527fce2d3a608028163befb91ccecdcaaaf5cc357bfb698f0860350136b71b4b087b50e2d97a9a6765a6077f1b26e168b5d60b7a91330c3e1769adc479ffd866351eea4cae92609c0431511b91b6683d0d8d4d2a72be8622c7dd969d5977127ca5a6c3d0ef7ff77a -Result = P - -Digest = SHA256 -Key = 3082018b02820181008aa12846ecb9d8b954d2ca0fd3f60826c76d2a98ae615f38f5a662cb6158f17f29050dc6a1bc2f60f3a9db2da6c9b27b8cabe25cfc25d005ad60ce298f6da3415ee0a0a00cd2fbaf1eb67d4fffbe03b2570ab56c10dfee9f4da86c05920993c92c4ac33a246f5102113a258e17736897f981b8b29ae695802fa1bcf9b41a5f1053bd77400a153d1d6efdf4e4c14703a34380da2921deac003b4a7246568527d9e37d0da956766f155d3b9a38ddb747f2706a72268542f594c90e0d2f0ef755f4aa67aa6a25004548c73861c0333597337a944c42f762ca2b54821425477e4e0e2a9b1842ed3f16d68ed31318dc396071b90e1e514cff975d198a581723cc98cb784d18cf197a14dd7b9d5036bd7724b9301f514236bf7c8b290dc5bd93ebb6bb2d18d3fc4f4d480b8d1b62ffa3de1224607976a27d40f912e50b46b915f19556781b2ac88e16c14982a0718bdb4cec77127165bd7151f0181cf56efa1ea345fee075a7b36a02e74a6f3eb035b608cdd2ceda4d738876fbd7ffb009019581685f020400f1d0f1 -Msg = b1fe0c7145b1e35a8062ed24ab82e862a0d695a53a1cc7430af1b9574bf2a40918229110dd8c6c750c295b9911034e79879bd631ac883abf1262c80a98de6923993a78ca63dcd434eb36340bbfecbbb73b39cddc008f2023a27d163ea1d64a269b1068a7bfea431f855121839c8559a2247821ae1e77a1f8210b4cfb4e226f9c -Sig = 43333cc1b7da9710ad7f58a595078672be48dbedafab37dda0e1328e2f2b8b91dc88d2c33e0d8e06fdfa3dbc43e24d827f3ed31a994bf662225e1f0827a205cd638c16f38d664752d73db2c84f26d12a955e237f7a4d171a14d720b43dda3fa728d69ee0ed95869fc231d8f6fffe93b1acb81692ab9ff0f926073280a3bdd4472cba3b84541f1f9cd4508bf780e96c80b4a705c9893639f127969343a1ff9aab2b98d154c7f929fc55a5fe9485d1d9ca411131e5c0ff3fbaef353d49a9f13583cf1ebeea6209c123df32abcb311edc94c04e5eb3e1389e5011499e7d0d5bf66bb69ba7a06586d414b1d7cedd0106259406235fee1cf0b2bb2ce679f247741baecccff27c6e2a3a514d7aaebed281cb6381e7fa8d8a092ef1051b5418fd9886747c9194feab56eb975fe193076b474c2056d20a818a5b4ea56648ab5e7d4ddfdca1238d95da14dbb51e0a72b6df8d4e4d708a18e1828619c999525772400a9ca91c20229b1a979d30fa7bf7e33129abcc8d91f61ff0b8f2042345c27a928b7865 -Result = F - -Digest = SHA256 -Key = 3082018a02820181008aa12846ecb9d8b954d2ca0fd3f60826c76d2a98ae615f38f5a662cb6158f17f29050dc6a1bc2f60f3a9db2da6c9b27b8cabe25cfc25d005ad60ce298f6da3415ee0a0a00cd2fbaf1eb67d4fffbe03b2570ab56c10dfee9f4da86c05920993c92c4ac33a246f5102113a258e17736897f981b8b29ae695802fa1bcf9b41a5f1053bd77400a153d1d6efdf4e4c14703a34380da2921deac003b4a7246568527d9e37d0da956766f155d3b9a38ddb747f2706a72268542f594c90e0d2f0ef755f4aa67aa6a25004548c73861c0333597337a944c42f762ca2b54821425477e4e0e2a9b1842ed3f16d68ed31318dc396071b90e1e514cff975d198a581723cc98cb784d18cf197a14dd7b9d5036bd7724b9301f514236bf7c8b290dc5bd93ebb6bb2d18d3fc4f4d480b8d1b62ffa3de1224607976a27d40f912e50b46b915f19556781b2ac88e16c14982a0718bdb4cec77127165bd7151f0181cf56efa1ea345fee075a7b36a02e74a6f3eb035b608cdd2ceda4d738876fbd7ffb009019581685f020374ef0b -Msg = 89574c2f705f32cafde26824389468218712eae98268588f02d683f17ad494df8b53457fd24651ef0561282d3e20e834960c8968f63a57342a14a6f2375bc10bef6d235fc2c4eae7d7c088985ca6bc8b1ae8c15c4ca7c5d0b1769cbae061b61fdc2e4e98e8e2e5f89c87ef2f392dcc6e3a2ff98c2bb788a9be84cd111ceb5b62 -Sig = 45c1da7fa6d790ac28f54716f23b2d594a637c5f6785e37fec8350e5d5334edceb66c263197702e5e5d543a2a9a6893cec3608512503ca26831d8847c2563c326bbdf3aa5edf7a583d8252e2cf35bb16cf30a0736ccdddd41af4b54729c843b9c675ab33d3ba1e1f7f63d2aa2ec94da2a9fe4eab9036b0561d5ddeb6d3dfecd1e243381de0eed5d41b8fd6023826d3bf4ffece8570e800c1689a57c2987a0f5629dac772c5f40b475ac61524c0308dd7de872d2f2d68c6017992ee060c607826db6f263f3276f330b7d267defe6eb91f9e9ca63e552531869f0b36784813991da6aa930736858146a42eac2b17c3ed2fac55ae3e0c6370b5302e693f84615e4174576150c6454a5c5f7a4f72d03630e899363db71eeb8e4e919ab6d15e87306c626dbcc18bfe62bfb1878a5105cef0f5b4f06cc4b6d7fc12f29e687ea9d0e16b7ca009356a2cda1f7b48b22e43883582cc770803f6c75892174168ac6954c76a475f0bdda4dce703e5d7737f7019a43ac72447b524a6132dde51f925fcbb9485 -Result = F - -Digest = SHA256 -Key = 3082018a02820181008aa12846ecb9d8b954d2ca0fd3f60826c76d2a98ae615f38f5a662cb6158f17f29050dc6a1bc2f60f3a9db2da6c9b27b8cabe25cfc25d005ad60ce298f6da3415ee0a0a00cd2fbaf1eb67d4fffbe03b2570ab56c10dfee9f4da86c05920993c92c4ac33a246f5102113a258e17736897f981b8b29ae695802fa1bcf9b41a5f1053bd77400a153d1d6efdf4e4c14703a34380da2921deac003b4a7246568527d9e37d0da956766f155d3b9a38ddb747f2706a72268542f594c90e0d2f0ef755f4aa67aa6a25004548c73861c0333597337a944c42f762ca2b54821425477e4e0e2a9b1842ed3f16d68ed31318dc396071b90e1e514cff975d198a581723cc98cb784d18cf197a14dd7b9d5036bd7724b9301f514236bf7c8b290dc5bd93ebb6bb2d18d3fc4f4d480b8d1b62ffa3de1224607976a27d40f912e50b46b915f19556781b2ac88e16c14982a0718bdb4cec77127165bd7151f0181cf56efa1ea345fee075a7b36a02e74a6f3eb035b608cdd2ceda4d738876fbd7ffb009019581685f020374ef0b -Msg = a8d283d3e616fcdabe06076c3368e022884108cf569bf363db860010955dafab0f4a0f54fc0c755982f87358d83e08a4136e15ea3d3b1015a87efc6e817e9908a86ed85bbf37912f827878bc56cb4e0f244b54af67530581848804e95b1954321b45c7305a1eb923658dfddfd497182a62dead66fc6b397018aa01c748b648f1 -Sig = 5961403c27cac4677ccde42cb807477e004b7cc795f8e14049e78326769803f852175ad36d6cc08232c168a34e33eeadb7aaee642b6a75928ad303fb4140eebbfc2fdff5a990f8bea12311529cc4575594a56f6d362a6cf8623cf6580eae79525e502c7be1ae71699e2b7916cde5ab5149840ce8db96e839d0d507bcc3d6184ec68a99c30a1b562959d7873027aa491a9dee9094249e7e3e1913f263e05b6d892a8787686baa7ecb9a88e3bdb52a7e45fdf49bb73588173c722c5503bb5864917410da43ff55e85e4df1af4bdd3b913ee5ef8b9f0293ef36641a775dd4f70df95f157569899df3b7f2cf54a5e34575ff9f6ef5b93d00699586a247c2b42ddccffa5c88294b7bfb686970e0fb9a1e7a823a8b16ffa9b5e45726dd3bb015c88307062aab622fcdac7ed30b7c773793d3f7ce326d30535f4bc289918aace1feaa02c620be6cdcde24d694e7936c58c83f9e4bc3dcafbc542afa4daa7be014099173708452817dc1493d3306053e97fd1c258b062a982a5333925472eb004d82d8e4 -Result = F - -Digest = SHA256 -Key = 3082018a02820181008aa12846ecb9d8b954d2ca0fd3f60826c76d2a98ae615f38f5a662cb6158f17f29050dc6a1bc2f60f3a9db2da6c9b27b8cabe25cfc25d005ad60ce298f6da3415ee0a0a00cd2fbaf1eb67d4fffbe03b2570ab56c10dfee9f4da86c05920993c92c4ac33a246f5102113a258e17736897f981b8b29ae695802fa1bcf9b41a5f1053bd77400a153d1d6efdf4e4c14703a34380da2921deac003b4a7246568527d9e37d0da956766f155d3b9a38ddb747f2706a72268542f594c90e0d2f0ef755f4aa67aa6a25004548c73861c0333597337a944c42f762ca2b54821425477e4e0e2a9b1842ed3f16d68ed31318dc396071b90e1e514cff975d198a581723cc98cb784d18cf197a14dd7b9d5036bd7724b9301f514236bf7c8b290dc5bd93ebb6bb2d18d3fc4f4d480b8d1b62ffa3de1224607976a27d40f912e50b46b915f19556781b2ac88e16c14982a0718bdb4cec77127165bd7151f0181cf56efa1ea345fee075a7b36a02e74a6f3eb035b608cdd2ceda4d738876fbd7ffb009019581685f020374ef0b -Msg = b2a9f33308f84f8718e860ee4e439ba1541a985f355c5dabc3a8df343660c69515ff713e5aac3ab2d10ffbf4c163d13bcecc1fed1eebd6cbbbb0f46938704be2983884c96b6063633a634d1325ee0715cb36c06f6a8f5225473bc5ad517f14a201fc34bd843d53001c8d5e34c40bc596130082ce626f582031ee58e6c7b5aa3e -Sig = 6f443dabd187abfeb167c7a76954251cb017b40dcd3c0de81909993fbdd6c99f64613e73aecc29eeb29fc9aab9ec54b55bc3539e0d34095248b5536b35f1a079a4f09ca2e83f51b07ef005a7e0a915be137e1d94ff2b26eda29a337b5b8d8652cb9f98703648a4b0d8c759ba48c1c37b2b76c3bbe116574c1f6265cc19703ce489186e3951e97e0d26230a82cd0b2a24def62b8af8e4962cf4e1a693d0d0bebd6fe45966b3a4e890e0a6f535919661beb109eb6d11e73ee2b97a3dd20074711bd4b817f442866d11c3fbf62255e05e466b36b8ffd57c6abe5592d72061d96435dedc32a822aa342b159ab21a993703b5ee7bd6d55508800b67667188810e062be554244db902947bd2ebc7f9e6c899f6ca1d3ba3a5c2edca8bafca8a5b54426b04a5a16a3c752d18647b578904f60a5dac531c95b0bfc37b7aeddd3c3564d0581f1088e85ed85ca366ef94eeb8f8d06b060f73f20778ae83bb884527fe9bc1a04d6dca59fefdfb9e14d68f97d9fb5fb1045c9a229d3015a4867efe88791554f8 -Result = F - -Digest = SHA384 -Key = 3082018b0282018100b9d8bc1223a849736371b49a5ca907a795cfb595fa5aa4ee94a6833fe0ba2368232fc0cf55debcbe7dcfda928bbae3f9069eaefc5c96cf490cce15585cc084ecb6cb09ef234e295b96fa01305f64494018cc49ebbbdc5ff99a2458a06501f33eac8fa9a69db092b3defa9ec09dbfa7cc36c9b356e05f514df1475b9c272d7ed2b63c37465d1554d0f7fd0df30cccd10f6a3d8052fdeb09fa95f305e421db0888a9276f1d1981f4bab7c2ceb4cac86e26c41fc10766b867f68da4c72d854b18acae0ef7631077b89f6bba28692b2a6e4af219770240c3479fdd4498b9c74416d3f666d245ab333f9ade406f9dbcaa3e4743dc7d210bcd6fa449b52121db40c2f8b3f1376be842806dccb7186811618f9ea4aed979e31e26b15e6497abf38ca47fad10c91d1315469072e0d64ca3b93aa86409f163460e750a86c73240d01f76bf2f7f1b947f22c99ae148673de8a3dad1ad34ecf33f1bd4f08f0cb7ea1e5cb62de9ffc98a265afd68c3bb0abc1ef12ced048be9ae9245b89f6c7733185fad0159020400c31179 -Msg = c084bf63aca6e6917b6b46a4ea65bb59cfead64d6415d21de30ecacc538b2a65a19764e1f293e44a387a45210369c5fe9b5ef6764b3fb741ff1f639c12be48ed614e5ba6a47d296bfeaf1177d28bb13cd9ba9e4971eb5871381b7d2ada133c3327320d7a696c9f3cf493126efed5675cb18735907f219df5b6897f3c5494ee7f -Sig = 3e81c4d40bddfa8fba559459acd314ed43381be13637b35d1f3856a3c881937e7338cca224cbe3fe8464eb0c96944a419857266bd1bbfb6fd5b156bd735f4a8642d96e40902a47f4302ab151825ba5b63d889ec54fbc100943d9b09658eeb654eef21f2168dfad01d2c02733fd192512ad643808fea2b1af43e10ba60c65548c82769df02c8d6cde973c24e9d92f31fc54be94a292ff2ef77cbbc53e970242acfbc40692a745208bcf96bffb862e1dd2ca3b90ae6f8be53fbc5899af6c7b4d1fcc530a34fe0856a0645181af615575efa02833b853775d252233f4c2e4bb515732814594ab2a82ba080e2db520fabcea260084627bfbe01af01e3774f3d8a6aaeb0cd80c901feec45d4eade1cf66cc878f190d3229b2df5b227dd4e03125a9a6d83a1580c0505e4a785ecb698e1ed0c83a2c62b48e3b44d3fc441364e5a8bf364a937e5303d16244bf016142d9841c04a52a8b3eebea3334c8b52108c7a62999801c840e98f30eca401772fc6b8462fe17c0ac75928ab068a16d5536df11170d -Result = F - -Digest = SHA384 -Key = 3082018b0282018100b9d8bc1223a849736371b49a5ca907a795cfb595fa5aa4ee94a6833fe0ba2368232fc0cf55debcbe7dcfda928bbae3f9069eaefc5c96cf490cce15585cc084ecb6cb09ef234e295b96fa01305f64494018cc49ebbbdc5ff99a2458a06501f33eac8fa9a69db092b3defa9ec09dbfa7cc36c9b356e05f514df1475b9c272d7ed2b63c37465d1554d0f7fd0df30cccd10f6a3d8052fdeb09fa95f305e421db0888a9276f1d1981f4bab7c2ceb4cac86e26c41fc10766b867f68da4c72d854b18acae0ef7631077b89f6bba28692b2a6e4af219770240c3479fdd4498b9c74416d3f666d245ab333f9ade406f9dbcaa3e4743dc7d210bcd6fa449b52121db40c2f8b3f1376be842806dccb7186811618f9ea4aed979e31e26b15e6497abf38ca47fad10c91d1315469072e0d64ca3b93aa86409f163460e750a86c73240d01f76bf2f7f1b947f22c99ae148673de8a3dad1ad34ecf33f1bd4f08f0cb7ea1e5cb62de9ffc98a265afd68c3bb0abc1ef12ced048be9ae9245b89f6c7733185fad0159020400c31179 -Msg = cba095c8a79360b72e4a9f1211fbbb6f267852c4180d8a6f5eaca67a6947d71c227e5483937aacd0e4195b648a4b9c5abbbc7f5425b33b7bdf3ac5c1a07fa26a2f7af9ca1ad0ec50abf728c3189bbbccfa4127b5002bb470e57b0adb9f9bfe42dadbad25a45cc73c6a2e2eb923b5c0cdcb51706d133d9c5657b89b4fd06395ae -Sig = 1390587a993b5f01af71c53023b9f1746268dc1486ee3466f66e34b02173781e8a9f971dfd1a6095f0a4ebe18324e79cdec45354822213a9d7efdb529abb6d1aaf8c86aba3f786f2412e1af6f392a9b2143f3c805d7b703e5a95ccfdcdfb4f2386766c99b99d90ec9217608ae513bafc062f3cf407a3bd684ed82b7b484e18a9ad507f75b066fb297bb19b1b092fd3741742f06887315dad3c30e3e5419caf0ffd67eeb9e986dde031968415cf33670402d35ef14f880b6d9e6cf7758497923c8575754ad3f9f7fda41a4e6021314cbff1a7f5b2799935c476e55458b2bbd61a32638eb45708d91af75723b5f4f4fea15f16eba82235f8c6f81d27c02242c5ddecfa5a206ae6b1e348c06a03f197c9a0ea3654435798abdf4908016709ac1b0cb6368b893b02a8aee9096dfb23897bea35ed7ba5cb897f50a6023e6d42355354545f43b1b8af8aaab8fed275efb57323e8963d32b1d600b55d5f35b52b1b0c937691c322cafbb32a54feb84ef38e221c9b00a80310ea3a1ca6e713277e6bc127 -Result = F - -Digest = SHA384 -Key = 3082018b0282018100b9d8bc1223a849736371b49a5ca907a795cfb595fa5aa4ee94a6833fe0ba2368232fc0cf55debcbe7dcfda928bbae3f9069eaefc5c96cf490cce15585cc084ecb6cb09ef234e295b96fa01305f64494018cc49ebbbdc5ff99a2458a06501f33eac8fa9a69db092b3defa9ec09dbfa7cc36c9b356e05f514df1475b9c272d7ed2b63c37465d1554d0f7fd0df30cccd10f6a3d8052fdeb09fa95f305e421db0888a9276f1d1981f4bab7c2ceb4cac86e26c41fc10766b867f68da4c72d854b18acae0ef7631077b89f6bba28692b2a6e4af219770240c3479fdd4498b9c74416d3f666d245ab333f9ade406f9dbcaa3e4743dc7d210bcd6fa449b52121db40c2f8b3f1376be842806dccb7186811618f9ea4aed979e31e26b15e6497abf38ca47fad10c91d1315469072e0d64ca3b93aa86409f163460e750a86c73240d01f76bf2f7f1b947f22c99ae148673de8a3dad1ad34ecf33f1bd4f08f0cb7ea1e5cb62de9ffc98a265afd68c3bb0abc1ef12ced048be9ae9245b89f6c7733185fad0159020400c31179 -Msg = a855f314f00f48cde12b6f316f9922604622960e60adaee1d6bb6f1af635b47897672259a94c5f23100c7fe2b3c3bf33cf847660929e48cce51d9d9289945169651aaecb1e939756e93105729d3ab8340d0b2682945db878f1c7350b55847eecbb777daf786c582d13a1ea275685732ca5bf8ebc8f7264ada3bf20ce858ca3cb -Sig = b360ac35950b6be6d9b9b604af60cfa6716a23a7e9c556cc2f3bc9b298cd8605a28225dd6a0aaf135fb56c1dad09b0481e573565bd13d6fcf8fd3f73ea12912ed4785093e3c12864e1d125c41ff4b30af81c6ddb4d9a722cda98e1095a2eab53a05d22ac1bdec2687c3bab14aa83ac9448c9544b685ef92f5aa3f02a2b8b7cf4607c68169e6c5d9bb4bd8a29beb2a2952fa02d172e3120f414a37de6ebc2f2f7176894938beff3666bfb852528841d9771708fbafd61a3f1410300b77b5efb7e682795f290fa0a469cc22cadd7e188a6a41c9ff25443850f749df159cb5748e071df8b5e0ff0e7d1517d3bf4e4b51263f8f76ff1e8114ebefc2b33dc3699870b29ea68853ecd5e6faeff01bbe8ea1595273ef6b0f0befc2d2cbe8b8c3c7f6a45aa1f905624d71bd649c85797a337ddab8d7b67feb3fa681be382f88b11eda4a0883e55c71bb452079f32ba8235888fc82b339efc574521e80d185e271bdded1df25acf2fca5acd1a9cf26ca30b71bb44ab61fff382ae7274669d5baa20d02a6f -Result = F - -Digest = SHA384 -Key = 3082018a0282018100b9d8bc1223a849736371b49a5ca907a795cfb595fa5aa4ee94a6833fe0ba2368232fc0cf55debcbe7dcfda928bbae3f9069eaefc5c96cf490cce15585cc084ecb6cb09ef234e295b96fa01305f64494018cc49ebbbdc5ff99a2458a06501f33eac8fa9a69db092b3defa9ec09dbfa7cc36c9b356e05f514df1475b9c272d7ed2b63c37465d1554d0f7fd0df30cccd10f6a3d8052fdeb09fa95f305e421db0888a9276f1d1981f4bab7c2ceb4cac86e26c41fc10766b867f68da4c72d854b18acae0ef7631077b89f6bba28692b2a6e4af219770240c3479fdd4498b9c74416d3f666d245ab333f9ade406f9dbcaa3e4743dc7d210bcd6fa449b52121db40c2f8b3f1376be842806dccb7186811618f9ea4aed979e31e26b15e6497abf38ca47fad10c91d1315469072e0d64ca3b93aa86409f163460e750a86c73240d01f76bf2f7f1b947f22c99ae148673de8a3dad1ad34ecf33f1bd4f08f0cb7ea1e5cb62de9ffc98a265afd68c3bb0abc1ef12ced048be9ae9245b89f6c7733185fad015902037fd99d -Msg = 52b8858ed4d0a638f1694e25ba9d40dd27d5579f0de71ba54a8292a842cc59a79049f2e5f5ff603194d8f16962475c41d82e0b41eb00ba0d3d2341e99598ae7c8ddd97d48a12afabf15c96e99887f66a7befcb00b1a002bc9ebc4669691d175ab03c1c667b51ba306fbce5ac45a436de7ade3ee547101b39d3164831a8a4bac8 -Sig = 4ffd27f815873946809b20af5e752506c39c881dad1e61ef880a245755ee35858578bb2bf826ab8adae135cdee5a132d3d5d02d4dd4af4c530447b4ee8911f57d29d1c88853cb415e0c9d041a30593cfd7f539a4450c4016f629d4d723450ca869fc247fdab20d2d34315d7292584961dff6e8726a1515c1d0f0ed1eb7ad902d940f1513d3c9188cd06ea8562ce5a288b501a80110011508c4e1e575c0dcd7fa9a7df22bc37fc6ab2183b0570fa5b53c583ebfc414b412f14ba2eba86e996660ecec5d2cdcf4a408b84f35718115237ae3e6ebc7489ad754642c25c2c60dac66379ebc1e4b0fb7ae3e8a5afafe83e2119269ae04465a55562dfe8f2139b2cccaff2668cc9805d15f0a8a159ef4d9a4f4f6a1ff8f6b272cc317e7089a8b9ec056978e7c65e5e8a234b1e992ff9b279852ddf70b5b8a3ce8ee14ba9b7a1ccf7787a9ea8c97fa872d0c7b29002e4548ee6bbd7878d43cac68ad58b37ce0310d37b73342033e98d4725b629ef5400cb389c95356e893259a7a2aadcbc735186274b7 -Result = F - -Digest = SHA384 -Key = 3082018b0282018100b9d8bc1223a849736371b49a5ca907a795cfb595fa5aa4ee94a6833fe0ba2368232fc0cf55debcbe7dcfda928bbae3f9069eaefc5c96cf490cce15585cc084ecb6cb09ef234e295b96fa01305f64494018cc49ebbbdc5ff99a2458a06501f33eac8fa9a69db092b3defa9ec09dbfa7cc36c9b356e05f514df1475b9c272d7ed2b63c37465d1554d0f7fd0df30cccd10f6a3d8052fdeb09fa95f305e421db0888a9276f1d1981f4bab7c2ceb4cac86e26c41fc10766b867f68da4c72d854b18acae0ef7631077b89f6bba28692b2a6e4af219770240c3479fdd4498b9c74416d3f666d245ab333f9ade406f9dbcaa3e4743dc7d210bcd6fa449b52121db40c2f8b3f1376be842806dccb7186811618f9ea4aed979e31e26b15e6497abf38ca47fad10c91d1315469072e0d64ca3b93aa86409f163460e750a86c73240d01f76bf2f7f1b947f22c99ae148673de8a3dad1ad34ecf33f1bd4f08f0cb7ea1e5cb62de9ffc98a265afd68c3bb0abc1ef12ced048be9ae9245b89f6c7733185fad0159020400c31179 -Msg = c59a84b7b6a11b30d6e4ae9f4d745ac2b122ff0787f0e7a107c5a8db20654bacbc9fad8c45c92687686969901935ab17d73e08de31682208891d0b7318426547326ac7cfcb4a63883b6ee6783e2aa0c13fd2e576d62db3ad8f2894d6edc8c64bae629a28510e1a5cd659ee00c53a81e871485f787e29e2b9a14e0daca7ddb8df -Sig = 7ae1169c0d774fa54ced1d2cafc75f64d46a0f154275191580feae3c043b1fc84ffb9f39cdcdaf2e76170da8dacb51c9fdcd3ccc4966911576823dc2a312afae8a502b6ed879a51a9be3a7eb8fb7f0ba96203722add0d8edd2d1267fc74be56b1bd3e42a24df1e05c5ac2f576713fafe6b105fd403589dc6c8734b07d6650c12d215b2378ad63601c4edfb7f4e6a5951112b7e9dab5da98c863d2f373def298e408110da2e21b32fa1f942df85457dbd8d3e0b86e89547471b86f27df3c1e361de5609b78771557a859901b8e2310cec7af6a889c9bddc61c77293ba455314375ae731a12589353fc31104613f51384cefd8eb83b465cad5ad275e64dbd252a1f602afd2ffd8f50216d5ddb17fbf9bc30325427ad02cd525e87744c4a048e51dad778224cbace8fca7228df229b3a9e84777c2b4d0aade9c831f51005ee51b700e10efad61099a4a5c1516c85d2851f42660290aecdf1952a189681fa8a74682002b69318b9a404973a5f139f2a6594a8e0a8cc14033f27400c9601d9018c363 -Result = P - -Digest = SHA384 -Key = 3082018b0282018100b9d8bc1223a849736371b49a5ca907a795cfb595fa5aa4ee94a6833fe0ba2368232fc0cf55debcbe7dcfda928bbae3f9069eaefc5c96cf490cce15585cc084ecb6cb09ef234e295b96fa01305f64494018cc49ebbbdc5ff99a2458a06501f33eac8fa9a69db092b3defa9ec09dbfa7cc36c9b356e05f514df1475b9c272d7ed2b63c37465d1554d0f7fd0df30cccd10f6a3d8052fdeb09fa95f305e421db0888a9276f1d1981f4bab7c2ceb4cac86e26c41fc10766b867f68da4c72d854b18acae0ef7631077b89f6bba28692b2a6e4af219770240c3479fdd4498b9c74416d3f666d245ab333f9ade406f9dbcaa3e4743dc7d210bcd6fa449b52121db40c2f8b3f1376be842806dccb7186811618f9ea4aed979e31e26b15e6497abf38ca47fad10c91d1315469072e0d64ca3b93aa86409f163460e750a86c73240d01f76bf2f7f1b947f22c99ae148673de8a3dad1ad34ecf33f1bd4f08f0cb7ea1e5cb62de9ffc98a265afd68c3bb0abc1ef12ced048be9ae9245b89f6c7733185fad0159020400c31179 -Msg = 601f9b9b34cd3fe2fecf6244bb33a668c00aacfb5e76d95cbf045a98113c6598e677c299dbf18bdd781f30a05843bd4e8a3d60f336a426f3841505fbb9cb1f37a47045c63833ba6b7a1b3a859e9b3b416c66730ee9849a5134a6715aaeb703975db32b0893bc56f3ca6b8ad9d364a8a8302dee32be40bfde975ea79e36279a21 -Sig = a7f140de7666dd42f10350ffed86802c528fb6062bb7f2e1544622191dd93f337d2dc831a7885c8f96a22ed4b318865b73d9a38b994410ec4464fd6e3ac496df6c8184382a633240ea5bd6069e4d6a1789e230ed38eb46f117b286ff7721b7463d1a7a4d7e2117a5902ef1a51977f664b81524c2e42a4618acd8a0c4a2af1e8a454dd229f435159f36b132a1579d922a5828272a776540ae827adec7aa8e5d06703956f90c0a5351ebee317b3bb48ff14ce392d48d59c819c6111b37914be142038628416209656709a084d963fc5e213e0847eca013c83f4f002712ecaeac83d3224af740c764bea479633527632324745aefb28b87080e16e1febd5c435e1a5e17245ce65fb049d01706f3f5682f7e8bea9bdda372ece37a51fbfb611b8fb58c06d2c0ea37a6988a716fc6e38da4e09f66c2f745e1b51180e37deed1cf6bc7cc5edd6e149489cfe0045300390280ff940d762e0d866f5f9da73496d666a97c9d2f4f69ee3a51b77641e7faafc409d03be7afd79649eb293d61069b4479ab6a -Result = F - -Digest = SHA512 -Key = 3082018a0282018100dc09c7fdce01962419294bb4e9c7896347d9bbfffab1d7f35b2e36671d7766a4a4a6b16e8bc12adba6503d4d967efe51e89be652d42b8e7b1b12c0ab34d00997b72a5ab3859bd7d414c72e2997521384fc0ce01f2488f443f1afeb043b14099b3b1efb0154020ff10c50eab077e534270cee6e95fd9352c2f70350c0103a252fd041f9583b67bd92d5d712c21d6036834392b72e622fc0f3d3e1d1c09d512fc6486e7f5465999dffa16e2c5e3fa25267d8f52dd639c84af6bbbb76afecba35b8775ff1cad59e8280d73cb3fbbdc084a60429f7dd9bbe9198d2c8351c27c4ab61ab68d54e9222ebd9177550439a5b5b9ae13c49467aefc41afe435f0dfdaef913238a1f6ecf4692167c19357a2625b06942a5c5856100a6c9d66fb4ee37173fca4ff9298d4d4ba558aac53a75f14be641b1701550fc2a1e2cb4b2c734d29b266cde310888397ac19667fc577422c90a897c3b2e65ed62cac471595b18bb124501a663b093d1161d697f9df6bdb151bc9608534a25f983b14117505040fb481d5302035a75ff -Msg = 32e5485f4834ecff046b3f554de9f9d02aa8f95b2812d0d4fd1683c06a7a8d3d667324377873bddf6542d2590b50e3b58d4abb21b0ebf45d8515bd6f4920db978972ee85894ff6cae7f3158d7cde977f83702f11fdb583e45482eb803ec1764ae4092fb044729ea7d3a79157673c1c145542de91d6198650b086965d1205673c -Sig = 4f8d07925bc0ac7e423a824b1439cdcc486e9612f54c93f5d4fd34f64ad67369b172388e06da52ed100d278c77d6efecd3fdaf56d0a572dfdb978b9449d90951494809c2e88b4a25cf879967659db47dbd43656182958dfef8bc9c54c3a4d62fdb48066735ef5aa39cf89834e479a99e8d22700d288abadcbe28c6667e437515bb47c3d1662d9556ad98abc81bd1ce1b8990155c369ef3827e631164ce8d710c193246bd625692086d0e7f239ce3aa9d6b8d6a5728c64d24992465935aed196ab1715f88bc36118c52ba3cf48cff4e61fa0080282645cde0fbe9493150752093054f1f0889ef7a55c5814d6cf667913cfce4aff2941d1999dcaa5525bd497909839223759c62fdb1387dd4c84f72a32705ae7fa14512af2d7002b315c8c183f0bcaee254ad976270d035fb9d2f4cb22fa2e8a2535d9f345511b22391171aed821e754922b2f6c797debc339264fb28a9788a1d385f99a0333ef388113be22c7b93e18cc80b3a91d6dbe9dd46587544eef85335030a70ab73283e539498f2761e -Result = F - -Digest = SHA512 -Key = 3082018b0282018100dc09c7fdce01962419294bb4e9c7896347d9bbfffab1d7f35b2e36671d7766a4a4a6b16e8bc12adba6503d4d967efe51e89be652d42b8e7b1b12c0ab34d00997b72a5ab3859bd7d414c72e2997521384fc0ce01f2488f443f1afeb043b14099b3b1efb0154020ff10c50eab077e534270cee6e95fd9352c2f70350c0103a252fd041f9583b67bd92d5d712c21d6036834392b72e622fc0f3d3e1d1c09d512fc6486e7f5465999dffa16e2c5e3fa25267d8f52dd639c84af6bbbb76afecba35b8775ff1cad59e8280d73cb3fbbdc084a60429f7dd9bbe9198d2c8351c27c4ab61ab68d54e9222ebd9177550439a5b5b9ae13c49467aefc41afe435f0dfdaef913238a1f6ecf4692167c19357a2625b06942a5c5856100a6c9d66fb4ee37173fca4ff9298d4d4ba558aac53a75f14be641b1701550fc2a1e2cb4b2c734d29b266cde310888397ac19667fc577422c90a897c3b2e65ed62cac471595b18bb124501a663b093d1161d697f9df6bdb151bc9608534a25f983b14117505040fb481d53020400a1befd -Msg = 6de2659492e82a0541143765c7cb73d457c9b695b608231137e3b81fe97b23820f5ad7b3d05660e230b8f3373f9e4a5d909eaf41edac5617493eef9ff6ae7ca619df60cf5a23b993e05cf0877c628fdd24a5522ea4148077903d7b617db596c570ba286f9717df22374856dde6dfe95dfa26c8e341064a37f32784ede4591be7 -Sig = 1ae7122bd67306b4f3d0c3c25a6d3f3318b8ba13c64267f1c4264eeb974131d51566fbc71108873b4920bd48bccf493558b63ded97441cd674a3f020e1fe2fd09e093a18e654a4a379443394e540a53f5c24d67cce5f15be955c446ca872b2505a3b07be1fec5847261e76cf708dcbeef8db95a6fcc87bced3f7cdc1f524616fc0539df58075f818608fc38809ae8e489a35d186c8053f9cc26e869866b98347f888f701635df245248f29982efb7b05e80787cab12cdafe54d065b2ae3e0bb3a03ad0a727d77f6fc3cec60a32c5af590983d08b0d2d0a51dc50f3a6bb2f9786d6c77c37a32c917b91f5b29c65a6911a6638222256ef04b4bf76269f846db847b29d9edccae04effa28e357a76499389b831d5e8dc7c42036bc4277a71b4bab0edd152ccdbbddb8957a3bdbbaf1e4cbfb2b8af678ac7706d16ff6bc40c4e8fc4cbb30146f66b8e035363c935c5c72d78fafe2c8ddd4f0793b98a71a6b7ff6b6892c7ec193d1076fc243ac061801a72cdb78ba2f1c34881c6212af2a7689ecf51 -Result = F - -Digest = SHA512 -Key = 3082018b0282018100dc09c7fdce01962419294bb4e9c7896347d9bbfffab1d7f35b2e36671d7766a4a4a6b16e8bc12adba6503d4d967efe51e89be652d42b8e7b1b12c0ab34d00997b72a5ab3859bd7d414c72e2997521384fc0ce01f2488f443f1afeb043b14099b3b1efb0154020ff10c50eab077e534270cee6e95fd9352c2f70350c0103a252fd041f9583b67bd92d5d712c21d6036834392b72e622fc0f3d3e1d1c09d512fc6486e7f5465999dffa16e2c5e3fa25267d8f52dd639c84af6bbbb76afecba35b8775ff1cad59e8280d73cb3fbbdc084a60429f7dd9bbe9198d2c8351c27c4ab61ab68d54e9222ebd9177550439a5b5b9ae13c49467aefc41afe435f0dfdaef913238a1f6ecf4692167c19357a2625b06942a5c5856100a6c9d66fb4ee37173fca4ff9298d4d4ba558aac53a75f14be641b1701550fc2a1e2cb4b2c734d29b266cde310888397ac19667fc577422c90a897c3b2e65ed62cac471595b18bb124501a663b093d1161d697f9df6bdb151bc9608534a25f983b14117505040fb481d53020400a1befd -Msg = d9fdd81eb8d725ec727cf671386e9c4d7968b23e4d37a39414cb6de55a8ea401fff5b92894547c7b07f6e0b1836dfe0b92275d8a8542715f15a161a34a400e489cc450505957823c46b242c8897b72d5c6d282a78927f250e44e126c59d50d0ff99525fcce87401877d9a41e1241ff935f92aafd218d2e50c8f908a94ef6a93e -Sig = 9658a72570e4ee228863702a79115dd33a0d562762306cc603ca2c480aec784df73a32c067400e5539c68e34fcbac59457b0d89e6eb6faeac716234cae40a5a40593be11cbc9100280663007ae815d4515210f2f6220a09582fff1c085ae1dbf7cfa9ecbd3113b0f1803c47c65893e8cae0802177aa0a056007bf2863298cf172425c61d4798cef950e632f1f6d7618521dbd7aafbec3cc3e41c3f4bc9e80e437e71b4d6f924b15509cb355fa2d9e91176b861b81e4eefee72e988e7ed8e4eb7b93c4ea35c28332aac9de918e49a7575473d9cca1f117aacd06618a1fc9e1c6c6f8a7b0d4cb5d04187bfe930e4fc5a080ada4888e6aa5dc3e984c7841a225c50fae637369150863294ce5c0398a0c7d045098c644256ddea27b63b921fd87f86ab719962b71b5d8582a91f762cdfe3b1b2c714dda16dd91155fc9b5be378bbf2635997ad8effddb3869bf0cddbc113cc97d67fd69ed4b7884246cd18f0ae3a63c2db35ab7cfa4b73777cd8e005d6e222215a4d8818bd6426c4adc9b1c69565a6 -Result = F - -Digest = SHA512 -Key = 3082018b0282018100dc09c7fdce01962419294bb4e9c7896347d9bbfffab1d7f35b2e36671d7766a4a4a6b16e8bc12adba6503d4d967efe51e89be652d42b8e7b1b12c0ab34d00997b72a5ab3859bd7d414c72e2997521384fc0ce01f2488f443f1afeb043b14099b3b1efb0154020ff10c50eab077e534270cee6e95fd9352c2f70350c0103a252fd041f9583b67bd92d5d712c21d6036834392b72e622fc0f3d3e1d1c09d512fc6486e7f5465999dffa16e2c5e3fa25267d8f52dd639c84af6bbbb76afecba35b8775ff1cad59e8280d73cb3fbbdc084a60429f7dd9bbe9198d2c8351c27c4ab61ab68d54e9222ebd9177550439a5b5b9ae13c49467aefc41afe435f0dfdaef913238a1f6ecf4692167c19357a2625b06942a5c5856100a6c9d66fb4ee37173fca4ff9298d4d4ba558aac53a75f14be641b1701550fc2a1e2cb4b2c734d29b266cde310888397ac19667fc577422c90a897c3b2e65ed62cac471595b18bb124501a663b093d1161d697f9df6bdb151bc9608534a25f983b14117505040fb481d53020400a1befd -Msg = f5277358fc0e0ed9c50e381423ff803035d7107e961281ffd557f42625585ede55fa23cf02b6e7dd0b3ea0f24564f0fe7038b33c6a71d4b6a30f640bd13eed70e57c03f53dfe1d0a1b50a341563d48554fee9a6c2756d7992fcd03a5a0fa370f8df73c5115b05965dd8c6888be502f3eba40ee96358735af61d8f87bfb56e5c3 -Sig = d261372ba60cd5812e0230d6103e1f9a777b77f8bc9de3f27bcb3d32e23a60f56f4631350703e200ed9a97d3e2d397234576c5f5c1a347101f62142cca0a53ef9e2b22e724c9d02e5bf4fac684e2803e95640fad841aef7626bd6ef22e7a97ffff31237a70118504ee8bfa0f0e71fd80b195e8221a296d62fefe991e4be69785bad174ab44728605a3d1c41918d33a60fd5a002465ba7b02341c30e6b058b47cca3f5c8a289f5ea3401c2dad9b32ca2f3511538407fa5c03045528e977ce46c8dce655f445588d4a1cb8cb5d76e84776ae86344963b675a3428ca717e4f940ad29199cbf87d27334eab76b878bb015143bc2537fde09a8aaf2649ed29a5d09570959f011778677177e4624e0ac7d9146a2493d5d1299a408b1383ba61df26415d64bcf38e1441c4e0123dbc5ce22e7e077cf9eba5d632d308c23654f0453758a984700097044fe48c61f1873e5a3274c7d5cc7d68b392e26007a534cbec0167760adc5f8b5fea3e2e949e963fbff9ed89e844a3ff2e145d7b4b1193f724aa014 -Result = F - -Digest = SHA512 -Key = 3082018b0282018100dc09c7fdce01962419294bb4e9c7896347d9bbfffab1d7f35b2e36671d7766a4a4a6b16e8bc12adba6503d4d967efe51e89be652d42b8e7b1b12c0ab34d00997b72a5ab3859bd7d414c72e2997521384fc0ce01f2488f443f1afeb043b14099b3b1efb0154020ff10c50eab077e534270cee6e95fd9352c2f70350c0103a252fd041f9583b67bd92d5d712c21d6036834392b72e622fc0f3d3e1d1c09d512fc6486e7f5465999dffa16e2c5e3fa25267d8f52dd639c84af6bbbb76afecba35b8775ff1cad59e8280d73cb3fbbdc084a60429f7dd9bbe9198d2c8351c27c4ab61ab68d54e9222ebd9177550439a5b5b9ae13c49467aefc41afe435f0dfdaef913238a1f6ecf4692167c19357a2625b06942a5c5856100a6c9d66fb4ee37173fca4ff9298d4d4ba558aac53a75f14be641b1701550fc2a1e2cb4b2c734d29b266cde310888397ac19667fc577422c90a897c3b2e65ed62cac471595b18bb124501a663b093d1161d697f9df6bdb151bc9608534a25f983b14117505040fb481d53020400a1befd -Msg = 4ebfb0c3c540ba37f357cf30a2bc9155305d091f7db0a3d608477abc54a5d6889150f3157827055c77f678a00e487ce8797cc1b28f1b7fe6ea69ba09483ac4b331070343da41f4d14ae57064bb512f6543568a54b38e85bac0f00c5f60a17dbc770d67b3b337927eb44d3fe67180b0b5d713eb6db3b1bc3ad103f9266582098c -Sig = 6c640306e33515434ee5723d46bce72dcb4c5716311c9ad1d0182987a3090c1b4de97bf8c7323cef9f7d36fc0cc929b2bac1e7f6b1456409f51656b9ac3b9290fdf7910f28a2d0f72e56c94b1d1e5a76daa35e62c93e373b6c6b4435dc1394e131af3c0658e41dff438208bf6b159bc54f5dea67d04e0f794a251256f915e8f9770815c8d89ba123e0c057bf5286e95f017e65492904975b7d493286a634fbf3163a18adab3caaea230c2766deaf36243a37085377f3db5f091cfc707805cb8a9999a06eb3b931bbce312bb2ff53230fcb0c920a816164afbe947ef666617e39ac521db2156631b0f1ca24daee37a521e938be66d36a8819d2c648db87914cb7c7db43ce885d1db4b58b99b3c0a35af19c9cc4e0af21db9d133cf7a2699429fd06faeb3365e18cfe8d14295584167ce708a047b2eb3ab1c25bd1089c4fa5f9ace5ea02a8e7a5f170c398940270405eb6fd2382733247f4c3faca94b368d9e104668854bd3b3db5a5c8e9f63e5547da813ac8ae5b020013280287832703af91d6 -Result = P - -Digest = SHA512 -Key = 3082018b0282018100dc09c7fdce01962419294bb4e9c7896347d9bbfffab1d7f35b2e36671d7766a4a4a6b16e8bc12adba6503d4d967efe51e89be652d42b8e7b1b12c0ab34d00997b72a5ab3859bd7d414c72e2997521384fc0ce01f2488f443f1afeb043b14099b3b1efb0154020ff10c50eab077e534270cee6e95fd9352c2f70350c0103a252fd041f9583b67bd92d5d712c21d6036834392b72e622fc0f3d3e1d1c09d512fc6486e7f5465999dffa16e2c5e3fa25267d8f52dd639c84af6bbbb76afecba35b8775ff1cad59e8280d73cb3fbbdc084a60429f7dd9bbe9198d2c8351c27c4ab61ab68d54e9222ebd9177550439a5b5b9ae13c49467aefc41afe435f0dfdaef913238a1f6ecf4692167c19357a2625b06942a5c5856100a6c9d66fb4ee37173fca4ff9298d4d4ba558aac53a75f14be641b1701550fc2a1e2cb4b2c734d29b266cde310888397ac19667fc577422c90a897c3b2e65ed62cac471595b18bb124501a663b093d1161d697f9df6bdb151bc9608534a25f983b14117505040fb481d53020400a1befd -Msg = 6739c2996ed518592cde7619a0a5f361c09c51c36a738c189d80af0ce964ebdd24ecea5f5f3561441814e59ab2b4ff952281828fea451c4d4b912c84b65fd39b85f54eb3e80d83e52232d9caf56d4d415a21c36c763499fcca6f82afaa289216f01e959cf1a4a5c4b002fcb2521806edd244ba63f6862bae82e25a95ab064fd6 -Sig = bd4e9adfdf12d10d9de2d3c1d5324cd2048a57e0cac12ec5cc054f2f4c974b5c5dc3e8aca34a2a7d2907d3b930faaeb194f84fb6a9e99a2a7762346545f70bc384181b0213767f2a7381565cf4a17f3fd52c0d107b12d964605b576f2779411c38129a99300c902c28336ca76920b6c8e52e1c366fe92afe8c7c0ad93f38c07a9fd83926c1e634e026dbe67ae1f3df76a9bf6c75ecf6ecd660e68b0bb571028504bf233443e238aa573727713d659bc1d15171baed4d962017ab5689ef894802a65b4d522bf3b377aa2d3a42b718c8c7f205cd4c9c4d12f4fb2657bab0460c22737a5ee6524e96430493610178f19eb3750cb56f27e6088d26424ae13e863f410c7505899705168015e14ee1c5a1d4112b097f1e0f9dae32f64b75e82558f8f41bae65ab7cbfc400cbc1fd45601b53d26abe2f53a6ac660a7e940584e7fa90a0b8c4d906c46c4bb3a6eeed2327ac4409fd28b77b24c98e5c5f14a8e3678f965c46b455b02d7d0d58f24daf5f7b03362554d6809da7a90a3da53d81148eacea68 -Result = F - -Digest = SHA1 -Key = 3082018a0282018100d7a6b5b175afa3bb18fffeaee645a096d8ff28cf96e13dce6d753d3eef4c0cf605dd06f0d25d208da216eba09b3e7e59b304210e63118c5fbc3185f1b845d18bdbf113c4d65ad2880bb2a5eb5b4e7210df30296a4ed6cbc637595318e72e2a6439e4d244d63defad0d2a7d5c06518b0981fef4c916c533f3495c098b40254724fc5a44b0f1d23c3a275466100eb39de3dff6dd48e8322ac2251f3b1f09ae8e6a6136645acbf358e7baa89bc515a12e78cf0f6c9e257b816be1e7a3098b9c1d3b47a4c955b390dc576cca2f9b391b61af5e0eeba21addbe728c58eceb8e018573962ae069f91c538e3161e5765db7e15b352ba3978edbab3071104353d122024e1f3e31f6337dddaae90a2a646074b5691b95b7d82429192c897598a00d67639c326922407002d49432b3cdf84c095c021c4dbe53f7fbe80a497f75991d195122fdb672c67fc973626583202c8230a506f251600ab46435acf51ef6461bd55d0c14a76bb4f1c0b7e3c1affdf21dc8e514c2e8732779e62c3f1fd8626c4b80c68302032fda05 -Msg = 711cb316a158e229d3c4d2f5d6c7e5aa29b4ade40e95a188df2715eea5256946e7c98034c09173be343f8768c4235d9d409c6951dddda5e588ed874b79f1306a0aaee6c4ca4ac456cd52b0bf47028ea559c0b3552be99da93bd0e12ff504648783d2ce0de60b3cb94608364386eae08a1c2674362042ef9ca2d90be341e56e65 -Sig = d3c03e8891632b8fd169dbd4ef4a51f207ef89b50dffbc23fa2d941491d8e185f3c743684677df40b18b0d8cc712ae61a3027ad5be4725d6a8e7b242b2139494bbc5c59a0122b26e0f9afb8df76db8dfdce8e9d2c38818bb0140a41f9060bf23e6ae364220eb56e3a62eaf966873c14dd82bec57876d43d1e07197da109fc009ab8b45e48ddb7cb1ff34ef3fdb3f4226eea8597c5c59ac573d15183489ee52db3af1c13feddc9357722978e4172a3bb26bf2b2b537f121295c00151e1629e28cbddd7957a595cf5effa365dba30698d8049d4701a4dcf03e9bf53e4ad449a7aed4abb6cf65ebd33cbf763fef760c1fe178f5d748fe37292cef145d61cee1dc02bf1655516a5de3168dfbbf4136e6351d3b8313ece067edbe34b1678ea34387636506192384489556efbd133a9912d51780d7fed8662ced97a6dd49e423da4b0019fac0b83e96862eb302910284ff2eb190ac61dd2159ee24e0b233eb38d383b4ff6633bdba58d85cb81abccb072ad716eda8b33b6c8ea9de43e8bc184f1882b9 -Result = F - -Digest = SHA1 -Key = 3082018a0282018100d7a6b5b175afa3bb18fffeaee645a096d8ff28cf96e13dce6d753d3eef4c0cf605dd06f0d25d208da216eba09b3e7e59b304210e63118c5fbc3185f1b845d18bdbf113c4d65ad2880bb2a5eb5b4e7210df30296a4ed6cbc637595318e72e2a6439e4d244d63defad0d2a7d5c06518b0981fef4c916c533f3495c098b40254724fc5a44b0f1d23c3a275466100eb39de3dff6dd48e8322ac2251f3b1f09ae8e6a6136645acbf358e7baa89bc515a12e78cf0f6c9e257b816be1e7a3098b9c1d3b47a4c955b390dc576cca2f9b391b61af5e0eeba21addbe728c58eceb8e018573962ae069f91c538e3161e5765db7e15b352ba3978edbab3071104353d122024e1f3e31f6337dddaae90a2a646074b5691b95b7d82429192c897598a00d67639c326922407002d49432b3cdf84c095c021c4dbe53f7fbe80a497f75991d195122fdb672c67fc973626583202c8230a506f251600ab46435acf51ef6461bd55d0c14a76bb4f1c0b7e3c1affdf21dc8e514c2e8732779e62c3f1fd8626c4b80c68302032fda05 -Msg = 1b51ee87dd2a4715ad8de13b9dd8f46243d37bae04e392d39380232ab4e8c1044615d43e80edf7157bba9e3cf0d9fc2c44b624bcc1f86ef127f81c1763783d109e92d2ed79ee30bb9738a59f5dd15e26f5c588d699feb6090eb783fb6e3378212bae30bc5194b9af0bf13e8d6928e3f760e9f125135d33c250a3a0fd5e8039dd -Sig = 397e6e6a04b3fcb3f0379fe1f9b9e5cf5c6d433e383b688cced0a6ddebc740b8ec0266aa5c7e89d5ca77c9a020716dbce12dc044c00b3b1b23fe3419630bbd8bde5c9883a6d26232fee11a81ced86ccb338dfe46faa3fd58720b80f305d40f1966c268c56d92af05c4f1bf66e6d1c5c810fedff5b316f3b61089c8ab9a4f2b4d7a46bab1868008ff3c0bba9800634c5781cfd7711a9b51f41b517ea428a9b63eb36609c763cef555df2cfcd25e16b8b3c631fcc12ed78904111188908a21253544a8f9fb0615570b3f2453a3214ecfdbf44f403d1baf0fba84d17527e7cc23e15cfe047f4fffd89bbfecae01cd3ebec787c3dc54d9511af93a3b37924ef9d6d5fc6e147dd9e91a39bfe101e3e55004f096b9b889e95b4f1fcd561ea76ee6b19276e8a26aa3aa3eda99de7ee48ad1b1c907cc302e909e89f5e3dce32657ebcdeef78722b7ac95a87930facd56e9cc976b501edda38b663d98c9993b0139032dc95fdbe4a17a9eb0e82c40402365fb84c1195b039246cd424233c88fef251ff77c -Result = F - -Digest = SHA1 -Key = 3082018a0282018100d7a6b5b175afa3bb18fffeaee645a096d8ff28cf96e13dce6d753d3eef4c0cf605dd06f0d25d208da216eba09b3e7e59b304210e63118c5fbc3185f1b845d18bdbf113c4d65ad2880bb2a5eb5b4e7210df30296a4ed6cbc637595318e72e2a6439e4d244d63defad0d2a7d5c06518b0981fef4c916c533f3495c098b40254724fc5a44b0f1d23c3a275466100eb39de3dff6dd48e8322ac2251f3b1f09ae8e6a6136645acbf358e7baa89bc515a12e78cf0f6c9e257b816be1e7a3098b9c1d3b47a4c955b390dc576cca2f9b391b61af5e0eeba21addbe728c58eceb8e018573962ae069f91c538e3161e5765db7e15b352ba3978edbab3071104353d122024e1f3e31f6337dddaae90a2a646074b5691b95b7d82429192c897598a00d67639c326922407002d49432b3cdf84c095c021c4dbe53f7fbe80a497f75991d195122fdb672c67fc973626583202c8230a506f251600ab46435acf51ef6461bd55d0c14a76bb4f1c0b7e3c1affdf21dc8e514c2e8732779e62c3f1fd8626c4b80c68302036ce901 -Msg = 45d9c631cf0813fe85c7715860bc3a3b38f2a41a8688a12e6ea6030dfdb5e47eafd0458c3475f5d97381b535d05b996faa6fb16b28dee97536732ed5cadad2a46c0c32def50e96b897db58331d9f49f1742550476b935495b7555cd23a57f56b8577d54e9b3abd41f7bda479d1ef11689efec9d6d60faa33f932d72cd495157c -Sig = c7958952aae21c256809e83d7f1833e9819d3b4e4cf562ec71bc0effe7a797d62e71d1937a79361d1cdc9cd5726207daaa9def6249a0fd3da6a23683fc8b084871325e07223a3317868efdad20f52a0330f369a0ba51f0fc098afde7d2b72b7f2faab6782cb663c4701fc07bd82fa6d4ea77205a7ee8473a9c8336a781fb64c03632c52e6c1451c3ace7674d5fc9f26e8613c12137977511484487d9a8b928666bbe23cf0eefc849d9e0d0c125cc2ac42f342cb658d164ae57ab3d5606b8096fd4b4c81d54c9db79c5db70106cc474bc64ca73b713385dd9539329260899054bf6f74a45fd5363f78de558484a124a113ac2d2bc6fb8ed19730dc746748b62818e6e62f558d5d9fcbd2c6f4fcc70db6c7fc5c22524a89f04229def949379074e7220cb4717d6407364062095b615464e9ce9c50f53c4358d9f80ffbfe70c15cfd2d9d5f0b451979412f3cdc8f9619e189bf23e71116eb3c620c8f0740b890bfbe961f6cf8854ac6b2dc4fbfd62b6be3bfd1824070cd46b1002b61c1e572437af -Result = F - -Digest = SHA1 -Key = 3082018a0282018100d7a6b5b175afa3bb18fffeaee645a096d8ff28cf96e13dce6d753d3eef4c0cf605dd06f0d25d208da216eba09b3e7e59b304210e63118c5fbc3185f1b845d18bdbf113c4d65ad2880bb2a5eb5b4e7210df30296a4ed6cbc637595318e72e2a6439e4d244d63defad0d2a7d5c06518b0981fef4c916c533f3495c098b40254724fc5a44b0f1d23c3a275466100eb39de3dff6dd48e8322ac2251f3b1f09ae8e6a6136645acbf358e7baa89bc515a12e78cf0f6c9e257b816be1e7a3098b9c1d3b47a4c955b390dc576cca2f9b391b61af5e0eeba21addbe728c58eceb8e018573962ae069f91c538e3161e5765db7e15b352ba3978edbab3071104353d122024e1f3e31f6337dddaae90a2a646074b5691b95b7d82429192c897598a00d67639c326922407002d49432b3cdf84c095c021c4dbe53f7fbe80a497f75991d195122fdb672c67fc973626583202c8230a506f251600ab46435acf51ef6461bd55d0c14a76bb4f1c0b7e3c1affdf21dc8e514c2e8732779e62c3f1fd8626c4b80c68302032fda05 -Msg = c58629fdf3aaed600121e5a109ec1f62b360ab46abcbaeb1535ab2d0b53a40dabbfeb195a241411bac8c65de157a5fea49190f6a54940c6e9a0ff3ebc8d3ff030aabda877f8db3bbea7d9159aaafe7d8ecec68ed1f361c53a8afb4c8d7b71b581a554ddd71d86cc722be1119aed4e0b4039f5fd8f3fb08e8e5029c6dcb2fbb5e -Sig = 40ea4940619e7611473537ef5b108f9e1216e2ab9bb7fd45cfffe15e70621af6590eb571f9be970d30e5df0dbe527b9a9ea70e259b964e496735177d417de3291d16e0b055cc9b8f4dd5498bb7a78d8882bfba624580d81ff0b76f6a82f9a15d2c28cbeaa0e6c02807901838500e36cb403acadd6e431196c794c0bbae65fa6b7ef2ab4c58c0fc7f3d27bbc14dd7699d7b0fc42a3dd30504f7c7e71d8504c23fe08a05e76c8061337687241d27a0ba2411619d2befd66a00d894f302bbdc4f3ae7a562307f21cc43c377b084d8521e2f3d27315b5c8b494b5178dab25fb3a8ade194cf3f909e9f29d888f15a75d26d427e7a17edf63f7f5dd814c67433ae7e15f668637579a3b1d59c73f153e094029e74b8966a9a4b72efe0d5d0e7d9c44c63de6d0dbf00e76d459c3ded35165eac8a76883ced93359c34fdfa94ba74bb58464770051537e9b71f16f615d5615a7b8d380b4bb9ec2499b255ec17131d2161d10709c357687728de9758cf5a166e81fbc086a2e20dae9b99c4f4f83c5edc0ad6 -Result = P - -Digest = SHA1 -Key = 3082018a0282018100d7a6b5b175afa3bb18fffeaee645a096d8ff28cf96e13dce6d753d3eef4c0cf605dd06f0d25d208da216eba09b3e7e59b304210e63118c5fbc3185f1b845d18bdbf113c4d65ad2880bb2a5eb5b4e7210df30296a4ed6cbc637595318e72e2a6439e4d244d63defad0d2a7d5c06518b0981fef4c916c533f3495c098b40254724fc5a44b0f1d23c3a275466100eb39de3dff6dd48e8322ac2251f3b1f09ae8e6a6136645acbf358e7baa89bc515a12e78cf0f6c9e257b816be1e7a3098b9c1d3b47a4c955b390dc576cca2f9b391b61af5e0eeba21addbe728c58eceb8e018573962ae069f91c538e3161e5765db7e15b352ba3978edbab3071104353d122024e1f3e31f6337dddaae90a2a646074b5691b95b7d82429192c897598a00d67639c326922407002d49432b3cdf84c095c021c4dbe53f7fbe80a497f75991d195122fdb672c67fc973626583202c8230a506f251600ab46435acf51ef6461bd55d0c14a76bb4f1c0b7e3c1affdf21dc8e514c2e8732779e62c3f1fd8626c4b80c68302032fda05 -Msg = f7653ea73a08384cd5dc0f14daf59160b94ee19eb76b83109f3db3cfb446fb0febfe04a45774adc6e5385a1149798ecf386bbd7ad8eb5b7d7566393b75f711528ecf602136da73885ba0c5ee5569888919a482d9af891a76e6feb30c46b738a446a2f825bf82b51aa1d9f7b5e50ca614c2c2d8c4248de8845accc84b0ed0988c -Sig = 4ba672add725521df81acde1e1efd18d169ce4e04cb55d39fdb2c6598250e0c7953867dbe189c327f76bb6afeac0e013853e75829eb50635622c26667d55cf3bf81bcbbb94e5c0fffbd853e2d7d536659b1ca9105b777d6fdacf3000c7c287e484933d38e2c52b301e01a3fd196b4960b4d8a983466ec376ec1d70bd26e1d4dc707a87ccb32a4e12f56d00d1a8f9dc20794a59a437e93fe5c79a1ecd16dbc0191589b14c30e5187e626a0038b6f2396bb30c9b4c73a5b21db2128ffe67c6bcf81b0ccbc68a6fafb94296e334cbd28603a4f44da05a4c5d243e30160cd44f08aaaef7135632dd50830010bcf4b5282cc55e070478e51bdc87ed68534b8133876222986d525ec26624ad87e4a6910c6e3caac92e32e2fbf0945f8f1b201de5ef522aa4e84e06633ff3c092f8f095783da7f929013844458e3978f5e7679b633152a94880b6ccb064e5093a126ccd0435381908df6b4c84e47875edf323742429b7428bccdd889d602085d6b40ac2c05c705a91b41a9081586439cd178edfe7f909 -Result = F - -Digest = SHA1 -Key = 3082018a0282018100d7a6b5b175afa3bb18fffeaee645a096d8ff28cf96e13dce6d753d3eef4c0cf605dd06f0d25d208da216eba09b3e7e59b304210e63118c5fbc3185f1b845d18bdbf113c4d65ad2880bb2a5eb5b4e7210df30296a4ed6cbc637595318e72e2a6439e4d244d63defad0d2a7d5c06518b0981fef4c916c533f3495c098b40254724fc5a44b0f1d23c3a275466100eb39de3dff6dd48e8322ac2251f3b1f09ae8e6a6136645acbf358e7baa89bc515a12e78cf0f6c9e257b816be1e7a3098b9c1d3b47a4c955b390dc576cca2f9b391b61af5e0eeba21addbe728c58eceb8e018573962ae069f91c538e3161e5765db7e15b352ba3978edbab3071104353d122024e1f3e31f6337dddaae90a2a646074b5691b95b7d82429192c897598a00d67639c326922407002d49432b3cdf84c095c021c4dbe53f7fbe80a497f75991d195122fdb672c67fc973626583202c8230a506f251600ab46435acf51ef6461bd55d0c14a76bb4f1c0b7e3c1affdf21dc8e514c2e8732779e62c3f1fd8626c4b80c68302032fda05 -Msg = 0ad50e46eb42d8f201ee505c91168bd00494cc1945b402f86b4491ce98ea559c20bbe42dee081492247bbecf0263c1d4094d49af60d451ff76ba66ace937aed5a7902a0a53ec38bcea645cf1a6593f3c220af8edc0658b85481eaf6dd1ffd5e7e57f6544e0954b5899ceb22b449e0ff197f3623c2c10b9712799f57818ead0b8 -Sig = d4abfe9247a4fbd27668d0ed8473bb4d40eb5d5ccab3fa2dc7662d52dd613c12335fd0f13bc99c34d6966aeae422a7e3c9a2389d80480c9120eeabacb884ddb2906ea80511641747229e0a07c2ca082b354a0a52debfb93e1ffa19787134c8d7b8f81c0a07be5cf421fbcbca0084ae5b2410771f06c4bca56a920139ee50009ef879631609f0478b21e6548446752ff85905d0c5a80414afe6021a3ab737f061134f8fb390b030b1e6a1a016b8ec34b0cf3b38cd1b023ee7dd6840d459ff83fb2c6b703abf646478fdd64cf0347b9b55c78f2c731cf7b0242de2a6f247932a5cfe1391d7d19480a7945a105e3088c3ac5b72c8e422991b0b36e3ecad0904fdcb42a64271840dcdb1625760361ce81f4f68bab447390b691bc63829f60af23a77edc2cf97c071f58cf8a7c414ce5fdbfa7a6725203cd54c3386c4c85cdf17f770aea7e79de4d8368fc68b6f6c024bdb4ef9c346e0d78494f7134b0e9c651540dd2cf8edb5812a5f8d9943622fac67d5ad8fecef405bcfb16ec1fbecef8bc1c787 -Result = F - -Digest = SHA256 -Key = 3082018b02820181008c4b17ab9a0da366f67416075ce284ff69a2c1112a8b7d821f66e8bc5386cd1abfe499fb9a09523f1095729f61433cc17fed78789cde81145ba02d22ddb560332ec795ea6a764b9fb380f44ac63d64225772aa4503df2fdd20e7c1d17115d3c56176f49432b2930d417b84f997ed4e50cd557e2786e0275be8025f6f039a7a3b8ed421b4c224527c01c1a1bef6becda193eac7f484ab0a24da31d4bc8bb6f2d4a5f3817a246bd5a9c81dfbf55e8c5b18a8a63bebdcd245726ba5b6ed4f8981ab83933c00714064985d69a17ed017e3cfd7fd5d2c6e932a2e021d226013126e6272231ce8bf626121710cd19d0ff21227e4c4255be507809aeb0aa548f42749bae8e1a3e3b312d08f0226c5245c45b5d96eb8eaecd1b8a1dd3f9f908191325a02cb4ca57b25155447584749e2db23360233d9068195daebb7ca943311b58dedc6c809a5981ff1b66a803a4135fbddf1f4f2478559f9d2ba17d2da77b0f0b6b08662eb50495a16c301759cbf7281f4fa985800c14386e0db6df0422bbda9a26441020400e5a4b3 -Msg = 897bd083c89256d56a247c12e265f3390962eace1cef2f7504e197bfdb7ea144ab3256f2798473a48247caf6c415e658c0f9ee627f6ccb68d3838d4ddf660b9cd904cad40f05210428009a98adef9a73c8e0453e4bed9cfff36de8edef6c5c839c59f6d393ffa61de5b7b2a0a5db59b0a77db7098859e863ee0970461178da20 -Sig = 7a172ef111b0f2f9ec43bad8f6e8fa11e19222ed9575571716e55fe46b43aacee433447632849e0f486744054e70bdd98863f5f015b94ddd1571e64f6b9a26302e151d4865423791d596063bfad7e3b5c5494f4a3c5ed994c53b6d915824a1f1e8e3639f8873f9095a7842d88817a93bc2651e6ba94acce93830735654fcb5a4a01cccc090ede15ff5ed745a92d92d8186a746a693a94db4fae34db26c6ad0b4904c63001600947ee994e24da490a3de240e500b31b8be8b1b415599aa684c77116f12e3cb218cf388424e3276b1a3622f1c4115125f5af47d581b78b609a067ef5f33549fadbdadd098dd2c337897f113c8eca9a20f3da69aee2fe4a89bd3ff73eb4e8da271065a9013935731addb3480f52d07fb3a91261d8a030ee2cd9e0ab342b3bd62db62e359475ee9a36971ba37f5c3ae1f1939c276980140961e9542be9e0a4739fce668549fb606ae18774bbe62b20148dee0379f0f38fe982b25bae164785d3410c337b2f11ea74558d79991760847109dc0c77272a55afb0d3f58 -Result = F - -Digest = SHA256 -Key = 3082018b02820181008c4b17ab9a0da366f67416075ce284ff69a2c1112a8b7d821f66e8bc5386cd1abfe499fb9a09523f1095729f61433cc17fed78789cde81145ba02d22ddb560332ec795ea6a764b9fb380f44ac63d64225772aa4503df2fdd20e7c1d17115d3c56176f49432b2930d417b84f997ed4e50cd557e2786e0275be8025f6f039a7a3b8ed421b4c224527c01c1a1bef6becda193eac7f484ab0a24da31d4bc8bb6f2d4a5f3817a246bd5a9c81dfbf55e8c5b18a8a63bebdcd245726ba5b6ed4f8981ab83933c00714064985d69a17ed017e3cfd7fd5d2c6e932a2e021d226013126e6272231ce8bf626121710cd19d0ff21227e4c4255be507809aeb0aa548f42749bae8e1a3e3b312d08f0226c5245c45b5d96eb8eaecd1b8a1dd3f9f908191325a02cb4ca57b25155447584749e2db23360233d9068195daebb7ca943311b58dedc6c809a5981ff1b66a803a4135fbddf1f4f2478559f9d2ba17d2da77b0f0b6b08662eb50495a16c301759cbf7281f4fa985800c14386e0db6df0422bbda9a26441020400e5a4b3 -Msg = 77ba90225f3ba1722312f52b1a07c3f659aee2a085e939c3e5ae77a3bb0a0456d56637285f0ac93dfbdf89781479529c6e543ab1025e0daa0ab6fa4458b48b31eb29db76c4e80312f685d5e0fd5ccdbe50d544ef3ae7e7bee5db6864b853732ce28ae4d537dd37383c8b3f2b7db91ba427b96722d28baf489fa429cb83efa38f -Sig = 1f442887263f403f6ff9b20fd2780937596e99e3c9e640def7de2006f14026de1e140e0cd5d45d7fcb1f42a9127a661c87cbaa4f9b600d8ad7fde5beed5c125294ad7b211d550bc35429c71f84a837eca906a580aaf3e301b46deb59ebfa4b66323f6e136d178f7ecd8440d891eeed5c91ed785ffefcc725f2792868e296a8eb03c5683ce791b554636a787d579e3db81177b45aee1ac6bbd90d84144a706196d557b48d7fa8b551c3bf638ce93a6425eac03232256f4cca758ab2c427d996702b522eca24b0781f33aa2b61e1256fdb94b166f98cacea3d5da205f818d19b432d50309d8265eef151b0f40fceba927fd6b5ec9d1c2ba54eb9af22aa354299ffad07da5071a1fb4314c69399a5aa16c3b4ff3b61937debf6e55b5f44e91855ff0a64ab59f549c3b4dcbad5c4306b08be4b1be99d000ea52665e9bd1983fbfaecb15ba18adb3e88bb9429d6d1aa85f7f6304c253692ea0ae579123703f9d89f69669fdd4c12607d8c1b7a28f814e75a45122956c21cae47bba9e4ec1afb707e5f -Result = P - -Digest = SHA256 -Key = 3082018b02820181008c4b17ab9a0da366f67416075ce284ff69a2c1112a8b7d821f66e8bc5386cd1abfe499fb9a09523f1095729f61433cc17fed78789cde81145ba02d22ddb560332ec795ea6a764b9fb380f44ac63d64225772aa4503df2fdd20e7c1d17115d3c56176f49432b2930d417b84f997ed4e50cd557e2786e0275be8025f6f039a7a3b8ed421b4c224527c01c1a1bef6becda193eac7f484ab0a24da31d4bc8bb6f2d4a5f3817a246bd5a9c81dfbf55e8c5b18a8a63bebdcd245726ba5b6ed4f8981ab83933c00714064985d69a17ed017e3cfd7fd5d2c6e932a2e021d226013126e6272231ce8bf626121710cd19d0ff21227e4c4255be507809aeb0aa548f42749bae8e1a3e3b312d08f0226c5245c45b5d96eb8eaecd1b8a1dd3f9f908191325a02cb4ca57b25155447584749e2db23360233d9068195daebb7ca943311b58dedc6c809a5981ff1b66a803a4135fbddf1f4f2478559f9d2ba17d2da77b0f0b6b08662eb50495a16c301759cbf7281f4fa985800c14386e0db6df0422bbda9a26441020400c15efd -Msg = 34a83157520e0413bc2ec4b48034fe5cc3fd2f69fb7992f95e5437ad99d555aec606e1ee98155fb1d9faf94b175ace2b9aab8c18999a41bbada96e5e851d5ef3dc17b558a8014cd9942b3cf7b1b6396768b2225eb483d50c8e894866a800d6295d24d61ce8997295d50bb73eb612e819175818c2b4fdf7f5e93aed4f69456559 -Sig = 7a1699fcecfd4d337bcc6f4904d2356fff44aa24fd4a0324945d4a4dd9a9a552c59239dc9268783067477dade944adf592495a3b1e5a6eea7f58762ec4d5b0f3515f3b1eaab1273476cb0cc3080fa8c7d2f2695f4417a6dc538b8b2c58bfb248b7c41485aeb668a0a39ffa324f25074c75c0ae1c70496a4a37c9332fd73ced1d2fe561ae120c6c19d1e526c211ce8869ce236d06a9dab8f9ef453f8854cb4451033960a62fe279830667845edd5883734e730e50e7bae3bbcc619e5c4211ebf741ad2526bf0226440b7d076faa02a30f2c79132443de9fe9e6bfc12c65d1ee703ea274c06ffd5cf945413cfe13d1ec63d48ea477ba8c60a7aacc078b988cdb58691911975f26e1b33c2c0ff3e5026d9b1d7a6293eb330ad5513efd19937193b796c40114dd1ff32a2875963020f26177ca1b6a7d0c6a40a6c0be44b03555c0f4598f91600a336c73099fab278271c46d96f16d6882c00d5b3ba59f2a0bcb98f39b152c55eaee62a4eba026234f15963d7e7395de927e94893a8a175c65f0dd43 -Result = F - -Digest = SHA256 -Key = 3082018b02820181008c4b17ab9a0da366f67416075ce284ff69a2c1112a8b7d821f66e8bc5386cd1abfe499fb9a09523f1095729f61433cc17fed78789cde81145ba02d22ddb560332ec795ea6a764b9fb380f44ac63d64225772aa4503df2fdd20e7c1d17115d3c56176f49432b2930d417b84f997ed4e50cd557e2786e0275be8025f6f039a7a3b8ed421b4c224527c01c1a1bef6becda193eac7f484ab0a24da31d4bc8bb6f2d4a5f3817a246bd5a9c81dfbf55e8c5b18a8a63bebdcd245726ba5b6ed4f8981ab83933c00714064985d69a17ed017e3cfd7fd5d2c6e932a2e021d226013126e6272231ce8bf626121710cd19d0ff21227e4c4255be507809aeb0aa548f42749bae8e1a3e3b312d08f0226c5245c45b5d96eb8eaecd1b8a1dd3f9f908191325a02cb4ca57b25155447584749e2db23360233d9068195daebb7ca943311b58dedc6c809a5981ff1b66a803a4135fbddf1f4f2478559f9d2ba17d2da77b0f0b6b08662eb50495a16c301759cbf7281f4fa985800c14386e0db6df0422bbda9a26441020400e5a4b3 -Msg = 72e970c5fbeccfb254bb1313e33470e3074dd8d3fc60093fffc7c960b2a970c3c113a8fac64b71916a616844cd06486e29a1b1c5b2a02845c00c606a2f61b7a2069c040258959038688f62c1100ec05c64e9f2be929f49870dee6075eaa2a2d78aac0c457973348f966f8bf374f3df93014a2426650673ed2d9553e8a915384b -Sig = 6ce37157a92a7eda47c16b5b2d961c564ef7df9d5886043c07abbd1e74ec7f549c78b07e2140207e6b93e89ae69a74a5a76184e00ec03f1dd36c0699535e0bedb4f28634b194fcebe13d2c4955e01e4ef459244a7497fd647d5e6dd5f7ec156929d0e2f1e146d3397d3636726bbea13b38d7d38d4a5e4ebe68df7ff86c62c3802e18250a2cab3d200363c577895a33dc69c18d15309e7117ebf47b3b98c893785c99dd0077982ee084b4ac08913de46415e5abdbd223aca6ac5574ff4a61f5fd7631b776113f12044e5e53960a5af3867c8366e3367a20de73e6c4e0f7b9075a1a79374aee0232d06280c53bc6a148026e1686059d652d96c99ac41f909e278b3c408568adfe35cc55800caa58d03ce9f1cf533018ec4fcb5d66a50758229716c2abebe4b3e3c6ac778fc008db8985e5032d7825fa333fa4d7468504cd0785000f92833d5cdd61880bf40f803ac298343d75e18c003a8471e06449406bf1bafd988e162b0b8c62eee5795d957f1fe5d7abc6e7c8b3b43759f212d01def9151dc -Result = F - -Digest = SHA256 -Key = 3082018b02820181008c4b17ab9a0da366f67416075ce284ff69a2c1112a8b7d821f66e8bc5386cd1abfe499fb9a09523f1095729f61433cc17fed78789cde81145ba02d22ddb560332ec795ea6a764b9fb380f44ac63d64225772aa4503df2fdd20e7c1d17115d3c56176f49432b2930d417b84f997ed4e50cd557e2786e0275be8025f6f039a7a3b8ed421b4c224527c01c1a1bef6becda193eac7f484ab0a24da31d4bc8bb6f2d4a5f3817a246bd5a9c81dfbf55e8c5b18a8a63bebdcd245726ba5b6ed4f8981ab83933c00714064985d69a17ed017e3cfd7fd5d2c6e932a2e021d226013126e6272231ce8bf626121710cd19d0ff21227e4c4255be507809aeb0aa548f42749bae8e1a3e3b312d08f0226c5245c45b5d96eb8eaecd1b8a1dd3f9f908191325a02cb4ca57b25155447584749e2db23360233d9068195daebb7ca943311b58dedc6c809a5981ff1b66a803a4135fbddf1f4f2478559f9d2ba17d2da77b0f0b6b08662eb50495a16c301759cbf7281f4fa985800c14386e0db6df0422bbda9a26441020400e5a4b3 -Msg = 6147121ced1b5f1d73306e4a22c31669b76c20764fa4b4467d86126a9ad283565c378ec3aad26e51aff2c4712e1e8a821559483a54a48a48efc5913752474996e6c27b56e15c44736290c6d7bd2e1d7b13a394cf277b195c6c24efa763f5a359236e419e39c2c7cbb392da4378fcb89bdbd46efc6f314bc91c2c948272e479e9 -Sig = 8b5320215e2133754a182f38444a68fe9f3cfdbb7ea9d8e55d006789fb1d75c0fbe5e94201b15c97613a35c3ab54d61dcc62b978a8fab0ae3183fb7463814ec498eb0f4b0f5403044f33368afcf692b1b3ee3ef0ec1492c5c2ec370d75163b777705a0675252908bff8010e819bbde67b86b33a35e1fc43cb8da167691b6d69ecc19ae094a5461cadb0e977ea6b7ef6f3f639e4571a073d6033cf464e5eb17323447ac079e4e69caa7966d3083ecf616394fa25d2e30ef4e5b7e558c8c46802c2e35db02b7884b53b89f041037bf10ff30f291003323112dcc6b8eeebde3bf97e373305eab433061e3a634df865642743908ef822df62cedde8f4af403e7a924e22e667734e91a29d4b6c8f1c12da7023a1b22e6a3dd33e878efbab31220f4f2c923c88f1bb0d7b7497a9c687fbf59f9eb4625e6f92d7285bca5db93ae63213e3fe1333801fc3eca1d3a1ffa75319752a5aaac461d7a799659ad31569230266c1a62e787c25fa635b0d3aa248d047d9cee43fb12342a4c066dc971b893a7dbcf -Result = F - -Digest = SHA256 -Key = 3082018b02820181008c4b17ab9a0da366f67416075ce284ff69a2c1112a8b7d821f66e8bc5386cd1abfe499fb9a09523f1095729f61433cc17fed78789cde81145ba02d22ddb560332ec795ea6a764b9fb380f44ac63d64225772aa4503df2fdd20e7c1d17115d3c56176f49432b2930d417b84f997ed4e50cd557e2786e0275be8025f6f039a7a3b8ed421b4c224527c01c1a1bef6becda193eac7f484ab0a24da31d4bc8bb6f2d4a5f3817a246bd5a9c81dfbf55e8c5b18a8a63bebdcd245726ba5b6ed4f8981ab83933c00714064985d69a17ed017e3cfd7fd5d2c6e932a2e021d226013126e6272231ce8bf626121710cd19d0ff21227e4c4255be507809aeb0aa548f42749bae8e1a3e3b312d08f0226c5245c45b5d96eb8eaecd1b8a1dd3f9f908191325a02cb4ca57b25155447584749e2db23360233d9068195daebb7ca943311b58dedc6c809a5981ff1b66a803a4135fbddf1f4f2478559f9d2ba17d2da77b0f0b6b08662eb50495a16c301759cbf7281f4fa985800c14386e0db6df0422bbda9a26441020400e5a4b3 -Msg = e9ba77e32581fb11b3d44a885ce8184207a00b5835016418cfe6e25921f4e30b26d1cd120691ac55dd711d11bec86a74f83af667972fdcab2e83d327d48055806d0900eb2b173c3f546a1e4f45788c76b7aaa27341c755771eb0567d314f39da46cad7159bfcf1f89f2516e7f9e0c671cc56d72539b218a726d535033e4ada40 -Sig = 17c273523709d84746ae546c8f58086a5ab385aade0707b5b39adbeb507670453a56bd356a9b549fb0112eb3be73466294c0180a9061b04128a001f62025867277e28508fd1c94109061184f6acac575737ec4f93c58ee452089e6714c4dd9f23833278dc66332a914ac8e1b0ec33472061bab9c29cd8d7a0c1778c71fb973c851b6c9bbb7b7dfd24a16f146eef248d1aa81e4f62cafce2ea146314b2a8d5711de6625011ee7ffe7ac49b03a5b7e2d842e9b35969a934c75d16b6cb890f8d4ebeb6f74a08059e70e90ee39816cab34c4702ccd4e14718a8ab5c981f9c8f7cb3e91bf066ba387824c1b27e33b27a06d9eb3ff3fcace0b285f51cf83b117005bcc12da946b5a36e9308ac98e9103becc8ec5dbb048df722e5c8e6cbeaad8f2e27af33648c9ce5d7940013146f5d3cb8c30849ea75b209c36b745dc3179617933e22dc25af5169f784d6128af2c8694b5caf19fbc0585ca1780181150e8f8bbd8d12ea8b0d41f86b1b3b27771b3f36d3cf5ac6a2702b8711d52edc1cc96ce071eab -Result = F - -Digest = SHA384 -Key = 3082018a0282018100c151ff0fed6cd9251edd8df49937283b4f4e67c3bad0826d46b6df2ca7657dda4f099714e70271d626ef41d2dd2a2d6e008b6193e7ff2bffe4207fff2b468b7a985ec684ff7364fbef587a1787c73840b1d0b5781d0428a6af38896de1e9eda5756af5545459e49e6ebf19d2a7be83ed4be2ab8d99e896a2d6338779e56ecb1fbdd1b79f813d0befa58d67aa8c935eec4b8f1c9895d225c8f0fbe7c960d5514bc78ee3c5af0d1bc8a81b1ea9b2caecfe37ac5d3fef9a0327ba7051f7996a901f2cadd1833d059d99e5bc2b512ffd5b090f80f0ec647f60c8756864b7f85d605fb391f614ea5f17a2766508e92092b3d8354572dfb947dc59f79d98ff945e9e3b83b3632464360fafc4cf2528b82836a685a29140abe524eea30b3bdfc1417959b46d933c4ec257d71696d74e89d7e024dfe20cbdebbb263fc586d22ee4b1fa688ee1ac92a9d7084e017ab4b1645158d4785ee8bb2f8eb54b5f70142ef19fe124269f0f83bb88720941d234269c2885a64b9f35118b900086d806b0013398404702030872bf -Msg = f17fc496ee707a1bad8d591e059c1e37bf99e6df03594431116d91ed324983c2eda601cd7d24365d8334e5f9f935fca467dd6b5f59db36f010bac9e278098dcd5ab9b8d7d3c6697b051af4890cae7a6e33f2beb6686f33cfeeaa5a10524c4af9a08190bdd69e3afd99062fd7274ec21f8d9f86ec1a5c63571305e97fa85ce5d1 -Sig = 3ae65cccca0d7e3ffe189b1631aaa79a70bcce76156782790bd3b6c8ef7585b15509ec5400ed771f8b8a41c001257bbed0dea39a3ec68bffc1395849d44e0f4b238c7305fbbb0c41b0ef7c4b86fccd363b057886f504f971d5a072713ddbcfe0cd6953c0b9aa7c01c651a89b5de9d689701fd09fc609f098f0e758932b186c10555cb48ab6c90b3954416cc50232b427595c4acb19ffcd97c806b23c504071fbcfd2a5ce6cbd097d56c5822ca788bbf6fe935c2caf33e8e69b77b35e6c6c077781999e146aefa448c839f9293c6ff5d7e3dd791f34ccf9ee5f358890b59a2c387bae4232267ec2f8d3cfa878f507184e3093b50ad891675cc564442d99edef75bb86fe908f15017da5d263fff9d50a0b1638d5770a3db54c2f957d52b9d6515da3eb893ded69b2d54732a1f433c78d97bfd63fbf9d2b2650c18a95a07f629a7f0505010a43dbdeebf765de8e0c85eedad07672bb6b627eb8488f8d172ca6f95aef2c3250d3d10ff10ec2c347a540827bb57913f710d47e31aeeefa42cbfc6015 -Result = P - -Digest = SHA384 -Key = 3082018a0282018100c151ff0fed6cd9251edd8df49937283b4f4e67c3bad0826d46b6df2ca7657dda4f099714e70271d626ef41d2dd2a2d6e008b6193e7ff2bffe4207fff2b468b7a985ec684ff7364fbef587a1787c73840b1d0b5781d0428a6af38896de1e9eda5756af5545459e49e6ebf19d2a7be83ed4be2ab8d99e896a2d6338779e56ecb1fbdd1b79f813d0befa58d67aa8c935eec4b8f1c9895d225c8f0fbe7c960d5514bc78ee3c5af0d1bc8a81b1ea9b2caecfe37ac5d3fef9a0327ba7051f7996a901f2cadd1833d059d99e5bc2b512ffd5b090f80f0ec647f60c8756864b7f85d605fb391f614ea5f17a2766508e92092b3d8354572dfb947dc59f79d98ff945e9e3b83b3632464360fafc4cf2528b82836a685a29140abe524eea30b3bdfc1417959b46d933c4ec257d71696d74e89d7e024dfe20cbdebbb263fc586d22ee4b1fa688ee1ac92a9d7084e017ab4b1645158d4785ee8bb2f8eb54b5f70142ef19fe124269f0f83bb88720941d234269c2885a64b9f35118b900086d806b0013398404702030872bf -Msg = 92394393057dddd26253cee4bcd5d9510b69da5821e95633e001569ca9d8768f17f23952ee559fb34eeafa912d27fd9d04eb1662c7a9fe831bc98e44c44bd44c5cae66aa4b10f615f39627782b0e9faeefd35d8955f14d1ac38a1a2c60794412c83472a304f70982b91ffda39fd4e80a35ea59d6b4096e7f410ca55c66a8ef68 -Sig = 5bf8ea11a6637f0258d7b66b9a77dfc1b7d278e6e3acffeeb06a044a2aeeb041e83feab36f27a7cc416c49cb1e086dbbafcc1411dd5b563e4731c72466015e781984434604c8f455b96714911330ed9eba40bc0fb2a38adde08db1035926225483ae62c3b90af042cc3f49a18906ee749ae6ec85e86a73e4d8a451ba77b4b11853dccb173ab2049fdcbfbf568445eb3ad539f4d4ac488cd2a13dad7d3e0dff3f92a6879a6ec7905711ab83f5825f7eeaf6a99a9c445b9edecee786a88d829f70366bcd382971649243643da2a87d339b3c6782d655a284a4f4869cbaf296453a2fc8a96dbd29a5d2298561dd6595f2c6a30f0c9e66fc926368759a0792c3110ebc9a9c90bbeb5c6fff1b66ca57ead5e556e98f69138ea792701c572402d0db36a1161c3f129832bb5db1f49b21e9476a02259243986e6437a437acc7eed412cf47ee2034474b5e4391815291abf07a2fb743a628a893e4cf43a3773dc7827aa5c0bbe083e4a59311f5e1d5e5c0e7704335b7d93b76d46acce9496fdb6ffa4fda -Result = F - -Digest = SHA384 -Key = 3082018a0282018100c151ff0fed6cd9251edd8df49937283b4f4e67c3bad0826d46b6df2ca7657dda4f099714e70271d626ef41d2dd2a2d6e008b6193e7ff2bffe4207fff2b468b7a985ec684ff7364fbef587a1787c73840b1d0b5781d0428a6af38896de1e9eda5756af5545459e49e6ebf19d2a7be83ed4be2ab8d99e896a2d6338779e56ecb1fbdd1b79f813d0befa58d67aa8c935eec4b8f1c9895d225c8f0fbe7c960d5514bc78ee3c5af0d1bc8a81b1ea9b2caecfe37ac5d3fef9a0327ba7051f7996a901f2cadd1833d059d99e5bc2b512ffd5b090f80f0ec647f60c8756864b7f85d605fb391f614ea5f17a2766508e92092b3d8354572dfb947dc59f79d98ff945e9e3b83b3632464360fafc4cf2528b82836a685a29140abe524eea30b3bdfc1417959b46d933c4ec257d71696d74e89d7e024dfe20cbdebbb263fc586d22ee4b1fa688ee1ac92a9d7084e017ab4b1645158d4785ee8bb2f8eb54b5f70142ef19fe124269f0f83bb88720941d234269c2885a64b9f35118b900086d806b0013398404702030872bf -Msg = f5304ceed3b78326d2020a99a63f697c40ec35dffe3ce53222bce1078336dc1a82d5648e408bb7790eb0d9a325ece38b98569eab86dd50fd94e8d6be9a39f3729d17e828feac45fff0acfee92f37c1aff001873613b06a00a085b6f5713f42642c3c014575e2d4c1613da2f42de9abf1303319060e7bd8422fdda8356f1071f7 -Sig = 3dbf093e71870bc6cf17f01719dd3bf09b5b128d3396eafa0b806611d5d5dea961c0c1678ac69bbb3139b0aef0ba6be387cee84b27f49422b7c9616b78f58892eb132b40e6f1dae7226306284fed9174df4c36cd0ec83531cc1f854fe3edac489d6c42552f4701bb37b58a5618d8039375a367f414021959abf0fa255793e6589a0234fa4fa8e4515e38afbc0d5077703a3bc138e3e12c0cb9e2d457def3aecdc99ba5687521dd93e2b9dc031efcf2681cfbd730fda3556cc97a018332ed1be584a8c9b230f2766ca575e40d7e20e2eee711cfd9c773fda2ee1accfed4d10d39d9cab7c78ccc82e1cdd692d18a4c960676afbc742b3e38587e20d045e26fc72bcd44113d70d5216e4e15e5c629009cd88cd225f2b304da9cb7a61ab03e6f1252f7b65448b593dbc6a8b813e09ff71d8c90895eb962bdf7a2d0ebd4834708c1f44b3a5405d500ef7bf8d44719da03e76d8bbbb66916797bc244555fa770668fecf7ae30901450cf0b3046d0903e5dbc982e13b64f06c7bdac7f81e6c031d95478 -Result = F - -Digest = SHA384 -Key = 3082018a0282018100c151ff0fed6cd9251edd8df49937283b4f4e67c3bad0826d46b6df2ca7657dda4f099714e70271d626ef41d2dd2a2d6e008b6193e7ff2bffe4207fff2b468b7a985ec684ff7364fbef587a1787c73840b1d0b5781d0428a6af38896de1e9eda5756af5545459e49e6ebf19d2a7be83ed4be2ab8d99e896a2d6338779e56ecb1fbdd1b79f813d0befa58d67aa8c935eec4b8f1c9895d225c8f0fbe7c960d5514bc78ee3c5af0d1bc8a81b1ea9b2caecfe37ac5d3fef9a0327ba7051f7996a901f2cadd1833d059d99e5bc2b512ffd5b090f80f0ec647f60c8756864b7f85d605fb391f614ea5f17a2766508e92092b3d8354572dfb947dc59f79d98ff945e9e3b83b3632464360fafc4cf2528b82836a685a29140abe524eea30b3bdfc1417959b46d933c4ec257d71696d74e89d7e024dfe20cbdebbb263fc586d22ee4b1fa688ee1ac92a9d7084e017ab4b1645158d4785ee8bb2f8eb54b5f70142ef19fe124269f0f83bb88720941d234269c2885a64b9f35118b900086d806b00133984047020374dea3 -Msg = 22c5152bca7a2d7c48eb5bb3a50c937f2423ce8625220d5749349b9fd796939f5fa8a3dd9d440f1a9f4ef9852a8cdf2e5bb865bd8ad4556473bee412980437eae1f925f386093f112e490d3459529bcffb50348c69566e3e79f56716e50c4d1bf1e124d44e71c3473d052028f806ce4a4d12c4598c4f60cba300ac148856df19 -Sig = 58d2bab8f32a675ee83d4f36b0f7499adf4cc6f3335f5159d69302349741a472a39e8171b3ceba18230614003b247e0096dad35dad90226a4822de9d7108ff1f76da6becc3e5b41899ce52b85626a59522902297161d0bba1cb38236b6c80fb01e7e55278ef1523a3c41c232cc3caa3529211d50cece53060a5a36523b3ecaf1949fbe3032dcb17be1003624dbb280a926fe70ca19f6672fe100fa90dcf8b84bea122e0cfa5cedd52571a2fba21bdc0cd2f7d79b1d33e950e4828fa0d2fbc0d708ab428c1b6680e85e0386561b3e30d58bd4e0dce453d3eebe8e4fb47e6a1502db77d1ba0e6ee5b0aa71d6d0d91a38be4e1d84c7c95f68775d8b9c192ff61ce90644dd6a34b926dc7c8da5c3b1bf47236bb1a8cb7a5bbeabf86d649707598cfc9b1d4cdbd123e757da4238160054a3f7b5b4f77c1f0631f07cccab6a055d763b42b715a0872ea188410bde9cc2988f66f691122117d001e8942a20ab833875c2839c4bee53e82de7438a561aabe499453f49a0287d7a1114b8761202c6a4dda3 -Result = F - -Digest = SHA384 -Key = 3082018a0282018100c151ff0fed6cd9251edd8df49937283b4f4e67c3bad0826d46b6df2ca7657dda4f099714e70271d626ef41d2dd2a2d6e008b6193e7ff2bffe4207fff2b468b7a985ec684ff7364fbef587a1787c73840b1d0b5781d0428a6af38896de1e9eda5756af5545459e49e6ebf19d2a7be83ed4be2ab8d99e896a2d6338779e56ecb1fbdd1b79f813d0befa58d67aa8c935eec4b8f1c9895d225c8f0fbe7c960d5514bc78ee3c5af0d1bc8a81b1ea9b2caecfe37ac5d3fef9a0327ba7051f7996a901f2cadd1833d059d99e5bc2b512ffd5b090f80f0ec647f60c8756864b7f85d605fb391f614ea5f17a2766508e92092b3d8354572dfb947dc59f79d98ff945e9e3b83b3632464360fafc4cf2528b82836a685a29140abe524eea30b3bdfc1417959b46d933c4ec257d71696d74e89d7e024dfe20cbdebbb263fc586d22ee4b1fa688ee1ac92a9d7084e017ab4b1645158d4785ee8bb2f8eb54b5f70142ef19fe124269f0f83bb88720941d234269c2885a64b9f35118b900086d806b0013398404702030872bf -Msg = 21af062f995cfe8325632c751f445cad6102d56607d73bc47726b4689fb14a437e0c91a7e65289a48016c591109ccde9fa49c2590659401660d08874e3b3dfb59677311e77bafa51783167d6c8e2b8fb5393e8de8c8290c86a5609bcb056d05072d92fbcd5fd1a31169c586cce7ce38a74c6901e23baf2819da07c699102e7bd -Sig = a3d26043c5f0eb27c6d22818dcbe19f156e246712850ddcdaf7aaccea00d028aeed43d3a39833bca74a7812143a80d33042c19952ccdc86fe4608b2702ebe93e398b4bbdb9a34f8500bc040e26d5b4667cae0e653ee6b76236f367a425567c93b31bc5549c2ae0138daf99fa2bc0d3986cead8ddfa4bc4e751b2244a1f395d449f4087dba2a9d003ed059caa4f4209435bcf266eb8070be17ebc7253d2327ffb6d2fb958c69b020557f1499987f78def362f1c36ab7f436423b21e729333b73ab1a6ae0941056339ea42a4a20c644e19ffe825e7814f7b48438aaf34e803995bf36044ea88615e4e91b7255938234a6304de76bb6b504978f49c27e85d98fabdeec915a408d4ad8bdfa74032fe285acdf5f20fc908a1482cb2861d64f1f960ddf7fab77a327c42ba5fca17269b4a068e44c4b599c51464c26ddeeecdeff81919dae58e6f5b70be99bcb18235edf47a4aedc5ad7fbf365d87cd94416499287e7e522eeaf172ca83120eb9210f7ed88f6249dd1ad1838080af68ca6106c6fe7305 -Result = F - -Digest = SHA384 -Key = 3082018a0282018100c151ff0fed6cd9251edd8df49937283b4f4e67c3bad0826d46b6df2ca7657dda4f099714e70271d626ef41d2dd2a2d6e008b6193e7ff2bffe4207fff2b468b7a985ec684ff7364fbef587a1787c73840b1d0b5781d0428a6af38896de1e9eda5756af5545459e49e6ebf19d2a7be83ed4be2ab8d99e896a2d6338779e56ecb1fbdd1b79f813d0befa58d67aa8c935eec4b8f1c9895d225c8f0fbe7c960d5514bc78ee3c5af0d1bc8a81b1ea9b2caecfe37ac5d3fef9a0327ba7051f7996a901f2cadd1833d059d99e5bc2b512ffd5b090f80f0ec647f60c8756864b7f85d605fb391f614ea5f17a2766508e92092b3d8354572dfb947dc59f79d98ff945e9e3b83b3632464360fafc4cf2528b82836a685a29140abe524eea30b3bdfc1417959b46d933c4ec257d71696d74e89d7e024dfe20cbdebbb263fc586d22ee4b1fa688ee1ac92a9d7084e017ab4b1645158d4785ee8bb2f8eb54b5f70142ef19fe124269f0f83bb88720941d234269c2885a64b9f35118b900086d806b0013398404702030872bf -Msg = f00fbccfb64b9cabe7abe3e25e2fdf96881d0e606cf63ee4e8a8f1a83d050626ce74961f24e61d33360cdaafe7c878a6d1e1ed4341faa35d82c5d54c5f743dfbe370ec3f634e7967bfff5d15e4469e4c956fabc96c3f87971b272adef8bc25fcb96c84d67b69f8700aea36bc5c939ab05e31109bf4ab34b93a36b80511c7064e -Sig = 095f3c7b47d3c07fefa316f5b09de27afdf7337ac4fc4c77a805cd9e104cbe3344dd9d44e14130dcfc6e90b1bfdba92ec2e7e0ced121b08d9c4c7d6b39f707ac693ecec0460c850af7399b813f8d0ec9a0a3c6feea102333464b80cb1aa68d179102e9f600e7d69b68ac3bf31c7d064b8ff4fe4658d31a6910d6f5474f0652a6a76c6d2f75a614d168366d63f45a4ec8f69f754a57de0c8ef0a7b007f8785ac27e38b6f3f23792d20d2cd89082ff664fb2277817c23a0a3b584e6aff2800eb09ec7677d7fad80a4e5d8ca15e296772b5b89e51120b11ce2b983e6e430b764464a11a0ea16319b7b0a28e56eac826bb527a8c05dbe47ae187f22cb4714d4564d783f45fedae28bbdcdea7bd9d88474b72785a0ff9089e1007247144914712cda36d906c11d99373c29411f9264a9becf9c351f4dade4ef1dd3d48ebc6f27ae19d94cb49c3bdf22f685b4b9c3ad7f8c9cc5251499910c4a9e84945a92a1a6e0fc6f0c030c94ce7a4194280054af88c2d6e0b6934a0f25e159fa89a70c077f21a0b -Result = F - -Digest = SHA512 -Key = 3082018b0282018100acc1658b0b236d34992af6dfcd916f29c532a00faba18ed2be4835b1dd03951a5e3a46f2da3bb27a955606bd81d2be2d797ae651af241be9e84a52242e137c0d2fc5be00d692d094fd1606138fc280c113aa7e8250a484aea7c7e6f83bdd76d4966a5d1cf1d3ad1deb899ed53b9a633ed6c4617e38ec226523f6480bae9397b34ca5adc6e0fe854ce2e161866bf2621afff61f32b7dd08ce3ac931346315cfc6b66ba37e292bf0b5d274cdf98f175d247222843ff90e63e3d85427134dcc00fb20e51d84ac1b1132393fdaf7596818b56a9b019d65cf4b4302e9e11057ff90508d0c0c2c7b5f9d57e180e71b2f103a60ef6edbe40b1da27d16018bf6d4a4fabc9c73d5827f0e52c4a16e11d4bbcbc6cea5ff5bb2284ecce4b6080064c2794fa1cf6789565e16842882a7d3caae5051a9a45327b74bf4cd5885736bf5bb9bb045082aed3454fd40fe3c83397bb56115035f358735c290b43d5cb1f67b8853651dbac0cb9a197b46abb1121736a17d917dc2892eb2c5b3c4881ab472db54a5c4ad020400c4d755 -Msg = 76dbb0c0d2069fe7c8287301f57169ec11c79fdad4191c4913f111362d495e8da5a058e5104dca6a32123a1a64f46d35384a2dee60154967cc8fdedc1307d51f14ebad44dd277a9dccad2ee9f35518c8c1e8aa72df777fa959f29decfef6f7ee09e53646013cb868dd21d9d46c3c728df4c8a0cd1aeac7f70141d6cdb6becce3 -Sig = 2e34f1e2f8064b52d770593345194f13460cdaf2bdc502e14e77ecffd093bb57fed459b1f1a26c15d58ef9ab1da879917cfcb2d5793b8c774bc94f0494c66010ace1159c8b546f616125bd79111d81614de5b0f6cc42d95c41bee3789e897adc94aaffbb3bd51e5f022d0385b7a1956cb013353c1167dada2a9c7d0052a0e0cda5eb0bd30f310099c1dfd36c809e0ed49d14ada4d39551a02d6d7e6db2a3a1ab499854c9445d2e9513529b181ebdaa6f97a3e84c246277f4e9ad6428a82c3745c050951ddb16a074f477cb10ee2765ec436c83df7342c6055a4c4206c88d826d04c7d342d5fc46a90c22a5b68ed57de78287a2047149290f16778ebbd253aacca35602f2b2f855a277ea263fc2ab286a42f5531248ae38adb65b8ce4b28185933d8a03f4787ec35a41d9965cf8a3a46bd970831842b94c99dcdc748ede26611f151fe33a64921e197ea329e26ff3cedddc830198a94c1917e8b6200f453c69e04cdaa9e872167aeab367ef9dfe7905581ab0796d611b15b97e4f6b351869ef3c -Result = F - -Digest = SHA512 -Key = 3082018a0282018100acc1658b0b236d34992af6dfcd916f29c532a00faba18ed2be4835b1dd03951a5e3a46f2da3bb27a955606bd81d2be2d797ae651af241be9e84a52242e137c0d2fc5be00d692d094fd1606138fc280c113aa7e8250a484aea7c7e6f83bdd76d4966a5d1cf1d3ad1deb899ed53b9a633ed6c4617e38ec226523f6480bae9397b34ca5adc6e0fe854ce2e161866bf2621afff61f32b7dd08ce3ac931346315cfc6b66ba37e292bf0b5d274cdf98f175d247222843ff90e63e3d85427134dcc00fb20e51d84ac1b1132393fdaf7596818b56a9b019d65cf4b4302e9e11057ff90508d0c0c2c7b5f9d57e180e71b2f103a60ef6edbe40b1da27d16018bf6d4a4fabc9c73d5827f0e52c4a16e11d4bbcbc6cea5ff5bb2284ecce4b6080064c2794fa1cf6789565e16842882a7d3caae5051a9a45327b74bf4cd5885736bf5bb9bb045082aed3454fd40fe3c83397bb56115035f358735c290b43d5cb1f67b8853651dbac0cb9a197b46abb1121736a17d917dc2892eb2c5b3c4881ab472db54a5c4ad02035b1365 -Msg = 3c2cc086a13b1d1b232f0f131032f1ef2dfd616ba03641680dfd012a00c221c38b59f1cf30509c620080643f05e22f4bdea44341a97c4ea6263da90018a8dd43ef84678ca5f1b811e6f9805873682ca8c8ddadbefd227cc0eab9db778eb75db8b2d6a823c9c57a111bc2eac7226bf1f034d1284a63cfd39fa29a1ff72998a80c -Sig = 51fb0f16194df6288533f7b91df149c79e8d474b4d44a51f903902700fa561836c4c6a09c9c5211737217b2de1d6d73106f4709ebc219a4c71d02516a9e42dc4ef9e372db5c3d05e3ba2c3da25e5e8519cbdc3998c0ac5187df777acce31f039480e11d745c6c0b235075cf1805498ea1f15bc911f6d94b3d332084ffda0000ee0d72572a5a24f303857447081129392a1693552c5da4ef6791e2a0f6e68a889e98c1ca7d8dfadc7beb60e8ca4756cb8f56efc62d3accfa16462f597363441dd9ce27328ba9014ff366600ac42140e1b4a4b9a068bbf05fc37acd0eb7c9fc6803a4f87d706d72b570e0fd405f6fd5b7a3926f5e7206d23bf2dd39598de89fa1e66a2fc4533f516d15f0e44bccd0e8d405ee95f1586d17ee25feff7bacf0f3a008e9c0a15129ded95f5a50fa7cf129517604504ba89fed73cbd4e96da21e824b93df4cfd6776961d0d14e5c3a11cf29a836f5c87fcc60e9c837717a632d070737b470f9a374c916166b5df2afd7250cff6f03ddaacf68b067bdf0edd1ddb82d2d -Result = F - -Digest = SHA512 -Key = 3082018b0282018100acc1658b0b236d34992af6dfcd916f29c532a00faba18ed2be4835b1dd03951a5e3a46f2da3bb27a955606bd81d2be2d797ae651af241be9e84a52242e137c0d2fc5be00d692d094fd1606138fc280c113aa7e8250a484aea7c7e6f83bdd76d4966a5d1cf1d3ad1deb899ed53b9a633ed6c4617e38ec226523f6480bae9397b34ca5adc6e0fe854ce2e161866bf2621afff61f32b7dd08ce3ac931346315cfc6b66ba37e292bf0b5d274cdf98f175d247222843ff90e63e3d85427134dcc00fb20e51d84ac1b1132393fdaf7596818b56a9b019d65cf4b4302e9e11057ff90508d0c0c2c7b5f9d57e180e71b2f103a60ef6edbe40b1da27d16018bf6d4a4fabc9c73d5827f0e52c4a16e11d4bbcbc6cea5ff5bb2284ecce4b6080064c2794fa1cf6789565e16842882a7d3caae5051a9a45327b74bf4cd5885736bf5bb9bb045082aed3454fd40fe3c83397bb56115035f358735c290b43d5cb1f67b8853651dbac0cb9a197b46abb1121736a17d917dc2892eb2c5b3c4881ab472db54a5c4ad020400c4d755 -Msg = 9a3482f481638f436c51f7b74d3bd19a91e99b02473c7f028507d421071fe80b1ab6fd87b8e491a9f587e3499a4db2b40f0f48a07e61b7663567636b4ceac0df88aa5dab80f622a4fe7bd605a85ae31ce07d5e43e82a42124ad8fcd377422d36aebbab471fc1c99c51d4d8d3c189ed3cccdae5d2cec0a7708c04a941cf51b679 -Sig = 0f5c8dfe8b67996bb62af65fad25c816979b33419babafcfb3d35c2887a0375ee7461487d4d65b1c03306919abad43793a93643b912cf906c4095356b64f8a3e01dddd2446ff3c07ec62bd6c1b39fca4efd95904ccd0cf87c1bc5f3659825b86daca6b46bfdba8790c4f958ac9647cb1991e2661a01925c79d1f9b23856e8035507b1cd66956a47e97e756443c6ebd46105f8788b0713f6d3f04c3f16849aae50dbe920a35d5e5c1345af610f38ee98c153b02dcc6a1175762af98587c203bb6bdc93300af93a64798d8f621a0805a3212ec9edc90ec4bfbb63d6121ce478a96fbf3e731285daa14a638d5bc9dfd2c365e9d1d70b80d3cc461bad93e7b2ee984228206b52c9bd1ca44561efc558a6133e93d82079b1d5bfc5006742848b95a7e50fc3b14f3590f76f1e86decfb7af82d49853b3b1a8b54d8bfc7bed9f50c78ad01a1b8c7a24ea959efc8c54e0a6cbde288d36673fefe3a3a308cbe895de7e1ce747073eeac6df67fd3e15b38de300d9555450948d2c72c592f1a3182be99d760 -Result = F - -Digest = SHA512 -Key = 3082018b0282018100acc1658b0b236d34992af6dfcd916f29c532a00faba18ed2be4835b1dd03951a5e3a46f2da3bb27a955606bd81d2be2d797ae651af241be9e84a52242e137c0d2fc5be00d692d094fd1606138fc280c113aa7e8250a484aea7c7e6f83bdd76d4966a5d1cf1d3ad1deb899ed53b9a633ed6c4617e38ec226523f6480bae9397b34ca5adc6e0fe854ce2e161866bf2621afff61f32b7dd08ce3ac931346315cfc6b66ba37e292bf0b5d274cdf98f175d247222843ff90e63e3d85427134dcc00fb20e51d84ac1b1132393fdaf7596818b56a9b019d65cf4b4302e9e11057ff90508d0c0c2c7b5f9d57e180e71b2f103a60ef6edbe40b1da27d16018bf6d4a4fabc9c73d5827f0e52c4a16e11d4bbcbc6cea5ff5bb2284ecce4b6080064c2794fa1cf6789565e16842882a7d3caae5051a9a45327b74bf4cd5885736bf5bb9bb045082aed3454fd40fe3c83397bb56115035f358735c290b43d5cb1f67b8853651dbac0cb9a197b46abb1121736a17d917dc2892eb2c5b3c4881ab472db54a5c4ad020400c4d755 -Msg = adf9b0a89d93e05bf18d5610d03d9e70474d4a169bbfe6abde2f2e4fc1587e3ba9da89a5053b4ee4de2b48d5af0ce57d78b13af00e66f571b53193daf058d33f98236ace2ce3f8f968333bd8197e82c82fc265591493b4673c62ad86feff72a4a25dbae9bb96c6e2b72e97dfb49c5e9995063418554d0bd49c49e41b905643b2 -Sig = 3b62f0d4fb1b702eda45e08c47d87b2caba37728133b54bbc654f1e39d4290050392a412226429384178be20a2bb8a2d737f08bffd1396052e4c82d625e3ff46955852b4ac9393ff7e620c8fb7ab5a7173f3cf67978127df7dc4496953488365e500ff13a1ec170ab95d48ae4b7c0392c4822f531a7a534464c91401d40561384c0ef1caab31f449a926e2b39dfc1cf0a048d121080ec31776da00f2c392783f15dcccb369844d7cec262fb6cb755660b0a08f00720b059b0c272262f2a943b6253c353e6069ccbd3c70b0c3a1474cc1d6f878e7a8495b4aad1d963351f9d23b69af996928a86f113ad50b327c26ccd599425c67c4f7bf8e495f7945efd4b11b952c52266ea3ebb46e445d18c596b8d2d6a9e8c70f0e3ceec51784c7477b662b304a5530caf18c3c8a232fd11c63258002714c298c258d724d8e8d4f4117bd74d2d92dc66fc324a257ab2f907aae0c7a8ed9e1aef7e9d0657472349eeb3da29972b11a9005fd93dead2361df7273adc8b968e0d608d782878ed75fd7113b7d67 -Result = F - -Digest = SHA512 -Key = 3082018b0282018100acc1658b0b236d34992af6dfcd916f29c532a00faba18ed2be4835b1dd03951a5e3a46f2da3bb27a955606bd81d2be2d797ae651af241be9e84a52242e137c0d2fc5be00d692d094fd1606138fc280c113aa7e8250a484aea7c7e6f83bdd76d4966a5d1cf1d3ad1deb899ed53b9a633ed6c4617e38ec226523f6480bae9397b34ca5adc6e0fe854ce2e161866bf2621afff61f32b7dd08ce3ac931346315cfc6b66ba37e292bf0b5d274cdf98f175d247222843ff90e63e3d85427134dcc00fb20e51d84ac1b1132393fdaf7596818b56a9b019d65cf4b4302e9e11057ff90508d0c0c2c7b5f9d57e180e71b2f103a60ef6edbe40b1da27d16018bf6d4a4fabc9c73d5827f0e52c4a16e11d4bbcbc6cea5ff5bb2284ecce4b6080064c2794fa1cf6789565e16842882a7d3caae5051a9a45327b74bf4cd5885736bf5bb9bb045082aed3454fd40fe3c83397bb56115035f358735c290b43d5cb1f67b8853651dbac0cb9a197b46abb1121736a17d917dc2892eb2c5b3c4881ab472db54a5c4ad020400c4d755 -Msg = 8b02e84531d5623e528e208c109a68ad04ffbb6ed29d075400b41e3b08a7673dab00d3d589b31344efa70934f0727c9cb7650fe31bc874487466dd81ad4db3a29bcf8b418dcc56d82534d76a66c75b6a0d1fa4d825f126add69076797eb2ff4b0377f7d167a791c09c3b74769a206ddfb037609517a0854bcd38d06ba060b1fe -Sig = 8a5503759f374b78b8bc654ffda8f1add7ea05e24218f9e9c140709a90c5bf8868f081bb2a01a43d724c99e47ebc2634859dd11653b1c5a4d65dd306719b7b4cf2b66f7ba3c93e8731a7adf715c5b0365e0f9453b14d08dcc88052c97d4fdf05f4c92dac2ade4708abe6fe752ed57a5f39281b0c5aa349e3c4ca056f66ccb6fa07154b12657ecd5a94db390e09320dbd2c452e84d389bf2fdf4686b21905497830aa57bc5ced3d23b519f6d6c300ca5d3903ad18ca426b13dfd5bf56e7b47300f88ae7fd0b085807951db84ca9074ec40d285334e85570f0df96afa9d85c55aff0bcc2ba28f2d5fa4860159575ee84194238424213b7673d0f50bf903351e274eac603f2e4218ea8c626fced0aa08097f6630d92139feeabb747ae20e2343c3d8c7647ec48ee2c0d00031b9c882f91efbc7e8487a0010ad3c51f160b902b59baca8f19e8fe90402e1e0131b37a936e101e15f8e4cfedc727cc160c6ae206f3c70ea09f08f00c9bd1837296785536d1bb9785014c59665cd2b930050161d946e6 -Result = F - -Digest = SHA512 -Key = 3082018b0282018100acc1658b0b236d34992af6dfcd916f29c532a00faba18ed2be4835b1dd03951a5e3a46f2da3bb27a955606bd81d2be2d797ae651af241be9e84a52242e137c0d2fc5be00d692d094fd1606138fc280c113aa7e8250a484aea7c7e6f83bdd76d4966a5d1cf1d3ad1deb899ed53b9a633ed6c4617e38ec226523f6480bae9397b34ca5adc6e0fe854ce2e161866bf2621afff61f32b7dd08ce3ac931346315cfc6b66ba37e292bf0b5d274cdf98f175d247222843ff90e63e3d85427134dcc00fb20e51d84ac1b1132393fdaf7596818b56a9b019d65cf4b4302e9e11057ff90508d0c0c2c7b5f9d57e180e71b2f103a60ef6edbe40b1da27d16018bf6d4a4fabc9c73d5827f0e52c4a16e11d4bbcbc6cea5ff5bb2284ecce4b6080064c2794fa1cf6789565e16842882a7d3caae5051a9a45327b74bf4cd5885736bf5bb9bb045082aed3454fd40fe3c83397bb56115035f358735c290b43d5cb1f67b8853651dbac0cb9a197b46abb1121736a17d917dc2892eb2c5b3c4881ab472db54a5c4ad020400c4d755 -Msg = 379b6b72a139346febdb0fdce95394c509a6c5f0876de862e47b922594c00549f76dbb298a5943f05fa44c5bca9a00c05eda934f17b71b98d9dea24d19397949da14d0d2dc7f841b10f3380d4e38a7474a853864c5ead47c00ebf4ed766efe5bcad7d1f5ff719efae710fb7cdef43265b8f1dfb7f7cdba1841eab18d12243a86 -Sig = 88f3e8e1b41671191471092d34520f6a43742702a629f1cc9d2b806c9e6cc1f3ab47fe1b0281570a0825c0de59b24554d4b78b00de2b807a92c51dcf22def3385635b477b9129a34c8543d24173f13167ad7fd7bdc108dd5f8e3f364c3f53ecb26fcc59145ea6ac74aaaa7cf0f1aff4b1462256b87e8d5dc9cf74ad2419b965217cc9ec90337cc01c7d9928ecd310468ca69cce111a16ed5bf7a07d3fe4dbe0b34b59645527547ffb9264ae48eed86d05d1caa8f519d5391bd2ce830d8ad0bda965a735cd4c061797ae661d0bb0431a8189a35aa0b4d2a6a6877b703bea7f09422372913e4ac4e2981e3c917f7bef9f9a1727fab29af9320b9ed44d5229460b06055c2ae911f4eeaca72de9c3b6269ac23943b13376e5009ebf8d349d34a28a07ba2f85466c2d488b6593f7abdf0f221c7aa51e142ba9e6828d23283e39671a41531f01a04fcd3dc70172dcef185e26bcee509a143150ca7f4e2dfdefd2be9dfb98ed0c7b12de9dd8d5653b88758ee1889093dd529657042a86507426caa6488 -Result = P diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/tests/rsa_primitive_verify_tests.txt temporalio-1.3.0/vendor/ring-0.16.20/tests/rsa_primitive_verify_tests.txt --- temporalio-1.3.0/vendor/ring-0.16.20/tests/rsa_primitive_verify_tests.txt 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/tests/rsa_primitive_verify_tests.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,65 +0,0 @@ -# Big-endian public key parts for signature_rsa_example_public_key.der, -# encoded in hex. - -# Basic test of verification functionality -n = CEA80475324C1DC8347827818DA58BAC069D3419C614A6EA1AC6A3B510DCD72CC516954905E9FEF908D45E13006ADF27D467A7D83C111D1A5DF15EF293771AEFB920032A5BB989F8E4F5E1B05093D3F130F984C07A772A3683F4DC6FB28A96815B32123CCDD13954F19D5B8B24A103E771A34C328755C65ED64E1924FFD04D30B2142CC262F6E0048FEF6DBC652F21479EA1C4B1D66D28F4D46EF7185E390CBFA2E02380582F3188BB94EBBF05D31487A09AFF01FCBB4CD4BFD1F0A833B38C11813C84360BB53C7D4481031C40BAD8713BB6B835CB08098ED15BA31EE4BA728A8C8E10F7294E1B4163B7AEE57277BFD881A6F9D43E02C6925AA3A043FB7FB78D -e = 260445 -Msg = 68656c6c6f2c20776f726c64 -Sig = 048efbc9eb5f7a6f55f6d7b9f7e6c3ce58e2db226562ca905e7f972e8f43b6969b0ad878e0d6b290c5bbf2c05410a1efc9de051d91e5faa537e454306f5f526c828379fe28a17e50c8bd4e7c834479da482305a78e198c988a177b9263cea27a2a99c0da98e03b0cc8d880eccdeba7c16dd07f78d980739753690953d1b63106145a80059ed38f52100a9a8d2c7c5371d91b70ce5b7b36d6b97ebef8798d09c01e5b6cb8a6a7fd1a4100d3527327b7d23f8a26187985d8702f8951346ea4a7253e87f765ef587a728021bff37be55d1a8639809e3453ea5a2da482bfedeae18579b51037cfecff5bece21d8c82ee6fa8eb0f43c43c3a23a983c3a2eea4e7d2dc -Result = Pass - -# Test maximum e (2 ** 33 - 1) with too short n (2040 bits) -n = A614CC5E164699777CD3DDFB8C63CFBE0F1848E03CFF5C03066DACAE5BF77F90621835E0521648F5B4D5B1BBD0F26CB776BF3B8C431FFF73F88BA5D0675859FCEF3C194B71941DBA0EF8E7E7933339D53EAB4F2AAC90C17B09351731A829E620B0D3C8890366AA23AE1596DDB17772B4C23AED387A0A6BCABFE40DC3F8E5671CC519FD2770FB7EB1F89F63F23B1D6ADD8929D8813019A97EBA68D1B610FFEFA94F0369EEB02330836DD32515E33286A5ADD80D9C6D3DACD16BAEFD028545DA521E9FBDC3158D0D28B5B266ACD57F1AEFCA9634D8C4F16AAD1224E15886A994371D0AB99C84CE0CDE34512480E9C86C73F09C30C6AEA16827E745F7D30FBC4F -e = 01FFFFFFFF -Msg = 68656C6C6F2C20776F726C64 -Sig = 9E62FFB36FC346B07DACC8AFFA5013F5FE339035ADAF666223255D51BF81B361DD382EB6D9468BF15ED474A18B477F0A45E49EA71EA120CED66A8039B2829CFAF45ED31252D1093B59C6C8543A282C7922D429A7E187207B7370E080E27181310E581D868BBF3F558ADAC0B27E65BA09E507AD2DB275B61DEE3153E2BBCA1EF9FE6BCD2D41257E9E478603EDCE8A545D9E53E5AEE802E4D330B8140054EF32EC3D6EF2BD131A64F8AA66D9D547E75C3C59B5063A5532A610F1A30E1C610749A9DE318313C1028883F40D6E5F9BD2B8629F522DB1C21C3EFD666F2AE3867700FE8BF37CF678F7FD7388373D17D345E96FED83AEEF48FC6662708C258621336E -Result = Fail - -# Test too large e (2 ** 33 + 1) with shortest allowed n (2048 bits) -n = B86EE74B2A5F42C57156C3FA7CF6D88F481850D19E8A85CD1FCE6383EBDACB0E45302D68196B6A9EEAA584A7E0B13E38BBF43DC6E7AC5791789A43FC0C1CB8ED44F28AD81C4B69106C19D8086414BF50B9A2E52760FDFB40252048C9398C3E9298D5CF18BD7520BB62C88D5FE85B3FD4A2DCD48497CCC5E03B7335A81EDEAB2D90BBBCDBE6124BEE43E7B8594B4AE09BFF5DE65D24E0682850383B804FAC4D735C2967B78BDC7B1CBC970247FBB2648CBFFA10B9AC7530AECED949DF613DA85E505353EFFCA7E142E1CCB533BFA99D743071D41037A17530F2401BDD6B6998811DC5ABA431F53086F9FBB568E144AE590224B908A58FC401E283B61F64657413 -e = 0200000001 -Msg = 68656C6C6F2C20776F726C64 -Sig = A7F5989E8694C6444CD2D97D22D2F2CDD7D088C36847A25E8E861CBAECEA48F1828586FC5B40719F2606FC82F9B826C2B55070753E310EBC5A4A9E6BBF82C41F3A0C30E2C22B95ED3DE3866E332048F75F562492946988F5AC7A687793C97D3DBC3E6E3D96C8217F1F873EAF4736594E1B91D7BCC8B037A19850EA1F178EF59F4855C353D26432E1E573BC3630F8D1C9C280ED5F52AE996D2F1F98D0E53C53FA58ECA5F74D97D8DED59729F03241F5E7D87D7B72D549C559B6225BF9AF626179491A2146A3ACF8A18C82BB0696F899359D8B7DBB6FD350D5FAA3C4421A1C34F34895F30E70CFE0A98918C67F97DABE0D24E479A44B787391A22A5A1803A16708 -Result = Fail - -# Test maximum e (2 ** 33 - 1) with shortest allowed n (2048 bits) -n = B4224346F3222B5848AF0071D9A2EDA18FE468FD76BD9C4F5A298A9A089929527EFD835CC28553F990D12FDB6D52F37716FC8E1CEBDBACC8C791C84688D5568DF256BF6B4C10FF039EC16A1E842EE605D3F2B455B3579E9635084D8587BB6871A64B1447586F1D7D015F26FC70792591B127371FDF3812C1D4ABD17273EC9979829FC6F1536C3E3BE1B8830BE03E3BE079BF557A791DA66CD6F635B90FC0D0CFD449814948AF1D9FAA7BA375640252CDB0B19BBB610008409EEE895DCE70D6A288030A1F38DFC37A2738409DEC62A4813C6B78B7AA148AFF2796F5D30A631E062AB0AD884834AEE46F041AA563C048074616ACB71A35092EC29B607973ADEABD -e = 01FFFFFFFF -Msg = 68656C6C6F2C20776F726C64 -Sig = 736495E32CAB554FAC3E81605BDBCCF2206D49CBC682A6DFE20A298354109F0FD5644CA06F281240AC0AA6F33AF35855CF6D24D870E795AFCFAF013C2E46B54EE09AD13361A2BB275DC3F0AB14AF075EABA9B3B094FA6970926E41B9FD0951B8BFBA67F3827CE2F1D5D49EB3BAB34211A759655A33689901A77EC5384D9A26979F2AF295EC2E2A5EE92730EA4C0922075F00E43E900FF6B8EF702659ED273B1CB9B95E811A4708D6A0C175F344DE8B114B7E15C41C1BAB9A7C19869FD5F615C6E5455C920A4C8F41D440CAEBC8713E2CF9B6153E2E56659BBE9CC056138F942AD988FBC39F153721FDD67BEC29A990492B1A1B9AB84756B423692FA3C98EB517 -Result = Pass - -# Repeat previous test (max e, min-sized n) with swapped n and e -n = 01FFFFFFFF -e = B4224346F3222B5848AF0071D9A2EDA18FE468FD76BD9C4F5A298A9A089929527EFD835CC28553F990D12FDB6D52F37716FC8E1CEBDBACC8C791C84688D5568DF256BF6B4C10FF039EC16A1E842EE605D3F2B455B3579E9635084D8587BB6871A64B1447586F1D7D015F26FC70792591B127371FDF3812C1D4ABD17273EC9979829FC6F1536C3E3BE1B8830BE03E3BE079BF557A791DA66CD6F635B90FC0D0CFD449814948AF1D9FAA7BA375640252CDB0B19BBB610008409EEE895DCE70D6A288030A1F38DFC37A2738409DEC62A4813C6B78B7AA148AFF2796F5D30A631E062AB0AD884834AEE46F041AA563C048074616ACB71A35092EC29B607973ADEABD -Msg = 68656C6C6F2C20776F726C64 -Sig = 736495E32CAB554FAC3E81605BDBCCF2206D49CBC682A6DFE20A298354109F0FD5644CA06F281240AC0AA6F33AF35855CF6D24D870E795AFCFAF013C2E46B54EE09AD13361A2BB275DC3F0AB14AF075EABA9B3B094FA6970926E41B9FD0951B8BFBA67F3827CE2F1D5D49EB3BAB34211A759655A33689901A77EC5384D9A26979F2AF295EC2E2A5EE92730EA4C0922075F00E43E900FF6B8EF702659ED273B1CB9B95E811A4708D6A0C175F344DE8B114B7E15C41C1BAB9A7C19869FD5F615C6E5455C920A4C8F41D440CAEBC8713E2CF9B6153E2E56659BBE9CC056138F942AD988FBC39F153721FDD67BEC29A990492B1A1B9AB84756B423692FA3C98EB517 -Result = Fail - -# Repeat basic test with left zero-padded n -n = 00CEA80475324C1DC8347827818DA58BAC069D3419C614A6EA1AC6A3B510DCD72CC516954905E9FEF908D45E13006ADF27D467A7D83C111D1A5DF15EF293771AEFB920032A5BB989F8E4F5E1B05093D3F130F984C07A772A3683F4DC6FB28A96815B32123CCDD13954F19D5B8B24A103E771A34C328755C65ED64E1924FFD04D30B2142CC262F6E0048FEF6DBC652F21479EA1C4B1D66D28F4D46EF7185E390CBFA2E02380582F3188BB94EBBF05D31487A09AFF01FCBB4CD4BFD1F0A833B38C11813C84360BB53C7D4481031C40BAD8713BB6B835CB08098ED15BA31EE4BA728A8C8E10F7294E1B4163B7AEE57277BFD881A6F9D43E02C6925AA3A043FB7FB78D -e = 260445 -Msg = 68656c6c6f2c20776f726c64 -Sig = 048efbc9eb5f7a6f55f6d7b9f7e6c3ce58e2db226562ca905e7f972e8f43b6969b0ad878e0d6b290c5bbf2c05410a1efc9de051d91e5faa537e454306f5f526c828379fe28a17e50c8bd4e7c834479da482305a78e198c988a177b9263cea27a2a99c0da98e03b0cc8d880eccdeba7c16dd07f78d980739753690953d1b63106145a80059ed38f52100a9a8d2c7c5371d91b70ce5b7b36d6b97ebef8798d09c01e5b6cb8a6a7fd1a4100d3527327b7d23f8a26187985d8702f8951346ea4a7253e87f765ef587a728021bff37be55d1a8639809e3453ea5a2da482bfedeae18579b51037cfecff5bece21d8c82ee6fa8eb0f43c43c3a23a983c3a2eea4e7d2dc -Result = Fail - -# Repeat basic test with left zero-padded e -n = CEA80475324C1DC8347827818DA58BAC069D3419C614A6EA1AC6A3B510DCD72CC516954905E9FEF908D45E13006ADF27D467A7D83C111D1A5DF15EF293771AEFB920032A5BB989F8E4F5E1B05093D3F130F984C07A772A3683F4DC6FB28A96815B32123CCDD13954F19D5B8B24A103E771A34C328755C65ED64E1924FFD04D30B2142CC262F6E0048FEF6DBC652F21479EA1C4B1D66D28F4D46EF7185E390CBFA2E02380582F3188BB94EBBF05D31487A09AFF01FCBB4CD4BFD1F0A833B38C11813C84360BB53C7D4481031C40BAD8713BB6B835CB08098ED15BA31EE4BA728A8C8E10F7294E1B4163B7AEE57277BFD881A6F9D43E02C6925AA3A043FB7FB78D -e = 00260445 -Msg = 68656c6c6f2c20776f726c64 -Sig = 048efbc9eb5f7a6f55f6d7b9f7e6c3ce58e2db226562ca905e7f972e8f43b6969b0ad878e0d6b290c5bbf2c05410a1efc9de051d91e5faa537e454306f5f526c828379fe28a17e50c8bd4e7c834479da482305a78e198c988a177b9263cea27a2a99c0da98e03b0cc8d880eccdeba7c16dd07f78d980739753690953d1b63106145a80059ed38f52100a9a8d2c7c5371d91b70ce5b7b36d6b97ebef8798d09c01e5b6cb8a6a7fd1a4100d3527327b7d23f8a26187985d8702f8951346ea4a7253e87f765ef587a728021bff37be55d1a8639809e3453ea5a2da482bfedeae18579b51037cfecff5bece21d8c82ee6fa8eb0f43c43c3a23a983c3a2eea4e7d2dc -Result = Fail - -# Repeat basic test with right zero-padded n -n = CEA80475324C1DC8347827818DA58BAC069D3419C614A6EA1AC6A3B510DCD72CC516954905E9FEF908D45E13006ADF27D467A7D83C111D1A5DF15EF293771AEFB920032A5BB989F8E4F5E1B05093D3F130F984C07A772A3683F4DC6FB28A96815B32123CCDD13954F19D5B8B24A103E771A34C328755C65ED64E1924FFD04D30B2142CC262F6E0048FEF6DBC652F21479EA1C4B1D66D28F4D46EF7185E390CBFA2E02380582F3188BB94EBBF05D31487A09AFF01FCBB4CD4BFD1F0A833B38C11813C84360BB53C7D4481031C40BAD8713BB6B835CB08098ED15BA31EE4BA728A8C8E10F7294E1B4163B7AEE57277BFD881A6F9D43E02C6925AA3A043FB7FB78D00 -e = 260445 -Msg = 68656c6c6f2c20776f726c64 -Sig = 048efbc9eb5f7a6f55f6d7b9f7e6c3ce58e2db226562ca905e7f972e8f43b6969b0ad878e0d6b290c5bbf2c05410a1efc9de051d91e5faa537e454306f5f526c828379fe28a17e50c8bd4e7c834479da482305a78e198c988a177b9263cea27a2a99c0da98e03b0cc8d880eccdeba7c16dd07f78d980739753690953d1b63106145a80059ed38f52100a9a8d2c7c5371d91b70ce5b7b36d6b97ebef8798d09c01e5b6cb8a6a7fd1a4100d3527327b7d23f8a26187985d8702f8951346ea4a7253e87f765ef587a728021bff37be55d1a8639809e3453ea5a2da482bfedeae18579b51037cfecff5bece21d8c82ee6fa8eb0f43c43c3a23a983c3a2eea4e7d2dc -Result = Fail - -# Repeat basic test with right zero-padded e -n = CEA80475324C1DC8347827818DA58BAC069D3419C614A6EA1AC6A3B510DCD72CC516954905E9FEF908D45E13006ADF27D467A7D83C111D1A5DF15EF293771AEFB920032A5BB989F8E4F5E1B05093D3F130F984C07A772A3683F4DC6FB28A96815B32123CCDD13954F19D5B8B24A103E771A34C328755C65ED64E1924FFD04D30B2142CC262F6E0048FEF6DBC652F21479EA1C4B1D66D28F4D46EF7185E390CBFA2E02380582F3188BB94EBBF05D31487A09AFF01FCBB4CD4BFD1F0A833B38C11813C84360BB53C7D4481031C40BAD8713BB6B835CB08098ED15BA31EE4BA728A8C8E10F7294E1B4163B7AEE57277BFD881A6F9D43E02C6925AA3A043FB7FB78D -e = 26044500 -Msg = 68656c6c6f2c20776f726c64 -Sig = 048efbc9eb5f7a6f55f6d7b9f7e6c3ce58e2db226562ca905e7f972e8f43b6969b0ad878e0d6b290c5bbf2c05410a1efc9de051d91e5faa537e454306f5f526c828379fe28a17e50c8bd4e7c834479da482305a78e198c988a177b9263cea27a2a99c0da98e03b0cc8d880eccdeba7c16dd07f78d980739753690953d1b63106145a80059ed38f52100a9a8d2c7c5371d91b70ce5b7b36d6b97ebef8798d09c01e5b6cb8a6a7fd1a4100d3527327b7d23f8a26187985d8702f8951346ea4a7253e87f765ef587a728021bff37be55d1a8639809e3453ea5a2da482bfedeae18579b51037cfecff5bece21d8c82ee6fa8eb0f43c43c3a23a983c3a2eea4e7d2dc -Result = Fail diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/tests/rsa_pss_sign_tests.txt temporalio-1.3.0/vendor/ring-0.16.20/tests/rsa_pss_sign_tests.txt --- temporalio-1.3.0/vendor/ring-0.16.20/tests/rsa_pss_sign_tests.txt 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/tests/rsa_pss_sign_tests.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,151 +0,0 @@ -# RSA PSS Test Vectors for FIPS 186-4 from SigGenPSS_186-3.txt in -# http://csrc.nist.gov/groups/STM/cavp/documents/dss/186-3rsatestvectors.zip -# accessible from -# http://csrc.nist.gov/groups/STM/cavp/digital-signatures.html#test-vectors -# with SHA-384 digest e918e2fda7c3159676ed33547b08e1dd4ec2fcbd0799d51510ce69b5d7302132b6fdf793709a3509773313b5d507081b -# filtered and reformatted using convert_nist_rsa_test_vectors.py. -# -# Digest = SHAAlg. -# Key is an ASN.1 (DER) RSAPrivateKey. -# Sig = S. - -Digest = SHA256 -Key = 308206e40201000282018100a7a1882a7fb896786034d07fb1b9f6327c27bdd7ce6fe39c285ae3b6c34259adc0dc4f7b9c7dec3ca4a20d3407339eedd7a12a421da18f5954673cac2ff059156ecc73c6861ec761e6a0f2a5a033a6768c6a42d8b459e1b4932349e84efd92df59b45935f3d0e30817c66201aa99d07ae36c5d74f408d69cc08f044151ff4960e531360cb19077833adf7bce77ecfaa133c0ccc63c93b856814569e0b9884ee554061b9a20ab46c38263c094dae791aa61a17f8d16f0e85b7e5ce3b067ece89e20bc4e8f1ae814b276d234e04f4e766f501da74ea7e3817c24ea35d016676cece652b823b051625573ca92757fc720d254ecf1dcbbfd21d98307561ecaab545480c7c52ad7e9fa6b597f5fe550559c2fe923205ac1761a99737ca02d7b19822e008a8969349c87fb874c81620e38f613c8521f0381fe5ba55b74827dad3e1cf2aa29c6933629f2b286ad11be88fa6436e7e3f64a75e3595290dc0d1cd5eee7aaac54959cc53bd5a934a365e72dd81a2bd4fb9a67821bffedf2ef2bd94913de8b02031415a702820180073a5fc4cd642f6113dffc4f84035cee3a2b8acc549703751a1d6a5eaa13487229a58ef7d7a522bb9f4f25510f1aa0f74c6a8fc8a5c5be8b91a674ede50e92f7e34a90a3c9da999fffb1d695e4588f451256c163484c151350cb9c7825a7d910845ee5cf826fecf9a7c0fbbbba22bb4a531c131d2e7761ba898f002ebef8ab87218511f81d3266e1ec07a7ca8622514c6dfdc86c67679a2c8f5f031de9a0c22b5a88060b46ee0c64d3b9af3c0a379bcd9c6a1b51cf6480456d3fd6def94cd2a6c171dd3f010e3c9d662bc857208248c94ebcb9fd997b9ff4a7e5fd95558569906525e741d78344f6f6cfdbd59d4faa52ee3fa964fb7cccb2d6be1935d211fe1498217716273939a946081fd8509913fd47747c5c2f03efd4d6fc9c6fcfd8402e9f40a0a5b3de3ca2b3c0fac9456938faa6cf2c20e3912e5981c9876d8ca1ff29b87a15eeae0ccce3f8a8f1e405091c083b98bcc5fe0d0deaae33c67c0394437f0eccb385b7efb17aeebba8afaecca30a2f63eac8f0ac8f1eacad85bbcaf3960b0281c100dd553696db8ccb107609b8917e688bdd8373a8926bc9d114c1c77f7958070e236ca1bd2025ded59a71093b63afbfce39e92bde9ffca983959e7c3e18d75650612258c24eebb61a1b4a68603a2721e3e2483d6da27475a228b1341c78f140948b5c922822ccaed76dae338dddec1e4c5c34b9c53f34a09ff0b2b61a62254e73e6f0ac8013edc2cfa7ecbeb86fcc7309cb0f5b5eddb707af4b9337d34d672af413f3b6efd11e3b49c978f06a356f6f4e0ea50a90797fe32ccaa983547ff18ea1670281c100c1e3089e1bea1141638ca912da01c134f67231a2f737d97e28486e004a43e9c5592ff968ee18109fc71aa4c1a97aa88ece5c4734352bc0c1f67726bc4aac59c19301f23a705be5b3f7825fb284e58a950d795f63d18fe72231eaba9d6a5f90866f8dd34b2b0dfc132db8348efa5a62634e5584a788aebbf073ccb4f3e9f5cde8d0c2e831412485c7f8cf1473abffabcc5d51d8a2a87a22f39d1a250b3cb66d90c573669071aeba9b1080dc079243094a9ae0e5a62e4e8b653cb57f54f4eeaf3d0281c05f8d638d1e0c47794d9305929b4b87281b69397f51b0809573edeb3dcb82f2376ee419491adfa4a9d7f6db51d9573f50d025cc64030744c05794d3350a8bd45b3c5a69b8552e6cbfa2038fb33d4094dd8bb1095c36d4356a88c6ba114cad0c5acfdd224b3f4bc1af30f9a1ee5ea5407a8ce3c71dd09a1ea33f44e63cb9c0cae176515e1e323874adc5c2b788e23bae5123a90b964e44ec2e9be90b496bb537967d05715e3737cd4c35f2bc87ab7cc9ee70116ed2528b3d62237413dfc56e0e470281c1008ced58a9828526335c9517b5ac58c5ae7e74c9c36a7e6c7f571878f3319f52cb8eeaeeee64694ee4a49e582c53b77adac0fb6c808830560c4f130d925e7cbbcaa1221c8a4d54ce116b4c4ce52a56882c5c38000c441673cb91d381a3c5b09cd8ad3d74841fb8d7f9d5cebc4bfd273d2fe28a08fc2df6a57207bef71c6a9d63d54a0d7677d450c6a6d4e9a937a82be8cd4a1677e7ac04712949c7683f412862d40aeaa899640503aabc8794a5ff13e7c72df049ee0fb8203a99fe94a5003c225b0281c10087d010acad9e1540cbfb2c03dcd987d3c2fbd0fa2cd10f2e5b216fad7016a58a98fb43fcaee266b21c99d213089696a0faea4710f8ee7bd9a5eb2452341e58feec965d76e2133236f8b44e8bdd86a591acf8af501cdcc1a5cb1065793b09c0a5536ed414cca22163758b0b41add238e62ea07acba89144f97b9e1509584210aced89986fead9b3d22253f0a7a7372e269a01356070d2e1afac08da15cf23ad29438b0b3fc8d9e8e9f99c8ca970ae703cca71974335adb96a16e85c97689c3a8c -Msg = c16499110ed577202aed2d3e4d51ded6c66373faef6533a860e1934c63484f87a8d9b92f3ac45197b2909710abba1daf759fe0510e9bd8dd4d73cec961f06ee07acd9d42c6d40dac9f430ef90374a7e944bde5220096737454f96b614d0f6cdd9f08ed529a4ad0e759cf3a023dc8a30b9a872974af9b2af6dc3d111d0feb7006 -Salt = 3e07ade72a3f52530f53135a5d7d93217435ba001ea55a8f5d5d1304684874bc -Sig = 4335707da735cfd10411c9c048ca9b60bb46e2fe361e51fbe336f9508dc945afe075503d24f836610f2178996b52c411693052d5d7aed97654a40074ed20ed6689c0501b7fbac21dc46b665ac079760086414406cd66f8537d1ebf0dce4cf0c98d4c30c71da359e9cd401ff49718fdd4d0f99efe70ad8dd8ba1304cefb88f24b0eedf70116da15932c76f0069551a245b5fc3b91ec101f1d63b9853b598c6fa1c1acdbacf9626356c760119be0955644301896d9d0d3ea5e6443cb72ca29f4d45246d16d74d00568c219182feb191179e4593dc152c608fd80536329a533b3a631566814cd654f587c2d8ce696085e6ed1b0b0278e60a049ec7a399f94fccae6462371a69695ef525e00936fa7d9781f9ee289d4105ee827a27996583033cedb2f297e7b4926d906ce0d09d84128406ab33d7da0f8a1d4d2f666568686c394d139b0e5e99337758de85910a5fa25ca2aa6d8fb1c777244e7d98de4c79bbd426a5e6f657e37477e01247432f83797fbf31b50d02b83f69ded26d4945b2bc3f86e -Result = Pass - -Digest = SHA256 -Key = 308206e40201000282018100a7a1882a7fb896786034d07fb1b9f6327c27bdd7ce6fe39c285ae3b6c34259adc0dc4f7b9c7dec3ca4a20d3407339eedd7a12a421da18f5954673cac2ff059156ecc73c6861ec761e6a0f2a5a033a6768c6a42d8b459e1b4932349e84efd92df59b45935f3d0e30817c66201aa99d07ae36c5d74f408d69cc08f044151ff4960e531360cb19077833adf7bce77ecfaa133c0ccc63c93b856814569e0b9884ee554061b9a20ab46c38263c094dae791aa61a17f8d16f0e85b7e5ce3b067ece89e20bc4e8f1ae814b276d234e04f4e766f501da74ea7e3817c24ea35d016676cece652b823b051625573ca92757fc720d254ecf1dcbbfd21d98307561ecaab545480c7c52ad7e9fa6b597f5fe550559c2fe923205ac1761a99737ca02d7b19822e008a8969349c87fb874c81620e38f613c8521f0381fe5ba55b74827dad3e1cf2aa29c6933629f2b286ad11be88fa6436e7e3f64a75e3595290dc0d1cd5eee7aaac54959cc53bd5a934a365e72dd81a2bd4fb9a67821bffedf2ef2bd94913de8b02031415a702820180073a5fc4cd642f6113dffc4f84035cee3a2b8acc549703751a1d6a5eaa13487229a58ef7d7a522bb9f4f25510f1aa0f74c6a8fc8a5c5be8b91a674ede50e92f7e34a90a3c9da999fffb1d695e4588f451256c163484c151350cb9c7825a7d910845ee5cf826fecf9a7c0fbbbba22bb4a531c131d2e7761ba898f002ebef8ab87218511f81d3266e1ec07a7ca8622514c6dfdc86c67679a2c8f5f031de9a0c22b5a88060b46ee0c64d3b9af3c0a379bcd9c6a1b51cf6480456d3fd6def94cd2a6c171dd3f010e3c9d662bc857208248c94ebcb9fd997b9ff4a7e5fd95558569906525e741d78344f6f6cfdbd59d4faa52ee3fa964fb7cccb2d6be1935d211fe1498217716273939a946081fd8509913fd47747c5c2f03efd4d6fc9c6fcfd8402e9f40a0a5b3de3ca2b3c0fac9456938faa6cf2c20e3912e5981c9876d8ca1ff29b87a15eeae0ccce3f8a8f1e405091c083b98bcc5fe0d0deaae33c67c0394437f0eccb385b7efb17aeebba8afaecca30a2f63eac8f0ac8f1eacad85bbcaf3960b0281c100dd553696db8ccb107609b8917e688bdd8373a8926bc9d114c1c77f7958070e236ca1bd2025ded59a71093b63afbfce39e92bde9ffca983959e7c3e18d75650612258c24eebb61a1b4a68603a2721e3e2483d6da27475a228b1341c78f140948b5c922822ccaed76dae338dddec1e4c5c34b9c53f34a09ff0b2b61a62254e73e6f0ac8013edc2cfa7ecbeb86fcc7309cb0f5b5eddb707af4b9337d34d672af413f3b6efd11e3b49c978f06a356f6f4e0ea50a90797fe32ccaa983547ff18ea1670281c100c1e3089e1bea1141638ca912da01c134f67231a2f737d97e28486e004a43e9c5592ff968ee18109fc71aa4c1a97aa88ece5c4734352bc0c1f67726bc4aac59c19301f23a705be5b3f7825fb284e58a950d795f63d18fe72231eaba9d6a5f90866f8dd34b2b0dfc132db8348efa5a62634e5584a788aebbf073ccb4f3e9f5cde8d0c2e831412485c7f8cf1473abffabcc5d51d8a2a87a22f39d1a250b3cb66d90c573669071aeba9b1080dc079243094a9ae0e5a62e4e8b653cb57f54f4eeaf3d0281c05f8d638d1e0c47794d9305929b4b87281b69397f51b0809573edeb3dcb82f2376ee419491adfa4a9d7f6db51d9573f50d025cc64030744c05794d3350a8bd45b3c5a69b8552e6cbfa2038fb33d4094dd8bb1095c36d4356a88c6ba114cad0c5acfdd224b3f4bc1af30f9a1ee5ea5407a8ce3c71dd09a1ea33f44e63cb9c0cae176515e1e323874adc5c2b788e23bae5123a90b964e44ec2e9be90b496bb537967d05715e3737cd4c35f2bc87ab7cc9ee70116ed2528b3d62237413dfc56e0e470281c1008ced58a9828526335c9517b5ac58c5ae7e74c9c36a7e6c7f571878f3319f52cb8eeaeeee64694ee4a49e582c53b77adac0fb6c808830560c4f130d925e7cbbcaa1221c8a4d54ce116b4c4ce52a56882c5c38000c441673cb91d381a3c5b09cd8ad3d74841fb8d7f9d5cebc4bfd273d2fe28a08fc2df6a57207bef71c6a9d63d54a0d7677d450c6a6d4e9a937a82be8cd4a1677e7ac04712949c7683f412862d40aeaa899640503aabc8794a5ff13e7c72df049ee0fb8203a99fe94a5003c225b0281c10087d010acad9e1540cbfb2c03dcd987d3c2fbd0fa2cd10f2e5b216fad7016a58a98fb43fcaee266b21c99d213089696a0faea4710f8ee7bd9a5eb2452341e58feec965d76e2133236f8b44e8bdd86a591acf8af501cdcc1a5cb1065793b09c0a5536ed414cca22163758b0b41add238e62ea07acba89144f97b9e1509584210aced89986fead9b3d22253f0a7a7372e269a01356070d2e1afac08da15cf23ad29438b0b3fc8d9e8e9f99c8ca970ae703cca71974335adb96a16e85c97689c3a8c -Msg = 60402ded89d0979afb49f8508eb978a841abc2aec59cacef40b31ad34bac1f2d3c166611abbed1e62f6b5fbb69cb53df44ae93ab7a724ea35bbee1beca74fc0188e00052b536ac8c933bf9cf8e42421a795aa81b1bc6b545eaad4024161390edc908c45aae1f71b4b0228e3104048d816917cba4ae7f2afe75e7fcad3873241a -Salt = 3e07ade72a3f52530f53135a5d7d93217435ba001ea55a8f5d5d1304684874bc -Sig = 5f183009708b379637dac2b14293709aa6d7e86c267a0b690a3c275031139891267c64e5edecdff14c2cc2f2d985b62f900aee6e04ca51a70a5f946463691cf16c2d45547c5374f15bdb8881641d3040ef57807532cf5b2ced07623d0f638b39ebc2f2ce283eea2247e1df3af5430554d1d4b88b7b21622993419971b7d0d5449122a10fc31b2ddcc53ff751ff4bf4d336fac667b646780272db89a3ea4226afa20877bfb86ba3ff4204e5cd56e13a1dc9d53f5c9465b97a182b2bf671512ef89e6c3969f97307a3e4beba39a78e0ad1bb9799cda92976ca39d99db4ac149c84bb9bc8997e8d5e056d67ca23fe4be28e66c4bc00a25d65bb9d7d623fea2d3b9cf859dfd9efa9e52268bfa297afb1cc2883db0c9c42fc04180e2ec6f49657c7008e4025061f896886613895a35bc2d3655a8f50a9fca2ac648f352eb06bfba2fc340aaeead4a8457c65e2e8fdba568c60a6d8d381f5d9caa30127771f4a94fdb8cde7be4fa7b4f89fe379dd3e1ca66ae1fdd63bebdc0015448e61ef1666594b8f -Result = Pass - -Digest = SHA256 -Key = 308206e40201000282018100a7a1882a7fb896786034d07fb1b9f6327c27bdd7ce6fe39c285ae3b6c34259adc0dc4f7b9c7dec3ca4a20d3407339eedd7a12a421da18f5954673cac2ff059156ecc73c6861ec761e6a0f2a5a033a6768c6a42d8b459e1b4932349e84efd92df59b45935f3d0e30817c66201aa99d07ae36c5d74f408d69cc08f044151ff4960e531360cb19077833adf7bce77ecfaa133c0ccc63c93b856814569e0b9884ee554061b9a20ab46c38263c094dae791aa61a17f8d16f0e85b7e5ce3b067ece89e20bc4e8f1ae814b276d234e04f4e766f501da74ea7e3817c24ea35d016676cece652b823b051625573ca92757fc720d254ecf1dcbbfd21d98307561ecaab545480c7c52ad7e9fa6b597f5fe550559c2fe923205ac1761a99737ca02d7b19822e008a8969349c87fb874c81620e38f613c8521f0381fe5ba55b74827dad3e1cf2aa29c6933629f2b286ad11be88fa6436e7e3f64a75e3595290dc0d1cd5eee7aaac54959cc53bd5a934a365e72dd81a2bd4fb9a67821bffedf2ef2bd94913de8b02031415a702820180073a5fc4cd642f6113dffc4f84035cee3a2b8acc549703751a1d6a5eaa13487229a58ef7d7a522bb9f4f25510f1aa0f74c6a8fc8a5c5be8b91a674ede50e92f7e34a90a3c9da999fffb1d695e4588f451256c163484c151350cb9c7825a7d910845ee5cf826fecf9a7c0fbbbba22bb4a531c131d2e7761ba898f002ebef8ab87218511f81d3266e1ec07a7ca8622514c6dfdc86c67679a2c8f5f031de9a0c22b5a88060b46ee0c64d3b9af3c0a379bcd9c6a1b51cf6480456d3fd6def94cd2a6c171dd3f010e3c9d662bc857208248c94ebcb9fd997b9ff4a7e5fd95558569906525e741d78344f6f6cfdbd59d4faa52ee3fa964fb7cccb2d6be1935d211fe1498217716273939a946081fd8509913fd47747c5c2f03efd4d6fc9c6fcfd8402e9f40a0a5b3de3ca2b3c0fac9456938faa6cf2c20e3912e5981c9876d8ca1ff29b87a15eeae0ccce3f8a8f1e405091c083b98bcc5fe0d0deaae33c67c0394437f0eccb385b7efb17aeebba8afaecca30a2f63eac8f0ac8f1eacad85bbcaf3960b0281c100dd553696db8ccb107609b8917e688bdd8373a8926bc9d114c1c77f7958070e236ca1bd2025ded59a71093b63afbfce39e92bde9ffca983959e7c3e18d75650612258c24eebb61a1b4a68603a2721e3e2483d6da27475a228b1341c78f140948b5c922822ccaed76dae338dddec1e4c5c34b9c53f34a09ff0b2b61a62254e73e6f0ac8013edc2cfa7ecbeb86fcc7309cb0f5b5eddb707af4b9337d34d672af413f3b6efd11e3b49c978f06a356f6f4e0ea50a90797fe32ccaa983547ff18ea1670281c100c1e3089e1bea1141638ca912da01c134f67231a2f737d97e28486e004a43e9c5592ff968ee18109fc71aa4c1a97aa88ece5c4734352bc0c1f67726bc4aac59c19301f23a705be5b3f7825fb284e58a950d795f63d18fe72231eaba9d6a5f90866f8dd34b2b0dfc132db8348efa5a62634e5584a788aebbf073ccb4f3e9f5cde8d0c2e831412485c7f8cf1473abffabcc5d51d8a2a87a22f39d1a250b3cb66d90c573669071aeba9b1080dc079243094a9ae0e5a62e4e8b653cb57f54f4eeaf3d0281c05f8d638d1e0c47794d9305929b4b87281b69397f51b0809573edeb3dcb82f2376ee419491adfa4a9d7f6db51d9573f50d025cc64030744c05794d3350a8bd45b3c5a69b8552e6cbfa2038fb33d4094dd8bb1095c36d4356a88c6ba114cad0c5acfdd224b3f4bc1af30f9a1ee5ea5407a8ce3c71dd09a1ea33f44e63cb9c0cae176515e1e323874adc5c2b788e23bae5123a90b964e44ec2e9be90b496bb537967d05715e3737cd4c35f2bc87ab7cc9ee70116ed2528b3d62237413dfc56e0e470281c1008ced58a9828526335c9517b5ac58c5ae7e74c9c36a7e6c7f571878f3319f52cb8eeaeeee64694ee4a49e582c53b77adac0fb6c808830560c4f130d925e7cbbcaa1221c8a4d54ce116b4c4ce52a56882c5c38000c441673cb91d381a3c5b09cd8ad3d74841fb8d7f9d5cebc4bfd273d2fe28a08fc2df6a57207bef71c6a9d63d54a0d7677d450c6a6d4e9a937a82be8cd4a1677e7ac04712949c7683f412862d40aeaa899640503aabc8794a5ff13e7c72df049ee0fb8203a99fe94a5003c225b0281c10087d010acad9e1540cbfb2c03dcd987d3c2fbd0fa2cd10f2e5b216fad7016a58a98fb43fcaee266b21c99d213089696a0faea4710f8ee7bd9a5eb2452341e58feec965d76e2133236f8b44e8bdd86a591acf8af501cdcc1a5cb1065793b09c0a5536ed414cca22163758b0b41add238e62ea07acba89144f97b9e1509584210aced89986fead9b3d22253f0a7a7372e269a01356070d2e1afac08da15cf23ad29438b0b3fc8d9e8e9f99c8ca970ae703cca71974335adb96a16e85c97689c3a8c -Msg = 2f03701c2fe07d47f5fa2c83a8ea824f1d429ce4fa1df2671bfadd6234ca5775b8470249fa886dc693d2928603b2a3899b48062a9ae69e5196da4ceb1d87b5979dbb46a2813c76369da44bcecc6f20edd753a51099d027e1610712ad98cfb418a40643100b2522ffdc1760454b4c82e59b09827e4102177e462a3792edcada61 -Salt = 3e07ade72a3f52530f53135a5d7d93217435ba001ea55a8f5d5d1304684874bc -Sig = 8291bc1be9c981663156ec80c1ed1675763de06199b9f2760caaed5207fb4b3d6037bd08462b100bb1767e3340105b1a68728bc45c7d6fd078dc1b5e7cbfa193006d52f67e77fcf809cf26172a46db384eaf552a5fb8e33840fa3ef3d6b20c7b46c32ef019e8d15dd38eab66f6e40399ad0bbb07f94b8c555196901c27e2d4573958f53060d800cfff40c602308044b75d6451801c688d276525c3fee17a6792882a074c8a41420109e2511418c9eeaf3ab47350dd8c2d3e066abeb7913e08f0a40abe71d397c3dddafc41fbd04cc8fa3b0641bf53a90031b61a2a9b63d8ed8aacc9b301593c9f425105498cc4f84627f4950758e01a291b9b1a33ba918aacc172b68c9fb2c767c65910816921281aa8e5482512cee686e51cabe88e18f923fde170a506ba3c340fd1d68261986347d30d124931db2ce17602150000b794c050e137f4ebd45cc41f70ef3df1656218ff76f2e75ad96e4167eed524fa2ed9fd1a0cf76926f382ffb16124dfc87bb1a4110928d5b1cd3b16204ceeeccb7db88fce -Result = Pass - -Digest = SHA256 -Key = 308206e40201000282018100a7a1882a7fb896786034d07fb1b9f6327c27bdd7ce6fe39c285ae3b6c34259adc0dc4f7b9c7dec3ca4a20d3407339eedd7a12a421da18f5954673cac2ff059156ecc73c6861ec761e6a0f2a5a033a6768c6a42d8b459e1b4932349e84efd92df59b45935f3d0e30817c66201aa99d07ae36c5d74f408d69cc08f044151ff4960e531360cb19077833adf7bce77ecfaa133c0ccc63c93b856814569e0b9884ee554061b9a20ab46c38263c094dae791aa61a17f8d16f0e85b7e5ce3b067ece89e20bc4e8f1ae814b276d234e04f4e766f501da74ea7e3817c24ea35d016676cece652b823b051625573ca92757fc720d254ecf1dcbbfd21d98307561ecaab545480c7c52ad7e9fa6b597f5fe550559c2fe923205ac1761a99737ca02d7b19822e008a8969349c87fb874c81620e38f613c8521f0381fe5ba55b74827dad3e1cf2aa29c6933629f2b286ad11be88fa6436e7e3f64a75e3595290dc0d1cd5eee7aaac54959cc53bd5a934a365e72dd81a2bd4fb9a67821bffedf2ef2bd94913de8b02031415a702820180073a5fc4cd642f6113dffc4f84035cee3a2b8acc549703751a1d6a5eaa13487229a58ef7d7a522bb9f4f25510f1aa0f74c6a8fc8a5c5be8b91a674ede50e92f7e34a90a3c9da999fffb1d695e4588f451256c163484c151350cb9c7825a7d910845ee5cf826fecf9a7c0fbbbba22bb4a531c131d2e7761ba898f002ebef8ab87218511f81d3266e1ec07a7ca8622514c6dfdc86c67679a2c8f5f031de9a0c22b5a88060b46ee0c64d3b9af3c0a379bcd9c6a1b51cf6480456d3fd6def94cd2a6c171dd3f010e3c9d662bc857208248c94ebcb9fd997b9ff4a7e5fd95558569906525e741d78344f6f6cfdbd59d4faa52ee3fa964fb7cccb2d6be1935d211fe1498217716273939a946081fd8509913fd47747c5c2f03efd4d6fc9c6fcfd8402e9f40a0a5b3de3ca2b3c0fac9456938faa6cf2c20e3912e5981c9876d8ca1ff29b87a15eeae0ccce3f8a8f1e405091c083b98bcc5fe0d0deaae33c67c0394437f0eccb385b7efb17aeebba8afaecca30a2f63eac8f0ac8f1eacad85bbcaf3960b0281c100dd553696db8ccb107609b8917e688bdd8373a8926bc9d114c1c77f7958070e236ca1bd2025ded59a71093b63afbfce39e92bde9ffca983959e7c3e18d75650612258c24eebb61a1b4a68603a2721e3e2483d6da27475a228b1341c78f140948b5c922822ccaed76dae338dddec1e4c5c34b9c53f34a09ff0b2b61a62254e73e6f0ac8013edc2cfa7ecbeb86fcc7309cb0f5b5eddb707af4b9337d34d672af413f3b6efd11e3b49c978f06a356f6f4e0ea50a90797fe32ccaa983547ff18ea1670281c100c1e3089e1bea1141638ca912da01c134f67231a2f737d97e28486e004a43e9c5592ff968ee18109fc71aa4c1a97aa88ece5c4734352bc0c1f67726bc4aac59c19301f23a705be5b3f7825fb284e58a950d795f63d18fe72231eaba9d6a5f90866f8dd34b2b0dfc132db8348efa5a62634e5584a788aebbf073ccb4f3e9f5cde8d0c2e831412485c7f8cf1473abffabcc5d51d8a2a87a22f39d1a250b3cb66d90c573669071aeba9b1080dc079243094a9ae0e5a62e4e8b653cb57f54f4eeaf3d0281c05f8d638d1e0c47794d9305929b4b87281b69397f51b0809573edeb3dcb82f2376ee419491adfa4a9d7f6db51d9573f50d025cc64030744c05794d3350a8bd45b3c5a69b8552e6cbfa2038fb33d4094dd8bb1095c36d4356a88c6ba114cad0c5acfdd224b3f4bc1af30f9a1ee5ea5407a8ce3c71dd09a1ea33f44e63cb9c0cae176515e1e323874adc5c2b788e23bae5123a90b964e44ec2e9be90b496bb537967d05715e3737cd4c35f2bc87ab7cc9ee70116ed2528b3d62237413dfc56e0e470281c1008ced58a9828526335c9517b5ac58c5ae7e74c9c36a7e6c7f571878f3319f52cb8eeaeeee64694ee4a49e582c53b77adac0fb6c808830560c4f130d925e7cbbcaa1221c8a4d54ce116b4c4ce52a56882c5c38000c441673cb91d381a3c5b09cd8ad3d74841fb8d7f9d5cebc4bfd273d2fe28a08fc2df6a57207bef71c6a9d63d54a0d7677d450c6a6d4e9a937a82be8cd4a1677e7ac04712949c7683f412862d40aeaa899640503aabc8794a5ff13e7c72df049ee0fb8203a99fe94a5003c225b0281c10087d010acad9e1540cbfb2c03dcd987d3c2fbd0fa2cd10f2e5b216fad7016a58a98fb43fcaee266b21c99d213089696a0faea4710f8ee7bd9a5eb2452341e58feec965d76e2133236f8b44e8bdd86a591acf8af501cdcc1a5cb1065793b09c0a5536ed414cca22163758b0b41add238e62ea07acba89144f97b9e1509584210aced89986fead9b3d22253f0a7a7372e269a01356070d2e1afac08da15cf23ad29438b0b3fc8d9e8e9f99c8ca970ae703cca71974335adb96a16e85c97689c3a8c -Msg = af90f131f9fc13db0bcebfae4a2e90ad39dc533f34165e3262bc23ffe5b20450538669bf6a5210e1ffe4a583381d9333fb971903a68aa08901f14c2a71e8d1996e59889a36d7c20cc3ca5c26fbcd930128541a56a7926a8ae49a5ae786c4ef2de6527549c653ce6440c80b1ffc06391da65b7dc39ff4643bf3fe74bf8c0c0714 -Salt = 3e07ade72a3f52530f53135a5d7d93217435ba001ea55a8f5d5d1304684874bc -Sig = 8c45e38eafaaf10a710e131bec63e51e67741774a9ddbfccdd131a123ae2a03067e7a6a92e653a25178bf527b93d6aa83fa366a2bd44896baa8b7f3f54830e4d9f5632c2d1bcae2aaae8c55782132aa7279cf1cbb6b7a81e4965ff84635c296c5ac206a04680e91e7b1ee7e5793701b1feb832250010d4ad4017c1608de8f405014ca73c39adae7c4adcbaee35fbbc71151cf955acecd8083677fe49ececcb62353c0a89c9dcb9c507979b56bfe060fec45567517c05f29e262df50767df7547630d8a7b32483b923bb1e3d510422dd4cc2d61a647e4f9636aa7587d4f8ed84b6174c1fdca9a217d9b907972a66c1f5a2ec2dadb60b93b515bf74072d315d17d54d57d721c8f4ce1a43eedf2025e51a48e9ea28160cf300d7a26010383c3280a186c44a53b7188e6caa364bf4dbe0baf4dcbe37d70e3a475cfdae339386558ccbc119873b1863975e2300ede1e420031b4cdac567e7b9c5d575c8bae27eebb37097050acdc87008ca2380f5631d190029a1d712acda147c5c4378cb6eac81731 -Result = Pass - -Digest = SHA256 -Key = 308206e40201000282018100a7a1882a7fb896786034d07fb1b9f6327c27bdd7ce6fe39c285ae3b6c34259adc0dc4f7b9c7dec3ca4a20d3407339eedd7a12a421da18f5954673cac2ff059156ecc73c6861ec761e6a0f2a5a033a6768c6a42d8b459e1b4932349e84efd92df59b45935f3d0e30817c66201aa99d07ae36c5d74f408d69cc08f044151ff4960e531360cb19077833adf7bce77ecfaa133c0ccc63c93b856814569e0b9884ee554061b9a20ab46c38263c094dae791aa61a17f8d16f0e85b7e5ce3b067ece89e20bc4e8f1ae814b276d234e04f4e766f501da74ea7e3817c24ea35d016676cece652b823b051625573ca92757fc720d254ecf1dcbbfd21d98307561ecaab545480c7c52ad7e9fa6b597f5fe550559c2fe923205ac1761a99737ca02d7b19822e008a8969349c87fb874c81620e38f613c8521f0381fe5ba55b74827dad3e1cf2aa29c6933629f2b286ad11be88fa6436e7e3f64a75e3595290dc0d1cd5eee7aaac54959cc53bd5a934a365e72dd81a2bd4fb9a67821bffedf2ef2bd94913de8b02031415a702820180073a5fc4cd642f6113dffc4f84035cee3a2b8acc549703751a1d6a5eaa13487229a58ef7d7a522bb9f4f25510f1aa0f74c6a8fc8a5c5be8b91a674ede50e92f7e34a90a3c9da999fffb1d695e4588f451256c163484c151350cb9c7825a7d910845ee5cf826fecf9a7c0fbbbba22bb4a531c131d2e7761ba898f002ebef8ab87218511f81d3266e1ec07a7ca8622514c6dfdc86c67679a2c8f5f031de9a0c22b5a88060b46ee0c64d3b9af3c0a379bcd9c6a1b51cf6480456d3fd6def94cd2a6c171dd3f010e3c9d662bc857208248c94ebcb9fd997b9ff4a7e5fd95558569906525e741d78344f6f6cfdbd59d4faa52ee3fa964fb7cccb2d6be1935d211fe1498217716273939a946081fd8509913fd47747c5c2f03efd4d6fc9c6fcfd8402e9f40a0a5b3de3ca2b3c0fac9456938faa6cf2c20e3912e5981c9876d8ca1ff29b87a15eeae0ccce3f8a8f1e405091c083b98bcc5fe0d0deaae33c67c0394437f0eccb385b7efb17aeebba8afaecca30a2f63eac8f0ac8f1eacad85bbcaf3960b0281c100dd553696db8ccb107609b8917e688bdd8373a8926bc9d114c1c77f7958070e236ca1bd2025ded59a71093b63afbfce39e92bde9ffca983959e7c3e18d75650612258c24eebb61a1b4a68603a2721e3e2483d6da27475a228b1341c78f140948b5c922822ccaed76dae338dddec1e4c5c34b9c53f34a09ff0b2b61a62254e73e6f0ac8013edc2cfa7ecbeb86fcc7309cb0f5b5eddb707af4b9337d34d672af413f3b6efd11e3b49c978f06a356f6f4e0ea50a90797fe32ccaa983547ff18ea1670281c100c1e3089e1bea1141638ca912da01c134f67231a2f737d97e28486e004a43e9c5592ff968ee18109fc71aa4c1a97aa88ece5c4734352bc0c1f67726bc4aac59c19301f23a705be5b3f7825fb284e58a950d795f63d18fe72231eaba9d6a5f90866f8dd34b2b0dfc132db8348efa5a62634e5584a788aebbf073ccb4f3e9f5cde8d0c2e831412485c7f8cf1473abffabcc5d51d8a2a87a22f39d1a250b3cb66d90c573669071aeba9b1080dc079243094a9ae0e5a62e4e8b653cb57f54f4eeaf3d0281c05f8d638d1e0c47794d9305929b4b87281b69397f51b0809573edeb3dcb82f2376ee419491adfa4a9d7f6db51d9573f50d025cc64030744c05794d3350a8bd45b3c5a69b8552e6cbfa2038fb33d4094dd8bb1095c36d4356a88c6ba114cad0c5acfdd224b3f4bc1af30f9a1ee5ea5407a8ce3c71dd09a1ea33f44e63cb9c0cae176515e1e323874adc5c2b788e23bae5123a90b964e44ec2e9be90b496bb537967d05715e3737cd4c35f2bc87ab7cc9ee70116ed2528b3d62237413dfc56e0e470281c1008ced58a9828526335c9517b5ac58c5ae7e74c9c36a7e6c7f571878f3319f52cb8eeaeeee64694ee4a49e582c53b77adac0fb6c808830560c4f130d925e7cbbcaa1221c8a4d54ce116b4c4ce52a56882c5c38000c441673cb91d381a3c5b09cd8ad3d74841fb8d7f9d5cebc4bfd273d2fe28a08fc2df6a57207bef71c6a9d63d54a0d7677d450c6a6d4e9a937a82be8cd4a1677e7ac04712949c7683f412862d40aeaa899640503aabc8794a5ff13e7c72df049ee0fb8203a99fe94a5003c225b0281c10087d010acad9e1540cbfb2c03dcd987d3c2fbd0fa2cd10f2e5b216fad7016a58a98fb43fcaee266b21c99d213089696a0faea4710f8ee7bd9a5eb2452341e58feec965d76e2133236f8b44e8bdd86a591acf8af501cdcc1a5cb1065793b09c0a5536ed414cca22163758b0b41add238e62ea07acba89144f97b9e1509584210aced89986fead9b3d22253f0a7a7372e269a01356070d2e1afac08da15cf23ad29438b0b3fc8d9e8e9f99c8ca970ae703cca71974335adb96a16e85c97689c3a8c -Msg = e57debad3563fa81f4b9819405e41f98a54096d44f6ed119dceb25f8efe7d7329054de70173deb344c59a710cce03b16af9d168f6745eaf0eb07f80916648e804941ce7e583ab0a8a43a4b51844850edeaa4d7c943135efa9e770e9411a2411c586c423fc00353c34483f5bff5c763079f7e60eba98132213d64efffa94af7ed -Salt = 3e07ade72a3f52530f53135a5d7d93217435ba001ea55a8f5d5d1304684874bc -Sig = 851dcd2d4e1d34dae0fd585af126be448d611acaeacfa34f1492aa7d1caff616707dc31b05186cdbef769479243afb341577803b579e105070ad5406a6744f56e55f569370b9fcf6ab10e1aa0383f9182d451afb41358a2f8c29d1a571e11c404e6870cbb04f6ef30414d9b6d7f1416bacab0184eebd8deae72f2a48bea3a7844a8bf472a5f8d349d5973ffde3b1c40623dbaabd6f681485a9691c9be12618bba393b396f41cfeb89e18e378c51f147c7b0ededbc403bb1306454848c9bdb89f947843d0aeaadcdf09bad99efb76e742322521929f034dadffa483958df58a71af7da45461fc408c7c45973fc60c37a6358743315169b3100d4cd54f810d6e0369b9847ee38795cfe58443019523c3c9003edec4cdaa70de31d00958653058d8509907a5149a9f81be0ed028724f7232b57f93dc62ccf093a2635ee1e5bfe6ca9ea017ffab79182eefff542d278c471e1a2b34231700423bd0e757f6a572a14a99c90329dd0701f347d8a679cff25fd6b0d380ee5dc330d6ff1b4b1a347fc98d -Result = Pass - -Digest = SHA256 -Key = 308206e40201000282018100a7a1882a7fb896786034d07fb1b9f6327c27bdd7ce6fe39c285ae3b6c34259adc0dc4f7b9c7dec3ca4a20d3407339eedd7a12a421da18f5954673cac2ff059156ecc73c6861ec761e6a0f2a5a033a6768c6a42d8b459e1b4932349e84efd92df59b45935f3d0e30817c66201aa99d07ae36c5d74f408d69cc08f044151ff4960e531360cb19077833adf7bce77ecfaa133c0ccc63c93b856814569e0b9884ee554061b9a20ab46c38263c094dae791aa61a17f8d16f0e85b7e5ce3b067ece89e20bc4e8f1ae814b276d234e04f4e766f501da74ea7e3817c24ea35d016676cece652b823b051625573ca92757fc720d254ecf1dcbbfd21d98307561ecaab545480c7c52ad7e9fa6b597f5fe550559c2fe923205ac1761a99737ca02d7b19822e008a8969349c87fb874c81620e38f613c8521f0381fe5ba55b74827dad3e1cf2aa29c6933629f2b286ad11be88fa6436e7e3f64a75e3595290dc0d1cd5eee7aaac54959cc53bd5a934a365e72dd81a2bd4fb9a67821bffedf2ef2bd94913de8b02031415a702820180073a5fc4cd642f6113dffc4f84035cee3a2b8acc549703751a1d6a5eaa13487229a58ef7d7a522bb9f4f25510f1aa0f74c6a8fc8a5c5be8b91a674ede50e92f7e34a90a3c9da999fffb1d695e4588f451256c163484c151350cb9c7825a7d910845ee5cf826fecf9a7c0fbbbba22bb4a531c131d2e7761ba898f002ebef8ab87218511f81d3266e1ec07a7ca8622514c6dfdc86c67679a2c8f5f031de9a0c22b5a88060b46ee0c64d3b9af3c0a379bcd9c6a1b51cf6480456d3fd6def94cd2a6c171dd3f010e3c9d662bc857208248c94ebcb9fd997b9ff4a7e5fd95558569906525e741d78344f6f6cfdbd59d4faa52ee3fa964fb7cccb2d6be1935d211fe1498217716273939a946081fd8509913fd47747c5c2f03efd4d6fc9c6fcfd8402e9f40a0a5b3de3ca2b3c0fac9456938faa6cf2c20e3912e5981c9876d8ca1ff29b87a15eeae0ccce3f8a8f1e405091c083b98bcc5fe0d0deaae33c67c0394437f0eccb385b7efb17aeebba8afaecca30a2f63eac8f0ac8f1eacad85bbcaf3960b0281c100dd553696db8ccb107609b8917e688bdd8373a8926bc9d114c1c77f7958070e236ca1bd2025ded59a71093b63afbfce39e92bde9ffca983959e7c3e18d75650612258c24eebb61a1b4a68603a2721e3e2483d6da27475a228b1341c78f140948b5c922822ccaed76dae338dddec1e4c5c34b9c53f34a09ff0b2b61a62254e73e6f0ac8013edc2cfa7ecbeb86fcc7309cb0f5b5eddb707af4b9337d34d672af413f3b6efd11e3b49c978f06a356f6f4e0ea50a90797fe32ccaa983547ff18ea1670281c100c1e3089e1bea1141638ca912da01c134f67231a2f737d97e28486e004a43e9c5592ff968ee18109fc71aa4c1a97aa88ece5c4734352bc0c1f67726bc4aac59c19301f23a705be5b3f7825fb284e58a950d795f63d18fe72231eaba9d6a5f90866f8dd34b2b0dfc132db8348efa5a62634e5584a788aebbf073ccb4f3e9f5cde8d0c2e831412485c7f8cf1473abffabcc5d51d8a2a87a22f39d1a250b3cb66d90c573669071aeba9b1080dc079243094a9ae0e5a62e4e8b653cb57f54f4eeaf3d0281c05f8d638d1e0c47794d9305929b4b87281b69397f51b0809573edeb3dcb82f2376ee419491adfa4a9d7f6db51d9573f50d025cc64030744c05794d3350a8bd45b3c5a69b8552e6cbfa2038fb33d4094dd8bb1095c36d4356a88c6ba114cad0c5acfdd224b3f4bc1af30f9a1ee5ea5407a8ce3c71dd09a1ea33f44e63cb9c0cae176515e1e323874adc5c2b788e23bae5123a90b964e44ec2e9be90b496bb537967d05715e3737cd4c35f2bc87ab7cc9ee70116ed2528b3d62237413dfc56e0e470281c1008ced58a9828526335c9517b5ac58c5ae7e74c9c36a7e6c7f571878f3319f52cb8eeaeeee64694ee4a49e582c53b77adac0fb6c808830560c4f130d925e7cbbcaa1221c8a4d54ce116b4c4ce52a56882c5c38000c441673cb91d381a3c5b09cd8ad3d74841fb8d7f9d5cebc4bfd273d2fe28a08fc2df6a57207bef71c6a9d63d54a0d7677d450c6a6d4e9a937a82be8cd4a1677e7ac04712949c7683f412862d40aeaa899640503aabc8794a5ff13e7c72df049ee0fb8203a99fe94a5003c225b0281c10087d010acad9e1540cbfb2c03dcd987d3c2fbd0fa2cd10f2e5b216fad7016a58a98fb43fcaee266b21c99d213089696a0faea4710f8ee7bd9a5eb2452341e58feec965d76e2133236f8b44e8bdd86a591acf8af501cdcc1a5cb1065793b09c0a5536ed414cca22163758b0b41add238e62ea07acba89144f97b9e1509584210aced89986fead9b3d22253f0a7a7372e269a01356070d2e1afac08da15cf23ad29438b0b3fc8d9e8e9f99c8ca970ae703cca71974335adb96a16e85c97689c3a8c -Msg = 28db8ffa55e115df7f188d627cd291fdecfbeea1109e1155e0aabc2157f7fe2a1284611e190365d2fd972d2a23dc793a5f28d4aac4100f5fbb2eed57532220d5d8d774bfa7084b44400249c19dab50e6c3c3af15966a960af1e2cec1f697a694a35c31a5a6f8ae7b73e148f09347004a3f54e7a82db390a0aa4fc526e95d79af -Salt = 3e07ade72a3f52530f53135a5d7d93217435ba001ea55a8f5d5d1304684874bc -Sig = 72c5555111eaef954236163753674a6ff81f182cbb379bfc6b548a52f9a5f260a0ed58f562a6086cf5ed00ed30adb023e90076a8adfa17cfd7d74f1e7b1978b210da847eda6b49891e6bd3fc6cd4c87b9326e8481a16c66e40021e5f878c303d3d8532bd7d966513717d5499865b2d03e378e76f7940f0448ab4d112e3c52cb332d340af122de3ee849f2e2544a40691ddf701d902bfe629766b36d82449286fd03f75bb2632dd61d6b3c6ce1c9ea8e5aff92ad2ca95a950eecd998e495e90e1f0966f922b7fb3f03380385f3b143ac1960c3bb688adbfd91d8fe1a1c32160243d3bd231a31c95dd78b6648c1175fa9c3c1244b1fa34d7c6f3255853ebacf5b3ec19b864e0a4eaee63fd719c21a72fc25b30b03207cf2aa45fd15d7102e5bae90882d00a812959593031ea3a436898582cae5eded5c7ce43de3dcac30b8690631e8db9f7a0a7f3f67b7524db275aafe02448727ff629d13afa94801d37526fbd9176fc4c216211037f8ec26b4f2672975887d70bcdbeef1e6ae99edbfb6c9a9c -Result = Pass - -Digest = SHA256 -Key = 308206e40201000282018100a7a1882a7fb896786034d07fb1b9f6327c27bdd7ce6fe39c285ae3b6c34259adc0dc4f7b9c7dec3ca4a20d3407339eedd7a12a421da18f5954673cac2ff059156ecc73c6861ec761e6a0f2a5a033a6768c6a42d8b459e1b4932349e84efd92df59b45935f3d0e30817c66201aa99d07ae36c5d74f408d69cc08f044151ff4960e531360cb19077833adf7bce77ecfaa133c0ccc63c93b856814569e0b9884ee554061b9a20ab46c38263c094dae791aa61a17f8d16f0e85b7e5ce3b067ece89e20bc4e8f1ae814b276d234e04f4e766f501da74ea7e3817c24ea35d016676cece652b823b051625573ca92757fc720d254ecf1dcbbfd21d98307561ecaab545480c7c52ad7e9fa6b597f5fe550559c2fe923205ac1761a99737ca02d7b19822e008a8969349c87fb874c81620e38f613c8521f0381fe5ba55b74827dad3e1cf2aa29c6933629f2b286ad11be88fa6436e7e3f64a75e3595290dc0d1cd5eee7aaac54959cc53bd5a934a365e72dd81a2bd4fb9a67821bffedf2ef2bd94913de8b02031415a702820180073a5fc4cd642f6113dffc4f84035cee3a2b8acc549703751a1d6a5eaa13487229a58ef7d7a522bb9f4f25510f1aa0f74c6a8fc8a5c5be8b91a674ede50e92f7e34a90a3c9da999fffb1d695e4588f451256c163484c151350cb9c7825a7d910845ee5cf826fecf9a7c0fbbbba22bb4a531c131d2e7761ba898f002ebef8ab87218511f81d3266e1ec07a7ca8622514c6dfdc86c67679a2c8f5f031de9a0c22b5a88060b46ee0c64d3b9af3c0a379bcd9c6a1b51cf6480456d3fd6def94cd2a6c171dd3f010e3c9d662bc857208248c94ebcb9fd997b9ff4a7e5fd95558569906525e741d78344f6f6cfdbd59d4faa52ee3fa964fb7cccb2d6be1935d211fe1498217716273939a946081fd8509913fd47747c5c2f03efd4d6fc9c6fcfd8402e9f40a0a5b3de3ca2b3c0fac9456938faa6cf2c20e3912e5981c9876d8ca1ff29b87a15eeae0ccce3f8a8f1e405091c083b98bcc5fe0d0deaae33c67c0394437f0eccb385b7efb17aeebba8afaecca30a2f63eac8f0ac8f1eacad85bbcaf3960b0281c100dd553696db8ccb107609b8917e688bdd8373a8926bc9d114c1c77f7958070e236ca1bd2025ded59a71093b63afbfce39e92bde9ffca983959e7c3e18d75650612258c24eebb61a1b4a68603a2721e3e2483d6da27475a228b1341c78f140948b5c922822ccaed76dae338dddec1e4c5c34b9c53f34a09ff0b2b61a62254e73e6f0ac8013edc2cfa7ecbeb86fcc7309cb0f5b5eddb707af4b9337d34d672af413f3b6efd11e3b49c978f06a356f6f4e0ea50a90797fe32ccaa983547ff18ea1670281c100c1e3089e1bea1141638ca912da01c134f67231a2f737d97e28486e004a43e9c5592ff968ee18109fc71aa4c1a97aa88ece5c4734352bc0c1f67726bc4aac59c19301f23a705be5b3f7825fb284e58a950d795f63d18fe72231eaba9d6a5f90866f8dd34b2b0dfc132db8348efa5a62634e5584a788aebbf073ccb4f3e9f5cde8d0c2e831412485c7f8cf1473abffabcc5d51d8a2a87a22f39d1a250b3cb66d90c573669071aeba9b1080dc079243094a9ae0e5a62e4e8b653cb57f54f4eeaf3d0281c05f8d638d1e0c47794d9305929b4b87281b69397f51b0809573edeb3dcb82f2376ee419491adfa4a9d7f6db51d9573f50d025cc64030744c05794d3350a8bd45b3c5a69b8552e6cbfa2038fb33d4094dd8bb1095c36d4356a88c6ba114cad0c5acfdd224b3f4bc1af30f9a1ee5ea5407a8ce3c71dd09a1ea33f44e63cb9c0cae176515e1e323874adc5c2b788e23bae5123a90b964e44ec2e9be90b496bb537967d05715e3737cd4c35f2bc87ab7cc9ee70116ed2528b3d62237413dfc56e0e470281c1008ced58a9828526335c9517b5ac58c5ae7e74c9c36a7e6c7f571878f3319f52cb8eeaeeee64694ee4a49e582c53b77adac0fb6c808830560c4f130d925e7cbbcaa1221c8a4d54ce116b4c4ce52a56882c5c38000c441673cb91d381a3c5b09cd8ad3d74841fb8d7f9d5cebc4bfd273d2fe28a08fc2df6a57207bef71c6a9d63d54a0d7677d450c6a6d4e9a937a82be8cd4a1677e7ac04712949c7683f412862d40aeaa899640503aabc8794a5ff13e7c72df049ee0fb8203a99fe94a5003c225b0281c10087d010acad9e1540cbfb2c03dcd987d3c2fbd0fa2cd10f2e5b216fad7016a58a98fb43fcaee266b21c99d213089696a0faea4710f8ee7bd9a5eb2452341e58feec965d76e2133236f8b44e8bdd86a591acf8af501cdcc1a5cb1065793b09c0a5536ed414cca22163758b0b41add238e62ea07acba89144f97b9e1509584210aced89986fead9b3d22253f0a7a7372e269a01356070d2e1afac08da15cf23ad29438b0b3fc8d9e8e9f99c8ca970ae703cca71974335adb96a16e85c97689c3a8c -Msg = 4839d71aabdad8b15d9f37c3d37a346758d8941b01c83909e460f589855ca0e691096865cf62698353787e7ff517561801a6ca98304f6d11d76065e75ff17a8ef5c86d9582798be4ded181424175721afac7477e6309476c14c5e750576ce3cbdc3d8db3ae68655b6674eb149fdeb1f3a903b4d5823feca1015722cd55140224 -Salt = 3e07ade72a3f52530f53135a5d7d93217435ba001ea55a8f5d5d1304684874bc -Sig = 796ac3f6adf4eabcb7a528ca63a6168ca6d31d5e357ad7a3fd180334a90d22bab20b762d767a6e3077c2cc8732784e81330041dc79068d50753bd4109c9c6f9ba03b5ac44efbcc23ecda27948511645fa17897dad7c122957ae56bf4ffe3d7bef85010b33d3b91785b0427417d94b11f73fda90e6a8748e6acc1d2d582e8836bc7dbe196876a9545b2a3207c1d4ec28acf8fe6f24c240b56ab3b4e4313a3d951aa1a558230e5f1eaf38cd7fd9b393d58d359f58f4ae51dd3971b418c5b81d0707cd9e2c33a148e492e74bfdd565eba8b1f3935e37a9d1a8764cd30497066e3c4622611fc14c45bf46fc85b3ed3f6c9d4d65e9925fe4b85ed30ec35ffc69c5fdc2bfa35d1bbdcb20e399cf934fe938f4c5798cf091d51100b4db4be42e81901e5dc79a98074119b7980b02821f4c3ff8ea07a2fc09a701978364bbd00ce4c5e2e45629526e34a3652719d27a47371480daf52fa49844f6495f35e6f5e3116c00b27042b3cead283bfc577905f8be87f0d5daa13d1ca74203a9e0d9199e885f4fb -Result = Pass - -Digest = SHA256 -Key = 308206e40201000282018100a7a1882a7fb896786034d07fb1b9f6327c27bdd7ce6fe39c285ae3b6c34259adc0dc4f7b9c7dec3ca4a20d3407339eedd7a12a421da18f5954673cac2ff059156ecc73c6861ec761e6a0f2a5a033a6768c6a42d8b459e1b4932349e84efd92df59b45935f3d0e30817c66201aa99d07ae36c5d74f408d69cc08f044151ff4960e531360cb19077833adf7bce77ecfaa133c0ccc63c93b856814569e0b9884ee554061b9a20ab46c38263c094dae791aa61a17f8d16f0e85b7e5ce3b067ece89e20bc4e8f1ae814b276d234e04f4e766f501da74ea7e3817c24ea35d016676cece652b823b051625573ca92757fc720d254ecf1dcbbfd21d98307561ecaab545480c7c52ad7e9fa6b597f5fe550559c2fe923205ac1761a99737ca02d7b19822e008a8969349c87fb874c81620e38f613c8521f0381fe5ba55b74827dad3e1cf2aa29c6933629f2b286ad11be88fa6436e7e3f64a75e3595290dc0d1cd5eee7aaac54959cc53bd5a934a365e72dd81a2bd4fb9a67821bffedf2ef2bd94913de8b02031415a702820180073a5fc4cd642f6113dffc4f84035cee3a2b8acc549703751a1d6a5eaa13487229a58ef7d7a522bb9f4f25510f1aa0f74c6a8fc8a5c5be8b91a674ede50e92f7e34a90a3c9da999fffb1d695e4588f451256c163484c151350cb9c7825a7d910845ee5cf826fecf9a7c0fbbbba22bb4a531c131d2e7761ba898f002ebef8ab87218511f81d3266e1ec07a7ca8622514c6dfdc86c67679a2c8f5f031de9a0c22b5a88060b46ee0c64d3b9af3c0a379bcd9c6a1b51cf6480456d3fd6def94cd2a6c171dd3f010e3c9d662bc857208248c94ebcb9fd997b9ff4a7e5fd95558569906525e741d78344f6f6cfdbd59d4faa52ee3fa964fb7cccb2d6be1935d211fe1498217716273939a946081fd8509913fd47747c5c2f03efd4d6fc9c6fcfd8402e9f40a0a5b3de3ca2b3c0fac9456938faa6cf2c20e3912e5981c9876d8ca1ff29b87a15eeae0ccce3f8a8f1e405091c083b98bcc5fe0d0deaae33c67c0394437f0eccb385b7efb17aeebba8afaecca30a2f63eac8f0ac8f1eacad85bbcaf3960b0281c100dd553696db8ccb107609b8917e688bdd8373a8926bc9d114c1c77f7958070e236ca1bd2025ded59a71093b63afbfce39e92bde9ffca983959e7c3e18d75650612258c24eebb61a1b4a68603a2721e3e2483d6da27475a228b1341c78f140948b5c922822ccaed76dae338dddec1e4c5c34b9c53f34a09ff0b2b61a62254e73e6f0ac8013edc2cfa7ecbeb86fcc7309cb0f5b5eddb707af4b9337d34d672af413f3b6efd11e3b49c978f06a356f6f4e0ea50a90797fe32ccaa983547ff18ea1670281c100c1e3089e1bea1141638ca912da01c134f67231a2f737d97e28486e004a43e9c5592ff968ee18109fc71aa4c1a97aa88ece5c4734352bc0c1f67726bc4aac59c19301f23a705be5b3f7825fb284e58a950d795f63d18fe72231eaba9d6a5f90866f8dd34b2b0dfc132db8348efa5a62634e5584a788aebbf073ccb4f3e9f5cde8d0c2e831412485c7f8cf1473abffabcc5d51d8a2a87a22f39d1a250b3cb66d90c573669071aeba9b1080dc079243094a9ae0e5a62e4e8b653cb57f54f4eeaf3d0281c05f8d638d1e0c47794d9305929b4b87281b69397f51b0809573edeb3dcb82f2376ee419491adfa4a9d7f6db51d9573f50d025cc64030744c05794d3350a8bd45b3c5a69b8552e6cbfa2038fb33d4094dd8bb1095c36d4356a88c6ba114cad0c5acfdd224b3f4bc1af30f9a1ee5ea5407a8ce3c71dd09a1ea33f44e63cb9c0cae176515e1e323874adc5c2b788e23bae5123a90b964e44ec2e9be90b496bb537967d05715e3737cd4c35f2bc87ab7cc9ee70116ed2528b3d62237413dfc56e0e470281c1008ced58a9828526335c9517b5ac58c5ae7e74c9c36a7e6c7f571878f3319f52cb8eeaeeee64694ee4a49e582c53b77adac0fb6c808830560c4f130d925e7cbbcaa1221c8a4d54ce116b4c4ce52a56882c5c38000c441673cb91d381a3c5b09cd8ad3d74841fb8d7f9d5cebc4bfd273d2fe28a08fc2df6a57207bef71c6a9d63d54a0d7677d450c6a6d4e9a937a82be8cd4a1677e7ac04712949c7683f412862d40aeaa899640503aabc8794a5ff13e7c72df049ee0fb8203a99fe94a5003c225b0281c10087d010acad9e1540cbfb2c03dcd987d3c2fbd0fa2cd10f2e5b216fad7016a58a98fb43fcaee266b21c99d213089696a0faea4710f8ee7bd9a5eb2452341e58feec965d76e2133236f8b44e8bdd86a591acf8af501cdcc1a5cb1065793b09c0a5536ed414cca22163758b0b41add238e62ea07acba89144f97b9e1509584210aced89986fead9b3d22253f0a7a7372e269a01356070d2e1afac08da15cf23ad29438b0b3fc8d9e8e9f99c8ca970ae703cca71974335adb96a16e85c97689c3a8c -Msg = c0b8b24f4b8e0bf29168ba73aa912c97121f7140f3259c40a72a6d6f78da2dfcabfcda00bea48459edaaf7b5fb5a9aed2e6d97959c393cd1a524a269c15e8c207cd09142be4f7e7d5016f6f19c735b8ab4c0f28e96954172af3cbcf29d65a161391b213dd5f7c006c294fe5016423718abffc8546ba373cdcb5a053196573564 -Salt = 3e07ade72a3f52530f53135a5d7d93217435ba001ea55a8f5d5d1304684874bc -Sig = 8503b85dbd9eba8d6fc57c6ae2103a78df1fff3600585e3e18f6ba6436a3acaf8e49fd12dcbb37c25b4b765037f545c3da8c39ef6842bc9ec264af6f519272f3d8698ef2ceac55393baa9846a7961b738e41f6360053d866763c824bc5873da14a28eb47d68d67f0cad7880853aeb561045f757a31d9f5c756f54d793637d721c88fb1f60126d3d16478f1fc15e0c4edbb531c2ca2e2fd9e8dabe1df2c09fd55bbc724ebeba290a7646249cd779fa1a923909b29345e54a2e25dd935bf0612a5580018b233d765a6fae3b46ef51bd8325912f439a7dc40148fdb754e2d866f357b8f0ebff6f18a6504ba31d10fe45226c88c9207b9be3c63261d75270466b43c271f75b1ab3c1d6b5a00dda8457b4d5c2195f320b0bd545fdd0679c84483c14a46b4d43c8452879725aa91d01fcc2c3867391c72200ca5d628ed9b566389f02fe74ba2a428a7ba31c00ef6b8d38c6b82b7379d2feb11031848fec0fac5b6091eb7607138bf0b96c3d2c174b5713d0dc8470b532eee6ea0ca1e8ffa3b15cbe0bb -Result = Pass - -Digest = SHA256 -Key = 308206e40201000282018100a7a1882a7fb896786034d07fb1b9f6327c27bdd7ce6fe39c285ae3b6c34259adc0dc4f7b9c7dec3ca4a20d3407339eedd7a12a421da18f5954673cac2ff059156ecc73c6861ec761e6a0f2a5a033a6768c6a42d8b459e1b4932349e84efd92df59b45935f3d0e30817c66201aa99d07ae36c5d74f408d69cc08f044151ff4960e531360cb19077833adf7bce77ecfaa133c0ccc63c93b856814569e0b9884ee554061b9a20ab46c38263c094dae791aa61a17f8d16f0e85b7e5ce3b067ece89e20bc4e8f1ae814b276d234e04f4e766f501da74ea7e3817c24ea35d016676cece652b823b051625573ca92757fc720d254ecf1dcbbfd21d98307561ecaab545480c7c52ad7e9fa6b597f5fe550559c2fe923205ac1761a99737ca02d7b19822e008a8969349c87fb874c81620e38f613c8521f0381fe5ba55b74827dad3e1cf2aa29c6933629f2b286ad11be88fa6436e7e3f64a75e3595290dc0d1cd5eee7aaac54959cc53bd5a934a365e72dd81a2bd4fb9a67821bffedf2ef2bd94913de8b02031415a702820180073a5fc4cd642f6113dffc4f84035cee3a2b8acc549703751a1d6a5eaa13487229a58ef7d7a522bb9f4f25510f1aa0f74c6a8fc8a5c5be8b91a674ede50e92f7e34a90a3c9da999fffb1d695e4588f451256c163484c151350cb9c7825a7d910845ee5cf826fecf9a7c0fbbbba22bb4a531c131d2e7761ba898f002ebef8ab87218511f81d3266e1ec07a7ca8622514c6dfdc86c67679a2c8f5f031de9a0c22b5a88060b46ee0c64d3b9af3c0a379bcd9c6a1b51cf6480456d3fd6def94cd2a6c171dd3f010e3c9d662bc857208248c94ebcb9fd997b9ff4a7e5fd95558569906525e741d78344f6f6cfdbd59d4faa52ee3fa964fb7cccb2d6be1935d211fe1498217716273939a946081fd8509913fd47747c5c2f03efd4d6fc9c6fcfd8402e9f40a0a5b3de3ca2b3c0fac9456938faa6cf2c20e3912e5981c9876d8ca1ff29b87a15eeae0ccce3f8a8f1e405091c083b98bcc5fe0d0deaae33c67c0394437f0eccb385b7efb17aeebba8afaecca30a2f63eac8f0ac8f1eacad85bbcaf3960b0281c100dd553696db8ccb107609b8917e688bdd8373a8926bc9d114c1c77f7958070e236ca1bd2025ded59a71093b63afbfce39e92bde9ffca983959e7c3e18d75650612258c24eebb61a1b4a68603a2721e3e2483d6da27475a228b1341c78f140948b5c922822ccaed76dae338dddec1e4c5c34b9c53f34a09ff0b2b61a62254e73e6f0ac8013edc2cfa7ecbeb86fcc7309cb0f5b5eddb707af4b9337d34d672af413f3b6efd11e3b49c978f06a356f6f4e0ea50a90797fe32ccaa983547ff18ea1670281c100c1e3089e1bea1141638ca912da01c134f67231a2f737d97e28486e004a43e9c5592ff968ee18109fc71aa4c1a97aa88ece5c4734352bc0c1f67726bc4aac59c19301f23a705be5b3f7825fb284e58a950d795f63d18fe72231eaba9d6a5f90866f8dd34b2b0dfc132db8348efa5a62634e5584a788aebbf073ccb4f3e9f5cde8d0c2e831412485c7f8cf1473abffabcc5d51d8a2a87a22f39d1a250b3cb66d90c573669071aeba9b1080dc079243094a9ae0e5a62e4e8b653cb57f54f4eeaf3d0281c05f8d638d1e0c47794d9305929b4b87281b69397f51b0809573edeb3dcb82f2376ee419491adfa4a9d7f6db51d9573f50d025cc64030744c05794d3350a8bd45b3c5a69b8552e6cbfa2038fb33d4094dd8bb1095c36d4356a88c6ba114cad0c5acfdd224b3f4bc1af30f9a1ee5ea5407a8ce3c71dd09a1ea33f44e63cb9c0cae176515e1e323874adc5c2b788e23bae5123a90b964e44ec2e9be90b496bb537967d05715e3737cd4c35f2bc87ab7cc9ee70116ed2528b3d62237413dfc56e0e470281c1008ced58a9828526335c9517b5ac58c5ae7e74c9c36a7e6c7f571878f3319f52cb8eeaeeee64694ee4a49e582c53b77adac0fb6c808830560c4f130d925e7cbbcaa1221c8a4d54ce116b4c4ce52a56882c5c38000c441673cb91d381a3c5b09cd8ad3d74841fb8d7f9d5cebc4bfd273d2fe28a08fc2df6a57207bef71c6a9d63d54a0d7677d450c6a6d4e9a937a82be8cd4a1677e7ac04712949c7683f412862d40aeaa899640503aabc8794a5ff13e7c72df049ee0fb8203a99fe94a5003c225b0281c10087d010acad9e1540cbfb2c03dcd987d3c2fbd0fa2cd10f2e5b216fad7016a58a98fb43fcaee266b21c99d213089696a0faea4710f8ee7bd9a5eb2452341e58feec965d76e2133236f8b44e8bdd86a591acf8af501cdcc1a5cb1065793b09c0a5536ed414cca22163758b0b41add238e62ea07acba89144f97b9e1509584210aced89986fead9b3d22253f0a7a7372e269a01356070d2e1afac08da15cf23ad29438b0b3fc8d9e8e9f99c8ca970ae703cca71974335adb96a16e85c97689c3a8c -Msg = 4935eaccd2af7c5b99405471bed9b21da8965004f5e6f2a6b7ed3ee2dd26cebcef4d845fff7c1d5edc94093f88de7a3aecf2bc3ecbd8c435f56e0b89bd099de7ac5f6c4377a5eb1c2ff4d801b8f159547cad4b4e60cad743f8e04627f61e1652e9354d8024710d1cfb2969be365a77f2bf8fa63b9e045257270a96c572ad6285 -Salt = 3e07ade72a3f52530f53135a5d7d93217435ba001ea55a8f5d5d1304684874bc -Sig = 66d1cea94b9603efad92b6ca8a1fbe0c6c4b9dc60ec0ab2c33bb62d27a100e839378a39208715de2102eae384ca407e92787ce1118f91a0ca2640a5c93fdb78635bc91082c99968ceab289890b3ec210d6cc6f1cf7e0fbe2dae88155e88f2fb7b325ab5e529e4b63493e551c53ae38c3fbfae49810050a81cdcea627da21b63224612d4361b9df19761d6ead44488dcabb50127149f077c2963afc049ac8837ff2c29e6a35593e22531ecc2e9ef8bcbaae4349bd7227ff3e13b31bb929bbd49e50059f28fd9ffe8c296a056c2760e5f6d8dab43e9bd557793f0759ad8e08b5c3773a305a0d316ff9bd07b43106335942055adc461a4346f05ab455780f32027de8b8bb6d4845bb24d0c5a21c293d2b0740e8d06ef5fb9dbdacb4fa1c6225fd4e19dae69a8e2cbfdff1ef8b7f21804ead0a45274c735fccbfa1d60bf497a3aa931bebac2e0c8beda9af596dff0cbe11e8d4602d36b2f6c6f5bb80f12f4b9daf2c0748f591098ea63d3193f50a1f4737efacb62ea85fb6fb212b3ec8effe788e55 -Result = Pass - -Digest = SHA256 -Key = 308206e40201000282018100a7a1882a7fb896786034d07fb1b9f6327c27bdd7ce6fe39c285ae3b6c34259adc0dc4f7b9c7dec3ca4a20d3407339eedd7a12a421da18f5954673cac2ff059156ecc73c6861ec761e6a0f2a5a033a6768c6a42d8b459e1b4932349e84efd92df59b45935f3d0e30817c66201aa99d07ae36c5d74f408d69cc08f044151ff4960e531360cb19077833adf7bce77ecfaa133c0ccc63c93b856814569e0b9884ee554061b9a20ab46c38263c094dae791aa61a17f8d16f0e85b7e5ce3b067ece89e20bc4e8f1ae814b276d234e04f4e766f501da74ea7e3817c24ea35d016676cece652b823b051625573ca92757fc720d254ecf1dcbbfd21d98307561ecaab545480c7c52ad7e9fa6b597f5fe550559c2fe923205ac1761a99737ca02d7b19822e008a8969349c87fb874c81620e38f613c8521f0381fe5ba55b74827dad3e1cf2aa29c6933629f2b286ad11be88fa6436e7e3f64a75e3595290dc0d1cd5eee7aaac54959cc53bd5a934a365e72dd81a2bd4fb9a67821bffedf2ef2bd94913de8b02031415a702820180073a5fc4cd642f6113dffc4f84035cee3a2b8acc549703751a1d6a5eaa13487229a58ef7d7a522bb9f4f25510f1aa0f74c6a8fc8a5c5be8b91a674ede50e92f7e34a90a3c9da999fffb1d695e4588f451256c163484c151350cb9c7825a7d910845ee5cf826fecf9a7c0fbbbba22bb4a531c131d2e7761ba898f002ebef8ab87218511f81d3266e1ec07a7ca8622514c6dfdc86c67679a2c8f5f031de9a0c22b5a88060b46ee0c64d3b9af3c0a379bcd9c6a1b51cf6480456d3fd6def94cd2a6c171dd3f010e3c9d662bc857208248c94ebcb9fd997b9ff4a7e5fd95558569906525e741d78344f6f6cfdbd59d4faa52ee3fa964fb7cccb2d6be1935d211fe1498217716273939a946081fd8509913fd47747c5c2f03efd4d6fc9c6fcfd8402e9f40a0a5b3de3ca2b3c0fac9456938faa6cf2c20e3912e5981c9876d8ca1ff29b87a15eeae0ccce3f8a8f1e405091c083b98bcc5fe0d0deaae33c67c0394437f0eccb385b7efb17aeebba8afaecca30a2f63eac8f0ac8f1eacad85bbcaf3960b0281c100dd553696db8ccb107609b8917e688bdd8373a8926bc9d114c1c77f7958070e236ca1bd2025ded59a71093b63afbfce39e92bde9ffca983959e7c3e18d75650612258c24eebb61a1b4a68603a2721e3e2483d6da27475a228b1341c78f140948b5c922822ccaed76dae338dddec1e4c5c34b9c53f34a09ff0b2b61a62254e73e6f0ac8013edc2cfa7ecbeb86fcc7309cb0f5b5eddb707af4b9337d34d672af413f3b6efd11e3b49c978f06a356f6f4e0ea50a90797fe32ccaa983547ff18ea1670281c100c1e3089e1bea1141638ca912da01c134f67231a2f737d97e28486e004a43e9c5592ff968ee18109fc71aa4c1a97aa88ece5c4734352bc0c1f67726bc4aac59c19301f23a705be5b3f7825fb284e58a950d795f63d18fe72231eaba9d6a5f90866f8dd34b2b0dfc132db8348efa5a62634e5584a788aebbf073ccb4f3e9f5cde8d0c2e831412485c7f8cf1473abffabcc5d51d8a2a87a22f39d1a250b3cb66d90c573669071aeba9b1080dc079243094a9ae0e5a62e4e8b653cb57f54f4eeaf3d0281c05f8d638d1e0c47794d9305929b4b87281b69397f51b0809573edeb3dcb82f2376ee419491adfa4a9d7f6db51d9573f50d025cc64030744c05794d3350a8bd45b3c5a69b8552e6cbfa2038fb33d4094dd8bb1095c36d4356a88c6ba114cad0c5acfdd224b3f4bc1af30f9a1ee5ea5407a8ce3c71dd09a1ea33f44e63cb9c0cae176515e1e323874adc5c2b788e23bae5123a90b964e44ec2e9be90b496bb537967d05715e3737cd4c35f2bc87ab7cc9ee70116ed2528b3d62237413dfc56e0e470281c1008ced58a9828526335c9517b5ac58c5ae7e74c9c36a7e6c7f571878f3319f52cb8eeaeeee64694ee4a49e582c53b77adac0fb6c808830560c4f130d925e7cbbcaa1221c8a4d54ce116b4c4ce52a56882c5c38000c441673cb91d381a3c5b09cd8ad3d74841fb8d7f9d5cebc4bfd273d2fe28a08fc2df6a57207bef71c6a9d63d54a0d7677d450c6a6d4e9a937a82be8cd4a1677e7ac04712949c7683f412862d40aeaa899640503aabc8794a5ff13e7c72df049ee0fb8203a99fe94a5003c225b0281c10087d010acad9e1540cbfb2c03dcd987d3c2fbd0fa2cd10f2e5b216fad7016a58a98fb43fcaee266b21c99d213089696a0faea4710f8ee7bd9a5eb2452341e58feec965d76e2133236f8b44e8bdd86a591acf8af501cdcc1a5cb1065793b09c0a5536ed414cca22163758b0b41add238e62ea07acba89144f97b9e1509584210aced89986fead9b3d22253f0a7a7372e269a01356070d2e1afac08da15cf23ad29438b0b3fc8d9e8e9f99c8ca970ae703cca71974335adb96a16e85c97689c3a8c -Msg = 3b8a68da11b61b5fee1c2ca00a6aa35bbfdbdd42855b284320ec8d0c1848edcf6ac850427d8479eb57bcbe9a11771637886974bd561a5387014592cb717e8364a8183fd4ad463c89c980215ff629d867956ee5e75f71f7a19ea7bd589d7efb915d44dd9789448bc1ac32fdf7a2c911734db2dbc589a83c1a61dab6bd83907ede -Salt = 3e07ade72a3f52530f53135a5d7d93217435ba001ea55a8f5d5d1304684874bc -Sig = 790058355d7ab9eccb46ea12368f3be9cf6b895e1734eb20a13c749557b9fecf92b316870f0f765864b607439ee5f7e510e2c83b2756a0d9877b48e0cf257b13c997b9dc70421d2d87c9b9e5625c36a17e21e20ed389657a3e544c677464eefff08a9ee4adb091a9fbce7626cdc127b5cf817c2a5f069e32c720bc2041cd21a6bae816dbbbe28552d022b7b608fa99da4d217dae8a69f54004fa3c004d50540957648296e14cca729f791b38e3645204c2c6d4cb678b0db63a181b40cd9851be84629a068415d54cab5cb5244c8dac8dc9799a0df1b58cebfbcd8377a391778869dd275e0dc8305eb0351d81e3afa46719355eee4f90894f7fed662dd3b03270660adff637b91e18330a4f3a62c914f0d32b4eb6a30b79371ab55190578a1e7d43294bb0a721def7dae3e021981707930bd9b5cb58675851c83acf330c6ba3aecb3a890ad3c151a1e2b583a7dccbf204850daa9f4679e759ec056abef7ba4d6e0bdfa57a5c5afb6368b048a2b74e3530bfa8991c55de7cc8bbfa990d118ada80 -Result = Pass - -Digest = SHA384 -Key = 308206e40201000282018100a7a1882a7fb896786034d07fb1b9f6327c27bdd7ce6fe39c285ae3b6c34259adc0dc4f7b9c7dec3ca4a20d3407339eedd7a12a421da18f5954673cac2ff059156ecc73c6861ec761e6a0f2a5a033a6768c6a42d8b459e1b4932349e84efd92df59b45935f3d0e30817c66201aa99d07ae36c5d74f408d69cc08f044151ff4960e531360cb19077833adf7bce77ecfaa133c0ccc63c93b856814569e0b9884ee554061b9a20ab46c38263c094dae791aa61a17f8d16f0e85b7e5ce3b067ece89e20bc4e8f1ae814b276d234e04f4e766f501da74ea7e3817c24ea35d016676cece652b823b051625573ca92757fc720d254ecf1dcbbfd21d98307561ecaab545480c7c52ad7e9fa6b597f5fe550559c2fe923205ac1761a99737ca02d7b19822e008a8969349c87fb874c81620e38f613c8521f0381fe5ba55b74827dad3e1cf2aa29c6933629f2b286ad11be88fa6436e7e3f64a75e3595290dc0d1cd5eee7aaac54959cc53bd5a934a365e72dd81a2bd4fb9a67821bffedf2ef2bd94913de8b02031415a702820180073a5fc4cd642f6113dffc4f84035cee3a2b8acc549703751a1d6a5eaa13487229a58ef7d7a522bb9f4f25510f1aa0f74c6a8fc8a5c5be8b91a674ede50e92f7e34a90a3c9da999fffb1d695e4588f451256c163484c151350cb9c7825a7d910845ee5cf826fecf9a7c0fbbbba22bb4a531c131d2e7761ba898f002ebef8ab87218511f81d3266e1ec07a7ca8622514c6dfdc86c67679a2c8f5f031de9a0c22b5a88060b46ee0c64d3b9af3c0a379bcd9c6a1b51cf6480456d3fd6def94cd2a6c171dd3f010e3c9d662bc857208248c94ebcb9fd997b9ff4a7e5fd95558569906525e741d78344f6f6cfdbd59d4faa52ee3fa964fb7cccb2d6be1935d211fe1498217716273939a946081fd8509913fd47747c5c2f03efd4d6fc9c6fcfd8402e9f40a0a5b3de3ca2b3c0fac9456938faa6cf2c20e3912e5981c9876d8ca1ff29b87a15eeae0ccce3f8a8f1e405091c083b98bcc5fe0d0deaae33c67c0394437f0eccb385b7efb17aeebba8afaecca30a2f63eac8f0ac8f1eacad85bbcaf3960b0281c100dd553696db8ccb107609b8917e688bdd8373a8926bc9d114c1c77f7958070e236ca1bd2025ded59a71093b63afbfce39e92bde9ffca983959e7c3e18d75650612258c24eebb61a1b4a68603a2721e3e2483d6da27475a228b1341c78f140948b5c922822ccaed76dae338dddec1e4c5c34b9c53f34a09ff0b2b61a62254e73e6f0ac8013edc2cfa7ecbeb86fcc7309cb0f5b5eddb707af4b9337d34d672af413f3b6efd11e3b49c978f06a356f6f4e0ea50a90797fe32ccaa983547ff18ea1670281c100c1e3089e1bea1141638ca912da01c134f67231a2f737d97e28486e004a43e9c5592ff968ee18109fc71aa4c1a97aa88ece5c4734352bc0c1f67726bc4aac59c19301f23a705be5b3f7825fb284e58a950d795f63d18fe72231eaba9d6a5f90866f8dd34b2b0dfc132db8348efa5a62634e5584a788aebbf073ccb4f3e9f5cde8d0c2e831412485c7f8cf1473abffabcc5d51d8a2a87a22f39d1a250b3cb66d90c573669071aeba9b1080dc079243094a9ae0e5a62e4e8b653cb57f54f4eeaf3d0281c05f8d638d1e0c47794d9305929b4b87281b69397f51b0809573edeb3dcb82f2376ee419491adfa4a9d7f6db51d9573f50d025cc64030744c05794d3350a8bd45b3c5a69b8552e6cbfa2038fb33d4094dd8bb1095c36d4356a88c6ba114cad0c5acfdd224b3f4bc1af30f9a1ee5ea5407a8ce3c71dd09a1ea33f44e63cb9c0cae176515e1e323874adc5c2b788e23bae5123a90b964e44ec2e9be90b496bb537967d05715e3737cd4c35f2bc87ab7cc9ee70116ed2528b3d62237413dfc56e0e470281c1008ced58a9828526335c9517b5ac58c5ae7e74c9c36a7e6c7f571878f3319f52cb8eeaeeee64694ee4a49e582c53b77adac0fb6c808830560c4f130d925e7cbbcaa1221c8a4d54ce116b4c4ce52a56882c5c38000c441673cb91d381a3c5b09cd8ad3d74841fb8d7f9d5cebc4bfd273d2fe28a08fc2df6a57207bef71c6a9d63d54a0d7677d450c6a6d4e9a937a82be8cd4a1677e7ac04712949c7683f412862d40aeaa899640503aabc8794a5ff13e7c72df049ee0fb8203a99fe94a5003c225b0281c10087d010acad9e1540cbfb2c03dcd987d3c2fbd0fa2cd10f2e5b216fad7016a58a98fb43fcaee266b21c99d213089696a0faea4710f8ee7bd9a5eb2452341e58feec965d76e2133236f8b44e8bdd86a591acf8af501cdcc1a5cb1065793b09c0a5536ed414cca22163758b0b41add238e62ea07acba89144f97b9e1509584210aced89986fead9b3d22253f0a7a7372e269a01356070d2e1afac08da15cf23ad29438b0b3fc8d9e8e9f99c8ca970ae703cca71974335adb96a16e85c97689c3a8c -Msg = 9221f0fe9115843554d5685d9fe69dc49e95ceb5793986e428b8a10b894c01d6af8782fd7d952faf74c2b637ca3b19dabc19a7fe259b2b924eb363a908c5b368f8ab1b2333fc67c30b8ea56b2839dc5bdadefb14ada810bc3e92bac54e2ae1ca1594a4b9d8d19337be421f40e0674e0e9fedb43d3ae89e2ca05d90a68203f2c2 -Salt = 61a762f8968d5f367e2dbcacb4021653dc75437d9000e3169d943729703837a5cbf4de62bdedc95fd0d1004e84751452 -Sig = 9687115be478e4b642cd369392b9dd0f3576e704af7218b1f94d7f8fe7f07073e3e8e1186fa768977d6b514e513459f2373df6ec52e3de9bd83fcc5cc3e6b97f8b3fb534163c64f5267620700e9d8c52b3df61a7c3748ef159d6b390895afa3af59109a5478d016d96c49f68dfc735ba2aafd5012c13515ed6644f0d4109c45556e14a3821e1aa24beb8a81a48da27f131de84f7ba51581d81b8ff31ba92b8a1fde867f07e32e6c2709253448174dd31324dbc32b05f07587f76a9997decb80f38d8c13d0f6eb3c10e3d96a2293f7464f1e04602ef6e84c2d0245d7db256a67d132a47cae9abe06b61a8968f50a1749995dc15ef0dcb1d5f5959e4d454c8547bbb4d195698f484617bfd122acaae2d0e8c76d28b24005ab03caa781ea97b1c4d9396a16f7998eee7ddd9de4cabe57032d9438a5d99c6b34a956122350263c7e998bc61dec91381012e686d079e39e96b1ea4bfdb7cdf630ddb422c6b580e5506c9cc3d6c100f2041d17ceaaaa54589249f04a1370ffa3bf3ff1adeb890688698 -Result = Pass - -Digest = SHA384 -Key = 308206e40201000282018100a7a1882a7fb896786034d07fb1b9f6327c27bdd7ce6fe39c285ae3b6c34259adc0dc4f7b9c7dec3ca4a20d3407339eedd7a12a421da18f5954673cac2ff059156ecc73c6861ec761e6a0f2a5a033a6768c6a42d8b459e1b4932349e84efd92df59b45935f3d0e30817c66201aa99d07ae36c5d74f408d69cc08f044151ff4960e531360cb19077833adf7bce77ecfaa133c0ccc63c93b856814569e0b9884ee554061b9a20ab46c38263c094dae791aa61a17f8d16f0e85b7e5ce3b067ece89e20bc4e8f1ae814b276d234e04f4e766f501da74ea7e3817c24ea35d016676cece652b823b051625573ca92757fc720d254ecf1dcbbfd21d98307561ecaab545480c7c52ad7e9fa6b597f5fe550559c2fe923205ac1761a99737ca02d7b19822e008a8969349c87fb874c81620e38f613c8521f0381fe5ba55b74827dad3e1cf2aa29c6933629f2b286ad11be88fa6436e7e3f64a75e3595290dc0d1cd5eee7aaac54959cc53bd5a934a365e72dd81a2bd4fb9a67821bffedf2ef2bd94913de8b02031415a702820180073a5fc4cd642f6113dffc4f84035cee3a2b8acc549703751a1d6a5eaa13487229a58ef7d7a522bb9f4f25510f1aa0f74c6a8fc8a5c5be8b91a674ede50e92f7e34a90a3c9da999fffb1d695e4588f451256c163484c151350cb9c7825a7d910845ee5cf826fecf9a7c0fbbbba22bb4a531c131d2e7761ba898f002ebef8ab87218511f81d3266e1ec07a7ca8622514c6dfdc86c67679a2c8f5f031de9a0c22b5a88060b46ee0c64d3b9af3c0a379bcd9c6a1b51cf6480456d3fd6def94cd2a6c171dd3f010e3c9d662bc857208248c94ebcb9fd997b9ff4a7e5fd95558569906525e741d78344f6f6cfdbd59d4faa52ee3fa964fb7cccb2d6be1935d211fe1498217716273939a946081fd8509913fd47747c5c2f03efd4d6fc9c6fcfd8402e9f40a0a5b3de3ca2b3c0fac9456938faa6cf2c20e3912e5981c9876d8ca1ff29b87a15eeae0ccce3f8a8f1e405091c083b98bcc5fe0d0deaae33c67c0394437f0eccb385b7efb17aeebba8afaecca30a2f63eac8f0ac8f1eacad85bbcaf3960b0281c100dd553696db8ccb107609b8917e688bdd8373a8926bc9d114c1c77f7958070e236ca1bd2025ded59a71093b63afbfce39e92bde9ffca983959e7c3e18d75650612258c24eebb61a1b4a68603a2721e3e2483d6da27475a228b1341c78f140948b5c922822ccaed76dae338dddec1e4c5c34b9c53f34a09ff0b2b61a62254e73e6f0ac8013edc2cfa7ecbeb86fcc7309cb0f5b5eddb707af4b9337d34d672af413f3b6efd11e3b49c978f06a356f6f4e0ea50a90797fe32ccaa983547ff18ea1670281c100c1e3089e1bea1141638ca912da01c134f67231a2f737d97e28486e004a43e9c5592ff968ee18109fc71aa4c1a97aa88ece5c4734352bc0c1f67726bc4aac59c19301f23a705be5b3f7825fb284e58a950d795f63d18fe72231eaba9d6a5f90866f8dd34b2b0dfc132db8348efa5a62634e5584a788aebbf073ccb4f3e9f5cde8d0c2e831412485c7f8cf1473abffabcc5d51d8a2a87a22f39d1a250b3cb66d90c573669071aeba9b1080dc079243094a9ae0e5a62e4e8b653cb57f54f4eeaf3d0281c05f8d638d1e0c47794d9305929b4b87281b69397f51b0809573edeb3dcb82f2376ee419491adfa4a9d7f6db51d9573f50d025cc64030744c05794d3350a8bd45b3c5a69b8552e6cbfa2038fb33d4094dd8bb1095c36d4356a88c6ba114cad0c5acfdd224b3f4bc1af30f9a1ee5ea5407a8ce3c71dd09a1ea33f44e63cb9c0cae176515e1e323874adc5c2b788e23bae5123a90b964e44ec2e9be90b496bb537967d05715e3737cd4c35f2bc87ab7cc9ee70116ed2528b3d62237413dfc56e0e470281c1008ced58a9828526335c9517b5ac58c5ae7e74c9c36a7e6c7f571878f3319f52cb8eeaeeee64694ee4a49e582c53b77adac0fb6c808830560c4f130d925e7cbbcaa1221c8a4d54ce116b4c4ce52a56882c5c38000c441673cb91d381a3c5b09cd8ad3d74841fb8d7f9d5cebc4bfd273d2fe28a08fc2df6a57207bef71c6a9d63d54a0d7677d450c6a6d4e9a937a82be8cd4a1677e7ac04712949c7683f412862d40aeaa899640503aabc8794a5ff13e7c72df049ee0fb8203a99fe94a5003c225b0281c10087d010acad9e1540cbfb2c03dcd987d3c2fbd0fa2cd10f2e5b216fad7016a58a98fb43fcaee266b21c99d213089696a0faea4710f8ee7bd9a5eb2452341e58feec965d76e2133236f8b44e8bdd86a591acf8af501cdcc1a5cb1065793b09c0a5536ed414cca22163758b0b41add238e62ea07acba89144f97b9e1509584210aced89986fead9b3d22253f0a7a7372e269a01356070d2e1afac08da15cf23ad29438b0b3fc8d9e8e9f99c8ca970ae703cca71974335adb96a16e85c97689c3a8c -Msg = 752a9916f449aebf814ce59ca6e82fa8038e4685419241c1488c6659b2ff3f7b7f38f0900a79c77a3b57151aff613c16f5020ad96ba945db88268722ca584c09b4054a40c00901149bb392f0916cd4244699a5e6a8c37e9621f54b471166797a7b58502cff4083140827052646501f5b5f1bc0b4e129147d7cc157cf6e73ec58 -Salt = 61a762f8968d5f367e2dbcacb4021653dc75437d9000e3169d943729703837a5cbf4de62bdedc95fd0d1004e84751452 -Sig = 6646a88ee4b845da4931274c23840dada6145fe0af954829d1d56661546a25e46316e216bb6b9446b368884ba14969a6f68ccbc1cf5b4e7a6d3aabec67f64963f63b088fa817c855d776ddcada57e5daa50fc1c877389c3cb9d99095a869a963bc91ec24b2422ef6b8dd18fd20d2b215fee6e98cda415ae44d2d2616fe1708292a3ef50a075170b3a7ebab02918ab0301794c17fb35e2038f369d94dd49569c066f7c392889dc4b878c50c7e52586b5081114d202338d23304f16f912d519a9ad21baff0e3d21761f373d08421e10108a983048fcb90eb2adc7c7f12ffa1571b091c781b255a77a880e97975f14f42baf5aa285ecc142157c3e1addd6aa0c09253a11c59144abd3b1e212d89e27ed96fb75756afc20ec67423b151194cb0b0648c659987a5583cb7757779d8a39e205e7101a5351ce1af2c9c6b0847cca57af52593323905e3d2297c0d54541a0125621640fe1deef13e759f8f6c56a2ec2a94831ac2c614b911e79edd542fef651f5a827f480575ae220c495f2a2842f99ec4 -Result = Pass - -Digest = SHA384 -Key = 308206e40201000282018100a7a1882a7fb896786034d07fb1b9f6327c27bdd7ce6fe39c285ae3b6c34259adc0dc4f7b9c7dec3ca4a20d3407339eedd7a12a421da18f5954673cac2ff059156ecc73c6861ec761e6a0f2a5a033a6768c6a42d8b459e1b4932349e84efd92df59b45935f3d0e30817c66201aa99d07ae36c5d74f408d69cc08f044151ff4960e531360cb19077833adf7bce77ecfaa133c0ccc63c93b856814569e0b9884ee554061b9a20ab46c38263c094dae791aa61a17f8d16f0e85b7e5ce3b067ece89e20bc4e8f1ae814b276d234e04f4e766f501da74ea7e3817c24ea35d016676cece652b823b051625573ca92757fc720d254ecf1dcbbfd21d98307561ecaab545480c7c52ad7e9fa6b597f5fe550559c2fe923205ac1761a99737ca02d7b19822e008a8969349c87fb874c81620e38f613c8521f0381fe5ba55b74827dad3e1cf2aa29c6933629f2b286ad11be88fa6436e7e3f64a75e3595290dc0d1cd5eee7aaac54959cc53bd5a934a365e72dd81a2bd4fb9a67821bffedf2ef2bd94913de8b02031415a702820180073a5fc4cd642f6113dffc4f84035cee3a2b8acc549703751a1d6a5eaa13487229a58ef7d7a522bb9f4f25510f1aa0f74c6a8fc8a5c5be8b91a674ede50e92f7e34a90a3c9da999fffb1d695e4588f451256c163484c151350cb9c7825a7d910845ee5cf826fecf9a7c0fbbbba22bb4a531c131d2e7761ba898f002ebef8ab87218511f81d3266e1ec07a7ca8622514c6dfdc86c67679a2c8f5f031de9a0c22b5a88060b46ee0c64d3b9af3c0a379bcd9c6a1b51cf6480456d3fd6def94cd2a6c171dd3f010e3c9d662bc857208248c94ebcb9fd997b9ff4a7e5fd95558569906525e741d78344f6f6cfdbd59d4faa52ee3fa964fb7cccb2d6be1935d211fe1498217716273939a946081fd8509913fd47747c5c2f03efd4d6fc9c6fcfd8402e9f40a0a5b3de3ca2b3c0fac9456938faa6cf2c20e3912e5981c9876d8ca1ff29b87a15eeae0ccce3f8a8f1e405091c083b98bcc5fe0d0deaae33c67c0394437f0eccb385b7efb17aeebba8afaecca30a2f63eac8f0ac8f1eacad85bbcaf3960b0281c100dd553696db8ccb107609b8917e688bdd8373a8926bc9d114c1c77f7958070e236ca1bd2025ded59a71093b63afbfce39e92bde9ffca983959e7c3e18d75650612258c24eebb61a1b4a68603a2721e3e2483d6da27475a228b1341c78f140948b5c922822ccaed76dae338dddec1e4c5c34b9c53f34a09ff0b2b61a62254e73e6f0ac8013edc2cfa7ecbeb86fcc7309cb0f5b5eddb707af4b9337d34d672af413f3b6efd11e3b49c978f06a356f6f4e0ea50a90797fe32ccaa983547ff18ea1670281c100c1e3089e1bea1141638ca912da01c134f67231a2f737d97e28486e004a43e9c5592ff968ee18109fc71aa4c1a97aa88ece5c4734352bc0c1f67726bc4aac59c19301f23a705be5b3f7825fb284e58a950d795f63d18fe72231eaba9d6a5f90866f8dd34b2b0dfc132db8348efa5a62634e5584a788aebbf073ccb4f3e9f5cde8d0c2e831412485c7f8cf1473abffabcc5d51d8a2a87a22f39d1a250b3cb66d90c573669071aeba9b1080dc079243094a9ae0e5a62e4e8b653cb57f54f4eeaf3d0281c05f8d638d1e0c47794d9305929b4b87281b69397f51b0809573edeb3dcb82f2376ee419491adfa4a9d7f6db51d9573f50d025cc64030744c05794d3350a8bd45b3c5a69b8552e6cbfa2038fb33d4094dd8bb1095c36d4356a88c6ba114cad0c5acfdd224b3f4bc1af30f9a1ee5ea5407a8ce3c71dd09a1ea33f44e63cb9c0cae176515e1e323874adc5c2b788e23bae5123a90b964e44ec2e9be90b496bb537967d05715e3737cd4c35f2bc87ab7cc9ee70116ed2528b3d62237413dfc56e0e470281c1008ced58a9828526335c9517b5ac58c5ae7e74c9c36a7e6c7f571878f3319f52cb8eeaeeee64694ee4a49e582c53b77adac0fb6c808830560c4f130d925e7cbbcaa1221c8a4d54ce116b4c4ce52a56882c5c38000c441673cb91d381a3c5b09cd8ad3d74841fb8d7f9d5cebc4bfd273d2fe28a08fc2df6a57207bef71c6a9d63d54a0d7677d450c6a6d4e9a937a82be8cd4a1677e7ac04712949c7683f412862d40aeaa899640503aabc8794a5ff13e7c72df049ee0fb8203a99fe94a5003c225b0281c10087d010acad9e1540cbfb2c03dcd987d3c2fbd0fa2cd10f2e5b216fad7016a58a98fb43fcaee266b21c99d213089696a0faea4710f8ee7bd9a5eb2452341e58feec965d76e2133236f8b44e8bdd86a591acf8af501cdcc1a5cb1065793b09c0a5536ed414cca22163758b0b41add238e62ea07acba89144f97b9e1509584210aced89986fead9b3d22253f0a7a7372e269a01356070d2e1afac08da15cf23ad29438b0b3fc8d9e8e9f99c8ca970ae703cca71974335adb96a16e85c97689c3a8c -Msg = 0403ef219938b8cdbf85d3b88cbb9c60d174134e43a7284cd87936d37456cdc3c541b4566b682e575dfc7d8f883fa581b9df7257bc82bc1bc6a2ea2a109bb5e6c5022fac1e390306cb40fe2196cece8143a10af3ba1273c368ec7a30e27e021dcbef6609f9d2be41d3fa5e54fd90a0c83862e40b837ed4ac8600edcb31283bcf -Salt = 61a762f8968d5f367e2dbcacb4021653dc75437d9000e3169d943729703837a5cbf4de62bdedc95fd0d1004e84751452 -Sig = 0a217503fc4870481264d8308292c663476b25f8dec08ea1d1276f0951ec6df27aae3beb93d630bf8fac08b6cce50bd92994851b4f310fdddce8e0d6a8b7a1e866a567b298c5577dc50d8a906ab1be880084e681b26456279149b4b85201621c445de13d127fb77e7f236c39df34052b4629572abe1c02c09eb198188003dd852f88f4f767f1000458680258fa4b63dafc761822ca8b98c1a121b72b1455393bee416d24051290f02a28a7b49b18b30ccb29c26fbac991401a3a6fe01fcd0608920facae9d5bc56540c80f4740af02c9b7a078958a8d8a7a93a5e5b6d2571f49d775ef7c35a6d674290b52cfbcd67277e2b2e829ec437fb70e90537eaa6fe4548551939bfa98fc98e235b264aa6064a505a8d67946e2c33e5c6f0f34fa86ba65715c258f238b69e4f6e36d86a89822b4802d21ba0ba760b2f3a5bd061f50aaadff12e0d86627294bd0c4cd1085b5dab6a6ab30146c9bbb37de3ac5c4f8ee29736d46047e450cfdcb1279e4ca83ab69e858741bfd01a779d475dfc0f71c621d78 -Result = Pass - -Digest = SHA384 -Key = 308206e40201000282018100a7a1882a7fb896786034d07fb1b9f6327c27bdd7ce6fe39c285ae3b6c34259adc0dc4f7b9c7dec3ca4a20d3407339eedd7a12a421da18f5954673cac2ff059156ecc73c6861ec761e6a0f2a5a033a6768c6a42d8b459e1b4932349e84efd92df59b45935f3d0e30817c66201aa99d07ae36c5d74f408d69cc08f044151ff4960e531360cb19077833adf7bce77ecfaa133c0ccc63c93b856814569e0b9884ee554061b9a20ab46c38263c094dae791aa61a17f8d16f0e85b7e5ce3b067ece89e20bc4e8f1ae814b276d234e04f4e766f501da74ea7e3817c24ea35d016676cece652b823b051625573ca92757fc720d254ecf1dcbbfd21d98307561ecaab545480c7c52ad7e9fa6b597f5fe550559c2fe923205ac1761a99737ca02d7b19822e008a8969349c87fb874c81620e38f613c8521f0381fe5ba55b74827dad3e1cf2aa29c6933629f2b286ad11be88fa6436e7e3f64a75e3595290dc0d1cd5eee7aaac54959cc53bd5a934a365e72dd81a2bd4fb9a67821bffedf2ef2bd94913de8b02031415a702820180073a5fc4cd642f6113dffc4f84035cee3a2b8acc549703751a1d6a5eaa13487229a58ef7d7a522bb9f4f25510f1aa0f74c6a8fc8a5c5be8b91a674ede50e92f7e34a90a3c9da999fffb1d695e4588f451256c163484c151350cb9c7825a7d910845ee5cf826fecf9a7c0fbbbba22bb4a531c131d2e7761ba898f002ebef8ab87218511f81d3266e1ec07a7ca8622514c6dfdc86c67679a2c8f5f031de9a0c22b5a88060b46ee0c64d3b9af3c0a379bcd9c6a1b51cf6480456d3fd6def94cd2a6c171dd3f010e3c9d662bc857208248c94ebcb9fd997b9ff4a7e5fd95558569906525e741d78344f6f6cfdbd59d4faa52ee3fa964fb7cccb2d6be1935d211fe1498217716273939a946081fd8509913fd47747c5c2f03efd4d6fc9c6fcfd8402e9f40a0a5b3de3ca2b3c0fac9456938faa6cf2c20e3912e5981c9876d8ca1ff29b87a15eeae0ccce3f8a8f1e405091c083b98bcc5fe0d0deaae33c67c0394437f0eccb385b7efb17aeebba8afaecca30a2f63eac8f0ac8f1eacad85bbcaf3960b0281c100dd553696db8ccb107609b8917e688bdd8373a8926bc9d114c1c77f7958070e236ca1bd2025ded59a71093b63afbfce39e92bde9ffca983959e7c3e18d75650612258c24eebb61a1b4a68603a2721e3e2483d6da27475a228b1341c78f140948b5c922822ccaed76dae338dddec1e4c5c34b9c53f34a09ff0b2b61a62254e73e6f0ac8013edc2cfa7ecbeb86fcc7309cb0f5b5eddb707af4b9337d34d672af413f3b6efd11e3b49c978f06a356f6f4e0ea50a90797fe32ccaa983547ff18ea1670281c100c1e3089e1bea1141638ca912da01c134f67231a2f737d97e28486e004a43e9c5592ff968ee18109fc71aa4c1a97aa88ece5c4734352bc0c1f67726bc4aac59c19301f23a705be5b3f7825fb284e58a950d795f63d18fe72231eaba9d6a5f90866f8dd34b2b0dfc132db8348efa5a62634e5584a788aebbf073ccb4f3e9f5cde8d0c2e831412485c7f8cf1473abffabcc5d51d8a2a87a22f39d1a250b3cb66d90c573669071aeba9b1080dc079243094a9ae0e5a62e4e8b653cb57f54f4eeaf3d0281c05f8d638d1e0c47794d9305929b4b87281b69397f51b0809573edeb3dcb82f2376ee419491adfa4a9d7f6db51d9573f50d025cc64030744c05794d3350a8bd45b3c5a69b8552e6cbfa2038fb33d4094dd8bb1095c36d4356a88c6ba114cad0c5acfdd224b3f4bc1af30f9a1ee5ea5407a8ce3c71dd09a1ea33f44e63cb9c0cae176515e1e323874adc5c2b788e23bae5123a90b964e44ec2e9be90b496bb537967d05715e3737cd4c35f2bc87ab7cc9ee70116ed2528b3d62237413dfc56e0e470281c1008ced58a9828526335c9517b5ac58c5ae7e74c9c36a7e6c7f571878f3319f52cb8eeaeeee64694ee4a49e582c53b77adac0fb6c808830560c4f130d925e7cbbcaa1221c8a4d54ce116b4c4ce52a56882c5c38000c441673cb91d381a3c5b09cd8ad3d74841fb8d7f9d5cebc4bfd273d2fe28a08fc2df6a57207bef71c6a9d63d54a0d7677d450c6a6d4e9a937a82be8cd4a1677e7ac04712949c7683f412862d40aeaa899640503aabc8794a5ff13e7c72df049ee0fb8203a99fe94a5003c225b0281c10087d010acad9e1540cbfb2c03dcd987d3c2fbd0fa2cd10f2e5b216fad7016a58a98fb43fcaee266b21c99d213089696a0faea4710f8ee7bd9a5eb2452341e58feec965d76e2133236f8b44e8bdd86a591acf8af501cdcc1a5cb1065793b09c0a5536ed414cca22163758b0b41add238e62ea07acba89144f97b9e1509584210aced89986fead9b3d22253f0a7a7372e269a01356070d2e1afac08da15cf23ad29438b0b3fc8d9e8e9f99c8ca970ae703cca71974335adb96a16e85c97689c3a8c -Msg = 453e0835fee7cde81f18c2b309b804c67b9fd9e96ef0a96e3da94b640978830e5cd1c8940c3d4af763f5334a7caf2d20f0b82541b3434fa138016b92dcf14638817a833d79b79bc7a71223a7e0144ed4977bb217ba8d4f07d7adcd38832c05b0fc61c39a0dfcca3f32971931fd8e6dc9b81107d44c77af8a62d5f9c0c7d0c75e -Salt = 61a762f8968d5f367e2dbcacb4021653dc75437d9000e3169d943729703837a5cbf4de62bdedc95fd0d1004e84751452 -Sig = 6ec22bd58c32d41374c017a77027e770f678fd81017e20cdaaab48a8324b050749e5d864082f1f77fecf67a59c2885e931c3c2f58130fa6806fe1ca899045114b09d09cf9c513ce1109d2210511a3b2e93af511badad2716f48555310e6c5f547afbdb0b9a684491ff3588df933d6b04dae8883f5f8aad62a4570646f72f3656c4a7085623f5152164a81a06ccb59ca478c5c2315414550b0ad8eecd0328b2db01fff7db0f26596c41f970d032925887f1c8a446da889be64d48925b9c6b79a3d897700ab40af20b451aaa6b427ed162864db89f7824b6ae9b475b5433b865335d6f91491c1e32f635cb930dec1aa3ee7ddaa08e8ebd67b6b11a46ba049922446fa69f1a804acc29f6cee487723f2e61a40007865d80cde0119f3fe6e161a339487f5789e1fd23ac0a63b4673969fd8722e3edc9439778928f09610cbefbb42fe6242c73b68d466cef889da156d9d4ff888362db4cf9a941e80f577c944b79fb27dbe0a6967e88f1f67b91b0d38e083fc0c0228cd49d27352521312163f90fba -Result = Pass - -Digest = SHA384 -Key = 308206e40201000282018100a7a1882a7fb896786034d07fb1b9f6327c27bdd7ce6fe39c285ae3b6c34259adc0dc4f7b9c7dec3ca4a20d3407339eedd7a12a421da18f5954673cac2ff059156ecc73c6861ec761e6a0f2a5a033a6768c6a42d8b459e1b4932349e84efd92df59b45935f3d0e30817c66201aa99d07ae36c5d74f408d69cc08f044151ff4960e531360cb19077833adf7bce77ecfaa133c0ccc63c93b856814569e0b9884ee554061b9a20ab46c38263c094dae791aa61a17f8d16f0e85b7e5ce3b067ece89e20bc4e8f1ae814b276d234e04f4e766f501da74ea7e3817c24ea35d016676cece652b823b051625573ca92757fc720d254ecf1dcbbfd21d98307561ecaab545480c7c52ad7e9fa6b597f5fe550559c2fe923205ac1761a99737ca02d7b19822e008a8969349c87fb874c81620e38f613c8521f0381fe5ba55b74827dad3e1cf2aa29c6933629f2b286ad11be88fa6436e7e3f64a75e3595290dc0d1cd5eee7aaac54959cc53bd5a934a365e72dd81a2bd4fb9a67821bffedf2ef2bd94913de8b02031415a702820180073a5fc4cd642f6113dffc4f84035cee3a2b8acc549703751a1d6a5eaa13487229a58ef7d7a522bb9f4f25510f1aa0f74c6a8fc8a5c5be8b91a674ede50e92f7e34a90a3c9da999fffb1d695e4588f451256c163484c151350cb9c7825a7d910845ee5cf826fecf9a7c0fbbbba22bb4a531c131d2e7761ba898f002ebef8ab87218511f81d3266e1ec07a7ca8622514c6dfdc86c67679a2c8f5f031de9a0c22b5a88060b46ee0c64d3b9af3c0a379bcd9c6a1b51cf6480456d3fd6def94cd2a6c171dd3f010e3c9d662bc857208248c94ebcb9fd997b9ff4a7e5fd95558569906525e741d78344f6f6cfdbd59d4faa52ee3fa964fb7cccb2d6be1935d211fe1498217716273939a946081fd8509913fd47747c5c2f03efd4d6fc9c6fcfd8402e9f40a0a5b3de3ca2b3c0fac9456938faa6cf2c20e3912e5981c9876d8ca1ff29b87a15eeae0ccce3f8a8f1e405091c083b98bcc5fe0d0deaae33c67c0394437f0eccb385b7efb17aeebba8afaecca30a2f63eac8f0ac8f1eacad85bbcaf3960b0281c100dd553696db8ccb107609b8917e688bdd8373a8926bc9d114c1c77f7958070e236ca1bd2025ded59a71093b63afbfce39e92bde9ffca983959e7c3e18d75650612258c24eebb61a1b4a68603a2721e3e2483d6da27475a228b1341c78f140948b5c922822ccaed76dae338dddec1e4c5c34b9c53f34a09ff0b2b61a62254e73e6f0ac8013edc2cfa7ecbeb86fcc7309cb0f5b5eddb707af4b9337d34d672af413f3b6efd11e3b49c978f06a356f6f4e0ea50a90797fe32ccaa983547ff18ea1670281c100c1e3089e1bea1141638ca912da01c134f67231a2f737d97e28486e004a43e9c5592ff968ee18109fc71aa4c1a97aa88ece5c4734352bc0c1f67726bc4aac59c19301f23a705be5b3f7825fb284e58a950d795f63d18fe72231eaba9d6a5f90866f8dd34b2b0dfc132db8348efa5a62634e5584a788aebbf073ccb4f3e9f5cde8d0c2e831412485c7f8cf1473abffabcc5d51d8a2a87a22f39d1a250b3cb66d90c573669071aeba9b1080dc079243094a9ae0e5a62e4e8b653cb57f54f4eeaf3d0281c05f8d638d1e0c47794d9305929b4b87281b69397f51b0809573edeb3dcb82f2376ee419491adfa4a9d7f6db51d9573f50d025cc64030744c05794d3350a8bd45b3c5a69b8552e6cbfa2038fb33d4094dd8bb1095c36d4356a88c6ba114cad0c5acfdd224b3f4bc1af30f9a1ee5ea5407a8ce3c71dd09a1ea33f44e63cb9c0cae176515e1e323874adc5c2b788e23bae5123a90b964e44ec2e9be90b496bb537967d05715e3737cd4c35f2bc87ab7cc9ee70116ed2528b3d62237413dfc56e0e470281c1008ced58a9828526335c9517b5ac58c5ae7e74c9c36a7e6c7f571878f3319f52cb8eeaeeee64694ee4a49e582c53b77adac0fb6c808830560c4f130d925e7cbbcaa1221c8a4d54ce116b4c4ce52a56882c5c38000c441673cb91d381a3c5b09cd8ad3d74841fb8d7f9d5cebc4bfd273d2fe28a08fc2df6a57207bef71c6a9d63d54a0d7677d450c6a6d4e9a937a82be8cd4a1677e7ac04712949c7683f412862d40aeaa899640503aabc8794a5ff13e7c72df049ee0fb8203a99fe94a5003c225b0281c10087d010acad9e1540cbfb2c03dcd987d3c2fbd0fa2cd10f2e5b216fad7016a58a98fb43fcaee266b21c99d213089696a0faea4710f8ee7bd9a5eb2452341e58feec965d76e2133236f8b44e8bdd86a591acf8af501cdcc1a5cb1065793b09c0a5536ed414cca22163758b0b41add238e62ea07acba89144f97b9e1509584210aced89986fead9b3d22253f0a7a7372e269a01356070d2e1afac08da15cf23ad29438b0b3fc8d9e8e9f99c8ca970ae703cca71974335adb96a16e85c97689c3a8c -Msg = 9aff46c14fd810a039c0a62eda403f5ca902ac41b8e225c6944748a36cb45f8a769ae2a18f713d362206d2af4a1742bf3b1de8e0de69a7fdbb72e66e1c6ed82a6f1f0138edf0f6677940643fcbfe5337cd76ac29456af902b5656dbe7f4c24944d36ab6db07dc39b081662c8a31dfb2c29b4ff04370ea43f4ac7e57adf77ca2e -Salt = 61a762f8968d5f367e2dbcacb4021653dc75437d9000e3169d943729703837a5cbf4de62bdedc95fd0d1004e84751452 -Sig = 62a505b3f3adda45c6badb61b464a28bc45d4c66159a34b63c1cce32604242eb8fcd9ac6929ec6ee4ac1144932d725cbf4638511464ec70dbb5543a4487a241396adb804c9794b271f9d35310ee560368d949a20a2b64cb4617fcf63cf7b60978cad734650dae86c7e51b766522ef0be48bceafe2030564d5b7b17ba125097bdafee48e4df60fbb7ac2d9f14af9a270c2b7ef18cadac45b9b54ef230794339d279d72ba48783bb09b1d1d5c1c65301276523fe90e63789ffbcd489e45f8aa9cf98f33de8f7d9c5cdd21a9ab2847896de6dce0b92f07b1ffb4230ee71ba1fe8048c22dd38af80f8762e747cdec6e99f1ce0d1c743ef98ddbaf7c764412446dca58e6ff5ac0dd13322649acbc96f1c5e0bc58d1a8211853a7d2f51538c5e5e803de0b13044608d6e650bace12945a7008194586e3b74809714b2a52e9f3824be41de9fec3f36175a289baf9fd68b7e92f3754e00b41782d055faa65433c25259aa653fda069386b083fb31aeec8e30c769553f8f0389b6e6d4b392cadd24ce3f74 -Result = Pass - -Digest = SHA384 -Key = 308206e40201000282018100a7a1882a7fb896786034d07fb1b9f6327c27bdd7ce6fe39c285ae3b6c34259adc0dc4f7b9c7dec3ca4a20d3407339eedd7a12a421da18f5954673cac2ff059156ecc73c6861ec761e6a0f2a5a033a6768c6a42d8b459e1b4932349e84efd92df59b45935f3d0e30817c66201aa99d07ae36c5d74f408d69cc08f044151ff4960e531360cb19077833adf7bce77ecfaa133c0ccc63c93b856814569e0b9884ee554061b9a20ab46c38263c094dae791aa61a17f8d16f0e85b7e5ce3b067ece89e20bc4e8f1ae814b276d234e04f4e766f501da74ea7e3817c24ea35d016676cece652b823b051625573ca92757fc720d254ecf1dcbbfd21d98307561ecaab545480c7c52ad7e9fa6b597f5fe550559c2fe923205ac1761a99737ca02d7b19822e008a8969349c87fb874c81620e38f613c8521f0381fe5ba55b74827dad3e1cf2aa29c6933629f2b286ad11be88fa6436e7e3f64a75e3595290dc0d1cd5eee7aaac54959cc53bd5a934a365e72dd81a2bd4fb9a67821bffedf2ef2bd94913de8b02031415a702820180073a5fc4cd642f6113dffc4f84035cee3a2b8acc549703751a1d6a5eaa13487229a58ef7d7a522bb9f4f25510f1aa0f74c6a8fc8a5c5be8b91a674ede50e92f7e34a90a3c9da999fffb1d695e4588f451256c163484c151350cb9c7825a7d910845ee5cf826fecf9a7c0fbbbba22bb4a531c131d2e7761ba898f002ebef8ab87218511f81d3266e1ec07a7ca8622514c6dfdc86c67679a2c8f5f031de9a0c22b5a88060b46ee0c64d3b9af3c0a379bcd9c6a1b51cf6480456d3fd6def94cd2a6c171dd3f010e3c9d662bc857208248c94ebcb9fd997b9ff4a7e5fd95558569906525e741d78344f6f6cfdbd59d4faa52ee3fa964fb7cccb2d6be1935d211fe1498217716273939a946081fd8509913fd47747c5c2f03efd4d6fc9c6fcfd8402e9f40a0a5b3de3ca2b3c0fac9456938faa6cf2c20e3912e5981c9876d8ca1ff29b87a15eeae0ccce3f8a8f1e405091c083b98bcc5fe0d0deaae33c67c0394437f0eccb385b7efb17aeebba8afaecca30a2f63eac8f0ac8f1eacad85bbcaf3960b0281c100dd553696db8ccb107609b8917e688bdd8373a8926bc9d114c1c77f7958070e236ca1bd2025ded59a71093b63afbfce39e92bde9ffca983959e7c3e18d75650612258c24eebb61a1b4a68603a2721e3e2483d6da27475a228b1341c78f140948b5c922822ccaed76dae338dddec1e4c5c34b9c53f34a09ff0b2b61a62254e73e6f0ac8013edc2cfa7ecbeb86fcc7309cb0f5b5eddb707af4b9337d34d672af413f3b6efd11e3b49c978f06a356f6f4e0ea50a90797fe32ccaa983547ff18ea1670281c100c1e3089e1bea1141638ca912da01c134f67231a2f737d97e28486e004a43e9c5592ff968ee18109fc71aa4c1a97aa88ece5c4734352bc0c1f67726bc4aac59c19301f23a705be5b3f7825fb284e58a950d795f63d18fe72231eaba9d6a5f90866f8dd34b2b0dfc132db8348efa5a62634e5584a788aebbf073ccb4f3e9f5cde8d0c2e831412485c7f8cf1473abffabcc5d51d8a2a87a22f39d1a250b3cb66d90c573669071aeba9b1080dc079243094a9ae0e5a62e4e8b653cb57f54f4eeaf3d0281c05f8d638d1e0c47794d9305929b4b87281b69397f51b0809573edeb3dcb82f2376ee419491adfa4a9d7f6db51d9573f50d025cc64030744c05794d3350a8bd45b3c5a69b8552e6cbfa2038fb33d4094dd8bb1095c36d4356a88c6ba114cad0c5acfdd224b3f4bc1af30f9a1ee5ea5407a8ce3c71dd09a1ea33f44e63cb9c0cae176515e1e323874adc5c2b788e23bae5123a90b964e44ec2e9be90b496bb537967d05715e3737cd4c35f2bc87ab7cc9ee70116ed2528b3d62237413dfc56e0e470281c1008ced58a9828526335c9517b5ac58c5ae7e74c9c36a7e6c7f571878f3319f52cb8eeaeeee64694ee4a49e582c53b77adac0fb6c808830560c4f130d925e7cbbcaa1221c8a4d54ce116b4c4ce52a56882c5c38000c441673cb91d381a3c5b09cd8ad3d74841fb8d7f9d5cebc4bfd273d2fe28a08fc2df6a57207bef71c6a9d63d54a0d7677d450c6a6d4e9a937a82be8cd4a1677e7ac04712949c7683f412862d40aeaa899640503aabc8794a5ff13e7c72df049ee0fb8203a99fe94a5003c225b0281c10087d010acad9e1540cbfb2c03dcd987d3c2fbd0fa2cd10f2e5b216fad7016a58a98fb43fcaee266b21c99d213089696a0faea4710f8ee7bd9a5eb2452341e58feec965d76e2133236f8b44e8bdd86a591acf8af501cdcc1a5cb1065793b09c0a5536ed414cca22163758b0b41add238e62ea07acba89144f97b9e1509584210aced89986fead9b3d22253f0a7a7372e269a01356070d2e1afac08da15cf23ad29438b0b3fc8d9e8e9f99c8ca970ae703cca71974335adb96a16e85c97689c3a8c -Msg = b50bf2767250f14fa7b6f5ea21a54da8d01e91151eb491107fd88b2d4a5aa157c72d89ba896b87e0fe989819442bf0213e4aa7fde8d6b026e7a70ae965193a0e1bc7f8b8af96298c41f60d154164ba678333c903958d4ffb50b50f57ad8eedb6da61a6398ddbbf9c9955bba6bf5991c4c6615df1cde156d8e188003dcbc3a399 -Salt = 61a762f8968d5f367e2dbcacb4021653dc75437d9000e3169d943729703837a5cbf4de62bdedc95fd0d1004e84751452 -Sig = 1f068bd083a26534040f41c1387e71a8c00370c5f1c958127e0bc721751b5940513023fad02a6101bbcefaaaaeea2875952bf859d494bfb23fd89149d91290359ecb44ecf2fcaa5775e2e61e5f8d5151343576fe9c7167e919a5d081dac6bb8117229c420fd2b0fcb521f4e72366bfb443e688a65fa392eaa5115c292ab05bb4db65468aab267178653dfa0a5efc960636fcce86433528dbce955a0b1aa188ac33ea128206ecc0feeab8f7df6f8c381b10489c8cfb2d02459e4cffc16f43a66aa4eaa19bc518ccfcf9fc1e4861cfa13e9b41fcefade2cd2ebc001ec8430a1cb949a0f2f876badc568c703e4209e7ca16f688ba9705c14fa1c882e6c4871b9deff31521d2d418e0342e189c40ed19c1b6f4320d89a36f78eca143d3c16dd3eb338c0743646fd314c725c2d36a13080bfcdeea0e431de71d61f652033a75424fe1e1586695c3dc463ad553c1cf3ab24a41ff4e031f9e0c2cb0024cef68273ea3b8c1be9d923d3e9c9686c41977ac7be94a6d23181936131c17a39a898c943dcc8b -Result = Pass - -Digest = SHA384 -Key = 308206e40201000282018100a7a1882a7fb896786034d07fb1b9f6327c27bdd7ce6fe39c285ae3b6c34259adc0dc4f7b9c7dec3ca4a20d3407339eedd7a12a421da18f5954673cac2ff059156ecc73c6861ec761e6a0f2a5a033a6768c6a42d8b459e1b4932349e84efd92df59b45935f3d0e30817c66201aa99d07ae36c5d74f408d69cc08f044151ff4960e531360cb19077833adf7bce77ecfaa133c0ccc63c93b856814569e0b9884ee554061b9a20ab46c38263c094dae791aa61a17f8d16f0e85b7e5ce3b067ece89e20bc4e8f1ae814b276d234e04f4e766f501da74ea7e3817c24ea35d016676cece652b823b051625573ca92757fc720d254ecf1dcbbfd21d98307561ecaab545480c7c52ad7e9fa6b597f5fe550559c2fe923205ac1761a99737ca02d7b19822e008a8969349c87fb874c81620e38f613c8521f0381fe5ba55b74827dad3e1cf2aa29c6933629f2b286ad11be88fa6436e7e3f64a75e3595290dc0d1cd5eee7aaac54959cc53bd5a934a365e72dd81a2bd4fb9a67821bffedf2ef2bd94913de8b02031415a702820180073a5fc4cd642f6113dffc4f84035cee3a2b8acc549703751a1d6a5eaa13487229a58ef7d7a522bb9f4f25510f1aa0f74c6a8fc8a5c5be8b91a674ede50e92f7e34a90a3c9da999fffb1d695e4588f451256c163484c151350cb9c7825a7d910845ee5cf826fecf9a7c0fbbbba22bb4a531c131d2e7761ba898f002ebef8ab87218511f81d3266e1ec07a7ca8622514c6dfdc86c67679a2c8f5f031de9a0c22b5a88060b46ee0c64d3b9af3c0a379bcd9c6a1b51cf6480456d3fd6def94cd2a6c171dd3f010e3c9d662bc857208248c94ebcb9fd997b9ff4a7e5fd95558569906525e741d78344f6f6cfdbd59d4faa52ee3fa964fb7cccb2d6be1935d211fe1498217716273939a946081fd8509913fd47747c5c2f03efd4d6fc9c6fcfd8402e9f40a0a5b3de3ca2b3c0fac9456938faa6cf2c20e3912e5981c9876d8ca1ff29b87a15eeae0ccce3f8a8f1e405091c083b98bcc5fe0d0deaae33c67c0394437f0eccb385b7efb17aeebba8afaecca30a2f63eac8f0ac8f1eacad85bbcaf3960b0281c100dd553696db8ccb107609b8917e688bdd8373a8926bc9d114c1c77f7958070e236ca1bd2025ded59a71093b63afbfce39e92bde9ffca983959e7c3e18d75650612258c24eebb61a1b4a68603a2721e3e2483d6da27475a228b1341c78f140948b5c922822ccaed76dae338dddec1e4c5c34b9c53f34a09ff0b2b61a62254e73e6f0ac8013edc2cfa7ecbeb86fcc7309cb0f5b5eddb707af4b9337d34d672af413f3b6efd11e3b49c978f06a356f6f4e0ea50a90797fe32ccaa983547ff18ea1670281c100c1e3089e1bea1141638ca912da01c134f67231a2f737d97e28486e004a43e9c5592ff968ee18109fc71aa4c1a97aa88ece5c4734352bc0c1f67726bc4aac59c19301f23a705be5b3f7825fb284e58a950d795f63d18fe72231eaba9d6a5f90866f8dd34b2b0dfc132db8348efa5a62634e5584a788aebbf073ccb4f3e9f5cde8d0c2e831412485c7f8cf1473abffabcc5d51d8a2a87a22f39d1a250b3cb66d90c573669071aeba9b1080dc079243094a9ae0e5a62e4e8b653cb57f54f4eeaf3d0281c05f8d638d1e0c47794d9305929b4b87281b69397f51b0809573edeb3dcb82f2376ee419491adfa4a9d7f6db51d9573f50d025cc64030744c05794d3350a8bd45b3c5a69b8552e6cbfa2038fb33d4094dd8bb1095c36d4356a88c6ba114cad0c5acfdd224b3f4bc1af30f9a1ee5ea5407a8ce3c71dd09a1ea33f44e63cb9c0cae176515e1e323874adc5c2b788e23bae5123a90b964e44ec2e9be90b496bb537967d05715e3737cd4c35f2bc87ab7cc9ee70116ed2528b3d62237413dfc56e0e470281c1008ced58a9828526335c9517b5ac58c5ae7e74c9c36a7e6c7f571878f3319f52cb8eeaeeee64694ee4a49e582c53b77adac0fb6c808830560c4f130d925e7cbbcaa1221c8a4d54ce116b4c4ce52a56882c5c38000c441673cb91d381a3c5b09cd8ad3d74841fb8d7f9d5cebc4bfd273d2fe28a08fc2df6a57207bef71c6a9d63d54a0d7677d450c6a6d4e9a937a82be8cd4a1677e7ac04712949c7683f412862d40aeaa899640503aabc8794a5ff13e7c72df049ee0fb8203a99fe94a5003c225b0281c10087d010acad9e1540cbfb2c03dcd987d3c2fbd0fa2cd10f2e5b216fad7016a58a98fb43fcaee266b21c99d213089696a0faea4710f8ee7bd9a5eb2452341e58feec965d76e2133236f8b44e8bdd86a591acf8af501cdcc1a5cb1065793b09c0a5536ed414cca22163758b0b41add238e62ea07acba89144f97b9e1509584210aced89986fead9b3d22253f0a7a7372e269a01356070d2e1afac08da15cf23ad29438b0b3fc8d9e8e9f99c8ca970ae703cca71974335adb96a16e85c97689c3a8c -Msg = 5ff000f84a951dbfdd635a4d9f1891e94fc2a6b11c245f26195b76ebebc2edcac412a2f896ce239a80dec3878d79ee509d49b97ea3cabd1a11f426739119071bf610f1337293c3e809e6c33e45b9ee0d2c508d486fe10985e43e00ba36b39845dc32143047ada5b260c482f931a03a26e21f499ae831ea7079822d4a43594951 -Salt = 61a762f8968d5f367e2dbcacb4021653dc75437d9000e3169d943729703837a5cbf4de62bdedc95fd0d1004e84751452 -Sig = 18cb47bbf80bad51006424830412d281c66ae45c0b756d03e5d8d49f73037968d13df46ebebd9b5b4c58b164d91d0608e8ebe31d8644cb0bebfaa8e2ccaa1f5746ac8f3bc02ff6930e219f53fe13fc070f910ba1cff0617aea6eb312c1ef285869746673ac1348e89c3646f583d7633f5a2341626bc2e7e2087ff9d8f13d573dc6455dc0068c7ac6eaf5b3093b081614f7b252170c4893891e469121fda655a2a55d67f5df0ff6e29ce5f9b0c3a1a88342140ead748edeea9706d6570e900f1cf3a9adcd7ae64f207585417946b104b3990d1a2d950e0e6a5533d3cfc8c470250e4c797273210f248b8922ab00422f2ecf85aef73587e8c5cd1c2ee6ed9509508409673fe07ee2c462c52d091e7a795d8d3c55fdd5a710d5450695a5a31ed76f115e71a73c6757d2def7ef472571b0bdc7558c71eaefeddec946860b0c77936db31f2001d0499a381e5018870b41ba04c8d42ec0dc55c9fa2af237dc1c405dd8f555b07a237cc50cbce46c3016118cf4ea06c047599283ad4719d647a225206e -Result = Pass - -Digest = SHA384 -Key = 308206e40201000282018100a7a1882a7fb896786034d07fb1b9f6327c27bdd7ce6fe39c285ae3b6c34259adc0dc4f7b9c7dec3ca4a20d3407339eedd7a12a421da18f5954673cac2ff059156ecc73c6861ec761e6a0f2a5a033a6768c6a42d8b459e1b4932349e84efd92df59b45935f3d0e30817c66201aa99d07ae36c5d74f408d69cc08f044151ff4960e531360cb19077833adf7bce77ecfaa133c0ccc63c93b856814569e0b9884ee554061b9a20ab46c38263c094dae791aa61a17f8d16f0e85b7e5ce3b067ece89e20bc4e8f1ae814b276d234e04f4e766f501da74ea7e3817c24ea35d016676cece652b823b051625573ca92757fc720d254ecf1dcbbfd21d98307561ecaab545480c7c52ad7e9fa6b597f5fe550559c2fe923205ac1761a99737ca02d7b19822e008a8969349c87fb874c81620e38f613c8521f0381fe5ba55b74827dad3e1cf2aa29c6933629f2b286ad11be88fa6436e7e3f64a75e3595290dc0d1cd5eee7aaac54959cc53bd5a934a365e72dd81a2bd4fb9a67821bffedf2ef2bd94913de8b02031415a702820180073a5fc4cd642f6113dffc4f84035cee3a2b8acc549703751a1d6a5eaa13487229a58ef7d7a522bb9f4f25510f1aa0f74c6a8fc8a5c5be8b91a674ede50e92f7e34a90a3c9da999fffb1d695e4588f451256c163484c151350cb9c7825a7d910845ee5cf826fecf9a7c0fbbbba22bb4a531c131d2e7761ba898f002ebef8ab87218511f81d3266e1ec07a7ca8622514c6dfdc86c67679a2c8f5f031de9a0c22b5a88060b46ee0c64d3b9af3c0a379bcd9c6a1b51cf6480456d3fd6def94cd2a6c171dd3f010e3c9d662bc857208248c94ebcb9fd997b9ff4a7e5fd95558569906525e741d78344f6f6cfdbd59d4faa52ee3fa964fb7cccb2d6be1935d211fe1498217716273939a946081fd8509913fd47747c5c2f03efd4d6fc9c6fcfd8402e9f40a0a5b3de3ca2b3c0fac9456938faa6cf2c20e3912e5981c9876d8ca1ff29b87a15eeae0ccce3f8a8f1e405091c083b98bcc5fe0d0deaae33c67c0394437f0eccb385b7efb17aeebba8afaecca30a2f63eac8f0ac8f1eacad85bbcaf3960b0281c100dd553696db8ccb107609b8917e688bdd8373a8926bc9d114c1c77f7958070e236ca1bd2025ded59a71093b63afbfce39e92bde9ffca983959e7c3e18d75650612258c24eebb61a1b4a68603a2721e3e2483d6da27475a228b1341c78f140948b5c922822ccaed76dae338dddec1e4c5c34b9c53f34a09ff0b2b61a62254e73e6f0ac8013edc2cfa7ecbeb86fcc7309cb0f5b5eddb707af4b9337d34d672af413f3b6efd11e3b49c978f06a356f6f4e0ea50a90797fe32ccaa983547ff18ea1670281c100c1e3089e1bea1141638ca912da01c134f67231a2f737d97e28486e004a43e9c5592ff968ee18109fc71aa4c1a97aa88ece5c4734352bc0c1f67726bc4aac59c19301f23a705be5b3f7825fb284e58a950d795f63d18fe72231eaba9d6a5f90866f8dd34b2b0dfc132db8348efa5a62634e5584a788aebbf073ccb4f3e9f5cde8d0c2e831412485c7f8cf1473abffabcc5d51d8a2a87a22f39d1a250b3cb66d90c573669071aeba9b1080dc079243094a9ae0e5a62e4e8b653cb57f54f4eeaf3d0281c05f8d638d1e0c47794d9305929b4b87281b69397f51b0809573edeb3dcb82f2376ee419491adfa4a9d7f6db51d9573f50d025cc64030744c05794d3350a8bd45b3c5a69b8552e6cbfa2038fb33d4094dd8bb1095c36d4356a88c6ba114cad0c5acfdd224b3f4bc1af30f9a1ee5ea5407a8ce3c71dd09a1ea33f44e63cb9c0cae176515e1e323874adc5c2b788e23bae5123a90b964e44ec2e9be90b496bb537967d05715e3737cd4c35f2bc87ab7cc9ee70116ed2528b3d62237413dfc56e0e470281c1008ced58a9828526335c9517b5ac58c5ae7e74c9c36a7e6c7f571878f3319f52cb8eeaeeee64694ee4a49e582c53b77adac0fb6c808830560c4f130d925e7cbbcaa1221c8a4d54ce116b4c4ce52a56882c5c38000c441673cb91d381a3c5b09cd8ad3d74841fb8d7f9d5cebc4bfd273d2fe28a08fc2df6a57207bef71c6a9d63d54a0d7677d450c6a6d4e9a937a82be8cd4a1677e7ac04712949c7683f412862d40aeaa899640503aabc8794a5ff13e7c72df049ee0fb8203a99fe94a5003c225b0281c10087d010acad9e1540cbfb2c03dcd987d3c2fbd0fa2cd10f2e5b216fad7016a58a98fb43fcaee266b21c99d213089696a0faea4710f8ee7bd9a5eb2452341e58feec965d76e2133236f8b44e8bdd86a591acf8af501cdcc1a5cb1065793b09c0a5536ed414cca22163758b0b41add238e62ea07acba89144f97b9e1509584210aced89986fead9b3d22253f0a7a7372e269a01356070d2e1afac08da15cf23ad29438b0b3fc8d9e8e9f99c8ca970ae703cca71974335adb96a16e85c97689c3a8c -Msg = 531dc2b8566e01a8bfc580da607ec212fc1fbebd5a2590d897046f0ec069df20a1c2278ad70006642d9ba28625d7c1efd4473b68f38fb064346d762bd2fbd5376c2e77de13a31a32a29b88264d44c9f27d3a97b8dc4d1267ab85b5e05c6389575d6a98fc32dea5dbc6cc1a01034a42e1a000b8f63ae720a9a7511474872a6148 -Salt = 61a762f8968d5f367e2dbcacb4021653dc75437d9000e3169d943729703837a5cbf4de62bdedc95fd0d1004e84751452 -Sig = 80baa663877615c2e7ca9dd89958a74e54012efad55ad05868dd74b0ce78a661e2b893c3ac1fd837f282327efe4b041220942649b5472c1ac702070787ae5549398a57653d5fca69cd5446d63f6e9d0684925a235acc96b8a10bdf14fbe209fcd4930b5945910d84b08867b2055fe8eb1d771b753759593b90d6aec5ef182cb33bf2fe29e8c67ea4e8433ecfa3f9ba4ce461f0ab19997f299e95409af97bf57e2de410ef7538f699f385c1abafdf9337f7f9d268da87b2b389131fe3dbefd8c67bd2a158cc4e04f9ab7fee2a58d74d063e6c16958a90574e3e4cb881d32c3116987e46bf5bd44f80abe6b9eb717a9fcd4c0cfe80dd2ca62c33b5dd3a59c64810073e0476085ec7b76638983291b69559c815cd3bb87d4b07e24c6b9ebb7028e800a04f09b110c167f6ee3a3bbb73695d89bee92407d4adcea3eaa47811e23f8c7f2fdfe891f8cfc071cb984a63846b95ec04d6261bb1c5980018feee15c4e7bf632dc8306128fa22c47decfd9e8b099554f17253635e6316712e0b95efa3fb00 -Result = Pass - -Digest = SHA384 -Key = 308206e40201000282018100a7a1882a7fb896786034d07fb1b9f6327c27bdd7ce6fe39c285ae3b6c34259adc0dc4f7b9c7dec3ca4a20d3407339eedd7a12a421da18f5954673cac2ff059156ecc73c6861ec761e6a0f2a5a033a6768c6a42d8b459e1b4932349e84efd92df59b45935f3d0e30817c66201aa99d07ae36c5d74f408d69cc08f044151ff4960e531360cb19077833adf7bce77ecfaa133c0ccc63c93b856814569e0b9884ee554061b9a20ab46c38263c094dae791aa61a17f8d16f0e85b7e5ce3b067ece89e20bc4e8f1ae814b276d234e04f4e766f501da74ea7e3817c24ea35d016676cece652b823b051625573ca92757fc720d254ecf1dcbbfd21d98307561ecaab545480c7c52ad7e9fa6b597f5fe550559c2fe923205ac1761a99737ca02d7b19822e008a8969349c87fb874c81620e38f613c8521f0381fe5ba55b74827dad3e1cf2aa29c6933629f2b286ad11be88fa6436e7e3f64a75e3595290dc0d1cd5eee7aaac54959cc53bd5a934a365e72dd81a2bd4fb9a67821bffedf2ef2bd94913de8b02031415a702820180073a5fc4cd642f6113dffc4f84035cee3a2b8acc549703751a1d6a5eaa13487229a58ef7d7a522bb9f4f25510f1aa0f74c6a8fc8a5c5be8b91a674ede50e92f7e34a90a3c9da999fffb1d695e4588f451256c163484c151350cb9c7825a7d910845ee5cf826fecf9a7c0fbbbba22bb4a531c131d2e7761ba898f002ebef8ab87218511f81d3266e1ec07a7ca8622514c6dfdc86c67679a2c8f5f031de9a0c22b5a88060b46ee0c64d3b9af3c0a379bcd9c6a1b51cf6480456d3fd6def94cd2a6c171dd3f010e3c9d662bc857208248c94ebcb9fd997b9ff4a7e5fd95558569906525e741d78344f6f6cfdbd59d4faa52ee3fa964fb7cccb2d6be1935d211fe1498217716273939a946081fd8509913fd47747c5c2f03efd4d6fc9c6fcfd8402e9f40a0a5b3de3ca2b3c0fac9456938faa6cf2c20e3912e5981c9876d8ca1ff29b87a15eeae0ccce3f8a8f1e405091c083b98bcc5fe0d0deaae33c67c0394437f0eccb385b7efb17aeebba8afaecca30a2f63eac8f0ac8f1eacad85bbcaf3960b0281c100dd553696db8ccb107609b8917e688bdd8373a8926bc9d114c1c77f7958070e236ca1bd2025ded59a71093b63afbfce39e92bde9ffca983959e7c3e18d75650612258c24eebb61a1b4a68603a2721e3e2483d6da27475a228b1341c78f140948b5c922822ccaed76dae338dddec1e4c5c34b9c53f34a09ff0b2b61a62254e73e6f0ac8013edc2cfa7ecbeb86fcc7309cb0f5b5eddb707af4b9337d34d672af413f3b6efd11e3b49c978f06a356f6f4e0ea50a90797fe32ccaa983547ff18ea1670281c100c1e3089e1bea1141638ca912da01c134f67231a2f737d97e28486e004a43e9c5592ff968ee18109fc71aa4c1a97aa88ece5c4734352bc0c1f67726bc4aac59c19301f23a705be5b3f7825fb284e58a950d795f63d18fe72231eaba9d6a5f90866f8dd34b2b0dfc132db8348efa5a62634e5584a788aebbf073ccb4f3e9f5cde8d0c2e831412485c7f8cf1473abffabcc5d51d8a2a87a22f39d1a250b3cb66d90c573669071aeba9b1080dc079243094a9ae0e5a62e4e8b653cb57f54f4eeaf3d0281c05f8d638d1e0c47794d9305929b4b87281b69397f51b0809573edeb3dcb82f2376ee419491adfa4a9d7f6db51d9573f50d025cc64030744c05794d3350a8bd45b3c5a69b8552e6cbfa2038fb33d4094dd8bb1095c36d4356a88c6ba114cad0c5acfdd224b3f4bc1af30f9a1ee5ea5407a8ce3c71dd09a1ea33f44e63cb9c0cae176515e1e323874adc5c2b788e23bae5123a90b964e44ec2e9be90b496bb537967d05715e3737cd4c35f2bc87ab7cc9ee70116ed2528b3d62237413dfc56e0e470281c1008ced58a9828526335c9517b5ac58c5ae7e74c9c36a7e6c7f571878f3319f52cb8eeaeeee64694ee4a49e582c53b77adac0fb6c808830560c4f130d925e7cbbcaa1221c8a4d54ce116b4c4ce52a56882c5c38000c441673cb91d381a3c5b09cd8ad3d74841fb8d7f9d5cebc4bfd273d2fe28a08fc2df6a57207bef71c6a9d63d54a0d7677d450c6a6d4e9a937a82be8cd4a1677e7ac04712949c7683f412862d40aeaa899640503aabc8794a5ff13e7c72df049ee0fb8203a99fe94a5003c225b0281c10087d010acad9e1540cbfb2c03dcd987d3c2fbd0fa2cd10f2e5b216fad7016a58a98fb43fcaee266b21c99d213089696a0faea4710f8ee7bd9a5eb2452341e58feec965d76e2133236f8b44e8bdd86a591acf8af501cdcc1a5cb1065793b09c0a5536ed414cca22163758b0b41add238e62ea07acba89144f97b9e1509584210aced89986fead9b3d22253f0a7a7372e269a01356070d2e1afac08da15cf23ad29438b0b3fc8d9e8e9f99c8ca970ae703cca71974335adb96a16e85c97689c3a8c -Msg = a454391a7c3695486c337a41c2add417d8e9e9c6466d2ebb56ad5f97b9e7ce30784cfcd82d6066e372a3a1639a71a9369f2777435c87d100fc5e6638b3631a0bac639f36429b4594726613e5901816cf3a29f9228b96d66090844c7d0026d2e327e24ab924afda6554c2f74f0e69c2e8913798ec3a61e4e4fb6838ee08f89dc0 -Salt = 61a762f8968d5f367e2dbcacb4021653dc75437d9000e3169d943729703837a5cbf4de62bdedc95fd0d1004e84751452 -Sig = 261180717edd905b647bc869f5259203811606221f545a3aee5fc123f297cf7d8a7ee6cee3dc8f97d24284ccdec2fd4680f1428ee75797e0379512aecb9fc1667523413e323c4bd7dded5caf9e5c606e5ee0c694d4d1b5a1f1cb613b980129f64146e42e8261c1f7ef5603954d34d56a50f7431beee5ab291a4759168655a5123640d596b744d97979d39f874ea7ff13a7466a7655d02edb492b58049f2208852297eb023e657f3240c5da9a99fd377728bff3cc073109c31712d94bc24e08c433533d4b86a73b58fbf2c598ccad78d46ca0a055601850960195aac1364dfaddbd06f14a78aac2ab4d374505cc61fc72c1050647d95a733517b709aed2d896721e7484208501480058fa4f6044302dd705c273fa7fb42eaeb02d025092b252e16d270d88dab6f68fd7ad571011f89627683e029d1bf1edc149d47452ebe87ec68679579940f5aec25999b0dedb820a5483ec6901abfee041c03b1a7f743548a2caabca613ff5d9f8fd7c694af12b29f2c2468eff55f9e008757443960fae459e -Result = Pass - -Digest = SHA384 -Key = 308206e40201000282018100a7a1882a7fb896786034d07fb1b9f6327c27bdd7ce6fe39c285ae3b6c34259adc0dc4f7b9c7dec3ca4a20d3407339eedd7a12a421da18f5954673cac2ff059156ecc73c6861ec761e6a0f2a5a033a6768c6a42d8b459e1b4932349e84efd92df59b45935f3d0e30817c66201aa99d07ae36c5d74f408d69cc08f044151ff4960e531360cb19077833adf7bce77ecfaa133c0ccc63c93b856814569e0b9884ee554061b9a20ab46c38263c094dae791aa61a17f8d16f0e85b7e5ce3b067ece89e20bc4e8f1ae814b276d234e04f4e766f501da74ea7e3817c24ea35d016676cece652b823b051625573ca92757fc720d254ecf1dcbbfd21d98307561ecaab545480c7c52ad7e9fa6b597f5fe550559c2fe923205ac1761a99737ca02d7b19822e008a8969349c87fb874c81620e38f613c8521f0381fe5ba55b74827dad3e1cf2aa29c6933629f2b286ad11be88fa6436e7e3f64a75e3595290dc0d1cd5eee7aaac54959cc53bd5a934a365e72dd81a2bd4fb9a67821bffedf2ef2bd94913de8b02031415a702820180073a5fc4cd642f6113dffc4f84035cee3a2b8acc549703751a1d6a5eaa13487229a58ef7d7a522bb9f4f25510f1aa0f74c6a8fc8a5c5be8b91a674ede50e92f7e34a90a3c9da999fffb1d695e4588f451256c163484c151350cb9c7825a7d910845ee5cf826fecf9a7c0fbbbba22bb4a531c131d2e7761ba898f002ebef8ab87218511f81d3266e1ec07a7ca8622514c6dfdc86c67679a2c8f5f031de9a0c22b5a88060b46ee0c64d3b9af3c0a379bcd9c6a1b51cf6480456d3fd6def94cd2a6c171dd3f010e3c9d662bc857208248c94ebcb9fd997b9ff4a7e5fd95558569906525e741d78344f6f6cfdbd59d4faa52ee3fa964fb7cccb2d6be1935d211fe1498217716273939a946081fd8509913fd47747c5c2f03efd4d6fc9c6fcfd8402e9f40a0a5b3de3ca2b3c0fac9456938faa6cf2c20e3912e5981c9876d8ca1ff29b87a15eeae0ccce3f8a8f1e405091c083b98bcc5fe0d0deaae33c67c0394437f0eccb385b7efb17aeebba8afaecca30a2f63eac8f0ac8f1eacad85bbcaf3960b0281c100dd553696db8ccb107609b8917e688bdd8373a8926bc9d114c1c77f7958070e236ca1bd2025ded59a71093b63afbfce39e92bde9ffca983959e7c3e18d75650612258c24eebb61a1b4a68603a2721e3e2483d6da27475a228b1341c78f140948b5c922822ccaed76dae338dddec1e4c5c34b9c53f34a09ff0b2b61a62254e73e6f0ac8013edc2cfa7ecbeb86fcc7309cb0f5b5eddb707af4b9337d34d672af413f3b6efd11e3b49c978f06a356f6f4e0ea50a90797fe32ccaa983547ff18ea1670281c100c1e3089e1bea1141638ca912da01c134f67231a2f737d97e28486e004a43e9c5592ff968ee18109fc71aa4c1a97aa88ece5c4734352bc0c1f67726bc4aac59c19301f23a705be5b3f7825fb284e58a950d795f63d18fe72231eaba9d6a5f90866f8dd34b2b0dfc132db8348efa5a62634e5584a788aebbf073ccb4f3e9f5cde8d0c2e831412485c7f8cf1473abffabcc5d51d8a2a87a22f39d1a250b3cb66d90c573669071aeba9b1080dc079243094a9ae0e5a62e4e8b653cb57f54f4eeaf3d0281c05f8d638d1e0c47794d9305929b4b87281b69397f51b0809573edeb3dcb82f2376ee419491adfa4a9d7f6db51d9573f50d025cc64030744c05794d3350a8bd45b3c5a69b8552e6cbfa2038fb33d4094dd8bb1095c36d4356a88c6ba114cad0c5acfdd224b3f4bc1af30f9a1ee5ea5407a8ce3c71dd09a1ea33f44e63cb9c0cae176515e1e323874adc5c2b788e23bae5123a90b964e44ec2e9be90b496bb537967d05715e3737cd4c35f2bc87ab7cc9ee70116ed2528b3d62237413dfc56e0e470281c1008ced58a9828526335c9517b5ac58c5ae7e74c9c36a7e6c7f571878f3319f52cb8eeaeeee64694ee4a49e582c53b77adac0fb6c808830560c4f130d925e7cbbcaa1221c8a4d54ce116b4c4ce52a56882c5c38000c441673cb91d381a3c5b09cd8ad3d74841fb8d7f9d5cebc4bfd273d2fe28a08fc2df6a57207bef71c6a9d63d54a0d7677d450c6a6d4e9a937a82be8cd4a1677e7ac04712949c7683f412862d40aeaa899640503aabc8794a5ff13e7c72df049ee0fb8203a99fe94a5003c225b0281c10087d010acad9e1540cbfb2c03dcd987d3c2fbd0fa2cd10f2e5b216fad7016a58a98fb43fcaee266b21c99d213089696a0faea4710f8ee7bd9a5eb2452341e58feec965d76e2133236f8b44e8bdd86a591acf8af501cdcc1a5cb1065793b09c0a5536ed414cca22163758b0b41add238e62ea07acba89144f97b9e1509584210aced89986fead9b3d22253f0a7a7372e269a01356070d2e1afac08da15cf23ad29438b0b3fc8d9e8e9f99c8ca970ae703cca71974335adb96a16e85c97689c3a8c -Msg = a05e5782a96ee6d6f10be8830d8c27c0acf272abbf77e684dd6a6c19e5398381e5d0400d3a21927cf904cb6e8e425c1ca3ece04544f25d6c40f0c640d24bc45c807db53044adf63fea835d8cb93a0a4e55f760ebe4594e247051d38d8c34c1413b0ec1d30d3a97888b2fa7c3d59db8c08ab9f985e8d4411635339be95d1b0299 -Salt = 61a762f8968d5f367e2dbcacb4021653dc75437d9000e3169d943729703837a5cbf4de62bdedc95fd0d1004e84751452 -Sig = 87d80275df7b196b7e1d0a41147719d773edd80b5627301a500d91665ba86076e6a31c8f3ae86aedb643fe2af223976ea4eb3d4dca2cbcf81ffd14b7ef7de3ee355a8d0f4143e5b0f0a0950a42811102e602cd214e1c945c47e8b7b66d507103c3456f404f9c48aa7fe48dee0aad05e599f242adcf8ccb0cc9db3a6c244a913551ab595600ecfbb67c25a95b54f4054397abe47650e5c4991edaf1441ba9c8e3fbed904ffbc977142ebdc84769865a215158d5b052e75de318d75012172e28c31db2d8bd4edca787216dde2a7387c543f162fc91924918fd6c845bf1ebc0220a1027fb4227340ca4cb0f183e5b34b1e7f93e14fa57bb9d2d2ea53f86d838bcbe3f055b473b0b469afd2960c0d76ce2c30f3d49a3b29065bb9260248e728cbe328bdf502b109e1f20b9d037860cf9e261611b4cbf27ff9b5bf425b2612afc7cfa3138f78ad26077cbfb947fb2aae6f4be85ab2d1a15860839b822dd03a1a92a19a5c7244e98bdf561625ca2a8df410ff855752ebdf3d49f5eb98f228acdd52791 -Result = Pass - diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/tests/rsa_pss_verify_tests.txt temporalio-1.3.0/vendor/ring-0.16.20/tests/rsa_pss_verify_tests.txt --- temporalio-1.3.0/vendor/ring-0.16.20/tests/rsa_pss_verify_tests.txt 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/tests/rsa_pss_verify_tests.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,335 +0,0 @@ -# RSA PSS Test Vectors for FIPS 186-4 from SigVerPSS_186-3.rsp in -# http://csrc.nist.gov/groups/STM/cavp/documents/dss/186-3rsatestvectors.zip -# accessible from -# http://csrc.nist.gov/groups/STM/cavp/digital-signatures.html#test-vectors -# with SHA-384 digest a57b08a04af67086b065b91789a09f53b940b51df4ad7a56246211d329f04560415684d2ce23658a691cb9d14353ab01 -# filtered and reformatted using convert_nist_rsa_test_vectors.py. -# -# Digest = SHAAlg. -# Key is (n, e) encoded in an ASN.1 (DER) sequence. -# Sig = S. - -Digest = SHA256 -Key = 3082010a0282010100a47d04e7cacdba4ea26eca8a4c6e14563c2ce03b623b768c0d49868a57121301dbf783d82f4c055e73960e70550187d0af62ac3496f0a3d9103c2eb7919a72752fa7ce8c688d81e3aee99468887a15288afbb7acb845b7c522b5c64e678fcd3d22feb84b44272700be527d2b2025a3f83c2383bf6a39cf5b4e48b3cf2f56eef0dfff18555e31037b915248694876f3047814415164f2c660881e694b58c28038a032ad25634aad7b39171dee368e3d59bfb7299e4601d4587e68caaf8db457b75af42fc0cf1ae7caced286d77fac6cedb03ad94f1433d2c94d08e60bc1fdef0543cd2951e765b38230fdd18de5d2ca627ddc032fe05bbd2ff21e2db1c2f94d8b020310e43f -Msg = 7518c85b67e7aef7f26bf006899faef76e076f0c6c946e5dc9c83521771a6d298a9cf5adefdb314b5a07a54d8054c22b879fff50ba552c218291033c918401fd611a7447dddad4815e0f56ded825bfe256557622a385de4b4a69e265c1efd259e2da6db19aac3fa0e5ca2d42fadb4e24c271fc078feb2be10b9afa256f228844 -Sig = 992d48b21bb3d2219b44e8fcc8633cf3aeb591de90f4386496ac7ecd284cb63d7dff81a50b8c4fed9f2ef737692ea6be05248ca138947b49b4e7f3cce6640e049ac2154c40f57e22fa14f97e7a9507e1dc98b206ce6ea0e180039199d1be0a15d1f5093a459e5101aaca2a23cb1f59cad2f1fb99dc956b9d4344bad2c1121d63b915004acbfc7ac60ac9a7b0b1c6812b30bfe087f7f0c7d1625f9c4f458515e11478e3604aa39d14d08bea30b01fcd6189e6f9b701d360e4714d45556b29815c8d8fa8e46e10749ba5e8d445a4c0f487e70ab5890b7ccc1651282a54e87e7db4bb2f7d4a671e71c43c55cf6486416f171d1955037474d06a71dd078767848e5d -Result = F (4 - Format of the EM is incorrect - hash moved to left ) - -Digest = SHA256 -Key = 3082010a0282010100a47d04e7cacdba4ea26eca8a4c6e14563c2ce03b623b768c0d49868a57121301dbf783d82f4c055e73960e70550187d0af62ac3496f0a3d9103c2eb7919a72752fa7ce8c688d81e3aee99468887a15288afbb7acb845b7c522b5c64e678fcd3d22feb84b44272700be527d2b2025a3f83c2383bf6a39cf5b4e48b3cf2f56eef0dfff18555e31037b915248694876f3047814415164f2c660881e694b58c28038a032ad25634aad7b39171dee368e3d59bfb7299e4601d4587e68caaf8db457b75af42fc0cf1ae7caced286d77fac6cedb03ad94f1433d2c94d08e60bc1fdef0543cd2951e765b38230fdd18de5d2ca627ddc032fe05bbd2ff21e2db1c2f94d8b020310e43f -Msg = e002377affb04f0fe4598de9d92d31d6c786040d5776976556a2cfc55e54a1dcb3cb1b126bd6a4bed2a184990ccea773fcc79d246553e6c64f686d21ad4152673cafec22aeb40f6a084e8a5b4991f4c64cf8a927effd0fd775e71e8329e41fdd4457b3911173187b4f09a817d79ea2397fc12dfe3d9c9a0290c8ead31b6690a6 -Sig = 4f9b425c2058460e4ab2f5c96384da2327fd29150f01955a76b4efe956af06dc08779a374ee4607eab61a93adc5608f4ec36e47f2a0f754e8ff839a8a19b1db1e884ea4cf348cd455069eb87afd53645b44e28a0a56808f5031da5ba9112768dfbfca44ebe63a0c0572b731d66122fb71609be1480faa4e4f75e43955159d70f081e2a32fbb19a48b9f162cf6b2fb445d2d6994bc58910a26b5943477803cdaaa1bd74b0da0a5d053d8b1dc593091db5388383c26079f344e2aea600d0e324164b450f7b9b465111b7265f3b1b063089ae7e2623fc0fda8052cf4bf3379102fbf71d7c98e8258664ceed637d20f95ff0111881e650ce61f251d9c3a629ef222d -Result = P - -Digest = SHA256 -Key = 3082010a0282010100a47d04e7cacdba4ea26eca8a4c6e14563c2ce03b623b768c0d49868a57121301dbf783d82f4c055e73960e70550187d0af62ac3496f0a3d9103c2eb7919a72752fa7ce8c688d81e3aee99468887a15288afbb7acb845b7c522b5c64e678fcd3d22feb84b44272700be527d2b2025a3f83c2383bf6a39cf5b4e48b3cf2f56eef0dfff18555e31037b915248694876f3047814415164f2c660881e694b58c28038a032ad25634aad7b39171dee368e3d59bfb7299e4601d4587e68caaf8db457b75af42fc0cf1ae7caced286d77fac6cedb03ad94f1433d2c94d08e60bc1fdef0543cd2951e765b38230fdd18de5d2ca627ddc032fe05bbd2ff21e2db1c2f94d8b020310e43f -Msg = a3bf44cae8aa8347fd07d84a33eec5dbbdd7b6431368887c988c4be779c5473dd8c33ec82a35f1d3dddfe55f3eed67179b87ce86a4a50088172538fe9d1b06c6ef6897eb3c8e3618cfc21353ed4343e7fceb09a2eb035441cd5c8829c79b81582dd5d69ae85c5a001bd8e98e069961342a2bee00ad2b8b91015ac5cfc1f0c2d9 -Sig = 877f20eed60f8ce286108a5dde9b6828b37e3fbdb08fe153e591513897440f21f81214598fba08ea077394ba8c2a44aa4f0d8f3a5fbaec3dc69b3bddfbe28397c90adf35d08ea771c7aaa31eb06413c1c62b77618af940f4c71859fa4384d29b48e5cfc941d69bf0a3804d2008e758742b8ed68754bc71d231623d181347c36833a7d7160f742a37ce7d432d748e514aa7d8156b50c532151390d086cdcf9d59f122c6d97f4ccb737289f7b00a237cb6b4aae6ba79d41ff73d019a26b59ade04c967356e2aad52f115357ffb7676f190db38dcfc98666e5b258559c8c85fa32942cbcb99d757e8847e56a1687b3302415698708191b136d923349b02fe38b6be -Result = F (1 - Message changed) - -Digest = SHA256 -Key = 3082010a0282010100a47d04e7cacdba4ea26eca8a4c6e14563c2ce03b623b768c0d49868a57121301dbf783d82f4c055e73960e70550187d0af62ac3496f0a3d9103c2eb7919a72752fa7ce8c688d81e3aee99468887a15288afbb7acb845b7c522b5c64e678fcd3d22feb84b44272700be527d2b2025a3f83c2383bf6a39cf5b4e48b3cf2f56eef0dfff18555e31037b915248694876f3047814415164f2c660881e694b58c28038a032ad25634aad7b39171dee368e3d59bfb7299e4601d4587e68caaf8db457b75af42fc0cf1ae7caced286d77fac6cedb03ad94f1433d2c94d08e60bc1fdef0543cd2951e765b38230fdd18de5d2ca627ddc032fe05bbd2ff21e2db1c2f94d8b020310e43f -Msg = e1c46c309b6366fb4d56ac08c9393cee9a7c95bbe7b7c0e79a3d9187c0f42bc33364c28a770da585e3fe7b4901a3ccd037dfc42aa65a3470521ddafa835ce2d16c92ac670bd4d086505e608781736dc4dd64cc5080ee19e586c8fd1d737dade5d378b32f1d5df1e8dda0e32a125024b2d53334943c18782d7e69825a580093e7 -Sig = 8ed1f28fd16d45d416a21554e104c006fd7868e5895e8b99831ae0938135b543610df64a8c3574d08118bfe396f9a5609a8dbda21b9a8530ff0ba90e629d6abe30d2c1b590600db971fcda80e6eaa84017e209b9bd3b641f3c81d5d27f842bec8019790ed99a0e5db4aedc1c070b047c19410cbc56e9a0ff12d8f6e5d7371b1011ecfecf7be7a74f94403590a52f95238dd69e0b5f4c1fcde97ecfdb1acc3803e59ad8b3088b2bc509e3dd12d40d875625dc8362c579176799c75e4fadcdb392c68f401f68d854e46377f084c081f9d83743039f6934722e30ef3f0226bc841d79a4eb68c5cccbb6ae0e9200444e50ff0d0953047ef955d2d39a70c3b837c5f4 -Result = F (3 - Signature changed ) - -Digest = SHA256 -Key = 3082010a0282010100a47d04e7cacdba4ea26eca8a4c6e14563c2ce03b623b768c0d49868a57121301dbf783d82f4c055e73960e70550187d0af62ac3496f0a3d9103c2eb7919a72752fa7ce8c688d81e3aee99468887a15288afbb7acb845b7c522b5c64e678fcd3d22feb84b44272700be527d2b2025a3f83c2383bf6a39cf5b4e48b3cf2f56eef0dfff18555e31037b915248694876f3047814415164f2c660881e694b58c28038a032ad25634aad7b39171dee368e3d59bfb7299e4601d4587e68caaf8db457b75af42fc0cf1ae7caced286d77fac6cedb03ad94f1433d2c94d08e60bc1fdef0543cd2951e765b38230fdd18de5d2ca627ddc032fe05bbd2ff21e2db1c2f94d8b020310e43f -Msg = 925d59f953cb3ffb6d5a3a55c079cb1083997536e33d7c8aed50ed76aebcde459938f79229613200c70dde2ceddceae08c10608aab9e30ec51842f14a65e5f8f553471da3497881927ec400b4207ef3e2dfc2b7fcd318c9520b8b22f69dc8a1a8efaceb7be93cbad569e67db062362913005dcff902018ed22937fad405fe84e -Sig = 62b07f6d1b8f13651d7f22ce2ce01061090029db5af7dcecfeafef20621dd9e254a0fb914f76a3d79662257489cb8122708583d30778791a77da83c7bea81140c61e4d0484806e20fb85f24d1bbf774ef2ed38809c9b14f2a58c6e8649b760baa901544522ed94bd405c77201d07c8d12864a8d1e97a4d322c29994b214fc83c2ecd5c955b9bdec424e7ca5a1325ec0aae4ab0c202b980a2187f096aaaaa5e85550ebd325799f4f30ef2ead07e79c7a475667f5965e6b50269513659ab5962a391c43cbc3a3da34c0fdd1546c40ea7e2eb5352ce6a06ce6a6385ca0ddd5d162c137836df9ea1f89cfa00c3eb1671a43bd625526f3b6ba8e48a7a2d56fb4f01c6 -Result = F (5 - Format of the EM is incorrect - 00 on end of pad removed ) - -Digest = SHA256 -Key = 3082010a0282010100a47d04e7cacdba4ea26eca8a4c6e14563c2ce03b623b768c0d49868a57121301dbf783d82f4c055e73960e70550187d0af62ac3496f0a3d9103c2eb7919a72752fa7ce8c688d81e3aee99468887a15288afbb7acb845b7c522b5c64e678fcd3d22feb84b44272700be527d2b2025a3f83c2383bf6a39cf5b4e48b3cf2f56eef0dfff18555e31037b915248694876f3047814415164f2c660881e694b58c28038a032ad25634aad7b39171dee368e3d59bfb7299e4601d4587e68caaf8db457b75af42fc0cf1ae7caced286d77fac6cedb03ad94f1433d2c94d08e60bc1fdef0543cd2951e765b38230fdd18de5d2ca627ddc032fe05bbd2ff21e2db1c2f94d8b02033c6cd1 -Msg = 08d3ac24a595da811cc9bba78828f1452ff390ae653f22d1ad91ef6b22aa7b7b15a44ff7f83efcbd7a755eccf4541eb4040c7a4b774749a26dba3937b7f95c6c8490e3383d4f291dade5f35a65b1f6615fd4998be18bfd0ba4bc3a2136ceec909dbeef513d6f6689fc4202b9a3e78134877374d76ab246f49cbe7a8f65d034cd -Sig = 72ea7d669ac699a149c13aa168eb3e148f590bbc0424951f1c3144c541915573ecf05cabb5275488c98d0ebe55b1f1af49ef8cc72cf00e849897c6afa53833caf9ffc00eb84cfe55b8277e93a6ac3e04b111c9d07ad62082ca32854c40de1e0956a18f8460438484403abb91e6fad12b28f114157f1b6ef563d2fa438ccb8a16aa3afe6ec5e98365c30d9a355e7e14b039bbdecf59f91248d0f1e317d2e3c819096ed68cf98361d7f9310b354f4f45e2f7c4dfb82c218cd438f3174a6f017f0f148a71c40ad5b7e2c8081ddbaeaa764d601bb2e075eb3618aabaa4b5060022c6d23ef072643686a759227daef0331b28ee76da4ab3b5ad5dda8991b9937d1a59 -Result = F (2 - Public Key e changed ) - -Digest = SHA384 -Key = 3082010b0282010100cb59aae30883db678ea7b2a5e7009799066f060757525166030714a25e808482e752f04f78611b3509d6005b411530c9ada4d8fbddc85f9db3d209eccc6cf0cae9aeb902e96688d2547974b7eb3323eeaa2257cf8d5c7c97f5176e2cfd29e19d0487380e3e64338c73bd592d52e9dbcc9606ed5835758c1a112c6a004256b5c4338322695df2ba573be0e79a7b9f9afd497dd38eed39f05f88d7d399d1e984d048067596ad1847ce51221babf51873bad2d81fa91cf3d9fd307e3ebd41fc49a8b3252ed7a71fd2357330bef2f1f89f2c80f740567e2ae8d168e56f007e8fefa33d2eb92b7d830a4f978ffe842ef0697db50602b19642afc50ac1f837e476c0fd020400cbb343 -Msg = 329b4257ece34ecc0185031b0bc665c9c87ac66ec01a8c69281734d2076e97b0977d6c6cee140f86ddd0818719a4af3798b9f70f3e78e8f1b9e54917aa2e5d4a05836654ba2968b795ca2f9f621093165672fb77aa4d20258936147c2c8f8208445837f59848e1c7ef1c174c30309acec84cdb8c4cc0bd6c5fb39bead7b88d54 -Sig = bc7b0631f92c7dfb0e3e8694650bdc73623d0356ad2897aad8eca32ef4531263f3219e0af3ef2fa3b8a3eb878b3f9c293c634263bab59b1dbdee04afc3fe39dd8bcf22a0052e6a081d3b68399294c8c6aab199beefc49706eb3436d95bd3e655d21cbb0fb3488052df8819594ab0f9138fc5ad4e9e3521425e375684d94dd74b9a3a7a858aa1023e967502a38b67ed3b8b8f6086427e8c8b4ca608c4b394fc8dfb818daaec3d4f10e77f51d80c0a103569dc28814a80eca64100d9fce5d6b9081f871bf8aae624f1786151290c86dfac7643b21c74f4f5313bf8b7693dabe4c816d7d309ce27f4b08b59d6a26795a9c2278ffa2185a1af12257a5a6de57c1a41 -Result = F (2 - Public Key e changed ) - -Digest = SHA384 -Key = 3082010a0282010100cb59aae30883db678ea7b2a5e7009799066f060757525166030714a25e808482e752f04f78611b3509d6005b411530c9ada4d8fbddc85f9db3d209eccc6cf0cae9aeb902e96688d2547974b7eb3323eeaa2257cf8d5c7c97f5176e2cfd29e19d0487380e3e64338c73bd592d52e9dbcc9606ed5835758c1a112c6a004256b5c4338322695df2ba573be0e79a7b9f9afd497dd38eed39f05f88d7d399d1e984d048067596ad1847ce51221babf51873bad2d81fa91cf3d9fd307e3ebd41fc49a8b3252ed7a71fd2357330bef2f1f89f2c80f740567e2ae8d168e56f007e8fefa33d2eb92b7d830a4f978ffe842ef0697db50602b19642afc50ac1f837e476c0fd020324f1bf -Msg = 3cbc49d73addbe2875dde779689a363e42cf88b3e13ab520fcfe655ba246268fe32bbc3dcdd8b8809aeb4d95271f5e9aa828db969bdf4ebafa9fb1e7b5ef83705f611b2027ba3b7f0b52e85148be796015adef7b901084bff97e87151ed666fc16260d8932cb6eab31da61b4b3bfaf15f1246969aa157fb661618defc543f8bd -Sig = 37c9ca333ade423c46419ea16c5d79f56165a03bd5c674fa0127500a1bd7f5c2d21547d7bb45f558b3b986624c8eaef4db101e4092dda2b4fe48811ef7fa694c1384f460087f81cac1861425e44b86bc2fd825eea94b645afa4afca29f632edce048aea9e1365185a60821e4385de7d7435ec00d307d477b2e6a6e3cde0f340c71d2c59624a7ac8cfb838f68b436c403ab3b45f9a19a0a14ea8f47407b7e25e51a498a902ed8eefe9c493421421695a6d17a9cd5b76efad7b39b8d584cc2902c03422f06af528c6bc65bcebd8876b5f4d1ebb68ce22af5de05105837c15f5ff5c4d41ed8019d6a0448c94675e192a51d5eade91d2237ed57773cf3b37ba3da71 -Result = F (1 - Message changed) - -Digest = SHA384 -Key = 3082010a0282010100cb59aae30883db678ea7b2a5e7009799066f060757525166030714a25e808482e752f04f78611b3509d6005b411530c9ada4d8fbddc85f9db3d209eccc6cf0cae9aeb902e96688d2547974b7eb3323eeaa2257cf8d5c7c97f5176e2cfd29e19d0487380e3e64338c73bd592d52e9dbcc9606ed5835758c1a112c6a004256b5c4338322695df2ba573be0e79a7b9f9afd497dd38eed39f05f88d7d399d1e984d048067596ad1847ce51221babf51873bad2d81fa91cf3d9fd307e3ebd41fc49a8b3252ed7a71fd2357330bef2f1f89f2c80f740567e2ae8d168e56f007e8fefa33d2eb92b7d830a4f978ffe842ef0697db50602b19642afc50ac1f837e476c0fd020324f1bf -Msg = 59632917bcef9eaa6edb1bb6013bef9e5d285fe212c49b44ed78f129ca804141a8aab16a035aa1d25ed2e25c1fb022469fb8ab0882d44e7f4459994a158c5175e7651c54c5937db266bf052c0215c8d764010f2941364c16c8f553797a8cc6b63c1dd19daaa01892af2beeeb5271c89ad38af10cf7f27f51a0d3857ca0878a4d -Sig = 77a69f4fbd9456eb8cb973e2623d8ea83df850f3c7bc7c8f976728f11b2daa6204ec45e15cd36dcdba5d88bcdeca490bf488a32d12be8c93d9fc63d2a91fcbd79b4bed113dd98bf5b93673a1c143828f47935aeeada7938c65717fb8b370cf649134f6fde56602ba7d6f890ba166d3fe1c51e7471c98b661a6022d7d1d0caa5be5d140e94e70cd1478b9b33622ad69559e27cd6878925cf07f37f5dbd1ae457eea785053d06e2e4d010fd885b897f743ec09c2b06f774407123ac30cd91f81080845f885062fa4be9da31f4e6f626c61a7fefbc123e8b7b80978682b773b5537b2366d1118f506464d27db3991fc2af283abbed6d0c552120f82f906c38c2e0b -Result = F (3 - Signature changed ) - -Digest = SHA384 -Key = 3082010a0282010100cb59aae30883db678ea7b2a5e7009799066f060757525166030714a25e808482e752f04f78611b3509d6005b411530c9ada4d8fbddc85f9db3d209eccc6cf0cae9aeb902e96688d2547974b7eb3323eeaa2257cf8d5c7c97f5176e2cfd29e19d0487380e3e64338c73bd592d52e9dbcc9606ed5835758c1a112c6a004256b5c4338322695df2ba573be0e79a7b9f9afd497dd38eed39f05f88d7d399d1e984d048067596ad1847ce51221babf51873bad2d81fa91cf3d9fd307e3ebd41fc49a8b3252ed7a71fd2357330bef2f1f89f2c80f740567e2ae8d168e56f007e8fefa33d2eb92b7d830a4f978ffe842ef0697db50602b19642afc50ac1f837e476c0fd020324f1bf -Msg = b9403622a632794f7cd74fbba93aaa64c8d91b63144fe7ba23305c4cd135652d7a995d1c6cc2214e9b24696e976358e1bcb7514ea8950d5ef38ceac01a6d8671bbae8d3a0810cf7a76809625b53b360de536e56007bdcd72b15a60bd06f8ec27e6486f836264ac5973b37eeaeb0c6d6fab1e7fa2170f507fc763654c7f20bed7 -Sig = 81511a0c2eb37d5c6fe2c214c55d6b0e5fcea17242d5a5a9eb4568ac1f0af9b8912498ead877ca43cf9e19c743c3d8ea6f4e67301de53ebb81a1a3eaff67d72e450ffc6646b6b45ce8826957b9afbb13f571c38852c3eb384f6a595538ebf467414f3522471147f2ccb347284d0873018bf6329f33e0b49f4e86338b423a1027a6c4718187d19281aa896a286b6c89622e4cbf4cc6cf4c3ad4443516aec8708006dcbca5f42c9b943fc8cdcee23d9099edf61185635b53ad4d8853d8a511cdc50e189cc8929dfd32f9dcdcf2754adcc19b855f41d25620b65090180ece407427e9ab602a38f1f289eaf3299db856cc5bbda17de17a74bace89913813d147d9ac -Result = F (5 - Format of the EM is incorrect - 00 on end of pad removed ) - -Digest = SHA384 -Key = 3082010a0282010100cb59aae30883db678ea7b2a5e7009799066f060757525166030714a25e808482e752f04f78611b3509d6005b411530c9ada4d8fbddc85f9db3d209eccc6cf0cae9aeb902e96688d2547974b7eb3323eeaa2257cf8d5c7c97f5176e2cfd29e19d0487380e3e64338c73bd592d52e9dbcc9606ed5835758c1a112c6a004256b5c4338322695df2ba573be0e79a7b9f9afd497dd38eed39f05f88d7d399d1e984d048067596ad1847ce51221babf51873bad2d81fa91cf3d9fd307e3ebd41fc49a8b3252ed7a71fd2357330bef2f1f89f2c80f740567e2ae8d168e56f007e8fefa33d2eb92b7d830a4f978ffe842ef0697db50602b19642afc50ac1f837e476c0fd020324f1bf -Msg = f991a40a6c3cda01f1a2fed01ca0cf425588a071205eb997a147fa205f3ec10448090e53f56be512309cf445b3f6764d33f157749d5199c7a09ef6246bd5c793b85d24d9093c4d4b318b48e11727cc8bb7aa5ec8699aba7466e074e1887bdf2a51752ec42f16d956fe5943cbcf9c99a5e89bfd940c9fe447fcf3bc823d98d371 -Sig = 6b42514e88d93079d158336897dc34b450e424d61f6ddcf86fe8c9a368ae8a22c4ee4084c978b5169379da10ae6a6ae8cd80028e198cd0a8db532cd78a409f53baf7d231b545835b0dc06d594d76868d986889419a959268fd321bbc8bad5e800e452fe1a1a2a5a851d542494473deb425171a2f37ffc4cf0600a8d561b20f777407bbef1b596f92e518c0929e8bd52b015c2718d14443a56056f65015515673deef32ae5399ae71f97873ec1508f8c41d6a66a13017685134e5425c4b580a7f6986c26fb272f0ed215d6698dcec9e7c5258173b295b3611869254a538945de952dedf291837df0d7a205e1b76b01140df4edce3afe7245d46ee3b292bb117b1 -Result = P - -Digest = SHA384 -Key = 3082010a0282010100cb59aae30883db678ea7b2a5e7009799066f060757525166030714a25e808482e752f04f78611b3509d6005b411530c9ada4d8fbddc85f9db3d209eccc6cf0cae9aeb902e96688d2547974b7eb3323eeaa2257cf8d5c7c97f5176e2cfd29e19d0487380e3e64338c73bd592d52e9dbcc9606ed5835758c1a112c6a004256b5c4338322695df2ba573be0e79a7b9f9afd497dd38eed39f05f88d7d399d1e984d048067596ad1847ce51221babf51873bad2d81fa91cf3d9fd307e3ebd41fc49a8b3252ed7a71fd2357330bef2f1f89f2c80f740567e2ae8d168e56f007e8fefa33d2eb92b7d830a4f978ffe842ef0697db50602b19642afc50ac1f837e476c0fd020324f1bf -Msg = a95ece434121269f4bf036395e54718c9b3b247de3534fe147b7b540bfcd2fd81f6e45e54848ff209b81f986b49db65a54a2366d9e7acb9d8798289c88dfbbf395bf3d4653a187d98685a753c8e933c281eddde013b6489555101abc4357532af497ddecccf263d1f242672904008fcb0a65405da9ce6ecf9a65b3295afe9e87 -Sig = c878b4b14526efdfdb99f7287c0e871ef6c0aa7b4d2ee29299a782c8391ecdbbb60b8aeaab5343dffe7ade8af07156c45b16842775cab5201b3403dbd6bf0769ab5533d4c40deddb1eecfd8a46b933627d0d25893f0338e6dabb2a778649ebb2193a9d7c99d069c6c209b4436eda411184d99be0f80e3b293b5ede00f58ec4922fe8e1c6de04e58fd443d1cd96fcc9ca4bfc23343532a3eb840fd5c197e7795f2e3982a928e602b1e8f5cca7ea20da049eda313b1ee8d4b1a8e7960e4cfb5b16082ba73060f73c02716324658d3f00a3ff0a78dcbae103d5048e75669053645156f6640d4f6d1645d02e772dd8e70fe8866cad5ec2878ea6fc5c47530bf9eaf0 -Result = F (4 - Format of the EM is incorrect - hash moved to left ) - -Digest = SHA512 -Key = 3082010b0282010100a677525e1a69546a96dc7b112350d5e4864f0f82e999a714fa9f43ac681517d3975910c2d806bb3ee6dbf5dba1d969b38889e113c2da76eef4412a60cbd89faf35b2bdcb0de36a2cb762cd8f2f29aed9982a9ab60886cc8fbfee9b2ae09c88161e9159d4fc833adc4f80e4bf629d5a9551acce7a3938630c2bf9956097642e3bc60ac6522017841b65c7a25197865e697753b08169853681911443a2b25f1b7c4696f946155b2664b67b40878d3b45c3e0d7034d5b5ee6f5ba8fb3cae7797e85789902cf8f9f86ed3ef25ae0736178aae260fe875bfef5bcde9ec05f11e18fc7375edcd4a5533618e6f991dd48aa3062e6031e291dfcdc6e7fc14ec60e539fcb020400eac839 -Msg = 9c3d5d23d2746d15d616bebf3cf720c6e6012a71cae22002f5021a47d0b8636ca3bd201357e132a680fc5dec9b28a9db932d08ae8b3d3a37d7e2ee754b342a69b94fec26b50412289bcf77e6d4095faa545f15a16783d22eae21e18464150174e6db0b837347d440307655d56f0409db307f9773e81cb19282a93c9ca4c3b135 -Sig = 98657fd8163967fa7d263bd45bb890035adbcdd1645fd48b28febfb9b4e15172540e38b7c2f673c40a205fd40b08b60b4b81ed6e236cdf08f0d6b11f50dc74c60dc466ac372e0f467883aa9a398f4aeef87b040e14a51502dd467e8e8dd89812dfaf6b1dc1c2f6c28448af084590c05aec499dd3b148e66f3d71cf75e239db6d21f4074b8bd9a6bde5ca668634bd47953276ff2d0ebbe01afcfe0e381903736d6a6c672a45fba4ee326e342dc5925169517c5f57e9290724576a225ba89cb4dd091f4e6513be10dd4181855bb4045d6ef6437c16d3b5589ef9d6836682711c7d66025ae37b525580f0dfcf3db7fe57d7c6b15777cc41600307e58a1721b6f7bc -Result = F (2 - Public Key e changed ) - -Digest = SHA512 -Key = 3082010b0282010100a677525e1a69546a96dc7b112350d5e4864f0f82e999a714fa9f43ac681517d3975910c2d806bb3ee6dbf5dba1d969b38889e113c2da76eef4412a60cbd89faf35b2bdcb0de36a2cb762cd8f2f29aed9982a9ab60886cc8fbfee9b2ae09c88161e9159d4fc833adc4f80e4bf629d5a9551acce7a3938630c2bf9956097642e3bc60ac6522017841b65c7a25197865e697753b08169853681911443a2b25f1b7c4696f946155b2664b67b40878d3b45c3e0d7034d5b5ee6f5ba8fb3cae7797e85789902cf8f9f86ed3ef25ae0736178aae260fe875bfef5bcde9ec05f11e18fc7375edcd4a5533618e6f991dd48aa3062e6031e291dfcdc6e7fc14ec60e539fcb0204008d8853 -Msg = 7759420c8d1a39ba0e3e1681d9b757fcf30cb40d844f4a71224ff998520e0bb44c761611ff4723a455540fe6b8ef32e3d5a23f8da0206b57987ad2ff4c9616ab1ede493847350dcf1b2ff9b98e813f74f8b68c0615243091501f7f28416c77e174f8a32b6cca3e62e7379ca16455c6d8e3b2651eec45e148d2a4c9ba3978767d -Sig = 91ce8e921f85de845b9bf7503dc65a328224d15b23e8ea65dc3da6d804fbef196c305e0fba059a7d842c8c0f580860cce77652d4dc779073d6a3b0a92bf2dd3ec6c0618da1485036fd594bd962f7b5a1c61d53f1626912c7e312aa83eb4326288a52437c7387916bcb11084a40c219c84cab2ff66e83143f858647f2dc914da0c7858ba39aa8ad8147ea5c9c52069eb2b2ca941d8a5023748dc401e7664500846c85cadf0287e39b8b8b46794a82bfffa752960ab3b9eaa02530b5903c24aefa108f10aee35b6a8a3cdf8795a182e5c04ed36bb68c18785623b42f0979fff319112e1514cee51db437ee32289f61ded61186c6ed44ad722d18d556821f888221 -Result = F (4 - Format of the EM is incorrect - hash moved to left ) - -Digest = SHA512 -Key = 3082010b0282010100a677525e1a69546a96dc7b112350d5e4864f0f82e999a714fa9f43ac681517d3975910c2d806bb3ee6dbf5dba1d969b38889e113c2da76eef4412a60cbd89faf35b2bdcb0de36a2cb762cd8f2f29aed9982a9ab60886cc8fbfee9b2ae09c88161e9159d4fc833adc4f80e4bf629d5a9551acce7a3938630c2bf9956097642e3bc60ac6522017841b65c7a25197865e697753b08169853681911443a2b25f1b7c4696f946155b2664b67b40878d3b45c3e0d7034d5b5ee6f5ba8fb3cae7797e85789902cf8f9f86ed3ef25ae0736178aae260fe875bfef5bcde9ec05f11e18fc7375edcd4a5533618e6f991dd48aa3062e6031e291dfcdc6e7fc14ec60e539fcb0204008d8853 -Msg = 864f4f5890a03653d08daa83d9e2992fab3393b7ee152d6f7b8ea3ad1ec9c1219a0e0365eef2fbd5d7cbf3a19667d421f3fe46688264191b2583e484d209ebe2975e4603dbd94015e633febaa43c615aa5cc2cbd69fd6ad9db970ae81bcccdbe8026625adebdcfbb04ad12f589c70883c9878fdf2a46e750a4b15f03807a2d5e -Sig = 245fda2e66d2bab102d0da4098d751650f5ef4738d14dabe866c782009ead9d6d05d43ac0a3014a382d62ac971ee19798f3b8ef49f9bc247fa07b368ac2d0e8a4fb210af5acd87b6b512e135861b30103403304732a10b75c9a149552d1ccf0f9912968c6431398b7d48dff48cc7cb7184e76a0ab94ac9a6b0035b91b3eeb2d1326ebddfc13250224538c143fc0dfa3995926415a658db8e6691504050a1a30e34b21af8d12707bc4454f174385cd84c729e2ddfc5cc9178812059b5da4a1a605a2a81642ccc1bc5cf953965f705673b12c5b46ac8c1a03c1001ae4df1c39cc83cb54b10cb7d33cd5108033c268ceeebba6c6ada92882f46562dc658d3525574 -Result = F (1 - Message changed) - -Digest = SHA512 -Key = 3082010b0282010100a677525e1a69546a96dc7b112350d5e4864f0f82e999a714fa9f43ac681517d3975910c2d806bb3ee6dbf5dba1d969b38889e113c2da76eef4412a60cbd89faf35b2bdcb0de36a2cb762cd8f2f29aed9982a9ab60886cc8fbfee9b2ae09c88161e9159d4fc833adc4f80e4bf629d5a9551acce7a3938630c2bf9956097642e3bc60ac6522017841b65c7a25197865e697753b08169853681911443a2b25f1b7c4696f946155b2664b67b40878d3b45c3e0d7034d5b5ee6f5ba8fb3cae7797e85789902cf8f9f86ed3ef25ae0736178aae260fe875bfef5bcde9ec05f11e18fc7375edcd4a5533618e6f991dd48aa3062e6031e291dfcdc6e7fc14ec60e539fcb0204008d8853 -Msg = 71abf895e56ba8f6ae8d0e9e6690c09c759270a73db8c1aa95d05980793537fbfff3472c8d2c34de4abb7e64d216cc952e798314034197d50996a2dcbf4c33485e0b68910baebf0e50ea29bacd3060372bd47b13526ec04bdc81b90dc95a8ac2743b814cc5b9ef8ca9633628bfa4248b55eb7f2d9208e114f4dac69bfe27e472 -Sig = 243c570cd1bd85522e64817361cbb949c83876d7a3609513aebf506fc06750ba38e820232c98acbe00ffa50b36c538560069fd13992ca0df7d9f6d956b883334f1c3af8a74adeed5be15b033d85b207be2fe600a9902d699ccef1f4a8d588672c446401eb390d174d572b918f9b349e2e704775300023850a534cd14e0046e385181d345a01dbd230c7965fffd71d4e9f9bd274d2ef46c556c7332121362e71706c39f08919efa3a4f2f142150c8cef4b30ef788f6fffc2ed2aca0262eba873a251795845da526b78e2b24d66f21d40d5fcbe5542a7553a9178be5a9805bb53579bd108cff733b37640789318db620a6a94444e9203923ae325500b676b14798 -Result = F (3 - Signature changed ) - -Digest = SHA512 -Key = 3082010b0282010100a677525e1a69546a96dc7b112350d5e4864f0f82e999a714fa9f43ac681517d3975910c2d806bb3ee6dbf5dba1d969b38889e113c2da76eef4412a60cbd89faf35b2bdcb0de36a2cb762cd8f2f29aed9982a9ab60886cc8fbfee9b2ae09c88161e9159d4fc833adc4f80e4bf629d5a9551acce7a3938630c2bf9956097642e3bc60ac6522017841b65c7a25197865e697753b08169853681911443a2b25f1b7c4696f946155b2664b67b40878d3b45c3e0d7034d5b5ee6f5ba8fb3cae7797e85789902cf8f9f86ed3ef25ae0736178aae260fe875bfef5bcde9ec05f11e18fc7375edcd4a5533618e6f991dd48aa3062e6031e291dfcdc6e7fc14ec60e539fcb0204008d8853 -Msg = 4b648de2e390677ce1727191498b76d2d2438d0ceddf3db502ade5c5fd815bc70965d42f9b8d04eeb38986445fbe7dd580177c00d0f8a36c24740be3efbf656408e6dd73adbd45b4c7196fb86f40da17b29e91bf91ba518b4c68ea18e13fe7d4cf4d71571f0a71f7a58bf59684f8d5bff04096f2380b8e3b03f14909d9e92c3e -Sig = 277fe81a1540341c9c04fb5d3c8f70c1e72f87fa7d04b93ee54d56d1184c141ec4e125e2e5cfd0acff1055c76697a1c3079c371cce0bd84ee4437bfa1806aa76df2955935331915fff879d87c7372e75e5e8fecc906f9d34a5adc0b75409a87fb6411e2990cd237ac8223f7223444f5d527a115c85b9ba10287f3e825e1dc58eb37c8a9ca055155ff6a5aaa6565690dceef6f647729d071cdd9f0688c7fee8f9293abe658d0e1ef855c86a28d8d0f8f82f72173186353080b84f142f965907377178fc1ea00819d81afc2474becf79e1e3b70c7c2a8407d50795c3131bb6df78720c31b2f8c43f705464d8982043c45f04e339aa1c6f4e26aa7092b3e6261299 -Result = F (5 - Format of the EM is incorrect - 00 on end of pad removed ) - -Digest = SHA512 -Key = 3082010b0282010100a677525e1a69546a96dc7b112350d5e4864f0f82e999a714fa9f43ac681517d3975910c2d806bb3ee6dbf5dba1d969b38889e113c2da76eef4412a60cbd89faf35b2bdcb0de36a2cb762cd8f2f29aed9982a9ab60886cc8fbfee9b2ae09c88161e9159d4fc833adc4f80e4bf629d5a9551acce7a3938630c2bf9956097642e3bc60ac6522017841b65c7a25197865e697753b08169853681911443a2b25f1b7c4696f946155b2664b67b40878d3b45c3e0d7034d5b5ee6f5ba8fb3cae7797e85789902cf8f9f86ed3ef25ae0736178aae260fe875bfef5bcde9ec05f11e18fc7375edcd4a5533618e6f991dd48aa3062e6031e291dfcdc6e7fc14ec60e539fcb0204008d8853 -Msg = 7811a407fe653ad2343d83c0499fc11e2951ef0a4791a3cd9a06396be5f72e783cbbca2cc47002babaf09cdeb70194b532ccbfd24691ae8eb598d59f2e6becedcb4296a1debf417eeddb4d74fb217072091a597ddd0893ff02d6ad61105098db2e90508bd4b8bec5d6e7deab9e651dfdb8210532955e1bc788a908d7150ef8ec -Sig = 3ad1f0faa9a36586154a382a1f2c10e819dc318a68be35f54f95401b0ef2ba5cc895f0d6bde28c8d3b364f60de03ce75a7af29e5807c1eec4cd70624756e2631eb46af010ca8cf93ee7d86a4af3ced5dd2a8a41c1feee6b4572070873939ae7a2ce75193945937461d0064eeba07760c495c5c70bdb04d89951de3f96525f8e44612493d490731e7ef7679a24b0b1e2b24c8003c2f94114e4193d6e54c0af9e870530b008530210ac0b0e4c7c79f379384e1bb319b5f2a0b622517ae5d27f0eaaf7958cb0b41849126075092e86e7e7be5eeacef9a8e3ec595432ef619858fe0d0517871b8b495c01af6f18d4e6d250dbd19280ef4f8a37d1b59a48fa41b831d -Result = P - -Digest = SHA256 -Key = 3082010a02820101009c003978e1f71731e2d1128e1be81bd6c99cd3251672b9c4186497243b17ce523ab113bd4fe397178e6fb5f3090b0680e42cfe78b3928c22da53ef43595b1c5792a2794f86622bc4a997932dc20df9cc429b5010e18d73c71796df877fb66e72d372081260fe7760d46ff916ac74292ee6e1659c2480a22c9522bdfa1beaa71ae2a5581eb0045bbfb7b1d687553cf3cfb061bd2e811e6085d9e4849f30735bb95b34ae40aef5a5eb399331704907b67094b8f418deb76b6ff419031a5b2cbc7b64487b49d418d67747f1609040f08adc42b1b0724869d838bb932511a580ac9d872d5a053f3b61b3f51c43fb2b3d510a696a9068e093eea0670e55e58571904f020333e58f -Msg = c3232d8060a3e3f8687dc05d8879004bf5c3a7030336bacaf4d9ae8c0daa21c5f09bc8a225dba963fa568a038d7fa91b274dad04cb83dd3b0f35900a2b88e46550b9b3133b61c30e09f73d2b4d9661fd600077f7f8e409d2fc5c4f2e97baeb7c8c84d71bc9bd9bc13e66c31def4590bb48e5ee27b1dea6556356d5407ac89dd2 -Sig = 21bfdd610a56fb8b3fba9f3841e7ab9cb2b91d16c7bc3ebacc266271e05eadb6d209a043a29d542b57ad832a3ed03933088abd7b56b86fcc295a95fa66e27f5b9b2c919b82d4165e2bc42b9e46eebdc7cddb29888281250e6954190f8e13b6d9ed6906e8d603520deeeb5cfe4f7e932c88ec1ee2dc9b971a0288bd71a45ce6037d8d7ef2325ecaa573c57ec753916fbb6335e9ab5cb695ec0579b511074a6cac3b21584e5e4532621451641a4a09491c77555972a5d42a627f50ffd490c79e32c855aef0e2859c933321341731e796b2ed4c6c50a98a3f3c6995bb6bd53e52c531b15d042061186677f9158eeaabcf302626c8ee639685c832cf3bc4357cbca7 -Result = F (3 - Signature changed ) - -Digest = SHA256 -Key = 3082010a02820101009c003978e1f71731e2d1128e1be81bd6c99cd3251672b9c4186497243b17ce523ab113bd4fe397178e6fb5f3090b0680e42cfe78b3928c22da53ef43595b1c5792a2794f86622bc4a997932dc20df9cc429b5010e18d73c71796df877fb66e72d372081260fe7760d46ff916ac74292ee6e1659c2480a22c9522bdfa1beaa71ae2a5581eb0045bbfb7b1d687553cf3cfb061bd2e811e6085d9e4849f30735bb95b34ae40aef5a5eb399331704907b67094b8f418deb76b6ff419031a5b2cbc7b64487b49d418d67747f1609040f08adc42b1b0724869d838bb932511a580ac9d872d5a053f3b61b3f51c43fb2b3d510a696a9068e093eea0670e55e58571904f020333e58f -Msg = 0d8235883f37654b35d3566174cf731b5b22a54ac15718f9d8e2415c57b42003d80dc2537e920b37dc9fb21312de8dfa39190f20024c0f9299ffca24d0d22cab795a4b6d132b35d6aa36eb6df856ad06d0257838bd14ce11e6bbb509346d0235b710d7bd462b6b90664109566e5e5ca7e8efe97a39d6dde085be09f2cdac2b07 -Sig = 6530d456e14269bf37a95ab7b2ca4f534a47135052665a2b64e9eff970a9566ff0304029d2844d5649e643212aaa7f1f9103bd5288b1bebb7797cd8df3393373852cfc7001a4257499fbc92444609e0afea095927ebb773b7b666962faf0686a8b173f446fa562e82be1467111ecc38697103cdc1e700890b60104eb35575d25b9565098544a2e26003b3150c9a579c534a44bd0c1569b58d871d6a5af51b5ecf3cb2b0650793ac95a44596f86723c31ce4b3b1365dd61d2bbadf394b16f734608dddf991595acfd0aba42a12095966bc005c67b60776ba104c9681efd38d2e91fd3995588d9ce244c6bdfffb8e0086837946c35627a09a2f83b325af71f474b -Result = F (1 - Message changed) - -Digest = SHA256 -Key = 3082010b02820101009c003978e1f71731e2d1128e1be81bd6c99cd3251672b9c4186497243b17ce523ab113bd4fe397178e6fb5f3090b0680e42cfe78b3928c22da53ef43595b1c5792a2794f86622bc4a997932dc20df9cc429b5010e18d73c71796df877fb66e72d372081260fe7760d46ff916ac74292ee6e1659c2480a22c9522bdfa1beaa71ae2a5581eb0045bbfb7b1d687553cf3cfb061bd2e811e6085d9e4849f30735bb95b34ae40aef5a5eb399331704907b67094b8f418deb76b6ff419031a5b2cbc7b64487b49d418d67747f1609040f08adc42b1b0724869d838bb932511a580ac9d872d5a053f3b61b3f51c43fb2b3d510a696a9068e093eea0670e55e58571904f020400baa86b -Msg = 84b1e3cd7c5d6011c581302e03489fd37aefc841bad659fc81d796c6ddd6a1cd9199f824bada3f70b29b40e435ba306fc2c53333440f233af2048d6474b9fda447c87c6c625a56661a85216543d9fa9b9835120c5ddf6a4242d4da438b5d58c06ee3778fbc042e5cc4e7db9b75cc87c0c2e76cb34b6eb47e39f1844969ea3989 -Sig = 1864eb619e358d7e0340b582288e3290d5f8caf1b6831bfe5978f4ea56d15762247bfcec56e2a44fe11507e5eb6fda0706b7287b09ea770d577cdf660c523a76e2e70952177f0260cdba51efca71148e069ae6540f5c4722a4b4db6336168eea86612b6b4ecf8b5b2e1adf3d4f79c3894c617ae0ba56a930c658f0f55c0e5f2719b4b52b7785c30489ca13c9799ded9144404409f284c41530fe35967c2d844dcb1d2d80c10a985164466ced3a4d74573b175ce7288418b39962d4a34cfbdd43ba5a6b73af0f9ef55946b61bc7d5c0af9ab0e99bc0842edfedfc91e213f021842ccc785cd73a5f85d8aa8371c80151b836651020e71c524f92d3c654fef0b37a -Result = F (2 - Public Key e changed ) - -Digest = SHA256 -Key = 3082010a02820101009c003978e1f71731e2d1128e1be81bd6c99cd3251672b9c4186497243b17ce523ab113bd4fe397178e6fb5f3090b0680e42cfe78b3928c22da53ef43595b1c5792a2794f86622bc4a997932dc20df9cc429b5010e18d73c71796df877fb66e72d372081260fe7760d46ff916ac74292ee6e1659c2480a22c9522bdfa1beaa71ae2a5581eb0045bbfb7b1d687553cf3cfb061bd2e811e6085d9e4849f30735bb95b34ae40aef5a5eb399331704907b67094b8f418deb76b6ff419031a5b2cbc7b64487b49d418d67747f1609040f08adc42b1b0724869d838bb932511a580ac9d872d5a053f3b61b3f51c43fb2b3d510a696a9068e093eea0670e55e58571904f020333e58f -Msg = fcef065e293ecd29ab52046c68c6e940aa0e2d5fce5d4a2b40c516f2a7a198705c301b95218282891098dbeed1c73765105db8532e87ebe53772585115b1585f03df272944853a1e143dd34ddf18d2e1b13ecee7eed464584323cf53dcf6b9aad74351a0f90e9ef1a08b1313f98363bc73f897a4740c5d8c4a1fa37f64386458 -Sig = 00acfc93e41faf5004cbcc252da290b9cf66b56a6a4849c572461d3212cc4cf1021eb96e8651475fac7dc87faf3a5b52923123378c18cb83906d1ee6e53502bf0e89ce66f3cf5a4b7cafa13f2d97f99498c0052fcd640570e5e1dacdc66e24c2a54f02bed338a26748fd17c07bfee5492c4dbe4dfe111932e3153394721b0556a440788a2bcefaa2765ade916653f4aac20d5ea587fde0fdc255dc32c5aa52b05e3ac2db4d7c3a8b02ee1733fd300801d1bb8e8613386f3deef8dd497bfe803523491ab88553db60b03d29c55ff52e71c546873cb1b52bea1853c8f0070d1776545557becb6a11310acfe1be060deb53d16f0dcbc396c1d30e03c4c069c3ad48 -Result = F (4 - Format of the EM is incorrect - hash moved to left ) - -Digest = SHA256 -Key = 3082010a02820101009c003978e1f71731e2d1128e1be81bd6c99cd3251672b9c4186497243b17ce523ab113bd4fe397178e6fb5f3090b0680e42cfe78b3928c22da53ef43595b1c5792a2794f86622bc4a997932dc20df9cc429b5010e18d73c71796df877fb66e72d372081260fe7760d46ff916ac74292ee6e1659c2480a22c9522bdfa1beaa71ae2a5581eb0045bbfb7b1d687553cf3cfb061bd2e811e6085d9e4849f30735bb95b34ae40aef5a5eb399331704907b67094b8f418deb76b6ff419031a5b2cbc7b64487b49d418d67747f1609040f08adc42b1b0724869d838bb932511a580ac9d872d5a053f3b61b3f51c43fb2b3d510a696a9068e093eea0670e55e58571904f020333e58f -Msg = a6a2c5c8718c64105fab8d44fc69d334273aa71e7475d924ce625cfc61944aeab77927eb202f6a33589939da64b375d3bd22f61db010183d053676ebdf3af50ce33c05e09cac237d1e5ea27ceae0acf2120b84a29ed80d702d759019e098ba227314e40eadaa98d4fb215090589880796f1cd7130476c2a6904633ee2b56a014 -Sig = 8ec5b4e7671975686b72eb3930f77ef3622119d0b2ae0618fa52c7410519c4f846c986001d3d82844ae4c13e99dee463448a498a652e9b725ddeb6323b83d5521637be0dee7b224c50dcaf6c7b9a2d26f9b0aad81ac6e4651f241d7a860b51c96ebfc3df978c5373b7846d3139f509dc16726f712c0e61af620b2c6db0955d0ae9cd4760bb9de6151e04bfa19df4d5aca2576f91ee7aba9eb446fee77c604faa5af87536f22fa6e239e898de906642fc6594be9328571b35a3a8420ac697ef993016f78def8a17d13698cc4c1876ee1006d814dc60161214a8f8b6f2a345c8b0c0fc645873b6bf9d2fbace2246f643a6d3a2e0b88929623a2e2a73823f6e325a -Result = P - -Digest = SHA256 -Key = 3082010a02820101009c003978e1f71731e2d1128e1be81bd6c99cd3251672b9c4186497243b17ce523ab113bd4fe397178e6fb5f3090b0680e42cfe78b3928c22da53ef43595b1c5792a2794f86622bc4a997932dc20df9cc429b5010e18d73c71796df877fb66e72d372081260fe7760d46ff916ac74292ee6e1659c2480a22c9522bdfa1beaa71ae2a5581eb0045bbfb7b1d687553cf3cfb061bd2e811e6085d9e4849f30735bb95b34ae40aef5a5eb399331704907b67094b8f418deb76b6ff419031a5b2cbc7b64487b49d418d67747f1609040f08adc42b1b0724869d838bb932511a580ac9d872d5a053f3b61b3f51c43fb2b3d510a696a9068e093eea0670e55e58571904f020333e58f -Msg = 79220b8d86942a13861560882a66fb4c5c926a661b74ad2586790a0636a802d9d1df8320dc5f5fb8d18afdbb72ec4fa45c7903b4df15fe950d5a063e1195be16c311d85c799986c61f3831688a436ed809992e903d2a34932bb6cd5490d7bbd374427209024a878697a66559197342308a7d51c0ddba39670817c7105a77df58 -Sig = 54835466397784e6229228ea1e462b37d77757ba17a6624fbd3279408e89fddab2234f5ee20b56cc7095dcee3cf033e4b04cebb9771997e3b9f50ddea290080888fb406cf1af4b2d14c12be788cbbc6454c52276bf64ac3b3158049cc78986e38413bb09d408f04e8234228a9403eb901d6f2fb21887996fb228c292a2aa99fe8456172145939606eba9cfaae694e5fe824ffc3a5547195e24af5039aa1f1dcac9a9cf54c51099f82cb1a5aacd8c9419d1c7ce880366f1276fae7b9e1848e9ceaa7ef7244e5cb788f524bb50231ef4d81e14d59d3f884dbff575e953a145fc45f7661025e1f6fd95874eba803de03b5fb0a8f5eabdc739fbb91c45ad1c29128f -Result = F (5 - Format of the EM is incorrect - 00 on end of pad removed ) - -Digest = SHA384 -Key = 3082010b028201010095a31458ca41cf7a280fd060660fbecec18b6242b72cf99d8039a890ce07aa5acf432d9b400160374b3626a46c6107cdf51f1e8b519ac26ef169cd75d3c5e43267ff391dd0a93730c39c166fb77c4c5409c19ea252bfc8e990d873368607c8ce032bc0a6968a0a6a5a918d49d35a3fab9a3e69632816026d433d65bf765cda3738e8c12f43e869089296b36ee84704dadc37db62fd18f380ef76334d882809881d6a6dc8a8f49c4595cca6f85e9dd8ad616cd984a27f4938fb9aacfca473f1a4f00b0db47b471f04b4170ea909cced5960d4a3d269de9ad4b2a63e8ab712f1f0f7c3e9ad471e15bcef3614eb4dce291eae0785ccf2399b16b51a84d1df8ab395020400cfdb6f -Msg = d5f5d567512a899c0168240b319e6abcd8b92a8d6e20b9d3ff80a0447ecf92155b8ba15f5743b1c798592c5ef806f7c6a39ea597e116eb0030c354b2966436f93563e52c205826486dcfe7d88c4b2d18d78b4d59690b5fa734cef0aa4e5bf7ca8c060a965270d267a951bd409275f2f99b058a9daf08fd103229daf54ebbbcce -Sig = 672403ce06f1ab0ea42fd043666e4623299fcefead6cd204599102fc8d543d3bc93342fcaa1262d52e6ff344febda6faa57119ee7418cb78a893aeb245f618c072214e9740abfab998a0896a1c9066a823dd62b5ddf9e9fbd7bd6b68437eef595e90e725180b3cb12301a989cb78ea2dd48730521caf4b2754679c4df2d8e2c12b8c8e55f1327fc6624d85555558fad198db6973ab155deb56cbcfcd44d8a61f90400dd3760b19aaba4dc167742bfe1da0d9ce20036c284729e16b8aff5b6ac3121fbae8cd55fc0779fd0ef7b382c85db88b2ae79270b1110875923b2d72d8ed7d37e2bdf5396b158a89fd1ae95c146737db028ad6cbeb0ed43edd421197d23a -Result = F (2 - Public Key e changed ) - -Digest = SHA384 -Key = 3082010a028201010095a31458ca41cf7a280fd060660fbecec18b6242b72cf99d8039a890ce07aa5acf432d9b400160374b3626a46c6107cdf51f1e8b519ac26ef169cd75d3c5e43267ff391dd0a93730c39c166fb77c4c5409c19ea252bfc8e990d873368607c8ce032bc0a6968a0a6a5a918d49d35a3fab9a3e69632816026d433d65bf765cda3738e8c12f43e869089296b36ee84704dadc37db62fd18f380ef76334d882809881d6a6dc8a8f49c4595cca6f85e9dd8ad616cd984a27f4938fb9aacfca473f1a4f00b0db47b471f04b4170ea909cced5960d4a3d269de9ad4b2a63e8ab712f1f0f7c3e9ad471e15bcef3614eb4dce291eae0785ccf2399b16b51a84d1df8ab3950203646e91 -Msg = 6ba3f34bde03e48259723bd599464274df4de2b6f3bfc3b06970b507234a4f0217fbd5e352eb5f783d7138ed204685e4e43a27c71d25e25d4821be9c50f6adbf58d66f98b44bb326386d7f6ab658d177c2dd87c9b8787cd70182f4eb91a83a32b49c870f0b0a26b5d1ced6f56364705400a0c961cd9fda461cfd1e9ced483c84 -Sig = 236f23de25bb3694f5ad9f09224f5ec1e78cd7f371ec50097327026fa53b1689a95eaf54738cb75e5abba87a964d32817fd5071febd84d60c7b11d95e33a7f90f22259bcafb9425cc1a79305a00a1b8ecfc3bfab326b6463ee57d1e435db91f45cf4edad0f9ee50dbe42130cfd1bc424906deab4906571688d1a514d98dd074139d57304c0c2d8a87ef5f8766486da8df827f9e0c81fe3465ea52d1984d738b9fe9368a0d05384e9cb298330671f65fe52062a0d3c4af210ad471bd5ddf9d72787f40ede3b77297c1d3a5b29ccadc574e9001bef89e4ac093986bbdf048d7b63bcc072a3cde800eda63bfa8e068fff4cb9f15b5f98c255fcde6d46f139e4d30b -Result = F (4 - Format of the EM is incorrect - hash moved to left ) - -Digest = SHA384 -Key = 3082010a028201010095a31458ca41cf7a280fd060660fbecec18b6242b72cf99d8039a890ce07aa5acf432d9b400160374b3626a46c6107cdf51f1e8b519ac26ef169cd75d3c5e43267ff391dd0a93730c39c166fb77c4c5409c19ea252bfc8e990d873368607c8ce032bc0a6968a0a6a5a918d49d35a3fab9a3e69632816026d433d65bf765cda3738e8c12f43e869089296b36ee84704dadc37db62fd18f380ef76334d882809881d6a6dc8a8f49c4595cca6f85e9dd8ad616cd984a27f4938fb9aacfca473f1a4f00b0db47b471f04b4170ea909cced5960d4a3d269de9ad4b2a63e8ab712f1f0f7c3e9ad471e15bcef3614eb4dce291eae0785ccf2399b16b51a84d1df8ab3950203646e91 -Msg = f3169de46af85cb510fbb4cf9c0aada9f875301ceafbc818f428a59679e1e6cd203d18a97e96f979efe082e8c43a252ea4c354872caf42e4d99aede1281b5cf8fb9d25f43f6a33a8cc09c6e08ccabb98e09f0e6c3f2d9d5021232f811bcbb4bc4bdfcfadf69d91aa701d88a13ce3f84f75b168b36c9e60c3936c725d9a177780 -Sig = 47b74ab96c333f1b60313998e9bdf5e313534c96c2f7b139f4fdc8295c8e53a1ae275b235a6931c69690ba8f1cd5bf9d3e1a6f8a23c9f026a592ddcfe35dc498ebef292ed49a87b4813ddcf04cfae8aaa6978f629ff58f24960985a452a09439a3aa027668055ac5900d62f5f584f8bdfaaa72489792fc32b6adc9d289dcbf5bb9a278ada1392b42a4e5b9714a1c3af00f937962477fe72b820dd4fce5cd2e25e6a56081d6119df474b7b7586b801680c4ecf9d067f584d79a9cd0f451aa90644096bf9e80bd469727ad7b7ceeb9cba63de2abd423ea96675d8fef64130e357a5d2f67da0fa528fb3ddbe2fd553033e517533c6d1c301c094ce0899bcbbcd4f2 -Result = P - -Digest = SHA384 -Key = 3082010a028201010095a31458ca41cf7a280fd060660fbecec18b6242b72cf99d8039a890ce07aa5acf432d9b400160374b3626a46c6107cdf51f1e8b519ac26ef169cd75d3c5e43267ff391dd0a93730c39c166fb77c4c5409c19ea252bfc8e990d873368607c8ce032bc0a6968a0a6a5a918d49d35a3fab9a3e69632816026d433d65bf765cda3738e8c12f43e869089296b36ee84704dadc37db62fd18f380ef76334d882809881d6a6dc8a8f49c4595cca6f85e9dd8ad616cd984a27f4938fb9aacfca473f1a4f00b0db47b471f04b4170ea909cced5960d4a3d269de9ad4b2a63e8ab712f1f0f7c3e9ad471e15bcef3614eb4dce291eae0785ccf2399b16b51a84d1df8ab3950203646e91 -Msg = 599d4ceb774e4906332eaa216b2fe8e1fa52506f381baa87c34319cc80ac425fdc9ab0af581f779344d71896cad6a5912fdf268056d63a8e867802726c4a3afe64cfa9f5f4febc1e99f36e96c7e56a6a2b58746533940527d05535777bc4dedb76a6ff6554d45ecfbbeb72cb69447f94752703c9d73b517b2b417c85b202761b -Sig = 0745457af52fca56abd808f094951d3eecab89ec10b74dd49d51a9241c3b85972755a1f80bda2cc96cda7cfd549eec820bd2f99920ebef1d10722918adca8d408c3c883d7c257b117842420afbce88159c7ac4f4bf27f039c24c19dd275643d0ead111d5f04912571cd3a7d40e3f83c32b44762eb6d2e2de22ac006643c498ce55f6116463336cfcfd0ccdab250e9931fde68c9796e05b012adfb76359491f26f69ca9d06b43843a4976f2b017643e6cb80b8dba2a01f1b01231ace075ab31d40319b30ad738f62d2b8a1f43ff1bf67f83330fad67f94a39c2c51db23aa775aa43b708ef25c9c62eb565606e4f5002ab15b00dfa829c99e3dd96b454c7448174 -Result = F (1 - Message changed) - -Digest = SHA384 -Key = 3082010a028201010095a31458ca41cf7a280fd060660fbecec18b6242b72cf99d8039a890ce07aa5acf432d9b400160374b3626a46c6107cdf51f1e8b519ac26ef169cd75d3c5e43267ff391dd0a93730c39c166fb77c4c5409c19ea252bfc8e990d873368607c8ce032bc0a6968a0a6a5a918d49d35a3fab9a3e69632816026d433d65bf765cda3738e8c12f43e869089296b36ee84704dadc37db62fd18f380ef76334d882809881d6a6dc8a8f49c4595cca6f85e9dd8ad616cd984a27f4938fb9aacfca473f1a4f00b0db47b471f04b4170ea909cced5960d4a3d269de9ad4b2a63e8ab712f1f0f7c3e9ad471e15bcef3614eb4dce291eae0785ccf2399b16b51a84d1df8ab3950203646e91 -Msg = 73a125e5705e14e15f2446fe326f563785bcde93d2ee46abe4efd9668e9a1e089cd9656b0a0aa08b74a87449ce279068551f3edcc5ad3744cd17bcb5c0aee2b98df92e97f10f61d5eb4595fc7109899b610e3a8ebaaab3800c7c25af2d513aef2e48a7f28d3501c6ac44d19f82dfead791d1fa3318ab606889663dde3d4bceb3 -Sig = 7a7a4e5b349a06dfdbc9ab958d5fb70b650b1eb2f7eb43cfdd7508062efc9ada3ec0739ad95b2066009f760c8c5030e909189f36b0f7756a67a69a38d2db57d0708a4a2e295b165411b2ebce13723bdd9194afb288452d49c585cfaa3148f5f5464145d2d673cb1803b6ade6003a9f25bf27325f8bc4b883ec7cad37eeecde9ea1a62d0b30da841e2446706e72ac2588948b15fd9ce09ecaf105bee8bea71622e2c58ffb9eae9bce35e9caea8ccc7e0c8593128a6656267ed088bc26347b7b249ac45e06f68034b6d39a4e2eba8c6f5c878450654bf36e5e73468413510e7b50d0e63de67cd7ba35d4f2afca5b460cc7277f04faf2fb03fd7c8995c2fc9b7e6c -Result = F (5 - Format of the EM is incorrect - 00 on end of pad removed ) - -Digest = SHA384 -Key = 3082010a028201010095a31458ca41cf7a280fd060660fbecec18b6242b72cf99d8039a890ce07aa5acf432d9b400160374b3626a46c6107cdf51f1e8b519ac26ef169cd75d3c5e43267ff391dd0a93730c39c166fb77c4c5409c19ea252bfc8e990d873368607c8ce032bc0a6968a0a6a5a918d49d35a3fab9a3e69632816026d433d65bf765cda3738e8c12f43e869089296b36ee84704dadc37db62fd18f380ef76334d882809881d6a6dc8a8f49c4595cca6f85e9dd8ad616cd984a27f4938fb9aacfca473f1a4f00b0db47b471f04b4170ea909cced5960d4a3d269de9ad4b2a63e8ab712f1f0f7c3e9ad471e15bcef3614eb4dce291eae0785ccf2399b16b51a84d1df8ab3950203646e91 -Msg = 86843b3170034a9f8ea79a39657a5e7460c50ef75c800dad690c8818cf25a1e85012cdccad1e7a886c4cf648d7478c334898f044a41bdd5526b4fc7d5e3e089c79c43034c2f4bc7b69d0f4ae83a73da7534486b2c865e29d466f760eaa5f961988042b12b66c58a00f9c5d137183bbf8083199eacf4566ab53a4c073bb719487 -Sig = 45dd07f00a1727f2e992cf0fdaff0c233e6a6866128416456fcd2db6030a4f3cd216db9c4cc2bc7440e06081595e9c51f3c81af68166f6b9cfc0ba4491bf1835b1c946d69d0a6b8c39e1eca84a3bf91f7a299cecc1d98e6fa2ec56cd01ffa04d37423933d746295ce669cd8974caed44f45b88cd7eaffbfcbc70353a3b45c53895edb4e6b19a65564ea3ed404506a4b8dced831c2174995b4455797dd2fa3430f575c6ee80b7d74149746b415ffa6613fc8404ae9e5625e1b8e2b74125b341bd1cd8ce2e87c06114f162fe464d299aee6ed0fe70cb4de523c5b0e10f1f8996f3fdfc9379c3267c268cf29823af84fa756b99ee42f4e0ab8b691e5145f43e38e2 -Result = F (3 - Signature changed ) - -Digest = SHA512 -Key = 3082010a0282010100a93cbcd5c69a8e24b6be4f078652e6c8bf6d516b1316e842d5c8e757e387243c4905b37a66a30967ebc6ed6da56f690f60bec090652ee1926526a78317d41cdff392111fba8a6a91109953fe102c8a51e56b3b6f8087dc53e38d57ac31cd7bbc46f6d14bdf488852db296de27200d11dcd067d776af73c10cd044636aa4d9ea5609c75691aa164eb8abe0f187c0286dfa4d1f5f4332e7664c3c572671b757667e221cc2f0a3944926331ef73bcfc58d1ef8595a2bffd240f2397c4bcb69826ec26fadb3a154e58e86fea883d516d21cde6c162ab55fad9c52df547ef0e6b946d368daa97585084e43a32e029908910c6f99b4131c3961d0543fd583608e8a3e30203452b3f -Msg = bdd8719841159aba3f353440ef98efa92cc503da8d00745bd12094c3809bc971cfe3907dc4f5c2ee9c2e172e6a61e8bb0028391e1277f62199777d3d76915d5258c85d9bdf4dc1e0024dc8edae0e7944af3a9f0fd47b13584e47397c5afecddd2032e0d8da451df7383a516703c52bac02a440931a325168b83ad16a7409a27c -Sig = 2e7b28803bbf9d58be8219ace68c020a42a4b42e59c2c2e0faf56ca17f7c6f3a427688f124481308e249e4d579f576dae5743bae68b349f4d04bfc21d60a969b965827a67025bd8220603763cde90a42b4308f2c84bc2c4c8fd5de0efda349e9cad1f47140d01fd27021ddfe16873067213636ad961cc85d79a87231e1019ac4bedf9630e2c31f4b413d98ffeee53fd46ca6d62449e86fe7692b59feb18bd9296291d1bda77bb9c7cbf15bce21aff1c6f1ed9cc95a87378b13eed54d7b54835160f88f7ec710c87eec07c2239b7001bcd4a8428a1a274d1c78d89c2153c46f4ec997df9a19838813cef1381dcaf97bccac39739a3142aad21a966da1be5c471c -Result = F (5 - Format of the EM is incorrect - 00 on end of pad removed ) - -Digest = SHA512 -Key = 3082010a0282010100a93cbcd5c69a8e24b6be4f078652e6c8bf6d516b1316e842d5c8e757e387243c4905b37a66a30967ebc6ed6da56f690f60bec090652ee1926526a78317d41cdff392111fba8a6a91109953fe102c8a51e56b3b6f8087dc53e38d57ac31cd7bbc46f6d14bdf488852db296de27200d11dcd067d776af73c10cd044636aa4d9ea5609c75691aa164eb8abe0f187c0286dfa4d1f5f4332e7664c3c572671b757667e221cc2f0a3944926331ef73bcfc58d1ef8595a2bffd240f2397c4bcb69826ec26fadb3a154e58e86fea883d516d21cde6c162ab55fad9c52df547ef0e6b946d368daa97585084e43a32e029908910c6f99b4131c3961d0543fd583608e8a3e30203452b3f -Msg = 3858011a054c52e3b659066f55f219dd58464bfb22b8c55dcc90ffac24f0e141f60929f28b8e0c2c7069204378ae790504cd1295820b6f77343381e73388ca6fb3ffc2b888ab78a1ea797c8e751dfd02734c2f715e2cef4fa109aa6d9f497b85f6a29314058ade67acefe4f95229edfc2d2d6836bd038d0e9a7a42e7701a3bac -Sig = 311e1025e0a8820a5ddc4f632628bac218baa94fb32c709ff70db3ecb3a1957e31513fdbcf15d83927f5840584af5ed90b350833f50cbeb718b12c56fc260b41ef627776bf1c0a67f39be26cb0045e6c2b60216338a085cd867bc5d9e744a27ff77baea199eeb669a2e0096256d081b2313f3b79ed180712ef56a0b549eb299b96029fd93e4f68bee5a0e6c8ee44ddbb06b8843fd4365cbabb229d2f8f2a9881974adb406e6ffb39eba8f20da38b558d0069f45f91c85debf6872a4ff36d5a79284050faf42b78b1770b176c88b7fabaca9111e511dc73a2bacb30abc3a841bb5b0f0b844e756dbfd3f5db458c47861df00b085a06e07ab4e788a080483ccbe4 -Result = F (4 - Format of the EM is incorrect - hash moved to left ) - -Digest = SHA512 -Key = 3082010a0282010100a93cbcd5c69a8e24b6be4f078652e6c8bf6d516b1316e842d5c8e757e387243c4905b37a66a30967ebc6ed6da56f690f60bec090652ee1926526a78317d41cdff392111fba8a6a91109953fe102c8a51e56b3b6f8087dc53e38d57ac31cd7bbc46f6d14bdf488852db296de27200d11dcd067d776af73c10cd044636aa4d9ea5609c75691aa164eb8abe0f187c0286dfa4d1f5f4332e7664c3c572671b757667e221cc2f0a3944926331ef73bcfc58d1ef8595a2bffd240f2397c4bcb69826ec26fadb3a154e58e86fea883d516d21cde6c162ab55fad9c52df547ef0e6b946d368daa97585084e43a32e029908910c6f99b4131c3961d0543fd583608e8a3e30203452b3f -Msg = 6883a018b48af70d2875a7f5cbb5a303d7338b6d76f988c3cd2f787f394a4bddd880aced4c7fe4e6bb5efcbd1ad422f6aca84fbbc568262bd45e1ef4a0c0e324d227fa3cb442a48638cc06a93cbb867b0cbb781629dafa2e49851ca29eb345505b60d22e753dff97a6a60be2b8d49739005450a829b7cd75338cbab0ba8b370a -Sig = 15be3fb200858d24ddb7586470ffe706eb299da157880a68aae79ff20aa92eca298eec75ac4ada285ecabb10479fa593ee72c585aba707f45599de0dc792c6e3390da5729ae5506100b31c617ee12445093a7593bbcd0e5a155fb9a41cf332c9d65b0d8f077fb417f027eaf728c5c326bddd7be7bf3e69a165c57759337105b94623ee203641ed2bf58f1907e3413b00e08d54a10bb645175449f02da9366b11952364c0328fff018723c30625836a0cdc7a13c220428d03efd625fce63f022b59508fc68ed4d16294111fc391052705ec115da4ead8caf5c50af586ba4dbe1b29d04452f947b5fe9e16a798f5d00094dfe2ba910e6449bd52d3f938c045ca9b -Result = F (1 - Message changed) - -Digest = SHA512 -Key = 3082010a0282010100a93cbcd5c69a8e24b6be4f078652e6c8bf6d516b1316e842d5c8e757e387243c4905b37a66a30967ebc6ed6da56f690f60bec090652ee1926526a78317d41cdff392111fba8a6a91109953fe102c8a51e56b3b6f8087dc53e38d57ac31cd7bbc46f6d14bdf488852db296de27200d11dcd067d776af73c10cd044636aa4d9ea5609c75691aa164eb8abe0f187c0286dfa4d1f5f4332e7664c3c572671b757667e221cc2f0a3944926331ef73bcfc58d1ef8595a2bffd240f2397c4bcb69826ec26fadb3a154e58e86fea883d516d21cde6c162ab55fad9c52df547ef0e6b946d368daa97585084e43a32e029908910c6f99b4131c3961d0543fd583608e8a3e3020334ddb5 -Msg = 20075fe0b26832c234a861a77078a8e9a42be3862ac4d0d058541566a68385620e6c9fd4b9ae5770d7bf1a83cf840c2c981f94c866091aae8a600f1d93822e72bada029e7dfaa9d889ead78fddc01ea32d716cd484e7d57b2e549278d5c54a6beafa91274775af6312d1a2b3e45566b72ac97392cc88889e0dd7a75fb37560b5 -Sig = 9166e91b18c8518760131ea0eeecc443023b61148a1d42030ed09d509d4c02cd0068142fdbc6e56073a68f5a942c0c93a7f90882f160522ea005f4afd34453c8c1b1d3a4e5204d0f9b797bc00b84d0dd96e311394f089567e45ecd0c795be010e7fb24e46a2842e8c7dae9d2c760fa09e20a29a623e6c53e3c436d809032b99ac4a81e63ba95a356f86a62dd6abbb0aac1d0759e44ccbfe225f5d206aba8dc7261daa9451ee1ba04de1172ad80c08f0709d2012ad8ffc8c5152508bc1e18ab53cde79ca50da9eee9b3b5229d38015f7e18f03612ad6270727be16fec06a5d9230ece777ff6936a3ae8f3a631e3e13f930256c3903d963ece49c5a10b5a6da47a -Result = F (2 - Public Key e changed ) - -Digest = SHA512 -Key = 3082010a0282010100a93cbcd5c69a8e24b6be4f078652e6c8bf6d516b1316e842d5c8e757e387243c4905b37a66a30967ebc6ed6da56f690f60bec090652ee1926526a78317d41cdff392111fba8a6a91109953fe102c8a51e56b3b6f8087dc53e38d57ac31cd7bbc46f6d14bdf488852db296de27200d11dcd067d776af73c10cd044636aa4d9ea5609c75691aa164eb8abe0f187c0286dfa4d1f5f4332e7664c3c572671b757667e221cc2f0a3944926331ef73bcfc58d1ef8595a2bffd240f2397c4bcb69826ec26fadb3a154e58e86fea883d516d21cde6c162ab55fad9c52df547ef0e6b946d368daa97585084e43a32e029908910c6f99b4131c3961d0543fd583608e8a3e30203452b3f -Msg = 46c4bea2eae66ba40f3a6223a28a9756d7c980ea6e4976e2342e5fa1cc238a45af4bda37727a270048a6e15fc798f698efe7f60e682776140b5eb201a4b77682f67b3e35003c9c737f54da6db48ee07a672259af2ce712b1e5c4a2c788675033233a31c31d9391a3be2c9475f1d21da34961eff443ef135ecb48791c019be200 -Sig = 85f33d22d92f3e4f31c5fc0f17df916ec770903445f73536bef61966918efd0b380b9933d2864dfa10f5613d8a232412e5b3db44717eb576fc180891800c5d11597d2d09e477d0392740d700408f3482da6f8d9bac4da6faa220ca3cfd2287f5ed8654bb8dc8ac45e09e52e93bc78d8cb4e08d76e15cfa78c51852c93d31d64417c29aa7e22411746c280e3e275f71c4742faa0cece8e540d1b8bc393db120fc14244a2577650b514c73dd1e5391da76aaad375f56a3cb4e0ca942bbbb542213b5a38445cde0dd9eed4f7515c6c58251dc94c25f7dd929d714b2060da252584af84b82013f924fa91700d92523d69c96e0b0f68203a977affa92574cb241c0c4 -Result = F (3 - Signature changed ) - -Digest = SHA512 -Key = 3082010a0282010100a93cbcd5c69a8e24b6be4f078652e6c8bf6d516b1316e842d5c8e757e387243c4905b37a66a30967ebc6ed6da56f690f60bec090652ee1926526a78317d41cdff392111fba8a6a91109953fe102c8a51e56b3b6f8087dc53e38d57ac31cd7bbc46f6d14bdf488852db296de27200d11dcd067d776af73c10cd044636aa4d9ea5609c75691aa164eb8abe0f187c0286dfa4d1f5f4332e7664c3c572671b757667e221cc2f0a3944926331ef73bcfc58d1ef8595a2bffd240f2397c4bcb69826ec26fadb3a154e58e86fea883d516d21cde6c162ab55fad9c52df547ef0e6b946d368daa97585084e43a32e029908910c6f99b4131c3961d0543fd583608e8a3e30203452b3f -Msg = 25e9e6c39ee6f5c455d81f868713362929cd68ae87300aac2bae94440095ec56b7e3e7f56a5b0d197fd89c94d0e2d048087f6296504b4e1a2ccbda959fffd42a96361bce842661fa493c2ea25831286b19de93198c5114463020ba5a23fd3eb78a8b8a34337179cd79acde996829c7fc2293031d816ae19afe553b7bd2b9b365 -Sig = 2e0b30ae35777c9f951b22740fccb88fdfa94e7d139c9eb105be1a1ce542f6efdf4eb3d1ab0b2342f8e354a0878e31f0bdec1eb67ed19491a086065af7e5188ed0b95e0dc88812f66d6c726fd672e03652432f85a9fe4766a7c315c0c695fc37c45ff5441d3177c4181f01c243ad3c9614e4c6f4f8b879ca8167a7790aca6b34c74936cba58e64cc4e32ffc8ad6c09c48ac59f1eb18dd11871ffccae98c465abd5885bddf59dcec5ddb31ce4ecd86bf6af207373a912b2717e726ce9ff555f3502e8cb83e287cf0f7c938cd4b26f075fd50e4127555ade94c974a4cf604ea5c5d9e94ce91fcb9a2bfc8743c06e69ca41ef029881c3d64078cc6311c694dee627 -Result = P - -Digest = SHA256 -Key = 3082010b0282010100a6754738bdf94dbc846ceb937a3896e747d5c6222453a83f6c86310e5819129613f9857d5e4a06bc5d927bdb011d23d8219549ced82c20592bdc419deb67fe43da87fcdfd01ac1acb07e513170c45d1e058fb56d8cb090a7f2565381785c4478362b253d47e056053516be15f448878d01c9dac06be45957882ccffc5ddaf06bc131c866349668de950e9121b134e5ae1c29815473a20028b9b7ea64d9dd8253a518b766dea714f7b37185a1d707a21cfa526a7d76f55119af728626b77e5b66328c2b37ec78be56380a4cd3900fe6a757f21b5728d31e5f1344aca933042b99240f89dc09e76a03678b402780bf64813c339e79893a3355674ff4807b200775020400a54611 -Msg = dc4c136c805849fe77b4b381e4c6b22a3ff69947a9b5aa6b7cbe42cb279c50e8396d0b6ebbe5e55cc396ba66466e4e982e81f63bac0895fcd0aaca4b57fb6802c4432747b28099b368ae5fb4ae459c2fdf04aa6a40ed0c2a9091a418e08d2669a555cdbe0c304d498d840832c35484397b071d9c0b6bf73be5f937fa6b5b7367 -Sig = 723f89429e5f8443defd528d57798d67548279cd169d185a0052e09472e1b37c313250136b2a5f8910e31229363515ad674ca9489d6c7ca7974277ba323110c152f664a79cfdb3453d4cfa6edd124f81384daae9b06f24f3599884e13db024393b5e211ca352149521eb37d29902de0c4392b44bcdf79d2f3792cc0a7edc3995aff9629719507a2bb35eaf2be9a88b74551a068e6e556d78f1662f0a78cc29be00acf9af7ba491940b8a731a3af7003654f15205c6171d009a015b68d423166e971cfce113bf2c7edae6af28a500d43e2f3bcb3b8dbe940eb0f8bb1a077bbfeac4cd20dbfe058605c31b3d1be79aaf1d051e27daab45597ac2838763e49caebe -Result = P - -Digest = SHA256 -Key = 3082010b0282010100a6754738bdf94dbc846ceb937a3896e747d5c6222453a83f6c86310e5819129613f9857d5e4a06bc5d927bdb011d23d8219549ced82c20592bdc419deb67fe43da87fcdfd01ac1acb07e513170c45d1e058fb56d8cb090a7f2565381785c4478362b253d47e056053516be15f448878d01c9dac06be45957882ccffc5ddaf06bc131c866349668de950e9121b134e5ae1c29815473a20028b9b7ea64d9dd8253a518b766dea714f7b37185a1d707a21cfa526a7d76f55119af728626b77e5b66328c2b37ec78be56380a4cd3900fe6a757f21b5728d31e5f1344aca933042b99240f89dc09e76a03678b402780bf64813c339e79893a3355674ff4807b200775020400a54611 -Msg = ba85e1f4f9203ba8d3eef645d7923e10c614080149cc5ec6e282f70b23d30bf91ed665fc1c00baca924539a1508063cffc151d78bfd504943e220037cc531c15dd5a9545bea330458440d13f43444a8a806c7174e805753f42097269a28c4231df56975648d246229327e6a716a49a493a612b7c2c235acfd581742a0d452653 -Sig = 90bb73e761dafdac0b38e4ada5deb5f713ffcbe119ee7af2152ffb3664ed8b7dc11815fdd39f398050ef8d901f836945a89dd0c71ace4b60979ca7e426f676ef3653d7f5045afbf7f38af3eefea2bb2a34ebad8ba029874995d24e98926faffcc79f110ba8f9de35b48829197634f0d842a8ef0dedda72807df0676e08c6b8f76124ae2994151c0379c21dcf3ee33297d8b13eaa74511ec7edf8058dea5d5ee4a6d6701d0700aed62ebe6d69dea7d0b79d01fb5fedb4e291542592e977fd13ad1d49d3c9cea4abaaf003764ad0d3cfd75cae41fdd740e6c17b36831a8f88fd8f9432f45d2bd529291c58215c221d546d71e78a4a4787630af5692a43e1c83af7 -Result = F (1 - Message changed) - -Digest = SHA256 -Key = 3082010b0282010100a6754738bdf94dbc846ceb937a3896e747d5c6222453a83f6c86310e5819129613f9857d5e4a06bc5d927bdb011d23d8219549ced82c20592bdc419deb67fe43da87fcdfd01ac1acb07e513170c45d1e058fb56d8cb090a7f2565381785c4478362b253d47e056053516be15f448878d01c9dac06be45957882ccffc5ddaf06bc131c866349668de950e9121b134e5ae1c29815473a20028b9b7ea64d9dd8253a518b766dea714f7b37185a1d707a21cfa526a7d76f55119af728626b77e5b66328c2b37ec78be56380a4cd3900fe6a757f21b5728d31e5f1344aca933042b99240f89dc09e76a03678b402780bf64813c339e79893a3355674ff4807b200775020400a54611 -Msg = 284748185ce9e8eb0f872623d43950277e53f59b362f9b40ca2db01548f7c3c3cc0af4379672a9915fd4833dedb2915fe6ebc375e281a138c39f3cc249db65f6e1b81e1dbe6f4ecd2befb90f20222ec013720238108cbe2a0c6315cb77781937105aae10fd683e681bdeaee193109112aef09c2dead65adf4d812178f959454c -Sig = 49193eb45d4d355537d9bdf3bd2bf0fad9d7e33241172d231dea6ca7c9d7bd2bc3ed85285bf01bf379da0db4fc04cb7e53cbbb38695fd689bb73f818bd4e3fbc042013f8e002beb92847dd0d5fee9867cfa3fcf76f3f648cc36f4a67e295aff914f796cc0cabfd4396fc6cf171f468361ad6ecef2023b0a23884880a17ada5372c7cda32cc1e3b986451219d7a171e6c6d5608c3dbe55403b4b42f6eb3f87948d0d72f51de963ed80033b42b5e7ba76c6fc5f74b9a5249b60bb507dc86ad53f5b9b710652a2486a3cded83e447a4c114c4dccabddc51787c19687548c4ff157d887c7886b19ff85543c7f8340a6fee320ba49e02c463c8bbe10d45805c67cb6b -Result = F (3 - Signature changed ) - -Digest = SHA256 -Key = 3082010a0282010100a6754738bdf94dbc846ceb937a3896e747d5c6222453a83f6c86310e5819129613f9857d5e4a06bc5d927bdb011d23d8219549ced82c20592bdc419deb67fe43da87fcdfd01ac1acb07e513170c45d1e058fb56d8cb090a7f2565381785c4478362b253d47e056053516be15f448878d01c9dac06be45957882ccffc5ddaf06bc131c866349668de950e9121b134e5ae1c29815473a20028b9b7ea64d9dd8253a518b766dea714f7b37185a1d707a21cfa526a7d76f55119af728626b77e5b66328c2b37ec78be56380a4cd3900fe6a757f21b5728d31e5f1344aca933042b99240f89dc09e76a03678b402780bf64813c339e79893a3355674ff4807b20077502035bb217 -Msg = a3c2ec4c47f444bec34c15ff25f2f811fa94f9a5bf05a5de982a6458451609695174a8a68c25a7a9bc2b181290c646ccd5dc8e92ec9e71b17c69e70f64eaf56cf48681e85cf966c5643dc46f5ead99b9596a966a98fe2bf8433fe5935b76f965f3c121199eb6a69a2449be1d79f01961ef05b735aa6bfc3c547406ed13023edd -Sig = 039c1de64720207c408ea9889471fda297c7b3828e46831ca5ee60a938ba13a7ac524cc394d5ea12d89c2cecfb06ddcc6d86994ebfaf84eb91f39ec470898d89cbc55a12dc47e7be7e0f389dd12c5e59a32d5ca6a37a3e6456fbb8c8c8101725cc3d529f5d1be12de765750e5ee632e43031656442ab0e49f9471cae87dec5751130a2622ecaeba85ef337fa31c472d6a9696231123db350f5a390c8d7ce1f1a839a4c674aee4e7af60ef62e689117fe645e4c322f20373b9fd75dc8606e70d659094f2d2c98108c6c32576adda57ac0b30c47dff442b0901448c68aa1afee4879eddd84d9f2f954971249d87811219e433f3d0d5adff57133d0e9c12f82deec -Result = F (2 - Public Key e changed ) - -Digest = SHA256 -Key = 3082010b0282010100a6754738bdf94dbc846ceb937a3896e747d5c6222453a83f6c86310e5819129613f9857d5e4a06bc5d927bdb011d23d8219549ced82c20592bdc419deb67fe43da87fcdfd01ac1acb07e513170c45d1e058fb56d8cb090a7f2565381785c4478362b253d47e056053516be15f448878d01c9dac06be45957882ccffc5ddaf06bc131c866349668de950e9121b134e5ae1c29815473a20028b9b7ea64d9dd8253a518b766dea714f7b37185a1d707a21cfa526a7d76f55119af728626b77e5b66328c2b37ec78be56380a4cd3900fe6a757f21b5728d31e5f1344aca933042b99240f89dc09e76a03678b402780bf64813c339e79893a3355674ff4807b200775020400a54611 -Msg = a14e35290344465d6d2f43688a663ee418f80f13e1dbee22ed4641aff65bb28a1c0985b8da3128be39070c1c43bcb417bb5a0cbb0beffb217eed3beeafd1691c420358fdd1fdab7c29b0a3a7b723356a3d5e609dc986bd42e8495807177dbe137a0357fed1f2f621a7f1af11cce5e96606cdb3c104e95c0d93223d0415a6daf5 -Sig = 93775fe8676f4e6ed580f3db99e0697e15f8e0ad168a9321cfd004e6d0bd555bda6483f51b1df63ad78f28a3638e70d230c5e654eb4c86c2c1889a06e28e2a640210523b90fe14019d03d0a3b14c7608614fd88a84ba2c68f7c0e01f9502269382367a07f2d90ee53e15abcd584c56de4602f7573f493e41670026fefaa6e12c615d19d1b2ba25cd0f48b6ab20a8bf809dd15ad9172bc8823302993b51f0ae5f89e5c05ee0dfd91f8926abe7fc64c7694613a996be5728ba3c6a4d2387331c5d3b21377f9734b587fba180577aa6cbba1f4a2483e4e46a5d7c355b4088063d32a10c99bc654677eb08a9b57ad40d88d378a8111678e8dc60be3c789a0639c056 -Result = F (5 - Format of the EM is incorrect - 00 on end of pad removed ) - -Digest = SHA256 -Key = 3082010b0282010100a6754738bdf94dbc846ceb937a3896e747d5c6222453a83f6c86310e5819129613f9857d5e4a06bc5d927bdb011d23d8219549ced82c20592bdc419deb67fe43da87fcdfd01ac1acb07e513170c45d1e058fb56d8cb090a7f2565381785c4478362b253d47e056053516be15f448878d01c9dac06be45957882ccffc5ddaf06bc131c866349668de950e9121b134e5ae1c29815473a20028b9b7ea64d9dd8253a518b766dea714f7b37185a1d707a21cfa526a7d76f55119af728626b77e5b66328c2b37ec78be56380a4cd3900fe6a757f21b5728d31e5f1344aca933042b99240f89dc09e76a03678b402780bf64813c339e79893a3355674ff4807b200775020400a54611 -Msg = 555400784d0566105b91dca7f4f0849d832d51f0a3c7d3b9925651fae271199672d014a19dae9ddab1719376a38dad2001a60e3d27f51a74b6ec876e421db7da4b5845b56f13dec8dd0f52720d39eaa7afcffd39e1c3be56a4645853913b3da7c833ba3b2afed0e1c8b33f219abce33c75ef436b37fb68684506eb2f37945206 -Sig = 6dbc3049603abc4677bfce12929bcca60bff5350809ce3f98259ddb72967faa076bf02206c9bfcecdae3421c66f2eaf846b4effbb5e6d774e000c1f1f7c1cf409b98f5e0ca13cb2dbc5b1692c6bf7e54a743e4b24c53451387f277aa66e16da87246d3ab7ba1fc5ab1a9029546098d12d1a45293860e2c8f4838148c89921467285b0f6c916f3b0bcab98dd01120055ad1acf9ce18a2f276eb15aa6f9a0fe05652aec728f831063fe6c7985ce3be11377703f76b4904d292598abac7be35bd1409dd7096fdc851abd2b20a1883f4f915309ecf507ce76dc9a75b36394c6f1fa6685857538ff3b847affb483a670969ff59c8de0391ce73bf1e85601d6bce92c1 -Result = F (4 - Format of the EM is incorrect - hash moved to left ) - -Digest = SHA384 -Key = 3082010b0282010100c5c92cfbb60bff3e7f9499847e869a4bc37250994789c2958ac2f6a168bce2a1915d38725d8596cbcddbd463c2a46a52561a551f8f49d527eecfbef5589030891d9d90090fb35e43e8620c7fed4a056cd1c4a56e6134433030fe8027d1819c09638e43e359c7c389ccd1986457ff5e21673808cb436608d550d62120d9bdabac419cd6249fec945f10711874f10267c66320c701da90d7354b23e1646b89b22cea44d9e67c706ffc04a57927a5c9157cb049b1090e0f86d6cdaff29570cc629fef0646f9e5f8a7dc67c24052a34b91ab08b2e83b141cd0c098e35cbbb9fd408e7e107932128f6eb58e604764a7fe00acecb9b03203a24c9a760ca0d8a5886023020400a26a2b -Msg = fbf1f99265060ab82e3cf1a3cb86ea71748f05c4d69e79c209bd3b61c11acfe1c8ad5f9aac1b0af7b5db7ec31997c9a373d56ce472d6b177cebe3f3a81f6ec7a33cfd2b5f668a5a433d14478e4708d6504a4765d44a9591e00bc906e717f42a5249e7c6dabb384c692676a4d95dadfbd0f464ab6b6df19bd86fd5585fb7c7a6c -Sig = 89e152374ee953c4d9e69e29c3100f0168eb71d0f5ad31f6eeb52ab6caa465ac028b81478947fe08765d77dc9d4e75bbe2cfd14f25124e42f7bcff6512193cfe3ef9dffbf07020cc5e4ab0b0c44fcc4b2bc8285f16fe08be89b432fde26b0498c9ad46be8bca8e1354c39b571a8e30f07aec84a1fc9d1a8e239d79223a6af22b4abfe36ac108291503a4f557a7bae28b25ceed47fd5b81182cf391ea409de7ba1eb2b404d4468eb2b47c2930845e2e9199fff4f0c838e3bd5f3a0bc798fd6fa4be5e962070cb45d01a84170638fe2234e8df928777213a87be0adee56b8ae514cc05c5d52f872416b1ea2112e76c364ce82ca33027e0fd1f8c0424276659c08c -Result = F (2 - Public Key e changed ) - -Digest = SHA384 -Key = 3082010b0282010100c5c92cfbb60bff3e7f9499847e869a4bc37250994789c2958ac2f6a168bce2a1915d38725d8596cbcddbd463c2a46a52561a551f8f49d527eecfbef5589030891d9d90090fb35e43e8620c7fed4a056cd1c4a56e6134433030fe8027d1819c09638e43e359c7c389ccd1986457ff5e21673808cb436608d550d62120d9bdabac419cd6249fec945f10711874f10267c66320c701da90d7354b23e1646b89b22cea44d9e67c706ffc04a57927a5c9157cb049b1090e0f86d6cdaff29570cc629fef0646f9e5f8a7dc67c24052a34b91ab08b2e83b141cd0c098e35cbbb9fd408e7e107932128f6eb58e604764a7fe00acecb9b03203a24c9a760ca0d8a5886023020400b2b5c1 -Msg = f2280564177a0b97e8089b77d7d0cc8ed54849a90d44a7dcd319f5c6d70394169fc4494e348e90c81b2333f6863b1cedcc26672517b2bc7a5c4fdc77917179d41a364b3d844960567506b4fbe3df01cc85fed8e9872bf1fa82f1c073abfc48164bc634b96f732449e0f9450f55832432e818c47dc777ee632c46c8408f6ca9e2 -Sig = 7f65da249423b1406aebe4ca1253075588b101d47207acc5dfb7198dd45548ee71ffbc1bce87e7befd256ae20250208c451bb3a4dabe87c0dd67601ce21a49b1fe723b224d02c7304876e5b2f6804f76d1d57fea8edb951b536c372929863cca988380373af61402e746f71103a9d012d0db121c4e2f636e44b6457d16d12e8b493bdec5d05fd311b502e56ae99071d9bc62dcae68b27f8db50d030963e2dab44e4215be69694a55bb113a8c43d3c2412af0ba055ca740ca628a6254add0e0cc51593cd9a283cc70303caaf8e543ac71bae196f208cd4c9373e2810c94029da46b78b421d6aa8bb00bd83c474534bbaf9629f53bd2df3346200631f7cb9ed4a6 -Result = F (5 - Format of the EM is incorrect - 00 on end of pad removed ) - -Digest = SHA384 -Key = 3082010b0282010100c5c92cfbb60bff3e7f9499847e869a4bc37250994789c2958ac2f6a168bce2a1915d38725d8596cbcddbd463c2a46a52561a551f8f49d527eecfbef5589030891d9d90090fb35e43e8620c7fed4a056cd1c4a56e6134433030fe8027d1819c09638e43e359c7c389ccd1986457ff5e21673808cb436608d550d62120d9bdabac419cd6249fec945f10711874f10267c66320c701da90d7354b23e1646b89b22cea44d9e67c706ffc04a57927a5c9157cb049b1090e0f86d6cdaff29570cc629fef0646f9e5f8a7dc67c24052a34b91ab08b2e83b141cd0c098e35cbbb9fd408e7e107932128f6eb58e604764a7fe00acecb9b03203a24c9a760ca0d8a5886023020400b2b5c1 -Msg = 55c50839aa7d0321a6a85cc3f55ba7f6643bc6a18a8faf73ae9a70d4e527701b7b65f70194f5f0551342eef2bb116eef94595c159154d8966fd639fbe0de525fe96af5db8990b6419bcbf10dfd930f98f230048fc5cf1ca4b0d6f883fb75d308687d0bafcf76dc4c06ec6efc0309125b4569c8f7702906053741b4537e147b7e -Sig = 0b853828fa2089ce0d1955d52b20424748a4b227b56c557ad63782471cd0462295cadd808c5250ed2f11e7d2754c8734fa9d13c8b96496eefa515f3f127869bf42fc8c6bd0ea0247863b9c56747d15b16da322064f7cb723e2eacb4457c241b3f84a63b7bc307dbdd63b4d755b9b4a6c0b7590e5c1c7c5dbf9ba61eabfc29a21944ca6166e56e01a42a94b5d8b898c0fd073b03ea998f35e26289454012e62bb58222fe9a03c9b0a562b9b16602c7794ba835245a1401b8e3ae28e00541cb7a9aa8335de46d063739e8c71999b65f7c8fec3701a46bf3c60139b5b780bdd08c679117e14136c84c93fe403efbf346213ef4c85bcf3e2dfd44a6b616009ff47b4 -Result = F (3 - Signature changed ) - -Digest = SHA384 -Key = 3082010b0282010100c5c92cfbb60bff3e7f9499847e869a4bc37250994789c2958ac2f6a168bce2a1915d38725d8596cbcddbd463c2a46a52561a551f8f49d527eecfbef5589030891d9d90090fb35e43e8620c7fed4a056cd1c4a56e6134433030fe8027d1819c09638e43e359c7c389ccd1986457ff5e21673808cb436608d550d62120d9bdabac419cd6249fec945f10711874f10267c66320c701da90d7354b23e1646b89b22cea44d9e67c706ffc04a57927a5c9157cb049b1090e0f86d6cdaff29570cc629fef0646f9e5f8a7dc67c24052a34b91ab08b2e83b141cd0c098e35cbbb9fd408e7e107932128f6eb58e604764a7fe00acecb9b03203a24c9a760ca0d8a5886023020400b2b5c1 -Msg = e4ceaf62ba10e317e1001d8a6a008843880790159597ffaf56ef666d8081bf747ba650fd6591d3f15a81d3b7f33b59490cb8c88ecb1b06e4dee6dcfb036ca0eace8a117ca79282cb12883b1133911cba91a883be1a93702d6715e70c4266965f65e0b88785fb39ce8f7b1b4132e818be9d3f894d8ae786b37be64f454355eafb -Sig = c269b61d34cb9814934aa8d2eac38f5d941d7b69e1e0cdebea5f275f9fc4a94007cfde1b33a0f9cec3d2b60c6b6675d8a91e7a3251d78c31943524ba75824cff10dee098205f0c84d0f941bf1098785597a88c10058f2c857f85e53a205de7cedc10ad3f1d2abe3cf7c61382c14eeb6d7b409f690f9690fe9b72eb84619fc1f95a8fab7bf9a35248d7e1c89559798c0958a75b85fcaf143b41c3a23864a548026d57209ef64c2d6d61bf9ac15257a531b10fcc06fa97fd6e3fe1a882bce6fd2b8eb5a6267835dd8eb0b5e3e21350f6650de66d27c719980e98ed96006115caf94c061fd3669dc64653843853269b1b6df0515cf67f3161024ab3cd99a4ff5f16 -Result = P - -Digest = SHA384 -Key = 3082010b0282010100c5c92cfbb60bff3e7f9499847e869a4bc37250994789c2958ac2f6a168bce2a1915d38725d8596cbcddbd463c2a46a52561a551f8f49d527eecfbef5589030891d9d90090fb35e43e8620c7fed4a056cd1c4a56e6134433030fe8027d1819c09638e43e359c7c389ccd1986457ff5e21673808cb436608d550d62120d9bdabac419cd6249fec945f10711874f10267c66320c701da90d7354b23e1646b89b22cea44d9e67c706ffc04a57927a5c9157cb049b1090e0f86d6cdaff29570cc629fef0646f9e5f8a7dc67c24052a34b91ab08b2e83b141cd0c098e35cbbb9fd408e7e107932128f6eb58e604764a7fe00acecb9b03203a24c9a760ca0d8a5886023020400b2b5c1 -Msg = 71ff5c8bd950fa414c774075da8ef7a1a58165bf4fb7670cb1f5c00cd07fb1ce0c80ca719babffe73623fef91298c08b12b35e223bb527a3685bef5e3f04a94a63153992eb9d83511435c89a322b32bceddfadc4a96cf943468bfd510ab55fd1db8851f7b26cae084c764561238d75bb9ccbfaad82250672b34f93ed19daf8ea -Sig = 77b82998fac61f387b1a3264bd695ea3fff605bdcaf4c2d3a57f87f3f425134b16711c7812ef1a6c7a5d191fed835b90769883da3e7dbc81e141e3a477cee00b1283e80dca67998835ef33480caeb10f5eb02374cc38129156197e81ffdf36a09e4c22ba30adf9760c441b9691925a2233138f93bb0283be4affec35094f9866e1de3ba4a7c3ebacf88abdd8a1034e968d104235a805c372daeb7b7844ff292bf1e02f3fe8912a28d92e0724f285410161f4fc8c9ff8e0ae91feafb890de775f874de9c8fd990fe77c21525d55f882c432060da56561811cb7fa2a7ba4ad907faa5453d1c2a8834eeeb7400f17445d59a3344fa64db8ee9e97020c5158def04a -Result = F (1 - Message changed) - -Digest = SHA384 -Key = 3082010b0282010100c5c92cfbb60bff3e7f9499847e869a4bc37250994789c2958ac2f6a168bce2a1915d38725d8596cbcddbd463c2a46a52561a551f8f49d527eecfbef5589030891d9d90090fb35e43e8620c7fed4a056cd1c4a56e6134433030fe8027d1819c09638e43e359c7c389ccd1986457ff5e21673808cb436608d550d62120d9bdabac419cd6249fec945f10711874f10267c66320c701da90d7354b23e1646b89b22cea44d9e67c706ffc04a57927a5c9157cb049b1090e0f86d6cdaff29570cc629fef0646f9e5f8a7dc67c24052a34b91ab08b2e83b141cd0c098e35cbbb9fd408e7e107932128f6eb58e604764a7fe00acecb9b03203a24c9a760ca0d8a5886023020400b2b5c1 -Msg = cb254c69cb296eae328fafd8354396594c74e8f9ee4783289bcc8a922031c2f517353c2fade0359ca8713a9ea899907dace6d272d982dcfe771de8803d28f707ce44736583fa12856bacfdfe90cb32e77c4b26eefc54afa4243b221b93b0b8b3f9393731d6dfce118426401e7743453fc48a2d94e026c6c1aa0c808aac32cfa1 -Sig = bab31e3b71988cd3f2a772cd0e33b9db6d7aea6b6b99f631a0259ddfe9489bc662d9c6c9e03916592f212bd4e9619148dcea0b58b475c72dff8815aa3f274ad19d19126d67dc6d120e985ce16a3aeb64aadd785657fc0370c701ffebf71d83260ccdd9da04a8f29a69a01c3a9a6d2bd942c44d5cb91fcb44af60a2b8e2c94cabc23ca04ec6d3005a82cbe06546c38d4fedfc56d549c785a2e23b04ae0135b03a17d63ea504c51a0d129c172ba2ecea5dc6b8db4cec7b7a4d021da03ebe8cf6cce67b8e032b4ce780136afb144e5d8019e7916932ba87c7d9c963c0f51d62c873af41396d87877ca5ae888ea7d322faa79345080fb9d2e6dd98b7b219b6662114 -Result = F (4 - Format of the EM is incorrect - hash moved to left ) - -Digest = SHA512 -Key = 3082010b02820101009d19bc62c9c1989df660e259e9c3b1fb805cff7546d2ea5a479d29ccc4e18f1ffc4f78a9af924e04001850d3c56a91c8738f047ae12c89fab3dec2ed1dd7a207ae635f587c101fbd2c542e86726f7f72aa47497162dffad87eb321426e8929afaedf4a94c132ffb2966c22aaca737550feada9f92c07c2095739c3ee524be18c1a34dfbd2e210868c7c25a2fa222c65353dd28008ceb10a570206a59d2a23b22cfd9f38daa0db78c4843bfe1ed1a366dc128ab4d5dd45a28586ca4c8b0ffdd90759028ae29eab9c56cb0da94ec13d3d9fa69333c6065f3ec4c6392259e1c2f761eed8f8aca57354c76c2a0aa6b9045e5182a95ebd332494d642ef07c1e3617d7020400af8e8f -Msg = e74ded82964ff874c9e10540c9f1dedaccb376b882e61f33eb5afd316bafbb01205f7c8673ff1598edc179a74d3e74a1d7729d16ee08869be5d8356c13afd855254eb4d2b8b55f7528a12f88a253f2f48193df61d7f5cd9f495ba34421bb10979e227cad8ef93ed21f880f2bf3b8be99721d26df64335e08bfe82f03bd5bcb91 -Sig = 23cfae518dad78ff6540e64f54ecb571ae4fa33fcc57732d8555cd25b44b46f46eeb109f91af7d08c89e16f4cf6aa119cd9633515c55ab3fad64c8932417ca945be3e26028b752bca8851567da6408e211df8fa215a8ec07fb6faac5cff26d174a1b5b7fec9ab12c128489c4ccaea60c1347b8451bce07ccc9c21e90c2e5dcbea4a292c16d60ba66ca4e5ffd6c9cc3b8ce4ebe39df418573e0e9f42ae09875a11050a434538790c5c700b5adbbf700db2a93f3e5ac4c570f8543f0a1c1d664f29d161b064a0892db495b68da2454eb983db0fb3defb0f688b67c8506c20dc7997e0bb51854a85af613a3b9a0ca3e746f3d8393b62106c58f8ececb502824c478 -Result = F (5 - Format of the EM is incorrect - 00 on end of pad removed ) - -Digest = SHA512 -Key = 3082010b02820101009d19bc62c9c1989df660e259e9c3b1fb805cff7546d2ea5a479d29ccc4e18f1ffc4f78a9af924e04001850d3c56a91c8738f047ae12c89fab3dec2ed1dd7a207ae635f587c101fbd2c542e86726f7f72aa47497162dffad87eb321426e8929afaedf4a94c132ffb2966c22aaca737550feada9f92c07c2095739c3ee524be18c1a34dfbd2e210868c7c25a2fa222c65353dd28008ceb10a570206a59d2a23b22cfd9f38daa0db78c4843bfe1ed1a366dc128ab4d5dd45a28586ca4c8b0ffdd90759028ae29eab9c56cb0da94ec13d3d9fa69333c6065f3ec4c6392259e1c2f761eed8f8aca57354c76c2a0aa6b9045e5182a95ebd332494d642ef07c1e3617d7020400af8e8f -Msg = 19dc8b8a9da18dcb3cdcd54fe19fb766a8635ede3904bf27550dcfb5ae36f4a6fc2bbaa54d8fc80e9c411252a6de509ef987aeb74ee4c5291868caa05dd70596c506852ef1e313600db46457a9a49317c47bce632aad4fde01968d709e04b4eb9df653ef30a3550bb7be332491f9681b32c824aa7667448f351e82ed18c4e9ef -Sig = 694678413019405b4650f73897387df0a9a0744c345e52c02dbbc7d0083c71e0304d0d8cb47e08ac78ca34bcac209679671a036e1262285bddcf8d65082d8f49db6637bc2711f2ffcbebc84b0a96f581bd2de0e53ca24c715e416cb4f4da2eb4a4d0df893895910cfa4c346ee002f35792cfc066f25f048934b911dc748ecc88f709ba96f320b3f4ac84b740d7ecd32af63a833612a6b153e06f082e25b195fb0498e57c0e284ae03fdb27124f3af34b468ec03c8f9e2e4182a8d0d18f10221f79c13715be8ca77ce322f81f7555a57fe2e759f280d2a095d33ccc89ae1629b6386014df1215bc21cd8385548b1a149f57f2cf8487a6867a1bce842240050763 -Result = P - -Digest = SHA512 -Key = 3082010b02820101009d19bc62c9c1989df660e259e9c3b1fb805cff7546d2ea5a479d29ccc4e18f1ffc4f78a9af924e04001850d3c56a91c8738f047ae12c89fab3dec2ed1dd7a207ae635f587c101fbd2c542e86726f7f72aa47497162dffad87eb321426e8929afaedf4a94c132ffb2966c22aaca737550feada9f92c07c2095739c3ee524be18c1a34dfbd2e210868c7c25a2fa222c65353dd28008ceb10a570206a59d2a23b22cfd9f38daa0db78c4843bfe1ed1a366dc128ab4d5dd45a28586ca4c8b0ffdd90759028ae29eab9c56cb0da94ec13d3d9fa69333c6065f3ec4c6392259e1c2f761eed8f8aca57354c76c2a0aa6b9045e5182a95ebd332494d642ef07c1e3617d7020400af8e8f -Msg = d122c9b539021a26f4e66a823f29791780a879da291b1858dea5baf0daa906408fe0a5dd8ca84647a49fe61c4d714e8b46eedd0c7d60874e2f1b1e715155d0762f38f2f45336fc0ca89dd49edf6b4fbd1263f561a760045c78eab8903007ca5ef85336625453425d4707bc72bebe83962c2e494271c4966a003910b34166fbe1 -Sig = 57619bb864865b005fae1cb334fc5e60a23cb148e722a781b1da7e822b849b93fc502927ce9d72bf8d2f809ca6afaaf268133a7820ccb1e6c5e8a7252f67f41c8c67f97d19c718b15c32a2fd4a98c69ea535b37d6a1c884409603c80e1aac8ca32c48ad5481ab56a02526a8f37b884f15585a4989f0a7c7f3afb20718f143c4d49fdafdd33944445d39bf857f8c03e4132b1a00d52064f60172b44b67919610f2b69fdb7a51b69087915f76a2a0896fe53103c81c27d00b8c805b42d2adbd31b21d1773bc1f96b3d5f9352f224cf1ab93c18cef97134fb3cafbda7b8e4c301981ac4027486d74d1308c234f84a13cdf0e505d02c3f1f2b8e9984d6b2fdbe0400 -Result = F (4 - Format of the EM is incorrect - hash moved to left ) - -Digest = SHA512 -Key = 3082010b02820101009d19bc62c9c1989df660e259e9c3b1fb805cff7546d2ea5a479d29ccc4e18f1ffc4f78a9af924e04001850d3c56a91c8738f047ae12c89fab3dec2ed1dd7a207ae635f587c101fbd2c542e86726f7f72aa47497162dffad87eb321426e8929afaedf4a94c132ffb2966c22aaca737550feada9f92c07c2095739c3ee524be18c1a34dfbd2e210868c7c25a2fa222c65353dd28008ceb10a570206a59d2a23b22cfd9f38daa0db78c4843bfe1ed1a366dc128ab4d5dd45a28586ca4c8b0ffdd90759028ae29eab9c56cb0da94ec13d3d9fa69333c6065f3ec4c6392259e1c2f761eed8f8aca57354c76c2a0aa6b9045e5182a95ebd332494d642ef07c1e3617d7020400af8e8f -Msg = fa0e2ee8d953ee3589be814638512966d3d5e1b4ca874079170f9fb87db17e070dc7249eef6f86ae5f816af4f6c4cc8d2b61810c19971aca83b10b7d15350d0cec5fc0a259cd9502e27ceb1a8af378da53beeb46001ecfca1fffb3ce472a888b9fbc4a1d9fd7e3d91b974ce07d48f5f452d6678b08842822f5e1ded49cf9b82b -Sig = 2fba3258af60a9c026bacaaba33076b21789358f63d709e4b2374c7e010a3f13d77d71aa6a70a116eda22a652706ede6234e71bb688c32697087a0c12c422e98cd6ea530ad7adf9e293c5eda311578cf0cd6b2cb32c9342f5e2e2f3fd8b27fd8b9bd7beffac03adf6148e72d9775c27ef90aa232f49bed02af05a0d1567817116a9abc0b81ffb02816ec6bac841e559fbdd7c2e41df9e4b66f76729fefc844d6dd6a879441fb212d4c065ebe6af9365fb2ff053433aca778d3a667c901dfd7dc35bc2518640a79aaeca1270646464ca55b872017a51cff49b56b53f70324168da72b0b5a297b790c89b1f71fa7937eb1e514d77f33284765b66608010c324013 -Result = F (3 - Signature changed ) - -Digest = SHA512 -Key = 3082010b02820101009d19bc62c9c1989df660e259e9c3b1fb805cff7546d2ea5a479d29ccc4e18f1ffc4f78a9af924e04001850d3c56a91c8738f047ae12c89fab3dec2ed1dd7a207ae635f587c101fbd2c542e86726f7f72aa47497162dffad87eb321426e8929afaedf4a94c132ffb2966c22aaca737550feada9f92c07c2095739c3ee524be18c1a34dfbd2e210868c7c25a2fa222c65353dd28008ceb10a570206a59d2a23b22cfd9f38daa0db78c4843bfe1ed1a366dc128ab4d5dd45a28586ca4c8b0ffdd90759028ae29eab9c56cb0da94ec13d3d9fa69333c6065f3ec4c6392259e1c2f761eed8f8aca57354c76c2a0aa6b9045e5182a95ebd332494d642ef07c1e3617d7020400af8e8f -Msg = e25750b83c69e4e14cd31a1f366d7f97134201535b3601fe9deca9e874e68051b6ee3be3eeb5d7800dbbe43e5c6e24b0b5965468f3f04ab9a71940c20dae70a73eb2e122a630803bb9217253e28fa967bcfbb59385fdddd5d02a6f14793a5461de6be77c4c20089ab8ce6b65b01836459139ccdef9a3e3da7fe5dde8a2d25504 -Sig = 5c3ff26414d2af68f316f7646fe4740d571d7d08a4553c250b6abf0187c2ccf16ede3ba33acf57e28b20ecfcd0c77815d280c08ef4bc76aeba9012939bb53a5c932ccada6323d8de5b00439032b0fb57c77e64423a50d480d9364356e0b3b841cc8a61bbff8f235aa8247c4df7ac1a31faa85a855c76109cc0a8baff6b46feffa65ad576eb2ecf1713baef88cbf8a9d939558f95677e749045a06b8da3fddca07b8c6e25499c8d2dc6f2e152b75a9a85af85db7c84152291bb03a6ecd65a1a0209d8291cca9db5648acebeae1faeaf488c49183b0433d74833812ddd35ca6b483a9f24845f10c11a18152c9d3c8ce5209ec4d8c10c5960cc5889950428e557e3 -Result = F (1 - Message changed) - -Digest = SHA512 -Key = 3082010b02820101009d19bc62c9c1989df660e259e9c3b1fb805cff7546d2ea5a479d29ccc4e18f1ffc4f78a9af924e04001850d3c56a91c8738f047ae12c89fab3dec2ed1dd7a207ae635f587c101fbd2c542e86726f7f72aa47497162dffad87eb321426e8929afaedf4a94c132ffb2966c22aaca737550feada9f92c07c2095739c3ee524be18c1a34dfbd2e210868c7c25a2fa222c65353dd28008ceb10a570206a59d2a23b22cfd9f38daa0db78c4843bfe1ed1a366dc128ab4d5dd45a28586ca4c8b0ffdd90759028ae29eab9c56cb0da94ec13d3d9fa69333c6065f3ec4c6392259e1c2f761eed8f8aca57354c76c2a0aa6b9045e5182a95ebd332494d642ef07c1e3617d7020400fd7a0b -Msg = 2288961b2d0b66e75dfe4079804a7f99cd9735db1bb50721513a3f611e6d1ca8ea636c5f0c685dce3da191de4cef70231415c219ac1e7daeddf9db01d967b06a2917fbbae80ebbc42f4d041cd0ae511e47101c32edb3ac4f6fe52fbe7fdf0821c9ea6ab329c626d11b4bc1ba7351ca934ece6aae483e3d0bef48601f789eccd5 -Sig = 394ecbdd1159193f00fcabfe13f1ebad7d74c0fa954dfe2fcea5203b54c93e02960490f51c155da452cb451aa012f15f27c9ed603014eb88b714cd3232b0b08caad1e18f80cfb81345a18c4419b88a429a4f69c72149e96acb7f4463deca7105938d51f2a9169297e2462dcf4eac45208bc509cc3e85feac0e51b3bb32974ee82fbd23b3e2dc06da6e7f64f917d00befb181b264101de55cd90a86e0fdb27b3e9e8ffb458b39b1718e20da779408de3abc05f98e196f5f92f4dc22b34a39c28aaed5d44ba5fc8a50fbcc355bbeada239bb664f2d8e32fd53a0f8a0ca081276c32cb61c74fa9523b1d3f6a795dacab8363680ef62a2a964f66e3f5c0ef5d663d0 -Result = F (2 - Public Key e changed ) - Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/ring-0.16.20/tests/rsa_test_private_key_2048.p8 and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/ring-0.16.20/tests/rsa_test_private_key_2048.p8 differ diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/tests/rsa_test_public_key_2048_debug.txt temporalio-1.3.0/vendor/ring-0.16.20/tests/rsa_test_public_key_2048_debug.txt --- temporalio-1.3.0/vendor/ring-0.16.20/tests/rsa_test_public_key_2048_debug.txt 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/tests/rsa_test_public_key_2048_debug.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -RsaSubjectPublicKey("3082010a0282010100c8a78500a5a250db8ed36c85b8dcf83c4be1953114faaac7616e0ea24922fa6b7ab01f85582c815cc3bdeb5ed46762bc536accaa8b72705b00cef316b2ec508fb9697241b9e34238419cccf7339eeb8b062147af4f5932f613d9bc0ae70bf6d56d4432e83e13767587531bfa9dd56531741244be75e8bc9226b9fa44b4b8a101358d7e8bb75d0c724a4f11ece77776263faefe79612eb1d71646e77e8982866be1400eafc3580d3139b41aaa7380187372f22e35bd55b288496165c881ed154d5811245c52d56cc09d4916d4f2a50bcf5ae0a2637f4cfa6bf9daafc113dba8383b6dd7da6dd8db22d8510a8d3115983308909a1a0332517aa55e896e154249b30203010001") \ No newline at end of file Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/ring-0.16.20/tests/rsa_test_public_key_2048.der and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/ring-0.16.20/tests/rsa_test_public_key_2048.der differ diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/tests/rsa_tests.rs temporalio-1.3.0/vendor/ring-0.16.20/tests/rsa_tests.rs --- temporalio-1.3.0/vendor/ring-0.16.20/tests/rsa_tests.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/tests/rsa_tests.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,319 +0,0 @@ -// Copyright 2017 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -#[cfg(feature = "alloc")] -use ring::{ - error, - io::der, - rand, - signature::{self, KeyPair}, - test, test_file, -}; -use std::convert::TryFrom; - -#[cfg(all(target_arch = "wasm32", feature = "wasm32_c"))] -use wasm_bindgen_test::{wasm_bindgen_test, wasm_bindgen_test_configure}; - -#[cfg(all(target_arch = "wasm32", feature = "wasm32_c"))] -wasm_bindgen_test_configure!(run_in_browser); - -#[cfg(feature = "alloc")] -#[test] -#[cfg_attr(all(target_arch = "wasm32", feature = "wasm32_c"), wasm_bindgen_test)] -fn rsa_from_pkcs8_test() { - test::run( - test_file!("rsa_from_pkcs8_tests.txt"), - |section, test_case| { - assert_eq!(section, ""); - - let input = test_case.consume_bytes("Input"); - let error = test_case.consume_optional_string("Error"); - - match (signature::RsaKeyPair::from_pkcs8(&input), error) { - (Ok(_), None) => (), - (Err(e), None) => panic!("Failed with error \"{}\", but expected to succeed", e), - (Ok(_), Some(e)) => panic!("Succeeded, but expected error \"{}\"", e), - (Err(actual), Some(expected)) => assert_eq!(format!("{}", actual), expected), - }; - - Ok(()) - }, - ); -} - -#[cfg(feature = "alloc")] -#[test] -#[cfg_attr(all(target_arch = "wasm32", feature = "wasm32_c"), wasm_bindgen_test)] -fn test_signature_rsa_pkcs1_sign() { - let rng = rand::SystemRandom::new(); - test::run( - test_file!("rsa_pkcs1_sign_tests.txt"), - |section, test_case| { - assert_eq!(section, ""); - - let digest_name = test_case.consume_string("Digest"); - let alg = match digest_name.as_ref() { - "SHA256" => &signature::RSA_PKCS1_SHA256, - "SHA384" => &signature::RSA_PKCS1_SHA384, - "SHA512" => &signature::RSA_PKCS1_SHA512, - _ => panic!("Unsupported digest: {}", digest_name), - }; - - let private_key = test_case.consume_bytes("Key"); - let msg = test_case.consume_bytes("Msg"); - let expected = test_case.consume_bytes("Sig"); - let result = test_case.consume_string("Result"); - - let key_pair = signature::RsaKeyPair::from_der(&private_key); - if result == "Fail-Invalid-Key" { - assert!(key_pair.is_err()); - return Ok(()); - } - let key_pair = key_pair.unwrap(); - - // XXX: This test is too slow on Android ARM Travis CI builds. - // TODO: re-enable these tests on Android ARM. - let mut actual = vec![0u8; key_pair.public_modulus_len()]; - key_pair - .sign(alg, &rng, &msg, actual.as_mut_slice()) - .unwrap(); - assert_eq!(actual.as_slice() == &expected[..], result == "Pass"); - Ok(()) - }, - ); -} - -#[cfg(feature = "alloc")] -#[test] -#[cfg_attr(all(target_arch = "wasm32", feature = "wasm32_c"), wasm_bindgen_test)] -fn test_signature_rsa_pss_sign() { - test::run( - test_file!("rsa_pss_sign_tests.txt"), - |section, test_case| { - assert_eq!(section, ""); - - let digest_name = test_case.consume_string("Digest"); - let alg = match digest_name.as_ref() { - "SHA256" => &signature::RSA_PSS_SHA256, - "SHA384" => &signature::RSA_PSS_SHA384, - "SHA512" => &signature::RSA_PSS_SHA512, - _ => panic!("Unsupported digest: {}", digest_name), - }; - - let result = test_case.consume_string("Result"); - let private_key = test_case.consume_bytes("Key"); - let key_pair = signature::RsaKeyPair::from_der(&private_key); - if key_pair.is_err() && result == "Fail-Invalid-Key" { - return Ok(()); - } - let key_pair = key_pair.unwrap(); - let msg = test_case.consume_bytes("Msg"); - let salt = test_case.consume_bytes("Salt"); - let expected = test_case.consume_bytes("Sig"); - - let rng = test::rand::FixedSliceRandom { bytes: &salt }; - - let mut actual = vec![0u8; key_pair.public_modulus_len()]; - key_pair.sign(alg, &rng, &msg, actual.as_mut_slice())?; - assert_eq!(actual.as_slice() == &expected[..], result == "Pass"); - Ok(()) - }, - ); -} - -#[cfg(feature = "alloc")] -#[test] -#[cfg_attr(all(target_arch = "wasm32", feature = "wasm32_c"), wasm_bindgen_test)] -fn test_signature_rsa_pkcs1_verify() { - let sha1_params = &[ - ( - &signature::RSA_PKCS1_1024_8192_SHA1_FOR_LEGACY_USE_ONLY, - 1024, - ), - ( - &signature::RSA_PKCS1_2048_8192_SHA1_FOR_LEGACY_USE_ONLY, - 2048, - ), - ]; - let sha256_params = &[ - ( - &signature::RSA_PKCS1_1024_8192_SHA256_FOR_LEGACY_USE_ONLY, - 1024, - ), - (&signature::RSA_PKCS1_2048_8192_SHA256, 2048), - ]; - let sha384_params = &[ - (&signature::RSA_PKCS1_2048_8192_SHA384, 2048), - (&signature::RSA_PKCS1_3072_8192_SHA384, 3072), - ]; - let sha512_params = &[ - ( - &signature::RSA_PKCS1_1024_8192_SHA512_FOR_LEGACY_USE_ONLY, - 1024, - ), - (&signature::RSA_PKCS1_2048_8192_SHA512, 2048), - ]; - test::run( - test_file!("rsa_pkcs1_verify_tests.txt"), - |section, test_case| { - assert_eq!(section, ""); - - let digest_name = test_case.consume_string("Digest"); - let params: &[_] = match digest_name.as_ref() { - "SHA1" => sha1_params, - "SHA256" => sha256_params, - "SHA384" => sha384_params, - "SHA512" => sha512_params, - _ => panic!("Unsupported digest: {}", digest_name), - }; - - let public_key = test_case.consume_bytes("Key"); - - // Sanity check that we correctly DER-encoded the originally- - // provided separate (n, e) components. When we add test vectors - // for improperly-encoded signatures, we'll have to revisit this. - let key_bits = untrusted::Input::from(&public_key) - .read_all(error::Unspecified, |input| { - der::nested(input, der::Tag::Sequence, error::Unspecified, |input| { - let n_bytes = - der::positive_integer(input)?.big_endian_without_leading_zero(); - let _e = der::positive_integer(input)?; - - // Because `n_bytes` has the leading zeros stripped and is big-endian, there - // must be less than 8 leading zero bits. - let n_leading_zeros = usize::try_from(n_bytes[0].leading_zeros()).unwrap(); - assert!(n_leading_zeros < 8); - Ok((n_bytes.len() * 8) - n_leading_zeros) - }) - }) - .expect("invalid DER"); - - let msg = test_case.consume_bytes("Msg"); - let sig = test_case.consume_bytes("Sig"); - let is_valid = test_case.consume_string("Result") == "P"; - for &(alg, min_bits) in params { - let width_ok = key_bits >= min_bits; - let actual_result = - signature::UnparsedPublicKey::new(alg, &public_key).verify(&msg, &sig); - assert_eq!(actual_result.is_ok(), is_valid && width_ok); - } - - Ok(()) - }, - ); -} - -#[cfg(feature = "alloc")] -#[test] -#[cfg_attr(all(target_arch = "wasm32", feature = "wasm32_c"), wasm_bindgen_test)] -fn test_signature_rsa_pss_verify() { - test::run( - test_file!("rsa_pss_verify_tests.txt"), - |section, test_case| { - assert_eq!(section, ""); - - let digest_name = test_case.consume_string("Digest"); - let alg = match digest_name.as_ref() { - "SHA256" => &signature::RSA_PSS_2048_8192_SHA256, - "SHA384" => &signature::RSA_PSS_2048_8192_SHA384, - "SHA512" => &signature::RSA_PSS_2048_8192_SHA512, - _ => panic!("Unsupported digest: {}", digest_name), - }; - - let public_key = test_case.consume_bytes("Key"); - - // Sanity check that we correctly DER-encoded the originally- - // provided separate (n, e) components. When we add test vectors - // for improperly-encoded signatures, we'll have to revisit this. - assert!(untrusted::Input::from(&public_key) - .read_all(error::Unspecified, |input| der::nested( - input, - der::Tag::Sequence, - error::Unspecified, - |input| { - let _ = der::positive_integer(input)?; - let _ = der::positive_integer(input)?; - Ok(()) - } - )) - .is_ok()); - - let msg = test_case.consume_bytes("Msg"); - let sig = test_case.consume_bytes("Sig"); - let is_valid = test_case.consume_string("Result") == "P"; - - let actual_result = - signature::UnparsedPublicKey::new(alg, &public_key).verify(&msg, &sig); - assert_eq!(actual_result.is_ok(), is_valid); - - Ok(()) - }, - ); -} - -// Test for `primitive::verify()`. Read public key parts from a file -// and use them to verify a signature. -#[cfg(feature = "alloc")] -#[test] -#[cfg_attr(all(target_arch = "wasm32", feature = "wasm32_c"), wasm_bindgen_test)] -fn test_signature_rsa_primitive_verification() { - test::run( - test_file!("rsa_primitive_verify_tests.txt"), - |section, test_case| { - assert_eq!(section, ""); - let n = test_case.consume_bytes("n"); - let e = test_case.consume_bytes("e"); - let msg = test_case.consume_bytes("Msg"); - let sig = test_case.consume_bytes("Sig"); - let expected = test_case.consume_string("Result"); - let public_key = signature::RsaPublicKeyComponents { n: &n, e: &e }; - let result = public_key.verify(&signature::RSA_PKCS1_2048_8192_SHA256, &msg, &sig); - assert_eq!(result.is_ok(), expected == "Pass"); - Ok(()) - }, - ) -} - -#[cfg(feature = "alloc")] -#[test] -#[cfg_attr(all(target_arch = "wasm32", feature = "wasm32_c"), wasm_bindgen_test)] -fn rsa_test_public_key_coverage() { - const PRIVATE_KEY: &[u8] = include_bytes!("rsa_test_private_key_2048.p8"); - const PUBLIC_KEY: &[u8] = include_bytes!("rsa_test_public_key_2048.der"); - const PUBLIC_KEY_DEBUG: &str = include_str!("rsa_test_public_key_2048_debug.txt"); - - let key_pair = signature::RsaKeyPair::from_pkcs8(PRIVATE_KEY).unwrap(); - - // Test `AsRef<[u8]>` - assert_eq!(key_pair.public_key().as_ref(), PUBLIC_KEY); - - // Test `Clone`. - let _ = key_pair.public_key().clone(); - - // Test `exponent()`. - assert_eq!( - &[0x01, 0x00, 0x01], - key_pair - .public_key() - .exponent() - .big_endian_without_leading_zero() - ); - - // Test `Debug` - assert_eq!(PUBLIC_KEY_DEBUG, format!("{:?}", key_pair.public_key())); - assert_eq!( - format!("RsaKeyPair {{ public_key: {:?} }}", key_pair.public_key()), - format!("{:?}", key_pair) - ); -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/tests/signature_tests.rs temporalio-1.3.0/vendor/ring-0.16.20/tests/signature_tests.rs --- temporalio-1.3.0/vendor/ring-0.16.20/tests/signature_tests.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/tests/signature_tests.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,16 +0,0 @@ -use ring::{signature, test}; - -#[cfg(target_arch = "wasm32")] -use wasm_bindgen_test::{wasm_bindgen_test, wasm_bindgen_test_configure}; - -#[cfg(target_arch = "wasm32")] -wasm_bindgen_test_configure!(run_in_browser); - -#[test] -#[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -fn signature_impl_test() { - test::compile_time_assert_clone::(); - test::compile_time_assert_copy::(); - test::compile_time_assert_send::(); - test::compile_time_assert_sync::(); -} diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/third_party/fiat/curve25519_32.h temporalio-1.3.0/vendor/ring-0.16.20/third_party/fiat/curve25519_32.h --- temporalio-1.3.0/vendor/ring-0.16.20/third_party/fiat/curve25519_32.h 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/third_party/fiat/curve25519_32.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,981 +0,0 @@ -/* Autogenerated: src/ExtractionOCaml/unsaturated_solinas --static 25519 10 '2^255 - 19' 32 carry_mul carry_square carry add sub opp selectznz to_bytes from_bytes carry_scmul121666 */ -/* curve description: 25519 */ -/* requested operations: carry_mul, carry_square, carry, add, sub, opp, selectznz, to_bytes, from_bytes, carry_scmul121666 */ -/* n = 10 (from "10") */ -/* s-c = 2^255 - [(1, 19)] (from "2^255 - 19") */ -/* machine_wordsize = 32 (from "32") */ - -/* Computed values: */ -/* carry_chain = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1] */ - -#include -typedef unsigned char fiat_25519_uint1; -typedef signed char fiat_25519_int1; - -#if (-1 & 3) != 3 -#error "This code only works on a two's complement system" -#endif - - -/* - * The function fiat_25519_addcarryx_u26 is an addition with carry. - * Postconditions: - * out1 = (arg1 + arg2 + arg3) mod 2^26 - * out2 = ⌊(arg1 + arg2 + arg3) / 2^26⌋ - * - * Input Bounds: - * arg1: [0x0 ~> 0x1] - * arg2: [0x0 ~> 0x3ffffff] - * arg3: [0x0 ~> 0x3ffffff] - * Output Bounds: - * out1: [0x0 ~> 0x3ffffff] - * out2: [0x0 ~> 0x1] - */ -static void fiat_25519_addcarryx_u26(uint32_t* out1, fiat_25519_uint1* out2, fiat_25519_uint1 arg1, uint32_t arg2, uint32_t arg3) { - uint32_t x1 = ((arg1 + arg2) + arg3); - uint32_t x2 = (x1 & UINT32_C(0x3ffffff)); - fiat_25519_uint1 x3 = (fiat_25519_uint1)(x1 >> 26); - *out1 = x2; - *out2 = x3; -} - -/* - * The function fiat_25519_subborrowx_u26 is a subtraction with borrow. - * Postconditions: - * out1 = (-arg1 + arg2 + -arg3) mod 2^26 - * out2 = -⌊(-arg1 + arg2 + -arg3) / 2^26⌋ - * - * Input Bounds: - * arg1: [0x0 ~> 0x1] - * arg2: [0x0 ~> 0x3ffffff] - * arg3: [0x0 ~> 0x3ffffff] - * Output Bounds: - * out1: [0x0 ~> 0x3ffffff] - * out2: [0x0 ~> 0x1] - */ -static void fiat_25519_subborrowx_u26(uint32_t* out1, fiat_25519_uint1* out2, fiat_25519_uint1 arg1, uint32_t arg2, uint32_t arg3) { - int32_t x1 = ((int32_t)(arg2 - arg1) - (int32_t)arg3); - fiat_25519_int1 x2 = (fiat_25519_int1)(x1 >> 26); - uint32_t x3 = (x1 & UINT32_C(0x3ffffff)); - *out1 = x3; - *out2 = (fiat_25519_uint1)(0x0 - x2); -} - -/* - * The function fiat_25519_addcarryx_u25 is an addition with carry. - * Postconditions: - * out1 = (arg1 + arg2 + arg3) mod 2^25 - * out2 = ⌊(arg1 + arg2 + arg3) / 2^25⌋ - * - * Input Bounds: - * arg1: [0x0 ~> 0x1] - * arg2: [0x0 ~> 0x1ffffff] - * arg3: [0x0 ~> 0x1ffffff] - * Output Bounds: - * out1: [0x0 ~> 0x1ffffff] - * out2: [0x0 ~> 0x1] - */ -static void fiat_25519_addcarryx_u25(uint32_t* out1, fiat_25519_uint1* out2, fiat_25519_uint1 arg1, uint32_t arg2, uint32_t arg3) { - uint32_t x1 = ((arg1 + arg2) + arg3); - uint32_t x2 = (x1 & UINT32_C(0x1ffffff)); - fiat_25519_uint1 x3 = (fiat_25519_uint1)(x1 >> 25); - *out1 = x2; - *out2 = x3; -} - -/* - * The function fiat_25519_subborrowx_u25 is a subtraction with borrow. - * Postconditions: - * out1 = (-arg1 + arg2 + -arg3) mod 2^25 - * out2 = -⌊(-arg1 + arg2 + -arg3) / 2^25⌋ - * - * Input Bounds: - * arg1: [0x0 ~> 0x1] - * arg2: [0x0 ~> 0x1ffffff] - * arg3: [0x0 ~> 0x1ffffff] - * Output Bounds: - * out1: [0x0 ~> 0x1ffffff] - * out2: [0x0 ~> 0x1] - */ -static void fiat_25519_subborrowx_u25(uint32_t* out1, fiat_25519_uint1* out2, fiat_25519_uint1 arg1, uint32_t arg2, uint32_t arg3) { - int32_t x1 = ((int32_t)(arg2 - arg1) - (int32_t)arg3); - fiat_25519_int1 x2 = (fiat_25519_int1)(x1 >> 25); - uint32_t x3 = (x1 & UINT32_C(0x1ffffff)); - *out1 = x3; - *out2 = (fiat_25519_uint1)(0x0 - x2); -} - -/* - * The function fiat_25519_cmovznz_u32 is a single-word conditional move. - * Postconditions: - * out1 = (if arg1 = 0 then arg2 else arg3) - * - * Input Bounds: - * arg1: [0x0 ~> 0x1] - * arg2: [0x0 ~> 0xffffffff] - * arg3: [0x0 ~> 0xffffffff] - * Output Bounds: - * out1: [0x0 ~> 0xffffffff] - */ -static void fiat_25519_cmovznz_u32(uint32_t* out1, fiat_25519_uint1 arg1, uint32_t arg2, uint32_t arg3) { - fiat_25519_uint1 x1 = (!(!arg1)); - uint32_t x2 = ((fiat_25519_int1)(0x0 - x1) & UINT32_C(0xffffffff)); - // Note this line has been patched from the synthesized code to add value - // barriers. - // - // Clang recognizes this pattern as a select. While it usually transforms it - // to a cmov, it sometimes further transforms it into a branch, which we do - // not want. - uint32_t x3 = ((value_barrier_u32(x2) & arg3) | (value_barrier_u32(~x2) & arg2)); - *out1 = x3; -} - -/* - * The function fiat_25519_carry_mul multiplies two field elements and reduces the result. - * Postconditions: - * eval out1 mod m = (eval arg1 * eval arg2) mod m - * - * Input Bounds: - * arg1: [[0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999]] - * arg2: [[0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999]] - * Output Bounds: - * out1: [[0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333]] - */ -static void fiat_25519_carry_mul(uint32_t out1[10], const uint32_t arg1[10], const uint32_t arg2[10]) { - uint64_t x1 = ((uint64_t)(arg1[9]) * ((arg2[9]) * UINT8_C(0x26))); - uint64_t x2 = ((uint64_t)(arg1[9]) * ((arg2[8]) * UINT8_C(0x13))); - uint64_t x3 = ((uint64_t)(arg1[9]) * ((arg2[7]) * UINT8_C(0x26))); - uint64_t x4 = ((uint64_t)(arg1[9]) * ((arg2[6]) * UINT8_C(0x13))); - uint64_t x5 = ((uint64_t)(arg1[9]) * ((arg2[5]) * UINT8_C(0x26))); - uint64_t x6 = ((uint64_t)(arg1[9]) * ((arg2[4]) * UINT8_C(0x13))); - uint64_t x7 = ((uint64_t)(arg1[9]) * ((arg2[3]) * UINT8_C(0x26))); - uint64_t x8 = ((uint64_t)(arg1[9]) * ((arg2[2]) * UINT8_C(0x13))); - uint64_t x9 = ((uint64_t)(arg1[9]) * ((arg2[1]) * UINT8_C(0x26))); - uint64_t x10 = ((uint64_t)(arg1[8]) * ((arg2[9]) * UINT8_C(0x13))); - uint64_t x11 = ((uint64_t)(arg1[8]) * ((arg2[8]) * UINT8_C(0x13))); - uint64_t x12 = ((uint64_t)(arg1[8]) * ((arg2[7]) * UINT8_C(0x13))); - uint64_t x13 = ((uint64_t)(arg1[8]) * ((arg2[6]) * UINT8_C(0x13))); - uint64_t x14 = ((uint64_t)(arg1[8]) * ((arg2[5]) * UINT8_C(0x13))); - uint64_t x15 = ((uint64_t)(arg1[8]) * ((arg2[4]) * UINT8_C(0x13))); - uint64_t x16 = ((uint64_t)(arg1[8]) * ((arg2[3]) * UINT8_C(0x13))); - uint64_t x17 = ((uint64_t)(arg1[8]) * ((arg2[2]) * UINT8_C(0x13))); - uint64_t x18 = ((uint64_t)(arg1[7]) * ((arg2[9]) * UINT8_C(0x26))); - uint64_t x19 = ((uint64_t)(arg1[7]) * ((arg2[8]) * UINT8_C(0x13))); - uint64_t x20 = ((uint64_t)(arg1[7]) * ((arg2[7]) * UINT8_C(0x26))); - uint64_t x21 = ((uint64_t)(arg1[7]) * ((arg2[6]) * UINT8_C(0x13))); - uint64_t x22 = ((uint64_t)(arg1[7]) * ((arg2[5]) * UINT8_C(0x26))); - uint64_t x23 = ((uint64_t)(arg1[7]) * ((arg2[4]) * UINT8_C(0x13))); - uint64_t x24 = ((uint64_t)(arg1[7]) * ((arg2[3]) * UINT8_C(0x26))); - uint64_t x25 = ((uint64_t)(arg1[6]) * ((arg2[9]) * UINT8_C(0x13))); - uint64_t x26 = ((uint64_t)(arg1[6]) * ((arg2[8]) * UINT8_C(0x13))); - uint64_t x27 = ((uint64_t)(arg1[6]) * ((arg2[7]) * UINT8_C(0x13))); - uint64_t x28 = ((uint64_t)(arg1[6]) * ((arg2[6]) * UINT8_C(0x13))); - uint64_t x29 = ((uint64_t)(arg1[6]) * ((arg2[5]) * UINT8_C(0x13))); - uint64_t x30 = ((uint64_t)(arg1[6]) * ((arg2[4]) * UINT8_C(0x13))); - uint64_t x31 = ((uint64_t)(arg1[5]) * ((arg2[9]) * UINT8_C(0x26))); - uint64_t x32 = ((uint64_t)(arg1[5]) * ((arg2[8]) * UINT8_C(0x13))); - uint64_t x33 = ((uint64_t)(arg1[5]) * ((arg2[7]) * UINT8_C(0x26))); - uint64_t x34 = ((uint64_t)(arg1[5]) * ((arg2[6]) * UINT8_C(0x13))); - uint64_t x35 = ((uint64_t)(arg1[5]) * ((arg2[5]) * UINT8_C(0x26))); - uint64_t x36 = ((uint64_t)(arg1[4]) * ((arg2[9]) * UINT8_C(0x13))); - uint64_t x37 = ((uint64_t)(arg1[4]) * ((arg2[8]) * UINT8_C(0x13))); - uint64_t x38 = ((uint64_t)(arg1[4]) * ((arg2[7]) * UINT8_C(0x13))); - uint64_t x39 = ((uint64_t)(arg1[4]) * ((arg2[6]) * UINT8_C(0x13))); - uint64_t x40 = ((uint64_t)(arg1[3]) * ((arg2[9]) * UINT8_C(0x26))); - uint64_t x41 = ((uint64_t)(arg1[3]) * ((arg2[8]) * UINT8_C(0x13))); - uint64_t x42 = ((uint64_t)(arg1[3]) * ((arg2[7]) * UINT8_C(0x26))); - uint64_t x43 = ((uint64_t)(arg1[2]) * ((arg2[9]) * UINT8_C(0x13))); - uint64_t x44 = ((uint64_t)(arg1[2]) * ((arg2[8]) * UINT8_C(0x13))); - uint64_t x45 = ((uint64_t)(arg1[1]) * ((arg2[9]) * UINT8_C(0x26))); - uint64_t x46 = ((uint64_t)(arg1[9]) * (arg2[0])); - uint64_t x47 = ((uint64_t)(arg1[8]) * (arg2[1])); - uint64_t x48 = ((uint64_t)(arg1[8]) * (arg2[0])); - uint64_t x49 = ((uint64_t)(arg1[7]) * (arg2[2])); - uint64_t x50 = ((uint64_t)(arg1[7]) * ((arg2[1]) * 0x2)); - uint64_t x51 = ((uint64_t)(arg1[7]) * (arg2[0])); - uint64_t x52 = ((uint64_t)(arg1[6]) * (arg2[3])); - uint64_t x53 = ((uint64_t)(arg1[6]) * (arg2[2])); - uint64_t x54 = ((uint64_t)(arg1[6]) * (arg2[1])); - uint64_t x55 = ((uint64_t)(arg1[6]) * (arg2[0])); - uint64_t x56 = ((uint64_t)(arg1[5]) * (arg2[4])); - uint64_t x57 = ((uint64_t)(arg1[5]) * ((arg2[3]) * 0x2)); - uint64_t x58 = ((uint64_t)(arg1[5]) * (arg2[2])); - uint64_t x59 = ((uint64_t)(arg1[5]) * ((arg2[1]) * 0x2)); - uint64_t x60 = ((uint64_t)(arg1[5]) * (arg2[0])); - uint64_t x61 = ((uint64_t)(arg1[4]) * (arg2[5])); - uint64_t x62 = ((uint64_t)(arg1[4]) * (arg2[4])); - uint64_t x63 = ((uint64_t)(arg1[4]) * (arg2[3])); - uint64_t x64 = ((uint64_t)(arg1[4]) * (arg2[2])); - uint64_t x65 = ((uint64_t)(arg1[4]) * (arg2[1])); - uint64_t x66 = ((uint64_t)(arg1[4]) * (arg2[0])); - uint64_t x67 = ((uint64_t)(arg1[3]) * (arg2[6])); - uint64_t x68 = ((uint64_t)(arg1[3]) * ((arg2[5]) * 0x2)); - uint64_t x69 = ((uint64_t)(arg1[3]) * (arg2[4])); - uint64_t x70 = ((uint64_t)(arg1[3]) * ((arg2[3]) * 0x2)); - uint64_t x71 = ((uint64_t)(arg1[3]) * (arg2[2])); - uint64_t x72 = ((uint64_t)(arg1[3]) * ((arg2[1]) * 0x2)); - uint64_t x73 = ((uint64_t)(arg1[3]) * (arg2[0])); - uint64_t x74 = ((uint64_t)(arg1[2]) * (arg2[7])); - uint64_t x75 = ((uint64_t)(arg1[2]) * (arg2[6])); - uint64_t x76 = ((uint64_t)(arg1[2]) * (arg2[5])); - uint64_t x77 = ((uint64_t)(arg1[2]) * (arg2[4])); - uint64_t x78 = ((uint64_t)(arg1[2]) * (arg2[3])); - uint64_t x79 = ((uint64_t)(arg1[2]) * (arg2[2])); - uint64_t x80 = ((uint64_t)(arg1[2]) * (arg2[1])); - uint64_t x81 = ((uint64_t)(arg1[2]) * (arg2[0])); - uint64_t x82 = ((uint64_t)(arg1[1]) * (arg2[8])); - uint64_t x83 = ((uint64_t)(arg1[1]) * ((arg2[7]) * 0x2)); - uint64_t x84 = ((uint64_t)(arg1[1]) * (arg2[6])); - uint64_t x85 = ((uint64_t)(arg1[1]) * ((arg2[5]) * 0x2)); - uint64_t x86 = ((uint64_t)(arg1[1]) * (arg2[4])); - uint64_t x87 = ((uint64_t)(arg1[1]) * ((arg2[3]) * 0x2)); - uint64_t x88 = ((uint64_t)(arg1[1]) * (arg2[2])); - uint64_t x89 = ((uint64_t)(arg1[1]) * ((arg2[1]) * 0x2)); - uint64_t x90 = ((uint64_t)(arg1[1]) * (arg2[0])); - uint64_t x91 = ((uint64_t)(arg1[0]) * (arg2[9])); - uint64_t x92 = ((uint64_t)(arg1[0]) * (arg2[8])); - uint64_t x93 = ((uint64_t)(arg1[0]) * (arg2[7])); - uint64_t x94 = ((uint64_t)(arg1[0]) * (arg2[6])); - uint64_t x95 = ((uint64_t)(arg1[0]) * (arg2[5])); - uint64_t x96 = ((uint64_t)(arg1[0]) * (arg2[4])); - uint64_t x97 = ((uint64_t)(arg1[0]) * (arg2[3])); - uint64_t x98 = ((uint64_t)(arg1[0]) * (arg2[2])); - uint64_t x99 = ((uint64_t)(arg1[0]) * (arg2[1])); - uint64_t x100 = ((uint64_t)(arg1[0]) * (arg2[0])); - uint64_t x101 = (x100 + (x45 + (x44 + (x42 + (x39 + (x35 + (x30 + (x24 + (x17 + x9))))))))); - uint64_t x102 = (x101 >> 26); - uint32_t x103 = (uint32_t)(x101 & UINT32_C(0x3ffffff)); - uint64_t x104 = (x91 + (x82 + (x74 + (x67 + (x61 + (x56 + (x52 + (x49 + (x47 + x46))))))))); - uint64_t x105 = (x92 + (x83 + (x75 + (x68 + (x62 + (x57 + (x53 + (x50 + (x48 + x1))))))))); - uint64_t x106 = (x93 + (x84 + (x76 + (x69 + (x63 + (x58 + (x54 + (x51 + (x10 + x2))))))))); - uint64_t x107 = (x94 + (x85 + (x77 + (x70 + (x64 + (x59 + (x55 + (x18 + (x11 + x3))))))))); - uint64_t x108 = (x95 + (x86 + (x78 + (x71 + (x65 + (x60 + (x25 + (x19 + (x12 + x4))))))))); - uint64_t x109 = (x96 + (x87 + (x79 + (x72 + (x66 + (x31 + (x26 + (x20 + (x13 + x5))))))))); - uint64_t x110 = (x97 + (x88 + (x80 + (x73 + (x36 + (x32 + (x27 + (x21 + (x14 + x6))))))))); - uint64_t x111 = (x98 + (x89 + (x81 + (x40 + (x37 + (x33 + (x28 + (x22 + (x15 + x7))))))))); - uint64_t x112 = (x99 + (x90 + (x43 + (x41 + (x38 + (x34 + (x29 + (x23 + (x16 + x8))))))))); - uint64_t x113 = (x102 + x112); - uint64_t x114 = (x113 >> 25); - uint32_t x115 = (uint32_t)(x113 & UINT32_C(0x1ffffff)); - uint64_t x116 = (x114 + x111); - uint64_t x117 = (x116 >> 26); - uint32_t x118 = (uint32_t)(x116 & UINT32_C(0x3ffffff)); - uint64_t x119 = (x117 + x110); - uint64_t x120 = (x119 >> 25); - uint32_t x121 = (uint32_t)(x119 & UINT32_C(0x1ffffff)); - uint64_t x122 = (x120 + x109); - uint64_t x123 = (x122 >> 26); - uint32_t x124 = (uint32_t)(x122 & UINT32_C(0x3ffffff)); - uint64_t x125 = (x123 + x108); - uint64_t x126 = (x125 >> 25); - uint32_t x127 = (uint32_t)(x125 & UINT32_C(0x1ffffff)); - uint64_t x128 = (x126 + x107); - uint64_t x129 = (x128 >> 26); - uint32_t x130 = (uint32_t)(x128 & UINT32_C(0x3ffffff)); - uint64_t x131 = (x129 + x106); - uint64_t x132 = (x131 >> 25); - uint32_t x133 = (uint32_t)(x131 & UINT32_C(0x1ffffff)); - uint64_t x134 = (x132 + x105); - uint64_t x135 = (x134 >> 26); - uint32_t x136 = (uint32_t)(x134 & UINT32_C(0x3ffffff)); - uint64_t x137 = (x135 + x104); - uint64_t x138 = (x137 >> 25); - uint32_t x139 = (uint32_t)(x137 & UINT32_C(0x1ffffff)); - uint64_t x140 = (x138 * UINT8_C(0x13)); - uint64_t x141 = (x103 + x140); - uint32_t x142 = (uint32_t)(x141 >> 26); - uint32_t x143 = (uint32_t)(x141 & UINT32_C(0x3ffffff)); - uint32_t x144 = (x142 + x115); - fiat_25519_uint1 x145 = (fiat_25519_uint1)(x144 >> 25); - uint32_t x146 = (x144 & UINT32_C(0x1ffffff)); - uint32_t x147 = (x145 + x118); - out1[0] = x143; - out1[1] = x146; - out1[2] = x147; - out1[3] = x121; - out1[4] = x124; - out1[5] = x127; - out1[6] = x130; - out1[7] = x133; - out1[8] = x136; - out1[9] = x139; -} - -/* - * The function fiat_25519_carry_square squares a field element and reduces the result. - * Postconditions: - * eval out1 mod m = (eval arg1 * eval arg1) mod m - * - * Input Bounds: - * arg1: [[0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999]] - * Output Bounds: - * out1: [[0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333]] - */ -static void fiat_25519_carry_square(uint32_t out1[10], const uint32_t arg1[10]) { - uint32_t x1 = ((arg1[9]) * UINT8_C(0x13)); - uint32_t x2 = (x1 * 0x2); - uint32_t x3 = ((arg1[9]) * 0x2); - uint32_t x4 = ((arg1[8]) * UINT8_C(0x13)); - uint64_t x5 = ((uint64_t)x4 * 0x2); - uint32_t x6 = ((arg1[8]) * 0x2); - uint32_t x7 = ((arg1[7]) * UINT8_C(0x13)); - uint32_t x8 = (x7 * 0x2); - uint32_t x9 = ((arg1[7]) * 0x2); - uint32_t x10 = ((arg1[6]) * UINT8_C(0x13)); - uint64_t x11 = ((uint64_t)x10 * 0x2); - uint32_t x12 = ((arg1[6]) * 0x2); - uint32_t x13 = ((arg1[5]) * UINT8_C(0x13)); - uint32_t x14 = ((arg1[5]) * 0x2); - uint32_t x15 = ((arg1[4]) * 0x2); - uint32_t x16 = ((arg1[3]) * 0x2); - uint32_t x17 = ((arg1[2]) * 0x2); - uint32_t x18 = ((arg1[1]) * 0x2); - uint64_t x19 = ((uint64_t)(arg1[9]) * (x1 * 0x2)); - uint64_t x20 = ((uint64_t)(arg1[8]) * x2); - uint64_t x21 = ((uint64_t)(arg1[8]) * x4); - uint64_t x22 = ((arg1[7]) * ((uint64_t)x2 * 0x2)); - uint64_t x23 = ((arg1[7]) * x5); - uint64_t x24 = ((uint64_t)(arg1[7]) * (x7 * 0x2)); - uint64_t x25 = ((uint64_t)(arg1[6]) * x2); - uint64_t x26 = ((arg1[6]) * x5); - uint64_t x27 = ((uint64_t)(arg1[6]) * x8); - uint64_t x28 = ((uint64_t)(arg1[6]) * x10); - uint64_t x29 = ((arg1[5]) * ((uint64_t)x2 * 0x2)); - uint64_t x30 = ((arg1[5]) * x5); - uint64_t x31 = ((arg1[5]) * ((uint64_t)x8 * 0x2)); - uint64_t x32 = ((arg1[5]) * x11); - uint64_t x33 = ((uint64_t)(arg1[5]) * (x13 * 0x2)); - uint64_t x34 = ((uint64_t)(arg1[4]) * x2); - uint64_t x35 = ((arg1[4]) * x5); - uint64_t x36 = ((uint64_t)(arg1[4]) * x8); - uint64_t x37 = ((arg1[4]) * x11); - uint64_t x38 = ((uint64_t)(arg1[4]) * x14); - uint64_t x39 = ((uint64_t)(arg1[4]) * (arg1[4])); - uint64_t x40 = ((arg1[3]) * ((uint64_t)x2 * 0x2)); - uint64_t x41 = ((arg1[3]) * x5); - uint64_t x42 = ((arg1[3]) * ((uint64_t)x8 * 0x2)); - uint64_t x43 = ((uint64_t)(arg1[3]) * x12); - uint64_t x44 = ((uint64_t)(arg1[3]) * (x14 * 0x2)); - uint64_t x45 = ((uint64_t)(arg1[3]) * x15); - uint64_t x46 = ((uint64_t)(arg1[3]) * ((arg1[3]) * 0x2)); - uint64_t x47 = ((uint64_t)(arg1[2]) * x2); - uint64_t x48 = ((arg1[2]) * x5); - uint64_t x49 = ((uint64_t)(arg1[2]) * x9); - uint64_t x50 = ((uint64_t)(arg1[2]) * x12); - uint64_t x51 = ((uint64_t)(arg1[2]) * x14); - uint64_t x52 = ((uint64_t)(arg1[2]) * x15); - uint64_t x53 = ((uint64_t)(arg1[2]) * x16); - uint64_t x54 = ((uint64_t)(arg1[2]) * (arg1[2])); - uint64_t x55 = ((arg1[1]) * ((uint64_t)x2 * 0x2)); - uint64_t x56 = ((uint64_t)(arg1[1]) * x6); - uint64_t x57 = ((uint64_t)(arg1[1]) * (x9 * 0x2)); - uint64_t x58 = ((uint64_t)(arg1[1]) * x12); - uint64_t x59 = ((uint64_t)(arg1[1]) * (x14 * 0x2)); - uint64_t x60 = ((uint64_t)(arg1[1]) * x15); - uint64_t x61 = ((uint64_t)(arg1[1]) * (x16 * 0x2)); - uint64_t x62 = ((uint64_t)(arg1[1]) * x17); - uint64_t x63 = ((uint64_t)(arg1[1]) * ((arg1[1]) * 0x2)); - uint64_t x64 = ((uint64_t)(arg1[0]) * x3); - uint64_t x65 = ((uint64_t)(arg1[0]) * x6); - uint64_t x66 = ((uint64_t)(arg1[0]) * x9); - uint64_t x67 = ((uint64_t)(arg1[0]) * x12); - uint64_t x68 = ((uint64_t)(arg1[0]) * x14); - uint64_t x69 = ((uint64_t)(arg1[0]) * x15); - uint64_t x70 = ((uint64_t)(arg1[0]) * x16); - uint64_t x71 = ((uint64_t)(arg1[0]) * x17); - uint64_t x72 = ((uint64_t)(arg1[0]) * x18); - uint64_t x73 = ((uint64_t)(arg1[0]) * (arg1[0])); - uint64_t x74 = (x73 + (x55 + (x48 + (x42 + (x37 + x33))))); - uint64_t x75 = (x74 >> 26); - uint32_t x76 = (uint32_t)(x74 & UINT32_C(0x3ffffff)); - uint64_t x77 = (x64 + (x56 + (x49 + (x43 + x38)))); - uint64_t x78 = (x65 + (x57 + (x50 + (x44 + (x39 + x19))))); - uint64_t x79 = (x66 + (x58 + (x51 + (x45 + x20)))); - uint64_t x80 = (x67 + (x59 + (x52 + (x46 + (x22 + x21))))); - uint64_t x81 = (x68 + (x60 + (x53 + (x25 + x23)))); - uint64_t x82 = (x69 + (x61 + (x54 + (x29 + (x26 + x24))))); - uint64_t x83 = (x70 + (x62 + (x34 + (x30 + x27)))); - uint64_t x84 = (x71 + (x63 + (x40 + (x35 + (x31 + x28))))); - uint64_t x85 = (x72 + (x47 + (x41 + (x36 + x32)))); - uint64_t x86 = (x75 + x85); - uint64_t x87 = (x86 >> 25); - uint32_t x88 = (uint32_t)(x86 & UINT32_C(0x1ffffff)); - uint64_t x89 = (x87 + x84); - uint64_t x90 = (x89 >> 26); - uint32_t x91 = (uint32_t)(x89 & UINT32_C(0x3ffffff)); - uint64_t x92 = (x90 + x83); - uint64_t x93 = (x92 >> 25); - uint32_t x94 = (uint32_t)(x92 & UINT32_C(0x1ffffff)); - uint64_t x95 = (x93 + x82); - uint64_t x96 = (x95 >> 26); - uint32_t x97 = (uint32_t)(x95 & UINT32_C(0x3ffffff)); - uint64_t x98 = (x96 + x81); - uint64_t x99 = (x98 >> 25); - uint32_t x100 = (uint32_t)(x98 & UINT32_C(0x1ffffff)); - uint64_t x101 = (x99 + x80); - uint64_t x102 = (x101 >> 26); - uint32_t x103 = (uint32_t)(x101 & UINT32_C(0x3ffffff)); - uint64_t x104 = (x102 + x79); - uint64_t x105 = (x104 >> 25); - uint32_t x106 = (uint32_t)(x104 & UINT32_C(0x1ffffff)); - uint64_t x107 = (x105 + x78); - uint64_t x108 = (x107 >> 26); - uint32_t x109 = (uint32_t)(x107 & UINT32_C(0x3ffffff)); - uint64_t x110 = (x108 + x77); - uint64_t x111 = (x110 >> 25); - uint32_t x112 = (uint32_t)(x110 & UINT32_C(0x1ffffff)); - uint64_t x113 = (x111 * UINT8_C(0x13)); - uint64_t x114 = (x76 + x113); - uint32_t x115 = (uint32_t)(x114 >> 26); - uint32_t x116 = (uint32_t)(x114 & UINT32_C(0x3ffffff)); - uint32_t x117 = (x115 + x88); - fiat_25519_uint1 x118 = (fiat_25519_uint1)(x117 >> 25); - uint32_t x119 = (x117 & UINT32_C(0x1ffffff)); - uint32_t x120 = (x118 + x91); - out1[0] = x116; - out1[1] = x119; - out1[2] = x120; - out1[3] = x94; - out1[4] = x97; - out1[5] = x100; - out1[6] = x103; - out1[7] = x106; - out1[8] = x109; - out1[9] = x112; -} - -/* - * The function fiat_25519_carry reduces a field element. - * Postconditions: - * eval out1 mod m = eval arg1 mod m - * - * Input Bounds: - * arg1: [[0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999]] - * Output Bounds: - * out1: [[0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333]] - */ -static void fiat_25519_carry(uint32_t out1[10], const uint32_t arg1[10]) { - uint32_t x1 = (arg1[0]); - uint32_t x2 = ((x1 >> 26) + (arg1[1])); - uint32_t x3 = ((x2 >> 25) + (arg1[2])); - uint32_t x4 = ((x3 >> 26) + (arg1[3])); - uint32_t x5 = ((x4 >> 25) + (arg1[4])); - uint32_t x6 = ((x5 >> 26) + (arg1[5])); - uint32_t x7 = ((x6 >> 25) + (arg1[6])); - uint32_t x8 = ((x7 >> 26) + (arg1[7])); - uint32_t x9 = ((x8 >> 25) + (arg1[8])); - uint32_t x10 = ((x9 >> 26) + (arg1[9])); - uint32_t x11 = ((x1 & UINT32_C(0x3ffffff)) + ((x10 >> 25) * UINT8_C(0x13))); - uint32_t x12 = ((fiat_25519_uint1)(x11 >> 26) + (x2 & UINT32_C(0x1ffffff))); - uint32_t x13 = (x11 & UINT32_C(0x3ffffff)); - uint32_t x14 = (x12 & UINT32_C(0x1ffffff)); - uint32_t x15 = ((fiat_25519_uint1)(x12 >> 25) + (x3 & UINT32_C(0x3ffffff))); - uint32_t x16 = (x4 & UINT32_C(0x1ffffff)); - uint32_t x17 = (x5 & UINT32_C(0x3ffffff)); - uint32_t x18 = (x6 & UINT32_C(0x1ffffff)); - uint32_t x19 = (x7 & UINT32_C(0x3ffffff)); - uint32_t x20 = (x8 & UINT32_C(0x1ffffff)); - uint32_t x21 = (x9 & UINT32_C(0x3ffffff)); - uint32_t x22 = (x10 & UINT32_C(0x1ffffff)); - out1[0] = x13; - out1[1] = x14; - out1[2] = x15; - out1[3] = x16; - out1[4] = x17; - out1[5] = x18; - out1[6] = x19; - out1[7] = x20; - out1[8] = x21; - out1[9] = x22; -} - -/* - * The function fiat_25519_add adds two field elements. - * Postconditions: - * eval out1 mod m = (eval arg1 + eval arg2) mod m - * - * Input Bounds: - * arg1: [[0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333]] - * arg2: [[0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333]] - * Output Bounds: - * out1: [[0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999]] - */ -static void fiat_25519_add(uint32_t out1[10], const uint32_t arg1[10], const uint32_t arg2[10]) { - uint32_t x1 = ((arg1[0]) + (arg2[0])); - uint32_t x2 = ((arg1[1]) + (arg2[1])); - uint32_t x3 = ((arg1[2]) + (arg2[2])); - uint32_t x4 = ((arg1[3]) + (arg2[3])); - uint32_t x5 = ((arg1[4]) + (arg2[4])); - uint32_t x6 = ((arg1[5]) + (arg2[5])); - uint32_t x7 = ((arg1[6]) + (arg2[6])); - uint32_t x8 = ((arg1[7]) + (arg2[7])); - uint32_t x9 = ((arg1[8]) + (arg2[8])); - uint32_t x10 = ((arg1[9]) + (arg2[9])); - out1[0] = x1; - out1[1] = x2; - out1[2] = x3; - out1[3] = x4; - out1[4] = x5; - out1[5] = x6; - out1[6] = x7; - out1[7] = x8; - out1[8] = x9; - out1[9] = x10; -} - -/* - * The function fiat_25519_sub subtracts two field elements. - * Postconditions: - * eval out1 mod m = (eval arg1 - eval arg2) mod m - * - * Input Bounds: - * arg1: [[0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333]] - * arg2: [[0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333]] - * Output Bounds: - * out1: [[0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999]] - */ -static void fiat_25519_sub(uint32_t out1[10], const uint32_t arg1[10], const uint32_t arg2[10]) { - uint32_t x1 = ((UINT32_C(0x7ffffda) + (arg1[0])) - (arg2[0])); - uint32_t x2 = ((UINT32_C(0x3fffffe) + (arg1[1])) - (arg2[1])); - uint32_t x3 = ((UINT32_C(0x7fffffe) + (arg1[2])) - (arg2[2])); - uint32_t x4 = ((UINT32_C(0x3fffffe) + (arg1[3])) - (arg2[3])); - uint32_t x5 = ((UINT32_C(0x7fffffe) + (arg1[4])) - (arg2[4])); - uint32_t x6 = ((UINT32_C(0x3fffffe) + (arg1[5])) - (arg2[5])); - uint32_t x7 = ((UINT32_C(0x7fffffe) + (arg1[6])) - (arg2[6])); - uint32_t x8 = ((UINT32_C(0x3fffffe) + (arg1[7])) - (arg2[7])); - uint32_t x9 = ((UINT32_C(0x7fffffe) + (arg1[8])) - (arg2[8])); - uint32_t x10 = ((UINT32_C(0x3fffffe) + (arg1[9])) - (arg2[9])); - out1[0] = x1; - out1[1] = x2; - out1[2] = x3; - out1[3] = x4; - out1[4] = x5; - out1[5] = x6; - out1[6] = x7; - out1[7] = x8; - out1[8] = x9; - out1[9] = x10; -} - -/* - * The function fiat_25519_opp negates a field element. - * Postconditions: - * eval out1 mod m = -eval arg1 mod m - * - * Input Bounds: - * arg1: [[0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333]] - * Output Bounds: - * out1: [[0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999]] - */ -static void fiat_25519_opp(uint32_t out1[10], const uint32_t arg1[10]) { - uint32_t x1 = (UINT32_C(0x7ffffda) - (arg1[0])); - uint32_t x2 = (UINT32_C(0x3fffffe) - (arg1[1])); - uint32_t x3 = (UINT32_C(0x7fffffe) - (arg1[2])); - uint32_t x4 = (UINT32_C(0x3fffffe) - (arg1[3])); - uint32_t x5 = (UINT32_C(0x7fffffe) - (arg1[4])); - uint32_t x6 = (UINT32_C(0x3fffffe) - (arg1[5])); - uint32_t x7 = (UINT32_C(0x7fffffe) - (arg1[6])); - uint32_t x8 = (UINT32_C(0x3fffffe) - (arg1[7])); - uint32_t x9 = (UINT32_C(0x7fffffe) - (arg1[8])); - uint32_t x10 = (UINT32_C(0x3fffffe) - (arg1[9])); - out1[0] = x1; - out1[1] = x2; - out1[2] = x3; - out1[3] = x4; - out1[4] = x5; - out1[5] = x6; - out1[6] = x7; - out1[7] = x8; - out1[8] = x9; - out1[9] = x10; -} - -/* - * The function fiat_25519_selectznz is a multi-limb conditional select. - * Postconditions: - * eval out1 = (if arg1 = 0 then eval arg2 else eval arg3) - * - * Input Bounds: - * arg1: [0x0 ~> 0x1] - * arg2: [[0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff]] - * arg3: [[0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff]] - * Output Bounds: - * out1: [[0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff], [0x0 ~> 0xffffffff]] - */ -static void fiat_25519_selectznz(uint32_t out1[10], fiat_25519_uint1 arg1, const uint32_t arg2[10], const uint32_t arg3[10]) { - uint32_t x1; - fiat_25519_cmovznz_u32(&x1, arg1, (arg2[0]), (arg3[0])); - uint32_t x2; - fiat_25519_cmovznz_u32(&x2, arg1, (arg2[1]), (arg3[1])); - uint32_t x3; - fiat_25519_cmovznz_u32(&x3, arg1, (arg2[2]), (arg3[2])); - uint32_t x4; - fiat_25519_cmovznz_u32(&x4, arg1, (arg2[3]), (arg3[3])); - uint32_t x5; - fiat_25519_cmovznz_u32(&x5, arg1, (arg2[4]), (arg3[4])); - uint32_t x6; - fiat_25519_cmovznz_u32(&x6, arg1, (arg2[5]), (arg3[5])); - uint32_t x7; - fiat_25519_cmovznz_u32(&x7, arg1, (arg2[6]), (arg3[6])); - uint32_t x8; - fiat_25519_cmovznz_u32(&x8, arg1, (arg2[7]), (arg3[7])); - uint32_t x9; - fiat_25519_cmovznz_u32(&x9, arg1, (arg2[8]), (arg3[8])); - uint32_t x10; - fiat_25519_cmovznz_u32(&x10, arg1, (arg2[9]), (arg3[9])); - out1[0] = x1; - out1[1] = x2; - out1[2] = x3; - out1[3] = x4; - out1[4] = x5; - out1[5] = x6; - out1[6] = x7; - out1[7] = x8; - out1[8] = x9; - out1[9] = x10; -} - -/* - * The function fiat_25519_to_bytes serializes a field element to bytes in little-endian order. - * Postconditions: - * out1 = map (λ x, ⌊((eval arg1 mod m) mod 2^(8 * (x + 1))) / 2^(8 * x)⌋) [0..31] - * - * Input Bounds: - * arg1: [[0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333]] - * Output Bounds: - * out1: [[0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0x7f]] - */ -static void fiat_25519_to_bytes(uint8_t out1[32], const uint32_t arg1[10]) { - uint32_t x1; - fiat_25519_uint1 x2; - fiat_25519_subborrowx_u26(&x1, &x2, 0x0, (arg1[0]), UINT32_C(0x3ffffed)); - uint32_t x3; - fiat_25519_uint1 x4; - fiat_25519_subborrowx_u25(&x3, &x4, x2, (arg1[1]), UINT32_C(0x1ffffff)); - uint32_t x5; - fiat_25519_uint1 x6; - fiat_25519_subborrowx_u26(&x5, &x6, x4, (arg1[2]), UINT32_C(0x3ffffff)); - uint32_t x7; - fiat_25519_uint1 x8; - fiat_25519_subborrowx_u25(&x7, &x8, x6, (arg1[3]), UINT32_C(0x1ffffff)); - uint32_t x9; - fiat_25519_uint1 x10; - fiat_25519_subborrowx_u26(&x9, &x10, x8, (arg1[4]), UINT32_C(0x3ffffff)); - uint32_t x11; - fiat_25519_uint1 x12; - fiat_25519_subborrowx_u25(&x11, &x12, x10, (arg1[5]), UINT32_C(0x1ffffff)); - uint32_t x13; - fiat_25519_uint1 x14; - fiat_25519_subborrowx_u26(&x13, &x14, x12, (arg1[6]), UINT32_C(0x3ffffff)); - uint32_t x15; - fiat_25519_uint1 x16; - fiat_25519_subborrowx_u25(&x15, &x16, x14, (arg1[7]), UINT32_C(0x1ffffff)); - uint32_t x17; - fiat_25519_uint1 x18; - fiat_25519_subborrowx_u26(&x17, &x18, x16, (arg1[8]), UINT32_C(0x3ffffff)); - uint32_t x19; - fiat_25519_uint1 x20; - fiat_25519_subborrowx_u25(&x19, &x20, x18, (arg1[9]), UINT32_C(0x1ffffff)); - uint32_t x21; - fiat_25519_cmovznz_u32(&x21, x20, 0x0, UINT32_C(0xffffffff)); - uint32_t x22; - fiat_25519_uint1 x23; - fiat_25519_addcarryx_u26(&x22, &x23, 0x0, x1, (x21 & UINT32_C(0x3ffffed))); - uint32_t x24; - fiat_25519_uint1 x25; - fiat_25519_addcarryx_u25(&x24, &x25, x23, x3, (x21 & UINT32_C(0x1ffffff))); - uint32_t x26; - fiat_25519_uint1 x27; - fiat_25519_addcarryx_u26(&x26, &x27, x25, x5, (x21 & UINT32_C(0x3ffffff))); - uint32_t x28; - fiat_25519_uint1 x29; - fiat_25519_addcarryx_u25(&x28, &x29, x27, x7, (x21 & UINT32_C(0x1ffffff))); - uint32_t x30; - fiat_25519_uint1 x31; - fiat_25519_addcarryx_u26(&x30, &x31, x29, x9, (x21 & UINT32_C(0x3ffffff))); - uint32_t x32; - fiat_25519_uint1 x33; - fiat_25519_addcarryx_u25(&x32, &x33, x31, x11, (x21 & UINT32_C(0x1ffffff))); - uint32_t x34; - fiat_25519_uint1 x35; - fiat_25519_addcarryx_u26(&x34, &x35, x33, x13, (x21 & UINT32_C(0x3ffffff))); - uint32_t x36; - fiat_25519_uint1 x37; - fiat_25519_addcarryx_u25(&x36, &x37, x35, x15, (x21 & UINT32_C(0x1ffffff))); - uint32_t x38; - fiat_25519_uint1 x39; - fiat_25519_addcarryx_u26(&x38, &x39, x37, x17, (x21 & UINT32_C(0x3ffffff))); - uint32_t x40; - fiat_25519_uint1 x41; - fiat_25519_addcarryx_u25(&x40, &x41, x39, x19, (x21 & UINT32_C(0x1ffffff))); - uint32_t x42 = (x40 << 6); - uint32_t x43 = (x38 << 4); - uint32_t x44 = (x36 << 3); - uint32_t x45 = (x34 * (uint32_t)0x2); - uint32_t x46 = (x30 << 6); - uint32_t x47 = (x28 << 5); - uint32_t x48 = (x26 << 3); - uint32_t x49 = (x24 << 2); - uint32_t x50 = (x22 >> 8); - uint8_t x51 = (uint8_t)(x22 & UINT8_C(0xff)); - uint32_t x52 = (x50 >> 8); - uint8_t x53 = (uint8_t)(x50 & UINT8_C(0xff)); - uint8_t x54 = (uint8_t)(x52 >> 8); - uint8_t x55 = (uint8_t)(x52 & UINT8_C(0xff)); - uint32_t x56 = (x54 + x49); - uint32_t x57 = (x56 >> 8); - uint8_t x58 = (uint8_t)(x56 & UINT8_C(0xff)); - uint32_t x59 = (x57 >> 8); - uint8_t x60 = (uint8_t)(x57 & UINT8_C(0xff)); - uint8_t x61 = (uint8_t)(x59 >> 8); - uint8_t x62 = (uint8_t)(x59 & UINT8_C(0xff)); - uint32_t x63 = (x61 + x48); - uint32_t x64 = (x63 >> 8); - uint8_t x65 = (uint8_t)(x63 & UINT8_C(0xff)); - uint32_t x66 = (x64 >> 8); - uint8_t x67 = (uint8_t)(x64 & UINT8_C(0xff)); - uint8_t x68 = (uint8_t)(x66 >> 8); - uint8_t x69 = (uint8_t)(x66 & UINT8_C(0xff)); - uint32_t x70 = (x68 + x47); - uint32_t x71 = (x70 >> 8); - uint8_t x72 = (uint8_t)(x70 & UINT8_C(0xff)); - uint32_t x73 = (x71 >> 8); - uint8_t x74 = (uint8_t)(x71 & UINT8_C(0xff)); - uint8_t x75 = (uint8_t)(x73 >> 8); - uint8_t x76 = (uint8_t)(x73 & UINT8_C(0xff)); - uint32_t x77 = (x75 + x46); - uint32_t x78 = (x77 >> 8); - uint8_t x79 = (uint8_t)(x77 & UINT8_C(0xff)); - uint32_t x80 = (x78 >> 8); - uint8_t x81 = (uint8_t)(x78 & UINT8_C(0xff)); - uint8_t x82 = (uint8_t)(x80 >> 8); - uint8_t x83 = (uint8_t)(x80 & UINT8_C(0xff)); - uint8_t x84 = (uint8_t)(x82 & UINT8_C(0xff)); - uint32_t x85 = (x32 >> 8); - uint8_t x86 = (uint8_t)(x32 & UINT8_C(0xff)); - uint32_t x87 = (x85 >> 8); - uint8_t x88 = (uint8_t)(x85 & UINT8_C(0xff)); - fiat_25519_uint1 x89 = (fiat_25519_uint1)(x87 >> 8); - uint8_t x90 = (uint8_t)(x87 & UINT8_C(0xff)); - uint32_t x91 = (x89 + x45); - uint32_t x92 = (x91 >> 8); - uint8_t x93 = (uint8_t)(x91 & UINT8_C(0xff)); - uint32_t x94 = (x92 >> 8); - uint8_t x95 = (uint8_t)(x92 & UINT8_C(0xff)); - uint8_t x96 = (uint8_t)(x94 >> 8); - uint8_t x97 = (uint8_t)(x94 & UINT8_C(0xff)); - uint32_t x98 = (x96 + x44); - uint32_t x99 = (x98 >> 8); - uint8_t x100 = (uint8_t)(x98 & UINT8_C(0xff)); - uint32_t x101 = (x99 >> 8); - uint8_t x102 = (uint8_t)(x99 & UINT8_C(0xff)); - uint8_t x103 = (uint8_t)(x101 >> 8); - uint8_t x104 = (uint8_t)(x101 & UINT8_C(0xff)); - uint32_t x105 = (x103 + x43); - uint32_t x106 = (x105 >> 8); - uint8_t x107 = (uint8_t)(x105 & UINT8_C(0xff)); - uint32_t x108 = (x106 >> 8); - uint8_t x109 = (uint8_t)(x106 & UINT8_C(0xff)); - uint8_t x110 = (uint8_t)(x108 >> 8); - uint8_t x111 = (uint8_t)(x108 & UINT8_C(0xff)); - uint32_t x112 = (x110 + x42); - uint32_t x113 = (x112 >> 8); - uint8_t x114 = (uint8_t)(x112 & UINT8_C(0xff)); - uint32_t x115 = (x113 >> 8); - uint8_t x116 = (uint8_t)(x113 & UINT8_C(0xff)); - uint8_t x117 = (uint8_t)(x115 >> 8); - uint8_t x118 = (uint8_t)(x115 & UINT8_C(0xff)); - out1[0] = x51; - out1[1] = x53; - out1[2] = x55; - out1[3] = x58; - out1[4] = x60; - out1[5] = x62; - out1[6] = x65; - out1[7] = x67; - out1[8] = x69; - out1[9] = x72; - out1[10] = x74; - out1[11] = x76; - out1[12] = x79; - out1[13] = x81; - out1[14] = x83; - out1[15] = x84; - out1[16] = x86; - out1[17] = x88; - out1[18] = x90; - out1[19] = x93; - out1[20] = x95; - out1[21] = x97; - out1[22] = x100; - out1[23] = x102; - out1[24] = x104; - out1[25] = x107; - out1[26] = x109; - out1[27] = x111; - out1[28] = x114; - out1[29] = x116; - out1[30] = x118; - out1[31] = x117; -} - -/* - * The function fiat_25519_from_bytes deserializes a field element from bytes in little-endian order. - * Postconditions: - * eval out1 mod m = bytes_eval arg1 mod m - * - * Input Bounds: - * arg1: [[0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0x7f]] - * Output Bounds: - * out1: [[0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333]] - */ -static void fiat_25519_from_bytes(uint32_t out1[10], const uint8_t arg1[32]) { - uint32_t x1 = ((uint32_t)(arg1[31]) << 18); - uint32_t x2 = ((uint32_t)(arg1[30]) << 10); - uint32_t x3 = ((uint32_t)(arg1[29]) << 2); - uint32_t x4 = ((uint32_t)(arg1[28]) << 20); - uint32_t x5 = ((uint32_t)(arg1[27]) << 12); - uint32_t x6 = ((uint32_t)(arg1[26]) << 4); - uint32_t x7 = ((uint32_t)(arg1[25]) << 21); - uint32_t x8 = ((uint32_t)(arg1[24]) << 13); - uint32_t x9 = ((uint32_t)(arg1[23]) << 5); - uint32_t x10 = ((uint32_t)(arg1[22]) << 23); - uint32_t x11 = ((uint32_t)(arg1[21]) << 15); - uint32_t x12 = ((uint32_t)(arg1[20]) << 7); - uint32_t x13 = ((uint32_t)(arg1[19]) << 24); - uint32_t x14 = ((uint32_t)(arg1[18]) << 16); - uint32_t x15 = ((uint32_t)(arg1[17]) << 8); - uint8_t x16 = (arg1[16]); - uint32_t x17 = ((uint32_t)(arg1[15]) << 18); - uint32_t x18 = ((uint32_t)(arg1[14]) << 10); - uint32_t x19 = ((uint32_t)(arg1[13]) << 2); - uint32_t x20 = ((uint32_t)(arg1[12]) << 19); - uint32_t x21 = ((uint32_t)(arg1[11]) << 11); - uint32_t x22 = ((uint32_t)(arg1[10]) << 3); - uint32_t x23 = ((uint32_t)(arg1[9]) << 21); - uint32_t x24 = ((uint32_t)(arg1[8]) << 13); - uint32_t x25 = ((uint32_t)(arg1[7]) << 5); - uint32_t x26 = ((uint32_t)(arg1[6]) << 22); - uint32_t x27 = ((uint32_t)(arg1[5]) << 14); - uint32_t x28 = ((uint32_t)(arg1[4]) << 6); - uint32_t x29 = ((uint32_t)(arg1[3]) << 24); - uint32_t x30 = ((uint32_t)(arg1[2]) << 16); - uint32_t x31 = ((uint32_t)(arg1[1]) << 8); - uint8_t x32 = (arg1[0]); - uint32_t x33 = (x32 + (x31 + (x30 + x29))); - uint8_t x34 = (uint8_t)(x33 >> 26); - uint32_t x35 = (x33 & UINT32_C(0x3ffffff)); - uint32_t x36 = (x3 + (x2 + x1)); - uint32_t x37 = (x6 + (x5 + x4)); - uint32_t x38 = (x9 + (x8 + x7)); - uint32_t x39 = (x12 + (x11 + x10)); - uint32_t x40 = (x16 + (x15 + (x14 + x13))); - uint32_t x41 = (x19 + (x18 + x17)); - uint32_t x42 = (x22 + (x21 + x20)); - uint32_t x43 = (x25 + (x24 + x23)); - uint32_t x44 = (x28 + (x27 + x26)); - uint32_t x45 = (x34 + x44); - uint8_t x46 = (uint8_t)(x45 >> 25); - uint32_t x47 = (x45 & UINT32_C(0x1ffffff)); - uint32_t x48 = (x46 + x43); - uint8_t x49 = (uint8_t)(x48 >> 26); - uint32_t x50 = (x48 & UINT32_C(0x3ffffff)); - uint32_t x51 = (x49 + x42); - uint8_t x52 = (uint8_t)(x51 >> 25); - uint32_t x53 = (x51 & UINT32_C(0x1ffffff)); - uint32_t x54 = (x52 + x41); - uint32_t x55 = (x54 & UINT32_C(0x3ffffff)); - uint8_t x56 = (uint8_t)(x40 >> 25); - uint32_t x57 = (x40 & UINT32_C(0x1ffffff)); - uint32_t x58 = (x56 + x39); - uint8_t x59 = (uint8_t)(x58 >> 26); - uint32_t x60 = (x58 & UINT32_C(0x3ffffff)); - uint32_t x61 = (x59 + x38); - uint8_t x62 = (uint8_t)(x61 >> 25); - uint32_t x63 = (x61 & UINT32_C(0x1ffffff)); - uint32_t x64 = (x62 + x37); - uint8_t x65 = (uint8_t)(x64 >> 26); - uint32_t x66 = (x64 & UINT32_C(0x3ffffff)); - uint32_t x67 = (x65 + x36); - out1[0] = x35; - out1[1] = x47; - out1[2] = x50; - out1[3] = x53; - out1[4] = x55; - out1[5] = x57; - out1[6] = x60; - out1[7] = x63; - out1[8] = x66; - out1[9] = x67; -} - -/* - * The function fiat_25519_carry_scmul_121666 multiplies a field element by 121666 and reduces the result. - * Postconditions: - * eval out1 mod m = (121666 * eval arg1) mod m - * - * Input Bounds: - * arg1: [[0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999], [0x0 ~> 0xd333332], [0x0 ~> 0x6999999]] - * Output Bounds: - * out1: [[0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333], [0x0 ~> 0x4666666], [0x0 ~> 0x2333333]] - */ -static void fiat_25519_carry_scmul_121666(uint32_t out1[10], const uint32_t arg1[10]) { - uint64_t x1 = ((uint64_t)UINT32_C(0x1db42) * (arg1[9])); - uint64_t x2 = ((uint64_t)UINT32_C(0x1db42) * (arg1[8])); - uint64_t x3 = ((uint64_t)UINT32_C(0x1db42) * (arg1[7])); - uint64_t x4 = ((uint64_t)UINT32_C(0x1db42) * (arg1[6])); - uint64_t x5 = ((uint64_t)UINT32_C(0x1db42) * (arg1[5])); - uint64_t x6 = ((uint64_t)UINT32_C(0x1db42) * (arg1[4])); - uint64_t x7 = ((uint64_t)UINT32_C(0x1db42) * (arg1[3])); - uint64_t x8 = ((uint64_t)UINT32_C(0x1db42) * (arg1[2])); - uint64_t x9 = ((uint64_t)UINT32_C(0x1db42) * (arg1[1])); - uint64_t x10 = ((uint64_t)UINT32_C(0x1db42) * (arg1[0])); - uint32_t x11 = (uint32_t)(x10 >> 26); - uint32_t x12 = (uint32_t)(x10 & UINT32_C(0x3ffffff)); - uint64_t x13 = (x11 + x9); - uint32_t x14 = (uint32_t)(x13 >> 25); - uint32_t x15 = (uint32_t)(x13 & UINT32_C(0x1ffffff)); - uint64_t x16 = (x14 + x8); - uint32_t x17 = (uint32_t)(x16 >> 26); - uint32_t x18 = (uint32_t)(x16 & UINT32_C(0x3ffffff)); - uint64_t x19 = (x17 + x7); - uint32_t x20 = (uint32_t)(x19 >> 25); - uint32_t x21 = (uint32_t)(x19 & UINT32_C(0x1ffffff)); - uint64_t x22 = (x20 + x6); - uint32_t x23 = (uint32_t)(x22 >> 26); - uint32_t x24 = (uint32_t)(x22 & UINT32_C(0x3ffffff)); - uint64_t x25 = (x23 + x5); - uint32_t x26 = (uint32_t)(x25 >> 25); - uint32_t x27 = (uint32_t)(x25 & UINT32_C(0x1ffffff)); - uint64_t x28 = (x26 + x4); - uint32_t x29 = (uint32_t)(x28 >> 26); - uint32_t x30 = (uint32_t)(x28 & UINT32_C(0x3ffffff)); - uint64_t x31 = (x29 + x3); - uint32_t x32 = (uint32_t)(x31 >> 25); - uint32_t x33 = (uint32_t)(x31 & UINT32_C(0x1ffffff)); - uint64_t x34 = (x32 + x2); - uint32_t x35 = (uint32_t)(x34 >> 26); - uint32_t x36 = (uint32_t)(x34 & UINT32_C(0x3ffffff)); - uint64_t x37 = (x35 + x1); - uint32_t x38 = (uint32_t)(x37 >> 25); - uint32_t x39 = (uint32_t)(x37 & UINT32_C(0x1ffffff)); - uint32_t x40 = (x38 * UINT8_C(0x13)); - uint32_t x41 = (x12 + x40); - fiat_25519_uint1 x42 = (fiat_25519_uint1)(x41 >> 26); - uint32_t x43 = (x41 & UINT32_C(0x3ffffff)); - uint32_t x44 = (x42 + x15); - fiat_25519_uint1 x45 = (fiat_25519_uint1)(x44 >> 25); - uint32_t x46 = (x44 & UINT32_C(0x1ffffff)); - uint32_t x47 = (x45 + x18); - out1[0] = x43; - out1[1] = x46; - out1[2] = x47; - out1[3] = x21; - out1[4] = x24; - out1[5] = x27; - out1[6] = x30; - out1[7] = x33; - out1[8] = x36; - out1[9] = x39; -} - diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/third_party/fiat/curve25519_64.h temporalio-1.3.0/vendor/ring-0.16.20/third_party/fiat/curve25519_64.h --- temporalio-1.3.0/vendor/ring-0.16.20/third_party/fiat/curve25519_64.h 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/third_party/fiat/curve25519_64.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,619 +0,0 @@ -/* Autogenerated: src/ExtractionOCaml/unsaturated_solinas --static 25519 5 '2^255 - 19' 64 carry_mul carry_square carry add sub opp selectznz to_bytes from_bytes carry_scmul121666 */ -/* curve description: 25519 */ -/* requested operations: carry_mul, carry_square, carry, add, sub, opp, selectznz, to_bytes, from_bytes, carry_scmul121666 */ -/* n = 5 (from "5") */ -/* s-c = 2^255 - [(1, 19)] (from "2^255 - 19") */ -/* machine_wordsize = 64 (from "64") */ - -/* Computed values: */ -/* carry_chain = [0, 1, 2, 3, 4, 0, 1] */ - -#include -typedef unsigned char fiat_25519_uint1; -typedef signed char fiat_25519_int1; -typedef signed __int128 fiat_25519_int128; -typedef unsigned __int128 fiat_25519_uint128; - -#if (-1 & 3) != 3 -#error "This code only works on a two's complement system" -#endif - - -/* - * The function fiat_25519_addcarryx_u51 is an addition with carry. - * Postconditions: - * out1 = (arg1 + arg2 + arg3) mod 2^51 - * out2 = ⌊(arg1 + arg2 + arg3) / 2^51⌋ - * - * Input Bounds: - * arg1: [0x0 ~> 0x1] - * arg2: [0x0 ~> 0x7ffffffffffff] - * arg3: [0x0 ~> 0x7ffffffffffff] - * Output Bounds: - * out1: [0x0 ~> 0x7ffffffffffff] - * out2: [0x0 ~> 0x1] - */ -static void fiat_25519_addcarryx_u51(uint64_t* out1, fiat_25519_uint1* out2, fiat_25519_uint1 arg1, uint64_t arg2, uint64_t arg3) { - uint64_t x1 = ((arg1 + arg2) + arg3); - uint64_t x2 = (x1 & UINT64_C(0x7ffffffffffff)); - fiat_25519_uint1 x3 = (fiat_25519_uint1)(x1 >> 51); - *out1 = x2; - *out2 = x3; -} - -/* - * The function fiat_25519_subborrowx_u51 is a subtraction with borrow. - * Postconditions: - * out1 = (-arg1 + arg2 + -arg3) mod 2^51 - * out2 = -⌊(-arg1 + arg2 + -arg3) / 2^51⌋ - * - * Input Bounds: - * arg1: [0x0 ~> 0x1] - * arg2: [0x0 ~> 0x7ffffffffffff] - * arg3: [0x0 ~> 0x7ffffffffffff] - * Output Bounds: - * out1: [0x0 ~> 0x7ffffffffffff] - * out2: [0x0 ~> 0x1] - */ -static void fiat_25519_subborrowx_u51(uint64_t* out1, fiat_25519_uint1* out2, fiat_25519_uint1 arg1, uint64_t arg2, uint64_t arg3) { - int64_t x1 = ((int64_t)(arg2 - (int64_t)arg1) - (int64_t)arg3); - fiat_25519_int1 x2 = (fiat_25519_int1)(x1 >> 51); - uint64_t x3 = (x1 & UINT64_C(0x7ffffffffffff)); - *out1 = x3; - *out2 = (fiat_25519_uint1)(0x0 - x2); -} - -/* - * The function fiat_25519_cmovznz_u64 is a single-word conditional move. - * Postconditions: - * out1 = (if arg1 = 0 then arg2 else arg3) - * - * Input Bounds: - * arg1: [0x0 ~> 0x1] - * arg2: [0x0 ~> 0xffffffffffffffff] - * arg3: [0x0 ~> 0xffffffffffffffff] - * Output Bounds: - * out1: [0x0 ~> 0xffffffffffffffff] - */ -static void fiat_25519_cmovznz_u64(uint64_t* out1, fiat_25519_uint1 arg1, uint64_t arg2, uint64_t arg3) { - fiat_25519_uint1 x1 = (!(!arg1)); - uint64_t x2 = ((fiat_25519_int1)(0x0 - x1) & UINT64_C(0xffffffffffffffff)); - // Note this line has been patched from the synthesized code to add value - // barriers. - // - // Clang recognizes this pattern as a select. While it usually transforms it - // to a cmov, it sometimes further transforms it into a branch, which we do - // not want. - uint64_t x3 = ((value_barrier_u64(x2) & arg3) | (value_barrier_u64(~x2) & arg2)); - *out1 = x3; -} - -/* - * The function fiat_25519_carry_mul multiplies two field elements and reduces the result. - * Postconditions: - * eval out1 mod m = (eval arg1 * eval arg2) mod m - * - * Input Bounds: - * arg1: [[0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664]] - * arg2: [[0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664]] - * Output Bounds: - * out1: [[0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc]] - */ -static void fiat_25519_carry_mul(uint64_t out1[5], const uint64_t arg1[5], const uint64_t arg2[5]) { - fiat_25519_uint128 x1 = ((fiat_25519_uint128)(arg1[4]) * ((arg2[4]) * UINT8_C(0x13))); - fiat_25519_uint128 x2 = ((fiat_25519_uint128)(arg1[4]) * ((arg2[3]) * UINT8_C(0x13))); - fiat_25519_uint128 x3 = ((fiat_25519_uint128)(arg1[4]) * ((arg2[2]) * UINT8_C(0x13))); - fiat_25519_uint128 x4 = ((fiat_25519_uint128)(arg1[4]) * ((arg2[1]) * UINT8_C(0x13))); - fiat_25519_uint128 x5 = ((fiat_25519_uint128)(arg1[3]) * ((arg2[4]) * UINT8_C(0x13))); - fiat_25519_uint128 x6 = ((fiat_25519_uint128)(arg1[3]) * ((arg2[3]) * UINT8_C(0x13))); - fiat_25519_uint128 x7 = ((fiat_25519_uint128)(arg1[3]) * ((arg2[2]) * UINT8_C(0x13))); - fiat_25519_uint128 x8 = ((fiat_25519_uint128)(arg1[2]) * ((arg2[4]) * UINT8_C(0x13))); - fiat_25519_uint128 x9 = ((fiat_25519_uint128)(arg1[2]) * ((arg2[3]) * UINT8_C(0x13))); - fiat_25519_uint128 x10 = ((fiat_25519_uint128)(arg1[1]) * ((arg2[4]) * UINT8_C(0x13))); - fiat_25519_uint128 x11 = ((fiat_25519_uint128)(arg1[4]) * (arg2[0])); - fiat_25519_uint128 x12 = ((fiat_25519_uint128)(arg1[3]) * (arg2[1])); - fiat_25519_uint128 x13 = ((fiat_25519_uint128)(arg1[3]) * (arg2[0])); - fiat_25519_uint128 x14 = ((fiat_25519_uint128)(arg1[2]) * (arg2[2])); - fiat_25519_uint128 x15 = ((fiat_25519_uint128)(arg1[2]) * (arg2[1])); - fiat_25519_uint128 x16 = ((fiat_25519_uint128)(arg1[2]) * (arg2[0])); - fiat_25519_uint128 x17 = ((fiat_25519_uint128)(arg1[1]) * (arg2[3])); - fiat_25519_uint128 x18 = ((fiat_25519_uint128)(arg1[1]) * (arg2[2])); - fiat_25519_uint128 x19 = ((fiat_25519_uint128)(arg1[1]) * (arg2[1])); - fiat_25519_uint128 x20 = ((fiat_25519_uint128)(arg1[1]) * (arg2[0])); - fiat_25519_uint128 x21 = ((fiat_25519_uint128)(arg1[0]) * (arg2[4])); - fiat_25519_uint128 x22 = ((fiat_25519_uint128)(arg1[0]) * (arg2[3])); - fiat_25519_uint128 x23 = ((fiat_25519_uint128)(arg1[0]) * (arg2[2])); - fiat_25519_uint128 x24 = ((fiat_25519_uint128)(arg1[0]) * (arg2[1])); - fiat_25519_uint128 x25 = ((fiat_25519_uint128)(arg1[0]) * (arg2[0])); - fiat_25519_uint128 x26 = (x25 + (x10 + (x9 + (x7 + x4)))); - uint64_t x27 = (uint64_t)(x26 >> 51); - uint64_t x28 = (uint64_t)(x26 & UINT64_C(0x7ffffffffffff)); - fiat_25519_uint128 x29 = (x21 + (x17 + (x14 + (x12 + x11)))); - fiat_25519_uint128 x30 = (x22 + (x18 + (x15 + (x13 + x1)))); - fiat_25519_uint128 x31 = (x23 + (x19 + (x16 + (x5 + x2)))); - fiat_25519_uint128 x32 = (x24 + (x20 + (x8 + (x6 + x3)))); - fiat_25519_uint128 x33 = (x27 + x32); - uint64_t x34 = (uint64_t)(x33 >> 51); - uint64_t x35 = (uint64_t)(x33 & UINT64_C(0x7ffffffffffff)); - fiat_25519_uint128 x36 = (x34 + x31); - uint64_t x37 = (uint64_t)(x36 >> 51); - uint64_t x38 = (uint64_t)(x36 & UINT64_C(0x7ffffffffffff)); - fiat_25519_uint128 x39 = (x37 + x30); - uint64_t x40 = (uint64_t)(x39 >> 51); - uint64_t x41 = (uint64_t)(x39 & UINT64_C(0x7ffffffffffff)); - fiat_25519_uint128 x42 = (x40 + x29); - uint64_t x43 = (uint64_t)(x42 >> 51); - uint64_t x44 = (uint64_t)(x42 & UINT64_C(0x7ffffffffffff)); - uint64_t x45 = (x43 * UINT8_C(0x13)); - uint64_t x46 = (x28 + x45); - uint64_t x47 = (x46 >> 51); - uint64_t x48 = (x46 & UINT64_C(0x7ffffffffffff)); - uint64_t x49 = (x47 + x35); - fiat_25519_uint1 x50 = (fiat_25519_uint1)(x49 >> 51); - uint64_t x51 = (x49 & UINT64_C(0x7ffffffffffff)); - uint64_t x52 = (x50 + x38); - out1[0] = x48; - out1[1] = x51; - out1[2] = x52; - out1[3] = x41; - out1[4] = x44; -} - -/* - * The function fiat_25519_carry_square squares a field element and reduces the result. - * Postconditions: - * eval out1 mod m = (eval arg1 * eval arg1) mod m - * - * Input Bounds: - * arg1: [[0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664]] - * Output Bounds: - * out1: [[0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc]] - */ -static void fiat_25519_carry_square(uint64_t out1[5], const uint64_t arg1[5]) { - uint64_t x1 = ((arg1[4]) * UINT8_C(0x13)); - uint64_t x2 = (x1 * 0x2); - uint64_t x3 = ((arg1[4]) * 0x2); - uint64_t x4 = ((arg1[3]) * UINT8_C(0x13)); - uint64_t x5 = (x4 * 0x2); - uint64_t x6 = ((arg1[3]) * 0x2); - uint64_t x7 = ((arg1[2]) * 0x2); - uint64_t x8 = ((arg1[1]) * 0x2); - fiat_25519_uint128 x9 = ((fiat_25519_uint128)(arg1[4]) * x1); - fiat_25519_uint128 x10 = ((fiat_25519_uint128)(arg1[3]) * x2); - fiat_25519_uint128 x11 = ((fiat_25519_uint128)(arg1[3]) * x4); - fiat_25519_uint128 x12 = ((fiat_25519_uint128)(arg1[2]) * x2); - fiat_25519_uint128 x13 = ((fiat_25519_uint128)(arg1[2]) * x5); - fiat_25519_uint128 x14 = ((fiat_25519_uint128)(arg1[2]) * (arg1[2])); - fiat_25519_uint128 x15 = ((fiat_25519_uint128)(arg1[1]) * x2); - fiat_25519_uint128 x16 = ((fiat_25519_uint128)(arg1[1]) * x6); - fiat_25519_uint128 x17 = ((fiat_25519_uint128)(arg1[1]) * x7); - fiat_25519_uint128 x18 = ((fiat_25519_uint128)(arg1[1]) * (arg1[1])); - fiat_25519_uint128 x19 = ((fiat_25519_uint128)(arg1[0]) * x3); - fiat_25519_uint128 x20 = ((fiat_25519_uint128)(arg1[0]) * x6); - fiat_25519_uint128 x21 = ((fiat_25519_uint128)(arg1[0]) * x7); - fiat_25519_uint128 x22 = ((fiat_25519_uint128)(arg1[0]) * x8); - fiat_25519_uint128 x23 = ((fiat_25519_uint128)(arg1[0]) * (arg1[0])); - fiat_25519_uint128 x24 = (x23 + (x15 + x13)); - uint64_t x25 = (uint64_t)(x24 >> 51); - uint64_t x26 = (uint64_t)(x24 & UINT64_C(0x7ffffffffffff)); - fiat_25519_uint128 x27 = (x19 + (x16 + x14)); - fiat_25519_uint128 x28 = (x20 + (x17 + x9)); - fiat_25519_uint128 x29 = (x21 + (x18 + x10)); - fiat_25519_uint128 x30 = (x22 + (x12 + x11)); - fiat_25519_uint128 x31 = (x25 + x30); - uint64_t x32 = (uint64_t)(x31 >> 51); - uint64_t x33 = (uint64_t)(x31 & UINT64_C(0x7ffffffffffff)); - fiat_25519_uint128 x34 = (x32 + x29); - uint64_t x35 = (uint64_t)(x34 >> 51); - uint64_t x36 = (uint64_t)(x34 & UINT64_C(0x7ffffffffffff)); - fiat_25519_uint128 x37 = (x35 + x28); - uint64_t x38 = (uint64_t)(x37 >> 51); - uint64_t x39 = (uint64_t)(x37 & UINT64_C(0x7ffffffffffff)); - fiat_25519_uint128 x40 = (x38 + x27); - uint64_t x41 = (uint64_t)(x40 >> 51); - uint64_t x42 = (uint64_t)(x40 & UINT64_C(0x7ffffffffffff)); - uint64_t x43 = (x41 * UINT8_C(0x13)); - uint64_t x44 = (x26 + x43); - uint64_t x45 = (x44 >> 51); - uint64_t x46 = (x44 & UINT64_C(0x7ffffffffffff)); - uint64_t x47 = (x45 + x33); - fiat_25519_uint1 x48 = (fiat_25519_uint1)(x47 >> 51); - uint64_t x49 = (x47 & UINT64_C(0x7ffffffffffff)); - uint64_t x50 = (x48 + x36); - out1[0] = x46; - out1[1] = x49; - out1[2] = x50; - out1[3] = x39; - out1[4] = x42; -} - -/* - * The function fiat_25519_carry reduces a field element. - * Postconditions: - * eval out1 mod m = eval arg1 mod m - * - * Input Bounds: - * arg1: [[0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664]] - * Output Bounds: - * out1: [[0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc]] - */ -static void fiat_25519_carry(uint64_t out1[5], const uint64_t arg1[5]) { - uint64_t x1 = (arg1[0]); - uint64_t x2 = ((x1 >> 51) + (arg1[1])); - uint64_t x3 = ((x2 >> 51) + (arg1[2])); - uint64_t x4 = ((x3 >> 51) + (arg1[3])); - uint64_t x5 = ((x4 >> 51) + (arg1[4])); - uint64_t x6 = ((x1 & UINT64_C(0x7ffffffffffff)) + ((x5 >> 51) * UINT8_C(0x13))); - uint64_t x7 = ((fiat_25519_uint1)(x6 >> 51) + (x2 & UINT64_C(0x7ffffffffffff))); - uint64_t x8 = (x6 & UINT64_C(0x7ffffffffffff)); - uint64_t x9 = (x7 & UINT64_C(0x7ffffffffffff)); - uint64_t x10 = ((fiat_25519_uint1)(x7 >> 51) + (x3 & UINT64_C(0x7ffffffffffff))); - uint64_t x11 = (x4 & UINT64_C(0x7ffffffffffff)); - uint64_t x12 = (x5 & UINT64_C(0x7ffffffffffff)); - out1[0] = x8; - out1[1] = x9; - out1[2] = x10; - out1[3] = x11; - out1[4] = x12; -} - -/* - * The function fiat_25519_add adds two field elements. - * Postconditions: - * eval out1 mod m = (eval arg1 + eval arg2) mod m - * - * Input Bounds: - * arg1: [[0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc]] - * arg2: [[0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc]] - * Output Bounds: - * out1: [[0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664]] - */ -static void fiat_25519_add(uint64_t out1[5], const uint64_t arg1[5], const uint64_t arg2[5]) { - uint64_t x1 = ((arg1[0]) + (arg2[0])); - uint64_t x2 = ((arg1[1]) + (arg2[1])); - uint64_t x3 = ((arg1[2]) + (arg2[2])); - uint64_t x4 = ((arg1[3]) + (arg2[3])); - uint64_t x5 = ((arg1[4]) + (arg2[4])); - out1[0] = x1; - out1[1] = x2; - out1[2] = x3; - out1[3] = x4; - out1[4] = x5; -} - -/* - * The function fiat_25519_sub subtracts two field elements. - * Postconditions: - * eval out1 mod m = (eval arg1 - eval arg2) mod m - * - * Input Bounds: - * arg1: [[0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc]] - * arg2: [[0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc]] - * Output Bounds: - * out1: [[0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664]] - */ -static void fiat_25519_sub(uint64_t out1[5], const uint64_t arg1[5], const uint64_t arg2[5]) { - uint64_t x1 = ((UINT64_C(0xfffffffffffda) + (arg1[0])) - (arg2[0])); - uint64_t x2 = ((UINT64_C(0xffffffffffffe) + (arg1[1])) - (arg2[1])); - uint64_t x3 = ((UINT64_C(0xffffffffffffe) + (arg1[2])) - (arg2[2])); - uint64_t x4 = ((UINT64_C(0xffffffffffffe) + (arg1[3])) - (arg2[3])); - uint64_t x5 = ((UINT64_C(0xffffffffffffe) + (arg1[4])) - (arg2[4])); - out1[0] = x1; - out1[1] = x2; - out1[2] = x3; - out1[3] = x4; - out1[4] = x5; -} - -/* - * The function fiat_25519_opp negates a field element. - * Postconditions: - * eval out1 mod m = -eval arg1 mod m - * - * Input Bounds: - * arg1: [[0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc]] - * Output Bounds: - * out1: [[0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664]] - */ -static void fiat_25519_opp(uint64_t out1[5], const uint64_t arg1[5]) { - uint64_t x1 = (UINT64_C(0xfffffffffffda) - (arg1[0])); - uint64_t x2 = (UINT64_C(0xffffffffffffe) - (arg1[1])); - uint64_t x3 = (UINT64_C(0xffffffffffffe) - (arg1[2])); - uint64_t x4 = (UINT64_C(0xffffffffffffe) - (arg1[3])); - uint64_t x5 = (UINT64_C(0xffffffffffffe) - (arg1[4])); - out1[0] = x1; - out1[1] = x2; - out1[2] = x3; - out1[3] = x4; - out1[4] = x5; -} - -/* - * The function fiat_25519_selectznz is a multi-limb conditional select. - * Postconditions: - * eval out1 = (if arg1 = 0 then eval arg2 else eval arg3) - * - * Input Bounds: - * arg1: [0x0 ~> 0x1] - * arg2: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] - * arg3: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] - * Output Bounds: - * out1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] - */ -static void fiat_25519_selectznz(uint64_t out1[5], fiat_25519_uint1 arg1, const uint64_t arg2[5], const uint64_t arg3[5]) { - uint64_t x1; - fiat_25519_cmovznz_u64(&x1, arg1, (arg2[0]), (arg3[0])); - uint64_t x2; - fiat_25519_cmovznz_u64(&x2, arg1, (arg2[1]), (arg3[1])); - uint64_t x3; - fiat_25519_cmovznz_u64(&x3, arg1, (arg2[2]), (arg3[2])); - uint64_t x4; - fiat_25519_cmovznz_u64(&x4, arg1, (arg2[3]), (arg3[3])); - uint64_t x5; - fiat_25519_cmovznz_u64(&x5, arg1, (arg2[4]), (arg3[4])); - out1[0] = x1; - out1[1] = x2; - out1[2] = x3; - out1[3] = x4; - out1[4] = x5; -} - -/* - * The function fiat_25519_to_bytes serializes a field element to bytes in little-endian order. - * Postconditions: - * out1 = map (λ x, ⌊((eval arg1 mod m) mod 2^(8 * (x + 1))) / 2^(8 * x)⌋) [0..31] - * - * Input Bounds: - * arg1: [[0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc]] - * Output Bounds: - * out1: [[0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0x7f]] - */ -static void fiat_25519_to_bytes(uint8_t out1[32], const uint64_t arg1[5]) { - uint64_t x1; - fiat_25519_uint1 x2; - fiat_25519_subborrowx_u51(&x1, &x2, 0x0, (arg1[0]), UINT64_C(0x7ffffffffffed)); - uint64_t x3; - fiat_25519_uint1 x4; - fiat_25519_subborrowx_u51(&x3, &x4, x2, (arg1[1]), UINT64_C(0x7ffffffffffff)); - uint64_t x5; - fiat_25519_uint1 x6; - fiat_25519_subborrowx_u51(&x5, &x6, x4, (arg1[2]), UINT64_C(0x7ffffffffffff)); - uint64_t x7; - fiat_25519_uint1 x8; - fiat_25519_subborrowx_u51(&x7, &x8, x6, (arg1[3]), UINT64_C(0x7ffffffffffff)); - uint64_t x9; - fiat_25519_uint1 x10; - fiat_25519_subborrowx_u51(&x9, &x10, x8, (arg1[4]), UINT64_C(0x7ffffffffffff)); - uint64_t x11; - fiat_25519_cmovznz_u64(&x11, x10, 0x0, UINT64_C(0xffffffffffffffff)); - uint64_t x12; - fiat_25519_uint1 x13; - fiat_25519_addcarryx_u51(&x12, &x13, 0x0, x1, (x11 & UINT64_C(0x7ffffffffffed))); - uint64_t x14; - fiat_25519_uint1 x15; - fiat_25519_addcarryx_u51(&x14, &x15, x13, x3, (x11 & UINT64_C(0x7ffffffffffff))); - uint64_t x16; - fiat_25519_uint1 x17; - fiat_25519_addcarryx_u51(&x16, &x17, x15, x5, (x11 & UINT64_C(0x7ffffffffffff))); - uint64_t x18; - fiat_25519_uint1 x19; - fiat_25519_addcarryx_u51(&x18, &x19, x17, x7, (x11 & UINT64_C(0x7ffffffffffff))); - uint64_t x20; - fiat_25519_uint1 x21; - fiat_25519_addcarryx_u51(&x20, &x21, x19, x9, (x11 & UINT64_C(0x7ffffffffffff))); - uint64_t x22 = (x20 << 4); - uint64_t x23 = (x18 * (uint64_t)0x2); - uint64_t x24 = (x16 << 6); - uint64_t x25 = (x14 << 3); - uint64_t x26 = (x12 >> 8); - uint8_t x27 = (uint8_t)(x12 & UINT8_C(0xff)); - uint64_t x28 = (x26 >> 8); - uint8_t x29 = (uint8_t)(x26 & UINT8_C(0xff)); - uint64_t x30 = (x28 >> 8); - uint8_t x31 = (uint8_t)(x28 & UINT8_C(0xff)); - uint64_t x32 = (x30 >> 8); - uint8_t x33 = (uint8_t)(x30 & UINT8_C(0xff)); - uint64_t x34 = (x32 >> 8); - uint8_t x35 = (uint8_t)(x32 & UINT8_C(0xff)); - uint8_t x36 = (uint8_t)(x34 >> 8); - uint8_t x37 = (uint8_t)(x34 & UINT8_C(0xff)); - uint64_t x38 = (x36 + x25); - uint64_t x39 = (x38 >> 8); - uint8_t x40 = (uint8_t)(x38 & UINT8_C(0xff)); - uint64_t x41 = (x39 >> 8); - uint8_t x42 = (uint8_t)(x39 & UINT8_C(0xff)); - uint64_t x43 = (x41 >> 8); - uint8_t x44 = (uint8_t)(x41 & UINT8_C(0xff)); - uint64_t x45 = (x43 >> 8); - uint8_t x46 = (uint8_t)(x43 & UINT8_C(0xff)); - uint64_t x47 = (x45 >> 8); - uint8_t x48 = (uint8_t)(x45 & UINT8_C(0xff)); - uint8_t x49 = (uint8_t)(x47 >> 8); - uint8_t x50 = (uint8_t)(x47 & UINT8_C(0xff)); - uint64_t x51 = (x49 + x24); - uint64_t x52 = (x51 >> 8); - uint8_t x53 = (uint8_t)(x51 & UINT8_C(0xff)); - uint64_t x54 = (x52 >> 8); - uint8_t x55 = (uint8_t)(x52 & UINT8_C(0xff)); - uint64_t x56 = (x54 >> 8); - uint8_t x57 = (uint8_t)(x54 & UINT8_C(0xff)); - uint64_t x58 = (x56 >> 8); - uint8_t x59 = (uint8_t)(x56 & UINT8_C(0xff)); - uint64_t x60 = (x58 >> 8); - uint8_t x61 = (uint8_t)(x58 & UINT8_C(0xff)); - uint64_t x62 = (x60 >> 8); - uint8_t x63 = (uint8_t)(x60 & UINT8_C(0xff)); - fiat_25519_uint1 x64 = (fiat_25519_uint1)(x62 >> 8); - uint8_t x65 = (uint8_t)(x62 & UINT8_C(0xff)); - uint64_t x66 = (x64 + x23); - uint64_t x67 = (x66 >> 8); - uint8_t x68 = (uint8_t)(x66 & UINT8_C(0xff)); - uint64_t x69 = (x67 >> 8); - uint8_t x70 = (uint8_t)(x67 & UINT8_C(0xff)); - uint64_t x71 = (x69 >> 8); - uint8_t x72 = (uint8_t)(x69 & UINT8_C(0xff)); - uint64_t x73 = (x71 >> 8); - uint8_t x74 = (uint8_t)(x71 & UINT8_C(0xff)); - uint64_t x75 = (x73 >> 8); - uint8_t x76 = (uint8_t)(x73 & UINT8_C(0xff)); - uint8_t x77 = (uint8_t)(x75 >> 8); - uint8_t x78 = (uint8_t)(x75 & UINT8_C(0xff)); - uint64_t x79 = (x77 + x22); - uint64_t x80 = (x79 >> 8); - uint8_t x81 = (uint8_t)(x79 & UINT8_C(0xff)); - uint64_t x82 = (x80 >> 8); - uint8_t x83 = (uint8_t)(x80 & UINT8_C(0xff)); - uint64_t x84 = (x82 >> 8); - uint8_t x85 = (uint8_t)(x82 & UINT8_C(0xff)); - uint64_t x86 = (x84 >> 8); - uint8_t x87 = (uint8_t)(x84 & UINT8_C(0xff)); - uint64_t x88 = (x86 >> 8); - uint8_t x89 = (uint8_t)(x86 & UINT8_C(0xff)); - uint8_t x90 = (uint8_t)(x88 >> 8); - uint8_t x91 = (uint8_t)(x88 & UINT8_C(0xff)); - out1[0] = x27; - out1[1] = x29; - out1[2] = x31; - out1[3] = x33; - out1[4] = x35; - out1[5] = x37; - out1[6] = x40; - out1[7] = x42; - out1[8] = x44; - out1[9] = x46; - out1[10] = x48; - out1[11] = x50; - out1[12] = x53; - out1[13] = x55; - out1[14] = x57; - out1[15] = x59; - out1[16] = x61; - out1[17] = x63; - out1[18] = x65; - out1[19] = x68; - out1[20] = x70; - out1[21] = x72; - out1[22] = x74; - out1[23] = x76; - out1[24] = x78; - out1[25] = x81; - out1[26] = x83; - out1[27] = x85; - out1[28] = x87; - out1[29] = x89; - out1[30] = x91; - out1[31] = x90; -} - -/* - * The function fiat_25519_from_bytes deserializes a field element from bytes in little-endian order. - * Postconditions: - * eval out1 mod m = bytes_eval arg1 mod m - * - * Input Bounds: - * arg1: [[0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0x7f]] - * Output Bounds: - * out1: [[0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc]] - */ -static void fiat_25519_from_bytes(uint64_t out1[5], const uint8_t arg1[32]) { - uint64_t x1 = ((uint64_t)(arg1[31]) << 44); - uint64_t x2 = ((uint64_t)(arg1[30]) << 36); - uint64_t x3 = ((uint64_t)(arg1[29]) << 28); - uint64_t x4 = ((uint64_t)(arg1[28]) << 20); - uint64_t x5 = ((uint64_t)(arg1[27]) << 12); - uint64_t x6 = ((uint64_t)(arg1[26]) << 4); - uint64_t x7 = ((uint64_t)(arg1[25]) << 47); - uint64_t x8 = ((uint64_t)(arg1[24]) << 39); - uint64_t x9 = ((uint64_t)(arg1[23]) << 31); - uint64_t x10 = ((uint64_t)(arg1[22]) << 23); - uint64_t x11 = ((uint64_t)(arg1[21]) << 15); - uint64_t x12 = ((uint64_t)(arg1[20]) << 7); - uint64_t x13 = ((uint64_t)(arg1[19]) << 50); - uint64_t x14 = ((uint64_t)(arg1[18]) << 42); - uint64_t x15 = ((uint64_t)(arg1[17]) << 34); - uint64_t x16 = ((uint64_t)(arg1[16]) << 26); - uint64_t x17 = ((uint64_t)(arg1[15]) << 18); - uint64_t x18 = ((uint64_t)(arg1[14]) << 10); - uint64_t x19 = ((uint64_t)(arg1[13]) << 2); - uint64_t x20 = ((uint64_t)(arg1[12]) << 45); - uint64_t x21 = ((uint64_t)(arg1[11]) << 37); - uint64_t x22 = ((uint64_t)(arg1[10]) << 29); - uint64_t x23 = ((uint64_t)(arg1[9]) << 21); - uint64_t x24 = ((uint64_t)(arg1[8]) << 13); - uint64_t x25 = ((uint64_t)(arg1[7]) << 5); - uint64_t x26 = ((uint64_t)(arg1[6]) << 48); - uint64_t x27 = ((uint64_t)(arg1[5]) << 40); - uint64_t x28 = ((uint64_t)(arg1[4]) << 32); - uint64_t x29 = ((uint64_t)(arg1[3]) << 24); - uint64_t x30 = ((uint64_t)(arg1[2]) << 16); - uint64_t x31 = ((uint64_t)(arg1[1]) << 8); - uint8_t x32 = (arg1[0]); - uint64_t x33 = (x32 + (x31 + (x30 + (x29 + (x28 + (x27 + x26)))))); - uint8_t x34 = (uint8_t)(x33 >> 51); - uint64_t x35 = (x33 & UINT64_C(0x7ffffffffffff)); - uint64_t x36 = (x6 + (x5 + (x4 + (x3 + (x2 + x1))))); - uint64_t x37 = (x12 + (x11 + (x10 + (x9 + (x8 + x7))))); - uint64_t x38 = (x19 + (x18 + (x17 + (x16 + (x15 + (x14 + x13)))))); - uint64_t x39 = (x25 + (x24 + (x23 + (x22 + (x21 + x20))))); - uint64_t x40 = (x34 + x39); - uint8_t x41 = (uint8_t)(x40 >> 51); - uint64_t x42 = (x40 & UINT64_C(0x7ffffffffffff)); - uint64_t x43 = (x41 + x38); - uint8_t x44 = (uint8_t)(x43 >> 51); - uint64_t x45 = (x43 & UINT64_C(0x7ffffffffffff)); - uint64_t x46 = (x44 + x37); - uint8_t x47 = (uint8_t)(x46 >> 51); - uint64_t x48 = (x46 & UINT64_C(0x7ffffffffffff)); - uint64_t x49 = (x47 + x36); - out1[0] = x35; - out1[1] = x42; - out1[2] = x45; - out1[3] = x48; - out1[4] = x49; -} - -/* - * The function fiat_25519_carry_scmul_121666 multiplies a field element by 121666 and reduces the result. - * Postconditions: - * eval out1 mod m = (121666 * eval arg1) mod m - * - * Input Bounds: - * arg1: [[0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664], [0x0 ~> 0x1a666666666664]] - * Output Bounds: - * out1: [[0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc], [0x0 ~> 0x8cccccccccccc]] - */ -static void fiat_25519_carry_scmul_121666(uint64_t out1[5], const uint64_t arg1[5]) { - fiat_25519_uint128 x1 = ((fiat_25519_uint128)UINT32_C(0x1db42) * (arg1[4])); - fiat_25519_uint128 x2 = ((fiat_25519_uint128)UINT32_C(0x1db42) * (arg1[3])); - fiat_25519_uint128 x3 = ((fiat_25519_uint128)UINT32_C(0x1db42) * (arg1[2])); - fiat_25519_uint128 x4 = ((fiat_25519_uint128)UINT32_C(0x1db42) * (arg1[1])); - fiat_25519_uint128 x5 = ((fiat_25519_uint128)UINT32_C(0x1db42) * (arg1[0])); - uint64_t x6 = (uint64_t)(x5 >> 51); - uint64_t x7 = (uint64_t)(x5 & UINT64_C(0x7ffffffffffff)); - fiat_25519_uint128 x8 = (x6 + x4); - uint64_t x9 = (uint64_t)(x8 >> 51); - uint64_t x10 = (uint64_t)(x8 & UINT64_C(0x7ffffffffffff)); - fiat_25519_uint128 x11 = (x9 + x3); - uint64_t x12 = (uint64_t)(x11 >> 51); - uint64_t x13 = (uint64_t)(x11 & UINT64_C(0x7ffffffffffff)); - fiat_25519_uint128 x14 = (x12 + x2); - uint64_t x15 = (uint64_t)(x14 >> 51); - uint64_t x16 = (uint64_t)(x14 & UINT64_C(0x7ffffffffffff)); - fiat_25519_uint128 x17 = (x15 + x1); - uint64_t x18 = (uint64_t)(x17 >> 51); - uint64_t x19 = (uint64_t)(x17 & UINT64_C(0x7ffffffffffff)); - uint64_t x20 = (x18 * UINT8_C(0x13)); - uint64_t x21 = (x7 + x20); - fiat_25519_uint1 x22 = (fiat_25519_uint1)(x21 >> 51); - uint64_t x23 = (x21 & UINT64_C(0x7ffffffffffff)); - uint64_t x24 = (x22 + x10); - fiat_25519_uint1 x25 = (fiat_25519_uint1)(x24 >> 51); - uint64_t x26 = (x24 & UINT64_C(0x7ffffffffffff)); - uint64_t x27 = (x25 + x13); - out1[0] = x23; - out1[1] = x26; - out1[2] = x27; - out1[3] = x16; - out1[4] = x19; -} - diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/third_party/fiat/LICENSE temporalio-1.3.0/vendor/ring-0.16.20/third_party/fiat/LICENSE --- temporalio-1.3.0/vendor/ring-0.16.20/third_party/fiat/LICENSE 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/third_party/fiat/LICENSE 1970-01-01 00:00:00.000000000 +0000 @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2015-2016 the fiat-crypto authors (see -https://github.com/mit-plv/fiat-crypto/blob/master/AUTHORS). - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/third_party/NIST/SHAVS/SHA1LongMsg.rsp temporalio-1.3.0/vendor/ring-0.16.20/third_party/NIST/SHAVS/SHA1LongMsg.rsp --- temporalio-1.3.0/vendor/ring-0.16.20/third_party/NIST/SHAVS/SHA1LongMsg.rsp 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/third_party/NIST/SHAVS/SHA1LongMsg.rsp 1970-01-01 00:00:00.000000000 +0000 @@ -1,263 +0,0 @@ -# CAVS 11.0 -# "SHA-1 LongMsg" information -# SHA tests are configured for BYTE oriented implementations -# Generated on Tue Mar 15 08:23:35 2011 - -[L = 20] - -Len = 1304 -Msg = 7c9c67323a1df1adbfe5ceb415eaef0155ece2820f4d50c1ec22cba4928ac656c83fe585db6a78ce40bc42757aba7e5a3f582428d6ca68d0c3978336a6efb729613e8d9979016204bfd921322fdd5222183554447de5e6e9bbe6edf76d7b71e18dc2e8d6dc89b7398364f652fafc734329aafa3dcd45d4f31e388e4fafd7fc6495f37ca5cbab7f54d586463da4bfeaa3bae09f7b8e9239d832b4f0a733aa609cc1f8d4 -MD = d8fd6a91ef3b6ced05b98358a99107c1fac8c807 - -Len = 2096 -Msg = 6cb70d19c096200f9249d2dbc04299b0085eb068257560be3a307dbd741a3378ebfa03fcca610883b07f7fea563a866571822472dade8a0bec4b98202d47a344312976a7bcb3964427eacb5b0525db22066599b81be41e5adaf157d925fac04b06eb6e01deb753babf33be16162b214e8db017212fafa512cdc8c0d0a15c10f632e8f4f47792c64d3f026004d173df50cf0aa7976066a79a8d78deeeec951dab7cc90f68d16f786671feba0b7d269d92941c4f02f432aa5ce2aab6194dcc6fd3ae36c8433274ef6b1bd0d314636be47ba38d1948343a38bf9406523a0b2a8cd78ed6266ee3c9b5c60620b308cc6b3a73c6060d5268a7d82b6a33b93a6fd6fe1de55231d12c97 -MD = 4a75a406f4de5f9e1132069d66717fc424376388 - -Len = 2888 -Msg = 6487972d88d0dd390d8d09d134860f263f88df7a3412457adf510dcf164e6cf041679b3a19fcc542af6a236ab03d66b2e8a155d1061ab7859f75732775fff682f8f4d5e50d3ab3770f4f66cb138155b4715d245b8069948ea016a45b7ef0fdde93188c57eef4717f3425181de5b9a5d4e0a2963f2a67a340eb1ae994b98a48ab19b90ab74391c50426d28287ac4f1eb93f5af1a68c7dae40876b8afaaf35a19293c1952e957978abee40ec32f2aa880c956c7eb72f117b397cefcfb4e75ace3b081776e46b13521e93559d453e32ab74ebc0859b9a8dd4d1d39000ebe95f984d80a3f5004dc91a051dfbdfe9194f4f9a483e4e7955577fb0933464c63eaec771044d59abc3029a079519f8460a693b25b4ce207ae9d9447fc4c5446e6dad234e9afdec0c562798cd0297318399e838be385845c6dd79ede66e2ae80afec6738d4d9bf44c8d9eddff6c5cd2c94e340e0ddac40384b9a1408c9a4b98c37a6081d5220fba92f1d03144db -MD = a135e32581bb06289b8c83f040e9421ec79bbe01 - -Len = 3680 -Msg = bd74e7f607cd7d905e90175d67650a6dc2f8a4e2d4ab1249ca88812bda7984deccbbb6a1ba90a0e91434ddf5e6137ba85e39a598890a7f635d335242fce0e9e037303b6c51e54aec06614ad5ccce06d9599c80016530d7fbb1da6eb548084b2b05babd7d553642443efda726a1fd71a8bc087c44f285e2bccf661ead475a72673e4386fc4eea5197c4f13c0feb0a85bc8e67e28ab872684bbebdaa527f3c253debb2dc12c2693f8e9e2651b9345c0abed7a0fafa3e5d305386c95acb7a172e5413ef08e73b1bd4d0d6832e4c035bc8559f9b0cbd0caf037a30707641c0545356bee151a24068d70674ef1befe16f872aef4060faaad1a968c39c45dbd7595de8f472016b5ab812d77e545fca55000ee5ce773edaa129eac6473410c2499013b4be895f6c0f734becfe994306e776262d4528ed8577218e3cc5201f1d9e5f3f62230eb2caea014becfba60fcb1f3997aa5b3bb622b7205c714348ba155c30a79a2cea43b070cada807e630b4086b129051898e1d9e68d1d0ecc9429d20d6a1403e0035a442b37bf508eb87e8ea347a3e68427b6d48ed299ba65ecb37b38754f4547423eaea2aec403338db2dcfe61cff4a8d17c383656981e1838a23866b91d09698f39175d98af4175caed53 -MD = b22b87ea30f4050913f8f0241fc2ae2c319f52e7 - -Len = 4472 -Msg = a52638f0efb19bff5ec95fcde4ac9aabd95e14d2e5f84c551f43bc5376855e71519b6f877248739a20cd790b85baa00d5503da5cb056f02d4aacc760c91fe1fd6efb26def817e5a9c56616023bc9e2fe662765dae2c0b2edfcbe17db140da30c466de65c49c6f81496bbbd1acd81666455f23bb243dd987d7ea1362a20faac841f1a36692cfcb4c3dbf5f6bb058c36296b8be64e9b56adc5187cacb7b58c054f422a9e6d6a61229fdc3b494da98f5a33ed1bee14b2d2f6ad1177ffe99a6bb553f7c4a6d0cb9e498ee0b63f388235d86c26c9d96e50fa7d1eb3bcb9279940c47a8510d7fb175b3279318d5fe45823baba5dbe31c33c7649fe447061db78b33baa3637b854163fe34915e931b9f3040807d9217d7b3fed62370dbe806c006b21cd5061d24490f366e4d5f23e201a7ec83ae31b46fe2108d1af56cc9d42f9117eca1cb5ab344c1fc334b9cf0d7f9739043bc3d413b3aa6e9d5067c240c52b4c5b89e25ccd8a136a002008a9273f30dec3f2c1736c04a1c7ce0087c9f25d5ec5bff2ea7ec0b0ad7c278f0ca712c9ae150e472521d958d0bd6da9ff0939725924b2ed7b410a0ce2fe3f6b0bf25884d885ec223605e318fdf6803218a9a06ce5103c62ded035087a98519b4eb180d778d7656b3d4811aaf11a128317d1acb3ca3166395c51c90a3cf164071d0d132c54b3810a8211ec7774d2288447abe7afd030375a3bed4c7cf1b28097c02e98ea36bf49e74d89fbe74ec6cc1def5cd8c8beb5b8adc3cb48c56182ad337e3b9778e4a6c4 -MD = d742931bc51d4d44ff938783be73dc7beccc980b - -Len = 5264 -Msg = 892af4c05368aa9242acedd87d0fc68de483ab59520aea621f264b65ea90f005952c8163903d86ee5bd6147d4691ac9b7c8260213f6e370b7539d384649e5143ba23711ad04bf7cc2f0d512054857933b0ea1d12f3c0fe888a4e96356653fde000f50d0f9afac5d4c73aebe92d54f5ff8aa12a54f5660584674edaa17917bb856f8b9d6776b2b7ad2a462b015b67e8a71190cf0ecdca15a5121fe8ef245255da10cd694decdb96006017599066251ad34d9f54690452f59395ab0848f06c9186eaa3b8e785dd2a747297bdbdd4f5532a47b7008c21686ff7f8d881d464cd383205f6d45dc8203bb267ac9eb12f415a5406be1c9fac73497941909dba08dd12856aac03d83e0d916147404694fe70f8fa929ef0cc2edb4cc07abaa2236405e62820af8e806d0af32a1b3afb8dcaeaf5c4f43dc4392e074075aa3ed93601ab7ec22fe5bd7cdf802bb5ea8206c41a1619593385e00e3461ed3fda048a1c6639a0fca038d7f51cd8ffa9bc00af62765e2b62575c8b74c8501ac711f3fdfc1b15157e7a8f2612aa7838af999c3d8f6629f58669ac0f93733c91b557f579ffa9a9a4efc5d1f0fc13ca9e6e8a3efa7273e03d6e705cb292bc8d18b0b4f1484d975b17f88ae87edadf34f88f96ce2c3424e9ccc17454bd992cac786031d0b00d6d953540d0bb18d5942010b9c6341cfc02ad6a287e7c78d249ff796ed578fa68b4bec5709f320515bcf5ac95215812f39494de4b94bc2a639eefe282a9d26d85f33d902fff358fc1de1b95caaf2255416207f2d1c1fc1c74b0e57d43b3c6538db27c5e26f9acfc0183fa9301787b2f0df46c6c630a24972e0947105afd3df2a779e2f6fc947f95ff32fa6de28549e67fd32c15a8791ce1b8307e646e8f1d94fcd1d7225ad997a2e07383ed14dd76c3c186b0b54915cc -MD = 20a3a677c117c61ed3bb19e2ac77f69987896d0b - -Len = 6056 -Msg = a5045d24d07578ca31987db3d2e25e12ea38bb1da7a8bd642a574261d4ba3a50c009504190f1ce6b6d8abac3498845cd67b567b21e9fc394da8dd01e63b83a5f62b886d8213df6d392ffacf793f8111a70d07856a999ff5ff6bcb6138933045393f9461209bfb8aba8e1997837988aa00c713830d1fe3a6e88cb3d6acd935ed55bb4d716d2e1de9bb817ca6dbdd278084380ed691d363c6897a2aa48b741118dc3d1820d030a2e4ac88987ffae0da2f91de5e02816a9cdf62c2948d7d0a3e522d2398f1f25a17261e31f185690b0d11ca388599642bfb5c04e485e3f9f22a13d91d24673bf1070870ec1c499ee25cd19dc529fdb2be1bb6d05e733a8ad270f850685ee3259bef1655357d4f14dd35e97d129fc1e5975a9a559ee10398018f5a33b3bd1837c13bca3b9c9908537224c3e88f7b68753e5451253453d1aa25e1c3e38da358fae779be848ff407e337a5eb70ba21640a197585afad402749b624cff034b637e7a5254dc09e12c03ca435daa6213646ecbf5a9255784a76ff18b4c8da677a377650cb02803589c3d82e512be9333e83c5965021c703b73322e40e69229453da2f90d77743f4ad753e6c8429ca8e9ead0d45129e64fe2afe6d9ebe0b3929c7828bdbe7167c3a1266e7b55b8eca81cb152c420e72cfc62a4b27bf3039aeb669d31398565aa9943d1b6cbf23b559cb686ebaf3a04967da197bf9bc017ef3c8af4e4f6cb1de5c91a20525d08927f8b9eb1c21f0748cbdc89d334c1bae4598bf0c56a7bf95fbf590c5a6bb90086137dbc7a019bef7b7421019f3a76493181e28058eb5075f4e05303c9286840dfb97bf828cdac5a643852f042f940d5c80f4822f48efea9a4f1bee6b3b2f13265188b3a0551d8b0ccc079400598aac66faac6bee37b0cfb369aa39d6130dc3ddfd9b86a57b2aa597bb49dd830403984effa623c6bdb02d57482090f1bcbb2c817a30770671ba7bd39bbc7a00b18777710a82684d5d6699e2452f82629abf93dd31f82347db25944ce7dfe80dd49eb07995c1a7e6993c8be0fb179c9d2f73c03dcf5309fe19f47 -MD = dd4374e29b17e2ec533813feddc5253765cd37ac - -Len = 6848 -Msg = 912e0dc25b52540f4d33d26fdcbaddb420f5570141bccb8c2c94b8a38ad32dedf20596f35d8fd6dedb9296828512dc9cb358df586f941a1729c79f6eace0ae725025863371d57b86210c49081ae6a85ff6e720c3a39b1fbe1179492f2d0d0f951357838a7f6e6a8e85689306837e6884536cc349c51703094c725eeef7a279dfa361350170a0cc7e71701e86a822459431ad6ff3bd51ed80427a87b1f1e713d6690b469f2ab4c9df4cea8f8f711a6716f874cdc8739106ac5b596c8203240604cb1f5b6d96f288387e9f912ac6adf5920f8785d0cf1f751400d6b46815a079f132631f719ca132116f57ca5e8f251791e0ae3e13ba42634097bb076c0fa4952307a137b5250aeef287dae233b4c8f79ad2b3a09a1a43f8b98ace0f94d9788124b09f4e411776e5642eef82b11ddfba354d5d556cd96a5b063fd871ea5c64667c97260a1b5c2b3feecc6052e1b2b18beab9730291ddffb5af20a0d8767eb06cb122fd134dda722319c9f3f9ca5c8890427fbe5212104a2d3d93f0ea3f28a3ba4dbbee12df7b92b96c8d71207401aaf1c40506eaf65893ec37028e4f4d438679d8c9bfafd725d52a6f80a16ee88a60d7f9b41275459f211a25d443b0a8b5a1d0d8b439913fc2819eaa0a4d8c2de0f26a67f4ac9907cc3dde8f71d7b559683ce8d7e324611e39df3ca6943b214be9a8d1982e9afe45c72f60fe41120567429fe95cc048c67d72372dea8434d64b8fca3514c8a54d07783fc9faacbc49da2d12faf0b26c696355d199fe44005334b99fbd612c952e53c7b541091a9c28ba10dc431a215af1d8caf4a76b3a673f0e4f709209c03248339cd8efb5f37b4b10d246ed6275d807e5b9e97fb8d03142e23885db94ee4444aedff1fc859f2159e35d98205017af53900af94a6d6d2505b75e26c1881d92c9cc78488f018656fb3c981a036d6da77ce3a5693013780d3095a89b6c6fb4e580964f25d1b210e2d9226b13bf40e0872be6728458315baf6b84fe2b03d01d0511134cd0ea1fa68c9a9dbecd7b51d91907a05a91eb4f7dd35c8d4820ae34bfba234c589001d1ae1de7b5798e6029be23b91943d710f54643aeb76ec0972202cc5e4759af3e4e925e6773859f964ff86ee859179ff0ac1ec6070b5954e3224e026c0e3973ca20b814c3dec848444bf0c23d69bc31b2fb6d23108fef23bdbc0b25f2a9de25cdce -MD = fdccb6e47645928fbbd51ccddc6cef48d6afc011 - -Len = 7640 -Msg = 2298096d8a02225d4a5a91e95b43bee70f5a23f95269b1602fde6f11967b650b5c4eb8e783e416b1bcba54f62af4561e695130fccf5f8aa4f1eb497d69bc6c97d781333e260787cf11af96cae520be298839acf0ba49c5069b83c4436daca5ca9c17c399fbd33d5e51239d8c142ebcaf74f8e0fd9c91282d348d2a8c2ab3da4db2faae208bb1ff0784fdb3654088195836781449fb9e7cc2c4f0c17f273ad1c721103cfd5d079672b3251e7df0959cced59f90ff62d8886c5496d245eca753e1f243b755fa3ecb46e68226fbacbd0fb659579b4556a716d4ea66a405016428432c796553e8bf642b23fe1508fc6838bbcb877e436173eca1914881e8efd71894d79c901cb1f129cb748031cb69fee183321782230aa4d37c4e24af163d6aeb7cfc937edbdc3be4cbe0f1c46d7ae7d0b696eeec0ad9a2930d2be277b6738468a5a14677b6f2075bd66f371415b88ccefdfff6072257d6f4fb2f6b21f0198c59b4d19dc5d57abc57922a3b6aeca953a20076161a930ba6beef62a5f5eeb8ec84549180af61fcc1a0a718e50d1ad7a5166602366c857e7bb890cd793bd5d70bb12bebd77c820180febe421e47c6caebf0d7ac3e461f36beac8777cf3ad0ff51aae1e68a755f1060397faecc5e18088bf9fd7b17f089bdd5607b69903b04b726361f8a81e221b1c9189166d89b391beff97d77a7b2ec9b2a9c15a9a2869c87f21c8de0a50bef6c23659d722b46518b7db802a8d7d47056232afd41ef63bef71d25d2efdc37f2cad7e64ad8aca787de9ffd3217909d3c782ad1da385e1a93900f1996c00faf52524b6441a24205049ebc91b5cbb8577989a6585497d6f242d931c0835927bc368de8a629d8d7aaf0523b3d34cc38484e0fff8814654134f35be9e13fc40aa4c6011676ab8052dc728386c75723f9b8e4949c29c2aa8629d09ca0467209a2af2c383e9a6fa49ae4b2b804f7c5d7e2f1629fe703066f8d16fe26bfb5c52ed5278dbac6db1c4b990ad9791d9727f0da3af1b947dd86bb3e46a881acf7df3d8d52140d18015a7e36950f4f396d2477cbdab9682480ed968100f433d1d46a3db17ae6bb9ad4d34459cf7bc0c04365739c1ae137e7b5e1083e8b0ac695130b3729e52e4cb61c2ca5eafe46561adf91ec354292abf6420a1a5d3013c25f7e6c32dddb1246d3a010a9d26b9799b00951ea7e9af34ebaef12d3c63737ad99db3536b5a6ba3358292559f75e9710e88b4d765f692da79b869e3c61e89d11aaf30e4c998d4f9aaf7f13bc421e6e432b2c2c97c0f9673e02cd595b178a6e75fa8e9d7a71d7f9043f6a83da9bf543bae2b397568990ca9c558ee83ace67 -MD = e50a54470f59fb9b654bffcb4c353e58b683ada5 - -Len = 8432 -Msg = fa15cc7f0de294d7341b1fd79326c8be78e67822343c19922ace4e7925076145ef5f7dc91fdc1de032d8c454dd06effea2b0472ea2421c4db20c0fc0b0440e10184a8648d230d39f4e7afc57d3229de514e0245205a840e1ec7397f2bb42b8269d6050c4cfe8a05cb1882eaa1d84bbbcf7fe765705746f98018a4ed7ed0a45d0a7294305bd0c6b5e828ac413623432cb7292a5064bb090b819d99d36efa39f565e2cc7d245a21ceeea09255b4a38e85aae2519257f638b8a5be9ead96815ac00e9f145f50fb49a54118cb94a7f9ac7b1d33e397c49964856f0419e860169561670002334c249cfd81e9be8a7a662b61808666fd54f50ae64006a220662a683df1de2cb58066aa2c23abe1a3c6a969cd6752423f63c99a7fbb2eadd2132d41da4161ea329851efb598c7eb7cf704063344300bba8b6791b642e4b369e1afc0bad833c156ee46dc2e63d6227296367f27a9a82a0b365f9f0e89d149747c12435428dc488f1ce5fdfb174f3d212e91431f0a1333adff3200fcd27ce67e2d05783ab5c3f6478e9fd3b025ab72151aa4e08dd819af1f405f7605bf3000d38ee9add2f173510ccdd4ebc2117387ab0501d5f8b61402eb94684cbdc2a32f311c4f72b18e62cf6b5535a4b55d2fe46f580891e406aab57f75bd13996f3ed8035f97555acf2ae7dfaf32ad1e8b38feee9e49b2d45c465d676efe690d277b71c6b361c433463420d6564c53420e375d854245a74e296f611fea8c9bad8dd1b2f7c23f5def761710ebc4f335e468a386efee8cfdc5e08e472572e849df04e9e213167070c3f13c1e8c85b7d35a1cf5e17aed7004b0344b95f482a1f2362f2ca5b50ab5bb652a1bc045131aaa37bdb713a2e99f7aa176ffc429b44a03375f02643a196f7c57934eac81f78c28f1ad6f94144d7bce2e3b43682162311b473713a42eed1e51ffcf4d29df9d9cee0c7e77c93b93955d9af39ee8782707990a29c8fc1fd032dae2308fceca8fcd580ca3684985466cc79c326acb9a6d2e1ae4b9aac2697d5d5583698f01bf588df566bec98b8df0729a966a4f9804cf250f6b59219da84efe7077cce3794a526f54af231415b20c37250e1db5b443a77ce502aad5f468cf86aa23ed058bd837d1d44a62c05e9e143b1587cf25c6d390a64a4f01305d177996711c4c6db005636612cd1066fcae82eeda87f118463115318da50eb93e20c79e53c56d949c4e5f8c9eab9e60466fd2d2f2832625a8e8af9f4da925d92e31441ec0b3c302870f96c5c67a6f54e26eae87ec0dd0a66576ca5008cfe93893b58988566bdf5036e5a392289e25bd4707606e258c73430247efe43d9dcb200529d27b635234d5f25d0082339b43f1ead683063d83906415e89adc5a773e57f90ae958960b462c6fd2381686063c9b546890d0a287ba8206e55598ee00c528f5d528b06cfb95cbf5e1a4bf8e4382320a1a146de31d54355baaaaba76aef21b72150b134 -MD = 9b3ed390fbb328a1641fca93691763000523569d - -Len = 9224 -Msg = b718c968e8ffe4ea282fc33f96da233b8a8ab6ddd55781244a5d82237d6d9758ca039b3a9978d211e179870aebb8f38b59e161c466d090876f015959b34891c957c23100ad0bb49ab5b1c1b4e4e90a46258174b41e16789fb487c901d1a93779643dd3e3aa1f542cadc0b9640ad53015f65137d48391011520d71b445ffa4f11fc5cc90b1a1b7870cf8cb743e3e52da0d539f14d1faaf291bbda9749e6a2a23824075a9f8469e90d25fe0379f97fc88ec921ec467ac715ba8e768439ee09f897e626cfc771706facb7fee42dd40dca88dbf16ee81a523039a0942c3bfd9719d549a170ad6898d1f58b75a488faf5fc351291c05a89b10cb5fa1dd5789db4cc9b55608576f149d98fab4989b1f5a1233e76ea2ac54f4e71d7a2f7c81755c8da91134b564d94eb4d231f64dcd04d770a4a0fe2f351f28f2747a20c4d41ad3b0c5e8a4b2b58dae6f658edace40f88e17802e6626525fcdef5ac0242ab1e2e7528abc3464bbf4aa39cd71f0beb943045340d0253c66af5a2a4afc8832cd55fdff61fc425ffab6d880748bd683787cc0d07156b9b5f476342fcf7feb6168fc9df406397d18f44c9fefe51cdaa1111e5a0b9bf2a2478e5d028c52dabc3b273f2decc1e443143b1e86e4b9d59bbc15a026612b546d4596cc3bbc7f8d89148aa644563f9d12c621b523eb4d268828f89abc7da9fc7954903c563ca018c0a205ba77acd9c48ac36a98dd8029903e7c3c6692bd824b64e92d25d8895efcf1581af41e7d2aeb098058423a2fd9931d2a43bc2fad5ed1ae77a021392f16ba99ab5cebcf23ad812d718d39c066c7bfa2b7b0d409c99a2fb474abb6feaa61d238202dfa005ccc17553b7bf7e6a18e666da90676b7aecea61584924faf67cac44b3b10a73875111e1f32a705338ca837ec82b6fcafa966d5501c1663b1f3bc115160979bfe092725f9fb80da2d748fa49db944de5855ed4de2af8a8bacdaa039c9354510b77548af53faabef4af5af2cffc122a44840dc705bb37130069921be313d8bde0b66201aebc48add028ca131914ef2e705d6bedd19dc6cf9459bbb0f27cdfe3c50483808ffcdaffbeaa5f062e097180f07a40ef4ab6ed03fe07ed6bcfb8afeb42c97eafa2e8a8df469de07317c5e1494c41547478eff4d8c7d9f0f484ad90fedf6e1c35ee68fa73f1691601da2e87b00d1c6f256431227576398bf21945cc44255925bb7b6517e34676c959812eaadeba7258aa1562c102938e880d9466aae49bf361e852c54858ce2dc02313ac93fadbaad8aa936b17a9a740adeefffa7106caa497657a72d5fa0ff4c506998f8b2df82eb7cee7356d9039b7c33d61e86ad438d591d9fb5206f093349eaa1ac1d89f9a65bdbd18a70adfd15a91a1c318dd736fec15edde4f2263e25614b89e29c27748b7b11f2ea838bff793e1c32c72110ef753ec492a50737a82c0efd82eaf93de8b8c5d9e32223d5834ca794ba4de50cb5670de94e73c3f5efddcf7b1d03b91fbea4c87e02bfc62d10f6522e03444e0d216adb2761dfdcf36db11f4ec8eb506f7ed5ff88d211eef5211cda42ae28c0a4cbe713299d57a6b2ba2c6ad30700538f91c2e784e1c702c05c06ac7d3b89e1661d72324a217 -MD = 09bf403d8a9d2334f28fab704d9cab87da43731a - -Len = 10016 -Msg = 32245df514f6c273d252271a980929e50a7cb0e77b05c7d46092abc3049321327d170d4bde314166aea193ce99b032c8665c3ad129b58528ba87c58c6539cf47e3f53a6b890a295cc08e658eb547af9052cc544a6ce701833e3ed9a61632c5c54e080bde7e46235df060c6e354944746b51326d9ac61e3edd4fe10977d46aab4a596a92b24b0d6722661dd54de61a3f1797ad90651ecd26e641191e9043d271dd0e83cdae20feba24ad7d369bb746a9985499559c350760fd6bd852312dee307b646eb74222a09f6440bcfaa54954546c1c8815b6b5578d7124b14ce0ef2877a41f7de804bcad974fc45faa00f8edc01153ec693afc380cf000365716241ba7e58453e86c5b702265bcd7bd25526d6d169f58b89f86135fd892ca1947593251ce376330ef7b92d1447ea7bc88f24dcbfa533f9c6aff8406b930fefc0afb06f5bcbd3e4a14b980245a9e5220b235195d2b14138d13a50482107f5787b78604144f6a47ac6281b28c16a0697227b75aa1275676f320331f625ce246450386a43dd4d311c06f60c489070950395fd58c287daecc7727063f281cee5dac457971c30b8c1f3e81e3109bba5da8ded13c1863ac61a6718ebade33df17f02613daf7545209e27f406521448f01d5eb124799d32223777acdbd9725f1e3c05ae537af5226b0edfb21739104238a59d699749b177d78c21b7a8ad46f13d620b33ffbf45d1835a43abb9ada6ae67bb739ed6f76712cc618bc0b9f208fa353a3b79aa480c5a4eca7c6655757e9664a708d6484b690ae8fedd4f786f5f83f00cbe07bddbf3c3b6a5b26b515a3f0117b1839c550f5f6715aa40ec4ceef4935520bc659e41a216a2350c43172492f868210d756509f0323aaedc209d356e324cbd5c1cb742c05bf9c0b3750d9b1e823f3ecdebe002c5723e52d872d40e7668bd2cc6b36fa5f598a58fcf899d868ca78451ec852fc3862f0bde5c6b573fb43e90b623b22d34ebd78dea87082eaf836f1fa291ccb811da71889a92918f90cfbbada19ba25bb5471f9918037927dcace3f879e546e4b769419dcea06fe4cb70e8fd35550a60f1b479b1636c64f2d6af0af81e107d1b7bdca632c1ae8abfb63ecb66bc7a72a4b0d8ebbd11ea51f66533ed05d839f9c627dba92fbce56c861be26fd17c31628fb95b80a56ba4c99b50e09208f188404b810d517c076c9ca3c003d927bea36389d6e63d51b9c35349615f03eaaf26dc14521ba602ea6ca27c6d4a134ecaf7fcfacd212caa436e78685e5848915b3b558761acb0a7ad0d077bec5e2430e856b64a67b3549650cebf60107267e73cee310e786978549776520604e914b460e818e16c45bdfe2a0bb09a3f566ad39c68fa105dfa05f2f1d00b877c90ebc179d4aa27a47e70cb174cd37cb3ac583cc1d137f5d9065f670342ba651dfdb2417d43f485d70774e360b9b16f331b3a0cf4507124b4358f9d15f5e808afd8711bb25c7f61cc87d1304d7bd1dc894b172a7d0d2f07b6319c7a6f111cd8fac82e376148d2244ca7909925babb297be5f77ea431f905a79f8ee859bddf3dc576f37dd12e75371f0fb805329df8c0d291e3f0b1e457864e2a6ece1a21b89fda8ac7d54c37f1000d66515eba4d0f0755f6e168eb4dd2f274784313fb662f66ffabb327188bcde9de54648b06f28868cebdfcce9c95f1b2e13115a144b4ccfafd81bd5b7e5191595983f7745eb3ec49038d390a0ae33d2c5dfeec5f3d3218c39bb5f059c6b2c6b84798150109b8c2 -MD = 7f32d7486bde22ed00eeeaae073858144dc3ee37 - -Len = 10808 -Msg = 9f07e6b7ea8b6d2bb301d6ce7019e0f27ad55abbb799e6d47681fe609af63434fb84be4309e63159b3638d0d875e7af11a28d10baa185e8902dee5b09e14621610169511a214be6f3d65a667891eded056e44b913bfee3597caeb19031c21f8da5667409fd3c9cd31aaf28c6c08495f9f7b1d135b173fbacae9b6ae79d28f201841b6213618751ef12e81b1172b526d2c5396adf569e30ea5e4b199f287063da73de6817181d672aecb88730e8dc19c587211e7770a8097b5566c69f1bbffa803b578dfd682566eb72c9750a6a1ff7380714f5e548b80ec75b9577cfbe40405ba42dd9ad9ac7d49c6ac0ec893fa647950bb8f81126f7c837388036175818bcd37509540ff52d3ba49d48f594b19a91435cb52ee4518dbe31b3ce0a5f3372f7517892070cc37c226bd307971306235eaac2b4a04413a1781e9527fc8f9574773b7371f98a4adf1259d3a5daef87683432045d541ab25b7f67a635128fc746c6fb2f4d3272d47c92d667cbc60e7c929e43ec57544f77e45a72ae9d564711116cf774cfbbada77b2a4a552164592dc82145404ba8c9aa6491a9750ad0a0bafdef99099f9b220b05621d664ebbb8e13347a0c9e056729302ad73c22287800c31d948b864dab84a42c3b762fbd314e2fb97bc4fbf68317ae735375f8d83d14dd6b16b47c68159ab59d48011cfb553764799029a8fe5eda63bb15f12f4cc79c613006c7f6f97ec75721de13b73685fe63fd6d871f9d6906025aa52a4ff6b62bf114db228042458f1b72740a78ef41e7a0dd5a79da54201f0cda778dd5567727ff720a50a303187674e79061ec9627a79d61ed8e73a31289e5c3039849fc89350ee01adec99c4601e5f9c9c68ccb95a2dc53ad11461acedb2facdfd638496ac781e793298e7e8cb601316684d3e01a5dcffb0fcefc1b93873ce072c40addaa440ae0f9cd4c3a2b0739171d495c74345cfaf08c03f0363f12a01652ee4c19c65f0c74c5369d5fcf7a0023447071086214efbcb84cbceaf001fba706b1769e2d6d090b7bf1fc4fd892f8ee8296cc1d221a00b80b25ccba74d9a22ae4ca04db6df2832d849bd38ad4c685c14e18c822f2d0f08afb1baa152c1e361a93749141f683fd437570ddb1529939540d92ff9a62de11ae1e9adf9b842419ee995d86726595e9f5d53d5523c08f760f5781dd13e095f689cc2fd7be2b9fe02f4cf16edd19acdbbd1a3de482bd2dde6b9261db000a9d11b6ba471ced70f60b4544bcb4f2a14d44f1bb1f063e86d8d4f174bf93ff2f67f5ad3f7d39b9f2ab0dc9173bf3439adbb83c4e3d34b7dc34fc2944f77251ed6b04e5e23e98943f435a431aeb945054ec98053a34ea9f1bb6b67ba9b600a8c32ae1f93907c41ca543932be63832a96e0476e50582a254d3c286710957b9843f3bff4faa6536a3c3102aec0fce38af4497d7543692f669830d0ea1ea692754bff2cf51cce38ada275d941bde0a20d2873b3bbb5402515da7ea9176d366b49ac403d4c806ef1b2030706133f77885c3944316b2e44d4d91c0efc1784aed0bd6e9d391eaff0472067cfd14bcd295c1f2fa63eab34dd045b65c81012eb7487789afd6a962fba02a0d6b58211f05ee8fd128024a351737c43bd942f2f2bf25823384a16d98a36ead959a1608f2e7ef29febb9297d0c6e05382c5a9f96cb8f0d664e6b861247cac674f77bb4ea12f143adc13b965eed3767e2bb02a97053b26ce8e6480267efe06018b92bc64d211fa3ce9dedb3707d346aea717495e54cc53f5207c9d10009df7e6ea599dedee571d9aa86b7c7db43ced5f85798ab1c3d2f4c4bbad63d061d2fe91dc6ae44c5e54dafea84811cc7c86d72b37356333eae585c7c06578ca1b43869ce21503f2ba91ceb369f33f85b927a07c4cf97747227 -MD = 37b7277fc606556160f9bc28b06fd55f4424d9cc - -Len = 11600 -Msg = 25a43fd8bf241d67dab9e3c106cd27b71fd45a87b9254a53c108ead16210564526ab12ac5ef7923ac3d700075d473906a4ec1936e6eff81ce80c7470d0e67117429e5f51caa3bc347accd959d4a4e0d5ea05166ac3e85eff017bff4ec174a6ddc3a5af2fcbd1a03b46bff61d318c250c3745da8c19b683e4537c11d3fd62fc7fefea88ae2829483871d8e0bd3da90e93d4d7ec02b0016fb4273834674b577ce50f927536ab52bb1441411e9fc0a0a65209e1d43650722b55c5d7ef7274fb2df76ac8fb2f1af501b5ff1f382d821cf2311d8c1b8ec1b0beb17580ca5c41f7179e4ab2a4013eb92305f29db7cd4ac3fc195aff4874ca6430af7f5b4e8d77f342c0f578f714df4728eb64e022e9e13dcbf00663e34f35368a362a91026ee196b746b4437cd1c546184e9b1301e8103367a06adf7487c8cdd330c04a6f6546897d19cf3bbc9eb75ffb18e05cdd329d4dd90fce9c84844cd2138487ad1bdb6d749c1f8e873ee47e3ada307be33c2f5032282779c19aad88ec521ac8e390391ffd1d4239508a0ce27ebc7eb4d1a947f38b5cceb5773f6c46c499daca1356e524cf076917bd297cabd4aaead34ea9e24cff7eeec8e6fa284c02efacd766f3494490627c71f7a29ea1e3ab5c1f81c6682537946efb35534a634d5d783504f1cb47e936628f257dd98c54c7bce193874144daa936968dd238534dea262d14d8d5f4818c05b970439433ce06f262ac74d57191c22ee115005be4ab9e9e07bf2ece14016b4c37007b395ffa71e6e7f2168c7604e93e24f6641bde0f81c80b2c7d1e6f10dc1f50fcad2fd87f0f81bb90f4cf1ada254ea65787e108209c8c81844c2ccd57e6664e8c62de6607e9a925ac970424bc7f46b061ef132b87f6d3b0ee2462f67d910977da20aed13705476c6f85955d51fd0e8a3b261b0fec9783e1938c27b12be5f1140b7207e0b96d44d90048e88d42aa8e7c0fb45f7cf588865c9a0ce3c809eb046c4add515d352986b48768677c368bafce021f493a4dd0c2692c2cff01beaa2bc9bdebf40e523ff7452e6b78f1d6aa57c73ef13f109a7721507175e125f32a4f718c2358bbb9b97ed31bdb85b5ca0e6fb0ebb1abc885868a58906ef2fc4f7456ade00de52e129e02a8763ff591b9bfe0d130e8f428b504e4cab2a09a4d7b8f2ac5e132042e04f76d0a6820304a4bc69072361d82f9d3f919eefe9142e21e83b101b6191b8237cba64219059eab292a69db25d8bd02866e100c9dcb5081e159d5a9884b94f354229597b076a77bfbf3525424a20d0d7769b16cb6d62ef36c187c047e4ed5490305225355fbb381682932245b01dae04df5e456723842ff66c8905bc1ac484ceb7a35bc321d2a8619d5f394f37f8c45b1179111f97bf66f7872f8f678ec53c3b58cb61c6c637452b6ff7cec14a48b014bd9a0e67226b10a491d9c1dcc97607808408db92e56f9ade6adb574e5f73fdfc242f91d05c2da9782d16418e534d6318da0a2dc9e7c215f51e986738f0011a6bf5a85fedcd6dbdfca96382eea4b1db7ecb3ddcce460552fa0bad7333947671de92a2ad01cea1baaca7500a903659dd2cc8127d32987fbe77b2990fa0c55aa0ee9b9d1ddf08702bf2975a4cf5a09bd49d5136637957b7d4d893c991130b1433f6610636b7e34f8e8909f0ce914bfe8e6b07084414fc3412a73fddac0cce398780935c6c3ee7965eba7f9213e5c0f836f05a0673980e7b145e0743c4e097413837a32e42d69deb191158ec9185882f7ad7bacf9674f6f336879a8a5050eeb1b27600fa3f017ec44a28363edbd309fac68bb9b2012e5e43159e6a1fe2b04d0172b63d2ed561f2a87e6988276760dee0a686d75c68469ce12e1ce67300912ac71582c85a9a5a920e025fdf24a8b17f87a743843d20304b33ec8da0322e761059076632fbf26df57b82659bb534475446256c40c2cd8de1d1dd6b17cbb0d1866dc4db0d91621e75678b255e677e9505b2bd4bad8bc4b1e9317d3fbdae5c26054bda4b98a98dee9a586919979a0c1cfc33eb7c2af6aa3ed -MD = dbc7ace190c9dc985d2c3fbed5fe90328352b3b0 - -Len = 12392 -Msg = c29a1ab020e6434a50a271e5525a47a29b447a76162eeec569b51c3379b8b7b7300c8ff17e71b5bd9dc5e0089a780fe2114070d5380e81751e4075393518d9890f6d771865a07b745dd2d4dc0c54dd513a5f3def66060c7e0a683745212a251ee5259ad0dd5bdc9817301509b3d7f917a10aa86eaafed608b59629fe43d7e29e3d9cc0bfef8a215154476b3894e7aa5bcba77bf70cde283aa630140da5055a319c39b18da21693c69b7f9e11b96d3a4542a07c35938e4a3c65a0c0194f9dd3fd8c6634e3ffe577207440753b2952effe8d5b74cd47f684377a4cf5cb4788962d948b13690ce0188667f2b95fec7c12ae34422a6a30ff1e536e9e7bcb97acebe73d0e14c6d3efbd21fdfd32240bd5ea7cbfbb68b2578f5fb7c7fc19c047f319530d5800a25cfbad19bdc9a8338d44c191b730f44dc38f908c10d099525d446a9b8ed19ea7adea319530bee3337ab0dd15a40897e47ce8f9f9ce81c12ae38624e448e1b87bd0a691bddc45aacdda03872f0cab191f8b80e2278b775af0e0a39059c2f114c6cd1515ba4bc4c7a9b6240707798142a5f741933dce1a2b4c5d82f61f84677c31aa2105b405a5006e15fba5c672f2da1fc812536420d2fee4610b9e6116adb56371b1a8d2904e1ec40070a9948066a83407da6cc408079963f426cf4501298a052aac473d7629e9557e6b5a982945758dbb8324840e21c56f1ebbd3f3cc45c2bfdbfc2a1d3f9c28c697d402fbf8f709d1ecf4c4cdba884ab0e8b2f094ff6824388e8899997111a5c25393e7e472e42ca9a21593c695a4f0d059f36f5022f97a194a38dcd996ef26efbb90517c2174a6bde6cedb9826de7f747a67984ebe628a0918f43a06359e74f5d6b48aeb8c103eb4bf07e26af59cbe4651f4b2b75a0a1db1ffa4fd48d786577dade5d9583b1ebe3736a8f2658b4776eee98307b27f59fab907306bc6030f962f460c85ebb708eced529951b06f486f1447fddd68b4b7ebc83880cda941a1fbb2ab12d7ce8734907f1bc247752905715f75487d01818cb6869b7d6a1819a44cafe4dd1726330c7494990c1ed942e844777a4e2fa46e40249d370d8c3c148052cdf7578d1e44f65fd5d55d1c064158af055ef53a79043bfdb21419793db99dd5b5ee6780db415c18e9d69f8b24aebd7cb12927e8a9cae609703b8a7a4291639d0ed0f43a88b2a5687aa4b8b15a127e7122e4cb7f5c49a70f7cb346d773233b7181a6e8014b1f39172d4892d7d1f405570197c948b907e7d9818437d8f9f78b1ab6772a1e4c1180edacc91344b1dcb9f5f548098be98e0f2d25b744c5fc95bc61544ba2d9b410e2b29f2f254221520215a7017290146685d4105354e5a386370c042b3879aba2c72dad83af1749df487dbec9ee9e6015b396eb605181175163e36d1dd448585197277fcc980c520af3f6e3a965fef825ff3a5ee722e1807ea7b0382c5e8ce4a4ba68bd12ca69645c6b48bea7bdf9021ed38a10eeaf4d05956d390c5dbe8e772398b80e5d2c76a65c193bf6cedfd5a786964caa80e00dce1f1c4792badc96375799df1ab6a67b419263973423b3da0ee7b049d3a29d6804a41ba2714aa0eb4fc726a48a2420bf5d86b2231fb0215260c88949345ecea8cfaad4125215f3d7e5fca5d006b0828b20c16fa8607c1283c4b2891475bb5b1356bbae5fdd24bba0227c802b3561b427b5ca00ee9e8f6cb6632c18713dc22cf2c25e1150b97ee28f2dd11d7dc03f9fdb4229cfbd82f2193464be9e293479298c3a1c65af8f2b4eec2f82e68e4e5229eff06742ddb4acff42f0f0830403ea3b2be77b13420634e9ff4f18412688a33baae60bc315dbc5082b2f4b2fca521d4815f10581d2c7a0990fb61a980c1639be554d9db92f9f461b3548560a43c81839937f421826797748668b1052099f1c98384ca58cf1aa361faa64997d370ee5f7edb9b94008c5c2dd4af783d7e5cb55b39b0caca324a19dfed0aa9dee6dcc8c696bc8f2623e5388400422fa8f6844ebf5c6b43968902f839ff043e9c6aea9137655d475e491cad159dc33fde259afe648006dd542fcfaf1ea5156066ec24d8408f204cb30c9d3a5101952143882b74f93935f079931aaeec73d0c7a4c7161e6068b817bacae150d4d05a9c8f9a9022dbec5b157d6f8e8831efa8dcfca838d425768730dc2073910 -MD = 796135c20bfd2dfc7a1ff2087aba7f93b2814ef4 - -Len = 13184 -Msg = c3ec01c755385f27020d88ed2c578e73185c6d514c9192d13cb29ea4261167d33b2f3ff8ff897aadf2b42a4570ac2dbad66a6ae7e6b457f76d39bf1e22ddc287d2521d8dbae8ab2d35a62cbb979946d5586cc9967539370b139f84eb65151a82d17d20ef4efdfc8f110a16b968c5dface68b13c5c0c73bf6770b7573b76077ae80dad286836f74bbcf0871a6acd90327c7eecfde9007699ee1a61b1ee066e2f2268ebaba21e61b9ab6cac4ea2b7cb72e45bf8548ada1cbec9898fd55a7d062360cc460f4ef0cfa12107597edad5705a9a623bd6bdf3c69c8e608a37ed64600627ba24d9ab686180c23347316fa12f480334400afee80491b111e9603336fc35fb95008163eff7e71392ddecfd9548c9b344ad57ca11775cb62045d4a87f4b3130ef719ce4f1d32279888628014c5d6e2f15dc53ac1a6f5c221df80bd997cd867c4bf092cb1883e18886e878f710ed93eb1a3575116d8cfe696da88c233b03b4322cf5f962be9a92a5307d465b9d79e95be47132968520d21091afcc31b38e3906f50a37687e87c47407ad16ab3c72bd15e6f812a7fbfb75ac1ca64271abbd834f4695e338b2cbe5696f0060629878ad8da442abd23c5d37907104956f8e22319f9431735005e773f9e90fca2e1bfc3947aed95481b0c6b65231431b87d54cb25c50556e4ad25b0eaa0833aa4a516dceb85924a35303d86085dffa7b571b9d842a2d8a3a85c2a703fe3f048763b34dfc7455dd2ea2a002d49fcf930b59bbb5357d6e487e9d315bf26b100af7e6bc2d30f0074b4d1d1fc67104a295620c400434caa50890fdb8da58750daf626ff68c1abffff7850ecda3c458db8a05eb430b009664532823c3a2b4a09a8a5d5bdcdb0828a27a7d14541b4d10ece96d733f4a27552ea08aabec55857248f45f26f9aa87ee813c8bba2dad89a1591c1f309f4227ab66895f029d63596e9b95de7db76b28663ed6376cc4daf89ea2ca81bfdd737ffd9e661ba4414c8efa04e751bca0ad48341da006a8b414186d4c5d4b5d945eaed048df271d8281b4b907515f603fe185bcb0428ffa65f977a1c85cb2b63e8422a7f85d27eadb936900257c6e050f986f74993629de74eb84b0b9317e36465479f92f589478b701fa83e1c0f4177a3253f03af37ac14b6ace3e7183f47a367013485059d363af5e0798ceb798141a5fd1b407e2e94f6417c28f83bccbdea9479d29fdf98b281ef81ed34ec8b0876a716744a2bcfbd55952f04882545afff94b65f29a802222a0708eb7d49cd3fde50793067dca28ff95acd5eddfd3284ab10c0c46b8b61f0fbe47f5ab127c78c40492d39e0ba3073a9395f1d40ec1ca4b6b0a0eaadae3f83bd2fed2416b1025866393a75fdec00cf2fd9ec2bf91a8a77e81b5db837392343378f5b30f40c050c16c9a9ce059a9a0c51e47c6f50ae046509faff155055969833add0669563580e19a1812b42ee8793d8ff18d18dd012d6e0f48feb422a1fea773054ae40dc84c83768ca73fa0e4ecb8bd4c639f7aa3d3236b2132153df46a1cdc1eff03c9f10a037c78c907622771b340b908fd7610ce1d3db969fcc9c9325fb08aa14d2d58400e365d069fe538bed994c7ebb7520084b7f181d4df58b8fdfc9ac8c024aa6694f01eb9de6d9c811a8843e97a6190db7d80211b21315d1c13501569ea3ec3945f55a00fcef51ab91b3bb89e3360b50a3f1236d5cd97599b19069ade7ddffb7a35ab64df46cac21937806d66a54921254fcabd524875e09e859cb5a6f99cd4708e6dd798d453354a05e2fcd35e9f87b516363f010051649edf6ed043ec09c12fe01962dcf632e6c3fcdfc154bdb83b2228c10672b3be58248d197545d38b5400c13aa11c3ace590f92d3757b4147ce04fe17de17a1115dc825093f1d3eb60f8bb84e2cc70099fe955e7a63a797a2b2c60c871070770ed7e22dda885a8bfe56291bc0407df62a69fdb611267a1f7d7bfdeabb381d93eb491b0df9db5e49e8ba71823d86916a040d9130442853472c9c051f10cf6f865b33cb5be3b2b906f9befd821289b1fa9b6bf8638003d3bd24a583f02440e6dcb32a8b8e14a8fb41a5d61581fba440267507bbb661237bc01a0af324623723f5a78fc41b29288568619262083570dc5c155323af4411ac2e613ecb12571ca76f8cf61d898dabf809d1765b8b7c79e729e0f0f8c4c558e5269ed384507f5bd1b8f7dff06fbecdc39469e47a921d29e10e8c43738d4163d767274ba745478f43406cbfd52438e868a69f8f4792b40b6a886bdd5c6f64ccc35e9f29bc974c217cc45018445d9896579ef6b93b33cd88d4160 -MD = baa2e9bef9dd836d3d37013c296ec31919fe7840 - -Len = 13976 -Msg = 7810aed4d42c0606d0c1f76943d0c63f38d261cdaa6244b58c36997f0d53a37919815cc123fd5da0226fff19d91bc0c25c5be8d3d04d6c7d72c9127ddb96d6f082dd8c6982ddc8419de1fb2e816fde174bc314274a7c0b21059423f37f95128db90a87f379340d914aff32d0c434e9e60df02ef2a055e8484d7f130981ba1ef8c8f29288906bf53a30b2ee2529d3aad6abcc7d5b5b42cd9b53732ce96a6cc4d8b67bf85050e848e157e0755838b2e6902c3e4b8b02a980c11e56b4b8c212cad58c8fff724014ce31c872118f793a68bc982ddeaa1df4ca63b612f4a10f16f9985115f117e9574ecf8a5107f275d3f701f88380df348a7329248d34cadbdf19c90df51466d11a9266a563a2abb3e65a0753277652d0d343ba6fb1bc5badd5f210c917b18882c3609c229229dfbbd95a77b1010b2c783702bf9f64d37d0e604b138c630fa484bc811908c5e3b91616bff91af98695b51e77dfbd90c25785e8ee7d5ec178e35d6bbd865fe4195e4b03513497f72eb40ef06bc3d01cd2139ad5a1f44719326d973adb8b30d614f9e20ad7d12fe34db20b15a613e0f048d6d58f2d2050538669b990a5cf828519b064921b77eba529b634f6f076f6f46fcbbf7e5aab8057bcff4cd4e1fb5dd873ab5802e3cfd1250ae912f9119418108e17df0bef3ae00d1c59d77058b6c9b7681346c4f881ec4c3a732c87d016512cece5bd9cb678765dee9ce2cbd2a9cf0a4210b63f22344100007b0a09f6a4a630d25be29b750a4c3079f3f64d177c76b947c931db2890da2aa32935e54be5210488a1d56ef59b6a6c06849a5eeed6c7adc0673e00d43fbeb36ca634859782c99056e01e7ffed1d6fbdd775666205fc8ccf4116616ece6f581a31a8f4fa222a6bd8440463458549ac346f5b2cd76c083ff2df030853930887e90adcfad346ec17159e8d4f7cacdbeae892637fbb5a1002fb12c24b683c27e907a857b06140e21951e01502f1de448a3ed316c59a8a94642caecca0f9247dfa1abcd1bc10ba9ce121cb2434319404289bb3ed94d16815d22bd58abf92d65b39869ab3848e1e7d1ce9824349d868ab34a3c770740c6d14db5d59a4edd1ec4035dfd4759025e7231b3dd7eaba42c69a4cdb5027d9b81401ee559d73b212b0dd6d8afca065749eff6a832e930c0d3861cfa7107c3c40f76d998903afb2f1de835f1c65cc7af6c092994de8d4c59428823b9b7af6225381c86b8c3e8156dbbfc27908c2425728d66d1612a9186d74218c1f2ce21e124c4da2b2c3b0c1145cff2b49d474ba70875aef6f65e1e67a39bdeff8dff86c82b7a57d2dc3dcc781e1f71e40040f8d6daec8aa03bc25b76231581e4729206a0a1233c82b01450d15f7522c0a1bf54384ebaa2d8189d713bc077aa798acfc8f0ee8730449007c1a47297ad4f680b8757cda69da57539873ee28b00c5bbfdf540796edc1f645d477abe4db99a3e6eb8bbc07923103adcc608f2172cd0ee66b419aca0e71b145f09d9ab61eea7092e10ea8dfbde204fcf562056e4d5a20c502e01eee4fa408855304ca199f680b394b66e9ef473dd9c5a5e0e78baa444fb048b82a804bd97a987e35808bf762d22e8d2cf592c8d4f0ac4065bbf6141bda5caf22440c6d7275d3c4b87489919b440728e93286bd27f7f57788e92a05315f0e98b6e1ff3f1f88dbd9060c9f0841ff37910447278ea74e459d92f5b408254c6ab7fe8ad53b2132253d96bf48b6276254780699e1c7e36221354c6810a78830e56f61a52adc37f02444e312f3459bfbd22078b161f36ce1fcd0edc6cc3daaab033178d77cacb4417d81939e3b11104a353cd314149b943c5cf32f8833653cf938a0bc88273736b47595f0b79cb344cbf22f9e38761b09dfb60e6a3302a89fca1a3fa53dd6e63fb7c0d4b30574a67a0f9d6b32a5031c2e5a8c95264db662438c1c50bb7ee8342fc9d3e022fe7f6540739b9258c047f9822b653a0c3eab3cd8cdb3a667b1f7cb9779232af909097a389671174930b14d95c0c43f548c6d92cfed8483427d7206f72433178dcb9f4fc2e6b27cbc7ceb82e9b92e47c7cd7a0e8999e389d447d360df89885859accd605ff2d4350afb3323fe8307d5ae685d0a9621652c8597b873a0e7975ff523005690395ad2bd3234cb34ace55ba0f3930196328dddeee38db9fbece480e8d4d49ce428cac85bb87cc33ca54b5c27d5989dea3bd23068b1cf9e30f7f47d9d18b6addc5f88986f0457b666faae59aba4fa3a02abb6a69b98fabaf0a74ba89a9522f3d93c38d55f9c721f541b92d6b4e814608010cfb2efff9b7abb595e9459a0a6196b4d3fd1b5e7386874867d55dbf593abd2f961e7ee6c2e67e1acb1b362e1bc892311224ffa8b371c58d9d2497973d4668bc431a81f55200d141fc9984eced2cd71166492a5eeeac56174463425d9734b1b1f9395eb412cd4b3011ac565ce8550d5cb9b3 -MD = 3d40608ab9bce3f372bb29a62ff3fcc68e48385d - -Len = 14768 -Msg = 6b50d70eb3d958730f650f7f99f9fb046d942f985a112997dd4e60674f8e1c005d1c8aabb93210090f18de583b90c6f2b9724d165c9402eb43ec0ec20af90d9c3d5e1cec12d1339e5733b657a90046ffe7eadd7de6c11ac16696d9084520075bf35fb559267e6a37cffebe054c112433df4408535f611a202d94e9c06accb34667647b7b5d035dde5fc11fe98c8b089689c8f5222f3ca911802d6572e0c5b86482b899d92027b39aefc3008cd2359931cdbecd71bd1a709b47ab75a70fd3c0be2aa235fcd5b11574674d8a7484d8800b946db7c973c316c66a5443e55fbe705a4869786ae66a2a72afa7e42b0c3c652cc41edcb1b8fe449ad271f4b7384d7242c55689adb91a9b9faf193839d029ee9d471963b1f495a2206549b3a2024a6e7e87b1904db8890f0050ebab243a67c66503a67551904ed75f0c26a630257b0b1478c2b7d0497e2f9f78646776b0bd938ce20d3a1af2f28c5fb04ef5e809a8f20e7fd024c0d6c2a38310cd94b69cf5fe1bcb95d99383496829370ac952169bcb738325ffa4c61e12b4016e596d65d5ae19a5877b45ab1a14c48ba24af7b51b3d4c6e0771058157243b318fdf2273264c8e5a2b47b6d32f3738925e9f5e4ceff0a027bfa26a6f38821f8a784e5d2eaf7f83d1c96670614e7a8e3686f11045e08d779694b95bf888d468f371cda7fe3af0fef2a9fffbbf4085cd5d61679306b6bcdaa3d0de60840ec11e53c184864b8d460aa5133bdd53ccfffdf1382a71f93924cf36b93b027b93f24a94b19c847d722aacd24e42a087bc9127d953613184306e613799f5c845df0ff49d893d29fcae44ee61a33bcbc2d7e252fdfa355c116541958eb6373b4ababf2256918efc300c3bd73a5a4ee76be49b864575ce79079e4675235927e1f2ecaadea710b8858253b86f46bba57becac63cb990b5310cea42508dec9ed45a63c792f7850e24c584a62bf6b0d650facf7e32ae106ecaace3f8556a850b2eccc74d41eb19735da1bbbe2ce929ab92c138cc2aa05acc3ce6e360e6867349e60ce5a62b13a2ed9b6346cdfa5a4a8c7598935a954ed46fd041953694505bed82812b7ccf2fb5df5680925024a8780b71e76b8402e821bc5d4345c3ef5683689cc0252b9e9dd6bb27904b0f3c7256ab20342de2e43aa7541c7281a34817ae4d8d404f5d29dc6a237708cd4592464ade091556f1c984e9a99645d55f4f0210feec98266bf169f48add50858dc672e93684f1833b13757d3f6333bd5264a4701f233e36e275c51a63b31e205259a6a6272c5f1f29627ab6880bd2b617198d3000d988fd5b378c3040a0a81a3dcc40063287c4973727034a15e8993c37de1ad556782ee630a71dcaa41eb4dfaa9eed7deb0fb897fee1bd8c6b920dcc1f32dbd48277868e0d44f86df0959aed1321fd91b32ca17deb22e811eb8086f247b84eb2076036513bb1aa8ec8ade0cf1225fed61d7725d5865b416f284cbb2b3bcef1f277baa4dc565db2919eb01cf231fb6fbfac67ac1b4afb27f8a44f00f385f7541a35ff588be7a9af3ae554b5f2dd12dec2c286aadbc3a32a42e2100ed790b1f39dd496c7ec6a35dedf3ef4225d7e2cba64025cb8836ab3b6d264382b44069f4ef1d629897a5882eff30e27087ebf799127ee424baebadd6c2b9d1fecb5321fc4babd1003c22d01411ac555dee2fbb9d182d8efdaba3e60a8b31f3fd9c7ada3f36cebf2cd30723180bb0718fc36dd3e1a1964adec326fedfb0d4d3068e7f3cc696cf54a5c61a2b40d5845d906c6bea6d930241506a3b9e5d19eb96a10929f19855f6b7f27b248d96587042e853f2a647d8b79bda08ac6e8daebd6756753f9ebd598b119b5cecf4227abc481ddec9af7956fe7f05053f157658946cae3b8aee3e8cd68929cf3c06eb24af96b977baae0bf71e1558c9bd3c20fdb6cd30c1d28622d41f48233eda6bf93f925544858b4b03a161865bbced8a94866cb36570de11711bad7611108fcc54b1adac4470052d6b3e0dfa964699a8d9dcfe46d3b078353348c93a7bad23d1056448c4439ff0fd4ab56b9892d0873df7e5b4ad04ea669a7143bbbcea7d5e21133eabc5c87c1462a9eec389d6c080f2f78bd611808471e933f4cb25e6e8086586291ed65c6e38058fd15df5ea804c6fe0b5ab99cde861ca7f43419df556e844660ce81f86dd268d044680035776b35bba4b7c6e757cfee45f18644ba12fc767bcce52c9ce31a4a3113575dba40c7d5e8e3491b700aa10e0da5b7d5871db6d758f59a4fcbcd37befbc8685a659a97121635a329df4d95e65f8f4d4ebedc2a217e89426dfd92973180f21f58cffb4594c41a4a748db70b11cc2cbb12d9e4c2ef5ce671f9bac9c53c712ee10b41d97fb8730fa37df3cd9d1ad3fc85c460be2d8b649bad957bd95e5a3ccd61d473bb91f7839442c8aa07b86bf78d41c5dbdea690361759a3c957aef5545bf636ce1828fca636acc738ebe98fa73d53b9a3aceaa831f81ab72bbb43a8485932b4c985a1223b75560bf8e0ace083ab5ff260cf460df8ac45420b7ac8ed99538bd0ee7a96f2c3beb2f9928c7f18ed55ab129bac656beab27dc6f12c9b2fc7c9861dc57d76f -MD = 8bce8c69fd802389c805d2945c7499c9dd279ea2 - -Len = 15560 -Msg = 43b1ac9c15fcc2b0168aa9862db0304441ce0c5659db1fa80244fa18f2f7a02beaba8cfee1c2f6805e8153df26bf1b4017ecceb354b53966a2d5f619122e32d1e118b2d19cf918c68716634240a8b66ba0335af5e213054d07575d1778d3b8dbee7126fb8fc8b1e95af0e396c494892ea348b7024c1d0cc6f87337fc6d0fbab0da6eee66025848519cb8dac5faaa1defead6edc4dafdd5373fd18daf370ac1b86cb614f83cd06566181551b62a13f9173b830521d3d8e909a21866181eeb545b6ef2a09b8759918f95b04f519cf6a50f5ff7060381d9cea5eaf1cb1f6cdbfc01a6c99836291b5237da30dc7e987caa3e1edbf8512a250e71df03c3ac67014012dee406b16b3d33c3b03e002565cd8f0b3fd7e4f317e731d748f756a75986a8f6dceaf1f495e8b99cdf82c42e4c10dce08c92d1d09045bd3eee748cf88891bc15698462e6ef436e2a2fa32f81956e1a24cbb5c7d2dc673c0e9a236e873d4b05d84c5a6071c177d9d5684a4a07880ed03ec5e7cee0457635ae12ab033cbfdb0aa54f13f37c52ab8206511e1ca66c19869842d1efe2119a31881eb65400586a53e5385723f0eb08f223b3c8ad478bb6c4990a1b31c189fab70388e967b94e206901d0d0f9b3d4b6b09656ef05d32b0e13a9e46c9d63f5bf4f8717ee4651ea24d35fdf247cae55dc44c5023c2d309548fa30996c39b19d10817c926df9ae749f19692dfbb5c9b6a2371a7f562c48118d0296f2c40f93c816d64bc20d86ba34b8c48681feaaed3e3110fb94e70a01e605b144b41c27f2c0f9d55a6f77f75b71985b1da4d4650036b157d20b94cf455ed792a0aa1b87b4cbe007126053547b756666985f26eeebe64a9506aa0784fbbf2c2a139b6a39c332f3f2db5f48a301864b6e5e789c4b97962250ff3ae8310b522b03064eb145053d5c201e32feeed5ed6ffad7b7dd86eb8e64132582dedc5c5ffda4df8c97b16433401941a21e3cdff2f9926be692a7ce153663e04c928fd82ec995081dc487c75eca63ae77509607dc12be82cb62b42a75c0ca985eac516606b85fe7c9e1cf15041f88cb793b0335f5e1078430f6b7e6f42bcfb581d32bee31f289e658968f386e6a100270888b51838ff4d9dbf5b7eadb9ffb9f7daf2359f59e9b6b918ad117e4d181ba23de3643cf430ee99408bd1e7243d4be1ae9448d9be41de03d669c9aad7c655a5be60df32126db1d25d7d06a0040e47b202993736aed98ac24d1f9a91394434ce0481749c160e5db5509f8b6cfbeb33c56161af3ace194370e74ee2c5c41a4f77aab5c2ef618b48ceb473dea25e4c76a8559e0f6a7e897e9c3f6860bd1aa0fc3f1b7e5880976ce99b038a8ee4bdaaa6e759aed62a5282b2a0a01c62ebaf80c180c15b94142a3bd686c8540aa89c9e4aeee804a21ecccd762ad3ab87e5f52235e946de03fe9c70963e6d50e0626d9fb94b8b3fe19c4fa24f9724b63e107e1ddfd5266636c460938f1e8d118eb6c3179879adc113477da985722dccf40fccdc15d0ba949aea192d4793821683fa1fae6ee5ea38c584c96bde485940584843d58e78ade9aef418a65659f6c06ec0e5bc833caaf766f8a531b09621c0c93e859280196ac5f166f18711ce55af8d8fb7da9bda7a9d7607a3c382c821bec57704bbb14f6bb9f0b73648206d29448edaf8710f4bc38b71364769eb7ae3aaeb76338998973b462b695971f8b2ec2fe1174a28640d3051f70902cd510ac21599a0b4b48c6d53fb0ff1dd9d113c08c202e90f69209b2b7165f458463a14477f5eaaea95235e40392ce52511e065198b82b4caabcb722f7a5c8cca6d2d040e58b8e957d3f3d67a90f0b7d2891cca991cdf0f0e78cb2eb6dd3936dbbaa076712216e08ed954528d8309ee685afcd901d6865c4d48b63d5c0a8a870eb71ad80a7c2724e21deb7ed39fc6fd5910272cee49072109a4030a8992cef1d5db129544b7382b142a1fa7f747b66927411212a8f4dff1b6033822b9f6851bc3af1e5aba73e8677786776a630b56c645564436ec6a7f42e4fedc2277b63b494a9ba484c622a66e9eab7932915b367955c84416030a739918ff55665d42502eed393ba01253f0a4fc119b9d2cc7c416bb3f881c97654b68c47d3a8aa53b72112e004a39098865af124155067fd18e02f7f486d7040b754679f101ec1a020fb48f7956cc262063f163c34c0b150902e28ebfd6c1f35d6f969c0332271626876d840cf7b5f2cc89f0831fd71786beb11a01c9ee59cfdbb8edbd2c41b8141987c09e439392f9dd2640d2af9cc84f93173dd3db342b0416efc05fc4c71bae7b7f4250b5c0ef95e2e746e4fae379ca06a3b2874c4ea23a9f5292f67528be4f9cdc572dcbe638716e4b973c9a61b8a089f51c9e95a45bddc5affa13b5ed3c722e3d93980e99e9f6efa1963c069e114dad89d08c6fcbb4683a565a29ff8b02a08ff17c11f65290a0e7a7e885b7def03be1b062d3033b48545dc427cbba98ad6532c6754dfb86a909d6bcf28c36caf1e5b72777f51869843cb098075b8f8ca94ac6fb138eb6ccbf8c4d6f48c20be872f5ae4d547517dcf48bc3306d6be6ed62abbd2ddb66909b20c2ac2d4fc99f9e1fc627909ce58a0c15cc163bce7f4911760275cd41682158992783759bf56a7244f1c3afb598d78d74782a08aef83ecf50098157ca05d1ab753553e6a1f804fb8ee302e9333188c77d0a6f258389304d9d0b806be9c239fa4176addef623f7a05a1 -MD = 064c6fccb707f0f3929084eeb0298e800d542370 - -Len = 16352 -Msg = 0a72ca03c9977dcd0169da7af1fa3f3f02e374175886de21a796f54348daf8148c2ddff950ca918ed1c65747c2de90579c73a7d036d3430c95babd4d0519d7a06815ab07cf53e1d64773255ef6dad8c966b50645203a99657d31ccc3b9b4e2eb493317746ebbd7700b772e07b477805e07b07abe3f4448f2060408f08b337fbcd58d0b8a5788d923c4da5889243beede286ce982ba78b87cd93a5b1ba41f18dcb42e708faf4551b61aa58d2e6fb08b1170f23ddaba5f51ca9ddbac8b2b0014148f1b2ccca177a6f2b7dfb43cbd5ebfbe88495c0e677f7ca6fbf0e289495cdb2a0e5d298952a8409f4090b5fc35ccf3af17793066e8639fd69b80e75d26bdd5e6d8fd4d0eed5f878560c078b600828daac68b9f29669024232493a24fe9aa6a12960382a29825e36bbd78e4b24508f7783d8693a1089071553f31fba7bbac0274ef75af8e7b81bc1affbfe3372de797e12372f314f7e9f0349363daacc34a05d68c5dbc1bc0fb7a5bcf9e5d8ee0a6d7ac2058a7cb5a260787c93027a72a0cdbfe14c2908e8c1b85f4d51c380085cd1ea3de3f960e5acc201888a1cae0177aecb430ad15320a6a45adb8415dd345e4d38c022faa251f65a2ad79bdac9fb31da0c28825324e5f6f23502015b44f477460303730ca57d079f50f438cb32c257c60efc332cf29b6b285a3b7a125beb4042c57234bdeed968e81068f16c8ce961f92028adcd50c35bcd47022ec9966b31d9fc86e87cf2f982ead5a0564d4cf2e8fa0c4842c2a3f0414797d0cfef6916d46214dc1ed8365ffe0e3d24c7dbd751453f0fd5a29b70a4c42da921be0268509071aacc483e3d7f22d8b370d696d0971f3ec74b3dc64b535cf6179f7990f8ab0e8f2ae1e53d7cd9a9b0b51ef31cad26cf8faf3384b1a87e64275f949319bea8a72111b7765488e1eb4cce89bdcbe1a2ee984409180bfc988237dd9b9b1b1ebbe2ce0bb79bf1c63a70036c4b8723027df4ef12465833cc442fbe3e2ee2038d7759fc556ca6b3d945d06b2aceffc0743a5b0a9675c5a7abd3d510edc91861af4d65129b312719169674ea66ae8802db4ab9514d11f0f60ffa0ad668f49ec3e8b0acc759bfad70229ee607bc44a0989c217889a2a56aad5d1949753c2bf598ce338980fd629a7771e19c59a83be9c03b7120ea339a931c37a41983d3f9bd5ec46893b612c49e9d78e1104696feb4383d9c3b197c7beae1143ce378ccc846846fa253fd165ffa30cc2fda5524f7a05f17253f8de9c4028a77464fda832221b8248332cc948f5dffd020630bcec12eb35c8e96be080d5a86d552a71fa381ef58878db88b09ed3a49296542e0f0f5cfb3823ae93053b25354b2d491be8a820fe40d247ddee2f40fbb3c50e27b27eff3fe0cdcaf7b694d9d72946e883db49cf3f939e9cb2ebc3e5ea48d85da10f02a4bf160d642059559996efe630323ce2d4bf672305900e226a7c391768268d62f382c32aa49458440c7b855649af713cd687a6aaa8fec11376b66eca583d94689390cd6db3dd192adb8dd3de5a82e41f7e9d367bad846c60b1a2d039546f8cda2df11e1eb98306ceaed5c1c58b34fb52740b01de3daa75cfc54745ac8542dd8168ae9c85dd0c85fa2b593855064c209f5fd9ed1b80f9452957adb66a1240f025edcd31e948020074fd231ed4f052bacce80de4799df8443512dd0cbc24f12b8e6359c49422ecde05ca3b5d8b74ce31a2b6b1cd41bc30dabd9bde2deae3dcf78373573ccc925387753ba7dbc2b749ece972cc8fbc072770879db8033c7689bdcdc5d183dac0be638cf77182c1e44b5569c367142fa4676c5dbe7475f90680e33400ce8006d5b5da12a7a138cf215ad3e9528943e5bb783805a6196a6bba4ad380cd571b97f9c054cef23de7359600ce33c63a042575e03a47feafccd8bb6ef379d3733cd753683989814f763c6dc4ae0dc8823f36f929dced6e3f82893074ade7bb2acb0c0c34f10bfbdecd29cb2edc40006adc6170da85bd9dcf74c642e568912c84b07f4bade41c09f3d447dac7be9415f9c4ee027c9c81346a8ad719478b40cf8ad37839597a84539573ddc216bdd0b038dd25d6968bffda15ac03dc2580bc4c431d3efec21c0a80cc9232aba442be782d104d15b0b90038dac293b404aecd4ab8741bc170307838a0198fbcf7b32416e246b0e6538e4bf6c0b4cfc86e7d3b71efc255aaea2094251af03c1d9979cb315f6594720572aabbcf6aff41ea55cd6af2ed35e3b85227ed41ff81f712fd7b72aa5642e151cde32f10cc6b46019e4cddc9de03916230f8381e2fa672e8a6fb80cd02025abc07bffb8ac35b0039c081717a7e07df7020d1afb766f2b5a5db1505d0501c05d08806c7463516961d2331cf0fb489f36b8c78f9168daee9d0068fa6b927d70b14b9803a4a0ce5313230279f8f67d0f5dbdbb6bf438d2335f28e320d92717c941000f4fda02e10f9024d2a880381250e467553a9444c96c292dbc6e2631553c74dc62cb85085df1514e3013272e9d06536c2175e23b452b7385513cc32fba4cd5274ee1260f799aef05b7546e4871924322aca87e8ac9e3d6d64e074090bb7cea77003b3da6e88eb1f1b4e6c62434770c31533cb991bc17cb770f782ef2dd3f1d5243344c5d1f2f5288d544bf205a4746feb1bd340eb049ba1e11e9ded49425e63f6456d2a0820f393184e8c9fb57655c1144a47e403afc3b01f1e6d09474a3ed95003d510fa5a0ee92306d66e3b063e3ef888ce8e4b0a1b6e92bf9b4d0f34b9c09933257f91e86eb01842d2697f9c5570ff9d1045ab5ccc62a2c8cfc18948f69f399e0480b4113a735ecb28976a80c2de9250b6110beffd14b803b06c9ecd1efe980c1b194b1e9bb75d697f00e2f9 -MD = bf2d47d4435ace28d3c336acdd6313aa8f9c41fd - -Len = 17144 -Msg = 09ebb3463b01b2c492ca2b1f6ac7e6145eb40646537230d5b945ef330d3f5733a2fce963a290b79c4fbec9d78f6bbe42a851b69448f8709dc8e2b021b106e4e68081060ca687c49dd39fdf657410d1047b96b2415e5a5ca16221ce3919c4cec029e0d3e850ce21eea5d63670219f65805deac1f69d803c0a0e6910224c5f5ee8278315a0a74e16b94ec996a19c01c3ded9b5aa5b0e5358ff55233f8452c1dc8702d097dbb3edeb2354e2c6a0ef1c334774603617b8b9f7a9bdb5230934d090c4403120427d94e7564188901422dafce3b8512dd3a49b6330d0888457f976c1c86b0d777d0c2c537a9c22baa63b2268d92cf15736d8e2e2bb16042a16a99ab9ba0acb6533699b77b6ee1a0dfd44dbbd5258a87be95e74bd721691ddef4d24bec3a6d5b20c9acb9b33bed751c244ef4475c5df63933e3b3c7e58986489ecfb190bc69226b2a9a2071994c14e9c4445456bfafcd5dd7e1ea607647f888e8e0912b9f26a88ca9d0a028ff840cb344bc5085b7f699a6e28044534c3b011a33b35f0f6b3c5a2ff7fead6bd73bc92316157d46edd8c7af043d75f2efc91c772fc67fde98f0b3af65629c9cc8c9d693c8ee3f3cb9bcf3c08d87e3d1d978c71a3d8877fbb10a4195a2ab124e4cc4b19fddb51ab9c4199aa60eee127281c08d9ded87ebf93bef907d104692f2cba2f6a1b4f89450658518aa08de86477146dc5ca0332059a2070cc03eb3931cddeaf233ff37408336761a570bd7b3e330722fe0f618c99f7be722f9ae70974efc0340e10cdf83e4bf630c3768782fb847b914c56fa74c2d32068f93b00c13eb8e927f137e8fe2d758d26ac5df2e5e491fa217647d7d3c956cfb8f2903f4ad853e0ee955b496f1fdab5ab27cb078c41830b3a4689ff8ff6a752cce241ab8a8ae62df3c225fa315aa2f527fd69cd5f5a81374482c57a9291ef310a91f64c6a9b9a599c3f3c022e27f4d602f6de4c4776b404a7f3a251c2e255f5dcc7562bd25596eb53d64a694ccdf8dfa4dad28c2adf44fccc61c98b09310225a94b094fabfe036b7f4df4377596d8987671ef96f2db58a71994e1304ec51e49d8e6b8c1dbdf0861876de47590c8b989de83da7185b3188cf753934979e7d0e9d3600b874c40ce56d5fec22b85acc63b45d73e25cdafad33cf6787dc71df408e0181a9abe4697cd2d0c8355f3c8a24351436c1bbb0163f24079964f420f597bfca103b348da13b5be092e61b9caafeffb1680b3a1832f5e809afd2966d71fd0596d7682b2e31337b6d267d668f537a228635c5aaec49f8063b717bcc409a99e7cd9cd997af618bb9df4aa149fdcec025f965971314a4700607a9049d81b994edd7283580f7796c9d9fc7facacc64f99074bf287e778b8471d41d18121816159f1d4325eff0c1fdb0136531f4e55a4dec5e0c21f2ff455ccd09965d31eef9458605b451ea81816779a4ebeecc30fbe3bf1f142978931c21a510dc7b04e9aa4c29f845607c9200d181ba23d85c958ee4941f9fe9171b56fb7e50b71b93f27051105fbcfbaa0c87644ebed398abfd5a77f0c57509d7803c11e231efe5e4f2957cc4a0e2c97ed55e476a16c4d6c14ea8c55d7b5d30c0a8168c581b4b8002cf5ff6cc257f73ffd6cda35d2cbe39a772c0f662a92106db7c2c9369769595f27317e7b0545ba035f71ca0ad678969644fea3188b587352fe4c54f9baa93cbbdc40477f9973df929219265e42eec0f00cf6e9e55085862c4c92be8791f0ecb6cac70cc2e55ef25e23a781b89ebb0d384d99366530a5b37a311a485883ecd3c0712a111d7f537cd682b16e925059d5cf754a3b10a235a5cd3a6794e526d9ac794dde06c7de1de99c4ddb4f83fe47b53612ae4a601bc1b795c6ef26c5e153b141df77505a780ac30fd379a705ff0125fca429f6ec03b683547535607349f79caa947a805dd3a683b1b2010780e912a293b841b30cf0a07389b3cef465d711c9141b5c194a777dc6127825d38d22f8a58bbd8a215b78fc02b6010035260f5ec13ec2907d98e9fce4b2844cad93632fb9553267a45ff345db69fb9db53c592b1f5b28bc3fd191a07a1264e9f83bf0245880a56ece72f60a4805f1ebf7015af32e29bc33e27d1514f0a2a88245df70730d8e8504024cf7a5f32a827f6d1d7b63880b0babd803caa6d2e3adaa09065a9842ef5fcbe2368ec547382bcca9f930e8b77f8568b30e48e2bb6612c5d43915108313a43ae0d811d4cecf6c58102d11ff3707b80ef5e51664f4aa466a19f0465858abe0b5709a3750e450b2a64211a513813422130330998a2910d70b5cc454fc3e0893e0240555c6425cad3bb25f50c2107541f97d6968eec34a332e1f1dc758adca4c2f7d91f3a143439a9ce35ebb877f5ba646c6f80aef5da6e946c375241a22616817efd8977e71b6392e47a83bd02847ad6f7284d62842c777fa0c52e19d265e761dfd41c7ba5824d77471c45838a5d9e5f7f27871163d2c5d9c3c4f867e341204c61855faf161001413d42b973d7272de64e94b5225873608c1e5b39929e64c8294d39db79016e86d60f1468f3b08b3052aa9860ff2cb7517ef9b37702c873e7e0eb1716423044e42005bbd96cdf31ae8ddc5b0f0fa7489f999cf33d1f2c19865883489a7369392306665f94472ac0af7e2b044aba90cb52c34e44105191fcab7b5df3ef7275f54c6f7c2722ea5ae13c0de1bb9a68b1eb73e658ce7a00bec46130c1419ba91c2167458d3c0abf373b5b2245aa8581d04e09e902b802947c1aad5ff65a287e25657a6fe2c6d42c887717a59ef6956db69c1cb4942b317593a699f045651e5b5a688fd5c3ec099b173c757e35ca52952b7eb52f564e8d0bcb0f2cccf68a03a781d3ad5f77d63073aa337f96524c435ff69bda42904aa0bfecfd6ed951f361ca634dddf548add11c0a033cd33ca4f034e19d96d58946f2f7bd1a68009dc5bf2cc87f267f7c9974feff55b41e3dfbe17db229eed08a6b091c070b212a242ba635781090e55cc1a28150d1f0609b -MD = efe28211673e7bb68657243df023d4b70c0e5325 - -Len = 17936 -Msg = 46cb5d391e751146ba9700b4fd5f36ae7dda1758d8fe50fb47ed0d6275786d8491e23263a1e7be331afd3bbfaeda19096636bd30f0d277973ab9b54440c67786226603db799fda10eb52eaaafdbd0585294392bb317083c7b23887ebfc7f80cf21df376a4ca54e25541c773e910fe46bef89ffc140df5ad3d7f0e91e52ac6fa5b7d336d8c3ff03ba7ee5494313d89d03df8f6a09c827e603d06b44a7e9542c510ccc68ed85b7e0179134c8812a20189522dd3c5c6f510d9fc631014c6b7f9e1a475135703bd5cc84b4925cc07ff03d69dffbde82dd64b9eee0c886d67d35af4a90eb052b8c5fb1480f866dc7ba4ff4c73f72b643bb68d13947ba3d0cc97f4628112040e4215f76accb98635f824625f66ac82e67b1663dc8228f8cb8f7644bfbef7b4e64a1dc03f81050a6507fdcb83f8788adb56664e5e39acddda0afeda70c55819773b5df407405379e625a1995eabe379af6836db1d2d7fe978d982140a369bc84d8056f1567d3d4b45cbb05a43f395f5ff2af8689dc00a922485a08ff0753b37b5d38946a1ba1af4e0849a9ce851d87637193b9554b3d57e6969eaacc823ceee5c8f65627d69851d62cad0cf90695380e3bd70dfd65b88f4b420c10905a4cf62be2e9be34e1e041b2918f360e08c6f9c817228b697396d9b9124b4131d8aa52b373b7d37984a0074cff9530f6d4db52f9cf1c3981bc02bd98d0044599447f8ae743089ede06012c0a3e6a0197b2facb09296e212e8a22c45042de25aee6f2272e1985254cb12a375615b4b1dbe94ced61eec04b56231e75493182e85a052cb0efbfd572a9cb43b0974d1c49a9c3f83f67e6b9bde2d01f59eb64979684eb54ad94fba18ddf9d762034ae49d0e886264a84d80281bbd94df69fa5c63814de93a68496917cd46fe90e9700e44e827b0094208d439fc786cfd7cbbab7d4f127112427584c497289c402270b94cc5eeaaba7a4ce231df01fce81d96c1175050ef5aee5087bfc9f3230844c970250641b520b76614a051deb717e2f837c2037da68cd2670c59b45b3551d6e6bd5e57c551b46000e615f3633e15437c7a2df6fd591085256d3304b545a54f550b6908ee22ee2a99f1031223f458e570028b9954599e7d1834cc2995d67b24a0e4d5b8208b467d8dafe85cb57c6b1f9f5b9b79273a7f20bbfd95a1716a6bed36d414d4010d55bf789d46218c38c47846ffbdf4ca7e4b269d122ffadc73d00f9353b6eb142b8486d7239d1f1cabed86036963bac2977ae5183ceb943b75400242de2c7bbe586b5a25ed6d83eb684eaf41233d39a40896e2c9b8690c12f1447bd1edf5f4743662bfe145382e7cd0707aacb7aadff35427b63e2f18d0f77a45c2ad0d93f3ea28131e95e57d4d5586fb6e92812d3c150c95c5c20b8b715d72dc7d50b796d864bff4fcb028ad8ee9ee4801af2a44dcad94799811d8217bc97d711249767f30986070d0cc995951be98deba3f1d7210018e3bb39a0f8b3eafec9c1813b4ad9ad9ac1f4147b2013457f9281eded54594d55c649eb73c29588552c5f53c0ca255cd1568b4be0d25b52a91cca60aec2fd98d717cb015c87c57fe4277302ef90e1fd71ee5a1abf54742caf534d64fbca13c9e7ffcae224ef49b5f3e386f68e441478c3b0eae7e24d66b9d95e92629e14a5c7cda6cdf693a42b14ca881f96658ec7b50fc5c21b0f663ae36f6521c05d47ba7cd1335ca5704b7383b13dc74c3e14019b9d556b1f0f47f790b89283e8010b5bcf3bcfff57858f27e9ef2a0580df81ca14b4876b5aaa97a5aafd0b3f40520a8fa852a13f7498155130cd786198117b2a089d834c33a7ff4d1886f8dd3217e95eef5fd2a3647288f83f934f63fd9caa2a5da1729514d026f5c29b82e5251a53d08caa89b48fdb8e25fe89d6941748b8d1fc067ccf64ebb5a89084d1e08121eeee687beff85e9acfdf55f6367b4edd4a28cd14c8818ac1536b6a880c56adf562bf691a2cf93779f52e2c2496a10b220b35b8157f33f01aa94838f15bcd135e584b78ce673f833ea51a6b591f8cb4e0a002a64fc86efdbe5e46e205e7cf1a23789b7ee1c850abb289acfadef9c6b3dfb4977d0bccb819741b6d500dd8e32a0e69b6619978b6159d49ebc1fb4bd76ee7edfa2791b29cac0588c66b505692abe5d4a40b3f9ff92bc78de0a9f73d454fc0f3358a29a39f1e3a4c58191888620571606e621a649f54f7fc91981cf99abc316f50901bc74bd8d9102c43ab96dda17ab61b5074f032f7f73e0877b0a45d1f04095120ae452740aa7b48d252a98be5c87db3bc936b3a7e8dfc4d2ffc6917dfff6842212c46bbbf7736b6ac55e9f33a225e3f8dc0fc3d5082de66a6486e4f64eb352a7ddbf190be06e87ebbfc7d9d095101c6ad43cbc5d59d8b5dc6dcdb8d168f17121b046f2da3203aa6e58f8d11b81e0d500364015975a8ac3a76ffd95a5db5b701e3eee71ad78dd438145543d8b14e2be6776bc6829869e8039dfa903ca123bcffbde382e0c3155d3b2f97c5795aac028ef19f41c6a6aae8c2251527bd4aa2cf1591296806ce807eb81e9d3b7c1dff3b52594a9bb00731537ef598c665c0fa98494709c0145f95deb6c9afce6a610e7d3a97b2fbc523c6d240f5cb97bb6bf3bea5c7cbb293e01d263d1815a5c98da2714d941f8a8f63330d0f0df6bf47b455ea31f9b7680ab8e1fd56f316ea240b83be9336db70952d3fabf32560699101e7c3f4c61507014fa60c0742fcc20042790d14662dd45feab155f42552bb22bb72f2f6142cba000d37fa5aed0d57e79a4c06d90d5cde760352b21bf514dd814bbe1e3fcd45a7905a5b7057dc92d1607bc350e911b1b861deea6b6f7eeef8361793f0d8d7a8f6389ed91605f7d258f44da8944c5c7487a8e54127f8a62834ca89b910c81c9dd081417a936c2717122978c1790bd4ed76d47f1e8fbf5609b8c408f72517826c5df2ab06909452a72a8a64d7a82d6363aa6c134a4acb77daadacfb17d7cdf35cc4134445b48661cbc69c7ab1c8baf0204ef80b8e0125efe43a0bccdfd0f356b62e6c75fea8493dcb0fe9201982bb626a8800ceb05cd3a86c8867e218b59192c3c286a4fb13e5ccef2cf8bfd57e37a38a800dc47802df88bdbf4ba58a31ad91c8a9e83b029e63f87f4551c0ae63369ac860a6 -MD = afc01657b55fffd0c739cf017294a8379f60c2f9 - -Len = 18728 -Msg = ec2f7852d0a6e6d13fd4220233a00d9c9c063d24f65e3b5620e1efc66c6958c7f378818c2b7cb08dbb51e02c8d08719925e71ff332b031b06327f23e7cce65eaa9f3350212eceb36afa263445e4c81d5337d20a10f614bda7443b0c8975351b1b7a77dfbae7fff94c6cd9592cdf5a4176cd12978b4f8f39efa4010ace58185e1c59c42c126bc546fa6dc5d5e038a412878ea23be4afd90c29e23f9318ddf67457adb6a9aa32c528ff7d6a2ef2893c2d100d0f4bcf8f9890f07f655a0b8f660a47f6bdecf4d5562bc62c44e8e63988ed8ac8c86bae773484dddc10b418d4cd9c57b5487a74bc1eabd8ead4883dc220d052325bf003ef33444ca8a035c356b3871179f4c6cc6f8545b25997816bcb8a7220ea389d52601b5bb745b2539d7dbe670fb531464e580065ecc91c68f2be3c4f5140fcb83c726337c833b59209c224c8ace78c9d9d1e36a8e2d9b1a35502acc48de706d5048e9164da0338758accad18739175211b1a9e6b2f0c25c51541527e113ce5685d2d3c7f77349972a2e5bdc2ee3369755ae58e494bd0b742b5e2c3d885c3170698c6bac42a38771de4a5bd74875e080ecf07acbfa3a804a0b97f8770761a2a2469f392ef5d9f5fdbc2a54299d961af5209e9603ad1228c73927003b25c928d46232c5b5dabc9a240bf3cd3af5efeede37e135f475eb0bd1fc35ccf2a93dccee076e98aab7f57ecc15d04f72182763237ae0de06196e32519ee9e5055c6495d97b7b3973552ba9de20e76139cee781ac31c419a16342a430656cd2da06e78b7b0680307a7c07244375608bf7ded75161a4b46e2d190f69549ae61bdb6f6db6bdf2a50626f330f6e15c645514119eda2b1ad96612047f8aa7847e496f5e9f1f87851442de844f27a21c1b48f82fe525f0dd5a88b8ec380e106d5de3fd9c25cdc209f26c0cf50cc06dffaceb0b0053389a33605d8799e2fd769bab71eff2a6c854c46a0c170f0ec7294b3fc6b64b911d0f65136ce8d22660c3578f7cac25ca1927ffa1ab679afe47c049fe625fda46dc39ba9a3d4160ac3edee9318b9c003ac72201c2d0645e834519410f4670731b7bfe7c1e58fb0c1b9faf99ba26274a9eda2c14f304762346cb1c7b9afa4fdfb80448f1c6467f9c1b8b1eaf52d5b5ca9d5b2f7e5cce05b0efe0b13ec80766e6c47efe63bb8e34d8560b13722021ae49e051128827b679ce258dc0d4c0f41b4fe8f2081824b8818a7126762b4d917a8f0fc4bd7a79443a4590d93183ab49d8e4cb674e592a4cd07817e52f2300ae8164d1bc179c7d01b0ddd9ccec94b18f046b16e5b76df5d3886bee4e269f62fe2c90ce420a355874435da86eda4ff94d06ad70752d9eacd5102b9e6c44ea9b0be1daaf5d7e8f35265c8fa4c8e1fbac0b4872821d983278d8d280d0446f4bd25d090c1c1659f03a9d613976e1eae1f1523181f3e7de72806635322ce09009307a0decbc7484a18f63bc24c6c1de4af1a829a46cdbe8a6ed06a1085947906ddcec5343387fe7ea5d00d3183b71a37cd49898a195009e16e6417ecc008155bffe3b45d8373f6a12ccfa10dd7df823c0c1a7e641155ee809949d3544c897c947c0ed4a7562bdf66303dbda3a355e445de05f7c4c95fdafc91ea42c395a90d34c488cc9e0610071232b2a98f80bacf09d5a47c08abce6d99caddecc725d745a18bea02ce2db10c59b6b70b4dfa6e90ec657e71bc3332050cb69d27db97a4b48f14bafda4379f6d813ec3495b7af1d8621fec8f6bea1b3fa9d7908a8d4591e842017433bcbe2b994d3d5fea348cd5040f67871b744afa8c15c0608b38ca1f4f6ec49e3b742be61df224f57465aa98b238ded6ac81d05068c4e375b08a9fad6869f0918b66fb7f7a34a82c5e6b4ead5192d843c8f114ad542bd35880df30ecb1c808168a01b7381c79195d2eb1f39370a1f656e76e8261dcdef27172c3282dba0d6d65edd0e9a0a3340b106bd633eb8dcacb988e36943e7142d3690cc2d010efaea337fd510d597cf9efde8c448a060781aa813405d463affbe8a7c54ad316d1204be55f1e9cc3283f5a20069960837c6b15996f48cda1f76ec4a632e7abaffd06b9f67976026e2378bc7d612141d46aebbf59967bea59d61fd9fcbc15c45cd1d69ff3d303f8bb0d3aa95f3298b8894197ea3a401bb4fbca83ab03e751b7adddf440660254ca5a23f9834de14c3f029ed438c402a4a818434eba643b27e00390045db57dc5019c3639dcb1f3d84fe0e1452d7f44a35e3feeb58a863e04e80e966b4a7aabf1292182703823f0a965a4a74f3ad49c9421c31b6c8df246753a1f3fbd991e2355cb6ab741082c5e5c0abe5f76e36c60f3ad5267e857211b0550c61a5fbc286a5f42d83300ef33935cb99e8840a99f384e4b5e329d58aaf211c683b4e64611e79a3a0a84543fd246180ce5a0211ff58910a6572a0014f88236f5e87dd5a97321831b72399f8c60cd3a4ef435bc98f7e9c728cdbcc50e8231f18964f3a268c4bea6619fb1674797cf202a7ac767b72ec0fe5d324940c7e087bddb79a4d1067f0570a6f38a3013cf926619b9c3b6ecf2a502be257df7b38c0a1876a71fe5f51aac7e460e327e5370dd788761b92eccfc1c90c607b97e73fd2f7de56db355d7100a2bd95028c69943f6d40de31633b9a38e050f599a396bac6e7a924e0da50f07a505db5a0b9d5781750517be796a45717ffbe4ab8ebd1d225d7b27b88d581f5a0398c69c296710d1ee983f744136f2fe78d2007e057dfaf7531bf04dc0e38a9fbc61259720b847bdb9e9ef750c2e4492ef23cd419cf0a78415c9966e36dbd33125db62cb70058ead7d86926148c4bce7795da576c3b98560ec0084aa5db57bc6d68418b9a5d33819800ad299757ebe547e0c43be083d27066c5d3582b3e4f6c954d7c1d210a5e68a87c32abe20d0db7283ac1267e8f00efd0d3c4377c80ed6a11762c8b56ef21c88fb6c052fb94f96ba10b98c14d476afad552a190a08779df69491c7c41f5c3c9d3141fc6ecd6f72a3bbc12b3559457bafbaa330aa03d3bf226301399e9028e92fe0016b0bdb94f1c7cb3f7a49e5c1156cd43424e83887bcccf92d88a56ffc84c98e16fb874274868ee590f3e3189def7d086960351528094ecd634f690d5ba1e271ff0851b072b3719162126150107c58ed9f6d2138293730666ef85a06aac31352262c0b94040b08453f70752aed3e78ea52b63d000fc91a4a9d1e08da8e6ac49518c1057bccffcb7765787f1768c865853fe5d90b403154e07a2af5f76afb8ec16381efc6220423ae90a4ef94378c9 -MD = 8a148c03dfc846b484ec15809d9cbfaa4b74a060 - -Len = 19520 -Msg = 0b6edeb5f06b22773d0af727dd59bdf552a130004ca497bd7a233d9da0a325eaea71faf280e445685ae2e30756a5b57887bf9976d05c9930b2c863ef6331f9f820adaab4c37f410e98967c1d6d56c003e89b0a151efb293c604c2b9a58661571562ad741e4c47e31a02cacb04bf3455c1d3c6c235b09aea82cb87ce8a9cddf1d33f167e3093b659919af590a1704ae4ccdaba5e9b20c903dbd13401f7bebc0c4600944df5b6d5c0dac246d71fa12629ba0ee9faf498e36c3bc655e88f94a212d847a548001e1cc570195cf2e1ca4c911400f40bd48160a02d0b6be6b48716821484d810d231f1e3dbf096789a4424b765215725ad82d73c1a20f481093e8ff685489b1cdebb0b8888f891dc9ba74509181091ccf2159d9cada77e4be00384cca4f36ce097f1b0400181cd93888c3402b72f226654a25a4e31ff77abfb7e8b90fe15dbf0a07e8686c03ca831c33b6830cd0d877617b163dd51996f259e180acfeb3056c15aca04e95f79b03bee6d681fc41c4f90edeb60a67715c34d5a6888f606d36bd7595ca1d449d984166c7a9a3c36dbc93b3988c7463cf51287b2d89c9fdb7f89a70ecee3d3f9dc8265cfeb94f28fecb2d97d420e48fda7eb7929f0bc29d3754eb50d694164e9e3498e7b48eeef599f6b003b8fbc0b53beac7642394e2089851985b7d45103b48e2805011aee9f0e847023f6ca4719b9a9d4137e2ae910580f889da098893cd44dcc7e03ca3a6e293c50c9319a3600a9da00e5404e0375e9850a714a2e607cb3a2a53dc5ef58f924278b647e781f4c9effa1403b0b23cd98761d8536ee6d4fed1d20e8f9e2a0bca9c69e9a2fdc594a236b33d8b0ead083ff53305dd9810622eb2dedf4025cc8150499f8bed84f7aa5b1bd47036475803578ccf17fc46ec19228555ad361a635bedf2228571a3a09dbd4564954a833c96ebf13cf4f5a10362a4f14062baa67500693ffbc0738347d5905d6b9310e9df27c1cf828613d0dca37a9ea6e514f18cd88cd731233e4b74ba9c0af254d0a2cb20a3ccaab39dfbff456d358f1e8c222f4b1e63cc951924afb4a8f5ffbfd2d588e75790ba65da4cf5b1455e04f56a62e7c1e68ad5004b36812b7ec59dbc5dab9ce6a5c4bd8313e9454ecac00b52f5d83aa2adf5534b1da87187e423d133ba4c91835710b8f591fa7783c404af1d76adb2563b4b4e5ed7a30830a3b7a50c32dfef28331bb5a399a814bafad1f53e3508d7455835cf21c14ecc8e8328202f0b8d3c3c038ebb75761aa35a35d0e79d7a1230d8cc5bdc7c22d247094b1f4a858d7d02278d10d3536e7aaccb3da98c238df245755e6480574456010ac5432cf402d8c8509a4a0425cbedb774da03ecb6b5d19e86d8f9c09a6d0381f7b73dcd65b0c51721f1e456d3d39d4dbfd486103f3cd7c47100c1a62de6014f3aeab436c1e06d76015c85d145cfb2f513f2dbffa7682b3ea09f6539f8f777f33926516deedbf76d58a1d57e63065438d8fdaac1d482f694797c8c81e3e78df55e32bc7cd6e68c848f897e6416c2a99d77be9a5fb0d15f4f6661df87d7006dde10d89c6a5f4c54440cdc258b4449dcac56fa54e0229f8ff6cd140552ba883c36b6de994073537634386275fcd6e513edde7c804c1132ae11185ea7ea76c82583ba0d5c05f9451bdd7be213beb5db76e9770bc5ac67d4e328ae076d58f1084e4f832d8dc1d9686ac53e26aad9c7762f278a6ecb070bca56c4f7d7fea31590df217906d47dfb058c76e7f4e056f6fd632f7d6e3b65e55f306c5b9603d3c8a70182045fd7404763a878e0155d3c29b73d8abad3bdceddda99a9420b23f1f496dbf98c024112a5cce7518f51ca9348ede2bfa765f84bdb82b80214ff070480a6970e79b5b8fbfd86718b5e6fcf643ae87d56aeeb95e3c7a1b6ff393a5714541c5a493341e40437da6dadb43913b6e9ed34d8362f3b9f897dba281a84ba2a58434f33226e6f343b100340f8753f913c472fcca6f79385095eed061da5d84c74629b53af03fe94f1705dcb94ecfafd1b3c97ba680c45a0308e7720ab645a8590c0693140ca3c2a4142a0d6ef66ed036e16942ae336f8f5e4547ffe2d8ae8da94a6df563f89ce0014cdf7ea71abc0aa1d1b4da57f3c548e0ef72d2909df2955685c254912095f1e505a888e82821afb1194ebb2a4e8037297c0aa28a92bc6fdf42a64922312958adf317b4a8ab4a3fc30c895daba00aaa965f71e83733666da2158c4bad86c184ea79af9a6f10a04b7630174a4294df43c62e4b1c3d1c8b2f5d52d6c489bde917292dd2a2b1f49e5349385b0985a97863274ce896f2aa85255f9f285c4d331a8fc874135607d3ced7aa69e703eb3a60b9385ffd10fe59fed0276f036b7e72d04f66d0f42cd71aac5918691dc1f9d4129677cbdaf2c6c752b05326ca8a8419a4e672e907bfb645a158119a91ec2813288b741514b4d26f2b66517b1021f48402d58b1090671bf158452492d5bafc53fd18abc03cefa7bdd332a0c066da464e74ad0dec50bb7e8a3ba0dfc64be6fd331ace9d51a60bbd3004d5df8b211c0fd564cd79d0bb35649cc60ba1c976c8911cfc0db74e028199621aa05c5fe15fa7b56dc75d62225d548581e5f900f9085e9e3b668819b4f9b2c09f22a5a32a2db47afa2b371538abc4f0e9b06401150ecc2333598e494fccafe80ced49f96dfeac729459856e60a94c5b780b614e8d4450389e6748513582c724ee60c7c71f5af648b6e2d6e23cce4121b7478f4db451816ab71034c5f8b4bf13ae1d9d90d0bb2869fc4799f51f9349d022053c831cbee62617d4e22c2bcafe40d67449eb04a7c962bf084d2bab80dd0342b4f78338d4d4f75b25bed8214deb18f2254b3a3da94faf89956f0a432f512783e74ec29b4c045adba3497e8ba62c288b711002ee2821cce68f8df588f76cc9801cb0d5b67ccacd33ae1063cd6c37dc0d1836e988acf63750571891ef618645a1b5bc110cffbecaddd6824c692874cff16b3e32bfc0236b417c9d43d8f624387352cf19114d46d0448d3d7cd1438960c2ea8482d5da3ff544608aaff83dcd1e7f64786275ddf989f262a099b845dc2b0c26a86e7d83a251e3c37f2aafa0e764107b36618d2a5d3481d73a1760b7f3ab37a0283a1925010d79e5e94871b819b5e0f787bac9dad87c5d5b887a7d12565ddfd7729a3b66c274a178377de0fbca607b79fab2de37f1ddff800a376fdd7abf5f4d15f346a17d43e4db085f7fe470102a72fe0e1cfa4fb5e2b54dd2ab71e74c506190c9dd6d87f7ae8eca5190fab12178630011286a38b0a18bb1d0d29802813dc561a2724378ec79140bf8e6a6f4310fdabf606330434ab673d4b6578872fa81d90701779bc6aedf0b2bc9c381bfbb4b3a6a705fc505d08c0e24f7bcfbbf24c72cff6b800f07bb4ac4d828ca138a1ca512cfc59090e70ea -MD = 8ff89c859a6ffa3d3874d3d1be4125f9de62c9bc - -Len = 20312 -Msg = b0517cc1d46ae79e220c9ee73a2a54d67e6da0f26834f63222d9d665503643d13067771be6d2d56711651fbfa21fe9b9eed24e540227e12436e2e6af0567c3161b7db1f8b053b79315c1d92c8ccf8db15d7b6e9e26b7341d73b2e4718e584494991c921fd9f5756b55a634f6a0432608f3f16a967eedd76600d036749611af95d0cb825a0ac0f837fa9f98e485829d04d7bba805b2d0b34706c44680c398ed5feb12e96febbd263f2b316dc0e494dbee326192b26a68ae07ad177b5dbdf7e53a10792f2723f3e8ca11e61b506482c70e2b6c8e674dbeb1f01c503cd22d367e706889bc4a5b6b2721d3450a5dae5348abeb6306ea03d9a5487cf7f3a8bb5ba2481ac9f9a03a2bc98d9bd6a3ae690f480e99ce610435c27058f49407a70e7038094ec24cf0693db7548e224c0d3ebfae805e36077d8b7ffc68adb0e097cf7c27fc2efa1e048fa8dabed6b06e40d56a62476221601dac1a2fc0cfd2e640a5885969dffbd8a2557519159b087210d5184babcc1ad4ac419af3a78183816a399bb5988c4de09363ab5b9f04b3be45e7d153f6c4a6cbf1f1082f67eb4a19dc33bd23d05b76a09f60528aa63a38bca7b29e616e744fadb5656bcb4636af165f3af68b5a74007e8df5738d70651fd3fddf865e5d029ce2c044cbae8d8a3ae0bbf64fd57e0073e427c9154c45abf16a11159230099615d2da3731c2830e74dfb810cfea84275539338540af6f3735eba9fdc9c0bb5943e5cbe6a3ee72ebe47b1d307fb0b41030e57ad0fc9e352f73bd8e3e33f6ba72ad845af82c1aa048131db4fd651056e48b50c4535201debc34488881d8ba500adc155116d12e564e872b43208bf2b1caefe2d9b549c0b305fef45f6ec1f5c349560276e79c13dc25ca0f9340f93f0eebe303809feac3fc335c29daacf58d5c56a5b1921494af7af4642f6c06b6ddb56fef1b83b93cf2016dd34fc2e47c6c635a508c6c44c1eb78e3dbf5961acab6ee7d9b92a8aa473609dcedcedfbd5f78207ce0f9ce202cb01d1cb9c8d8233db1013d70d0b81b13755da7310ef9e0a59bdae5dc627e4fdce4b3c4850ffbca17b535d8f53d7ab3a99946f82778d8f456bcdbbccc2e457ad9708006c834c8b661acd476b341b81b10880af4587243a27bc3692a39c5eb492c3dcd08099e048f237d243e304538fa502cf1c54b6504921a97cd57aa8f3863dc32e1f2d0b57aff63106e59f6afc3f9726b459388bae16b3e224f6aa7f4f471f13606eda6e1f1ac2b4df9ef8de921c07c2f4c8598d7a3d6ec4b368cb85ce61a74338221118a303e821c0f277b591af6795f50c40226127a2efacce4662fd7076c109eb59b18005e7165f6294a6976436ee397774e0df5000b17579b38d58fe0e1b5a2d1ccf329b4fe10f71e8180fc5165a369c705f6150f8c8b20d8b7b6d64cdc0ad69f2b8373e734055a2ea90575c5658610dcae483b50b73c6fc4693a74f363f681444031a6a0182c67804962aa4a7776d3ddd16b2d6a96138c87d8ca307e8164edeb93638986b46d663de9fe6086a25bf9f3f7c7b40631f8be488cccd3953b3960baad82e5420fb19e8c12416221ee1bcb45a7c497cc8ed44e2f0caa25df9b5e23d915f7827b31de58964a9377c4639f91fc69caa063b78d8465e0caee05a8bb7e71532928da23dedc821c5c66170acf933fc5419574b40da8129096f6ae6a38b8aaf07f9f06ec9772790d04f8c1ea93183744913fa68b3a025da4740583eabe1bab7363aea894f362a3a7f3f56b0bd46a0b6d2266a246feda6fa5cee22c2f33ed9d643c1f6824d9f327719225bc7678cfe4c85cd210ed4077701b0b5650418177a74c71b8eda3306e2ef3474f5d326990eadea84a9686e822878c932997298e01f2b16c42e019e21bdfb67b3df5478df444366c97df1bdd23dc82ce23abee44d3a61e9484e88ed642634197b52dbece451b59118191b309c29884240b31988934ea185148ae0bf42be11c0180ad9e13c996cd00d055575347e31bfdabd430476ee6290b54da97241e82d023661cef43cade1ca04cd20ea3f9e4cdc1c93abd65c7c3d82a71133b4e626ee4642e22ba488e1acd58bdb1e0e121c425d82e0b47cb88a9ad166701fe5a40cce02ba26806095e736992ea99d5f507aaa8aaa2f0d761f8bf3138fe4de83000c44de28896db6e811177b59c33f6c8f3bfe09fed90730f612eebf6fe9f01b9ea80b2f0a954415f411b7f299b274a402d2b5420d69526bd091d64b92e9e52db452597bdcd4841c4e4ba0a55af1cd946fc158c9326a4f55339b522ea57f3e27f5bde84b1bb1de285b3159fa3a0baacc3aaa51162a568eab9391eafef4146b98e72d102343d792d8bf655c67a35aaca9d7d056af31b860cd7517f9332b43ee0eed32698ae190528bcf5a1074237943bbebe5a1fb050a96395c900541978835e89c606cf871868dd01f722eb646f1f080cb4cfb9000c77f8dce8cb7c0e54be3b4592992e27024a544346fff946a2f43871a989bf4a1698d292f80593781297800c81063df69f5594682861ba519bbbd3d4e3b3b9f837b5f9a13fd91fbf78b534c5d976845db72fa559e670b4ed211be21cab732f71377676ef066daa4a4fc15f58e3108cc211808fffc7537183fbbc6c3349f1aa1dde82506694e9bb835e6209ace7fddc8e76f15a4115337979f24779000557b264f3828fed3376dbd16f413bab2d64fc2aae290f0616375239ce64126b27cacdae401d3c6b293c909c4805fd3cfc6e75fc81d1b6381488862957ba3d5cf67485638bfc5ecabf62654db25755479e42ce6eb79155be554d9db354f204bbbb7d61eb9dc6fdf13d10df4a75df4db5590a8fe71710f68022af1d3e8fb36f70bf0de9ae3e2421c8eb7088fc5944ec6c76eb41cf6af7a066c2d69031cea68564474aa61535bed33710a7e7cb262f3a553c0f6b8d78ed5c587fe97df6da734e7d9e5f1f864c3b1a26f6e08420a3474058f59e958b099b313e9f116df47bc1d2a40b72dc6a4944ff7de341e8619935055ee7bf4730e5a927006b75e79378381ac2d5ac662af580892420f29af8d1a0914d5c9b0ae4d3be46862b3e733b9b812dbd4534442c1898c003f51c224b1031ed0f9a5a650f9d8297b827939954aa44137fa333feda7a33ac03a9e709c42190208ae923e119099f217fa69de2466e28d5ee37d01d9be2fa560a867ad6c9cb6432a8931e046be0baecc1f283d57aafd67af4483428d61a94c501d2fe11c4d5552c4fdf75596be97e0168516efb5635f60a781f86a7f5e8ab01d1d69a431c080d1569144d6582ee90675a0c86da43c72f8e6105ef235f15e41360da77f3392c31f5dd7bd1b218b59b26816af2fcaa2f290c994097237c69e9029826bca983096cd5935c26c796084547c3b5dbe9f1338d8f0718a52fb4ab62d6600192ed626663bc73ff772c62ad36d10a336827829c031c93d741cf6fa5f6989fb521483e0cc1b265abea6ae66c17cc3d2ec240c33132bd25c3958c151d4e4f3f8890417fc42cbf51a9a708890f904144ec10bc1ebcc379a526c6ed0edc120327c308618d544cec1f42d78eb25c483707b67b21fa -MD = c0af54b14db7ef0c68b1300b7350fd2a82fe96e9 - -Len = 21104 -Msg = 5e9d7b803f8a40cadd83200abc49e7ae245635a7d1c2d16dec6740443a4497bf941f8d82976ed44b9c78aa34eab8ab322b82e9e21de93e858adfe1487a9e38caa747edd831c9447b9305ac34d630948605787fb5e0ea5bced4930ee72be553a8815dc40a7763375fab724e93e7784ab1988020a8828ecf50b3caf0a8b5e18f6208a939a1cf045601ca06bad8845a76bbcee1f4446b9d43130dceaf13815a95fe26727524a3734968d90a158b179cc0ad8de5221004df5e20cce572b0f5180c87c202a01b5a79b79cc1c68a340707cf8ebfd2d395b31bc97ed65861087ae29d02c39fe10e5cde49a668823e5cbc634c664bf12e59e11b2b35156fa6a27982f07913926086116aa68db8865c8a9e78de3d198a5ce6f7a52d4e6f71660658beacf39923460be1e4765998190a47150d2e1c11e584c45b8277d0cea8ccbd815f79793d99bb2334166312ef85701a89ece30a1b49cf79777ab0c3195afd4e5a2d0112e73ee65872c613c1a710b88b62dba6101f00658fb254802f38d024414defe9c67f58f03103bd2e6ea703072208a31f3505506d8e73da911d1252671fc06fdc9ded3000364fc35d1fd7a68868e30cf581b5820ffc24d288949127ee6f1d7380a0190e3ff0bfa048de1f4060e45bddd1fc17dd75632c05109d9c99e2b9cbc47dd6ec39d5e6b91b96b2671bba1fd9e05aaf14abc44af33bcf3f1bee6b86322a7c484cfbe9a0a6fdefa4977dbc9fc3db39a19232273ae13b6d82f76fb05cba6c25fc229aa3a7ef0efdba97af8eee839715da7abcc4ba5ecf936e1664dac6cb541ffc575f2c82fa1665fe4ff959947fdc9763b58fc352d2bde90c61151049cda81350d192acb931ddd278a8a24517217167432af34d8aa5ce1663c0c97b6f2831a8fe7a7b4ad5fb2aea2f88f47901d0202c82c0328aeb3fcac37b1cca43bf44b7871039622f5dbfc7552bd9351ed9f3af8e296193a1fc0879975d5b5e8fc18a02578df58e83d9e77abc7481ae5b28f4e7373ff45dba4569a33b1067ce87fe60d9c17e98486dd2da0cc7136aa759753a90cccc60d9ff4fc80f569c266255fd2f056dea09d815cf00451d0f7a673f482d72f8d98f4f96a18e86910a82611e46604f02d93086a458c1ec67709b3836293554616c6806a7c424d0946162150d62597c2954f59a42f585cb4c3eb46066a1ba00af90d3485b3ef0b506a9adc447d884578961405b162fb4a87582ac28f637243c8b4ab85bd9995cfd8feb4db7f73048a7cb0bf912498db64c89446dd80f74dbd19da4ff884a5ccf6fd82e293643f30c33965708070298f37f318adeb8d8df47878ca59117d610b1d4897a298853a83ac4934f55826ad6d408155ee7107a00d12500555450a43c69f44ad735f750d7392269fac9cba9d1bfb1dcc770271c5fdf75a3bd317bdd686197c14e35c962097115c1604a29e6111d402fce6146e785db3d1ae410dfa81d008599e61147b0c44a65438ac1e64a1c577eb579a2b503f92b4610d3dac52ee1ae8578a8b1b963932cd9967f1748fc7cd33317d21cbc974339582b907575973fd361079afe67a2fb7f3b6347329824b9fb27fce1b5a3cbec6b3b1325cb370abcd7dfedc6de989686ab5151ebfc1dec5936210dad56b1c87b2bb67199c353afe223c8d2343a9667bb18e409725c217ae6ebebf23ee82fb678e092edf54410af381de360ebfba73c222ebb32e439eaf6e8844b529c5165bd6bf1972e4038b832462efa3df307143d4456a0754a7dc189e5680ad5d07b9b03ddc88ddd8286915f95bed31154482594a8f6597aab0fee5b67fff024e14c19b356cc3ca1c416e45fac36388516a52166d778afe80fd7b993f5b1c4e7d7ae26f35c656c230dd0f85a13fcef40420552de57426a687ebd6a5918e650c5ba880ceb79fbe40b659c1777537ac0ebe052fe21b2be52a101a948d756065a6793c111c534f66d00d46287def317752ef6736e5a6f522e3c9f839c323a79ab7569437ea615bfcfaa630a91b87b3ad4b08e50eaaf1768c8e06133ae9549a70b9645f59bb8a5bcd2b2197c7d2d744da71aafd1b9483167e6364da1c6260df941722ebfaf236b563dc0ffa0936465b7b41362de254e45b751e56eb62c0d0dd517b22c89040ff0f5da7b1b5e1b86d6e0c444ae5f74e9dcc0d196c9582773d1a453fe473be0a3ba026f8c779f5cba4f309e559b3cef407de92ef168700180e2cfbefd88be8c0753e3c59a1b499f29590f0ced315dde7cb09c2f9d52e7005bc7bc2058f6f850644302a44e0d462cfa7be5d4b479aa89c4fd419d438fa36d2d08d541b79ad273e210c6d450577c4b563e1abf547a0c3741ed3e408a288e901d2e81e8c07a343fa844961c4701d54465291695723c69321b07fce01b248fb054c027df1ea007fadf66dc45dc11385e4ec4411eb9c8abc079d3e3459d8b8d16f94631ec771431edaeffff18b6918ce23a970421ce25b82a83da5c36b965720b354806d874dc9c603e96675a7e88bb18502bc5685c5b7ab863a3cd7d17bb25d5304f0e6abc022e9ab6b37cd6dbffac48b907edb90973d7b13eb79fe05e948ebc11e2b16cf88ed1e53fdfa55376fd47ba9cb3e5dd7d74b95f3f9c3b2837f9950a018a57a4cf866c8701a04d98f68a74b622b8149c616607088bdc071d49f1220527ce68dceaf4e7c92381d96e04ae1b83739de1bd5d52a9f54dff6d863d841df7ac364cdaf0df2af3ce07b29d4872246ab6eab60a183f866eab8bd42cbaba6e26b74a6b678a501c4d29bc40ed69dd77b31428fa493b3588bacd0aa4d8699cfddb71932e4a604ea71f5d27eb2610f8fda6b4de14436d3c9623dc034450f131b25d0198fb4d19e1b2b091d01c0fe4ca9c8abf946ec0575d98ef00ff1e5cfc8276f690e13b365d112649ee4039718e5b3da95cd26f88a19f7767608599c62f952fec46f757ced6e7e9329cfeac14b5b3c949b4217f62f20b19d3251d1d553474c7884a61b5dd2a6ae4b3c292dbc002db26b3ee080617f2a7677b764f12d0b3272412c5a7bf2b01a3ff148885303d1cda3e2f33106c704a7d49a67ca4e10053b430d2de52dc7f0498239c175e1152adb8f704abbf1a32a295a89e5fa3f0adbd25d10fbee973a2da53369497a5e8c95a7d3b7c7da07628a1f56aa946d5a89e9982f1138cf4ee5d2cdc214430e31c68cd32f1ddd238e919f0a7791059c0719d8ed1772471fcb476a239cdf4089e15f8aedf0170d111dccc37b3bb1bc2eeb470441c4b8b95882db5e37421ec4a613b40a48a527da3b2b50a1d1f1a11a6e7d7e0646a55901f20c1e4989504731cb1f60a583dce4c6fa3de9b4af57d3c303144b596c47d7a384cd8c968a260d3a618ae1c72ff5c245e6dbd47673dcbe2855661b78131ab930795da2efca51c52111dcb3f99d9e44f9897bcd61cfdee4cd0de98aeceb9c721b5822fd9fba520398549b53b75d14f1344a9410f103fcdc2374f50612464b96d699c3f920eab54d02922d4d8aff283b98a2bb6bbec0a508be233f0992c3b69bf4c697323ddbea05e263291deef41698893a682a257675ff1fa11e21e8e45bf5f867331530fe6ec2da4015214dcc8e9ca87a20d8cfa5ce23aa7728db8f18aa4943e42e2e94d2b2083ca1580431f8eecc58ea5bf417cf4c1af10dd592ffd13fea79c5cefae3e9624a9c0f88433609b58c3ce3900888734e4985edaae4a5be7b7e0c94bbe6a8b2ee0e7af32c4ac -MD = 4c66ccc9d6a9f1d988bb7ae0fb41be3a1e1a648d - -Len = 21896 -Msg = 54ad09ead61540366364b6f311e3d9e3736c71c31bda3b695cbed40f5554d9ef2ab54d10954d3b5f9e909c01a6e97ae8aaf356a4c6ecc87cf86765be2740e55364d586966f73ab677d0fc97a383783f50848143b91e0ee027d96a0ac7be9fdd487777b276d70d97588490507d0b53c3414d1732f839ef62371b54f825836699a1d02f569952a0db248a71750754bedcb56f73b29a40f28065e2b38e7c70f70ccaedebc04f18a8f45448fc9fc2fe1dde2562233d0fd19cbd4cb602484ce5c5c92c07298a18978a657046ae1b4065f55a29dbb24cd95a529b441bcda0178057315dd2851e863dd9b1011a1281f03ad9d32b228d6c7759c88cf47a72405caf3fe7d8c67ae80899fb697f29a66e62db3fdbb1dd31167a3e4314d6589c838ce0c44f25698781203a83f152fbf63b08d5abd6567229d5529676c5523ca8f438b398f9bc1217745d7de7eb15177e62629882457177f41380f0b800f0ad241ce096325a0576b73c20f2bbb94df29b9f00b267bbab551c6b85bbab7a4a109a68051704f2aa0de3430b3763de5613fa2b53b1d0ab5c900f57e175b573c70d885026a4a556123e28138c9a74dcd60206a1dbf531971dcf494324ad6a9fe00a5a8fb5cd77f6c68e024825ba533746334d9d2a1b2f01675946b7cfd13f513d8d9d51430011573f73ee3b5705a3701f2e3b679e921d7cb1d4a440237f983a381ddd5f5edae5ea05966877911ada19d9595cbbd9d8715b85b7ee56f00729ad5811870459bc8a31915bed8784586b86fd5b2de43c7cef306b7961769606683d162f16dad43362c06b3b09d5714cdc5a039a2b8b66eddb9ddb9fba29860bb87c0abd296d4ebe04190bba3a0c1866a10574acd21bc9b9caf64ea154ea6075aeccae522b1639eae2adfb6ffa75ca446e1bd8e9ce0fd55f31cc4d14ce3385e2bfa169748870161882e1a2c2b7bd0754780fa8f75bf23a4ca4a24f70928f96b16fbcd49aee0573e569769a391e4c601563435d5c184d390097fade2b2e68e3804351684bb840c3c00abf5a598a9e6515c4796e6e9f8b7229804871cb1e5a2cddbf11aced73ac9636eb3e6b9a894d76c3fff464c53e377615f21d92d6ceddb30857700b26acb36bc89f66468296b425ae9a56d8f690dbb56471dcb9b4dc6e16be80ff1b5dc00fa4e37be963883f7ce2440803235923d2a07364287f0ba375d86ee011561969fbe226151a4b31f0024d12edabec8353d6c7e15d632b31d0af7877e94933dfe70293ef0f8b761634eeb699af939d0bcd32ac3cd22f76ddd0556787f1294d17d3de4accafbf7c9b8a8ccf56b26cad38ec80cdc446efca562f12360dbc13fa67ccc9674d9a28b7387d76f7c8ba9995b13e3b9d3640269e31495054879eabd4361e6e89c03359be736a47b06e1cacfefb3eedab0142567b05bbba53741d435309553822e32fb51ae2fd4999c55d19418d6af16793b201e929f29aa351bc9d0f681db0b314d3dd34fd8327044cf050f5ce4f01638c33bb51348a8bd4bef0fb61c8c462cae3c4349529b85a90837b06946457781f493be54bbbe00867fa5ef0e2a1d5b8cace755dc40df94ebf07518c95b610c00b693f1251169f9acdb25b100a99ee3d43336bbb39f0b28df0372855825a1793b85ab1c4d9db25bd867579db62076a7ab4c11bcf8fa89092c4914413e2b6b85d969c386f7e7ffedb12a24fb55170d6cbafd60a2d0d6c0ff7bca4493a2f528f7836ac3784978b978e02c72120816cbfda8500bb365bd18d2748febc2ac0c4198e091933a6bd749c40c752b2bf5a618211e4dfa38df36f949be9fef1786f71c3099e51c14868c1599de0e358e444e5c9fc4fb157866cacb2e02023ada553e2387556e444ec22087bffefe7a831e97ff40416245bd20fff647e7c1b253446abd64bd35f42f461a06fd134de052ab0869cc3e8a704d3860e25d16e341c978025190784115003b02f91dc50351421229020b627c7f71d472f8373670ce861c8e49d42f9b8d0ac861cae5be29b49c7c8233c4563f5b711dbf9e9ff07140d056960cf68a49469216bde01ea3c7f0a9109c62c1c1dbea953ace3d5beced81f04ea302be305526e34da1a3901fe3efaef7fef9c84c59162553273e34d1ec782e2e3c93f6cac6174494927b02d88798f658305ea29fc0c668925307f248760dd11bea2764ffa500fc131ad03d76bad3c85cbbfb176118e2a71dd9025df89428233f3426d278f9c854f3c00a0aa285886b2a2636ee3a69512a1c41963c8a4db16ac2a2f806ddca59945c0c912f04ee9f28ecf979f1d4bcfd39b8142a59a5aa90efccbc05c8d5219a047587ce7443000147c7bd2be6d418cd1c18d8287af2b1aefa830bb6e2080573eb67b827a307c09410e5f9b396e586a91a6618f768186cf1d21216711a1f7ecc9359280582fa3841ca6e357bc9ad0d797dc759ffebc0e342c19f659f3ac2948d42745dd1dbc26ff1bf8af9ea46d4b5258b6525a8ca921d8a0d5381a90898509f41e0e1f174076d8a355fce68d70386968d68035acf3522afff55f1f54d4ab9e8d8c43ccf15723bf575183b5d42e289b2caf87c7dc052fa9bdfce3dedd07fd7514e48f4d188aae01bc7dbc9315018c5628c3b17796690ae34f5e5eef85be0b3c2ed969361945864e372d0fe4dc94e428f195c5cb68998446488c38b7db4155424fbd3a1e60024d034c0216517752b091fbb81d39df111c711e28f9ce6a4c5c35dc12aa4c895b52bf8f7f383f81c5821fcb7d3059465a43c254972aa9af398065787c1266e1bb47d166071e259857c920c58797904aff9ad8706943c01693827f895c0ae425ac8ce7643c009a079406539e59bb75695b7211f611cda83ce4a2d2a3250c5ab199a2700e80b8037c04ca169a56348f0e087a1d5a1320c88e97921d4a799f11122d28f9c9678d08422474e86e1f7b33c5810349110005b78836a0ade3dc2bddc3b170f32972f80f167d97577e27f80a0c4fbe23bf4ab4ebb64c8f02f39f3ae752d11aeaa315918e456ab1d24ed243886edefb3bb965e6eb95439dcb1e6564e42bf6974ecad1e20c7b8654e754d0d62559c95b0f93e3f41db1b65d44b8b1024acbbc769e053a5210155af1052486486759795e0de3476518780f6e3e56f4cb81ce7d2966f6a17a3faf52f6ca3284e2c4ea6964c50bf2c26264d910e68db3093f80d33027f3c9b2c1a6090695033f5dd489340fa382889462148e05fba17e43ca9f392b5f90f5a46c95d781041b28120cb253cf47fb8b43bde3a8bddc46b913b986295b8c62c7c786fb690685fec1a7e3f2332420bb4d68dc7ea3a906e1f5f192c21e712ccdb284a74317f79902be67e0c56c9eac66716c243229481a17a755dccfa2ecbf56386454097ed4bbdb510a89a86aaf697189d64b9a841b743c5fc8fe2b313ec280ebff03baf84e7cfd4be84517a7d6d650e92fb9345ea3a3d491b38d5153d7c4d22fbd4ce43e954accd199b9afce9581a921e0d38c13713784bfbdf0de855834be861775f19c79a3eeb4874dbd296be9dec692410e4cf49db16c30cf2f4020a0ca81a6358fbc4c26b7573977dc52da7d6649ac783765be44df19c47ec00ed1777aa4d201faf88d21db2c48de99d561cad42da7ff93e82edb823ae1963d6bdb5743523341efdbcd53beb61dd8622b8230acd50d2da05ed6b03f52009bf3c1be9eb92c429bbaf08d0ad69720fbb1cfcc7d54e254a8e93436616af1ba068fbafbdc40a5787608b13cd5b7120acf252c90df60d806f7db02de7d999c664c6db2038e7e305d4745b86d32d4e923b928dc8ff55528ac8102453f434fa4adf41a317623d65f59a5fe508eb0b46f2440395a1a4db656addadb65c980f1cce99 -MD = 0f5176527280b8e3fa69a6c14ce1f759d6e9c67c - -Len = 22688 -Msg = 04c873c05daf299923a2bfcee193aa104fe90717193083f1e20f799a897a5bccab28531869482a366b70689a24d6bd4758c29fe8dc43351d9e227413e5148857d93375ec45affe9b9cc1c68a3ae1b510ed399dc8b4591de4c62cc6c4d62b7dc896d020627a4e6d6fbe7f1fc7aa1e5912153648de28da05ef6417b8d6e62703c6eae79ea28f8c3e5ada91bc78fcf373f6d8a1ea53c02eb3e67fca92719d70e2f9de6135d50cd03b06f6dfe5c6b9cac9633e62c94e04beef6f202d9cbc826ee20a79242e237a842a181d51e1d9680a250250622df87df083354e281ee01d8acaa1c419d1b35f0fd43b54cffad8911b4d7b15876079b22d35de11a35f05f62a6465c52865ae46d90115a54176ebbd65097595baa9f82bdecf137186a85196b876ff863a343bb44a784e178f9e3c72502399d9e44f9d7169177b77b941ef849ac9160f35848333ca038fb2a1baf03b44618ee8eb9b920b38d6bf2a247205483a255366039eae4ac168807f5f12329da98dfccbb9d5fc81b1d38693b083bc6bfe525e958acae3829770c885b2ed2822e76d8d883445065c3ed879b843bb3b745017dea4b44f4a61b4e30fcd8095fa5166cae7294632d52346ab40a3c663abeb973d7c9967770c718089ff5db350d1b28e6bb2b5d6e6945e3115825c22c333583a8ddf7e8d88513a642a3e3f3167d5cec81a9735cba7699666dee7e93d23fc44a3ccaf5a0dcb4043c68d747be4222d2c7a9d3db00fbe7c514fce195401cb2d3739c59636cf8802140f7b4a17b2c802550ebd4e2e8973f61a53adbda55502efb7643f3a19bb07be35a8bc671d85a37bcfea426fb8210dff76da427ee220126a4e8c01430bb98f9d2ff718759444f9c12478f44a54bfd6beef4c5601154c41c58319d45a15b169c78866571985d713fbdb1e9b870d4b145c0c12b1f145c0d829de7380273d8bde63cb5c40fdf72539527d46fecee8ad100155921bf47b641ebde803cd518d2f349a7d419cc9f218b2ee9157e6c5efce12d353355cb2be205daa282f83810d85b393287c33257f97c8f69fb91b17299461fd8d633bd516dcdb172760695ec476a5775377cdb7a48bc19230d3656a9ee847a58c8582028b80e22d6bff4891bae8506d8799322a6bdae6eccb0f8c6757b30af4d601f7e326f4b8137e72e8c1f7c4fe9e4b4a2924dc6d7f29f8d457b55bdbf311f5416320ee20a5f2e823119784f3f53127f27c4dfe2cd4743f8b8ffcb24a4a2471ab8d61ecedf3f22f788bba685c7d4fa3f9f14fd9ff2cf3299afce665e65757d0a93f4d2641e83adddb1dd4abe6e02048c851cf75cfd1ce3d6a66197b9961d09ca23f8ca606cef379b3918a567b64cb9dc56378db82092e0363953dfc49b2b75cfe56c77422eb448c68ad866f0253792b59f1ef12021d3b04ed51fbf1e0903599244ca6967f88569d623a700162f35178ecc1df2235551cc77161fb61454472da7ee9d01603ec513408ffef11858d7c0ee79dee1405f8fad5558ee454601695a773f5eefb98615cdac4c6aca952682175b04bc4ef5950fcb403a05ed2194dc6886b37a74e252d9f15fd554fd0b1ce6933b1930abb18a34beee15f13e458332f06ce78a416919943701c757f8f8a057cd2513f68802c3a0e0b5992a891050ef5a805808c5bc6ed707087eee4edc55681daf71585477c5d6e91d203c8e2082743f776170826ab714d9fa78827f24b09a0d10ddf0a17f053930ab47819dd49c63f7a8a05c07e286d0384e40bf0a602660341fa639ef97066a4fd66ba438cb13311b9a9115b6b2528b9a7a73ee612d3b5cfb1266aeaf4e4dcc9f35291eff726b5e23c3c0582f58aeb989156eab23da63d2faaf9bb961034fe2c73dfc4c5259195da8ca9a7dc253ffec8c95bd7fc2f644749b3db2049554914f205751d6c1edb1c20305ac012022da970d71ccd6bf1f31b4554345fabcc096646317c628deaea8fddb0b517cb943a34b9440394a78a3d014c156c41657c5d3b4e805c5ccf92a83938952476b0e44fe6ca9776f359022941867feb8e1f6e2ddd32797ed3db1dfc615a650ea368f95508cc58dfb429629e221a19190e80a862921ba5488f5893cd4e6aabdb679cdc32e2e610a59dbeb186ed306b5f883134e2a3318a2357effc054991ecf28af493d0bc41463077c1f7c8ebf2fe23c6da1a97589bb278f448618b9af7b2bdd4172815de0482e809d93c4c618659ce8e226068f882a5ad2f0ac94789c384a30daea2eb8f584c351daf89fa9a1405c9a9b1103ccd0de92ccedd3d215e1eeb0cfc600a3919652d7f79eae5baddc5887bdf3031fd1d65085b996bc401602f6e606ad667e7c252ac2ee633597471c06c4bf747cc9231b18aa45a5966cfd81f95081fb8c1dcd34852aa2c32ec109f2e38a3bb9de8e3511af56ed7522b730e15e86ae3ad2102936ea55b138ea676af3775eaf1db8dd8c4c8d320d9fc1cd54a3af0ef7e5d8e404ced2faa63f08f8ee902aa8762a8c359d4e2ab2428ff40ded4b534ffb771107e44ec78fde3ffb04194b85fe4d6ad934ec79006e18c04a074f3af3c035791afa4c59406bd5c641075fa801d681592049fe6fc6bbfcdb34280f15091612764749b150c635397c6b71361836a7be6fe1f34794b6226b2b330eb14bfba83ec9366497c7d172559ceae0412e9d1851299ebf5c8a8737e05ad729ba5253fcf71c58d97440fa89d6d24fc2e55d9d7ee620c70cb1a39272f8c480e7aeba9a9af7da3f26db3e9a0229a6fa97b727b061f9bffb69cb92605a1102d0e6f30747f8ad7d59cb41334871ba757bed2b0f8e57e8819c652eb98963d58037961baad49c848029352aa17e3f25d86421a5878fc74f003a7d3f9b760692e73583ad37d90d098d2e031c1bb3e0e84a13d3db222d46a9a6561092baaed8e5825b2e1c10cda0c8fef8a379f481fd7e453b822061ff4c64fe5fddac89ac5159fc08f3ecc81b2e3f4fe994e8ee50fb54441b9b19c97e4f1d72e82301aae6e64cbedf8393e059dbd91aa165dd4ba95106d164bd2bbb12d54fae6f8f2670f72e5a453f3ba5dbf25022c98084cbaf039502878736dad95565680b66708f8e459fff19b8ba973d8d11b8e73770388af83dd3b103b6ab86ce75e3045d8591556a9197c6cc5eec677296e7fe16c69861efc206e85aab1255e69d6d33c52cf058dec9d0b6fab719ec5b664c78aed68fc662b7f8b7fc82b3c9263253142de5112b0a9f2674b441b45eaff662d1805e731ae986358a89ebe44315db3120083c882e7698058a998d2020d8dda7a30b9cf6e1fcc359fa533538762dfe83e1d491a9e5cb3afa631b07f1c56e629767c1306fbe14e5b262190d34b4e722c7c423830ae340fe7188a930bdcee94bce9a41a75201ba63fb6c2bb24d91c9de7961759f2fa9a0590775d495c8afd1ffa9b50d60425f65d471630be3079f5e9815243b348c9b41e128b51db5c6eaa0d4a5427509c5199fadd1014a1dd7201dd62796f4e1b65aae1d51c0f50f1cf1ee816dbd18f23ed2c05686a166a150e6701f2d342335114a5d742f23eb005f78137c5f9f79b8341d90750eddd23bf9350dd9a276569d41fcd86bfd487047f2cfa83bf76417da295c687fc6112d3c34ae3fac03f7ff88ace4978b58c925347b7b1536b1a563c6a311b0dd68e5c83097b49dfcee139e95d6842358de006a545e0cf2f33acdfe0c15c0121453b643a786ea9142ad63b433437df43ad998c0261ee7c9f7ef683729160a04cb132d200fa6a2c223ee52c0ef681492c7f7fcb73832bdf2cb5beebf9c1831f1582394ddd76b9fa9070d8b5538d8fa77869596cff93dd215d3ecdbe7d390ea60521197ddad5a13ae62a767d19e0a922add5f116af794d69bb82eba507e1495fa2f49a0bfefd6b15add3862d68d716e2552a0d728a1dc3e0cde9df489da17b707764839f52d75eb26cd2d16c485a200ef7d07627986786ae1bdc734e4a61ed0109da9ee0dc4bc43aab911fe3c2510dce1c2ff4dee140e0fa -MD = eef7dfc20c57895d31ad15aaab13cf710aa0d739 - -Len = 23480 -Msg = 13c123ac379146d066767ac02ba4bcda80fbf8a4e4cec5b0ade84fc3a0d19435bf4dd49b622642a4892b004171794a0965f9f2dbd72a0cc5af21ea24e3ce4b0d4880cfeca8abae6b14eaaa967b40423c7ca3299879bbf630ede71dfeff811ece5763fce730a9f1edaeb9600672810b3c6d008623f108ecbb0e42d0971b72763f93fc43d423a873f200a20ada7ec50dd1df18f1c36899542cbb3aeb39602abc2aa5558dfaa82e9c42b2ac905bc692b0c27af453c106f7974c9bd8562af63056553476c0a2e8c5d4a46bdfdace73735cd9e79b9265f2a91ee35723fab2040cae88e965c6140af483e2d344d17eaced79dcce1598f7553750b99624bd1bb2472a8d6c2c8598374411c293e25bb29a8a6f94d66b4bbf562a949501e188ab2a68342b64d3e776973be60d53c261b165d1a6c9a8a495051e0954413f6444ac91f733297960d3f551636a8abaeaccc4344a8743ecc85d10d45cf783f9b5d764127c8f5054dd305e8e440603716482332f7e78c949e08b29a1ace524d7da2b1cd280af689d51e8f97564203e20386d4680f4e22567f30698ad7f85ec80dd261bfc8bfd39fbc5e20e2f4d22056e6c74454c342e1def09b8a51f6041a29dc5b2abb623e08a174006e5e387721e030a7e77bec7c27a892a889820d48010d59bb61228d2c02499ca3cc6ba987a5188197525fb340803dc5f5eb8d765abfcd16619997c1f06d0286b6cf8dc0aa068a5a240972e03668291af224e6d9a282f392ec588d79218546c2c7ec470654e2901acc7157dbd46bd4f23bca209fb6071b4fca12763b45f780f145a729e2feb5e453ff2e710e90f7ebfc215fcd411bb89ead795bd480c4306b62ce94a90f2dfcd1863a954100f298b899413a4f663a24184c78994ae232dc40b7b11936b35913f2321d4a5a5b8fcac54a19fe1967a7b5f2ad465f2bc7f837cb609bb975a816b7b0e805b23f66bf0abc8f2a2fddcdcafac830711209aaaaef45fded09c835dd44b808926132cb06d4f8e8e023ef113a7f038677666712c17f5ad0336eb0e51347521431dc06e0fdb5f4e7da9edfda7caf3f0fc7a0b698b2546487fd7cc24e5f4c29ab62971e511a2a4afc87d51271e7f7c54cf0659a9513fb1d95a9986eda27afa93ea306db93d2ae65a7668b4980230550ce703965a05cffc089c6663900f2fe5b3e81bfd111bdbecf78f515c78da4444bf4d570ba3303cf07c4e25a935b57b4aa3b7d36915341e802d1c1f92ee2f23121507ec00ad59ee55de78bea1061ac7f30b5f3ff9ef0f5968a423bc9e22883587b81fa8bd9f084df3d520189328c879a691e946f5c435f66d05af0fc83d6de16a4d9c7589a2c6c1910a501dc7c647fb2ce05cd2a4bf2c5b57f8c50058676692857f873aaede19b2f9240fb484061db34d9ec0ca4f057ef2ee246f7795c7fcad9ef3e7df727a8c88f1cc66c51410d40bd0741d153ec1b221fa32b45cc986b69b7e54c44b1e9fa4ab42aa5b39bd0df4697f097c9db919515242c99d973acb1dc4ed482768f974eb83b465f9f6c82503372006e4490835e2ec8f92301130bfb790b277171d4d22e8790ea645e57d7f8bdc7c125e01723eed57a93577b0f58a0f68978b9c5260d023f31a1449ee234413c05bd6f1ad405cfbfa58597a5dd053aab26229beef7ca7255a9e580cfa039b244b85f9a536bbb6933f64a64001084212d7dcfb86dde7cf7517631996ef66ad45e5c124828228753d8d94c6d182e681ce40cda9fb02e96f9b903100f0b792a2fef6d8ff917ad2c0814db15e35cab2356654fddb2547ccaf202fcfb52138d0a1d7e69331d90600c0e8e5831974bfb489627a33380d94d6b88b5b07df315c67d2591db863620ff99df9bed29c974b33a34b1c3968bad251b2647b9f262909a15e0b040f3c357b067e3d406692a65579aba9a1d51434e783c534f960341029c46d7501626559346f8b3ad307a1a7c4ccca0271d0e484bdb517813c12aeeea31926207d7785d6207cee7ae07c71a4827527e0f4f17fb13b2ed3d6ac7d3fcb5fe8b293e11745b52975cc85cd8eaba476bbecca92028ec348381fb8b1688db045793956930a4dfd36a150e10405f7b088e83e49b3c9b8c3ce1923b1b39d40a43d13e2f2fd1844b62e499f18eba9fccfa04347e4bf10a6b8b41a09481ae201b02fffd5ee8509d3e9fbb5e4b2ec416309a6132f231e9dffaae283f6064e0078db03863bd295a4a19d842d45356e97d36682a11e8e38386ca23f9c1471b7bf4c2da1ee3c2794b257dab1f9ea2bd971f5ef1d353bae75ab95a6b5ac8b13bee625aef17fff74eafb9ca86a60fc1b949871ab5d16ae0a3ebd21c12bfd8374c93fad67dc83ad41fe47191097aba38e09d4eea32b8ea02af935b9f88ad5231a4290895f48406d173a5e75192023060b9fec14dd70e3399710dc0455b87d938f8fa2649e1fff687c050859cced0d4e1abeaa8d63125ea0d8e97aabdf9e3dfc5b1a3de42d4708c5fbc70c6d2fe7b4a243ced4fe3dfb47fe75eed7559e245c86044928b113aaa3ad19e933584df45f2b0f3733127111e67af785baab9b33245814862d74582e184860d145c32bfd551105628f6f093e823de518ec54ddb1db9b133812d505bdaebd57e80a55d3ebdf7baeb5b0bd0c68656ec70e36f96c88ca7687c6a07b213eaf35869649b74ca4459190995da58379d53626cf5e42519e3912fa9a9f0fb49861d77644cc909e12cf7d357760ce75581bbd88c32cd693dd7096f31bd738c7b50dccae585989d21cc56425b57fe2eaed7f2a78526a5e3a2bb62bfbb1109f607cfa3bb63cb94aeea96e71e6bd8386eb2048a57be4de814f7255f999c411ec8ad5724d1756b47afda313c902f533647ed9c0581be151e8d999932755bca3c64aa8bb2a581011c104f1fc9701c75924ae002d69dfb18c3be088b9deb7028ed5aadd1ef901d19ac90d7b7101699abb6e807dd8004fbc54216d270e4548fc9ac2b15de3e39b0015371f29ba2fc4d523e8fe380946f46a7442865edc858f138e35670e520fad074bb643e31e4a99e2573d2f1a08625524b247361569c514af34d5d5d9b3a5bf4d04ec8091e67a71281f131b091c7dfb50d8d88234ff2e6039524b02a64dcf593a0781de1b5be6d30f4513cbee8ebf6c58ac9c74a3e4e8fa17b13ef75e69b304361e1e6569c2b747ff8fe446b2a64f32a2f73c134a601a6ab31957bae74f7947a90f6b1e6366145560c72e943bac56d598805f6711bdec3974523e552b474aabfba30f10f28e26869ab39bbe73e8fbdba011ae79e14187eec1239acf11994eb794a2b343fc811561151cd1cb41a267ce2470d150a036131104551431808cacf3ddd4fec06a88086f3ac978c38c21c1358b666ff438e2b72ba4b0538262698de73c01998e25eb27366f8439af3eae32993dbb306e8f8e9cc309fc00ca9e78181c1af02bb514f29b401d13bc963e91e281a237bec58f81ea619b01c2121c017619e06a5d3e1ee58c15ad3fa8807412f87522a2be011f05c88dc2874261c44cce66f437d7302d0b213b85d0a575c8799dfd25c3db2b26605ed0e65527bf7ea1498cc01f409328ad833c0f8e5d7e220df8a21363bb4a8edbd5b16f341a3432470f12aaea4070f613daa0b24175a26a1732eb544a06663ebe55b9c5ecc3c9c88747801c5f81ce81854dedd5b098ea88df7261504065881e51056e5045c98528a9195f7d47a8b5b04b04ade2a46c5c64ade18a6f0d7fb616dc0e5a7807d5713af5ae35356a602d6bac286740e59903e7c9a7f11a78fefa0ea69805a6f98e93e7b22e8dac904f3f9af1e1a4573bc8e4f77aeb1bb74b875ceef8caf640e49df5152ac1ec49811df2266356eb8f6ea1097d0ad592b04cc5e39e1accb5b090a99fada38ddc7604734ff547b0c45045cb7962bf8edd6b445d970654c7ca5cc55b979866bde49be3f95cf0e816b70289ef3c8ce23e8452fafa800feee3beae4b5be7bcbb778d1ee45623ff8db14d0d02b45be5ba0c0fcb3842a79f2f47170ce9509703e9e35d68d032ac0b7da90dd978c3dd5491210740c4dd139f601c60e069e2ad543a2bdee16e37fdfa012580ceb3c3cac0ada5f4186774ccf8c9891e9191ba3396f47498f1880b20b6614d2c557a5d2a1357bf5cbb -MD = 93239fa543e8bd68b59a4bd55a7be068f18c5ea1 - -Len = 24272 -Msg = 595f40b057ef2d4f8774a22899acf28da129fa406d530c9416b02cced6637fd119f300fbd74e754a200ea2c3f9fabc1466d02078c84245db693eef3f5672a65e6d106790b6ce99f0f73242ba820c7bf85244225e56d5ce720d1a08f05349b86c7b3ddd399d78818a3168edd7dde919828c0c66bbc0168fa129ccdda976ee9b446b02cabc3452165ff93808e0b2997cfa3db05656ad0d71afe6ddd834676b392e66e796e222673eb9752bfc9ea8258ea88cb858f9c6c15ae66bd46058cdc878719475a97310bce2decdc831d9689435d3a2add66ab33a338ce139dcdc500b42571c336c37a55beb172a970f599aee5bc5a61737721b80e5ea6f95b689993e7e2626a945f68a4b3facb421ffe5e53ce7c4c17ce3d9a79c57483e6e552750681427dc609d776694c8e592ed6747f185c1191b664267fe9570ee754f217e1d92eba264dfdd83e23f6c0aed84b04567d1d10cdb5cbce4c8731a233dbd8255a6c3eddfe6ae6be2a6521562ec6c43a8ef28ffe42ae7b917af3e3c30be42e075960301258b56b15c59d8aa36b82f8637309333eb2f8ea1c959ffbd5d1f65a3a7935a0fbe7a5e15b8a3d613ce7854e3bcd319556713d9dcc26ebe87f289af33b145d100f0dc4e01c02e5638725564c1fd7fc34da1fd50d2ca9781813723a6f95b566fba04d9afdc3a9f5f016a77e688c4dd9803e1167ceba97c52937416d45b6f6b3d264298080eefa1fa56fd05629fd795a05f6f85e49026c438a5f089c1c2b32f412cf142e1ffa7da2e1f75276170fe4ee34a927310270b173c9ff4a5f397f14785b55afec2172af2034418076a6203b06aaa9308891a1e1f6469c891f440ef5e11a7c6f534be3f9281ad2fca05ddad653c69ba6bd6cf2881baecb4764c27761aebec7b4fbe5cb062b142019bba49c312616d4fc57fb0f0e8460e007c81b24d231d6ac233e95943099aecd8a0120f0e62e2a09a3d0d2340fa0fb8f3ca1d4b3e22af0be2c93c1dc1304491fa01949556fac6e8e3fc0792de5f1dd3d689a8590fbfa7b5253a3f10f17eb81ab0e7c9446285152f712af56493c07845f1e0a84489a10f52d1ae7a9a9d9cfd70427a3784fca9d75c8dee5f0127c529f88cf8a7737471eec92f4c76248b311b79f8e168beea0e15577f70ced1621537d2eff92c5098d64d02873dba1484e61b1f1a45e458f55dd7088fd9ca3c0c59aabd620ac042bc7933e521a9ced450630449efcd31bce53e23570551d9aaec388aa02c53eab1aa01a85a44b73bcab74fdedfc0a2d9508258032c28ff8583cb5be06296fd32052817b549398f88608152b2c8d5eb647e94547e6f410c552f7169b3ede83020a7ff63609a495a3dfd751587ee76d158ade2d99c08989fd116a60b0c286a133dfdf78cb335b940e3085d406538eb7c3f44359066df75e182a032e9f2fb63cf1070d73bb602d46801ebff7b548e7b13a0ad5521e3dc20faef36dcaa6d4e1d8b2169691770eae1fb1f0d236c5dd870be044f0a331ce8e011a13e6df78509de70f94e73c9e9d32720c5d693be87fe10a7f2921c6e17e9ff4e1e22ae774315efa61f88bef829a7ef007cae1617dbe9a4f3f2de527cdec9c3daf04864d3ae5898541b80124d394c81c2cbfd73205f7f73cd8c9b7502796e75dd9e1a5ab2cfbb20a3769d367020ac25903b2b73801da9c75b49314dabeec25c7eb1fe57bdac26d1bab746f408e6ad238f53a0dedf1d50e6c5b009a21c47abc2e6b05e229c4f82f1c266e512bd9439c2e99bc57ce7665a19344a893c008c13ed3d23a184f6c0b5c9e20ce1593930374cc69b00143effb1a8d09d1ae3fdc3e126aa932f457305a9a14330a29121c58e074ddcba708cf33bdbc033255ebbf6fdb55587702dbc2844c10c5a90822058283ca7e55c567a47e2fa2d941076e32c4ee26787cc0379317070661213f3dcf3ec32fb3e4c8faf058c4c3e4644f31d6ebef5081bab91512614f779e193aefd9dc2337270f4e3d435231a1cd32a9d10c334355fcc759ded11189e6c4e78792c5f92853402bb1991dd8eaceec3293b653399ec952192f0f5f963ad67e22a1d11404471687c08fb8d07b54add9ca897c4c6d360d1a36a5210e7df6c942311625348c13f3767454f71ba803c11e81177d385cbd93cd8658be6e27323199b950f9a7fef37c849d9dee4ffd7c9b12ecba43d7769a1fe4aec6220f207191ed21fee90eeb7a144ad2c708fdda23be5f73ee6a8a496ff3e8165a0661f8497cc4f15c5db9c01c4d218a6cd1a5cc9d8d7cad204bd15383a24043a0d5f72d0e54a9ae15d2391b6e99b14afbc2c8434e9ac2fefc823d1389bda5bd171b4f2d44bc13be97e11d6bc58c628af066d5eccb58faefdf882e07f6a850e94940da8781159ba97ef4c72fd597cdd0e7387f17786a6d0645d844bf4ef50a5e93e109aa57e39a0527a7d6d6034e5b934cb1f451ea2191c8cbfcf197e7161a93a3668d241db8a7581e54cd0cc30284689d6e063aa52111bdee60b52073ae0a2ee45bb58357073bf8ef960a22b966e0c765c6f5201deb653c099e1ff7690f6166d33b2326a851d08e07e62eb64aede926124771a0d8e2f4e9ba2f827b3bccb8f1fc8f46ac762b0d7df3cf9b35fc0a160b3f79ec4b4aaa594d8c7fad2a50586946ccb2a08334f53b5f3fbce030414defed59d8c57e0793fabddd18c0836b54faebc06fb1298932e29848289e23bf2bef52ddeeadb7844261d148758d24d135063773f1092dd776abbfa9ad159eca169cb2582605964538172e3b30637d266ae3e053f108fea432ff3bd0b4e6fff6a060b245095d78cee7930b41b3e40aef794c4cecea412a73fa45a359da92c5c95bd3a91113260d85d36e1ee88a7f4c70e287f3bb37422fcb2f277cb178a98eb6ab8e2d68ddef930e7df0cf9c3e95b06f292f6b2b827c7d1e640d2e54398bc95301c8a5a8c42ac7cd69c3a3d91ad7d53edfbb19ca365090e21b7f4ede77c9f403114bb85d60680a47097f222bd9b6397458b39623dd8f19bac7f6449ccde49d5b3c5fcbf32d17e90fef5bc100d5a14b84369156a4e268660cfbfaa63ba64c33dff5ad5706a4bac28c7e1206f4b9398a02fbecd1e9ef7d145d1a04fa179b9145e5df9ce00441d14551581a7a73dedf83551b1eae5f4f4d833fc49da6dd083442214cb70d889efbefd2efdd820ac113b61f06bf3261ac4a51096e2d32e886b5c706ef7425e0168b0095b7e3c425fa6690b5613704bd61040c6e895c34b6918632fb1a5cdfb7331f462e42c597620558b1bc9d2e9bbf180af3b3a88312e3b33614926ff9717a8f292ee112eba22b5c6a77892d0e7de33bbfc59d4e3a53ec6635fa5152a2a1b695290972aade4b0e7a0c80cf934f11c636a2f06fdcfa7e3d251632bc6510e6d7cf9f84476d061867e8bf3be452790dd4b344e2cfe74c08526a478c3809ac977a990d2dd3ec0b70e42313276c0d04b89b1c263b21ff9778c8b05a3558d2de5a0babf2449caa471aefb378c1cb058aa885ebb7580a8865561c91ceec93333ea4f752df87262a514d070480a995ee635421ac88d7ee145e16aa8906007bbd45eeea483553f4eeb2adb6a0ab2d312a37520ac91b294125ca310f00a01f86d37cbe40d684498d59d3b37b1258eb314b6f188debdecaa82f323bb6831da829085b8997985cb6541e3cd4b0d42a621ab4831e376f543a87a33ead4d9aef28e6ee5ae75af82f58ed8e66a81460900062081be9a3de0c07642437fc10b2852054d8034e07906c7fce3ce99402321a648bb881f13fb276afc224c6aecc64800cd767ed2429db94b95a9c3e3f16d33a0d1c486dcb878714a23627634bbd2b606d031061003e444884274eccefaece6f48783a27ef07b6766d149e86498f6196cf4c540778b164f86ec8a71e4c468e3ac5440058c22ceb1c8ef20cb82eafb1938237c558e42fb814e79347badb7a9d1d01f42d68eb837f678662f461619aa5f74449c6ddd915a83e7d3ba32b03b765966d0d23e0d197fde7c1cbe82a98dc993273f6eafeddefdfc59e064bd75b99923784e386590ad6e13defb15a7c2ad205d5afc3a444592aa95ad8a7a448497d8d60d83bc729fdccb3aa6ea7cdceae37963146248546e162af6eab743f1663ffc1a2e56a68ec20e60fedad03a49a8979a505d5bdf06eed145c6185108eaa217cd99e2af3de082abf30484979817842f4cca3dcf48824f2ac2ae403f1157c08912f83176ca91661b4df7ab26de6e06145779bda4ccf1188b6b556869a66148fc95e2239395c8f7c6367d58655475b7 -MD = 2393e09e218261acb91ff9fb4783253e9b44b9f6 - -Len = 25064 -Msg = 215c37320fbdd5520037bce5b02b12871b345bbd84169d87bcf1c134a1bb3d7ae5ecf0c6117b4dd1c90abc74515e3dbd50114f42d48b10b5972ea5b981d1dcf46d70106630214ef9d74ab559311223058e150ea7c55cafa17c8c66e8a35d5a15424e60b975981ef1b460703b58300a885ba85f936071c270f373cb681148fd04ebf0a568e7c605e2e8b2b2c3cfa13b6e42320baeacb2914d844b9ee2d3780eeaf0bcaa1a8e944df4f9aa46999d4bfedec81bdba1b108635eb87ca5fdefd7d4eeda1c367873ea3c4e71aff364ca189b0077cc9414775982cb166ea9626f4c99393077102a9db11c19d82880cc5fef59fdd6ab01ae078f34bd278a71b85abea3f27a3501d714cf337cb47fb67b63b781fd6d21e9186890c25c7136c7a8b9173c4241bdd127e12ecaa08f1b5d16de5a5b27c59713faa24674cf7edb71da933eaa510b7948c40bb428adf0643d48d9bf2fa4657348fabe97913fd6e238f5f01b354663d02d539a4b97ca60c21db65ace459cd51e50c3c36d63d3ffb1e4a2d996274ace2a4a7f97da5d1f669dc60b6c6fe4369e01f3fbb9af30b483b23d885497c684d6ef65ed0949c3d58a5d01ed148a569a4783f94ba8454109ea4c0a506c065c1d02884748f8801114546a94055c07e1f1580b295a9916defbbae615a126cb2f3cda5bb8366d668f034d2d47fa4bcece635a034cd1930c4eb27dea24248cce870ae7d1805f6ee585cbfc0ce474e9c86517d4d22a579f0edb55babf0080a5f8aeafb053666d06e43a93e970311d3fdbed364ee08b95c405cb0cfacd715e792feb52be4733053a4cf7849dc2f89a54f0b0e7509537320ad76701c47c3f66115c851b9716afd1140304c69f68ff9631f0f4536359f5d7796df759a034313f7468c533c529a2799bf2a98077cc0fb7dcc102a10e948f2c1aafc33f165d1092aa39f3c2d0e7d4a5d7012edbae54efa55f4d22fadaaecbd8f48512d9af5fa406bcb957ef3eb70dfcd119dafecb6a6909c27a9b864e0f72840fd82e4ff2a2b544b1ce38e3990314269020f6115675438b0b32b76cf21f4cd7748e5dca688f0bf39162e0c66832b2cc1c00ca3ed8dd46d2445cbcd54e47207a2a91e872978c6dbc655c95bf34acaf967e9f9eabd8093a8774e0f3e8ebedb81439c7176e0902a54734a4a0f684d8d32bbde7ba80de63e751a4a6a4ce507bda4eaa1a31e7465a793b06224994e020e534e1be65e6725214d9db9517ae05574fd084718004d4fab241e3bed7c1d0ebaf58f30ee9051d3e8bc7219793b193ebde41cfb34aee3d4c1800d46094a4dda2f740fabe8c04668f12c27e9362ff819d514a94cad8cc09b67221e0f0c6668eab8693feb6970bd6ae7272fb72cabf57d76f92da9d72c7bea28a4b1056b62e6c6f24fa08de5244f30173809f1a141a9e00ffc2a9145f07e67726276b7aac25fe56981d1e1e04d548f1dc9473748737dd7fca810917e9b3089d0f5cf944ef73ccc9aca34b5ef6e65ae777557d686d3f9cbe9878038e56f3ad7c0d93c29dc93f5e2e2635948671a0b3490a6cc7df0c596324304e9e61eff15c7ce774cf6b80b13deecf7a037ebb2ada805e8059bfaeaebb195cace379fcd29d0567a627985df3f0726f1b9f2e1cad57f53b3a39f299652b05e23ad8bcc5c1f87f53d2d20aa82aff21cebf707ede51b30f6842715e15a73c518b9f871391e4f652749fd9aba981f362b30f7f57483d7535af3f09ed6c9c74631f84f866aa631ee692b64361a81e529fe8b2d39fa19a25d1d6da0786e46b5ea46690329e5667f9a375be1816ec29a73f33517440328f4b4aa6ba7510c73d7f7c286c3da1de180df2e46060b1becb77aa5d946b2043457008e7875a755b3961542cbf21598a9de539a844241a662b4c472e22bf291be41b7361ebbf9ce9888b923b32e6ada11f06e189116c392c73ad806da478410493d5f3db8cab6db85185a01d6d95846dc5fa534f703ef657c823bce4c19f52447a25f01f1226d012bdd8e49a1736c834b848f6c208a4393154356459223b4324c293d2f32639ad3df40bc879d8cf603f1f7831aa82a5ea003f6bde956f54fcec93a7012070eaec821da6b2845a6a34d623126ece8549f10db14d93604ff365e414eae56e9743752960310c81420e2c40ec9f14f7ba9936a0d164eb816a1e66546ee3e6a4444c307ae6353d393bc430c7a1a78bedc89ca101c7374fc269e0e783c81b6d8c1e0c06bdd73aad74eb9328b16ab03a78595b1b77bc4e25e9f43ed0ba4b18e0ecce8bdd395bc6c4fafa83fc4770448b6012dc8a4bd832d6bfb24209411f64a98dfbd19f379863ea92119c94d1dbeae56c9d29d8c6426acb0c4cf37a606b872e374ee732ffb9988706d8e7d897d32bb066a24aeb2d237e6b9869590c5f5707d9b16ed480d9e4ed031cf66bb1e07f8d5514c845adcba2f71d2ab27da5850d6e11c505a06f0d42ebc69d143005f6079a3a3eb82404e7e85c4b8ccf662e1bb2433d39b854e9e2fa193850d93fbe1f94dac8ae1aefdac81c355c84671c9069710fc7d631f6d5a13400c2ffee9fc2a44ed4672b95ac16b7670bb8db22a8b1b77059166418911a931a26ca70fa58fbcd5c10807cd165a0fcf164c759aa117b4dd7a992ab142aa2fdd115ba6ca6734fe1e616796a772160dfe1cbf0c5a45fd572cf87a372cecb542a8455f8bb9af7a82a166fbcbd2fe93ea85fc59ee8bb9ba670807cb183ee7b1861596cee257decedee12a2af3da0c4229e95dc368b95ccd88d110f24a41b43d6e978e40272f75b06760237bcb173baf40aa9972174dafa5212aac9649efd29760b0a459e69b24bda0a0fb64ae34fd39c34c37ec76c332dfc477531d9393d38e10f371529d453c453f161a8c099dd1802640c1a903a486ebe7397cfec3c8375fd3d26de0b7985ce58751f95889cc5900ee2abf2e5a8c0c480df3b2b037176eab3dc0027ab20ee72d2dc710309b4ae43a9f5c98f2c7c43382ad487ce889ebf9eec36ec79739336b7a76f807caba8403ab9e78e77cf7f7bd1a498a33fe18c06998e91135bca9906a6c0767487d642247c27fe213434790d97d673b8067803f2e482369d5518f90645053975adf2480211dc83ab4ec532a492a9afeeacb3cb2b86b16db1efc67cdd9e5effa97467838102bfbd534be871e6cb03936cb8fcab5a87027e77b23aea33b9b4123b679ebb4a56b7f642b507007b49ce665bb2ba6c27f05cb01825dd0bb29cedb8510bfdb80515ae749f1389a50c14f071e22254d639c8a94cbcd117a60051f33a14eaed4159488b8193eed629413553fc2a9134b13917d09a8a3c5185c5e0ace0ab8bd720eef6366346cd5653c1b3dd4e5b87c1c5cee5b9e2abf0f16eaa4f02f13e76211b6d279662df3871ed359678b19c8a63daa13b4c6c4775612a56a8dcb7f73435fb7ee395c887b78fbd44e70b6b152482b75920717f8551078173f32178fc4c7987c8331adb65d3188d97ad7dc5efdc86259f9d10658d0e4d3aa636bb7d75465789f41e0ee5a2137423d5f0b807523ad8ec1bb9116488339a1f997b910e8bab36c7a9ad572c65000b47a7b8a37965c7ded4747c5cc59e4955f6f4c98b7265017d0b90e7def9d72045c3b50e2663510a01a553eed9d0f6d7e8885e2991f32dd3961b51d48b931ffe8b5ea6f9290c3d8ca9265f1871ccb965ba9d80a18bd708a6e8bf937c4744671f43df238294bd52d33f2041010a030e7c33fd023c61672004dbc1fee8f852d40dd70fd3b04fbeb869295ba0b18dbb1ea3bb6f8bfffceb9d74d7e83b1f8706904fadb65f8b435796d6d19f2531e33d1062babcc3f442aba77f44fbf229dda8c36d2f9c6e1b56d014a09db47888f2d10d4198ac54221cee64ab8ac3ca0fe08094efc388a96971705c51f76140bea4be3dc9bd07e39172feff8311086cd87ad52c5ed343b77c7d809370466f25dce04ec78192951b4a2d219e8c4291808c92f1b342c696425c6048e486f2a7d1e98dc7d4f17d1ea15433a06a508328ad34101a50210446ef120410751a63cee9ed95728ba2e76920b76ec38a563d939bd6db992b85f51e68a54f206eb400af18f1df97151b393f3e7cc5d12626d99bf37dddb66df501e5551d2bbff8dd331104fb537e99e4d968a3aa1f146849bd085d2efdb83efa90625d837f373b1b64bb5516d96e408631acf84966d2764653a280f323e9c51b0a5e29de33ce5ef9f976b44759b13288a7d3e562815478a5023105d3378f2be0d7a161362ecd89fc5b0ac998bb8d9672a5a411fb58e297ef317c93d722f397d15ff3ac935a7ce6aef23f3b10e74b94cd92e8251fd3c3faab4a4cd305ca5d32770a1cb2fe9e229a9626ddb2b7c6325620d667c8d3da41cb61b4696d671814245941e31c7ee208d03c60abd8963e8c01f3d9e9a32155a22f99d79b0805 -MD = 7d90c7a14fc71e228a4f4fd191d3b7ea98c6509e - -Len = 25856 -Msg = f9ee55f87ae8343e45f01fb285953c752c15a1d8927314145ecb143caae31e6f62022952ed0573bd10af7fb50f415e9b154a2fa2d5c1e2877251417c9cf43065fdc33346d30d32fcdea6792c7c81037a1381f8fbaf8d74ecece38aa417ae89c790da7dbd7227f962767c14ff157fb27aed6205c966ff53ac9528f99c6138b0fee4ee0f9d147c5157a2da59172260f3036d945df64341063035c9954cc2bb2d73c1a8efd0ff33c14328684e5aeb4f4e7d59c008688e7815df946d669c845f898deeb0273c7b75d28fd1cdfdb1b7724c507a8d0f098fcf092079bd7575ee4b4bb335adbfcbd26a0aa165b26e04d0f174e498a479bf8e6c685dae60c9bd47a8fb4f5c48bd644a39f4e2acbea83c7cf54fa17bac4e74d277bdfdf9ff6a5ed89d21c82c282bee2d0b15ba6e9ab33f04a663f0ea4e960fa4198d682342613ee95346866df51053c107f79272ed97f7b02b3b37ae325a784c796205f4d0b547c1f2f1f1e759757a4f5621d081605c4bc7ad5cdf8fffa29712c1c33e33526e5faaa1ab7161fa614b1e1f1bde639b0b2293535051555e74543d16397aaa6f9570ea88fb6ea580dcae788b6e22e045ac665a469ef4c8f6da9717a24b221fd03161cad069507994ef8ba3c2a106bf0645fe65adce2fb070db48e68d819c5b1d4a1a92a17d7fa6dea0cae8eb3cf0ca88e0d2fcb1686cd4737f4ff3ff635126fde9838a22c063f405f9538f2ec74ac77084ca667af512fda8cf94861f7aa947181484fa7cb9642ab2020ee0b4cb7b7f693aceed2ffd89f3b6d2ffe7154d0d8817d60529d6f1eb128cc2e423a5d0ebba1909c6d7f806387e4791795d0a64e3afa234ee6059ee5e723c41bb9f295c024028f99a6dfe9a89660012e83126489485603827e72d3a271369877d9d66f928d83f1232f76940e3728b5f36ac908089d2fae99806795dacbdbc9d1065872ec54c065d76bd6181ae6c908049137194295e174f2a0565dd5737dc8a5e3fb283416224e14f060de3531ab67b0bb1f00ddbf06073c32b1b448f4b73564d73108104e342a6a31c95f03844a65a62cd367209527d5c4cc1c019bbbf260ac748c8af769607b55c452230c6b4082538ae6a4b1a4a1512ae0f7fe5455c9facb307029600451c1560cadc2a653183e2749db52176a1d09ecf5d7e2f94ea8647f8f9e8bc08b628ce99f3ea667e82bf9bfee23f7a851f580799f3e57f103182e080639fabf8b2d4e9ed07746c77706557bec52fe1ae8b5255f318dd5d21f83c81329052eb3601c86d4650a4c5bac31d1f9c8eaddb5cae6991c4168e522f095c31f6c727022c6bab628b14a0f8ad438efa8084e3f2f45143c2f6331fe5a22a89f9b44f467a40b825d1a49c908dbab761f052f0f7addf3a88f070b8b89fe2246bdf5471d8dbdcafe0c178309d0c48e93d09fa1a11948532e1231aed830757bfabeebf7505ab671a813af117effebe9fcb4e604a5a304e00f664dc19a5a56ac2f12bdba3f47449bfb344f69badeb86a2b3c66cc8f908a36e6eba9e85490181f7e4a09142cebde9661ce87002ff5907ba9c7907db17a5ea42f12e487a95a406242d54ca9cba0fb1d9642d45950ed2a9ae2e7017cddc8d8d4529c7c23eb1155f12744f6cf7e1f108df341c5e9c02ddd44812b285e46f4af23fbb8df419c6dcf689609a609c6beb563f34bba35f0303f04ef0473a69f96483f85288c755fc823151993c8fd37f8504c20b14fc2537ca65896f381da3a161a63794c121397a8e7a31c83de0e445487830612f5238c9bd9cc1388c15dc90cbc5c6293fec0c698838f295a63a16e6bb1b51e0128bdedf61fbbef34b0c5aed29476bba0a0e17f0f8d25ca77e87b28a6755ec2ec79160a240eb47477ee967e10494efef2b71a23867b237a7cdae0058d28fcbf3564a0639e1d526dc2c944994e314196fa9fbf4695d3f4b3c9b974879862fb4d8c5a017cccc1f215b5df4482d4e2fb3e38c9657aa60e1600ff12ad2150b9f70841e7add858a33016c19f3aed5cd4d83f2dd291123fa003dc7d64fe553e745c7a169bf9e8aa2778db66978c1b3e9d65345a39b6bfdb204ab0d53eecb5ba48b80d4ac59a3039c558fe2546ccbf02932e983e6d6ad60105672896fefca56c9d865c7f12f34190134cd97e3b512b316c90d55aec11f739d5c5ae2323a2b6cdf933c223f2998f3577b117e1d3cdf25360389630444095fe07f2bc1a4b736c46d26ce8c9f2f19bb2994213f0ae9796d14492454ef47b24b6227accdce4f3287fbf8e3ae1729fd96fce6c581b2a52ab53501a5d178b26360a9bda6afb7e869dc12714330b2ff8dae5ad9c7ec1e5638222395d581a66d64c63fa7e10e676b21ec39f9b5b9759a112bcad5ee2955e5ecde656b7c0d8161fda4ac4f2593e7c1a3def8f802f16ae0d135d54201e05f3b8e1183ed621c11747622761b3ae63ed037dbd7d6f28298ba14f20188c9b8453e66e205814e575f8f166a2775e7ae7482240b5ffb4d110710248dd90f0e5a0ed8bb7a74910965729b26a146c4f59392beb49517d0db49c0cb472ce240976ec2f0d70158845cf0527eeef25c702d3f9f6b2da287bb64cfcad1c6f8a6812e9b6a6e009e37c20c9d0822b683f0e15457a373d8593825af4e2d0ce918ac3b99890c397f799bb3e4169b6dc67c8a7e3586a7bdfde3b177856cf263f7b47cd7a1e1b33b9cbb0bbfab0313496506b3b19772b131e4677a17aed120bd3af69fbb0e4b645b9e8c104e280b799ddd49f1e241c3ccb7d40e1c6ff226bf04f8049c51a86e2981cf1331c824d7d451746ccf77fc22fd3717001ee51913d81f7a06fb0037f309957579f695670f2c4c7397d2d990374e99f36408e3ea3f71f60825452f82810d80d9e5e71db95a897822f48470c5a9c6c5b16263d02e539571e988014852c13b2843808dc8e260f4bcc8a86ca463206da49824b614adf649786759b7b26f5b9d76fa726fffa9ca7400aede12de31464c1cf2cf89172fd197f3c8bdefd5a1f63b5248e21528d840122c1dbcff84f8c06a16058e65407c8c86ca55de3219b03a1ba573f808ad3569d5295b6aba008039d07b1b87d0f95bce1ee556e407e663d14755c4decff489eec5ddb011cbb8915784317ae254aa963f682c13f7f7a48360c74c83b9f2679b76ea3166d9bb16f3c290226ac879b9f3886b88d33d89bbd892a170f8b4fa6c35aa4d0dc4e911806d23fb343561c68f3b5130dfe0e145932a0cdfab6bf46e6d1d32f55a116a5560c922ce5122d4c3943541bd1b8009b394417989e423a4d6d11cb5eafe9683101dcd661060784af830ab011c22fcde5c27e57fa50369eabb00fadc35e39b5dc91f4298c94980eaeecc633955de9c87c7b2ddc63def85eea3627f4eddef671f08ceef5f02f482dd2cce27906e35a72c7c9ff2f75892bfd9195f73b3ea0c44f255929e64c249c54a3aa0bdae711167f70454ecbaffd35ed3a25f9db5652178fe39d3154f1130935aa1a8ed3c6559220ee63b93b6399aac03c8cac6fa55164c6a3bf91dc7f7913234e85081e253f52199aabaae940ecfef921208b62ac2d3085fe46c7e747d54eb0297ff3f4742ccacc1d93b07fb865b70a8088135eeb43ff404ba9400ffaa6106e9371cf1143ac80aadfa256494aa24776b339d0bee3444588247da6b1087a0cb134f115df044d0858795e08e0781134c061ac5ffd149c97b0013a4864e1af982a867454c8466cd637432d44dfb1310369f465fdb3ffcb7a6a7a45b1a626d5572cf07208578aaa5ed9e5a69681969047e5f3dd565e254f4219f8468eff3889ae4b1b80ad27318416b2d9407a9088ad56d6d898d665f5969340f3b31cdaa71b22076016bf91db78925496916d6707e6d49f2b1f1a56113fe271f4f207c2f32836e456babc31f8f65621860feb8fb4eb25a153e67ec8e8b9c41f94a9cc329d3f716467d32f821a8be6cc50127174f018eeaffb759018ec829cbc2b40c6c415af55fa3bf6960ca0b7a8976d4f9bb149fe83fd7a42ead0ad28e0da513da3d1ed1649381b9b6c2c3bf83025462dd6bf331a7a2c68e4eb8aab2b44fc8f16dff693f2ef80bf482e8b3ccbf1f863239f193beb55bf4fc21ea156f82d953d52d79c9ad3ad666f73698433b182734cc76139e4ef9b288760f0bf411dff26f488275e7227077bd4a389b1b13756488b9fd9ab9ea5befaa8480e2eea1b5e444d1d4b96aa6b8223676f2b9e25cbd1ca880354d8e98c35984afdc38ac25ebf5f9f88b0ffb41fa1ef902cab9411eda98bca985f6c56219393b7e8bd5d5a8696eb6450f3d42fc1eb42f762a65df62b320edbd575b065045d7fa7af581122f1797a541c90be6de0c2c005b7983652f30fb62431246f869307be72982040bc4ddb7eb731f4390f0adce93371fdc7a8e397345c31d7d43b5c06d2a159b25676ea317b3637aabe739e7e111958438c786b6cebbc5e2c8903cdef4ecc6a6adcf365100239a430d94c1a3afa1fa105ff31f8f55eed2c8f18707735a55c30d65ea22cfb8639fe02f3e90ca7e6cf02b18a761ad50067137becf1d65e58c943612613d05879cfabb -MD = 07f84b3990bbeb9fc280681dc25d96bf8626992c - -Len = 26648 -Msg = c8c107930ac3ec654f043992cfaeff31552d8ab796374b18c109162f57f48e603d19dd7c1071a8e4b81041f240aa1f94e4568c3a6c929ef3b98768d29e8f7197f1f5668be1fc0bac8922770ac6a5817146477648e24e0db92ed09c134e2d8b6c0bdd098a266cff04ebc242a40aa80d10a388aea9a0747fb4476a18b80fd7c326b359313f86c96b3306790a86b3baabb822a29e254d0cde2a2ddf46898b94010f13f24374aa1c368201ce38796ae443b3eb1cac84911c116407b78d50676c2d6d502fa8ef396d4a39054a3245d72dbd47277e428d16ae00aafe7854d34e6730899599c879dcc28ea0397361b2a19d01bdfe51c70981c993443aac05dbe68ef0ab08b60bd93b25eafec6d42d88713cf85d971ba3c17d76b279e2da0730d7e8561bd111dad9fd9d469dd3f2ff8eee13886e1b673d7ab0bc45921f8bc29aca7d4a20192f9b3fca328ac389573d8dc1299a3ab1baffffc2a334d718469ee16756b503089ab8d44ced9fb9108a514e91861707829e50175c336790f69303cc557a7d0dc5d9976028d56bc78f13a1960733e51eb69a98892675c605e0fa59253df18c837974a2ab09f3d7342e7b9730cb37eec77437401ec7703a7eff0408b2c6c4c8b04bf33f7c954dcb4a174899e3849a1849e4fbae9ee82ca9427a38783c99fa1bdb64dfd89c74ee304f6f051176da654dee2f704bd130b2fd9a7a1f118a5d9b6c4bebc0d4d44fdbec8c613766b2779f74fc7d1e7f7e48091cce273f3c66bbb0a249091c9beace1de9491268005f005075bcf58cb36fd739f026a8235f965b40a71de67d95a698bd0dcead1f474520803876c0424d6a864b5fe92650e4e3e453620fa96a2ad256c3426258e5a32b7d38a47205c8b738fd465361c8503115fff1bb677b6cc234af356f4e3b417cdabf7fa3f7eda757a1e332b3d4b7a9b0f453239a6c830ac5964c1d7cdb80bb3a1b8f5e1d4ea066976ce018678b1ae6c74789f0e767eacc9bbed482504e4cdb45b495dcf8c0458dde639eff56ce1a8ce0d848618aa0d73aac74f06dd5f2ca2a056d78011d9305a4934cc2ef6ae5df25626d397d6c5f73dd608248e5f20e1f2fe310e0d5740f073420f0f7f08a179039b5cf034c73ece53c20af83f28fe9767245637761e57e74c4ec17e30b9ead564e41c64fd6888e56df52c24a9c95ccf57c9430e2ac592673dd5f882e478fef58ee6d1ac524948fee4f608444eceaffc4d4393dccbeb6512d06e10d81ad4325bfa0a3920c3d7d35d413b0bd1ae977ca0c029a52dba0e645c9c7da6c8443a397b2ed4bf7cd292dc931b3ac34739c2475f58f2139b759cf4a70a8b26ede13978d5a5bcb11aff18a922cb8bab3f80bda47a60235b909f15baa4a32d1db3725084ede748ca85b9c7edaeea9440051407f8948e33d99797171ab7eeca07b397fdc2367c0f6847832f0e79f0eb1e42543fc8402bba3a2aee0f897355f85168a2bfd541dc6726cafbcc703657069271c1a3a7dfd11ce9c5146dab49611e973d2315129270e662aa840ed746b55d491dfcf20bf606d264f09acfe4bca8c355bba97c2e9ae203b840ac94982d7485aea166a9591545713827f194ca3f858cf96e96737ded9855a437e5cc377d2ce63f969f1833a0158fdff5b95ac0649fb21ec09a9974ed1c4292fab034399837157877e6ed1038ef74c8c442806bae5ff9125bf63cc82bd65120f3ac5b13213b89e5c00e8673424bd68f2e2db4208f3ec8908b59fbdc2c6f07cacd2abf588a92ba04095682d15ea31baf8deb548389b48705e9364525614eecfcf1cbbf8e36e53c5fbe5f50bed09dba868e0be0092079daeef00bb7385cee7723ebfffa08d8ab776549997e906a8439b098fff535e5c72ab83a5aa08981d61cfc2647fd6cd24e019155956afa6f0f2fca2947f27e3c550cee22a3cf9d728e64d22b34283ea64541804cc3b4516096f31fc9647666a68be81d336762e8a18fd542853508d2d739dd9ea9b4d939e1a42a4df3e5df63b6d442c20716290f9142f4c9aedb1dede7943c68e6e9581854bf4bb1234cbc19efd6a358f8507056c45029d41286e5c459dcc45baeb19f815c60ce05f1f99addb40b905e9176d762ad200b0e5ad8df1a908c2c034bde3de94b0127a8ca8cda4395db804f5d29dcc7ce4b1eb4e23198454e2ac9ec58afb1d4b348ef16276718d017cf09a7d5b9eedaaa39cb7433317fc8c52134735fb679b827709aca9328c4f7cc7e730475d78c3fc36497d8d8591439a807e234cb7314281a40b15298327d4ef64272c1d7e3435b9c640a3f4c08e40c695759ad26761f88fe11a93a9124903a57b38f8c566d92a2b7a0a93408d17db57b980148eb2fda7f556c08ef386fac4e535a0fa07be6f8c987b2eb3399333fc971328f949410f36fc2d846ecd8842fff6b9e99cad2eff4249f0346da77bea8bccccf4b1cbbb9e8de98bee9c00c02a9c21309a457d5d8f348602a52851ec44703f0b6da4dcc9b394079a877e54d5b984aec23c5c41f42a4a97d9074b008f4a9338f9193a441355339d82d67d9070f89de596564bbf9ad56cc39ce5407c0c03ddfebe82dcca408c52f26b64027e38edd00dd57079c0f89a825374c46e8d0a7834db8130f038f860d94f7cb773e4d6a20670a6134e0bb680748f882e3dfb31af82156aaae054e5dab0fcdd59398bf11f255432c5326a7b8f2abf01aa158d2ab2adf5a37812e7ad01bf41b7d2bd3b326a1602a1118da3efd08c2b06c15e0c9d899ec35122f0b8f8deef6632a866bb408dc2c21a7cc77fbb4a831bc0f98041313a3ec79f30e0916f7726b275659bd5c59010dcc59048c68706f5d656dde3f18fcf7449b32b4c38b9d64d6ea990c64f6679e797cbd47940fa0acca5f1f2f0e75f4f2790b59b9b767f034de3f5b24ef2cd52313c54d0c0b4bd60eed0b9c20dea48c341e5ce06351369040c5682529b86a223d513870d86ec7810459fd5d4a3c1f232a99025f682d71ee3741277f815d38cf2bb648d1234aed220b7596eb01b3506a447d9e4f2ea8a47a86c5efd2d24a034c9cb778e6730c3739a2e48abdfdb0e2c2203073083d5f38b59db813c7730b742afed93b195e4f3048591b2b5e84d140bb2c564342fabdb9300abc45b61a1de5dad09021e23b6052deac8e0b353d80e4c5f75361581d40a07a4c36f8370dfde2dc9070afe9910c395d0ba1acea9e3c6962efbc6fefeb8488e4e0bcadb2e527f5b0dcff4798059f3e53f51a82e70d80292293f5c1530bf5dd0056b1c8c2262888f814908b65ff95ec44074d1fa331e8be8572a40829e521076d1cbafbdd478c3702c5e8ddebe58ccdbd90bde5b771d293fc0a2b96ed0d72a28ba13c997cdfaf6a716f4cd1825de05d214ff1778c63da33f6d9010014fb8748dc92bb3429452eadc47f40e8d1df3d050f936c47aa7e6c39165dd8e62a25bb34e05fbb5e5b1e667b6c84799642dfff6fd8f992d88a3804fddb06f78ba512ab212776c16a8ad2035dda0d3b6c6de6a4082de109acb417310ca57301930e58b3882256420b40f671bfad782acdbb79c7387ee84526a0927ce016107b8ede5e80c4619cc19315f22e2b5763bc5ca40fd5ab3c8db9e8e8305512ad6db9c18d9a8f7055b8d4a4726bb52b583e547bc01f6bcaf73ffc65f387360ecbf960eda4933c167f18dfb1cea9933a3096a7bd883ed6022f7d61204afdac5ef231f565bbef13216e5b674db36244d260db1a9474d4b0fb55d4ac9a670a346dc0a5ebcc2c04a11b73feffcaa8fc468e799a21930e7799110ac42356c0434ac5b7c3b8838d5a628f5051fdcb17fe14b8db42512bcdaddaedaeca59c7ff2f7be13829e01e4876d3d7541305d1a8de3bfc16722de13ade12ebc255d4706c25246ad236f70ef5d0719e2fa09c50a42328c2bb981c35ce8ecd85d60517e2afdaf0ad068961d80dfdc84e239925cab24367a72b22a0ac014657566a56989132a75d42557fb50c09654461d05b36c25bd58503f5a06fa66b8b6cd7efa8dafe8d10c6a54fb8751d609d8263d66543ba095fed839bafbdd765c46a84e69a539d27adc9404592067ebc1ceede7645d12433292d809d9f2f91a887dce7df9996ff8ae4d1cdd7bafdc2744a063c508b639361e7a1956bfd49878c5c307b4b2519983f4c7c989681df6b11cb4507f5948f8a2e12063c9758700b89a801a9b9db6ff9ad5b262ad2850feb2d0747cbd5ff997af01ea7e0a02f57903901cd0d9c1aee966d876b0f4c4323b51e947af2623b25d84084231c06e044d812efff11727229e0e857b7b0343aaf7b7ee94b062ac5c944a7e8f4593c29ec259fc9245fcd5fb67bb64298a85ad9f780b67c5481a03dd8228e938832d05aa22b4823b9331d51f8c95fee9a7200afb0876dd413ff62e1f6f47d3a7b0333f10b3b94963a55d2f7855c3da21987c63a5ed20d7705d9d3708a5cec343975078b8be91d8734129e9ed096e803b2642bf856f30ddba69b825826be64274ff2ab98a8a63b7d1303d0d65f2bd799d191a2783d8cf77872dee017408b7d7a2af69096e61586fe73940a2ca56d94cb139aba2876e242e3f6fe8d2c5c5680a3570b6714c8998871c26dbb1037ee981dd4e9e38797b58894af84da05fea2263950ab9f80c4b4a87d7beb541f8b216a18b1f9af1414592111090c67429bf0c6b2b4519a696ef96f782c8775a913a8833227548d6c715fb4cfa -MD = bfa71db73fb3d8103fd7f2965eb89f2394f0b751 - -Len = 27440 -Msg = b00250cc952f6dc3042600e54b896d178c8484f5bfbba96afa81327df04b116eb964b302d1e2281b62d8838bc6cd842a476d74272a7f519bed172b64cc0dce308aada1d86db0cef08b6ca39c444739a4107153cb7bd3885d6d42a508aff94decab46e2f57383a969054828bdcedfd3ad6cf8e88cb89e98d8046a6711a1f7d5cba5953e03ea42ffaf5ad6da986a7d9c6ce56afc0febcac73339f73a28abefaff5fe047da7dbd519e9117c81d52309da0a023057ff1b3e5e979451e6f5d3c9249141fa668b4d233f40b3a4e41cfe6bd6af4bb0c10251e2a42b9ee1331f236d7ac8f3dfc2574816b8dcc7b5cc13058cd881495302c0949ee318de0de94fa3c3f9c19e1a59b3d595cee4d51701653f5227ab8381e1e3ec5a6185dd3ecf2c5ab4eba5c915f345fa89c78066314bb8b4a60d5382a3281061fe689b21ddae5f5026969bfd3758b8c1d8ecda016d72b56d71d0a2cc1f9df1fc723e8134504e8f8d0244ccc1e84fb2326b85172e323d037199b9bfeb5f092ec49e2b609e0177651a313b5f9d90a2db542ada6275e9754ac80810d267c9336fc26b7960e556f188fe9ac37d199717dd2ffd32e15ff8e2347ba41d05c6c7e55bfcbf6ea893b983a24124264ebe66775dcbcdd7bc73c84c679157277e92c0e59a7c8454612f91f758ecb9aaf91363890631800f1c39c17b8b12077865521cfcd54aa071b242461354054099a7a1f7177d680023293a4b3749079e56e38f42f2b46cfd0ec45340a03e97a0397fee8ae76d78335b0afdcf474977030a20d09c8fdeec8172bfeae665bda7c3d3aa8485c37c6a03fee80bb374326a1edc439d919bfcd116e7ca90a22c7a3f90ae4feb4e7152455756eaea6186ace8d713747e89ddb524a3b30dcbdbbb1d66ef1497a94fb9981116a939243f4561fa16f9ddfcec1eb2ec0f1fb126fadb4d25c84baa48ef65f6d62a40fc41b778f6a7c3d4a39e23269a314473de266554b283039caf50953b139d7a635cc730e916f8c6edf1ed94bd16fc29f7bb5585eef588894fce47ab05986dee598140125e67f3078ced70a8abce54a6f3713ac271be3c40ac31b798892c4f6e6c9233c4a091a26ff9bfafc7b76941a3ae275d85a4b4a811fbfd27c490784ae2e2b729b0773d0de47b90325aab90cb08710647345080d3e4835d2097e1246632041aa93daa133b4f5b8882c74deafbbd84367f393dcac5a28d77297946d7ab471ae03bd303ba3499e2ce26786620d8ab2fde8dfa333987316173cad2853922076c3467da48db00a8558ba6d3bdd96ab8ba27fae1fa75207b477a8b0a67f3d25b413cb6ba421da866ffe68b421cbebacd6c384d545927986787b4f589b4adc42be320afdcb92933ba27085b2c4976cfd38e3a0ebd1af7f8dc68488fb7340efe609809dba675a6a98b1418a1f90daab2b06854c683038c47c4335ee1fdaebf8ae0a91fc0813d3d12c30f3fe2103002694e42affc0edd8f8d06312074c1ec6870955e89e8d6da96774960a5a8db7a25fe93647238c66fa7d28aa7b4cf6cb4b0b666fe70db0b1558df054f717ac1b3bc786915c60213837d1f38e0427b67cf3f663ad3fb1f8ab42b53df24cce12aa26ee0b79fd3e35ddfb87bf823f3fe1905be87fb23533eb97fb9dabf26dd647e10e43d6548c0620c4c01efb2b7eee2e91dd52290379fc00240a77c8d9ecd8b26c5c6975a59b608889200824ee55cae41e12b3ee157082bccbda04131d4c3de8889bbf78019dc5b39795c3cb4f565eb881769e3d6cab6097ebf4a329310e8e60d246b64bed25be588c9be25cc2f30202588361957dad0e1820e4d569c9a632a1d5d7fe6fcca5a2edb49cd467fdae6d582fc3be94ccd7e3c3f7252b632b95d3221fd9f85224b02bc9bc232a6b340ae93063b205a9deceaa11db301583eb7fe877fcd724a199b7a1931fd944d51a7b1e0190c8c75327f399884980146a9da6db0a192a13cc702ebcd03bf9c444258174723382741f3ce96a9dcebfb88596bd335ed17d36315ca7d5e7bd3f2926c9b074d8c889ac6c920275d8d72962438b1579fcd23b1c8eb39575600003d3fb9b8a97cbdc18d0c9abf143bfff67b242df62275a87de3723299a23df90d255410f6265b1caea71c50f186cc9b3e518f1f805b3fe6ee1069d0308599d0c354d8589ea672121691fdd1ffa596c714c16ef8992b86ee3ee0b6af4729f4ecea6fd37bf8504a08c0f3b707319823ec3e73c89f87bad02a35fd60b525b6d5b54a214e604c4d6a64757353d8ce88fb73850ea5fc922fa8019a0c6fcc1453c593aa0f4fefe2c55a8ffdbcd82e209ca4c2b13b0ef704b393db37b8ecdb5a284beed3e4e11001dfa3f220744ef06dfda8438aa10978236d1b20d2a6deca405eef2e8e4609abf3c3ccf4a644bd06fed28f5dd7e9a1673986c73934814d810e1d39bba1ded1a8fe9a5dfc56d32e571b44df7762badbac8c251f8c25ef42e70c8cb2fed45340ef6b8cdf74f9caa8cd0b7b22fbf1bdc12f6473ac826d98c3e682d4e15df14d5e6982c0d9c357d0344f189edf504d995ad90b98f584d326db65b71c4e41be7634fc8a5fd351388ed9c688d59fde3ef7ae90c8bb83f8203e8f4df48d82130573c991cd90558664ab9f18a44ae90d8c7fc63de204dc471c8ae984814f04398cef2611917ce8caa2d08e2eb4224545fed8a9c9a29c8ada8fb2f0f3a6895c1d1c9051621f4a1385bca5aff000883bee5dab5f1a50ab1518415eac82ab6413257cfe546ebf235f1f78d10946cfa25470719ff11a34580368fa35261ad707b0bb76e2371bb82f53009ffda4196b981733025d66af95ccde3481df65a1739abb46d0e4005354957790f9d0894f1a930da0d88cc6c3bd2f2de39f057101c747bd2e53abb9fdd97e53384df3bfd225bbbc1dbad51a3df2a879dd1c4f53201b343ddac7e069019011705e650d4e88d437ae1372e069057d5f4989c06412e8b789c3b4f42a1947c177556c07c73f5b6e306bebc654bb03a67d255152edb63fe26fd723a132d0b6b4d78ac8fcc999323dcd790b7fda181fb42a959c9c91480fe60e028f98a09638b05a98dc0bba64f4873762dd65198941f18d22d364f9cf3f098dcb609f1b73b4ff28060efe43a98b9595aec73fba1551a3cf535c73cc53b79414bbff7f4b7013e7685cc89c0b6fdeaf10e333d764c5371317b1a091b3dd5fcfcd58d200d9943bb1432371acbbbed51cd08b88f3c0a0db898ec3078556731f01de2d42e96de815a4e0e270f7fa9e5826fc2d2e5c75ae254c5c11fa195c20df736fbfb804ae72890a68212f4571184f13bc528dda2cf7fea6a823df136ee9876ea9989a17453c80290268155dc733a22c3a810d348d844cdd9a821f3c33d8ff38b33f51ebd94ee04bd7408a09a5f83ab99b4216343f5cf93a5cb5235c54f42f19b63c464813ae93b60e30f60fb36dfd020a1d10a0eb87eb051344523b7845ff5bda18e0f59b667fb2d0c1c238989cd44ead9b6341380e0c86eab813a048d45845465a86bc187e8e894579544cfd8da7e7ac4377dfcff842050797d0556ba8201e238aa26333fca78194e3151389475f13309eb442574d77c9926cf0208ac9412f98309bb393eab1e4e6846d55e5d2e21b613283317915921bb4bcdbca4d40a1c0ced5d974e04f96f862e6c5d9b8361a47668a4a75dd597b439411f81b5b142a18ed00c46ec4343d0631908368ab7beede682b72d62a211a895cf2b1da5d4dc2811c3ac468e5a08e557a0a11ca66aa452a8e9f641c0973573431e86dd1faf45341830a412ceb9b712f66ddd5c790cb0971016d870f21591a8e3d7a95c6db10c4a14bf8a3807f2eceda1d903926d1e421fce81d42771bda4bdda8308f82a8a9fde99c8c522d495f8d9fc6aba3b1d3ff75136c37ff1b9efed26a9a92c4cd08c8e6619d4fb6fbf03896c689b67d2e3b23edfdb54425c453ce977d3a299c6ea373675177c837b11dc1d1978f3a2e66b4597104eacc1c3ae151825eb07c802f22b5680051803e197701275a00bf1e21e4a8e96e33554b45f2907c542513d6d62d93d1b754fd31f9a7007e5604cbb52773183d84b9691cad2b916ba8c177072c6b178abea8c97a1a54c6c0d4c1e85b3f0ab1558ea48ff639365e39a3ab2f7cf985487b5d746c7f44275cd31c629d7833517c19d41c5041b3bbffcc8a0cc39c05222e8ddce06caa3ec7c9a1760d7274c9ef80729d483266e1617a0ea80bbcce17ebd2a682165362d2de15102aebf0b7ca8dc5463350bfcb8bd1d9e544d1a17cf9883baf983ba80ec611490a7f239ea9fdd2547fdc5d7fd97bb3243ba585fa0d71a07191667af418e30a6b76bedd05b32c673403e197f9f878ae61f7145050e948db7d3234f9bee7f171863b3043ab3b1df36dbc8a25b591496a9a01d95a297846e3667c4ae08ee3b8ed9f431a7a1aab991f08901e2f3b0ab790d6413cca1021325d3456ef58ec74ff27c075c7adda6968930c69e7df14cd8ac81e9f85c88a4fd5f4f0a76d89610290c7f0b97e0271df52f6812e2b5bc7408ab97903fb7e2167f84ea1590a9a74f5317438f786a169731ff070c733cbdccd7e0cef55e7125cd261134f530fb3aeb5abd69e1728b34a8f962be01b4758dbdb3068887d91acc3f8d9ec027dc4fe96aac6962d02ac609a9a814cd914ae2a4dd166764d634175df412781c3bf70a0b43d495cea9e5acfe3fca6fe6399b268ba19e9de45ef3f943716157999015cc490d4fecfdfd47929ac1ccde78793993aa81a8147780ad23254dd697c8d2bd190b3d9ab98138d53957e64c0af4ce8acc9a13cf559ef9a4477bc00ec34a625152ca4b2195f8eaf2e3ce03b46ffbb81 -MD = 92588ff54cd3903ceab98afd39f1854835f54492 - -Len = 28232 -Msg = fcee0a4b7817f88402166350bbda8ac2f4be6ea3e6692c72a3f289a94d48cf4286d2d87a275268d5350fc06211336f40ee726c6188ec628e14554bab7253403daa278f2996900fbedcecb0f620a156f977bbe8e31ed7a3c76c3fb5f40556077751375ae12c99954adff65d954fece7f675e30ab20ef0992694f9ef0b6c1acbf861485f285134a37e2672efc608dbc93ed230fc55c200eab274cb2278116735c9c4a3c6896d2be1649aab8e12b337a5d974ebe354a0ce3e74f4fc76c45a05edf16090b889e844f60321e86000b6c822d0455bea3812243e72fdd61276b1bb9a781f565db22b488b63a47090187a56e92a2bca36887fc891b6759f1f167d52e467e73fdc8b9cfe478d0c8c44e267a9a1ef107ef2cc4f83e04846a0c42d269375c5a2915d9ca430d3883f84a5e7e688f328dbc0448de91dd32e56212a421443f29a37950a6eaca4d65c27a0daae5dbd87dc74d85451b75e11728f6a78ddae2d06ee8e9309881a23f912ab280bbf350e0413c30e4ba3200e431cd7c2d7865e1857ca8fd382725775e4b1b26362a3d74413d5afaa51088cf4103218736fc68ccb8d35229c9eb5cc623e41269a04e1a9275b2b22f38d0a63d921be39c367249e0f51382f3884d8e0b2afcbee151c01157e851c043228300e851dc722fbe829fdac4bda9eed5e63fa2ce155f21cd08c821338b13bb04a02f3c0ad56bb62195b116a2223570451df849a79ea1af7480958ac1df1b0b219097b527972ec42234542117e1b42c487d3e5c2228f4eedad00fe12dbe44b83c0cc0e0228239de12d6cf96809cb487728c7856c824e764727f9de0d1b92f56a65d415996371b689605a9c38683a4f635b43cc62412e7a4edd7d5f64850494ae31a7f6e0d1651f80e4969549467040d249d0226b08384247f813e9e1c04111984bcf1b9c1b06c00ee0a84a634976040a1af5ef4e7f72b67d9f44e44a75515570dbd4ea98e85d817d7c19254e19538154f53b9bd44de6bf37fb97b8684b3d477e0b3ccd9be1704b13e26f8cd15f0fa1f702298ec51a9c43bc3494ce03eb0cce0901912b6cae49041a3735e9b6c3b34b3d6b4730e9909a2b5571c38ce3fcc6d45be55a6cd4f6f096d8a6f0a3c3ec46676c551dea0755ea604adaad5bcf277440bae020f79b616be796542a22c183d0dccdea3422e91194c9e399d9a490141cfa6f1a6a368999c4e19b6c6ace772f5a94a8521341556d9e4d68d3cfcdee6ac9e9c1bac0906543036b3114390faf99ea7645b542b0141012d620b31840b1d280f7fae8aa6df90a2e6c9e741e4d2f698b6aeb3a4ad6eea4f74b545e3b63a1f34b0b61ceb1350b934fce2bb6a1f0c0464258e309b21aaace56934cffc0a08676310d3d915c5164896d7820ff4a602ad81928764b02e61238369850bc305e27023be6d75c3427cc929152c57aa20535c817c2e928c3a1ec8a9f41a8bd12044d406f7c7755c0200b56c244614c3048a9be440f87c77cb2016b9a769b2beefcc0d7d7b864a488a4e87f08363ea07c8f4d61a9f59751b58319842d1f722e4dad48707b82e872141c2cb26b10a29c0f43ea5a4d5d60edf67bfc7d632576edb57fadb361c349e7edee9f99f4bad66870cd485039302bc4c80271fd416eec91b1dab6479361d02a9a8409dcaa1c222d27932fec735440feb28041acd1e31f41c6262dd51946c564a3453223961fcd13bdff67d605b3e7c23d5d34341a6c56267ecbd804f95870bc9198e215bea92141b978b7b5f6346838ef02123a24f2d86860317f7d3d81185beae7e05a2ca364e0a365e9324fbe0a8953d5a369f85bee2ef4c1ece8eda807683999f59be8f6df170430c3f4173b17ddee3faf669d91e0a0c3e1e6ec0fb5830c0316e980f888da0f63400ea45692d55b4aa9fddc1b7af6e854fa3431ad8fd56fd2c584b066439def48fd91e915ab8d2cee7956717b00782b2f759f60ce2045b82d108dd43a0e6fe03bcf166c5b6e8677621982cdc40aad94ddb8ef217b4f1a109d5ece937ad09a0ac51e63d430c30a652fef4999fe7fde48e52dec1bbb049e9ea9180d96307364946d5242ca9c925f1edc65737d31495372cf3b5df79627178bd9a4138463de16a7bcd378f6a8c3cec9f1e1c720664f543824490c5c14a1cefeb56ba8061cf9f76a390ad0ff5b3e9f8ff6cd0e2ba57929c26bc1bff33e580b20c6d593c462ac51066c5d118ebeeb1a9774901045f4af19392c0a3f641b351618934b9e653ddf6aa2dd35024ad7b2870af39295175dd96dc5f08c5456b320360fa4338f92b57a8c6715fb6ddcb07c2d0ff93b6549e7df6e8d3dafc5710f02b42d82f62ff2d365fd7d9b1518eb512f55cf10f347829aa961ba9edb5c5e36c1d899b4fd462e9e89050bf7edcb20c0b54771bf22056a7f2091739878dfc53047ea7cc2af9ced1fccee39b2e9502307f44b1e8f3065aa9d2a45e1b5ee174d067a32fd3573f8d85c17fe3153736e9b2ed6a9fe068530eafdb0c42c7ca5cc9fbf44f84594b324965f537f1862f2ec303b42a838ae892dd1a59b577b7506c663638c837b67d6e6d03066b71967ce938b381f91f50fa526089fd146f62977cc40fb3a1cc83744072ed53aef59eb6e2b542c57ac5caf3fe137f33cd9c71f61a8de8e350b548a644f5758b56e03763c7c3220d1419618c12805a7c35813df2d20e624679846eba085f4c0c17e3d8e9f4dce1b7598cad291c11ac54d0a05f241fd00c5b70bc7df5f73ac1645652fbdff67d0252bf9216319741f54c438c2df0706d37a0dabfef00adf2861286c038ac593df46dbabc355bf0bbc5d0f2a752ee505084a51c114a5079210a954dbde7d5797a3876df7d730ed4c98e71628446845c0463e6b953086bf540bf7b0faea1f1e3bc6efc925857a0a015cfac17a57148e01365d446f7b1c9aecc15224104ff78249ed87d87df7bd7ef0af9ef867d7ba288e80afc2971dee0124dbc29867358eec87c25680465280b0e23adca338ece37b2fcb3cce543d855ac2014ff445c36ac2bfed64aacac14c0a9ea5bbaa36bd16efaebf0d51f003670e8fda0220f321156db716b93f4f6aa8f3ee9744f5a673dbecd2052931b1981e86530fe205b978175638e45e251e751cd398b87e6cd335bada62459858e0243229d647f789def0f6e409ff5a467f0b301365b171f8042c3c21272663acc4ce295edf2b4a95acb03c7ef410b588b9546d191d2a257f8080e829e9519117a7bf8d8f3863e21269e1708ebfbf77d516775a4e88caa3ea9058465a6f6e2a80cf1fe523a796c8e65eaa1b7b33b3a914dc9c801a6d3af2227cdcdf1d832437ce8515ba82f56c02fbd334c4ad1895532d54ed65e696221a0e8c363ad8eb1bbeeb11c99314ea8f9a3710a6f38c360c7b07c68f9318c9282495088be0f570fccabebb64f8404da497845c29318054c12b8c7aad921acff717a1370657dada6f602fcb0e7171e85602c901e504f13c5b6aa3b76de8527035fb1962cc29f1f11b8a2688ee870c814ae2ee4501f747b4834134c7f71f2a738bd8e4d108dda07da94f8b3c2dc17ae12b3fda71a68fea85e1b628f074bf08a2a0b7eccce0fc5145c0b8462df2a823d09f2277ccfb5642771cd4657b0c4e56c31d9f189b7c0d6b1209cb40a366c26f154e92aca029d3b851dda0d4b0e6567b9fa9995085059856ac2c925fe8b19ac77ae2976133578eb2ddcb245dd62b5edffeedac7cd3a32679dbd0158c43fab591c500397ecfae1099e18f67e93602efeaa890e085ce7d3e3e679d5bb0fb699d36bf5281ecba56e0d626d0715e19949004643b3d51bbbc680c173d6cb15928d91f308076913c7686cf74374ba6c509c995fb96ccc9e5872c4cb4555079a55cf1b3e03220569f368bee926cfca783882205364894d59307136406900fee27306d59960f882329bf769a4a168c4b9a3924bcdbfa9d5e0c64a4bdd593b2fa26cad67b1cbfb5e12439cf3a62dd047854455623b253f04a99c568bfe9094184ec52b48038ebaf76d6cc1f38a36b6b18f7d440a085fc94838252e5d20a98c273bff18dd0b33b7fcc889eecfbd565c912cc0d6b9c1a9c91ef0f35a55fffe83fb1e8ceebd354562cca81dac1ebc076264e1b195e803adcf078889330cc91a2bf25ae1355f1e5e5be570ba623702b448bb42c20a1b2ad64b80534970c83886e4bb75be554922c8f3e5d6c2a9cf2e077ff2c4649bd9c3bdbf17d5c66c3eaacf3ea4f366e6f1ef3fdb3c3ed90b3d9a5b88b9eb2bc39a4aceaa4ca482bdd6bc4daa4d586d62efd00d62571d6fdf18d43af36f2b9a29d34c738d8d3400ce06d9aca8131944519971bc39d4e6f9bdc7682030810a12372b3556e95808c315658f46c8a4ca8e2b9540e6c2144ff92fefd295c09e0b2663f891e33e3b973c3c6939b68c60c09d5959da078bc3ad00adf880264424b36948c1dea30cb663eeab98857653e5a014735d898907319282a0581d3c0ba3773d4e2d9810c546f36cdb69eef0bf81fd660226fbf5b50c7501afa4e651b798eb24fc724ab7087bca095453d2d04fe41d147e3c8dd825a2d90034659801b88363b2cc6662f046a36c769eecdd7f558aa3a25004dbaac99332f0d6f08eb68ee1956946408d66f08c3f2723ab6b6890c40592102641d8216c2775fffc570abb31d4baf2b70685a664c68d8b061926624ed75647077cfabd8c0ae227ef7d58ce02c61a4a207ad6c8eba72c2d9343334a797d815d2ed99d0e7171d7d7205e3b27c2de29c51356c4e87f358583b98609c9e28c85db12e41994cad0c99655962c68f0714bec1636fa759e162c460f6e34510878e6493a28fad0e6cc39dde5a1a6f22a4403379f77c200d6bd82bd0b482d9059c725103b14db5353a89b26670d3563bebad22015b5c61a97801b8113c06fd864fbb4c86c34158ca01a80084035423e5c4a5b4e2f5d71138f22690adf4365b9988b37fa640343fd4a866aec07b667d25176e11a32fb4d8bfc0 -MD = d947e8fd7fb5d805d70c1a21bd6eb5368f312885 - -Len = 29024 -Msg = a24953a800e0b73b4554d4be70f6c1ba76383ebe38ca47a6b202e91d758155615714334769d8387e29a2fb17f99d0445d035266230341033582b1e6dba147578af354e726a4892772ad8a820b4ee8a4901ed1f1834bbc53bcf212c7025756b4b13764d34eb77ecafb1c082e08a317b4e7128cfe72ca58e447eacbd2f9feb6062e99dd892d4ae6fac2420325f61adffda88aeded7003b94d8cf9476b00ebf7c469a7396960d3543f8edc15fa523ab3c77ae46f5f098c5ff7e29a001fd5c3ae67e8fc030477e548f1b726bb2bbb6735dac4bbabc3bdc8bf7bff49a061e6fa1c7922f4c4dad10537b9b1de5d2a8044d8801c7d0dabfb5d4a32199482c19313f460be1de96d1a979310255f96974f381e6ff8a51f88409ea2b2e7e721cf8885b8c700f40b3ba320fd6d7816d1c286d569e2dfc04bd93c213b86e0ce27ec35e3cc04920384b70945d95a30b0a95ca5915d81486b3d2f3c6987268ab5ff9809a2b0b1f7c8f06fcb5ab94ed5a987c659e07be3a8e24deacffc180a4c4b03539247095788b0d8e657f41fb3dd6df78fe267175297e208ac753d50aaabd9edbf5e45385dfb47988b3d966f31be7a6329fd89e2869bc6f7e4bac1e3a0300f193bdc21c03d9629c9fefaa64a410f5b7524f9cd5fd80b2d96140f1e23636f3710498a61239f0fa3f7920dc8135a368d87f175a5d1cf8c626dbaf0a6a26cb00e5d78e787e4dabe528be4e5606ce5da8d261fdfa7fae59621d969fdefe334a8e17b3a720a867928b201781003b99c51d6da10c6583db29ed88371857e5853c04cd41ec86d8b02e54ee2cc2c267bb633070e74981b1caf2cf2d69225c694329ccd0296492564f06a95ca41884d35fbf47a5dabe3750a43b6fd4d2c6d6d095974de812172d696da3f030278c2ec8ab62ccd2237270aa908d37471a0bab63a410efdca40e3d5b328b93335f25a88cc7d325c06a6d1205b76f8e4deafac46a981b1a768850ab72c548f82df1ebda67dc9abc3756b806aa4169dcadea99092d9941367c66e560f74f6289e688e6ada31240f7ff8f5a35e155038a30c1f262f3cd08abb7e5d64331f75fac25ca1f0787904c40dfbe5b86f21bc6fe9e170db8065ffbe2efae2a3b6ae6c9cbb45f9dd25a7f46fea08bc4e024bc39a1bf96f0f1ac759f41ec69e932e843274d59f068f46506b6980a9d9c2dc060e5db5ae4a5f72e387e3175bd1c0ff537029add258957f04e2578e59deb540e2e501539a934b0d4cf1f1b5452cabad7eae11a07a507e1427f1b05f932b93d564f04b5228ea306e5620a654fd1fb1ad6834c35a119ea7ca5c01ea70e050fd0e0eb8925de3afce0ab1bc8792fe2b7193c2bcb5371283b0f5f39b8c6ebbdf4f5f32965cb355747256c20e0bdbb2c079e4f09e7dc417b0181b91370ca59037194d9312211ee8a8abf7199da9bbd58f29259462738d7b944bcfb76ce1c207f8d95d82c475ed37dcf9502af3f7afb0d81dba00914cffb8b0ca76d895b2208d850e039425d19aad81d8f668995c13ff4bb626d7b34097799622a57759e45d9b7c25d449aebac3c427d95e75167da4fb5a80f07c3124f128a4d2d006120ed5ac3ecf5405d797e5164f58fcb2c3a2cf3f750cbb80b33079307d698b176678354a5d58e77b290f7b1e690655b44981ff562bc7cc678219bc3b70453b2dcfd6d8f0485112fc2b77f236f5300dfc1081b1c9ff30b7a3463716a43df474bba6a15d3890567b1b4767e70a748469fcb13882f56fd611c6781f350526f5ac43834e1e8dc5c7645b1555c60387620e2883fcef72ee364f43803873c8dbd756480e53b95a4922832e1dd81bbc7e576f22317553cd0acfe49d07297f79bd08174b7048aa389b064c26b955649ff9e3115c22086c5e460166557568a4a26b0643c081a36db35bd113b780541d285a837948ee4c75c1108948ef435c8fad366080499aea7024dc119e62fb6ab1d040b72b7aeea81c7ffaa5f0dcf99b9d24cf95314924844e37cc5630bb92ffdf322d0c9c54aba1dcf5751612a1109c59939712fb31c71774568cfd7f23df89d1c87fe23088cdd013cc102812ce20e541641d7832b5fafa8efb9ea5de2e49af560dc9d6ac69ada97d6e4c7a75d692fce120d3237c2828d3daa181bdd25d69c6b87c9b685489c39466569a7bb03cff49b55458a32c1ad909f3e2d6c3f013a866958f54f5cd6bb8375b0f7aba6673be523a790e75e700a4236739fe46bbf38e1569c0973d7b71e3f8e8037d94ed1d68bced09652a216be2a6a11168b4aa6fa349a1bac27de35eff5f89dd13b9c88c86d059700d2e6fcf4d0a4df3c6ac200a5079d9d87755996532d1bcf6cd978d638132ec67670126bd2bd4aa6b688bc1364e3c6ea4264302374705fdeb0b9cb014e06b3239f330fa98078c62e2fee21295d4e7fc984fc4b247a452c9147e57b5234cdfa772423c3fe27897e3f4da2d788b8d23004f54692e18d35eab1d66572110ff06d89ac4817b4ef79dca1b8aec8789ef73f613e49eea1d3c70106083f96860af87223e0abf312ffcf461b1919da43374415a9070e45ae7783d958827dd1f94a6c730b6853405f8013267718ecf730aa411aa3f79b814e9ff1da6fef270ab1fad4d70aeb48e4e499cee37b5c2e06862076b619b7fa88ca749a6d13f54329f740b906e81293c9e97387e5f08ee7ef8ec06c52d1ef33446a1d05f80b3cdb151344a1686d843bd5b535c6949d55209a90b3aa5495464c9b75c2bae5206df6b84d2f176561e948f2920813584c5ae0efd320b8262b644f77358d429a1a309df9ec29a0658bebc307c614f799c3452fd6a1301f2e5bf243bff0a42481c12cd7c03a59c6d0b430b3fc9a80f9bfcbbd1537400a66d6ef98315bef2fe800dc0aacf57de8100ea46020b95675a2322c6a9bfaf9d81585adfd20327a57178135712481fefe068723241225421a785aaef5c80714bfb5a25fca182ed843386b920a484a05c131a3f924922aa69805a01906a546d9e9cd97cba62236531dd326bc7d1f39da5c18cbed07a7afc916d16a3444389f907ee5cbba3a4433310a701a7b71b136c4f54465c9755a9df4bd6221c8588bfb80a585a6f32e880bbb3498af968f072a0cb53bdb5318b2da6fb5422e9de9a640f28736904029f6a739c3d24dd77e28fbfbc387935495b74f8225f9f77ba08f582e4c7ff167d395eff3dfa75c04e61c93d748aff7939771e475350de62a2550297c1be93131d56dcb30ae9e44e671ecd8e86b3c6ddac4e9828f0f0862711ff19d241cfbb866d786243a5b3f6d45c59fb47855b55fefc4260f19d872d21a37789b6d793defce80e9e0570c123fe98a3d0ecd2da2349b4030745bbbd1a0eb14ef0aa157373c30799de9d0eaa0239969cfcd301c8c54a6e0109a9ddeaf33ad5f5dd406e172085669aa25ed1c707f1f095cdbe94afa27d84bcd68276993f327bfcbe0e43c75bc06f9197ef5ca0abc4114ec1f40de7415f92a6fc54085064823dd40168593c8be09d1f1db321ef743c82f88817d008286d024ff9b325a8f9a6760c45e300cf47827983a23ea3ebe7b7b0436e9e7daade226e283d1430fb651bdf15fa02ccf805027f7fc406652e7cb243b003fc7917c91c30b064fbccc03d5eb381ac4c205f4b0d3954019ee83fb9d897cee6b655078fb6f488dfde5bbff8fb9dcfcb23ad6d9fff11b0d96c9f88158746e0756093d2788f24122c3050131e5f1860e53dc69b5a54a306c9f41db0163abb953e6fb8013a1139dcc8965c9214059dd578defe7130aa67d641c9c510328f606da048242c4ac9b0594374e395809bb8adf49bd777896cda9fdf52384100e1ffda599e8abc113532080b506795da6dd34ae708c426eb1865d3f131e9caf7dec45bb8b73e2923c00979bebd5b2b8818784cde8a5707cc39a41335cd5c069dd278724c46c10bf916d11eac1050cf2008321439b50282b34d2fce0b98f19c597966ae92a1b5cd07861377720ddae928d98b5186fd592016cf4374f1296cf4b11029711a7c7ef4e5ba3b149eea4c1208f8de5544e7bd788d3c8998650300983b432b5a422b9f0c1a1fc266815a36c256e2b5b001f8b1f48d118cb8f59a6eff6e8f06dab823a88afb2343edd7b22d828913abf24ca4d91c8cfaa74721740ab2b1602672cb190dfa2f613a2af0a682cb16282b8c63609569033473d35714562aaa4314a3296031c21d561fae6a8bf914848caeff04d07952867b7cee24eff3ffcfc45bec219dd68b5b7e5ed8b3f6d2f76abdc0ca9f68e7719d1c2ce8098b467a884066de62264eae4046824a4b6bb2dc2f37eb6fa19e824e9db30e61836ad0536a63cfca599e2cb3924b2473cf5f1b4b5897995e99f5bc323ecc8bdb110323f2fc9ae1608669d32397f8bfd58e457ebd5d39452816e307d4c6b53fc530e8a3d1a5425611572de486e7dbbee026b35fbad3a9995c76faf79eec29a4a0618ff287fb16985d6a3ec345f8709c34172d20bc2274e05c58a1fe090586250d316d728e647422b53e2111f94033e241ee177449e007d4b82a8cad9bb9576b5c1f05b64d87e78fb93189331965b22b89fa06ccec82eec0f06aff68df6e19d22d98ed305dcbed29c9e2bbb91ecf57d28cf97f9d0c81a64f85a89ec23c9a49e3f22d887327b6f19b77c05d1681e3b171bb3af6672272bacae851cf4c4bc4642b3a4b7be143cf915f3368c1dddb593b83a55cefade6cc88eda8f525598582f51276711c2d3a7c58ef9d2aae6193867272dbcddfe391f5bd024811159c624c8934274d0d99644394c705b4676442f1e2d9bf0c5baaec84b3b3362434677a977cfadd2da4c859cbe1601d64713852220922dfa6c7662f00097b03acf65d26da5cf0f891963ca36bdb6544d9706049ad51e8ae1bc7a801ee2ac42119dfe00fabb5911a273658a9a9cf210c71d97ea1fa5985aad9c0d2edb594192f0955928d81f365b24d29cf051c593dd4dc10d5f37f8ca4766f37994aecd2047de9fbd738d3b2e94171d4e21e29e6165e66bb28a6c367af715ab04dc1fa60f0ae4a37409a3760864833cc448d591234d9a03cc9445c77112c2abf72bb64cd7830989c411a2378e757116468bb304a3407171a4a44a13774173db9aacfc27405955 -MD = 66ba577de1222642fd9e3b2a6e20741905356c2c - -Len = 29816 -Msg = f7a5098b2a4d92a7e71e4658b458f47a0b5e0427adb967da3a60ced4ff361abf0fd51492958a5fb468a0ab64e0e22a58e95b48a4556097de77d10880ed9b618dbd81eb78a41d6b41aa2154e1fae33be8f1198b6575e07a0688043c801c7b76312932f504fe0da096d529ab97a9640e724c1f3630b442fa999581d09d36de41f37d6f9a004b62e5fa103e174d966b8b3e21f5afceba8dfee1c8d12e9fe0cdaa1bdec14232352421b783ea00cd69039a939924600730c96d24477bbc4ec44e99f076af5564625c3e1357b4ceddc93123bbdc33afa2beff31ab3a07e4728a6cf6bb6dc13b5c7a122357b424ea465eff0efc11aa06690b3631becafd0dd2da2ca9c4eb7f5de3264cb8cac1c3bacfd174439f6012cc22c07655a51ee69e375a989a53177221c00e14e5b6a718a742ca98abebf2f1699684c785a7604a0169b5b7b2b01921f0bdd97192618dac1a66f0742c2aefd2458d0032a90db5af9d309191d7231a1433a02f6ca7149c057902ec0fafa27f3ac8cfdcbea920479fda54972ff2f342d45032ba0b0c17fcad2ddf65721d9dc8b35a23bf746d253ea1209c6e98ec69b8e8b13b1f58aab2d42c9fc504a35c61f5c46352515ade67c23ed7d1bed4abcda5d8bc83095b672d4c08367b71ac56362cf64b253b7be22df9fc67bb31ec1967302ddbd11e1b2ccf8ecb59cb5394f16695cf7a6125dc62be0e6639226de71d7e826e75ee06a0e2e2bffc727b536417385ad958d1b68747632701b3ce1acd9e5bc223f1a36af26fac0a24e8541823aff3a09c4e3c978377646d573e87e1a7864719d5b9b6f21abd7695ca231e4bd9a1e0929fc26970d8dc0907ef43146a7cbc88af0b34ef451fb28788768ba1938fd547556a1d21e88f5d9a1d51283e5c542866ab4dca180c0938290cb188a4994c32701485c82ca7aee15ed90657cd5f37b22b3523e3f7eee036a2490182f10418a2a2f57929525640529e619536891d2e421d7716e75694ad933b66f1e14e7dfb0d2620ccaa5b9d4a97a2dd862f393b40c08696ad3efba578393c8b060d84acfe5945be09b20e23d698b27662a8a7647614acbd7151aeca470fede2ca6e5b38286f44f7b5a83491eb3d1653af0b993ed626d812e88639ab24fd9590c46c9aca82376ef25af6958e926e159ef8bfd8716bde51bd9c4663ef16eb7ec07c700b0912990ad87f03f9c3d213f87cc22c2ca63a2561e715faf33f26c1ee987be0749ee27e5fd0ad3728d7b314081797ba5c854de14eb8d908b2425a672e4048269e30faccb6036bfae9733d598a97fed132b5abfc615772da68a1bcc686e16ba85168606d579941b4063f79cac92480d974df5c5ce2ed68d6dc0354c43da36dd054ee1e478ab9b7cd45e26e500ce4a43aebaa69eb19a14166d811284a9dadd50571693c44978b56ad6f0524d19a02f25c5fbfd98f4d9c87f122734341ec282bae6e81c04bc538a5bd4c4fa436bca4f2a898c5b432c805c1df83d0aa8f733bf83514dfb4435ee82d63a369f568baf32d845d6502bbd0057897c3d0671e7a0fc2012b2b1f16a8c274083dfa1f4edc162a597747cc12aec43383aa1c80d449cb147a7b0c0aabecef0415e3ab2bcf6a357190af121a1faa697a0a005c009b27987308cb2b7cea719765f05b2420d5ab7a8b8fcb6ef2ca0b1dd5948c37ec5a5e9e6913e5307dbb81e01d036d0c0647e80bffc093055efb1b07cd8917564ef934047d038fc2150662f5b6b5e30ce60c6910558ad17c659a2050e95269612d5ff2f3384092894db35dfcb86d84cbc70e76b216544b7e0f8f631fb2554aff9276df922032b62f2caaba1ea99517f2b1345718c988cab165c22c9daffb82d88425450abf42c259bbd4c18213946528ac66536cf68d16bd6e1bc3f168acd8950b546a829dd680b10117ba517dd23616c18cb3d325cbf74b33836f4565d116de2feb97234058b6df065cecb270b75163f78fc077dfaa3503bae079be2fd0025af9d31415322e2d8bd28ca0ce73ab80b85755bf80ab92978c0d1c29864d1365b270f2297ffbc2ad5c6e8d1ecc0e1689bde7c7fb1612ebe78f341dc7c54700068e9d311e89217afefae149aed5c9603519b1cdbb5f9b1debb335cd9ba2a601af9486783a5d2ec0e70e33a698112df14c75bd504686ce906ca11a12ed46f07d266f35b0c720aafb31406c8e23a7c13196781136e5b133ac3100ebd604d9b0dc34c5b2bf0bfd1b92a43795e898c00d89dbcbb769e00953da0479ae0029826b85a13f038f4f1a0bef089cb69c3f839a5fe215b7cf7fb5b580abb46d78a469abe235843207da9f01792516d5916019ef1c74ff17520adde108ef582f26bdb7f75ab83d470ef6b58698c34efcb143a995295931e1d9c8ab60d8980dfdf2bc94d855f111488ee98421b4a9eb32e3305c12ec59521d4b0245b95a6e7ddec4e827d53ba9a93f6efc335a35a096800f6e5af0cf3b0ad19200d374f4394eda848a997675a8ac339677eab98470f7ec1d46cab639c90307950a7e1a10c028f91aea114369b6c32deda2d3c707e1b581f600d4ed92c9e2c63c686d3215ccb4446e50b8c5809b96345dc4130b27ba794480e4a21c410452176f61ca446b2599c26804b683221ecc50ce27d50d4cc5ea3fa43959cbb042f900163ebad87a93807bf14d3205b8090d8926113f56dfc8b1794b492483464b7f8c19486777a9de1178ef7554d4a82203e84ecb796d468c75fa5b5a29ca6be68dc060c4f9a862cdf3c04cc246775c3254742e9dacdaebd9dfcbbeb5902b87ddcba6d4fd98f40d29cf5bee7d2d763a00a836aece0026347797f35aa2822b02f6e0455b3a6ae210ba4c52bfed345aac56a834b7a89cd88b2d447a1968275445fa75a5dec29afad44813aca55c80aa19fafb782f71a97857c48e69e151a62db6b031cf46de4ec4c19bcb718a103ceee9b54a0a00724e8f00051fc79ca3273ebee2bdca79d6afc9407a1daa55528eaf834f3df010f3b4a4eeb59c9c31a7d410c656c09e61f2e490b7afb15eee6a9e7351907b34493c023f889fb0f088a5d32a34d5e354e57a15a18f002e953da095c5ba40adde919461e8388a01cc89e54c147127cef3ecb56c8531363d57293c9b2a26267af4d245f928663d37371cae6857e614288360ec0ec3031985ad9c85d72cfd0b8b80f395f1867881fb3a294a4e7afa64990d286726e36f70af9e7ec47252a8b78789dccd728bd71ef5dc98ff280514decb972c6eda6edc056233b54294248df217187534a3bdebdccc2551161b819e4c632c544952ebb29e47732a44632b1584e334a614ada71c83281d3cd65175ff740cd1883fb7e258040566c5150aeea83492e557b3b7ced3dab3cd4289f2699f1e6c90b09931db38ff45146ffcaff6afcbcd33705beabc76aa123c497525e5e6142b70b4a0e75fb956af860e407bc990123b27d9526ef86fbbf0723ae413723c1df27a7c9902f543d3eac38b2a95f1b5ce85c87ae06a0a24d5f378fe1ce497090069b4f0cfa9263e3c9fd3cf0225f684ca521f3b4f067bffc0c3557b66bfddb5863728f9890579125a75bfc110555e67cd4b3205e56cd1664309119b09cccba87704de7d0e3e7628f5158e489b4bb3c59e180bbeecc197c3286db5454f35e94a9b7adc65a77ba5e6d526484eed2f7c060660b250aa30527d359648617e1fbf04b93f2c9a9ce48fb5c151f6ba4c2a4291cdcb2da168de8cfc332dd2d6dfb4d63c9bfbd60335a3bbfe823e9e7401648cd0bb03869b6df6cca8e9d95c8eba1cb55b0757e087baddb127e0944b635304e22a97adc525039e9be92143ec70577fe4cac6fa541072bdfa9aa3fc02718c32cc072b74f02670fe8027a1138d64fd04ecf0a08e3985a6681dbd931dcd85f318d3cf3dfd1188fd4003ca32f04452f5d354345cb898cd9e09a2fa78a0b387cfdb7eeb96f32f32f289ac3a9c821b228815a400c42278d2a2c612b8192cbd6069a656c1fefc530c970404dfa77219bcfbf265bb9e74e17bfac7f45e3f6af1f6099fe2ba3dc084fe33d692221b68460999911eccb355dcb0ed35d056b2015932f6eeaa3e1ae9caf0102ade69bf0babefa91b579dcb6e6f59c4382f073a9afdfc7abc36b65e1c2dca7426711d5c044f5772b79895ae67a55fc8f797d99fdde33ddb310f88d103b674a8f2d2a7bafa3b2a3d8e6a1c23e783a83e9b9334a87115db6274bc1e3b466cd6f4b7896da196754e52c8549af396131d714ba8801fff9bc057aec5df648d58d99f9d1fd9d98007adf98cdf77e61e5ca6a8306025ca2e7bd20206b332147f8063f3cb1b52295ff82e7a02911cc424662c2a72428b71a7bffbaaa50c8112c4ee5d366a053f5bdc51b81c53f5ef55533a954038d61bde126f2299b25b332705aab0b1a1660a359e193529a790596150dfcb32aaa53bd816912f155625b01beaba42ac99c51a804e588ce725ecc3afc65db448f23654265b2f0967b9f45fb61a28fd6f79aad7039317a59ff69093085bbd3aca3511cf918a509ad7024faabf3efcc8416a9da988165d689841043334b70644ff9ebf12e14bfdc9ac5abff800fd3c8a6c9427f8d57e32bd1c2fd109fb8340b93052c787de453d7e30e8cbb23f00f22d361ecf2cb4749e8c71e87e7f25677383a57cb1954f2118a1a9d5fb3e45ee2598e8311eadeaa0aabde09393fb790aa889a64206a3fe86961b6048d705da70deb3c9f49be442a95d38b15998e7c015e7b37bcc4d1bb11dc0d29d6ae86fc52e24662390ce378338c0e52c6116aac22f36e96b430e64318e9dafa862b5e5d0cfff993c2c3f0f74f4d9ac99d495ac47019f13bfcfd2e64680359ac859c6cdc1fc77345ef177d5df86b2763fd99b5517332919c0971f09b79b917c4677a490615c951fcf07fdef8a9553296799b20df96cdce3b3c480354e88b83b6ae3d69778986043d79559c73dcac2af593b613cb754c15ae37d7ad2d1efb2c17cc6e449ce57e186c0c314c3c2cd09ee5de8314a1794df6497eb9748097788f4c447570d2a421ed1d0bbb54de04530d0bbc8a89fe2d43fea16365effbec941be8a8fb64d5600210d51a2c4cc5eda3d3cba0250a3dfbbe7d5a9855760b88de50615c58970183af22089a3c9a805353a19a3bfb1bfd8f2e10b98000bd1be6a7db4ae1259de399897f4c1e34d489dfe2e51be265159932135762bd101bb9a0810af9d9eacfe81c11a6f408dd816eedc22cb5360badbdaefe9fdaa1dc1871210a6e12a900d3ab75e827b50c7f079bf781d6f -MD = b1542439b3590f2e43fa30baaee0ed11a9c46bab - -Len = 30608 -Msg = caa5cc5d0d87680eafc29429bac55c9e33167d485789c7c124b5c57a1ba8a00b45da41c77460b694cb62d7fa80cf2979e14f0220957aee5b2547520dbbc74fde2913e9d72c83692cf220ff58db5cac6f7d015fb0ea685f5a35ebe8c2329c19a17e380eb2bf56497d2de4566d52d4ae290d13dd21ddbbe0675c89d1c10a91c6fc4c30f683b5431d30839622616da0f74f9c6dc29bf7db3a2aa3095333ca0d1d969ce5e97094b0afecfd1fac5cb4264f882ff75645be30354a1153b740fb78e718753e31a1e607c55aa2653c85b0cf7e7cd099e348bc239870af50450f2439ec29e023153f32af28217a511a04e8034bd4863bafcc791a2d4384e644c9cdbaf472e47cdc720110a0ea8dcb8d02e42b80385ac503f87c7eba6c98fefe957f62c79b8931cf61da92f45de4bcdea72dade34f521f27f44db80892f381b99cc0992c4bd72b3635459dee21860a561a4af33dc2793163e9742edf5e9e55be051bc7ed2ad7505915ca9954df7b9f3b84c3635538d4e4ffff794a0678a06455f91554d0e190897f2af2eeef3ecc61d50c2167f55a6d1e425de57347870194c5a038a99e180abff19c440487e7803a6edbeb66e3d04bc8762c40106833c9cf58210b2c1e764ed8f8924944e4819f114c18a9c8e84176cbe193108b322601fc54a516461aa463beda348714cdb532cdb8ece4f4cc56f70dcbbbdf4b6d05b1030253e25f584a5157dfab88dd0b2b3f58fa7f225457b6d5787ecb34b8e17bdfccaa54f6e0a20f218d511fd408678ad1995af8ee4f510918f341ec983a552e953e94cfda2fbe9bda4676b7f1fba67bed78207fcd4d81f9c9655b46923993c6da4307ed17b67497846c989c692093a59ddd933e49b6b02ceeb81500aa1d61ecb7c24dd634dc8eab28e6fdf6c4def5b1e8b0fc5ae9f3a64a92d3b743684e884832a4acb1b908d27ecd9cedec889c9346d7d9a3fe356a2bfcba9e89365535d08156cf6da62fa40ab97b76b2a63fc4360d7041d050b68407ea7001d202f838003f282cd7df1d17fc033a5c934d70bda6adbdcecb78f3a901bbbbe4dcced9c0e22cb2a334810bc971051336d709a4efabcfc669db9f7542e317a42fedc381363ceefb1dcab7812230670decc70162c20d1b92fb4aedc2b573a831ca4e097700d72d0b80e3a7088a03d03166ab5e329e9338296a5e89646c7a136c9d47c743887b92ebb6c5792769b0e8868dcb479ceb07cf93a0609ce3cdbf035d911f256e34efc4a2a5b8566727005814476ee529112f87d883974dc5420c1e0b8c204c7f6efd6c383706664f2cbbc8e37ddd606078d30901fd4dc59432270c7e779064fe9d6b32b652f5d067e0a9dffc1861dfca88bdfd16f5c82bd705d976be3bb894742802bd23e0cfbd37ac914666fe408aedaab4091d5252a81722ea04d4bee00568798ab687c8da5448f63da52919c28a53447fd820fe3164dbf3225dc7ea50df62f7cbc4eaf25fbe212773a34e4f310784c0e71026e0ad86abdf492a9fa64f49ea0a8d905546a5224aa8fce8db8ad3280784b45a38e010370f4e261264d9266b891a97c2cfacf6a94ce0a01ddbb1f21663faae5d5de6a09e90a882be1f6d1e6ec68fb201610c987aae3626ea53acd4f923889cc29ddaa7e4b55625d5d8497d7a2ad2a6f5124ed4bff81458f64d63c1f8cc98483000a46b3007bed70095558bb63c493b47ea5af29db3e1fcead0be033be89178508f2d35ab0d4960e76079924b845d389ff1183a3e6604db6de5a5e1ebfedbf5ca515b4c7c4f5f8731409dd8618a7667a43071f4ca99e7bd289300a23097de87454f17facd556915873ea9a61ed7fd8effae4b6768d4f16ac2e2b78f313a01f5698f4a85c3a8cdd390608544adf25876587390dc41a08aa9e4dab2f0176faf09df1bda3688cff586f5b01afa3463f1e75588269b7d841a433684d90d09bf4d894ffbb155445247f95d364e10dcb32fa9a1f4f7ec430909015fe7152d30b0443e6035b52a1eba2df371f90acdcc697983e2bfe917bbb5c0a9080b4c99b4ccfcf0bbd3d0fc3f8d0e3bd901377b2d0d393ec1f2e6630f13a503d8f9679abc9bdd6708dce915cf56529a3c56bb602627d6a2e594d51a64a821d978b84f7670a4506aee59e7bbf59a60d8420180c4e040b877f7ad9d82e5fe9df18f50ea75f96fbbc31551b437d9e3a2bd94096cf182df47859e4628e3b79c7f14c6ca22e17f84873826cc37d1a4b87f10da76692e358deb9483655d87050a300ac52dde00296c1d92c9d358d07ea25f9bbb505ec221d10c6b4d1524b5f5d1199b3381061c20aee398a56cff7e8e28aa24e0a032f66d3312d3a55b65b4af78a18fb9cf817b8cd2431463a21421fdd2c974f16ecf12423b6594334108cd5c872fadfe1e39659460a4ccaa7a7f02f228225395c01c5ec7726d769ecef64824862dbeab76152460e16e8a23fe286996b31e8974a00121255f92418f0a156d2efe028a67dffdff19dd08147635f89d11fa25dd371566a5838b3dbcadfe4e83a37716d9db62d93de7dadc324a27d5e88a85a018862733300a7cd4b0a1b18ad4aa77d173ae069127f16251ae47dda89029ddf50208df500be1bcc1e5122bafa66c889b2089d40e0560fccf4f165e5ade18898e636644a67e32d36a23a975a6421131dca714d2361f5b31bedc5fb2d11a7c11d103485f1bd0224739320e9658f0c0fbfcd1f60af2bc0b87871ec9e2f78c80fe28aa5436984bdba294d9e896acf8a16c6366d8842b25988890ddfdf5b37c49d7fa1f35d40635856be5e1df7e89a1dd0e792e6147c7a329bc42e0a3f3ec310224af2b913e4bd7472b93139c55d9349c69a7f03a5bb07ce6aa05f162e58cf4d16eaf96117e51794a690635c72383f9050353760ac8ccf8f8da42d6e2d27a0dde3b61285c9afe63b6ada60f08f16f384166e7867a96056187d45f58ccc29ec452162fa81b9d3cdcb280db6b05c68539771ac9e932ce41fdba21c63fc8bde060558480e0f58cf22d66680d0f69aaad43d0a56367d9786a16ba48dd537dcc282b0e0fbd969371089ffbefa4c4daa5cfa074911bc7179a67f2afd10e5c94f65e6ba63e4c939c536578999d085200c0d3968a665bd3963e20d9c045c021b4446a694599969fb93bf30067f9a1818502a16e3baa8a51fb6b7d15152a5a6b86bc346d11a90381923099818e8bd8190e742170aee70f0af12a66edd70b4602b269a5bf35f5fc03ce3a3f4136db13e1461c3ce30ca454c61e82c3a82e6debaedf50a3a6d706e7eb1561cd898572bba2d204d8117c6ac04c2a7b7c8f41dab137b57b176c20622d0211ae2ca1a6d739245d34de4027c0bb66be1d79ea39d90064def1ea5737933710682842d1bf92f32f8db237b9342eadda8271a3013df340feffba02b044216cddc2d8f861f92c538b0a88c9c4cc3cfe711d7ee01b76aed9cdc3df49be71923330c8c437987b2cc0ff7dbe7ea8177317f3384c19810c953499cf67a6cbe470f6d321f6e5c06e1aa2558e5a3daf3c5a5e287ae4377c262db72ace5a001dc5421c8c7676eb1ff97f6053e466ed1f647a3cd88c4d2052ec00cb4866c041fd3d910d246f4a32fd45e164c228e97841b6591aca158fbe4b8795d9ba3fa250b374e43063b37ca1a479cb156901ecc55d5b815ec7beb3f7b11f7447490207158791c3ef10eb141f5bbec2db121876bcbb7a7a72972fc0b5cadb267ebd57f878c1bcb6b1f5be1896693c501e83148f45a23ccabc020fbedfe0e432e7dee57c61a81f46dfd8d592ed171afc46859f3f485cc9fba6d006b65d396220e973559bb885dffadf82d7890cad814ebbe05e8fad2f489596c8beaf171d7c79eb464e5d65a0275b1abb6d06db7398cfe65cfb865c64e11ef6b3dcb1f4d65ac3571d79cb50411df0f84a3f1041b088062dc11e2d3e42be202d590bc4dfab258994c17eec62b0e941e2f9f4af29ae787cf9d66e8a39130422a382f1f1bde305500afa04c98134b4d63e8e35eb78b391b7b36494a8361ddeadc0f6363f77c721a2218fb3689617a63875d2a9cd1708fa41c133378c1eaa7248ec7c83b7f59fa206414a35d38a9fe6eef08df95ceef5dca28d0b0040d700e87b8fde805f1fb3af05d2f12f1243159d801687cca1e5c15f607db497cb4b6769ce11e2d441dd4a71263c4d4c2babc1f2774e87cba2e5b6aa05fbf5a33560291dcada51276518ad10f1e7263128a9ea0e5902579e69d41ae6196e98cd86008d2bf652f223d1b625b3ee3c44891024d918b199bdecfe9c363a223e63bcc712dabbdae28f6e8fa1f882a6a16efaec06d739047b825d672352cfaad21f18007e59f7fff0eeb0a7bf6ea6a07f6e2cc3362a99dc0f6e9aae53b6cd3894948b372c5205ece6d8921ffad147643f0ac99d9c1a5fc0bf484bdb12a95b55eb89bb76040c0d292a15bb0139678c7b470b768320f1b439f3da18f44a74a1873fc750c4edd1383f266dd555647a9e6c0138dd7baaf5bfce11eaa703e260c859f917f32ad2e7adb540a885216250a5bfd35ba6902270a9078241a30fc2b3f8507f3f4cae98979513e28d756f1d31c8fd273a79c770a8996caea7b221d2b558f63a07025b282918e273e64d467c672fad649ffc2a7ce6b886fde37c40fab011d29239be366ae55da95b79b4af67390357f250dac02e712ddcd8bfaa7422ea4a6cf09b274946138df0010f53b0c6ee6c833915b9916f9321f6a501e4c532ac2c4dbaf7e69ba5facf40cf6fd25481cf91baa1b842a62592bc5dcd72d13c123edffc5a13a2346de34c1f2c63d8a081249b8392ff1c063ab72598b9da1ae0aae88a0136b7041d88162c1880b10d9eac35b16774b4efb9944a852fd00167bae2f256e5b8adb35ddcdb96b034221b55eb49fcedaf9d65c81d9303ab79ae5fd0a3a36a2f46bc58fc537ab271ae7ea7cd27a9a49dab83243abbd9c8931eabaa2cd345ef674aab9b03d43aa9e2578d5c0f469ed0ffd02dd4175866fc6f26bef1d65c1e0c162b4323794665a38b9716df22326ea89c87651e68db80c5c8f9b0dcd42477eac3514c99669341c7f5d7e3db0ed16155fb36f1aa342c704e24ff4812301597b0f6248ea4d2a2173ea77dbaf6dc0dc1ffa4479a1f83337ebd0ea0503cf216c887370cd0edc65b2e3029f364d893ccd4cd202028255dd8f13b0b448e01200e50970f71dc1c49a6d0c4049fa92a3bf8e4e8f62b6366cb0313efa553cc0ac4e7780705bb78d8646b4322bfeb5094dd783778aece1387d49c2a026335d0fee5888800a2526dc91e92d073e23e23bd7f3415a4d173ff33818b7f9bcd5262868cd9c8a96c9e82987f03bfdff6ffe84e2c14c894e681f010d9b85ae36c124c4ac0c27f2bed0881ed8fa7588d829868eee90097717560aec6e40b0202c7de55f1892b -MD = 18de122bf588dc3d1eca78661673fa8d8acf254e - -Len = 31400 -Msg = 141fd0b3d111b510ddcb31dee887a3d463461a95ef72687a15c17892375ce1e7c641ba03b6e5b1b32f1e570b8641beaa6b87464064b6b44d7afd842b311f814ebed492cb756cd71781b5f411d71fad436d1eb465a6d0be2311e0dc2154aa093b639fff11f6eb50c33956b1f9c5689927cfd10b0f9f08af874431287c8744a2371d6caadf21ad433fc1ca36ca3766a9dcfb69f34336a5affe7aba0f44b13674c954013b3cdef9d9147fd92a8c145f06ec57ae160b53f1e5121c413a82bcc9a67970275931151639c9dd4a3648469cd7df4d67196ede327a4a908f513e8f4260cfd9a6acc4ae4d8de641e70105b465453b435ea775c0b1962e3f6cfb7e12eccc54f846ddff91e6faf4157634cb4602788aa3596626dfb65f47919fe04c2d0e0f8f33cf94eaa629aa7ac0c076a2e4ba9753d421fe8b2488001ceff2a9afc8ef5408f308788cd65dc500aa8d709376d6cb1f3e7e18ac77719f36bf2bfeb0cbd8c148a1ba32ed07cc720e3ba5c9a5e49e3b7549375c8fc1b7651b6a1386551e117ed6a3ad6a1522bcda2ddbcf2ae1165a10dd5d16713ee8a379555972eaa8aae2b43a63a9c70d107625e4f2d53b4df55271dfe2e100c1d67d036cf310d2b155938bfd4776f1dcb7427abce87da3f467ce87044061b01e718d2de69fb4e477086b2aa6b9db918a0167013c25900bdb551579d3df5e2a5fa31a1d4dc728cb02acb3babd20a24f20d52fe4ec11d51a0ca87070d528a0158c536efb28d2322d5a27b462cbe491d2a51ae048541516798e4627949081ee1aab69cff000289bb38863b34b576c71c321bac357fd9719cf6919820c8e5311e1c6cc86245c312a049346fb9ce92209c99c9c20396e01a7c5a508c8015707d211e466dbbec454a9c983bad37e096d238d1fa83f162fb988034bfa439a7103f7520e1e15e6c0fcdea960a6821940b585b6b1c66715c929843063d9390066b1484e4bdc7ec6d98e934d33f151941563f8ed5bdee25ec3b763f4f38cf35abe788faaa3885c8396738e5c0485881811dd44da24d8f61aa5cdecf905fbb9d1ffbf92111e0bf8488013987fd9496fccba8c3124149cec71f8d2e8e4a00ed38db3f01a29c54b9a3b1dd6785ebc254dd99bd8877433130c8a422e2060cdad88b56172ef9a9f318a84f825f8a0b4016c66392a0d718a239d8e0e48591393c0217292add90db4a50f4c9666deedc9c5129c1ee88cc420b5e9a4e18a5ea5fa2fe6ebcd09a02a0d9072bb8103f3ef045a88a3d17ccd14fdb236f5455bf6bf0ae21f499aee0b98b1d8fcf84062ff4b6ca616a2da4c950a2a00cda9c123e809ccc114b381c4e400a867f22c5bedcaac0a9203c1c2c2af4eae89f6e7de4bfd2a47b50d520bf3f109fb239f7e5a0a1bb8e406992a0f44e2879133f8d72239fdcb83a4514dbfe3fb5cb1f64a17c623bb1705eb1e024c3cf55ddce81da21756b093897829cd26fcc9a0d2c73a1e279f73727227db74fe11b17a968fab70450add2b6017ddfac6a7257e677db8bc03e6097134a418a5af2bde83c710eb6833be4e3a106bb5fb2a4ad59e77020c19e46045bb54481dc0e6f24423775325b369d8c969a25af8f9d74fa2a70a3d7e5c5175f1f9dafd31eb2cceaa00af3fa1786fc217601dcef01b571c5442281656aed38dd3d2ccaa9d4e0827d9c276bea6e0cee200c689aee38a301bb316da75db36f110b5ef3437aa1302659a12d5b87d130da24b43efe21a6dedb286cc2742561d33665df7198b9d5fa2f0b398d3136f38b469c2815651dded134b970b18650f8a21f793938490c15d7130ecfb78b8c2784b9e2b25c6e574322c4dac7cb4c74ea6442b216b7c2d5d32f68e0fe3cc8fbefa5bab4fda47852663c0208ec6034e5b98236bce26094ab809b970e2fad880ade76bf7f646e2193ca9552c05920de37d89461d616d33d01b08433f2fe5a374d56604eae7119e8afe2b75d8d988db6ffea136aba3e703a5ce571b64bc4f355180a0adecece484beb412a78ed14f74d824077a7b5c3d80b2191fc94551de9701f4bcee65cb679a9ea68574b6b690e00838e49af75316b3df4488d64cb83ad06a79e34fbd4d41ea121cad62b650f228e5815f1f85521ba21596b9c9e0b80ce876593d595c3a1a7c035db1fbf7671e535949a1908f1ff4573a58db2a6818fce80cdaf193ab5a9c5657b2bac7e1c3bb694bd6d2757c8348da37d315824ea1b1d71346288610756d82f863f04ddd2b7273a2721857b446bf31f54c9058f91bd4bd75e309b8f4523508ccb87a155169eb7748639ebc9f3002665b0e7334d14e0ca319fabdb3c0ba9deebdf881a7a643cd8024f18a2fa509b9815060e79e3e010290e7d26bffda754c3eb26d2c8c4582c1931e6605352e988c88be89141fa8fe5e8cc7b53c22ac4bec00925da44b94ee6eba1e083658a2a621858cd2213e770bc79fa1e958a69c04223a4711106cfd4e7dfc0c21461f69fb237fa283378413f1e5d25db7e613146798f6b8d19977e76b9562d0f75c12eb5f387fe8e47d78e577612ce3670eef7b3df63bcde567f5ba0e5ff253d2a1ba909a088c463c1ca25367e3b51b41fac4394ee3126e94a16eddfd82b67bfc3d9ec1733caea4d53b8ac6881276ee8dcf19b662088183277068ba01a7b631bc5747e4b47cedeaf503b9a7a197764292b87759410d93f4e6fb6db8e176f95e59173b63236f5200e59cb65c7b19be0199db658cb2994da9196b043f679687e81ca604a489bee4ceed2d094fde415411ea606bb77f54b98b08e7b6b759b068b94d2c2a11ad11ac3c54de3be691b7425ccd7011406ee8de80fb980988806ba5b734d03310590eb03364d9d38b5e2290c88a33e09048fac47139a5871ba47044cc18bba90b5360fa99634359a50b2b443f68d05f0fd43574470b37b8d68d6650df4315136964ad92589a47559c617968a8b06f1725dc3ef5e8b976232202f6ced7fb05fa92549e7e56510a50d728b503eaab3a8e3b26c04f3e8b895068ccc8c89e89b3e5eeebdac87dd0b7d2c028861eef9e574eb77c618b30c899c70eb383451b35485ce5f10a78b35e7461be2895c09ed4eedf03a4c9b0a5bacd117e7fd04e3646ece7df2dd594e244698739f289f1df9428c78566a1c687a74eb51ef856ead706c60f4468e426f1cbc0cb994c0bb99a252c90a78c91d6bdd8433b58e6be21e6bbff5b7c6ade35c8389eb547ffc321b7d023c1d0dc40e62f95d52c9310affb4baebe54effb6cca4fd62dcea9d358301fdd35e367205701c5262c0e363fd281ee272c8005e336ec6eec959d288f73efb894897dd61e7d2c67d26f6cab3bcfbab86d716927e9e3a30dc1feab2dfdbb646b3c4817849f5b71fde2c7cb59cc4daf8fcab497bbd71bf7149e8f7e1ee3d999211f993ad96a99d76f9e5bb5a8baf4665d841d912b7388f16bcb70a0640a7496c083a56c3d49de66a54e54b100cc6de908e4d6dfdd86d098fa90ca99683a356131b194381802d227873ad948c9cb6040793204093bd79bf5aa35c5ef913ac3045df18d23d25e1e21feaa13006b80747199b6d297ab30920e6101882c46d4c8872b8bb8b7d3256a5df0e529644eb052864fb8661297575ced083d3cd7f1cee9f082c63e7b841f5de1473444f9db26a286827fe8026615a29a88320879f9f1d0494ceb47f74b13a0b7e9df8c4978a90b7a1c5481ed80320c1bc7251599c605259a7042fab491cbdbe7c02e28db8e003569047f585d4d76417aaf618abfc0d28fe9d6138039bf0db577b268413786f4c95b224897d935a9eabf272d90744f1fb74066a6010e3ba2d671a9d7fee6c64d6f595ef663eaa092aef016d04f3edbb645a60842a4bc6f52e7dc8cc1886fb8d3ce69a0d3e716f6fa36176693eea8cc5de024a43191cac1e490c1436f065ac34d8f96d02548e89fa92a3bfebe96378add30c022b9f1c09b227827b529a1304e8559e5d635b1e503673165c6996e757dfede846a23ec2764d24816cc378177c341d5609a4b48978afcf39ca66b9fe90d87927864b7a98684bda7976fe0cdba894aab0e05af35859d2f19e8867e501ba342f3a3f9bc516563ab3eb0866dae7e086882f7fda8a137a2c94b514e18aa94a5f5aa0d0f7c0b4c6964b56bfa264b4da86202246b7fb436039330e0e682d5db7d695fbe8f3d00c4feafb3d0b153cdaed102d49c387d95092652719c3604f8789166b9bf624857548a55e0e6943c5b2aeb0ea0674ae76d3875d1b58e27e53bf44bb460176ee53985751fe5b58b291e485e4f0d8e8b08634c56d7a5bc9f6fc7d6121afdce9d5bcede27d26a457f613d90928dc418e227a0cc332be93087e8c4a64d6138edd6f43de70839169f562de18af0906d0d368b4b40739628f2c8995aed6651b87a00f6af28811b92cafad532bfde1faf76717d8d307ee00a0848caaf31c4b2268005aa4b2af83f85ce51a157b6c504325a7a458e25bcd1397cf1c3eefdcf4c2904cc583a74d66e98b445d879f70e059fc1392b75a795305a56aacb3dd6efe76a103d48a38e84707383bdc4bf0b1feb9eb396776b3c71c7189c5a2bc4468c4a90ab40c1af01680dbd43a0ab5279627dd6397970976eb85c1858eb2cadd40e3e44debd0d8654ec0d1ffcd8d659c93d85f05aca5f22c4d2b8059144141d09dd8b2eb09c724f0f773740b74c8dfd841ac9931f718c33c627a385504d2b3e6b61f9f529c53933bb7054c97ce41866316013688e563ff3fd1fe5409ceebb3884034f425121a959df412c615188bebb58772917b262c089f02345e07d0f0a33dc2957bc31960ce9035187b14020c82581c7d347907b561e28998c0afb986156f93dd70cd00da80daf082d6050947ecb35b8dba0328a4bda2beb82681f7108c965a598d9366fc7eb6ccee61789cc28d6fbb208cc9f78e5e4837fefa2f08347b5a8cb62cc6ca2afabc10b797ef4b10e6d5c1d2170df2b6d65b7bf9b6076b466424815fd8d7990a8763727af3c982978b9df61ef37fb8d2a8450124e49baedac97cfed30c3651ffc74558a50fa7e1dade10ce63ac6fa85666ad5dfcf05c31763ddc5bac4163939f1cca39d245fac76f60e6b14c9c8e4fa673ece90e73d9a18d13bb0e38230fcc5d1a7a9c6f2142c1a9b68855466e3c1d67729c48c5e9945da3eda1ad22fb6b6abe22cf06e84c006f3e416e10cd7bf9a00dc533e3bfcc0ce43f4e18aee96536fd36d84fffea00c40e8184107a6e5057660dee3c405885b3c3d3a79899f7ead3025b9d65edc0fa0e4e081108088585d5edec702de52cc1198af57ca9e4dae6c0089104b96729823f9c565acd31cf86e5962ddd7158a8e8be98094fb5160ef39e8e7b80b2e27053e887e0d3c88c88de16fd46a8bf0159770379a39352a4009bcef27fa3dae621d9898f3c1e928f6de5da81cb445f85baf698be48e9fb256c49c1d311e099e8da7da310cc9db3a0db48b0d22042eb3c59d1eec46da627008e8817aed6c98870f6cab5bb16c394675d713a5cfa16eabb92b3662a867a5ecbf3c150f432c12f15034b41fcaf32bd4950f9c7909 -MD = e4ae28261f24a10355fd1aa1c2554592a331ceda - -Len = 32192 -Msg = b85e29875f6e2a2ac2a2b8475376eaecfaff0f76ad2fe6fa415512e480e3c8de7b74cbf4220d9af511a3e71cadde4cef701d3a6881ba3253888f37f7c0b983f84e9b797cd126db8d3a583dbfde03b912c9d0e5195583025cfc8176fc6b8f7d95d7dc1b68944255bae4c9a0770d6d9a1bae21f8d25213bfde4632b83aa8ee1d7dc13e990095e87043b7fdf98d62a255d3c6165bdba0f1d2a20daae3faa05ccd77b2cadb8cf9a094f25dfc3149062c5402babaf67c66a5a16dfaf2e0847a63f54d5287c954ebf3298d7bce2ef32193fd703112b1fdcdb8960ab51198205f8bfbc54b7d4ca0916797ddbc7cdad3da5dbae4d42875a5fcb1183fe50ff216775b48a842b44ab7138646aac50c1c315a14f2284b0328be1b188ed632f5d5ade95b44bde235ace29ad89ebc4189db54c93f0c023dabb48e5476629546ca2b2ede1357ced0075b694ee408dad6f801854e67723b5229ff5ecd52fb45c696dbe17d0ceaa1b7323e945632eace2c63750c11138b9b3384f375ae34c1ae5d61cd0eefcd63003dbf3caada4aad5eecd11f313bcbbfe988c4771d20a41c97b134e9fd5bde2cb10ab53ff504b5ba53be4be73cf41876eff8f2729c4b2b74c96a1617f6eac8ab7cc71c2ebbfafa787449d8b574638018732c14ce3b5650310d31103f40c4124a2b1cfcf045e4a14e8b36807122b18d0d3ecc357242699cbb29ae29492410447084b05e6fdbeb32a65e2c4b038e05c7be187f5a46f9ae967be588691deaf7e784512c4992c53736e7b7d442530088b591c8ed8d32a74ac6d70b67d8a3daa082f05837c6414aef35785cd66c4ac062dfef18bfd51e9668b43861f57fc43b339d1b627adc64b33bb5c315d9d2ce15bacd41ce9d3bf20c2ee907b1d7656657dac06d369d93e44844402fac857ac849b808edb32ec59652c4ecaac1b8927274bb744e9e47f3a751325d24e7846e21a286175d8f1b7df2b053458b593e0fd1dbfe402660200596162d950a907bb6bf694982f72a0b6bef6d037d104311e369d4ccad5d45d1d099df5c6e4a6d15588ce52cd2254ba79673d3fb1ba346da1624a64d425b15025c99f3e7724a47f85e6f60548e4ebc9706672864a7ab2941b1e99ba88789985ab27c9bf72973e5cccf4f20ec3ed94382c3b4b565a990b5edbb9ff906044d9582d92c1fb41a2d113ab4166e1a6a30a911d640c227aab9b2873c30098e4210d622d98fc745cde191e914ab92069bbab5eb46f597d23290e8b63d831369c83b21e1bb8fdad2caf52e83f7f6d4da58df31b81bba7b8dc77c1e23c4805fbe1e343f678613a2859ad3b0ad66df7cbb2a07e3225d76b880f3e51e76dc0f34b6cd65f85d42026584c4e1df11674ed1d3989a95cf151394d43d33ae568a18dc795c34136bf8466cf7d0898357052b1c4a2a000d674b7858b12dcf976bd8839d2e530b5a38afc6ff0746326327455ea54868a21493058d4b3e4c1fa05ecd38c0fd3b51936d6f6a66dbaf43482731cfb4f4dbe671fb4d3ab7a4218c93d771208c0f9a6e87b1401ae89d9326fa02d06791760a35ee462a67e20a357f377dcd214b8cfbcafead2bbece727842415e2a0c84f77df8511ca5fc15990e5e53f9e824439ce3cdc009373e6184e8ffe5e448a7d49fbd956327c4e198793692b0f2cb12be65dcdf946c6d82e6fb6ac5ad3b3121ca955176ec0c91ffb3d1358416117cd102126d68437ed373a8ff87fc620bed60ae02c101b476143caec9919b4cfe054b57c91fd096e874f7eeb6c50cccfe854ec80d96a0820b5481d08bd43e1c606d6607b2787f525255f7ff4baf5eb3ba00d25fdf57ba1f7359b7633c85d74ce0bd0c59f702dd4263805c24e4ca58dfe766d3bc9f8cb654572bc4ad072dcda525fc2494bd45532dc4fc0ca5aaa063182ec03b2876befee75fd392f7125388efd83296012fc847da1dd1f1cac4b8e8253715f1e98c74f9a032580788857f70f2a0684ae8721322121508f2db5a9a4dcfa96ddd4708360f4979c20daa893aed7526a52791b1ae4d9d54a7f61f96cffcde2cd0e78c128ca8a8db198ba3460a674211f1174312222e4383b9e7df9ede5b1a6a47f7fed4ff2c87016668bce37a461f0a540247bdf52fcc4a43ac639a4fd44a08d9f5e7731603ac92b18e3d880ff2d5b9d7cee6dbb2b7ff504f2df3b3abcd38b18fc98d1a5a96df3700e46e5f53d32cc581646594de2da53ee452d71078b0aa0b6f5b39ef514bea985d52968dcd51ebd75bac0f0f03fb86bb0b0356db41e469be8493321a858b945ccfc0ff3d05d5dc966b8e2b75a8886a70cb28b9398bd13d73d35ac2c47ebfa42c5f16ef9584c5c5abbbf300ed563c19042ca94954e0dfedd266962f15c24de3af133cafbdd18b6fbd53c1d7a0947f5a20366e4b54c77643824431c234db9f198ef51b87de748da27539e2f8b6eab9f76cf25f0a61c9fe052c7511c34a511b0d700d99be20f635257b773cab56e052b68f6765cda16ddffc7702207a7eaa2b89fe619f9eaadeeac27615b938a8ffb260329d66db3f3b81f00cf2442ef9703653e0fc166da5b4133f0e1940e6d5ce42bdfc9d4b7d61bb4da9924d6729e22aa434bde3e47438011a65ec8db8ff05d66894966efdfb3076a9eeb21b70b16261dcf43d20f3fb8c4b66fcb8780bc95f9d8daea718639dd3f3fe881465470fa19c485b09b9294ac81d5fcc19e3208d0cad1ad4d8a464ab72bab5405f33d48bc6634f31c9b970a815fc6d9cb8d5df92348e75ccd119ea6c375434dc3b8bff6cfa3e593d2425af5f9b72f8363d563022fdc6085e397fdc294848e5245277b0fc64b6ce48c307ceb5810668604f6efb8392df3a54b9df212acd1e2fe249fecf812d52171a4e66b4f3f04125e3962628fe19617275f840a3b7ef5f79dccb2844447c9b9a7b6c4b4b600fa99787bc859fdbbbd21a889faa4918d5922ddb7efef78d7a18c033c5bd7a4607c82713669449629fbc99565525fb94a93fb2a70a87d0a44e51f10902c429ebff263b513e5a0cdbeea657a7c3baa17490ee700818ccb8d022ce96c7cb68409820493d07ecdfd18dcf19bc4290702401b428cfc650d3955a1b181533c7b2a89592bb93fe182b81c16b9c30f165506a803d7437a859a6518a63b6d8169fa9472a7c04a7fe694702bfe9b71b7aea605c3c535b1078dc4dd2a822304537fb56069f06aadfcf873a3ecf72f2e5a6c6aae27c1c64c2fc80ce02fc7f0fc66081bfcd3b5a37a5381b0c1b392ed6f63da236e587c317b5fdee33c7cea3d9c257dcee85489d336002cdc5834444eab607250a4ba66efc5142cd840b65b619a1e5b2eb140cfa2477f5446e5d39ddb68eccf830fe21469cff95c6c7b50adf54cad2acbc64d0979454d9290f916020c3e453c2b0e440727e25bc8106ad054614a7e6716b5cdb9c0a5e7623ae0601369821652c90e74b1a2a2d80a548db9e14e09fe9aa00e377320ffd94db55a66446beaecadedaee8968297da9da96271d71411aa2fe81e3ea812a99faf80b58d179bbf14a7f96e04382027fffcaf779c984be80da16f8437db0e39a7123d9048ff71954acb7caa7c1903d994a1b73b9eb76df3a59996ceb78e7c269c104c592e7e75f3eba30802a4bbb6335517512cfcb6e2caee730e6c22350506cb242daeb217116173a8fbf51292afbbadd81dda3b1952e454c836db2c510140c0b861df585bfc546f57f9004a2078d90b6e6db1de5136c674f3909a3a85296b1967798995af6f435b3a6f92bff77a11fa44d1426ae0f6e7dbafac27b123c5fc419be52c0ea412c4b3cac05ae89a4c0ce6f5e91a456b1bded5370a1234cf6f6ab5d0253507bc6f3f0573ab97585b67107dec059812323e021e341ad839ea9e3d02aeca43356add48ccef81f693ed53d32ba1c74a35e8a5f7f3115ef834f7daf9948244c4fc31f5487678d3e70fb27abb5cb19ebf44e11c37107956d0ca999e1707e51538e0944fd4aeba21e7303d743f9d960c55a3ddd935e2b683104f22601bc951bc2d67243563b21dec85b9f0b8d66ac980abf711957ae66374355734b98e5562ca0114444e7c3d3ea430e17ec12650b6ac30a33eb98c880aaa9e574312d538629f526c871394bc76d9776b3a1595cc07ef723cb7bdc1641686d9e3dff486df0bdc9fd46f0d339c610cd7abb52eab4917baef281f2aeff711a976615de719d5b8e257e06e93df6987bec0176294ed6470af05e9d7893ebd7672d2746f6314b8e4410914f8500eb0555fcf52d4b0c28aad2c651663415423cf839c8166e0fdd5288931e6beba37fd546063d28e3ac14817c37b3254fbb6d6874c231ce6f94bc6f02b50da045ae19cff810c1af17b70196af4c6a23f10dd22384d14ab5204650ad597e4637b8aa23bd1025690a0fb457af140c5fa54094da35d06dfb15aab001d435f6b1776e1e0465394a1d80f42b7d95527f7af667d7ed65ff9e2c34345738ab402637aa8f92248f1989c55aeea4dd1012ada45d8c5f747cba6cc55ce7c55bfb1f15be16428eeb0558e949e124a8dee7fc9fc321d8b2d543a8e0aed3eb81d48c7dcb2f05b09bc18e9f73915abfbee8e4b75cc08b725a7a7f7201cfe167130926005173bd01400ef1962d8510e66f63cdecec84e382dfc9fbbfd810d08304649150ae70875c063af7e4210e4ac242b76b4258f67132c72c7e386b5ae669da4b9416ea10aae974ad683157124f7bbf4d8662a7fd7ca89c0acf85c4936d3e2028f9fa0e3a70d212cf0c27d57a68386e8be6f3e1834e0ce5cbb74deba5ab2d5b6286a321d61f3c6809aa6ca52fdd21d8da529e0f6f2d872bd6fe38e676e95b156104ba2bcb0051ffc10ca8cf18f66084a3930b37a96241f5956cf0bff06ef3d58d3ae635035b395e60f884591cfb1afa4c71e164183461cb6fc81a7efa841b244ef2d04565781c0d4f37a74d25337ac33fb4c99ba6ed0f35ccdc61297b71fb890cf22066d99e2195f591bbb21ae7a566e2246ae63ad475bc146e6aca5d7ebd8c2f037d9d4716707db9cd6591e25fc66b9f896d4cbc30b8e7b047e06887f386b51fed8ff49729324d05b54ff167e3035bddaa79d6154a033f062f690ce118818d4478ff72b11c8f8e400f21da90bb84bd0350378a2b6a7c4b7feeadbd5334d39b076c751f7e3aaec7d1a48255452e72197b434e72e7d74b93834b5683c591a767ce909804e4cab880223c1b686e85f5f8ac4b679631db999f7b0f09661f75237a02ad1128cc13d4419a9f941ef40934e0fe302afcf2bc8ef8cd02706f49296f5b0c8b87941f5e2b93a194947cbdff585cd9b93eae10c35125e3ec33a52bf5b49252f2a34ec3f3e5fd9fe4c38cb2b288f1a5b04cb475380bae2495fa11ae201aa83eaa0d60a21a2908fc57cb55bb69ed29cadbfb140763e31cf7c56cb9b8f4c824377a6cd1a31b1f3a21b551dfc16baf8bb002f4d8b08b02f5c64331a732b7e78ea42c69aaad3df01e74c60033aa01f59fc0efdf0857fa8fc4f8d8f2e305b29e6fef86abf2aacac4395e527d586073e7ee606963aae4f6b30ef54c5773172d164e7f51dbb18108c21548207356c909affff93728c83ec8965d24670761527076b3bc54a0f01a40133998f98836cf0b725af422d7694fb85f38eff0abb59dc2e7260e59a3b65db9de2db8a564ff59c05b88b7f21896fe0d3728bdb1ea75df6d9130dd26 -MD = 290d124e77abc911e4be375232ff1798c4b48cb0 - -Len = 32984 -Msg = ff5be1eca7d45eff12e9645ddf05c1735b973bb8b06f6c32596bd13cd9541d86ad03d35d7fc8132d9c0cb444a83494d891c92c4cc1d668af9892b586193f5bcbe3520d3563d4beba4908b753384ee7ffc2477a0a933aad8fecb7e03c547aec558a91b8fbbdc207afff279412f81b61eed75a4c7a8e63e3da3f2179e6f1cb7a2c8809fb38f4589513a8af74094e63abafb948ca251b19b3997819a90c5afbaa59c7ffff73705f11ee2be97ec1a3ed6c4a4e591e92a023c5d37fe79837f6d226e32dbeeb34999e2248701ddbc160824dc580d76d49874ac0903cd36dee2d1796d2a48de804d7df712a5f93b291ebeaf62a3608e2d336564cd8972551ba6794a12f13b31e6992e8a69be0922cbaaeed0e815836a2b7170f12b478246b220c0ff0016179b4ed328268a4db6371c30f523ed0cda7d87d903cba2bc719e4ae84512b507827d3181f755f4c384fa83478e32d217fa3aaae0ba7ec466c4ce3e63822f9243f05a271c189349bdf9cfa965066837b557440d1ef164f0c4f0591538e4902869e5a4a8081868f99b8928e6fffa4eae73761c36ea4528b85588c157cef90ef7d7d70f2cdc533174fac7b8d4aed65086b0db15b0e922349b9702898e9c4bd6812c48dc3e1f65975c4a19d1eac82718512bfad2f38215031b17d2342237399144c5bfae5437dc0510080426a1f268f0ae1369d6874b9a3ea7468c33ab166ec9c332bff7f7bc030510c32b0982a41893fe258c92d4ac2e21d0a1a51a91b037ea7cf1ae3b912297120ef9e2fd1563b25cb1c0e78a743a4d6717c7a14b6eab416de2911f0bc8f1f4a64b1ab093d297c2c579741f3fee6c7478fd16f568aa5e07ee948f96cb07a0985c65b4384032d6c658a5cd78359bb93fd1e11e35d4cd4ee7c6f34b8a0bd5c51e8edf44dea4cea739a0d72ba6ee04b71bfc744bd73250048d918f638d409bb5e3c8284b0813fe7fa9187e1d0fcbd1dc7563273e5de3db0555c8e955f50bf2298482c14569205ac6713a1b2037715bafe8b06a642e6bb6c7dcf7619175b051667d694aa2664c5c124e803ec392513a87f24ebe3bed5c8bc28f87b8b473e032133ac61510841a8af97d854975c50dc71b1e98b3440f18b29bea143f2d742e3ca64933c0ee46fd6fd2aab3cbc533e9b9cfba48ba0b1842d3aa7907656aeacca996253cdeba237763344286561063776b2c71b962ff7d4d5784c8ebdbfb6c7e21796b4bbef2be1b0d94c1974915d85953a7c1752eafb2aac691362c036d6da53cb667eaf2265b5ae78ac441451406f21bc816067d8a5cdda9765d626c2f62c453e3b78508d39fb9597cb71ebab973c42c140be7e02de07868aabb0976cfe06dff67e6c47378ffa90bf116aa1a64a351fd020f93f6e8c1ed8c84bb9bd3bd7b0497d95203b2950fbc477e6f6df4a41a2e17189d85126985bf9dbafb93d376772ac5bea5cd56962465c47b2dc4da065cbaf2ce3255d32eb06114b3d78c26897943016e3eabd01af237eb7dde592af9cf7b28a97a60a986c67479e5fbdf2d7505dfc38ea919af81eda5350cfd95680cf6f12120b24016202c5c45e7c51758b781739496618145796b20299f1804319e77cf64da866e998976ab012fbfdf48cf8080ecfbf48d42501f4b31ba9a1ff84ca6486c1d6366b40129c3243468717e3b978a4545ce9826a46e9905c600632c9626fecf8fe5a2f645aa47278c4b78597a2b1225fa7c3c62f4dd6bee67f7585ee95e74d7a869bdc0b59ca9939dd57e7b09afab179079d467bfe0668416cb79ffd4d12d4cdd8c11a3ef655cf0ff92de4378b9a7928e440ad5641c0b4f391942afd713aa67b5a949304198f3b80800325335cdaa1f7a775a1c8fe4bca8655d3cbf7e9a5ee0c76dcec65aabe0616da9f51acf502526bb602cada1df0d3821f3e2cf29d9bd2069360d069922b575970c911aa3e5ab30e7aafd29386f7f76d599bf5f675667af318e9e519b71e57d0a84b0d361f29ed675b465efc21a85dd16ab3ce0c594d0f5a6f3fd37c02de2e03ebecec5780b927fec28d191bd74a2e35ba4e5d3a3197b9c4ff2a439a5bb5037aa273571649508a5c154ea8fa8e279122b1344d8ae58d9fb83072dd7cabe9febe33a9f57962373e08bd4fb6a12f85af1fb72c44045d77eabe6ade4829d8c3495608566f8bb3b66a8a2359e916a3adb0b434ffeaaf819dc15e15372da9cc8b09ca87426c512414366bae33e963d0e7bb699075e9933a464d21994533056d8969a31a3495d59e9bcb32c5a75f90a07bf8c73356e6b86ebbb68e5fd00344a5058f6828f5921e07915167d27bf3a3fab09055856a8c270645232ecda0446e5b46a3a1194e0a34493fef933c784ca6c5cfab9bef7980e7eb2abc874c7c9f8c7795ced65404a5204aedce3d6b6613a0eb207022d74a6d0003b2ab23452ebca5e03a379043e20ce9f4e316edc70def9a53eb0871a6a6f97b3827158a1e7c42c1807d08564dafe7972d68ee2bb834899be5789b11c555cc5f71cf2542412fdae83ea566b1da32dd33dfc57e80a6a588ab890e50889a1f8fb496f400d5140f2b2302fc7b28523497c3f143ef73f92695d227f74f608fccea828edcd1cb01e3de79b4c86f431e7dbd524b28698d19805819a779c1200b2384d243cfbeaa6e759af33d526a8aa4d5f6e5d5bc13546e7b7887f1ddce5176ed06ab9c17effcc58b089883e293864d04ea867749165261de9e25ee6b9d7a37f2171681fb8d486deecf706fc012be81d1423c19159a0f587371fa846a5723b8fa601adac2c017ce669883e93310baa906a610a369c612bc009a0e9c2423d560cd89bf8fb5aff050ba0bdada84b5032b69bd08fd8dc2e3f64ec0691fdf2a169732390d891c835b5bb4cf7c28fc282071c3302f0fc9b70a6c258c14f3e49371c5f3180dae3f63e0571a8d71bde19299e1dba68ac265cd0f884ca616027b876b52d6cfc6e7657808acb5ecc27f7b1af7e57bc823fca82b7bb18db57732eb2e8ea7a406401dd7ea5ac24d95765814e9c1e4693e01a6dcfad64eae613f6d7eaf612a24648436dee05f02aa2f952ff2267f466eaf2ca94761a6c97854779a7a336c442092991cc0829dd2936328eb5efaba7252c4adeb31897589b33327a128e1385d5e3887b5c5f99e9bd1d93576a08df8d2dd248b56e499caf627a9556ad0e24cdea8fd57eb376deac62d38c7b70006c4cdd777ced1a7ba2e789b5c0bdcba5d302dc48910a45c0507b96c29e396c68da3cb07677f43c1142877d9f450e12d7b6db47a85baca7eea7fde595393fb394c1f34369aa4967bce405ba71a2d6073648ada94995e44e344da9cbb5fdecea268bf712cb848b11d11fe8cce76a842d23f0f06d86c03fad33a9e5a59f4cdf7490c0be8b16a707cef04eb7316afcc6d933485a210a7b1d498f45582fcbb665f765e8c028d5826df38d08e76466d9ecafd6d731502f170ba799b867b6c5bb3ec7186c927872971c2429c6ffe285a28415a0f61c777f34994bd57baad717dbc8781ad4bc069855a0d53911774821c71bbf045d7203655434aad4f7880d3c98819f0fb9833f916e7a8b4d70d3e1d5b811e09355e8809be67c491ac485c59e61f8804973aea0081227bad95d9c6c1c06154eb077d67b6d6bcebb195b2a9cd7d89be06aab94b4571136f85f3047235f21843dee4bd2506464aa554333fcff535cea13d5b9bc0928cc16a861a15ac439aaed52cf4a52ac1b619dbc3ae763699b7f71bf3d36ab0ad7a3455f63294dbb1602cf01b5ebddeafcd3276472de04683ab0c136e39ad835fe474191e620a6648eb997ef54b8daa97349c5c26d803687ab71370f8b6eda070728a9c46d3feb7d0e4fd6600e29ef443935f77a8d869024586161cd772b171a8cb7dc8b6adf83511f26090854c7725799184ad17559a7eadbe1cfe5394815dcf985584b5178048d3becbe4cbb0a0a602d611e8b9761d427a082efeb645e5ccac801ab78c391f58ddf0454a1c37a2dea60b110fd86479b8740b530446ac6626082cd54b843c5ccdf82fd7aabe0804342cd8890aba473946627093f84df28bd4ab438e27e348c010ec2388ecfa4d4e125ee483c1a746e2560edef6c2113edd3c5d6e4b33f184d287817560f8182b09df02d8061ce989fe4f3efe854bdbb9e3c7e6551657f8191a9b7ecd67b660ccbc02e15b1b03c7391499bb784779f28a25dd0d9ff67b3e2f20b4add2a60f1a58efe5c316c95e887ead9c4df34535a0db2be79bf5f4870cec6d3bd42d24e98df62aef70b01815757f50bfbb1785682bd17e4b59fe1663aa7b8896bc86e92e02cff688afd21010d665856dcf8d11f8dc96a5730c6366f86002f92f2d83fec4c10bda184924ba37f357d50b4ffdf1cffb5228c57fcbec2c76aa496defcf6a9512d15f07074d1d73137ec602040e2bd3d02c90ab79dfafe8339affb7c91035873d490bbeaff641aa7f02e2bab669c9eea24d638cc147b715e1fba37784ef6884899d69a309c62fc5800ab19b2db6d207bbdd2cd020aa0c99c6f4bd14e8130a7340f2fe1fdf66eead5cbeba0e309c4f05610370de5eb0b75e2aaed6f6bd25233ba873549bf77d86485b47857989c347d2dde7b9204302bf4a57507585cbccbcc60945f27d1ab40080c7cd9a45fed4c25577b28efd96482c4794032329dab1dbfbad93602e10b3633ce67782db5877c976768c78dd2129063c28ef674ab17b8bc2db832717a121b764026ec4a15e53621d249cfe28aa4e56105c3bc95019d3d103da3dce9f95a705df61dae801da119832c70ba847fa5f24ad7810d1a3da61b7a6f3eadd2db3ec54974be276629258709da800fea0d90376fac49508abbccc44946eb2dc2bc499ac730aaef72c50d1f4460fa4899c0fe256df87f3f5d087bd80b393bc54009055155be567f3c6da242b16431fd0a363a5cb440b51217b02db74eca931cd14dfc998372335f09af8f81df38e985b1e9ef4dd1196d81212f6cf2728fa38cdcf799c3cef0d3f780f74f5d3c63637b3738876952e71af52ff2b40a14dccfade9926770a6cebae128d15c4547884265f0ce9d4fa84e40069a869d7eb44689f87daad02089405a9477ca20da8efc08ae74f89b615f936f0dd77783c0cf6164e51fad7e44050a2599d45e477d815328ed4a630c2ec76b1a938d21f160c4a1e2fc2616cc6ba890be69e4ea3abebd12257ad78a5a38ae49b530123270df427c76b6477344f7d258977d200a651e90ad710fa2db1fff4293d15c1d159cacb775a2abfa5f628910e6234c0c3b710dbaa9adf442d1c7f342fdf18ff447bf599211f9359517cf8fe2ade46f0009c90c898b3ec11dfaeca50dcc98443e45536670d5ecfbce58c68cc6347d5ea1d1e7ab8bc6a60ecad2e89531a42801619b1333c235f0570c7ef20049fe30837840576b3fe06635afe666342d09334fe4b5597204b695efb616dc7aec8fc085e9b192bc246d11ce53b1c0127e605c985e20a081b6dc602e719cd05d0c5d8fde7cc2242ec7c11b414ca190a0943de673346982e3671bc18bc59d984747ebf0e5b7ee7623a880f536f142527f1d166358fdfc7b3783f94c9008857e9a1dbfb6340183134b252131f7f810700e677e75c21165f3ceabf963c3d0d10df60c4d3252104c8605fc36543cb7a893cf01da7047151277492da099afa52cc0cb8218e7c83a9748d46c14ce5dc65718317abef5308f9e8007a76370ac0be5218b1da758ff06ffd637135122e38ab887f640a07746d776a8baa7c66b516b96cac53d7d087efbe2a8ce708fd4569b596d6de20378d283175bb28d5dfc284abe070a701e78b09fec4adb0205652 -MD = fc8456f92f8a8bb38a3248e988a3e12271061510 - -Len = 33776 -Msg = 9cef2854f7879c830ba861f6a92ef7025fb98aecf1520fac075190f0247dc464d776e3313550b8c38681f8d03ffdd296319fc764ffcbbc5bd5524e76579565c8d8ee0c05cd4b8044811c86030a70026c7b5ac6d75b9aa88f5679d7d933f56f32061e4ad9a7c01a8d6242b498f0ceaf0ca6b32e4ded07facff290d4219fe5092bc9d046b4abf7ae2793bb2a96db6100ff1b6fa8ce9d59dba4115dec5782ac5b3a89caa89ec13765987a4f8f05b26f1ecc4159db6353da72951baac882c6938ee7aed5179fd1ca666a81c68cee5d4131fb7f387013f7d0e82a783d0faa52e2cabaa0b93bc0c3f6da240fe7c858c31f60153fd30ee7718464eb91de6ad70ee1363cc83ebd087f04e94f8b7bec4bce50d3a1e8f35ee5a93e0f61cc578112e2d7fbf48c2c4580ed3cba725f4a9fcf651eb327e260071788461013926ffb62b60e406a554a7a2ef6e57615f21c8aed70cf282f94e2b285f4e390894ced81d072cc2e278c61051c804844c1acb954acd8ac594268410736d65eb74c609aba63fe5aedb297398d5274ae4dfcf5e9a61583fd6fe7c544ad3217fface3383e4f234200a493e09abbd6bb5db9513573282e5a0a91a713b54d819d0e98d63aa1e71827057c53cd4c37b23b9eaf45d4208101451ae809bb5a8e2c52d3a2aed08a2b4b93b39c79c816a8eedeb857623ab85a962d779c9523fb19391d96f3f261c2c2c36f502c8d38c2b7908bf5da2fd0035af3f867d4d3b46295b3e59eb22a54125688a425561885160ba22a9b6034fcc82a229033b84cd656ab9f943408df13408ca3197a40a116db4d2ba2f310fa27d1712bdb237187f29e030711a01d9705140e1bb59712b055d82434dd451308bae4d814c37e270c6e0344f2442a18dd925884f862c3f5cda9d739c4c2d991e61bca07e72f8e0164b44d1769151a223622d29543074711817a9e33e339f6b11db44ba5ac069928162a4423736cb7622c1d4bea038b6b8d5331f7bb992ae59b34ec2e5a6932e8c4aa3aaf1118314a0146ec8c2b40d87791cc34a879ef7def78b32a3dd0289ac3fca94b5888604c1b260df55aff02d5b34772ec7914ec1a5a7023d83eacf02671f89ac4053154a572fa07a1800e526a67d5d0c1343599ea6eaa0b5dfa99cabe3ce1050f7fb4fb2597a5be58c401377fda636b1c9f83fcd3754ff321393dbc4a6adf72938eb85eb2d14eba83f080bafc551acd6384a720beb586638cc240d1b244196ab8f9e583356a1d8188ca32e2c920217d00a9480a947778e4065f4b0ede12b874e68ae47497a83b9dd11bc0b7cf83a10359d60fc43b034cfdf7d6067db71ce31985075d39bed4d096c4aad141f4c6c2e8d8d5a3559da12b37c7f0182523a9c3e0fd39f7d8943503f2cb410e892130abb3e36daec5a1993d19de752a0e0b038051b7e85b5b0015fd3b4da61f963f0a85ece465d51c2e32a92ba42de341587041f419dc31c9e9bae6f8b2a2ab70349c771b4286c2632eb698f582e0ecc5f0392e528cdc202b396de5b261fd5a20ea2eaac965981da2886b3100de55eca2bda670f279b2d088d77622f0c47fd6ad4708467db5638ddf249a9dd321558ce1a6fe2f5c4624eae8ab1dc63a42f0c41f357272c09aaebb24ea8a03f6b4a87489928b92195dfb16549daaf9184317cf7f9bb356197c434f78c2858cf2fd164ba26b93c2b024fefbd29564e2132fbd9dd460141b10c3e8f0e494d1604e6667b935185fe7a905f7426d7b95aab26faad6266edde92dd766466e48b7a692566268488137288d66ac922a3783787e69a6237dac56e7f92084fa21c67f874735d0fde68e62ade3b1e79413b17675fe86792ce202c63efb070cb402f6712af46a792314272a9f334d6ef02fd2b8c9ba2eea985c587715bbf2c41b1bc0d5b8215f2580dc34d52606a2094d8680909b3acac30ff496af95c24a76d8730df258567b9cbc459dac69e218825321a4451307c0ca3bb1a5b7e69778e89312c311331c26a580574af7915217a0ab0727205ba87ac8c19b6bd72fc3e2e3f301cc7a70fac80a741b23fec5db072afd40ef6998a55e844cbad15699ccf22ea0470e753879c9913f9811082e0750e9f0d5e668f587d6c88217bf7e4b3c0f9343ec734ab31f920389d7fa5ff35d5aa52dcdf36498d4495a0bb91e956d9aa0d884f9e24008778927fcdec8493e658e255c30fda7a9171f0390a8d4e4296f0fc60a7542a0600617c73eb7610f34a852332407ee7751d5bf8bb9edcbb3a542c3257e687db2e256a4a9f76aaff9ffad0f952d59ad1db79893ba2d8fe94a099b24bd87da7abeb7ee9996d0fd984ec7fc2e14202e22e105e70258959618f07e029a55ced4210c06565c56707a0658b31e1578a58e350a604b742c980b3fee2c008db7fa5d5ae4f81757b181e8e05dec9a2e896382cee2f24b51ffdff5468c3a1c65a9b47e0d8db5b8f16fa8500ea69af8e00f0311d5afe36f0299115c1412d0df8af4a43e225064c191578fb9777be3c192d12c4432ba5b3fedc2d74893c818d0656071a581752dbaa133de2b0523f27cae988722cd4b81447b42d9c2aaf637775cb4c4bb1344392c88c93daf9fe8edb19b2cbcb38ea97d0514e0bed141e3585cd8ba4489be04b09faee1524b2d10fde9c15572ff5e1e780a21652f7e41d8a10842389a166bffba997b45c80998e449aa88db510f23f09adc089ad3d0901d3a0200f76d6a037b7da457bc45f1c6acfa7f588503eac7680a02334453cf17fa4cd27cbf668e6cc12447aa0d710aa0b037ed991c2d9830cef104082e5683beb7ff011c572d899019d50bdc01f65c0e37297eb3697a22486a766bf11f85f56e9b7a164a89696355cab876556079eff98bf7b90e318f8ff583c2be55de882c0defe6996d1bc225a51ef7127df2a5cc47f2ca26123f17e72163fc859c34063084fb6a12ecd6e2d6675bb767bd7e1ffae2b5ca4e285ab832b3504d492de9a70abc072f0a31826e7e83ca23fb7bce9281b01c1eb8b6491a799393dd9072c514c19c5b5d09a3e71125e0b3605920a8a46a9b6eefec26d5e6c4a974d3e5d290f55d0b3f1b95aacc71d4685e990615d5fdbc8af56473dec6c419dd3a57cdb511f1e7f3fa9138aefb36930212f48bc11d467f64f7a6d448e45b82172f93d28311b1663bd5e879173a0968961999718b4727bb13bddc97caf654063f99ac7ba558dde2cb1848e04e52925d0db9b140dd1d47797e8f2f45cec656ad3dc1cd5081ae1c638b0bd8f6b90b78794d3b647e1e654fc18db4c765bb1a0a80f9ef1cda80db16f263f5c142c12c63c43fe7d9b5b5e8e6992876cb7ff9bb18865b6bc1a00aa674963b202a4dce7ffd47cb04396c0c6eb50b371b641cf07127c84c7ce52b88d8de58fbd23c9d49caeb09dadcab2c8abf641ea2ecb9c30803df4cb26bb0016039fb3e8b541fbc98d6d81252b5587c97a29ada5131f3fca93bea1c778149acfc917453d3eefa32256b6a6b1dd868e49be0ff482d32394f3bdfed408103d9b4c2a8f09cbbe7f5855750491b218d02ecfe413c6f1c36b44526b893beba3c879f1c4618232c893a3f954f1e2a481b4e1d298df95807878b65d28e81a008737cf7713294ef0c1aeee7492e91a178cc75fe828cdd09d76be737a72962ee55efdf4329350b0845e33c06dab649879be69f187206918c722bf0440e50dcae88f9d90cac172677bd2c4a23b0afefe498b2f3f162c2bde9c20fcd136dcd97ea89d992d961a08c435e3d40c633e12ac157789a13b8890826ae5ea72d2d663ca940d73132b297e5740e5d4778cb14a325c080bc06de231a4d1d62a518b7e473f4953bdf9f06c6db13b7d587bfe00f0218bb117f503a589c65f961f05e720ee3d2704cc3a9c6f3142640ee2726da9beea230740e7b36f0367729a4af86c5ae354bb95306d758e738b891ed4f3221800fcc07f28f0f38b28f8a95730b191a8a11675898cfb2256af0ce921d296d1d860e9d28d12b92aa6750a625162c9ed86c1d2f356347c19544e4722bc5da5e3674931e7b59098ef3d720d3c1d4399d661a04aa38fc958c113cbbab442c8d8dd5144555e9d4528a7bcaa81a51f65b9f2e5c6ce04aaae39bff1b1d82c59b6883602ccd4c58882d0faa089082bdc4b92b97fcfeda51b75677c8a9b4fd965a93c74185d20bb1bec3a4e8587f14ed867cc909c0619f366918a7d5ae25279fb137e1dee7fd98ddbe3bd19d841dd7c984cb01ec723d37e20951b38df21b05c9e87c5aa11af6fdc3d0be1e315213d33a06cf5ca9d83cab3cde2824573c3ca1fa4689b9f1e564424a3c74140c8b09102653af61a6bb04022b32c6809d5630021b1487863511f06d5c49843a96f7a69777b494994ce23d44994b5352c606a030159b9d4ad7664188e0411718385d936f1371a68a0317907a6d72f61f3a153434ce20f48b3eac009abd6a5437588678a0e4d20cbe3420a4ab8fefd771604b931530eeb3d4d2abd4acdd0d641e603bfb33d01eefbd45c623dfe60a1fcfa26f66db224c03aafb2b66c527716e55b642c72fc19f760da0d1b21e5c0bf6c2674b548e8b810c9721f35ded83e09b65c463829c9e9bca38ab09fb71d83983d118a5063755d6f522accc622cd9a013d5f068d5824f5b12c6d036a6df43deef841b4623de6793e7d4047e1d8b11fafd2da41767eabb27773d761f5b7183406163d9f65489a900093391d13511143681f6473ae1dbcc472127048dc12e81a702f7ba7c4142036484c9bc8d53c7c89cc9b74197ea5e6902370be448801e255dfac727a291105d097f1eeb791eb31674faf8f9f72b7a7aa1e2727d18414958a9705b862eedfc9f3523b8875e3fdfe6053f42d9214b37e86c49e337c5acb800d28c3c40e9fc0cb1319821f9045d532198be1b48dff39d99ab95e67a166872062178f1be9b674a7b4505e1a8332116ad759f0eaef7cbb576a6ed03aed41e7f53de5902670cd5bee6b8927efbb3322f74e40ba074327a8667a57ac33bc775e8ce515af8a203ef6fd8d469825c4b3aa95d2d2a5b0058a91855ef63ad8ab716b45ec1a05ad94a5d653adfaf7532c5de894f9723c6bb31ff7426cdd14a016ca8ebed7856b073a7c6a8f5228fdde4e7c8d9346b1f690d8425a1c487ec2009add49662bca283d8e3d241efe52f44dc7aa0a1f3f245cd5f1bc2a71565dbb90b4442bba4d6ac596fc62a371270b73181450de77471be7917bc7f8f03aec79d6df799659d0e9dbda2177692450a502d3b12b8b59f33b1f59f30046075acd752998f819934ab9d34d8a05d5a6ffc22bf72a749125c7f47ca5d3ff82252a53462f5d4a46151f7d3487a2788987a8f546f8ecd6707939ca77fbbb004de84e20555eb8da7c4dc386880ee759f544d080ec5f74cba9a2cd3fb9c1f4dcf9bf2ab73b1e18435cbbeb784649d524994d0b27a4a16ecebd50f6c68aaf3dc02618448a600417ff47cddbc4d7def852e62ebd4bd855175a2c024af18309e2644382200c5c972478ce1228eee524dd8f7c586b502fe11ae866254e333b688f33e29b41cf995dca4a60275778d6c1d114cc6899e6f3ebf6040c38552e0c4190b973b22e469ebe75deae5bfbd5351c8f9d46bdcd72cccc15378eba04248e3b935f87754a03e53fb3cff94e6a9678bb75838be68a86230814fd5e38efc939ad03b09e333989f5580078e17d483f1a251f620c7135939f3651cffb235c8e872c6e3718aa514b57ade873e746f931b1cfd9a328dc631d89cd7819f607fed6ff203f6d971935ba7497d84b8b5a1200b83250e19186a7968b33e485df653b552a2ef3be8a2e6b69e4bc6c6a3e25174e95e30187b70e57a10c10237e07b9866b60af37c4724846dc2061f14a80167d5de368681019e2179f94d8a17d1f73849c5b3757f9dff57c83a04f1376f1cca8c12928f1052a904c14adf40afd7721aa6a724df0d933b460e2fcda5f89f3a64e1acfab28f17997899 -MD = 94a5d77bc308382a8aa317be7bad0a870f006c67 - -Len = 34568 -Msg = 1d91b86acc6ea170bfcf187f773b577b95e29d36fb30779d2ea23e2ffed9e1b46aede42bbe03a904fe22ef8f874298b5f4a6afe63f6ca9522863eb5cdb1c8d4bcd445e43e7302875e6ba3592024c1185cd3a92615f551698b0bd0c6f45f6b6ae0f3e2c9c901ea52a3f40f26f2e804b54ea454e91a21245d88c58a84f858fe344f884581d00f5a88dd15b2e0e5407cd8b1170ec5c52ccbe7885ddc7e6e30e9c754fbeeaad81dcb90563b4f257bb081f900b6373acb5aa0ae263f4711ba69b69a9de94e83659fb61fabff24532adaccacda0c5eb6815d5b07cee44afd61860d3486bac5c9fd17b27d4abbe3087701b55a8973f5d78b87438b0ee7688ff7f8261babfb14dd0318494fcf0c0ba3e4d7c488bba78d0c4e7b02be52a31057f242c9c68a249c4b0c13d2fd8569feb3f8cf72cddcf194c33e9b110826b1e2d3c4f840ab8db1cc829c9cf80d1a404cb7275b688069fc9d9af089e6ff179e5081f48b2351334d3612290620f50a49663bf50dee46ef23180208a9fd1991c2d9e1056dfa5e2731697845f1c65bb1cfeba0f649ac87d90f8486cb8debce21c9ef8f8c233e08b618c73357e28097bd5e3d848fa10bd9b40c73a7cda80bb3440e11dbdd5d57078c6defc1e35ac83f997eec6545a684a30cb465c3838b053f7519e1549d4eedd0f6ab43b27ccd15c9c29c78b19cccbf8a4fa1cb88819940e93187ce9820aa5adba14b436398abe1bcb55152f8198614e5f93f25655c75473715a24a052be236ae08e89f73ab89c48f0e180bb730551d4c95e6f3c8588190af7e23e42a0378f9be89ed986149e926b7296b236d65cc4124a253c7402a50b5c8e7771d853be12c93c0d4de9ad84c90db93c50a894e6e1914bae0006b26651f09ee06568559bd47b43a28c2aefb268b52d9b051a94e8d1d832c264f87f12144e90e6c3fd8d16fc3965273f51c06f98ec367a7692beadbb6f6929105450f37bffca51339ce377b38c0a620d640a0581393ca34e1bfa7cc8df56abab220c4faf8ab6e95c4f3f0520fa9a1d9f6db4ba4a24a7dc33ba309c1faf6310dd689d6fd777bb75e71d89096c0d7d1e9c73a6d71c35dfeece794856ea67f71f5030ea9b1c4f40bf7b0fa9cbbe4d1c2ead7fc8a31ef54ca1c65f2af24e9079a1a981db1aa699af8dc12b88933f41dd147a98026879eb56bcc374bfb875b1535f936458369cdd6fa8617b0ca91671299aaac63c6c54a066096fc1edef8752ec1eb4df493526a4e8d802071e546d656986e5115ef9d89ae24e6f4d9de1abfbaca9b4fd96606e7482e44cd5a7de69a603a1d58250552c6334546e21b8d40a35fbc73cc328ff99d8a596e9f08d8d34bb61b32020fac87a83c2e312432411cc87413ff43be55ad255b9b47e5dbaaaf62ce9846ef4449ce780f6c303bdcbe0187ae6da836cb6b83f752607b625147cd68205db680417179de437bbea97938816955260925e836308bf54573651854dfd441c81b55a5983c436ec946fd76653f060ee99c81a35a156bbac6ca9e9f46393fa953ffefef42683ff7f1639872b87cb63204ccea7b2bb51f2940db5f34808bf2cdadbebf6ce4903c65709f1aeca6dd22751434b0de4f920eb750402796b81a963521d234cd1336c13dc353e552a4d2a33ea44e855b2a2ec2eb817398244197a2665cf4f08e42ee56f7662c983356ffe0f51184d860300dc44c30f0217bb175afe7bb71630ee8096608d573a40d21a7444f08721a8c15919b400b3043fb8c27072fc9f21ced972a87089dd3894e998b4592e580cc4d3f6ca06d5cde8022364e50a504d18e98c4c4327d2bc6b88632fe7d67255b8e0211f18c3ac235568e443e04ee089a18aef568e0cd0bc7c23262835442644ca07931b2b72ec7ff47ae4a78ac7121d67b8ead8b2a7eca4136e1bcbc529b1eeed3e11342a9bfda76d3f09da0bfc4fcf107b6519d7808c3ed76f2a5fc0107b1bc78f83b03dc7476367bf3c238a75006945db486223201a5071303c2e4d7eec920001d1d88e7c327d8b0366c92fbb8bb1ade17bfbc10efca388b9377e95fd6c1d419ce3f4424526bb80126d1524555a70f194e62cd7d29cffc5100598c01463823269a14c84a78be7eef53b4f8ecbd36db8fd723d8ef5602cd03f8cc4f54c398a7a6ff4277a2cc9c77fb2b6bf98a66072ab2205750dfeb2f1504eb6495c2b56fdc1b7c2cf4c5b4824d953c8ac676d6845720d881d7d75f917ee4369711e3b22a3b147f58a23bc70c5a4df586026a853afb4c6e47d05e29c6751288f8263040644f02973a127d8aa74895f4d21fbe088781953ffddcece05a621040fc5520d68a72665265c7f365cf72fda91380e9b71684bbec385ffc19b9f08e0d18214deb195fc01f402545ff01740580bed88647547ef0f17bcc141c619acc3bd01d0ff4ad61907c7ddcdd9cc9c61e2a38791c0fcdcb04ce2cc3cd8eedbb5b5bb89aff99932277e8633132e5a4e3c7e415050396ef0337f0efb970d7baeccbfb363d9520871cb6f194d4de500f57937cd8eee56344b23af8292fb68d55a99e78dd87595fe5aafe16773a4872858c0122f8a939fb4b526e526d88f7265a7c337312eac47e3b67bdc5aec409b3940b719508c659d57f6e428e2177cb2915df3b787ada5f21e4dd769d90248a99b75095316db8fd785d507809e95e9b1c243d06e789f891d19e7698ecdfbe43ab5bf5cc86ac137d6a71c34f5429cfff561220364ea4a7f513b4cdc551c203ed5f1e659813584862023911590b672e508d4c233a1c6f8b015ec43d6c6afb97b02b6b1a7855d6da33f63fd5258e25fc47285eb092ef5ef43f19496ffe86e0ec6496de9eedcccc4b6bbcd279356afadc4b9da652c125e77616d9b0b01c3416645337c56d88f68d1e91acbd97f9003a20c673df74655e8da32126a6b815f110b20474cc00ba51bdb62e6c4d9be10c888c503156bfc007d5edd67677d2ac5c443800d45ef2f26cb2c49a620f0f9dee4a51616ca87f819044d8bf5fb0ba1fc44578d0ecfabed1b620ac7e346e6d80041422827c414e2ab64ed63428edb910c778f6ed153bbed8bc7be0424a0830280c5a623be6ad961bb87878ed889b7a0fe47324cdf37e8d67ee29027f1958f20655a1b2e6426a01e535462333f526576d99b8a4ebee5fa50fc9bc758d28dd1d9b8e7e7719f5f2fc17ab3c87bfd53adbca55add9df8c3b9050edaadc150f012d680535315fa7e4ff1398cff8e9cf3591a6a6e7460153bec9abb878887f2271abec588a742fae9c85697c75093a4992f3731be97c09bb45dba0c8aa1d54198b13a906d2b1f290962999c4d03b29baff9bc01328de51496d20b07cb40d1c4ac9ff2e8ea27d50e46e562500460150b9c7d50e3b2a0f607481435b633ada303cbab8dd5e7e28b31091858bcd5afe17bc8849cde26161bfd34ebe121a82f74865e9fb45f4ca56a1bb8c424e7a83741749bd548fa76387e7dc11eb74f130f6cd6cb410e8f01b89a53bdb16ed966415b7d7d3afb3f8b4e440f57775e485d96b27a7c5a446cef6342617ea7dd9bf515571ed6795db64ba0983b5ebc7f146c096ffad7b1fdfefcee8bce656e19343ffb5edf0e5b17669f75a08a3eb6c1bc2ab3cadf4610e24e11a09c21d8cdcbac2b3b98498da8d1586f178483602dcd477edbecaf303d9a6317c29ee2418e9b0ca01c2ce3bb283292a4cc6daf2ae94abd4fc8fcf5fd01ce46f49cb89a0777305b88e7423501a2e31e24dd839405b1e12687c32336142426fd927613d0925133a1cae504c8c5e08c04d992edbc5a4e3a8b0d1489fcdf6e4992d798d60c4ae34be64e5b982370a8d44aaa32d4af8f89fcf3c90355cec5a7e00cad492ad697f72133fc9426cf6bc363fa7e075ff30e28cf67a3d8b0352e969274fbd337b7e1535c8fbcd7d7521df9e21b3f57b7123df35dee83dac1b8820408d1a97c243690c0a503766bd236ed11f9b6d46b039486b44b905152b1df2ab9ea2b9e8d1adc0c06a4961299400245d54fd2258b6cff50314455f588a7328c7ddf8bc44d402fbded005078a9493f8c0b8d771afe1add0233ee4657c4cc3a11188ff80206bfb90c3d623990e31474297c5aad9b0e34b50682f16a604e477e2151a37a40febe025fbd715a438eca2986f05f7d9001e210c3e6f6caf66d418625f1c319667f66901f36d6ba77f492e70a2f44eee1204e75a127a56c026be2db83c196de5dcfdeedb5713861155b95341d00b00976b39d6c080ca55a6d8e5104a586c5d00b364fa187334058060cfb9b272c4bd53702fa7d605f9f9c1d1fb789f10bf7f759fee132ff4796a6304feba1907cbe5a0d548b3111e63a38fc653bf3d117d55c2f6dbb2a8474e1537d6c8dd0c1b5b1a0def3780f836a1f38f1aa06c9ac71070676cd06117d81c968d4aa0aaf20a2cbb09425eaa01fb2f5a3e3343f93eae234fd1464e96d5437f8ec1c528ac6160ab5911533096a4b886582bc4d0fdaf232044af37b8dc8705e13e73fac349e0cb4174b4b65fcf770b217dc633b9e242e2921f4f9591aa939bec562240031be686997e71c02eccff7f9b2b9c04613fc058e30031048b799171eb363b396a9ae93f1e06c725400784625df22bbb897e7df2bdc801f8e8c1f724788f5d4b5c3f7f61498e234a1617cc7fe451d3cd7516f24c6ca720e74c2c3b202ea1d6fa7a720f89a68514a323663e14b8db52bed6a1b3d28a5e1c542810d3f1582e56cb27eb1004af7c29b4fa8b3fbd65eef70400973901913d62b40f0868248f754b31f703378edee3c113fdff67f6561d5f31857008661bc572ab638b5e165f1722d36a42dc74bf4c8934c02b3d4c13d6e9dbf7c4988c74a6fa9eb8022c5321a48c03e4327552cb26d0abc397362b29bc2547c9fd7fc1462239128f156977917dd558174a98a58cf335cd8aebd910023da0196e8304b10ae7dc8b5b3d8bd00933ad545603cce96f42272e88619c9727cbd8d5680dede83d68437daed30a190346526d32e6789b0c9433434ec0f72d14f73de048f691c358240c6dfc8e7a9f0a268327307b3236cf59d8a030628f4e54305dee83c576cee59ba5e0b6b843fea864bdf6c13a7049321385d9ffcebb776017a7349b032387503f9e5a7fe8fca448814170879cb94edf41d934ef7e1244c30da87711381e793290545fbab91b2c74fcdc18d62a73c41175316591f90a12e792e01a68ccde11073e7644f98115e3b847dc544f5c4625931e2cc089b8297e6847dc931439d8db488a62cebed973868ce2d0b755ba970fbebd39fa2943f6f3af8cfc75a61795546114a8316d3aba715d6e47a68bbdeccf0ed2d7671314d8ff37e2ce3680ee9a090b5dc531a72d6130c44aafc643eece0ffdef838bb9b3661d9bd9d05a57176d7581d63833df19fe413bf8778b30c5a12f2673dcfc9f9824bb35e291557b3a76067f0e7fbc8788f83f3ef84d79b4cb0cc902f0322e374b7b74b08d9fbc7fb05a485d771a303312c56747da8ff65277775a0df521950345f0c6764b49f3d72170b797a0763354201c65d11fcd958c43674eb1e329c5a6001b2d019c2e9004065fe0d80b423a7d3933c7852864dbe4c75333995ac93472026114ed00bc25a8c77e307927dcba20d6c1e8be95044dde6bc1951ebc7e6609e5591a8319810917ed62330576c436c1713d55f7d62a4ffbb948efdc98c7eedff169aa8e370bdee400927507888734d1a10cabcb7c2576af284fa03d70141366ef194148f9bafb9f798562f9cd9438f3eec64693f7a4366b415c62cbc301882116fe7b5dc22d03ace0c17946c689c79aa2e0a30bc92523d29cd58402121eb1b1017fb53730c06b9ebebd4498f3c6452875e26d7d7106b3578371907addba347947238b6fb613b7d76c0f414ae5d8563fc041f2737fe7598cad871490966264fc50607a51d2956cf9810dfbe71d4e5f432a95de884635aac463ac9cddcca5e7bca5ecee9816d3ff77865fc0f7fa86e4c51d448e2684801ba15e4875ccf0f3212ccfff64ace35de3d4046b5ce81e106b5800e48dc89b452095e5e15be8a3e895ef273e890ad871be8153c71c51e889775e7dec5a08faf35e34a31d9bbb45f4da565410b83c56dde4221ce99ba -MD = 515d2a8972936e6b45b9b457d9eab8e2f62cbc3d - -Len = 35360 -Msg = a24a4cc29e44d50386c9cada21d741d35cf8aa713c6a5f72167e7c55023ef01a8d52d449ae25fc35fc43cc821d064de58271802b515cf37da3d191e2f0b7be05c7ada439c339c7baba22e035371ae88b2ba073d3df253f9e2d6e0d7ef039afc9b923639ac4c95f192a2eadfc575d394ebf4f296fcd0e6c5d1c1b9631ea0debedca7cb974981decdab22edcde651569b5a6444a0a035fa242d9a1d404c67c99f9617f50d0297d9586bcec14e44a8b9f4948487fa9696008d6cac871fe6ccce275e8f6cdb55e3182a4af2efe15ec0704900e227056e759c7a058571228c545edeac6a7db2c1f80dcbcf3bd427934d0c0145e9cc41865910628eb186188b731e3e0635a203c54b4cb56f06187180a30fa5da17c23f8cb51eef7ecd106292bd6ebdd27d944ede51376fb0ee175fb576ddbf1408b37fc01e1a794c14ba9100a7e2e6b7aebf047bbe60632b507b52901d08a5aa191a52eef895887d44ef1473a6fd311c457cc53bc74a2844d99efaaf2a12f202e5618967e912a598ca286d5a5f103586de67f18d10773783e60ca871028f4c94ea1363b94404491500e11c2314ee6c6dd60b29ee3e5a196f024efc745adffdf683ba7251adfceb78a5b3a16c8cca3e57c8d0ceed8575366cbad0672787778eae6ed145cf9b6f254a151a8da51b5633db334360f9aa5b17138c2b69191cf88702f7d25e9170dd6effdb80416b44f4d54e81fd7090f17e43e9d2da72a77fd57fbabb381d35e2ca2100658f5d0d9e38ab4841498e521f5145563b4824814490c12c259d122b55a7f3f24f92412a8b841e5f0dc21aab786683ff320eff04ffacf3edc35bcde03e19505bf6238e309189b6d933f1960b8130983b338952c105aca056111eb1032070be93f5cda4ce449c0d6d40428100ee41fa90dc61d033faf22f2b9b305c0291509740cafb2532194d7a81df5f7c1a041d13a68902e7ec542028a4ce3b3f4d052b92c8e236703a8410869d5d82e7b567247bd2c6071a3885b9057836b9db60f08419b2d7fa26161987da36376754618beaabac0fc8e7c7142f4e0c4126a0dce7dc949528d0a7734e15bdd3197722bce6f22b98e2c2c11683e57ad789fc302f5fb7abd6313484c0a63cda0a602d03160cbd643fdbaf3685698e14708db4f9b6cc87b7fcada03e8c967f9732a813561b61befdf756c8d8b2199b935da8eb7e21b2cf517edaae4545b3507de25da4ac1b9a694165e0c9f82b38608ff587fa2dfeb71100e364b9397a6152069ffd6b65c4fb6ee6f2160d453f2aaf52ee978b999c2ddf3ea0c84b7b9944f6c9d213d2137619125722431d108c84ca949f43fa4188abac736d61ef8c30c2a1201f1d7355cd88060a7d04641a91cb34bd8e39e0a64294eb377fee200bcf5ef3a1ed86c97d29acbc7978d69ca3cd52804631d5a938689e2e037eb9574ac39e70e7a3fc3f2a191ba83c9c46014cbddf3fc730a3ee88590bd76fd0502ff9bbf57b39f8ca5ecd2a395bcc5dbf4c85d1b5c5a8f1211b16928299c52b4f047926f8a541529da2d6bbaa399143ced8efb77ab47409d9a953a386c7abd6026f49831c717627c2a5e77bd2d433d4d130dacd927ea0d13a23d01a7cf39c6716dafb6ed552410ef5d27fb947be2c8782eee7829196c7edcf151c65f9a01f54f8d20f38b7da4a7e83a2f0127d59d3e2405d8674fc9f41b604f788f4715f9d3624eee57f387bfadd18a1f905e839c26b8617482347fab6d08845a6647884ae71378c1ea0ebb9cac11159eb121cc08089e0a6ad0be83b8fb3a57a052473a1bb9c8d243b5c260642b10a3556b58fa096c3dc86159d61c444d5f92f25c2f7495d2ea251abff8c03eb336fcecc6eb53c6dbfd630226659477ece0fbf78ae77ee0b9e239ee10992153cbebe70acac22068dd46a2f43e5131785f235b58e658a023f617d668b18bcccbfb972e5780c5a816f8804edfaa843c702e9279bd7868228712f0c42fa9b809cdcba2977defdd35f9b6132f6d70e4fc86e2941fcc47004b3394d7caec00062081c474eb211ff00d399e680d449a5bbbe3029013305b09644f0433b247bf5f58106d75f1ee19e779fd38e5b00c2fd0bfae16f01e8fbc69b505eb6b42e7edaafaa24e0e7389e4abc16d0df3e06e382a5210a71b0892730a867bd0e9437592cf4e5ef0a5379d88232db2a4fb6411bc53ba313c7999e086d21fd93b147c98b7b59c6ddaa407d00e3605f48563059fc3323f385d72992200abc748b454b7f962462cf79471a9ca7dce905a39948bbd56af2b4e926ecfffe67cc8f0c411ba409e694523a776e534ddd2170d47f7be157bb2c49a64d50420422d68f8f2b34e14700631199a1985b63729e23537f3654f3c2354455a0f002c1ba5f088c7a23b1de2063602f5c44ff792bd39f892ef4a13a1ea2176fd848bcc7acea8caca474904fb4f9d0641de0da0f6756481df553307b1f07456d39d6da8668fd7e483084071c3caae4c05cf85586b39aaf6a68ce9d6741b940d66c06d67e7d0c6fe7a4ee70b435fb0fdc9fe80c8faf1558070fc3426f254cbc23e5655b10579be413882077b82f7ed4016d5c598aa85ab46c30ddba034845f9de1c8eb30c97305d4440a68688878ab3e72bb1e6f84def5712a27a8eb419199c7d97cf8893aa4e3e02650d27b5ecc331e681851f58ee27a282ab261af2165c168aedc436761f5a28d67ba0d5c0bd9cd097d5527d3d27a84944d16cf96dde61fa7e64f9670444e89028eb2e0b29789c0273bd868b1588f59dc1abbba467cfefaad0b3cb74ced98df68239f15260bc2569f290adc362607422a190aea6706949ca2a40d6fa464b9ede6aee9725f6e6ed59acf534a0b46cc87a3d36926a2848f4bad3a298620af9bfba5b8f7c006c874863fb61c7cd8c0c47071cf41379ffdd950f654f8c467d82450cdc833c6c222bcb1b765cb38449ad945bc95fbe6057959f3a67ae2f122e73e368567044e3c832e9e2964ca47f7def24dabaefdf97c00f77be5354fd4f8e2d0f3f51cd21e1bf3b294be3c7f719a94f6d167a1b138ae9b9b32da0ba73692d3c2d0466f0600087a30dd9e74547dd5c2cf1918f67e6d40512d5eae8652df97c1fc15a0e806b9ab2190bff094af354f72646de436cb5edd2b9548882eb897b0b5650a2a103b14abefba83dd25fa5fb1ab9d15f6e802d42b2fbb38918a422685b6e7f70d6e0dd8b1ed96708cae9cc4a276625874948a97d2678875f1225653bdcc6923708be5cc64210dd025b7fd2ccbda9b8087c3cb6f7bdbe249cf7e5ee701ffd4d77ced29ba6d9505e9d2c8855fd3df30d356fb2d24ce92b3fa5327c0abf8580e5b591e436873516705b96a9c24648d099a0ac7187d7294e1d1a7a4e6644bde00f72ea6999e1f5b1c6a0224aa4423ed0f1ccaacf44410e95516f07d36dda19a92f3230b952619bd0b60d67f1788ba0628a3bf34293f4f9af811593b1adda392ad9662d79dc7087f1b315d024bb5d1e03d7510e61f37d8adb10a0765f92bf9d0372910911b4894a73623be35af960f8437dbe64a3ef3522d674825833a904a5c1af458c27672663f438022a0a9f21df9fc1d69e9ef3d661f0414d91d47d43e3c3c3f60f1160d264e298eb0cca290a2477683c04a98dbbc8d6fb64bbc87bf7e7a875250a663e17cddd2969140033947778b5514f6a396fb7e9076a5e76218b21ee174516ac5b50ef325dfec8432b5b49025da8c737636cbfb4f9b0c2740a9822e34ef8bc3a45287980ab3ea2199cc909a2b5b514b7b83d60b946faa03893894b46709253c68818dd46958b39e9e46849e85208a051845c1b64738a703a58e93b7620b475a7908c8b02a176e83abea37a21b71602ab7433704503f2baffd7325400d3d1ba73fafe23336384359278152b1d596fb41bf46defe97cc5d90f7aff25650e6c6aa2340806673035ba67ad37cd09bd682d298165eab0527652dfc09a301134f73eb8b814d4fcac0def50ba85e09557b1e66a97b601480976c0e754ae0493ec148f3e03ceef823b6f4cb44c89f63ebcbf6845c3d8c3ff1659abcc83a5037b9826d498b370e69672ec3b28cfbe8e7450f33b41823893641da16be5fa19cd26cda0b75f23b53a97c7076314b08e19b4b8efc7e46f60001563c099ca0476c233f134a007f0f65bf4cc433d1eab83189e6927a6b4c7e98a61ad39adff5f466301b745171997dedb6be722218cfd381b9fc61d4029383fa2f74e9f20ec56f3503e6444950a74b9393b9c16d9063217831764433cb83cdcda34bc438b177817fa48acc59261342fe6027fb39c10e69bffb3d83bf4f8423ba0b89ad955175f2ed19ed54aa79442ad725ef66b1323975fd1f38669f15ff4f696e15ec3175268a266cf92364d4a2cbc5e8f94afa6b4a0bdba34e35fca65a1781d4d7c933a5f210d3a59483aebc95ec71b32df13ff4abf401916937fd88ff44ab46b78cc369414e9bcaa8bab0bb8557828d73a2a656c2f816f070b5cb45549e8eca9d7c0b4a7b0a27e51c119358dad2a17fb3a45718f9dec3c94af78d65c3ecd36b71e230cf080d1efdd8d07f1cfc26768fd5407bc2b770af23e1456c6eb3f8212e1b065d81511f291bc43f9b8d541ba8c7c1be3adc637482061ce790ea8c88211d8330b8e6bc07f046c8a610354878e02f5f66bbef67b3e67be3242060b5657a3f92a86988b28f1a86cc4c059c4107c5ce987f27822af581881e4645599857d59c2eb599ef9c7d50e3b87aa348a88e00ac5253a51e1401fb38b593265c9c25da3d40a170a1e09a3966747812c3e3d638d176285e4a8da1fd909154ecf129993029b1b21528e8ae7e16e88e79955ca71646ed477a8efd9b2f9a98d0bea0a77980686731b10c1a81c6fcfd04004479c842129df82072ccb8385db351c5f27e8e71034c666bd3e0daba1e9921d15aa403633d7083787f62c0c1e1cb1d286e17a0ac0147986c07a1830186a52e115f441e21d04d2fab3c287b712fc67d109dd877d86a3f10db2fc442443c0a73ebd9c0e226d21b45e13284b1f14e8eb9a5052ada9e471e17e1d4b3e02b46ae3885528217174bc40d41e7df29e84609190e307692a69fcbf3a67dd5255dae7bc50751f1859f432fcff4e5a2acff2021e574a62268977a2eec51b292d8837c58619a5f75f364c344d322b43302dee3bd64feed98211ae02f4c0bfc52c344b62c566603762b0ed2eb60f1dafcf32c97c4dfd58f3e88d6dab659fbe17dac4966e1ea92c55cf346790cc08ce163479144209e20147e64746fab5d4aeb7b5c3a935e66462d9014b4bf8f391951d2c5b7f3b8e90802bf7c9ba8f69e1fa2b59bbe468b12acc47856ffac5c14c1b0b03643ac7408b5e36899f48b7f65a38d91307d865035e9117d80cf485c99ab886562e0753c424e3ee38326232ff9fd3478e5205b9518289c075cce9c750f006059113458f8e1fc9c9702da75eca4561fd3804fcd42048fee7fb0a2af90c0e7c1f40be75c902be684ecdeb88b9facd6d708cab1e53f3f468e4b45f38996f289329e17a289ec69357e4ade676c315aa4e3818befaa74117604d5e36a336dee0d3bbfff0de8f5e2101219cc902088f6e9cba48bb025cac447d98451aeb4fffc9c64bf89cf8091e0a0c9c16edab08ec8cc18db919d5c279fe094bf59681432635e36067e905aa9a90c2aaa8cee23291776518d675e5975e96abdf0c1405cf06d7a38fca5fa7c26867dbe3df07381432d0ffe21d39a249aeb0cdd7e52dd93206019f309c8b3f0eebf1b0be06112d2c350bea7019ef9c380edef7bd1d4e8c1aa8562ed96ad63beeb9c0d9bfca6731f91c9abd5949025400d363a1f510f08ee75247eb0091db3ec03657cf6fa883d6f95e0ff0f4270c3a22b10165166cbe6236b8594c4cce04a8420618fa240cf19cbb7dce2de73087ef2c1c1ab9a78cf2a6873efcdaf45bed28d29d96f293843ae3adf077bc98f1efb37b6922081efe47bc375ac51fbde7ff0100615431349aba5c4f5a7f358fe7be579f4cb9e8f33d2813e5a02472ffeea4e149f5d34e6dad1a571e105711329e7e2c162b44c4aac61e5e0083ad7d40cc994a1dcf96a2c557b574a8b691e8376299a16e895533cc2584fb1689b2b7172e26abfa5300c6c21726256db1a222f4e0bb7806eb5daedde8166ba626f688e97fd7677e24c432fa67e709eba62a49f1a53de07dc5d0ae466a2d302dffcb9b4e3e463d07b9336fc4c6626280e87cc5c40cab9b41ad50ba9c4843e91c58c4469be5ed7d3 -MD = 7fb74b4dde68f8c5e0d9b27878040123a9ed5fde - -Len = 36152 -Msg = 0e2fce9e123c9e83a8ed6fa9aac879f9b112c0f77c9f963e91e8612a265e9ed441fe26431f26b0e0d3a7982b2f1bdfade779722df4e6af2737ce257a5f349b610c4654a434359210c74359248e1e750d596cbfd559a79bd7cb2bc576d68d4e0eb72fe12b1b114bf9ccea3afc907845014f142d55738963349426ca845512bdc489e0543f9b63e3852cc4c41bfdd15772109846160a350e28dce8bb0ea26bf269cb8235477bd3639b2df87eea9dd3b146e5219280e652a49ae999207b863ff5e6c63c0dad8408d22219aff1cf38245d6716d798fcce892e71055f8233c936cc24bf3763d87eab38043610a333956c63bbebe1e0f08c82b2977665679e33f9810a019abf3031639e28cd441e7f7d54c92cab68f2c5e6e43bf384d15a248c301c7fd38ea91d64d90b762572ea19b88399a1a09357e4a558ce6d79cce02d9b83a36d7c3baa07e1b587d688c38d6b0ea3db01108b96b3918575ed9b7d8321299820bb45c849566e9e1a303c5f91db475995364477379c7114375b340dca68fe1a9a51765e0f72d43ccd6c8a6d7ed32a4fd1278480c2060eac1d9f8aa33d6ae2af1a17572483c4da38a772ba15daba802d96bc18cec05931f62da2e568658f9dffa7f52f432db24a3ab02a14812ff8119aeddd4788b9fca099714a8f84c940f6b349d348e295a5ebe9f17de0d604f5a53fdc725ad73359243ef180cf1ef2e3b7730899e82a440684ee7151653fe21804c46e6399e2b8d7848db42dec5e66e2a6e6ed2f5843c13bdef03990ece250cbf5d0a8984cd2cfde8a2dc2372f6dafa38cb5ff7de05494aec1984f20bde7d676420b94fabbce01d6fcc72388e07355903088476bc78546c5f48ebdeb2077fc7fb11f396f2effd427a302e0064797de0f5c05cbe257005eea41798bd75dba4b4f0bb19fe0ec8cd23a4787ff9bab02d48ad6d795c8d6ea64846e02bfcebbd74a4e176ccf363e9e8375b0fd8b2e56dcbe6867a4ad078d6ee0fb44d063b783f682e49ff5d0576c5d6e41a50d89a68e4c2511d7151985c4b15bb68b8c7e79fe41797a69f7aa2dbef01b07ef5f03ed9c7a90edeed1e32cc3de5d1f0bdd19fe71deb9763f18669f7b80122d569a00eac88f8764748113e2d11b6c9d8b6c3b2d27f5ca42e7000b94ed34dc1da267898559b392de30ccaf9137901298d5e0ecee67af32442958a1f65a35003d9b6da5a6990d3ac3eb5bc1203e67d678afe2342978337be6cfc831ac0baa06f709555c35cec6067b6dd550772bc540a6e21a1cc6a3aa2c8f9ff7c19e48bc77b2b3c6b61a41057f6e7ee3657e49d4d988362fabae303ccea6638e5cb45993d9d56269bc3d3af32b04e62d071ddfbc288772caeac76710e895e13407d68556b7cadee6758700b894a66c5a3e3c34a5b60c6092dffa8f4f02c3e292ccec152e96f8efe4eadedd7b42bada1212c391b6097dc6309430f220a5982d50b2de514200c75d0b212c1764bcaaf6ff8c9a3e17ab436d4b114fd6ac577c8c15c19481bb7c9fef042457f79d8adc89c7b3a983f124c71d8c5c40841ba3d7c58902f6edc093e86e77fb48c54b34ba5a1290d9a86cfa709d9a7fec44940e11a1557ceddd7acb0aa30bace8c99942aa33892910f4afb7a5b71f823a5e3f2292e821385f9810af6d5369411e4bad3d16dad38837b0e3e2d031c06b11194566c362943c3667abc47a4939c1d192afad651899b537252f0458d427445bbece620ad6579258927394974c2235ebe7c818ffb583b6f698bca4a568fc15ff95019fd00e1242af618fa62d23cca453921f084c7938955e54b14a1fb5e6e4e5e607a47ed06c52211b2882a597e016f1dbde04b42c615a56a0377f2e828ebbf5f908f97ae50dcc980a65b165700694ad092a959f95a50bc5c376c93a999ca117152b272e159eb7fb746fbad776e5246f662e41757dadb2950695b3abc0b79f338498b50027c71c32a26d25627026d11f380f939eac2156adb1bdc2e9c087bb318c782b5ae52f0224dc887b6d2870a0a5c8f81082eaa800f50c15805c61b5fff976f312a3157f71bb6ae84262646c9be95e0f4289ffeab7555ec6746c6ae973738a30f143805e72de93b405a8edc2c9d4427cb01cb29083b5f1f72682a5ca1e880f5850a2ee750b75a01549a78b19324cbb68e2a1cc426cfd0bd11f04d801081e4f92b728276c4669d93298c70519df3a12fb618216a77b15f57ce65ccc36391e9007af3df2ea2ba086347970256bd787905cb4255568b7e5f71f03f04910ba711bdebf491897c103ef42750ab1b722197ab463f4542c295658e2ff2a173792fd384070b4621c107a5c8513fd72a4c9da1b2af755da9cd74e62ee6171fd54c9ac2e5549e6952120ee1424dbb130dbd3b1bae7f7b2ae60cbb65b6bb12cc40f68654744d2477c4dfa456048558fb30448859e12eb72991f0d778c8178c5340f750fc9369340de49a56988190afdc2c6314010d45bfd6381a3773d563ca315fdfb94fd52153782bc2940d4be816427c995c95855d0bbd43097a0b615882e2f80ffdb2bc1df95314f8fb48b60422da8b67c08bebcd214b3d1f1d93ee4e1ce4a418bcc9baa79c3b3aadeacf726d6be0e35eee58a32e770ca0fb7091eebd1eb2de7a64f94366c27d0741e0f5e39c48120edf44803de9937df8ff31a9f54dfeda11b594c608d3f2b505657c709c094dca887951972e96fd1bbfcacf30744943c6e85abab45d67a36faf792bb40e4cf396caada401f7af1a626fceb7c9ee576405ccca4548c3aa6af9700d7d34bcdfcff36ffc9a552baa81ee837b79dae5f0f6232994c307ce04a00ef182cf771a2a396cc2e6d3153d01ba2c857183e7ddae708ba93ac255ff0ee90cae89b0ffb8c4c66f6decbca69e5d3988f011647547d849cba63cb1c7b941ac7f0172b0331b280d77eb7ed59de21566a05dfbaa07b707084fbb0b1fe1af2570d294ee4bb5b3dc6512b63dac7f8ab2e7ef2990b323adc332a452367b182322cca3c35cf20c154a73cc4879afa00ace23e1ed711e3d9e953f46064f41ffb7d2266f273f318ab20aa0012ce36dc3d4bfb115140d59c9fbe5a4c131a602ecffbc04913b1598c60c85705ddddb554f9b1005e527c5e46d684d09927edb4c844d38edc67960765297536b3ec5f1f497a05798fea34b5c7c4623b426587f7d4a42e1485b5cb07894e4fd07309fa7ca50a70ef0be110e009b18125b1928d313a3533dbadc7f761e2177dacabfa56d54fef1ae93affb7e9f2e708154d79aa6ae2400b6abd63c31b57cb2852c5881c312f712aef840bd2d76cad20947ee184abb40cdd491b52d73fcfb4774b277bf4992ddac98951cf08b35e4af129ac91c3fb98e3d201315bdad43418931e3b9b851431701e4009110284af07a25c3f521063760b1219664875e36d40a35367b078aa237d529b149a6752492c5cb59fec13ea36cdc41921e04f736274d07315817463eb478c23da32e026130146bd35277398c0711089ccea118cfbfc4205acd722487117f55ec4a01507f5cd89fb67cbd875fc3f1ff2ce2f6236201f2091947a2a609e34b5d638aeadfdd7da4cf79e9fec8ad27f19dc8f77eb7ab926929f343233b458e8f3139f225110a16eb83a436c54de2b7826cd7789535fae59c2b8f6c7e54a8879d79b62c5a8493bd2f54bbcfabb79ed736c4fee2f43eee700d5634100ea2c17308af8e75f5baf8e4e2ab27311c76402b816e95c2f632e4c63f6297ea6e762eb5534b298b8114a80297ff8ce7920a6508f4a2429525a27c6ca4b91138187f2ee30fc4fdc977323faad1da437f96f47c1403086bd60d1e13b7cfc2369596fe606080b591ac62841e5202c3e155b5c503c12f29980216f6595c23267e8f64a451d278958bc0bd9ad27cbd34fd0658ec8a84fb5e5db5dddbabae415e6f820be181ad39dd2292f2e6daaf63b5ed0e0aeb7ef3da4f134dbc2e8942acc27029e7366e5556f51c9face8b54e98cf37c936326f824e445f464c7f809db80b26c39133766f5285c0433620e0febed963e48561bab4ea06984c094f103415810a0b9439485faf07c42a491ffc24586d07dc52fa1f002fee64ab7d0db69a27dc804e6ad832aaeee37eb13046555408028a2d395bdaf872642b01023be234716620287f90f3d574b1867496348af220327133a3079d02641081d9537a318784c670166cf3da63e2ea41e0e55b1ba33365339c2a9dc3b2777bdf90cb191327d475e6949d5174dabc065792982a65dbd42377c33a8eed9d2efebab3e3c91589d2ecfa1f9b6a41ae529e2de64933280064f584554d4b8906ed2199df37eaa72212942133e18ecf63690a3b685305a0b578440faeed641494547d036f31fe46951624026dfa4f8c7e41d316a550028e7f8097605c95592ed9d7797de05c8472375fe5042a601cf7738fa13609caca3fa310782ccadfab162bf8af6fdf321dc89d528fbcf59d779ec7a4cd10222dbd32d4aa6edb9626da892f3a775fb83d1aa83b906c835c1d0ff10f23ef4b7ae36c1698a0d3d32af557f6381f69d417e81b9fa68c03fdda69268c9e8f503e60a6574943b65fda15e5b3cbfb0a0f535abd812d42b7fe82dd0c5bc01a39c86f9fc0ff497a3d5b26d3526e98dc9cd0640d47fbcfb4a6b4c8e0612049f6c5905574ddc4a5b0a86e6fefd5f8db514a456cbbf1dbf550dabf2691221478b8b540968c5767dc7ba9f20bc7dad311ed94e6f3c355b24ccbb686224ba998dad48b719942b8295c2fa49e90f7fb9dcb260f3d9fcfee1f2479ec92529c722deedeaa7be4349ab9b3611acc85fc92a9658f0b91a74e25631adfcf7c2de00664333bb4e7fdde596960a48ef451425a967f8d3cbbc0ba962eae81e19c1ad2f0ac36701d4e4cac8ee8e26e73be89659de587b4f4f47281aae24df4c58abfd1ab9677105617572ba598c7236b73a4d2d7070c7ad6e4135ffe2e77acedc07358a1936390f1bbb3e827f96d67c8cc2a26b08b8c5354f34991ea63ba1ebcc5dbf47d238a7672d3d94ea0ab73a03e108fbd94d365d2e1ba7bc3fa0293cec503602198d75a454bd83ddb89ff48611df95c141e8f478e2f923062c7bb83319921866c8f2f6161ff41682b5e857a2efadf05d6980fafc97122fdfacddf16ebab78e531ba8c2e711f97de9a98de776e575a13519be4ed3968d53af866fdad617ea1d31dc58e1fd70f5407c5c36acea3a5c31b31b4afae3279317de83d87e5178514f68d1a95c42840fe8a2958aafe7388c273e36cb0616914c04d46bc0e2c82414ab60c3443a9c9770fcc21e31f753252d0b3d31e978521edfa1f906d11024645cb98279d083f5ef3f0446bdd48c184a66661ad54d5a81147576b61bb10f4b80510234bdf63f34d5a589953b1b771cef60bf3cea9fb38abc350c717408e727c01a0ddf555e774191ca12175fadbf495c439e0b38868c555e48ea93d77fa19f6be062ec0aaf33046bd52734f3336c85d8368bef86abecca42d599850dbd439acbca8ac1a4917965abee5054bd5487baac610f509db6dbd1af059faede6bd80226010cc8ebae534c983f16df87b917cf21edb196464e6252ef008675113165bec5ac7068a7abc8a17bed003d170924ac7d02fa29471b873548edd54470b6f4b6f0f43f089f33e04c9c2397d635edb73908c7717268c7546203f41582c1a38cd2ef0100129ceca43543076113ab0dd65e0c659ed773f7d1c1673fcd96cd9f36fa09fa3bed667e1b44b8c1e85a40108c03cf0409c12e55053bbef385ea5c53f91687077901c5924e62427ab414bb9fde109aca3b996389f8b64e3bc6e53667dd0eb15240b681d043752b5a4baae561d66db5e2bbc5d83bb21b613d16ef2282eacacf001b7461df0466b988378286ff7b02687211af56123c533d210070e94c2932293c8fa32e68991e352d00066620d5b7fba3c6bda4b69d452a1009d0536fa12f072c26abb0120884e7702c9d4c6ded75b59c61598cd0ddd87232bb7828905aa7b0f867f4af865b7f167a45ae018dca22e0866aead40805f65cae9dce305a5d846dc9dae6f36b9af90b72d3a34e2974a8c28869d845051b862fac373b3372b1ac86c708ea436acbd90f815ce3f9e9f4eda3cbe78aa7702a6f34561228f8835e0943197866692bf80768cf6ad6ca7451dbcd766c6ac2f0379bb3d2b5fb48336d81ebe8b2c42b55286a5e8384e48b73935987b27edf5d2e4cf1f348a81eeb2ae5fec85b3f6a529064ec3bc63375028dc34e18a7a75142d170593ee174f7a911ce67209ba6c2a686b37445bffdf1f86be8a4c97c6e283782acbbdac4a0f04a9031a43ccf6f32eedc1debc6976dc036b50a42e25a5bcd05e907ff101bb46f954e159c64202324f43daa370475084a81123110ab68f7a674ad89 -MD = 534702c37c6fa8e1bde879ce4d87aa10c4cc8c8a - -Len = 36944 -Msg = b3f197b98441a1ef2bb353f6f7ea1c975d1ba5e6f509facfc533eaf2c24bb0b194ebd3869a844a9a2e97e4942a27e7afaa6ef71014cf3a56560cba726fb90bb931f02d374547b3476fff2561137ea432f9ffccf24d89dff2ea1d1f74d8347bc012696e748d72251c7754e002bcd79a48cf38ec33a71f2fca08d0e1a003a549eec0bc5ee47bede641cdffdb222d1b1217b6801f7c2b797307388cc79dfaf5be6ac253c53016a03edff966df676d3054ca353f2c75df7ff2d002ba9a14c50a205da0946b006773771e84f3b3798300a887d5dedcc5cd1af64eefc022ac6aceb7eee3e918fa744fd825f50d21017a7256761cc3f715fd30c5a88607270ef328cd4612b993c9471aa81dd41befa7576da5c19457450c75aaa8074ff771e167ffa88cb56ba513e8be302daa87e61224dbdf8dc5028d533f71e793d3f8c7cecf3d91e9556916815d21b87efdb8ceebe9a34a05362d9991636cca739973f37d32c9d085791aaebab02d873858166fd9acad2e4e6f3e2f6fe78299d02acebb95988bad87a9e63467e9c8e7824009908577e1d593f89f1895d59d9bd10c73e8bf0a6b70176d35722f0edc1e843ff9fb96512786fa5ab61caa34a4199fc9c842a28e51605f4e6f2ebb29507567dc4e76b5436788ab1ced02570d7e5b61e93790e72f25c684d3fc31b2410c3453a070ca8a538924cfc6ab94436715a940f2279c35f2cfeab1854543bd5ff8a36f11c8bfbc8b75a28ee05798164a504b646e002c35e137140ceab02b848afc0ae4b9bc1cf4f3134a0ff35bd77abf1788f4e429098e03468cbd8ca6b3aeca00b0d920b5abd9924c637b861e1915cc52aa19dd0cfbe960e299edf390a1e427ecde77cc1c3214700637f92208258f7ce9f7fae010c9ee01f485c4a5d4becdaaa8dce647577a4c952a0cb24e81c591d4c5b8c0759d3d44ed6596692cdcd2125a1cf24d19d04b2a0aa12bce92f1bfc3decc3492241b1d942c1b1505100ea55a403168d4c8ed6c56d651dc7476c0dccca1e7b59976f23285c7004abfd7d4fe4e62cd85a5de18a777012467cc8356e45525ff81fcf28b44c0c5fb7cc00b95a795cad992e5e3b8c235940113ff401c9f0573fae1e4214c1bec2ef3f42f33b866d8803ed7bf5d34863a96cf29353678d58592c21d79899e7eb20bd2fb35d8a704bf8ae29c59d6f6bb2b0f78f195ebd34d7c8a3d7de2b4ea36ba637fd7fa81c949f1f2af29dbd56529b307e3b348e996d093645549482a960cab3ee2d0a5b686fc17c08cc56ee3e9977887f8b776b827267227f1c8d2710cc52ea4e3305f0046e7d8fa60ba3a87eacf22969f4445def017c0dbf843a913b22cea9e6a3d4fe571d0ddaa154e6649d0975a3dc0a4e0e5576b25885402f498f20888335f419eef6f80ced792ca1ab104b8c883431d6d55c6e94b37ec4ddc863320af6caa8273a6a9bf528abf768048ecfa137010f815b4a45ad7f0a86c8967dc3d084f3349f791855411ca8499bd95f124e30c107dff8c598674b970a622c257273ae7e3dd51386c09b49fc97cfc207b00e26029f354644d35c89c2c45d0200ba6ee39a088aa23c7a4e31176686372f354b67344a43bc5e82f7ba0c48fba086082cc4f53902adbfcee452973a31a12bfe9074d4ad6dd36923b36cd20cd0902be827b30e53ef8e775af83eea8754a8849877ef721d2613fb323a12c2946e4968d70a4e43cda3dcf98af4469fe281b5df8f5c278b3e0f068b3ad63c4c544744d3512ee7442ac201ccfb531a05b03b41833fd7cd8e647b23afaa2249edd0de0ae1e3002e7ddfbca55818bf29da94d3e4164655420a451ce3cf0c98ec05aea5142b1948745f711630215f72e68ce4fe061f2f6f157d4446df7fdec47342223ef8f54052696773412abf5c28d07b451c3ff4578fc855e69b6f18ad1f7021f00e11f704a87e345adffd988b4b984419a0ea3c5b31cb22908d2b4fd41473037c9507a6e2c513349c45313369457e65f74ead5da6ffae71f69e8c8c004dec854c56326b4732d8f6bc036e2672c1236f5257f1eec733e2c27d321b339e266d15d3d43adace7c2fe93ebcfcd83428f7beaf6f40563888f872990a5ffd2a384543a791797bd4fb988a98b475cf29f79bd282f7213a77695020ee69b33f20ee258d3c1086a4e75b93595e9c5171d0b7605961820ce2005f9a4bc1e2bd800ed28e5105d3eb0c91f6b0e3f4d72876a4d2e5a1cf927c036fc63751c7f7f756606fe03d994e0f09516761a8ffe7633422f4bc4a219ae7152257a7e1653bc928b210abb16b017b31a2284626e46f8a30e77724b10c1de68da46e7c693e00db8d708f714aff70a80c00a3aecc26b206034ee4df84e39df2d382852557970986db2826b178cb2e2dfef9842c275b617f11e5c84d245c9d848d2936134b249853c84560ecb9528c6580f9244ec6d6f05de3289bfe1dbb9f142124fbf6a24b3fdaab54d8a38b3a3df7488c1e77094de12b0da3ca52ef95054a15f2312ffb9f82841ad2f8466cc6954bac2edd458d04b64ee7d3fdec088d726f020d803fc575f2d88d5c4a75ec9c34eb326deb3ac0bfd2620825813a06e9692b4bf363968e82f340793d3982793f9f5e51a5b2b722c3d7ecf5350ecd495d5bd77a3055d4b53b16747502602c9105370da072ee4b41b53948257ee1066e3dcd2c0340d16ae802deccf75838b4d2a19e81a561d8779c08791c1f6fc285d42f2f718da160d9857eaeb2768b3dbbac892842b6df1bcca03209d149840dbc299615406fde7e911c0328dd8937e9b18d2076d97b6712aaecc68df04a584d29ccf6f131205495321a34bf9695dab736f2fc0cae697677a2d03a58018858eb4f3ce6559c45a04f3d1e87e58622d040ac8c905c49e7a99534f9020a7d9a1262ad07d8b51a564e070287713d24c6d4f092a871e8349c6d15e1d5b217dcd5f16dc3ac428203c8ca5732e38528eae8455179e51522e6ee3d5439e4cf02a7e282571398b85f111381aa3ec1483b510dadedd2b0febee96396da9da4cd4d574651a92d5baebeaadd108a969f1ed6efad7b203d9a92fea48306338da4117a7357cbee6173aa03397c0372caeb9d9e2f5e39830b008674b0c307e99a515ffc74bd7d91606f1ecf5576c6fd5c1528f398866590cb912da386aa1857443aed55d3edc33c9aac81958763c784caca6579a3cc8bd40fbb0d2daebeb4170bdf6e09394f593a80ca76e837b9a1938779b792d98718c747ecb955816767a361ad36a8fd789c25a3377329feeed1c41281b3c1c24c98e4f4b496cdb74aaf76e622fb9798eff8988271eaed3589c4710c90dea8c68398b7a69149f8b8bf082bf9ef1167a42c1aedaf1862a484011634d6158c9a7ed274a9de012768fe6aee1d1d501c9ba7a36f9f79895ed252eb337a0f9e622953afc945fb92d39100a4ddd4d0f471a60bec6348824354193aaea8daf989e3c7ed7213168fb4b2f3581363edb54aa519496d925349e4d6cba3d1e2b25466861894dfce961ae56a127d2d0cc22ad15b5808bd796a40dc5b7c16eb7daa80b2cd7de23f784f2db35d70d85824fcb216d8f4924294d8079856ad1c61d62e0f0d2e7a6e179c9c289d0191022b68e7db99b271aea35126feb74cd11ccb98b77fc43d90910e9817ac00faf5832d352e17c87c5196464af19697c28aa08f11d123865f52e37b174c188dae00c3d41639f7219b16e1a1eea27fe84c2c3022edf5caa21833ede386a40ea19f655c967895ea33a324294cc8d41af75e48543d99afa5c60ca608de62b9fedb4375a60af8cc618d092bd5bd45e0e8635d61852581697560813bdcd237e859a93ec4489803380d8c41706f6a026378aade0a3b7151bd99e02a67c25572d9af79f5c3acd424734ebff0a46ed96ac63c3c54a4efb7671683e37cbc71eeafe870fbed165b25e91895a68b3a4c920ba3b3a665b43a5e5dfed3e8ecac33e45baf4e7d991ecc23ad6282ce6594910a51667f6765ca73dc92f10a4eeea9a10ce298889d9e5f8853fe1b96963455c4d8d898effde95a54b8a27787a41747419ee12ecfca415b182d579e319c6c006053fdb585e874e62589090cec86eb078e30d3ec84824693e4165654e45f7106fc225d46f1a58cf09eb4231b9945de6cff59476c3763f29c84a556ea3f5dd7dbe0ba63c783b385fc08d0ad4e2e8f65ea0d7e980858cdf9c76260f5c8a2f62511c692ada1eca1148afc54f3ff0cb215f14127624b795eb0b715cf9f7aafd6dd2b063197706cecad0001b7a3b8c46c633532da22c01964bbee0747d06ac66e74aa381dcdbdb4f4b40d817f1905e5fcd2084b0d45e0a99e7fdecf602533773b6ff1c4bd9ce43567ce062421d060d201e6fd02376847ba5a710bd6bf0a4f42ac33a444a7918e6e945f7c32366654291a1685e0fef64fbc3733e7a5baec28b95f642420524806e138ecf26433574a4b93f5257fca7c733fa33d14c4ca675a3bc37613f0443d080d93faeb128f0fcdca0de77e2700674ca52cf0f5ac83f84e4a56fdd63d03ccec74540dd8c5c01c5914e671d28f5743569d32f41cd56e1b9f85a84ffd5f07943e85e79a4e067ce976cccc38d501259d0b8863baecc7ff4da84e3600fbeec60f68e2cd24ad5cfc13a1521d80f83501d0e5e72dca080c9e0b03346e955454d5bb15fb83419921e4075335590eae93528b7049ff85d10be0e03aa8d0918939ad13a0309855740dbb5126e71d268a94be2935116782ea5e6e49b94c0a7a2cf5b2a5a2327af4d068f87d7707b85cfec1ab469eede455b67c8cb3f97e5ab392219cdd9671b98430dc11e8dde7e9368d929040382ff452c7dec2cb95b06fc26b45a247f76ec2a807cf9e2fc637fe37b99003b27b68262e910da6dcf892a84b1aca99614f9a24b4e7cc03beba5885d505327c29e326e83d9471bf84ac95a2a21338b8b5f9746e5f3359c91234ca0e92e3027ff309dcb90454b3633f1c29dd6c0708a6b29f9dfdfb8ce184c6d01d06f5f58865ca4a0a2707543b3888e1dfb70d48c2d9f3ac67521e570b9d48f6c1fd729f2cf40c4e2fa0db1581b5ee7817ce1a6aefc8d5aa71193c242099151349509d5268713560cdb4e41b2f41cc697290f7eff809e5144b91d976d8fec7d013aeeaa1e383c23c54d1b6c78c92cf10709e3a4a7403ae64478a7ab18d34bd97d176cf2ff6925f3b6595c7cd31ff5307824455fcdc5cae3505319476c5e172f4e336cf3f4a3358e8606f9b7ea80df4d93831ef89995b40e0f545bb391b7b9451c96d7f7226dd4bbde5ddb66e673520eff2d54b7343a622f2a825537ae6697e390499344b44f6a446664e8d0ee81b63d642ad1e4c63c3a1048e5f01bebf41bd351538a22d0d15fefc525093f2b3073a06c837bc77621a678128612a671e8acdc08bca2db9f7c1c85a4a827f9c40bf100bd3f3ca86d730d2e2f6ca42168cab1c55d8dc5b648d707cdaaf32847e2979924ff66fbced3b9d7fb489f8fd4f8239457f7cddafaf36b89918010f671ad5ed1d6db01a082cf7c6ba70528b9074779bc5a7f84c9f0cabe0b97cd0777bf4ce702dcf817120c894333fa0d0e0c02805791969cba7ae0f25af3a83ade9579e8ba95ff00b03bb42a9696bc09596f0cc9427bd2f778d41196c7aa8c6f9f36e6a860f00798d402c2dafdfcb4a012c96f4ac4e2d838c5c1cddc8b990b1352444fb5607dbc6a8c4f7dc001cdab7b4004712d642e6e06aa295aec3027edcefda6fc3642a3e61edf0a2e0529726942eb075b97abc75d092ef201ef3ebbf94aaa4435548fc94c5cd61c1dd0fe51b69c1bba75b21f166cea59050a0d3bbff82c60064237ce59b7cb786b924a07d35a31d90506a64a816551334abd6db19ab31f28d46a0687baef13cde0d59bcc601caa2cd0589bb4710ee5c5a9623827b4efc90996f7ea4254bcdddd632dead561c5af1d03b1b8e34f314f160b4095267577d20b342f0a888fe6d1b1dde45fab3c1de7b3865a25618194372e56a0ad354512e336965b8fe0d3349650344024d55becfbf6419b0bb67100431674caa8dc8c87a493a5c2a0d3886fd5c2528a5edb24fa92ee1dbb9268853c1ed54b06ada3b29fbc2947ae66e8165f35101d093846010f55a40004e10127126e73c59ce4131f22d400656508a7e5cc5f417f07d89c59f2ec1fd4bc2109be48dcf9c9d376b33bd89321e830af985d7efa5d5fca6668946cfe677f2c7906b2a70f6e3ef58b0b6f88a293b6578344e73caf6da49b0b2f19453385eb9c12826af7b0da0e484aa421fca85eb922ab32e9d0267738c2ee7b52453580fe531304500066462015dc05bbfa4e8bd7d950eacd000686028739d3a633a960a29ba515cb89dab95ca369b6a34b3c21fac399f5f995f79fea3211c07dd93a2ebebaf03c435cb33baa3c184043b719280929afdad757a3ccd80aa0c940fd8ef139f91b01203f9ad4f226112a01058da9ec53b921cd0daf14b4580e7655684db1fda04feccbfb378d1caa7dfc47ff42aa8b89e0534581c6806664834f25e22076f1f7b386aa -MD = cdd84a87e1457601d899b2abbe2e0974784491b7 - -Len = 37736 -Msg = 1600a349990df42aba9fa03f70deff0f75ae35c1a882b48caf75026ee097bd216284dc4b8f3c37f59d2e4a3e7e96355004090894494e3e224e70877ce211cb7bc6016b890e10ca11ca200c34e67e1dbe4f72f55857141bff5b6268b4a3900e75899fd96dde31b468899c6e89713dbe3f9e0f85759b7b54091e722e80eaba8ff8f585ac5dc648fde022caf9a5e77c21bc38083f53da2cf02adec96047813755ea50dc6fc390fdae63dcd334f110e24c1e6686ac5adfcff749e58e86702eb06835e3cba70602f7cdd801dfa7d3b418494b70b152f3710b724d79ea2965bacdd1bff67bde8ee5df6526d715dbb49ac5202d9eb0bb8457886820e305d08ded359772d1149bc3005c7b37a79e57fd8b92d7ab37ac6f775aefe1a96b0603508e91c234bbbd670d1d1719f2b8a2a3144f2678ac85ccf43242e8e5d058164a1667885beffe9ec9d402b7463f54484863ae2b0a1ace39d41fd71a7d7df45c2e473ec3688ae0e0498078e50b06c1b8cd50704696dc5b1a97a4e02eb0988501364bdce9f4edaaab6f7947496f2f481bba455c2123da7498c32b27cb8709542ceb8b09a30400a326c427378a7aa3319998a93b64b9fc61dbe21b729a08b8a906d36d8c99a2ab157acff310513448c459eee4d5b7602a690a7bdc8a433d8eccb7785a2f72d5d646ce18439945a6074984445ef2c0214cd54d17d6376d2e71046662bbb8d7a6697f4b28809b0fd7c90741237e5a2a034aedce3d7140c0e24a9a3b17f6f06f1b4c08198613df56cf7447b911aed49b0f0cf9b275156fe66102d65f21759fe33f67295fba622ac397f1511398562abb4c7a4124482a8a84b37f00fa089e8dda17a22a464dd747fe36296d7840dc2234c27d0d4a3c185a45e1ab603352db81fdade652f5c6d9fcaeb403e31090a985ab79fba44cdb47a7cef16d3e33899345f40819eb94adcf137b1a66fa0210251acb7add4f53ad1f39caeeace122342d9f6630253b4d8b23520f6f3cfb7748b8ab39cc0c56873909d7dfdd529227dc1358fb2ef08b46e73c820fbb6c2e96c1cbfea0776f010f076b4bb5c846996a08ac385c096422a749826b2606dedb8802c4dda684ed97139fae5bf5b6703e1440600631c9684a99395dd4fa597a4a74930d0ef3fa7062bd8a3bd047b0b8c94d0d978c2177e3494440358633bb28c383fd0c5930e1dfa8334f797152bd06813cf5b990d519bf68cfe5724a7a35d08dddc72b88054121b29d76cf08bfe542af0a822edbf5bae3ef62b17ce677ce5af1a979d161192320c82487a75b3530549bde3c5f35285f3726272bbc22d18eae37109c65ae158ec332f00b68345da7248de1aab2651612a35443db98c8307db4a739b75135a08bf237288a7959df519bcd3b54903568da0fc3e149799e3ea455884c52fcbf63219520f48a449262379fa213c2626bc6c063b927fec86ea00a772473f5ce13065895357d9530a98e5f1956917d8ed0d7ca877f3d81ebfe01b703c1d4292ffb3038d8beeb32a5640dd3f22fdf0c7e2c4402635d4c5a4c1607b4e2a89775873d89ca470366ea0b8d849b107622f79847b470e09a7c1251805a08fa21e5623ea2ba15ca4c1543cbea9ebd5d7285c746e8d01be480f4306403a3bb3573e677bcf26b214ae020c74b440143c06d2d03efd9400b5855dd3cec668ad67ae8c13c6af543f7ad08b0fef462553420ad4533fae0ab4825625ebe5172b660b0c69f39ae72eb9edd0ced6f2e0e4399677bf3dfd1c6badb31efa03ffaefd061c156a7f7f1330b1ec034fea2620e72797c1f5f90db5214cb6644cb4751a57fe294e002fd9cfe4a8040c70b1ff62b8cdc47e1b3cd804e6120aba8065cbd5b6ce911acd7d3159c50cb440f3e6f542d36cbb009141f28804be2e7657908a6db3f8120014f02c6d5c607b352bd19e2dc1a4c9fdeac0d3bb2781a04c14dd274eb9fafa92992111570543d77d9b0a50a00e06afca9a31f21aa90d0e905aa429054347d946ac7886c37a17477ec409b3360302aafb221dd43313c0a7e78b7e160dda7f2c90d16f032f056b49bd39484c4c5b096a0414dd0070e24d2ab649d364d50a0163159a8cfcf641a05cbd5d6e827f70bb5b89e4f7fd60bef2f580f83cac074c6f2b298a5b0ab5b9670ef3b2b4dc3bee78fdd11507219ee452a6dc292231f10c28d351035182e9d72fcef4ebd3d00e2ed2df8e178323680d0c9d2c5f2cbd3ed3bf0a30b7e91c0f155b2b353b43f462ac496f257ee46978935167060ca4a45d3da21e2cfaba2c920e798249538dcfd5f14d2b1bbdb36a2d11f192ddb4226dc89472adca4e2d4b1f3d1b9285b6f9a8d4987ea1f55668bc11f34d9f27d84e9ffd9291277d44bade02fbb1aa8ec84045fb0c3e5236cb8cc5b3c1c5ea890b51a188929e29da610b7be9f4cc58d919d9fd95c70cba449f881d7f180b0355a00428e62eea13561567ab40a2dc1bd92e3f5641537a58c354f339f0408d883248be8c92c2157274e487d2837061622377d8d69a2c07ac276e5691a3d5bdd78357e9431af690d5bb50b4883ef7ecda3c893ef4eccb2522e54e1abb06622c7fed702cf2eb26fcab8deca632efa3dec278c4fa47d5bb535b8196b81c945049efc503f1f28ffda962810ab578f20ec7e98ccd7335c17732c480bad74cda4aa6b59e95c0f875c53799394d6aa10293388ddd0532455c7913ec674cc0b2449bb36ffea8124b392827cdfb374e718dcb914dee0ec00ce35ba741a9af3cf37fce005d59bd8e814690ea6f5b2ad930e0227298344c94d312794d42cc648466c87c1e2c34386e212a8a000bddca8385c6324d0b4431496e566c769e43ff3fa2cb105d4b12cb69a1619df901f788e5d69c759105926f26052bafc382b4f1d73e04155e4879c8e998682746004cd868b9df66df15a368d35e0eadb4be73cee37ee0058182ddc3666ccac06785224b94960b7097b9fb80d9cf7c00ba9024f8dd0c0b6b77a8c34d7894e5f3edef3c54f1f1ad4d5b710f79a1eff02355a62d023c6bc2a19128aeb998b7662c49ccdf86f95331378ac963a5a4260790067f107d79f4c2627e6104ba3f3ab7f3fbaca054134133d9b6217c8789082ed15d7953bd2e5d7708901079a1e49547c573ed133ee83231ae5e27cea1a90ce261bb238b63b1fc5d1e66855213116db22b532c9cc9e0bc971ff33aee869cbaaebbb00c1be3bd67d11e625e42805e0a739019d9c1678526e0b905d940a8cc87f059dca189cfa9169f8323e9af7c1322089e288315aa5e27bb141691598ab0fb63d681825989fd8f04e72be61d58e91aed901fa70df4d435629ba5e1bd9f029b559c4f0d0f953337ada4daa200c9487b9f306fb41ef96fb693ba2448d16819de6215b5c01093d2b6f656c0cbfe2fa9ba99d98938cd0ab941bb1a224529786f3b05fd263a00e864738b777eb25a0e956e6a05fcb39cbb296d352610554a428b47ad9d40d955155103b9815503c8d883ed8c405aa3028d487fbe588ef7a858e67ae580763c81ad30de1d0ee42ebf300dde8d02f395a2f38f1fa33beeaac81e294b3a4136c21b127c69226abc91a1878bb7c8e877f9d28075b3804acffd2e149c3f185a131895d7bc3b764f4edb145195efec4b584e25a684e1d1ff935d5eeed7dd0c359b8e667f48db65070b799c20b50d43b6150120e8451114e4e959bedf649b825e20b2217bcabf9b3c82eb8d7751968bb32ec138c82ec7c5753250d298cb01175e53223b5fba5e654a45bf7cc7f3f200cd05fcf1c8ba7c603afef13e9d53943790933d389d804e7fdaa443ee8534c66f5e4b12c06c70b571a0bfb9674fc6cb6faf71818db7c4e637485f3767516c8a13f16ea14915d9f97640e4f7c1327d1d2bf56e9dcf20f0ec282db7085b9f33938b20d136e0676ebefa961f5af0e7ff10092cfac0617b8c96bef55c155fd10299516723422ad3978c5b0abf515ad2b53a6390a6b7e929f09c8839af0cd88951f1f33ec5317cecfcd824295559838537f2e7dae2d2cabed5540065305d4a4aba43ed1247a37b15f738f27c71f1ff621fefe2663fbf8aaca363b3f270654977a3f5ab7c1b0699e12f05227e85b9130bb5780fcd3dccad65d3321f7bffd34aa2978dbae6cfe95dc10ce3509a00fd82e49121ac7a4d88a78cfd45bf6c2f15c25e0d72a7ecd6aa3b480949f979945db38f4b8364e7ef720d847a14f04d9ebb350c9e5adef8bff7c6e8acbf89778048296e3d03b5a0a42743eee2366e9acf223720929cdc84fc2065258faa7d2e855b58f40e291b3efc06ef2ece1086ce20e94d5cb2bf2d3c0bd2aa70fa916108f3e5c6c3076a021d679f73b68639e572347ecbf357485d687f7d1b7da61ac1915ca5f76dd15cf6c6776f5638a328e7019a614796f8bec9a4b78e1c8dfa8d1b423fea6f26f46885b49be52b07cd542806a32f44ba2f891e7b54944234609edab61e41a2b0e9233b72559f46b63d4204ebef4747cf644da856d71e010380968c47683a168e0803648a250c5db6ab892a4bef27d5692f6313b1af89fd6dd32abc80be324f01098fad669aaab4ab608ff481136f51f9f96fdd264e767bf5c0b1c7ec70d8c0cc462e729216f90fe724ccf0360c8c62044ada613f5452211dd1c24b05308bf042567660873a85b40c40d699d53aed6a1aac294c3721ab7158aee2c2456dca7205a2edd3d075cf458d4d137de91f20feaf85d2ead866e0e1389089aa379922ba88b3fb58e8493438ecb23a08ec39c57425706de98d74a0f5302f2d7f5643132e3e22357c493552f2ad1880c7490b298f3ef460c4b0db5a21c1e354ce2bec1a61a846129a7dbaba2730d8ae359a13eb943e7a41e8fd1b8afb8045860322f4b6e959c8195fe059c84b2a8b08e059d47a27b68a97d2ccb5a1e6ddee37aac61d5729c500c0293b831bb30ca8273402dd63be299db91eaa2a3d784d15f041af96a9a77c889d82c9d7130329989fbd2f9f26cc2a3c5c291fe9bc24407536542a20fce6d2d807e925b64cb03404c8e82a8a31d61adec79e8894bc8f7a84705ec02cef6c7a7795e8d9b1275eae5549519e3f13609e0da1cb8e8bacfe3dbc34ce2c1aeface5dfddfe40584142eb127766051e59f00641615c9c6f0c052c950a2eb88b8c2c77893696140c19118cb4f9b1c9b86408e6028cae3c9f6848a9a756fcefff236fd1fc464caf5d1d5f05b546a1868dd01fdfc99a5ce99d301d475bb1b54cd663fb77b1738e8cbbdc7fe8bbc4d1b61f0cb9362ef0c51df8f217782a90e459a1cc33cb4144e836b8c4e898111abec2ec9849ab7b569364333cbbdebc7b069101aabd5f1430c637c4654db65daec5476701658267023436cc6e7ecd59d6a87d56ae0ca5a2ddb4fa7f4c03a60a0771be1eb6716d4aaa24103505c4d6ab4a2699114496319592410949c7aef9aeab6091944611becea4ef7afda1428d293c1d5ed1ecde8534f4d6eea4969413a4010e5c383ebb194b98f2f196af6c535c23094909256a03398c0315200777a682aed798aaeec1ef49ecdafe90bea6bbaca566e2477cbd4debbe32173cb8be14e31b58b13cf4eab36217040c6c2d86389329a2a4ed613cc7f402006f6b18dbd11dcd1e409edf8a07fcae0aa5899a8f6cb826692b8b618d03cb0dea782bb6657dcb4a74c1211d245fa2285b548974269a843216c0a1fc1283d9284cdc0effcf7d540a08bd642c4e1ccb0c8293ec48f0747fc3281eb1af61bab6e7c40575738e424082468ff88b6be20fc0fcde1297517d135039904ad9ff2aecd2dc8f0fb0268f2949cac32eb90221c8fc36adacddde06d76fb7cfde3a5f66d35ff2d33e143c9676d6e1f19743a56e8f04dc8d0b9b0ab444882f17dc1ee6c11315a36c713e150aa1a04895c2a9ca2ada713af6cf3d4c07e3200c12c51639fc146a6ad5599c645e423c5b2a3169f4d933d7fe75685336742bdddb4b49aecd6a6fe4b588479d8f03c111862953e29a1c139f8373576b4e8b86f8292baa47258e8e0b1fffdbd0198db6a6760daac23e46023e569b2cf3e8a09d35523e978db6eae74416c686d2887e8b919751b68765f9784b0437497bb975d6ebf2fe61d1160204361666c8f35038c8396690078085a8fe3c08e24d61255dbca297d5c9bfa7668d47ab4b12d0f55ef52450430e6c31d6fc87d1169952b0dac6ef9d6f1fb80f8abaff51fe04ea0c538ad900d54ba8eef60bb4f96ecdbee06f7e299024d448a2d145d386fa1fbcf9a901dde4e13fa501a8a459ee354b0438ae5af6fc9197eff5ec865ad6c9b3b841e1e29988d16b0f3e414edd2c24a1c12df9e5ce5f3fdb1c9d3f24fbbdd7716a7970b59249304e35e96273c53f87628434e49716147a0e6cfd4b8a4c98cdc94214e7e35eb28869c7977eab98a507fdbbe1f0f764d8eab25f9a942eb413f73bed88ba046551344e22cd186ecdd910e3e6b9a17f41090c5742f99b9ac8abfe49bb5969813cb1ee5bd5fea225db582ca5732078a73121597dd59ed45700cd4d633a0b68f24b30f1235fa0ce7957bed5c30fcad8f79bbe5c9675fee0dbd2f45f18f8234ad0276af7253e57dfd1b95986bd1afd54f9073c7021a29e13a1e5bdcdeb6415819347dc6ae1e09858b776d4ba04035c7f13fa285eaffa011f318f85f45b0c76afc422f1c6d9f4c6eb93269d0a38774cb9e0fb0e5 -MD = b51232c68cd82ce9ffb4bc1fea0ea9f71354314e - -Len = 38528 -Msg = a489cc5f00c1835ddaf2f0586710850752abe68d001f4e4e180b2f0043041805308adcf8dc3af1861046167f2b23382c218197e4c48025da42212e39effa3e73452f40d5299de360705842d4a258c30dfe6f3f92be7e646c9ce9583494489f70ec603f20725122930510bb7f5618ed51f05d28c27682d5ab2c4bf41ab95503a52c0522fe3cbe76c8d457cba9cfcc7da10033989a75f23e40fc304912e78932b90d063299114ca6a7e713b87a93da3ca434d9d842423868d2147ea045a54cf355974bb41978637cd7452ecb192cacf203963830e365ba1b0a7a1f41db7b061021d3bcf3a6fa6bbe01f68e4caf22a866652e36e7a567e21e9038f974fbf11f4fc4c84236661ecc35cc031d8363fb38627302bc47afcf173b0b56f681cd90ff79e77ec3c4846ceea9e173c1b75e41c3acd51db3962a25c03823dafdaf7adf0f5631fe28e6266c3ae2e74e6432c77bb10d3284011d3df247de81cef5482a67b5ad4b4f5ae475a716a7879ced3ac732694d3241902411bc13f5cd39c89204ae5a47dc79400698a4ebc16966441886ed55347e5a46f3cd0e8c45ae245dd6313e67ed8d85c194b7eb22f934b451142b34dc8abeda0dd19a6d1a95cd969c5bd99f4265067ac7d5fc052115908cfc75df8f661699c6cc08a06325afd2976d6b22575577ee6039128d7952dd27f82d85c9875ba1b8286bde06771559642fb84c37f007edee40fe9392cf1c1b9effcc8a12a324f3c307d19cf532525c2b6765473ef2bf8ead2100a03490e695a0a9c1cde16c27d4616ce889941a4480d1465ca460e3e721d40b26819a431a14d3fff4965f69cd0c3a5e97ef0cb9548cfbd586abc44de66f0a06587dee701f60df084d2db3227e62f7e5c6148497e84a531bc9a493b72440f81b7edd559f5d416dcdb5d9071fa3a040095d41253a6a8081200ed6f4aa095b455181eaf9593c7f255412e380e9a28cbcd345be172c40f72dec3e8a10adfd8a9ab147e9022524e1aea74e934807e5ef144a64d381f5d477fe883f080e4868939f41b925988c7d31b1ce4f318701d290f077a3c88b1b8cc89cfbfb981703b23ffb0bbfe5e115af35d5cfff056460d339f660eae45f28d2b1b04d58825367435657174270084822b6c3b4445708aa4fb0d10f227122a40dfbe286400de9fb83a05a6b280f33ad3e7b2285086e9b6aaebe278c31b5ff15a46ed9af9a820247dbe5ad115b0a8bcd6c4e9b4832934425572ba1dd01f91c0501d23ed04e29c5d4b1ecf711c1a9372f12f5d607aa0e2b65b4bfe60c7984a1fb8befb8ef434a5b296e7ee17144345f5b9a397ac9582779b12c429f2180a0b780aa8df016632debcf7b63133bcbf22dda6ae22f9724265692277b73220093861bc6738d4c951a9e4c3e6334773d2cc733ecb89f78f652e98f0d330b19e0a63554476a389ac1589c2a2145ec2b842a55ee86837074b6f45b3047320e0d0821ecb3963a9906cf300cf08bd3e56187340094a20a4a934c54d3fd3b4025075f4cd5c119ab579ba8ea1627e4d3c4202e92efaca716d6dea0ba7a7f5225f80ecf6e150539841b5e32cee456930e3471618b4cbefd6fbb5c9a6e783df4a82e2a40d1d7075e8f8c5956239b05024cdb5a08683c520cdda21523b7f4bf8a936f6398bb4150f1925393fd3366bd985561e60b72e9f13b28331221df168e7aac65c2c0757b67585617140d446b04bdf06f1a52ee7b22f417155a7e2c08312ebcb64ea047aed4fda381e5709fd265d9e7ad00c6271a6e9f73f1f520e7ef300c8a0a10207802204641390d0c8cc4655400c29f4d64ec5ca2046eecf157f6147ee00a0e29529ed29df7e694cb52698e970457ffd0ec1c7466923546d7c64264eb845d52a11bab72698e3083933be86708ba13293808d03e53e5ed0bbc7afea8bb3face4721c508912cfc1e14e8d697810ec9f246b003143d2c43f4487bc506955d99fca829db69e007f3eb6e391164a1860a2f8531c660a49f9d3f820d4602d231add0ebbe604399a69520a3a8f156486dfc5aed7a4971b214a502f6f0a577f8cca0fb8033e63e24a54a3e63bcf8e4ec331b04ddedfeeffc3805ff15ba65de4f8b0dcce44effb227807d951ce98aa91381e0add5216903d9563a747ceef99e6cf95ed5a653ff3808a4b9d54db3490b44c6e7b671a91a85d01bad138b02e340c7a41e9634e777485e9e897f64ae96a3f66e8adf11e985ce86e4f84cde7ac56de5f7c79f2e7dea5b7fda66e3f03005dbbf05645864673d46544e8690d5cae25e5e70e450e18beafa12e4dca37eec093af517eee2b7a69395cea4e2700f77fcca87abef4bfc95db9c8e5a455e7f47334a3f1284eeaa2c3b355ca4967aea16671b081552f0de205ecb68874b456fb5f671f381e0dcaa6ca69d94ba0d12040aa3d83629c9d014bfc70f28185928cecce55ac8e27d4d46ec3846fd51d0c5dbd9457ab8758e7a2ec8a6c04369f9592b00626d15b0a4b0ee2f92ba0d086c16d016ce7b05654b4f9adf90875118a656f2d50011707901982ebb387f3a4a49759f37a17183957ad0c778f6ecb780dab2b4df30e05fa81e6386f38c0f0ba3f37287a050d6d97287ae53096c391d5f20fcff73977239ca55c3657d1fd1f781f48e28057f136d890c28cc254324c8fff3862136861f956c321868cc66609470b7390ecb6ecfc63572d071312e0860efdcfec88c9f6108ea5dd30f55f253590cc6038a66b2646a24565600d17f8c6bab37b7640a45eefad11393a79e45f2bb92ab6e595bdc69cfc210f9f97ada095fbebe5062241c11e1cd0dcae029c3f742ced1e9ca3f6f486d9b5d6ca981a007a396bb5a716e7462642aa709377d0ea974fdd3f67b75dda8da1c75febfaa742fddcfc925e04df158e86669af2bfc88b1c8cc2c24db9399d38bd205509a49c8ba64c662435d47257de52ce04d2c4cc488c4a634e5792d3681093885e2d7e4106fef17114336ee5349f0da8563b6d24496ef0898c8b2873619c8cc7225e70ddd88c34e50a60bb83d3581ebd3736a217b74ae8fc23f36460b06410a44ba462ba2cd87b89adc5a1935d91efd550c94beebaa99984bc972ee47ef088e87e073c1e286b2f26a669095cf9d2e7b849ff51f279116be9ff7d6f45f3c95a5b6590e652f4ccb9849c55dc27d0a46e2dc9dd9a681d0dc6f293af0dcc3676f0c5a846489eb9837f6b388f003c0a8eecfd786d0f9bcd2212692135f2c1707fb1eeef324b499f19eba322215fe3ce19c9f000b698d2b2dab7145015046cc86d049ee15ad59dcd1564f30112e06444cb6ece06c01e54f4bc1dbbc9592d1467c6539c26c8cfe06cff51257e6b6a06952f415f3594876aba50ad2834095403741505b16784225ba3601cff4033e713e9caab6b3239bd5c2c1fcd22382b617f18df82a54c94b4569bbf2c4af0723ed1672615b9a8b7a67274b0e6707dc93bd17bae31407c026f197ba4e9cd3531578938cae5123d172cf4b78b61dbaceacc41c4097c49a0d63aeb6c97bb52b8771a82833e853e996036292039a42b6d97fb161c79ca8a5f16fc1696210a9f204c6f06710b5b05659aab5ad441192867d7b09aaa8584c962cc9fe020c93e7e16b83e5b2ab8d12f49cd75cffe2b279943b2d31397b510cf50ff0a923318bfb442c46fcad5cd4d83ec027bd0c4803548a8304dca0a91d764d2b82573f695f60c4b77ea9b9bd239caf741a5a54ec7adfb3f5a04072ca2414f90fed8cd92c8494ddada9716a350fccc1190db95c588f67bb037e112246fb75a31d90be62e39213e96f35e8316cffe51e3f905e9514c7890a2cfcc321b809f4b5e51a608f371e7a928cc28291bd5a72115830bea19999b01bd2baeb0395e62ebbe6f917909f70154376ddb51dbec5f034e36d5dd46fac798aa526dd4a5906902fa3ab5819753d9076cdc61437d9b8ec1361b4c0dfff4641b114cf3e6889e1b58b9bbf86ac50ed58c6f23a0472a6b9c21763956c16d11da539922262e0911dfb4a4f8437abdaf5faae74a82a50ae2f1ecb699dc40b8d89108ebdbf0f451701fe062fb7ffba4bede287c57eea4448af5e99d41c7d307d1f202af7f387f874342a29ccc9233a5c3bacfd754cb8d01eb11e2d43bfdc2828563088c17e618d413b0c3fa71666be5475a67a04803a8688bab9d038f6855537b4de42aaae1076066d00b23f4e1ea8fd228b87e3c7d3da2f42de4d143efd49f3b195c3240139452c70c41c05cedfac9ea8b891a372194d6aefd7de6617986914e2d394ce16307d3bbcb2f78b271e1bb19eba31c41d7f52d3f8530ebf0f0b44e3bf3421f96b9a70acc769bf4fd54e88fe6b1cf2b6287a7cf312bc788f93ba6018ad1415466fdbd2081734edc4580576ad943d3efa319f3e30c5908648342a4d0c431fc925a17913c622b10d793dc76767b0a77120b7521915676bd2896edf6e3707a3d8279f06b87f806a88dee508cdb536e8539a384790399eaac7b3a24e3631614cacccb6e9329ca6de0a75ec4e3c1ead8c30e722c425e5c1c9e0678cfb4783f676b17587a504961c67ecdeb20c14fc6aefb398056c6cd28765a7157d6b24972dbea0b29fdec0f437a4ba69e4c6fad7159f362d5eb4b76845faa63e02122ff37d80e5145ddada4faf20fdb7e313504734274307ad11a81f83f54841a984fc116c69e91b404dc300e95921393b55a7c52d0454b76f27b170c7f217d0d2480b8980d63727f58c0da05ca9bf7e6c1283c986a305cd134b5604985d9f6c1abfc0c4415259dadc3a3cb69fbf42f7e3ee56dcc7afb0b9381128336ba44963f160ce4a246abba462ccb2bc18f63626412da3677676fffc5c0d8a85c8629068e4ef8683b09bf70537a812196eeb1389e274fc0209954e16fd950f9415252eeb63a08c296c42767da970dd56f80a65b36638c324f78725897b3c29b6f8485f4c0c184173ce1ac48e66ab770d4ac097033b0d8b58d6c900d473876b96e868bc3b3cdb392b3c616bb7cdbc71a4ddda4229ef57d7160dd78a7864fb379c4be2c019745de5885dd2d67a6d284fa63783d167e1ac18d5333f0cf5de0c303fb962f5774104d94398cb9f56b3738399de69df7db06ed32ebd6c12dd2d4ec809b745e6c5318486c583d810cd4f229fe848f8c6bbea34887b22eb368f01177182ac27fe93b44170869574e55e7ec9f729edbd11a2ed81cb52fa48d29bc80acf232e75b75357c0191f442e878ae0be4bd763336ae338dafe3ea9e19174009d2373a4bbab948a84f2f8265171c31383f0691fd81ccd5aa4b3a6c851ddb8395320ecb56645c7cb14a099a2aa3e9775cf77579a27b1e1d1836e23cc2621c8d0a15a06c702007d97d3748c4f85389885d5534b58bec4c12bdb802e2bbb0836752c115a501b76268f561138838f0a16c25a168cd1f9cfebc821bc2e7daceb818537f94fe71f21430010f936f5042dc2b9a233c49c552db244fa54bd2868662a8f79645002897c6398a88f000a911dfcea622d6b2e7d88b510da0c52b269e2920245051328f6e1f8c761551c4ab25555d30e85e90ecf4b74ba252587b24dfb787c4f3e01c0c41c830affede41be46e4de1fbbfd693c6f071bf8042a48e711b1e5bec8194708d6682d1b8bc1014b3b345b5de4dac73f1022c8f6fd661dd7fcc242fa17253aecf6a88ca4041f8cb8cdeedbd1aa1f315da1b15a8387327f5c6790a760282c7d1e69305431b023686fc4ba676357f130fee85bda89e8b6f8de1cc31bd842559908f7a78da9d8f21fd6e83f06fb327a4b8aafc94fef691c0fc5e104a74aaec8151068b640f6c4b739570026c08182e20a69bca2c19d52894d797ffb529eb5ae79a0830474ffbc983c59d6169ddd9051f503d78f397aeb273862be4f24bc9d2f4e1f113a31ac08bdb24430b8a6f8a4ee95c0ca38bd707b1e5ae965a8258cae721bf5daff7fe5ef4f227fd7b4e2b805e171095c4458664c963b743eb05ef732a06889a6fc6792ba76157493b15a06fd531144545c0f45a4b6616d0f0cd6e36fe0be453dd8f09bb259128a2b5714cbd26cfedb7b27ecf3cca6563aa167953aae5ba390673c23e81c21a12969501aedcd53bf34994ef6590c8fa245bc67a4e23738a2d2ebd0066243f54ab9134174563631dcb97678355fab99cbf427b40ac552a04074923ba4ef6efe96a2f2d528ec552dded0d94eb2eef3eb5bb1acf7cfc947bb07dc24260278e4640c4dceb2409971704ce38b7774ec2aaedae311d8fcd85db07e7369382ae6ee4e35206f80c343d421ae59559c83439909cef11ffe98d9dea82da1281a231fd4e497849ce8bad4c4698d9afd65e8d98825c1459e12abb310ca9dcf2b73f50dde50bce21f912c338a706f0e4b79aa983f293a4656bb3e503c3f556338eca99754b72ca0be2521486e5ddf1d0981d166053ec25c0fa25797a92eddc7182d45a47d446d284249a2fbb758622ffd24662d248ce0ef906f0170a1c0be6193ddd41ea21c09e072a7b534af8b82acf00b70d4e23a1c67a2c941c36a1d7f9b70a45bec0b6a883218e765db9c1cc6fcabdef7438871fe2d0d5821784d6ca8dc792ce4f600547085fab1b7d8c733b687f34404625d580fa799c5a87892d6c28b741a7624c9024b40e2abb51378f9dbb593e59d19ab18d63e0db8dea9818254122a191a5ead9da0cd96806675f795bcef516acd50b8d8db5a33d8ccf46298e6d863cfd78cf54df893ded6d2e48b30e29bf77b99efcec1a764d1ce79417c420045e6e4b596ea39dafa845602497df2d3234bbf0bde33fbc1c2b041ee7918a62bc17d01bc64d18ace6a4ea7fd8d150219ed16df -MD = adf2ebb0c337c89334fe8580b53dae70b25d00a7 - -Len = 39320 -Msg = e0221d19cf617ed827d8d8cb8d2c8ed81b9b3354a832f1d14a402b371a0a611737c0543b0eb06b82d8ba56eb6304f1ef16ef6b143049a7bf50c4e2493aa69756d8c39f627fa89d9d741a99f9afbfeb81de1a5becadbd867245b984de125ac7e5ca1146b6abb2dbd204dfea1ef6c444367c064b05a9f556933109571d2b8cbb6b1594915e1934efc98ef39181c27dc4b8f7998286ab5bdfc91d9ba42f0ca63991c232c88351989f291d3dd64c9a5132ac57bd4a983c56e8bd1057b23c3d0e0affd8d5324cdc44b49ab6a501a407a858bda559e963e34e3b161225cb6b472ef65c5f6418e241a2f6c6631359b390ebfc91e854a80e28ab9e7d2bed35e4b16cc45060c7c26c08182c522b6f27a1bd80e7d02898cfc293d6da9a649739d003323e85e1e67813ba1020e917a1b39616d0e1236d0ca6a6ad35b714c40b1f57c6e72aa0eda982ffdef198312d9245b92443b232c09875e3fd31fc9453322fa081f2514c89f82757fc235dd2772825326e4221a4282483a00b3373c11af2b1d4bcbd7b2fbfbbb1449c0e3775fd4c9b2a7c33f721ae98190660a1e2442034ec1a00af6ff196da66ed471aedc2c6e7eec9d77ffc5359dc7f3d83e412c46ee1299bd330f73b173d8f7b84af4960dadf6736068ff8df31d9fd6cfc65cbea0adfb07ec0a8d9b548cc7315dc3511f8411e4e9a91cab3703e75dbbb548bd45efe18c9ec4c7fde0633705ce4d6140e31038aeb1c0197f4ac8999605312bdf7c75272bc0d011eced6e00f900ffab408b4290d85e5dd60853b192ed55cbe65facd0cd7d00866eb71cf559258bfd07dc728bb8e651cad8c2cc6f61a82fde1eaa619362e4e06034f8f979ce2fc1ce1d81236bff4d4eafa83b2f52947af5f02b4c353d75f7e2e61b3efd6bde5c44db42bb2863f2918774aacdf6fb99ba4aaa92b1923f851a8a9077d5a35be85f87bd1df70bf421479ea28717addae00a8055eb76f2fa0ee149e7d17985ba9a9dfcdc15d1289d19d416b19394de6115d0598aac08f22d71d0a364ce771f28539c26c0b0c608ef3acb624a76d1e33e999018c14ae3fa2a5c6d199fb57ad9f5b1ce97f37532473b029223a5973b66b3e9ee50925e9485713d1b2ee12cd130c323c9c2fce9c24e310fccbd8b7b4dd371853f93663d972eb2827f55d1ab36ce1128023a4574e29841c0efa244a985a3f80a0843c58e68403edaee2109a7080c504d0c5055ad0fbfedb45f6469988f72a7d6dd0438c79484a684fc02c1a6c17610e14cc7a5f8c62fa568a09672dea7aa118a2237286f88465a3f3d9dc220ff95d3b347e2defe9262093c679af8c27ac4b5828c6f1cecd01ffa68073463bc1ed6090192443914f0e179cdf8f4540a855d145e501e9ec5e87be77e0d792eceabd1217a905e7ce26e48879bf9352d1d43ddae7c21b826815de4a20f94de9bef22f1dd7cd6b3f2dd76e1a304ccdfdc5122b0f47a75ee3cb59cd4ca9b51c7338410c26d86e9c7336c87576cb70846fa6cce9176c7d10359d911d6c18fa8e57e23f1bd82372e1ac7162c043511102cffb693d9c5e2a7a9f6427965177b2e9be445526d8bfc38212670d192acb198d464d51f0432698e44aaa8200a4cdc476cfe7e9f3d1b447c7cc9f3246d3406f6efc23ebcab6cbad955df60a230c23187db352654c690be8f803a13710e5b8fbed1805a1929d5553d701d127c732809646910d2ff748cb8c5cdef6863f093ca551c37bda129fcd71f05ec241b3bdec261892a1b1bc17fc1d3c8625859be6d255e4240eff10653aef299b51c0b05670b03dde9551657ea682e022b69eeb2585f3ec6445765597a4b4cae1060c86a5121cfb9c7179b824d2a390db3238f96d5a67b2aaa9a8a9dc13aa1b576a8dfd51dc529bf4be907fb2886894d920ba8b675b997e1fc1fdd3dc90b8642604acdc03d63a640f02fe80cfceb93343088e6aba8f7298ea15de9d4022c6ec755ccfed6207bda015c82a8424ae7eb741721b5e0ffed847352db1cdb0d2bdfc6dfb60f61777c1952e957e52592f9f66fde7c92f0eb1b4d42592df2cd3a783dc3668c5c0c92e2f8d80f361b4155904899cee00a45eafef87e4cbd18252a901d4f72b68132135f0ce36693b700035966749102886a8006fa89a60ee97d4e01f2cd8cdafb7c793eaa07680754fc3ca3b4a2ad4a99d93ad1e7f6ed99d320255c62b02d504736250074d68be75190621dc7867c2ecb1c8bde35489bf481d840fdc1a9dcbce109a752e1c36aea4967040623a2962578aee38a56e139a561e01164a41d03874571908475405d56a8daa31b3d8983d53efae274e1633f02ffe2273f9e8c4a3600d8414393e00bd30c85cfcb99adbda49aab091c594114b3b848e2dd057a194f9fd869eee224ced5c0d2da75ac81bc19f819b7ef230d632e17aed4cb6d58e93a7eec5b04d4814ed5825c53c80a97f7bbf3d18f6bd32aa2e8ca6e9d995acb329d2a7e9513ef77e468ad8cdc21286308f0fa6ce020ee1b4c6a1d228da542239dde2f19b8aa978b27f5ceded42f8a75585f98366a9cd861d8289c4525adb8048383f9483627614d920352eccc31a5417e6e39e87f4e2690ceaac45105e120e07c1525848e18e101bb17c61134d60d59e3937bddae935d2aa87721c0af0e1139f008105920fd7b79fbb9b4f69e8b27111065ca90693af091fe04413e71730d9387d35620bf53a508ec6f9c0779df87298d6ba2ab4f73655927d88f04fdce7a6f8c1d738599a9f220f58fe7ce5731a1e5d2fb9078c1fb3002be7a87cec45eec30a53cd4f2406ef764bfb124a5a7300be859cc10a35120f5014a50a7f635d2d7894bb816f154210946a369df37ea492993ba23af958d8308e723f18c15f298c0cbf825960d355ecc493910740fa0eb9f9a5cb8c9d9c7a0001703e380986b3f4c9b22fbfe907476a4eee95b8f676b95b24eb9e1fbeaaff66f33329d42080024bf5964a1ad459217179a4c919e099ae616336a35c24296f49aae68853cff61e7bd9925bd2e770eaeb8fddb690c50cf4b4feae63a996c2d2936fafe41ddc90106abdcfeb4febf5aabfd6c0e2866c77933a3d7a656fdd1d312b8ab6c39a0ff5df02e87481f8a78f69d59776d7649e8094dd68c33117c1e193f94324b03232ce9329a4aaa637e5e7301519261d9023d2fe84c6b050070ab701e5e221304d0bc235c93799e1736ba50667a6f93a74c313d917a06a49a9804682d7aed4cd53647acbc9ea68ba150270f4b38417b87646ec2d7d3e18a464eb371eb7f0660eac039d60110540b98372f001e1fca71f00730403a0e8e3ea9f1231dd6df1ff7bc0b0d4f989d048672683ce35d956d2f57913046267e6f3a2c4beddc8e1f6c59df735c7a01993a94b66fdb29883dabfc449ee9353ba7f6f543ab7e2e6fc4ae3fbba591d5ca9958aeeaca74333c7d09713d7cc5add81fd7f8969c5ea40a4347f1e6fe37f36211f14d65e4a2a0d8e7f816b8d750008a4a64dc7b9b09adcc2fbc28c809c943469796e8de6ae0f2ebe30a653d2b02edc0cc3fe99923f9cc43fe8d3cf534c056169ebc29baa9b989f412b2d530e478c629f9bbd845c3c98000143da6f52bb79c20abd358614d97067fdb83ff3aa00c1a14678b0127f6d3596f25401f2e3b099613236f1d88a2f3d8edc1f04bc0ca476a1eaa0ffca639a1c90f9626ee270f40d45ca9f1e187667a81dc5a7a3359dfb526b715cd334708df5f5fdb749c660507c76bb40e3cf3f47581b9f9945e7c5ccfe06c5f454d90f0d67cee899bb271b898efdeb6169844d98f690543d1158ede1217accb0a940a6e11a22a151ec8c096aece1444ad8bf08212985cbdb30127b0064d070d8fbf29fd2b7f91026037d92ba3e2aad435709d8ac9a00ecbbc99dd9f26f0f97b3717560a8e65c1d6228821e402be00d930ee825fff00c9f25057f6d7ee93f2b8a3453532b4e51b04b852415c55c0c4e8326e657e4d4aecc600c42a16e7b6913a56b13de2298e3b12b3feadf1179b6575bc78bd620eef05bb5056ddc89cc94374c3f3e6b576b170848815de4ec29e41063185e0a7ee5d9346c1889859685c87fc7d85b619070f79deb71038c1e14a061e242e75cc5627140cd6f1d065e4d0dd35d5df228964f8a585b3767406ee3f132226cae32bc0cc1651f2fb1c6a9cd6c1b58f68c2831afd822e2fc0e66a63ee06b69bf3cf52d8cd08cac83ce2d3eacec3ffecdb0c82838eae1c6e882688ccc73f40063180ede89a79eba91fba3e79396279807e6734593c77f50224aace936b4b52f7fcae397ac4c819281c0906a2a70bc6dcfb68e4e6877e2c8d3ee9c8423ab973d3cdbde229dc91f7c7ca55c901885e4c74ba9820c5e03f47622f69e273c5f8074c1d2664603265ebfaa336f2106da88eca346b7471e729ba138eb1c9829d8591a3737e2ca866928a532f132e59b799125001595c750ccc1933c557da0911e0b78c593bc77cf9c64743c670ba48069e5ba8a9f85539b1a4d9257ba29071d3a7dd6946c5b1586c6fa75f21e63255cb26ef3686bedb5a76327e7b1a488957433967ccb4d276c53f0d1f07a9da331d85d1218c30236b31daf37da719a02123e1140b193bb8843dc21d32dfc6c31909c70bb70c2eac916a50665b2c025ff4525dc62be1440e663cc61e773a114770a4ff650448ead0ca5e67199b9c5cce7f7cf9de3eb7563a995c9b8f50c901cdb6699f4b9dc4ed2692a89f7bb35a91722f0e45cad80dfad399f7b2fe63ef20cc76e2474de802be2476b35a1b36f938e18f80d1fa7c579a4ff498ccda052ef6da2e8957da7784d640e32937669afacba31d7f2f0b9026cd2615da19b0c90aec6d49d9718fc0bdbe025454b7ec53d1b22d6543ad6cb7edfbfc8a1659f123f589fc555d04cc583fddff66c04c1b060094e6d398ddac582fbf19ddf7de39ba81480ddd8e821ea26dde8e871664810619ec7604c95028f56e7f246dd946f8d140bf284ed889f533da083631b1b1acf8801141556f7581242cc4a2d645049d2c9657c225e58cfe80f7138cf31c83fd31d5bbdf61e5ee4348ed27fb83b597b501049a71ff1ffb892e67690957c18c00668d34b696e70adde81201b512c580df130dffae36f26623708d7121bc4b0a44eb19245d80cd5bbf964dfa65ffdf5059b7350fdd69f74d6c0bebd47cad03bf3953fc033aac136166b7f36a64a77d76d381fc438604b921b165050b50a6a5fb5c25b849d47553bc71e1a4ea57962a74caf7d6234ea3927391f06b7e64458c4f3bd4d060c17908bd5f87d4f2a56860cabe8d55378da32dc39c5281b62de6313b56e5d6f08823acf48e3f060be48aaaf91cb6fbf8c9afe5922effda3af4253f401bdd3e717f01aae28c6baa9e8b79837064092cdf9906545fc85ce7857d6f00ee192f695c3c9f9d17e882453300b164d132f87a546262f48d06ee3c1e204020a5cd50fa293759fdf511376861eaded99be809770fbc3230ba59484a7d633508f7a6e66350f5cd481aa4ef8693b03e5c2111b0756a1ce0b3683def952bdcaa34644454377c0e6605f9021f1250e76c57114e8227ebfb1ad71723489e91e33c3d7c142ee902d7c0a200b74abe11f6f574dced02f11ddd3d1627b7e7e9482d578e9fa4eaea7df849b6d232f6cc6f75461ff47b97536839c41b4a5a41e7d70188a24f54fcde45c68dcede13b7dfc1d8eac2e878d3d163a74c40df98fb2c97064c032bc2f91702e8e92494c7e26aa198600839732cfd889c321167d2581a30a21e3b857d44373dc6088286de1aef974a324a67e9273a6f9f121763b4fd531c7b7bb61cc282a14ef4485334a4c5f10b54ce23e449371a511668cd53bf6f49b2e8f10d22511907ceea45012eda87f1864eb00f3f21f10ff598b2add8400270ac80faab66a79bbd361e7b26c5edb57380ae7476f8e1d9adc59c6c2341d57b6a61ba051b3a147f440d17573e9a3cf2f992ea87f57237455639a801e8211e1e996b1abcc71d46383ebc5b65b32c66a4f6258967056b60e8abda3220470658808031296e4990ab4b0fdc51231efcf96febc1019e11251d28011fc123da523325a14c4ca61d34c24c39e59f1bfc7c43a85cfdf999c33fba881882eba91ca53c928f251b00bc6a19a03f50abbcb63af3e2cc24c7e6762bd78d34ac081c787fb34bac441afa91b11ffba2b5fd81e6b97893bbde0300b479e2abf7e3acea983255b58b31a2e057aa4392e67e1b080868505faea21175089a6a78d4d250bfd67d8264ae76697e5896331a7d216abb95c8099b16f999bfdd0ddd585de079f8cda1d7dd787ac5112f355cf6f9488329096902da774d025dcc64c9def5a6bf21e85fb4849bb75c4545e82fccdd4bfabcedcbdaa25224d1bb311fae712e8d66c7b107a6fe6ad48587273f39e08ba42803bd510f673a098e74b59ef9c37b1d2756a22a2daf782ad7536d9af9e697099179f2a90fad91739ef6c4734a2a6dce675b4637c72c3652c836638bee5381b4cdac283469e9fafb89ddd82d0e3a7929bd4217d0f1d947c4eeacb3a295abde6e32f6c8638cb0c8f9e5868b3cb4682fb77fa791563c4b0ef9a122d85f7e43ff7e78064de706769e07387d3822eb27e3e044f84d6815060e7996454c1306d0876e0347331f65bfec9bd94e7960011e484ca3c0a6570a7ec8cd1460797dddc5e8c54b36128d090137306e66c98494afcf45027d26d38b39c05cc2110ae05198a61cd65f66a08edf006d5e52a2f11450eb71e79a594e25ab87b125e35b0b00bd31cd2b2f9a0a659dda9b3f9e90461ea62f4bc9b4b827586871529633f42e69c83e5ec023471b0be2184278a70bf402140d4b3f38ce0f91e52fc9b9af50eb0b3e1e6a1bd6d86300305c0b9008807b7d2ef7f89eb3056770a6157f06921bc153834447c4b6d862d10d185f1c3f984cde5b81cc9eafe8bf532fc4fae3a89f41e14c52a0214fc1ab0cdcd -MD = e2eb69f7d6fab720a3f038ac773b3274b6d113e9 - -Len = 40112 -Msg = d2799441abcc3ba3bd2aa715899eff2f18a12c453c483e3a18bb0c99e2e91be1e87ac221d1058bc52684dbb01105d68b64a27d5cdcb2195aa841dd0025bec760ecf4c7ba0e3c234d9ef01a6d7022c8d6218e494057ce21334acddb1d847ef1a2e5ceec33e9d7cce22e56aa74305f9cb8574fd91835031e6e084750198791624fdbf079b4eb3f4e2cdc9ed4eed8231cdb0fcc750dfcb8d7b2ea97821bb660e210d642b6679adc71d5b2b0e003f1d50ee451ed6547365715a8f7a6ba4c9a51398ddfabea728116fd82b87416da02df3b7e239af0ed6a47a0f8375a3fd3bacd2e6dfd165ffd2556b9ddf5d3be9c93a86b4f8fbb5f2721f04049b29c5bd99e3d8a5839685b3110026e8e71b31f702d9865ff9c38fa1fe2babd4371555486cf0715f89a8a2735c984e43d34fe827f5717f33752f909fa350dde8f7b6b7301d49597f228640b32d842e391479a2ff1998ddb9fbae7d4e3a2516cd5d8c80073354dd8f1ebde4e50c6a63332b1716eed7b62e6dedbe8a300b2ee30bc915243037b999f9bece13ab619169bc97a69879b86fedc9dbee5bd79ec4cefedadf383da2de0b6983253158d5cfce5feab6cc12441ca858369c76b77d9d3741034920a1fd389e391c51e28fc14bfd7784a6166b0342ca939e674f522ffec86cc2f161efbf6feef2eae28bb2ccbc73ae0622fbc66e88d0f663dd6a3a1e8fdecc9a56908961da6a216f45b1645087cd5ddf8c00c6fe45680b374d4bc1d1c706fb09e721017d0e9c3f29f9d806e5446721816fb9df3b0edc4c795558abd21abd72922197da7972f1c69b8d843cf368dd738c3c8b919d5bca34ca74353aa8118ecdb3a46996dfbe0732445f3a59136b9cde6080fa609da29e5e7b385600bc41d756fede1aa92836491ca51d6efdcdc321ccaecb8adec479e5142c003f90970243c8c44d2f93db8243e04e16968d7b1608c8b77ac16eaa582b005d6a566cc0f9407db4501ce972086417aff945aab3cace5d2b1d1292a7b3dcad8fd53ee7b28d59f04fa5771c845f364d3b23f0b7f057cee46a3102ed5513767613ef5da3e444fccae6bba29f7afd46db80352c47c9539709054526c12b0d74f4ba073723fea6a55819f133f4ce48f25d0f8b5cdca734c3457cc7d2c0a1e87493c2cb5fea3a28e04279e4bfbf06e8e54c49c506e90271bff44147ab6e425af1fdce9a3c695f5239f457048a50bd537c23bf40beff73a109cff333252c94db597d5df26123b6991ef861ef485c49ff436de0acf97263392d12f318c48e11d027acc162429bd8840bc8fae36e344562c7a55e582b0459a08687c176fdf531dfe8f6c97865444da98ce0b2bf506b3814654478d0e807ef8dc2790ecc56048d511a05a6935dbf8e602eca09a1b3738a9ac8d5c0b5950f7d475d710b87513e7cea473419418060034e4e0f6058fbefb55c5ed3d664d67d8b63b40a7836740598f1dd2c721161c844ca770b67339e3250df93b92a6d10f4a269629fb56832fc5a0e68394171967aeb7b46588ed01eede5ab04102d4cc8e75adee5bb438b128548a654e517e082da4fc7286137acf264dc252c536f6282d80d2ab9f7b32d9722ed404fda65ecab78ea3489d00228bd49bcf4790d617cc34931e35bbf84be3567a062a563ac0494d9534a070f6ed1d40ef09f86a893ca0ebd818f577d28bb71c61a93e23b6ab6c37e138e1c99ee46db272f7cb1af76f8c997448519db1fa3d0c0a44aa2ac1281bbc9937726ea00e64724c21296ac9b778889236b2f33fa15e6d9d5fd534043e3e25e5b7bd27a374e8c7a40f7b20a71d4cfe586b8143218700894482270827f5bebaee4229be4f1ce2fba24a270538a7f044ee6e245302b40ca625360870d15581c3dc5f1ef94e103b54705997e1255f4ca27dc705eb88316b0d6802e032aa677088d79704a24558d91b33c4317c154d495f2dff8ad55b050306366f17175b3273510670447fdffaa69716145f9db178cdc5259d1dd82438bed8b70415e78cbe736591744459c20089123ed0880ea1e8c11a8e2925bb8bd383cd1249436ae414560da12b6df7967169d2d68013958ca50ea78f2b0a4737dd392b70c607670c3b06915e1c27230456302004ac6afb1bb89ab4512c3344d15eca3bf804caa8ac3b6939efcfdba3b3b6c544f0ddf407f5284f89fcb40a7a005f1d45d38af5f36b1d694c7cccef404d991086c49a1983c2fd146db749f6b06de61a9128e0ee11f1e8ed142f9ccdc27708f92ea56c41352c3fd0aaaa755fb0c0fea966208f1fcae7a4dcd72ec6dbf1db096883bddad4e7d9f76d86febfad40a0acb20ee31eeee5f55a20dea1d2839521a745ce346c3a5f712dd24adbaf4929b5fa1dcf9815c52cc211a071b1482c75f1e7785732aadc669de7e73d68ce9932a8efd2f267fd0b65f7d144d885b13d5af1d3e966de1d20c3052f94a9cea306252193babe795c28593ba2f45a4795200ccc728143604c6f40500cc1d434b7f9c9c7efbb7df6bd84d0378d98401c7a3c5328cc2636e1bf32a326875607c390d8e5430abe7506a58792939918d32eeaf9f7aeeac18689ffcfb531a63b8aa3b80c423cedacf0cf9e9966f6cf5c58a56cbfbf05d33b7c7f93b03e167359a5fbb7fea85b9e6b347c2f221508354d1aa989f674d58f7a60ec033b0680f696a0f31315de4827e58933e18a6872d6d16060c706dec827687af7d8dad41536dbc2b556b8aeaa8f00391c3a3924dcb7d171f5b158c584a2ec11c999f4717d3b1155660751de2adfa68b61c49714ede236968ecc52f1b108ed6e89cef0a6610d1e9f31af47376f1ebec627070dff4e5ee61754a25d2af86255da6000383969b5ece93cd5028122543033998a01aca733cb3c6ebae23701b70b9b76b633f23c3a617aaf01ea84ea8ae41adcd5dce49f6acc4d049c47e1730ff7f9f278499b83a4679cb3bc670770c7c1c31b70076fde09d09140d1f6f0f672013efccee2fae5fbe595708ce1d45b13b1757ce4e8150d1bc15148e0552c34e911b0be4166d90b48c2ae0dfcc0b154769c7927b7e99ed4a586d54451ce5cd27b0f995d583dfe9c93e82fb2916c6703f96818457471d1dab107655dadc74a7b31e33f049cd03141e23e6089d54dbe0fa3fe97fea0e777c8462c49ba7aaabcd51175ebd993853ca23fac88b74fcb7d217d464179c5b558456dddc88543de7b8826ade404c7c5e666b11af167874f6ee08d285ddf6a423cfa2d022be38dcb4f3d757474aec0f9f6364170e1bf063f57f5dd8d325718f6eb8e8e83bbfee2d9ff9c08b0e1ff048735b9f596a1e753050107755b090a56392caa9848bdfec970554ce64b741e1dd96b98d7757908f60734bf5b7c2a20ac73c9f654397c0bcbf817f6172b753493555f7aeff3b04a78afb7c599d6ddc0a20c8819c93f3f4b6fd90e41a43a2c68ec65db0843f990d4606454c037536a12c16c32bcff404de93d7b02d6945ee0e3b270a5eade705fcf368dd1583bda183f90fc8f86ff25ef0bbd47bb5cef81dbcc6cde86c7c53e66628394f736af52316f98226620d0d76dda78a3007cbd8a634ca3164647024dedb6cde08e029aa5fbc95f4780317a3d0f7df5f89ade0761c18bde82ad139b833cf29fd95e6305babf766fd4a662063e1d1cbcaf5229d5ee3db0a58983d39bca9a3f7ee72e02f779c49e502f9e5b7bc4dee1562eee052d191ee480938f2e070951c5f472c88778ca546788c230c3e1b69bf24adf361c19caae4ef8089acde928a7ab88e2f2999095b5fca1f4264341fb9c772029f413a0e9331794516c58480ee51ac39f75e048c23083232c4782a27d29996173ee95ca5ef666ddd4cd762da552392b111906a7390d2594d45a290c238a7f9427ed48a0113f645afa85cf9fd438314aa1a5b0b6e394097e5328df87d5065341acb9d429ea5638932b5b0ca683dd29a8b5e3887ca60d586811794d1c7be63af06a1ae26ed2820c10d019d54a9a8a4acbb79936016bbf39db76141ad2fe735e2ac9d81a75af0c055a4f85d1940287bc3d0d90624d1bf3d55eeac3efb244f2e77631ba23486b3c4df81268a98ba11ca6862190b3699cf15379d54c74c236aefd5d0a8aa6efec5a0c727f8905386091302c5961d15cd801dcb49f78500cbceec666bc0e4a701cae695100b28ba1272d84b91fca652eb56b9898b00f2c98bff96d19af0fb8d5e1808d1bfca9e6d0df3ac7b5da9417e71d76aeac70d9af6c251818fe4b5497262517a05bdb37bccd6efe24a6f1878e90f76b4778489e8292d893f09ef9a79069cfbcc9960424b69ebec2c116ce6b73312b928a859e254c12beb21c801fce4ba8c7b73056e1387b4db6cdc68cd8086dd0a033a05adb37b6f2c1bdc42c27926feaf550fe22d93bb4e23d695c91772625774096b080689c683cc8fb122b77bba43841cf5b8354f408633ddcabac138c422df203e37dab1c09f8bab52c0479119499937b6e00ba2c20da9d6fda6514036dfb9ec161db0e7e412c81333a3f935ce515d39d602174aba34e456a1144e3534ee72c195121f88cbae204bd65652f633fb4e97d586ee8393ac81c157ad2e6448cfc8553dbd8d10c19212b9bd4fdb4ef4b7fbd637f707f9e8d4f0cb73a96869dd03f8fb7298700c709f2de14b18f8ac8b07d3797fdaea1a143ebfd9a7c182b28c1ba338c60b6ef85305b057121a319b617b64060f9b0b70c04a4d50466e13eab08745a1cabee050e366788fb4ec2c8812833be089bff27a57a837d3e207825ef4c75eaad30b5aa29c41b4ff7607301f08afb9bd50d225b354b8fdd90d3654abc36c6cd88179646a0828143b07f3f2ccce616bd1074a1b9831fd1dd41a73113da6e6ee9f58916413917a04a6dd1adafdde38d0e00fb05ab599f4f669bc363ea109b75283baebf04bd2c804d758145f3eb2a6774efc7d5987d72135ee45083362765e470a4ad18f5f3682a3511b58f60be62acd9230399e8b84125af65751a5fe876c2ab76aea97da574a5e88996145f1d346524e5d5da02d2b48b3f665bafcd187317c0fadbfb0599f7f950254b5b56d248993d7d651e5093724ff82f29cae78207eb97785a95f3989a2f542dfcecaea345500c33dcf039c32479c00708f317edd847183853ffb06a054edbe8d350d059d492784f62d52529710f813820b3c5208e322b81efc2a5d7df5ecf9ff50e22bc9c686b181e577c8e021b2208989157e4d2b5b89d556539a7d068179a8dae0e9346d9cdd739fda7ba7ea48bc0991636014cd7a7d2af70d3a182729b21c1b9fba879ee84d5db4f0c758eb3a4a74ac8ca3fa3a0e069226cdd8f9a87437cb9b651c1deae79572ad61487da4f5507d4327b667f184ba9d8e0be37c3acf7f29e2d77a71c2194a8511927b7098086265ed9b23d8a48d1dcf954de61a3eb9fcc98a6d722dc4fbe0f76a1aecec44e1f4e1147d58d69375848ac50a5d7e24b2353ceaad8f9c641ddd3c2f40f95b2c208c515034e1ec7edc9371a5d7b6029d56bcc69c0e2f681feda3d5c9cb4d17ce329d3919583b84a730def6b02c8c3208f5f8290715ddfb68e9e956c21034dc9ba6ac2ad86de239ad00ab9c6c8f4c96e83e8bc6c44b17d0cfa10231c0966d0424db4d8935cc526600caadc5336673abbb9ecc125c147982c49172e92de44218fa6ed5f68a2a28b4430d4a23cd489deb13754dae27085f8bd839d00f627050957cdff9d57dddc18ed437051a62ac37cf607094fcbdad46468b189df716d105042c8d0db8597db96044d6532bbc17bde3231f2680a869da5d5d9c3142b37cfbefaa14a601d5707cc30579d8da3201aca0ebbf66dc4fc4683ab0632e64b0da91a2460547645a6c8841a67ffaa86cf090931afffa524c539c6933dc09ff977062e6b0bd563250b86846a8873d08b57af634514f4594f68dc36348854865ffe4ec074acb770e70ea995c7bfe148da3f739feff3bcd1706d999b37eed6e2a229ea99ea4ae1e5b037997fd916315b9c0fbf87d9534155ad5dd7bc43782ffced81408173ee3b0aab0fbe0a49944b4ef950fae1ab3c6a2d2ebffd62012c451c668db940b79fad26fd1d81febf41186c18898b760cb71fa01c1b75551814018935d5bd9d60651f83d1e94822e2267efc2242dc0ea5ca48f79ffaa65d31384b8d83e1b561134879674dfc7c3f5b4a66453e0354711e80ce7bdee2f842f49e0c6e783a07547a51a31b99dd861dd1b6b99095555b661ede9771025ed3cb08502a753b671d3e3d8785e7de14cc84ed705d254fbf59b64dee8c2432f39fc216568feaf5f05ee704f30812442ab83c57823c4c93cab62955b795db972bc4edc5b62115cd5e3117769b12e6f2a6b10cb6f33d4d89fcdb87db419bdd598daa14be7aca3dec3700953b898ca911101ebeb3cc476f5ae02e988a9584739fa1ba01a9aa71ac7906322afcc55fa4c8f16918f51444fc2efb182407ba3ae591f05a7b2d4cfea89d502f9e6155711f40d0f9e325d31b3a2cd702f2fdb8a37b5901f349f26a587a809f5eb91143ac62a03536e6ea12b4727dfb52cb1298a97d1c5cee34a10b696a497a2942b597f7b411a888ebedd8f7eb48ef7277ee613332058ab104e23818bf216af703f457395fbbb257b8d52dccefb63cc8be3a1b28e33912a6815cf84dc32ff631c2778d5ca9c5da0b174b191bc4ef69be689ece72d8e37c3472b853f0bc9ca63d48e54047db58a90ccdf7a5ccb31afeba3cc183f8592951c2a19d51eaf38f02845de779e23c9ba6c3a580d8c704608326034c42a2ae3318bad4b4fb21b031936ec8253f1516b75996668fbbf4ffe8816985e611581e2a5983d4a5587e3ba9e06453469ac8afd34aeed7cb543becdb80eb8a38fa02f2369d85691770e9db2071ccc4f392e351180234c2ddad8512600614daea0488737e6a285ab24c4bd9becf0fe4d3304e42ae08ceed6cceb8baa09d4c3ca337d2e62b4bd4711ff38a7daa81967b8f7bf2cabce4262021bdbe2cc2ccfb7a0b9cc99664c5f174066d900f0d0fc851ce7cb5336a1fa225a4847db0ef1c895acb3a53ca5262e72c0ec343d70e020c2d393980c3e240acc39c2bdf8e4f135ea58b1a59c91da91e -MD = 9c5bf7e24e8764745642e23e7cdc5fd44f91bbf9 - -Len = 40904 -Msg = 9c4ae2217c928dd5864836be5d4ec281211471aa441a594b99b013e5ae01b48c5c4ffe479c80d8b69cdafcf7130bf0c9d16c37f29a86c8df34d6bf8bbfcd53a2451b08e5922d25d046f4697a28e9fabebd4e9e981ab62dd1f6c747df033f42077f3566c405a25d6caa1fe51145f0c8a50e420e626bb17169060d11aa235e6903312582ac9ee566d2f0e2d882122942c9ebd0ef1a357f7aef8d3087b3c632b0e08374c36505002a4a41c6aa96369b51717d81a986222932abb2b60fc495c400e49ea990b6e1fa901cc552c3155a4edbe4ecdca46fd8b680e59e2913a3381b3f59aa4c5368dbdc7f8fa30e8cc7254bc96b5f6a499cff2e4be47810fa19563f5785cee673439aade1ec04826b744099044efeb1fed7409a7df169f42cee97392eb133fe580fc7759d7b0f37c9e3524073d5f23b2ce64301fd54995c11eaa510ae24011c6a94093d9b84edb40fdd0449fd4863903c92af6bb3552fd011d525ccbe285fc8119a090cc34fc581a32afebb8cee783694a32ce0873c54d89476c2764503758bb5e86eeafd24c027ef92e79e07105ab79ee1646961502ffd029622152dfe6cecbe47e1df314a062d59dd67fb55f6319bc114fc0d29dae9c6c3fdedb15d616c74947f0af4470abe1b4bd228d960e8246864039fd5c722a9bc3f73cc53bd749ca99f58903027ac107a2c3acf400f2e5ba8f177f3c723709865dec06601357f2515479a1c9cb97825d064dd07384a0fffe2cf38a0ee260cde4c09ab65c5adc92f40f50c553ee6b525a85b8376caf9d4389f660e4f4fb63da2f626fe6ea70d9be1b10f77e42094ad388778f4c4fd05c62d661ec1a8f4bc4d0ced9f7f2cae3d3d63f0ffa3704aaca684f725f79ada542a07bf5f1852e4218245b8daf744e225f7de852b58a2c217e9347fca56a067cf4bed3291dcf627cb2575df412d614bae117af9fd5e2292bbbe6ea8cdd77dae5e7008481cd53bc6a47dc3ea3aeb29f2bed25ed2db7c97c2826c5af89743d9b7eae0808868cbcac893d458622ff744de3e83b39b2f7ca958533d22f990615e8859e47c7bdd864a357f705ccf871a5b17176ca0d96024015e1577eb3320fbb22b95c424a7e4cd6415529af6b7aa1c16a62fd54e16d63d47dbb263e02db0d77da884c8a196e36ac071f39a4ea400c51c927006e4d9f98e23d81149266fa6bf680510381bd0442305504ab88d1df1dd16e3c1468bab31e13b5c1a71e8816c781a4c205bb9db6dc1dbbb3f3cdbabe52baba209df6b13e6fc3a6fb5224cec68cd3c859b7aa441c80cecb9ba6d5fd4447884d63217ab9980a8c619caa67a37048576b66bdd048abbcbdd52a3954223768c4887233774c567ad876341439beaa7676fe977cc003cb0c8598ee2faab1de32fa0bdc486ed2003d327540242d78db83dd025a78fc0e10ec906765fe4c34cf3293481fd4e3f31bde24bf5f6eb55a9a1cd4073e36d6d003d978c11039db2370f41abdab6d59180fba19d4c03853ec5c9e068da13b02f22a5fa9468b46c9f669d41aed1d7650c9626d9c564125ab96a983df0621f9e2dceaeb9c6815b98b26207efe46d4844d7faa7526b420cb0ef1f76ae7f13ef80908cc09ec966e16a15b2b313f6b6f1ba1c34e4d436f0d7d0086ccbf9bdf66c9d7fe4436f461f2c2aedde0b778bb4bb1100cd4727ce755d022bd9ffe754127c3f235f9ff5e4b22620656f75e24c708c8fad4c3712dcd9848d80ef7a40e96f08aca4843cf84c29b693a2ec5b1be0f14e7e4b391c5f082436bb3035a5cc2716f92d29dc8240258bc3cdcfdd24ebf13fe724011d5dd4f95f5ad26334e652b30e350adaeeda9418e1371412ca381a246341caf87f643a5892d81b4072a69c385fa68be042aabdcd32f9b1933cff70236442b758e79858ccc398def0794e705c1233f863605b84eb86f1ec7bbbe1b5964ad43548dd61f8fefc81639bd14497c72ec3988ad156af1be6070cf2cd46b0241ede8af0ea27e095447df16700f2d922bb40b47e1c02060458235b1ffc962a76e747ff799552d93aa474d17f90befd15c2919467c9c6534fe72d1f2bcf39eb34adf9dc0b674aab95224c4c090912cd47499e806c600c5ca3980da13ece97bb0578db69cde7781e4dc9eea82ef1550f615b4fc0b56a3beaa975ab297e8218629151d5eee89d42fa0b9e422d15d2ef8c0afd8c9b6b6fbac50885effe167225a7813fcfb28411110676ab3025e733480ceb393d5bb6f5f3b569d0c26a2c2724537d4bb1fec7cc4e0b37f7a1d6cb9dc857ac164a46bd864d82745f0ab3e9277f2e2c7c631adc555fd1f58a7b89ea97d734f49d9ba5a9a930f3d039b12274fc9c0037dace4ee934ae20596da8876ba9dd6c6bd418bfa1e704d226669dfff62de591456dd8e217f2a1c00ba70e15775b42c7bac5aadecec632e51defb8929643c0a9ff3e6a1d8d16a278b240977e36366e0d8978374858d020f55edbe8227dc5970f0d546d4874281812f6412a08cfc1c9067ff3a846668d37c9903217f9d23bd18c16b7c7abf3b06b5481b1aefd6b84bc7a4540e6202084df2b5cfd2c5dbe2ed6e8c270628e33370207f8980da33108ad308367d81eaf3d81e16a430f9769250eebbb8624395b4447f306fe2e434ad405f1e06e65883b4083b4610ca8effaa8e15ca601f7f39460a1df51ecf924dd712d85045f77a5eb164f6cea60dfac993fb7052eeac206061278948169569013658bb49841f5bee8464bd1ac489c187073f8acf9486db8d8e235db3f7e2dcd143a8946441dc61b5a58e1aa50cbc779a4cb0c1aaf23df5233583e7a3332662407778e02affad40468d478c17df2481860d05b17f983021b3efdfc39048de9dd14a501b182e006c13a4377dcdcc4073dca084e6b7f71bd5d2258d7e25a979e40654b4c1b64d84499f92d48c41449ec300afd4bdde8f4f85e06f2383bdf596e951ff1d608fee876d6cd185241ce89e0384937bb36dc159b681351850e39da3f236d200740f81b84bedd8efd1bb28dc99eaf3d073e05db8fc170ff28211022fb33755e478af976579a5216b119675c91ab639695bd084ebab14784873c0d3a880d5f36feb0a903d5b15339d60496fe1ea48ecdcf7b90760582bd660c29d729d0f9542d9478b1c9e74d097dd4a4e67c5ad457671c3f435c587afc2f1daf17f7b93f7ccd71abb9d076b49c6d14c100dd2b82e7eee3d3c9079ce32c66249575ad2d26fe9dfe116821682f338efc238b297bf565ea8efdcb7fb703749488a4985213f70225a17167c3a706f66af59130683176fae18486f1cd9323fd40b1a429ee52fbb2eec3945dbe19810e8868d597a3354dce5d2d36e2f8178aeff2075dcf8ad477347fcd43f31ba8e8a370bbb567e26fc208e5f1d447082a827133f296332c80b6b0602544d1e13b82dcab58fa492bc71dd102382ac706b651ab89da19fddf3eff4f1a355f9e18b998e2c0a56ce48825a5503a6afe0bf9a240c67f27acd4a8f6993834645e03c80c72dd370cd2e10071a3ae18ef19bae9d697ea9a4118609190cd95361907a7fa1b58f499f3f5e79b935f12212f437dde399e3e6490244aa1f5e38ba9be2433b6ce924f6cc49e9f627321a5df9343fce1b59deb647d9a3ae00b234414ba7b4e020d67173be693b05cf9318ed981e3def931db18226e40d757bbd4e8ff75d5a1e8c021748bc19dc4920ed6f69762e9cc2f96a1ee27cce0ca0dee409ef257f9d36fcf068de6bd83800a985a05a29f1e6d8aca3795fa0040ba0a8aad8f76c8b18d9f225f8bd3420f8ece8003e2819e4a6a12b6e53423702950577864e31230c37781a27395dbb80796e6af1ab6bcc9356acf42f3f42b866234fba1adc14ff7f8381c358cd48487343f580ce6a8dc87a616ca57a8fc99a9b50dfeeccf51b485187979c4f07059175e322e7eb1e1683f67160adb4d75f540e884694014bdc942ebe19e38e890dfd14c1770efc189e85b3e1197b82a86c8b5c4404387c22a169738199577bc5ca01bc895244660c7e442f4af7ad48758986f11ea94a822c224eac9c8666bb4fd235e9854546bd4c3e55c5199ba19ac12f0d69729658b7cad7aa4649717fa189bf00385fd074565a672111c775f6de0dd55521da6bd181813a02ed22eb20e2f5d9070573846be5d9814c91ff072ba6de1514b6d08a4373d1b1feedb343e8e426c8a0fd6ac18bd02c052ec20adf9e799456b294df822d035ed7e4e4652c46299f06647ca02852b9e47b4e2e856ffdcad322c54861e40cb46b245b5dd2f4b727c10ad7ffae195ee7754c2133f928981f0cf1a35e0210510b992fd8b6674dba633f4e6212ff251efd51005e8ec09a1beac45bf3222aa7a87d6b42d37aac87ce605c5999431ddc01602a304c7b9644e7b27bba3b41660a519e4415d2371d4371a3cab4e40c849ea4c453447196c4b99a0ab5a4c2482ec90ac2d6015b6833f132a1ecd8e8dbcded877e5eb5747ce6588157e4944e82ff54329f73ade58a7b219fef454e0e3d44591802bf1bbb7a75b26c2e8b1136ae524c4798bf73f71a7d5507e0567cdaad9261d505f6efbd3bfd4788f33ba3f106b211d8231bec169494fc0939b2fdc4a942885cec989a002dd798865a58b52448b93562e30b7eaa956c97123fcd4952bcaf4d0e1b06b31abcbf25d2a884dd46d0b227564d20b459795ea6c17717d80b5463206735e3c36384fe6ffc822274bf2b477840c5de2579cd05bb85842522651cf89306b1923381032fe7725bc42413d4e3a8a0d1a63aa21cdc35dcdb77c0e652ca155b02a48be9b3be1cc2b9dc63db5a113905151b7c58c55cb645d1823c05b26237d2cd9d45041343706c00fdac8c274a89dbf4a053046301bd4f2ac6ec59985b7b0c66def766ae3aa2ece58a669cc91a4b93f4c7674b8265ab573bc86a4891104f76630c0b97e12e04a3cc153a83bbeadecb9a0321849ff300fc79093e59191b359f46870a0e5878165f292090d78c46b3f158f60a4608247ebd870bc111bcf6bdf595e26b4070b3684d813ef21e96b88b93b5f29a0677944508da429af8e91d5907b5a0b7b4d65a7b1d68c2e6bf77aa9631458b495c5aad247ce73034752a0997443a3477f1d5f7bf3d444ed730abb784386c42a0be2dd97d783277261cfc45e9399830148e0bf5a53ba8455c28bf49d647ae9b28826dc3b0894069d866dc4ccf66640625cff4eeed770948edfe0eec0cbd9117596f96e67e2ea59ad3d946a8ca490239145e0d4dc89debcbf527371888289829abcc35ac36e6b67c90fac7c46a50174b68bed19cf71ed4411a4ab459d9074844a83ec69f6b3007a1a831dc3a1029f7bfbb48de46d968373ab5cef31a8fd8061ad71dc63a9b992d8c8214f0746c25480864a27fe5e008992b502a9fe51d1975fea10fb10838907cafa71aa10dded07ca7fd525304bb7e8e9591f40743f15a0c82ae8b2372d2a4998d8fc97a50d8ca0a20fdbee40dcc486c0bd3a1c5b1bd183e2947f67a24ea43e8a8b497c907ea506505ee6eaf6b82e4d5f09dba57b8c0b28f6515f83178f00d0e83be0c297d943231c937d811c88fd240d668a439c3bcd774b88106f5f9845e6f90f4ad283c66bde4dd6291b78f339f214fcd05e85cf1e582b62189242107b6706300e121bec271f2d517020d4a2eba1baf2345efff107b3dc070153879fab3d57c6b4ec29f47ece0229ddf8f63c1b1848703fabd2498e70a79e531cf8eedc4f34f8c5c7738579d41589f50ba66acf3f05a077adc67ebe77d44f94545ba51685e5eec80bc3481e17ae9742c2aed411fe3ba866cca2399cb0ab444e62796c61c7b1d1451fdfe57780157b4b83d521e83d30b094713021320374a208b01ae9c6fde2c9c46d8f038cf7915e98b7e2fa5de42ee1880236df875976944ba505c74c0fbefdce5c9d4a63656b68b2c79e0676db7b62cae97d1aa398fa409ea904acfce58e96ea54cf6406b0ecc02019d1ee3d0a5f5ce28ccd7b8faa48ce8924dd41dc6899bba1bdeff67dc2598f6a174259ba5a24f75955eeaa5275a867947e592df77e29957a00c3abce81fdfc1928bbf0f4b1105ab5aba74ef4e36233482040185210844cfd83142803d71f30b4b3025bf3f96dae81f5c10f7edbbd592c705aacf707f307b2afa91824ab0652c322e141bf18811a429d0597f7440201c9d76f8eed49beee22ec4c2137e4fb8bcedc1d4a61f895c7820a388b67087a55a5be46693cc02d2ad4a3c3eb466c46035e49811fe07ff0ddc8a42596d60e6a7a4a8ba8e3ed5288e3503ad71f582a2fe1fad1d4684497dc839dd3935e4d3e1d9b40a85da406e916401f1b50657606fe4e2bdcddcc95279fe188ff498bd380dade0d7b2d55926c206ac8acf664a7e8fa7178d265f4dc168220119010c671bce86b3b6ee09e96c3ee89d35791c5f3b86c73691b3488214ecd68c0eeb0b72eda906b52e73d261cd6c8c4c983e82f625e9c7b861f122f6ab6c8e01e81f10512c21a06d8500d962b8df6433197c44bfdc3d2b25847c791c136bbb1b2b29b58255dce6357101895ccd0bf2f93fdedc1cbcd563f66f91a572db6ed0204e7755a7091f3ab568f26cc06876db0771c2b38d4656f4b389ed529b71ea7fc9d8948b1fa47d3055e35ffe3e19a46ed665c4659217467fe579fbeae655631c70401dc05cb68b49af66a6a8165f1930fe82505cbb9e0847f4a629e8f4147d38ac1b6f9ffecdadf92a696314e9b749b3d83df3136a5930ff799513c7453d7d56e5d0f674664879c14f6211af48a0ca8a0c1f29244eb734f8dcdd36203a2ef7e9a5f76ed833b5533486f73ee183a9f006029c7f09b956a8e6a6d4fd6e7367817364f52555e7a2eeb5798f47465b416eca443c413e3aa5f12b5012f61c61758e86cb60a657e28f90d69f90d7680ff5ab4949852c3c53339259712dacb494e7939621b08e68c4d9ee1a51b24ba142352a059afdac7e837e20d3827b8dc17e1c1524006b39f2ff204af3485a30ac729e5f81b10c2e8f6be4112bfc8315cd9db1a7a2fff735a101d15bf3ebff02c4118fd03014473ee94d13e7e557dad1236416bfb578fb0ddd7d9b858ea5275e82bf8810a34d256a16c76c19721cf94c7d71d9c1bdf3dd2f12b2bd5c460c598082dd25855dc42d2c826b7b2a74c454e4363769423ef92415eb41d5549c9a0c352eead6c2c1f1d4e2d6a9cf9f4fd68434e83553d5bb11566ec1bb61e304d6c5d901791a4d728ea3496de2c7fc75d -MD = 7731a20dfb7725e61d7aacebb41afbb4a05ffbfb - -Len = 41696 -Msg = 198a696de98961e3ad0f953339350b5871d87a415492676d3ae88eb859c583758e2899bc5b1903052ce139f6de7a9e7a81455f135dfb9e7134e6d043c751634d9b3da4bbfd55e1b54424ca3356861d136e5c83691c84b5168d09e29c0c965530c9315311d92542197f401191aa3fd34abe87ade99716f383ccb88e6a307ea1469f6c6c67f7727059649ed3b9e18f0748fb2da73ed897a1e1795d9a553cf08eb6a556b7645d22b19e7ba4db53035d0034acb5370ee7f107571c5fcf0737d365a96357feb1151f4e104dbbf006199007375a892602ca0a6d0e3e26f52529116f4662d807f5274f8fd6614bd97a291264798c103bc18bcc1b2d661ad45a1b91f1b6293f9bd9999cbb193fbd5f583eca5f21cab240f4321d58dd1da3334b133b362040f6820575ed1c0070774a485da040589dd7fb42c5e76e46ea29dca31cf785ad30638420c329f8b47be362f1907c4e458be736544e11a38f551495083bad258480f069d2893a985ce8686efcde46d2111e4ab7d1d48340e1e6cc27237a455fcfb804f8c5d1074421406d381050e614e3de69476260258c6326b95a9be0a77bb36106fa9ea278432b0a5c86d6ec455ce452aaadaff9dfd13e9c43f51875bcc15a026038080575dfa1ce9c21f6bc49f23b0276b35fa7995599d1d3c244426a78ec237977a900e65eab1595d117c8db1d1276361f1a723b629d4bcf87c44e9aea904cb982299eb3097365af5de116e4278e3750ba8a63ad3e7194a10d43a2355d6f06882031e4c5281e49528ffeb14a56d9cc2e4c5581d7313f34af1c6744211ab1d84e1869dc0203d746e62d139ef7f31bbd369d23d5a1852cb1637cd83e48697d4b7333788d53e1c4e6d300cbe6d1457b93d2749d65f480629524f43f989091fbe65f3907ffa00c0db081d0cb92c29622d5699a6a3bb66c0967594d4458e3dc55317bf2bd3bd2cadb2c5965beaab12c380b62d8335fd18f48b06c4f8e882890b0b42d254348cf6456e3c1864a348551e4bd27f4a0d72b3248f7c4c2c62f47f637f8de9c402e8122a55c22fd173a284a4e741fb658adae9c31c4c96e935627560f84f71d5df6cf4bf11fe590cec381629fb7b2e804e941172aa0e31b9e04b2f863e0de7142a7a02961b5700817d878e0ff0f48504b91cbe95b117a908f41cf235995fd609649de021ea52d2c9980f50b950349b8d6af365beda1f6960d156621192abbb101e5701f4f7782c6fdc3e02d8a1b1de64d4a69b508d8bff5c0896038cc277f2e2d813ec81db4d99ceaa9218c05df2da2566b4c3fd33d3d7551a4a3b19a15b39dbf283044b0e39978093ba1702fd8dfb69c19c7417758d9dd686f18d4aa7abec762df2edd2f8c2a2002804623308d9ce8c55cc2021cb1f9f7acf0a7e825e10874bcb020d9c238f45c7c80f9ec2f86cd027a3c25cbe8d10789c631393732cff96b75a2ee81936d5ff62044a312544cd8ca62c2d8e4063f695c5d3ab407facef97636bd801dc7b6d3b495d32adec966270926f5c3959c8389381a1102a1a565705ba70abef58998b86083367898b35c20866ddecf26d326cde5a5c0094d5a1dc6e36f909150ff9d76c0947373883db72d0be083e2ded2af9f2aa54fb352417c63d63658df78514c759d6e9405f58cfeb55e27eee506c2a666d0c3c4e6fa830caffca66892b3a82d1dbeb9a01529cbb92048e927c1e6ca9389a0a6298c8b4855131d65ca904a2cc9d7ed1ea08a6a2071d591ce345cc613ff725ff6858c4eb7def5001b86c38504a709f0449b4e01b3ac3e01801fa0eec47288d85de1ce8bf92fbe6e71a211ab59501d90d5994836adf5c260a4f074a5067233d281443a8a35d0d72f0e286406524a799576a3605036d1c975e5adbf350189db140ab6b892944aa60b9c1fa3dc181f87c7d1bf7e9975cabb09e8606be4dc3ee867a14030ec3e2395cac090b676d256adee8ef88a57936701e458105ffbc019c293eee88ae15ae60b332482841ca97855d155536cd3b83001cedbc683c1d4a3d26098b8aeb71118700f70fdf715c50ce639ccda0d550aae248f1989bf8041637e9648b884b68a432b264c0af6ab4d9ac8ee9e945324b468d2eebc61fb7e2ee22ffca5eff528eeeea6405eaf6a2469ab62b87189278adce774b569561f05c4a64e5b5865e75364a2482551f639c943c61e5feec272cdabb170aaca71135b2a39417b0822438115e6799ccbe74ce2007363aabc461a364850309687b9bfc8892372245e2ff2f82842a16f74898bb7cb3a9a62831d090ddb4c1a4048370c9609ea471e0193db00c63e2864f6e4de8fcaa4294fed50259a8e2b9872b4f1e00bd1182a309b56e5e317637744f6002eb425387939a0e65824877711f273f125710a348224d181fae74238f4d61fe6616c057ef2e844e788f5eeb7ed892e3fc10edbc7b7c04d1a0156704608e4169d610092fffc24825c9f53ec7493ff8de19e2b6d5831cdb72ce176c8131b34862d14b8f34200b4024c8487a9356d1c37e1a20fe86f5712b6bc849073299690159f64db51d064616bbf1fd94c82e2a8d546b70473959359f3d4d1eb9810dfbe6bfa38b3d32f92f365bd5890fde35a6a0e19c45036504c68167bb0d1604e608631467786a2e9f0329a4f17f6e6e13d2b8b61b03c5a2beb08c6ba0988f36d80b20f8b0b9de586e8e5af7c44512c03f4b3f326651007abd601ab98c45978f5a608acd2db40c58ce1d64f4dc7eafad2e5caef71ca14645a761b6e1dca8c176c3c52b122cfb66a8543cb20c8880976d579382749c7909abf331eb7510169fa5ca956c584cf49fbf8758dcaf770f6c89418c442b644cbd06276d12d3d5238464c55dd91ffc33fa06ee1e4f6e265f819972b38e9c0290e2fcca5fd79e8a54026c5a8aebd9b93e1836eee974c9050589167185ac3705ea1df842a6a435ae3cac04e0a93f0602877c980047073091a5f578b49f379cdcccc07126be0329cf21e3c6fe352d25768499d2c8b351455a952948b24cab2df59d7d0ffd227eeb5bc84c3b09bb40c873c9e25fbebafd67de77c6ff013a917afee0961d2c50620ad28447d9a9a8146f98cc089748da66288bb2411407d564f4474abe313ae47708d1da591b4488127b341f5f220d7e25f7e0c91a106ca9a03a7d1057d4bf4b0855c85f027860e7b58bf41868885322a7667c40c48c7613ddbdeef5f5801ff0a0822476e69995239812576bb722d07474f4ccadd2e0dac077ef3b4019bbd371ca0e74b647d747d8149ebc7dbd9a0bc029134064c7a5f12c095ed0a326f0704b0f6b4791d8ba0f81c581b1b30e464bb21e42860a15546fb2fc7d5d83cfc68ce8cb190b9e0bca32ad257bc5c00bc036a6cf22fc023e649cf1dbdb206656967fd797a84f3f437077a6aeed77194880533ad60510e1b56f0f7521f8c7bf6df8df93ff9970fa2255352aec473423471f07daad99632d1ccc3d996946c213685602aa6d5d1f532ae1019648298b7279f4eaf2c0307148d714bdeb1c459df6f846af976b73a8decf9c53655cf4eb8b739a633fb86ab9d976c0f6e6a585b9de70333cc7646dbc0172ffa1349549e2d2a678170df0b8bb336e697f28af87a43e82b410c6f2bbb74fd77381708b98ffec95366cea03aad3fb4076cd0da4bbfbab8231e222a0de292e4fa05aa59a52a13dc22ddb505ba1b2a57f615721ffa31e89f1452746c95590315e0ec3405c07654abff6e8dd834dd5a68dc1a3e24acd8b6e726636c006b27add850721dd5b37baa7d10a2bedf4ff9b92ee0049eb00abd0cd680db71ad36547a757221ce8e2641fb9c7d00b0e3b4792ef32b5af98abce7d3b64b42ea3a9ee951336f80adfbc0d1314e6f11ccab0a64a0fde4a4b77b695ef1cdae1e41704ded195b6f1723e32a3232dc0e5b7801fac3f996346b3f4bb92b5064d2f9dd17e868bc35996f990d0c6ce88e81681dab2c9d20044335fbc25655d6c2df5a26f71a632109160f75420c8839abf1c0247247fafd8f388d52a7e5e46d31fcca84d788e4301f0e7f204ad58d0f7d85e9f31ef4e378813cf8acc411e1fcf751d05f80ddf6d1bea84803ed0d83514a666df477da5e7920760071df7f536b5d07f41fbbbf9eec300cf185f35d72e75bbbd48e44a276e8b60f2c0ac1da42a2ab46be2c4ed7e669bb63020d236c63b8f8ada4284ff330ad892e04dd32c8b7882935b7ef01ccd530a8d5040546e35dae6864672c5e7696b0e1fc1153faf1b8071ffd66ce9e46732a3f897ed4246969b0f507a4013ad2afda08a1dad5e0ff5006d4c55332ebefc93dc7a8f8e285a78ea7e5bee40fabb083114544e8c9ad97846e91b60784b26cde528a59fa973144d47981b3aebe79b81b3edf0dc19829635e259ef8092ab968bb52cec50d5befe9430f110b8a766b917e4a1f25efab1c0be51443b2e18ec9896623dc13b896893ee451ddf1009f4ae4b41b4db4fa694e372123c80d1816a977e9affc6c84b0c5eabe272c8b99a1de58c69bb1e16839878e1b3b7430352c23db4cdc75f8f8116c96d97a4801dce4ef96bbb092d5c3858eb8da429043c037fd5d959491de9c2146e93e30777c52d145459b443ab892b42c5e66226470429f00a4cebe9647f8491a8cf433022481cea70e6f3eefb15e2e2928c8c138dd42cbf459fe42cd5a95efb22603693120f344df993e86fae8ae5a4dbd070954b24825a1232e087e40fa7dd46074bc4b99309cb38d1004a3860aa25fc62be0ff18dc14ceab65f7f120af5949e24e139ab6be3cec93eda031b3fa6d29ea3d30833787004599abf96d233dedd853995564a0278e5252de42ee96072471d244e02636d051cc9408f53c712b9f4b5c5e6cf27ef3f8ac73ead22058b82d002548d8313d40702c4485d4a43101d969a4a43f8c79a8e4c49d1a38102096f19e8c5200ec765dc32d52297cee8c4802f9d473b679b9d0b96079755c061728d812af68409e07b2b39666fdd661a98781c493d3b90365f2df49ae03264965f64b263595809018c4a9312707ca47b146c0928acd3070a597be47e5cc7f233188b0a0c7dea80bd21d0bc43e5141e6cb0d262a60680309a346be21c6d94ddaa36770490c4da0555c44421852e3218820651b56bead1b16848747a1f8317ab7e51af4e9ade950b6dfc1b7f50cc35473d7d507dc4ca25edf73e2c18d24dcec021c29a34851baa078831dd12214fbc0ef19e65385b151b5ab96e094aef1e38d03731de42da1c979e26fdff76911934f460e1e651996c208c4150828cc084d4302107c2162441dc13bcc8f9390ac91e8bedd08a660a2fc407019e3e5af1022f8461bd1c1ade3be62ccc1b50c608cff72a1af297e227e0743f8caf7341eb26a9318bda12cd726b542dd77dacaa159e4d735ab0b5626d1ebfba44fcf7be2962efcc01d76c9a8b4094bb51685351bbd49fec3fa35943544b04fbbd1f023c363761b8665d702e736c2639ec53fb5955e35cf92c32fa2177f5f268777e49589c248d8b1ba4d3e5e53e974deac8fb2d9e4b032ec2f82e69429006a4e6a3238fc5aae1b8b465fe6d3b48565bef4fd94adf8c30f1766b5ca73ea990259d16273e4d4afcc5a3195600f019e1e86c511c3da42744e5c8f50b47e6c34d6f0d5fcb008d753d367a37715dae13d877e4654a72869cdd703d2db0e7b54d8ce5a9e8956310ca318fac38e6dfbfc6888eea04da85e16d6925458df3f334d8ed2e15391cd271aa6835bb961d13cfb2a091dfa852f46f096689749e4af6efd5dcacb1c9a7cb2ab65fdd1ae78a7638688f2547d82a2a6a0153f13cd70c6f40c4d9e61222ecd9a64e66ca5ca5c5839448c2bdb51ce6b47cd5b01110a0dec8c236636eb8dd427a6ef33ba2034944d86de3d9cfa9df1f0f1207194d92b428900eab17ab18515f2a0f454cd8715a8ed12fba32ef989719b6b405ee2b356970516083553fa3177974e1a4f8f2594219fa444c7c71f3fd8d37fd72ad1e7b495c89726faa710b9847c780a2ee641da86cd0661b050b5e4adfff38ade4bbc6cc33a4aeb09603946c40ae86cf9bc220e5fdefef966b203a37989900380377ba6aac4f9006964be00bea965e7b6f81159353a55b4f2d351a2c3d81eea1b7c6d8cd0cc6a0c229de70efac2b6236f8256e38e49d33c5b9de709135465e6b404d743bfbc66b83df1fb9800bba4c92b4239d3f5723f36a9f70c01f1652ca055b604f6fffab5acc14a44c859fef781f3200251ef20624de5c80ab2e6733dc0057a3bcb16f01f8fb68f08c48cf177f2ce04f88706b8052716fa274379e65eedcd38c3ea8e046c0925a890b421feebc5c4d6649bc1a3ee6c4474acdc332658cfb3d8e57cefa063c4157c24c1a08c1da1dd7e8eb5a849e6c5771ee1a79b9bf30fc243e9a9bf2bce658ef50b139202d32f22e4befe4412b4dab8e00dc939aef655ff5f1798880d739798fa8fd17fcad6179af03c9d1c6722520ea2796d95c52b487415b672d1ad1a003c74f623ed4bee004d8b4fbbb9aef6d5824c6eb9384a5891284e105e23758d488149893266ede292449b4180a151f90d1bc632d5a9a346d823f06b8505cc93187062902671187c76860958135eb6f39fe1f80dea703abdc46ee4100fff1af3180fa75327973482541bbedd9d7847ac36dccb4920167585fd1013472399c876ef6800195b5ea9bdd30ca11745756aeb7815252d9e22be652c116458e95c3ce44583562ced51e0f59c60995034df897a0d93f0008d1c7c26f97abe8a8acfdf05c4668fd203f53ff2571f90ce913d0b1f9e5e120b148c16900b520b262e7b19a0121b9554c6d42f7bab526ddb851858a3d37f75965cfbf66b0ba13274fce6537fd7aa4efa5d75195a400018bd38f7d8cd53fdffe88df1837fa06f1bbc1d9af368bc19a40bf0606355bf3178bcd162f367c7e09a4bcef4259473c5ae46b91f632468727ed1a91e7735d0ed772279e11137d6312d05478e44712baad359f7fb097b85bdc392ae36bbc11a3dfc3557fd9a0729f79f5f214648df7127723fffb84f34b8005d97273099c34628f03f943df69d673adaa184a49aa6ed43733efadd9c19ab4533283d957801fbb73986572a8dc13902c5139731a08e4606be9f10f357f006932d8c17ebbf45e2f1c053c94ac73d475848fd8374c35f25783baa6881ea8270f3330ddfbdd855a3de6ded11280dd838434ba66ff66be031a2d3a62b0fbc97926b2df1ba902af9e586299e5949c559b5ccb657843d01da138b6cdd802635f714060381d2ee1dfb50f2daacc637598965fa7158ead3eb15723bef95904dbd699dc99e054f5e19228d29696082792f30f1d565f1c8409359f7bb4517820cbcb6d5bee4c5596986354433bf02b597b1160065786a460a5f6e4a -MD = fa47305e71a8e1e536486a806cbb839d813caf9f - -Len = 42488 -Msg = d2f61e1a3e370e78db7a356cff4e3e0a40800ab936d79b89820131c60eceb2cd979c4f1e691365b36a12a1905ae8689c59c876afaa77c5ecb648b051544a588c47c0471008d15369c781c5ccace0bbf36281cb28d62ee99f3cda8b0854d70b65eb4a4c19a4dba042f8b1e9497c9dffb86295524b4365d1491ca10a1496de92ff8a21a761c49814e80788552f5287fc9262eb5341788243935c84749da2c5b6042c2fa00ff0707600fbf050a5b606792a696b1631fdef0824066a13ca01f63f19d95b7e4cb1cb9035ddd024d3318240277ffde2445b12e8a6213d2dc43ad7f5e89a8d8b3f8d11282cb40f17e24a631732ac8901a11955aabeb6e40bb3d5d29f1976ad0d110eaa0790889772fa8a11c7f3f9f7b972bf1f1816cc47f5be5a4e075476a44de9bcfff507624f7d4278f518116d2f53dcd6d7f8566b4e320d52b3f340a15893f01e76ba39491f7fe39c75d135111a1609e5e713269be10cc945682c85ffb2274dbc781dd045efc2057efabc06eb9e4c2174b6312c65e8c91ab9d77acc989a50291e6ee7715ea78ccea7ed9f2d06a43b4b0bac1a13d04bb2273867a4bd75f957accdbee0c69d3026699eb4435167152db033319581e5f20f19498074ff9db584fd50d2d0770970d8fcebb9701b18d7687873ad6b1fabc52817758ab03b18b81f452f107f2caa50e9b01762ed3220d435ca548864942aad444a42ed2118efe870abf3e2b58c89b8a3aca919844087f2dbce5d2a48886a90adda3a128f3f292fbf5823af393fad914c192945fbea551ba4ae16fcdfa57458a9eee55fc257ce74537447ded4ee1fc12d1e1f4d1bda9336d68f0764f1904feb81aeca3d8109e79f7526e7d94e41e5328ee4149bacb8492bba9cb9cb45f403337d43711595fd7a976d968c076fdf09cab7929096762b7de298fab39aa4779916e4d5624dc7da924683edbdd0fe719273ef5119a640dc3942b8d47d37d6c1187e008b264fdd483493ff53039cc59e89147f493933d47384356150a00ca37b8852178e44819ff16a6628efe5d38a0ff595afa177a5f89767a3dc96a37fd34df17a7206444dd77a3ba747eaebdd166bdeddc7825b6575f0e87272cf0efa2dde5cdd591aaf1a4b8eb03ea46b9d23315b4dd60f136ed91327128b68236ae47ad7d06513f20b4fc4d3cf14879b840ba2874867cf7d376a99e4ead609b93da582df56f9eab7e3560af1a20f38a227fe3396da784ee73f80d1ce7a3b9cba12a50d9ff5812491bc96e5913118fea70e65aa3108f2d57a0c84818ec9a3684d6e4be3bfb5e60aa720771d5b821823d2c2a6d0ffdcbbac5d28dc72ccdff4b69bdb01cbe69e0ee422966179f6a0f5ed4cca2b6da95dbc1bb91bf26c2fc518cecce02f8fbcb9e2fa29a7bcc30b9099a53dae5a49d693dd6ab66b2d375f82f5f807063bf5eb0d4a93e5d9f0c1415bea92cdf79d2b2f8707e07ba2f49a051e757c74d38ec618a22ff97eb7653c410ad2fe222c5bdd5b4020c63147b15ec9a27fa13cd190c9ed8177721bc684fbb2a5382f67d5fb2503c61164ffe3cb4b5215fab18788a9c812b10c47e490b3c83d32036ec27be7cccf22c3020efdaa29497fd0f27c7f42892f3ad4c0029c5b698abb1d035ba5869a665b1de8861db6c055e8e8ad443ec1d6eb25b9249d72e5a740476d365bdb40567179065e8ecc57d81f592a29064d9075ee79a2bddc9bb74a07dfdb4feaa57dca978568ab4e90f5384ed97eb0eb35152ee13e76d1e89e3b1a898a4f952f8ca5bc81862a18eff4f8a98b71cc881b7dbacb6c7d1fa9e903d8df6b50b151531720f5d78434ed997dc8f37e28fcfabdade612363d848d0653f5605839e9cc7dcf573d40886e7273b5cddece06f64efa4d00cde8868dc46715fc66f64ee04bd63ab05b6498c0eea6236f322413a2ccf9e672c22960229835d154b9ed967c1986e29419ecbf12ab594f17b62758e9bce3ffa3baa2d42b4f980f6521e619a67db44f6c3d80024cefb5c22b3380dcb165df21fb7cfbe99032b758976689e047be89079e90c76b5603e2031571d6a7e41016d3e2d2dba83989bb33524f7df245252c9494da6a01182f079a3b38d2c26805af9dc082ea170f9ccb29fea56b588afac57eb4e310cc7aba4d1007501c34278cd307fd55d141f8b210c10330fa18fc857e4b687262d565eedbecdf805b0507edaa9a0113382bdd15b283c9b8d33c850d7d8517510823bf11dab62d91373ef26f5bdd3584c6dfa70bd8f7b9059dcb0cdceab32846a9be726c71f7584c5ae6cf5b0f59ff6f24643cddaaa639de01ce7838ee5e051aedaf6447c935c876690586f9ed94c89efac286d35117b20da74cb36ab10d15957efd7fea09fbe5da0fa4fe911e18f9d7ef016c34f5d28d58364da4b95a48c07e01b0a99c5ace173ff2c9216bc96df8e3ab2ad54abd60308857da336f11986e9f21d1cca6e438c66cba7fd6cf17192f8ad745ab5bd2480565b1f948d3008387be8467cf50cec05a2a10cb050430a604931b58d5b05c1272b6edb5cb2c4c9373a4d27a9ae241ef3b419cb796533b9ce1c81e6d3b918247e145b213a4c320509b19b41315a4644bd179054a720460812def898bc5456c6eb9d8a91dbce0a24165e4d13828de605e859af38c7f5fc9df50d103bb5b16430f623879daf9cafaee3acfd3f4bbd75cb0bd6b1086a6ab9b3db2363504e54a2fb2442dcb5244cb51df83a05f4cb6d881c7e2b5013fd0320124bbe6c66e4b2a57e0c77e478e8629cf9da620204a0129f62d5d4071bfe33a211bd3a85f0175fee42053f59495a52d9baf0d17bbf58412e46a94d4060fc90c23aa6245a8c64b0efdfb50585b6f8b1fde9d1e4ddb5528db7304f139683668f03059d08648c4b6a1cbf8267043251e47bff043892673d3cbca85db36403caa2d70b18530e8039c01769f3d05f5be48ec672fe39544566e2b1275ba95362a750d0a39e90e2f8ce7742578fddf1842ef58fde26537de06e243725af51cf107b3d6267964e7c6667d43000ccfc555bafdd1aa9133389c8c155b13bef6941adb4bd1eefa5f82549948b630e21980542d59a096c5b45f25eff1bb1d2824c458af2546884340a8822e2e14dd8244d9bca3eb0de805507622375dabb721e776548a297d1cdd7121f82c19a72e75b99536249b5fc9da6f433a6d40720930a770b6743fbdd34e58b55d9bf0b54c42df7f69b951e060cb7990169884593cddcc7b25754f50d4205f2c5a849b875f711d5efe69f5d6d660d6235dc010a878b0be5f4996417c48daed4d96ee01658e8bddf99c3d6f8a5221efc4b8edcca7e432e6e4cbdefd8a570569e1bae10c9601178619ec3ba744fd972a3dcf28a09da9eaaad253566bc228283db06d65a364e19d8086956d864cfe49f055497874d4ee6073f08804746be4cbd0825883ae1556a5320840dbf2e97ebfaad3cfe63092dc1daa0713f2feceb2778a1f224216f287b80667958cd464a582be800879bc209ba8b5df9b28f234bbb2d34f74abc1439d5d636a3b8815059a1996249d3900c65289fe40c9ac39e3270713d9f6c49850bf1db1dbdbd79b14860c9887352ee5cb2a49ebf24588b9241dfbb2864f978360167f59801c8250d990e42e70796151794a6fe6bcb6c45c3ec518181e282c6bbdca0bc121a78f1b9ce128bfa810d92d16da835668c566097b48e5ae69288936ad024952882309e3a4a060b2f8a49e62eb040ea3bc1978a821ceeada2ef8b8ce79e6c2747c39f5923af6157126dab9d740ee9734815b0120797eb005373fc119699ffd90c4915d0fa60bcd63fa5c31735dc0a6737e320a5bcb81be984aa6aa01c455820c29d24842300613f03ed20e2089a3c3c77d479a405fff9cf930d57d6dd42fda5273a5bf1320106c80b8e359c50dbf77984441b9b77c1fd392b1734244df568cc86ab1c96abd50627b31381949313b494f9dc96fa86b09eaca9428ff702ef220d8d59f6e2f50ef7c4a727956963d3fc2524e87c5fb75e66908a39ebed8092a1fe97e16b64a21144353404d189379f5680a1f22c298e0ded9b6a47a8664b72610622bbfaaa378e83dff665c68282d83c6dfda436f68f418c13b606760fc820f7bada54251239d93f4b6aa4f4d3da011613a4591d251fbbda9ff9f0b5288b00de831b446b4b0d73cf0e1d6ced0ba1bc8c3812ab5f63c3bf4196a280e67f08a47e0561f73d933700bb7e6b080f887e6cf731e4f56e012fde69ae4c519a41c58e6ea84b072ca95ae29d32f010ecd8d494ff9777c1d9ab989bab3d53cd413f562118f232deb8fbcdabecc22901f57b28c70def67bb12b1b2799eda556e6bb61eff1569b5f852e923bf12829275c9fdff659a90113bc9b1f1fabcfbcdbf8a44949aec7550ee9b1fe1beb71ab8c6dacfdd033e2020be3f2acb817e18293b1d796b66f6ab702bf1fe7c0d42e1088f986f2622511602cd039ac3c06ab6046ba5b2e7f5cc82a02ae813773d3e8bfe3a836a8f458bf833e2b7806f19fb6bcbbba38fbec9e6817d85eded57c1026226524c305cef473d3099bb5a2200b89ffbb5a77e4445dd2e44a783ea923b470a0d61235f33820b6b854c9fa681071ac920e421fd0d1c08ffb21a4aa9bb0e74ea1fd1d955979040f9ae95d4e400bfaa8db7c1938a9d9f026c2248928936ad0498da3ebea1edac906e18efeba1257ce0444cd87cb56a5151fa31dd0c3799b98e8cd90243c2ca39723f50c5444c63d144834c836debf7d560304d22080358966b4c78c71936a1c95ef3e2a08f74405f5fd1336cb7ccca8db594f0d2269af7c6334e45f7af8c08cecf125b2c2d874f798aa48dff1aa6570cda9eb947e85d0beb7f08cd0e672163dc3b1106a29f13e5b26d73d8b4e72721b547c402fdbdc7e96897028a95d0a547543b8681ce6498b78c60c59028adbdbf29758b6a8e177a24b013d1eb089c7637d948d968ea1e84197a1d2040b4eed883dbfc8b5c6395d252649ded8ae0fb1299dddb9008901d74a00deb0a67042b16144f351a5508b96ed6f86dbbc6a9ad08f1c47c210d4ae1d8cfba62fa7f70d2e4f4e5c7dee0f7e2be46ee3bd34aed02d7d44f9322d3951c2f1d021d57069576d38a521d3f8cbbb23f16a860aa74059cfdc5b1b90be7e92cf60c6762d678dca74068f6cdb2c4bea86fbad974d7de9debe92aad7652d6c184bc026cebcf52d0c4d9f55621ef059b25dec7d3f0b1d71070389795338e1cb8c3efb38500c820fc500ed3f2d23adbbbbafab23a5cef1a07ba5a710b791426395b0f84425a477fc9e93d694f572cc3aae8420e7f31d603ee3acd6b62cf8b8fbdcaa9f92740c3abc3e10449ee194b39e33e433104e81d212e621fdb4daf6ab5d0833d86a66cd35174f7e1ea31a10ccaff1d8cce8e081afe52d0b0452e812834fc2548b13236ecfd576e64cecc86e7e359167d3b5d1a5607f5f72d2d87ed5a89ab214a0d6d2776fbd5d4fb5c1113730f7ba9a30c049754ba8255e518ec6c683067f7bfffb9b707f99acc1436920f24cbe1578cb516f7ad92827d868bce56d7a5ad29191caa7e2662f0b45dd2e1b2739524a098caf6b3b72c60ce7ffa90652f660525f3c8a1e558c4720e16b562b5f5f7b00555c2466407f4b7d94ff9e4ffe60dea8ece985284f59ab969fd62a77202601df6521f68812668021e64ee3e8f81e9d7b408101eb5a3522138704f228f5f6ab9140c56ef838912aa1e5d5c0fac89a657464ea4792fd88733fa0def665633742bbee2ed4df3a6614a4997c7dadf73afd3b5f0e9f43c1ba67c4f24c7d57f4518f0878467064a14f05d30b2c61280c682f7739d350262c33c6478537d1252fac571de5f389b0f4b3c4d642cbb5948f8bc1d0fb23a465c85b5873628538f89cb065a53d1f69eabbfa1a544642c118080a7cf0ace5e1251d9be4ed9020fbf8c4c6804688b1563b7f8bcff5207acddd004f287c54015091b159346017ee624c2e546fa8cf9199cbc6d0ab62d75a210bffc18d1ffb5e39ce0ffe0e7200d9b41d62c4fb741aa77ac11b30764373c905c98bc8727faae6e407bcf33bcb52c83b92e97cec526fdb40450313f73ffdb1c03f2ecca14469809862419f831415a23dd44ae60ae9d815358108e1f7ff7cf99b966f35e0173e149f072769adf55151030a0d681ce25c3d9f9ab1033e2bf889def6d66cf8a0338b3f1ff6bb83150fbcd55dbb6cece4033bc7bb86df946a7949d186ecd7b1864fcbc1d234fccb1d57cbfaf5db594098d6f7f50a10dec1640821bb6f38dfd2719abd6d476b934eb42f66bcf9f597e1a6dc5971afd6688cc2acf9e6d843ec250b1d498aa722ead483a1756192928e97b51e4a82d361e6be2c6eb998ea936770f9df586219e2682532b4e032e739a6296da2b0719e37be1f4954491acdb2b67ce6e8d03bc632750868708f77217247617872758737e25a77c26991b4a828431178419b5ed69a7946cdde6b7867c5d9057b967f09c7ea208e3eb279ada37b75f657f19f1370a2dca70a055a7ce2bbc4de2114b84275d57a2c6639ea4fe835b3f52c00c6a1bcd307f3c7ee45cdb9db70b40ff606796a2dcf18e205cae09cdd67d49f77f652e3b460f2ab9f15b115ad454ff04453f5cd79871b591e03a9eafcf85c575d196c0dce506c5f22b0711ebaac766a0486ffc7420afd748d7bf2f819ce55fdba163861a740288b7f0055fb890bf3254087df800fbf86da591c03eebc51873897d5fe08c996efd6bceca4d5a3cb8ccaff3edd1f68107d338acc23f56ee9bab1fb3e062abcbc89e8e35ba8d38e550a014a9341cdd564ac2929759b35b5feb510ee3997ed0618be6afb37a71ed4103471286e52b1df24d9623cfeb4d51cf841fc78aefa7c311456040d67eaddfc63d4c3a1b759f40db6cd86ce4fb3fd283f261da28578fdc516185d20d3b9398fb8b09fbd569ebde883503ee450e3d7633b2c1c73a657994888cd1e3c635c5a147692ab85336935f7f32a3288e98b8854541aa1f4f9df7744d13dee69ff1a671304409200360283c26f2209c102f23b83f3ba532b675ac040593076b08f3c8915cc82fa3648b0d1d15d016b98836116797ed2db22d60e9bc5886e5e18fb0ae7a135228c304fbd44ad268f0213542041bd5f2be0e12f44315ac6be4daa2bccaa3fa7e6eff5346f06dd3394733d5d77e5d7fc8d0b6e5b44a9877beaeb6d07caf9778a98cb8de00f3fe9ebd8691b87ae2a50bfc004d341562cd40fb8e169784cfdd247feca013ae4165ab5228ab7b80c37af0f8b7218c8c2e2caeaf1d7a66499ddd744e192582938b4b6fb3c7e18d9da357c53b7fe43dacff2f0745d742db5fac20fea08cb9a9751418824ecee46d3614b40f50c4f5e5ec785ce16c3610551b7d400a13d1ed06b78e45598fb824a8ce6a2815c520e703bf0c2ed36ec463622183a34d24632018df5c5a7be31e12beeb461caf051e2825b93d2d43ea1c9c90e641d33e3ecb135e4100d050055b4f1e012b1a019d1749ba5f7dc0b94a895c5ffe5a4833ef7 -MD = a94d7bf363f32a5a5b6e9f71b2edaa3f2ae31a61 - -Len = 43280 -Msg = 9b5f37f5dcedd96d9b7ff6d852b77ef90498311d24dfa906b2979b28a7e85a1893309c41855581d92b59d1133a2e859610cc8a2f9982c1c26f894a8745df027285524af338db0be0272ef7b03f8f11e93ae76fdb7c173e8f3b8c08fbe3143277b9f0c975be2a7e6cd629ee15298227daca11688c9749295460c85bec4b2ef10e76309f2ddfe8e264816f40acc0aed1510771fea7b0bd89f92464cec243d6481f063a568562be3faf702b74dbccbc16363b30b895901e6665d089e6e594b43d93af3776e311539e37eb83130c1453ff71ac751fbeff12c982ab5e2dbd066fdb50ba4f85b1b25006e33a9fa4a6611c92eba269b98ac441b937ff0c2ab360b0273f6fa90d560e5c809ba4a8af117bbfd98a67341162a9553e6c12ba652d6c1e2b48156e953aed20134772c6bdb42ae3dc3742fdacac74f360092e916794f062ee54f5c5a6c51743c7d0ed2055f93630a2db7aec14d1eec528f799b9b751b523784958d7c75f536ea41c5adfff476650335c582bd03adf739d1c9b59ddca830ad21184cc80706a49b314042a430783e897a424df684e0fa5c7617e99626921bf0392c2cb5960257bfba0322aaa9f55a3d699263364744502afae88a2cd9559e913b659fcdb974aad84a92b07bb78a426f925a54d4d164b325cec039ca6b5f1300b6393888d7ea186571538e8fffa381c082feb55ab9be7ded60135af7633b23ef283b697f77bf4af7bcea1f5fc8dd92b099e3e74046be2ae26d76701c37664b8d0fd0b50a2f709cff8baae583c9a4efb065ce7d1e2ee03495355e0bd18e6cf49adb9dadc155ba98fd7c3a7364787603506502d96cc8c14586562ea09faebba97929f6b63d80d9c971fd0d3baa3bed78112625ae84baddb8265e8cb0df3edef4a8697050c7477aa8ed8c87b09daa57b86317ab5f1e6b922705aceccf38a54340b9289f1ff70ff9b1d0b95e74e74a613ed6b8085d92518afc94cfc35e048885282bd5d7865540f36ebbf1e5faff728695dc85c13c890324a3644594efeb3f111560ffbe066a90e44a1fc4b2b54ed93437f51f7a7e5b06fbd5f48cf5e7555f8382f904b7129f6648de6ca049266dd4e6afb0d3788580c38cfeb6345af6db60391b7493675d7c378d9633231dd0d50c3a6780505004a2cf347839aa4870d5c7ce29341a2329799b4f0bf3bba5570cd59be9e3f4a55e3990aeecef7d22f7dd1c9f46e8079f192fe7f9aa3ee873fb8dc787c17c5ecd04adae38c7581b8efe69d548fee0fa1faef7d419eb75181e60c0588a6889fd5b9a877e8e91f403e0e7046837abbf50495d79b63c5a26f8e9195d1f1059cd3eb5824f97fcc753d4dd64256c07f7e3a880a72e24bd70d4d97877bc71c61f96b18f4e7e712fe1e7fcb8d85557264dfe717a0e7d9629c9ff58511e5706f82476e42d718c90848c30ea27c60c900f2850398a15f0810db016e3e77fb52532f2fe55347e028c9700cf3b8ebfc3cd4f11996f25301f8be5edac0ac01e7f7313258d7328d678abd3ea035f7228035552942a90ffff630d2ebd3f4b6f7cee76f516c4cc7f1d47a4c7c28dc4568153deb62a942d6ec6538b64b941043a0dba87755104dfaba4f7ddef04bf18c07e3dbfe63f66c2f647799d046c41f3d4533c4af05eee0b332021ddb63b27bb3451197f6f5d02c02ad54da8aa30b268b2e01c3812bae10da9f13e1ab9e0582a26bc8f93ce0df8c371023834b2c132f15a36b2b548df8e2574aaa51b666eb0f41c02f8a36eccc93b7d50d1d7aa78141c3ec99868ff57260127bf0f664860c28788e6fd14de03f496844392f81dd00657d50b45b9c29c791f47a0c571ec411d82f1baf56e986dfb733a5cf41c79636a22b18e433e2f19d7de38e27fd4aeaa2244eb118a273a455e4003ff9dbb499cb00b58d5095c9179d2dc800696e52be6616bd96d23c510348d9b85bdd86b0b0688703f42109b9616ea88c18f9349c0906b5641204aced6b619c4141a3c923a1b540fd987e171a99b8f6151e00d7929229092b6fd67baea448378539742d753559328cc09048548525204d5aa5dd9a23781bfbf37130fb75a4b16b8b78390e34fd6596b37f23cfee5b2d1b1411d01e829bf2bae8fd533ea71e13da7ed675576648e204ba7231f49b022566936b37857839965294a16dde025d64bc5bb769b693e3b0bf1d91f82956c3111820dc9b37cdfa10a9408605434e0aacf86a429e948275d7ae240502d7e546f818038c839c498867a933d4a3d553ccf476f3a09b5afca760b817f6d7671132e24e84a2771cb488a339b7b2cffcd94c431e3ef8e86ec92152c73d8bfd3fa22fd7a2eb47ff1fd5a5cd4012481220a731a1d893730e3ab18ab5c2dfedfec960e7e0fc7fa2a40d7585eca88dbff3a98624168c393994247c8a92904544626c13ff044489dced4e5cd00858703ffbff3ecdab2279710296f1cbf01bb7b7af8f82224c62511c634a522f2a3803efb08a97d367829b43e1f7d9f2d74a7d6e6f9c76f6be3e1f8b8c691f4958308ef89cb259df5394e7d8b7affcaa4f05de9229fab72365c13b51f3148ac89c28588247e04b987541a4580f2622996134234b66110d5246d1ec951db15d51fe08aab4387a36a7d76f1ceb6ec3136714c095c0ad49402b6b577c7f94aa5e8f85b8ccb6f7eae2b3810795b75ef096bd718f791a860a1755db3c3138df655627392006b10c96176579f258e7661575437e8a1a8079bc5b799e6654e8864c0cc42229a0cd00e89d65c916ada10f9876a04599bf1b0fc7d43ebdbf2cb611c54a0c49b9e13159463b5a795ddb0ddfe2627ccea5af13cf934a4d3f2e03cb093ad6a7b5b91206a21abbec8fae2c55605b00811f94338f4288854d2c9a1f4ff612793e6e127b7360cbe3c415f0e69e1a6b1a55425093b7ee0f4ce78cedc9695eb5fb797daa64a11dc17c8a120d5213947b76a03fbf17b45d8e69c3680e4941cb8b24ffe96b15b760644de68fecb8d956f1de0b1ccb07ae176fa288c7e5e700c4fcbc79ba3cd5deb21c207e9375601be837173de35baacca218c0deb25aebced2708a8ef904ee3e9a51bbfd269091ffd3b3ecdf9c56493788f38b6f30559cd27b4f57e7adada6fea06be709502595ad9ecf24994da62c175166cae049be44354a01eb2bde1e46474cd26c4a1a1cb24ed1f2861200329b9383db47dc057d291ec4ee0e03943f154027ee126a8b5d310af483dcf3bce2ded3a8b9c8096d7a93b6737e8817d8f85d12b828a10eacd15a0890ecece38a9e3c004768160f889ecc25de1a200eb13164e487e6e0e0835e74712c947f8b714eff42e950f9975fcf1b928d28a09128d274df1d9198881bedc96c51e35c9379da6dc015d93849f8f6c7250912ce4744c3d32a019291ae79679f2286414da2aa2acfa3536b9dcc5dfc1908d93e72d90decc9efbb4f93f9a7b23fbb531618600d276c122b6eeec996c75960851656ee8b36a053d4326611acb8f15e40ca8677a9b78e36264af4e7a941cf589600412fc7879e80d3a2d19f905ffc33d6c55f8c86c37b37cb6777cfa051c2159366fa43c8c90d9e40079e4b5b91aa639c706b4aad347c3ca32d3f2882de7cc204af4ad496e233d4a4c893bc163541161b31715625f0d96d3505139b58d243857143f9873abc594b864f799bc9330a73d9713b5bf6e1daf30955bcd029146086638acf06bb3dc62b6e03178f7a734da360998fff29eec7f6a786036efd8c1bee62ec94f9214fc49be44c374133dc52ce380f36eac5fee79d9801ae1edd22bbe5f4d10f0775d999c371929f58fb58601ae73df8c5d2fb8311632d8587cfbe8a92a3a109d9bec28ecc9c3d187ddbcfc0b2f7899c3859cce37a90715252de48ce1ef6c44a1704f4ebdeeeb56a58d927bbbcf05decea60594fffa737db260fa8d0b175a29a684f56f820ee635d90004997615820ae84f28a0fc831e6e9ac6cc6d871a9a3c174a8d0fdbb24adb9ce551d9cc8b93aabad14476afeb6e5448bfc8a2d89193086e4164a41d718fc45b9e28b141a9a13ab0ed078aac9bc9eb46cc7dd191f4eafb260a2ac0d9a53b9cafaae7c457e8413764f2d051550cd7801f7d6a5e25cce8a0d8f53dea92f5c4a1038c1d6781dfea2d31734d6f4bc70dbf2d330ccd16723275f1a31c95dbcbb19df1c2483f61e90288b0eebd38e342e2f51a9dd382e69d4f070a84453716af98cff4ede6904aac20d66dd5ce52de18ddde420e6d341896a4b08e295652c609d0d3775f772ede91db92c2c8ff217eb174b74e1528351f06ca2ee702be8d7c72f0351397885f7022894a5a28ae3957954e2c8932932a8c5625cebf90ec2bac637d6134468896c1e6b0799e857a1efb3cb0aaadf74c78c31d5e1c72547dd1d863eed463bcf6892646f78cfa6fe136dc2042ce06d3a2a465c4c994a9edd1f482ecbb2b2c9b509b2fdbb501083852057ce87ae33e483431e6d4fec3b09d87282e7678c1e9423541310d8f82427f6b2f4feddfa6bed57fa5b8c6642641141bd15d999e353442031ffc64cd6d33b58b08d7b8d76502fbf3747e31a038b5c1fe8472be9201a82b588bc47a154e567b4016a6d1f8ca953c2e22897f29779927ada6106dfa939f6e94193ba5ed92152118fd3fb1ba3400069e347d37766f65c5a7daa9104e77847c444cc470ccc50a57741104d0a22dbdfbb22ecbd2fd9ca62c8b86cf5df42a11d4e79af1832973a07efff688c74734397c0875f7da456bc4bcb73ed59f9237a2290c9845258a1a7217fb125e0dffd40d180fbe73c5e4695bf6c9677e6d8f0cdfc911a922007525f9b323f8d70d5289a350464cd22e4121d68b20a50c306136053595622a8c512291c0d92e965dd5c186a53ac5a56bd201ceba5b5c01a0bf2fbd0f1637c121d49cf4c1a9080e68001831975b9d30174da5af34d8011106df7681a602be887945f17d460229c1c447fa3e97375834a8ea79e26b35389cfb6886edaae94ae2fb4bcca5ce731832fb43f408354c6b15a95eeb22cde17727f6d0fd4b8e488153104c9b08bb8a37e4655a7228e2096a45811195caed6b212471bf3635b09ee66b50cec900ada62d589b12010b3dfcca56d888f6554a40eb250479ce36c25adeae5558e33805554d0214f13d49a9a50fcc184b895c54f1299c279721c9241afe6e7661862963263b736b7e634ea590af17b8cfcb3aadfa511c43addd57663dba5e3c7f0e3f47876d1ef7203f94c22e2ccc429c389aa5db1607e1045d8c096196e0201807e412f74677507d0eb67ffc0d4c3e175dd6ed01dcf198612eb17df51886b9b2ffd265f47c1f0feb7d1e4f78c52a13f7a789d40d1a6bd21acd723486b3c481d64264a11d62787e01e746a122e8e85c83a22e0b5b42d916b7b638dd850d2be1089c3564d09e162336f9da2598ed098061ea2df38b0acbeebe859fd97e692f7fb059af119c836aa82111233d3946001808cc241d0ac6a6b29597f1a8e16c31b664074c47ffb7087526c9cc7892985e9beed48af8691b0c1ae379f8dc4c9af51d9a21876868ad5202de802038133897849aafdd06145c6e801eb7ffd41e59cc2dd9350b0365dae9e9aed0e91c59bb2d5a829a94d69b1f407aadbe8130e53d396f97be21a985d422822e386195d4a492963d414cda6bd82473271a17732fc9cf4b6c2975bb370dbe74b3233424f27959b031205f92152b7cf201474d0b5c73e049bd0371c907fbf03a042ddb5a519e0540f4a4679e156dcc8fc2b27c7a09b03f0300d8a04357337a3a67c4b1a670a707c0fe69df4eeb339594f208303fa6231ddfde257bcac328befe74647189be18f3a8b4dd312514f16ab9f5a502dcb0311f58bb568ebfda60310ea0997574b8683b60ce7b07c1114bbe5774156ec1c66eb6061ef833a2eb5e72e372e04807ee09419191cfbda36e86f305c3d5ce9f473074607f9715149497e70571b563b3dd90c8b3b547ed3c9b57cb4d8b62ccb5b12acce0639fad7554911ffd13a552f8f583133f9f7ff10d062289872148c3b592b2420e519e5755b9de8032df2c9057c464d3adb6d473956d7bc05b3bf45e1f7a6b5652c00fcd2622d4ba3f4aa79640c89a6c7691e1ef560fc7f2221201f643c6ba8c56456059772e18207adcc2ef5480a84032c734becf8b9bb18469de16d316245671482c96b93a1d458e0bfb06037b13116abd298c725f6b60eaa9f55a3dc74d374c4ee10f7ce558bbe15ebc74ce167f4276ea4cb2ef09bba2dd38f41af47879c13fc01a2e22ae5ed60d5b83b614f12145efe52adc85f900d9c4bd36e387a84e66d452346d5b0394367a78ed348889bdae4e242063e7dbdf7849ad5a4e77b54faaa26bcc6786739d4fa14d558a994eb8ee1a2de9e374f0ac20d46fbaa6454dd20f12834e87257ceea42a3f5932b7ce9787cc78d3c5cdf60b45ed9af4a560d099f6ad1f4756c88decb67dc564977477cdfded8b6aa5534a517a0db584a65acbfc13eac62340d0352c09047604535fd8e0d2f5dc3aec956c331fad25d733a3be7cc953ee7effecf1311e56d7c4e0ca7064896df1b11614ea04b9548288d7dc168099611ec6ce6f408068fd5102ba44ccbd93be5269ac42326ac99c42060d6472cc06aacd7746e7b18e7b60786a5a6f4c70847f74c139add3b9e2dcfadb3ebd41a39389711cf3e6b2dfb818c4484baa7e11ce29df5428d85c96779f0375067701abb295b0345fdcc2e8b19ebb490876e015f336089f14321b750a6af26fdf023148f657f149e53a602dfa6ac3c90b6500f1763c770e664bceda1dc94e3832ef6f0fe138baba1ea02933f4f58464eee56f48d995b12ea995b53a24228d4aacbf0964e5c07321867e7c8f33c763990d8879609fea2d8c48a08d19b01f262396c1aefc7677c10c9755e8942968e7d1f1cebded2ba26283edeca4fd3407af5fabb7ae1b35d72ad7cba6ebe7685287ac3618ab432f46f6b1e3daab5932849f6b3601b5558656f71fbde1f4fd530cd98434f6d016fd5030a2d51aeeb23e1e6cb2d03023400a8fdc40d8a7925a8c0043f698f9babd2846c6b33bfe0d9cb92d9de304b3964f14da30e79668526365c56d7fbc91c9ca32932f8f8324868d364ab9684e0c7cf737deab708194a3bc92d4ac8c2a4f9ba2aeedb184350ed7e827ee35af06bb45bd0605827824cd04da75b687a86c939efaff9f132ddc1d704210809943d9408f24e1d77c6afa62042190d38550fe0e4227972fcb08f2e0ee3f82ca6ab3302cc7b37ddcffd56d04104676b43c22490033bd18282f91f3f9b014f1041079a5e08ded1c7e63241713b79d99e10278f819c21ff510d75559b85486edc62103a4fc203650446ce3632178bb7ce27ed165cbabe4b06248cfbebd49f9cb9912edb7e04d23abb773afebbdc214822117d82c962f9fcc950a6d7d690ed23cf57c94492d5339a15ffdd61b39222d5c3553d9a6f9eba5cc4172bb305c21c49453b493e343e0ecb3a681e26c24278a6d97b9728f775e9b11c0483551f72135743c616910c454b16513a671791f30a038b0cf2f208f06f44fc9c1685cda6ba94f37e9805c1f5d2c382fb1ffac8adc034018fb6c24b15325d8a694d0db768f94a7bed3761fc538b1af735ad980f788280648c4a5e68ee1b44eef28eb484bfb8bf039b5c6f64695e63d5 -MD = ed76c5bf4ada6a2092e6dbb40ff40909b8ec06cb - -Len = 44072 -Msg = 5edb47d07e856a3dee51f60a723ff8dea7cd06c7f21cd37fb64e00eeca3234ef2a236e57ec2d9a3476726352efcc4904f3b4f3208b63c64c5c36b6781e575cac509a49042aa59bf9d454cee1d55cd4b9ce2e6723681e9eab8bc4be4ed1a2533d3a0880de213594146ebfddc00e35c188a0020ad771948224abbec078c95b412a4e35bbedb725ad0eae7b3bf6809f39f6d1f986448f0f9b4024ed63fcf0ca4efcf6e8a13ad5bc106dfb4f8e8b15e4648dc9db8072a8d510865e1950e42c37a03a99ebdacc6443e2bcbc047f88b34b69d4f170a36aa52f0a7fc20a2f3867e9626c9e040fac4a024e805b62b5f4441b7053af7f94336f65b1b1b687a7fe8829ba1b6ffce8e0714179433f31d9d7af9da3936cd2fed5ecbf2ca6a35a6040773fd0ce739a0c72bf488e8cd039923adc19281b912f87590685a4e6f24903051c73cd0d12a824691e5eb3e476428924b3d62773845fd7c6a4fe40f7091d38565f0cd960b4ecd7ce75cd10d29913659d1c1ec924af2a9724ae732963529da63a28541b50c130cea8abdbcfdea175cfadff3735b579576f7b0b2c86b23393f6b95f91bc64a13ab0ffaad11590f6306f5d446a94ae49b006d4a571806a16c5cfdbec0ce325bdd226dc59f70d71000cecb4d3ff0e9889fb0536638a3f1562fddaa9b70db9197bc2d846a094dc0828d1efba943ecafaa00113aa2dbeea3a7f01bf2aa8dc66ca44d16d4567f1adddd4461f78706ff15cf68ad937eb57aa62d5992566a8c011c081c68ee19657a6796d3425f54dd9aa46f35effe5859ba614cc8fb4669d03e381986ae223160cef635c63a83a15c51e41ff442cbce4d307d8ccaa153171eb0397f3851212cd58b123089b514dae7b75d4820508c5ee46f4363db1f0cf0ac1998af8dfc5b6a4851442d8a4c8380243d688e4693c078c3e96b7876dec4952cccfe0113fa41883da3f473645b403f76569e48d38708aa70114e212a6b2a62f56cb23a56e563f539e5bba8948bdb477285870e53a4b5725d897404623eaee8ba5b5da1b358433fa1a8f2438738c5569d6c8b455377675f00b47578cae3b2a4d02b68edd5ad6fd6296040cad8fc9edb4b5e33943f699eceee24bb24a0d4d615db5f6c652a5f3a47159e1fa4f631c85420ed18618405bc509a5ccd6e909c99ba3069c0ae2e0843011ad4f7686b92b24fa28ba233ddd6407279bf14dd26a57e0063dd0e2f5d130aa29d87609ba57a1d2c44dc59918955dba320de39e6cf89e3971a1bcd7f342a019a1237d3a5306249788c31a6f1330eee71143c9511e7b47adc97b857045f97c8561d68d92b98e5c7c2ed3e22d9575be95ac85ccee52baf945f713563651be6bf75039cd9855b7f3889fc5455c052d76cceb1b14fe6f7e5d08e3b155b0805b1575589466d48d498ec4c1e16a83cd20bd94b64cc809dd8f1bfe759daa663a96230a602e7fceca0bd8367d6f7a2a54163cf6f562119503b5da2f961e7ee0e8393dbb5150410f75c676e8bcb69cd902d79bf990a3162c4bb842a42c7ef9a7f00a0a921142d41ef44213e264fff9193f2a81a66f5800551c5ffc6420034242bcd23396894c5f83b147552a5e92b87173d996037bc8f699de73b0775bf68239b2585fcfa1b60ac7129de4ca93b7036a06aa831b9a3d217efabd05e6c49fe0153c66374642c7ff71810b69caeab6ff8a6166f0f3b5fda88ed602a4b84245855cc1c2630252c86309655b8c304ad6d65cead58495b551b451db0d35f5bf319899a9358a0bba0161172653f4069d60b0650abee80880816d4e71a55fa522ac42515b87546a63ba1e242cbc4a54ca9cb42f29eac45400d5fa0d0191cad153fcab0e41806b26343bc5b7de5d3520b9d20b41b022bf821b958416f19a1f813969fa57c2e8744714cb7c59a6005e74524adc23052c8198bb0832f2ab8806bbbe3d58b546861ad6edb46b91eb6b6c577d4b505e92d0b3a1c7772d2895232689c9beecaf352302daa63cbce7166708d2221f8f79bed8fda2272a9c40193228f24336dfcdf887d75b27ac94e38dbcdaeb290cc0fcf00a06a5c369a8c29e7fb3ff12eb5897f57a3f62584c1e0eb93289ac7a5b0c6f923077b1837c79378cd070b61f26809695c4e2f521637fef0291be1dfd549a5b0b10f7cf4faa36274aee0721522e7e51402c6a1f6a3be20fd1a020459b3e9348c3732f060f3d081842a11f48934d7b505f7c7ce51b1a6df48c28582c3a631ebc2220c65eab7b1694dbb06031cbc99f1c587ac3511c4948289df10ddac309644190e165df0bad89227de574e6e0eb113c95efe46a55109c336ac3e8581f798c5e757cb492171a884b9006006fbcfbfa387ca28a38aeb6919b5d6691ad34fbbf9c39ba5a7eb80c3c957cdcafd245418199775d5bc410854eeadca1afe1ecd62581446300abd4c9cc8aaa2f26196504cfe6ede6ff1561c3fca7513eeafd2e54e597fe3f4d22549a61b280c7104c038e0ba746061f338bb9c25b2303ec07e1bb2866d015eaea21c72394676b137107255e65e985632774afc98dbab95a0aef54157520af7e0b219839b8c8e5d7925812f0a6402b72f806ec38c57e28df0b3f67d54c57d3b28e3e55cca609fb05b6e09de8f5b2c0f5ae27ba388cd7172114b93c8f73de4a2e7a5f4503e7947645e6860d6fd7a70b9352c15ff1682d4fc82c451a6c731bdc99d76cb10702cf1d3e2932acacd687d5f5ebbb248ae4e8997d5ccb4b94d278509cae4ce1ff7f24ba9987ccc0c879bbe6c281fd512c8570bbe8ab33152e1b5c70de06e91d14e7fa13fd083d92ea48a906a31d6f2efed52d7db02165c162d32f0208e72aad6ec0b8f213b56b6a3bccbafd40c5f903295b88a97dc64a965a8458cfc159f7d83495c81d83953f90e38c569240848317d49fe705f9a3c8de3bb5419fb26538e88feb915cf4b0a14b0911e68f4c5ff5b3282ab35bcabfc8df30ef513a8212d523a64c7b790f0f7ae4d5e1d0ba0b60371f4d835571982233e35eb9f067da69b7d2a23fee3a7bb9b0a370867edb268e31a36a32330f0cd5ef30f09b86f06270c43caa4d5269e0b62dd0028856bc44f1cc87a7c0b7ffcddfe60e0c1d7b9bc131e5abe7fc0fcce80fd7b3b26dc2240e92ee122db448088448fec7dbc83831a0b4036580d78d2c39cb9894a9bf29da2b78808d24964df1d91921a284232379a6ff04b39e6335507bf257ba0f05f3a744ab6b40b4ef3083735936e62fb7a53d7c1cd2dd692a6d02578dfc6e0bc887530134957303455886fb1025dc060a2743c913532b08b39e0874a36ef8c58f4fa6091ae86e3c232dc21846d6cc2ea60f5436ea71e5a486312b7c3c97a066e2b26805654b78850e17fe730430fdd213c6386bab1252642c8c3314605eae164918609c1ea5db06907e04b4511db918d7b5b70f5e20bb712c19e8e618ab69fc4de957774ce0dde930ca9a82368546287c4399ca098268f20e3f129a6b661a41758e153ef7e3c75377638985ba4eed2b8ad7a546b620a1105b6578d86278090c4a6d62982796e16eebb29866e561f64987dba4286ce2aef39af5e34704c77e8653ef062de5e17262161d91cdbfa6a9a9fdb65f1b34b0d6c253561b8f593cc1d7187cc8a638acc457800d3a6151054e7473d09bc5157263a60ef0e85969bf1926217d71ab29df1d74afeb5dcba2672cd1729123ce17109bc6542b124d3d39d09bf758c9e3bf62c6e12d1dc0b3bab28ce98161bedf4272c74bac6f6012dc902c60217798f7021d07c7820d2cbfa2d0b6e428a833a09f812e5c9f249b514eae769a2740a68efaf9274e3421689a61a7f2e9efce4bb835231a22b4b28bb19c79f574921dbb51b0dc709dcdc33eeaff2188205f3bced00c41d1c47381f8dbcddbf314e8759ee82bb028ddd55a74588525bfb2ff57848f2dc49c6b64f9aa76e9bbb6a2b4b018fa735b9835d24ed38bfa9ae1c7578b349e9f92c33f1083682bf90087477b35f12f91c708ce4e06232c666a3486f03da8a46a958e67fe85fca20394ae2ac76ef1318cdabfcfd0ec2ce2d27c011851d7a64a97b3450cb6692c82125e73751fc2dfa56c7e0761e167b55645b88fa502bff7382dd62f55c195c1732b461e4d0c9985363a9a26ac08df882fc70628548c5f631534e5956ba673831f5834f6dc155ca98afd1565d7cdbc6b16604e124d761db189b5c8bf75ed69392ba010444ac2711449bdd90c0bb86727b3197896b94863ab3eb667f59c1fe1ad420cc250bf9b418e1c82cd636f524684adf96cfcc08b9817d942aa7f08c342a50aa23362622934dfab55d9b22c22c249ad08138c89c623be055e79a4e061f4ea2b6c49c25bf3b3ce9d3de54069b044405a4f538e3d816e686814bcae4d815f444e72edb8d38124249a43d9564f85322f5dd515490345e0dcaa6b5be376aceb7a1bbb088bf25cf0a94c6e9d3c0628f5df5da342060498e1e4746c3e8c84690056394f8084df0b802558c61a3ab521f61803bfc00d6705d9466e1d4df09e41069e51363febc3163b606953369884f99ca1f73379a6551130cb3f887159edbb651b0a782b08c5068821251eda9d9c374e44e0075319f6464f3b8fb5900d985f85950d1e2e220e62d132342eef92256376c7664138ad712b9c5e08aa9355c8b5ced401302f82c5b27d593f8b5bbf46067bf332eb0fabef4880fc50716379a546a99f8fb41571137ff45fee3e086c28a7c590ec0cc05b972664dc0f12e6c156997cbf5fb4ca35204f9d0ce84edce1f3cebc663cad3205924caec7ee9306750436b0fd1837351613ade227d6c3c165ce03c83cc8d54ff10742c88594feaadcd6a6ae1f62463e5e141e2a7a5fa69e42e1cf51dc3b8cfe671f9118deab5aba3ff570ddede7e8cd534d2cdecb2cfe5abe55b9bf0c3bda27ae02c0089ad8b01de6881ca4314c25ca3fe35e64e3e4d3df22524a7a9570c8b20fd757fe80c507bd19b8336db13c051d68013c258a302d14b6ff08ea3f845d88d2c6df64591a678120ad3c9f365d91af17cd4f8987b815e1c1857d77d11ca28f3ff9dfa1ed7ed951428ebfa18857d066936f1ef9a423922e8d0c318a15e39db09d95df1d049a6315c98344dd6fd3cb2b261032dba71aade360bbab89d17e58d436c56740661610b5fbb654bab37988e716d8119859446de983ba73dece98dbe150af0072da99e51a214c76a01bf01180acee4599824ada263e3211efd4d72cc1347b311b2acbec2a827033f771e16ee0307b5645ead3fc83d84b0d26abe3555a2a5283a31c562cce684812287bf3a5edeaa6ca035888dce89b2cf0ea1a655e96795c7d7279dfadef19fc9b9902cfc09121982b3d9610813ecdfe42a2ea054d5b6bc0a7f008117873deb556b3cd1cc6b21f78005a6a15f36bb7e889b8e36a2c9346a7898693919444ff9bccdea683c03a2a6fd2c29d3c3b59a1134f93cd3d02255338ac9ae00a0948c4d5848353acb5108ba528dcf72f60eed2a61b9b7025d8f9da9c9796b922e069758c06089d3ead1c8a418a123f966a1494ca763894cbb5f723fad2e0e481208d59e7dbd74ce2b1466e6c80cb3f1862b22da7e7d200d6a107757be6e229d0d19eb90f8a56283fc776814d9370bd5e4fb0e664f6d17defa5111a475a0252b7fb83dd2b9beff8fefa94090d4a67821039f5072a2b9dd3bec7fd5885b6aa25dda7240d64970986c64f884fd32e1956d5286bd8200f9ecaea11b3785d83416cebdd6991e2050b9840d03a9bc8c6ee005525f9a16f293d291c8b1bc1f8472fed88a33ab0cc6d5ff713849335139a4f4a393787a93e01e0bafb3c1e7d7e8ddb715d037fb44a576c6be8737964de32a2fa2967fe39b620f143302ca2f217daafbf120420e3864c9abc67a6d5714e1750d9ccbc4499ff0dd68d6263906ae9b812a14eae0586a5d351b1372490a48dd0c2afcb3e42114050f9603aead12b1fae6cddb90a17e4d275f91301f59045c3e55f44cdf5e0e9a172c08460c84b7ddf45263cfc1f3c4733b9faaa6c22bf9c17de8e5f7bea07684bfa95c07b05e8aa5103a686bff65df5f027bd3e21b204f1b244b9ca7d249dd76670dfdd33aa8ff99f735583a99563373247a897c7ad468bbc9f474b7aab8b7e195d05a432bd28b1ee1a9bfa6306345521a2247c071c6fb35c75a0ab1b88baa58d4871da1d499a1b6982e1b59551ba97e4bf9ab7890666b1ba502cb107c21194eab98a4a9f53cf7f35328d7ae67cdb45a426700ef47313cdffb75227e66177925738b8bb5ee5ae257db20912fe9181a68860104af16b5e4f53337dd3626ed6e9fc4e63f402061f54678bbb4586979303b9f4e03327f72f7edd4b127f21ef15df0282f3be34bf0a551b440dda2697f9a45e6a4a903f1e6ea3c6877af1cbef1cbd915dd0e19c175771c265669b85989bd1a04bb42be0e90306356f1df20973d3cbd0666325e116efed84762d4e4ca261d2a71e88cab35ed6ef538c634983852250e8251252abc4b8148800ccbc22bd33ee9a6b2d365f88d0a64865b5c0e02cf1960122462fa42a9b2df78baaadb0f2f96fa1bb0b378d6cd7723b82791dc87128e341e66885724f807ff89d2fe99e489b9be6948a94e514d49d546c1929e55aaf80d3f8de1cbd3b5053b4c0c33793c801bb8e8112170e87b06dbdaafbacdcf26eb5dde012bc2ef7f1f1537bce6037791316c4070b86b1cd512b9bc4896e583e4dc988276a2d6c8a4da1fc56b82d3363baf6aeb0ddaa75efa11e19432936ff483506fb54503620fc4babd7dae9632f8edca17403f04b03f487905cae45cd79170cb25fef2ba1f256d2560d8ecacdd20362603f88ad3102e4eac78f8d44fc6fb3bc16db806334899fccecc6fbc132c5c9357b37c87a231bc7b40cd8698e8989252b7a989060b88edf20b329a73759b0e83b3a834ac0eaf6a6cca75fc88b3c6e744325bda689f4a81eb6f45f1c950b39695ee54c96e84e3a881ae04d35a3dfc7a8ea61734b48b2806576f68fe241100b5385c3b9355817907686ffca353e383bca0a74e20604b8bebb4803e27fa530ccae981df3ae7a0d9f77f84bfd52c41173e08aa7315f26cf09291461807d273325827e3b2189b5f81093580d0f139d3016f5524289de14bf09b6c259906431e0bdd821656c4f709f8ad28e8e2800315dcd0e4a8d110c3750676a3a333bba2a003db768e3fc8715cbb63d82136ea2e86240355ad0f270f74acb4d6437a8097a5b4c283bfcf8b90b443bdb1de70c802b0616716a525393bd74dc6828ad00d888b9933282fa886ebad2c3b5455128236010f8cb625c5dfbef9743c26fdc6ab0bee2b9dd2523d62c8a3df3d1e398eb11f1498d492a363732f77ba8631f0d0f18839d67310dc0077ee34c7539e0057cd444797ef6aa280bc03be8b154228816983fb44537201846e92dc9f1f522e003f4c36872d7cb7afe2b25a6099c5e95a8b85bedfaf64775b9f7d07a0e0b9371aaf7d4dd12f673733afd1b7c5643bd7ced013d112f766b1d882f342775851aff9767e1a1065a8b5ce7bd8734415226840cfa4ee88bc07259dc19c19ace6a9ed4f2cb517df50bfc7d2cf4d09471d080f62e2cf639b7db4671dd3ee09ac0c30936e4ac8c368712ac1e32295e658fc5b51a7a1d9ece5acfcdadb225f7eef397426e9591fa976576858721e4996e423aac381957ac6d1da5f1558457705f10ee31c32c020367373f6e0020aee97933354d9832628adfa86498b07a5ab1b5bfd1be7fd1870f6da4754ed0570db64c09c18082eec49eeba214ac07bdb824b8a746d1e8aea9867255210f -MD = 6a5fc2f4a741f17a2e62b198d65e4a5ff6a1e748 - -Len = 44864 -Msg = bba0967875c4743a54f5b6375352cab3f662f2792e6047cd7dd6fda15a6ee80cd7043ff781ffa11a88e25527201ed644262b8fbf07d6e3fddedd70b4dcb9955aedbb31de985aae9527cc3f7709d3658b74dab8a04f40e43e4ef4f2dc5f42c95345ecf493827da5957bdafa91d71a80702897f684cd45537717430a81aab08cde26c00e80070f8d01ca3510db529a2edb898ccfd34a8e37907ff3400b86ace6e3da5f090befb96fc05d0409bf41fc77b4e0decdf58ec39870cf2c1ce3bbdee04ba7f06d9e012252bc7c706ba36de763e375b87853618b7e014e15276f11ed81fcd69bc0a006f23edc6fa1c0f19f04fb51904057538b8ef22a46d7e8185082d2dfae8a8c79c7d33c087dbe8f109dfb46e4799ef25ed375fbd3fd99e7463f44d9dc79e25890096b5228efef61682f734c8577fbd1dd02e8a2e4bc84ad62a7dca0dc7dcead4f97628b250d5ebd611f14161dd47f7d36e08eee46cbc0c1d250f12fc50474121d3861ece51f302b633487ab92d6517dd33510e7df7274ab00022c8c8154fc0f62b3107f516d9033d6357414cec69a591ac9159598f9c9f4528535c1f6b58f2c87d1164b513fa45e22eb8257b7ec819a756446015aa7e62332a0b3d60e7155f2f25a1c58cedc9433af1e5a7e378f2fc74bcd4b320bc6f3c0071d4ed1afcf75e80c16c9afae8d893be695a49035f8cb6803cdcb30949c1a5439c2afbcc31617973dccc657db9aabfc2d1a079698707e05072c6f04de72816630587e9e318f6585ee46ba583b4b2100ed732b974a3d7027beb2deb5d08f507e53a66280e182843c854a4ebbb8e714cf8f69b99b32a7c8559026c04b513db0240c760469bb369f446ca12a8739b8abef79c459ab38f8af18e552bfcf4bc2c9e1c38e0c61a7f5dc230913f5c4a5040fea154cb2cd44764cf725fc8148a567c23cdeb721718d056363c667577ae6146748cac96d0b3e6bc87ab8edaebe4774c3bec6b9eb9f55af5d8b0a67fab2e330dc8fff02316d0e1d4a2907edef391931f6ede35c14f5e73bf2243cd9837484a096491ec0a7fa9dd5fb8d78c4ecc202e581549d68417b2bf149b5c6869dc6b1abbcfd8ecb77bad1da022d74394c60edda8c785da41c380a198bc60f36eeb2529a7634b7eb48b5937688916415b71cbf5640e389d94d346afadfe07fb01e3f4fb5ee7501e8c2f4ccefb542ae20d7fd61a2c41c8bcf7c7735dd6e8a7ebed67590444948d4898e7e628eb0c7bc22510bbb0641abc94e500a510a604c7426be5dfe8fb2359897545b3f9ba2a8f4e3d04eb5c9df19ad1e71f4a8c9dcaec9b17dfe7fde4fc5b5dbbb94495eb26ec02afacf3835c5ec9d06883d20620a39e527bc61fc78487f931a6c306a1e09a087c177952a901caf03d03deea31c13743150228c5ea6c6ec9a1f0f378925cec6b06ef0a875230be74642370d18411fe713f458898bb0f19233b14bb28db92a69a5fa0d11ff36bb1ece251fa56617551bf4da05606ddef0fbc497c8a860234510cd2d75d7b21154db03409cbb77e7de973dcbd217eb77ecafb79a2f21e9ab464390ced10274fbfda74d5d575932f8e2e3548f66b8ecc50c34728228251098568a56a7c89b2f3ede091442f7867f948888a3ee6b4a5a0e79145f175abdbd349c6e877e03a8ca202089c0b8254b4601f80d90b086d61c9b5ad7e4206ef0d8c541768b1c29342deaebafb98789af6f885bfa859c61631ab4d8036b670bc749946c2bcb49e34440e366046777cabae371d9d8e97ba4f93ca11b225bb2da48f8e94613adccd9e2eb55ba0f335091748804992e2415f7a06aa94abb1cca837dce0cf7b89a6fb21516860e5883d985e64789c4849e3200618c158d571677ad6eb144a6a2fbf817e6a9bf8b68c0db4f1709478163be9a6a438a2d0e7db18000228ada7b573630af5b8c4859c6531f960fb487f951ee14db4f4c39f2b555af26a142169f61b5df237fa7699ffaa26a03d7319153d8966afb8cba8164886acac4f3bf403a48decd1a57e26a868d17873e7669adb8801c627402bd4d8a7c589a8521eba073921bc13ded26923506193ceef4432350d0e9c5ebb93be48c1b87e70e31ad7e73c9d3853448592bd4ed0f53bb5aa63a4250655a0bba1d8f93ed5f790a2eec2162746ddfa670657b8dcb63924faf7c3bb788f8eb790c4c96c77949171f1d92d2671c53983b6e30cb86277cc24ffbac6ed6010b3ee0b7af414f47ab8bf50886d9aa48ec789c49a462e789c2ab66461e1bc842041de6c42dd753dfee9b35f6b07e5480a0467109a88ad9799d143a99ba8ab4d34d4e333ab0a2fdca7b1087f0f8098d4dd7cc61b72389848075c673fb6803c33d4c9970211fe8738fb9b192fd46c17c35f9d01559ffa80f25b28aba7510cd1d076bc8458161f2ddb60f48ff2582ef4ac26e1b35fa232fa2f1bc26b70e9a31e9b911a15963600864c7e79b757094db1e7c9f75689f7766676bfc6211ceee7750dca5ee55ce0372304ba8749de764cd21eaf2a55652e394831bd80870bdf4e779f79175e0cb327768cab9991f91db0d7b94d075a81a4f032189b9de7ee495c88c923cffa361d56034ca84d2a277dfe25302a2ab0600a3f9673e08aee04ab764b3350e534698d575bdd570e9ce9f5996d1bdce10170ac7bf7dc12b3e41f7430114696f3b707818fe2b72e5a44d13326f1f4cbe6c8442a39d8c9a8c5647f422e8d7b5c77dc90a8743a62a4bcdc4db50b66237d887f4b020dabc5291c09a483a6125a27ee2fa550a8c55830b2adefd9db2c5078628105b24c03470a443e3fb75b326b7fc32ab618a2060078b84418300ad6d432f19804b98951d7c2ca6ca16ba28017caa358337ed48f03e34a2957460ed85733a20eb8865a29efe91b2f6a0f006df79eeb22bde1d4c2daf6e4e83d9a7bb331f1106fa1b712fe07f3a2f10a10196e73731734b5e00743ee2a24eb2b9bc5f9fd01b92540ba6840b8791e5bf22d420423ddc3e8ac080074b5f366bcc1c8721f30dc08ea160ebe8469cfd9bac2951ec171355dc900b844f7eaf946d760bf049545f68c08b2227a5b948e61b7fc160418f4206150647f392fd59221c5a8cdf1eec4d7bf2b85a44018d12b42bdfefe969d25155b0947db719f0e54a4020aa3ce9e35f61ead0102945ea82d09474bdd4aa07c8ac77e1b4b72c80db73a0706aeff2611d83717c4abeb8f721a01de732094d5630723096f4db13d4c40405f0d6e0818d10474e6412eba4dd768d90e0567199e80f0fa45a450b15162867374bf5f8de8fbf164b2f6f984fc30a00b40632f2d8e5f0eb9bd6b02f7b6b8d03fe27cf1d5190b2592e856aad02d2635f5002cd755075586eddb23c2f8efd7d40222d6d3821b87276c010091205320b132d7b30e34bbed1003195f2f393f47f866a04d632972e86d7c97556b0a00a8a85131a61220febe2096027d864d5781c3d9f5412f1fb1b76e2115f596d1b82661cc9876a1ce42214f13311f9689bafdacd89c72a5f95a6cb015f741932bdc4293f196952b7148bed206ffb5ae82cc4449ff0032563acf80c9b7c5c9ee8d0f55a58c96922dde650f7fedf8c05cdd1dddf199cb00be48938c11731c0f0759a4082cea22ee175a196baf44a6d01fdd22335a45577e5cc758f73df444818c364cb28096c6197678e88bd687746566277bdcda9e200ba02b625a95a7d9b1db875bed471efa94d9bf54b88c32fbe0de308d32f8e0cf2926e9421ebf0a662073e17420f6ef2af0af81e0aa36e3a7d2c67cc8fe4bd9bf575f859abc1098544de3c907f5f683f1ad66850eb97cf602cbed80c17739c57b36c884bedb40de4eaab99299c4fc79c93b9d3d416ea506973c81d1093649507d17e06b40c4b6489fb763f2ac164f3d2c2bc1ff3b427581cf9541e202c400e75fab45ada330f773c204515db182854a94ee635f2edd34e426769c384098d7167d4146c068886acc701220383c62252e8e040fd1ce8789ca36410f48354d625a607a9247f333a6cf14514f16cf6da56591fd05fb8ce9da9079950996632a092fa3c786b8f5db320819524c7dcced9c6c2b4a0440dc6cbdd36ad319a76cd75202a1b8b277c2e772e4098586d1c76a60cec46b89264f989a0f749bbdff84ddc37004be9428fcd1000f6f7bacc7417c98e9f7e1e33058f5f5a1415f75037da5e3f42759aa2106306fc6a5952ca2bd9cbb6a204dc0d38afd57353b8ecd67a9a82a0b940a7314717df8c666726508be333ebbf7ffa0a458174537ddba25708b8d0c22d5517d57b122517b0c94147da5e8994bc977e11732ec3635a2522bc2a5ad00e665bf278f67b5f051126a8956171561b62f572090cde4b09b13f73ee28a90bea2bfb4001fe7b16bd51266524684520e77941dddc56b892ae4bd09dd44acc08bf45dd0a58dc3ad1a938727eda37017260c922c8719ae522bbf181a955d8eb4ff67da85865d8df18308eb2fea115ced1ee19413ab01f8d839669fa9e5b193069f599043010399373ba1a8dea604cd4c7f933463b812fd63ba97be284cd56c1dd26619b9c41497d6bafa5ac4cff223adbe9ddd8d3cc10ebd45bf1e26492d7c633f09f12a3e04ec68778f7b72b65e0299626e09f0b790bf2d61392a14594e468f4ba19144dd59195507bd855907ccdc87e180445ea706814c73b25c82fbac5cea7ee9847a3085a134d21102e822b33401d28106f799a6f78313a73fe2aecc122d4f3e453ac61f16706d266eb095a58b8fbbccec7bfdd68479b7844ec3f1221890331c5e171c99dbb03f7a4342df185599e3e04f5c4229aa88e5d5f3975152e2dbd100399f826a734cdf690b0f7d9024b90147ba190524ec491518e8ed5db2d3689f865224b6257fceb39f3086ef817b559a8fb722c53ccc22cbc9793654d69ccf051b5257263f53be52694e49b370cbf7f604c109f0f5ccbe70643ef2f5329157983b9497313c91844273dea847e28938ca63524f16c46074b975a4b3bd6b43cacf63a3758581bbc8ea3b4c533b6b55608e17f562a54d19ddfd7a44e8fbc53671112ff96291c324f4e02c21bb0c5f9337978f24d53ae46b62b2fe9a135ef4ebf3140d20fec4657f809ab2f9501953d5069d556b27462ed79b805f0eb3555ed6b93e6794aabbed2df4908c3da300dc8d55f5f732c93570e0f0dc282d595d87893bf6ebdee6d6ceb2d958046934514e4ebe47e1164ba77f19fb3cf67075f5f36613e3e66a33b38ea0a767b7f674694d7ba7f9af701f0a9de52309267289bd170fb97c03c131c0a169d736137ff3d74ea69b81beeac3ed51c500e7549e04f186e89525a07e418cab80f149b3602319c6520176abe0daae3f4c0d4dfd7d9851b7834f8768ebe37601887e18f44192bf3900925ed2fcb3fbcaeca0b38d7b844c2d623107b9a4a82b47e2e63a629ec3263b249690d088f024692983ae7122895f5cf8022d1f32f00ae322c2148ac224ed4150b6b321300fd6ae74fe95650cf7e9cac70b6e06116b9377ba8a3de9763872cff75b4c516c73711f71aa1ec59550a9fb61d550faca7b635a3ca72ceb059e654b9afcb2cda8bb821081fe811f4633ee632af86c89b89fe92f0bc1582c0aa72348be238d127f589846386492deba1245a6b4ed273f7659934aba314608efe34b4bc36841ac5adb120507849a804b6c3e1a820c07688e290051baaf8d2e4fe32bd96d236717b5a38df161d72eb084b23643050d83a16a9eaeb8af6483f885176355fdfd63d12a427a7ff9c4b5cbe074dcc4c04a2276961afd03eb28c0f43a008066084ede653358562511d5c64f09348ff4465a7a648b3e89b80044da9dd93ee16e1ea02d403b25af755ca2e6c64961ce7609a6e1d7d479c34981411771ed1324f2a389d6eedc6ae4e53c948dae3b9d26be8cb7ff5cec4d383ce0b63e0ce03dc978297461ed8178a4f9342321735a471722322639704d3956f6a11c84cb4d0f2d8332f864c8b4df5e25c5e758c22fe01e65ac4a169e71bebe2b34dca2399e17ef98327e45ecf11f8eff84498a0726f8baed5dcc1d53e45dcc4f2e8f0ce45dd87e2bba8e9bd6c0b9a5ead1e23baeca115b2dc904c42d3f871fb700ac2b3806d167b22d91bd12ae2e317c4119f445a39aadab708c9186cddb17072d9c93b123932ac02e30502d13edb02844793a582e24f0ead6dc0bed29ba40b43808ccec2e8e35da1ed2cb928c98b0837e887452c420e3607e7b99ecddb52b52a2594d55923317649201a5cf828fa0f231b038c2201ee3a0e9d3d1f2445c4546ef167b6a09125df40a4565509063000920990e22bc8f80207b8d3a9a18001d1580b8fdb5cdbc680cea0680a230936c4cadab5af0e3f32763d5f04a40a351115309b94aa58a81d413d3cd9e50ed9134114b5fb5b940da67ff7bb5778280bfd073ecbfc8d5ba1300bd3a22f4c911fcf61b7c2e94e85da5c037cf4548ec3abcc8ec9c151eb2c6e09c4daf7f5a97683730bfd2b07f0a9505aeb1531834ca3bc86941ba51a2c94b6b0569866b06383ac06272c15ddaac715aa200a9a6d1b8fe734007aa0e0b75b212ba75614eae28143909c8daaf4e2a9d15489a359996450d4dcba2fda2af6495984a15b2c2a8e37ef1a546812d301152d5e0d28938f8dae2a89a9817a80502503c32bf1d4f9cf6f59aa3605750270d4d0d296e073d800719240b7baa86a2db9caee2c5e34de0def294b2aabfa0a96ae64b70b141efb2361b30bcb218e71f5cb530f8eeb7661b080060218a3c972da6a8e16530cbf80604636f1cdfd511c1124492d38e0bf0a20ea98d9e8360bc2a6d2f8f658107cf01ee7c2fba6971cf4e78c525112853a62c5f588d782a9e88361ac4a5f01687dd2c40d002f3c371580e0cb168204210cf008697e04cf47873c72c12b5a365bebaebc8097977824644864a83fc8f6fe603c4f0d2169b557117543d944eddf32ee0d6d08303b42a832d4dcec722bd0625ccf03aa1a0d1d20adb63bbc3d23e536ad753f6d73218309a7adae5f59b47a9628308d0810f9f0eb8488c231bd012eac51719a7607532190ea5a44c99c6adce2ede753efac331400be7240016c91a3df0186e6ed95d90685246305f2e356df8dd37dbf2796c573a782fd1df4f4da2c16e63e8b98c4b918307c5158a2d57e69e10179387775b6f428f8afc2d2fae4b2982820f13f3dfd41d81baaa7a01aec6324a06325a9f20f7eca4913956329b81baeeeb481aca8ad68c728f959b55ba8b69fd7c4f083b4d7fbd79daeff6f265d51a06083a1a6accf7543ccc3d6a940b8489acf2300ce641652951b0a69bd9cdb3ab6a814baf4f16d4f952f9285447026035daf08bd51a9d56b4decae3916313bc038ebef355f208ee00578edd04d94face2fa0fb8fd62c1b2e463722d9428d84ca6d549d78afe13b0fdad05d1e8e533a905aca85de2394f083ca25efaf0959be3f9e08a5edacdb7bc45e5e69d8cd56f03324542d12028a5c521fde9c25333df10913328ffb1db756e7d74b9964d344239ed6677c9338b668838e89b1a187e0260f14f8e409cc1cd4618ebe752b68c6dcb9b72af9ca90bf1bfe5f4fb68dceeb6539e9822b817fb3fe18cbe086955384226c11c62c1dd14e7eabda573450d005b46fd9f9eccaff24dbf5d6d8530b5e25fd9f2a629df5c20a977247cab35255d71d992d85b04c141673e0f6cf64f34f52753a4c27d5bb2d9c703cedcfb9fb2509a79f2e4dfd6f8531cfc274ed42b6efb29325bd3d5bd5d8ab11ef158fd0b307425a69217a5e9b1c1ef681985974bd06ee5e49c5cbb7ad8be0807507317fe2c52a3fe0513358389f85f007aa3c826f5caddf8caef972a910e3c7b40bde4ff0256a5dea05a175aed70dc63af2bdf533b8981cd7bef113332e5bee9669bec645f0aabd7084ec3c658c5f7f04b8055473e4561f133fd822b2acf0fb0268f86e49ed91655b -MD = 280ebf4f434e4134fce0d3f7581c2434bab1efbb - -Len = 45656 -Msg = 52a76855b415a357d6747842140141dca75e257d1c3731cf0426aad2eed4a2239262ca7d4f078780d8fa48b12a9216c3c1ab6d150b4d4a7b1d888541a5a2616d1f7562454c125e11e0aad7227baf8813db363e4f50a0e9d37079f3360ba0d0e662a8d7b4937f5093584dce9cf19fbf565fc54135d378376066c19cb70a161815c1c5d1d20d96848da7abd42873ace213b4211dce7d1f5ca968272acf894b6082a592faa8a09e2387358c92cdea1c19d342127b2234dc7f37dc7442837188d1b677d9f73d35e154096ab8af933c388e1d7160033ae1f6c8902b708edda81593389d60739ab5a5409caef6d48252486679a9d25c1d6db6603ebee3b6e4173acd9081f014c506330ec76910a9a31494cc6f52312fd3be646fc9fc9562a0a63fa847895082c812d3e71303ccd5fd6a63e688d4452365be481cb74c4e391a3e6b4be41f4a66abbfccf307e4f301983dffdc4b97d6e1da53a9909218d5e359c507deefaaa46874f768592b744dd47d73aed74104ac103a67d1f3e1c7f30965255b8bf192272f2da1ed42071ca1f7b3f6b9fff0818e598ee1066c2dc170534744af78713e9b64dda5a4d52442b91142ac687be2774664dda99123fd6d1468060c4bcdf718c8ae8debd53b09505bcb337f02749f4f9ad82fa7ba41d935a6f1aa6376b30b8775b6445ac89b3eac50cd8d56d111ad6f535e8cc3c8ee4980f0953c337a5236f36c240adcc41e4cc05fbe58181b7b9641399dfde50551d6b7b8fdc3639dd1ffc4739fe75813ecbaf252479daf29d9e22b133e89f5b7930740c7d047db2858ef6353cfe4b7fb2c10acf00f630243541797abe839db27db6584e5b7d18363118c36d45d08dfc507d75500bfb2f9b014bfecc744147f9d5277ebd95a6743952261a6bdf15cb9b8a496544bfe927cba40619230f922c96020c5de6d60140307b3f31cd832e62d1e2cd51399750c73a70086f1aeb06ba2ba6cd7c36772ddab02edccfeebc9b0243dc61cf9b1cb27c6c07eb5710811f8f0f15e36039037cc23ccf773b5bf5dc2845f9bf46e5da9ec5e4ddf767a08c3d09d4e206907b058e853adfa70aa1c972237cad2e4da63b76121964e5174746ffb8f19d7f8368f7c3923ef1e4c44c91fda23c69475a68c9c90f8e2f1cfc715bc82b09aae6cf7f44cc87cd98a8eea909cf2329d092d38a00181cb7bf077dbb3536ce619cb4bb4a96f9c44b267be0637b7704b955897f9678d3b83a774d21816dbc11bdd5620d4748ebd65c3dc64ff87175e55f8aa3851a9e9c606afa566e705fd89362f7870bf1e5134c55412093d4864c33a0c269aa92dbc2a3edbaabeae4961cd1f5758c5dc6f5f084eac3134284248a8e11af54467bcaf6f1272ac5fd6aaae95be9d20a6952e6141e615606e283c691432693ebef51e6a9e69bed2d3c8f08de7fb48f59c5125fee877d5c73ea5006f0f15432a91b91b94bf2d0545a1ebe3a5cdbea2012e791adf04e8358f2c075403a272eee1441d7ad5d845902c51a64b9f4eeff16ce473d6ac9d217de0c0b601cdd331b38a5f8705d7f399a7b06b63ef2272767e5e46a8210cbc0af5e1831acf74ac3ada4d6a61823f171191f9788998d7423b91fedd80c2a7678be5bbfc9b85a13575ab53ee12bab84d95982e00800e65c526727430648326a98c9495b4a2edfb75cb6ec4730275e89c0d027789af1976042068e9c7ba2a3187f54b983195cd2b74226ac87f997b770c6118fd9d8081af050fbc852beb806f0bae52ecfddeeed83a64e8859c3f930ea57922e8c35a0dbad2ddb76fe3604d893c9ff1b8a0e318abd0773026515c8755703d686084a5873f73709ed07780592622b17024a00e124b3d458ad126581df37496318c66cab5e5eeb2bccf70b26befc6ca165a87c6a66289b43eafa49b1e91b96ac794f32f5f554d89589555604d8c2fd32c7fdc729a95bdae93e7528d51d648a370a1b33d4f3798dfb949aef1c5a465b5fabe287cb78edf1ad2a1b997806b282775db2d5c4c32d59b281404cd9cdf7156c83df24bc5f5fadf44075f1f71f761e01e69e9f51dee0ea5ed1edd5c9ae75aa0de24c2478c7113e72e3ece8fed23fcb4b2736f6e8b144ae5508ec4058661287a839c20d8d3ab3419db718e4dbc97008d7b2348315e4c9243998c3e3329f8e4cb01cd9566644b645d92c625c3a6fa7552bf9ffba45e3deda70f42d54b4c52957d9edea85905f8ac9b9a651d5773f464ebc70f1031529063f9fbd610b6b5174377a3f7e2197f5a12bb3c77fe73ea2fd43fdb9c0f3f04ecfc21a57077dc2df0f6a15842ca0e9a1aa1a6c0244e7ed550cd38426e81353afac107553993257b85b7e304e4e8a11de05e426e9397e0fa0257bd46acee7dbd62b9935358ebfa697d8d25f008c438d25353788ded600021eb7bb72d7edc7e55cbecaee6f608c1bd80814f65d4e73d7f1c87316759324814b3400c400dd5a0c9dd633e583b70e440389a49a970d816ede302534200941f9a03afa5c781604be341252cef4eadc9ba4ae0fb04051f2de44fcdc7670a0eed7a83ce6a0a0206e7699f3a61f45847daf3615b4ec0bb45e82c08ef761e9e281b7ddaa74350b64ddc249eabc4ae80c47db223142824b9d1b18cb77047afe46b0f6bb04219e3c8c093dce77f3c67efae1cc138127377284befcd04592161055e320cafa5d2095ee4725922beb365cc8c1ee6495d15022f3b09b796b1ee7d298aec277dda580ba143e262f67110f240e7ebeafefef80df72a69121680954b7775a686c2e99131b8644cc10b9f3b547346eb94fefc02dfa8a076a62bcefe1318a9c6ef27d867c2cbcf163c0a501bd38c3186aef25f1dc26923983b7ea4111d34aeb62b53b1c108040daa9c9b8c9ab9b43024fe813030fc623d3798b609b6b0f20adc02f07c864989a56ea8655c9f4c12cc2d4e547622d6bc75bb867c06d5167a47a23ba33fa0ce821fcc2a11c713d6cf8c09641239dd989f538dcd78a25695f5ec6fa01604f6df18042be846d6dc9d12f920086481488a3260133551e521768b82aaf7f1d270c372daf2acad90e3ea0499da04f2574bf49e23b686b0d71e016390bd09dbb2f6c4ba2c8b3ceefd1004ccf7a01f63c2ce1d0a25de873c81367da69e0f9e7daa7028157f5d60b0254c359498d82060cbb94e9fecf4019eea4f347b35087e7fc5c638ad5dd0e29b117dc38106ecd09079f4cf85025ebc7d1a526c0bdc10708808e13caa4d4c8958c88cf7bdc842f79cd468e8e3ef8680821a286e7d1b8f3d407da77c34d8391c8f5262197066445d2be4fbe1e139d21555f1b782fa7aedad512b013f7184ff64e7b8e571c16858c9e6b29601a96aac429da7e9efaa829288601ad7cf8cdc06290901ff46d957e8047445229160097bd00245a5ffb4bae79618531272ab65b7329d3597e2e0bb5bd77fa585d9319fa7882ed2d2f841aa529f1edd9871f7a978494a5d958bfd1a1907acdba92142b3982fc6565a2378db3c6a1dc05314972fb234b87fe08a58fe8a5fa5ee74b1bbcdb59075da24c882d40ec0bb052aa2b37fcebc90a662271aee16a612e6d0d0c5766872e164182f861d2e69a0b30465752232a97ad702a96b7325a39acca4c88834199cb2ff1e9fad3f062d75d2cba3039f48c31d1ca85a72141f1fe6a7d8df2b922ed791b01e621fc1fcd4e26b66a5857e77d2227c3c8058596ce29e7f535ed61510eb268100be032b7a258e84bdb32448269d3000a76444ca74b4695cff8db34727a01879acfc8106e7e92228b8140784bfedf0aecf4e5ff09f5def47c3b3e7afdbbe0fa00b63c3d9abe8455c3f1258baa98a0a909d85d15256a4d94787199dd5950cb5ff033dee2c2eeaa02a3af33c724c3c25aef953c178ff53cf653308fb42bb53af9d7dd02d88d7b7db999100dd3510cbe90eccfe57eb043078a8b0c6297db75ba8836266a67310169db12c81638a5dfe00bafccfbd32cb047d18e49b500eefec46b79845817741d18e7bf3bef6fa9b9e0fba730e18d5be9685bdb8d1987ecdce314309b5e71cd0ae57fecffebc0c3273c1141703935d43b039a014af2854b7c8122e9b0000e92676a043a68be0488a45bbd2d2f65351c41841c8e17c291817a49181386df366abf0105062ab88360bdca8fc8b2e8339a897443d0581c25354285543c743e91bc7e6502fe9a7dd5f1e002e982af4499e57f5eb086a061c8cd61d077c30cb0991e31e08e825c7064a2978f5b09690cd0639fadd30f6525e4b054a4e355b4d7c4f6562df81fc522b7f960da64bb94a38fcb66ec2bd93afb1184979d375301069ddb7787d0458927687cb87e9727a69b205361844b828633d7c0a703e44975ef9c43f288b7820cd0de932ae652cc13762ab21c109289db729feb0f836aa787d538b673cb1e63c4c182d3149c38176fa7175df31b915daf39e27a3d963b0bbb6a1ba967a96559357c0dc3222aa7982fb07ebd830fd87c65fc37d4bdb6e5d485108da33ace3cd0f352c7d9cffc31dcb824a9674867d874b43c18a11c6ffba0796b272a8983f5797308698d7a9b6743ad765fd1cfae01c50e6bfd65b61bdcde0cdc70a5c0753f9148ef3b54be82a86b7417ea93656ce4fbe91e6e7927551a0bc3d6e2ab7c0c7bd6c989d5d6083c85c2b09be202c60f1277b8c5e471fca623b812fd05b218d42ab8896ac177e4437fd7c784cec64e1eeac701f4e7e682899a419eb152402346cca50d0486c0df11f7194d4519448a070e68592de12d7579ee56ab9640ec27eee22ac8d97e375532ac15965f4a13e671ddea32c388dd31e18065ee1e5a0c93370bb8517c4041e32fef4b5755e9ab0fc9d9bb0368177c347b00ddcaac262801b999ec1b4f557705643128f4ab6070528992595f8e45611980d04cb5e20dc4dfd12d24aad5365d486a224ce2d2571a5b3b9853bba87b424dad8f215432a9799a3825f064a05b5b08cc2315c66d35ff865a4c289c4921864d4b8e0a1a1051acdd3924edfd233cf6d2e4d41203de759660603e4665d2e0b395056d557c2dced4f56eaa6bc8f073c7435e85d02fa89e7575d7df4bccf83140b1459d91fedd59989f4316f84c7a7832c683d8beae4e3923333bbf87260b8bb42ea6af4e16918a5e17410b121c33b2cfc91f4d5c0441ae1625064fb7059f5884698312f857fce99c1a02e757acbecc04e76b5436c62595d4c7c21029e02640480e65591f3771ffe903e34c27726e1c689e127dcd786c68c597f9a17e4a22ab6569e7f231499325ab617c9a1001e44c61498f2a8e7f889f8f22076412a827226318656ecce2c30389bf39619fdf93a485963bfaf85ffcb297d285e8958eb62dd7a6883f40a7a401da79a42325600edd5bf0c36fa9ae5b4a66460f9f556232262970aad43b1c98b9342d376f4f47b85f4ae59fe900cf06bf70d8df0900c72db3df2347de2a9623921d467da68bdb2292e8e14c079c56919a4e27aea5f6222b5f7f1b09ad8dc8d7150c51f15959aec020ac80323beab98e53549ee906c417ad717fe45ae2d30925ba67dc1d08473733810c2efd066a8c4f833acb08abe8fc16a2580ba5ee98fb820ad6415b23b318df2c8e59f6e79a336792672897f5d364095aadfd85415e048e8ede2e564c4ba8358bb99dda60083379194034117521c3f812d826738b90b8adaed60f78d27f89d9470476f2001320d6807c7a0fba42b055536d32fb1dbf7c61f354414d66ad222cb6f551e838797002506266ed35b49dc3a4d39f768858e44de4df804e7972f5c28412db277979a5af11a88724680600a58fb1c8905beb74b40bee28f67b5f991d06d35f3a63b2361f3c95575fd1957d8d6c7e4ab2f8f5a256d0e6c7dffcd170aee7bd7a9b57a1a5f549ef53fa031168edd3afa268efe60188cc8fd9556e6710fa8f47a9b4f5d679a3b1ed098d6cd857494dac4c1cb16af6dc671fca01508efe7265f85921aeaf35bd1d34e4847f78cd22432ab468edc306c4293d367e33b79dc91446256be2ba4e93d44d8169cb613efb4c7187b7e5acb5c29b5e9af6988f734112b78afe428638ea8f9d4cb7d1302146d23712a44976987a260a6434ef65138cd9d2f6534e819903a7bac2f9114418977cd1f19889bf033d61b72ea3b8e6f30ee21ef3f5573ac381a51c60a81c4b896f94d8b11f16f4aa9ec6eb56bd85739649b402006f0d106ce71038c24f42850831b2c1cd9271a5d310de1d78fcc59981bfd812a82ac0b0d9a661a6445934aef9707f1393bd3a4131261fd401ec09c729f3c6c767b3227abe3221db83406317e1be2244cfd9d1652960f4959e05b29b1367f896ab92930c7f3cd94efbaf4e5e657d74dbce82c770403404e889c46073b29ee616f033a2b48108e07719f066f0d930bf5f1c429cf10a21b92361c283efac0b37bee230d2218838dffa6abe3d6dd17a9a353593b265ebbc99fcc26aad7d442f35f4ddf491c1e94f304f6a533223d2ad7e04a6e0b85d69671fdb08374d9b3f9d996f6009622428ae89cc957a05b1416bd333ecd40f3607a3c324cfb2d4c7e2b8aa74f4e9e3b6caf93518787d08a4c218524973c8379e4b152c807557d381d21311ac290066f84491daa98fe6bb7cc94543bbd847c1e4a81da47485b0ea67723f478b59079c672a1ad2f64841ae87cb75501186dd2ea7a33fc3579d3859d7678fb4892149d491eff6c6954e1852744d1adfd10be2ee55c0ee21c01868d26016a6f12c0e51aff71aa82dfcedc537b0c2c87b80e413718d95cb183483ccc48003f785fa7cb99f151ec16193b3e2cedbc0e09b878bc968ad76394f3b6bcea0b5c403db5af8dc225a70b50a004cfba833cc05b87b8f8f2433f6db1f3b3d09077fbb5e79f40f53ca55c5059fb8f57a247748aa6ad34bdf44cfac0300ba73e6695c6e69da2c2c9b079560359b2469e8f414db312b056d244acefa43ac3facf136ca51a88489dd2c5a77f6c774e906b2778ad85c61a8501896b0563f7a4144b4004819bd01839d82439bed3dc56d48812f47e46eb7228106b9226448e355d7a946640af9c9affa37436fa7fb0527cbbf9bda63fa841a9c89428398e27fe3e24b899cc9f145755fa5ea71db91acbefcd84dc0fb8260e6ff1a935258aec881d1053a50bb362d6a4a68a930ec9424895865a589ff88c61e25355c2d480035a63070e93e732ab9f55709f02b5f75151d6ad2439404903c26ab53ed52db794fd79d1916a47661a3bce1d46fdfa8b6f6e1a0c8987d9f1b3ba6fe10c791879c8f7c53683321295d4317978268ac5ccc328c969324b5139c3d0599d68b37d0cc6d2b1fe8cf432080409bd48e8b4fe0376064b8dc68d92695c8d90b2fa8d44b9b715a4f055b78e07d04c015433808d78af910840ee5383c9a5787ce8690e56c8c34906d586830ed96081af65b0f85a73974f694952a70ca1c71986065d3e998111f53e75c7609ac8dd302e4306234e3c56cad47299901538e9f814d68026f62ccaa1b698be571a1a6fe2e6b6de094f1a138ab2816c1786d7349e901e77cd551015d6d506166f76183d1d3f86e0b34657f7156c3f724247c6d09260a7ed3c9f761b1a038675b1960a706ca17ab3281c3929f56874541b414de45cee398879baa604f8a8e2842363382f54745c0070b709d1b210e8b9aa5ab49885a09cf08e90e8f7f52ce0eacfc3e9a35f20f26e94010e19d2cb624af67b421594e097ce8208841c9bf8494fbd9f67f4140d05a69be19227df00acaf078d40831115f3ca5e09c19c7172e45df4e0f849fba35c4f8d3edb2361198c8fe576f60a84a6788b297de99fff037bba7c6ce5ca9d4bc11273023236de7dcb929920acd076fdeebaeb4b424cce13d40e5d2d76a1816bfa975414df88e09431612a71aa006f811dfead5b15cc650bb9029f0af2f3306dd085385c2a40eec685a4a05337c0f59acd007695a9474c51f03d4beaa3eb30b70b8527c25b86917b910203ad9d3892b0c5684ee148e40c4f416869b7cfae0bb3733e2a2eb9844f1b1b245c662292cd2bcedd3d2738cb2c6c762bff58bf6748c7cf5948888d5fb30eecb2b2680ff32e74b0074c4fc225340f552d -MD = af75e59940783e84761dbe59727ed7908a8709b5 - -Len = 46448 -Msg = 0287fa0e377c9dd608cf9853907b010bcae4c2160275a7dd8988b522ad86be41e84f32b558dc38dd6f23fd00ec3a4c900ac060abf779f6e78738a64f2a0272a91c70a0fbdb55c54ddea123af8485347e4bd887e442bacb9ec1772a0257aed84004b2ebe8a8306dacbc12af6840a4e15ff4f5e0c7cb814f899d0ce9421cd1158d09dcbb84a8b55784713e4c3108de7aba6fdf125f7b15a93084c18c1761b4541893b8bad8c12bac5c65eda014c47d2818235ec6b138c0021bdf5cbb890ea0bb6a0b0c8eebdcdc93bd00e753185cc71200783aa4c7ebc882d314a61da10bdb720ad7a1dfc5e20e352eaaf30e45b80561fad63a53a87d7650df8d675b6640ada280613f566fb90ab937cbdb79a4c17e3c8ea5287c5cd41295c7b0671ce19660735510ad9af04b184860cb653b3c5d7ccc454dcac6ecdae47814e76d0918f33b0c104bb554507e7f0a32125afc16754538a636e8da5f7533224d9943ca15418596397c1d2c983c89263408816638f222a93ac94c5fbd8f49bbfa2daf06e0668738590aaec9cf6c7cc5ef15a41facba5b47876cbdfe0e0f6c6aa30d7a657f4c891bf75d30d4fdf6a10ee9a289cf7ab738391788025f5bdde557d1a06c91fcd9d2669bdd6bf42ac1402aac15f91fa8cf01a87286e429abe1fcab0b4e4c2f5ef7ac42cdf227d25fb7a140c0d8bcb640ecfdbb1ecc2b050703f88eda7fe4eaae8d5dd716042b16a4bf0b79ab519a3e49f5759ba5c49f9a762b2327c59bfa67f3822e4cfd7b4067ffc1c8fdf7ea5b5cccd2b16f8fd507910041c39f540a575135c067ca0bbf2e6d7aa61ef32b0ac6bad06bf96062662d91ad2d211d0f35c34e7d2e5078c638bdd11c545683d018a5005da89596a8e1d74386d785ca7f820506d2b4317fb84eb43bedb4b7d76d7ebed67b71cc38e8adce4e922736ce2b5ae7233c3a5106696add52f6ae8b148aa3d9e233aee86fab32da5cda067e509b262f4ac3a8f93660f2febf3e2b1865b0efc0cf8c472f6278d8c212645aa378584ca62570e671372550e02acd11a8f065ca3a438f24ea3ad707501a3a0dee6fe936145c4add013040ea4b39ac4a81dd349c0ee6432d601e50274a1c6405a75dd64a41975973f1493a2a0797e2bceb55a2cd0562b04bdb376ca079bfe82c166aa8f2f47da69188ac9977dbea7751308039c5e75cde64a1acb2daa5acd06883bce695f7b638200f7ee83890db74ef978580ed7c7fd661fba6ab3e968b24a3357e189a10eb1806ceeaacd7ee11e080678cffab8b709f2b314ddd321303eac475d6c76b08c44c2d0d156fbbbd35c3ebe9bf3f68deda41a88bc8d21fe6bc2cb38bec7a6fa6e8de7b142ab84cc5ee26186544c78d3b63c5c25140126ed55ff158bfe9b90eb400d5da2a4f10f2cee510ef22431f806bb33260cadc2385a994429b58f50cb0f8b33a3199acfe159fc189586ae5d0ab3673906a3fc58fce29022664a037fcbd3caa1467a76b0a1d012b993b83516175634be7c7f822deaf1f52a59bddd8109d468c6b669db1bc72bccb4980b6b05a45bce240613d1c9692512bc72858ffd1b9de024815c3a99d7c9848a00f4b2a448507e1a21f56db41de893695f359d5c577ceb4b25c607834a45d4ba6d08ae6a69c0def16e98a8666fb8d1b16e428827640dd49b123bd490950d27b64acbb0d08f296b5a3a723468e51258152e40c2d6c7dd26a4d522342a5e9c081e18925c6f2ef6adb5141674240481b1052d94fff2d9476be8fd2d88b8fd8ef042651113aedfb500828a09fa3044836711dad371f43ef91ee7e89244d4f8427ad39eac791807e11e431aa129062b93d4cbb460db536f4eba1226051b06e543024243e8ff234e0751873480a32e303f948358e18eb8c0d4b80843fa6db73b2d110ef33b1859089444cf663cdb00e8e320e926ba2e7cfa17a32ab0f6af7e605d419a0b374741ce14627c3e1a4336cc2af46dac7f1d1861741609fb6e62b50b4ffe841a522e460514352e1acd7e383083a9716894ed23ad966b2691e62a038291b25d9f001ffe53f027558aaaee7dec699a94d990112724eb1cf102d257d26cbef78717e5aed32144c3731c571680265952587df52b8b6deec609ccd79eba2024587103674d6cf39e94073e3678d794ef6b3cc4289ec8ef1dd0c16e5a4123536e3fdbe0099e14514a13926eed97fcae884fa25adedd883ef4e7c855def1966cf928083c40f361b0f3cca53cd0f657d9a07a39905c7a11c410558f11da229be351ab8686a1ffed991819a016851681ace465531335f72e24dca47630c0569c4d1434f74db11610801395238a7e7b02aeb0ab9f41ffd715c7c67f1e11460020009d5eab0fd2d862fc92c990072186435591b77eab1e9c61236a2ff761cfa1bfa46973422b9bb96d650221862b12eadc17f41361bd26a9a8ce44519270d1cdd3bf152d2d4f802b885fee377654c6fb258c7449e9068ca1553ec16e6fecd0e704a70ce6fcea04b15c53b365d122b249c8198eb58505c4f5eeeb8de0f024518fbaf2dd3b1169aded41d6fe5726f379492c55aff0c6397429ee5ae643b3b5d82a6f38e2940b6cf031f1602b65f875609bdaa764961d200ebfcc1387213b2fe939b9dfd97c5b626021b365d72cc5f71c944ba528e00a47e91a108bdce3f6e0e94ff35e1e7e81c8622f208e6e16001711d507d579991e1fb7db445a541667776cdfd43a2df50f2d9accc1106cac4743c4d097aed31bb915ef85efd579330d61f86ba50a848a64006e8d0db25f6a0c0bca196397d1d26bd8f48c7ba3d8c4792f00761e35ae9910cf51e27edac2e9beed76120426d267b6d75b51603bef450b3d0971885228cba608e96f8cf01385d0477d4ce1e271462a7fa8974614292f642a98007bd67f7c843b9976c0a8edc8f0d8343c95411af8275050a085b312fde466208581392f364be5e6bab25bae4d90ee3f6386c95be84de7f82fb79f493b3c7e378300f094836d76558dca8ec16e2117f3544ee1a0b0feb4e377443f1861bce1418ba3a35bee598b6a7281b8e3c531d3f481563085ccca25b729c4291d0be61dd2f1b1b7e1d1a0939a0b607071cd33b0b76d253c67a630d8e7a9afd3c38468b26077e3b4d2c7c31d78aaff4bf7f0b72cb09a444be2d7b34cf9997fc5b885851d7e6092008b4b41876af3a681e2ca2ca6747b2c0573cbc1d0715bbc854869fbdd815e454197d69c6ff5580ed8ced414bc779254ef971d0d21c372de891fbc0d611dc385fe64f44445bc5a80a718890fed3e624770c925c5bf84716e478ae66a46a822dc7d9f2ed997047db4835c636ea74d8d8c1f8680bbe818d9d4573693730cc51ea16582d0bcd2822412d406fdc17909568b626bb8205a150eb92e9f2db811d8f98d3cdca46e96aa00143fa4b298e1066fddefc536c383fda27534212fb9f47855e879f8f48f31d074412cc21c656dd93bfc0e3f76f5d43717a11e5913f93307b65b93645b6f62ba031211cbb5a77dd64d5e44471337e945e0c523c374e64c2b8d4f1fab43bf77bb3f1f853df8efafa2168d2858761a21ce904a1aeccd11ae386d4b853a37d00f588ab1fda560ae61b119f131002a1d2c2598b83a3176fbe7d2b8d94a9db24188166881f17e87543287da32e4ba99a156ef8c88283e1d15777f026106425d9480797b07e745c781a08ad9baba046f573080ce425b7f29eedb91dc8b1ec4744976f614ac7587cba72a5e9b013769f59f479de06f4a5127f892bfa9a01a9090c0da10d7e7f2b0ee453e6790aec347e6fa1a7b65778b6091c31b5cfc5870435d9b286e2763054db9dc5b3a4d0c144a9df817bdcff38529e1cf03fe370cb6391558f042a57613dab8ed1f4b42b170de8509cdd9725bde29b28cbb17fc4562fe726ab042b4c9b4d465e7e91ef4278f7056bfbb630f18dccc6e7ccf3ebe9afd1fdf40e6f2f7a65ec73b6d5739e3e6b6ac6d7a5ecef8c327ae702faed6f065eaf9b68c12b7c0c4782fc3edc80084679cef53ca2691c1e3452c8205d885343ec338b29cb225a28c977a79d9da17783288b5844fb13ffce19be30eafeaadec9e0c494e0343a13f774343d7c20bf311c0309b895b7d4e0c56b25e607e43c59c0c2c97d35055deea0cf1f85826bc07f3a8fb1dcd7de93062bb1efb32017270c501bac0fcf4572324b63a14958888ea90556e98eb37938ba2774835fdda0513f9f71d41257fc612822b6234fa57f0ff7a4df1a94d08faa44e13b4bb2e586a43ad84fa94e743212184a520b6012562db140b2adb7d828d3ec828eae74e1d10744213a938acff06c49eebfc2444717ce1e005808bf704c9afa32f5146c788a61a7a2bcfa90103d59053483b1c3ebcadc870d5895744204e7b518f9e56353b89ca9855c4626de22c19244283fa5a6753e348e3abb9ef657a2665d218a211a639f93efa3df15e1a68a394736d3b12222dc6dac87e104344eb45528f6696e749352ad0a172e24c2d19d426533d7b004d89e7a8fc6716fa3f003caa2ffeb1209519d3efe42991d29abe2f5c5a9b26bf7a06ca25e7fd2a7eb45780df3c478d482a46890f3ac89c6bd3d419a901fcca7a1812e2f423a6c74b555fb6542cd797d87959be910db67e9278ea378ed1e8d2faa83cc676280a79ea929751cb7a354d5bf2b1e927d59994c0fa6eed8052d5dcabbae2e93e7d8ebec6ec8cc787ccd73a4d36ed9d363ae89b81b8e0c0200d4a43f7c0b3dfaf8cba027ad3aeac2b6d33cb26a66b5f3ea609df4f64de33e059bca5794a1dfe6bee02e170d88b541903e19c72d1c983c39f93fca46eb5dd43c0b37daac78fd9d609ffd8437b9173f309471aac4976cf47901d600b471610bceab53906b99806807907536d2d5f702be60ac24d6df1764d1feca5fe7e6d62de30387407a0b4e8fdb3cfff487e53cd3632731fd0bfd83d46a7a82af8852a680a29c39b480d6515a032a0188feefd0fa46736afd0df8968b6bfc68b83ebeb84d34fdd3b226036f11a8e2e5b8defe9abf91cbbeeb81d83ad3fd0de341b231f4dbc1aebb03149992fbf1ed114dcf17826a69b8959112a656f248345b148bb3427470385b6ff1a0a16107d2ef0f7b447042f8c158b56669d13173f938f7724c8a5e692219bd6521848b1119e5c5878c4c90666e6d20252995d8a7e4e3b30f05b4e2d5f45fb71a2223c1384b5d399ef8fe9cdb473d9af8ee892f0b7ec21009e5a848dc379423b5ae664ba4efbe31668e6fae7ed530eb87c1957ec84e3ed509f44fd8a5721fcae1ca35707c8d70768758850e779fafda79a9a10c05dcc0ccb63b8fda592d6a744480787ae9addbd0aa5e2904ef2d203076af9522ebb1aebbb9c151951ff1dce886d717af12d8670677a744d70e08ecb528da5908a254716bb98f7e522044ddf050d8fa5820957ce2953bbcd0fbb77c313432d606514d72a45fabfc5983b1d5524a8909bc3a6d822aad227b37dfc2376c45bff2642025182d531fb5f271bd2cd71bf42d2589e7e1a766646754e1b2842d018a96693863cad03cf38f6512f24b476b214cd9348b0121690a6a6e2a0ecd3e109aab5ec18ff253c22d74f98dd7986ae4164f2164e14a605d1c6bcee15e79651bf7178be232f77f8ed74bf70bf47c082cdd1f454172252beba051bd2f2bf06bcaaac438c4d3411c48f8fca7b3d260e8eb7ea28df2c5f84bbba006813cfb9918c4ba98ad8ffa38f298996e51aef8aad3caffc241a0622c89742371622f59de33b22f7d316a2f44c824c18b3d23eec491706a66a872d22aabbe327aaa30ca26863b125a0e7dfbcd6897783ab33b3d14ea87c6760b919c597943d4099f69d8dad7086a168af1e53b9897c663fa1e6c04a6b41cd9b2244820bda811068bff0a60efc03f9beeee76f621ccb4ee5bf303fa8ca17379e5545fe93d98f159b41de821960c99d0829b3466cbe049c41ee28b6065f6d33dec49681bc2b97deb63e9fb859394819d8d21a9f35d788ecb8b158b9df95a450d0e2aeb1d14b3bca2df8bcaf5b0fffeea59a85d06a13f89ece9b18b191076cfd1951f7059fb2fb767722cded7b3f6199f2c57d7055dda441082e1133c72f27c71c75280363fd5742362f4bd946520d9a54f569f5a5af4c71d9ccbac6ee67551d6ede8a21ca74cfdbcf80af1958e2646e20ace3d6b603318fd8097dd1736a758e64e0c5f73fd3d5a1c7c970241f6af683fa4e739a2373f4196766e2f9f2832988a34e43ea4074f912936c276ff646448a467c81c66a6c14ad2c578296e85bb19abe598c7158e2baccd6db4d739a2ecedfa999a6e1e76613997b7dc53ec14ede42faa51822f5978b2ee6b94ac5676f15f278384b5346fc618cf92c335829f6d0000cb37f85a32dfac76768b7ebea918a7156daf7b0f5999ee619f545896ece675049071b0ffdf08a14cd7c1d4d8030bccaa9e424717fc81c43526b84392c5fe4c2541283284299a9958d65d360e4b72d6d06066a2b42027a1336f167edcf05d8c4925830753d83e9d82ba882cc74bf4ce6ef943134e8c328d43c19792de35ac3d5a85abb6d2b49bb3b2cd693f6cc93abb6cb200224d094b914d666306fe5e93673fa9c7c76b845ae6d05529f6638eeca5b1d3c657195f1ab339a4a162a631b913e0d900c38512223bc49befda1562b19427a4bc3b1a5646fdefc4792f3d78c749255d7e3187249cbc76e7e472ea0c3191b56d0b55b9b57877570d14f32bf9640ff67c6899db836f70cf812f464b5615a34375da2d5c4657285ac99a39d77d396f3b80e683e8f7445fb5b0fade9e0605d3ba05524c6dcf8c18de3e3386abcbee70dcaf22781648c39211bd6ac34ce5a82800659b395219be4fccb605640ead2a1ac15241ffcd3d9310ccf0a97cbebba7aafedddc7c75ec96d60d773b5a68e99576d3b06ea1759f5de1cc91df915b50a9619cb53d9e3c10bcb487c9fbf12248d88bf813cfe57636c80efbe8338a8a6b5756c334e726114cd7f124f66dafa2929b6219c18c5339ca7d9e403dcef0b5d6599059a3029c5b698f96cb45bb1f518f85011f03ce732423239982d7d84b43575617474ab58981308ea964fd0ac697063f72f021bdcea0086308abff78219cb7f7f476712974ed667935d667852eddc171bd766380eb1643e5f2a2fdd6fc28bde32ecd6086e506d6fb3f0bcb51de8986c2e897114052ec9a505f4f191b634e33c2cd335ef3643447bad1ea71995e051edafd3d72248c8cd64d579a9b6fdf79df3eda92b5987adf805ef25ba08337b75162034fcf55205cbf83e36bcaf9f70e8bfd5bd1ab9eae6f4a90ab46a137f009e60203b570fa96c61c9b0aaaefe23376fda75bd8892d894c6df80393bdde1162a76104579d3c7730b73cd53f52511b19fee5df8f976c92dfb13d022b39a022295a280e1d9e434a04560f4a123b6f385f555ff1de1c84518ede07b0f460a4acc8c8fe29efba3697a9c2bb740cf26411b1ccbc98ad629d4ec2bb0016d7791337a6b98c5eb53b3de787c3e95813be572e7529a4dde4afdd12e411ce3bbccb14492bf57ab4576782c00620410010e970181535c1c66b4c6f245aa819278c9fd06cbf436f34bd872aad8ea36a73ecb9d956f7b8b85e2a81790c8e488ae32d3d6f27ca6c13e5cfe2603387120db98d77b770857a34aa09952453e6b9c87689ed1802b4390fcf76c24adc5936d1dbdd6a35ef2542dbb4f1d29780ccc27ce887f7f386e56f0bfa986d102f6cd75fe0c3dc785a41d95583c87efb1ba72d4e420ea2293ac6d9ae6f1e2cdbb429bd5ed02613ab3940084b1f78e277acdfc0e58b0838e2a7bd3ea135f147d3f4f6af77b3f058f4158a956591e74634bcdc44eacb5cff455333658c54f7061f763c76529208f37b7487484ae0fff159d20580040af2407bc8911715d51ab1e8c264da9674562c69e19feba314a62d0f77c43edc51b242ab8e3d1ce7bf418f5561d4a3ec62c24be6e13a441736c6407e3280441aa7844ffe2ba13ca81a54e98fdaf699fb63349719fec01d4f4c4673cd8ba25b651550ad9c29233f01ee3a07bdb531846c7f94592bbf993cf2610e0e250a904b65a2fea5ac102dec9944dd31087bec2be6becada44ac2d69a97a0659ad38b3dcc356767f5766260c192324af98b391571229be5f8a4ee46e1ca1169c8e9c73d62739a083c4b576672894f7c894e587d097c75933282c2712f2dd261eefbf3900385464f91c8484c56f9e3ec6 -MD = 06f0df10ed7bc4b446f9271fdbe6ac81e36bc142 - -Len = 47240 -Msg = e36e18eddfe2c21d097af7bf9f8d89f1934ea6b434e8a3a10bcdf7d8034a8b3ace6031d883cf71aa8c738c85bfd3bb47cbf8b855d67b7f4764e256e17b2d0b4505ab7d6875125dc3adcf364b1f9baba2334f018fe9f9ddacc02f4e5ed6a30d0a50f80486fcd40ece3537fef9080be26b95fc894bb7894238e75be7375dd61af079efcf1b623d0b35ed52ea77c04be708b7a6587286543853a00f295558eeb95f4637e50ded74dc5e9ac905ad8f8442e361f677ea9f824665b4f31d9e0f1273bf81794e46e6a209b307435483bfde7c625d93ed9d4a3af5d6ecaecafbc96bcf79f05c13ac95ee1a9afb69e1e297801cef7227c271cfa4cb0e0ee93954d02155f35c893b294181987d3de3b3b05e93aaf16757fe5075e95275e24b70926a5b8d968ca7cea433820bc39658d2d75d3eafd005cdaa2185311273327d799be04100ca4a5fd504b41af9d4ce70473ddcaab2f31431cecc47a39271c4265c597afd35f85c5956330a71ec18add419cc22fe3bc45c2a703803685ad561ef1fb37fb4b4868b3c5c187dae6bf7fb2c506a7963d2aaa4619a4f01a7f209d180cc90399106de9fb0ec9b57faffd97f1ff5012701000db67e53f88889e373dc806adaeeb9b266605f10a4de7c2e2602560e7875ff4c555828a41be236b37d4a980278e757408896eecf1b5c5d83464c79a6b7ab863feb530793a155d5ed8ee26f9b526c9139ab080832e817c483a1252fc2a611bd5f356ec42b702a8f160d6dae3d50c48f24367f533ff458dab89f55206c2defcd379c73077171a98bb864b4fcf05a397a8993c377002566c6a9a9a3f5ab348cdd4c8928776f8c19f25afa7c02bd58117af0299c1d7d648bb1de25d85688a33116286257bd2caac4eb85379067ab3295b6e260d2edbd9a0dc3e07dbcea096226a05290c681b0b1f09fc083b7d4c3d00d57e6a02c8ec8ad35233617175a3959b3a2527c3e6a048be6359346b8f10c1ac184855173a9a6874bfa685db14d1d712044b18d86202f1eeed686e85c658ef9f86646db6fe5600e976fffb5526cbf90b4b0f62a684c39544faa22d16bd95153fc25b1a7e8ebfc2c60ab8289c15f269fb80ba9bdaa962b1353d8ee6aadf45e1213e84e1ba66285c8f0d67940c7cd5a87748052ad15a50c4540897319e95fbc1c86d7a6a070f300c98d176c422c5f642e30347a627122e4d15fe43747e9c1735b9d1c409f104677198096e4f7b8bc4b7e3452a84486b4bb9ff812c45d73c38cb59fdca47e4c02f19f117c69c7328c175ec70065bb1b049a97533aa2c1500d0e14d6425ba7edcf774387f1811a6479d0b53366382ffab988a1b78557dd4846015f8873ec80bb5710ed2c1cb65814297f6dbeaea908e97c8ea56e1b6d1822166d7efe9adf737d3fc48546268fe90b442c6db1fd40aeb1f5b38bbe236cd9a8275b5880ddbde6fd329bf31e3694351173dd9d547e86891acbff3bf0c5da8aa01ed2d755640d4301d69e1ffc754ea5ee5e9ce5ee560201eba77a9d4b2b4192d3a6dbe2c75857f152d3d4f2270b449f69ac702dc9b03d7fee302d9a197a285909657d611ce12458b8d24652e91ffe8c4b05625d2bb2bd69e90f1f18a0dd18470903c03d9d26fae0fa7bfa2888d905d55c13785d5d840c29a5eb58002a7a98c49d29ac5c925064f1e275fa5d4d62e0e0647bbc15a74fb225ea6de13bfd7930388b7f4aa74386e7f336694ed780e217172be8366e503b35c77f3dc1b06103680b9caca106f7f10d4ebffefc80698033e17800ed4ea26f1f762e020046a040c9a59859b962f8b95d6a45dd0e3f5065bba5156be99fe314f799bd64a7e70157da6e472d9ba18c055fb090ad8bfb7cb937cdc8d232475c51469af50dbd7acb7023cf71d14eadfcfd9c8667177c9e36a330c05addd130554f93e09ea24ae647b52d2eddecda6c90cb9b5593c3e80fc64b2de69333cd40153566d380ce5715bd4c7ff4542748c88f94e486dd58d73674dab6a73a7d2e61e62c47db6237eaee745da28a9e2a9fa84383007f0a7f52fb8878536b1962fc7a0e5cbf600e850e59b6111c56839ce7f3f2bd76aae5df5f46494c8d9af68b4072d6ec55ca4a61c83ec98f77c2cb252993e56dce6e352109ff007feb9c9a9f023386059281df732285f6003a353d6e6c6f64b99132c1ec550ef538f6d9cd4748a466cefded95622317858cee17a21fb86fb6c9466052e94d5b70a034ba562b1cadbe701e7733d6d3dabe5a1acfc2e0157b25c6755fb0bff8cfb9df2fa5fff28536d5127d8583793bb7e99346c765578c7bf7d8a797a3175e50171c6f038e458c27f4dda3814bf062964d5efb66532f245775266270f39988c7d4807a3dcccb376863f917d154e6516033e4bf14530ee6f7e7d9315267ec7d1d3632dab9812d90e26a8d61df66010efbe34d1d392f9dd844951899a5c9b94538865a17e175129f7b51c10a1149e9a351a5c09a3dad830424c60c24d1dfa7e9020b22b71c6f236b1c5fbe99d1c4471749c165c08996687280c4dd593e725f70620fb044d13908fcaeddac9686a0c373ca7e651683b1f62941d5b2c0544988e23fd82c466a99685a1713b38997a504bebe26e82494c8d3314d42b3e27c2ecb4883afbf434e58eb8e4149f9fb6e9bb3000cff157324a1a7928e530a461ce7d0a915dc91c5e53e3a9f12c7a974724a77429c52158a9c061b54eb4fdc759e3d3e0ddda7c9539712fd9574d4e97a0b7af98b566610f162bdd6804b8054f568f8be7cc3588f76cc9edb784ebae197a1f2e1e322852d31e08e811e982c9750e4e0f7ffaf360db4eca87d5187bfbb529c7bd652e8f594d17d43c434b99cd00d78bc929d898a68985ff98b27092c9c3365dd80e190ff6e59a0a246cc961825b58e56365f399ccba78d59ac03bb49aec362e0889702ebe352b375b0ed17e7becf8d748c4ba7b45c6bdf8f88ec855d1989fc4b967d26011a431d82a9a02453c4e3dddf3b6cbc1a436bbb65c8ea4fb2050e9be85199e4893cb44692daeca5a25f7ae65fecc75e15a92f8aa11405018e99d8a87d62f525ca702d966cebd9821db61b0fbc476676efb640b50c1346843afd7189d37099cf0ddf3775da836fa30cf24ec2bdf350edee9125a26e6eb4befe5a61a8b2248bcc9ab0594ba24ab7f0b73a9b672b998da95b6366bb8fcd589821d82e6ce226d502b90c1c808deab85265b78b64cee026947e538c6736d638faed9e623c2a1d7f5bb21b077c63087aaf6091a5226e7122959e8a1e0d2d345ecda8d5848253b28fbecc04a2a7ec4f06f1eeef7109d3f38993042fa4173a8dd2f79ba41da5268c0f1250f0756aef6463fe58f97882c40f6378f96ba6ec268a9a620e34b40d685406418606092b36f299c0e6d941f30b6db92bc366adf4b8d2c0f448acd122e4b17d32b66fe553879fb11ddfb455c56eb49294aa474097ba0e4c979335fd4b614c7bcd2852914bab13b2ff8db53a61b68df79bf837e83df2e5443235f7bef3a6cc08fa24d8967a6af7a44d36017a2dab9fef28f35d2c4e2a00b2ad77199f7f7cda2ca1f1297b478bf390ef23c39d9314938223e5e2943228069df0a1c42558ab1ef0aad86cc81cd8ae7dcc9c2129faba10b87414eda851b5a00ee2fb1fdae6fb3f5bfd21ca066017d173cee843a8ca66bf9a03c9a7f11498760c6dcd53459134e67683146abc7a11037adc5152a16ade472fb84b37f6e19b2f9f785e87eec21dba4822f87572d48eed9bde1d769d44ea52807ce4c63f218473cfecf7e45edf7f64d9c31712b0d55637ddbd95d623bf54859335da7c553d1ceca5afe0921c52228b314fb76affe53088495f019bbb43e38a72cd7680bf9b2b4028aa61b8b081ced859ac21a4e66ce588e5ada9eced385e09252a00fb05a5791761c5c27ea3d64bf258c49de9eed23ee0bb8fd4f242078ea9b236c014b0c2cd1a56e94a0d7cb76083367d72619d800038d3eeccd541163b1323d7fdf44759f0f011fc428dc38ed730fbc1ea337edcf63733b0d7bc73ce2cef80f701c252d4ab429ae7f22601c276a3b0774b88164fe786e5bf3ecf5e972be4cf7d12a75a9ac4b8f793a2febcbb06845d87de87ef429acdf10149388cdafe9a1a5179cbe61303f932e79a407fe14e7a08d8eb59901bd8b35d603f1c85fd6eba685b7e557ea732ae53ca2112cf9c182ebb54ba25814469e033c36aa6cf6a43ecc283686eaabe177e6026819c36542a487de292144b2315fd7b1110fbf48745d72fb1813df3c07c1263e200073b714d6f576abd4e7522a4b23b347a467cbe3c24b7cd0febe015271163e6e77b675b494b4fd581fa87a7dda67d13f0aded76ef7a62bf5b9ffa25e024691a7e1f407ae68570092740091c89824896b958d1162782396fad82c75971f37c660c1c5037ecc5bfeff64984e870eda5a51f70af08ace443c54dbcd117a125a4b2db9a1ff822b2466f383d80735a909a28681d10b3464788aa8274a0c83763e9e631c0332651f50c72334483250f123207dd867b7fbd53110495d2bad5fc5454ea57b6162a413619de31841766561d722ac6d478d4d8b1e5bdceffa9a4b8a1eca695a5506aba1c769d7828c39ef956647a6b2e8f1a60090cbb7523f59f32f1ba0232b56750844f2a9550561035be670fdd13bd49b91e028fe8d265242d34edc4e7780de54366783db0033684936ef87b3c08a92d19d745752a2deec0b5843d143badd652aa2a3fb8d4d8f2a920d1b0b1809019c4a3567ac66bcde651a1eb88b2e81a3734ef964ba2eb16af0745ae38b88ff43594bd62488b92fb745d583176a4d407591579734503dc06982468ce3798537c2727d0c257cb87ffc06e421eb0f4e9bb637cb088d4e38ff0d28af3fa565ab36f1405453f508e3221f30bc77adeaa0d807ef2fc9fa14bec1c88c14cf83d05961727b482a1dbdc7ba935bd4f0ca8cc2a9cd2fec57e5342dbd1e04fdd9093a1e6ba85bef1b09fbe4adead0a429db4642758862873ee93d1445802be0c8c01378aa159abf933453b8709847d08f5ad79ecfcc3f86eb709ff0ff9179643b32ecd6a14c90101f4745c1a72e19b09dc391461d0b0f71fa15cd424fc475de9ccc36e6e5afd4a73b9d528eb61edeeae1a003c6e1c76acec7435586ba9b99d65a0671f7ebd1e0db64b10a7e21ed0fd5d76abf9fb273c9f3ef73b94cd4896dd21f7c3ea828354d33272cce1e8f0b1507fbae253f03a2b597ef3178f302005a684987ed662f5c6234ff5b1dfe321b8707dac4c53359d6b61123170517e7a2f7ff64d41eb065b9d85759e68a8bdf70fe4bd159200b298233f6476efe39d9e3cf0dfdcb43256fd00810c3399445cbbdb34a9bc5c6350737b7cda8d3c4c77d45381a80e7eb23b2218a07c7decbcaab447e9a86b5182f5759c9fde3dfe94f2649cbbb7ab48749b140d692d4407178d2c788a21e819678ae7ae30d74dddc4f8954025757bb97e601906658850955def69999f7efc5d1af811d8b82d8683e370b167484a457ada707a2b1af3683c96b7b4d0b0266fc5a1253b43be47b095f941fe38aa9fd33290b57fa512d756a4cbcd5545468109f806fbad17ca8f93be0f55c5dcd5daeb8aa6156f9cd59de07604199422e8f7929f5161ae7b646cf6a42b934d7b5165562a267a9437e9abcf5a4782b98c1ff0d161883e88971546a2ef58e3e03ba4a6dcb917cb349fd86beaf79ef30bad72d48fe7b57c8194648660489b2dc447580744e082f098fc2a43fbf61051d3ad690b94d8df02e29ada92f657fe5942c5f5ee58466ed00875659dc8fea5855ab48cfda8dd0fb8f3d0fdd32cc38850a2de01c5de94e355cb3213e01bb86677e5e96413939e4c86fb5f58b1cc3441f82cb906f39f71ea662b5cbb74bacc5a0fbf7478b31cc29e54446f70959c54323a287f8be0638689eb6e1be6c16de18a362f7e50460df20d0a1427cfe566c862ffdd5719f4f27acacddd961b2ffe9ffcd27c2f75352cd5a290b4affc0bf03bd92d946a379713f6b5f2c0f6e22633b0baccefae6ee7421464ce6c307f6d0353a0ad95df6d3190a251435f62c30ed6b9cc0dd024c3c316565cad83d2e17566b8be6828df432a2f25a6a80103474fad65387c67b8fd337244901343bca989e3133b45959242eab928bc0af001f55181590800fb93a39d1c850ae9f2175f13400c202b231ff1d9f5529c4f7283567c19404483d5dc3d6bddc2d218d90a8b7a464a74041bafd860ad4c4d61d0b1f0393fc0f2ec3ebc54047da3ee8740beb626bd763fb7c56980e5a7bdd72652b44eeeb9811c237c5b6fd0c4cf681d6e5a677f6d378a2c697670d2ac4e43883fb4f505502cc90fd7e016377aef48c4ad0727ed1d365c4b4ffd308d84a7986ee1d86fe4cc69029a9973d1a166aa946343ed7dd8971bbdfcbf274980f76fdebf7e4942f5f5dfceab083e297651a956e17933f1a8a18db527001c4211cd4e1d655f2ff99e9337352b6e66a51e0394952897020bc504344db45b03a3aacdee5e47ccb119496d193f001116ce0244125a1fe581549788b98c8b1804f5b2c1f4a84d0cf72c5d4c2bf5133a742a88dccbacaeabd95387f4c47b947f49bf916f0b045f692aba42f8185e4c30a84319926893bd303190fb12fc20b8d7f789ae9fd979652972495f398682933ddba11e2f911734bdb2945ca80a85dd6a39dc731b060f4795f6631ed71e6ad1a735cafd7ced41fb9a83e6137f95b2ec7e353e47aa3bceedf5df8fe699871decb7dd48203e2518fb0fce0f865f46adce5c133a921320bf40915456204869a3ceb5fca3ed40e0a41a64b8951f0fc580694cfc55bd1f5ce926b07e3e32ac6e055de9b961ce49c7ee41e06b024559b933a79518192e969855889c85d1858d3c4a839a3d0c2a2082fd59cc0fdd5f03cbcc6f818e0d4e407b094f9b909781b37b7a2712af2b688eb8da4870cbafd7d6a255a85687b985e4ae0f61f6c7178ee6d49e31973847f25b118bf814c8ff149ae7d53c5d2aa63c4cd86fa8f553d915edeebd887200e72f4f371a4f002e557e17415512dea05bd93ea22f0bdf5c657c9173df16eb2e938731cf8e377b24397d1459dc12211060c683b35971fe09442d9a080cc249ebd462cb84f097cfd234795bd672246da33e69e3b5f4c49883fd8ed0574d74d65e3028e3fb47564261cddab2611f300c807c2c254d09ebf6f21809fa08a914d8b0314142df9b5e1df98d08e2a2ec1e44d1a27613259fce607d1d05e2c3298b98085f16b0d6f596a8c1fb6cb340e0d65ebb39ae73e5be551d4c95ea4e2fd4bf5e8f410df5885ce62ae29f6cece40441a168c83e0e356e687788081f07f4b299726c5f8fd89fd836ed84017157355e455700d78dacbbb8efb459fc0ed5bbcb011bc8410522c0716e37cdaae4badcf9cbc6aaee031522a3d21de6fb1e7f2c28e0a2cb70d59b95307751e8212bde80dabc388f9608101038f9fa588cb7cfeed01c4f9c73690bc61c3783fbeeb08bca0bfef3d75604662e7e4c93d638418baacb9f6a64d2273afb3d97142f9ad98861937b40a9b75fdf237db42f8985247c07224f3b4a1679f0db9c7f4eabac109fef7a19662d408143973d171899fdc96aaedc160a77c6c6f40e40d87798acbc9619c8c2af8d79d35a34c75f942d28961d4601db1e136a750f3d3288d81d22443689865d61eeeabbec9f2272ec6d8df45c789a86c0458af009107879b963971247e7bcd2c57b1ca2c083563a6882b44cf0ecadfe3835af9eaa2e1c916291938d91da7009235996f19f866c9d4f942504a249452dce0c60e7b94025ba1ad09c1ddb0bace9c3b3e00e51506b85ebca6986383767facaf2263300ed9cdb2a483c2aef22775cecaf83639e8a5bd9824d07387a601d4d730e88ea45de88dcda20fa1c93c6da4ae77506564edc44815d45878432696e0e12890e7451baf1a472815e5c909fdb99fd2ef15128ed2f64c4d972d126fd6325ef8a403aec2ae01d3a92f150ae5685327302cdbbf566236cfe314e861fc2027b523aa7a2ddd65b2e7a7c3a61b493ddfd941820fc7dee29805576a60de56055f683c1ca15ee656dbf7966c2f76cfdede2a799757c882e48880fd0ffcd4080647fc94631fce5801bb980790f7b9c3dbccaf3ac51a2dece886d7566e32ef8ca35ff6ef165bd8bce6f02d7dcab530dfb529bc17a3ed84675f115cf61d998d4e5d35cb8ebedc2a8f87083c6b81ee987deb83f592bc3868acb8c6965e86a739e7a4380f05c517104a526249535eea4d28ef59c03e66912707a60517e241c271c308e515d6c1a34667e9ace8b7aa5ebb5b4119c07d3b6e5c12775b6643d7a1c17b0bdb94941cf72982ad367f1b0ca28f9 -MD = e900914d8a38d14b307d1eb8e569a509421d811f - -Len = 48032 -Msg = 383242c709fe5f2ce782bf8c83b645d171f2bd238abc655d8fdfacbd0fbd39df8ae52fecd6e8b00fc269a028fa74abc52a11894e6618807fca462b1b5d917bdf3bb9fbb5f420582b2fdb20239309cacce763f7d17715f7d0bacd8f0d3311f96895d52d8c2a4d5f6a7500c9e6171eaacfef138f15855cd136a9995ffa57e4bd60de624dd84117ceb2deff22d74d5a54b78b47d9825894169bddd5234a92b3cfb15f87e4010228acedb000b35fff66cf6a03285e81b766cfe69fa76464ac263541606d796f32250102342d05e7f3e923d29fdda5786c7a03ff3737a8b26de4f9fa293b94899cb9d5d9b2ac9fd5f28c59d6a78e36d03d77baceedae7a9b9d9623c2011abdb9078a315a72a50992c4f7785d62659af2f306fc3a09345f8703e3b98332327d673a401c6dbb41cc8731d188511987584456ced22dd2f0e1de6874c52402aa5bf9fe849ffad7a76f1b01c29299141ff8302d78438f910b870994f04e8dbaabe0d81bfec1e90c017ab5fb749c1d9b53031d42ab58468fadd96e4f005da6a15c926c59558a22a37476bfe98cb1c5f64b00735b10183b11fc6076614cf95701e6fc1d8031028de32aeaa091b5d6796c307799414e8b566223a389917b2a882070a354573c3213164b5ec0bb951521462af0f9bc0eb980c9482b10a836f82148231177a71b219a82fe5a8731d475a5cd60f4fa93f8ab9f8d947e716f246c0abf27cdf03879d70b716c675dba1bffed46fb0a0490b3689cf72e2616abee8d2bcda35f25d2fc5d4f29bd0caa1d12b9e1fc22bb7f79e8f8604f3eab65273b646cbcbf50803d4cba4cf318d2d62360ad6a36fe8ed3173e64d2ddee93c8aab4f7b6d2a526674012f6ec16a5404994ade36e3bb70b69325eb3d9e86468a6fb0150ef597a6c44a5f61a16dc8ede6b38a361d65474baa792efed5fbac8b167e3c977019769a77e329f2db28bf834a5d6e8318bc95d24f6fe9a1b4b9943f7722ab472d2d597617db0b637a76c0dcb5d38245b74e29cd0bf3f074385cefdc131986c4b4c5a2f21a9e6e241dfc7f52afc2400e578e75646681ddd70f4a01d970bf4960a567057706a9ecc5141e4d8d9eb6323d9811fb60f5b60c5a78259cb016808ddb5d75d37d5289e1c72b50add6191bd373e76d3e1b2fed066f216403188b09ae656b96af9d84baf79a923822c4955f9e11d3e4b02b7bb356958989c74b34c735cf4e3dfc2013b998b007395ee19a1e1cb7dc3cf3fa7f95675e2f1b6bf0ba25be5983d04bdd96024fb7e8d884b5adc3b9d66eca7c0091ffc339607d638171b1a2949af200fe72318712b5aa66a936dd0fee1a11aae6597ef4a7ec343075f1f77d20f217de3b3ea3c9410c036744cbe6897f4ca713144c8f763a20d47556b173b85f27b615fc61e590d34a87f900d36cb10aa50f5702c1adc2608ce284ac4692eecfba515aba7283783a0fbcae75f3dc0100819eb94a8f5653abaec2f0df17f18af3187e1f0de6e9e9f5a9f5fa1c93b103f180e9ec43dc15c48c051a4c77ac0c1769d0a0c56f45a56096c7e86e5d4988347e117552975e687f720e3cf9fe893f1e84514e00470532668dd7f87db06bde1cd6b1d57ebd7ccaef0e48cf7bec1626fad338ea323dac0d865b689a9acea10f27cbf06ed31ebdc9bdb1433664b9094046e6f619edabb0b32a7fe86368005fa7ef9e4bc5f233a7c155fb6c0626fda9178d3ff7319529a9bfdd7bd5d747ee1e44cefe225f5eb4b15e324d41a345229c09383edae5cb2ffd8009cfcf6accf05342504c22bf7aea610ced3752b241b048b1c2741f9ae23722a059fc239259af954d1e08bb5ac97d4d39e14a2da79f3f459dd66013b59cd7cf9d287170e290846aa182c45aa5dcb5cc81b8e620f7d0180939ce9375ea3d7a4ad31fd035dfe4173a0c290f8f45275c6560ceabdb2766e309f2257ea49d56a73aee7a98f0eed6c089c96b3ad7ad3bb9be43bcfbbacad618ce6375923e436ad7065bf32c2093eb28d085d3e6c2428c562dc6ee665e36a031dd0a297e91710c923388041a536393a8b4bdfd83bda98bca3a56ed7c240f57b6ac62db844caa9e51490f17d3e7d262d8acde42a24846cc8e7a70349daab95f2fb2e9e653ce54b2accd6dc8f97c74cb210f634dc2e0aed10b44af4e4b60d93905971be45da503cc0d270071eb8faf4f2a72e9695615460bd95f60b515d4c377c0bf8550125f4c4ceaec83ad3a7006614d6ddd4fdc64b10f60f130e38d752c9df992a2b4026b72d7ce9443f566ebfea41266bb4bd64d544e4ac09c6402d0591e08c6e07abe382bdf40a4edd4e1521c8a11d40ff7d44db43aff340fb12664fd7a86b2eb3e9663ebe5b994ddb63a20d475b45c47ce46c46567e6c2175568a17e25ebed1f5a3b7d176dc1ea9023e1f6ab0982660f59be6fcc579a012fbb3a245fb2b0ebf9681dc252e9c22c91a8793224b7f467a304abae7d8ca167c57d1b5c06a37e15f5e2adf202dc62d17ebe5071c60392f7cf798eeeed79656c84f59cb7277a9c21b1447c7acbd80c5fa3c01824037ed69cc102d8cf80908e95cacf3ec426aaa365a827f9db024f274dad6830c7618c47ad443b29befb74556a2354621188a61c7856e7b6813ab46c1208212ada64ae6ecfa5acf24ba29782500b4fb71dc20f7fc02a1e330bf9aa1343206566eb8167a47a81b2b2e41a7c7dfe0efb9e57674935d3ae35efe9b392d56792af95694c4a81145506fc16c795a0ba9b02984cfce5e7395fb94d98fcf12ae5db8a06e239c9ad439bf42e523e65a31c3bdf356cd7680c57cb32ec983a678c54776f5bd4be57517eb314da34e37efda96debe6359b320dc55d1d4d65f0486219d2ea04bf5e96463c56d3802d5b5408d8add32b45ccf663e891e2d090b32644cc8a649200aee8d3f2e3daa0ba0a576d20781f850bc107b758162e26970783bce31a79745703d18338e674bc59752b8317591b83f63bf8709a4659afe741d332d3ff832c1111e2ec74eb4c438a3032f333cd6198a3723b18059eefed1006b73f35963c39cd3d8f784d4ecbd6caaff035fc418c438228622640ac7b6e9fda824a7e9aef2dea0b59af189d7dd6a958f5b3d751e61510b2e023c1eb6694f511d6dd256a266905ffb3f97d53ccd394dfb5f56b8b297ded9647891fd84bf09e61277fb0807c8baf8f310fc21e535e1b98b3931f39a0ee57670acea0ff96221a2cf69aa67a5bf6252e532aad398bb6bc0870e57909f6f71c99ac7cfbbdcf79e6f9b6c68db43f4925719d029551e0ade4c36094ef5896287ba2af1c86cf7298934c0a8bbccab0e51eed610ff0d3fc84244e14fa08c208e313167515e87109de9d984442ea2a3b6a8ff661ab665c29e9f8fd00bd4bb2c9c76169b101875f0fec645306946c5f4949d730f17d6c37133fe174b6373ec74335f510c557f9e5ff229620b3e8d9d664f3b301a2fe591123066c39a7f0486c1fcf2cb0249196a242119175fec8a93c090871fcf896d366e3ce07b04880ff1db9f396ac714714209359e4c729ac50dccfe8b28754ef51a4d007327d2a61d948ac33c17a2dd0c8cd4d3c0e98e71c77450424e3455a506a5772327b04d00b5d9961002bbdacc74b14ea588d7f99917311503d829b8b7273fb34e04fcbabf5f27c630933cb80b301a3f53fdfcfb393daae3ea32f1e4ace050ca2913f4640aa3e7e3c8f78484bfc82e6f852741de79c249819f637222abb940855b5b80920a0a7fb58336798613c454a5e20f8ee8822d75b9c97396b9dc3b77aa8de4898be71b5804065905052dadf6ab12bccc637c069551106b43f368ed5e0166b7f598c85fda98fc680f4b350b7b47be36e1958fd613121e52631677575b548fdbae01d55c6d390b697e9e54644b428e86b7c7e12356c49830dd6b3002d769af589a0e389c7aaedb663c47b142ce6329b335409d78c62f290d993abc753b096f37a30716a767c01566308d762c6c7438c5424ae95acb1a77f27fcb4338edfc777fb0339a039e37617242bac8ab8d3b62c5c82bed53cd4f2ae67765ecd4570a6e38a8dbe93a85db66915a15d146998250baae2cd3ea3494ebf26951dfd0dffbfd6b75472ed48673cdcb60e5b985f80fa9acdc95c0a868b2621d3dd845b4ef96cb1ffebf8f5708c93d283c73a8f012aa16a439aede13d171366fdb404609eea4815c2b8b344d73a35fb1d707c5104f1d3fa8afbe55b5d8980ff02bd1095644edc62ae4f2463d2ecadb6d17e8386c182fcbc3250f4d16e3f197a916d5b72358394392113dedb0a3065865e5602a8cd3a763fa84e7edbc5c4273a1829277f994509f9b9ab5502d391e7e9f2ab5c3f9ea4eae57b28f5d31a9544ee05951725e5ffa834e679f983c58dcf725cc302a3ac3ec55e1984fc6fd34efce6f815acfdd21fe97b16146ec65680668ffb51988d7c849ffa01e6e50a663da9b55e4f5b7fb432582cf6ef17531d1657c33cbb804595f2c559d2d3622b6a0df5e9a686a52422b37edad77e75b27fcc1d9cbf854c747f25efedfabed65b552c4bf47f700c73942fc7f556571c5d04fe227ce2237f829e8a8a36e82dc4029e052656378013f68f03be1ce1ed7dbb2338f0f4533a7c088a9d0ec53984bdc9cb451f9f6d2b3e1589ebeba208c61c7571192383712ed47ea9d9e8095d782609535892209ef5fd690b24bb3549657ae474fb14caca751b4da2cdc083c25c8f59dcbc289a2b64c459896ab74702300bb0857b5f0adda1a2fddbe502b516c67c33bdec3d6cc0fc457f9b0a6a47f1da513248f65ce409392e27dbbc392db93a5f1f7d655b08ce20d343a6a03eb866b8ee123618b8e70bafff3418bfee5e282cba8591c40bfec177003e32b8cf38ff5034b8b34edd84237aa8ab196c6cb6f21200fea164cacf39735ed7d5a0761a1a34c79e66f5552c0f2dbd05644e6ec8858ee4f312d401fa948a4198f613de0c55db094bb7c89a7f1d4daecb7fe24f1380f7b8fb6c9e6bf171305afa1a7f616020b78c493c2517dddc3ee075d2a4a82842e11f80253043544e09fd93b94f9ab6095ed30f5a9777d8da86049ce321e46769df6b29c3163283998bbbde6901048e7e354016999c14e086c78d9947c69e6154472e40ccdcb41fc21a18329030195a0ddf85e77faf99856f57ee03772f209690bcfb6db8e0428976599548d559539926c2070a834e505802dba853d7a83587bdb535190dbd584114beb5899ee94ddc576135f83af4e3b8dfb74f130fee27b529a48ddb31e07fe73badeb6d537c62842e41a5291d4fbe28546f34b9765d819f632f481cdbe623dc49cbb97c996f3c3109f7d715809b6a371f880bcfb172dda7089a0666523aeea0cd8ca22fe74e255378e84e562b7452658f8636ce37ca968c78993b403b5b3ac54565380fb3a5c87c09877d637477112422ee482d7fc1468031917922fdc392ca3fe9ed8484e2901b2a79d6b5d1f020f37824b275fff35852d2072287200071101b8f3536e1a116a15a23fcd5ea9c0c740dcdf8204edd5654c88ed9f5389e604766c9919f404dc6af270a524c24c73df6424e9bc4d2ebcb06838d01f5bdf9ead0b02d951627651ab50fb17970f6fe202ac42b1fcc32ab20f8a1863cf106af7b3c762fb2341d739d2372add4ecf7cd6d61e1e7f6bec497f29b810eed8fc92b9bfb37447b8178f5c8aafe53e7289da1703c5a19b3153f4eaa8fc08b862a7c0ab78d52104386f068279c114832bc6f16d32a6b14c757d91bd315ee80a94985a9687374f7ccbcea3734774a0f5a00d29a00bcb37dc5ff48abe6fe5982c9657ca4293e1e7f597bed0f69dd16fd9fae6ea77353b1c91183f45b607990066916c767745d9d2b8c7c6f5d523de6a7a60d99cbb59fe46b4c8e62c6ca4820900ad60c8fd4529f60d816f78d680a5791ffb6fa7341e1d9f8c9671a5aaeca9994111b9269b3ad93d3bed3fc2c25c2e850ff32f73aa2d9f0e63ab691a3687159972e602fa1bccef8e8c35c03b60617f74936fa268e52d8c7a7f2f56f2d91ecef2db53c0ab43a475d0467e7a4b7a35a230f3974eefacc7eccd2949be955b59dd8ac4817da1dc6a72edb2f3f45bd6809f9f7794bd6ec9a3c8eea9212b6b84df494b7597c044adc6efcc18b9b6d13eeb7cab678e774f026827c547e024dc1c591a1c35be12fc805ef355c0fb4817771d433b0aac02f820be123a4bae3250ea6e59e44e1efa311bdd8670f1df33934cbffc36a917e8d3eb4f9035fcb2db2fb7c70d8d06de004b47e9b005f58dfeaf8479ad868cf7b1462ac0a99ea415aae14b0b3efea627acb2cc2a7afc122e31d2e6f26012fb73e3bba7bc655d89fe24ce6ee3f41f752087ce724aeb3d91ea54633cd31cc23eb3089928e9cd5af396d35ee8f738d8bdf2180801ee0cb1bae8f0cc4cc3ea7e9ce0a74876efe87e2c053efa80ee1111c4c4e7c640c0e33ed4518c74df6bd12e5f2249305977bfaf7b72ed08007188b2d4bf7d71f8687bcd294cb1c3bc73d9bacda075b9982958d6270569f22e27a4a3330a6172f18ed947ff02e621ad820a0a2f83b34bfdacbddc79e8391ed2b96dcc29cf1b2ff3d907929f9bb3f678406d07ccf28b4e4ea9f6a7b940e5f6b6ceeb1600333412c6f10c98513ea0aae6570997ee16862a54c709212f38f6e0a10f2767fe603382317ff03f5c1336a5bf6ce6a3db172b47d7af003122f5f3465a2328a96d7ea0e7fe2bbb710a43fc50cb2a0d14dc1c030d9f08e2bedca2648faab4f6c293b404a8f39c7615a1f67b11d13685d0394d95e5737bb8b2a365d12359679a9cb92be62fd97b29136a5339519b3b56c13ad369351cb089f4c066c36a2fe61b1d260bcee3776fda53ad83c079efdf89ce27d60766634e5d6c7bcec2ccf4d9812f247b442c972193bcb2ae98ef96ca25de477df8e10efe3d021bc554b16fe7d5b9f9a3d172ff385b38c0fa471d58a532dbe3f1c30de5672f9eea72038169b91ea2eeacfc1d785d3baf20925769fc18b9ac435af051b2323e282efe56a4aaf764d44bbe4e95ca3839071b9c503d4ccac039afdf07173b066f883091d582fa48af3658004e43bd706029f741b8000e64526a6fa891c6498ccca638510983215408b05d9b848d19aeb5fdfca8191a0b8d7427cade16c5a46b5c6a8d697910e6c4762aa1b778dca599426b74fafaf30bee30580aa91c7e144c27bd79ffae8f1240028c6d7ab3992ada0e5ca55ee4f3d62f8de575302d5861d73685423c2e6a6d6fb3be090fbc2a701821b6d8fd5e8233f794b6549cd0bb52b390ac31478307bffa91a9bd9c1bf93ffc846356fef008ebee4bb3ee148e0fb1893d188e4934d0d088a433d14a596c5f2e3e49648a22edc6bdbcc58dc1edbd440046b3a169ca2b68c2f5458c40fded975557524dc97d998c0cefd277cb772bd4c1b263b1d0cc824e508bc837a78fe3b119d86557e288740582eac3f559b4c22873891208a5c23c4bd96ea21aa697b67324c869ccfecbe7f9c8b7814f932bea0abfd4a7ec1135c12705a7bd7d669ecda61b2f48f244cf582f865ef3cda2640c404d9a0aa63cac79aa7e3dffa80e2b9212a915e912dd1b307063e500b7aee78e93c4e3237e4dafcc9be93852e2c7c76c7e74833473f038d88407569254de3ddacbcdb7dabb6cc622c4f1a19d75b9f9c3b32480115fa6acb6331bb890ed5bed56b00f1f17a7c37ae3eb3c7fc8a70b49007a6215681c270134454714e1ca4d7f6c093322c288775277d972dabac1e63f8999d64921f39abeb98132716f33db7b83a0e0c9c3a7b3d746563cba5d0a7164c7d82724242c276cacb085d721702d6a023bbf1b024c9d8fb92a422898ccd53f2201fdae590ff892779ae74fdfc86cd453a3772067bf5d04361c2b2b534d395903da02f0a9e432b8810701df9185c03fdda0b1e0db471cbe26f59fcc76d7c638d02ddcf1faf2006732bf7b921fed503508fa1564442d0244f27d4812eab0a366f3c033b936828825f289fc6d7249453d3c784ab38cba361d007ccb059520fa6bd25bb05143dcf27d292f2c7a70e0c6e0e1e3f9d59933e1d4babad3ad6071f0cdd7c8fac00b4867f43f77b4c002fcfca45f03c9d355e32aee87fe061333e9af1668ceba0e740e0f149c2a3c4711e30f141fa063b4a6113af5ce120c3ef7d25fcdef34984468751164a9106b1883de26b587826e8076043871f9bc8e369272277bd3c33b69cec6956cccf0ea3a423569110070933fac054de86fc53404ee1230a77c434c858d4ac5b56e9360b5343001aff3347afa305ca1e498f5a5aff2f9a2d9527c72a18f46c7c6f8c2769243171617c694cab9ea515becdc138a3f8571a49abd3556c3bb05c327d043d4d85631cfd2e3592c82c22ca489a3e98abd91c05e702538a0f6f9cee26160de218f54c75567b04b475fa034a341553d4e30fd2ff9e6f24bf73f31e84bfb0f5d06bf2721d05e9731c4576cb2819f5ad87da0b1069d818c3703a84b9c287d44862a71b6876740fe -MD = 581562f2a9f3097f760488cbe87f823d0fa7524c - -Len = 48824 -Msg = 9d1898f04e38da85c27e6317c19ee81c3bdc6b1ae72102622a4edbfa3ad07ddb8375505c4a7d60ef90f55e0b3940e8696df709733ff304fa8ca74d2726b3d9b432b7975bcf653f8ff9db4a6bac2f41e84c4b3b5244fba2fdee443534b3f85372738776d52618fecfc4d8301f63927eff9f81089f3f6264d316cc9a0826c4737d0c8df4b098bd2516bb96170ea692241830407942784fd2e4cce8858dca42c23dc57019d56b7d3ccba4ba0722bd57bd9ac531952437eb7598da40fdaae697c71b68d8ed2ce77fcc5848ef0842ef08d1ed27fb642bc45dd458077b0a47c1ee0a7dbb6f799d56ec5c246fdb235685cee6791e47ee4066ce778a1a42b44da46d14cc88dac411feeb7597e0265f47c7d086a572bd3c4c6766e798dc3c04a2d73c6c7195c4d66e29a59e196579c5fbfd3738dbea0455350d4cabe81512012fa2849ad2aad3b89e1d415f12c47c5b5b6f2a85834fc541e5a1a94be48c6bb4dc4d6d275991af718722e840eac6d62b4f65d2f30369a709426aa450f20bf023921f1e9a6d1101091382c2ca09332f3dc026560cc40053b436b266417c5849583761c07b75f171892983f684d8d3319794fbdf582edc704aa8bf17a6e93c1d5bb45c7a53dbfaa6f8b06fadf7bd6e8243b52c955eaac4a7d47fdbdd08a17f1432f25575a906f4495e928c0ea921cbca4909019fa69e82a058a54ce3ed0ce9d7e7d897d8055ea701c4b62342246db3b2af7ac126b873dc02e1015a4fe092420e824d69ccef4bda7731047b70f007eee17fefb6511d929b76747b4f4a669b5161093b1279f0355753ad64dec193594401c14f26495c6187a31bfb71fb098fdf768689db068f84e43c40be925d97c97db77b845a35fd4a6732dd690a8b50d6b4f8001f0c9c55a04adaf3fae06b84c160adb7759a3e88b404cac3ad6021c3d8988d80e5ed62c9f250d6cd001013e0a8b68b7c0a2e8c86072714d3b0bbe6ebfd53dd0dc3c58173e0c0d8d6b86a7f35e647f8d32b5d467faa96b7175865024faeac91afa1de20dbd36187170b36d40ae3db9dc2c07095f9071a5c978ea59c78516d516e677e688a34fa8c97dfbb3de8063a2254b1afa07e857aab5a3bc2dcec505cc453fdee810769548e5f1e42e056b92b2e8ee66290958c804b684505eb35114293654b7692dadc373675ae13e5dc6478697a48d18cc784f2e5c996b6f1dbfee666ad395dc38cf36a2ce3797675026de77d1fbd44bd9ad5992086141d15647d12e331b0ed3ea418b717b165b3b8513d410f852e024a98e83da5a5a981805af88cb5fb966c28aab2e4a0e55c11d5503c4dcab584545c4923a61b313c2c5a44d61d8213d523ac2629ba6e8945d9f488d2d553b6a5821b34ef9b2b2fb464caab7f8df37f535aefa1e4012aa407543f7f689f55907bd4aee1b5e57da9fb72f8165ba4af49fa591ca34d817b3f8cc7dcbf6475764ced913ed8db4cb8a6f89e0d0dd22a5f79b06759b2cb010a61bb7df3d0301d5ef1e203f2a2cb98852f932f31184ce6aa155fcdce58c64b7e127cbdad38325fb6874470f3c6eb918b4bb46f8bc031a13927eed4a51ca625805ab7ce3181d4052617fa2168cca5ff730243a4448ce923b3b645c10386d458b84254f9a8327dd555a7ec5e7a3d60a9e45c28178305dc34c1cb4cdf121fb6accdd13c863ad49499ec42026f519f835887624b1071b1729c0b6deb75fa6eb5e8681055bd0eee831792ed249b147d78d4041b95d6361a142238a40acae3fc3ad6300588e54d08b118f0b23a2bec5ca6e50290ecb3f9c82890f0789127f44fab3ccebabe481eab8663ae982c6700c6755329c73aede24218acddf268d455f171e3e937dd2caa5d6ac273a7e29779424de522ca65cd1b104a3fa51977192f6af5932a82ceda19a9c5fbe7e844037e59966495a1569bc9ba2810f0f6a73eaa409e1338a57a9a9214ffd7b3623bf33891b8992952f69f17c818e9678fde8aedfdd32dbda8c8b43d28801e7f1eadaece751b4987e72c212bc38490b1ee05462128fea75e919f6f436cb198f222847d698a283f5767df682d33d3ce771b05bb6d4a864ac56ae914cc68f80cb578a6a8315a454240dbf9bd469e6d6b611cc42efaead3de9a3b8debffa5be447028fd774d6cdb19ea4a61689d8eba2f16fb2ceaef904d2b840a733c05aa6c06ca386f31e648538dfebcffb15c8a22e23fc0243675c55cf82ce1834f06ff681b6bb2e62023771366243abbdfa81b0d4b83719359b40f680f3ac7a56b292d1c4bfc9d498a2d80856c03ca7d3cacc7e3338b18639cd3f9d93655c5c1da96bbee5d250280b82beb106644772d0e8d190c62ffbc7b47fb08173625e1bfe27631481b8de872f246411b1e8e46b39e7696f0a08666c3a253c68ad7532587ccf118914bdd570980a608105a8a41f7348dc8f7b5c81d23f404ba9ae0879901e02ef731b6bc582ca972cb56e3e06fe218fa368a686ee98387356cb01b6844166556569024d3f1c3b6d30f558137d85a91e6680f8220d2cba10f65324e9f2eaca590bd165dca2cb7eff05e75fb378548e879e7f0cc85e1e38bba2c8a42d45face605b52b284811ee9cf23f1e1b897d9566da3a930b461db38d5d491ebfaee0ff71dcc5374ef5a75105003bb8a7d5c8275032e9620a0a8f24ee2045588dd5b88b8e3e76a2987af6c87243d9ab68c26fe8f1a87dc3907a3d1cf82ca79f73f2ef3a84534fd4cb7f063c2ae2a15f26f979bf90657d20643e3184f1a9f75a3aad8ef39d42d835b2abe09376061b3da922ee93749071e04ffd734522bfbef3aaad9b9d1f34992e14a78bb79ed7d0abb8e4d74ee652e16b195f0945d39482d18b9b212253501b25b81a0f8eea7c47121de73bd72ed356298a0efd6e4c53ce5ca51e256981bfe58367ad7502a11e08db9ed42216943a588269af57a7d42227fcc0dfb15af1a87fb1e908c4fa0de49c6c045394f360b06dde80ed1dd7b4291719a385ccddea34721506d2045d74f78a2f160b9a56d95c1fa5956d59e83592251b17b97fdab68b451986b43d151f7e5a8a9ea53b274867f53f71da12c19d82da6ae423d1399bd480243055780956a295e762c8804ef5f87714dcda514a3423bc6ed26acae2e238ac9dcd5ebd21618bc2ad2c1d6fb328382e8c9e151d6b449d5590a83772bed2de50ee2576124587606944c24c133f294ea1107e357e0c13182d363031d2b3b5eef47e0046815d114a1214ecfc71d83f63590645df7c15eabbcaca3001f1aad19220b5267511514770468574d59367b49fdcd8bbbd206e11aeb6b2714ed78c70f05dfb5facca0971fb8cff218180d5ce29b4eca8777100d01a7958bbc18d3fd83032b87293b56ed7126deabaa54008d62a68acd4b577b16f279922d6021aad517b285428d1d966c1de70ae08ecdcea13c9817f071e3b6a35fca07a89b886bc25f9c637490f3fda76861db3d3fb5b62cf2f86cc085ac4146cc216c79d8bda569ad194ca9df4edb33f33fc61e27dc5575083fffda0121b955aa08170db251d62fa2c1a73eb29edd7640d9621ff1822b3e0ee757997ee46d747bf6bdf082b57c88b31e19bfd5547302d3b7259f0747b5dc5986fa8b5954fc07d465b7bef489070960970ab992101a5e1e618737e3ad73d47a875f2c1b03d3a435edaac5722d14262db4f098835251dca3511d571123f3bb0470fbf85e6192ce02f6fda0761212639d0071f9138ba822e51e4e991a3ba3f469cc677c7e0ea7d9de0a26dc8ae890461101f547ed3c9bb56611915a696503153d021825045b817c29afbcd62b110c423c21f0f16ad59b08a8e39c3779209f91d0aa948e8be8ce1978403639d11be4ec70e8fba206f72491200cb5acd40ee7fed73e43256f36dc363c7419541769b8a951df8bc65c01c6e35de5742704806ac0a335ca6648b63a5708a3dcc158ab060d517e27dad4960073c5065e228515a66be71990dd82f766f04f68071e2f204b9ce24d365bfb145fc6f807ea4bd03f0964f5521d07b86af09683391ea70599f7bc96a55dc65a1d435169329eff608d22506087e551539155ce468f8a187658a900e14ef4a65c1149a79b4ef2c9c0508f92bb238066eefb04ebfbd3efcefbeccdee5482a1788b80d14e00957c177a598fc067ad54a4d5189c8435bea656f0d6d4f962e8cab962fc78992bae9174f8d8c14de89df887c06a7b3b66a8443d1fa76ca68f09f6e57cd4be3d8f02d96ec68eb2bfd07de2ac1b713f5611195fedb2cee36a5b3ebc9933ba008fad3aca616dcbe28a91b5897e50cd3788c79a4fe564cdd7d93a2f7221120cee2408aedb094910cf32bedd737b0acf1227fca39aa09014c867ae24be29a25de57f13e781a2f31dd74cba6e272e94074dd812bdc6cbef44139a49e6f72f6f2d7515716d64eaf613a93d06e02b05a6f6590dbc416ab3bcdc77e58fcec38ed2ec1b7b83b8eb2dccb2938846cbd59c9e2cb23d6be6ed04933e33ddd24489e4681a4715dd428b07d17b54b2dc99ed5ff41ae7db8416d41b0ce9f5e7c3f0e0bcb9589668e0a2daf5cede3b414ac2a8cc4331788c9749967384702c97d75c3e7420f7780930524173ff3bd5b813eebe7df600c2b53807daaa946146728edf199749a77a6b3ec954fefd44a28bba7684c1a71984e9c8d9e73ca72de1ec4d01f8b29dc90c037e708c1343692040c0e29243b0ec0d9edc28628647467d79b45d624297dcab7672006d4d5c29ed5ba9bb7d80bde8eb58e47bc333ff3b87bf3759dcc3b262d718bbc16f09c1f75850e7899ce528a09c8c745c8fa2398d7f01588fceb297fc2d7ebe6c17d4ff51ffa50ca5770d8b939fbe0e433e7d80bce2049a57be9b92f90d1cfc48ee3b7eea51ec8bc7a2564142737204b836025f3a5f1d7f4a32fb4df9f487e7e058b9cb00ed7be738954c043da62d1a343cfd4f9624d069efb23e136f822413daedbc6e3620f791a0c67b2ed5a653913f89babc40f1b1fcb0c2e0adda2496029123cfc30aaad42d78bc503bab029a0c42c2c73fdb3436aa25cb9f57ba5a32369b817083fed9961d28fd67b54e39550dd66eaf34b57ac2f4c752a6bb90a1ad12628d2b0b733bb1e359f02e160fb9090872f3df5570240b6f1dfea343fd895b487ebd7bd4084fbc02544b1ff890104a7ea0e8d3fc8bce646b7206218b417fb12b5888cf684e94191cc054b9b74fcd8de2d8b429b478d8629c9c2f9dfc0d03634d7875b25286975d7526a387eccf4f47d792ec4cf7c7e09a54d4d16500c0a2d621671ab10d70d7fdbdffbe07037f240ccf5807ba30e9655036c47233540cdc8e49acde38037dc47e59941ac385dfca412ca08d0e1a6de538b4d3a87540421ef018a236d3df0deb53dabc302a0e81d08991f4e294feb5ceb8419adaa75fe0f8a020efcb00fab1bb22a3b094b6e7d5a54a71ddbefb7861a0638f729f462d99e812f50de14be109c24f5729cf06bc6bd7085eb368bdf1e208aed1035cde23bd7bcd075540111c668f5e77703575f6b4d447bb3e7638f5c7461ec8b599dbccdc0242da8e3dfd276870b4673c6ea121412b8d09a77e191e820717d911dccb936649f8e0f1516c7c702505a8d6e104b6815b5ceca6d6cac692ca4e74a0ac2a11ec8163ad2710eb962e0aa6dee8230d40f5d21bb6b516ba7879ee074dda7e73c2ff6727a1a7f306fee2903c5bd8ab473b2f2e6e0a4ac484beb800f6a737ca4510ff599960fc8e2b314e542ab230f03f1f9ddea859e056a603dd9181233125faa66cd75d6d8d38d4b7c1d4f67489885158b2517f281e439ae24b2e3b446f0810ddd87ed819e289a00cdd9124153ada2a911d2536e74d11dfc49125898d39f73431b29e8e188506f9aaf1f73816cd6c27332ed88429f557e1354015f0503a59c14c9be503cbfd276e1ccf95a6ebd9c4d3d977d9db72bf7c4bcec88e045fe8c63478f4b0cdb6a36169dc96eaf516b86abcde78a7a13404057bdb9adc39eebdb32a614da0406b205b69551865a72a11d44ebcb1d079e05b7a0de657af059f21b70f701722005bfc6c0920a4a431985e78161eb3c2ca2a3e405e995f74fbd3dd38403fd1c481fb8019b5c9cc1528e3f6ec8f6eef2d165424fefa4f32bc914f18bd892b1df649dc53fafbbb0f47018f83a82717d44de300881c7d9271e44a439ccd36cc5c35cc710066477eee98301d8d1189b3f3c3b4b2001f34ed9d8a9b73b1cdd58e0d018e5bee12257fdaa748f06bdf03cdde1d0feb057ddccb062e1931f065e1faa0f803ffa555124863f2c0bab86741cfe3b8591e10ceb1a54c3d3800e0fbe89cd877d1deaec59a630ae92bdeeb20b024b53434bdaa787026e0366c830c1665eee40f5c6b62da2a5a4018decf8cb1cb76b30f076c4b0184aa62b84b2aca3bc66b843d28387a094e9894007e1f059110407da7658c6af06bba3411485aa3d2969d097fa9c85ce98398871e7e5ffe251afc75abb39092db81d0e50fd8a5418162ee1445759d73e145f499e153e4df0448052b7a963b4b298388e5d2909d0bbe97e9153cf01a678722173ce7834010a524151f9271df0c40dd3cc727f4946ae0c2188cb4cde19051848ae0afa1144b9e3b86b291caee5ed7fb86f96e794df7ae5df6fb4b536596c709ca459821b3d835fae494e725fbab456ad20d24930c2a6de80ee17f2528d35e0e4fac3f99c15f32eec9370107898a1fb7b872d8d6619ba5dcbacfbea7adee9d2ea5b5045daf38eb837f097de41a63dd4ea4baf9c7e093fcc89526887f6740fad746d094f1e00de665a08ccc4010d0f4ac115605cc0bcbc92828766b00d762fd94bd8f5ffaf636a9e1b8416aa02f4a0c6ca8c49b6745ab9177ef4fe4d080cd2be37451c3ed745bac9440c7e788a8476aecb597192e10abec3454137472f607fc4ff5c87f2dcce57509b470b16e2e41b6b8d23e0d950f554fe9e151a84ca97be536dc43d040725c899e9dec56c523e1766d8939f71094302305318aded21dc17d34726465da073950ef578b46321b7f0067351b544541b51c12af3fa6a7c5513ac5629abe3efdf471689bee1e1997930b228042a3979a5c819ec4e09e4222a3946627673803b9265186b5853cf00ac5ed4bd540737bf0befa061d0e0415c84110933b4a61bceb4777e64ed12169f7703d3fbeb532870724ebf5022896b728b245e908c4d9cee6c05af3c25279cbe03a617aa6e16f3d2046edc82ec0c48ac66f9ab42a66feae4e29813bbaa994ba578cf08928858802ee9d661c0d56fc2513e195912a914eff83fb712a921700a9bfd070e7adf22b7cb490eb4d085bcc0ab3a0ad1c53e449271abeb14cd35b5c0e9bad4912c1b7b80f34b9f3f7aa5fb290083567a260c08bb994dbb81f08c6f57d8d8c1f96ee56cc3ec17106888dd32e7994084bbfcbc6752b64eafc1dacea6b6ae7f53ae09e5fc68ffd6e999c0d46be1be9a1dfe0ef56a4011d54f3c53a462c5b3d61418c5c2335774b0b339ec33adffb7b9a8aa2560186bf20b245b23b6ac6c31068b9f6924197893ccf4b0d2a10129cbc4ad2709a479bca018b58411ab8b936e3640acbfb5b7b3a35337653bc76d4743e3b5dc826a951b65238a20e72b0822b38fbca58d1a14f1ee6c01c2ee4cfc4167404733585a757187542c986be02a01483986f49cfe3818ba40dc2eb5dab3ff7f00eb93521b20a44fd42252666ff919755b26ffb4072c1250f74f1156169c6ad34e29643a569e9e05cbf4b89f837d50821e25309cddf7c5f8b8e3d49aaabe68ab508a0fd6b2f845f1612b31e0c2bf8fb6a90aee1e29a11bfaab1edd493e21e24e2e95faefd835835bbc4e24efd4c6bf5b255da0009333fb9df98b952b79cec10511d38e4c6f5d3f8a07e5fb95629ac6b7b9a7b00bc2b44c2acaaf640704cceb1821ca33b7207961c768791d9a14448e128e6e85075f2cf8e94514b3a786234acf850452f6938fd05a0791f2c691cbfdb6cb3d87bc11a4e6229341e8d1a8dcc571660951d26faa768b0db5e2e18237fdea99991ef28122fe1ddbbe6d4e12fe4348eb5f9a135dcf3aa2a26d55b28e9175f5200cb27057b128214614a8e66b91ae9a3d909381040804e6ed42b3025ee04c20871dabff3a564c78fcca03605c9eedb08324a6e30d5cbca017bb6499992c6cb3f7557167d21b52682468e4868c2be8d2e6a13a031fd44b184761d03fe87dbcf6973a6c70c807223ae776b51ea44387488e91b6a7e3769796a6ba60bcf3dc2430905605e1c422a5366c7dddf14bebb259a27b8498004c89625c507ad761508cab0931a2846d75c1a3dc05c4c72a2d514e4ae80b9e1f5e09c390ab8859dbe2dcad2b51ad1f6c075fcb5e94d268e8104c6fb05fb380e8b200036b51f00b0899fc7f1d408c7b68e168f41bb46f9b2e9c8b04f968e4080252546814cc1cb2917dd5690886a9600a09c2673aec0329a4daf655508b06fc1646ef3bb3a472191d964db214a96a96fa89576ce4c4f6dbf1d176aadb518125cb94b7c3725f5c0755ed4da4683339e4df690d4a41c5b077be8af14ac241be4bca46964a77874043e089be852dac7d1362afce4b78769ac5b20b507e2ee42336bb647316eaa388966872869e8a9a9deb2a6581b5b2601a8f765e7c8e47c019ad44f43570f43c -MD = 844e1f50dd792b283902e66bc1086a273c05d511 - -Len = 49616 -Msg = a28331a966b0865892c2c76c124c50a04a6ecbc74c4101554f75f1205d391f684b5b2f15eeb1b2418cb740f69179c73983b422473838ee1e4790993fbce5bbb31020aa4c584f492dbc4a208c2b96b2b74d890a55b9af98ef696d3baf6ae49f67d818c9d40a52f0250ac38fb74869b8238f37ab7a3770a7cf9d5400f6d0fe728c8d8db5376e82512f5e69b4fe50bc828431042c3d1a41c4c7cb8c109e55fbdd2b16c595fdeaa61456a085b8e9ab55b7e21a39b627cbeb97dddb5e922f60a2874a5b0992ace888e19fb85fc200c1fc0045341d70bfb036c71bb512ae2f5bbc19f444a0d4cecfee5e148e3ffbccfb7b05b666fa838d32e9fd8941f08e28ad113a2eb9d482ea07a136bc0b6d8bd4bf996d3c98161619b9cee02e683f57a1be699302a2ebc589f8690f9f153099a0761de1e0b2bb52ecaeab191210493423f68ccb77e72ec4320a0d92c695d24db989d008a99d2f5f8d77494f3d22544b35bd428b9570e5a86da55766387499d0a65e7a8b9f3fba64847e702bb887a9c45f7b527b65255898c2310d33fd98ce4aef5fe311ca81a6895a2ae7548a2590c829988542eeefcebdba16f8a31eebb8e21df3d243334b39f896e27873bbe6507f1c7ca38939b4913edcbce05ca254a1c1b78110c9e186bdd6c010e93054b13310bf8f74f74c5ee744b18b8d0691bacf0f4573664adc18784e601b03325b6d7fa39a3abf3531d319f7c0ecc64af4078bf35030996e2debb385ff6b8e22db047d6236e34eeaf0fd6e7e914554d0d2221d955f2074dedbe6b5a6246852a7d95d75731af4e7bf8fc23002acff003f33f3cd1efaabbe42eef0c8d7587a176a5f60affeced3535c180ca5aa9a83903f1f62e3b6a9393e416ff332402209a41374f5722cdbea5a6892c2179fe238cc7a9f57a684f532bd8465d63c0b0a7dc24921040824c89fc38c06cccc080c857e95baba5fb165fe03b3d8812e5d983e39b46d75b70f1d5c586f7b120d0ea0d46c3b797357648205d875d0db506155b4d1fd6030c8156388dfbaf97b21d9278c5f12e26ad3c6d2b0047256cee93cc84751cc021e835d218a211489f1529029141fc200881effdf654e53714243197a6083c85c252f10dfcce626315ce65c2cd674f4d8b37f36318d80c02a1da41ef1652d9a752e155526b5f597fba22664ba39265074d43d944e91606088485573b7c018ea55227e557cad1810efac5ad15aa5fc7ddbd4a140c0d7b7dc93ab9e4154d70c5f05e7b0386c1c15391462caca9582c0241599f3620fc94cdb532ec6b04e14d1a18c67f4257b6ab5b972acbd78f13938ec2b0d7b24c1cee906d1ba17e72fde2e59f28891443300c03911737d02f8302d7e241780ac604d54051435d70f7e9cec2f4034d1be1b44fe60fa9d509132d06681089e4c2274b0567f24894f4fc4b8d3ca7d52fabbbb9f37d734147f4d2681ad9edf8c25af835eb71d0a9cc7d08899abd3b1ca55629c7a3245c7be515d5cacc87db2c8547b17bf3f86cd5887b952a73cf1e4842adc453bb853bc8510ea5cb780c5883a20adb73bb66275a3d633ab4a4ecd1f67c1513e4c91a91a50021baf0c9d1e6acad36dec3ae35b0b67fe6619eaa80e695d61e8101385eee9067119dc11e7325f60b4e53c248f17958b457926ef135dcb4e53c942fa5cca3191a30b6b3026a66fe40a3a3261823e1ef7f4955ac157624c20e01d5c67dde7fbd8e11ae4d02125a23e1e9753598479ab9352e13cc83cc4f4bc4e0ce7c4d1ea4ec3726ed058a1550156382229755d704647a986546d8a2ccb0ae5bd6a78007e333aa02eb7326ede93149f033b1bd4caf6fb3fab2a160841daf2ef596deb3249b125b1831fc5506961619d6311b4b32fc4975e79472d7fac285db20778852ff3d06cee9492790f9e7123786a34a9c049b6034c183218b714bd3177f014aebe2598f89f8a97b67224cd44793f2b60c4bdd72751af73417822a258863bc8cea98712af0c8cb7e442a47daae80b7e4386362cebb766930e8a7edeb827111d4db6c0457a7cc3786b47c5873f0df5b6b9d05abf38c46619e9b4cf793ba29a9a93ae793a42395665b44930f5e92f265a2968d197f4c2d78d39bfbd7cc83efdc7085859f7ed896e0325108ccf9298c5f2fd1744bc09f7e1786574f2ee4645632c157e098664b533dc2763821b218efb069ca55b375dacaa60d79813d79ffdf35220e630ef9004cc77230cbae37e5af01f6edabd0fda285dd0f6f6cb40baafd6c09359773858c0625c7fd1db2e9144cbc4db7e134c67b5204d2a55bf307fa233fed49f866ba32f1c14a57b8e054293b57e4b5804f7eb991b61db7c9aafd62033954d80048f5b9b2326fbd27a6f7991d5d426313916501d7893713402c5a76ffe0c64c499ad674a9e1aeb9d48741e84544ed4d159b47d895c6b54459f7bdad8bbeb8332eeccaf85b679dba69f1c19b55974bd000dd65a25f172ed771bd857a393bb1194abf41b9393c935b32870526c0dcf4a86fd86cf385f2fa2921be40618ad0276b0782d93be5c95608d8a77b1f197e6e12ad0cbc40cce2bdc5d4aa8d07f324b194efb80ff4c3a62c4fc6e391f8b2041ecb52fae21e765ec04a14d2b9b1f491b6438dff4478654bac9c77cbf8283d069d1f0c135ce124cfc8026cf7651411bfcbe35ca9253b4d324d7b85b10c421cee5faa02f6ab3d5ace3bab4768fd82dcf758f0c65610b1ede295695b434cbad433dcd902055b977ad271813ea801a2b8e0f40865769580b9e4fae272e34816f56fab4873dfdc6427652040ad451fd838050376b48b220c53a2147367217ccaf30a3164c2e6ac37c30ece563dc086b7cccc2dd83e2454d92db248a8a27e596b4f8c05aa89aa4996e027b23e4a9af4b5f9bed9a95ca29c5bba9e2ddeaf6a7c6c7d7daea6329b42e6015892656e44d84741458d76bab667287cbe2a91f87644430f5782d4584a16c9a909d558034eb0003608bfacb2b053a406aac57f28124f83779228b1653733a639c401a2c4290a654a60e6d7ef20d072cadc94d288defca248c606c9d3d327f0561f8dc20b6445eaf0f6a964ca986c095bdc0f58c52cea23e55bb38a3ebe725c606500425370f105bc326dffcf8784dc1c119b6e579c868cefdba57f0059a13efb4cdf8036dfaa4a1e9caaf5886ec96f9e25df7faa9e6041cabe6324c325131c792f92182010c03c9a9de6d26fce98284481322948b2f5e7088c52f7f1a166798c95be76a9b4e131b2ceb832f0178fbac1ac39e7bc6ab5e12bce1b75066f09da8807bb382e2c6bdde9a79583b3ea0e9b781f5d3770362ed496ec23388bee8bb41e0e2eb937f7eea5c1b0e54125b6932eea4322950ea5df15fc6ee09efc904a9a91117f965197e80dbd534df7bffdbbf99ac0108cd22a3539aedefa34d304e4f283aa243c059cc69a4f372613fd2ff7800c0ebd8b8543cfc430b4d676a9ace9608830c336ce7728bff9b5042267edc456a097701d72731d3a1478ebf0eb08b648f15dc2f306a78d033f657eaf8a87a0f21ae2debf34489bffeca3c12001a8da307189aa1d68be41e8a2b0ec27dfae2bc6bd895fed3524caaa0bcdec7097fdc39b6b3cff024f1c05f4a62fe307d1c1b3691af38a341fa827bd044fd48f1888110e50f0284e344147abcc5ad9dbfb62d63da5a9d4003e4341ad68a20fc80dc830edb54bbc5da2ee6572879a5720c6f212d90024c3fe2b76a6efab7cf4b7d24ea1de2a9821bd35540ded6a96e152ceffe7bf9cece06a61c2a6184f3939db207be244036e0ee946129f70d7b8ef0e7dfcc345fe7aaff17ba7edabb65f25ae52e080a3e245ca6e7fbaa8a17178f6905e7944208746890fc3a6dc2e93676eadf40d0b9249b7fab92cbc97f3aa6f9ea4dae5d8c3d9e91231f43ffff548da7b668e61c183ac2cf655d7890bebf5052da88dd2ffa458dac1f467e3d7a44930c2448c8f60fc7c2d63d12ab072fee3c24a17e1b12746a6841ec3a922e1b03702d9d468d658615c31c99770b35bb0e93f6a7f7110fe2f258d8f2c328dbcbd84b928a2bdd72656aec28e256412248697c5153bb672d2c2684fa98a8e84a700a4cc451bf6223940f65828175f4d6bf4520bc0f91c4753b4e152e48b37985f3e29d4a5ccac182fc4c57b2dc9ccd5a09eba7bf4343d0edf5b232fd6aaa84943da863ac1114a5978368ea405d9573b50ca338e25597349f439904ee6456b07d35a4c973da64b46912ad45b56b2790efb2b4fbaeae5698930e4db2899f7fa64ac21df4261e849600926191996d19c911e26819aab648a3d03c14655683ed0e03ce5d0f4d443af464e9cdf572cd34c8218405ba5fd534fe5eb63745de79678fae40aa4070b64f769e01399acaf240352a7fd4055374e3514565fd79a8e7b7d155004daf18db8bc3b4c0eda7284405b731bd1d2310f91e438d30b02a3c36a37dfff58e86cc1bb584b1103045152b4af74025283c1eceab7c3ffe967f23cff43bb509b4ea15de97609ad84c9c180fd99d5e9f3c77035952a563b9f9a1e41871b27e2309057a8cf700790087d3b95878509413a2fc4904dd66ff481fb7077be48b622bd3ff838d9e0b556f2a13806ef0b8e969a3f4773612661d9351ea155f136d690a5b00b84a542a370f7c83f6ba087e658985871656bb4ec482d662952cc8019ca6e92fa229e00526c7c74ca2a28a4a105c90dcadce9ec5fdfdf8460f49c9ef02e8c4b4c8930c432a7f51950c8f3cc3f3c80e1cc4058474cfecfdbe0b20dedea3b836b8b2f19e8d4b1f6487bdeae89215b6456ee463340242372ef41218d17688ff8563e9a95f8a9290464a3c19545f7e0f7efb935078185ec6d30dab996960b8a3fadcf42517e306b83f05118649d137b901ea5c34165e2c8134345f0b6d443b8edd4c5bcb8e3fb08099e0c5978e90479e1664c477d77bb351988fb5d7a6c91aa676daa7058b4796d09a04dfb6ed45b6a5059155818318fb1c49463563dc985cd50caf5f3ad8a3c2918c99e74a2c988db5159896bbe2dc0dcc8d826718d6590902e9f20bd13bfa3ca9b5c666bb1430d3b890a20f8bbb70f047ad6bd45e5eb32a1553cc34347df40a025eb4e3706db69095bcd6495ad87bac77f028039e3a4ec6f5936561ca663a3683ce8be6d3ffd1cc34e25dcb91ffa64a42a0e27c3e33d3e58cf1e41afbbd74c8134f72f74b912a907d495e1d96f999d19203c0c8a811ea8fc1b471e72f4c4ac69c27919f40ed68e3583b02c8d38efb494e63eb6e429c3acd7c263651ced9623a059f11651ad934ceadfe7153ae8575bb5e068af6769c6ca6a58d58df402d672b36ff1ad2421e365864dbd24691a8ae2eaa35c6e9abd827232532021aee10ffa2168fd36d1e841589651a4d2ae3bd4faa1937c7ce4819144be25d5a883e49d2a68f9765be17d27a6998030c860c8dff379556b42db727db26c55688b399a2893f885ef84d96d20c01e5de34e274e067de06d8b58f5fca23bcb664b52368e1cc75ea2db2a3014a745835f2f0c6837e2ea65206f47aa8ca94169ed0095e11cf42519b4cbe47c10359766e8866bba12efd9862289679faeed73b63e3abeefe3494da840342c13fc564647ae8be4836b97cba1e86c611bdff9433efe2c45b95d86a198d9a679ae2573d293f5a21f6aae852166e67aacc59c6720728187b2b40826a149f58545911838bcda726b74c658128b43b156a3137081abef8ccf9e866fc3fd5a0863286360ff6599993a7d2cf4ca59a6bd62fc8bd903460464565196e0c8f647a6c28a9b8c428d4fcea1a10501372d2e8f3211a542567f6f9cce847c27b03c713525f4bff6ac646ba74378f519c366498b467ae648e5b86fba9aaf9c91042085580fef373c97bb8ba7627d638b09a5665602a0c5694b91b3324d2b7eb95f52f263d2e2a7ca8ec30e43b116d6f1746b2364191bd90ff29ba8985890a90d0c34270d3177782d1c4b9200a1edd5c99e180f29dc5487c97526de513f678208b554b1a88e062ed0aa958562a75ad69fe13c683bded358123dd3b2f17428b038c52510ca5b273251c44176ee44065fd0d868ed0e9320d066d712d4fd994cba29c635d2e71b43392cf3cfd5080a48e7f8fdfdfc168bc57753bb7492ea115bf6382307668360f299cea3912e546cbaf594dc9c23e84b29b35565799b2b7ecefaf0860a4a23aeadeac37e55f137ddd50f20cea3d2f833c62ae86f825c46243e3eff49befc4c76ed8287ce5ebc36f01f9b297ea5b7cae8432489242f34dec3f24890f8b60b623c2a17a82e4bfde62603301b572210e4daf966b44df0e339b0a39e721d6fe609610c1081188e14a9f2285472d2a99cba8e8137f62747b60b8ccaa6ff224d2aa6a7dbe3cf1795bf16e6e78ecc8b9ca9c065533ecb5ac43ba8aac008b491ee27de533227de96035b9166c93584ec8bc69b11e7d1a052c6f2b5bd3c2a2ef6b38bf515a7432c2e5758ce1465ef487fe781bef6c79721a9f079a7169781badb4dc5af4193dc544af2551152161263a0405980967b05abbab11ee1695aa6049a1d4341799049d37674cf0fb28255731816bca4736a93bb2f897118f7fe1d88bd92a370102512263b4f350db8031f0321eb398f002ec7ec52fa0ea2750a4eb3d05e64afc7badbc903f215bfd540d570683e4e94ef20289bdf8356125307c0125cc0e544e2c9ed385b0def8a8ca42f6755706a7a72f72c661fa5d5ed046f0820dd7ac3f403eaecf0bae320f260a5734464222b944e0c49b7bde20c972bb88d6bbcec7f21ad96518eae12689bd3dd47843ee3e076d2e8172d14b868a51b6cc66f757685524244a16eaf2c14cb68b422c32006579694130b22dea988ab56045988b1d9650a648e532d2890c41591b27b7dc239cf7824059c355635dafe8e17ad53dc659cbe76dbed26c4d0d50ed160e8109fded69fe53850d115ddde23160f386d7fbb9ae30b95e607ee7ce62bca37cf280365fb726a43af82b81210cd70539111f63bfe1c9574c42d1fe575d0cebfb720b77fac9425803ec6976301323fad3e0dea7724cfa6d10e22d3bae2b261612697068c7879a9a655195e413e15d644959db6edbd80b2433a65a46ddb2524b4a3f78b0cdda7590ea8f7575d05ccd6e24e6e061006b43a33cf81fc6ecdcd7b2295cebf715a81d62190ed2cf716eba3debeeb328ebeeeb13b33f4564e18fff74392891e7a5dbd8397a36739afdfe6efc26d91d6aa44a4b9b20e295c7c6b510b9020c32268759ef3d9670227f7df32fd15e0ee6cf3165ab640c4bd497a23553a80b6e955cc30caa95f422a525f83746e419f7d6019c295395ffe1cd7e7ef7106adcb783325fda506a1db6c53676b1fb5ee2fbb5a5ed7d8a577f0c472261e38f26fd50c44f65ad2be397924a57004995673e824a662a489ad21634092b53e11705f79f205ddc6c8129ec20fc329ce75e26b7f45ee95d74c92d4bc1dc425dd9f12f500e5f01cdff9b63a3c6a36f55739cc4d4bab9d98de86091a61b880f85b366cb930448e53f4dc1ba45ee06b630d598691d3a23dcc38ca625b0abd539d557bc0245e9a4b13a403a5659ffeead37f69a3b1bdd649a0648e512f0d78b6955ad3bfbf0243b0dc7bf505e676123ff71bce965550b43bd5e04637fef0871460c9e2ddf1b1fd59fecb349faf87b6d52e610cf0d542d8aead3a86a9533a750790210d8d54f413a12b3026e5493b7944f9fdb925c9ea9ffcb6e1c407b461af0a93fec860613f2310c24950791c07c5f9da3037b79bde96b0836482d5ab0cb197fcc1b7d99ef9a843546545cdc073397e4fa72d28c3953954934157b5af72093a2b08405b76ba1f9372127b45bf14204cead0edfbf985147356e6970a2a58325bcf30e6888107059b7bdf7593605126e01c3c1e938644a4774ee2e565b415b99729ea3ec33656d6b6023aa9196cb0b9d2544713a1f24a65eafbc4a73ac5410b56eb72adbe1f301f9d75a2aa5a3cc9559e33908189d61cc548edea710be650a4258498a7bb94094c9c76a5ddd848f1969e3a96dccdaa226f1b85e2b74b9fcb007d759ad15e4d68fa5d65c2d80629dfd96cc9c889efd6f1bfdd643c0e9c4a26cce94f17af0893d5853ac3781d8647caba8461a41d52e50133f8f964db507dda55d3718d956d1fb599bf203402bb3b68967fb2c80bb97ce76808c5eb921ab38c47d67d7b28de49af94750c854c276d3019a90d92d965d70ad8874a3ee75d8382ff6cc35eddee9a29f1d6d8fa4e5d6597a0bb02a30afabbf1e1ff06ed3f9b5674f900f3a73910899b5e7f25f18dbfbd25c800125714ea742320da8c650f56b4c8c13d8ee2aee6b09a26b864198ee0cc50ec22bd4d9bb7981511943b34db0216f4f46ce5afb3d3779ce72d23c0c6431bbfa99d73f4e3d4a04e40d6a3db2730059fef29a85cec59772a1c37e585c86943b87ccad6db91d425451afc46d6786309103dfe4778ccfb17b8328319d719c5acd1d25546603a488f802c8fa4a5531d89fc4d553391ba3ad1cdc67931431eeaef9246a7532121745785d1fb3dc62bc210cab9c8fd26589b4dd14494dc485c3b6480464b7dad0c1a05dcc7e982c776e325f1efb414a51c9ee47939607b655659a4126dbc36524e9c22db6ab50417d90342087bc11aac6aa82e1c11668f08a1a836df09740dbf5d6d273836f84245a6a4ed84da5a6f9ae7598330790197c0a2b9952cb5fd7442dd1f9b49a92dcdbf844a90ed87fa93ff0735ac6cbcec262bfe0037a20fc30a9b3225f7a65dcff703d666c4a9011c18474e9 -MD = 61ca85608418090c78ebe8614bb2b80113fe130e - -Len = 50408 -Msg = 2d18667cac7403ce75175d390e00c5d40025ad5fda64c5d678bc634685bd28e03f3de14c7a4dab40e86c5b5097fa1c08bbef5a38aeccdf8f35d23c6b05726bf08606b258d6beca8911dd41edd0251d7eef8fc220944016346cb9e26a384e7cd689d9a347c7afaad478d3d9b7bf6a105f236fadc092a8b0eea6d91dea2737a2bbd01f7ac156089147a6b7e9576eb23cd2e0f6e3c0b3ecf6e46a9ab593d81626c7e44100708ab1c80a22ef3a74e5e3ea00ad8c2bc7fcf5303f4064710f55d450214ca5fdf96b93974674e594b72be6621012994e7d77a9a626b09f1a03a65768f290b539070194452325ffbec847a4ec2b9785158b2bf19fc243b3781ad189b66139d87b40559d1cc8bca7824e4404d079c5b9459920b6653a800853fae0518297ce758c4c6e97625ec144a6f227ed5521239ba94e5fde3eb7f006734bda9613bcd7f635d45468600cbd3df35bfa49c44c3a940853ef5273611916a0b6c842b2f7dcc23c8010fa5efb37fc3131c5ff6521900d294fd8fb4b5f859ea1e2b13ca770664169f7a933a452b7e8281e8ef780c9af6cd5eb23c010dabc083f799d6c3a50fcdb86e227fd793ac5699fc85f195d6b1f1ad4cfd78808f944ba422095bab3bf27f859e8933f27dbeae760d73f4d44306680eea2fc3d7de5a71e72819f0e59e46e00acb2f4e1f45cadca31f4377b7c400e05eb0d9bc6b5c56d9a9644c65075e8595b45e752ca29e6977bdbc74d8b4ec29f1092b7ba0bf9c21c9878110f684ff27071ec30b5e40da02f6026f78b6502de9f0bac4964f490043e7fde8e843e2f2b3cab6b352616eab3fde2d92df9f1e0be985d016a9e69c4b25ab791662cbb5dbb446f899dac4806468969be109e182f87116e59c37252dbf5f9a8593f0fc520c910260d115062ab825c5e9b4982c0396493a67cfbe7971ef4a2bafdc23645c27d2939c038194d1f8ffd27397fadd2447ba56d32bb0520d5d8dd554796a8248900160e6abb0fefaa94f42e605b283799f4cf2b42abd5d548c832e1fd636d48be7a5f0fd3413a3196b9cadad784fad580f8994875725e9fbeed2ac6e8d38e9ba8128da3c273a3fb2928069268a32b9640af8c2c93b9a964816e4c6cd08c120491f1273100f95136ad0630c0d960c46123402f3f6427bc0ed774213b7d36016abf3fb523567a4cc8687ed0cbf362cb1d6fd30aeaaf65a1830927309cb67a64b77b23c0e0899e9d9ba3b56f1b7e524bb46d92a6933e1a60ad5eae01f5440042d20dc5cfd0640e4b96a5d6941842d7490d65a38aa4d7efff7220321caff06fa3a3bd4e6a5bae725ea0b807c82a079acf109f2e3e83438c88bc95da0a33806f8f12d3e619e92e71dfa3227092b99443e4a5625c4b9a4a98027207cf52e8bcaa0f0796b465e2adb4d5862c3b7a2db27991b4f854384fb3bc767cbc387c356ec52a6a4fe1d5aef3e348311e8d08ee29e4dd25a73f8d0c489febc2fd3e10845c6be9234794f2b5c8a5408b4091c564c12dd0e0b845d338cfea692b1109973c4f42521ac3f64260f4a2c67ed96c38f741fc72ce738d913a1144f9a142c099c40ff270380e2f4f153e83e1f23349ea1073f8ccd51f404f7cd656a10cd68c9c86642448636f66a13d70f09acd944e61151dcae5de05859665e5c76b5216942ae91680e4842dc4be415090f8f845a32770081ac5d26e85ec5d08405f5c4a01ca55ecad4b8491703087a70c035b8e71c487fc8f7597a068dccc05698412bafa0532b0548549e3927f793c0bc3deb6e0bec4c1d1fc17e455eb1aa5e9e25cada861e9281c9bbd6b54317ed936416a07179f8e1e8962388174a3b0b06981236d3268e01dae94c770dcd0fd443584e5c73fee4cdc5fb0e4c1ee8bf4ee906a4d40c1a28056b1784e3c52e46046af94393f7f3468c3faed02eaeb2b4f2707a4c46f7d96319dce4f3c15dff30ea74d7a4cb700f8499b03217a45920c2a2275376e418dcc5cb8ad227844ab876f2fb63d0877e9c2572c2154341a0cb5eba8832c35001acc6770f5f8ea10dd27eba692e553c6631bfa3efd8f17b181aefc81d98a00f24b1fbc8d4eda7ac39d5cead38b7b17ee96899a983ed90d511880c3751e59b661494cc1d762cf10a415acd47f47053b35a9969f038d3bfe43f9b2aa4cfaa141933bdbe016d6df94fa6aa211726e8ea7e4c5ca714792bcd0d04dcc17cd176b88d14a5480115512ee0ec7c30974a91b434211ac782cf4646c3e3c5774c11abe73629e400891857106285299254da0b6f799b6c41d7a5c3bbad5edda28f0aea3ea905e27e25e0e03c48f33abcbc4fa66ab2fdb9ac6f8714aa2df89dd9b227921d5a1b38f754099d1118d938164a35f34474ea9b7dd6fdc980da237e8351f23401cdec40229ffcee1d3689aa459b07926b33c48a2c8a7442de16720845eae5508a88fba076662543df4696f9b10b4ed47d741dfe3f168521208766b387e99b7825ffcbc279432d4ed5ad83beef376669c9ba79603be7aae4e6817418dfda6f0b52a6cf3e81b37f5f7effd252669c08a2fe8b4968999a4ffe9eb92ca0a439ea9aaf22986d564396065991f56cad9580107a4b207fde9afedec782e2d37b84889679d799e73d500bc3f4288f562ad07742cb9e711e81564225ef635939cc56e39f614a5634cd753b28bd17e2b764c958ba70d9cdad0878843474fed23c2d0d6605f40f4fce7d3fcea532e4a208f1ecaed7f8a188d40a6e6fbb06a9f06304349a7a808b092cc2fc10b9e4134fb348b6e43bc17a550bdda45efa02f92636e848fb6db531f4c84556bbe75f283e5eefb4834679b894bd18b6cca1f86106305fd7034ff0b8b5396abc2aadf29810544d6216986000da80321243235575f2e7c14b4c91d173ace8a9b8d78e4ce7484be84c189242d798cdb0435cfeb8ac8eb5b33221e3c5f75e6e98b96cf8cc9a589e46df03d460a1521e29d674b480793c32bc184db64cb83c339e5a358e0025c3d3ffa762df67f288f9f52824b54b608dd7226a0a89d43ae8c05107dbae761e1c756911a003b74fcfe9b8c4d7a18806f62bbc93e2bf0af3c6ad274ec9ea9cf7b50b19ca55f1ed1d7955cb4917d9b4b0f798b14280f64f776842a79b7ac2f327300d981e0f1a57e027c6c3016ffe601314b6c6e25fa0203a4039487a88b807411fe55aa905fda63c5dc536aa4a6ff881dffe53ffc95d1bb0e0e990685e4a47b9d73ad7d8050c56967dd97c8031af0ca1bbe7ff07687d908fbcebf5e175ea4315f866a64776d6d7632a6c2b4fa04c1ad73b0c0e75b7822d0b56a91f726a2877c9f6013c63c5eda736c605c95530c781b6cfc328d7312b5fd820b943a7a575546a428300a98ca14495e32ebd3d4d91ffb4fcb5d4a85fa9975abd9528dda261776b7074a9a535924de5045f9d64614bd346444c8875bdbd62277fb52590fb7d4f42025e8dd35b4111c8ac00d0570645bb0f390fbaabb5b75ea309a1c07e2b194a827a9923b0683e3ea53ccb0ca1c72005644d67e1d6e227db71cdd39fd18bd5f7a14bcd01c8d6da22ff591688c10e6b40e9f3fda463cd9f67085ed30a57c823e522e852be8931b57d5b636c0b415677fc04bf3968fec28e8fdb1f18966d5a93818be2d2a07e0350ac3dfe43da8f39d6a5491193a5f48b65c46e912cda7ead956b40cdb56e23c62c1e1b7c269d172317cb3b9d94e1d162c5932747883d284bb9f0e60b835df6f4a861788f9cb975acbbec30b5c5b331f31e8ab9c4a334e6bf61b0e02ec51674096604d98b0eb637212366dcecae9082b6e1099a7b165836733d29d399e32e378ee586b3110529b83afee9a4c4b7e04028bd9e2ded4a2d9401acda14ff65eb9dff97459994187a95549ee30cb05a48f6b2f4b6f89dc71b8bd5213038a1d5f533d60beff186a12f3b0893c199423e2112f026f28f0f05b88a884acac333bbd175aca3e46f8b37ce35c17e23befcbc0f216ae4cf55a39e7b1c757a1839177fe6ffee0fb147f454cdf209ae8802326c79ae8d8eabf11de9d9be374f96feefaacc2f04afd53f7480a51c6bb54ce7a5b7e726d2a526c5b0805aec382bc5a90ec4e77f9af4ce9a6e33fa01421300f3a926ee06d4c8be681dfa853312af22bc0746df8e1b8f1c0d53f7234d374842aacf51d4dafe69d13ca8a0df0f314a4cac6ba90ac700cf3becb842b75ca5e560718a91522fc9f91dd8032bcefd2e7da1eeae73ffb6d545acdd2d9f2cbc385b08ec6d9dec51c1f6e2be9fe3eb6964c9a117423034da2372ed43066509e849199a7fdabfea0d70f3ce44f171aaf07eaee8aab95620ad55e78ba2e54cc56d72b1a3a0747ff19f51704f2f8a4d840ec6add72d966e69acf70406914cbef5b82fb392f2ad6699a3ddecd3c2dce01d30f736faf44bd176658168cc82af23f154da8006eaf80c28a780d9faa35bd1ccf36aead2a34c37cd438f866bfb7f246ed02db77dfde6c94516e4b82245a98b19c2ac29ecbf3a09d4d36bdd53605f38c49673ba56bfec36657e7417f92e28848a2b3584b7bc87b023a1b0de2155a1c9892467192f859acc103ab979ddc16b46a489818ba20fa7c3401af929344ff95f2316524466f35502cbf81f4e5eb3e459ef8a3a9f5a3d2cdba0cbaf1f2ac3c87228c8cfdcab9dbd72ff333005da5a2626d1a9ab404ed98931cc104d50733581ab00d85a325bc9368520587640ff389345e1446e0ede594f9e38a54e4d9c29d75251b17c05f62a42b1e5e46c803be3de2f94f6fd6ba720d2496ce74c6704251c1091d09f9819258491a6638d340ec0495c633dd3e737e4d3fbdf42a24d499bd25e27d24f89134f5eacf85242ece6627754e2957bf1ef09a70e0663fa60eb129ca3aa230659a2fc435c324d381b515eda91897a701c5b03ddf888b7bf32470ddd798f4f5e7a16d0d5380a90e73fde0a05aace693ad6fa57eb63ccba5b421c0207585db3a27b0d5186c8e7e9bacafae86af937fe46b25b9a41a858e87900a883ccc88bfc9cdce4f2ca7730942d5d369e9d154c861e2eed3f935ea3ce730e9b077032908688004c3922cb9b4cd966ff80fe7772bd4bbd2dbc32ff33d8e3bc51f1a43f01ee0e859199324e7e602968d43411a850f039dd9ba4b3028fa445aa7bf6cb3666af8aed53975b78606ab7e3432c69205dcb8310c56d95f12d9d0359677b77c12527a7a800c800c1d7e8ef56dade8767ff9b91f7298b4e43843fc739a2f41c57c3f2cf36378fe4c34b574a43f9cedee7bd0ce0e136826e822a18ebdbbcf54b72d9ad8c28566359e54132432b2e71e2482c8c1a6f8af759359594fba0240367aacc9448feebf6e2b03006848ce76c33d1b4959902853ea0c64d5071376682f3581363901a769f11acce4068e9c312464cfbb5d74ab3ecd7ccb7b7e6f2030891035477ec0b74e06943427c7ab230188bf258796f98a56660a17b57b7706808a344f66dd752655f5c1c53173486bcc3976a513ccc8cc85fcdfcfeac8d332417cc957fa1cc8fd6505c8066bd20c7d7c7db2d7c8c68979b2d9227b812b2aac59a5f6d66b0460436880d27f3baba060f79d9b440e4ee39ac543fca4e46d247ab24ee453205de60045ac06b90ac8ab1c27e058734e2a7e36a58395d17a566aa633bebb5683ef013ce4d28d3b41efd6baf29012ecee2303553ce1148aabada438c33fa267fb815a002d398e8d46e9c94142f3f03858011aff71a4a157df3c7a364c17c10ff0dd9853082b3238837e2bb9fe531bdef28c6a3d2c1666c17ec992aab58f41d5cac9643e5deea1c35e75a52b0ef6ba66268c9c16557d884ff01d979be6ef4a42f20e66c814cb02b64198de9e5a25f6595bc85793d522328a9e002f12c67f03ddce7445f9150a7d9a93ad7f1ac927f73ef80944bb924d8af8ee3902163f87952ec7c2aad948f33cf6bc7d2fa74546e49d67170b967546b8234992b9af384e28bd46c23c7195ce645224d0974eb6c8e5ff0fba532c6654e59318d1fce59a1de213b13aa4c8e5e22036336e5e1602f624ea58bac4864ec039cec1bf72c14b3ceeb771f389e61e78962b511e2d081218c6e9aade07ab13d3db5eae24c44a34f37231efb594d42ad8eeb8e6a9ac2ace76f6816defc4a39fd2f4cb45c89a893d8a970a92476d99ef4a51665ad882861e57da3c09b6a277d808ab9bf0729a844f4884c9c173bb3d5716e7bc15715824eb059aa1e7f84a2ea8bc295816ec6f45507662f6e6ff26c94983d7427f3cd50a1bc65f386d8064d0f63595891efcbfd42a5c581968b45844acda4a800003a24298e3518a04159766a9bc18b7726b3337c3428fbbaf5af6b66a6467ff018c66d448a4971e147e8bf6ab99da697900727805702e6323b9ab286a665746e8a0cac615505a7c0684e98be31402279b85259fd62d5e9a2c981ca0942b41dd1f077622e631c12d40ef592a3975b97a40c0f3b220c347e732c1f429d0fa4e4d0c8911f0a28df5b82c8782dd950326e8d07b85bbca7810d29dfad9c8061aa51d19ee433633ad1da531130dabdf0772fbb37c82c1bc95e2e3d50c74871ed470d5adfdb6fe80d9627db65da19dffc9c43b528c93cdde61e4a342bf6c6d0070d4fe2f7f0f4f7158ecc7252be7b9de91452f137260e618263f994cda69829536fb1f093df932ee74e20be546870962a71c5f5ff89014522a1a4e5c2715cfc36d0dc0a2fc1aaddf736cd25e762895745273539fe4cb5f74b79e48d86c155b735f316962871acb2c9eb4a2f8827263fddc6f9439ffbbd06613f2112a72142f8e5290a3b1a5a291be3ddf061b340f7ee38b3aa99711066e10864031b801b851fa8f52f5f71d5a097b9818832f52a4eb10a8fc1a1fe254425a5aad2eece1a9cba15e9ee89cb8e93a4cf685a39ca5dcb36a7adc703b394e522dd563922dd990a569069c03083ef82c19a14eedcaf55cdfdb4b033252df9ba86f418ae4e2b215e53cd176cea4772ee8cbdf9ce9220acf774a6199e8cb9de44c0ae449ad7534df95010551d1d62a347548f997200aabdb819e06c51a1039d144e407c9744d2797bca0eb58950721b1db7a376619eba22807c17faf51887b099ae7f132c1d253e46300cbb0a1a0224e2348e0325c2eb55f109a1780149b2d3556faecab1d6c806f910bed847d07f6b354993e227239ad28a5111560ecb115fc7e043e5c0e8375e04ea898fab2a665877657975fe276512acd0ec0766032fd071cef306e1e7ffbdea2bf163ac7e4367292693410344b6b0e907962ebf886abfe37a20a09d5c8da119639ad6d4428331eaeb75d5ef122c17bf63a41e63c16e787d8051454bac6da2231fca6bbb2dc2230d5295971a0621d1a083aa590b5487b4d0600967855e2c2b97cf1494b9767cc530ca77270c9734593cd5fd811ea852df6c97bd79d2e825c7d7d00dd467e31f92d5d19ee83f5bd018d4d9221906336c72b295e20e9ce106e173e12acd3eca27066cf6716d4aaa81bb191bcc735a9c10f932f91b987bcf2c12ec70dfc1b6b22fba76a793288739c59a6a0c3132a4390ced7e2fcea9d80921d6b1edb16468219609837378acad501851483914d94b909cb9e4b88fb54a3564a764d62427bbaef68e03d8a65c05a3f65a5400cbd9e9496d091701b33d3aca80ff65c8cc7e2990cdb2785580d9289bec2ffe11eaa6d5b9ea3585b9edb4323ef3594513fefa4a9d88117158bc869eae663ca6dae5e2c96890d9a14fa3bcb909285f7366500e972bc2256f709df6d062012afeda31f01cebed6ffa1159b947cfbc4c712e543d87b1e858c33bc9ac564d2955568e7361489a7c6310cd943c56f91bdaeeea7009a4c677362cf8a409a8d66b566e661eb8e52aba5d55d2d7a87efbc3752d1937f566d00b47fd55d1b1307423a8770f98597ae323a969af88a0286e4f95bc3910735674f108d4c1c71595cd0ec620c974e5627a44e19cd24b95dbb71cc72cd89e15fc0be4f313daf8b931376939fc5238cf4446aa909fd9850c116cb783ff56356fb03b43815affdb1eab59ef6e6a08588998dea130c333c9655205bc5694507ac32b59994e1aaf02a86c9afdedda7a68a6b8b8d54ca76f8d54260877b99c55d2b2b60d42b3d376f408ed711132fe16cd995c5bb33edceb453af5fb861767c4e1d0f8bcfc5cf5c63392a682b5d8256c0bf3dc4dd7a1a43585ac5a35740a972c0c805bff12a4223b25e840367847f0f8b828c0e59effbdecc30abb6cae0d9af9c763683a2213c9445f7c1302c4fcd13b36ba92d995b38a6f81d8a207b09af3ccb6dc95f4a7465b6044c0c77e387146a22c2bca9038579a4c56b8a67d083d22034f5e7db51e96791d7a48b61f2f4fe1dbecfef08013765de1960d2153315ec63be58b8802049e72da7496675c25e313371d968d4fa37a45ede468bb10b89a20e53dc63d51d5b90935a81c63bbb8d55b4212a4f94564edf2cfa63dcc4c0a59e27dacb1163b1e907cada95d33c454913a9b808cdd17c44be4e5700eed5ba3288b93a6be9b044b9f7da0dcdb4ffc95913191dbc0a12d6e1e8cedb64e96c60f707c95d0514463f9506ccdd70920dad86fc0c388e2ddfcbed06b370d9f4121cbec4612ae0b9ad0843dca731c894ec5b98768af1c55ec0c32fbf06fda5374d554d67888946016b098b2273f01be32639572b9c30abc73e2670bcce6911dba8746d9747627d140aa937803804b2a643b18ac049dd868de05d78a4139e6508a8dfe6fca59dce19124f0d9dff54d506c92afbe09ae09fdb2fce0f20de83e9e5d7ff803faa2381380965d722cfc8cb2b420c703195213ed7b2e2fdd83600e59bbc3c03085edade9b79525bb6b148de3c35beb25b4489aba9f101097323fda051dfff36fecaab2d67e97e6202acbc54612baa8907affe2d7a7494fd9aad626330c9aee2caf57eb5c7e251b3aec80c76c4ab37bcdddd -MD = a1f35ddd6a6275fd21bb8c2ebf290a06a2563df7 - -Len = 51200 -Msg = 3a14145dd1fa9e46c4562eed0b0da10d845ad84f43cdb16e29933699b8f7151925295133af3e36503079925bf2c9226bc3924ba24cb00a559eba2e6c0e83c50c43e7d4748dc44b2578463746a2683a46c9b738c3285954ab044f1ba182f7fea2bbd506e81292c30ec6458676c3f2d0e8be50097b80d075b982da65febb5aaa21b67b4f56e7b288533fffe5b2fe70cb97c9e62592fc1b57c741e4734c62b4b0d25b621888b42c803c0dfbbdc3fbe9159c1200f4d04344e01c69f4af521e0ef8fdd311c7442006951158c177726165953fc226defdfe53fa02219380da986f6aea4510c653d34aae1947da7985d8ec33c701e14be0d44e8cbf91484eaa77dfeee0dae87b7d7600b29d03cd2dc40a87d77ef6b7a3426e3f7e9ce29b828c64666c29ba205089b12e8be5b422faf99c3d69aaca324eeb732db8e13c148245070dcc0b0c40ab412bde2039806247ea3917d194a4dab4a38c2121d6c63cb7a007dbf6cff9d1f66b8d1759e192147e60871bf784ad363e326122a3c3a99a89640dd9d2bca85a98d07ee21e2410c006232e53c4c10dce525f993825ef0cb76158c00d491c4163f938a746574c23ef47fbd7c71e95eb2a5af3dd6b90a31819a546c9814135ee74816baf4bec9ff227a9b02a7eef466fd3bcb7d4c4ca27f54abff4cf3da351d516983040f9c566a6f39409ce801d1dc350e270274abcc3cad2152a7b4758b61ed0a650ff59cbe866d870d06cd591620c2932e97d064ebfbf3711b275a947acf22b13949672e46f5b60a5cbab86345d75e716e97ffe6962fe031953646b577d79ae47c1ad4cf941ac129bc33499ed562311f537d53cf3f5acbd97d4f093726fdae1aba2ebf0f3a78276ba7fae19a394412f369c26c8d6c0f4eef2fec22b7fcc3e4ca5fef965b8e905156bc9c20b4060f5c943e01aa8f80bfc1d9299823a65dacc789e9c7eb3324f5c7614671879ab02676883cb5ae6431eecd2df6dd8c90ee2adecff4523e34721b0221f22576accc2c1935e248e8a9d40ed9641416adf612b08302ec190fce1a6289ff2c227e78be728d33cb55e9af0bb27ef20dee38446ff06cd95d86c06e727ed77f70f32f7d0bbc6af8544702023d5c168e40de9c0a5a4cf4a9a52600a41ec263194d11da28384c3afa19a6f231ed7e386f594249c66638a2fa7f6130ed73dfc5633cf93f08c8b475bf97f01acc909b7d3bb3b3e1f72845f05238d2e1d9162976d3bd23aead318793cf3bbcec20cb262d69fccdc52af4f775276df583c57a21efe14a2ba97417381d9f8157f6dcf1b0f17070da93b060cfaa107b43a751147ba922507bc00bce388ba7156bcb5fa8de41f5cc84ae45f02107740d47bcfa79792b0d8c9e82b2db1b668c4462ca3754e097507c36a55a37adf5e8807c45301dbcfe094afe5227d26326a5bad783e28a6a7a16ec7af95b8bc92dd4714bd07075a98aac2825ced928825489c53488ffbdfe62cfb9bc1ab88104f7de6c40df5a25e1697c80af492561fb68bf100429cd740ed9d150949a2fabe3ec4cbdf5d25b82d702e0f0f561bb0350ebac17b116fa210e57c23d7ef7ff50d893c5f2d549d3210cff7ff59298f8710545d738d5b104698f5528fce5a4c6347556d0a759b67f94f5b7b00af16f7c5f9b1fd71fec985a92046a5c0b633112bb2cdde3581d98bf4323b417bdbc55a51384d21229602d8b5ef00001e5721d4359616174617b70f0a0198d2d6a3ddc013154f51ee1caf11504f4ae81178cd9f693d5ba0a700ddfd250399b47bd00732f3d8df153d5a773664864ce701e3de79afeec202be04f25c2c816771d02aeab6d9c827f677160351d8dd2f84565efd6beff073c4f5ea9f3506c329913f782f57ad2e4c7b0419fa69949c1b4878b2d27b118c976eb37c8b8f9d11089a2f847d1a5752792d4d2b0587800b37b9d0a704b3fd0a56885f805e72d8b32c1608147d09bf7cd492b813ccb28472ac61c4043c1b9bb2d79b63bfc2e79ff0bc8c31f1d62bcef48534ae9bf6f28818a1c8bd9321bad4cb432e26015df4da12e18514e331886a01b59b98892c4f74463f74241a5c988e9fc1ca100dd7a4715fc28818b136297ced8c4ddca615d23044aeef5f6294bdb2747af689add9fc4d20881da5258c15edfe31d4e4ba5a82a45a15c1d83372322993963af9a70b06549c5acc2305dc54a37dcdb8168da268b9d09c70f5549efed9443c1ec8c414c96f1d611efa1acdef88b2877fdce6968a55ed6d86208fbf29accf942b5ecc9d4d87e9c49a932c08ed83e488b39d8fddf261faad8bc0aa7dbc897bc7e824874d9b8249acc9540334567b5cf7dbc04e20a8c63f87053c6e82be5791fdde80bdcdba4a854131a666fa335a63fd80afec07b26a04217efea3733700595d93db35c4b2c5e5aa5cf21e028b073fc229d131391a3791a37d6d11fb2f6b1b10919eb8db8cddb110d29ef4f3666a386d5e8ee45fe8142d368bf17fc0af801f3e602f0eba4f79309a1914ad76cc6b9827a84ecf2022e822022ff2b76abe27ac0d86f8ff080380ab71bbba1432c6f2a5178d79b825d29db62ef1d87fa265480ca88d5f536db0dc6abc40faf0d05be7a96697776816ff1a32e2590ca010abcb8535fdced1935f74b5a42e3b08f79432ea3b4eb1a79ab247de48f0f4e25b989860dd5cac421f1830d4510fe4255077bbb1bf398d3c59f20c01853df90c2b3498e5c734616ebce1f80eea6a5f0f820f6b4519e074f1fcc751e4c4c883e82a88b15b1c0c551d10c4b4ad98c8138e366128f072cbcf8c2b39fed02b1afb3cfe9bcc0c036df017c3c84cf782b0686a1477dbf8f28304d68d51fb0be2bac7d14f75d23ea5de9a237ef5a835d1aac66ac3586da6c08f7d97cb1630dd1230516fc61fa93a29e7bb0be954b1aeac3e9558ec0cc4420577a0978c918690e30500dd0aa03b48b810bb95abec4dac3cf53dfa369cca14e8c4d79d79c8e36b7cc03be5c4006eaf7ae2028a6cc66575a85626184a0f656392fd89733ac531b506e96c4d9c482cb996e4f8b1d6e8e25219eab97ccf6d7f792baa1ddf769056b7a809fade397f5cac359f05d48f5caa8bb7375ced6ebeff9cda53fdaad52f3cb98ba74d6044ade6d17e9992b93f2aa768a9c77832cf0bcd15c781909c01acc902d64bcd9b64dab1709a5c05298f58bf3118227614995bd12c1bbb3e7c9f0ee7dcb27de257420fa7d1b070c8ec26f0dc2d2bcebc5b75b7f328fe8a6f145a5e7d8d47c6f45b8654af3be95b41caaef9e5a50b55b4cf0a261b5397758b2ad7a3725ebcad6b70d7afb1f86da7da8bcc7cc2e1df3fc53701b031f30f04fa87c1e5b0973abbaf5edd2a964e63dbfaf62a805b29d012565d015d1d518dbf25f3be2d1e80e87628ed41cc4486f38008d5700d98c50658d107b336c7b53a2f72357682a461ef683ee4ab9da4e7471d6eee462b61fca8989dfebe4217663edb4a1793ec2a8176195a0dc2a69ebb843a930952e39e18df5b220acc8af6aec04b165fba739829a610e22e2fee1b48d560dff03f3c375fd228c8f282144ad3e8083cd69520d6a1a7d540109a7d01d86015ba6ab33f141aaa87f7808aeafd1edf992644ccfacd31a0f0da7ba95c3ab14de48c3e56f31d908e00177a8c14f5d7cd863a7107096321b9ea1a370792ac1bc552bd35d2603b0ba71c90a92f981c46da58e224ed5681b81c49670b5a274160f0e9b517cc8e54d11c62cad51c8058b32c96852726e8103fee9828c04b24dfc7f530ddacef86512b165b2ec6fbd49365eec88a405bc8f6fe5a5cc71e81907097fcaf9bbbe04f1b61bd8d2243739ab4a546775b3834fc1d3d851fabeda573db192fef580e4af198bb38820f162cdca3bb5c2a5fd6588e6b449a683cf55ed60895b4777d6bd375b281b0c25e05cfa148ef5969fee47085ca5abfc0e2fe55c0df52b3cf709b23e250fa4cd375d904f28b8865bca02823ea21c91cae05cf3139489a55809b66e3405a6f353fbe5972d654d0a7acad6c1ac457d7dbba0d319b492bb3c1116593bb97b728928e9f4fc2558b0d48c08d76fc1b56cd216c62ec3bf970e6200a35ec52f0516d8c4682819b7718886f81a90e72f805f3194d6cc8b850ff7b9af4753751520f864bf1ceb9a645e389457567fe24624c90e8e4948dbb56c0ba56568c3d5fc6d9baf616ebbd8bc6d458f226300db96113edb9b94002eb149ceb7db8e2c625539753b63e4155f102d43c9d1c6d02dafd4253b255d9f0f191795536a2df9a4b013197b2f0384b8002c97f6fdd84a62e3fc208fb3fc81f74d64141aa9deb8078d890cf13b43866e1cd9d678ff3dfc15e2e7954bdff74571de9daf701306e4154e19a420012a96dbc6b363d25e6e41b11d25081201e446094d42ebf62e4d0a58823383aa293f329b8e57e485b3cfd7bf0342fd64b23a201809f23e1f5407974bca653fd20be7e627e425bd2577f91aaa25bff9a6796f5048950a3a4e4ccd1769773d1d4a31cb2dfb68ab72141360771d04fa6169b00a42f58f1955254104173c2919c075333f86a07c6797e42eac99622190e9210e8194b9589e0316f952f32e5089ade578eb6c919fd893182223ee13fc01d55edd6bb1fe8216e8a5de2047ca7e1b5a1d8b255c59537cf822866ce1cd04cbda95b52f275f7c026a4467f2919b023d397fd293e26237c32b95c3ee10d7cc6d5d482e526136d6ef0c951f504d1a9d6de09ef7ad8b46ad59d1d4833df7eec354d1f8916bfc2f033b43fa6cbff6c3a03bd3fd52d8a371349f5f711cc3135c8a10dd2996e254a28185a4f6e8981b10ab15881d8cabe76c5e1238fe2923dfab713fc35d974c173bf24cb41d1b8f169c2e8971720dadb3a29a40f2de10c6c976191049072b0f9055a60ed5df6dfb95c09b06248d4e5494be79aa11936c226d26f260c2a8baa36c7a4d2a9eb068640528812a15e1d716f71a6cbc29a0a3cd47589d7fd4c4debe1824284e8322835ee13e7153c9f2208b7740e4058fa8503dc4656aebd3ee0fa60fedf7e907b85752b66cdc21b540c31881bc8004c7fce9ea80e7fb235486b5f1d0321c68a0e44cd5f15e21f27c402754a2f7c1387720e959e94abeb4db216a37e59b066bf338fc6f2e6cf3746392d5a6679d182f01b6c7128a28362eec30b4dedc7356616328be64da23c0f61f9b46a42be70546ec111b8adfeaf1efec46fe5d11758cc765262b8d611d0b1614dc02d47c90191ebad24f59571d62766fd6df3920fc0a2c9dc3cc1f6fa34242c7d792add612b414e28cead47c3a0860fb62a00987816f0f618408b15261070acd106e96d4d966d7f78376a2dbcb742e037d1934a1901bce54e979d9c5e0b9ec79190f25d56eb1d65e586b3ae24c063c0c7883512bc2a107ec6687ff168cdb467043ece1744d257eab9e41132c266f299b0776d572738f3a9c7dcba7e0cffbd7373390401dff225f53a780b215f4ef65238c8c38223d46e4e9b1bd5aa1449bed326a81c85eef48e6fb26b29e4c32377d3a8a0bff978a68755884c58dc4652c16f65b49e0a3b7f9b3e67e4f3e1b68b7e04482aea25ee5548a6d798cb7e6cc3cd2f788513f88c3c524ba20cf281002e11cd5f8bcb6e4d8ab929d026b7f74c43ebfba64203b6aad3bd7eaa0aad2c68b63b1637eeeb3d5cece1c7ba1fa4afaf7b22bb3914f4ae5debe4bfc907ac4bb8c801c71679d0f8e424c866dfaa180e5c127a57772270476c2ccdf7452b7844b60f6dc845540409add976ef85f09d7c1db1fbb7a995fee9a140820c679d98812b3086010ca80fd67fb4f44bf518ba61b800aec3169427fcc2cc0be877869468ded6545ab29d77c9225d4960774bf825f6a69a64084871e8987b6e71bd0df56399a7e0bc815ac6485d7b7d1852b1dd309f4cc780c5d86616ebf2b591805b42d9224b310dbf0883bdfab6995ad071f3ea7b993e00966d8eec83dce82f0a970332426b4f37b5ce378fbfb8a30d37b4c2bc513606cdc32f70d327df0d33a1eac1d5c1af4320abd569267526a61bd0a1d10cebca27cd94459434a1a32e848e7c022c67be14b2e844a1eae4aba76be361a8430ffeaaea51d88275b7d1520c1974519efc41cad3b6446843d3edb0e5b81bcfca867a960b410fc300321182b289fb339347df6e6d5bfd44990b94c87196f8cf0718e5f318ad13de3bd90ac55e28383273114107672096c0545549f8f7c7202e648ce8caf8dd0b5b90766523f83c54d5a7220e9da94d3861dc77b4475f91ba7748ac2a22951920c366cfc9a4690e76a49542ef391b2a0ab199397cbd913dee2f1b3e5403d6a97a9c24aedf5197e6c728a6398ce1a5ff3537f46549627612e6e0440b0d75a3d4407134d94f316b0c6fe842ce8ca02f13e07b53c1c53ff45ac7112ddbfe81e4e49bc7fd18c04ccdc7956dd2cb987ba1af34061f17965bf45bbc4b3d76ce2e811fb228e735dbaba660613dbcf6577ce31b595fc12d64be5f5fea15dca3268563ceae1b5af64755dc1ffce26a1772aadd9f760e9fcbd8711bac7cf7722cae8c7038b629be25ac52594c8ee442f8900d7883b39c23bb997b128a987967d70d4d91a7f3d87b88b4ab032f3ec9ae605aae9a0e3990b4c450e42a436724246decd0af618cb3f9e80567c410351b151677942c893072b9ada5b54d1e107f0fb5f21bb0afaa3fa10c478e83369b61dfe390c7173cc0cb9c3f3ff56262bb139179c8387ed97506d9be232928ea9724738f4d50416f0f21c442c7ac51589266137f152fff27148f0ac4403f9a7451eb3be25536946a48ff997ee4e20248ba02fb9082061de1b0629de748d8c31cf23e9ea45181f77491ea83ba3fa05c795e6fb274b7c7be4e7008f8efe0fc8a2aa2a5049ce83a51d7126ceac080ed4935a433a1f35b7accb77d0885a4b2b4d7e588a9d593c3688cd9f50c36564ed2b1c2b4d82fd516252e64feeaabce66079296cdd17a518a138fc35f53cf4551567a69b7e6c3e192d2cc9d1c37d134a4fea48598a6599ee44342dd7ac71e5432818d72d5e3c7e074888eaaff76619f13a0f3fa12afdb4279018d6e6ef2894d995bd2253559a29b67505cd2ce2fc2d75bf5683d63746804f25458c0635c79f62ded31ca00cfbcd711311e5fb2ea5ca42505eb95b27d69adf7458b19808b5719973e93a85dce7d5f1a33bc97d23097ce19d9654c275344052fdb0ec2ed09897c7f56de0875dd4dfa2b5e1ec35788db1cde78bca8ec7d63d4431ec903d35e79e88b3efc327084946fecbb2d2a687b90571deadaf226832ce2da16a5235a108d2466fdd36e754bba870451cf162e901e477d38a57100ee09f79dcc886ca9a92ffab69b4d04acbb270a1c28edcdd04fedb4a769076fa04461da34475c24e9b1c6302421513b3e5b43c0db497098774065664285e7322e109c54468f079441aeba8f5796c65d53b37770eabb3ebf4becef24f7952c03d3d7212d7bad7304da2a72dff80296b0124c29e4f086418a73daf1b86e9fc02ab6235a2d7da886bbdbac58e8ae6ea87da4adc3e296b35f411892d5e84eae8aef017bae1bf1882a036dbdd37122e1e40b315eab338449822b619d017d3fc7729ad96885c182564622b8e44b44fb6332a4e0e84b9f615091917782df3febf46072687148e5d619c161e3a92827e2fc7a8ed9d209edd5d174bb81c9d5f5f73c3cc0d61e5d5095d985081794d3e37fb5a41245a44fe78ad213f1a8fb4d690ea8eecc4bf72dca689e795f7b2eb240799598784ce78453255e567b149fae61d63e5fdeee85201bf77185ae38fe2e0579a43f0815220ffa517a25a0ec3d60a6f708753ee74f9f0ae959913c758cb0fc26eb7f0ac9dd5aa4b43068aa595dcb001a0e19345fdd1060e65f85525b619eeb297141c58fa1cc18f68707df82885736e75734077eb8dce5988a49381204619b293f6e8290f4cd20c088ea8890456c1205ebac006b676c61a4e2c636c1fd62d4cf5bec89f361c582ba39f9ecaa1d725a1dd26b674f72279cb56fe29490d5085dc3cfa522e16d1c078ba41d55f997d1d7d61457845162745d713a8699a813ba00aca37f9582a23b77dbd13c09a43bf151d9ba5a9e9abebd6e804a9b8e313fe28332dd6429fd87889a54c63f51d4913a90cdcc5bfe510e69958ba707bb52e2e7affe873b277ba46c389c8d0f75b122155b5b5041ed9fdbe09b3a5ab4683483314cb8a8ecd7238250185b2e92bd6275e87b2b50f6b1acab8948346a88ddffaa282208495e811ea89a033aafb27110121cb9e4d361929f09ce6322df6d61dadf34f894717b6d939eb4c1e01a56d8e2821adb2ee26adaa07a16b6abc24a3eedabbd9807282ae3abed041af776663b014c49a9b384f9cfd988ca07781a06ba61952bc80776532a8e1cf4d624ccc9e294f810ed18c1f6bb6fba501f30ef8b1e5e26e6513c64de8b63b3eabc11236915c40fd96d08a149e48d9811c67c49c0b20be456fb50f9b44e523b509566832d1cb9180bf2292ddb9359ab75c304318dbd9159e38de83ebbbb853b8d29caf5fd3e9a9b0d44236c920ffb7ae5e06faeda89180df6d1af39dc19213b0940e67fc1c58f20492b9f6757a29c8ec7e366c98f5cc787f58d4af400b251c32ca2622c61f7c230266f45241392646d84959089957fc64f4a8a64770dcc3b5c5e16e501c61d58520cd7bcadac287aa185be96f6d23a3eed5b90a3c8edb0078d07661708d67e7c0f632dad0a0cac07b231261f182fd457e99267aff186a6dedf8f58a2487a6454ee9437bf4119663226ef94d4f8949738cc56d631fac2f5e8d95eb52bc99b15087705be9b5cbd9d248729d25c9deac90a1e0ea6d1e987e74c03dc445d941fdac1321f89e862de9b045c46a6610f17b3f465249f36c8bfc233e572cfddb0f0fba7a84a624f5c66a6fb2eaed98857059d1f2bff89099e51cfc408861c5625f4c0e160ef0f78513c073184c8337b7c9aceb2f7072cf174255628f382f56efc157198e274590a494806cde6fe7be286c090d652a4509751239f862ecc20cd3c3955f3b74308ae4d72eaf8dcb77b647e5e29b3c33ebca23d33f1 -MD = b09d1a963ba9bf92907707b7d48b96e0d37dbd79 - diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/third_party/NIST/SHAVS/SHA1Monte.rsp temporalio-1.3.0/vendor/ring-0.16.20/third_party/NIST/SHAVS/SHA1Monte.rsp --- temporalio-1.3.0/vendor/ring-0.16.20/third_party/NIST/SHAVS/SHA1Monte.rsp 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/third_party/NIST/SHAVS/SHA1Monte.rsp 1970-01-01 00:00:00.000000000 +0000 @@ -1,309 +0,0 @@ -# CAVS 11.1 -# "SHA-1 Monte" information for "sha_values" -# SHA tests are configured for BYTE oriented implementations -# Generated on Wed May 11 17:26:02 2011 - -[L = 20] - -Seed = dd4df644eaf3d85bace2b21accaa22b28821f5cd - -COUNT = 0 -MD = 11f5c38b4479d4ad55cb69fadf62de0b036d5163 - -COUNT = 1 -MD = 5c26de848c21586bec36995809cb02d3677423d9 - -COUNT = 2 -MD = 453b5fcf263d01c891d7897d4013990f7c1fb0ab - -COUNT = 3 -MD = 36d0273ae363f992bbc313aa4ff602e95c207be3 - -COUNT = 4 -MD = d1c65e9ac55727fbf30eaf5f00cc22b9bab81a2c - -COUNT = 5 -MD = 2c477cd77e5749da7fc4e5ca7eed77166e8ceae6 - -COUNT = 6 -MD = 60b11211137f46863501a32a435976eabd4532f3 - -COUNT = 7 -MD = 0894f4f012a1e5344044e0ecfa6f078382064602 - -COUNT = 8 -MD = 06b6222855cae9bed77e9e3050d164a98286ea5f - -COUNT = 9 -MD = e2872694d3d23a68a24419c35bd9ac9006248a8f - -COUNT = 10 -MD = ea43595eb1cff3a7e045c5868d0775b4409b14a3 - -COUNT = 11 -MD = 05a9e94fdc792a61aa60bcd37592acee1f983280 - -COUNT = 12 -MD = 7d11aa9413cd89a387a5c0f9aa5ce541be2aa6e8 - -COUNT = 13 -MD = 37297d053aaa4a845cc9ce0c0165644ab8d0e00b - -COUNT = 14 -MD = d9dcde396d69748c1fe357f8b662a27ce89082c8 - -COUNT = 15 -MD = 737a484499b6858b14e656c328979e8aa56b0a43 - -COUNT = 16 -MD = 4e9c8b3bce910432ac2ad17d51e6b9ec4f92c1ad - -COUNT = 17 -MD = 62325b9a7cebcc6da3bfe781d84eb53a6eb7b019 - -COUNT = 18 -MD = 4710670e071609d470f7d628d8ea978dfb9234ac - -COUNT = 19 -MD = 23baee80eee052f3263ac26dd12ea6504a5bd234 - -COUNT = 20 -MD = 9451efb9c9586a403747acfa3ec74d359bb9d7ff - -COUNT = 21 -MD = 37e9d7c81b79f090c8e05848050936c64a1bd662 - -COUNT = 22 -MD = a6489ff37141f7a86dd978f685fdd4789d1993dc - -COUNT = 23 -MD = 39650d32501dfcee212d0de10af9db47e4e5af65 - -COUNT = 24 -MD = cd4ea3474e046b281da5a4bf69fd873ef8d568d6 - -COUNT = 25 -MD = 0d7b518c07c6da877eee35301a99c7563f1840df - -COUNT = 26 -MD = 68a70ae466532f7f61af138889c0d3f9670f3590 - -COUNT = 27 -MD = c0222aae5fd2b9eff143ac93c4493abe5c8806af - -COUNT = 28 -MD = d2efc5aa0b29db15f3e5de82aaa0a8ce888ffb2f - -COUNT = 29 -MD = eec4f55d02c627dcee36b5b5606603bdc9a94a26 - -COUNT = 30 -MD = 0e706fb1a1fa26aab74efcef57ab6a49c07ca7bd - -COUNT = 31 -MD = 2ea392ca8043686424f7e9500edfb9e9297943f7 - -COUNT = 32 -MD = 74737ef257b32a4cb9428c866b65bee62ccbe653 - -COUNT = 33 -MD = df3e86e49a0429fa81f553b04b9fc003510e9a51 - -COUNT = 34 -MD = 79c3049944fbf8b80dadadc7f5174e5cfdf996de - -COUNT = 35 -MD = f25e2eca4cfb6da8e8b7b62f581672fab80754fa - -COUNT = 36 -MD = 76509239d9fd6c6f050c0d9b3777b5645e4d4c70 - -COUNT = 37 -MD = cf4bb3e1f330c862e239d9b010bd842f302bd227 - -COUNT = 38 -MD = 4eeac7ab2ac9e4c81ed1a93a300b2af75beddb08 - -COUNT = 39 -MD = 46443ba72a64fff4b5252fbac9ef93c2949f8585 - -COUNT = 40 -MD = 5e9c42482343a54aadb11ab00c2e00cbe25ec91a - -COUNT = 41 -MD = 93acee1977128f2a4218678b32e2844f23eb526b - -COUNT = 42 -MD = 226065d299b2d6c582d386897b93f2adf14de00b - -COUNT = 43 -MD = 672fed0d90c21d4ec0111a7284bcf1bbd72af9bd - -COUNT = 44 -MD = 90d642f12f28cb3dad7daad84cf0f94ded1137ae - -COUNT = 45 -MD = 4a2815b58ffc858e5e7e9e6106765458d2af4ec3 - -COUNT = 46 -MD = 29fa3679032421b78b7a08c54766c1592f6739c1 - -COUNT = 47 -MD = 19f4e30393eb66c6e200744fa8999d224e6df173 - -COUNT = 48 -MD = 30650026be77212088ab50438e04b4b8e3761977 - -COUNT = 49 -MD = 993d0e135bcd598fa673c6f19251bcbde18b7b34 - -COUNT = 50 -MD = c9eaf20b473219a70efe85940620426c6ff6f4a4 - -COUNT = 51 -MD = 6325d0b83c308bd42854ce69446e85ba36348d7d - -COUNT = 52 -MD = 2fb354f8a68030efb747f78812060a9c05e92164 - -COUNT = 53 -MD = a7e33bd16f770c17e8818ad5a5fc4fee673eae56 - -COUNT = 54 -MD = ff23e7105bc9f4dad0fb9c6519d1eae16439a5d6 - -COUNT = 55 -MD = a31aca821e163213cd2ae84cf56c1134daa4a621 - -COUNT = 56 -MD = 94ab9cfd4cf9bf2e4409dbcdc9ef2c8b611cc69d - -COUNT = 57 -MD = c0194064ce48dde771b7871efa86a4a6e87eec76 - -COUNT = 58 -MD = f1a9065e3e7f98753c6f833f5ffe74133f6b887f - -COUNT = 59 -MD = b8b3cd6ca1d5b5610e43212f8df75211aaddcf96 - -COUNT = 60 -MD = 33c3a8d739cc2f83be597aa11c43e2ad6f0d2436 - -COUNT = 61 -MD = 4f5c67e5110f3663b7aa88759dbba6fa82f2d705 - -COUNT = 62 -MD = b1ebc87c7b2b8fe73e7a882d3f4f0492946e0d7c - -COUNT = 63 -MD = 01566616fe4a8c7cf22f21031ac6ea7fb7ce15db - -COUNT = 64 -MD = 5650f3517a393792781d23b4c9d360bf8bd31d65 - -COUNT = 65 -MD = a4fdbd24cb4a328b898b804b103caa98baedd3fa - -COUNT = 66 -MD = 0cf01eecec4b85aa39f40aa9b4dce208d68eb17b - -COUNT = 67 -MD = ae9ac147bab7c10609abe6e931a5ab087a41dc5a - -COUNT = 68 -MD = c0328145ce63fb0aceeb414e791d2be92009b1ec - -COUNT = 69 -MD = 60343e5fb7eee00d31ea507b820ddbb7ef405dc7 - -COUNT = 70 -MD = e0b97cd9149ff9955b6a35b3a79ecb3bdbd2a5a5 - -COUNT = 71 -MD = 4e4fdcd382ae0f3f4fbda5fd934eee0d6ad37df5 - -COUNT = 72 -MD = 9d97dd237d193482cf3ab862a38843762e69077f - -COUNT = 73 -MD = 2bc927d17ff2f8a844f6f36a944a64d73d431192 - -COUNT = 74 -MD = b91200306b769aab18e5e411b5bd5e7bce1cc80e - -COUNT = 75 -MD = c47493a666085e1b7a75618761a80c402f46546d - -COUNT = 76 -MD = 31355869b80ff84fac239db694ada07d3be26b15 - -COUNT = 77 -MD = 1a2022f6330bf96f025cb7d8f0201a7d70b3b58e - -COUNT = 78 -MD = 0f60d7c5ad49efce939c3a27da9973f7f1747848 - -COUNT = 79 -MD = ceada087801616fc6c08cfa469658f3dc5239ca7 - -COUNT = 80 -MD = 4ad0cf9181122b06df714397bd5366aa90bfc9fa - -COUNT = 81 -MD = ac6404e6b9d5c0fa17fa77fd39850f22b76ecd83 - -COUNT = 82 -MD = f0658218adffb9ee9328577854b6387393957a3a - -COUNT = 83 -MD = 6fe9992747897389957b9a91467a4ec983829ab6 - -COUNT = 84 -MD = 74320b3ddde6dbfbdad3ad29a7695f5a275b2105 - -COUNT = 85 -MD = 2009ea5d6452f51d12477740e374e0e313134779 - -COUNT = 86 -MD = 7dbf33d7125709f101fea4ec03436ab95a900c28 - -COUNT = 87 -MD = 0c05b78e324cb265bd6adc7452249eaa85bccb3f - -COUNT = 88 -MD = 10c1b9b2de8a9050fb6f4b10a99f7e1e47159f25 - -COUNT = 89 -MD = 20072c1f691142d9b83a090dd01f446b4e325a1c - -COUNT = 90 -MD = ffcb6a1525f20803cfc79deb40addfd3e7b2f05c - -COUNT = 91 -MD = bdcbb4ed636e244bb0fe6af4bc53998936df4ebc - -COUNT = 92 -MD = f58ccbc65a2ffa5b35274dd0ceb4ea70eb73c26a - -COUNT = 93 -MD = fbe95ac75e4b9cccd1a5debf757fa1a502d07944 - -COUNT = 94 -MD = a8babac55950dba4993601d35adff874a2b9bb2a - -COUNT = 95 -MD = 594db79de71c7651e9eef2f08bb7be3d26b6ee99 - -COUNT = 96 -MD = 63377d45d0e2d0c987bebe8086c76a5e8b63a14b - -COUNT = 97 -MD = cd1e7a192130866aa87fd1c8b43e9b7a0eab7615 - -COUNT = 98 -MD = b3c69ad5dbdd34b7b45b2a89dad72f4cf1d8fd73 - -COUNT = 99 -MD = 01b7be5b70ef64843a03fdbb3b247a6278d2cbe1 - diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/third_party/NIST/SHAVS/SHA1ShortMsg.rsp temporalio-1.3.0/vendor/ring-0.16.20/third_party/NIST/SHAVS/SHA1ShortMsg.rsp --- temporalio-1.3.0/vendor/ring-0.16.20/third_party/NIST/SHAVS/SHA1ShortMsg.rsp 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/third_party/NIST/SHAVS/SHA1ShortMsg.rsp 1970-01-01 00:00:00.000000000 +0000 @@ -1,267 +0,0 @@ -# CAVS 11.0 -# "SHA-1 ShortMsg" information -# SHA-1 tests are configured for BYTE oriented implementations -# Generated on Tue Mar 15 08:23:35 2011 - -[L = 20] - -Len = 0 -Msg = 00 -MD = da39a3ee5e6b4b0d3255bfef95601890afd80709 - -Len = 8 -Msg = 36 -MD = c1dfd96eea8cc2b62785275bca38ac261256e278 - -Len = 16 -Msg = 195a -MD = 0a1c2d555bbe431ad6288af5a54f93e0449c9232 - -Len = 24 -Msg = df4bd2 -MD = bf36ed5d74727dfd5d7854ec6b1d49468d8ee8aa - -Len = 32 -Msg = 549e959e -MD = b78bae6d14338ffccfd5d5b5674a275f6ef9c717 - -Len = 40 -Msg = f7fb1be205 -MD = 60b7d5bb560a1acf6fa45721bd0abb419a841a89 - -Len = 48 -Msg = c0e5abeaea63 -MD = a6d338459780c08363090fd8fc7d28dc80e8e01f - -Len = 56 -Msg = 63bfc1ed7f78ab -MD = 860328d80509500c1783169ebf0ba0c4b94da5e5 - -Len = 64 -Msg = 7e3d7b3eada98866 -MD = 24a2c34b976305277ce58c2f42d5092031572520 - -Len = 72 -Msg = 9e61e55d9ed37b1c20 -MD = 411ccee1f6e3677df12698411eb09d3ff580af97 - -Len = 80 -Msg = 9777cf90dd7c7e863506 -MD = 05c915b5ed4e4c4afffc202961f3174371e90b5c - -Len = 88 -Msg = 4eb08c9e683c94bea00dfa -MD = af320b42d7785ca6c8dd220463be23a2d2cb5afc - -Len = 96 -Msg = 0938f2e2ebb64f8af8bbfc91 -MD = 9f4e66b6ceea40dcf4b9166c28f1c88474141da9 - -Len = 104 -Msg = 74c9996d14e87d3e6cbea7029d -MD = e6c4363c0852951991057f40de27ec0890466f01 - -Len = 112 -Msg = 51dca5c0f8e5d49596f32d3eb874 -MD = 046a7b396c01379a684a894558779b07d8c7da20 - -Len = 120 -Msg = 3a36ea49684820a2adc7fc4175ba78 -MD = d58a262ee7b6577c07228e71ae9b3e04c8abcda9 - -Len = 128 -Msg = 3552694cdf663fd94b224747ac406aaf -MD = a150de927454202d94e656de4c7c0ca691de955d - -Len = 136 -Msg = f216a1cbde2446b1edf41e93481d33e2ed -MD = 35a4b39fef560e7ea61246676e1b7e13d587be30 - -Len = 144 -Msg = a3cf714bf112647e727e8cfd46499acd35a6 -MD = 7ce69b1acdce52ea7dbd382531fa1a83df13cae7 - -Len = 152 -Msg = 148de640f3c11591a6f8c5c48632c5fb79d3b7 -MD = b47be2c64124fa9a124a887af9551a74354ca411 - -Len = 160 -Msg = 63a3cc83fd1ec1b6680e9974a0514e1a9ecebb6a -MD = 8bb8c0d815a9c68a1d2910f39d942603d807fbcc - -Len = 168 -Msg = 875a90909a8afc92fb7070047e9d081ec92f3d08b8 -MD = b486f87fb833ebf0328393128646a6f6e660fcb1 - -Len = 176 -Msg = 444b25f9c9259dc217772cc4478c44b6feff62353673 -MD = 76159368f99dece30aadcfb9b7b41dab33688858 - -Len = 184 -Msg = 487351c8a5f440e4d03386483d5fe7bb669d41adcbfdb7 -MD = dbc1cb575ce6aeb9dc4ebf0f843ba8aeb1451e89 - -Len = 192 -Msg = 46b061ef132b87f6d3b0ee2462f67d910977da20aed13705 -MD = d7a98289679005eb930ab75efd8f650f991ee952 - -Len = 200 -Msg = 3842b6137bb9d27f3ca5bafe5bbb62858344fe4ba5c41589a5 -MD = fda26fa9b4874ab701ed0bb64d134f89b9c4cc50 - -Len = 208 -Msg = 44d91d3d465a4111462ba0c7ec223da6735f4f5200453cf132c3 -MD = c2ff7ccde143c8f0601f6974b1903eb8d5741b6e - -Len = 216 -Msg = cce73f2eabcb52f785d5a6df63c0a105f34a91ca237fe534ee399d -MD = 643c9dc20a929608f6caa9709d843ca6fa7a76f4 - -Len = 224 -Msg = 664e6e7946839203037a65a12174b244de8cbc6ec3f578967a84f9ce -MD = 509ef787343d5b5a269229b961b96241864a3d74 - -Len = 232 -Msg = 9597f714b2e45e3399a7f02aec44921bd78be0fefee0c5e9b499488f6e -MD = b61ce538f1a1e6c90432b233d7af5b6524ebfbe3 - -Len = 240 -Msg = 75c5ad1f3cbd22e8a95fc3b089526788fb4ebceed3e7d4443da6e081a35e -MD = 5b7b94076b2fc20d6adb82479e6b28d07c902b75 - -Len = 248 -Msg = dd245bffe6a638806667768360a95d0574e1a0bd0d18329fdb915ca484ac0d -MD = 6066db99fc358952cf7fb0ec4d89cb0158ed91d7 - -Len = 256 -Msg = 0321794b739418c24e7c2e565274791c4be749752ad234ed56cb0a6347430c6b -MD = b89962c94d60f6a332fd60f6f07d4f032a586b76 - -Len = 264 -Msg = 4c3dcf95c2f0b5258c651fcd1d51bd10425d6203067d0748d37d1340d9ddda7db3 -MD = 17bda899c13d35413d2546212bcd8a93ceb0657b - -Len = 272 -Msg = b8d12582d25b45290a6e1bb95da429befcfdbf5b4dd41cdf3311d6988fa17cec0723 -MD = badcdd53fdc144b8bf2cc1e64d10f676eebe66ed - -Len = 280 -Msg = 6fda97527a662552be15efaeba32a3aea4ed449abb5c1ed8d9bfff544708a425d69b72 -MD = 01b4646180f1f6d2e06bbe22c20e50030322673a - -Len = 288 -Msg = 09fa2792acbb2417e8ed269041cc03c77006466e6e7ae002cf3f1af551e8ce0bb506d705 -MD = 10016dc3a2719f9034ffcc689426d28292c42fc9 - -Len = 296 -Msg = 5efa2987da0baf0a54d8d728792bcfa707a15798dc66743754406914d1cfe3709b1374eaeb -MD = 9f42fa2bce6ef021d93c6b2d902273797e426535 - -Len = 304 -Msg = 2836de99c0f641cd55e89f5af76638947b8227377ef88bfba662e5682babc1ec96c6992bc9a0 -MD = cdf48bacbff6f6152515323f9b43a286e0cb8113 - -Len = 312 -Msg = 42143a2b9e1d0b354df3264d08f7b602f54aad922a3d63006d097f683dc11b90178423bff2f7fe -MD = b88fb75274b9b0fd57c0045988cfcef6c3ce6554 - -Len = 320 -Msg = eb60c28ad8aeda807d69ebc87552024ad8aca68204f1bcd29dc5a81dd228b591e2efb7c4df75ef03 -MD = c06d3a6a12d9e8db62e8cff40ca23820d61d8aa7 - -Len = 328 -Msg = 7de4ba85ec54747cdc42b1f23546b7e490e31280f066e52fac117fd3b0792e4de62d5843ee98c72015 -MD = 6e40f9e83a4be93874bc97cdebb8da6889ae2c7a - -Len = 336 -Msg = e70653637bc5e388ccd8dc44e5eace36f7398f2bac993042b9bc2f4fb3b0ee7e23a96439dc01134b8c7d -MD = 3efc940c312ef0dfd4e1143812248db89542f6a5 - -Len = 344 -Msg = dd37bc9f0b3a4788f9b54966f252174c8ce487cbe59c53c22b81bf77621a7ce7616dcb5b1e2ee63c2c309b -MD = a0cf03f7badd0c3c3c4ea3717f5a4fb7e67b2e56 - -Len = 352 -Msg = 5f485c637ae30b1e30497f0fb7ec364e13c906e2813daa34161b7ac4a4fd7a1bddd79601bbd22cef1f57cbc7 -MD = a544e06f1a07ceb175a51d6d9c0111b3e15e9859 - -Len = 360 -Msg = f6c237fb3cfe95ec8414cc16d203b4874e644cc9a543465cad2dc563488a659e8a2e7c981e2a9f22e5e868ffe1 -MD = 199d986ed991b99a071f450c6b1121a727e8c735 - -Len = 368 -Msg = da7ab3291553c659873c95913768953c6e526d3a26590898c0ade89ff56fbd110f1436af590b17fed49f8c4b2b1e -MD = 33bac6104b0ad6128d091b5d5e2999099c9f05de - -Len = 376 -Msg = 8cfa5fd56ee239ca47737591cba103e41a18acf8e8d257b0dbe8851134a81ff6b2e97104b39b76e19da256a17ce52d -MD = 76d7db6e18c1f4ae225ce8ccc93c8f9a0dfeb969 - -Len = 384 -Msg = 57e89659d878f360af6de45a9a5e372ef40c384988e82640a3d5e4b76d2ef181780b9a099ac06ef0f8a7f3f764209720 -MD = f652f3b1549f16710c7402895911e2b86a9b2aee - -Len = 392 -Msg = b91e64235dbd234eea2ae14a92a173ebe835347239cff8b02074416f55c6b60dc6ced06ae9f8d705505f0d617e4b29aef9 -MD = 63faebb807f32be708cf00fc35519991dc4e7f68 - -Len = 400 -Msg = e42a67362a581e8cf3d847502215755d7ad425ca030c4360b0f7ef513e6980265f61c9fa18dd9ce668f38dbc2a1ef8f83cd6 -MD = 0e6730bc4a0e9322ea205f4edfff1fffda26af0a - -Len = 408 -Msg = 634db92c22010e1cbf1e1623923180406c515272209a8acc42de05cc2e96a1e94c1f9f6b93234b7f4c55de8b1961a3bf352259 -MD = b61a3a6f42e8e6604b93196c43c9e84d5359e6fe - -Len = 416 -Msg = cc6ca3a8cb391cd8a5aff1faa7b3ffbdd21a5a3ce66cfaddbfe8b179e4c860be5ec66bd2c6de6a39a25622f9f2fcb3fc05af12b5 -MD = 32d979ca1b3ed0ed8c890d99ec6dd85e6c16abf4 - -Len = 424 -Msg = 7c0e6a0d35f8ac854c7245ebc73693731bbbc3e6fab644466de27bb522fcb99307126ae718fe8f00742e6e5cb7a687c88447cbc961 -MD = 6f18190bd2d02fc93bce64756575cea36d08b1c3 - -Len = 432 -Msg = c5581d40b331e24003901bd6bf244aca9e9601b9d81252bb38048642731f1146b8a4c69f88e148b2c8f8c14f15e1d6da57b2daa9991e -MD = 68f525feea1d8dbe0117e417ca46708d18d7629a - -Len = 440 -Msg = ec6b4a88713df27c0f2d02e738b69db43abda3921317259c864c1c386e9a5a3f533dc05f3beeb2bec2aac8e06db4c6cb3cddcf697e03d5 -MD = a7272e2308622ff7a339460adc61efd0ea8dabdc - -Len = 448 -Msg = 0321736beba578e90abc1a90aa56157d871618f6de0d764cc8c91e06c68ecd3b9de3824064503384db67beb7fe012232dacaef93a000fba7 -MD = aef843b86916c16f66c84d83a6005d23fd005c9e - -Len = 456 -Msg = d0a249a97b5f1486721a50d4c4ab3f5d674a0e29925d5bf2678ef6d8d521e456bd84aa755328c83fc890837726a8e7877b570dba39579aabdd -MD = be2cd6f380969be59cde2dff5e848a44e7880bd6 - -Len = 464 -Msg = c32138531118f08c7dcc292428ad20b45ab27d9517a18445f38b8f0c2795bcdfe3ffe384e65ecbf74d2c9d0da88398575326074904c1709ba072 -MD = e5eb4543deee8f6a5287845af8b593a95a9749a1 - -Len = 472 -Msg = b0f4cfb939ea785eabb7e7ca7c476cdd9b227f015d905368ba00ae96b9aaf720297491b3921267576b72c8f58d577617e844f9f0759b399c6b064c -MD = 534c850448dd486787b62bdec2d4a0b140a1b170 - -Len = 480 -Msg = bd02e51b0cf2c2b8d204a026b41a66fbfc2ac37ee9411fc449c8d1194a0792a28ee731407dfc89b6dfc2b10faa27723a184afef8fd83def858a32d3f -MD = 6fbfa6e4edce4cc85a845bf0d228dc39acefc2fa - -Len = 488 -Msg = e33146b83e4bb671392218da9a77f8d9f5974147182fb95ba662cb66011989c16d9af104735d6f79841aa4d1df276615b50108df8a29dbc9de31f4260d -MD = 018872691d9b04e8220e09187df5bc5fa6257cd9 - -Len = 496 -Msg = 411c13c75073c1e2d4b1ecf13139ba9656cd35c14201f1c7c6f0eeb58d2dbfe35bfdeccc92c3961cfabb590bc1eb77eac15732fb0275798680e0c7292e50 -MD = d98d512a35572f8bd20de62e9510cc21145c5bf4 - -Len = 504 -Msg = f2c76ef617fa2bfc8a4d6bcbb15fe88436fdc2165d3074629579079d4d5b86f5081ab177b4c3f530376c9c924cbd421a8daf8830d0940c4fb7589865830699 -MD = 9f3ea255f6af95c5454e55d7354cabb45352ea0b - -Len = 512 -Msg = 45927e32ddf801caf35e18e7b5078b7f5435278212ec6bb99df884f49b327c6486feae46ba187dc1cc9145121e1492e6b06e9007394dc33b7748f86ac3207cfe -MD = a70cfbfe7563dd0e665c7c6715a96a8d756950c0 - diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/third_party/NIST/SHAVS/SHA224LongMsg.rsp temporalio-1.3.0/vendor/ring-0.16.20/third_party/NIST/SHAVS/SHA224LongMsg.rsp --- temporalio-1.3.0/vendor/ring-0.16.20/third_party/NIST/SHAVS/SHA224LongMsg.rsp 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/third_party/NIST/SHAVS/SHA224LongMsg.rsp 1970-01-01 00:00:00.000000000 +0000 @@ -1,263 +0,0 @@ -# CAVS 11.0 -# "SHA-224 LongMsg" information -# SHA-224 tests are configured for BYTE oriented implementations -# Generated on Tue Mar 15 08:23:37 2011 - -[L = 28] - -Len = 1304 -Msg = f149e41d848f59276cfddd743bafa9a90e1ee4a263a118142b33e3702176ef0a59f8237a1cb51b42f3ded6b202d9af0997898fdd03cf60bda951c514547a0850cec25444ae2f24cb711bfbafcc3956c941d3de69f155e3f8b10f06db5f37359b772ddd43e1035a0a0d3db33242d5843033833b0dd43b870c6bf60e8deab55f317cc3273f5e3ba747f0cb65050cb7228796210d9254873643008d45f29cfd6c5b060c9a -MD = 9db6dc3a23abd7b6c3d72c38f4843c7de48a71d0ba91a86b18393e5f - -Len = 2096 -Msg = c39147fad02c6ed5876eb3257837c3f456008694fac94932aa521bae9c8e77abb65524e298595abbdc5b261e9c9f0f86359dfa584bf94b740eb54d09bba6d4ad652421adf50605a170ce4a4478204e831679f1d4b61db1c9735114e595cb47ae58670403f01bb8b0c92de64013a3c6137efc33b0421dc45b638e38eb33e617d61884968e8f80bb1071e1c3b97611c15cf78e8793f8e1c95265d480c29ce08d4c2ce59ff3dc1e56e8f053a958a75085890897b625de520bd6028bb512d89ff1391cf0e7dddfdbd160ccea5fc5b04a5ac03a7f890fff56d10dc01b9f85f00d8bc4710f35f29fa073a28f0dafa798e58a2913aec5f960d662222aed06c1eb11a216b2a952da2456 -MD = 2b05b170d4976409f23ce885a0a2c0a943226688d4f5bbaf35fabb46 - -Len = 2888 -Msg = d488bdda400932de56a9f105f0e74ee79c2ed869faaadc31665c2b5dd7691d7407b8d69cd5bbc80ee78d79c8933e8781006be9e2881177f361a2add47d59acadaecb81e70ec0aa9d9e40d64d2df1edd47ca050999f1d6208a64c47427d79ec1211ec4724b4bde071c3ea90fe86a788c657f596f40776a4567d80820fa070e58c7841afb98f5d70749eb22d4265096140db93425d87c545c72e66e4a3aee79f012af2410f6745648c76c1378094be7f2b4ea2dc3be9b24e420028f7666f85235b7028858e0420c3a3953f3622d96feb6df949edf6f3e4c6ae3deb43c1abf37880920b049e2e9496a04153b08ffdc4abf024b1fcf66e04b5f52bda4f1a29d8a65ad8c245a8ac49e46bc3252f2fc864c99a170291a221b924fe121aa3dab2ddb6cf8976d01247e9b5ec63de3a6a01f84c5519633464d6ac19b13cd6c76a0eaaafc9ef4e2e46c719120b68a65aa872273d0873fc6ea353859ff6f034443005e6992f5073e6aaf48301b01c -MD = e12c2c07628185fcc930d02b5fff6408e8eb1aad2bb0032830e04ff2 - -Len = 3680 -Msg = a67e008f13a29021d1493c7ddb0e7f4126a786f9e01991eff52c9b45d81d3d408094d0e7b1d5d2cd7c3a8a2b09e1ef3194a2c79eb6440c8fe6f093943fe5f009846e94a46111384af30a7f278bf8d6fdafd59fbc622b9054a68555c73e247d82b8f493edabbf8b413e9f619ae9b9fc4d8028587b6d38e4e63cd529045e43ad52260f17eb1845935963e378abac8e29c70d8439025ed2d2eeb3c7577325a84822d6a566c52f0c183b6cbd0e835bde241660cf897abd6020141042263e1dbc1699ce9fc9a4787ce28e601469497e10b6e081f3910a134c97ff5d30e08acee7de6018e688b07cfdb8fb48d2d2269e8ea7ce76d699dbe6fdff58a278cb82bf926a1ebc61eb10c2f8642a2bde914242bfbf874962e815c1db20c6e5022f4b7823807cc0f73aedd3d3acc21120eec4f20bc5b4027dc8df294ec1f230b656108104e9222e92bc6e35f8596c038031d436da83fca7117f61a8beac838a7c87f7639b6db70d19babc72cd33cf07e6a19c9794bf08420556c4c593a722fc3c0928a552d3e466737cfe12bc0194283a87419ca1427fda41953009357b778cde25cccf90e550408a4a5d9b2c8d626b642beece6ad40a78ad84ccfa0df029444a230b69bc69a3a3456c0197859de2da4cd5c9 -MD = f6430298cd0e80d919f22cf1094988241f84b8753838afead0156940 - -Len = 4472 -Msg = 012d3f35fe162ac6999ad84d9057fffb5cac15bc4e780917dd2530563fe682e8363c06032dbf8b8e831b993d2759a7fe65608e94ffbb3e81809cb02acd211c36fdd76b376a7def8c080a5286f6f1ccc953a399f55355ab8692049cf9a8b7e631fd055618dfd6be89d16eeb6e26a7d625cf7d1e2972d0b6eebc66db0cf7304aa0dfceafefb154604d864f4b3edf032eda81f7067683b4c980a5c957abe312ae4c4a3a5e040b7f3ea0ceb55c3d488e3ab010183725ae874b05f535f71e94e77cfee7524c9f13debe4a51a905b58acf636f25e99a7d1dd3a44656b3a3ac31361b7c5e1d5f08f1f94912b8322eeccc4e11de677017c8f51f3b086e49439ee288f38e56a38086ce5848c1ab59bf2b3794adc67fb7974c61f47a16e502c03cd1646cfe77ed9863d284211fd125a1baf3289def14c6005387d9c83764e300ce2352ee936a028de524043ef4d39ebae127924b21cfa33c238f568d3293f6ec9c03dae114d7eb4955ed60050858ccf3e8fc5b1d2458583104a2f332d019426cee9785ad4a65aeb2fb5421e02309b83516990a7dbf56edc940e8391dd99fcf690b07dabafdbd55b21e82ce360c8e6966b52627d2bc7168ea1e88afb715cca6c93c7c6271f487e730079eef6e8c8ee76f0bcd3b84e152d37ee5aade684b49ce76c91ea338f96a6d13ffd10cf26bb23b3961b4cdfbf7a1356cde784c9945bd4f56fa142778d20eee454c43ae2971a16cabfe03659ec505979c511783b0c9d132531687769a481c72ad361b5c7b650382ac2ce38bd7 -MD = 79e084af148e8073c5e86aab498eb1b7472e30d9093930bb6b819224 - -Len = 5264 -Msg = b418141ac57d6002e5d473c10797f137184f4be031fc935a12b78f21cc960c9ebdd07460c121a3a9a770f72ce2b0a6158104554a6226e6f0a209913257bd363d8294f18f3f83f0723fca81c378d76ff81b688f62c7f196aefc3d2db2d2574867ebabb331a669ed67952a3a0f32d6f4e9cdc522b0c9244c9c089b8d2ba42ce921e05fe1cd5e9c458f92d84a977674dcef7f6135bcd089afc1af6ad6243504c27549f6a4eccfe49ef21c1bd8e3ad78d0131986f10f45e66825d7f43326eda77a6a0eb923156108a1991c3d0c7c40ab775c847a7e308e041ed0697fcab834ddba0817f087d07cd2f58b7b840fe995d57ad2a68503a715ab7acb4e54c362726d2a584ce3f7a5880842d01f3909b216be807d68f1a8fd41a2231d6cbb47ac0f20716196d99c1ded733271f2a321602a2d3266b20497b979b3c2ceadfb7e1f73be382cdb1c9dbf13db6b75db0c807a38eb38946d08f56327a4ffe7f85e8f42060f26bf05f22314620895e4c1ba4e88aac1390f7f43ed83b23e816e342aa29d31dae424faa456a343c159c78ef6b213e774dde0d2fea4a28249f16e4ba8e1b95ae91963a4795df41ccf5f252908d4a257cfcd0e4d804547ff8df6ec2420721deb026e82e9bb618f56fb4e067a38ddbd6299b1a1d713f6fb91d239f2a7da7d514aee8b8bb3b089fd5a0bce7269cef5ec709930a25afddf45a0df6287bc1d2bdee1751785e9a2fec58fc78972de1143b8e998f318bd872aad947d18b44b33a34b165ebb7973d7e76f5cf9240dc14af0a8355ea20be8f9fcbbd57403803c620e2053731e6e39986d832b674a4cfac22345bcb3e483c29b80f8cb8cccf377f394e6ff7ae96c222cb88a63daa13571be0515e75f618935b4dbebde8c1b15e52e5c24813cc37c18ddef0c6b1ad1d30f89bea21c29c224298e -MD = 662e1e83c3a4a506a649bfa6f6c6eedaf5b3b6fa05825d45c13ef2ee - -Len = 6056 -Msg = 51bcc9e9244e2fa1752c61e65aa5c592138447ef9287fdcb3b120bcfe825c50c308c14d7e9551bd7eb871a5c171192f29801aa3769f6d1e917d8a543c9c6138a7d50c0e394e7a867919106791ee27357502751f02be46af66981d53377401a20c17295b42feb207aefb3ece676feb0e9c15e06c3e1381119b6756447fb791ff782595bf3c148c9378e53954b274f91cf750f8f5792da0e7a881b1a265c5b6d364b6dda4753e8ecc7f5dbca4e3abb5d32f4a0b55646b1a94266ddbe79a2cd4b06a116da59ecb2d051acb1519ab62c5e39c47b406505a72a99d9221ae7d5b6008f0ebc22d0948ebffe3c3ff2d5a389da0d6f06f82ed8a3d8a66853f419fe00d5f819c77b555364fff62ceb77a809ba1ad57daba559c68efd929bd615b62592126a4b9fad90321cd960041fa6baf1a666ba74d10e8ed84edf84fa1445675054ff0c2aac8028389f95644d4249b4623706e4dedffc7415ccc6a50e754bd4892ee3074057bcc66ed37b2c8ebc263d6554417a423f37b385f0fc1d5e62f1a4d708088215062811daa1d3dd4ff406fe01e560a5295887f430a3c8137241fd8043cab4a62f228db286f1e4a21954b09e3ed3ab8c1a92b4df1fcb71afd37b380fd35c309b1814b3507aacf7a17243eec624046a589d55851b5951401b08796afa91a6c48858436294bdb85402e529861ebc61e5303a09c351e61e7d7c99a25be88591b7957516622556ff43eef76f414d0dd2643d7a163628cf1970fd0f5dd282b60353ecf9f77aad50680c8d327be7fc1f402ea6e4e5a6491b2960c3f11499702ce5deb26c4d74d1b0daf6061db640d2fb918c9401dcdb5bd23897f9c72e7659ef20a112547f163b803f4a8240881378a8afc62f57649c07fd2d5bc51a1332e5089ae4323bf72993c87e5128245a2a952e80249e70e6b3f5a2eff54f702a95bd7e3def3aa81c74808e7f502150924bd296eeed0ad4c8e6cccc68adc054dd668959f009532456c1abdc2a92944c9a3fd7e7e06b9a0974fe34807fca404b936ff0a19a7ba5360dd6bcb9675eaaa1d8ce4b293de4779950c3d7c8 -MD = d2323cac073625fd6dd5d937cfa2d8bd01f75cb5afb15b7757dd8ac4 - -Len = 6848 -Msg = 52f5a110dddc9f44f8a534eef9df0b22785706470cd4246c5604a8e041b778fc874bc3447867e6aff7ed9142c52925e3024f616df0243e00fbfb179bf6e30deca81faa6687d6c595c30ca5ae86d1696b7bb8a6158d8b53e2f13de2826620b0f5bb589f9f9290019e65ecb95bc63e9c5feb7c1e6969722abd40b451be18d727bfcae0ea1722fd6573e47314710cd8896a5a820e8e0e3f8c37f146ac77946e3bf3dc9ed3f5be85b8bc488b0017e107f732d1b2c1af045c41f80add3ad4634fb439fa7aa262ef90c120991bc375cc33ad5f57f47ef2d12f11a9966044fe0ce05a382b5c9e853c864948e00aa6b455c4749af5308c7fff22c4f29ab7121d178bf599772c10872dcf18dc2542f1fc0422148bb24e347f169b217a20caec580db74c03e6d2408f4ad3f6836eaaec7462b555d99636be1a9c04f1ea2f811ad775cb281f813776c61cfbabe5c52adf45f6e6ff2ca9d172771bc4fce9d0c4e3c3d73151954f41fa532aadfeab31aa1196481bd92ef40597bf1a430a200a7b9144bb508f0c58d9135ffc52b97dbb12cb90e1bdac857ebb771922e9e337e58e6a81aa90aa2da5e80b121b53a202694a555b483540d94fdc58aeba1e4ed569e5b7a32c59699f3d5428930e1682e3453bf71e05ea5dd3704e83a66a4a15a29f68bfd1c713950a2907b30b5d0520c857cbf902a143cb1ae8fb4028bad5fe488e00cc340526f6186fe7f3a191874657a6e3a22ea3aa5157bfc9d75c3327d26c3e9324f46dfb546f19de327e3103ba3b3a6c3bca9386b932fea28f6b5ca858b9b80a103887f877b72ed3b6c9c5e3451a1b4c0c00fa3ec952ac6db17dbdc15ad4034ed828dc862799b7adc9abd68eaf9d526d5df65f3c4a60d11285b9dfd89e682746c4edf30e2bbcbb56b14ceb6cc06be5b576d44ae70303767853484957ee1b2dd91caf54f64cca42b5b6d38ce5402ddf0e9ec343a7bee4a189635283a410951cf1279588a7526855b222694161f68a455f1febd3e441ab5d2cfcfe1629cc7ffc752ec8168a0540fa353b359348ab2b21903f73810655ffaf496874894cec81d64c797086062cfa3b264b60090227b77a884783d675c288a1c9eddd64773642b16050b36182913e206d98112cf732d759317f45599a50ef3a92d4613011746b9598fbbc2e68fab2b0f36b7182909433c5722edf92dbc7dc828d652774826ca3 -MD = bff3139ac7bf14524d89645284c3541679832b6d4858b3c47ebff434 - -Len = 7640 -Msg = e563453d6ad52e08bb112f1e6b6c208ca47815a1c91d27a25aec78bf18af71466a454e1700addd58b6608269bbe47f1af29e721c98e81fb6286370b97b8ebab63498426e5b73008a482aa38dc374d5066989bf0a5234d0e1f02aba003a9abe370a052a2cc450200839189870cb45a8b7d1e204523d2cc18c7ce85e7b9dfa0432b6340d38836cc43951d16bfc1a7f8395f25047dca1f57a1d92466211ecd7150dfeccf37ae0ee748557fe2417fa49eb08937c9290c8ba83fefbecd0ac6e587732ab76e5da23feb8541546c9abb1cb6a787e0dec56f9a165957f81af336ca6b40785d9e94093c6190e5152649f882e874d79ac5e167bd2a74ce5ae088d2ee854f6539e0a94796b1e1bd4c9fcdbc79acbef4d01eeb89776d18af71ae2a4fc47dd66df6c4dbe1d1850e466549a47b636bcc7c2b3a62495b56bb67b6d455f1eebd9bfefecbca6c7f335cfce9b45cb9d2be43b9f6b8e42bdb6fe3a3a513aa6dbfbcf684cc55e35bf245745d645054fc3a0cbb4aed0adfb56a2117dfc6cc7617da048cbbea03b514cd43eaf44fbe2bb71bef79bb58b0b35aaa02de78866f7784a01cb4f0c255ce3b82b7073e164e5f7efadf2567d43b0d9ffd9d9e0a8e8cfd48b47e05c00fbc8d4495077fb752915eb8594444fcea1a5d09e759dd0229a595b87990f5a60cb870a486cdbadc8f17b807b9b73ec6f4df100cf9b011fbf239cf68820e1b1f53ca26ffda622f3a1651d9c18ec09972aee9c53da738e35472ca08ed403ddca87f720eaaf27d634ca2c0528a5ac8eb7c52cafb00626cb7b825c6e09b46b8c0bdea30962a7167ed709ef3b0d6a0688b309b131fe9cdc4157385c0d51708074ddc1e966c12e9ca3462756c531af2081f5be222a27e4bc763230d3854c50691fa9f9713eee8ae1cce8ec08ad7ebc2200e4ac2aa21226eff475336adfe49c4f15d54fe299d1030c81251faefbdbd8358ee89a6fa2a7aa9d438609c922009b59dccb88e57f52e3464b658aefb52f4d81b269529931ceb7ece9cf7a97568796b0fef16f21f95970b6b010f374e564612df4cf9a51586f970770b64e7c8363d57b03b1cb3f0ecef4853a8e23e592615d61dc833b3f1e72901460a54c22b27ba0e3717263e6c799b5da7148e2e9c50e8947f3ebfd0a8bbfeb3c3f033d2eebb73f10d29b00bf2aa2fcdedca4f72885532c04c070a75aa73ff0a69738e94b34fff929ad966a7142d210b8030b2c4bda188fc3cb7a03d97bd8e67befac181f973b18578bca69a5140f3b916ee647facc45fbaa9d72d72d0e7317e2d0c792521b53e2c1f39fc503aa42c391a69b11dc64c2b6e1bdbeecfe68f9c904c1f11e8dc8 -MD = 08a9d2171e9c2ff730050bff7fa4ef91e4b004bfa06a452a13d6e087 - -Len = 8432 -Msg = e5949555fbcbc3903d660ca9543c79d9a4f0af7d227666bf65d21d73ff230c3f0de15bff0d639167f0a44fea70463edba4d746d3d254015284eb6fa9de05eb172e845d32c549b28806fa8987bc022f9ab1d9ce957c85e1539a61eb9dc01d694e700605b5cb870c3ba6f02246df77355df17daf8cc712f00acebafb194e716f2efaeeba52c62589c8f80f82f082ad366b8f4b51805c0214be498006e3300ce6fdf5c4e3cf5e29107625de124d4cad1b0db1cb1d39e25d37b9323a74c40df3b4048811eaf53c9d888f55e63824e67ecd8b8086797e022b4041b271ac848d30c38bdc5b368c0888db59afad5d3ef728332d2303ce186475179ff1ac18eb59c9f9da182d2f5c69f3f01d5cbdea6428b4343bc2ca85d0af43a41b16731fc119c94038650c3d2c08e5af22849e455c2129bafc8764046c8b9bcffc4a4e29cd74357fefeb82c8c68d6600b24dd6d8ee898facb99858b5b4a287808cb4c69ed813179e45d11638f09f7ecb13e2ef0ae409eff1ba1d2eff72990e9f117d62e7aa9e7684834051f573e636f88e69714205485073473f6f496c1b3814d4ccab6a0bbc5b1bf05fb967170c956f6b0be2ea18efba19a825a2fd6bce0ec71dca2890c315cd4ad657d8f7a3b6a419f2efcc69e6a535cb24f94f82375a97a0349e61c19952d4f97b4f360be18e6adc6b3eb6273713ca7104e0fe409868dc886072de66571b78102870590d973cefa11d1f298cd2e080f49104389f56a0e365ea6b28e5c317c27825e2cb638e683b5151bbac0081b5603a108d840738a9b6211ab3c6a8a6efb917bacc14778eb957d24f39c7eb0a3a702ccca36be0082c5da238724015c74b66d62f56baaf5fd74a0e5fc202b53616bab20c6c74928cd0ded28ccf1f96f0d1cf9dcbaa4775c86b1cebc97ee6c6cdf246b5171327858d3e43975ef3e992e72cfe55d8ed4330921dd553d494fa8697751a1b36be0c21d21d94dbf50629717502fbe49c4a344785947e2dc92dc65e5c4840ceb196accf2516d7859a2f649a62fccc3460e7a42469791f61f070d3b4e312c0b4d0c28ef54cd1167d9596247776c17b2c6bec1a2e0673bed69186a8f1f57ca0b7db6a3afd10f558ab2e64f06f79fa10b307821fcd242b6576f496ce7e5a2eeabe19b8394d392aa6f7adc151ea324e91b37ad13a698a481b2861c9cbc1dacfa6b0d3d2124f8f1a074959d4ce506a6608130d00f36a0173e9d41f4729243c07da7751e04d69da6b83897bc6ef0ae9e97cbb0837d2395154d56277376f0e4a8090fadb0b7305e1c5229f5bbe3c7e7780f692b3a0603c4292eabbb1c126e7cadfcf21b97a0b8a6dd1ed7341e53e15dcd37d82556024dc9bd62dc5150fd51685cfa0d432579d604636ebed75637c37df89197338a2a68126c7a869ea46040543f609fb8fc7b1ef349d24f63e5f7e4d4a4ad24ba28c6f94a90e62907a913c1bccfc157e19f4d09effaea174e601cdbde3c0b1 -MD = 4e5132de5ad5300a472df3132e85ebaa94dd7dd0d910d390900adaff - -Len = 9224 -Msg = c0b461ad07ae4ab2f42e33f85e7fceba9d6c4db29c0019f13090c70ea8fc4882a6315f532df258f0fad9f85c1898b08faf85151a1d5695094728620d31c7b3dbcd292ccf113b9ad54ce1e489ba373f9d561ea07beff4772c7ea29a79b7dc7f50dea4af69dc107728924ee1c66de5e3ac3b3dd51f3d6228227d05569861c415aa81abd068b6fa57b37328d65a5929048305ed9c4d2d2911b3eb597eb45806dbb05d447716c680a23c9878aa8ea58b0aeb5d33dd4ce7d099a771a7f913c42a3b2c1b7a8cb9352ac18ca94647aa7a935daceb19806594df27c5b6f6b1fdccb89ce46252f79a2a801a6b4d9894f6ffca658e56a66ee05cde25d6634e8dbc983966a2dbd6a001ce0b16a12c7879b95db78a5947e28d056656faa21fb775975135002c2e0d703549521df5efedde3dbbe335d465d6c61bdbcf0ef1933a51d51f32d44a02ff4d80c2dd98303effabc842d4ccc85989026ce2cfc98b66de09bf29ba49c6ffb520286135ed1ac0b7c8a31914b9fdca03273ea4e0933841ac869d9854c767ce36d27650e1867b1e1c1e166a2b623b614d1eda4989d4bfccaaaeb79389b6f4178a49b2b469c91b003793685a9f314ac66ed088f853f4e9aee26a5443df7f3681ba6f24b85620c20c0e10e313fa8cf1a06e2490d9c45b7e905ca3bdd0e088f5b5cd2b14812ff237edac7ecdbdc3ddf99756013915667146191f3f3b61143af85bcb64c93a7ca7434916c36f7f838b2b542d51ccd4c19f08f23328141e02fd091abd048c09c6a7aec956c91182c1fe4d7ffbfb913d5b4b8ec2a0449030323aee9aaaf2a516935940147276fbee059e27c0c9e7d079bedf9e326e7df9bf2c5770849a165c8a6e27c0d375b474ead8d383bd9efdd1af72c101eaa6b995f279be57809558f88ddc78f8ad646ac59ec00527218225db08fd5b7f9150e2aef2a0d56b35a4a0c34667b5ae4b49803733479cdc927d4738ace913dfcf72df8ae72906744cced603de9644ab542bdd10d1f5006ab8984b2ec2be53eb4e169871f89db8396c1ce2017df18eb771136b989f5199993dda190673028269b343f5ad4d8252833e94ac054901fb994a081119c6e3d031c64c9908e63f0722a902de850f633e1a6a411d576d4df41b8612b7d96e330bf9fef4b47b44fc4cded65a3b4066c5e3c697281b3e0f5edf03cd394521bdcab3ba8adc50a9b4c2b864e253f4277932a94f6d538f0458ba251ac986a439de2f313c150c56d85f18b37e76f5f1827131f87c96c962ef6feb2f282000ba69f7eaeb47458aaf516c86a5f23a491b99754b3816b7927a487c7964f57ab070f931844ba3c260415c0494f689d55658b3ae06d1e57bb7c156a9ea2b48809caf30b384b8173596f6404fcb0f0bf024911944ed2cb1873f1e631cc8eeebd9ce5d58a6729a6d4632b54774b2564032bcaf145e85af42863278b5fd9a14a42e4e63b731d7586b9c3e65b79cd234f0442598ea2458c3601e98b99575e9053c2722aa957d395cdae0c1f0d9eeb112e2cd6736e3bfedd1d2f77ac84bac3c287b6b54193cb1230d81b9c43df593d956df768b6f4957cc3f61badf8d1fc91be728a3ec97f3f61ad32ad04e3453b2d26aafe7982d62137e76d50f -MD = 86b34d3d4bde0f05f9d5c409c0ff134dbe71d2c41640e081a9d3462a - -Len = 10016 -Msg = 7b3cc6f18a27047f4cdc35404e44eb8e51b1855d4bcd54ccafd1fcfaeef71d1b3e3133cb9a1bbba10a2e98082437b44ad308eaee576e24448d63c03e71843981e1c503bca463b639aa1a6fb2959973657933166ae0d7dc451242ddb893736edbec5ffd6eaee73d6db50784e5aa507107cb98d17aeff0c3f6c4d61b0f5cac054ee869eb86c38f9865b25d9d4a6a45f35652a0e3c68ba123802e8742ebd41745045c4a93afe8430e4a29838388dd60447d95b313f5bcd2420ad5be19f6049d7825d06abd8f27ebe844a2e3fe480b8aaba21d3a2ab08a6b6abd43e169d5f324e4d8cc3133ce876f6f7aa6e4d532fda96fee709bf19efe54e1c1ff5afa33a995d346d907bc1511b7e815bceed2edbaa6d98818402d681f75ef3d918f94b62fd98b977e541f0ccbab9e3c6d69bb224a6a31989d8fa9b5f6b6de5982eaff068cd655f24480255abf34d81840bd5978b6dcbf4885f22c2e8900f43f58d102ccc876787fb2f396a7f538ddd1bd53749805e3cabe5ad07d7be2397b149eae67b0eca03e6850153a9d73a0f68e6c91d4293f699c22a3916543094bb903d9e8f459ff3cedd2a64fd8e243556b77d6e040d46d557b9de99cac2e041cf73193e772700931cee73d073a1e6d3e84b682a98141958fb057b35b1ae6dd967cc95313a89c136929cf9ca626faf7428970f8525f17c2fe8277893576109ca092f1a2d4608623cb46b24b95651deb4bc1d0c145a2fff98c3b25f3928a5747217fd1079260d6443f6cb7d33bbf31504075fb64e812a04420228b7ada1c60e8038c930ab571337bade406bbfffbdb2f08ed1c69a577a3aaa27ecea576f5d6862d015c33a55b45d2fdf7c88b4be3c58f8d715959e398af34fb9819fdccdd5f2a8726570bcae6b55017ea25cc863d9778b649dabb093e6de811b89209459ca3dbf942a9198dda2bfde408440517d2f8f36bbcc817813184d0cd25615149f94ca16b9f7de554fe4ee24a984ebe686a910694134bf6b2399df41729af5d41bdff84c583f9f8881bc70632e16a7fe0cd0abc1a978ade041e605ad80aa4b693b0668def3745d992f93d72852cc1d1e7c20a1ae38dae5adfa7740cf61167e3a99a29c3d1038a10d860592c29c17b3be512392ad840deefab9e82125b86216cea43f02f542ef026c418c33e08e8bf46428541f3e1f74327d0c93172edb1f9dabd7362d75e029ea2bde822af09e9b57867e3c77de7f90589b6f02a3696d918b38cf127c5d8c5bd0c2a9a1f88130b865cbaf476d1d08f4b9dc6dd15663d48a582be86e801abc074ed75f461d010985a77a480f3f686013dec66579908ca44c9ccbbfa4d91bd3beccc05bf918fe7d658538e4ee9f4ef9705fdff255e262416ac1bea15fd7ff87e4c3142c256ce800ea977de27fed4f599c858fa100dc7350675f6b59ea1d343d0bda494c75994c387746bfed3da9d7f4eb186bde04ef4e45b4de6835fe093857b67ae639441e9988be2b8541a265774ffe50eb25dc8b4195f5b72bd1e63c9a8c571d617f3b7d5e7601be54ac48a0abef48f78404e240fbc58c822c9a4d17c93f704a518a96361984f467a4698adbf4475d54dce7d090db68fbb7e10b9d3b52e5847a2cf81ec9493a08cffb25f387eeecadf14c6b020b7ed4c5d0ffa24117b61326355a242fb77c09b14fdf5e1d24da43ad6558fb011144ad7d55cf0af32d614cb7f46fab33710078807fc77e624364e0ee2999145832cb5774ced5820dfce2f6dc4fe409e496951ae8c82a036d6 -MD = 197136a53a6bdd29e64182d93435be4427f06ba6a14675e3cf886b57 - -Len = 10808 -Msg = 561fc7f9570f612df1d6868ea2922f40c6b55171a5fe05ecb0a8e7eb08e1bb2d407d574964ecbd423a69875bc775882d1584b0f634f630347f48df73208cdc63d716752df7794807b1b2a80794a2433455c201e3cc122f414052dc2ce4758347a153eb4d169e4ca5de17b3371101a77f0dd60ddf763a493a7b2da6be5b84f801289a8050cc430f4449016e95457bfe33c52a9c933956c747b94105d28ea282baf454fbdf1e50da0a7bd9a3c938f68e7b062576a71d4ef19280f6c11083b56b9a8bea25a116adf522fb05187bf25ba17d562f62c22a0a0f405bb4a11f44a6f9c877c2c63fbb42a8b251ef96527c937d6140b0298c6972697ccfe36ea8d95e756d4046a66015f73be306fde4f6dd856a50491093afe16f476c66ebf05248c427b06cdd8cad2db5f5dca199cc101d18b272fbb868d09ae7f038a734efc69bbf56ba85ee41cd0a6220c6aa2a144845369ceedd0e709a9dc4ad091a2633abda394bb213e38e69b4e802c8a91885455bc66fec777b73b2f1ecc607482a83aa0b194fc19c233929342de30b27cae7b06aaf7496526838c39e498359b8a6a96b3847a80faa160ab4911b0db6acaa023077dbf312f53b8873adc12b28f2046b9568aa9ec3c424cbb3d399c7f2be1f9d6e8c313388e85e2b6a253e089b7faa92d0a42c7b0673b542cd038e58e7e7918211b0997e21b437e9510ea760dbe602e6c6f3b485ff3d3138ab28e409bcae6877c2ecfb1a04e0308ad071e47c0faf722e1c5d2b06d7ad0076f54a82229a9b0d4529473f505bf4afd58e55dca4606364347dea7744b5488ac1527150eba837e6b4edc94e684b791e9334c27920f6893fbe8fa38188c29838e46aa636ab0f095c8bb77a0eaafef6e48c69c0a237f8a96b95fa8f3119252470a5e6f01cacf69ad8942e63685e9cf36988d6583f328e4c508167b6704107749bce6e58ea348670c095fb8b44cb4cf8154f23913959e2f956497e21244690112225a9e5888ce6157d57c5fa8b3a378e50a8f77476f41938e5b7e6d73671e7826b73409fdefc401178a235b923f3853c825dfa07df4b5e91659148e08f0a354fe07fda8ed5cbb9ea183df3cff63e5d8b1334d5545ca6d78d3ea04b451559a101e81320bb53437b2ac4f2a644eb63e7026bf63063d64cacb3d8ac980db2a5541feaf5ba2d41aaae58e687f621e9a94d29f26bb23a3386068b9b7dd6404d38763150ee4fec884979fde5c58d6dda5ab488115a04e35d9c0d9ef0daaee7ce582ebf81c687010e6805a029741030a5bc46a82e8cce663ad6e8733d8cc8091c4ea452e5450c73bd4f7ac91a5c2a7232182b10b3cab7c9b47bc093eb5ccbae21620171e433834a7c45ff012044813c69b58b4806da6716b2d5bc84630f60dec4db6da5e657978f3293bccea3f6bd9532dd8dd9918487551b2a05d00c702ea2ed030f75537aee49c982dabb0b38878675d6594aba92bf8cd9c3c2fe4d46de0184201069936430802858814dc0d387161ae91823ebcab6c5d3e81c9790581704727b97090edd063c375dd80e2a8f644d095ef2ed8bf61507f1e13b223c6f82b29d5ccdde2dad1886dedb0885b133c6332a7d0e2e02dc835b1bf54627b953c613ee0ada6f569b0d650518383abe8957d1658d9571b745a9c7396d652f6ecc8c2f4dcfe544f2718de2945d91b6b757bc2ea3d8ae3b14f82e563391c2c1c5a27c0fa3f116e66af5420473f23b800666a052caa4821680bfbc0df1a98265259c3dbad6b996dc24f0d1d38b1f5d20117ea946c43a39896360f8f65cfdd0a3f6847838d06f8dae8a29e557c22c201f42667f1177e2fa1d26a48c185ad5d204a120d492775b23e5036a24990160ab0400e8cbbbcde4ed582f53207bd478b00f8c39facfb5c57e08f67936a03105 -MD = d1c82cd0224a5a141643726388c004461dd8b3aa540d4779ab7f0321 - -Len = 11600 -Msg = 9fb6b9c886fd33af0fe62ceb277b147bdf5ba18dbfbbc49f5cabdbe42c9a28e99a1d827856ec4abdef2da1a7a3f6d891760d282281f2a4718d1f6b6de08e227d577ca263b56ded663b7067b079a443f563fb3b55a73e84843e51012841b9b782ff5b81514c8604f31c34e6ce508d3beecfad40efd9a74c1e98ca03dbf823cd42b942870ac34178acb90386c8d0baa9c5e2aca1b9be36e488c311db4fadd44d03aeba1c55c1a62fd93b64af68a23276c3c37fc478fff2340ae6aeef4c07d5200e054aa8fbeebc12c2c9e0c9746efd882d9bae13f743e425eb292aa99aae2d2cabe77b93c5f38b09af8cfe3cb5db24c94e91c2f4fd33129d75b50c70004be45b217cd44578781bfde7ab4670f392ae206dce42d151778685eeb2dcab47860394baebdd26df2475d4b34f40cef63ba374d179b611bcb648c69f4823c4370690bebc5d1e9fc1a0a0785ba075bc857d0cafc3bba61c06985e46d09d6722987496c370f92016e593a4cf27c56ca36a00f0b88bbc9b5af7c7d2efc9dc332d32771a8a1ee86af414a68ac35ee7adec6b6d577771a31d3356e8aca8d12b0c4dcdb826fb0e5184a21681593b4a2dc1fd516c49d4bd99b20feda6f25831b27cea30dec1fe875df786b3cb191e31c02f40e3a4cfb7b6c5e45682a6aee9329b0a6c2492f47bd3344a0ab32dd2565cc77f1bebbef008a5503a70de93e7421a0b3f3b717cc65a38fd0595dd4e8dca136b3af82f61b5afd2613cc5c913a64b312ca1bfdf433f83ffe1b18efad752629ed4e73e79362494852173bd0bcef2ecc126ba61359067df6f07d55fd26f270644290e558fe548a006b766c16b6ed30d102112873d0a4754d297f96f2dbf169e4e9337a5391526b99c4c9e37b298519667442f9bbd5ae6cb6ebba526d36e26120439eb96416ec8c89108a189a8f6756f0eb79b037e274c2d8d9962ec8c255f4aae44b1906e9a35b62b12f91d153046814da3de29481a82607559b7291f8cca2f94db12fb873e7569b3932d5dc1eeccb26c307e73e3db8f4e6e242d45554a6ea7fe27953f550591cb70b2c6b074d710ebb285054b16117bddc2224ba8f608549b334fc2c4a09490c3ac984b7df593191569cbfb18aa644ff7b77a99bbca6d82f47c7c21f22f967a38ad6c442e0dcbf016d729e641687e128397559fe49822029821d63b32ccb15714bd573a2a84279bd844c850301504cc69a8dae68c2acedc716a8497ea3d8d303e2281b4d9224e2441facfc04c7ca185913332f51c461a16669eafbd844bd30c9e24113aa3aee9923b4067bffd64fb46e37f8454fab5aeba5e077e3666be2bf41c0d3054f0f29feead5db8d4ab94ba1647d6f98c903e31cf43eb1a89fa5e3cefa023058b28b4193f7e9ae987bed587fea57eb92445ab4c5efc93aa3ea6f3af0512b0b966b3bdfe8d983f23609eef0a05e5c0eba480c3a66e714757ded4442b3e5afa736ef9d5f7e1e2948de8b4aaea33efe4b794ab4de8078a4f49f0eb1a59a3604a5c2963c3ac4244e050a666cecf90ab32467d2d12b9312ff2a7fc533de13b0de79c215751c4b8a66d93221d22632501f2c0e76edac2f54879998a73756a0f471b5ade3e45e84bf0817fe5426f4bf9da6b4d58d66caa5abd2c4923b58a9c25f72cbee68168bf040a653c763b7d32141ce6135acd921a697653dc4e804321870663f1c38682f2eadd61f15d7214be7fb1ab3d74bb12ba295b367d943d699e3d5a081bfdb75b28054fbcc6234dfc97417f02f12f08b531a2551d527c52c4be4ddd63631a7bba0a5e49c0e44f36fc6662703357111c4328dc4a4f838e281c26c175bbf2a439693ffcb4b3736994ded3eb6b8599a45f8446e024153952273981a00c5af0235b2e70e876de9afacf6885e35742dc703a4034b5c9b79c51b7e375f38986841d48d24528798982894f6325521eb04bfc133e9963237dd31241e1aac1d488d61c681d65c6a3fc539e7b965a41a7170bd053471ef318ae071d2bfcca12d5a80fa723d679c9de7e34c1bdcbcdb6dac1477463236b6c92945ffb -MD = f97cf08fe663a2506c5c8ff6284bdd9edb71181e9271d3fe19d4d205 - -Len = 12392 -Msg = 9a56a80c07149fd9d166e0b59a31486032d93ef168c02e75200a39d9a6a42a0a4284ac5a0d32bb26028759b558b4826410876100caeac474dcadcea4a585eb981f5409ddb4aa0628538c643dc275440f369b922921737d4c4b772a5a2427a972594e285da5866629eafe6b13807b77abcc9d383215643f4794f2b5c3ca934ae117fa6fa287cec56fef65d50039cf017efc16bae450c4f4abe0a6d7a640d0b82b81e1477303880a438b470acc9577ccd1ec8d8207779b83c1561af9cc2ee6d998c08a1999c1be1dede52e723f3e7dbeebc48af76335f2d4d11fd681fe3ade9772fc7d4bdd6877e6b527a17521d9e8c116ad9581bf2fd0cf236262d9020fbfd9ff5c434705a0bc4ce376297b3911c1bc98cf3788e5103d5cfe484767a053918689096373d913943abefd4dec508b0f96ba51f7749b7e4163acf90c95a2af5c88562b6539236707958fe195302ef2da39c45b5eaeaa21e5cc739c39caceca29c6aee9d200a9441d469e4d89af9bec2b8cfe17f39cdaa3307f9c59566dee4dff28db6b312f3453df353367b2d15f210977afab3ea7f2a92b646e59ece8c8dfe79624da0a308c3b544a965797ff413b7ce2213fc737bcdedc6433c482a22529e8f8d05ee66a79a5846e0e46c09f0bdf8cb59afc17b5fee74d6531c2a103ccd20a36281e4b45c3397887e55cb61b83b742d86309b587816f8650b279d073878355397443c429319e377e61c000d9726ba534c48f29170d1c8d0efc14975a1ce4d2e7fcf4d67e8d7dc93ccb9b26439fa3bdaf04b6fccc6a966c8657b97e20549c8829075a0bac9d7d37a86b14b1bfd40693326da5b50d5f862b9f0d910e2df75480e8de9cea1b2a4788a9885428b7d73c2ea64585dc44b594d04365c3ceeacdb3c00acae4fb34fb82c4296b82139271ee97f1d57df9d834676559a67747bd9d6252781157c75ddad7f40f5dc7fbb86ac4d4fd65b69531a4a8f1c819d7ff0f31083d1bfb1fd5ff8dee1f43a44b66918a65efb03d5837b7cdfe7d7a060880494f4e8adad264ad83dd6e4dac8835df85997aeff4a48a68d277121056b53552d1c0dc409cdc4dd84f9200863453adebfc5eaaddb0e474afea698cb2446d84fb114c59674b6303ddcd744bd3c24bdd145ea29ec0cc433f94676c136b2c771d056fba6e08ceadae44644af83b3fbaebe1132dfda02f0a139fb1484f44f61b29f855d4c22a0d0274967bdeaec791e6ffda83c77086c380175930c5e9448ba1d05a2a60fed5f0ac805a7cf6167ea118428816389f786fef74494caa8974d15139b55627c9115ff2f818ce5bd7685797db72354731811b9d51f86ec1d6dab1738d9041f1cce7421b0559d9d59a8d9badf32146becfa6afd3d7ecfcd07980134ef3745386ae5e8170cea3052c07f656a0b21bb36320f114d92eaf60a0196ee02b94e8f4ad187f04397c81ba27c5aa6eb93feae2ffcd6930f77dc900f95fabfe5298748c30b251b3be3678608f7db1cd40c3153d597d16ec75ecc046a3f33f570b26a083d523dc774625125f2cd614597d65252a3bd901319aa51e99657c32d29e66f541651428361a70d61fc679dafcb74ea1136b8831e5b0cd6a6008a38c565281fa2ea72c3eda83414c09250d0b9d38a5115fb233aef1fd8f2d05550f56cd719f38b265142549c7bdfd83103bb0244693fe76d882813eca11eeef1168981e41e735366573e56d2e0e70f651abcf782a40efc0a51cb1b35e7b3586075858310b827b2070f2872c025c2dcbae0473832cd36ca5e1aa463703f68b32fe85a0ee169892da4e39117089cebd68f0efa12c9375fd8d53d349b4ffaa765bbd97773dac5000cac7ef8e200d8da737df13635ba94d2be0c440c1119bbe80690d37e60613d24f5aa3bc0324d4c0739e4219c0f8b4847d06fc99b6361f5a31c4b60df331944706f1a94a7a642690aa07e2a8c1ecfd417c67c385310bd3a810d480c0a9a677d7aef6a23efac74d25d3d988696c1dccadae6be1ac3877fecda50233f90d4d04a9ced357438c3790a6767cfa03cb7469f09d7b1db7d665eaf478b4965f290e83e6eeef8dff379c363c1c58011fe6d91b31d1fd404e10badd431253729b04d23bb597b20f1a03dc880e4cd56465c3352b98d15b1218f05f20e2fa488f54a67f753f4f84a43df8e0ce458e5bed7c6c6ee14e25fb5bbe -MD = 05be5210d70c1d8de9c777a2d7c5a3957a639c53015c1020ec0151a6 - -Len = 13184 -Msg = cefd494f2fa82277de69b677e76c8f814808bc39a69f23ba3fc619d920a630ad98a2504fec3b0ade4c3028c606e98942fa152c204e938ac5638e297007ed6ec3eceab37f5800998f1f0b9f48cfabf4ef2ae98a7bd91d6c9d5e0f51fe4b5c71c8b11b9767dcc178913d424383a879798ec0caffd3af06724b1a8eba0a53bce2c4d17e2690de444eec901d3b01fa1cc029a301b3af381543d67d568b1c89d468bf335b8881c852c4a8ffe3b04a2e5d70c7bdd6cd97db14884671aeedbc546eacc2bffae5c200b382ce71dec9e4aa023171f590751303c9e8a3dddd08731c5055d45da264dcf02f2f66d054af59d8d3ad2e3379d5ac15fe0cf6a82c03c84a430cfef59d2d56fe8e7376038e89311f9a89065fd712e97a799b47bce30744440f79476f3169b89497f808f2d480f2e61d700162f357539a033e9c004a3b6d737c43b7b3a7408b19136323856ebc26972508282215ca70dd639dff5ca8c8ce3f521356aa47d955f5cb5fd0a4a36454997af982888593cbac635f77b847d5ec1158902d3a585da18f84921637bca10554e4ec177c8adbe96dc92c0cfc6d8b514f5763434c24f3f45109a4fd26019ac0302b89f0e76dca548a5eaec711631284631833a0c9f1c4d8a2213e8d59ba780d95167714af77879369ea8aafdd71910db360a94d9708f8d4ea9308cfb82f6274eb6f5f8bbeed3b2e74356bcd49de3075a9fa6d51a0b1b6719228a9ca2ca8817e9afce85efa1a0dad1106f7273df41942abad26b4ca33263500a8ca869b6cfcb20a86bb944d452699aa26d6c8a2f971ff23407c7fffd871aa9ddb120cefc4fc99a3d47f359eb5ad7aa65eb1b55e366331787c19b926e6bf58d1882a630ef8a9b9ceb0dd4ad4b3cbd66d7430f75bf314621229a26a27a637c60579b993e2502a9df1e07ddad987a8376730fa977f78af19590fc29aea60027c9f7468a55113a8ca762d06ed94796b24fc5cb89db40c5adfb5f51f52565c47020942dfa0458b4acac35f218bedd13d2694be110fe1f83d3b8ea4619955e12fe1a9abc58ca5fe3923423e75bdccd645c49720aef7ee8582b54ce53178cf38e2a0e976c27259b59c605991ab8a19d1ac866d48365cc2f84ed5577e37f6aaaa87c7306d805948f89c0672226afbbc0a99f47efe5247479ccc2417371a1bcf7d47dee556a4495c0f619ff4b75b179ec93597320caabf64b82129f5da82ef26f9496e72fad94a7c4112b3471925e6a556a7f6f239e5cc0193786c572d197b9768b6fe3e21c56590d7d8c8d3107170baf81899244cac760776f776a6fa84c60b10b517b19210a18119da68ff64e7bec6f9b009320ea6c65ca9c6ce4b076ed8683b6f4033176307354f411a35dc2ed7af9f96cd82477cc3e9740efcac1c7dba982f0b012c76669d95c13467dd41efc35f33f36d7ebed576961ff789330359738134b2e20478c06d89b7dcd55d5bd18bbcfcee728c3d5ae54cf1a8fc4783ab0b0d948c6c23e5197ffa7860ee1ef27d36b044b063168ab31af1334add4f631b8b2395c026f2851bd9ce4de93a88ce9acc225161c8836e871d6e2e04b5b56c50faaa817799d7206c85ef7e9f4004b6d156f96d272a3bb17ef4ac27ff0be066f3608c9ed84b3b7db48b4353a988f874cada1fde2d0fa61b41a9926962673819abc6b0350cc687659cf1b413309acdce2c637bec99022c747844073b5651254c2133fe8d3a9221a0cbc129085bffec8da0f6f5e194883583cbcbf5e403520fc9fdaf5ef08b3573f6eb038978533ebb79cd9d7503452b2911e04843ad90f15e56e642b8a42739e32fa1bdbeac3fdfa4595c5fe39cd57270e662c2d9de26b77abc84f5f4f23526db1297f9afec486a0ef6f44527f26be572caf7429fbfec2bccc280cffa22dd82c26875be4480966861193e552a4d300d978547cf7d970bd5ba3282d8b27c49d700f9e21565af50610488e199d2f74c7148defb715bb0aa3dadd3311905489eacfd8d8704fac29fdb610c86190837e69aeb9fbb302150f2ec0e6c3699d9cd078a20ec0c96eb01aa60df6cd5dcb554260eea8e2e15b7c00b6943c638611854aaf8d3dd18d020b49a77e67275eabf973557ab74fd2705481c3cb6a9e077a825af7e7e2a53bc822396a9dee40f4b10483bfd9818d06ff32f4deecddcd6e573883fa487996761f796c77c2f8b4a088eaf5f8617444df36abfc806f229c1b35fc582f357f3f9c76854547a422fcf272313ca7c92be1fbd503eb20c8c564ae756239ff256ffb4f7bea6662b7d9845b3b6bea466704fecd58ff53688032c188b3febbe2aec873df8dfd42516498d55b1 -MD = 12bfb13c57b24ec9088ed5f6fe67ea38010d00f6744cee29629061e4 - -Len = 13976 -Msg = 3d9446bd9e5c72f122b7ee181ac32e663f635cf3999355b2a0f8f5a2a2bb94486498d05c0c328dc33eaa3bbd866f5860f658354510f0fc81e611f2d67fb4fa2b7d075b3afdc0c289bfb18b9b879d3c67c24b52096dd841b83351b6f8d5821f10cf086dbf39ae182bebf6641ae4f5e464ed643ca979f52a3fd0e3c86e6ccd0be0a3c4905387a398910b9e51a2671e5740bdcd7a8bfcecc2fe05edb0a20c3ec78141634b5eb04749a366d4d79bd6c19de17bab9419be680edd1998f7fa7d7c5addf10c26487d43334a46be806dfa85bf316e2913b9860f18c5560b24e08630ccdbfbe7aa79b33f5e6cf184d3809b13c417e06c7ed51d89e79c026fbfbbf1022662a61d5e5a1de2d3f2b04f583d8112b47a179f5dd44c7f834c66eb50f384996f5c3cd6cb5182d599c5cb47980a732b97445ce8391ed999f5bbcaa860f0089eafb0033977c7a9c0b8cb8a931a503a06765cf76f981b8c7e44d375cd761944b8ee46446fec255b4939ee355c66789e4a58aa305d05332fd7787ab1831bd802903506469fb2d1601b231513c905e867a046164fda05ce884b9a9ac4f2d69408ce8bd853f24f3580dc7e286d037e0a5daf47889b0d22546183b01af7412fb61f19f9a4b1904db78335520e8b315945482063e85d1fe32d8026c5e29299aea40f198652a9a034c130cda8b1b57c1f00ef9aa21ede38d0c1addddedadd21dcc7a0773aca834b8aba504d87f8330c57a51bc60d12637e7278b25005ea200240879adb1df487b8d90aab5cf8cb4c08899b944babad371c50bb562641faa263634dc4ec38b8fd10a81809a302124a983e4a22d385d5a138f3f060089bf2ac6dcb7fe75392ff2c7a804e32c9adb573e6fc1a8d03a173e8fbe181999d19ba86470287cbb833af5d1fe813ed77019d10174e739c850970558ca4d4c98ec63a781b90cb38c124b2d82668cf045507b06856b9bd1901c5b23013c453b882a75bca0efbb5f6196ceee5b888eb3d0ac6d7c5c9c760ca1edb23c1bac7642d22c603c34acdabcc66134dccfdd1cd613f46fb6d98ffc4778555aa4fa73771f1162a1bacf78d17845122b6d41ccade389b9002a9ece951eade3a2e24029be1cd05db8ccd3cc460e481a010463efc8689c7abd6c1ed0e70ead0939986f47c1c8697e23c6e42f9eeb59f95456a8aed2e1e6a9f5dfdc2f5873e0367d2bea5618ae7754615d731b429be520a3c8829273cbd2d7581a5942700af20bec1133cd293b7470ffe50307e79c94305dde842321a2fb83428008a2a4105cfa14ecfe1579fbdb445de2067dd469c199110d2fe942e3bb2e43c57cd88b408b7166138be7916c265f19f90ff5bf8017db3bd8d85d7e2abc48ea4f284c8bf7f8128e298f8bf608e021b28e82080f7bd1775cc62fe829d4695394819d873cc34d4dcb935bab2e5e932c96170f1d3ab9b8ede2599911ec6d3ceed1014f11042ed593cce582ad80d9b9d05326f9bdc7d628bf6b17a6832c71b16b2e42af6278973b84f094870bc416becd6832f4523d3d9b5c6564ca84607e61691aca50f41098e981d534fb5e3e723c7453cf6183116cab555fd597ce3eefb759150cb66e52905a1af92b321d76989d558450d3c8daffb32ac8fe70a90e424dcbbb8e5209b54a27c0cb0bddb1f2d66bf1986bcd8bf0434d5d1f23f7ad55127f315cd3a68ebef2bd13c93b50c439d812c90e84a15507f3f46ce10a9f53a9dcd61aa7514645e6369474825e3dbcb1fa4c5c451011ac787e32cabcf6ca34830decf7f99b93c7b182487374c8e71401d9532bdaa2710ac83e72f6e19d2ab867322e49e227219ca76243911f200f52afe1d1a83dc051e88dd14f821d521357ccc61490ef68723d4e63004dffe7f900f2a04261fcee36de1fc322fcbeba26bb3a462a5d7ff408120ce1290a858546a790912fd986709244248097c75429d73b264eea10223e55c3797908674e8c7aaef030f47f691be6c3029608526c45a750172cde5954cbddb9faa738e4b961f79fa80c2ae41334b6d350700f5e658209a2938c7189b611127e26d824f364aa6fe21e8f4d88234f84ed84ab272bde63909b11ca3e2194a2967874a87723ceca262eca36d6dc17e0d38a25a3ca4b457ebeb21882bed19ef4dc417a8489e66645ccce319f51604f8d25219a06635d2917f6802e325dea238c56619ef8f7cbb9a1c658fb2547b558a8fc5c782faca207d3da7db955a60bd0dd874158622b443762a5477d75143bb1c8bb83469be0ea4036cd1340692197156d01694d7c9ed06e1cdc223eeb6163f960f54e6be7ca6680c550d959e95b1c6fbf3761d494ecf0dc14ed71c61499ee7e063c067e7fa3d747e418487c52ad1c4e48ab9384478045f00f5bae996d380bde3cf253f4e0179ce43765e91e31b2174f9dc0a6d300e3104840a9412f71b67c9859babf459580280413dc23c602e48dd23338f4576d9010537d58c20 -MD = d07a5cfa89951f608bac73886f5bd9f9c5bf4fe49e9b0ac7d307abfb - -Len = 14768 -Msg = d8aff08f7f75b638cdef556e35d970d41f0b4b2e8b938e19f80745fa841a2a34546c279e36a7173485c7cd0c4eb9578cb02883db8994a3954fa48ec33bbde70aadd3a222cc7fc38a6c52697a366a0c1a024203f188ce49a038c880d066453669aa8b6804872644a44a3933a0351317e4dd02d15ad16c07a27c1b24094dd9a0b9153d812db0c422e8e723336795dc01540910f7fcac946503e347815637a2ac62b490f6848e80e3c00bb970b59cee51d04d137dc1606fec2b35f19fa06ec7e2cc502dcef06b8311937da3f27494718fc273b4698f372423833ac387cd3871ca5fb0bb115b8df533c80688c18ac38c4491419ac55077db9371ba6540c7dec8ed849ee3c7ac3dfdd2c96e11e6e17268f7a5806d99eb69bec25e7c7fd274a7f3d2a1e04df9cbc3c375fd7de5685fe82d3066f7d7eb4855f23ab349b846bedd1b01203fa0af9f6770a4ccfaad4fee6f02773c707ec54f83a283d6e9b8a38cc66703678385ef12712ce89eaf10a3754d0f558fb10a2ee83af423312428f1c5ac005fe074a3c30b281ec7db62b76ddbcb7d51c784242ffbc410a42ac2b03953d50d9df1d9a33273d66fcbebdc49b50a3174f44caf74ce70671f8e2b8af7821d8ab746047c2c4430c1467c37e56f81e9c71bc486faa1152f6c49679b45a6d40b1226e18023e7022b31cc612545d1db60d49b4bde2f540c201bb5b9e2bb643705b781f6cd977b734c7029021ec316ca57a21c11ba1434ba2cbb8c0b68b4dab4f3bff10d53a091a07cc584e78b28e657b677c59d8373ea273996f5e694f8b052bd739daf7905d18fa1770599d23ceb88659cbe77a2121d5b30f219d1d04e8d1a4c1bae63a990e24aa4cfd69f5dc7ca674d5930277db9765ffa1820548480191286ff4bb24b076dd96e151c8192912efc54f543357e329c3a7d5031f71654fd4454669d23c5331942e69102c8db61bd4e63ba1e2a0c4439f4a3e17443ef93e1b89f9acb3e80dc8f8ff38aadfb9f011f6563eeea8e8eb6f296531512bf77056c754de1fe8be4ca77c87f4a48a24537fd493adacee76e517126753233f41671478347845e935ac478f37117f94537ccff03d2c6f3bf13dd5eaff081fe6835a01aea76ca12dd48943a1ab13ae86ddc88cc9911fa809de5226036ae4a9ca53a5b8cb2c1fd43f11700664426fb3fa19c320d16e1bd9e0a4ce720c596d535338f6845e40f63185830d1a47abaa1236adf94697f2959758db0f646639069f0989a8fee884a46ba99f9ce9bc35476be4f0d7489ded1142cae79157919844ff55ec59a2fa459ec503cdcc1f427dcc038d88e9b143ac037ecf50f0d61ee5ad06d0c774faf42249e03ca407056ae3bc8b98dcbd1b39ce009dcebdba5a7eafa32802b1778176993a3fbca8da56a6157d668f72add0e0b18d4251743a7f3154dbd55420fdb0e228e455fc42a26d84719316d9d1489cc8f50deee01b0d9ec7839bb15d9c6413d74fdca574081bb47686923f107f29b9630707160328b053b1aa772e779a4714b67c87b0dc7f92e5fcd30f21cbe2adc13f761d3a3313af18803802bf4a81135e103d7a0a6e0fa46c97d54e715492614eceb094cde8627667a3caa2e63f17553a75112814d14ecca2d80bf4a05304c0bc815512639bab82bb9cc0fc35dd938944458626528ea388332df576313fc0688507b21a7dd54570aeebb96320aeac2c06120ad965fea443981a106796834bb552c276219f2dc6bc9c11226c291ab7c9fa5b2dd5a1b9c79b3c2ceb3d62b60d2380321fac29fdb5c31d9d8a9bd1ba4ccf8b915d8fa84893fbb9c6f46c08509b5fa7d6fd3eb0dd8910adf150669cf5e1b95445188bdc138ff17b78ba6809eb6cb63431bd4db645b741c7ad1250fd660d23cef6fd3edfb311f90bc2abd5e9def7c3afd2de4dccbec6c2e5315eef6573257b66276a3d059fd09ee535472a1aa3c304953abed346a14e10a11e849687b5d14cb446edfb0042323f92312ad93ef264f56eb9fd62c6a5a3b765d531eab6a686f423e606fd3232bd779d56b567a9134412a7010870cf347e33bdf5d55084bdbd2e5f7533b82df9e8c351068569fbbef6f8d8807e71c2c623f213e0ed6c7463fa47a184f2a046003a9f67d10934a93dd3f46db8be0a43e33b8ef236e8930851b4dca485c26a3cde29884c46bf6c341881a1f12a459eb5142b76f3586568b2df7359d308317a54ec4c0a78c816751ee7869ded55a3b3a8b18a2671d5d261f695bc4bb77cbe3530d2f89277d5bcf3dc233924ccbb66cd9173ce2a082fbdf355fd062ebc63d73f52fae5bcb400014d0e443ff319dbfd5101b36e0e20d696b1537dd77f6c5dfafd3dfc69e5c7d78204f7d301655f37e5e27c08f03f466aeb0071a0b6ba51bbb7f344301baa3dbccd905b480417f73f9f0652dceb2a034d2985330e1a6be71d9cc6283e6186503032939b2bde779c83a71138b7b57ac1fde0a40a0e790096e3f7ca3c8fd1e6d9d25f7329e6e6f099849cb79011e59e1d1d9ed1793a59150bbf779403acf3582503b2a39a11c43f88c2ce4dfb8402007efcb2b2130a41259ff09a98100e3c56bc44bac96e34eca0d4beda68dd76814e624bdaba3a0 -MD = 4d6d3f7117c907aefb7bfaf2fc0f01960c4968e824fe0483ef66916d - -Len = 15560 -Msg = 943e365bf18e4a49e5b21c5e43022c6ca5820325ff1e69837a34d7677f532f801143ab6e614513279c9b349a084b8d934f214bdf1bf378b0e2286f43047b93bf13fd4061715902d6215c05e8d7b5cd5d51f9271ceaea60926df8b454270809064075de7b4b547e1d1bfd7990d8c7549253128026978b89f1c1ab90e41181fb1b40b26b0514beeec6338477d935098bfafc753c43485e5b958649ea39e96ed0c7bcbcd047f71dbc9710fbe60d1303d85cf52945bc26ec3f4565dba99cd858f0d25c9cf6891afb4f595b69b0729d3ea482e53681d958bc9bcb0568b75506c6c304c759c413a5df0fd3bbd7bc50f841583275a5dae10656d8ed10f8fbac9a40b125a6fb212cc15264cfd94cf2f14f945a354d7d371e5a435f742b945de9bc4e22fca08bf71e96dbb6135cd03a9cc8c0145314c67fd67a0a97270042c55396797e525e0f2d2f4b026d69ed6b7c988b4cec5373889c528e33e7d0370c1b334d482def8792aba8084ff1973426a02ec1c04cff11cc75dabf47b93578fa47d10c44979bc41959d1f74bab65d8088ea692a59b1d9799f2b534cd74206a133275f9f3241ebdae1ff13d7d019d821a2f4825814176acf8fb2d174d7f57b55fc2673cdf3d3f1958e551056d5c05d963695ba3dfa6d2f9f078888d4f44a202e6e0eefe9048c78120933a75a4256786eb2529334432f92589510fc05c2acbf9b17554678daf7f9c0c11f2b5a9c28930ba4cf8fe3a4db2d9cb6f0ad8fb999841c767df9e5ed82c132747c1ee049d3380d9c4112c485fc6bdbfb8c1fcb5f9d38330a0d8cc8b2d998d761df1483e1c2f1d4f77bce4f7d0fe786c157b5511b34266f50687189c148db3037cc9eadea944b1244b414ecd0820b3db6e820b972dae931d8333ab1af7cf2dd54a90fd6cab39e1602ae793546ff41512ac1c45cfd0deb1b0fe25ac8d3d28a2f4718fa8718ad7570cfbf7db146d44471bb5922b42049c69b75ea6447b4e60ba69d70e1474ade6bb30a6b94d946bd6f0fe732ce77732ae63388dfc9b6e923f1e3b665468fd7e2eb4d21275125ccf73b9c1cd319ef6c0dd463e726fd8ed718d767204abcd946476ebfc297351f403e34a6eaaeb7b4818f1bacef5492481531169179b596bc2c78808b5d2fa33e56dee4a0cf4a0a3f4a0b269f2fed0a6b0a094a03012a7690e0f2ab206f554e0b5775c62a492994182c2e8f8b1754e8705c0dec3c851ddf001a52591f57bc77fef88f4393d6c1e7b7be55a12144209ee051bb779e440432721ef404e8d4a9c3918077f78df6a76796670d15d214e4a043a19e76a8ec72137f9564591d34b1b35ba5ec6c69274eb64cbcd1581e27f58f02b23353fcdcebe470e43fa01d1668b9c5cf48ecc5f72c3643263ee275fbe7ddb609f6aa0aa3d6380ea1c29478e8436958731a2314d4c47a0249a24f79ff4ffed62f74e342bfc580a144a980b128b6249c27dc99e65eabf4128da7e98aa07274db891a9a45bf3e50c143610f4666558df9540cabbae34736ec78bc5b388e13d24ead743973f0b52ae734758aa91f8608088e26e2f3013aa508815c1ef42688999812fe4b6e12ae61ab8e43ad69b2ec15424cb7da3f36dae0ff3e13af5de8652d5040353a94839ea756b777c208dedc582f064bfbe002cc5d29055f86c6722e200fbba59177c21a6ea1467e72f6e1fb2337513fb295e3638c1e8dac2fde2237f41eebcbea986c8629e3c1c43ac46abd18e3941fb8b15754f0682d96250597372c066714a066d1866bc6afe583e1d796abcc657858d2ecf51c6e6b89e0cd3f903a6eb41c4d639f8f96a2775ed8efc71c5e4a4bb62d7b02e882c9de13fd9599d791b0394f6c3f24f65d0fae9cc43ea7b292f59d75a10a3793a5d2eba0d61f2471e4638d2a673a107f0186bc2bb06f07fe0c56f1234e00f98b08421adcf49a6df385011639d8e4e07e3670268837f156530cd6ed3baf1fd7232c7ff204f3c7d4d106016afa3bdff3786e84843ec556115626fdc84b2e874f1074e4f7d53e08079ee9fd01f80a8be7f20c0c4bbbd31dc77bdd5438ce5707dfc7942992ba4ddb64c1935c619fbf692c7fb1aff39c0ba8f748b242a531b2f1f7bcecb66920adc28acdb498006dd4f84f75d1c7f23bb9981f212871a411bcd62574f103c1a4c85dc827a03874fee5d9af78feecee37775bada9c249abeaff34e76443aa62b347fdcb73f8c625af6c5deafd9b974dfbcf743156f2332329d49ecc1f570292d88733031720c9991bd32580882a5f78151c7238ad3ad6a05ae764320a9db4f881108deda5baab55b0a4a0fe8d4d9e130008c622012eacb9faa235b7caaa39fa497e7f099428f3d1fa7b50b39157eb9538fee09c17301dc6859f73dbb3eefa1eae2b76d556ee3b9475a1c54e18ebb0854c7971f543d1a25c9839bf0c7aee7dec0b9215ef828cdb23aec27f3ca87b9559a702cacc0b95f2f28efb67c8642b5dd8fe5cdca69b875af60257defda479f288d5258b9ef2ff681ee66f1eae2417e26c02f62b99066043821ccc750fb1896099534c14cc8e607a484b0f441c2f56d42b95c8934557aa2d5e5abac1e1440c6811ae00f703328bb1e509566890da4a7b8e437e941a03b760f1488d5620c085617841ceb2a183b3979bcddefcbad975710a8872beb59f2a96d162ce924cdb86f543bb1fd845f68aa3c2f4f380e8916a3d36c13f63768e76278535f916a3e9838bfa767ec85f1f736f011b4e95a8968b3889aa4f3 -MD = a44335bfa12a61f8971109350e6ffc62c1237f3f662b7ec27b520370 - -Len = 16352 -Msg = aaf94b876975eaad2ad5223b24420b374cae59d2265cd604dba310708def4e8de708c907f897196341e6eee30ce700a90078491ef3e57195ffae8a2cd88bfdf35caec4516c48daa3fb4ef025647d6216019c6917f90192d559566fe7679d8cfa3372a42b6e9015b47f9792cbd40d18c776a22385e1b8210a12222769e12ce3e791dcd25ea678b2dff6483b9b039d0a048813de2f5212067d519b1a7aef41ea05a075b4b2bb079a6c88ea525f9a3820155f7501def51829763f47b0e239e3899b88c4b3ee5646b3a35c0441dd40e342412253f65a72d1733c04b05268661aa8f0715238dc1e3be6cb9b1e6fde9ea858d1fa32246b7046ca19c75e66d61eee2f4d82a5a942bcf01c2e6cc144295c8e4a0d0e9cf3d9977d1853b0d856f20b6806fae3476fe9d76d3b12f8732888219d003d8718cb6b90804333e9a68885d38f153fbdc0f39918b82cc067bf83c195de62a98c2f14ea03573401975066561e6c456438969c1926dbd880e02abd9d615859994667361f9708d405e55e562f95057cb07b53d133abde269a8b3e3ee42d14cb54dc4b99cff59d0a87f959c2d6df64a36caf7efcad4cc7fd5591826f5ea018a2237760a6c5c51dbdcefbc91114a591a3e1fba08450b3a047fa1a7eb6d2636ec44e3f30c3c8ae91d7231434abb18f9262548840d1e48871ebd14dbb7c0a1e1e1b1d5b42599f58003fce6b24f8754471ca107de64b317240d12253c02acc782e8dd7f41ed1136c72dd172a2060286d36c25c031b5afe1a17e135541526e119a804c6314d91ec92f0994576b14b91b1e7317f4265661528fd03517743da11aa9367303b5603f271805ba27a5d2179b98e01c2614fd73c43fb1fc0e4d1ac23d3f89e5e39c18eecb22d0b745baf4aa82d32196d895e153c13171dc8c44706e13bde9098541799a4fcfc9104442c2ee6b4dc61c8e11c88dd415be5b23f2e4f118b4d2726b4de8ee0f8f7d59a5b5e35fbf693c11a921098e675cf5fc67c0def7c6a4e4a4f80a1d4694e25c07ec8ccc8ae9c5f21adc3c2ae21567a744ba46c4eea81e7e15ce1e5d307a58e38f7b4fe4dc84e4869c79dbb30548d640a8bded3d4237822d595fe34f381a53b264e477d2e12b35781b148828848c2950acc53cbe9eef6070c4200159ca1f73373cca8d0d151749351b3eb9f1cc59c165d572adbf514a39d6fab0e11362d437e05b6007fa0503805c214ae9b5693c3eee9748c8c605e28ece61851af29ee3025c657761301d6a8b3ba1ebafd9d79e025986aa16592912dfc5ad0f077ddac672f9df633135eaa6ca72217374d58409bc4518390eef37859d6b11c14f1bb2f90a471da5e071e952be9e3484d14f1b09bd1fb0582afecda5581d544e5a6293e528d2c4c2077a95f8d7fe3f922d8cf91895780399e31e37ec805ac908a1d90a355f1b594a1ec67d03c730c72e1245aab0c5bc7670dfb412d5b6b20472cde592442d8f4fa08eec0afddcd45fab07dfac6cde7b8d7f6956fafb6ba18b3f272ea8ac14ad1c67e031cc61b9375dab76d17a973023bd08288d3cc80fa7b1a0560ad9c7950343f2ab5e3db9bcf865b207b191da7b5389cd95bd74c623333c58c30082413f105ae358b7db708885fc3103068ea110797812296e2f6036e27fcb06b65e836362c5bc60d522208c7e85ab1126cd8580040c886c25b930cb33f0799982bb28b25918e06c4cae44393096a2bab8eae25a81cb82c66aceb2408632d6e3fc248bac91d8f1c374ec463f4aa39a68334361f08119b3c0a3cc6f4777bb758e892726a27b6a531ef448b0df2b3104920c836ef2708b7e03673ec23076fed7e1c03fa4349451a6d721601eb960c373c0cb0773c0dea563e73b9255ac0271709627da7ef36b334f74a2aeea5e79ef6a8cf56c1afc39dbe7e48763841ab8c7d2043684013f6e63cf8feea1ae3ed4f95b5ef20dcf0500b37c93e12ee7fcf8467ec462c8e5a92c8799717bd4d4cb1085b8af6788fa6bc1a0b47dcf50fbd35f81c94f3315969114035fd1c0a4e883ab292506cc5a37910b4801faa8863a2e3d1e541d2df68eb7b35b651953be6409133802ed76ee11353c0e07a3031b1d7e3f50a1b6c9f8586d89146bc0bb7dd1cbc756d4dc1dd0e198d26717ff759c3033d4ed34948d776e2313b2b6605e6fbc3c55ea3d4b179f536c6ce7c5786695fcff7c387f4eef104a88d1bad760b3007deb3d869ec30aa5d1007a0482965c74ee31b3b7043e753f780f5191615a5fdcb148fca06bdc5d80d4f57841f1e1ddd57e6b0a0d45fba671711701dac6a5cb50d0e601bc36ef86bce9cbf62475e35124481bfd9fc6fef932c04060fb99eb7c096732eb5e82851cb689f4622091035cddc5b4fce309c0f41fd00bfd783d83f862eec027fbd125961a3fff4acad5ca578e61d6867b80ea1d853aea45d53417a709c21e361895597934764d1e87b6b0e7a2b6e128cdbec2dc0f6b6bc8a7001f2e4aab9d943961893ca1b78e6bebb65f83b73f75625e25e3b60aebf1044243f2f4b1e5dec0d2a84d66fe8e03a17b472e923855f3b1a158e54224371a674b523b70ec1b425a78ec1e7e87647d5d9afb86b9a2b4fca53bca1ff6d7c7688036cd614935b678bfa0af64e9f8d53c0eef46205082b6f0ab81fc2c5aa2273bed79180ce44b41d26ece54b94faf5ac023ccb9640d54e66033286172d3ffd134eda6c486b88937fff6669e9406375fba3ad7c7ca2695cddbda738c8bf95d5fb42f2445775c6c2341d51dcf8da41d7e8ac284e3eb52c1d7b41017efe031472d6a10963d5746807e58993879febfce11a24948b01018759e99626a0e182249c4a74060fe9eed52b3a4916b207fafc5c3a13db79f00de0d7cec400e698c32e1affc2d191bb6d75f6 -MD = d3b2c5168685d9419893d8bbad9c144bf4ad7b416cd5bd2c2d90a11b - -Len = 17144 -Msg = 098fff593ee4614b5cea6b1c5ec57f33602950074c6fa4d7b5e8599b0371a63ad147a4fd931d0d447c6c43789f0b944054ffbcf8dd94ab5f49ad898f9958f83322a599f432b9d134f61ecdff9b5dc33eb4cf7b2edcb00f119c75ef248f5f27d0c351e52463df358393a7109a9ce495954940969391ea565775e991402cb0bd7b7ef290776eb7c2991bb01432e8c791aedbfb140e436b0a989eb079ccb970429b1930a3d49a6affdf56e0e2adc82f40ef32a7fd863b5ab23bdd73afb17eca3c975db52522302075bb0ce081f5844428c115ed5ae5c2e0d7aafbda39d5c3e435d912261e4b7800aa960457f9f0642dd38d4d7532121e25004cc08c2122d0e6b4c8002e9636ba3328d907ee5388b013c9b9a3e68df59750b589f3326f7fecf942ccee7396cb3ee177eadd4d96a4af1d90afdce97376778a7fc95e7329d36145664da69d25f24b301d334e1bca2baa74b2d5c325ed7d04fae474c7f8590875f1a8b3ee554c932b4ba41a2200f707e93fb7951f4302f288c96ef2f7690605712590678f4312962458940920a6261fb4a72556b7eabbbd491ea5acb66d39b29d0ba7cf510e7fe37f80736711b25f5b53d4867f54c31ec690221008cbacf9f740c87454fb5e9b6384eacb9cbdcfa8a30ded617abe7536f6a4fc376f00cf4ebca3877f5e57dd6ffc7abf2310eca30bdf2c1b3faebda90833cfd5a24a1b7e40e90f6e51562b310297ab26042b66d68ff7f685a78319079e6657d5daffe560d866caa571a240025c1d5d48f555f2113cd3b45421619936ff78852366f8261e1d1b1c5567ac5ef98674d94c7ef65afc1b5cadaf35b007df334fa1e8ce9ba65f18f14fa6bcdb4cbd8786675b2776643e33782bbf6cd829a943d5f34b9b522ccccfceaabff796d4f767394e9d793dd97f8d1074ab4d41c73d36f0c2755484820d4c9c74c9a047bc4f2f77d839fbb380692f0dd19c6154ab42148a588e81986ec99741f6eb4055cd6ce6274b58364023a223558aba2e779c61e58afbbdaaf8b9a8b6a7784e5e28cff79431f021b04d88d271d2e72c3e136142b2d8f42a580b2b54b3b4411982288a97417c0fbdf34078a21f6a301b1991c38c825c8bfe12398b7295529b7534bdc6f5f6f2f0538783bbb93707acae45578ae85efe076161eaa3ad6568cc8afd4f4ab9bb7ada0cf27c19c1c090a40e4ccf7efd4da6b27acc8639aa2add1d7f6446df8a96fc1710be955a5fc3ed6062b6606674573cd272db751614ec9bd67df20a4d109161ed867235453d470628d309710cf484a8b07016200291b4893fab2d035cf4b38fa59697c3a40354c34489cf6c3626ddd2949d06edc4c9898fa0329f99d3de046f866ab4a93d59f20cfbab8fb8adb169a2c5213245266673954039d0357c758de9da27514ed8e52ac99762d2bd393f31018d232291ee0d7a8368e9473d1d6255e6e7f8f71a3f5203e25ed51fe3a1753bd532cb5f37e568a741606a8c1b7f4d644cf7032c753946863f992dfe92affd9108fd4270a1d31f01b870e327356adcc30550707bc78d69bac88f91f732297f3b8036b0dd3580da90cee07ca1f5a6ba79f73a6869780465a7668a2a932bd8a23f27253d2f5db3405d6cf75f80c2fa8d8e0cff1380f066df55ffd01f59e5840fa7e3120fed8036f96f7bfeb14f032ffe0b2ae69847987b82cd7caa99d2c9f56e7b9e44519f05cfaecfe13d9d93220db4f73b361f46d60af316c660c0843df266c13f0429ce5647078388fc48d6865c585a2638d20613dddd38c33abbf9aa459f83ae9abf01da65ab955683dd9f97e4913dd334d70eb8bae63c5d80b3b979b4c2c8d34e3cc0f9f3430c35198277bd6d08a72a7156e62b6ab6297b79cf4a100877999667c8931bb776f10c085fe560be64a013397817d6b5f607056e3836d90865fddf2f8a03a87bed4bc2969e71e8a04e3076d2642820624edee2a715053a7e35fc96ecab9708054f22410c64a3bddb6e603b8543a1703b65b7fc6c8f3d9d308e9ea3e752d8a41d457f70b2dc0447376b374a9a3d0b3006e4993a05ce6869e819ecee68a84ce28d776937cf2b1bef7ceebd8b5979edc78c728d84b9f90d066c7eed5fb7d57d2b1c8ce87eac7c701b719efbe70a20cf9d95b89ac2d239b5dc8464a9df1b00f3e8912d042d92f58c34df24f844f459391ae95ec8dc96b5e753fa732954de52347fb501c62dc7bef6a38e27bd8c604db4a64f0b1fbb4e962bd3955474a846f2ca5a50b13564930036cf465050a59624c7a99067a845410309c41caf92c19c083ddf2ae459bb40e3d51fcf47bb79de05fb8b741b6a63b9250a8e582b8c8927be13780a433b1a158e5afdf0b306ee8018d7b4c3cf6dfefc23b599117169e6313ad68cb975e26a592a4dd0733c37eec387e38c452abafc5326934d0e2931c200a40d820023569155de37ff1e8b5860f177a77cc2d5584706562a1319faed04dd2541c4a5f5a07951d39ff4ba48702b5012acea01784fc55dda0551f88ca49410e5f9b97092c70894300d160e1b88392980793fcbbaa860a0dba97074885e5ae10bbdc92ba3d328681e09cde4aaa771c3e996e4e8436afe1680a0d95596233d98bf155c9ccfcdc013c51c8102a0d5bb68748c3f20bc9d8908f271f3635dfc287c2b8ada8dbfbcb8de4ccd9a31a31aff5e49e2ba3bcd4ae8be58a4256686f000d674a3acc41ba8f811dca580395b7f25ee9120bc001d780380dbc1d925b808aeeec5e938098a9a67f49c2b9ce2720b166074cfac38552fc296a35176699c4b1a0c44e3e726b498efcfb5e754f48dc7b8fc1976f4ab1c770d47d7dc64fadac12c78191921e142ad77e94e61113657b9f40aa99dfb211b59ccdda0e80aa01972cd796d134f04dcdee88b90223c7175ebb3d14bcc2962fadce79e25ffd2230167e359685ad755293528fda3b13b6d9265db9a288ce635600946d38fa8234a3ba7575e3175239dd2b92087ae9678f2542d55ad67649a64f5e6d2c3056c65de6f3a12d1f1ec99a37e72b871d95a -MD = 9ed5ae504ccd18400fbb45cc91cc19c72fb530ccb323d1c945a94bcd - -Len = 17936 -Msg = 6821cbbdc2171d6b1060e4722cc4d583893334a4b164eae8f1bcd87d52716becccef709db77b2a9a8216a294a7a43f2bde4d966a922483919106791807c516f0ad86fb0c3e68da202b67d0a98f7ff62d651433c4f99154d79c505e289cba221273af13133f285587721a16b6cb9e21118550b0b9cef482417a602eb5f996b7db863060b8a201c256c1f91bc54349e960a5c8b851f995385893fe92c806a1fcd24fd18c054f3c49167fca88dddfc876a12f45f19562bc9ca250f43267ab251a7f345c3c022e20144e135604078762ef5c8a8f038cf1b1d6a91709b59dd068396a9e971ab628f74886e765384a23607c1a1e6e973f8fbb0ff55104c46f5db37f1cf64cce292307104762bfccae9b0a476153aa55b422246f0c67ae06e73a4e171ca2410063089a9217ec2b673bd7a875bc910ae4f593321d78bfcf240c4f8127f20c3f576dc0f6f681ed72b1fabf8231b04057ed0acb2e42c1c32fc5e68494d8279a0d7b4e3263650acd5c54f23ce0a1c7c85917f9b160056dda95927ec2ce5142b675150e452b073cf5b1f52b3409ed8891d80bcc2c0f8f066bca32dbef79bbcbc73dcdb6e395039ecb393fae91463e7b039c708b26840714e0974e05f5db3d4a352e4a4cf3e881b8b8bcd78239dfbc29876cef3c8608961da0c28e05ba3c0048671035db5c6dab13250168af161c8e19831230e934e164ab131399e228e62b4dc7ab3568086ca73678d1983e0e44ddd36154da9917579845a15418a42620e7dfbcc6f3fdde2c9da91bf40f360ba1d0e087fb955519b45b74b24bb2549b315c88ae2b16a1c6f7b6f57432769ff47990c75fcf0b24213ed4beaec110f97162b1cf05a0475da81319a1ed537582b11544104f97e10e183f2caefd7fda9b8ffb0f3c2aee2e386cc9f035ec1eb3e629bd1544c11dc21be4fd8ac9074ab742dd449d5883dd723afb61603adb5cd9d346b92bea1c2754546ec1179935ed4ff7438484aa7934bc6b3b23933721d58e51ef50ad8ac87e3fc09ed2faa5ed2e4bc1a905ebbb75bdb3d41557b1b426517b690ccbc3ad2dea2c675d7a5c7598d753a9f70dfb11dd3e007c7144e13952984822867297dab332c35291ff65929fae0eb615e5db361a804a6b38334c4f0d719c85438d4e99c220ab8823aa3c83687c25f0ebd5b5b2954b3aaa506c1a7dbfa61f982c641372c27a8d11fcc30ad05d083f5f6224ae0bb5667840a337724cd0fd7a65293f0cee1b0910f60292f602e51c050c601cf0cbe19bab3518dc7c43a83f55f4236561943595dd3e1f5e29a0677e1ffece03a37983b07b9296a262eaaf34574b001f3bec78e69bf13a71cb324df7343d9522ee9e026e925e07d349c94ea32974aab5c27f4dc3f3183b110340fe4fecd29bc1fac1c69d95a152b55b69eb557377076f1dd41af58dba0987f953e24ef1c4ca28ef6a37052f635f91c051f013dc5a01947574484510df8e1bd6f261bce81b099ef422bd6d06ad16aea009c3a30c277f6ef1e54078258fb114c2a6e3607ce03f6c316fc09fc2865f56221acecdace66843bab1695973d35abce4f6d003531a56dbcfdca8610cf722cf6e0b775b649da65cf75f2aafa3b27159656a906d15d13531f6eedd7c8c074762ad642813db562001d178ed415c35df346c8a8b666b0dc4b6cd2fc7b8e9beb65707ae48bfba18be7a708319d847638a9522df2ab6fdd7ebb47d26cedccb2457f6a36f3f25a8ec680efb08163c0b445bc3aff0d324723692712d5b5bb2dc421286aa32740e4ed806069a904b3551e03a083a45ef7a7233a1360657d400c11fd051437c514153e780aa77a2228bc14010aaeb67e77ea7d5004b30a1a38f25c3779d97d73d88611ebe42b7c60205026bc3f2ebdd21f9b62498f8d2c12e27ae37f1b3cecaa0a91d87a9168584536dbd693d28622f07b24a284f851540df8f048224db0fdee36d3129276e07657e899943649478e6007309ea0e3920a51d91d0acfa5d82996c9c450c219165f0e9223f00227e538973029b71be5e1c784ff3babe5a805086a4fe003980c8c8aefdff56a85e2d1ea0ca28a9c5453a3042df7e69bf2b8da12af35a0bb72a5b582522ea874400eaffb46caddbef8d15858934fa86b757cc9c0fc27a0d8e09923cdfc1a97adaeffd1e4cc159d8f67c3942d8b62fb8afc5856abc7724afc704b49d644005d67515aea4f031f449e2fced90b4cde5a8ad5d0032b97c219969020ba23a09c6441a5945b9282445d5bcf47897a7e1e3febc07841d8f3739727ceddd74eb82b46bd3a309847d0215258b4b237e385af261e1ab5b53c51233e309ac733aff1596f4a7db432e76332ce057eb366ef0a0da792631cbfbe373d9931627151dfc2936869fea3bde9c1f52af28bbf98e551b63ef92811d3e71c4f12bae460b456c255acac1b639bd752f4f3a07a3b307f134546b2d849943f86c4452d6f19cd9d673cb67172885f38bc9ea28fb8bae004c5177940020863300d39ab198101101c37a5106a92866a76657ec220d5b30a2ecdc9213123e2e350f61bbeffb8bb2e7baa2b34f7d9f26028c3f1ecf44fb82145b3b6e8f6cc7d772af7e6eb5074ac7b04353bbe99d730b2b87eb45d8a854ec7f21d8d3b114a1ca1167927cabc5359887e6f52f7d118e5e4adfc12ce4414cb50bc419892114b64f3bbf05ae783c356d922cf0d8b2dfd666891a2b9a9c18cc27dfce68578674ecad18403fcac575308df99cad7e3111356d0ec28f56a734bd8824c72c06893a2d2ecf71a99839760f41e5bf92e9a2af92b9015e5729af9d05210135cc5ed170601889dba9e27d49bbd17e1b08e0abbfd4938b77eadb595c8e3a9fa2b227071d6db46d04a86e38f61b85eb3a782df74be543d494b0344f783e1b26954529d24a3b4aa4760f05138316a455a448962c5aac11033d11fc39f9ff0bbd97ed2cdbfeb42255b9446fb6fa9678e3dfe2e4f3f5114540fb75fabee8b8548c2f12f7c941bf83a953b174c8628247be75acdff323fc26b55444f7874c513cbce51c53451b44b7c8cebcdcf2c4c15a0dee104ed5ec55fd87d2e6bb3c2db10c75417408f7952c04d9b2cf6edb273df9f9d074fa40580412e1fdc40e8493c20bdecc80de86b65db3048551f32b93dd6caaa542acdd70f2ade95c44b807876b83200da99d -MD = 491242cb9704f4776c51e53268c93bd4c3e6ddbdcf6e153091fb64dc - -Len = 18728 -Msg = 5a9725971f5bdda5936d9ebb8921015b8f9e1b967e2aaf764fa8a19a305eae20d7fc5bc817da2b55b18215376c6e35686813c294af1e407c0dfdf79c22a1a30bb5826da44be41a63f859831176884524742cb9e1306027c348193620cef4a70a9a324374e400129512fcce92cef697575cf3e8c52a78ca13a905486e5cdf22e32f12c67f09b77bb5a473e0ff9d4095c8c770388ac5ef9334d8c813cef5ea7c5f1b2ddc0fe390be8959c49fa30aefa6415eaa8f76284be9ed7c6a8188c19e1e4606886e6a9a1341dad6f9f5c53e8a3188c9a9d7d37c1733073df479e3e7826e609a2d65d955c86d6fc61ac9ac6099a067af75f6e7e8d8db4bc56de2288f1fd5757c23a7a43c38aa12cf2d02a199a45aa3b817d6fb9518487eb9dda6a0e3fbbc4c57721e1378ea6189993c8aec1134c7078d965d56ab5ee26bc44cac9008a089aed123b06e3166f89dcd4e48d5efd04f5ad6fa7542513311d98cc3dc432996a663923c47fc8e35d916136c24a45c015a633a4b0505af1e3d8fb9491e006c63793343c8ca06b8de6abc129d06a07f4e50eb6292f4e8eea7ce56f4e75a0ef9916ce68ccc21d4d7e9155773e9d612813f99baf6d72c3336562cf6e5a478b6f9a8e543145234ae12df41aedd587c42895c9d989d20942eaeb4bf3733886040942e4e138461ebdc9147558af9f3e178c02ec54dff7714217f48f0e1869bfbf4f1ad0e1e83022ea57da9bbb36fc1ebfc4d3c77a0c5e39453d09a25bb88e62f1939ac8d2cba3ce553fe8ddaf1e6ca8315590e1c5b976dfc0dca33c78edf70e5f993b43305d117f82c3b7c1a0c0717920d0c2d1d441c1b3497959a3f22334106da284c68706f9b4f795dfee3cb79affe2a8d20e024fdf725395857f43f2d62780520fc94373cd1d2818b999df7e49bb1b5056fcfc2e209b53b3cf34dad74da25c2a24c1f20e2c06a8eeed7b058f2e191f59ba351e87158cde468f5b433b1b1f359d6c571f40670fde6ae3f85b6498b88347843cd5c55ec567d04e5909b8cf0cc11e5eef27a53ea74d2f25982d991a07db8c3d7ade734cd364e3a4c48abac9e9733f74f0b7c6e35b89ae2ae1089732957cba5e85851b704579f30b1462cbac33c07337122c00259b086a7c5988d962d00b346fd366285979fb80e9cf1e55d68a2d5c2dba110b55f43de692680aea4b45fb8cd9eafe24791f8e0fd95b1a03e93b3e5cc15ee322f4e5be94f5a31b442c75c2463532b98a4f749612525ee23054f567e78a873ee192edff082e814671a6cdf3d2fa5124d45d37a81add3103759a173eaee1b960e1b08b63b2a58908ed4add04d5a1bccc9d12c7289bd287fa4e293f36f57f6c158dce3ca126d330cf31892179a0b3ec1d4f10b1bc17faba432492cbc56dbc25b9605c702bd7600f25c8c229d6d6b945a364d775c7019e4e5a93674b7e7a106cc8e3dbc46836b47a992db65480da2a7fdb68c781ddfb35babd05074cc69d24a7b092dcb7eae7591995dab6301c4d7ff131e5616465776995f704033e4269517d2ce7dfb9284bb642a84a525b1d832220534555ac01e89256751adb9e56413f338a7d4556b4e664bc4d170b23e92dc9a39c12e4b717c15872d3b400fb96c7369155adadfef539dcbcf0ab412923afdef198c8cf242bb424817f6a13c4686defed2b038a307dd896eb3f81b4e9318bca70c5f15551b2237ef8f49774876f97c3cd57196a99c3251bbd8634b6d2b73424c7900717ee5f81d04fcfe6b3c2f0f74aa87659bf7949b1f3aa713ec774195b765ca38497586861b0fc6db241f5b0eefd05053f097d960187486cfa775bcc4427b66cf4540e8145a9954a94bf9e13f143799053d9151c966f0de60246e86490b15b58d0ce9f1e90229102f87d3a9ea0c66c84129ebe61e3136188f0a6a866c3bbb1f3a47788b4f3a48613781b49b57fee547d05caf7fa6a0cf9a220171a474faf60c9d9df39d8c2a7daf87e0a49fcd133d7c7a7fe503aadc42cee1b38cc8ab6f4ce47fb7640fe9fb5063e94dab9d9673f5d1063a935c720d171b96c5c2da57c3470fa83cd2c9aed549e32270d27df84595ac3e34c3714659d7e807e21cc2c11d6ff5e0d546b223dff198fdf020273cb2a677e8167c2a6eeb099ffdb0a06831a64bffef2ac7b49042cfea41769e83a9e1af99cd87c76f31e935a740d758b5ee8663939ce25db63c256c42b5a9527a89fa387ab530ab28d97ce46898004c8f42e43f1bb0a610a170b14e06233246f22227c98268b8303daccb9c4acdd383e073e868fdf41de95b740effa051b882d4be8eeb19adc95e96f3ffe8b5a6f7058ecabc65a32df0efcd9063077607e40c09a35725a74d083e1cf53f4d11ed15da828f85be7326c62bdf0cd8ecf20f5eee7819ab0094111fd7b5fcb455c668d40ba50a6efcd7a648a37a2f97387a30cd30086ab20348beb6314a4e85873ce0dd9ede839ca636741e618442c5727831d9d8a3dc93b62c1f7455c434db6bdb1cd79e14413a44f759ef6de78d8d2353db2bf030b977a1a6fb024a09f6de8a0ce66b10318d6e5e841d63cd895815d273f66b7f9647854d1f19071803dcb56b350441fe1caf607d4488238b54eb8507404a418ebfcfe64100422cc8982e8997c03f006fbdef3a289f61d7af2e8d064b229e53249298c105af3e1961b2338194135f506cfc9421e8fd72273f0188c02481bb4c49f7ec3f2296d575eb3834c6ec982cdbfcc1e83f44c681b945b422da1dc56ad205d611881f1bcfe96f12797f26b56e4627f431bcc4625738c82fa47cbb56718d611750c384a8f31cf3284ad5cbd4ec3cf57db8c0f03abc4ad15a56d0889c982764a3f118daa40ab78262eff0625c6f636f44c57251b47897671d7ffb0b00a94517603cb0a777dc6121a8aff773b5bf639c32a0fa6e3952c892606828cce86a92803779b3768831c3dae2d4138746a4e5852d9081cf3213855a0b5a7d54bda5b3a910ef49cc41d184b4f8a46b2579e691301ede2ffd058375c8069b222ae820539ad4e7983309844db8d26828d5b54c0ea7eed32b7f1c6a41e3397340d6cfa4185a69a9cb324811c6ec5867711f639f05f283b59edddd9091b48c2cffe1dcf8aaf0b97d08526741965a73eb6f8ce9a71d17c7ccafa0b2bd0b41e80d86d276e6b267abab7719ccdc660a093a49a3b02cff20a162874f02b85a94335dfe310434d8c4267a4211e0aadd02039d28ec20f65214f8bd4d72344a24b557658e87f0abc31114348ec20b72a44c4a5c34f0a1ccbffcb6262a92b23b12aa3a6d5f5aa1131c565c1f86b3b6fe62f0c5bf94 -MD = f33b1abef61613d17ecba21d6a92116261003daea6ed288a456ad012 - -Len = 19520 -Msg = c7d75b676a1e38fc653cf9acc416bba938b04a2a76fc9cd3daf09e7150db34eb74f97a76f8455107468e170e67cdb56124b6df766b8d97d6f43bf3ce23a12168312ca89a87aaf0bc6a5c053fdd4c989dc3e0478c45b01e7773955d2e2e027bdd45986c3bdef4200318cc4ca8ee3a6c455f5709d2cb0c379ea12563f937a74b31f9644ec1c6cce6c4970673b062403a403e43adb2c74aed33c4148d980738994e95b9d69407da4ce7303302be00050978a8cbbb93ff11451e25896371665c6b1b61be8d1c69c559552b7b813c9132e1d4e717bcdd3d0a49470cad6eed1cbbcb80a49cfac1b43615f4d0057991dd6eca3c425038f747dd0097c0a83574f0fec065a87aa6ecafd489ad66fa7225ac62cd98009eb54be53172f48ba1406fabcd52b2b38117032348bc693781f260c6b5f1d06a28bd40e1aea847b3c0184415cf8a4f0ed8d770d839b60e89c383aaf3103fcdc817d73e02fda979812f445df6ad6f2501a96e9996508085a5e8ac6bfa1bbd7562928cad0fc67d703d134c20160f0a1ad31962e8253521b7d317f60ba47d75b17fc262f6d1b02d162f97b9f73d9b6117ce523dc34c8fa18b5b78e7f2b9df6f6a68cfe37f1064c0529fe0124932fc7f05387c8694d40609e88434098801e8b28666e097b1938a3e0bd419df7ebed869ca5abec6c2864360b89773e436434146efbf1d05f424c9b02b1768a9fea9d829507c4184b528eeaee2dc5cfe624991338bbbafb5b189c91d99b0f5f630bba3c57de62d48d582affc4e9b18e176d9818144a4be2f4e8b338d3de7e9517ebbe2483bdfa99b8a5e2c51e41cce15d8bcb93900c071fc35f2af08ff036c3f4f733cb771b0dd033c8210b58ca6a720f2bae063a959f1a3cc86e497c74ea54a0ca95a1c07a2f20a53b701302e83cb8c2a9a9e0526b566ac7d0f7b417d0ebdf91b26e37ee4fb103837c5a7cbb2f961e1ea269d295f1cf7a0af541b0f098cdcd4e5b280e6f2035e145074ac8d005192a5992482d63cd8cc05c91e6d0753102864d214d95b18040526078cb57f00d385629e5df815a5300e663535193444e2cc304b1695e53e442df6c2d46da79bc6639f6399a5ed826be5485a61c69bc249eec1b67e5c8c4c0cfc0dea15790fb77453e54f9f3166bbd27835a06a1c46b68fb79d7c15d8592ba49df2e81784bf3d237ebbca39458838adf0b46f17c53c09fa4e4e06a3af53c154362d22a234bd161c0ba93c2d895ce244744e2f316685a1d3db5cbbf08983f764f047027e311328a723370d44a4e99fde2d894880aa2a6861884d02c30fefb61bf2c7ef7224c95d0beeeea6463f3758c443f023cc363245ee7bab45e6e8a1e4c365355148b5e59c9293556dfb014ff63fdd0826ddb5a51fc0dcfdeb1fbda16aa2701a8fc68b71cc823bf5cb2b93385f95235bba7bcd8be020d4cc5c3736f531003cfc13b54f74d7240d54299d9cfa7d0e3e70486d26ed6f568b9ffff6faa72027f06644dca8f7a4c032fced1ac59e36f456cf367c69d2b4aa28fe3e23b2bf1e5eb5dd8a053f011b9ed175816ab62b748d9201ed703e439764d3718088054315ecb3eb4df6bb9a240513454b5516a91e231b8dd6114c4700cbb6812eeb9c3dec1a1117f578c6caa73f20f6b5a38d211cfc19fb58263ce6d728f6b5ae151eb48b30f8e9ea53059a8c921f10251bc59a5660b3d4da79b52804c3be9669ce34b1da768fea954f2211bb4738190586631cb399119ec6d060166fe434abc7dd863bc033ffa15c34c5381da5959bbcac12af1eee5ce483f4e5b701d3807c310cbb5a28b16f97a8c9951598f65b1db255785c7ca6bc2b79adeb14a0d7cb910d217c16f7360852e2d73bb31580b5284f493d2ab60a58fd10c21a33353a3d73c4e57078160bf15c70265e177d8dc943fb4f0a22b46259e1b0fd1c1ea942fda9bf2040876d78533dbc7ea74bb663bff61e31874a5ef6e660c12496dde23834bb659a934ce4c4567b2ca7be56aa4ac0c920b55bac9c0d2801ab003376ca6409321d1a12cd643921a02a684a403f8cf44569a42e5057f0474cd65998f3480da594516a6514d31ddd341d8bf4115f7082f161c5aa3c75e86ac9abf7705b437c2f6c685033291bb9b1bd6dd663d2f13d925571e2757ae03bb90190a161b7a5fad03fca9524122255c6c581123f8bdd3c4efaffc137127e315d7bee21130e55cdb097de01e1d9d23944d3c30732420bb5dc67752b990a39147ebf2e3d30683b3df6fb0e5b128611ac52709a7ce20163ef642439e8426cf82a4356b6be5dce3f94cbf4c26d5f1fc9f718226e3af7cfcc340fbab5c0dc40a3bdd5c7f06b44464918560960fd6eaee163bf74a80a1ab531ca04b04f7b0c8c21135c9a420e8ddb4113c0c251d4ea3a41366febaeb2f3b977fa6c8e71e07c5a5c74ff58166de0920fcb30a7fdba79ccd1b84f11e9fa29e6870c6fdd82b9d4b13b2ae688d352e3759b89cf41cc76c36b7933886dc1ac654149483424eaccbb9aa67c3ab2e183418bcd94c41727d2711f21ed41879f8e4ed4a5f6e4eb10e2da1b85b1235ea8c8a0dc8e3638b174942bf0b12fa3e8e96a8da6845da6bb5ec2d93fc012c81590eba971c4b553981c8598e71141d6170906c9bfccc6a31a3b365f0b40e7525e01b20351595a3c53886d610b296b019c652aab28677903930f041489eb78e8c263e75684336d1c6a1f142e65e1f54d0067a0dae83bbeedab43f5a2c0aa0cb3c81e504c133c361a664841a6fb2226e1ca752fff0732dd89ec3dd1aeb866ecdbf89ab68b055afc5fce6dbe71d7d248e682f99ec28e331d00dd6660e37a056187da3fe0bb627709132af5513801dba183b15ab6ca8425c87a062669e60d71b1dff7769885337aa35c0348c3a37f237ae1de003fc0f1f2241ef0e6b6627990240cd6a5a4917f4b1365dfcedb595b941a279153014bdd817a15220c0dfdc74c0436ff36cd864ed2a15449ef63039d15cb7e52bbc31451ba11872402375ffe8b9784fb8fdb0ca8f79452c61321484b8dd30eaaa04fc35485339b7f2efc312637271f511a96cd96a23686e0a2dfd16fe67bfe206a6bffefca2679bafa231b4837fa2f893dc66e1fbbcd191e04634510070b773d81e0702971334a5dcd76c46a7358db2c62329a4c2aa23208a1754d37d8cba0874d75bf0a62a236f10ebbd597d38b4bc1f0a3f724d7fdfa27e1df91eb4102a28837f4949a86bb64fd27bbf5d43fdaa8d04fe12dafaa2599022d68b8342afaa4c8a52396e2c3c6fd097f3ecd2b9f8c1ae1e6b4e5f58c643622ebd76b1a7bf9cfce00cc6ee9020a289d7e0c05a3dbeac87d1fe4c7ff6300f90d85f551a61c484a22b1b5c4b72cd00e428cec4444db3cdb2b61387ad419420b4d618a13dff52f3e4c1ea73f552760d67f11a7321788ca7a741579a77c9472946ae95e58ceeff5d3d4b16987cadd -MD = 450587633e9d302f910baae17d3704c5c570a4990b894df1bcbf92c6 - -Len = 20312 -Msg = 729a8e1c242642376db87cf530bfc351c82f0511361cdbf87e870f3e4e785c3de14d746d235148921690833474ea575096677d4d94ca7731ae691915ea3b47d7ff33000e72cc9c43ffe6515e3ad0fc5e76a61e4de6dd2573021ceecb2c4d87b394f539e759c0c6b0f161ef59ca9839e33194f1fa747c6e27434996465cd6a43b683a28e11f554e43b3a9640f6c6b97478fdafd3a85d0d9b339971a70c2fd24d542abd3e20eb2bd630f67b86668719df258204bf66201ee80acaf812fa6eb91ebebef44d36c009b77cb43f44805d1d34d540de117543635f66438d36d4fc872e42caf839d82666ee9b0e41f9c8cb4c1be4b4ac983a197377d28db181106bb5028cb939626980dc02086f3414a4541f0ae047f0b24914d7b7ec240590313ecb21f90428758f61d18841517633978a1e7864853ade06e80895ff80e9e2bbe84203145655e1ae3bdff7d24f98b536dfb2eacdf6eb9a17e57ea8a93eded714fab22c6b0a32153a915fc737d40c47f6c784e8a9179364e0bfb25655b8750bd0d8841469ba5daed8e4e97cee69513a5bc40ce86261c2dcf5b94c25a1781cef741440419cc1390cfdb9058f628a082aea67a360a65fea50cb6494ad091866f073306f4a70b944ce1d702c8540b081880724f0f7d17c8a6ec6642442f8f3c3cd52bf7975822d0150bcccd6e4e5676dd0468e6df470421395ab2a838deda4b3c49713f7895d770f3350018d24dd391da22cf6831d0f4b2643be1a3ae473a5c784c4c051cc4f41cee47bc0c7dba480216c3f1fc8a7faf2331783c5a2fd17617f6c406710d4f3f7b0f2948d1f6fb7e7099cd14cb74befc1ba8f90bf642e45823c09be5add29c81365dc4ec8ec57a3d846c2a81fc76f5a542d0a6969e70e8a629deb732def31581f4e0fef06c739d4ce696c080b8198a7041b167247b404529d05602342ff820095ea1c09b9287ce753d1f795827e3e626c05325feb53a64a9c1326235c66a27df1ca7f3372889747e31103b53705e718f66bfc66d73e6abeea37ac17bcbd191ccd5fb7d0a5802f6306c70f0b7bc129372dcfc34b7ddcd83bf1f34064f67b3c69831a3485d4879be5393477fcd3286b598ca1255241c7655e5dd6a19f9c19a2e0bdaa93a77207633af519ed0ddfb423dcad60a13fe586987298423e2c1030d31ed75143da20981bd0b4b7ccb2f3ece95ceabeb558bb82f8351bc6848ef52953705aded38242b23c4312ce9580a24b3236cefbd0215654faf252f4036cad9b9a81c273b1246ade3b0e79aed5fb8d578516e4b8804e28751756f83b3919bbd01ecfa8e06b550b74aeaf63d91c87f78a5869a6655423a45be3cf560c942aa29f56b678857088a73dfd826bfdc7ba835c229bae92ba467c71d6b806f8b313f431e8d2bbd35f33b072ae33ec5d7607a3558a4947b1312b036f66cd8570046a23303bb0dd7a85ead9bb37308fa88603fa0ee5ef1c514745cbad2a6c5c1306a1a222c5bd77bb831265803f14a03f9613d9e0dbf986e36b2b47a37810f552483f13822d74f536e54ef65a1c3cd8b324cbe553c2f531f81b5009fb0657dbae37a6d9c6c953e07d1b050eb15535938390a08f00316e880fe638850c2bad9997538d77792ff6b3fe92b9012e808b6b218826395eadc2038b4a593b6f7e8e999e3a477f01d7ba0a2bfaef901a149aba2d79b196d7ae9c3f0ac646af8d657766334a594309473a3d85a22d1e1c88001b07c3f719f3aa6994fec865640e770479e7025775e7f4e3d8ac36d61d9e51480831155b253b37969fe7ef49db3b39926f3a00b69a3677436600079f112816df0c49dc425b36bcbfda46997877bc13bd90acb3fb027d24d56011b2cc9b423f3191a297612e4ec051beab6565ec099bf298af9a894114b4165161b7030e6540ec32ebc52c111be8d8c786c1868a9c48bde1c32305f8957b82a46092c70d09b26b5a85e40796067cd18f593c7ef5fc909c0677fbe57b9801a6e3aec48cf9b80a3b82f172883f9712b860a344a390a30a09614e73bc6c74dcff999ccab966f8bed946bf0f227056411a05e56898ed082b72aca738df2db463f930cb23f0c73456c1105f087adacc6e62c9a016c38dc46b842322a9d241ef4d2043ba4eb7bd03588f6a520cd5d152112f3653ddb7e54040aa7f31453a3b7def113cdad9729ade4aa0df286ad7f69fcfdbd6813bea761451521b63997b9cf8d028a6bd22b5f33d8381c952c0f5acfe00f524a8afdfc2a8f417823a252ac8e876f2fbc1d90658a9b9cec351adc377054b079b4ab80c5d86df673e1566ac51b569ecb6995ac83d9b53c457b57fa5e74e048fc4e7d2f4a92649cdb995dc94c9f81f9251942680148ac82ef0feb5317020c3fa1bf08f3d281fe9b78f2c055894191e607752dad26010ad5b198deceaa4261fd31b054b2a6ccc25b129586f8c32a0dcf37245d613c29569c54bf38525e5d66ea73c86a560f9d38457129b79944817d1b7ecfda6d89eb1941a12b02c97d7ba46e31b051c55319e9bf5c575c20526f6a32a41eadba566dda2b5d84441a4dc3a1f2310f11e9ba6a5c329dc77b74361c5b7c71b8dd2fead721c25374042d175ee7dc3c8eb3a88eb81907fa201f7f38afd861ad4672b38f52776e4aa14cea2274fe961ad53dec152aa9a43c0b4d289f5169491f6f75308b06629709b32339b82c6c86938bba9c99e993732b2f0f57b529979c90dced8d271a6ca5595392021faebb166f582fa0601c5fda8e356cf4c060e9c2c835e2b2abb61d0002299f2da02372ad75e6a6e0b2ec96432ec46de8091de8238f215d875f04fc10ccdc55a283b31ab26eda2643d981bf15d4851819d8891a27ad4864f38a29913e7f15b94910853a8f23dfb8b31c0262b8461f777075cc0937e95302e1765064f0e27bd50a8fc25aab599b6318c29808944d3b92d5270d3db90cea3c36699ffe8fbeb7b0ce4791036edbb62f58146a3811b0816f3137743d17deb41cdbac3ee684db70527b811bbb4070d9245c5aa17a973998186aed2a91b7275aa9b88756a436014fc4fb85870d89dfac4b0cdc64568eae29956a9157c103af83ebb5410fc10cf8fb0d349bfe7eb1f1d6ab50e1dc555ed8dbec176b2255613ed8ebbb2490c470871d35100ba898206e004c11b330fe6f7f57275bc3b4d63b9b01b0b0760235c9785d45761cace23f1ed137359889d9296b454e1de035ccf88fa5427e808c9d7e9162444d1733e474c8f273a6d90f6ff5634b67450bccbd00e26caa0b8a5782f99bd53a7f44642728360a084abde9473930147cba8ca133bb5c00ef41dc8b6fa15d5d2ff3eb6832c42ec2ff0b8e40ea5e9a469466abddb591c4061906bd4fe9dea1a32c9154668dae79c25fd0923bdecd698ab830b0a8cceae429314477cb7a182d4f3841c787c150dfb130801303aded6587ef00e229fe2e820f3ee25028a9b7ca085ceb8bf3551127377b0557bfde2556e641be8a89d6c5676048c8918efe2340769f77e9d1d1581bfd4746a798fadf034eb652f0efd9175bc558de812402c5574209cd2949be8f81ab9c2b4ab68882356857a55c84918c26e5740c6a133c03d714a2 -MD = 1fff3932e74bc6a0ef9f7e994889bf7cb3af3b892af186983f4b0b1e - -Len = 21104 -Msg = 8756a342c15fa13c38118db26afc86d419edf8f0acbf1ee6d374c6dc6a855532a0750ab858ac871fcf838dae7f9c073644744a48be3b9ba5f6e3f1f64477fdbe70ae688c17c05c75507845c1908ad9e5cb2856b2dcd00acb2768195c7d8c7b0940274425c740282503173e54637104c8f630a494d026753fae2bc575dd6dd6fd570826eb30d7f3173089ffcdc2f791c60cb4bc5760e6e3e9d3557da92bc21681ff7a9646192bc6331ff5109673c487c957de276455b85db1de0eca603132447c7ea51d9e4be4a8611884fa153e81eeb81dd46c227643ea7f167d3202b56666d81db0425b8faba289625e44b4edd6ce7aa7be13f88d30923bc4cb3ff78006877c24c38ee5ab28bb9346aa76da466a30f93dc5a45060265dcd301f79a85ab9ac50db0888a56702fb670c9119ee13e61b1c2711a891b9ce541da2a2677b0a27df3c89a4b8018de16aedfc3ab45a1af198cbacc9a7225ed07e14627c91d95af9272878c2a662e36f110e5dcdcf852434aeee1515276d17d3e498b7d47f2b10d78dfcee88db313351f7b07974f2d7f857656eaa1eb2d9ae7f8c92ebd2bad7f56817a0341eded4433224bc9655a6b86001c531b30ccfcee97e80eb44a0c947d155cffc92ad37b5dbb8a11bfd98729022dad720780707b49275c8890b6334e16c45bdf94f5d6f3ac58b75b3f666dfc7078ba2234136e0f46f0f6a568746840f8de1e87db5550dcdc854a86ec8e774c5d7bc2e2355c1e4f449f27039026e4038fed158710abe99d5abbb4333bd42b9f35a148406fdd19b1de7c6e119c206f0c385bc15be97bf9bba37674de91ba036b7573cabb6818e8cd71334c6e010341c1aeb4b284aa4819ce33401ce7a2b28747a98dcab19291f3f8b93e3267534204da4f72598ff792c24ba6a30cfcd3503faa5e39b8d193cac3c9f307d09c076f40ac973f26dc45de7b9a6a09d56ca8158509e0121589d045f0c7db2a778a91ed5dcf1255caf809adae50fa0f06e595650ffcfba17148cc75e368be10b791873ed4a84d709671d762e2f5d30d01c62fe138e9ed525cad0ced14233855117f5be64dcea4fa19d823a0b1ff919e56acdbfc885751cf2815061e1b8dc6521572847621a8c56cd57972d983e4922d85f82e2976dbb552741f4c8b521ed4a214399560e8dd0b3359f4499fe13b61551036aaea9ccd8496b12a44a7705d0fcfce2313390bc1f30807c71c46427a9b9f75f6b6d262d34c067fd48304ceaec43583cd626112fe29356f706f7f30088d5737a6e6536153782c309c8c35e5aa9e7de5a7176b96f7fa56116eb7ad328bc326c5d5ce0ff0e4956263f0c48d5dc6faf3543eb6caf03602e46e309952b27ae988b0e1b24ac9fd20538a5fd0ad9f9a66405ff2a501c73ebf6b06646902383c5ce7897957963513a58a24681509037b6cef897186a27488ac445a68bb2e5c6689edaffb0294caae9140c278161252108b5b4129c01f909a461adabc145967701ce5a4f567b913447041d52e686be3c02e1e1789d5eb93ea096917dce8f611ff7279f8e6eb65777bdef7ece960784120d1a28d205ca9070e82999259cd96c45b27152c4e023c9fab19cd7a37b2c9e2a92273127bb8ba626e3e26caa116adf719a741afa940a0c458cd4cfda7c3d340cf7d1a37fa7e922e8f98bb314178ce32c17f7a03771b34be0b75f0e7980817041a6e026e2b12e2c3e92ea156b9585a0fc91c48b836165ac5498053d8b71417850051c6459c1a0eeb116c93bb8729e3d6c70a184e64c695727998e041536c574c17e4c02ebbf898dc8edeecc03981fe2011c573369180875e421c10a21b7558d1d773aaba1932f340c80217152ee50b945fdae3f13ae872e109767f8b6dc39eaea5aac058125db0903352cd2af5c78e7bf7b6d51edf631a935654875dd8db8b5b38e6bb8965dd4343775d69621cae197f7ff5e10fdd84d0fdaf22c2a9db21b13fd7b3f6de52464de30a9e666b120d1ef76ef47254d3d228788a6dbbefe33ab2e5289efcc7860d12f743725e965469117c3b5f137e50bf93ac6e91cda08f8ad2e3920457c56fb644e8d895bc84725693866b724efcb2c1a501c23b926c4e96c3b3ba8072687db656403054faa5fa3a07ae85fa7f50986cdf012bc784939ef2f7bdf89fe7114ea1c985c15cb38b3a98004d01444f0a7035a42311c22ec6ff03d19ad2bf206040ed0132220951a4e204fffa63dc188ab8a086f00ac7fb66fd5df3b2df7ab8c5f31cbfcdc8e76f735ee5692f344e7661f02219f08d2565040875d0ae853f0ac2d3a537c13c6367772fddde63d907e320a55ebf9cff77061eaedffad65a88a0e7711b1bb4e329d430b332c220f894e93756aafa6df84969276ee0d4c2c5f4259459e2de0153973030b7a8a6fee971e326729b4cec0df8e8beb74ce11c6dede359dc90e14f0437f5e77b941f56422b8b7e87a4497f87220f351668b22ba8f264c897a9e7e68b88afd59d897dbf892e2c90045a52c11a41673b1ab8ca790d9e4431099234704015c88b8bed54a334f6510b87220b393dc37b2122d19c9d123dec53a0ee6964d84bda69d5542699bc1093617e9fd5504844a597cd37aaf04d7dd7810c12f94caaa75ff0f842861ba5195e026938439ee03180ff785f683b15ca904999a466803db4b3c1633cd591865d3b8ec56fd88d8c1697d8c2bd66a601a0a12de82723c80800905ba4a7a7a3b678966711baf694b26044a42ae638e9a79c84ae55ffc35caff750104b277ecadbd8092bdcbe305ce9ab31f22f4e217e6e1aa53b81b2c7d68c258d9fb510cd6f6d180e3d94ce183e9853ca432e69e2dcdba7ad65f9c4a3ce22f7935a81081609c095101cc88f10c244f68807c6cdef6d66cfe7ae0cc9e99c1b0a2bb11d71db429cfba959e655bc80860ff5c086fe99d895fffe8459170bd8bac9916408f2af7258a844757cd66de1c20c9dfdcd508486efb44c796d507d0cb8b27ec3d1eee5416a177be00a75b77e8f88eb2028883200ea997c0d97facf906b414e60e6eb2f1867e5ba3a1db82baf54e157c826ea24cf0cfbe7b1877a760c69128abbd66bdf6fc88f89d405023d0ca8b27e66271adf49cd7829f5aa5402e92892be452ed598c01271655e7f086e0f0188c98ac78eb429b27abd4a8f1bf8bf304e438d3edccdb1cc37c729da2f313ed5b0c39686aa55c742901c409436b9e706a1c504a4d5f0ad5c4f39d6b4eb1914bbe6e719c31236aaf434c1585838d9091249bd3bef55a41b493437e57dc098191a87cea52b4ad95d5df536f24996d88de98296a38cc05aa429634bc6c35430b4881fc4991db8b046d64df7bef6d53afe02f8ebdbfbca76a06368d00af3fa759f7b0b739628e04e1ff3ab8e0ede7872d1e5191735bad8aac88db18f12ae37c90269f7560cbb5615113c9a64726f050292067fc341485f49651ee9b38e40a0cdb5eb5fe66d738eb7e32787158a36ef8cb6fd795aaf32d2e50e8d5df7ce59a9d60255a19f48bffe790e3b1e0ba6b4bc53d920b257bff8d8003d5faac66367d784706f690b2f1f3a0afafdcbc16866d00a41169734f418d31d7a1c3ca9ede99e5b986f1294710fa5d011d5fcd13fdbef02b755b49cfbf168bf3d39a00cbe5d82bde2fb4ad5cf0fd65b1b5a3db5ad724dff745486da2830ed480f3e61795542094dd88a5e3989ae501e5ff10ae921c8913330998a871955f55a58a0fd8a6325b66de192d95a4 -MD = 3bce1c957e773813765d44d218a7c14dc9d03a57489ad36331b5c90b - -Len = 21896 -Msg = 506f894899eb517c95709b5525a77b65274bd2d8a68b22fa4db0a0f922ff8beb71e1bd120541805f9e36a236a0e2cc71099a0fa7a546c0ae850b865ead28b1980d1ecd87b31477263e79700396ebf042da583de49a637b4a4709c6f4e7847e8f0d6fe22f092ce1d95c832c446f8b90e084ce8318eca8fdd47af0894339da9bd75a1c24917050647ee09aff82928a5454ed440aca03deeb570809f6d209f4af78da6dba35514aa81fb107114369b0e3a5ff01f98247cdf0d8d89c3629c098637b77aacda312e056c3b91289125bc5e6dba04f79c9203cb261d2f170d0c78f5fe7181a84641ddb1673df029074d09004ffba74b225f6f4d9f9de4fcd5084a14ac4a50608ffd8028f360b214df330dae61834b9cb2131be0ea9e400752f6195cd1b05b680fcad1f6a1425b5e916e46b332ef666ed423960f978cc4a8ff8c5358ff3227215e403f84e1516078b65520b944ae8c33f1276a2416e7e76433018473954e382ef3d4157e442c45f5c69e382b172f218ea18514e8e93e3cbbb61c1947246302d3592d102d4a2180584a9ff9731b1fcac15dc302a8af0e1931c122ae4e3d2f1bd10681ac1c53dfa402aae0f14bd0ceec8e9e77c00db8c611491ccbaff33ff0e78a749845e601c535976fe79bffc8db0b48ec09e96296f4c983f16d9ac0bd670a723bc779f4c4609989123a760973b2ab82beffcb41da288655178efb5135dfd91ab4a5b4e31c30645a3a5ffc1351e451ce8fd00245e2cffc3ed7a64e0f29e9e8068799831b99c30a8d30aeba97f3fe727ee7111ad951597fc3ca5a1f651a13cba81d496118ad871094adcd2df1ca5f92265d396166a663a5765800cbed76cbd881fe0beb54c7fb0af30a21c2cb558645575acf9288426cf1b90940e022d090b326a2776e7a89ad5e3ace53058f2610e084482a1ab8c5d3e91e7671088fa800c008930276d4530c7ede62c782b7ac7e183fde0f66729136f018f837819e7d7aa3aa5833a10cd49701507ff5b6df692c40dc64b6023045149b2b370af7d9c18cb27e5a91598e5edb7a337e641e50dcb9ef0c74d47a9c51eb6ee79b41e7cc04b5910722922cd372584de9d6a925c687959722a6d13bf13839efb09d92cdefb763b3d738bc8776bf8bf0f6212b79aafa4dcdc14342c2e9687e7228c67406af7a359f611586e5d296f517ead67166789540f76af28fbbdf7327aab2ae4c4e959d99b8374177e4818912073a7f0188b9e92da8723d3e636de8c3fde0ada1f24cc21e92bc3505f00e0661536783525cd9765255998bd565ff29e1e0355d0b9e0f6822b38278b794d2af6180e47bea6f61cd6d832356cb402dc6f0061324ffae87f0449f0c75134f79e4a12453c1401ced4ecdb5b226a66e54407cb41cade4a0310af2b9ccc29f8c5e369e92181bea01d68af161c883fd6d1d06f69eb450511f8518cba835d9c2d80a25b87eb3b44e9ab7f2772bc8f716a8d2baec0a7ca4cb790e9a2dcefa3313bf08229d2ea952f4640c25dd5855e8a8ce3fbccbabd813ca49381f97a26c5708add2cdab468b5051ea3d95829bd1e12a399e9d23e74935c40c9c09a7d71ece1820f477614abc351d99d6b2054adf68f17789cc733162834f4f94f8ccb18400d8c4d7c06d9fce898def620be409d0f8b4f48bdb383e9674d26edd5d74e63e87b0e617390eda34b649776a239d3d4908db5d1f39f1536792e406bfb84ec9a0db37211d31f37e8163c6be49699f79ca21eb0dae792d144865fa83c699a8f04d63e1e2644b89f136ea9c20aa7e7933b6dc5a82d40949f5db569c828c6211eea6ca37c6870650d6b7d3205ae7b2a8efa180a0590a7ad67c72ed306f6ba228194f66af29efc2d69396b5f9a99ba6ad221cc7530ccc4e611cb1a25cc70efa3a04a9d1cea9293199bc560b8ea930daf46f8b08f8fa93e4685b1a1e8815c0aaf63548940cb0adb2f8c5783c65d641c02d2c7eddf8beebed5acc1eaa38c83b64bb2f9e15efdcf7c792237fc105cd38e6a5ed5aaed8d65eb9c6c431ede57ad99817583cefee8a91fff46adf41e4da90bf0d26b1042fbd46ea2ae7e642249a15b58943877a9f45f6cc8e100937999ae3d9b16d147653e04eef05bbbe5f5ca29a5d9f76105e689bb0adcd97900a8a9aac973134f76debfbd148c5942c8e2420b1f0a86459f3e0f83a24318606433e4655a80af2dc536e5c68880925b366e191070f52a2e6e38ee80db0584fde6a3b1a696cbd3b25df417e9f1d4ec4e5723b80040a2c962995c8e7a5e2b0797af7f7a37255b682766a0bfecf78e5162528885a339174c2a49325739d2bd8877e64fa6deb03854d407c3449843b8a8e05025e9c1015e9ccea643b284e0c1eee6b49c9d64df6b810169e40eb57d59d91078834d21407f9f96d71605243041232a41ecc69159fbd5f6b48b850b4d7acb3af329178c9f803fca0533b9e269440e8bb4ca8b2cc7f03afa0f401161592268a6e89fb1cac56b63b15723378433d3975335bb53ffd0539757a28c1a814c59979c806e81a35c47f394f66de6d238f5a6c8ee4987d01d2bd35396f60831cc274063e31df1df091dd6bb09992d961db2233404fb8d685580d8371307433a81954b443834674576f4f66eb93076968d12f6dda259ce8f215a8d4b4045336415aaa187a73c4d9e4bd43af52eb9289b2e1e080ceeecb20c29c2dad6463a40762d6f28745abc0ab22fc68a978fbcaa6da8dd3f08103ba2a914bfa7224d6ed33a74eac952763c0649cbd0ce9e04c166d4a458841b31cf042c8b5adc757c6852768f256d6b2644a92bc7fdee50b751c398ca95c08b792e415e359a6218fbb027f32928fa05905d5b1fca52d3f6cdf32980c19ed9a10fe2c207bb871f53f3ceb879e8f95a69dc0e84ef7cd963d771300056327bb9a51c73eeefc429fc6d8c4a6fd074a273df33e08c618799873dc98fb1e0c43246dfc7672cddf989e1b0edadb3bf762b2faebd5adb3e909a286efd98a2e720cd6a963948e69b01aeb7623f7feb0f969a7420a104d94d42e52cb336d33c32ed530b14999d83ef86a064cca94681887bf92c7b0866ef5842817d549cc9e78bd4cd139f10ef6ba22d68d236548cdcf2ce4f3e08190983253b76019956010cb87d426980c6c5057ca00de7e767d8641536a5920ffd74ff7ed3cda2ca8d0311828fbaf5ffe2a7bb4487978d290bb381b95c0210d8db2fc929b28d462e685860b1b33e9f638d1df4c4890fab4268a49ba5e76ea0aadcc34bee81bed70e10875f0d90d44ff6eeb019c24f7c297ba5331aa280f22acf28b7eb97e8683cb2ac18785dcf87edfe2ee7900781e6ee1cebe86678cf94968de69313ea8e945d626594126b175c61c4744bc25bc655e46d614ce7ef7b5ecc2d3ee02ab11c4a2266638294fd115d9390e9631785c6d2f2b630e606ce2d58b4f6592498b239907305cd6a68dc64916caab4b7f84f2a64003e7f3e29df8c8937325feac4b68e703889cbd4f5d0b900d259ffcfcb7f9a14f74e77ddbae841f93b2778b71884c3f159388749a3a1b8b3aee6ef34f9debde9bd2e404a1fb2f3b0a91fca15fbe67f1bbe5b2650da1608b1e999ae6deb343ceb3b26010dc2054bb76a60808bd5a26af75039d37202f8520269ba64020849be22597ee2af09a9f1156432c0a20f812d8cf51cb436830f3daf1891387bb7e4ec97007d0cb75e658cd281dfb2e00f4b70e3964af124c62372bfdd66536162cf6e51166ca7ad2802c4f7a8ae80d03ec8da021c0cb3c431fc983a9f80dd3c70d0eb588493da1ace49438ac1e64ff704bf14f36daa229f2d6158294828fd9249b00cb5333ace85baffae96b3d04adfcafac6be736c653c231c5a93bfa6dbed5536786f0a -MD = 40a3de5449297067bc4bce3068abf627d229543f34ac71fe9710d7cf - -Len = 22688 -Msg = e43cceb6d7dacd6ecbe62ff95dda944257a73d57265522248fe93e819d8b2e70dee8fa9fcfd6333594363ecbec1fefb765395a91cc66e5f0e8a8a275683fdc0b1911f06c5c4f5ee8d85620626cd33b9b672b93b3fc1a03ecf09aadb296068fd8fd7f5825688f790ffe0c7ec6c33f9f74c74692c39eb7a4a10f86084010296f60f3f9d9d0dadcaa3270210000dbab44ccec52ffcc9986ef95ae355b27bfefa32a61491b779a7f19da955d4d169a5f512a3e1781d3d7cf0d5233704d6f8aa254beb035c7218fc0f08ed5870e13eaa2ef17255cc1e23fda266008fd86215888a9a5498685d7a3e654d79869eafcb2be461a09eb6700b9ee614593a4af4513ebcb669203fca0bd3b6f3c46c98adbdaf97dbb528a1a362d54e68b3e2f70e1a211e189f576d584c5056945477095b7499cbd826802828b8355deb9706470ffed431497d9a5b78ba48d6a7a0426b499e9ee2df8b41a4807a3377158900d58a6dcc88c17a65a4bbe401b9964e3b28f88a139f6a49c9c14b27642c6ef08f0cfdf57ea7091c35b392482f61e8a4ddecd8c59c33f0e894e8d95e2c006063fd67eb146efe88d9a7028c552682274ab7017adf9d631bfe4fa5cb7d0f758269d860c2491201e949263c0aa99b7cdab633114f46ab8f43e136629202930e5d58aca224020c5372d13fbaada3d2c46b6dfe96d6892b1af13805b9bd9d3b3d49e6e68680edb265ee185ff8e5d280fb61d8560c9125a0b8ac791a05ae9b8c84e06b1298595ab8ab9375138133c40a84469bf5dd1f8aa0caee1b0ff0f58bfb77b97bbd522dd763b70b7dd6ee27e6f3e1921f4aa2d246bfe43e9443e622fcfc782d8f534e6ef267face99268a32b9c1b5ccd8b0d849e83277068b526fa75d2428c51c50d7ad2a19f9556d8f0fd4caf8536f6ee4f7e6cdcd05ee56a7f8032af6ec08b942a858ed1e2528518cc98e88fc5cf238438c4985d4035e8cd119b6e4e94470dcb51b02c9c920cfeb8c51d0726234edcb58ffe2aedc11cf945a3f43297fb485fd04ba3b3ecf5ea4a22a334b15be6dba9e91ed42876993ba13aff328572edec0a0de0052ba85515f0bc2e84ef1658a01388abec9cdf11bb6714ebfe70c7b05b95e8d77f9db8f8b478f02eb6c83fbfc2a1fafff18d1071c4d43c3000fa7e8dbc88cbfab8100427f06b256a7145bf646cdca8e28904f0017d6f1896df2b7fcc376c1d0f598c7329f150c2ab5e6d7c8fc44af81b5c0869090fc011e4440bb2b5f6c846df0919ef48deaf31b925485f88f275537413a162d0a24f90e4d6a3ff901e24ae3271c060cadf11d95c6dde50961fe522b356d7c49f5ca5fb5c3efa4fa4da08bdd03888acf81efc225cde3838027320cba1ccb375be6849bb152318883a50fddb80077abc1ac0fb7480215dfd1515b0b8061e3c5e75ecc339d72e06949aa88a700b869c7878f0933791de5589142e1d4faaf47b670c119cdc6907cb590c0b38e43a5cf8c859d44ed358bc29c24ae5edfa54f47679cafe5b0b95556fc1d8a18e9fd33296950794b3b19a64e092fe63aa20cec9377af8dc883021c0fbb3459114099eaf7cc5c8594a37227e82e077cfdb28de19c654ded2abb2d6f276169c04528a657cb442e54b9cceb7b11893fe52097c4d8d29edc4094df97c90e8d42621d18bee4046f2a69130de20a5a895db14bb83e2cc6a2ff2a8f56ddb455ad42811187202a438bf52548ed026033dcd563c79a5677f9100afd82c76bab6d2feedfbafa96950949033bb3f0a9173dc23b7f3cc4aa24da44a45c1797ce38e5b3abc081f96ebeb624c8fefcaf6299c8f7f45603ada5ddfadf4fa8a64e71c73fa70dc5fefa3501da8ddaf17b7fbb5275dc949ac4dbd5edcb3e6175c751f2e0eb988962aa7375f90702adb5c8f80ffbb4fe90bfe8d5c6eedbf08e35e358ce1069f6a328ed0b9e1e9c11b5ae6d9efcd016bc8d37f811d54bad842a8b92b96fc03b4fff8b5f1939fd3a49876dc1dafe8a1bb4ce956b169daea067cac94e0a649af012d2fc7922c5ef41f897566e4281842475e94ada5a9c625519e3918da228eaf8ddd21eb3bece9f43dd6a0aeb4c2248c15e71ea9e643e115c290956ca37494ae61f8144a753b077c03683fd918e5d62930cdcd74fba1f360603a08bac30223528364510cc7817f347b259a1295f9f4be9dfaea366c29c4ae3484dc27c0360343fd0b2058ba261ac3acf6f87fb56647f66554bc16c2451ba8445757dd2477fb2ad7d3c856d592a0d29ec3a348ff94977691c58d3d845cc1f59a99c304762cd4af17a69330a02ed9085a75e196fbecace92934a3d33ad57f3e3e3466c33fbf5679c76bc70ba3608c0ee7f2fb9132d44df5338848ff6c1a1b2b360e894306974931ee0aad126791838b4d2439602bb54442b9abc1e9a3925d638c1173ac531c757e956a8d6a732a842895f2e22c6ef85779c28459ba66a50f8f48246e25afb6a209c375af3e4f91588dc643401c84034f4257fb579a3ebbf756702ec0d6a0cd977a80125ab48430c761e8019959f440f3447ff802b0b23cdf610e19b2e8b0c91d78d429d8f4996e984c0413360a46150d284263a4254a908d5829cc8c836712fcabc8a36f2716b295f820615f5803ec6395a82483208e20c9e1ca2f96ce4c10fcbc636668758466840a47d35b6bb22cbf34ba24e7ca07525da7f82a18f2e72ce453ae5b0b0569f12e2d7e51746adb3de7ad7f491a4b3c8f0f50bba55917c0cc7e17af6a9f0050bb5b07cfc3f07d0787a3a7ff7c63cab540a9851b88a263605a90b1707c6e8dbe2cd240411118cebc72bdcb43a6096ffbcbf1ed21bb3b014e3ce3c8f977bed53dac5d81dc2334828566fbc052ad5564959ab031d4266c1712dc3f055045d80054a3c272a9e18cc4e7cb272e357b8fce0b13adf83db27dce35a06c107fcc04358c79cabaaf3467ba6c0907bff2f6ffd8e6a0b2eb6245b54d3ef231908ef6899c6b963d01f7020f8c9b8864199308eca7ada885b24dc85dbdb539572e83a9b15e7b62e3f18735ca63fcb005e41f98a066e893eff40624bd4522dca79168cfc2a34446843069b3e16718eab4c99f8d613b20c8b859933f1d0e0e45e661444f05924da8e766a5669cbf769c376f1ad1784edbb1a88bfe03c53f01dbdf482011c2541ef1d53c413442949f305780984b2dc8a4b5872f4f57fc01810659ec03fd41103f8a165947071d0d190cdca122e3c7d1003c1cf08c220c7c182e1bf5f5fbc9ef39d97267bec673536e9a8e7cbe81909079ae3073bf4e3bd74dbbee0cfff3a3199248b10baf598d8d254035b9770dce2e96748b63efc2d23ba8159ad927cd18b5d53e9aef21a7b3e4c7689800526fcad3dff4f566256618cfb2a5e70377716eec8723f6bb1c9a2c80db7980f75990cca5dd973624682257bcf2d19d33f7c7ede5325e8d17a9194288e9dbb54993561bcf17c51547c0ded529f1028310aeb8dfc95d5927a9ce0d3b247af5ff9c08aa017716e75c743582dc3f35a16243a42a8abf917b8c1c955c607e15312699c175c4c66063d155d0f6b22548140273e10638f0552c831606eff9bb42f6f1e7c59dade37fa33d9298229f04b2c52b496e352f8331d4d63f28ae4e0689ad292e1c0c04f6fb0d67d396efed04f91aa56c529eb7a1addb4b410381a68573bc9618cfa811295a0b19bfd043e24ca77d378695281a7252aaabc19f514b60878c004be55b1ba2260419fe5008c8054355ab3c40bd9e1da7a7bd6a050483c04d852f6f660b6c89e66030391e24e556560ac73859448dcb353b4be13c8497cd4e0feb2d5ba24a07238626184081826867045422eba42da382ce1bd14cb7cfae1193fb2dcb07fe4464e0c342c005e663feaa19a1fbc7c7ce18c9f7e03e87728c1f772816be22d06731d5cf60a59a5b6ea466e05e9394a2737f92a5b619dbca8efe253a903cdb079812cd1119f82727b1df9f6f01baf308bb3d93edfce59a1ddd3803f9454e1aed0190305216c09393553abe8f3179 -MD = e4c064eeafe8323b68aaad4aa6fbed8029771b7644d49849d2cbe96a - -Len = 23480 -Msg = 7b00efdb61a258fa37c34195a111f6d8ef29ee70e34face6bb63e32b6b10dd742b471d4731ec44d6c0cf318d61dd6ce77198c585dbc4388127631400b4e45d0641986e8fb265e2db11beb509d4d2a7e75e04e109c89cdb18e0bc7d6d729585dec7da28d86c75fcaf347a153180596e81be578b23303f5d53ef54669b2f8b1ea4c4f7944de68558fa31e9992eefd88b5d9a780bfb9d1586d95b1517b1722eef0041d6fa13a8fbc0650ef58928a9b9c422f94fa9ba96861e532ce6d7d8c4e6c298455fa2553a41f997d5852c463462e278e4c4ad88a4faec686baef038ac1b5d17d87ad33925bdce398e80cbb11a3dad0962bf5e8c4dd9b9c11f57a8f8b2358923020fd7e7f0d906f33fd0ae91e3b0ec7a7b2806ef1c8b4d0550c848415e9c0e64cc06f48823fc686cf25c1d0d1525697637e7ebd8967870dd06e9173a39b8b4843d477344468dbe4dae0c604d3a03eaa39fe455704508eaf14aa25f0ccaf243285ebb9c42e2f6ce3d7cc8be7ad9b238a9ba088edfb0a482e823db66de99b082fa3548b6ab7e9e61e5637881bc7b9a1b319139dd4c5fb2026b9a7c76d92f5b3aa2cdd70ba6a3ed3eed6b04ef3aa7235ae32a6089dfdb9c3021b66dd524135c33c82b51e15cd84b2ffc9c54511de5b5bf668f66dbc2abc8d4b37f96cbe9cd193513599c81f5a520fabaff51ee8cbdb81063c8311b1a57a0b8c8fde0a24de6fc082b5ea2339892d468d19be110b0b8941681dbab9112688aa3093931a07ae56c73b942493e6d28cf41e678edfdb15db19969d2bb84cf65f05c1d3a730f9852d140650d7bec9dee7a4da49f5efeb6357761c2b4483e7cd639acae088c35ceb69235d6c81f83506d3b53b0171a5be7c74f35358a3c053f43cd5b61ac665b4598191bb57b1d4cad2b7b1db5e80b5c6d9b9fde6a5b7e2240351431e02de7c82580cdb9a92c5d8fddb2a371591b18497039d025082ff6dda83476f6d393f9c695f616d95be5c694088a191844b72869172a4bd0b80f8c7d9fc65b71e1e7839bbd835c4172ad42a2543947da1fc425058bf577a72101284c4c752b6bb3306c90c6ae07ba978db902ec49937e924bf665f422bb74ec10b290d8c84eacf1769eedd8007f0c728b11fdf64267ce445283d1793981fdc04112926b472cfc42c100fa1a002dffaab233d99baa2a90dee4b49142c3300b469e309a2b7b2d234e1a7affb536775be80707de020b448d070671ec78482f66252ef4ef43ebbae8be88f443d12ac6e7d394755654ec1d8d68c2a22c434ee8d606f947dbd92039143a14560f9465836c14606687b8d61d58a91f2f97ca5fc22391080fa416a0146f69c588ab296e14b25273c0ba5750acb571260076360225146d62369321f5b1c1f4a3735fb6cde38136d66d3858e2326d68ddfd10aec07973430fa2f023a67ad282b6fd73640b56a168905346e4141748374e0faf5b1f2706ba183d03433cd56abc070f2e5aafd7d98fa95c2f236fc30e86811c9965a995967b84ed13aa3e2c504a9d92d9c141cdf3532a6f393c7a9e87fc7c0d17f3e62cea2d5b9c6a7f34e64dd3806cbcc049a0b55e1a73ae58bd117b4249cb712d5d54cc79a6314eeba76b29ffb9871f8050b7e8558152d49ec182b100f03def3c967602076c9408161e23ac784fc94a28dd7c54e367f3f4370d5af2dd774ad94819f8557eb5ade02721769de34a1c84e17956c0aed53e554a2a020681e8dc76786f448d8789641d4638ccc6ebb36717d3abadf55ed21b41009ee0b5954ada0ff51fc072c9f1a1099dec8ded3691924925fbeabc9c6772fe81f35ec7c1a62bece7b1d6cbedf44cea51c421db6cec846300f173db109b2bd5f4b0e303ac03b95575aded629a9b4d098d49f05836cc27ac8b16b11a61762e0e815ed632ff696b92c79c6cfd79ed8cae7701632c3c3a626eeff10c43370063f15284a11c61e129ea0606bd6531f2f1213776e01e253d1def530bed1c3c42b3c68caaab897b71dba75a7147626bb265a9f630d0f799de4079e0eaba6f164304d45a595c41f524690fea6772bccf36ce8fdcb69c7f4224b452bd18dd026d0b4064e2171c0b76ffbc6bdf6fa63a0485161c108faa7ec5175fc2141dbc9deaa34dbe4c6f53b1a60cba0260124ba5b3a72395bb4664bccdbf2a130a7fc10a3412152ac1e669f92e524c1e96d6c9c583a5df45046031000025fd8bc9c85210f4607ef06906c6acb6d95b05a94689621d863073146778140650c174797fd976d29672576b56d392e5aacd00c0e7f1442852006612e3a3be88485c14412dbd0575bbd8a8ef5ef67264cc8c5703436a324d113667275a19c72e16b8b44a59668586d7972c1fa79815da477e529be15df634ccbabe7b5642f79fc1bc9bbc8b3cbeacf3992821b82244f0248d39b0493056848b74b3355e861584514f13be4ca7779015c5e71d19fac54e6aa05369044d1be6544c8e7efb4deb84cf5b6278220f7ada4803b03c538a609b219ee9ef991a0d01312a967db3ff3f4842c7d11398dc8d31913bcaa5ed39df805171436a9001f37e29f6145b1104da77b27ba8b73376793dfa557e826f6e08a40300a901726896044498503f9ac484ba275e2f8b7d4505a78a3a14f86293a5b03f3363dcc5b9bf3c8bf89252d8a804b9aa5aaeb8fdb2fb1749d0d4314d0f7c4b0bf2b824145b34cd05fe22bb5216241b42566c653b23213440000555b84a561e7125f201e4b6be61bb9347a39077aa89f83bb2bbc00141a776b3f18b2bacfad078b4579abf32249db39d4b321b345faad3efc8e213b52117f3cfdefc2f9d320a288730182c37302bf705748f7ab30b27db5bf601bca58a2dc03d15d04b85c4748a87c4a2b42da8b38fb40be3355e76a718678441443b4391e4e6de2e08cc79b5a59a5d61dd7c55dc81915755d59c67d393fcb9c932de16ea67b1803eedda197682a9417d328cff4fd783a20ee1d4a8535300dec20ef5c9e15285452a82176c5e279db91d38c66db499743236e170ffce605d3b5361ea251dac4c73174fec39169e5c0d69799069b2cd4b51f45dd735ecc3f918a5b124f2477ded532fddbf4a45efd0858a7c53b9f17df04570de71125683bebddf890bf806ce502d9ab3f9659420df69a8c978261ab04a56d3eba65db4a892712a6e07fe03a65d4980590353ab3b7300eae96578d56f43ce450ddee0ad3b5f7eaeea80cee50dfcee085843dc3147739379638477c9c1c2f3edcb8161ea420c2a9284de2e550b15665a3723c7cf4dc76a7dbf3ceb9faeb00ff4adf7a913c881beffc589e7fba990f79f7e0ade2c5457cd1d86f49bfe3ef368813ba880cfd2a6811c33eac17eee55eaffb660e7f1640b04813f16508f7a7446bdfefdadc66a63bd1258678387e34c87a1668cabc585cb56d27209d2fa691bf3d07d5cfaa197a0b808bc69f7bd8e5e15ae16f8f251c07f0d38a735e9e613d1b6e1402e2d086245bc27e559e3c9f971de4d4e0b843c1c0f6fda67025dfb817cd618d0dc0fa2d13a0f965d9d10522c6e28a7972d282fa263c5e139d8f5e2ba059c9eb4cc6818ef67f97eac9f46012d3e3ce478c6a8d259635674a61f7a43c655509b74680011c1b4c40758c54c7e06c7622b7a3ecacc49f86cbc353fb5c5ae533a3699179e36510ab658eb79ec70bff3e1a423fe57c67a084de16ea06b1179e6a198aa400c2fa64f199aed22ec7f5ea90378fe6c1667f57c420ad9aa67cf2ff8cfe92f4d10a3c86d33f4e4271554edd10ecf90f1d158c13d935fffc670a6d9700a50b1a5733bc04a4d8f5af22f9773524bd063f64e40e6328809675a4d3e7e359bf5b7b0fc9e95d0ae93d6ea02f0f91602a4fee156c86d42693099d0c7402631ca01c9d675744fe5a027e177550586047b72e91bb1985d577dfb1e8ea654d94bde9c6f7fa467f77369730201f2812204fd63ad0d2757be580d937dfeb221a06b21ed3213531d936152a0c1f09f0ad5fed19fd11e80ad982c61203e86b2508279d91d99fa483e2e97a3d6a6ad2548a8da404dddb58344f4bdc1c9ea907088885e4f532d9c4c73cdfda43c3a9e4ce5a2809096593cfac1d9f275b60883b272b900cbb8746226647a7b9dfb042cdb86ccd909a1ce1aabcf50b3c41020c741b61d489474f8b2a0 -MD = bc824308b8955420c4eafec6a9948bb5d35ae2f027f5813a063f3927 - -Len = 24272 -Msg = 887486fff7922768186363ef17eb78e5cf2fab8f47a4eb327de8b16d63b02acb28029899b8a4f6f586d4da288939a036841ac5b38bce91d7c373f9d569e3c36916e4ebb0419f463d05546569244bbcea4d0e03a89ad5ddcc5d42b8191c4ef47fda8447ed986d60681c4bca5af109142caf732f167da31736d3bbb5e085da0536fd4874f8c7f48c9d5421d2a2f75cef2234b10fa73a1e8740ae48bad3aa6d3db5069a3978d61e1104333e45e93f2a97f463306c01db30740f75508d9a95f0e5257de15f16cbd139c6430aebd9cf5d52cbc4580dcc67c028ceb03bf7dc4e4c45adea84af79b0f74a0b0cee8c18b1db69cfe092bcb1e7b5e9a3e870c041db67a576d6edee498c778dfa1550ef4eed8e24273e443f5762f900b6a359b073462b4da7c983e73068394abce699dd24895ccafc67d85f68e073b5306c5d8f17977f846949ae61d44b25c97807321e418f2fa575e1b4e4896a0b4f39c8e424d8d44a94e4e0d623dd3d23515701817a4f06eefbbb3642966406a918f84156385b0776c33f1563f6f4471b2b815af0b9f3f78115f5ede83da1bf3556965e1c934b37ea5aa370bda2c16ff5a01d9de6a2d769cf3b4c8f10a0e89a97523ba79cfd4e6d8ea0377a4defebbf99f6544fcbfea364c2b4e8a32188dfa1b8540da53f3e0cb04adf24ba79a51b3fef754dfa0695fff141caf0b183bd31db7ea337df6d1d2f08065d91b9aa8bf8f6e0673125012f911635c38c429d078450d289dfde8f645c7daa64a7fd496a2bec52122759239404dd84e8e6ddd92e81099d4c2e280bd93d181e3a8d10bc0a5b292ec0581dd48bfe4e1781230a9ef9cf0dc5354b474b457ae04a276c7a6d3331b65db7ebf97cde2770d6d66e5155311664348c5ec3b56fbbde17756cc1c2ad549ac63f09758353294ba92eed3b649e0017d0999122b321a7186b6ab46f253f6edd50a2da1a52b3a9e779d3c84f3408332d83a30aeeac21e69830506d0bfdb32488e526856f4fc5524d2c0b28152d3757ae33f4f1ae083821664c6dbe1eb2cf20a16c1533fde353c984ac1f3516b7f315a3cad26feb2e2e0088a90ad02fac5c0a33ccb50b4a7623b994df5716d93b0315132f86ac2c88cb2a082d6ecbc652218943ef4f36e071ffc886affaf4e71f30fe064a58cff97dd748edc2e3d66c0ee846dbbc2adb473aad9e610352f6c6cd427884038f00da751901404faf19a74777e9021b9023053bf5e42dc2a54500ab012d9642756958d85afe08bb1bbd02669719c1f4c736a4dba142f2d63c081d2334c243ef502ffa0f62e64df06fea02d1107e1f2f183bac81775fb9265f68a39ca5e294f2697d4980f96218d5f3c731f1aac124b5cb5aa39741e4899a558d1c7e1a338f330879cc94e71a7052ef7d162e2d8ad86c28bd1384c5786b1a689e0f305c5d3e9b754b0bb3f3b55d4faa3339f16080443d778983b0ccc4668edec3051c3309a910f71c8e46e7dce7b46d1223a00c4c6f10ffe97c831d7082de002685a966dfd77bd714deb38936176980425ba5f99661ce090385658223c7f316ec173fbf86d0c55e5a8264a26cf4572bea6966ef05235dddff26bec1853eb36840434604a79cd4d11702bff9258664b633d64db641bca7c306e7f6a33fee073d489226fee944927b72e72e580ad679684429c015f3349303405175f0f9e0d7df2c8b4875f5cfe6a394b71885c2eb7f8a46ea29d6c39408e4d4eba3705a1a0c9415b712317245b790a4fde549f6ce5c6460a2efbf58e3f0afea3de9ea0ba68ca52b9cedf909aeef8bcb3efc6c4e85fa3ebbd87a995b2932adacd0ad28b48c415a95c44296621375dc3104c7b6711a3f607e14322b736eb623402b58f0fcd212fa7cb777d1247b31cbfdd6adef08941511d2de7f3f49bb645cced7530b8b82e6cf07fbf670f7ef0ba0583d16debafc639bdfbfc99b8417249f7f5a05410aa3a71f5f1a253b8576eba269c06a4c30591144cc3e7808cd8bde337a3ed559213e3c33ab9c6efc7318b91a59e7120112b30655c2e4f44ecc1e7a61e80a2d1d775a8d53140738796cdd5d504f3a74c507132c15e837a53528d8e071f1477453b5ff82c6c2e5ea7b16cebf8c7442f960b7806ace67c1f4858ac1f8abbc7c11c4823503d6dcbdeeca19f2c816ef860999cb02a8c6660a470599e2ab5672316e388705f8c98a18ab2e1e525e35e98e0d39eba1ce470e98077efe42dfbc3aeff2776c7649e8f67d896fcdf46a338ae36b09be66c59786f59db960e97d233d3c0548d891de7b4574f054cde2d556f90c8dceed5873fef7a96f7b68e06ed4a3a30f74735d9fcaa28548a7c72485e75f91d9531f7fc1c6893ae78fbe2e981793a978c4e6e2751c3339f92e62c0642de3fbb95ffde4973563326cbc09dbe53435d8a9fdd92846bb20176bb247c05972aed194b92f8ede95ae1965c9f1f03c72b2b708eaf338fced92a807fa1d2b4bfce79bd22a5c857c2c91753c7f2074841a32cefe52dd197dfbb17233d08d0a2415b7e2da7a2cd25b4335d058a63b6fa774dca6f4fc3fd3b32da4ff58fa3f64cb03462c1671497c6121c2b12106edea8cc8d9c650b1bf6f84ca94d7df41da41280ebb04edd6588b78105fa1ff66dbeb1b5e51b67b3908f4da1ca8802e6d07aa23803fefc7730408875634275a8fb07d3c7d6bffde5cc06a9c690984af466da5a49ff9770c0ef2fa763c6acb9a4a12a5d76f4f28e0e290d9b2fade6bc993b53d93b512232570cd692d0a2915275daa6dd47a26b9e8921f4a031750bbe31e8677d808b17b78613b5e9308988e6a901fdc1be7183b603516c4790787fe67ad895d5be0ff086ea9e4df927ee0bdc9ad19fa95fe4c35af931c50fb14aabbbc0965f605872451700f72f711b3282aad7a42d02806eb2f3d74daf57284e17b4afac34abc4447dfe45c8aabf9f0995e7fc13f65bd491cb172a0f7bbc4a056c579484b62695e90383358d605307d5be0a548bbc23d0d0844b6de1caadab02e21b1baa445f51e28e6c6cbfe0c9fa2953889d85ced8e9bd66f71f8f1cb9cfc94175a1977fb46cc3771047daac82ea770ef9138caf09a3bafbb0bb41d25f2cbae30dc2d6b8d46b0e45f54368142c6d3138c2732aed34734bbafecdb49c0c567a4f39fbe2902db11583a20bd2b814d6fa697b28cb09c7fd021d37c351ca5fb169fe90c945862ef39bb89cfdb518dadc353999a0f775529550aaf24893fdb7e21c7988976a1b6696e34d5c9589b6fcc1740194683ac052d0c9dcc4aa1596a34d0438a7f2eac0531f9eba575fcb02e94b3959f20b0f6b5733d03b15843135b076a3c47578220572f2209813d8e39d2ebde7bb38f5dfe6ce23063e6b43815b5de39d955773ba6b44b30b6f188d8dd64bbe21adefb546c32642ce6f4c8470680a083433e4921e5256d6d197ebfa045ebeb0599a7cc5be70fe07bb462fa3a8fc53791a18a33fb86b17d1f5baf48af186f639020976b3b170c3f63f4b8b4d8578b8aab1cbf9f933061638fa30d8ccdfff90bcbd9343ebca530672dcf7f5de807da8118dc67f4af8c3c07051a1ff3c1a28fcbfdea09aea5398441206c3e5c3346ba042208099a18414a51c8e86de655a83c8b6f7b9b24c07a0eb586f47d1b81bd34fb0fc82ef996f8932a22347fcb4fba05336ab57406d311d8aca58ec40199134f4e28465d79f05920785926de0b787ff4ab34bf1bbda7a5ea0cc7639c7645f114e6b5a71e82f00bf825b6e8110f98a010db15c218b204df4abf329a8ce24bff89a9fe16f97c5cb72317819fa03e77c461ab57e6f44cb16702ab2e5c1dae74e4b8804ab977cffd04aa38027614ffdc94f004415236f278e41aba05d1d5408849a953e3b81fe39b9b946e8193f3bc91b7c4cc1a2f660e1fff98d3fd203f014fd5630b0f3c7a20fe23e9a3451ec8dc5cd6e5ed2ba40c076f5f86dd6072e0599131ee8e176d0eefed45b1be974018c706995c4dbcdab14530acebc274ee42b1150452c6437266b631a9f5a7bf206de457a730d614f9dc302a90d06982bdec6fa4f7979ada7407de92f6bd4605e84e9d16a9696e7d28163024b13cbad10666fd06b2c6f1269a7bd0d8d50f83b0bd44590d4610ff3d8fe6ade8b7379dabf239c103dce7b56d0d49f3cbedf5460ac9d68102272c709d57d40f3c4bcafa56a9ec25621d00cdf8f4f9ae33e7767759348c7bbef4c5a9e5a868bee915fbb91b52078fed1f1b210f78136bd76a9afee626eeb00954e4925da92b22b7bcd4c2421512696a873f99f9c12091801f6ac3f9c68588 -MD = dbf37238c302735e88483a64a3eeef0c626defd048fa39bbbfedf112 - -Len = 25064 -Msg = 2eb0eca524d5a152f51af240c51bd815f2d52bd9afbb64aeee06a7bb844c016a8754eed3fb291e78ae6d783261f0606b2881358e14041ebc0ec507c1060ce6464ef243474072f7c827c334c45de5c567b07b977d0ad87929525c20da8d016e7b4931f4ea3bdbb5ac27c52cdf0024916f516a598ddb5ffc5d7f73faef5f52207141ba07a33489df8b751b6a6993d24bedd2f681a8cdc02fc160b19ee9c5288490fd34875972a7fdccda6cf64c5e1a7c48fcc819b52a249abbbcbf13ae07ab2341474879f63e5b97d91e60d66ea922abe89788289b38b2c6b45a4461286d0284eae59ee761e0cd361909a014b9bc1260356bdeb74440933a1503e9913d3f5630f5a0ddd882a02761f462d4b813de1324973f70cd9789ee7e447f56aad7c4ceadc840ad5541c58ea1d2f3a4c866594d7d76dce9727c5dec1bab9632b4dd459385cd8db86586992c7d1b82b64e9973e7f63a0befaedb02b598b01026b8370acc3f6a4fa3103962297d37d8b551947509144b922a8a9cc1707dbdb4d9bccd5ba264094d195e4269ad298fbd47da3fa7dd611139440da8e24553394bf4cb87803d7b1150c05889f6df0a89f914f082508864f5cae240e5ad5da08c9d1eea4dc0c40cea204005f751e7a78e53c59b45b935a55d0baf293c6ae0ef1d720023076560a0fb85426e72c1ee88079402e3702b0aadb2c650d29560f6c55692417d9db538beae476e99e38f1c365a8472d1ebec2f035dc17043d9d8c5ac9ec58a01f7f975ee6a2d6b9033049838f1ebbe6c9e44cd2fc4c5b583ee1a782b5dd283b5fd783eb89800e25b48668b1632918ebd717d0cba5199c799be6e35cbfc82d3a3987cbca59e887a000cfd1c59873e88ca4dde132b6b074f90301c2412e19d23d3ae4b163ce58ddc896613748857b9579d18ae0b0a79d5f56d2b6b6f8a75eb1a4b282e7505d5d7affd3deeba2b09cba13ebc361be0e5cc603a99a53bbb20336115ef6d0189d62d9c657bd717cb073c0fb31fbe6c3316b439ff6110b32c4b3f9f39ea50e14f51594bc80716b3efb8d448062b8d268e745527c26bf4fc655cd57dbd001f3ee0ac21632ec9f3b51f845af53fc6ed70766776d38d9f9b41eebdbea3ab1b213fc2514e8da0a9b645e3d398bd64da24727557e1e467e54ca850d4c2b80a229f0d7fa6a870248fa68dc40d54497f4e7b5512ac5c0359254e59120ba865e3fce1cf9f15f6b5c5630cb2499a5740970a3a41d6ceb0d86947ea7dbcc93a513d932faea8050203880d30dffbe3694bb5f6a95d4726a50aa133683cd6753e2420ced1d224de920377755a3a604e5112e0fa10d2ef1a024209d110bde9797d8895950e629a076f5c9984d2eb0244d93c20feb6c756139127a80a29297c3cbf23a2d0308793ea61b7f620df1b692ec7727deae465027a186286c4fda71826cb9d52677d6896ee2fbc9732cbf21b72e45b00a6e2d47db5609aabe8d260449f6b9faa433e2e2b7ba31283a3dc97a27af8a0b01af83b4f2e3178205ff17c880f65d1b44aba00daf98362c2595b3386accbe8962f6ec2fe4b52a4ec0fa2226cde82da77653b072cd098535d3e90ed4d7224dcb8cb8b9314768dc517e22d7a79748a63fb7d076aa869aa8e5b39c2ee8133cd2320d798d31916a883aabfd9ad363a451349786752d72a81bac4313a5da9568c66d63cddad93926c88ac8defe32c967b936840a3e73f7ce480a11041634e452a4de0e0a2470c54a1792536b743e1f1f38a60bb03506ac89c88f9bd1d28f7676f7f48ad2fc90bc30f011da179f6dfb476a13ad3cfb6e0747279d42016d32c2422a5168acb5c19477dc69db67d24ae45cc80fd6f4e4027ea2bfc3a21768d76e40d66505ec028bd48b570ac5d0af3d40ebdceb176c917c99092b834a8837d5b0ff66b001354547f2e7da8537e6a8edb7511335ed288624ed06e56c99d87cc650da65c2d90d008e7629e169901e31b4be48f590d6ad34a3c11867d02e8c8a11c47e5e0e0bd7c6e7e4ae06186cebec3aac200e5c626f2f71dbaa3d6e5718f2507237a9f20829fabcb4f0a3122ce43ad82772c828fee2c9078358d087d21237fae0a2f42f5c782ea56d9e63076e7b9025a6bdbd672aacb3ed6e90cbccfdeced89965ca7167746e51a8513a0489026ae9bb06d58976421528be3ee89ae591d658519a14d37f71a908481dcf5563089c8b2cb0e144a39e5377b89ce849c62384265d13d51144a67b38bea76dcc0ddf980f35d1c9af02a7cc524c6bd6727a7a206b4536d5d2bffc2e099356db108e71a69e5ed153719a43cae2031378bc0a80f24e926ddbbff65909a24e91e3caeea40d6030184832745b934e64fc96d07d1b41f8cb1fb180f3a7532c77c24ba23662177c320e6f9c96d870bff88ffa55db35579178b31dbcbecc55ce9750dc3f6d920a1bed1b92550aa0a95d45326bf42cb57a402193e81b5db257b135a35e4a9b1c2f64e7a87705d89d864fd54eb0557983f32d4f26da47da3fa0fcd923996ac8e7ce80aa1be75506b54fbe304c921fc9870a8189d4bae53c5d7ad80b385548fddd2f96bedeaaec9ed24bd1dc92d9fb25a90664580552a08cf32b6d544a598c42e599cfa9578874a7dbc3b1638a4d9094d131fd4321681dd1e8fce23bc16edd9de75653f5f049922ab8ff854d9bb5871ee7d175d290c5071326356049055ce318ccac492910b4f02e514776202cdb87cbd32ff38dbb31045b941e0e047eeb47ba7ae4d9ce1e9336bb8ee3ac66a78539a47d93a0fd0873bcb01aff15f694e2b18bda452d6b84ac0cd9571a4ea6737c44b0cd44a4a9e055d91aa01f9ca7b00bc894d4196a88a9c7189194368569f88852f8ac8c2619ac9d00a10ec7cc9e382c35dc51a6bbaef5ae05ea2d7d78369e70088200b14ed6d214db4e4c3fcd63960ea06b37364663d02879ed0a385095cdfe1058b3fc4567bc82122843cfc67e3079af4a700f3332a2fc1ca113ae340eedf81282abb53354d0af4d37d9bfdf7870350d80e279aba0d3f3980e31294d2a6627b506d224402678623384f75642d7bd09601577bed637cbd5923c4aefc270a053a2ee0e9192641b656c1686dd14267ebe51121525db7ef36ab5344749bc690444814249435496207ea1f66c9c80ea1d1c877ea6f5e2fdb179a6fd117f639bf8c1f9086a83ac45f1767a2a93dbabad01ebab611177153d6ecc109f8ed9de90e594b24a5999c2f8f5149ebce1e2c0f692f364c43ef39ac593299923a89f56d03483550ffecdbf379422b6b340f8e54e38fc5bae15b0991d8659e9904618f2e14b578a604166cb8a366669189767423c5bcd37277ef83bceb124a9ee508ddb4d94d7f8440aae0d7a43aa60f2cd750148632fa1376111a75f7b518145ad46389c75cd48c341ebae8e23b44249cc6b47fab8ea41e7a64406584baa189e478b325458ff21e5ce66d54f3f4cb8267b913fdbc2c6be3e35d980428bf5170005a4f1ffa4372cb39967ab43fd3c6a90c22e0e72ea8bc144f6183ca4a2fb2574cfd89c24c13b11348a3658f4c64bff8f898bdf479600f102d2496306f884eb018d715c4c17d377708a1a03ea0340202bb8f1d8e32feef77fafb31cf0f55811af27b558fe0ec906707f5dd5ab1ae4746d38a621cd1e1d7ac4779f90eb013e3e8686edb9c20ee4673b5345f5c175ffa45ceff2e38dca5523d71055e77e84ff1a8f9060a6207feb42d9ec1b8bb47a595700c61f46ac9a5e9ac2641d4832e6634ed12e5848a1c9a73e533426c10a93b93662a57471b1f8ff868d593fdb8e8f328254491bc6cc54e004b011b0bd4d27e8e88975388d244b028f3ed902ca1ae7345d21c7f2492a885d3cf86dffa7049daf167d1cb4c18efa2d5edfcbb03a5e5731883f9225f941cee88d342f5ca8b85fd46847843036766f499b77168f55e345f0abb690fcfd9c8c479f6b3f0fe8f0d41f85ee93f31364111dee0fa4e843301a3a6d8fabbf7ec02b431ba585608e34645a167a334781e04873fdae5c022ccd3fd776d1c9b5a33714a4a9eae897c20c774bc2f44b72a8737c11735c262737431a8f6f84d4279588ae32f04353fbae0175bc3263c3bdafa415c0f621ea9d8c19152a00b1b35d7b3b60b599b7abd5779ac7730ecf8370bffc7b482e0690ad54d7976fd05f4e9f7ed894f44b4fd96d4860d338fd4172d3ff021771c512019fb706072788968d35c6e8b1b8af12c50b47da02d5a7bf7a2e983e4f03604e23bbdc2dcf1acf5e58667af31fc96d0857f79c90bc10b55482c8b1388cc5aac0df49ecd456104ec0977cc37f45ef2c397878700a6ab3cf0573ea7379378048721e900e8304d1adc332bdc8168df294ae0ed8ebd172849cdc33dc0688b6fce56cc6d96bc3412493701172b23f5e994e6e025d346c3e4cc5e0abe691ed730127b4c06c2a1b75d3a8cd1de2 -MD = 4784fc2495fd5a20178c7a8aa50686679138f54d4b9cba149269f191 - -Len = 25856 -Msg = 8f4754c41dc79bd76b8a8aa08ee17e15788b8c0b7828204b00f0e4e9aba5e4d17ec6efa36f0640c123fd5ea6fc1c407953e6b5e1025d031c26bbce4b23633c10e817575b746bb381987a508fffd7c1dd6dc78ee644add8564cc53b65b315f96453a1549534df3b40526a2903a0fa4b6a4c94e1c045fee624fb76f3df66a361f449ccaef9b8482126d836b1ace66e24477ab774170d3a76acb936bd6041f6bde951002c2e0790ae5ab144b02fd919949e7f960f94a547d016116d63904ef4546af4a597dd299d270568feee3781e4e594e19b7cde140f3c8b8883ab18948670a0b823b7ad2759d74e82cb326ae7b75d532a2c829e62780233a8e05ea01b9557b328e3544708aa055e89124670127b4603e1b3e87c986c6935f8ed44cfec0752cac94b3652d47af85c053df0f20a16e6cb8f97771fbdd2bab90010244e0ec6a90d25c4247793b0f9717cb3f998d87286d4bb40f730d9913ee949b2c7c489b8a4a5c3b7e85e4e3450c578dc290983766d46ed163056f5933aeb5a3cf6da66c78bba2b8a48ae0dee457f802047ee1309e548ae81e93a17bff9e7bb147738acdaa573e6a70d10d6c620c81de71dee9115340284e9ec844afdc206f5a4128563d83bf97b74ff2bb3a428c7d59971b20481a39dfab6ffdb9335dc6f8f53916a93ab9574725be5a8ab70a6a5339e0ce174357a419550ebe7fc4f904c1188ba8e453afb0b54c2882ec612e289bc5eb624e9180115df1f77518c3426c204ad579a816db5e6a713b1660d72249cfa4236236c1480425f8c6dc14bcae6fbef292e354d2c0a2ef6b526f78778b40574b0568504103eef9dfd93de42fa171f5a640808b35f440bc610b08b3d0dd9edb211dcf3baf5844522dbb35178ad0355cdc6acbabaeea9a4a18c16c73517dd7c3dce911495a99a6c758f93c1f5c9f0c6d1b7e4f46ac182220e912255797f06d99c4d3d919d15c88b1e7ffcd7c237279aed9f765eccc116ac96879add112e9d2d57f8a811da2156cba615b53be6e0f0f8aae62b9fe7d4af6bbfd64706030be99ff736993d55b68b5394b8889469ab92088ff4cb60c4e3938714e6f17959fd3458036edabd15bab04c70cf3b8b547f57f424311e4869d70b271a205fde1beec480030a313822170dddc3c497c7ae4685e1f106eb00e0965f735bea5bdc4fc5e33e7f71675685b3ea2f13fe64f17fe765f97fd9fc2f310ad7945eadab1bff6ad7ba000b44c045788f69ebe56ab0d04a3f645513177e6219bbb2abd2184432c4e81d0d408f1e6a4c43b4d0e170ada8575b4afb1d05957dad52f4cbbf6afff1bd608f2f781217fd1950384c5a408f0ff600d2fa5d8e1b89ade58345de69f3433c8537ed1b935404c6fc1ce6b8a0ff0d0f7824d93d79b98f01bc87a196ddc9302aa13ecf91db7d8a3b9089276359a5ab8a09692024901696911f27684e8d28c06dfacb5d42b239946053a695c43328f04ffcc9587a99dba645568b217042b9fceed8072097df302c1d8f9cba41f531e546996b08a65dafc705a8dc5463c424eb95851a9ff62c0b595a8a921e43696790582778b812a43b02b95f42898fdb10954b482b62c85f7224ff8eb147335573fb6bf017f02536265e49c1e4495c4f2503f66862f276410c93f4e120bf7782fc2e683a713947da19e49d17eb1b32e70c3c7f2ee8d6669a82b121cb080e79b8ab2f384eae1ae05abc9b9da87e88796c6d48cfe2e59602327b836e9691ba9fbe2808c174f51c587cb68b32bec61799a7ef30cdcc80bbb1d0a013c488e24d535e1ac1edf36ec51809b0bc429feb50fa5d3bfb6033e2ccda3e996809eb244ffc5e2960a31542a086c85137b69414bb0459f9b172613351e7420d8a27057e460187feefcb2099320b83420377e569e12062d05bea9c9ad33fa5a582041f19bccca141754c5d9a0510002a286cda1349b43f6800af2d3fd94a2e08578a801d38c4749afb10146ea0fb08b2af7cbb3a7b2ab96aa8ab5c4beb70a7de119f72b14351c7af88fe8d3c8b3563829f91cf0500e8987e5bc570e69119d6d1b92d3bfd64db642b24fe0f2d4f27d94100925f9d5f58a44b22e5b33754ad8587551b242a23ca11b4d7f8e36973383297da66b32a20e0a47a04f36b67bb947aa8f0517560088797f2aad452177fcf352e36f713d3ccea62b20ad8e19d4f367edd8fb776c69c78be8fa47aa260fb56acab1b2cc7c0eadda49c3b7a5d0296fc58ce3c356f8566064d30ced31b6b70345db992ed161a022133e09fc226be1a4cd222feb3a7c4ee990e7f2ec5076166d110fea2224a099c1ed7253e9886f8638fb281de1967acbd9ac724cf39ac6963958f2253b3a9b4413c571321e5c3d9f72ec195e24ff7655a6f41c7b61854acf1e8a1cead897c4478e37d534f8f2688608fc703143d9f164d82440fed48455197320daab98a0ae0ca7b0f8dd080f72d261c8c767ccca7e81f3a98a47bb3c781dedb9c5d7e9f9db1be6cd668ad9e7ef2cf3cd79421e2560257fe042f683f24644c4b169004b17bdfdc1e9a8dedd303fde55671050b68f58c7d385158bcd6a2216bea43ea54a6ed91acf923a49806cd76f0d423724247ccb01a4f47c6805f8be1c321ea1475683befb7663854b71f2586761db383cf652394b5abae22bcc225cbda56d5b56fddad2284cba345500553550199e9dfb9ac4260d6b44e1376e7b9083af2ca764bef8b529b912a206ea29f0a18b08f2f0803703d05d2ef42b8b68ebf6b5e92ff10851ca68521968d16dd50cd44ca6b1ac451f753cb6d58568917ee19f301f5f7c686a947c9e1ae33529eb0c80b4f4749f6801dc9afed52f8f2f21f3e5c42ba0676dc7a5def3b3cbb29cd0520f8a7e963a6772bc73abaa5d0f92f6a552e8babd5276ed70f809606cca4539800903a1911da1e6877f23c1985a9b61786ef438e0ce1240885035ad60fc916b18e5d71a1fb9c5d1eff61db75c0076f6efb29d12c53ace654e800ee722ca2ff98f2e6b248c8f31c93870f0083281d42b7d9639f4d50919c0560ffbca2ca37f69455b366d521e843113883110966f218394b2614b8ae972e6114892b30918ee4eedf4df611ad81bade394578d0218ed73d77f9983713c784b12d25a3e22bb1afefb73bc8c415c86942b3dd9ba002fa690b856493902827873cd25c8c823da841dc060546b500c53987ced4e441b13db4eb9eef6d8c94c21d4c2cb54fd672798000f334d7ae177f10f3b1b0ba7ad55fa225ea238ff3ff9d2f2763b852a76f2e56a2a74fe27502fed8d085fc841416691a0090875f8d13c2a6169eedfebcdfcfaa0949ded1d4684a7764713dacd81e6203c5b8a446227538686105ddbbdf6862637e02690b90f16cd7f89efd998b925247bd8c00ad79d0075f50c10ff2d6b2f16b49fa79f874466bded334c3b3f81d41cd2d3125fa5bca38712bfa0b096a6683a9b2589500470f4f763f5a1862e665387d60d29b97900bd18839d75a6a632c21050145468bd0f320868238830e1c123e3f9d95e8eae03cdd8bc381837b89abd2677de81301d89be7f5e5f78c1f63cd5cfb2ba2965d1305616211200ea6a48c9eb76f6a84ca27afacadb0bfbbfd833e999953222d56f00d67f56bdb84527b768ddd1ff2214e85d675952bb79910440cfd015d3d333f40fdf62c19da6ce6d712a8c2d5a973f6bab84c959e08adc16edf901c911a327fcb7c17ef62464ecc8008f64cd9b601288dfe389550d97f76c8615bd036e2b17e5933d1269047b26b3eff7f647242534dc850427d8a5398981b38650696bc39a4b2ca2cb9e904212bd9a04cf3ea75f2ce31557035949e7f902f0cb6a7f7d151599de83090b6a62374189264df8776651191b6cca6b6e1bcc5cc865799a2498105e435e6933e543eaec47dd012926e3480af1b5eb63845d89eba4d4fc6df4b51104d5b55abcb37fc41a50b96725284e882552a2d4e61f15a85c00aa614f6ff4ae2a1ff85bea377e49683e2c0e911e1087e498e41577a0dcae1a865656d2e8ef3e3a7cc7fb50f3b7e1326aa555e15ac1cde54eda2b7cbc3b119380593b8d020d47c29674a7957ab5321560c5eb8a80ead093ef059589c399697399338dd24dc7613ed7beef1c3f0ea29daafe2e1102f4267cf3e6c20359701c272b65dc372eb6012bdae74049b32cb917b3de9c095366360cf80e6f9dd067a02ad17085402751adf5fa8e39c26987fc2015b7c3d814c985c055dcccadeae8abfb05e44771ba12de49b1243a0ad4b8d2534b3a1401a986ac33a7e287b7eb6b86144321614079720873b949df778737d21dbed62b1aa4360fd368a01f306468d50313b88140c807b3205d5f88bcf36d81dc0b1c77877740372c12a601cbe8890f53f22a15d7384c74cc37e5c43fabf2583a9a5d77eca54d98ba3064cddeda249b6368f69d884ca8b3d3b36d1074034ecba5f749aa9ea0b6caea3c5cd1edcbc40fcdd29e96d867b4f6c36a660bfebbeb62aaac418e221c044448b0febc7d4fffe30fd992805c3be9c437b7610534184093b513e5a12b59be7b6218eafc11b920ab85e862e8681bcf829d44deaac8baf -MD = 735f3f0ec0f653b00db6fdd424eec183433cd77461b21c2ebb8a42a0 - -Len = 26648 -Msg = 2a243246bfe5b5ab05f51bf5f401af52d5bbaa2549cf57a18e197597fe15dd8cd897650f43bc034a902036d6c051a1d44684f9390e872269bdf795083bb3050c6f904217494f5d0506cc0dc0af77515ce3085760d76f9d619b0a56d69f1b0f2775799207d8860b04ee60695cca5c071335b08c42ae6f10b2afbb80a93236430474b91d86f9495470d046125218e60b20c3e25f889a6fc2838170da2bfdeae8ccf3b8ab3db380827134e5d049a1fea4ac15079adaa457fcfd9a922d02072048a67bde04d40e13db2ea3a56bea6e8d1cdfb48803dfd20f0648818a41d658c1a9bb9393eff212eaa8d0a5eeaadc8679b9e027cb63402e80288bbebfde50f9b35433c33f363fc8ed307ec02856c7f2acc4d8f63a81a5c090aaefda98cc17f1e09135934a9f653705bd617ebb3755b80c84eeaa3c27b48f28d39b5c7fd2d4482ea8e98c1cf309671895a16610152ce283434bca381b18a331ecb7ccdbba2f0787e078351df9d6610f0165008db8f477f84716de98267704913d6db3134acf35d2820a16b67b712cd349d5d59be8568052da786fc3107abb320ee398914b5ddaf7d6c6b84d3f85d04bb51a6ca36cf9047b42990421a1c8cefaa74103bc8480ffdd24d5a24c0fb8565e8d5c4d0b0d870b5ac7a0251aa10a48d34fb07cfcbfe1aa6eb45f5c19b1b2c5f618c2013c93a59ed7b3b65a16d7e72ea450588cb9c228e691cd8b6f1eed1c25fa9f750f9fc6fdc3da4c022c7d0c088a55f060ba5b56fcb82eb98162c18d9e7f516a9dff9b6d37844bdcad22b7081463cd78f08f4a43052a2ebe6abd6c57dfdae5c1605a9752fbe912a9dec52c93b4c2f6303292ef51ec4377256e098615883e9dece9a7fd3beff918fcbe9b457590aeb75f4c4bb048590bf236b4cd778d40b361325e6e34f1bebc431c752e68754f2ff84e6642f6eff38b87386591a688b04219dde838a43c0e3a7c532a06fe5d994da146a9002a0f63ca1f75a8de7dcd80f2ad33ae8bb5e3887cace705a970f318119b8d3c0cb27050d0a033a63a632657cc067dd9f2cfb0d389b9212fa124007182cc6b48eef8da63a6f4bb8630c059ddd60a0290f25a6997698d49d076844b4fa91d2af52f6215445301557145fd2fbb1aa20cfc15bed77e250ea70faef79e588c76116a565ae89adfb1488f03807099a0b7e144e263c22ec4268215d3e4bf3435c067d0eb471d0e53eade07f1b2e41e6e2fca92e1b2f24f4ebc240a6cb5778cace1754e76917a47b6965d0297fb52f38ef40f0b9b112e8accb7d31502d18e08f7c3830d809fc8ee109c0ea77ec484c008ecf8d997e93f874501d85e1ca0cc4f204cd83590dbceaa6ae4391f2d73402ce201cd245da3eeedc1817b0e428af90a2f66beed2fac5624cb5626912c724fdf261ad51376a50164481f034dfdf7dce02af87b5de47a26033bda1c2604277982dc1e59cf69594096e3c3ba42d34f3e7a1bea58ae37ae08f0c25865063cfc85bd0af7a180be2675289955e6164efae77f09249d08b0aec19369b847585c573d37ba8cf54cfe7366c573bdd0f0f6609f98fd8d9292d8e31c9337e20b45eda26799f3c59d5eb0aadc1377e3c0f952ea2e6dfe0f7f7536b5e09935bef8f47644cc8abe8ae0dc5c329fbaafb0fd59eafe5ba51491abd8538dd44c6935588d7fa534b322c308ef8b737763230ad1374606efe947fc5fe4b5d1c255dd2d713a902d67bb27585bbec3d52cb6dadb82bbef68b3e0a036e3c1e6eb705b998f8d2132442c4cd53122728fc0855adc09590f6c8e6c3326287f966e41a607a344f26aec524c0b3537a432749c4cf8317d9e5845dee589e2ba7b8bd33d2e010533e83e47bf90a24e502b27fcd14737e22099c103c2e58bdad51eca9f45cff0c743b9c5caf3bdb92865fd78aec73fc0f5d9926f2da133e1185fb17859c3507cef5eab26fd579ef7cc5f634e12e6fb3a758fd08d4be29832a4427cc08a1e7a4e876b088a6851fa054124a5d1b197454e672c9c41e5efdc268464c7c8b9be150e96511618944a988a8f9e0b281240e3a4d5973eb3842fc766c2afdab86e0be96425fa1ef908ab412fbfb3dd7cbe4b9ee3c6b8fe0daf0a209a6609fcb9326dbdf63b4d67544cdabd9cd84d62f43b1e3eb343772374efe8b16a765c77f38b4c5a6fe0323b52e941d478e253e3b913238bbe53bcf712cb31407cfc8f918d041089751c91e01b66464e6ce6ada8f2cdc04da9fe6fc00fcb4d967bff8a93af222110b0f8529fd64b53f21fea43f9c8f25f4b1f4c78c79377a57b0d8835c5836fe7b7ca7b5ec0ab21cf893af9fd1e6309674ec646bf54c5589fb7da9e786e2e72cb4868ae9b8bc36e22db6418c35eea9a401e46f32dafcdf5a4118b493bd7dbb333893597f24846bdb3b046517d03862e5183485ca81fd4d61d52c8916649b0bb8844d6404b3e5c93ecd087ab13535e4c0445748719ed02847042387fe10ad511333ff6b18fb62b7a3403d02f6d979b7cc02b717e69627e8607a9841a9462733d9a433bf1a4f8def9f310c9e373166446eefee8497ec47164484f546b679bb2c827174d07744c9b9992c019d10e1ae233f48680ee425b02a79dfc4e7843fcb9394185d5fee6fa8ae077db690124e93cca3b8be2779c715ad66d771d4b0eccb1184f537bdbe149d5580b2960799ecc9b932bd5b5eb734ca0791f8967ecb254c1eebb4ae6a84f83a189b671a743650b27172c2ba253b135fd191dfad56115dc1241ec32bf6d17ee19fae17de56760ee07dda75751b63d74993dce920eb421abcc9c4ad3ad3021d26233f213c3eb76bd646e021f691cff519b6d9a18bbedbc0b16843df459fb5579a7bc53fce9d991bf6550a74c938edf142b31e9568312d04218832d5f6ad59b2a0e1e6a00fe38983d330dfca67612c504731223120f2d4499fb2082da89c7db2cbfe0a1e6ab11727ff52d6bf4bbb3996a9897b01506450058e7e4a42e5ed7fdc8e38a5f78976b09cdd4365b000976438ec549f9271163ecc70355fc23900fe946a2a40b7c6a4e446ff8b234900965abb820ae640fd88ef02e78fdf080c87787ee23b70fbbcec30bac88285d6d6287ba30d1505a9702cef4d46d64e90fad16c0078f4ad2fd69d046cead21405fbde4563d01b74485382be0020b105096e8f47adb0de6bc09e380dd1b8e24442dc2856829d86988a221ae9c007a8b8bde20199eb0c61235a9e5d8b9dc54b9d1a11871d93a7df090b6665e1016e15d04affe8e15cfe256a5a317e2c05826684f8168b08fb919d4c289ae44258c680c21d02a5ac580883a74c020a5dbd92dba2696594b74eed39b88e2a266c1a939224c0b4b85980be0470ac8a929f3a59036bfa894496f20d4cf498be9cecdb67927ec26091875b71304d0835977ee057865807fc0b2679843f76c4a2c8432fb53a168ea0e1a43cd49fa2cb9d996b6410dcdd2e2868f469f499c5be8138ed6c0ed1a2a1fff93ec95a9af8731d08e31a176f81e9a8ee7f37b0e457d2d45f6a34d6f19998d878b57575cad4ab4e768496ddc6eca707fc25674b97a3ae06bc480e902271dfb4c0b6c5b8a7cdb0ac62be5ec66b54029022857d473c4facb2cfe54dececb1e33f61a13e859a2a4fb14dfec673d57e690be22dee163a925b431ae0972fa8d04fb2ec13448f4a90b4f798c482688dc266c5cb7d3e5b2b3236422db86eeaef5381c9c07b7c181197acd9f3be07170ca678483f01e26876a5da3a68eb39a148c205ee7f4849c2978583e2bf49c901dab10a1dcd3a7ed0b55393865ce78bd51d92588b790842113500d6ac8bd64cab6068b8b0e6b578165fc20ed08a3bda09064af64b6e49d97682801191ca0206964643f0ac2bd142cbee77b8837156a8cf7b627b88af7b8484f899c13cfa4b8b34e4c94e6a0d3c7343e9fb0d2992d67c7ae56f34ddbd1be7af1fa461f8ad114f19d46f2e64fb459e20cab2993d7f29c99decc7deb527b957675036707f5301d6a78dac1d47868b07e51934c93986df24cafa12c5996fc2784042c6791b7c8b96808916976c2f8b65034e0839985a44f27485c6761505c5aebc6feae8678a2d13174f25294d66b519fde19356f46a19d71d28598c928a418f5e200a4ade2c44e0ee586e5f85bc96bb577c6c9db826cc27374a5265ac5db48e881bbb1d09b38164783d38869fa1aebd8266fa9a6e10ba875574379dcd009d20dcab53eb54b0613247563a4ae5b67b951139d3c980d8835bea2e7f917f0369dace678b1259b342bede4bea29025b7bd6867d7ea78abea53987e190ed3ce6b930dfc8c74e832cc48e9f76ae8d70113df644aa61b10663ae949136220d712b09b773577edc6bad55161d7f1e04b9682078fe3913726e37fde1a884997ec630b9d34b9c38687d8582e9dabdbf1b38d0c1d2f5b20a683cdc11c530657dbda6986828aaff7a6f2365cc7e59cae82d98db9098dd9dbd1efca098a3cb4125469cd2830c23f9cb4d17ce90481d2f4fd833f92b3f1864b1e31825e101dbb046a6037f9902393391aea5207cdb87434c97a4a9e03a28af7f6139fc8963d42b586894e028af7d0563f055ebf0ad4abf74e8658e6e2ea0c67c25bc64f04e572ac0eaabb4a0784217c8bec4b18a31b9ec4f46e0e70360f3424e8d2a1fc425d73716c8c26d9ed14ac316666bf1b80d6762323fc1646e95a2bb5d240d8d639ed6c8c06f735b826ed9900383a -MD = c034c032abcff2da1e21f1c210355b929c6a9fd188232721aa13078a - -Len = 27440 -Msg = 515f1be28acdc061fed8aac89cc2dd99303825fe87e35a01d33ae3ff509a795a28982d6f9596adc84594c39202491e51927255d2dc6b29614dfc0b3d7a75de4907fdfd04c72780bb24c6bbfec20308505facc722fecfa2034488161122172eb3b435928a69a9c1a465169bf3231722fe5f8d81d733384e4d80850c628fa7f400f8e9f5e7c343f9eace2b6a5b6eadf4c459be8dd7c4ceb3a8c89cf51a0a4eb5979bc12c051d1eaff528ae301decef070817e7f30cf9b85b7de575da20db34fbe2656441cabf616b2d3a46f521e203e2335fafb95d191fce32a0b7c25c4a804d481e7b3b20f035b5face9cc24f9b110eaefabee9b16e2a9231bf0ab6b69f5b34318dad23eefac216c4aa579e8f5e4211e0b0bd8af23e0231e00a18bd1621ec37057ba3001c232f15f3972092c972bd75304854a507d2ce33a94b86df64195cde2db005da91b4a53bef5d9fa5e520abc1088c2a41d872b71ef348ff2488cfd2b10ff47aba37f44b0e20c47bdfcbb0347ecf42e8664d65e57c25ca29956a8b7739140faaa7f52d4a18ef945d48636a7f33ec33351c4ef57fd4a999ac39f39572fda4c83ea9b3a5c9e1c294ece99695b568c927ba6cc368adafe67d31190934ec8528e8dec859a6f1ef028dd1c94a7bfda6cde61f5d94079994443e603b95b20d5a0638310dd076e9cc1848b3f06862807360370bf8a91a680b2ba3e0a98055fc03a87de07ffe5dda006a8a3b67d993665aeae32644eae9459c03765a6bb066e20874829226cca5ec11621e11358356d6e0d3b3194940bb56d0347d75870f2ce6f2d40ef00b2294468967cbdc6250f3f88f846c8c0f91dac32e2681da0784f131482fe8a235e97411f0e05844f727b1f5ee63d9269fc78cb53f424930f2f6fbea92edd94fac078b74cc378ef3fbefd9f585d9c19000c81a5489ee9f20514f943a5975a99f79662298a7d3358e7692b31fdd4feb723a7eccc7969349522b7602492331203ca3ec80a5081c15c071f7879c7d2b207256cfe937ee9a106d88538d3e7b8805cb3283efc2787af52ef2069d94edd6283b5ba5bbcb1769bc1a71ce7f42e6e222f72f12b5177e559e8304a73c2eb6b9cb7351e788ac9b6a1500eccf1e7ceea73d65a1811bcda215d965acc2ae925f3bd1c3407d99010204e2c8043eb4151a401fc090b8690c6c226c7df43f39e970c301d2314e36f3d29eed19be038734f21390ae059ee7fb65e51f72e306265b72bb24492b44a6aa95a2fc9c2406df02ff8958d7061dddc314c4bcec8100bd0fec8a02cf3746334dd277d8f83d3006a7c80b3ee59e1c928b01280995d713452e6698630d5c3d2304128549d61167434ad6ff0b7dd2844f7cb57ad012ec2808df684d0faaa20fbff9dc3417dea994dd13afce8749ac3b5cbeb720d70ec9284c4b7b11cd4f11a54f51b8ec09b70ca01d2bdde17af1332a01788f84e72f74f95a99264c67a4b2e71b372e15e80a42714bbae89fac1d6f3986d3c60cc71df7857af2f266a3508cbd6ad1c7177c7e54f1afe7566fe574695132f6e32241815ab2f37e66c74afca71086470a5a8dbc490690dbb1bbec9e28584e096e2d1b03a36a0f640ad7244f0cc6b5c28047e36b299a38be80ea8a44b4382236f0951e4adc9414cd66fff8f2c2c9406aaf444534fd94edb74c64870e16d7f6a3f0c112ff0c184be003a5908cd1ff6f6621ba7dbfccdcf8ee9c90aba3551f1278f61bbfc93cdefcc66833b2c6425289df5e1251b39e5aa18cf8d8bdac79f6bdde8a0aec5173cd6fa61d0f27481ca9d8fcecb28ab97bf62fb9e8a387d08b4641fd35f6633fb9cfeba9aba3b6b967eba2e65504f0786c98ec9cf55acfb892f6e4fc7e47ea3a16cbbaf7995529c22c0230c4216e4a9978281e5ea6635e0b96eeef03ee664aea93aa22b76f8f470a72d5cabfd65a62c3a88e0e268427fc72a016aa3c0bb94bf837526c12b6b8d73a414cb7fffe2ffe9f03b2041d160e7095b6565ccd60a9b40c0bacdf2ff537a2f9a14f41ab2055e7d4917c476be481841be3964ede729f4fcd15a0c537b47670f09bc6aeebc534e50b5ad5213776e6fead2cbec998cb01e2e45f1764517bdc08c6369947e97434bfec67a3d8a955a6a7f29bb61322f23836f8f1f706a6d3d134247bb154cab5bd3f1ebfd0b5eb082a4793376674a56fad13b2d12af15d43bdbab270f41db910372b4a6a42002217d9a63708b63649cbc740ba09966d9f540963171f4be9dc0e0a4c1771e301790b1a8b87178fa0358ded87b7a125c4948c1bf7fc909e025b369e6a2edb9900166a57c02a6bd7f9923d89ae529fbe3c63765c3e08cad6ae5f115b4d36b04e4421bff70bc90c788a8763027e320d481f35973400e4d5d9361025aabcd8f8e916c38f62350c03589b3d88c0bffff2adb331790c0437b991e295fdf180bcbc52be2364ff069a576173dc332b396357d44180a34a13aa7ee5f9171e9961890471846bc538451c10795c8bedabb30443a510499d58f5e52dbcc5bd120b27e8d62eafc03b74bc39378a9c723da8f78abe086ab5f09c728fce008cb060ae9a803c71894c4d1c319ad37b7cbaab8acb9ed1e595ec238051506798971790e982fa3d22583783966de7ec34448bbfb9f8e88224da15be6a5cd2026c2e1b2a26a6fde12965a9654b38c78b9d3c0c029d460fdbad815849c459baa66498e4b7cccf32316ef8c97ca359e2b69eac66fb9e7cbce468d2de4df511b35c681f99bf43c54034d959bf4f079ae1781fdbc033256496a43e15cf52654c632b600962c8f250d1f353cfb466ddc16cd60812433098c44623159153de7cd2721b349f685c43388a74c2a3d04a8e972ada4199177c61657369d78f907ba26a8934cc29d3029d4415c1101e3a8283e4c48bb2b8639fe60fc67f6a57b1b03fde507f10efcb43683e1ae223851b962370e1f144b74f1f9189e66cb831dc05bbf46e03e93877a50dec40dde5239a0fd5022a15dddd0586c99d7d38a7653a037e758cc83d4effb2f21630bc3c3fe074036447fe6673aa5bf51130ec213af231f02851d7f6778cf2808692871220144d145cdfb4c8c169277faea98e0df92c187ad76637fafc46ec1f030d444e0f5f2370b39a40e90f6871ce3c902952eb123e824872f033255428385449fdd854e97c7f3122a9b3a5cfc14a838cc2da55c92d72441e0b8739de2e3142efb99837d9e3a89d1cf70dcac79f5b4a46638c827c6db093128fe0820e877495a781760057dd56c03333dec87894695b661350b95184a6fdf58425460aba6715185c5af68df4ee630d6410e50927dc7c93db0e4170fcba4a6ff33ecefa4f7489eb522c62a1afd94c52928a6aa2e11c7675c1ae63025d56412ae3126207ce02bbc76bd48cbb967f44abc5349f6d499111b5d019672f2de1accb5c8b4959c0787155b03abc04324812c006f6cb8fe7a414fb0d35951ef6c351fd6690cd17ad40743d28463aa30a9d80385cb8373343bb49ee82eb34f83f63f8660a0a34691bc18c26dbe14dc1a7e454bbd0622c7fe640763736248ee4912b6bae4fdfc778946380b8d2f13f868f8757f369dcf09b5799647e31c6e90b7382717e3ef8ce6c9f8e1a9c145f56194cec51852f0ecbb01e30db6a7cba8e956dd0d17edd3d916dc5aa207aa914dba3667d0a1c2ae107e6c46ba3a31ee9c5a9077e5455369657a18c1f5bf99af7154b63a0495e633beb64d0b483d21f3ad66fcaf2c2ab51ec6a337f5693c2eeef4e3acdbfd8f3e106be53ca72449f889408103d95e32a3425104923b5907dade6cc972b417d84ac28c9da3a0caeb160e1a4b4e9cf7e78e92b920c02a519d1e0c3d98b068e01b9cd8b5422a9ec89b1af08f28254095d3d78e438a3a38ff8668e6ebb3ee50e2b394b15a6539f799d467df13aa308a94622e73a49368ed9f3e5bfcebad75029c5ad2eb00994a21bb219d384c43f8d1902ce40140fef4cedd3f67bcd207fcf4795bc7f43c30d3c3a8fd1b8a9d77d69bf59eb8b59d0f464315f40cb52335debd0650f45b51de7f43efd173548bd852605121ecef3d56d5e0f616cb6463d9a2b2cfb4d88f05f4a5290c4935149bc804b52f71113c96683c3ee9f21458f845d18c31f1f50dbd15ddf96acec14941d96610dce6c61c3ca5d1935e3087f1651cf38fd9b2da65ebb4922b97dcb861128eeefa060d6c1c94b25eb4ef3c96cc3eb171643361e91616435a461fed7b0a924b17d7275f839c32f00bea0970b147f9c5f37fbb79b1acc154aebf7f8b999425b0694ebd57ad499bf181c9399768030aacc258fe74b488716b081e1331849c51316bb734703973443958c8fc0b3b7bf5e8867658ed7237baf8eee89779dc91b95087a72943b8c7a039f97fcd36ac11500bb85e774e6b38e280cb8558cf0202a2905595084ccba54465cc3429b42a718d88c077b602101a9c85469af39b856dc1635e175df5b29aa56f79bc9e0e470b22d24768b1b2f14b5d88b88fe479d7418a6bf994a6d93e2657996a4fa69f824ca49ab5a7e6ebaf498a0dc9eaa7f4981c51fcc0935f619ec6bf862683b0025cc48724839bc1e67aa3c686d321ba66185cdca83ba9f41984fa61b826ef56b136e13f1239dadf6e03d877866ccb887908917ef0d33f117b614fd291e3e91736b15150e650db9bdcdb56317f0f5ebe97c938bd691fc91401b42576c606175e0d5c635103612483ad51bb78f33331c93cdae11c6389ee98470e19e2a6e5e0b7af88b5b41bd33c236a1766b265611b14e2cdf91092aa05fab5dfab9ac70bdba097d6b6fe723f88f79d9ce6625811413e24130f3e58e8a5d7c8993903a8f07e9540b6f5a4b8fe917cb242b92d4de -MD = 5e82f3d3fe344c0b4c05023e58f9f81efd31c8caed10d535fb800867 - -Len = 28232 -Msg = d0a43de391d492746ecf322acd6e5bd78839495c4b38b51d3d079cb2e22941e0409e75c740b8165c582ad61a67623df5e019f2902b2836af489db1efb60e71b5932d3064049dd5d3d7043efe67623dfbc0a1e030046df6c40e45ce5354d242e61278f422a52cd8bf3485f33c961562d170f99da69eaffd42d5287c46861ebd5b05a84c69ea0c260ab8d47c3ebc24b460384ab158c1975413e66d4230129ae8fcb4e4bda19ce5c79aa81a616aa1363b8e60bca2b035cc021d893da979c1edcdb26655d1328361c4594f7e2b2a0cf400442f76fa14c1f70f4a05c038895bc0746364230f846726242df42961e5c7050a6beea140ee2fc08480a41d77c9a8bae3f8f775ffff10dcef00de428b02981361e9e664fda545ce68a9ac7dee9f7084245a65732a0c462c2eb956f231eb48c30ea85ce8b8a1cccac3ac660726747ac53f6ff6471711d0bee840a461dc079fbf188e9b54f94a8b5b9d711ae4a6b18f263a21f4164e787739257d10b613be64af8785ead149084c2affe0103bf6bc774f1f57a50b58a70345ed58e21a5f78613a647490872e43d5dff0e18f359ffffae7f6f9534bbc083c8b49b961b4479d5c09b642d69d3263ef21795ce0fa28e0df97c5ee44010201e9b34088d6ad53951ec485d9043cddd06298a1394cb119c9f0069620c053b3fcd465dbad892c0bc96f12d920628bb6f2f6ed70601983fb21f3dc707611695660c3482110c25af89f169bbbff37b3453273c8eeb98f975450b1c35cd87e6c73957f041a99c95ea180dd08325ecddb12f6a0d0242df816afbef261602e4e849303d042ce31e5618ed58a0147256a2ca6a746ae19a29a2791d37e5e8760cad83d127daa46be608b4804e62d013c57ce88ae2d0ad501bff384f71c63d6573a91f92a50e3892980035677b935688cdce840711d8a6133ada10f92961857f9e6d64fb30f969f5b8ef24094cbc084fb40a2575aded9c41fac5abb0cb224112f15d0c815836a913bd17f8fc5e3775e72cd2554d0379d06ac06460ecd39300ce210a7ebb8740866b093d3ca71cb02fddac999bf3af27f30c4018c923df2e351f820824004aa1726a41a1579ff490869197d262102d526494ee755cfc4a7e6e75b8b895062ec40d9feb06e25d92631ab1931f2008fa93b5931fec84ccb1ee0d6f199e6a238032b88a69b0655662927cac02d28e749356569578f0e91b8207a27a494bebfefb87f3b832304910e1c8fcef8b8ee5b98434d7fa7e14e26f5755ce15ac23c2df0d1e4f87f92916139c514c0a81b6ce6e4999aa6093eb194e8e52d0cfd6d8576a21604c9812ed44e4fee5ca7b89fcc0f9500f5e365ec5f62fb3895b174dbc4216c5184b57241f6dfb85d0f8b0f89335e13400640a3347f1895353ed6a7541fb7b8480fc438111e9ddddbd6749724cb5cc72174c4ac5e393e1da6cd867e22bebfedc44bffbce7750e242f596b37b7bc90176be87766b2b75dfd51edc6e18ccac1728de06de60a23bcf6233f77d7892e836ce50962ba781efc9cfe44a0b8d96b46b16b77179fc44f2fbc7d30a15fe348bb2f59808c90f799a462777a1beb52c8d51126b803cd5b21eddc06d6f0b80d32c2c68df4fed1784ddcb783383f623f0af6fa854a3b5918c280c086d66cc84f15209b490ebe6343652c03e9261506e85831d452d6c72c435a70cec5db1d78f1195b145776d630a0071cae72eba4bd94db0f085303ad2d241043708a8b0cb13a65fd9b7ed34d1fd75c3520e62ff5708cbb17fc517af743020d830d9e8e405974228e9785cd2c172f8bfec20d9c0e08191fd21913e2ad582779b70cca8dc159e5779470350d7a02f1bc00faaed8f96b812fc6c763e4d553d97b68d7d430989ad58d998d563b3fc76619c131938bbe830c157d6f0728791b613b1dd5841ecc038e8b2458b0ff844ed3c7cbd0825e633604f67f77c855a09a07e25e6ea400657b579abe380aff507f83f1a63d44f8f26eaffd52496e1353b71298b40afa7d6cec77e2ed952de6ab42bdbdd8e2a1037212574f804bc10c995acc84a511503ee83d378a3cd8e25a9d7fc853eb266024ec0a421791e789e57a6b7bcfbbeb6ceae156dfbb3067ef032f1eeddc67704b05673eb87b0b848d49fed368a07e01162a5f1fb79c53ab1c8b68077480d22a284eeb9603a3788996de2e78db2075b918a66b8006562c0c33975122a566b6bbc0a781fa6ab85f606c4c11431b77287c39050c61161043f3fad2f058c7b79a8bdbb62f5234e24970d73caf1c72cc1fb340f04baa2df321c63be14f8f249a07024126ff86aa48bd219f5611ec2647e3c4f60e2e4394274deebc6f76b002388488b99df97e141343db8b413e998012fb192308c01493d34fd446226ba4aab999850cc32422ba6a630664a63e0dc852ef188f850605711fb0dfa0a238516444ce610242885be376a60af22c1a2e4632482b012e0aff7834f7769498e5a17801ac8463bf2d0fd85f9350fd7cd9e642d88db942abd3e8ee3aac03e8ac787b2d19ba56f7e51c27e24cb33e4d3d831c036c462a1ba369aa1c5858ed6585fbc6ccb4804086595c8c47658c3da91821b8d217fbe551bed52b4ab7829cd3cc756c9df987a8d7c6f5244fd4a8b6dbb5baa1f7003554afa51e55c07fb278fa28ef54e81156f7b3d2f0d944be8f0fa9bb56c1ba517bdefc004c0ec5d770e9a1427066f5247696e22554926c4ec7b2dcd3fdff622f56ebff766840a2e7455792c1008a0b596deb2c68293711a9da053ca4b84339c44de381b078d2a0d8b82a934ea7a874d8c560594377af79fa507290d78e758538e82f4a5687ac05d252ca6d916ea876ca055c305d47e4ec67af5fa213887e8fb3af35220f9ab619fc999fe8315c725a57b6477a5fa0bdb41881363801ad449f5c2b5ed183bbd8267f1712cbd77aef68a65f88fff08b2218364d5e1b4805b0fd5be3121e5bf1fa72835489e02acf05e7e0888987b90ffb5fe99c3f139198aaf0d95fbad33f4504462fd76dedd3639d212cbab1da623430d258f541e7846f1bc1fe28bcb6d6bddeeaab2827bb793ea05cb37b68bf9202aab9ace0cc61c891e9b9f1c58290c96470a620cf1d12c569f4e19c561600f1824f5c0ce548470606fe1edbbe7228bf3fa3c2b654b9b95feb83f810d0236328bb0802a18d1d62e5d74038e39cf64861585d859440627aeecc33e83773f8b1dfb5bef4935fb37a0e0b995132e675b657b68739e31b7f1b1a14eefb38c6fbb1bd79577b09e4735728aaf0afef24573b48610a24ca6b7a658dcc9b773c51952d6b0ebddd2ba2c3c0dcbd2c9b43df039fdd62cc8e72baba20ecfc22a56a9d2eeb917cd66222230c7ed24a375d569de3aabdc0b7c1028fa714e2aa6bcdeb312fb5d6cc8c5416efb75ab15cf83d4fe95e249083b204a373a90815e05d37e695fe51e205c5f92e8c2a1922f857835648dcd400b4a49e7ded28c62da5e22a845205875e2f6b9b9384cf86cc283c769544c583b35977d8b7858c14d302e1f0edefab21f25365806d5f0d6858f38f5f316482f9517d12fa7ac33dbbaffd43cf48f457e545789bf0e3a34b866d623886553079fe83255d4ced30a48368a1ee10bdea739d00a6f5351ddaf3a9b47b20332731135af15b401539532733a6f3cbfa7658660fcae55b96448b6c99d4482daecfeeb8d44226a39f85b42f9513fdc2d798c698044c3eb55a803f1e1e76d1483e76f0d1361e8f6e30fadc256f55c6bced4ebc71432eb8ebcaf87d7100421d5a2d44bdc4462f9c8911c0526f8a14569f86bec35996175ce52ed5cdcd06df3449c160dffbcd1a57dc8afe9e77aef9b655e81062b8c3af318cce3eb79afaf61eff43f3dedc928ac850e2dc49a3a2abedc45b6d22f6939f3fc6f15cc440a22ee362fa2440d15f25f6cb6383da5d30d303d629fd8a7bce8f8e7ce0577b27c6308c5c301c8f41fa93e936531bd90c1e19017198e722af3c262797e45665b730a421d42b0252942c7da97afbcbcf173524ee7ff25472fba40d11fd43810859a730a8b135ff1231bd8b3f7da3bc43e83d9dd2e77d6b03c5d0ec54984501ee73f27f2bdd943b56827564b2299316bde6fe2bb59182555c76866af94e34fe9f6fda37b13f90dda6ee1cb10a651200c5794077a065483905778f2f0609569fa2b3270143bf730e8add79194f1869a2e409ca299a4b1940872fb3e486b0f50d7ea9a184e84583f58bb755458a2ce125a1fe65e8ac2b3b916905b9317e2b5770beb70f69a8b90abb30e578dcc388c0b185c1d95cddedf75633636bbdf862c4efe7473b578b034e8702cdaa8700144e6d17b8ee2e357995b46eb08f31fb3d86b283c0ebf79a0c988288d8b3ee4bb8d582df4c6b06bcb75dd5a153ee3490a4e4e2198ae8f1dcba2fd34a6e5ab8ab5c9b1865e51a8b7b9097e154b6506fbe7f25a7320dfaec5af65da4d0f8688e29e8e95532ecc16679ea8aff0f407d898db6922855b0e8901aa9681aa3dca617cb440764cdc7293fbeaf7f585b593c2b0531738e0ade7c8626b9995f4a84d9fc9b593d6bbee01abc53c5be14bf6956fd2fd81000dafc7c768610389b4d56cce4a10dd3938e9e5c883f168f5ac4d894a61294b0a74b73b10740948df535bc4678e4491003c468b6498a883a52f00fbccfb64b9cabe7abe3e25e2fdf96881d0e606cf63ee4e8a8f1a83d050626ce74961f24e61d33360cdaafe7c878a6d1e1ed4341faa35d82c5d54c5f743dfbe370ec3f634e7967bfff5d15e4469e4c956fabc96c3f87971b272adef8bc25fcb96c84d67b69f8700aea36bc5c939ab05e31109bf4ab34b93a36b80511c7064ed7ce278d7521e4769f362b4d5796b4fbb38ee361e128f1ec685a476ab07c2a1cc5ff9d0c585d83a0074c0570de3733551deeeec23b9d05582cfb9eb4e0c3d88c0c68aefa2c051f17c9928bccf75e61e523b9f7670bf1b9240e81868ca68457c633702200fa00fe036d72870aadf384 -MD = 4400a4675f4a2f3ea0ba303ecc354da665cae6fa1a30dfe1556d5e39 - -Len = 29024 -Msg = 96e237bb18f47db8f32eabdac743f7901932b8e39b76cb4fae7d35d1265c09414dc18de22a29983803533e1920f4af07d2ac5dbdb4395d0831eb10d846570297895012b96b13d495bac233736a145be6944ad65cbf65f4f35f96718e9bf6522953771069621af8772063d20f2b0bc1d468f46ae7446258b740679f1bac9fc09eb21ecd1997a7ce883e1e6216ee40aa7a54926286cc9751fddc46e4a601bb169eaf2d92f293201c6d1bdc2daf381ddd7f630c0663de6ea76d3c1c865723b31ad3518ca71cddefabd1bf8379039309248d9a4a9ea3024e21ae67cfce5799ed95e2a02454befd7a435a33fd8f3a866c454903357271c09f8969654904ceebd34e76a4dbe1017c2babb07e30b77b9aaf095da5b3caf3a1caa5453f7070e4a2cc0f35669a950ce169ad7ca80639ee5538387188aded512c353eebfc2e5abf453f9ec7ed4aba08b49b0f66ba665cbc42709a2cb50c24b4ea491b02a46a098a5c96c4d541d1961c7e2b9a15bb37690de6bff63733b6b744616e0633400cc66b703849076b197171c5801632b363a808cb8e16390a95ee281b0dc526d6fbd98a088df5047208952e14024b64abd161d67843c0db43901089a08c218271218a10acfd90755e88497cf0190154a969dc9e7548bdc5e58e678e7655e2f016652125e4f0e1013880d483e32dffaab81360894b03d59ef879396027ced017cfafe5f039ceb15107d77f6a74a60e0dddb737bf81decf0f8538cf263b61b2a0a3e71f9a32ffc80cd377925a2cecf625223da7679f3f75bf92b37109387552329bf6174a58ebeedba447557a91677f9b8e8df9aa2d908d572ad26731a8717676bdc2152931fbeb66832f0ff32d807017299075afb438e07e527df8c512bfe7131334615f4795865477170aec889d9340fc2c629fbc9f36dd149c6dedffc66db2a53442132223884e89e78c8e2828aebf0e4a0aa1cb2d571b77170ed3f6eecffb79ab026e480bbafbc087de0097878a3b68d3b3de6b4a0ae183d6239c7f9fd795997fe79743b7e10424e0486b5d24ef5d10ada67d235e18d741c1f47322414b290d9a3ab69b8dc810bdd811f70065a5cd10c22ba77bd14aa4b8c1c97e683cf45edbe242f5d6f736c8945883cb0ab4733270f88984fc0b66f1f1bce9e5d8f99add0d41497a7e5bf2d3b049e4100378223536390a3b2d753465f29b9dd1fbde054eab9e956d1a23c5db19917ded71187a7d6c6cf4f597757ea9c5472d6a5754fc57bbe06ff733b67785d81a968bdefe43b3197990d9c0740a6472a7e1d776c449a347f11f40507cd07bf4ca7712d191457e4647261032dba13fffa20041e094b2d856b8ed6ff9dd9865758b67a9d3394887fac0fec175100be27622d4cf1b2e009ff11d21acb74196ea6444b0786b5e13753dcb5f150f7d10f4de0ea3aab1f8fb9f1f080221101093b3c8dd98a821686ff1175093348a88781e404db6f92a5c6a81e861d9f38eb25768a93d68617dc024a39138e0456e9b0a07a3c955e50cc016ec5410ee4db990aab00f4e67ca08ccfa32b2698f70411d8f570f69c896e18ec8896cfe89551810543303f7df0c49f5b94783cce7df8d76d0b88d155633302d46003711f233339b1c9a8c20164ec8a328890a4932b7d90d92d023b548e4820558f8bd327010929acb8db3b155b90e3f10a151c9b623ae4ca047dc32e6d35e7ec819074a4d14be7329b37f93e475a22f39366032bd49939ac1c6bd7278254c005d0c1c3fcf663e90feb5f8ac0ba90cdd6bf13d6e8d51105fbcf5d05e4605d4f3de7905fb3f2f9a57123a26e5127ed5af6e7af2636e64ad045a7b1cde98997fbf1407c864e5965b322deb1227401b840f097887fbaaaaf3ef6301a9dbb509d4ccc75f6f6408c408881670c358dfa8a1640693021c884a69899f2e803be67e5c83be2901e2f1e029c096704161354fb5162b746db04f6c983ad5aba8e873209d4ac30c87c5e91346447594952b8b36478d41c3cf9e483a066bcf1f29c8a416218a9cb008f73685e87b7b83c69d2885df300f2731cebbd93d8253330cc5c08970ac12be8c5f205d96cd6fe5dc9e566505695f499a28ef74c5e92a8f58c611a01016edde1ce5f1c4d9a21b64e0185bfe42a0f7d112942e3124061cda15b2dd848b32f5b7be71efe1386245a6d9f280771d3ba066a2fabe38e443f0bc4b736d5c6967f2f27ceb64dd3b75b653cf140df81fa322b05042e8b28c0770df03f00951301cab365e3b96df6a443614ca664aabce4045592654f4c7a5b962e84511f98b6abbe92c6b4ace104e358d91d3cf7eb6b57ad1062c182a9eb6c38f8217be84319eab747cabfe53976eb18271f13af34159ba8d616977d260478cbf5383dff36b555414cd26406f9d5221de5c2d8cef7544664212e5573334e17cb903905c8e63161e91c7e5f9684a83eb69fc8eaebb79fde8b8c1a8a296430bfb473b461d9d3e6971b213ef0f87c58879ebf61c889f760ca6b715bb3e43b54d712fa3ae0b6827d6b540594c6c1437e9312cf5df02e294fa0a07b6251582b12f463ae2cf0c3744e652044005f657c72f7df39fe005cefa4d7a6f4dee0d9b5f3ae230a1b20951bd20b0c3712197979ee1c40a9c2677a9d19060b9821f10d5e8f5aed9875debffbb0d374894a8361ee3876d3795b942bc404823abfcbe057a74e810fd3dda98896633505a50a3ba32bfaae24332a24c4f70ff2b0e64d6d3d02a9c71636a31fa37e51c61c04d190d1c5ad18af61ae87faa893ce0a9616c642033983ad4b768f8506150d44334121624db84cd17f693c114b288aa469c8a9fb1b764d118cb89791e01550fabad96bd916b4b13706dacfcd7136af1abbc376ccddd89a0f7509b67e7eeb57cc05faeeaad31afc4c728391739d56a1da16a7cb3bacd8e0d39eba7a9f44ff88149f36185be563748e5ce45fa83201096f04e605cc1b0fb82a546b4278d4da4881010b8760d016c089208d58dfc1be5c4600feb502aae59660409cac9fa1043f8db5fb9a5e25bd46a957ef3b8eeef7010b95625753dee2f211edcf17782bf5c3973886efb858cf9d7b8d7a6639fc339e0c2ca17b44299051bbb6532196e8278b3a032df5e3dbb63b8c1bcf77658c0c99d4414c8f680d664bba34f949706831ece290513b75310987379d4ecd9610ea7b008db402140ced26b9d4020d992e7d6f2d8ab12ef0fb42272a8c8907402d45b7fd3c8881ecaa8d99373e0ddc75ad9298773c9e4ecb9cf891b163fe82f833b6e747083a7d6668d0199ebd9d34aa67f9df5c30a9298998853d88ae2fef32b6a67f6a5b3a5305ca5d1e6ced00a48bd01bca4901322daf7080a10ce59d9a64489ce6c3c008b13f317d1e2e3708baae8880efca28f9f991a77352aa84b813214c22c40fb146069740c89f5f45e5d596f3c1a66c0240ebf4bfc5d90e160ff7de43b08d9ab942c1927ab8288c745883c9a446848b47a7933d2bf09a941415a71fb1cea9f142bf70b541d430126cb153ab0c8800b443ae7ddf7e9c1dd8f969af5a38e5afafd7fca27438954cad7980b3dfbf2eb18390c61a502a20e949506c8f022b9e1522f38ac553c183e49a255722cc1e830d65a97ee733a117636193aea4cc1c4060f73ffa67d86f288e851aa52ee4bd2d7ac7184962fe85f832be4da0bf0c8d752998f7cbf876a3eba0eaa3eb46de1d96804447a61c154b3bddcbe8d30c47f1c4c594b56ff5b30255d2277ba9f90cb256c459d225811c636abaf6efb63b02db87cb571356ee120cef88e7ec51c3f50dd6bd6422482088610d50dbecdab9c1cd66a16c7c31502816113b988083262b929eb21fb27e88cdb68c35f74ab1170929c9fe517a5fba49d08360b5c2be9e24e32768d92d390860f66fe0b593c9b14d832a288278628b0bae9eaecc4d549a557209382cdd284df68340d7b3529537036c1fb69bf0ca50f212cb6c486ae5b941c1bcb6876c9cc7d2ff77815d019416df37133eea9df79a71afa23fb6b5f2697e54aa4a853636e4aabdac843f1b56cf15969d181aca8ac62ec7bb8f93b90b297f9d5a8a82d46742d2602846c62a5dce5aed25d898f0f4727e1d6fd27bee8087aa1e55fd1cb1ae50de69a34f7e99099323bd35f6e1bbb51dd3f347aebbb102f2a25a2508bf788cad434c8604e4f1facbe489560971855d26e4fbcb8aefcb02f8dcd33033f77372a6958b491d85bf91c731d40e86e4e84d3c159973ed9476f118de0c0005314d10db49a884efdd7c6f13801fb7d5a84f15abea5ec94d265f5dc11a873d03196fb7c9d42692025893033f43eeea9c38444724d7ae443031eeb98006b72fa3fc55f7d0c97818eb83bddeb911a42f3111424205622a7d2d239f94e4472e506e769a51be9e2f8201eb37521f6de1fe3adfd396ec1e35cc9a980c605c405f57c9049755b1c6bf65ec0baa1db0bd1ac02fd062c6376062bb1efb9fbc5686cc9e5a12e75478d7aa2d104170923b83d12d76af9a5075ed23d100cad3f9618ee8bc984e050e62557240053945400e56878eb5d9d4b635f91ba7168243b81bcd460aea027ac40ca4aa57316f72a7b7a9b07c43cb9c77e6289ca596be6978d3c67721e5dcb325e659a4db3b309359a5f1ee7ec7016c061500493527dbafac380ece9a023938947df90434794921a677d393feb627cdf120f4840e306690c2971aeedbd5a4859031e74b0b71f5a84eaba34374779b2cc9b899df7956ebc76caf5f4a4fb6ab24c9b0c8ebb8cbe28192aff56f98a1c822e03a44de0ee1d78e0abf50539e5bc99081690258d4dd8c5812f35e9aa3bb5b2ae534a9f25787b68f1d65a2ad200b6c5357c91824d82d4fa6501423375e3ab0bf39262daebbbf15352520aab98d6c1fe7cd6f9ee24b41c8d6da9107d80096655a6c8d4475d3ee500ab27efd0b2ee460b852bafaf3a6a1746402e850ef3354e586efe882ea089c038a35ef0e148d0abb5f7839b0db62c2def87988b30f7f0cbdbf43b65d7df24ebc3e2fdf42584055ac47ae6a552c082c64ee9ef0929b4c045a8df8755894098cc69110fe5e58c14b900b85db5c482f54a2d0f3ce64251302485d8ea408deb6bcdf2d899aa698885323056efb3ad210c2152a0870cc3f6c5d03b876d0c2c09 -MD = 1878f939aeb1f29193f9b1b6fa4da7431de33404e3027537df537554 - -Len = 29816 -Msg = 5a8aa485c316e9403aff859fbbdf00219e3b15a21cfe59750f261db2f9be94d1480c3978d80b6b92ba1c5aa134f8275508e9475df93a297d8ceb18e10caa62b1d0ffbae5c1c7db5b16e36e2662312e2ad1bb4ae6ae2f0a902990b667582ab4457bcbf073843081c2d7be89d74e735cc7801be5e443c746d66f7bbfede527d1b5d0d8a3cb2b30a4f08414725cffa4fb549d70e2ffbee82476e515fb1abc87022a588f9a95bdae8d0ca54cf25c7dad51fbb12207e0297ceb9814c63197e4348fcc99569f784391853fc2d0d180d177a7e243991d2f8b6ae46682f72b0b6514c0c21d96781cc4c3d2b16407d76f02e94431db3ceb93ed9a5705b90eaf1f4811dc356cb8ee2a482bbc891259cbd118ea721101753bb556f48ba04175867b94122d4c0c22c94ad8b18df0552e77501c6477aa3eacd33dce60ca5da09278c651fef930873ed1237a3d8b0db4eea192153e9c2319477cd25ec65a6460cf4ca887bf89086573ce5e38b70009b701123f0b6029a41baffe1c0c0e84de0893cccb3f3c25fd2c2887a21a07320be6d0920006b26657ca4c21c5e22090f32145bed4815d153766c7c59827166a3ccac1e97d0f1b9a62b186ad72e8e4c6ca324feb6e530aa0dd9ab750e867caefc3ea3dde5d2d860fed55c669cd25436e8cc3181b3fbf2b0f175160f039e20c0bc9cead3a4869d80b2140721e7ea123cf605d0815efcca8aa0f122a6d33a1c50476ff77c5e8cafad725f9f4942d646e326f8787a3278269b9ea657d8e7fabdb23f1040547e258d4bb2208b29381770adfe1c9fd8b8fea5784d3d2c11cc50838b06365bd88e11b4efe40f616e322e1e11eddabd296ce0b5853f0e25ee0acc1c2f3f3ab094f8b1c51eaa649864bb9aad9378bb66e8c8dee556d691cbc9fdddd6333ca5d50668862c3c57d8c6c95eedbdc7114713a357399371b67094324006402ba0f03f99381f58ed8ec442f87687ad116a0649c592916e4a5122f5c36bc5f86ceeb266e9f1ede986b1cfb37ead0929f6c5618fdbf566d465391186d9cb9d5d9b8864d16520624cbc63538ec85cd2830bc5f14c630a3a4446c0d4ce01fa0cee2c007005973e2cf0d305e84b62208466b4de3e05d74b7c5c53aad511b871952892d97c79fcc59e848f3bf66fd8728f3386909052c533cd7b3039ab1889ccb6ab6495d2b5023147563558166297dd6387f56f90a9995d7e3f510fbf48d255f1d515a82b3d441ba81469fcc0ca2ccba1c285ddc770e0132f073a9f9a094ec7c7442a92de894eef411d918c7e1d03c7ba71cc6dad5f260f5061516bc3f04b7cb75717e8750f6f16a2f040a9b6c1c95c2e141d91aabad7ac82dc39e6b58454ff42ac721b8756314c3e2afbb6f35ec9e36d380dec581a717516e658a2e74bf7c9e9b2ad9e7df441da833c2746cc5a9208084c21c02e047ff3bd0e3222f1ada0571cf83ef3c14ffd5c028257dbaa3bce447fceddcfa4ef7f92c5c25ae93d2feb417cebbabe09efe04b4ccc01e80578baf3444ea66d4551fcfcc1913768525934f35a0b855fb05a7722b247b9fe76a804cef63a202b97d2547c50f96c22b99019f764e6435b4cf64e6ce3a3f47166302811f61fcf8d14d722abc4694d9adb8b06c7fdea69334869c2a4515f26035ca78186c47df8f434d6e3f5cc7f604340a087efb5b65b6a3b1b60437bd7e306e284cd7801c3510380581504a99a58be816729c90ca8be728d91c3d4c3bc900e704e58700e8e5c3d7fe142331c488b6f0645490e635ff6eeb85359d2d96bd17c8e6abf097b3d7f049bf8d82b75186cc747c1720a6a3a993153d69eb82d641bf3a5606d9eb86f3dfb5d05633844789179ee72415781d719ece8a20f1f2043c3e65dd5e0ba46821d844bad5fe41ae78dd942ce23603aa3fd63df2c275262698dd70021b4f6b6249221e0474ad968e3a677ed3b84df052fb848bffb740c6473ce4834ea56be87b53066a369a062af0b9fd85641020e61d8df0df39681a796c109bc8486527c2bb27cc51d9aed3a6dbdce7d16851798e14dd6262273bcae79ffc496478c14da12aadbcfa741adab1588b6c8967e21e903ed4223c51991ab9e7e838826622a32fd1ce1d8d8f45e4f46eaed5d5e72dd793a45877943febd0974dbcae489bf1f311b7703934b297b817252e6ade72996e3f4c52ab927a97b528d760f4de9e9403f2e47c5615667820c185f173cc8f8ea93e40ab0460890791158fbc526df7759b7861dbbd583250e29a97e038c7c77452358849cb23f4a12c057db90f1d2ffa854b3573b6269f87c74b62e301f6a0b42fcf2a16470644cf4da1a83d7515cd8d8814682e88a73485977ceee31581a4b409b230f9c22e00f8be911831ca7e59956b7b03f37d0279b31ad444c6bd915bdda786a1d982c6b083457cd57e577f5b7af7270da9db60f67717fc6b76414e4c97d3f486a0d0f4dcdaab0be80a64415ca3f4c18e3aebe8343a589c6bd9e9dfff4b53a3e635f4e00d64b7e558bf39ece47a2af08f8df5c3ba65a35b4dd9fc6cfc5ff03dc98036b4ca8933b22d841da77966605d168a4118105ec1e1185dc41fcc3d72673869de959cb1e51c6f405a9aa5cf60b02e191610bf8f7ad7d44c871ef64ba1cb39d833ad0a4497c927dd36eeef1df090dc22bed34e5e95e58a908e9102f34511d7b57e249caa0f615d42facbdfb9d9a52a8d7f884535dcb2411021a1789c25e117e80722da4c168d1757ed58fe09e2981f42a2572d7b15e701b48875e1ad0ae1035916ce4d9073f55f0459bed376d511c32a6e698c98092bd2640a37c590bcbca2f1f3507cdff0403c318424e76979b71f2b2de6edf48027bd08f00caaac0318fc96e6d1efa25316b7c6b7b3c04895333a2e25f6d5f74283c988831e1a69a79e1a3136792f3f6521d6ab3a93e87cf22c1d1ca0bfce0916e6ffcc08959c2f6ff503ab2c6fc320ee06a3c955ebe76e584bcedbe46c5f92c5f865bdca99b96624c5bfea10dc33abb670260650e343858e385755392311fa186206411050f7768eb857d82ae7084a8405664b72a586285e9abf70e90c6aa9d4cce74121e5e1c87574d25cc1b9c964216d6b81055637c18e1a0f163b51f407c4dd12a6467efcc2a1a1385d1e79fe6056513d8e4f21dfb7e75f4e2e7617377daf3e8e56c744d2cddae892c58a5030a8e959e55c992c0572311284a0e389ba715c97633bec5eea52e7f1e77b4b66e6a3a22c6ad12a9f315a34daba54cacc054c948f9a3cfdf4ccb791633f67a9e2a8b94b73d4d74ca3ecd7b760f731730ba0771fce394041300166a0e6a271eeecfe52aad52b554560bc51844b4321256c1458c5fd4b31013810c5dc24198160ae71d689fb78325efd2c306144a60c2917e7594ec4d5f68534813e0cc2ab7f494d88adae8cc358dfa2c1dc17f329d8c835a4e181cae177154ddd37fa6b6153eff4cc40e13112ae107905bd6effd36e47eed05727b8769cf9aaaa1a6cc541e59bc9c3f5ec926f1c38a77f3b2d11adb6f169f52508359d4d7875734e2b78561d94f4f7359656e18aa157b7bf1ed0bd980dcf9ab2ecea5d72dbd3bd3bff2da5e4249ef069a62671e091af36af07e50dfde24748669b7ebef36bee1249af8c382091ef34f7e5a9250651d78375b1f7a5cbb9fa86a9dc9ac8b86deef9e0053c16bb240e4d491b8807e529f82677e4af8becda10dce379e684a92cfbfb68c7e6479b2524c3c50f6a1f63603aa81f67b5c9468db0d27c3809f9afef3b9f49be31d4aadc581cd58bf8736940c490d404b067c31a02f1dce2ac2fb0fdd96debb2c6c4ce90d3e2e055da0ee00fbf66fd81486b4ac82fc06c3f762f959ffbedb76b4c1ff18bbc9c4e36b7f5ae1652b304a726dfc2e15fc892161000471dcaa813b06cedfa133cd386f63732bd9da6fd503ef2ca15abb98fb73021aaadbf6d25684ace37d1717b0ef25d03cbf3ece2cf490e53352a6f669f44565236aecd0cec1f0219055eeda0d5f933c3cb3a4a2fae57def227e9748e809f4e4bab348ed1869e9ef55d89ced4b0033f1e377901b524e27877a83a0457b832e0b311264be27a4fe60c493a5e3e28784abd1998579bb852a289c00565ecd164d633716b4c675099a403d059e307c4c11c48787e950af30f25d07832e073539cf772d2edd98991e39e85facea6560d447d665d1502295b81c9f6d7a9bd15c4440a193c933a6fc4979d38d081ef548a6a35bfcf44e8217a1155a0e65344f9aec3d8cfb745b643711c69c4595a0628c39b0bfcd6f38d19d8259378ac16bd489881293d4ceb962a20dacad29e4232fc4040c9c57a0a3a3afb27492631db6f290be6c40a026e234e5a39880aa51fbcf58abf35c1c47237ac6d7d40527d8ba3c58e5a73dfe2b4a2d7a6a16a1378dbec3d28821899bb11cc96b69140a3990ca143a945fc64f2a65eed8d7a3a961f5c0afca2ef39f568d041205cc911c18c48b1cce40f28403c2c9eb6962cbe3aa08c5e598170627bd197dd74e98f7a555e251b88c820bf1cc82fa95d491fbfa80551307d4b6c59d6004feab7e54a4407178d269edce0899f9c95c8082ebb04875695c7908b4be7acfddeae14d661377ec0671b37a8b84e72c24843e0ce695780993f6cb9c674d4a6ce2e72b1463e1b63619b427ab50ed53c422e620cb08f7e3bd83767208651e86b7d267db6bc48b85d0010e3908a4be7a622316db45c97425f1a6500ee5249eba412ad194cc1e7d615a7b046a0b0d84c586c38ab025be76b9468b17f4bb3c4a4f893ad8c9bdc833c325d62b3d3ad1bccf9282a651c34e9c184c9032b5e302adc100a0d1fca9584b35d2b0e71510b7e2e315cf1e32a6f030cd545434d5051e45b937eb51a017453033e179cc94151683caa12746d55959f132fe4592d489e58e92af88cc56a0256f47c2cf503cb0841bc09519b4bc42d249f3baf2d136fa0ef4e7d7f7c672ac6f64dc06fff6719b77077f9224ec4a1bffa78a0ada747edde1151331b6d4a6c489bd8b1eaa33c50e65f35208b752111d3896607e6b010e9e027bcf4d445b45611ae5bf8a4cacc9b1e75be2697f8ab3ef2383118632eb88b2f97556ab3edee10a8959f3ca55a5d20e51ad9b44bbfa750a371a07a2b0b85fd52cbe53bbf4d40c395ba6c26f63d3807c6b65072b1b3606f6f9c7cd6462dc064d129330f014df19761838a5e9e59a57946b1e907d0ba1dc1dd1f8dd3bd7eb0eb351b098f7fd64bb3935ac08ba598eb9eef746d1cb0bd257175639b1a97e49fb705082d6243ce94 -MD = 77236761950d47b374cd31f3ac68d5347092a37b63e84c3e1639bc59 - -Len = 30608 -Msg = 513a52c2b8b80276937cef3dcf54046d3b6325638c165a1aa45930fc140a5cf7dfada2d48162f5c42f15e03c61f524038e27a38a36bb7c7b26df7894f852a5b6d91c40398f7dd883ba23b1d9599f6774911ad3d8aa4432615b8e841f479933e4c7eef59aeaeff3daba0e2bbbc13c13e8cca47ff6ef9ac4f4c9ce1e4309c64fa8318b899f9ba28ef2b93d168ba0b37186c82e6d8b0da37a5bfa080ca847c1412aa05bc4efa97cf1f33e1a3af0ffecc9770c1e66400d499cbf76a217f7097251939cc66e331c676404d20c5e93e5cf63e320de32bdf6737147c30607d855c1c70bab344e12fc4a2e4dfc7b4c1b5a4486f18dd499a9d009421c6b9aa4f23596eab9570d2d35520c98f744cfca3167337bc9da6a63aca4f25765f6c8b6eeb0d903c627b9d3432597ea2a3271a17d12848b948f07576f7918f84beaf70473ce725a59a3a008e57ed26c0d4fc799a6651ffb7a35123f9a57626df6d18e572a9849379b542a94c364a565c9223a795568ec16a253f5e1d546b8fd8d32f777bb1546e2b4c1c03e84dff81f8533330b3122d42335711705c64f02f23896992ccd4e52a2cb73c8cfd1f7b3e06a0b1815e39bbd695a17e075187928922184dc3e084953c108f0ac1051b5bff1a031526012db91313aceb8f871cd13266d8428741610338594c2d2c6ad20029a4e2d4ab467eb36c3fc1d07557a51a9f5471ee5979cabd8379770a4bc8c4165229d8867d88ad29667ca8d3555da0fd349d5db7b6f45202c1e388388b9971ed0d3b4c9109622989765c9a5aac0390f7a683f4253c4b6791584a082e88476c12cf3bc78afb4d746230423edcf5e4158849baedcd35e9abe7daff7f52be6d0325fcbdc1eabfb53e2218e00ed0af698f1db2a4a2f640597f54be86465b9a74d7753a33d426c333b777849872ec452e6e5655d3ac56f80552867770f59fa8f969aeec3066c5a243a0a127ee1376638d4390c7ca7265a987d5eb8a42159566553a31a726024dd95f6a5d6743590567109f7b6ceb8d88e15b7a028b7c2ed35f32b98bef973f35d50174fac75acc2fec52e274d9c966574bfaaf59ef7199effffc783c2a06660421b46117cc76e54c5fbebcfb82e6855735dff6503ae4ff31c52cf6b0daf61f4f4bf2bf22eb3a2ce12dde7f9dfcc572ef2b95ef83d228b75f4b4ea59896e8e35db046dfaab8171b94f31cbacaabe8b7a5b996db7359bf6aaefedc0541d2513ad5fb1b431d979029be3c03ef1014b2bc015c6d7a9d363b81c76c4fa64b11b18e4e990aaa0a1e37eff3652e9cfccbd5f89880842d600c1f853ef0240912e99c661df67f54eeb060c6ab0af744ef35a515c1c265747a2fcded6c46f39e47ae744acabff3d43a02bd566b99e86765e6b26c139eabd03a25d942d5bd38e647e4dbb4db3202b88a69a007ab9e8c750f6370940471a1c12e92c3fe01ef6e71a221353cc61916624e79bb62f1855e1e3a1082062ae7f1e7d5eb10a7773a0ea0c4f8033b21c1c971f4a761f0b3ead7937482493aed6e1694be8331b7bc4984244ebdd84874b876682b672629893b83a55d4d48bad2808a58471fc9a7478a795cadf726dd1589b7a5415d8a85e803ec9442b6030e50abb7b31e052b0e8f7958ca41487171aaa207c9d4ef018e46b06d10c3710a9e0e5c492591d7e8561a92acedc7164aae9a9de13654902dbb2bdd9f8b6de2c1f2622e994040fc74066f62d047add514dc7bd9de8b5ee561850df7fe6490afbb93d27f3263aa07709804668d5844295283b4e24a3942534f84737c044cda2c6a0af5ea9f204b7d50a3501a1ea04877964cdc43ceb0bd6e3a31d2f64ba4b8ed5fb042dd5a0693c2868108fa1ea019445290587ad6821e9ac405d2e32efc9b670f3c2fe3dd87218b94e9658307e8451419e6cff3fc3de46d7f78c9bf38c5202dfb07338aa412631d0e251c5154e94a6b4ec8995b9a44ad5acf234e06f38eb5a69599e43e5838d70b44cc83c1a01397be83ae4afe5b26e7f7256dc646e9c9ea65816cc87b347afbdafb58326053f7bb823b106b78996512a734e0d8fb86072cef211846cdf35950107450bec9fb26345ae7976136ef8fbbff5ff4ec9142b70ba806f4e5a2ff446220523e7f4b000f80ad1b9bc2d5c7e75274194277a4ca59e52495bb2b96d2dca0af1789fa800d143efd39a616b1bd3c6489f33200a2677067f97fb39f15f872a9f136bbc6f56ce4addfe43ec37729df60c5605c2e26b49b027b0776a6aceab6dcbb225c5b07c9e17ba98dce5f82a850e5ab0319468e3c2a233ddf8ce8c81409b7518cd42d538eab270ea8fd5150b321519f3df1f05558be68c66a6ebc042efbd858b8cbb45535a21e53c8243f8dd4d13336839e9218a4c841893a84c6cd760d9e2548ab96895956e03d6ddb708687d118f57647c254bac82c1ac2776fa093afa76bbeec3a6c544a1b0ffc9b9ad746b1515088b60775e53ea6ef84af3d0a025252807e16267ad0ec0d6006ed24fc8be2aadc2d41b818beac407c03a495864cb64e0828a1d13139cd55c21f389562d1f553fcf6737aa9c1916734c1e03f81dd1be8672127c12c095e72aaa80672b6b36a0b3756d3c595787ea9ce41fa61a92e23c0320a007cc7ca2ff28e33ff3344aaa12f1fd0eb0f886dd4769d065bc258ca4e43dd45d47aa0e6b243e1456b5da9224b3e2af711deeefc236c25717cd81d3bfc01dd670c31240975e5484ed35850a4b8c6cd2bf0aa35bdfbd8fc35d5f952fdcd88b6d02036dd8cfb5527c2dfc9e7bc8a478b01f007f91dce7b85a60fccb68a33270e23b90249fba3220443d918bad4204ef8fba86ea5b60b92665482b8a45bbd8b27d42f19d5d01dca624467cb66862b2b7b8b8244c7f133dbf2b3d753b8fcdd23b8640ae42da4bbccd6470468574d0b8ba7340620dc69e7a6cf66660440e8026f1455c507add41d87b4be2766298331ede077ac995f8a978160ceb760e8a7ddebe02bf5eac308b3a9922c594b49d33ea0dbe8fe04cdddb40a3b6f53f01cb6b02890490604299d0ea10314028e34c79262edea72f9b3cddd9fd3cac428598f3983a94f8dfa3e1b8eec6c07cbb576badd929b0e93fe8df564b0ae6370703bbbdaab8fa1f6237d0ed50a517a1d477c2770ce67c7e979c8cef9fb4fcbe16e1fa703fed7e2c71662d1418947ed6fcad1b7dc64c8a8ec0200c50dce1c56bf8891eb460c068489498c2d84c7a3c43ba613c6a0f45214040db27200a7b8a643461ef331419ff9a543555def6419a1196f9eee4efb98abca134a408326993d152d3349263e08c4b38a5afd11dd0e06818def9936f8e0e2b6a954daf5a9328dbda46b77c55fd5782c9509857ca0f566fc978252196adf3b52465e8be8de191aa55223e97f359a8688d9fd71804e6434f302f3a336dfe8181560b3edcd03b15654bce928b44dac7250ef836bed33df12fd66cff74fa6902b888f117b22d89fe3442b47b015069fbe0d4c47bee3ffca63841953d8947d7bc81437e3be7abb39240c43bc0a120ef8ec1656c6f52510bab92fb14bc1d5c2ef8050d1a712452a11ab158cb2b12bb52c6f14b56da92105248648c4f44d63f58fe6b712d82112b3cddaf87cc82fd297cec980eec845685bac4d67ab09d5cfa3b16dcf41f37553d6a2561d7a68e09735347dd34953445b62969124f9d8e5895c1888020595699911438efd2c217dfa0c121e947b8b407ad887d3d9280e17216d19b7e7c41a7842d235f820086e526b8adc0e4cfbfca4572c04982ccc05c51875299ff9040f4bf1b7de242e85bbf87c4fe6df552113fa70bb7150784c5c89eef2ec82ae5bf03f1630c095612aa6eaacb9e70445a16dad4825729f442f7ec00574c712802249dc30bb61ce606d9bb36d57411fa6e366575df87cc728fbe9220c694db206fd88add1d65621c4d526bd4eb68983f17d9a631282e47a9f18280a544ee503bb54492e6a000241e6e7b492b13624c3adb6767b16736e2c0f2ab7f38da4216a15bcf7d879d6faa14f1be1ce4574a771445486e9ca386e5df1aa157818e787679e9e012671b9a3c275f82aba6bf085ff4dae4839be5069830f0ccd0276a78b8ebe8e11a2f2269227e3e2ebf1a52854c0324a47056349e43d8fc95b2d3762a2421df395e86bbc4a343192c20e718a78869aaeefc7498362d02c662c42cb97702405650a315ec93099b75e396b619575a4df42bee9e19b69fd4d79ccfdb3b459973d58eb483bfbe9ab0dcbbe92f5e7e09d78bc40f7bc006e176b6ac9b87047e32e0e55b58793c2d9faad51ce0f9ee02de31f61f27b4940f3b11ebf8f0d91d0815af0d1f569f6ac85fb1e96e45bdd1cd2180bda6fef09db7f5cdffea96798dcd8a09d642779c517824eb9e19de2210c51aef69c05bd8e4e756d179e9540e5cb3d916c72c8319f92334837f8574d1b2d410a381d407137088a746e15cf44092a449fd684542bd6bb2d89f111bce71bfe14dc78d4ccb4a4a803153c0ad3cb9388723e741f67b31ae0e5868de41b6ab40d31781158f6d2578b939219c43f51e5643b0fbdba5f81cca1dfc056d60f2273c94b7f9a205b54b04190ad80086e71af2c23562bdbc7f27c8c90c9e46e14b8cbb0b7559bb166d65f58aeb9f71ded95316ebfd436fa1d9faaff9cf5df22a8983c52098c6e92a5b1a54f3239e79b39471c9a64fc77abece3c87958e68f8a574b363bb6a6ab3a94913283bfbfe9f6de11d14db721565792595588491e7e0b9d3c59cc4316da1fbfdf8794cbbe76b7486fffd72af57b83ca8af2bb0200333cd7060792336f73b883f70500dab8066314bbe8f544eb2fc6e1d2f070083e3774b112d00c1c12e0ab9d923b46612f2170afa02cf679750b8764dc0f55c01b1379a7fd33b84193d95f491baad3f3a6407685975c794d15974be0008fcace492f82282fb3255884a64a231dd438069ffbcb432bd7ec446f5b8adfdaf24d872b0444be14dec1d547e002c7f337f12e8ebc0544b82fcdd3c4a0dab0e5e75c9f433a27d667071c2c600f0f8446568dbff4f9bb26c6d4ac8fc83fa20f9bdf865b1439b20d70dc92e26f9bc70471a06c4f553d3345f256f6ecec608748773b495f306b69cfdcbfd47bc90edfb52fb62b51421f244eb5373b6f93bbd108029b14200a77b59a05313f7cfee0a002bb08397a2de8049d79f5f87c70ca45aac86f852224c72c0884c1624a93a9be99be07250e8b503abecb03acb7e5e42bbd33390af9e1e24377c5f0bb8909d291d6a3335ca2ecc05d1f22f0c69675c219cbcd7813fbf4418274634fc9acd3f3b046053d6ebbc4b0d25b1c3dd49ca2bc863301bd4eccce6d6f9ac72f0b2a847590645e55c9dd95ba40ef015b653eff6bf7af7a7909c0c2ee71377c2f0e868dd0b8be094d0c7ce2450f479cd9e6f1de38f47 -MD = 1796669a13a3a820a69a2b7f4206d71406dba0d8ef397ede6d00823c - -Len = 31400 -Msg = 1edcfff2ba6d61ce5e16e8f4fa58208f9b5aa69ae38b3ba3b78917ce37427f1cf3599aed5bcb81c478d2954bda091597d2d1f0ace1f4d7446f8997ccc018a6b025fefbd86f122373a98892f307163758195653b2446c8ae173e83ba00aee0dc21c94cabadd8b71615a0286f467c7ad5cd9af77b3f6397c032a6eaa51fc0bdcda3fe2ae9c8d7e9018f1061a57e463a02b7ba505b7dea3d431fce28ce77db93c80f8b250856732ab20d85df6236534374b6500a5c7e4f4bbf4510e8b6b773e553dafca587d53f1e8ff75cfc160d1809b460188fee9f07258d391b84de4d1e34e98caf36d8d39016f3f322323161290f3a4b605b927ea67d45624a97a5a73f04f1ab2f537bb01ab69677623c64e0fac68ebeb3e7d89ba19560573a9bbd545ad8249cf9860119337fe00a8954f10b01c22a50afcf31649d10769e480b85e2e610db089a48d97d7ed559132426962dd2748597a07c3d67dd60e09e0f518fc195618d449e06854b61597a27bf2ba4e7e160290a32794d13f72946dd0d183b8ebd2cc3f7515995016f6ebbceb6ceadb7b317ad1ed240e1078ebc11e1adca3998d1e5078770bc893e1d97a66ea7aa211bcc0d5a4c0c5da9a0e8abca328de1da7e782cd07b58a9c26fd066c28e0e28af92a0b3e9184d3a077eb97ae84609f9ceae1456b75995abd1054c5e88a356d499aab5adb21a11707b0f55abe4a2ce6c66b64b151488942d459cc5e161551e388fd28f4d4db7f56b84c161a157cf37d4331560ca80bef0c890a4f181f509d0cee288a225248865b5b533521daa21c2abc44a19f9743327e8329c43d2bc37fb02425b72c7dee1fed97ce39b5364511b6d9ad2bb2477aba616bc1121361f76096d1fc995a7c57b0d314c40c1f51ec39e94173de8de037ef7ce8d723e3ea73a9879eb317f3780ba3d67b3d95a7521ffc8a9d9ea07789033999a375def4eebfc04b3254184198905ebe7441bc946266c26394375bba6a65007e43a22b9094640faa37e6868a05704b53a6d96930a84af33acf44f69cace5acf47167f2fd04e9fc6c52724817e633d05cba0c84c14d52f7d8f5d05966770ba5c3d5cb1b8467d6f1582dff4630645f57a357e3f59078073705afe06c5ff26053b316d68f6de5b455377095681da77e47ee2664a4e552ef1988a57e17d1466b1f8cdd903400a50a90d1c33c9625d6170806cf997a080394062b7eb142029ab46f15d102f385d0600aeeccfdb89119b302b3f98a5d40b27e67b4e382d53b17c4ac179b33b5438d3f2a5636dfb6a99ad99dbc4c3e36d68733a2ec7bf7b8c4e5223f5be22b6083052d5ad0a7eb78b57e1141eb72bdee12ab3d219bef1bd3e52b568ea64ff3dd8d5fb40226c728e6fdf0e45606100f6b3c46244a89e6f30ee612e903c38a9215a9c45c881e409ee9c916d844d6d13d979c7f6e877d0989520ec16205783a10ef1f5cac5581b7556760187773235a4d597a7fa53f4100e485a76049fb8f077652364e2cd116d756490b1f494bb5564a981d6e50d99b720c91f719274fce9bcb2837c36464a745a8781253d535536b393ece73f8bf54070a5c47128368fe9b17586ae2dd77faac53dbbddba397c7412432d5b624583468e5d0de73e5aee7b262ca17d41e70d9b2605953df3bdad781125c7a605c0c023da5d40665d5895086b56686c0afb90affd6dc1e8926674cd30ca405992943882d534f0510dc6102bf1714ffcf19b8553cbd4b64ffeba5edde19f2bd8811658ce1f52b249b819ec60691bcc929e3d784111d8d6e6912fb844b412eeb569edad701964fab2e4da862032a462df5957d5d25ff8c84f023d3d7c18c40d72a580b31343ba3e2f3c7e89e5dea9a735cb811aa216a2feebca794b0e90310c92dc65e6122ee0f100f77c444bcd9a0e385d3fd31ac675ef3f426a5d56bad870987703c3174b67b7fade5a51aca0041c4986ea8bb6ffd01dcc026700eee938bde5fde0e67d29ccf75f39af4ea2c666360bf117a0f123401f149315c251abb0592dd993acce3a6f33b091d177a8d13effd2045dbf73c14447ab7ced1e0992fde6b2b282a2850decf1918f678929310cee4e391333995a6b3bf3286370910f7fcb26e134443c04c4c5648ae7dfce664e65d317eea9ec6f13608e1dff7662a1949aed1e3f2e4dcf7503cc0cc907f2f1721af329368ee77fdb69cec6377c08d9faca9791f9bd54ce7c411a9d818e2163266240d5816f14fd319c47c9a20dee1900ce9914fa6dcb724911e2a5a7dee42bc9c02eb555a6ef77a49c8b90b5a8acff553b73ffb7dc2c6b79dab6cdb266b5cbdad92f3139d2f17fa2cf0ca3e8e8afed5685babac874e20a7d20097e37d210b3e801c4e1948fa565cac83d7bb22a71838331dffe92c4a6dfc1764d2f8e9d7f845fde823efc1985ca7b0cb0a0b80a9c2279c45603bd47c57be532145a4d257cbdd0c3d9b1e72d1d2e31f0e89b50e58a6a88b1af829e7ae84f6707d196ea0672b0b9565de2dc16c6019e3957c41367c6cc6e8e5ef3bcda69cac55c176debcd0c0d980a613a41833ad50e3a80c375fdcbc869bee6df9ef2d48e6ea34837d8c59334eb549620cdeec6290078f6020f0413cf28c7d99ecb30a30ae172069d279cc2c721d95f4eb7b6026e13791a28453739711a4da9b9b8207fb0bc4cb4f66ecf0524e9ed4f1cc5757a24c5bf7f7e9ef3a73ebc94d9c8ec5ea5106d97e5ebf4b8c4ee9214c8134da997ed85b0a89d92c5e7989e41dc44ee27cdca53e81be67ff69c74c8f47caad6ced618e1f0f80db72a650f2de933a62438541f2dc1c96e6714f667dce0bf7be751cf3749051047829dba02e9df727524ecd2bf599970ec20805d386c8e02ef05defdd9594173b36b9c513460b91b2a76d1b40b55e3950852b55b56e631097c98c2bc7f614a850a08b2c4f410fa804e80738283a144c81b64405b53e89e25cd36a9b58a1f94d693b05d8fc279085449d83ed8c8ca116ccdebade7afd219da2966006399d294eaf919091c30178719b4f4b0014b4efe05784f5a8adb3138a9499d43312f28ef34929951e4cd6aeb23185c63967b9e4f14a305d2bf56947f157642feb8aa90f845f8b7a483eae1a902dc75c622ea36a93ce6b5a2efb26a41a167fdaf649c893481b40a9d74191a455b79d7541107a680c0bbb547b66f2144cf7733b1cf85a0488a3cf8893ff883447f99079a0b647c5a528abb3d8dfd57fd022c6bc253f64498c1fc081431d9ab2b01827d045c7126ba64dc0df0e0ed8cbefc003c4d8c5f04a9cb89cfab146d006d63febe3f8ece14157a48440e59a02e1eef9afbafe3305ef0095e95da32030180294621883cdbe2fff527e3e242c5ca918f454085f30ac20ffe03211e253c5d07b3f16d8ad11b01de8823642956bec0bb4da7915c365ecc5e2befc7e368894178b698f8c3d61c0f3585a35b2fe00bcf009d2a749f279cdc6f259d10c6667a7d3783a539afc64f499980202f82892d43e6005650cb315570b74d938233c9705ee8bd9ec6cb2c356f8f0a3257adbca3adf019b3bc6d0e1937cb366ba2b7ec1b64e0c6fe2682625eef6a76527a2de50f8b934bbb1df0f848802f626de8cf58cc3dd4323bbf82233c27c076f8fd7fbcb16b6418d50bf39a73e8384442cae69a13381771e01836c95dd7356eae580f8e39abd6f3a9fcf16f1bee8a6e62cfaa2a70e24f2873b71cdf244c1ddfdb2079e418eb508ea27756d0b0f1aa43567d667475cadfa87f2290df20150e4d17cd3b58df98852c46e1a079c3900c65864ab81292604d846ad15f43e1a06b38dce4c056ee41d96f1fe27ad4d45815477abe2b9f47411d4ebf49c4a7e9acd915a2dda558d565c1b995f0225c63a8795bcc5e1d5504cbc359f4f26d659868cc86023e56f92572d2be2171537ae20f9d24d39129de7b8ed4589471b6178e82b9ec637d51924ef780cf7b0c7adae00be53528fdcdb5ebf8c4ad263e4b383c7915cb5f2121ceb272507feb27f4e6de1c060f450a6556069818da12ce794212ca84954da044091061c6420a3a7e194cbe6415a03dad493bfb4561f298dccfa1e57afcc79144cbb95466b840da62fcac6183dae30df209fc80ded73e23e22b7a586d44457a80a13db89645377e400b8db3e9d155f1d012d8d7599c7df636000c91d01e5fa2a4041e0ce96b46ac91b051141aab919fc3fe514d2a340a9624c7c93057ed7ec00b7edacfe4ad06dbd4a5a7107a9c2e5e4a16e670e5308c7a5afd40a249341b59437be48ffc8ce0828535f0179e5584c3df1718e0ff147c19250b03763884bdb4c885cbbbb58d7c372ffbbcb7fa5a1d56ff5958fbfc5242093f9b620aaa41fe89271700d18421327031617d70230c808e27683740417c86a0f7091cfe231e264cdbba24600cda9bb43601a2be8cff36dfe3be245c82e5b2a6e7ee74cf175bfd5642e996f5a42c2079ba56dd11bca4b8d2c0e5b08f25304e517eb619dc1b9dcc5c192fe900ee9859471acb7d18169f7efd2b596c76aceeb25747fa6cc394461bb4baf78af030a1be92e3ea13104f41f1b5af93a8918e73971ec025fe1406077406a4db0d623edab8f3b23d3fb8bb2ed9a2aa2ef57e4e61652e73b33e2c05346db86334d0c55da5e0cfe23f437fdec87f3ac785f38b612a94fcdf3cbd9a066f514072af85a81185ceae105aceb44ea15ae4643303476b41bf007f2cecdc8e1ac7356fa59c68ff0ccb04b93a52147f4c05462ca0a530c1493bdfb00e5c71f0c9581d96b175b68aad6e7a49384e0ee52af6c67d6969e607a3a3f12e5b8ce8f2ed5c5f944db1ef28ea41653cef431214b0c7ebd2f7b1c5a2e38fdb468eeea009197c71e4f4c1916e35bc5c20c9b1ac828fc12cc9d62d5e377b47f4a532f23587b0110b1521353bdf3267d581521a6cb32a9b1fbe8f3d2e19fd64e3a6c258280353b271816d7d4cd042bc47db02fda12ae3be2b4d7d51a3eecc8f1ee7c760e60076e94bd6341a5305f922599a76dc086e7da2e5f33b1b5e0a7aff0cc4acad0e038c2e00601f9cdcc4c842514c0825f0d24ac1c62c42eacb117b6d43ea0cacee9125e925db7a6548b12294e57c417bf90acdc342652f50697860224ab441d1261db6b32294ef04353fba827c87ad3e9f8c890fe13a5adcb7c3abe687bff6ca432dc1049d28f81a10e4d2938d0ac5fe42bc0f1039284ff04477c102915995f8a425d765ec03ffe76a351d60ad82062b813dc26ca09b993b8e09420ede3da9dce7ba6c4f95a2912cafa4fd524469f856e976457dbe10a10ef2fca173f4c8acf78c3fe23a20a1463a6fb8f4e0e83f1700d9e9faebf83401fb11b661da4b8709c8e04afbbe238c799118e586a51f8deca9d12d650fd552367078eaf59a68f55ad1a25ffb3404a0b5d149bf450740c2e3b27da51681dc17a91f870eef4cc3a01a9230e373445a9a857b60aa92aff26a86db1de581ca82e0f448da76c169e1f3c39b2a79e6577bd662effc3c01d7bb01605460633942504a829cd1c6ee5a5a7ce05ced87e6f61ee0d8af7ae80536f113eaeeb3a29f91caa0ee7c0b7 -MD = a211e5d1e24dd8b638dcc0879d6dc5a84cb3cea92028e9fdaf487539 - -Len = 32192 -Msg = 7e00aa080c127cbabfdfa5d9d9728c7b25358aecd26f5850810cc38a9d9da75deb9f1ad16200e8d93cdf40324d94ac8e94f046f210c52a5dd4a927aa5ef8bab725183cc771015a256ffcc60b85aa2cc1e34968095b33f6bb72a7a9adb7cca0d553f377b2e21dbae781bd9f2a28bff45c3bc856f95bc0a4b3828eb35a4f2243ff9eb932595c5cf0689aaa3357dfd8eca7c3f6798ab9741c8d2de4ac7acf018a7d2ef1d78588c7e4ede04cea5c52fffceaa45a39841d5746919a33fcd5de725d962a23cdfe0d657fc17e2a2d00283b0c6c057dffae2e720a07f2020a33257ca494bad87c8c953fa72b9acd620a0a9504760fe531d195cc51365cda405c4b2747bd08964cf7c55b45725dbbf3439f13cc50e91c39b5fa6d016701420517f97b2f5a39e8a50647c342dfee7e467390c04c42bdaa7d22035e04e208c2c12ed78142b27853ef83c37f84ba759ec56284a16d94b01567e05ba640ef9ae2dd678c40690feb619234e095f54b1ca1d6d724c0158dece75db6a84d9fd6df2bbf8bc1c08db7ba99f6e1470f7cd90911e39b18242d7699a7c96e935c08defe24d0621d0a94f30e838354a0f400ae6475537707d59e97dede12cec3da6250205678b34925680b0fa8a254924d6b1056568e3099dc4e38e413a09fe1cf97746c472048ec19ef47e48fb9a8c521a448073bfc91774027a1d3cedba894448e920b812ee7afef13efb6c13219e278939d9eac05614909101ad2982bb3853f2ff2248c0c593aaeba4aacc4736f915b205943311167b63ff0ea09f7f8865bcb62dce0ee2065345ecea1ef22e67279d033c22053886c67ebb15aa175aaebbfed0f976731d4d54608363ca662f1e943e2b4225a99d23804153ab2c29aa9a759af1e6ce0dc8f7017b3da63fa0dfe9e96968bbf1c8c579334c3733a93ed5d85d01877a37378b8fd5067a25e13aa74571bf6a0e28cb27f459fff44393df62f4ccd3003844a8cb945982c767418c1bbdd7a09dbd2d296b315eed095f9e73d85c3f700a8568aa0f910980b3eef31db3bf85ad725d917bd59cdc93f4ec0ba4bc8b4f78f4f635e3de025f70be215887f5b6f6369643d83b1db33d75257d7dea761e574e6e1f1ecead64e5e354a2f4235860c3ec682473df99f10c11398867ad9b61e170b44495c2f4351758f5f848a85219593f6653f6e1d0f2b2e8afa14b76a3129880862b3d7948ff7e324075e86f895d30902f76d3da5914ec7be63cbbce139cd6ee5217685a2220851f92b035e154a8e49f11e18d31a8f3f34b7bcf1b2c635d171a86bdc8de0654c6618b4bc3b64a88efbcbc48a570470c71c7deecfc0a28ffe3a5b272b17d6be8bcb8888d1456e189ac699d009f2e99cae2819e0ad0ffbae1c71053dac4d0d968c2751918aa3ba007c52622adecc537bbcff9279d3c65cfaf3beaf94a7550c5618237cb52f7ed1c9fa482eba510cc975b949f0a3880e4adb4ac7601664575b64f7670fde07fd39dcdd500568a9dbd4f26cb03b45150f4fb9ea3720aa2a7c832af19a15f35b497c9fec11f01c3060fb5a9eda7c46c2f0f2fc9cb4f73843eb0b0ecd6493dc7389217cf134f6be2cc4c615176fbb90d7dabc0c26e6eea9f5cd7b7a556f938197e6b1dab2602036e62ebd8b9f18fe0a9cf4335250770ce3894a5cd54f601cca0f88b321f93e756ca6c76924fe7d4f9c5967e134e40c5acf4789358784e2379f2296afb88c76fd48b4b65149fb45b52e555a4e1ba850de5576b38ef8bc9bebe81a382e0933afc0b35724fd60601839a8d9f6007066e8a25e5fefef90bf33408d3d98b77bb891c793d839f6d3f3a0e1f22d628199e47faed04b66e1b754533e76d4dbd276e2c619d27f1cc3087d82b7f599c75900ebbb08958040ebd545a3ee8b262c076278f3be5694f6ec69c569c397654d0e0b4244ba9347a4965258ca57b57db1dfa843c3bf095feefa5c95fb0cc1d81b2a24b3c3ccb4e7ba6996567181da1f92e1ae0bdb23d1282d744bb3e09a5c3b5a35b204e044deaaabec09063f75e355f896dd97e6f29836dbe29de8c1754ed631b51dfe422cfbd69fa71332dd3ab9670b849db18a3445d21fccbafc46a681f1c934cc69928bf2b4bd231da0f2d8429df235571f6ff2c04421bb0ab71634dbd44a39290d776aab8c2ee78d192758683fd63171aa3e34f1d40a37f5e1da2746c7db4d9bb19ad00ea61a7bcd6524c11294defe551a9f00c0ca02c6e3413987a911a4f78a1fa2c50349a868434c901b28e5332669373960156d30f23ca0dc5debfbcebf5e1d385272be00355996136f917afc3117c9b55bd806bd4268c66ab0f6cd812d8074047d434e4b6a760a56c4379b62a5c697baf9f1ddd03ecf7b8c89b1cfe4ca56ecad505e3eb1900172012201908d0cdd6af143483a926fd987eaef0448201d494cdcd3abd9592e6494bc91d7a0a4edc60a0240c5652b5cefb12bead7825caec25e380d13666ccc06382d1aa115cfd1e83f94f951a5c28e77c2f88212c3c10627e86a067c2c11f24f28ffc44735383fabd14f74d2447f8bdb83f8c09e5477ace1b319c6d0747129a72bd898b24904bf7787ddbb32888bdd81b9d4ab617da5285987ee56f586b3f87608619cc8985ed9b42ae3d657ba0e0bd32f334c44857403f62b91bdd5aa01e8248841da726c6c16ca820ccb2b212f9e37acbea92fb60bc41f69a903562880801973205a990b56fd2257fda49407171d17f71dcc0b5693f33e07de3162475a48be91a82323be4517227161697cb2ee10dad9f7bdbeae3319baceda4de051b7c879a97f3cfacd61ea3398de20ca6bdb00e81af482320614bdfb864262b78cbe89b3854db00480d100be931cd3667a0674a982bd254da65d6769f7c175d1419812d5ebbb842b1fbee1292bc489372798f485d8faaef9d5379f6ce8fd9015b76ceb45a470c255f14f13dd287e4b27bab908e4e652231ddccaee6c239eba6b38639d6d7815726c3fad204352f1201d7a90392e726e8ea1033ddbd16e4dfcbb0aa5afb42e529a5751ff90c270c61002b1460ecb45f6f66c92b8ef0392b25ded7659a98190ce44fe6f6ee9c14ca523bca502102327916468d165b06a5774e5eac4a8143e64327749e122b5aaac3462349eedc59ee0e7df7c086aa86e843b9c983cb9765273253c20ee427be4591ed452e62fb7a537a16f907eef5f78e3b18be026b55a2585509a6be0f6c4d71b0981ffc4ef6e9ef5671c8d7c1d5cee3a7cb9aac9c3451f625b9912fd6817ebb99e72217f5571f3e2e0ef594a1b273a52442edf6e0cc1a8d1ed41fd8ebdfc88fd84aea1608b480ac6b5efdd301248c2f3b2f3655db755289bae9b15da20fb16ad633d68afb67b4d698e2501762a47f0e46d0f26deed8a078848ae402bb79dfd92e5285db4019222931197ae638aad2bef1e8a0939d6e6ad60608267c7aa69a574b07667b69216f30be94fca405b02dada6d6df5b599f382eba12073f722e8771b6c2f70ff918f279abc553e55c4cc676e01bfd49b5f39eff1b08f4a0347a0d94ec25c5fd52783260833aff3eaee95397383888d334f3f5a3938d7d633401b34d759041c817c7c581df567d04701e4b8b19ad008c5928d2c8cdf01fdcf36e1f17cdb2f8e4ab70125a0ab85bcb424424cf0efa02d994fabceb24d14a91e50787606ede59f7a009bf55bfc0fa1787f365df72affe4f7af22a6732b18c169b76a2d3c392f365881d03014910f66dc3b48538ff2f61526da781e9721162df8923f7ce867143b2b5f2b3e94118cf32880009680ef8ca86ff7389de5d614d5130a7dcdd01f9d973cc53187a3258f30a475e78e92cac9851a2ee78a26f31da10247ae87bd08d130d3d96c7408751f05974384a48c2bb5946fa90f4f221f36790c70591278cab8ef37c3636b8da8445a4b115f3e38b959beb58d3753a10369457bad07d6c60e5abcb2ac9ed5f8660617060801c65c1dbce93605e8fe6b47bded95283f3b727cc0808abca61b12596e241150f1a2c1ffe6fe3836a9b847923b59a30689a942bbf121081a02a3a3278369b410b73c2f05e0e6044b02e9ff8ce971ec726d880074f58974ef3ad773784ece3671dcfa6edab187e26a7bf959ded11eba927440724ed59e1662d71e49f5d53ce19ae746452461cb19bc9d511e30fb46538e253961f2984a359c60dfef452299fbb360877d8cf999f368ef5716296dd2008f09db940746741bc45d842b113dcfcde6d024deb980d8b696fa74087231ab09bda68fd536e8040e035674c6012cc49f59be873054fe72ab704410bdb34fb7b63f87bbea2784e15781d41788bcf962b934b2173b047c4e1a1b5794fe93cde04f3e31c99c8125f53e655ed538ebac8f62a0343cc77200544bc2bb6691bab50d1be12e1fb3ecd0270ad87d16a0354b35e3c5cd5e9b45956c858bf6f03ed10f2663510427f7128f5f0501b8428643e03b84ca04e58026407e129e9299cf80e1126fb53e4730986985750997c1b3bc72898dd7623a3ebd0b72382417c80a6e35bb873661e925296782a317a2fbef490a0746166ec39db1fd3040450be7b9441208f3fcf7749f6b8f3cd75462590192af9df7adb0e965ab1ea17228f85da2a981e1fa2e88506606eb9c59e75e41b33e6933e7c4b0145d5277ab15f665928e46882ee6f49ae442a3838a70f91e1ccbf640b15f84f7ad4e4f0f3773d6dbee44c332d7fd77b79afbea5def65b22b5312613dffa7140c1a0049ef2ed2f1e1d98ec784c588df66d9588283b180390c4c50286705079d77c53be91d767b6fffbb32fa88dece54300a2214fdba09b749714df2c7acc747c114c7d7a3f9b677bdfcf905450b19fd9b932147d1f048536b29d06863da2e3971716bba899dca31a404ab90c335af0231dd1dc4093d8536f9dba3324578859c0f43f03ad54c01c63b3b10420b42d98c7a50de32ad8807877bf18cf7756f149723f21f0091eda15e0a0aefc4241cdfc3fd542b3ac3b9176f7ad2545ff9a5235336e6beb4c468f3209ad712bd16a909ce4252ce8455b7fd167de6c314db04faf8cf8695fe77a53f35720b3fd6ead39fd5d1b08db76a6c01a30c95a0bb2373e1ad773c6e84b18bcdc51b0f3fb7a780e80233d8317b0bbf6b3faf47b5ffd7d91f9ab5700ff17a04e4f71b4ada07559a2d7bef30827a3f988211ef64c8850120fde8118841ebdaf8cdf3fc23d76ffd08b6688d2247590edf8f425354a2f8a82fc3bf13edcc1ada4dd1e245040096a5b2cbf295154ac3807cdaf9647f0bfed5eeb9464407782881ec36ec7f541b255880b4419071515e9e58ab5fa84eca3f8f4526a62b3e0dbad8bd4438317af1c31b5ab87c069d25d26f594a9ca927a965de1c540651fb527be5a845efe3e04a19f82821cb7d038ec8fb68fed7ef736e15ca5b898f3ca41010b2967f381eedeecef6d235577f0a53e84b6e1138009be2f95cea0e6976a30f24476d3b3c6809a48b1d403d48931a3ed96651c9e86605cdb99bb12bbb875e175daa17c1224c9c35f8765b80c6429b154454fb6f0fa91bf7fd909927adf53ff063e57a59134f0e6abc080948f812f5a1d01e524ad44f44276c41884c694aac61df00804b37fbc80980dc33db068d91aa26cb40a460e2e727aeb867e0140d0f34790110deb5d730daebf8c282193bd5f8ed63acc3dbea6ebd6cfd1f2cd9c7cf2fd8f2115c -MD = aab8b76572a544eaec4cd64bdb5c84f3c6674e9cea12e596afe88384 - -Len = 32984 -Msg = 690b710fb47b7259303305b23440d0b5374da680367406205754e449cb64ac4af8868541d8e0d38b9ce7ff7f96bc7a5c55bcff7f125319da4b10e6a1adff1a46373346a89da25b88ea366a3c6a20ada7c770cb6872e2585244fb9b1c6655955a6e383eacca6912366247cc507913727ed49091a21fccca708c3d8d23bd0f256ee4bdf5b629df017e4c43b0238b3ed0c9c644da95e1b7771d6afd441c7bd5d26be2ebf22c80aa2f48ef519b1d6849cf70e3b62da97f4c683f25634771684ea537b0e9bd789872a47d949a17a6d7db775b740b1246c332a4bf06991e884c23a5bb96e0de0039e069038345ab26a19cd173c06e11d47311338655c451cbeffcdbdfdcf8dd2e2a9b85c4047be0058e36e49e1105b3bb58931e7b5a0f68a0197f4d8cc9584369354c00a75f643cab664eb8c5adf87f633a5e6c855ca0ec71915705a8a6299818209be393db274980f18f56d1dd70fe35e11a258ea59f65a5202a0b1cbb9262a5b42f3572c1ed8fedf79ec5a8e995b6971470527d7b3559a48ea165d150bc2b77b9b1fe2b59dd95583f260d34198e31f29d07fa3a278a52d6a3631daeadcf7af6f7c846a6eb20e32a92cd375bb584f7af428925acf0c5d7a326193b9a1af2d88a361d16cbbfdd01ccb83b4a07049e8e34cc9bdbbd200e7173e16ac57fde4dcc9b3d5875821d3d78a479194e1f4f0580eb02e72554fe8fa6ae9affc5444209de91d5206cb34c68ce1c9d0f4c8bdee0553aae150a59d16d01bc1a7f42d18e4e96d4c61d024695858e9bebc44a33f958938b96cd93b5e2d307052993450e0a437dccd8f83f2340bc3d882ce153ffe895c44583b6c74e79e742f28ee3d5e3fd111ae2d2592b329537654d280d6cd7f2be6fd03e78ae0dddd139e91316fa38b1dff57c7ee7cf5cdb1b8d51a7f19fa361fb1d948cbc50da58ba74537ed4bcf56cd69704a24b32875c933efc7135f34b7b7655f9382ab69e30ca7c9998c72402771e87e0072d5c9c5ec4ffb64d8071b789549f670869e73fae28d821299539471ade4d7a753356842ad958e7057a1fcfd2c08346c622eba71afd1055f9e604ac9c3f7238b408272508f8d1f75fcc077ca0e08afe38fccbbcbc70ad9ccf638b1a47687d848b52d7693f4af34f241e31a439dc3bf727a08e68dbaa365d75b3d8776181f6c5c3ba6f3719f645551c17a330e6dd1f995ab53c92c1d23302b17ff3ad33b4666224e7f676dc2450720e606709ef0bbc4d9be4de22b4112cf24c6fe2a2052754c576827410d1fe9a0ec3a185159c8d9d79b0d57afffd8faa950e2aaf401f0248558132f2ec40a9ad920481033e358c4787622f1b13e4733453be59626dc86eca7a0da076f27150116497a8eb6b012f44dd799ac645b0e6539426a301134993639ce1730b0aab194cee44bf4584499f1ae5bdc0857dab0f8ec00cb19619ea989a23c654b61c382ce897d56e177055035405f6465fa31b176d3f392a2867f3a5f87884eb81105eb26dc6105c6b196d8477a7ebd75da04925787975b7c0e5ace40401e3df73ce66d361e5bf324866d94a0d326519855a7d6238d78700657b5d7b4627abd9943f98b64e5ba897b73fe07c9e0e2cb4e1bafff534bf39ac1f114d924652a380ed493b84bb909434be8ccc42b0a2085179a81607f49a5164f68fc5528deb947d85d5996431ec4ab16835e3c5cd58c198530d0bc001d198cff3dd0de2a258467765ccf87f37d794b5ba236e2d7c971e3079cf2647e2cad6961de36d6b0d0381179314a1fd55b938e8be3cb4a246c8e8c2f3d8afc51fefd3607d8a2d1557520d051997dc0513fafff37b69ff4bb151e7f5c70eee6141a756d619b8940707afb1e8ff3bf0bffa02b17ef9939550479be372ff5b2b44cf5929a0fb56eb6aa58136684bea27549139163041a0bfda900ea4e0a3a6ad95516f12652b4d7a65b930652e078bc7ec6008f5b25a7ac5111312f1e8b9d7bd7d5050dacdaf838921cc2404e23a0619aef0d518ab4c07ef1c581094324bd5a3245364498291e260c665c4db2ced4365c3c80945c420318523e76e5365608aa7b1e2132629d951477b0d7ab4b22729f353710d45a5dddece504996f72901dd114d85c53b6d8db785684bae551ff0a20a857148e0f58bf813c905ee482835b6281fc5e24ef3b7fe63b6a7c687195096f3815221dd5d33669cb6a3e00d0704fd355029d228665e0d298da92b124850ebf7709b020684db10b140abd31071769a80073afd916c8bcc1f14da45be56f78a5c7ad55221138ede9a8fa62f170c9476516d7ecc50ad45238c74c17c53e84e5b6ac68778f7b151b89eca1c5beb806577f0aa7fa52fd394fabad4e73998a95b466b7d39de50072e86071993c15476f186a4e5c5f1f4838039ef5dd2e2563e2834a5c674ebf4bc2c301ba595c81996418cb746d619686712c874370ce15552bd0b61cabe07aa79539e2396a9d804875c6f6ff63c835327518f91891d9c5d8b20b5e7b0a29a3be6acb966145859dbf24a19151d7f997d6b46778d7b8b7d36915b187fa1a50c70aa3e672e4628b3677e1470f0e225c2addaf766b237e0eaa70d761e71c551c60f6e1291c154a34f70d4c15e4a6eb865ad1c6e4546e2a34d7aa777ae04432d2ee0d92e2068675193be9b59ca69e9c0ec43dab3fd92a75d0d750668af8244c1adad949cfa6ba7b9e8187ce59b967ac3be38bccc74deac959261d3500b31ef96ac3c466409123b63b7471f6cbb19494b435369c3947219d34405b538a95a6d339156988c33a54bd766142bf6113a7fdfe35e8aa0449517a08b2b55277144e520c5c3321e626b019e5f44498c85414408061fc6696b90ce82cf995a254b3980e6b14bbb217dad833f08a22034ff75bf4c1460c628f3ab650378186d3b1f7f660cbcb6dc9e6cb3f942cbf559f86720193675e731e4c32e04abee70366fd55fbe1a4dcb3c9c17c58c300f049be0a588794b917cb0a6c361d50199695ccb5521b099ce538423662b638f3b988ff3a2f50815d1e9eb75db8cfd8de2cb8857870d6610a6175b3c412ca8eab979dc3944b1ee1b9bf58959f3f6a7d72f5d611a546b05073ddc6aed901280c6f06f2bba740352e55867335af3e8f968e9e8901ca282b806fb6d58403b2315ad4842247f1b325cfc71089081c3aa1bc77934bc655b9ba5964891ce3d2aa88f2629b96e8f1f8736e74ca049d54c84367c45098efe65fef43e8c0f74eb45e816bafb9eb2f26a4a052e53f7055e74be7210b72faeeeaaf3ce872fb0f152752dd0ef26b797b1e2c3f45aedd46d25249ff60a366dc33d10c25bf8993cee7aa0bde85012cdc6d3713928f2810028314570ebf2298d75f381b2c219327b126cafe1846228a7e660fef6cc7e7944df8bbd7a7851fa556e19e40c2c726334062f8be1cdafce0fa061704006863c663a397602c6ad108e53b72019c08c923171cb1a05eabe6dcb9cddb160fe93322ee0455653fd91d300cfd31f1ea7ee2938fc49469503176ea481dca89ede2cc3667ab647b44482ab728877c86608208e124fb0f6d842433762f8663d41cbda57d4af95306cc30a00ad26aa03380cab2b8711081217cdc932cda8845893ef24564228e9f8c4a3b03a7a5275b8dbda16665eea59819acc31c6ac3a3de1da729228768dba89040cfcc19fb4decf989ce9a96184ac2da968045ac9559ac05f7cac35388511ca742577fee4f3f031b777ad5b568408fd8cc8c858eaa2a1de6a33fbe652b8f5a35b17a85713b7b0c48095e9e3069576d98a160827d8c85c2142c206a18acf6efc03091835f2aa28713a1e25ab395dfda9ed77492f5b70d372314f55cfaa7284bdb2244d014b725f212f3ae91ab684a555fb1515d83a420dba7d0371d9784840cfb190d121e4b75dbaa50fbe9847b376c6fd18f38a3fe512df6f05e125bdfaa91848742cff85222b25e5c82b8db29279e23aa86cad3002eacb4f7e2d1d402fc781bef8e401f85ad04b378bb961c0c8b592fceb07a9d6409e646595de28cb90a3f25d46839104085413e280ee7d39fe32bf890c4ce6f9483494f8737bad24c544546b83911670d4c06430d15547e5dbf94f2b31c3cd61c1b741523f8c161475b38d31da94f805651b2867a373288c08112c2783f5c4d5542c55b9229aca6348f687f771169e8b646d46d021d289f52c823cc82969341fa99db776442c31d9e8172805709e72ca78bea6b370f9d0e9f05569554ba7860567114fd1cccab33efa1d5aa200b5db894a173058bb706730fc9199151338205037910511e2fcb8592911041749e14192827fcc0628c0b492f73eb651a7a36cc8c024c180b04ba8f31afa0ead72ad0cabc7ff6207df7021d78965a7522f70d034abd26b645b3eebd478e05fa9a39ea59dc19edaa1090814c65b0d545dd428b65d9fa3eb060e5ee9c4e9cce156063e722f19641c1dce10f728153ea5bdbd52850c45a029aeef310b8b15c47bfbc014dc2b775910c3551131c55f0082b81476a50745d00ea42641b7f0a6d315dffca84c5782869fdac7932a65df5cd398fe1c7e16463c802fdc1656bd41fe984be083287de3f2afac4b1c4ad0405980a3a5cd7803f0ea6898393651b8904fea87942cd96342a5297f0a36f9cd280071223110fb95ece4af28642b0eaa3bcdf4db412bc8d245a8f69c2c689f2640588f5cca6e6f93e2323b24867df75aea809e8f0f095c919702fc4bd83aa4a12f69c09b966e3cc679daf6d7c6b273924471d1ea254dfc6adebb25d3363570079d3bed25c098caf65ae6c7884d54e918f1a77335ac7f1223c3dc587e6fe06b1f34d7ff446e7481ea2d5d957e42ebc3b59a2a6db9cb280585ed6c7d92abc4feb39944dc3dc98bca6c99484a02cefd6831e703a8bbabcf3d5805737b5811678f89778a6e5bf8640b4246aecd5c191440547f390b8673fc2264b2fa3c18ca53886b74b29be52387ad35dd9706d44ab7b3e60bd47d614c371c709d07a71afd104f1f38c24d22747d190d060cddb28a6f29ae32dde8935e0993466da5a4a5d3244e6d6cc56b5b11cdb69268133a3d00c20a759d5b3365d0f9efaccbd91b027419eb1fb8c0ddd922ffeb8cacb705bed53abe03f356461fcb90986b5fadf47a077790fbc3bd8be1d09c22c279fd267d305fad20ddd709097654f64bd0281753b5c4a4cb36c35dbe422bc2fd78ef85c23ab8409403e4646afacf7113c7526dd5a58a8f55b8db3bb6a234330551940bd51acddd260c883f8c7e89728deb34dc4a0050b862f20c0d13153fdca2abf49efdf926eea0a1c882b52b095f7fe5d54df8ed9f89b98c5ebb1bc5d5279c2e182784ff4cd9c869ae152e29d7a2b25c3ea92895fe69242dd92d17da7d7bba83078fb053c608670d41e03f9f7ba1eef975d6231ff5c0697d864b4e7cc040c552c9bcca1e1ce1443489cb2fb57dc6fa6484be2eb40cf751266cfe0ad125df864267981987d7ce29878fbf48956678a0447247947ccc74a4cd932c910434bec2fce80ae7b77e35dcad5aa2d064be1ea641485b9b9ebca02a1d04be2d3b7546442854f97ad69980264ff25e104d0b22d5040de18d4365e3aabbc69d239e71dfd36db44f1c0bb016cf1560d95076d7ebf535c9c1b0924da6ee52e1afbe57aff236730ff3127e4c5f9fa6abfdd807a9e1ce7c85e34db4fe4fbc885ede458bb7e536e36dcda758f4c35eabdbb0ef290a6c277f482fabd00048dd054411ff6512229b65d6c522c131aad3cbf9dcde0381f4cae91a8d140fd9f719729b30350a470f2da053c3cae08a7cc7af0c68eebf96e17d6003e5ce9913c637776c2230a5de16b33debafe9de87 -MD = a22cb5c43e39024cd1b46d349e84c9ba81fc42a3323c7f8ebc8c1884 - -Len = 33776 -Msg = ca5893a1e5c06b218d91d87dd4e89259621d9c7f66ecd324d3d7c86dc8c6cb314ff148014bff5765ac6f8e69e5381958a0ac0dc8b0a2fad647d4c0b36986a360a069a1b5f2be02a810be32ccd03acc18dd7ff7eaad7cf54bb427f975d81c3993248745c7c045977121466baf7d36d120825c00ee47c2ed0b83961cbafdd0b6524315dd3e9fdb3c4947cfe219d47350f8f50cd0db65bb099c1aead18bc0e9422565d9102376ca19b7ea203e12bd3b7229a05710b9efb07288e3eabfef09b10495f29d877d2c585843720228a220d45e3aea046890cce94f5744608feec06e25295227e954abce1e75473d48d2e5873db33add7f69e6aec98fa712e890cd69cc6aee3fdfb1da7496d6d19945a9f49c371dfaa8fe4b244708ba73ca73de18ea22de2caf119ba191e5ed79dec82f355b73ff912e8c3f6efb335f104ed8df89394f0f753e261ae86e3642a5d3786d910c1ae16737d24cac147307e666be9b099d7a8532b3c7369754af5ebe41fe6aeef6534be48b787ac6d8ef395ddccd1b7e60ccc6c9d79bf8978978c82df0012f366247c670f125d1a590d07ddd77ae66d2c86c5ca4724b67ce55ba0859a82ac24f981ed97332815a2f833d5bcefe0984eb1e82cf294c7e8b25029da7a931212d23e0ff0d5516351c4dfb5f5c983a857eb3a938a5c22cdd6d84d7482c87528d78988212e97e65e91fe83e5d07a3f3cb5b10b3b468d6db0f14d41be41f5ad516a998c581f556e7446ce69560e557f08323ec821e9fcc22bd88fb179809898065ca0af371b94664ef0a3148907c1dfb54df2e5f9fd30ec78fd2e3138d717e1c22e2d5520cbeb4a39201af9f14575bdae696be925f8b03922cf97256eadfa070f5fae32b7a8b096dd45a4ae215fb7a56e2508463854f134d3d05922ad8db574684191bc5e3a8ae8a5d1ce858baf2e337f015671a39a7a6be69ff2ad57fee0b647a47656a6e9e09c2d64f734a2cc3fd45b7ee52fea51c24af59ee22a0069f24937d8ca96043f484dde7fcd20092f62f48e0e22a58ee35f6e6b5da62d396770a9b35f1cff08b3286a2372aedc21513e30712fad8703f7b822b24ccd1b656fd26444c7dc0626ee176da6fe1acd8dda3804bf63d448ebe7531484eca59916fb9de56673962fe1388be4d3629f789112e6edc34b356fa93ab6b03dcdfe1ab08339b98312b9e0ca3afc5c3350bb61fda3a14827364f7fbe7a599267610524d4af4c6d34f5d5dd345def304148ed1e05f51dc055b590ddbe2ec2177c36792bf5d83c5cf6cd7859c229eb0d77abb3015c9fa2d2c959981e0ab076dbf6ceb8a49686802542e9fffaf617664060f98bc053fbe6fc0c92c3c536b7ee3c518a42233932ce32a3dbfb4542cef77577c305bfaea230b8a9e1b257c49daed53709b43c40856d218423f8bd3a88f52936988f63af1b3674fbd6d23a26ea1f22f1cd7d345ec6e36e8e5256b73ffe15b827daa760e7df6ecdace2a200e015e5a22c360bbfe6afc7760cd7b3e7d596afbeb619dc1beb67302f2785a03092b968cf40d3fe437a789fd49a349eb39ddb49a97bd69c192c3b2125e6306b4d914d3f26da47b3538ce9c2f6a0e955aefb446a14f38175cd2cd3b82e738361ac6e39cf3552d1c954805be778db76973e705a876d97aad7cc5fb97bc559ff01f1ac17af773532beeb174763c7845cc1e68f96383fd2c3608b4764d26703f3eaa1bd5f46690bbaf27b9454ce7f461c743bcb8fe2f85f6b7e8e765e52affc127a4134892a97410b028a99dc8dec9b360ca296901e1377f3a04a6f1e72fccccb4f34841dc26e7f837d9c9a7738abfe2a19bf835f403dd70c6443942dc9d9d09eb8003e95b46b11b4a226088d4539e97929e714360fc3d706490e77f4cdb3b20d6338b6796719923f4ebb86b74a22d793abcdbbccd3420281bd0fad1bd536eb87df42ae4151069b53a1c1776d9dd3531a1db80c7c1134d3ff3ecb85fb96cfd79e6ac26886189e77c269dc6d18d6e7e66cfe4a68dc6018e5ef4cc6a52c78eb20d1b41c87a0146dc1dbf560da518bbd0c1cdc096356366a92d275857d170215319249d58e37dad0f430d2f331a002ef3eaa25598e821aa67539379c9053a8da94807a61eea5e284a9419118257cf2dae88568df3ce8635907940150615af3b7c3fce4661b82b1e53b8eae240850c22cb43f24ff10e1c6fec463715572a579194a981646b746cf7f358888cb6cb407410c57c82d8d16bc142637f62046cb9f8b82c26e88247aa1af21cfcf52c52f28b46b3ff10f13efa915c7720e255025dd9b270c7b9ef596bf118ab4d07e941aacf35b880e0847e5148002b237f9215cb9a481e6bc1fad13ae32dae83a837c1f1a8a47a09dad9b8f84ff7278f2002cc8ca543de1be7ead89c58f8cca7c25cfa4d7e5ca1a1e63715780c09126cadee5027606a57de1309951bb842aec03ca11349b926d651ece8bd57e9fd95c30d9ec824358732bc2d9d313e6cd3fbd6fe4e356ac1c8c120d432d7204d9d579b2a5a5d0c8b6016bd1eefd38dda735cf2f0ab873afe0a0916865e8b58a0af01fceb6a3765c9bfaceacc47a4916bea791afa003240d9b6563bebb3038949fc3aee38157dba596a9c4a20edccd187fff95904945d04b8925298e97b643ab24cab7af9a55890a2298de5022872d6977c85b4f6b0310f0468a33469fcd9f44267fba71660ef710cc628c45b41be260127c435b89cd6e826fef1175480873e6114d37e788f6be4ff0714ee1180d94b2fc85fe332a07317841ce54a904d99a0771ddb050579f372e3b6f96b0e2debcd8729fdc64d043025888c26d407ab35a2ec48ba46a668b0a12099814438901b32731147e7ef0f369999155dbd9fe484cd295e194944a2c9fc1e79528079f192045a47e44d010aadfb1e7e320e423fada894269f14c5706708461d1427b89778caa4947d006c3dbdd481904cced703d8bc966af5b1131ab24ffe4f7042ddcbf40db8c0ba0916f08caa2913540546792f8f98f0c22814e8d158afd50dd8cfd52e540093426fe96b45087ecff1bb77e9d7ab0081af7fb222edabc27895f178fd4f27e3d5be3accf50e73e88bccf9519afb9837e564c0d30f2dd19d00ad95bf8b7f0ec94dd573a6d80f75cf118dc6bed6c1dca6e488f361f8ba51aa35ffcd8cc6e5921ac43021615a72959b27db2ba6e35101b446c31e4325bbb350df33a0c7f7aa3a3f02774ce4c45c5cb4965e2fef0ad48fc8d2bf4b61de5980f6c5f1175966f58f9ecf51fc175ef7508325bfda8293720c4c512181a36bbc3f06b0e039285bef18a0f3663ae26f6bfb6e9ea63447c65202a78c94c9f1130b78e768a80e1d1ec05dad355f0d2d41e0e5dec7ba4626eb9df84148be2a33206fb301b5f29e20f68fe62e5ee47ee01a7d943c6aa41708497a77825047ac51d80f79bc5f66f21a2d843c89369c94e3436a92ee4d0cafd3291206d26bd85733841451802dab11f109c9e6288530571e04d0675e39981771d38d2d99601934c26ba5c4b5e86a038fd3836c711347cf7aa4d799f2f5f356c88f12743ff8b14ae4d7eb59c3584ad1dad2dd57cea88a05dd6da6b2144bc374c2a5c9642cfb49a1820e0d981245f482bc50fd2da60ba10031a5663a2b01b17a465cdb84c8318842855934090a770f1e1c930b79610533c85c953eb79fe0646f3bfe705c7c611734d300883514b544aee1e430c0665ee866488557b3d7b0855b8bd1af75ae559d7f564b30a396c93b38f58b938c1fde6ae1dbbcd8b53d39bb471d1ec156c8d3c32cf48255dbfa799bc73fd05e64f34c5e41ff84ea463842af3ad92cce8730a4314297ec1e66a68e0c60a7fbb6d14a726f8f9b23b5ed3095083ca745fd9150908ec926d2b4cb04d0380d1553c55a8d1643d296e260328df86f556faf76fb8e5e82ca897c3e927a06c4d57121b38722018212da09149db8348c8e19b3624d54d8b74ba832e54472fa5bc1a3ada8e072fbd5574ee0f8b7171106ee8d99e91009c4d2576b3cd1685372a3d7943fcbeee5cce4aadaaf35071356867db4a932cb14eb7ef3bae12986853744212a1f4438e43b561266bdf21515cdb344742b6606df1561297d6b16267011e7a74e953c46d511d398da53586a833c364ab666ac4ad10923009c20bfd17cc73470e9e8dba1211605431eb98f8dc66cb69863a32d1d52916d81ff494d0e1123d284e16148d03112911b1b37be064725dc34612a100aca73e7b28e2de76697eb6aeb2048ac5b6ccd2228b7150d5e6d2e50289a437e96a178389d3216b66076e8a3ad8ce52ecb390e5e73db9aa51c9f51b97cf4369f4b4068084ad14ae18416e226d30f7ff7a7029fed03700faec84754bf36594a9ab00d0b01bf5412915adfa19a65905f2e772e4678e05cbc4febcc000b60b0c8984d7129c906a4b6ee6b3aeca869f6cefcc425cca71389e9b10c961d4501e1f8c0abd5890827a77e1f3e8d8cf8e92b1289144ef921a3dddefcb30d731522d3223b519ff4672847b24d5b414a31ec1673fcf213948f9842e2576899c921ca708e30c739328d136b999f4bbfecfb7b9f3b7de3db6798fb9f3feab4a2e914019f84c896090b24effb7c3e956e3a009daeb036710f38e5d3db3bde1e909994cf484b2b457947d1c5dea351c1b5fee55a2b1c4c2315d01d28e01f5b2fcba2493d532c805cefad3e9cfe560158fefe55bafec5ea8156f7e9029533886dbbccdd52a96fef64d506137c42dd76e1b003f6c610f436143a74f16ae2be8e62c8def517305ca2e4921af76e927fd7e432d5708547f058632a11dc67af0a95965ba23c92d13abe648eb19378d6864ce9ee3c6c008c0379f78c945302e45dc490dade57cd75536e6c31938fa5f638ff794b00923dc873c156c9c6fd426a0043d8af5bf1d002edd885e38792fadbde151bb1e88946e189570a4a6f832f273b3bf640e1b0a1625124360c5744816bbfb95888befa23c18d649b76578cd10455d472f7383c4a7bc77b0814c94f418f2511b739488cda4ec70f8fb445c131e99835d53b273ed33796058263a65842305645c02a4fe875727e81706e03c956bf4a87a773775e427c08e92c61b50a8d349b7efbc49ab5fb13fce1c50b574e486cb4f16e09f043a13463508e77c00a29853ce4f16ff39c751b875817f30af510da1e9cb4645a96f746f061310b8d031e09819e29942045ea71680eed8de468b5efcfaf00ec7dfe4d9af7459c87e69b75aab2d52b99ea5762fde72acf43ac4f3f951153db092124aa18c0235751917a354e16b080e8197be6a74bd5457c2c51b7b32ab0cc230daf16a89224ebd3564966dff658afe775587c57de36d8a12a17243163ed5ba20a489a32b770df73ffb010449af44000c5972ff5e6760f186f498ef6043310eee0973c9e752ebb9b52563c654aadbc9ad3df0469acbc734ac38efdec55a9746f574306d4158608b219e4f22a4eabaa1c65d9059b78318b9fed8e7afa9e780e8e36f500bcdea14c201a01387bed1592f0442c397492fcdf80b7f20c0826c766b14754313f1aa7124c1e5618407113fc7d3881a8da4147f753e762bcff36bf05425009a1430fc0dfa0ec8b996120cf712b09805bb6ce375c81468591c5168872a71abb58b107123d834e47c3c6436e78627ed059f181f695739c0493430e49354a6d135f7248c8b35d0a329f58211b9a8a601aaa71a2ac2a90b186ca61662ad79111b9bd6c1a08ca97e9f534fd04fc5e0b770557207980a33f4cb43f086554dfe6cd547a89c7fa0897b3388b9e32394c4e8b3a67e54e9b89ea3736f91e54efd5b06a8c9fb096c8f8c630a2aa24f4fbecb96460e2a7682564f838b3008c7b224256b10b32c9ce971f8c27dc9b75926ac7b5c920d1501045bad118d45d3b2216ad4267763ebbb8920752628e667b54ad64ab84223bc78e2315dd9e40171291f39edb5778c8709cde377ea75f111c82ed4b015b0d28f42a -MD = 6d99e24ae740fb14d971811c6958965790a4e45afa342823a2451cb4 - -Len = 34568 -Msg = cae884fa25adedd883ef4e7c855def1966cf928083c40f361b0f3cca53cd0f657d9a07a39905c7a11c410558f11da229be351ab8686a1ffed991819a016851681ace465531335f72e24dca47630c0569c4d1434f74db11610801395238a7e7b02aeb0ab9f41ffd715c7c67f1e11460020009d5eab0fd2d862fc92c990072186435591b77eab1e9c61236a2ff761cfa1bfa46973422b9bb96d650221862b12eadc17f41361bd26a9a8ce44519270d1cdd3bf152d2d4f802b885fee377654c6fb258c7449e9068ca1553ec16e6fecd0e704a70ce6fcea04b15c53b365d122b249c8198eb58505c4f5eeeb8de0f024518fbaf2dd3b1169aded41d6fe5726f379492c55aff0c6397429ee5ae643b3b5d82a6f38e2940b6cf031f1602b65f875609bdaa764961d200ebfcc1387213b2fe939b9dfd97c5b626021b365d72cc5f71c944ba528e00a47e91a108bdce3f6e0e94ff35e1e7e81c8622f208e6e16001711d507d579991e1fb7db445a541667776cdfd43a2df50f2d9accc1106cac4743c4d097aed31bb915ef85efd579330d61f86ba50a848a64006e8d0db25f6a0c0bca196397d1d26bd8f48c7ba3d8c4792f00761e35ae9910cf51e27edac2e9beed76120426d267b6d75b51603bef450b3d0971885228cba608e96f8cf01385d0477d4ce1e271462a7fa8974614292f642a98007bd67f7c843b9976c0a8edc8f0d8343c95411af8275050a085b312fde466208581392f364be5e6bab25bae4d90ee3f6386c95be84de7f82fb79f493b3c7e378300f094836d76558dca8ec16e2117f3544ee1a0b0feb4e377443f1861bce1418ba3a35bee598b6a7281b8e3c531d3f481563085ccca25b729c4291d0be61dd2f1b1b7e1d1a0939a0b607071cd33b0b76d253c67a630d8e7a9afd3c38468b26077e3b4d2c7c31d78aaff4bf7f0b72cb09a444be2d7b34cf9997fc5b885851d7e6092008b4b41876af3a681e2ca2ca6747b2c0573cbc1d0715bbc854869fbdd815e454197d69c6ff5580ed8ced414bc779254ef971d0d21c372de891fbc0d611dc385fe64f44445bc5a80a718890fed3e624770c925c5bf84716e478ae66a46a822dc7d9f2ed997047db4835c636ea74d8d8c1f8680bbe818d9d4573693730cc51ea16582d0bcd2822412d406fdc17909568b626bb8205a150eb92e9f2db811d8f98d3cdca46e96aa00143fa4b298e1066fddefc536c383fda27534212fb9f47855e879f8f48f31d074412cc21c656dd93bfc0e3f76f5d43717a11e5913f93307b65b93645b6f62ba031211cbb5a77dd64d5e44471337e945e0c523c374e64c2b8d4f1fab43bf77bb3f1f853df8efafa2168d2858761a21ce904a1aeccd11ae386d4b853a37d00f588ab1fda560ae61b119f131002a1d2c2598b83a3176fbe7d2b8d94a9db24188166881f17e87543287da32e4ba99a156ef8c88283e1d15777f026106425d9480797b07e745c781a08ad9baba046f573080ce425b7f29eedb91dc8b1ec4744976f614ac7587cba72a5e9b013769f59f479de06f4a5127f892bfa9a01a9090c0da10d7e7f2b0ee453e6790aec347e6fa1a7b65778b6091c31b5cfc5870435d9b286e2763054db9dc5b3a4d0c144a9df817bdcff38529e1cf03fe370cb6391558f042a57613dab8ed1f4b42b170de8509cdd9725bde29b28cbb17fc4562fe726ab042b4c9b4d465e7e91ef4278f7056bfbb630f18dccc6e7ccf3ebe9afd1fdf40e6f2f7a65ec73b6d5739e3e6b6ac6d7a5ecef8c327ae702faed6f065eaf9b68c12b7c0c4782fc3edc80084679cef53ca2691c1e3452c8205d885343ec338b29cb225a28c977a79d9da17783288b5844fb13ffce19be30eafeaadec9e0c494e0343a13f774343d7c20bf311c0309b895b7d4e0c56b25e607e43c59c0c2c97d35055deea0cf1f85826bc07f3a8fb1dcd7de93062bb1efb32017270c501bac0fcf4572324b63a14958888ea90556e98eb37938ba2774835fdda0513f9f71d41257fc612822b6234fa57f0ff7a4df1a94d08faa44e13b4bb2e586a43ad84fa94e743212184a520b6012562db140b2adb7d828d3ec828eae74e1d10744213a938acff06c49eebfc2444717ce1e005808bf704c9afa32f5146c788a61a7a2bcfa90103d59053483b1c3ebcadc870d5895744204e7b518f9e56353b89ca9855c4626de22c19244283fa5a6753e348e3abb9ef657a2665d218a211a639f93efa3df15e1a68a394736d3b12222dc6dac87e104344eb45528f6696e749352ad0a172e24c2d19d426533d7b004d89e7a8fc6716fa3f003caa2ffeb1209519d3efe42991d29abe2f5c5a9b26bf7a06ca25e7fd2a7eb45780df3c478d482a46890f3ac89c6bd3d419a901fcca7a1812e2f423a6c74b555fb6542cd797d87959be910db67e9278ea378ed1e8d2faa83cc676280a79ea929751cb7a354d5bf2b1e927d59994c0fa6eed8052d5dcabbae2e93e7d8ebec6ec8cc787ccd73a4d36ed9d363ae89b81b8e0c0200d4a43f7c0b3dfaf8cba027ad3aeac2b6d33cb26a66b5f3ea609df4f64de33e059bca5794a1dfe6bee02e170d88b541903e19c72d1c983c39f93fca46eb5dd43c0b37daac78fd9d609ffd8437b9173f309471aac4976cf47901d600b471610bceab53906b99806807907536d2d5f702be60ac24d6df1764d1feca5fe7e6d62de30387407a0b4e8fdb3cfff487e53cd3632731fd0bfd83d46a7a82af8852a680a29c39b480d6515a032a0188feefd0fa46736afd0df8968b6bfc68b83ebeb84d34fdd3b226036f11a8e2e5b8defe9abf91cbbeeb81d83ad3fd0de341b231f4dbc1aebb03149992fbf1ed114dcf17826a69b8959112a656f248345b148bb3427470385b6ff1a0a16107d2ef0f7b447042f8c158b56669d13173f938f7724c8a5e692219bd6521848b1119e5c5878c4c90666e6d20252995d8a7e4e3b30f05b4e2d5f45fb71a2223c1384b5d399ef8fe9cdb473d9af8ee892f0b7ec21009e5a848dc379423b5ae664ba4efbe31668e6fae7ed530eb87c1957ec84e3ed509f44fd8a5721fcae1ca35707c8d70768758850e779fafda79a9a10c05dcc0ccb63b8fda592d6a744480787ae9addbd0aa5e2904ef2d203076af9522ebb1aebbb9c151951ff1dce886d717af12d8670677a744d70e08ecb528da5908a254716bb98f7e522044ddf050d8fa5820957ce2953bbcd0fbb77c313432d606514d72a45fabfc5983b1d5524a8909bc3a6d822aad227b37dfc2376c45bff2642025182d531fb5f271bd2cd71bf42d2589e7e1a766646754e1b2842d018a96693863cad03cf38f6512f24b476b214cd9348b0121690a6a6e2a0ecd3e109aab5ec18ff253c22d74f98dd7986ae4164f2164e14a605d1c6bcee15e79651bf7178be232f77f8ed74bf70bf47c082cdd1f454172252beba051bd2f2bf06bcaaac438c4d3411c48f8fca7b3d260e8eb7ea28df2c5f84bbba006813cfb9918c4ba98ad8ffa38f298996e51aef8aad3caffc241a0622c89742371622f59de33b22f7d316a2f44c824c18b3d23eec491706a66a872d22aabbe327aaa30ca26863b125a0e7dfbcd6897783ab33b3d14ea87c6760b919c597943d4099f69d8dad7086a168af1e53b9897c663fa1e6c04a6b41cd9b2244820bda811068bff0a60efc03f9beeee76f621ccb4ee5bf303fa8ca17379e5545fe93d98f159b41de821960c99d0829b3466cbe049c41ee28b6065f6d33dec49681bc2b97deb63e9fb859394819d8d21a9f35d788ecb8b158b9df95a450d0e2aeb1d14b3bca2df8bcaf5b0fffeea59a85d06a13f89ece9b18b191076cfd1951f7059fb2fb767722cded7b3f6199f2c57d7055dda441082e1133c72f27c71c75280363fd5742362f4bd946520d9a54f569f5a5af4c71d9ccbac6ee67551d6ede8a21ca74cfdbcf80af1958e2646e20ace3d6b603318fd8097dd1736a758e64e0c5f73fd3d5a1c7c970241f6af683fa4e739a2373f4196766e2f9f2832988a34e43ea4074f912936c276ff646448a467c81c66a6c14ad2c578296e85bb19abe598c7158e2baccd6db4d739a2ecedfa999a6e1e76613997b7dc53ec14ede42faa51822f5978b2ee6b94ac5676f15f278384b5346fc618cf92c335829f6d0000cb37f85a32dfac76768b7ebea918a7156daf7b0f5999ee619f545896ece675049071b0ffdf08a14cd7c1d4d8030bccaa9e424717fc81c43526b84392c5fe4c2541283284299a9958d65d360e4b72d6d06066a2b42027a1336f167edcf05d8c4925830753d83e9d82ba882cc74bf4ce6ef943134e8c328d43c19792de35ac3d5a85abb6d2b49bb3b2cd693f6cc93abb6cb200224d094b914d666306fe5e93673fa9c7c76b845ae6d05529f6638eeca5b1d3c657195f1ab339a4a162a631b913e0d900c38512223bc49befda1562b19427a4bc3b1a5646fdefc4792f3d78c749255d7e3187249cbc76e7e472ea0c3191b56d0b55b9b57877570d14f32bf9640ff67c6899db836f70cf812f464b5615a34375da2d5c4657285ac99a39d77d396f3b80e683e8f7445fb5b0fade9e0605d3ba05524c6dcf8c18de3e3386abcbee70dcaf22781648c39211bd6ac34ce5a82800659b395219be4fccb605640ead2a1ac15241ffcd3d9310ccf0a97cbebba7aafedddc7c75ec96d60d773b5a68e99576d3b06ea1759f5de1cc91df915b50a9619cb53d9e3c10bcb487c9fbf12248d88bf813cfe57636c80efbe8338a8a6b5756c334e726114cd7f124f66dafa2929b6219c18c5339ca7d9e403dcef0b5d6599059a3029c5b698f96cb45bb1f518f85011f03ce732423239982d7d84b43575617474ab58981308ea964fd0ac697063f72f021bdcea0086308abff78219cb7f7f476712974ed667935d667852eddc171bd766380eb1643e5f2a2fdd6fc28bde32ecd6086e506d6fb3f0bcb51de8986c2e897114052ec9a505f4f191b634e33c2cd335ef3643447bad1ea71995e051edafd3d72248c8cd64d579a9b6fdf79df3eda92b5987adf805ef25ba08337b75162034fcf55205cbf83e36bcaf9f70e8bfd5bd1ab9eae6f4a90ab46a137f009e60203b570fa96c61c9b0aaaefe23376fda75bd8892d894c6df80393bdde1162a76104579d3c7730b73cd53f52511b19fee5df8f976c92dfb13d022b39a022295a280e1d9e434a04560f4a123b6f385f555ff1de1c84518ede07b0f460a4acc8c8fe29efba3697a9c2bb740cf26411b1ccbc98ad629d4ec2bb0016d7791337a6b98c5eb53b3de787c3e95813be572e7529a4dde4afdd12e411ce3bbccb14492bf57ab4576782c00620410010e970181535c1c66b4c6f245aa819278c9fd06cbf436f34bd872aad8ea36a73ecb9d956f7b8b85e2a81790c8e488ae32d3d6f27ca6c13e5cfe2603387120db98d77b770857a34aa09952453e6b9c87689ed1802b4390fcf76c24adc5936d1dbdd6a35ef2542dbb4f1d29780ccc27ce887f7f386e56f0bfa986d102f6cd75fe0c3dc785a41d95583c87efb1ba72d4e420ea2293ac6d9ae6f1e2cdbb429bd5ed02613ab3940084b1f78e277acdfc0e58b0838e2a7bd3ea135f147d3f4f6af77b3f058f4158a956591e74634bcdc44eacb5cff455333658c54f7061f763c76529208f37b7487484ae0fff159d20580040af2407bc8911715d51ab1e8c264da9674562c69e19feba314a62d0f77c43edc51b242ab8e3d1ce7bf418f5561d4a3ec62c24be6e13a441736c6407e3280441aa7844ffe2ba13ca81a54e98fdaf699fb63349719fec01d4f4c4673cd8ba25b651550ad9c29233f01ee3a07bdb531846c7f94592bbf993cf2610e0e250a904b65a2fea5ac102dec9944dd31087bec2be6becada44ac2d69a97a0659ad38b3dcc356767f5766260c192324af98b391571229be5f8a4ee46e1ca1169c8e9c73d62739a083c4b576672894f7c894e587d097c75933282c2712f2dd261eefbf3900385464f91c8484c56f9e3ec6249a365e1fa1819d44cf5c1cd4371e28f9276b239faeab28865cbaee9549e1ef725806c94fbd1fe407bded5569b5e602d35e7307044f5b592bc47fa9439dc98ca3aa -MD = 69af5ff4c109182dae8ec7792deb6fd309fe01bd0b81bd8df8208a73 - -Len = 35360 -Msg = 81f0f1f020766e876ca103cadfd021b3a05d490e57227e223f3cfa937d0e2087b089b208c9ab44aa1d46f06db8034ce4f4a699974b943da76a9274b086cf42f3f325acb5f39c27e2cc3051f61dd4df1d71b6d69915c5ff6527719418f0b1400b744b47be46500078a1e58c2eb549c2a63f1469dd5cbdaaa59f5fc49261bd02175883ebed6ccfb8b4c5ef0bdd296dddc78548b828c98527aff9e66ce881fa705fca5600080a2135de60d634cb204518c86cdb2d4504245fcb5e8ef2e0fa70732bf04aeed8cb4f613e992071bf43db5cf01b542ffab4a23941f6debf437127f1c2f2e91d25545f231c995729833a368f89ba3b251181089c58e85e3bd89128d36df9bbf5b7505c62bf8802c3ddac5e9bd973197950155d72595d96ce69ff7a02742d47df55654b08708daaa996415c66296c75928015a9a28c7c0fe1bc6625651fb51541c93b36fc77d0d64276a237dac0cdd7d8692cf414396e50da9b6c32e3b5b9ad84d97b24261c7a0ef64477f7dee8bfc7b3d20047b0a85ae123ccb9a866806398114ecd1e6ea7b3db2dca67a559e76ace8b8439a95e21694b2217f68fd5c6d95d4fefd82bbc5fa2c34fce1b473506f573c848802306ebc3154146cbef17d04384a5864553f88d7050c4193be8598d883fd2e47dbc904f8fc7e71fdfd116e6ca957dd9bb9e0a79440af5736e8dadc44db91220d77ce495f6ea7b6cdb3cb95096193eb2e315da6b477848a35c4019f26969eec6366bea051f0567f36639e855ce984fd765bf51aba1222673ae08856107d7cf9c44928be632a0127d29cf8b3e9a981a10e8a555807990f8a90ceed9574d8c1e6ca6f8ad825943e4d1cc068b5323a3062714cdcf34f74b240e1df8fd1d630f41fc07a5391fba7745b9f6e6cedc91407be29341a80d45da146a8a30d9fb72e8a2140da218067dc39dfb4f783d210cf8e10b0a09c65488c52e85fa9e5638a2a0a77e60f6307fcbb0546080c3c06abb51a168242b1350eb95dc2616495a1e1abeba01a9a96bd1ccc5d2b031cf40fec6d521c287b1764b93d185178639cef303ca426490c4b046a78a80b309a5a326560ccae0dba2d68bab01901ef1769b00844ca770bc4ee6248587c430b14cd32a937d048cc9071d5959ad67040009a78dc6cd50edd64ff7b48d4507f1d1ccb652a4b0388cf8e732fdc55e71905af9dce2f1d5a7a385d0ca3ee84bb2bc102e36e5b12dcca9124afdbf199b168ca74e21462cea135972d7470abd212b5a16793a2de47d2aabbc3966e77aedbebe91105d039f96fcd9456f565f3550dc938cb5a9706327b85aa0ba55bc12dbd1f0be487a5f7360cae9a59ddf87785f2b2e1aeb6df756b3e07e66d8b28709edb7e8d6fe5fa3d0d0e6523a6bcac8add682f567226d0ae6a909deb698659087abd96f8238f416dd6fb6dbade0ff6bfc3e48ae1c6291f13a929a433604561fb39e9d4c6a002102c3c4a34ea60467b78e1de522e0b3c1f37cf6fd7591236e7cb54d6c49355dceada9581672cce0e8f68bfec1195c1ee559d15b993c6dfd93efb640af2c8b58e360b8b1750ec87b6b6e1b66445b38aae56c634bd660739baebfde00ccbe16f74863185929eb41ded96964dfd6af1b60a9715a4d1ca84a04a83554142dc77b44e6fef0d89bd1e00f182d91f0dfdead461ab3deead3dd9a4067994104380f6547a37968b432874d181202c822c7b197671e7915a863c70d58d533cc59575d7a07681baa7755d72f00ad3231fbf6ed81c89e0a2a12352e4953d94a1e9af17a628c1e2edba86e872fd0d304f605d45d127383af43adafdaf6395a275e4f6d2fc6deabf826d0e460f48f6bbf3cc8cac8f36fb3b089033a93bd134213b50135424e06f9c2b1761f2a27455dac2ecb3ef5ccc41855239b3f2046e878544b37b07ba10beed3a42287ad6ffb9113f19699ad447b99e639fd244a38c0e432477946a468f57475285d84b075b8ee3cb0b144b8039a1daaf5b253d93ba36ef7d14f5f834acc72ee65ad7efde0845e6e91a5a5deb22c8eea7d413295f99afee9134263e2f099cf87829ddd5a5967c9f2bcf826e7f936d3eef9322b4517ac7c5232d9ba8701647588a7b20990886a15115a352e9a7fc2d4fe920ea4b340e2d078599dcd3a26334b39fe766a6714942b1093e124c0edd779626f5b07a51a42e2a4ae1402c5071039e1ac7068a6a6eef33a8e867221ea7eaa61baa4bbe44dd79a1d59c8c2ef4b0227cadc286c17e57e55d674ab7f851fbe4f44986e283882a6e12d8341767f9b12fd3ab427dc807a4e3a2b6cd9b3b4339f50543343b66861b99d1a5405843e9e46a37a5cf422aa0c6688829f977675cf2995d6b3aacd3e9117b82df39e56f4fda802d2fd17a45d44cc2923356d30929b650615402cd580bbc818ae899452685f400089bf19cc60ca8a035655e349d13e5a8c58005036f786d5a7e53d6de2646d1486e9c981017d45a80063278229fb61100de61e9e586b9b454b1938b36daecf2f7d3844d7aa7a5d2c0791d4d139d8ab907208c09ea4a4a120ee94a1ed5b0f2c96cbbf57a43120bb20ff2a8459df2fc5e1a4060fd98069416e779ca1a4134f2c535ac62b6efd37078bd2745ea084c9560b8a2832d655832338ce7a605fff36786c1095e7c07687e87667b88b30916f07170bb6511d8cbbee86db7605a6868cb8ecd773b41f04d707e8a63d33916ce7800c11f796378bd74a5e86d7b901101893d896aaba150ff10ce9774d7c497ff968f2833427abbc9fe1cab7e7a3f905a3b23a35802029ff9b9e81c22e91e2316f68d248b52c0186dd58d156ecec15cef5bd199b3e0fe43c9e65b96f2998e4e91027b34ac2cec250575a7b4b2fbbded1d65b7eb22baecc2ec20b986686bad511a34e9d70a3347584d68dd17ef839db770e34706191266b3ece3527908d1e3f10f18498a29f88a2892299dad78f8d942864f1f790b69e49d28c8d6dd386eda94ec272adc8ffefd1c703279f3f3be1914da23a1b27e33fec54c2bb7218b84e9c33ddbfe3cb0c938ba641df269c455a5b4c8eb6e50f6031de2a39673e486c6a9f270c1443910b9c578ea36879d8f522798ff10e5c2e759ba7beb938da49ea683a921519d3034732bee7f36ba0d99361737c92ea896d6aa5cd760ad64d057a71f5dcc1759d09077b4719f78fa189673ed27d3bf072b48679dabcf3ea9f6264ad596dd8d1a98c92a27a8c787d86ceb9e21cf9b2cb21ec133c56f73d1cd84aef43edad22d4fd7231cddfa83ddc5792d075dc58c0219efb5719c78eb01301a4645c39056727a3a52c25ffd610551abcf51e97012d9befcb9b36b7eb147822580b1fc6db6e71a30bcbd1617cb790d9347005d75ec1e01e4326bbad7531f2414d2cb51b98005b038e56f98d04fb349be2895323d64499334a42d13294cf2a686d0f45c1a5e58dcd1514c70cd4a4e969ae883004d17d6d34ca35a0cdb0b5c79e9ffcf83e68e5ae09874e6165567a594a80b4c301b735052baa484f0631ac72eccb3af61c4bc766bdce4cef20f0452a46405635a2f134081fd2c30665807cd358d91266e2b5555ff3d1569ac60ccc0465d6b6ad6fe5421f1929eeef7303ed91edb2cc70190e553eb278b489de11d890b02a1c54f1fc27f22099102fb723c655b03cb03e48bd90ae03abade6f06731752e24d052af9eaa283c0a73f1b948d1c6ab6005f5f72cce55ec528ad684769f5ce7ad19ce3134956975625d5b02dbd48de50715c0afc2d7db7855948323a5eaede4ab41f00024ae5fd48a179519429851661726c5f6e772e9ac9c1015545ed9cf2c088ee2a3d8beb0606ae9c886e7e5bb377a812c57036927921049b4a00935abc7aa49c9a2b68c0422ea1a1cd23083735f166e1e577e823c319786868e0cc628be7bb9d08628e20420f3f4b884873920e6d534c380c186d1911a0eb6a6d054ef1861281cd6958657646bbdc52453d06ad59d1d4259323c8dbb822a6a70bda7a7dd46dcd81a6541a6f63cbe6a3bfc11fb33586fc36a3a6e19b6b522cb753c86f916111e2adbffdb99dc4c3fd050eac17808ed73703c42e21c8a9d3e003cb3bb8dcaaa363a9fcd1cd72085881eeb84ab8c5c44716f56b0613f4021c6314d8b0c0a01f96c31f136cc09cacde07d943496dd3845b1e840edb32adf280188312d4219c3e5083756a2b2d6e00e9115d4624913a3d87a048362a0846f9c382a6fff256119585173587997e76c2fe10d32748dd7a6e516eaa676f0f5f964b3428f6b7c8b0a3a900e7e2443e37518198e37d32ad14854cbc431906a278368baf61ad8113e9f710e3050097e7304b180bf69e7e8a8910de2b7ad1ad8bf1890956e97aeaa23dfe610ff5791103f20e260c953188f0489f8a2eda17b0068bdc48bd38e5410e1d281e1a61a24c0eed193ffd37acfe68f39fe558e951baac87cece54d87340b21802bc84b222b57291faca7066872b6eea80541c11162a0875cf0ec030bb5628bf2ca0c17f50c9e9713159e8aa46bc7ccdef6b0af9eb8a94e66b8e51ea13fdfc62f47f6311d315ae1b4b62c86b620e1cfe4bae880c3858cc5a02c1bc5d23a487b3f8bcec1220056ae0b779b2227fbcc9fc137325b093112931435d521250e66512b7ddcf18ae359a71e4131887d624fe57d57d568f7240360cab95a5a222401f1fa0467e7df412a74f7fa38dd43bf344921011bd115c627d6c8a1f39751e2e102b40ab9cba88292bc9e8cf64cfe794172b41d4abbeb80459b18d6e8003bb1cd2d627618c66e0d592719ddb4fa38f83f093e92ab5002b82757c23f81bf67fa8e1a0a30cd00b84c475f72d7b91278a4f5b5c84a86b8e1d793b3ccc306f95d23ec70b71f1fa00ea62309b1614fba47e52d1f582c231b10465256404cbed9a696afd86e2d58cef883b7d0dc62bc1a2c23adeff920c9a0186c2cea25c1f284c9b99ff93941bfb4ff4bc959fdc4495cafc63eccb00ec16f80b0e8148409ea254ef6847c1f439b77aa67224f1b6e3ea55836a85e87de54b1d07c507e640eeee2beb42508291c3542823d8a583f48e320b0dbb34e8578c78e91372ad0cdb746e3a05a4b465db2d53b0e36c91c703a7ff23e1e2744b2c5652d4a483fb1c8ec39517c52beddc5eec28ad6baa645b62c5c468a65cbe717ab75b7831957ca5b951054db03467669b846586232ea781906c0421d1968e0bb133e53c4113ac3919b141343d5abb94ff9a7cd3b045d5fa2b0f40e7ea3c6d6a7e6092a9698af436fe48ab73f30b44d81972e10e89ac7a2581240d33569ad72e10a1e6480167ff2ff59bd67547c2bdb077c234af15bf0e94415ebb9cbd5e55c7369c5280bf3727a48e2f44c0c21d60ae78ecea2dfaea0db6c9f3fe7c74e353b64ea469ebd9850805268768eee877d832bb7764138fd9e20da998286b13b67b8bd74e8ef216be1af26d18c548217eaeedbde654e87afb36196ecfdbd1206417a85f1f543bcd5edaccb077ec65137e4f2fdebe1f2512ca746a67ef8b571168c2ac448b3c1183f3b2249f0940ee25032379bc5335520db42761439bb9556d30f6f83616b92bc0f94b7a9761651bdcb9d66bc56a39e7b264b9ae8048d8649a594f2c92464dd30afc013f2804bba6b0eed27698578f6eb748c5928c6b8b0d3f4e15a9e79e8cbfd8587df2cf57c6e7383ea21a93afc84f72ecb5cde69823a7b28c0500a483d84aafbb1c35fbff1985d915bfd845d757127bad14a11d4344dcaa9f67c1679ac2fbf77056694c5f25eb29f0a6202d72ce4038166cccaef151047e04e85c9f47df5c4634c71d3efc7e8f917bdf92c8e690614eb518a10a26fac7a338f142ca1f8fd42264e8b2225b75fba603d6a096b74fee1615c2bebd58848eb0b80d045686570c128d35d8b4f0beb7ee2525ca15694f5f2494d586370aa0d23d1eb621e320b75c7d1a38f15550cb3cb05c377fd381213d00cedb8815b1b23a9eb9671bfe53335de8985c8c81fffe02c315a6424f7367f021304f44c7f23b105c349a62e6b25d78db843b0ad962f9926ceddcb1e7d486210c55ab3cdc20cdfc0bfcea975aa29845dc6a3f0cba0e30743441553f4b090e38389b69e0a0d1cd76149ec219c8c8764d41b6e302b2662520afbcaa5ad7a562be2c9e25c0d499dbe70c86ab6a9f8869e7c1f6b17d311f5a1035cc46951c2e161b5eca496de5cd5bf75a41111a6d56f5bdd3b644ecd47e41cb7cdca46e9707aae855ac5f483300dfff944a9da9a0d8ac27dd51f7d21b277edadb7a6 -MD = cb4309313212a09afd1befe509427ecb3a644a9e42c63d74a216eaf3 - -Len = 36152 -Msg = 296cd04c4d9ab493def7aeb6841a45309e777028868efe45166235c56b2dbac9e852b1f37e9324332b84a9dec13f3f01e95a7af46716e032a0d9926759df2fcbc12cf5afb2c52955341fb90543d8215dd2a58be90f8c3af4e953289dcf38ee2dbbe2e5a770988ba100b12853904bb1ee5f40ec2f0556d533f9b6418d56a0c196df5cc904407411be97203cef3202b8599a13e5edd1de7998d9ec235f757f6eae3483e9edaac1855501563e02b163fd498b07bd4bfc8aedca90db163cb53dbe1ec23d8c8b37e7ad0d463975b393d84a643902be720dc4fb72266d644c9d42798e9173fb066e4e518f6fb32b2b62c86552aced2e8a8cf36938a48853b6b5f667a5aa0e7f85d85e3b8384aba691a59b17bcecb156ba027e00c311162da385c24f0c14f45e30fb80328f8b08300ee5b8284a02347e2bf6cf88bc75fe383a960cfb6bd70fe030611afd5e8eb40fcaa98960a3f560ee05f04dc9cad828bda46f3d3169fc454fad9296659694968bec79758770cd1ced6f78608b96437c030898bebaae8980f1ce155a32e0a696ee9ddde46458924fc491177095c8bde2548f9af65ee389a710bc71d02ce3cb9c7e045e3ec0044de3bc9454e5b0074f42f660fc4ce4b001a2f29f315e1a480b90854a83ec631b06bf1ba0b828a4fb008432a5462a16bcfb59df9eda6ec6b66e5a4996d5541546c3cb29dcca9f394dd890508301f7bab07eb421e1f667f6d6fde31311dbdf9e2d8eef307112b336a5df4e9824b41a9933939bff910cb17350bf112ae21df5c5776e13768718cc65aa1ea752b0e7fd7bee41f6c0d6a5b405cbbdcdd83323ff53cd6c1f444465538c059c81c54e2207288890adadd748d773effd006329766311d68efbe2d380ae745e61c63a27eea067aa88a80ebd7d858765899014ee9d8bc43bde90985af147e55b765cf963d23001fc32cf2bafcd2307d5696733aa20dd37a364c4ae024185a7a7e22d4a29571fbf25950b4bd6be1abce6a36b088488c331b727806bf2f7cf81e8ad1f75a103d667ceb942b75adad26e414186daa55ba4791f2fad19539b8f3cc7e01cc1f561bbc19ea75db862a9b3e58e4a9ff33524e8d8828431fe4cb52ca0eb820b784af637973e66459416b226e874c79d995b68f616882ff66206ce0e75fd9bd3e0cb4cb3af55fee0939f7d91419bbf6a153fb138fbda37e28fa86d9d83a4345e419dea95d28c7818ff25925db6ac3aedaf0a86154e20a4dfcc5b1b4192895393e5eb5846c88bdbd41ecf7af3104f410eaee470f5d9017ed460475f626953035a13db1f2f59f92ffc3ac6bcb9162bdab55cf4f6406226cea89493c168d1ab499b1295c6b74d7f7d779932e01992e910caff63a05fb2379c45b068c9bb92392f3e2b42d5456bc4cc2f833a6e7a4a30e835e058f6b891dbee92fced00c374a4bc2ca60ad4437c71240b4206ef4408a96cde47fc81b4c7bace77bf4bede83f95f84bcb144c18482d8df31dbfebde92fca3ae7b77c8bb1b7d43dc43a91993bab3ec84e189c52c97a110cf5b8de8b2b0d0958bc6f0533656cc55a9ce300a2aaea79fc03290c5e73174b487459770272ccd4b5e6e8fab8b404e0dc6a9074a17e31819e50452d6b1de4f820423060aa5cd9ccc10bc7e5724a1ac721c1c5861c021af63dca0f77ff265da802c3d013f945ae52087f8e2df67418e8d916e48d58f3014848e4ea649128fbcb8e8dab1955d9c4f50ad6ae6ccbee89a640ee90130ead7ee84e25687ba79249e3221433e96665b8363695aafa5905d7b027cd3abf93bdfe56cbfffc35c8fec27f5bdc1cfca185e2961a20f68f24569d76cc1756db9e911a2430f9282b7bdae0009a69a8cb8db6fe85342d2373c45d457acc71770f75c33cd11b957eb516934d076c2169ee81854684030eb4409f766a2c87401dc3bfc0d0edfa59627b4fd444044fb7f2de235d6523054a2b8e4c5e661cbb27ad80e31690bb4bb975d68dfa7f87c371b602f9cbd4e2b963ebb52161e3bba68cb8cf6630d6f98e3a1b6f379259f2660346056b3d1033ade0974dd53d4d99f7e3d217dfac2e09305fe5adf3185dd485d1055dfe4da1a6414490c0ce2d1e281db16bf2b5e5006ae09f470b471915cec16f76653969f3ab22047ab672cddff69699e8d87f77f8bf0d7cc21f8a00fc1197333bb3830e90c2aea4b777799bfd85e0f1fb4192e17146257ce943525c8b7d85c0b7d191c8038d75b9d9bc392411468b5df5c6969df4c0a7241f2f26a84e430b9c6d47bc12c65be59843dd47d295b8f4327ab0011a0d8f20e6f62b8d60af02972ade7e887b53be9cd4a8630c34057dca23fcc658f226322149e0d0ed12484cb6f08dfe7d6e2645fa0359d61cd4eae56b86fe520492d93a06d171a7cc398481f991fe301167c8528b88eaaef021b08066eff1fbaa9891076ff22b28a142fe32cd6391cbcaf4b494dff9cd760c96e0ef2ad36a1ba16fd83acb406fdc12db1fefa0f9fb2a30a1755d55ca94a3e8c1167245b5e94a8f8539448730d22a874e640922d9acc3b8da854c8b6fb2b10b2cabca461bd1f0db651ea54237d4ac8529652fb1670920ea1c6ec2ef7dba35fa362b578a89b6b6fbac02ed7ae9f9ca73088db3db4692da3af38c5100691dab2c6a1f9aa17429f596b6707dafbbb41cf74858461edcfc5821dc78875cb65f791854e314295f9e45031101e64f21960c88855f56eabe88134543bdd662e9f2284473304460c0762de74811a7d7b002218d2c0d56cd5fe8a40bd5c6bea1786851475161bc063b5408a9c83a52d7ebaaf49bc8ecc645357082ebff1db096e6345c875c01db7824ba7dc11de647de38d2ee3ac86845d0d3b2287c1c4d4cb1b7e8d29b0f9b3345111be5d3c5a017492c2c76c0c71a25feaf400d12d9bff39061f83be8e88853eb74eae9483bf241b74a0a46e4317d172d5c9cb976a3f045a188e4f0f78373add9f4c9e0a4fd474786f71ea70b940b79fb301ab5ee0788a3737121aa4d4cc7b19ee51b74509629a966c7bc4fbd6b4fced6de5c7b0f70d39d64cf50c060b10effb8da620cf17313d7a54085896023a4965ebbd481417c8bb41407d4cbc86cb3f8a64930230e309062e0d5ecec9a59c460d15d15513a86fb580f9f3034eacc512cf5b5f85eed3b29db981c54f1c27a09aefd368173412cbd299619f5845e4c511d05b54d09351f3a92396870318f00fed130ecbb6ffbda4b7965fc874279895e4974ab80ca7c496d37436eb114468b0e97fac4359fc12c20f7edab77e7f2ffb322c12d460b09461c2b54838a128f84d343d971628b477ec805abcb59fd211c0a39599f0f538281d1eeeb4b7dd4d06ac7655b58c4cae55ecb231ec08ffaaa5ace0dcc954f3c6ea92912562b0eb3afc9658cdf0efed7215884f0b52f8c58e55869109884781e34187c1643a6af37740d381af2f8532891d89fcf1d6cf1a0789185e22c012c71595c556b2232f1e8d3c2b9b035a98447ad7b663e960d3259ca728ed3158feeee74f15f9180845930356664bcf586e4bcda9d92cfed84e0fd5187fe93d38511eded53d529ccef57b61f84b3b1d134f6e0bfdb8ff352686ff3a44e5f84f48537e84900508495e87fe3089a413f47285d5bb3a1d829832c41e549321c26e704e3760e837c424a04343f771377a5d5d57a965c8ce602ee44f93aa6efdf0a2988870fa46992d377c71733e17cd195ebc0c12910f933fff257187c43b3f2af3a84a52db10f5ec89db58b58ee52d980277ed37c87736c814db70222b63b0176a88dc058ab011a822a341326d42219e4e77424191687da274f0958b664f18600e2086b08f8cb50a0bbe741266966fd34ca25357754a3275274a28ebfd663fade858907c730eabb94b12397cfe4ae0e103e167a2fb851beb36d37169790feca5fe194190bd9cba5eea89d898bfc43c6d7b1dc74aab8101aaa871b72e61b4e9f05a49e315f5a0a9a1f10a988f306d4b22bd3cbc760da6ab5a850e44623dbcfc3704d2bc32a4814129677cc389d9add4a5d0288c4eaa5de3a4d6915e2b968fee22029a151051a74a9f54c99fad43eda1a1bcc77ffb090c6f30a2e24eb4f29586585e8b35d6847a8caac0d87524f59378bc8a03dfa5b21d18a5f1e95c23dc368e82208c66adc562cef3b4918c167709229e41c2f2732ef6a6abcb8ecfa1d9dacc474e84eebd9dc7da2237dc2eaa52b567f0e9ee028e0401e1ec39b9f15573e90a50f25d162d931176de52a1a1080d010e5a8b6e551ebca4910d4252086831cb0e4413fe262630a86bcf0cc82e593054e1832d2a334adf497db9ef415d019be8a0ccba4f66cffaf4809e6d391dc54415a614da0ae63af4576e96476e38493aa88a90ee381d517b5e7ff37dddb673d0ae26b497f6b51783362c4c52c1e06895749337b7a195d33b4c2e75459a418c5c86290c6ed6e709144d7f8418239f8535b2826a1d72147ec12757cdcc590537700577c46692c53730062fe6a27abbc8a0cc20d02993e3799558c0a31a034b9d9593d783871297ca5ec80319f7b07d5a60283512e2ec4aed3f45329e387e5be5529812f1da3fa5e927fcc4c61fab2d63fd3089d751669002475874662db47d38307cf0b766ff36bd12083a942355130afd4ae3c87ce7ffdf36f850a4018bf9beb6a7397d343b936ea7552d2c0a947778eae00c8c6d58ddad948c8c00bded169e6c82b5ea4adc05236e4b6535dc52a0d54b59cdcc2ca27393e77ef12168c11d01da732ca7b2c8d204f052a958a176d748a91dec30bfab09bab93547b00aef560e89e3655c74e9423ab4d3c33d62e864f98b94315f305de74a91195654ac5e09ee003b29b096259fed4234798b27908f1179266602879f546af892e5b654f87ec8c7e1404b22662f4423df94eaf656a0b8fb3b51c0ca589a427508be7d0da4fdc5673f72d61f933c68de3adc04d922de159a3bbc420372fffb90e3a752dc4acd0d67bb87f996940c81fbaf187ed7dc9251dd8e6d3039d4ccbdd18b69ddcbd337c74fbf465b8e51e7b603a51203f86c04934d9c2c31756648afc169ccc5e125831ca8b278a50fb1172f7d84903945ba7c0470cdc3edbe10bdfae7e397b32629f933f8fce57e229fe315f1b35bc8c5ae42ccd18af80d1cba71c5cb62944ea3c7e035ca05558fcd009290e79c3b5981319d12f5399539974cad39f64f893f5fe88249a33490801abd6dc7e8a6f7947f29d7fe6644601838aeb97eef103f2d627225980df35df811bebce37b395920c98036baab11225306c9ddbb3e0f7ec1b54f12498faa869fb9ebc70b29bd27a6671c036b4c0aa291098361196cb20da35f659185b2bfd11e1a2cd568799a2acd5fe7853cd195aa7b4ac58cbf0063b67a689ee974fc9b071d3c6a2f22f3392a3ebbc70653c31c00b9d078a8d582893feed9e0643df7a6f043288b1e601f00efa083a6ccd8aa066df2a482fb857b8b71a9b91548092b485339e579e84a8658409cbd6b20f40cbbb9cecccdcef572d314501024deff1feaf9a77b1ad509afaae6da73fe4ace73a3acf7523f684defc8f08ee7f56e485bf2ab33f3582fc5225caa01ac47929066260e123dc213b67ad2cc084570400b67ca2f88541a3ca568d852b9712d405f6eaca6ca963d15589c597269327d9b71ccd84d4ca64746d20884a6acc99b9b66129d3dc46497b75adcc5a857b604c9a21186cf28f1c993748aca7080bc76eccada619babafba41e4c37f377adaed10c5be3b7bc33e876bb2771176dd52a77bb64e608825808dfb20d8ede77ca520b9025b5e1bc6946918b456c0816c94169050f702ccdadef82c34a3787f0220850b82715975d8fc57e1a3af4159d489ab73c05cb02e74d1e31e48ac88c9b75105506d879352a27d390da70bfbc6be394f6b2f05d07898613617857c868b404286ceeb267479cb1ff7e5e7f05690d2ade8c2c57bcc70f097d960129ad88e48fbf1cf22d564b4fcea7ab18ce9ba7eb7ec5fbea9450adf247ab541188ee89a75822f993d1ccbc9dde7a8b9bd7b8f5a16fe9da804ebf48cdc12b001bfe11d776fe1277462831181151d6a44a3303dea96ec89c8fdf6f041bf68b3ea2e1adeecdf20c0aaba939ea44d95a99b658f2cf7e0bd0a65bded68c47583a7428ec195c26d45e4826cd3dbfa2c554b072d20c5489b790ac86b58c3dea76c7252065ea9c1c05a7a43a0cc2e4a5b6739ce206c6ea77029703a30c06957fd29fe62bf7a82b1816669368004005e81d25c3868fa90da07d4240134abc2f71ec431bae19c885a57729ba33105bafc479f9b8f2d5294aa07820d659ea43686b344f5a1934d2384eb85f7d2de57c2ed55d5dd1996fde0df193b15b096302dcb63b23161fd14bbf6e5a7650aad8082f9527c0c20cc82de41 -MD = e747c2429ba8fb94875c77f8c0b2d0b5cc8ffe8d92ff3aad800e1e1c - -Len = 36944 -Msg = 3239b2ce4efe4f6a6255dc53347400a6446ed3280c65422386fab471ef09eed6cb94339329fcb037287718b9babe8cc4a806bd52d632547cc947929066203365fc6399eb85b326062927ea9d04fb7eee29862f24e76c5f2b4b1529c3e55e44d3cf8e2a00ec8b797f6e4e99279b949fcbd0d671c6c67c2bd7144ec230f52be8c94cfd2ffae5ec7049fed26e8106efb704a4dfcb61fbc880292dd8a5ff1defe6ef7a98ef01f93ed50de19db1d0cd768e40ad87851d0fba26c99d9d1a59e61207ec6148b43baee96e722095aa3f7990eb28f4b7e62189b9e45e6c836966d7fc136909f3c4d38f550421c2a4a0f391a4976380583796f12c8490a274d94d7815d20d7b8268ef21eb5ec1cfb1dd179d1c5b9a5a50c1a3d07dcc094857b33751c60b81bedee8b8ee1146fb50a3a7d1255ffd758889c971ac13856e6613404beb75886cdaed8c557d3082774c644749b2d5459b14e99a281056776a0292c5b2cd8c0f77d8999cee56b1dbdccbdb05a9cbe6fdb5055a7bef81ae69a326bb8d937f71694abfc95fad02fa19d3d5f02816f9faeb6a64c3b3ee898324c1d976df178a8e5e8c97651eb808750403738bfabac379d963380b8b4eaf3d716d24ab02657549b5e568542137f0896315ac94c1bdb1cb8d48891c4b377b44164f0d423fa7c80c38ff3b80b053439d00b089f3c6474b58cfc060dd3bd07601db0e9f24de020c3ead7f17d01333871ba17d1091517e1a896973c436a24227da8a52df3727a0c846dd10052c9101476a0f234b54a98da5c4210abd0fcab41738e9c5d76461a9848e90580c7c74e208f2124b4225189a7472c12d5350f94fcc84c20d8e94d645c87d8dff34a80200541b719dfcede4ce10fc0f838fe2783bd024dbd20cadcc9a1d7b9eae85998483b24df6c08192565000c8d4b578ab8f9fab82fcbd5a988cd30af0890d08354193abf0675dd9feb649cc40d76a169485a3e304ef757f3e5e16184417c3c4658356c66c8d1b0d174ce0fdcbe24b7285a47102147ba38386898bcde01079c11290f78b2930a323c75f3e1ad0bb009367322e901967ef6f57575cb42a3cd60822b29c8290189c26f4398aabb92b3082207805137b7c004a9b0eae528b6383a07f2e6e34070caf1b8820ed39edfa83459abe1c15a1827f1c39f7ac316c4c27910f4f9428f7d6840c6a5d8f4bd4f0a3e6bb4c9b1df54113ed195a7bd833c06be4bc5c36e6c93cc20082389769d6d5356c6d69abb4de8065c6237f46cf4a87f7a06c9c7ef7e3071200b8f82d1b5b70e4e0975e7460c4091dae3fad339f176972cd095892e2afff1b13f4e77beacb8a554921741dac0fa2e2ae552e6acf042e84747ad99a2f93eb86411e4ba65d8eeb33aff2f0ce1d28145ccd4d4814e7779dd69ca764bf67f994fa921e6dd9fd0c5b241bf41db13d752634130f44596fda7f104d7844281148c3200fdc953a50aea2d0930e42eb935fa21288836a60f0949cda8fd5bfffb5e83ea0bf410bf1e0da87e12228a6a7a74f4e9d35920152f20dbcda6ba61f69db41cd21ab33162735f9d4fccd2b920b02abf47e21225356fbada7bbe8d3aa900cbb3a4bd99bff04d5744fcb9efd4e3f2bdc5a5d541ca69595dc24230f44a99ccfbe4cc753620faf4ab1c1f69c87226caa4b49e0d76943374702fdbbe7e263b5adb2ca3d216e8b511c1af125cfb156ba085f88b2b1ef72639987f82a789322012dff7d5449a9be11d116a9ff40643150cc7fe179ea987a4114d3de18ca402cabd70d2db5d5faef18f30caf2cf686fc577e151ade8b4ba5fa3f4e762fe6d2cbd93344a108cc48658d0a66cc55f90000f6a788fc889bf039b6a3618a14d32f44b4ca0da3f4377d69999c8bc82252bb8256ce404f20226e7f9cc672e0729941e26323cef9211d80436433e36b3a089ecd9e7ba5db4d29afbfd532eb42ef41eeec0ec6f06c3886393b1556d67d46239028f7361f67b8b69a41886f327633d120a9df3cdcc4e17b9099d58eccc5edac7bda898816bd08d4174cde03b144e754be62fc0cf9c9c3026da4cb612d0cd8aa462c7bf8f2a3e6880e29ff78ce76b3cfb0608dbeae438726b8a52059611aae25d966f60f1be2fadc67211256f3d23e4cdee8bbdb65f9d4ec59e4fbfed0b718261cd02153f942ebd70a7a4023872231d23045adea85b4535e38a985d7e3abbeb3f7b1254ef48a6281e07cb069f22c336a8ebd8d73763cac833e3ce56c00bd47d752532988758406e3cf718baf9bb9ed1be09a80fe9f59866351e4444591b75c9715fc5688e2f68004c09ff87eec9007ed0e22b0146ad389075aebcaebfc5fa4fd28f5d4d6a5a977ed9c4f205d4c7b28e8009e453c3e715e7642979ee5ab7ec8107386cafa246594a449ca2ad42340f8159e5567ff83fcadb8ef31e9bb04db6fd8def6607cc9f17f33b1553f6bdaa8217bd1913ce4a23d1dd64b00d2f67140425e528fc0e5fb17dfa1ba3b87abd77b48227f98ef7301f957d73d4e821d5873e8a9b5970fbd219d5cf74ec2291b8381181391b4a63409fb03c3ac6121b8233d0ac1f157788aa54c9f3c54344e4446813655f02a89b0220ac8a38283d64f396650afec1721d6eeec5078b4d71dac89454df08245c26eb5ed4e7ea6f9c96b02b6617a901f3228644517b456f4bfddb29303ed314c76f6286d3e5c000e2393e6f5e62ac3b6d4096f1e9af722d25b5f2b340053e486d0d1e552404578090c504dea86c86f252e007741844900bb1ab85af0ed2a833cf5865264fb42f631ab299f5eea5b7bb56a95e4747bb2d8f52472a98e727bf5b7109dd96a185a62d029a64419baebcfabad501e80273b92c9a0147fd8364d243c479fe12e3e96a42cad4fa5e39d81535222ba8d2d32eb167fb6274394e2a8f716c213d17616fca48d60ad28843b23eff1ee5a9a4241cb4c5f90325f8b1d94568baa81130b48974b3d6a4736c33ddc8bcf3cb8ab89ffe11cb153bd3a85901a29e527710eb57b6c7f83f2a538694bb10f35325d2ac811376fbc2a513c4ae341586a606c2a3b578529a62050943e0cac636bf8d07dc822d52bc93b75cda1bd12cc637ef9cf6786e932ef1dcfb40a29d46fb9b7990e51d8c13a20aeb15553c6936b17a8a165ffada080a611aafe9549311c679741432bdb058209ac8d3c29a7ce1ed007eb54cc77b3fd13246adca715cc50bcbf4f861dd4a9edcc5d92eae808cbced4c35f059689298f7d7c96b50735acf401584b3ef06bb362b0e847c85b9091616d0385de258e0a202e44b6f07e50d9f17f89bed26c472dc8fe75343c49e828c1e0efe648402c5e976ca253f7d40e5c2d7b7b2fac59111e09ff2ee2af79b898d478b109acb10b2edc80bef431d1193c92405526337f708f0cf839d88ab4a7e9847c6e76703ed481d7b2c121063c16810715402bcfa60d87b934be9e33c25d24b73351b6feb02f607049d362dedfb034734164c7e8958f0ef8fae6bd146b835157e67f50bccec3d28f8f1b4021808d5cc00de881e6159f2cb191d8bc9377c1764bde23cc146239df1ccac24237e85501d5c1f5e232eee5eacc42bd231aadbe9d7b6063b36d32388fff43eff189dfb12b9aa5b27132e8084f3155bd7b10d623cdcfb7678c2e0869eb2042cbd37d2d49e3f70048b64fcab164c912ff4bddba970f2f2a58dfc1aa74fa670e7e727c99c430d41cde39f15e87307ac0ac1be821c36a83005e358de000c5bdf12f56efecca1b193f9d83816a33bb2da9eb749bd34ee6b382a014fa74b552083107053cee05abaeb2ad1b65b75c0dcb13e5dc5d97e18ba7f84707702c3dab32172d09cd671ae87bbd3589070dab2f3a47c2dd9737246248aa7a9357d23dd821ebc9ea081fb4da69a75d56ce34c828648da9ffaf79be727cdf6242172c60dfbff5052e57de798a5eba4f0921f35a002f2cc2c90e2658c32ce0279b18034bcaf27c075f216b11ff433c302a6a1309bf856e36c31c06995e41f6f026c31ea9a1a4caf704cd8f254101762b41105d7f6e4d992d7541e02a4aa167e56c7e47206abc25fea6c5125d597eb065d77b9661156ff6ce68e67db28f367b30f4b244582f22d644cc70bc604ea432097312895abad2cd422371a6da36e67cf646c8defbf7be25f0fe3654d7285a433d9e3ffd10676066b12e4c214a469bb062eb26ddaecb78592ac57fa469f0872c29df6ab92b2300084212ddb6a9c73c61996a36091bb238bc1ca7b372bfad1536f7bef98654f79afd1d568e2fa0c2b1d5c64b5f2aeab4e694eb2e3a878067eba6ccc3552c33e9178b6b82c653d63de2540f170807c3d96a2ac2e27dab5526f1c7d377e6736f045dfb541fece9f443b7289c559b694c2aacc6c74ae2a5e6f30fe031611423b04d5595ffb46abaa1d91898968d7f1830ae94b022eed23fdad52d38110a4803a0cee7a095c9a78e8609edeb25481cdc156d0b2ffc56b63fdad5331899f8e8dce58efc663de60b2c4ada1e6a700cda7da470f78c7d0bf46e8dfa09c8f1b55e7627957a2d2094fe5e9655935da06421c284be4210cc94f6949c4c989042c910990fec4b3e655ae8ea1280340cdcd559745d5fd20012792279aed3c6b8b4ba680d449a55e135c131996565eabe4de9ea5bd95c91a77643e2e46c987c876e12cc996fa7825db8504133380c9bbc1b273c3f9ebc654c21799d9f7da2a3469958a607381cb8fc158f8180327b304f6d17b7e8548738363aa3ba708bf9213e5c155d1d4600e10475065748fcbc92bd6b42c41ea4c6f1aeea49a3203ba6e0b4e0d059a4425be4beff3e2c523dd7a74e3f2fc9a8368078fc59f4bf7737b0c6f34c110263d335a972dcbe69679ed2594c0e66304fb1bdb568ae2b763c271fbd42c961c024a2971868330e744fc7b78ffd03705fdbbd85903a12773039b2fcace87f46fbad578819e72db7b7d25f8e31ab43d4c01403e1f1b9ac5f5534814e7a2e954a1bc799119438f24098b70f5d269cf91ab9c12bd8c02ea56b4df63c1d115c34f5883a103971a4a93181c87e2e58184bcbb4acdd73e5e1242381478a7158ba83ceaace650898717b13d9cb5408ae69616e189bc0b9481a521057ee1353378fab5dea4b4086f1e78f6c08893bf410d6648b4d577cb2d12156b938b580ca9625d32aae7848bc65500ec776cad9f866a67cabbba8ba66693d59a68d6279df5dc224be5f1e26b1daf21fa98b56d61f9822d055ca5522def6b88360bcbea59974afc6a06605826d3917eb9caff4db6e8f928911e2285b2161d8fb6e2f91ad00c434e05829f502f96b0599274a6e90ef313ece676be70e3793e6ea584ca3381c33989a6f12b6515c570452d3c48a9ca9676dc8e0cd5be229732977a77dbbeff6aa251d6c880f159ee45e3e268511a8a41a689f03704c80fee8ebcbe229a37a95122191d7f2caf7c8fc5984aaf5ca5be930787a58bc828fbedc720d91b721800151d51e39baad9ee1863f4de77c7f5e7f93e381681ac4b8713608663d91fea9435189ea184781b3f16956c06483f6586e29f1debaf0dba320def3fe6d1e019f62f88520ff010ddd018fe706a970f8f2bfdcecb6d7a790f7d3bb7bfca9c6f407663010e673501bc517df39463ead4dd479921a3445a8a95c90b7ea8979f19d8c58e07364fe9c71123e4196a9aca0bda5a435c57d8e5aee7c61b986cc6607c6d43ff0f7c4274dd86d7b9d44577ab3100d49ac33bc392429fc4daa99eef77035872347e12b76cb187ed8db8c77304d0db66edfac17cf7020875c706916b595b34e0ccf7cc3747ff9ec5ce4b63156d57e451eb67ab6d7a59cc397f43f6d26dc07d1036f0fb4a8cf43600f9e0aaf75b529655e19e4c2d92a6558051e621bd4aefbb70f0fe1269b24bd81faf2d0161454d6bc38f031635e6943efafd71c47477455a839973b40d3e731f824c84f91bc1a4ff2b323aac0edc9fe309b05b3190594de4e88f0652ada7e656c9609d045f46f5bb0d79a97020eb25dc2d39170ba98785e4e0400a70d38532186569b9b5d44bbc19ead3e4050498c2a4e5f649b5288869d53b5b0491173cc2fee6e68f8ff34664a633cf5ecd327c02b7b45657c085b286203a4e9925d1553564be5572f544dd8bea78da8e4b32fb429f28f7b5a059bc57606d891cc1aa64f5d45c44f8783167ae514a6407117ead1eb5a45907f71cfc4a20559913d6fac280d85123a49b418b2865091a3d927de7f3b5c6d8b3173808faca830d22d85b1452eb3d7ffbe11d9e96b0356bb640d9527dfa01153b933358d5c96643be6833c1088771c862bbfe3885ad6fb6e5cee972fa0cd38d25fda76267c78fdb3af92d6f0e277e8b7dbe9bef51c708aa607f56a01468bebef6a90ccc2d2f50424cfda054d055e437a15b5f09a797b0a4aaf47980399843192247cbdc928b680758f825490bad235b7204b03de389c84429a0fa99f615d12a3d3c7d3a34462798e37b3481fc77bc75645d47f28237dff761073233c65c1960bc09896b9eea2f7570f946b63f403003fcc78eae200c683ce5b9b90416e56c6b0 -MD = 633ec87b5455c12af54a3edb3589b8fa32056ea686b9205dd980477c - -Len = 37736 -Msg = eab3e88d00f2f164e92e95a8c9cf3391037969944fd5cc400e95dc66dbb2377c63f80c4376c5d3a85e0e3be86fa264f8dfb34f24d89293f6ccba5159091069fe8d69eeff1b4dd8c38efbf9216eac33c8c11ce7de2347b0e7197052e9a368edcd100d77091611687c22fdb799ed7506c850bd1a09597c8ddb9ec0c75cd1432ab195ed8da89099ec9cc21c5d9a158346c1359dceefa1ba919a03b198fbbd288872c40f1926b16ecaec1561d46a0d605c7c17c4ecd6248724ebef4cad0e8c9f6fd7447d04c9a0176c31c4d30251fe94aebe9f3b5d070a6eae970a98eedd693047aabe3f34da861c3836767ad09910a5a652750907ca7af49767fd9d44af7a6478b1d95b93a08a0698c2d45f26886a1dabff4036d4679ca34820706395cee7c26ab53edb0865d55cf39c8689ed683584248ca8cbab259902278d0af3cb80d9d3867d94c67a6f8ea6b18d33000b7f98607bc257cf734d99999d757454cc0e781d32d38425d308de6d395d83cd6a16bc3b1769f24a1627c3f1139f568e82c0eb2ad77db6fffa76ed37f5d420f7f074c99c604924457bfb4091efd456aad3dd5b82de44d15cd701e28f4cb9af8687e3e60cbe2992c68a1138019adc1fafa9afefabadf07e4552f3e6faa6d6db8316a93b1299d2e7d82bb0d2ca7d7f57a5eb7cd02fae4964c0539220026bf149f5850ff136590dc98046223673ff85a794818d259648162cd8c228b92e04d3a4e4bc5d300066a0e1c8c3ad8d8487b5b685522a1766e2217d9287fbd806d7449259a2db1ff92953d6b78a9aff867fd82d7f489ace29e63000f88a53a6134d0cbb5a21d1e7a808f050558431b3004eb6b38b4a277166bb0c5c11b47a4bdccff2c9f22086af956c3df9ab97b9d27a5c17f1b0411728a6c97d3ae5ebb7eeeac3bf61268843a049be0476c0ac7c837c11c38ef613b31d70784b427d1851b7c3923b2d003f50e24b640b729dacc0ef8fd5813365a943754c303d1be02491cff1a52ed5872ef59c23c81b93487dce3d3a101b8806eb0f5bc2591c6e16f5bf5efc636001c33d7af75a50fb81cb09ee96062a5734e0c15ef55b5bb0e22875238b6a339958bd55261a776675e52e3667227a8bfee0fb147a6b9e9ec1201d8a047fc57fa0827c5c422d02714f6777ee83081e9bd83360caa9e6148b17cffd1eac6294ae3e28083c165a84d952aeb01888717ac3acd616cd348e43887998d118615b60283bf26adbeac784054663e09cbf84176944702503638ab5feb123a0606c92b0545f87a923069c8a5ff32d1062706a7cf766aa96567d03f256851772de15300c9c7190cdfab1021e4e20b54751e34a31d3db2c70adcc2080f6be1d4f7aa35dfc673bb4df4a3521c93a97a38d535f4dbf676a9dbbef960ae94824dc401c6040091e839ce6fad820128b1e9eea4f2e9bad19dda6800624e8b5b27efd4cac9202ba2712efeaf2e32782aa7e4e672e965b8353fbeec6d9bee36a9e96277c1282ca98ebb056f41a9e609ffd7f5c0bd6e0b6ca7c8b1e9550ab2392733203d73678c12ad224790a5a50f1f4ede870df3053d309fb56ddf55335cfb4991b386500bb0ff84538ff379a420206e38331e92439dbc83a24d4efcaa20f5978196f2e5995db8aaab29180c2bdbc5f451648339bd8f58fa0bcaa8a9d3b0d0878f3503b274c4d696a5bd6efba0746867c6a5cc57b7a4ae795e808cfb548ee490173829354298f1ceefb778b6a68c903f14716a5ae650157816e96c4f811dda47b5fae3ec674c62b9d5a1b5cba2a6d5f0b741edd1ae14368cd17fb734fdd00a24e807b4567751d1fde3f6b6b9394592131bb1b75a93838a0dfabe0e4a2f67fcae29e92af1d74ba7e1b740ebfdbedb6d1cde2b67342b0078a20f2ec1edaa283a59f819a84d2b8c5d3bbbfad607c7eabf746b296e1cc93d9abf8b4c829dd2a34b9eef03ccc6d8a67a326e9f0575c8f611c04f363c63127d58dd0b81b0d95d6b99135b42090d632c778c3ba7eab656700c76f6dc72b58b524b70ec78ed2e9ed3bb2dd95edd8f5f80fd9fcf900647d50af81efe768172984edb11ca9c981c0b9e1a64f5b4caab223644f38701d8b8e9096d1ec2bee928cde5904602673220480d4f4f2cee410f5fdf061e0e57e277f70de3fceff02a569099037440534bb9c8b3b242db65e11a6ccdb975a21cb403838af53fd2c4c56a84eb9d22e10b65670223fbe6ada61b5add94d790fecabdfa1303096e17a73af31f5fc5d880d9efa688c084b10039605f26c6d90670dc60aa2a08a8fe2b020b8ec468261b9c597b06c13bd5387f9a4085dcd6363cb4ec5cc23cfe4c76998fa78c28973662900477f64fd865c368435c7d743587aa175502a0c0667c4dcf8aaf79905f7f24086566f38938cf0876cee484617745e524b0e2e458d3b10a599d73d5b03348f661e6d88d01df796e17879959492de964798a8dfb6ac87332a432a53eecb55c4039234d314e3efd7ac727eb6a7f9bfaae724c54548ab73b3d5bd4a403ca580197fa85257ed2c9b395120a4b169973e2399b60e69e1d1291a0dd1e10c2bd9de174229701c41422346364a9490c0b38488c7182b526a67ceef394594c0a5ae9645b4dc352bfa6bb086c4baf65b9694b861d810c308ccb58dbbc3e20d62916dd02c3e8b4a8bfef06a8063377118d283033734677e94ed038c051270f4fdd65fb65246fc5644371978bc7c88add15cc88d9043e506fdb799f3558eb7f0965ec96d4136f8025f8b2d02c27576538d1cab7df76c51004b11beeb339f7eaa3710f620817447f6e3e476321bb8c90b55fa74fbf11a741787e2bc9c28ad8fcae7d42df5986ab1d9d8293a2e4eab497c30de6a3108b217f1b814d92dbb20b0f7af92b514107efe534742c21ee3b8bd4f26b0d645c39d0036e68e5ec67560aad99532d7a6711af50e3716562b6246ef2b3f58005faa43f88f19389391ddd54519a49ddbd341a560afb08f3d7d54bca5b984be30a8460cc6a45afabfb37be8485fe1b909c20a8705e1ba94c13b4184a8a1fccaae471e61341cb0bc2b57d7ff7d52566fa89c5327ac4a5e0e288daf05c08aaf65c165bba8089f246620a37a84aa9b0aa80288a5ef1f92a3e3bb9c28a7b41ca675b32aa34b0bd7bde0e4bfebdd98e2054a5daf8746256292fcc29033d24e00e8e3cabd60b005698312bfd4b2740fce503e0239819485623141859159ee54de7d984f477a41be007ee5fb0a58afd707f26d394d1b4208398a9a4bc520638f5d6e7b89ef7764fd42b73fdf8864f8b736f3be4a13deb6768fa5f05e57139ac726c273c2dee1838cd7350ab2775eb678035c187cb45159970e8829046db7f9c4e1816a403b3f053168002cbdfece50e21534651858fd93325c3d2f863096e94d35b4474d2f1a52b59d218f48463d30bd15838c662668cd1121cce82cc737d32cca62f22fe2f9d2df1d9f199a7733bdd1aa5175ae471c6dfa063b3e3d5a221d274993522e7b64ed799182b4fdb8365fe67da70838e3a1ddb6b294180313e031075a4f519423e30b49a0d347b731d07ec3358c2d4b217d830dcfdf5dc418f87593a49fd6a701ff9419f399b9110b8882317b09cc31293ac9c60222f7c991f25395d08acab13e3ff0af31dcf4536ee6d4f8f725cd30245f16abf567cd5aa75732d3851913f8012c87d303a4dfc58173dae050e818913a75d18250b5c7be81ad79176c539ac5734cc14f11fa62af6db6fdb12f5a959c92036414ba15cd3f497f92272d40475fbb2a07ea02e565585938a5323b842d9855913629dc8dc7232452e4cb6fe80310034bbf6b7f6ed0096e7f3b2c1d6dc6cfaaa8af895e289db33cb0d7cdda54b41e7039539b2f9c8b0ad41525677c1d4987bacf37fbe7eb3837b920d3f4178b43d22c7b2942bb777fa3b282cdab019d9f09ac8e36481fe07ef7c32b4007ce9599745f99ab28ca07921c304c99c054f4ae9da96d1438b00e583a805786cfa67b9c4c301b3f140555adbc78fdf36d1c2a608ad9f539933f7dae4a1b2f0d14484436a1c88a4fcf1368b9ccaf1c427b01489c1a63ad0e217736696dba383e9d5cf84ebd4f6e42229e489c940032eeb3ad554993701df9aafd406fec86fc7f3489a0cce6ec4d80d24bfe405c91c65fdac559513e27ce63f57ca3aa0fa602399f77429765c7b171aac4918b6c8a60fcbbf45d9b63b147b5cb9a68011d42d2d5a7cfe9998209217d71b109670b14892f1de0670f4a351055f4ff965b6084f5b914399ab984da260ceeb96fbb8357c760c73182953adcb2ad385435a21e92f24fae5c5fdfb5614786ea85ca6f1a7aa5f58290b3157dceb4235f414ebda09451fe3de13ff35bc70c532dbd226a19a5a85716a5047759329e21306de7942eb39b2d886f43debf33fddb7f087f96c8025aee4b177ca31730f90e74810b0f0f16574658af718629cea386a80eeada6eb64222e98e2382fef24c52f324bf168de70db07549d3d4e0c085bd6f786a1e54ece85cb7b402fa589d1f5575ff0d91ee4b45d3a7e471b02e302be69eee084ac3cad5027e2e20f46b5cfb7ec2bafc687b6c8817b628510359461e6bfb17cb470178907e06a7865981556637a1fc94837c725de469bf7db3aa2ce5b24f9cbbfb561fa13617c53a0fe0b0eae8dc6ddeca39854da2894efdaa690708256124e04f0ce7919479304600d0960ff739b6e126f9cbdfb9de80d7cede02102afb58432b6af7e7fef391b1129b2f5ccd817fa67d066f9b9130fa15095142842be3e0eb78b7782bde4f90842f88a259d27b6f33b9a69709924767bf4209f2ec8fe263e01c3c91e69b53d4c63ede188e6ef12f92c0226cb225eb6ddb614f38d1bec08a2b01416b9f9dc8067f27e6b8840aa967cb7cc2151db0e3b4734d6b3cb92045fcd30d0d2dde4c75cdb8d2e8abc20c6dbee4d3cdbad29df8e58ef0a5272f1d3961e02aea002b1024d278272b18d0de03dce7af8d855a52f2a835314421b81d63635b3f1e0c0f519bbdc70ef92837e6336adbf7489c3c3999a46ff89251de888ca84b34f2781177a335ad6f98027e8ec710c993472700b8b482442dd5e028c67cd8b8f1ae6dbaea04e2333251d02d3d8575b86ad24f2f390de9bcb956f61e3ffb9caa5d9a129012866d603f6cb7cd5a3742b066303b50236a82e0825db9495bd19c2a62fe901d58f17e3d7e31e1e54fa31eba6eab15ebde94f5b77132543083c57f3fe7210ee9220cbcd0d7e876fd8392b2dc6b890288d253e9496e1ced5c1da1edf2d54cb57ad9a0d02333d89d9d5ecba62043132cb0676e079f6264ad53932b904a12c7ad5ae675613e784a7f4e4818a18edf91bbea05aff6c03353bb9f4b2c0d4f87da1d11af53182790864497a93f4b2d274bd7bf14dc5eb4cb2f40c7af6b0f091ccd2d259e029de861d41301e9094d050388a6b6fcbee9841040635425b23c81bae707201a499789d57c1413703e4f1e5c925357251d3d37ecd04dcd17c73cbe4771d08a8af2af10d3c57155a7a6f88118af042af7c102d5462525baec73b8c8acb3b3e958c38c8742f94f4ff408f1352128e2b8db71e167058814a40c7e58a8d2f5d6c7eb85d7f50c5ed98ac02ee1425d45148837f781f413414212dfb0c365a07f61ababff3763183c348d74de71b1b64dc22274198c845798d68ccdd1a207fd987d1e00fb55d84edd8be076e14989138a160ffba0a720b9d5f89a3ea89c97d38a52a7523fd85c9688040c30ff10d25b4236d633537cce213fd2c59afe5a1b099b07ce099569f7d884c79808ff6f9478be4aff83fcb398771f8994499b839e8714c41b8dc3b0b2fc1afd0c68ab0dd851467b135561f486a3bd4890b347c025353db31747915494ea92cef1b7c993a5ce21f099104ce69f8e61353f40cab9bafb5df9499dc9fea68b3461cd5d22a804d799d3191b8331eb1e53782b59eb1564c1bdc139f83155efc547df2bc27ef5fc54f4491be0ce7e723cda3adc64737d2c6fa63170c193027781156f904ea521952d7b7c28c6f7753dd140a3d9cb2b9818ed5e71755eb5ac46a8e43a86695ed5d74b7694c735c4bd53c3cbdaaaf4d80f33232daad0395ffc6520fd68947b72b9cb942db88195ffffbcfcc408d749458982f95d040ab85b99dbd3a82043ecaa7478f1e711dd4f6ee281627354e83039af0f5835a6aa45702db0a72d8a1924ccafe74aeec763c9da0fa9df1fe766137b29e126fcb93847655dec86d3cfa08ba0111e8888019b6c0a2d3c5a11e8d959d49e004dfb643d2603d39857e3176089f0432791fee70ea0c8e543ba9280c76a0cb675b37ad040491237bc02a589e08782ec0a4f98a343cedadfc4e9e8d7baaeeb1a4742c024c91a5a305e6e614ea8eb1fb5cda99d5ac25c09c2cace5b14398d39727ee017896000a26788855f8d401f8f467a86573714b41d365a513560cd6fbd652377c5278e63b484412ee66f31899a4618d00c5fc03cdee57e5abce2fcbc409c3cee1325daab562e9251401c0193085eb06e05fd4e5e14743dd13ac351dc8abfd42d49accd41510d81d7b3bb3ba4a03549488a374781868ea09ef52a51376375f01cafe3ed8b6cca19a6887564232b74eb46e235320cfdd9adaa3640863593669aa38df3c5f2710d5fa70771067a72c29e505720976941fd6edb442c773fe13bd9aa2a03 -MD = 2ffa408e12424846b83274f71c3c682e1dcd13867058b01801a0df66 - -Len = 38528 -Msg = c429cc1d6ee0cbfa8da6540d8950baecf142a1401e85be76131adeb8a88e2a1ce8cfa91bb73e0644b80594316dab8fbba0e6a56a02b0b42f139cd656416b9bb654da952b09bf1a46fd544542cdd33e3a7c43bb9a1591c7d491e2c354fa28aab5d1f39935ae8b8e66263b6f27f1ef4fd34c02eeb89d517ecb5694ad991beedf8127c2bb21ecc9ea0ef9611bc821284beddaca43ace317627d2a599c0fece4c3821eee05d70ca1b7a5406f510da5a6b9efec44c45e2f0cfa52d4d9999db533dd217d207f3f553c7b93c10c17dec49021434b1778b7c957ceb31ebdab2bbd02b5c40eff304211c2c13f45e17723c80e0b50bfec679df8226606ceaddba24d7ad4d5973420c6865b0e13939678c4f74a007e106b9af905924bb4ad5030e8adc3c1bae16657b4fe2dec7675d222a99a698735053b18b438d10426834fb2e6250404ddb43edef5bf63e2d0b13d7ebbf89629dd6705e9b4d90719c318516984fd6526a4d864bc6f1123798a108093e05bf76ddefe7016e3305b12f233ff5eab7c0fae79147ff90c3e95370a5a436a0109b4dba19225a62885f6781d9e019841eb2a24c331379eb38de3a7b9572d09074bf6fb8cebcba16a1f00d3ab1ffe1f2f92dd11e9f836b14c45324effcee77ad869e55608d00b109347a0a9047f9ffc5eb951fc552e213dbeafadb6458919c55eaba8737e0b8dfa8a45fe8490858b36b5a8ae6d6e9ea347f3137966f14e6af07f5968da5462f867376143ebb6fb6ad51ba61bec9c0f62d9d2b9c1e66de6820525ba4c14f49ef55f82e39767e1a7e6e27afdc002474806fa43e8abbf1f190a0b37177da8c4872beb5312217f7653a563b9f3c636d71238b32ee95f7871aeaa0b9db8221e2ee4431292370abbdec54f63c0d15511b435a00b7b050699ca6f090c3fe564ff987fe4dd279a79a381c68de777df941a4779e50a1381c8aa9122d01605e66bd26c1eb752fa8397c0c71d07f9c664acd9f6a6afb8dca8cc343090a631d7025e1f118a637cf43a8c99199464a095aac5d62a83a81ebfc13bbf0e8134669d83656fef8b9160fb067fb6ddf14ce5ccf7059a4cd97643a4133cd193bd22bc3fafaa486ee8e908f83198a07dfd69ce539497acc270c12f74e7f8f4270b173ca5cf5235f66b127bd40101de5f80606612c9a194f61032eb158597af3234bbedb72a88bbefdab5c175bfdff8ed42dcb2f1dd4cdb4e81707e7135408a1c01b7d75e0a7264c1fe79e3c5b25d778d0a83bcd91abf08348a24f06f3f1b0e4d37b30280b538b7d49f07e8ab24a0e2a9a1fd8bb0c623a30ff5f64af6ea51c22ea156770674033c918506d80e5bd3c1a8d0f327602a9f3447888d93f0800a2f2506493dd98ffb7c5e771fbbd8a01c9df25d0d99cf8e5c44440c92d344476ddb9b2d345cdf4e47fea43efa9af03ba3fcef10f2e8e739815a6d48ac12da88a350f9dfbddd02f9104acca23e7c3e74916907b34b1c8e7537ff2c0684599a8ad316a5e48fc729d77de93c6b946aaa930e69a20cbf3eae88a6bae80cc2af6c9726b3090450223c31b7625e61a36b1cdf418628e5f7542ebbf5130a230d1d38f5c4b18b07a9f6224fe53d994c14877ca1534701049a69f6564d92f8130daae6edd49895b4414cc579300354f38ec6b2226c3495315182eea1d5c01ba46b5e5ec77fee8ed4c12b0cf7c03bf91fba31a6a7b2d64c36c4a9fee4b624db9ecf4188cbec3dde2fd09cdf10bc6def983fcf417b50b48fda9ae50e661747a1c8e05c4c41440cec8d17a6260e4c229e26c7a969e56c57c4e47c3f067021afd3eb47b69370aee422b63d51c9379ae06e91f7c5072c2f45551d11bdce4afbe6dbcfac5743a1534ce771eba5b1d4cb32c7a0792d0499c008a84d026a4e3ccf741f3cb548461c5acca388c9abc42c0a9d111df5e946744728273cf64b6f8ec2df09fa0d908229ececbfc17e6aeb897dabb4ce12ffb705ee2b38b1966a1787feb1ffd05a37e1103135a1e5b3ea0f314ce3187b79793e93db9b45758ace2f70ab716b8845464a18502eb2bc0f34166da0cda5eed25ec26836ffb551797fa091f0a8b4e875c4a48a72605a0d3b4fea85a1f2c4eec4b72dca28e0f00a0b865032f6dd42b993b9d9aebe5102a2de4371c176d9db42f78b6602d9c55e6be9ea299be5987dc2462ed0cc5d8b1041a1199569480b54b314e255577036673bbbb31214e462cdcd3729712c7696eeb32cd83cc43e0e9509c3c5e21315bb734128e9f2e41bc19aa00db5a41632f802bf2688501b816c080cab3af57cf2ddea46d995b354b33f4c0571d751d1b93bb62f3832b8b638ac1383754c76dc2c23341276bf3cacd4644bc10b9960a632e671ca09dd5cdd8c572038c8004d79ee16b96da66d7534a5b7ff9f8202b9ddc5829a57429124d8a5f496f14d60629c5e3ce11f11a946334fc0d1667f1a45be9c969b9f8a56f8eeaa0bdd77ac739d8ca42015ef607a97f3f90727dda9eaea90dcaadb6a8a35c069c3255d928c41e793e947bba73be950bacc156acea979919db047c27fe935648f1ac97d0995d326f7553b3d0d49fc59d1f07103ff26d0232b3ef4b8a8505fcca9d47fa8a6703044010f8301ea33bd9a808ca35838c9f58683ae3925ab67b9e1fe1ccf432fc56027f940a77105a034fc0ec934d3433af2a4ed299e7151d54e89d81842b76d3b6cb9270f2ff328396865c5ceabdbe720cf63b0d7ac04624323ad7df05f6c287b5be0d2a5a4f119a661beebc490d7eb2392ad16dfea47a658423636cdaeca282d358644298ed2a18e27f0c9d26c3118ec45696569e0a0e5bdb20a4bd7b83a34f80392c3c473fe889ac3e2a721c5503623ef7fe69f1778e6197b13043504221684ccec989edddd96713c7bcdd8269c0d7099d6e1a716387215a637a9101beb947a987c0bde53d793bb9aa58220147d64794a589ea9654651593960818f83fe77826f2a63ad5e544622e5470f21195b04e90aec64ce8d0c4b8c3f75d5dbc6c186435adeea3285bc784c2648bc02bc9eb666e17a7d3d15f02756bd5eed1b6b9e8b666080e6965077f1e16592d1ec86ae4098d8eb2f1f855caf61bd031178fbfc4c928af8a00047ed798aa80c9606fdf46a29f625c39c66b7a952464c891afd439370df2e6099f386d8eff99e5379abd6febe441181db3f69ded461219c28f9da26a8670a6e88dbabd5b75f304f6c18bdc202c897b00598da168d156a94ca782bcde12a7511f687c23a8ae3aad308ca12809a8ca09941f97219256a0fb72a019d52c33155920b8035cd128bf427744b3bfe31981285b8eb99ae4568f84e6d1c987cf8839439ee4d6a57f461f793d923a2056df2d7ba92f5b79f95180da0be5184122528184ec876cb9fdb6d995f5fd8ad5cf6a4d581f6a034b2bc8137f74329caddf529cb19c084be6f6db6c3d22df4c6cd75b6f6210c7378b063ab5c99242bd0a50d8d93e2fffead8d52445e356cff541e922e20e4fdf6eb60319f65cf8ae0ff31185c5af0ad6cffc2331f50d0437fbf18f4163d10f1b1f58ccf643be19dcebf4bbc9e078cf1561cd6b85083ebdbfe6e83447534ee0f2dfffae402c417847f79b9a15c82fef3456c9188deddce5c03cb272954edc680f16f731982eab9687b9344709eb38edcc157bb4cd148c1ed173dcb4cba50e06c85afbf16eb940e704877b4d16a8284d450451bab31ab0bb6c12c3954af4583fa7225a68245aa5fc5708bd16bcad727027c9e7a4e07edf5e0890037ea3cb4f8523f3bf0059913f48e7b3963e7c59ac08fcccaa0dc5af8c793f7228eb66785889d74586448eeb915f4efe831ec63b397a2c83155fe33b3c9f694f8065f3aa078039ae3ccf34c830a1f56ff0423ad0af464f93b615c99064232e7eb668ebded13ab3846eeaebb591a3637e8a434aa871ffde6518b9d94d97c6e786478eaf755a0bed6e8921f44238f611b0ad9c663135f9418d99c6a2c14bdd3d0c9021cf0be6663fc3182f1eec9afca89cd6b81de94fe51153d5d6a6aa04e897683cdcbb012aec3338985cac234c3960999210f25f4425d67e39346556377b7f2fba1a04037c00502586253c64a12f023d6c415401974e0953509a5f6467f86cd984543a717e453f206e23304f4e6fe60ec1c3e35eddb01289986305331b01d8ec1835bed9862d28afbcd12841b85e84744f12f0e56c1e9a779d18f760d50a5bde021901ba481ac52a0eb9a4da538d761440b93d33e6cc09a3cb36967c0a845e35ce88c37228b09d25b0371667c47f3345532108a8c25ad8a4af4662c340026879da0f44cf9c6109395df3fda86fa634ae02d4e3d2834d8fe0b5c2fcf4fa06f310b11735f137bea1cb745adaead99502b4bc5f6f3f9e16a7ee7b26c58fbcf49690e02af7a57f1bef527fe62ecd76be15dffc2b0b5e9748b9246c0c4cd1fd6dcb80e3d50a4ad72b5a74fd2079ceeb93f6a65ec238adf3462c3904ce038a3fd4fa57388ffe6fd44f7b9968844c4d9cb91dae40af87ac46b18982d1f68a06e8ccab9a5ac64472fb0abb363eac06e80e90033e3e6d78d7e5fd49a8501030e6acb777a0c7126cf2cfefa1e20be24a1cb5bb4ffcc4666ccf658bf4f00ba59897e027c72109eed86da760b8034cd1766a268d4c506f3503e14a0014107111319927801291afd63752260076407df42c4ed5a880ef9b53bebc17ec1f800cfd9c68f762f2690542ea3ec03154f01bc4dc39477fa610d53d0dce33927fb55bc52995b442df1dc6cf61821a85ecb8a2bdf6b7f084f46aa97b618631a5dd26ca02799df2a2412640d64dda797095f0af5a0c59754b245384795a72a698805af4300cf03703c1192fe1ff968183f94e9e23ad8c2a549e71f2c17921f6ed31c846d8341b05d9c77cd09d0744b7328f08fba52ace9413cb3c70ee2e0297064a055e55bf9cc3a6dcc7cf41f5737efebfd6445934af571b43299b59e9932b9631989742eff404fd6960988b3a916d5b143d14ba2b9cc7dd9eafbe8f4c6218ff90d88e2a559f5e4005fdb8d3572cf6da1493c932a0158add26556718b6ede3b4e06baf76711d24113ae5acb4cba4affe4970ee6d12b7f49c82b13160d995004898b877a1d2fbeae360cee0aa18a6fd3a1b5b00c3f3e2b98e2c298a01f4f6134d22557356eb9a3729100ff11dce92631012c88cd1d4243e349b44fd66b99f812535a92ee03b968d64d12f5a9a4e057602c8200f11340af7224899e82997efde531b5a06e8336f52292ca389aa176eaa949427f3fc83e578d9cc7ef6a510759f697bbe97d9739329e87b130ac7cb3c75480f16c80e547237cd9f8a9573a3bf28dabf6d6e2e7c90791554e46a6dd9fd6a9fb19317c1160fb8602a33412fc22b1f195edcd671aee5c452329e0526b4300efdf4135fbf593c7f53f51f86040c47e6c7e2837d2d8b019001acb6876cfa62b7057f2e0c539e76f0fba895d0cae2a42448e307deccb18260b62bb44dbb1d0407288b39aa18465db1d98d3cbdced5be3c2ec8c057d992d6bae2281de49b7ca283e9d0ccb597e13f36604b7aa9aa65f4b2ec1c4394deaf8d03083a69c888c9bc91cbc85dbb3d0fba03424be620c803f60d034618023677f3edbacb1e85fd64b0d530ea733782225c8cd206f5bfb24020cef6eea41c9b7cc9bf5c52a29973ee3db2dbaf939701b97547a2153fd2e39b036d596e7e60583e7d1c7f89ac6f86b6a1af0e8045662645b2d834ff0b16f6852c6c8d5e0d6a073d6c6996b88294a06e8b4e5c24ef217a5793930d1d1dd8459eea311535e79622ea364b3467cb955b66690546d61765885f762c9d07beb36b38fb7f837e837125d56915cb2fedee124ea968514c548ebacdf8f957378414d1e3ae9c4aa07787aa7f537ddd79700b5f77faebfdd00d298c339a8dde34e499144f921bfd342a460b58a3d7edcce879ad82ac04cf09c7b29720b94e9478869cacad3472fdb21238d2e1c8b87e92cdc586ff5b4727621aa64605f3d01c8ab0bbf5bd1445de92c5dc9bbb40940283865b763e7727a9715c913363c8a6d8e4196399df9fe9126ecbbdb04599ff1bf7a8b7f5d08e3ac7a023ffc9bab6374c0d2720038555e13b9e8a38db01335e1d67ab6770461ed4f486f74e838b2b06086e406dcd5ed4c2acba87ea568eab35996c14f6801f979ad28e5d09eb55c59770901bc951cc7b11f84b5b5ecd3e701a126d6bc1afbd9700c43ebbbe8b9ae470271b0fbf2b4ed733a0b96ae2a9a110701af4167559b07b8b5c1099d8cecb26048e67a2cbc46677cc389d3d3276471aec1598bb6e1898d3bf0c9c7de53f76f8d938fe5b5bb793bb20225f58baada0ddc284b3b13856c73df0483aee60582edb729947bffb7f673ff3f08833d7da4ef7a7faed9e50aecbf8e3b18451d6a3435c4531ec4727864174ac159055366691f710ea9ed9439b27b2fdbb014ec49b64e9e59554776c56c2d7bd14104342ed1a3a71d650088d866aeaa2d72a4b96caf402b83608c7468b6bf79b7e807489d868506f40a9928afb061e779877ced99c8145519671bd227e9d42ebb7596f77a2dcd75dbbf41de88369bcd071725f199a9d10262947dfacbad7581251139a98f7181db19ac7f1229a364461e49252c34f97f1ca70d39521caca95a3ce379c6a2f7ab22f7fadb2a5b9dc43a074506053161278a30fad744e18b78a14914ddb67c6a5231bdd1dd8fe6ccc48f0b344fe65a88cf344584df37e4f5ea3e94cbeee1e5707ff0b3580ea992da6b2e703e8936751782022ed3da93eb90081a653132b0a4b1394720b8f5e0276cc2ff7e8a3b5c4bb545dc320e50bf -MD = a8d270a4267161167dc6e0b1427a8b8476645be263d29c5b8af924db - -Len = 39320 -Msg = 9f363cbbb7cb244b6fabb15d4f0bd46fecfbebb4bcea38b92a6d9248e63c5a8d7f7db1773346e861065d38f21142b4411d6f7b3d70de324de7ccb23345bdfd36cbc0778009f453c5f34b4b25378e9454cea111f8d109c7528fab9121dcd614c3ac84f69ee0dd4bbe5ffd50bf69f75cee281a13ab8873dd12499297da5391887c49539698600ab99572fcb1894e86f4585361eb1f3d245dd33e0a2c2551f63fa9cbb4bf383282869353cfd4488f4244da76feff1c972530de959ab8cb7e0c22925930d944fe4d98fd2bfe23c7d33435bbb97ab96a3e7d3c7b77cba39583db197f1c4e4c856b74d91e211204cdc362ad45455c80d0db346bf10c245548086b0db73b9680c322fe303d5e92e12107d695be422cbb171653a48a7b2d36afb4c5e483df90dec6cbf384a10906218c4698d66fd873d40796e0ce8ced6eaf9130f0882b30c5cc550d5cbf934bf62cd628ae56a02db7326804e6d340897026b523f4dff755bcb33a9040c85b4ceb6ac75722ff996c833d02076a9aee78ba04e436dad32e77fdfc3bfda78741336d432678fcb8a1bb5c5d9d48760bdee1d4b2e611a94b1abd110d21fc99e48d29021fbd3642680142ccfa006e110e57ed4796835b692e01507f50b3341fc7865534665236fef9022b5a7cf422448ba3c49a1a83bd22662c57cf2bbb4e401875e08a80ae233752ea9b8f4b410c166a088d55a5addedddae3fb8a08fff105bfa2f18cd599a3f65b01bcf1cfafd38f93cf71019eca67a2726e64374e49c674a455b1c3cddb5e42fc91b60a710520b7ef3f97256fa2ff771614b95e655f7598b0d647b6d13bfe231de0b162970d9a9764a227497ffd4f66ae1e2387b509a576c96cdcee478228a1a637d47fab8dea36db3e4bf536a3fe7622d4c93ba611fe18d86198f1997886c57fde47eb134eb79c3d5d29b2fc5cb5af5a7ed401a03e2a85c6fba2492de5c096911d332e3918aad27045e90739ef1c1a3f646b620b57cec57983237d6d917e1cc23cc0ce83b36bdf5e3eb47d5525dabeb7ceb7e54f2595e1db404216c0446760fb8215555be6a1cbed92b29bb8c698a4ab03df12d47024e0d37c289b8dc5236925395b4b287af49f07870ae9cb9afdd2044c0c7102ff26ca487dfc943edd5b4026a7b93651380e629367e5eff468b252a8f1668b429c41a7248de78a3a54b7ebe81458a040e5941c79786a369cfa5e2c813a14e7fa0d1d804ef21104e9f2de7451ca5f105c4c31d5a103c2452c16aa66766e3f0d941b635caef4a18ab37e79e24b10f70f0d348b96f34f14a40a853e0a6ed70e86768ebb442cddc0a400c22f3ebd2d4824bb644a6657a689dca00ec11f53bbaad90a2ecc3fb0f395db3884a98f8e6a79d7cea5174eb54e4974557bdcae0c633a8eb6c33f55228049b6c38d8edda80fb3b0aebf9a55f5907bf4909336be8117e72ee414bb8e6aca03be09a58731f2641d38c47a7a83ffb447e4bb1d78579a1fd940fbeae9f3701aec7973933c9254b0e0f6769e5fe0bb02d6cd3de249813fc2374c630d718b1db72c7167215408b63d23722df2f37511c250377eaa5245584929da8345fa5f57ebea2e4e15789b00510f35523fdb49ea3bdda8e63c3aaacdfcd973c55a2c7507fc4e3691384f541a35ccc64b4dc2642cb6a3aadd62aab986236c9e9013b1d7163381139652823aed3181ad82e44ecfc17bcdc4cbe24a796b060de44d392e8d6ad8ab4dc72bb8555f8c56735dcc27918fd2817f1885c1f265ede2cc62944e9ded33f36a8b8a9aae5990749f46ccf6b28003e7612c13b82c5a1f13de38ecb611858b82f44939cf4cc48303b9a4ae633b7b5529f46f54d63034e5c9a2370911f01c2a80736bfe003886ae2a4adf38153367126cc04a10c405d9872ca1c7b305439956146d58a2d578895912d95f33b5a22e80db4c230e29b3334d636251b13a11e458666c78edf516b3cce3ee8b66ea91b7e79b206317ae43287e976d3bcc5a62e5789ff733a60919ee4ec411cd9b5d06ea91d7c473f3fbbca264ef4befcc0a3f84fde797f197b88a2128ddcb8c98b60cafc5b5c1b96ab72688459483d379f4aea93165d21a86ab7034a357a331269ca8eeca5d9d9f438a89c26aad9d519ac0ba3c5a4233163c8ad30e055a22220db7e48fe9f8e38c481eee371b6322d0f9166825c1a53f4d81fcbc99960dcec815b0c77a6aae18e83f185cd1a0de99b85c9cc24caeb780281ca931bca099328b062f599895a6c61af123dc7740458a708cfdcf9968a07d0dd73a3d5f6926d3d4a7dba3cfb109748c26e5751144c07d6251df97f53987be657857e56a3adb3b09c15dac0808feaba5a6062f88f479fbf572eb23466794cc99c8a733c65be0f1941c5c7d2ce0aef2cd382f12c298958b91b9c87a763bf12e0f8fd32e59145e7ddb80811c218241d16ca60827a8783fb69eec1ea46bfdc36c319582de0cad7d6848b57493d136ded0eab6387522dc9d0384d497aa0ff5350f66a15d4cc86d64384182dcea2244ad78b0316804190bd7faac39d993486b6c9e157d0c7f739e3c7830b16227fef3d75024de3fdd734e16237ce38c6700a693a1a8ef367ff6862cad7c08ad544c8c84e1af8766071aed82075d99592f1eefd0a086c083553a6d5d618d506678f457dbb1baf2848af430422db825e8f28a8e4b2417b89d08269df61bcb50349cdd9c054aabe8426feb5e7f1df34de0b82ccb2eb4c39e29a0a15d20649ed2c0c7f1a32a34eb3148bde6c1606078dae989eced9ed9f23cd22695f403c36e9cb10117b370f5e3953d7ccc9f0e7dad93ad6eb23ec51a0c583da1e9abc6c0a378b05237160217fadcc9b58741b0fcfc42d16e6604cbff79bb151985ca92e3a52c65c33a12062297cd956ffeef6f66ccad0092f088d810a12d009751998eb5dc80775b06f0a59c243249b219f17342849de0e1381212d6ed75a621355fe3bdb13e8f2384f8060f08d18d86c08ee3188eda196326eaa4d8c35db1c21966b8838a2c54219c715202ab7207f4db0fe771512c5420a357b49e8cabc67fe5f43690d0146f5f37a5b0fe75df620352bca9d3355b392195a26bb1b1288f628152846becbc87e53bda498acedf44bc0ddd4ec9a22e6f6de614f098989cb472d5c8cc9c44ec45b99259442e1e395625f5ba01d8006f9f0c7cf36cdbabcfddb7c99d33ac426e51e5226aca72cdb63f49f09be88ab7e47007418706035188b13a461be3224d095271d55403df431ea72de7c72b662f568b651b1ae797f191d80232880486cc84f063916116fce83938dbc387f3f4d18c972ef4f2361ff5b0fb17772dbd6129a8d4c540d72c5125ce985a6a2368bd03503d6ab3581c24c4aec282fb52373acb3da69ec9ff6c6760a76fb2c6e3b1482e6825224094c12dc652d44aa83f9a991a0b0df71421ffc5028a66ecbe0ef71dbb9df65e83ee4cc26366da77643b0d067ed9b2d709850cf47440240e39ee61c510b7582464aee56b03b07b12198fb80a5f703d469072bc7a1d91522321c918c7977ef57ecb1bb6b10efa6022ae84c42c2599554d913237e1644498305de843abb7ba7273a07ee41bec0a30af0b6059f5381aa2f2f40ba4b0b3239d3fd5930bfad7327a0bcb1f9a3205a894c2186b9eec01bbce3fa1462b7071f40a577112983b61afb34f3446fe7cc29e3461bdefbc99e6467e3c802af6a80580868119ac11f6bcf9c546c33b388389b3b797e232db8450815cf07a012ae0d98fbac4b5aa9eb450d859f9614571cfc3aec6696f7d2136a83610637511f2a154e94e282d5469fb8514176ef4aed1e6d95808e14c18b936542b429d5aa47471de55e9b569f29756c374a6af65bc7f5231792606614bc90cbe2999a71200d8dbdf9c337451cc534a72c1afc49db8a49b35d9c7e0965e7a414cf7bd88846d4764bf86d66cce2ac361fac3d9b383ea67474c3f9478d498f35c685f57489735e996e7db77a5c6530f22c342cd86fe99f1e0dd7434d501435de579270ff0359fe5f8bd63c1282390601535063245f80e69ee524150ff07a5df64e7188c8645f26312aae659fccb29dec3b9d6b1f65892f8f7126c90ffcc06a26219fa7715ae778d6d172bea29a866b0b3b57cf2a3066bc68585bd9bdc3ab0cd67799577a25a7689906afb1ab8a08eff6d93be9c53e9e1fa1f13fe1a9e38ea89f96eb0353730367f030d1e91b09debf27ab965570feb3ebd4e24f5b44eadfbfea2601558db1801984f665cf81986c3b2619139cddef3c83698206b12f3832c53e9b78a8997fa1dfbfbdf7df7fc435f66aa8101a3c8eac98e886f29dc95a1c5b156dcd87072bed3d28fde483560bb0737def38784d5b687eca379f4b93cef0e3f7235c7b4744d6b4294cd865b4dd8034d844e91160e404b7973a79751f1554e26c42b1efea58d2d759113ff10cb819acf24fae8017a705c5c7f5fd84dbbbbcf8dd527a7f50e6761930e187bfde39e15e5475f54ee212f04be4f0a8155a309d79d2b8f2842b6c34ec39344c2ca9c18bcb974e59c850c6389c76c115810b027af7d50cc6a8ca58a3d2ea9ff9b1effd5d77033f48a6d42f5349e5dda2627eafd9f57cc47357ce4a276fcd7b1d0a112beae350cf4e44fcbce4d6caacfb2415974ee50256750ba7af54154a6c227fcdfbb892e884d73d2b0d41c58dc57c6070672e692e59385ed6f6ae65e9d9a69d76eb5af832e67ff9ff8f1e88b7ad92821f8e0cd4593359abdcce8ac4444a15ed9c592695d86aa505dab0cfb2d0cbfa13637a7ec90b8b458d49859dd2b2340cdabee3cffe4197f2db5d20d9b651a70f9eeccad8b9cdb7887d7dba4bf3dc3dd7ff5f199b93f6e4c5f4f74db115b2d54f8f3bedcf29184e9ef719db19ba2abe23d5ed493de970e7aafd29960a538ccd366ea151b68963c6f5748e768b88263b5cd8ea111b8137f72e2e749839e2480550a7eda5136d389728904c0b1600474c0f72e60fa8ddc4b9bc3358d2c4646d042ad551468a571f65a4b4e3174d950656985e61738a619f95c19656c43e3c744021717cb47fb98088f66ce41996c8fbe1a3d5dd0b24bf3121fab1eefb1bece64fd106d07d6806f4979a22bf80861e9083ae93c9250c4921d4b42091d5c1f84b99c60ffd1fd7e1f4080c60d5ea90085c9314f2a66fa581da248a6cdfe2d4d11ca45ce7430a43bcf750d9c1e7c64908c8c6638d0529850bc2a7d9f139a0c929c1f6124742db300a87186ea0359225b25d6436bd56112f4993c54f583fae2344d415928a9cf1215d2bb557967fdc9a779312fb2e398508cd960346fc425957c4db793a3b81eaac274dbe011f07143bdb02492d39f013b60a71e85d77f230fb2c409795c4c22614fb75a917946bc76e5f138d597b3a3b9b829ffb0f35bfd361edac0721d0be42003c2bfcf7b12e64c6764f35ec6c786b3db878a1b8c01baf408b563e5ac9d6bd028be9201ddfcf8ac8a32e0962882b31212ea482f69186230b7807a3cd2abbf5704d25c9168abf97d978384e5848d31bca57abf545449fed274618ede57dde99fdf27a3e6e4c8f1a9d67e69b4a48f089bdc5e79f3133c94c18780263303daf08e03e4f26819fae9178f4c16694e314196febffe726f982fe73806caa39e4bdc0eb732ce7fcfeae7af0a14136e4b1be39455c4d43b3006d42bcf1b0296efd7b6064239c193cd40f6598effe92963f4f67f279685b41e2d8d7593e65774bf27855ded20520cdca31bfd65351f045d65833ebd5c994700b661adcd9050a5d6e251fd00100a52c4bb6083d5dd3d65031590b95f3f965ba04859bcc5407691fcb122cdc3306fcd4d31ccd32720cbb61bad28d855670657c48c7b88c31f4fa1f93c01b57da90be63ead67d6a325525e6ed45083e6fb70a53529d1fa0f55653b942af59d78a2660361d63a7290155ac5c43312a25b235dacbbc863faf00940c99624076dfa44068e7c554c9038176953e571751dfc0954d41d113771b06466b1c8d13e0d4cb675ed58d1a619e1540970983781dc11d2dd8525ab5745958d615defdaa266b6213b8abdf34ef3d4f3c184a62d3fc7e2a98027993fcb60e8acb933d6e63b5e7faddecb73634e08591d19f7d8fab6c7b7b4c622427499a8f0ebf49d449e12def181e81a41c8ae3eb7fa9a31f447efc2d71b36dfe8f3cb07f7709c0100a92ecf52c6e1def0cb747f38b1cb9bc2bbf0a18b0759c453646964436338c9d3b19717eba34f7e4813aab2226b359b0cffc34d1ba0b53a4a6d79a61ded515c855b56a00441bc64114957bfbe4f5e9a98ba70adcf0dd4aa97b905b7cd366e22de517250e5c8aff71314848d5486d0012f95fda8ee773e7a00ee147e9b651783a63bf311d55fb19f161d38062c37133699387428c20579144eb5afe3cfa2d5e7a4c0e2ca1e2e49c4e10b7b118d8bada39e4adc1491e00fde49b5ddceb0172eb6a1894663065effce3d875596c1aa28ae06743e53a42f8842b897a62787e9ac58653e27c3d6175b26f239cf7e0ebb0cc1985da1cf431b6aa6640212d69c43d736b8868dd4d580e632c8c8f0afbde6df431dad0d6fb6cc3f74169f2ac4374b36b66209817d4dc2275b87ddc11215552b9c5e0e8b1b44698e139416f5d7a02951412a700aa68404a609f61f488f602d7733202621bb361ae0eba60e7bf81e06b040d9633137c36feca5de378f0fe4994c722e9dda38d409bc64162fc510fb0adc193789fd19522b809507cc9e78ebbf31c04f1cbb78665baae6ab22da057d5c5c360c8b7632795fea4339877bb4bbc7ae854a4bce64343b32d92c8fc3c1ed25b8fd2010a46b8034b3153c1030a99cda4b2ae8d11ae486cfdda5621d862a938c79d83bc190adaed16275d70ec541d8209115f157a7e1a33f32b215752d2ab6ba262e244641de4d5e7fcad4294062b6c007af2d847e41d4b4ba690c3fbfa89fd64766a446bfe7a305937c -MD = 8b8a54913b5a4c09432ef2faa98ea704e6bf068af26b35cb22c4586b - -Len = 40112 -Msg = db71e06debebb085443de3b1b744f546d29f16895a5a3872f5c966b026b757ec7ec1435211fcf54e28de2293355bf9620c4efb094f1b0daa2a92cb3d411720d8e700132e913fe4578a4158cfe81651c0bed1a184933220651382fda805bf51cb7df9fa0a53fca628d32f2e6bb6bc26e952f1b2020de79a2e1761a1f959f6134ba8739eed3f7b62496c704b7189979f632e76d38ca581a38a9ef6623624068ee2d035a7df3d034143bbcc59e848ede5b8bc28ae28434a6203100ae5695035e9175d08bee935dd6b9c2a0bfdd9db071f6f62cfebe1cf880020d665d599c4cc4d72b7b48b110f5207df20f4e14b292d76118a3232bc3184a56956cfd8cf6812e17c4701b561b3a83e910550ad461ca612259b1a29c352867767f91096122451cebc73b7e5e10927373c40e709d39bbc1a33fd4f7bfd18d5a1a127efb96ae0cf3bbba49dc298fa191b673b819bf88fb5b6c41799ce726cbb49a04936e6df84d651ff437cf58e6cc4119b5de60ebfdeda105f53c0cb2b377e98eac5abc77af8ac3712b61c25cb4872425f0edd083071734d8c188b192f5f67b509051704422499167c6745fb587769d53bb630315230c898d3cfc36086cebec8856f414540f1e716c3bcbf1e3ce0f1f3b7bda5332d032017bdde304a396acbfbe46df3317a45dc5e711f51387f6a54c45c8c05b3c9d3c5f2d1ae9a7d4f1dd574b066f370fa0ac2170df7c5ee2affd86fb189175c2f86fd5297a7c9a1d0cd265b70c20aabc826df6820ace1ea4386c71d3f1da5d36606115f9831855fc56404d9ade8008aea837c7a31a66ed4d5e667f58cb075c3763949405bb5955f35c9b816ee429db46a07e075c84c3353e509012022ab51d26809ec1e6999c24828e48a39bb37a9d24f9c55806e08fa107dd6dcc58974ffa8435d44204847d4c2a69dc16a9c2feb8ba22921c3a94189b3a435420d477547ee0f1c976f82259377b8dca7d31a922c886a958d670460a9e3630e7920e615f34cd4302e329f9dc60c65898299bcc93470afcae19404cb2248c149ca25eebbc9699b8051922516372cb68c9be70b3acbec7aaf657133ebbc8bc6cf7d44e5d193ee6bf447b79ef8ac7db1cd3ae38e4eb9a4d22c612718283f547a86daa755be17824d745ac891aaeea76035a7b5cd6dc53fbf291cdd3beb724ae6572973c5ea1ece48e8d0ed8796c553cbaa29865000b966498edfbc259a1e16112ab1d3bebd6f7a6438f2500723f829f915097ea06d5bc07943f2ec5d9f0b6003e8bbedc79fd42da94d081699b951d0f25f90c4441e74f656319d946b6001cfc5778fe968f8138f200d5a6ac5c096f1be6e0381c479cbafe83e28ddd847c80b5ec175f02930f549d0612f7214a09033662caddca9e82a943853daee2bba27bdd6adb52a93af4203c231d1560dc2073ff180d5fe79d2574c4d59fcf0ec23e88d362296be2dddc264fc66863f398cc3bc6751c20ebf9f1b803036d60aa4e9d122850a61d47f233c1588e697551e678b53d089bd3500b63ed8e7d4b065da74ab25cb4c5f9612e77abe6e9b4cbf46bc28ac350f0e9bc68188fb7c19d228162c3d3d10d0d52a6d924206b46ceca639f1636e9dcbfd679867c192f6ef837ce07951135d7e0eb8198d5d956440c1317d70024111a5d2c2ffd0b0445e3d0d89c1c3ad4eb93e51699c3f9314850111899c9fcdcf9885d4d382241ebabbebb67640721a972df8e564800fab2b209625d51ee88ebd3a534cc3a9ccd39c15e0c76ce6ee6096c09413d24c676f813ce7453e89b20bb6fff782b9fc2e979175068792399f47f27afa23db89aea5bfe1dcb8ec67640d60f059bede04b33241e2444011c3ee975463125da6be4b168c175dc8063f685c631462485948c36b55648238100c41176384c5085c73a88a91e752bbb49a25c06874f8675350c70b7503a8b9b89a0190c8e4f96e24312cc97658a3da20ff030117160465f4a525db48c89f0930f797cb2a8b97d5277e3f9ae273386d6ff66ae617046f8863ce47a077ba4d70a1ab698d328288868de549c67d3ff9bccc07c23911461f19c9539325a9e19b38333ce1a188d0b2c97debb216f0c4cf0e5dbb73c0ace2fe5f4dbd7331874671a70d3466ced37dffe61f1ae34fe30aa0ad4a99e54491e2f3a418934e8bb9f0b807581b5fdbbb9256249cf9423cfd1a56dfbc2a818c674de52e515d8cfce6e7569e3b773691ea169ecc1c1038a4e7fbd7eddbf4ad62d72cbe4721a4944cb63435b5dfd252b80511c126c6e82e4e49b50d1fce81d28c89866535b0eed043d3de3b936cb31b18b78ca67ac3088a03c951debcbe5959d32463c24025c6a7a8e2ed528209a3f978a58d35103bf8b58b12d6340ed202a8ff51ccbdb2a9b181458e6a61c8de2954a17a1f562f554118aeca4cf65b330629d8b7c73ed16339c6e07c5c50ae14cd945cdc47f121396a1a349abb0cec08ed4325ff5f2de77ce5df4257cb077cd317216f740fee2c10fb22e4292c5d097a3d5db0d099723a1b3d3233c5c06d7a429064a2e97e3599027d9a8720a6d3f9b180e13fd37ff51269ca287b6e416cf08abfc3bfe39cafb03677e9e526325506d43d369baf189fb98e132ae1fc59eb25d22ca78c0c7242b8d57177c6e4d7cc760bfdc48c0d6c5676b1a19e2e140dd362436079d30907d7fb06f3acf2019d1e928047f3da95840390fafaed2a60670aef05e29f5a856457bff286f030268c34a258a32b4cee678f5092a8809d886e79143f3a83ea268fa84dc0b1ab4afbadf6eebe99d4abc11de0fea133be4f342a08191af18b4a9492b4ed99fd450627074cbdd8b256bfb5afe0e24e210e080ba4a045bd8e2144787561e6a5f1262d53a21f59ce75195073247543c2fcda8fb5e327e15099ac9e7a3e99820b15b68726875508c96b8626a284896b254b89addbef8735fd9b942141f74307f4f15edb49bdd813f11a0308ebd803a09e97832a25d1a689ea1b409576a747be870e84f3634c8ec26d0cf9c0f627cb2b55672fce3a906e253fa11ac2c0578defedf392951d3d615c66c9d1146a79c9547343f760c334c55025b5896fc80efce24d28ee8a1f97382b03d7f1cdf0d6e56220b342aa67c69554c4e0f56636d47eded03602991062fa756dc0c3b32f47079f83407972cf4dc57743a9c66db1b1fa2d9ea4348c99a79183cb0cad8dd0d31751c5710281a2d13d02ca99654de1ae5915defaee2a616de49d464119257a83fdc10dcf469f895be53d833638ce6fd281dfb9c1973a11bcdb0a06e96e41d65ea13784e1ad932cf1a56f940ba8b703265bd256809685509c5e14328b14aa8b6cebfa522fa027329e65e1259d1ed244b0cf38debf55d3c7165501f2b0732842b5c4549e41852144670ddc5f7600e5db7ac65778063beb1d31a81a70dff382a342128b90a0c54a095685a6691db7b96f8c26794ddeb097fbf640a7d1a0fc82551abfe852d3c96a2a72b5876c1aac16a9ecd9e484ce1c9d096b03f0407bf6ee0145b1b30962f8494ec385c990f646c331a4c5e0465fe8c6ee9ada3ce3f9498f4eccd234e0d6b9ae1e52deb3fc38ec8aaebcd4b7bb177ada538badd5e2a15d2de5b608b3fdb576634126a68cd9680831c93aedaf0a813ba1df45650166fc9a906d0b3d77888a962e6047c79d4e0e01812928f7125c2293e33bd0e8099790697f8fd358c9aada81d823be272e84b33f42768ddc26d884eb670e3420359ce830c3f31741f18a2f9e293192b086a3de2a3c5a728334a72ea9f60179f4cc9e89582440dfe037521057e833cb48efd2182a367bded483f0a83758bca84b18c4fd4a6a1f311de2270613dfd072d9af39e8a7fa81d9b75ddc7bfb55e6c90f5f37cb6d5d3717e03c33983bd4b18e4a0f01d6094e156c1408932e5fb427e227ea1e7b28c53198118b9e4e35907e278357526ab8fbdf9dd3cd3c49c93f29fd7b01a295e569b4bc981890b06adbde466ccf532d1cc98676dcf4ff54a3bc9121f3ebeba20b12698c5d2b3047427c79f1edbf2da69d7fb3ff17c505d854f40a5777f2202a0288f70f480ca69a263df833ee6e075ea4e70d3f6d88765d44af3aa6ef5c69b33193084e42021b317ce4031157250adb97c73d3ec4847a69dbb5c9164372efc702fb414f3156b795ad3a4195102c5ea7e0e8ea040602378681cd60af5b7cdaeddc874c1cff51a14d22075bc601cb2a4ae512bd9a194ad83b9ec1a77a1fc252ae2701d1bd923802e14213f8ac134a964a100c5d07e7a483109a57457e788b7e904c2f7738d45601da7425c1502cf0cc31c8a074535658618edd58e3c34c21861db1d9e797abf2c7bf22075eb93506f1867494a78750ad993ccf8b285285ca93ddbfc9c9e201537b18b37f76ef17d430d27eb1a0a9bcec53a3d9babd3209cfcd57dec6c41fbdc2466e8f56b1fbb8a2af9c4dbf07c4815eb94961ab496bc2785b1377978058c78750471e54b9e402b8966c498683dd8948f0b8d1277506960c6599f005a69407eac02ec74033b2dc5d0ecadacdbdfebbf523788ff6e90a6fd51572b3d8dedc6533bea8f5e3ca6e2ddb3f3f685e5d2effac780f05e04c7f3419912526d8cf37c9a9743f0d06241fdf7850525bff0a763db4170799ad466ecd21013ab3cc22ad1b95087a786fe9cdd97d698c1b796cdc5d5629e8b52481de21358e39c17e7e46433fa2e19ee7c2800332b47410942c6b48dad638c00fa2d71a9c60abb7b48c0b29ef6bfde735574145de5692a317f228e4884581223454619fa09e18ff37f403b5ed8a55bc234f1787ca7a6e3acc651d1aa79f4a425b3d859987700600cf5d36d08028728377520bb13f46913f792e51d3810b1c8a4e054aee9affff22436fad60f26ddaa6fa0a24ab83e28218e7f5ccf55cb27e61d455b98721738acd5dd36f4e8980178b741c6a5dde77c92fde61976981bcf82fb4d5d84c64f43069e33184838e8ab19cad33e5b09a2defea261ab9183850125db72cb125aaa8775e9e30f5e648b22e3f6cf59e8afe2b7bb386c93ae9c9965551a5024cfb3dbaea155679c95e012118de7b0a9cd5519af5f1c71623c37bb748744601afb463500ef4d3b408d5fffef6e0a01be777dca1e50bb1a87b9097db742e61cfe43a65936d64dc88bb328c7251ada4d0885ae769d46b0c284a3765295fe8c014f3738baa8ece3b9de95deea5b0ad4ed08664b91a4a78a03d98a02dca93082979e2491cbdf998b69c9a3d6dbe9b4868c4e97f9cdbcd9a35906eb337e698f865a5bba362f6372c162dd6bc53e69ae6b853ba92d6d4e73992c8d358caa4f41e3c428668a37bcff022f7a6c1e64436ef08260084b02e1fbd808ed077302c31e475f549822874494ea4a311357001f6cb1ee4c33f7211fd8fc78a6cf8afa7d6b1da680ed8390a2ead62d820fe374463e2c2360baa64a40a152f63afc3903d6cec3143dc521d640474263fda058436039cbec4e1adce10cdb880c2a1c01b157aff432dbcd81eac560db68047329efe6162d9354c30f77ccfe0814e4bd897588851d8cfb4528207a9dfda426f6ecfc6029ada32551b281196f6fbb0b4f14e2d1f4ab8d1cfa8929f87525c2d5b9f5db370ae8a620356a9f7ac60b68fe4f486bdc652aada12c3969c77ce03ea12ae91ef3204b16e5ecac25599887a94e4ca882f05d177928789d62602bb96219c84b3a2d00617fd6e5dbb53e3d40f67bb599cac642fe7a335e39963ae81de7902070bf3d21a83b83cf8db1b14ae3caf718b095c6cd4c2b224b9297e0688a39b4b21e00bc1aabe46cf846bd2b37dca140f471966a429d06a5df4cc9d8f39ac2f7fb97c12251d91512fe7b3a349a982409c7412f39494d970e77acbe9d3fac3dca7b7252f84dbc17e650bfbb45d9a29d820fc3d2ac57ea46fca356e895934ae4ac902248a684c197778d68b2d77b78a87a4c6e234be50fa0d0f0cfca5a9503622f084c14c58d860e47032aa37206a6cf32eba49380770a3f2bde6bf674cb4230c2124439ddde75d6c5606a2fade1b96c4c9c0b95f294867c7dcadfdf5c9ca3daf66caf4a47ee1d9b8313ab99d3c30d1a37ac07cd1ab3e0e347548ff77a8f94cb4c65e1a8ac32e9c7009b53848bf12e5384ba2d8b515bc5fe08e9f0d1672a817c24ac9fe7634366e3be6616725f1299a2a434e1633f0292374329a6ef9ae416782f8f1e8915a6117c1d1258d5959ddb8216aad7d75c3ed229766216c4ae42b049cdabf1f03bc185eabd1e9f30f7f9706c7c9a557a0167024f2341c4d2e9cceb6b7f81bedf3e2c10da1ef95e26decbd4dc1671feadf7219f12da3735acf5f92457b58ee988955c6ea4a3212a09b27b955ba4d0480585d5250efbb0edb55b4df7892041e69ef9c8dbe4fa24675c2b8f1e658813a5f3361830be085d518e8241d18a10495a84a3f805057471aab0a28cfc8430dabcf990612e8a908b158ae36b4ed535e399dc5c7056a0b2a76899afeb9c224f83d1ab2d368b0f24d88e5d2720cbf4d1cf49085bb86d2135243569bc2199ea34bda87a550ed2a625a44057a608d563a46adc8b5a36a5116c7675b34fd5622670d695d9b050920a239cb01cf89a07ac0e24c8e7b0819afbd92cce08e36d8171946d2e5bb7b25585af20721f874abf287fab82aff70fbb4afba582cd0f5074460fffd672e39a79c318bdeac1da918873895dbe46a6678289447f58923c24b73e53fd22a1bc7f9b2cf0e3aec68b14d017bbc9c03e46ff8d216428a3daf260c6a500e3978abae8162dd820227ff13b428f776e3d19415e37bdbb2ff919ba8b2f248741a970575a97603f01ea60a57b3c355cb9894a3dfa1eb8b9f3ccd10d1a5d3757a5dd053a4d8b4e85f75b1b206b49c3cc3a49539559aeacf11283935274dd58027ea6bbac475e635d7f18f1ea71e795567ed1c7c0036404f11ad1d333413c01184a9b0645cead29161798a78c2592348be5c719767deb4b2a6b2c031805d5bcf9782e779f49e41a503f6e8e5dfcd62bcd0d9dbb013f810a0d9206b5891946f636a5e572014f9fa19c74ef28f87e2fd5aa64da3f08aee1ac3b1dd66d0f121c474052349824563c794b56af09e4100bec9479e12 -MD = 662eca1e9e98d532113093abc2cd6300c6af1fbd159d29210727d4e2 - -Len = 40904 -Msg = c754eb208677abaac84c9bc8e2e35e232561591dbb50b6c2d239affbfd750905d640de22e90fa08fcd245bb5945f3aa366574dbc68a989ade29011a3a2b6b4ba9b4ab6b8d253d3fb7b4481b05ed0764680ff6a2200821e953f449d0b4341c1855e9bfa490aea4bd718d495200adf18f3bd8237b84b827b602f7cdb9caabd3b4d665a323c5a7e100cedfe206d5e332a9263083ce41052aaf8fb6054be9ed327fcfcb0e7fb88b42b8142e8a9fe2375b30abbb8020f1999b343eb198fdae62b8f7968c59fed5c36a31d5fbab83d204cbc450dbb10a22c009c2b46cf14564b6c7aacf2c0e57aa0ac80ca8b9dd5911f614c2aa139ee03122f6f9756a96c9c953ff17de2ca3e0a1abdcb6f0fb98962e65b6ba1be59259c93cd346e61d01e128c4bfbd47f0a340593128bf333355b193fe32192ad433cd47682f19ab06cb222f739a09912a94ed4d453c8403f39d41cf0a177e5b720bb1285f8b0028ba4b133a0b0e8b4e3ce15dda2278a3d7bef7ad4c13c748222182bc086d4788e39a0a2ac4d59dc0d3aa20f89c836dad22f7dd8a97c5d21523652134542c1522604890df7c7dc838d5f4dc6400c29bfe7a20b7304e7ab843b3df7fb09816544b232877a7bd6e0e61a99f6c26b38a842641dc2d54bcccfa8267d2e6b740a68591a0cc172a0410d0b9d32c58970125a6a31e8c985e8f17092fc3f20eceea7739646da607cced20cfcff70e3a5b963e83f374b490b411e374ca3cbf405df1e2e051fe48b216d4f85c1269c789eacf2f9c95c8e6af0c01dcbdd0569d33faf3840ad8b716be8e5811f60fcfdabfab389361189f853bbcbb5d64d0961e521c6bd529673cb28599f3083e368dda54335ee471ea7d22df4ccadfda496fa51338c750bc9c038e9fc0124595151828e009aead3f89c641f232aceeaeb967e40fd6a28144d5801d65a742448b3a1358dba494582a852f652d14de0452af033d908c69d142a256e18fa61faf8103f3ecaf8acc7fe35afd0ee859dabb5678c6245db099db4690ec6d7642e6c127013e56e422a38eca79d3a1ac882f6e3ac5252abfe9cf09c11fa533a2145433edc0572a1202b5ff707037bfe21648b77002a4d34fae55e732ad35b6ab80c46235afd2c8a1b1705c55cc8dcc318ab30186cfc9908564eafe1bd80278fb1ed3f6af5e35d52ba57f2feaed6a59135bfae6ef6b07f4e9a3eaa90d0e9ffd0954ef4bab29f4b208651ee4b05141e8f0108cc22a92e472f4f1d18256ef62a55eb992fbc9b193e1d066ec1546a6a8ee603ef54dc8a5e39d2fc52c14b9c8ff2473b35b618b73a8071c21632c0e4c03fbdc3da0c43a3289d6029476da8649c9dce0e8a51750ee8584342b20b377cfe773dca32be00fb75ba005e63e4e4cd057411ea00ca7ba90c0dbb0fa81263390d7f8e9f6030bb9a2bd9db240eeda8dfb2bf395affe8d38f8fe803b06210e923d39fd7cbca2b1b8934421802b0529ca38bc66de3ef7225c8573140ad46cc7442391e41d4da76c8cf763de081b1d9672079d0d60f3831185d4e309d8fbe10aa9f2746f344f7db6b74db125b277a4bb15f62279b6542ed55555b2c40dc31a23341865d15a28820ac814a08b07f716f24663011e66d766d84b8656f511f074bb8303cacd177f70e32fdaa68080eff0f663fc9d7dcb03a7b4c8f563ff9dda7d3e175337b4d4aab6da6f0e57a8a5e8cf11ff217c1a7b5f7dd55e115e55fa07b0255175112b1a30c05af62e2865ff681def88500166f04165c48b68aa9adefeaa0bd1e80b8260a829df65c89d4ae5e449e98026e205b26fdc0cd169dd208535c74c093a7b6d40875ff22e5c2aca01f3ff9a970482594a216d18b0a36aa9a533947077dae54e2244df1dc0675555dc0d9b7d0d8766e4200c8572b993d778b77eae139e47cda78e7723cccc68a180cc9799fb741df438bc97a1954cc9a820347d50affd0fb90c0d84da8992de93dd5c2897b06b36deb9a8496e0afaa3513294c638a014a12bedf7f44fcec437b0ce1347011653707b095b98374e43bf671250dfc28e659a9ab0064c0026c1126cc58a796297ad395d8a5f1a99d9a87c6e6201209ad5706a9a049102a80c29ed3c762a1638df09100acf1b2702379978bb842e4f0e2fb58f8e5e20ae83f95f26b4325ac3f046d792e74a28740cd2b722f30b20a1b8c7b577fc2f4da64078e16d489cc4f925599920878dff5816455209896990cf0767e0b267fa709049f5511f8e17d13c4491ee476ffd1869bb1a2aab0321e73d967ad7dd663221e32d191ebbd92607e3da8a17761539fc1f679b7175d4b6ac63d26b0b475b78ea15563eaad0de69f1a653acd54afba722efa873f6f892ba48d847c2eb8ecc3121ad41e0a5ecf235f6fa5c647824a7d725610a2e0ba1b18f5511531cf9224cfd71219ca9606eb92cb036316ba0918e4c6c09e914201fb5b85985a0d3c49042305118b2f39ad487b086108f0ccf2033697f40e1d0e4c113c7bedbad81de57307c39d9214995cd026410efd1d2544f2bd0c7bc60eeca14502ffd59d59196f5bc2394096435e1b6ada9c93a9656e07ccbf4edc302c830a7ff73bda6b59d9eea39d9081ff8231f0fee14179738f4f437b85849fb23e7c8ea76154838da0056a33e0f0e8369abae575815948c5656f01e657d74db60e7e35a589755869f644ebf3d380fea153a001b5030c8606ad7749f57c6f6da362320861b7c4e268233e7acbbd694aa9748b4ca7af81bd9d300e21903e7387e103400ec33369a8f2ee9c1ea3e8d255b6c725cf33cce174f4b6dd939fe30c24d8b94f50b4448d33702006e0639ae4a53112139142a4533472078ca60ab461cbf04b07d41a335809488123c6f31cc7c4801e009aba7d00847feac262b9f99b04918312a4df49f1b4e4d99cdb3bb6a23a0db392f385a010ec832827d095fae157232715c8e9cb81bcaaf0182423af9d8d3f9871a38955aaf4e68964f784fe5c4d0e00bb4622042fa7048e40ab9451e2477d9746b2b0e3f62511d521e06f4f336dbad6a928703b24ff597abc7774e296ef3176b929e0941d066ad405913f338f3f8f718a76bdb7874b117d3390adabe40ec2fe710f03ae47205a4eb914daf3984cf6980436f0c18114945f4eff25f4f22b98f7176c007a9bf94a0ae5712ad7751b5515bf72f1a13ae149e8b4cbc605e8ce1b295249bf40421ba0d130ae16264f3515ae6431a89fd93a9adf0dfc7625ef80b35ccbad2848640ec66b42d5852a4d209f2c9b7cfd0387a7ee0e039b1f9d2fc7c8572aa023d9275822a0c4ed612998665a560b5ad8146bb1ae3b3caea8b6cf2ec2e3162a983cb6831e385eff916c578eadf65dd3211baedf402f6040f9b5f73a09c837546fba371720fab712fd3bb32102d239efc06077ba0db21856fae5d17505ce36259099d39a92af782e8dded4a6c0b445b79d2befc97d8c0cfa938d82661ebcbba6e321b196db1f485b299ce1a54e622c32a0c43d94f984e333acf43595bd5c6ddd519cfa926312d0a2b9be03a716a49468b2728ba3e763450a2d63108b4874f5d4c050d5179250b80a258c61337f442662b97ffe7fb0f1dc85fe223bcf29cdfa9319866bacd0a0a79c554e24d1f10889279e31c0afbdf64daf0779dfe9c62f25204586e3d985cc455f314c7309d4ba65bf4ad1f9bb753a438d31b0246289621e852b986626199a3b5ba2ce776491206433a4a6d02c3f846429620e31c1d92d8ccab2041c1cf4d331988e1b57698e032c8a93fa6e88859e588a83dc2f8e1d5918f5c4112c427e3fce1fdf7c3ca1342a65cc0113fb5aae4ec8b87d634552bfae69104809bf2020a5bbf77b394e92eb5fb802d53a9e27225d5cbc36e89c9326f428222532fc3f40cea0284c9ab4c61c68cc33f7b77f794893bb9d98b65bdcbaf3fc3445d50c26488323bb38e697c52d0e4b674ed2c7d78ab78e638a14abb2e3738e4d8f39165d9e8aefb729671e158819daa6c4d39eca4f937c16f349b49f093b8575eba8436dacabaa2406637240935123f940012bd900ed2ebfbd9e9d2a94148ab44168bbddd8b0fd0ab723baceb87ece67aba6978c038e4b66cf5b8fdcecc6451379c2a5358c5f8f7223ef1f455e6783f9eb08096bc13e7c1111c8b13b79195d997cfe29fe2f820963340fc92fecd5e9b6e96faaffa2c469ca6b2c2cd1a4d57b4f306471bf29df12e6d1cadf13cc90a8a68d25a2cf0feab998c5d12726d3c1463b7e3ca200e13f5302e2698a7a656069d1c07118636e76158407fdcbc06fa667674ecde74ac16973bf5034f1eb1f0dd440689a34442831249419f94029e14c85db8960662330271b2501733dee625e90fa6ee920f9a6e38fd2e30dade9907b499e153d4716963ff33dde6e950b961c4607bba6010a4f54fd464e803a86e3fb5ab7dcacb3a85c7aa20ecf6d22cb230f9d70361902008a4b17f7409c118a44936231c5f5d263e8a0d1a0bdb70bb572ff3e3cc6894862c19285eda2a7577d1a0d0611b75fcbcea37927fc8e957952e9b4d0735540feb85befee305dea37e5cc2ff0619c33c771f5cc4d292c4f9428f1f5fc1eca844a8bc02bfac957add74cc4c2c8295bbaedd54763ea2f7d2d83c1f38c6a430c9e5461570e52bf7a385f39698d356fdc396681ff04a7176b766fa5553fc1ed05d645c58a5f9e1aadd2f835235ae03d07fb59fd87782ce8dd747f5a81d7a9219c73453cc0e885e2d7c4cac75aef719ac447efd2458720aaba6ddc6add1ccce9b9bf7b50626fb020e257fc7776158f8ffb644f87a3f82c66ecaaad5dd3d5cf4c44001088d6bdc7dcb5d0b6cddf94e222949ba3a40795f7235a731bb9c9cc5d53267f2c6c859a711c387a2252fe34135d773410b2db242ae9ec104e0829c71c044584f585d7cd56ea539c658d39bdca488c77c038866e6cc08ac86dd15a8fb4698a56965a35201f4dee7daa06f9f6aeeabcabdbbe703b66b11ce4a19dc4ecce8add3f35740559744ef1661746a7a8684bed1a88cc0153bfc38aac11f3cfa5126d2785fb59b041fcf3449fd4d4a99ba073080af0eba17d20ffbc68e65be384271c4e710f939fa06046d0700a386997fd6bf6c43ba2b883316b9b60475d684fb69f3c4b99aa393e484f7b21e1fb4d64273a9d90907aae2b99120ddc5d82c6cf66fcd75bc324e5e25a152ef980a4bfc9c7e8e7b517faeb3e01f9fb234f5165cce03d09e8b38b0d5641a0d24110bb2690857ebb7dfaaad783102a4e7e4653ae0ecb6ab93c91661860a3f84d42b8c9ea7f0803002e5e12dbc46facec356a0e075cd089cf9d863e6ec929268941a155725ff97fa0116dbb5dc7c587bf90e20cd97f97a43254ba9a77587a316c89f2e728f7fffa826e4f2cc755bbc3aed6d7d58d40c7c2cca954029ad73f21e061d4077311c37d8e8d2ced7f36f969a05170ef896508ec84e37cfe420c1ffecc106f3ebb73ec0facb52b87ef3226817f47d6e437b60429424c5c17d4c1c3d117dfea1369e623b9c43074817d11ea113201303cfefd6081ee2a19d4b9bcd2a2ab166e0fe3321082be443063939aef23a1c7a77d4500c7fc71c6debe59c6f5776ffd22b8921f5a72823a87b69896dabeb4e163317688dfa3b168d15b1ca6d45a4bdb2f99de75aa91f95aa000f4ce56eb53968bdff85d507d97581a366b26165227fabc3730fba7e809eba4cc0e0709b1662f48103347c3920bdde2d4ac0c6367eba0f21cee7afa7e9b37ba9f500c9b18d5f4c14b8f0ee0ebf64051bf492165a28016f9cf82bb4a5b98840b0321a4b528882d1f1874794e8f3eca8e7ea82dc10acca4f8d852834088e61bbf7fe996ffea672289ff4a52b686cdc0c29933f822a8b89117c0c89d840c6f44fd9c11ab20655b1b2889795fbfd9896d149850492e822c27800d4ad0bdef1946ede0ffabc1a14a5f233d6969128f5c18ad0469e98da311ac584a42e3933ace6bb8d51c5e89a71e37a3a4823756b02d08b465e5a1e8104d69cafc179fb0f475f98603d08b217ebdebd0442d933445e38652412c37e7d2caa6fbad31ccb925f6397ef184fc302e11c3d1a8d043545568daaf22a67331f26eab16e4f83259d53973c9279e775fc00006cf55d5105de8a34cf28fbb1f6f7823bf412ad498360d25ef8e2d88c5563b74fef1d5a2c2f8067c244411d301486ad02ba4062dc7f8d4a4f4f68ca8aebca754f160aea121ccb8dba9cc2f56e365d25d3869006b8848339ecb29cb68f9390d8828436b38f48205a824b371ac8b6db7b12bb5a0f6a1ce31f9bd4e722f707774f7ebc391d105c1f6cbdd205f3dc10922b64fb36f36da31d69e108e0964d91be48b8208aad31a32922d1c3c82714fe11a53eb88f494fd192a750c101971fdd0652b34393ea6fc7ce1b4292e61b1fc9ca770465fb776d0303666fbfd29bda43c00bf4a7fd3b27348eb494b1f84638fe3d1f6a95e41451d1b015a237cc2b09507bc300c01f35e473eb9d5cc3774f1d15da1cb5cad196aaa859337ceb66bb29adaa264c2e825143f05523ef29db8c18ab31ed8a775c74b3f14f5e742d2ac2b795db844b45bf23c2446be6e067ad83d818c5105d2ded452a6702e50c7f90d83fb3708b82a83e03cbea8064b4ff55dcb8091403b240fc7e6a642465ca7531722e8109aa96b87797dd5d431bf1737ced54d6af560e631286e063246f228075171089274fdc0904567317147b1a468b3c2b1be785d616b80548fe735f9943e44d62363a09e71c6cb639928510840ae95fa7435cf1bdae656ff090a1b5b311f76ba002b2672c65093d7d7a155ae3134fae55e7804819cc932d73c4201ff48d3718668930c630657252cb1835e8abf206deb372f1f76ee3d9c44ef38eecd2081bda023425c587b020acbf0777184349b7374c60226e4176a1daeec94eaad0352e072f9e21e386b7ac91a5c249884d6cc96e8d49723b260773c7df9fdfd87376e6462b21858ed1fe6ea83bc33da72efdc5daf29991dc8118d8219df1b304305fcd1da158e145edf6ff56dd94b4036c5f250318dae1d0e72d376eb65978ac9b524ad41ebec5973f33d73407c15d0b9a037f8d6c87e2a6cca72a059551913018f1082fffcd93014a277ec636b3894e1cad3dc07a1b24cca639188cc7648d4d4dbe5d77c10fe9f293546e6406f5d94978aed852ae2f28b108359b7ad8fcdd428e0ce351fef03b19af4d1eb3e4f2cd7c427ad79a951e5f02673f2b462694f1ce7e7f12352608f6b4f27 -MD = 7f28550790116649a20517a4cd930792e2c349209d7d2d366481669f - -Len = 41696 -Msg = 7b32391369aa4ca97558095be3c3ec862bd057cef1e32d6237479c81d2d03a3e1abe5480e6e5824cb80b7f4734923876d7572349e5d9d2d8a39ec86cc7d28b412d32fb8acb28e1b6e737cbf2879a18ef2a284fe5b57bb5d8b0511e1ab23203111a54d53a00bb916e6ca49564c524b2788c0d82aa4a11fbeac62a45937c39c9354bed8b976ee6b9fcad1a84a6d4782e9965cc64a18ae3cf964defe6df0b2c063526c4c4a9fbf182e9146140bf9edeb5da1d2e9ed15e385765ad69a8074956e19a15a32979902313bc074072b70a9e6fc41cfbd843ae5abbde4f6034121dfe83ea7f50610e16c595fdf081c297ffff83decafbb9fd638f248a999c31086e6b13b0cc941571731f2f3536ead766674a19b090f5ea096320baeff4e448f126e6ba716337eda891790aeb41445a2c29c85bc3d4b3136f9855a497c90121d62cb7a0b7ae0190bd561b4da77956f2f12dbe6f9efffbdb35e9750b0a7ebc63be6826ec0914baa7b7ac4c21f146ea48be5b777dca7a96ea653dca16ce7ddbb6b2c27bc7f0fd29d99f7a56ae5210c6039a9b3aaecdac4ce9067e9aee6d2c26c4b922fd58f3d117cf7ca87f1b513fb3cc8ed54e2931fce48021932eba6ff56732db70f5c89af94c31561d1091773b794ba1f1fc177dd42856bd64cea35a3f64ab2094ab3e6ddb90a636c350374a6ce027dbd78ca03a9bde14e2d9c1d1b871e6d5917667e3f5e0abd623818936543bb009446f46ebefb8cf6198da516b10f5b55835ff71deb970646a253f01b51d0eb098e5a271212495c3e6e84fc499eb3299dd1515105841f4840a44e502dd2b4ea97dc55657696299824bd9206385d0905a0c37a18e7916d2d45d895cd2d50864645fec743eec2f2cd337743576544777bf8ca58c3168bf74190cfb8ab9c63cb6a6e763e56fd216b67f52c0764531d84f920667bc424ec4401ebea25801d84dae3abd318f32429c9f4f45c5cc17420c809921831b0852aea0aa1c87aef032c5b3e7885e5ccf644b5008b88b1d36af6a729d860390cd9d04fb84ceb175d0fd2c2c74f0f3338d61aa2f75521b53e8a17b8e65dcee02d7564eb9757b2893e7600883aa9ff7fbb56141a55dbc7c547640c53abbcc4d5b70a6154145cbf5f27e84e31f513a729e8f8b991b879eb60a28b3d2df65fe2782deb5dffdbc681f78dc914468316c6d03630839f7bc9ed25b45232ae62c19845f69aa3754a1f7ae0f4baeb4c611daee127900a9a2c467d73117b753b5d8c66dda5baea2aebe23ab9e1103baa1ba2f00b3189a7285679fcd73e498d7b631ace8dbfae8aa73d9911d0d77b9de61f511a8ce8afe1b076defbc09f5ed3e50fe74004a9081d60cbbec0c44c5f8a86e8829f04b15552c8f9dfeadda92df0eea09c5ba0f63a0aedf2cda812a43e7a1313b1edf1202c72e87c075a7d00296d1ee18482012bb6ebb55f40382a939af5010d8987d0c997ba8569efbb3d28f390ec3f4a4393ce21384d7da111aa8ee773d742541d31f219a2264ff39d8c97ff04ed165820d731fb692cba7a94e10ab68f1c6ecbee834e44b2419abd61e9b1be51880338aa5a0b97f6b9a237528c7b8aaf36cf3bac53428b737dd697b8d31ab3df438256308acf99799ad161dafb65d64cbd003db70053605e21803d02e7377236a6104b63e7d2726a46b4849ebc5e2bf0258e3c9f391565eae323f7c0849c6bd0363982a50fd8b53123b81a0e5dd8ee21f6e5d2d56becfea2293e628239ce23346a6a96845126c476d8788caa4e4aaf5aa7937af9f76ebd0c6a3c07b885211aebc93ff1725a6142a3cb6267030c47e222ce13af6d8a0f03922cb941e3e559c56eb9061e0f9a0c9230830233a9263528f2c0d2eab0824274cbf712cb84d8bcb525d06996bc8e8d45a585c47cfd1ab6e643267db7538ead83224ff4ef2bedee5cb9a5e6d5f9a667df8b4a459d8f58219cac65608fd6fd94b12d9dbc374983534e828fea66577020b25a46f23fc07d29de971427febb5dbc715676f52e5e377fed291500c2468a4c808b1266be40e8240e8ba9306e612d796635521c5eea88e8cb05dba66457434faca622ffa37127a4bef2ab266968fb6fe232b5be336ee6126ab12a67e6fa49aea9240f3989e1ca20628470567a4335e487e72847366bdd813eb3a7b1a4bffbee089d2da0cc132e2b8b99cf5d0b807b8bb9bb1033e251ddb9d975ca103808d8823d7a04d20475f22aacaaeeb6b7911aca1a370420c1c17520ad7018001b756e1fda332b29ad9a84a2584074dfe905b2340bd37a8a4f2b225a3d5b080db9863afb4151172431e17426f0e2e8452a4ed03e2128f9dd050f73db0b6f1095bcabbdc9157c4f6e3bfb3f2d091abf92f5ecd36cdc9ff8956deec8079a54c8347f6664edc8ed3a542638442923507135c6605a2490b10d5ff439bd745c84a5668c36defdde5c7e627b3931bfc21c939a3639d31a00048e793280c2a5e4772ea86dad7a5dc8226235c56e763557e79d5cafe9bca18cf3228da3446620a4b4da769e2ac5a208d7bc3a7f58804e6739f4e9ade0954fba153009c10516592fc61f6d884f4f5f22f4b2ed1387fe4f729c40cdbabeeb98f9d35d8a063351d3e81393d9c68b85e9a8f20cba2c6d3edcfc86f77550f53e01dec5f16afd6fa7155035ae57d35007d60d78104e1488c05b87729f7cfb03fb1ecb559249111a94821a94e574394d23a8b2cf7405865b316f85e79f41336ba144621ac680ebb4a8ce89c9cfab62c387d65b809e8cdc64f07d8a6e7d6e74acdf17158df4ced7ce324f303cc359ea6392e34a33f62091368c0a077fb0514947e30b6817a36f8fe7ef88a076672c2a9dd3541152117d4f3072998f83ee962bbd7b95dc40590f5e622f0f4d0f318ebde2d7ad435386ff50e322a085237ea9868e074ae4a09c1addfd8f47b85fb8fe1ec30e5352b0bd3360df4ab37ac6f718042a04af13b0e31e88fa7ec654e043e6c7def5fab2022a95d9852946e2f6ce4e0f21f216dbf9a486e9e97c0fb54988f543670ce7f3c065a335656cdf503b8ad811f65e36bfc376e06b5b05885bf3ee960c1bd1cfaa63e4f80f0073e144fdb322b727b76331d6c0b7a7cfb9c4bb77fb45ac6de2f618752ef0c0d6dd0133b5bdda59268c40d48c187909a7f759463e15908ecd9f1ff06cba19e56916939f1c215b92934b341a6bf4a11b844c9aaebee3e32dcb8481b4c30cf00737af2cf9697412ddce82d165eedbcc47d5382d3782ecca23e831efc8009e0f80b30541d5563cbca558a19d598d4467392b3865832286b1fb9405aebcbdf3c4fc6bc756b54ad1a583c255ec77efa4ee49e6cbf8140648470f5f9e43055384bcd4e253f01bbfd969f38bee63135e93ee04a871395ca6a7d5e9bb5a413459f743948739926b3dba766f25f985ee8297c2f3e0b6cdefac3c0b1537d82dcc399225c5faf6a2464d0b577120f5c95bd4072992100b1a2f6f6b331c45866d2f9b0baff39e09c41f56328983fd71a1ddcb886e69b6fca2ae68bc0a5974e383e0d6ba5e87e0e16c68e1d689221bdba3f6e1922dd565f9ebef30a4ed77367e06827524be0d741c0fb5985dd2d61cc25439be9ad48f7d817a545fcc48d01ac469870ee14aeec8282277b23f030a70941718ab28fed29e21c2903e98c90e92452160fc6691c64d844931f7f07659a7ef71064fb2f949286969055570da8d2d7ed292d63b0f0e74cee886b228c92e332306a504df707dacb6b2364d0af9c64cefd1bf24b53f31fe5684c8793e5802a2dd2c5772f4e0daaba842a58dbda3648106b328508b8edb1ab9a279c5a7cf71678c66a01299c6daa59c9ed5901f63c26a520b70f2249a648a66d63d200b7bf4f1af5a115c34af081b222b38dc86b77a59603f1b71f6ce58adfc747500c009f7e1b46b2db86be5ed7cd78c61fbba2af6eeafb2aa6898b741f5d921a3f06be604b84a0e47cf9617f56b0b16c355f01ac29a9f2a803e70d19b028b425c67658ca5d5ced8020a59b1aa465b7eef83ef1357ddccfb5f7c25a9de54917b00ee538a55dab14ceee10d5f969f470948fdfdb14128a7a97aaa1dac765c7a1023fdbc5b9f279fd160fc475e24e63c6a522ca250f91bbda96430cf561d9aa3c6580de67cec5cf90a0ab49e59efabca06bdb8839efa277d9fceb8b1331e8fbcf1ff97886ab7db4b5b3e9258bf51707e52ce0a07d7becc75e0fc9a79c013bc14179d3308a19c3315499f1e2d1ae4a4a7f31599a5b7d18b2521906e7f89779047cbb368edce03f4d5598ec071e933d8f55c26fff3abbcd419b60c9d48fbb4bcc672d491be2c89810a0f9021dd96a98dd4f26495581ffb47b222d3bf4c9375922ea17355e059977821d045aab6cfc023d55a711279a0f7568cfc783d20fd24a0dedc021e0ad1a83acb5001d393e1124b54f8becfaecb3b7108b78cbf3c753c79658713627431465954e377250b771a650251b0458dfb5227c3c8638e15b8377c413729cbd2d4fc445d1ef82773fe32f13c09f81c8dbdc5fb3cb3af423312a039f070b7a2ad59349c5277174363e306708065f8bd348ef16bd21dc2741b310122f1a84f8f4a1a89c1c360571151c20f836e0a248ff8eb7eea324b4f8c347fc4d7d352440a5fb556452e8f2a19d417b87a536b2e3d715fc906cbe09903257b75b90413477c44a63497024822b551609bf5ef1d582e04685a420d62517164a0ae67024fcc8daf69bf57dd1fb38c501924568f7544ea4871cd1c8544eb4f588ba9326c8c4596e67c20d81d9a6ef766bddc4cb32776eaa4187bf6a1fcd8f5979920cb913d4520804a33c8523cb79efbdb3e29089850a7add8f171121ead1c98559f931ef73dc313705288f97b2fdb85ddc47bee3c84c9dc1fc81c241eca2ce14d6019743eb1f6f68af79aa1da2a45ab5209c5d2a865a9a5796a487671d29ef8ed2cdf2f782424dfd6ad8db9de5965c2b47897645085cf9062529677bc38fb45b15054af2816d505ffeed2cffc1fa462918b50f1c967b433570b76b6627fba5e36750a71e30ca02f6335fa42b7ff8a1165cc9339777deff4e40f7990e91964b8e90561262d67eea2ad1d64b0a66baf45adb6ce79ef5afb5b85d91fb5c48882dc557c092a6bcb490649ffc2a82c065c75d5d4735195613eddb8f2c993896f8d3ee863630d22b927d0a6676487cd324a386aa0224f0e334301f9e70798bc10ec673e35ff3cf69403886eeefaee1e91d0e3f8944bc0be43a05ec5107a53b12f48dba37e4e383bee7493eff0d6297487892f0c4b50652a14df5aa71962532d1cfb02d496c08d774af399c61786e88385eb7ff21fe09ae619387c1c6c8ff5646cab832e3a06bb3d2bf8f06dbd9d99a03f704d569c7ce056e37439918423d91b90a2c33cb2813001f40d3e637d8acb7f06a01da63b75b410e5fb19a2fafe7ca71ba9497caab08a4a4598ea33b1ceec646e03676d977ba488a345a2dd3b503e9b70079c6a8d25389a93347a5b04ea7af4e802c1291aff3042addc5b8cbfc9bd5d30461282d44fb9575f586545d15e05a50736a1455060c5b35827aa5e02db6780defd72521a908b252c8d3180c1aa0af93e078e6eb240f37f54d025adaf05db9ace960254bab83c786d4b7598305ef9661f0dfee1bb2037fb064e44181ec9780fa19869074f073bc5a40b97f8b7dd5f700ca2696af58f11bafefa8c09cca6cb53da8d0ce6420e079163562f2ec2a5bbab998d5456dbde0f23a17d741f531e441bebec647e3e4d2e502da381a6eb588c7d47f75621f8ad8ee9803f82b52ca080ac581f163b9e452ea6658c560d9c6650699a98d578b66e2f613dd93e67c3ddff99a1cd88badc7676f89d6912af404f85f503ea58b7afa04f3f1ca30da3b3171f684b5042589351a5db47d22e188184bbb40654566b3ee48cb7bf4586f564fc7eacc75fb9b13d8729a2f7502ee5da96600b247f65000e9b667f983920d973ee8bbbb8347531455770f42e5b9b73b604f18ee0c3fb1279355afb39f671cc4a6dc5397086fb7535731a435f5cda6eae510e93cdba9f1f1952d8bf06e5e04a631ac98a82bfc2d9a84a9424fcfc82231dfb15de4dcbb78269746e4fa1bff2d05855f743815751faf84e6cfd9983292daf7385b2d39fdaf8e40a9a017ccd2ffa94afdce8ded62f45b00f0341b7b9160abd4afca6117f7fcf0395da990aa60e359298f8df0dc4c1466a0d05a5d9e6ff36d1f1d94c6a132c816296ae5addc303fdfc91c9ba90abae7980b8d28e72953b3e77f8ba0a4fc357cc6b9d93eb58aca7c01d4acdf009e34d5b9ea2f850045c608e39d00d64553887ec991b19bf2deb70388ef48413dc0424690e4bf5bf21a4f5a2720841ef0ccb438e758fae3aafe7e3b3bc4f6a9a79a6da2e6a2439103cf76117db11f60ec8f4010e7b7bc002612a78be4fbc0ff87513c5183cbc60f7c8cc395abf8da8482c5b470935500d9ae43bb5d493cae2b251038bb2f084dbda57bbf4f799cbc72fa9699bfb1dbcd5689b84118342ec716c9fde748b201e283c5c1f1a5b146ce139c2975650af02c5f019bc1236b7913a6bb40d361d35d8c492589e100199d174dafa7d3ca663d24dc5c11c3e8b6c69ac44202846c5bc554f70ef918c97b4a9f097d3738568d69bdb5e344d0cedfbd6559a86b81d313e04075c6391d669df46e304c022e71461dffd3de5c6f3dac057b4b33a252fcc0575bab9572784147448da865303c835a01f31c9580299de747e4842cd07f512dd1aa81c5ccb2c043e1035b10e8ebf492bca0794fd98557562aa9eadb1c903821f737e09d6e524d5875d82f9552c12cb4f70fd2568f0bd1c257d16787af0e1b637109ae6481e04f4da5140e3b97489388594610f0c94374f27564e279b08161bce628d5632ce52eeb1bc0df4bdf0891d88b4f1966afb6a8b02d6b42fa486f72f4fe9d3be298e851fa7fe48a0d51888f6a3432d7006bebd6c227ec71509f62b6d3626fca28ec7122427886f6c91650f307fdf53105226a64f10af256c3dce19521baa6687f5108088aafb00dc755e827778ea20ebfffbcbc057e82d99d287577a5ad4bff2def366b9ccc69b64e37d991828e405874276844c62da6e224aaa4c428e464767bed82b33e76bad9a8e4a99bf0a6d8f66dc5f666fcbc6559a28bf9e47207fcb5b17475493955a95f1b83e3ac887d71d0f2ffef896ed6c8265df2f93f4bbd18a417ab95935412412ef03d0c2b13bc13ce4afdda14e521d5329e082e3d7baec22bf5bb6dfa5955872f6f39ae825a0ac6d8bfe83f7129459663acf41f47c983013292cb82e70ec5854adfa05018221093d697e8a60702eb13a2d1df54c3fee4dea137045ec03d0b42688a997b55367581b01b24983e38bb53 -MD = 078f1c8cb726ccee15853d9f94d8f6681505175a3b8acb071d5e6c7b - -Len = 42488 -Msg = 55a143004b932f3218460cfcd400530463a7a47cf634673fd564af1c5db0637144809ffc259c58ef38e33f42603fe84d6cd82c969688cce8509056a541894d5c8a9d849e4df6cb0e7077cdb89eaa39a48ffa20aa8a239f8728e6bd315a019668ad5eba8ecd8bd0b8486a7f05952a8e2f5575495fd8eb2746e3d0ab69b10188bc372d0873ad41ae1549241bd24ea52e1645b26f5e8acaae4b0bb4e7f44d726981b07137f6f302af4cfa0e69c6cf046282e8175a4fa8a77abe27fc3a7c363a82de9e910fbea9b51986e48e338a2230729bc40dd1d83869d4c8c00f6ca675431bfc8bf75874d64235ea8d0d3fc54f10a68863fd9ea444fa04915d55451c11737c03fe0adabf83904ba17ff456205c8b45724d4d8759d341524086368d8612b4ec1a80325d48b789a3d242a94043538b9980086755a0ee2606fdc41a0b8b81edb56998d7a8b67a1484a65c96c5d53bf7e8db1eb1d0209c9167f29d6988d465061d19ce6184b2d41938455721ad7f1db67baa1795bf82e56abe449b8bcc09c6e66d52aa39b9e4ce8105d6bbb4bfe800b29a167979eb6dd199531e46e99fd1ac77ec3bb5c50ff36f3234810eb6c4b8ecd28d47cec71d8a69076ea625e9c9d420a0e4fd766e4e88c0150c70da8f8599eafe9b649de61b81b49a5704c0f411bb29499bbf759c3d4ac712d7c8a6a6c731001e0d956f3eadf9ba3b55619f73402ed05a5aaa3bb8a5e28e12dbb4fb655528391b2b04cb379d9a84d3b2e54bcc1ed41cbc69e64f284ef71dfb625a6033f6279adb3dd63939b20d1948b4b74b6973561555109a395600327ab7b2e25d7871d62d478b3641acb3fa8284a40027b0075bc30e97ef82a8833baf2c13757a9d8fdcf9475d4a6cf86908c56dcae7680ba28c2fd0450cb1889eb9c444cf3b400818e206c4fa3a41859ce0eced6d9595e10b91608164194e5d1b54bfe52d5b3622d48f5da4ab2f49bc132afeebd63136990b115e0a3a40e28fc0b5aaf974fde5538a8c05d1b8510a03988d044e4ee4d39d6ab5325410a7f48656848c67ed4bd3040480063169c70ec3f1b105001bd6f554f024e3462d760ca9a4686e17e06a8a9b081469ae05badd65e73f09e8852e2326640679c7dbd6b262740a57f1948592825ff0352fd651fd4f42df19eed615e67b9005fdc160ef6f198c124fdd53c2711fd1bb729b22b5f8ebca383bfa54b2c5bb3ac7761b05e8ca34b5275fc36349b1dc251d28dc320d56a047f379f4492e484e2bf4ecbd12e94c1cb7f18d8b0d43d92025c060d94e829dd580b7dbc4fbb0f79d2b35678fcf1c7b395a1ae31d99d872529749227abe3c57f43e2d6853b3615b0e0232f07883a7e2f3664769614f2f03dc446374a7c9620b6449fd2887b868fb0a77928e6378b206b3a222264077711425f4b46048b81c428d69ce234954ee5ffa53fd4a35f46671dfd75322a058c52e956ee4ed45d39483d766486282cd1b10445e1d2bd740eaaae1cd82656b3b54d8947c9c238662ef56aa0714ec186c16955260973931a467391f4c56f88768469a8ae4840bf4ad58436e15dac9f57908768a21167c2b6705a7031c77e2de27c2fcdf6f43ac75fcf5d38b594102ff3c183c566840fdaed3eb7af3048e2b56c0f087fbe5820ff296ee8d6998f29e20fc6f6e1dffbdc3a02e423d59ce43dcd97af9c2470ee83a54c46cfa709d95a53f03349446ac36d6ebc131759c403dfb4e9f053529b21e3781ce97a0092fd120439790373b38533f75d4e1ac242325939c753b690a98cb0e63fc96099a154e161601abde636bbb0528af7a69593ea2a9ad45c4e5538998c5e19592bd8d18b58f9f89ac11260c1730ea992335a35b5d476856c8316a4d2c66e2e3b2424800ae93c676bc58ece50ec9a5dc04976a40fd74b5f26ed6b9ac31f8502c1f223595e02b7312023c1dbc49d640be461716b62b397c5fde5ba66e4c8412b900e5ba9ef45e8ea3a744215a6f62a388113d0f858f9da5e641489b5a271110d27e1141e59135ff72d2f961872972b6818c92bd75d0a819cfbf26ff396aa732bfc130313060b6aec7ace1430a1f1061f3e09d894e9762be627f7c3ad3bd4e60c7f0c9f24809eb84ea5d8630adf8438c2434e6d9d78bd47de7aad2b4f0c60f82333365ecf533dc67220c7091365d141f5db1f616d955053fa567b1d45830f1804bb48b87fe869040b8e125cc6ef58902e67f54a91d9cfdeae5df9f04d2a1fd425798c32b2dac0ff8f4052f4b1d69ad1d07c588f86809c567ef3926ac28c13ab09f0a9640484a61751ea016740b60855808ac1b6d8544649f0b9ece32203ab0b36b308a2e180b8fa17ed960b1ff831b9c305b946f3af4e27981361eff83b167310232295d65949f635cd99769c37a76cfc9fa7b6551c148dc98289e7b18d16813ad39fb35f7909ca2ffc842031dec9edb19b359b990559db2999dd60ea93fba42b46d871f95a58b48b0cdeae9d6819ca669acb5d2c055e9e2ccbc4f21fca665a55ff55581097b763cb7101682b6e2771a000d1718a96c345479ae901adbac7223f5f9edc419bb64665cba4e3684b7371e28ff07f3124087f0e89a21630cf9e8a6c0a3d8518e0d5eaee7f31b6d0aa7e59927aa0ecbc479e99e61a98b625736cf1506199d8f2f186bfc9fe2038f0e5b87754635b30888c063462b035581860b2f571083c4e5c6859338cdb09004597b2899cdc87f1224bdfcd08fcf07275f1f1156260ad5bd19fbde4ab9844a35b3aecded048df9526017bc24d5362abbac1b7cf990d6597ef223551aab87b888e39c805932a9a92e0676ab2a455f45a733a67928950ed88f17a5ff91ebe16266b3ee48c5a147170fdc84d2cb2672e052bd690fcb7edad85a5028e595c0b9d038e94c2e19978dcc5eace638edc2998324110c46cb9363e34667540d0f74378b644e5d383d5da34f813c47e5795ffab785f936260e1cd180bb22d381e84d851a54aaca70193bb228e2544de25846bd03dd3b8fb87d614c38214b4a490694c8056ec53ade9678e2e0e7bea03670bf0bf094a0c00300aafb91e1a8646b53902bd51c6656899a5e5afefa41e9e9ab110c0512f0710f803e06156102c7f1b68bd311c557c6790e33430a82a4d004f086e7cac0f349e5e366964c0a201be216cbeb41d05e31b6db40c48ce7b0fc8e2664c5c70470f18c136ad3bd44cc09475d9999eda7444049e7cd060d902d168f37f4cd854731110cf692e4f078cc3827723d059eb1d09a391c223115e7e3c5100a7e288bf2fc506e7625f16d0ce9528a3dff59db56cce78e61866c2a5399b217874afd616b9a56b97a6d24bd6aebfc79a627ba2dfefed1509d43dfd63c1985af969f75901cd3ccf5e9b0a367f89ae0fa95fc521b1130fe88ba9fb3a00a29e5dd1fc7b89f6b6e5a2bad3796f320bea618f2c7492df728163e9fe3101026927aab0a08ed16c235a762ad4a26e9491ef6d8a5d0c7eb19afc27834561daff61bed203fab3c7e88ee5ca2d1317ad2da837644965ff3dedd8caa4061420304e38ee644a7f7ce5d256220f30133bc363db5d163aebcf58dac89759d0eede99856b20c202836cb3e01599c5e2599119bd97cad3dd32ff680ef6ccb9823a0f8f1b54e08bbabae5ba6849b78ea25aca38b16a0b3dbeeff1e400cfe563788a35899692b811e19a9a41f16ef5ba0e9b19a8d5ce88a44e87594546d07bb84263e3018db11204f586dd1301f1eed865af31e2a131dda80a7d98144784fa587e3b9a8f472c78d585242086207f1d7a75eb955e8a3074d9815730c99979dba47a85beab795176f40ed72713b362dc108de4a6a52756e8993198a5eda31baa2cc5e6e1be8aec76f1013443645149d52b3c3ef83edef1a36799a679e8fad6f061eeb38661024a034cfabff7c080a0833aff3f0c9437ad3fd538253f54175828e463902f1b65f6a67859dec6e0b7e350c04589563db7f608628b8948b77f0bbe14b2e13e462c7edaf3bd15331d6d9ed84bbd926793d648a7800247287b986e4a835b4b5689dc4f0b5f82e7cf0f184f843da5dea35f293197be3ae37118f9fc38a0cb22ea5edbe3d20c49eaed1e5e51ef26cce2abd8172d539da3e295382a32230d90fc7c2dd1d9a99a70932fc3866273976132e39726b8557ecbc927219fac741a4b5c8e7f249d0c8aa55519a756edabf02143ed24ee4f3802210b899dd0d7a66738b793eb6aaa754d46b50d32164002d17b9a2af9b47e55a8222e4ee54420547507921ecb0a8e6e62e337acec6b2612abeeaa1fae4fb248d17da5d9908022f8b42670a1c68ac5725be9516b4ebbfc55ffe8f84d8ae6878c2e6216dc381b6bfdb523d7af4671cc0ba8e7a6bac19f3f473df90947383f6a8a1f9dd5a9445c47ede86e3ba9c3462ea4ca6c8c2dfd7b6b50f69d516f3ea0d7ed157f86d33de96343de842123d57e49d840c696375ad70d2dba54655806c15c0fb0858eec9d492a89f8040c9ff590ca00aca4396952389117e9acc9840907637c615e7257dad22a4ad54c62909c141bd85e840a367c2693ba1504d265ede98abdb858b5978f3adee0f6fbd788417eaba9d6c47d114117918ebd0b24800dee4e4e1602ed4e12d9b4f6cd60bff97e47160fb603f6ac4991f6f0521e4464f19c0a981aeb7dce1e4538f6c939a066bae3d7747cb12b49ee0c409964bca68721695c363780ebaa09f3f76b8ac50d52700b6c728b6a7f8cb70d1af47574bf6915dccfb2ec61bb645e6c6ccf82c17b3f45f44174728e67d73d1ac27c04c5137d677cb178a9ec617f9415058d318d6eafa554f314c29b78dbc89bf39a832c37467ebfcdf210af727e33945e3f27a75c060693fdbdec1026ed12271afa81288f56c41c61d9811962c2c550e35fd59db7e4f247cdea5f9af69d824295067f38a020e0290979abb8b6ffb1e11169bbef26bee0c6e024bd8a6c6fa1551e38eddb0e374b5c416cd11be38791bb74e74b0a1d166ab7e0e7567d0cd5e7f5031c4d8e2dfc8e2c962d91a17cfcdd468a43137d0f6de8912cccdad13c62de98e02b2ed083f2f11074367df7f7b21d18de27a5b67237f2c9402fbb258f88edc731dff230b4cd3cbe6811f66dc859a9b8ccef6254fa0711e6a79a77e88acaadf674c5483d14bdc97cee3a8b9183562b9cf314e9c6eb5dbe7fef9781a892aa87ad2555913438772fe2733abe019d3a1b3bcd22ac9adaae50db64a168d45bab1351c01b5dd4947bb875937cfe1c9a77e12bd7b30b2f4c6b91afc332adfa2a4ed99ad1811e9ccd2e2baccb8bdc60ef9225c39f20b612c537c96377d5c188a2f832ded62143db2710d1fe87d1c97d210b51c980061de3b975907cef05341e4a49c7945a767e3e56c653f1650955afc355ed7416ddb2f0bdb76f72b54b862984b5f061baeb1e34b0b11a1bcf7d01974b045179e01205e8366fbedb57132818d6cf55bd8409b43ce9639cd443b74db22c993631684d9738a821172d40f6aa8ad4f8501e525cd0d5554074c14e429a9eec8704411bdad740a75e00df0f507dedf3c387ea825ee49c78ea1a596ba998ac0f40341f775456bea888f4671ecb22c0b7a365c8b07a6fd0e8c2f6030856a86809675e23174485f120346a5c0bc13981952a622f5959f331196da064c0c44a516f6edaf25825f59692e2fb3432dd12df20cb0594e957ef2b8f4c91e5118d0f06a5c94313c673260d9506ff7630695f07cf07e88fdd0ee43ebed2630a771b56e641092efdeea687c4ab331f9881106eba04535376c0e952c92ca16c4b6df9c27ed590e7174d5a9b5a29d9b421b14cd25475500ef02171bb895d4c363e52a2d24eb81304064ee9f14ca57d55982d891a65766053627b229ecdc5055949e190f6c48ce22e318fef0a0aa2908c62725fb77bac16c9743a967d25089f4e04975eb07ea8909e2f6cc44622a5a5c1270c3b39f56ae5e97bec27c71d7c6c6ce4c0668febbf910c6682244603334f8c4c7796026157403c001c611d15a4ef6e610942f58a1685c16d5c697a4abfd05649310aa15dd5d8299727ccdfbc26aaab0fde7e71d861c185aa581e6367cfeaa7b3c513b7398af03aa7aae59f6f5620bb57cc63956515e6a1b3f1bd91c8c7f10902a01b8482db3b07c82225ccadd7e407cf3fbcd0aea767adf0d5c1760c5c85e2bc4ebcc9c84b1af96f0a17f806106718dcb4c4a4139ac7131760c490a0d20bdd474d61d7885f128802df36a1f6841c8716d82590325487796e2f216204ed15514a28953e318ba44c3a2e0c4afdc786aaf3f65a1599891b398b9d727ac6f214d72b4cd17e625562ae6b6303539a4f382cfabbccb4a7ad04ebe648323b55859ce77136a1188940b0471d0aa67c3a8fa365a18517edfb14e709049beb344f1c0ffa92728e8d14d22f7ed5a18ff58d0d5aed7eeea631f26503f97d1507f6022a0099358cf44c938e22de1bb40a8fd04cb13ce94502112c121e65a64002e11d33f13ba0f26cf793e95ced55bea08bc2c258dc7744b61c06b088b626b97695fece746a8b2f62ee845810151a2e0c79c302c434bf5a2cb320a4c57354cded75355decae4ab070c1e36f0efdef8e98ea6f8255ee17f1f066f8736715d719a21f4f66cc6f660210f24fa28c003c5cc05e06c5b05127a88bb7fcb0e01624096ee4bb7db62673b0cdf0177729b497152d354751561654ea6916bbd1c31ca2399e75e8171c8bda28f25bd9715a8376443a00af99a9a626441313a44a7271f816ab4373a781d83ff748961415b115506671608e133d791222142f44af90be8c2d2fcdecc368c3eb981b2f45d8afb2bc085db581628407bf10d6da2b65806ae4d9967591df43a78387f497ed2eb9042f86797027fc1ffa73ace5a4a700d40f88c879fb217f952b8e435f5088ac6f82117d3f30c0346399d632cb0f75f5fe04ee66349f1a18ffa87256d5f986c635b50869296808cfe19e6d6ef18ae6d980e38c3f7101ca2fc5a6c63ed2f396009e058ac6c2a650132c409f9df397981fff43f8b09993d04899cef067e0cf04e01afc0f02854c4492a658e36c4bc5f83dbb7eaa7628f5bae7ee59876e89ec71e94f110bc90bea44e2e22fef46548695c7582c27dca987f882360f01bf38ec5b807ced1776a100df78623e09a8b869df2157b4e76095cb07abf327e5e6784f205a56d8a887ff1082c7991bc92fe1d052e02ca16fae685f66c9c86caa50b2757ebb5f7c359970a9bd550941b4386b6a9f88698a2722ab8594600825d59a820fb537e9304517a03d1db54538315ebf98f39e70d7b449d9fe2f0344ebee30616e726496ad6d8ef83af24caf77f70f48dc1d76e5028da07e29852801375a9edb2214a5ea4c056bf323f99fda794bc6b1b47bc638a319b302984552bf90b15259cb3a905684b33b2ba8822348c4c61164a27ce0ee21feee01bacdf7f27078e757ba42a86defdd890c092a8b6ce2ec7bdc36bf7b681783dde601ad9c2c6f17ba7f8fdb4282f61ab21ef6611cc94c2572a2e1b1ea58ec7eff3a1d62c3d -MD = 825362c8fbb680c9485933a84e343eeb488634cbc9e55b020c93b369 - -Len = 43280 -Msg = 6c49f1ac16f820b4845c2a307a7a13ea2d00e29cfa29f5fb58e197f40c2ad5369cbe8df005f5c7dcb0ea487ca3d965a4f5cc163884774b37ea6083f8ac439ab4b5b4e2450306762da16ccbdad55e88299a3e9828503c7d20b377e7d30a648502a0741b3278f1d5b03d29dbd378cf2581069e91f4c83f32be9c6deb0b8c573d2746465e40cc7f8b6c6d6b9eeef4f5e3b51f342825534a131a8d8cb92a9ce36b2b8e71d3f5687841691a783fb3b1986bcbcf4786425823c83b6f1a76b8a1cfb7175f3fa4dcb2a49eb02a9ae4aa188064cefc21d2d34193f82a28604d3b03e4c8f2a3f6f67a13cb4b488716b65c8f7477c39008356175624beda2a6643d29ea47c441dff459f4b4ef391737dc507f3e4cb47245d7735c586b8ec334e3457da9db952142c300bb28338cc4447e0e51a48aa88a20df915e3dfd147551f3dc66e82d6e2b678ef7d2efbf487484c61f6b6fdaa8c0e07543e3d8ac889f46bc884c71e55647957bc79fd13a751140da0a3767e3bbfccfc31253f21df1295c65d4970aaa565d16b2f78c964c1c82c1e2571b534ee92633ee851653fb57fad81645b07c247555305c0fff059e44af4c078f81fcc23a2655212594c3ecc3fc05f965fd8efcbb172ca19762e7d8f5802c7039d02be8b7e47d8278360a983b162a33bbe70ada308b52a8181c04a237dda747dd70a6686749f3390862efa9ca308eefcfd7b665dd9ae99a1a9524a213ae07b103c935e9533bfe6f5d813cc475337a532a335c46c92a3b9e23350f8390db92d83443a21381a3e74cfdfcb793460536875364c225fc248eddbd648cebb74c91e4f746b48ffb6af7f7723929be448f0ab4d2d3b1a87f712b7f6f8a65838fea4bfdd53a3205c976739944a259ed77b93e0230e7f07a59f75aabc10f60f2209b0a495587e51cf1b1a659f99e11c7e86c1998f407494192a062893c5b46e0724814f3ff95957d7d02d7601b9417f49e8ee49fa69d82a633538d4267d6def78edab3215bcc09d074504dd532ee341da108e83ecf10645043f821fecbe9f2dc7b372cfcf2950bbcdf8551e1c41330eafac36a9ef6c8b7e8ca7667e4eefa483a4149caab4b5661e9c5882bac5b6bd302b0a6b5e6a32d4315d1b7a71d5a73aab7e9f6d456ee78d4002e41235d7e5ee50ecb98103f5ea7cf805ea229d097badefb7928912764642ca92398811db6542db55483c2d1b09e25d07c1f34262b39acaffcc64a443481318baa758c1389b574a0524e14c3207a0bae30161147a056de7b77b848d5e636ab4fcec08d6881e98276cde14e3e37a34ac2846f095a7e7b3a06f4e6d00303ed619c9461cc4326581fe0ce24b8697b81aab37f1262884b0f8af97a382df5120d1c1b064091cdff6b13865bff996d767cf22a29e864f8917a94fb1296a5d59bfea4742b46242d9488250f7f5a3b71b0fdecce8bd759d3d72321b5c3e882c82627c14e0b59cc8c6d191f243f1de49eb06a5e48acc88740a674f8cf95160af83cf23b51af62d3121384c76ca530dd1cfe2d113f95a4376885d4e3f09008868d64c6d9261e4a7fe60d33e690b87b6e1222accd5c4c51b272fcaba8c0bda63daf270b647560f71931e38c433780e6dea8a4515947dbb93d87936210e923d979840c2aa5e57e53e81a1ef9a80a065a77080d837fa749c223cfd35fe310ca8780379b89611f7f4536ca45e0dbb051bd7f57e5a905249f56aa71430be9e0bb999cee5c9163cb6bb44969e0aba5d269f93fc0b22db467e45c1c966ccee9fefdf812d1d8aa72904b8a6b1e77c1ce1857f4ff69fe76541820bcbf65d411ad15988a2d0a963d551626aee111938a1e292298077a50ecaddf5c5edc07053afbcb953934be1eb0d5060408f66bbb6e5daed2cb9e1c31f786629f2abaa387b39cc8fbec6e18f96dba08ed80f15478d5524e70770d7628ffa94cf108a362e0e258b5d28b243daedaccc3eafe19f35127c6b203839db2bd6cdc435ae0dd6c9a31f63a23fd9f58c561d2e0026ab871cecc818293d793f578a6e8efe39ab1e83c0740fef52c248fc76996063eac14f5772d4b65295b3a6ae21595fa931e67fe4fcbfcaa50fffe0a3b59dedea4ac75a8d5b0ec03cbf7d9368222aa09735447d85ae7f3e53c5e73f2a99b73103f5325b26fbe2b058493b784e033f1c78924999be5c2ed58c231cd6f99961d4314876b3acdc0d11359171d7a85b230d9df77a47279c4b2abe96052a894b2a31f2d318e68781ca6d4546b5340f80530ea7d33b1839d550985bad44bc62157cf4e913ad765f73c72f17c77a1ffc196b9a0694208f6d9ddbb8e3b73fff0c9ed677548888e59d286fd11d9244fdf69cb93a3ad8af1f4b5c4916f7626b84f13dc343f5b05fb6c92640fdd7458a407770e859c51f5b4a5ba7250d073d6bc0b878dfe51d19765c4be3d6ffd54fce9a073c658335b6a98306f50c3583969554bad668d56b228168cde78e61881f967d1e65ad40fd5d0e6bd5cc4b1b0d0c9c8370ed0a8f4069f54ea7b7f3cd6043563c35734c1d9c611e7760a37e18040dc60f9313419d3d6e468061cb939e1e49a289d4ebbe7383714e08100121c6f918c64b69ef8a69c29df9a09498ea4de290ffd8853570ed52fc11c06c6bb2a25ccbf1b99de8618f70878311b8a664778dc7b29acef70fd57b600e22ee59cd34bf95fcec77844368b7a97776368a9e85504c8f530a96e7d67d4b97920e41bdf891e53c66bf49cca018724b20a6abf501da9dda93d0aba56ad92d42a054ba21586458348abdbf59a0037072b3719114779d3a28dfa99ba50d0f7393d05a3983eeb75d79fafb4b6703193282a13fb0595118bffe890ded732790cd1fa477365225fb73712a00749123ca26ff6c69a04018cd8dc04266179c64fd882a8f44370898b128be8a65d1548c86dc5d9777e775492c32127e5ab09d2fb633591339c233b168ebb6ae83c82dc7dfa10194f2dc456cd53b69af543ed1f24b5d3fb2d04e5ffa933afe08f2ff89405533aff753155cfe29083a57db18f7573d7422f0a051f9fec0a5092c2bbdf3a058029d3111290877c82718fa57e569c90d06c75f12737e1861a84c7aa6a9f942887c7dd4d56df46413266a29731a95b22a837140af1968e206b34c86fc3a06b1372fa644f87a9d3d9a74b247852f27bd1678d567eeba46e610649de384e4b867149acb23f2c55f7ede9095e736998c547165581759dc948f2f2a94f2d9406afe812c40d46ce4d7a25018698adff03fe29bd77de16906ee57a373e63781c3aac20d72abe8cf4f82428f6ac1a519b9af12262dab58a4bf90ea2deee643e6e5046c39fc60d3826bebc9fd0622b85c6c765d80f684ef956d48912eea398aa13ae457673804172ed070c31988f147107f221f3cb08f08a3a651e716f4449e192be71e35a40a464cf3bda87551d1e3fe681ee1c9fa2e5657e1697686ab9bd0e73e792b25cee7c3356c2ef480ff38e14ebdd94fb911f73b3aa4ebb9ee5ea3c573f906f8b8172120a0a05131dcef9af1b9f6edb37ac65e39c477451bcebbf10e47d23d114d2b4ae0f726a0dae9b17c879899c8b78f55d7d47dcf22269812080deb50780f8569c986a165aa7a27d35205932d06b6876ef88ddf12ff64eb1f5d36d70a444dd151317447e3ea7a27d3b00e1207044ad36044e850e939412822652b83462e56c18ff74c5337cd655a211b039dde6deef3d821568bc86c65efd9b45e88ca92a4c664af814bc7efc64f4a0788af19801d7945326ad827052da283cf424fde1dc2507dae85aa1aae1767bcea0fce2f0750c425dc97de9b9012d0df2a6951172c3a104998fbe6b6a4c3440846fb63a5401374f8a450078c99b00b4a3a4634fc4a766646d3469a12507454aab2ee1802e6f00c4c0e45db709e8fa233837b53f3f501c2f401e82cb42d853a12926a43de5850ea8e9ecbd2edfb0c4649aa5b36a4c866c6ef99632712b88034ee89c28f8e10c0a03eca64766b4ba057faf3687575110fe2880e4a11c47dfff58cedb94398acb9bddb15a24e6f1cf667a6134568eb8b77965bd50f653fea4efc7c52a1189488c6a3f20507b36fcb78f5f97e54b98e743852d98225a9fb8a17aa4b4d0c76e83151f3021cf75df3f3a273639938bfc487ccb89f9a1f487dd9c49f68216dd72a32f61b99c203a68201fd7052e8441424129f380c816ed93d55e04c519447c1d10a2d8e1798cf159093046d6600093f33c14a51bedc96c4b09af521960a2cbf632362db0a059c33b61331cb0b651a996a003886150029a38df56dbfb3f77f38572b3082ef9cfd79490f1039c18beacb3d5bf445ad9099ee1c01d48729e0d1b5236e010646d3856effe32a1a06e8ec4d34310820e7125a1ce15ca418765aa6ce6e786ee59e2da67d113be9ec7a00a187d52bdea86fea0cb8844266d417c970ec8ee6d4a1541ff33c4375ca316977ad1396a9023c969c04396b7f975a8cc1c2880b15dcaa173ede14fd2d658973926168ff34fd6df9bce3280d40b00c43b80e2979a1e19045fec9afb4cf264516f55100855c3aad17b11bfcf0523b79eb20d65941077dd46ec46864e0d79704c2250e72bf8b448a6f0d3130ab10b423d1a09d9ff7a32bf700441ccd27d3223913860c28044ea5766e45a55b93f8948a959bd6661421566898e27950f04e726279bcbc990a22c80193ef0ae65196671eb59713240cfe97b99713e088c0b5e201631d926e278436bc8e6db4695a669670a006d68278975a5a997cf4ed1f860ba67e4d4feff2ff8bf7bc36344d14e5ccf0e38f82e9bd8838dbfe7218e6635b59c219a027c6d30112438bfd2d1a179055400e85bac2624d9dae6497ef1d428256d4c3dadc5b6e2564409c16e148e8f2e9ce7f8df0c4fd5403523a52c9fa23b78d5f1b41b0461ac91c4f5b281361ff89d4fcb4fc9739e53804680e374bf58d5757e16e7945ff7f8884f0478515edd1d1b16b4d7640b9c0761b404ec9e797e5de60dc6be62feff2d048b3ffc27b54e646f99ab77f7fcd057ab28b7a6f2f79d3d912d0621cc0a01b2cd20ad264a63fc36637fb717c96ec3ac2549a2fab85e3cdc3e84e0f819ab86f1abb757df048f6ffcbd70e19f2388fb6f99c0ccd037d9e4a2b7ba5b2b9208155166f8430d9b612d1c461630f84d720206cd343e11b88d1cf7c3787fa27f4a363ac58a7b995802c000c616ac088f5560db894efea383a56c4329665546289871149216076c839ab00e051b5db831599b5497b61670e0475ceeb22be4fdd41b4f489343ed6d645083b0cacb4cf17aa53ddbbe138d5f179c7560266f35b0ccfb573c91ba3783424dc34ddece8099b462ced7c50d6c576fcb3e024ddc4e48595f12595322ed9867b9f74c0acd019925b7d4b0754dba4231fc403aee1839abc16f0607a324159319bba8171470d8da15cdd9cd967b7f07a6590171d3cbfec34c55bdaf4768b95ba17b5d15c45e0c43cecb6498f03fc48e13070b10c29ea3764436bfb70895e0da47229eaee440a5bb97dafe784a3f90bfc331e67d843832aeef3d9289ae5393f752d8f44a3abdac2cb7222dd56d26eb82fdfd1822e143b252978fc08b014cd99a0cc4e551907e287d77ca7c18229addbf08932b66a0642c4a8257d127c925baabbb0ffb2bac2a21961ffb70a72f436f5e2d1ca7b08b45a77ef8bb4bc4cd893e13a8e0be41566a9f5ff7dc93eb5ccba847b4c0126a688e2bd643e3b8c9d61e6eb81b60b5f958e6abc046966c4c73d79162e5a6f6fb00e7c13aaaf89fa0ac8c51835bb768bc79454ca1565083333a12309807f7dacb1bf66f92742289b0177cef5cb20c5ff380308bea6d3361067b218fcf64da474281663fc6ea88fd61df96512c66872304364e6e83d4678d2efcafb6f04278c4c8f9dd39be5453831bcb817ed9c0523b5963480054d3138f148662abe4eaf9d9c54c036462faaaa346a4e67e4d08922f58cfc54645b15ff01fe0e27891a4840ea14282c89b23b6e64a326c5a6e8672886b416e4a3fb87437b6d4d825e1b841ecc4a3ff6d4f189fd3903dbc19268218cdf982eb13282e7aec4328ecb8bb6d59fa9637255c67228cf37e8d7dc35c43ac866a5be3a9ea5c98982da5c53b060cf4c080c6999ccc87a5cc7de95861f812573b2591fe156b8af7c2dc130cb5acdd39c7e8170635648f14e8f61bf5fae137407594efe55e9500bff2b83a682f9428519637f312301984fecf4fe9fb9601fa91bb1e3c408c4e0517b029e182b0a63564b6d6226594d2ac8e07f21c133d3fa26f962b3fb6a880e2278597d20140ca4b99ad2b6ca8697751e91a457ce4f88379048d23c1f0b812e018f86ad38ee7e8b41805a09983b7efb93a90b2d017ceb5c578286f8a96c7ec4512920aadd1aee8b60a459c709d87242ca7ef9fe253c8becff3ef75624fdaf6593cd9df28719cb29a97f687ba9fe0fdf458c1767841ed84df9c6b9e11c3fb1866bf57520b17ba2fa8e69fc83f30cb6258768d9e5b8845f03d9b23525e9b313ab2c394c9206a0f452720c8c9c7f94f3b9f29dc7f53d1d8ea30199ffa137f8544866f17ad2d13a3dd616cfaf11aa274701298358127c4af5b013e68fcf616fd1e2aeb6867fbb97ee09cf3bba8ffd242eaf9ec200ca108d129f93105c2d009a4b0e6600f5d5205a93421dc96564031c28f9c4c25888746463e5e1bfeb268ff7fe302f694f9f99f2bc338501063a368fb4842e1cd5da22517807823dc3688a1989dc5d480a2ba2e0c732877b338f11ff5fe34d39ff3ba4e4bd9917226b5f697f6c779235bbf5b5a542e3b78063bf1fdb997bb4924b39768ea30ef2f64977b88a14a640aabbaa5cd0cdbb77c91d56dab4efd1d6be203001cfd6cdb831f43df1da20cceb2fafa602c3c62e5aadd6e2bd1bc16a262634cbe128a779d96dd23eafd00f70142cfe75422eaab0d2b716ff5160ccc94562ff79af19c387d8f299e64d0c3f244e3b3e94855209d7726d53e91224505396ecc6a59623897c396881c1440f4e4debd2d68066de5226ac49245c79e6fabdbd3c40fc60c687cb6d58405c3f399b718f7c5cc54134221302d2feb613293a5c0ad9f4da89833cf9f71a4c23991bd523aba037dfbef3d830f8834972585b8db3023e38bc6ada278c69570b93ec3659d8c2d70e4c3a8e12e50fd2ab3dd40e635755d1a33e9f4bb60736771539a319b805579936773e6330b3ab698a64f0a259bd684cbacd914886dee0f2ef8148266e3dfc5f46fd5533d0217d806d8448c7ef59ac07f5e5eb611887eb63011765ecfae703a1c65af9506fc2d8efcb1836ef82b0a38bdb140825d9a6d84fd04866fdcc9510092afca5496dfc6fe0399d6579c256e150d0d461f748901a01f3b0d5a971cca3edeb7ee39f6952850a2f803ef71cc0e7ef7da3a365e3f83331e1cd2ca0890221c89e3e2eb2d049bad6236d3df7f06319c0480e26e23a23a6480119f65360ba3c31a9d70134316693dcabb0ecfcebc2097bb670670cc9c705ccf813ad32976935b194c5e5941b1d82762ef7c6667d72496a5f770e461146b4292d46cbde9ba3b0b0f5775642ebf3294b23be44d513d83c14899e770e8f1753f5271fdcb7fbde3fc83287ddd1227bdab4305102c94d885412eb332bf6b1dd47b96c2b5a4f269d356fd263e6bf5d1c2 -MD = fe345afe05c43be99842c395b02e515e02c96cdda43210344f70ca6b - -Len = 44072 -Msg = 3bf13f77155a5d4a56b055b84862e45bb07413e801db0ab2d02b296f886f553f5f5890ea889bcd69aa9402a9922f7e8b25087d2f98d1fa72e3f5c4b5727ad4e11e2cdea75df8260db5969526776b0c20a9adf88544c827baa000dacc2c581b6b62b35037fa3a113b5efd37b75fdd352326a9ac706d873991ef96923a1cd1d1e812370f21c92935fd8d130fe5b24ea29b8345c07a7bd7d900b8fd1489acad9e5d16fe42ed308c3b5a2a1e4637d886fb90a8c95c2bd680af0de37e894043b32cd456501224992cca5b1e670336394de70b7d7daa0ae64a62c3586119e848ac2054b977a74d6bd28b064f366f683d6b0e12e9a8cf9f14fd9b27ffeeeb08256125e629ba28f00e442565a6d3b2574da719b0d794f672c6600143c06d28284197e1918e60be96ea4b41800b85f38bcfcab0ea2c87450c653c3d1e8425f7d10419fc5dceb290c667ae875d67955a8b2d9c7acad1cae4f45a59f6c0315f8189d6ae1f52d2f8c708ed379e06a04b10dfcde52057aea5fcb20c7fd532b163eddb1f1df279827a8ae4e4ac2f83a0ef3d0f196d4999ab5fb5cfe276817bea79644c472f1cd9c67f02e3b4d6e1da4dc908a377fc9e99b14236d24605a3a3c6e90e66b6ac467a8751568cc57d5d1591219a245159c75ea694a8439ff6e3b32cfa12b0d55c1765ab36af677f694b3c533e1b1a0e4d6bf0749e32ab540fe8b203f599b20a0638a11c7735fd4b6151557b69b20b16a0325801a8fd90cf195ba83522caf5be745036c05b0fd58f2e1a6af0ea8781d11ac69d37fa317d77dbe39da9c9ce005a6c082d812c6678b4984c829c09c303a782ccc7fcdbf5f7b41f299a4732cc5b44b7088d4630616c236790a6660e8e1a00a2efdf3a957188eeabd5a6f7a5ed8fe61df75ef6b1293b43638ddd36400f4c4440d5ecd86eceb78d488ecaa1695923a7657da97bf5e56c7b54ec2ff4e86f24db2526f6beaf340cf9befc0d2dc7379fee594375bc45be88350154a4884ed5272d198b06d49fca109bd5c8778307af8c25bff1caa1e8dc16d8336e45dbba6adfa2e4ab220288b94ad9559a108c71eb71b3602fb01228669eccb2e219d37456d3a34d305530b028431c0519e12e4c10d60004a330f74b85a97846572859c3c08b961dbfa446604081cdaeeef152e249437472f851389a60be46b7757b56f1d090e51c03192ce0298e5218c148e179bc417774d41cbe5d20659dcce519b044b069f612a1bbca780af2150b39efc15a915771d0e0976fdcec26e54e4f0a5105859e33c7449208700b337c4ffeeddccdf10eca4fc3cc345eed8a87065a571f7b7ab8030392a7cf0f56dbf1abb94a181904edeab925c3f62d4a18e9b9af0704f0b43ecd8d3301059f1072dbe9120f5f88f17c39d6b0839b8f2c597432f622e7aa5eb8fb2ed0a89466647ea2cfb0439860e143206e0a140ccdbbd39038d6b1aff29eaef4ae11a562ad7889ad263ceeabeafbcb0548db7e322e1e10a692f7bb46109ca920d59dff59bb741a66b55d187f6e689b512dccc9f4fc7e981c090248934c8231e76a1dbe60da81ba3446bccafe344f3b6de584fe397d02f15c659f617eee75ccb13738eb5e50c7ef7f9f000c0f83d934bf38ac25ebfbd3a5cc6e750cef3d9f04e602978d3d666d44b089d2e49aa52d0db1eeec44f1bc183cd6eb2d53ce822860ee94e1ace4649b3e2dccda5c88e0754eaaceeb653309fa3ce1a66e3e0306386831b5bf503b927b675f30bf7bbf7dd68012a1528f9929a12f5465e1d4770ef5a5182cd9822a373246ae7d2a4928c37a2a502fc8cb0b66349c99f12e1d10e58a9e09c3d649999deb63837ac2cfabfc89d4ce40f6207106dc0c1712fc21b7d21ddb6d405fae700acc4744f03014316e2a06f39c8496b352c006368ff3e9551cd7e5ad6c1bb897c7fd795ba81b20a0638649270a1935b99209125e32bc7cd00cdf432f0fb36ff61ca7812e672cfce221c524d2545d066b0edeb8f7c1ffe212ea5e7d5df1cedb7650f2e827f80bafddf00e205c40fa10b20d68816905632401fe7b1c9ed91505fdad0535ac225f417b1a89c32e97955b74d9cef41dc69149878f5fa759912ff4747909f027acd0bba2e66098ae20d9f09bb8399a79cc31598be631a6f8dfc6b0c4fd25a2ff5f08243c9bb82445a56bd60df3d1f9e6deea5df44c1aa2e28c7f42d38182d29c03ac843082bcf15becf615b4d1bd9bcdc6645bac0742227f6004b18b4d4708666067e466e3918659bf20b6769c2608944a485e9a5fd0ae3722fd05d3a89dccc53dde4bc606626ba5e491c03d9a33c6a5333e6ba69eecce729c114792dcaca72163bcc138325529a923f23bf0150d5f6648ed8cb80ac00b9894e97eb22f9b20e29ba74ea4b09247cc46eb307753db5b4153fec8b8ed71ec11d32db21aea93c070ab47fbf2c9424d751323a6ba9dc6409d1a18288e8d2afa452184ebb254bb0d335b46cf0ac28dc30e5443a5a03af698e167e4b2233311bb9d45963262b73c91947549d3d4e69a32fecff235137492ea77000a705d264eb97f090c8e12593dd4f9bffb0d397c9222ad4dd95ffb91c3bfc6ad316a25b00a7c54338e08aa84e75dcb0301871fcb9c198395a02a3edab09e363801a764176d8a858cc3a7127e62b473070649701ce1a1e871ee9fc597820f2f67242f00a49e6d78dc5473338fd5615794b05912b7894144a76bc47810609a19043f0ae39fc6ad97ebe874f30168ece171a7c1efe4bb82ff00c0a33f8c73c85cd5fd41f3500cd0498028b33b1a45de78689489edeb9fea814495440355e22060a303da1afe9960f565bc37f42491bf833f1fb7f6135e03323b91adaab1d62b8e35fce03ef394e505604b08046577156cbfef55f1a620557bac5de81ee9776f4c558e58497526e5e03a7d2f55261d6a9ab0ad6ac5ea0c66c261a1fd4544ec7603c9614c22cd77eaeebbfcb3cdaeab4575da00ff5c284bc1702004f2090c5ec81c5a1ec3b143ae7b97aa6d9c56474a2f6504911b9da704ebeeb22ed15187f4ebfdd06dc6de1ef42143d07bf3d73722afd2f808c670b1606da3dfc8a204ffd76910f3f55c91a870625af6ccbf37c75a4d247c0c08bd8c87d0f66e7a6b0cba2ecabc8b5f8db2274bc944e20808603f1a91c35945ea6c81a09c5129eb3650012294685f526129e4acdb695dd8d639e78c0418575c7366d8d4571bd6c40ab81bdb517e3877e1de27bc22322ee432aa06d52d893df9ac91d94a8bbb3eacf02c52808865de7614ba38a225051fd3239be620947fd5c39bd6cc2bbf9b294cee94ec3ac28519f603a35e876c4bf64db2f4cd93c263e5634a1ef89e7c225f4c0fd832308646b19fb482e293806d7cfce69d04563e9b3680c14fa6cc49b8a75358e16c8b5c106d1b31400cede8d17985c77fd392909190c307521edcaec5ca09d395e272cc4b160f82c324be2ce1b5935d80816f41abbad42310a8f733b1911787dddb0e5f5f7426adf5722dd504f7ccb1895814d8537e5a20708c4561e5c1257ca2a1869cb44f06bcbd3e636aa108d8ca839eaaddf0a2fe035911edbfc725dabbca7a030cb26f57b602cf887322b160b0549c58d9e9ef67d6b58018d6c084df4b3eafad35c29cc2a4ae6ec378eeb80c6ce69a4753a82d3da16b21ed2c39a5db34e787aba14a9dee8da8633c026de583051fe09ed394242a6a633c954b9851777fac4c26d8b43b8579d8f61c9807026e83e9b586e1159bd43b851937bb46505b3374444560663e2c71266f8bc324d574ef2b632706935ce31bb900fc02ac6a2e5829b931c3ca6e8d7b7a15b00a2c283e50cd30a8c9762d0013e7380caa316799f7b2f11189469250a2bc31b4f587c173aeb66532b327d7d329f70a8e3b3c0e4316f7350e3844741debd40bbe0c9d68bc11d049ec4b0c220367d1beaa3b3728d5c0e0cc505a2bda9a60aaebf7d8d7e7c1820226ff198ed539d55d9c8a34897df6fa5500fe76638d7208271987e09b052908344292a515ba1c7a84eb53ad9ad54fce3e17411554554beb31dc95ac52899dac4ee7ce780a97555e2cf5302fd2f88743835a40be66f9ce12b17e49c5653cc475395bdb19d3358b893e00474199ae47610c1124f90143a2849045ccb23ae6476bdbe6e010da5c6704a355c06b57be3731c184144e8df96f49b47a46fb3b4fcd961dd205e686d390d6413cc43574f1feba8bfa394672e4df6a0764de29cf3effffe76574223e64af0702fc7b28580f450550bdba6818cc98ee704dbdc35d7c85ad22e9524c6cd56ca0cddf0ccb6be0b318fa13c03de77942ddd67b0b514fd206a8b4a4caec77ef6ea7892b9fa6162bf1fd6f45734c48b286402337ef5c0c052af987df018bc77a5e2720295e42bfbaa6bc999afa1da1400c1e3ec9916bfce09aa782e122b0c43ee32579216f26d0537b5b5e5c7e385bec7b7f0f791a06872afeba8cf453e4d603a6ab7c5bfadaafbf18e4a8d12626df7c7b6b7e8fb2b515aafd3b8f5ebcae65904fc0111e28e7c6c6245e5e431b6e94b8b6eb735280010e29403172688796d9ae856d20b420d47b2f48d268f88498e16ad106d60bad71da6f6fa41d5ad9249a25f0b991630b2938c42b47ae398a2c305877c58f03608ee144319c777cdde110bd39ac4c74116f644b76c5174d55b3e84b4e2e867fc2de8c702e226a15b854a33d084e3a2f592d668dd0558d7e0cb5700bfe4ca4cafbeb41ba0f3dde6f9506bc6f04a841db0ceba852e2fdf812d8b832603024cf2b323d69ec7cf6b9d09a7dc119d6c14ac15132916153c73e52e04695128cc0f0e9905a6dcc1c54e481ef431c0426a13e2a51888984ccbb48864de601e8b927f04d3cccb323985f47cabde033f89b51035c3478f881f5e0fef64621deac6061b59f5e1ba5b8971fcaf22cda70bdddd883a021874621753e48e9f47d95242877292720cdaa55c29d564363bb3a1a953ea43d403fdc2cf5dd0fa97e848c19ba70332ca86c29c0c1e0d1038b0af8d86b8c507dba27206a1cc6397c0dbe2c52bd54baf81e808cc23bf0257bcb5014bf06c96ea6b7c77ba39300b0abc9b2dd99da2ba8d1ab8f3a23d9d638f34c14f5970ffde6015ea8569e01935a7dd9e808b4b9fee40077239bab4299f4b335de03282d30a0d6d85117240f88213c66e8136c01d456cca9c317221e413f02af37a63a096b836d4d4a28fd65e6ec2e973b68895ab6e67f69f8164f17d7032ae2a546944ab5790de41ceff1aab5a29d95686dd36eab7c60e14800fbd3612771f5b24bff99176affc54ed6c886fd2dcf87f78c12e2bb00b6363e3deefaea932011e61d439e983c8c19684349a3c7740d96702c0d61ee5aca935f35f035772f7e5dc824280040d8fa08f3a03da61a5f9eea5cb48d914d72e41e3551c92c12e3d502e0c97668172691b976546c3affd6ccaa438e5a1adf304bff47f74086c2976b27b672f47d260e9b5579c79e057dc1ddffab213ca5ad7d495f1d901feb90338af5d3896be874795e0384619baf9c081a101ed5fbdabd3f246640852c05829f7894be74a350094d23ec208a2ae16494cb0623125e601960253b373c3079a3c37d2bff9d645eee743237d4aa1543de4b380843402ee0c9c694078a1ff2f2f887e3e21f6a76ba2ad4d30d2929227c1116a83f04c73301d35bb9f1c2953c168bd4f0e2a545a00bc5574e96a66f1a3506de65d2f110356c4105db226605d48d6390ee531995abf9c8e4eaf9d3e4c415c389b5ea8f81fcc81bae44c1fed9830088a5235d04c1602e3a62f15f38f1eac55200e1af68834fbe673d3af71278111703f9d826ec33844f23bba9ef5efc52ecbb2c3048037ff8f62f9a06ec2b4a4679db7654d95c52e2078cd65bd2cc6fc53304f4ecdee8dbbd177aadf0c7d0b7eacf1803e19cd98641fb7c9b4e2f0ab00b42373f5b98a00167ca515e3fb18a27c4c0c387c597ed3768d6fbf2cc2fa129ecc05bf7c79fb257beb6bb953dd1e0029df5e2ec49f41fcd203e11c31bfa184030557903761aa6478984c03a30505ab03d158019b5d8f7b031dbc7f684b7f75f9eaa984bb132053792db6835615580996cc9a2f6516dfe49635724734f8fc7ed0067c0b7bf0f55919f64bc6e1809db26f2b9526b64dbbbfe7e573022c4a90e521c34f92fead821bc79c6c3cd9d93f2bd968c9760384ab7384986f4ec2b2e57f5bab74c9b78b6ee20e8aa853b371c4dc821eb7abd13e178608d8977b7cb452740a49bc0e3b2d04625b3b80b9e2fcc75ad5c7d016a3ec888dc120bc26ded17089aa1865eefe04fb033a4975ce0cdcaf1d60ceb364f01286f16a0b2dbf4d9cb816b78212da74a5ab5b281f080e7593f49a9fcdc2155a329b374ff26cc36d78a1b1cf21335f4371adb0a136a809d1b520690f3f9c9626ef2de60f6109d192f7c5c13d7047ebcf1b6ada322ae63e85b2caff2b8ea365fa8ac78414f18548728c8ceb9ef9e11e9be57b0e6766331b260f4cc36145670359a7e077fd0e5fb670b97f9760186f561e7256e39d632f3e273d3e6c6cfe580ca8c911582422099a0201064b3d767320eb3476e050bc3b060dcf18409b1406d08c60c29b16c70371caf5c97d637e7d1d66ce638b3debd7014e3752e67820f3fd68f18cc76187edcc200a21a49eaaed9a3582955a914c93be6d0886c4809f9fe1b31dd84380cf2907a5b0b7672b865525cc1394c51788e1abeea51c7140fa7b3c1f282dc6011735b2c07bf32bb68b444e9ed3da512d1b514847af9c6335cc166af1b305954efa946c04de5d68bc442b832255ee953e6e53220c8a7f20eb8ee1dcdf30e857d6e3d581f75a5ea4992b8b51eb0c49f7e80c77b7a1c84d10bebd6e203c445e74356d79a2fc728f75f9bbd4497d8964ffa6702f77abeb8ed93bc22bc39d4fc070f6e1e12d98a968534a7fa6c85e3fd812f633fae09f56ace0ff47ab4576d5c6e477fbbca0608171a307e1735ce1a20be853c26a90d0bc2fae55b85d045d58da3555155ca9c87d140bbe7bba75bc5288d64b95eef6f46e9fb7fb9ec1aeb54b62e9fac95188550ef7e3dab8ecb142c3c7734a4908818ef075943d6569a3234ff988f5823bea7ab975c1e923aa8e19685035dc3637def4d439a9b7a6c5700bb91688b1ca6c4ecdff263c6646446ab4d2ab947df80d5dbaac648ee6cd6593f339426fdc2c7303a36271a9ee9b6ae589754215abf8e98c64cb8eaa3753ba8d5e22f5b4c102d0c7bf65e0a0ce9d8e7d2bd2bc4ff2d36ce977c4009245d444dac118b8ee0cf80609668c1b9792b72f9ff06d6299cef20803682862cd8ec984faa07d04721c66a3273d475b14e782bedc9bc7ed89bcef3b68aa6b3db27e9e0b6b90e250e77bf918cfa82a57af198abca17254a5a629258767d30ef9f791ec38ac06cb26c4a809d7513b9779acc539b98d08b63365b03f6caf66761fe3651ead4a66aa0e802d337f6a6c3139b4571a360de34f0f4ece876b9de953282c64bfc9c5550170b077e07159be6a205c6b96a2928691a1d7f0b7f4b1b0089b392d4a2e8b4663e5bc149b4dcda6b4c5eb6f499fb967109387b32ba8996f08f1800b484c2abf33e6299fee7534b9a38307dead7de1096e4cd4826ce7a37af6c3979b2493122413fa8f5634781d7ba8f028363cddb7e1ed4644eaf6427e784479e6697993e019668b43e427d6e6415785d2f2723f9c8520086f49424968cb648d02d2b1eef303be10edd613022dbf11cc8ebfd8041d77a91baa49fb5d10f8e995638367d4e9878d33e388809a62597a3cb1faf8cb991deae89c6 -MD = 35eee77b8adf8f39931ce0264563f68b51b36614d6f44735e155f023 - -Len = 44864 -Msg = a98e234820f0e682240872a79a386b5be663009e53b77045b5cacdab4de901a4ecad0eb25bce9a7cfb3caa7ba96caef7e4f0be32324b23e3bf0319e548f8d33137f3c00a10820d770b046bf60300126f8ebb05676e099876286330fbf23a4b0ed28bc0b605b4475c9e863b806f9b9fab2ce960a5ce98d9e736119c5313587023059b9620030b5114faeaa581b6e55e9306a554541ba1ee1f3236e55773f94a58184ccbaed12f328667592e61a088561064156bdc1dcbdd0564f9916ed9c6e29652c5e6ca39c9f2992ffb6089f5298f088d612ca59cbfb08013832aff0e663fc3fd2f6fdb01819a3799f7c25f7d731265cab21f1760246f7a88fb3874db8269c95fb1ee49f2fe3047ec75dc4c000be60d6330cd9b30a320da0c8a413406c2698ec074ec7bd4e9bfb0719f37b9459c13eaa002bd97d6e4cd88e558cfa757cd46fc6a9ff1db6fe94c5c709b5a0c15cca2e2c8517775188e7d6b5b8c6935984c08faa45b83d08aa7e1323091cdaf38439adf2544849bbf49396db84f98468fe6b86fb5d02cc2efca851afbaa190876aa03c8fd046b7393bf087542c8e24205445d45e625731964fb41fc170dc58197a9e68599b8b4635b95f26c4320d291c30eff637f83e03eb2e21cc0cde4598062e74afd4189e8d5e176ff38017eed9b8eeba6b1c811fc97a1261e4f65545e6fa00d371a3d9f8e30eb0838c2c50bbdc931835b1708f84e8df8704f8f27875bb519c2b5c3d4212edc42f3a4f2d6eec981727f257d895f5f898167b8695ba5d8ba95afcde04f375141aee04bb17e50992c1b870dcb916fb5f102b460c548d55de6dc7c865af60b7ec7f67736e50359b633f2421ae9694fda2e44fe4f8c374073a1b5d0e91711c23dd6e45f6c77ae30a7fcc05954bf592956a90fee8ea4700ea153ea53fc00e88716d63e41f550c7fef4f14c73c336a822afc92a2c24f73b66706441aec9fdc380922fcdc4da5696ea267960397034a0646ff55f5f196ce070673c838958f7e9d5384959912273621dc4fbc25362a287171d97742f76eaa6560e43788bafd4a3af908caa4fd58e75bf56e13b68a169a66242163246425bd73dede2e75dd87e3936236187a7fc8f15f764929320366f456e65da614985a6b94f8d7f99a7dbdbf391782eb9419e5d8bed77769225289eac630e4bc9e347b395b475845710bed518e9185c09c4c3e21fca16f5001c7fdd2268c6d131ba916ab2942d57e7408b53f26589543cd9730518b6ca77a4b04413f0a513d463766ab35a163e6211e04a3cc72e557d1d27b7aec0d81a6447877e2a5f4380bc25c0db76d3622f0b9f98017ae06b033e735796c55d598e24b1493509b56a92f14040eb9b66a188bc570fbaf485451c01051019333860ae1faa9f71983a41d3db7c9da20a5bfbd2dc03ee7c92fee4272d9cfb47de991603befa313bbf38f1cae2a07f08abfa9793d369dc503c926fac2a00bf28afc7a3146768a69a66f5a1ff6f769026668a9e560852823cda8a0e345ff905c48e0c2e6983bea69775ba7afbe8c47503245537a0e585874b542eeb46364f752464aedf8b7bc2db39d4cfa445b753d9a7cba18bfbd1cc958292c62b6a16c9b64f17f6df01b53dea886c7c466542eb621b45b7c2ee34ed51eb7d9af9286731714d912c56539bf67e8c230989e4f353b86678df030277b1658dfbf27b09924d4d27b8986c0a94b73d4ee2bd9449315584904e6176bd00e07970f515d994fde6f3e4768247ad0746cfd592e2901c63b76ea2ae8444aa3842349d544c3c5211c30a8cb23112c45e6cdd2919bea4e6f3421da37f91954e879e3f1bfedfccc936ae3b2854eef3d800f10f536199f92d48be3a9babd0903356be41f2dd16b083d56d2ebe43011270559d0c5a50bdb67ccaf36c9319895ee00b68e32bd838110854c98a5969b29814c5387d46d0710458e1a95c91b10426dd1065cdcdd68f16de1d8af8fead49ad4cb8890920c8fc0b4bf5a7b2a05b8811b3cb7da6e0c161e88f96781fb7f70d78a1965959ef1fa7f2dc6eb615c5ff5f47e9a677176d80f7aea3295aa88b2f47229ac77014bbbfbae294b49e2d0a85cfef07071dc77afb9991a03dfa3a833e3fd2c0b396e38c8f7d02f92f27a376d521329558355f121a8fb910391e7ea50a3db199c3936e6b77377b9548181f11d89d371c0088863ac5204d7a878f1bfb7c89e7af5d2e5c5f5f3274f0653b48e4748a272467dee5fce49575678e15ba8d7c6a9b8aeb3056712fb41690f056c7f692322933f5ff235f5f365b5eb6770361f32af6b0d36203a8cf0688ff4f3243501bdb66d312b2e96b1e4b24e7677f9d81c70f1fab7f890c0c2870f3c5ec9765f8f5ce058b26c0df29091cfb8a09f331f5e2623e03557018a520397f682d4dd5f80a532fe399f2aca009f106d0049c66c32a6a7d3ebfded07ca0ab53727c1b3a5840b10c64d30ef9d904116d40c142e5f5897102e6239adb98910c986b40ca3d1e8132c3953ddc6ddae3c55963a6ad5693e6bdf582eb6de301d9a575d9e0228554b41c7dff3d26b1ad8f55f2bf1ca45fa328977f9b7e1f8dc062be1346c6ebbb01c1b861283cb26c5aef095fde8cf1ab2f3947c8b8447883dc129f9a3959ed862e8f4e989aa34947e7ea28c9485c5ae03e0015f761a5406d5dd38f313b01f08fe2082649ddd8b3ea5e6afc5783f6a8a7d96549341f093ef24c8cd800d326bb7d2513879d7745b8fcc656cb3219c0a3a707502aa978d83bbbb025c030893017f9ff98bbbcf25020262895de8192241289d0a9017bf67aff70918590e9e588ccab798008cdd663b20f8b117d6d7488bef43c5816d5215852b8f7968f527094a23a9ab1b7f8a9e5375ff7b1f01e495670915446b1dd80d8fc3beb3f0794b1bd614f6b140f67f53e78c0755d7ebb98f5ee081f591abb9b63c4a274683ed6306bd091f2915a3f41d53ad80bfd706ceacd0000a57a9898fa6273959bf97d417607b8a93911deab1614484fc47a0e5bc6467021ef92759c263bd1bb67db0cfd0af7e13e487ae5d1fb6269cea5baa0adb4c805140487f7eea658a6bde0f4333174a513f925b6b5d9782764fdb8a66e8d3cbb8681ed4367b7021fba420e2d3a063d771682daab96ec15cc02830426c021e787bc0fb0ac0d1ec3fad5f3fa6f68a3ecd7b1806f43d2325bb70b099123dd913c946f6757ac304c7050be78aba00730092cae9bea64b0d2d151473668830e06c44b6631e92a196891883e7829a95dd71dded37c55f877f400027db390309ba805126b146f0d119bae0c1d9c7d73b3beaf55e9cbb7e670c26e3377271110cc9e895244b8f03f5e0d5043238baee5500d47f8b72f1916e361a54afb3bf40de811d874bac674a748e5fe9517edc4e67eed6d310751827017fc2db1d297400e392878de95e6042d194c416ac36cc8608386aa689fd9fadc56b98ccec4e2fdfa050cf3fa9dbfa6b91769a02aedaec13aa8ff8503486e8a42e6c04c0b98c433bb95e4d12f9afa64338c65a33d5e5bb75c3580876bcab8388a103af4cf18e7eb3831d998e4533e4683be67d20cde1cb2ae72333608ed610e9c1c4f0d810af02d592113d28391345392f698b6fd3599bb17a63e1d42790e146052261e8b378aff06acb906731c8493467b1fd6792a79d9821bc9c182356951bffae8af54675b6b271bf3bd1cbcd50e889725bae9866415d417fdac2eea1acd9f5bbc4944610b78a4b6eb7ee639cfcd4190d2ebb3110476f6e30165b060c990eabecb73c3ef432e65c5c6d1395a1bd757af4df04193fe04d0c7fe746e5f1da3866b3db539d7ab965390af3e7de86134b43cbf51f9d4fdc74a0a1c62d2afbe0d5daa39970ee2eab7545fcc4e1aac48ed3e7f4f97459ba7c84df682b5421755d655c3e7a2aad8a99a51794588786b7909dfbf26498cb2a40ebfd159f828618a0758fd705d76818f4533274375fff09c907e466bef35df9da18ae4c8b0eb5304a64da2fc50d8a545c2e0b1ee9b1802588b025a4712aaeb3a8a9477f867f3b66cbe1bf8b204390b7219425f6d84296855015544e239529e22d0c7d211a4a8516954ac48bb00027cbf504078e9b89ceb3cfa5e4c63ec95bffe7b093c3af072eea472e7d93fcc99c0d371c14689bdd753b57e05b9f3b3db18759444ff9bd2b953c41fb4f565f1689f5883af0f761d4468679632d5b9178c6f30215f615dd2e5497264fbe255f6d5e1f38ff11cd76049f1fb49cde6de9f108dd62d42aba8785e985648a4e938634a4d4e9c6fb5d50c50b818a0be3589d4d03a10bdd524a34d8c0817d3985236c12eac11b2112298abc08367a1ed0ae33c323d86db001677d8d8615e0dbd657697e9c6e4d9bfaa47c4011b905643ad14619f60df8eabc74ba1a86ad2fffc6a216de3636d1a61960ae07b483ac7a66543cb8069c4dfbe80483165ec1cb03ea85ecc834b577cdf2e0b8696d10dfbff7b98003b21dcd42189960f78b0e3286968563a3345480821ba6f3eba80b3fa37373c8a3a50d078bc2a5cc3477bd07066f230415b1be8c50f8261914f1bd1cc34e157f1e3be47d077abc3d63c188b8f1e8e15696193e1bb92ce0705bd6b127ae0c110bba032eae63b53f2cfbe4dbb8d78842d39ae76d8f290e589246c381b0a221f9072d87661c1ee6c113634e408735b1b9f39aa8b7873f2101076c44a9787e142ff9df25053697a3c4a9408a31c48b19c94f1bd9c6645a197c4822e682cf6077384c5588968e7c50cc370a1539c14614f33ea506f4d7084c2ccd0105c82617bfa477171e94942b923a45267bc33df537ca5abc9ced3fd82d850e8d3ec42cf251f7129a5379e823dcb16c2c2a587b26f6b11bc927fa0f385237a53e0e11449ed2a2a765c3d0eb0384a41491ad740949d64a0a6114a5d5a74e970989e029fd6bb6299defec142d294e94c6ed71b078ec5ae7af0b0f9b23a36735a3f74198c7e7710e7ebf38ce2f338f05fba613784a7cf92c622d652469cb50961d0ccec8249097c3b25a46695180ca7a4b421f35ee7a358adc5ea1fc287d8f3add40d452a4059eebe137716034bf85540e47d193d56294856605626cd04877865d39eea2c6a50ae983dd566d593e4445ed2de6fcbfd4aa9e97b8130101aaae1b153e9a32fd0d403f02b271cb3f9b8ba2407adbfade3ecc5909ed30433d12a76bade553adb78ce37ee66d30144835c00ba0a50cf8e10f8e27152b46cdd31ed7fa8fb4a75da6c2790bc7543dd313bb85e49633167148d5749b41e8c2eb643dc44a333301ed1b4c5577fe0dd782129b51bf99bb651e761ef42828bc313670edf0dd20c70fb6b5692d362300b99bd543981f1394954b094aa140320c1e3989adf215d1070d54e5c754e8aec340aadc42dd65ac55137172f6f095e65ef66f0f0c2c96dc7997322cd550e229cbf9198817a635bc736c3c3392567bce2b3631817724d2ab8539f90b21c5c50c816f7279406701dc85fc05dbab677442076a4b817d5f5bb6b071f3f12b1803cf9a0030104bb45c85036f68cbb09811fa6a1ef77f9d50848681bbcd9f5fcc210b6c57fced9802983e5222cf94206cd74fc9a0dfdc459d0fb38f93e0364e56af188ed31381b3c6676118b2c4c5a95a26cabcbc6f3804893fa62076d676554bf09f680e3e5d3d942ca5bd9bc2c089e4a2f3a9ae101368c9a6d6eaf11ad03310a8088e65b7d093e06a74b75a54156090be4317128ceed0c2d7de458f17d4364937ec68862a9c353f9346ac5ae344bbe2eb319b76103adb094514d69d67d2fd5a22a39ccbf110b00659a3f32a1adefa6fac578d455477e601613314c8858ce6d7fac681b3c5ce82d9000532545534ba7b942d930cc436904fce81668cfb42812722ddbde9f3263c2c38f2c0461cf66aab152c1338e9f75848ffa8625733a46adc2d51b7bb13d82a7466f5438bec849982c1bba456202abc8147108eb3b912f27b8cbaf5c3a224fc561c7532a24e7fa5770c84bce111411b9d6752522f061eb669c381fe7028cd2025cbfaf415ad483d1c57ffd36647eb23d1c2c63325a548354b643f486d02112477e81f2e42a36ebec756856e520e8933d2dc14d844110fed84d15b5a06d89177d1132a37d5ab63b92c7ade04310f9bea2525a687e6d3d64d9aad5ea9ca26de98a5bfd4b73b3fb7aaa027323b9fb5a3a52d3203e89a684be4116ac1ce435759158a508712efdaeb01c6fe5a6ada8b30f37f83a560eb38d13f7d7c2d2dfee4816cd367b9d160076e6d05628f188e0ab463809d038735dff6be3353e94f5978f80d3587f589383fc23adff678cb36beae53c4d0c6d226c82ceed7a48ea8ef6f1d751513c280d50e76f9db1c800941119f72d0d147c81a8c045fdec0a5d12d517242e6ad998ec2de0d288b573d3959ae081f29110edfad85ed7fbd5a974e9faa86f54eb7e2d98e38f55545491901dcde68d73212949f3c6078dcf7b50b87c2d4dbeaa1c5571793a9bffead34abc9373d42298058616d638616d612725af3138ae1b184483ebf7f9add9327dc5e161545149498451df0af71482992050e371e2728d86ad33237bea6ce914992b86ee3806096ee7af29f7cbc9d160b0fadca5f2421ddc9d8ba26bd38139796ea334a2e79a6aef77ca7e057b28649c1d4b203331c5d1025db3ef317d93d147455672e528b674b479ca659cd1d84237b06a398567a4b3e135d49233b04bb768666cc81fc50230a538d7672493827317b180af015b86cb5f6c1614db3351f5c2190cbeb88425a5abfb170b058acd002668b40811d7141f654ca0fc90d04c933fa65edd182ec8dbac09b5d9a77e62f04a1c2fce1ca1f6badc1b9bd2b94de497c6548baca88b92db91abd7597337e84b6d1718888a82d3a1aa222e1fc073c20b3e6dbbb4ce622cac4329a614cf7c0819769f98bfc24253deb9a982690c0a8ef69137157bf37c3d56a9cb499124166a634dfdd7fa2ea91f77eff8be3b05daef61a6fbc28b80a26ee2aad9e858dbceb531da79fcc1357fdf7736560b1a13aa8e536500ea6cdb9a6757309aadf25a6a9189055a309c3f8b3ae3750d91909e4413d4b690b3a46e2ccfbd2257bee60bb2a875b6ea9a14b496d9c5946377240e6e25ec81f148bda0224f1d675843bc55709ffcd56f63b0fd6864247aa1e65fcbf16ca4ae6ccf3fd8438e7ee9e565fd9f6a21264a32b2f980c98209110e05c73d959203254971b0805635e88f464b305369d4fcfd7bb076a681db7b40f4fde6cd213c12cfd0559aff24eb6341c21fddd8356085d69284afd7571882ef99f544e15f14d89249a484bd7559f8e7a2068c96966ecabebe582c7c15e12606461667e315c25d57fb85f7221026ae6a2f2ac6f554a6d19b485176fb81dd706e4388d9390ceea9072f217a96bffb8eb0aeb3125d36afa457789914be64b5670dd872224d0c3fc5882d9f958148809ea26ac9f93606324bd896588e2b851114cc4dfcc885dd5db8c43d28d04b745ce828aa9202e88ad6cc08eab56dacae977d93e950554b46f18aa1a7e4b45c0b38742bb539b5db8b4431cdbcd937a8a5f2ac4bf693510610a34309b2fac81cd5bb4891d4e49a77d023821153ec778733c8a9dabaf0421d031aece3a79394f49a8e6e444fbc3a25231cc5bbf815b2b020c27a2a7e8db2fae7ff8d17ced6a14a2158ee2a6ee81c4b4ad704b3f37c728d348729228992280484f92c8c6fec768733c2ce2d7990c8530efb46e18c4a3e8537c0bea925282da3a2b1d32cd2fc9c1498741834b7dec7a33730942d0ba79f00f0143fa99877483f08ce89de3f2f99571815d42671f8a0a58d20f57fb7ba1c66282cb6092ba601407ff9578afdadf7ba7a4d08edef06dbbfd87171bfd9ac3d20a7af2ab126dde00fcfda4318559d3da488c6be707931015bdfcb10d5b9a48a943546a488d1466e12c0185871 -MD = fc2503d7b8baebc96e4af56824ec469b3ad8829aba34c239a776ae91 - -Len = 45656 -Msg = d302a518d7c625756d3e4c8cc2b1d973a19107c945fc04526b88a4e1ab40577b07ea59b9c58c286e7a2e3b8a68e0f13e09ffc861ecb5cf13c0bf5ea0af7304a7ed01c17b90f975c9a20d997b74192ddd3660f1fec518d85ac42abab5ee33494aaace4625e015f5ce0c65ce27916275974f3bec687730086e9e5121ea11880ead69d950815fe98ec4e1bd425665c5b1b67d192067ab02459977bcfc05c07a3b1950ab4855b37c29f5489e5dd09849c980e781f5c30998782177f4b1cfa212b8d487cb946a84d6afa76a8f875cd3f6a53eb6fbd34338f98a4fc580aa1060576d2637c19e887b0006236e1828c4bed52e37110f22b1e12d616b8ae84d90a15243598816cd763f0118b17dc1a8ce00ed4ab521464ad3ab3de7bdedb504160e0920b4a15188fe79e1cb98bf136f434147e2fe0d27b3713f30028c176e366c4f86ee7eabfa39e6d1a909225b95e5ea2be9df5bfe3bc655440e9c22309b4a580bd19300cd9a47f7ee60b9957ad0728d64dd27141c08e94663df9cc55fc4aaa3eaf0f98230b81af9790ec33a434a7ff2942ba4718e18850b44aceabecc72bd1596ed064bfbdc1ab419bb0e59df8d72e264d93cba7df3036d8e7c6e55a02ceb75b4cfa4a5578eaff07770843a7521b5257bf1d936101fc934ea5810d1037b9c8def9fbad66c5741743b350c242e8cae83837a622e70264128ff47b87c1ce63823ec642f2761be38090c108e613258c7c4217dbfeac490d21076514e9c14f527005626ede05f4cfc77920bf337a80c67afff01d8b235e3e3b6f67eba7a1230d2ecd3eedb498d87f586762d21efb831f50ec50e95ceeba9dee028d7e45e3f209fae0bc3e1aa14f98bfd607e01d08c4edba71bacde850d692a57b363b48fc34cf710a8ade74a1b2a27a6f7077b2449eb8042a7e49b21c4ac2fe3412b1357c53c43d84fb4d572cba12f47e4cf78311a914ca914bdb4e837f9554b7735e7fc6d79e9cfaae1936a4ce60da9cfdede4125c6a7a3084011238fd80459ff8b1ac7e48a53bd613b0a7ac58127945e3d979a9215f9f72b749a19f3d1a4d38135920052f7e76a1cca20ea5efbe7d03cf389848a03aa6e276138148c6d9d82a43939efdf490f9d8297be0141dab4240f089e49351a22d0a10fd15a8133572e11a1f5dcb10732203ba9cd0893a9f5598085bc30bae1cae544874e34fbac3b9f7075b00ef3b9b7b9f00933477fed14373671cd8041e00874b5d098ea225eaf9c68bb51cecbe8083149bdda062a307886dad4b882f4a045479ff295c41dd31cefa17dc064611b8c4fedcfa88dbff9890e13b7657ef9a8ea24a8f62f0a1593eb5ec4c2e518dedaabdd8546872364d1af978a21bcbb78805dd478e34d03312482b27993a8316aadcda1b82b5e12413f52e8e61aa5839ab1081fb8c1d7f89a104bb267f7f1f92c1d5a652f8514a080cbdacad0aa081c86c252cc1098b43177dfac2837f6a8b64db1baef915c931646fdaf05f0dacdcf653ba2a52771cef6f1170fda9098b5b1f4f2560787b9c2bcbe5e3961edb1dce45fa56270a6530c8f3042db921be600324a669477b9a389d90d75e1a670371da39b87f9f6344756435be7781680e771817797dd06ce22d0b65eca0d9b207579544269cfff7a54945c9b8f4e2e66a3f1e5a20d9a7b6f3e7f9cd7e62609a672d63e7bd34c532082ae2017c1c5a4752366a8f44e319f43007fd1a05095b8a9371eaa6f4ed8b9cdd98dd8f805453f566eba1094e40c3af36fb69de290c170d2ca37e04661dbfa296217cb65e336c6b18cd366aa57911426930d4ac52f11f9c9350b282795bddedd24354387e400022d869bf1602d2af485756c1f70b4ef1a358080ca3a71e62d9127d086858f0bbb7363f8fbdcf03ea3b71cbc630ca7c29dbeb1800da97dbeafec74cedd886dbfb82b2bd4ca462734ea6590e35fc091f1480dd2f23b9941ae2c97121990b80485c3fce716a7c75b768f37dacb5bb5f9e6e4caeabd9a34461c6b3a0997e73cdfc3a28e9ea6da87136b5ad4015a9e126708389d02cb73a21371357c62322a3d83e21e8a586cabadd77b15e50d7a720063bf0e2c21030d0b3016520524d0a0e27a4bff981d4f62612f0e861107121da776732c224f4db29626718a7e575b92544b650d5ff63a46cda48c7701f60ae82e278c5b259491a86b7ceca58f04ba48ba7e971088ea12a016bd5eae5de24a1bbeff7263ddf9b738b3baee6adf32d50a3d9b4bcfba02c0b86703eaf3ccd4b9fe7e858e0cf485a8aa9669dea217e99420052be8139e452cd6e6fd9910f6d241d99741461e0f414a463b102615de31dfd139b6d6a4dcbb3e42bb33d3cb84e7c9f330bb0360d9338654cb372d8bdd139e6702c27c4a1b6cdf430f2d01ee1e183a95727c2e9bf765451b6d665bccbc96b92887d944cd0361f5230a74893f6b6f7a07850b2d9714df6de44a26189f22c3185df18295f43da16928d38fd58714f3729190f06a1cd6a7e7f789feccceb7a0a44d6746d7887134249b93064b8dc0ac0a7bbbb44bf2e5c79c9c5477df1f2438434212ab735246230dc47162551b18a32b0c30de3ae0ea47731bd017ba5b1190de82193bcf1765750bea96295af7c4dfbb8d14f69eb08d2d53bb2769c34a25b25e56a57e54a27632085629e6c2ea6b68a3469284df28758326c581f263b309a5a906defb6aba2062eb51531ef4bcb547cc7fcf1165114b51d381053c025f6571a9daeb3a7a260b0e9c213c5b5a354c831d80f6249732b69d4237dcce0917e01f441af5c3eaafe03e020e0b245b1dd5247d902d46df555f715b2f2d30dea122b5640d231f241d47f80762e9025f3bfb33d6f99cfea440edd406b021ebebc5d43ef0fc9ed58e38e7469263fd7cce5863b70f016dd44fbc09cf2b04e086974d9ebfd02f8d6d92c7692f8c5b701a113cb8b810f1c55046915b68b271918949ff2742ecee196f979474bcdb9069648eafa03fc111cffbf2878aa983405d7c6ba518ce2c816a640565b1f3684b11e3ae79c3520aa8b05cbb663f9a86b96be86405186c782fa7d44303c8de1bd38f1ed961cbfcd30093fc0af52142a423e4559ce8d023b842f945bb366085dc720c9d78315d42045f9e6145fdd9a9c3c8ef497b15e7fbd4008741d4c521ee946eb0e9f1af242e850ef915d6460ed7cceeb54e695606fcb4b27a4ff67ab5232910a289aea4c5c73e55cda0239869d5a8de5debce71d52f409ff9f8891bc12c85a00b0515d7eb15177b428896bb92aa3de010a9122ffb9b61112dc2f571f00f8e6612e690123c21f9ca7f579576305e753bf60e9d582148fd4e3d37a344e7d62ea9e0b3861b60f2ca88ad948a93ebfa373936a4d7b4ee3ffd9f52dff95c51894cb39cf45fbb009074fef3c8dcd86d846a20f9f3290a0b874a4c94416080d42ed0ca6f3282bac404dd747a7af30e5b07f8396682f9241f28ca9d2ae5417a18cfa13781f359e05355ef31693237fd6088c8cca6d9b0c8d32b67da3d530210c673a942f9c24bf5568b907fe979106c2211c221e080b7bfcf97084af4140d0b8623cf320024c0c074afaaa422d5e62449a9ce7f3d0074d1ba74953678afc832ffe6fb51bda3200a56c824e93bd121ee7e59d430e5df51c53dcbf5e6f0ac9d4fdac415e559c6d49ba3dee6965df229906928bc7affa8b565ffa312a28594f328bec50637fb15423b04fad8f3afc266d2b11e6ea6b3e00877a904d3b25fed318754f2b48fcc19d3b22122e2485ac8417efe43d3fb2b11b1c4e2f6205da542c13244520835f459efc7a161ecdc858c205afaa0d1c38cc21a145382e1ed80180af135edea709a5eff442dbcdef859976c304b3c5144017caa2fa3affea817f9748ed0cc4389e6ae69ef6c3da0e4fe708ec6991f3cc8afc6c9dc7b8660d7936c67cfbcf6f9c801d3979007eb1ae89b9fece48d527895c128dfe5830dedc11bfa4b7ea173f6751355eff1a5ce354c58adf054cedceff35d2a5410624e8eb0d8298861294c20d843badbd9efefd7575e2101dd05c5872cac559126c1512ceaf1848641fa886139ba8cc20f8c55e952d5838646da162a87d530fcee471cadb88f90aee5bc2fa0dfa0520c5c25085485e55ce958f4d6bf4b0044fe329db9fb62dad76617184ac5131c9520886211fe38b43291dbfc0d2ec1571700b86a30fc30f9e0179db5e0b71d56dc685bea77d1b36d90e69799c35f31ff33684957879a6a15332a403df9604577af4b9d6642b43d36fb5053740139e223209fad0cc8bb57555905c8559da7d3a79631157d7b8e2037fd37d935cea61ee9640eac30fb4940e2d912fda7d5740e0d1a828cd82949a29a1d03ef83338e2b79891c0e6b262b6de33bb8a7dba8af3fd2c2a7ca1f54cc0c84e41c5e0637d752fc17309a6753492681085e8d991f41ae1d170697f904ffa61fd8ebed67e26adb9a94b419c9898bb3e4c76e78884110a317a008bb0e42cab79383d6664e3c2f0e7a8a0f543cd1d95b33004f3050160566e8e515fd07151589086d468f624e0e33c580a91066321b68973b697d9aa6083eb76e96268c86c862a51ca4324c1ff091a2ffea18efb43920370124270efa0275acc4f1fe449ccb8b921a5615b4b7bb713a8e3a33805f1bcc3cd9e8f55319d951f16e904dd85f064cf8efc601401f591bb5b50128c13caab3cd4c1db0120b771babf4d9dbefd762ecff215abd9b5eb0d73afca7c05952cc1f13e12b20f2d9c21a05df3670320dc5b5ce3a7c136b7caaedf1ec94c3f1a96a5635207a0d9c8aa49825b50ed3490819ed8ec293c959822ea4030c30f9304a6da15c91723fb72604db3301c9cddbd044dd663f07a80c77234698e4e429bf3cbb48b0bd7c7decb6c92c5848ce26906e30cd7f3b3f782d637319d7fd161d45873e93582bfe91e340ddd3bb1487a612e9c304003da501634f0566e9de309b6b34dcca7d63624143cf271886ec5b140649e7cc12cea00a5742c174f60f986cd94a7f3446ee0e56b4688f43de59b23a1797836bdd75985db0448f8d2519b85836d10e1adc536c98e015fd9bede2f5deebda7e2a88baf5c0175d57f79e83f6262ad271c4661ae2ce6cdd5969db0f8ac92a1ac2513c2520fc349601fb8ad5bca05f53907a0dccdac203c98bf5d068dac37d5f3628203f7fd9aef675e11198718c7a5f5384f9f0bb3a4bdf7c87f3764d948cb2c2f75d8f7b1e2e859cf15a537cb326fba229510eedffec2912676cc04c03fe1a4e051a9d7d955b4c5c738e8e47dd093165b33eaed8d98faf36dd64ce3dd97ba0c29b80f2eb04de529eaed4d239d1cb088468e759e48fdc78d130032989dead4b0601b7152e345ea04beb55a5ba591589e791759679eb7a8cc9a9705899da3923037fe68eafed843c49723892323b8fba76750feeffb312f30890d4e3d495ca309f5d35e6d5f6f830828ba61e0940e0a51a5edee8deb04bb5742d5653a1d6067bc3e2cda407196184dc7ec7d3a830b052b992090c7eaacedbf7c71f2f6a67950b5857d650af1c673e4192c23875d3a9c73c5ab9e24769426d78a756ff960e20e84404777334c8b3689810c0d5d9f1710e8cfe16f3a2b45071de16244c8d944f1b7131d994fee5ed09c940e8333d51b02f8fc647c6f554a0f1135ab19cb6c1c9abc526243b753bbd2abb6a63d907bc0f302ffa75e3a912d9f4febb247a7b5c37a02a2a7ff00191c9d258d6584fa1fa351b53e1c7d327b4a3838783a56b432f40038787123c0ab1bc0987ccf01e71d3ccf7e3c4661dd602a8a596f85ef977008ddbc38306a6f8613cd7309353cde10f79cdc6eb79491dc68d62136474ab7d98c530c86783b7336af1453b74a8e45775e6a4e69e29e066c6fdc2e60d1209bebf910a7d7bb0f52394855a91b717ec3dcebb842a259e6918cb9ecef83c5e9ca23c9972ca06b6ea30a69d1f18a4ca6cfae29f767ac7ff6c9a9d188d2f3880eb92d9846f9752bd1ec36ae49ab982e6ecf6793b80bece747156041408744ba17ff45cfb0acca5ec1842a6ffd55d9b96f4995b37adde802701b3c83a45b0bbe9de318ea54a52486b60172399d8ea35000d4b4f3a02c3263da319b0314ec9d17f92b2372b370f83637ea8a958a94a994cbe741fec895307e1e0f086a22ba9d58c23de1f34d9ec9dfcfa5f00e452630fa3907c91f749776d393fa11034e2360f37171c0d6939d1e05d5da3efe6db1fde2d0acb6e004a189e6d489217907d5ac6a9f8d6cb715ea792af2fdb3f064a645011b4c97db2951ce3a6832c625d03fb44094d731ff65054fc19f671b8eba91cab7816df88b2316d840c79d7bb447d03cf809f5bd29d18c266c43ccc223eff2e3889b97355ab26f1c9c6b1fce8edf259b03675f5ac10bdd717d7885445a655823f6d24efae437d92fafdb301b2ff6ae52f5257ab74f7477d597b6371e9ccb200084bdfb959223d365ed80850e123ee8f93fdcde4f4f9bf9b72d8548bd5571e90da4c733b1ef16ec73e80374f3d00843f265e6009f2bf2c19ab15e30ad2f0a21aff9867dbc758182ce21cc8688d3f37dd2e9e978037f196de4c5b9856a83f4486bd5643031afe444d92d544029b870c51f4e4fbb28b3605d49dd1fcd71feb0ebc5dae901ae18cfa1296d332842d810d83c0591307b53682e2e6a096f6fe9d08a426c9d488e2a94063353d1a580cd4415cda2467e87f9a14f06eefee190ffc392762cf9ab4e6fe2028b93b84e50029b0c2896f7fbbaf0ac4e77ee78daa18b1a92b57e86708b433a14968f7f993d128639e165fe4e90e2d99ad5eb0fa0fe26360994f3ac5eb16efcbae8b9600ca467861d9c91e1ddb64ac9b2b5671bdb235bb675a90f03bc5d2daa740694322f228c2b259ead4b2f8792ed249ae525ff9d961c554623052ffb19d3ce54c24e6733fad5f08c1a82ba7145c47f0ad7c674e95fc82710f2290ff7be093867a61d4b653e26fcd96c31152ffde01069c175d183234a798def0802ef84ab20c3c2374212c08ea8fb04dec60005b0874c34acabe79b33ab116bfa7f4ef84a35dda924f1d91c8d938586d4239e07c65236a3e35aa2f1e46a300ba8fba2a366e639cd5ec134cca43afd64b9d4566e81ffad91b26431f20d058e406bfe66f071904ca15d36923b530dc721084eb5c473ee0570825f1105fe2b70acebfe2879fae2aab798d89df32a8a774e480968843cbbf2e2dbb1cc98383a8b93818143aa734bc882aa1d948e8b4f823ee18abb482cc7ea4b36f2c1335bc133a6c51e64fc7b4a2a94f97c325805bb7c857d493a6ac4c0502c2ca89b61d94e0d693f2bf90a635c45611f8ad40a1a6ccab463cb6276a503c9081539c7ae213f8d2d58306c3edbf0ad7984b015ff49b1f14e4d97cfe64e20b951992cb272c414179598d25b1435a5c730b18264b2045994b59324ef541095a5bb20f7f84a527a41248988322510fa27492e884cccea92097cccf92d2a9ce11287253215af3cc09e4c92a88debfe5c420574183a9a6d19d426539b25e4637184584e51771be38593805cd9cac34e5aac07fae8bac4fc4f9924ef71461bd4f57fa0e4dcb91af747a562408275558163c9b35b4049b728a1ad0ac9122a3b91bb68e3914a3826d8756864d6391a2d48063fb9fdd563fb62cea43aa9042ebe0a51e4b2cc1090ba179d410a8674258502b0526e5b0e960c4b150356d7bde02daf4757710dc64f6f353db3b5e9ba34273200b6530b526c6432133ec20da5db15010a55b0ced1c090a1c555197881a27e6665e00a8757338dc847db1e93627beea02943f497d990d8fdc29987ab410ce5105e43f7477397f37e315ccf015a4f14fd12c6aee1342c9299b3f5930a9ee005a06876abd43e163fb45e3855e023c14288553262438810781627fdbe0ef1a85ac702ec8aa62d1acd1b3cf245b8257ed1c27f3b91373bd8d3f38d168b30cfe25ed4bc1a2645b73226034c1f00e1f5d46d4bdf36ce24c5f240a261d46d18a00a8c69f274012b62e8d51d0a132a060b6e5f7523b87ba4bcd948a334bbe61f18ad5de754aeaddfc69b44b8f573339cdca922eebb352c2f970a5686743188cc703 -MD = ab103523d6f3d051bd1d48b3c9370269d9842a611a83bae98e5d4e87 - -Len = 46448 -Msg = 1da80758ca2d0bcf157ccfb41e84930c5e26c95cde96df24ab0559a9857d22f7d70c2427ec2416de5f429516d3ce7721e5425cea5f8f857faebdeacc97d186a925f3f618e6d042c7573efbdd9c1e86f37487b75f6d21a2b954cead98f090ea9df0a7a4b321f93894e4b72690e03e688af43b03436f13dbdb8482cb94f882f5da1e6e57800567a04df0f741b706f4c6ee4ba7671ccf2edaeb261f6c49176e506898913708fbe121f8624472da7809482863130c74f43a47f421eeb73db61da34f47576bd26931639f22e7e1829d45953e22c719d246ffc9fb5f37d5fa3b589597120a1c66b81d0f491728b836dd6f563b720ab7bf2d44090ac742ee0810e5ce49e0f0714d516ecdff2b4e1c7fa05132243a260ec211d3af28415629ed9b8cf76d9b53930e9aeb44c845a337e44eb1d203626145635a72625eb5bcae334617b8092a79a931fd5e1dac4d6d31ed4f58dddfd104852a70eacab30bbda661784cb82775abdc3fe18dffb32cf532220c0efcc17156f5a0bc02902f2b9f390098f5a0ce643054bfae4293e6c883610ceb9ad7b029a1be4ca4845cdafeaa8e9710d81707df523839cb43814c0a5ee63255c615b4e12b07b69136d5bd6a28ceae47bec6d9ce57b035a25870eddad0ea1cb3585fd5813ef967ece2a4df585f20cea56e544c1988e63c9a4b08d2211f95536b195c1cf220bce61b4e7148b198ad7d92b26a68a82dffd51be3f202c5940e5ee7d1b5901a1977bb8843e3015b1b9c467650b036638e26898de7d685b0777ec58d48113ae273526f9988a211403016aeb911cdbd33f281df59205b64c8100c11c745192032747689b8e75780471f433fc3bd6a05fea3385fe5562aa6f7a6e1c9fc92754cf3660b914c26aa57572f4a80fd1c2e17aee774919a50eb532483247593f5ccc60b8f3810bd0e429d5aaa54f9cdf5c2fa29075dfee0d8457437edfe9ef637c6946438268d7267c85a37d688339c12cdb6594a1a2d20b4e010172d97cb8c200cc0e5a8fd90d5f9e396d6fc0fb5d339f85424fad4a6c0ad652fae8b1684bd7746527529e4a14d8b3c5a1f631007d833ebdb745db2f22a8b7cd9e34ea351f1061c50fe01034942e77aadfa55b4b215c84d5330bddd98c416cc179ec068bb909334c46779830f1cd346984f18233df0bfc7c540607c20f816fef0c7278a4902e739b598d98c7c4418482206f58430d3e200388c8fb8132d52b96d47cc3484b0cad12c78694517207e27530734ff1425f7a1b4fb91b9f8ca93a69504f78cf20003a430f171d76819cc8c333a1dbe704ec7514177b0a65739a16d70e7f0ba1d5b5c5bc9ea386af798cc1ecb87f8e6ccb61ab9e8e832a7b9e144b506d8fee78d2a9b9eff4c07244d03448622d70ca2b0c5b880b03460e6a42a442660c06a3bc8d38914dbfd2630f1c3fd6b4010a218a5e3684fa2448288a37c686985857ddd58c0ee6664e6ddb46b41bf762e1c02703278f3cec400e0b83b3f79267d117cf6c557923ca3ef74d944e4514ff3e174d3e0ec22a42050c19cf6db4004514ab2ad95023c3c9e0132c603137d9d9749406936a7bb7abe1d6f5c5bb982ac081a662b5228b6115f0260a430380908233bad59bc1186f7a44d3021f23f0ac6aa68df978330c661eedc469a53babe3a9e9e04ccfa924dc4dcca4d1344d69ff9401b661ab18435d551752cd1f50164d8105c8ee97993d6886e7a0e59d8e608edd01d43dc638bca1492b75a709d75c38d825c90d9c07aeaec6047ba1c36d80e4b6555be0421ad4fc7b98817a0d47ea2fefa8655c357b15198bc189b83e71279bb04ab1fbb74528a95ccd2ad892184cbd683c224d0c79ed3338ad4f7b772fe11e4b707ad28e2e24527d57c62520cef04bb22f8442797ab3865d06517df5f039d6f8551b174f5c54624db6e7f241d271656e110fef24f3f47d898b243243788e703777173c635645635e7904b26dd94c94ec7f29a5678c1c931e9a3c2ae81f7b54993503b4729253c0200ca1081d39ee44bdc87607d999b871bcc20dea4c5b7d0e9e3d4511e5971c2322e04145c88ae31f729b5978f3a34463c4711dd2e8c30008a6fe6fc754db1ae6d7926a1e0822a76f7b56589b3e3f4d13c655e08765cca0cd43d6f86718e4bc95dea18fd344b7c7cf689807c121d43efc42bf0a7a1c0edbe715855353ca3a9dba888c270826b0a0b9aabecb9d46f89677ca3ad02da3d01dc06c58252fe1431acf65c0c44ef683eeb8b25938820622e020bd47e60475d6e2f3e8ddc24de6a4d03f06cdfbfa5cc7fe372ff5b301e7d9a881ac64b0b10a79c7fbeb94df5052c64a93dc2212bcc1e34bcf73f2efbf84836c15082fd495ea3f4943151bc0b9be2dd678666bcce8be7c73ec1eff32fd34b6874560f7a6359dadc353d5b10b0c7142203735e96f10bae9f3179169215da0f996bd375aca128d3bd2c8ae13329b14b9a45abb499db74fb245dc6bdf2f5321b326c70bd7a4af416003fc1ea0cc1820eadf7d770acd6ed57be8a51ebfd1706f79940d5eecba8e42c0b378a7f83bf62e6c3df9e98b6289e48d57fc2a89ac27c2c38afa9108901219c48db8ca7806a785a44c7a936a11ab058d105c0fcb140bc417680942c9b9ed2ee1df5706aeb0cedf29875a05154f44b0f1ae4f3f02bd7efbeba7d4048e9c720abf44bddd0acebe83628b129f2b7fe96f418e4048beed03d2c6e6c526f5bc3335a34a77ce2ac4f92af5a45ef20b280ba8f34cc9bd6e373cd11f91675a6d9dc328345cff5a7d18213e497f798e32dc1df68d4665fd7f207c8f8c3434ff74b5845af8f8bef2704cb925d4891cd43100a2b086278f99804d6556634ba8869998096647aa5136b2e7137a3d3d9354943a3c9f644cb1021ff269de5b445c904ab9c4a2d6ee3087a35bd2c3da29879fcaed4dfbae4274d78cd40c8fcabaabad169f48c8fd30f765d03f796b31b9540653ae596dda85458a7546cfd3481b202d7bccf821411ef071a7e67a08ea89a338acd1d15e6fa19d8b67ef164139e25491f8a775443904c61bb90546f55b06dfa7550c5855d413f76ab311926236acb39afbd322ba4b8ed2c4720082e909bd73c2eac250dcae48fd990572a6bec4e6c78913b492fc0f29c11c715c903c8d0a0a1bbc785d6b64dcea96cd76d5af5b0cfaecdee04871ea41fb74259e01683b990d3268b2d07a9e3c79048992a1cc6f9bd8469bcaa5c47383fc8c0d395904cbd6f7777df64c9290e41342b85a9d8e792fea16f8f85d5c114c4e94a6b2f99a8440438b4aa7444c036033d1d8331b7e1e15aafe64edb1b16a276c4e609f85821b618bbe7d6a39ff5c3d654277b0be13a509953d7e1f555cd481d019f9536f63e7c73ab174a3a03501d82214f55807d7d468237492f1bac6f7080487af7329b87fcddae4dee80975aadcf4b9ff9d6b42f2bde03442294488381683f8118346d859f1e6c90aabf849ad9857b1f4f55adda66755fd1a1aa5091e39d91bbde8397bfcdfd8fe8663df1990a6b58d640479105610ff1f695a3ec22fde7e43032693fbeef44bc5d0a4407dda94a8bccb2f28739837464bde4c846bd390ee1e9fd2c8e086bb99df87e1aedf01ceabb098ea0b8fd346b5e2e776183eafed92fed2515ab27ab25dac0aa07cc5acd139196bd974bd9dcbe875036b6ce31b5117644946cbea3154f1bbe7755cca1228db47a261f6955e333892b090e4d1bc47e60f73079f102130107f8cb4a144f851fcebdb0823afab29309c7d9b3282f94e8930de3836ace0c0146789030cdeb5d9384684506e54fafa5b22d8ceb88f58d17b78e93d4518e68188146ac4d1efe12af8081ccf593dd433329640cff95f617d375832ab2cfcb8e0e606809ea300f0c3c6a132c956b2ad60319743f3776b99be375f38f660c0ce8ab8ae88d4e2ba6b201e9234f2f96c0d1df28660fda54c77f105ee6aa382fd9ddb7a8cd22c3364c6ec8a6bb1c0a3b279a8dfe41633256a62d22d864636f60bad5f96120af8f7987a75749e27b7083e59bd5440d2285a5e00be18d76a255c938383a5ee81bfb1de2c67779a154a796843b81a2d2361c68fd831422234f308fda6f42462d504f4ae231f0deff8ff89b8ce157bf99863fc883fc8542745249dd29e0d9c2f835d32711518a210415abba83f7214469fa35edfcdefa936f93e8d9acf4c77a50b2cfddf68e0deab8cc081df3e4a5d84b7a48feef903cbd1efb55abeb13d3153daf8a93195140e0249d57e96310ac2446eebe23e57c13698970d77c6ea6c73cc7144d720300ecac4f70df495ce3fdd0623ee0866509463fb7dbb774be136996f7c960a23b05d9f6412ee96365c56283a753f64cf79f9fe6b0253eba62c482ccd4b70b4a49c6cf6503bdbd5f061ea1e51e1348a023a6e4077c34b177e21fd98566c49693b6ad96a19c07a366c756839fce671da87286de4924f25bd2c78e386ab6d948a40920f55314f3e3a031d5d059c037bf8c6ba85555af4683f497786522cbdf6aa6ca89b6237468c434cb0350bafa6c7475977211d225177004dd452956aebc44c0824f9fb8c3508f4a1d49ca6b86ec858b7c4dd9698e4f6b2b1e5c4cae655a1e1bb8da79bb09928d0cb00d08146ca13af5a4a276c2f3d5bc91e42796d1fa9f40def4920bd34e1603a00bb8d05cb272dadc97d7b1845b91ab5db60dcf687475f132bedf1fa99bc43c2eb7b3ebeb6246af67db565057cf6b80b81d76be1adcc37b3f9f297be4f7847fdf3a65216a8307ffbffa851be5564b82c9a0ca2c903971242c1ed8e82d6b3e13da1e3539811e9c130b7ccedcd3f819fab9c772e17293663522c4542e2cfeda4148ea8dfdd73aed3374e79859ccbdbd30af1ad4a567f38cf54817051588b840515127d43315dfe2a622c54a5b76ae1f6cd42259401760caaec7a15465eaa1588b1c5c71a4e21563b63c9d4eaa79d228f64f6669792be208a6c6eaa7e5f9c20b36d211ce18e7e558a9eaf80b0e7e32be15496e6d194b812e276e78675e5e223f9c9acf5257cc56a9c8565de94f2dd4ca13eac3cbe91e462577e6d5fd99c0c9dd039d1c652838713e5ba55450342dc2353659ecedae4d38d3de5789cf5bc8c0ceb403836f54d33dffaa0265a8872704e5c7bf7139337f5f21a6e91a476f1e0ef8f7f389d8a446c2d5fc9319590ec2a0c40d43db193f5dc4f715c312cc9c69bb451495b809dd3908a69b80f7cb92a7a0b9520eb1f4998f6e3e750ef9c5a951d09c52129768ca53185ccdf28867da7d0babdc477b320abc65dc0cf1559c5f8054e4fa92ae5e323df9dddb115293b0edea84f517c23a5a8cb2bb2395b0b8869b4f07543c8654dc9fb3130d04dfb8da9f442be3a60c7651a95cc101229181e64dcaeca839a6b0911f4fe4aaf4b73f213a2188ee1be44db6b86bd8f0bf815f463bcb7b3eb196db1968d43afc08608e4d678a83609fcf275364e8e7369407ba6f105d9c5dcbdf3e3c204afc4969640f26cd85047f59576cee52dad61ccaabfa2a7285374faf0840c2f0b912da3e4b2973151df395720385502d498dea89f5873d0a4d345a869948727f2a63f7b09b43fee65738e8115bd8419b3ef3e8f86eca707fbc7bc7781bc01576a4d9e7e7dec78de93dbbc05fe8ce8944bff25e409d298d79daf5deac150f737c305bf40a9b1ce9c5d665678431d0efd2d77193880a0d5aa2b088e64b0f9d543ad5d264415baada232a1c24a7bf443cea8b59d0f93edfa19f451d297c91d280579b2480b6a5d928ab42c93ef018933836e5905dbbc005281ba29ded682416be7c8a3a908e01119a042555fe88c626ab5eecff82f518e9b8bccdee7b364fd1d851abfcdcf4f7baf9d7dba6ac9751645d0aa88e87d0cff1182ad0fa1b0f9b6b947d0552ab0e103c0dcb6da690443fb416e12226b3736c87120eb3a7141b8f4cbba9a0254704d3ff9e89e23bf1b81a809d8b61ad4f0677126c107cdfb081b3dc157c855bf6ffc96c74b8424f191b692fbbb16d0da3b379faefd73589356a8f84699fbbde012778e9560196c94e94b52938fb4f2cf7a0f9a6630ce58decfdacaa81b94a94b0a36adf0e0ce591d94b85d5dc100ef493f57f80905695d31d6391b823733b674a9c27b76280378f0269619d6e99b24bbedb93ef3d5e4c4210c3c6141875953e193935d71b0694ab1016d1e8b83d441bc27abe5b34cc12c40c46d4282766600063a31ea9014505cd4d795e1f80a5cb4be5f9872c3b47ef405b14425a1aefa59771016a93dbe691ddffbb8fa88f784fc3708077cb1b77ec9f43549814b8b76bea8b7c9fff739041c36f03edecad5fd96bab39149e9c0510c70d2f5fbdc867bae1f83c47548fec1c67e57aff53a1026f2bdd4ae90e859964a100cc1ebc13a69a640268e9faf8a12ab1a8484d4635081ceb4fdb7b84a0daee1566545d7b611d145bef280e597658738a02945f2b2f1ae5934a155466b371b80c85eea46179732fae08a63dd9d0b900d83986be6b58dfd40b141ffb1d8705ca6ca7c37cd62551f4469507fee2d06bd8859648f16f7800f03bf522f812e43f2a1f12fa6c422b5f6909de76d9dc3c17037761ff809e5724410b3746d4ac91c7e20b0ebcfd0e544498e02a19572fdd648a98e2d6f45fbcf4d06421b216525844fa1ae531b5a068a989b3c318ff437bfb74ce61f3d31c7117a42cfa8f466eff5f7833dd801f612f35436bef9c5a80de83c903257ea83c3c36c54d0b04ec674fbf663d40d2c0b97191ceeef7cdee4fcda5911e77a0f827e6f93cad9c3a91a5100ccb22544e2211f564322623d246161109d5079f804d4437071036f459bc900af0b0c9621dcccf845777fabad4e73e72569da6e5482efdf60949ce5d88f69004111c1ab166465de612a65106fa5b30b835efe3901d24b9eda6f05f1defc60dc81717fd8b521921e33cc7154d6d2953ab4dd5a6ea29b6e1e2870cd07db7b46f1cabaa5a3609cc85427de02dd854d90e134756d739946cdb9e54a509c508481ec975db19fbb2e7efcd7ffb81efd8f3cbb7ca7a5ec686ce10e9b4c4f23d090b82971cb4222275f2c94ae71ff9d92100f1607f4a23d92665e88a4f6f732de384034d493d5df37b767a8260557de05688e8d60dcd0eba9cb8cc4bceb174dcbd3c0ab5a37db3b6ecfb6a3d90a4f54a9f1117e11e0c08b0114f22f2d98fdd93c0b9fd95d37c0ab2f00701431f1449602525e849570df704adb353481713969a148546b680424c30ad24a75bb6ad616a104bc2d562dac5ff976bc81531448739e0284be053d85f784ed9c44ffd7825b0880c0d4fe77b58e6f8ffe821ce2a99b84c2876daf3452dd2f9aec0e59b7c7e79b4ee327d8df69a04f7f81a3397ceb25e820f2e6e0a919c86d72c03e639c1520fbc7b9727fd5571a0bdddc8153437bb74a764da623dc596db0fdaf5197e508bb8c93ba517dfa0c7017136598d4c6d9d42e6b0e47f36e7021ac941ff4813300fbd03b5c414dadd83703c8c356487793e10657ab38d9d02c78c2fe787399f69c86691715de596168d354665c4628f6288264c4aaf54191bcf766656f7b5cb049cfa9bf7d653bc52cd98b64c6d4e093062cbc4a8409b533c01239916b5843f0875c34bd09926f49a2be1b4c69bf1a0ecb349f51dce2cf36c45daeead2b6ea27d3a07c7830c26e5f58f576a5db314fa9d65e60630c1cda0b483e28da5bf3b9c6cd30f3798991a386be143fe981e7dbf4b5feb1f6a8147021aa3849f86dbb2d7dc2723c497a7cc940409ed98ff44f598fe89a06a527662c2a98e084cd6e69df8d5208a96099d02a2c9ef9d611b8d432dbfcb4c0c7009e588662ab6bb1f48c2aa5fa58ed476e5850ac17b9b8073623125950d38304ca09afb5b60d515e868e993839f75a664e61d73f4962e1e902985288937adfc6fa547c48f19af81bab0dc5b48f488355d0891856b26a063f84c08e0a231f198607eb58b0a3b8a281c8762abb78d0fa9e8b3abe92d143776353182f2e8e34c2da795acf7d5afaf329655422bd652522a8e4f314742493c80cf42bb09633608e3cd50f4b0f75e66c6b0834582af2b98ded544ec46b3acf6a84ce57acb1c106ce15919545f782ff70cf37733584a012bf048fba48f8724af17368489e01a5bbf50d35795ac6109a92de69ad457adba51866cda21cac69badf41486aef165fd4a57c3717f3eb9d6c5511254ef25e24053c9cb4a2a9e79f83a686f53b2 -MD = 1d5c7c600564a3cbcecda0efe08f5d375ee8135a7414b3bf9db6d53e - -Len = 47240 -Msg = edf5557e15473b747a819398c9ac1459ffdb4c97d0072c124a16c723b63d57aabf888147d6b7dacdd44ca9f3e1e2ef4d95c0a47b5eae44a122088a1725107b612c88a761e381accb7c6efbda997cdf416c26bb651c0393c96be3cdc9971b398c7d1d5034044cb957b90e12b3b722ec1dca3417bbd4ae21736fd219a3d3069813fb6e032803c00a5ad55474e7047b1fc9f81242e64c57f68874fbf50ca378a1deeba448a5a786a6ba1669abdf48307f2e3ee9c44f4da51beec386e96ccd195bd598e6a713b7469561c5753f024be81432e3e1235d9e40978fa49c7d2c1a92cee1495da9dafca7e035299fb6b7d44ce7be3121e97709d172515e653ab2528b02e84531d5623e528e208c109a68ad04ffbb6ed29d075400b41e3b08a7673dab00d3d589b31344efa70934f0727c9cb7650fe31bc874487466dd81ad4db3a29bcf8b418dcc56d82534d76a66c75b6a0d1fa4d825f126add69076797eb2ff4b0377f7d167a791c09c3b74769a206ddfb037609517a0854bcd38d06ba060b1fe8901fecd3ccd2ec5fdc7c7a0b50519c245b42d611a5ef9e90268d59f3edf3384d8748a7c37c493aff0ddb830dffecadd779ff28656b1ea511c276c5c7eb5eba596d882277d162a461c872f6d3f94e5f6ebff974af224c049c47e7dec886c43286c35cd16394a59522acc14a1fe4ed3d64cdc03f6173ce39aa273f195858ca1d70194559191e98a9ac1b54f1243b5fc45403f20d1ec83bb0c5d11aea09d9b6f78fefc01e0ad7a24e78a48c908374fc80a6f2fd5259a80b1669e5d9d55f72314d40a76b94ab6858f012d8f68cd02a7a0ef83b40a3848bb2b720c61a6fbbcabf8b3ce096518d49332b0519215a8cb42eaba21d6a7541fbd92f65024b2db13bc83ddf1bdee932e2b77bc9e58b9e0baaa0f34f39e95bf470d4fbb11aea73e25dd1d191c9a3a00edd5c5ecbee93abef9667825a113bac1e733c889f8086f6a1a962e30f7a932aa38198509564d828aadfe8c55d33dffa427b86727ad39f0a8196f1eeb29f1bed838801ddb118c778c01fab28b30254cae3023935fd749143f4af155105b7ac7d11591f62a94af030b1be3549160d28a292afcb3f71e41c179d6a33c67344d33def6d578be8abe0d512341d92d0c4c9f5b3dcc31b82c28e19ce50d39ba5d71ec4703d20b5f99bf7ca4429aa928dc9c758d8f19746aa6065bf19eb8b5cf7deed854661218d469bc3a4d9f782c4977c9f3064b6ee4d537e317c02a2b196f3dcde14d441d05e6a3bc2e936462ca5a86db00109750e9c085c8fd51b1eecb624515ee79c8793c5defc840c0b6e1eb21b0db86f19b49ebf538bcf5eb5a8a35703ccee62117b02301f4e7581bbf7cf7689ed06cf281e0523af9c8e7d74d86bd61cb01b38d5c4a24995b215eeba7bb56f5f7c29a5b6e9e865870f3bb5eb36acdfc99b53c05bdcda6efcb7e3a799626709064baf7748c09ef17444559c6b4bfcc0a4ff269d162c311c9ed07d50db346ad038dbe6d8403abf63e1dc6a957770c225394c0223874b3ccf069c315ee26a2761519d9e3d5fb0c0197a57f945b25d9369f11284f831b26412ce6bbe36618c2318db11042ad9bb27ae881770018e5af72b66d31d8fb7ea3d7440cf528bbb12f4834fc6d70550b27c7fa5cb6d7d7e0143d6051e4a5e5c6b2f602857bca36187021d2a3f7561574f35295dc45ffe03d93ff6465479f8c1adb062cf655b31f760d262f4db6dc34fe9c8180a92b627b25b1218b5065ac37a3a76f8b0a89c9bef28fbd12a3b3ebfcd0acbe856c70e6f0c0f8099dbb43b52d899d9ae76721f65ab57d50444cf569b313ab706acd1d758635ef20624deba3b7f346ed08b524203de65f468ef18440a2ee1ffef87339f687ad1ecea1af645c1d0928d1b59d9b31adaebe07b63a6956118a92d2f707cc50394f0e7c2488b6caa7f5cdafb8c68d10f33520fb84ceab95480e8b532f30df6de5444690b181ead49ddcbdedd7da02a557a2108ac25652e38ea393e968977834d2b34e741142066146e97ef5db7e03d8201d131c3679672a2d7131fc69e4a28d4ac5af8e0c72155beb419a2d8b5c969198d0b319a9e0f1516b9fedf4fbbe626093a2f04869b91ca9d40f99ffb11cc6b805e177e9e433f84091564f3ae6cdc295f6719909f2c12533497901d213669835b078e7f4ac1985dfe6bde034f2bac915bb5b33386d2f37e192a75c0d7be016f0e1be8ca2cc3a9e16b4fd274be62d7fc62a87453fa3ae5b9bf6c2311aaf3547d2e0daed5c0a3f4ecd413dace78ccded918b1d57855ce49849bef20960770b33c1f4f5938830d09aecd7a6f871aa431a5e2547f1725f79f6d3335e6b479d0be3a66637049004948c5bbc60924f09360f16412b9c6e76167d219a2fdf37e7dc5e6a7ec7cada4f342b02389202eb714fd29f27f1dfe16763361b3e8ced981f26acf384ce6dd0d8577fc99564d1acaa366de31fc24333fb0728aa669e1ed20b93d62bc07373d869a6919919ff86f97b92e7c971c64fccfaab5bb4598df94d74c9e3f97adf665cc8c968580e8ba93cad0c493864248b152cf6d822608007722170db44f939cdc3be670cf0ba2fc3dc084b9a1a41057f745991a6ddc39fcea7dc31c7f686aa31751328864766145b4154f8e2565090b4524823cdccca13d8556bb4aef6695a19da8fb6dd475962f9d359ba2ad4d9eeb118c25556d6bd04ade597a0982cea700d5afab619d7dd4025fadf3a797c2446fe2c8fcf48e5e399d3bd289d8d805115955d1bd343de38d6681ead1fd73679c124f87738abe085fbd447e65596dae5703a4bbbb36246b34d49a78c124cea1f87aae2423888aeeb5238ea996dba22efaa838ca2fe7ef696cd51fd44bbe1805fbf1854b779e6395dc5850d08900240b7eaf988985da0d6297d06889dc19de08191f7b59fa0cd68237c451afc64741c855922a76577ceceb486f2b05fcd89f2cd26cd6dc258452384a0ff783d911b9fa11f8952d0f612c67e109dde5186ab9f8aa625e4e8475752c9593c8f93c0fcaf5263b3efa37f74a6d0428e783c950dcd02398481d9150ade3bce83c7c6992135e24d2ae8a4bdfb56f2444de8e8a1b7657b0574ae5c6b67ad1f285c889dc3911a970675a39c55afbe2c3f62941d53af503e357cd33bf174a8c08e4f3ae1e75444bab61c8a52f298c7c65b56e6a353ff7493ef25563c4e3bb76529e5455aac739d9284a703903abf5707bfaf444148afbbc15bf5a0282ac4c35521a511d0bbf50c69999f781cd52b573894f818c1dac50c12a37619c62f15b2d99d18060bbbe278851d8c50bf6ce4b0a101b6c9e9b24b4eccec3029e003386e39c5c48dd25542cb2f37f4f341a7f3488a2f73bf8278486b3861aa393c4e35ddbdc2330cef311eecaf0f61c96a2d5f093b45b66253d4c54a9e276cafa4b912e9adbceded28f67dc34dce5a3a02a730dafb6c081a266cc9d34669fef5ddebd97950da7896464c6838519c68aed0bc6fa214ccf04fc1eb5cee774de971b28d9274ef455e7111dde63302a0118d9d15234bcc8cf669edf786837bfbb48dea4743c4d22527e4504eff9caa03e03f315954bc6cd5a2d07238507a989ce7b04cc0f65041a15959cd4abb5b8fec5a2c54310add3bce7dec1858c1bb17580a41a2a1b20084e17e374e772358f98409bcce454e9683a00e26a7fce22f4056a6aab29180bce20e1de69c7d3e7c32f37458663c27cf8a72dde4e6ceb9bc5abf42524539676ca550bfce7f0515ad81602366e6bf9e709a6d738f9e76514bafba67a122416ff813ceeb57beb7aed42df39f501475ba61f9b85790979cafc585709cff1350a04875b129e9233a13da7fd66f7cb807838aef7d114d99e7dd10250969d4de0e0345122001ec74374ca5bf2e1b549c1c01d4c6e12a306cffe216d7ac56884c259fd53444fcc87a555f1f35262c3e875d3d25c40e29a0d78dc6bde281ec83253a7ce12145a1e5fd3d562f28e329a440713e67332c9605a43991ef90b1b22e31f8a352224a79abc59638bce2909aed90020c805962fac699aa4c93276431ef37041b0e7f7b0b8399090eb0a95307813fb5b05a7fd9dc4d7f89ff91f0c1ef2f0109ecff8001dfd3423edff2c654f9c8153431dbecb9c4011d7db0d133f1765755ad1f0c6d047d0489dcb36a81bcf82ada2797edea293a4a3d2f693a381c4ecdfc98bb1c8dab6e7f348c930021b38a0f5535eb77bf51c790a54631b64668fdfbbe73c819291f39ab0bf5859cf06039df4f073460b45af23b1e6b112da6000d4762e64fea898866efd8c0942634ec8c0290457a92116c44b370460f85a10a061bb2985677f50d7db56194c586367f0be0e096c5f41eae4461637e36a77daf6ede7432e8a8b5d607646f1a22a43e3f3fe107a21e6e23497aabbfbc8b7b8216cff8715b0a65100c8c63caf9b2689357af6ecc128ce867656efa4ba718e9fa68b0d171bcc69650d7921c3ada7dbb7fede4edf88e184a3328a9b7d0e8e4da2bcc9ad13cfd2323bb5ea3f687658c83482a64c853bdc97ccfbdb2481626f7345e6b146099c52af49aca46597841e6aa3735b965a548a767834a1117e50a5ae1dc6ca6e651bce1f1344204add717931694376a2eb6d6baf197f84f8a053c14c7eaf8d8cb2c8b5203d3ef635b6a8e9cb1a75700894e100b0352eef30b3d632dd0d3373377f2da8510bdf9edc9fa4f0861b7be02e0349ea186fd5585015727aee3dd503e526b5080013b872a604e01df100e93f89a31278460e0548dd419329ee7526c81c55f964dbf95c1a188304d2aa5f2ff6b1f0d53bd7b431494eb4c2905c678b285369554f43113d0daaa66dbf008ac2ae2d790cc53bd6ebc21b0b8b7eb67984bd10ed6317b3efddc5d2cb9523921843be52a81374e10a875bd8a248259b2f95eeeb6ead5ecd09a0cb378f15b0dd8c15afc80aa3fb75b3b67efe15932568fe514629499e94ece338963f4d69d7515adb1b041d18a95866db93f1e2070ebe6a295b712ab15aa1f107bf50a2fc178c08e6588d5bfc0f078879435a73fe41f9f79087497e70007ad7909f121c66e1fc1ada10da43c8ad01bd01f5ae57e35faa2b295228a16536d5fb65be0a0614d7100528bc51710903e5692833540a70b84d79566485500b5e51d0e9a4af1c9057665c54b3a940279411113e74f218010c6276aa06e5f6dcf75cfcbeeb57bc63f36d94d0af484dbede2349d742eeed3eac778786e1d102549285d337eaba620a3ba4233f07a50639628a876515c1166418fb408f6dbd0efca03b08f73b3da9ed8098ac024535e62191b53e6a861f001be27c16260330795fa10ae26f4567f09872b9739cf0a18a021c31e379ec3f56e089689ced5aa1ddd825640422a1afd29572953e91824e5e45429f1af5d0c8674c8e4f2947dca7a900add4f293d8abdc6f10aa417282b2cf85a54b5980dc30ddaa61ae6fb7f1a877639aec124542b25a8fcd6740a26a757a2dc4c5038d571f169493f4c4c0322aa56b8d0807b97879e962195aa0b3b1ecdab821aacd8de9d9ae95a5b0bd0336b4cf92e4b72762f25915a08502e628f1af6dbf3c5b0bf50cf702280770dcc357cd6284428815d448d64ba580fe85749223af9d85543375290dbdb6499398b31ddaea9a26e9477fd48817fbad8c03292bf01cfd8d34f860c6643deaecc775450173e44ef25920d83dd4e71d5b59e3a9177b3239c46bbf5a7dc10f10515af6eb9b1edc3d4556567fed4355752ad6ab86fd5b8becbb66fcc4b77aadd117ec922963322ecf807f4cd95b69cfad8c80cf4535e78680e2b52531fc179697b0eaeb80c264789044327877009ed23100f6c36669c5ce80dae4ed24c41e65febcd44784511c3609f0fe6dcb8588f98a18972c6cf16ca086f464a90f97f578508c474a9697cfe3a727519169528ea22353f07ebb7542b8eddfc2fd64f0435a57bfa27959fef60de247ca87b2e036688713711ef46dfe843fed7e3ec7657e985eb77438210f351165e2c7b54ac706b94ff7b7918a33e67ef7bdf4f1a9500d9ee0144b1b9e40f39a8c88e7be836f8610c871328aff7f9125afb1c5ba8d5886fa765685a8242cc805d09a98e81f521b0b9b00505fb6999504b2797f0dd5d76127abeeb252452b18efdca869d651176c063235bf74622a5888ca757f4025652292db5d6f9e93e46cb50b22b91ddb17cfad1881de8d64aa524e32264515fe7a51e89f130c0172b13a01d6aa25031fdbdc4cd8651bff508218b1940c7ed3c39f558561b0161f743a1732e99f3c4a91ec0871dc50164e984a225f6aa87b2e173cd3f5cda52c4d1ae77ad49e824d38d3c0dac8aee34befae7af5a4108ac8695beb23b62d72ad1ed941db737ff3f67247e2d99dca9f3b77259d192c4013f53a2422eb432b99170921c1cf7c0854b67b70da7b8db9d453697018f35453e46004e26c81292298f890a6efbd7ab2351bb8e1103704f733224b30871ab8d67cc75e29309bd4bcf2d049bb342bec280584bf1b1ca28ffd2c2670c95ff5c6423d69aa5b0771e255272c98e137a14cb4568ff2815834ab463fee8ead1c2b1911a6e57e1a69c9be75b67c02bb52a408f1989bf7a66b63d36ceed8f97e44110def59b94dc9c009d5b9112d2b9c2daacd6a5c47331cceb694dba97455af504e2115c6639e0bb298d479d7de5826112bf68902003936eab36c1cf05f07a2c9490f3f6d52e332aa1d17426b0e2ccbb5be10c83a657e9757d0c59b63e7940b278804c6cf35b1d12f0d3aad5b1b2e0f83c7a8c265d577a08ea53de174ac9f4af381ce465c5a8e89b9cf9b0528a3b063f3ef2ae204dec90507973199932c7de4a5dcb828a55fedaec2fad5044436785b8e7b23b1a7efc7175b2d4cfe5fd5a45ac6ef4f083aa433d2e31565053e21da78cc220fabbf970669e1ddecba3b36c73fdf301f4f7cc615788285b79287145b2e354a5b5acc531b7f343fad47a5de4ae647559578fc43e71239e26936bf7c6efe427aa3294ea26ac9dab8eb11202a93f097b64e0f299c4d2271a1e66c47d8aa6b8c2953a1c71368dc4dd042b14aaa56e158d8a59c853d9c4bb25abb9d90a781f86adcf95ec614ba18f62c20a285dbf82b0333388bbfb678d0746355655a678a17771c10babc24c3127c13216f524dfc501f6c7377197557634052403de597275b395d264019c2085b482ba162406ed7d315dae2c92328bc76aeae1891c2c4ee461a1696798f8b1e55d2ec4d45c0cd2f367f15030c7d1f1c8d07ed2b0b926f434aa1df0de15dde6994a4cb716463d746fcc38160ab87e6fc18f48603f5a504dadb592ce8f2354a7e8a464fba58aa1bc3888bc66840c40edf9ced0f300a9b03f99ab886b426864dc1c93fef849cf409298c205a9646b2053b9b69ff4b94e51b33eb3852fc18c156d7b3ea316c9bd23dfd5a39948737f2489496f3cc933f13892e6f61382d3386f434ecedabdeffd5189385202a979ed5677f1202fdc36396fc2d79bb9cc3f147b44dc6a2c558137d27a09f7c8363e60be06f9f201948acefd2d59cb0075cec740596f3b20464812af9890bc7156897e631ca80c3958f659eab9b6ae6ee548fac66b4d693ef80c37efcd15c7877023ef4da247965f9243823e50346b8d8475541660bf1b0ed3954e9a00df4092eed55c84811ebafca939f002d91d2be5bb1c7e37220d791940aafeb91937501837656d119f759e9705a04c3e3cb715fcf0071f31977face6a515ef52ff651fa3b39bc9fbe6946ab80e403df8614b525c8cfce00da95ddcfd6b9cca709cb1d4baca41194a3dc247e72ce16c3a3020098df8c469d23fee30e7fb083718d76297e6e41d04068b495dadc74a800b918063159b276188407bd12bbb20dd5498c292ad69f93338ba6fd391474422746cb1887edcec7038964ce75115ae652bc717ea9ac19b4de8b17dd11c1497fa7ba9fc9f5025dd3fe928a999e2707876a64daaca3254cbfb1c58ba81d4960baf2b30a9d011ddc076a3deda0f653448b9cb10c358ff8b53e5de977009433567ea89e900454b6b5ebd6ea0267262c8e4d6a4f9aabc88ccfab23556e591f15a75529fbc492385397fba5356d7ea6196147439f0a61f5580870b2a7d6342656bfb907492cb9548aeea1859e8339eeb05a23b90de00a9ef10c397c3f4304327d2c24b1051cfc11b32697d893e83b7877d54d5b3a90181dde276ff0aa394bdbff5922c7ce39dcf862dc292e9410e5cbe66f4e7aa3beed0a76067ea0773d9d8b63e33dbbf2e7de81107befe84d71eb61729481c7b7a12bdd6f16001c14a45bb92146cffe11cb734452925695fe9f9ed1a2c19193050b471f1fc27ec401222 -MD = 9e12e074960f9d3d59a9363bbec9625d7a6f1f5ac0343b043b57ed7d - -Len = 48032 -Msg = 32c2c3a0a04af8dc989e8daac785bfa177ef4ade647fdda7cb46cb4dc5d20357d36742dcba8c873191c9c8c518b0e3484b1ad71337b334c40db9d0287500bc5f243a763ab17560e8a4e571d2d1e42bc3e437cd4c3c93c967fd5f785a60bc0dde4ec3c8812e0d6c49fb79f29a99297f5969ce94521b2684d7c3c32caa2f0dde1e788a9e78d85d919bbb0db2e51988c754026894ed7b744e5e886a52e28afc1765cb1861e9586cb8280f2a197af808ebfad98c34e404860d4274de54c8188fa0fc6ff47a9a5543ca361d578f23dfb2d39413c2df015f63abccaea6982582d0612b8ba64f5378e8ad0e0d1c7ca6768c6869db92fa0a34130e445f4a88c06fc7433948b74ade69654bf8080148cc64a190c35785eec82a9f20f2ae528a63887b2c70cdaed202cfc28a3b368f5b5d52f634e8af222303ea0ec71dc44708d475f4051643134e8652055421be4d1e21e7953d210cf101831c68ed0fc8b169dcdd3ab774d16f28339b3890f0c8c3f7e0cc8591b6967bf10f67b6790ee3161543695629d2a048c7d1526226f17e7a4f61a8ce1aef7447597173ff53633d0074d1c04f4278d72993281f8cfd6c06f98f6d2479be14cfdea26fe94b6356fdf6ee4e8a2decad9f97f4ffa8bdffa988c81dcce88c676ccec635d271a2912e4c81eb8171f80eba201c521f98fd13ef2d7063469b12fc409a897861b20dc5355128d3331bb98fe7813f1551955421881c78c7a2e51065d85aaed5e65593e7b135730e2c3078597ceb89a55b47cb12ba7e68b3aa70908a7c37beb327013ddfeb1fea0434593b53c185806b055869ccce7bc98e24e199537459407aee5f12952b38161d133e0c65fe78aecd196d37380c3a22c0d9e334a807e7bc9101171af1b9a77ec29086f2777aeb9b345d313b3ebbe4fbb1911c68717f09bb6228d05ddcdc95aa5975d9f6717e07cd099b497fc724a0dcc914343d9622e9c4542d32e43cdd2a234c88e11e3b52f3ceb299600bb990974e7029d4bbff39ac5fcfd7e7b6fb048d7001924374be3ed82699201ce5fe45f1d80e9aa4eb940b7d143bed94dbff99e719e25aaa00e08ade5b24f725177c8cd5030b2d4bd43ee2826c0138e45c32e45fa755aabcc98a7d2cf7bde824a91dac6b56cfab727ee304e3ee87807c407a2d1ea1c44821d7a560eb82cbb9c1a1c7efdc59c2dbc0f26cbac923368c078fc1bb4c8f96fd8232177b4282b633a309649b50944c87de37c24c5c9176262b51eed710f9339187e3ca165a81e51e73e8dbf9ee90d6757355cb02c3c2b014908fe9c9926803ccd7f1a4795b06c242d8471451dfd4c66e28557124273e4a1fdf519ad9fb646e761b648fec6c9ab4667b2df7eb4be8863aa53e9bf9af8bae0fc09de94f7373dc56fa4472b6b5c4235403a26c0e59557ca1911831ca843342acda7dbe72211fb5351d9a34205f0c77d219af5b0331a2126b94ec1adfcdbe70bed6f8018b2eef61db2b6dbf7292fa19a9655aac13fc57af5f57c14080b3b29f0c5b169ae2c16b4810cdc6faf475176fa18ead4783e2fdba47829f8af55e99365f12e071bf031cd29cabaccded31eae2813db0149e0a1b9de9bd8ee085f5fa9f7fa35d6e6a1c8968466c2720a7edfbdb13196afcab9d39bf0dae972a7aa05e4134b5967a2a333b70d7b93fdb68d2d3c01dcbe3e5f1c2df887d00c1501a894c8446f0917b4970b8541839fde77908f9fa68fa23b9b9a296600059153baed54cd07cfe585b0dfc8a7ace95682a22b6f5f2bc4f335e4b64e5af5d6299d17dafe68d9f84f300bfff384cc474898daa05500fe0721abeef3255dd5dc257fbd13da323772d6854a6a04b30c17f66f85b1c91b89e0ae0bfed316d52c82157a2f0a70afbcc9ec13d0c084a908c5e09547b244057bcbf8e4b8c8bb5776629a0ac2316a47b668206a5375fbdd3eeb87a875344e653033b2a491668b5b2fe803903b2b2f70c0d7f3d7370cc2d61af35bf7b2ba50a143b23bfa0d1eff66c5ace2d8de5a28d17883d708fff7721a2977ee2164b6e34022c22523a0649ff0e40bc8134040fee02a065a6e02c8921fe6d3beb42fac8ec859ddeedfefc9d58fe79f13fde5620a0361d9fe8503f2ab5ddfb13e0e681dbbb0558ff97d4fd148aa6cd166f7524fe2d1cc7923dc67f8166a707afcbea28ce28ea232e59a44fd61c6d03d317e0b6d01d1b65e7ad2b36b7bbc45ab7b33537c9bc9cc7133a563b0a96bae5cf410754bff69ac1464065aaf33d9cbcd2a1b1f6f6fd830c5542d309d981f739b3f4d246f34203a155ff5d235e7297f5a89c45ad7b7507b99c7901016a638bc8263929d39388bdcebff1fbeb20e41ecce2acd9a380ac919892e8c96be6c7de5ad117f445c75130102a1e2849601b970a28d956212e29876fdd96138e743258b75c961be2b924c42e3f8fca84469e6c77212ca26fac745307258bc8b33d2e61a66ebe86f38e89e1f2a54bcae5fcf503db76aca6d523155b2813d0ce22684261f0af981ebf7108ef22045a11b4a7a8c6fecf624a9bbb9409994e6c0f231ef7c05dc92bc990882a568706c58639723f1ba8d25477089b7ac4247f6772fe87d3e6b5617f70acfb767ee9519310bb83436ca02a8c1365ec4ff38f4ecadefaca603bc0229dfc5cf375d0108dcc9984023c20af7d1207fad59900a3629c3d6010262846b18c53e898adb2c3637908da18b09f9d74ec3c0f7fe2522864e5767880ac130eb9545f9811a88dcc7aa14506ed295132b62499ec12b151e6fbad718a437a65e1e0fe06b487eecaf17c4c374fa82e9e35ecc205d9b58f65a5d0fd16de80188787ce9132832105cffb0e82c8ff7148ee70bdcc6a1d9003f62c8bdc4dbc600fdfc82c15ca4e087706b1da4cdf5d72fda9a9d24caf01cc956c44d353fe6b0be5d76ca293b65d63ccd5dd88b164b0d0d837a9d249bccd91cd2fb550691134a825d63ad711def85b8aa645c0ba4041b65e003866cc79c90634a747ab266e5f5f5443fb749a2a67183be0b2296e59584a196d1d36dcce3c54513dc18c92fd345afc8877203382f1c166ebed6bd5983cb490e422e981a370a2ac57ed9ab6a7fabea40c7684e6cee07e942fbb2ff7e5371d4bce0d27c3e0ab19ce5f917e9952fbb6d537c048baf67a794c14e71ddd298fadd394a79aab6d36e13ebb76e043e77d6716711c13b8e208d7160237dc8e4a8d8baf9cb8e84032592184d56466bd4fc9fcef22548de67ad1c37a617515123279e0675008b98b175b02291323bb0e70279be8b22e5f4ea71f630199676f72c79bd384175eb6920586abb4df7a853e34de6d8a8a7331f84f38df3212d693b5f33a8d8d5884865fe22044ada0326d568238995c10ebaaea5b656096348928e39da0350a7d40d2fa9872f79dbd131a5d417b47e7ad5d732eb4ee0eb3684ad705ad13f483ed5b42690dc4ea0ba0e5355b5bf0a1b1c99234cc401b101414df48210adcf281109d7db62b5e457fb0706559b7dfcc44cd5394cae9348f3ea21122429e43568b4ecd2ce9d8873181557c535d3d90f3281f663b329680b2bb78a80d6d508f492a0fb5f608fe88d69af7d0a672d54a3ce32993d20c2f48a211006cb3ac080af2e5bb1b841d84a95b51fe35079d6757cfff52a4015e9bd486cba025b906aefa7a44bac87d2f5232e82fd3731ee8dbfdd504015f6f32c46c876ec29aca842ba808cf74848a47506ba7bbdc52925a19857678a08ec58f9158cd84cd948c2c655cc50f5216536c669cbe7d829a0cfb0a37d9e596f7aa7eeadf7f9529dba708455ed88bba487fa67c0c55fd2d1233d4945a27d24b63c705b74bc5273d37c420b3f56acb15e0b7fd7a0495c44683b0eca03887c82799c42fe0e2c8c473708b7a986aa358cca7a27a48cca55933b52a4c1717224e926348014eedb0f3324da320da05aab94565e924ceacae445e704afadf4020ecf487fb85e7b3a53de397b51a630ea876eae23304f5ecd80e2d7cb800e2fba82ab5ce86c2947ece28ec16686e19cdc41822e52920a3d34a3e0aa01b66068fe2913d0091c03e94533eb6926526e68a272654387382c1aa2d5c5ca51b323546f7a8f4e5c388cb3e5d07a9d3534ab18cf828eaa1b83238b9a8f08b54616e56660ff74344c52125c4140a2da0dbe0621c60a74be9a036ee48e483ff7395215138510790e73e93326e9fcfabc3a5f2e082872adfd8d598cd9f099c1fca5f540e04e65f4494d7e7dc8426de89025887150694390e35fc60bc063ec45523650e7412f688c8143824094dd3c031269ca8e8f0b05c40cac094a2c4ab82094452576da9a808832f0852a312ccfc09f71b5c4187021cdd5dc63e6922795ea1f6cc37e1122469dcacf07a911b391a7b3c7aab0814b3004db7b965f868d0e086017bb7b69693323d5597a2bbb043a2eebf649d25dfea91f8a03f1237ded791202d09ded57b1dec0df0a6d50919121dca467f3b8130d05547df004c0ecbb7f8d7421bb52609e91eb346c418639dcd13769a738c024f8dd6a03ea61b6579979e14075c42918a2050991f9a75b1869c0a5c83e9989183489c6c83d687242ea0093d45718fff44e90b2643cff3db1aa88ce3c889681716292d14773a993333fac3bcc405a456806dd5c2790c9ac9a219207333fa037a4e5913fee27a587ad0cc54f74cbe878086d339d58af9736465174f748ae571a47400d6948c3ecde24c3e4258a54442639e44bcc73f3d8592adc99f4e96f1bb7bcf45fc3d3c2dfe51f17a17459640dde910e8e8015e81d93cc0579a6a1fc7e8e9a9510f60bceff5b005a55a28e95a5ef923e644e9af6c754be7eac82eed0e00d5484c9767d22dbae8d1ea94686439cf7a216758e8fca763a56aaab003c76f0c26f55d1ab9478f53df9d6f4c6dd08637565092ad670bd9ab3491beda52769213c6f8ac22bee2bcca7fb15c0a9ff4e89f74f990cacca5ab53dea44ece81c31e1d9c996236de6d5d27af54da57669a080ebc6388378092c5658dea8415fa73bc339020a7df81ae197056cf11b92a888d8c16d8a37dec9acee828ac86362351135b8ad4a2a30f6f99af5e6a28ba538720226a9e092377856fe597327cb96624cc9f72ff7c0df07684ebae6d47e2495f69d6a0fee1b1881a4f63c2c48f272ab38e0730e75ca28c8b832d2e2098b874d80fb2a04053b08922176a91aae606d6c7029aadd46bec4c783e7cc6cb40c43dbabbbe52ac89a7e1666e03ec2babe1d428cf60cf10d17296045ce05eb56a8e0acc14019f8aa81ef8abfd34bb91033d8b9e9e617fe2b5bcd3f68661de273c9f44d7c3836d21db9d36bc6b07e62218a463f117a6a6913f536c1763082e69de7e54a36f4ca6ba48ad036061845527129dc4e8e1362a6699bec72f9cdc37c379b3a0f8c165309d17d5c75e87b2f0e719b1164da519f5a9e8854e06d8e5df7d35c7929e61d5f512719eea7f8499a0ac5366c1e60a58eda257316863c02c0fde3941915cf6a4db617e8fd48b01414bbceb472d7cb9fafc980b497c0ffbb8b02faea904fc28daccd16530ed4aa5b3da6007d9c3d6590709d52f55f4d33292a8b9bb885544a180afab4f099e8319f636e0d0a6e9be9388fb9fe9dd37750dc0e1c18964ebfd069e6b3863a34d00041245846d3508fa0f84bc3f616aadbd334c419240c82eef023aeabdca8564870f10f194060e8953740333fdc183be754d3db273073986e13b5e1385ab3749e1e2f72157c5bad2916b0d48202eb1d263029c1bab06415b9c5911ced72f4266d624cfbd16d0c04d7c9babe3f2d27b5151fb706383666715e9055c03fa7d2d212d7da0ac194fa861dbade4ecb9d569a305e0c174434f331c8ee7459a37bf80e4b09773d8a86bfb757848c14bbe5f03304758983533e82ed953a6d77cd61ac41625174f280b4b3ff3191548e94996d261e10bfc8e9a5adfb202ea178f1fb8801e55a83d848919ff4287bb83aca1a55d9c99a2f567c2cccf10615d0fbc59c13c6608f044d46cfac0ca8ae37a7d10b22c4a39c58ba8f167845c3aa5c6ecce5d805505976c00fa180cf3e9353445dce6c8d4871bc73a705388fc536a4405c4b2d5531646bdf17c9b6a256e58b9ea4e68b8a04c4db00387b7635a745592f084ebc2c801a5408d39ab63c8dff51156ae6184184f024eec7dbb9bdc670db796562ed01c8f5bfcbd7b6e7e4405b3456f44f8b5a35ae3aadd9c89baecf33bbbde81a385b88811f96a880f4301a83b5b1f5756d2a83398cbbf2a4648f1df87a7af4f746c02b46e407aaab43a6890345e4c31a26391a3c8ba78701dcb53f49882f306c60a63db1bd8d72686ecdf844753e01805f1c5721b7df2b634cd79fa175491efc4e944c4bfc96747ace0cf4e1c44c255a703ac683b1e1344b3d5cdb9ab25715293900b38031c14544e9ea1b45a38da30af21ae4dcda4c561c36cb6f8fdfe7b775e8722ff8fd8c49496afbb7faa3810f045d333e87c18ef568c189c81b5e697a54b57efe10a056150aa9a8777b34b4cdf93a2a302ed81796c3564e71a7ae6ad268287dca61cacd2d1b2e76b631e797643be156663cbe74ae8e6d5008cf405a5402c9f4f156ed4ff5cd71fd10c92ca7665f1b5e4d3bc534c15c9f54d9ecc4b673c7127b2f7a885d03c40c9203bb847348d5208861a68cb663a034b371aaac0db6278a86c1472c72db7176dc0b638f799030998b2ff795a809ebf5f27c6356deaf96aaae53472a3fe1781931945b9e38b0e3fedd14c9405838a23ba836c16597a4b6eb3851f53202ba2a8c493b2e311f3f71c8d4cc763d6554657e3b4d2f58c749ead4db49cbb479ca1b48796c45f8bba07c70289398ed4df1a846223c1780fc13b4fffda75531f3a5bcd658a42d559c68369d4f269bd07094ed2c037004ae9476a7b515f70c2b0eb1a19e5d7f5ec8101b62989ee219778bc29688457591122f07259ccab56b0029824c38fe5a54d0d52e730abe427c42edef46f36ed9276c3a39d12f726eec71e2ac3f1eb1c19a004a05da5c23e44ed3158f80e5f607420d34831ce5b3902ac0b873ccc82e51b8c6fd561b1546340ba8a137a6e8618c7b85ac677b47e4a580ad199da7bdba671b955d83b7cebbbe3d240f6c5b6337d53e56107b7edeac3ba877946e4267ec8e4d0be91332d0eaef5de5be8200feef7df50eef239a0270aeecb0978a1f7f4b43c79b3e891ed46a43d85e4d3d2a140ee35a00c6f44f6bb89bc7f8c165a14c4d1415b3ac59ce319058470e29e2493b0ca1b7ec066211730a6ee4b070858a57686bb1f5e109d38113992465d315e0ec7f35a9214bf192a0ecb4ad68436e0d3933d716c24b1dc13b6a82fb05e74c8390bd1ba830f627258db5f9ac90a883dc5a25d2ceb9690a19d8fbb2356eb4fa93d06cc02fab93874c821caa4cba2e6b5a52b4eb444bb9634fd24d835df0faa4b41404dfc9e1b2769a36773318553389298b677d11e9ba9dc5cfd692ff4cf6df46e40ba6e183c18971036c4089f25661ac8cc424b213fb2e3e2a3d4d73c3580edec8e7d210f25f447381524f3c02058965df416e9f6ae9a8fb69d83f66048cb7ee2b2fcdd2cdca1c2428cfbb8904df64d7fb75b7445f047290173dc53071036ee7834a169176b094d5723b220b9b32989549c7ab5b50ea3f8eaae49b8da96aa87d89dd38f77d912339f63aff3e05ad790072bd971ef0f95469ad530eb80e10d8f2775f915f42fa6ba41d35bf9b04be9acbeece1739bfb04593970fbb5a2f9494f90427dc43774ac2c66fc1ef9ce8d4822a168fa8260dbda7bee0711dee8e7440f398ec664e8b00ccf356461bde528da3dda268d65e6b6fef1e123da2ef9b2e8174ae03cbdafecaeecd7958a0b9b2589448eae00e5d69458063b4bbe6d7e621baeecc14796322f7aca731703ac988b3c7ee889bdcad87dd001240825621e00c71d46b84fb91c8158b3327032688562db340d3e2adc937a4e29c3e177d68293d3ad824dbcec13ea30ed3c2a81060ab34daf2855b1e2b092bac8415e1c91522327a3c508f6f8bf73eac1b8cc5750ce857c345f57b9a6d6cefc24c5077d5b35b9ab4a3a7265a5ca236e77cedf1b0c7ae04f0edacba9eeae34fc85786500fcd35b47e9061272bad903a457a8ea3703b5ccae83c239eb83e0cfa33582ff0e3bd514e3c754708301971974a96b7512fd285281dd3f29e62d13a4d77b0a5d10e1e3e9672d4a150240a96fc7b4420914c27b79b062782402b3efbd819e38086cb6a4e4bb6310885540ba0d83c1532da519554a245b96b1a7df1e218ae735878c82c10cc7b1cf51e6c970f99218c6692dcb5ecbc30fc0593d7745d8d89e2962d60de169745faff91ba3733dda01c44514a13f0676c81fa32c440feb550b3c22b41fad04a8b4d7075e956ce145c4754ac260a00326ccdb17dd0e2161e775944e8d7fcde44cf97003166803ebbaa800ffa0d328c9b9651b3db69d264278265c6ec8f6e8114977a176aae4df6520f68dec14c1806019d8079e20b8 -MD = d12c093caa6eac327c6a36dc80ffa41b3905029ed6d9efb4147fbfb1 - -Len = 48824 -Msg = e01f2ae593994249a4eeeb942a6b8ca7501a5aefa0f1c139824806c8ff912aa5cb4311378317e4133377b3151b335fb0b377b782ecfae12cb977fc60ce61033ca7d3f4d6cdc63218558628cea96730fd8bb3b37656e891ac8720c3c37dd13fe97db61be9f90df6fd120394e45b6dc835e0b897f367239a61f52ba4189447a55654d6ce999056f66d72d63d82b9aeef01ba6dab20a513c4f50a81e7879c2dfe2b341a550e1908fb0e7ee86cce4c926c0922ba36269a20d60dcf08d43a1cea120f266af76f1c8acd883d1f68f09b8209f41f87822dceb39a544aa9b2569ce6a9ab30aefee421463484b8647b112fe48c6bbabcd55cc832d66f854dcb06a4898ba75dceb097b1a3f8aaf5a0eb598e21be15fa4278db1007530988da6570bd3b7faab2b356ad5309e0a1feb901ef42a2679be7ffb3d32e98d9c8593ac9bc6e644f5c3943375190e0b612db9905fcd3ce4fa489dccd6caa4f305402533f13406cc167f9679da9ef9140a492263fa7c70c3dd9e9c110cd0d931f568b0f0e9dbabb9e70fa08ceddf88247002d4af619a8c6fbe10e97c21fdfcb6f76fa54808164b9ad22450c1316331c92cdb3eb7479fd634f6600442c89a661e85b590cdbe8c6cfb822e15db47c29c7ebb42df3fff04f4b020dc8b29634ecbc52aeaf1e68f96963851bd6e1f93661ec185da249e0a625e5dc806dc747473844751605726fddd4dfdeb32d822a6d63f1e26f1ad55fc2079ba467f76d89eb1361193c62f038bb8fa98992ed268e48b84011939e7fc36d7dd424696f8ba248047b05c7ce800abc232b4e611eb76ef0e73f6d70342f56ce10f9222fdc09db8593fa0260520a2f0817cbf7c8c81c128c7858bdafe7cd5e0e4770676146ce7ccb4846d8aff476edc6f3f34a6ef43dc245f4f2cbf7bc412454aba2bba6b5c4cd41acc74f5bbeac8d1e400a11fcaa02c643e2745df1bd73f0c9c3f7e5a632d2161046e62e0db894563984781219f05365adca483c44f14c0a9417d8af0ac4e09e5f9e093f6ce917923f4aa4166ed018e9ab34d5309960b2b9df2fabdf7a74d7ae573d9a4821591b875817f8e4a351399867a9830198138e46cf94d93e9d499d8e20aaff12d310897faa75db465f7b9ebb06b0ba76e811c9f98ecdcb941c4b1b86e16da2652b174ac060ebb5024a573099b3d2e2583262491a4462e8a99e8239dec20fe909d1754492a002efe10decd57c9496636f1d0ff8f118db9744ccf7e0ddec173ec56c32613f9240efab504376aad184a683521fbdc633c1422f4eb1f6cc870d0862a457880e60301e28ba62fc6c9324115c789a7fe0bd9c5030cbb864f3ba7aaea923eaa1462f57e41ff4534d0a02ff0dc138892888ddf22910ec15139aaee59a5f8ef693302a3faa5aa61e53cc459c037c3af39f06bb4d359658cfea098bd6334f90804814766fd69f77c9f4fa8583595325e0cca28034db8cb7eed08778d5e140cf92a73a3e6fd2b70f5e1adbe93d790fa25897a4543086b8b37baf5e9d6b0cf9f33398e9a8c8046a17e4acb89a51c9785864e8535ec89be4f27c6ed4231f1c43a56c036adc01d67f376492d9bf47b355f00ba7f8c78483d61cfcf532327a79e68d44d00603a2afc016e5b48681a89d701156bcdbb6eca657da002cc0f1038caa52c3e8024533f6f35d6ffa0708fbf18f644b0f4454896c2ed492fbc58942bb579cf131a9c93d15e1b30a4ca37bc8167b90f5897bc9e23e25b1b94a8b22bf6fb415d79442b8487352c1bf92a4029874fc3e5910c73c7f8202197e0158e203118a637cf91439da780e2f95b450c7f173d916818d72d5e9a28eb6e70875f49507a12ee84968757d8cdca4959af0ef5e7bdcbf74e9c2bea704912dff472a7efdbbc11f246a8694b81785c8c62ccba564f4cbe23a0a001c4112d329cba6bea9c493b2dd3746b6bd1381d24430532b0f8d466f26dcda731a40321b50550e7b9c71f93b1129c44018173288c0dbf5565560d99034614065dd2bce324aa465a7808c54266303cb6bce4b9372e3d0fb95a06516f6b3d1231c908a4de1c0c0958b7c9d0c397acc458107380a5756164e30182563684c346de159e617ee5ab2846fb92d893dff8c19c8ea6400fec1b5d46fe42729afa79305fc60c59421bf811c9a5ec332f9994b2f89a059de30cab6779a2df3d1936bf5d3b5ceb22c449835435694e87137f1126f0b509f0ab51c201ef81a12c1dc4163bf54cb32471d8cd7e3e98323adbdafe8c19823bcee555dfbb1d2d40b6352d0e4b1207ecf4d76446de39c52fc4f547ad60d76413af0d8364f177082661ebdc18091621010a61567022bb72afbbdc4fae33beed1a17a054e253a1a4dac59e4bb3f4763a97dbac29e9ba38232a960d5d8173348fc77f3a54e8401185d647e90672abb686f9ff14791423345938da04fbc7addcce946c380dd7554b1d916f4896c48d6bc8dfdb46be7fec3477430e6f94d1521c2c195515ea4ff1b2fe94b239774a27ea6292069f549d83bd1fe18989c34efe871abed07074a2a3ed8b7897382243e9c6d6c8e7aae5ed6832b58cf200019101822d0d54c4278fea6f5685b4c112626195a7dd14d5ecf03839dacdde4eda2819b1d57d588d9d68439cd2746160e2262dbb584714ccd4364246f1fc84e2b7a4957aa697524920bc3e0aa1ad4393fbff8ccc6abf4ddc263034ce8db1ac481477036112e3e8636c0c384d2698c1d6ca6f2d3d418e46a06d7e7e451085ab0b9b2ff1f99cdb7178d9c8d0b8e3df62a5f7f57d729f3c85a624618d5f2cd11799962fdf98b6f693f5e48285f26be9bc9dff130c20b6529159b589f051353c687ea0072ae2f3bda67736b9c66e2130260b3a4847bc3968e037cb6835efcc2014273336725cd5a94f592aef20a0a65b459a4415bea98ad7f8ccc08ccc7f5414b12fea4e246adf31f5384b93131e5db371a7a70bef7d4d2841852f5822745f82a5f51faeef9172f01e7103361c5bc9e150dfdd8b38abd2f260fd726ae683510289136de90265236c41b00c58badd7d5d598f422458b9de9ecd9234358710db1cd1072f8d2b5a72fef561b16b6d17ea9002529f579e2ba2b5fdefef3862a1502a044d0efbb8e5e420bff28cfea19f9421d1b62fa59775d1b058630de427b942c2996176c539abf999f80f0972f6d8fc7b4e268d9ec32cde1693a80ad934cd456f06c0e16a3bf115933403b178eb58a604ee203393afc54a61060b80882851ba97e2f7f96b2e69ead50a7d0f60ed930377282fac24cbb389284629e96150eb24d5a48309389f8acbb7d1d79ddb8c1ca71a82d171d2959c2cc4ca6fb0056cfe1690c1de9b62edb84ab420afc7492569f39784820f2d9bc3a7df09696ed4db1ef261d1874a7ab796ea627d62262a77ef9b56b3cdee865cee8ccf8983906019a26ab14a0980d08b8b1d4b5e9b350fc221e0d087119a8d47513e2ed16aaf37a73cc21791c1c904b82975c73ac77e59b2b576ad74f99da2e9b05e65777b25bc0252aafd5f6c9d97ebe6666e98536ca8b7fecf4613f25257c270401bc2319e7dc97887eae956790a854671ca0ddb7a6d40825d22da78731c501595ba682a73ed5b02eb58f61be5dd22be2a41f1dc3227fac4a2dc4f085a711114c1b9cfc2408b35a637dfdc295e6032d1f26eeab22e69255a22cac83e82f683f246a27f957ef7e7c70fe8220b5d6434165cb96f19c9918ea76f86fc67770d3732b6fcee109993ffd9d5fa5e3e7d39a4ffeba9e55f8e316530eb89423fc135995a753191c02aefec732c9ef73f1851140301c8e41006e9678b295a4013dbf038de13d90120ad7c1c17763e6399b96affa4419ef1c7adf9f41aab726c8041dd8432156bc2be9bc92d3b456149bafab7d6682d8484e2fe13a963d45a2df17d5e09fafc524d0660478e530c90102f36f816c3182213fe71a6e5fb567a1b03e8e238ad2b350674b577cdf34e533d73187c5f59a3e02576a3243845847aaa243f0aaead348c95a5e5fa4a908d134802f9e51e7063574fe7fd2c1ed6f0a451deda57ca9faab160f68c1fa2cf4b68c67b65a2b2cbb8ffe9cf0a2f18241dbfa890352a1ad8f05bff03028864e40bcc1f28d635daa027329998349da2c18e0524f4ea222e0da7d4d63803a4ff8330a5d8b7e62ef4b22097c5d017084d13a41d4d5963a0628233c47d21e9f5d1316c9e8994fffe7f5657a7f5031bef85af0270984a2c5556fb16a35a4d300b8853120e884c9e14f9211eebadadddc3db082ba77c43ce9179ccd2e9f4167056938cc38e7b3b4b12e096f8cb664cb715bb93821a8fe2a4e5597bfb00e11a25577122f396c90d8168d42c77dfa54c4265b5f5a852498359d1748cf190a7c4c99eafda24a0082fcb9732561e90e1490a344892f0d71fc257e6397459119ea2c78cae06c932af1ea41e89a84f77b0af78f1e1f00e21990c298436c683fc5c30b9b20a2d63d72456857f58979cfc8a0c192f208152ba4bed494beaf814c956fb1a9f32d287060e73fa3a0da899a7d3db555c72eb61198ed2219dc48d8df1156e64b4c68aa537d3d37ccf375f98023489d80a5782bbc7f8475d0a61fb521c2e07229323ba30f50b0177bf64214a8412b3fbb94cebb53e0ed9561231c603a2f761ceaad8e5dcb61a9a957b02a213b5f4d63ac9d18b0fe448f4a735c282051e17ead37c5491eb0398eb309291367600516d3fec73e50e732d25cae57293f8e5e62eeb783552fe65fc8fe3869e72f40bcee56571b29e433321e92bc1e09031a3088a413ee98d8945bc0528d798cc1020b3db3609fbfb30dccdbb542b9aeb51dde5a9af20ffb60e3b6dd76b060ec65d07b6bb3c05de9079b89718deb2e029cbef13e97fdec6611faf786344826ed63cf93e01e1f5d902605f049e25c87eb0226f09e62dc8fc23102a62552fdd4790229db05bc27a69a59748ac97c40cc532d7d63e1c43600f509224c21997970778c06db40547e3ff1e810dd5a233d032166ead36f85b345e9e18370e2d16105ce478d1cfab0cc337b1b0073659efb363df595c7b06dfc6884014c9ad0c26098687ce7259c96ba87223a6dd450b6236c8e22a7c70c43b971b0b0a65253331c332c723b7e8ccfef45cc8c7e8684335daefe35485bebd191665437b921d3ee3ddd0273b2b034231475635a5c136add500374759f0cb5dd2d5158deac8eb8b96c9fd2c57442fb59d11dceec2e03697ba573d92cd561d2303539a3eda7226a5d518084b1a8bc483bcd47f58a1ddce8d7040613a011e3aa9250271facd46351a29388017f77a7858fb1fac07c512851b713c50b197c18a5cb2622b36359dbd54fdabf2f770889191e243f1709f16e0be47db7a9e13e8a2ca2603247595e125f2ed02ef7e184ed6cb0cf1de27b25377e26e8e4d63f7ec1a5e0a65fc4d70c8f55051bdc41041258e60d5a9c0918170a1244fd55787a64447a4d9fb210258ada219d63d1f629db54effc6cc47429ec6f2f08631178db1a9b11b1f432148b017b29be5116fc980668ef46ad9e0cf5cfee3d38c220bfaac54ed4d44de8b85199fad72f8cb23d99bc1d4eb3c731b7c6e610a49dc48b342f90e5297e50dae5be79e092babdada07425f9740b5f855ee2595cccff0f59beb1a1e97a76a812811bcab5c1258c100c706886c91620a3ea92515b1e264b92477a20e22e85fb9875b0b3ffce39a0e26bd6ae4cb69caf92411ef69300d9213fb6d03656ad73f272aac55d4820bea22ba4ee1ed2a164b75a4dce6f8edbe23867f3fc0bcf5f0834aa07a2f0171f7c39f39f00e1a0f337de04f4eae5d418073a12e545c6d4ac0b6a48738f93f5333b0e4344541e3e15ddcc9720b97feb1d11cc4876f58feefc463b52d8d36e69c4c2c9227b32fe356d1e2a1bb884665d54c798128d5390a3b77f50d21db7aafb3ada11992ce1a90b65c2a099a493c1b223f3467712a6ee7e457f50cf2a836f33fd4b8eaf3faa464b6490d517cc2eb970f45b7e80ee37d4040e0ee452e77fe49a75dde96c9cd5fd7ad15172a0189d76212ec8e734074e68bf7bf3b4623cf232b70b57cad82baaf82216cd1e3970271f4c3903299b4632d236f2f86707112680122583d8fcd5705cca9acc82ecbc16dc7a7dd1edbd932d3bf1dce3a5494e61f7342d27bcdf807154fbc51646c0e4b0d73262fddba3d785cb79a27d1831dbecbfa4890c1e8915f3053cff7211bed03e35fc504d9a54f883a955aa8e66c6a00fffeaa3faa4037d3f9a15b0aa8bec68072160af8bd3d8e06ffe0d5ede37118511e08fe1b9f9549e9d390e40845d549555c1e7e77d2d387591f12a25343418733c891aad10c38462540bb018c92ffe3d6e3d1860ec517ba130ab33665a04e550d622136ec8ab9cb0ae37829e41a8f0499bbe7c829fe6a94b9653b08b1650800628d5038ba958a36ff1e50d3bb37134a2246c99b66095cb5b091229fb31c0ef7b7ac8716e7b73a189663fd757e832d22e516efa62f506e7b8d210271e73fb3c991423e57e06a39fe5556a6a5ba992d0d76aed24f027e0084c3974315ca3aa6f463d0fe7231291a36b06914eadbc393884b610a1c6becb33fe8567d01d8b748e6c3eb400c566e4b803c0da09b7e9d0121d7e00f74e827172b600108bc9f102a3f25f39b7cccb45e395cd6d25e0faff64890ae4b1ee3b77cc5cf098eac89efbb5c0e8c695a1095c2e0973732a8fb56d38b2a2e55410b0884ad99e2675825a08cdbe218521aae8d0a047fb149e2ee4c3957f8e2b6a1baa4af21352e3b560ecd1f2d4529ce350304a4138ad770b244da884d815dd7b77f165cef354f631c81efd2ceac23363fba8711ac2d0c5f8d9b9c50ba581230d8b4d82e661eb887123b63583e8ba732a1419ee32ceae25eeb5efc235ce1826aac18649404660c1feda7d2000b68283bf014b6892458dc07420b946073c230ed9806361e688fbc85f533b67aa3c628caa2c0688400db6be1282ddf98bd5e9032331ad73e01104c61cf8b8b18a63a2b674fb12f64610714650432484c882b42c0e3a2c2634c7c3e2be30bba7a6118928a4d83659ac340580b7cb568fc62ccab12404a823ec948045cc620ef1082f600bc22a3b597863bc95ce823bc18eb974bbedf7e911105f8216cef87736b8a66f865659ea9fb484dcad1dd19ac32713fa72f07bb699a610127e4d59bf1ebc5cfec2e9cd09d3677faeef2d1e3d3c9920a4fdb5f9d963b88e78a5d0edae531e3b55e702ed609d9a3c7a8485d2ead5edcaba84c4d718164dc3fcb2df1c0b7ae62abc1c2a23b9a354a28894ae566a362af78331a67f3c5a6e96e6ce024ea03e1a107a89e8d7da909d9b1f462e1185065891482ae2570dd922ef7d20c2eb3344c4d7d857c46f8c0a7d0f88c28f6a02ee807f519700c9523871b60ad1a65b8d37eb661eae465497b9fde40c3158cbab95a8a9e6a1883cd52263d3d508370676bd98a594b5f7eec3472403f1bb129b46a4dbf74f7003185c3d012f26eefb55b57ed27c81955ea5d859fb547f8744419cc21e51d32bf9c4b03152b045ab7cae1424a1d32f7504e29d9a88bf00be762775987b9fbcfaf0aa99a75e3f7966427a59540d92e47e6f0bdbafd52dba8731b499cdf9c950067231de472ec50c47d3224db81fa1e9d8298a5a43ea84f60bfb50cf0aa0b7d87706c149b8c9284477b90cb8f8dee886aabac5e2fccdaefc715f63e0f779529b7535c2a0a337526a1e7ca262bc5350021ca8263b82889114e2e255953b8b80e327859cacaf8129c563a24b12ab84bfa7587d132c7e231786860e8fb47fdf2af6b580b83585ae979f6fb56e926d7b1ebb83c0f67f98a42799846a77056a7b391d48ae7c03ccc6833e6a3d75a8ab405687c8fa36fa7715a897057e7652a56993a0089651dd2dd2d4eb7bc0c71d0dd94d534db23b66c47d84c630d3f561d7b122c71cc0a08c50d974eecac8ccb83a50ed673a706d8a26e5a26f2ef05afba959ccdaacb4cfd9dce34a8f80dcec43dbad1d0ab8bd34304654ead9265d0ee8c36b7b20e2fb48897af93e16c5858f8497f6c485ef1ff81ecbd2444e41a37af0ccee16e2e41c7167d12138cac0491d451735cc200620211d5e689814a74905db6deb8568da9fb43a8a6520f59ab3fe4c02711c23254817f5a71cce747fd716704d69b0faed0d78c94ccddedd7a489a6101b39cd6761e426e4df8ceb6f1d6177815707fe044ec24ddc0605bca89925a4ebc0234811e2a0b50f904802227cd6fbc6c09da6109c7223e8d267d06ef18a4dada66cc6b48f4d8625247cd0046448601fb3aa9c76123d9b45c272dd8d362e1cc04e74cdd1a05126d01c99b9779c3c412690dd458768ab107d56c54875df97aede18e9c1fbce42239ad92d430e6d391b65f8a435d708312fe9ffcd85cb764d5051a62a57957196e8effab5e13b5fb55b485b8de1d7797646363dfa39f062b5cdc566b4d33132d60349f1b23880fc478d5829f8ee2b14c0ffcc81e9b9875d776393eb27d9417a75ff234ea09d71cb562e1ff4739f2492d7b9277c0aa8e29ef8ae5793e1ee58c0fd2926620fa4703567ba0a3b9c89665bf11ec17cdb7cb4dfb02a9b018166f99ee23dadfc6dd21ed2f2cd917fc24162e8c37d4514ea9950783454b8b464f7767cab993 -MD = fffd444e93ab3d40a103e64d5dbfb6dc9cf7a23378de0c065ed8513d - -Len = 49616 -Msg = d46fbbabd323c656b036d590075e16e30e8c07e3d41edb07cb561fb7850b9da6bb9e81629330ba2a2212a3ff307de3fd3c8492ecc0469d13b7686b4c5bc3c05e3359e2864d8efb57c995bfc597284e7c807c5c766b748fccd91528ccb33ae64d4588273f8aa55186aaa57009c1c52105e25caea85c0e7adb3b43a05f12d7d71bf81499b4d1dd845fcf2b00f338be2243690cd0aa1b7e26e7e5db192b02045a7155e37d0eaa9e5b893f10b5ac83791adb1d740aa5302a5b99ddc6dc5b0a2939f762de1e749d509fad023ad85c2a60d078067da4c1247ce1992dea3115b3ac3a5429edc30f335b18722193b02ab5d90ec02d0de5257dda7f8edd315f8183f62630b2f9b307f3278e81a302873fad4e9a5b990d16fac6aeff20f382b0c9046fc43503e83783661cc981906ea3c39a263df252667f67845f27f879c46a12be7fde0926a497ab12a3901bf0c14ddd02c9bf2d61fe68954155c0be76e1d687388f3a5423131ba88122adf7cce2cdb56f9fe8b3cdbf19ab84f8911af3c03c4dfa05a2bf001f0ba23b03e6bc2bb96b746810802d9e90d9d2d6b064b2f749e48f8c4bdbf1c7afaec0c6ac0412162e6f4276844e42dd58f232bee5ff318a64157377c7b09380aa4d2bac87cfa3942920461f631b9b9101aaf2c4ff2b3db4f9192142e3e84d31fa300b75fa0e14ad92c8a9ee15afdfc2724a3b7066b07e7ef036c275064ac6e4869f87a76f8b106951ad926802d2b7789319344b82569eef31b57e9897a0a7a036e2c7cc4d0c3dd14e172a17924ccbbc4c6106dcbce54210a5de7c3400b0976ef240f46bfc5a43ec725099822ee4c2958568d8ab7a2414e732f8e5d0a8433f55a203360de43dcbc3a39f06313c64450c2678d34125dcbc7fc14de0f5f720475d2e71b4396d7c7d5cca4b99ad2692fb2817d71e2526d5e2dd3b23962a5511568e7ed39777ffe100c1d09d7c7d52368df140cde3dfe3d72d0b86c32ff72adc14f17b70064f0232fdfa9bddd4292a1aa26f8aa447f8c6aa45108c75d2e4de4a2b8d0b922a4ade381b0d1553cc3a1405e3abdba274f73615d3f43380a77ad923406a177f2beffbbb0304254689377abef7ac1d1192649be27fbf652ed740842ffe91888030c7c1835ce6b20036a8c30e887a3637c8c85cd7f07a09c58abf45350a0944dd61599957cfbca6c7f91557bd3b1e105d3faae3bdcf2d078ee77d85ff0fda35dee72de900048de8e4fa079e93ba9f91ca1f92975bc3de47d11704ad53b30d42cbeacb1a47a261609f62060058ad05a3c88f08e07b7597b0d642dc23fa9ea952eb91bc95f25241f63f5998e5d3bb592d9db79526e38c5f2ce48e8b51bc79b64f870587c1c9bb33920e0647b5cd8da21692c0c0d15cb13fa344269b9d60ec3d20e76eb4059686421c52929ad80ecbe848efd21249ae8c3dfb3f309471b09e44ad53f3cbcb1f5a737c542519b65e1c33aafc1412f7a1c4641d1bd5fc347238d6de13bc557a2de0d09a5ce54db785288c2401af4841fd02b9f1203c5d4e6f61f89b6ef2da7988bf605eb1fdbd444a98fa9e45cb3c9089ed465f988e3e276fc2b4ccaebde032f8a02bb19d93f2c376148600118e774d0e2e1250c9f228273a0311591944f10c452b3a7966d0729ed1433732ad2380de546c25aafc91a2b697cb182af8b0946f360794a055dbc73b23ce151d61b0dfad235088577a92343c4fc2cf27922852c395dd410cb2dd7804345c28a7755e1d204382423d881e66212a91403931d5b17128544aa7c5fd0e5fcc9679b93054c1a17ba95b46715dc1cdf0e073461bdf3bdfb815b657d56410b6b2240f3cdbbb5397956ddc597b76cca869566e37996d78760cc78d062c390670afadf216beba5b6a5778cc5df0920f1b5d9c3bf5f3a7ef9eee13d89b10a579f58bd92b31217a62818a6f333c16d8138c935ae26771b628c024a19efecad0f0ad0e52c1734c22ef46f6fd19dd36715f64d43769745bc2ab427718e717a2e1f300ffbdbcc686db8b2062c8872897847c0ce8dbda06f8f2018eaf21bbcedf000a5628c5251119cdbd7797788405833af0ea97ef3c04916fb10a9463230bcb57be174f10033c4b1f0db45eb6195c40bb4568a91b98556e614320ed8726b6ac0b96ab3d465e2e65fa033d7d2a4d15172e02ede506f5e3d7ef3f378434cdb7cb471b7aba103ed1ae85287bbc7b281850bbb0e014595b9514412eb61f131ff67031d3ed8e16ac0c70e903d6e551b24d338cd6abfebbd3536c80980787cb245be3f1486a80ffafc7f14d1db7be56f49d08c6fcb56bd5630529d403918405e4cf6bb0025a597350ea7bdafc841130f5ee1694ab66234f16939164f9bcde69683851968826e11c965e54b72aa7a487bd2aa61c6926edd0f1e6ed5901f05c9eb780deca6134e09f8909c40e2f863f0455370086c15d9300fee484daa495c74dd98d577518ee1ea731d41504918bac4ec4ff6cfb3873db884476a0106813e71dd74907be32bb62da97a78dc3da1cb20e126832a358d08e10cb858723d8d384b7b89a35ce390276e0c26b767391a318ec485c99a5a8dd743f9cf7823a793b66c2846a28ccb52d2062ba06163b3f87a78f6dc2ea29b00054bebeb6d97dd5b454e743a029e12ca329088862b6446b3027a089816e59f9a2f73439a8d41573a718cefe24803528cc597933669db69d0660c6a5836a5b0a2c264a16b7bb2adb7a781ebdde75ef3010775ec3f915b85e7119aac7af29576b04a7a85ccad5e396973d8086b65038cdd74d5e4105647234d91cf4faedf276a59442f513c86b692b642f9b639458378589a122b471d30daaa62f4b43250cdf3f43c1da439bc5e4224b15185b60d615e38e3c512425aab145401b57ac3fc0bcc178eafef52a2b7b04b2b89e760212f96c4ee694990831858f0fa7c13c245632b49d870a315de5565703e1d6bd62540caa3266931c04b0b20f7c9d31fbba166b9f195ea5fd1c3a9ea6a556673768e47524a086f5b4006e5f4dedc34ef2ea478f0a543878634f747b7600e0fbedfd095d62010c636ae5b4b5d2cbe3c1289d33c57db6dc2a6aded914517c4637e5070decedbec1844599cadc257fc331a5b9203681a714641ab1b292be8152c5296f36494c3d6d014d05f8fbce6f2c477227570a9d8fa6ce7cb1461c4677ca4dc11ecd9d07e8d8818a11863b5605e5ab96d020685ad65b0f97c4dfdb6fc67776b3fb190fa726c9ad05a6bbc344a8b804199bc2783fe4fbd074d3c3f7c4d621e909ed64c8b35e0a2dc5aae0bc20bf6bfb046f8764d4214eb819c73b97ca108f4ecbdef4f0b3fa61a8d2073d4d73b4c7375e36b551a1f61b7090868fe30bda8b4cffb513ae2f6197c635a31a9fc3ee94612fd795692fc92c9fe1fa07040e9ddb8baf5a072ab0fb7430f568bfd99bd59a20803a6fd4050347ee1209eb225bc248b4e2b4188dbd30bf8e1a3c732480d1a01d58478bbaab0d35052d9d82647baf9a6fa1ad90ffdf684287ad0980a8fc4a70ffbfe63042aa4dbe8b399d15f3f5ce9963f32cb5a79d0bc3c4b4b62c8c96a8d06fbdffa894892da9293ff1ecf751860d39e01ad1ae7f810bed3a2bc0f9d75389155b7a39d9d014c08646814f97183ebd98705d2a3b0d32e2a94450831645b46398a03f2c39086ac94b563586fbd1607229acde0877d0870fa0dc0dbf0c6a3125a19536c9dbb8968d1f77f5d84c0453f4949b85b58a4fe65c7b094aba02ce3399d7404857e86802d4abb2a98fb2397f0b80453b789b12b88fe2d4efbe21f72385e3ab5b2087a01566960e39f154f94c7f95b3e698d2a266717c43e411906f67b26cde586ae1e9370a89948d475bcb22177cec6f5e588656caf26111fb78be69e81bdf287e1ecad08a2c4b8dd8ee38699cddf8bf125546f262eb335ec6016a8fee98b8b1a465cc48ac263b22ee36c789d75fe0bdfcf06ba10010c3b4b852fd438e8a71dd23de750839206c32cf5b00ea8dabab5063527cca6e0918f91b94ffec8e99109345b25076f8c1e7a6c4846bf48969616291a301d7727d3a1735eef6f1b76e9fbb5009e2fbb3b2b36715d9911092400bdacc0a832fd51532f44f896cbcd1b1253c8d0ab500309ad85c0a83f9a46fd8b09f5daf893a5e78077ab08de8b4a40aab0044de50eb38225f6cebaa2b1ae9da589b8cbb9b60d74ec18fa221f341f71f38eebdac3b2593f24f81ff75b0d8c8ee0bb5a05641090641691d6b6d14cb949bd4ee3f9dff1709b1b0828f0d0f48d4bbd2d5e3a7049db5f7050b549ad3ba412487e813d9232862078a56e39ad0d0d4eab4e39bd76b84aa18a041a5d0b877c7625ac482872fbf659ee6e743437cda9222bac8110dff26ae4d3fa7a6364c68eeff546ad2d0ab46dc1bcb1cf7309acdd40ceb6a8d7246ec883eec259ff516f67da07ec34bdb20248d2942dd468ab21163504fb2562eca3c0292aea3d7349e893eefdeb537d116c1406e52127a794c0e0795ee88b668137fe2f18e09971c6d8af7947f29dcd91385bf9203a3d924f12c8783d1d5f349a71ef105923f27d50a5f71376608841ca1d8d13e5d79acb428d3adc3ff7f56f8107ff773c42dcf86fd72747f9d3875c147223d1a697a3a507a6b3ffd8070279dd60cbce62cbcd758cf2ac8142ba3f7f18ecbcccd2e8fcd216e5c06d85d8eae627f2c0704d1d2867207ee349f182f54d4fc3b4600b4a1ab4f8c0ecafd9dc3336d9546a175bb5825fc2d2881c86cc6d2911bda735a04961d015ce9531448f6fde6a0c453e2f237fc20ca3f7736304fbb5173111a8425586b5f675668c4670f55f6260de3f37f555304659bde926cb2553b8a4605251fcddd9234bbd3b500f583c5b189194f699c72d086a47e8326d7e978eae2fae6fbdfbbc24b815a901e92cf7ac8a0bf9fb8f3a0adb5c21fb268a6be2f1b4ec26fc0754c163511c6fdc6cd803df4ba9b8a744127c37b5d88c639071e89a3f125677676d9b779d1dea3028ee038bb3f77b9a6704d395fdd8268a2e24fae0c32ea7626ccaacd9f2b6c2bd9bd3590a89719d356675b37eaaad540a91f9ac5de7bdb45d75e077f3086363c5443c870402a49818a0e98e7a22c49f559a647f69f33be7c911438f5b34a067f7906e1fe0d61d16b4c4d4e6f11cba530b75f9e6bd9c15cc35cd68458b0dea29c52efc86296a27838a30cc3f7bff0b398cd32e749138f7dc0418c35d0afacd23ae7e6c4c563560591983341a8330139d6a20869bbd604e81e471e9184391b60013ed41e4ffde6411d31aa0ea9f56800913ec76de7a98867837774e19dd593129b619f1f27ebb8f485785972238d8bd072aa593bf51483c098d7776c420c7cb2ad58310c76b536e5707529b73e84d47121eda41b0e9f5dbc04720d7c9c653f06e229703063e4c7de872f00232160aaaa450f92555ad37f236f4d1f57d36842d7dfde46d217ffd2a572aec800f5ac744486190a3000374fbd837296460e9deeec4f7f9a39b98ec104d8fa6794e1ed9c088e12f3f528543652e5e85891758dab0fd81253ae7219fbc0611cc7280ead89bb020237edfcb09da940b74f8031bfe20622a15b796a29e8a4b61bce03a473a3288df1bd5da1d5ea8b3ae8615b6abbf99ad63399e2c845f0777fff666fcac85216d5e86d90424b87c07b817869470a5a939cd1f531b5f67b0063d076b2a833fe4c82ee2fcd0598da10ac8d7bf3f1336bb91b8257ad58c3f1080b97e515673c0f933d0ceb5b12464d437511524190be96d4fc4ea79fda34ba571f5c9de02f6bedb3ae49898392dd46207d17e59b4b3442abe63dcd4f62d13eb54625855b274900747cadf18dade32f706da61c494a1cd6078258b2051923e6ea28fc85ce785db19e4f400cc18ae26ffbecc7df92b6febcb078a63c0926b118bd6ee88580492f66f8d10bc06652616e89a38116c0b7625b6e6f2f54a2b2033df8c0f26dbac348884ba815f6c62ce994e23adca91974d11b0910fce31ae5a2be61c52025c40e2f805f7c669727410149cd58e080e616d364480214cfb7e61501c1267c96e6516cb5fcf60789d2b931f514a596836ec4ee9ef4ed8002c2dee470df8b0ea668b5888eeabdffb60fbb01007dcb059bfba7ac31d57b466282f49872859add3e91610a75f07a5604266ffad2d16f35aed3e79486b35270d94151b86e79fef147aa7d7ad1d8d5155d5efea3d3d73c2fa53fab2e03561a054e451cccce845d52a7fb336109687543a80090846c59d7fa69871b0311867c0ea8d87e5df96e600948cca946876903e8cd544c26031deb9ee1f3609a190a1f92d1409ff257ffae1c106507b1b2a2260db3a25b1002ed1e24f4cba27b81abad99b0c5a61350fff096e90d762af2dd87b84432e5cacf8f18938c56082fb231cb2c2db1bc484c35cd7cba0e1e3aafe0cef4674b11ddd4cb82f390ddbb3d15642351304a081ab36aeed86bae26685174a2c6043707d0776b044de7a8e32d110b5d12a1dab310ed66fab1e336b63d4061ab38043cf02b223545a87bffa6880df0217768a7e4b362f19a100ceef840e56f92514da3f4773cf3ee0c332a2fd573d915876efac4897bd376fccd1d12f9a666ff19c8b43a3b2d6ba681f770a49caa8fe44a991a7b1c9ed3357d0e0c2cf0ec0d99995db6ebff5c661610af1b2e661ada34c8d25130f434bb7f9bb7046fae202d09d8f5f32e4c33abe6c04371f4b92b81ae0a02e50b97a651fe5fb14b02baa88ef6de76b12ca81904bd9a9cbb1f20454ef9170f1f358f5a5e57d0e2290e9ceef809b4ca390c9e763743a4a040d620d007bdf7e347d664baa935f733e8bbdd5833ea61d7d3f7b3b30d21e8384a42433475a4b364a5159c2dfc3eda8ccf3004500640ed87c61571364eff6e4d1f8a10d96054527c801bc11a1d1a83d62596993d3bb461c05c8d5f68c2843cc508d80f289075dc1222105aebd572faf73314248798edc46cdb8805b130595c8a4d51c987ccb05a0dd11bf007ecee45d941d32e95e6941e728c2dec7a6226d682361fc55fddadd357d6640ad62a356e6296fb3ed1ec5078bab7a59b291e92b0970b6a8b198c134fd7791430c057f07d7c7cb3dda274cad92ca4179a282d45f4b01359a41b9f8ad6750153eb2d3ac6780e3923927044a949b09aac72dd57e8aab4971597cfdebc7119b848c1859c6069001674e5a42696d02ee38caab26323d88ddfc6ec9c134e27abe41c3c304565573a5bce5ea4df39778ec5deca0d1b9d882233922ce904eb0113cef6e496fd7e4ba3505886d93a3945b889cb5b5845ffc15bdba4de207a390539beff40208c534c253d3be4abfe3f4394767ae4faaaf08c201e228aa83de03d06fb5fd834b98b62a7699e0183f2f2770bd613ed5b1219f0594635b9e91589b160cf3d343c4dcf95121daa63c7e0fbeb03efc0fee34521f5ee9904f14bcadc683180c1dd9e11c6ee4ca18794e18e01a7650ba7a0fa0ab2a3c760b8bd3623806a5f57155ac4ca19743e3d5c1c37c4adb11a70f05a082a7103cde278a212ea1ebfd39c5e3314436f30d0395181334ca7130966c4b5756e081ce6696d2a47e55d707697c7f1f8437128ebdc904d3bed96d519374b38a99b1ff6fb3bbedc3ddde6832f90751bd791c766756f3e07b96e22fd3429ac6b0d7c5d9af5a194405c996003e5ce933918f618f2583a86381498f495418610d607d86b0fbae317df0de374f5829a47d3253a0cd27a858e67b433b4a427949e020076f05d34496e40b681ca63ed3cb97265254c10c5987e1c01070a33d09c7f76611f958d491bc2ecc13c09540efc139d407e80b41fba7fe063db9c4923e5daba909b02a6e3a03a6994dcd9d1cd217add1e0f50c47235b939427815ee08b9d857f7b2deb0e921ff419929e4e112f518b9679e624aa54f53b206a71b2a675ea1d4fc2cd2b443e638fb36ebcf8cc5be15b983f4614da05175d0172e5606281d5cb909d085b8d9370e20d5e945dacec59965dbd9f3d64b83491dddd57089343e318f8567a0c7935ca937ddececd41552cb46d515c0ec8e2cf420c1660ebc710949dcd8b9cae6599c30c8b6bc6c8183add3e3da6f71975195a16129a7dba5c8c6cc2b698eac1f1341cc5cc7216eeafe1ddac453b0aedf7c0776697e627c4e21bce201a2aeed79a991a47a7ae39a156feb0872a6a01ecdf7c89bbf295d9cbf6534b1e8eae136fd03d5e1aa36c9970cbf6084743d076a68aa2039eb9061e1ff7a766467a9ee2fb10954aa74649c0ed7d4c277527ead3ab97d5978761d35f3154aca2107489e7f9fa45828616a24a67c98590895d35a34c659ba7fe737a37b0cbc78104e2db9cfcfba2782f8b1290805f26f60c4a3d50399248a77c6457121e9b7c75bc6c107c647340ae1c1a173db79c94aa66755e74d3ac812879cb1688cb6250127f76c4f0d11fb496d45a2c9c8e1073303075358bbaf2b9ad8efe250657bed6c9f68975b4b35f62c4d0b1df5774493729f2b04f0f4023769924a40f1533ef750e8a1a8f129b90cfbaa9c78bd8faa554fa15bd076a13bd2c9dc323312ff092bf72d2a09da4fa727fdab7e1deab91c3512311f1fb46960e600de31237d10e371a8948c20de64062e7b793b72449ca01b0279005970f57b5a57c1ce78f82fd5b1aa454e57c411df08bd3b5be192e141ef689e85e673ec931616ad929a4c04e5d34669f81556fd399f0b1a64d19e2f04998ccb372f85f7b10285c903f241361dbfc42812c15ad01cdaad3ee0aa2e2ff301b6269c9a6dbedc06ec3eabe69e6e855d -MD = b3327b383d73bc7b18368f4180f63e26b5819525980645c6943c6eac - -Len = 50408 -Msg = 984e1a22313c6444064cca92e2ab11c75f1b4ac5aca1b2e48e7dd68aa55ffbfcf1d8bc73950ff573dab5e058763b7e320f4239d2fb53c7254ad051c1062ad5beb955c9c7307901707febd2ca455b7836314fb576c5d0bb0a5a624cb9653a206ef8ac87458ce34fe6fdd4e812d674c67bcf2907d9947f563ac81d0f994af7a3b3b7c53f1630b3a87b5d5a6a55b1ef31aaf0ba7722efca5f5e9ce8e18a3dc92836fd883861a453d4d7a6649fbe5f32816b9de94c7a5f18a01ddcaa0cb4c718759ed2ddbc4f71299ba3e0d9d07267a77e65dd9ed0086bd2df20924dd63e6f4c54943eac11081e9fc58713a3459c51b5ef41b8c149f59b5ee50ec5b88851becd8ac04add80b3331b192a48a94662a6c39ea6363b006877257a907ed369143b04e2c9fd5851793807603587d31beced3b513d60f23d8a888f654ec486c3b06e5723586005cc81b6ca624fd6090b63ae84d1ae3dcf4882550570ef9fb9dc4cdf2f141479cc39f435cce7213f335fef7206e6a0d5ba687966ed611c1754fe1117f57fa65296dff93b75b753c93960b7bf2957bb319ce69744b0017c353f6f279d0f2ab5f34907b9522d998c7c0353e42055eea8585b0a0376b718b8006377b5f9e7ddea62cff95b015c5774617a839d1af2710f52e11ce684696e7781a660e3b4e362eda90efd08d16ab7b47f84370b3768a99728146467f72dca62bef170db556d8065d0f05be848bf82f4df0ab656fe1f5ee9e1de2aaf566df620c12df1c264ecfefadd5c5a22f0c37fdb87f549a5f78058ad8526b5e52990b85a924029c369c8a555da3943df51df7812812b3820abf15e8a1dd44e32f9fed9b837146103ed683d1ece715e46f1793341d596cbf1a1db3a28b0cf3dbe4c1e21e1ba8fe0ad78368efcc2ebf3805afb7a0f891d4a3d61a7b2304601cab0ad5a577e229bf0e790995f98bd8f4ab414cb1324a7a7fc2f74bb8f4ae7513d31a1194536781fd7d9bff9799ac745ab0ba553c629361e2aec6181981d9ca7dd68b2c4b1b2c302dead8cbfa5a9e8f55dad97f95dc63f691c9fb05f97526cebf37e67c1649a0b2e4d887f51a96d2987a9c172279ea2c9701a6eeabf52906005c79a48792695598a6c9421184d9091e3d76fbc445366dc1b6c81960893807fdea1e5de54be4bb4fe82f9f97c5bb729f22fe1ffb842b9805259013ca220cad15cc987b0bbf6652472d9df90e6998cf89af83cc2ea3444befd2a1665f5c1155e6886a74714948bb1ceb76d6cbcd1b706c47cab8e44f0af9d0428e7986940092feb226d29c8616464fa65cb1767c9e05b590154ea2d40a1264f989d5d66644f4bcbe302e040259944df2b2219504aae003fd05f5e0deac260c6c55f3c54f48fbaf2128ef4e3a8d15963509af8de1bc9fc6031f5724db7bb5352f656be9bb9708546f638eb18b1b5ac6f1e5a3e7806da57a26b3eaf536f3407d972aa6aa37b9bb3b1d9294f490aed44ecdb8b7288d18919efc8619c88dad485448282c8d401b84c1a0189a7dd79202ac0d0541d75457d4b2e8e86c254bf44d47c6e066197156e5968b77f7c3cc7f664d545dec6a72a5ff54706d7a720e82cfc687e60bc527d65e085433355cebc19fc118250f58648d61d217879d5521b3206effab5626f0246ec58edcebafa1f2ef95eced3337a668bcda62c97d4542101f9fb2930d9546cb982c9fd78332bbae064a3738f06eb4e250cbd69572a8cc23fdd7354f6ab6b8365acc0ba5849c653d444c8b7abf941c64de34e79e16164c595ba3ec3325f1a0ff371256e978334b3b5a1b4e35091e497ab5842a25e0142f4aa9946be0a7ecbd70adae05f5c6adda22984513ea5583c89e6767f2df69090152781728da68fe5a453eddad5d08429e7d8f48612d3d5b263a742ee62d098b5f1b37baa772f1ad03e76b4f91a1b5c814c6cf93ba50190acef95c6778815a01950f78ed6c5cda8f36d1a37267564774b978a9b5841581293f3590903e8ec3124fa9ac2dfc0a7c0b8f9e77d4a2dd35ff091dce3c62c00e2d0389a1378cb7ed23eb6451fabade6ea86a9878e4b8b929bd9020ad86bae2088c98601edc077f30bcf4da0ae23d7b1aec6469f7213d7c6b36db2bc823011e08de8a4369ec13572643f8852762f853195de98da3188599a2f136899eafd9b6978945ce02e654c2366f62d047fb8fe8e263767ddd49458349835ee4917bb96e3d13474a7a692062f985d045dd2a48befea397b53631e1ebc763a0a75115048762132b5350d32a9be82dad70676dd747c674c9ce2e40df15b4f8a85c5e1a6fa48eef5e72f6b2c7ef7add66ca67349015f27d99132614b1a38ad8d26e08ea4f384c3e5d240c868cd03a0ba8ce6d2d27abdb24623ece1bfe07d17abb76f20317d50256a3d0e2dcede0ae3ecff6e9a5f26c18efd1ab86d518d4f164cfe19a037ded49eecf241a146f833ffd68de5d3d74e9045643e3d0ce968d831d8c587159d5f3ab5d3b7822db864a67bdefef486243a555fe55624c66fb840f0b7d260874b48a7f3875579d80c6b8cdf6e1942ba2d323662e72c14a3cbc6afdb51ed4dff28e145de7094cdaa2a530db4eda77877da7e5bd8d286b6ace6da4c7b0ee0f6831e713c00f73b26abfa645081c3703dc51365ed480d2db2e8a63b3f575772021e1442b4e182142ee465e87ece573c3aadc030143b02e9af60f433b1f7926a1ad5f39ad4077be58a5c5125be2413d31636c928f7381881551ab908cae42991e5b2a1c2c4fc4877e51ba86439095efd7a691692bfc7b7bf4e20db03b1a582af0cbc0702ad485392e52a50ed1608a0810e4c90b9937047693f7a446c8fc2078c36fb0da1b77102fd329033087ea6422879ea1de49cbc3048d32eda8b8bc41eef0c789ce90901bf82755537fd996daaba6448a65a0232db24b04687a7ce3231a1353a9a20cc80f1e7568246138ee441ff76701464ec5baec57ec9310a7f94a76b5a49f18f2774fff57c1e479486936fbe58694d4a82bd12f2e6c0c2fac773e81323ae877e43675374903121c6a8039dc1b13b3b54eee270758f3221c0ce555c613770463547e0542c39c4bef21dbb31ce2aefc5ca55522e14232736a4bbc56b1f3f9714fb5c686ae520dd055f0c4395ae6b8bd2f3e293b69847a8e9edb6487d13e22cdb1aaa86fd66ed87de579e242f291b1a4c18ba2f6ec8a5bb22e5e968fa06c93682d858c2757847c73120fbe56906e2a11a8108aec06ee56bc9d27aac4ac19cbdf17e8fa43be3d6a7e6034a0eaa0f6a2a2476f2961350afbdc6fd919cd50902ca105376b5b56f432ee648b428590a58bc523fa071ce38a9bb01ae57c103a9a363c7a1367c4ce33664173760bae0c057608c233bc65bec7e6c632df3a23d672893feaef681680956526218764ca6f90d1dba6beb1e2134d4d8d2c18ec8e90d395f9dc4df4d72a74cffaf322066137c22fbc460d70088da540837b350b971617dd18c291967d086bf74e7ce84918f133f02924728f4f8a4a5037b4b60ff3b2c9df0b325cb57ec6e58b7f034ca5482840c3b0c6b0582d95c6fd184d1e722b13540c4fa021da62d27bfd2b4ac1b38549830ad1b13973393c85c7b3c8d0ca839460f564a0638dbfa789bcc1a7e9fc46d175460a586068e8eb112088ac7f81b3d25b2ad897b447ebd2a95ae09f17d8036c91f5d930d791c33de398055c6d202249bd0d1a1a76818dd05547f6b4edef415763aabcef01863e8197aec87d3c3e6567011cb78d3cd30c2d1814727dde9a973e54c523d770ced16287d530736f34e3b6c1fa2f8469b4ed456c30f25e6c726b9dffe5bc7ea7d4226d4e9bdbd3789c23b579f5e084af9fa7b5cc3de4db19ff34d2cf8cd569092e87ee56632911eaecabef83c088f250fbd1faa28bc87869a999994e1b0d1b2746988239ebb6b3289ef2c189ca77720061e28099bb1bbace09f03df610d1f984b4dab56365f33bc43b8ed7f6743a78306a6fe41c4c6d16c988df5d422eb2a8a3e1a4e45d927d10403ae69f546e5079636db091a4a02b10eeaecd63cc952d9d0755adbb92d192d52f2570842e0937fa1bf47b15cd66e43daff420edf014a14b11994b97ada4030ee383e332ddf57f7ebc9725fce0f107017ff1a058570dcc3765251505089a1c01ffce85080e83957bd7be379399ef21e0f12f922f6be0fcf6847180803e246c62f66dfc901a640875ffd2269652a1c36085e69cff994ec1ecc2171495a8c362b649faa0479be746f1978b7951a5c94a14b0ef174589a7999ed07e47b1e3079d507cfd16bafdbddf833142b6720dc644520481a77d977c0281222fa06177518ae5f1ddc646da38408f4f804453e51940cce346a4145d3c9b4829a3a520d041a9db6b2545979be7088a54dcd993e632add9ffc6b3a63589a2386962dc7c884878952b6c1b19cd5a9618e3a0bcae6bb309fd9c5a5cafdac3d5f663e59ce0f9e675c7c50a9d49e903879f7e84840ff01ad3cc5ba9f5ad977ba4e6abb48cdacfac3fd7ca8962a479624ba287e0b6350ddaa9bab00e150c16217dada35822e653fa2549ae70f1b5f90750b6825dd9ba3f52ea4d3c2f3167a145eeafdd38d5703150d491e359d0fad25345301054550bef4413f84265e12cf3697651cbef3b24e260bc44fb9c66efafe687c3945cbea6a80eb540854a9ae8770c8357f1e3ca50d17a4ad779c15a00ec2196d590ef7d16f4135cba5755c516969fb416e1aee9a0a93e0ecdc050f0db11a4f0ea887526d95e1268ca4b1ff623fca377131da93f80b40c869c61d3e1dabae134770d96327a405c7804d2f1b4bcf3a85ad0f87b227d9c6630d7f0c2939c3256c00f72bb26563571e8de7183773e262ecdd5249d48f3ccebabe4ef958c7c328632187a6c8909b7f369cbc93dc423fea74e940478098fb00d3657a0c5431715eff9266712c111425149612c99120b07925b922aa3eaae003b8eb4c6fa4dd9570483bdcb6664e96f0c26132e2de75fbb708363f99962db18071360c47d035f9054605339affb1e98847e764054ba9e94e2446e13d1189371e043002bf619f64c602d6b1477ea1d496ab0eef5a612442e381d24ebe36263a867bc075fcde859d5a8398a0e56b8621c2f6c01d0aa74fce2128c3cf438e6c825fddcdaf29cf4e6d6bd131469b4fc796b331e4343da69054ad20ffacf4a0c4d6523341f66cbc629c9ef58bec92b1cefc1264627d1ae4509e3271702dfaf494ff07840393ed2e29f29df68cd9f219021a86952240caebf8725624fd9a7d1245c625d8fbced5ad0b3710dc1e57e20fcbbab8ce0bc57543ee99c1408d3aa48340f1553811ee4cbf70329eb028ac8a1c91a24f16075341729cdb1ccd0a5698ceec483eaa2d3d79eec0acf079912113c7bc9bf476fe33590268ff0fd45b36817bb0958939370185c1636dae3f43fea599b46d4ff4d6aee37bbccf415b68228612f69eddea178398c0c13d7f0a258b6719e2e0079b780a0863ff115b6d1962cf1c252ce3c7b50bd87442e40be31f1082cfacbcc570cc8fef44998e040f563d8521a40742d7f9e070644f29fbd119d41e437bc8307dba87c1a5f20ee54b07fdd0a7ddf7a322cc4c86194ed5f7ddfb2061feb8cdf1c92b38a50f7259a62814e8d73837c4aeb114954319a9b0a60ead3c7687c993af5c05ebc4098136eeaf6547c35b1a350a8bbb04ceeec682b16c1870836618e2133f32e9451b876e65e6e261bb99ee1460b8a7e1501f0f13bfff2204b1240b82c579987751cdecc9b4d77480e8781c275741c274f035ea2b79d0b43f27480c3a6c1221e010a8180f838a01ea72820a37982df204d7b7c19187e6b76a0e5a82d4b013b46aa9337308790572e8803f210bca8421db2c2dfb0e904911cd8de2d5163b83385f45f6667c3f52b0c23a36c96d964f363f1820006a3c02acb0cd696cc9b26a97050b7a57327d79a2c0c9ef6b23a4951979c317386d35186e5bf576b1b5c0d0b8a52446aff3da802f2a55f26df69b5eb2d1549a0bde209341152e920ba10bbe8386b7e3d787fe71414705c839ae24b2e98ef331e187a87c0c28a044e2563b3be0f2edd735b69253bf6002f83513e69aa6faca65222e73dab7da72149f9df950b72feeac33483e2f90bd740acbec8a1dd15bfebd369c29b52974cd8aa83ced04f086e1e93804a90c9ea682866203b74452fabac2859973154c3dd82f66fbbe5f733fee17abb37cf2d06354f5611e1616111f24fa78edf903077fbc8a41a4146928a23fbdf61d5eea0e3b13df32064e9bf61264ef755f62864280a024a2fd992bf8f7f963800af8fa4078e7ca3c8308dbea1aa329e5b856a7e58aad83efd0f3acc9854792b142f22d4e60f740e75decdfd380092f31c07f6dd9e30a3192e3caf485954fd0f18cf388213c6cc89b5ba1ae9b8dbd88bf3f82e004d3e1b6f1fec70c126f39a8a8b2a3159f536debc046d0502886e8bff9fd0a084fa4579876eb91fb5a5b2e9f3e7aabdbb1ef232fbee620ce64b6b15946c1bdeea29c96618771d1c943a1563f1badb3e24056b61ffe033a2f356441e00d554399e605c6988e572f7fb788d80fa813623332d14d40e665c57b85d7bfdcb87f451101250ec6f26652249d59dc974b7361d571a8101cdfd36aba3b5854d3ae086b5fdd4597721b66e3c0dc5d8c606d9657d0e323283a5217d1f53f2f284f57b85c8a61ac8924711f895c5ed90ef17745ed2d728abd22a5f7a13479a462d71b56c19a74a40b655c58edfe0a188ad2cf46cbf30524f65d423c837dd1ff2bf462ac4198007345bb44dbb7b1c861298cdf61982a833afc728fae1eda2f87aa2c9480858bec6260b1916e8e7a80fb12a60e60fddad614f7e9f6141b527b85080a199b347b20b984ccabda1a631a2f6fa8c309a10ce5fa0e4bdd3721ed9d416c1359c5f77083c0d896fae604737f45651b68262dc89834691eaee0d9b47d03ffd1bdc57673ffbf8596e75cf4b295851e86647d4814d70931edd0d5eaae0313e8cbab65588b7bfdb254d80291294536c2711fd79bfa8ac38e3dabdffee418b850898c6b46c1e0c3885936a284df78a2786401fbcd8199a8a798a7c5ba5ca23c5f94c9a0e71c14592f2c6a0274dc140f69e872b387b1ec01a5852c51c8208ae53c73c8cce4a40007ce55daeb0a2902c6bd84dac571936c15af8da249d038b9fc10aef3b7e4618c158e5df024eecd2b0f9bc1a1fa322eff2eee36717679aa16c802ceb128905ca1ca96cb1377c7d076312b262f1a738b8e928a0b01a06c8088933b5a69e9909c256f0f27aaaa3e3bca76973beceddbb0028aaa91bb8e51c2f9a3e3da85c08b29024c20fa1f86fa1511240488413a13a7415e7652050acf76504221d66c76290c1ea9f2cad9d3a46632849c9694cbc278355617d548da8ea675b61dd786d3134c63ceac224059e33715de87ec4e669129c4bab5a2edc737594f4700643b9ef1f1b7027787bcdf608fa27aed12d8d428c4d8d177425a997298c83ff206f3a16a04048f7b83b52fc276c19ff59198dd2e5058e4863cf918e66ac7e41a4416a2278b31bbdf9d930fb2f45a97c7f0f8484cd62c3b0a18310c3cd73580a1a60c6ad09126cfcc5ebe48d81255a88cb75fdf295d3c1e2a5f693c1be7f859aeb43dc10c1bcb12694c9fa2dbd79a1b6c6f35686eed70d50e980b712ca3f9b76af7126e833308cedff19ce4644c11388e9fe1acc28eb0a7df4b7e73171220e4fdf6f13bdee0c54955d51ed81a77a3461bcfcd73ce49e4dec5002a0a833c56278e3943eec52beacdf47e8e44a662368f3a8760853925f4c0e74077fe182a81c745497150df1a5fa0e37652f1af15b359145002a9ac2bc8966e92cd167fe38a0d4bade129d5b80c0a4b45d4a7de9603edd1b11ba9cf6248a7817f941b606f5a41c8edfd414e0ad95554717a2ddbef0c939833134b49d25d3d498e34d662d7d8abe3922c5ff31aafc72584ae4d4d28b892915c5358c383ed9eee47150c2e22eb92c523d54d6cef74aae706d7cddc47ee34e5b74197e47ee11397329f886c587d40962862d160911244c17d5c76315696bfbcc946d255ca22e46cd83b11c38275fb7d2a3ab478096fdedc73a710f45c977c3d1ccbcfbd6f975996c04f6edba7ba0ca2b0c5bd5b5e75bf606f1f63cd62dbb391373657c57627ba3d7245685dcf36bb2e426bb6b1980a3174fa2c36626f49acdfa2f03215e6bc4e887783c7f102d04f4968946524c0187a409b36535e8bc9ae50e6622854c73d5ea05673533e4970121aaba8945adc86e3eddaa58067be43020c8af3012a219132ad977bd3edabfe4aca920f09fbf73cb4a33fe28625119ff13a160a8441fda212d6c30511a531634080a6318db01622358953532d428bc5c10312117b3e625746436178d30fe2853c656d77e7214320aec89d613c63359eba8e076faccc5998151df93ce2d3c64d85a17147e1f5851e6687a5747d32151026047d8cdf91e94dc98c13b90698e5a3655b3a0a41d4e504a6eff4f5b65736044b8cfad0de351a5ea8b738570606487022bc4e29d06869bab628114ab07a9d63734f08a37061f4b4fbc7ef7eacc6f69a05eb370a56561b28de5984dd33425413e4742e6d5cbd803509e3c196be80f70b56107d179b49033766abd615075762fee624f5966bf0c5ca1c34350705db54a95d55a6b766e728cd95458e59f362cf0ac387e38665a3cb5c7ae2d3394980145e62e03c5180d892d3b44f3413c00ba321c1c482a5127d9bd16c14239452173f11acd9c74fb2c549320bf351aa36f9e72a2a045a5c39273c133af2ae81e747deaa8469cd18c25656d0e2576c861dd5a30d446ef111a448b6082ca5fb66d2b8f71032b8d8147832c09781a30d0f3d46ddb2582bd12d1989129a8a5592acd913952dfeed6fab9e028f6e2f00bc -MD = cfa7c3f12054db27ab677227b21948cd4aafec0b179027dffd033c87 - -Len = 51200 -Msg = f61363eaa08cce68283076fa1ba17ffeeade05f89e216891c703e7e0b5e671e9eb94b763d12486bfa91e5465c4df1941f63e607e476f9d91eb28c17a75030c46472422d94d1b62eaeb0b734f330c1f7b5ccf65456f81c9eb44f1ef56adf4689ff109ccd37c3909f3d441fa3fcff33cb404da3dd47f1d95a5b9a59afcc7822efbd18bdcd9c64524e14e0712be005b16f5d6a60fb3dd0ca9c9318ee9f529750663cff47b7393095abd40a4e3532e0b5545ba7d046bf315ac5e96f205c83d9597ded38ad02a4b4b548e91619486c1cca2ad98a544832802476dcf1a15fd69aa8a74c597048556d4b95c2b864edf2166a5345867f683e39a21fdc44e421d177b862d8d613e0d1c6c3230f55b38e7b7a105e2e20b42f38ea4e3165dd6b4afaed134121331a74806da6711d7277b25e9456abf1ed9515c90e934c082f9923b96743c2a404e67c07ae8ff07b9343e2120197ed4f4194b465131bd041b000449362c457efa02a5fde15ca31a83c8aa64c5e6e6284d125837394325e910333462f8c1f7142a938985a4fffa531d2ce7753e744dc30f0d9eb9b0e9157849da470d43fafcf6b94a3ce22999adb970a81cdcf58b59ae245248531ee935b8ae3d68d380a0f92c8d6fe69cdaf263546283712250f3b2f072297c8eeb0c2cb128a4bd3b157b99bc904aae391ed1c52ddc070fceb9730191e3da62f07f1aa36b9d566ecd6b5381b0a822bd435c007a4bc77a1e6897d5ee9a5eac240342db41eff79ca411eaf05c0fbf413b42fe452bb70925c57952df2012cae9e74f9d17af441cbe8790fa1ad0e2bced4fbc6b6980778c502d88525a400111d7d65bf6959472f6043ed104988530876f213b0b34209536437e1dfe0df5701abe16afb61e99826bb5f25c6e332501080fda46466db418f145dfc0c0c2e865cde8d2d3467a667b651bcabaa2b3555e2714a26684dee309a49f78faff3fc1eb129c30500c71a265cb7cef7206e0bf4dccc8a0212d4d566f379a7252244d2707d12158ac72caf5488521880c04810bd9df71fd02a983b552917cf55195b4c2c3f2c07372df4f092d7a52be110360e1074858e08e6048a7bb9c8d287dbb3c3b265dc1a927bbc6831b9457b9086b43e7e1efc5724fbb63d4b03f173461fead3a38fb6c21556df80e1bba77a079a3f3c86ebcffdbcc209ee53c62604182c7ce6602b20804835fad5034d4fb9bec15382ab69850428df8bf8264edb1766a7c68688b6bdf793af8adf16ecb2bd4ea28d9b6c269fecf1bac8f5232c952fba08743e7dc0f37a901a0bf9ad1854f70fa44a013991952acfda2d6feaddc8bf9ac4e278cfb8459bc60bfadf366ebaf9aa5d153e9438e94febb445c2ddd0fa498173bdcfff2b48dd9dfbd3da334e593787237bbe2c9b20cf0def9e888cb4be4ff67b429e7c9851b2807033853435c4232e9dfa0a4326b02a7ed2844b77e7695572723d8ed86e14ad25ff765aa9c3605f1922fcad786a3bd4e703b3661fe79fdc7dcefafb833af63ff70028e51465d24ddf6900024ce41860bef99872e543d6478108077f1d7d7aed6c08d79ef49b7e71d9c6b0c33112da506f3aaffc887a914914a3ef73f7b407380d9feef2dae2e95da0c26b4ab574f626903d665d49fa4543b1391f94b26d4fa2543beb8b37ca9783bcf2bc134a88f0459a88583fda5186b9ef2e143bce07a8aeb84369c28bb0fd6696ce0fa780dd5d500691f1fe8a0eca2e16f969f3bb11a6dfd26cd6334744af88b6baf291c8d091b86ce0c02409808412d1218d370a29de981b1ead480ae4126ca55ff14cb31131f135fb4f4ab965490a964cfa702bae947a0abf7b9b471dca84eb137842b00db29cda580bcd1a0b8d67eec24e59a02e7cf819e5bd878c503c53e07c141e4024981df27d6245cc11c5dd3327d53df807fc84d117ef972b39ec6c2e004139f3f466e6f6d1ff2f1fe686bd1bf43bb7a3e9a7c2b8dc8e64d4295f304c268c204c0b839a600c4ef3a6184499f1adfe312441e314499a166af7bd09429385515ba8c892bab672be3dff1583f67cbb7935098f530bfbd7140416438f15cc733d66aab9f8aa72abe9688b6cc944e5b3595dc4405c1c581a03daa08b352c3f96acbbb26e49ec1d2e4cfdcb9c9927e51c0b05d50382b7e6e9625926c2afe865562bd56043eb122e604588301357f1f35bfab7bc274b8110bbbc0a39a863ece638473e24d9709f1ee88f72696faa458909c4fdfa4a3aea7e078d58399ad5ac3ac36b70809d6ef5773d7756d81fe4952e9be6431fdac566776332eda71899a8cb7e14f7041e3ab7cfc5999ffc92bb635c88db218d677f87a545591512b0145520cee04c1fda6858711762d8576673228b571003d36ecdc070347c78fcdfca53c34c39ea34307c5a03a96f7a6919c065339d2174825f349370970983d62640073b6cae5c01deeb2f10021c10b21b17bdfdb18c0e0ac748932f037cb03ef209f1e1a6aa1bd9243959fea7f515b2e8ed7f424abc1add157e21f3f062a887e18ca66e90a9945aaeeb6d581186f3fc11b62b99bf4e2599e849d267f447b751634c973aa1496fe6ed75db94b55e55fe0406657c859ed891be3017137588771c05ce36ce5ef6090e5e6d273d29c7a6296e529f63343a8e74f5d5825efac1625837861792303bfa418045c2c9e56f5f1e8f2f4bc651bdd1b42d8e86d30a7f03967708bc4eab87be20d17450c35ec1fb3e04f0fd4e54752cdfc3dfb6f80b1dc54742ca972c5765bf1ce08d33a21c4c05185e4c2643b31d0a48675d7536a32a31eb39403ae39a5287a63c04fdfea48a072df995595f03f1e48e767c44273920d412b91e19ed0adaa24d226012216df86bff7570f8e8bdb066227fa0c64253ae262e4098a6a11f6a9982521302c2ff03bdfd4043a78946c4e9a4f18f6e00790ea2ce7e6473b84e8ed7d649b2524bde5887b7e8a1c7a935abf9765a8c9dea1fded443b0e6039b2ec3d7c957b29334625333bfecffdbd110c21027491ce887ceab255e86b1d8b2268633dc2a98281541804c65bbd276896ec3c8281bd4d041fbd0205f7e3c55a5cc62567f20c78356e26c5c59d3be1a4a861d7c096138d7a12e0a5fc6f60a2cde96c4ca22e8e55781db73cdfcd307299d1d3bc63ba7bd813deb963e358c9fa0d50c4a0987d165f71e73332bdf286236e98aab114f6dd74f60ab20462bb0616411934e8eee78de0495702700714243c4c854f7f7b5121aa4d1e314f209ffe3e92cd26ee4f74d91e27f28cbb643bf2055a2128ee3fd330c23da3a00dc60c9bba28f30178612de36234423ade7c70d8c5c1f39ec50984f004f0206606fb0ac4d12a132d4fcc1993f397ce729ff8babec6a8841ace806d4ab88e1deb0268a261ccc0b6123b3940d21b791e9dc880228c4e385a02cf4d9526253e2297c9b5db5bf31463180350ab862002bb241fbbaf2aa698ffbf9117046d9429b8d22289be988e4ba2a771b861984b592c6d6d52698016f2fbbadc87c3054d776604d78c5101e590fb274b1a6af1e4a7f9e279ec5877e56bd45a7745d9d8984fb595ae679e7e4009f7005a1dcf773313abea0d3285f55d2d14062cf84ecdbdd92ced70c2adf8e6de1d9a666a97147fc6c9ecefccf7e3c4604228c1482bcb033f5374e54484552038f55d37a8caaf12e8db52e861b62a632be727ffdf77bcb4a6b293d4962d7f363f08b29480713032a06983c099cbb082b78a6bae623a871638d2b00660b05c701addff469a937e2816fce73f1e3d5f692cb35c967c7c14721d3a35444913d615f2fdad169d38833c731be62d95141e5fb1eb627ed3464b0f7d728854f960d46feeee25c9326826b5df4fe851a959d4ad6eb8e5300f9f14377f0313fe199f3dc4373ace2a002c4fdd811f557400136b9c8ca54d72d99057304b743c0c51d6fb5df4680f00b08be6fa8213955e424aca723337020dd920fc430a4d6d44480ff5824e015212e98ed45509b310d71806d9778af86cc9b657ebb8e4170d70a751137b6d8cfe29543cff363f882fa72a5080f5ba6ff36d183d0cd70058845615a53d8f78917b0d989d50e44c1958951f2fa732ea2400c3a9db47e7879b39bf3b115b07979930865eb9afa957eef46b9fac367743a0f9910e388532a0659672c0a0552bf42b875c4e9905cb88906cef54ce150ced6a48a0f25cacfe744002394e571343b4cfe7560f443893088626eae39d2d390f0a53b8fb50a6942bb3e5da8a407e97020db83e4ac23249ff588c23f7216446d20984a0d11b593cec47a81e1e627c6f046e63daa61cd935958f05643663a37a5dee42221dc5af3edf82b1cdb2c5f612e2794ef3cc59179ff0b2f873486ad31fd941f40487578fe12def69afed72d5c9c5b7e2506381d3ce3b49cf19d63eda7b6d8b040fb6d8e06efe13388b7870ffdcd5ae87bb149df50b9cddf11e88e8a2d64252d90b53508c2d7978872bfac75e9339e8a6fa87b3649e3bf5c64a056f117a7f21dbc005c87a66c7a5bc551c80d9351aeda5d663ce0acf4119b665f6db11ae4d7d72f6754692610f2241d286a2570c9f43ee1751f3cee6d6d12936023589b9d4f006744bd5bc657a787c6adf35c25ef174e785f82c982a21a68786d28460e43b01ff032e7ae0bc302ed7e4d04201743708fae7018050e44b1f381d0dd08077ab39c56bc63fe6ac58ccb80a00cffc969a858e0713f8df5c7bc5a4c35c21d0ba4b1ec074bc2bb67e1bda89a218e79b0c42750aabd79a2bdada1e3440678038f4443a59e5b846397aa0e1b175bf8fc61d565fd89cf4701da690b44e5bd5f4a06fbd15f688619955e71069984b9ed16512fecc5fa213829d07c40f5cdd4f86f071df350123602bf30f92f8a6ec5cb4603364430784dcd694479fb5c48f7c3d1043d124e07f5c05fc384f18431fa2409fc8ad4c380cf676e8ac4830f0360521e92dbc6afd64fe2d56ab6e50d7ad187e0a19046f5a000a6a837fe708469d913a6176c88dbe9aeeadebb01828ca5f65758a6e8f35d529bfb84b07a6c3308bc99161681c178de8d38da18e752984fb322e050e7625124fbe6a2a8eabeb14c7542dd249e190d11756d3628facda6e4926af6442e2c8773aaf88075a1e075c1adc169a623e7ef1ef1e8915f9e6c4ee13ea029052fba46db13818c9b428a06f4c0655a3fb5c6b5738d4b6a2154a6d6d1f252f7086e8435d7e04245ae4f13db5257cf1d35c63de6aba1f63f02b015f5436803ceb25d22dad67b9b3a132a066966de6f214cc7a60923da897e98332220920a333eb79e0e8c73500ce86e65da47aebeb614d95c9783788165a7464063cf6a5351b57c83bfe11b0807cf147527dc968344566fd79aec16412b47918a537818ddffd165b0af7f59fe2c5ca9ea47bebac69a6464db28a999944aee1e5369b149f48e0127a7659d9cbcdb1f9337e26497f318cd7cc9b9525ef534f9214e1ee16a418cc326da7ae27fdea49674e060549a9340000c45d56ce2ee8a075ecd0baef65f9ca5e7bc47d46fbe194fa3764a054f11b09a97b1f55fc1daaa772b7288606a791e07eedf54f9e8d599a9b35c17fd3208eb0ba3a0a1b1885426e72bb14dbc53588197b0b64ab977dfa643392452b2cfe34fc1c49462f882e57fd5b42ba4093d6877a3b1d361999926df9a894172bc953b6f5b5f0fa19b6e0925a1792423dd851360da76b96210c935a62e484600710e7bba36e774f6208639b8f8cf3d55afd6f3cd9a73daa4c584968a5cdaa47486b82ec0f30256c91e87e19a4a4af9b2068f842e624da9a21e57c40cc4d4df57541ebf140e144792ebdfbb49f450dbb1682b4ef3d048b8f291cf38ade4bb69116f9eb713e6a1aa0c2efa0158a59545dc5b36aece53198b1ea6378ede4ae2e44b3fd4a1512b4f007d4e636e46cc7cdabb364e4e0e6914927ee23d111e560fb36d5b4d084c3a60dd6ec0984c84e77c0ca6afbe874490ee51abdc5c79fe948658e038644665927bb3692c2546a375174e572e23f50158fb6b1ddaf223ff94eb675c6db7065dd21404f4f796c722f3d3322517fb11b52fb0215d84baa981b5a3412a51b1a27567be548aa9495873f2343a9913c057d083c126d360027535954298e28ae0b54cc1df2492c7c97516debeda3b980052040392ee27d356017bb24db10d7fd0b9547efaf7c5b993a7ac37d793852b277a902da9e9c37541e8d48b393c13b6ee292d0d86307c25346a749c12f8fe33c24c35407a9c2ebc4295d08e798c8db6a57f26ec35812e613828206a057d1f485d41440a8987c22ed492e03a9344e3f5a335d2a95d4c6513fb7b3020038250ef54e44cda5b3f4633746a842e2ad7bf0a43e7d0b37204a8a41ade245cb1bb4b8f45cfc03e6424f360ae774cc784c7675b240f7199184c7197f2cb6d8e748a67aeac4e4eb548db823cef53aa955596856ea01765c8b47658763fcd7c23e0722dc3f4fa38cd5dc55b3eb39a1e25f1c781cb648a0dd0eb34b5a53e4ee0bb6a050675bc5e2ef52764e6dc978527e80dccf4e7ddf1da3000ea21db9aea3bc395a59a2a7ee481ab4a4ccdad07df5859fe39474a68c96b64ba19155fc209ddbae7f651589927e17e1aef780690f3100a377f0179b18b31fd5b4418c84038573fc559b496a782beec3dcf6e9faf5aef676e10bbec34b1be5888fda49b91e02890d2524c5b369f8a54175f29dedf8156fff690cf186ec77104a798315033bbd27c8362811ca2d8c4642c31222a8e00e7326561c384cc56ea905bc6477ca205d5415d2ceb6198c91d8b00c7f029575400bd3f2621c7d9ca9b6a09ea6f776968b19dc3f3e3b064eac64729960c51a7e543eee830724813acf420368711d6f65ef7d05c6a128fb3a87f170b2def1a1c5f1155f5232d9c16789521661ec721d55308879af1f065f19ca87929f21109110c0960ea70cc1a3ea7ff0c1d3407de92ef7421e42df5c9ab31d2ec0a750a9522869cbe4cabd66908d5823ec0494c639b7ebb4ddc70ab214d026efe21393454cd593bcc7026c50f116bdf47f3d11d676b9b5e59f85c791343890d1e02b146be7dee670a09841052c4e556962c6df3409fdfcdd4ac53f7f64b201dda237f8a38b0d0cef58d4650fabfdc98d7de72568584869a5c7cf99060c08211a107f6a76a028aa41d5fe00f6d4ebc065b8e80cfbcd65a444ffebfeae92009a90134b906a8ef86b6f015e394011dfe3fbfc10bb74cf1a54c2d96196fe5f63114791e29209bd45f47fc33c3977c9a3da562fa95a5bc53121283c78887edbf83148738d99db95d7f07c02df282263fd4c7e3bf913391970b57d1279fdb66e899f9aa294cd677f75056ba8902dca49b6e17c06490c9532a0b5c942ac1c2f81dc0645053f5535e1e9db569c9770f6e29642577ae06df77889cc14b4590e707abb0c5283d559cd24f91b44c63c1a2e966417177e085fe753f2a06750c8fa01c3ec59c806a003b8b16e6d3e0ec753fbcdea07c5f9070aee2ba4d9c9fe41096bc23796af75e6797def0f784b5c7f42e3efeebb67d526959368682043a60b6335e1666b0fb7f0e3a445a6e57398ad10706439db08f9ad285f72041ddc306f2fe7873f7ff1b6066ab51df95bbeaa99e42a95930ead4de4edd9b240779c84b5960a1b8c7b5c59703639ded283357a8be798e8c3fc60b91209898ee6d68b8a25bf250713065988756eb8eff705dff1cb4142c6934e282581a7f76fbce4b22b06d2c0b29dc9ef2b5e3ab8ba3088c5f5a019b098c9ac0e7977edacbe8c46184da2f96384f16c262b73c3c3a647b4ed6f54976bc42ebd189d3d032fe11ca7c5d93f5a97e5d996066efc31601b023361482de5fab48a2a50791b12084234adc2b8261de33d1bef98dd41ac18812baa29667428e5cea59abef65842c0479e0016d09f6bd0f48020e3608a5b714188c44bb3708bb57c46b669fa3ebade5a2149c90bf16ce572d0d1efe01e66f5c1e227d1166b33f1253726596e13a3eae28430e4506647aa20d3a9c54346f62c6a007bc276ab4b21303e91963b20246c47905c6e864425a76450516c734a339da4ac6927bd79f9cd0724a02947ad66edf00d766f97d42d65a71171ec567244d0d8ac9807d21d657e11b0fa197c0291f547c325f06a5e886b52dcb04ed605514d6cc9b26a9ddfb9bbb6ac476ec166cc0ab37912f7e72a5d41cb7ab699da4d849dcacb5c5906071a0d5ede3130fd233fb69cf9e58ff67fd5707cb32cd549900347587a40daf5dcb2fb71105e681a7f13806a0945bd7fa7187fcb4eba0b0d17f6d3809e06f852a7a90d5708761effc370f08672da8b6ae84df6221507420d2a86c9a9fe56b805b027cb798f225894367d8f56fb4d009f8b9c5ee8cebc823111dab23a63d624f63f53be3d6c0a20c12263e4436e462407d72e3d854280d361131c169d9531430e9c556d0c69d57d6ecd4978b6926c0088162b1e6139fc3e8579717b395c0d1d330f56604f4c2b78838058d1152e689b0b8ebb86e47bd8ca858c036b768013bb4edf7e206cdeb617e883b879c90be1fe798904ff76cfbb804991fa6dbcc8ea244855f434cde71b64861e90f83bf1802fb84d31107ffe4d66bad37e0a73fd3a6007b9e124d82f0567439908d4d2a7ed38b222684267d13787be99b5c803e7ad7875536c79f77d1a27083b4a97f5f7cf204d52d11b960d21e83e2aca32d54ee973796abeba919a02acbe4e7bc80ea7cff073249625747db29323cfe3cd4ffa9659fa47fe6f0d4f66fe4b18c6f0848094af0bdfdce86ae8938f53d02923dab35d33e2335521d562ee2699e25196bf4ac765fdccceebde156ce4b875c3bbdf40e6081874eb57509b412b8ef3444227cd0f1b313391b639cde49b3906d91dc46ad8e08452e799e6c408151495c87d24d015d88e5c50d1e4d8a3babdca95d2f3f9dbc30e17716fffa3eaec120e05cd1e1d80a4fe8e31c545fe524c2e0a1d61d2b599ba9e09b362030290b96fa722bd7d7af98769125c18c6079956730e9952cb65b7cc1c72d2f95aa7a18415a847d2a9b0288ab531fa55ceba1fe2741e322e44d3e002 -MD = 45ae4c1aa7ab5c5eb3ef6ed9bcd706fcfebf72bdb5f8f327e1f0bc02 - diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/third_party/NIST/SHAVS/SHA224Monte.rsp temporalio-1.3.0/vendor/ring-0.16.20/third_party/NIST/SHAVS/SHA224Monte.rsp --- temporalio-1.3.0/vendor/ring-0.16.20/third_party/NIST/SHAVS/SHA224Monte.rsp 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/third_party/NIST/SHAVS/SHA224Monte.rsp 1970-01-01 00:00:00.000000000 +0000 @@ -1,309 +0,0 @@ -# CAVS 11.1 -# "SHA-224 Monte" information for "sha_values" -# SHA-224 tests are configured for BYTE oriented implementations -# Generated on Wed May 11 17:26:02 2011 - -[L = 28] - -Seed = ed2b70d575d9d0b4196ae84a03eed940057ea89cdd729b95b7d4e6a5 - -COUNT = 0 -MD = cd94d7da13c030208b2d0d78fcfe9ea22fa8906df66aa9a1f42afa70 - -COUNT = 1 -MD = 555846e884633639565d5e0c01dd93ba58edb01ee18e68ccca28f7b8 - -COUNT = 2 -MD = 44d5f4a179b33231f24cc209ed2542ddb931391f2a2d604f80ed460b - -COUNT = 3 -MD = 18678e3c151f05f92a89fc5b2ec56bfc6fafa66d73ffc1937fcab4d0 - -COUNT = 4 -MD = b285f829b0499ff45f8454eda2d4e0997b3f438c2728f1a25cfbb05a - -COUNT = 5 -MD = 206d442c6605be0e675b0efc76243c2f18f2260a93375fb36e469631 - -COUNT = 6 -MD = 1cd8ea34d8483b6a513c52a74e416bac2f322bbaeee02c6b0b05a781 - -COUNT = 7 -MD = 00cee48001fe8442ef39c3433ed05473179f34205d337940d4bfd3cd - -COUNT = 8 -MD = ead3ad27819401912bc9abfdb50037672a3aed0e94fbaa1cc0560621 - -COUNT = 9 -MD = 8f4dd5aef9cea829d8802ffcced2e8ed6b48ac23bbfbb0fae2fad0fd - -COUNT = 10 -MD = 03aeb918feab459e39af29ff3aaf406088bf06d793338bbd563641a2 - -COUNT = 11 -MD = de80c312b153fbd7241c8bc432d1ed253d26dcc6f458b953ac2d9259 - -COUNT = 12 -MD = 3eb8d347cc2565ddd71f7fc21cff7eb3a2cf8e85c5e1d4c751f69f26 - -COUNT = 13 -MD = dbfd7033a4f884ecf7053f07b4c51f3efb1c09084cc7bbe667196a3e - -COUNT = 14 -MD = 5323fc60310fe29900eb7a500f29897001c37945c5f8849674725553 - -COUNT = 15 -MD = c3d9416549bebebf679c0122a9c5bb86c0b514c6a4e9eda1e9782040 - -COUNT = 16 -MD = 749fc9c8c21957ddcaf5eff69c297284d722c79be1fc6c910495a586 - -COUNT = 17 -MD = aa307d91c4037372ff0ca60eb17ec8f1faba862601b95754783ea808 - -COUNT = 18 -MD = 071e361909c38791e941d995b0b25a3294bdf39456cc012806ada3c5 - -COUNT = 19 -MD = 18751a765f3b06fc2c9a1888d4bb78b2d2226799a54dba72b5429f25 - -COUNT = 20 -MD = 54b39c96f6377e3fc2ae0ba4ec89049a6c04808da3fa0415c9053ce4 - -COUNT = 21 -MD = 58c1eda7eab2fc4046ae153ee95de5df036dbba25b9bb5c5428ea882 - -COUNT = 22 -MD = 3a02eaf55d04b6052b7d79b96d1e316f90f5dbbb3217dbfaea55faef - -COUNT = 23 -MD = c8b5eac17f450458c60c075a8f75a24a1dbc58247fcd0ccfaf03e446 - -COUNT = 24 -MD = 53084cacfebbc4d1ff2db614b42714c18ddde36c6b7c2fbc3b1a8706 - -COUNT = 25 -MD = 528b867aa481d42fc4931a47d24c3c905aaafa8f6dd5820c67d3579c - -COUNT = 26 -MD = f0a3cd3f53eb72df80ab67d264a973b6bb2f58bde8f636d9100e8864 - -COUNT = 27 -MD = 7912f20299d803ba917f408a5a59822d147bcd1008ad5c7b678e2390 - -COUNT = 28 -MD = 6f0e49505c15669302133d66e45d192e0c6ad02fc5b9aa128aa5517a - -COUNT = 29 -MD = d06aed0f18e6c377174fd00cc74a92020b3df218c376eac0501a094a - -COUNT = 30 -MD = cb1bbf7cc5dad591d32534c570e5bca93b8952832779dd6e0ccdc91c - -COUNT = 31 -MD = 4775bc11834930118654a3e66e5b7f51871d6f5068f4305dc2845574 - -COUNT = 32 -MD = ce3b5703ed9f946ec4af62fade6e69c2751474ab8da570064ecd2ef6 - -COUNT = 33 -MD = 49a9e1aa84700874ac27eee43f193df69ed6718b131c4854f729a32e - -COUNT = 34 -MD = d2c6592251a27cae7d819ac7b476c8a2ff608e57b018f79e0cf19b87 - -COUNT = 35 -MD = a861be4fe188858b913aad179ba575cec91bed54c1ca27608daa27dc - -COUNT = 36 -MD = bf7975e63aa7f1bef84e7446f1c4a00a75c13285fd7c4a7a8318b1cf - -COUNT = 37 -MD = 5d125b14e966c9e431bdc5592d3e6305fae678dc5d6dd064fa1345f9 - -COUNT = 38 -MD = 8c0fbb471404371145dbb66e8b1c6fc428e6dcfa263e3f5ddb47b30d - -COUNT = 39 -MD = 7148b69b04457296fca18e6f7b7f2145d9af9e6bc8f48b8571af0e53 - -COUNT = 40 -MD = 0bd47a04fc42fb3d9643496e5b0719c22262f741e862adfcef91d61c - -COUNT = 41 -MD = 3dbb14133351e5d4bc885d9594c07f7f0f99d4a7c745eff3e7aadc2c - -COUNT = 42 -MD = 94f6ba7f94ba9903f7e9bde9b131353fce560c7de7159458f1a39cfa - -COUNT = 43 -MD = 65fc03fabbf57904f572358c20f004aa16e0b5ae6530fa961ea10b9d - -COUNT = 44 -MD = e46532e3e4bd0a0cb389abfba5d679e916a7c193324f1bac498ee1ee - -COUNT = 45 -MD = 131d096c684345311cff958706eded139676a74d97a1beb861998485 - -COUNT = 46 -MD = fe3e03637088ac8ee2e035bfc1e7f4e944304663c832c26089e85f9f - -COUNT = 47 -MD = d570c2b7040fc721b41f2d213f6ee87ac1e37f2b86526cf46c699aa7 - -COUNT = 48 -MD = 82ede72ad163b914be7c22c085cd99438b6d5557ddd3b752f0a9fb7b - -COUNT = 49 -MD = 343c21a0cbde3cccdbbd66eee32c50f5a54b0ac267ec3f41ec07a67f - -COUNT = 50 -MD = 94ad254f3b4a76f6140d0dd3775bd75eb3c081085fcb76c91b4cca92 - -COUNT = 51 -MD = 65fa84f358bc32caaff799129bc2cad883636826415703a2dd1a3cbe - -COUNT = 52 -MD = 1c2f47c532856198d03dd85275357dce085c8f6c5a871aac4ff4ea28 - -COUNT = 53 -MD = 1d51c1019131b41a076cc603f4a8e56b2f4ee70dba326af30d926827 - -COUNT = 54 -MD = 9789daba3a8e9702d2d0b319878f88b08ebc5876dd5dff6414bf1922 - -COUNT = 55 -MD = 1968789785f1ef61f849bcb29fbc1491c006021f729718e72f29b80d - -COUNT = 56 -MD = 62dca9550461f8a85e1abca4192a8a55a6e6663ebcda9ba6fb95f10c - -COUNT = 57 -MD = ee190aa251c1a2ae0a376b4c6b6ab3bb09f743fa01eafaab68d170e3 - -COUNT = 58 -MD = 02273be94aaaf4a1d22496821e8abda8c418d3a4c278947c27d6c912 - -COUNT = 59 -MD = 3998a213e392978a38016545a59bd435180da66d2b3da373088f406a - -COUNT = 60 -MD = 7308f2145d345bdb01c38a9993a0ec81ed5164ed0c6caabfa3b23fea - -COUNT = 61 -MD = 3ccde61f4734978995b7489bad8c1e6bafe03f7c3886e9b4ef0f1aa0 - -COUNT = 62 -MD = cca9745f59f3ae2bbb8d65d31c171aa33960c8c6fa4689bb7e6d2152 - -COUNT = 63 -MD = c976de72db46c1a254293af6093c563ce43232077c249584c016ff6f - -COUNT = 64 -MD = f1448af3cfe317aff1470f0a3de7bf533d77dc7f55e8dd790fd57727 - -COUNT = 65 -MD = d4be0ccfe4913851c9636ed036c625524e72891c5c0627aae50288ce - -COUNT = 66 -MD = 6bd99c53693d4e2467ba6094710a6d2f48cc2ae907c4ae28604586a1 - -COUNT = 67 -MD = 2eb4fa0872ede2a378386e40002cb00b4d1c2fca3413b944ed210915 - -COUNT = 68 -MD = 48b624151c9d3a1cc8e9d6665d42d4e640ac91abcd3556a31ff0250c - -COUNT = 69 -MD = 31159840b7cb040d819ebee1ed0e52d09f5805be523cccc22eeacba9 - -COUNT = 70 -MD = f9a67791dcae0aea00f77f8536ddba439e9fcf7e5b1ed827f83818a8 - -COUNT = 71 -MD = a5913105fba645ba0df942da96d271a1d5efb923a4f61eb463450ea9 - -COUNT = 72 -MD = 6ece291f81eceaa9eb5a5e228c9924f165b8b10e2cf0e143dd5fe601 - -COUNT = 73 -MD = e07ab143f09eb8ad0d381b888adb22229c2e2a8b067e0fd012ef67a7 - -COUNT = 74 -MD = 88a33980be5bc911c1713d5c2bd2e5ecca7fc87879501aefa9722c89 - -COUNT = 75 -MD = a709d188da8ee187d91bd17069f785ebb379df013d78844a45b2bfe5 - -COUNT = 76 -MD = 306fa7bd696b3e9841f84d1c861712acba0febddd7a952499b96579e - -COUNT = 77 -MD = 61341dee2e2869112bba2e1077fb409375f755dcafc1457bf49e0e8e - -COUNT = 78 -MD = 0959a6e3b727c6213119b9e8411132b5819eb848bec6ebda0b75578a - -COUNT = 79 -MD = 11cef0312aaedb9d0b26de64656406c8f4c358e6d3db459d364481de - -COUNT = 80 -MD = 5de71b191eec70e591c22ebe3a5d2973aa3172f1c272e926cc0d4873 - -COUNT = 81 -MD = ab218bf4268aec9b41dd2db80622e4c0319cc0de12a60e06d80414ea - -COUNT = 82 -MD = 5c83874afe6da0443abfbbbf8ceef38f9400b63593ee7a29d467b4f5 - -COUNT = 83 -MD = ba0fd01f699a0d00a0dff4c63f6ad19e9530a7ad11fec504e6481816 - -COUNT = 84 -MD = 835ec2c57424baaeed09a7c0c0b6e8bf9d1cec83de4c719846c990fb - -COUNT = 85 -MD = 64d95f2c92343d8fca6f6914fba8814478850b5d4c2eb227f4ae6fa1 - -COUNT = 86 -MD = f8dd5355827ac4bd040fc05ed6cb2914d013f126487a6d5f2c22f767 - -COUNT = 87 -MD = be5bbf68d6b99749edefa6b113638ca5cf5fddfd8fcd4d719aeb54b5 - -COUNT = 88 -MD = 3434d03e98d0af69281e7a7ff8301369c5bc6166cd29b83397ad3fd7 - -COUNT = 89 -MD = 747b2a7cfb8c4fef7de0a08499f8b19f37e9161b855a84bd50ef84c5 - -COUNT = 90 -MD = c1c1fa2bbb10c5672b040ed0c33d4d93e0fd210d1373fc7fd2312c0c - -COUNT = 91 -MD = 671f67380b7676ee7c9fbfe71f3807e3575745ec3ae3128420a141fd - -COUNT = 92 -MD = e88394adf710b9764a448abc6d62928b0268c6b119306f3c93d7b6d2 - -COUNT = 93 -MD = 711cc90bfdeed121bd5a8629a9cba6df7bf8df89184ec64ee918cc67 - -COUNT = 94 -MD = 3f63432484eaa1f389d27947a84e256618f9bc81015993cac386887a - -COUNT = 95 -MD = e00e0bf2a32227461230a065bbd2eeb5364277e83a850c53ef5c92e9 - -COUNT = 96 -MD = 1977311cea23a681c83dc58a6863e362bf6c02e30f4c9c4c8439ab4e - -COUNT = 97 -MD = 2853a64f56c6282de53e30eba9418dd62eccb8c9a662c313b4768265 - -COUNT = 98 -MD = ca9d0a2eeb484b9809c3850f166362d893f951f5e93cc7a3c72522e0 - -COUNT = 99 -MD = 27033d2d89329ba9d2a39c0292552a5f1f945c115d5abf2064e93754 - diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/third_party/NIST/SHAVS/SHA224ShortMsg.rsp temporalio-1.3.0/vendor/ring-0.16.20/third_party/NIST/SHAVS/SHA224ShortMsg.rsp --- temporalio-1.3.0/vendor/ring-0.16.20/third_party/NIST/SHAVS/SHA224ShortMsg.rsp 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/third_party/NIST/SHAVS/SHA224ShortMsg.rsp 1970-01-01 00:00:00.000000000 +0000 @@ -1,267 +0,0 @@ -# CAVS 11.0 -# "SHA-224 ShortMsg" information -# SHA-224 tests are configured for BYTE oriented implementations -# Generated on Tue Mar 15 08:23:36 2011 - -[L = 28] - -Len = 0 -Msg = 00 -MD = d14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f - -Len = 8 -Msg = 84 -MD = 3cd36921df5d6963e73739cf4d20211e2d8877c19cff087ade9d0e3a - -Len = 16 -Msg = 5c7b -MD = daff9bce685eb831f97fc1225b03c275a6c112e2d6e76f5faf7a36e6 - -Len = 24 -Msg = 51ca3d -MD = 2c8959023515476e38388abb43599a29876b4b33d56adc06032de3a2 - -Len = 32 -Msg = 6084347e -MD = ae57c0a6d49739ba338adfa53bdae063e5c09122b77604780a8eeaa3 - -Len = 40 -Msg = 493e14623c -MD = 7f631f295e024e74552083245ca8f988a3fb65680ae97c3040d2e65c - -Len = 48 -Msg = d729d8cd1631 -MD = 342e8e6b23c1c6a54910631f098e08e836259c57e49c1b1d023d166d - -Len = 56 -Msg = cbf2061e10faa5 -MD = 3aa702b1b66dc57d7aec3ccdbdfbd88592d7520f843ba5d0fa481168 - -Len = 64 -Msg = 5f77b3664823c33e -MD = bdf21ff325f754157ccf417f4855360a72e8fd117d28c8fe7da3ea38 - -Len = 72 -Msg = 10713b894de4a734c0 -MD = 03842600c86f5cd60c3a2147a067cb962a05303c3488b05cb45327bd - -Len = 80 -Msg = 006470d57dad9893dc03 -MD = c90026cda5ad24115059c62ae9add57793ade445d4742273288bbce7 - -Len = 88 -Msg = 6f29ca274190400720bba2 -MD = ac53157947aa4b2a19089182382a4363d182dd8e4ca79cd8571390be - -Len = 96 -Msg = 17e8556176fcca2addbdde29 -MD = cc6ad0488db0222066f740557b5758a19b30372b302332295d8c3aff - -Len = 104 -Msg = dbf163601db9a122a4026824de -MD = 9849845f4e47e1ece9a1c1e01a0d896ffea61c6c8894a75a11ce5f49 - -Len = 112 -Msg = 5e1ef2ad86ceaf5439fe87d2ec9b -MD = 223c5d5d4a0116b32cea044f9af0fe44babea1c5ab201502591bcd5f - -Len = 120 -Msg = 65f3b9866fb8002b53cfaf806f702f -MD = b1e0806a218d593821fde8e9eacc44ab5287c32209a94f011ab66b75 - -Len = 128 -Msg = b776708ffb91b3515ac46598ab9fa796 -MD = 427311b1d7ab2488791c4deeb4251d783fe5f9806bfdfb5188c5443d - -Len = 136 -Msg = a4bc10b1a62c96d459fbaf3a5aa3face73 -MD = d7e6634723ac25cb1879bdb1508da05313530419013fe255967a39e1 - -Len = 144 -Msg = 9e8f3c6645c1749b55c50d2018ce40dc2427 -MD = 2f5a583bf588c8988a572d128a95bea5ef1b66780a7d4be9c29efc31 - -Len = 152 -Msg = 2db6d207c0b7d9117f24d78ee59abf2f316978 -MD = 35681fce28307cae19522c23cbd4a77969347f7d8ee4a3088ba90ada - -Len = 160 -Msg = 3df5e7f399f6dd61a12a9d4e9464fc4997c1f37b -MD = a3e68076e30751085a843a6cbfbf0f3dee63d9c4219c914372e50b28 - -Len = 168 -Msg = 65781d018f27ca0c72a9fa9ab4648ed369646dd3ce -MD = d15ef0d872d02da6427b8d0349dea2f204e67133b7365b4b150efc3c - -Len = 176 -Msg = af48eeddd93fee69d1bd7de428a63986011d10945eaf -MD = b89d428ee42e397cf11029ecbb27baddd036c8938f51c8ab56b875ac - -Len = 184 -Msg = df2bf0d5f9c994ac69d78baa0d512eceb74d8a047531c1 -MD = db8e1ce68c8c6b84d6db755c2b8bf54f3c4b081a881efcddaf303294 - -Len = 192 -Msg = 48d2f20955ea2d13433c20bc0404eb2e6ad79ed28f7cb4c0 -MD = 3617cc3179f8b59adce181eebeed5e2763f62650949224a67e53694b - -Len = 200 -Msg = 218f74a42d3a47ef3b806601fba024b078cbff4e4b85772e0e -MD = b5f40b95dcc363b97e9d00b67c5d7c37f17ab563297d2d67a4df20c9 - -Len = 208 -Msg = ef55b1e797000b04fcdb9b3021b09327e3b4e269d20cabdf418f -MD = 827b223d51240c2e3271c534c19c5637b6fe10083e85bcf06761ef21 - -Len = 216 -Msg = 96df4387dc2c40297043bea36483f65e4eb1e07e93359cb7e68610 -MD = 98e430a63fcdedafc9419010f7f59a4d816a45b4f973beb62530ff8c - -Len = 224 -Msg = 3ec0aa8d30d5ed825b77dc7095f421b1e608158797a377ff8bed641b -MD = 3108321eb7ff857f6aae69101b937f32a51ea279a6c14ba5232ac8c1 - -Len = 232 -Msg = 8b0239712039f077ce323b35f4e306787b9b35270096e57735cff45d84 -MD = a5c740d3ce46bb2e0a048488f2b0605c6d0ca0ea2f382d043d13db97 - -Len = 240 -Msg = 044be30167a9758c46c727921dc4eb4e0dcb965623423e6fdd44e7a4ea52 -MD = 6eb78313c743ea8769d8340f284dda6ded64a1db64392f21abb82c5c - -Len = 248 -Msg = 57f6118bacce47ecc31ce8b0c083d3c9219e0dbe9e4fbea154537c41231acc -MD = 0dbb53c866d63af44c222c76c825df0e379dcedfb958db03b6fd29a5 - -Len = 256 -Msg = fe1f0fb02c9011f4c8c5905934ed15136771737ce31c5859e67f235fe594f5f6 -MD = bbeaacc632c2a3db2a9b47f157ab54aa27776c6e74cf0bcaa91b06d5 - -Len = 264 -Msg = 14fb01ae9d6015ecb3e56d6ecdfa4bc0533186adf8457f5e4a5c57c687895f3db3 -MD = 178272c7d7cc71b15074c27e3b7997d4a3ba99626986a1a16cf30030 - -Len = 272 -Msg = ff6c49712f044f4063c14125c0cdfba18ed8b7138453768a45dfa2d82a05f1e84227 -MD = 403284c888a7280bc8bfc25f0c34182cd378306a21a1404d4e1c40cf - -Len = 280 -Msg = f900bd7e0117247f97c8fc7a665c76a35f571c3366571d6c4a3ee5d7fb93f1d1f726e2 -MD = 48235b9820d66d8885faabf6a9ede63ba2a21b6177e987a33242373e - -Len = 288 -Msg = 42d38188ac49440cfefb77db975e083e6b22348c4c67f0f8692e88ad140d861dc828d595 -MD = 615344f890e5bcf71b5efe39de1fc942ba1fe30dd9e9146adb6a41bf - -Len = 296 -Msg = 74fdd7d958b8ae7c2c3c5cff4266dfb2b3b842c9f59ecbbcaff575edcbcda08ccd6e08b764 -MD = 66d7d6c54fc7775a0ba845ba3e11719fa535b9289f20b098c5f7a342 - -Len = 304 -Msg = 934416dd0581e22f2bfbece7bb64afe820451fa21342df7e6f9fb37c4103381a1f7cd379bcc4 -MD = fae8f1aa22def4dbaa814c5b0babdec43394951792c937050d2963a6 - -Len = 312 -Msg = 102401c84a716ae72579c6ae79c359ea309ffd95abffae4c61884c03c9e99df77b6c92e492cacb -MD = 8f34812d57a16ef8a51ad987660c5f8623e0fa9d89846e28d46d14d9 - -Len = 320 -Msg = 79bc8fb60f85d15a2386566e3e7314df284533085add1c7bb6ead3ff760c86d5633a66404761b544 -MD = 65c54014cfa30f0bc27d1c6efa96ae8481f4c2505bff272956eab0df - -Len = 328 -Msg = db3121ea71294983b185207a9d8de3e484a66c0431bf07c962eb82977c4f834b7c3f1e7931a4a7f7a9 -MD = 9316d2f021c2913d63a7e66924c87c161c3cfde0ea7ba07f54772862 - -Len = 336 -Msg = 0dd51aa660c5cb4b7f78c46852c1db8707ab451c1367b6187388c8bb3873a1aa4210d0414cc6792a29a7 -MD = 31989e7a62a5132a5070d77250d8904bb82d457dc63469d06b50185e - -Len = 344 -Msg = 487fd2e5b694b7071d3789a258a51e8604dc0d3e8f5d62f39131968e602abe1ddf6b0278962a512408b553 -MD = e798683438284626d710877d9eea3a0e02f349fc43acb7f9f8f9e81c - -Len = 352 -Msg = 11183bdebfef58e4da5b1cb73be0d30b20da304d8659d921da2e270fd14626799537e4d12119e809ee97004a -MD = 96870657d6cb668be3995aa8bd31df77840d1d1915d72482e83b6b2c - -Len = 360 -Msg = a239de5c8e2644e8f030d94d98f1a30664e6fd961dc2977a9c08be5c31d8de89450945a53d79299ea2a1edde7f -MD = e99743d4fd26c8800c36a67b6762247c29da6b62794123c59de06dc0 - -Len = 368 -Msg = 917c4577aa6b0f9df49999fc1c958cb09b7fd5fc80be949670f03545eb27dcaed052076b24f96f5e0f2e2f4527c0 -MD = 7ecd693d4d9cf43929464698efa0bac33c2e1424f816edc769260978 - -Len = 376 -Msg = c3f1e735a6741aa481ad577a98dbac1f03cc80ea0dae1b94db2369ed4e93facd29c64e4e77b25038279120bdfa3715 -MD = 86f0d89d8e14fd8b6606412d71a7a54a347b304ea5d49c208f2266ab - -Len = 384 -Msg = de4fbfd553cdf37019f25afa82dc6b9970f4bb1ebbc37f80d3084c88a70722cdc523a9e3c2afbad0dc0221bfdec9a2f9 -MD = 4c5262acb4a2a44eaa9bc6757024fb202ef4d5a7a16fa37252a422b5 - -Len = 392 -Msg = db2e2eb636610cf42e9b33433acce1b3b925949f297dd83199f45d2861d64cd910c2db74a60b2089045e22cba0a536137d -MD = 16bf4e45bcdc60447c68dcb30e6b08f55ce9f4124a29cf1f9a9d065d - -Len = 400 -Msg = a8e729d336d5d6ac50e1e22f0b193b66e26042fc6459214129875e740ab2b142918c138aaf941863ad3b7e6065450613b273 -MD = 452bf2e5ebfc4e451cc434bc09e2a10032eed0b7627cf55e7e5ed0e2 - -Len = 408 -Msg = d05317d4b535f9d10f739d0c2dedf3ffb090c1ad9d205089b1346693f58273c4925c0face57ba45ad6fc687c66a88fc78878be -MD = 4f03c439e097b51b00e314f675937c4d911505859fb7ab16adc65e44 - -Len = 416 -Msg = 26bb4ed4f0424c60fe4212ff8c955e89e2f553a7d7701be59416d2089af59fa1074724e214e919b1e30f33fb78374b4b055bbc9b -MD = e7c899e27009d4dc77c2d300f191b757e52c9e7eac4b023bfab2b52a - -Len = 424 -Msg = f015ec83944f03292463c4345fdb1c26d1ea07645facbc9520ae244b6eb191e53dabadb4ac0fb15cda4ed77dfb9e1193abfafb1b81 -MD = 459e40b3fbd612912f0217c60099379ce077cd02505871b0c9c14e7a - -Len = 432 -Msg = 0786706f680c27b792d054faa63f499a8e6b5ddb90502946235bf74c022d772c809cb4171bfa4791539aca1abd91900e53ba93ca0efd -MD = fadebab7c3d0fb8e97e429b79083087735e4ab385a789521260ef3ad - -Len = 440 -Msg = 445e8698eeb8accbaac4ffa7d934fffd16014a430ef70f3a9174c6cfe96d1e3f6ab1377f4a7212dbb30146dd17d9f470c4dffc45b8e871 -MD = 4c7ae028c0fe61f2a9cada61fae30685b77f04c6442576e912af9fa6 - -Len = 448 -Msg = 52839f2f0853a30df14ec897a1914c685c1ac21470d00654c8c37663bfb65fa732dbb694d9dd09ced723b48d8f545846ba168988b61cc724 -MD = 2f755a57674b49d5c25cb37348f35b6fd2de2552c749f2645ba63d20 - -Len = 456 -Msg = 5fe8c2072d8900287ccaf07f3f66b0c22acd3e0bb91d9573754e19e373ac35271d8b43443436ac0c162850ef3d7f281409ad29a9bf716c77d1 -MD = 42909757f6e229f69f04cc7a863c4e70e48c7c3575057b455c959775 - -Len = 464 -Msg = e8064d83f3d643af8718c87e3ccd6a9733685eac61d572a22ab943f232fcb04f70858e8984449db14a76bb7eaf2458efc3ed2a32100622c52b7f -MD = 1a1d8ed54cb45c97bc970754b43eb93d9eabde4c7b07f76ad82d8ede - -Len = 472 -Msg = 87c9a517e28d1bb54ad20fca76460efd894d7786e68ee8d746b2f68208682157c8ad06cc324ad7a3189e09c6c39d4c768719c0a49a41669f2767d5 -MD = 605977cf87b9b309bbddaaa64e528ace66b04df9f72c0e7ec88be1da - -Len = 480 -Msg = 59fdac3b6b32039291801c7d6f46ede8d26dc5b7a192e007116739b617569f2523680b3c0b6631af453e55805aa760c6970833ac06963bbc9dbd455e -MD = e9f0cb1dc8337e906385892f2348a8ba4412318ecad9b96e3711531f - -Len = 488 -Msg = 30350a4df0b58ff49c0fa09e426fcd7007b290c760c825c1855d9b0023b82caa51e3cab4c60cfa61492be50568e5ac0f6db0fd468e39e4536403e3809f -MD = 776cc6636c02408fbf65ace73ae80017108b917c16c5a912fd860241 - -Len = 496 -Msg = ef797a0d43c30b4fe1014bdb9420879c2ff845d27e73d55a7df22930c8ece73253d8bb265b4ef2ff9c69455cc56ff25229b4126bb7bb26ee2c9ff36187b1 -MD = f5b9ffb102affac352a4a535a00f89b06c268cf4881d712668906025 - -Len = 504 -Msg = 716944de41710c29b659be10480bb25a351a39e577ee30e8f422d57cf62ad95bda39b6e70c61426e33fd84aca84cc7912d5eee45dc34076a5d2323a15c7964 -MD = 61645ac748db567ac862796b8d06a47afebfa2e1783d5c5f3bcd81e2 - -Len = 512 -Msg = a3310ba064be2e14ad32276e18cd0310c933a6e650c3c754d0243c6c61207865b4b65248f66a08edf6e0832689a9dc3a2e5d2095eeea50bd862bac88c8bd318d -MD = b2a5586d9cbf0baa999157b4af06d88ae08d7c9faab4bc1a96829d65 - diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/third_party/NIST/SHAVS/SHA256LongMsg.rsp temporalio-1.3.0/vendor/ring-0.16.20/third_party/NIST/SHAVS/SHA256LongMsg.rsp --- temporalio-1.3.0/vendor/ring-0.16.20/third_party/NIST/SHAVS/SHA256LongMsg.rsp 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/third_party/NIST/SHAVS/SHA256LongMsg.rsp 1970-01-01 00:00:00.000000000 +0000 @@ -1,263 +0,0 @@ -# CAVS 11.0 -# "SHA-256 LongMsg" information -# SHA-256 tests are configured for BYTE oriented implementations -# Generated on Tue Mar 15 08:23:38 2011 - -[L = 32] - -Len = 1304 -Msg = 451101250ec6f26652249d59dc974b7361d571a8101cdfd36aba3b5854d3ae086b5fdd4597721b66e3c0dc5d8c606d9657d0e323283a5217d1f53f2f284f57b85c8a61ac8924711f895c5ed90ef17745ed2d728abd22a5f7a13479a462d71b56c19a74a40b655c58edfe0a188ad2cf46cbf30524f65d423c837dd1ff2bf462ac4198007345bb44dbb7b1c861298cdf61982a833afc728fae1eda2f87aa2c9480858bec -MD = 3c593aa539fdcdae516cdf2f15000f6634185c88f505b39775fb9ab137a10aa2 - -Len = 2096 -Msg = 6b918fb1a5ad1f9c5e5dbdf10a93a9c8f6bca89f37e79c9fe12a57227941b173ac79d8d440cde8c64c4ebc84a4c803d198a296f3de060900cc427f58ca6ec373084f95dd6c7c427ecfbf781f68be572a88dbcbb188581ab200bfb99a3a816407e7dd6dd21003554d4f7a99c93ebfce5c302ff0e11f26f83fe669acefb0c1bbb8b1e909bd14aa48ba3445c88b0e1190eef765ad898ab8ca2fe507015f1578f10dce3c11a55fb9434ee6e9ad6cc0fdc4684447a9b3b156b908646360f24fec2d8fa69e2c93db78708fcd2eef743dcb9353819b8d667c48ed54cd436fb1476598c4a1d7028e6f2ff50751db36ab6bc32435152a00abd3d58d9a8770d9a3e52d5a3628ae3c9e0325 -MD = 46500b6ae1ab40bde097ef168b0f3199049b55545a1588792d39d594f493dca7 - -Len = 2888 -Msg = 82829690aa3733c62b90d3297886952fc1dc473d67bb7d6bb299e088c65fc95ed3ca0f368d111d9fdcc9476cd4065efce7c481be598537f3f53bbbb6ff67973a69837454499e31398b463288e3aafb8b0600fdba1a25af806b83e1425f384e9eac7570f0c823981ba2cd3d868fba94648759623991e30f997c3bfb33d019150f0467a914f1eb79cd8727106dbf7d5310d0975943a6067cc79029b09239511417d922c7c7ac3dfdd8a41c52455b3c5e164b8289e141d820910f17a9668129743d936f7312e1604bc35f73ab164a3fddfe5fe19b1a4a9f237f61cb8eb792e95d099a1455fb789d8d1622f6c5e976cef951737e36f7a9a4ad19ee0d068e53d9f60457d9148d5a3ce85a546b45c5c631d995f11f037e472fe4e81fa7b9f2ac4068b5308858cd6d8586165c9bd6b322afa755408da9b90a87f3735a5f50eb8568daa58ee7cbc59abf8fd2a44e1eba72928816c890d1b0dbf6004208ff7381c697755adac0137cca342b1693 -MD = 5f4e16a72d6c9857da0ba009ccacd4f26d7f6bf6c1b78a2ed35e68fcb15b8e40 - -Len = 3680 -Msg = 5f664be0c0f3d2fc9a1a7ed6b515ef9c52ad1c7fb3acf2c2de943e109f91cc12ccadd041cc4386f95ab616cf8762ba25fed322fc8c351809e00c600a8f26e25a5bcd0bc3b44170947f65b4f417b8ac769187c2ee4561978289cced04c036c37f942ec10f7fd4d7f6908e22ed6cfd0fb89330c2fde417b956643aaca53baab8a8ff38bdcd35e60547159b26618e1b29128a35ebd2733fc4adf6bf6796076b09fd2554c6a4df5e40ae97f389f986f843ad00000515f9c001aec9c4e47e2c60fea78de8a33c8423d1539dfe125c5b7ea4b17cf8d86e7f84b88264afec06b370dfcebf5e1d3e2c1f005faf248b321593964587852b830c7231504fe947d6a385f399441cfc52df3914fa55cdba25bd215f91a80fc8ffa872b34113dbbd9504868331a38c081fa659574b186169db590f48be67fe75885b6c877d37ec16ebde5ad7be6414084e88670f7b7f485efcf44599f44cbbfbc62e48f62b438319823aeb3767101ec6868e4c85b113ea623193ab9a5ae0ac226328ee4674bf0a90ff1f20eb542e110870bfee01165ab03c2240299319aa3ab1045247bf7f34e8410d96e13aae465597b42336cad2de00b67602a7cb5832cd7253b239ab752a85f452a6166e9de0523bf9c20c2a0c274396d5 -MD = 044d823532092c22a4b48181cfb2c796e1f5b98bcd713a21f70b5afcceef1d73 - -Len = 4472 -Msg = 9d64d891d99bb8aba23a29a8f69b32482714e031d31dde3317b046d000f6b7fc421fa8212d91fb66dc46d531b06faeeafd5ea40302a215351f746c0c42523ba5a3e98bb7b13870d04bf3e0e13425c4fdc11a505ed57c90a90fbc447242b3ee03268a29594dd73c705808efc16a059e08dd118b4a34f178175151760de963f89d34c92b12e9b58ace694fadd73a576193b80bfed0074bf5074cfba9e21da980fb366f39e76d1b8073e88ebf2d8d623827bad051f736d02e02688185fbc7ccaea69244fae2c15146e63b8ed0cb496f494b4b272bc8aac94c8f0dadb45fd015ab25b210170acd9f05afcc1786b758c6bc87d3d93449497d7637a345db161ecc9f00fc9b37677a4de55701f189fba0afba63baaf1584fc36d5819212a5299b39b2c0daad0302aea20d6544e3829f0b726b68686e7681ac3a91f543dcb79f2da30aecb30d23e252e7a661fcb619a98056f61d46e1fe473fd3d11b1c6bbc80be54d20cee843e0f4f65d7d49032f523e6a4830abacf56de9f46bd7c86865ad4359230a9f5dafc928b61c9456a1fbf1427a53cb82dff264eb2de7f9feaf739a47aa64c4a2fd70772f026a33cf1451e852a9e47ae083a159f62e23c0cae8402f775d84f77044204b765fb8e418d6cbb7dd7dacc74b148cbda95991f4c3cf65dd60e6f61b8dce59e6ad127b2dda65b3d0416a0f49392f1f107354c4de6fa14f1482db5a9961f867b921ef33697a4db4d22cf37e69211fd2f2c2944f16252a86755baf0509835ee433733a743f8f0b493e0eae8cb -MD = db593a375cb27df689cd78b5154949e5bc30094a05d704c0295d547385176662 - -Len = 5264 -Msg = 7dd546397a9a0129861fb6815d419a307f90d259d55f3503961754126cd1b776d3236aa2c239b93f8e2837220b80057cf42050518d4f1c2c860840102394b2b19a5f05e4bd043055d8aa9178dd9332c2bef24a181bfd07881d448a37a241349a9a3020e9b021f0d12e4bcd6a1aa3a968a5adc795c7927e7f23743a6d30fec3989a3fc298e6b8811d56b3f2df0cd7f3d871fad0b0d83609795f3f569c16f3e9136433f3d9a6f2699f188b08c1f9589778ea806c51981031de9a4ee8ab9d4a2d73beb5bb9437f632c13e7b18f72a4d1db2d8e8a3604d497d169c48f7820a281721716d23b1e2ed63ea8e2a2869e7df0eed02d97dc5400876892dd68c09a8b7308345023219efff8581d24143ff7836f09031fc0368b976a29f15a0ae28be1fff02011df1b2a6531ff0d0676ea124794e052df93c32ffbb8bc11b4d65c793880d076f6566654e12b99e5145b33734d1adb3be7731095cfeb9550985b9ce7019e0f855839b1b3163dcf31c8319a9f0659702ac1ee8d71667b3c5a5f2b3259dfa023e7c1e98ba956f0e57fbc8a8dfa05e935abe976b8276200177b83a5ab46254fb42acdf632bc35eda32b4bc69c18ce32a23bd8ac2f3c44e2bd50905b764074f516bac6d06570357c5ec10086338fc1de2c5729ef313481cb94562fcd01bd3128e20467289259d8259edd7549f2a373346a8a27c08c94ab0343189c6afc20fc639cb4093f27cd8081d9ed1472381864edb3518cc08fc11322400470c5c420492dbd3637a4b46fd119965c58af92331962bd29b35fc96e6cb0f1a6476dd81f79ffba077cf9c6a54c456ab7dc529fa8032bde8f25feb7e11a27fe7a8ab3c693314219a4439ebd0254adbd9bf9fb9ecba4b19e0e6f3dd9cdae1fbcfdb5481e1ff1ad62991614260b8cbb05554c0b3e32908c8203f99 -MD = 0599f88c429a3d4fcbb0206fa57e344121afdf8e56f78e3f5e61ba3bcf134ec6 - -Len = 6056 -Msg = 42172d5fdae447c4cfdd13836bb8b833c0cb85f7327f92983501a4d7583a5201830266c37c908640b0351461314b526cfb68cad97bd7ed615248fa5756c6213bd9eae98d2f4ecfdf6a452f2e68c9687210b53c74d83575e08a7ace9b49b21056cf377c64f80669c884742e93181c426d871ca2715081733e68ffe94a39e6677aea51e8f0e1a09d258629d7374a2b2884e903c577eba32fa2713f130d2e496eceb4a0f4daf105b31bf9cef4c306de62dfbcd46e2fb283f1352fa3138c31c56d7bb48d6aca301bf3d464ca4bde521d37a78bf66340ac09011e2991b36e4941aba8727e1067a7cba4784f85a53138d0f104dbd16d54e21ea686e772b95c7fa6717e77dcb05a5dfe102e4267c963bfdfd61d36cd53105aa82a95f2afeefddada07254a10104a5a9a7d1fc6d8811def322f1b2352df1e1e90d372d1ae1afa62c6b5c47380f9e0a788347362409307d1b243252bc8d72636bfea460cd905fa1f52c3847b9632c44bb17d519f07c8c86c455c64d49704cfa81cb6382c9776a61a67788ce9b9859d4efc9fe10495e809c9d4c000a9272ec27e8e8171b84f37a65aeb1d054550b814b950e44d1952bb71ee48b8202fe11ca7c0ff9119386b0ea1e7c8fa1618c594d0939792ba66a708a9e5878cecf02b9825745630573452c43fcae457e8e87fe17ae4b8f25274fa9958b67b848d736e68e4a47ba453356c21290a297ca240e667b9b59b4c3dcab43427670ae82b4013558d57553536c221ec07af7db06da562ed360d28e8a3f03ea2be021effede08027c896ce2d2864d9ef80c2ca3d71a15b3d98f4470dab6ffeabc48e9e12fcda1fa63c68cdd250a2fcf03d49f769d5bb391d8872e0057dce5e16e214726980b6579a92d53b6ed704f2b8e64fec7dc27c6456ae90db164295c5adbf9b824ca0fd8fca71e5fe47e412230f22d991c05f6a45b0b1552089224d9b36042bb603843631ff82a1ffa5a055f8bc99f1ce7cd50f42f23aca97a6447d477a58ccf6d555e9a4016d1026d23354d789f49e8bf74bf3c4e6f0f529b4d1ad334164872a0c3b9e5098d93a -MD = 6c83f9b69754facc3155da93261ed99c38e4225e748e8ebcd04ed62719fa56db - -Len = 6848 -Msg = 9c4bdc3b1af6ab9dc7bd2dd90e2e429a07d5dd5c48bb7016fe2ca51d3cbd4f45928ea049e2cd9c6d6f7bcd613773396983a891bbbcaeab28807c32fff5709d2f5d935dabeb1f5b13d53ea190ab155700e701f253c520a834551427ecce03868425e27c2adef4d0d7238d102e131c86a65c6868eb0c1a4f82a47ceaac6e80f48e1104638e6354e3007ef182021691ada40a665b4d38a3885a963de5077feece934a807c9f21487cd810f15fd55d7bb4421882333ff2c43b0353de7fc5a656fcdcf8de2e25c1d783a50115106f8fe282c8ae45588ae28450c602e71fad8dbf65b141a7e0e7ea0ae0b079e5fb9855ce017ef63633f6afebafebcbe02f89dc31f3595062fcae45e87b419fea8918574818ac15dd2a4a020141bad752161f3bb58d1e4b97e9427a793c9f9bab22b63c57af9936c2a65082cfec7a4ec53c3750511b465bcf0f6b30c50c1496b02f3bad04af8e7f6e10ced85c997558bf099bc60f861aa790d6f10fd5d1e6b88216705156fed31868ce8dabb031f11bcae51243f7b4e25865a69bc1b0755e28a8411ad15585b02a384a55a4d49a37c26d38636f108ee695d3e732eb5edec40faa1604d4092c6ddd67eaed6bcfbe8f73316a57f462fc6d8764017f38e8f6609411fff5037bdc51587c181fa7a98340569ce3b677f5e7c1559f5c474d55a379e06463b406b27ba5c4ff3bb1006bd39495380b48a3d23528280c6055d5adcf591a2baa0a84b6f2b14878ba6c201c95d1558d4bd41d00d0eb2834767076f861466bef3bbf25902abd0d70ff18acc4b140c121092490879e527c9e045fd83f4189fb36809b92470a113b6f717d4f6b0e29fe7faefea27089a44dd274eba48a576af18be06673e379f5f9fb7862af1a96d4372ca32bfbc2782bc2592cdc82df8b307573c3e76f6d61b06f9e7c9174d9308892b14f734485522d04ba96fa1948c525b17891e72feca98bc6dfe5d047aec48f3797199d25c101f33a7d180c12cced8fca21b32e5b6839ce26461ce8d0a33b2f4f666b73457f6cc58d2b1cdc1473ebb7ebf68f849ae9f9c1b65c87a1b6bf7bb102a4acbb4dc77bea254b0930c846a7e53a808eb19478d1ab9fa88fc2a10a6d5d77db433ee49f16ac296547d1d64c0961df46187cf21ca9d608b39c153b8df97ad7929ac4b3112551c2023e87e58efa7203d196ae5cde69881a031760294f0852 -MD = f574ac85532bc0c6c4e7614a2e084dbc49fbc474cda593144af28c5cc5f293f8 - -Len = 7640 -Msg = bb64be5c71918756c611cd6e001dbab53e6bf9be164875537ce76367e5f9824cad7da126b6da63a0532b3fdd64dacab2c2703912ddab21c9a3d2826da44504927458803e5161c29d06108ef50fffe0dbfe8a78a81ee19627555b03904f0e50bad89c628c8a4f2fb5a969c29c4bb5859abc62bf6820115cd35a2dedb72d7bef2aa1f250f8a9cc2f5002dde4bc5e244056c2a0153a2d64f9377aee48ca87b5684c9701516af5ff4cd6db15fa3c91739978d9eb83068b02f7b97d471cb0a5e3438782726dcab7110daffab80f042ccb1866c9eb10b48312dec32adf7253cf2e094229ecac00382afa43276f28fc775346895a49c42c5dbd34bc4a5f519a4dbe41e7551817f4bd709cfa2ce24f0cba34aa4954ada756612a830ca56ec26d66ba73ddce9db58f910e7a3dd0b88b1c3c95cd0f7ebec21ad782521a03b5ccb4644a288c5c258fb7fb2a1d72da9ae514469f3541a1251c6106ec2a502cdb77578d98e65cc755ab5542ed0b03132f63dc20796c49858abd1137919215e789cb3f2ac938b5d6d71352af7ece564320105c124dfa8df293ae14b29812d1fe67d1528208a3ff5353cf948a05eed53214f17d64406577b0ebf650bf2a32ed371c9079df7bb1a20470e5051bacf1e6a7b410255d7c376d86389dafa66f7bcf5b51109d874ae906b1d75f8ca99961f36ba8743d4629f7d93e23ac18ae8e74e032ad5aa4c39ed393243044107ef4c563479725ae676e2e229e532a7220b0a68883d97578db9ff8b224229d7be0e6a69e00292c5e087463b06f711fa744fc9730187c69ff1774dfc9785571b418978b0c6107903771631eeb7824949e629bd13eb73f3f23bf461142e972c8a36d2efc1531d95920ea62e83b83158f3fc2b4dc1c29cafeca1a3c14833f21ab3029d3812137468f00ba99470856eb1b72ac703e3035c4aede717f72f64209204392b0a3983cf73bc12a31c5babb4f3d1f67f781e4a5d658460c36b201b9d332c4f2eae9e20894654a8252eab977e9ff2e3c702c9f40a703ea338a5d0e6e26e69b8facdc6763c413830a233d6d556068877303c8c8cde0b7b22ea3fa8427ab46b0b21c028f152f4f5409cd463f1c5d801354dadcc915287c8644a811cbad0a59eba262e6c3e57e20a5c9778d95938750b8261af009e0285b4ebfc12b4bc8ea2735a9a70d699d598f5e904a9bd88487df5f33ee8df0f5875bf2e518cf6b3ff3b9740d1301eb0367a267a76ef771b50436f1c17c3ae61eee855affd28596dcce169217cd49afe05163a8560a29c6eea75b5419ec7f532105df6f541ad531652346750ffe6d1ffbbeda0ae447ba41f91858728367e49fc77374 -MD = 19636dfc80fef6d47c7ab8fa620909ccc387126cec56415c9a898f64be728515 - -Len = 8432 -Msg = e5098b6a0b1cfc57c6a76537104a39c48baecb15c6bbb46fbb0b745f9c9e5c05cfcfabb33786f7b7b5b0ce74eeec9eb84f87d2494fab3ec1f4d3bd9c99821890ee352a1d40964264fbf2c93c6ded2583cc75dcb27bf4fdb489cabcf97bfa5cc64b2352cfb0b3a707a0579eb713b697cd0b5e3377d1feb9f181d7b89cc86dee4fed8269f10e44ec48adc6940c6badbb40122c1dc2d9323920e4e1fbad0b4397d4dc38b8ade3b3dace2926f464fa3b5b82ebc5e3b81cf647e8bbd2cb55c9e31ffd212f8729b66739421c6106e64ac83d3b9e13cd8321b3a9f10d9171bb8cb74e71c34d1e8d0fc8d14b8e5e12bbe2bd2a1431fc224b70d228e4e2063509db26ecd9ca7cc402763e69928805600a4a80eab4ae6a2c3792b98c6942195e643f98c0dc3fa3c2b07431cbbe113e38fc0b7b45c51c4431700ed29d2736b236f63f75932329aa60be9009bd7832f1e1b9ac1503ec84727a1e6c8423c7c5b903e763262d559078e654532e0868f206a468b5b5ebd3eddb4f673536e5f0f8160e5f3311561b7cf79c9c440974355965c931aec5c7225f69f776f052ac4bd6b19f85389fd61df60ecabbeb00c8886ff7983d20ac5d81e303bc71253f40806772fd81f938740205a5b7dcd07cce083da258b493d275967f91e4815d656936b342727cfe45f973b2a5ac257ce64c5eca4f53be8d9fd90c3dfcb8cd1e2cef15c307449ed02c2e1704f4f1be76a40b311ee7cf81987b5089252a807ef3fc99c79eabbc0ef657d897037bced04620d32a425015283bcea1b53e0484bb613d30f14c1422f5f82cc29ab7228b8375c06bf13d746dd9ff00953a90720badf2577d3ed62cbe7a5f15b3c929d26ffe8aee9d2d17391ebc6a79f4bd235d5f7b2db2455343d9d7c6b27972cc6071c36a0d112f86d98972fb06a186e900abc64e9ab653db9b05b70079c0c84a64e8cfee8690eaa68a4bafbb5be112632e46894ec2cc6e7ce697a4513d517deb3e20dbb37ed5963232671e27ef9f62d6b514f0a22c5a5dde2d77e7e184965958f5002fe17d47fbd5d9c407644d443ce89eff427360cae9aa788dc8d7d9f62439916f139f094ee035884cb29dfa396941f0eec9e8e782da88cdc18e5bc1d9a5351b57ce15ac520ffa47e666f87fe5b18ab3c8cb2a48ecf81f36fb8397c6a7a5f59a9fa96cedbb4ecd1c7a6d9d65afdb6bef7791600b6e0a18ba23edb06fc9ec21162feccc54f2665611f10db53401b18bade263b3b972da1a612115d144a5426097efdf5c6a5d1f3c2d318f687242f993f5f1884bd95f2ece34dd4320cea46f5a26c7c945b665402778233bdda9d97c2acd8c4a4ff39dcfdc3a3fbfc5942e3ab8ca9ff4aec17293c1fbaf583d603002f93f9befe8909485eb7c30d0e91fac6c228c5fa6c011eddeafbdbe30af20ae53a85206c03d37ac17a30096bfb4f584cd3f72ef28a3303cea9cc636095c70bb36de0eb50577704d4faed05bd54da020 -MD = 3380c8dae5c0b68bb264b757e2451c21cbe2b899fe7a871ab1bae6041f48e7ad - -Len = 9224 -Msg = 681737f93ffd835d7b51afa871235694481272c75a1adb4addae0a3cc30723c8debb33544891b5fb02945c3edb660cf694d7298d41b6156ef2e8f4ba93b6b33d116b48a0bf1f3be0f7ce65ff04adf8f93fbdbff979a0a7cd99ac7f97863efcc6485000456a4e1bf2a2265352b49f208393ebbb72c97f984e1a22313c6444064cca92e2ab11c75f1b4ac5aca1b2e48e7dd68aa55ffbfcf1d8bc73950ff573dab5e058763b7e320f4239d2fb53c7254ad051c1062ad5beb955c9c7307901707febd2ca455b7836314fb576c5d0bb0a5a624cb9653a206ef8ac87458ce34fe6fdd4e812d674c67bcf2907d9947f563ac81d0f994af7a3b3b7c53f1630b3a87b5d5a6a55b1ef31aaf0ba7722efca5f5e9ce8e18a3dc92836fd883861a453d4d7a6649fbe5f32816b9de94c7a5f18a01ddcaa0cb4c718759ed2ddbc4f71299ba3e0d9d07267a77e65dd9ed0086bd2df20924dd63e6f4c54943eac11081e9fc58713a3459c51b5ef41b8c149f59b5ee50ec5b88851becd8ac04add80b3331b192a48a94662a6c39ea6363b006877257a907ed369143b04e2c9fd5851793807603587d31beced3b513d60f23d8a888f654ec486c3b06e5723586005cc81b6ca624fd6090b63ae84d1ae3dcf4882550570ef9fb9dc4cdf2f141479cc39f435cce7213f335fef7206e6a0d5ba687966ed611c1754fe1117f57fa65296dff93b75b753c93960b7bf2957bb319ce69744b0017c353f6f279d0f2ab5f34907b9522d998c7c0353e42055eea8585b0a0376b718b8006377b5f9e7ddea62cff95b015c5774617a839d1af2710f52e11ce684696e7781a660e3b4e362eda90efd08d16ab7b47f84370b3768a99728146467f72dca62bef170db556d8065d0f05be848bf82f4df0ab656fe1f5ee9e1de2aaf566df620c12df1c264ecfefadd5c5a22f0c37fdb87f549a5f78058ad8526b5e52990b85a924029c369c8a555da3943df51df7812812b3820abf15e8a1dd44e32f9fed9b837146103ed683d1ece715e46f1793341d596cbf1a1db3a28b0cf3dbe4c1e21e1ba8fe0ad78368efcc2ebf3805afb7a0f891d4a3d61a7b2304601cab0ad5a577e229bf0e790995f98bd8f4ab414cb1324a7a7fc2f74bb8f4ae7513d31a1194536781fd7d9bff9799ac745ab0ba553c629361e2aec6181981d9ca7dd68b2c4b1b2c302dead8cbfa5a9e8f55dad97f95dc63f691c9fb05f97526cebf37e67c1649a0b2e4d887f51a96d2987a9c172279ea2c9701a6eeabf52906005c79a48792695598a6c9421184d9091e3d76fbc445366dc1b6c81960893807fdea1e5de54be4bb4fe82f9f97c5bb729f22fe1ffb842b9805259013ca220cad15cc987b0bbf6652472d9df90e6998cf89af83cc2ea3444befd2a1665f5c1155e6886a74714948bb1ceb76d6cbcd1b706c47cab8e44f0af9d0428e7986940092feb226d29c8616464fa65cb1767c9e05b590154ea2d40a1264f989d5d66644f4bcbe302e040259944df2b2219504aae003fd05f5e0deac260c6c55f3c54f48fbaf2128ef4e3a8d15963509af8de1bc9fc6031f5724db7bb5352f656be9bb9708546f638eb18b1b5ac6f1e5a3e7806da57a26b3eaf536f3407d972 -MD = c31bc10bed1384826cc30369b2d0b5880422e1a34d0eea0b67f29f40de17ba46 - -Len = 10016 -Msg = 3842b033f3ca31a6f8e5a638b39efee6bf73cdcc5aff57e816d6ea21d2b17288e9cb47dda98a495507622f9a90f71c14a3817367de75ed3dd662e9450b18037c1b10e7ab35086830d1eecc029eff6af0bc3078292ccd1e018560cef2e8d4d8e135da39a37f8cb4c0be502577c40011027348811b2c4f11be8a994431512c1a42a1f1e5d0705e588c3752e101ea4039d22e903943c742effb4fd5f1092e67f124c61d9237eec57a1da2baa8a8f80808e956d145abe3f0df413bdb7d8267ce84110c26e8e2e20b43f968512475d7a0a9ce54d3505b699f0a17b67591a4e4a9fc90dbd391d83576daaaf2dffb6f6d5042098e5e0059429897052869d5788e40802a9bed3221cd4f67b8a72cd59fa360fc236e3afdaf5423af93f980f0054bda3965b43c76c694dd14a9eeff5b0b6217fea35b2ef06589877a4a92828b5304c04fcc8f8802ce716a0707312234bd90bf7111bd048181c80e1fb159374d6ba23be9e4929981414b3c6859d75b09bd169e7cf6fb82570df8fec751b767df540b912f37263799270c9c602848738211ddfc48d87f711b1003a099b015d9e816290a4a4cb429f2899bd217fbeb3246c3cc23fc42b0987493d03cbe58d95611bae2f062aba238356ee026b45a2a5ffedbca5ac1b9f6c10b9d471a5dd16da6024720899edd592c0adfc3e05fcd6cc4515fc1e8bfc7b9b2873650819fa1379162c5ca1f276942cd18e32c4742dd1a27e85998161df361349266d3bbac52a1dfd93dc8f825d7c4e2088203a482119a516ad0372c04c5560fd136b80eab6c115711b6025cbfb0463581c4303f4af2550a80cd86729bc6010beeade7c3c475f1c2af385f951d7a328c2cb29b60c007b319d2576c2f0b7dc8f091d4492121f7a8e85ecbcaea68c0efb0b1532d4f0cd81d480776d4ad7b73148561b1c472e7799e91c47828a2c807e569b7b0cc5357edf95dc832a332142e4e93074f41fc41843b858946620664d97c7ee6cf61b6c9cfb021bc94c207fd38dce22ab3a909559fe78b563e605e65bd1cb9e8bad5be8905ab5c8ca319745f19283a73e7e2df4b520a6dd3660af2f23c2de062790eb4c01751d6df6890c0625798638af2d6c64c250cf1a7c8480934dd17bcff12f6e0958e09565ee910352d7c962416dc6b0880a155e07a6c03ec53284215648f748931f03da6b1307f19e9108947c0ad8bec0e4d4d01f65821e476a517b33cf76ff8bbc8548c7f45c7b5bd99d9922f6e1db91eb15d1ec1968c37c5ddfc5d2d53d1765c9bb6d1702ece51d2a1edce0b2709b8da56ebfd832e2a2d69575adddfaa81493cf3ca3d2df57e3550af2fc3fede373168c36167e526e5108a9b9af9fc0467b98257fa975ea2bda85e4c0638ae9d8f6bf08025248e88a4264f32227a296a6b105750aea9ab3b75f324fedaf6c36bf8b09b16a1fc285c4fb9e1a35c2710e27594e2654c39baca8d5fcb5014c6e6515d46900c3bb758a8cd0f6876aeca59776d8f4c1e3d103656ed327bc71a6ebf55a376f8ea5d1cc87608700b348229ac2e3b47bc03e9f6c5e87db45bed55b6f582b388fb396ef520cde726f2643f0eaf11c7055b9db8b20f87252f94492d6831dd75c4c080d60807b65278468e4d3f0d27f9105073130ebd3bcde94d630b4a1a70d1727047fc1e263731ad2f3a14846c78bab2c40d60d0770c5d2bafc455265942b0d932174afe255b6c0ed4f1fca7750df031dff408c1e403bd3de2f375c2955bf8422f762772ab27ece35e3a6d6ecfed -MD = c3cd7be2de832774c614ccf60d030d75dfacf3cc7e49a37af349a4c3c196b106 - -Len = 10808 -Msg = 9020918aad4ebe24bfbad9f9109325d09ef520bd79ba08986d949fade1592cb5ff9dc2061586c4063bdca9e53760fd8c9d5fa8d03b8673ecb3f8c82e6a9eb9f0a1be45cae2d0d6069e8d0d541448c2bf748147e045b8ed52047fca660ed3b917c0aca140dcd3fb0c2ef48eae70f47d536c84845560f77fb2a6502cbc94a03112a28f61ceca383b00353ab35c130b362fcb90e89854eb30f4e295769ac6ac2bc98f8e0ade76a69ecaf98605c4c536f33bd9ccfa0fe93d0800007331676aa0ae24d1d126d7a6c62d53c3010b4f4e1dbe5fe0614223e6950fbe4814e48a4923c30baf813c212340ef81dad24d6575679e832677483c159a4e1702a0176d2bde716670c6d524b5bbed3d8823536f03bd9c8ff43495c33cf5ccf1753e5277d878c01d5dc7784723df2d701319a6d3c1c6be6b92c3b01e244e9136ea171e10179ab818beadadf53755b900c4decdfb742b0e00484a21b7954ba6cca95302a0b1ec623fdb9ffd93b7c599d7e39a504de79394345ef271f55797129dfa19878f6f15c57bfbc6ee8a6cd6d3dbb874b833e1a757f01be2273f31d8dd8f2591334617bee9b2674a0a421e3171f68a958b14290f5f1dc943cbffecb7108c71e5912b718ed7cd6852d923957e7a0fa32554588872b4a1ae3ce59c50dbb27b283a26a7472e96b54406e2969864f70d494b9866c6785f6612f6fe7e25edcb4390bb7c235f452e50438fad01f18befdac52fe1a8abca67523f989d0d339464cef18d1a05827ca888af15c2cd669c6a5d5ffab685fe10d44f7c4b4bb14279830395db88b6787b0b44cebfaa63c03f717e5ed4a06589f1ae4410378fd2194333cac3cb4f9f09e95f6ceab6ec29c61b0a250ce426b01216fe184483f1d8819b790bc285f627fd6fade74922108942d9403aaf53d0cf6227ccb56058f92b42295faedb3205b51bb4fc9f332a9eeafa2018a59048262841cb1e02acdd30332494ec9c56fa04b32c61547bf2f61fb4b8999c4ef7ecb12477aafee76f3b1d58ef8528bb7b047c88f81dbd63cdaf1b4e42ecd31e2b67f82bcb6d734cf39949036aa31cf49179f59c4791403f0b7d182260c0c5fb76e083a606bc85197e203a9a5e97cf30e280f557e164e4f7f587a097dcbd7bce1e7fdbfbf03e3d3659f77a8793084955b44206218e3fb274d3f63a157d8cfc806c6e8794519ca28ccc489130d19f934c50e7af6215cab09cedf16f040ad550f7a8d20fd7f17ebd011e3805ffe004b4fefe9679823face8588aa1c5cd4c3f801d1ad6fc2e988a947e99f1605a87deb4520677eae9d48e6291f32ec6d60b7393d90a9fd5000d6b32ec839b29ab8fd59c2fafb38cff9c17252d71bffa880e199112bf5822b519c79c31255de959c192737f4272e72d5ef039164a7ce84b1fd883b282276cb58447dc37c76027cce3bd412907db81d9e4c0a632c68e1888045870a09b3439671692f8e4b1cc6b6cbdfe0f154617e46df430746b2f1d12a5864260c452a814359651fb222ac83ea119fbe42b474d984f57e8aca7cb505f0c6d3e5b06eeab8286ce2bead87b7c26d3bd5fc85351a623e9d58f56d0e450862381f36a4eb9640dc384c9cfeeed11ad6a72d0c375ae4a0fa135cd78cdc0450f548a0a9484f9fc3c5281d2b14bc6af5bce00f6de79a460e4e1414c1c86a75683064f2ae290f79b979c8def99d94e7db7672f7b20477c112810bfb149e3e3ab68a099fc5a5afb67a7096fc88e7fcfa4499ec70492c77e84659578a708ccbb6d498c302807cb4d8bf302f10498258f4c99d98f3c3ae2f1e222da34d4602976c4ab31dc55eec9342d04edd94bbfb3d79b308150c8227e1f52e846bae059e25dd718f7652b193dfa766033f0470c12efbc95ffd25352844efd3e41d474fbdfb8cf174692548f -MD = 888e223d5a497fc679c3ecfe98bf7dc531a4adf3ccf0e6d586c8912ebf781af1 - -Len = 11600 -Msg = 562d412b2b65b5b906848ae4c8b6cbdbf34726e6bc659d4d62267f76bfcd974d1d49a3e84afe086cefc8c32a1d3da30e2933b53aba8300ee200c73abe7fa1c98ac489b243083d5edabd1ede1633370a27c07cf2f12d113c2853accf414594a27ae321025047c8605e3a8ee4fc11e996096ca5b0fedd73c903aba70996e738ac4c90fec35ef72827c3f53b0bc6088880d1c844120721ee422e69449e21ccf4235a5e8169a19ec311a66dc197267f8a474b93d69abca2d743e32ce3e1647f5dc43ebc4769ca972fba6014a13b8fff7555c13febbf71c8c52adc672367f166ebeb643acf485c88c48eab7a685d5500c038cd2ce1f4e91c4e83649871b63b2c1525654a7789b9dc380ac31f7561281bf16cd9fb67df6515c9da36416d40b4276feebc7bdea28519e0bb5164570b7bb98f6e722bdbd3883dcd8bbbe2649bfef162c3c43f632720ba651cd0f99ba0c25200ca202ebc75c4fcc034500bf62c7e1284312715b38c2f461bbbbc4fa1c58e8debec6e74883aadeb5850ad1e9076a3f34ab35f9f3e55f3459af49dc707ee52b5a751a7bddd96a581fc6d2daad20f131c2cb6d82c71f93f216963d0003c8f9171d9a6763b1b2e3e5902e64c21295a4e15b0d82b4ddcfa4561ed960d7bce2ddd4ae93754accf45eab92258a32214ecb7486d83b393fdedb89fbde7a0aa2b5d98995ca0cd6378923d5ac130ad2e133ae15cc9561b6f53280b3350f5340bd27345e5ba5f4aff9577a896760ad495a2d95eab4aabcd605b5dbfb52d3b2221621387c878ef47e1a48abef49743b409422c71bc680143e794d338adc916157b48c2b0ba1ecd6eba343fd31dcb77c5e98fc8dd18a7f319958e4d2885bb32688a04e56323227609d9b2fba74a892384c6da12f34890fdb8dab61fe1c55a0ca5de051011ac1a75b3d0af628e3346b36b11bfbf56b4a99d9c279ac006e54c0157d7e7b74ebd6d38e72f97f8fa308ab3f36abf0269f5583f4e2caad20a7df7bce9181b6f6ccf915c3e56eb239dfacbb1b83246a0cf73337f492a74ca5ef7f39bf40f2e9d0e5b3d4c03e74776dbda901923f8e50ed9c6b1ba17c1671d96dba62ae33d8fc4b5f8b794e2410b6726585e76b12f18a12b58599c2482204024a1b5e64123bd6ad620a6a353f4c579100cbd470a656ffc36b0a18219ed0ed69ad2795a98424613e15b6103d382f4212b6003067a0c49948e6810084242a1456bf68704431998448a11ad32eb7c1603daeae6219ab443fe84d72b8b485376110a86555ffc2a527112ebb1ccf630b9759115cd44e6dddd9ecc865aa7967ffbde18fa6ada0df4d32e2e32351e9e514d0b00693edce8e97509c81e33d9a738b0e0f9cb4e1f02f9b8e03e8d9dc44e4e5f488b6da1560b77a8a409d73d9e150e23ee3f91657b75b9621bc666523a80984e92a49b9b4ce908f7020479ee614a60c33a5cb5479bd0a46d455855090ddfcfb99dee6b832dec0ddea84a5ebccfc1f12d79d3df7aec9e5b490156c2089aa6452eaecb560f859f06ce1b3dfe2f46161fb101374865da594e73b46446078d9ea8fc69bdf386c06c7453bf61e0bc40b14cfc84e9b89f017bee7be2e3495c43035bc14348cc9f7afee6fe2958aefa5c1e197e697d888cee80bbd02156549d578eee0bcffe399021a0cf2bcd84a15004d705a5236530c5fe02570ee45fe031378bc04a5440d32f310cad7b30687053b756820f473369c0bc6b1086905284ce6fa482fb94b321c3359d025ae696848c00271f1b495a6c13a645a8e5d9c0babb6c43969df5b78dd2bbdc5e494471665f5bb35d67ae6cd025480c509b153cea8eba038baffbe0aff4204511d4fe9b8e4446a59d62eacd3e7c1e39d814d729acbed54ed2b02ba0e0adff51dd7c697774e14d588fab830e0f8e95588ff1941969d24a8ffc3ce98ad846c5ad11ae1997b2accc5684900ba1abe359d2e89fd07eba5f966178b4ca00ef750f915ee8836eb00d602a1cbee92acc00b85392ae10ec06bd254dc8964195aeaf39a8f5ca3b7ef599954dc886bffbc86d4d34ee7 -MD = e65812200409ad7e1684a2df8e15685dfab7079449c52d032870d80acceab3f6 - -Len = 12392 -Msg = 5310977a5f3689bb9acd32b9ec2a60a027e912ffeb3c7fc1c7835a5fa01d5554577ee4d0a68243b04b01baae69a420d52bf79e39aabfb5e4118d8213ff9341a32cb711c650e6f6fa40ab243c5a007b7824644e45302d68cf43205114b53fcd541be2a6c22409ab80c1f1f9ca89e579725b57aa8c452fa16aa4634ecb8dc8004f6c282b2eeb946a2a16fbc0c2bcfc23a918f93b76b06d679d7e7f019e4ed7e37c67b029716d2e39e086f2018bbced8006a371886c3b8ec250179bf2f6bf137cc354a328f37280228a5afe458d515f987143e819d4ac3bba6bb9e0aa3caa25d50d7a28ae1cc2322c10db46123042fa74d341867717cc1b58d6aa76b0d6d5b4f6402268455424eb5f5a4ef3f3dc59671b12e572299e63d7a37a32848c2e0869e546948a74036253c451fe2c6df95c4e951877d5b7d03916a43d9b32c7aa0decac0518b7c491421362db321a0aef1456ebcb3fd6aa14158161082baae8b4abe45367f617bb668dd342e131e5512649282415859e89d4c1bfe4c42c1177b3a9f9e05375d1e3ea0a3a6a4c44b4ca07c36c48dd9054dc7703793557e492fc0fd0d45db0de0ec48683f1e402b3affef849c9600ba9212c65a4575aab9c52002fe81dd16879f5e4a0bea0b8edc6007462a5e77386182dff056c005da69b7c0b7db97b45628eafcda285eeecf4c5ccb4ae9d6f8938259fe0c1221d45322b36a3600a97c086656307f29e838afef73e4742fa09aa0818a0540090551b3692a85240a4194abc463a18fad10899f5a57bb488835cdfde3857e52b7c51e69919fc9f8650a8ebec785c8a20e82522c017ae83e602112fa2ceed1aa8afb9ae4508571298d4ecacfe44f0e5cea9812c4795fd3dc63dcfa33c22897be0f1347c21a7e334dff88f94daf21eaf6bdec5bf726790698ffe3f42957c54913b096a57153dc88cc38636ac69ca10725f4d98e329d4908fa90b0914932476e322c1044709142ea3ad448bfb9113ebb511bfa3a1542525387c2cd4211f6116fafbdfaa54e5723cff03fc36893b17da01ebfb8e00dba376eb702b4872227d5c5c2f2c038791a01a2a2e74df5e501c03dd54cb0009a693ac30edcf0e0e82be71932770b8e7f6e6f1ac97752d83b66b8ed1b4f5a1c39d40ee8f5bdfcefd296d7d274a73707cfa8be90ba5c6c8ff574ca46574421a36a9f1659122242f48fdd1a79efffcd44f86d929d1bf3159da19066d22fa7a136ab0ed39bdaa66daf6e8341882b0d58c678316da854f7c881ce6e3108faf6533689b7d919b5b6c770fd1dcf85ac4c43fcdd78b23b0bc70fccea529b535fbca233753e995b49e00ad9c9f126eafa39295876c802dd96ed55ef83e21869a47738bdfbf796f8fd9e824a33c1ea208b507389f283d1f88cd7355a09813a848f9261169c67544b576ed852f8f48bded61eacd1cf509224641118ad09d4746c77bac60dc52243facdbd7784580d8e7e61205ff07ba2e5e993279a48f3404869d33cd1e404acf85fe726ea4eff715477c2d1e73675ff2fa0c08714ce6459490548b50f49d95be4132a17ab234dc4906361bfed444cb9e1f242bc22adbb93d8d74e9ff89fc1d3999d1d2c2491d17ba4b9d446dc8a7e879f46b0334e5797648a583b7a08664c988b5626c0f12b091b03f371032f7979dcda268f98e26c565fdff0b5cfc92de81f2be6dd729b5f730750a8fe8170b1cd2e050a3739a94c96ea3c49340db56712dc0dc7b7ad8d9fadd50d32a32e2a93e6ffc27a5da1ed88c7a831ba4cb057925b63b3613bfe426c08188c292575c7b065d674ff597e399166fe62dc56541a40202a8f5bd0d1446510266014ec04d297b8269ef1b10b180703712227e76587f11fa524001cd31deb54a32b5e6d47d5ba5c74c2fa0af4f35a1b85021576613b15986804068650399f43f3409e2fab3b88d1456380bdb875fb1dce752d99d38e3e28f791d793e521c17cbb323cb9cb9e83a52d132e4fb1fa6a98921de8b848fbcb5fb86febdc0e61226d5f92b29215594b4670345b479e0b490a944edf581e2e5d9b4ef0bba53872127444c4a82f15064043d359701bc922e6e2399a6a0fdf70556a0fc6efa60fcf12402f5a7607471ff31bbae53562cfdbf4bdf6832136197c535a9f54c054d0e2b24f63b6c4a12820e43c8b89f3831e80d30c5f9b9d6138acd7db621d0618485 -MD = 2916d4595a3ede77f4165357977cf3529c672dcf4c39e76ec3aa848dba6ff4f6 - -Len = 13184 -Msg = 3cfbc77b8897b6a5613f62f6b1c89b0d68f272c6c19b9e0ec6331ef616702006e64322d3460a57d3a5074c719811cb5dd78900268890da0ac177b40d487735489da374843a1a6007198160ae77b1363cd8ac29f24bd66360ef62987ab60ae8ee690307b5ec309be8c496e5d6d610a453714336538fd501b758da1166e88f02a0524b218fe5b2ce1fae2c25103d96dd4aac376f70def57bb705c868f967704c0561630b3aac0ac254df2c668535aba8c8916e1c72bf9e9b09fd15e65aba138bc69d330dddc99e3f2e607ff15c45b7ce7527d18580bb38275548a7d0b269e28a8a0fa46ea0c5d80d55380b0ebef62218fa7648f2c3592be842ef687128fd4310fabd9c78ac271ff3726fba04d3cf544bff86bcaa6221dfa679f93f10e5fda0e4beb104712977daba2d0e731dc258b5322b6013f6869bbd29a26e13f410f160cf7df3c5a23f3e732a2d1b1d9fb419ae94270b371e57502b386457ce66d261eb99df89c5531402510b1ba1a2d3d09ba5389a8f0e6afcc7929d67bb57ae53d6a90a8e7deeccd34edc259ea5e9013f6503e72df582219e885b1e54a29614bad802e92fd72754a2a77c405f31da7128ff316988447a8d641cec84d31473e030ed5e006d9d5734a9979923054c5d6ab4f295865284ddf4770aaf968b1ad659dc9f2515edd968b512a59b9739ff5a360bc5990634bd959ffeda0a1e25bba7c8e775bff15a92411d025aea64a351b91b5400a4b0d5f889d6221567e24800ce7578f7945c5ad1cab4a33cee52ea4a6262b82c1d4dde3da1e10b422dac9def33a8b8ae0c1e959debc41dd51028b7f23e525ed06ea5f692c507e0e9c442cc93bfa9ce2190feb5fe8c9398adb6b0b15233356e74fe80c601dd91ca92946c7cf158bfe3d986c55ffc956a3b4a4ab081712a5112a035a6f591d1c7f0c605f45513e7341f5c583b3da0ee912e3632f1ce570cf070dd7bdf2c4a89f17b0c7fa10100554ea9346c28f7f180509af9d83b410dbf58b0b238f21335ee5792ed6a3a25c08856aae82c5435f731efa719a256829a2dd1fba8d4a85159e6415ef02e886c5c6a934901ff879ebbeab57c20fa0938063ca57946b7c98fbf5af6069d33537bdbe24faf064c88da4494ec4296471d0b5ad61a51144a1d746d33bfb37ce162fd45d7d0037f7d20929b15da2001f05ba59de27aac9af36ba96d57e48d16a17f98a233606ef5f9176ec657c73feb5f88abd7480bb1611b7dd5c7b0adbbf2d970f4fbdd4518ef283515cf40fdc6dbfb6fc810f01689f02b19a18125616698f3feba57bdc728f5724130bdbac3de5a2cd7a251c2e25bcf8908b5a59d4ab59155f192bfbb30c78f3f056699ac60afef5a87e1a1a6b950879f11b83a02aed1646911233abfc61c46f747606afd1d6022ed482e0984e1909fd4fe53493bd6e199952616d0b1d350a102d0c53897421a7b4de2319044a3429f8f962dd9300a0eb943f71289799d8a29c8683e0c61170483e31d913ece478e0f3aa0eff2c992804bda4dc06eff6df364b2d673ed43e347c115c1f61b0a159d783ce5409ceeb55ed7c2f0c8862c8ab3dc26e40be325f00abd4c950a30e0559762fd2dc9e087bcd0e562a8d1dae63ef1198d58aff6ef847600f1627284394ea453e53f31c57cef00fe243d837016cfd5a150fb062f89e8b3116af0d91ffb49ead55ce52154b59613a96f768852a58688fed595b995dc64e8782107e50a108e946fcae541941af9346fac1c858879ab32b886ee6f30ce3f3dbe7c6f3e4c5e65c8aa9708388d946089d741f725187c86fa55cacdd10948c3db6ae5ef8dedcf16ae0c2b16af4709123a6997cf0d0c945e095f08fc86273336ea04c3517af64ae8701feed74dcb635870ad166ce86bab7d875eaa41379375e191157e5bac6eb625336b4913bb20887a532c26965c3ea8299bd817658c53f80cf9247ed6cc5dfd132277a291a04e62c00a6d3014118c73ab6d57b7302c71a2ff4ab92a8981cc06fa62cb621aa55ed771bef89aafb15df44b2662f269c0f45d01ab5cec3e74c1b9241eeff2767257d1d79656ce2fe1ba1350ee8230daefe5105b44962bbb4d47fed87c6cb86dae413738bb0e325c4ba9b804ec3dd949624ba3563eee50c9b363bd5da4c81ec60124f1dd54a830fd9735cbad491e557fc12efd38c1edc1304e1fdefcbf8e8b4b1509e60e8aad2fdc6d6334942caa0c44b3970849f419e7b8c78249fdf54367c28ff7001385a497bf733ddb01be6b675fe08cabd300fd2a29c694e7a86d7119f41af726336c15cf6f54caa83b27e8cc9af118ce1c0d1ef34af25e9e44509f0ba95c -MD = df5f9f0898e0fa1bd9c3d3196fa8f7e6b01331d11eb214f7e5629bb7a1b7eb20 - -Len = 13976 -Msg = 3fbcbd3f57a9912b9717f91e81529f6736c6d06f8bc1309c5e7aad742b51b106da589c85db137137757ccf8d5b4a249481731d8c2df061d551c07e13182f238abf5891caa6e94c91a72616eda6311da1698874caaacfc0c26bd034458ac0bfd295c38354dfb38a02d41db484898df457980cbc722ae6b62a55b1b553a98aeba805a25c6daffa9252a46a939b2de8107eb307dfccd4beacd4b76beb859c1710d2b7fc035b3e44ce49c1149979bac9d9de6582c420d1de08893707bc228cef971952d96066b31ca5aed023b06857b9b73e538353b649ce3311808c1274a098e6457f425bd837077f4b7ca0bfae2c3f1267281574d5631796343802d4c1019c671ee53ddcf7f18fc4e66a92ae9462e352228a3d0fc7474098ba0871ea52d683816b2dd5cb0d0a3bdd4845016562212ddf3522050cd21ed1a06a97e23b6f48d39bf6fe0f1060a9933039b3f6cb6090a622689774533f1053180d8e5cb15f7f161f8501f59338f72026815c77cad6d8d581859192cd56444d676b94e8336ca2d374e1dd8e3ddf1c6928e7ea8f490b20426552ba68605ee347f54c528daadcd99302d23be2f49c3ff79c340243314891763799b7fdf5a114c92a786f53fcf84edd3120c3faa1b68850eb304e9d68d553f85d20335a7565005c6eb694421208263969921cdd2d7620fe7ea376a4d7fa8d5041b0d485c6f3ce8729d06963d4548c2f12f1ef937e242f89bc55226066ff680749104288d293a7d3c38c95bd2a23a6489405e3257e08dc770c0ef9dafe2b0ba4df0a266b7f8cb3c7a4b3c158fdbf9c0b5796a19a13695052d895a31985c79eaf6a642834b72819eb340d943d336e9701c46cd0fa2791b3a187b3c925e51b4bb152e7efed61ad02c7dc61b773b679bfb0414e194ea1c62ced81301307046f3831fe5b249d656495e40279d1026c283ba23706249d6951e3bd2dd428c6cc0b8db7d8886e4dab95fbc9101b8bf33fc2345f0f5a98ef677a0199f566b16a233673cb473576041a885bfe6c108d4d1691d16d2f131e4c8388ae0940b055fcf33a12f6b32ce4ca9c84de0c801f7e18d8db3b5601f95dbda5c511967778bd83235d91bf84335fa718d3ac7ab212075d6fe999a2ebd3fe49b57753c7008790079be818af23138fa477bbecd06cb0cf23c20314d7576ba8f99be79b2544a577914323d14cf6941dc89f85c79715c07f72b970d47fac8704d43f5d1237ab991a270355e221667db11c79786456140bbe523c7a002152f0b9e28920e0859e2d20d4c3c773b3dc98f2a6eddeec95d35935cc3367c046b16e702b627a2c978327329d6bc2ad8cbeab8970e4fd86dcb9718be786803e7531c8d1b8b0b11ef6c350f78ce38cb733757f1d82441f5bb42e1d69ac1e0d9f363ac883905d0ee029c77018a8136dba306adc57e2f78a92a49a237721e1560e1134342fbb4fd997b8f64f3cf9e3afde0c0489df9ae3865435664c5c50b8a2b18f87d57c42705a6e2cb7b40c883c994a4eaa505cb2f25dc9edf860c1418b3bb0379b73132ca6d98b0b74692f5c0472277ec6f777300b551857b9274dfb43673492d8d69b81db9d16e094344e7d25839c24bf47d71e15b86af81169a986c66f6526a7c5bd49f6ef38307fde11f48514d2c9fd082483facce65a69ed7ceafe9b6a7e6e09218ddf1718859c2f1fc80e6cf1f4e8020868a1dab504277c6f2fd2326c1f966a6e557e5de06655ee2101a6d5202ee8fc29d4f229fe7eb5de2a5e297e929388b04da7bb08b55c11e5bea8379587fe65c02fcfd503ea5179db547fedc50561aba3658d7e62c1ee39da9fc4a8f54fecc714c36232aea104dd3a95980550ec11660b5f0eafb12ca433966c5de13da08076c18d93f1734a1f47c597b35967702b23afe232363e1e0668e1cc7ccab5a143da8f346cfa9a0d2a2142ffd7d151b93849589702fb51be9d408267274ba57bbc5b4561f5356b13aed27a780d5558eec040ce2585e63234f02443e6694c54557462adbb358b2e8433c235a85ccdc237496fd936c4e028a9877aeaf147b50b58f1558deb34e22a883f593b37cc21d8bd5d40416fc5cf7c45ebab402fcb6e12acbd9eae98fa24a8455cff53ce6539e2a8831acd7a929d772fa3200d49fc5fb17860a3d86b9037f0e6111c471530fd2820446547ff33305e90374019e6e27130e460ced20bfd054a91e618ddb33456f14c268a75a5ae727c8f30722baf868ad61a478666224974fe6f645bde51792a8754b3ef1f150d49185515200d4cef93ec3f9c325a557d6e53a7124d11960863306173fd0ff7589f79096eb185642575ba7ee83c774e9fda92617957402be8e7359bed1c0cf2955be8d4c48d5c9f311688fdb20b85b5ba9f04c71fdf31b721a0de29a9b5ddaece65adde9d1c5aa71a609ee482074c31d3a7eefe8e4fade3bc7472332f2e4bd40aa5104e84c54621e83a435ce098936bf4d9 -MD = 46d6071814544b8de5db52d4b4d22023ba2e630146ef4e47b9b280341985f189 - -Len = 14768 -Msg = 1718a57fe1a0a012daddb0d30069525c5abe69147ea9df4957fc8f7f25846307c53ab9d333bd0c884d00d0d5da409d04ca3a90cebf9aef74cdb60b0b7e7c6b171aa9265c253d91f1282b1a96b5547447a5b6f512a4e13c25f0ab162b5d25a3d99dceb4c3be067875f4c558bf998c1f50729c5e8634670f8546447887c9665273d60f2bb00601093b383650f78ed0e545b95394d57712afbc59e7f8c6ca27c10d4dd552ca06168b6c7ce5cbe79d08104f03435fa575cb66f1b1fd6090685039d08b89f2bac52e482f493c9037cd1ce695d6d4869f377b7a4cd4ef768facca00e31791d3274b2f86ad25a2698e27f5b040bd6ed36ac40834f64c2303689d7b5e6f7957bdbaa1038e0d9b7f1c94b179b5773d790cae245cdc17a103cec6444c9d9c3a41781bce90a878303c72f275913f63e05dfa15605dbad659f6a14fa7250491e1b9cbf1dac01b166e3f33507b26942b2d8265457ff5155cfe6342abd0efda77f62680e5ce79310edcf12755c91efdf9ac5115e6890b37d117b47a83c790687501f05d9eb1a5308902ba15aa6963c2f2e630d1a18786665c2d50117f92f2f6b48b7e2bc58b2b61ae6903c7f763db2b406288621e8050eb25c79fcf463bfbcb5c1b3ab10165f30ca6983203e3bd70800ba8c291047c500e556d097c81ca9531943a8bb9fb46e5799817b192168109087a414424fb836e1614a8f6dfd745a76e846fd9095a36e9efad6fe63c39b78d0cb6b478e3ad9e924d89fecec1f1b619cb55428d6bc73de7b80d273bc8f465e6d4e789c598bfd4a4f9ddf9f9ea7624d3902f3b0da4ea64c71adfc71600ee95fba833499209dc2e8c633721df220f98bc0539e3c27f6ab2715e4cd8e1aad04eb4d0c57b49ffaab232d3c0fde9316419be729cc114c3f030cdcb7be1038f4199f993c3a75142d16a7f90a0157dde1cafc01e7f5e6c3723e4c4ab946ae477ea7db23b5656129afa5e59e4fef105f2e062ab520b4030a5acd83c44c1fbec2a7202c70ea50ef4cfcd95aa15021ae736573b655668f1cad332141ee0281d836f83302055d95a5fa8f117586cd6178d6f2a41d772bdf9a0895e9e53c5f157110fc210a65719bfbbef0fec4c319f705d68007de9ee32de1c91d880c23b4532fed3d9a93f5e8ec7706ace1d6fac88aec1e882f58411f12aa4b247c2528c4c35b2807003d4b05ff9e6e2d7b0a825b65820b658b38e241f64a2b3536aedfe2de896e12e274e96b5dd851ed1b0dee354f6e19b29bff16fe7157d5da5827adb11d310bdbc1c9358b8fcb6e86522fb2f88106e5f9d1f933a6fc49d78e511e0691f7f89dbc1ea8d3e8fdddf063b10e6517a2f2eca5ddd5ecddff96accbb2009f180736a04e69a229063096a41fa81879154da89a31101386f603d4c20cdb6dcba5b371900d3333c955b06bd614a7ec6363b9ae7b461910b6a1a16ab3dc6db410ed95400972fbdc296a05e422ed50e8b8a59f6b0c3f397be04340fefec4c97203322518591a3419cdb59985f704039bed3d6764c99721a3986d6ad80f307f361725db612b5d6c5b2acaf3d7eee3607475adaa224fe842364382a7ac61aa1f6ed13b20c0ecc7154ec51cad406715d810e678c039ebad1b9276155fd2a2bbfa9aa5e4ad9e19e1bf33211d1e55fc15daefc421420239402e46a4a82be12ec0c12819b4da8f2f37dac6c36edf9f0a6df97f7329b811c55bfac153cd746e7272d3b5a11e3feab933e868206459723e88b42e88049afefc5af1a107d7c1c12a2cd2c1e0932657346078a5cca02475f4e08b9b875453106ac7b3543559ac8f92692ecb3cb6564b2d380bee2c94b910da1ff044d57b88fc7d2cb06960e59d3067a2482039fa284d103502cfd4d49fe93a91729916ec9529cff4593f2efe0c4a0682cf9f5cd114b369e20dc939c23155a2ef9326b04a101ecfa94e63d3f58232eb65256709cdc434a6c97d48dff025ecaf84c26c25f67241e8c5e076147e8791a2d3da35e5628f475345e1ed4be0e624bceb90e80c844449c7d4cfc444fb94ccb9596e8a64120e520c01cc24f216ea8467ae8f18c8760e8cd9505cfd09ef327a9b6042b30a5e99eb1d67ac6e5704bb921c280d7cee4e298199b3288eb7ebd8f1c573076e4ccaea7923f203480f2cc1b466f2ac92e27f2dce8597a2d7f353f0e8c42c1d0aafd958929c3b51307f01a581b498dcd9497ba3da29586c8730ca22b613d60426a7fc6cbe029e26c61b25cf80a1752eee87d5f42af18fd60af4b0e6f0311b5d20c9b6af51e3b4e467880bb817aa3203112210c7478aa88fe1b3aaa60db86678a7899a98f4abfa1a933a25f7dd3b3a0a0facbe7596312cfa99f219f884f631f7296c1aa22ce7e859e7a5f6f737c10794289c3187bd91a79692347146fc87284914f5a96351140a02b350114ecdf82541fa550c86243882f468ff5329baf793fef89ae94517bcc9a5b4cce756f63d0d94037bc1f9407259849cb7321966a41f7942d03cdfd74ec1c33a80fbb8470c4afac284d449b8fb95d79bf0908e86392558924a269c16466cebd2f0b0db36e247f6b5e4c60ff410c25df54ff0f17003301d554d38f25b3035700ca0c9485c5b9f086c3 -MD = 0a147f33ab036e8ae148061028c6a557e2eeb1a6ea71b3760548734942743557 - -Len = 15560 -Msg = eeb1a4c660be97e365dfe42a4d3400c6e661caaca02accd2ef41be9bf15b4c9651891a696bc60408b0ccaa2b4c2d2cfe079e321a699630b42218e814a9cc30492255f51c85df8042fdf7f8d68ea02806fba3830ce72665603a809c2bc64c27ff2bbc3dc6f73192f91208d5135ab67d448a17c5696003f53cff23e4c89202bb213267fb510ae3c295b8a64acaf796b2227ba3011b1d5468b238a6c7d35317731500fe37a4031d987eb7795de3ae6a4f0698ee3e0966424428afb44e3552b3d7445d28f7a72d099d1dd72a1846c757dd5aa7a1841b83f513082af37fd4d7fc7016108d4542cfcc58d8e06183db8a87e3857163db39bb945cb9720b6499291dc5f4e3d6285d3091511899c5a58b3e22e9efbedd4c4b5748a8a34fa5056c923c5f449caba9e0997e1146cbff863c2d4f770056b6de399f387e2e886968365882c46f04b3ceb352bb1fc83eb72ed79d37162000979aebdb8d66c2e7fe97ddc4167edee397a1bfa3710308ba94a645d7024db78628864a536ee8c7320d9a4b1e2015f801ff2aead4c8466c073ef56c23d7a52dae10ad3c4f048da5323d7766aeca0f242591701d2ce76f5eec5e2336c8dea5ea41f814aa1676dcc4af373818bb3af6cc19f87b41f4f70645339c398a1041d5560687c57df1ed5e8d71a2e5488f985157a3da533c751f9489a29f3e4f4125bddac766c79b289199663f2784de700da92d8ce001f8f488a09102103a6fa4b4e6dc4a3c22ee038917b8e26e1fc1a7c185b69bb18c5bbc59b2c71a9635d18116d7c658b2de5dc9fe60ec231ebddb7cdb6d599af6fc4f14bb5292b4da385d207318feb97004cfc417fa68c8df67133683e9814f5659bb43d6095a96834afbc8f232ee351d9c2e3afd6f96995b24511fe38293847aac8692d15e88893a7493c3bbacfc9461ac6174d747dd6037fc7d7d20bff8ff09fd9a49d5da8255a7bd0d57f70e929de63e50bace08a4e31ef7809965291889ac52deb00903b1c2712d51cdcee117195159e3540a3c55ebb61e40bbd8465be90bb53a0e96647d9841cc486d67abf3d14d060289b26a5740a778a62ba1a12ae9cd2d96ada3824f9ebea3d87eebf78d8a804c95a2ef1b12aa9a0d9a30e9bfeb4f9ac2dad359e78d9d91b9ea4a814a4f0f923384e7e8d6eef137e60513d82a08e41c7defc9e01aa15e61166717522ea0272cc3b7a0c62353dc250acd1d9569e770f865bbd75fa3f1a6d7c3352e862ae899f6051615b08aa9350d81dc934904f2bbd9832744fe0be7409bc73ed744c7902e97008a8ecf9458c2965418c01b838f8c65dd1b5ae7d8e9f3542a6859b48bfeaeb8bcf9524ac8c84c698a6beb346f28ac447e805f3f956186aaf59dfeff009be100424daa4aaf619a2d2bbc5bbb5024e41f6b3c9c31c7b6c2472fc40c4daecf8e18996cdef7cf8c768b40f259d9acebfa9ead3959e2f8506fd0e0c5ccc51c037fa7c9403678b3afa62bd0f72db60de5b6684d5dde7daf9755f010888690d29d7a56dbaff9f6e034f3b4e3b21f79fa7ae2265392722875f33b4dc8f482d5580748cdd6a37198e08125cf810b774bfc12447fc5bf5e0bd1ccea8f0ff307bd37a7b1b3c203e48739000423b3ea7c539a15a61cadcceb504b8a2b5fee6d5e70f6e77cb0a8b79bea76175759803777ba5cebcea412a05e1c6b95c4656c48d0151d2e736e8fa6deea1c30e818f1dab0a7cafc84c0fd25029aba557d48916da3d534e35c927fbaf5afb5b27d090dbc6f436db0921875421eefbf3320b065c41fd7c47000c780da2760c905dfd3dcc3fcb5cc70bf5382dff94602957347f1358e44543c27b39beebd26de91d61f66d89e266fa2d21a2ce5dcc50ce440b23ca936436daf98fed7dfff287ebd2a95b4e49fbedfb094147c3a0f9464894d9c4e0661fd96311d513d93358f30f3a2dccdcd45a4a300cdea79c7dadc92ea62ab30365599572a7c54d3f3a7827d9b079db97dd90143fc44432c7485c51f714987e91f5a4038027eaea3e79d2aeb1b217f81daa2fc480ac3c89b2a57769285c9d981abba1ac221eb07b5585eae04dcb82b2cceeabe39941021d0cf9918738da94901c1bb4e7cf08b090f2c333750469448c240f76f9e01f4f5d34c94d24bf3b27e7048a705efd5265abb4d64ed56c27c7f4c17133500b937ecaa8a8dcda11eac21d62ac466a13983a2c1a139f79eb63a78d03d843be524a1af5f70cf30fd765fd93c4e5b9a1c856b8a2712f97eb08b94da599992a7d8aafae6fae5a124e763924fa99cb3c8e81fa6b9f787eea915aa534eec1387a25eb3093981d34ad1e84d0f2b25fc16198b71fcd939e75ea154793f7b9393a95301a7974efe21135e879c9c14b856cab58fe1358ff31c928df5621f0a550142e348ee6cd078b744f44db802b26b9218c37cd918852f0dd29680ccbca23b459879bbf05065f87d25bac10a08ae4598486bd8c06e63f4a266e47e1fdfec4b48f33ee3150bb5855bfdd96bf878b04e50a2d72dfeffd04bc3959e77c24e8f8ff09d5a47c6646927391678d3eb195f8fa36e2c02fb93753a58a8edf11fd2340f26ddf470692529e6ffb6c0824cb2640f77f395e01ef2facc49e7f8769d3283d2d3fa34e468149ccb9526d9ff810c66d7b67a384ed1e306067e9ae88da43823e0dd3d432d29fa6bdde3aeead2f4ef0eed464b3dd47c3041f2e009e4bf9caabd412eee49d3169e3e25d1951b840b22045b11aecdfa859f5597557c1592ed51 -MD = 07ddd5dafcf04956cc36c1ff290f07c1c0e5832cc8dd9aea502da677ea04fe64 - -Len = 16352 -Msg = 22e9355dee8f5bd9ee753acca4e28a5eabd4dc284a47d49549b3928e03d77156bdb5f4b236defd4e7fef405c0d5cf87e0d6cd8e6f78545bb66aac2bf2742ac30901b27ec13ae58d813a5d581f59a59047b22bd2c4d0a23dbd9e075ab5db50ed44222b651ac89d43e4f9ddf85842516b99cfd7142745dd7bb495d9198ceb9ff0c7cd2892a2af6d94adde147aee18495651905dd709306c7245f2affcfa2d5e79ee63489beb47ecfc26579f645353f40d09942e9fed38e5dddc34ea89800922e53274f9c5773a71e6f8e6bd391a7df7ec1c5bd7e335b7c00b01cd1733a10773cf3e82cab3b8ffc2e1901c1c5dc60ebb602457d82585458176313bc47fffc0c7946d0d19fb32f0268876683b66c88eb5259c08adfb5e5ab0cbf4f160e2de9d94e1388485e077b43328364b78d8b4667b98fdeed7b9237fb468c79e7af0d01672124b799d27f9c46f5d3a367327fc2e8536c48ad403771d32d92383812e76c3d5b3f06cae163ba931a40cc9a8c9025f588b7a6d214ebbcb8299835101f0352e3652d1de575fafcb30792875985089717c03a9f65e1f84034a2681777bea8dae2a5b6a3f1758d8b2d26917bab042d3fd563bbdc6c8ea424ce00c88775d7202cc185a141f7c9648f89de055198f24946b7d90305f20338910fab812d1352b171086cb89efe59c72f5096b5b02835a2d3458adac1fc28fbae7d0c5bb05817a4d140c2c1630e0dfe9309b86a4164b6800f08df07b894e537a4a2891db94d0e4173f0ee85372fcd50e43cabecac535d2d22873e5493c122329a068b91eff820cf80a05accc36a81074a71d70398fd13f0334a1087fa8cc736b92f7b7dfb6333981fd86d5eaec61169ec31a477ad6bbe106adabe6994fbbc8928a7bfaa849630e279218f02a14c65bff3037a0f94a447d6f0beaec20a19e97310f6c1e0339700f6b6022882440365508670c194f5b0978aed7e4a5a03eb363e99a2e7e6b070891cfd04a0a43ef3fa66ceffe1cf7798957488a3f9f8287b8c30ea359b86a229b59b76ad603138240a47f3384285c36328dbeab4226621d0d1932c374486b1c86bbd4a88cef0d99f7e3c1ca34c8181193a093b392f6a95f2efad862e49af865793c8a11a53abca6b3f8d71c9688a58c3b244a2bb87cd2deaccc721a414c9c9dd1405a2ed5828b29034821b31fc67f06877d547c1925690bf522825200c9c2263d8bc768843303a174463426372e1f210730453d3b8cf6679671ab92b99ef37f0c63544737d8b0a0759770de830c006c38d18ee7961fe5921f5e3054c238cb38cc6b735376f01c9685a07a547a0ccd38aad5b3f3cf5ad0fbde3cc320b12393c3fc08b715b805a1f422e5b320828cc026cbb136fa3dca23058191d68f0cfbf7a129cfa1f67175db69ebfbbdbb4328a3a72a089a5377ea665f77f1ece84c0e6170c424a68e39ed43383f46fc8d225cc24a342050a7e448056a4fd178d4e4e75b8369bc373587c8541fab5be22ea695b68078acec60294faaa667b4fccd6e13607968daf694e1938860aeaf2118466ffada6602e004bd7da0946e10fb4a5e2efac370154714bddb7aabb7b51bc29847f9b89ad6be1df76e91d4a179f6d42b7694f1ee0fcb4d930c9561551244c602ba5dbb757ce9048d7ef8b7c05471e35ca6c975510ed597f7a35322152b2e8b2c3371538489f350e64b4fee4944ff00782c02ce37b6f89c623c4e5e66745b9a6b4fef0156626fab784ff1c89aafe0a3f462cb7d007cc6c34933e186c7923e7c466c215559bab05cd9e998d73309d94658079e0249e4a2953326b72bc6e959994414b2c00ce757ed81c4bfaaa0f74b802976f4ee82733e9ab69129cdd30e3f79fae60dc1fe7cd8e5e65db0b372dcb9c9df3d6aa248acdd3c29efd3dd7a5552a6c13cbcdb8cdfb5de9e111672174ea68befc769bdeaf6110223af2feb3b7335a83d952a8d66a471200f8b7b770cb1845ed1a17ca207e36c753a6ba87784dc4ae6d69be157ea5f8d52c1293a22c199f5bb3b580def1df9621db491d7f2e4e514fb129d6bbba6658d0f3976fd15e48c5d197357a805abac746448ae28edea42265d78364439195ad28e0ef11eb0e3fd3cf2202cd5861f7125d16d3d35d8f367f1768de2e540c1b40087882419942e6107fda84410d117ebf8ed78bb69449ecb08deba2fe9731de599645b9c9830425c60749239d486f371603111954db14aefcf0e8369ab40ac740facefa70505be43b8ff748abb0850a5fe14be775d8f964ad68e704ca529fbe3c5d9baefda9500bb9406b5931ee5ae0e1530e5ce036fff6091c71735819f6ac96e7353e3935e98286412dc0f8a9f69fe57fe1e05f9b2f4c59350deb0ab3197797bf2310ec9d3031eabbc5e3c88a6231b38d4cdbb8b08f4fe4da44d4aac51009840eed8edd882d012fd6bc2c6939a57c93a6d7b5b41c2ae5f4349d97fefae148a8fb1c1fd69fe7d89bb99802a25dc76acdf20bd71b8705f7cf6ba09acff7961e4aaf372a9d8a66a0788de4cc3c9ed1e2a8986fa7b59b2a6ebea6d546e4673772b151c619fcf0b23f0c7925f400a6cacb6dc08c8e4afda030090dc50307f0ca2b260a5153b879d49fa0a6e5e1b31aba0f6594e8f5a1586f27f8c9f73afe3a5933f10261409cced3a67b3cabfb20a5a995d5390d428352a039d302f35192eeeb715a607d486f97b73ee76200aa0eeda04508da83dfb8933950e1df42b28bb489cda94d2ed3f87b884e2a406b56449aa607459dd03208c445536b896bc3b1333a2f25f0fb4900234fbd8dff74678b55c4c3d3aa7ea53b8dc92ab928f6eecc14067f17726c124f37147558c7a345abc60161fb2a159e1895cfbd13e36c9aa3fef5a5c7fa0996ad5edd5dd3bf81586c9465c905 -MD = 2ace8ba5195f54a7c501234431e99232dbb1d1365edbb593a3dd3b5810326570 - -Len = 17144 -Msg = 9ed1f4045de7f9652af2c672e265d35757e111caae0373890681ad045b753c56a9f8a67a54f303bcc732bc6d5bba93db7b5de381078b297af56bc43c3e2af982f8943a8abfe1a8815ad1d63c9cfbd02887615c84b8497fcdff48437a4da0b8ead3cc399b6858f09c2bf69d456acf9225c317023c89e47c6a6a40b3284e7c807681c82a141501e4f582ca97f190dee2ba77a560114405293a7e7a9bad0a695a0e4cb1955f8f848b75a7754ea8d4d1c7cfea33fb6caf538c23851f8371490d4c9a7aaf02e39e88ee02e11e4ad300504a4c65ea5db39477b00ec556f3dcd210610254e9fa0809b513857aed11d8da02721930f10d50b9189ae4874874566f1b9e2e228804369ab404e7b80b2d212b90471f937193a9e6df548b131c8d47e6d60d072cb3a9d5172dc90ee4a02614baa1d144d6927828e573e5edb1fbc71700e8b573b993704d49c768e445d3821b51de1971407b43337d7e55f1a90da92e85fa9e5b1350e107f82beb5025cdcb9db6ef268f1a557c3475a5ac7e4279bbf43db3d1a880118469ec015939cab68802b27b0084ac47ab929692f37ec66885d2f0bc554049fee2dcecf0bb897db542b10d2ab03a3e7a59b5a8ed32d87b01902e65bc320db64082c9c2a0182786f280148fa63d9718160d05735d6f74aa6d6371655c71f60effec9634ba78fb2d96ca920094af85824250eabe8bb43a9ad38604b84419e29b62a9ad0be6e4edbac9a893279f0febc326a9cc531f0812955c824d261b32bba39240740ecb62e574b2a37fcd6d64b024eba013f8c074e4e130deb67789c5686fb739550712fdcba57a42bfbaa6b6beedb9bd277616fe98c77622a67238d8d147f81db6bc62ba8793480eb9b6f30dfc66b7897094cab1168f57d785e0cd76de727d7301f764a30186458ed689fc7252d60e8b571c84924681fa84ba89f3a4773a6fc39d7ec0bf22c8994a7efa68eca887e54b42d4ebab10e588b1af35506c84e5f696f2191d16d0a06bca1ad3df84e6bf65529a86a8035d0228e6cbac8cd5edbc3972689223b1f455e39710da0b41f5c7b627c8f863a2132103ac76b550e79a0761e267b07b9777302b38cad8912bbbe7ff5332f3c3911c8a408a181a44ab730e956b573acdd03f796835ae941c4a2166695c423e70d75e85080919a10f286118fe97a0f9c0653678c51726d852a70f8e1bcc5fa3137cc35a83afe21359674a6fc3edaab5fd5d43746864996adb496ea53d2af0e854893250d807d937cc6e18590ef5de352cc04db779a76f13603824f4f9ff5fd6da0592b0309667d70e47b11f0438a243f4973e8721650f9b897d1bc375d213354ef8cdc2b2e6f4b9c7faff09cf3d5fa5fde9fd2d8728e3cafd1f395ad92b74cd576acace877ee9a6a08de85e978c7e24f0be72f1d5775268652668004e92ea659e64711cd6e6ac66400a566883ae6588751e851a30dbc43c689b8ffefc90ddc7caedaaf4c8a7a7c15178306dbc2a7e9933121ef2c2dba10faf85969c0aacb5b9840e5d9d8548417f78e05eb66a88301fd3a125bfb3ff52a9e1ec6422a06fda0474ce72603451e1675f49c78bb351e2e1fcd482ca2bcf3dd2a7d8e3d8e860b5704135d185fd4af143aebb5533c20cfea857b21d5b51d4cb52a952fa060707acc4944b635409bcd8d90d3feff8bd41eb3c8c43deb94d9564f08e6191f328ec28ca14190e14802ffef122db7d20cd791165428fae2e489a7175ff0e91e8719892486aa6bb0f8a29cb559899e8f4193ad8eb219f73006a6c58aaa360e02d0a9250073dfa538b4d34a7cc158116bcca0fa895d37a1778da928354235f670a1c62cccf361ebcd1f4d7fa1d419af0c0077de92cfd2880dec194583e26130ec7cf916c67fd19e029a59b2c11c6ec5e47f90e03794ab2987a46fb412f5585beab4aa69a9939f3a5da8806a570497f499bc7495e415f1f4593924ea5ee58bc5dffb629bd2b92b5f52ec7a2cd02755c97029ab6624fe7777173cc15ec44d6c0d40b3aa23ce6b266b76b87f70d8eef8a32c59ade786a88c203601dd97df9779a0c17ff9a81923e0ed3daf38bcbde6211002cee480659ea09e3a3ad20c2d5e451ec6b2d99f3f7e1b530c330e970b874faeb7ebf7c76e5b654f984a37522a0c5ed5b4feb25fadc4164b86e699665e5cd4cda0534032ed694a92d4a275d0521c177430a61c8fe0b06235222c41b112d160fb407766498f42b12673f6362d32181f68be5b809674ad9f8e6296901db57f74b63cdac271a0624968fa97c0bf568ad721b2818709e6262ed5dc981d02d2d1709ce9fffd51ed6263d8dd19de0d1beecf3db1ba886091b48099d4b340e6e751f51ddc497f50b2ada1049ffec6ad0ebe682b30591d2113c33548ff7a94505f8b62978869b0f49cbe816ab7b91305ab644268b30fadd1e8fcdd71b1409fc5c7e859b872b34ac4081f7589c8cb5bbd8e8aee84be20c2d99dabb992aec7bbcdacf34aef2fc89535813afdc027b8091b049cbcedb64ef4ce8e6a8a2a2c5280ce7b26a6aa141c38cf94bbaacc791193c4ca144e323fecac2757b3afb6de83874ebf0cfd87d4209df8befbdd0d113a94412b8c02c0bf7c515a76019ab719dd27c4e510cff6c4684d576c8634e0a4c572f6c56e8b37c990acfe55feeba982b1ead799dc9e857975bf5229e513058834c87c142647f5c2abe77993e6131c8dc458ed29cad99277bb7c7f739327ea5ffafd37945db9895f30c962ac61917ebf66fa8c216611cc23bc0d45e60ac3ed809a99cfc27f6070d3c1ab300bfbf74e8c2c381b2d28d79121f9da3bddd677ad9e96269b1b05cd3ae4d105683f1fa51a7886aa30899d8b6fe6e77bd7d760c3990e701c202a7b5045e6d17081b2473b510908c962e33eadd6d7275a807f44384e54baf2f56d6aba307e5574f301fd2a80b214fe08a686cf54971c0eec21eb362c05c93391603e4b690fef7b62aabbe328084de0b8600060779b47f1615be05db0963d667a8f70848e1fd1fc27190df5c57025f9f88c25f1a -MD = 4c7118050c64cb293f54c5cc199e99aa87c0a7aaeb7256af498e82d535b994c7 - -Len = 17936 -Msg = fb9de43c9c7860e1a3bacf321b5922ea1d15e6f43950c7dd181f538a60a10126d890725fcd15f6d2b4e152c31079c11296d1386a8f1deebc7fe41cec045601ca00df2a43fafcf0d9c24e425054eda5aafffe7856c7887da50783957d5b32cb51bcb39450edd555dd17292640b05cd69ba0c32f1fa7387b7ff92547a52cde66a5543439ef6d472ec8f99b87fbe96e5dcbc149e42df8d6f0349df1b8cd4101daac1089a08641fa8281b1ccece9cacc4124aab81fe88109e5ab3b10725b6044305038db527f329759f086e3dd721a1e8a8da33769b80c7a60cc1ba9fdb9524f6f771351d54008c6bcfdc208e2fea00b40edf3ee48055fd06c7f85e5df4ddec99f0bea14b3338b2eb190ab6584f5253c6c2ee306463744b40eacc0eca281ce5bc9f3054b73be827843918b1f4abf71591637bba7ebb680ce503b15e5cdbce9acf417ac1f9e4bb74b77e8a861bdc44c0944f0c3f8beeadec53914ccf8e965f665285f27b8bb41f050577d4b51636c7ef400414222473c2542d1202d4f7de6be2d6db3bd3d5208f62fea38bb17c720cec35112824c0e121cec21457f0f11a609adccfbb8d6ec08918f380242dc6e46061e404bc99f9cd58d6c306c0c632e0d9e8c4c1f5ead10a888184ac126c8e248ecacd3d4604378ee3e69077e1a715b834773f607f8e74653a573275fb002aa8c491614958f5f2ac3f78cac61f2612070ca0ad09ccdaf166eae48d7c228b34e7ce4030b779d1c3bbe827d29ffdc5c053cf0f8e5c4272b09626c3e63d4d602567e871cbf60d4a13246a6e3863e1f8a934f81e63a684c83a697a7fed27b01184bfcf80938397a1797c22a66c90805125112457bd97185e0757527302ca1f31cb55d00717eebd8a5f39cd7affc44d41cc7eb0460c9c51a6aff65b37b7a2df2371a0967fd9a5d3674cc3b756626dad5d27e43853c124e5348cbcd1587c30747910468f5549376dcabad07cc3350b1505afd8391b8bdf278a3621613fd0f173a51fae2721e712011731b68a3bc81b38ddccc11f07cd09bd0a24aa97685664512a085dfa5053c421ef4a0c6c3acc1c7d38174576a2f5630a46e0dec05c6d17919a52cc757affdc34b55c389f5a918d56c707cbbc67954993c2e32498a69579b9589770250c4bc8de0bf0d19ff5b8fc69ed26ca7ce04d4bee00b4227cb150193cf73eef858ed7f87255904dfa96c2d80b2cfcd824875dd87d82dc4ee9273d6490f8c1a1137d25099624c3241bd81fbecf08e26b4fd7778dc6bbb4005a52bdea59dfb82b6b41a36abdebf1fa80145fff29f38ffa5b5b0aca5e3dd3fd6cce42190c0e9ae4d996d3aa5e2db517d3f5d437b08f4e0bd38c881ca86bd48c8d146a8f0c17e2740ac75626fb6c752263d74cf6d74eb52644d68ff339d80e3437bfb7aafe8e174f5b6d7b8f2a2acaa0dc430a9b22945dc02be382fc86f5198af91a89fb37d3b1dd67e3e4414eeb2df989b39db30702907ff51df18724656f075dcf820e6c8b3ab49ce500dbee1007b318c386dd190bf5ac3cf06c21768b772fb2490042e1172a5b86cb51bd9c4bf063f5dd5657bd3305db6ff5436a01e9da7aa301b53759fa0938a2116764bdf16062ad7b7cd187fa49840ab727bf6b03015eaca3f15a2bb64fd27b51b27fe7a2e0559c287ac8fdd4294ca990799ff66974624b8a4539dade66cf7f06b35d8dd2f8a36e6ec0bc83533d8ba92bc99a588fbc2bec3f3154ebd4f68629aafa8c350401e280a8ff1abcf9fec7a5e3982cf5d830f22b3d4619d33c777d07a8e88a61a894897f8176620f2ad5970c5255c652e58b7b650ee4172567523a959b1de68843390eb762d730fe785a6068f28304e43a142e462eabcb56f82f355ffbfb1f3d6667e8d4d791e60f7505ba383eb0574e4873613b06fda4ec6156f3c34610a2e58499be345a271fb673601ae6b16e3be59321daa0326a425a35720c6c03ff00151056e56255174c8825e1f910d51d214e9c97e1323b721224e708d5c6a006b540bc17f4fb72d2eb08ff13db33142db5ede74e2b5d8c95a2e0e873f64fb4d830fcca65734c1dfa799d516e37ca19405847e5dd0f8ea04552f2dc4bc483ccd411bdddc7d6e0c0ee76d9df69a5424ed596f12a9d04420121c0ff1508e6ef229ac5e868a79666063f7122fb8e9a381f6dd05e1836a014398b7b4a3533c40e808cdc10ed9d4838486de72d38659d181569b2f351127971b412c088af44f24e513aa2cbff0152c421ea473d1857146ecb59bd6547b8e6f70b285f1f05c4e84b0f24d88dff8c4cb60d352ff70dfb96b8abde4e087ea28ef0a96ca591bb3c1c7124cbebbb7186ac7a74feefdfabcb9a622147d3716867b80b193012754203155d3c903af8f798e88df378354b543fa607e6271c14976118b2c513443e3cb2596bb12264aaf42b876d03616eeea9d03026450c56868e3727644796a9410dd25f291cf2f765e9c70f941f2b1b2e0f15cf29d858312baf424aac1b3ac04237eb9d11fa7241ae5af3f79fc135b88e1688e9af1aab3a988d2b1906ba6017a63d56a9b2b430f1e8ca2ac5ec7421d58332a206127675b141aa4a18f09fb71df1a0bbfb87e4bf7699b9d40106b27fe0a1f5e9aae0963853bb8937a0e655a04198e474190e066e5e55aca81f7b0690687ed2d85eb5d473806aac7c6774569c31107b2768b193ce079114ff97b5db03db5e5be677fecba7d5d37670c3172d3b5afcf74e812f076f00d075430053ca6ac7d4f3acbd27e655b28a99bd5a4b43ee2dc2db41f8b2ebc1d8a8502adfb13f15ac772c8364cdbf0da4f468da838d253537e689aa2609bb570d6d380f8c7ab394f7c97913255ca0202ba57620d5596b90f7ec950f9f7ff0af0da39f799cfcc27948206bc46551443dc5223458c63c6181ec598fbacba2263a67eff8f187d3d6230c30772fbb4815d6ffdf45caeca2b1a893a1dc6430fcc6698ab6c6ffe38c8932b26e2dbd7dad9f5c3a410cffaf28d6557c49fd74760c4bed047c9c0d36733628e92de1e642fe4b6e130c0c7f944b4a1904d68564014d311563b5ea91d74477660f144642a1c6a45d0874c6c312667773dbcbe6cb493c1083070735366c6cc78a92a5cd4b007324d9893fce52c01708e65f9ea412d45564a68cd50e635c58a0f71256e977e590574423a185b -MD = 906c5b84ec1e480195860d89f859fc7d3c5f67f585ef8b738ffec08a3c07a98b - -Len = 18728 -Msg = 58067ff7959a1966d37fce5cf06a8dde6e1f1c676e91b02ddc4bbba5e70e0549b4bcfe9953745360f2ffbf38506b245075f5da6da12d462f8254af96a9094ec43f25a405f4e3110c3944a180afb129b7dfe293c12b0076a80406eaf65e6d9a7861081a42622d7bf311151d3af485c59914aeef69f653661fcc2911cded8310ec832e0858839aba9ce33bdb70072f1f807c21986fe86d3e1c4185cf243e93d9a80b6014504174f68f157f8229d0f761f37f0333daeb982727cbe1c90239e51c346364e9318301565511a7ba6e3625b07b851b6bb3e61a49c9d207aa6fc6c00219f1022d03308b03753d7b2d462400379ff632e501c03ccb89bebd1873cd6eb3de1f0489ce3258257703c581b97fd11be73a104ccc6346d5f0f8ccbb173635560b5430a49b70b0e3e4ca4b5ecf30e087dbb97d461db6809185e6fc3d62e95e1328f7502771d2dd6543f9d66d911f75a104db417bfba13125d0f114435dce3013be722ab9594026d41cfa2e550634d891e90923956e0ca3b95981de780ecef57e542c87035aa2d258f8341bbf3658508012a9ed397edf1c76a9ff20817fcff37c738d2eac7ce02a185d0f65532a712796082565113402e58347d1a309b8ba7433a2fde95dc7e3763dd6f3d3b8e968a3fa52e354c5975e4609bb612fb6bf78bece69e47ebe4491feeee8482f977b260dd5784d81fdafd986308e168c309ef0197350aab676fad309541d763f97e992ad4e03c9b660855cef1f475781205d09cf4be0b7592ef292e096fce5cc613a93ca8e7ac1b99620d0c7ff6e8ed72e02ad277da0742f8d32b4ccde0dfe9d9c7613adbc659c5348891b57f78b22560197c368311947ff3cc4221351d9277cf1a6f99f014dc24c1ec627e730277bc6422332db91d19993e2afc5fd19e7c92f08d12de685b89b6cbfe1dabfd2c901ef98afe4c8c252d3b128fc84d45ebf4d7f88ff96ca6f318f7bd4e11e2604fa1c99ac42c077ef245b22b6b246de47ea19341a381e95e73d064004cfda66ee41348b26e4ae2f3ecd9bae33d9f565fdef97166585ac8d17666884f8b2f6c5b926b18ead9d9639d7d7f91c487a78afa8562eec12ed29fc25331d0f5792598c8d31fb6ae97660dde3cadf369c9cb7046ea84580c8797b28392c8da9ca78ed0291eb7ae78376f5638a2cb4c2d8479aae7a6c469830308b5a7cda201af96a9971eedb96cc23a63b13f387e089a38309f4f22a98fdf11a41d915c43f298b73451fcb8ab8e3700c1b354762cb53a659ec1dff6ba377b43f85ef2d7350a02998d955517e46f213b27d10ad46dde888d02b72c8b5cfce21a840e2ec6dbd457ae33e5ba841aac2b3a04aed4eba7e0ff2f1ae3b769384c9df5c58fb793cece1275b5a79f75b4a1bf9dd6814524616928cc35dc0308a2a319763b782fd67473bd70816f7665290c58d71c1cde0720d37fd4e21481f2429cef0c643bf9f77341d33f35b1c1fb0e38716643c6020c7cbc7ee9ae01c6ae8e968938ce6f988f31d4de2230f3247fcaa2a3dbec0143bccb80906b084853b5ed3c727bd877adf6369948da01b7f09bf4f77a9883733590a3cc7ee97f3c9b70f4db255620e88cd5080badc73684c8b80393302ca8803a107c0c74d5717300882c0f3c581626c7a41ca8776a3dde0f5c7d029f28a9bcd3c4daad2ccf9d604563f95501e256d6e0dbeafc304386185701d7c201fd258d8526464b013831a8bc8cf3292095316d5af4f97352d3bde812408a5df31a9a76e0ad25429c900ca0f87b901812d1545eb877deaa69ab33b1d3812b32fd11870d58c21e4059675ced6ba8568e43372e2f6becf10def3a860a1d4c30ed8a7259b5601d87b0b24ec0e288abcd184c273d63f7bce71a5df23355522a21ea25adb103991808004186c714f1fe5a32a831e070ee70075c3062aa18047374c55933fb7c663a05db91dfee192a088469c1d7d5eab2aef85ff11c88f6c6e0afeb8f95b7845a0c079efd9a94638362e22a33998c35d6b230722a802e45fbda49d9435363cfd6f693c71f475868a085e9f067f751f6dd22365f472e289a25c8c92b1eed8e937f9210e06176a8ad03fa0258f961e58238877053d186f667d744a44d7cd4a693b65735775ea913a52027c1c04279b58c7b5a751c541b163372d671ace7993a251dce47f8714f17e577a7bec2ed9f205a1803baf5496b1691aae6a7e5d9bbb7ec186feee043e923f29ce24fdd5552d49f912bc89b1bf765e6c20dbd74edbcbe4d28a480db40f7d630e27ffb7c143540b1693b246a563082c76aa438c67e0cabbcd114a425e30b9d44fad9583b9496d33412aa34ef82a70b9807528077153c0edfa428df6cc484e7833876dc7861282a8c2ff190972beb5efd2a915af33dbb561a1469892c400453904de10ecf0449a54e13b9bdfdac4dfb4b36d8fec7721b2ff0a44f37c0f00a5fe08d9045bbf88be1ee606b238fae7f7f26de9202603cdbeaf7d65271e75ef76ae89a1d37bbb85f5ee1887e47c98cd049046464fc5a086e25941d1bbdfbd75c133cd5d04b3ace447acc0e7bc137d1e0e7687aca43116f425e59faf3726b13b8d741d36206d594cbc40264dbf6571831e8c7742a8d32dc08f3bdf27245d17e9e259c054ae108b665d9392e277da3ca33aba6031e211ad922844496309ebb827c8ca00de36040ada318b4cce6bdba5286de888a0db545d11f9e624886e385c9b48af23fd41b09e4f40119b3823ce75b7bcfe38b8190506e6090abac1dbaccaf069f072d8567e0f6d930ec948281d74fb31e4b8a1268a70b960995134d9afcccc34763598fdd524dd31681c28012e6a99d38250828a4d633107793209efa928d8af27b464be1da6472209ddfd366b1f3caac04883cbb4a7f60594a569a602a7bbe4ec366522bf5e526fd753f2503b5b8abf87e7ce732903b162d0f17c8522111ddbae05c2b02111a71fbcc82cd605e52b19bd77880a13410a2717606914712ea89b5367a4f1ac8aee3a9f82d6503386c8c04c3edc16da27a85b503859db58c6022cc4a5336bc890cec967ca16462c0609bd1a85f021e57e340663c273633da0d396ea0696a8deeaefd3fee81441582d95171193ecb29e0d55303746e0338985c4e1acd4f6305461fa604b24fac91fc215d618b2f9526c9eb4e2b60cc7d3a53d7c16f1557a8994bd977936c6ed64e98f300316283f87b7f7f824c75b51ccf790a43da3d34b3d04c66d24a715179c1e5a8fa5f53ee5dce8e1cafc527da5a5e946e45ca99490d40e43256b865aa0f826ecd9c49c3c13d66524d27440b8ede6e226e37deb -MD = 09247dc00c0060232407a4e69050b5112c9f72a65d7b0ff077f6be180c482cdb - -Len = 19520 -Msg = 0233e1cb2016c8a4268a16fe8d3a980128ba62024d1b13b135bd5a94a565b9b4ce8f899673063f6c49b1ed8da3b00c234ea87823ba5abc835b7b90a74fbfa01c41388f888dde3ce1a56f44deb379c8ab80b470e19496afb59f2249701701131f23d3fa8bb8c7476b016922d905bc54038489512321f675b1c75a8ed645509b253b0bd3863ae9e972274a8f66e0a2399122cd23d0aba395dd9bcd66c420d7bf96528521605c6ba95eddb8936d8e53febf2429eed278c597a3e521d91ff1bb07da30ecec0366751098ec5b37d655f62bf45044bb10d083046a6bfeefd00027fb599de63d56a031a5861cdd82897eb3489770c79172fd056399f60db1bf9541247b611b1b4151c5f09134e37d6e50b3de124a5979e046743c9a4ef526d4f83109a943358eacc3597921fe182e6e151e74cca7a37a42f2f818d43b5f56f8702032490dd99e7f3c16c99f40219f6f131c932d4e4c9c804ab87daf85f34a11473628c585b154a205236771c3a9d85a94d3c29d09fde78396ddf693f3580908c39a72837465b7fe66a9db014f56df18de6e89849e5e64311e8e08e84f379bc62d7598eda19dcf79a6d0aeb6acd0be903913704ad6161a7329f43d165f370932cdee2369d600a5fc0fbf67f7a1c07da9efeb005779ce123200361c85ec015a33ea2e9a61d9364070e79f8e2ef7ce224d471dc0144f2d5254ec7e2d9ebd3c96b3cd5c853c73e8a9bb7797abc276a1b76388d139e71fdce4c233f1f9c79c91c699bfa16d626cbee6c707d0471be6e243d2fb31f139b382cf651db907694fa8f1cd0625d83b8c5f017adf72e9a10f38cf84e8627273d1c81c24f4fedfed9f281f36ea0f512f9b7401be46a41abcb94c6260978f44fb4256d2e6fee70ab954ba58beb5875da660a4ef7a868e61d4abc6044e4fdeed3bced3f995859d0f373605a54cadb78608a498d296e5594651ae4dbd365977f7993ce89a18cf4876ce0cb20dc91cc553bd2ff7b2f9ac2d519b8a899600fd83ea7f563cbc57240ec8e5a068991b48d94c2dc96a988d22310b1a07239695832a4c54e278673ace1a8ce6b8d0502b7a1cfac03a998a39918efb36ecc3c6db3393a780a943a3a914924a381d913ae1f9b5e4df492b93e53f6baa5803102cbb55e7826b7346798c3d9f8b4397545f250fcd93f0c0c9b87975f19ee612b3d21d304d667d0828f0cb9268d56feec1c8e0028c8d5d651a03de7b48614ae253c0ea0deeda1e2f92114e5b16b324e97f7cf81b195c8c01c77bfa99977bea3b99fd0834f266b6b22ce3fde0d0aaca51378357a29d87e75b7728b617067230e52d9161ed8092ad579d6ec168bf44c9ee90e6e3df3f97d43dd313fb3cbfd083a7b684dc80c0e76be78eba803c0a08898833ac86192813bd6d8243af52e71c4a4addde6034dbec5829a6d024a5db7e73e7c7dd279a7f8309b42dc0bb9fa9dfef9749a8d753f92adce78eb793e9572fedd2f582aea86d7020da7c93086c2ba0d953a2ea2823412760e7ed77b750a8a2601365a1028c1a616aa716c37d0095e7704992aa3beddc6d4af26c197624f65f3570be450d8eadde4fe3a45801a5103d1c40bff2f8f8f28404d0b3a3baab68efd2b2a973b6f54f6f3755cd5b7ea1c42845ffd1c9478eaaf2f44969206a2f27d9a1a1cd35e50b279d8ac63ad3db3dd832534f713810f52c41842536956ef65aa50804d39282165eefb0fe93c800c174e3aef847453b76a1f81b2bc40cae482adc71a46293765f1bee11c57f43d575c2c2bec2fafbb05931a02024b88c116fbf05434a233ea72e872015e3a64a41a0e757ec75335f57e603c0fdd9bd1e81b240a8e6bcbd9dfecbca0f251fb1e82f8c0e2a9ed8997b186540e0190f79c9e658d64ec2c3d9b8637d0b43a7424822847f5dc43db4d556dc1d0f89dc91949526aaa87e3f261f95bf8d72430514120229c2fcac32d18ef889579941ae26b78a2af0dfc0c5af363ef8432897a55db88f069d146ae4f76d6a095b0593f7958ab1da72a29cbc24c7bbf8e755c7f1e5e1d10357cd87baee19b342717c041fa7b4111e771a9b8c4e7912a5c1205b4f7436d1093a4e8a1e7d3bdb1ee1261e8e24deb2df496e449df5f54de919b2dc29d15f96fe8cc0fb776e7beb84f22a68add4af9d032ec71f57e1e374ab3633d2e6c50328cc964a632c8780ea5bedb16ae27ed0d9746f4db523d9e98dd361cac3ee18ca9059a01548a791f3e08d1ae2ad96ece86e1853278d67a6b2a248e29f39a9925ed58ff249354f537bd501c1e6b832e4a065d9247e308c10e4baf401dbbb7ffa64ff54d30daf8c97c1d29f2ae4131c2fa0c59e287924fbdf28debe06a6d2d81a8717928d8940c6236dde4f9d0547be958f964ea941f31bdb25158e3827041cb86d243066e66f65c02602f96171db7fdd15e1d3edfd2453cc84674ce087dcb39dbe2e16a74cc4d136944585bf4f57c6d1dbad143dd6400d79ecdce046eddf0591233e2c97e2c8734d60afdbffc744fd378902f9e0f4ceb0ab067d33b282977a5c435a5a80d102b1cd3248e46903298bd8c7e86a207e56a42a7a512b6c6e8b7bc5c88d88a840fbf47db1198644288ed87c3b684f439d6150beef60b1bbd8436e9557dc9e585839a5268629aada61fb4cea9089909278761e2f0db3aee9e848bd949b5184d841462a9059803971d4f94fec6c541655381d75447d51083cc821ce8a39f3227022aaed83d1271952a90f494878cfc7d404debdc6e742a9fd9d560b3fdcca606823eb54c7962534c509c6a2c75b048c5605425f7ef28f77739270db7b2adf27076e93c923518270111ca5c231bdfb4e2562d0c131473f5ce8ccf6a505cb395d97282ab361aa47b7800934114e48bbf38744114caa8e5a3fa27670d3a668e0ec5e7c367a47487bf058f9fbf8e6a24c64c5d38b68b06ee907eab666cc26a9ddbaa59041859ed42603e21383ddc073b68a2636c87e0a8ff39e08b461f84d3537b1b38cd23e2df550d766805329a564014cf49650f4819a80eb449ae9bfe2b5f6b8d299720cbe5402562c67f3455d1c3691751aa934dd3799d6e68d8489afd023b648dfa757179844677bf1ec97b0445d43f3eb5da4e60d444735b7bcbe7a2fc5955e85fc88016a1cf29d45c58966847c49b430f4ae63c58b267a4018c60c79e43c5cb3f605447294e0d88d068246839d8b0112f4b91e06765bfe5020092d5788938a931f37a857b31775ee38ea19eac7f121b9e72cdd790ccf060d5df0a471ba822f4afe86f5c28180bb92e228a76003635e4c547169c65568dda256e13b6e81f195031b5bf25a0703f4a18ca6b88e58c9fef4c4ef8a94590fca359345b8f7e6c802e4ff1c68c84c896642becb141cce0b4ad8be0e078b21ad14ef9d85e4b3f0efbf15313320b358f85b9e01ff82b16d118a21ca36aa54b42804f7fb07874ba74e14bf3906 -MD = 7b2e8b28951a825924aed1b26e9c197ec080558a97120f34d6e22e341a90c978 - -Len = 20312 -Msg = 03d14676ac6afd0eecd67c8ebbb62ebe952dfcf935952984a1717a1e66a39bd825e0be274e6085382cda228322afbda334661565c8586b1faeac9c435f868d33827ccb57b54a736e89c65021ce1644de1220e9e3644277995e43e924628a5b38238eb72e678e90570c824e9049518c163744be9c90bb179bb61faaeaf717cf8e0fffc8d3ee96a49cbcf664f71bca5df4acbbddb8d42b11cdc02626bca695afde4eb5476fd2c877e4a20bda7ecae77e20786b8e5eb8fa2ed68341a7c3f86cc4cfe99a7c29998ed0d8c4a7f74fe012b941a33e19b6c590365f075973267405d60ae795ae2acd4f791f2cb3048fe5b2d4ff361bc5e98256f10f5554d30ea3c6ad36508d2699f5723862e21849695f2e980438e9db1f78b2278f741c0fa30b1810fc2d6c2d9f9a61d649ecbc0e03d8f0cdf5b192a37f2d0d9f866c976f0c3664c8048519096443831b7b54899b85d75f3b7da9fd65322bd0229d46af3b72ac109ef5607c020f7840cea122663718e5e3a94229126960fa61787c094bbafcf3865778c67d62c9c200b9625c3a2ce489e4e1ec38b9f62f202a69cabd5235d3952cbe34c0046fb9a72ba2670cefc0104bcaa924dfda56ca2791bd2f6aaef41e1a6c9ad255f97308b1295258396c3cc4b3feca92255dcf5797003b5519463f0608adb2f98e44b4dd686391dcec99e82a4ae60cdd122aaafff6deace1d2025eb3e956cf5271cd7b61533f269b2c5e0b6797eb36adae2a2fe9ce93d87e9bca984c44d1b984097d0fbbfa26db3e01a3eea6227512ac0243a53ea68787d27e8637faa28538385b3aba14e581766d7350da0d74ed6680155e562507228185821e81e48ada141671edc2949db6c0cf8b4d15c414b9fbd1ef6488c778cc8d40af7abf33843814c5527f7062a92f810d5082e7f48a439948993b844b81ed75ab0e83380e180702ee06d60ca7915281cecbd89ac55ff2078c1acd92daaaedff6da61f369ecfafa43896dcde8ade8987bb0235755e1a2d0f467a00f99c7c34f42e8037ff0a3098c24c09772d34173b5d7cff83bfe8435e771ec2be03b87e2a1b98a2b4dc7bc42b26d1679143cdc4cfc9b8caa8c18a63ec08bbf9eef65739373e51167c151911ce9770b811667c6daf9417698ec36d013f8ac627781ba033c42301e479f20ba1eadcd105dfdf699b428643e61b0cb8a5bfc5e65443babcf63793511291bb7afce8be9b55e3f6bdd5f066e14839e694d7d481c489391bd20afa56e8aaaeb78da82e0577b105f2a0a421fe9c98cf972920e68508ce41850bf5733470b3b72f6d2f26790c202d1d398f3d1419ddc4689e075d9a592943428f410cf58e36946b411937e103aa43bdb11eac71031f02a11c15a1885fa4289885752c60ec3a2db332ecc80703572f1b2fd9d7dd0067708acad01a17c346d6d0151a3a3f32c76a4f683243b1b530d97fdc49241fb8bcf66bd1c2300e2d17363169b7a05808e533860a720fa8c03c2930e0f5fc01d5267c8b58734c3744203005a6d4c573149d70a2413594b4ce8408786265c849fcadea33886ad458b168ad92f7fa115a01f609e934023a9c840e5c9d8a22eec0d75a28ab892f323a1cf7932282afecd475f9e6a40c61692a8ce40fe881b3d82e0e341f3b824acca52bd6ccfb6f7ebea818adef1af0da89248e0e07a16fa0ec5b4943b52b9b440c61890c3e65e7ecef9f941a0d9509f6025331922e107c72940e2f90d3c2fea35935dca1d3aa1283e7818e48265b7e3c3c7f1e7a6a7dceb0371168226249d0f21aeacd9e711117ca0f16b14023b57835a070fdcea52f90e23c2a9d0248083cb6b948030a02e11e49cd25a209edeb1f6794ed7594c66fe8910d2276366f4767799d1727ed6d6351898a780cab6a459a5c81c02ed6b585fe4411c09ac8bd4e7cc22e1fe0509adfd611afd5952f840b129cd0afd19b5ab9fb83b0ceb2bf1c64a11ad428d73a719cd569a205e59c2284aeade78306ec9d5207d65212652473d3fe08f7f9b3b3dae4771acdd0a5fa2cf99719300374d0669a49c65f565cfea9e1bd14ff5b1dc3bdfde3ab97fd7d5189b2f46811f9c44f9dd7eada3f603e55a8d703c65416bd73023042a4675614aa23f7ee20f42b9d712a52119b5bf8b43257fdfba75ef23aca91c5bc8ea7a1130ce110adcb4063a83ff553e78f19e8669c9e9aca3e86b73dd0520478f0bea72180ab4458f05d678dc0e6229440e2f7fb9b65f79b13322c6d8e2e359f521430e70d69dd1818b3fff3fce6063f361fec1c37945d94afcb1a730b0b9f583c11040dbb032114caaaf582fcdb4911f7369070791412dd99ba49f650d38bcc371dea3a926259758eaa10e3c7af31310d91aba068cb5e9f5966819f636c4123caa0ab169b6ccc62ec1b17be654807c7009605530ca28b0278368a164ec009847e020f4add0ac4046d65d3badf9012fd56af65326e81e02d7d942b0219b52b17daabde7e6025878298f00c803c6d9cf9994394e49551a449f0e72e0bca35ee066603e0592da35e05f62489b884c9ebe350b95b1289f8207d5a9659da6b279c76aa73dd844b6e91b50d6a1409c08b48e4047b806453609cf2420b751703727b912f619ca7c26c68b96828731bf79bfb243cf0cb81fa6f5fcf30ad496a9b00d47f7c36e6699b872b3a8cc76f9731e14cca80800612860fb33dace49f793ab8ee68195b8372dda5215f03b0d025764483fe5893f7be0027de643f183defe88213738f363b6b90b09351544a5e6ccfafe7ea4d91682e6f9f296b70b1ec72ad4689c86531d6fcbd8fc93707fce1154307c1b3e6e31f0adb5fdc7bc81774aa92ec999023b31bcc6b2a0b3aa43020c7db355984acefe4f94d4e3fbbceb39d419e5d8bf35223d384a269a182b44de42b9e21f783261e81a3cb569a540aeb2fdcda7fa71879ebc6cb6a34d236bfbbf5e994b3e3d8dcd8bcb1605e346d0428f1264c3b35282072bc4acc73e87f4be11ba8c5d464ac56865fcb114f562f45d3acc4fe7a7c4acf207da9cf0e2984e2291e103a6ac4271d8e3098e80f48c254522861f822c5a70f5dd08f7cedde6e0bfac5cafa5e4970b85af8c1ec87524db90f2da3401c586667917fa4d9f94e644fbcd97e0d993cb0af507eed259fbcf8fd708332e0517db160245091f118c38f34d823d37c02e50e8bda8cc59c40cdeda7dff1b7e0a87cad807f0cfec933831644b468724e808bb3d25fe8f15850ce513fc341da46089c8452087b926b33d72207b973038bfd77c60f475b1861b8074f4d8439421c5b265e5b2864f6defe07db044f0b2d3b60f270c7f9ade2c061c00c5a8aa2986a886262254790d22a7e5b68c3dff798679142d984dfa6f97c3241b3ed3c4383367798b937cec8cd58991bf2cccf00ed1777af28cd600e029d12d16a8f04e6ac8a10108a1923d28f6e398ea0a889eed451fc83862be4aca82cebba59c74951ba6d3b11fe54b076c17745fd9bde7389f41f07041a25d3499030a442aa1d744d56e8e0e53d6fdc7e0b78a5b00af6f798f688817c0d4396ad65b125b28219eba22801e7d26ef20eb0147b41ef16787ce581955031860d93a0cdb85652 -MD = a5e93544e86eb9960dcfcebb6bcc461d82f119cae1947e340c7cea1c7f351c0b - -Len = 21104 -Msg = 08be55573177d70c9eca518c96b457677ce07e31a126cc295c536c175d28a67b3ea50fe35b87fd9de40f3e8e30050a6254fd35e6f5d9a9b15a8f140ac52cde0604195ef1439d4def24a47be312bfc090d26b36ff5a96a520e75f3fb34a1e8e6982a4aa4790c4af4c87126e53e3ea633b1bb4e8447a67a7bc2a4c55dc92059eede2cd5baeeb010bfa35e081a64b8fdaa95a5fb27ffa5398cf4cddbe4b45e9f5d7491cd9eefc5e494255961ba3f4b40d22b5f5fe7685625e9f749be3c90cd27d72e11a8dcf6ae2526c0fbca3148364e4f054fd33f2c19de275cb0c2a1d8fc91d05d24edd19de950cc08ddb83bfa3a4475a60ffb8bb560b0c9879bafc1175d5bdd744413293ff806086f47a226cfa7e1ea70184f799edb5c552a52dc26b66ff45315e79f50776aa36056f22e8e530f951205e1357542ea1f3e977ebe2f40c4e9e5b48808c3bea1c7786235a3df1ee1dc80da03440b3c0d97fa6187ec6740ccaae9d2bde61f704dc09513baa8957dcf36cb6ee6f1a804c6552d1b06ed4b3117b5e3f2f19da056cf4d6aedd9a34e0a1822362714d4e81794b53b266417678c16a97887bbb612cc96bc5e532b3a654e5d3d65a5155427ff09569906381138cc49e3fc2384c5d33c34abd3d617c487b52ec6ee7b5105f41584b7eb5cfb512b8c31f3f338d5236e30398a8ff927e801c8ed7d14fc5040d915a737967d166ddc266f68023a3575304315d6d74ef3fb701419ce9daabbbb5359e1741ef911bdb72542ae9dca1e21e5ef5a2f4e19d4956f014419cd28cbdbdf6cb3ec095385c749236c361a5b07cfeb8f56e2591c724c3b2aed0d47d93908f9c89f1dda0eeb210e8b3cad2c5f8ab5bdbdcc9e8cb9356680fb9507825e5be91ef8237805adaa3173e74462385a0fa9e9050bb25d62969accedaca7010adcf2db75b18910925b9f15a203f3c2dd1ee2d9df94dc4fbb2e5f6b9bb45a4861149cabbbf9cf9f6f67c070460bd0505b21171ca8186ad825650b09604c9fcd139b6cfc454cc9e697673bf06dcc966546cead2e18d6fc8b33c34412e5d5f60384e9da69ac2af69a9cd2682273b6a47642601b9a8c80efed58d1811496c0db8027887b605b24d4200221db92e26a9907b09df8ce9d76d3532708588afdcddec78defb67cdccaf12b49de1cae4448c29e23d0bb46a659456100e020e2753d7e4e2a98121b9b7dcbf0e68f91f113e1efae1e90d9af418894ab88f170b7a7902888800a14c921cdc3356a8ed1e7dbb64ebbf356ea54e9856f7721a4ce770f866c1b10ce45020a2b854d4884631ef6468e5c64ab53c428e034786d72a0ad1750b75a6f5d1962bf2770cd02e8bbf30e131ce3c506ac996a296213bef38dc659bfa8db0e2f1847bb3214291c2443009d9c7906a6e16b3137b196cda8afec6f40f3af215fbca83d78ebfde606df9eb3ff4331198cd406281c29312abcf052e457cd38a1d6ae6fc092b58c78556335a9ddb7c3b0e95703ea81e0dfaf6e7d47d2188ce3f1254cd55d731f4e748a779e4ea36aaf413ed2eaf4f388e0c03faf41c50db32f83ae405f80a499b25f08554f1edacc626f0fd031d40b71e30192feb719a1e079ddf3f184b6a1a5669c71a4be96fe6d6b8eeee76f04144c54e82ae43e6c7f9551547908eb8be4d2c9b138ee635388ce59253e810901b878c4e84a083e29e13254abafdeda5d08926a41d09ad3b1045f89c6712576596277a18682d34cde8157e2382aebf7c66774b6a2db22964bfb919be7495d5d879cd9895767cdd0e6da66988e6cc8ba449bea3d68bb1e1180c914fe0c099124f8e20edabf5b6060ff56fed612d7fda85410736d07e2f5dc0c175a3ea944595339bc981432f02383748181296a0ee338715fa0d414f5426c2a40c1bc438c1e6ed696f5c466a89f9ee2d48e01087421e128f3e2f0f4747c3887effc256f4368de3c0bb879aef72d49c6ea760b52aa2238e757ca424ac31bc7816f59d8910cc127f6755092906e64ea9d1de996ed037cb63905b7566c6399afc3697b643d3aafe2828e4ead9f60df17e1f959324c2299df9a884a9bfdf88e47ba48d146d87f9d945c9103294090e44811f7357bd499f22b9859e48163d45225d297ebff072e029401383ea418512cf1b9b21ec23abc1e009ee525b522999dd098d13c0b2dc887880cee21ac8b3401bb459475a3c30b86152ac48e85debac9be998f31e9d0f184d6dc2d8c811dbc1afb5238caaf222ac2dfd8827fa1ecba5e76412c6e19852b9316fb60bfe0345bc1384bf98e32bc7c4ca704798967d11ac46e2c236128aec93abee7423c388385ad08bf5140dd16929c215b442c66204eb42cb71e9b75d26cd4352c2c92087fec36d318fa831cb4e039d5396ce91b5ed876288e787dbf84890810369a51be9dd1e72dd53fb5601be79e191b4e3005e14ab2e7fecb983439a03ee6a315ebf941e9368f90bb6845b03b31839d72a1946c17d2f194827b926634f11ede19c1171084cd6ec7d80c3c164dac9b2c74ae6533c25ecbec2788489ed9b72f543091b68e56e441e72021c1b28167d644cec6f6ecccceed72454ed547e109aeb1d4be462fb243af7b1e49651988ebbb72eb8bb80bb9abbca3465fa6f5fd61035380a7445949441df04cd3a4bfc6b0b133455d26f4fb6dd01bb50b5c2d8145c3d5cefd4fbf6e6e03e31650ff29cd4f5e0286cbc25d149dce280c0263630f2076950a10b6a6943a07c01551d2cbff20286d0a48188887a3ed74d5b54b1b1999823dec9217c37d308013c456ce2aeedb96df4a62a82be728d47e8c9471ca13197d2cc0f1f17a6bda035aadc05fdb2eca3fd5e1abffab958509a1ab3076049e18ddde31a0c25002af08112c3ef631117469fd5a646d7c3551037abc19d63f1d201aeeb93f08d8b41814b3ea232fe13972cb920f5c90322915488639a100fe12c7bacac21d337902bdafcf420d7b40294ddb508ad4f651e33a4f40ae7684b6016833fee6dbe0b560f83fdfde5e46f2435e0f95577e1e5016488e3674fadfeb7b8a2cf781fb8f1271605b5219a6416c3a3bcefcffa866b114b89bd437be8122f3b5fc413decad14967e78b27e75c912506fcfd3ddf46df98112eeb6612216e0ec743878752fb93052cb1e9d973d6c89285258d69cd2929dcdd00d398bd5efa9c83d57e9c24531fa38aec36fde7d9a35448c106196d383226d886dea124a99e23989d1219fcda5d6bab1fd95cea6e0ab27857d016677ae0bd29487448ee0942e92e23abc8819936a5b7d23cbe259ce5f33d70532862f81cebfacefe56c487ce376bf0b26f5c979098d58dc6eb3f6b1c60be93f61606b8cff670a1e2944d292a557a8b8dd735dc558d2ed9dfaae1e39741244824aafcc4df27b5488ac732f93f8b817ca6c8b2716bccea3defc4b30d3ede961842aaec2436c6f14b5cba1afff321a94c640a7e5dbc9d30425e025cf0fa7e3d89b9df7ddeba1b4b33c234ae422f5e19822e643fa82e48286e952a8594b16a4125f11158fc556dec8623fc96cadc8cfaa66e9f9e5bab14fc4cfa04d5024cebc97452082585ee06fccfe7db799fe0f173408b83427d1a4bd161f65af541b447fdfd458b8b826c2ca2937599ffca25d5add9edd8d4166233d237f2f28c59cfc60648306432fab928065c37fed1529182cff8fc66fb2f6d1424555495435387b20cdd7c59c3f5bc4251b194d1973f0e3f022620f560ce2238f243850bc236 -MD = c525eef8b2ca56547565c947bb7e964e2ecae7c9c82c29228b6c932d2ace181c - -Len = 21896 -Msg = 5bfe61888fb48779d4dc6bfbfe891fed45a830b345edced1490d2cb8c82e2adf309b3216e3bd5f187f47e55f63b0ad3c6fe63f260a41e5536ab50d85104df02791d471989cd548c739c75f004f817c0569f42161b918b1f95e27d3e4e20a1b7c0710e8b5c3e688ae89c4a386cae4d671bc389e0b5a5c78ecacca467c484df50819b85d165fd768f6f7a6779addc101a8ef1c7dccf3f48353dc052ef649fec4f34f329963789030c70bd5a4e48e0046d18a06884e8ec81a57764252f9ed05d16531e7644317f928484eb9f20be789ed141560853632c0842003e87b2e3d4a6485483f855e42fa98a247ba28b8f0443e9a19913d2fe8c40bd50b5f713c40b5c57b1ba3c65d047bc7fc7f411092b01a818b1e0178dfb7bcf59e140efccdff2f3b703279ede86264fe7f7cb470422ff1fd0faa18feeea7908ba4a85fe486809e0f8c162ac3a6669d8553c87d116f75b3fb4c473e9605c028150f4eb9f011cdec8af64e1f1040170ea49feb02bbc28b46c36d7cdb0acc0b6cdb078f84ea16eefff1d762bf9c5d7da0a38b6bad35e278949d98d15720ea8f4524b3f129983ce9c18f56db712ea6a139c941d2e549794483d1f6cf1aa10854993a3bfe0ec22cc818ab9c409f90c38ac25fe6a711bd2cf8fda6aefd8c54cd635263c83e9c328e93ee8cd019b0885b4024ada5739b5aa59ae965e8e41603e2c356e882383baf09502a7b1bef0cdf16cc45fba4bdeae88c352e57ce0a1e74ee7c8f11907454004509b4c0a5481b5d9e350f910b0d662f88ceb6c185f90e709a97e3251a7a4deeebc574a395af44c9988369b603eb77f6426f68ee38394cbf8e1b3c6e4ad39041a38d526c13a9f2ecafbf3ab4b4e08507621f2c250d50422971108132460683c11468366249c08a8f89f06cd14573f8288fe7eaad2cc85676eb7f9aba369b9035e75e08ce5d7b7578ce1ee656de2d382271cd8acfbe29f26da66f6e4e431a1e67c377b0f877621b702751908ba995adbdb1dcf5d3ebf97dd847e8e735950c941d51bc1628c0fee43e3c9252b7cb33c0c0f7191101dac25f7d79f2ecb953f95c20393422a65fd639acb4e814236f8fd7f5ea8ec7a0b40bff24e2966620a567dd3822e7bdb97d738080375cbe18bb325c22334200faa05dc7972adb3bb3b4e07f2cb4decdab425b23836ff538dcd7a3b5107a3da255c73f1e9dfaca54baa8ebaac698203bc2d518887d01bb6ab7ec6a4c87668896fa51396cfdfa69997da911c6cc76b5f0475f32193698b63df32210874f9f2ac53165d31a80d1c2f243ddd83b07f5a6d381072f3c75daef97d7a01cd02fce2b16422b968eee27dd48566fcb723fbefacbbaf6995b046f6d62aa8f168ef09b947074cc09310fa6c081fc856fd13c79b9c23853f7dda9003884b51686285aad6cbd1070b56baaf475877e484ec1c5cdec9f4547d22a2d3559e7405ef50835adbbe45e3e20a589b9044024dfefaba4629a4a27fab1aa57b5d771928feb95494289cda65fd445729e73963572daf59fe1cbaa26931cc5f129ba0cf5d0ee375e15df6030fb59b52e4acc70fb2b98097ff287a98c3b9be3c1380b9faf4988563bcdc4854339355b856717b5bc30b04d0b3cd72e9f19b76c918bd1110923405aa91341242941f2a13e9a5a4fc1a9aa2b0d68c222a956f7c827c9144c4b869eac708f5d25283c17ee238d9f2552bf0f0a4b1d516bf019e45f4b9bdc37bd992bb258e8207089522da9fae8ed1fb69965518f048bf2bd8b0499c7a932baa7856ed529c792ed94aabb3c8c524d253761376a9fc5789f57d3e2df629a1dbd5071f07daad3bc85906d490ea174c51f1b3c0abc4307205b081b0397e317a62801863713a4b5a51ec7c2608701f660f5ab5468af45728c0c1688f12b13c7d4e302eccdfddf1455a17fd2870f737f23902fd1d8ab6cafc39bca443301ba53afd79bca3aa52399d5f701c4460ec0b718d6efdbe3187f66cdf16c775183a0623fea1448047138ec2c0695c125ecb04846b032980f5e473eb3f44448d3178c9d8d05b490b5cbe5b462b882f1ad110bd7b5064233e7e58ce07c8e99e0422747aba011c4c7d41af39980f4127b65e6990f6ec165d2f01615f430a6b567261a9a3680f48c18eac62b458da18b88d5d1229578c7e49eb457ac21d824de0405584ae3369854a97e37525d91a9363f863b6d14db0207beba11170f7aef5ddf6949225cc9e364a218d4338c95f35bc9ff8d4332a059155a8aad1f6721f17a21d955e94941bf032c410795789f67424dc82d6c97ceb3589cad918cd1d2117cf2dee46651a7137b6f7f383fc9baed32f46a85b0ec6dfa16aaaa2726f49737ad79ff5e621d02c712925dcdfa28eb6d75e66cfbd7d9861598ac09d6b579774b53dfc42ba5555ac211bd602f8e3d3ccf514a56f9a8051fec26cb530500077b36b74bb5b3f7a0b7eec01a12c6c3afb4fb0f48b1e6ec194367072e0f1ed047a9de21e65b5e20a6223266cefafa61265bdaf60a042a6bbcf76e85ffc588ede10b2cd8d83d95e710a2764c04a0342f4c3a5250b5d72ded9745e9e663fdab1f7ca9082648e3be168640a2bbe28ddaf6c6584c6374b3563a5234c0738440ef2ec0895b515ed64373af039ff99048567e3fbeb1796d1e0f1994ccdb748a15bce157b50ba2449d8ac734f3534e37590e8f5d7267d8c8a2c054051622319d057a01e63502611fc0fdd9bc18a704ff496cf1c87e58c8aec7cfb14e197ef1e3979156180f26d61ac80273f07b83620f9fd66b29e96a934714a5f917ded5fe875369a8924d61495a3c035b7823d0af90e3b6c728bc8780ba11aaf3076b119eafc16abffff79a010aa4675afb187434a99e73cb6cfe96d630464669c7ca181a846afd630513b9475089963822635939835775409eb77fded03ce221ff03d4ba2dd5885b4caba5635471f8bd940b6505459624ed65f02ae0c37ae4e5561c2bc5d28a75707dc6489d3fe7f5b1f91882e218e3e89c6ab07f233088b67b741f07859d122a6a406d893c3970f5dbfb93971624c7291355ff66f140efbeab02134f40b4f411113ca7508a6996600440838cea90c94f1bcde5c7901a36663fa801eb3f3fb8902c1a7c85cdf8e09ef470f049a68572c27c7a6b8a49e8e515fd0df0c2ca67e7118581f4114e0ed6177334e2b5922a48eafe05989764cf8532afdae8be285308fbe21a18da55d10133493462baf6a8d530691675d629f99d271bb6f2c6a32da3b60c8defc92a6ce85b3d17773f1926a1fa8454082fe08eb55b0a4a14c3811a40aacb8181c6140514f519852a2d44cd32b118685b8bd0b55536433e589b0b44683fe69fd7ba5cc50b6ba328826abfc512beedf976d0429706209039c63789d3a2dd278ef88b4bd35723a4a587dfd235c987cbb05fe87e5c4f81b7e3657f43ef77ec54f6ec2327587f87e3a74174c545dd767a3520b9cc2bb9c181e53d5b80be6ed43681bc68387b0cfd2ad4b912df1fd8f2c12fc12d742ccb48b6e756b48a6b0ffd95d56f44c86585ef3fd4f69f69e842626a47482bbd890d7f1e90b970a71ce2cf399a0d9e1d3d72c4eb500004abcba1303b24bf9af16707cc80896d7920fa70b3e9799f5d802c5ce4f6f0e02aedee7fc3fd6f2d6456f14298a6797ab53d2c400f6f192c6b395acab7285b9df87779638377cf9b70344c454c5609e90e45dada4c9124bcaf90ee44a5493a3f559095d6d873ed10a6d5a3984e59e1c16b822ec7d3183f5811cd1052162034cf2b826a5f2ab77094ee801cc40877a80ab33a4e8e0bcb14067937ea7d7276f25361931f86e10d012f307cdf50e07707ccd0b662b75b744bd0cf17a14c21131bd6df0cdcd3653b48ea541215c4 -MD = 31600a05842b12ea927796eafa30e6b1634a97f9bb41a2f75abbb2aa921c17c3 - -Len = 22688 -Msg = f573042576d47a37216e1a4e3b45682998abff4eb1063bf3f7d3351e67ebf40c5f05e1d0b07d7c3cf4544e0422771e215f446874174a0bac4d5042692f99d5a1ee679144ccbef51b776a2ef695444606a0b09888f46a87a326836f9498a6dc084aa0fac9f31f4d9d51baa26cbd3246a002f875d16fef15a22b72a5e6c99970081cb806a94d29ec8a2a4c93adc1cb87b72e23e999b1601f6f0427caa8ebfaf8680cb89c2a01633baaac26e702ca977113cb39db26e2450cd358aac7232552def1c1a7a3963856a0c57d5288b3001d6d7b824332c228274496cf01859ca028896be48d0533198884a245d85c088ae5e1b9fb47d8b3ae8c2f801236eb5e8304619e1c73a94acd83500aadbe4d4891773693dd50b4419aff3559c951e0b0f76ece51126077227bcf6ac55c0e42bd3c5cd5d2d163aeb61505bee89c584ed924ef384e6e5c57054cf23c9bfcd022adb41b243e7e8aae58462832f631551c22310e075bd76f313968762c54320ad761203c8d9e8dcc9c7156eff94b334f32d34754a341f5a2ed07f6e3a4b7a8c64821a94777bba53260476ce27baf484f78348d4875c771fc73b71ebf0b8d060b5d3577c54a5e6fc2e322b18a20ea185cd68c2c72e3b7f385ab910a94c99ef3e2fee4b13e6d4d92860b4c4d6e51c34c7e34254b5a56d822467edddfe946b21851137780384a51b786c10c671774048cbd7a45138937f1a746d2e2c847e9911d6384360b3d483186c9eea9270bf3737f229035ac86eccb298e91e9eb351c02a91d39697bd4cfb7a657786cb6d434d9ceb45e3d3dd9df2e5124a13a703b47cf64891b58f78647a9c038499d3cfaa1fd217ccca4ee0b76e1c712ec1d80e1d0bef8ae104ba8d918d07b754784e003a0a91e80c3b4e9a31bae326058da43b020980a940189b557abf480145c68cb799ba370ca29b35329355b3b14cfb8e02f9f244544d75b478866dd76206f9325e3f9b4bd62e8ea57252cb1893838007fe7b52c4ec5780986f3b252069e674b15ca22a4ae4ee6a11a206778c5d37afb4a5ecb76d01fcedb9920f81cd8982ed9c3b57e3bea980d20c7a2507896ee7fee671e47cc715bc018a9979e039315ab85582c75411a4843ae84314e78a5902e24feaf93f4d980350adde10ecfe01ec696fcb76f7de56472947957c94299c16fe4389715b6b19617f75e85ae4866ba6756d6dfd4b8f4f6811bd09b299c1b892a753c6037dca1a64d28530be836cef1760b0f2b0cbaee055888ae85d74fd3f147203391602c50b6bfe5e5fc2360bfcbdbfece247f4b7c9adf263d9e39236800af2d45b3f77067d155763cdec68fe2517e773c50953346bcfe3ca56db8df83bf48e4994d666e8dfcf7227f3c3b8bdf8a48bd8139b739f3739d110e7bbd4dcb34fb8c58e714ef6b418d32d79be91c5d7f1f1ac4674b272bc7a4ee9f4eae33e969b16fa90a69baa9a7ffee6b85380a0436edd42d61bbc398c1fb1b8070f45a846650d3b53ccd99ee36359e6481901c7db99834e6af6dd6e0688ae0da69f88a4531c101a408a852e2f7178ae918591b7010098214d9cb27abc53a85d5bf218ad3d4ed419df362ae2ef18efa23d0fbd084412906e2673b80a2def15198fcd624d857bbdbc88763757a2d80353934de006256df0876e227a76cbd988d4ca7811ef9c012164e4b146f6db1d78454c96b76b25612cff8d2f665b26a188218498941e019dc3b57c7db63b087792f9c1908f91b4aaca491bd10821ceb577525695655356a00920a84211bebb7507e38ab1e50453994cf682dddc6514a3fb19a8f50229fb9666390094f5dc54742b851071644d92bb298a7a9c5f9fa8fb77da044df6fc710f6f611decbf2e64139270eb6569d7f29ee4673ba30e2bec0a6205f0e6b0655769892b48cffa2f7ac1c11983f4823de393023f7e6864a46e7f6e3fe785cadf0f43481a19a5134a091d3bf162a539d9f66607558b82ff93a0b8e0ea6071a2d4090b20901902b7288f74579b100ded569b56685c1b593b7413556e97e450d4eee54fa73fcf7f42258e65c8791475391e5302a9b58671a4c036c36bbafb99dd7a248f407b956140db767ff30dd8a199abbde95ff45552d7f29b816ce60eb33920373890c6135f3fb4e8016bdbe4e98b892c78df8b10732195b21de68ba643545badd9fcc1b1cf9b4c53b8a765b1d38b212f4fbcfc40693e340b076d2e5ab0db96f8e1f8d10948effc3a041a3dd7e6152e46cc8cda5d9b6a2816cc654084821b6c98ff29867241aa5f0b6248c6bfa7b5eb037da377d080521c55eb7354bc4db0470e7fe354955056ff5851b792e18ee9f1d5e1b58731ce627b58c2fbfd7a6a26a0d9e2dabdeaeb7227a150fb14d6022ddd4e87277b09cc37bf9001738d476ddb148bd66444db79889266fe67df15a80e07dddc6db5b1003e638c258e96abdf6a1c84a9046bff8116ba29a8a25428f6e6fbf4601cd9d000e301ad8d81abf015402365095fa5bfa888f959ee1f167865554422a0a959ef54c21494c8113fecd5f9c39d45ca84a4466bea884d52889c79e55af91c97b857725806a263a1b4da67f377ae0cd98b35e14c083534d14cfdbaf3bae8326c77b0c0117286cea7bd4161c9aa07bd011bfd1f85dcd1330fb6249f2cde60909c0a73e48ac28287b7cbda49e8e54ae4d5d96247c5d2fcc68266999cdd5002a5aaf329462081561d4642dd96ddb3e802cc25fdf07875087dcdd0d54aa19a3ef01dc4396b7f39520dd7b4e3bf14905f95589438b00a4d94c74687601f063785ee68f03cdaf35506c7e0b4854939f5221b1f969afd17c7121180ecb2807792782f21099c0b395f04d9f5a43acb9a7cc01265cf9d3e1d7c110b0183551572357600ba62ef829dc1acb28b166c9cd271ca09df81d7f987d702024cedb05482bb0021a9beafb7bd278ef0158d93535e8e906ff17fb3c5e3627595c78e6cb4258dc6f0835f4530f3fb2c01397c5785bb2dc3c32ffbb919bc98ec4415e7d2cad7180afbbbd75874feb704644b65218a54d9d4920f88607b7ff4c68b9c8c9aff13f47cb1d7a9420a29e598a7dfca79f7d80d335af4c84251aa00a4eadfdf1dc768ad6ca15b67aa56f1f1593a7b3ed954a142609c941dc732d746f7c06461e3ba419d8b48ab74e9e20374d6aa8214b8073d240cc5521b779564224fcaaeb7855e4b6f39166c739941caea9156a8eeaea627fc6863b323cc0fed4d0d6833426b19c27cf6a902c630ecb4cd09ed344f15a7ee6633f63bd94cf8ef01c10786851d736351546f02ef39495d86b0ccd8a89592fcebd00b509e62e6c5fb0b470d1205018a86d2e6e1712aee21c21683fa7da6eddfe7cd019605b6602e833c955b5bca3ac487e29f22de7e51ade9bb910e40b21f03f49b877081bfeb7554e580e5d4c5858ddf13f64ba9bc0a5e780072a8945fad059ccbfb74a4d7ef26da8688311f9f8862e6d78ac0455c8ebff795b74deaf82e614acedc16e196e1df7ea019c19eb0a9d049bddb2543e8355ed2ebcd62a72409838914a7dbca8579fbcbb2b41bc4916052723755ff17e7b497b463238b7b5bc4f8c25dfd37c22c1e084c4ef5a433ba4255fac4999253c38306f6ac582cba17f74d90db3acf5af324816ac54cff6eb3d6774de5f4936a0407392417e9caf5e106de7f4ceee7075343f3c1c63881d7e68322d63c1586dd31d78ac74646fab13f7a47e803983359f4e2dbcbc236d001faeef53e077ac12fd57a985aa7fe106e8bd7f6659fb518c53097a5f339c67e7f49604ae00872f6d45746de48cd8db0a06e96866281c42bdb9eb8eed2ad65c1925a8da0668fbc7c5d4fe2b93c17646fd9503c64895a53d0ffb7ed12e48da36dfdb6cd923c3da5e64d27d4d58f2620828bc9401d2479d29cc3e4aacea36afdb813e6b69cdb72ddb9066773afcc7a20bd3a42381cde70cf03aadd685e89b5d3547752cf3cbecfb2692b8765a47e74035467538ad001cfb79a16daac5f120ed2a78a937dde60c4c27b2 -MD = 7ce7f53dc2287da4cf28c9fe64d5515e484c9cc57fd81ec76e66fa38b760565e - -Len = 23480 -Msg = 1ba0728993b8f0038cd7afac17dfde8c712842e327187b5f7df4899111f58ea2bc9fd542b94e14e20912ee2315bcbc8e96398d85b21f6b796786e15e2d19ba5cd76d0ac8bb91735212e6a180a230175b9aee2e68bde75ad9c206b005fb67a51636b21901e1a894bc71fbcfab0463765b44ee2c728f98d0e6561bfe6ec308d9369f1708d772bbff86ecfa808b837c61f65ee28f8d72595308eb6ed481cd24de26db43e131b8f43d1a4c8bbc0a69a46094ae7160a0ac526da748a6392660e23a4cb2e0acf6f979d5de58558c0ffc02fc9dfe44a69286aca52b366c3645c66a7712eb936f107e724f3cda01f78386bfbc791402694d488f83fd7d68d2c645e51cdf500634668f08349b9836064c4d022990b854b1b83a229083e5411591267bb21aa7e102e073620a625c9dc0539af4c94ab4e287bba48e532636a0078eb153c02db9cbe26674aa5cfbecde2d80b4bc2710cf53f23ecdfa554e372cb1a62d96ce7f4e6ddae0d805afcd10a055bce584c848d050fb29fe8f1c64b18e1abfe46b65782e6ff536e89d8d40928b41ed7371365c8080a9647f7532ce6c6d4ac21cfb0c8020783851ec9a7dbc3948f8fca7adf8b2a78c04d898d31ff630724a981e6d4bffed30ad172c2408a9cc7f82d2c96096b40d1b146b91d16942c545212732eaaa5d5d415b71ef61b46f14d7e85521b198c879d6e206b1999a1cf28dd7599f9ab20238504a477f7c0c76d9f9316ff6c98758b4647592415039eb80f27515afa4ea5746088382229b9527e28d650792d0ebcb876fd5f58921cf17381e0242a831dac24f0e0d0821e7d9e8f93a8d053bed4a89b79c0b19d132e308dfb686cad3680bac1a0df0c3c4875f22e4a8af503a482efa0f951ee461abfd2540650a947872047e70ab359a52a3af3e6c80d6d2d70a1e865602164080b5a6d822d19488df764d9e1990e374156552a2596a0772595ba395538afc14787864894ca22f8e4f9d6f76dd65023b53f3cfb8730d4c180a62448fcfd6d7488f1bc29e8781e08e120ff16c84d29bd65575aee78212acac304889dc928eafc30ec645809b16b1706ef35bead57eb42d631478964d2030171434fae464598c6f3da377975008a91cac71365799125828c4f7b42f9de0de3ffe4f200f0ddf773363d7df4b6effd07b13b3091b98358cafc248ea193afac00d35c182c654c977f7c98d0505bca52f73edde5c9e9a905aaaa32ca2bcec15de6903b1a86f03bf95a3b8eb722b039fcded801db84767cbc901b0cd65807bd93e3cae471b74e068d8207619ad270b98b3d21696a380c68de19c3153bacdaef0ea6c7fad623bb46d48544b403e5f9c36e708f571a7b1817eab636ee62a0b4effeae3be08052e4675ed288188ae3d7e21737965d74c405e472e3faeac3ca223b14487b3838db36029d0845f18842778025e0bb0f01996269073163bd078faf5ab0242a6438134c831f8512c1948875481b1a81de3961ba00080d25b78667b8c982cfbde73691847346d7531b283c4d8457337f3d94b3796405f5957cd8f8eb01ec89aa439cec7a5db38dab60cbc46cdf7aca07bf9c153cef8189577f67a9928e5e00640bd36a9aacd6066024e7b75fa3e65cbfd6c7fd512cfb16c021baf06bd967b29fa282c261eb2ed035fa148b929c3a5a0c0590d27286d34c84266b73b37d9a2ea19a235a6c834e898132dac7a202e74070ee9f4afd87ba8907dfd19a25e555c31e752db9171f9580d67192e20a826dae82d43bbd7eca116acfc085da1f9b3b1e6aa61a54fe1a9454aa38e57138953e02b6691ea062a86850307b00ca2d29aa9f2abf71b48e0edb7360fb3adbb8b5e8db801f80aa35cd3fd7fe51cad0cafb34d3b323ac6e4366db7bbf3b1ba8176efea7746a2a218482f8707e076c84759a6a4aa87552d8caad04cc096af06cb11adfd507db73accb74329843ee3e5bb981ab627f16ed9a606be7f2e41d617022541d02ced5e5a2770b7eddc488d8dd033b88c9bb9ae509c10e157eb3c4e778f7a526bf1dfc08b913d32dbf8469c47eef4272dec283c1cd491dedce0cf3eaed8d889d4899b055472e45cfac080389c7da10fa1048441c4b8506016f542ce4247078e15da69543e322ede521c3d8713e5031af1c915e4d1ae170d0e13dc28bd43ce0836ce91d5d039e360ebf5c7b4348ee2ee2425254eca20ac8dcb20e671a733f7a03d4c5ab292f0cb89ce3164e587e0063342fffaa63775d8895505a8d4868148fd343b0e100cbdad0202ba5d4395443692543edd15a11563a9b5ab6a77e4948ac82285f31ac70953728f76faf5e5203cb261cc16c38f681594f2f9748248d484a8101151f54a3d83827e4f8223ffddde3d7190edd789d6b6f314d60d1e3ba9004605c772cc1dbf06dad62c3ff76ce4e5d88d72aa7917c70d6d242c7f73447bc449098f9dc5c9f9a4219ff47797b39c182dbb5a94d3c2a3e3ab28e210a8ebb29a5a24511908d5512400e191732b5c6c41e40530f40a11d200542be009e5b8b648215ff52fbec931501ea5ea7bdcf0be26a573dc12498dbc2c11320eb25434f09645c163270f2e00ee24f2e7d6d1f6f991170c4736b6bcc92f8a4754521ae6c64e6f538449228a26c7b9d170ce34f68448e2d857a8792862d066719a326256a136461c3edc20680ba386496da92a78c913afdff5afbb59edd84eb9c89b520dea1873247a2a304d174a3262c6b0dd052fbc262a0a95a4d6d410e925c6d3129207ba9d7321797bc3b2836624642b75241e09eec07ca05b277d3de0c07c22cb6d62e46d12191229514417ca982d62195efec4b0a9351909d4522ada8fd2d2a52761608a084c3d618035cf05c50a9cf23a38b313ee1b48d565b99e809cb12ac7476ef59e5da0424bd6ed71c0b4e3232840329fc0961874e8631c607aeeff715a55f06a4e19ff6810ddd4c5a26ba13de2f8554f5ea913e66956e2396f8da6f085da4f88444550f8d81d529554f42a3348eb098d9630f3e781c473f107828cef715df21728e97b3aca1dd0a77d57684d84a0b71f1031a2bd58373750ebd49bb5456643dfa10b67760f65b4c4c69a42d2bb9fc5ce73b707b01536961ec38bb98c2a7da9a758b5fef4ce7d68b4d7c79f0c18719d6267c70a0ae14af82236b0d0ba482b8c39f5ee27fb30ee523f57e56941c09da5a3966b9311e3f9c525ed49c788c6f7545b1fbfcad55d3edc2deffd87badeab4759a5aa8a0f44ce65ef9061863ecd6a6ad67e2ed0c87cf86d454616e1bf9824ea4b3f8dd74a2b4e4048c6fdf524840a3471bb461f1db6a16c5005385f97168ff5420a1a630bc103bef83727fc8214621bf67e0ca01c32c34317d36be98c8174d206ae5b14992d7448c68ce6839fa4f7882b6e8a3b0c19e5595f59b867e4015be85fd458d33e9829447b6d4372c45d53e1da34c7d937929016f33e26c1e8bdcd9f15241889402aab1cdf8144b13967fd8fc978cb60e3c64be29a2bbedfe0de515fef45a31ce80a8136ba71f42846e97dfbc1e19fba59dc9e251bc887a9148b7090b6e001767e6133fcd4e458c0330b5c8c89174acde1fd11473fbc8908cbedb19a329c3b7d4a564ad4f5837a5f47f721a9ebc3d483c2512db0ceb0cce24f2c9ce62b22571b93124d28e4f661eecbd254bcad8d46c246ff79c9904b5921e66fb9da69196037a3bdc45f6ae4155607c77d2c981ca774b3307ef84c3637abd9de91dfb32a5bb8c07e37e14ff69f7d43fb25617419ff80520bc2a6cc186e6a70a3ab5ed3fd5288337d2f165bd3064dc799d3c3092b56ce6bb9cf3cd69a0744f2e38fbd8f394c8e44e33466552352addac710ba1efbb54646612d2033640923a9c9c666b08652b23ad8cc3907908b84c6ad63ae7d3023d02a2c62bcab1d7ceedb7ad7bffe8e6bdc5f8381f737c0babcd1755407ec73a9546142f877056d688dd1214a3240f69ff4f90dda08ae5be73c44446b2d346c4eba31ca77b80bfed6e7d3e4a8254069f6e2519d5fd4340a18ec674531881dc21aeae3ec65e98375cde628eb7802c48d798eaf5c99c4917557b4819d2d806e1e15ccbed24c71367d56711a5f4230950a2fe15a720f3e8c43ab7cdc77e87ef12748490ca1b3b8ecbc7870ef688f177b8921c19c0649abee1c1d2cbef9e8 -MD = e026d0e1228ef882d093fe4dbb2ec5134dd122877ac2b380d399bff447fc9fa1 - -Len = 24272 -Msg = 9e014421c88bcf4c2611981d723747ecaec70e75b8f6dc3a1ee9d4233377fd6863313bb0c39f7e7beccd39bd0a0616cb30e0e87bef79e08726ff05331b76de30cbb571bf7fb2721aa000b40fcc96e3ee29d275a5fabede2a70910319c279f29f8097d096244b12f1eab3f15be16e171b42a69f3b014d3ce9a3a6b81d4f08a17c27df3f7dd9f3c8ca70edd7e971171b1b23634c842eaf648d67470b87ebab53916b93a5bbc631fc6bddb65000a31756b6731166c9a76bbcde667be49ebdeb70a4f1bdec99148d149dd71644e99ff82fb3dbb9d4529409aea3454a2babee4f607e6464fb5feb8f7928061699ed8e4110dc02617e671e11a1a6afbcc8f6a5608be76a91ba5572c093d414bd3852987b60f791144c506d0cfdad4adaa4c70ba45aa6ab4b11c2d2a7ca69a6140960e42d86cd2fd72654a8822981beaba56648a53385d19ae8f032cd87ae6721f4619bdfec2685b4f4bdf7f98feab437b41a83eb7f4a81862725bbb8306cfceee29be41af9ca3ab29ed183fb96afd487ba2de4fca7be6518b6aa95f22f6b1083b957e8641580f7d90cd9740fa69ac5a29de5946211a925577dc7e703ea7349e663ddce48a8116432271cf2be27713090478bbba527d3694c65c3d971cb4c4f21c675bf4b1a4628c4d5e4248e81fdbc5a9e66804b5003d8fd54e895c638bdcb3ccc67e3f7d4e5ec98ff7732091d0612078cc00cdef3031a74337c40899b90653d5cfa61d33cb657b48e1e45b76154d99ff8df87e67a99d8b9ebc805435b8bc42e5d786267bb8312226821851fb6aeba2bc90c18e94c8ebad262140a7be0779116b9270d3cba12c4ea77c819c985dd5db2e98fe771d1a967c982a877b9921b73fe57508bd99f2c1612a15b293d34aa693c3fb01d0571b488a632cb7586d94113ed1f3a03c6d399b0a4d021df042dda87d2b3b7e22e9475c46f59c62c681daf18ebf92f9e8cbf2139a7eb6361a5d6385e7a2deb5d72a2b6c42ee1e1c3e9c62e2b01cd7584b2ca8c5a24da69d7a8998b973e9596b75c033d2feab16462913c86f4358355dcc05ba1ba22857b6a96dd9ad926d3fe17711fd2aeacb19733e7e77f1a910317ce3fdc2902a9d4e141f5092ecd39d06ba63b5f3fe97bc9c25b7330e1461d350384b6b4edd9c2afe28650870f1a7f72278c41294b875fe12c05bd7d731fe0026123ad4bb2e873fec85e2cbe056900a279f00be6bd3160e11e574e37fe4ee25078d6ac0943d6c6a9d9f31316d862c549a8fa22ff5e8e87b1e079adc74a7a2b0991c33c56674cc3985e6d8cf74facd54dfdd40ddaf647db3aba9462931f4cc413f412e49ae5f271b39ef420c934f03898c0a354e14d036462f4d0f605456cb458e9ec2d3d866fd8e3e3ae55f44dd5f7103992807b2a6b2b12d554f084838103beb8799ea7126c000e73c6b6e06304199fafc6180f56263733a649d877a333b92fa8e0bf405190f21d9762c8f63d24a62c6c6aa4079add91abb0d637486b2cdf92024a18710a84b5f997ab159ca5dea79eb6a4accabc383f643824935ea4117dce0fde32a007ef5188bbc8243b61da23dfd69cb9c084de4b44895b7721168d99cd14c594370e7acfb44be17d3c3abf22d6147c5251bc78bc35eaa268f988463d765c26c69ce8cd36648e20a905f836ac6bb76900e52aad9b1ea221f04ec3e470b12e2a51395d8f8e80cdab2f0063e6ca86098d4ae49826efe6fa01968890103b66d1f8bc743468dfef50aa97944278830f5010b8b6cc8bc0773a6ae20fb572a47d8eba8fb73702329b5f466a285f93e0eed51ad2c38e8317b8aa835d4cfab1b6dfad9553692c028e6b42a62e2680e0e70ce0d12174a8b6fb9191758ea52975767276b38ff1dc13fc4740f46ef56e06a24fb8602c2fe0cd74ea3967fe830868ee1f303ccbb90fdb8317a355affdf1ae19a0a7ed7b5d00708aabe882334f613025cf25588f288c022bc3b1f37ba6d08053e8f3a19767ce4646bde7eeb76ffa7523689b2d64a61d31fc34b3f65958d523580de5a307b313f8af067ed2124d9be0f1d3dbe6d19b8810ff50f086d27bc64030f9c51c53ab962dcd6ff456ca4f0e1896f92da95f6f96463b00b2c96d776c7ee492db3304b6218ea9e093a469df1ac61ac1d89e948b0f7cb82d3feab2b48f867ac26e11a13b7ac34a42a1e177648692861226effb55bb597fbde10f299bf7fffd6fc8ddb2a46a73b97b67387a461b23e1d65dc119366286979add615b926b9272832fc0c058b946fc752dcffceca12233f4c63f7897cbaa08aa7e07cf02b5e7e3e5ece252bf2fe61d163bce84c0e0368454a98e9fdebf6edbd70b290d549ba5577d476af04194f82348d85e9b299f08ddde4ed91675067a1707cbf19eeee675d73387802246af2717f24da7c78fa840457afc4666c26875c4240785093a5efe6aeff64e7136491800fce3d0935ac185c510fdfd162fad07eb15080dd69ecae91899daf964792a76e64ddf0184f3b37f64889727ae229cd993c213b28e84f3dde9197cac84771ae7d2cf8c6424c045d72aca13ecb605fe93c413739bb853a283e657248d5799e113ca69311efa2a41351fbeb973b73f9bdd86f06ef2dc739d83163c1ac4674546a4d903155a8e9a6d404c4dd0e539383b5de2414edc824cac8482aea57a3ce4133f0486813e697693a1b85da269c258a6bedfee59833346992e30960ed75cdf0e8e55d8bdf2122779006bd77528dc07a3a686dfd80f76c92b2a2add9e02519c0039d3e2119f1116e8036ea4924a0eadfcbedefd12a8d43d292078699a24a385b0e8868cc56defaaa755c8aa41f6e0b277adef2e5174d40a5cb720244d64d801e84277bf2083334a809c81d3c954db7edd1bc15bdb9efe988c982cf5feeb7a776eefad616b0a65603981a206748d8679f5b25d6dfa4cda4f806ba3c3f4e011510b98305bef290e539bab322b88c96a0c8917ca4af3a7f19802d78e78786c23f687e50996f109b58b6ec339294e2f0d9d5ff510dc11d6cad9d884f4fbd2b73aceaa7d3ff9bcd1e2707a70c0ea0ee8f99641f238099b01ed7bcb1bdd344ae8dd413c09da6b97aa1d6a865bcd55101bb65df5b648bbd852e3e7a344520b282895b70430e3d6c9bcefe15c2b6b529bf1ca5c43ea4bd911ef338428a65968b39ee898cb9b61219b2edf3dc2899fc9f892bff9f536464b8f0065b922eafd333473604c59f15c34552976e6811d73a270251d9ed14143f997ae02f058b74354f3ce853b76dbddf73fd43a44618eeec549d36ab2a1b449cb7420919093b635b338d8deceea01ea52a058b5bf2985181bcbc3309d2b3661a96c809a019b8fda394bb8f36b7c0a8e2dc2dc6fc0a3a9fa8a401ef6c63870927bc9f3a5aa38e93acc73974c7cf69fce70eb89efad95a39bfbee0b45978f0ae429d1a33bf5326c5e55fa9d72671e67b4036487bdf0c81a04571eb3a477faab5f9bcdb8e34950c14dbd26f1ec96bd0b47ce75fd61ef04b73b84193d9bce3ffb0cb9045a260e5b900fea40bc426f9a328fb96513631410224a6c24d2b20527a4f26cc0af8bad1c80adc68f25fd5c7f8595ad7ef34cc6b60238f58a9a72827a4b199a47e29a8c583a2e385d55a4c332ab609006c2a46cbcff0e0991bc62ae009b8a2ce319db14da669a27f074bf0e7c4df84c46abf170ebc2d38f83610bf180394c0bd97cd7ad69abfa7d92a9d6a4251366c786d4bd390bf38f6fa6b0f3b4c4d0671d743515c0ccb15521881c72edf5a4b1eb0e658f2fe43a4b9143d2a45d9206e44cfb691db3cc21b3fb1df61a51b4a9e19e2587f0ba3d3d0edda1eea656b383ca7fb54378f031a31cf3985f573829c9ffca14616742e0a7e03b0a2d7f05eff0219eebe8adddc3de99f1407eb00a1dad1256241d7c2f931ec993c4b7b9d40df5f290e68344e4497b31dd5f7cad2f58fd222a9ae0b7e91f4ad2cd18b3db2ad739443feb3ac66c8d21ed9f3b80d610a260382ec1d5a1d84cd502d14e496e6e13651f924535badc5579d31f1cb3b413c37e5a4ae021c165e1646287aea3f90a8a208b713a9da89e6a2bee464c3dcea1820093663eef9ff6a8a2f8d780e60465041391c4149a181994de43fa1245ac23a88ee86a2465c4f56734ceaa0b3d18e749e63873195393b59a3adc24b5f3d7fffdcf633edaabb7c8e7c5ece698cebcf82040896792f1a0da46e9c0ad7e70d69f496c0bcaa8ea00d9f0fb58756fc1780052c98a86c69bc8f05e90f77bb5e43169540ce8f7d64a288e4a7e1c3dd83fd467a82a45b9ff7a925fabda8a -MD = cd26132e2c223d19d3a75ae0664f7475b478695d7824dad856c19417ea0b3794 - -Len = 25064 -Msg = df753c3c6eb6f4e34dde6ee5388b5b818196c4e7a951439e2d0d7223a2e0a4d304a5d30a4c43da8d4033e4258f3c258d1d81c88e9cbe28695ccf427564726b09c14d3e9c1e33d92b95a349dcc59142e02569139d9752da0d41b0f46198ecb8ebbd77653a0d0c5887f436835001131a4240578f5cc493c15283b8712f67d7f53fa12a302c4158c16703f57bc96c48157b16522313490b45ffcaef9f27f8b989ce146f87b9e19e7b946de719912eba9c525062b7094e42cfdec05e6791741ddc60bf4d522b1567eed6d81446ef6ef11590968f3487fcbfc5b50b0cb1b4028856bd4acc79c8073a82f4ed85e82a5474eafd8fe280d57a0a914d530166d9cb845fac5cf4e4d9dc9f9fb85341e88b0acb8161e462843bf1ab996e41466c48f6985ff69dce7ca5bf1eade8b2502f5ab57e44843d182801892a47df7ce2ad49ac4dbe63b7612776d640144db4bba4df8015992e400a556e6910026aaddd10241529e4bb4fb5ce92498c3cafff892e619119ea269842f1cbbae531d57c407c2058b639c610d35a42418b8ed63bc2b72a10129e35ebc8e560a32f3ee99012db869e7c264c9fc2b1cee6c37089116f268026861d23e2a21a754d78906e925b149e0e021114a78abd7e5fbe4b92289763acfbffcfb824da7752e0478f2c29230fb0d1d063e7ce34649ad50488b72a4255f5b6041cbb5a78e33f8325a3ebfe73b4040e6e858dbcc790696f1b8dc1bc78e6a57f1e6cf62b8248835e993472b952ebe2ee65ddce1a4b2834568dc4778842fd0380d3272f40028d679a2baa8a01c99c91993bd57290c91443b1e293a336a78256deaeb52f40ff9a335f636dfb7edfaf5a367bd440c5473cdea9a0640b6eb05ee7c4347ebed482572fd4cae58dd99c0c85edaa410162d0884d66519e78d76477fe58efeba3a492aca222e77b07ba089b5ae852867d0e69e0d70f7ca9b319cbb6e2c26662a8573781d670429533c82c45204cfa0a7c721c2cc6ccaaed81dded03dd2b214c939579be11e7649dd7ac0ff021442b35c636f05460c762d2adcbd34735bba9122d08614b9cafd4f9bc0eb985a3f56c6f2201ee40ee252cc0fd8a84683399851a3e56f610bfef1a13aa9433edef8a45205a7b1cd8b711901f3bc308501fee3dce8e2741f5c1d0bf5169e9840e4d293eb0344d840505b117572d1d68e541e15a95e42448e3ec794a1dc0b3b4d204fbe088791f2ead1e2d48d09c41ab11e09b63d60af415c0861243de789bcc205e27b20ef19820b94baeacf24fd6d9bb4643e0fbc640b076d8c533fb5948d3dfa1d53dab63616412d45cc9261085fbcbb902596be1b01feb2ab8a1de2b63d1f9162f07c79822029e015e2ad2a5f617288200578e23eb6c09c41315eeb693cf55055a9acb598200471add5460d7d038bce96461cc539a9fb6edff1793c281d3dbb6817e1d6c2968f46600d1366ebb636e3557008d3b64bedceea4303516d4e87370ca392799c0428d2ef027be3261a226b000bb39a1f2d3620f29e73c7b3513057d5d5550aaef94f9bad4e15eeb67fccca0881a384eebe53098b6c511b94c5e7923635aff655d682252d5848060787a494e16a5f20af8fd2ed175511a98c0d0b7ab04ce9e94b3c5ef3e1b9a8b5a3a228302d3e5d09cc12244028c13c0e03a71a85d673b94fd98b448c5cdabe7a155fe6304e66138ceed5c5a7223936b58614a3280b5284969b53b1531133dfbfd7216d19b78a1936625b3586a635a84c9de623e5e151e259fb2653ec816da31363970b610b12e4a2d1030263273ef71fb58c2b53db0a490693637acd3fe09f0135116f8abb88fc3eb57daac127cda9cb678707d66ae42f28de9bb4599f353a15d631081b4b64c6868a1bad352a6a46bc2e67680213680b3d474f8f2641c3eaadc16643773d2eea06b97d6813918d448e649dca4b570e73b067ff69c7aa1547458131c043035fcd2bee1389f10fbf29aeb49a8d36c85fef2ebb1be2924ab1d67990140cf3206fe682726e8161f7686c99a8fe4f48c9d4d414ab35783aa6220eb6689d680c26e7dc96f0eecccaeb2193db9c397ef5edf5d8eed2cc99054ede5698953e8fe2895005d5e434eab05d7325d108dcaac2a74b5429ac51d3a6a74f447c8067d33aca20f8cbb6a169a6c0c5a93699384123884dec61a265a673321d6efec4a9e0696be32be502e4a802a7918478a80cd0bcf365e8135f68801f81a12c7bdc9525f2d10f25be334f4478847f4df3cfaad7f38b2bfdab2deb0ef018730390228a126bac1d6cb3d271bd6ce9e76c447a92d54bc21883b5b85d8199691b8ac8512934385f8677626adc81544a5275e73375473a1ab420bf6940b67ff6033880c2d319fd6de2bc5656e02ec31858e1588492bc42f7774b14cb24ec1831b293460218220f59bac1ec414d143df6534524d8ab82fb0aea6972588ab0f6cea201a49978eaf295672ea09443d02946e9f7b8b9f059d6a77612449bd293900f6a2a18e375e35bc370392fda84f1199c859fa0a331af4a6fb2bc07ffad02788673631f9a8f998f467e97c68e80e58369aea3592ecfd1eac618fd390e7a9c24b656532509367c21a0eac1212ac83c0b20cd896eb72b801c4d212c5452bbbf09317b50c5c9fb1997553d2bbc29bb42f5748ad83dc6e538736763eff646f0f9aa6a5b028e575de074f5fe5de425dab8e6b73f0662f88d49749749ae7b55aaba9cd38deecb3bcf6f3ee5a6de5589b70c637b82aa6aa67451847f5aee60295990350f8c6c18d1d02449b6bf037cdfd09bd033de2ab16b4adf47620036511c7e192770cf0103c4009e49ebaf83c682a805d172aa0dd3a1615121f1e20caab99893c8a9ce43f89cc13ba3f700c5cf3cbdd8dbaa8eda4e036845a89168d7e98b39bebd0d22bb8396a29aec6b5b5ff3487263435df4f68cebb02b4fe31d3eaa0bc1e8692d44ce117c151a87ab0798df507653cd0f65091cd4e9808c49779758b5d1bf518cacf24ea7a9590a58ae36efcf2a18cd3157887a5974c3e246f0786203d9920aadd3de8793cfd4e8d6a780a11f1e30c86664eb21e3d283e66e106872805a0ef90341c948db090cb7a79c2cafeac32a4310e5a7b00e934f0d217fddf6c5c394a11f9f792ee7d56edb6df48148aca963c1b3824481242773db03674f6b1eb6a1977515349644c579d88c392517cf417bc8d0a35821df1f90b4769f334c2593d440866ba21b7c59cc4374d29ea9dd1be0ccfac1492e99dc244e0d60301664fbab30d60b382ae8f2c480ca79445b50a9215294749de3eefdbcec3a52bc56475e84ecd67c7d413530f134ff65bcc8c469bbde3035dd0e48f4b9338fff4e88572cffe92a17c7facb84e0b486507e6e92ee2ed4407d7cfa2241a79870ce5d291ef77a9a2395deb4267f01a3e191ffa95696e8e957c3f424256506af7f386eb5093e9384655ef819c07fd277b3d2b7259a048861f891e938acff64dd1dd5f9c89072c94c61ebca784417e1945f7b3b5fb7b76bf2757fa29433414095ef1f94b06f248a36abb4bc6c0bd7adae56f402b43a1021ff80e5e6c3530b088e358db628dfd464f7a5424471922f951a3cf593cfbbbf390d9d5cfc42769d4b1ab398d47e7d02d7f3d13d09057190366c63c8750e97052f911d4d799e287876cfdbd9864dc12051bfc1ed60b4249a10198e051cfd7692641e934fd532f33d2a1200b831f336bd60aff9dbe1fa15bda0a5fe33f218b4e7752a91dc95ad415bb385d4dd6e2b685a9368eb911333ef6b769646dd9aecdc64e1399b6c41799d44d1afca81a142b058586f19955b1dfc33e07efa4a8df6779b26c002875f048188d2d4546d61c5b9673e26f6715004d6979ca47b3331a1f10ab45289a654ea78b855a7f4f92640ede7a325248d6885091709bb6c002c8bf33418657351a9a80d33c8af4ebd6530b85a25ee06622b1afe32a6382f49e520d897d18d6211e3a9998baa3ea402b511c34f34f62e980e33406af08f4768e1ed2bb66e1ed85f998ba83088eaa7918c6079376eb1ff97986a5a30774546f5a96d57004cae389311aad3b2d347cbc261a9549321b61bc9402cb613b8dea068b21e05160bb0257502a3969317ca731dbb68eff2fc86e5d59bf6ee9513dfd64a826b906819d9014de2f25b51d4d7502c200ba5c76d89002502656e2546ad7b0390f29367056d6eb61913ac6f8912c546061e1090e350cd4029d4af549febe13c743f88933d01c0263b74045ca2f15523f42caadffc52dfaf68d14ca3ae0fbb5d92aeea9d4f1aa816b0bffd99b0f7821e6093ef152723a9cb45f7a082ef8d6bdf72cd33b5aa3c79102f43e2b74199decdd20057d0e227ae4c57945582e2e9653a9b16eeacecdbc5aaedac7e35c35cbd9adede7f83bbf36f8b0453d61416a85a17821885b3757d203fa2560a85c4b4c10 -MD = 176b0c71e213031a29f56009aac7ebec591ba24a8b162d80506b2df8f59e11a2 - -Len = 25856 -Msg = 6d7262476da95db63b322c5193ea05030923c3cbf0f8e8b17bdee2fe227c8dac47bdfa1c1a236f07ba5eaeb79d1d7a7731245848c39e93d5a1b582a97b610da00f7d6e9b06203578182a8f42771dc7a46b2f0da4399d778e4a41452d896769410ddd472ef849b9f29fbf5659eb93f474ff6c6b471a9a9cc2bfaab2f31437a87989030c3cb946025b95458b66bf2707ce3404f9992e400b5a49175261e478d22fca17452d12be189d43e3b7d0bc800a99531f3f033d34cb3f2eb0abe0c0d3f04b19427a68c859049ef1c261ffaa4704bfa4e4c6eb0e21e457b69f47d972f009b4beab3457a6c0cd48e70a115b5123fe276f7c15ba6aad5f8c2b09aeb2c0762554017cfa61739b7b816ce24f4c78bdffb9fc0fb5d9198043c5d31966d5730e4c1229da55eef6911733c972a43ae9bc0f5d92c42caee34398eaf8f4f9a8535f87d680efcc66f84ba74547e3978d6ac936fb7bc304a3909e66e2e0c5ef952712dd884ce3e7324171369f2c5db1adc48c7d7bfd35c41fe738b697d3b2ce02b9ce5711d6de2eb899aac929c0077802bfacebc56142f58ab1ba8ff01be32059cf3cfc5766072a61c89e6acb4d0a76f522d289c2ef111e4bb6cbfad5ff816c013203d4434486629595f6206d198e33ecb7a55e58eecbc7ccbe14fe2ec6b43b62aacce7bdb7845ebdca5af4f76dba365044ce7270a8977974913da3e3b9a314e4fe3f3eae0829a73f2d71ec5191b6078a92f4cdf3639ebaabf6edf1dd20777feff803e0fc809cc48587e41363cdab2e0069c078c7680715d9b7ccf102435704eb5ec1d59165063df59f5a6e1669c1331c90da7ad6fffb0f669a83aa3b696c2c40f9202653ff8e9bf93f7c0750ac1f9f45d1e9db066fa232bb68ba2471dbde7e5691c9da2c985d65f82df2e5fae0eefae2f295a3410223053ee818688ae2d48396ee63f903769a235a326310fd4b55ca5dbc88db6efea71058e4467d70c476c166d7978cbfe26e5e861678913f357d991df7678b75ac55dc7122ec6b09c9edc22f150d994a24019ce6a1d86faae88dee8a6bddb93e5456f0f26cb13b3f3b610e5a716c2b8b847a68e19b2bb225abae520cdf906fb03ed1d441883df4f860f92b4db05d476a4a0147dfcb1b6397c5084c0b1d28b4b5b1ef11c83e399e1e82dea3729d87f7cfbdc0c348fa4e88ea7fc264efeb4e9134f7d82eee584d4298e738fe30ff9342a226dc6385f06c2c052105222012aa0c1656b3b31a9c20e74ed72ec2ee9d2831cbcd80affc751e54d0f3f80f075ae3304117a829b6d45b95289ce8791640efca33fad23016510c0a333cc4b20a8aa1029e81e11729c6a5540e7d8faa0fb08f17c0f5fa6d3b4bdd5516469093926c8e8c15de8305db3ba72de8c14bde41b5b1205b0521efd42d393e6157853b08c650d58f74b97b34fa09279eb1439c1417fdeced746f3c47bdcacbfcb8cb31d2618fe5f28da9029ccd724b1895a06cf09d1a835c880bdefec43506cfb189fd5a05f4c5286f7b217b7a8aa03fb589d63d11b1ed928a1e5d5f0925f7c389e7280679267c1762586139cafa2ef95827636339693275c1cf3fd45640a5be8a0e394087ce12a9b068493e856afd2fc7a29acaddeb5bef77470ec4712e18a9fa26b86ff59490c49fd261f2738116ca4b2104dac7df70e7f2ad51972398586d22562efa8c1ffd5279bf31be5be880b02acc27fcbeeb77447c2a91b434266ef04ac7224b1418613a84564208074743cbaccc8d9689ba7af05be655856c7f611cbaa11cc95526c46409c01b393d4568011b49be12f1f280d2d7082571934c39d8b90ba4dc17f22fb84f2444bac68af53cbd6a41d6be3c92d23ab989e07034fe0b902d43ec2124a91ea0ab46f26abff563dc589d4cb83fb7d8ca200a3acce0b99f883080613c633b7e427ca848f08c6d5ebe3b5ddaa6a4f7ccd1662fe86ff7727be73ce4a43057ecc07ec1f22622986715ab3a06ea52125a9695b2815021222f87f578f61bc5a9c4cc9c9fadf3c68cea70ed7d22e38232e91f5f2d87dbaa09faabfc0d3e2fc201cb8ae4406016a50fff57cb2d382dffacab4d76fec9f1d153dacf42234448f1060ae39ecc93f987caadb28c72d1309127a909244fcffb5fa9d8db10e091cf186188bd116ace033464fc6979737453ff4be93caf45225f1db2fab7ae6fac2a00ba4d0286439a9c7386f464da59a90113c175cc600a4987d0174a4c64f61dc371b76298457f7e2c0dd89e8bf74bf99f933155a37fc6ccd9437fd0807a9e6d013303ce699645031bcb0101c71772ea9648428fa754a034bf3d93933c378e234b0d44995bc1bdafd273aa25fe83f6064efa9d2dc226c107a085fb9b69e5efc70bc823cc580d110db7cd7a131984fed52f71ea36db3f51d0e4e45ef0edcae8e1a82c476e47c466a233a31ad20160b2dea274d0b3d9e57714f222649bb22ea2fa8a0159870f2ce7f8afbb316a9c5f3ba90dcdf7aba6615b5d3407b6a39e5b4499190f00209a8db99691de68e4d4cbc1bed942082629fb2632115afc109b98f747bd1ee53fcf31070442d4674790ea6ba66f9cab2d4afa001cf1e5ddea902ce38bdef5afef965ff7cb2b65d59bb80662e835a287c6f1a810a23c6e023a64602fede45d0735d75eb172b3595be93365ce0c951e45fc064b7f4c5bbe1308017c04f5371e951b7a775e814177a038eb4fd69af6d68cd4712c74a2b49db75a4ec8892c3f0000a868f226803f884d90c70ea21bc09405581a93182db0d3963a338be71964cbf1e4871730f8145409f9afe95b175a1e588feac79374b72759af980f45450f460fd8c02da57128a37d7c8b2729142e3c2c81c7120cff3262a8c1659acc36a63a038bfc7eac71e33d50204311339ca3b829379abaab57874c2a798275a376936f740521506e82adea2beec0efa2362159f8b84c089a0320ad88ded8e8f48d3cad0b4f18ec132bee71b6ece8099d6b10e6410cc344fe8b634d6af94d3ae4010bbc7070ca9ac2f50e9b9824a4a64dc1d928ab3ce9b60278baf476d0cab59d5c66634a701ea2a36675307a9edd0fdac2e2e7df4fa5a6cb518c69576e389f4725b76b4158fb4bdf088bf80361798d6bf694ea854dde5b849e4175b3d87d4109e5659dfe2f4bde9e63b9badc75626628e457fb443f7e1e53e841e0331883e30c23d8bf29fdf5a307fd6540ace27ee23a1494e0c42c6c3760b5f3727e3430cd786778996acbe1e24360f9501cb0b74bc90eb162ae1c90eed490c1f23d376e46743aadf567a0f7e37914dbb3d4e8f3e7fc5b1849aa17d28ad7fe122a172624972822df99cb841fedd29f75317b921c00fc822f5d5f261a5590894fe0b50b3a09bda9764e3c7f414a768b2d91b9b419dcf10b60667650509528b8deddbeed97e25b57dadc629a45408c606d9d3858d2c3027f122b969e5c93c71328e9dbd5256a29b3730be7dc13183da49c1b9d852fff5764ac7568162697932395cbb4cacbeb5045aaa3704e931ab0e121d4934418d71945980c94c397e9b76f8e4df0d471abf895e56ba8f6ae8d0e9e6690c09c759270a73db8c1aa95d05980793537fbfff3472c8d2c34de4abb7e64d216cc952e798314034197d50996a2dcbf4c33485e0b68910baebf0e50ea29bacd3060372bd47b13526ec04bdc81b90dc95a8ac2743b814cc5b9ef8ca9633628bfa4248b55eb7f2d9208e114f4dac69bfe27e4722acbbbe625156c623b6ece36103bbf989205b8e82bd7a5393be8f30cc57aea5e69023de69289df98f052196d29bdda66cb6b4ecf86a3b1c198f566ea881d4390172a30d474dff034af593e5470f21cfee96668670934b0b4f24747bcaed698101d89bb3932dd46405fc966744ea22e67d23c2e3a1d52481a3327bf0b9f6e91e46467079b364c8ac3eaebb8532c94b7a97035c9cf2bc421fc42ddf65ec2add516d30e3b85e7f363c637075d7b709160cda99b61ae9953e46107b1133d815a0dae51c5807cad9c7a502e657c748461d1da67b41d60d0c739526aeb3e30433fe0b2c8d3fe0af00d7669b74c3ec4ceccb1d891ca266c39e8c7d653d2a1c07122f72c1f81dcb6180f0119ba06cbf5b89aa8d00f23a45a3b7d37f5aaaf617471ccf9233e1743088d6ac0691fd94a8fa89260c9c907beb33d5030b757caa9d5ac058fa00ddd5a89b8e65d60ce0ee318087d7ecba6c09cfda9275b25426b9f6a8a9461aa731a4ac0ff4b8007b0ecc01a3f23adde919567c3e6cb604654da6bbb744316495b183a36cb60d064abbd061cb54c930b6fcd478a5c04e623735e3650d0d85785aa1d537185eef682a8c7e0a7d2c0d85929b163dc739995c2884128b2071ccb674972bcfb93bd996690547442fe4625d1a789e4409354172d7cc9686882d71bf6205f9e5c5f95621a49aaea75a1a82279d19df13f24fb116c353f1ffaa8d1ee3b172b211a4f3ef9a5bd116bc823ac765b8f34b3608e572e859deb74f1e0d1ed3c17206cbfcd7f050fd2d31fc4ec1bc97fca97522b393013829b1490d394a1c0030684a8d340222f6072372df064bcc5eb680ff5288e4e6b6a16 -MD = 36423179904261f57bf7405853a319058065857e67a510128baf09a68c30b987 - -Len = 26648 -Msg = 3ac3e86e6d6d65ca203b850ac36fd596e8e01f214bef8e390fbd141c4a9b09cec4c21568fc454fb36c43a6f50e61810b1f77a2b8238a503d29fbb52a50fd85738a4ce0c6a01d7a1c7750f98f91ed9e6bd6ce28879599f5d6c6f26b3992ee969715ca123062dd2c2ec7cb447d53fc76dd964c7936a804c62b6d0afdf116548562eba2734d486dae11e61a506a5c744f8ae6595c6c64b30b65a6ab35fce6199bfb963ecbc65db548ec5ca7e5fcb53f729a4e5d9ad1d28f0cabf93dd9ff0a231d8b9e04e242a69d41e7afd9cadb6543273456c0fb0ef97e1026ef28b2a5885c5639895e806a2d0ee32c6917c9b0746ab58087eb47cbe26961fd0fd488936aaa8d2ee1b36ce6f9ee74e011cba823eb9a66a7684446af93394559e1a92374b8f709912d6b6f5d12273d2e305c30dbd1bd80d18234c06316d40562ee104aee782a138bf6ee5178819f863c4d3229812eba4c255b247c8f7324e93fbd6fc7a9b42bf344c3a3dade4d409732f0b55bbc0b7912cc7d7a43dab0103819d72f604e73e2f1e31cf4d1377ef0b739a24d8e356fe21aee70a0ddecd77f3c17c2b9de85be3755918948002d1d992f79e962899462ddabb1bafc126eef5b3b62087408f59c12667593082d6630224819505c1580ec520e40e5f8aa08018b7e2130c7a847155b6db8c19a218ac27347415ca3faa116298cc179fa6c6114f74d7dc31c842331fab2819c67a442d874771b979f00a0e74a6b5dfc6c21223087f09e48da662ff9d77df9abd77e367c0d1fcc88b8ee25689df33bf8b591f25d23aeab4768141674da16477653760db526867fb7578ed79f0b6e84f43d847aa4b3d0cd4930567eaaecc4958541556f8ca7f55aade2a65f967a225f796cc2620c1f9e2bd599f610a4f3d108610ae3060778b485f1c3ff6455d358f50eaa12519e4f60ee730bba7369d883ca9117e87731810b290b60618fe2ff586d3b5f3eef612b5e3dabee6c4f018423039dcf2c6d0fab426e8423948847e56af088f30ce55d9ce04106abd24e75def8da0e99768eabdca07be3735ff68c6cd6a67ece45db9a882d210ba8b516cccd4c786adf90820cfd6e79b0b78b82b77ee3b6a458b17821d98e06434edc4f0e3b65053c0840f23af7f58f7459e0d3d202db4982fa1765f9754b18340511a2440f8ca8097c4f863eb07ae6b5c02692e4df0486a11a404a2a46ac7e68361ab6753109895ba285e51f1248a5fe542566f6ffa7968822f5cdbd32f8616747c035a98824d1b9e4a9b8e504a6f5d47da5f80f490ba0bf78fc99b92379e8b7a2cbc4e8fe25a8aca985a6986ddbfec1a36def37a57acdcf861d542600753ce2ad030d3b7a5335bb5adf58413730e74c2e46f476fb3a453fb222a70cb1358470d230b8a9e5f8a16e5d8075e849edd9fe86f8afd533942f9766d139741d01e9e778196d3b255a134d1b30a6938b5afb5d134bc75b36d0b36009f4b3652e2193d10687d3f823c1b4e1fcb6934ce5be76f33e07e511ea36fb210351bce8cbdca9b5e64292e8c777acb169dce31a3f6371486df3b0fd380e2c62bbb1fd04dc7b541c7f125313fac32245c8683f06818f15e209d8d129089f71ac9bdb1dc14a46bb8d39bfbe82a2ec3e2682234e16938b8a4b7b7eef9d4332f0850a99c527fb8507907c107a3ca83b2adb00d5b9545d9ff70b2aadb360cf0fd17870b19d3fd8805fadb0ce3049f5f80beca94627c8c81284a87d2dc479967e3d0a36ec4c10c97fec6d3dc187b2706b0ce2e43d4179ba2e5bacdec5ccf37fc75cc5c2127ba2b7c9d5578cb1287e00db52441b84af6f1c39a19fb43f70d3713155307debd1fe88a743f40366bab58f92089ab5e118b2d77c810766615a23560551d3cf3ef72b26615eca0ba7e66004d6546d1a1d244bd13f216e5ef432eb158c773721d59431773f4d630d3e548546f05e43b1007c41f4caa95b03bf9f31960bf0e3d9765119658839476ff1ab2f3f284fa7e451c89c27644257bd8c4affc1cde35f61ead6ead78649fc9b899363d6c54f1e1adaaf64515614e9f421db5c7e1979341ff9caacb47fa60cf7ceb62bf3118532bc61daa25ce946991047f951b536d9e97d6ad668e6bc77ffed87b98e7e521a6a30aff15e2f6200ef79c64ce44e6d2d06e107a1255485e55be37e479560d1364edf8c9b9eb20c6c7498667d1f31069a14b596d4ebe62218aa437906467fd6ff6731bf806ccd2eafafd3ef340a46494a9a60e016c284da377374419eabc4a8a03c8f1249cf680ff428932818ac767d65204aad10b316f66b3fde9eb8cc17913f565f4b9ed06bf8616841dad20da7ec122edbc569c584bedb95e957fcaf61d7053b0a332675be311ef643cd0a35c2dc7a4d7befca01b67ab0fdfd36115e88c31975f9928ac84a02545a03c9672db096c50492f5db6d957211ff8201a0e1769da38c933072d1f5b32b1de79691fc57621adc889d431407ee2724e081503e11adcd063fd48497a88bcac659fb31aaa187a15cc5b0abfbf53519f37f7eca7f433abd6d67486b224cd35addc0c2ef40754f840cb1f5ba2c489010f5c8c0b5acf38e9b487252cd7ac7d402eb84b172c5ba00e874b53619aee64734b0210ebacb09ef9020c8bb53a803d3eb770c9163415ae3f71d37396f89b9a2acaef33181e66ca6c47cd14aa4b3e61b3c09c22969bc3c40d98ea1c765c5a8e8a177a7f2b10406fb5ee4f4c969a35af31e290d432d3f485fb64f59a8a36b9a633a91a317f22ebe3586e09cfe498046a2b96055a556d16687b5e9c9a4d0837959a0865168ee6b7c9e66f92eb3ed539171343503188d7b7e02fee3578394132c13fade18af4ac3287c23b613aefc2425a8b8317d647a447816bac56d0c99259bd9711f5fb2b13eab18e8a0b3b81ff9e98f6cda2c51c4343c0c1118720884c0aef32dd3903ac9e5ebbadb3d7698fedcc56d79bb78a71453b32c2a62ce4000ed4da85581120f3abfd1aa2418c51840d4a18c0659ca2d11aac3bd2e2ee879b3b3604112b24df9add4452fecb606fe8de965323c3e88ac6440550944012a7e451acf068beda9c0ca2d30925ba1a3138f24faa843f11cedb41d52569565fb165f2a823fe9ba8e2b38d1781c9860021feb8c463642faecb5aa4aa0ed49e1c308a9ec613453a16404a0c80712cc7b8dea4c2a322361e262cfeece291687feeb1dca67552df22b9311a91bc3bf1e7aaa3b5804a6b9ca2fe40227b1d3187742d91d6ba34471eddf831bfcd1966ab7e6c3dbb7258b3ea26cdc15fdfc883d4237f6d033a918496d469ce940f2675abe473f931292c7fb141eb1d11ab62fcb1065aafdcb80b7fd9ae647451e871dd85c2386291154443845cfcbfe23e7b00b08535e6eda300bd59b4aeaf53e97a22cb90400655b74e83d60069264c397f345538978e909c2fa1899f7efc2472add9efc71151199fa9d518b4c6ecaa0cfdfc1188f6237003d6e10bb77bc74e248b6764ef32df372ec4abdee28c7f962965ec680ee822066a94e032a50bbd3b6fa15fbd611b0d58f54d7cab32205bab2f5589db32d426be30f823a0d0d52a66c47e276bd53067d97392bbdffc290d338f3b38fd8d409e22176f1fd8d33ebb7ab38052f2a4197b333a430e1fd91d00c9b9858e2186b3e4bc5e68594d24cedcc1cd4676e4664cb410b9ccd7dd2162e2f83ec2fde9a7b4b6f7a67254603e0c0ae6623ee7b38430beec629ead8a9d910029af820cd878b9716e602b95c4975cc25322d839d2966bd810d53703ba863df4f85c314f506248a07b1be2a1ecb9578f928fb0f1e41564bc3872345eef73b04dcef55f1a040cd8c0c84a45ed4b2c72ef1ef947844a79a1b7cdda05239bfe9e5717eb7a1145c0e05eb07ba3ec6259456d63000a85884ba9773b6d37f6428f6ecd8daf00a99836f5d6de10ab23c4d825670924885a1ff3f2572bbc2b5b659e980d8ac081679dd79fc5aba9ca37d511b9787be73f96941b02f3f9477da787b4a08389c08acfa91b34b7a3c76f7d25ae781e35b89ebf672951ca3e8fad7f3b5a2eec151f7b366c8a6b0950da29883906d7d4b12934292b87754665f51956c3078993b74dd1503a9d89472d5286cd81a35f1898b97e8833edc3f50a286fb2e1354716eacc3b91a5dd360da3d0e5d1821c746636da0c4112a4f452959a1f08087bede21a2b087f20b1f7a95ec5e528dccace5a261b3be86a555ceb82ca85ea9b43f481efeac67d5dc424c6b8c20327d446b340e0edabe28d67842c6c1a52cf2c15e172b67bf4109f8c63c24c25ae731b08c9d6e1d1cac41e63f091bc39f42a3d7a4b31185f2fdd78633b487381658f13997878b35827017fc328b7fd89f88041d988597014c8387ae0f1b5d965b6d0507155a2eff12f3f241da30baa8ace65cbcc2f38783d5bb619ae4d96e83320eb4418e7d1d22d61b1cddbe6193dcce44f5dbaa66a8b2968ead6f395682a8a1234710885a2147d6d1dcf76784d41c0d8a15a3d947c13796e2b25897f961adb394069b8d58011619fe79b75b03430f72a0053cd6fc9bb9dea1b97b852cd2396d49390b24df8736a7883c462444a95e046e0dcd29effee174b10a008b579ff4d92b2887d657795088596dcc4ab1cdb1ccdc747e5b86b15762fced1031e08e88fe201b382928a00bc557547053b079aed0d38479f32b7ec2b068aad30030689ae4115945a7bbc410646c385bc9ab73 -MD = 54290349fbb1e8327a65b871f3fc2c6d3975775e48dd1d7b2c368142bcfc8c27 - -Len = 27440 -Msg = 9a9667955c84473adee8980b59ea750bd6414a4541f689b2c06a9e5c439a24c45ba259814f80cf2b6d1b65779e8476a33d7b50152935e83f195cccc5305858e2d2cd2d08b564dfc63bcfeeefff07f8f9add82ca318a002da865429de4ec3c1a1a61fcb70b6b9ded4f10c1bbba4fd63d3cf61c73735c03f4daf589feec565c8c87fa01b017906341d36dad422b6ed1efa4b1d0718a81c085f3b73153fbdc6d3210759060527d34869b342016d5d609336c815d5909a3cc3d7d3aa74175d6c4c72e35172c2e7a984800f4b8ae5c0dd294eee4f1ae533a9da7e1e07a2bfcde19984be904981e20e4f2af3fe57cf08ec480c67d5bc609aeab31cc591887f36ad241f3e1f718a3f8d112e076151765c155836d8afa549f887b8796f500e9ec056530a0b05d42527ab3355f27f5e21e5e1c195ece3bbe874094f5cc54d1d669266900fce4a589ac2f21b675d5d6717cbd7ecf1497be88437f7e28e6e8f9b1dd56542f42ff7e73037e9322cef0555a135803f12977e126768d9d8d8131e720cb0d9d082d5136831af18e06b517e0e074b6223bf7ff523d7303899005c03887b4c4ca48169a6c2e351088eee2ad07c91370701c2a8e7021db79a8dcef045c7b2d04525b992b9df8f4640a27b230486871ef73fe1bc5c9781248a1c0c78ec15f8654dbbf2f952a67cb54886dbe42013302bb847e5605dca4a9f8dae809b015c9733ebcef3467cfff4c7a9a0d6142f0dd583d47f953ef083c2522dabf3028b83d561a7c685203cd23da4ea5a335b365bbe51d351bbfe20aa2f63f17b2e559272fb18090c702f9c07a073931bbc633fe533bb3b241d48f227dafa6186f63b1f11507f9a067c1ca387655d2d4a37d151937ce9965f85c270e20b400634165c38481ebfe11d708f5938d4893f516d50754de0046b6cb917a1c40a5c67ee5461e8ffabff66b9162fc703351f51972686b2fba83443b281ed8db31e770d1a7af2341e4168b24334a5f4d0cf49eb84291b10851da0a599a7ed3d9890b97e224eb6268d26224c219398e988eb2d968040b897d384711989f1beb85ca849446c9956c534a254bcbdfbb1ac11d1f3d9f3310550cd28ce27ea290806e5ae50e762227919fbff268b7e34984755c9c43d45c5a9425c50e058241575301deaf5ed6ab3c82bcb83c140cb05f4c13b1bc849dec44d756643cf339f7eab3deba461e0ee12eb028a784d630e376e23aa0e268527f698f2d44ac241c42b52353623bb47550889a62224f17dae92ad748ceb0779862333c08fade108f9e61321e8b02cab075d4a2079d0d61513de5abcc8fa92ae6412c5e77eb45512a7759608e893dc936cd9d87779c324b3a5e31c044683f0ab2a8cf77088a746e737a182f21e14f287ec44d8b3094702dfcc699c53eece48f83e59716297cddb0d0f327fe7727b970fef65f5dd10a29822f03781b1a823c31e0a41dac5926f3d0e99f037f0cc0ff2b4dd05d5fc781d0f03791674265cc989a4f40cdaa260d594723ca34f1414192cfd1eec201828008f0bcfce1dbbf209c11266811b00eb4707bf5f12725c32e16c731ae27f3a08933fc05a272377522b93f1c76942e71a0dbe7f6c0646ce0eafdb9c39af9968001e48ac82e92f63647728c77f8cfa5fd56ee239ca47737591cba103e41a18acf8e8d257b0dbe8851134a81ff6b2e97104b39b76e19da256a17ce52d81eda10ed83a04484ac6f7e73fac3b7e93a3b724902510bd19d07b7b270ccfa47aeedf95885c0607ba720391d725076ec0260d815f096a96daa7a5eb0cc188ef35e67749f096011c66a7b589c2e83776e505938e5aaad0898cebc9ae36e438961c9c1432f9301d10b82db5d9e63df11f6806f055694f6b1f97648ecd8fbc062195da5c598971816916cbaa892d6b5defb2f2ccde753f63df63da9d4ffe931b190a66f7c589a256b2ea4b3c9f7ebca5702b90d12f64c3df5258159d3c6aaf9f06e2098e7ee20bc3709b731425c076ee2a3baaa552202307fedfdc379cbd59b96e858bc98d7af4f12d910cda22dde263a44b06f04f8fa7046d5ef91378ded991db5bb44ff93ba5077034dd369fbc482966c16e5b2c9b97fe273f32d8d7b57750d4cc4cc9ca0c652ec2ecb0cea345f06bf807a78df32b3a1cb2e8502ec22a7b1ee2401ade09d47e8eaa214b4d3660214fe3837c2fac26d98798c31bbf40252c228b1fe737bd7d364eb03b775960f525fdae9fb4e95d76bc6761365a30598ed4855ad17b7beeeed6975ca2fc9a2aec429ee1c2166210022be393abd72c154db96ed4be9e53a40fa59037bea2ba9b2dc15a04536c43ccb26e23b88958597d4a2306834e1867e8c8ed62c8f8315ebca1ea58a0bc7c339a6ecc505738a65f986e5c75eeeab05ec101f43497b67030932e04c13c640fdb811e8f92f92089e76f9fabe29df830e138a2042f2d6128d82bbd59bc61b3ece389aafd1025a9c89908c6577519e25e975493637a116221fe89372f729611ddf2bafa5ff3633b2d1c6dcca958e90e02291dbc593fcb1f2349b782cf0b63e6a8b01df7fc623b3e7e19a697e9b095e6e63e9b0630a3e402f661bc8881ae509a16c7b9871e86361a8437b9115fa8a6d0d17fd7572ed0e37261efa02f8c83e695efdc96930b87db37071fb0215265a3368a93d8999dee50d72e9b6b613ab3ac40fb9abd040c8cb3fdcf7892ae0c12147fda24a6b2c324b498230c2605d1662b0101a635c069bd45d5a3eb68a2d3d5811389d74a8ce99b961f09ebd9039ac3e941cbab06b16a4319254c2039e4f0d6735a5f56cb0d567b7ed3a7df8a43ddf370691f4f39be5746b75693be0d5cab3e72bc2449311f54ebf41cc79143ace21e48dfc63ad5ce77eda8d13e6eedf24b3504a19f5785a9291381622fa80b28f06af70d8815e2cb136173fd15d7df8e1ae2b3719929ce921e1cac0da8cdeb9f500207592c88699c73caa041e2a2ee185e6e0694da6714c47b2efe85faa8e9f74b0c002d7c3a7029df4fb7076b761f78600185722ab85f268870fe33ede0101927b168f03ed4025a9f1841b679fc7c9668c1b97351c4b8a08d0b347d491e65ed2c18c90a3bfd2417fa4ec6b5d4db0c5abdd929001634261ad12728ccd509f25ba46aaae33b5ee0483a19cc6e44bcd7ada96f5e7f42b0b27c9dea63895a4abe4cd5ce94e3069f3dd5a5a0dd489147e67572acde5a9ddf63ae397f6c1aa088d1a6086d0e72636744a6840c80ab8223409c61b733f7ef6a4199ed0ccbe96f6c3453866ea0f81b5efba31e843effe1f9ed08beb9e4c000f8542301ba095c8f9eee3994fad2ddf62d6cb5bd319dad7470f6a3d1d97a1b9832a535bcb0adddc7c507427d392d89bc7c9fc2a73b271b04316253e1407c727ec03bb867173fd3e18988558752386435f29ab325c964b258e339023815722c7b491e924a1647a6a3947859fc6e7bd7293867717f03dbda3a2f84971c81e5b1577557adadd64ebdd68bdf3822b47f485ff60ee3fd1214fc70bd4afad6ac5c69daeeedefd87edb824219c5d9424dcb20a0d395f0e71e977ec3349313aebd5fbccb59e8421237775caee43324a360e8c8b4770682844eedcafb3d67caebdc7612f461518da529a9b3e39430018f165ca6638b68801dcb9d46e07fcf07d7332ad31bac2fb8d77bf9f0aad2c5584c97b12475b7c4d1fabd2f5c39a3d2b2b8e7026709e28aaaf156ef79c946f911230a6ea9b1a2215f634b2b73d05079b3d723873686ac6a4d3ae114b70897d4145c971c9ce0f58711a09d1af26b2fcbf27c0d3fa95ab2d888fc45ef12316d5e493f684267ca57ffcff8dc8443d3e7d057efcdb4264c9bdb437da909f30a72a09914a2687137718f81b530efcdd02190cb778c6e16250f7c660736e8c05d4ca1ea22701722efeb420f1dc0e5f82a8514345d72f4e2adb8c2dae01316e3f0a36926b2f8d5e2b96c1d6279b5ed2ca8ba637ceaa6cdf0ac3bb585506a1bc28b2001330c622d195f9c2a60103690d113698589635184aaea435d50a1607dc7f86a70fb78d7a42fa72470f22c6c544f33398345139a9e772e76c323191fc658fe2abe643e7fc48c5aacf701137fc40fd0d3649641aaa5be427ceee702cf7ddf6408f458a581149940dbc8730e966577b2de306634a821e9ecfee682a2972bc3f3ab19bef6051cbc205aea3265d9c1f0a003ef9c35bd985ff5a4b4de42a0576c73bc357d7a35655ec3d0652460715fe364eaaa208c11948825155fe229128942ace2517f763776e8f2e642334786c7b6c43a69da81cb9ccc43faef75a1144aad65c673ab3533d7c073448846613f82d3899c32b25c14399319fa6d81f0ce20156810a6e9fe5211500e913f44f7c517a07bb70f906413f1456dbee0ed5f6996e27b67ef2118bbabff8d766f1751400e876134075ce2f14f4a08ed50a1360d317c6773583bcc982d34b69a21a6b7d7f0ee04ba22fe1ed5d80ab230c584bde17b4bf3dde820620e205953a65dd971b2433f2df2695e60e816ee322f48803c0efbb8e94da7b622470bd52a412998c6fa92e1a283e364f051905c5291e07cfabb39290f6a9ee6536b761004148fcb00d7623c2c1799f91539cebdd8ff96614011be072fddd4993fa1e972a8c6965a65703db89253910319c8597a8d207115563811bb0f4d51b52c12ed63e000462d3eeeaabd9ee1d56b4225b8f9399d79818457baab78631e2363e6094b726aa82dd27832b316696d1ad97973a4a41db68d1297424131c742cc2c44c69227abc3406b375b02c3925ff725eb13e295493122471f30e40420c597ce54aba0c76ca04f4f53b0126d05b5e970a41f1ad6c9f1266c180cfbb717b06b934040 -MD = 683712362407cefd2968ce6373cbd86c1a6170493c84025be740129120d327bc - -Len = 28232 -Msg = 92983501a4d7583a5201830266c37c908640b0351461314b526cfb68cad97bd7ed615248fa5756c6213bd9eae98d2f4ecfdf6a452f2e68c9687210b53c74d83575e08a7ace9b49b21056cf377c64f80669c884742e93181c426d871ca2715081733e68ffe94a39e6677aea51e8f0e1a09d258629d7374a2b2884e903c577eba32fa2713f130d2e496eceb4a0f4daf105b31bf9cef4c306de62dfbcd46e2fb283f1352fa3138c31c56d7bb48d6aca301bf3d464ca4bde521d37a78bf66340ac09011e2991b36e4941aba8727e1067a7cba4784f85a53138d0f104dbd16d54e21ea686e772b95c7fa6717e77dcb05a5dfe102e4267c963bfdfd61d36cd53105aa82a95f2afeefddada07254a10104a5a9a7d1fc6d8811def322f1b2352df1e1e90d372d1ae1afa62c6b5c47380f9e0a788347362409307d1b243252bc8d72636bfea460cd905fa1f52c3847b9632c44bb17d519f07c8c86c455c64d49704cfa81cb6382c9776a61a67788ce9b9859d4efc9fe10495e809c9d4c000a9272ec27e8e8171b84f37a65aeb1d054550b814b950e44d1952bb71ee48b8202fe11ca7c0ff9119386b0ea1e7c8fa1618c594d0939792ba66a708a9e5878cecf02b9825745630573452c43fcae457e8e87fe17ae4b8f25274fa9958b67b848d736e68e4a47ba453356c21290a297ca240e667b9b59b4c3dcab43427670ae82b4013558d57553536c221ec07af7db06da562ed360d28e8a3f03ea2be021effede08027c896ce2d2864d9ef80c2ca3d71a15b3d98f4470dab6ffeabc48e9e12fcda1fa63c68cdd250a2fcf03d49f769d5bb391d8872e0057dce5e16e214726980b6579a92d53b6ed704f2b8e64fec7dc27c6456ae90db164295c5adbf9b824ca0fd8fca71e5fe47e412230f22d991c05f6a45b0b1552089224d9b36042bb603843631ff82a1ffa5a055f8bc99f1ce7cd50f42f23aca97a6447d477a58ccf6d555e9a4016d1026d23354d789f49e8bf74bf3c4e6f0f529b4d1ad334164872a0c3b9e5098d93a5c15c497293cdbe9b07bea9c34527ce0bcfdf065c653cf633aee5dde9d8c6e2887b57ba7579ef5d8254ed994f8ff859339c7ca2e687742690ec4e430f3a4d5e190fb810bc777eb76d2b841637ab5b414895b878f817765a08ed5f71dbaa9b66d602ffe4be38f64c89f034a8f203bb16d92014e117919df10a36bbf2c5a64b8d5de9919f012ad09d875751ba2545b23a63e00473ab92659c133cc64e53b9a8420f180fb81bb9b82ad3a58dd247ddbb2c574a29b95a7657abc27410dd0c516c256832ecc86481f764fd8f2b79b028407d41c2d72a7aca0eb086812e276619f19807be9b38820028ec7358cd2914d1ecada1deaf3fa319d53addd870c5e75fc31a5c0fad80eab0b711c3b6d568dc571a3e0612147159c255bb46de8b3106bf6b3cd3ca964a05104c756d0df6a18d24438edcf1a95805600ab24027cfe15a9554700d63d7fc67ab33a7ede2836b9dc6134094f1c06c4c8f6ea05838c16f499e19447760050098ee2709a4c91e3f84b8e3d3cc970c26859cfc05fd7602335a16143a9043800f0f55711b50262995d8894fb8f255ff0f47052d73be8404c612b9ffb2f692eb60417dbc6d4e8e37f71f93b18094b2fb9f07749d4a09d74b9ff9e6165e08b2a9bcb5d353701e65cbebb074a39b3242844e5d57a6297de439397627029c45373d7cf2d2f0b43e4147dc31a8b08939694ba5bf2ad272793f702b1df94eee3a9539198f08feaa3ca54e5129bc42db48ab942d836accb58a4d62dd67d945c467610f2ac0f1e7e2780641e2ff0be501be9e105e6093ef732fa293d8da43a1cf4a0f32195f0a46cd9ee8c4fa2834118d299522a0cd32a53be7b37595fbc4cd6f5114446dbfde95fc1fd14a1f4bb152de08454dad3fc398603104aaad32d933152af4b8b049db4fde693433bacff01384d90313dc1ec333909a2a858715fd7d6126450169a37ceee5099624552b9cee121a72f7a600be013d9179a8ac1bae06d3d179a0f253500db07f8b9e96f5044cf65b098ba38c207bd7a5968684ca7759ddcb0729f2bfe106c1496904d8a2c2bab2193b224cf7772def44e5a1b998c600ef51620ee36fac6487e5d2f992bb54b1c5b38c6e1af93e71f50e0b8cb30d267699333ec23cd91ec184d34ddf6da536ccb1d871b18607f2f2895f6c99f9ae25356bbee1d66792b48838902e48c206e555f6e68fbf268a212a0cb77d6c05e22eb7c772ffde1c030a4323bb18a82846ecf8157c3ac975163572ffb4d275604fcf984ceded2b92d08c6cc6b2818008fbba2d9de80772ea32cc87e2c5f048815d74315c9e4e519451b76fa1f4fd530c7bd960e0e87a4dfe4642b356695b57e181b93d86e277e2792d27e64610e0b38b6dc72c9ecc07bd49e7249fcb1d78161952faf75c790e50b9b93a5b1384d0040e48100b18213443258c0ea79160db259147d5f93dc0761eee8c7b28aadf4fe71d812066fd76946249bb5d5579c1f8e8d1e6c6ddab3753bf802d76e96c6eb4bf21af94daaf3a8cad0eeb9d43c4cf55e263a649ff456c0bc507029a17e8d1a2fec329c9d0bdfba185ed934add12c78694bf1cdbf86cdd2291fba2712e90a6af487a965be3aa28578f7e48e29bd478ef925ca10933b1e91cd8c69388b8044c1e0ea05bb77de44f332c3983010a8a22054dc4d93e4b853e7efc004c3d2eb43093d3ed105919fceeb8de97c802a3c4717c39702bf79a874bbd6e21332b1d10f2851aa92add5274754d29119e73f1e3d598e7e72fc1cb187f4cb1b1eeceddab1086557d21a081bb7184ae5f5ce16f98cd0fdba24b3937b967c1693ae5951af308fc06d18b4f526261e3a0a9a9b78733d625873a04aa7afa83aff714ae1a4f894a7ac13ede363ee9d4eed2b90b82d3456f9e6d06f2b20f5c616cede7becad5ce5376f71d80f191b2390aa6e5d8bfde5e27cf0fa18bcc6f4f7f8ca01c8e235842c2652b061a0e056c1ccb8fb8b7eb02ee6d3be192367615543c83c03b92b0418715e9df810fe80477eea60fba2f70db66ce698541993b8bfb26e6c0bd62fe2bfbac698706e91c19562d2ea962860dd267b9dc6d381a794db4dd3a242a857972111468b4102c26be8756d9ef3a720e8251ce08fbfe30dbd511bdd26cfb609eae77dc6bd9254f745eac0a1c33ba69ff65c56973d40c72cfbc824753fdb88aea5b9072e778ced9918414a57a395ae45cf7331aa167db66c16e97184378ea7af8e3eb56601575411ac951b78842a467a3a11b501639f3835d55b09f0540f9a726e1f9157a31a11c6c98f3ceaaf22f6a601deeb846bcdd3ef01c6f5a3df87e9610c04a3e7a5fead1f37d6b4976ca44631ea84da1c7830110262d43b831f1d1de33293f2ff4e2aaf86bd138b6503d8bf83bea88aafd0f079d7c02be57a5efabd5fa6778688e7c69f6225eeca3ebbe7e80444f50426bc3493d4e373fa6fe245513f31566768b8fc061a350e7809ddf9491d46104f6a8424e86293558349f52762ea9bd99e8909f26b18b61c9daeb1356b348aa4736270e9ffea977887f2ddc877c8aca731d122d056c36fbf42147fc4d5b3da5779f5c8ab60d2b8860e51e24f18412c692b2a4abf4f832aa06d258fce0f00fcd1680dd3919483be24214e4ee5cdbde2c6917bcbe7dfc0ad6729c8287aa285b8bb4891dac4226671fcc6d167b11fa497676daceb6f8de2c1bb7be594f015a8d8bd2268256c92e298b607c277dc955e13f3c6a4f37fe2512e446d651959f0d3227efd7cfcaf6d5efdfaec09c48db8531e13a54d2b416576bcab062e00ddbc6d60a7e1b4a7b83a44666e7c8f97ed0eec806f118edadb9eb733984e2991a300de58dfd6f86dad81fb9cbdbf3a3724218f00ae124f4975157d5ab24e3e13d4448dd3cfe53098b7cbeb678dbdf3ee5979a56878b078c1385331faa20d56d09711e4981f15446efd9e7c8e877fa302b49c977e77f4f2884bdf39db0f93570e15ed4a71766f1d38a88516db520c30bc5e14cb0b50e5a3e6d741ffc5a2e92b16756327247cf9a13ddf052114966c84647f69abd6ae8c74250402e9800316b830e0f8e47adabdb9c7cba80502fda885423e219ea937ef4d8cf9a961d3d922e8a37e36e73b38c34e1c93f52a6d2dc71d9dc4c60b4a93181762dfbece88cd16a1b976a4992f3d1146856174f91dced133bf39df5c826b0fb8f0ddc9986586f9cdb8f1ca621d92b18b4a5aaed8d989cfaeeec4f5f81967da1a7e1c532633add353e91631abcfdfab03b3a82a306a06c878738d8f47d72e832353c4e3e2b9e9ad1b940e60da0bcb05980873706a99ecc47896bd35b1846912bdb9fc0233c1e38e0d0100df599afec93190e209ec2ce3cb969e7c709ee7bf8dcff6ec378111427e117715378e4421ffb5941e7c20eb95e6bad5f1c676c9d9fe4153bd0a3573af850f4075efe3d0dcad0e5c4f516da0a71ccc8145c1a1f25e6cfb189703b5acd2acefa2478fbe08d6dd23309b113a11c476b4eb9fe9872af7e0e48da1ab6a8752fa99e6b4a089b2b896dc582d43f10792fa5a5b28c591394c61e6fa0489bccbd878f553e3a9ab9729e1211b2b6ff94ab9b2a71808dd25e604f7e8a6e726143f0b2cec33fc328c7fd2c5dac3be1ebaa2e2a6816c66b9adfac8aad3da7308d8ad942064cc29c394325a4aef960dd69cd7b5ddd29d6ae28f3e3f838dded0b972db1a5c466890e52b776b7848dd412207b0d95f80f43edf35771289fffa25c1489146e67b4d591fb917aa58cedf818763f7f73474b907380570e8c511769aa6c499c0c8eac3adfaa6dbc1f167e6f68f1872b6659734f07669f06a3dac9959f24cba2f0a7a14b4fd5a88584bfc38c7c18eeabff8d0ad1e20c8be40fbb6ac872c4abb3bb2158695b03ee9166f761e1da52d26b9f8066bbcbe89a3110719f74fdd25658dcaa263799bb8c5a464bbe020c45ef04d6a23b7f0d816678567bbc2 -MD = 76e3a0221b6d29a43a0c2929baaf46ab00b85571d59ef2b3f0facb315621f4ec - -Len = 29024 -Msg = 2e523e9d8a5532127ec63b220838f11b0f8a09e9a317c1e4872d7fececc1b4b88060076ba769b068087a21684c28ecca22f3e12a8778763444e96dbab8bbb005d79e806973b2ce1cbbf8e94901075a5fc0000cafddc3b1362d6360b738d8830e3cf4f0c0759956d69c28dbecae3c0385ee99d4a12d5f38924984a20bf480f47ab64aa19735840e3db5f23f7adb31afe2b6a67f2800b4d3efa0327add741ccdf14e88d9173cdcc0fa0d3f5c1a104d261e1f0f566bdc2a4cf53b562f554112d41d0b97e168110a32b5acf57bf5d6f82fe231bca1934c296a4d21d90a9de2ccd2a3f55d01b13d742d159bfee432b49a94d6f595a8c7d519f49f5aa153dadfb08e2e14c3801b468478c2e140dffa339b1ba17283b2300162b392ef985237c128d26471b1a8cdb6a1dd6586a5b475d9648debb16c09f5576c6fcfe7a54eda0e9b64ed1310bfef143222a69314aaca315bb15eb83af3405fa0effe4aaf91eb51710d7202c60eabe9a1102c0f740a22c0e951a091d3b936a264fdc621a061930f11959b47bddd27bc556fa002af1ca4107633594421a301a7215fcf735f07f9d2e5c40fe9db748b15b607a974ac2879a86b2032d70af8c9f640dec248d4cb4721546277f00a1a007c2c9ff06e5376c8102ee0d2547802b518274247a8e7f4a285c6367a653118ae7a1f011cf78c4ebad1293be3c25207ee944053059c80cc3485a309c14f38b6bc96f7f3d6183ff77772c3f90a2a80509cf2f2d9a52b879925a954a3f3b6063c52591c3ec6d854ba267b63e1f193e925e5bba49bce5ee4a49d793fccb9a285f29a4af7aa933fb3dfef7473bd400577cdf476c062293c7f35c37ecd4cbb1c9c20b9f1eefee65545aefbe65a539f891192efabadf65ecd4093bf3f66eaa02b330ddad66a046623f06e7259806bb4259fbaffe3d31f14191008ba44736f11d833022382d482bcb09d697c534dcf2ae30a8e4ba49aa5f329d5dadc165aa4b52a8247bc7c92418f0435e53f5e2946a7cb3856fc796a4fa50479524c3c854e35290924ce4c0e0988289e2be6017c97d3e4125a39e7abe6cfb2e2b8333e5a3838ddb0e1817baea14f23c28397c5ae8b583680e12b78c5331c3cfa54b8a54329674f60c5fc90dcd38bfd87347a3027eadbc96b35f9b320fb31a9a76d04f8a7e86a86ff196813ff65e4bfd788b9cc4f7c07a6b99ccc202409b901d34d3ebfee3ee88a7625ec8c7e20047099c579218f0881d4545fcc483a245a4c653a8f837ff38964ae31b184c3cc9018b534e5b54d58f45b22c620b2c813bc93457d1fcac4cff61b8e85df83353133bf121d2213f23206440d18f1e6389f88de5b5e151f249ad7b7fd699d0f3c16936e9ac85bc0e75f5f96fc9f666df09066338f249907071bd341e52413b24045582d347cb64593a7a859d6a1a8ce5aaefd9cc919d50cd51b93c02dff6af3a9842b02c8835b2b5dd189958567de91dcc0f620f183eeb5f762bf3cbd42ca5ae09cb4f73f2373faafa7a953f039313fe090f8c7efab0f8ad3b8febd7d355a704b559a137fa52638f0efb19bff5ec95fcde4ac9aabd95e14d2e5f84c551f43bc5376855e71519b6f877248739a20cd790b85baa00d5503da5cb056f02d4aacc760c91fe1fd6efb26def817e5a9c56616023bc9e2fe662765dae2c0b2edfcbe17db140da30c466de65c49c6f81496bbbd1acd81666455f23bb243dd987d7ea1362a20faac841f1a36692cfcb4c3dbf5f6bb058c36296b8be64e9b56adc5187cacb7b58c054f422a9e6d6a61229fdc3b494da98f5a33ed1bee14b2d2f6ad1177ffe99a6bb553f7c4a6d0cb9e498ee0b63f388235d86c26c9d96e50fa7d1eb3bcb9279940c47a8510d7fb175b3279318d5fe45823baba5dbe31c33c7649fe447061db78b33baa3637b854163fe34915e931b9f3040807d9217d7b3fed62370dbe806c006b21cd5061d24490f366e4d5f23e201a7ec83ae31b46fe2108d1af56cc9d42f9117eca1cb5ab344c1fc334b9cf0d7f9739043bc3d413b3aa6e9d5067c240c52b4c5b89e25ccd8a136a002008a9273f30dec3f2c1736c04a1c7ce0087c9f25d5ec5bff2ea7ec0b0ad7c278f0ca712c9ae150e472521d958d0bd6da9ff0939725924b2ed7b410a0ce2fe3f6b0bf25884d885ec223605e318fdf6803218a9a06ce5103c62ded035087a98519b4eb180d778d7656b3d4811aaf11a128317d1acb3ca3166395c51c90a3cf164071d0d132c54b3810a8211ec7774d2288447abe7afd030375a3bed4c7cf1b28097c02e98ea36bf49e74d89fbe74ec6cc1def5cd8c8beb5b8adc3cb48c56182ad337e3b9778e4a6c4eae6d7c663469d0536560f07675e67ef1b3e14444d540af4c3a05d9940260efafc9425d55125ffdcb7c5eafdf276efe68af2efc97c92f25c2f6ebb25a9c6a0f403a198b11ab3965788841541d3cff4a5e328855ebae2e1ee5f307ec31b8a03b9e8535ae127b8078191dbb95b70311f320f28fd8b6f0e7fb13b2ecdfbfe3cdf5194f393eddffcfd5fbb12fed433641897f53a80d803dc75adacb0d156bba2dec5eec86a5ea9461efbec700b33832f86dc7ca636cede156bea98fdb15bb885a61cdd1c08baef60125c0d3e0900c75b12078eb346f468810871e95e96935eacdf5e4b35958c1810828a07c51fc469b0632212abd9d20ae7f549851ba88415e132941f5c38598c1f168ec04a7605d0f62234efd416f12a10da7a567c0eb846ea46c541d919abb255756f2218354e64f5f6460f7726d832c55d0d42c8f1b75790c5f998f46109f4794835147685248d75885f59db300f88cc290933497807b29b54380ef538fcb95536e87dab8e11b33d7f87b54a5d1f96ede4761045cc32bdd39d8b8a23c50b6aafe8914700779c3e1684c60b0ad58fc2f2375cc10514c0e20048f9f5c831be6d50053859bd694e96c83f254364bfe776a1c9c42dd1793788e9fd8b352aa39d2b0036e39b2a8bad231b57ab46a043b019c443b53ef1232116576348339144310c86239cf58e06434ed77561fa068b7113214c38dbac3905f6122238d7473c0179ac736a4f3301987dc3404d48debcb2cb818d54ec4be46c8fe2e3630a93b295d838cf56915fa53219a86179186f01fcababad115a164bdd498f4ed2b2bcce7692f3de66a35b1a9b8b4e7fed530280d51a6955770b5597e08ce00a8cb80bba2b10a549a46d6f875b3a7d43b0dfdf61c880812d8fe850effdc09ec09905c89b3cb916b718d8e214f88dfd54c9a64ecd5a46bcdc60d94f7cbd4d911702803b9c32f40dd1c9cafeebfcee955c438f97ec15d2e20bf2c79965a79c81b8ce10abe2942b543fbf2c0931efc40f00238101e5808dbb614e9877d34413364a059f6298eac5b1a802e74c11577631ea7366d5e123df0e877b3631ee1a1b7776b014a6e4bd2aedb49be10fb1be6ec4c23b255c078731a52481870fddb31d0ee4d556c0ee93c1d00c91049a39ab138f2f81a6db8033e946e1697558c9977fc13b7f4ff8dff7f42158ec3734d2a7cd5cda4fd19d73af71ba663ae756d94cab5923b3e695df6e2aaa3fb46126a43904f16bac8ee909842fc95afcc44f365c079e467b03e11582cc316af26cb9d6e9201789a1c50669398d3a66b8f68c074ffd5749de8e22aaba407f81ae3f32903f8996dc345e3dbd56f1d73175645575abf34ed7e570a1c69eef5c2beec2dcfcc4a8360d6f41d62a64c566643bf6f2a8fa534996968fa68fb7418f10bcddfe3fffe3bfc45a5619daea70b0a61294aac7c384112efbd478308c9fe2d91f78df8478a3f8a8fc864df5705a7da00326c6fb8fee6e481c2761cfa66f1b2e207bc8f1b851aa625db7bca27eeb95f915948e6be5f9278cff71a7958b1a03b6c5ce01ae46539d9a85d2ac0a9d8bbf5a51c64a404d0d06a1ae9893a9c509621a185ad2e4aa1399f77dc0665554a2c56bbda542a14f92d13031866d33dca30002210583bb6df766214c6732aa2c986dd36417beb774f051e08e217d5d564fa414e7b85b5a1669cbc1fab15731acd5803b4b0505a9438f4e5acf530a4dbd7718fb725ca3ea2dd0927f90851f145cc1c54a7c5860a045d89045fc035e2b9882225dcad7a4923b94810215cad078c4c506a9fef617c40031de4a1b19bf2070d88be3f813a37bc71c61f3916ab3876d4709ffd9c9723cfe030111367c7654cce11a3403f6ebcc59d2f9f90c4c1069deb197f515b8b831c7b7c2415416cbee340499f9f36ac3ae791d13bd8f582f469f697833bbaa33cae1b3e7827ece051630acced9d0567249b06575e62176574539d97460d3892930d661387ebb8c6ef6493e837da3a141c48513e81dcb8ed28e33675324633ce38a2e287fda13384cb306237e8c74357848818d340a9488e64a157ddc2975aba9016f6f82418ebbe878f0c388af49f95ffc2a3c2154844cdca16882d81410bec3bd23a00a5935fb8a6b8d86688e2cd53d090b8877a4a3c3fcbab2de10903d5d78e5d122dfca0fe17ab468d5e8d024b15c96a9dafda1fad38dbe7ef84943037011a2025dc93d2455ff7c0616ce1d397502cc8e987cf49065d9d4513a4ed56adfd61b3db9905a7d4062ebf1b3e31f740a78d3412cbd446d622625b50be6ef7a920f790a9efbc82188ec28b012ef7bdc5606d24afc853a9ab0bdd931d3d8393c7104e3f174d4301817e25ccb9dbadc7a42f3f132729f7e1e39e6174efbed5ab765fd827ba3e1396bd38faecaba0be854b6895a7ff4d2b701e3e80792e9edfbf354417d2f93eb8c21a63a4736d3ab47759b0e32bcece58d4c980dd28706a0c3f92819fd96acb9d042772a4e974f63a2e2d7cba46ec1a1aa063f9ba0b5bacd5bd0c7cd2a365715aed72da8ec7396f9a1a45408d51fdbceb337c0db98a36e3e6a801ba52b9afac5cee7b2fc49541035ebc4f80df056a23453e70315e3d988b999120ae82947ff92d77aed6e8cc125e1294aad211b9c7e9a301fef91a8df7207908d7ee04bc7cc447298c646de433dc3023c5a8d7e78d7c9f2e66e96103e92f0f6f95ed3baa0cba3464a25cb6661c0a51fa4e79a4372158a4245686d437d523b735f920a9d5d6276fc97f2464da3164d27893b8d8f12a0a3c843c35f68 -MD = a7c4cff2f73c911d7e3f2f82b20adb9cf2caafc9254cf5997215a11046846d0e - -Len = 29816 -Msg = e70653637bc5e388ccd8dc44e5eace36f7398f2bac993042b9bc2f4fb3b0ee7e23a96439dc01134b8c7d3a4592d24b200f689f25405d690a0bcde95ed751e227a1c54dc94c4f4f29399c6913186defd9fe53bb3db7b622915d1c271d29a8efc18ae175dc74b67f6cfbbed17620c4a0a8eb82493dbaad4321d832525551c0fe9605864439fc3e8b5af96ada3552dd47d4fe7eb3ebf049b400a396d3cef79ef8ec3b3b22aa8bef5b3c5c28ec1a55c2cda661ce5f0f02925d76e8d01050c24cc30c548877f5c9d2d8594b806febd27b186639fab773979027cdcc6973a35ad1493e77f5abe360eee8fbeffbcb71700e125cb18b21de584cf84b79e8638e683570c9cc0b263cf54b746870206874d885a2cfee080717eccdba3a17d548db948022f77c5151c833f265e9f578aebcb1e7af091bf9d0e7fd1b53e0cdb9895085bb460eaf50924ebfeaa1c6a68a0610a43d23505ee6e416303fad86c41b90b6e4eec4578c8e5298443b1247acded639598ee5eddf58ab6c2f40ae732483c4d4581f841a3c95fa6c68ee9fb42ffc870077e2dd28c7d78db1a22640f114798d748a586d9fe7edf093d30a2f54566d822ba742f3483ee9f2ac30fa4a46bc86535c21a0692db31c9ed52e97ac704ab82e8290b40f976b18422682c3b3bb45317e55c600600dcbac6af9219efd503365f2cfdb43195b77ebe5e740896598d7037627217e38885525bec953250a3c38fc38d82ff4f9dd8aea43b7115447259983a49ad925dae47a0d010b6d37bb7c8106676635d19765ca9ec45e9d2d41aab4396e7697fa2e6961ee9b8816d9f857370be64194e1db3a628ed1a38d1b3b6e50ad3d8202071c61334ff408f715a91782911f31f52caea67843d04f89271dba93687a87c3538d1217b97453b8f2b602892279fe00bbf6ef35432b2a3858cfd6a8f18b4d81e667c536b383300079076175455c6f5c959d5ec01848fc43b63a0ab5d0da9ce5c994c3b7c5896877b0847b6d83304eb2c2893b4249918d5149449ee38ecd3c9703fa51c377eec3c6a1169a9a625e61a94ba4cee25f6ca50b1ad6d959b2cef43e9c83ba82521a099554a304246c4c71ea37d45ec9e1430b1930d90440c4448e829d16441bdd75028bcf1402322963451c8e03351e577d8822933367bf4c97d00d0d9a39b7a06876511c52dcec200ba7e85918990a4a82e4ce4cce4affd32e8384f4f9df7d24592c8f4344da7bd9ad5df69ffbd3b541bae7c76290f527e0736f925a1a7f96f0b1edec4ad14407dcaf30ed68942b46c48d58b2dd63af60fccd5bdd48e560298dd981103be361b7b27be876bccbe8e55b63013ac62ec2d2aea4100dc542cc5f8137b0a41d617ab4e2774d38a48854bc8fa4a80524d974a47e6157cbda19096056354250f932d726f40d26dc27b3b5f0e7b816bbff4b0efff46af6bf8e526053933afebbd640c03470a43d094e3454acec0713055f6ed70a9928b590e9d51960c1adad8ebc727d06dfa3586820f3791624fa678b4d2919eef4035ee6f38a7cb167f81770b4b055c5c97440a0a5d86c5619f7d9f4d0641ad28e64b76bb55ad16b0d82040ac4e29299b47ebd5ae5cc7495536732e8f10724dfedb18ac5362b5fb93cb33c04f7f07aa92a29973ee9b5dafb59b33a11b7fb7d3c9b549d9c7ee76fc17af3860552c3561eb2dd95f3b87de7afb241b9142a266d1320b3b899967449ab52aaacb5df416d1fd50280225a0ae0dae97b779c52713e890238a56385bc35a0494074bda55309d519002072d84610a383c83b4f38c436c8cb492ba353a57bc8e91da7c5ace2706809403d8c3917be330a8fcfd5e3089ff8025011010919624ab9aa0d74fdd4ebff2a289f17856731b1063af9d75b23bf4030b42024aeff334e414d6d739f13c2c206210dbcc41db246fd3082fda9ffdfc9dcdd20b54a3e37fe0a6f90699a853dda24945123ff21891a79d932eed48346bb8e33d95be6c0b3809b793ffff714a46f0ce731f33e5bfe54019dd053e4963e3dcf1e12bf886cf2fc7cd140ddbda73ea8478476d587b3591d1ee426d3e2220d77250695893b2a3b9b36e15baaf42554ae5cd1e870e411e19c5616fa17d50efc921b53286004e2d58450105a0fa4782ea9d3384e6d5c5ddffa349b15c6c54253b6366d94eced7c09e152c503b3d68714c0351f7173f77f9b5e3ddb3f89baa55a0a00bca0d6fde11fd7c56a203f923a4e1b08f01a2bbe5f5df1fb3f3f08bd2159b700a916c63cf75f903066775ade7923e3d7120f3cb8e56ddaf52ddfead59d97e4be9abc63b3a710341b21d1adc42cdd4027ed1950eefa1242b30ee5d80b025dbac3f85c5669da7cea0e03f5df4b3bc25982e9ff0c66849651be4b1a796636f361962cbc466676e9db9274ad997b8e1b576f6e8b1a2a6c3f2e9d4a4676ee22a100bf9ca5dcb364a02f2edcbf835d0e2f6177e48322429b5602d8753176abaeafc0c7b2dec0578de90d6ba3f444f8a148a020b3b0cbb4f822f4f833a222a6c364c835d531995ad80b9dd03114855530ac3cf543dabe8a6aed2d84eb6322e6470941916c6410c52c5009e5eee7ed7aa4a45c7bfdc8a3ccdbfdd504073a1d7324e65264e140cc9f73fe763243342571e378283c47442180329c1300eef0bb56404324349b8d76f0945e0e4096c5d442d770c9bf8a14e0b057100f01084da5968568de8c0213b5c177b8f9965060a3f366d4678c2f01896331a1f28ebd18833bd99ca9f17e99321904545fbcdace3a8e7aeb292c9cd3c4a2aa99e430751bfc4e2629aded77e994002379673b9ad7401afafe38263b523874a93e0c6e981cb9d55355110755c9847ebc71399afa425ea0ce55bc0273468ee117da93d08ee462db4869fec88002aa9cb782fe6161d93b27de38dc49ab766df1dab3a0debf3b9e65edac9bb6615cad61fcf5de19376280b712efc0824dab7eaddb115c2194e8157d2a68115b5e9e36d673120049e3a6d45852c19135c0ad691c023eef2073b5702ae7e3873fe092ec0105208d79cf6de01386f877ea6c44d54638818063c56857750c6726e850fe78ec9869ac31627f4bef96da992ab9386a3463213773f3ca7164813a15e014ab819f153386fa04a3bef56ab0207c0f50d1ed6c673dd763a367022ea47daf9661b02065c7435b1da3e12ceac13369d655b2793c9bba177fbbe054fbef86db3ce7ad796e6d0add15455b9cff57fb787610b4e1ba05d5bcaed98564d16157ee70071fb21a6c03065552d54d8fb8a0315746802ccdecb74d57c7fe39964419709987aed1500e57614391f648832d491ce1c2be625f9a8852e44bf2db34def3e71e3003e0f8992e7348cc6794c4fe1ec27d4b158c57556f54bc2e0a5391780edd69cac6e6f956afc6cdc9cf39397348aa91a82db19c6694da4737eda8975992d9e11d9fec3d8d03e13851d740c9d4ef5c87a2afd91815206ced3043e22ccba664eef034f9ab86514cf22c27b05e683a61c501430cb2a93b9216dfb60a3a147205f80d30152b88c29064226691df785240b58d9053526c0cd52a0eec26a87d1f44673a3948a5dc7e34f5fb3ceb334c5f81bd0d3fb5e0a4bcbc91838d415e4ed5a9a440f79b01cbacc00c7e53c7442c88ad474bf73b459a72d0b307426044cfbbbd15e71415279b75bc1375502cf960f54bba0d61ec67965797f961b38d4248fa0723f635bf009400b171a6de233a2fcfe37e1c25d02fdf939bc95b87cf4000b90f3637049f720076278ed9a3b3efe33efdfb40eaef85bf4d648cbb662f2640215eb77029c06625fea4d2d847e400c2692299405852527cae78ab4afab3dc505a7b0c6a4c27c54dc1b2a56a73be561579d9c0e618007c5fdd618cd0e8654a788bee9fed14de75bee6d86f56cf4ad72395abd8f8d201edb002a79915db4d5900dd40d7c129ec60c0969f9865028f6c36e61f493f2d5e8bb747d039e07972ef2f77f81bad34596c9df98d885fb595fe9494bd7b83d21e40bcd266d3fa6adcf54e819ed57add2d839b362ca70c8f657386c60dd68c6949f306cbf1d12c579354a525bb6cf0cb718c0476045e333906b554a498c32199e88cde5bf79a3ce8a0f27c89d648d7a72d6f1ee09b139e5a80aa4657e5a80c0a01f28caa0296f2c40ab91bd577d1f7186714329d7b2f139bdc3ca4077cee13659f0f58df992d1894d990c932266f18c7296387d42c1b5ba42152b5dbe6feff52c7ca892245c774ff155ed0c86c8a015b7a4467ae343e3e1c57d3c2fcaa3e9778830b699d8cccd0aec70d76bed08a7b7d639f18531dff83ab87a913925018a580daba3e75f9a4f248f784043cdbd74ed5ea5ce3ea6fc8f4fab8bbf0c461f3ef11d5c051d511b7a276ababc16c13d9420a1a63109bb00057b1f2f1a1ba64373fd47a03eae35e6eaae0ed6af77402f81ec5f89ce7906a0e75783d336d9de14b5b71d36c51c7672fd12dc4a9ec7c309dacad8eefb0ee245c16f5a2699e9560990b8fe8e3cdaab463de063950eaad242eb26be345b2e0675101d3287b7ac96a8819d6bf51a7b4ce739a125247372e6615f9a6ff84368cba5500b8d8514a6286804bf0629c280c3cc5cdfa19761b287eb84907eb96841aa5d0d94db8d455873de96b82d9ae95db86c33e6596c6e0c3f5816a36ae61e4b3b02a5539d3eae561162c3f372a6d394835d4b7fcd01dcc2651d723da50cf9e7f64cc3c242e7c401899af90b45fc35b7cd05ffe67cf65297a1d213d9bdac7f9a5481c56b8d373afd34edb25a48097429edfcedd4d9b843de6dec9812353303e4de5836b9ac9b57ababe18c8ad93d037d7ea8819563d6451931e36b417c3f4b6a1c16a4275182ce9f670cf3f77a258824f7af57d2bbcebaca964d0a12232faa6c66637a4efc9be44afec6653abb4166b2d167dd0742003984f39ff0feaa92a59e75c5459b0e255d20cbb47ccf1d2f23a9a4788d9d871935bad242bc5172f6c162a292729616ed8dc3664d872f003d436bd947e6100b8823eecadbc8c52cda824b7571adcaa722faa556f830d514fa4a8bf85c73094fdba89345c1a2c438ac6ccb76e933932f842849065af64bbbe4ad8c7a2cb0e3b462284acbaad6d916eae5652f4fc09a207f9b20fcdc340d759af0efe74f3c39d9da2777d4ede17e481490aaf73bc14a1a83c7bfb2f29694d27b9928b82a516630922a9cea013f1e6cc7d2ff7723b22d8e2f3297c1348a7c43051ab97544ad135938a63c839b5c43d56330f517ae1fbefbd0602b90288c2e57d60 -MD = 977495dc59e74389b65ee1a7a33295014abdcf7916f9e0d1ca39a7cd395e6c41 - -Len = 30608 -Msg = aa2a95be717ddf5d676aeb0065f400e68855c23034f057805887c9c6f3aeab57d77f0040ad9058d939223c9ddf9bcc386637a7e2fdfa0bec7be93e98eb792c2e4848514c850bd97ed0c7060e1845d31ecdc0d7f3e7e06b9429ec0f94a73b0a2c86eb518d03d6aa73b6c211fe18d85bbe4458190cfa8abfa1e9f806612eda8e7818d2c8a82ed913e173792513e83ead40536736d53fe04f3a4475e9a88840003b86637e480efd5cf08d560af58f5d11cd8255f7f5bdcb6288c1cb8110be53a89c59083a13ac28ccc78ec0874d151fce8d5a8a21157c3142b3e8629642d7fdcdc41828c6b10f43ac8ffe1f66c3836a2ea7626e7fdc85fc35e241a2f0e5db24b9da4b2ae8cb3f37446f63da6dfee02877432269d8f3df12843d55f456a2d3b2b2077a78690945eadc90475b65a73440f28b23e4f301925d77edabbe9121c68e01732e7910122846bc1a31091565889ae7a5ec4599afa7c3551acb696a09bca0ee45ee95a78ff0322c34aa4c47e1e31e9eb906f692a5252e68eb3e5ea603bdd0c0a64334f427a6957306398cc1c34db45ef0f75da68a1485f6898b0410b6d206c1bdb4bec1835159dab966314cb2ce44717149e49d077db0481c3ac26fcb022a37b3c99bd44af965a975b9a3b0566fb61d6583f23ec36796a6cbd4028ae956246baf0a34f525a6a12861bb4bb55837f2abf42eee5267da2157bee02b2ab9d4dca5da00efeebc61f59ea6f38f23602fe06345d142a19ade38a51ee6a517e2863b2d5b323586b63149556be9d8c1155d698c81f455f3057cc3d6136ed7190d74274a5b286f84bc1f8593d9268f5820cb736fcf208f104fbbab33c4012bf8e2a58945026b03b1753291a118311ab02881e75558db58c021a4d6045a26087b08214a6677825bd58a7255c74f92e391d685ae8444b018ca233d2d91fc66d66c28f050f5e3f5ddb8a2e7ba4ca7d250c3d2e1ae45ba2437f7fc909821d348fe91e91b853a6d4df321669aa67a4778cb0dc39dd1dfe2c11d0f55a500fe0754e6b2f4a8d07d3e1104d97d920297570cbb3952bffe9ce50e33dad5824b6ebf12f799f0a218057dc977a991d7b7ec0117880d26511dc2eb93df1f253163ba230b990d860e471b53feb6574772acc16b209952e85a159a1bd98aa8ecba2e2a5cc635d55ef64407e83628ab496ac85ebdaf58cf3fe3d06c9e679d3bd323960592cb31ba1f61f71163fc356f3fc7f50a204c2c4ed4f335809cc57ea182768295eca3f78472584881edd54569d0921a0ebc807d954e922c1d3c7c97a2a0bbd92093d5edfbfee21f9ead4bc062a5d21eb2b8d2b46e56c89d8ca6134f05d5f885efafe97de66c0764b1cce50f23668feb3e3ccb379f949e701603120d94cb376d4a67680e0f63cfff02712c9871bad168fa72f16ff0af1b8d017b023b15277f7978e3d9073c8c43d8d9c5a6c41749a17d2e80cfc42b5048dd95356a405194d991c34cc4d2368f6ad87ef0ddfbdbbc0612218eea9f161e2b461c5ad28410b84b9d71cab1d6c5134de5381959a687bb090f1cc5cc667bc2cfb1dc11c26f193be085cb84297bb0c0f2e85168a02be1edb15c674cfc8320e339071e83c36936c69d3119a3b329c13f63ca0f063cf4b2fb06e24a4c025ccd2a732e2ad75cda2d018c8aa34ed848be38a871bb1bb567c18c10870ded675b4c3e84104836162ac793b476b0ae1f407052c7c79cce91eed849d834f756b2e664c97494c0c878c1cc251dde8aeb107a9f36cab3fc485af0bdda65d251b06b67dc704ba1d9b40a07045ed0ab772c335c138cb81c21b197d539e6bf4763221a457ddd1221dd23546537e7d4c3c099114f93fb9aec5430d1041415ef7d75d548e80fb8d1fb123cdf412c673110ad5b31bce92b770added8fe71611fc5acff17cb85aa88e17c1283204ac87f079859a1b09dbc5575e041159e5077feec8b99d3f1d2556535d310ed5177fef18e5927d58a0327143d011c4b766ae0aceae7a01187f3a6a27b5ac1751e06d46b13e1a2d6fe7b5d641484b2d32d2d458a3f35b468f465f8b1307786b2dc93e34c46b66d2e8482e9d5caefc75519241117581a4942cda5d611d3bde31f139b9635754be934c29636d99ea6ac39d0cbdde4c3f9d1278a3fb95503926922698a77875e1699822f41eef02e4dd409da9106731158de9fa0a03cfb1e998b5534dd01e23fab10af21025cb9e859f14d9d101532bebbe403a753bb64a337cc300c2fcfb6b87dc1145e540a875b3f766d9ed5a4a43a97640c14d6df3220019e3b55ef3b7547033d4a1db392e90572c5e2663e1f68038fe1116fb5f2e4136b83efb897cfbe69dfe7c915ad706f65a8726479d5ffcea7e9edac2e5da0eb0bfa1fb59ab616f2af685309acae1d8afa250e3c4019b0789649dc44b75a53b76811c43582c68ba27640f194693204bc419cfc026f95fbd66d245f63b128a5e9b66713e7e755a84e6cde65e1c1d5c083ca64be3f3ec71c688b1dc9819234f1f2855e71356ecfe776d1b5029a4d15cb71f300e74b6429acbf7e7abd46e12bd252435c7eb65fa1e39c634969f6715eaff76a15e9cf462a274bc5efad0c1469c1997f059ed35078072f90200eaec52cc8848e0848237b65168defc11b49a27b4a2896de5424d7cedcb0c6bd532bbf1cbfb9dd5c85006a56f5065ab37a9811dcc690394b31135bf2deb09595f9e5d58af007d68712bea97c3d35a52b5d7ff90ae150c4d0b83763a087cf7b3e45759f1403ef181c93d6af4169ac4d9d3659be8204fad8034c097544623df61ad853723465e000816ae0e25304cab27d97bde8debbfed1577ef2074ae8ac84a024e80558807b3e5a1a65e90d99217260f434fe8d70cd4f41c3899040a59ba582addbbf1cfe21100b24ce39ed91411bdbde2765fabdf6a066bc48b6b2038be726f58705ee397224190c824b7f779a0d42a83db5b31dfb831abbb7e11b8cdda8017e828048ccdee918543a944fc6acd549f4c07452fb5c55e2645f85e9cc3186b6bb4694b922c7ed6d7e5fbabb18e9f23646581836e089976228883ba93c08019b3e5be9bbc5ed9facfd5a156db8e1e2ac1f7d17fb6813d5fe8afa68d646c197337a2ac5cd30807e3b53c23ab45115251fe2a809fcec8b803c0e0ea3fd871eb613e14bdf6a0d5117bd1410a14b6c044816225154d80841248f143d538b774fecc126278d1e86afea86a0dddf8f543fba0361118f0925d5418c502f1e0c9205b9af9b565557672d654cac724bfcb417f97c21511efcdfd855a8242c6a0d51a09b53c350deb1193a166379868d00062d94f4e5a89b4f909adf6712edadea50d10032309f7f9807568c6faa82f955c4f10af220808a6de2cd4d3daebb803ff9f796ef55aabe98cc1335c5b1e0475a7b02c9e8646142d430c03db05a4e578ac784bddfc4fb221fd1f0810a1226cd8a82c3606c13c37b1f25142f5397feaa474418e377e11930b9b36f1ca16def126286c35ce1c13f89ab1a49709c0a450ee1ea24a66c4c7d60d2daff57200771ac8ef1831dedff3df5149ad0c00e03c9fc074428851169a04917d311cf0a8186f24c5d7321e5203753c8213a8c0e26f5d813cca50e0bbb2a4fe51656f2c56e779a372514176bc6c41c4237e73320e6414983fe1a8fbfd363ebc72f3f50e520cbfadbd2f65ce6755cc51f698763eab444b6f45309a8a224f5b33a882b77fe3b0caab6f19a70e99e79c4cc106b8cd03368b6d165f2d75732482cbbababb6552fb200350b60d1e9b4a3b1b4d7341c55c635bfa791569a438de3bec72450baae8144b1f28afa2e6b5a5312862851a10fff3437e37fa5700b9a40efe96c8af34ea24d365bfab6b4e2e2004dac7e44a94340dcb6118b7fe6f3d9f8469efeeadeda3523e3fdd53723f50e53e984639d93b42d97c0ce4f467da0ef62495455c0fbb5ac71614494fbe9f611966cca52cd0eb7380dde56358982a72d276ea60bddd8856aae24ccc465758aae705ddad64368e0d2a77555d8c9b45b25b03d107b71d3be0242b4f2ee146507375a233268a130b59fed0c59938781516b852b004f2d9bc405d788437c7927104ebc536d845704a9f25729be0033581e512ecf01d1718f3be7c5155aea043a1a472f74e8b3e543327c7e541fa95dc70699057fa1bcee3c8a2aa3e295d1662ca9c32bee3061dc7ae380aaf1daf9774cce85b1d35c5be4123330ec8690acff5d33552a55d1289d1a31b195a99c7b1067cab9ac508e5903aecbad1767b7e7307a4b4fa3124772a7bfa191a6e1b098a9968fa76d8dd41ecd60b7f1ad1c881ab9d256454eca0fda9cc9b7836710d3ecb35781d17dd1ba3781e68ca1260b8db1fc13e8c855d396baecd6e8094edd62e1be2945ba45c29d1df19ebe3e0abb453767ad773b80c588be0845c7b5d69dea123a9a4fd46de7193c7cf7d11ae3a22b258d1d86213826323e8fb4bafb86e8d5f8b91904b24ea5ab3d949049ea1966bc06fcc29a1be46c4fc6d3a2465ce834b2ffaa3408d67084cf7bc8e69d0e346f8456076b278e2e0e1de1847d0e5c63080db18e69c0b36c0af2918a695f09cd23009d6d45c2fa7d92491912c3677c9fd94298e628d0dba9bec0f979a6f45f3c37ad377f00d0d34b8f4dc7ff13d63ff73efe2041ff9da1a206972df71de19119f406debd1ae5bb205b8888b9ccff08f19f9ce2126cabb7fd88f199833ccb21ef1e99ddb7f28624849da5d5c37d368a2771bb48e7ee6f81149c6ce6be92059413edd2cef0361671f0ac1239bc930115f16bb5df32f37d9f7fd7757ff9ac256a21083e2ce6443b55ed3d5a2ef5bd034ef7d4392f642a3a55a7c087dfe4e99f16aee458621aab5932e297ea201f49a187934191942be14a6614ce3080d0d8f72c1618ae28fdd9e48b79624ea789c760726c4a7ba7dab712235f76ec0d6e08b20cef0bbbcc106e81d20a12f43fd5b4c471eb4533f5011a262fd05136d01ce7645ba233edd5e2d7a5a92d30775383a0421888c876e62f98eaee2fc39d636e03627ac827c0d0f583c4734b21448d04087dd8cd5aa115c6a1f4e0c6647c41c1db40ecd96dd137c91162b2fc8bf846e76bbc3541624eee56d3c89a2caa7ff5b8dd84445e6cab94cdff050aa9d6ef0b9e2891b05d75ccea609cda8cdb1c04f9c388b103bfaa9c5284bb2fcceb78a555a8ed92ccaa1bc784646bbf3b4a2fa7c8727b3b9d75be300b7db4478c3a07c7bf882943fc9faabb66e2cecb28025bd4dc36139884390e132a2998e0cb0e0ab2a3cc5a09c2a6d914ec6c4492d58c2718bf9ee06c5a4210a23908d79ffbdfd7e2acd5ee78b167fd709f515baac65027efed0d701b82597c59a2abeeb9b14815f4255585054b5bae3afa4272876ce6c4d6ef12311a8eb797c611834cd26daf4b53c79b8c23e2ea51e -MD = 6a5f09b3e0a8ae5d795f2dbed00ee521aed5b0875d2e487a82b2c687b527c278 - -Len = 31400 -Msg = d7a5688c0c385edcc1604930cc73ba22678cec50ccd3fabc02ff5073f6195f6dcd8296b579378dc98a54834447d70abafea701e498d5c3fd70219e6b66c087a22f5c0b46ef5d898f09679ff23523e2fed443d28481c00dfae966c221dc9369e6a43cb1869530baf6e5a18582bee0a9b492684777af1e3f7c13d7a4dd811b6e01d4296fbf943a89c6c70a1d3c0995c6a5df1e48074976c34b967b2de77cdffeba682b2d3713035cc656ab50673fcaa399646ebd7a7751002f1b5b4386f66782da084ad3383b119cbf3b8b044d8708a758c95f8e1963365ef04a7dcf04173c602a5b8f4a0833eeb27a1db222340ad53aa9b5faa32c32ad4555caebbaa706e5026f0a0178ef242204bca5299365f0bcc455d046e4fb0f3e1d2844adeab8eceace74bca846373633fc507bf73d286042ad25c34b3acd20724e2f5fc9497ef0d42e001a8d9c2690ab01fd46240ac582f15ede36118bec8dd04033c449be433b2a89daccb763065b127a8aaeb9e1837f503d4bd0a1c19e7fe15cfb1a34304df47447cb792e811dbeeed1c05dbda9ab7fe7b3333a02c22c1e2b08510a9389e6443bcf9bc9fbe0b4e2c96d67f8384c85a93f295d1c3c78de9138adfb3c6db05453058b1266256612ef2ab6472a33b15926df05921c58c9fb0190b4c257ca8ddf485de2f7f5b4fd810c9a142798b4c06f1e4fb09ae55d9fcd95b9836e04b308d14cc83c1421b18c4761a0efd0edc6610eb818933d1d53e19a763d84c7ea2e097086d0012f8f23fbad17c4af0bcf6e7c801cc115436d4277abcba41e94b24678061ffc9a11ea1232fb568ebc9ee7b6f90b73d29d737c334848bd74b89f03003dd93ed46d82d887187945877f51dca5c0f8e5d49596f32d3eb87437bcae866640310ce1e34a0188976f0d365eee5643ba8f994e6474793940451774918ae27f6a58b1aa65300f209624d523c23bff99cd17b8c872d5b75e3735ceb49ffbc053a19554b859fda754fee1c6d714027caee2da69ca278154a409d1c37e4ec9c8ebce2f1d912879732eb5ee08d9ba09788be21ed5ddeb3ff9139f611b5a06bba14eda6f35bf3b6c1bb5a493c2b11e199936b32c238826d94eb4e12d01d02f9af484ab9dc4caf99e47f1b3181de8a6f987b93f4c7c544015fa8eb77c9b69312e68962b01f138c9d79eebcbc44005bc73eb1c6cc508c8a1bca6a90a9811ac743fa68b40e2e59315dec8aad2e05390c74d6d6524e1ee6cb196f90ec0c78c226195556bd48ac862447c6e36b2b480122f50b49e4ee657c8d96a9cc4c35234515ef71e3fce3fc12ebe7938985188ed125b4469ced21d6a657f0236d3f98130c3d42fa90e164af87eea9dcdd799a4c218b5f133fe98ce50ca0d2470444c9ba9002c039de094f396da32afd6fb704f28aca41ebb358741307fe999f21ea3eac68ecc3ca3bd3081c3cafd79fa0dc0d347579095a97b89bd330d7d286369e5b4b0f71ea262aed23ea6d7b4c1e214707646a0e11ca4d8858c81fb2f9b6c2efc428ec388fc83ba62706888bd50351868814d10007c545564f441d169b9b474cfdc89787414adeac860306681ee9c22903c862d537d62f90c3e9c189249e44346c9c9a049b08945ec5627f86862bf38d0ee178243e676cd66b1b9571114a3a3495375c26f99bed3b69975c6db76456510e02894398137d75a97c11650e29a9dc0c0b5674e97f59c0f73415840f0d7ae385be2ed9b144e21d136dbddb67a70389359b3164e71d6a9dd2ab33700991c1d30a56c14d26862b3b1d83035aba6ce7dab669457d7f108010a07f5ea8439bdb9e006ef9147451c93e4c3e7a5972c5c72ee2f83b251dd34ac7c522cf93398618a30c893ed617224cb503f29b6e3d5c12145fba6b024fe01b31d5383ed747db19909327faf87b92163df961eeef569a692981425d8b81c181dd352204cb1b254ed518bdc5f23e0bc61780eedd836b0b2ccd0c029b375ff20f288962ba151fdf38ef21cd1859cb09ccf02f1bff90e728ed7d348dac7c46ec23a2368cd71bc273685d22d87aa5af169b46785bbdbe676e1bb8bf45f9f0b32a6fe8c102d4659f8c4d9db052655c56bcd198e130a0524855480df0be1c0b3137346abd675a792374692f3eed50f45e56e055fe2d3ff32678f2fb6d787b425d9d2186801ca1dceae63b9042ebc5f4229f480c23c3f5276e439d0fa9e7a02c84c6a7eabdb562f7623c455f50e04cd24fd08939f6776855ac3fa6992a9e1320334e47f5caa4165f05f116eaed6d5e1532a5244deac9f2044ce7c046640e5cc4058e72363b7b347a52af10d17ce56243778799d6753e2ab9ecb64a85eaaae59e6811c73a84ad35efd4b0c38183eb01d38ae26a622a468afcf835d5e623163615d772a7613abc931618c0bfa996d0a55bf960066f8e759b43fbe0d2d5a1b2c6a0c02bb358d21be4837b3965882a48d5232f6b0e5cf63dd4056441c1d2eb132fe5dea74b6fcf5da2ce889545cbb2b619efb97dd2b91611add7cdc3336c63b9da4b7f6ff034a704464ddd6ee0d2c4aadc18041304124293b121950fa810a0195e582f004245dd725787d620b73be4999412bbb502e7203666795661805e34a4147279e2a1f1f75a4f12ff45497576f4fa863cfe7fa6137c46558e736ca3760c9540cc81afe7691ea565d567180e005f47d8f439aaedb0c7c93ca9afbd9f08956949a387cc94c721e2f6e4e09364253b34919e01350c7cbb67a54491039f40e108e39b5f78688616905caa5c4c263a1b293686efaeb0cbd9ca05cba1cf22d371eca5206333f12a6f35ed9234c2b2d3719e3e4b5f6849427538f4cb6c80d814ba8d04bf4d9fbd289e3c5028f4679875c11c1f57cb025465406cf8a05bc91da94d8298e4791c3b05261bfb0b25db5585ac2b6038dd0d50a8bdbe6806f9f861f58d45c81c7029e944897d6485537e68a77534976aefd9dc813fa5e94bc19f538e0c4f18e3bd59466b4ab91333e7c1404fcec03b6a8df8368358cbf30b3d4e50c74d1701c6db1ad0edec578d936d547ae31b76b2b431f92d339b98fbb1e755e855b236292233ff2740e0e14a204ea88705dd9093e4665cfef67a8589dc3a7688adfe14f5a26276a808cadecf77262de32c97d65557b5844a50682a13d6a100c044633bddb3e101d1b9fcb893e46e552dcbec908daa8a1f8de606ef305dd5851d9d942367d32a2142b919071e1491deb5682e5793396e8f380bb95d55ce32840f2e03641a8cc865699a8232e4643afb1885dfa40ca0dd43e74601fcfaa4328df37a33767c4d264eb4e2dad48d7fc46ac5b9930e605d50de0a397336958c6ff3890696b2e390de3dc31675545fa3b88e5b57daef24eb53ce1f4a8f92ccc345553e67cfd217045ac3029a044af19ca1d6380509dec0c76094a4eda9a9f6f55d4361f2213c5cf4267ef201ea10d9b6fae2ea25b245ca6e01b229b763e4ba9f022eb25a4d6a4bfcbbb22fd2b95e8e8f3e34f05e66ccb86bb1b71c2c40cb6e3cfe77ade4a6d45a9aa50d0a80d48c7681d63cd8f389dc113cfb03fab0c2d6a83b8cce9345b0030f3a5cf01080ce13283b7d7b02a9bdec4b5e483953e96c9eff37478420e21b9ee0785e0bd077289b1a187e601bd55575ed4c13b7a63a907cb99cb958d53e2be064b112a0d8c8567cd2a5739c72faf3116d82f81f7028f0f88df84c8d0ede73700291356f8808fa40d86ed770a6af194742af6fd13038e0aad2c69bb15c3784d6508510b87c9d667fa1d1149d25563a70130de56d64eef20c3e7401663bddc27bb4f95f2c150a3d91a578d5728d84d934453af3548cbfa78517ad280c3c35def8d68a5b3aefd3d21f89d284813dbf67fc6fb30417263f63bdf4ce7a23bbd41ca60ba49f556b9ee691955a9c59c46a7940d912a235bfc2d90f6c54724d693d1e2bead4b60c26afcd607e9d975ca01a8faa37b65820b7fe5a01d4db9ad992e555f2ea9729df9f9b09249bf8001a5f541d81023a9078bd56792dc4c06e58e74156939168554034f52c5674166103508ba56daefbe5ae2e4fb8fbb2af676bc4e5826655c4d2ce9522a96e9d5524b83235a9e8b496b221896e8bf434f51052ba468c13de392ceb2ec7f2e58e50d59962f6ad5aa98790736d27849fb24df3de45f8b6046141be266049bb53cd860e476123226c044b1b3437ff1566b0f68c3ee650a2c0a55b20f0e82c4521b1610912cb6fab754b5d8cb47879c0d1c79b34251a02d4c100f1dfdb04d432d7f07e80abf010ab0ee52b9fa4bd1c19795cb896016f73be8e0ab2555574f606fef13aff737dda93a17851be65545a81b5e6bb2c544517e2a038f92bf086f6240f4a22cff9d31217d55b6c53770cb98c200c3f61ae3983c3800252ce2cd9593c7151c28cbf8e5b8a0334b8096a14bdbb402391d07fcb3be3a5fd4bb67ada9392ddae96b0350e0b7cb36ad14abf2adb718ec37ee33958a4c59a90306f5b1949d99cb71bd4ead0c6628e844491d6ad9751647243247b9052dbc651cd635df3c0734711ce65418500cdcd078e79411b85cd89a68b1ea6d0cab8d1b86f3cf418abe265353adbe9894f21276b2b5baf030b6836d6b33c5bb870cf153a9256adf660c96f97cdc3436c061f063587c340e2ac94249948080aa5e991296ed34aebfb937acec01395df9bd9f9e1ed404ad748fdf3bb44d5fc242799a186bbae745eb698892b3488de2e971f4452f8c15cb28453e9638fe9a338cc0572b5b7807d46b60476dd6bb9f6a0ec5aa0d1fea773634362e7c5d0df77c8f1c1771ed8f5c064584bc68dec0399e71a1081d7554f1979f48f915aae33f4554732415a967ae8083bf2fa852c1212619ee559eb9344d967265e688a7e83935e1afc43d1768c5ed2df8e758ba2520a90e92dab774f151dab4743cfedc84aff540b64012c0fb69f349172d9e9f54fed05977df912df3c60c6d5d449ed220672d7972e0bb2b86613ae10349a287b683420183ab536ca273d3a608469110222b8492c9eb60e073766bfca6838dfdb377a70ea08826b96622d8665d89fe1ef4c1a295a5ab2b6828702ea3e7228786b3a1a989b5bc329da799c3b544570e85fcf13089ed66424a0f172addae70b7ac1ecaee79aa909e9fcda13b9ba5f6e8cca485d6778965cd0e8e3208b2e3b346f65cba1ee6674c93484002e82168afb67b53433b6660f0f53d0f8b6f2a6f345cecd539e2d8d338381e6884734e75ca9d1b70f5085e5c4ee15ef9e8084e383b1f17f10fe258d89cb6abaeef842bb48fc7336561e46864c9bbf9b4127b252710bafe1903c56d5dbf3477780ac2be0d465c4b9950788a61a7a896a8d16fb724fa532ab3df33204beadb082f9ed611693683eb74896cce3931d2be3dec8d0d184213212969d6788865d3e83c73672caea8659c5ed6673cd5af61f8db2d7c2ee931216de16a537dfd78439f05511e15c6e42ae5bffd11db1d697dcdea5ae422810da69545a95537926b53b3f400a3d69732f94fffc713b3f9a64cc4d23c6ff2c61ec922bbf082af30852dae70479d770bdafa6186fc15cc52b0f9 -MD = 5ba431851b1e2be373d818c3c6884e53d82273219c3f1c36c9aae099fa6690e1 - -Len = 32192 -Msg = d2967ddf69ef62a9e23c9118dfaa55df92b4116322f1c9275131e3875dc92faa232b26b28aba6f351fdca8f1fd5062bbf0c26db9da9c57d155202f6199b48e31a17cd9a6892ec0383b220a254aa995671ea098e452452ce65a490bca692697fc91b21e232df45c987c37411d8e5ef5cc64771a4d5393514ca9d4ff2a93c751f33ef47d913db44b3f2b43d54091168ad0096f795ba42ecded8aea93eae040c4ffef6b7f58821596138f6d4cf51a7a5d5c57af3f750fbfa8af44b350701839f806eb3fabe0c4c044fef2de30a6f33275599460f3055aeeea7c2156bd250359f6f17b978991ca5d5de79abe08bae2e5dbad09a91e724e629c3b67fb63716849c5a9e79ba2d45e93eab5d0345d99b03b9542feb34724b3c4c6d45fccc8bd11b16d1577757d0f460af152dc68b6ab25deadfebba5f68351bb6e2e51ee766fc437f71c734aa3ac4b6b7da506839b5708732acb87a8b4f7eff09e33858cf5f14a866aa822459a11355e939696ad940823a51590ace407e8570a5dca42cccba96b44cea0cd8beca8cc8a3d0dd30d2a233c19753570807abe4fb2b4dbd2d68201ee1a2bebbc4720d7d89882f207cce4111c7a52a11ca592e1a090a94f7bd3a25f9daf8a73379fbf08202f6b2d78114b3a8b6eb5bef77ad9b9124b470c86ebb12d3eacf21f86bb50a26df8fea76e05e506509da5734b28d6af6c8c93fb3b4539d29ab86cd7f0c45b0d879b454633d03dde35b12aa85ed6112978fa9704e10ac1b6797cff83bee269b036bf48f30e99d828004f4c457aad1390fc3e5a10c161d241a39fb30c393c01f5420c0e974688404d7a211433e5d5634dc1ffe4052473f3dbdfca9058a6fbab43722c9f1824c7fcb66bcf8958e77589c68fe63ecd5068acecf6a59f505046ef038fc40360f07b94ca9b01b39dcab50e652d9b6f4e8e6785dcb1d7e7dc7e46569b617f4255f2cf90f0d15e9bead4be799165c57f7225980713d60970e577236774b00265e171e97992d78e48284fb852b1fd0c771f5f24b9fa2de243518404abf644f874ebb7f1d717733ac23d81cb222fbe1a5e3f823323f7800b670aed11a889e507755a0a1030e76e0a1213b31d6f7270943cb9d7ecce73952be4f6fa74e8965ad77218b36d0e6a8fa53f912cd9c4e2db251975a67841d735ebc3fff352f3836c11720cf932f808a0b4519e3625a6e7c673fe5b37ff048928f30b0c1fd64fbae35d7e1e2684772967de512417299fe9fb26f253d1a8a0f336eac404c72586a187629d36818d1235aecc460a180f365040e7fe45bd9b9c7b2779f7d1336a20a21fc9d73c517551943b25383881fcf4845e5e29194401808bc247ab5aabcba32475393418df64bcaed69230959a1a5fed1d327bb7ac02d58ad0fde8877770998f4f5bbdb37381dceb49bb340baa9101f4440bfc073dc522e01942b640de82894a76d779f354f438b45b474f81fb8962ff9d93b5f24173eff465bf1e6d2929fcbfb25471c1cce6586fd3df86e0d3290878ee6fad5efe33c5307c1b27f6a18c7955ca7aab06217fc5867a2ae30e7b997dc5004aec35bd2e2afb26ffdac38bd4887488f331a89ce6065f18d16df43b0249509bca7b5dc68ba9bd2a133dbd3228b184b2640b918544a364757b2c7a5a8cf27f869761c06173c7df51fe5bcaddb17ded11783fa724c025fb58d12989225e02bc8b5aa644d60e0ec7636939d3d39773186dd5d7d4c083138e8a7a6b07d9a1016e70bb53d36c8305de28fbe1c15d011c6b8e23dafea3b4f584d41ffadec87c75fcfe616f546dfb348c675d5a7ac317fe4f3b0b510f137c5445fc68dff43718e8d0fdf502ae1f9d243aea36ace84d03a32d3e3443ee5903b639cafc21336e9ce151351e15cbcb925c4e772fe0f243ea936b5d48b883bd70a6c80884c881b431e9e76e85ae92b8016432d7f0fc7fecf7547361ecb9b686eba95a7ca7ddc853ff87fa6fd2d8eb3013c54cd2200b79914f70ab11ca4c6ffe9e4957ef0e67ef912d43f201ac98be79f006062f6712c77a1d6f7d378a7c966baf0d272a616edeb7e4a538ecbbf8f3dcbfafc7b86f1b51ef87d75099d44e1316467d32f247fb7d0c4b3632f8a8ff73a1a949f633dd2dff38b5328b014eccce478c22e0126814b4da8b7d49ec1bb52410d55bfd695c51b99cd0079835a3fdb046a8839a506dc46b67cb02e592bb23ef716b6d4322928e676400dfdefd79e99f5ac329c676fe108afd344e6fb03150bc0b9507302527ecf1d96c41c523799984cc059ace4ac202f9e2eee84d0f2445742779b22c3cc4733f403db5b56d4a1448e49560189562a1a05e2058e9773d08fd0d3ff59f2d112c39e49ac316a59462d1ea9c030e1e85f567bbf227aab024a341051059f1c1b51ec80cacf45091018c0926410916afd407373f8ddcf781801d275714658ac05951d2ff9bcfcbfa3799d7e0adfc9a0ef7def63419ff3ab3fa7f964a72a1d3f2a4ce40068eddf0a7de91225f0763010495828ee0bd19da0e39d078275395321f3f9cfb69ada425629f7dd4ec78c7b35956fce58ca2b13f5ae618b436deca100ed1c3ea7021aed3f12264d4cf28af18d5e453e57ff04fd15fa86032bf3cc7d688034cf4631283631d0e4e0a503ea39840e48f7503ce7bf8e528afda0a9414ea557d3e0389a7a93bae0b435eb7e32b9b6101b97c5e64be1cb30d0d945f0f3ab63de6a1fe2b09aac56cc34cb84b3ed08901e1d8e4d9db9fa59200824805d5c0a008e67ecc91600e681fdb7000557819cae82cf494bc5ba7fb4aa917de450d2e127d27dc5703d35b8b8efeb81e1db88fc6de8b16744f0b5c86a3afd33e67df0d73654ec386c98a1b9882d22afaeb27b8e5aba5446cda1448ae65bbbf50b374e32b88063b412aaed5f6c3ffd17d07ed1f9016248864a49ef3dc5774e1fd70f43ba2aef54d706f67120d192eb28db831492de9adea44f6d0e4764283432be8879a3f9fc300fce1dc59454c07d713481bc026eaeb71f418d2a3e6ee8fedc361538a6c22195dcbc5363206233147f8fdd40be1e283255c52cdb8922341e5ae24839291019f6ac6669c25b867550a222084b2c898200e65ece9ace4a94135d2793d3b1402fc31d50b37bbc3e01a297bf8523d41d66835f52d4d05424736e519a7a90b5eeed8bae1fb2f7b8f5629abeacf6735b66203a1f55e224e16c7c8fb6af8f18cd78cdd0bd07fabee8491299856ebeb228e059a5a4ec78f0cc7efa081acb23a46e7a6b12e8cdfd39a0b58c3f8a995058a3187d569e6b0bdc9bd88667ec91eafc0f702fc2bfb63d0098a759fd4ca15ddf707b05bd5a761d30c6059c2fba88475826d6a67080753cac36bae6433a1b39cf07848d5a67821fa5e182c5aff312cb714b3a399cf97f6e84e14ccba1e16b76afeec16eae5403a5a464dc7d9924c5d9bff2f783b8892955334ef974b9c11686ea7cbe34399e9f21a4c67f3e5bce16149ca4bb0f539e27833fd62d6bcb57a10d1767d7787ca5a9263f8ce782686d87eeafd6e126eec6ee7af2fd753b87139f5baf06a9a5f807b615cd3ea1e46f719fda620ff684fa81e2aef54b5d4e5d9365f529ffa1473c434a92e6424adea188d26a4bc68783f76da881cf36422ebf45a98c10a96ac6a9d6db00033e2ecbcef1a400d58100be75d8a4b5e954c0573cb8be72eb9a42ced140ec0fbc98da46487a995087d5fe8ef6516b9dcc1d5442564b293c1358e5aa330ff1f46ad8e9d8ae5236bbeb2bdd9fe96661bbfff67a9a8c9b8e5a405bafe35f928150b674b9fd5136e0b577f92a4bcf963b82ed76afaa5028325fcb192e24a7772ec6f802e72ed1874bdfa6c4612d395f3da52d24600c315fd9bf4c27ccd8bb3c3ea9c7f9edd7bfc1bc8cf0241ebe872ffc753776383ab0c0d8eb1bfe2869fb40559baec03aa27c74d76ffc8ecf7a69970c8584f294b04ee9a485e302bd630821e7ff050c49f9882f10db247adfdb2112c2589e1011f77c48e0f219dbf85e326f8a567324b857735efd60f05edc7b7e21d260fb551c8ac95d02c228f065b62a77912471aff236be62f193f8c151b5b152a131253820f4a6948e78a8e6820550d8b10b79048431d9f981e6a648bc246b13a33b944fdbafa49de8781204d9b636115e5df1d8eab3467142cb613b98421be37cf2d0f2991633b7a562ecf1d9535aafedae848392459478b8c4e2305289445082f963c6d5e2e4a049aba2240d673f03037fa9ab1763445e387581cd978464c959b1b5333e7027b649c4da11e26c43b92443c9a5f696c6c0563fd849c3ae0dec65be4dde2f588d882a40dd51f4dd0940c49d7d0a9c5aac1d96864e5b637090083b61a62e150676846f92545ac124002868df3c4f851954e47e0b6c68f376abcb4f6e5689ac0483399e5bb7a2b3ebc8ee859b6ffb5d6d61a38111ab08f02ab1941616c79740dd34261aef8fa0699eb3f1af54b08461c142d9244b92a1e5f73201240d81cd7feaf9c889d034fa3eb761d05a9d86715ebf8903fc2babca4176ad70fda50da2b5d8549f4fa05006cfc04308fbd86a5880b2a4a25d046ee89f239482179fd39d9f0fc528f0d2596c7943e81a1787c49094351632eb9854935b8887b2e6307c34780bdbe3f1d8c981e7acc172423e3dbff5d15e441c39e541031fe761fe19500ded46f95ee74618ed87755fafe06e2e3d21f20d44538ba9783254443dd3bcf7706b6bbe08358cd015d5381331969a2eae952173b245e009bf45b02ea4fb9deb028ec49a6e612f87815d6fac95b944a77aebea521c57e99e7cc9cdf715ca3ea33aa3fc0efffea097b68c765c4aece0313882a708f10dfac0474b083e2ee401a89f677c9c3b6272892bef06d2df961f545df5f208cedcb6278525f9744ecd99739725c0b2bf3137f467f17b80b249347951c265e214488e3cdd071c3a03db689cb88b52f2e9ef4331e1305ee6616ad228ba545d255fd5f568a55adaefdcb1f17c79f4cdcd59f136fa3e282b846b9f6adb0e38423300098e33848dc01637d5c69b61ee7bb27deb8595b5556beb4f4b8118b3eadf9ba357bb45e13c663db3bb4a8206f4f732c432b19d0d248a7b7af3975a51f86fefc8550ee841d337d6bed71fc8bf94cadecb7b3d88ac2211b58d2c30284ecd9d8fdd65ebc33ceebf71e7bd98c8124a611702099be108ea9c49e469cdfb20f6c2fc512ee44f18eb578f9ce358189582446bf6826f2e99ca84791f10c36b7ee07ac5d1f48ae49c55ba806cccc022cfd8ff5e1759f9da056e64f39bc5d2c19f374f6cce7b423c0dba3304c5ee838f07bafc5df314fe6ba232a829f8fd5eb62847ab61a507acbe03856b8d36dcf4b603b4c5fc0827df6c16a3e88ca53be9b190be0945044e1cd30453ce7a4dfca6201a32e6a8c5270f43d95e80ac2ee5e63c7ef6f3775aa325138681c66c69e21a55d1c1c8f4b887109b40bf1b0904afe6cf398ef489169b681810abfdc41901c3dfb0fe076060cc85db03421213b4ee5de256e286ead6bb2839294eef21e9f035263e240c6c5c6bd17b8783f06cbe15de0e6d9e152cf97717ff36c6f5064b21d0b1eff05288e9e9860553f150649edac9abc41e49c02d53a9e2dfc0a9d1bb0b391b3ccf7436b7ca05f0df169cabc591b35320ef7f34b0d5407c7ab89824b830d0caab3ddc063481e3d6bf604f92c0df2d9cda8e3ffb427 -MD = d305c4ce0161386004c267eaa17180eb2433280716c894ed4094c2597a582da1 - -Len = 32984 -Msg = 0f5452e6b51540cf219998590995cd7f8785fa40b4f217fc79f07322a2ec5e0834a4261a0177463779dfd958c33c55730dd3759f20167778372688c511967d584572c336d67f99f807c57c71704be39152222d8928a4d8307efef3a606ecd637e9c410825bb6a1da72526aec384ae1a2ff7a0948f425a2eef7829c0daa77d26dc8a4f545b9a3c6a5638e891142c2b66ebbe3f123ad213c784ab96c4125bed9c18b195ac917cf71208182c227b73bcabd2f66cd617b1e10961eab498c9e4954fcda2b27549ec008147535fe78be3b8557020a854b85a685121b611c343da1a9e65ce3442f7500f549e6af234a804c4f04ddd80229f44003b3eae2ce822c4d4247ba489aa2c6179e877df91ae625f5908b68d62a43ef75f240333645be90d585e79c630ff4b68b6d96e21acc94d4bfb0b54a0ee6e09fcbbb829d666b3094c2dc8ea83a8c6f6fe6c83dbc1a209cb530174a2c881f492cccc441d17927205d9bae0389d8fa5919af1945b302fd45f1d22d12b54bbbc7bd007644777760d516e8630fe5423ffbdb6fc77770d94dd8b02d5bd48e5fa4a07aee395536690098e532637a6582459ddead3a999ba7f79d19c7075a5eccc01c8c1e763ab656eeb1f2ff150cb09ef2874af1da73dc75e3dc552a9b6ace9af9851b1893bca046126866dae38c6fa1300046c40fcfd94af9dd8bde7dcd86d235214e65faa39c415404694834c44990e651faac41733d2e21e7e469174b2d7c5e3a4e8c11b751509ccf22d3717ae775fcc38f33d828ae2943448855cfab6b9e5b16431542c0687ad20fba020077f057599c2de13cb6d444473a9e2a0fb7ea4214fd5489f48588c8de0d595d4a830d3fe724fb3dd5e5598615124f6e3e354f6f7139a96e8ecf5a40a811256db765e6348da522cf0c7de2f89514c2abc3ee452e5a116b4f7a6686ed196349b9b0e7223e3365ca1f47451aa0b087206808aa7286b7ccc2b11f12b3d4174aebca9bcf6965c1ad19b6ef06a6884cb5902e74307e7f70b3d51ee59b89ff8b103426e1e665b220c53a1b6d8831b852e43b846f4a12216d0ecd1d34c8b2755efb4b57ebf4bc2c36f553d627936136ab5d48f261bed6759725d1377462d33e765458e520c116dcec858d7087efde0c3d68e000b2557182d43f0af20d319763bd628556e7141cc82bbc0f70f4635142f24c2b37cbd78c500da5a0d968fda3eb1a6ff834aab775fad9e4025ed6b962deb153501e120ccee82ba0ba71eb8ea2de74c1d906d070ca7adf438dc394b7b8ea61c3783ef0bce05114768044ffac3a44b5a15155c108c34e2621d9259826fc6dece5ca1dceae6993b26f1bd90d1e1326c45788a8e447078095c80d0f49cdd57039016f4512ab12b7ebd5b3b87badd68b892ba587a3f43f18137f52060f76ecfa305f8e3e267b83c4a9ee6f6ab2212b7cec65d07a65d9121c8a8dd09452e7e813b946508e70e663c2d30478761b42b900d54c330a93bc2996e13bae407ae973c3bc00ddbf5ab45aba515df6641dd7291f2c29f3be93662b8d00d11592ef44321321d35c594aac12b30b4110bd1faa22e1d9443b1fce9fc10acf972c131ac0cf0ad008f5e2aa9730b5e8faee078b814d4fc4e531b4ac2e931435d41c4a6125f2b1b2e6d2e4e13d5fc8d3cfb9cdc8255270d654fd0596dd48b31dd20cc02d3a420eadb718e6576645f5b10799943e5ed84df5d8c89af27289ef6cd725fbe7c8682caac1f27174da8a436bebb5e655f387ec0abbbafc29b6fdd10b2c8e85f5970b10924e860ca060d7bbe9c3364a75ae0957fe43fab2a4714d60e21970e6c16fd4c44ba4fc3f43c2d46313d7434906550396b7b9b144ca6b20a5d9e5f3a4b1186b4fbf0b7d92c5c62845d16e056a70b120af1f65063b026b1fa6d9da3e492f5977b9d4cd318e8e357b690cd1a4351b8a05ac1d8e221db63bf26dc83e7a5da2fca10a74313fba06d677d5aa49473270a85d94987d2c754da14002905ace6672c7904b867ecf9e9673c293951c16ead5d2ce707a7b4dc82f66b16b177663ee0683ec84f2fd0bc3a4d204abb3923ae4b3d20047aaceada0c352eeb247da617cc8f85fbba0f619b09abce623eef5dba8736e9d2110be7384732c9fdf06cdef991fed8ffa78b021eddef90f052d8b20bf7b6f4a079495c8fda7be6cf83e9835cb732b244861754c03da512959589e32b0359cb1ff1e99d392c5cefb07d6845c9d2d7bc7ae468bc179f48cd9255674390307bf7a149614bdcb3625f713b6d78c94b3a320320c3ba9d79671c97311555c415b9e4d4be44cad30628b0625c6d9ec3a6e6bd6df9ccd2ca627caa14a708bc3f19803d0aef08acc4ab1c7d044eed4a516c69d92bade89716d0f5d08b35b5d979b26b4ae44a21541a08ca3fe78160edeb024fffbcdbab7a1b4b5f3a7b4ba1200c76d798d15e33735ba59e538c926d0c091ee5bba1f199ee3048353265875f325fed51c162a9936d02181562540066273408e7776b8e18760e3e0472ca475482fc7c663f08aae5b395c6dbe6ee49e0c1e456a1bd8a1fcba40dc349561a2a05945aba818c33d08ee99f384e5bbbed616ea29ec1187e1507faa74e8066f59df6d9031e301394c9137176f2d92b3d497c7fe737a202c80c71ec6356262fbd11bcd38e1dfe7f8be2f7ddc57d28ffe30c76983ab7e0f6f8748debda60b71b0133ac264430491a89bcc0a1033daa245da5042a05a5fa7f7fdba09b74f4bfa332626923ce0bbc9f2ec4f24d98cad9430d8189b7e0785b06dea07e5dbb98bc72f12c585e93f6a557eb8a01462e8b32c663409bb443a58f2785616bb526b319e4ae001e593e87bfef307a722d1d2543490f60aec1b7b4034c14acfd244eda7482c97c0f86164548cf9e14c954fcff872552402742b53a540f0cd1a74d8c8538d7e3fec087c3a5fc73a4f77b7036907b05ec8db9c9b49efdcace8dfe736839f34e8e16c5b0cf202775b5810ce1627e9b452e97cac94e686d19da2067487a6f207118328393815a7630705ff23af910646da90cdec3db0d2e66c037763f3bab3cca23008ec282ab554e45d2cfef730c6309ec4b6a3bf313ce5c1131bfca1464c4c42edf4bb05b994129a687fa6168b9239458d1f1b41f12a9443dbd887bad2244f9ac4d4edf74aab65d22ee165332bd02878f3f09aec7705bd9b62974b65e6a39d52bc90cb2566641534b838817696eac6deff1169e74b362671b04191cb0b31fd11dd109db89426e9670d6e43085646db20b86ad05bf523986ccebca113c836387f303dabd75d5aaa143569f311f34e2fe527e41670fd36da34c3f2c366a61a1645bcfd3cab486620e23913d9b8f36889d65265854decd6b67297c93fec2c455f0b8a39995cddb3137a20523d26e0feb29a43d6631b4a6af2ce532b5ccce220db78a0da0b11a4a94b83f2106683417773da0220f9019d5c57effeff632f5011523508c6d8f226b08fa6b7349df69f3b923e95298f286f13ad7ea02d9c3cff818beacae74828ea31a98b78a62aa781b2d76d06db6db847f7bc22429c4f1c76d94f3eec23a5db78925fd93d4e55bf6f440c105d1ddad8ae704b84ea36c4f63d7f66d978643532593d7a380c146666f159f7cea0d620b02be6244ba3e243f3dddd9864759142561498c252efe0a4c390596250d9f0856946c10d207288133bdd59ad87ec92126f310dfecced9a58ffd3ac133e0f52522b8769cfab61117df5c55d6ce9e44feda43903f8510e2aca4143bad23f4be4ce1d774732937763c94a1e509e3365af1d1db3e276875b7842b266eb69fb948e43689dc1fd81bc673f616e9a0b0c789de90327114116db6c087ac7a89e1bf238f7338140fa1c3905266340a37b1d23fe987e1dfa21a797ef63c0eb573b476dca33a7ac2def0df526c87719d2b60e70bb73b51e04dde295e79dac5c6206260e2c3feca5eea5fbf8b06bc68391838667bcc2d1b1973f6edf3efc68a12fc861dc476329f4ede48f4b8d58770548ac2d0fe9cdf95f1b0df47ddac9194228489fdf01e78722907371f5a3d7b3285df7ac702adb56aff8101b75a54beac7b350892043122db6411c48fedc2fa272392dab926835102997108cd185cc01b93aa6c7a6f62e433867a5bc6f1eaa6b6d4416d17e89244e555ed5ee99649286a02413007a0081f33169d7774f538e37a1e679c73b77ee38bcb626ead329e6a202d95fdca24b546328b17a1ea662242d95881f35d118dbf7e508cc2889bc107c69c1520528bdeebba5a6565c7d33b476d190d1c1495635b358ba904fc205583e5c44b4201340992430b032d6dbae8639dd685516aa1842939e36380787eb060d64ca4cd86cbb9bc65237d837c8bbe19f427673dafc454cc03ee28cfadf59611408bbe3d23a153dc892a30e254c420fd08724f5b647c79962c02856ced234b278d07f41b98538c752795d9d48702b56f334d9a151948571a0ad6f5c2b68654164447e2e33560b818e8ecb4d4a3b5eff30d1fc4154ea671ea28c1e67baaad456feed2072e8b476b2a25956e5d0b6c351b0e7f79b665255e791e59f3f229f69396e52ced482a761a4b662662f85e743969bfd317830d33713954159ac0c4f0d31ddfbee1ea637b49df33264f10ed8c414199c129f5975f5ebd526b47620c3a6887371ea16fe6d57e68050b6f416912f15504b02da8a4078b77a1f186405021d84573b2885325033c78644c60043186ddf6b9269ef6b3da6bfabb1ed4064145b6eb2e11232eae82e872d97fbdd3d7765ba90f9afa7a373684a91669bd0e402478eabec0ee7cd3e31709cd0bc52adb6fef0e8093ccadbeba7a153c58add2ed3c82b6be3866a835925c8fc7773283bdb22c89a497920baab490d1b56232ee98fc88e194ee184b542f0d8741487278ef0b889ce42cc70e9bd37d40ea2cc8dbe3f2e00deb687fd0bff7ce82d3060174ffca77cae7a9e840f285a3e5630eec055eae2c7e2a1e09d2c9aaf404f5266c02508d9e95f7b5822d5f599951b88f2905598cb2b4c9a542cc11a7327010301eab91b35180ccd6013e32bdb1f84333ec56751d37644264b717188afe76bca995cb33da350dbf6201fe0d20a26bab83c27321ee1eef4cf2d35e5eb4bc6b62f96dfba760bdaf480fe0d75f30df0e59f537d5f06dedd821c6240c44b2e0d0aba603b76cf55fe80f364a74995ccc52b71ea919512b0891695525ab7b142038ef45f38904f6a04a7d5b9b305c02fefb7b56b297d49403bd9c3654b66236ef26b64fb9db0ff303490b065fa507c1eb5aff33d0ebeb3763af22d04da78ac9a20c8939d347de590d6640bd044d3d2815e3cb4c80801583ad08a5c95d19651aed6ce07abc3a00b72314a6f625935c94033857e74dfee417543c9d682f6671c935ca54a8f13c079bf8e6b6383001f6a437cb3dca95a2c750ddcd625311294142ffa74e4afec86365d35ef6f9b0339bc7281ed53cf4264fcece3dad00cecc4416bf8635b75169a4a366efd1b12282ac7b6895c6d4e5f3ddff8a0fc60794ea0ac309d9c394858a3bd3181bdf050389b93f5dd27b18e7960251b5a655ce2fecf5c643344058f7b4a9735b55875bdfa332919c678a7f85874d63c5b3c4caec5fa59f0008648b44836e12c54f633c1389b90088a74d8f2c322fb43e9aab9456bc9acbd4d88891e840fa3fda4beb0c5b87ad0ac7145cbe584129a174dd72a0fb8e35cb261725035fa7fe390eed9762f4379f2ebc513083a61ebbea2cfea277474f171b6866d2661712cabcd796f0d69a140fcafcc05185723566ccbb60c38dc669af4b302a1910ab0be029c8fa7fbd99a76f9dfd04482a692faae7a -MD = f98918c63e3a9238e78dbd5bebe4e47eaeec0ae1627387dcd2a5ae4725f7e47c - -Len = 33776 -Msg = 109317556c21c969eda65a94176d7a11462c9ae18a865b6db4d4466eb125bd0a1783313ffe79968511d214afe5a20013898b0aea5e39b8fa282f137266c6a015df72919a7e483d535fbdce0e2ab13939a0ac74497367e35c5b8e131c66c4aae790e89e2e9396a61b00f1ee778fa00fcab3173ec47218c3db7479ae365a27c5ca516bc0c3e66cb9251cf6deb3bb796910ec55d224035442c19c784c86e9f8d8044a855f201ed15eb8da52048a58442e5171ed9630cd244754fa1455d6bc3ecadea4bde30ee4ce7d1e628fcac30b0748d66a67f4b2798fbbdeb7d431ec7a0185a0879bb555e06afe9ddd3497287ecc9ee7004c5370ae9e84a5fa414890cc49f0921aa83bbdb9adc97e73cad27f599a18cb5a221a3415588bf2ece1028c5a1ff3fc866bde0e189fc6094bd8e591437a9ecca274b3c456c5b80cb43fc8a7cb8a7625f26d060fa449de858ee63726e5721830fdc785e818edf43d7ce000a8c893615687341c8906b2f73c637d3006e78d6e4095a5f86a03d925cb694e1458f8419cd76d4a8644e5e2fa74f32438f8f0d0894492957411c09034ffa5106a7f049c10f0cb37ae08eae2d0766563b7c5a8454f841c2061a4f71a0a2158ae6ce593aca3e9c981fa9dbdb95f8ae2c21535b9f3a94759cc27ec4f808d79a9b080514e7a3e0991b2d4ca056f91f792caba10c8e27fd774242eb171c9a74ec19f108cdc0dca994851a3586a0d4d079c020f1e801bba7a93addfba05fd3feac803835fe76d2de119e7cf10969a7a0029f27a2786a54079dff1a0d1b2253d93e562418f14a351292afbc0b72e1e022b602364f28588fb1c7f77dabc204788924046b2e70db61cb9a315dd18dda2ccd06a1c364823cdd2aa9bc7f644f86e0a2f02363e2e7aae78d8adbe90fa492cc0376e6556f1087bac6d5d6a5a31e29faab153bb4d2b02944cd0707c41241ac7c6a795872eb5dd9a73abebe7704b85e450625a5c47a74e6f80e713da565ff978c66a0709245c4a330ead6dc69f5a8a44e48840a1946a0647fb66be5d38738e49a8c6eb73a2adf64c65bb0c904e2598c84f6c2c129c3cd124a7959b8f4f2880415404694e0f718af0601cefcce775587677564738c7e5570f6bbbcff703467768b36bab21d370ad24e71a4002d1127258458db99a7e2c410f2f21851dbd941dc7ab45d674567208f2e2fb24ba74c48d76a15ba9c027db372ddb10e38ae3db176525d815d0ff3f43613908c57d385351d674063f332cb8e07058ce11c5dfe3104b0a6e8ebb389e0579d4894bd285866882a4d7a57af38ce5e08ca338561774ae7f404d69bf6959f6439bc6de42c32677821b16001de61eed8560d980c6f556990bb1bdcf64f836bfc67706a4545afb29dcbf0b7ba56b38a168bcb7109cdf507af64308e8314efe080b4e93c890b2cd239a7afe3b99eca0a990898411603f2cf949e075dbaed37878180ab3707e336410c433366b81d01fac05ad89aa9b7cb0bd0b6f4bd163ef6eb8f791afc5a746889660d2fc31e67f7d53d0120e04d4fea56f44d8d3f1d90ba670b0cdcfee9251005d783e98b54e618245f89e5a46932dd2b6fd035564978dea4749a45a13c7be950e1361522044def62a853bb7996071013b3dd8185125df00e5cc009a5ecff30f513a22719a4d5ea0ac80d06b25c432f8a60c3f66e10c67b0f340c8d5f5315a36cdf4693f4af3494971f045bf1146d8809e7220853bd38fc419aee454007559d12b491e0259bd07b921dd82fb866fcb61cb7863be8902be02fe1d3b5fa8245aaa12412a03ef3300b8654f6e67abc57363d625f059f0225b344b95b73d14c5c4872be5738a32de9c0ee54ff34ba9d2394e6782af9e9abad020a71f3f386ee0ff311e3ce2df4d45448248e4f8eea71e83e9259588d5af52848fbbc1bc96dbfd7370924e5f4966f15ede36176699ce2fbafdb96864455672df482f8514a085a5880b3024d311a66854e859ef2394468f4752ca032937b8a34915aa73309e945fa6cc9fc5248034348c695674182736c690b0016cc1f3fd6c2abcd492f8d830b4357987393cdc39dc7028d8ae2d9ac65affdf06ad12c14c56ea0656ea54957f2b9ddb9289016ddce966ef85a64b3420d5fba680ce06e9cde8f1bbd8832d1fac4c46ba66bc5d7d46e2d8840563583e69bfebcf18d584b2aaaaa8a3016669bcdd9f98deabda37529e4f2db001ed3d00cc9e392075cc7366082475857a9af2b53badfc0e0aec76350db9cd3b214de3c26ffc4c6240babd4b12dfc12bea27ae52edfdd8142af9046ebba720ed0c8a31cc7a608c5c20a849a9ed62f55bfa1687da1b1795b6b509c845cfa18e8e6bac0e65165361d8be9dffcac43577de526e6497ef849cbd5025aa02712f7fe5e5bc64d76b5c339cc1a1c7f5bde1b17c99372ccf8fcb54f0a55392eccbda5bbb23c01a68a0036a72d2bc897100ed09fc7879c9cb237424195c9d684c02298ad8ccc31861ddd06e2099f72d87b6e1e928963d22d3d40876fe1d0b146a41a5740489ca460a4c4ca86ebd599b7f0746b8c69c8a1f2ec90eb1698fa47f8eaed4810702df8caa12fe7e26e7ebbca11aa2de9f3169a8262c0e3c205a708f0071401aa8de09d28a5a6e590ebeb476341880c37bfee1a501229081eb27772d07b371a5b0c65100f34a25a2f0ebbcb2822865cf22aafafe08d51de7949ec242ed9cee8ce861bdfe2b0aaabf92150b59d173db6a5bdebc9c836d3cd6e16658b4f8533f35155858b47ac3851abce5aa516a2169fcef423065ba1176b69c28416d7101ec0a0252270a2a9d3f193802a084955998eda77d5d42f4ea52f08b8b8653a0cd7d7176f834e982bf5f26cd16f5d89a43eea549384c1b7b2058ea77382e50cce07bd438f28637c9526da842c6b137c008f58c9d1a03d995da100d27d6414b3e616e9a11e725de487df20760bcdd8850d0350a6dcc8c628b4003c1650ec82b3f79dc2bc97f1ac4476975aaefa081b392c235887ff5efa0a57cb86ff788c9da15504fef28636cd30d3d7efbb719a39fce077d6c9c3e327a2ab3b77da6eb4f3f080d4e4ef63b23f1e42295617fd04d364cc695208c4f5fd7641089553adf5f4262d962b0faae480812404344116d865f5328060a17cf7da199b8b55d7b0e03cb69db117dfd65e1ffe0be0f0c339757022d555694056795bf12d6c3ff311d42c2673ce61dc708f9be96c58222aef6c608207410251dbeae1917903ca223b7250fa22366f8203e952d7c7c22ec4933de5775aeb924287dd097ef0ea7ad1a82b29b63b91b76d0afbf34da0c7ad3cef6a4d8742adbfbef4b0321e4798c8ade26f34cf1258c009e047ebbf79c0f4003e622736411fd1137d1509f3cf973a0374cf00b969041fc53e5dbaa1c556b99b2ac5f118f8aa8cecbb6bef940b5e557ed9cb0c19822c3d4b7f9dce9915f1547a1f063983bbe639a72a3561738d66917c7bd3b54400299ee92e98c609ee195b3995937f2b1d4b6ddf3401fe16c8388488e5899aed6594bb4ac5cf0f88b037444618fe20539f529ff1734214023e5c9520a14d3b5a24e628ccdfb12979fef3961c33b6cbb1a494568a628641aa724b49e039aef53eb0a65e0bc6ef92623ca6c748505defa9ef7918168c3f1593e67d1924191f86ffbb5dc17425cad8e5fbf95e470943fac0b2896b024aecfe331d6a9978ba2f3f018764f99276e37b59bf33d194c9197b8aa03da5ea49006a2c89bc316ab75eac08b7547ce334b9e851f91eb7be1a3ee06c3b1e7f4ae129f7c4adba77567b1e4c69cdb4c1e2d9beae532bf2872f6734d7e9e5945d80bdca15b01c1de1e88feeaea92d0e4f1df0823bc1ea57b6655a8bb0882247a74839514263372ef77d6060314b77b99af0f3852f4296d6cbfc4eb418cb93a102fdde500c5291962ea186e372c5105f2c086d37f749c3c83e50ce4e6f289c28f70e3766e1f2bdcc0dd18e18e1aa995778c0c82b024bf3d4940f53ab2223be47da15bed651e80e390ba9c0511c60754b17c69edefecd99545384696ad0416ca64290ef5eea972575ae86d82c719b26a27f664bb43b4346f0036c99fe0816499cb70c43410a84760a7cf5301b9f9f4fe6163c694b56416f100a044fe527f6b7c3bde4452d3044825fdd7152aed4f1338e82c57224be4c843cfe0805a0be775993bdb58f83fa3bdcfe7687da46d04584143b7df0a0f1c928ef55c455c14a2c81853cfc6ce5d6eee85eaea511841fe0b41fa6e26f709f5bbfaf87e5aac7497ac220b22577b344d227090c55a2d6f27745f96b8f38f40558dae62ad89f133ad6bdfec3cd3a8cc29a3b86061608c0166dbc49efc107abc264ed3ba5098d35ace4c767d8502fc2ee8b784e2272bdcfea287989aa44361854e479089d150fcf0e1960f4666ac206174a7fc9f7d82c66fc5c102131755eca4b7c00e56977911fdcd92d4d04598bb6db3bb4a1ecc2ef25bb6d12a90bd0ec220470074a90adbbd8a7c88eba28b8f765b8f3a93e77df807ca5dff3999fe358c01e851eb0a923da69dd5bf7c45a159f932ef6e0283f6a5aec5a29357b64294f14f81f99b0297697441c081b03fedbeebfaba9dbc79a1008e526dd4ab70f1f19a13f941ab188125d07b2514ae1ad986f4bcda10ec51e5d0507ca60b5e4e73152e553a7144d5b83a6255ecc19f5dcc78bd7f360fb89429dc9b48358097d930c8561b2bd18dc0a470d1d6fed0ab912e5dee4bb6e148c9d7ed18c0027b7f9791d1ba6fb4a9af61ae8ec5064189f93d66fd2f2842d0c57856cb6eebf6443e12fcfa0158bd40d1403c5ee8ee9e34b2e9de20261fc222572a0e3e46d1f722fbd2da09d4df2edf1ce6b8a6df95fd18fd1efd8e7e371e202565670e487bee5fdf5d94c7da0aefceb8da882f5504477e03622b0edd793e1258b4c9021bf0c441113d90fcbce3e955cca416c1f04162aeec40d06aeceb0b40179c9ce468385f11b9fa3870217202bc80cdc824585638f0df3d546852976bf18ba7487ad65ca916011af3eab2be234afddc081f364ab08c04e320d1b785476fdc5c358d0e63899a0f27283417cf35486b593d7b3226b1c984b99a6cc5bc88003143cbe4b755e6e30ba94114f7ad1efef2ccce00f3f125f187472b03224414edb2e573497a3baa3a1e26a553fa61c8b4b8be257622b3f34a34163b5c7625d57e89c99382ff1cbce77028bcb9c9f219b2e8b7a9a56675031db4ad33416a67b2fadb789558ed0004322836ee0d0c68fb3fa83dc255683e3db12f947978a51392abd378df93edef6a636ed9a3196acb55a520dad84dd0168950cc5477c9d0315fd79653dbfba6f2d6c16c9743a38c240e2a7a1553564505cf40b37494fe93c700c74f90ef57c110309547fb36741a7a1017db769c386f14f7ca0d7c37dd95df5dc324b88571e55260272a8ae454bbd642b46d8619bbf74ae93602f5ca307f805e123d52040fbbbe4ebf3bceb60a173f8c4858cc33a685b08dccb966b4bdf8b3ebfec3e6d4faea5fe3a5a24e1260d7bdd61dc4d152c3c04ccbd45b575d4da97feccddefd5dfa1b3a05208892611ca3580879d81bdfd851288c950f502da73aec49c8b51e06d7f6599d7a15230c0722190ba5bc3440aedf4cb658feda8c955202ea3771d1395822c394f9708879e9fd07c5e999a4df0d13be33654f7ce2dd99cab762399e5e464880d0e6c249128adc2b1f8c97f123bd9588e9042bbf9748b94b9990360edb690f993b8932ef3eb1658b01d8dda573850cb2c27dba2a139e578d760b90a819892015bc29e9016428433154139447392e2142a5172345bea71e9938196ef4806e22fc3a0f0e07eeb51c25fe86e360dc817b42791b8f98012ab376c503f87b79dfbe569f84ca894321996de979f377c443c3b928d125ac42f1c12c071158c46aa69c2cd2ce4510cb336113fb33eb14593fa0b099810e08eac2eec4e48ab358bc896385bb35a623eeb51d1f -MD = cf17b0770212e87516c080aad008d50cb5481044626a325be730d54a66f66662 - -Len = 34568 -Msg = f60c89481488d65c26a6ba364c5d602134ed1afad5c2b037609bf82873eba67d907f6609cf6228c5cffebb18f2839e55ca8d1386ce0174685237cab6b65f9caadd1d05c2e07709c004f129f4eaf635bd067a624e52de9dae44141e02fd033f0fc32d8ffbb18f2253adc82c539b7ece61d0fe30daca22d0111e781a95b1a038b32bf62b3ca9721b89b3ccebbb6de31147115fa5b39c95b79ac8ace6f63bfe2e9ffec1020e30e79b67fc428fb7c8eca579afe6e86032fffa502af8abad01e5cad922d63cf8aeb74af771753fcc146333ff94db2269f328413c2da391436d1db46b817d00838baad240faac2484b90e62dfa6867a5746d83364b7f7bf3fe66d935c02fe76353088d84a802e66661fb5db23cf2e19b095d678d2b13a5e29d39f10b58ca0c7990319071ee9442cfaaf2246d3f61d26ff47ebb98e04b5958a9e79d27d09ad1b346d2504c31f369ec9cf1c4af50399cac9c4df9e9e96b08de9aec482bc606b9990d7737a41084ce65ae86a8f93ddeb2d98737ace0c51736dce6b47c77b79236a34a7cc0fa18ece293563d5beb46e5b76f3be83f2e01c455ec13dcc4ac13c1cb5a847f86bea980392e3a6257f619d30ce630cc4b120de70884b8c19b29691a0a3751dbf37240d3446eb1b2279a152b45c6fc603b4d6813a12f3c0f8a80260f55c2293e91b57d7a970d52993557c752d499f5209a209ecec2542412ed40e916407370f3dbe8cddaa362a3742bafaefe4bc7b199e24c207cde8bf7886ddc10c35cd3cfb84c9cb077fc071aff55124a621de8c8389e208ba2784f2cbc76c24b9b0d5babe86e31a3d6f3732f875c201832cd659f99483e3ed402063a3b8283d801d4839c00bb58367c3c3f67a8ab4996e4ccd6ae185b05b8862e59b6923ba164ac34d3f69dbe70d6dc48b439dfbcff550caeb48a425107973d3fb2183cec9b7fdeb0d5621bd20c037b7b8a4c992bc1c0fee577aab3c4c4497db897d5b81fe2683ddaf05507b08a5aee7719e6615231695003a885d920bc5dac4b7385706016dc2e15cd55edb48c3b89bdfbbdc4dabecc848bbfb21eef60225d4afd9e1247994a43f3c4cb3a688233e1a2a829302fda5920e035a611ab405615596e860a20ea1103e76f4b7a36fcb29ad797bf4fcc149da99392d84dceed6748d97ed3c49699eed273355d39ca6c55f9cf42f65029ee1883286fdf2fd4c7b48c5d771dce1329225429af56d57d519ca2fc5254fde3c7483211250124575fec34481fcaa3210869fd7d45eef9ea3cd51ae11e51b56440ab5ae04b14e7b1266cf54bb140d03ac81432e0818bf37b8ebdb6003f82f335eab052185a50d69cabc533bad436d1dae8bf98f5fa947eabd7a528ec0e5f53c31605bc1bcb6b8d54607364281103349bdaca941019bed815a839d807334d33b66309fd7d26bb5882e4f62b15c03c54d81ed3b8d15761bc2360da47e426e33f6a424b9abee4c6d4a299dbed068a58cf1a45597bbc3c03877fa204fd0551a7c379443928539e248e2dff832e6cd7df0ffcbeda6133503ac664dc486bdd5c016c4de9510addbb4af1af968a63db3145a3da0bc4edc90c6de58d802318eeae9696529221c6afb4b08b81ff5021b41f03075cbca7860ff92381443e1388cbb1cdde41df39f06c12dbc85f8a82ec99f9bdb6df41f0de5a8ee2164356a83fc71e1da08630f7fc756e434492d88138ff69dc4eec2c4f3b4b362010e56a4fa2933c0c898a37ea6f6e2f8d7cc659d97b46e7c52bfddc01415497641db4f97865a2a420f5d8449fada8cef0cd549f0a3822ec2ecaaee1b564f92b34793c84b0dd67eee171faf7765bd7d533d2e8188203f5ff6fc759ddda3acb5a07cfe68c978e6564c48a5cc10cee5ddabd19db46ef43428a1e9e9910fe272dac648e3d818b0d2dae50bb9821d1c9bd38030eb8aa809a9b24a1bce73b9fbea2bab140cc0409ce23440c62179a439278759c2e0ad4045e62479faeceae1d55ccdd9463fc64a235e89e6e3a65ab00cd122beee43c23d9232a7b7ee0a9f915a10ebd84845953d2f8d045dc810cd467de1cc371fde74a8d7d7638a5ff239d0714dab2e80e6d321a7b8ca2fdf277970749eac4dba776888fc1b7f7db56a61a7025d356558e929fe722706e38eb30735d952eb8728d749e5e8472415583bbf1cf686b20536183edd7a22de023f7b1e9e9443b06ed1c6bdc885a279dcb02dfa3a33114a948439bbc5a6f17a13594867b18eb924881d0b6c38ba76a7592607bb06a246249ca91547bfdedb039e44e28a78adfe6f607570003d6f09d5142093a98a2b6c69a40d748bd20a29a12c67112efbda59b87b3fbb1edf8ca52c9607976dcdb7cc4035181e2e0613247b442c9dfb41fe112763e4b57027fa90d46644dcaed72cafd2d632dad963df11ba6efa4d9b52ff6fe69fcd269e1c9f12f40c3d2a15b1745b470fc37134f2573b85323aeab336c7bb1ab761d650c66475b4115c484a627519c66833ace6ba63e90519523ceef53c3dee33078c2d2e31ff3dfc0800f4f21930776aea5198c3ec6262aaab0bf198483c889c2912dd5beffab755a818bb6a46ea839c5128f116d8efc36ead1f6727d202107a2e2e095584ac4aa5a65949d1e68d1286cefb9aba11d850ebc040f6a8c1d5af537ea95925da5e1c72698b432fe0624bb1ca903ab77d6533ab4d354625fffe8cb1814a74d2d85758475976548c1cb157a4aeb07a1606de9136bac700a573c4d11b9fdb036465e124a9dee122f182c25ee7e02302de938a951271becc310571a31a4022ade46b42a82260965565fadc8703cab179170bb264c9d8e251d09d4c2c35cce91b59d1c30e39475b96f16c48fa7fd22288ca589e29e359fa388a239c94f4abf6f4cb7fac7b77fbf98d9cc04fe0e3623dd6fe61960ae65bd028677faa03df4511e1435c451962e438e16ede3761b8e1cb0cbb0ee22f5c462aca709abea07f02048ac752d510846bdf3a6fae48a485b794d10947c9c1cc81d1c6ac5a1f935b4b96966248a68865f6b842a819ccd2d24b60cef1f494e8bf768dc324a81705fb868eae1927fea88bef899e200509122807f7aa7afd8ccbbc8c2569de6dec1ee81db579f6d5269880bc1bf9df5c488d0d52210ead4af6934b2b6362e48fe705a976d3a0003b6681ccc736f9ee04d16a0c94a5a290c41d67f4bb0d533ef850e3c6fbb0ca3f41058bf576a14654e7ecd2aa364c0d2e51487040a4ece7f28e6fdfc81213a0bcd04ddd8533268919ebe1ed719edef88cdabed6b64fc8c40a3b8b223625c5c97ece84a004658b6a46faf7e2e835230ab448c8c0df2269928de5eed3989b8fee8d25f3fbf8739990e2fb78da9763e2ecad81ae56418696fa8476de1b77dc37b7f2bbe217ebc718a4f5d5aafc0791e5457f6fb8c266e419a3f6d5a422595085cbb47a991b64c8d04d8872d671bf25f2be33f92e29d6a2b837ebea880fc95f43d3db485f30ecde8934a1b943604789d2ffcf0657b6172a3c5b6c9dd10a4c713776700f7e7e0a710a014b923bf228234daf5e807c8eb3e26cb97fd6c93d6cee2a5d7ab63c2c46e91c5b8be5044fe95d2a76e54ee5dc323412f92f7db6ceb03ee5300125e26328af87ea6b9ae79e129e33fe6e58dac61a87f4c3817ae1e5a0c92d960e44b74a39291357f29a2c082c4d2eec0086a374f542dcbd7fb592abc5f7cd37a7fb050a00c0874a28cb1bb4bed4e4eba4c0870f4acf909230171147a6318bbcd73212ca05dcad6a1616fcca509a1da161eecfbfa295d8e89c86a5e2ccdd31cda3d128b3d1e64b60c36316746a07a0b63ff8c4ab84fc7e68cceb97a4bd65851115c08dedeb442ad3389bb2d8958337d346c6abfc786c48b9c72f2fb4032f503134e7899fdb60126c7ba4181e5876a8a07f40cfd9064d00839538b53b26a559d4082e66f12aa1cbd39668906f3c48bcc4f14f776bb7076c703ff07160ac2d6aa39a7e6a0c5f6e1caf90ce62f3c8613be8a4d9eada12025526cc3eab4c1f314946f1bddf180231cea972bdd5d1842aedb3a1c7714da0a7824d4409aa260618bf6415d50b3c9c51a968431f3232f8099aceef0254ece75cbd8eb03bb717ea4a94a50fac37a1b43675950bdbc13dad6709e09671dbe0718acc9117bb1a47522f90b3e62caa6fd248fad7d3d9ca1b2aad03929ffb4e51c69a78fd81711bddc62f7b33a23caecd7eef00d7a20195f3f741508c118af4666cf2897af6450202ceb21cd04cc389e341934e3c803b6aee9d8db875f4051648edfcc7b27f1f16ddf3203c30ebab84daa29cadaf756f9034a3f703f55153fc1fd11ffa4a23e7a097bce1a3fb87dbe7da2a72e5d88a8550ec91e9f8b62f5eee129ec2e9edeb85e857b25d19da293bfa0a5f7dbe5ec665f23ef0ca605d960d3449de4f5d41dde136465bfc6674d7b30593cb2500ea32f7be53460203958e4815ed182d1eee04e4d28c422751739b2b4f9df6d37223d424fb531ef9a90420f7da26d5c4f49d65740350ec44a47c7d8b214f67edddb2b6d2f366fd161a525303cc1b9c7ca7f60a7a13bae3bd253a84bbc3d1a6dd093ee0eaecb26dc31d28305230f5f5bdfea0fadf48f3aef89d52b8a37d4c3b09be7058552f62f5687c2ebdcd51db68efc2443d89eb23d55fd36f212c97e8afdbc4f028f9049c1e6bfd0b045c76f67e7abb89dc624371e0589137c83c58cc88b9e26558c0b2886e3569670de8e66ebec6b118de519a06584d9d52b4bc0921510de277ee9183506f2e87ecde57ea6ab13b6c984b3d360ac5a5c069ed95f20e8f3e8acff453bd19a9be21408193ca12dd42b3b22b1060a4adc8c2247cad5bbcccb4a31571f0a90ea34efd0bfe82ce8fcc41500e87b160fc9a1e6b2a68ee8c528fd7f4f16e4f8f54e544e5f65b0e3e0906a2095366087e3b130f8324b93fccf9610f4709f258b716f70a9ea8a21e61a711cba729d1fd0289a103d1b9788765d9c9c4620805f3687a6206f3cadb9980927726f23acf78330dca621e92acb09d194f5e0e94af08eca8ada2ab040c69e3f2c019b12b68615bf0199432565da1bde27b451355f97f89c960458dfd3f75d2ee720eaea7a4a0c0591301d5ae93420c5bd6e139f5ea4088050356635e7ba595ae176caf548c1daa714211cf42577bd4ade79b48198b3431831f3ff3cec9e1735b369b7dda27c163602d2de7b9b0345bff36d9076be241cb6c3b6706f63011b61d5803e0e27e72324d5cbbe7bca755eb7a4c043f93fa50a0e7e036637eb81da41b040c9f1497195e60582595f243c6ca45b085b839d84af61d9514d40d69ed867ec21e84177c9f30c3a8d1b9048c6f408aeac23a0486151636e2691f4b4c6aa36d1aa1559435eaf09bd4291d998a39976e83258d9c0b9b48594f9d0de2687a451195fddb32c8e4e6136593885a460a151b021578aa6fc2d3ae65186677c506b292ba9ade9a3f745950e279c1eec7cc04b9effac5d6ba74015eab43f2b56cf7331712e02673a181937dd34291ff1565aa6fd33b3ac7f5981891aa847841643310c824387a66f7f5dac0c056c03239bf50663542a0262816616ee844c2c6b5a491ce7808a31b48b77741321d16313ac03dc69d76be9a59d6241eefec96ea6831fe5196b96a399cafb229b1ff5ba42052bbb6933f5ecc92bfa9c947e2bd5584c19e7807b49569fcc5d2a0c3645632f45c105ea0054663dabb37957690ffb0113eba6c5260ec526ee121cdf2b4d084bdc585e74b303f083ab217ad065c23a3188f9a55ff24399dfdebe5d9c5579142837762791d281163b88a92377fb0f3d59f9c865a966a42f1aecb67ecc4b561134e59ef3b9d56841b5f2cee5c67f335efb14dc6a3a099d0f78b69ef2c7836089f27537456532060d934807343488db298538aa159a518ab569badc4c468434d8f154d38f2c7ef6c44416e6b15a9e632798f3b61a42b519bb7e68030da1d42f98b212f8435822c71058ddf1cf913667d3a6c484cabbcab68c275c879971d9dd43a52e1a04a0b3d37c320b9cf180d755a82f399ab97df8ed91e4f6fe822f2baa645b04cd457ea8c862703e6cd991f7b92f92a16c58f1d62b8747c5bc5a42303375343566885a87f26d93d4c -MD = 10e88348b55c5c0683f4d4d3ef56c485be9888bf00806040de25204d25df4ea6 - -Len = 35360 -Msg = 6b1d94bc0c6e45fc905c509ea667853e4b2c5a8848dd914efcef14d95b12247d3766b270bfec0ddd453bbe334474b0c3a177958a3157844b7c0ce7e2c06894d4394d3a2aa01cff80f2706759720d78b5f1131ce64d78c69f38b4584e3abe45abf938f291b9e6630e1f6513b63a1a233cc468b743a4269e71b85031c5d2fc7d2b0090a44e113380ae54818af2a383fa7fa0de30493f4a53e9854638f18f0b857cd5be1609b0e99f891a2c93b6b53045a710dd4ea125cd2e312600367779d1a5c5012811699ff208c6f8cef8aa79094cdb99cdd8f35e95776e23e4f2029837242f0a385c16e534038e77cf7f75f6f75644c51697e6f38c76cb055c3638f5254ce17a55c1b98a99d8091d98f1bf35e0ad091b205323eb99726e52cfc8c197846303d8e606fa9708ce5e758f15323cae97542354d3524ea3b57f95a57146863ab2bfad55f48013682eb6041db57415475d4a6618e11a259485275345f96fcb31813b800953f406a3403854aa972dc89547156bd5432377532b8d161928e36d4f189fd96aebfd78a04c0dec9f84065b7e9cddbaf4c2164cc8efdb6588c64b747ebe1440e0834472479a5c546244a6d8eca6c9dcdb269bacdb1836c9fa9a4ee9a5bcc23ed3e570fb80724e155d9fb746c6ab0258f43759a074f0c8c9d76d95d3ac5ad05aabd72a1c331b0bb6f75ddeaef4f4b0b6a6bdf92f7bbdb9ed8807c73a7ae0661dd0221adc48debabf9745c5175dc9f97f587f2262d8c831bd73308d26f996ae0eab8ee743a70383b8a7211489eb71083a74467d40735957c201b08fa010c4cdb5a2e23a5939d28f2a8eb7730d8536036f61dab2d134b753839a4e74afa7b1ee9a1ee8ba27e492069db4cf88a9135e13a78703681d042c4e88a7d3e55ca7a63746886610b4918d10978133fe677e325f684e89472dc9fe705a8e0889aef6ebd0404625e3082909d3a25daa7b4facfa103d1e33f9086d76e080b9b209ad7dc8e210c2eddc2c924f7a45b0fba76886fe4dab5fca23b6d6dcc7828e9c0c612485953f6285a327b6a72b09e2ef2cbaf4853f3c79177040ee784ce9778d3bd3d469105490b7df017b580e745b4eaf4ddfd90d77d4df85ad9b91983cdb4c3e0a73bd7cd7b34938c3cbac4d1083e0db2a2d40e0e4d8ed0d05c771d20322a2bc0eeac90050320458748de90d65c36c5558c803e00cee08ae50595e23c7b3575de822d5c54877b0e41ca95879f981bcc8df966a34767cf7109739a1b30ef833ca9f0229f347e91587c30641b6572696dac881bc05aaec83dce24f82a96358feab3b710db1d3f0fae7728eecef041bc3331a70437a31a474ba3783482d4b3b7fa7c559c82776f429ac3128a04a89c70b7cdd4a45bc920e9251a0bd3d6950097f6744a1a37eb75d687f06bca7ef6f91355d19f90bf25590a44a24e5a782f92bc693c031e6de1e948008fb3347073ee30b7dd764dd450394744ccbe3cfa3ce071cd241f1d96e34ff39ee1773c9ba7c2453851f7302dd2381c8009e9ffdf2580649ccd0c9c35780075ad96265752fb3bbd61cf70ec4e13dbf690ea40179971e90142a74a1eec08b14ad73e5f1928f6a125ceb691d697adab61f1de6f28abba90e46943661a0d2db8ff861a7006a012a90ad9a7c883acf81ceb1d56a5879867fe6a7b11cf122b5fade044eb07843ae7a9d90d038377f09ba6fe9e03a1d8f1f2a82ff2a3139bc90706b99e0094366bee2a1ce35a613804f0d018de35e2711af324816a67a21b58bc39d7ebfb9471b58ea042f72cd0284ca03ec6689dc604a5d1da2b4ce019257d07ddb7d94c86ea9a41b2f7b2fb6edd5a123983c77beae815275f7a04acd72e884258f5c073f9e5acbfc887a1367bdb9fdf56dd7580cfbfdb5c1afa3c1e6abb1d24420e4bf25c174f51678f4c7ea58790602d4fed2cc2e07af8a3285dc5523fae061f6dd6582be4049ef68b0f347a85de3d1337b8d082fe76857e70e4221c40bd604790fa05f7d06f011be773e8494acbdebf31432c7e6e507b038059b52742bddb6114219c3e60e1204e41150ab03b0bbd67d9269123b49b51d8c3491f11da31dfd263d78b6e19fd54e4046d2c3dfaf061c38bcd9f0165a99274c61ca04a6bcbd6420c96440560264793cde6cd50ff2c5448b5c2b695f61dc55de55ee96f7bbe57067ae856a2d80e50d3ea0c5e87bc121d7e0380785fea6a530abd8a6acf8ebbfab63b4843b4e5f8190b05586040b64425c9e1a134ddb711d3f1bb29a509193709c7ca209bca1e75f8cf9c55631a7224f5b2cc8fac8de0a6b0a97aa7189aafa23cb1b42bbf30f62a88881b8de783744715df40a62fef0b8b9198589d3602b69fec1a65a43ea7e16830db0f6c6e0a312cfe95daaf4f8f7c52cf54e176adbfc28290587b348a9d74c19a2ee46b572d3d49287cf6e57bddc77ee255b1cdb05057fcd1f24157336034c91cfa3725335afd2e1bfb2203355881727311360d1e32fb61298e7486c9be95e141c374049312054e51a6f8632c9e2ecfea2ddaaf27f60141ff73713dae070caca1212793f6e0ca1c51f6c69fa20d1409cfe23c4e6e081e21dc47b3f660b82d7da389ce5dcf55d02aa57129033623f5929d04c74560e7b6933881d94b72606cf6d163e4bc9cdf9bfbc48c9c586981380cc9dc083ea1234ee8ac984da7638e3f8aa355e74aefeca20227cface9ac935fdadefe6b949f396bc491218d94a4a039bba1c66293191b66c057b0b7419fd8c18f54d28dd1cb9881a99e84159dc634dffc453bc30fd8da7ed8ccb667fa83c0219cc40edb90a6cf14fa2d56721d38ba96ef163ca51b8fa84e9e0f671b7f18f7e47594f9e13bc15bba48b60f2fad8caff2e69d3f6560be035a9288496e49cfde9ecc502a1b4d9bccd617d124aac93293788532baa059d48a1758dfb3ccd518f294e37e15f640a670fce9f71d7ffabaf3ac4d7f44d281739b29537e5ca3bb74c27b5d87540eaf72069321a0702bbc965ee2a1fb5478520bc4f504dc9aaf6763ccb6bd045ad1047eec3d7155c31a794513c0250f6ffe561d860eff83043c63767feb746d90c9ca3da0503b9f6cd8cb57d0c939540df0f8195ceba5fa1fd73a2d6a6e062bac657b2ea17ff2e5f3f32d3f1472614194ecd29fb7ff9aba440c45e90ac2f4e6f44091d28e1139b1fee6197b4d303f50cb4e501135cf403c17482149df9ec2f80ed7a8b9c4c8628bc41e1a8cd9a72619e7a20b0e44df3908101756b06745f30762871a54d3ea2ffc0a279b04783bb80590646df763b3d796b50650cd204cf76d85fb81343a0ad45b378f35427752579c4c11f35d20c1be708c71a9e0993862c2ef9157c865bf0251b2a153e775af9756713725bffaad502decf5bcab408ca78015e51881f55b3c58222a8163f19809bcb6509f805fbb3f177d1f238d94ae482d7f534e015783e4d6fc77383859aff14771daab5ede9fcdd5b33a58f83431c733b28852c70abd8e66b81402e53c5c107f3a51e3abe5bfaed105f3d77b7dab973b25e0e1338d5cab8fdb8d5bfb0820d9dc8632d2e8038f34a20bb829a7ff705a9c600953e76e05deaadd4fbdda5b92afd7dc19e3a3c6a301b13b13b9de282463efe74e35532b3d6a4033d7a30385261519a253b05f9d8f9896fa7322be964c55ae223c0ff72368010885c1a617335fabea8f9ca38bf6a96bcbe072dea9a83ca23fb75f3e44051a253c397a3185e4a3d6e2ea4147a96084edb8738f582ffc89cc4d0d346ada3ec83983c57dcfc007a7189b48ee174879a6a0f53a2529c201b8563eaa37f02a4ef6c057c058eb661abe036c21ff9cd9908327fa9ad0be00365cb29cf4e678a4942a5c20a0781ee89c6d09ee1bf232ed53aee5411c1eaf5b28cb73d093dc6ee9cce76f86ec77d4b81b48ae998d6293f4119e6b51346b584357a91c720d764d6a57927cf31ab4a75505b563e70ccd1a7e88b62cb38a435349215a1f19a8308e86b2cff6eda1daf15fea57bc5f009e40fcf79a9bd074332aed3472ee101ab7ccff6d047fef18476d3947943a8a0f5291e00cc04b4098c749900f782bfdcb686314e4b48a6ff48655619bef40c08f96a7d826abbd8c4e5c29e1f0de3b4b40cefb77c87478f8bd04547955ed71bb17b6dd35d3d1650c2b7e5653a709ae810157e08876a8fe01d86dd4d104034fd22e5fbc9992c5c458b6ba695580aef827838fdcd77de67c23dd1f711934c53dae39ddc073f1ed7dea567cbd682c229aa74e032ad54ca165d7419593a256a7bd97d0dd83457fdcd449a151cd2bf80928a8d72e7512715e5d849c7cc71cf82f622779bb7f8e7b0879ef2dc632e172c70474a57e260f8a91c5c4541185e987c0ade59b140fdf91f4d153323669592af0c0c34f7ec83cd6d0310eef005a888400035acb63ce8943267d1e754eead39efaeffd1bacc62b049e11dcf3c5bf8a7b7204ef6127464c1d11cf995d6c31e13d59e48ac094ca4a82500aa6d8ee1f5fec7b152c22cad1787e4b5b6c611ad91284923104a4a32f1bde9a6e0524c60489459fd68956eb2a9ee537a2f016d74ae8134867f35e747f3f87e1ce705e0a19871564ab9f93f4ac3fe06b38dce52df1c257c10bcf446534f60caaae60eb0698e9ea4e16d75073c0dc0e5a8f7b528b8841c0b06f00fd11eb0feb69705f62683d2222d0aab922f512e3bd9a1963f57c58d6fc7b3420eee6fbcd82a2d6e43a8b60b05d70c9bd61d51cf77c8e591f347cfe0259a5edb7a070f1bf90fb24680a0c9e1508c3166cb3a04977d9cbd115a609d24466b4ee2db83c776664b6fb8327585fe0a33bf34f9ee312f543b713efa0bf902db21cc80b7ca5d7528c8ace9e38fb2073bb4ff2ce7a2a23e048f493f5eaea922eba620dd984499bf486cb1041a5618a7ebf739771dbc1d6d967e8c3d0bb3762b7ee19220055945fdce21c52f60327e8423e3b53c23a66b6411f2845f8b8028c69cba6a72877127d6c0ce31923c8bad46ea62baa482c654ca7dd277ce647f879a4e19effaa5f409f3285b3e5736c96e96495c91d7c1869f47e306aeb121165a509be66ae1e74ab1fb0daf31a3d654871c47b783fc684d16854a75713147af6b8f8c09234ed5dbe79778b455a1a594c07fec5cd63cff827f29ba09087660b18000286b626af80f756f7051f1762af2e3674033d2be0f8fa3de3ba9baa7f484624a77f26f5cd74f222afd6e4c4dedd4b67e4c24c1ab1fdb4a4ad63dd0ed8990d9168187914dfa01b57127f4af4c77a303691718e92ab8ce3b1592ae926fa93cad0c4f131265ea8ff7ebf7c9629b4fc890d3a9f5946461d040e878e24856dbf2a5d3e87c38cb2e5fb04174d6ad63fda925620ba50880a2491f6b8ec23ac9a81a8a1454ac4ca84edba71aa703d8cc0ab08cbe440e8da703a1a145de36b0f1961a24769c899523d369a61f96392afdfd448c905c1a6d010d408e1e7027f1f52f5b3ba2c7fd5d65447373f84b5eec1f5eccec805cb0eeb5478faea04a7b46fefb45973fddefea962960d74cce5b6759b6b275354bb75aec3af4c971761cf7348141fff6e74686dc0b989ac32519e0d48c5def583119f7cd6cd8a639fcf04cbe49b53d6febec7762708384065a7fa2b76835229017bd0e8167a40ea1e2e18cc5db0a1751f4c8054ee3895dbd7574f42bd2a2d586048be62fb3bec95032d60170c0a9564507c27ac9e912ec907ce21d58530cd2e2006bc900d6909ff0f4b6f1e87ff8c2f22ec21cfa0c86fa2579b0666572dbdf4b1345fd1c5a8058262e6ba554a061220170b0350ad34d4f2773c6177bb877c5694601cbaac7f8bb9ceadc65ddab4b3f19d6740b20c6cfb33c730c78c1ac494be5a0877bd2a35f91fa2ff179ab291ee2e366f7e6656e74ee0c806ad060d6b73b6729bf55be781da2e7069228e5a241d1062a1f100152a5c740a2c8697fbe2a5c96ea92a193cd9ab60c75a7bbb49c1ed52b2ad5d01bfbc80880e10e8947ed0b751beae6a67c2b3d951187187a3fa11cb5fa6d026ddbef477773462479e0eac04f9d32a5ad9f1970069d41cdadaf38a33b1afb8c306ab888ddc2d8f281713db3b2c5c8b5fe241f9bd358adaf9c2bea1b2d34dc5d61f0def50115a060e8226f4a653bb600e134c524c2ecd2a48fdc3dec54ef195b4894e7f4ad12a457f81d07ef32a6046c9ef794749cfeb895cde9bb7f78f4b8702c7f5defa764eebdf7878d09dfafb8e37c9413f32839686b9f7bec3a61eac48357d9c74db8b1867c2e8b890035fd -MD = d46ef45eb47aa54032fc8ea47150d10334b208dc6b7ac5e09e8718231e87cd1c - -Len = 36152 -Msg = 56ee7cbb745a2b1f3a77c8a9bade1e4934a08645e7d05adc2742ac2ab093384b3a6998c34dfcb71d57d688d3fcd7f86ead7b21ee7c60c06c2e02e9fe92c9f9db1247cdc088ba319253d99b44a9cd1afb2e7d8970c60e0896a8aaad7eb5817677070e8279cc9c81c455086ac46ac86c38e12c26936fe41aa2bdc35f70bec39767414821b7c2a990fc86ec5b1be7d1d56cec13601f1ceaded894d4699d589544f2e77c114212e944810d0cd710c7ef40e177b7a0db77273d80566532cd290165612133bae26364869d13f0476cb22b92ddaba24c9028a31de12aff22c7d90ee2fc19f4845f5d233f96c02111f7528cb4a9af5bce06d76668443929a15511c4a30bf447d780a92d55b53b269f794c1a8e8dac6a8c052b7904f1ab6b173d792c91d6ddb41b0eef8ab242ad8757ba4bdd08d0ca58f055cce3db30a74dec48b84d92a5fac4b8d2d6433c853dcda381f5de0bbc30ab60bd63acd3495558883e77308fbf73fe1691075fddc5147fea98f2247d9707ee460798ddd683de1354e75ddb716d71eb9d162ae67c4c592593c5ebb748aa76a609f9127ccb286a06b60b13581ef71c11b628e6e10060354808d188a0523da65d115c7a94997e20ba177140af80a59bfac78ee357534ad06fb08470e68598bf9ac6f7772a2ace29b6e0e28de67ebe172e3a11ca505c525122f3a54c91c702e8e69094b248655fad827726a107ff8cb733757943d403bfe1e939fec3aa02c549c8d7f9d2f5327bd3a746052619ed55a493e28ef5ec30dba74dea557e371d270bc803ef803a7968c3acb347c1252f6205d6e717899fcbecccd56e7324430071566e7c3e641e226fa61928b31c32adfb0382eedea6f6bc3b770a2e205ed393ea5143aaae25a916d8a4770c12df484f68c6215ea9f5f7eb10d1729023d4f1bedc25cef6076ce33bebe44dc72cb26ffdf0753a9f411eac41b30297fd462da4698df997c610e0d57af08f23c1c93bb09fdc3856196ec81da46b3101de4f12f57c46f62783922a86bc2ecc8261b125121d7439fc34f79b51fd81863699072aeadf4f44059656f1fee7eec4f011ab169e5f009db458a64150353d2ac098361e8e7af00ab96521de46e4789ef73981b65b4dc88f07ed415f2232e7452741a495e6357171cc5abe99659c14831f3ff9af51d014357b5b91a0d0dec7fef1fe1838fcf919a0c5dcf3c963f60a9bef8cdca688ce2bb79a0a5ea96020257ea8365cafd7ac32bf2c528a1649d9a10def88f1460930563eec627025dddf48edd35036a17f3802f88a26492a1e2f2202a79b0234dbdfddf2f8cc8eba4c057972fbb66fb6fd83d27166bff9aaeadfd5a1a02ed51b06c208fa46ae8210b7790035a7cfcf975877e95248856241b5d1021361a734a193c01e7e5e7112d02523255f5f031dec98fb91c4b8e04b9588edf17f7270e56e89c369a8c97e07a29feb3018acba235cc6f610ef3f387d4e6a1bea0e5cefb02bf0b22f9e0e3c282d2cb96887145ca790e852affa64f5c115644334e8a68e5f80d074b988b5123f1ad47516d52151723009f6b60db07fdd927d4d1834d8b4b81432f34f8f466a12109f0782295b024ce32eca6d52aa3f996cbd21de1b7bc885901d1639db4aab6bb89657f4ac49d5fc5161b61beeda9bbf4b2ca7cec416348c9b9ac5be93493c10bac04eb48673334c23a9a20a0cc8fc15d9d3c82f57315f96deb0e827dfc987c9bd26d209de618502010f7680d2fdcb65bbb96a4bfe54b16a016768bce854f36069cecc3ddc9c31e792991ac668006e759ce67668df0892d2abc72bc5d671e89b68c22596aaaba1c37f517624f7594f0d2263d5cf22d46a9484d91a8ad1a9ce445f0ac35d6d163b5e6f3f73e1a791d4f7f5376dc8f041a17935a41d5300820e21f9ac90d95066697f0b6af7479f2f67fabe6a289a71d69f4966301d678b860efbdcb27354782292f0fbdaeb9c08bb6fdd2505ed8fcc1bcdccbe86000f9b3d3799b023531410d21d77e697382909bd5469d10fa3ed2a9891c9e6adb093582ef1c51e081a623efe74dd75aac436cbbe7d666b9034fdb2d6540a86ad133be9e1a545cd68af862a2ffee94f1a790b7646549c9a9187078d5c7f55458f134e76deb9e2674bfac8feec23651cef3eef31db40d207188453e2b27873cb5a971629ae976491bae370dfbe4b178631fa2c2407a9d25a301328da61a92cc11686d928d8a593f5bb52c5f72cdec933e997087851f7623ade1cd09df07847cfcccae09be44d373b592f106ebe4441cb1ffccc5541934b4f2c879152e74f8e9c834a73ab5af6170b9962996cfce648f7d911bfe260e35442213cb421cf95c7d143eeda7fc307fc0b85d3a8186f2aa55f21be2b48355047bbc52480332eb2bb15149e5c41a7eaaee6246b859a9e7922aafeeb56ae4943eb6121253fb08f0e3211ff4242168c06f5427e10781b113c85807980893d222207dd3c2837c07711f46d0bc2d528fcc399c89cabc8c351d9978b98650c1d4a5664d61f16b2897023c8d041065a9f7e89611f8525beb9e5ba2070658327754948caf5d0d5f63601ac77e2a7f71ca39bc016ef4164a2265545e8dae8c0226da55f00e2594f4bedb314ca4c487b625ad9d080e2d952bc312ae4b66f2805442fe802d044c16afbd60cc386b6297b73efc322679e54d65303ebfe53d72d3bd7e0999b00c411104d1b962176c754e09888de1c93cbbad7b0c320fa88bbff4821ab41915909502888e1d9976128d090194eb427cc12143f1c9a52421bc3a7166bb6674ca3bc869af5535c8b0e81a5753e68ccacd91b69f5ddb0083dd4962c8bfc299334a684bc4edc96a7664679dc764ffeae11838dc1e13b2cca537ddd96911e2d4eb1290af92b85d54291d1b87b7a933ae3c0921024eb803620ecdc3fed0f17ea1e2bf6f5451b3736b67277e78d6b5342f21fce4e9bfbf2f89370bb653aec30878e0ad3eea8063be1897300ae1730d73e6398feec2df9db97aa47e0f68512b12c23b6899d2bd2daff46fb33b423b16757bf91ec95e3cd813eeeda139bd468e2036797e0a9d56859b87271d9a2b8d64bb48c745eefc35f2d13e58f1efc31d60a31e1159fbbafb00333973fba1fdf87ca7f55a81da2d897263e19cfc8c0a34473e11999907abf921f993ccc9ed49fac2ddd9f95f157275eb6e81203d890339a63399889798f0ff7f411ea804d68002dbdf8f4a3a1b6ba9a233956911713e7c02361e54f23a1a7c5cbc428c38e840af2bff8db3af7669835b6586fe34df2c99ffb82885156598de6ecda7efd2bd0c6e37e05ddc2b910c915b76ee55f41d4e11d32c40af9d95fcb409f7a7496eaf33be9414581a3b05b56246ea23e6fbd623523124ef2ae765a69bd2ccc93f6949671ea4fe34f45a4f04648221d047a8744d09ae149c8d7f3f26d44daf96286f16071cff105cf115d76a16b1d06bee86821b768e8dc15de19d0e1bcf3296aacc8fa42816fd48a6da2966f74a586f52028a1f4776f305f2ab09ccc0fbd8331d1e20bece7117707c23cf8b94b03c5308c8f6d8dadbe6c312380fd37248130415e083c78e81f16ce79f44387d87feaf793652d8df41cb91031509c29e3865822b90035ed6ee0db68f8901fdf03601ed29d7188f933d33f86bcea21aa3416215a4c929d53609dec5ca9d836cbb4f0884a127c27db5229251a2c1433c2ff77b6737e881db3a59e7132f3962d52d37551e65b4eb23a38679455e9977a7a2cf23df5b6a95c14272b93733d90af7c4838a02fdeafd01fcfd4b3bd5b3ba0d9a3cfdf665ebc037ecd8c79a6f18f6252fb819eac04672991febaabdcebc74ae84d56c350dd8ab9f97f084d53765beedbd49872e5353d6698ad5fa33aff0522ae10cf123a9bdb278e25e8340234bcfc20bcc44662dafb2f3cc40cc45d01bbd033d581f3ad0076f444a875583c937a3427994e3fac59672b862c0936cf57b2fc7f85b58f307425c924eef4e188fb5c3dfa557e874a1c4a037dcb9e20186bb24d9b06b30d4b5fae4e34e0b0f76fd42cc0a1d69c46c4896b5f2a8a13aabea3836b8e42c3968629da2a7e66f0c07886b0642206f0a3a30a94e59351affe4b69ecff601f2d526a3a71060a69fb672b79b1d287cbc2c76d068b40c209bc414724b6b1198738687efa3b89decf1a121015f6b1d80f59daade51916bf98809e383ba928c2612d014ad2005c048295eab0c349aa1bb9fe03e80e061090e8443ba8188d0d63955444572887268468b41692e970655ab1f96aa8eb1ad53fe04f401e222a07020af55a2c659990646bbfbe3ef134899cdf923874e31d0ed467ebd623c148bfa9aa586a52f2fe42ae72fd0c3d415dbeea2b1195d55ed66255675e253e5daedc5f5cc59d4f357ee36a64b7261643b3ae4b7dbda852c40e7accc7f154f75e25072d08831bad98e01b9e2b3534515dfeffc7bddf9a737e8dfd406fec8bd62d75e81996db0bf382ee9454aebf5f77f9055966d3bf92c0f21b94ba4697f4643066262eef1595aa5b6ef393d59dce0f7e916531a7a5b9c28980e7413639b428d0bf6a71f979e3598a29e3648816aba1546aca2f21d93700ab839ddd271cf6aa754a5bec9d4e1a8879e70acdaf731bb5e35831682aa23302c1ee5e96ff86e07388cda2a6c4de65c08f7010d932fd48d4922342e5a84ad5513187d475a7c09a0a6f11e6a7546fea87348b9e8df9f95a85cb92a4ad851747746517a58107124df794ded0f8374ad168d0025cf3edb27951f66e00c8a752aef3c36579c307c321c35dfc08a053b743e8cb9bf112f46fcbbf797ffd3ff8423557b53bf941901d3df5343235a792fd68918e1f06f2f7777b57bd8d44195e310127a25fcc058866ca158049ff16da6667ea7f55429cdf13afa12a607c5ec3653debf29a9b17d9e7efaca90a10f41538687b07074e17928b902629bf4e170e270f2c0cb40e7d69e8d541173a0d492abc95cd8ffbd16bfa27456d2074624b27bf9f705a75cc4122b1a35c31a4a11d013a14677dfa74a1fe2ff6fe78455f02f675164243a57e6bea898285610f727982fa0dd13accdfc085eacd629afbee4462919c272f0bcb01abba9a450f4228649543a9942f39b9d079a1ef20ec5eb61a555a58a986705c0d4c8a1223a1066ce7225f0f37c309aadac19c87c0d835608bb719734fb19cd896b54213a88023e609119469425d035ce44523bbcbc54a93a06e1715a11657e8a5ce29c45a14613dd24a2bdc3e67f174f9ed7eb3c81b63f860639964281e6934417f894ec4c588194ab56b92b248999d1ea1f4983f414936d37eea8b6b31996372b0a8d86bfc5f247a3b9eb32668c37d5d49ce92b8a1c4f601a851b0f3b8b01e4049d08bd91faf0369c20a66222f39bcbdcd55c8bca29be0f3c715fc4619770cb432478f959840611f33f9d42f05c2034715ce63d2ac989bb0c47f96eebeb3d6d553550b27cddae4a577b125d45225fa0109848a832781d04088d7a6730d2f23ac9444271828453402747b809a7e2b48f592be66567b1f26acfa65565b70b29c3fde5a0dee0f48fa3e149e0d08f19c952b96c31fd3113a46fb0170cc304e03e99817e1e234ecadde623e64f6a613408ba9fedcdc824f9ad735874230790febb1bf291fd16f263a8775da1360fc4dded079b351c5ec9e0682637321abbf1a329cbafa5dff2925b89e7fcff4759305400ca39c6a04986747ef8bad566589d9a0549374e297e951eeca89074f5df2a42ce82da06fbe0e1025c5b81c28855fb3fc7e527ef8bf3812a6b499696c40a1936b0b21a9a71ed70368adefaae133c91010c5fdffe59f9dd0a604badd92452939c51f869e5b497aa6d84e3a3ec8995058a2ce9ee1f261a0f3b761f14b0a9411fd01c96566d36a7f633d51a0c024dc7bf47b443c0b672ac9e3a173489b1d56e149e9b3c5eb57a76fa15e5d2a193e27d34a63cde0658c25a1082ce3c6b510b322844385ae142f28d1c7041bde2f5ea0dfc3221191d7a877afcb205973822ed25b15d8e629c9a2162d3ff732c6ebcb6f27c77fba5749054b7b92447c58e8bedc1466707f3cf2f9990c70ff4bea35cfbd33bf436d3aa3e9c78ec661f57cd007f8d5ded3f8f2787dd8f4c2e40e50f6b0b28c1136d443cd9d136fd03f6be823524f27e5c8f8504173fc709d6d220214b775b927209779af6958a616a687a2c7e70991e318276036262c0569643008792c2f4268c95ee53294bebc025ef1b4a60e4d9c408b2f293fdd913d8e8fdf680b5707b03bf9d08d3c686c38fb2e5025a70f43ce65e9b5b345df539f74b6d82cb47f26890a77957bb62b8ba268e04dfeb13114b2b8fa64072e7599b384a3c35c5beeb3583c0c56b789264283b33a8f46aebee8cda286e12ce4e78b02241d47fee8 -MD = 982c20c2493fc9ae405b74b65a022662c014a38ef3d707217e56e57afac05994 - -Len = 36944 -Msg = 876804e2e7f2b045cb5f6095fca5411b31efe0fe8444400923632aaf48f2c44c6bd865aeb6e8a8d4b9bfbff55fef0ac5205de8f379e7cef6994a96095e4319747ff5ff0e0b8bd600121e62cba1d9348df45b7e80e85c26c3af94195dc7d8e27f2d877b09ce2463503e44f01eacabe7fb16b24aabb9ec71f8cc085cb26df948f3dc5580a7e7fb764ca5f912f767ad4a98ec2af37ed4dcd71e5770071037ee735af328b7f13e58387daf05705dba2686ebdf8a220121777fbcba92c27f0dfe8a3bdcc8c8eebb83d16ac52fb1588d60c27c589c7e3b8904925a5c363308d773b51ffefd5aa747c3689c4d407ef0c8a127d4bd26b034f2ca3780a52605b27d931e8dc18f1522c8622599b1017e2e5432dd7a77f15ff4461297b7fd29de86e8a7ea0d8d45a36928a631eb57375a19175b0bf6efc534846b24d986cc06678afef64427cae8a9844dd8b419a9adb9bafa63dad18c69d7eb4b4827767a8647c8a8ca5264e040d279213fd5ac0d2a4417e5947192b5a7ef31ccc6a60e6f712648cf693c4b3815c3528a25bd2bed75a33ac134f9c1d445245fd8e580d6148fae11591c2b65382f271772d0941eb0577d2b748c99e7500c207b56efdd56cfa7852a302b47384956a4cec089810ebe987af0e8e47a8b91c488902d2ae4170983539e3adeb74ed451e2815c98ac827f0043930384c335ff3507a347dfbea02be9c172617da42f3fe98a372d453e025b56801cafb39d6d022643be8b5592799ba276b08b4f3561f3e644f91dd85f16ba64d891d3ba30bc0261e4e8e1d6892bc3761b60a29d936e5910b7ce1398364704f0f4fc57e1a3a967ac932a31a8cb3d0a2c58888dafe5ded82e8cbef8cfec1ca1c37c6422701ebd99d0f88b63147f37d78ed43234cd5437d70a6bd1b2c3a81ef9a517d21eafcb7e0095ba136062cea2946238657f3f0803c06afa102abc93d3745e6d4d32e6d07604c281ca0edadf04a8712b2a564c28c9fa17e4824804d5c57bb527dd465c552d0e21f7b956c4dbe87b835688a13edc12edd9cf2ff5e2957c7473ed8a435a832a8478c2e72067e9d375606187485b4e6501776420179dfb7fc960665d0f2881f5d0908a5c550c324ffecff32f33eca34a9ebb4a5c977e3156e0443b5d930e78165831f821dbfbdde37e99b4894b3806492c6b29eb5ecd5c8923e71493b75490158622b33d9c7c13185d864e9c76899deb1350abd653d2a7a0f81197056441f07bc12d64b87fd7fc74035e66709d2590b7bb3276245dd43824c9896fbd801ec1d07018b39b6b53bf81d8e9a70ea95508368dd932dd661d379dfd1842c3f4332a9afdac47ed4a3985c745efb67d80612deeef0c880a55f3cd91fc86b91da9c85463cfb1c9b603d175cdb0373ec50c9126694a951fb2129f228a2e9b7bd5862567b24eefe0fe7e63b81b828ae5ef332d1c2f073aa1dd84685d0ffb1e31f372928a10e22e35cea337753924b05302df7c36c68cc4b3939598a6a9cbd9827d5756e504f335702d5a95d5b0fc713106f7c79db843faffdd2c7627de0692177d1cbaa116e9cd38248bc40006749527046356788d92a62dc231490539141297faa906e6ce2cbe35ba1e0d1dc6f3e3dc020b71f0cbe38ee54b8d5a6b3f5d21abfde682dbb524d010f7fbb85475e024f90bd7602dfc9d7bce7f26f17f7a4a86fb8dbb75a9523aca71e30a0dcf9da5202524af6a56a728369066e5556971410b2eb21029772dd476ff873453b3c5a99f09577bd99355ec84d408b2d052acab76ec74cde46ecf5c9a63ea5fd42b7654694dab23f30e8d5130426e76a862b4f190dfdcdaefb6bf38ff451474d65c370e4598298f01ecd7bf00819f1726c0107921adf11f927685d26d4b0e5ca271903ffd92d7a74a58bb9ebe3aa37f929548adf1febc8414d7aa90ac20dffd8090094f57e4bf541878c256301483943408e5f4c77b43f2bf00b5dc836a8f41b7e22ba71c36e97cb174734f1fb8464053426eb56dcb904fd9192e1dbbd2270f918e7dad142f5b085e7557f152cdf46a396a6b5aa997ab85ab4c9eba1cffae4e54bc88ca06781fe167a3f4a593fc96fa2ca9644a44879a7a7dbf8c1d6e9a2ce84996d266bbb93ded1425d5d1a8ed32d77527e2ed06426718979a80ad794aaac4b841e5eafc99bb16ad247fdf5a47d3eb5c0b6cabb6711a45400602d205b82ecae9e849bc8fc0a34379c77c3571b27e1d287e8bec1ebbb9ebc12b9bf4d98bc3e223b184463cd7fd5cc137523db5d83d5523a7c61804c94ef16230d27bbe6c6ef4b0c420efcd86cf48cd9b8c5dee5e177b93afa5973142e03f6b3d30d07c0339e8d64aa51e087423f1e51cafffe3ef1578c1bdb0d16dcf78bd247c3c59dbf72ba6de6b993db74a003e51e2458a5d313d32f5fa702f7f181d53d5137e7fa3f14c17104e86b3a0af6f175814d66624cc9992778d6c1731c4d7e9c52a7eaa9b98a521b31cf3e88c4c766444dae8fa006931808e9f2cf2497cae673deac5438c953dad11fc694442c9200d5b5d05b0b9b00be58358392990e7abb5857adab03e8f1da470176f2f8ccd72fbe6c5b4ef164831a79edf1a22ceaed5bbe503455b792f4bec19958d11300076142c3a7e20e0daabb0275d5747cb783562a5ad8faa051dd16f549d4b52f70b334177e3e9a9df0d7fe666f979ff4eeed1900c9f3f07a900b7136857325aa996b16b0de87ff3db8ab733a3dc07b121b8b32e6302ddd92e8003c29fecc9910e48f9783772c8669cf85b7e252d89c70a7de325f2fdf1885d46bf633f849860edca12523da94b6ae90071af351588a8d2e5675b01b9047cfcfaf2de9146282d10c304df67b490688c4a03ad1bbc8bbc419a49bad85e9d1cd344a51bdd5b00613ddcd809fdbb1fc64b7d18621f491a6b1e419129bf1345d2accadf016beba9653dbd95b646e881eeef41b9b589e5bd1d3385458ffd0083064d37a87a821da9a0d80d43d08b613d464040ed8ea0b7fd3a460b6fd6db4edf1e7f31086e6b198a79d575eb3e144edb38051fbcd5ade8612a207e16e5a125e1830a6008c36f08d35afe9c93e829d8e32b08892e72f89f7255898443a497ac129db66eaf62d4120daa192b46b61227de870f244c4ec905b62448c5fdfb040cf9d44b000633e25ebfd0efc90990166254b3e3981d4f6842b7fd27eb4cd2326c1f9190c1131ee3157136481fe65e7fb1cb194c8ea95e1c7dfd49ec9b381167f50a3a4e56e00c1d5eac43ecd4e408933dcd2011aef9642fde0e71607fcaa0eccf44394d6a75e3d962f65fa2910b769b2ee130fc9f1447e78e74db4b3f0967092155f455a3d88d5f48daf233fe6491deac90b1d30a02f18db5b7f17583fe4f0513c3d52ea913f0f739dd6468c2f63fa6de600b5f96cc48687a5d1aa5f2af3e2acf18429f252ef6e95d891e0786ca6939ecdba768ec7936c206f0bda534261dbe7adba572bf2f867cdb6586d8f1e6f8e0ff89ebb6b311a2e181f8443bf26bd50a3f95656d1e2087fadcf905a5ac54d2e33ff14010949d730e12fb1630d4844c5644cdea59eb08e3a987ce04345e1ce18ad39b0f3f37249391e1839b4b817b6ceab10b9cfdcdf081d2056be94eb0440b1de30fbe0c43aee9b217173b56a2581c0dafd8e3236ddf49bc7d581dbb4ad63ae399d6b73c61445db9dc405e17de21430866ba279172dd23b1181e0943d3d955251b77609a38ecd7ed57846c58dee0cb23fd3bd01085f3f7f7fe4414aef456442b917a23ed71b03f98b16ecddf499c9ba69ce346684e27add75652a5c35454ef3d246867fcb3987d001183e974c85e9bd96d39f16174832d9948d1264b9cdb3ea3fbc79390a7ab7a6da04d29e1032db30495c53ac3a00f5f85fe48fe0f73f419a440221171f4f11c298653f3eda111cb6e3f0f875579d22ce39d3f95d482a5688a18fe486743724c7bea1db05f4b12cb6091a041e0a8d47afa503e536570f8139bade5a03a3c37f3aaf434c900a8399b22b3ffd12cd41d33133dcea089e6f50220275e81b18647f7ffce1fa498618d24fcceb49d01a6b63d768c76e4078ca31d60aef25396caaa42c29d66abef1d164c360a480f27c6a6826b66bf87a8090a4da568277eafaf69ba3b8c9245cc85ddfc178e428e65dbf5e83af330f1340632783580886ac5de8b49b1c02ad9f840e91de8832a81858dab592a5a518a732a2487591c9a809ffe18d66e64b6d13cf74395f21089524d86d1bc84c4aabb2c1ee7635965e72607b81948b89ebe945e52f14e7a5ee568866b6ff89158c4ea298983f27d82f6c5c3b49589d896cb8a26f8fd2ecb95c92bf8e78bf7963f26813014011e0d9b4fc69c9994801676641b5e926e1f2cdcba036aa02fa0dea058e60a6768ce50da7b8f5a101e15b96312afccc74d08e45b4258a53e62dbb0a4e3837f29c0ea8f65018ac5c03c300b875cae3a40a1d03c3be892726a2d9053724ebe560211591264691ea452f5b9520aca806ea572617ca4341997cc96a710342101599c640521003cb2c16d5298d714e48d309dc9a2ecbdaf56dc0ba8092f0fe5b34e9cc0d5046000b0e2ba59b6e2cb333e4ad0ad7bd3afe0af0bcf689cf82d213bfead2eb102ae407fd0e014f9ba5a3ef982e726d47ba1508deac2e049b2b65d033175b581650f818753888b4aa9e78d27a28a3c952abc8559438a17f9a7d22172ae9c5d2d73ad4d30325ac592f59ba9317060f8a729280979dccf15921da7f6f03fcb2e9e75b02be237fdcab7e79d197db51261f0c00c64577d3ae3fd5d6063e5aaaa31bab240a405281aa2a3c716657538477f5936901c59f0728823af23f1b9b8e06d6a74833f01ce58563cdd2d1680c3a85bcad5debbe9fc200ceb5a1826d53116ea9701a4843ef160ec6c700bb3051cddfc2ce31bc96e68ec783ca8698d9fddf3b127a3c9fb2559d96f19cad7c46e0c8d6b65a972cc50fd7dd300df3bab808420c9049f1b2d1ccd6ce42d31bad2225b60ae5f6f094ef6837c251e48b90ae1ed443a1440c1a18c17c1558feedc6489d100cf007d08d6cac290767e2b083128e1080d41cde3dfdefd7fc9274964020b3612d5321a98ed338162cf08d053a8bf281449718dab7078484f49dd897a34105141c9dc8fe119998a9a37a47ec0f80c8a0ff68ec93fdbc4c0d8dc99f8488300eb32b2e6250ae564a3dfb73a7f77a879cfa11d7fcac7a8282cc38a43dcf37643cc909837213bd6fd95d956b219a1406cbe73c52cd56c600e55b75bc37ea69641bc0184b9ce9e76ca27311cf49566484f202df67d35558add045d580126876963832d7c5373584c34238f11e83bed4989bd77b85a30acaefdff5d88e61cbe790fe8be8bed5794e0a44f9a3e77525fcb825df714ab109654d60e5ef458a7744eaeb559b670c378bb8075fbaa8724e354a2c85811581b3d05d0fb08a24010d16ea9b0a807c2ff2c64315b5a5d01f7a26e51c540b8499ac948538d049c87a0fc6366a25385cc53d96320ca5d60ce14c4a0f71e581067d462a6c78bfaea139c1eb54f5202387607a741b489afbad4c37072fc99472198132ea694be9192ce4f5eeacb8a5c29a962bd855462f673fd4bce6dc8ffb5f3c59d58d022ee729e9f00e58c4110095f4bad44b76a1bdb9430f60718c3174c8fd7bc06acd9e245156df6da231badb2e2453163605d7d0524550a43fc56abb1fcb4b561c32264b100227a6635c029ffbb8033430795501d2b53d0a99fe7818f4246d3909c633a5e66a5d4b14c984c97f1e3fe0b347a5ccab21490628be0638c6a735dbbbf052df54fde4ce2ef0bde238c55d9e46f7468b5bf7f929548a717507a259a0cb571051ec4b52a22a781a64a95c00bf641eb3e855d7c1d6b5ca665847d43d3a9050e8a80cb12b598fa626db5130bdd683147a4e391f37a0c514317d078b551ba374384c46fdd366d7216fb0b0e1e9763c8f0637765ccf29fafe8f3db75635968d47aba91b5fef5c8970518f58fe1810e8c4e43e8e0efcb4dfcfcc34e7b3536da631af590a75d3ad2f0988c1b9c3ce29207c90bdf0a454d3dc2e74dd093132e3a6c8bfd694ce34db205351e2440170416c1ca8503ecb4c29888105a0ac4e58bad77349ac3ac7675915e4698b9805a2dc341b777fd8d257085d7e1b1a41693935d0d7f9446d0fffc978431c08166eda6c10ffaaa74f681a02d36c11c4591058f72b5d3b29bbf6728ebfe605f25f9b8b737b3f9e6112dae9bb72d1861953e23c614f898bd6a819442b654393c4c41a3a74db51ef27c3c96a64c444f493e24d682695d377e5a1f70911f0f26219f4797c02d9ed0985c2a1f0c1404cc9ce54b04099c6c16ba14a0e25f4fb68dd4c5127a48fcf6769e5900331336f4f82235bc96a5d3ad9e3c400cd1f26ed1d81e67aa3688e5437acd1cc5b905db9d3ba2d37e759b36a937cb856c2794a3e86ec72d18b1c80e0f43ed4d8199282a85fee66a998736efe74a2e8bc7cb8a1684b797be63d5509fe139c6943dbbc54c36a7b4a016b6bd23ef3d2efb25a51ff02c1b56 -MD = 8e28867538bc2c6c94d3428f05b1458f428d3f950430b09238209efe6bb267d9 - -Len = 37736 -Msg = 6b9e10c9dba055603196cb2b7fd7c54a3e8d10624aad1c342e2d5d75a271f1d952068372e1926f382e0b27e9d628d513fa15426e426bf670215fa11c5b3ab91bc509650d4c959a21399583e3b4232756866d464323ad83d0e75bc954a0a0e76a4d0f7d4525901c43db9ca9c421b0023c6bfbe487f55a0d7d07879dc7788ec2f1718094bf736a3ec59b885f3225b7b0ed3029e6e3c05cda9f094de71bebe993d5b9c472263e0d48cf02c26ed5c92077905d5e12fe8d9a325d76146df8019aa241ad43df208f60828b97b09e5714d3a04d7a01328163fc5fdfd543f807c389375bd665a3556d4b331fe2bbb65d0fb8724d107c0c134b6aa84eae4450ef389e9a4bbb93856fe0b6a5b36b4b8092c0b837b8a636695d4ccc54d28a7e3d5968c2123ae4334f13f0891e70bbc9c29b31b935b6c59710066e0aac92ef5987ed5cdbe950daafc7eba6ace77d599b45236aa4b66df407cbb7b90df8b7683df5521bd265b4246db69f09084803cd2bd1d071620008bbee601836bb80687a925131ad90cf8f4ad7e3d72183882aa0e02e4a50da5bada2b498d0ecfd8bceafc061311bfc6f08d553183af706f1195921233a0ff3118532c13b88e4bc62108e2feefb6cfd8c484c4b1b70927ac9f980587948b49769b7f27e11e724de4e589f48bf36a87d6f763726b522fbc559f19decf81b49adaa6b6b51e196b64c95cb6b719e8bd86361bb1f4caef838d1e92a3945685cd51c1dcb23a3753ca1ef7f93791351a20397a83f8a25ce995384c1ccdbcb91b261ce0afca4dd9382eeae56d85197a12231008c290319ddae53c828fe0ce63bc6f4aab92976650410a47060c17c6356b46a8857a10f90a2de418468e853fe2d40969871781fa5908dcb1fe77781e138ffb7164fd138f2e6d224a0c7b3387b30c74f807b112903fea26ca23122e8780eac1f93bedf05a7713104038e8743c50c03284a1f1d1ce918f68ee186e83a8fa262abe5eaf3fe170ba4ea97048bfd44899d28dfa5c47ebea43239c430f4fe90baca62f51c36acaa7cd3dc4373e8ed606e3d5825552dd9ea6bfd7533766cbce21f8b4cab9bcf96c98b65e5ef21c59c82858abe057781b4d535004b169f79fded994e71efb1e745da02030a83574b9010942d646752e798e7cae2c255f4424719f0bbdaaaa4a63f47a75455e85da2537464cd52342f880c88f14ce3d8bdf025ceeb798ec2bd330e764301cd047bf16d14bd138f52568c982074e6b58742aa1c745331952144b739d19db17ac0f960645a67a723ab0f1ac4171957404bca99b673f08af8ad815949be7f0d65051e19c2ad29301626a25a19d5a9488c0a9ee47a338a2dbe50bb42c5a7afbc95b934410e74cc5770aa56751ec2eb60a2ae07b5f01de9c1eff13c9935f3f66712c58103d11919c33a2175935c46a948891d4b31a197d4ef94784a87220a1cb6e5124e859203d51c7c7245db59caa9a74941b282140a155fb3cc2e341354e9501587e2efd99acb0c3c850f769fb4b426eb0086d0d1df72b857d730c7903925deaa0b876a2f46c23984421a8cb66e926d75440d42617cb4a38580976921219707ad88831e1a6f814b5b91b044245e0b23f2f491014b4ba3c747afad414f74087425e51f32247dd1ebca5a17c673eee7f067f8583417b206cda44cb878a19a40cd1a0aa3ced5d87ac1d785983b2a85ed7ede38aa044e1ba65ca5400135a0fb07b995df571cb4e844748dfa7bcbd28ae6725e9bd19977ed4c1d5071d0a1d2ff25e09c4b82414916f7adf1a1089df2679b77f00b141a1a90beb7afc86de4c10f61eb3a396e681cc85a130d6287da1283d1339b70bab0c06cc5d3ca2d1f25f5918482748e61b7b667364fe8263fa9bb46534e67b00c82f0e92819a7892f8cf5ef564c5433a4569e5c53088ad379337318e8715cb452b9326fb13050c2e542498f9ff2e1107f6e5c0e79e7fc537d9fc56157448364d47c0e6626c1cdc2896f79db271b230d392779e47093458c93163689696ee3a8d9f40d365073246f633a0d39b67023131ca87c48ffb56d6803c050f8e6988469ab48b647f7ef5fb3bbcc8e131399e8086e1aeda1f0f57dce14c49a1796696f8d90a19101e3dd8675d84d84d0073d7ad678a4555609fa7ca50f4b9c4c408aabfed12727cddbe39f9d03e475d85a04e263826f3ad1136d72d73c7cdf00aea240a2b501ff11a8acb41284b9eb93d4982799d4a32779d5f5674be380ea9ca65a37638658a23612deccbea3f56d693c9e515eb567a1b6193b64e94c7e4586f15a97288a5396a5e122f088a8c084c25cc1699c6fe332f0a5e77099bf9f7928574968d80b1b65c5dd1f2758da41b606faa7763a4840618f42a09443830b0de99fcfb35d4fd796fdce7e791682a18e9ddff8802089a6b6fbb80ed7cfe1e9893093957f9e9fb0b2b77be6eeaae80791efd35d9036793cba9dcfda412521617667f943d48342ce405aad008ffd549c49649e7dac64622bf4db4facda2e8b9d5bf59a81baf48258c84e2c7463f50e883d650702df928a9aed1eff2babd066c2c0423ef53ad9a577d3fac0e9727b5df2f558d7912ea83ab22bcfa800bbf4fcfb2db6ac4a5b1af452e8c83107c5788b02faa7d6d5a38eba9b385412d31283936e2bb9ae2626a0b7128f1f467763d2dee2d3b8cc73452c527c9c17054bb963744341b30a32a15136de5067c8e154739fb708f581161c6a4a7ddd7e4910b77ee7a3f80c8915d616b8dfb40980eca14115ac22c5bd643131e9c885f3a5cb14ba33b6d72cf377cdd8873c426b334151268ae6a88f47058b6779821cdde324d901a2a3667b10028d7de91e83f6ac886c09449022bde8a232f640d628a4c9c20d3a7a932d62a85c1eee27adfd12b268fbd18cd018b668e32fc487ea33af204eb84d04adb547822d881488103a280c890568aace13e28f6f89bb95e6c468af6fe221881a8593671ed3d65670c29e839492b5e6b49ba924ef48c2b4f3643640ce94a04e0125af1fd6081bd7f41bdedf31aba088a73673f10a75c02a3999819912d6b19d8b1e0172fe2fcd55c5cf4ee8075611d7d16ea8bc69179f40dfeeb283e4ae3cbfdff7f3283e4ed3160a665865bf9df01c5acab04eb336463e0de82fc6ec262afa2738ec083d6f1563ec666320008825a06ad2f36f91da9d6ced11612ad1456197886a54dba4997b839359d6df731e99a8270fdae6ab0c8c11a4f0b0773c13cadd2c1492691ad5edc026c61b6bc067327fbc08cb7da8d3fb775d0d8574d4994d163bbe107a482a5360ce36998c8e6bd96c4f452ffa3138d2e43ef146ea42ded388dcf035d6d6a095acb230b809853377b6094f6f26ed42f9a16f235da22dea427d383369446b3f9becfb3ce0ac4ec6f2a611adf1c985f958f6192b30613ec6843b770e148eaf104d68d0e2793b912c348490e71faba065d82a649229f21d797f0ac00a9e7a4c1a94675aabeb7ff56e2398ad866093e78f5f8777dfae1c710b1d343bad70d1e7655633c01e9f402393a92991111b4b017ed6537b9a29a6e28544001282f05a2bfa7d122bc4fb46c3a3ad806310ba99983a26d7974c01591aeedeb56a0e87dfbde0ef4dc32368587ca716e64c0ca44651cc355bf47c9efdbe4ed29c6edb9d26481f962bafc54f40f6a5cea1748c411ad63bed27b9b2685a79ae08fd43709bf972c058f6183216c4daa8bcf90218f9dccf8f35820f76c737f01568201455e71ee3ca1ff425f027add0b5c8381e383456e3d1f4b61e51235dce8bda4c0713eb5d4445d26fff89e8c27fd6daa4f2755a4ebb0814090dcae495b91846ca44310e803d3a59adcd85c3cd9012da87a356d38dff3c7cc4056a72a559c594e3f437b74d75b09cf7b86a1f94aa72b0275c6407db5675142e2db735555899acdc3fad508e95af8294e8c263e176fc45cd43255fff68bcc491ae3b966f5b9d76004c1c4009443ff5ce8414f97a9cba7fc0802341c3de187433af7efbb90dd7db96440cef872b69ddebb5e94827c3b4474a3ce616ed60920c5e5907cdfd1351c1e54e03c5cff2342034a2c8b8b293f186b19ff4474695317458d45e750118131236938b2aab40a9a7f17439b1e1b679223ed0d73a9626fd9569470b598ec223b4d13b2b86e1bdce5a6a52c49b7ed1540539f81759a5bafe55dbda96e36bb98b91fe6d6c413a12ad21e665f2de4f8f8b15ea3e3a0b3afa3d9df4b7887a62a6538f0551d4c37ee74ee5afd44ae21d95243c98cbcab71f8ec156fe036985393181982d10ed7475e3b78c0bc85510af8e2a608dc64fc71a1d92663fe9bf6eb9011f93c0d23fbde6aff200436999cecf20a26b0f584fa2f44fb9b7008f149caabf346704be50049bf307279edea08543f3964467a954b075ce3d2f881def77d412c9fe42fdabb25a56fceb6650f29ed4b00dd3dde0e559643f26b821bcd967fea3e53fc1b6d530ec80db33e1e6157f4aff1000b8268b058a4d7d39119459d4f21a9012cb1257e5191aace659c993926d87a6b342a2cc1cb09e4999a1ccf726761ed25fa639ba38a8cc75ee1420f43e05f1d7d4c17d33069cda92c2198c3bc55357b40e9b528693633d40325b14beead9e4ab4b7ede452b17aa609bc1feae1a516e3d08f286415d1016149a75cd7b00b2092b00c1ee8cf4e8b6bc0ce047d78b370b7633f3fc75fd78fefa0eac72b2e758085edcd2d48fc7d9a5adfdc0923e81cfd56578e6dda9dd639ef876462cec0793884dc5f8b9d60db01f3c56a7056c65df7514c012506664999e19ba8c22b0c82b31fea47cc5ea2f36ce70ffdec8e89d30928bf1c07e33fae1a562c3c67d8692e7ad7b62a61f5293335751e1ad043a938ad5d1f4388e9807045bdd773c64f6cd90a1cce5bef096a36f65e7e25be1ebadb4e6edb2c2a91df3cb6991bf350089e1eeb8f7170c5f3fc6b19e3beb32868255786cea12a6f74b27fb778684fb78c636c99806dfd895d463c2aa54e5781c87f29c10cdfb2b9fa9095f2cc5acd4f53634e9e9002469badde46b323ab676ca83ebe979a0579acac002be315520099f5f441654eed008f5e2b072def64874b9fdaa274f6b0d3b9f167bdf2d3ec9e19dcbcc1780d7cafd6e6c2f9f558f81ba107d961e3c3405564735da8bc9898ea6180236b517c3fa904e02c9bc400d4b8ff88b1795e6052733e9a5888aad3d569e378ae8b8bebb4809bd2de68f46798d3d99b09556f5e55b1aaeeceea480620b1323ed4ce81fc59cafe274eee210da2f0a1a73782712dd8952be9473a1eb01944b03b3c80ce2ecdecbe65f497b4538183fa45d29d1e5f3992440257e489520d98f0062c6eeaf35f6a5f0765f228e9b32235ef50e1c153173d85c25796227cac2264284ad542caacc85294299a1930c640071c390cf4b9fffb63c1ecbb74804375af0a0e507045249b3b94a5dbffb92961c044f17b42e4426050597dc0fa1d82071333fd6cfdd355376c71614436f36b0c140220c916728ce0fe2191432d94d65b432e8e873605cd3187b2f27f696ff9b354dc3d52f9d53e01af92bdbe8996bee6b162383bd34ceb2dffe1cfca019f53dc052badc5679ce456f725599f8893ba3de06780f730193d6147865fd099f207fac779088cda2a0e356761fb62b50c46d542b70f45e71b429fe109391f8d189493fe6cc405ec1d1a4162d129a49970f3217ac929a462a3892e7ef2d1f36573784c3c4f66ecf7e6a6ff9beb5ad1a0522dc6db26769f3d427f8153dbb118cd832167e3c9679e980712b45519058654307519f6576ca2c188a45d121c6cebffc83e9b97335c97470f1c243102c01f4f8c67bf4ec4723ba9e686063c3d5be9a6c31e4bb945ac638f5ef1b3b2110128dcd6540b67062dd660dc931134c7049e4d044eecec58ed8fdb8751e75acc4f1f96aee8a2b185061f60db5a029e41fd764cfc5f1382e58678a618ab338dad108007668409d0d981632483595ecb26bd0e312bbd442f940dba89737c2ced2bebd699adc4a5276c263e46350f8a5dfdb9c29412e7f344bce9c1f0283337dbd137afe7d5190937c56b2d2090fb19d92f8a3fe0326d9564f8b12b74b76ee8ec359a685c8cff9a747dd6ac5e078a819f4484e2a00acccef2afea5371a18dc490b17a8c7225f6fd8fedff2859096c6642d550374e1c7404907b0be691672e3f5bed5ea8c3407da6ccae2b4dac26ef1c564a72ba64e801baa0c27c313e88becdb031cd39ba5d120acd270178c1e0a1283c2c42f86eede465b61ed1efe386be0440372cbbe1ec52ae03f1083624b7112e76e3675dd6ae9a9a42f8a35f2ad1ba576e6623abb47eae050384b6026f2abd7399085677269a92ccc9e8472b7efa225bad371885bc7482a43e6a7179ebac14bc152376c0f9427b81dd5653c14a7084657f2291e6647e7f10370ae0e934cba55c6dad6eb7a936a33ddfdb4fad27d56f2976c1162a46ed01bd6ffe8aecc4f9edc9250ea4e7c0d7a87553dfa16b9189310c069b1bddde50a9205bbdc5f136c75ca6bddf9fcddab609acdbebef79121c7881b109298d8539d3cd7cb128a2e4b48069aa98d5d651423568da78805223ffa42f08a3b595e61920396581295e6931e7866db2dd9dcf0cba1dc21e1a8341b352587ff346a37b7f0ce888965ea03ec0008199b62d809e9616504544f488e5c7f -MD = 022aa46f368252ce0a7b2431d55ac4767455865dfe65d2e372f4e82691a14cb2 - -Len = 38528 -Msg = 2c97ef4f65319444199df671deaee966d19628052359f791d5810608bf1499b3d7c3e6fbb064be7e41a27062e8f3ebe9afcb2246cd10b5b070cdcdb4b92a47cf089c163c7b59e20bb10ff573d4d55869d6623971fa7c90b597b40354195106fc488a46bbcdf84812f14a4d4ca93b7a0dd0c1352eb387d2c8d29e6f8fe5701c621ef54020ae2938bc8abd40946f0c97fe2352de24ff18c113aaf3da0e276ed2281245ca1226d4f93103ce96f32e32f8645a7bfcfce618a7bba61b0c79e6357077ace2ad393ee1d498e4e71613ef94e566faa6565e706dcaeb4f7fcd772bac3e767534b13efd381119b66f8a99b91aa52c8d3ab5f0a60073c92b85e5b0fdbb844ef4a49dc96cc1f8de00ceb83095ac82df9b9fe15d8fb9e97dc4961bcd644a8926b1983b819165d00c4a6b687e8a32c2a7aa3ca24b33807630a21b3876684196273579510f760ae3ce1db0642ba094aeab447bc0639b3e600a4b7a05521288f37807b0a81a2399774aff0473e0dfba8e14f0c3024cced9f032491d470a6908e843b0a3084b9efbd5a87bcf5c45508daa09377d31aed43b6ed1246ac94575a7bdadb6bc384af1164511167ae801faf349b39f0f1533b64a220e62cb52ac3f4eb9e0a36202be24d40ead5a6bdfbde6d5b53ab2e276817bf053128da7a9e7cee62504fefc2c503d1c7aa3ce0b09201a1c34c5f85e1c402b144b042c65979d2b55494050f47fa746d5cf1cfac22dd3a0ae0f7cf8ebcf19cf9e500dc86fe4765c856dbd20b1c36c46e9563f67f9157d80758e883af256b36e75ab55e82c581c6b5cd9a3f69bc046463f57359c1687c7c058f81146d97ab81083a4031404ba345fc4d4195a1a3dde4dbf1a2521834c586a3e973ea50a03cdbdaf8240d55fd46941a4a847d59604db6351e6387fa62cda8511b138deebb99c7ee18f33b1a56c6018e39b56ee77dbe690dd05953de9eef21ab88f2779e663cd5a011105323e4bc4ec6bf66e2e258ba7dd4bbd66e3b35c4a301b7932fe62cb085af851dde093393bc62301b61c09dcc5518357d0fa6b3c8acf22b681f6c7b7f485ac97e4420afe6dadf30357408995e9f56e1afd097b575affb5903de97cf039e3062b41e00c6104a9c34679220e80bacff25015984a7560c9bc4d8e5deb3e807cee541d42022ba5c27b10424b0163e1eaf83f3f2f405e47341f369bdc7b6871594d5ba0f15224fa0104aadd42c807054b6931a457c5d9b549c6938ded9438b3810988f1746614ab6d445c708fcd34cffc2b6c6c9741af530f99ac8b199e74effc0c233953a4c3600e246d24bb76b1e6042839be781ca8c88e81c8bee601e5ccd33c749f1776f9c0ed8c27204d2d48f46b46dfc281be8cbcce64314ede2653f30d83c34c47437d731165d08dcd59bf9e396fa8a23a9023d9d82c2d628973860bb2c857686b7218228395b192c361df8e778ada832bf835c4b3bf05226e5145bdcbf3791a0b6d927549061258b8af706c2d7fbe90dd5f8928670701b7152959b15eeb718ab09bb3136d9e3b0634aa3adf61369ceed72ee8abfdea684906618b8e769a87e1e16442a5f64773c5bdba04901d96bcc8a1cb1af57c5284ffca63a1fc18e70347273009d2ede803bddd47982768896544c4a0e7afec269b02e89563a54eba2ce30967ce43596933151bb9bc4b4bf7e08ac7131781554ef67ae8619b2e1ffb4bde0f715a9f42b14bf6ff7939a4ccc676c3328e7112c0b1dd8e532e0f429492a85fc1b7758fb1aa938712edd7dbf6df6c178e78be0b34399766af638887b3688b8fa89fe6bbac3b53f1db7e5d98ce2a0dad6139c613bacd6e2b876acea586633c964b9277ca3e4cd25be39495825e8fa0ae363951d35955a80560aaa945156c029b32f9ee656cc659eeb0984542adf76c4192df27f319ba8e1bc48be10f666c27c6e63a1433408f30d1ccf03680c348ba8fff950f1a02e268963a753daa8449f140eebfb1ddc1909f2dbf0630e3a96cd2c004c3d3f01db67e9d4bd087bf74eda931d2ee8d0af7b1ee2a0f41fb136649fcfb2acf391f711e17597d0485f53f3e96c11b316f63ebdb64ef46085eb902c98068f7220a4c06037df25b7900f5ee26021650ef218fa4f44aa5ebc5227d86d3a530f5240d21e54bf68f6a98bf66898c335bf98f69372ae5e87387df0f06f94eb57bac3d0c4615e0cb5834c78cf1165772b69f7b100386978682a1beedfd6324f670a3d6cd639ea84476406f2d3e9f71074fc91ade9abff16cfac1ca8409cc3cb13862551a1f898da81116f96bf42bc13a4fffd49aa5dddae202706b9cd33d7e2dfa7124b922dd7641503fcb0ebbc32f53dec9110ecbe93c2fc23409fc02bdd2b4df59a97215a24a555c424fde3d6ea39923b03900b5eafe9c63980c6d3f55208c0fa14e0fa0e1f32d5da7eca31f340555473bb4390be808710d21dcb7320c50feb1d17a566aa158117af709240c1d3dd071f3eb8174ec42f6e759e1a282ea4a52ee7194111cea6148dbb9102aaa32344fca5e449f98fc94721ac783f6d8f7f6d0ed0a06065dc4f61ca975687da17ad01d7a06285d2023e62fcdf32b7adb3c3dc0d72337fed638ffd30cb379e59afdfa81a8730081b466207329663ff734c00569d3458fc02f4d64b62bfcab2a3dc49bc27d2b32d4fbcf2a8756a729358a8b38140af776160f0c0d0d2fd7661331d6992920b8281e9e65ecb37b3e4ffc86a6bc09a3c154c61e7be3203fcd12691f3cdefeb9a2482744304e3ec1b41b14d0187b90c72b919905a5cc36846517f4aefc5089726ffcb6963939724f90f3440fe95bf19ebe95576c8fb1992627dd7c8720d91171a9ab953c8793954e5a4155eb2246734f01c9c8fa437b8f4c9bcdc951af60e0ded7bc8add2246f0e59b6c100eca235f037d93b358c810611e4a4da2b5b2cc3ce282995e211338cb3dd9dc3a1de9dafde1b85ce22e265a57c5bbc6d15b30076ea531a9d9b261536e7d9ff99ec3885295123c8d1b236540b86976a11cea31f8bd4e6c54c235147d20ce722b03a6ad756fbd918c27df8ea9ce3104444c0bbe877305bc02e35535a02a58dcda306e632ad30b3dc3ce0ba97fdf46ec192965dd9cd7f4a71b02b8cba3d442646eeec4af590824ca98d74fbca934d0b6867aa1991f3040b707e806de6e66b5934f05509bea572fc0750c52d10f15f6ebf50966f7f8c714742f5de877e928d8efe53db92ec60854a5c133bdef99c9e012cd9c5d0110e49665f928059cfc62d402995ea770d363bd03e415371f2f9ab7b376fc2dbe4dceee12ce1307588f5bd054d12fc46afaaf8f61467a6968b9cea35658f17f3698cf450317e493b08a5cf56bf679b5232436f5484f2afad21faecb84db42fb72da2dc3c13a6454aed5ad6ad1710425a3373e153f67ec9365498258c467b94879f9318fd3a15bef595896580ea898baf31d1017cef689dc2a1f92719f641c0f53df23d2c1b2910fb9fc5fe7a805fd1c1abcf4247d64ca7c288a253f9c3a34f709724bb314d7cd5ad7a74f3e29effaf420fe3164d519741c677085ea4351c9a9a29cf05b5377d978ba42af8619ce59ea0ec911fe5d7d5263f0bbf8991c11a3cc26435cf106f97b126ab6c7e6fe09e0a5eb07da1a9df82bfaca51c774b0e389099e51d59eb5c77cd0f0e9df87620a58cebf9fd5e21ef3c688fd1c3aa4862d440811ada48ae948a35953c53f91cc38880c93794a7c67d4ecb69202985126589d70873f11dc29e4ba569b312f2bc5fb3a086e7d81100105652c90ed2ba219cd59ea08ef63bdfe03876ed114f67dd4bb346a5893c1c772ecf991ffc439c0e6f3431d9da5e454ef0dd44afc58ddb081e03fd959a354c844f3708ee86f0bd3153122b24d49daca846a679124e42cec54d223fd7a95803cfe8191ca52d5e9022ff1bd5021c38e46458308ec51a02b58d6faa87fc2518e4b29fd25ee45e01a75bb9adda01ffb48f1bbbe81038c74211d8ebe96073abfc61c4cd1f4a1c977e85541944a4951da50f26d84997ddc4858620487b43ce8c86fd8ef64c68ce78299ca4946ccf4bf46ed72e33e17034a041650c1becbc7d652d2a69b1e6356a6ea76fb5c1a2b4970286899a652c43cdd90a40f4cc9a34f0c4638afd66793a80f95c71101772eef6c69098e3d2a68d19dd44ac62d12047d908de71b2ba71d2a286cd433c1c59f8fbbef187a302ccb6992b94f9eedffb6f96c0d28111f46ca83fb57e48a236d44d066a4dd8408c2b4adc525fdbe13fa806aa8b042b93cac625c903f413eafd5e55b736fa0d54c53ec443d019a4e276a2c794a5d7f3c0942ad5ced0a3176ed664cd7ed37a89484463cd802366f78b2b780cd5cfc25c20e6e722c1ca2fd5a668840edd9e63eea39056a0e1dabc4623b48450fe5747d72d4997b7325eded13a1a488454163aafff1f73e909547e1344a8742e6eeafcf75e22c8eda0ed548c92620ed862c9634fa3784820672f40d1767db41fb7e9463f3c08d7409e14158a37e663759a36724049014fc17bd9991331bac08f59d0b8013f726f5a7a61863ca30dc2e65adbec144860f756c7d1db5afed63617d53fc6ffd0e5ed85c6344b266c4ec9953528354e3a0deb6adba6ac1b36666123ba94f79da8d9ce7d222ac8d9ec3fd42ca9a9e250867e784817c67fd690c1ee3d6a6ece4d2fd4ae8aeea383b9ab476ef738ef77cdc6193aa90ccfcb1f76af39ef753bcf80ce5cfa49bc4d006831fc169f63577a187184aee83b1112485054e0945b6a5ffb1cd93e33fb65c34818c4578fa9804db3014751a02348e9f3c6795ee69da903fe83dfe6c42cbc40ebb846ae327bd8774ffdb7af4b45c5b6a431732130ac46601dabe78094d08f0dc5a8e987426aee9b21df7c345423161cdc39d8b40d17e0d8daed769800877c9e6853337f19f7310deb2f0b6d453bb8610e4820a3f650f6f2b8d11399a1a1f357365faaf233912e63fe54cbd6b9003b37acd4d15d7707f73239ff3501f2c081dcd226b69d29d95521fdf953fd0a110d154a78616cf97d600bc0b0516d7e53b6a3ae30ecbc673033bc4c852a4cc2deac6e699b574f0841d0040facff48aeebf0203d06c3ec662658b77c70c5327dc9a7c78cc639702df5c5af593da50ffee9ccf70120c2b9c12c22980044ab6a95827d9526817e7cd4f99f624ffad93ff8edbb8c8d176f80e2c22fd27a894341a4699c7bc945acc187ddebc1465d026527683a45534330fe5588eefb4db72354151f92dfd78b3aead1132940feecc6fc04d9c7d5d64cad6e83d0ce76ec46d21e71f4ef25e3daaf552b29e665bc228d811bb2f2a2989c3b7e184a7cd9f8c0c61d458a000270bc709d008281a41086cc80c6a429301caa71896d464898d5ad85bd0a5f73ea0099352eebcdb9809e921a77affe0a02c4ffd63d1d64d0380575878a3ae5c94106095397676bcc8fb8ccedc23250e39f4414dff58326924c2ab1420141ad6eac13755242eddd5925f1afbd1cf82d6469fc82054f38fc0d29a7d94bced916e28f9b75c7ce09a2ddf7cba30ed46be3faf760bfcca6c955bf64ff561b2f4bd2b37010831aa5255cc959b95f6984f82515cc1336cc98aed41792a3d026cf24315fd21515d144db5bb9e04d2d43ab4761535c867f5b9143f7a41737aff50aece3463a0bb6624986201e0ff9a533b3b419223d2d02102d3320f3872d7e1c8f2049151c86dd641fd05a645d415f904ad8bd10c2995770c8f6f07456e7a2e3b848d33b0df8f34d24246b3b4ca6a51fbd1fed8da13e07f400f9e6a4fb18b71112d1222662e4b094130cc2f142ac2e0897140b173d9d6c2041d66414081332fb1b53b675dfdc7dcf58f40224f3c44301653f964c1c3a1c7c17f6f93ff2799f285e4af097b942b35562749944c4819c80b40d2f7aa186916e0fe626874ebe741f4821710aa3aa09cccbf908ef3966830ce00727418225538c762e7c8871442a566561a85d1384e9abf21bc172c6e5af1c95b83e2f2278eb4e073a5bc20ecd4a54329616fd8d65cb697137638df1717926319aa4a20703c1292f9454b27b9c5c9f4c393d6a65cf279bc5e66f8f4dac69b030191b3894585db44bb6e7e84c43d99dfec59c225123a6a97ca335f53ff8f9413dde02517ed94966082c95c1f55639e6d6c5b3c3c4059118e1e8675e5ce9b06fa733fa9b1b28fcb4d16feede0b35f5f060a404bd32d7af60a240643908e1279208b54453fda9f03733fb439b0285a64138fb1f8d322c3a274a25cd03d891c73edefca03aaaeebc43ac5934975fa7c36fac4554a22675c9c32612f24d505df7ec96647ebd8769c990a6f45241972ec5c256ed549a9446e6cae2928483e4b86211cb77304b27ad9074b066fd282d8d35efa58d8fd5001219b4ec1ef4362a337e54eabf8562001cb986553bc5c9a7458c5e349076f00e59cb07cf32b1d27541a50c70a7be90b5599d3c01bd1c9478da41847080aa69f3908339f8584df77a859ecef9ca7c659bc6c40c4295921736ddedf8e5e88aa16458cac1e40a49039e519412f2821f4f47f6c68da44fa6c055a2fa31f1329844e5151a463ec3038555485d5ed78947bc2e6c0d268335cb3e59dbfea64ef963b2ea57fa3d551d3dfb23dc2339252a664ad389106d8bf28fefb7eb53fc4ba77d79d893d2fdc36338e3ae8fbe0877fffb69cbf068d90b006532f443927a73b73618544b3d2e065f84dd49c566533c7487976c148eeface9dbc6939752c753b33e0cd1f0a1349a4cb2268a3fb4bfdf129b525877eb17ce0964091a38ed597825f5c5d626a7a80bc5417df43131a4fc749739059d1 -MD = 5d1f1f7c14e34f79468bb5de195a60f3b422c4e48757facf1df01d1b022e6764 - -Len = 39320 -Msg = 629b37b9a056e74959346e8c40aeb4e2073e97bf2117d2ffcd13237a50edadd981b09ba88b6f06acef371876c8427238536dccd8aeecdb43e03d78041a5afe153d33f4f49b5becfa0202aae9f72389c43ffe1be3a4c91046f5a3592a4fc98dda9b0c8bc8588361dc9b7d6c0c53b9c12dd2dacc08891537b1132d0d1476a120d1a524a84a494d2cf9c090a608666de21b14e72771e738192b43c3deeb174a80a1626192a2f62217fb7c239f04b8a5b3380e0e7343459a7e5d8c4d12d7ba2c75f3daac93f9e76be887d41ea029cfcafd29c738faa92ca32eeef6b3f2ffe8afc66f16eef177a58e6848d269f19e35458899474b02c923bbf08789ddc68c283b3dbc1d0df543b7f55fe37decda8c727c1c2e9731d4cbb24a8dd04eb3d6a50338a083f7f3e786a5069503dd90a31b0cd98190bed0b8d861b8ce704c1e6973000eb86bad860f67f82bd14efb3b93728dc37e68c412f518b96d78108b04c91ea7254d1d46b0b40f37cbdd6cded6f3ba7da2dd5eb2ddd5b241d15657144f3ccd80e52740ca5720a5ea4d7f068e4a0b1a62dd64198f1b9ece814c2feeeee50ba814b70d7d42659952991b80c4147d23bbc6dedc4263b399960247ca7c21b07ed8ea01c87cb5c1683ecd9ca74d775983c5300c0c80378d0e304b28f0aab696dc858a2c21e42b53d5900d38be4abfc5735f29cfbe7c129145c4e5596920b4816fd67da1dd5eac032771e2578b62f5a83ab1388fb8defca7857b5640fd8523587df44ac7c79141b9a808d361d83e20ec21e4e5b4c34dfdb7187c284774820c034f077905a626f15d9e7e68be6b8548787020b8a6a7711ea944f0e2d595be76692d3693c541c4c5d752fa29d70ce075346f8c3ace2cf3666552ff0d5129e269745ea91f6e6114c30f0ca59f1285f7b0086551f2921a7bded38ad03025f895ed0b2c89a568cebdf5ee14a651d89d7100dc9c96685b38b08cdc338cd3b8ca800b16ddfead1a5068635ab126c7921bf76e985a8425924f3b7a66965a7f72674aca7eba2fc0eeafbd143c2c4d8aa6c8300124e843b09d27c3b05afc63babb979c33290b45654bb263107dcd42217e6cc5c1688efa91e688f134a1abcf0ffb211e4c001867259923035f03dc2e1480cf5db64d93d251d33a6d1021ecc5039ace771feb28be8741c8440ab8a138ec16b8a1e9b941f277ce04de4cc4066d20006650b4d3857213a969cf1783648930a7f0386195de828b3eb0edee7143f0ed96b150119e75aa513ad04b914b6c48689a40cc26cab3ac168b04410010e976f2c276204036418eca5cc4617dfa029e1d596e02413f08969f1cc98389884126b8ed7f674981314705780cb9e5776eb3d54b4284b9db2568ae5bc65a92c39329c68092ce32698cfd8af471fad0aaf8ae1bd886fa9688514bcbafc56f22a827a7a4e178fd05d59cd7e23abbcd477be8b87468000be12dd5677f808c69411f44c7db7af99bcaaca7fe94b0b2d951d285f86a637960a1b1f9e35137e5f1f71033b1f2b2dc5087d8f69a28c01dc7f69718978432baa1defe05e7ca3a96af4d633d8e71f0ebc64640d1d227d1c63e3eb2e9bc4b3b8875a0fb419d70f2674a4a00a886e19eeca20ecc7fce184a73e7320b409045e7ae84f090f52bcec7226bf7d0bcc0c923a88fe8644ab78395ed6ad98b653bfc9ef277d5a568b969228db95ab9c365b1e7e733daf078b5f019fc6e3c189fe4f8c91ef65822e370cb6972dd7ea4039c21527036ef5852efe83e679b619b38b3bfcef8a880efae777b06977e687ac58ea2cc0d412c84208ef26cf89a52fd76d1db17493655f511f7015fc44522215162bbbd84fc9b5d2ab9970b75131724a266d40ad847df1a5418e6dec3d9b383ef41f58d9e0e43c9b7995e83a7adb6fa039930116f842747be01b1e95be42387e753d7a423202cb11156cf3d56113966e3937993d495346598dbeaea530b7a1480bfe96adbd95ffe7e17729f4ae7a74f887c36f8d0210e5a2acd194874f8c11404aeb3488ee2e3964704d0124ad6099f3b7bf0a72bd0be10bc00c76b8653006eb947bea403e2c063b44670ff2086663d44b82e0aad4c4b6d969c7bbb51c33d0ae8b391e70382ff4c0c05dacc92a0c611eb5c78881e3abd5b00c8bea09cf182d0d819b47a566aa738996897e369cc3203788f568945451dc141ac17823185d6a8d3a2b0c3c441c011a1982eaa6cb1b0fb32785175eb137286a2710ec9d626427a1f760c2c15af53be6dbd278b65f84be16340f0b5d84cc4946b3f2bdd547ccc2e05bc501c105e662745fe0bec1a48089d510ebcafd4991bd2e43df72672307faccd9d05fb7ef3043470836137554af117440b3ccca7a280285494f90dfaea60dcbf40b230271932cd3875b1d3dca60d38865ff874180efa7e056bb9f8b25179a623cedf25d376fadae3fc8428770364e65e317810f18592bc3debc050640ed1f3406e14414ab26343ba3f609ef009ff0a13a94506f8b14fcb453c957ed6c970a95f49daec537675f00567d09d0e61e58deef1e6c0f63739916585c1e8d1295fb2c886b88eb86a39c90c9b598d98b31e55372ee3a4b2c258f7e4efcaf81cd6a5f4c34e378f3f35b6b7160485d657a6b34c368bc51cf6f8b5e50ca13a1581794a5998c9dd58b17ff5a06dc9dbe013e3ab59322e128f8881574423c398a6c6ba57c88e1e354fd5f2fc6e5714e31493120e63753f5565310646fa727f6d15b440d328ee76c4dd7534d5071d0a26d8a1dae55445e71305b92f8bf141fb40c913b4c66300f8146a57ed885507d52b9503e33713eb4dd6d9e8a32d0fd85f992aabbd38600ccdac5f44c61b3e5c9d7ab482d60c88af9b2548860b343e7ed400a0430432075a1c1422046698ac66899c9be65b6c9bd8f689ba5a0ea9657c82fe93a530bb40320ed51d5f7706866bc218b4f7196034b08889972d55936c1a901a6b97eadcf3dbcb76b71d9e6eb4b47076667db9ef3b7d79ad48c787fa3aa026dd90e2da9c089e7a7f570585d71d89b93f183fe2229888f17d33f04de6b9566ece6b4ea70367c3437867e1d449ab31c8fa34063d0033191782c1704f60d0848d7562a2fa19f9924fea4e7733cd45f6c32f219a7291f47713435a0e346f6771ae5adea87ae7a452c65d748f4869d31ed36747c328ddc4ec0e486793a51c6766f7064826d074514dd05741f3be273ef21f280e4907ed89be301a4ec8496eb6ab900006e5a3c8e9c993621d6a3b0f6cbad0fddef3b9c82d36a0407972c96d3d88a2d082ad9cec520f3a0570bb672846be0d6b1f8ae376969c87424e5ccc21e44555ff224563e77667ebc9a2afec7ab445fffc39d73000ae380ca9374dfb939429d01450779fc13b18ce341b0e6f0d9f99cd37949f456d5b5158fc9b0cfeca337d3c977309f8838b6c0dd043a09beaed00a0a498adcdc5873192c3e2627cceaa89c010f2c418344da9cd25832c151888c3a0ccaec86e10191ee38773171da8e29585083770a4dc691839b9417c889f562af4363cb7d057f96173ceb8f38a5fc2e9b307a9d54783c6017617e6569a88417cc56aac439ca20f42692318be6bfb31cd7193b0baa7324eacafc4db83f3da30033af164347af74308ed0bfb3f67851988e736b4e96cf1e8600a4987cb3c9d0a057c52ce5211607dfd2910c93f270461633e771d283fc67c67af2f51f51dd9b9cbb21550640ae4a56742b9eb865380f1a69ede5440c8bbf307c7fea3cb3d97249d05c354340c8ba38f638ec7dc9201b1992ef4bff9aed733897a3ce41345df33c29de34188c05e5fbdb218c6098c9089831740c71a99222535ef737b96dcb7ce84a1fd7f29ce64c13957de50d4ea3461ae804bd46d33a5b1524f2ad21cab29dd293a9a76dfdda6b24a7b69ce0654f62160929b4fb82167c02ac1ea506d5a3c48fa8f418e71952a1839463fa66771dcb1e275ba9ec40e7038036e3a5d5090f8f73fc97a2fa9a0fadd4fdfea42bfeaf1f97c50302b59a0c903267ea2618ef566d3400fcdc14da31ee7d16ff208d6663ae1754b835d3e7f7907db18aac4ef328dc2448ac3ac26499c200a1ddd62748ec15217903d9b3d54882e6964dbef3bef76ad9561e358fc377e6e411235b7600a8d32a844e54f1cc7ff5e1a8bbc483ad3277d79bdb52d9718ccbbbd75816f6381a66b719204e0a47fe58134b5d638b487aa1839c6c294be928ceec76f4af2459c15e3baa021b69d25427e0009af2870b307681da391f33b4dc8efa72817a7ce02e184cb96c439cf601f3dc6b0d17e37fe44546c7dabb3d4f287a6a5c770f8c55b1234eb9d76d102d983a6ced2c4a4d1106bc3707b963d5229d2fb0975dd4cf451b1dd63ddbde6fd3876a15f950e000692839f6fc6dcf87c99b0d61a59e70c218ac4667c7d24e089240016c22439fc9e2c95cfb285044b1ceb291f219c159e15ae56b77ba530276e452aed40a5cdfe6085a83b81e197a0f8c745be6665f06b98666cb8ab7f6b237444fb0e1f4150701546c4cb24021c5edad30d9b31ddffdb725a105153305c3c62c97c61a71f4cb98516f167e20f1bec88ba889eca2bca576a31496abae38bdb027bb3cf22684841789e38f704311db4ca22beb07879d945499320eb29be81661a03aa3ed643cd70b686a063d28fa91d6ab4b8b785ecb50ed72a9bbce8e9c547730869970cd962ae067532939452478f2e177d9c37aee51bdc9bc5c53f8ddfe4d533f6c30c518f633213f56f92a17f72e0f31548d7e7f1d32091a3ef76d258a7082c5ba91ed4dcf70009f1e014a5da2f46f289a2acbe629d6ab23f20d4dfb7f7d39aa0308a8ad2d239ff2ecc6185df2c29bae091005cbee384a6a041a2dd843bff26cb42979af85ca59cb51dc26a17d250f322ff19e9900c3416ce3b29f348dd5477e6c68f2dd6fe0b898db97f7c0889854658d3408c5d8043aad2f4ae4a89449a36f8a3b86af51e346ebe8ae0e23cba8e5a89f5bd6dafa67909b3567c09d2d8990a0ac35b7adc26e9f151762cc53bcb34d9bd4cd8b50de89ddc7948da59a801199c230dbf84137cf0bd4d67ad4c8b263f68fcc2d98c00ad79ca2cb10f629527e1934b692eb1238a1178ba44a9a0b63177b14f3e07190f5ed37cd57b644b20b2ba988abfee2993b616cba0f569e84456a45cbda9ac85c26174997c8d213dd20a6c53e9f74813eb6ac55d0861354dbbfc8d114fe90ef7a11f24ca27cf8e5f3197bf6b6ffa8497b40de8d7f97255f7a58afb770ce775983500aab7e029f2dac7c27b8925aeeadf750745e07c0f100d896ab636fc8b2b90056dd007ae8397d51cf1675411fcc210b6bfa5219820afb8f00386f727be770699cc5c639ac5c379b68d4c753dcc5355009fcf41558e7a1f61bd33629666a0227a861772aad7bfee1ffff293b107e6d4d90e8de9bb3fb96b6400841e506cef0e2f04c9dde8a1d35bdfae21577493c3b5cc74a5c1d31cb4c3813442d45db9acef40ad3a4b5c0c46e87c01a1688d5a32215e3ae070a40db35041c1352bc6341ff036e831650dfe62bf8062397007437b4019c6069f36fbfd392b1025cc92c48f36981f78d303606d057338b314e735e5398481dff592ccdba7c887da5ec95346eceeb9d53c461bb0e5dbead5fe371ab93527d3321bbf6a95c29e8f1b8a74c88a38c11e1148df15738542e268d6ffd9405b8b25c9b8c5bb73b13791b2f8990aa44297b5f4a0d538fe0d2f873343455abfd437dd6a75ada9bc9d1bf3654f4303dc33fbe845ec306b98a62b4100ee138581c7b365defa7e1bbaadd01ffd37779a7933721eced3f8958a78bd78957f7042cd5d8823edee40f8b30ae07b425a3fb7c56986c055fe36a01daa6d94bb9d6579eabd3d815efafc2af0dbd371fb5da24206febe34a315f2739664c3fd3af0f81221115ae5fbc5b998b9492f67f2eba924851aa2e380bf32f640d0481cda2133f5ba7e68b98af87f2a567c7ec7edaa5a438ae3bb35b3a400116213835763d81e0afd2eee64d43a56c80e9b47f8b542bf885c849093066d63ac4358fc179cbcc03a3149744ea134475a2acf1362125ce0db4523aa633fc264af2cc53cc54e76216ba0f682dfb98d59c8f23f696dcba0c3258be98f0e274a09026582cac741ae4986905ea17fe3ee95faae14d181aab5724c77fdc9fd86ae5c8e36b82e873d0b41744aa95896e9ff01d9a675d3067544f53a5187e09724966539e78ff16b0a35101b16fe308c9167a84b228bf864f5f452d561b15a43c8a82becbf2e9add6fd5be653b85b0c9a4cf8f39697dc703f26e9307eea1c16b3c8fb69007beb14436935439036860b5e9dec08cc474c94c3459c0b7427f9c7646f10e0b0866bf082516d97eb4ccc8b92a3d422a7b9884a5825edfcda37474ccaf773c47074f4b900507551e97db713b2d931dfdd6108277a525fa305aa8d0d53ec8472a4fa0dd469d0dd000f4bde2a5bb8959ec1c054b2b665518caaf4238f8bd8d379e2782fd91b7d1530c139aa35d9cc7ffde979e65278b964282e96a34a0f26d148ad61d34d919fae52a3b993dcd98f417bd8d045ad5dc927f40524a4d32a711e7d5a59809878c318f42b6e2375b77b8a770475eb29c23eed7ec30070a17a220b869dc1c0501d81e583cca9e197100bdb9df0dd5f3e32655526fccccf4b7ac438d2dc3d0aeb0c5684800c0f56c76fca854f22791a714ae6df9af6ebf917a8c227009a1dd8ffc1bb86777e00eb6d234248191dcb9559683ded3955e086cc90c6468e5c06a2d4ea1b5be87711282ec6dd747a4757686d16d51e809e3d00a0af2b17da966a0120c20085419bd28552e7269ae133aefc12d346e41f4463ff5a707b3b83edca7c5a0615831160a79b9ff0a83bec6734d8e129fdce53cd07cb406130f208a6aa6ce70294e5e64a12d35c7fccd80a568b775e87844dccbc6b0cf91de70be7657c5b6e64392e2edca -MD = 6025dc79681355ec9f3886a74b39dc4d1d2e6c77180080e9d296e5ca7742d04e - -Len = 40112 -Msg = 2c9bdc9d3e5cf09addfcd9c3f24f6bb182d76c1d2f3b3ef502f4bdae674a6bdd797fcb01804a0aa3b887e4a2552cc6c8c37f30a032865e8c52bf27125b1225775104168f862d82d360ec9fb45c59712f537b35a2fdbc00deb399a47d799ed3763b9287ee57efa0515c95cfa211beb40fba3543c996c36c12aceafb98c8d6bd01c091e4c7fb76ac4634e83f137c44d6907e1322bd0785ea51c61bf50a50a32a416669f6c17baceed9714fb6b0a4d121d9297f992758e8c2c387925a7b19eb645db8828585de77ae339a31fb21914edb1343e072af8fd63b8f79b8f2952c98b17e3b4559ba2cc1337b37f5d70d4ba44d65529e73fcb6369ede24f584fd90905acc791839096e71c6dad105121cdbb9bff8e02165b7d4ef33d70fb2da5e4dbda66ef964ee1aab6faf78efc874f7487779f374d00f87f2eb42a3c255ba5e6c05df8d43924194eba3367c19a6c5469ac5c27f97153b1517111369c548eda5f4524b50e008f72036f5a30fd707ccb0d98ae4c4cf57af094b49ee52a1f13bdced8b34e05730db65954d3d58b25352de0eb025e9a7ff340a967b1a86ddba6bab5f98e0643071b40c0f934d8031f21f78411ece17a47392c0018fe02c010a47b953619805f43249bcadaf1baedd4dfb2578bc2675501c91d4936e886c954895afd0cda3eb2add631e7689ef0b3ccaae8dbd72772c3262f9ee55fe5a6f22de1e34dfc64b3d5ad9cad9720911bfd8d2ff5917280763d2ae91b54d289d5d3033aaf18734d6240c8e4696a918c8f139ceb7318fc62043b96622d285d59b5e45af018ed0fd8dc7c9649ffd249c5ec9e5249ebc2b3408f46ef474ec05eb9a98ebbaeab2c20ab84f18c39cb5ea7e1970663e7ca3f55a079d79be4facd354e336a9bc2e0566439fe38213076703a7420e4482198df5216766632e7bbaf9f6be5e071d9531c39089ac8ebca6ba78fe20ca055a3d23326f6e78b3aabfbd7fbb72398e45e7dbe1dac0d1c4264257506afdcd332daf0db42e66fbf19ce55e6b8949eec59decadc9078a7bacb9a2e593d51f3f556238f283449516a66bb344c74a89a5358b6c4f820130d2cfde900d4926cf47f463a07ba89b44f2597ff2179be57b8864782e6914aef9fdb4fbd2777b45550d9797af4f2a19bab792406981ed4267bcdccdfba288f82f25e37a31ca3119f9bac6662c1711a8418cd916e228c749956c25f09ba2e5c61871e5c175af718c03760a38e17a652f1f99b76923b430e24cbec54bd61233fffe0a413a66cd4585ba68e97594212f959d07b3a1f6ce31f5d6da4644749a7b8d27177f4bcbcdb4ed68b9ed850eb377c403fe5626211ed06a79e930453ce1c457dcc1285e6e56c6aa53909ed117d943a399a526606c4b17297e1309b5f79016456430c3da151184a5c31683bf773b9d1aa625adb8a1fe0e1a2d7f5bfc6d4e793f098bd82789a5f5c6027324b8f5808c1174a6739486debc26cd56ad8266c4f62d11fbefad92bb22f657ce09255a501970494fff5de5942933a8bf88aeaa9a94f7c5a791d3f7fb111b094fbb6c6e554a1f6e48d97c84c75d2a04e373ea00775c866db84503820ccc1e6120c1f7f93429072bba89572b2061f42aeaf69e320354c0515594a5f9975be8a766a32cc398be0ec7cd9758a4463c7762fb993006e7868eb8a7051f2543c460234cea759327101d8ca88ce6b6e3f69df33ee50945cbfad9ecd520daceb9116d1cf71d393389271dc074f068289c984d27dc6191b756b78733086d3ebca14af9dc92c4df69670bf4ac584948c31b286f44fd96302331c581d66875b4b6a275eba94367d1fe69c58c987d21ed4f08b1ea93c80a4f52042cb01c1cbfa286649c2bcc328f76ba365bcbcc0affbf940a38a85c6647540d76f4fb4f4dd371f290c6a08d89c3366477d89b8f286c2659cac790e7ffd5a91a2f2649b5223a8ac3cefc34336d8c79c6d341e32bffef8a68f0658a7bba3ab441d8ca8498c47b53c0c545ce080871a7a6f3a08be6b6105387231b7e61bf00df4c19e6933e5a1e36b31ea9565282fa28cd7efc7a097657e97f0bf054e237ae910199845ef00dac9a628030b55a03af65031d5e9adb664db51751ecf4444acd312a01abcdf505ace79794e3d168b219c40f78cdd2a6af791d199d1747cf1fe4298df864c89769a6841802c993c3b7bfaebb36510ab078638a4b967a33cddf7be0f327b6371c6122dbad71eae3b53b298ccd00f22a43ea946577e51ca184b11bbe2335a902cd17a95320894faa8466e0c40e7db91ba52d93146332057a3dbe4a2be7cb4511f2b0c25438f3ffce795f6bc04656adc31e68e801d8243ea4402d938f0591934cd357f646bc570239dc4f52e63d32d70bf8c31c929d63ce09d5277b52462e9a9cb732cc92755c61d1f55d1ea0baba3ddb7967b6317c98bd9044d48cdc724b62e7e869cc9e2bab23800bb256558796e91ceb7c3e453b6b1420d45b4d96518ff417ac257ed3a5ec502d6875826c6a6de3b494293d36a383daa3cfe546e6aaa357124c8e6b99adc6f1c052cf2b4f2ce7318dbd973a6b7c8917007b990035472e93c20fcb1a5909e10d2012e8d86595addd8eadeebd4e8e24d31f21a002eceed9b10d3f05137982e6ac37f0e711166c67ef9eae554e46a0fd17e80821d471684cb8dd2263df63e07dd6ec33f45eca7bbd6da706f476bb7cbbea437a45ff2e7d2eb019020e057deb4d9427253948e988556190fef4bc15e8075518bd340a89f428a2a9252d0d316bffedd00cdb56db5cdad241de7da9bdad895f4f1a157dec97e19575d4e980e6273aead031051109bff2c9a1eeb6c41993e810d0d910e1be2c029164566ae503e8a7920ddcddffd978454d9a76c8959261cd7083424fbd677c329e60f5d7c4f276eeed70558baab4517c6613bddba491e1df88509df7994f4f1ac551f758a61a99b603e1e3389a03103f1cf50c157a7cd9c75f203133fdde6d610d1da51711e319a7dd49cf0c552c7e357826aba19ebc122cfdd94729727c9db07fad473990b5bd6a828e622e65996307818fe2a598ba54b76b6527017f91a8af21e925e9a8f84ea7fa9ae1c752b0875d4018f94af1dd6610b0aa19e4ad855705fdb9864de31495054e5397fea2dbb1ddbbaa37b7308c12ded49265fa83c0705b1b06b48dc872572d85a3cbfcdf81ab32fc2be515dd311ec9e004526a89aabb5881b6f5d2df785fc7a771c4e890093b020b854b8b8033537bdbe7295d47ab02a539b39244b18f747abda4cbeb3edd2af6ee9eb142a2fa7999cd2533fa462c0be94be3d30ac51f5deecd26282d70643fb5af605f61caee58cebfa5b56a0d939fcdbd30ff4da391e3cce2de23d5ae0644e856b19c118177b7bfb74ffad4244a86f999816034d44bcebc01b4040c812bff36e97bb27a4efd6017c00b496114b78814e7bd3ce8dfb7e665349012f96f3b3a4872a5e7c3b9e8197cdfc1e93864446dc6adcedc904c3cf270825a96c5029ebbc5f81784154aa0ab971e5923839c58fcb9f59b8855a441bc84f4fad897c2bd4b5684b9d0978a8dde0f84bb3f67455afe92c60c875f6e300a4a9059209836feb1a31d7315720017798c19d0850ee6b43cfc290923d53270a56a605db6efe6cab753cb2d99cd35a746b8e67e3ca007cd7b9d247aa2df7969558b6cefe1c65a8a230e96cfa6d1afa30b38f2aeae44300d861dc2474da7c983e155baf8eb421ba4be7e874182a5f87591b746492123eadc242508596c52ad261372555e1a8db0825049a56b75739883a0dbe835de65bca21c5d0096470baabab187420bb7cfa18aa117f935c9601537004ce25c2d312fc7376cb1e725f84aa7843f8ae5092f772678918988c496f9f878b33ca455afcab33dfb233450411455543f36d65ad6b9bd9e5e5f4ab03dcb2dd1b8fcf7a00915cff6b15f660e0f902de9324ec5f0ecefb6dc278365d37c1440d3022c3c5464988129376c63a88a47950abed8991598a17bf894fbbf767c5b98463ad35bbaebdc32a034521566d9c0f6818bde3c0e025873ba4cd142e065289df207fa3b1ac3684b21511a638f2583b91442679526539b06ecf80dd55b5e04b79f12a8c6bc17c4327536cb346d9519448c8b7c8ca4b3f39c543fb55f2d8f754e1403e5e3e70d7951648a6d7246520901b00d2409cf49e79dbccad3ca9f2105ca1a81b97ae5cd0e0fb5f509046383db564a7167f4f13eff71ea416efdf93c3c9379342d74fc800bd33221a5d20c5118ad205e4d3550b9c381a64a8fe08307a111f9c548b7754ef907a1b34cc488e4476dfc7ddfb534e3bc33ba903d5b85abbcad61dc132c985e5e12cb5603c22163f0fea476245ae7e471f0ecb98056465015cd7b2094bbacd9c55c78b0d4b41df69cc8e0f0240db0e36a21066e60b90f1c35db0d3ad54dfbe6b34d6f69c682c5c7d1337a94e8b7d608302cce56e66c283aa33de0d1dec8cbaeb24d7a2ae11461fb1aa73809773ea27d4a7b0d1a1957d9d0e75dbc8eb516655949c45f9b2e5239bdfc8ce4f7da8c5c6740748a6102636a078aa16919641d110e011ae763b4259433014a440817874cf19b810fd4a77622061373ae19f3c716f560b7da2a7c73bc85b04921e23819b940e209621b12794af60a3a543768fabe37f003009a8c26f7dc91f1422d4429ed7f9d744cdd4b552afef75d241acda04ffc39672159ee248e602dab7192449e2ed4552995c258f00a476346e36a29a0126bc249040faa57c9380bdd74b83f62c56790920574433432f8d65c5cd185e24fad13127265c6a5ef8db4f114493d5cfa61d91664981408e93ad60756f5e84e4ee9b42b33024cf84a86ae4d19ea477414eab51d79d9d1537935edaf987e5acc56482efa0f904337204c835b4b4563925d29ae0f0ddc84ff2810a2bceb15e444b0f207e9ceb4b44aba06ba8172029c9e1b474b55e84c34f33ff47d9617628c9ea50eca5f3718a61860dddc2955c9f780976c1455d2cfea17050807a6e40c5cc27bc5fcc41364218b59f970babd407e2119be9278930dad53c475c7521abc5c987a3e277f2a402e8aef81fe9c72123867e8684c26f2b0858fc262460380199309eca2d2fa4452d3fe689d0f363ce52d3b4e90cbc8b95d7ab349f80a22dfcc09fb1718869c29451acd0d772af2e3626686915f95c4aebe95a79f5e9d15ff7cc65745c9cacda0bf0be02634d7372e30ea2efafc34849a7bdd530cbd8746a8d2d306bcdc26f57368ad1ffbff9e6ee6f7c11dd18f306e443c5ba0da3d4e1ba27537efc47a227c68ea0872d3fe08fdd361f4395e420fec76a815744f057cfeb40ffaf9a7cb47cb48ea24c2f8599c4dbd148a6ce83b5b65f66715b9b53e9856a845250eabf61c48da130af5b039e2c66cb88b9cb9a29b418d226355520f2b8b44c1be151a242a5ce80ac1f544c663d0a8f600b317a058e7038105326fa1bc05512bd0f53a7cf76f387a51a8fc27a6d43876f0984b5d19c1202b0536531cd32b962a609854270dea9409c3f81f853438e5df63339d006636acc96a4b48a7f967dd6778e5af4cf433c25f1eccf707936677d9616c54b1c7ae6e023d58946ab420ec8a1fc4951432b48a256a0bcad64dc4b60ef32bba9ac5912f7f8544808e8fbf8c3a5e1d4ca751d4b603af9fe119eabc6923205815e0e748b7e74af9543b0faa851f3cd81d2cd9fa0ca0f66f84f9f0b55ac3f1dbaeaeb639cee3955e5898be4a9fe2c1de50cb509056a54663fa9ee9174f946c9ccd2ab9cd3c1b6d5bd4ce2307a22bf5152dae40fd5ab9a8638d2f5c49113e9b84ba7c786cc836dad80f04c64a55a1e166fcfa30a9e185235783d4d2b5686a8679bccd7b7f3cdde4bd5263307981ed8cb904daa9fcb2b1bf2725b7d2c21bc034641c454b6c5eb794f2e513e8feeeb7fef78e74325e97e484bcbbfde4d8f4e7ad2e230b6f9df76df160103b763f64a64006e2f0533756c67bfc8dd1905fb988f9bd16486f78cea603ed1b0463a6ab6259d0487794efb800abd0e2595fbf334a21fb4023d467ad0bd3824d9536998a94513c08317eee853a1d2004bdd8612ad62ccfe8c524d15a436808ef177782cbe431316945989c851bd7d5392684ab66d322205555ea1e9ef7cb6549b1afc834f90099b4db6a627f4ce3d5cabce906aeea0bd8d0fcabb541cf0283a38c65d38e7cc65b321d7da63d75490affa691dbcbc3f0dea1e2f1000b72174845cf210ba0148b5f283158d1853d0f5b1f0d04908605d81a102e4366c489119e76a36bd8346a588de13f844c204c3faf7418c88fa558cc7465092a4f33bbf96c8030cca2102534cda470877ed64be0f044f0673ef066d3d4e79a2d2321b1d69aa99dcbd1fdee2807b8ebebce6ee2fb05d8bc690731d4f522df0ad44b5613b00f3a13f1cdc36d3b2366d937a6b2b897d678a554512e4d3a469580a72d9a8890b57ab9c4fe2a497509f662f46d6876bc4b6bd3b283b077ab2851252f32b5b87d73b3b8cecdfa2bdea1b0ada98a59c3724cfb6d0a077ffa4fb15b20f3c26e4c7f312b3797a0faba7fd4dbe3de674d48c2c16e9be544637f2fc7fa9a7b468eec9ed72c5fa5e0f39f5f88c12b1c6b0cadb3920d87caa224ae515378bb5024de3fe34efc5782f6ae8186a6a8aee9fe5d994ea720564189892ebf3e1baaf9c623ee557ce348b648f009fd17d994d08809b49ae8ef33d2615ca8816e2c90fe9228a0fc4a2b5ac74084dfcbc19c045671d9a79f3ec144069263c39dcdf294e8f2b4fee1a01ab43f4531aaf88e39260522921a658fe0b1648467281d42b7df3e4d8eb00b67fa7fa6bebe128d65f7236401ffb4f5c592a375a02f7e08b4c198880b7f5d828511e28215f4c1912d1f23fb77e71e56c62042bf4c856e670d5ae84f934fad4fe4a8065db19b5c0cd0f94d53ed1100907cd2b5ccf12fa04134c8f7194fc64a796a0613befa7b8e0735cdcaf3c94600accdef2524f8f6bb9e1153ec71a6abd9080175302e585bfc8844e3c263744ec9b1a3c1b94dc7a268878c45f0dc00c80505903b85343304519ae5825c2c57f101a7e58e9ad1c8fb4e028de42ae4c5e37377ffa13b58f33f334200 -MD = f52b3c537f28d89f0df1efee21c70f74df186f3928296d19582d5c51286e98bc - -Len = 40904 -Msg = 18df82a54c94b4569bbf2c4af0723ed1672615b9a8b7a67274b0e6707dc93bd17bae31407c026f197ba4e9cd3531578938cae5123d172cf4b78b61dbaceacc41c4097c49a0d63aeb6c97bb52b8771a82833e853e996036292039a42b6d97fb161c79ca8a5f16fc1696210a9f204c6f06710b5b05659aab5ad441192867d7b09aaa8584c962cc9fe020c93e7e16b83e5b2ab8d12f49cd75cffe2b279943b2d31397b510cf50ff0a923318bfb442c46fcad5cd4d83ec027bd0c4803548a8304dca0a91d764d2b82573f695f60c4b77ea9b9bd239caf741a5a54ec7adfb3f5a04072ca2414f90fed8cd92c8494ddada9716a350fccc1190db95c588f67bb037e112246fb75a31d90be62e39213e96f35e8316cffe51e3f905e9514c7890a2cfcc321b809f4b5e51a608f371e7a928cc28291bd5a72115830bea19999b01bd2baeb0395e62ebbe6f917909f70154376ddb51dbec5f034e36d5dd46fac798aa526dd4a5906902fa3ab5819753d9076cdc61437d9b8ec1361b4c0dfff4641b114cf3e6889e1b58b9bbf86ac50ed58c6f23a0472a6b9c21763956c16d11da539922262e0911dfb4a4f8437abdaf5faae74a82a50ae2f1ecb699dc40b8d89108ebdbf0f451701fe062fb7ffba4bede287c57eea4448af5e99d41c7d307d1f202af7f387f874342a29ccc9233a5c3bacfd754cb8d01eb11e2d43bfdc2828563088c17e618d413b0c3fa71666be5475a67a04803a8688bab9d038f6855537b4de42aaae1076066d00b23f4e1ea8fd228b87e3c7d3da2f42de4d143efd49f3b195c3240139452c70c41c05cedfac9ea8b891a372194d6aefd7de6617986914e2d394ce16307d3bbcb2f78b271e1bb19eba31c41d7f52d3f8530ebf0f0b44e3bf3421f96b9a70acc769bf4fd54e88fe6b1cf2b6287a7cf312bc788f93ba6018ad1415466fdbd2081734edc4580576ad943d3efa319f3e30c5908648342a4d0c431fc925a17913c622b10d793dc76767b0a77120b7521915676bd2896edf6e3707a3d8279f06b87f806a88dee508cdb536e8539a384790399eaac7b3a24e3631614cacccb6e9329ca6de0a75ec4e3c1ead8c30e722c425e5c1c9e0678cfb4783f676b17587a504961c67ecdeb20c14fc6aefb398056c6cd28765a7157d6b24972dbea0b29fdec0f437a4ba69e4c6fad7159f362d5eb4b76845faa63e02122ff37d80e5145ddada4faf20fdb7e313504734274307ad11a81f83f54841a984fc116c69e91b404dc300e95921393b55a7c52d0454b76f27b170c7f217d0d2480b8980d63727f58c0da05ca9bf7e6c1283c986a305cd134b5604985d9f6c1abfc0c4415259dadc3a3cb69fbf42f7e3ee56dcc7afb0b9381128336ba44963f160ce4a246abba462ccb2bc18f63626412da3677676fffc5c0d8a85c8629068e4ef8683b09bf70537a812196eeb1389e274fc0209954e16fd950f9415252eeb63a08c296c42767da970dd56f80a65b36638c324f78725897b3c29b6f8485f4c0c184173ce1ac48e66ab770d4ac097033b0d8b58d6c900d473876b96e868bc3b3cdb392b3c616bb7cdbc71a4ddda4229ef57d7160dd78a7864fb379c4be2c019745de5885dd2d67a6d284fa63783d167e1ac18d5333f0cf5de0c303fb962f5774104d94398cb9f56b3738399de69df7db06ed32ebd6c12dd2d4ec809b745e6c5318486c583d810cd4f229fe848f8c6bbea34887b22eb368f01177182ac27fe93b44170869574e55e7ec9f729edbd11a2ed81cb52fa48d29bc80acf232e75b75357c0191f442e878ae0be4bd763336ae338dafe3ea9e19174009d2373a4bbab948a84f2f8265171c31383f0691fd81ccd5aa4b3a6c851ddb8395320ecb56645c7cb14a099a2aa3e9775cf77579a27b1e1d1836e23cc2621c8d0a15a06c702007d97d3748c4f85389885d5534b58bec4c12bdb802e2bbb0836752c115a501b76268f561138838f0a16c25a168cd1f9cfebc821bc2e7daceb818537f94fe71f21430010f936f5042dc2b9a233c49c552db244fa54bd2868662a8f79645002897c6398a88f000a911dfcea622d6b2e7d88b510da0c52b269e2920245051328f6e1f8c761551c4ab25555d30e85e90ecf4b74ba252587b24dfb787c4f3e01c0c41c830affede41be46e4de1fbbfd693c6f071bf8042a48e711b1e5bec8194708d6682d1b8bc1014b3b345b5de4dac73f1022c8f6fd661dd7fcc242fa17253aecf6a88ca4041f8cb8cdeedbd1aa1f315da1b15a8387327f5c6790a760282c7d1e69305431b023686fc4ba676357f130fee85bda89e8b6f8de1cc31bd842559908f7a78da9d8f21fd6e83f06fb327a4b8aafc94fef691c0fc5e104a74aaec8151068b640f6c4b739570026c08182e20a69bca2c19d52894d797ffb529eb5ae79a0830474ffbc983c59d6169ddd9051f503d78f397aeb273862be4f24bc9d2f4e1f113a31ac08bdb24430b8a6f8a4ee95c0ca38bd707b1e5ae965a8258cae721bf5daff7fe5ef4f227fd7b4e2b805e171095c4458664c963b743eb05ef732a06889a6fc6792ba76157493b15a06fd531144545c0f45a4b6616d0f0cd6e36fe0be453dd8f09bb259128a2b5714cbd26cfedb7b27ecf3cca6563aa167953aae5ba390673c23e81c21a12969501aedcd53bf34994ef6590c8fa245bc67a4e23738a2d2ebd0066243f54ab9134174563631dcb97678355fab99cbf427b40ac552a04074923ba4ef6efe96a2f2d528ec552dded0d94eb2eef3eb5bb1acf7cfc947bb07dc24260278e4640c4dceb2409971704ce38b7774ec2aaedae311d8fcd85db07e7369382ae6ee4e35206f80c343d421ae59559c83439909cef11ffe98d9dea82da1281a231fd4e497849ce8bad4c4698d9afd65e8d98825c1459e12abb310ca9dcf2b73f50dde50bce21f912c338a706f0e4b79aa983f293a4656bb3e503c3f556338eca99754b72ca0be2521486e5ddf1d0981d166053ec25c0fa25797a92eddc7182d45a47d446d284249a2fbb758622ffd24662d248ce0ef906f0170a1c0be6193ddd41ea21c09e072a7b534af8b82acf00b70d4e23a1c67a2c941c36a1d7f9b70a45bec0b6a883218e765db9c1cc6fcabdef7438871fe2d0d5821784d6ca8dc792ce4f600547085fab1b7d8c733b687f34404625d580fa799c5a87892d6c28b741a7624c9024b40e2abb51378f9dbb593e59d19ab18d63e0db8dea9818254122a191a5ead9da0cd96806675f795bcef516acd50b8d8db5a33d8ccf46298e6d863cfd78cf54df893ded6d2e48b30e29bf77b99efcec1a764d1ce79417c420045e6e4b596ea39dafa845602497df2d3234bbf0bde33fbc1c2b041ee7918a62bc17d01bc64d18ace6a4ea7fd8d150219ed16df2a052fadb1de98da31827eeceeb4eecef5def5675c4b0671cb969b893c631f82fe4c0cff001f51414c46f63dd28602f267ed9df90d05725e754e57aec2eb3051909c101a35eca21d46acc8c15e9f81161a77106868005b14029c919a35ef0ff4e7db8526d8af5417289b3b9f1a6833e1176597dbf6a5883b7a6790741cd685120bf3b14a72cf2fd6f9fd98008e47e0fc65a07a7a3d5ac37ce6999d6500085a5305caddaf8ab4fb03c1b9270b43a54f0e0c0f016ec788d27f4d19009568ed5661dc4a507da8c6804589b730e9c0eb49c0159974df1c987eebb7cf012bdced41e1985a54db546d864558dffbc18d7f96ba87281af4c2f08f682ca3e850e470e27e42e12ff11711d4aa3619d0bc33cbfea36aa33cd643facda0b57dfc2b09de02dee1c92ae8781a331d2b4df60239354923c7f122ad271d0038594586e5d29f69a97df98de800f06b464063b6ba27273ee4a5fc14a0f4c0efdb21e3cea5c81bdf881f59a01835fb44cc7c43580c8608a68b0cab5ad7344d632f133f1c9471ba2c22cdd1aba1a1a38658e8d52421dc4049c304e63b7b6e2b24dc3a42b8da58e517219149f5abcc51f8918a026121b437ef32969500b42bc2fa8b9bd2e99e02026a2a73a9c75d3d6b63206cb0593493546080c9a1f2a9f27aade440d8f908f97bebe87ad969df7c5b8fac96c8528003016356a6f056834bbb048e303d2e41c4b66300aec1235a118744de0e3395308ba6c25c336b7769beedc83273e7d171eb1d991d174a3df685594a5eded76a6ab4a943397afa9c84d478c17712c029bff61657e5be5afeda5e3768d30e9e18560473af9583860cfc14c4b70614af80546e0b6300aadaaf2f278b68e5a46fe91e056ccd1a54f510f807397286819b1c58db638617e3b3981c65bc103daa3123e73ffc676ef731f0a03340b9a0616e46f2c38688d272cb01caa232298327ce0fdc398c43397420f41d223f56fcbd0f464ab0dc31d85e0c326065557a5f242df5227b822b24d1ac64975ca00f419c66648929cd49d2af5d7207378dcd77a8361de48d48e4d618bc873567c9ad17075be8d7b7c197676ea50be79f42e876bbd1ce48f84439f85137a620cd24f82805d6195be020e440a2ce432725dc940265e6527643e0f132820709801617b7199ebf413e2f52f80453bf63f051c399c3af5def97f683d32bb513f87cc80cb495dafea6a729bf9b5c8960b269ac5fbf63a01eeed39994a98cf143bb3c6d6ab542c27b90bf58cf95f04d997abbbd19ce8741129751b57d39fc3f7f99e98c9983c85d1f49ae43ebad67a652010d0c578dd9981f313ad1a54c24a6afdcabae01e6d0b4d0189b7279ad6a9d7391882282c501b02e06b57674a9ac2ebbcaa95a0aa502cd7744ae6ee35ba039e4705386033ea78e285ceb2b521a3bdf8bac0c181c8a05b2fd1611be8f7fb2828de698c040c0723cf37c0478a76579c208c9fb709f5b826b48d6e9eae7e34780573d7c59a3130ac179ae27e5db5310de186b9febfbe120fe42cc617b514e083c28bb29d893fe1825a0397cfb56aca53ba4d8201098e48875d23f9ef837879cbdeaaac7c5784b447052672c418138e3e29559a568de2c61d7df79cbe90057ad0b83507da9b9c035ab767e5f40c2be6fdad136567a3680542d53c00ed61486e02fddf6740bc02694def4c73c7e8208f42b42b75cce06a9097e155d8f48dbdcdf30dee3d473f444080fb48aec852adc18decf24dfecb77027d20d9877c7bd2152167061c469bde43a489d0f97dd200383fa5fc4065db29b573223b8eed9221ce0ea7ab66c7683ccd190999d630cce45de87dce0faa85ef240a43f071b08729632b3e32bf521aec576f0907d7b9c9a69d18e2dc0e355223f8b3349cb27db1557f079950887f3a697d16e68f80515ee3903153aace8ec6848dfe4294d3ada7327c14477954973d40a89150a542afd317b1d27ebec31f697d6e5c1c7d57a8ef4ce4d1d711a64299ee647ea5ed911decbf8c6c928c7e7fb16b144d10baa127e01133d0b6bde009d6df2b2f74cd1e33f2478a705d98732814fa1a51cde16283300bf39174d2a4358aaf77343bd82c7a9a4c368e2e6723912a96eb0ab265fe5335b9ae848ff4658e1bbbd31d69735e6a3b3a0b06937d125358cdf0c85cdce7008786cf3a66a7a65c00a0c95b9c43367b5b9d827a0b4eb1d7360be62b2b9abf239c1fd0139740e937efdac47f32ac173671e337691460a4a528ed1593bd43e924f9c15bb0a064909a2fe64ee8cb32a32424a794544d374d45c7ce19a2704ce79d1737bc9200974f0b474fe328d46b4cbcda5723bbf4472e21993b5cc7e33a5ce47adf8d28363d76f3cc740bdfdcaa9679098e6010c824c9c103b1798494809ba3ab2547e3cfebaafc35ef334e4294f2d14899c3f33744a2bc9ddcda68f2b436531ea577752c065d7d0a3df424a4aef46e0e15d9c3a01b4b7ccdfa09d58c49bf6b4bdc862cd931f10ecfdcb8d3815d0d97d09f1c02b13d167a2ab5826acfb58954b9371eab65e32829ed480bdb5723c0f716720540d91ea64d2a7bde894b8c46c7fd418b51409e4546e91c77bca4979104665b200e96247d6e43d968c17e325a0d7e8866bef7b7eafe49a666f7e82d003836a6e6bc67030e460d4adb93e64c45cdc3783b54f9e47ba89582540d9058910b1dd1d3eaca2edb6cfd3c8181023e9c6142ad73b3d59899ee433ce96e3baec6157288720a4e0c575b9a4b0509508dc06092749a4c0948a827e94271ba58a411bfdb274bab4120249a4ae2d0ad5fce4454397a298e137948fdde1fa75265bcf692ce3acb4e720ea591a5907eed9e54aab49e3aac1a72bedec8b840d4c6e17df716a23f6b542f3c6cea20d05a3a8ad575fa27129c41a56ddc310e3284986a4b95b42da1c65cf71ddcfc532f0d24a3a508ad9abe74c42a1ae39f268151375eca5503970e46d9583798509309022c876805373f8abff28f4a678bb799b5343d5eb78d94d17759c12e018f970ad3c29472ee3fabf3f85d3380fa8f28081b1f949d2faa9da7d24ed045baf1a580fc77597a161f66a69874b532ff020e490d49e2fa3fe317ddd238f433272f6517d6cb44d22f6ed60f2ad992f4f79cc0d90653a6ea7aefa9f00198ab5ad8a14c4c1d3ef51f9ca6909a29ec4b3b66b7e63490bd6f023308ba9afafe744141ffc17a1a32e8b6e04f1cd4003d4c6aeedbf4e826f789c62ac6c01b08dadd7ae5837b4e68577e3c9cd0e149683d2527d27153605392b5aab4b2611cb5ae455c45e4c015820d441514c46466ac7c53e6c420b839810f41245344040cabf94a89e59c368be1d4c8d4faa24cb8576b572c366269d049cddac799142f57363c6b78470254fe123e7af0b0e2d0baf39aad5cabaf0ec1086ed118f87b59a90ef826abecbf8208adbae8fcda1eb6fafb8ad51c967f0d986762c27cf402096e70acea99393c7427feca815dd8ae55d4f9ac5cd0794aeca2c13a3d780e40b51415db45c4df0171d8900de2a82f2a33e5588fb32cd6ab328cc06590aec9afe33658f3b6b320972196fbc56b40601ae7b8a2956666311865c2cf656a6598b82a41d496bbe8b075f9efbca1a9cafde8d7ab626de5211b0afcc158ca39410df1e0c2f334d3e9f116714f3d232cbc6b2c8a5a1269bde1f70b7e24e7047bd59bd5bd364f4e8d1b85010e3207ba42892a4e86312d296f3d4782505a1494a087b4dc061843545601cece5734a6e7a9a5ddd741bd3d2d67779f1819cd4c0b55cc0b9d51e579d6ad4140c6b2d3853bc0b6d85f437aacd635456025411b07c8fa36e262273a4d56113e8d8 -MD = 1ca0be9286023fb0b947f07cad056e59cff9d2d16c7cefdbedc33950a9312685 - -Len = 41696 -Msg = d9db535f11ed31c906af44c6b10a631fc6b004c289a4b066e3fcb472b5e61a1b6ce9d7cdd66d46cd347ed51c90cdff9e50f77a7b0c0ab1c69d46745d7620ee10388dd805807ced5a03a49e0dde810619279920e2c80438d38d2b9f467bd0a3a4644fbecdb8230eba9eab0561432e62d8721e60be66992dd7dc359df66cfd202018b7f2ee266991332b1b74df69ddfa235a0ca1d68dd27818b1ecd735f0b04dcc7e4eda3071565e0ed37a5250f596b64207ed4af3e6b501df35d7b3caaff012efbb9bdf5a41f25e93bd52077c925f7e7ca048c5dd184db1738f7e9a7f52c557d2fa26693640467709122afb2be6423a1b4ea6795ccc9f6e1ee869f51a813704be6178e18a145992baf98b96259946d265388ece38aab5212668212a64e34f01f91818ad1f653398ec9bfc403154732ea387882c385996b3d4362da325211436cb488e37bddcdd6fe81f056119bfd2371c621cfb26824a0a707b15c625e28f8c7e1963e62b205e01f6ae2e61a3816ad31af2d3a3c8ccda10425e62fd2bcfc6e959b21e2133dabe345d7000a8984244ebe35e348ce6e04dab91089baf0190c337a33c47529bb206f2678c029ebfac6668c0cfc81f4a65abc5a7a148436dcc8e5ca5de67e02c4f3d225a2bbdabe265da30f96d15c2bb04fc45ca50f123382b2d42a7c10533ae5a6bac7f74b738c715a82dd65fa5de00654913433d1fb62a57aacff00ca9b3e97a98771e907aab3765d6459fce00dce22f99175a9159640af50cedcae8dbc8a558cd6d7fa68e6efafc6e629be1ac22290bf53956742895a2b05c837b7d24daa99c1275e9df79e7d884776b13c1331a9da06461810d13b1b82da1784cf20b51beed6d77a663c58099a2fa484f951d2b0597ee772185a2201517e3b685701995acf3e85cfc59f9a00400fee19786f0bc2b979b637f035d4b81142b246e1ed40e3b578a0a34e99eaee3468b1e33bc3637d549740de3b0cd98c3cc80aa4f25c62432c15b6a953d3b14fc1ca9e76a5e7603cc54805d94b47970a5e9ea306fac77405bd86464697a58391728612486953988d862c83cdc36e93ced10719e17dc6ec87c45ace1f6cb7e85fe15babdcd88062ec0185290015ea66264eb1edc8fdd33265eb03bc7865633607889bd9a8860655d4e2028434c55374cd222f8d31fd64ec0c9bf1a005f4302324c2c71a3fe44de7d4822523b05432460ff5d07690fef4800851d5072c9bb706343a8dec1795dfaf677c5d6627450f608b2435487a652a74d5970e5070ee6075b25a20cda3fd24030a3b2be9ee1a234abb57ce6162d24f60e0e61e2a575eb4e83bac504d799cc3994949112d9936466b0ceb1c6fcec90baad6c974e3645f2cd41c9b6cda1cf736b881109d8fad3bc1581c68afa232bbb7d913bbb31a1c7250dfe1c206f1e29ee6075e4c21ae9e9d2c88564ae8c7132d0c622437494ce43aa952379a9f338ef66a0c4d365df8e1dcf072472c683d048f51ec84c6b7ea500a9ed16a9f960d66802b1dba79a30d1b6db5ac6b679e827b7520ceb1d47f70e484b9e4174b9bee0ddeb1d242708149afe1d4ad3fa70c25dc51118f37fb107f161b72f0ba191153d96486c051d5893d13bbe5eb30452195cbb57ca483a51b736941628dbfa286ed7db4224e84f31b55eb6e51fcf9cc8f60be14fab5216ce0ec52990121b4527d095f401cf34873c8329b7bb138d8c7a60527e1e427adbd11486684c74324b35445f28acf4518b21041a8668c4569b0f5f19dbef17265001d2629973d688d4fbd11dc16c1ca72387401a6a13ba939030fb4841e8b3bf3e074f3f032cc085a8217fb70568ce9e1916400fade57baa34843dc8f6319dae6d8a9407efa0bb918e4e56163dc9929e34770be3950591054fb42c7f42f35d5aa533a7a0a5f74e144f2a5f20b0b6f00f3b52a97c6b9b840aa967d0566f567c2aaeaa92f46d580276b35ea1bea8587159f74e23c476d1da2309463235c48181884f965de98feb5e1f829224d96bd69ce4301480a100cd1db738f85905889df4db529f0e6952daea77846df1574259fa18ad4cc8fd4fb7d42dff264dac04d15e8a7d6eaf5b004a2ee781980f227509115e389d04bfacb888ef24781714804646ff99ab47a6df65b3d540bb86204c0d6c1c97af3bcf5ff8c0646f95be23432334a16dfedf34385300aa8a7d5f3b0f8e90bb932b7515b09e04f4aa264ac39791b0d8c30d7eec523c9dcf2786a15905b307a4f4b9ba78e7d2dc079bd2c4dbc2b8430c61832cb6774713aadf7f546477a5583e820013e34bbed1050c4233530dbf74a51006f17aed9ce9a57a108143ad8b0bf005a9873b25876a57c31e9f13c0cfcc0b983ed620fd64a727bfe02fdeef8ea824445b1f69bd583063880d1102230fd2a7c1d5e291efc7d6977798661d85d6b84108bfe2555b57aa9225b78f0a7ea80edf53701eb30becfd5f6adf2ee8b68ac3af197dd8e747ac604c60c5241218c1081c15ba906f99fca4e6605e9027ccd34fd53f3c0908c880dafa03dfd5033a8349c7d05842aee01e539421bd93c20dd8e61d42a47e9e28fba102d4acacc32c1658464cf53c56297b93d174a340a1c2c20feee95e3e92ad443cce9cd5b03b36a1bd0351378450bc3aeb0523b89dad32b853b0fd1251cda08433c42201e953a04c0164a7c62485e185e498f4a5b5cca7e338cc4767c03649e20f4e30d960f4b141abd3154b24dce08104f3b0128de7676a48a88c0692b4ef8756d38c051c04b2a543b7656e8a3c0058d67c1fa62fe7bb760bad9797cf31db9a93bbff2c256ceba351785dd6608f8a32df9c080aa2b2eb2f08432fc17f9456444b6d51f68415a4605e7ec62caebcc636a9bb34e6ee323fbcc7d31b2cabc5a6ad08534a0d40e62507f13067177aabfc8dbb426ce11c4dff46d0c324815bab13fc51d4b21661c6b5be93f80a40ce44745e9d9776a332ed72f4ac7d12689530e75aaf5850bcf09f9eadcb3d754eb16f75d2d8241ad53bf9e1efe267ad88633b68eea947eda4f45826fe216871ea2c144911f350221f3c59945efaebbc8accb5e0e1c70a517975d996d61ddfc6bc451b3642768254283ff5d36a7c700915d984955a910744e17c0a3660480b3c6b066c858ee9247a994bb5e63bf15e5ad29091d08290a78e840fd34dc129549ba077ef7e1cd59d5a19698114f8e11c7869fbc4d8804b52f60c391c25244923aa029f8d6815c255bd51a041a7cad2142b812205f77d4a71461effcd04af2ede323a862c8da036b46ae8f8dde5d84ead3ac20b3d73a1166a44656bce338a62effbef34b533e6bb222b87793d174bdc4f6fd6c052951336a7b9868407fade6dbccdcab211a30ed807c6d62c49844a05629062492ea5fc328e6c2c5260a0d3d5af70730726254116cb047c18ea76fe4f4e6611acb7eb83938927fddec26f90242eab913bde00a7fbd6ad224506338e447cb988f3d7aed1e0ffb0a12f13ad3ee1a348cc57207e671190896fbc8604236c5251722675380da158d0c14d3da30495750dce61d3e5aae0625f0c845331e54e39f5754b79cf605ffb4f054126990bc70cc33c64e17e97efb2f9a0a55302fb729a6f396ccabcf2a052f51412b8d67affd032c165319157c6e91dd42870bf8e60db8567905247eaefc48a97c8d9a47ac62921036eab6611ed7094501491afc5a16600a7c0f8b771d1b9d5356c734933a27f59aa863744eeedad26bb719e1bc9bca1a7a003a456aed0999f97056d0ecc1e3aa35fb6bd75164c0a9abe487e4bc139f644fb613e6aca73cdb0649baf3b6ebfc2c5ca05253fb095eeba00a01b87d6a1cc9d5fe2af3cec42bbd045372118400f7f87927b57ebe44dc14c2a815c17307a8a7c758fdd143dc6ccc7e2dfabed6b95dab35f203cc0dcfeea19e3f32942f64f9aa7e56fb13ae586685ce29e350116d9390fdbfdba08bd2fd3e9d4ff6a5251a563e6568a13f50b0bf859ee79a79d6a640565ac19ba09b269e384a4ac078d68064d0371e9ec8ed7dbe284ad7ae9098fbda77b7a7c250de03382b1fc03e93c64f9c0c4dd93224d728090a5c8a8e38dac6c8519ee2fe15a7215183a840af6a66c0724f342909f7a04826886e60b7e71e9fa0909af39d8388e970de5e3cb1715a9b6e1564ae9495db467d4eeb0aca0fc6fee9a1266a2f0f15d42ca7bc24e35cf42915fb69ba50a3eabb93ba4cd92327766d09ffbbb7313cc069db5c3c899361d601d07daddccc96411ff0571e6c51d2af629828d55b32810b13137879eb604472be43f8cb9676e180dc2991da34e475d457faa90dd6a17068884b98debad8595ca6d7092d67de0a2c7896170ab349a587e5d7fccfaa0c8f6b020a19e5884a34f664003b5de16094a68dcc432a77ffd62c7486908555e2227548d58828d4544bc26e65ebd763ad05818432a2a3e3857c548cad00e96ab0fe39a51470131f8522533e6eb7248f21d13fe47fb21196692c72b6a1ca464907770aaf6d5e3eca3b4d2b4c8119cfc45d8c4436fa0dfe01195b195b1b59367144017ad0469ef6850520bd21537023a3ceab30e447f2c3a4148cbb02504a2483f5320cb016dee4a061418b554c76da9de3928884d01d0cfff935ca4506f9baf1998d32b7748a93dcee240840d28a5f133ae6bd9128e9248525eae99ba5f4443abf778f6ed62e5e7afa4cd68c8c272bb4331c3281b8f3b4d439107b6e93d67adfc595653ec236df0b14205880efd9caf17ab7a9df16a9385d914b023676fca9514a4b66bfbf30801dca4310d6641ea74b602d6621b8962991ccff109bc5f36a1fcc2e066a23a7dc239b3981e59f625b32820209c2152703014ab11906e73727cbb991c6b696095dacf5584e46e84151376eb9f768c2f85f3ca8e5adf071548cc5913b2a2d9cd18f2a6733b862d53823da74d9d16e287688a4562121f0fac7e3adf17e93479e9ceb1c7f6062d1ecb34d8c32d60a4aec2e29c8d0d82770ca0dd6d548c0b49d11d7ec039c42d01ca55f28dd37231497547bbd1ab79f21088582d0ec05c5e086acff2c604c7f829b8578604dd06582cc180bbd3a68ca9110a3e36c42c6e2b9acb69f06c31e5afce703bb6e4ecd01d7719d4a9478630f1a31bb9bf389faab9277c51415ac70899177b674bd505b8c84f06ab4fd8544c10ee4231921121f852d606f1ad37ce17ff2d60450d8132a6a0de0f6e732c17c74f19070e75f8ba403ccff0affbab4ffa2937a73bc38d7a82ee4cbc83deebd78bf64df2b93195736ac03bc2f5f56050995f5ed9b337a4e634fac1955358be9c7f4db18c988e8f535e2642052a61fbdcdce9ca7d142f6c7ca50c642346a94d6f8b9c6e5c14538f6205b60b40b50827f8ab0ea21bc6748d46bb6c5dedc5983f57972aabea964a3ca945b8bffb00b28aaeee180f3b31ceb04c5f62d57b36ee3c5d8b4091bf84393f2f077385bf7226cc058d4d3866bd047d957a35f4560273ee884f26486247e93ffd34308612732e960670f64623d2e09b29f22ee10592effae0cc24f75b4822e519b237e97f6b9090b77f5a60fbd828b310b195c5104d2a0b6de882c633eeabd98d6bd0d78bc2156122a3c3af7537a56c529db2c7009aebc7388c87de71a04ec261454378c0e185b14fc2775a19571f6ff8a0cc105ce3fcd648a17c679dc8d1489b2ad7f3a52ea82a44c5bf8a6fa05e630aa12cc7ac8f23e1a50da98840cdfd144501d571c21246720b95e367007b29f18e871b157906299058ba566ae1179ace66b28519a0f62631ac182b18534e49c18e3cdf2249afd68a688ecb35080e701e07242f14c64011102d38dfc6f082877a11a7c015a7f4f178dd734f103d1a46aa2f411b89bc5acfb698dc46986080a9c420b00816183c4401c0502c2309a3e61de6f091a10baa28cdf4eca9b72aaf7749c23ffd4f26f095ce180ca897f311161d3419d8843a9ae4fa4a4f504ad676bbaeff3ce9e55876ad86ed910c9484cc9f5222a43959d190cae7a1ef837aed3f3b9edf8f1203363754d247c6a041423c4966b77afc4859f6a33c01b38a6ff671c0bf6b21c1cf499b515a2f93abc7b7c9dbfefc81697b593337a07383ac50797312b9aad83d71180b6ec5ace0774e6bdc1fc5f7a2c71759af4ebcfd473345feaff935a59dd0122ced71bcc7954afde5dbdb60b2c66047e1d2b038aae765780e8c3ddb6259c0da0baa23e6879b6dfcad30d87a35d37a317a0424bb7f4c8b0e3072a552ebf256f03fab4cecf4d828744b41deb986b35efdabad74ed865cec32edc9fb434852da7d5057b4751635c28d4778b5c5af4c54d4fd356678c600d20accfa05557f5f94a8c415222af69a856e2a3c2447b888a3def704c301472183be556b8c319a03cb9a254f60b29bf0b7407cf4f4e7a74d95422182523312a548771085577ea024c97afa6c34b70d1da12ac30aed4c868570290318ddb32e76695d86b030e59aacd471ccd467de550b8b5589e5d71f5c177dba262c2a2ca37a2e973e55dd0e8f8235a722eec1d17aa0bce855ed7a0732eb041e112803447a9bdf4ec0da27a0878e34438424093884c67e0cb08a9ead0fe94d7c4c722ea3babfc3a995a9d6448bb8186e7add09ba7c6417e921240ab8fbf99ffd607473f26bd023d14428b2a1a1e82b4f8d8287006962d0a6302387d1ff0344c9d4949cd995b547ed55c18260d406b30f44794cb253a7f16c65efdda021ef8207303c6fff4156772651db102829faf9d5282b2077421dc26249f0d4cc6ba5a2dffdd3b60d779bfba4bfdd22a2aaac45cac000caf73fab8bb1638f33fee50deb7ac1c137aa3d6c1a8e273181755e05df15946114db513993803b32c4dd9610a700076dbb7f9db11e0c113ef54a4deb0ee02cb4c4cb81b023f85a434d1286941c99544109349e524d48066c46c980471b501162a36ed6f6834147289744bd82946b32a4eb704837f0678d233b99fe024e8fcad4796d58f4fb828a4b6a1c44c355a128fe27dba4494e942fcb9d63cf02efc5df710e6f0f92d3e3ac128e42223da761bfb8861eb96eb1f573cc34cefc314619d8a0291d04b9528d34e7ca5d5fdad4d37d38d0e1908f5fb2e18fc8838c769bb43ecb941f3e4fc1a8aa31e71504812321ede7cdcb2f95a1f4017a212987b835be9959151cc53d685b9757ae14171adb70942d4485a066bfe35cf60669f6e15d5e6fb275bda26c8fcf82c3e4ffa38c45ebfc73ffb7ebec01a6796c41ebe0d85bbc4a3e7ba9dcc37e2cf3dc5481adc1a9b7ac1fc408160daf66e04298564d857701b164f1887b297c99720ac5403fa04fff2c9b5c202bb3104a1ae2d45345d0f9552d8f9d048888d33e88b5fee460117ee9054d8fa831c56d7baeb2bd89d1a128df452449 -MD = d8101ed4097b4bde7abbc16cd854e4c122460dbbabf08a9f56f4f2b882f59b00 - -Len = 42488 -Msg = c0a4f347f790b9985d95426bd59a30eea659a0d77d5852f8b61a0a14d79635f25de8d0afbc478658a13718b97aff026f385e5c45537afebd0f19e7ecff13e08bc7085c4c254ea36a332d2f84e64f56abdb722aba53609ee57c21ea95f26f3074856a5fc33d8d58f49be14f75227074ca16fdd3de84f2799b829ad9b8b8906ed21f78a1bf09ecec1f62b94033354ca4f37167205aee19d905abec7dfc5a60e1d01e98e9e69354a9120f1fc96727ca2e4e7518d6d699bb044b7e7f9e0adfc6d393093400e0e2abd5f62a7ab4b901d15904a979c0f98ec1439683bc04894fa98a4668b3af56fedbb9f23b32c7d0ca4b6f3d96f0a56cd414de0e43097622b2f34f0fc47dbcf0f0ca9d2fcbafcb558a1fb620c2e64cd7739a1dda45cfbd7d118b6a16a3faef55bf62c8d4615887ef493577d6b7c47ee0743d48231177a141735923849092122e7389840a8697c5471075f986fdf00332dee4a6103067ea17e145c28110adeb22152917f9c1d34b05e6c786591ad4a373b97780ca290960a662378e34adb344daab29cac89a75e2d0d413647798d6264c0ddd1e7884c4cb97fe17d0c6ee0ce3fd4071e5a099e35250e141dc07ff605364e300c843cafff291bdcdd15f5b209034d9e9b0a84786632e15393632d5d9f36442c7c65382249e3da841d6257d571527807973092bc6dd1278e3ba1fa4a9cef3331a5fcf349a9742c65c2a43db1a397d3c0975eace0c87a31327b0f7f337acbabde1dddf69c9a54a200414dffecfc3df1681ff74b6be2a8aedee5fe14bed5560e80486ada71990fabc22db226ce07cf414c959ce6d468e6f0e1e10063332908ebc6ca35e79f21ffca49fc833afb32c6541c9cb227b0a7bf87fa10b8d336e27ec42ff7b1d64bc1cf8e061233a4fb29bd9a26a9d956674b9d0475d989fd30ae02181a65810f2df4d9576523461d24390f941921651b8ea0f9d6e3cff649c6c84d6814a805faac37a7c705942cec2d0d46d252a7f7ef8d64708fd25870315fddbb24bd13c3314d06d55d55d97a9a6c030dc561b2043af9f27b8fbff79a5c725ac5ee625d4b4b96fedc7ae48791b077b69eedd4b41c964ad785670b41d71384dc1815a2c90092006c17a0201314c6c694a4cc1a42a389f680189652bbb90f2dbe0c4b0d0b85bd2ffb217d97006635df29a9e0a0d23b7e9388cfae04c9b297d39d2cfeff793d155c088463c7d4288627e208bc06d736ec885df50ecff05655fcd5e491f8b6a9433b30bae31102be50475a5bcecae6386c6b7c4348e2c406c22014edb497385cbf33e02f8c3110b9fca3ff1d996b73b276b36004ed0bb95654d3c692c74972c9f1ecb37cbf76828e13d44cc89c47043783e6a5e45b9944c7869e576e5a8dfa7383bc170d0d7fdcbd1e3ecfe7480c1c2a2c7bca5c251a0adcffd663eaded333dbdd28876af6ab83b9747a04e43d19202cc8e929c6ca1c5ff8f9126892d4c7b38566c88110fb882c25ceec6869ec0cb491f1c550decb0ec8ce3ae8d1e0ccc9fde2d90280898ca41a64862c86c2c5354e0c3f86ebee987fe9af1db03c7f376877867c6d325f3a7df30822a0cc99694150fdfaa43770c2ce172e1a0f04a8a501c4d2f96ee2ec85742a833cefc64838bf71d9cbb3e02fda97f5cdc85bc70786544a7ab89e2ecbee3545682d6fe079c3fe05421b2c6266306be9f0a13cf0166bae8cc032617277e52fb8198cb7c7889b8b9fa971742aae649888592d192c5fb59f10560f5f5a7b0ac21739c35dd80f1fe6b5825731c572f7cc4549c476b84e049459aea7fe533fbfaad72b79a89e77d1addb6f44cbbf5e6a65a5552fec305bc92ced3c84b4d95074387c71184e875d413f65c2b2d874cb3d031d0da7d0311383d72f823e296937d8f97bad17a62f29ef1a091f39be8233c01330d5c4c9170fc501b5022ca29f605e6c59220055f2585bcc29e742046432c41475301f4d7eaafd6b024ee8d6c854651f99925ac47d72f7d43cbd5430975299855ecf0fc3b46f9d419bcaeb2c90ae9d71b1509f782d0443c0d603f8d997fdb0f461e52ec274e84543e608bc2a74b9581134ff36e78d86dff07a5d9845f29ecad00324f4d02c8f55d0758ad446e12f356c98f0c9a91b752d019e2ccb2c13d017b6c700ea6347df7f85ceb3bc08525ab5e251d7b0236349ab62b5e3f9f2881c57f721fb87f2535302c25635dbf564c64a11040692ecd19edba25625bd1fdbfddc3fb8874603db848014a063dc84851c6287041fea7c02cf5e2ef3647d2a6bdf44fedf46bd2e4cde87fb31d0063c3fb7bfa2f6861f47536573872222c2a8d44b02932a9c55c823eb8af48efd1182f11281f33fdbb9d56febec4946e325f181bb95bb0f0a9877fd15f98f2c6d670f55c78a06648332bc94ed08d3e6180fbb10cb8ed51103fda434f864297e837f27ba41084ae91f22538ec359b59443f86bfdd55e5fb53b0dd367fd4b6209e1d272ab09bd3f51f20130aa196f6cb5f9686aa57374d98ff2418c02bf2fb7630b0956a4abf95223be47da7359ba77efaae85d942072c0f5dc2144a1987197fe617c6a43824d31d2d66ec7770ebb5585daf0ab6666c8b48b5b3583a123c1925087b423e437395ce3dcfe8e21a2f2843d0c09ea88a0f712b4f1f6cfadeb9024fdd038fa23354e11db347f750fa0e08269a09c8177897e6a0722dd9f045a5dce5aed83736d06ec1f2d6f5a329d9315ee804b3106bf6adf38f670526860fa8b0cec321c264e26a3c35ef0273d57f3f317356e6fe0dcdf99ee077d0db23036b85f46407b69330ef5ace4695efbcb4e18aaed8c91b63c522f17be7b6812eeb96633ed9b29d2a83a624a523d7a04640bf7081d185eed6a5d1f44802de9f118dd152946949fe93a337a1a2cef00ddcea80ebd48b41ffcf37adae300f71bd33b1c25bde5ef462355849daae8e07bfe47bcd038f4c26d7b4415f2719559663fc21148504fedd50786a84d5afad443cc8bc4dc19b5d5cfdee8c8e67ed1d761ad4a46dd9ef922950c4a0929c8f71d00eee72a92cde060af9e6e0e37792af38692301765d856103ea81c318373423d3bcc068884d418e59540304065ef25306d95101d61bafb591a7179bc1ac880a74cfa465932aac3f7095acc29e24f35105f1c66c351b56d4fb0eeff032057170dcce043072cd085f78444be053d27ff05f39eb0a3d6460076aa86f8a164ad99b33414792cc3e3b3798ea4727cf6e7d7a3c3926a294fdb79606fb00311381a7d4a0b1d55349832f0ff90e085fb703d435c37ae0fee2f141c9f6910bacd1b4c3634ba5163b92a6ca2fc238f650b6966e6a1d8382e4d045e8e863f2f6c4f9ea14905da572114faff6de1cf079c17231326071dc721d0503923a74a42a41332c84a3fe39519f27a49a652fbff97c93db0861e80e1a712a332908523110eb2681fae355ea1babc38f9e0c222cde47c29dd8b3aaa0e1a7e7db949a24210f897bf15f9a8b3f38fecb77e91b1dc090eba77e8a9fde1a2e89e305bb3813fa8ee5da84990ec7c11060e66565da4a017730e986076dad056bddc7b8862a4746f7c5e943918732f60b99bc60f991cf79fbdd30bd35653ee7ff6c3afdddb7e78cb1f253352f4ff4689270f6708d87d4b085bc262cfdcfba4b52fee5dba8291b552434be625cad349f0bae3c9d0a05822d7b9371da47f248b6cc5b705acfc60d28b852d3d3fee81a22e01b35f056530078472bb9cffc1711b2d54a82823ad7e28dd516398ffe49d079777f8a705ab977194f4ca71402863cc6d594c35cd2a3c50ce346989e45187b2c3aa2e326fe7f0f98fdbde2b04387f27b3401ddef7d74dc2e4aab9a09ba9d46c38f4ce6182becef7eb84813aba6625b575a59754324904f7a720de5d7441f57c7e0443e50c7494053e7b3e20e125e9ee4af643661b0404779c4342110cde8d6c0945391d6bbde299df4c7f6e071c4e4aa9ceac55007ccecb1a6e7f7bd3c3eec34134188b0f0f3d3e6464cf829aadc543087b2cd18137c65ac81f00ee5796ac1adc5d6cae84dd066b5450a8ff1a5ee17fed985f4c2ba98dbf2be1510906bb37cb212d90086b9bd099359c964414a42549cfb2be255e6677509c31fa2c6fc6345cc6214d1901e01e407ea501f2081203493536c40d97e325c7bfad56e9013c146811d4de61063e520996068679732cfdf694b10b6576a41b7d0c9011cf59814a45cab4de60d70b1e5d123d9e4ad45987ca94adeebd592dcaf8e9a6954fe74a58ae274dc7a902dad5a389b6b3f6aa2c333d8b79f885ede4b6c3fd4d6bdb28dbc1e9de1c14aa08220a85531e520d631982e80fc1b34f736d5156adf11ff19cca0881458c6fd455754f6b04b112efadb5e9228801a98aa82c4d29823dfc33b199bf1cf42b13b87948f6dd253b512dd865f8a59ab645c7eaa5ecd50080bb1215df38157084bae6f211a3542af9a74871be13b9ae5c0277c96ec2b1af65b70d27ef15f33105cfc04e63d7588c988fa01832dd07396f8a1aa2eb5177e5599a95666ddb4ebc4accd4fcb3f562d07474f52a48b6f6c26d273125b03b7058d8b03b6fbffa7088b02ca56b96affb8d39e19826842410efe1745bc031c333606fa27f9279e6111cc289a23960498b19456019ab69c6de0848fbeae0f49b49a28adbc27d104098ef1e4e6be4c564ba1b137aea175df1b6b210187f268d262b75c6e6b49e177c80761ff562dc1a83e0f9409c99f8f5475353d364890f4ff64180803dc653e40c6058441917adf429983a494f99deb43a0c841f7a88e9d18e3429635b686d2a72a0fc27140ad8c6b858549a0e7a171f4c7ac930a4ff64a6406bf6ccca1b184f31dae83590accb26c2a9eebf43ab609ae10679d37e6d0e32cf615f49047f03c6ec6692fbf98e1388daf55f2599be19bbba383c64815224fb8dacf94494d4ae25e4ec82e6c91f306163c33c797b22c0f61a988750383f67850db72b6be5ec85f0cdc53e8289e0b044ffbbfd076269e4de94afc1432d953453c2188c1b8207099c09993c6ba67301a80128176bea03f3e9bad690a9bbe429ec3d3991dff3b4c79c2ac0f2eec936a30f0a9012136c718c8befb56bf07dbc96b2f192b315b5864e7593e4f8984cbc12ee8e9c83aa74430d49c5b4c9b3dd8f394c61cc867941fbeccce77dc404bb63efcb0f95d27d9be904b7bf6d206075cc502d104f7267137640e697e3db909fde8829002485294de3e13a4f470682b0f499b97f941d7bb495e97727cfa5e8647c8a9d02c1221a04c44165f7cae29729a864862222ce03afcb24d31989c96893de457b79e42fec4afaa3af3b615b1a4a584f278a742aab6f96a1aeefbaac8dc8746758e816050c9af7669aacb2c6889d74c7f22b10b9df7e78ee5f0ccac5e45ccf6ec9dfcf47f78f5b28acae37bb7e8d9e5d9a8680e21c46f249680342bbf8db4faa22c3887f3972965859c258b048b5257e652f3d39fe7393614e65bae537ce95c81835da013eef3984268bae3b838ebab90687ae27d26eccb496a68bd82d9102470ea92c84947f952a876ca0c3cb84ce8bd3127c4254a30ec1c5484e0b46ed45856a8ff86fd68e69ba10d7c8cf7d31c1657f62000fd1bafa075ebd6a05101da021d06cd62951a607b1576f8ed5050043e45ff8d1e6f600eef3c788784c15bcd29ac4c24e47a250ffbeafa67b6b1f9ab666f9497a6e2e3f8e15943be156c4453d6ebc22b9514519d2209dff1708194ba99bdfd6621be6a137fb594a4d9bb831410c2af0bfccb66aff95a6dbda227ead8dc178121176abe07d036b3615a14e2badf195deba2082bf086c5eef4d40dc3ae39656af00e50a77ddcc5e71c20e027ea4bd812f40d316905d333a8bd8f9ae7e3b78ffefc90d7ec1dac4b7afdb1881b4e5de7174ec7b0e899e88ae44159361d205e7d866d2467578e47aeb22d9772868e1c2eb42058eb7052cbb4eaa7bd492e0d3718496b5368ae79b5d8d8d45a08305291963092464cc9d886970218403be3514946911da342ba85ffaf331980b1e041c205d5ce1b39bad4211d74bc6c7502959df0a4ab9e5e435b2c1d0d2593d46003b964e9f95e1c0deea22d87bac85d538039ffcb3ecc2211a24409ac201bdb76417e9cb53e985c88cd13ae853bdc5ca0bb27594efeb4f7eb03505a59319e2deba3179381c35061f41a7b8ab46631dbafed6fe87512de469a2657fa5c80a63286d08e3395b00e93187ce3a85d644e4049bf179288a2d275e7b261d0fd36ba521171eb63382e5b5abe9c52f0c75cbbf436d92941ced819ee975077c4847b63f5522d340ab365bd1eac21d04a3c7701603ee2acdc90da3a1775a79fbe3876278313ad73124e7cbe47abb4669e02dda7eb2983a94b16d0bd5a4860e3a6635091641a98af62519be63d83fd1ad462b535fcbe632776a8e32b1ed7224b644b3026002f97f1e204ecbc68fca3f6d4a42734fdc62b2e458e3a0acaeb96dee1383f70c01c52407aaf94c831de4f0286105d2b550a82c7a00fffe5c84c63a40374a5f60aa870a41299be92fef0a845d3ee7ca26c4f11f86f7557417fc232a5b3468940479a9a25920b90a338fb57c7a185af21aa607fcb9a066ca85715abeadaf513d7e0bb77cce24d328248c70390da1e1c3177047548090b66a1b80c757a5eca6d423bd3b0a0eba7cdb7941c55a96401eb593b029b76a4cb6db50a71395d290dbc09c2aaeca9936189cb86c2f519297645225e23985d5490a76ab50a9e9c21062bb5dc07d4f0c3c28d4585808ae80fc55213482f1505ffa03f4b21a04d3e30fcdfcdf0b30f7c641302adf820bc1e003539b461eeb9778e445bddb7faed4b3d3903d9687746565c9d0f8c496835c4e30f238d12272dbaeac424aadde227cc2f03bd61ab19218495a5dd68df219ae29f9c3727c1a418d6f968c139fc1ea3c8f0a335ee21614710f57694cc2213967e1e219e09d82b23d4a5785a127d770847676195073219610166575b3d7a05cfa247e97fbbbd85f6bbd53b19bec6b5ff517c84023546071660cf8f5a454fc0ed55023b03c6da7a389371fa24c441a02fef1756a6ffc5f50f341767ba6b090d99a0375e51b195d1916460fda3ac55ff4128201da9ed17a9f4852827a33710b27b89ce9b93045854ab378c8cbfff699cdc057f223387a4eb6c5ce9173c32cd773a1bb03aee488ac92b13dcef9f43e73da98c1dad6a56d5851fc0427eaee3a6267e5bc3838c0492f9bc01386d6d0336ab4fc7e00579e1103db6b91ba620d30485f153f0bd95c0daac040888504ec4beae77beb17486b0beddd94f5cd5bb88505e390a20323104c9a9ab30b4de6c10e70dc9787940ba4c482b2f8bee54a78cf077fe8839288659c7ba5a81a560ef6e1992ecfd1eb23c3c14f06174b76b0b674e98e9d624e8bf463ca5b904411dff67bc0389558a1235088cf31612a0610f9fd08ba1fbcaba025490336fc0715fc28238294789a3a8cc3917fef76e9180ddbee017cfff12e577092c2c25bd1e6c6347f5cccf9f53bb -MD = 9570f18459f97be85bfc8fca837e0891ef248ba6295119679280a136d60e57f2 - -Len = 43280 -Msg = 2d819b81df848a0b7e302b768f4748374581cb60f42ed16ac91cff31b9bb1940b77fd04f2a86dc0a9e7b4b14b9ba194c71b4004f7d95913e092584c1aeec4d4ba19af0a02ba6159559345f17f43cfa6fb3e973c4b03fcde21901d13a28d2a529559aa07dca2b5d3517250e882716132972e6ccca7573abdf5f788da40eb34a6139478aecef5fdb704014016e3a918d011774b266b47853bb4551600748d8637bb76856f88288b8d13ccae0d114f39080085bcda25597ee013256f46cbd89190036c7aca66bef1bdd730f52ba9f84432cae63c6854018a4368e4deeda570e94771e2a320092dc2d1e4eaaff2fc28ecf90715445175e439ce4c0fff95afdaefb68d65a930ddf96161b3365903b65575c31baf5f161955fff923234bbf397b2765bc81f75d53b67fd5c8b06ade370281199ef0f736aceb6f4c94bb4dcad0e622fd95b4081618c950a6abf56fd31cc49164f7a6a723bf28ea4107346059048064b69f7875eb8bc6967cc351d292c5f0294dbc1ce97dae73037ef12b4dea52ee6f59404bab4e2b12b390a5723d8dc129bb3c62e038a5197e4d4ee90c40ef3a84a53e1eaa22de85523abad8c2fb34ace5b9a9627d0f2a8e8f2a396563f3e829f798dd812076fd18e99e23c3b0b627d798c72d616ff78e5c4a1cd6ecaec155bf9bccc01e2b122a546d4093fce7d8c7dfc74620b6256c312123a7aff55953c85a05b38e5c367ef6d641d463eac4ed953405b93bf739e7c36ba05d1cf60005a087a9ef80b1ef37e30d0bcc1c23d46f3062c8b2c79b19e4a5aa34afb6851f618ed71cc35fb591b76f672f9a452e92c7f9ea74b56c28420d685b7512052913f1e3b6c2f163edea87fc7321b147718ca28249be2392154eac7bfdd61661389a313fa520dc45b136143acf86c3bb832e6939fef99fc1e89c6c610fdc4f835a0ea9f330daf66da621067acac32419d9f496b178bb8c8418b7a7b8100c0fc403ddb6bed845d2544327b96d036b64eaec7bb56955787c413c2ce8d19cc9e9bbaca401f309f5f2920ea6b761f7e4088741303fc1f3b4d191b978ca5e14aa6fc2daedf630446fc99f6f4a8afa16c181a76e9eb07c01f54eee1707a6adf621f48205180dd72617d9d4fb7faea5ee9852a3cb2391c7debe26ceeb662851dfd53a61c1bed3881d82a5fb19b29cf5fdbd0e14fd7b6e5608740bac9d20a9da301883fa874ed1a3a934b04a708fc05ab2c426636be2a0a70dbb602fa2a3a5b7758073a4cc4472ca37b28b7b6663d354ac221e279d15d33b5cf8b690a28bc67a3e818c09073c415c776099e681db2064587b57ca1771607384c0919803357682f9b02f9fde92c7dab6d35e144952421a361485d35171f2e0038763ae4b2d20621570f0c1a8e470e5949f5a9d2375a2d6c3a20acbd1b3e51157d1bf3bf0ff6ea830685226fcbdc6ed8f0911e9b691ed3a8f98692c2ea3c188001406d98b18bbc5c8fad628506b545304c5167269436bb6086c237cbece02a48ae2dd0f7005923b5dacff5e3a8983c6a447cadfb216b8c9cc91cc26089f430756a2943646427c895cf3302121a4efa8cbf5c17a37685ee62aadc5b09293ed1101f7dee6845be53045620b298c39f28a1a737cea5fd4c8bbc11492c4f3488b620b472fa8a0be76b0b57e02dff0a526eaee356f9891d8808b1e6ac5ab9129886ad114e8f531e68b8b0bab99ace593173bd5b01c1d83d001049114d10d02b36eac01e59d44ae709e4fd67f4218e1702e0d5f7804e19c77d498d7a74741ae82c8a5fc3ddf2f7cc9494fa46d8ecc6ab8e5cff9f1ac7d422c75b840969ae21af410d95e82011e236cf72ae40af20fe7f9d90423b185492b6a6ef37a773e76de93c1c67756b57948e8426213bbfe8bffaf724a6b3c21fd9ebe2adac3adc4784ffe65edf5206ef943a79585b20526a8f8463bf33ef604d3429423cedabeaf5f057077c046739ff6aa477af65d8aecef985aa09f2d73a0928d88f4502e3e61a395b671dde9c4cb09f3245d3464a1b3d826594acea5498793f60916ff1c918dde572cdea76da8629ba4ead6d065de3dfb48de94d234cc1c500291063c444c7677e03028ad3073193435f7525aefb4ddb16637197a6a9fe16f39bd4c8833e3cdf8c78cfa6fd0d9315c2cd66a2440ba0593050f42f7a519794a11fa447349ec06e9538fae6fdd2f4d8c0ff488dd37425838bbd39c0a72ed466911b4a88e14c993c23ab4bf1da409e03c55fe38d6020247fae1009f03626fcb54bf98c32912f0f70bd398c709c3ed8bf5754fe4bf5f6e47521b32c672e2359a8581f33ed4d316c33ec4a830a4cb3e9340046636e99deaf8e6d0c6ace970c31683ff707631c39f6ac3646f968f1891a89479dd89f55c0cbf119858bcd7ac9cd1c88e7cf390630f7042695b73293a7b3e7b4c22686308481c8ad84560bde4175edbc59551a13fcb562419f820f3af5fc75d01b15ca32131938b2739431cb5e710362b45fac4c8679ef11cd25a7ef5b3c5c22116c146353db6bafb90de6490708850260b697b8b68ad21d8566a3b9c1bdc3330df50bcc2d0f892cbe89d36124839b25c522845f753234ed300faba10fc5d3897576587489fcb9b1ead0a01a9e2a6f524b6a1b4aa9b73d0a37e666ae2d9db3aeb2b8a26350eb24c7a5a9f47d5b4526115a5803803b6214fb00b47de8038d8d2a2d8392a26824f2f557de7790441cebea5ab2e509147be248f54097577adc86834d9ed038bbef4ac46835d25d41f7e466b34168ee1a4ace7a7d545d0478d4c84379d3032d309454bb4077adec3b1d390ccdcd353637160118ffb677f6e6bb7bf11be8d38aae5a3a62476caf4318d71364101ef3e95229a3aae52f8c35addac6169aa6ea561f8b2141e6db816cc26d9af7e5fb4b1053c9dbb8968744cab379d2395ed5ed996a6d33e1838dcb6f1f27f54cb22de5b2213fd1cb7a8649bce2e0c7e2cf3d875b774998c9884b3452194c4dece07d68d7a6d3ae6af9f440132156cc9a55a55ea52e6678815bdb641f9726c95dd8b07d87c9cc9a1e7b98d4d8572409e758d71a7e770efa92660504de80fb92290191cbcb7274bc6e683bab126e93a754409964ef3a8746830f93bc95be14cfd7c2e7fbaa89113de228a56dc94de9ce6675b4e4ff5f1a85dcc04b334e38b9a9f08579b42df7ec4402239ec305dc6ea5a75ff041b6ce0fdf26e0f71210d63248fbb1109f5ba24dfa57c2ee55cf036c559e6614231c6fae7be7d75d00e480c6d380ae74633c737b87686b5cca2eaa2905d3f3ea343a2a3e82aa0c46a6d01ebe7208e36da9d852c012bd87b2ca2bb9eedecf6c381917e8091bf4e979abdf98624f1abac319382862c3df7fb6ffcd180308193bc77dbb8f556f4fd5c0b916d6fa8f3e9a3d5a63dbaac355b9310e1cb0b0aa39c65f062f096ba64238e1757fc1ce5dfceba5156155e03aa79feaa220673dedb877c75c7a3c93e7567ba589213f26dfdd16c1f13b7c4c505e98ab61e226f1f81db5c928a412155a1104d49d0439493d68815a97f83a362b010b3af369d616f4f0e72b12b6723828fe3c3658319880a0269537aea076e5f618626001bd5df208ba77b6c1b7434579a28b9263af4213309dba22df3c18a2d72c04e533e7a5cd5d01cc32deaf6f8474875ab26586214a145759e1d2d207b5f6c4599130ee94f11a504e6710a7dd3d42340f5c07bf1c6c75dcd83d2e6d2d667c68c92ca1da14a5682c651d00a575b80a311459f1611ac37ab2a1fe9c1271fd91a0bc7d2db40c306f1f791b56b41f3cf507cf71ca7405954c631aecc3cbbbc15cf59a4d7d8363db56b0f22ab9d9c3132b3daa6b3b01c42b1277adce4c9ff3fb06eecb64384f03ee46683812d11e4983d35b0b11eb0e3fcdf574c16ede9702f3b614b78a0720d3b166cdb39b478a99d516e95c2983a65ec31de4bd9222b9cef195edc78792ffbb6bdf69cc8cc3259c511b70047caace0954b14e0b03bf0f403dcb03612280f3a366d8c4e9afecf8383e0b786bd2099028c9d93b12895ea1401e7fdeef247a0573e87a6474ca6b0a56e60d87f9f347f3a36abf323aeba775b7deda04d756273c133aecd3d3a6e764df8f4a2716a60dff627f88bbebf341958bc303ff837d30a06ca45799700b090cb982e9df2ab403bd4d505f5e8d67d509a616225759643c39646de33cb1c1790cce0713379de6d0344d256aa488100ad7ee1e6192c3d2f410e4dfb746008fde6c0465f0b8d7021d6d4845d11445b689094d25e63a278eff2cd540fc3fc43ee13245e6a7e941d0916e27f9bd372a21faa7aa71d9d6ef6107951dd9d9ad6496296878d06153411ad541d3895693a01803b7ec4b63ef8213b154a6f2771a4a5f5f15856c457c40a690ee333dc3b210654f43fdfbac0c486ca77056d3fe0ddd612a4253027ceea73d6b7b2e5c2d1ce0ce8452c4c9dbb5a93491f117c3950f856433f6ccda2d31dca70ef2ae30bb577a1c4bed29fd18730d3216e0d00c64a7aa2f2139d73b81cb49ac205a9aff96ed44174b1b14de8dccdc2fdf4469f4945db48b9d135c6fa04654144abcd912e566a8862de46db55f4a7ef39425c9c44db90c404f8d44bcb12a67a6331f55b1d1480c3298501ccab9755c46dc8bdac3b6441816deae756bdcfde92b838bf524821ddae435680a65c1d4dcf05f7f833bf88541d5f37fd8c34b49426ce409a1b21f6c7962ac331dce9fef67b8c608ac723a04ef443506550e2395d92efc9f41a4d0be5174a4b93e4c7c4e6667b92f3db1a54a8b2c4d4dd5928f6a183c7358be42bf9acae4c5035629807a3fc5dffb1f4061de7b55e25c3e99b54f665df239fed411884c79b8184babd2fa5c9ae1743867954829879d397a69bdcc2b58214ceaa2f1103ffa2501071b9b5623ae66a2716e6a11fb8a26ee6f4ad069d0f6a7986af485bb0b30b3c470c10217fec9178eb39c07c05b252483078616afbbff2d256711f51018e30b6b70e430c454b29c3fe43b94ddb0223ffe2864b625553b5afcc7426a98cfdad5fdeecd4ce58c329cbded913bf162472069bc2bd8540671d72474cf0cd996dfb883d1c57f021011c011b7e72283d95d6fcbaa24a6c2376b4ba55400025dd6b85c040312f1a44717af422984711b7c2bd32dda9745f94eef5f88511c75acf82e6a886bfcc952990b11582ab25141b57bf59634cbe081b5c6bbd4526d8c4c62098a18f1cd30956eb7905ca4b7ea7eec137d0ea00a9de0d2b806913e3970c77e1163ba7dcb4df42ee1d2557edc635987bc129e069aa4a00f8ce8c7ffc948a5b30e9e78f74049f741527f4ba069e45bef3e5c4c4ec41e48d30c0b7f7c653d6c68c7e25a47724b2610d24046f2a6970a8c61052260d0336185fe14c19d5577a60705d86756aa7c0a0129bd4f5bdaa2f1c6edb22824060a728f2bae934ae01ddaf79028a70a2f032a7d1e9d6dc64f2d9506a90d6583aecc03585b7fff6b4f5791a03079224c4b090eed7a88a9184b6180b25ebee1630fa09d48552f0ce8ea4f526aad73e10544b63fb705280a3a17653934d46da4ae72afc7c7e367c2a9f92aa5bdcebfeb1b6331444587229814fb6248f2d3c1b74a1f21093dcbcf2a97c41312015c054878f0a3a5fdc8215b8e3e803656236221215e1deb12d60e4b989330229e20ec01023333eb498fcb5c912ae689c68bf9ea1977cbf6aecccd2e95ada95cfcdf1d1da3730a9d90a6c8a20305bdccacd52e1b1cb154b17a75b3d9775ba749836440a442fa4f4339d3c135ce182c846fc7a8ba1156e0a4dc99695624e5526f9c76fc9fc60e2b66aedf5e1ed8ab5c3b772a10d2dfac96583dff96ad8693d158addcf91519f8c68d569246640b0675782cc50d6870fc9f540670e3e484ac4d8c205fe00e2200474099b3220f4d709ec4f6624886ab8d23209db4f705057aed915bc75992c96dd707df0c99288833ffa63dc7683378a949456c937c17f343daf1c8dc0baaf6899d6b906354b5a395c1a669bd1678bf96394ad9d5172335503b34cd659f5d919ac2f31481fac186df0c4ce20cfa5c689d1cb74e417230b3e939e0d42cbcb482e96d28d42e345119580721107cbbe75c061a1532a035465556fc7f44f70bb5b1bec7903631aa6f444adbac5cd5022181195aebedba086d03deab98858f346a0761f8b5a3540322effbaf752cde7613c01e05c1e75791aea5ca6eb4ffbcdedb6a19271f845de87302b4ac05e960c0c4025c4220873f7b1023626f5a1a45b10fc32f7c543f15006865bdfae3fc24873c2d1c3a8e37396c9c65eed3123ef4570efbeb20de3e44f40c005ec097cbef74842aa614955f0f0c5953b6c565d38f75e0f8953b45e7b26b64bbdf27aac08c2fa3e242f9bd6587054fd6026bd941dfb68ea475f40fa4260e7a7f8756a342c15fa13c38118db26afc86d419edf8f0acbf1ee6d374c6dc6a855532a0750ab858ac871fcf838dae7f9c073644744a48be3b9ba5f6e3f1f64477fdbe70ae688c17c05c75507845c1908ad9e5cb2856b2dcd00acb2768195c7d8c7b0940274425c740282503173e54637104c8f630a494d026753fae2bc575dd6dd6fd570826eb30d7f3173089ffcdc2f791c60cb4bc5760e6e3e9d3557da92bc21681ff7a9646192bc6331ff5109673c487c957de276455b85db1de0eca603132447c7ea51d9e4be4a8611884fa153e81eeb81dd46c227643ea7f167d3202b56666d81db0425b8faba289625e44b4edd6ce7aa7be13f88d30923bc4cb3ff78006877c24c38ee5ab28bb9346aa76da466a30f93dc5a45060265dcd301f79a85ab9ac50db0888a56702fb670c9119ee13e61b1c2711a891b9ce541da2a2677b0a27df3c89a4b8018de16aedfc3ab45a1af198cbacc9a7225ed07e14627c91d95af9272878c2a662e36f110e5dcdcf852434aeee1515276d17d3e498b7d47f2b10d78dfcee88db313351f7b07974f2d7f857656eaa1eb2d9ae7f8c92ebd2bad7f56817a0341eded4433224bc9655a6b86001c531b30ccfcee97e80eb44a0c947d155cffc92ad37b5dbb8a11bfd98729022dad720780707b49275c8890b6334e16c45bdf94f5d6f3ac58b75b3f666dfc7078ba2234136e0f46f0f6a568746840f8de1e87db5550dcdc854a86ec8e774c5d7bc2e2355c1e4f449f27039026e4038fed158710abe99d5abbb4333bd42b9f35a148406fdd19b1de7c6e119c206f0c385bc15be97bf9bba37674de91ba036b7573cabb6818e8cd71334c6e010341c1aeb4b284aa4819ce33401ce7a2b28747a98dcab19291f3f8b93e3267534204da4f72598ff792c24ba6a30cfcd3503faa5e39b8d193cac3c9f307d09c076f40ac973f26dc45de7b9a6a09d56ca8158509e0121589d045f0c7db2a778a91ed5dcf1255caf809adae50fa0f06e595650ffcfba17148cc75e368be10b791873ed4a84d709671d762e2f5d30d01c62fe138e9ed525cad0ced14233855117f5be64dcea4fa19d823a0b1ff919e56acdbfc885751cf2815061e1b8dc6521572847621a8c56cd57972d983e4922d85f82e2976dbb552741f4c8b521ed4a214399560e8dd0b3359f4499fe13b61551036aaea9ccd8496b12a44a7705d0fcfce2313390bc1f30807c71c46427a9b9f75f6b6d262d34c067fd48304ceaec43 -MD = 8ff4c479d1230d8dc53493395e89ca712533b80e1b97cb5af448e0e78fab0f7a - -Len = 44072 -Msg = 7bd0a59d7eec22eb806483b0b95de6e15c142344252201d531fea96913c35a9124335fc11afc3eb2dd3b3304963fdc28088f367d232ec8b9d61d1e8b2622797f7dc8c52144a7cb65b3e5a846e8fd7eae37bf6996c299b56e49144ebf43a1770f2d96bf05227431cdac6bccbeda20333a92ada5d629e92ebb31eb1f4d92c9bd0adda536b4dcebd9b26ed485b4912f6296c160d08781a99d6a37a87b7c3c21b13734fe10779b9429dca128bd6f38b275886be0d3eff15e6941025549956932bc60dba8379687f88a12ee705b38f531d3d938369756a292fa093bf971e04082474b79ab9159c79e651efdb34757f035e451d2690306bbccb889899ddaa5ea9bb8c1b7100807840e20c675f96914534510b7de81fe4665950b8b95486e2c8f05788a3dde83eae5d125d3fe4aa9b643eabfd50787725dc8745bd5060214bc5546f06eb21de948136eda0c42afef87eaab5971f28246940bf1103185d3b49f67e88735bed6246a356da93be62f23cd701046544a7a623357949265bac4371beb73a4a60a101b987457f92695d32dd1fda1ee46b578ae82d3e649394cdc83790a6db18b3ed3b61af8b33196f5a2f5dbb7e7ba0edb8212c8a86e9e77e4248101eb6015aa0227dd37e809bb53aea46333c969107666a3764ffdb4f7e529a219fab7d338cbfc1578386ce2fe2569e1602059af5944fbe0c25dfb41bd4dc46034ae954f82b8d7a46f65aec462d4ce62d2eb9042fe414443de3bc99c59755c66b863ae5b5b3839ddaa06d33a4f27842ea3dd95a96535e9d3b231914d31259aba8f62297f2b12cbc6126306c92de8344db93c916cf8e89298268678ddaf2726669ff32f435a0f346a8dc46dfb64dd85c8fe50ab141e21e69b2384a8d33a42a772d25de83050f71cce047030575ccf20a658630c283eaa8de38f7149b7393dc5e40eea7bcd75922dfc60b078657e85acefb1bbdb30c24930785496821216e129c63de011a232a70dfb87cc6dae30c9d2abf0a141b511c77763583b7c6b38f67b1f4688d138ed0064d3630c36b9db613ae3fd5d663e93eb09ab85a85f4a074462f8112ae4160f63db8ddbb7fc0ee8168b9fc0377153b07f8f58c1245237eb928758860e71c50199192fd617e636bdb06de521778a7cd049b073f6f87dbb4ca992478d7ba1cb2a6ac7c43e721db8c4f78abf0864db425b1315030b6d095d92522ace0ebb9cb2f19d8d51fa11c81c64b387345d47892cb9a36510e8c91ea62553f7f3f1148901c0fc12e0f23c10eb04ab0f4c0868bfc352c149a37554e31d6e74a3c01ecf9041fe4dff780e3b1dac0ea8c810f10fa38d8f3769c29a58814ad37fd33d7d33dbf91259fb22365516e7e9725a8700845d14d6cc6c783f1b20b5bd3a3171f78a8fb166e8afe552d32325fdd16eba1e0e16e09047fbca4ce6e6e7956f6564721ad7f261c2c3c94afd6eecb28dacaf31f7f6772671bdc2a901fe67c1e4171ed72dd9426baeded6061b1cc7706dbb7022852463fe125b673eb48ebdab62eea80f09bd2cec75a8156e75583b9f3a4405da01c92c82f27cc1f347bf72b9b0920901f6ac354cdfcb8d6b5348d2a7bcee7440b30c5819d8c9d9b101b80d5598ac49943ecee7f4b4ec46e3fc1413f0bb62c73be216712a8de9b65e2ca216e6e0e471b2284ac94abcb649c0b9e586e2ff4706b5d70eff1fda8560e40ea415d451e18742fb4863b7bfce9de8d2e3b4e64f463795db1d885f8545e029efe79386b34c962b00f23ea484df4a458f352462750764c3346b965256d03d1719921866cecca3577f6ee177d48f59bd37045ec0373194262a1fb06017cf7f95d3ce2adb690ab8adbfe4d49a7786d13a1477eb665e6cd0a807625ff18ee9af8a64c3534d4eaddc150a7da073356dbaa36cb752beb2621f30115b296d84c7d4e015981a24435e1877a660cc6cd6ec1de088eb1b2efab889a79233993cc211f67e2e7607c911c573bbdcb7e0eb21aa01d8b03ccf20001916f3d01134c60d6e1d4cf784a3a28089f5caf4a7655adf506e752cd2f5fb8a2bcffd141e847430865232b7eb75185753a68a365ae220d8856c9e43d415276196bbada58110acf1029c18b8d2069460ca8fe4eaf8dfa5d4f2043b3e6ab80c4d03e2eccd6360d71a8a04e64062dc7c6197b7c057a8e4519b3f3d3565be6512151a4da0d2ecfd5e71c5918498c2813923612607c6937a8cf413207200f5a4a1838203b2fd436ea7bf5c4bda081c7d346ed1e59f7fe128bea916b3db573afd215de40c0b96913b1ccbf63ad1d79556d4098ffb72cab9774f80f10058b2b3f9fa6ce77191e5fded245f3c674f4f579680be427067ef43eea7424c0fd258881f947834392e31b00b2641d6d93db68ac4a253924d6535a9152eb7cee62f92e2f75749726cc9c4d21d8c3a6b9884555569a191299956e610744da6208f59a8e90aaca64a134ae48aabbd12a3ad0a74e10ce540ac5c2148a2946ad8ea1236e2c4dff958643598da003e2191281fb95b5635d628c69eaea487fcef16d375b0879cffa72867da9dee5d5d207f9ff67851db6ddc101d68e541e734422683c2aee198f01fdbfc0a4067c99122a3b33b2e9f983a5fc259c1ae69e9c5cdd0a3011736e13cc83ccace698f6b618fc60af5c58eb627c70423b2f162b536f6dedb38d5cf9e6a09127a2d00ac6c55cfb04c2c24645db97c9f23429675740f2716d271cff4f8034c24b330ee07f3f54a2922e83369b47ae65b007985ea4ed9c74231b3eded178ef83b1ede19e829ca69f93432dae7e4f16dff625fa6096a1a3e289f0717012293751f623f6a96365b92e72911012414a67a55f3fde119f15df391c5733579419b2a98285bc95b41302ebda98e90696d227323585a1f640a2750444a022f9d9e2d816e183b1f7d72d2a6415eb06ffe17ecc2323c7e4630de02bc0bd8b9edb55ed1e168d9e65245f2c8603ced7f872b398ccd4a457240c695759fac14a25809ac0fb25014644cfbe99ac6750103be38fc8bfe321b3df36e560962f0a8c456e1ae705dec70bef3e77fd13fb64045fd6c8770bcb467e7497049446b9f3c27d0848c7b480596fb3151daf432c5524c2d1103c36e96d179291397b1238177d4af3b6fb9dc622d23ed80258b096be020346d970d7ea100fa7aa068d5f25d02d2d94e7fb081cdde3f0fbd861f2b7092cafcc86cd4539d9d72265fe33a41fd84293805e3eaa00c51557e502537009c0f516b6ca9a355524fea149831677627a6e2b3a7c4ef9fe82d7024812b5bf0b700bd6ba077ffec88bf682c9379e4fba41004317e4945e8291b95e898c01363880c17e3abfe72800695f75697e43a363c69979cd09b76e197c2ceb2dc0be8c1d8dc66bad665837995789c7aee9af091b65aa4dbe6e10af4f9cb226a963561726f17b2da69d5bb3ffd106180dec28e72dc8a31d60844878819dd9af90e6507de1566032aac75a03a06064d50b0859c4374a249757eec7704bda13c458cc4606e92716292e66ebcd3770268d3ac0aa36b4749f1a08f0061d2aebe1237587af688addfd6fa61e797701aabbbef197a2b521d28333f84a8ce59b4dd24b7b9ae51962f59684a6309b77bb5aa4d8d41fcba60bee6163aa50e450196a678aef989f7fee1861f6a35fba65a11a627966ab9dafdf12ca2793a574e321ec018025e32722a880f03431fe6ec77f6484ff0ddd812917fa2e0e48bae715412d40c9d31d14a80ef9b1cbb68f20f382c38cf85e282ea8431efd764e03937cf3b895a65b990056addd373bb5a4699077a1daf3bc0dfeb3ecdbc90df8020270c61880c4440952d4e195e0f2c3b0b124ba9a0f5fcc1169c281bb0113eb48cca714c792a210c0849966ce6f8f45468006b8168abaf2b5086a8e574646ac4a5a667c302bae36612e2a99e1037fded86edd1ca1ed83c47b42f27f1af914af892455790cec67496db7fef7786d32d4e8d60e44c69858a5d6b210e080a9ec5977c2fa7798355bbe48aa8d0bff0d46ebea4e20ccff2b983b59ce4c3f22d95c5eb8aeac147ca70a09847e6b43df543a787f3fab11a607c0e9670feb077bf7d313ae5000bc24a1e0bf93cbf03ba3e27c0efa3303bf65cd6134a0ff93b5f695ff0cdb4f9efb1ac67e4508ebd25fe7388a03fdc0c132b8ed07b17a05dce71d242ecec205bd3dd975313e5686883d13b6e31bec5179f819d712c464bb0d076a22e0cdf51b0210fb4eb8100f04783fb3ee25ab687d848c032c20f1e3a7ca937832c38ed6e7f400dab3614e94ee28e4325eb036d49d776aff4c90ce99248c0791b42585f9f51989f233cb5e7abc10d729892142c349d92178c900ced7e9d7f07127b557d0ead918fc4064d442f6d66503ede763b70b102c0a11ff57424024da811dc158fe01b93a4379bc246016d03a5c0d70fe2249b3072dc7cb1c4acff9223c06f81dd402306a52404fe364a494a39c585c86979e482f5e5b126253f1cb741c63b81af544e525b3247e75c318aa5d4f6f18a179613621063c63ee105e222cacc48fe4c4423df8e0a6e67ffdfb77b3dfb223b36a3b0378dfec1df3f25d83c86799fdefd392b1605548065687b58333d7b20c40cca4469325facf386c7876d3c76470b0a5bec5d8ab786c8e02ef5379c1ff40ee2315660c82e8e61ff15751eb66a486bbbd1f01de3db877aad2017ee228ea500ff006e8316127011f2342cb5bafeabe857c4bfbfd9698b62177845c096703b81ad60143ce6b459eba64f349c11da7769285bdfa934099b68685f0815c26fbf7b3279d1f3febc51d7658c133983a5b4d574bfda45bc62bd74e6fce7556c3138d5d7722c0e27d161bd751353f6d7076a16841738fa391dfb6edb786ae85d5eae77e473aef6299b8f851f0d7b3ad7aaa213a08c7f2f72e15d3e8dfa19375d9f2949a1a6dd13ccc4e517aba2146c493364b41046394e3057eacd45ab7da8349cb232553144cdd8f16b5b61f9a5f6f64db6e11b6cedbe3b27aa014ab21da4a9fc501d4a3c688d14cc283a893bb63fa69ea2820a2624e75bf8a5c3e638819485670cefc6f0d3b949fd249a6a8fd0af20ce2f7f259e65315872e4fc5f6532de9087ed9112740cbb3f2c67654d1e7aae2e8665c0b4f93804f93e6e92fe60b7ec9201fbeb76f19bf9be00fa817a103ca4966e4d2eff6225c807044b6f0b52982453803ee5398f09dd8e21e4d8398c9ef9212deeaf4effb5e54b6b8479ce625ef09aaabf68a575dccd76382d50d2ba2915976c512ce8f86fc38a1c209a8eb990b73127855a00cc9f3340edded38cc36461c0d27c8e1676dcca8fbf27b9957eb6e0dea098a593bbd776b2e7fd48b1cfd743640879bb20a1826321fba2bd29da59d56abd012fa66b0efe95cf959687050b244ab5509d4ea0ebf40778989093f500fd9d25c7e28104cb33b04caba7578e876d3b82071be79c9fe70adf11191bf633c03e81f2a46bad977dcd0749626892d384ff16a81c35bc24a2f2d8154008067a8617788b5fae8ef944b2a776af043878d35e1b3a8a7e29048f870aadeda44c5eb7eeb398fa90d079f028d53b7671a8fdc02036c64c0b0ac714901ee00835f166bb8cd9245d5a9b9fe9f7399f9ff80beab50c11534a2488f39bd7bbb779041c1bfbb99334705316f497e77aaa13e189c819eb54e96c11cb128b228a382859f603dd3c89d21bc56aff63c04164b874491e5485a7909a19faab4c3a336dfe7ca7a8cadf620546f6be48b34935d677f97474cea2b051bc853d4746e75d5ee1b456922b68c7d6d92f3b58f04bff0739b73153ee0a1a33ba9dbe6de1f0b012ba4a2b4766a05f4bbcb809b6838f46ffe4f7a9411e848b3f7ca9a2a5851fd69172864f51e54fd36fd7d94fead2dab3c7610103c8c6daab7ceaf114789a3a74e3efb0ea380e3dca4712da367d47f7ee66991d68704cd224f2edbd3a6c880a35111b1023824b31eddd5602e5f649ac9ee4739300c019359ba96b543c0bb757be21ddee23b903f5e438899b84dd3fc36b4ad6aaf24095cabbaa4dff43dd8fe9ba1e1c9112649d4f566095eb3dbb9302ff9facab6778285b29fc7c0677697987cf0dc242170c8308eb5e603b3617ac32ffebdcde86f13bae90a7dfb1ff37dbfba5f8b6495a381ce84c39d4d29779f21b16364e8b7832348d96b45d4703cf1e0be5e6e0ee0470d0b621f9d8fa8969cd84ea89eafa64c37dbee32ae012adbaab8037e028793d3d073c11a753f93470a53623eb9873732d7c0920114f58237fe92142ed76312c252940c5492f18bf15e2fa6a65403dcdf79b38f57191628da63fb8af15b25ffab29e8be5ea539f52e1ec9667fecaa199a941110953907814b7170b2560c44bce6ccfe5188fa7d6175b2cd2c1be1ee700ccd55e05be33e2e03bd8e44dd7943dd1da221506421304330b087820ad245729e7c1e590bb62e718bae909cf810b7d2b8400e5580a7f73d179e94e2ed4c5383c826c6f535105d0e4bab44252670f5203f2d21bb6f0d369172e381e903ae7d463253ec3f68805e56dc5a0597e8f890681adfe80c7faf72f2db15baef1e77371c4599fab2068486edb621514fd0362dfcf3ceedc3432d30d3c8abcc6f7e4525887a5f7ed79fab7b3561a7b3d74cb8026122708f7a4a0504a6c42c1304a386ad1d592ae52aa453afc05733b9a8eedcd2275f7b698c04b5430e460d4b393eba523d6a72ca25b51ba9010f7bbf4f173301d1d335f89303bc805cd6c5c167a06ea98b16cdaa533271db8a02e64124564905d35636a909b7895124eeec122a69020768f691e22dbce4dbcdd9f9ebe33c9d72be30f4176aa0ba19f906f6a9fc0913106972761e3fb4e30e4eed2d2be62a9eccf4fc04b0204fbd6f4bb77c1556f120490f22d0cae3ab0b077fb4f66db7c0cb791a3fdf0fe51501b58f68c2d0b5c19815cc703854c40fbb4bf2e9fc4dd26fb20b9044f98303b1257156938168b2fb190b13f323685b6372302ad49528c0a7c0f8e9c3dab62684a74713d02e49b8fdf19d982418520446de789a0d57ab0d09a6c59934f915a800059b59a72000424ad041ab7b8dce791a4e79c30cba310205a1f62110db3e12c3aee28a711d08d972239bd0620a2a046e40b8384b43475a0c610f13d0077be14021b148d66bd009046a10998ff3f140a353b85c61897a7fbe5284e3faf46bbdf5fc8bf73fa3024b622224895e01b0b86a05feb1b7d336ed7bf4dc140a2899e355add7282538fc0b2bda5c025489e4d622c5ffead6d7092dd5d68916862a630c0f94275e2fb439d2b2013bb6ec130a145e22303a46fb6dab4c66207de7607392546e010ba7ab583ca51527f9bd239d0d7c89445280c6d0f0402216bcb6612810f499d8b32564c39375a4c54d20421a3c1e9980b5fcafdf9771a8f0556bb31cf2409622d74196f891942e7843bdd50dfab4a189c7434cf60b315931ca8fccbec0c8e1840a54a883919120d5600e72e4f3cf5fd418dcf490c60fb14f9e8b147a170e0a50af072fe12ded1a51146aa24ba1df12d42d325d4c527d5fce53f630fb4f808f3d47b1839dc118797fe38ad98e7f64692e76dbdd952b0aa3226d5998aed4b0de8e56ec4a15f593dcb65fb78f39f6efd1378831fbe7ca2829e04d1db201612f76e87f2ff9e625ffa288eba939eaa2d1c973c3fd4ed0ba56528c95bb139f5f4ce6c002f4f98afcac698c09b87ffd0dcae087cc763ccc7635cb8bb9da43d549a9bc9994c3ff70c43a90344c6da80d923b84d804354c577816e3624bc3b94f9ab666f9a7154234272ac4f636417888ca9444e90dc -MD = c4558c7ec68df61d6bb65238397d49cc320a8c213f7bffdd4a397552d83ec20e - -Len = 44864 -Msg = cb7090f7a465782f680fd44cbc558107825c9e53f24e4140ec5b68208cfe33e8008250d996c4b65f193a96395e348eda1a62210ff69764e3e6ccf9c0b66841d6e6bfcec0b7d817658673701d594a3916b89855f5bed8dec06fcf16fb4ccca111252ff2f62f28040b56c14a42d41fe8820304234d6f9916a0306ba71a77b3ba6166daa5c2253ce317322d0ceef83904e7a4b0735e3463764ad0a895655ea4f48e51c9cd6bc19d1d52c1bd9e6aed22f60d42a42e7133bc6588f88ec6242a27b75f8d03533a2dd21b84ac7be8feda6225bc86e73ace942f4b205026239f02c46b9dc39020778e6344759a6fd3f1e77ff8bc178081bd804191db7f77941e0f0478109a791b6a0fd9ffec34a0458d3e03d9d49f7aea861f7c9d812e8902e8786e4780bbc52b5ad5bbb6b32216271804762fcec3da5c709867d8da04655346668b3eb5cd7c3a910b91d0900bd962db645e61702daac1c4148aaaadaa12718001e1c67679a72f55d7e4b54c97f2dc1e8445d98385f200cbba6e7cc4c79842de70fa488d674cf1ef613accaf6f687f298cb2fece72b801cab39ab4e50400b0a7dc5e2ac03e766aa7d21e7f803b433243a52e381b9d06ac0c2696bcd90951a2256c93d6d8a62a81c452153589a28bdcb5f740ef30aee3e9d83cebfa687d93ff9e4923b29d49721e9008a957904d4967c8a9708bd64c58a0751c20d85909cfb15b9a9628d6cc5529511d614b5ee485bac1e34674d51f6bb92cf0bdbc76540c9fa488729e4ddadc8b50b9c57abb0e45bdebcf4b13f5d0261c45dd4b10850752b1c13b417ec8190d2ad5025e4c6e7393588d9206cefe0791b1080d513b4fc9a9cff9da8a2f1031f2ef2723b32a41bc7673ee57ff0eb76bb361bca857a59c431ae1958ed619edcb93c290424d7afa91f7f65744bf3ce9a59412abd5e5b6341caccfdd7eaca4268ff68c5688b2a562991cc91081cdbe5c5d3cad1bbd84d6defd688119d3943885242533c21c6c14417defd56137b1fed83ab41b5588bb6d648e54e091b4163dd03328a11c26032e5fe57800928ef46225e40342a15d13e38c767bd28d4abb1bd06305bcacd0fd5a8377be33eaad1d540a04310c466413a01f5ee24054bc0a3a4d5dc66eb940e40277dec957b2bdb43b514247608ec7430ce4ed93132f338c030fc8739e8d9e3f8d01c0a15233e5427fc0454c25bfab2b90a5cc953166d7c7dcdd4d12346e139763eac64f0eb24e4e8720b64845223a549228a2f08441cf452e8094ad17a5c773ecf997da717a1f60bd383c43a7ff9c457c3618acf307448e62c1444b317ae15b8ff8dc4a65d2810088d28046339ef986b497d6d265025d28de6605f5693489d7b7ad3ca7d1019cb750b42958d14678a0a413836ac478439d0c3781b2a71de970c9e260fa9c50970c7ea7e0826941411ab272c77af7b21d7553fe5d8ad37b26ad2e5def4bb0079b8878734dcbe3d57d7c487b4c0ce6f814361a814485d6976b174ee792a0f46ecfb1a7e0173b274b544fcdf7b7277992506acb89dcac96b9de349147f10350cc5c1273b6e7da1eebed19a9afb3d498c7f898cddecd06fc29a78f6047b37bac6b693045bc64b1aefc71654368e61a2be035498848c09bf02eefad21ad8010f0911f9583bb37c7c0c807b805edf8011a252e04648f5d745b11de183e4202cb0587a6c8977c07243d95d89c560592914dde0c51c97a4b98231b9b571dcedeb3d1952551e7c47dd10bac0c989e775cd3ac53f6b81fd3330f32914ff22819bfd13d02c4b9dd5e41d51455ca35460cfdce20cc15c2ce60bce26ebe2171c5ea4b2b3118ad86df11fa383ed73af9b48c1e8a8f9090f63eea8f18c1e93a5d5e0a2acc961d054357a45003737c856e51bf6610e3e890ddd73853b91259c13e5a4205b9525af775ace0ed3d9a8ad31c856c7e67021c3dfd0214b1ce4857df9a215884fb4f17a8a6468d76ee9b4a4b8ab95d0d97d674bee12544515e4d2bbcfb1b144e9b739c435d8d73961e5e0416405358bca945373c0eaa91da71081d7fe8b0400ca1a830ee23e959f3d6ca005bc6bd2633a439afde0ef7c3f50f617551ea48a26513d51cd17fc208351dc98543a55d8f19909922cd6776a24941407a59884b0402fbe2a916f9804905fc43dcf6649d5a16764dd930a48df57f0e8d75c04a212c8a60b61ce2198be20b7a1e4e9b8be451d45d3c1c304aa6863e7f30aeadb832e2a64b3bc060684b9bee9f43215ba2993af84d5033f5e3281b2f9b126d495be6f0fec358dcb56d293e56739a9d5d3226de2d4e7065a6f77b7df96a19fabbbaa61d39d0f5b70cb08b91edff0b0ccac2f205196984fb6c0c077445f42e9c2c5dd830007afb9a8bbada5e584a7fb4c9db657664a5753d6eac33c8bb423a9dc4cde6f2faca50cd5a127f6b425cdcdf8304e7fbb70b2973d55e6940025b2343aa91362bd0c7dd98a240e080513e0cd31fc5e05abaa189e5c8ab11a5c347d3d7073132a2297a8a438bcd67672df7f5d8c6a6b85c14717ddb701991bfa50f30a002364021aee940153c407be77f8f8138a030d7c96d83ee9cf432525651ba24e8c427ca6e071ee557de2183c7ef0f9739d4eaa6696fddc2717d7ebc326e5096f5758c3752db21625298f9e9d0247e1e258b5d8b04c089e3a23384381aa5da6d113beeef95d2f8a04b934f14cac7e40042ec0fef61088f37773dcc2cd89e5e938241d35aff95ad868df6ab6c7d7f4a24d9208a3b49f0f5a837c4de013200e7ef90adc6e058cc48fb5fea9559b0f5b772314e56d5841fc51d2cef4320f1747a6985a84ce9671fcfe9089796432dd133d2949ff927da3f077d9ce782efdda121e9a759efddf5344c37d1243592babac62c483bfd9713f5c1b2d0d323d8bd30e35740e93624cab6c6cd02bafbae205879689649ea8ff6ebfda310dcae425ac8c99b967fa926ae4b4693e3806f002654536ec6f146764cc9c238a42aac957d12d99ef144d14b699bd371bb9f19ee96565c26205d9bb4dd361959d3e4a538ecb51d469b6035fcc24f754fd43e81e137059d79ecb270b171db08eee6331f95705a9d7cdbfa5e9f830f341574863042d00a1d4d711b4ed4d0609adf253ea413d0a96029f83ad29e728219abe49fad772a0ce58cf8bebc87c16cd414d82ebb1ad6496e333b491b5f58512bf96cb080ea0db4fb1cc9c342320ea7c076472aed1248e3cf84ec4fc14cfc2473e753e1320140aa69e72c53683b7dbb65ebba5bc063ef1e8c0253734acb28a1f75ee35c4a268d9537d36996b70bd74dcb5c78e8be7693a3ab97b7de4046a273c144624650c0ba1e6bcac7b3b60ae308fbb2cafa6fb1fc19372a62b82a243340d98319cacc3790ec0fb38fd2eea06b91fcd3f8b95a7df12935a29a2891cda3b14501500d47f2d7a82a750a1de5363593d6a94a4c07433b7bafe9a856fca9ba6d0fa84f3a495b57f9c5fa7dba25320bb4921b07dcfe69a2b6ace6d46bf320401d3f5e5d7758d9d788e72933d136feb39c37107990c859ee833581658ffe9afc68db0dc3ecfed421fc98ea738b9e00f5f4cd72e691ec79e78951a2a5e9a67fb7f7ed9ccac3c2b4fbfee025840fe7a29b645d289706f23355710831daa2723739717cf3b7212ce22e36c8c2af86984b6b93ed1ad41863eeffe262164de1eb2a4a7f91fad530c5c4824b57aa3c183a622f2a8830e5efc511ae85683946cf97c0b2c933996b1814c3bee696c373ec5451add0335211b2a3062a0221830c94006238f66ab8c001a248acae8bf69b2b6e7fae2ef868a18a82343b0096dae957ae76a6ae3e3f1d12f5b9124c402cfefc1154f9ecde5add9eec03a927cd2823402866c29bb816ca73977fb967bd4be288c33858b1ed100d1768db3b20d0530379f6985563df250f4d100369a8083c90f70f9391252e72791c7f24ba93a744d127a07626aebc5534c8e6ace9b62be850707acd6df1a86969d6b746ef2758e4d575ae66ff25558c800ba3e1033b2e366a1b8e4eb4bd64db246c9ba99f85ed1a5789a9d2a66fb4b33c3fce0c7ddc170d2521d27f2e3068b2f307b0b695556dcd9e8b1921e435e1b3b18bf0942043f057caaacec6a2f3bed41ecf80d3983ee1e7f3a484bb811fe272241890e1b418c1fba1dd0b8cdaae6e2bedeb92696fe8504f9efb740845d4c1dae00d365b010290e1f2e3103a9c087e9da7846ee1e3fcc2ede7ba7070f8fd86d22c936b6aceaa67f105e46536b1a9f81496c19da1bc2240a91506015b614137414fd2b576e5b84d13210793eae13ae37700cba613c201d06b720aad314949de1192f19fe70cd34b2f907421bcf36348ae2ec9119ebc427d1b44ebff5a78bd82293d19ae250ca3672d98549716b1cb2ea068e467a9748c4ca1d4d47c3eb6442c7198716c98add1abf582cf7e5fe11b9d37f6442e9eb08847e56aebae45cb86e3d1ea2260a8b6051f6f960c5dff4cfa9e5a1f10f1e439de75d04e581cd87e2caf317d5312bef1e6ca841b34bc5eba1137f12c7135e3d735de48c7444e5d98de9879972d0b40241db41a5b6e23e4f30872e5658e840351358b361ed7cd3ee243a79181d8d2981852e51a9ce31bf9be86571c129065ac718783839c3820e12104e361837bef2c952c666d27ba2b05e433ed7f7b9e6146fdd3ce158690cfb020c855d2e43eeb6663533ef9441cdc702eb83cf6e8e1ff39bec075d627066311a63803caee4a4dad497075a83a31b5a261bd4c6aa080c7ed7cf77fadc6c3636e7afcf732e7c79d68102b146153203e0348e926c1eca441cbff20f481aaee572e65bb39f318dd6401802b210bd512fffcaae5d1e51475f6390ee2dd3c1cb0c7b92f1dcff3c9b228df6119a790092e81f34e5855bc601a6da073e541c564313c77a0ccc31c4271746a7b9cabd7379d4b51fdebbb3017bc2e69f4d22804ca983ed07f6d1d55ca40cd0a965d37c8a786e57f7f460a288382c2fa5a519ae1960e532c96abe385aa47bd277903524ba012d8e39c104a8bea95b0bd6c09a0440fba05f3ab2b1f962bb0cb29ed3705486c69abe71cf28343951c8018f4a341157ec5db8d8798d86f93a08078baa157a751b2e6f2c693be37cc40bb75b8c6863c2b565d62f29817f82a41627ca8e850509816126b639c034fd729e83b821b75a15e9614dab4d3e3193abbfb9e7eb5f82c88bcb6bcbbb45873fdfe8fd2184a192d5fac875e94f344ba0936d34406af58216bcc5a4c9684c78b87e838a242fa77c675c13f545b9d42c3e0d970d8067f771887708683bcb3577fbd0e6c13cad39955eafdc226d17be61c07cc5cc047cc5dfa26cec3c9f5ea1037e799b28d777f86c304879a3abe3537aec6381f66913f13ad8e0e988608d1fb9c4db0937810a346f60c884efaea733d5f65453f30ac80a01b07598e22be0f1f94377c963c5eeae2d8492767cd1ddc01182b1a46885f360c2adbd72c05df4d8508ec24434129f96150058d6c1a1e188ac262e0bcd5730960c450affa98333233e1b5d122ef387bcb4586e1e54bb6d0e14350be277eb1a3a3d0b00a804181673305daabbcaf551628a1164c5bc7adac0c853ddd11eddea9dd36410f476993938d5ea3d998e74672814bfbf655f6cb53156e73640189c5c616de4ce7d6792f5f47d357843e01d438dd2b7d065b40d76e03e8397c80ba2da057b018b9b5d71e736b4b40d33763c7104529e6a5f50d9ba4dfdad64d15e8dddfa794efae6ded277600b0a4ef0a77e7a1c02d7cfaacc5dd9eb02b93fe487b9e2c0f7217ee852214110fe9ccff3fa3fc94561f892e07d066037ec5b8b8a1db382f9632d9a085ddaceb9fde002c5f51cd900fe753688f96fe7c528f8da2a971738f44bc7decf588b6adb877889ef1e8233ef46d23d1ca806cb1337159e5e7a317f421f84bfb5e8afbfe629cab7c7dd0c6460c9a409142f47a49295366a8e3daeb0836ce8bf5484b4387a635b2ee8b707e4f6054f4cf7f5beeed3c1dfa14267fb8708a278402393355ef8b2ae51ea4321301f68485b3071e914475b75e5137f846d725e97f48bbaafbdf1a638c314f7d4c06d8133c6664a32bf7db0ada869eaf5de310fec4f25518fbff5ac8ef5215baf2030ee761101e5484ad76fcb5dbe40ac53c524c9b2690e51ef6534256a77d4fcda39eea3cd8bb98630f4f7639799073458bf3bd4c0cf2792c6d0db708580fa5a58b920214e7c5d692c46d61ac882a51a778fc381ece053ced0b91114e8e53244266f1193365c478d775d9a3572f3b0cb1aa74a45b9151972979e6367071d2346cdac416df793ee5fbca992682974a0c2cca63eb49805df0a75e1410b628133eea8f12e1614bbd85c66ab7d075e8dfb8df7fd2f430c0b1b03063248567dc9ea8852fe3620104c8c0fffe3a8b7749827a9472c7a75a7cd5408c301d7fcdb4fcdc055f408106cce8fe702d2b3ed1e2bcb9114b4dec0eda5206836c07e52ed9b44032c92f26bacaa3a7dfa091d1ccdc14de1fb169ab9302ae6cdcbfea9fd3724e3ed315bb396327842315ff742bae5f134f864c25cc321d74d961d3cf9404a8533db2ebe9a24a0a10dadaf1dd36bf923f750ec58837335329b5d84dbdae09a34aa595f1c349b79cd135f51ed2d9499e23b87fc49ad5decb57670ad8bdd4298abbdd45d25016f1054e9a302f5efc92ab4481a0f0648c7aae8559bf1ad6eead852e4f8a3498f2426c0f7251cc8687e3e02c363af2ed4551233cf2bfbb10e5ddbe2c622bc0a4c3f0f99d26219c54638465624115713ee9a953039ad164739f015a3c7ef21d7b7344d67f1c6848cf76bd636e08f9165d5ecb6662b9bfbd08056184e70ba5f325e886283dbeee77ffa9d602d9f5ae89548eff83e1b74f6dd6ff4562b4710decab0cfe1a60737ad2ede51669296efb712b5f8dd209fd4a1de576f41c2b19f2ae14c5f4d16fa2d601a010c7c1e9ddaa77e8bbbc7c61f177743e50b7dbd4691ce168fdaf78f2b5c8ab20132f319ea981429589d5a972fca01be877d6c738ca522eb09b78357113197876d796e2d23a497b39b12080c2878bb9ebd19907dea55e3df387973075249112a94346fb0cf8c9c9dd1ae52adbf801f7504847c44e6006b539a954938550f71ec13e86a5d54bcbd588ae6ccf45b8ca7d1ec32a251165133e8ae9f6832aff1547c7b29d08b49b15464254fc958630aef25d298853ae1a4c82ef2fc72aeb99b132c286d44b315071c513f4dfa728c775fe1664aa75ade97b266f630db05086948abaa27397d4d2a5fa04775b2bb3e4e64a505bd8b4973966d5136d113de12e86f5b8eec2132689798c1cc3b94aadf1cb7e13f65a38f371d635e2351bf727fa4e1bc25208e8aedeb72464c1412ba055ea42671d772849fb93eee4a37309a950b6a6e3b68f3df4372569e2593af713780b3c55b878ac223e65a921a06099ef99843b20029d3b81fd8d04a074eed58fc2f817e4afa5ee04a2140ea2122bd0823e8184831e7b09dc99b59ca6f8a3ee9b9b78791dea46137a8f67c46ee31dd5e9a5752913f271d18d7165dafacfa269bf6b520b0652a346096d28748df97cd1ac3828d2d866c6b81def6766a6df336f839a4f74aacd04ad3ba41dc5083e90eb545e6126db63c4e8137a82e7b2129d287090375c0e44b070979c0f60e698a34c687eeacd23cfb189f7797d05244e2abb0db5d26d3ca0f0b8a5bec5ec2ff1fb1b70028970b894d6c252562169067d2051e272e74d3bc70cadee700912eb30e181f55107b7a3987bbcab7836bb5f86c811782d40a413a34c76f91ba17a233d9da67ed32b49ebc5e89f8a4784a238516a24564fa31bcd1bf73c4e2856cbdf0077b193f0bfcf98016492772bd2c798c64eb10541d9596f16572676fdf0ad2561b7cabc1089f0b33638bdfb8ce9d287cdbbe10b6aaa07047eb25df80437caff48a41b829b53 -MD = 7ebc665ab5e5a1babbbae9e86bd00a09bfe68c4ca91b9f0da092c853c7732c3f - -Len = 45656 -Msg = be105a6c585a766aa1f290b632219ff864ea6674b5e3f9846d447d46813e2f92b78ea82f0b515f46511a6f161d429aeae07f8e4853b8686c191877f5a06242dd4884ccaec76e16f3cc24e6ede212c78897a1518dde07aa19b3634d4efd090a48b81a4e535359a55b57397da44a3b2dbbd37636ac1f77c875824c88bb62dc90bc517ab78579b913643d81bda11d62d469da29c50bdbb1c967d0fcafa29582db1f59c98fabff3669f8c4232d4d2332c57bf6e08613dd5db5d6e39b4a6d5fa4f35b19325c2fae79aefe36485610235007da6cc3022cec2295ac0550e18388eae156d9dba8784e2aea5ed917be53e767a26c87fcc0bfcfa870d07b43fd4cd8fbacfae1ecfaeea7f12600f6b9ef7c351d9f1b8eb048324f984e2a909d253017805c2d788edbf9807469ccd45571f5d61a05cec80a23ef349a37a28b86e2970c20fad9e7e8d201a35ebbaabd14ca249207dc6d7e2fd85c46553420b325bbe980848de57724676ed6552482f71e8473308c2ddff94aefe34c724c8c52a3388e3b541d396d6722a8e201ad3ccb9a26497a50ff0e7e81f1eb109888ceae27e1ef0537b3bd14dc8c178f0c5dc081b0390d36fc5ae158fc65db5870eece0fda3f72a6d55559b3a82c24a41b3df6618a44292d374640cde4d31deda28975bfe4d980e5d70ef591f68a35ebd953c6b34dcf0427aacc132761c31897d55ea9056c37828be5e379f7ec2fb42aeba919be246306ecfdf342ac9abe341db17753289ae2de60a6decd2db2a2072afc47d5cb35879743d7c4b6a5b84bd949e0db5c719761fe2cc306d97b716b98b3b233e422a8c31ff5e0455559e2f36fe10792aa288b3c48b7e36386295113cd8db5772c0ba69f06cbc1800812413d5eaed1a527959efc26c9affeba7e7921107fae1b97ce57a4b48a227db816fdb10f78e31bb9fff628ff29cfde5ec3121dc85245250cb2e25992fdaa434baf3dd7e807e8fc4ab0be483aa0ea0b5b4143905cce219f72006f4606eb02daab22293852228650c1ee1ce541f6a88e973d350136bbeb90b30128f4791bd24abebaeb5bb6936520060238867bf3b36efc020ff8bde14a01b6fa33ea5456c19b6ebea8c87a202e7301343bb3505eb0b371d7fafd5908e7f96336b8b0fd6477d6a1758b08089289529acb4df428014a66dd031e9972f76980a2fce0cfde0d9d034128b9a2c6b01dc4b91195d26ba2278e2acfa2537077799e5b93d2ce5d19db2835205d1e1e4493d1464c3cd4810aef333f83afb4bc50bf5c7644b735e44fd84f65a29d057714928129c56983d3014b5d04676c43bc4ae2c1db57b78dda783d7fb9f9a1de38eac3dd4ac44565c74fe31561c20288d92c8bd67314f95da75cb1c1196c9231cb8cceec9190f804c6bb5e623ede980b7bc061a224c2a62db2c3dd1c6d42988797c25ab7e773a9e8390e644d830157550bcc0d2dd7abe586657568989dc4da6604560f4432b3819786109fdd187467edef19367f7515dfee2739fb3d913a81597a0e979d5c99a79b1789b41ae57fef5b916f85a1e449bcef61d93e1432ecb4e561b497ca4b6d437c52414e0cd36917285896a29a0e8fa311791bd82466219c94210ebad1e9777fc0a10013bcc87c09dbab553472d92ebcdbd8c87275162261ed22e5a5bc1cfe81f16b8dab31adfeeafcf475e3312f7030d5e6a8b3102b382a78cd000393ce4c719617b1bf736b38e5139abf59e0f79b27870b8244fc8ba91fbe88297a5ce6a778380f34f78be8721fa905f83b8719f8c87ab01fcc4120bd6a46bc26b2214c58be5ebadefa800ef4c3459ceb342c7ccf3c353b48f4e8d0be3098d2c055e9e8a76a908076715ac405f770c95fead90a68ab4016c364f885f29c3d30bf08bda2dba457c9c60322f1eee3b1f41b0595aa0a3c24a758c37926a3d3bc40eb75a4623e9639fd9459df7ff8b19083e82e6944ff176858d1ba749b17009d690c44a6101665c084a91a9955688695df8e0d5bc18d659490f5f0efcc96496912e91dcb94ac3c74c7cdef585b898d4970d5497607fd4e31b68b0ef5a16ad6a7a54ba61cd64841dc2cc7802579a2eb339e858abfff97f9c6345cbb8b02dad0df89fa8aa0be329c801c61740797facbdcd2657a4091a28fdb7130a0bbd72d5f9a26be6f5f35b176e8006174079dda53ca723ebf00a66837f8d5ce648c08acaa5ee45ffe62210ef79d3e90272c738aab87e8d80107242f1aa6c800b0077d9fdab62ba4deb06c92462640b6367e0252fc9b9afbe95ef5405f6cb28c2c321e4e16276356b751fc828c0b6c9b4805307a6e8cf26f1e0cffe32fd3fb3b7f17d400873bf43d334ebb29f0d52c0606cae64928e456fb49192c5fb2620bd552be85fe55794621f8ae8fce9b0be7c117d40d08532a3069128e62fe0fa14b224c2d1a91a769c1caae7962b8b4350492252b8b0016e7e77f20728b066f1821ea166e7cffa594ce00feb81b3064dbed42d5d84a769aa2e3061ccd8ec0f950f6f4578991907981d38a9072a27ed3860999d1e230b506e38cc5ada75374d6d03309b884438e48b83a310bafdfea28bdc05ec151270483334a867c09c26a2d203ef1e169793f3dc269bd1777babc8c097a5b4c2e16aa3918850f31fac3e927c9817479401bed7d26caf65dd31b3b26f19f561b80e4f04f1ca52973833e3aec526259290f10de336cc3a385caeab01ffd9718d64f7b1eeec7129ceaab1ba6a3434b6a98e0425a851dbe8e37650f639eb5cb6924a3c27c3da034303f7a42737525a36d6eba98ab9bc0227d1aab729ccca2a110ad85a151652f74ad1af89be9897ed22b55a6fa189edd5739d6a4fba3d04b82d71afc00e78dfc38da222e0f5208d9406cf3aa50e8b6fdc58a145893bfd338d7841311c784de90e980002384f419bb55f8f0d182640aa7d4377cd0203afdf206e03fcbde718072f0675cdfe319e5ae7996f52079d4c363ec0ab5138b5a750079b347322ef69a2ab357dc6b150793391410aaa11b8008b975c96829bd6864ea96c5d24e9d5a54419c182bce01064ce58e2cb65b51af0232d73d3c1b9dabf139c7dd892814e7d73e1271ef108e6038384fb3c25604aad9557a2edaf0126d457473c514c77ce34ba97c2cd13aa65b7ebcbf6c759b1abab4aac664e9b006f4872301431a33bb97d80b440f7853304147f9462178317d25bbba24a61263608ae0cfdb204375bb4ba4ead1e38d631358ba764d9872201333180cfabdfd12087578ff682339946247dad18b6fb77339e900bb3a9a0c71c62ef029b17251c5e5fd763b1016a1989ad2a045da7d9f89893b405077efee2b7c5c6e97b28bb682e16c030b3bbf268a4a351ed026d3ecb0eb98a3be6a5fbf561f07b7e064d0d653e30846f851e86e715ab97ef9d73a47ed4746518c7db227fb9675f68b2e0b563fd41b6889ba572155b1a3e548557a584a858e714217afd020c9ee51217a02e14e9aeb9047dfd5e83e393e7d46095bc6ce8eb82b689f205fd0a0bcf029af7e1d891ec1e7b826296b35d9d16e7a59a53a81480ca9877fcb7f100326fc2b3447b2f748e49566f81d514179a3e06dae1f5b6c9cd210261e78d6eada739db0732549a1019ec1d9be77426b01fdfaa57193d29672518bcee4f10c650decfa3fd3e08a8d2f359397de00e8ba5a27e4ac08c74608b3d23f0639fdca8984d93c60bc3f1cc5bbf2342ac280e8366a69c70add8360c8459d57568563b85f28828a9b960ca8518e1dcc1ad0bfede71a0bcb455691c8e012faf94630ec7deedf2e0d79ca0dd5378ffe82ed72849dd6535417e7ddb8255701314e5fa260c13f9226ed81be0b4c81a5dc7f2d0f98a00afb8ed478d9bf1f36f9897d2844872e582ab3513cdbcdb437ba01eb610ec49f8bfbff297eb26f5f84e44bae2a7c286a438d1b6130891db65fb5b3ed12d9ce42623cef3f83cf908d49a9c00bebb30d1d08a5a647e731c1fa037d3badc7d77e3096a5a83d0e9aea518e302db9f552fcf0ad589e28e93982272afce15408709e122f1d714ca87a44515a61dde3d0bfbe8a3c90492fbc0b28e5dd19ec0a5e0cf48f368e9194d7d76738b52417af02641b95bc34f181ea0d7bde23bca6f64f134a50b2df513c261a1caca761224515a8dab6362cdc49fba943b704cd554165ed66fcabf8f96d1aa92955390047ce91f2c597b16052ad7546471b883542122803103c29c1d14e3ded56dd72e9ce72fcaca2e035b89dd5e24b50b0b8dab5921fbb12b835222008164e6de95b04ff58e03d3a39cb1c04eac922261e9ba5f5e9d27e3317d60330c22d353424fa3a21a9c40d55487974ce14b332910e397e4c3ec9b53a02154c47a50b08753359717e8c3184bbb849a8447a27e359289b4e00b98dc6f020f8e5aed93730f6c180925c2aae0a332f43a0ae45ad9d4513c8fb5a84a51b1d1a8ab6ad8539168074758604abc30786556e44549ccdc81e78c86fa2c4991a8997d0a78bd19a21daf44233be36f8e37cd4d27d7da810ccacfea49020a4f22dfb40d4a192e6e1b8ceeaef83d2f3d606dd5177317291fd12b74e63481c4a37bb3cbd9d8a08ec964522fe825d870be4d8717766497c7e1d00070f0d7edddef02c15b5334c360a422f9fd705a826a6aac200eba6aee197f6ff63eaab1aac89a5e74bd09fcd64696cde0d1e7f4ef7ebb12a51583f46e906127895874403d172df56a9b7e8f7da319cba347af936420380792d643afbdef0f9d1638de02394c325e0f61216b0df895a2bdb947a484f16a0185cb79eb40680317496a587613ca100edf98832e2bc992f99cc130a6c654b976da6fa7359abdb44c7f67642a51336f7e57bc24274ba8aa26ccda0b18acecaefe2d3d5c1d1132cba344aa918d75faa92314468514e1f843c0ca7e3788ad0bc2fdeaaef9106869919215ce512e0692559371c21645833ae83e122836654b449e0c9f4f1eadf4e4aebf8f2d337a679ced560cb95857a40310154052984d1c298890a7982d544b268b720d51a8f12d7cd8d14186dbb9c8c353ecb1a7cd9e741d2b20b014b591df91b0601cd63220cca4b09bccd510fa660e1c1af27256d7f7b1ee43354f47e526c8a5f03a156f97d9b70d2beb0e88780045d1269f5cb4882b6a5a5ea39244ccc53de4a8e1b9a1b4b93636f848adb2e12c0d2b95f4c1773d63b8e80987a83cc71f63e4f0a01d89060f84d687422d10945dc683efbf3b1f5655202faa5ddba052a9cd3f7df1cb761a2125546f8427322ff9f462aa4b440d61542299d7a2b71ffe08ec5c97534e095fb2ba49077b0698029539505c1556c1ed0552af07d2b4fc379153b4e3511fa34528961ce59355a2bac3e7c55bc9fdfd67dd12e7b17a7fd58df775d0c857aae478e75b5890599ef2c6ea824a4fc5a3e0604ff5cc7b06523c6f8fc548dce38a4d49937c847e5a4cf8a59dbb479e94e34b44d27dd5bb12f6816aeee4859791483e65a17c193601ea24d541e555deb4267ea3f91d8bf80cb744fe79360f6ecd3f482b95dc8f2dece127e46b82fd76a007fafc484767c8701f0798d35c5ee91409eb29e5007eec77dc52319f2696fce4e250cc34adf192d9b849d871a9fc9cf222a7df139a30e84f36347b4142cad7ff5010725293a1ed95fd7c2bd8a150d0d403fec9a60c7da7bf895efff669f1ae6bdbaabd06aaf14f51792f017cf4f44b5638605820d99db15540325e22feb3d696df8fdad546882e8895c2f7d3076f52e53a6d28f884198bace54f045b9379e71cf6507a4318af01a7ede88d7f4b2a9e0d8485baa18e89ad3303059104aacc667a9a7d09e4740e6f3bdc0020d642ae733ba14a7bc07b667c64041662b2b723cb1c4666081e0b0eddb10a9a607c807378fc0b1beab9bd289fdc72c217ea4b088b9e84bc03742028c3a3d417bae6870215cb4c8a8611d6588de8c9c92f2fc8e33e5dcfdf7a6b55f4c780d3189e88b8e2e025c006dc4d496ead35937c06d7d35c49f6a250db883efb4fd4821d89e7a89e5e9800216be0a8e3943f4a5b3d86dcdc34e586b0b53f2d94c31b6b871b97e88cf79ea76ab360574fc96268f731c157db9596f76f8614c469c7d1e9f5b1fddb3721b610232130f71bc33b79d091fbd6e2d2a77efdcc9d75d2d474a7e9ebadf335835ac51b53f6ead00846f767ccbadc8a728387dbf73dc4786f800fc4370ce30093194093ba16a4f50f016c3d4072cb2afbb7ac9aa47a22b2ff909c1502bf0d10c75e1d3cd214d8034df732b19ba8354ce4b047ba42d7332b1b12d76d0d28f3fe86b5b5672a75d6735b94f5754cefbd78b409f3ab60d9583938733c3c84df1a22879c93b321be42ddae772ee8d2ada636f0313aee7cf51485de5e54f42845e215109f529156528f9accfa499cab6681f01fa28803f5befa6983209c3455f20e4ed82a5c9246e72f432daad00155aef34c98ea558c699b7c7cbd568c6dac67e14834ca2c3661c0945f47054ca75feb5ca4f2754dd8572f1d37e38ca0108a1bfd99ccfb4bee45837167afa62a0f38a03071c2efbb883cce4f139c2f71bd7d82c5abf72a262a40b428c4ddea02995e62116b7096391c891d94a85dbb6bd4f530dc074a03658b01b73d1f486d30e65fb571da822540e5da71806e9ebd08f79faaa3244be36481072120df758c6f66bafed4578e096da49f8e94cee5a0e385cb64ad9b5356bd9caf66767dfbe408aaeeb2ab5aeaaf09b946a94441a913661006d36dd516d9db4e891b908321f087236985896d2ea2bfa47e76018f8f610b16e08b765a0ce9481712a52187be3e7550b9cbd0f6c070f9e695697ed0df266d1ad70139929c117e76ea878be3f71a5db36e1a14905696430029e7feee3eefe68c58b92a274acf08ee6f5742208330aadbe4d4e6b2478f2571ba960400150a11fbf437ea809f8e51fe1f88e6d5d90dd73abca0b9e529c81bcba5e840eef81179ea27f1dd2710ebf4268990dc7c7f0e8d4053f1f0a163dd806eaa5327e36ea288c7627b9493354459e81c03b57cdbbf179d593d3d6f8c3c0deb066b1b85df29c9244229835d73441dc37555e46f75ac10a23b06f2b809601ec16894ae5ec003a57135a02bde51579a38f40bfbbcd33202ef57d3b30371e63d723f7452d6b7ecb84ebb64109e65fb79c9369a6dfd8afd68d55e27e0ea4c3ae48df96eab763d317c0d41e9c426279c16f4ab95ada9f36aad04ac782ec50eea9e6534f80ac5c67e6b4d77a5a90dfcd5fc3bc1625d3aa31659fdc148df3c1051d5a860b5133dca20007fbb2c41ae7c25b40f2694df28206cfa114b1e84a8172d24b80b0a3756dec2d6249af220901c07c8ff39b1b61ae1fb07ff987db1b189b90624a27bf9a96ad346dc757bc84b62f8958c792d745b6e2d0e1947cad8b0cea1f47eb59edc9e04ddecf7f93d9b48c784b427738c9c923b9f76deb79a8c4e7c546a16b2d752ad134f331794cc2c10d018af60a7439127c0becce096712ee3096ce18d38a9ee6f3ca3b3abc68c0d2c1330d1c882d6e4b494078aaf32c343070c480552a5ab125ce787d9350d1190f2f769e5bfa4db19a13c063aab3b256b32eb722007884f60ee8a483e33d6d15a1df33035b67bb4a2760f275754fdfc09ff2d77cc1c6f0b5cacbb813d38b26feb059d005c5d75f811bbb4075b4d29db91b458c583e1b863680ff1af60b43e21a6326b76c4152219d9ea9112d0e41d38a4fad3e7c227f2ec0590a34f4326d8bb3e3cd4e0076e1e9e8d7b4ce632ca6697c64b455b113fad09d7d766cd4f00f080f58d6ff890d8b9fa8ef63dde0b50846d582e239bfb995541313cb2c60ef334176e9ca31cead592b260e3ea76c527054ddd0be526ebe57a26b448fdb5ed4e01e32be2f4b98ff5175aa5ace94ceabe57ade77d00986c749a2ed374ce0974a1f878a0090b7afab7e667cfe9a0dd0676fa01e9fa0c4ce7f713de01589a5d3f7f764c5d772dcdb58e5e4e3202b78382e16aee66eb7ec0f8bd9598e05cf91d983709d2c6a5f22e4ae90d829e9073ecfaae38d7e0f9cea119689df3d30a50c7397921a07e2def19157862b9480b8c85d81dd232ea8d7249c4687b836bd93 -MD = cecddb12b508e6cddcf3e96635abec8bc6031d588b21a4a4859cbdd79aaee47a - -Len = 46448 -Msg = 5ab7074f7be12272f9f47fd8900dd823ef716b676974502eed9a0bc038fb5ea149ec615a15dbd47c7d7bb3e37d220b38a66f0db9ce2f603d0681bc72cc39b56a8283d4561fc9ec9125d6abe0d33b70f89bf15c40d641acd9b7e146dc7d6091e2edc38aca007115b6d94c9057f921ae6bb6428383e971db0ae800d083b4379c1273f6ab3e209bf5f581268ad0599c6e99e0a9a80b708896d8812883f1d7877b01fa625e3ae711345505adc0d45a73588bff6df45ed14f844c6a9f87ad5018d9b76b51cc47bd9a7bdf4d265bea64701348fcd78e06768b4e6d8bad033f85b25c3daf091dec0afd729941dc829bdf5948d8c02f9e8bc5079b44cc9c1f30e01dac9aacd378b23603c08dca165e6e33f79e4432bd4e73288a14d716b20506c72072d64cf60520a9740dc3ce1b17ebc912be9339c8c44806db61304f39da4ca48556fa76bceebecb1803413634d49a07724fcdbf9a2891c7c329576177c987de12ff0d126b581405b64811eba9bd0456defafbab79a3d7d20a145232b5f741dd901617074c6dabbd18843bd4c2fcb01f1f6723e5ae5da19178cc2bac3a8f0109c642213fa7550a5c0460c5d8c7b626c8fd3d5054807d776bd4f6eab650b750ca7e2c31a1c438b94b4383b9e1ff16efbb402587e2392be1c8e83d95373d97b5887e7c5215ea3d41f19d971ed6b341925eb0c6d276209168107a4636194a59b8ab8fd98983628c29b5d941fd9e2b62971b15c938f87cd493ac53bcd443bf22e19b79ebe0d3754ef901c12b5d23af9f875936d5c251961feb023b45789de41db9c0045b5eed68ab3a3c1bfd464c8720e97fdc937667b698f77bfa89290f006fc783f8d10bba86ca73cdb05ec101fa0e45f7cfaa5e2323673f7f5732ef815d43934a1cf4f02016d42c1e48f7d42a51912428d7c3826d27b54b771be5d2db41bfa67e396d14085ff0ed96ab708ab0d5d00c7abc86e82e08aaa4c90e4cdb05f50b878817e3805baa473f9da070e879cbf48855459a9a4c0f6dd1dff80f11e7c150bece7eff3aff3f01a99bf09ff86e7e241d213ca8a0b184275a20a1d67d6aecb6d4ba36694cde6645b4f863a7c1773589554667570043afffc8f3d1482574c06450b306c8bddf673be61dc12d4b7d374bb72c8e50c4ecd71ea1c24f0d13ee8383ba20b8c596e9890cca70d2dc9f66cd91cb3c7b3bf49346ab70f4e4ce4fc17e3a9b6b1207dee616e0e55a5e59c41c3f831adcf5bf962042cfbaf15833dfd3f9b27afbdd379dbd54dec1442c4fc285d54b2b75c384b47a14b2092073e3cd0e3c12df38e0fcdc568c2fe5940564a28bd70e8670ae33558b047be4ebfc8721598e83528ae5ffa29905fad9b4b1406b158cf7b4337e74823a5953d4b9bdc6e19b392d5c59b2e7f76e0968260af88c250a3d2b3c28fbee426f5d6160f37c4917be8337840d115de3bddea15300a2f0d85432d5a6b6ec4a9d1256ce10ff02b7caa9b5ca530ec7096f6ecdcce8fc76138ddab31b7b441b2f9b0c8dc16c4617b90344160d50c59f92a2691e126d683d9e4c840825423c4e4645434a63fd3082f7c977f029039860a18596199a6babbf381b3a781c83054e37a2a0d5db4a260d18242a8945f4f0d1dd1edd068d6a2dc48a04e44c28c707e3a9ba0b7552db8e7ec51c452b8aac36bcef77272c12f056143c0e6acd7094aad444966d73f039d19ea5bab01c20b2d0e77e985ad452878e76f541b4401d7556ebb13dac17dceb5835610554a42e8e281a3387604674b63db45da6abf056ef73ee98b7b2a93f798a0ba006170ddcc9a41fb64e1fcaa106cb941d443524448c69a6a00d6571406ccee70bc3e29d54eaaebdaef581a801fda0dfdd243b230fd3a0db7246afb7084b8e9349469e9ebb79adbbc3826d27bb25245c444ca636de4c8155b66a77c2be9e31d5039731563cfe09e29effca90f806c0d5fbc65ca5d98072db1382a5db8bee1f76e1bc850efc0229fae773822bdf26da10aa9a47b82af6dc373195204a97c1bf3e8abf800d260d77cb45e77c40990fdcd7f8ce4eb7f636282fb9abd25709a27bf4a7a70c9de0a55a1c6162a0174d492cf08d6c58e968c9bc8c53cca24a0a16ba62df7d100452543ab6e3ecd6f8245a3423127b4f97a5360215a601786ac1a7e54edb48738ba6a18062728d062a46cc5a3a2f041a09d80560945b513c0057dc628143101f7a011492e6b64e18f6da2708fb8b0ea18727bf40cf19c5d654f33d9ac3bedefb198d36d90a5936f4a408f1a530cfa1cc59baeb099089642faebe53f5dbf4b9efaf728ebd98004e837cfab4999fa2c583c6ba11239d53362d56e0a5dc938ea9e386d8a5a756559dabc5d5f74b11ad83ae174fbaf6be1e43b99380bcb5b134b6bfe4e601fd0e002b55c9c443254d98e23595a06deabd9294bcafc61ee9fe8de96b12c42c2886a9006aceed1f8e1d0aeb0085d6b2676158301cf0db55e1424249d0589bae9187f725d01d7813ee47aba5f7321811d571181fc39fe7e90445faded4fd930d9fd892a171fe8ea7ae94241803e38f139cb6796a97031160b9ce5eb1604bd3d3b943237c33b8576434cc1d4c0adf633f24f82418826682446aa716c95d888487498e52be0095fad1e9b73d4af56fbb1dd5fec1316b0e621c7e96c92fb1fdcdb2b682c670bfdb9f77351c2d19addbbf361892f7be3944d8715d641fe946f2d7db68e7289a58d370dc81c595c1196b9911537a6ec5d6500cca6fd9c20102afc98ac7851f42b2c5928a33781b4b20676e37f07fcf51297a27af1bbc577ecf7bcc483b235472b7f93009b5fe6abeac16692e5569c2671a0a51a8ccd7896994a0089b2c8b6e314eb670df6d1f2822a4c1af80ec00ee119147b13ee7f0fdc93964a40e028316885f467a96c5a2fe7fefb06bb41b0cfc56767b70f8d5d05ea6a510c92625d4f47dd3ef77b6235193de772bc3534c54933fb1ecb55ffe3f5209c2eb9e6dfd46af1b90fa8fc5f1f29046237adfe4e6a15cd22be2a9f9ca0481f9773f4c6af3a0f0677fafe94d964e9cc0dbe4e8ef51bbff19caa77451a2e9957eac52faa56dac5e6b8855aed57a2d605387b206fdf46a231c77823dececb433a0496ed1a7d430a22e943505e605578307102d6095397670e21bba2c54112e056837d9f9f791f563b8899817079f93aee45c9a1f3f87a690739c986b107a1fb3dd5cdb991d0ac34a1251c40cc0b0aa89f354446a8347c328d7e4641fa88e4fe507a1bed9a2a961ff43d2020b99a065bb3be0726aeadf95e316d96673a4b48542efeec8e20dd5992953f6993c1bd78aedc4e96b47fbb8e4663965e58d8d568b729c2c43dce6f531704ba3d3c8cdbee1c6975578283f3a785c486f2b95ebdb271e164175efb673f27e32c3f6d737bb34efbb0ee1353ccd196b49de7eb444ab22ee6617a74103b6a4f8103d4b90e237490f38faee987cda8e3b469c2711222e4389939520fd58260f89edf91a1c559be9cf1703e77687c7a07546906dd60ccc5498a5a22a493a2bfad7d2dfaba3184ddcd75f1013fae3fe17c152a29a288bed1bc2a5280b4d332d2f8ac6d7454cb4b7eace1808bb491ae5bbc671baf53126f962b09a0e0c33ca94744bd2c9313fb03fdb5d4bd5278eb4e6532dabc0c5196558ef098c3c752088c892c2fd9db8a5944f762bff5e9fef3768a99d089c5308d0728a7684998e3ef33151964f3b20a6e94e84e13c8b6b942dd383bf9137e725f0affd9f880f9eb59538786fd08bb16936a4cd260a44d2a61d8eaa3b4d77c8984c780f2ba385efadf643d1f78976b51703b819a372711d4d9003e6b84545408a6c3387c3dae4c74d9cbc22d381e272d7d9f430ff7bfa95b00d99fede7f8a9523d94a2e0e37126fbd110934aec0b931d23ebfdae32ec77ff81cb8bc57052c108a1a23ccb5c1f82f26dd94cf2e4fe13a2fbd81def791c1264c45c8e6c8df15f9e8b728295f807e4eb086c3bafb3544d517dba305e2afced1d5113145dc132b986439bf0cb57d8d16829600bfbe7ac84ab2228b174d8dd7c7bb075ca139ab58342727523e5ebf0bcdc595b2a41f2757e02719a2dcdf35c55125b0afc287ae821758094888034ee2bca0094032c543d8e19f48501b41ae7eb73b92936f6f259387206809b04c33f82b3c7c143159d632934138fe9e1a00ec4127377172981772cda7cafd7ee0753762c075956982e94f3f3670122b1334f6370e27af91ac8c073114ba8cbc681c85a8557d2ba2e982162ca578f68bd45083e01be8b795508d3afa8fbd1e308b31cc47231b3ea336ac6fa4b7d91086045f7d857304ef452e20f372425d1ba3f2bbf38551d73635106c42ed941acae34b66cb6e4103c16bee501adf5321ebde45c2e2ab08397c201fcc775063c38b6c536f55e3ab6b94cd3822978aea91f6a62b4f81006fca762c0cd3f7154d5dbae7c181032cd9c6cf35b2a052bb3036a4c64c68b8ceaf118d207f89a884796fc11d40a5bd90f49bdc6907d134ba4c975e0451186f5bef9629c61ff773e50f8107d676e26b5824732231ddbd23ce673d8a2ae2648ef158e2b3e49524407f391bf4d90b40f5cd90d50957dd6d0840a9ae92fea656fdd6127c91438819f89b1dc6f0f0a8c743346149f9a1aee8cc583974dc4946f5a45244ec2daba1dc8181e30963e1f5803dd8be575ad9f836555e4017d2d269496baf16bbeee48877c579b46db5759972cc00d08894c565608d9ae51dda63b85b3b33b1703bb5e4f1abcbb8794e743da5d6f3bf630f2e9b6d5b5451105ec2db32fa283d937ee75e531abe16b597a6882244fab27134db4265a6d3ab77c5b879d692d4e1ad1e429da4fc9bf7a9f6d323f0ff5dd1386996035158601cdb770d3a50e980c645838e4aec38aa82ded4c2b517ee644542172586385843ccc3dc89c8a7e97314e315930c34b633e0db9a3ce7a0f8573617a75172228ec4e2b75cf4c8e379f7f20f3c198c835e7e3828ae096192077dcb3d7fe26f17e22b873f5f15e50d8052885260e771e118d3b34e7af1caf5021f2d3e09a027203cbfe2e44db5c52ce8cdff33e9c66456cc7979d464bccad2d08584a2ac533f4484c91c2d8e9c104898b07f3b3f7e0deb62b9b142d6310b305bf7f7efcfc2628ca2915ca38a926f6a78432ff0cad713a7c2db8321371932178abdaeafdcb636fe7e5fcbcca95f899870ce38dcf2991f93d42718f7ef3cea8f451ed2693af763a5017b913354ca08dc6898c287208bd8b581e4984f6662d9a174638ba6514d9286112cd55df19d913e48eaf478ba76e717af5c2bae0353a75400d500ed89806bab97bcbfd4ea9ecfc5f80cf6372a22f3c147d5f79e30d6fdb1cfb95ac64a57951b7c71781fa59667796046f14cd657a5b9329827a655b583beca5ac0b9fc9bb9dea69428c68c4c046269e00d4028dda50956ede14fd8b6e085d9ff5b4f07147efdff6cf651058a4c89f9217199867b9ab99d1b4d1f22a2bc0ee5ef530fd38a8d7f6e430b497a16e7f5f95246e25afb2ccfee6c95a09b40c15fd473cf82c8c58d6cda5f8f3652b97eae52bbb3a00b2304553026de5aab5a958290d3f72e4f8c27cc2d09a99ef53bb9bdeaa4e15d01bcca524d9253d4bbb6e07fff57f49dcea903a84e89810bcb643f29ab55f7a0a48d26cf2cf81996311e4b5c0b47ee57afe2c807252740043cfcb9fa7c151ef25c60bed3b5a05b2877577d239bea0ce258001ef29a2b0e12b0cace39442e7eda91fb3d66d0d13f13f32c1fdc968977c833cbaf7095dc12bb8f9727edede63ee0ab27499065d5edde0f64d98de66c5791a60a2089fe84758a412b6b1e5e86878c12ac8a5a5cf28e1132c6524072dbd3c31b871c45bd695e042e4e43d47f5580672e52aacb9d714a34c31c33fc221e13e8f90849adbad3f6b3bec85718389d52f868e14eec119a48d02c2c23cade7c4087a8564fc8de0c651e5a604ef171a424c7262020c39eb4b16cd4bfcbb18e3f82299039d79f0f5bd2cd68e0d16812b41f5dd1d8c85b2d09ac91239cd3b91aad00551978893836076549520e878403136a41d2d1eeb9a7df62c6818de2ea6a0fe393abdd0c9d3c5948197eb2194d2c092ffb8fd339e7f27ffb935658a04d67ac526bae2e09d60799a0c556962ecb76e0931472a651ecf8319e800ac6b7e9f7ce76668a3427e9810f98d640816f07c7dec013e211dfd09f3c7316059fccc603bb770ba7b70fe0910255d3a63a8308094dde8047de8b9bd1eaa3dcb0ab8aed74bc7ce36d7f68c21ebc0244ef8a14d6227314e408d3fc567581565b71b196653019ad754553db981283c5b18339c77afc998bc68fb9db09734ab319b17b9b36211a334995fc106954a0c6a3ca0f46fb7d066bae4357cfbab38de3a0d9cf3f692e0736e7c643ae3dcc5b2ea22cd439618f04db248c7781731c920e784f762a053e27ddd841ee5e1d62fb2534114f47b519d903b1d2df983b98a05a277d3805123bc351a36dc5c70ffecad2e3e14919fe02ce0cdc7d58bd1b0f00f237c9dc78990c23bad0b192921e880e5e36048a5744342b1e2ef5aa981967fbfc309d2c2aa0998f3fe7771b664fe810f1b5e2daa88f9638602ea39dd04089d7a19860eec432ca4f08712629ecac0618b1e9e301b4e8103dfb64edf90e955ddc08f97aebed5487aa3ef62584cb3cca6dc95970c624568a8117583c85f922cb545ada53eb4e10b8ea09fcdef4ac071d595f8eeff2a0e2ec4dda93f90a3aeebc85bec453b68f6d4555900db8413716e5229c0eca4dcf931ee96f9c8a50780116b85d3ee21357741634fcb01b3213700c11a763679f5a71099dfcfb591f5c64c3365ed068cb4e2b13ce746e6f91e91d786ea91430b0e88493b1aa39cc3f8e1ea944ea024da61d9c256d21cd1d2460261381c9aa8b4822d5a56ca0dd4d77b537b22d295df96c6ccf32572b578bb42192c39130ace22eb06b2817076f439179b8c5374268d4e5e2ca23d5b9942208d36972e805a29c2b394e02fa0677165384a8c9ac5eab47d92897e12ff30b4aea1fb407cc7115210765871d5dc67e2d867b0fa8d2a4afb80fe63e53ad02446c20ad7a6a869c8cd98ade1d5f886e0bf2f209f549f23dfb9050c3c560970ec7ee7324c3835ead8f2c7b4918b2c227a7cc5ed4639453501838646736f2343e1d3aab2d973a9bcca682a45181fd5519d923938460713f068c16137b98f0cdbbcdb6906fff7787235a43cb9c5f28876b29605ac2f5c8fc87e19425a7f441aaad5fcce993022268d732d7b9d2ba1aa1461fe979362981d3fa9e19619251cf133b5be38040a9238713b7a6369c9abdead14427b88704840c874c0c90e5b781508d4a621b1ffb622cfd6f190aa208f8ac351f82e15d8eb9ef5872d77a472f3fa8ccb4b383d700c79fbde496fc8b0bb32d993963ba62d009c49298e1e761bff165201f3d8011c03b277c9e86d5ffacd6b72618300d3cd15ad26047929fdb727fcdb01568da7544a40d6224525da8f24a90034653a093999662e80552695c4dd229a51d9c58aa93ec9a96fd605c2be5f5005a4b323b1031a3bc525d890f8c5ad0c026c041c359b5f91341b41a9a338dc05150ad37a85aa06b28c7d49f5714a062dc5c84bfe329b3b5c38acee7de66f393c90ff6c8ae1aeed4ee6ff4fc0a9c2771c36ff47f80c39406f19ad52ef26c1e57b2bfad4f14f824c855714409f0cbf8e3be8695e762ce60d6e49851599cee16f252875b33a39b492ea6f54c2cd04a1aa215c9f16050f31f0ce5adc8cfa594e44ef29087dc23ac65ed2a2595ce73c0959410618f5314dada903c01c4f8d5058f52d902b9b25cd281ef2627a658a2d672a3f776f726742a994a31bbcc3cf3ea1fe551047a1d15b6a31be52307302334b8b6112fb243398c62220c046903c9ea9df1a0be50851800d659ae4241c0be816fb4a7b547102ba73f00140321b51dae105d0f59c6522b571f91c8abdb6f3d669f8701303ef7112437cc92e17fbab8dd8011e6fd61ec176388ab7c885da4668a511667c7205eb4aa526ecec5087a6220f5f46dd1abbba3cd189012fe50c903968d4921a273afdde299ce10d8465ee21f78f0ecfe2b28993dd726d2373b45da31590876eac251527313d4a041c0cc028110ecaaab6999bf5ace56035ba680b404bf3bb0c792acdc07c969c529fe2d88efc6d1f001ee77dfcd0409ef9119e258b6c6ca15606d2842 -MD = 03deb53fbacc9e3701311efbff2ee0566c27355b6f30a22848a5b8618f6c0d63 - -Len = 47240 -Msg = 86ffd5bd3bd1cae10706a61d247b2257b165f37cb53ff21761077a2295a9111ba6bc4b5b5f6ceca445b74df91fdd01b2b611b7cfda75628da54598370452383f72b3508d07b73e17b21e15b2c3884227ac2d6f8a08cfa7c7dcedbb7e1d3ae511734dacfb3d9a0763d5a1c5f015652ce01a20e154473508ee8d66ab9eea4760b930f2264c08fd91af36a9275d1f5c09028852d6d6a08fcc2a411830407362f060320b882871c822245e9f019fe8561fb87e2b15b81ac53ca27f6b120cbf74df2efffe98397ee303ead4e91c5e7839b828851368a1bebfa07fcfc718a9d663734a21351f2439367c2820f14043d8ef1a7a24729539936640e8b9940cc0c019f5dd2016e494aaaad406cb1d34f50f5e8dd7e4b06529a1a06306c63ab4f8857cac0e820bb12fd82555ad5cd7c21d25705b674c35a019f05652017d21d8fa2e76e206d17b4c9dcb9045455b86b063230bca51e4690eb08971560067b1426ec3eeddec94ce7e878bd4edf55191c76e101924be34b5769773d7b52b0a53b9fa4acbe7e9546b0f9521d795e6c562cfe7f481afd5c57fa276b672b7abf06d0449cdf7462598bcc76e948385403f609075d72bb4bf1e3058f45b28a6a8a169ec01535942c7e8286ebbecbf042a47f3d2c1c2ff7aa3c73161b968e3c849a4ad39cbe5d925f8cc17cb2331725bcc66835c73bce54baa49e9856ee88a67b780a3b34e8a5f35dfcdf1a74f6c86d34f2378f732cec56dfb2bbf8bbbe005c91ac0b121334ad3bca5721fcae6a5e2b2db073b6ba6ff8729c0f51d3d475a3c3699e9414d212d1d00714407fc91e26e4097993280785713c71e306a61bb5d17f85c85bafdc13c264a6cca1205f82d12c7ac61c6fd50de518f3f630dc0bef27e568c1b84fabb7ed4e1bd8ca8acc28db68d42e75facd59d2ac94b167022f92059975134070cb6fc100f8e1232ba980b42db7fb46653b09b84bc69d1fa4f13ef9004d257aafa5abcc31a04e516f821ad9ef98e4f41bb89e049b1c21d130eb5670be5380cd88e50c8d34b498cbe2b067db32f95405aac06755ff07e8123288791b282aadcf68e40282aea858f901eee8367c5bd1018eed261b0c1c486926630746e22514d6dc3d1e2ae3fdf77f69882c6a3022d46e24893ac226cbcb2c98e5918250e55e9a5f5ac00499180ca57606a4e50300e6a2283f25f9f3890902e68a986c08fdd3806ec7989e22a90131b3f4d23549587043f6796810e6f65a52abec9c528eb11c1f96fdf86605036d7a9fdd34e9979c19da1bc281a5657667b265660dd436a1a0ce44886fead4c9aa06b62a5d60526e3bcb04a4f336138b89988f917d7fb5620a1303d17f9b066e5f5c8356bc382e316ead4d9b4d2165c8687b96f96ba37f54a0946173a8051e53f5f2840cc1df7f782ae7530fe025d0af6ce2280848edf91c1cb8c9d96997813cf65f34971ed4bab4e90fb18d6c81e8930f52af48a5cda70ad6f6c99d44f0d36be8f9219023b6847a318ce59e42e41225d8438924f2b12da357d4dd19ba7f89733656b78260d3513a8cf56bbcf3baf1da503b6237c036e19817e970f94ab217e5770e72e856d9a56863cfb0640f74ec22ffb0b6fb8ecd674bafab1196762713252376e02c8627f5a64e82601de6b075824f49f3eacef3232087705b7bbd4cefd4b4269bd97f4cc656b593d75529ec329ab74da58ff136a9c927ffab3380a21256a1a3e27992c69c0c219aa2a4398687bed0524855a6167fa8199f8d4870b53f3d946570877113fb393b0d3e85a62df97122ee58c65df0f94fc4e67e150df4aafbd4e1a28d9ac348503a422773f0311c541788536c7974bb12c24b0a33a8ff0a141bbf14f650331803c7ffd9e9983e54da2696c4b2991049a39a539e2ee222c118a144344c6211fea66c8ce2610eb42765e8b029332d420984a596b6514a0e546c3e178d0a20be40ca808fcd84d4212899d66b0d58b6889f187c7aef65312058912abf8bba2cb6a2e2bc6ef7af8903cce8680dcdbdb5525ed19776b5b537f73229ff82acd6d679798178a0fd4b9dea88d4263f06bcba3ded628f1085dbdef1759935378cdacea559193ddc4b036333e0ef897524e035b9af2dbbeefc4396ad9751641498506598b62c74576d41a97e698d1a26c4c2a85438b5b6586586ef9a1c04f4c06bb24be2154dc4c8d090b128875f50ea42ce827c0e7d06e37e105a3578067fb1538ad20feadfa7a7117b1ad0ceb8b6364b8e74bf94e61626926a571e3fe86d6dfc44a880cb548568ac6b66f5a43bc2713b6ccf8d60a36c783f0f7692d82d266cc26a3fd32b6ef6841debf615ac5afe418ef42373f627828ef07a3961e54763245285f8758f61738fc267789f5b88d21dd2bef0f1c9d4f0a143350fd9cbb98c3b090262e66bee64f246783f111667d67c9317b885504e2f75a3ca6a89001619f7627a2fb4556873422698ea19715a83d44cb8faad2df5a7629e94f9ee36cf85000b579f5db06206f5cf43e9f700e352bb6bfd37e7c76de10e903f0e77b45855eb50253251116da893cd03bf582994db987d6ee0b3910974b0252348c42d3324ffcd5d991d0cddc0929c42eabb7fd187020d88959f2f6adb2dd9ec0941f6025ad3ff8b243fe754f778b9abfc7f684bdd7e78d4b71907147cae0af3f07f93286ffe531874384545a5cc91895532674657745bddd5af9c78d1d744d57edba927ece564900974bb2263e4d075956311637d6a32fe61c1740a832023fb04f49c835a1f908c4493ad9daa87e2eb2d9feb25c7e67ac0fc0d026c091f04ef3348e1cd20038357c6138109f1fc45749e37590fbf7fbfc004d0ebffcc3a742c8a571d67d737a9acfe52f9e9d2d8748c57c7ef73dc7c5e760cbb855854f90e3d6a9da3d608328fd66df06ccfb592fcad0ac01314a782f35d743b62e83bd12f8c648b19aa0b7a827e856a5e2e22b24a50f7ce68449929fad0fbcf0921d96944b3f8ade35689863e0fe53f428792ccfa12cf31539629b7f18ad3e4dcb7b6080a2ea784956deadc1ef50dddae5e9e39686cf1a7797bf1d363e5cd1b820c6a63dc66f19db452a7e2b1e85fc426359d9e21b9ff7f2e8859f2ce7c27e16d826ed337f75767a497593073346b811e8f2941c2945956f72dfaac9db874c503cc2bfca94a4950face775bef73a1a30bddb9eaa7868f9d77ff3c575e154444e94c3a36acfa68083b4a7abb9320a29872a3d7ff6d0b12d1055e97898c3d16cf82850227bf6203fbcaadebd5fac5deefe7640bd66f9c838043cea4b9a47a5ce363f92c365d2bdd8a4d6b334172cdc6f7eeb0be264ba5422997e1ec7e3367872f122b10e902b2255227f4f964b7c2fb6edcfc77657ddfef3b962ac73db57f45e0f1ad48b65c9fabd1deed96e6262fdcb356b9bffa7286db44b2fbcd7eb74bf9c7a6d23c34a73eb197f6c7a41c4a7eeb43c07b007bb64496d372e787c795381341863c73da8f39d702f3f5a99d813ab7beceb2e15fd593c2465a706e9efbde32cd346e881e80fbaca15afa0fd086ddc282b5e3cb2d4ceece3bde18ea6b37a8c8e925cad187090e730190675f6bc7f29c1e3a90264a88c01b12626393c2f5226623def3f89aa3dcea8238a000b5a0f3850fb15a9b6e25c24978bbc2e32c90d56aebb45c65cfce0173d1b856ac44be6b4dc5be8592de804fd9bd1ec9610eb72c67cf6a6691ad03f6af4e93ddaa9f7cc436eeb6a3953234c33c8e1fe995ffc4b1ed3d55c504a8d246dd775fb7943c6888d0d93e572affbfe6f23a33a5ea6645e05bc40aea4749b55cbeda7066e1921e43bc13b9f2bc9d9e058b6ffe80e6d8a74243d1fe38d20629a2a3e68a8e2b36ea6f592cbe18d2a23bc9788de4fd03dd85423615a4432d74abd33d39e27fd9a169762892bf3c0594358d3a126b8cd9cb5c8a92dda19bc20bb848db333cce655827f2bad431debde9f7cb50ac16b2d1589965eab85aa52841db9e0e60ddfc66c1926f807fba73742a1f2e4ca95b0172dbd87ece2443e1d8ad822d67516a8c4684253709d3cd8cb0caf8109e98ccfb36eb763f8da001e45ba54881567346e09d067d03b79ecfad0c433f0cc708d0f2a5fe0f22d9c9f93f19cf9b245c4517bbd2cef6302a3f5536df39408d4667fbaa488a0fb302f0be349b9306a0f955415060542d56d213d2ccb203a91cad34c1648726048ac9b2a5676985f761be125850fe1c8ed23fdaecc11d38d5355bfdb6c3fa4869f47e9e636a0c1f09f10b0ac13fe4be975cd3f2f7d6894f5151e331403b1a67cc9a92025c9eebd49ad960ad106fcc80d3312eda785f8ecdaa1cd36df25c501a88e7b48d1598913d46857f87ca830e29cf19b11002de862a4bd09d12418a33c74b5656ad12c994bf798f881953fc320fe750fb221bd617fbb327a0bcb2574df47080e8c0d8a45ee1c0424ae0414dc0a9b8717d9f27d8ac987c7c9ecbc946073884d1fb96dbdb583aa758186b16fa429dbf15b8d5bb48cca71469e7ce0ad8e7fa14d3ff6d90c129209b3b71184974304277a82d644ac8e0adf75a0c41db8278bf9d0174d39be84a3a0866f5766d6e024e5e935bc95abb9103a1e78cb5cfc521ff89e4fc5751c323fd9b651613d72a30f7f071b4836fa3464eb07ce9986c238c4067e8e66756e45ed1b0a0436f3b4b54f5b9cdd810fe1288e58f94937815200018b397c3922fce436cf4b31de6ee43e6ce370227009a7bd16ebbb91ac37f4d35fef97c245620d38a15b417f62984a65ec7d4a931b0a961a850b174f008ef0d9659a6008931eea69b628b497c9572e535993f3d78cfbf468631fd32b3c708d399bf55cf5293fdc9efd9e6c201b95d7303a8c3497cbc50ace3691b8cc67c4141c8966533211ab29ffff2530c360398e2318d0d37bde4e207588c88edb8972cda9b8560c67534c19b54326ca28a12b9b547ac7982acf807e85e02c1dffab610009af2e503bf508f6e8510700f6e65346ece8d94d4da6426b25c7252ce1d37bf563f654e75601c906bfb2329bd53599d713ea6eb88b697b317dc41b85280ca7f4e0163299617e769363ed0d636f98e595f009eea38d221516b65f76ee7d5bcd44a8962e2e0475f7e3fc8a021f69161fc9acccc1d4fbd8f763f8209e3088cad62ee2feb26de6ed343eb11278996eb72fbb6ebc4f137c94095f6a90fc13f060a8fab7d7251fb0ee14eeaa0cd7972484fdb35f5f002ab85d33543536f65e5e252cf04ea7ef0c0981823a100086e2338471f9a7403ddf583b5d88809af5db79224a57d0f978fc9aac63690b76ef4244c074d46de46cfc04366f4474456250ea5eeb79645227b70b79a0c4c2f7797eff3eec8ed9d5f747635751d039bea38658e1f59c333c660403f021935e0a8c600b08c36d159a44891ea5ec74f68d22456cb45209643e9dad2a18ce1e063890ae1126dfba46bbbd89dc282678d43b4554cedee80820e1327829f98face308ed31b89e2abc97c0c81146e9e823fa4f767d2567a1e08fab8e2ea89b4d861d020cb1a97a8abd2e32cfe704ef1bbf90511c86195863dbd82619974e07eef5dbae53f68bc2e903339939d4bd43a592c0ca9e3854b8183f24da3b7ac4445c3f45952bc7077c2ed7cf7b6ea019eb70e5b041665b7b8fa7559a4e5da0b25a7dac843efdedc5b241812962d613c2f162ff883edbb739e6f865630ae5d2be523b86c0312f316c6b0a496bd5d9f55d5c652a7149651333c4f3b7a6963dd693337d1320f72b59a4b07077ba5ddf0d953560ac93eb6c39143180928c7bcb74d7052a9dcd17572d17885e52418150240f833ace15ab58ef823587403d40f97633d02c6aef191d776bfbb92325c99402764eddd81f1292fe25d9f007e06d2ea24e9d6ac2ad86e4fd48116a3291bd136f709f3012dba7802ea724a3309d8ad1c2d173ccef2fe5138857d359c7abe63533a57d1bc36ff28b46ad1f88029d204c9c635b3a389ebe14e03f486e2a9bcb6315bff08635037b1b10e2d088c708b606f9ad5c9ce4229a4ecda97892a28af403df630059aec0cb9952eb4189c506d567a0567eda3ce2ff29173d6cab79a0ea7f573bb67c77cd696bd5737a7446bd04d75b07c9dd8807780d85a22ba2f504343d46ef19d8d853ddfb612081329058cbbef068468b10b88a62e181bd605fdf5aa773273153187ab0b0be9a60aaebfdb2842820fccd1b1ebf90f1812bccff58e523a88a07d6816969f1b38a1fc3a1d54291cbd8f48cf2609eff7e4b7ccd1c985c1babc0a24a594990280998c467f907024ea13734aedea8af184f86b84dffc647f645720b95e941adbc886b597d3abb7b2171e6c61c251b7b412edbe833f10b2f1c3e4848a1797a4915f8ace5ecad1b3373058cb1bf0fe389e3e1f21367388f9af55ee96354511ceb9b2102719e9a4cb4ad23d2fe7ee6286167317241d01c7913e96dfe6398b84e1cb6cb16047a497986359460b440f0118c33e6047a58e7f11f60322e5154f83863cebd90a66801c82f7520dddbef77c791b1c84fc7e6df2148c2762234705703484bc0175f500b6139d38ef27c72c172f8489efc2f634e2f1577018114d31ed753959c53381aaf6d2cb9a8469eb116384a5f32b2bbb57a430ee79bf4fa6794db0d1419ed38af35148e8e34824994c0440e604a1a72c5ac86bc7a0c23ec130338fd30fe8d68f5e57de9bafb4d850306bcccb2afdb5c7b2b1fa6991bb5f5bfb115ac5215daced507d1c4a5c5505be62fc90dbd299e81bf413755aa92531a53e79ba0e0247d7437e237a8b75a32d225849257e9800bea7a34f64f1737a465b8edf26344f41d6204bfd81c58819cf3a84d40359e7bc99e924d831e46d351ddd40b417de44d639f22e6dca8f00436c557d2fa2c44e381a5f1d40749a12d018a9089b0742af7f7337b9f6ad4e7a9a7501b5ae9c64380da087d11a9598e0f5d75d5ae69d27db98026f632aa29a539989cda2e348a031a7dce204b92d5773f0ca589c4911e445ca7807ae6c52e927bb0b27e970500ed7911ffc1cce945c386b722951153e1e9a9134af105e36c16399899eddb81b167643fa448dad732daac06f5e2ded5a2d3656c8c42d52b699a39f7591142d224daa5afc39cbe84232479a02557723fe96a5b5c4c559fc6af844476fbd01620e1af020867a7c017a009b52ebadb17ba3f1652899412aadcc63e22bd85149d92714c44f3955027b931f12757bd58136e2a3f119b6b614094342e9b7302c421515b1b3317577f3d915f4498c435b5af82344d613bda2aa71683be774077c8e8842782961db41c48c8b16ad01d2ada331ee5a80a11e755288b3a557dceee083a545eeb36acb5109185b0cb9709a5afe76cc4b8d4c49dca0b1be25a76c26e6b61e987bddc6d604160f1e2cfb530ac1b129159e687fd017198ed02372bc700dba46a2a604e07bf98fd34d1dff13b4a09feb82c98ea631d32172a22536183ab404a00d03c5523dafdaf75056114d2845ef107c637c69ff8f6cff9cb16e39e77809cd200b9b869b759bfdc05bfe69c640334a6ae2ce3589aa3098383e878c16c84e209423f418060927592595f2f42f1e00fbe6cde09370c230defd531e794933464cc1e36b611dd9219bf89abb76b33ddc97789b400e3555c23664659f9bef37869441d06e0c3343ff38a1d0946c033e3acf88c188f057d38931060c876e894393b98c617873f6f834b1c9ee3a3e9f8d8fe6afd7180458d9ea414aae726b97f5d20f1a1d1732d9645689d94a0978d8aa608f46526994a8c759f9bac1cd0dabbce6177379d6b33af6d933485a8ea54f23312bf4aa1a3bd82a7ccccefd03ef2507245510fe138fcc4e21409fb6364e8376964f337496545771b73d0fa6c36aa473316a8b206a22edc8e33457d39ccee612e45b7b186a98b74b9dcce555681aaa7f81aa3a6757172005838109492ec11796cff3342c0353780694fef89f8e79978a89b6b75956d6f37286a91c6d68af7860ad890715fd2f0a413135b1db92f1fc32ddf27a6cd5ece89e612f19e6d6f4890f019f6c6cb485ee79f7139990023e58f6e2f00c2870b36fe7a7857a1bf63ada006098cca6d5f2a51f5b1b186378993e453d21e502a3d509fcde4ec59342ecdbc34f27b04abdffceafe1bed6bc52ad1cac412a8d81ebcc473c59ed84d359752ef621aeafdee8f7bbba0f612d012ce454aa935c7e3ca5039824bed42052867e13e78ca023b9f3850cbc48c4b3d863c9a6bea84a2f898c157d5481b520a776625b35e4aeb4824a223225323be3b893e76367047629fefd6c773a26e32e3885cc355fce2ccace7959bc933049351839a82b121c62e6037583164432f0718c511662c3adacded4ed960c74e77f308 -MD = 0b6180f72608560023802ef42e0d80f862759a2a6b107667d7819e07bef00b08 - -Len = 48032 -Msg = b2c633e3181ae5fe7828707ed5b70e0460088a84465eadeecdbcfa0e9ff19bb165d29a0998c7545294892bb6ef297c6e0855d12be3d757b4345e92d0b9814f66cd01dae33b4e72dc504dfaf53459f1017a88a46af52fa2d3cda871fdd3527fe712da5b3aa6b925e3d2fe44024c4e5603db296d0a246e7895c122ff5d946d147d5be586d5841057b1422370a6e01094bd56c093d41a9dc0403854a4b7a5d9f46ed0abc17e7b59ef8cc945e8a998a8917710d67e8d7cc4621d59c7c9d4ad9e09029bb375fb339ed5bd8feb13d31b1d377934f29500f5e945744d02d47d55c53983e1850b1556e6f18cbb9d59eb12776d0ae89d42f42b16538d3c8d2f7845556e37cdaae994893a2b4075e422bb24bf1a73545eed30c65273af4df1408d24568f6884a9794076a16b23e746d609fafc28fda2bdfc7d6fa68d24a8b571869bd1845c310a22e1c523997b364ddd9e3b367eedf742d8a3ce188a327661292a51cc355bfa564b3e1ec89d918d81a0429075048e7e76e96a8ab35022df7ecf40ef528aaf07145e2027995fad126985bca1c2a2275ce0979a4b7cc83c0a93cd911c686b9f81ccc24f8b9dc717ed8df5d6152440ffbc094bfabb7ddac720288ae58118c0729007df93f0dcbe164775595695a4c65fc4776b5380bd6f0d48c56e03c56971715b4b1db4ff5f2af348aa1705c8491c8f9cb4616d42446d54abf3e1b5916466e40b23e4795f2df5f717b399ab571b2bd76d489310aa1bbee570394bc18d0f8713c7149cabb84e0567dd184510e922d97f5fb96b045f494808c02014f06074bd45b8a8ad12b4cb448ec16285fb27670fce99914f100ad6f504c32fa40ab39beec306667f76f9ab98b3ec18c036b8f1b60d4457a9fe53cbab23a0ee64d72d8a03d6d8d67a9f2ff6eb1d85c25d8746c8b4858794e094e12f54ab80e5ba1f774be5c456810755ffb52415b5e8c6b776f5f37b8bcf5c9b5d0ad7e58a9d0fa938e67ad5aaee8c5f11ef2be3a413628ef27f593a779085da6e641c19e79dcc3e1961ac53f9a573860cace8cf79ca99d3626ed0097460c31bbd460b8fbe6d57a6c2c662846e2f229298f443215d96d3506dcb3f2faac57e24f2b78c8e38961aa9da1d84b22e13034b5ed0242077fe78cbbc9d8df540491ebeb4c0875f7d9f7b0e0a6cf92364d97c7806477315f08af00df7eca4a35f740bb1ab68e44bb410e49ff9bdab1f360af7e338621848efc2a4dec5c06b812ecdadc580b78b980672bc224f1781f0cc2ddb529b28fb019d2ffa05ce22cad6d6dc6dc2dbb5648e9a4b6b60b68363dd4fca908ed7a1048821585b4cbb19a9ec7e29b16f636b587799265921d407392de76a7e5f95d51c24a4c5307934aef0094f3de295c1e04d992a88ee2d51aeeb29bb940d8c7dcd291f4effdf55e0e88776719f69fc9d1c2c3e76fb924bd67d6219f4d0a5df369014bf468dd2a868cf577b0bd7ac6c9d28deaca406ad450b7e8445b9a6ae1e6926c64db5f76f3a736b465f456e15ad6c0b4a2bdd32a7e197b83af4339f9012bd982610c2c620d2aac53d6c48eb0b86b0cd57054905e8e823336d6f8a42b383dbed1b5296814c3ab5e425e83cd6f5c11277ef800f09d82156f803ffe5177f396a2d8f5958b05a383bd0e41c49b83d243910f9e658c6df56d90ee6ea6ca75dfb1360696f31dcb495e492645095174a78cea05c7d4bc3664d537dfc784979b3927e8f91da498cc1185a318bcc4b7e84847830028e1188d3cf6d4e2ff3a116eac752c2eee2c748e98b42b543d791725312e0c6d260d19d90a4cf8865a19f046b6037ff6ad1d49894b4472773ba8f7d1fe8ad6db43db48b0394203388cc68cd9d25d750eced97052a5d0f8e03be6f2650cf882a906be2d9966708587fba27f8e7e0d7bc5d803916134c42f2da2856f54e8f19074e33820fb0e431fd32b3020eb357e24ba3d0e154b84a895be2436e7382f0070bd7ddbcb5b8d5402d8901219668539e06a726b8457f1e8cd20256df2752bafb3e11b1ba541800e0ed6cebad186d9cb3f451c9e673d192f25e22a8d19a27b49ca9e5f7a173372db747c3b8ce1d2cfaca1e8a039266176c63082a826b526aa893533bf69c9b7d266d4276b1ab2c0c358b8a381ae4a4b77589d7032cd5d9815c8745fcf7d05352b2abe66d1e6dcd75149d42445705b71b7509d393ee38b7d69821850e4268231e98193c91473b88cf61a94e97021d27a9348e04c310bc72cf26091d5b1f8a9349a15e4bc8733ee683e256b41863537acb79be737cd98894d6cde614cad65f2c3b95221cfbeb9e6ef7604d7eaec1d03ae80d4127a493c5a55254607342ae0e755d3c0fb513f882a994a235b44366bcee67b9c02824849a2bab842041adf0bff7155dcb20f6e0121dc272b75cbe983e1fb243e37fe5f430b04825ce86f2e59c38ccc2fe658eeb7854ea967b8006a07e5430735133ce2daebb93ff124bf9d2cac2eb31518ac163d9d672d7282705c6a5154913b34cc6763dd5f3d99297aa02741dd8736b99798e6029c4fd665aa251dbeb65e9b0d3b7160584d07cf972edbcc0cffd50f6999db632d746d0df20c58b475cecbff1cf88562d5393b1ede4aa47d662c18f979315217a686218388156ba12f2465b1d48217edec7a23e16f6c9ecdf5e8bfaf88ec9175e627f9c1c853e276335dc85dd466ad63f6a66eb1eaf32f30349c557c192a1e2064f04253135631a63ac1407d9d24ba579c34782aa18cda469add66f9aa885c99bb65b7b1f98aeda3adf57a8b8f3ac35b35aaec9653783463a11260a29d65d134520eb668fb607b10f560e2f23b275cc16b8018af4163a239dfe1df0192611092b141cae299857e50a9a9f65c1158eb3ca64a98b02bddb81bbfb23e810a089f3761a561a944584bf553274123b27df32f6e60f9535324fa9bc90a0bbb64bad194dba017379c5788715a6f3fe38ed5090c2c79a6f357f7ce3c745fc31b52f66c2d97d85817f211985757f86f06171ca17578eb1e3abac4c7704a39f12b2549a3742ea4b0c4f6051019b4494b15eba330dddc3beb73fbfa6ac9c31f12658c332c1af8ab9dc908a0742af7d850ad6d075bb7bef28b498c271cbb7775b354c8317a648e338b8eba82391dab2c0c071bc76695a9957a25fbc971c7cfe4306399c2f2e377f316a08c18c36436caf9ed885205fa249b3493bb6ffe7144d1262c51764a3a1e60ab88edd2c791432b96bb33359e47a87a470d5b79174a7ed311198fb9d4bb19e2d6b2604eaa1728d46eea9cf0b410adc92e1d4c7350a5c6406db5b50c2708c31004b773faef88704bef0635f1dbf7bcfe562e1eed3f35b3cfb88b61eba585d27ed1f2a9560c47b1f8a3989ee77a4f5e905bca4355375cdfc77df506e6f4b4a065ab1e60fe94e76661091c28101389fb05ab7c4a39dd9da2de2a9d247c8937b58b1c754b42fde9f62b9c0b622a3c5a2ae4d1aea419a67a956a3aee3b2ad7719a4592a1b8c1bbc1e9aed8d0ed84591266b44afbd16306663ff24b62cb6063e4c73baa2e49f952f1c9615c272accfe5526ea83ce62a48202fb1cc89555bbb313b4c3cf657f68680c1df972589a429094e3fe28a0c85cbdb36f203ee05a9b5980fb747f01b98d4f834fcdd7ffccb3b4543665861d8309fe09f4d31afe4a9dabbef3c4356d98d69dd9e754d977226eee1596b7488f232ae779347be929b6213e1046498f138de2b7726d3513794bf2824b7d79dc90193dee73a6a1360d2dc495376b6ae89e1920410f59d50250a9dd25886323aeaad5b197abb3d96e03020625a6cbbeee67bb1dbee325bb22a7bc8d5c3ed02b5b4a09346763f48b0dc5e35483c0ef9becfaf44975a0696de0e904917ad15d175ef7f434d24ed14c91a0423e14185fa870d2551229c99d43e99f02782602526e263f57116ccee284a64c9f317b3f946b26984e363fc12a03993436afd23468a64d7a82788b6690c998055acd0d89163a5a875ff42c2997f37c3331b6f3da0846315406c8d29874920365156f6fa76dbca959fafa73558fba0f26640c2f75a9c47e366490c6f7066465065fa705fd03688f7abfa7a9e749bdde884e4dd999d5a780ac2c4eece4beb7294389f264fc6fa469540e9a34518e7546d360ca86b90475f52fbe8198f40610ecc734d001480b16e3807820b726a686e4924c20bb45cea6282b9ba76f9794f81bebd0ce6f527e267a8a7cf986d92a59343f50deebe28cbea64a644ed561b3d3333bfe5c039e31699adc9d8337db9272c2551f639cf1d7360be688d67ec51b38cf221df7629dbd46c0f15a4c5ec07749fb5e283d43063692a59a79dca05413af4c58a03f00d38a44895323b3400a31656bc4dbea7292135b2fd0c7d00e71359d372a258172d210e9509c9a56a02b695b7013daf9b017f605e713e34efdaf09991c212e6d1d0bf9bbb3181ea4d3967772c4e585d9602a671987fe6ca81280081967d82b5073f3ad222d50313c7efdf461c6946d08172bef0c7edac489c176a994a6b99cea2c3b93c32bff728bf6a4589ef1bb010459aee66528437b52af157691653003888a2645f54b6032f1cf4c2c90c2c3e26c8c25f5aa30c301912fcee7a60ff5ffba32464c5ee81d232c8d37e8ddd649719f4323954214d3e7c3c81585391355d20d993e1f66ae90a38aa4fa05dc98b64f1b031a3dc340f0ae790c7bc7c12bea2ad143502792eb6544aaab251c138684cb6e308c57b44193c61f618437e4a62d7ad3b54f0d5a4b0576fb042b84292c4f8717700c8b8b9347bf356ba14e0a0e8a4253636d395329ebcafa449fe6740670f2a535fd41cfc286fa498f6592a7e1ab01fed23d23e424a2a126e0d4ab9a8193ae75f6d102e73bdc17ca41437e54bbea4a24865155a3b7a4aa1f7d7c5bf33a221b28374a57687ba1983625cd8986e9d27b72f43c57085f7c46325ee960149c96b92a7babb7ca0e91ec2bb1664cb517fe2658a040a0988893f61e19ce7075357c190b38878c927107940958902065b2c7cb441f10bacabf763a11427dd5ab715cab28f2607e482f8d205dafedbd2f46b9eac3c52f1e1590bd92da4d8a281dfc82f0224dc8e551b69cf1a70bd17b68405f056636fe331f78b490d7bf75e04313b978858f236a5592b1b86410edd3b73c319b99f8f0a22ee405a477fcc386c1735ab4b14af265ba3055c51333955e72a6bc2ddd6fb8e3ea6f2b5e59a9e593ff87d1353415d87ff63c03b843085a9450fc592cbf1fc960d876902eeb3b7e9083cdc76a8c542801900245f261f3cfeda8b9b328ad9d84a16fa6ce86bb15d0f4c4a1a7c538aa63a32e2f9713fe7a47f3007b3492274d7d3e165c50f637ed9f3958cffce5b76d3dcd1710718d8720551cee9d6809cac4359f6313a20de0173be6a695214c873108f7f1516fdf7a7a99f3c9acc7fff686203dec794c3e52272985449ddf5a268a47bc336edc7a76ed78f03835ded53907efa208d9a9f7ec920a8da94661af23cd8c7253c551fedafd649aa0b5173a10bdd6644ed165db4dec31784b3b62bc0d9f49c2d8f16add352eff6b9996fb8f0c3c76ed24ecea48c49a40cda0c95cf122640216497f81860406abeb8978065489f863a53188c1d10f20bb06508cbaef20b037f51bcc3099c5f8fc8306c4c21b18761f34fb2167047c23f2bac0f1f71677087dd7d673e279098a53da9809b9534639fc14c863444399f8aa4378a5ac0793d12646efe321b43d4f644a93b3568d81b89cbd4fbb041ef7232438fdf4442315aed3baeeb678cbdf9c806ba05e243a698673a6e795110702480323b78a5a096b0608cc594a52307f064ab634669cea4c08135a368de59c49bbc96c3bb4582b125b27c3963b48828a2125a2d6693b0dc7c1ee5f93120c3f4c12e9ab012ec8e88a22d3594be5b6228f61a3b9ecd289256b58772fa3adff7077d1e6389e4616f261017df5d0f635910d3c37740e3f01b195105032eece29d05b6d31cd6996dcb9055b9a11dbd9516e72356369b11b2f42d3adec01caff35cf75696eb2099d84bd05b5ba45b30b741b5cd1b9f35bd38c49a565ad24cecd8dce444aff8ed4b6a96ec0845109fd0918283b95adb98514834688fc36146095ac6d468666cc819ea55ef46be0c7205ed7f58cf5b114c33abeca0cb5f94937041c2cfaa026f366a222fdefc0fc05a3791e33cf7656ad7cd29934af47894ba875577def2cd28c1a7d8cdc3128155e1ce46543719c20ec38589d16cf1548943b85e8e08280dc0f036d5d6a56f5af38f32d47a521db82498c5955010aa3b9ab76a23ae56340b5f4b80e1f38dfde2c1ebcb03ff94eb90d5dcf413b53d0777ef9c046d80cefe0f2b5bedc3cc82a363e87d029b88066b92481979ccabfcf04fb17df004ac7b6f614fa7e645088c492390cd3d63c0ae8605a6d6be88d8544d0a08df95b0d9626d48f1b8d12d4fb3d76bdf64e5244c962233169c2a0ee44d06f11b4c5b39af8de10e3a1417444b00368300c963a6d7c62862c1f2252878ef034c134baa66d803b4f951452152a27a4cb319841db1074481dbce60179c3c432d631765ea00f9cccc525ed3561ffc2a0243531e7d0d841a13e6666e6833d7506a7d502083cfbdf113608b441d720216417ad51eea81f750c8cab1a581b5f21ea3e3e607de9bc979706dfe22e0155b48efa2c80cccd708ec87d1d68cc8ea34b6c1de009f612cc86ccabfdff406ceb0c8f50153718ad55ef83741feaca69a461faab4c672754a60d20b9f5743f766a99c3cdf9fd38e44a27bc263508b848ccf6148ad610783bc39b41a558e961aa5edceab86d3bd3feb7b7e0f7ff5b3c88978858113f9e6f14bfc19df29ab75d9522566293d18b40594920806dd14acdc59e9923f2cb59828bf510a4263d6689b37f86aa04b964248058e218fc4d6fc26c4c9906942bea491e0df8e2b4a39f8c91a0fe4f7f974ee700719d1927e632d1092c088e79b3c9293754fad8227f9acc9c411db168fdb40e562d821f751e2c7008a7881a17f56eb9548486f2f42410d04fda758e555f2c110de7518a6867b50607596837e383435011f73dd1ae337a2e28c79624b92e2f8574398bf88645852971bc596690dfffb3ec378fe2c5203f3cc3b2e013390d26e2358e81c83359e540d44abc34745dfc2b4fcfedb4bd6ce8828d06f3d8295eba9dde60e3a803f78df2ab8f0110129fb14cb91ad7a60b9c0ea5f14e31f21ea5433ebb5b11e68cc0c7a563e3d897f017c78eb4c2fe5544100a0dacf33aef8d73694b78d7ad2212282adf9a03a31a91589777cf329240db7b73200c906f3efa3b952a736115d958903007ba48e1367ac4b98e64f463d75630c2938c905f4ef9804f725771dc7aa4bb7fc4413e137a20fea6391282b3a738c280bec99d8bbdefc400b981a47184aafc528bcb4dda340878d60e6468322ee7b326383ff2650a618941468e536595cfc550c4c5128612b5a5c184b70f4fed07953b665c497b92d34299cfca19292c87b91315ab06a7949d08012297026d500ccb38ef9b0d4005d98272abe1605c976749f1e509a4cf1843321d6e90cc3af66bc7972a98a852d1c8bb547150b35084e2ea75b94d775d3c3c966edf10d7095ea93ceebdd1c52465456fb796949ca5637f3d271902f8f27eedc78deab3ad78d7497d980fb2ce155ec42224b23996dbc1c0947e7aa6a3ff3ecb27f317d5da0a2ec12c3b96c83dd61cc955242a9c1c640e2b92f454c4f2f41a793a26fd13c73d93a4ab31e98e9ec73dc97b2e864897ced724bb214dda8071806c9091f0ea1f63c4688d238e725b69204926bc4bcbb38c8b407f7dbc53b6e81f19bddc99c52d4d2f813478ec201e4c62ccca45e1a1da1db903527226bd10d82505046f5e317b3a339353ba88f431e173c8e863fe479602def1c697239318c260b316b2c4bba3cb8ef34d60fb7b40b8e1c2039ee84951cc6b705e651962592720b8675f53c01161804593f4aa31c5432b4cae4f360397eafd238c64aea73c77036978bd91eb6e9cb5eec9fe1ba43a10cecd4b0d7e22f2def26fd30e29ee4d52775abd65f599f5fdae7351d5d63f09922ad85c421703ed28e9d9c4ca31840619fb10b7e0f55851e4c857be24508ede47edd274959742d15951e5c4314c14f16e1d000aa717a2fce292208162110002b286600660855c59d0b90873dbd01d899f4bcd0820e3167187aa522df7ae3f216262e5944b57bce13f8dd63612741a595e05bc32f6de0f3a446f61268d6e98a4c821f790ae84e101e64ec39d8d9e77cb0ae9723d916f19c1995fd20d7c08a92764420aae12936526758a550ca5b5d2692655636a792ca2a1f6fa29355bd2ed03b721832f1019b5e96dbf0f25e36096be40d8246c268d56560ddcdb509573d0e4416f15a61f7e5fa52f6b565bcf155124eaf02995220781581e666cc1c151f123837926a5a947cef43b0dcf20d14a8e57751be777e431d012d935521b57f3ca4c0dee3aa035ec804 -MD = 71b950c0085388ddf90444c0918d72aa700319e789441fcd2da539c12a32ee19 - -Len = 48824 -Msg = a053265e4f9b8cb00d88917e4a194567bc7c32a0542fed397065eaa252ab946dd1cb9d554ef09380ea0cb501f67704a1acd99ddf1c49453568b6469d34867a54597ea5ded9e2074a18dd32b749221a1726d46b33e4a41ff066394fd0b1d449bba034e400d8b71097ffc3b1a92964ae51933644a59486a1f0d0b4ae42afdb2c2b0eb402c334b8d5ed0785dadd7f83e8d85cc7d23b1438f3bf10f00afb17e5492b0bc8a82fd32d7fd798ed545d34c8f133e74fbaff4c023ee58cb50c04d238c843ff367e4d9e5e35da1ac1c8312e7bf1ea9e96a7f9252baae8aeca5c64c71cd2fb52c72b247d922080f5cadd5f57e40f86e8633f3085fd5e52ddf9a123dddb8fdc6c4358bc5913685091d03cf1964b748e2c802aac56be83aa8008834afebc266db572ac1e182734d2579b8ceed2f7488ad4b311757eb7407901c0ace01106bf36961cd051a417ac8fadf2765ff531b20347c59c94e730be46c7e9c1edfd0284c075086b5de32bfa0efc9ea24be641da80ed7e7210777024993a4b6d7aacf89b92bbff264bbfaa43d7ad68b7ba8d6fe9892ea53cf118c19bfac2ad568d052f2c35d1c9a9221fdeb27326155eb5d20307a67204a13fb1694bf2c7d92431f0f1602f1d2e9beaea0d6c69d1703e429d445b6021614a0329b15b08b195806b55845e0a09f6a4ac0a809c411540006cd67b0e3ea385de456ae1f4c5e8aa12451c314f4dfce86d6f667f6884594c4b3865f047c96038060b5b413db0d4e081c62e405b815ecd9e3be651f8b9075dc8b032eb2f87c1416a5fe4195f51defe75f671f9a92d966ddf1872407568863b1edb26b4ee022c6ab148edb081306cce98decea462d90e90d60ff292071a3eaef6c12792abc20a7984cf5e4fccd6e8168f852d88ad0e2dfe2e274e90d555977ef86b1ecf8f4dc4378afa1f3e68cab89f05f477eeb3525b7e8d696e8208a4f972cbe0f4b1c12dc06c6cd319c57c944631a031921e9c3000da9cdb3bb0c78ccc5418288f8169ea68e0d162322c30bdf894084668608f2d84d802879b613b9778ea864cd986b10a235a62ae53baadcc388fe63ae0fcb4d35041677577df8c4c65fdbe53b90abf1758a4c7bf65b81b496debe216e13934a9cadc75acb870e133fb5467451653bb997184a79d4e6ea2bcfe70a3e1556137375b73d234445d62d5a3b92a2bdaaace16d5c3aa51f82468ae55e6d2a323bae4066bcc261505ee39b9c3f2af0cec572018ec2979e2492298a7d9151665338d649d63b11a57e26a8b68c5c89df034a2d8261e7dbc582baf582df2c5182e6d21df84a9e85503c21b83680f039ddf9ad31ec9d3891abb8515d0ca08bd8006b9c07c44a73980218f4746430b6b56e206311c8773133c143e9a2a0583c6f5f5ffb06364c46e43b73037ff801fc771006005f7eb66e4ca6a40878b66cca81f04273abd6c674d45cf8d33d4a8b5e195429097da7a14c46bc672241d76492ba73a19a6b2e5faa02f708e82ed42347f6bae7e2febbee67ac72fbcb808bc631635a0bd3c6956e42da8a31b6e73d6046a9a4f1315523e42d087ad068d74c18233703cfb440b478dbd596f1c3d8eed8d6acb2a35903882918c534838e9880b0f480118bc05bf405d17eadc7938650e3647a649cdeac5133c77d2093b156c24701e8f3ce6c8aecabc0502f21aa721c169c8d2b3c4692078a959adf7f55949940f7dc3ae63d5ff6c124d49bae7d2e98e8eb6f8700056723942fa8c1b4ffc47e1532d45781974dbafc7b8693bc900e6fe0bd9bf896bf9e2df6e21157b31488d95a3f5bca2f2ed6a1a430e077da67b409849f9d005ec9999f19498f32184834437699ed132d587d335ee17ce8968891ee4b0ded2ec6a7fbef71e25cc152ef693500cf12b32a98b3f88319a6366f573a86ba94f6e46cff47a797391495d19e9a367f4b373a95841d59c7261711c378108b49a164c1c023ef500fba311032ba39b0489af50a0c9f1bef81a329eb414fa6348ecf91375eba556131e25cd0f4e6ea4b032ac6b1ee4e3212492d692357628e4ad08c16c5a7273c63b44dd24876990e6f15a716b2b915f27a94115f6a74451b06d5436fed27fee6cffd595bf756452885266c7f9cfb8acf80e8eb6721366bef2103a1f72e5fa6071e7391345e027fcb358bf76bd134113bbdbe383ad80c3b7d01c21456f9bcb0ffc7bd8205fd199d68e8dcd465efe14dc9999a74250f64583721b71719efdda4436441b83b54fa4284278f8ff85991a4fb9cf41bc027dd36c01949169a6120f4646c96806ee622f39f6a1a968d9eb39b344051bb96c1e55b8a510ebf531e3535f5592286fb2122352d391464a03fc5a5261c39c0136e0b4b08516e6dfe4768cd58b28c487ab6866bb01cf396daad4667239922c5b07ccd69cca2eeaee69d5a4f10f12a2167f6be1bca7e3e899777c435cf3f9339087e8a4c49be05fe9680881fb0ad82ce4d6247c9ded56bd9611fbdb58b88119695f3e066f21b5ae9988150d3ba303c9b8599920a5fcaf1e2b225914adb0b047ab37d6e5e784343dc672062ef8031ae05bafd4b31dfc7675224f9ed8a502112321b6b62772ebe67537cee3ce7c51a5db9681dd1e4d1534294142d30e86d729169285e8b6597e51beb643b2d40db62d212f77ba4a7d6d6fa251a3009e99568289c54c7478e467ff8109797d28f45a391aee38751ef52fb24819192b6f26a8a3e283b260575acb7824f9194bb27964512e9d6d1681fc818283634d5e6b75f4148b945fb63a05d542114ecb255ae3fdfdc502bda35ddc8b69bbf5e7a079cd635eeac0fc7e082baae7aed03612087c4cc647e7d12699db76ee58988efa81781d0869cf31beab1575ef6547031aa48a7a331c1250a61d426a9ac214ea726cbc499a6e88a5800a0b5ce09d7ad9451656aecdac4be32cd1598ef36131a41320e20f9c63b401cb0d548744bd32619c4628111a605c32bf9d670b839eb764e286319897af1beca89c3a1fa22f3743261c48cba49e0ce46769b609d2df6dd1e986f30c13ba850f1d9f034c835a5126eb81fd03f3cf22a22c1d8caf668d1c942f096e9396ecba1135fef8356ea648b2f45b90e18d5c671317a13225c9118c55bcf5ec53aaad819cf5a16103eb7be3904894498efcaba3e02fddf09483d185bb9934b377d665a455677186dd8241eb68ef127032c8269db07db90d241a37cf6ecdac0b25a37ce9e69254aeecbc6029e1f2bf4df477341f2c071ed3fc18aa311760473e85975a19f77e332358204062a4588128fd933ceffcd7f288450591755e5beb93c13c67fc2f34f72b48374a615929424875a4a8d6c7f51f7526675661eac58251fe1a0c5937bb860fe487e4eda76ee9f68330df9c35678be2c8c860be64a6f3c167b7aff9b61bca17569a77cd362e5e7a4fc14909ef37201652af17537306262b219dbaa5555daa8ac3f86ccaaf71891c02de4ee59d6dc45beda5e3eac0ee03d757549323bc880db2562729acba3f5224c41056f7e70f61f7c1312c49f265720c2f62a43b92a4ddd534b1183bfea1a1d9bcddc9087327de33f5db5a39b2745b13d15153b780ba013c881ea03e249e5e8413d00fe0ecbc2357b22bd582a822a63466a90a5e2dd0612f78f4287fd33f716df06e9047f8d718ab1faa06ec7b773bb716f030f742f1e5f52cbd1ac4b48bc2dc7c41b5053f7fa57765df533fd47b02e408b02c4b662275d8cd00ddd66f8a3919dfd0e4e16abcb202ab5225425a37e40365706822426df91e8346d97dab44bf6b40a386a5219627951a8ce5beb6b2c75b54b94b437dd959107516768010c23a1cc74304170b16ec78da14f97c8ff49535fe123d78c06e7df6ccf81ca9470b94729e37c400d143e9f31272cb418e0634d98b03a687b3354d18af7433bef827b3b6ea0730271b26074eea2fc1d85bef8e8f2214ef39fd35b2bd47132388cb1f812fd63caf5690c52cd08bd245089db7899febce7e564777922fbc5c54cf66fae427875da853d82a41c21de3be98fc670f500fb8bca63801d7b435d82f5b74c0c6e428f285e79c5d2f6cc7eb9451220607ecb65b11f079dd6795da0d1af39b790eafdf83adda8464dc16b2712efbb49c58b9073de6feb1132c1ad4857e61832ea4d0d49988f43749320806fdf65e5d32ec002be8a19689a90c8a4bc8c46bd5e7708f31bb7efd5e141889ea175341c3ceaa084ae4ac81a9a9f12f665c52da39aa59341b72f7bca0cb75e38648ad6d8e7b7a1b8ab76d87b81ac24f4ecb927556814a06bc455bfaa678335c03176dab673e447f16eb4e6f5f0567332b9dea06d573284e3cbc127f1722393d890df9c1f621f07d1408b5034571c7232458c4535d88dc55c35f84139cd26fce3fb0ba77e22b675dad940c091366cc666186872697c94e6078b71a7edd8fbd564e8b1897d3648f670819ba4a70ed5d460bae9b452b3d66ba834b3a8781610b1fde237ce773d551e34e1e278e050c62094a596878c0ed0daa0da34df83150416f16024c3167859618a62cbb9d79cdc4f8450e5689fedf29773e48bc979465478f1eaff23b5a7c444f39cade3e7538695b2555cd3e8f1da36a3dc1ee2d53a705c71fb2d4cef2c344d02e80f83ba1543a7a11b6356118af64cb33964a81151f645e41945cb1d7617fe3aed6715aa4291f9c32baf6b8449b53e247503a5d83d34a9eabdcf0aeb25edcd0e155b16427bf010bb0e8780cb8eb57f6a276248744cda0cd8612fa8b2bc342deee842020d11fc60db2c923241fa75a506b9072c801154f34f9bee111e9979b56feeb27584b5058eb60e360ca1fd54339cb278be862b13e1b2d690d0895e2ce8038132cd23c5a9dede3c195c4607ffaf7eac2d7af0eab54c9499ae638d6adc3a4c58399574d467f5a63e82cdb8bac66d2efe9bee5ae0b7b8876dad46855ff620accc3d4af261be57c07e28bd7486571140224a851e9d79a9edcb03f62bae093fa765c47a26ee1b699f8351c803eb102034dfcfdbc68199854a2a48fecac583ebbebd558f8cda0dcfa5e6c459e169802e9f5f825eed3d85ff2f13e2ccfd3704b9652b67178ed613ee7600c70f87822570c25a189afd11dd6c0f0077ed3d82fa2d3d388f9ec732bc4a7269f04570a58eab5037d8fc70aefe506c886eebf639e2bba98d2581a0a075684d9ad69837741a32bb716a0fd2756740ba043e25d1bc3cf92c61cf5ca58fcdcc4a1bc064465e56ab86af4251ad05a6b18a1c7c373a9a874a588ef3ac605123eb0a55645627d4d28a2449d84e7ac04b275f299facab455033904d18ed5ba5164900e028da46680c3326c9b2729645b326abd42ed2ae5d06597624d59be1fc237ac034947d3c88625b00b7674ab9f67d13f2748065ae4238007cbe8044adb6c9d4badb1d9b74d68346448b4d5340631783b5a35ac2458563ed0672cf54197587fb734c4ac189b2dda954cdfb18b41c010a77e90464eea6f863c5da0956bfa8cc636bf0a28be5addfe8d3e7e6f79f71d7fcbbae23ea141783f91d6cc4c8fad125811760ab57133818892471a79c6d04eafef37b2fbe506785318f939837757f21f90824cbcf8cd205fed8f3a363a765d865b1d88e5e2e078a919ef6ea0e9a13202fa0b58a31cd2c26de63d660e9c8e51ee5693ec645f787f29dcdff30dae32dce89938b7d4a5e76f99c47a2769b6c333ce2ac167e0267595bba8f251308eb4f7bbb332f0b55bb630cbd16d03af4eba0a0d1dd080c1fd80c247c74f0f7350cc8c6291218bb005e70ceb533f84482d1ede9578e8c06fad410fb57f20b53dbe24a2c57b2c102c6d220ce29317329d1b95b84d8330ae53fe5f83ed198accf59e6441ccb87b0891590e3796d91e9414e0c79f1d85d1d2d3b78327d8dcb7db05b934715f9237fb46925395f06d7b3216435e9bedc8f3b458a254015c12cf6ad4d73a3b664f886fb5e09a2ed89657940c0dffb4a592bcdd4b857b1c6201f901cac021a6c93895ee450a8b0b379dda435c0654f32e2c57d412299f7dd3f35e294f3b8fbb709587ff5edacd33f3ca2bc670f6055f6edeea211756692e952e2669cb112d8143ae852b681609aef66573a5aea5ba004eef9e4dc0d3803692fb784aa60aa2002bcab8f8cb87e68526b6d96980db1adfb6a99adf776a8e9db0a17c5348ee96400e3348f0f0f50dbf6d0586994d5fcd038f52075fa3e1386bd96a5c0c1a85b34ad62f5c9b3d282564b299a2bd7cfa7c75bf330c55ab0128a9f49c3dfd82979e2569071c801be7d77dddbb545d7774cf3b3094d24af992065fe9804aafe9eb02d9b103b127f3fbcb10d5b3c402a5956d5fc8bd80c6f45c7993a05ea8a9b84a856f946a43182b2da82884c91b336e24ffe871f53f4f04262a4f007e8273557ccfeefc86f9dc2d4316cad14581793aeb2cdf1285376f91bac19af327fe962a49895ed09dfcfa5f05bf00a46e1d5b71b09d4b93b58fad03dee57d61a244999d795bc7f8f874fa2b3d48d1e58d18617b3cf934dbcd7091c35b3efe30387d0418d3ec325bdf8865f8b15c467cea9913c157e9a3d41501a437f97528492ed1600220e5a6e39960c12d2aa16552cdc9faa9c8159e65d56b6dc87f320094cf6733c328ed2c777025993470bf384d7ed09d9c5924307654d575deb71c90f9626808c3b3adcbffaaff72744b5fc75644d58403d0bf5ef0db6842e267dcdf612efb646989cd8b649015d6558329185669003844f68d32b9b24b5e3a581af5b27c49d11f71f4748c6a904c3fdfc43633337a40c99337b3ba21a75150527ddbd6947ad64d35ca8f6080975d9a29d926d7eb6b24f86f64e9db70a4a18b1dad98b3beb5fc599bf9e3c819538fce270ff128d8fb6d3b51bddd05e669d852805334334222c9ac6c2678ad7fec6d43a20fa0104450a2f903e9961ecc1f7d0f4417b83d67eac7ae6ffb57f5f8897c6261803b7675954b994b911c0f6aed192931a02bb877357ec76e20878acd5246912e0bc841b4f0f185f25d78c108fc33080f97958eb82a75602f3d105246705239cf58515b49891b24c0f4b11bee745314a6a3fea673f234df7cf9fb37aa0b28c30d0eddab7c8951de7cffcf04647c02b5be6d6fe8efb443ae1bfc4f20434a5195b0d5751995181b1bf025db66b13cc6531e9cef3c76992b33d4ef14f4575654198057208ddb5d0243e20fdc281edd2a568fd9878a4ec973d8717a539d2f57b9b64539e6ef97818dbe1b65da32f387b326d9cc3ebac06ba304b8441302137409d3c626cf2712ab45f563cede6c7861eb2bc41c1cb414a8431e73f65c0b4ad5cbdaccc4e41e9104b04e81f2eebef49459cd1872296092a7dc90683736a01ea387321fbb2cba5fb458323f7a1510b14785759c756ea78291f5c160b0aaa9d506c54387b4afe4c3e2c50a630e584af5a3f88919cef26f2b8d17192209bf0eb8250e75cc57768504b77d3cb655c15409d039735724bda2d6c4c90078e97eb70f29e930b54b88836b5a0a3200f8571635f5d0991e20d826cb5d93de28f8ed8d2239dfdc0b39eec840f3f452099e2278c03b4665366a4ae55281fd1bfbdf1776387e77e196c8ae3acbacc10698f02b63f4c9223d66a91bc5b358901fb946015b9b2039a71ea1d2c353abfbb5779679bd17c8ec8b778554b03509d3532ad4b5259146ad976b6b614a221829c66c371470725f2db632a8fc8d21bd4f1d15323aba63185c1744cf64b67e1cd4a3407b05624db76b265cb71b44bf9b8ae64408980459bfcd907375e2f1b0df83b3bb0c537df0f73143c05dbabc57cc0e177dfdd7eaba63886bbe04e3e2ff88be5ea48f06a7a24804752540dfdf3177631689b90053d02b160eee257071b53f0e0cc5af27caacd26e245208959495c50f4d30e51b29e140fee3cb7f8f86192ef925e412bdcd56bcf6b8105ee1c3cade9c2239292e5336cac8501cbb4b09727a0911ca60d098e82f259927eacd5419e992ff6e2c43b917f0fdbfab80a9e2094ec6393f426913aa52812f5f536030ca0e774b95976143cbda24973e77b3fa26d0b7030a5f8e26e44e94e38041a23d2577d56e771191d99cb1c5409e477037102864d8f5614ab9dd4ae61b515e9c64714933d0dc43da63d09d68229399e882117f5521c6eda2b4de6ffd409b4f558ef8af1ad98cd444c9b0c596a5e41524c46ffd134446aea0ff2fe463bb26bfd5a100cf11f14e6dd7f38452d6315b622be373c925ab3d494b8218d2a0f2ba542587d2d1a080ebb69cc9946bb12ebe2905c9650c13bc7369ab26e1613a4f1fb64c26b6de4fee2c569a342739ae04d611bb5c8ded66e1afb4c9d1d1b8bb391c8e5268f31ea7a3d6f6d91a87e4551b6bc354863295a581bbd2ac6c3100ab187b844033d3b82f07b43d6265fa932edb45e6d82d9e2b58035d6c5ce049609053023f1d719cd46f828dd43cfbc96ec2ad2b23503b17d807d15e2ae2136101f4547a68f109979cf07d28626fc63c9e98f7e622c397e6c43b5285b345efc10b5e82aaa6c5e30c36395e4e9004ac9a4b38223f8a392953167bee9cb08d5bb1a557455ca2a0e743cad38fc70602972d9c2b97fb04bad9a5f7500d69c8c33e78f7660556048afd838144765b6b716e3bbaf8bde5374f8f268e4117b6a4ee825f2a -MD = d5ebd0d3d544e46023979d06b666f35758b69628d95abb808fa65f51f03b81bf - -Len = 49616 -Msg = af08305484d04608c43ac58d68ed0bdb5db6044184794af8fd6e90fea5894021dd3a635a8e57c25d6a574a6e74c0b576c2e2675681c6967b3b62aeb3550ef43fdc3c69298163f1d8e13cb4e10a31c5203b130208ec0b3b370ed3964d942531ff32740a6765db1c9eb353cb8d3428820051ae9bfccc307f5301290e756bb64189694c0dbd42a68bda6702571bf98d363f8b1cfbdd291cabf899ccdfd3e0aa6a06092a3cd221ae86b286b31f326248270472c5ea510cb9064d6024d10efee7f59e98785d4f09da554e97cdec7b75429d788c112f007ceeda7bdd9aabcfca562a78a09d39db03123fd722b8869e3c61e2c36469949481a36da9989437bd4edf50bda801981f163e8d75b0dbb542bf8e3d0c7f33dfb223c009001a7b3b81916bb094390c42c24a47884fc8a0410f05b2f57b67d8d9046b2ef4a8eab880c29be09326da26fe6da713758ef26ef1af16b3533aa3c14a3260d376c890b1ce2975283f9b13b795c8368b9f59b6ae8ec7fa7b9f6ebb55fae40a98d98895d0ec5e2629fd1a6c27d07afe974dd99dc6e002b9f0214237fbb0c172656311807ca408b6cd14cb6ede752c0720c6362e1faf055cfc20dca01d36719f235e8bd91cbccf2efaced7a0454c855a0c5397f221c37beb86e6647e22529d99b8101e291afd5d959a71668ac21f2efe453c246f34e40a6c75b9035772cded690ec2f0f6dd2f57f394469fb5beb4cefbb1c9072fc1d95ae9b3e2e0b5756e08160cbb2ccbcd1a6850d095aba8a2d40e5a3a4265ba2e6b146927a8251f93ff97a89945f82d528536b536a6b2ebd4479622c7ee6996e562e0f5b955f71e344641289fa67ca6d43a6929aec0db07bed50d5b3f16384d4c86659451308039c00daf9d0527e2bdbbffaab5202c4e83c6461c0e8c02fd67cd9e4c4ed780e8f89f1a880fb3104ffb6f9da160743334e756616a4295fade6acf743c2b338e57e33935758790a9ede658dcf532921bb5bcd5efa0ff424603e0bacede344ea2f483f6281e0b8639e408df834e33622cf889abb8654d7b2d9550f575da700e03e75f3fba2aa67c0a5ce96a5c566ccdb026d63f84623528f8bc43ea31d7e85cfb59ff7ab2425d5b627c0f632db2e4b9ed662cfb1b3ebe31f09f4000c97da221d072ec11d90d3a098a6c0430bf0da3102ce1114645a2f17e5a67cf9f0776a843cb59ad6af734446fca55503bda0db2b8b5be1088c936d4f8813b782fb16702ac3437caefd45e8375695f79ea455a189bd026ae2a70a17285ac44c41890fbb6425333cc0637340004b1b109a7ca9ddd9fc5417592028cd00e22aa3ac36cd8ceef6f763a19e95dc202e87488d92f7e0aaedb36ec29479ef87c2c9463960da65199d2279c8fb382d15957cf7ce73da4a6af5c2e9b570680f1b5122ac5fa3a0e482ac26f7bd05b4b36ef46eb6f3bbcb8b9898e500b8509d9c3a31c96ea58bdb7ba8988765d44a95ff8aefdefe83c74614c26bac5c3191652772d92fd5a165c4baf9e6c63cd5367671f7cc30470522d48656d27b44b7df693133abb8a9b9ee06f3051b55e50655b0ab443e2528ee5ae150f461f462c177143a2b4e062375610cd438aad9170e24ef1beeaa000ca5dc06f4f99e8a3ed514e0a298249b0b6a8b60df3319a22b43209c445594637ac232bfe2f4ecbf216925792b28c3e9a9efb98d7452ec539a4bd512a52781b1ebd9db76bb64e105c3041528044ba074879b680d1436976ffc9ebf1cbeb2f69de84342b5eec7fff08c2c8087fe8f4ebe3ce4334a6f4cbf59baa25af501b66769e8950517edacae01e548e4135a522339326097cfc603a8936d0d15561e7058c87555aef748717fac86efbc44a832c287f0870227c909f7bf8c159a9a559f4f1c16fb8cee7fc4f962c99775b678afa0fd0fce0eccd8be31308072374c5781bed735fd4b6803f58fc725c6acc34c37433ad8ac1a49759ec998f2a997d684c62cac5ae156fe75a1c74c3403ce0583583db3f3b7b108403a455b4b0218e37deb2cee0e3e2c0c354824647cc555f7ce80d4eae9676f93a90f28fa023256dda35f143ec86a572bd3671b925881e1147e5fbd521241b266108bd8e7a0a0ce3f859096f1020c54d7c07d31686fcfdbe623336b8c06bd061a274ef9b6bee3eb83953e09b7538aa19a9cf8fa591b15b2d74daa53fb4f5fe70a5db6ffe9b5623b4472a600e4356bc9eeb978dae6f2ea12726e32fb2254a0e1c114525ff31ca239fc7e67012a10263a4eb66b57947fb35742055be583af0662d8ebaf9e656d2a6406490f7edb7c507f25044ef4e42a181dc0938397a1c71706bc643d3fa31f71460c42fdfe8ae261051c339237488a7eb2789958760f355939e5ee79b84ebc0d5c78fcb0f4baeaee689ec4e39344095dd1c4a739252e622368d01af39ccabb6513d6e6d6f5edee3f162728a19d692f4be84f1da41981d62c30155a1951a9a5ff08a081be769674f99a4fef6aba2a74af62729d27c79c19ca1c202c898b6e0461b7507df5fb3717a47163798d8dfa722edcd98642b3efa593898b12928e7a4f038c810c1bf8523eb6181c67a86d7ba010a3ee6973730ef20f04b0ace2ef70ee7b149cec8ef27a52a51ad52a49ed00671b741bc748694c97931a2b4be932c47b2ecc1e6fcd7e120bf7d62841c0913b6f95ca0c20101b5afec636658013dcf77d953f7036560fbbc334f6804ecade8f0225f219f4890daca02ee5f9da01627c5e44cb5cb0c70bca00c2d86791c7496dc72298dfb511c4a42423a552ca2057e5a5c41c1e6f8f06df5d581868bb24567a47322ab80228b4e3e35af10ac0ff11a5ec999e4fd31c956e213b22ee3b807a16dadb245d4c5c72ee661b657c6efc444f8b1bce6b8c0e1bf905028472935a48d62a742219f42b6326350b5f4224b6544509e128fbeac22f026134b9805320373a8e938098a9f42a2dd8a16ad672abc628f1703a7b8fd7330cde583eb1db60c9b6afbfec23ce652c57b953f4b3d95b1e6dda5f7f54dbcbbc9ad4d38061cc9a74cce66fa175e1fcde466fb9a964e932c1761ce564226f0e401edd3d2b2a873bcd0fcb196cf98509d47c6448d553f2c153f441d8856eaa1d521b6ffb9b769bd336d1d6439b19183a936c2f68252bb6854a4ad17f5f942d776702f5a55dd09aef46c59074a87f2bfd9f9829be0536850d18ec54605f3d69baf38816b0fec2d4fe815d7233317620d15d72fba0f21eeeb7547b431210b4df468bfd3ba4dab7fa6f5afc03f5b2a8a74451af1dc7784f6422616a160af0b50eb894f4ed078e3a7be04843be42a8712fc5108ef888043285bcd42b45c19b98687fa2e1934f95c4d9cfeda719908f8a1ad21ea524692282b40531417acc5dd98d0a3a45e6e36de184ac9fa8ae65d43df909e07419e15f9a8f99ed4efd81d412dce6dfb42079931b0cf4f2cad53913176acaea9e519717f468c98ca676987acee8a3e79ef86891cbe3376b702690c8a0b093a16663e0e82ae03283da4e66de5820b00688d736e69ea7e28e5b2af371649b02b97eb9654ca87653577d1d736b59359990e4357afdedbb94cfce5ae789cd5a867749ca8ac1e7abba9be14c44ae4c67df3b43ab9b6443aecca45c2ec38e65af9d8f5a2fc7c472f0c6b5b9536113ac57ef4a19a21ea62ae1d8a0872f3e0ba7eac6562251a2d0e4d6063967db5f37f3864861f8a17b302e056738d1d4bd6e1e9c8f5024c8b28397dc079b6f4c7587ac6389074322479ea779e6f1be97a84234455721e40d6d4906632950521f6a8f41801f9e9bbcfa4e31cfe66fb010a5047375cc3fe298398ddb1c19fc92dc94bb5d6c7abc64da19cb5777c3e768b83a41769e3d0ea2e1adee605727f4b40c8a985a7928d530f21ca282f23e0d2b06be75983f5812a77240d740b4f1dd3807c2a2c336b87d82ad79404edf83457974c81d62c97be052d298c4f6a5f61a8186c37712359819cc64b63105805224f69adda560dd36fc578afc53fcbaa34142e21361d1f6563e80906a015195193004d175aa1ceb07cb07f401f0cd6397c5deb2191f8ce9615041e8fb1dbd7e46db36c11697e1637cd0f6b63027d321323cc76f6aecad9f480382b6e002a3bc79ab1ed236fb68d6e4a2963a1d65c88400fa9f827f75be7878acc592cf3caed01003ff9d5d411dc5fdc489080046f7fc92a3c983dd273a1581c07cf50f482949a89a8b8b00057ab1269b21a8af27fc0b55acc7fbfa9d9af6e1f32b6626a1cd89b1c32513b5b50a18ddab028470953f20c89a3d435e356b8d1799535eabd5e630ba027edfe4ec467da188ae23eb1b5bed79e07c028e8b2648a147875715411daf2ffcdb3823f7aa5010a8871f7536bcc1d81416b1f20b55da0d6239d7e99fde858206dcc4e973b020897f2fdfa553ec3e61a99fca2f326481ba9ddd69af3e93346eb4e5febbfcf26f9a90fadd021f64c3a51569b39c9cfd00474f0484cca9e63c348ba95df1dfebadb2728aa001d5b0e220ec2726d0a769b621fa21a1c87e521d81ff796b41b9066b7f8851c12b334b2a53923a6c51ee4513d913c75929084158c584e89f1204cd194066e2a8e4a4bdfccbac262ca6de19b9db40580374e43e6e7db07961f93fba47a382bfcfd49663e9e79e7cc026035218b6f47649229ec3cf1906ae7c5de6586727603bbe71a4e76235eda0cf75da78a0eaa48482c8a45c1b360bfa16b68522082a8408fd224cb306352e24b31cd007e2f4d52558bd7181b34314def9a998a1ab5b6289f48cfa514673b48b1371908a7f541abb2397a2bf27ced5df7d8d9d41b10890414d083a3c93603556590a787aa686c9b89bed946ef947a37e1b090facb9d071b15f3a88ef8d8904e90c7e1453290b76cffa05e33b983c223d6a726c2d36319b7cb37a62e4856cc7e59612e09e5760a643e696fb9f951ab69fe4703f5db6aa81e5e27e64b62b79d2ce9e8f59d6b214ecd6ea0769f57071f508017905b8abb9a99f548ceaded03ed9f67e4a0c76d9969edb6cedaae7aac0521849f33bb895dd970b824c71b9242a320fcdb965093e7450d3f7a03ae0b484425346855de7f584bebd0423a5ff97da7f7d0573f008412c974312c5967b1e4c6a1b6f95f8d15b5da52652a8d3fc9bce16c0adf039ee922dc6cb36d44a0158672e032dab78ef37b6dec9e652a84ab0539c7d3fc4af46920683bedc32c23df393029d194c7a9c0b2eb02a47a77f64662974f52347cc8ad13542a08b979b6b602e8c3baaef6a825623edc9ff1de5c43dae34db01201e35c0388812cd4932242eb82f717b0ab51c9944dc2b653c57f49750509141b410d1ff8eb88809ee22e2cfbe70d0d23506e555000fc11269628013ce5cba7d9a50d9efb67872d9ecfa41c3afd4dc68e4cc5709c3fd1d9f5b81d12366bdb90d393ad8013e3c55a5cc04ab9b1adfe6a79071fc382f28b36459327266c8080f89174b36e49488b30611eeaac67e06a206ce943f50901704fa08f0de2e40a04079cb1e80fa47c21d734524a9c647cd711f05afbaf3954c94d8d1499f0a8f2ade47bb0140c2c68cf765dc23332b16a8e658cc20d991bd4dd57958a91f8c021c4b8b6dbff0ce9f4dd3665d86c165593d743c989425ab667f6963e59bea1327e90aad69970b8e409923ed3fbbfef58def9d32e17629b13f65a3213e9e89408f05be3625131b8248d37b72f92f266c3323e3f43d43503386a525299a3d6794a616b8be26d08b3b16a14c80207ce229d79ecac9029823b2fa9261e5aed52f7feb80ac9de54be519486719ad2c11bccee9a4c449e7c13ea009d1ebfdd3022b62edd7ec5df6e1b3bd4cb96542a28a10bbf7da62ff436aeb9b12c825daad50f5fe1b70fa86c23e619791fca1f8fa42788170a42951ac01c504c40991f4a42e19a2030079a0edbe9928c6c57238b9d77eafe29679d99802556d8c0ac2e44e1600ef22facc24cfeea4f13998387a57b57da7cc25f6ff8e090745e9403b2201954645f9d4849aef4b2f8198e977466a690009abd7034bf472751e5a4e6d2675184436f602156bc250934a333da115487ea035f02e314771db09675d89db6a0f3b9542b617f12fffab6abbb709687f9842c8cd4790036a7c9f4ea16186f875366bb3f9a88aca5fed98306682d11fddd062042ff0b0ec3d7b5bbf6d14ca66d081252abc4beef36412b36edb352959c86768cceea9e57e28f48cd61ad5c888f485f4640b2e98fed51599807a2c7688b7e3a39d79d1b21bc58eaf1d4b3305e169ab55ea76bf2d5f3b5c971fd4074d2f34dbcef061e6bb579b903f1f7eab06f29877c6388f7c20970f5e5897692411dfc7962750377745b403bfb93715ac505f1961c1e8a5f40738b9a14a71ba2178fcd8c969575b0205a39643ba0eb0b5566964ffd5456aa535a6d2bbd959477dc728f0ebf1504cf56fc8dbf29df0c0649db3f3a87d094e0e5083e304a1988197a0c698544be59defe8764d12e1a7d528aac14e02359eb0addc3253222fca091d7a6847b8f581ce4ff44e524b317e5f7ff213ec837b6032f22d44ab8ad0583e6dd87087707abf5ea437b393f1e9fedfe8f82e57a2db085579e83d64a53fed92072f91c02147e8af7b17487aad87a3d6e2416307f6b0f198a3817f1707cad4c488042e8a31e9b86133176f8ee4a707c4fa526485e5b9b66d1d8dac2b390dc8264eeab95e28dc88f46abcab492db4952a9f9fa559f631b15336612729af751237fa47c4b47cace4d9907b9e21ef2cc69850ada7ecbed59cdb9cb0828ae19d5d89e8afd315b3b756a132d89ab1af9c366eabf0eeb69601b376aed040d755f2f49cb887670a549848bbd0682360f57f4f4e100ddc501242afb4eb54d49792f291d0d862e2fad5cc55a9d78eeac857427b971b591341ba14ec06d0b2d0342f289fc6d6c6e97fcddfe7fbe6c133402b8265da2c6705f403f4e2ed0d8ea6456111890f1227ed01932f8a225cb3bf7108bb8897c1cc36ff766f4ee7e02cd933ff29e7ea390a6018cc57b6adc7bac1c3655a4e5089dd18bc97e06a87f731eb885ffe3718b9f2e53defd4f7fea66aeccfd7eb3184d32e4dc3def4d03dc1125fdae9fae0fb0355ded96413b8a57728b2feb6eadcb53c4428adb2191a89cc62a884439c8001a3b7cf73cfb08332b89896c8a8d5aa5233934bc2b7c9a3fc7797481cf37faedd19ad39b59927e216f92f2ac6244814fc47b029ab6692f6f66124c11d5000a7ede38aaff746e65fd2b750c16f9f9ec703e70f44d034e1ae07f78fa60e0fcc05a48ff494b15f7856e651a20d3d91561b19a0252fd9a94213b1d95c6957793e62a17d6f7a8c495a61d2769750a8a01a9badf1863d104a40d284550f7d8232d429553a4fe3e0ab08fb1784a55e492248c32159970f2c8e4a54e0191d7536a329e440553a4346eb009d361a506897be5d1c1456fc1886ebeb3565840ac2bd70ac0de35ca32b279fddc2be862d120cdae421076819eba7f99fde75346bf8bef1d700ce9f1efe2b1ffd0601869fed10ee6a5c7b0b74fb082dd4daaf88958993cd478762bb025eaa01eac1bf6a2d5c6c8f4c38efbf91b93fff1694751f2bf7d45959fc302ef1af2cec33a038cf59e248242640b602f4c8b7e3f196566693b6092c9ac9c77961823c25440c1e14ba016c5374fe9e64128bf882e27ac3dd7156aacd968a8908d65a4043b87fcfd8a24c2183b4ece9617f858a42659c6e02296c21a2b9b9057bc499e1cded75de99c725003b62763769a037d5b8f79585734039164290cfbd40c0e3993a7f88cac67d2e90e10a34f91b0935734d24d0da8f3a7fe133a85920e63fa9ceffdb1304ed58cb5c2b28a3aec42ee0eb7559e8add49c932aec5ccfd0dab57f0bb47cbf1d8cde7dba602a4ce91395dc96c81337afe1db054bd34abe3d9ca6b5c7cef0f7951362c834369b9b0877b28b0dcbed6831156a58dc8eee7ec7baa7f09bc5c426dc1faa4d71f50908bd6f297ec8e754d4d20def005585b4bc1fa31da1f02f62f78300094fcc41df2058784f2a50a0c6181329cd9e3f4e39e0a5e49c6c5d7259d40a730471dba3aa7c6a01b8002d9eddac75078a85025eea76eafd98923c251536d2d720460870d77772c9e8a2c827e80c6815aa47372e42f96f6c86c624be21aa8cbae12edb5002ac030f5584b8d291b27cd2a1675632dfe2a3b00b7aafa40ba9988ccbaedcc798748b6083286835572913cd0467d8031dcd18468b22258d3fbe76cb4448852e257b8c5bf6005eb694eadd7357cb452599133dbe8a5f3ec04a53a7f4ff8e5d1a262b7660229f14dcf7723a53f0041600be4f94768d7443e397f3cca831d2dd02170eea0b9d77231eeb59aaed7194d32b09fcbd1d0913ed7db52935439fd87d8c749057bccb0af202ed0bbfbe6110051b188507f081b093e53e6e7255ade1c70fcb4a3ff23fdd1a2f78f2d93522e81447468315bf9bdccfb0803e146cc091420287b7035a605ff3db1bb987f05b9f9936306166d89bfb097617128be79c69670b36416243e12627bc41ca6c5e5f98fc7e52ca5bca168dc99c8f76595475dcae905383ad4d16a22e3997afd6fdc386c6761a089502a017889a45f40d42015d91286be874e485666fd969d4584d1bcb7fb412b68310ad2aef05c6f6082eb37eb739fc0a2998c1e5652244d270dabcf990cec95eb682b23a4555af06ea7900b2795b60436bd840a1b69ac514a1154b73a21caa6b9fb733c824005a9114cf6d9b6ff3554e9c31762ddca94725898b3bcc1c243267bf5cc647139c5 -MD = 740e25c81e510d27735af90e3f8091596092c8136edb60f4df910f7204c289d5 - -Len = 50408 -Msg = 9ad432e59a7f71adefb66e0c10e1873b5ab91c65624f8ac38a505d06d288c1f5f1a63a57a53f951347151f96a298147505ad5a5397af6f06ebb3a1f5d4117dc47b208934ae4036447b1e109dfe33382c778e14119fd445b83d85d945f480c2365fca8743608b3a89b459aae8cbb9d9aad7e3b16524c6f222a74c6fbed9df7a91c62c9d4e60278b2a1a4f5541b233e1354e359918cb8e608c5292ca282c358c1ed7cf311b591c0f6fd4877a6e5ba83716040b33f23e33753d65de524b948be025bb3aad74f173b0a00b897f386d20c39520ede9ba25bd1b7f09b96fefbae85eee99f5771fd0335404e6dece6791a46df9cb63223a2735399866aa89db4554eec09a89f9e49f64e5e48e0dcdc36e3a1d8c2cf64738eda2b7d1a33908d8ded878e5e67d998d060e4a882a9ee613adedbb946c2dbe7d1f0c7c72e9ee54ae2d7ae4a3a459c1e0ac3a6b38e31a8021f5c22f5ab291f0d1647b72c35f52d525d9441a43fca6d8a73af0303ce10802b3efc3612627a945fb64f8800c2eecf4048b3e020c17ea46a8573681db4bf0d69242f73a40f2fd26c5c88a8e947d441715ea6f85481db072acac16465f495a63869766a0ef3d15f9f5383a85a475e3a81e9fdf893d367dc67ae197670e05cf115796197c7c2d7a27545b0f4b843e500de85196f73588dba9dc9dc1cc31a4d648cce617b72fecb319aada11c97cff13b03ba99db8763e518398889d5e0f51f870ae30683750a24836bf5c48e7d4e0b5f7df4ffbb2487e68bd774b3203f232bcf1c51b15e62776c1e55a8abd8ed30abd4c9beab8cff570a6bd418e89a4206faa34d95025abfc91a790450c77a4c2a5b3163822ddf6c43e96ecbef8a82ae2314a9fb276a06d161b829e46897e12e9d820bc7fa1700ffc0dbdb2b532997b80a0259b17368f16be3bd87726aadbc190cc8ba8350c7c01e608a578f0e4648142e3c291d238f98d3c193383ac169598ffa97c41250e06b6ca54d5a435b50f227023a9e7a923e6bad8de1a29a275b47e7d967bef164d1815f01cd5a04d4da4485187630765a05e85dab216d4ce71415d54bb111acf71b9069f862ed200552ada2e387757ce566ad689bcaee9fab0421cca41c52a1923f27120ba67a41575aac04f5d6d41abee11952e256ad1ecdac2a328502087bc0bca3ebce1087d56542be2fc1fce2bc60f5caa1114d2f46d98c6dab60fa99a80d04956b82399c4899bb5287da6217fe56251fd7ab26fba449258a9bba7e8c92d1a779f5fa7a3e377f1507a1919eea4d18efb77b127c88c3b6f7ff88140657d8a935d02f896ae41e8ff05c01aa0be02523c5ffefd9a65d018d744af4e00a91f60e10267ca174046a46ddbe2c66517012f14877ba833cff0a474adb66b123b1577ac6eb71e53e35a72e2dbc8668d840932bd7ad7f81c8d52a7ebc5f5209ca3c9979daad83c721ee51b060c5a41438a8221e040f8367a2760e9e79154b4c76aa1885bbdb46c9b794f68827681a1adb3d4c524e2c8a9782680310e1bbc71ba1707118faf32f6f67d001efe2123ccf38667e632672e9b3b111c48086a139d9e3262fce1893921acb161082116290b3e8ba44cb1d71152ee709bf77e8643819a431a0ff852b337e59ed8ed945c7ca6b64bf1be4a3a5b17b7cc650418783265d7d397137d12877ec8cace94fffb02e5824db705a599f332beabe2377d47ca907c6940cf17d19d3f7ebfacc608fca510cb195fe969fbc1eb2c987a5a56fbf14cb28e7f0d6f98ddc12e05d84b5a664c6eb8384f323f69ad8a291895334a9d91dfa1c9bb932d6e2f4e0122bceb9b41df487231f1a8ceea9f56dcb59b8c0233919270a25d2af85c7b2c1fa0be6e749545e6208cac13bf867f986ef6f42b25c8d9ad48a1cb9a7869a9a4af07489b8c6b6890ebd2e73ab9453599076308d85c615178504f6eab569da1fedaddc13b8cca2f8efb8a0ce66530a99ecd853f5d4f08e13bb133ae253a004b82c7ac91161bbb8227773c82df6a4ec4f2ebe30281a5c4713d92d6f4cfcb9b8f789ffb1ff4e24549a58771b1ed72a86cdc8706b70b079ee9c71cbea672b27556278953d59d88706c4e55af01d822448aa3ca74c8c41c9c312176752ed6979686d8ae3b1ad8b644d46b0681da67242c0790dbb79b748dc93193ca83f2c3200709d3353b566f14ca6743c56ca4642068c9ebe2579ae3012ad2653d6e5c01f8cfc56047dbf22849090e20b8fac795bdfebafc09da2bd821c9fadef9c0d257c5f6a4c70ca454ccfe09b24807b2abc2a4f8c10a76cab81c95ad92472600be8f30858d4fab1de523dad33904db1cb8b57d5dc55f51aea87804de83e8ebb7876fe08367414dcf0df4866e8d9c5cc15735ef36b041c30f63b11665b309716c95c07ef81ce519403509a9e29458b128ee09a28a69f9f474519274490cf2e0a75049b1ed938338fac328ec38388003dae7fa3f61d8ce0b65dae2c69275eb5ff120d42268b463d185211af7775f5b795da8d06ec4e50a306a6668b348d53b16d06d27787467cd0d67b5a671a7f3323c3b9b53d6b978f38d0c5dede474162b2ece9f0c5c169408142ae99603d1db4d73fb264a204b79d347d22739011e1f03cf731e487658235d0d5524b154fcfff44726b37ff37fd0f089452c14b14cd80b204652a66d41fc142071cdbe0d30476fe043a9b8f85f659379ebd4469c08298a4acfa4edead9087577054e86d5759b0565da70bed7f220033f4f88966b59faca74967ae494292dc737990ed155d4e300fe7470593740ea8a04f6aecec6483311c7243d55143854548bb67566345407a6d5981050c052a96ef06ab0b454dbbca86b005606110f666299e3eb0f1bfeef400fcebb6d1b2f47f82a32f411be1c7dd787b22bbf34b4493a89a8d892b2d88415d79ed676f0dfaa70dbd6e4acab135fe544c3264a2531e724848da4b8a0edac6f5391ca34e66bbc1e2adee64fc4c7481cc9baae6e8b8e2667b21bb7498e425094ab2eff6fa6da634940d364c0b14021c23f1f2af20ed1f04d3ad97a0d23e159cd08fdddefd834893b443dc5c81986d320cd7b049f57042c1c444f53cc08d1ad629287cd7b2382153a5fa2712fa5a2457e9c54a33d0e2ec21dfa06ab4de41a369b705335dd2fcbef8fb98cd0bdfc9b5e24d3356f94db5899988285eb5960c5dac0cbea7edba517ff8279824a3ac67908599ba3d06b64899bd5045479b824d88318cad2113e2d6e2d5ac80d476dad442a661c282e8b54c9af1ba9fcbf32d75e18ec969554cd6ed96161cdb42f1f5705ab937d4bf1bd5120bdb49804238e215c818456bab152115f83ddb1ff6a186cc47528e79581c70397aee6faf40f96acdca62833ca8f93bd097b179b76602095876f6d818c4771143568faf755ea101de56f20554c565a1bde3157b4a279ff7a5881aa74baa9852903d438b6ae1cc51f80c4b3e3c86d6dd3e68de5230a1e7cc23e9326e7a710c9ed07dae760870d7d58b48d2b05c73e948c2978081136b56115428d2a03d9e507054b63501c6825007089b2cee5d03099eeb0d809a6afa8741d6a57feefda8e051cd755bc13dacc1510071be5a86bab43a382973009fc5d7e7fc0daead432758cd8b19a716d646a86e037b0b77920175950a79bc563a53e46e64cfc36da670063e1e318b8518f671987205a8e7e78dda4a028ce10db33b196f815a62928039954e075b9d8e7e22b97aecaffb0dffa63ec380c16599a2d20345d23c10ce78ea7257d6d631b58e51ec7fc3e8866c52f12f8c35b5de7c81bf2e9be7e33273e8e929f5fd500c7cc20a8731a83def8589d5292e71d8a038c858f7dc32fe6c2568dc18a2fb477256a1c3261afa1e7aebfce8c804c5b85f50ef45fb8133dc02557129eae9413b07d5b60225a64a18dd0234a268b9b1d360577f0ca6257b0ab9868a690d237f99317c774e226e18ab7a5ab978a7b7c69857befff384236908e62b1d0ffc0bf6e083ad5e1d88dcd644d76803f1e1896495a9e9dab112159e650cc5b18533ed57bf72fad2e6e57d038368bc9ca4c2a92c49db7aa7bbdc767b9db1e8e06f5152126483f78e30b4b930d5c2cafbe7b7817e2360e3df7a4fc091216a071234b0d4a79e3af5e891633beeba6a15aa512cbceac0deb7fa82e88e7f8e9992df6beedf97cb0ca86a7f9d5f9dafc31f1067beb5f290a969815c432a8733c53e907b77fd53698d719c51bf9eae346269c6a1da071621656afc7ccc3f58bf714cedf9c8987af811d3e6be4693c0d6cc6855860b2ac5d1775ec44b004754903250405d6d4b6ef55e51e22bcec9561575ad158ace8ba24f7397816d6bad1b446ceb201ce280bfffa77e0710b499ee5ed29abf2690b40bf9ceb7bc4a8b0b0d5a956015ceb4c2ee65a1baee13949fea3177d39afffe3e934f0d21cd78cadbbb21407189d940ac6ac5b19adf9aeb45da3be9ca316d7385a8dd93884d6ec789a557027204c33287b5ae7b80741d35265ecc8cf12b057d23ed24163db492fdaf4c6a3ff40f22f6ff7f6e542e4410eeabc851f5eae03e8793b090f9c48b9bd9b710b97d7a116f0a7df8b3cfd6b82c8460a79a9919e99f3f4f93c2b2bf3adfe83ba2e32f76a40de98de1ed632c58b6a2cf8cd50b00bfade0c21727c5805ad5a5977375ea6c4f861099ab99a2819e45a652d8bfa021cac12895bb4ec6ba64139e74f2c022dd7c7e1c4bb637029901602b952bb91d0fa39f8334e0962abfdf203f3eb1706d4ca34c68fea25407b52a8c9ef0f63fc62cc29f7d1a379c76233472046f3ff51e3c5c87833cf06f267862216d10b8d2300bb02762d020c01d66fc9f8a80eedcda2f2095f78110e6f35550d5325ef40eef2ef4edf0d11cbf94fdafef3e1e4e861597781e32558459d2de6efe7b46285457f8f94993a7bbd97179c707ab81ef8f54f7cb86d044eb4659762533a460d6310f1c35d0c7ce6eac475dca7f3f6642572cd2a3563db9962afbaf0beb4a398e2378eb530a09afb5b66b0c22ac8635d78be1ba8802f73e15764dfb9babd92aa0aa29f8a95bd5e6117661178815fc7b2f8c2811f213794cf9c6a4ee4cebddcebe43a6b6d14cb8ec026ade0233422ea0bae6647b7a0e5050a38ab4f9a831c490577e53c843632f3c2912265eecb77940ea093b49786a0903b330e2a035f42a19dcb8c58f7825a550d5face7ffcfc88c66d82f11e85bcffb0a967a2646ec97ac5ee91808ef81ac7c499835b07ec87c9bb95e23a6d1a5dc0f1e68d98c8cb28432edd86f9494b98e2f1f45a406943cfb89b03858bb7bee2e9420b112a4fc386ffaf5a07b440db46938366de13269b5ad1ef270b5980ebd2d52b7790db6bf06c1cd1c4a226083faa65d3818d37b24bafa21280e2185b19b41118cc9b20afca4e3730add4e2f1d11ab67ca4e642bedd44a5cf91886c98c0fd29847a8e9e8dc9b3bb46861e6fa0483e21d96187b89ee8905950e98cbadc8a148b08f1f9a9787713358dedfd2095fd8b149447d00dc4c6493950e95d8798dd90b210c35ad6024b13226135dfaa4579682b17c86dc6d32ea5c24a2189575024083b367f20a8bdbe09fe7b0e646131447bc1ee53af584c6a5c9097228eae8505d192d485e9960d688e4635c7f9e9dbd72c75927a13468301c400e25cdbf1c9eb83359568243263a306862c032ea8c7aa00b27ebc3816399d72af9630ffc5715da3bfd3a65ee27326193ac840612267558f053d9a9c5bb295ff093d6f789e2dd4a97e29c0f83a9e3a2cd084f04feb4d322dea3985ae6b9073bf8a4248c4e051d90b1d02289ebf5787b7e40c932967dbf863de1d1decea55cf3acf4f5d73307fe35ef8f77da0c5317740e1a9b9ac3cb5f0d75d32b3e63c74f10734af2de2132a7c0bbe6410ad00ae916e65f6d446be4db3eee424f818f660919b470c2abfecc40b97c9e29221e6415e86cd7e63677115ca210f5e4af39ccb196d92c0e46b41ef3a9997fd629dda7c3730949af7ad09a0abf44b693d1493f700f49477eb52970e6177c51f127f71c1d3d257e70185cc70c20f04b04eda6086e0d6c89b902470a418b8cdc2125530b48d0293fd01605e08b4a7e7dde0e3a6fd217aab96835f4332d8d31e80f29d9bc6fb47b52777eb22caec75414c939ecbbc5b66ba132541a34d2a6d33c623e7176b86f857f0e584bf49e1ddcd86f78a4366e711707c069a055575ddaa1c36903834b8bae903daab78082d77c9175d24a26f6d016b4b97b6edee43bafdfdab4772951905d4bab7ee018837a9e068650c7d4845bd070c6936c17a3c7b8be4e26b5b1f204fc7a01dbad04c990a90048f80188419bae028fb88248ba895e06c8c7a6635571f2e3e6ca068b7ba1054763d4e18a54171634bbf298b85109097eefa03086a35ea74f0351d3f7c13319a380ec4f21e65771ccf34996b091d022ef6cb83c6403548385007bfc8ec4d04fdc474634961fe42893dec66478a1650f21e618b3439edaee4f844d6a99acff0eb95fec76312645a1512570ea58aa503adc06c67b6c9c78507337d1035fa149bf0371e6ff3a240246ce6f501198d41a09e874cc7e2724b611bac20eb02aca34c882243ab5f940a47ed1656cbf7f464ae60cd732a2bb5e1d99eccd0c5a404f4a92fe21f282b6a3b2b024afcedd5629683811d7fed172733450d1ffd4e7ea5913853f0f164db874b4468df47e5465a4fc67c01d3af2928b839f30016d41701016090c97acfe48dc33a7d5dc820af4e08fdbdf51eded64cd93ecd37adf4e1a9bdb872f61be7cae03b63bc411e4e94b05a8fb361b20aa3062eba0801333f83022ea656e1453b13210c56a2138acd8b23ad0318f21da103e72142400747025f9cfcc0d925874841c2ce89cb6fce0be70a78ee5b00e2309d52494df1b449ebfbec808e563d728ddb37ea83949028a85ce756a7d6288037d3ea0f538982cc6adc7352657a83677a4402f8ca9a3f5b11414ccec626d378352c20fbe9941d3eed75c3faeca2b2069c10b661d548c7b5e538ad39dfc99c5aa71a7997869dce22125c50e29a6b23b071d5c4ce1a3cb3c982a77b304b3aed781c23565aa0f3200647f49c91f52062f589e7b0962fc2ae267812593aaf073180e2db69cdcf50bd6c1cd32981638efa5642dafc428c86f12d340da9c1519b12d5b9b706597822f0b3ff7c6a498bf344534b342a5b9706376e54fdff6cf9830c170f2ace9611e6548e6e54e152c4f9fb6cf167ad59f5aceb6a4967cc860d3b87a531cb24fc5317635bf8011135b50f6a13d40a07c62f0787a19fef83a4e3411000effcac048232b79d1ae59c5ab2a02ad8717fbc1889928694a6d9d76232102fca9853c64745d4abd25586c53a6468b83b485d5cd9bbca82b41ccb1a1660455162a954f62d0459ba8c16793e6d40a59cacc7174c823c3be6906047de6a044d0f59b164de3e444e8e3afc116a6bcdf332bd8c221d9a61533cb9ffb496b58493c4203f27c0e39c3f715f7503dbae62ee24edf622428ae1acef8169b5d58167b60a46b10250c562891e79ffa504ada5d2fdae938c5dec23a599973cb00d6634206c4da588f04c3dc7e01b1a9968021d6df78ff2c4c236bdd9a55bc727b0dc506f44958b2041f0948860a3444588242ffbdcf2726001e2f6b5bd5fb7a1624c62ff3dcee06ca85afd371ab31b3de78c54290886b0e2bf8994c62c037ca1943ee25cb25a23c2a5d3de4068bafde708b33061f4ad3cc13d82ee877bf794acc94c45044cb7e3c6ccf3ce50e53b6ad56e212b233be664900e778a8647ac8e2773cd01926778aeed805333d52aa4f08d7a7edb0948b2c6b3c4dfef2f0982c7a61669ae638d0cd3bb624aa54973980d73dff49670a5a2d1b0e31482fe2c2adfad338ab20437f4f094d572992a8a75302ce14b03f5dd37242bdbbdfc8039f544a15da8a300f2b1842e6c4395f4c9dd071d30ea9a0549d02c692154a231bd828536f75bf7c647d31ccc99361234ac3fe0c9315bdf2b961e591d56411aaf21431fb2931d36e0a1da1913eed2a466bc0e5bc584f729d52c62489ced3bdc44ffc782b8a354d6dc8b270778dfa1b30773d8d6768e75309e875c698c487d5d8fb3704ccdbaab5e068e4a668fde1bc4936e1fff60c03e59f4215d3a501abe150bf6edec465b79431b05d4c4bd7cb95fa6f5542528cccb2c52a4f5497cb65699361490cfd6d8570c769c26a0764df2fa9ec405e61306941e466cb50586bddf609a96f985d3e3cd40a5bbe0686e94611c0734b5c0d40021a65bf30cfcf293d0f1a618989ce1f0345624df72aafb127c3a5cd1e433d03c1c6aefd27d9e44caa3d2e4f3ee83757024d370815dd6a03abcec2c2601bd9c2cccc29e857777f1e4e07ad3d37bc7f2f6273f155c1289f26f9b97d19b9ecc8c54bb43d4769b088e551f5fff11c0d90ef4b3ff8faa31136633b0c409cd3bff454670751e4048de7eadb8f8c3394e451dfe43ab5bf62a3180296507211539b44b7474bcf85d1148575125ebdcd4748aa4656eb8e6ea6e32b4b340c7a41e489a035150b1ef3774f48cd21e9f885de41836ec8dbeccd19db58853dc8c2f42c90f018f6cca6f69f46193c2eb8a62501d7c49d639038a6619288fad90cb1f1d3b81ca61418cf55f100e108625430735713561c4f94d8bf2610a1f02e61af0282090d28977601da1485867ae444fc3889fc1f33b36f36e0115e8cb0674e24ede18ca9e5a76fa44bb1ddf2dadd10743b3e9a0829b7a7b8d3c9833282aa5c787b9748d9276a8a20716f110b707441ff461ff6f94885c6c85ff7877aad1f1114744d4586340b4fdd14f727bb83d25e041fd417dbd64254cd4b43734b7bf0f85ea0aa8c9656b04644fcf02ae85d1eefed8f0406941c19d72f60544e8f324296bfc75724f3d282f8bbf0031f7c44817d215e57c90e6230d95566d3 -MD = 90df9cc3a3b904415331eba9cd52750c2c5cb73cb91b42caca7eee3788fc2b30 - -Len = 51200 -Msg = 37ebe98ef52bfb240b9ad369153afe081bbcf9d7ae43e8ba336b8ac57e8a6da0a3365e3008072473bf9d6eac13e509c1619956e12a06fc696512da091a7d40232c675e737713fcf51aea6c0316c3bdbe196132b0943df2b013860105ce676fce7b88d0a167d7ec72c588b7b6465a83c9ea1d748d15713455e5d0e901c3cf646a38a09b0002dc5ab1687f350dca35c1a87cd404c0d529292082f77844203d86be0bb8a9d970a9af7baad8d050cbd9e024788eca91fbed39db930398180e393d949ad7e173d9c65498339a6ec670d049058653ad48af45cc4cbffd30c3b54cf1b290052b1864bcafd0accdf9b8e2a163134d2c982c1bba4a3dafec288e3cfd0ae1934a6f0e39122aebbd7a586e48d495167620708664d31c740bd868c1ccd5f0e94baf959e81502cb00da87330cbf149d5a8381e9eb519a8b97acad7a48c5b0c92623b861064ff1ce8455f32469381e6198c7b8abc341357d6a4c85f7fa517c4a47df728ac09a6645b0ca77df7c70cd4aacaf19c280949919132dde7993e9181e647e964ba99cd6bd10b893c8d90187a5009a23d295d43bfb4cc0e583b8052ac21651b23813bfc9912ea0c574e152f42d3f1975309588a4705196598ad93e1ab1d82954b4a18bc56e55039b6837fd893fa2bd7c70e21a5934dc2e990379ec6e8a2445dc55d57940a14e5164273f59cd58e5f6a8281e11c09536ea22821c98ac978537d7a02220d1d6552aee168a001715834596baabf7813e1c69949b23eb4b86658fd51819eadf8a13f067ca8a791cd1d53ab69d0e43f18bd72d5d93322cc1c36fbe33121f5ff01905328fc7c33d452a86468663c77fc80b0195ec1eca05a5daee339042b4f88a1f9371b472c6c5168c00e984937a134b282633dea25dde7e397b907b1e7d3d240a593e747007990782cf944fa078a7118fbfa793b2604fa15b82453209daa64475d0e95e2408319e8b5ce7460f4593a19e3831a9b363b1c5ddbcd273995fbc61ce7502b0233b1752223352e654837181d01a929f49faad422c65b8ae416ef81290b02b48e222c2b8c3ed57cf0494b928c1e11ad2da77baacd427785096aae1cd593cc356e551bc390cd5765ea41be30cf0266ae2e97d326c417c91e90d75f1f874555b88a14a7c5959a62f23976b77a4c754e35dfb7ddd1700df85f61a62b12a9eb4644caa7f8ba036b9f29c6315ff96c3f7148284ebe3239ecad50641f397ea24b46e21655352a4109b61479b9dd34972779f2f1a6a1d2887b8ff88289b2ebda2efe995668879bb93c4ebb3a585ab336f70b382205ac37c383475fa12ebddfb95b157172261597d2cb0f24f254feffaf75d224a3b407eb54cc7c8daa5483e4a79c347252d808a5f480a35987f6f09f6c6a73bd5cfbdb76a11ed78b86442b810cb703a5dec5874e8721af62e386591bd39d990b3521505e144100601b46de3f50752911ff37bb18f377de45ec4c60fc4ed8ea1717708d2d13fc9e1453a1c4a4db9e4fbe9b74cb8da14ad50c8c8f2ec944e10ee8e82ebb6a081959b0159f043a15fa1cb59bc5e035f7623fbfaa99ea0a1d81ae8692a4019e5a5edb3a4886c789675039fde87222975e86c2642eb0bd48408072fafb1a88507194c9bdd69f3418376a4d9e68c3b83b3f800605ff1dcf0917a6014b0dd77708b583ce3ea632746fee0e01a10500cba90016b4a9072847d809bb0481ae25f74f8ef290c7a087ae16f505fd0da670826a0b1174592d184e3a7e8622a5c84a30ab64aab75face50b96b217e8ea335c0605c638ed1c59370bb9ded004be428f49a79f74ec0fb296b3758f0b6b41930c7e029b55c8fa73cba7dc926151d4043c6bc8a716d7de9ae0cd3ef3ab2d19b0c813eaf12eacfb641d492b0001b2f0f699bd98e4581fd44c0c817646bdd77a71d8ed432f8d422812751a2f9178cf1800ee689ebf046cf9b161f9a7ef0a106cbe833398bf383288661b426fad8d4f570a8293629ee06856af295a58585a81f87f130e6e08f723234856e874bd0adbb2fc9e676deab6b9f22faacf12e875d1259ccea54f7294be02a16f34c427b51a33be8a0c460c4c07d51a2e7d5c0722a9fcfefd21c265d5aa2c57ae4fe95556b5e1388ea9756a6afb0856fb8fbe1d2bb1838be7a95049848fa9545b616badb753c453f266836eda3c92cd592bc0925690c42cd6667f866717827ebe91d0999f9de5f5fd6cf77f63737b65927aebcf6cefc7ca107fda8447e8bebf1f08a280d53a4b07f8e35904cc48cc08eda3c63a3475924bde1de6acebaa65fec5ee68ca22d3fe722bf33267de628c9db1ceda3c78cb2f9988682d641d068023f96aabde4e10071cdec2080f616ac30c2725ad3efe98a69a56873615a3a3161503a4f22621986def597b66641d07793d97cdc9a68f85fd3890a38928462b2fbe2bc5c509631438d2e344d1ced9e2b71748f1b6ddf33a3e597de3af03ce43d305b9f5acefdb2b71acc645d3b55fa3848484b7fa4cf25e71e766702f1003950bd2f45b304052861f6748a8f38175f1e96c91471f5a54999cc9937191b6adc9de0d2520d86590cd4aeab292ba9ae474edb5b8caad6ee095c9e74c0f5e5c9387559f946b2dc45da7fa1d4c2dae6973d5984841682af25ff7ff29d9721d6c7e76776e8965b6c681bc38e85da15954ecbcf20d7448204d9a6a477781c1564d363e4c634c36fbd3c3b50b332f1643c415d004ec999316e75694a8b98e2591678388dc6624058454ec3a7ce608b3f222b8bad5cef77095285e1d2ad746c557222dfc30605bfadaafc4f292e931a0f0d49b226d99d708247879aed5b9f2ca2fe6fb414f37373f844e13865524f206c54487aed53781834b3f6eefb248d95ba21bb60041d501f90a97a19dcd80920df7d84309148e3d0892e50687c86a45a1372926e00f200053f5f436e003e35bdc10fa99d9328853bf82d2091f1f087cc37678138ac0027e73cbcc99f7fe37939c98114fc7380c0ad1a26e3f5ec00bc7eae77045a55c62c18117879389c662837415852e7a2d01ac667a226fedb2596e3e137a83daec2712a65e8cec3e644e738d11bdfe9b19517fa593546373fddcb9e681fc97d1763bb9092a456cc0dfe1aa0e132387d105e3ccb7746ee199aa7af00bb96047310585fed40219dab43f057220a41e90c5f89fdac4a5d6b207c01d5ad4440c5ca29eed292c6f7000c58da111eb4b16e31efa6df3f3aff69e6447ac406aa96a9ece4b5b813bf8b3a499d09cd0969073468513355d6c19346c58480feaf470e0d45a13b74f2925488fd810e0f74afb9e82a24cdf61586bfae68dc92ea09b22d8c8f1ffe9db1e7e98892b5554ce2e15fd5f1cac5347df2eafd2a8d5f1aa8746b9403915da6d418c0b5a3aa8e09d6b65f9a49c3b7a5728e9baf95471404fdf64eb05da5f704dbad60ac9ac106cab2873fb1bc9023ad95c24852337a703d9cc04d6df7de594c3b2e4fb9f2996e0418ec8698a4c087c14a2687717f97e228e75afe295caae2f16513f47a45b4124a7c5ebacbacc562951233bf89f43ff85b703ec77f168c2278fbe6e57a0e7192125f4642d73f2f227d806287081bd30149b9d44fdb90029667622f9925b7826bd0343bc537c66e660f174b447860e1bb8846c3edcb639ebd213a4695f9cb471e188db7a859fcf3abae49569e676dec857b897627cb0bc1155ad6d45282d430176fde4262da2d5f41ff890ceb319d73dda804738456f30a3d68da41554d4cede62aa8549b24e211e76768e6b17379f842a24a449a0ba3ea73cfc72624b5afd118fd7e76a7c6b5bbfa7a6b6c97b97dea52decd51cf35a8e277140ffb2748777a1e3cc3211f3c12be099d0316f45023da6cd200339a718c72a5ca172903922e59648d08dc67f173788363c26e5df406391f107552925ba91b9e569f38101f5eef9a52d201288372abf6532beb4af19fa6d81eaf473d40896dbf4deac0f35c63bd1e129147c76e7aa8d0ef921631f55a7436411079f1bcc7b98714ac2c13b5e7326e60d918db1f05ffb19da767a95bb141a84c4b73664ccebf844f3601f7c853f009b21becba11af3106f1de5827b14e9fac84b2cbf16d18c045622acb260024768e8acc4c0ae2c0bd5f60a98023828cdec18ed8dc298a306c38d1ece01509f3265b5f8cbf441f0525097e8b48234bf69f65cf402c7540a023ed231ef95b222a900ea4bfaeec02c6d8b3b01648ad7a165237ca6b557b1ce287b0ea137f4ef54534070ee793695a9078ec89bcea389956878614ccbf917b61f8427b7cda870fdd92d2d297154262fc65f28ff1a54b2651afff12d6f36ee8c906107bbda399ce5e2cf0a430ad0dd86520841757126bad725bf1593c7959f16221894f5852ddad3172fef866b3321755491fd44fba009b42ec0b6c4fb9e901d7eb3b8acf70e94911f54c538bd0559c5740042b6df4a07c3e00bba0934d92a684b39592a576331e5a44672a227ccef3e595ffa1146ac1dcee0a70baa9acfd5c132b361b5ceb519984b0ee00cd2124aa8acb50c9e574fb19bd99c8fef5407faeedb28b796848bb372beb3f5bde55ed2cb140b60a53bba2df471f330208b09ffb8eda04315a06d693aa53d9bff8939ef6f3a68de6e1975f79f50b3d484665e4ee71124ed794be3a2baa7b5b918e62a095bc5d46e401a0979641fe465640e8d4d43eeba9d0cac76c7b86d22375123b988585e58f86566fd190d868eca08aa1e66932d6d3b14ecad3efd9f8cfcf2696ed42eadfa642324d941602cbaebb8639a00a17542afda32117051e4fbf243dfd255a559c49ac37c265827ba70b0bc618882336f43e1a6a729c57be478008cae6c74840bbe828c976ac628d7b6015bcb705612c277bac0727da645480a0e14fdc497956aef05c89d30f22c2c96c6dfc9dae30617e6206fbd957975b8ba0524f563289e1f5f09bdb6fd46fa6117e78e854f91d71699fcfcadfaa7d4db8fcb04bed08d68d11677b5085b295c1d414cb12456c84c669737af6c33992a5a9149fc7f9330bb291d38f6bed10318081dde8fd178f02eb0e8b7d022c8b63fdcc867546035775fcf7b32c8fee83df7cbb28372b23c71459b9566a7f64165da0a3d0e538a3dcc1b6a384f75f0263dc10e0924a0ef2ab459d0a52b7c112710c58cf72442253396b8a25d7644be166c3e7828aa62b1ca1f32f620ed969b021ec609fe926958a03cff21f08f7c8d3d3235b219fb0020a51b97b60f963ebb58f7a62a5b41104c0b28b58cfc81668825f87064e401c263421152b8790dbc99b3032c9615187f29fcc1a58e86364ad45524b5358fa2f0a3296729a3663a585e9aa922f534fefd16fb6f96cd9895709c5520cdcd24c8d107e387e520de055a3296544ef1c1ddd43b919a4ff139861f06ae5280d5aa5aaeb8f7d74ed6ea56093c2e697a30c29c4ac145aa99a372f1a03ae72495f52a40cfddedc12b6e9115aea5ea516c5a4223a8d0a0073c8b4abe3c6188fdd6d4ab627c9f4eab468fdc2a91945274ed18465a368f291a0050c9d638a31944091b35a8fd26a1ff65e2d17dfa32ef3ac412d8293b276849ad9af71fdf272363f771d0fa99996e24510e7bf731a7480cbbefff7801c0e5fd0a13dd8278162ec1687f85409a203e82d2bcdf7e7d1ae5509857c42fce80299fe06182e74a97c0c624ed5b6246e59781af9407fb28b34f7024f42d36eb92bb95f72cee379ed363daf2625b48e60d0489b23dfa57789c0dd2276b4575a01c2349171d2a58bcf29e659b868cdac1c30a02a160c078b6faa7e0696711d43447ea2108db3d34ec1bf9cfe802f601212d335445a4624829f8a600b18e9b3cf13a9787910f2fb27676fd809e7ea1a34c7306e766b2e7ae1bbb919cc888ea931d1eb2e27c6109b9a12c31e188a196a98bbe0b24cc315791d26ef01b77fe06c3011ac39a8f78d233b7651e586d14dcfc2636cb713ecabadb97374ce58498f8b2e557531793fd9207fe484a4e147f7b826502cd3785251973b23e2b62b7fdc74a10fce9c04f97511dbffe3f2c46887c25904b99df69e97b416bac18fadad67b71cc320eff8def185d41ae8558cbdae6ccee38b8cfb2bfe92d0aa99815b3ca1d115f21493b13adeeafce81a23c6b1bc15fc8f2b171284e6a1fd65c351b0c82b31112f022ddaa78dcfbac9f203eeef415c566a00c2c933f06ff18ee7674aba548592dc8214b1af8e929242f87c81b0cebe8106b5267ba39c5b51987e38858dce1d1f8d0cfee2bd61d217e5a5d41bb0c4aaf0e7b0a8c66e5b0291e4d05bfddcf8861bb31b32ea5ba80cb02472c11969b3b02a7f7bc025feace44726b6382012544f1bd1256744f4b1b0ff81f7b9f7462c5c92507f1316df228ec5c0786378b871e69479c3e26f232f5d6a709d3551d08f0ecced52f8158a2c40a234af448449c1cb1a1f6f5ae56171606582ebb9a5836c454eb86015ae7a4ac87105b371bf40d49b1134a037243a0878953b5bbd6ef944ae7c345ec24e4a0e8496b62d71a6381aa52e5bdeedc81784f45e0c75b72a8c9898ea0387a47153d7e3a7c895aab58a1497a5e794052d7457624478c24d44c7e8932c887322b422478418af64a389c152d12c7a6803e0fb0050dcf2b9d65a35a53b9845b9c3835fddd45dfd12e28f8845e03686b3707ef6003e7c1cd4f8d7406ee0d1cdc41d7b56fb630c1438fe33196e53389f1ec1540fe789c6599c0b589296214d831a86e89220ae97974f4d112f4c98c726027d0c9316d1303b87a43a86cb8b800835a677abfe1584e8be55a624612f56bdf71a054a2e834e35105a19a77f7dfdbf9dd2850ee44658ab0eae6e833c855bb9650eda7f8f4e74d8de73526f12773b2bcbb1bd35639f8730d8cdd6d64f496abae4e1f8cdc96148894aa691683515bcdf37ba6caa0cbf953c752a7b9819e9f834ff39ec8f6d8a3dd8dd5a431d47c7f74c7a633ff73ff507009c5ac9431cc588ba0c6d226edc17c94a0f14d3e8db0c7ef60c3293878dfe513f96b54c61c88a90aca4f246d6a5988f5f785ce0655f51b85e55af03e5772a083bfcf0816ebd97a4af416fa6414a9ad47b7198e51d55463807ef4f0d9b7c06a0a84762e4e46c8b39147a4bdd594b8d4d40b36f5e6b4d48726551890d040d229ee70ea3034d45b3c28eb80d686918fe6e219636b8f9b7e6fc08f4e3bed9bafc778aab274913e9cfd570732ab3fb434c9ba0928581232580495571e56f6705f2af05b56642c2b93df65c443a6caa5b167a4040d2438206d2cefd3114ab466eb3c9eaa5e66cf4447c89c493a2eee0b0ea6e7329b37c90ec2d0142bae7fef265ae3c9c053e44031c0a142bf9faa728e5170cdba59fa8da361d94d887d5d6f58b409bbc4bd4548990653a04dfb841fd784ac9cc4cfd34c88512de212074dfba30295badf22f1af2522c5fe1cd423bd8eae429d7a862bcd649ab61bf0d3b55daf4b6f0f390c503d7c1bdea453b5ef145bd8191802056bd9e0455a404b6afe5b25977f02f902caba46f988d91b2350ebe4091b5584d4f938a45803984a5291beadeeadda488dc7ed2dc4aae69ca8ae0bd4492f9b297c3fb257de986c1615d44dee59e1e14d34af9fd7852b13fdcb713dd1a03d341884a30ea1dc0104d63a31d291df035d317fea98ec44f5a86715014783172e667a748f162c5c26a8b34a0f133d89fb971bf6e0a01507efed010cc7f194b5e87a77d56a909d65efa0d5ccd6da9b5eb1d73422f97ffad8012af43a2905a98354b8362e9c459f0044336348eded53660d65a38a9efc42be13a6672790496d875a67e0078dfdd8340dab8547be140ca9f88891b635e195c20daa8359658785cbe3d09ce8a580f009324e6550b0196e305889262f28f49dead77e6f5a0e859c57d53c935a4c9590879b6528eb2bc3230217b0897cddfeff405a6a54b2f50c58311af1ede4ea0660b73037f9a097d9d0271b45e325bec666cc7cb65ae780e361639838d10fe79907a0da0efef85d2420a84e905bb33116789526a9a88319d460f539586762ab172e4a7f305f7ae36cb88c96d91aada0b4dda3418c670e27a5fdede39bd8659e477cbe08e645af927843dbdd67489b72693efeb3a7be0e121fdf5580474ca028f39a035e78d81dd212679d0a830c050ffd43af6642d60d410aaf34f7a5ea9cb2e12f21672e3f4e0c00ccdb05758e74df3893bd40a5d7921e2e149330fddbe0a2dae4210d50a3caa60b1b9db685f7704ae2d7302b18e8261052b779139747f462a6610a37252b170afbfce905fb6f7fb8c2b6100ee231507f403fee88ba5561580d4de4cdf600bf9e9816c9da1e1d2b91a1d966d04cdb98d3be55fb77af2daeeed750b8b60b494accaa12441d372afb3d47e7395b9e0e867595a1a6c8bff8638bcb138ddcac2f3efbf89762b68ebd77247c89929620f1a3cb8dcaf9632fde0996b33e6b2621da25924b4e2c8d6bff28ae0867786919ad763e6d79fc304a06277955795a7cb17186fb6bdfa98a16189544b228f3bcd3698737ff55b6185799459b796a63c6a61cea9d20f1e296d62f474c43750b77944e5f1c09072f019dbeeb64e9bc8dec4605d8e0322cdd97f56cc43084f5c983a584855654366fd5659ea23c6c15e1d7da51d82c683aa477b9f896563a5134c64e32814ea88b7f7af760f18bc91e656da92b72e98bc03f1c6bfb442830305529d681dc6bccae66da9b2e61b9c97e2397fdb92f7f6369b470529c570c2d3b329487981d148a462cdb992d792e34dd233e1c239657b8da0d59b804566cf81ad5f0a7a0ccb3a8fbda673887c153d2e56c484f9230d752be52c1e35bc9af5a7446237fc072afef777665c264c18e6a3c059fde2e8368f9bb898f1cc8393d1bf18b1757219670275f0bbc7deb0248c68af929111e19737479bcabab732d7e033aaeb277eac05e185e9e56b2450beaac784dd0308b7a5e8ca1f2fcd8852ddad9f7b7de264478e1891a391aa89964dae5ad0b7a829c2c9209db346ceb26c1b967cfac82ad574761443be3f0a910968239d23b11507ab978b3ce89e22b7d7283736b9786544ab4460f -MD = 33b6229592ca719e4e46f35b287617fedadd3b7c38be3c8c1c9f446d2d9085b3 - diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/third_party/NIST/SHAVS/SHA256Monte.rsp temporalio-1.3.0/vendor/ring-0.16.20/third_party/NIST/SHAVS/SHA256Monte.rsp --- temporalio-1.3.0/vendor/ring-0.16.20/third_party/NIST/SHAVS/SHA256Monte.rsp 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/third_party/NIST/SHAVS/SHA256Monte.rsp 1970-01-01 00:00:00.000000000 +0000 @@ -1,309 +0,0 @@ -# CAVS 11.1 -# "SHA-256 Monte" information for "sha_values" -# SHA-256 tests are configured for BYTE oriented implementations -# Generated on Wed May 11 17:26:03 2011 - -[L = 32] - -Seed = 6d1e72ad03ddeb5de891e572e2396f8da015d899ef0e79503152d6010a3fe691 - -COUNT = 0 -MD = e93c330ae5447738c8aa85d71a6c80f2a58381d05872d26bdd39f1fcd4f2b788 - -COUNT = 1 -MD = 2e78f8c8772ea7c9331d41ed3f9cdf27d8f514a99342ee766ee3b8b0d0b121c0 - -COUNT = 2 -MD = d6a23dff1b7f2eddc1a212f8a218397523a799b07386a30692fd6fe9d2bf0944 - -COUNT = 3 -MD = fb0099a964fad5a88cf12952f2991ce256a4ac3049f3d389c3b9e6c00e585db4 - -COUNT = 4 -MD = f9eba2a4cf6263826beaf6150057849eb975a9513c0b76ecad0f1c19ebbad89b - -COUNT = 5 -MD = 3ddf05ba8dfec982451a3e9a97695ea9cdb7098c877d0c2cd2c64e58a87754d9 - -COUNT = 6 -MD = 2cc3fe501e3b2e33e60407b0a27025735dd04fd7623bb4fceeebae5cad67ad4b - -COUNT = 7 -MD = c534802a459b40c792e1fa68e54ceab69e333fbeeecad65fb124d2f3cc1f1fc1 - -COUNT = 8 -MD = 8986e95d85e64822287c78cb7a714339431332182107109d57827776c6cc930e - -COUNT = 9 -MD = 72361401c670d07f1151a95e2ee914665c2bdb1228581833c7dc53b89c01c927 - -COUNT = 10 -MD = 124c443bad9d955e084a3961b079c43c59b5e0d666af38f2f37846e85369a618 - -COUNT = 11 -MD = 81914b78674a2a6204eef78ff51369526bf0c2e121cd364eb40a8435479dda14 - -COUNT = 12 -MD = 8eac9d963b44021b70a527ea07420b03f51a998d0d6cb73ad4cb7fc688b4d174 - -COUNT = 13 -MD = 0427263b4dd3ebfcb7871939dbaca5ca94e794f748c02920c9759dfa554ea534 - -COUNT = 14 -MD = 3e9d754f2ec273b0056c2fcad2e891aaf9616fe74005d36cbf5ccba2e037b5b3 - -COUNT = 15 -MD = 986b6594ed96a819e49edb9f65db2ea52168973d7e18ae9e0b8869a8b5dd29a0 - -COUNT = 16 -MD = 117578126a35176a00f8c0cf999442df0890737be1880f06e6a7270959c114c6 - -COUNT = 17 -MD = fd7f5574788d8ef64b83333ffb62e4cd3311e638db0c514071c19b84e9117afe - -COUNT = 18 -MD = 19db7ba6e3488a9e935af33ffb912d60c9d3b98a0be1d78e0b374dcb5274a7fb - -COUNT = 19 -MD = 52519e6319505df7a9aa83778618ec10b78c5771bac50e8d3f59bc815dabfb1f - -COUNT = 20 -MD = 434d7795fc7510af04b613e120f7f48e6d613ec056ae9fbc7c869b87c1dce63e - -COUNT = 21 -MD = 020324de7f6763be57bc4a6a0960258ea401ffe40d68f854e82ccfa9e0612ff7 - -COUNT = 22 -MD = b87c7fd0ec4cd35fab077b64d00917ad06aaccb095bbe4603466644ce6cbce18 - -COUNT = 23 -MD = 01abbd12b2b476b2d540d0c47edcb56263ea658a8080a8f08dbb313942562f00 - -COUNT = 24 -MD = ce95bb2bf2d5c91402e13ed5271615607f39e0678aae776d18a78351b90b5838 - -COUNT = 25 -MD = b81af264b0bb485f6656be91478f7b96c324fe262fcc366d9ce3edd44ccb85d0 - -COUNT = 26 -MD = 9e2ad901200ca524c91373f7b5eda9cda142353e763862e350314f793a0b700d - -COUNT = 27 -MD = dbfabc7124338d6845f083cb1bbdf7b4060274d8e0e98d08bb7ca3779059b45b - -COUNT = 28 -MD = d93c2cd61f5476ea08d85f741720ab2ce5c4e38cd8254758238155fd68ea7723 - -COUNT = 29 -MD = 232d9c3b583e297439c859150738e1b1d530812d63a9a2c1cb8e40cb50a2f27b - -COUNT = 30 -MD = 8b9c858bd135138d9023a0b5fcf3f12ebbc3b7f721ee0b44be1871187f21f506 - -COUNT = 31 -MD = 05cedbd568ce9adcf5022999b8f3a28995a910c572375186da5febd775d62b79 - -COUNT = 32 -MD = 24282cba8f5dfce7e423a103488a9a924080d549853c699159d27816dbdbe5d9 - -COUNT = 33 -MD = ba6e3c38128f93f288e781af8a13e7ce5120c2a43a6d1c0d4edc831247350079 - -COUNT = 34 -MD = 706fffec5b69f5ef5465b6a8663c302143af743c6b7cd5fec9f3fa9bf9b2e285 - -COUNT = 35 -MD = 6d32c55c005eea65dacdf0e90f436943d0d0acec3c2355c36e2df1a86d1a11a7 - -COUNT = 36 -MD = b353f425293db464ad814177ea9689f43054bcdbaf75675e918b78a82ca97a50 - -COUNT = 37 -MD = c3fa9993130b3c95d9aed30243ba902035933d18adf5e21d2567674769062e81 - -COUNT = 38 -MD = 1e77e07988ebd618740c2f89a7bcf0ae2542279ea8895b39aa70ba8bc37ee00f - -COUNT = 39 -MD = 063927892a0b095be7d21987ff8157cd4c674c1cd01ab9f0834824e8efbcf938 - -COUNT = 40 -MD = f43054c280f05371cfbac776d43d6001f71350d898677f035aa8f7e5bd7b3fa3 - -COUNT = 41 -MD = 2427934b28c7a9c2b18a5b7e996351aa567523744f60d54dc35bbb61f56f6fd4 - -COUNT = 42 -MD = 3633976d174279161e13b49e5866c144ce8c1d17ec1901ad56a02c900273fe11 - -COUNT = 43 -MD = 5f9788660d82c80155a7fea91896be3be2eb6a7b2ce963f3804cd09da5ac0c8f - -COUNT = 44 -MD = 097ef57de6df98c29346e67e7f676569ad402f7a1c88d1cf39ce2d44fd706f72 - -COUNT = 45 -MD = fedcc810c74706a27fc0b6663ab2f9de0761089682dff1279fcd91312af1b8e3 - -COUNT = 46 -MD = bd5d61fea8d23089f3f30266b1daa636a352e49476526e71cc0735cbd17054fe - -COUNT = 47 -MD = 5ead027c03d7a55c17f0c783b6d77670cdb8942772077d09dff9a46ecd527bec - -COUNT = 48 -MD = 7a06eeea07ca9eb94a98a5e9f00b7efd8de9843b6aa888822c3dccf803637732 - -COUNT = 49 -MD = 44b6a895058ed3f31a5549407af8f788631f8a6eb8c0a5f2e15facc9190b5672 - -COUNT = 50 -MD = f8a58bff4b54aaebe18fc3f0bb1d24974a125530756dd4a0f15628c35c02ea1c - -COUNT = 51 -MD = 3bf2ae5408399aba59f42e5bed35a00d038fada16013ffa5da9e8b7207f6012c - -COUNT = 52 -MD = 31d33c0275986b06f6dccf570d1064c7b36e1574cc4371d4bba2e55321d75397 - -COUNT = 53 -MD = bda59cbd65e87a57df3f03c89e4d9511de71da05e2eee0560948696b37615f8f - -COUNT = 54 -MD = f431cc1817569e92c8ba11ec4741e6dd2e361156575af7b482587ed78e9fb7fe - -COUNT = 55 -MD = 1b3b3789a32165f725167da6f5ef89d95de5992783961440fce67b66c3351ea6 - -COUNT = 56 -MD = c9873a09c079ca7f477b5601519ce51896c2a35a28fe05fe8b13e990813c6634 - -COUNT = 57 -MD = fb16cc865ddcf513be298c7d514033ab3fae7a80b285d2b43e82363342e498f4 - -COUNT = 58 -MD = ebaebc261b327f8be24026e32099a6b15927c54dbe390b72756f3f6362ea3b3a - -COUNT = 59 -MD = ae5a4fdc779d808ba898966c8c14a6c9894107ef3e1d680f6ae37e95cb7e1b67 - -COUNT = 60 -MD = 5a4a67451c197b038c540878b6e7bc6fce3eea9c95795d611359703d6cc7ca02 - -COUNT = 61 -MD = efb075aa051070a6b2303e026f81a5262a6e64eabb270ec5e13fc6efa3529f6f - -COUNT = 62 -MD = 8ff3df1a5cd0840bce61520f1e5645ce272a37b884c1750c69a957134c1a20d2 - -COUNT = 63 -MD = 8fbd86567c20dc3ea9948dd5ea6f5204028c4ba258c35052994e7c86de2d7701 - -COUNT = 64 -MD = 670559572a74e9af0513a3f9243bfbfd5805b837705faedc3c480d67a92bc124 - -COUNT = 65 -MD = ef2ad8656fac9c593d301fcfac77a7815d50b42526d3a44e1573316a25b05904 - -COUNT = 66 -MD = a3484a7a6cb5c941e15346a3ac4e09e99a5189cc96a87104d196af3c43cf995e - -COUNT = 67 -MD = 966851a0ef41f8d8ff970f4340a8dae8eec4f1999f5fd4f6cbcfa372fbf85495 - -COUNT = 68 -MD = 8e1559cd4431febfa15662a2ccf2cac82f5401b2657551480bb0e3dd2111032c - -COUNT = 69 -MD = 5f535e2e7351cb8caf0070166218238a843c17472cea2f5911008be5d7fd6ba2 - -COUNT = 70 -MD = 86ac4ea15f10c264b158058f5c13a36a87ac72f840071bbc45399b36823a5709 - -COUNT = 71 -MD = 5c0d3fe289b2aac7d1bbaf57f4154b8d10875cffc9d8bd2402255ed1615f1d5f - -COUNT = 72 -MD = d7d808366d0c8b76ce3e7ab80ea11b4e2f8758f9ff404a3aafbf5b0cc191adcb - -COUNT = 73 -MD = e0768536856d1d7399667d6fd2c32f72416eeea1c40a313ee6edc910a5c3b786 - -COUNT = 74 -MD = d670923731b3e598f5c4db4c7e57fe2275cc6c49b4bf67cb91d520846aec256e - -COUNT = 75 -MD = 2cb0bdcc305ef3b3d6b7265ab62bee555c524102679da122424713a9a01d69f6 - -COUNT = 76 -MD = 5acdc323fe067a4b915ee521ac8eb81bcff4e205d53e4e7f9a69d436035cc5ad - -COUNT = 77 -MD = e634c43558d12c2a8710f2d6f10a86411cfad5a014e6b6cc159733c8ccece283 - -COUNT = 78 -MD = 4a05f4bc3fcaf50e6d0916d7e7024b0ed22e9a3c413ff4bbcc0922d2326dcf6e - -COUNT = 79 -MD = 17c9d6029e15d3fd84e6809c5ef8a279a040f49ada91601a3ba4572cef7c08bd - -COUNT = 80 -MD = 1f21e137da2427536758409f3fbf5842589c5f587f0b9d2d10430f840faaaf45 - -COUNT = 81 -MD = e3d38cff8a8d7fc00693dca5e37b03e7b10dafe4926023e26d937106ddac6a78 - -COUNT = 82 -MD = cd749eb05c67038fe837910310b3b4cdda190f6235fa970602f865bec1b61a1b - -COUNT = 83 -MD = d596ccddea01b4ae29b68b0e8a191007f0c89a1016c380b49786f2d4fac4c43d - -COUNT = 84 -MD = cbccb1ff23e33c59dc4c858093c9e215c3759acfe6bc84ff75940b59b25a4e40 - -COUNT = 85 -MD = 7214c134e9a963d6c43969d3ef44ece825dd9cf35bda5fcce92a6b9d0d3fd1b8 - -COUNT = 86 -MD = aceaf5b775779621319f9ab5d4d370a3359cd6553ed2328cdc9dbab5b68840fa - -COUNT = 87 -MD = e8123acb0a2fb62978d3811b31676975542993932108ab14d487ad7875ddef72 - -COUNT = 88 -MD = 660202a436fb05c3d59be699734e77c9750c906c8597ca213d064853ecf8c9f3 - -COUNT = 89 -MD = 4752b0a5ec3f1fb295d5bfa98fa63a0ba38a02a4c1e1f73b0c4d4e88a07e0317 - -COUNT = 90 -MD = 1e24f1467c36b051af3241fcf8c2c868b86dcb8e4669931878018e9914129b42 - -COUNT = 91 -MD = d1c3efc99d9487e147282d811ab932d4a24362d09ac909f4854e783887068891 - -COUNT = 92 -MD = 7dc455cf6f8b2042b6f0f368c44f18a080e5d3912ce3cdaf7142bd61ae50d02e - -COUNT = 93 -MD = 4b991c15789084eb1d6c1d7ce8f0928df4d3931c0c22c571f375849b9a6c2b71 - -COUNT = 94 -MD = 8b78f95a007cfb0bd054a1f5d962cd8d927665f79a5ce9e0fc31105e57b8460b - -COUNT = 95 -MD = bf305423849cf773fc54206d8ae3c000c3e8b359cba8364581d1f91b0a201032 - -COUNT = 96 -MD = 47006af96cff3843d3ed53bdedb167490d7bfefd93ae3e9ef473cb53aa840fc0 - -COUNT = 97 -MD = c53cf5026162021fd2345dbad7c53d3a3df47b5bdff8cd34a0ccfee06dbb7328 - -COUNT = 98 -MD = 3326899b575f93cdaff757f8ab7c3996a2fe930450d5002d4575f4e4cc4b4360 - -COUNT = 99 -MD = 6a912ba4188391a78e6f13d88ed2d14e13afce9db6f7dcbf4a48c24f3db02778 - diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/third_party/NIST/SHAVS/SHA256ShortMsg.rsp temporalio-1.3.0/vendor/ring-0.16.20/third_party/NIST/SHAVS/SHA256ShortMsg.rsp --- temporalio-1.3.0/vendor/ring-0.16.20/third_party/NIST/SHAVS/SHA256ShortMsg.rsp 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/third_party/NIST/SHAVS/SHA256ShortMsg.rsp 1970-01-01 00:00:00.000000000 +0000 @@ -1,267 +0,0 @@ -# CAVS 11.0 -# "SHA-256 ShortMsg" information -# SHA-256 tests are configured for BYTE oriented implementations -# Generated on Tue Mar 15 08:23:38 2011 - -[L = 32] - -Len = 0 -Msg = 00 -MD = e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 - -Len = 8 -Msg = d3 -MD = 28969cdfa74a12c82f3bad960b0b000aca2ac329deea5c2328ebc6f2ba9802c1 - -Len = 16 -Msg = 11af -MD = 5ca7133fa735326081558ac312c620eeca9970d1e70a4b95533d956f072d1f98 - -Len = 24 -Msg = b4190e -MD = dff2e73091f6c05e528896c4c831b9448653dc2ff043528f6769437bc7b975c2 - -Len = 32 -Msg = 74ba2521 -MD = b16aa56be3880d18cd41e68384cf1ec8c17680c45a02b1575dc1518923ae8b0e - -Len = 40 -Msg = c299209682 -MD = f0887fe961c9cd3beab957e8222494abb969b1ce4c6557976df8b0f6d20e9166 - -Len = 48 -Msg = e1dc724d5621 -MD = eca0a060b489636225b4fa64d267dabbe44273067ac679f20820bddc6b6a90ac - -Len = 56 -Msg = 06e076f5a442d5 -MD = 3fd877e27450e6bbd5d74bb82f9870c64c66e109418baa8e6bbcff355e287926 - -Len = 64 -Msg = 5738c929c4f4ccb6 -MD = 963bb88f27f512777aab6c8b1a02c70ec0ad651d428f870036e1917120fb48bf - -Len = 72 -Msg = 3334c58075d3f4139e -MD = 078da3d77ed43bd3037a433fd0341855023793f9afd08b4b08ea1e5597ceef20 - -Len = 80 -Msg = 74cb9381d89f5aa73368 -MD = 73d6fad1caaa75b43b21733561fd3958bdc555194a037c2addec19dc2d7a52bd - -Len = 88 -Msg = 76ed24a0f40a41221ebfcf -MD = 044cef802901932e46dc46b2545e6c99c0fc323a0ed99b081bda4216857f38ac - -Len = 96 -Msg = 9baf69cba317f422fe26a9a0 -MD = fe56287cd657e4afc50dba7a3a54c2a6324b886becdcd1fae473b769e551a09b - -Len = 104 -Msg = 68511cdb2dbbf3530d7fb61cbc -MD = af53430466715e99a602fc9f5945719b04dd24267e6a98471f7a7869bd3b4313 - -Len = 112 -Msg = af397a8b8dd73ab702ce8e53aa9f -MD = d189498a3463b18e846b8ab1b41583b0b7efc789dad8a7fb885bbf8fb5b45c5c - -Len = 120 -Msg = 294af4802e5e925eb1c6cc9c724f09 -MD = dcbaf335360de853b9cddfdafb90fa75567d0d3d58af8db9d764113aef570125 - -Len = 128 -Msg = 0a27847cdc98bd6f62220b046edd762b -MD = 80c25ec1600587e7f28b18b1b18e3cdc89928e39cab3bc25e4d4a4c139bcedc4 - -Len = 136 -Msg = 1b503fb9a73b16ada3fcf1042623ae7610 -MD = d5c30315f72ed05fe519a1bf75ab5fd0ffec5ac1acb0daf66b6b769598594509 - -Len = 144 -Msg = 59eb45bbbeb054b0b97334d53580ce03f699 -MD = 32c38c54189f2357e96bd77eb00c2b9c341ebebacc2945f97804f59a93238288 - -Len = 152 -Msg = 58e5a3259cb0b6d12c83f723379e35fd298b60 -MD = 9b5b37816de8fcdf3ec10b745428708df8f391c550ea6746b2cafe019c2b6ace - -Len = 160 -Msg = c1ef39cee58e78f6fcdc12e058b7f902acd1a93b -MD = 6dd52b0d8b48cc8146cebd0216fbf5f6ef7eeafc0ff2ff9d1422d6345555a142 - -Len = 168 -Msg = 9cab7d7dcaec98cb3ac6c64dd5d4470d0b103a810c -MD = 44d34809fc60d1fcafa7f37b794d1d3a765dd0d23194ebbe340f013f0c39b613 - -Len = 176 -Msg = ea157c02ebaf1b22de221b53f2353936d2359d1e1c97 -MD = 9df5c16a3f580406f07d96149303d8c408869b32053b726cf3defd241e484957 - -Len = 184 -Msg = da999bc1f9c7acff32828a73e672d0a492f6ee895c6867 -MD = 672b54e43f41ee77584bdf8bf854d97b6252c918f7ea2d26bc4097ea53a88f10 - -Len = 192 -Msg = 47991301156d1d977c0338efbcad41004133aefbca6bcf7e -MD = feeb4b2b59fec8fdb1e55194a493d8c871757b5723675e93d3ac034b380b7fc9 - -Len = 200 -Msg = 2e7ea84da4bc4d7cfb463e3f2c8647057afff3fbececa1d200 -MD = 76e3acbc718836f2df8ad2d0d2d76f0cfa5fea0986be918f10bcee730df441b9 - -Len = 208 -Msg = 47c770eb4549b6eff6381d62e9beb464cd98d341cc1c09981a7a -MD = 6733809c73e53666c735b3bd3daf87ebc77c72756150a616a194108d71231272 - -Len = 216 -Msg = ac4c26d8b43b8579d8f61c9807026e83e9b586e1159bd43b851937 -MD = 0e6e3c143c3a5f7f38505ed6adc9b48c18edf6dedf11635f6e8f9ac73c39fe9e - -Len = 224 -Msg = 0777fc1e1ca47304c2e265692838109e26aab9e5c4ae4e8600df4b1f -MD = ffb4fc03e054f8ecbc31470fc023bedcd4a406b9dd56c71da1b660dcc4842c65 - -Len = 232 -Msg = 1a57251c431d4e6c2e06d65246a296915071a531425ecf255989422a66 -MD = c644612cd326b38b1c6813b1daded34448805aef317c35f548dfb4a0d74b8106 - -Len = 240 -Msg = 9b245fdad9baeb890d9c0d0eff816efb4ca138610bc7d78cb1a801ed3273 -MD = c0e29eeeb0d3a7707947e623cdc7d1899adc70dd7861205ea5e5813954fb7957 - -Len = 248 -Msg = 95a765809caf30ada90ad6d61c2b4b30250df0a7ce23b7753c9187f4319ce2 -MD = a4139b74b102cf1e2fce229a6cd84c87501f50afa4c80feacf7d8cf5ed94f042 - -Len = 256 -Msg = 09fc1accc230a205e4a208e64a8f204291f581a12756392da4b8c0cf5ef02b95 -MD = 4f44c1c7fbebb6f9601829f3897bfd650c56fa07844be76489076356ac1886a4 - -Len = 264 -Msg = 0546f7b8682b5b95fd32385faf25854cb3f7b40cc8fa229fbd52b16934aab388a7 -MD = b31ad3cd02b10db282b3576c059b746fb24ca6f09fef69402dc90ece7421cbb7 - -Len = 272 -Msg = b12db4a1025529b3b7b1e45c6dbc7baa8897a0576e66f64bf3f8236113a6276ee77d -MD = 1c38bf6bbfd32292d67d1d651fd9d5b623b6ec1e854406223f51d0df46968712 - -Len = 280 -Msg = e68cb6d8c1866c0a71e7313f83dc11a5809cf5cfbeed1a587ce9c2c92e022abc1644bb -MD = c2684c0dbb85c232b6da4fb5147dd0624429ec7e657991edd95eda37a587269e - -Len = 288 -Msg = 4e3d8ac36d61d9e51480831155b253b37969fe7ef49db3b39926f3a00b69a36774366000 -MD = bf9d5e5b5393053f055b380baed7e792ae85ad37c0ada5fd4519542ccc461cf3 - -Len = 296 -Msg = 03b264be51e4b941864f9b70b4c958f5355aac294b4b87cb037f11f85f07eb57b3f0b89550 -MD = d1f8bd684001ac5a4b67bbf79f87de524d2da99ac014dec3e4187728f4557471 - -Len = 304 -Msg = d0fefd96787c65ffa7f910d6d0ada63d64d5c4679960e7f06aeb8c70dfef954f8e39efdb629b -MD = 49ba38db85c2796f85ffd57dd5ec337007414528ae33935b102d16a6b91ba6c1 - -Len = 312 -Msg = b7c79d7e5f1eeccdfedf0e7bf43e730d447e607d8d1489823d09e11201a0b1258039e7bd4875b1 -MD = 725e6f8d888ebaf908b7692259ab8839c3248edd22ca115bb13e025808654700 - -Len = 320 -Msg = 64cd363ecce05fdfda2486d011a3db95b5206a19d3054046819dd0d36783955d7e5bf8ba18bf738a -MD = 32caef024f84e97c30b4a7b9d04b678b3d8a6eb2259dff5b7f7c011f090845f8 - -Len = 328 -Msg = 6ac6c63d618eaf00d91c5e2807e83c093912b8e202f78e139703498a79c6067f54497c6127a23910a6 -MD = 4bb33e7c6916e08a9b3ed6bcef790aaaee0dcf2e7a01afb056182dea2dad7d63 - -Len = 336 -Msg = d26826db9baeaa892691b68900b96163208e806a1da077429e454fa011840951a031327e605ab82ecce2 -MD = 3ac7ac6bed82fdc8cd15b746f0ee7489158192c238f371c1883c9fe90b3e2831 - -Len = 344 -Msg = 3f7a059b65d6cb0249204aac10b9f1a4ac9e5868adebbe935a9eb5b9019e1c938bfc4e5c5378997a3947f2 -MD = bfce809534eefe871273964d32f091fe756c71a7f512ef5f2300bcd57f699e74 - -Len = 352 -Msg = 60ffcb23d6b88e485b920af81d1083f6291d06ac8ca3a965b85914bc2add40544a027fca936bbde8f359051c -MD = 1d26f3e04f89b4eaa9dbed9231bb051eef2e8311ad26fe53d0bf0b821eaf7567 - -Len = 360 -Msg = 9ecd07b684bb9e0e6692e320cec4510ca79fcdb3a2212c26d90df65db33e692d073cc174840db797504e482eef -MD = 0ffeb644a49e787ccc6970fe29705a4f4c2bfcfe7d19741c158333ff6982cc9c - -Len = 368 -Msg = 9d64de7161895884e7fa3d6e9eb996e7ebe511b01fe19cd4a6b3322e80aaf52bf6447ed1854e71001f4d54f8931d -MD = d048ee1524014adf9a56e60a388277de194c694cc787fc5a1b554ea9f07abfdf - -Len = 376 -Msg = c4ad3c5e78d917ecb0cbbcd1c481fc2aaf232f7e289779f40e504cc309662ee96fecbd20647ef00e46199fbc482f46 -MD = 50dbf40066f8d270484ee2ef6632282dfa300a85a8530eceeb0e04275e1c1efd - -Len = 384 -Msg = 4eef5107459bddf8f24fc7656fd4896da8711db50400c0164847f692b886ce8d7f4d67395090b3534efd7b0d298da34b -MD = 7c5d14ed83dab875ac25ce7feed6ef837d58e79dc601fb3c1fca48d4464e8b83 - -Len = 392 -Msg = 047d2758e7c2c9623f9bdb93b6597c5e84a0cd34e610014bcb25b49ed05c7e356e98c7a672c3dddcaeb84317ef614d342f -MD = 7d53eccd03da37bf58c1962a8f0f708a5c5c447f6a7e9e26137c169d5bdd82e4 - -Len = 400 -Msg = 3d83df37172c81afd0de115139fbf4390c22e098c5af4c5ab4852406510bc0e6cf741769f44430c5270fdae0cb849d71cbab -MD = 99dc772e91ea02d9e421d552d61901016b9fd4ad2df4a8212c1ec5ba13893ab2 - -Len = 408 -Msg = 33fd9bc17e2b271fa04c6b93c0bdeae98654a7682d31d9b4dab7e6f32cd58f2f148a68fbe7a88c5ab1d88edccddeb30ab21e5e -MD = cefdae1a3d75e792e8698d5e71f177cc761314e9ad5df9602c6e60ae65c4c267 - -Len = 416 -Msg = 77a879cfa11d7fcac7a8282cc38a43dcf37643cc909837213bd6fd95d956b219a1406cbe73c52cd56c600e55b75bc37ea69641bc -MD = c99d64fa4dadd4bc8a389531c68b4590c6df0b9099c4d583bc00889fb7b98008 - -Len = 424 -Msg = 45a3e6b86527f20b4537f5af96cfc5ad8777a2dde6cf7511886c5590ece24fc61b226739d207dabfe32ba6efd9ff4cd5db1bd5ead3 -MD = 4d12a849047c6acd4b2eee6be35fa9051b02d21d50d419543008c1d82c427072 - -Len = 432 -Msg = 25362a4b9d74bde6128c4fdc672305900947bc3ada9d9d316ebcf1667ad4363189937251f149c72e064a48608d940b7574b17fefc0df -MD = f8e4ccab6c979229f6066cc0cb0cfa81bb21447c16c68773be7e558e9f9d798d - -Len = 440 -Msg = 3ebfb06db8c38d5ba037f1363e118550aad94606e26835a01af05078533cc25f2f39573c04b632f62f68c294ab31f2a3e2a1a0d8c2be51 -MD = 6595a2ef537a69ba8583dfbf7f5bec0ab1f93ce4c8ee1916eff44a93af5749c4 - -Len = 448 -Msg = 2d52447d1244d2ebc28650e7b05654bad35b3a68eedc7f8515306b496d75f3e73385dd1b002625024b81a02f2fd6dffb6e6d561cb7d0bd7a -MD = cfb88d6faf2de3a69d36195acec2e255e2af2b7d933997f348e09f6ce5758360 - -Len = 456 -Msg = 4cace422e4a015a75492b3b3bbfbdf3758eaff4fe504b46a26c90dacc119fa9050f603d2b58b398cad6d6d9fa922a154d9e0bc4389968274b0 -MD = 4d54b2d284a6794581224e08f675541c8feab6eefa3ac1cfe5da4e03e62f72e4 - -Len = 464 -Msg = 8620b86fbcaace4ff3c2921b8466ddd7bacae07eefef693cf17762dcabb89a84010fc9a0fb76ce1c26593ad637a61253f224d1b14a05addccabe -MD = dba490256c9720c54c612a5bd1ef573cd51dc12b3e7bd8c6db2eabe0aacb846b - -Len = 472 -Msg = d1be3f13febafefc14414d9fb7f693db16dc1ae270c5b647d80da8583587c1ad8cb8cb01824324411ca5ace3ca22e179a4ff4986f3f21190f3d7f3 -MD = 02804978eba6e1de65afdbc6a6091ed6b1ecee51e8bff40646a251de6678b7ef - -Len = 480 -Msg = f499cc3f6e3cf7c312ffdfba61b1260c37129c1afb391047193367b7b2edeb579253e51d62ba6d911e7b818ccae1553f6146ea780f78e2219f629309 -MD = 0b66c8b4fefebc8dc7da0bbedc1114f228aa63c37d5c30e91ab500f3eadfcec5 - -Len = 488 -Msg = 6dd6efd6f6caa63b729aa8186e308bc1bda06307c05a2c0ae5a3684e6e460811748690dc2b58775967cfcc645fd82064b1279fdca771803db9dca0ff53 -MD = c464a7bf6d180de4f744bb2fe5dc27a3f681334ffd54a9814650e60260a478e3 - -Len = 496 -Msg = 6511a2242ddb273178e19a82c57c85cb05a6887ff2014cf1a31cb9ba5df1695aadb25c22b3c5ed51c10d047d256b8e3442842ae4e6c525f8d7a5a944af2a -MD = d6859c0b5a0b66376a24f56b2ab104286ed0078634ba19112ace0d6d60a9c1ae - -Len = 504 -Msg = e2f76e97606a872e317439f1a03fcd92e632e5bd4e7cbc4e97f1afc19a16fde92d77cbe546416b51640cddb92af996534dfd81edb17c4424cf1ac4d75aceeb -MD = 18041bd4665083001fba8c5411d2d748e8abbfdcdfd9218cb02b68a78e7d4c23 - -Len = 512 -Msg = 5a86b737eaea8ee976a0a24da63e7ed7eefad18a101c1211e2b3650c5187c2a8a650547208251f6d4237e661c7bf4c77f335390394c37fa1a9f9be836ac28509 -MD = 42e61e174fbb3897d6dd6cef3dd2802fe67b331953b06114a65c772859dfc1aa - diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/third_party/NIST/SHAVS/SHA384LongMsg.rsp temporalio-1.3.0/vendor/ring-0.16.20/third_party/NIST/SHAVS/SHA384LongMsg.rsp --- temporalio-1.3.0/vendor/ring-0.16.20/third_party/NIST/SHAVS/SHA384LongMsg.rsp 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/third_party/NIST/SHAVS/SHA384LongMsg.rsp 1970-01-01 00:00:00.000000000 +0000 @@ -1,519 +0,0 @@ -# CAVS 11.0 -# "SHA-384 LongMsg" information -# SHA-384 tests are configured for BYTE oriented implementations -# Generated on Tue Mar 15 08:23:40 2011 - -[L = 48] - -Len = 1816 -Msg = 62c6a169b9be02b3d7b471a964fc0bcc72b480d26aecb2ed460b7f50016ddaf04c51218783f3aadfdff5a04ded030d7b3fb7376b61ba30b90e2da921a4470740d63fb99fa16cc8ed81abaf8ce4016e50df81da832070372c24a80890aa3a26fa675710b8fb718266249d496f313c55d0bada101f8f56eeccee4345a8f98f60a36662cfda794900d12f9414fcbdfdeb85388a814996b47e24d5c8086e7a8edcc53d299d0d033e6bb60c58b83d6e8b57f6c258d6081dd10eb942fdf8ec157ec3e75371235a8196eb9d22b1de3a2d30c2abbe0db7650cf6c7159bacbe29b3a93c92100508 -MD = 0730e184e7795575569f87030260bb8e54498e0e5d096b18285e988d245b6f3486d1f2447d5f85bcbe59d5689fc49425 - -Len = 2608 -Msg = ffd67890ff77f344ad4f067df2f4ff1db8f541c7a2bd9ae9fabad0faebbf7d00f0a71d568c3c66ac3c57d84faa4894ab2377710e4b4c4dae0f4da1eedc8658dd0e2ee2ffac8784515206f2876eb41f98afd4547cbbc68034212bcf0c8e4a7d1d43b3ed15c621f53bd8a57cada80148ec4652119b5af3da84169d81dc69d394c8767d662044d36272b77ca04abff7b6b0cf3bd1f3919a04a5d8ebdfe7d6e844e78fd576a68d6373ffd5d384e51b5e12ec32d5bb0ac685a59f4d5d12b43b533580750345310999cfe91cf2500624fe03a65769f86a627a667b5f3b42cb01da109e124ffa48203f1f3873202d35429f32e8263eaf9bce42ef40f5cc96b591467d464d00bd743a1b0af4c1a743fbdd0846b9879e092371a5e7f6f65937f9515e23820e60b83bbff73926f0cdb9df5d02e82262cf2e8cb26af6a64c2a4d1fabecab593db510281799 -MD = 1396fea95ce0c1c1c224b50a07dd7197f1d62b993c7fe9e1cc1a56101920d4b0fecef587fbcd56b854c8c9da95132f02 - -Len = 3400 -Msg = be105a6c585a766aa1f290b632219ff864ea6674b5e3f9846d447d46813e2f92b78ea82f0b515f46511a6f161d429aeae07f8e4853b8686c191877f5a06242dd4884ccaec76e16f3cc24e6ede212c78897a1518dde07aa19b3634d4efd090a48b81a4e535359a55b57397da44a3b2dbbd37636ac1f77c875824c88bb62dc90bc517ab78579b913643d81bda11d62d469da29c50bdbb1c967d0fcafa29582db1f59c98fabff3669f8c4232d4d2332c57bf6e08613dd5db5d6e39b4a6d5fa4f35b19325c2fae79aefe36485610235007da6cc3022cec2295ac0550e18388eae156d9dba8784e2aea5ed917be53e767a26c87fcc0bfcfa870d07b43fd4cd8fbacfae1ecfaeea7f12600f6b9ef7c351d9f1b8eb048324f984e2a909d253017805c2d788edbf9807469ccd45571f5d61a05cec80a23ef349a37a28b86e2970c20fad9e7e8d201a35ebbaabd14ca249207dc6d7e2fd85c46553420b325bbe980848de57724676ed6552482f71e8473308c2ddff94aefe34c724c8c52a3388e3b541d396d6722a8e201ad3ccb9a26497a50ff0e7e81f1eb109888ceae27e1ef0537b3bd14dc8c178f0c5dc081 -MD = 39cf9206d78cfb437000b100661753181b5f262b539c208b442e7a022cd3234c58751621ff0ee9e9d3607174e36aaa88 - -Len = 4192 -Msg = b41ef4a2b31d3a47a5e8386925fb90fbe980ca2cf6ba34e814a3eca280d43b51e2a624b87e973debaeefbe0f90a3d861fc79487ab96d2bd1f0531481e0bf5c4cd422b9e05235125a969b92093fc2fc74470a3e9e382948889dce1ef8b7842c7972d9dba397c0619c4335dddf981fa33cb27ad420ddb533170559338f6eec55dfa515b088b601d1ba9f04c61a058476c2261334890fdb93850e3f7bcf6bbf7c86531c631715bd0bbb91527641ecb71c0d891b8361356110dba2c61d3f17c54c7765381ad81dbfb7a7006515dcb7813e25c5dbec2eb9105320a8384268dac56ab9c4aefd5436ce7c87d687ca73cdaa8413c09b957a02b0045c08db11d01d89815456c93612c9b10262fafdbd8f96fa95de64a3a6cc7809cb98aaf8b30146d7375105d0ea9a3c31f240541217b77a391a8e973a48ad83e24edb76d64f83bf7834b7b80a4475f916f429cc0d0074e12eba2c43a9a2a48b05382d54bf0edcee34218e57c0692a6628af264a359f4d33a21ebf4f39de39f8382f962cf918963dd2a6dfc93b8441ed2ecc3eb6d41dcad85dee4fa32f21f43244db1fe6cd9438131c6ab1f8c0bb43f5f2f27af830a1733927d1e527d6965ea1f1e6cf6a83aa4bd7d8160ccb9a36b7e53acae0f89154d1bcc86f87c37562feae06f5afa0638456f3cf51f82a0f1e2527cffc7b9f415e6bca0771405f53b05cbf4db3c570b547e1cec9c47efd699b1522792f50d387e6c9 -MD = 0f8ff0eee8ffdefb8b3151b7664ce9dcaaaf3f7af0b1e290ee49ba211b67863f63fa71202a534c0c42444a52bebf6c62 - -Len = 4984 -Msg = 52a6741b9ea02569dabf96ec0b3e2462866eea4a635bd7a42fad04f8e1cc45990f48ff2b627739634860f50ee8d7c0555bea883f197cae77b1305c50be891906164f9a474434dbf139b76f1e3e49155e2dae8b43e1a7a723ebcea31986c1b94dce82ef752c1e359c158dad22f4da4a0564849c5ea323ea2f434e825b23bd4df69eaba6bf027e6ceb44aa5625f2d387d2683263994739a023237aa01f7cc5fe8af090672dae9cab672ed6132c207cf64ea28087fbb531f188f218a66c7920f3902bfbd9c619c018963bd98c41661cbc007838b18dd65304e418f13b4b02185690b6b2a4922932db02d47a686bacfc04705320885690e602c2fdcd08c3fff34c12fb7d7199c7391d335f8250b3da65f4279c02b55ecc3412a70974b4dc58faff9f6126e8e4dc1f06b046baeb1fd89db4acb9a4dfad73835d1da4ade89ef67597be5073b07a4e2abd01efe7e2ba8eec6d8714ceaf4c6b1c0bab36414c12bfac3bf8302e726307a36baec4d4dc89e49c4741134acc429e4743da27f9873f9ce614d46a1dd5a8edd2373f2b488296c3f4696120dfe097f24c2d30df9b422e756d4ada64098250eafe4a3d8e0a7ce8113bfc6fa25490535172f237c6ef24e53387049287b92063e570cb3054e37187b8ba27f40172867fa202ba7744bfd66ebc7d6a853bf758eac571e39ee59b097c9eb91377a4016a23cd44ac77c2d1ffd1fa97a63ae989d2eb7447ba11a9faedcead7fe780f5c9e345b980f1bfa6ee4814d41cdd39f7383571d93a771008c8c585cb56cc975b919aef50feb0d75ade594131563a0bcfcc2981dc9443246acc38aae284ea453e233728790512484469d95ffb8be237d70d5825659b45d337cfef43d95268 -MD = 45d0bc363c4e0d5c1993570d7366847aae64ead4138d93acd843f28d3f719b02871736ba4905532e27f4bc8b5c2ced85 - -Len = 5776 -Msg = cc990092fb16b6311fe4d66dd5c472215e807f82e71d34f60e58b32aa351eb5eab81bd04abf15d8a23aefc745878a4ad56ba631f36bfab819d22f9708586b5c240885917b9f2d6b0fe313485fb0a78918888ca71a739d72d069a7556cccf855192971ef2ae80e84db857c5c847e3b775fcd3fe9fc2f480a353a76e01ff9325b3a99752be12025a065a07f966c36b2900b98145d20f586e8b8c332e9ca6395b918d6e3ea26be2f585ea291687f80a95dbc77be83217ce688cb725fb4d492bf09347062ac74387817273a465526c29c4ae2eaa2ee661bc384ede651e3c71d0ac60dd455e542159c674fa622ef0a92e7f20f6f56117758ba47a08dadf93a59056a15a1521728ec08b34894ab98937838cd92843c7ecdca475b83e6e85776ed3b8fdc35dbd4911249a5a27444d449c8eb382cc7eaa8e1d6d72af87085a125301981d2205780032edb98ddd38334962b9bec3e88d5024c0506508eb90a48cdc82bfa87ef49bc07983b175b20eb4c1106b7343865802d74eb4146a72efac0d91bff547e0146db06f4f49bbaeae16d42f0b9cabadc707cf4e01497e250bbabcfb1e01a24f4c38f99bb74b07d901a1a94603ffa266c2a933489ecaec0bcd15c1a108ad60d38442c285247d003ced9f69ddba65d1b8312e2bc4f55f5b2c1d07450be6bf2a74a4d534b6ffa94fde5b563b7d9895dfabfcdfe14b6dd27391e4d670c21e00a73b953777b5ae959cc7340f48ac055975470b047a646eeadd4108cb694d1a38802f3db0b20a9b0a8e005e12b7f569773b9546e52198606e4144732e5934402f5c59858a0d3e2ccfcd90c3a7b1dd2cb8d89c96c9fc6eac2746a30b476700faace4bf550bb1d8cbae027f4a165eeeb6e4f564e1fa336eb8dd9565ba5dbc38af79c06b967dc660df6dd5d6daa6e5af70c339f611beef20ed57d69267ba7f64c65c97652e26735fd0d5ed9c5da16fa8c01c4d590c5e580db35fb033faa4d90da91e11b3074fe15c05aef3d9ba4d23620fb9d895bc -MD = 2d24f6afeef2af38849f29ebeae7012717d50f5a31561ebb9e5760b83766030d1d2394c8eb71e030226ecf0159efda87 - -Len = 6568 -Msg = 546a582d46de5b45d3f71166ef69aa0704848c0a3963b194f4674a1d9de4a9c3a6195de4c8669feb8fb9ed6a184af46a1a88b3ff2352de1f246b80b33028e5ef816cb7dfbcd667437539ce9df64d15883ca4d24b43df73ae8421e00dbbc45caaed4bac47aa987cf59060fe2710dbd40a75c0301921703aec1a71b250c61fd69df39e86441a13a6a8e514c42fee5dfa98cac4168f466ff97ef0443da7daa11b709a4d8bfd95afac047e3e67dd19394fd94598ccd53942790f0e80ca387eb2f2caeb41049ba2d458b362c7305a18d99b76ed249a14825382457a0fa12b3aba2453ec603845caea705a999567ce73a3a616ca51c874aa08dcc83ed70aa996217ab4a79371249459bda42c925461b3013862e5059d1c38cb4e4162c24dda1b4fb99524c3f560888a073622a43e395f5a180245296235b403a158ecb7b1e550adac9d6ad60e202ee316bb83b56f81ff150f9df2a660e6a7179db4e69d7ff2bda11a7581b6018c0fcdb1d957ac2d5f1c9ce5dbf562dc5898710afe575e002beb94cac5714919ceb2b1a238a771c1fb3d566266554721b20f78b0dd48e179b661ef853442799d0b9ff5af817aec737eeaab4de31a3c761d949457fac00e35bba718136afd2cd46e5f03a15cd9058a10ab0370fd4d2822c1b02dc6fcc7cd7b6346793c10aa4c071c79413f70cba450d809c6915af5f56ec5eaabc68c650692d5c578c8ce4fc07f407519536658b10bff8b5c79a21a8aa252cb771f52a3a1c33aac7f7e4bf6708100dcf2a3e5881404acba2ef07ec4cf068fdaf799f5888656ba84f52730a64458843533f99664b583081ca2be96fcace1a59f94fb1e1d9e937cd4428b2468244bf508461b21f37ccf3b3b21aa91c9097dbba2b60f7469cfc1a924cd72d043f8a17bde92d12d3e52326c9f147d1734ce20fa6cc69ba074022a68fd00a4db3fa8a33d3d7fe5624b1df2c4cee1ffd244e3138a842a6849462014e2e542e8ee641c9964b0751d6a24c7586a52f2f86701309e92724c3e18e80fc83f66fc08b1bb3dcb17bcdc43ead136ac86b3ad3081739e083abf93e5b561b98ea60894cacb4bf1807feb1c1d8d58543642777c6fc6a3139bacf26624c7b904ad3f5273f7e51c2101c4c49d74f8c3073dc428c67cde98789d0d93 -MD = 8103d79f14895bd39e568b4c8cec9a26f03966763c3b2a65174a5d2829ecae097a7c6971dfe182fd2a7a9ea6e329b6fa - -Len = 7360 -Msg = b8727e619a77b72152a46d80efe1c1ad34f131b83e8f614967bd1b926b599482c9f1f13b6cd809c78b796d06ceeca6ebb2c7bde82e3701a7974f04fbc19fe7166709d7fcccd0d838a3f2c1cd2cb8886fa18bc0f3d00960050958c6193abafca45962398b0287abdb62b673bc536cf2a0c8e443c06c2e08c986816ad220d25b9268a51ed056240a1a8f6e8bba8a3169e6f17b4d374acd815dd672f710b90e8d495c7a8fb310cf7d5cf4c10fb1182f77a9e2f7e640b10f5127c1d275ba4f971932fd88931c77b28d0a57580988468da351640216c3eb1c02910f49edb8289587b4127832f3d4f2c18a81da80275c7475463f41e6a83e1b1c01878166f28c2f603665f174206fbaa2453af07d76a20b76f13b5e5dd7f33425e1f21fe84fc58d2a22bc9c628b9030b7a34942075c5f7b2db8200184395191a79818ce7bba1ad870dfe021031d7f7c880d787726c4ddeb2304b5d161b4a257298ec1342818d238b7d5992760bc83c79de98d38e2936284de3ec377ff312cb1342bb5f9f65236d4896cae567f51e6397fa0512c44b2376de8cc129a639939c54fd7bbc6ee508ed56d0ce9586ac5eef9b59b8cfc5309a4cfc9186ae397d20fbb02fa9d4316fa2262ec1d10d229fee430c741064f1880f0d2078893faa2c6f6bcd5fc2117783839a48d07ec6fc2e610053ef986ce9900659d2c8654868c5b38f0514510ea1cf31cc3d83245d43f64b9a1a02dd621e06f4959c07977305d7b1c7efd3d3166081114e65507e3aca75f282b7844bceff5b7e52d49c9c29f1e0de98e614d4e31467c67358dec8d9d03c1a6cc4ba601e0debe814251ddfe7bd7f9e84a06db2df3de1a5dd9074a0d4f5a7179aca3ba6d9da56e65c05f1ff36e8e2761d873519755d6d540fa4b8a296cb457e9f207eac7ce52add8cefcf6681e4d7f9b60301554fe389456bfe212aa991a5b40c7009ed91beb652394aeca26331be8e00bc6912c980c3fe951534c57809265c452153c692a7a7d8f3b0004f656014d7600bc2be7c858bd3fd8269efac9275dbfbcce2d40a606dd62eb770a9e2f0593a6689a4d4c3826f8a07be472591cde2b772cb3d92635986de4cb9d45e66532a3b86be95e25907dd75662142f3e1fc1b735cb4da8e27f37155f04f91d98a18d65f43030c638776642a8b63e3d6f7dd7e940c023033e2debbd19bd13fb7a8a20c1a2e0f7ec4e96e721dd9fea04b4dc28aae234bd5000e7bc4d5b1f744556c9f2a009a2c73a2e950b5c3e44a1ecd7e5bde0614fa4f8f154b3ad6d52a365f2050be8729f2617 -MD = 2ac3ab5299ffbac1c27300859a92a69a80f510a1f28b7054f131b43af74a0df5e298a9eab77e49ca81a578c309f5aec4 - -Len = 8152 -Msg = f6b1cf75b5cfa4ab323cf04ff13b7a591b23d06ed25f3c04c1baf4c8f7da913cf509c2a5053c4224ce4d0723268cbdf2277672b285c493731ea81799d353fa8497baed70c59a4c99b7b950a39470863a69667ff67c9ec981ddb41ffb3d63dd9d034bb79d9df1a95214083199e4efbd770a7a5f005ef5c877236674b6dd1322d0624487f6344a43970ec014cbbd114af2313b7b98d4d2779d1b477e925a6ab165dc2ec74133ac01b0cd6b6003c8df15f3072f3988863cbe3aeadea6575d7072a49890de474120cbe478907d07ad6006c2b4e002971b3b8597bbb352cc8d2e4ed5bff234d007ad897d38b8d39f139c06a65fd63f8c3cd7b4fdb44febba93ab2b3f78dc31a42d5b23c1346aca95a29cfbe931975630901934b2fd39dae916f0f32becd73d8a5a3282f9952ecab00367cfd151adb14bc008ebfebff98621bf038ce1436ac04b363b8c6c828c3bb7de0568a7e7a0b6a573acc22b2218562a36eee0a9a41e22af6a7d2a64240d8573da7fb0b21df6cf05520ea1804d1db4cb22b9d5cb377acb7e9e004527a23810aca0dc8d3c1939633404357144699007ce2b6a558e2606238079cdc3fe25964429d824e98b03f0d9fb322918c09dfab6f9fa0b473c964a937da4eb8e31d5ad8ab42960abe804a49b2084f3803c12e22b1537a3921bb1cf813cc7628c08d90848133b97bb9b44dc106ba19a8fffefd0cde98a3b20749f1c5686893ba7cb5a2ce70fb7d101ecea20a0a632262f535d4c043f99dad88e88b97b23927dc5c17fa3d070451664231ef8b397dea0477e84df38dd0f88a2b3932f56db8b30d03371f46afe8c6fcf870aedb1084e0fbfc98b10d18c924d6629e80551761c5daf6957a71c8135e32761d38603bf2a7b7f7c9b683714ca320c39b0c3d3bbec0b4aab5a4450c0e77b55f9a44c0f8419ed6edfdb6ed33d613e7d2b13f24373a4428941a2546d844b3e4197a3c63e21c36b763a74aa0bcffc7a9f4738190b66eb0a5472565fdb950934d383f87cf85cd1007ed48da4489146ec5bd548c0925c6a6c93889feb01bbc865f404ccf6a6ffebb16ff64fe5f34ce49e9a1c6a6f401dc96f2ec9a48249be30da8a6447bdaed0b8882fe8e2f472c881984265c7af7d70af1c0d7e8eab1a65ea9a7ee990587a98e18ca7f26d592fcdc3e03cf88607b11fc47919ee84efdc799eadb9dcd04f701e0dc5bf5c189d90235280711dd10044f0b1913863afd4f8c3f31c22852e2bfa2ce53c606d0d47ff91d780c81ccd209fac1e69532336e4d40892eea02bd3727f8811f8706e71dfe3e1fae6283ca4f2281bb20b537742a7d913232b1d17e6af67fb3801d8a76feda4d962bc7bc67efb4804167e1ea7fba46fab4ddb80929067194d026081602cfaaa42b80aa80282c56730f2ca9efb8863ff97b807b1e2f924ff46191c52e1d38d5c -MD = 70a597d1f470d69d7b7d495531c3182704dd60db5c73429fd7108c8ee22d86ed5822adfe6352f28f93023f46cc8d60bb - -Len = 8944 -Msg = 102401c84a716ae72579c6ae79c359ea309ffd95abffae4c61884c03c9e99df77b6c92e492cacb7854445c0815efd283585071a43828c06b069148cd344a98ab71508c0116aecf60c1959f9e3fafd0ccb0b11468e53079d40db5330791139c833cf879869fc37f85b49516d6c1ab5cad7feb6d497cbce26fbe1b9718a9ecb267238de0ddf5b1e2d0746c4919628a7d0e0f2504b0c377012560ecfb68447be03f6d374a6de02100294b41c0d0e9f53cd7a68862038406e0dc3d4fe85f2a6b30f3631d3e9e28bbe2797f3c04611f939ff08d3c0eab8514877d9b6de5652262aa6b4d6844d894268fa659879c36cc0db1410c6890118f47fcf1c36e7ae2f508558f733fe483ed0b0f9a214710b5b80a77b26a34719c6947491efd792f3e6b0739481ccba707fb116b3b1fa7e948aa33fb2cf1c938b3ddbd76ee91b68de14c045e7c913414cd86e1aa739bcdae566b304495e74f6dc0b1518948c64e1b3360aacd141ba1b43b5622d429dce1e747c4a85ad795ed992aaeaa8c13e569619d6f9e8df9003a0dba327df2452b0c1c827a4346d843cc43599c718639362ee885408ba6118829a9b3e49a0baed075d67158aa0f823914f3b5434d80a101c637549c172146fd93108c3220274e13469c7b2585bdbbbeec31a66ae781338e59d7734bea057fa5a3c8afe5b84e0c3ba4f708a87b596d1b7c8694dbe691d7240e4e4815ad5aa4ca7e5b82c50989d092b96e80aa35e97f99ed79e75cf3b8750d0d263dc208289cb24f516f99bcdf825ead894cf35b78d97e679307b6b6fff58f7fe6b919a27851a53c30dc2b78590be8a8d0d24b940b6312115a5cb1d66d3ff38c1724e32451aaed6d823341e6fe5178d1cc7b7a88ac059f14584f14fc0b3c815b40e5e835bc8fd10bcedba4add63d565004af47e062a76b981546a9cfe0d28015e966f07ec0e8983e9d3c1c76e9b7c94e00d77c443631bfc418aa36f8f4ea3ae19b0ec3a7659d8b2d76be70e940a81af34959df5b2e8be3c0e9e4841e4f6df5e8dc452857b397f201e1c96aade2f69266669f39ce559d1fb5105a5beafa41fa513773e936b3bc15e166c5d06bd78b77d0df0f5144b050bbcb15768204fc5091453100cced6cf53bf68e1a6bca284d11583d13f166498afe29819fc3135d8001ec54559a24e62bad68e0300373dc26aa270712dfdc273432f8dc3ce4bf25bb946d27d81a822a44b45ee570600dfbfd8864c574e44d52379d5facb7aeb25de890f132f216b03f2a9600234049418eb9f43800a0c862d37987877b77e9910def3e9ffe0b54562dc39b77240987b79b4436cb3e0053c2b1e43a97d0e45d073bb8e6a0128c9e1bfdf90deb7034e3162d8596440afb4d15f45ffdb83466d1baf12ad01bf6dbbaa7b6b232838d27220749645ccbe9f97d05a5d117122e650f52362f4339336270a360d85468054c0f31f9c9cf8a6562ac38ca24d1cc4649dd7813ae892250888ab70452b9c2600a713d449c38a6059fa2566e3f730f047a04d48e90e8fdd5b4ce8aa908a9b824c80fd233c5df4a51162708960a4502f1614c0db2bba9f24b5006c5 -MD = 81a031db32d465202a2aba19ae6072148f3fcf6fe33fc8a843c0691cf845f9cb7bbeaaaa04ce2f1476bece682632e20f - -Len = 9736 -Msg = 98afae971df98e02fc3f503d0b12176c2ed77f4e7962de7194c7caa2646cdba8e763b13260f7390db5852d9a158eda80dd09269ebdfed1441750fba2a7dbe78069befe30b7fa17c1b23df576e4f8117624b79ac5b9b2bb73c29f1c14d5cbab70e6699c7b6a2aae87bd0eb1b8c17945b8c989e4adb5a723685e5c34df3466b0de250c93f9c1ae89c59ca06848f439fdad94260b3cf804918ab22f4ced0dd47d33ef4eec9404af2de4189c220ec55fc1bd4f37175cccf28d4188be6b25a73d9ad80cd7ae327a54244df9aae7f17c131950c06311f47799a0f5a6b4996f4cc890334450e1bd6cc6f5670771c0dc607f8eceb15300ec4220510ed5b7deb3429de6ae5f618e1c222c28990a9ab4b4bac8a7a0e8afec2c75b029f4dd6f43d9d2e524b024b1bc37e4af454dc9cccc62d219ed2c2d1ede9b5870af108686cfca44c8d3a05ce973f6fa77d5ea0db00fcef098e7db4a48dc2333896bc898a18b6ce06d7ae8cfb0bb41abab60d89eee85e05c6d1d1505d6f1ab4d22e585da6b7da8eefda1ef45af9d0041746c7e442d36815dc117432870221cef64a6b01589af67b59fd01d868e201b02f98346c7152b973dbc5ecb79bd795c617735af11a6298f7e7c90da59f44d7a37632c97ee4f6b0b42857917c166fd54eb821aec9668f10991bb688e88892a0627d9f0d98283fec6b545f08dc712b6ecd5addecd6c7711be3686e1a1d9f6c2a51c8455754c58edafde234c97556aad0d662208bc5a7c9195b502817c15e31a405c8be5d111773fad0448139c3116e99de70620202a1f77755559d38504f73cc0301728569c88fcaa70dbd00424bd7285a084ae61a207cd485fb35c256ddb2f0be050a56cb4322c8d6b050836f60751aed9c13be78bdd9bf51b37a6c41937fb0bb45de47c201dd83e3bee459c6f9e8dffdae84e19ac48e764d10e38cbd1b2a9a6f4676deca9f208a428bd0e9d57272e5fea1f7061cff1bb7dc95f9aa05bf43fc6e795c9261759c2a97c9beca1754d3db8538e2826ba7f1e284a5355ad7fa6c852d6107f9032f910347daf661092b5c1f15b5ffed1369b194d9e12f0590770493209ff1794c17bf92e75220453760ac2f24bb77ac80bedb2d40bc3f30bb9f9cc4ec88b19998e86867daa1b4ed0e9f249a36bc12574011cf3a5da8fe62d5fea588e5bdc0e075fc3bd0a65c3cdf0b3155cec02a2863de0d1e4a8539d5226bfeaf6da09197e45fddaa8bded41081b9b1d06b55a85268c6fb38cc6bd16bf5ea2a2ad1a1c6befbd30724f7e8cbe87ba6baf4ce6b9908bc7776bf3e56221b33dcfb98536daf9ebd6bf33b8368862d333e976386768eb3f58c0a021ee88e7b82b10d886168cecf9f874c7edcb2a5473f0de17d120afbfcaa512fb1fca788f55902ba7b9a2796ba28b15d3f627babdef57113d1ff9d534b2183524f45f7a4213d4e9cd25c3eb9f6cf76b02d93080c4d0d24c8e2bdb24718117f0c2a897d528785f12f3d25f28afe1a53ef9a0d0c3929dc855b2fcace29fbe0c0d7d4459d3680e996ec0c95f79c489fb566353eecd4edea1f5529a5658e5f25e52ffce8cba2b5debc4dd11ac2606eb627ae6f872e4211cc4f4160ebfce6ca47588ed511ad398ecbbdef1b22c779c8f43742a99435133dd9b1aa55fd18b5b5cb977f2d2ea66d8437282a5b5c9b4affd040ad83d4b5cabac8d2fa89572d9dba392e6b45be4bb12ea7979 -MD = b31950d784b30bb1743918b99fbd6693b30fde41b0b9c2e154425f048827a161dbd4f3b163b5ea8b8d91bcdacf22e84f - -Len = 10528 -Msg = af4ae11114072bf854a76a1b8b673bb7cc9ee8fa66f0d4cd65c51af15cf9714d62d653865b3f5ed1792dfa0502603cf5534e0afc256080d90f5d93bd4c26f4a3bfa537e0340035fbe912afbe4d1b348d07b644f73a0cb58b074856ed544bd329cca0d84627b2791fac3cd26ef402ea2af0bfde132e5e3b8b576caba7fdced48693af7de1bdbdf2e4cb95aa3c7f7b2872174f1f7787bcd98007b3d913cd18c0621cbb6dd97d8968f34d04815177f0b40d834f504cd09059121d042a5b4e915e676daaf155f07ea3f33a709dd564c857a43ca8b9b98e4181eaa346e4a408a1783b9066517d9c056a8d9ac347efcc6bd9df4b40a2e74b371ab0a063501982b1d4868dd5d57a0b84876976e4c7c739410265b70153fd8edaeb0c1d42b6df44273cf16ae1c574c565c02ed5bb658632b29adf88d21324e092bea421cb5e21d66d752331716892500ede84c0306954402668f4c79a2c84c8c75923b4e68f05c1e94ac5ea6c07fd36e9a9153e2b1a58e905354d7b43e444cee1852fde7b93b38c05827f9bbceaddff5ce8865794c2bbb8b7c991acb4848d7a480a70a872b054bf28e4f84e48595931d165821353a7a432a4ec6962d553865564b09019b32f10e2b93ad90af89c9956afe6af7b50113ce134667da68e9b58e69e3f343a27580e7e224ac9d8b4fac6f55e34b596744aab4cd0fe747fc7a22ab55c7e0611b472771acadd71bf64bd089746173d6da59918fbde7ef7f668b2254b0736aea943c7723f19ba79c7f02b86c3cf56ef06cc45ab77c8acad125911702f082fd407bd9d287477ab88f8408d690161bb726bd2978e47f4503fdb820735e9c5311f35083dc1414c76465b3d2ad8d9640c6fa49dd7e6f3cc345459ccde9902a804373a0eef642e00e45df7cd4cfcd440128db7174dde04b61f95951ddcc601186fc51eb5fa39c4fbbd72d4d939fd795d9575ae27409b011cd8a9965f4be46e7d3c71e9e7a8698aa6c930fb4a3a0251235dce90b4fa487265283a6478711ad23e31e2a48b3f1c0967cf3c73069733e3fb314166a8c10bdff9d7ed08529791b4c517c157890879c7a7994144f798b9b74bda7637eade0cd140ad6c89d304719c79b5b508c94ba94ecfede5770485bc557c21140b629974d0a2725fefe502e112c2d567c13250d4264594d01314a56346f7ccc4ebf8396b6287ed6d436fd7099f083d7e89ae5e20d57356ab201141d71123a32ddd9408181157e73f8c58cc12cab3b6a36925beb8e5bffa1ea7e2a1403e6770f8ec1e4ca4647a287dd28a29241c2b087e677db9c2de934ad0ae6f0dc5552df9cc1d7e4e37e35878ce1dec36661cd9fbb68e9f956746560c6a40a0cd8edfdc07527a9c56f717599fda76663b01522357f4e3739acea7700993625d28c464db62310a60ab0f87e6644ae4e07f1d4672e3df70e11220884909f41e8e688f6a94d212d5b397a5bc6590c670424be0812f68203cd243847249d4357b1bd3167b6e1f9de47b60e23c40ebf52174e7758ac0ae5e4f2c7623ecd831fd82ecb2821ed110793ea24fed91dd3d80ff5f9b02e98f7d42b2d9f4247e5ee9f439e94cfadc256f4feb0eacef42a64e0e12e9afb027029d746cbf02b0b043c4c3aafbeba73bd302c6f4a9bf0fd801e64863fb6aa6cb83d59b85c8ebef0bef8a12dd08d5b1c54192876059cf76da58ccd6f97e150d5d79ef5f06dbf50816ca0388d8f9533f02d8e6393708264bd012c95fdc58f80c654cb16af6df6a24593df7cea5b7ad797900c885829d0ab74397a58b15735bcc6c63e4615dbe906a5dae2d8c4c292b88b222fe134800c4e2ba4f2804abb58674f92850ef435fb003a9866e69d3361594 -MD = e35b64497f34c095a1135e65b6d417d69e8587fcb53cd700d10cb8a1c0ffdd97144b6cd1221b25169ad42d1826d10bac - -Len = 11320 -Msg = 542c8de3e29172313cf43085df75b41fd77a1eb8c9a4da1637020cdf008432ab26b2055cd49d9fb2a016e31a0d1f1ac7549fda04645a2cc9271fed8c07437559b14f772518f62860bd4aa4c92f2f8d86cd0ff574d3cf7ebc9502bfa7055deab37b6bace6b68255621ef6393a4b8c5684cb3237af20ed181709124ad703b9d9de0e6f6d46b42b6ee148846b146c20bde8d570675e539a41030bb756c5073f8a05f2c180ed1cd8ba04c55a02ff97d209db74314f2872c042a82459aa181cd7444eadcbad84f67182f41be2c6a5d68a84842fddb5b68746632ddb600f79476951e1c9f4beb348dd0ed8d5827fab3030740c8edc62af9914ecbab9354d9092ddf7e7cea379211c06a6d978a4f4bcaead229a19961ebcb1122579453e2c04041b7f884242a87779d3921f8eafee7e56e7d6575974b085d628569007e4747ea50c31ebaf38115c682c19d19f0b359932c7d86ad5dce2b1103ec627878feca57e9654399ced7d79eff98517311f91b64a356ffc15377ae9673cbe674ea85d2296a2329992c9b37619221c1ace55ca7da41ae435a2ee41d4e40a8677e3958f9cf619113418347dfaeb902702fd14a7954a5c7f3c0367ff1b8e906680cec04abca4e13a32b696a1ad6f29edf747c5f1a744e5883ac00c7c656eb7a6aa988f562aaae4f5baf457e838acd6b82032ce705a989b475662447f5b8a658d1cc86c7a8d100889f45bdf1a43aa80cea54898ec57506804b97076d2a5ec8364ffe6be7f8ddc3740097296ff75720d78af118b2d457433068a720c3bea9cfa737a7aed2ed318586021c1e55e770b67fe66140ffacd0ae496f2f16d83d2a0b002b60d614d07cb533263d13201f07d74a8f1d98d1d971c62fc1974017207028f59db2681a4d1fe10fef829e6ae89d11ebe78e86b5c4ab19780268330cf2eca7ec0104eb7fdd7b8760c08526a2eea0e4b8725ca13808ed26a6a42a66264f2fe647e7d0c6b1ec4016fa3bad22549ba3ce54c1e06eb510d86c3019466fff7f8a82bdc4be803d03ee1e30c36337ec6a264d3558b245d966cd58a8e454a6f51ebcfba22a26ae8dbed61b890a5fcdf6f498cfdea95acd01956c7a7597cdb1a3a717cf998a91b82077b88d7752fb6af0a58bf4b536427aca0716503aa629f697932b6d0858982391c8d5f2803fbe855607602a5d71f1d58f465b684c91f20c2d8d8852733692876e1ceec9384321a3b394c5ff3c0ee143edddbc213fddae68e1d08f1e6e872939f1fe339013efbd5c85d81dd1d54fa96c5227b929990bb7736116c03f5edcc4d1e9e774e587a7f9f6493be840bdc6b2a558dec2dfcc8eb5d207cacc23c8a9ede592630318280e50377a4ab5da69f695956e4d79b26ee9220b6267037a40610ccba7fb6ec659856866959ef6fd4e71ba930f0e3e5fd49d7465fd65f6813ab4ca1a770b287eb0afab2a37833c37efaa9a44c79b9126b23e3598256215f72bf77e48ac3cc08fb1df80e8bc91e5f8d213cd21047002a57c2dee1896c5f24aa8bbc1eca3eab797c1b79228a16594de7a4fcbae5216136a86fef64dbe1c1bda15741d6cfaaf8e1584aa47709258b9576cb10e434d0843d48723e6ce07cee34416b2e9401ce5a4976f3a2946ebf5d3d20dea0d8631d10471e13f48000078f91710eace1c8747ab8be5d9a0122ac774fcf24d61fdccdae5d129a3929a3484bda1889e3438c62ff3618d2b5478eb480d26ae6d84005ab05850c4e34ed3109cb192024fa44b56192cc6c981bed199f21cfd96ccec3487ebec9f4790e571210b6557027196cab39db80a2f8f37b2a34014d04fee1310c0d8031b261eeecae25b597f0da6a42d6b2815ca23a657a2b3cc954d3e43810b821f4c42f4efd366e1270e68885124e9f942d6854a69b71838020ed2e65fdebb682c18a518a63bcb89e8e4a206f3c186ca686aba184bae89ac5af1efdcb55476df8908b015c4706f590b8cba0e10e29a6b1352d6f1bed67d8d61df1285c -MD = 5a39dfdea913fcbcc5549e23b310c7ad76f392fdbea1ac188d529062b9961a2e32cef378f951c4d29eac03b3fed8e662 - -Len = 12112 -Msg = ed665d3f73bfd785c59814b4ca1737b2e0eac248b7cf08cc665ae6fdb8f3ae2ec71e64a7cdff2d48361d046ffa66af1c2973f153c80e02c2dbf13ca4c3d117e5ca9b5787fdfe84443a299b7589d60332af87c2bb010ff11677556dfa0155d0ec1e67a0a8aac4c6c2f746418d206f1b3c9aad9c470cdcbf11610de2c71b86c18bea0aa5d27d5ad90a98fb5e81673adf82126ee7c1917d52f8c2a102d3b86cd30a560ad0cc1dc7a76443d05a17053e384b3e500cef37f89416c19a34e58110ecb08cf1886034131618214e9d18a3830ce146dd7199a7576bb2877fe2c71e79f5c6b14634546747106d59fc8f4be812458a539d7f8989a2c1133bd8733f36afd794f0923e7160697cac1363997a7df2c98f8d179e8684df7d82062e4f1671bb78626f5c0d7fc784411e7909216b092b82381bd33757401887471007de1479a4c278562c0946439d4908b07891e735c656cc2559b0c56654c7aa80ee8700f3729c1dce8a9a8d7dbe7bb5e3384fb6a9ca2f95d53273989e9c25f37e68b5a38a2eed9bffff281e1deebf6c38cfc5a00c3ff4d951e5e6988ff7896934ffcdc6e4df9f3810121bbfca36fd74d7c7596d062e8de1c1fa738ce26ddb55c83a382fa98d993d294cdb392c9c1d16e9a875e4419ee1f54ef9813e3e0603ff62a15ea78240c3f27434d054ec2b089a96f880cf6297da5c206b77744ccbe9af2bbda7f51701059e165263d7b2e8a4480541e2f414215f605ed8bff7b4c375ad4a157ce30fd7478a3a2efa8c25ddda675f0a021bfd45594730c6c08f1df69040e832433712cb71ff0651ff39ee119341cbdc4a0ec50aae5abfbfe2032f6d20b22d9a66bacae46b43a242d8a7b58cb51c723e2194157947e1334a8d1d932f0e4940d74b34dc2a1d9e3789ef9e215729417cb8ef7495980c24b4f029a3f144434e4a715c6df3a5705aedafaae6da79d8f810d21d77ec71e56a68371e5ef0b5a60872eeff2cb55e4abeeb3b734689faa98956151165c20cbbfd7aaad51639891ec1e1d89e3bca5c95115ab5b187d6e3833b77083406c16f742310ceb49374c895bfbeb6a060dba7379c61a5cb71683b50579b34ee218fa4fa25532d249c487bf24c32116d6490481aa729942bcce80af725e91fa880d4b3334b6a4e8efb5da91dae65706d0e90462479da0a3860fd5860ed8a53c8e939a209dc7db958765c5afd2d7e5b082884a93f5c9b8d5af5502e73f7a658b825657b6322b6f7ecd6ed967c13a65aa678137a529694a7f9528893188a64b4defc024628633b8fb0e2b76681a604f6afc8e6c04470eedf7d404e9037f0ecf1a435b50942e834090e6463d1f530c1b68bdea483ff32d1bd4f874a2cb86f6796719a28ce98f9caee6d2298e0bef70423a282f6cb6a2464cad5ef236f8350fd2cacf1039c12dd24c434e6ff9ac544f6c35c7e84a16d8ed08d7840826180dbd53abf03ed7c98de6c16cd764007f25ebe212299f50cf0b73c8fa0410e0b9857184811988f741242c7699f9a022f2e8f86c25a9af215dbe8d156b6bb7074b10eeddf0a78918f68525f47121ced1b5f1d73306e4a22c31669b76c20764fa4b4467d86126a9ad283565c378ec3aad26e51aff2c4712e1e8a821559483a54a48a48efc5913752474996e6c27b56e15c44736290c6d7bd2e1d7b13a394cf277b195c6c24efa763f5a359236e419e39c2c7cbb392da4378fcb89bdbd46efc6f314bc91c2c948272e479e93ec648635b0be1a0cb816a7e068f442b92733d8ad4cf07d92664e9902a1db48c5d4ff96cef3f793cd2e5dd5111efa77363096942005c34d2b354549930a73a8ba993ba839c6777e5ef449b813e25cbbb741d5ae998e0bcfdea853e642f8af52e4919f46e0a89c2e44a280cd93738964bed37774a476486a2f47e10bacdcfccbc656910f6e2b044810c189820a430f26af7e02a2cb3ee7a09f8c73063b27da67f270c74e3cce1e4035d9da71d2c16c662ba9edb56848980791fe90827879c6dbdb5898afd6f268ab4643ea19978f1fa795dfcf091633a803c916bfecef43508bf3768b90c74861eda4a83ee5c30c975f8087fd2a5f80b629875d57c1fa04e5fcdd63268d7820a89be36f4f62efba62127e5b1e95aea030ed6f3b0 -MD = c4d5e18acd6e425d4a1f03c23d7a48ccf313c4f987b9a1f4b4e3688c5ee4d7a97a3dd31fca20e8cf159e1feeb0df4e65 - -Len = 12904 -Msg = 8c9eabe871c6e9511194b48ebf9e9b031d8df7b9e1cecbb2d88bef792bda6efce1342c9ea528cc89c950d0418c85027f984f133ccf9f830c47c1c0ad938c92e045dcb677b042cab0f3f969c1331c96b427175e75da5cb92aac57b2c29aa3c7d1c07e939b1c7aaa6e9576c5363ccd1f4bd1cd1e8d896b36b30e340be0c887d5775b020931713a366db9af2cc730ff64eb9f599cac6435c2507642132ea4a0847c1d50616235e93452668ce89c95192e3d97a320f8f42224a9eb6814d5b6579c850f50e355f2ee6dc8a5f540def68545e9c494f29cc09b2665758e54fd8612e43d37ebd6332fb3a9757dd27bb5d8aa71962b1259be51068e2c1c9c1ccc9d3a25499f078423759faf01f60be248c5f07aecd6069f872dcc25a8e97bb46d823827544f8d334e4b1a49151888bdc044bf2795cc590a1ede56b37fe3116406bd72b2044d662cdb398c3d59ec325444de7f413615f1e3abec0b0059134774c0d7528e01a378b7f3c75d547479efeefd1998907abab87158dd52d3df7f062bc2573f82f459ad1bbe7ef6560fc7a8d4138073dc06c295fe4b3b95f6b83134d335c5a1588575eca263e5bd0bd1df464fad9876ed85356fd0ac8d3b2f8d31bab240aadfd65b011c920b851b3b63c8afa5f3eb0a8b9d1b3030a45cac47068581100c8c63c51f042734dde479ad6c8acd1e0e00987df67dbf665b2f4f06ca377037c0f694ec7887f4d0028c3d2a952e8604265f868c396204baf88e8e33824f6e6e856dda150f916baea105d17a86bbc49d62913d800ed3e774a301d098d5d365fc837b9d068b2a7415e3d59b65e6396e33eb1d26211cd750db86117efb6ccd3c2ae1a74588965af74ff08605b35db16c0ce98ba8360c762738c645fe25ee44db40c8793a63d52adca2efa0752b952aa67083642a8985b854d38e26b9de04412a865f7ae55ff2a10b5708a9559633ac03a9e12e16e030a6bff4043b17ed56cb1043cf31ac4495c86db5652b0cbce23f6efe2c74d304b54751e3500c811c8bea78c13f27f8d965a5e8062bad026548ecccb68cbbc9bdbba4f0e79b215d314ca64746d8e232e70b43659085b89f590dba061a288d60d2eac3854a0d0314f54008661bc1ecc0362ea7cd9d99d34b5fdab204722971000decaef952cd390f301017bd8823cd0c8e77db06738f866e4157daae06b6f01134666d3248044bb5aa63dc34d4260b7cb78ee6fa5a905970c52b3cec1df891fb1003061a74d9c26d2ae25db449f1307a781ad08f9cc4d5b9b4fee0a70017dc26696883981d7524a17a35a4232dadc46d9bc4a1af805281b1d57accc5f83a59fb0740eb938cfffcb86003b96bc9814dbde63362414d62e5c1f2450a304b8991e0b13147f50aa0cf1aa5f4a272659655d1220f1b2d4c1e8a4fd107a2ce412d0b3e31e39ea5dd80272e11b16922491463131702d25bc5acf7c53b699a89244e4f7e4d00f88b4dc68b5e6be21661bc2200ea8cb291b3ff34b489f812fc483a13e606ce2d5e8fa49b84127d2faf1907e8b2be4ac75f1c44df4a05d0acd0f3cda557407b14d699282699b00d3e3e31738f04f81aea4581dad4409f8bdc1c71232c2a921e5d6b91239052a1e4baca91463f7bfec2c349c70a3c1ec1f04ceaac84cfe8667db0225fdb00374dca495c21c81fa1390af976d71c3f6dd2c9a4418b3ab6182362b305eb999fd11c8693fbc94358fd11bc35d1995804b43adc8b2af68c0a423193111b1da494a777e241af71fd1117ef9e1e64f506b47b60f2aaabd5c1f3eef8d8706cde460841c4a4fb80013f7378397a5d36d46d764baed2a9cf102298a5e0fb790114c523286c9568776151a6a75916994f1cd673aa8b462f9b90f722ee51c2d3e1a96a0ce3d87d319b797bd12cb53a7bb8b789d3235f14e4193b88b852b3f72614837decfa6f24fef531051d90b7b0aa788bcebd3b93057250fa1c83586e601ca38c46eaf69851768b7236b15ac53fcf9782ed597c8de17e48b6fcab88eac65b95aa0c2f5ebdce41672258b61249ae921e832dd06db670b30a5571576a8ff08bf2c719e3ba456108912bb15341aac69a1475d84a967679b69dc1c1af87c6a855c3cab32c9398d3730f738ab16e504f90814234ee8036c63209e034dc66f5b4610f9b23356f1eeb29ebe42af721a3111b6dd18ae5b25c1dcd579c14068f86dd56de22b124d93f73d32d65db4ee20bd3e4e10a2157b452472f8edba7548bdfebdc3847a42256633118dbdde3de3af05f93e4d5436b0f7e0c01b68737efe1 -MD = fbaea1239fb68417d5fc143c0a2386ea75d5ef93affb80108e6faeda4eaab7b30ad620538ab0589a91af34b78f06dcdd - -Len = 13696 -Msg = 98607bc257cf734d99999d757454cc0e781d32d38425d308de6d395d83cd6a16bc3b1769f24a1627c3f1139f568e82c0eb2ad77db6fffa76ed37f5d420f7f074c99c604924457bfb4091efd456aad3dd5b82de44d15cd701e28f4cb9af8687e3e60cbe2992c68a1138019adc1fafa9afefabadf07e4552f3e6faa6d6db8316a93b1299d2e7d82bb0d2ca7d7f57a5eb7cd02fae4964c0539220026bf149f5850ff136590dc98046223673ff85a794818d259648162cd8c228b92e04d3a4e4bc5d300066a0e1c8c3ad8d8487b5b685522a1766e2217d9287fbd806d7449259a2db1ff92953d6b78a9aff867fd82d7f489ace29e63000f88a53a6134d0cbb5a21d1e7a808f050558431b3004eb6b38b4a277166bb0c5c11b47a4bdccff2c9f22086af956c3df9ab97b9d27a5c17f1b0411728a6c97d3ae5ebb7eeeac3bf61268843a049be0476c0ac7c837c11c38ef613b31d70784b427d1851b7c3923b2d003f50e24b640b729dacc0ef8fd5813365a943754c303d1be02491cff1a52ed5872ef59c23c81b93487dce3d3a101b8806eb0f5bc2591c6e16f5bf5efc636001c33d7af75a50fb81cb09ee96062a5734e0c15ef55b5bb0e22875238b6a339958bd55261a776675e52e3667227a8bfee0fb147a6b9e9ec1201d8a047fc57fa0827c5c422d02714f6777ee83081e9bd83360caa9e6148b17cffd1eac6294ae3e28083c165a84d952aeb01888717ac3acd616cd348e43887998d118615b60283bf26adbeac784054663e09cbf84176944702503638ab5feb123a0606c92b0545f87a923069c8a5ff32d1062706a7cf766aa96567d03f256851772de15300c9c7190cdfab1021e4e20b54751e34a31d3db2c70adcc2080f6be1d4f7aa35dfc673bb4df4a3521c93a97a38d535f4dbf676a9dbbef960ae94824dc401c6040091e839ce6fad820128b1e9eea4f2e9bad19dda6800624e8b5b27efd4cac9202ba2712efeaf2e32782aa7e4e672e965b8353fbeec6d9bee36a9e96277c1282ca98ebb056f41a9e609ffd7f5c0bd6e0b6ca7c8b1e9550ab2392733203d73678c12ad224790a5a50f1f4ede870df3053d309fb56ddf55335cfb4991b386500bb0ff84538ff379a420206e38331e92439dbc83a24d4efcaa20f5978196f2e5995db8aaab29180c2bdbc5f451648339bd8f58fa0bcaa8a9d3b0d0878f3503b274c4d696a5bd6efba0746867c6a5cc57b7a4ae795e808cfb548ee490173829354298f1ceefb778b6a68c903f14716a5ae650157816e96c4f811dda47b5fae3ec674c62b9d5a1b5cba2a6d5f0b741edd1ae14368cd17fb734fdd00a24e807b4567751d1fde3f6b6b9394592131bb1b75a93838a0dfabe0e4a2f67fcae29e92af1d74ba7e1b740ebfdbedb6d1cde2b67342b0078a20f2ec1edaa283a59f819a84d2b8c5d3bbbfad607c7eabf746b296e1cc93d9abf8b4c829dd2a34b9eef03ccc6d8a67a326e9f0575c8f611c04f363c63127d58dd0b81b0d95d6b99135b42090d632c778c3ba7eab656700c76f6dc72b58b524b70ec78ed2e9ed3bb2dd95edd8f5f80fd9fcf900647d50af81efe768172984edb11ca9c981c0b9e1a64f5b4caab223644f38701d8b8e9096d1ec2bee928cde5904602673220480d4f4f2cee410f5fdf061e0e57e277f70de3fceff02a569099037440534bb9c8b3b242db65e11a6ccdb975a21cb403838af53fd2c4c56a84eb9d22e10b65670223fbe6ada61b5add94d790fecabdfa1303096e17a73af31f5fc5d880d9efa688c084b10039605f26c6d90670dc60aa2a08a8fe2b020b8ec468261b9c597b06c13bd5387f9a4085dcd6363cb4ec5cc23cfe4c76998fa78c28973662900477f64fd865c368435c7d743587aa175502a0c0667c4dcf8aaf79905f7f24086566f38938cf0876cee484617745e524b0e2e458d3b10a599d73d5b03348f661e6d88d01df796e17879959492de964798a8dfb6ac87332a432a53eecb55c4039234d314e3efd7ac727eb6a7f9bfaae724c54548ab73b3d5bd4a403ca580197fa85257ed2c9b395120a4b169973e2399b60e69e1d1291a0dd1e10c2bd9de174229701c41422346364a9490c0b38488c7182b526a67ceef394594c0a5ae9645b4dc352bfa6bb086c4baf65b9694b861d810c308ccb58dbbc3e20d62916dd02c3e8b4a8bfef06a8063377118d283033734677e94ed038c051270f4fdd65fb65246fc5644371978bc7c88add15cc88d9043e506fdb799f3558eb7f0965ec96d4136f8025f8b2d02c27576538d1cab7df76c51004b11beeb339f7eaa3710f620817447f6e3e476321bb8c90b55fa74fbf11a741787e2bc9c28ad8fcae7d42df5986ab1d9d8293a2e4eab497c30de6a3108b217f1b814d92dbb20b0f7af92b514107efe534742c2 -MD = 916864ec799cc0ccac4b6a806a8c02ac72fa2c3c9abce6231ae7a240d9f2f26b819a711de5480aa334638cae55cbe6f5 - -Len = 14488 -Msg = 2bac4a034d7a81b57495ca507b34097d79ea19f74ee305ed7c6b7ba839af7d6dc2c85aa5f1f5dd3b1228c446f3c573e83aa6ea75fb62f5d88acfa2338ec5f8c65725e612721a7a3e7a9f54b930425921ce27ac64994fda25b61a54613e0b235295ccd793f772c086530161f35d3322f1df75450a4f331b9aa7557878710a64d821c41370a88418da4657d53aa020362012999fb0469522000688f6c14e482422a61584f1aed8e803fba897d72192fd76119aa09da6fd561e7ab9b684fe4fccf6cac8115e31f699ca19fc8f120911dfbb8480321b96f31fbeacf29f09a9a7c21d35e4a1fe586794f5495ca532802344b612543c703e00e5a6433a9b9775d6705f90711e1a4cb2404c32cec181ad529430641da5e5c7ab109fe89a92778d663c8383786ffa355f04997d5dcb45b92537f122e357c2597d087143186af217df9053b5ff7ce63af64aa2d10eabc7cc2495c1f3ae394f1bfd36e4fbbf0c4e3cc7d395cf112d2683007930d7eb494f0cd816687f8733d436b300c0b99460d323a86d1278b36a013905f80b36fb8d24a4c823ad6f752d98d227cfcc24a14ecbf509c69259ef1bc1848b31fb97466090ba7d22596b810fe415e20cd1e5edbf7cd97346dd1acc28ac8b1c8bc8a2d5a8d9777d7d341ab2c1002a6b1d97a380992ff86d55ba6253790b773f6e39feaf4f4802529a0625102c34374a6ce60763c62d797f5bf2d98af6256f7d421854dc3b258483e39733a336c865085f86b99d2cbb8531c04d287b88449c5c702b4b6556b82499beafed74c803db2c603e6036b524440cec93f72e15ae26665e3b8c5186480b1b9515fb8acb2ec23ed6d8a43748aedd97478ceda986ac3423750fbea8b51f6091cf9204ed259141c6291a2fa7cca3795a3a00b3f6c486ee1a1d718a73ca834c84d4eeb0a6c074814dc0cda68e2b493fde2bb6f11db6847dd3bf2798b9adbdf77b0cf1a9bc821fa95a05b9b4f44ce958aa83774e2443ee09d6c1fa8f82461588fedf62943755d9e2765fa5ffe217caeb47ab0b7215550bb9ac8db218d67dd22795b50b1c2020ec5428365a2f5f7436213b093a06f7d324b6dc8917dabe3a3efec9f6b2e77ecb9e26f8f3a1ed744b73221007ccb2d3a48128ee1ff07e41659f32210a209d593d38816efc40e12884ca154d0c881db0b26a366ab607ab68e63eee26591de7b960018c13baffb2830783227b7f37f096e42708d9b5220a3aa563585e4c716da71b43706e95a8088dbce67321caa1d28e22ffc7c3860a42bf8a56985349e3d62a56445408f6018d4f8c3b2dc7548e6c9e543c9bae9087fcff7e5ed78db93cca4bf94e616743d4e7d05dc97bf685c666d16224ab243b61e00367c43d930544f311eda7be15e6e7be1819d98334c510672c350020acef5f95d22fd1f1ec93c3f6841897959a4502bb30a6b36d0c7c3617b9b31721cf144ac474bcca1c23cd817eac63680b7ccaef851fee9f620312fe1f7fc5b3d71312ea14f2f8fae5bd1a453192b6604a45db75c5edd7e58aa3ef312786541a6a0352072e53c9a87544e1d9b73dfac97a7ce25b23a34bcc0c737c97d6d7469501243a69b99f191bf3408c03b9b515e9c2aa466a4648319d10fb1ff7d579856cc40033d75edecf9c8837828cdf03f1094b566f6ad7e470a1c0c4411acb74f7e7dc1ea61bc519d3735cb32b3cd02e75703d08c5237d80f21d42554bc961d1864e7106f9fb95580de8963befda353e8868bf49b05ce1229e5cbe36a3ca3f9719e8aa41964077a165435f583630b53c1437f99f98dfabd55ca55df0b3e50cce97feb056e3b212fec3cbde906804f92f00261495e572829e143f460ae2e4717eead8abcd4a180f760fc93c6eed1fa81f347d38b0ffde0e87ae73a30c978d15b0f9bec22f313b15113185a0772d496b1497848c7a4eeaf8971389997f3caaa16cacf81d0202e4cdd8114733359149ea171383397a3b60e8d629c952ea3801bcb8ebcde5d124d9ded297571c2f7fe9cc2f8fc166382c06854dd97af6d5f35b0f9e9e874221ffe3f208acfc84ed60efba65f4873c3d8aa678030ce6acc8d57f4125ad6c5b7cfbc9ae80368093f89d245bc0281de310be066800a8539d4c4637fb5500c559698055bc441e2970d79c50584814cb82392eeffe4d960af1e8ae49e53780d96371f64dc45c4d404412c73b5805a0d942414428e2f1bf53cf25757ea6d213f2a21ac57a6dceaa0c363285ac0400b58e4aaf677bbbf40a755f8a039ee72fa2563eef55a460a41cd76fbe3d6d04403933c30bfeae325f5ebacb9fc0714f54164e5e750f9245e68de7173e5944ffcd1610d4de738aee39a56838ec15be874b55222a36590ec39ae486553a40fa9db0326da6ae2dd7988ac6c8d0fa684f361c491acbb99cde82ca09fa513b5a5787f077926006945dd75ba922bb5022ea05cdd87e698641cb2b7de38b34c80f226595cbc62b6b10e354b336be2176ac589c68ec952b26ae9d66bc5c83266ac725dea818532f670933b69a55e329f56c61a2f46ca83a204d1cda8e5b284ea8ea269b2f45 -MD = 5077b3d65d16446eeb06f10c73ee1128e29060ab1ca255c6cfec53af04edc2a665bc5dafa937164bed9d01d0316f0ffa - -Len = 15280 -Msg = 03b264be51e4b941864f9b70b4c958f5355aac294b4b87cb037f11f85f07eb57b3f0b895505fdd1160e184d811fce7d3f60acb3faa474a5eb628d66cb4ee7bd5b57c64a5e165a1405d4a28537263190aeb5b4684be61f284ef7cd969b21e7160d0fd70d84b1e8e3645328cca1e267502ddf624ded1c206a4782321d59fbf555fcb1be214d8b12b5be043ba265e6e832493826d3729910e2817c6b69ac4f8b03c6f7fc443ce470018f523b94d7a63ccd6d7a829760ff79377950da19e69f2095e84d11d4c760796d34e7a9129ba2cd7816f106183cb1c1cf9b99fe9cbd6d5e82dd2b8f617181a74f5b1f14ba165f22c8e24611d46a52731164d25960752c8d51120dd568cfca723e7e72fed9cc5dc5463be4363a7e5405a361746b13c26f3597237e8459369d72910b8dd82042013d66a05603d8ed29120c1e1ab41519b7ffbb8e080cc14a9d210d7eba30fc0bfbe3a0ac15db2e3b53f0a1f71fb4e2ef794444be14df1f702bf5fa64a289eb8ea0609aab9e5ca8ed675a1b88fdfe1bb8259bb9402f9be24bdc69fe49b1536d4e913cab4b69e8e777d596bf505ff00e086f7e8f90d293b83211157f8a711e0fc030c058f80300586f213f23c9a02b685499653e3c8876ffd78c50f4c36c5a318811943a3df4438a47cccbef615910892145c85bbfdbb6278080d504710d98710ab640a589b822db765ac558c3f5300ef2f7405e7726d1cdd1b0fa051fcf494ccc912e5167b91eea8f3da4164e0f1a584e2045bd1f044a615f7f38ad2c3bed334234e5945481a83606f7f0ae8c012ff39753510df3ee80707e4e293322de14b31013ef04dcac4f2c621c2367fa65f17f72f2eab7b2602479a2c0445da020204a9aa0a3196c93845c150cc4f905b7ff4a45a18b40c6e3a6fb8168027300acc078667dba4880d1d843b45c4dd85a81b9e2a3c1ab3fadf378548e97ec19d0de45bae80d9d28c5d1cb51b49d366c553db1e6f1d5d31ac41a29431ee289c8ad2f5080b3d2b420883dde249a22174b824667b5d4708b68c5c22a15d6da43f5d22a51783e5fa7c66450712ac98d58ec6e565bddb0144c801f760b6b3ad1a3280c59c8f00c26d090c6c424e2e75183d575c7fedd09239f173dc03da1bf8b3fe59838378691aad7064c0389db67f1107d3525d1226430eb84ad1b4167d94962a522402dba636e139d4088e072d00e977a290a734c45ceca5ef9f1b71c1caed3ed16fc0bf9e5e32edc60eef94793ec7122cdb045b9225fa41c80edff3d0e2ddc3402d662c3bdac813a198014d8382d462dafe1c9078e561133ee5a9a49024904006269b2a64f1ca33cd6f6c39331337ee12bf98da5ee648a4baee208dead82e3d8b2208c201ec60d6b25bd960723b193e3de820422c6ed87aa2efedb5c645de4237e955fbfb13b483b823f0cb2640a2dbc43f5bcfcac6381f5fb1b7240db4c9d8724229de38aeebc247915881386bf94c0d8df2892036921b5afc27e3a56d1786a4f72c71a105301bc76bba8a9104471982998c7817050bf4fa97e5f978b8efd535ce07be1e60a917a07abdef1753b3cb8a2dd2a5957dcd34a64c986e6ddd794c8d9062cd98067e3d3a860ab7b49f66e98c0f6c1783e40062c8e1e84b6b23df731405e4a4f540d815fd5748ea4f3288fbf20801d6ca83cb07c71f7f975cd446d233f4364d1f56df2852b42091d052408923e039eb50a257aa0bce025a2736d8f2502600d0fc90bafd9f663ab31e48b61c875fbe5dff89ccd3fcb61c9cb492bd5ad564e9337635921d4d363d58235c133b864d3534be7f510b029e7366eb2f1d9228749980748f8e0ec5e9d288c6d57f6f8871497974cd0ed88550afbfb4571f23b31eb9bfdde4d75a6e4aa04ceffd213ff594a0330bbc2cc5ed9279b0f750eb94dc2cf1f69b7d9488af2050ab861a2233357ee26a6a92d357a22d79409c63aa6d0d64e82f95a2ee21f23289ae7475a9d3b0f7b82679972a180ce956778bd88437ad904771b39b0dac9e49f45c9f56dfa8cfc7ca7020155a8f938db85dacf7a0782476b5c5ddaf18b11b2d38bdf004ec39f8b5bf4f47528a44a0e349fbe70727bbd9dfdb31fb2737b9d0a6fed94fc9f70e948b3fccd697e3c099b1ae5825524085369260c0f54b944b277ceeb9a5eb28b00c0ff4eeb52c8d8ae8c0927c4c1e1460a259ee77b36354ef8776af64d8b3a8a6c60a83bdcd59af2af3d89b7046b4cbd385fa2a601eb7a22d585eeae2d2699f782c4397410466722924c0713bf95c8c67483ebe821c8fa48e03fa463c795535afa584d683439afd0ee242bde54f5e7fa251ed52e596328299ee136c79b7bf90d29893e88a733f7961942427772f01cd0f09cf8d9275e965d7827003a173eedb696f39765e7a9b0daba42f56f8808e9e33d8ab18909ffc75ce27dbb4bd952b3cfd913e280842f6e272792bf3702c4d1998274b9ae7feb3d908461a27d304bedb15666aa58fb19a1f417be0a5e81a8667c55c75bca07955ba0d45f603eeaaefe139568596fbb1ceed9d121615663281af42e1f226c2f72c3f638e37f1136e0676f1c956a25529d97410a694ebf55c851a981c8a7f55627e919487a5984c384ac1c627a672a40004db219f23ce9a80dcd04e77047062a194d7289a07a1a0f004eb3fd83dadf020974b59658b665f86ccf8ec582aa0ef9cb63aa52e27b3187f7c1b -MD = 8f4d27faba49fe0bffa92f430faccd1990f9b745442d455a5c64eb39edbe7c9d95749a644ca8eeab63ad183cbc739c12 - -Len = 16072 -Msg = d4281d9f6ac1860f5c6a4db1d04365bdee62de13e7c50acf368bde1e26649a519447ad30f663d2919c57802936a581a19764e0ecb83609d9007a2ce4c2c3e2520888137d8f1d176c12e11ba6cbbac74838be1e561b33a54fc4bac70492c778a9b854192d3dd79bc74771e8d298687eda59d75df716a424590bb377259e59a3802c1485e80879a8cbc16dad52a498f07e82176877b471cf215bcd03efec62adfced2e2058f9eb849f0a3f33d1f833635d3ce6067ffa83eecc3f70350c87c8dc47820cb2231715776daa4d42f59a1f209f0eacfeb7f2c0c9853c04d32174757989731403f16bdfcb5a2701a26694466f6b81d119c6a311a772dcf1a6d9bc4fcbe949b0da6bfb32c6900bc21acdee8e97e91cbd1f55155ed2bba69f76d968401c908b470038d1f4b237ddf773d2aee1e24367d9d80b5190908922770bcc802fb2a6c1403e01f50fd576260a751cde26969eea8b0b915e8d2a04d9df2c580a03d75273055a6e6d6978766d62e8548545fc252e3c828e443fe8535240a32510a6d0bc2afd1c2643ece25f3a679421ac255cfdba5503ab0c8d119f150336dc99ffe80d6d904ed27f7f5d581681412c5ab0fe51163c5790bd5eef0fab8eae25aef6666dc526b61927092f898718b61d97cd2947cb5b46e45f9cc8cc9b4bd2a756739103b9271ea44574a11b1794bc9b6b6427076019974ffb2ee5fd6da06c0b995eb3f8d1fb4c1be0a7fb364e5d1b4edf5e3eba5ddd147b97fc8ecbaaf742f87f9f1273950b0824018a8501b3db9bdffaa1b7884b11830d3eee0a5ed9b71e17111ff69d8ebd1c6aaf0587a5ce7703f6c516da98b01cadb0f5eca3dd8248c61056c4a99e437a4e93f200484a27971d3a46a5ee1317665a0ac6de9f702e12028a5677729d3cab6848d263111647a5af5487373d20055751c3b8ac4741637d9c2e1a2198c202b6303058162a34b50782eb90b20de804575c84d33ee375acf15aa3a9a864371c056ff48b01dbcaf9275ea86700a7939bce41f5207cbb378ed606910cf61e2112feec3b740d6c019c6b0b33160753485324c9bda64f16ad939466a249f10eab6d0b71ae19202400253d5033a5b1582fb2c1bc846e9d3eff4293437c6a837bfab493c4f584234cf01c04f6511ae40071420de2f47e507956233b64c77693af396ffeaeb7bdff2cf80927c6347f8a91368b7103b3e04e10dabff5932c7608f08e27b3f79cca9a0c4175108584db8a54a51453e6699c814bb29d27965271cc8721621c674eb5de34f2e826feeb37cc91e7651c54bfb8cf7107463b36e36fc6bc1baba0c67286b2eb34e8d1f80f9a3890230635155c3e22cc0040973b8479ded6a487a7dbb343fd7b2fff793a980cb698828004f1ea3561a2c615a56ddf95fc1fe380996fb6f6a92a0ab4868d2f962ef22c59f3b00ea6743c804ccb949cce08dd011ddf4a26a69d41ee8f60b97c3e88e7481c6919729842e2576e73776329ea5926e6df34a95cc10702197086260eacbdff4ecef5be13b5db730204dfdab08bdb786402f5e71ffdc66fd91cbcd60e82bc7879890c9a20b471fb90e694ac6ad1aa221eb0548af739c45c58cd223345f32edc240426acc528ea17a1805e7f5fa5104a9d521b37ec5d4bf21cec81e6bbe55952d8a60b9f0cf78ff1bc3c05fc98f05319674e10980751a158afdfa196784187031cd78219fd0aa8ae698150ca1c98bcb6060efc554ffd0eb799104aec85f0fe1678ff55c29f497d7930b80891f387934902f8a616cd4adc3760e5448fe9d906b474864a44fa9c55789a47f5fb26a320fce176d882871e51ff8ec85629ace3e90599d52a4416ec7ad32e97dfaebcd6aaf52def58418763b738aa204a5fd7f8ed306e52bc6dfc1f32b374108e52bd067b5c6dcbeffcd5ff54093d55e6db70ff5c5e7c66ca64b31fc640f51aca90321dd95a2a71655b77dc719bcecff34582df7cb649791ad443d27ea1381e5a1022020d17eb4b820577e05516e5f53844128296615ff47663b522a1ffc6820779959d5fba38c00ea3dcf54aa10b317f812acff186463da4b910f6798125b0997393d6166b9938d0dcaf029664c6ea8ea4d1aed74e84be6c7f5c354c50df0ed8a825957c54971b9159f7ee8288a1892e5410078ee1a3de985da1c963937c068bbd52c2d79ab9d219c1bca3563521742739eec25f662b04eefae899067382ff7c5d2345706888c330bd07085a92d01441fc73c89205a29a38ff388d7c187b61712e9e068fe48b579ef5df05d6c835d14445a7ff6fe892073c139a8d0fa9ee9333d8cdee7c364af62a104c8211fed814f7bb93503e3482b3c3df1581054e64ff8a04b8e37e874d099eb75667545d424323073ea34614fb06940bb151a731640c3d5a66cedeff1df6c091069ce70dfac890d1b0e1d0ae8468793e76e63d7776221681df98e5c541275947630a1235880906c0f2f0242aa54138206d260f4b22a9db222b27d8024102308075971dfe75704d7c0bba8ab1e6f99a5a9dfa64d3f10955e4536502dda6f10fe5452c4f8f48632cae03264a6bd0f867940f4a86376aab4c705e39aa7ff65bbc1ddab2f111894c6dfee31bab7feaa66775c9ffbba016f5886d548a170fbca800d13d0f4babc192d613b283f615bc6c61a6d5ff4c367b50d0843d4292b67d3fa3a9742da586779d309678457457cfb01fcf3b3481202325ed5d2248639cc38a6d4c89f247c933d5422e3d496a6baadb67970185a18796daa89f0a84d2e815f026638348789d7da2d6840a772379d65602a631d9f6925ad9c7f2fede27c3fcd995956b16822ade6cb23fe6b7e6aad988b8a5d21ac66af9 -MD = cb7a6f63e6186009b6857157690ead10a5323917ef6035d41bc71c224b5bdb0ddacbdc2a59e6ad2b3731678b1848ae66 - -Len = 16864 -Msg = e478a0f1531e1a79150904fd08f340a34bcd0693f4a836fe01d5ec5f924b5500554ac2c0413efb1587e6d64dc5b508197d793a4bc73a60df42654638502a6bad83221344523598bd11bb01d320e1d5be624e32fcf00719510f900c0d6055db8d5748bb04eeca987c9bcfac177f3d519be096132dd9d70a5d50a0676329944ca8b903e1897ec7a4570d6b00a24b9322b7e0970867e972da0aeddb7ec413b16707929cad5968f263584fd725fbeda9f01a4b9b3631889f3261cf8a7ab78672d3b1c85b48fe16137e86495b42aacb4764cd07e8c8131e28ba68dcf482c5eaa138ae4588da00eef49ce9e43f7f384f3725d7fec6e49513d31929fd63bf74a7044007ef6b8ae55a5c668a06ca052ce040dc40167fb340d069f8ac1b1d584f256491c3b04c8137c11283709845fc0ee5293111395a5c9bbbb1fef71c6b76dbcd88d3ea6f72e77d8bdf9ca383f88c67c8bbcb514e9e072f3d75d414ea9541a2053aaf851426e3401f8b592cad2bdbbdf0be53083d94de82bf7b210b6be3e02b3640cc9b86b09d07e7de61120026149bc5fa703eee84061ea78c8ee2899d7cfec963d434af583e5a4aa05d5d63305d86af36cbfc48b5aa8b5e70c3a32a0a3ca4246b6c587666eec1b098f416bd93de08163c0c493571f04f4def6756387349a4b1203e10c321d4c5818fcf44f895c1a862d2da2e9dfe00f4dbd122019a20ca86d74af2637ed219ed264d96effb7f2beffbc1ddb266a503026fdd9eae3859e8d3fdb0305a90c1e4c2059af01fae9946634ad0bedd79ae21ff73dc8064fa66cb128d1b9ffcdf365ecb873e85ddf92a3a8eb5c925b7be6181754e97732cc88e9acbee53e7515479af901400fe30c47c2ff8a572b9491d064ceb68d31d0d8a1b7e868820b161d7d1fe9915a90321f7d54c278395239a7fe4a9ea295b260f28539eccc34aa5355188736ff0013bb77a7eb9a5b5f80bb2ca44c1f9f9f6373a8a7f232407986ad4a8e438990fd04ffa35bf9ffaa564179ae86ebca0406bf89799e63417bcd3a946c62e729fd8dee6f211df26acb9a0f259bfaac1676683102d3bd2fa2c4ac3099491ad4c0ab5f3a9a8f42875455b7642f73940f8d7d306280459899ceb193033c5f3abec600dd64023c8e0b54df2acb07d3d778a77efbce725dc5443dc91e2cee1d36e7a2c4850526b73500d4ae60be3f2b2999fcf236cf697aa7b17881ba083f1183f1ff3cd298789dfc0a6c69e5b845e82ec5e68d5e0fc62ad463f761d34fafbac66023f06298984f277a74884643aca94b9f0c96fdea28fcbfde42e0164da0a762b4d975a17fd6496bf3959ffedae3dd0477d7a572f9025eee72d392df9cb235ed6258431bd8e32b2de848077c087bf1ee02c04f79b6d2cfd4d431e0bbb77504caeb48df4e1e2f52d1daf4554a36e5866ca25eeb5e9e1ade0774d650171839828fc223a094ca1b5f1c4e330ff5f0b11904e91c0fbe396ae7fad749779e59a04da089713d9c6747ae51b47cadebc05f184b49803304f313ac237e03bdadd629a4b1a3aa1cc17034df16a049a5a8105002b44613ebbf65d56915cb8d98c228364617a336b4b06f535fdf84128dc78b2476b4615f906a0c00cd46625f9f77ca66a0570abf9bc5cf23bf10e27fdca67b5cd2d01dbbd78140263739b4e2483b273b32043cad488e1a466b5f4dea08d17b59b5abedc10791ccc6456445ce1988e9147983cb783185db0be32f28d998e505bb7d8c53f7d717ec61565a876b99ed6a92e57a39b8ed398c14b4e505c7134d94f2b915e2d89c80397808911c533fd53627043c09d7e20597d16f25574afe67c38ff6bd1cebee773e7ada8c570d71dcd651646dae6da696a8c26074afddb0effbe39506549a3349660a2ab0da02d660c5928473a9d2a1591978373771e7e132b8ae32763c7c01834a8697b317dbe41d7e7ac2d29ebf78c9746362024001f5dc84404d8136f9efc14670afe792e1114f7b7ace2edf8c735444046f499cb46549e94a54abd6ac446ff468b1e2ddcae4835702f4dceeb257a5f2ebbd91da67b607420cd67a9dfba60bdecf6c294ae1e4657ba3e5616ec96c2b2b79eb6fab947e9149384161ff709b0160352d2f7cde875253fe0e50b25a4760384f672762d31574493d23f66da38a0d230a8359e60943c69a41de2f7bbd6fc1b3ccbf7da2ac212cdc8c0cac7afcf96b81dffd5d190ab05e994fd3520d9b4bdc288252c6ed7808277dc55a08a9e57fc91725f99d885b4376eb589c7cfa5c721bf100df9795df50f09749aa7f7d1573925d6d169fa663739c0afc87e4b479691dc7b8a4645e4a9224d3b95c8556d57b53cf25b2d815bbc75a72bc343dee8aa73df72a5fb1893232109d650ecee9ddfd89e6e08cdb38ecc52ebd180ffceb08930919c65013b92eb7606f0d3f90887780a12f1dd32d924ee385348099864c6bd31baa2d23ef60a89870c2f24d9ec53a9b36223e4423a48ab8fa93966f8e853cedd222bf49b902385bee33b4d72e22afb3b54ae24e620208ac0b34b9d05a27e429b90e0d4005304688252bd56ae3134f50ab137a507d1d413313a27b8a9d970a3d5ce68795685d6ba3a225d457323981f884069708b968dce4b0574becad75078f2a26deb836fc001501bc224abfe7f011ecbe98c5cb7734476dedbb852e2474a5ad594337159ebc72b0595fa3d0b102432186201607cadfc1b8b04ad28437da0742f8758068a7e9333a87dd01192740f2ef17ad8812d647ea0d596a534421902aa77ee622c4ca2eed0cc23ad0fdbd24a781cd918a511bf536f843aa95e2644f86377705acae57f5f6a382e991f2d535e7a6128c9b671e702ee6097bf8e39250b08f5b647c89e3c6e69b5479d29d21fd29a8a0ff39b950313873056f2acc1e5c2ffba68310dbf02a3350b16bf15105d2e425d359f3cc53c0fa1be1e47a007aba6b18e2d208390f88736024209cb3035fbd9a443d58149ba7d -MD = 082f8540fbf6774f3858ec103c57091ce84b1479a791f87495c44b3e85518993267eb2ac0cb44e089567c562aba69709 - -Len = 17656 -Msg = 99ed7aed36a1fad487d81b5c680a44e508bdb33d4a560a166b2f0ab7e6e99ef194041b5518acc6a47ad69787128c3c80a8856121d9f92f7cbcb312dac668c0b0eb4777ce06d185da7beb0efd1b320adc488e8dca590a4b3b40e35b7c69de3ba2e6df15c1cab8405ed23f0a264ba3b5e02f00bfa09230673d3ce56c0698f418b1cdf47d942a08ff18c7f9126a69884573a702800b4b148969fbe1cdde19525ec4e7ad38b1ef6ac8f0a242af313f88c37ff6bc56734e5ebca7c400076eb49f15c27d33cd7ee185a5ceaa4167e3934c36eb6557cc4061b505dfde69a11d33844595d7aec465c7029d9a281fc5e82e7ba69f3cfb67da4dc16ef9924623525ca8f7243d45a6cc6a88b83c64034ea8d8be1b82c3cfb1a9d92bfede28bc1677f9b43357f720f91d93c0ff9ca6168c8c58bd9e7e42fc3116cf9bbd74e8f501f3d04fff164c6848bf085179a2367f06fa781f367a00a96f87f5b8b4a419196c2eaa2265498645181a92e52f375b67445bfe8dec5f46fff465152bea57054fdf904ed46cd8ebdef396f82127415ff6cf18b3aec7135c264719f59b6773f2c0e381860e1cabc45c609b04af6ba988532e975f2bcf7f8a45f0095eb134e12994ff6918787eab58e6e8917c3703581fa7e942caab0c8b1885789f1715588af2f2bcb0cdb999bef1a511e02960f5356b198980bbd787204d0d6642ea6edb559402a1be6d7a76cdd5c166f0d3d34b27b6d295b8fc574724720642599d65c62959ee36fbc0621bc14d616c2a41380d1846fa955453d25481cf97954ef9a120f087db03d08d1a9280a1adadf43d3641ef65b811bb89f0b71dace9e588c6cbf19167f391a39e49e3f419ceb0b78d75f19459349255665a77e25123bd6fcc8a42f4415e67ddb9981403fdecfddcfa9e24ee6a979f8ab1b89cb6056ea26bd2871a015d440de7a7af2f97942e1dc94c59e3e7e209c1c234b12f8312f21ee4a26981a002cc0c2730353b9727bd97e84b4d356607b17f65b5ee3630bed6b84202d97fb97a1eeb071bd341ebfec1f3a0bf23225423b861dbfd17bca55243f9edbb7f1d340b6332ee3230487b6161ba586f82b2977c45ef8cd4d3c6ca1560674e950262f9fec36a443bf5582f98c5737a2413ee185a81b2e101ca5e8751568ccb570b57f09b651a70ffc979efea16a66da67eddbf079431404ea58bc44c4cf0cdcb4102022972cadc4655b4a3a17cdb99bd6a8775caa5f412810c5669506b19bdb74d6d15f21102efd8401033031e9b66317ff520eadc84c063a6c55ea3da9101e4d6a0123c6b4b117c33968759256d3cc9662ea9b06268b0bc1ce38b8dc2e0031a85a1e250a82caafcd64d87eab8da834ec73af9645f284c5415b5d8584b8c2920027a6b76ef2e221ed03d1c000069a3894922f74efa4dfbf23a452e4a9c1fddc0f43397f568d7e2abca6e2ce125a2043f95ed8ab55c5e2460339a73adde2186c003d24d173cb2506a6be9a0d64e0d0e3b53a39ce3ade33164a7bc91c738188be9d86175229344d5255cb56127a3332a442a4d141e146589c73fb46ee1d38e56031be7f65f9417daa244da561c4d9bbe21c2f2d9afb96b9450a289f442d70a4ed6746dba1668b2c5aacc6166fd74cd349bc49ad5dec57dbac9784309346b15db2989faa88f369dff059c517b113f52f27ad84deff2602363f86beb97fdb73665c60596a8112761f17b5bb27ca1d7b16286a5140f35b1e6f7a7218785e6e4f554738e49a2e5638502d4b18c50f56472ea86d4f61dede14dde9c4222bb371ada11f9cc1c7e54119199d748e8e1550d1ef4440cfc026317e180a077c12138806e0220691624a45a0d204ec5cd1609fa3ce786f62da4df7c28467a686e9f313f3890af0a407d1d6582feffd344d75854542b153a91eca838ac96f4bc301d697ec0237059a06f095b789bb218540c8c43ee28b97f30c20872f5d9d41b108329668f2429fe41e3ae63755f313c059debee9346396d130f45538978e32f14b9b91f2cf9a3a128c256a603b243e85f73be7ecaed5fad41b9a802f2d9e99d46a761d01f0ca6e95ff2474ba9fcafc46b744c1a1c85f1e7c2aa79a7b866ae10ae3669a2f1c4fa7eed5dc97bf0a53e773089dfeb1076b8c29fc8006c6186f92e534c18bc29886609dae9265e5e15b8aab69bbd192e287ce7dffd857777a0939f3dd2b7464fc2b3322e80a41b7db4e50406902fcbfe0305fe8a304ff0821e450c74b18e6aecd9a9a0f2098ddbd5eb8c2e27527d2909701aaea949a7000867d51d01cfe54e873510fc2e6c27c5ec2077cf21c7ef5cd6d5859f422fd5cf93e30b79eb16041aa83eb0ede891bb024cbc6c90fdd9cd8ced9b0c7a60cc2184aafab1c93a6d32f7d75c511c2a6090b97d283419c26f5ee0d72b78e70807d247d6148db4f6bbb90d9df7ba30fbc1f01305cb97117870eb811beb908d44c832429d9969e328eadf838177b4d2649c21386e0c5c2028c6bc9741451e151bf7879a8af10bfdd8e1ed810c4407aa6bd96c4f40554defd9581949d2a0e826967d1a7a22843bab0c882a31c4c67b5f1b601980010d3026930e4abf5564b869bb403308efbbc395cec7e0b93365d79a791970f53b9bce6d5ed0962252f8548694291a6c78fc6a6225865541e18ae5028fecb9d37569ef6a4386479a51c68424292016cf45b0f7bb1aadd3f2559b6b4064c23b4538de5ac84918a34edb3512eb800e7059df403347b324a0f3170232fb00813f710b62d92d796ef36777adc485a3d97131cd12e6affad3046daf2502dc6c130d7f765d3242d9717e0cae9664979a6b5e809790d79af7a34988a66ea38baf5eed9801372eae74078e660759b8cc6baa826dc621d0b1b17ab56b8244dcafd14c27e4355995194f19699d0a5c89c920802421e12c979c3042923fce0e76f0dbc4028a99292f2d749058d83f089e39c1d48bc3701bf6027ce1262b0f363af8d4adc7b2b610c48fea52a33f2fc5c1c2548d007cfb55b28b9e41ba58cf23ed6cc4f1bf8612771beab94992fb61fcb80ce395cb740b4296e09d4895ee953d5af7b3772f2b37c4fde4ea5b6d345d134cc075d334d2274a69a981e00114eaec483faa2762ccad61322583 -MD = 34136970bcf300d0b2553a049fb7d598acf9febaf3b79ff79264bf9a4b0b27474b6fc7c27c5b19f7242b7b8f594da916 - -Len = 18448 -Msg = 7a93d9486444b719f5ccb8915d64b968832eee56542ed5305a956855914697487793f59e6347b21b17eac91898407a273e13fbfa07326b8130ba07530794a04ffb3f4d83f5d05d4deb378fbfb2c3864813e97791224125a6cbd10f56ae8ee7dc2d2047bfc2e6a0f6963a735050f6c3132b36cae34c60ebe65262e8262e3b553735bd4c197391635f437bdb911ddf1ad0ae855bb82e99a58beef6f98b30a4d0a73c9ec55ab0d98ed11883304cbe8873c6c45b94d86ff33bdbc614ac4d5ccf41756a4c184a20c709923dd9db47def9b73e9342dc0bb877951f0344683359c691eae64eafb16c62bceadb05424b2339cc8046c19b18b12b9b9ecc0e9606d091a64cd92cf0573cb38f231a90cf1f354f9cd403613ac8011936a24afb9c8e68366ae36a6f450436c06b842101e98dbd460e82f2a81fe351494c71a492e393cabfc4f9c29e157f0593365419e0f75b632309d13d20b33148c1c654035bd3dd9d339bd40841c7914f34dadc29b66352cef0770b09515e798f8b8d938fdfd4338a9bd9bd65e1c502bda93d647a09943aa7b53f7681c28985cdaf88766fa54f5f39fe65fc0105769af6fc49333464f2db9578495acafb9a1bab339e45cc36aa27516427d903354220a335e4937e4ce5fc41437d010f84fb04d121b947cd184f547bd6079c93f9915e6b5af8ca804bd567521dc3b276e61208e680c0c59bd5a4ae5e5aed8cdbdacb1af7756c2163e82ae2710f03b427a849ee93599a075df513fca3fbc1f2005f581dee8d28e04fac4c36461f25504b5207807fb331553cfe0308f1be6b162d11a12ff9ab144f6b1da42b785711ce0a6cb38452966cf7607adc98f1add34088760c17c0d618b6e0c59888b0bfaf768b7fb7c3b60b3334f0f005754acfe2b83918029fea161c5cd52c9117955ee88ff7127a0551186e5615e9e867a52c7ec5697fec8d2073088a73d8f89ed03ca26375ae6411cbc805a3f6ecec35aacd90b1403130aa09f6c488e25333e60861c6382edaddb1cd20e164bc8179a900b901c2e5b838be4ea6389e4925acb7e6d63d574a1e4dabff2ae8e08e30f78950f8b741819c6a91968c4d14d0d4c9d812a2ed08f0021cc808ed03619582ce9e41939c763b6330ea8aaee931a1eaf41333cdc093480fb2d091711b2df8fe67b07c9197a83c97f193d116f53ee1ef942ef1609d3f7bcc788b41bf168de02d2887a8fa8f20abbf145214cc5a83bb6910f2f6626b55b1c2d4c1c1dedec975957aea6ed76e27b16403f0fbd6fe4855e2d227e7db141d11772f39b8d65929dec0c6a2762f1b03760d25352d3ecbd5d7e141956fd37fdfc475f2bccfb071f544367278670a7efc2142e2e8530ca8716aefc503345394e3f2448312ae730d74ce7de831ea707f5cdb8ca2d314467c663693c63bde623b70c16a4c03fc2714efa51f8e98a66a0669cb71cdbc19f631fa6255ac0316095cd05c71b35761d470aef0a4ce7444fffb6d1a7bcb6c0a23ae7616bde024844fdf49e9e122d5878308f9d8920f8c6b3846aeef3205ab8ed6db227c54c866cf3cac2491400046133cc4188573b8a9c41bcf75731de1404d16a045b9a1cd909fd8aca97b18b572b0058c521ece3393f6b37f09cdc4c8f5f0ebe528f82c576c9e2cc51fd0f0a92104e848f1cc2ce712aa053cb426af23901f5d92145f7ecfc0723fe0d0b751441bb7ece03bb6143cee881befbca66758da81758f4f161e9b55c319e60259c2ee2772193c79050e9aee37fc816a7473d19bbf3ac421469425f33ac3bdfeddcb0f0fdd7845f2e0a269dc60b0d806b95bf49b80b51ad41769d4617e444f0c6cf40f999f10e1f07059117eaa40ded89ca82ba16dec77afb0240f6938a482732ec6568e60eaf9b9dcbafa9cbeb3792746e1dd772ee9c5f93a4d40d110ec407d4ac84cb5ca0c76964d4e8d004311933ddf8e71e36ab4eafbdc6dce62ad237070e98359d883803ecfeb9b3071e26213608e3751aec953d0fdbf0b21e4b851fa95327de6bd334e3bacdd2b4cb643afe1d97b65e4a0f5d05d460aafa11fd87ec5344e40592d837c53754c864a980dffe5f0cf9f928093327b20e6e1b6dbb6b3bb9564541cf01a1470715f3290dfe95b07ecb26ec3184e8211d17b2ac8dffaf8c3ff9d3f95cea21d79e93fb988537eca2f174b59df2ecbc706a2f0113ff44b53c5bc218b2e8fc0a0562513a399bb755445b7c3e84e8bb50944db6e1f83e251ceaa1217bf4efa1ea4ef6d04762ae17501311541a379f7b251b2c41cdafc71b570584aa7645cd964312c093abca58b27dadb79ee13c6396aa638a523cc12681f41b8abfb01c2f23a4ff540dcfc718232e62b2af2bf9e1b8710bec5aa7d2e91364ab27f381ee70d4607325c13bff68e402e0a72742f6a63ae972c6dda74b6b2a3922f0c894433f43360cba3068c9c76f6b85e979cec90da89446ae5db3914940e21159c14f90e6ea763a85edeebcb04fe8e11e2937d7a48c01e6175d454aeff1d004e7501c8e0424a17b1d4c264ebfe00b8099b816a8e75fb2df765ed4eeebb7b36c0df79361139c684cf4fdb80642da33c300a8e3c3628e17a15fc50ad3b8fcecb5524a4cd091bc0b2e81550c69e5990246c77e07ad92b1a0ca48322fcfc44bfc8f38ba91431b0e3aae56f4abf024a6f78a729a2acde444fec8a428ec09ba2f534845bb093efbfd473afa5f1f1f6c7e73ec869fa5baf3c2820b181b9837f711917efdde3d3ac123e152cff6ce6e39aa080b77f100eb3da4cb2ff88cecc1079d27a1c59685bd16fc79946c5e426328943455cb30d4d52e864a95e9ef324b682c964f31667b3c49f1706e43e8037495d78969f4c19a0f42c170eb50d5012d953a5dd5c5e0964ef6ad764eeb369a392dde67a68945b9001700ee8eb1b0f1ee1b50fed3f7775f5b997afbb4b6cc6f273d336f99fd1fca4e17af03fea1155d03670af9d84aad4ee89f04614e5b1c0aa56050f1b2c4c2365fd12661c99374db1404c2cf4133f4ed8c93b4576a3ca7f55a23d1ae9f74df959bb021886e0d41c4868112ffad47e0a3ae04153ea6dfe2a7abf41ff6ae81ca60a8411ad85a731ed1d14865fb8b0af319c36ca19772b97eaa215d965a6e8005100c106ce21d697e6b9ad7465358d19ea86339e3f25c5dbe6540ccff4a6dd4323c1d8aa2263564c2fa39ca3e87a55055e813f846cfc241347180cea5571b12b43d733c552520d98f16348db918deebbb514c24548052e8634767df1300f4a01d9ca -MD = a6f88871b9f52e19ce23dd00fe0162dd6a6bb39d66cdaf2ff84b55aa9ba5aec9d2d352b374097cb35f0e1b71867a3f6e - -Len = 19240 -Msg = fbf0045f3bcdd6ecc9c0654cc6b8ef9283107787396f19aafbed9b75e87744e2a574f12e0ba865dd1c59e1fe3cb1f4b09e6495e5fc936f668bef7c182e21d57de96ac97d99862c67e3d7f1336bbffc0a464e3108b11dd14003790600e0c4bc57b019b3d54f2fd2920680bf71bbaaaca664157476c2d6e63e4bd360b76828a178e0cad8bd946a00666e9d70439439ae8ee10285b99586576b4b45b4c52c152ae963c55fbdd0015eec01752f2e5e36aacaa35d8c5994f5cbccec1727b0965302b11f52715d6cba932ba85222bc81674760946eb3dc25eaeb6b1490e3020ca9cfd8feb93626ce5e482b4c7a717465942e5a9b7c20ccb22e5f4facf91042f8e13a67e741d59f5fb524f5d33645de728707bf9fd1fbb0a28ace809d9ad5f9c1c1ea65c13377518786d09027cec683110779988ab36d115dc3e007cdbb5baecf1288da76d743c2af9bf3042e8a1beaa8db2cec436b9e764ba43eeb26a4cae98a9bbbcfed75627c3dba365ad2b26d9ca1ccc9c3b240b567d4f490348f9d49335a262c4a0e55fb079bac4199f98de31f62a2f826bf7cda6c607a7deaefed0012a7798256c1bf37e92f38bbc98d64a6fd5525601b5265370e57ffae1630dd1810d95e66f8eefa3eac63284df3757fddbde01caaad5345f1d4214bcbc039b5b9b5589a803a7d4f37d79e439e1e9926b1e86d517de1aa62334726267beef2bd0a888cf8772356064af347505752e1a14a05638a82c13f0523edce5866aa433c3411de3ff4bb6267a187c8181f973537cf9c2a906154fa75e95182a835fb147c5ed8b4369e0b87b9611b88639ff67d3268362a2bc1a2c4fcaef8a8e090ea4dc3b16677a71e1aae46b538eff87e76a1d83f5aca224ab483e09a6caac61e7dd65a554290581bf1c054c36565a1652089727990753fa591216ad434ee2388be978971f465113e96a32cb32a5224fcfa1e47416090487a4184e285d8debe75b579972e05609c2f134116ae0f1e4aea0f46a1bd53840670cd9690d4e0e0618e6962ceb3fce8c095708059dc9d31dbd864eac615f0b941303c3dbbead55ed27be23b742961644418b34a3f645bf49f6d03f3ff72bf97c1629663adee3fbfdae328edd2b7bd3ef161e6860e6ed1cd5e52f34794fc49874dade4efac09a46b416f445f308696dd8f18101c0f248825df2e3cd0cdda15efafb92dc901638ecacfc63d78d6bd77a9e6e53af38aac0765ebaae774f235ac38ad2f79d9f42384444c901b220b85e50abd6e6bf5c72ed6f34a6efa1d4a3494cb10b7d007cc720f417f77e64418066a68dd5eab090dd37e39c42180b21e00570e9ff83b3bd377b6293121a7c545678d2b0f5b0217a6c2869d206b7e1bb6c07c6b249bc15d4f5b01642a36668fdad1d7bb190d7908d824768928f6fe405a9d8c4965476b558945785a325f29891f6bce81c31e17c2ec21d764a267070952bf0e102ca5400bc95ea4731144fa9b5c5efce3d733e52e2ae030965769a25ee54d8a273f5d486757cd0c188e8ce0add8d1e94a1bf7e934d98a09870fa2d6275d6f89f866168b527abb38af73dfe4a7dced1b1f590f2dbd4246ea9f92baab4c004f92ea6b7812b27b50b1a286e70c71b0d91cc85726b9afae3d5c46a75a29b517122d65152de471a2b3fe57904962f49cbe74afdee293f46397e6e4182a594ae9e3e2d12bda0975370da73858b0ee16e8c4a93ab5ebc572aa7b11e1abd142f4c0e83a97762a8aa8828535aba8c2b7c0db1245d3a6ea5713ca1164a529f8ec99e249bc1dbec26ef0cb442f1a4627c5dbbed1d0e177874fbd0d82679859466022982ff1ccca4dbd3759721decfb88204dd928d0ccf169b75ab9f6a2220564a5782ac25f0c64717f64753687898f8dd1007440cffbdc3996d117949eacf3f9c381e029904652d6bd5f67b8f659cadddfdad74154d8009ef50a6f85e29cecaec327028d0ce05d257f107721f2c4742152c54a52e8ca2441dbed09f1f65cb82bac51d71559444d06cb5fed990132540032a8149b123912c950622cff63521f1786e7a8ea01d8ea20ab341047ad0b3323886a7e455a8d90df5d5121d7b0e8e91a5ad0bd338c06fc1c267729547db7d9315bf5d078482f672b08a231a26585dddd2ff65e1980354aa1441080e7f99e0ed3b430525b65855f545b3da1880b90c5080d40d3c467cc9d580ee75d29aa289ab19a034b1738f83f035e0abcb029736743fc96635bc835bde98be4084217be4472155605d349f1d1df18f2c94347958b3405e058062cd772fbc4f0c859c9c6d5bf2d11c6b821d6db9191db0f68ed5efb862f06f8ef1a1a8436bff1e79646aa163feb1dd7ee471026c0d1afd748a4367edf83f18c3b1a66ba4486d1ab2218d0cc9b5660809c43087a15e154690af385dbe807875b15b423ddca21765d25c6a2c27a77c308eb9e259e38c8b40dd863b3db48c5b1afa371b9b57396ca44c6d986bf85542eb902dfce5cd08eb50bd77b2846a7c558ce0dd8910ae4efb3aa2ed8e68a64f78ad90a8e6d7a853c41aa31c34de4af0e62017c7211a4c8341bd5854b29ecbe68bdb12a3469c101d83f340ec3887c06a7b99018c5a24bc56be90ef2bbb7ad3badb1898b582af9e96d96ef950442d8549b43c3085badc6839e059d9daff89584d04ca9548218eae8003024ef0de4be42efeae275bc98deabd456caafaf546b41d97858ae3a9b5ba49bf41a4366d4f777ad9434866ecc5be516c6dd504333f919ce1cdfc1091b16c545ca1bba987c4b9cdd2b0264fbb205d86b3c1da7f4fd05b5b92086b47600e1f4079a6d7c2a43815985969436ebb1a32ddba1d4dd491a58bda16b95af0ab285d9e84c59b0a4906355afbd3225c430ff8c6edb4819cbf2bad88fe754dc4b99ca1bf0c9277f8fcdb739628824591099df9b2dd3c18400edf3ae8a7b0b61c31d776227f71f10716146aca7dfb1f956530c051f7189467274cae89a0f0166faa7565896bf898cd5b4d85785aa232d1fc64e704c9ee786a9ed082ec78c7f14779d2da34409ac1a402e35e204d1c01ff25a6c85bd40226c2cc275271ad8cd92c269c5eb39bed1e33c3724f42c3cd1f4577730eb794083228359d97c9adc33096371e6d97ec4400e50376e3506d49dd7d685604a888752cd361cfcd55080f9a1e21f57141a0541c40596db4f997f6eeef8ecc54cf3fcd798cd71a6d842ad6681c8dae24515681c2de1bc33e7ed268a6144142797c18659a9d1c29e307a49c3d29d094d1478d418706e113ea80bb23a5943664ed3fa0f2228ca76ad83003d58bbe71661284a337eb634fec437fa09c6fe7b4801a9a77e783e3ef59b7ada726d653068e62a936c9626bae98c3fc215767776230ac0cfbba413b7a730bc12cf4af8ff67a4c15b67a8e9883b -MD = 240602789ea8f91535fed9ce15b79d6d3e6cb54cdd4cb55326ab03ea76e0f89d42202ef229a55351b13a1ec143c29711 - -Len = 20032 -Msg = 82b6d4fcee076404ec0e88251df98b0fc80488007c8f2d7ff774be4d47975d992fbf8873cca4e383784938fbef8bbccab1fa9413a7e997dd08c1560c7e9b5990850dacdc14439b998052b99c9dca2716268a120b5fd97e06f8b2420a355e54cb4c49471e0f0e12afcad413f26fdd545cf05c0cd2ed8769628fee8c31b40bd6b44c1a6223022bd22b20754fe4acedcb02d717894f991ce059951e3c6742c865b24c2904d238c2637748dd74599e211572a364926aaac06b53d1e9589628bd8b2d161d3513f8fc4bf90ab58a3b8ba2b9121cea2e0b6a9a93b80cf8eaa5af14cf8d709ffdce8900141b30a59a71bc973f4c0a52651a1fd3dff00ef2f97c1cf2b93b235765eb34f745448054aae37929308734433f7f1292d8639f808e03ba81d29df7ec7453410967dbc46bc5790a80122a6366c5228b000479874ab022d0e9a11cb30733ecf85d014ac291f01bb6c3709f5f63feecd145ed9b8df767c1a552af21214fa89fa01c9bf8436f35b1c61bcf4df0e1f3c32e881b2f7b2fbbc882e38212076ddd55836dbe4d0ead9b2382afb99cde88aa91e8f1159f179cb51fafc4a4582e08daf4e779f0b1edf22a5932a8b5f4f0012d3c48aa63512ae45cae741e9d5c5ec9a5651568bc8ca6e6eb3b1e2d4cbdeff484ad96d88daf7bafb95e1919f3855e5748915561a7460232e5b28e67045fa408b5cd1aa61b1fd4a6d215e5dc303af85ccb5fef8c3b47c97e21a4c97d6842d4e6ca831c3a960bfb70b1bc2190dbe5f27d34b62a12fff8c371a5fb1898fdcf4a36cab6e3bc86dab9b65e3c165c7ded15648d804f1b7bbfb7b47b9dc3e04d6ccd9fbe50b85571f4d620df7b09699dba29b9dea4a6ce38056fefab74127cdf8224c9ad38e32ce1c11a553e6345dec3b4f6232d0a7754bd33b1c93b664c953b7a185d9f56ac6b5da94dfe83db11e47843434b849a0ad592af46ea355dbb52eaba71039d925a376e1436c2b4cab4a342cfdad9ea3ca67840e3f6fba040a5dc73acf762add437bb9a6a9e4adb1a7742acc0817468d895654e3588a485f7535a5eb77123da04891c6c134d3effb2a2ea3b7e01c404561dc5440fc68ceb690df53442a9ed290a998569770b45297a7dc279712272c89e87c0abd8765cda801bd57bb76569a4ceaf1c1bfea007605a4ff3ed01ab26bc981b7d0af861bb5b23c421be7d6e3f523913090911d32dac3a62a41f976687e72d2025e9d74f52743a510282fc8c163b310c75bb166d5f1502fcfe9899193e5143e0dfd0dd08c92fae0a9f519c8696689fe388ba773744a49a6629df718df302c3a1d4487253c794653721b2c52668e06ce1698d9af68560eae84c7c858a4d0396ac2bd8fef9f4aa4820af2edf3234ab7e4b41bce975c952dbc98ff83fd8f45ba2490d09e9c3f9793f0d724c5273a1d2bf6c37d0ca7bb98053531bda063e9112d1bfa2629b767e093345919486b1585c168b7450a7cffdf43bcc18aa4185cc310a58116b7cdd2a630a11358ee4b401516aef1fc4e73a3cb67c7daef15a754cbe345a83acf5bfa68eaeb986c3d24343baa5e161b4f2841eccfcae0335b8d6bac4390e1fae6ce399920585abbab928c69eaea962a930754d40a5a74201c370bd4800bc0ef84a12ac78f9bccdfb022933056d8f492b09d46e1a5eaf91dae30bfe5471ac7712f814874771a8130f130f32f7cadb3fc0e56b2c600e0f184a806e24ef74258385dcb1d107548fa67d56a16a7dadd46bf22c002c1c9f1001d80262d822f1715ad860b133c08cbaadcd31a9849efec3f648465c1955f8f8710dd1afc2f4d0d62393ebdb547b007151880eed2763a5f0074a9b479914010f926f551d896df99d073fe4f8dd4098fcba355437fcd28aa3c78193895460a29f8c88f773d695550d2d63b5d075153ca20f5c6b4dabf696245d7497e9f441c3ee87e01d7b5075ca70bd87c52bc504d4ac7985bbf7dbd4afbaf2ac0d301ebf4c45aafd31fba014410ce1337cd1741448621f39acff3476beafaeaf5f267ce325ec1d6999bc6d7aa32bbff0428a2b4d800c2affa62c60e3ac49b807f393b6b4372b09acbf8660b0d6137f457f1d92b865f2c160114504235fd1393b333f743a684a964c092121bdc40c4abb9b53505cdd5c0de35513cb3fc18e58d486f25d7ea190ebd3e15457a9536048d9fef40e42d1913510da5e5a3eb9ca3e5953731987cb4731c9aee8aa7d6d55a02711c873702ada626f08ed5c282ecb1252048b515eccb58fb4d7a6c440f9357b2d3a9628f0ce7fbc89488a77050adbfd480002ad098e222e1ec6534afadf460074e228d4caa7c86ae500fb53de344027c2afa0d492f7d8358ee2bae7b307d15883724420049cfc950b9a0999ba9442b748792c6f00f11ecd8d93a24174591daae250b3b4a8946564847c7cf1a2122bd662c670255c633b1ea241d20044bd741f1ae63c37bd794900d7101c029d9641ab99fe329fad34784f555413cd2c1b1cdfb29ba9524c32f1908cbcb175b308ce5f74893b84fb4e1d892e342d50335b5e1132d6c1ac5ca7a53d2cea02f1ec5018197ccf537d4f9872f3b64ae830616582dd22014beef5c0ad2f3e01d81f5156680237394132b0fabeb674fc0c15be21d06c0b8310bf1f65508d4a69fba7e90305422f2dcf4a265c4bf9f0b360a9537790e675c4d8c8e37ed77fd8893330bd3d3900ec14c36eb9a65fe5b3d8ad9127500973e62c6ab048f38a2f71cb4862d3ed4a64f457e64572c043a244d1bb7842928439e823902057acb1c29c9601e735fc8197d15c007858933f572b085204ad274963021110c017919463e2532764eb5026c10b8dd9ae73059a2cf1e33add6ff5a017bd5eb337908b7b38ca688284fbd3810928513890ccff9e4a1dcc3aac90e6d17d9f72412eca80ad69dc3edaec6f6bd998b20fe7c56a6a91d9372a1c1919e123bf32b5824cce5a731fa03df7474e0278963131acf6562cbc00c865a6cb11cde002fe903e3aa3ff15829fcda13ba17fa42a2b1e50cb962f67e857e5a16b80944e718a693c9f5159dbb960579f706fcaa67c2a3e9beb3459dab96c11d4a06f1db5315ea94524e14e0ced6b41ba90c0cbc6b5b5f954ff37945c9a8f530913e4505f6d02b921715ac8f24549f5ba409d6a4bfd55b745aea8c736b34912066cea15934bffff982dc4aed3ea81d9672a0c8f7f7b90e034a18edab12d21b79452865498f3dbe5710027e8f8039b5788f61822a858f1dcea80f1b41330a0a87b6dc2f5b78e21d276948c5da9b920d6e74cc60b0fbbfd132ff2da3fa4e34c4e8366a5e03844562e6d8efaf72e3497be4ad22032fccd3eeeca9f4f62ae6fb01174e537fe633c04601f997a9dce9b88767a332d7fb6b63bd385305b0577fc515a159181357f9fb2d2545b1337d2167b683f15f5db879d7c2b264d031048b1b98f2f138a6ed694e9ebd47ccdae82cff9fb6021812cb5aa8a5f769d516c69b66f1a8a125b92ae44301366a5b0e826eb8997a7fed85c8907ecd53dc94cff2234fb61ee37fa8750d70fb2 -MD = 8e2dff705dffa8faab0e5e06375d8a188602a9084843866e4c991a450de4c4503ecbd3667ebe432b353df3181f9d9726 - -Len = 20824 -Msg = 512fcbc41f29ea7a02b8d81e0cf06803d95228537df0f150bbd2bce07897b7496e5f993925e932091ff9464253fd9b61deef51d7f47d72541c68ca459d2af99c33dbc6cf0755b623de97de2a9167f58abd3cad01bb5a43a6d33f5572ac3ef5fe076afb8eadb59f4fa65947ddac779d08e0fee5d8bbcf8ecf461f066d8e1cd3fa52d3e07f00511416e00829638e75bc63ad00a064da247855dfcf8540290cbc157ddf1ca9e6703efef26c2ec51da979218e0987ae01a02bc2051979f36755d8d9ee565815485c4591454dfc0a435afdcceae042bd198ccf9d1fc38b8c2f414ecd0e003bc90f5b505741733b3ae7d26feb284e789a08308b6f979662156816477945a46ecf21b687d74ea6945ef157f807b21bd14bb8d488bfd45aa795fc1dea66fc0c982f68b51399d5adae7d4832c0a7ef0ff7da0fc0ee153ed70115d29e601b99fe62efcb9f1c253c51339fd6abee5347f18f4ef73be4f93dd4199cd2e1d0208643731931bec904ed5ac8cc8209ab94228b44b0578f92f4391b9632e42d63fe29a375b4845843bd4e90170d34961ef0e8a3bb071602218d9a7221dff0cc403cece50dc9abb6b2d8c9bac869d49870f101029f5b1eddb94dc8a262acde04916236d3e55f8e203dddc5a283e94b58c81fd67096b5566881bb2c7300a0961e7bf96e33a57e15dd0c55aa0eef947f1e4f01cdb5481ca6eaa25f2caca4c401612888fecef52e283748c8dfc7b47259322c1f4f985f98f6ad44c13117f51e0517c0974d6c7b78af7419bcce957b8bc1db8801c5e280312ef78d6aa47a9cb98b866aaec3d5e26392dda6bbde3fece8a0628b30955b55f03711a8e1eb9e409a7cf84f56c8d0d0f8b9ba184c778fae90dc0f5c3329cb86dcf743bbae704b8acbbeb39716c426ee3e0c5396f8014b6a8b5f2a2492e7fabbfd57d4ef5a994821533b0069771f9fe33d74ef4945e43cc7e20ffb0ad639b09b5c3f0e6b6cd05faf3ad926ed00410357fdd7d859bd892a6e9cd6ca378686b4ce009837586c7c56d988826f4d39931af4871f54ede856dd06c19bded32a35cffdf24898dde204f649461d21aeaa7bac5fe232ac2d4db41c385a4680054ab0c9d03839792357d207a77c92853bdc62804316fa2842740cb0ac6dbef8f56f5e6aeedc512251534d519a30c9e31956b15f462c5d0f54e5c4620905ed8ecc20a77900e57ada905cdd9bcb6ca98373a0ce11102b45ab8a2946f8f727ba8ab2e6f3c0ad5c9bea08fceaafe2371cac6f43235e4a1b99420dc7f83a20dd0d33ce48aa059e489c9ae0badc53869a0aa735c6160e9c04411d054744f2292eced249ce34117ab16432411e1c505f9b59bdeeb111e8adef2484993291e6bd23e5af4a00faaceaa0ddfa52b1106e1645f233c28d7bb526e32cbef10e46df82c23b12fa67629d961bee3a3cfa2174539dbd54d8e0bc3daee940153666cda52015b643818ad5ae252d7f392682b72cbdada26759353c48ee0848cf90bf8d0040243f8906f1bca540db794039cf3b5cfd7c8ab36c11629e8e482d3526a3eeb88af5bf2eb1257d4b8e2fc2979c6b13cdbb125b813afe980635b1d58f21995894a5931c78abad8268b830438678dea9479e78ff19eb83464a8b4c2925a82a335e3a0340b01c1131c465e6e455f5ae64924eb55cc3a629d2303a20113ee4dce7dcf04e111d2cdaf4263e5a8e4b3a65ab7574d15cc79376a581e7357624fd3adcd7707d7909018f3258ea9327b1708ae8b9b8d5e66cdbf427043c943e1d1ac97b1661985fbac6b85220129998cfbea68226c1c8e1fca62bc083e144537263132a636ca5aa79a1debe475e75caed4d40e18438b237bd1ba2d9c47e4d9b6b019f528439ae448eba88dd95752ea45345e06d9bc49bcff863e1d891bab8004f1cf55c426fba14413a3e17d100cc0d49cd0f8e330e8c91f4a57027b03d8c6968db9eae65b6d202da4988d4c5a658ef160d53ac13bd8c65fb0ad82ce9b0d1bdfc6721b2b5b8fdf6a00eef7c3710d931032e372f047aa43353baa05106bb90e654e806cffa1a43d8dcb2fa77f0e657bb5858407fceeddbe345dc50fdcd05d0cbb885d66cfb87ac90d75c322eb8cfdb755db2f80439bd395d19997097083799546f6618f381a54107d6351d0756736b475965e6260d93c689171889897df8f369c3b454cb541c09232465456b947b12199698924e11168b508782223af5f1e7f2fa97125c3c950ccd081332c3388fd5d35a7485e20eef8f98b0fec41237ca7cd75d36db0e01b853eec9686a750b56be5dee21464cccc5da4bdbb5f6790d2abb0034ba36496a2ce56cb08b77ebd579d49f9ac65df21341754f50ce40d73db9aa56c74aac75409acb3105a4e18b5e9f1f81a58c533eab0b678e57722a94902054bf5d0fc4fa4ba90b2310dd2ebf6d71a8ec599aaf965bcab8ee38c93d18ce07be24403106405302af2c185ce8eecc9776c6fc19f964ec2671593afa00ccbf15f26eb6d7fab0204cbe336749967f41b891f9d730ba0f27c999b6a62efc162af3f783082929b07930411f43cdc1dc957c026b320878ffd15838edc48cb75fd949d54d7e501aa928563fdaf510f06c908dd00655c8be9cb57e57e5dc3dbb1092be94b35f745504f365c04bc439ab97f99003b08799114e9ae1fc883668908f1efa3d9cf5bc6327a306cd5afa707bc59a30a45311a3fb7d472932bd1a36bc4645a6d8f28651cb7c00e06cefdedfe65e3913bad63b0d039185fffe6ccfcfc99bce6a6b9c5b5b1569d19ca8f2b7ab76ca9fe14d214d00b2f21c0b6a7d9e5a3ff883ed0082bc01ca58e0e1864bceffb3729443661c8fa38e08d4f47dd9cfffa4c42ad89e8cf06b71b0f35810e36b0124bcdfe00baf491f213c75623f66aae882678cd24ea241c292d9d3a84da0d5d951114a6247c2c29bf3f4c6ffb90d763a6049718417acf52eb53b487a456b56b0c2da9b6e1f3d43408a999070f2b77d20c7d2a195019255d6633e1976012d34ae007d9baf9d08143570949b60f24a05c03e6ae3ae143ca9e3234a104388ccb8fa926412cac80b7da32d4baf75c2b057424d7900775992397c7ec7f38ae2322abd00f5c86aa82fc6b24728945769cfbbcf7c67c197d77d4ccafb1d8bf21845d21ed39a8435465a3689489211afef91788f549cebb796e32cf522b4a02431eff74692ba10d3a9751651b8f1f0255ddcd8a95c80497e9fae1f247bf4fac73516e35cc5bc32edd969ae311dacf760ba9a21451c7ba295f9c46e7f8f4660842da4dc89f40ab32bdf1c4652012def090eb29c8d1df6bda3ac0f612fe5109b0320802bf5a80b5a34c27826dcebdb9fc7620c91a7e6576351c1753f5c05bb74eb169218c76827f1b18a6496f6641ed143bd9048bb00085c473fe0522d78b0b0e517c2ea28bdc63e4940c7ddc8f35e4b25272608f2f16f702c2e37e0cbc5561a982cf8eb3f2e500ba5eb8b447b2003d614a8b61b7343f667a99762325e741479ad5c1c6135432d1e6c9397133773753ab84928c7677d0408658148900d0e5494cbb016953184c63f4740d39223751d3fba116455f628001c09f4d341001a7d349b2ececf5c7a8138defb270868ad61adc209520d47cb546b3cf8ea8f6020f721c4e02d57ddacc7d0d8cb7bbf2da3aa4b7737db3683ee67bda79675c055a82923ef -MD = fa6f2bce66e628ee4638b8658e0cd36ca630c71c7e1d6da2189b4e8965a73573fdd137d23481ed07a8405c04b1c9e48b - -Len = 21616 -Msg = 2ea36a8deee36b8e22e1e40550d7bc92aa04c2179cf4e419a103a1695a1dc103e1c743365b639705ccaf0dce30908e29c70e8a13b09f314cb9a8e6fd7641f09e9039731760599f25bced28001181f63bb2e91deb70840f0b6bc1111f28e1eb18e3ffe478264eedb69aa31de41e335d8f169d65e7052be71f5f5409179886193981237ca1d4cae8800dd7d4c27c2d2cee9933484e971c1f513c6cb82defb7e2c813ac25d99353f84abe9334e256f7c920e3b2b06a4de02167aa0e05a955fdae8f40a3c6698b7385de55de278bd21a9eed9d22848150fe53295344d8d2f1dfe554b10f4799e3b1f70279c19506181d111d6f8bacdcc8fe1f61dc1519f1ece5efe00df88fb1c495b77fd242649c51888c7700f60fc3dc69ecd5f08ab04e6d9735fbfd6788f955a82b1d096c7d92a5e476c4f96a977db4c5214e35a986319d7e1d6c296219b9bf71bca3c644c8333bb737cc01f02b54799d2894537c81e2a42110fd38f42a382979d2dbb0d42dc63c8c3757c18fb38e5376686ff30b8aa8a9087774d322a4bfbc46d68b70239592cfe8dd2de14f187469da49a7bd5c8acdd4bcb89aa1f66d969f622e7cae39e6e01d5593150838404ee4503303587a67974ec43d374b776e05fb554476111f0af84e5ac1d9de531464eb618e4d6d6a0b4f3fa86c1378ad8f54f8a57f4141dce7228980cd3f0da77cfda793c24ba3355c3ccff1aff5d1a1b9cabddc46a4e77867a6f64d20103a3c6163407137c6a3e444a824266da7fd5ad2b073810368abfc71cbbe4b22130f1ba9dcdd805685147faad969cf0defa5e0c34e411d1d55346fecdb09023b12344b3eb1a64a85529f0c7518c475f996713c75ec5037fc332bd9c21cfef9d4d351d4062ac4562df3ec958fad5d9f98640875cfd2c85708ca3742dad7c6b853200dbfeb8e5f2cb731a221dfe05dd552201393b848d006a9e201b31c5388c722bf1013d4279e5589d469b94df9ec9f8f94399f1a9590ca4742303370da6dafa77803d8a83baa580da4eb64c13f3186b78623a0dc02312e4ab36dcbbeb29df74c158e175113abbdaa69cd2a23fb551132bf799ee6d7dbb71afd6082ee243f27785c58d7b6f7c80dc7eaba135b767fc96907e2a2205cb5ef1fe8b060e8787cc792170a20bf2e29cfcef0582852f5d834c22506b272d8e85dc13c066d94f67b60040c4bfa5402f78b26434f70eec388dca6e38ed9c4959b8969c009b2dbe665793504c46e5db95ac937ab48f31827b6497e07221cfed9f7fc7d3d6236a38f619b8dc61d83c29c791269f0ebbab9688b01b05a698508ed243d677bb801d63a984d741cfd426bf37ded24d9dfccb7cf2e8ea6a40c1bca1949d48d42b41c5a2f311752cc0cb141068de3d02fcd32fca4c778c6adb2e62ca48f4a595afe8e19b655818f9ff3db2a1cd27bd5ba5cf26e2f80457a3c04ef17d81d26318a3d5ff9172c14935d5ac50f7f743d9b423516f7b77f7f291baa3d71fb1cf07f9b1998e499dd57c7cee879d9759ab18b8fffa57e86ecad3a104bd82456b331aa563c40c18591d391b946fe6e476c600b6863a8eae2f05817e48fc916310b6f1a804b5f78236f0e5ae81c5cb83d13d1849709262514b307275f201731d44b3537e4f1fef0bba0928b21119b9e9eb78c5fe2982716635c42d248a3ca5b869c086949d42313954be78a2dcdc407b47f1a0212b9b4a51913928069c3eb7e90267218769cd9c8f99993c1d4f9dfddc59402d7ef13d3ba7d027d99882681813a10faac34f225f72eb22096dd3df2071a1ecc44404f8f3dd64e8d856e74944ccc83298d4b7e11887dbd16731240076dfb4401b3cf14ed166d224aade3562dc78ea6852383e7a4642ee2fbbf39ab25f7af2e288b620bf72e8aa43b77ae7352dac8a298d7a4d5e671894b59e21b25558d8005c934c2dbb46b74fce84c99750e6dc19eea0f75f2e098d51db74480579e17b4f16c16b72d2cb67553d9956a016668c2c30134bfe399c25c839e4d30e8087d94199a9908a968f8d3d197b8eac264b3133867af4a5319d564a39565f2819ba768a6da257ff66f17d79da91fe15d0f36fc26a4e6dee869bb36a524f48fca607d78bfb522e2bd49fdc9e09730177d6fdac5b53e43434a905a1ab2d362d06a5ee80b8db2f8faa5ff90f1c1ea5553c88d85b50cbf2d4022969c57f22b177a0a9dce6b38590f8f5798ba966929f55fe670201554af0c9f188467378cb37b58512619dee732cf697a1c6102ffdc77018020942db4944726d361a500a8f3f631e800afadc2c6a14fb7946f7bac8b45023ea6c74555f8489efc353dfb7074f1cc76337a20f29ceb0ab607cb4a98bfc629c709a3a55f6276ce3a0917700abdd2f2a4c8607e9f3c16631e7d5db7eaff6240c4510f95f95b398036e41ba79e57036b1ac64b11f02f8b1f98fe0d09cbd4810ddc87f25c4b6af97a98ce31e755c8eaff7f35221f0efcb109cb93c38a62c58b5ab8b236437e171e8507cf417a569af1767c1ecdf1212befe860436780d85ae8edffdac292baea10692bf033a6ca547f97b88833cf5045af83fe17e134541b018e5a077e91266c38eead38efb4d97ffb2bdc7b3e00c3d158a34e1519eeff913c0771425287eb24fcdc35b05decaaa2cffa8fffd5cea3575210f747f8f60043021feb9226be309ac5fa6a5e6695664562cc7a1de07f185f0492a2b5649380b9bc9d7100e27c1e57fc11f54cf0f834f11c6944dc485c4972d8f1f766460ea77cd04aaa936e0adde207e97d82e45e3d2c65999645f3ad5f1735f49d6287af9c13a8ee3f53b2b094c3504aab062b0da981a523185ecaba81d783653db10dbe8806aa51d74897b56c833dfc27e2ab4e9f7544d07131b5cad8392b0a7e5cc28392de403a1b7b03638ca938c6981e4e684792aa684ac69d278cc593ab09698d46e322d172b2f3df001cbda872a7c0fba5ca5f40b34a236817c403241285e3554ea25ac4c246b814d54648f5c6fbd29a4b50646c781a5200e3a87c46069bcf04e4f80f83f07cd3892a30d1868b3d5b12a3002a9781615b4bd361b7624ef33781500dc775c4fe4b254702e0c58814644df503382a94c844332e173cdeb33422b4da080d02087428d273e5fd198729f4328981168b7af7179f3ef19424fd079985ca12669282857377f701b1ea4e2313a9a6a14d24fb95dc764918469af413a3dc67525c8dfbda33fb1b7d83a1a7abc99a958b645cde4a99a298b4daaa5f0148a1faf1765c3c1b70482781fca458691fed9f68e39aedc0580a73ecd9bb087890bccb163d650aef32456337a25c29041c8a0a605348ee9c209621e8ca34b521841522ea371130fe82da17c50031e425c95a1e9a3bcdaa89fa2eecd1357f2fa42b954795eec874f167ef8a539b8c4f732c43253f2391e92decba1acfa2033ea88e22813eeaf3a070ea6c050afdd33497502e657693fc72300122f4099a28a9d5b3a51a0db1f87a221239d011ad7059383a04276814760f3b3e4ec2a8a4563ad4a407582bcd41cbb0e73f339133c986fff4abb33c2d6786f6ad27ccd349f5b74d692e84c0c6345ac1716476b218488593850d511b6737a008559359b3106de9e70804e5f3223bf1feb991e09be3531d9ef511492d494e251a3e7bb3708127984b8b70c5ed6bbd560fc6afba751c5415c54c9ee2995b14ddd371c8203124898c21f9596ad62822529ba0a44c674bb236b2939e668825f290dcf560e91e82fc8c105ba91dd5e2d1ad4a505ade9af9d5480dd2f81b21304e05dcd22d566022e962c0b847261220342fc6ddb7b836ad25137d0f944a8d03 -MD = 88a7ebe36ed445be23583ee13431e6291a08ce9a42b7ec012cad0fe205bfa04d84303e571f0df0803c76d7fca5a7d8e6 - -Len = 22408 -Msg = fe6f4286f2ba2ca82b6c4221cbab60711d2ac0f8d75963c29cd9b3a4c533668861c9a5057a0d6e339bf037bd8e9ed4376a689ab2ce01c58e67ee1790b838c2341a64884501a421aa824fdd83128f8a75915a984187a37b9cadd1513baf70c52d3026336d0ee90db8e8707d9cdee74bd298e702cd8aa54e93766aa9cc32433618abf9eda62a43f903d63b5e2f7b0fdff689f91f7d6071061ccaa1666bc919dfa094c40018dc1aae335398ca656f6d0e8a6b77387a906d6bdeb25ed242fd5a866bf26fb2eaacd7f5f1686f0766446ba036474895eca203448235893376556ef421cde14c4522e094e51ca85e5981705ca124567efa1e9a5baf5c0ad2325abdf16b2d041550c79e53b6772b1766afe30b740a883bcc8d99760e2ec9f79c92b045f11bbf57342279fc0c81e07ab7552e755602c6138b776a5e46b3aeeadc87adb75a9efa5818bcda559143b0cf71fbb862f012f8505f6274db00f3a2f21bc11d104ebf9d62251b2728ebc4815dbf2ae99aea4506386fd81fb5e4f78b5881c76918778591bb82c9ca3bc20c3d6dc76829e4eba0d914e460d3b399c653653520f7977af8bcab594e2956bf24ca47b140e00a9b2d572be583f89ec868e05e605731550220077ccf30ae4389131233a63776d2a3f369c79bc7f63e18e61c8e29f17e19b5065a740ef9bfc9c9e1fb79ced75305abfaf82e2eb7365b3247ed3cb97845ad3bb19edd3e30c6af27976f6050a7e06b5a4beaa9c5d81ebdbd933daf3774f0d73d29b9fd865e2abe4a3c5531542f83cb59ed298088b4172b62d2f330cc6be6606377951d0f0a53bedbd8943504f8a5ee4fe89bfba0d28a6fc90df707a0e78f1054a2198401bca977817416b18689af9de5452a6235badd4f994c317cda6f53aeb9b22c7c83fd94b0e516c2f0026a079ec30bbdfc6ef57a947b9589d7a38c9a0439b0b84bbd537c33afc98039a12417b990423b12740ac70616f2e75f22c4ccd87da3a43ad849c9c6869238d38a3e46b8f5f28eec6f812e6c136a335d80a251f32c93d891fc64e332127bd207e740fb6199249dd286e3158f19055519e4ab911def883b98502e323efc8b371dddb3a07e25e0500ce1b6e638d1cc35db7769f51d6e8bb797fd2e1fb4ecca4d5d961e9cd5402c8fe1a985082de2c6bbeb6063e3bd50a333d52aec105a8941fd0e3a09572f9312429b06d5e337f6fcd090c821c4c33ed9989b00f16efa7cf7307af0fc3953c59951801f30df1db2745a14d72c01f8df34cc31a7c4a25a6cf4cce7e180aa0b7fc9a4d91d1d64a9c03842bdb40b0024dcbcb8df46ed12430241ba9e351c121d69ab24ed2725daa1c85071d488462b0fdc7944ed06f5287ce6e5e3e71359d9522a46b70666cea9ce71c2cea07a66e980887459a20e634bcfbfe82e09a3be67726ba3466a02a339f86498406bb3f2a14188b4dd4787bfe2023653824e0fd32445d3c8ba622229f3e649dab17b5b72bd188341ba24989257def22dc9fc7c2079920bbff936eeea3d62c78e081a996ea4ce2124d6816a62112b9c7eea5c142ecc23ba90ed2e8f6d803286be2d8e956fbe2b0b641ba624ba78b1db4fcdb6ff8486be89417c922d3a251f2f71071f78fc73f6e9096fdaef1ff43758a75a5265aa102c20dc90a9efda92f16ab080176a9e2bf9621cbc67f31bed87ba8e79776d29d035266810bcfed43170de827fbc92dc4efa1fa3e9935735cb67aa0c126f3f8830a044eee41382b0696434efed58193e44c2c8a9dea744f6f6a0d02a0d80044f97372175f4f6a2f7a19413ffb031264c7519043383eae1e4d7fad3ef52f3e4076dc0660528ad863043c924bbb18fe28f4ac67b4bc0a65789d43c5c64c91006371904baa6687f57e3b6cb0f2ad8bc758e2993d6f87d21cd6d5630128f5b1e936705cbc6619cb63d9862627b540eff06d17b46bd43a2a56c16c69c9e7aee67b21f98dd313dac985fd8af561042399fbde1a9a8d73217785b0e8a49a72d6b318ce83a01a443806ee62a056e77fb42e5c3451981cdd0c4e2c3dd0cffd6aebbc549495301c77a007ff917cc7358871219408535994622912dcc09b285d307c46b10cb4ba341ea1515c1266c2e5aef90835b2a64b7eb32679f9d1ce6a54540706a09f48bb0bb9ba57666df4d64263aa36a3dbb0da564072c825f9e0f25d45fa60c5d4f79efdc9699eb0fcad7e0647035180ec09a2958a9ca1c391594ce296e4e9734617e2a4de2dabce4707369bb9a2dd3f5c2720c702127b6540bdf68ec744f54b5b40327b5874f310e5887c6d3bf72e41a48fd1553762d97d80757bbc57a938b09cf6eafbd8edf92b50a7dc055e7ee93a6daa30ea9b0c209ec92648e5a870184573a288a0dfe7426000fbb1fe91a8827c100ccbd1cd8d052b8336eab56a38186c87e9a804cdff53618eeabab366128ea9243e0ec52f43ebb6572ddd85fd6fbda84222b592239490a252fb32be5c3b622422a4761f30ff48c1bd71ade1d2957c9b2ae42dc39155aea4e5b3d699d491b18f83e69e5a82eda0d01eb8b853aa37d997baa49d3367a0f1ebbf9b02b07fa3d14dd05af3f195bd886403599945b4d5692069fa704c47150ed9591743acbde055d19097f39ed9dd63eff3dacd52a2dc8fe7c15c437890105a104abf15e90fd5b3dd3d24299ccfdbc7e678c2d0e4f4ebc23049208362d3216802fd08f5efe6028fa34e661286081728ea0a9820872b51b4bc7a0dbc8590c6cd33f87b604be0e52dd63cf42ae4e33e0b6d11c158b3a6ccbbcecc6a5b4b598ede15b59ce16780fc32e88154ff3411bef3e236e4d5f4f7ab6be9c8dcec3e8dd82f4accd3f5dd36c6135cd3eefbedf40856dbd26914b5ae7c29bff7bbebd9be314525a6b71a1782c163a58d489d8d0aa8b8cc7cc4b1803bbd9993c1add6a75b389448cbbccaa0f57c984515f870abd61eae36be9e28ef1ffe2027cf294911f54cb126a46b93f3ff6625ce165501a4e6e88bacf04be75cdbbc51ce68949fc40cec0041d939e2ab00fc80a30704cd02ad84f591ba547953ef56a30a3696571812a5262cd2ae4310bade5d66507e3f6faa726077854e5b6edb7b985da1a51b98a6f6873a194f41df8d5a007a8b37d5265e3f40e0e9a009f81089a65b422749c02a5e980c25834b51e91e1e723fa82ae1495a3b404fe0019a3f1f516590b35e191d5bfd158fe0ec326e890bcfb675ad0aec51a4282094decfb78b2e1f05dfe52e006d1ae8a0fe90db7e396cf5b7f6d80dc7941ffb2414fe030a8b90ea19e36b59740075f80122d5d7a88d96869cc248846bb0035ba306ebceb86f2e5965844d35e8b492b638f417917e142cf4dd5e5af93923f2ac25e134ad31c45aef4129274dbf07f5c5b0e8f2935f6b94b302219bc6c07e628f352a45091719bb0e655875fb97691388f187e377ccd27253a3c29787820dd7574948b97cc8dda3492a88b5e9e26670828347669967072a692aa7bab60e70c596eac2ee72d79ec82209306373306ea134debdf8928e7841361f4791ccb645c1e0923f7085c3cb7e2b99e60b31f2100a327c4225ddd3843b7cea38a95629eb30a6c7f4dc100de259c8552029a0a7c92fede47a5ae5a6d99d9023e15dccd9dfb67c04b97dbc1681df7ab3652b49e21896d99fcd1434a8e6dc0244d84bbb3691a7b2c0c3f1f49e1863c53d3b9c98017cb38806c0ee653a1a6b55d583ef7bc0bfa8fd94cac523d514ab4a7afa0a05b6642a7bc1ec55d1db02e00d5e8ab5b918a81eaef92463f48c050a4cc546d02d517d402759a5c7151c2ece9b38433aedaee99d6956775ad10378057ed4a8ab796306b90d2693dea97e0c8b820b53eb73e3f2999f352a1633dbdc21430175d8747bcee9afc12ce909611aab44302343f6686187c32db322a785bfe22bd45503a90c045681b1d792bf75d7a2645f37d0efacb50c77a8a90ca69181ccabd5cc9971846 -MD = 4e7fae296c6d80c6508379f94e01d80cf3bf9e057f579ee91df6d0f7c1fb85e4fac45194b91d0b1a9bcb756bff848a30 - -Len = 23200 -Msg = 8a981033d7b4eb4cc9648ba26ad9679c1550dcf32df17fb80ef6b299440f7560fc057fbcb79e8e4446c2fbb9f2db918bfb829f9f44574c504c302bb460770f200fcd21eedff32f7d3eeb477abb5a855e76312938d58cecad79db953d713fc7c8ad371d50b57b79009b28986d2d1eea1d70a6a1464a5908d77f3d17bcdf30445ebd8a9b6aa2fe11d443c1161bb1ee69ced02a304f0a8448d7449edaba11122fed260fc5c50f43a20120fee80bad94aa7b7e03fedd7dd553b4b24805bf71ad2f7ad20ec1e86213d290182637c58bd6542b617932770b16d276b082c15166c8ed0fa8ceb75b0536498815832ad2b17d0fe763d6f5a61c0d6c26259336fa582d10b39099d0a75e74b0f1fe5beab9895185b66b606ef01883cacbfbc48b41afa2416f72b53353d795afd4bbf79e0279195ba06261c6e06741946d195de9aed4f0284a366b0ae7d660ed38339f6f36eb9f3cad2e1f24fb710c711467a677ca2ddf6c4cc5037aecc59e1325509b85dc46a9cee6b8e3b1cb9faf09c9cde65e1c2336b67d05c5ade90b17c8a3f932077cf200b952e8f494d757f005933367c52d1fbfade6dff9cb661093b5bb16ad1d9f576ca6f9a79cf6a702990d7b816fd5838740fa8e3be6fbeb3cda82749054f1ccddb43de4db21ffc40970c8889f47b5a8c482447d02d56601f7b3d6d74d6fa88beca2251a6dccd6b5d23edfc275378f243f4d34bc1a0e342fa9e859ea36466d64ecfc07a346e5a402c7caf931ec86887d5f6872526dd98cfeba3fb4b7332166e0458b8a884cb490344fdebfdeea7eca3d8b9da547e27e96f592818f462d47bb865f1757d06980c3d2d140d9d058657deb2db275a460447c9c9976919d0a0195dea268158384936564b7b9ee0f1f84c810ac708c70d175637b38e563c6b4971c7177456daa85339d726811a6a42523d433709f8fb31c57751bd597adc9115177c64477074c53a993854c10ab96548ac9dce10729752933da03da5516ac0b76cf6672c78a71d83d7024cb7ea2ed9300ce94676f00bfe050babbade5467989504bd76afa9f21fb365cd84d2236b2c9ce0be16aa1bc9829f83cccb80fe638722514a393dbed65a4de7e283ac50dece03da94e52630609ec7188bd619d9eefb03e515154311d44bb7bff9cfa2fcfa3bf93d060877e86191104c716125515a82ae32b6a17c3d6c7295606bcf52825df4e18a7a171bae3d080f921603201f46ac85cca75435ac1f5d4b7bc119478b7a97516579878dec5362198bd212967e23e72f055fa40be85d6a5e549223de62c081cd307cd05b4d654dc28c4e45e50882a10e8f48275b7cb72842ad477593c2c052b98e0c97e02bb319af35d2e3b838d398a8cd1944c0d3bd25acc8599514061a78aad0a134d911fd5413fb18927ca9b70c82411b82c877cfd0d14850f8bbb70f6225aac33d829a849bb55e87c8aeb57d9b3f8df767def37fb874afc61717404fad9e7efb28991fe94ee7d2990cdaf6b7b31506157a80b13d5aeb612186a35c3bc989bfa17c793cabec4ff9c4b56de7f5e2b73bfe213a4b9926ca0edbbddc4554348c0f6eaf9f5b4d024226a388e403a8b8aaa22a02781d03aa84fb8d234ea6397cf9c0ab4898063d1f52fbbdcdd9c4509343db2174c6c01d64a0c99e6d66f95c117775ffbdefc80c9216eb6c1acbc47e0137496d1eb2bf46c391fb87e2b1b92c8069b1c4a6031b2c18f27846e6166e9190e96f7566a8750075fd03e229bb603b4864f6a2677e7a2bf27a24c6b6663d3bb0cedfc2c3348beaca367535a8e078f8e7eda71198be5f8ced1263741217baccef7bfceddac36e565ed2b1eaf6cd7df5dd58558aa04f45bf375fd6d77fc751d5bb65594f13f186e392565c8a89dee9a29759848624adc7338fb6d15955d1bcd6831f777ee53b80031345d78ce891469fa455b68c7c565e9a44bbf5823ae33650050ed9f5e4fdc4453005b57a79911f4d92d15e163de56653f4e3b5daa56868c28fb7e33c89d4de1a972a78dbd33ace2cd1510dabefb798e12ea284db2bddcebea1af35bb5a4d3803b72884198c1aedcdfe5927c5e86940d2408d04fc14bfd294d959441accc35c90fe9489cbea9e0891685e4eecde570897e91798c6168b0ef5954a90a357d3d632fbd2dc5b95507927ade4e599382d5ab266b6c2b197cbee5173f7ae1d81fb1f7a3d880e4112bee9e13d617e536c38b1b2680f15571eff0b28e3f4fec1e1a5a2c712088234c955c56ea5689b94012598086b64f32f2290cffc73a6f538ed700aba37f8fa8f4f918610647eafe39d608834cf7d0e92393da73c819233fb1bc6b1c41dcdb9b90c1eb696f8f83dba77660cb822abaa38d9324b79bc5b3d80d326225511eb525a9549d132e189c79145c29012f375687b692b072482567452ca2af71dd2f656ec61af6094ac87d0007ef2bcc5c05ecbe28f9474dd52086af967218a6ecf6339d6f7bbef3cb896d9709972ed5107ec46f6b2eb1f04ca05a3dd10c666d875b67da2ddfbc78ba42b666a1bcf9c3538925c3059bb602b48c291867d6616db546484f86aeb9411edb9e9657c6553f2d0e59e280a61e2c16cb3c67e03ad04f7e9f1f2104507df6ff3b6e4fb31e0af1a7f6a6f364b9b0157947db53c29e7cbaea4e347b2f2ed03e654c6db83e2ae080c827551e373b3565e5e74e04976c2e57023ccf838eae7ac159f5e5fa7f539f95998aad8d839476c66393dca1e60baccecd4f3861a9394228e21e1c3cfe010ed72007f865cf2b38def933ce5238e3bec65370b63e0838f11b09af5ba7449df6ef67877cd1a46a4655b2b06c41145c2ee79d88934234114f41d591ea63d88d1f8476f083f789b867d493f0fe9302dec3dab27d1594b42e24434eaa1197423b513f532c53ff067d6203a6dccc738ad144479b39855d10f538c87ce3186c0b0d54c808213412a3220089f25c1e07359d7ad55ea22bc4d1d0537968254609ba6defc69db97058e90d090f7f593b778aaa2d2d05a24ef27e263cfe1956e596d7c2ece118da4ef85fa7453c56b96cec126124f79720370e9f5ebcfe975f3b3deb7411c2836e151a8e587bb97e66f98e532829da1d032f41bce29b22eb2991247deb2711e55c0ee8fc89752dff462a84d768027e9e357cb35e19a1111c9b2e73158ef575478c818733a0f941e24346f7268a788c229d668b0c6b9573329c5c533bc74597b0e6b522bb07d09d2e44970ec6f453acb22337f24f4041f2361661ec78fedd1f2852f4df1a24c2e8eb3063f241105b8554af350fae006b342ff08665539986b4b8b884e6da6196ca21f1f3ca1f4558c01229aa0bb113dce1251213e6550108fe6600ae60822516edd96e8fbfe6fa1104f479dc0de0e25ca220645099049e2ba73c12ba759bd708f61b8f7ff920994ffa0188143ec4d3b31f29cd84a4ebd8b75442d6f04cace13590ed3c0a9f5489da4a413c99c5e44fa8ff4738f92f8f1873af7f35980e3daa6561595d79d90b327a9bbc7eb5cbc8bf04ea838af5637ac42860fb15f9e2d79a5f1166da14d1ccfcf7957b37ae78f9898f8ae4acc16733469e0fbe605cf10119ed491c9b23ac1f4f18e1854dcdf3fe1711847286a56442049d63d1fc0963438fd5b18489ee958c93a627e2aa5a655fcf52833500e8823068ed043bd3485f2564e0f0a58abdb29c306a0e9b349df5a51b192d3603d4e883d8559b04cb610d3000d6af8887d72bd68e293fb7d5ddcc5762302a7c75afbfc6be9fd035ce9b96ebcc7f9533698529c315ae623e746411fd0b5d230f40c22e7e81914ad4c34022de2ea34bb0160fd4e92ec01e39f878ed208069c0f84a555e3589f4b2ec9196d8928f09780778bd53d23f261baf4b628847281ca83e7db077723e8faf8222e6e18e587ac53e76d6cf06b2a902a8546a09fa6b3d84e9bf1aa0be082ceaa05d77655aefbed95ff7a46f0bed117b2cfbd799c1b196fb02fadd01a04f910a4d2a938b7fbe9d5e71e56d5c6b5a262d4428f35f2562edb68f153fc3a07b87b89271807b842bdff97d277abdae5fafc1f7c30484ade60b5c9bf8890e46f4d69c761a875ef1a04b548aa513bb5a6676de4eb4532fe2 -MD = b77fd3d5f25b7a3c0e42c707a9bdf225a8e842582308a73526ef4768f497f47776c4ea0ac5c6d1933946b14907e58dee - -Len = 23992 -Msg = 003132645e3026f6a2b9d0644c16e5e4d1bf8b53a51f0e1b999bd45a67d193418b1dc1ba55624c4d3d078c44763f760dc68e12e194892fa343dd550bbe92fb035491fa51c76442779f3ecbd7c43bcf1b4ce837d492065361888bcd134eeae08f0394c573dbbf6e3c716677675f915ad60dd6e276c620e21f11af26bb3e60aaab3f2f0a66b9fa3a635b88773a6fc97d06ae5ffb0d595e44a38550474bb77dc120b069b1738a9d0db604aab3981b6ca272da8c6ae27248e1b58d77180be0c78db5ff4aa2e276314efb15d713cb8b0130e33764173d3a67211fd12b8142e2c87734d4dac6fba43d67fb35147f1ae8108f216defea65d9426da8f8746a3ae408e563d62203063d49bf7e0d6bdfcc5a2126f42535cca476622b17ab5abb390f0e400cae29424a68ddbe4c45e31b2a08bd5f24073fa340394dc53591e65c888a62f1f504f76c104e82cc2c84841b7c1b6ba178ba1459824b8da1ca531f356f7e8c5ee77f9567a016bf51e77257c80abab455b9e7bcd4b2d4aa299e980e2f351314f1a9c70a1d42e91db545b863081b0e1fe1af3540fe18fb2ac37809b9302470831105855e743eef23600efeb1c4f83f34ae224da7bdfce997d9214d2a2182be6125c1619a56db4f59bb0aeb47e5ea747b24dad6f9fba5c678d2620d69eb98243497a602c5aa6232472c01282f5137d57dab9e793e9f5cb9561601f17c74aecb86ce7c11e7581bbf761cba5d71f2278bc1ac38de7f9169eab80dc6a06da60cdbde320b3509474e1f6df4fe3113ae04becf8d6eacc4b91482261f7bc34468f97bc52b1a1731614379b41a954c1f6f149530b8098b13ffa5a928b4e60107a1bfd3c221735e6a8d42f6d4f847579c1ca1396b93d125764b63864734d103c03ba40c5d7cdcb3b9b392be54f4dcfa939df1d208888d1ff48597420a070271761df14e1ea41ebe28bc7cf8bc781bdc0bda4c8790fe072495958904fa9541f2322fedc08e020126be8e48cd95ebcda60cbafc808a5d05da626381f59d46582efb59e28b34fc4c9483123e6465b5baff9f2848e67e0c50e962d7c73d7e830dced98316d698fbc9af8030a5e6b73eaa90ca0977e1f475b0fa9edaa20322b22a7ad495d2ca43683e20bcd1c77a10ed65019746d29875ffecb51c525c6f133d75d9f5775e8fbca9748e3fdbea49fa2cb2f90ec7a1348812cec1e6293babd88ab7944312024c8b2833a21238577afc635b2036742cdcb6161cc7044588dcf903b752c64c062a394b42043cce56369ff8261f1735bab986739f6e7c908a2dfe0e3fbc870eb1504d7c6b5bc5872ea56954dc9eb9f394f380921f5f58f08bc47015157a8d414de64f22744fb64929eee4df4544259403b12cd96441a04fd1c9d77f0233e1cb2016c8a4268a16fe8d3a980128ba62024d1b13b135bd5a94a565b9b4ce8f899673063f6c49b1ed8da3b00c234ea87823ba5abc835b7b90a74fbfa01c41388f888dde3ce1a56f44deb379c8ab80b470e19496afb59f2249701701131f23d3fa8bb8c7476b016922d905bc54038489512321f675b1c75a8ed645509b253b0bd3863ae9e972274a8f66e0a2399122cd23d0aba395dd9bcd66c420d7bf96528521605c6ba95eddb8936d8e53febf2429eed278c597a3e521d91ff1bb07da30ecec0366751098ec5b37d655f62bf45044bb10d083046a6bfeefd00027fb599de63d56a031a5861cdd82897eb3489770c79172fd056399f60db1bf9541247b611b1b4151c5f09134e37d6e50b3de124a5979e046743c9a4ef526d4f83109a943358eacc3597921fe182e6e151e74cca7a37a42f2f818d43b5f56f8702032490dd99e7f3c16c99f40219f6f131c932d4e4c9c804ab87daf85f34a11473628c585b154a205236771c3a9d85a94d3c29d09fde78396ddf693f3580908c39a72837465b7fe66a9db014f56df18de6e89849e5e64311e8e08e84f379bc62d7598eda19dcf79a6d0aeb6acd0be903913704ad6161a7329f43d165f370932cdee2369d600a5fc0fbf67f7a1c07da9efeb005779ce123200361c85ec015a33ea2e9a61d9364070e79f8e2ef7ce224d471dc0144f2d5254ec7e2d9ebd3c96b3cd5c853c73e8a9bb7797abc276a1b76388d139e71fdce4c233f1f9c79c91c699bfa16d626cbee6c707d0471be6e243d2fb31f139b382cf651db907694fa8f1cd0625d83b8c5f017adf72e9a10f38cf84e8627273d1c81c24f4fedfed9f281f36ea0f512f9b7401be46a41abcb94c6260978f44fb4256d2e6fee70ab954ba58beb5875da660a4ef7a868e61d4abc6044e4fdeed3bced3f995859d0f373605a54cadb78608a498d296e5594651ae4dbd365977f7993ce89a18cf4876ce0cb20dc91cc553bd2ff7b2f9ac2d519b8a899600fd83ea7f563cbc57240ec8e5a068991b48d94c2dc96a988d22310b1a07239695832a4c54e278673ace1a8ce6b8d0502b7a1cfac03a998a39918efb36ecc3c6db3393a780a943a3a914924a381d913ae1f9b5e4df492b93e53f6baa5803102cbb55e7826b7346798c3d9f8b4397545f250fcd93f0c0c9b87975f19ee612b3d21d304d667d0828f0cb9268d56feec1c8e0028c8d5d651a03de7b48614ae253c0ea0deeda1e2f92114e5b16b324e97f7cf81b195c8c01c77bfa99977bea3b99fd0834f266b6b22ce3fde0d0aaca51378357a29d87e75b7728b617067230e52d9161ed8092ad579d6ec168bf44c9ee90e6e3df3f97d43dd313fb3cbfd083a7b684dc80c0e76be78eba803c0a08898833ac86192813bd6d8243af52e71c4a4addde6034dbec5829a6d024a5db7e73e7c7dd279a7f8309b42dc0bb9fa9dfef9749a8d753f92adce78eb793e9572fedd2f582aea86d7020da7c93086c2ba0d953a2ea2823412760e7ed77b750a8a2601365a1028c1a616aa716c37d0095e7704992aa3beddc6d4af26c197624f65f3570be450d8eadde4fe3a45801a5103d1c40bff2f8f8f28404d0b3a3baab68efd2b2a973b6f54f6f3755cd5b7ea1c42845ffd1c9478eaaf2f44969206a2f27d9a1a1cd35e50b279d8ac63ad3db3dd832534f713810f52c41842536956ef65aa50804d39282165eefb0fe93c800c174e3aef847453b76a1f81b2bc40cae482adc71a46293765f1bee11c57f43d575c2c2bec2fafbb05931a02024b88c116fbf05434a233ea72e872015e3a64a41a0e757ec75335f57e603c0fdd9bd1e81b240a8e6bcbd9dfecbca0f251fb1e82f8c0e2a9ed8997b186540e0190f79c9e658d64ec2c3d9b8637d0b43a7424822847f5dc43db4d556dc1d0f89dc91949526aaa87e3f261f95bf8d72430514120229c2fcac32d18ef889579941ae26b78a2af0dfc0c5af363ef8432897a55db88f069d146ae4f76d6a095b0593f7958ab1da72a29cbc24c7bbf8e755c7f1e5e1d10357cd87baee19b342717c041fa7b4111e771a9b8c4e7912a5c1205b4f7436d1093a4e8a1e7d3bdb1ee1261e8e24deb2df496e449df5f54de919b2dc29d15f96fe8cc0fb776e7beb84f22a68add4af9d032ec71f57e1e374ab3633d2e6c50328cc964a632c8780ea5bedb16ae27ed0d9746f4db523d9e98dd361cac3ee18ca9059a01548a791f3e08d1ae2ad96ece86e1853278d67a6b2a248e29f39a9925ed58ff249354f537bd501c1e6b832e4a065d9247e308c10e4baf401dbbb7ffa64ff54d30daf8c97c1d29f2ae4131c2fa0c59e287924fbdf28debe06a6d2d81a8717928d8940c6236dde4f9d0547be958f964ea941f31bdb25158e3827041cb86d243066e66f65c02602f96171db7fdd15e1d3edfd2453cc84674ce087dcb39dbe2e16a74cc4d136944585bf4f57c6d1dbad143dd6400d79ecdce046eddf0591233e2c97e2c8734d60afdbffc744fd378902f9e0f4ceb0ab067d33b282977a5c435a5a80d102b1cd3248e46903298bd8c7e86a207e56a42a7a512b6c6e8b7bc5c88d88a840fbf47db1198644288ed87c3b684f439d6150beef60b1bbd8436e9557dc9e585839a5268629aada61fb4cea9089909278761e2f0db3aee9e848bd949b5184d841462a9059803971d4f94fec6c541655381d75447d51083cc821ce8a39f3227022aaed83d1271952a90f494878cfc7d404debdc6e742a9fd9d560b3fdcca606823eb54c7962534c509c6a2c75b048c5605425f7ef28f77739270db7b2adf27076e93c923518270111ca5c231bdfb4e2562d0c131473f5ce8ccf6a5 -MD = 1c471b3e2b5d06a6382569b12bd43c6ba3c1c7e47ff0aafd51d896fab41a58e00b14250aa556a842161df9f649327f64 - -Len = 24784 -Msg = 2b23382c218197e4c48025da42212e39effa3e73452f40d5299de360705842d4a258c30dfe6f3f92be7e646c9ce9583494489f70ec603f20725122930510bb7f5618ed51f05d28c27682d5ab2c4bf41ab95503a52c0522fe3cbe76c8d457cba9cfcc7da10033989a75f23e40fc304912e78932b90d063299114ca6a7e713b87a93da3ca434d9d842423868d2147ea045a54cf355974bb41978637cd7452ecb192cacf203963830e365ba1b0a7a1f41db7b061021d3bcf3a6fa6bbe01f68e4caf22a866652e36e7a567e21e9038f974fbf11f4fc4c84236661ecc35cc031d8363fb38627302bc47afcf173b0b56f681cd90ff79e77ec3c4846ceea9e173c1b75e41c3acd51db3962a25c03823dafdaf7adf0f5631fe28e6266c3ae2e74e6432c77bb10d3284011d3df247de81cef5482a67b5ad4b4f5ae475a716a7879ced3ac732694d3241902411bc13f5cd39c89204ae5a47dc79400698a4ebc16966441886ed55347e5a46f3cd0e8c45ae245dd6313e67ed8d85c194b7eb22f934b451142b34dc8abeda0dd19a6d1a95cd969c5bd99f4265067ac7d5fc052115908cfc75df8f661699c6cc08a06325afd2976d6b22575577ee6039128d7952dd27f82d85c9875ba1b8286bde06771559642fb84c37f007edee40fe9392cf1c1b9effcc8a12a324f3c307d19cf532525c2b6765473ef2bf8ead2100a03490e695a0a9c1cde16c27d4616ce889941a4480d1465ca460e3e721d40b26819a431a14d3fff4965f69cd0c3a5e97ef0cb9548cfbd586abc44de66f0a06587dee701f60df084d2db3227e62f7e5c6148497e84a531bc9a493b72440f81b7edd559f5d416dcdb5d9071fa3a040095d41253a6a8081200ed6f4aa095b455181eaf9593c7f255412e380e9a28cbcd345be172c40f72dec3e8a10adfd8a9ab147e9022524e1aea74e934807e5ef144a64d381f5d477fe883f080e4868939f41b925988c7d31b1ce4f318701d290f077a3c88b1b8cc89cfbfb981703b23ffb0bbfe5e115af35d5cfff056460d339f660eae45f28d2b1b04d58825367435657174270084822b6c3b4445708aa4fb0d10f227122a40dfbe286400de9fb83a05a6b280f33ad3e7b2285086e9b6aaebe278c31b5ff15a46ed9af9a820247dbe5ad115b0a8bcd6c4e9b4832934425572ba1dd01f91c0501d23ed04e29c5d4b1ecf711c1a9372f12f5d607aa0e2b65b4bfe60c7984a1fb8befb8ef434a5b296e7ee17144345f5b9a397ac9582779b12c429f2180a0b780aa8df016632debcf7b63133bcbf22dda6ae22f9724265692277b73220093861bc6738d4c951a9e4c3e6334773d2cc733ecb89f78f652e98f0d330b19e0a63554476a389ac1589c2a2145ec2b842a55ee86837074b6f45b3047320e0d0821ecb3963a9906cf300cf08bd3e56187340094a20a4a934c54d3fd3b4025075f4cd5c119ab579ba8ea1627e4d3c4202e92efaca716d6dea0ba7a7f5225f80ecf6e150539841b5e32cee456930e3471618b4cbefd6fbb5c9a6e783df4a82e2a40d1d7075e8f8c5956239b05024cdb5a08683c520cdda21523b7f4bf8a936f6398bb4150f1925393fd3366bd985561e60b72e9f13b28331221df168e7aac65c2c0757b67585617140d446b04bdf06f1a52ee7b22f417155a7e2c08312ebcb64ea047aed4fda381e5709fd265d9e7ad00c6271a6e9f73f1f520e7ef300c8a0a10207802204641390d0c8cc4655400c29f4d64ec5ca2046eecf157f6147ee00a0e29529ed29df7e694cb52698e970457ffd0ec1c7466923546d7c64264eb845d52a11bab72698e3083933be86708ba13293808d03e53e5ed0bbc7afea8bb3face4721c508912cfc1e14e8d697810ec9f246b003143d2c43f4487bc506955d99fca829db69e007f3eb6e391164a1860a2f8531c660a49f9d3f820d4602d231add0ebbe604399a69520a3a8f156486dfc5aed7a4971b214a502f6f0a577f8cca0fb8033e63e24a54a3e63bcf8e4ec331b04ddedfeeffc3805ff15ba65de4f8b0dcce44effb227807d951ce98aa91381e0add5216903d9563a747ceef99e6cf95ed5a653ff3808a4b9d54db3490b44c6e7b671a91a85d01bad138b02e340c7a41e9634e777485e9e897f64ae96a3f66e8adf11e985ce86e4f84cde7ac56de5f7c79f2e7dea5b7fda66e3f03005dbbf05645864673d46544e8690d5cae25e5e70e450e18beafa12e4dca37eec093af517eee2b7a69395cea4e2700f77fcca87abef4bfc95db9c8e5a455e7f47334a3f1284eeaa2c3b355ca4967aea16671b081552f0de205ecb68874b456fb5f671f381e0dcaa6ca69d94ba0d12040aa3d83629c9d014bfc70f28185928cecce55ac8e27d4d46ec3846fd51d0c5dbd9457ab8758e7a2ec8a6c04369f9592b00626d15b0a4b0ee2f92ba0d086c16d016ce7b05654b4f9adf90875118a656f2d50011707901982ebb387f3a4a49759f37a17183957ad0c778f6ecb780dab2b4df30e05fa81e6386f38c0f0ba3f37287a050d6d97287ae53096c391d5f20fcff73977239ca55c3657d1fd1f781f48e28057f136d890c28cc254324c8fff3862136861f956c321868cc66609470b7390ecb6ecfc63572d071312e0860efdcfec88c9f6108ea5dd30f55f253590cc6038a66b2646a24565600d17f8c6bab37b7640a45eefad11393a79e45f2bb92ab6e595bdc69cfc210f9f97ada095fbebe5062241c11e1cd0dcae029c3f742ced1e9ca3f6f486d9b5d6ca981a007a396bb5a716e7462642aa709377d0ea974fdd3f67b75dda8da1c75febfaa742fddcfc925e04df158e86669af2bfc88b1c8cc2c24db9399d38bd205509a49c8ba64c662435d47257de52ce04d2c4cc488c4a634e5792d3681093885e2d7e4106fef17114336ee5349f0da8563b6d24496ef0898c8b2873619c8cc7225e70ddd88c34e50a60bb83d3581ebd3736a217b74ae8fc23f36460b06410a44ba462ba2cd87b89adc5a1935d91efd550c94beebaa99984bc972ee47ef088e87e073c1e286b2f26a669095cf9d2e7b849ff51f279116be9ff7d6f45f3c95a5b6590e652f4ccb9849c55dc27d0a46e2dc9dd9a681d0dc6f293af0dcc3676f0c5a846489eb9837f6b388f003c0a8eecfd786d0f9bcd2212692135f2c1707fb1eeef324b499f19eba322215fe3ce19c9f000b698d2b2dab7145015046cc86d049ee15ad59dcd1564f30112e06444cb6ece06c01e54f4bc1dbbc9592d1467c6539c26c8cfe06cff51257e6b6a06952f415f3594876aba50ad2834095403741505b16784225ba3601cff4033e713e9caab6b3239bd5c2c1fcd22382b617f18df82a54c94b4569bbf2c4af0723ed1672615b9a8b7a67274b0e6707dc93bd17bae31407c026f197ba4e9cd3531578938cae5123d172cf4b78b61dbaceacc41c4097c49a0d63aeb6c97bb52b8771a82833e853e996036292039a42b6d97fb161c79ca8a5f16fc1696210a9f204c6f06710b5b05659aab5ad441192867d7b09aaa8584c962cc9fe020c93e7e16b83e5b2ab8d12f49cd75cffe2b279943b2d31397b510cf50ff0a923318bfb442c46fcad5cd4d83ec027bd0c4803548a8304dca0a91d764d2b82573f695f60c4b77ea9b9bd239caf741a5a54ec7adfb3f5a04072ca2414f90fed8cd92c8494ddada9716a350fccc1190db95c588f67bb037e112246fb75a31d90be62e39213e96f35e8316cffe51e3f905e9514c7890a2cfcc321b809f4b5e51a608f371e7a928cc28291bd5a72115830bea19999b01bd2baeb0395e62ebbe6f917909f70154376ddb51dbec5f034e36d5dd46fac798aa526dd4a5906902fa3ab5819753d9076cdc61437d9b8ec1361b4c0dfff4641b114cf3e6889e1b58b9bbf86ac50ed58c6f23a0472a6b9c21763956c16d11da539922262e0911dfb4a4f8437abdaf5faae74a82a50ae2f1ecb699dc40b8d89108ebdbf0f451701fe062fb7ffba4bede287c57eea4448af5e99d41c7d307d1f202af7f387f874342a29ccc9233a5c3bacfd754cb8d01eb11e2d43bfdc2828563088c17e618d413b0c3fa71666be5475a67a04803a8688bab9d038f6855537b4de42aaae1076066d00b23f4e1ea8fd228b87e3c7d3da2f42de4d143efd49f3b195c3240139452c70c41c05cedfac9ea8b891a372194d6aefd7de6617986914e2d394ce16307d3bbcb2f78b271e1bb19eba31c41d7f52d3f8530ebf0f0b44e3bf3421f96b9a70acc769bf4fd54e88fe6b1cf2b6287a7cf312bc788f93ba6018ad1415466fdbd2081734edc4580576ad943d3efa319f3e30c5908648342a4d0c431fc925a17913c622b10d793dc76767b0a77120b7521915676bd2896edf6e3707a -MD = 4d241b96609427aff41b2d90417050e2201b9ff5d7cb32852ba2f51178f7d4f6091c89a004c1a11a90f65d24324e1772 - -Len = 25576 -Msg = 79cb0302813f43ae79a950e0167832923a97743075e4cca8cde4fec1bab5fdad754453e172c0c4242b4e2ee620feb4d41cfd1ba9b90d74472633fc0628af404c5f31855ecb4a66758f21bf15f467ca9ab08d88146934635475e51147e402bb83c0fc5f2093c773c92a8bcb12999dbc0c7fad82188b41dff83f62052cf494b67b1f0caad0d21e314786f519881786d25410c6d05d291b315b0e11a05c624f795b04c92d159137e9182ac5721d770c5497eb413b8c4aaca1a4695ca980361a4b4cf79bb298d7fae2639e659e79c016890099848b4df7db76fcd9aaea3f76dc767681eaff00ac4f66516b3b6545fa8bbab4a1f988473790fa8ae56429422c7f4000291edef6181ebb0a18b18f292d552fde8b07f92312b3737715f02f305feaf213789f1422244f2ab52d2de3cc625b30a4e015a888902d2aeaf1b7c4b21805d3d6f5d66c2bd7cafb7b32192ad7a185052e278d5b1fbae4670c0221af705eb82d722829adba3a777683b0dc2cf1f0bbf5a5e8d6db9097c17204cf97ba1139eb460e99019e76533ee3f62fdeb1c359e54931ac58f0822fac92fbe07fab3eb18668d3d1c709082c0889fb358781f5e3eb4af9f97b619d8b8e1019be424b9ecf71d9e957e1b417cdbbb1bb4c3f632e96b53d265aa7f88ab24d3485f04962da9a95e177b3b9674c3c41a35dfb6e21167b2c6ddf54447bf1acd34668fefbb8991bd8caa56eb5ec4f8380a70acb7c81569936214d71bab37982068ee971bf14845823da9d0f3f0ac7aa6205ea42d14c96f9bca098387168cb3bd05431d0ff40425b5f5b841ebe885cb7ce0424ead5497da1a733e731d2628fdf18df67a322027c2c729385239a2fb7b4abede14bf142b49bdd2262e543686c77c678b4739023dad146cbc5a73ac780a8e30848eb8bfde3ef48b533db2d440a0ac16740c6b06b0354c14a6f3208185e9c5d9d82540d44b1a3cf347f9bf9bc12a0f3f43227eca1a0bccd5aa94a6be9fa9701f4b60eddddc6c159e671ae0d992c414367b31bab8f581251419b79cb03fca1b7550d9f6590cb50d0142e9bd3a2fff69907ea2c56fbd45d34486f46912f0bc26707af910b2768591b06e1eab1a134c6dd1d00e153aebca560b74a392333cf03f953c36c396844e32204b024115c72baf7f11cc20b70b7f3bcd656dbead7f26b558171b6561d08f6cd56c3d05a9d62d9d0cb6758e6086d4e30ecbbb34ee5190364d9e3f9ca0c5b9a04434376f42aac2b4ef3092a4d4087bea443a14ab823eed20ca23ebcfcfee6d8af14589f47cbf7b85ab029c1a6dead4b00212f268e5b19e03626ad8856ba51b7b61229d2bb4aeb89dd4cefa35aab86fe2ccf8dd139534235cbab56e43f0a43400182df97b86e31a5bd0d845ad26fbbde1195e4d322d410dab17a61581fb4647a78afa176a6fe7114e43c106e75f2f3f395ba5cb2b0a52bd6d2dbf76c5f815d6d04e098f8edc352df3820ba65aafbd746a1881cf84a903c31141540a96539d6218b5ceca4f5857d0da303abc9db540fde1e454d2c5a5bebf3617263969aa4769ff66cc402260b9aa60c2b0b216fc342c4f23a16d747cfdf25a03888bc6689e6ee2e58489be91f50b35ae101f6ce1118fe07afa08079b4c1cfb9b0d9a132b2ce161a68a2f6a487473a776db5cf60063b9643ec12af58d238f793227bcf64e5d420a1e4f79cc10c28464a1750348c695093903895ed4cf0eda718d699ce66eba313ad137213a6769bdcbb27faadbd0402fed5dd51c0bdd887e62f1359249e8ce1f7253e38e5bd8d4706b2e4dac3589df6defa216db31350afbdc023e35b768f37d4f0ad74996c19d5cb179819fdc6fdd73be64d124bb6210d32b44c60fb54be4cb3f8a84cb81de1ec34d289dee46fec4b1e83a867120e134850f1d7f88aa2dfc99b2477e8c937ae3547ccff52febb31fa8eb87c958f84ed091c600cd292c7bb55955c6171542248580eeb449dd613968e936d0fc34a7e79f7a0e932179a2b1a99a888af0fe24577fc91189fe6f1dde1ac358aab1acc657dbbe37592ee2b36c43cdc91aae9fa0a03c9d73c5755d982dbfe7df896c29ca2c2fcedea7580cc5080e7395d972824d8b369e83db514156b4c2c729d18e2429b1063c73221f505e11742c8d5c1f3e8185081cc0501482dfffcde1c627ba247ba2e987833df745e5152f490e16f73cf30a2bc8b7a831ca9a5b2bb842f052b3266e64208d7f6256008f7a6996ae8d0608971bf2e8682b612c7386bb1ed00a58b06fe098004b031926fceffec567531248b8535bd10483ef0cc5497ab82b238db043f97e7a453c07ceca1a8908f5ebea19ea6c43eff1bddc91ccfe77bd8640aa8c77191459e28f9a7e836488dfbeba1612b9b14bb3d44ba271f700228d65d467db75ca2a2da77059acc5688ec8464ffec982dce3bb10aff913d0191ba63e712df3cc7700740880cddfec910b4111003c84f249ac743b7d190de483b3a69489658be7ca37bb8a235f9e85787ed8938d27fb6481f66db925aab6a0fa9afcfc9fc6fa541e4072a0ea875f0c896a0d62497993760062061e2c26a491c82217db269ad59dfdbb27e158ed980e3e4d4df1c789c3936f6fdbdf03155e3376f995a4b0798421e2f849cfd0faeff711a918c689d1224909806d804cef5a02a181d50dbfebac9c588856c0e527bd53adfdfc54f2f825f3794429865c1d1e9bc24b846ac769b549e90bed79280c86906dcc7721a567554f391bae65d337124b43c6f250496c14d6fec36c3cfc01e259db8507b1239726a8b3774ab324c5ebbdb074cd32c86b61a0147f51a0e3b0370c71c83c87c010109c9307acd2d331f14f92e56396c6f02251c4704c2971802b24bb06642a3d5aa997321d43696113c99d658953f0b792bd487946aa5b280a054f21b04cfcedef68252b588ccb50d3eb0392e12ce53cbbb910cd72fa9a79b67bc8406625844446c2d2e92a079d150acc3eb57d4cc8a8e3ac371b85cb8bd90de53c9188ac64e2e9500cf60232334010e39b57ce323f9e92ed17fdef8b93e888d8188fa83ff34c4f764fcc81ab42449ed7a5d4548b9e8052125fef20b9370aafdaf8b5355ed3e301cc27f718c13ea50cfeeab590a789f099a26b69b9e309c1fb54398cc0977b4978c801e058128ce3d3ffd69613146651e223c6f82b777090e3da7780da584dd24cd08a22902db1738c20f5d04c60d846c40cff04f615001a01e41f3bd34fe02fc69c0d28715140f6be28c50ebd0b4421a7c4702a9a1a3cafddf7bd084bbcc6b4ae81278c7c5bbfcfc26dc0bbe5723e8515e0d6d388158ad4c08bcd90c44d66034d0655a9117b82713166753246442bd386f87f9a50858f2b6226bd4fad60429e2ab20428b15f3d8d93b95f3c5fdf90bf8361e6d983e89e162b4f28af97a3e0d7d00adf660c65557751ccfb14a2d3018b83b3a93b82cd4c27846b8c3af376c552d58733eb632c4eb10427b575bf9cf2ea1074431aed921dc22602546c415764a193adae4366229ddd23303ab9f6bbe93db21a210214e5978868ba1dde11c44316a2e4aae875d6d75e279cd76bf8ae58f8d11bef8ba9162decc4e944eae55be5547bc2b66512b76fb699c437f625e2c6cdf60ffb121ac26561d326662d2c7cdfdd96de5d23ed52eb78e22cb9031f07c70fa95cc02fda68c28a1be7fe1f67a577048c8e0bbf4627cf17a95cf6fd447bbe506388fb4f7887b9b7f7a4893c17745f7bb5685e81bda47f0547cb6e5f26bd3112ad2af8fb659ddf8e0ee2740dcc580da5a9d3a235c4679fd4560e8ba3365aa3d8fea945be3219987eba385afee6cef614e2768325fadf96075c8cdb6413c2ab05d08a6e025e99790c920cba9a07579d4bf7c78decb17af610b3ccda1c1f83ab4bbb44de625b8bf5ba1ed5ff69ae7087ad422d0ef488c8348304450425ea2c18fd177f1348a96f9309c93ab5e83ca839cb6a3da2d80155d5c0b69be62be41a98ac8d8fa93fd8b2d56e29915a90327d1828d87fd6018b925e6c5327fc989ddd9edc860d0cb26a043169a87079ec405dc748054a04fbb81c32e8528fb3f687f3900f895dba4acdc23b8ece6e8066b6c8bbab7942dc30f731f7c74d19a8c022db10b810183e63848b584013c20a9a364c69b5bce0b84bc9a2218bab8c57701f129558b2c315871eae2c10114174f12f67560948ba25a6bfbb2497e62e2ca0ad389273d9d4bc300cc90b914f334c06029815289525a0dc4a0b859e8595b4bc8dab9c9bfdc3bef8cf6a8b26063e1c33606d0b663ab9b646e901d8e212496c3e00ea1833a7167a4be6e13f510eb86223c934bd7491ecd2812d3c731514bfdf9fd772a9dd6e539aa3e3eb7ca4a1489a319dadafc643458215772a0899f56f6b7c51e3a5ebabe17c8b36e7e783664530f75e3666cdc74a417e6748fe034ceebc3e00aba0f0f876bc8c5044f49fe654c2dfab4d570d86719d266e17b7c383b43e6f74393f8fcc59c701d0a1183c79fdcc74e5711508093201980c14ea6d22366e8b2d2 -MD = 1405434caf2b81a133c800119e1016be5f57ea1baf92d681cccef9d27e1a954a2df60748a19243ade40d0b99554dbd81 - -Len = 26368 -Msg = cf2aa6385f84bbcf589e9beb147d02e5d56de17fa8505dd38f371b89de2fbb4de65ea280d14efd2ecd8802416d6579f44b217c8af3317b3ffcd6837f78f3bf568f1c3f2866eff8a246a70cf0faee4c3078f3fb27c4bdd53312bf50812bac2280118c0396e610b4110a22406084c18283a30ce7c0e49c769817170df9be02edb5b6d7783319583a65622227f9d28523d41393c8bc1c77635454093f4efa9f27dcc4252667c670918496cf4724aee3380a11b1248332f6a55111ba70e8a728d8dd849d949bb7ffc158ee502b47de83c80fe58e857deec045759655272f8d4808a03e684a35b2aed3c7b1ce58cc2b0cdbcad75172121a7e4baa2a00ed8b73a5c00c3aadd09f8025cebb297058195d2779232f2374aa7cd7bdd716e3496422e7070bbf95af3fe90bba1b9c5fb1983c7bab02342b12adde74a5e4a328c32263b7e68516486e7fb408a0cf53c2eeaf8fb1784f2f92d48306fc0ab816f4e32dfcbd646088ed95c6abc687be96c294c82070e9f2687f4294bc18f53dba7232edb5a089855badac7b94ea77d2ad872d4ab56105d4271be548ca706d5ad6c737cb58085ddcd7af3c08381f78f2df38419d172bd4dbb48d4408f7ab7af7b11e7a2dab9fe94d461cccd45f0b930675fe56290e775ef056fee73a0a7224fd949d847c780a34c1ee1be547d056cff7b700f65562edacfc57965748cc6c7452c76cdc2185f4461e19d50ec955a935abed67a88bda34c5e5fd7c1b98054271df92b40a829a03284e0d71cfc2b4accb0b5f5af5333ff5b19591d9bb947c9b248c3d9d970981dfe1371218b09ab6069bff550263b359d779f25ad4c0a2fb2093420f4e0a1d013179c372f23ab9235fad7016867c74f08324e6a296b12c4879c8e751f0eb25e1a1f9d97326f488c3610744eb0fc8decca0ba58af4716992c4dcb644caac38bead668605fdd676d5eb2b3651cc5ce5ab4d7442fcb0d78516f44a2a245a519b6e479ce427c3e19d1bbfab9b9f1cf164e72d0c8553c135dbcd90757888708750e973134661372941da3e21f2ab1562823cc3251b14a7f5042323ef2fd59fc5ffbcaa7a1b46ba060b7de11ef9fa6818d428ba6e42b3f7ad64b419179eb02a960e547831d14cef10309343131ff1679cc1177d38bab612b793fcfa6f639cb36ff34d46cb06e828d07796de7eb344a656dfa57624d19fabbc086a42870cffcccc5503a0a63aad09bf47150dd27258a6ef864f4fa335d5051338888bdf095dd9239a240063db000435058a6bbecba1ebcf6b717444360ab165bad430d7d73b5b1e390b00846685aafa596372843db4d76ef5a86e787085532bf5e9cc11f51ce504b8351b787bb26047a93cbcd327060c569b70a8c073e95cce8015d81de176e98fae4eabc078fab6d58b62a52c4619fd0ee356adbcaebb20c5c004cf4c3addeb1771944becfce3210c6691b5efe9652c0053c707bd8f5f51ba5c132c3d5fb66c24a8c2766e55e03154c146899eaf8c1bc3734e2153946a6214baed6961de94df3fca35a5c532966a5721dd7ad8f6d34ed0a858950f6c40d45d42d0213a160dd6e14c8a7472115a3e8c1ed313ff5def27a08982dd5155971b0caa87ce56b465c581a62d4d0550c0105c0ec3dfa2534448cb9d3964ba1ec1c8ab4860db2838513dc96d9aa9ef9f5c924f882c5832655724ba49f8b5b9f6454fa1b2f7d23ef034a1f1194f15a14b7446fef188f85002bc4de5165d5ad19ab6228860b94dfb9aa494c13fd71abaf3cb70c2f1465a6bc9d816e488b3ce816a88e3d7d821a8fe9605789227bf13ad16b6d2340e00d8e6192f322127b88b59f431f6188fcd6da850fbdfec8763bae822caddda8e24fe6f7f46023369b81bbbb645fbb30e19169979ec4d58c5615b0ca67be61f184f55687aa11983c55efa372f39474fc9913e326f5b133f68448e8b204e9d8a22dc585179c4eaaad109914ccd807b3758c24f13bfccf428f669cfd41ec766a4444891cb2b25f810f3348b7d2fb00a121228c3bdd9b652ade65d8988005ad3e5e3307c25dd48b44ed28c4348b45c6668ac4126814baba136ceac6607538d57d7861082022ea1b1ccc56d532009ca32938d88020e8411724bf5b2cfe2a6e384e1b3653de08dc57303625435937eadd12b2c89c0d6218c4856121d319a78d1cdacd1ab2a3179287a9b2fdd5523a15bd4b80fa2fd58927095fdaa5835af27eca491975eb1758f4f3aec94654c511068bf92ad8002066572edab04e0368152a8ac284afc7e3d2ebe36801688959c2a68f4738c8d997ff8e7a1d6d831ded1878a46d98300eaf8e5d9efee5cb39b757dc115b333480e15eb5365198ae978e014f5f73dc61882292346d99fad82f87d78f585da383bea78bb5ab9dba363af5da9904fcd8a8fce5e8569861caf532704ba9ad760e1d5b918c741e2a5a83cecaab3ddb2f156e34a098ad677ddc8b091aba1158cdfe6a1f466bdcda1f00fd1bb47a232c351a1cf6faa81f2116b8037d2e2cafa18cfad2d26f30d426a5350ce85c51333f366f180b9b22961053e7c35654aa6bcfd88bbd3bb3e14349e47f18ff6a37555b599dcc3b2c0df97a5df0355c333a2d2cdc379323bb88138c03698926853571cac62b9e4d557230a85b5bc05674e7ddfebd89bc522f2c2b372b78c72655516fd2a6a1f80bbd5822e276b1cb0ebeb6638ea606a090b6d6739283363ac7839537bc2188413b0dc7b970d678c04abab1a724bd38a7a5f88dd3e4342a4ad0b709b1d05e67e1a6ecc8dc99a23b06d310df92082aa63a589e59337765dc600b98b4c65586c64014036173a6037f057167480a8116d8bf7250427b913fd5e23ecf9e5c95c02dc64dfa9c67df20ce25eb67f5f8d8a957a0bcb551937bea9c3a3204cf5cd63525db1878819e8c22afce0bb9ed45560aaa43fb768d637d8db9ceafde50af610c35e73e251701f530ab68970538d740625912fa3affd4de50b5087d05283b7e6ee65288aa66786273495b58f2df98e1d8ed7380aaadcce85c174f63225fea7483bf84bbaf76ec1a12110f1629e96f8095edd0546ea134e1d9670a2addfea38d7248e5a2db504366368bed99525e4364c0e1903f2de3f512ef2ea39add0b4d0f6409de04d7fb678e07405ba81447fed682511b098f79f5c3c4f2817bcb91d243808bd5a84a7f3edaacb7c20d17ab871e03c6d97a3e6d1e3c833e0c954e951971ef553357dde5b2914e788b8e0492c6846ac83259dfc757c45297acb00f210ae1d8ef61d93834aafd140c1cf48304a350e0dd8e701d8d87a45987c993b53c8dda64e2c5f602740d6427fadf063b0a06c98c8f55859dc99825c295cb07e9ef8aa6bbb5c976e4adc50faeca3a8ed5abd7389765ef610a82718db24a1ad45341e98b04f0d42085e8b946d2059752f8f0fee528e7c4cc0ac1fa24532c1ec29a3a92d2681c4dbd8e2dd151bb325d1c4ddf6318689e3c8e458d1b34cdc5409867e26ec20ec09e15a682f57790d9f4b27c83ef197e11c06e65eebc03489de620614263a51e642ef076f10d017a82c4dc2ce1882f93c9b6350fecc5daeb3a7a2031615ac1c2906516a5810137a0b63564050317a4cf4c88abed901e01de2662617e473c6020cdab4fdc3ab9612bfcaf11b1f085be59249c98a7e1b0c04ae908abf1fdefc860a26862c3251ec742dd9aaad5b0b8c65ad85cc4e5e7615f5709d2c6328a5d41ab980418014916b10ee05ef81c4c9a03f9f12ff74eab1a252c102a79e8f66c152936e7393faf8a66b68d63c32bcb12bf5ff67cf88a34c45cf286778dbb4a068a01047a8d245d632f636c11d2ad350740b36fad90428b454ad0f120cb558d12ea5c8a23db595d87543d06d1ef489263d01ee529871eb68737efdb8ff85bc7787b61514bed85b7e01d6be209e0a4eb0db5c8df58a5c5bf706d76cb2bdf7800208639e05b89517155d11688236e6a47ed37d8e5a2b1e0adea338e4a5c475241f2520bbfb9786595cdba6581856142afeba0777f6f751689dcd05fdf8af79191d6290077cf81682a321e81549981d32aef36cc3627b7105a2d8d10121db8def9b451408f046e03396b469189c596c6c0e143009132407528c7b2ca6b7d52e1807413f28fbf06ddc9607abea97367c279a90d3a19f8d8eefc9187b473138d412efeb73eff6a109fe2f902303b0abd705e2fdda354e24623dd7353f7b14531a60b3a854d686c55f08c1e250ec7f26078765cfa63cc5654bbd35560baad7c05ba2010c547522d9d79d0b72c80d5921881ca16aea109bdc85fe61ff426f021d2227469be544315afe1b5ac5fb0ee54ad3360463f8591806bb61fb95863019a60890f2bb99ac58c55d144e506c3999fe63842d5f638ee050569850cd49868517795fa40fe445ffa55f1844a69e45fdc8c3578a91be2a8b65e1f20feafedaeacdfee3c8ed5789ac778e87dc4d039c77167d508acf6aa45fa3d81f978338b5a155f3dddff865efc5b865f373982ea59c73fbdfcc4ceb94f386c361763a69af4f3c12ae67a58200f1e47fdbb93c8209d46dc985bdbed374edab1e783a5514105aecb5c5ee695e35b79836b10b8ea031c56060c2ed8994bc847d53c43287ca914ae467c4d2d83d267d201503e9230ba5d6084c17ca31b1d47e7a0dc61d26ffaa95af931bc36 -MD = 399a7a212c1e8e51e644df1339d2e02006c1dd8e51a0c854217532c69692bec120dff30d21869fe26a4f4a0d86ebae3f - -Len = 27160 -Msg = e881e908d46879ce673e7e64f8d90cdf5497953a9ee75df95a0b2f0dc41c4ff8664eaf31e97565ca2cc85d5093e54bf3a216e4e6cad34e098288d5c69a98df38cca12293950214c0439aa3474ed32772ebdf95b0df42f537919116ed647980894302aaf57e156df7d43db911d1aa87a65a7b0e5d863d3acbafae5a4cc9c71931f3faaf214cb958b908370576c37252d51471b9b866ca050c036809a9728b9179031099dda8f3bd4c0612f13ecc3472484449fd8828f43e43b6468bcd06cdd2a99ccdd0f23acd84f9f755e43095f7ce47108c419473c0cdb8efd148802e93c309e5b8bc28a94e960803894615c6c34e19a0c1efa5f0389ab3d78fa98992e74ce10759c6469d7ed9c151357eb507a0da081d706e8346638e7c960a14b2d9d0557829385416c066366c0ae1f6d8fe975a5aaf2226f61e498f5a53caf2c1ac57c61774ded05eb70d95505516154656afb6587d5d7fc620f386973755ac7fb282870610d2a0e72d7cdfb65b5a43c6b5f1d64ab0ace1baf3685c796935a8b4945b818d249c2e79c8b9fae64438e822c463a3786f94b49c40b0f74911f25028f9ea9af4d8c5e0dc30ced02837356c202a0f0329e39f6032aed4414e59120ba28a36bb8255d420d70ec248c45cdb38898ffddfa734544d45e6db21d2671f40ecef47cd80c35155330a9e4901dcb1b2249d342038893be39c8fcd7e1b63a159cccf25b6364ac4e6b8cb69bd29df3f43bbfabcac250add8b0152b34272761ebd0bd2d960ec10b63d2efa2b8b828c0e53144e9d6db6e1c1ab3ad794541fc820d471a16ab1ea40afc15d3eed9b550ca54bf942df4a323370ad10c5789c6a802e06c5e4e093770035da0d40b6d5e9878c91307d8b2ae32b70f74bc567029bc6d1bbd14243eddd78d2f005a88e2188244c8f81a8a9f70fee4bf3b37e6a6ef9c48f5b5b649ca662d20d6b0e1d7d67780b6cacb66b3f98ffa788070f9988c8cd9ff34e2cf2f2a84f336eb4f0478c8f0265744f956d57f5fb7cb09d29bdcaf85f8282fc0c934edaecc57e3173cfc2816e5aede2e857f8f64a954a1cc79336e6f793c6cec2efb72480b0c44b5e5d282504115ecc75d02b83361bdeecb2c2d77bddfa462a18af356e551cc96a7b98c4630cb34f750581f7840536f575b2f3b29d58e08a79d47bd0a0b13013f79029a024cd6748455f1264e1000d161e8fced135b26d1b24bffa91a3dd142c5866b7c44e9056d2a44d2a7a826fc9c95110fa3b2c31c88091a1d57f5d21f19cf7c5eb36cb9da774fa9571424f9a919676fe20f8681e1a412a42b4a3b7c4efe93b756d00813c83b7af0091c331c88e06f321e711d3c18ae756693d039910359d8b3de42a5ab512222b562f050e43e8a03141f88d546141f97ce01ba9ec4bec3f51e6f9ba3d4f7b3dd65ff611d051c6ec9826fa74d24766ff066df49d96be3b58f43953ba1153e79019e28bee5d3b5073919796ce37bc22815bd971e581b14b6fdcfb9b31c0097da45aa999a49f49b0bc825e74a46a069d08e3eb398b936b430c71f7782831b96600027ac63c7cc20b50d4413bfd536dfe1b066df597b6364cb81af493a64cabc92c7a1ebabddef08cb5f00994e2da3b6e432c254c0fd1588ef942b993b3f927cfb1295d1e2fac1958753c7e265ae7b61407bddde7fdcc1a305a4e0f21572074a01676fe9a9bce869a1822679a6d622819ef215b6d688fc45b60a7bee59ba9db63e3cbcbd5082b7f7824098d972333d7a483c0688759019e3695b58e86867ca441a18f8a787ead4b1a2359b9c685420cde4c03cbddd70cf0ea80e047ad21821761d729042a053b34a99c79b1ce9a770eeed1504e16ea97019ea991b00173a17bec0d030194a6bd804d18d33d596bbb27fd9a10b7da9a8b1a7b992e922b84c21a09cb84495e681c782d1ece270cfef49d3330accfd3f0ce83a9d721b5d25cce3ae19a14a32f543e647236d236915d0cb9b71a8a5ea7f349844febd0e19f04ab249b011bd8af700c8c43e847319090e9c3b2e0142cfeace465955ea5de39834320608901b187c66e37c9bd96e1b09d75034b0bb1008121886da4b706734ae17c7558b82ff35f5e4daf2c3c250e9a8e96c0ab22c8a3d75c1be5a47e5d6a7726406daa190b69de3e8f3a93ee5d7ff66b3644f9adc3dea9658615bd3c11896a5b764e7f31fedaad701e212659a6fe6b3a3cd55e3509779f42b24515778a99cb880661fe8a710d74fce0ac0f076951a10590bc0241023660fd86bdd7ba306141b3d7ee50abcacbdae8bf2273800c4141d31a410c5916e5959ee9c4298a6bab75e6d33d9c1c73dc873ea2cd7d4af996f3adc2aba505ad4ae52bc5a43371a33d0f28e1950b66d208240670f352ef96185e9a7044f4ce2f2ff9ae01a31ef640e0b682e940c5105117594613dd1df74d8f2ba20c52223b045a782e850a12a2aa5c12fad484f1a256d0cd0872d304e885c201cd7e1e56d594930bb4392136fb4979cc9b88aab7a44bfc2953751c2f4ca57a8924aef0b92248a45a47052fb38b86ff8c6aeef9409f976314300402c7aa177f6bae841073ac86540cefd17eb1dac7b5f971eebbb41ba2cd37a507cbf48b42994e73e9c5abfbb76acab48554576e7564bcb771363b9ed40239bd66c0dd768e90da7cc358899544af3b9f09facdd1f9d47d445db4fbb295c9c47d0929abf3632bb8d0fc11360493eb08b745b83c8bb9cde3219c7b1fde4dec7defd94e858a293390777a38dad00ee5d80521d5cc221f17965514d3cdab64310e1abc7694c44871097a27159c7f1c67548f869ba42092793fe8af062d9f42611f069beb002828aacce0e9f0a59b2437245f5a50ed0d79bd86e3535b69444f4457bc5ff3f03f32a981b1aa101dac901eef7d873dce6f3ea9124dea19a622f4a15f43eed78c8fcc35cff651be2b38c7e45deff3aa70d048068c2e5b890fbf9741dea332dffea25f155eb6c642f7c9315117bf88defab7ff9b9b8e8ef3c9a5a2ed7de512526b005412d7f9f1e4aae6362dc5f52c2395adcb32e8766b9fff5c7b6be410757afe2f11f4e2c7baec6c183e3f0f97c9bf693914911aeddad4d76a8c83ba2c459ddcb90083262909a164e5b1509baf46fb9de34281dafcc3db79593bffa8426904302688864c26c64cbbd8f72814448b1f5a33bdcad0aa0efc0eb1f2a65558c9f720fc10c7fbc7d9359876788f205f8073c7b2ee34a3ffa37fbef8183f6a794dbdd4c5020cdc132aa424499d4d67070d3f0de73b87fc036aacb0b814938eaadda07508c51e9712a1e187d8cc2992441aca535a0d8a82bf4ccb0d78506a6af561e62b4ec1c5d3cc2733e8ab6eed491e8f5dc294cd06de3a2f23fcc1338ba561c1d81d1e5ec8384aa2e46f4bec5f339e5440821ce1c4b77cfdfda61a25c0e8f6e5be740004f16f93fc3a463fac48f9cb51bbba7ab389b68e9ca1330b8ecfdbbdb5e0577c1b0620af1b7e920f186f43ae6f169237a9208377f657ca1cd78125bd1a85ef1b0bd0f3a7e9f77e44979eb84d949833da2d50c53ff16793d6669e6ffffaf764643c178e824cef2f65909b00b2a98ac5eba6e024ef7718b7c0a4ee60893f7cdde017a39c482eacd0fa6d2fc4e597346ff37c994a8e6fb45e63f938a165cf5d8215023bc3017677878b9522acec44de5a791643dc24c081af45ce46d99b94e27c8d66a9abb60c987ca1703c5fd19ad0ae05dea685ba54c8d3f089deb1317452f3d0acb3fd6fd857d9c36645869c8051921f3b89eb5612d0f2ec94c9d13159f70e643a226132c1fcc37adf04c853ddab2e5095b5b603e2e332bf55cfe0a22a17f6d37abd7e09b2ce644d4342ce009b24ab1f55f38fc6ac47bef336b7878dcffbd3a5d24efdfb9016e4c4fac73faaa1053115e1091ea95845bc109d4b6df92febcc60ac9b8510441d6b676c5bc45ad796e7b8a2bf0ab3cf25559cf4513bee342e098e6f6ebf51b62820bf02c60517251ef69300dffbecf72fb021a2929875c50eb3b6838d53c5ce822b5322cfa9e973e7862b642f9b5db9abf6260fd62d94cad1f26150c0e8757572b5ab354059d8a937be0a34798f0dfee04e34a3e5a1552cc0ed163ed12667913fe650a4dfbcedaf57c6b7da838204ac17e1d2c6869dc0d123cd5db586b7a50b32e5c9d6757b2f6d8fc7babc161a4bac98d688e083c9dca242b9be1da94037cc93db9e32c93da7cc26e99c44f9ffe9e7ab56de59a2ccb18764dac2de006c23bbaaef5822a5ab5bb26653e4d8f6dae64498895d99ac4f4769d358f06054e073bfbe4a7e0ccf6c5508952e1ae2d3534baaa6968c0868f9a72ed55ad10b6c472fc21813985a10299db7fca1c6c959111f031ea6f30fa073d8c0b308eb4812475dab01732f73308a39a6e3d571f550bd6a3648e01b141a64e205b58bc97d0c880762bf92cabff73633bc91f1a2ce80fe352b6c6d8b819f75cee7220bf01423b334ce9a97f1a62dd693e3501ee2bcb07d87cad274cbbcf74ea34d44afea731f70edd9dcaa2c9099115f026684b827aae268fbc21e642fea96691e61a03d04c866396acbf504e50490a1001c4aac7734d4e0a68393dd4040f52844c206742de63e206ab19d000d36fb60c7ba99461417fbf8b35efabe59c015e9a6af08145840a0aabfd4cda971f7f9a53e88980f661b00b70a9b7b90e1349bb32c6fcea7ec9f32e0527dab85770f32774dce708ed6078b26938240da4062328fbe4c81b551cb9fc90bf35f1e88454fdedcd3484bcaa5434b375a6e24dd128084448c49c4ee8c8d6dd28012fc0d62f8e2d3e049cfab -MD = 4f20b8ac2926e6feadb98e36c9eaa74b368ffdb545a83323dc0cb862378175e2adf6df26ae3bb1c23cafab91b6f9c198 - -Len = 27952 -Msg = 58f70bab24e0a6137e5cd3eb18656f2b5ccddc3f538a0000c65190e4a3668e71a1b210f82716447f6bffb1ffd73abfd0b00a7a61f978932c95eba7e9adf8c402517b2a4862e74ee4afda25905ef59e078eea71b93ad617c460d2192063c48e19af7cdf039bfcce299316b706763d15b83d9547b1de4c95b06f2d6eef8f72f39e02daba919bfccb365fdbefc9e7ba2bcb063287b0ac8113d80a252cc0f7aafc7a93c0405a2a904ef35b5056417915e82831e9b61d6d1e9c2479e2ddfa6413b093aa54fbc70f605e48ce9e73d7f3f654b706e45e62e9ca357c038b08059f5517d28ebe723e1413031d02eccef11f047861cc4806e6e82ee8c8f24836496d19391f89272d28ff51455a3d63f0f9c3e85b0ccd40371132f2bcf08c43ee2e99071f63e1b7b5ee99c42de7c82b6055a84a05a14ff1784b8ebdbadc1aa1b81ce9c6d084df9591f6aa12c2aceb6ba66f96d07f099b8651fcc637e874e38d1c7b27ff546ccbea49aafae30d91ed4c4bad5525d02af9254a8ca00950a1312da3b31959b401eddd667150e0147f18f5d679acef00eeb0f7ec64e5dbfa494aa9d42c887df72d8c976fb276b0e15cb28ecf3a64d7183c0a23beea5d54ec55772a384e3b1225d7f23fecd732fc7c120441bf5745841ffb4dd14987cf1d30ae00d85582fcc147e765fe65474d6ceb8756342d3a179f1d15c22b13a304dece3a2ddab62e913263442efc636a8fa738a5f08fa14aa2cf1b71b156a6a7c53ecce34659e0bcc30c84d895606da8bf566b52197ba3efaebd1ff7627d8af9d8e53490927c5d925af7af8ae1530c69a7208a781a20bc910210348f1cc64503057c0e295a6cb31a1e9dee425cfcc7150dae9ffe3ba5739867715f212959612c16ab6095e6506dbad7a348e84c842614baa7b1ccc432516da588aa95cf5f66dbd11934be7e5110dc4cb4c665fa12b1ce76b4c9cafdf1dd7684fc1cd35700da7a006f918b6a9726e746766e9faecff1ac087deee02e089f1ccc76bdc409634770695480e4f14937438d914a7fb0e26d143aa928f69e9f1fc7449d964e2cb13425d57107b15d8fc957e9ae62ed4774ad6fd2e17ff496dfe6e0b51aae5a0a112a010b6e31daf492668d2275bcd2bcad3a2699ccfcc25eef7bcde7940ed1e9acb06cd5f20348ff7a954cff8d621457b49b9f5713a6483ef866f8a2b4bc9912aa4ecef9a587e1c56fdffd499f5c9d60b25844d45d866f7e2230c7ae22c29ccd328c8f4030c48e9098ca06c852b0531fcefa7cd753a21d659460a4d28528c0616cf317723bc238a61de0d0444f6820dc3108ae2a9d043b3c777ef6d785f4ef18810ace576d8ac55027a9c3853d8cebde020a4493e2b4b24bf2122586cb30103899591db66f231fd6deac4752c5229c6e6a89a5dbcab868da2ea599a5ffe30b0adb696a59e8952c806971c5758f341ad4910c39caff1a473153beb9fcc916c8d670c11e0681e9d696f080a3b442c94f589e1b682726e2369888e6ef55cfd02ee480eaa286e226035f9d624bd886ea2242ba3e9abcea161c56f5a4a376bc19277b326a5da1b2549d24969e23a9059e7bd90cfe374ff0c0e3b4c3803b2836f99be4aecbb61e9a7c8b2d03bc95ee64ed4266bde2a7a9e3e772fa1a022033e57970681d9417c741a4b5c20d4408714edf5f31f47352926994b17021b3ba5f73a08f4da74ee76250d7032bdcbfe4f8697dbb82da37a1d12ace885d011a71748577e0db73808db86e1a5daf97b5904c5dce3ca197b8fa30d09ddf0be1c0ae39c6044b5caab273914477ab9866ac7635d3dacbd5527ec67500099ec0ea2bd777db51b916736d00b579f5d52c722efd7a73aa5168330f6e69641badc544e556f66f661052f7379cebb69cc3b4e3c28de5e445b4a063f558d4a4daf4621676917e28493a585d9baffca3755e77e1f18e3ccfb3dec60ab8ee7e684f5cde8864f2d7ae041d70ce1ea1b1e7878cbf93416848dbfdb5214fde972e5780cb83c439dfc8aa9fa3e2724adbd02bdb36d2213c84d1b12a23fb5bf1baae19772a97ef7cc21bc420b3f570a6c321167745f9b46a489ff8420f9a5679c1c4573c626334b60296a39134f3f1bac26e51659f7c74521d79594e604767fc1339b9d5592fb96e0702f0f910221c0f417d83ad2ea3887c6c287c55004ab60418d4e64cf943a62c392652612ecb1a2ca6175555d8b618709b75085fd6eb6c18385f87a929e6247900cc72d0763512995a046f6787fc4eb71425a675ca72b1c1dba043f2d0615bdbc4baf74ed0aa2ddfc60c78ea22be50d83d03fd9dc426ac856961c331d8fc72dcedb98ae42470938551f719e79144465b80d6b6e1ac5186ef4a68ae6d28ff9104e391d3985ad06b13628cf965bcd659c9446578496a396684e67dadafa8b2e2da0e0a79745a12dd126394c16c8bbcb0a8f079ecdce72675cea66a68fe405d8ae6d7ec25800c7e1309bbd81805e63d7583eedab9a20962db54f0f68662d847b4b0a4fe7ec3595c3280d21da736b5a3cddfa55088a3b934bf9e2de8b0e358b986c1de092d4527f365ff102e1509e034e2467da301e8e0e34935c6098d8aa8fb28a0eed5d90e608cd20fddd20b864f39dc3fde9acb7864b8a3a02121c65eb155c3d53a2a2b27ea6fa137a1d031b4eaf9e35330ff8f5b2ffbf267a8f80267590f7fe92cd0cb97afe4fb00c4f12e9b9abe1d08db98f49a27f46113c255eaae897083632b8e6066953308f1aefdab4345ceb5e9472ea33c36ea152bd601253a2ac1f8cb9e2e929c86a3ef92c7bc4fb5d472d17bdd884349432739374ec55c14224b05aaef760b42697dd96b78f5c3f830f29a4803707dca35f1f3bf916737425b53d386852f7060250aed052772ae143f9637d722acf9c6f6916b4c07af5dcebb248aeac8216cfca48f54e73ef9b912eba6d0b0a3055e456d4fcb65186777bf2c05515b2013a520cd57359923538cf91b698f5cec43554f827238932c552c1e953d5063f5cec3d388a9b9a44048ced1b7289a62672e85ed1d44dc5dab4325f2dd15b089af1b6f1ebdcc078ffb9f27a2a62b194a7b8d9726260bdf4bfdf70a43eed59955b6c05107540949e2be224175d2ba359d8f2a3203851069e58a39821aafc532507385109936a8a426f097c151221d15e10dcbff8a239ba0b4bbd3357e082ca4014c3454d949f142e2f8c7523f7e9be3a15c39a5c5e6f3af3ff68bcc77e15416f1aa93c7d1762b4b9e407a9a46ce7ec462e43ccdbcb762bc0ea42bef0d2283b1a6f66c0f88a6a0e7e22f77416efa0ce2ae0d9b1f767f2ef0aa2e794549b4029daa9685d406bf963c372d88f0bfeb8e650c3f2042fb24a0729afa3e77327d190185f4a6bf54aa567524a2734f42874b7505e291df5390006b6672412cd0660f05bd769977795028b832f60105feb78d38205eb79d87a9960297fd4c0d2c572ed3dc8625a57d98532de792fabbfb649ad9e51b5a259d59a960b40225c24d39bc906a8b11f1696921fecedc26184274bc7edc82421ea08683ac45eb95f23cf20267eded260244add8506c3d4dc5dad138508ef93631951a6a0fd31f6445ff6c487eef132c81164bc14e4b1e3669cb61597682e9000686fca7b1e5065a65a08dd6fdf767eb15e72b241df2e5aaad1e0e661840bb66447a1482b903083ff7263ff30d8e502a67c03549e8e9fc7139dabea66051d531947a4a424fb58ddaa69a69e8d63a36b31fa85177d5b9c953b4075b62743ca1299d8d86319d84fdf41703f3fe7f86814ce4a867f80ce9b618c6aecce37c89851508bbb095c8f7c055f569c47a30f79abe5ec75f12b601298718d6f96ea1c1ebbe7c0cb0b7fb973ec5e6d5c6a71317e7d0360d210efb898c695287ca4e0a6b3aeda2896edf5ceae00c924de0cc4d6dd14c14829534020a46861cc927c9e10fda682239d355137a0cf1a3dcfa300981c1f89f2fa4cbf40cbfa61ca5f8294b3533f7a325c56049cf2b3ebe87fd1c6ddc1d9e801b341df8155f91fd2225b47266ad64cd532d49266fa6b98d58cfd8a1054e045f4e2e7037af8e0e654996b37e29b07649cdf459d1e4e32bb85659acce84bdf3e2d17b0dd961b4e7fd21346d9707a4f4bf9b00d573b64c5be78983e01ce2d132b4ab013c05b339e26cb2e52ce387f1a7d6c33b08336b4813c1fa36bbb2a6f18b7be4aa44e32e85c85a0492368d31ff57374f8c393a8d3e19eeb05886b95887c4e0855d6f9c590060712024d5bb8d36cb8a46daafafa4983617b3d28a5881faa68a95020358bd1374560d814e9624ffcd76b10fb3bb36bd32e40c8d0cb8a8b2f9221c80493ee024cab4d393ec457dc023a397128d86cd15d5fcc27057005517854f23c189774c9d2c317b40f6f020e296ba00cb8537f008e708dd62b259109111bab0ac0b2a89e460750b72b3c196ceee63f522e3f728fe2faf664d64eb6288670ace2916801d632e298e106cde66ebf3457cffeeedfb5f769a6418b6ddd2644de88220f3a1928060f509026a6f18a06d09a04aef42f3938470dfabf058e98d8cfcd679ebb470a5bc808630f29d3557235666eb2e1d980221dae0ee5a832d6becedd11c44e23d390c730c824f8f4477ded5d8caf3a7711515806dc93b87286634647bf2465283a41675a4e0c76fcd68662efdd08607063227099124dd8b62e72e08dde13b2dc94da32f5532a46258918308dde32e66dfc3211e51e786b86254a082fed2699a989e7a4927602c926e5cfd0b81ec35ec852ec966b7fa7f36b0175379e7ae19c277fe656a2252a82796309be0f0d4e1c07fdde88aca45102cd4960f969e5b94cceed52a3a4ff05f495975262f32817b0b5536453192b080c2563b9b812dc31fe1858c9263b5239b1e3e94679f50dd4af490a3aa0418241922bf6dc1e19bcc0529c589658a5cd1a2d1cdf323d951cf98a4b78addaa -MD = 3dd340c35dd5a88967b66a5602dccb8ec44478d76662a1e328ad5a93ba16639ef7da57b175c9bf6fa2b11e006dfa6ac1 - -Len = 28744 -Msg = 9216bfda38412a0f70511159dc73bb6bae1f8eaa0ef08d99bcb31f94f6be12c29c83df45926430b366c99fca3270c15fc4056398fdf3135b7779e3066a006961d1ac0ad1c83179ce39e87a96b722ec23aabc065badf3e188347a360772ca6a447abac7e6a44f0d4632d52926332e44a0a86bff5ce699fd063bdda3ffd4c41b53ded49fecec67f40599b934e16e3fd1bc063ad7026f8d71bfd4cbaf56599586774723194b692036f1b6bb242e2ffb9c600b5215b412764599476ce475c9e5b396fbcebd6be323dcf4d0048077400aac7500db41dc95fc7f7edbe7c9c2ec5ea89943fe13b42217eef530bbd023671509e12dfce4e1c1c82955d965e6a68aa66f6967dba48feda572db1f099d9a6dc4bc8edade852b5e824a06890dc48a6a6510ecaf8cf7620d757290e3166d431abecc624fa9ac2234d2eb783308ead45544910c633a94964b2ef5fbc409cb8835ac4147d384e12e0a5e13951f7de0ee13eafcb0ca0c04946d7804040c0a3cd088352424b097adb7aad1ca4495952f3e6c0158c02d2bcec33bfda69301434a84d9027ce02c0b9725dad1186ddc785e2e282eae23d4be7a8a7f62e390edd97c0af1ba5165900828e0630606f83d4df5240e1b05c307ee9153ff52c3e316f75acb9806ab9a24b5e6500d1a9bce003c7d8ae77065870ee39a8584734f75c5c36d2f958e93672f3b5bdd9fb2e0d56d6f7dc77bd4d75730c41d87d66d8e2c41653c9fb2f910b4fbc20ff0e379dbf6cb0b7d4392f0611bb7b9a2c3bde989f1d4065081b5f02b69ce7189ef9f14961a643b0566f46c0ebbe9ecb2a0018f46adc4ce2f3e671aeb6ff17051449c2e19277e259e9868efe3200f82d4866906cf465ae4633f902058acace8ef55a26d6a0762f1cf41b821ea3070a691ddbff72ca6de7174ebf8a97a094601eb8c797993a058c821c9aaac2ad4567e700ec90963b3989ce8a9665e5a6e09e2ce50e8fb9cdca7d21b980735abf50732f97f50e57e57cf8e49e3a4e6ffc43bb42008b89b8ba19936451696677679ccebb4991b328478cd6e1e0078eb71f1259e671eb1006ad9741d27ac21e7924aedd12ac4f4997e00d865f068ab12b9df0fc92df99bd3406b81ae4ac06e60074eb20be269a1c273d6399b46820505de74405cf9013ebb163f081235bc4778de6f63c264eeeb546be23837a8b84d6ce89a0280549e6261f33d5170700672d71e93471d39bd9af86f0c1c629e714deee0389b5dc538ce6cdf4da3f18408b726cfa4a745e83c7655853c2f43b116cb34cd36541ad4374b85e35748bdf828e00df989cb61f9d54614b85ab703680d90e6b77b75e00903a154054386fb54d0b333a52afb9af5efd4dc0d4efdc94cbf64aba6f146d6ed0498804ff9a6d32167fa41db6f7f1863f1e6568e0049bee4940e2ba37f0f2507a3f7b2c961ef6ee5557bdea1409e02cb4545294259e309b8f5580fb50d17f4df4688917a64abf42b01ffb30185a280b552b9fe313f12d4504808ffe584a76cfe5711c66ae8208d78d54d680226d1bcaa800a7d649b1f4435f6e7a23aca07b5eb3c5bf8a1d6985f56382fa4ac0b74db3137ff4de2565283ee68bda1bcc87ff62e5f2ed0281759954c926b0f081dd208d3df6117b356f3b9030552a373665757502652f60691ab55e34cca521d42356917e0f882e0854a0dfc346d51688dd601d8fb8e11432ed8c7a1cc1415f463e32685a38c3770ca9fa8625fd853a223451c4e45abc9e8d52715117b11ff93692568a58ee5dd6b0c39b2bded59502911eccf3b6b72c8fb6edf64b8c188b9043a4357000aca1dda3561529346b9f10640134326d7a8b387e049df200743eb4fc0851a1d80059fc42c5fb06ed2bfdd409702a097f018359115adabd0b3083c7ae133da84565c0a31d97bf5d5f835bcdffd000d161e89f423f453f3502fa0548f8794bebef698072924fd495123e138ec5c57b22cc9c298446582dd29e1d3dc9599f1ef52c6813db5f52cd369b88df76d9b4db860598ccafd508391e233687c95ff9294c830de55dc3451bca520ffa16da22b473b36af32559d9f38038c29db96a1bfd6a99a79f6a7c9b42b8dc300dff159398644c9f37754351bfa1453dca2a067c0dd7c6e18c91c9c9d49aa09575903a8be9e0378204102fe42fe9ef24a78bb39dcd0c91384754696543e835bceb6aa7704b700acfd3a68e15b6d29d03b06f0ff5dd719f185a32a9d2031a01f2b9eefae51f7c4ce53088dc6ad6e3b5577f446a1891cf270e2fbd29a4b4a8abf37bbd835ee89d644ea537996812a5ee9c5e9c607a9c4dff8652445761bb3c8a1bab270f42393be788ac435371fc919f4ee8d771904fa65f1d4c78b17d991e22f7c2ebcd3373e05d0fb02c893cf72f4debb8961c0e4e40ec3f88bad67cc0f61cf44d5c6bb74b132b604b63a91d94d780ff1858ce28faa61d69919b24d3e52ccebdb4f95922015cd916f88941884832cf05b2801684e75e6937f18a2b07585abea0a45314284915ec9021fdd121a3c99e7c01bc73b696d26607131857abace8734975fa3b1e84e6ec686241d66e19f455de706e64128b9a8a6380c64925555e6314a44f2c9937384efc23e5cfc22d5babb998f6764d382f4ce9c5046e08e435349ed9d2670cf2929ae8016a3bc240580679e61518bb1ef933e65a6344cadc053e446114890e298e46a8654f98e31581dcbbe22ac9e0b290c605bb535bef9f3706a1f495e1015e73d8c9d9f675a8ff61b4dc17b80842957e79b4626511ebb0531433eec73d8b03fbc7a8d9ff408870602576e13d62753a2ad56eda090543c1e1ed76ba38cd0fbc7ea9d1efda88061b158508e93b56ed132e5fb19ccfb48c164c08e7016b3e03ea84e5d18618baa651ea7a0e9a22641ea2e17f1925199e395029ed114eceff0c00971234272a66edb7676ae47e93088e8becca020d9730bff1e41061ece49e8ca13d95565d900b50ae04ee4700fdb2b110c8a708b098fa946e12f975763c7b0a4ed105d493ea1653b85b6a92bbd2f13ae3ddcc99a8bf7a6b372f2ea8754743096c19ea1b6479268b68c3665429b3526067c47131707b3e88ef9126976485551e8b4098b749fdaa4c31e56817b50f44d63ef55b6c824c9591fa0157aebe874f9e1f0db814aec8103aa639f639f8574710bbe8d1a758b43e0ad8d8587afdcd811ca9d9bed02d7906cb282987476e1be78471277a7e8e4286482e8e9f78bcb8982ebe2d23662070ec624a4ca1cc70dd94c5f139cc6e8d681cfe4daca32445d90328ce807c4332503fb48f0bbc45cb0cdd39be883dd3c0955081c8bafa0a53bf40bf5d7c2ff3cd878f2668ff5d2fb73a3f743bab556ad26acf7712220a9750dbdf46ed68c4f47c97393c6a800b06dfe629e9eb0b89703d58f842dc7a5b57b7af3d43e0deb1c1a9fffc6b06462c479f812b2f5f3160a06bd049796a4c72c802b9f95aea569ce7f0321736beba578e90abc1a90aa56157d871618f6de0d764cc8c91e06c68ecd3b9de3824064503384db67beb7fe012232dacaef93a000fba7f877578e97e18119144cdb77f7ec5c11141b86b2179e98eb5f2a04b61026235963b3288d41ea53e011646758ce005d595ce05ac81cb5df71be3d3fa6560a5729b284794deb31a9573b340c2a0e149d245cbf224335cf5f8c9e0b89ad9b31fde18df33214be3fec483bc3b337e2b18439bbbfc6698c737f03a79dc81107257f479b063b2be29b8579b81a45c5705e7a6222e92e834629aaa082fae61bc16d432485c77cda7ecddab25b3fa81de0a3e765394343d88e794529d72ac913f291b33ff23ede68bb5e55bdcc3cc6875b08330ba7d8ebb28aecb9674d365b41c11935628b72471fc0d55d61b219854a0916c61c15ad0f5762096e228d2582ec578e3353f86ba045b6ba5965b5dccfb0115409602acc98103f58cc223fff285edb7814dbe031d223c496b3927e8f8bff9b4a629f8f3c6c2549623c2e0acd34dd765d40c2eccdc40113efd2b0b539a180d1813aa0eb0575dea7ae241096968eb250c71fd0c3465d27ca501e8702e3f87bd980fa2ce730998382c5ed8e8c621e25903d19cd0da487dc123effde0b947a38dbcf080b2bc3c25b012d00719439cc7d5f48968074ef29691343dd7e7b540efe00f7ce055ec9d7af4d70c38055248004e46ffeb29e302a16f4e62030f82b9c176f7fb2e12847c0c78d15a085782a2200483ab92b336f742bdeb030ba2a220dc951ef1e69334765ebeaa5fe46a4549abab2312fb3dcb2eef0f82776e4bb40475dced0796324d0ae638ca7458d82a9d07a4bddc812410380ad6bd55878508e331b0da92b98a6eb83769aa3dc20ba31ac883ac5ed0f096912a95e423f3c9412b94a37029cd05f9fcc6e3c222dc7f3f4172ba8710474dced8c2dfaf494fa2cd6c233736334d3f7f471919cab9f4cd5fbf7acbd6a77076495d6816675bd78c3e2341fea555b6817f25a28dfc69a760a4d3653a037ac91466bd9edcb4d247fff3cf954c45f795967a26f7a30fb860c37f2ba687a600dd92d777bb951022fd688eef71b280af66c8e0b99d1b5d3ccd707f36d33726e00a9bfc0a52c1f1e4847070018bb3edd3a6a3535be7396d5d29f1f5735fcb1e8efc7a44e408f5e29d6982478427e2f60ad1a0329c7a9fc8a012b2a26fc0a5f5641fc8529322a35a9419286605faa231bb746a1ee9dbb0f78c145ce68a9a6a3405e100a5a6545cd28f0fdd6bf56884197c1b4b68c26f1f6297bb3b3262418a52faecbdae8bf284e2d4da1bb9e0f60b25b312deb0c4c93da25953e826855a88eab99f59edb2a1bdf41bf45de04727a9eef7179e875f6e8e2f279aee334249e863a8755fd3b8d65a8ebaeb3e6f9671d2cdce76054cf0c39371a8dcb7d947941b466e0b4a011cf4fd2b382b17c86d69284a9fdaad72375ce00253b5df98f3cda41b60cda2e64da218521a40848b1a722cfde1a1e1a781bef6699ea2bfe2d55b154b2738f503d9523e8be7a80f184c2123504a586c5d6e5e4910001fe3577ac0e16e37d9baea3e89c24116de020070faddda208a88045bbf4a8e1ea9e46742939 -MD = 478f747486422a451f200e63775b2fa32b2af6f88524bdf14a3b6bc8d3ce5c610efac145f76391e7fd55c44c09b883f9 - -Len = 29536 -Msg = 4a09dddc5a9f00ff888b1b52e99b952bc9fbb6444c4d696a55fb4179a7ccbb874bb6c36031f479331a58348ab4e1c77f0790042d11787f66ad1595a4badeac41781dbbea35ff0e512ae74322a008993957336a1227edf580e8c561a290e5ff139be6d062b0e947c281e34f02f33890bf7f8ceed8d7d55322cdb5af5d71083d677ab907b0e8d9aceee7f26112f598367a47429b68695822b3268d86bca76feda4df3c6abc26f8c63d23bc803af05112d279fe76aa259de99bb9f4efa779439732901a006eb16d1c18ffeab4622a8aac30db67898653cd30414f93f0062eacc37955f9d1afd36136e541240572ec6c8dfa3726dbe53a0f800faf1294c10fd1fae1f882e665d2fc9d0db2117c527e1f3c9a53e274ad238c5f6ca318e0c164dbc3d23f5c467af765d8f91a5a20ea28ca4176f7445dc8566c58c0f14ddeec75f1a7b4f42ff9d48ac56f1041a7fa22329625f8edf39d1c1bd6f074625b952b893c2defdda5085dd343ebb9ee9f10e3e3aa6f86fc983c93baf2b1eebee70d67e9e4ddebc3647afb1908d35eebea6c13852fa78aebdb43147ae92297cd9c4f86de103f106d145798a63caf66fe31169c5e4c566b8363b986a5e3cbd7561f6272aee8dcc7a55ea81bc0050839f01c1464b72a03918cd9a6d381073517231b4e11a1953b7631ea746cb08e643f88527055d7f03664cee412e2577ee7bdfa361c4d013fe487da5fc373befd4ee0907c325608c7774c102d069b6e706933a418d30c140d606068659d18317b4b84ce41604e90d74fb11c5c89e6100444dfe96a7b382428366ba3a60b43532fe5930c4a0427b84745fbb818a4ab8362ff2b90d41db877b8ee0e53c714dc6a42a375103e25c8c840e292ad095ed210b3227e63fdbf7455e411b33f73c1cbbfdb0d92a2c6cc1908e9acdec2d8bf43ff1f363f288e6c5408d426c1305019f89a23ac528c8a0002bf6b2d48c12dcfe798cdc2d8a82e2940d7b1b5a0ee06244b4242071e9531c96b37eded3670af97a423e64eb0ab86002009a346b7413eeaad015fa75c84642f3cb698731199071e63e791622ff93ef8dce7d16270f1a074041da2127622ca3b5d8593474202dd6c0d2df787bd59fd195cb9649032c5d3c93adf34d2d2370cf4b6ec07f12f74d88a883d3f44c2946b6c89c78359668680f1358f3d6fda8bd16330321cf942b6a07fbe5f9222a67231f84958574472fc4ef5df75e46ff4e5c28eb1a1f9e8e292de5395db18a8d1bbf7c685b508d9bfefe6dc1ed9525c8a0e867f227fc74676ce3a0ff7f8f85eac3764dc2627bda0b527efaedc02afbd03cfc63e6c15ad9968335bbacbff5bcc9dae214412f49e22bc6b12730039221bc7ee2ad175abd46b1f89ea5cf938687b0de7d6063364d4e63d85f73472c6d3fd3e3359422789644303988efe68eb48f265ab2a286fc187749e3b45f91af1ebebd068fc9969f684aa7c27f0a6026022b90bc2c5b4b051de554956a4c8e002926de553badc223c5c27f200b75faedf1f5969f450b1dd5e0210a49ebeabac40ef0ce5be3c153ca11542cde98c2e54af6759e5097328de2e1b2d19da38a966f42b4f386f2a4b9e6ed78375ab171ddd192141e9c8d5209b0950350fd4bdcaf6666dbf462e2b8730eac973530eff332f65769adcfa1fa1fb39c9afee52f31744dedee277c5e7d0da5f1499cdd9ed7833db8dea2667f8b4e905af231d1d829738a4a64334fa072e8413df7d4cd688f5d1c28fbc2fd7095f4ab42a1906fd1353bbffec67e39733a9164f53a839cb79b1f264a3955e12faac078f611a10b94e51b339d8d8ee62124a785b98a1fa8167b47c07f2ff1ddf72a308de7dada31bda9b0a98941dbb244d18937fd5f0f9c0fb0759f4a381d408194b35e9a55b27e96039a66545beb4a48b1b4d03331e9c4fddb16f73dfa4e95398ac76f702ab04ec873171e716433fac755c8f2ed9b24df8b4baa8cbceeec58997ceb451bc25a3ecf88d51682d35c602b3e2424aef347381282bea4697e9d072bdbad540fa516ab15a55302eb21cb06fecb64c9d9f2d75b3e30b1f2a631d72d5b377c30ae4b8c202568ff582ce7e65bbc8de97700f24bd568a622ec05911147b210d64f7a3e114a8944588aca8e54daef164090a67a1b232c839ff50a24d1c2dad85a2515f54c66cbb7ed1f46ad8d0100c4f8cb5d02cbc0e42977a226559f4b102e6645e3f9a42147343b7a239e056a8c4a807b7724e43b4a384877dcbbe02cfc63891686c3aee68669b25fd4084473fbe766159748eafea91080eabfc03b051a28313b50ebc34323a8e004ea44c0b9da5c184e3fe756979b42cf7f21fb065fd3dd0d18d4ca97b38972431dd90c00a8a1f92579d3a8ad729b6f72a9b5c4d889d4026b33a4e882a432666a0f22a69acced4f0c2ce4e5562c13c728feddc6383f7528ea1033de1ab1b8e5b35d59ace5a306ee3adc0625e720bf1a30f32c779bdd41c0f832f413d6588780bd9cd09777a7a927300b99f2e70cd7a9490b045189efb45b141078122c0528c7f72249fed7672eaa9a3022c4cc2d0824dfbb17cc78e36767cc4d3261b244071bee92083b7b4e11e8c7fe33240d2dcafd4397b970ef54b5779f2db57adf91cd0d0270ade5d9e8ed6247aa3d99307b9a9333156bc753b038fafb4663d62a7ac50be132ad7689a43b97a7d8c48ccc82e1972ca8c1485c826c727f3bdffc196b99a8f94c7975f12c66f9571e4a8737f04a797ee64c6c5057ca6e79529c7522f0a554b942a45ca6de0a17e3cf420109303faac8425fabe58ccd5f983f0ba9ed8692afbfa9c0a321359f73bc804d92c6cf3bbb87318daf62ae0fb64a65a022cfa9cc1a6ae630e1d6cf918d6fb5cfb4e729c91c4a5858bf7e47ec131e5b1c784fe6cc15497c77816e088ad56bf43adff0dc625d701b43849ec6fcf67273b302f4aa1d30d9f1270a2d7cd5dc4fb0317c6a5381ff96fec0772ac7bcc0e564266b448039edaad8a204bb991d12797e2622ba2bb2632d77620fc8a69612f590c919b5f59cbc2aa79ae98ee9cb0877a29b6b66c17e28b219aac6ff00335d118e1d76df66d01ce7c254211deb6a3ed8e1f3af06b14fc0b36a0d351450ff1fc7b0b63b17705e9050cd7053ff1a7525fba0e176007791cbbfcd0bc2cf1563cb86ad15bef49ea2a6f42d61ea9903664e8e63c748fa910e9a15c7290875ca0bf0ecd7ae8b0d4e46d14066cb6d8212d828dfaf27a03b79f0cc73ecd76ebeeb521058c4f317a80bb5afd41dff5520e525358df7851469bef2c358b2a97df0f5c0ba68f985fd8b5369831d97802a1bd6e80507b1620e0bbc8f2f229d11beb275f25f8be9d994fdb1ed0b8b87f064c9848b07db7140f5781f20606020a29979e84160302a508695a3ba99bc43c28dc05aa8ce87cb9483554340f79fd1de96cdc9487cf41f9d3ad9a55cce1e7f691d86e5abb98b04ff0019b57b653015184f149561f6565e224a30434e09208f768c83a21e6953c1c3244c024a29df8f022af4d9487cc54a620d4fe9f8eb70f85d635d1c7b5e8096934852a607b5fc940ea2c5114660cf88df1c7f1607e56e3e903a69b14cf98fe7d1e4c41d6eb9f5c8a05f2bb9f652e37e1bf04463d577a6e6b16a300d0ddad02a219226d4d986799159b89f5fd2c38fbe8b11463ffc228975238b468c28630ff1e4d8d168c2abe682bd37765f662352becf07eb26e666a46e890623bb37328dc3ae117a45c4aadb112d5467552af2aaf33a3ca9951ec4763734734e16b4c9d813efd487f85a03a5c13ca7d8cd8bd216f05f3818271fbc8d73c84b3c2b2b898d672cba70fcfd3705176daa51151312152ac082ad4973cf3888b706546505f1fc21d70bcbd028c5478832c456e86b633426f094df78956d25fa833d4d60cea3d3089170fefe572f0b982e9e50a3cf25e27951f735310f26d44daf488d8af01f705fce6290e412e4bfdba380e4d3e8daae767712350f3b8ca206adb08b6014b572abf059183de676d2a7442469f53301f6b2d28e556fc4ff3d9a011dcd6ca7164871a9dcfb584c65f2af82e18684283c69b2f6b41cdf160f059c4be8ca2d21a260454d66c0bfbf228e38e250910d42da65fb463c01d9b92c7861e09a080e1efa68ab7d7efef0a94d03f7e4fa3ffd1d7c7a00637e9aec28e824af61ba1dabe98ebff89c9e0c87b5460250fd36d9e012832446b1044e82efc298c931c171732bcfd4d13d3c8fd14d9df7c8adaef532bc9ee352c165a34a682c2343e33889f0503e55a9d1e2df89ecc552e378bb287196103599070b2f8f3cb57293f887edaff17aa106fd29a20e0d4ca225e0f3da391997a9ae147d59ddd7def55de448030e79d5455d01694dda49a4740478d180d5c195adf65c2498c2c41939f638f17098740ec130a12a597b0c6d3703a2ecc2f4288ab0f660a982ca8be4aef1590c9cda5a6793163ef54b6cdff779a7e1ae0700a8e76142a4649e4199d1c2d3d7021e40a77039724d529a2c3ed3aa65c78dc377ed4c2d5fa9fe51e468511412356a4b67e5c932d94ebadc45a39247c1c7049ee6402973a1d3df341f81f32140f6bdcabc9fc2fdbfd5a67825a8b3d05062caefc85c0fd2bdd47fbb5f713868c49d7502cb201e289a549e0458a8a8e2761d193c9a9b4fd9080e686e10b08159218c1889f0210b11fd5e19e76b3df1ecb778a80bd97899e514f411b2ffca6e80fc6510d6e81d4a685d54a2b7b9d32f5da8e7dfe4019e5e95792814206919606e999b166fff7f2c8a3edab0fbe102a1c3aefd294baf571e48891cd83ce9380770ada061bbc2c151f61652cd0a5d46f9ad5e2b2cb93f4d499cd934e67f0cb0b4458d07bb50ce8e3b4a884f7f89ab0aa7791ae452a33deb6100fe22b75d2fee074bdc535bb56f2048e5e94310f046e83bc589db239027bc15034c48d36ddf7a70f20ff5fb5041321b56ddb059b4bd4a17011f5228069939b6125829c30797d071e68c71f2b7d13e232bba29926d6abad9ba4ffbc88ceedec4bcb637fed0f57a8a87f659da629baee0c323015370fba4e45f803a9d89a525d160db15ff5054e33b54c2103ae70cfee4bb9cfa2575dcb2d77f74910f8368a95cbd2b263cec52a504eb74376c9ba1c89f837c5680c28a4f13988181a71085d3d7204b0b402b5b3a679a81220816f67681a965b8ee1d90e439193baeeca7a93fd118af179193fb0de4007d7295df77932b9bd -MD = 6c3a8559da6994c513896859d491b019b3ea9dd74b8c39dc983a8a0c0a277c6b9a68b00a82772f48c873934690fabb3b - -Len = 30328 -Msg = 3897c9713083c6795f60326e10dd4ca80b2fca125ebfc0815d1fc444e84350fdecee68af2c6a7c17427c8f40e09799525c502aaa6c1251302e13bce56b8620bc1c13dcab2d84d90182c1b4fa38fe1f912d338495c2ccecffdfa22083382b0d65cfed6d8eba39a4df2715e8c59d7aa50e85c020fbe8565a967ab63745d898dfa00e6665805cf1a7583a6275c99973f5706cdf45036716639c06364a54d2375e14e0650aa89a14a815c18fa12db351d560ea783dd5c676ceba8c0aa1d8ae6f526a4dd3a62ffc0a70bec784b51a747c0e8608734e9a8ddd6597131a84f8f5a782495d967f3c0a3bc7fa5129f8b7625d6889cdb8c17a45b3eedca34e3bdc2e49b75a1997ddf84d1074716966b42d075aaa12422fde9c755f3230448e0dade1bcb94588be0a8b4cef41cc16232fa3ebdc9ec86dc1ec29a54bf93cffc24493966850b1b2f44d1c8f41f4b36148b342944c0a54585435485dde0ba7dbd226b5d6b54446a01fedd39f6f56cd50bd86318c10b75d0bd1ff2226802f1ae1a6fc3c280b5cad592833d903df2fc3ee6af0995b926d8c8c2193df87992f3d18260d4f15d2618ee5f8675643fb473c40373ba28738f389e52a39a60991d1b7883ba31724721c904d76d171e82a65e1500dad739a6c13fb1ed6389f32d1de3139cb04bcdd53525c9889b85379d3535a25d290351c95938a3d0cdaf38dbf1d5234bf7965c8ddce9ace1b66247e60d74ec7702a0f931a3cdf4cb465ca9fc458c380004a3a6e7957f1f813210b8038ba663fcdc42a8965d6a252b5224bf249552b2575bf64568db4091d58323006c3c34994d3a5ae85dd297b58f9599f0db4dd332c05200b0883ae8b45d4e1bc9869bc9fce6817c210eafc10656752ed786eb8839c9ab4560dc10d1f786e75d7be926b12f676608eb1f4190c81e7545ebce0aec27d1bc46eecb1996cbf0e38a801a69a4812e4c93bf0634615b461a81a60718798d76f987b2db9191b219c7058e80d0fe92d9a9af155a04cd307bd9748ec880aafb38078a4594357d3a701660efc2f939e4c801bd76911f3f081e36711e88f01ac1835ac11f7b6193d582362f3c375ed0f797e9416b31f02112bbc609cdded323a0f767beb8f7a28013cebab2fc745e7e3bb7c4cd5bb3243e00b2ecc12530a65ff9f2b2f5aa9f74cc65b418be9900847c21b628c3d0ab37c052c22f19ad04e64a3d03c0e85ce954c34be0e484aa427d6569f189c76270876289381195dde21f6cfaa92619585bcf2f46c382b798d085c445186c4a79a9bf9f04a318a8204ebe22b36136fb157d404ae6da97c9ed315a13739954cf9ecd3cd05581c8c32cb14f15e7ba88202cb454b09ca4783e3fcb56cd55e2b7b93a417b910c5286995b904eb11813ae0b069778fae8afc886e924f86c6c8319a9d4ad186b9993f67d2582398eb51afd2e2b9d29845b5afd2671d4db8b37f90f1416768fca7dd48d01230dabf95f2f1a0c044bf2d755448aaf72316c8448c2ec8a58244e383992bea7cc78f2ab66ce6927391a418e66dae58462e127e20f6f567f123cd03f4d3d0fe39a7ab9ff7c878f02328ea1f410bcb247bc5a9a4f0c5cc154ed26b24a3951f53705897e7000d8e01f792fa0b2e338655be7143005b019a1ce418860d37e600334a60baca78430f0e18563aa354efc73539b8485c0ab349c2da7c868759cf5be4ef497b0f0773e55faefc14b15c46760a1125207ea4e3c0505887d35ab15618af869b448056a4f73ce00deffbed417c1d713d332ed297e70d88bfd54ee6861fdc37dc7ce30dde2dedd610334bb0e6bfb67f8aea363cd9a64390aef42aa16458b32c968a01d4296fb9b98d47674d3f281d6393ab5d89b0e53898dc99b889faab7c8a50d8a2518ea5eab10c95176b549f9946e0df6a62258c36c9d02abe474f017e7c93cd8d2f14b7c6e5168425b22b0d7350faef266e3e83834a121105826b400228e6d18c14c48d967e327c57ccce58f4a86841595605b267442ab455e3575250b6d14c65a9a410a1a3e9e5775e456a6177b23fcac182022cdfa17d76121a1db04fdca6e195bf26317dc2284b13962905e461504358bc591842fdd32fb6bc8b6a1b9048c8801ab88c3445ab9c90cb7f2718fcdb8ac3bba17596c91d49774683c5417498e214bfaffbeffad73180ec530e3a0b4a69a987c089028ac58dffbfec0ae911fff7f6b5f1c6d66a14d489ff8c03731604a5b229a09dafca32c0f32fb0823dede6ced1046835121ccb4b530e144eeba6710987a827f8c510ccadfe9eb6726292b3304bb5fa90cb98625f8720d237c942f95cd00c3fe46be5fb1bc615e6258388d0e50cce911e286743d8cd3eae0636730465345dcfa7c9d027d1f39b28e2c655a3b5bd5a14285210d47ecc6f900259c0faed5ca4be8a0859b8982e3964f053839668065e6bf6711b7f192dbb60745bb143bcf0e9f6d5500816381ff68298539a0fc58ee47ed0ac11ab70972a06a463ce479a97325ed0c866a9796dda6a22ee207895fef335fe2b79bf4cb3c56bda9aa06f4ff989dec399fada23c0ed05d64b9f38a0fd9478c717db25752993755e27ae21a2bff55ef5ea4c0ffdc23839fb939eb7ae34ce2f7598bf44b3a09c0d773380c65d917fc6afe4e5b1d019c2efdbeda65d874ba9424ed5ae84cec1e91c6fe69fc746162dfe39af4c29646d9310bc823e92f2e92d999bf7304d8d3381888c67928a26f709efdb7209de8167b482e77aeebeb9b6631ca325cb07b99e6d3b17dfe179c4dc1b7fdd56a537efae2c2fa4fc3e49a25c52b4b088091a1aacb31b577515fbea6b6a978682a79e75eb03fd3b30b79b76800247084871ef78035d129652b5775e4ffe201f1e977addc642d6f33fe01cfccd7cbef48c8bec9b4b72071a9d4957e92edf00f054fe32ede6f0a115514135fee8c702bc7ce07a4b2dfbe12d7f5a0253b11621414a63306ef41546e98d634c427cebfaa841f7024f50ff8a15206fe0647fa9695a284edb2797baacb71ccdcb922ff18d000358ea705e86e91aa71059e441a3c28217479be278e5bdc7260718b4a9e0a50be98c9b76fc99e6863dc5d59a9e0913033fd7d8653fa16060d29a9d7093c029121c1a7e29d43e699f0917bc4f3fe54423c785fa7993f37dcc480dc090959a005dc48afa508e7f5aaf348d76cbcb3e3c2bd7da69e61ce5fd51b1e8ebda56751434076576b5d264a1fce5b06bd6eb1de563995d8e74837ec63835b485187f594cdf10325c1e46f427cf45060438478926123396cfeb70c6c1c9fbf8f610b74e90a5057913549537d26f7c19a7b8868ae781cd0d95128ac6d64b2c3ca58ba75dc8d00fc3031f65358b26b171bd20502810f9904b49b27a85ee08ef09fc50f78ddca6559694465ff73b3a0c94af364f6c8ac0a3d75193e70bef466de562294ee7b570007d2e932a84c8f4b60ce3c3285d3b1e2f39177d7a61c34ecd5b3fdc5471397537fd39cc6ee41c9cd761c38e86040c5d5cfa0138db8e506838f0fc32b23551ff23a01dbad5201d7a9619b6610f67e5c451a1798bb19a80dbd62efff3103be654ebed4225053fb5d51cbe23026b90af9a37b6e640a58e39f1ce9cb1e71589debdb96c11d5a649cbf791d7743a4387502835c1b01d5e7165f049c27ad56a292382b2a6f091614746261ced10d13f52b2b6744b3eeb854beb216e29c387b7239beb00224822de4010abe5875f8f06fbbb8b1cdbfa71c125b3cc6658f2c3a37d3040cb688251c43c10ce152dc93c418a55f154fa4b79bb06a53958d77152d641c9c83a0104e4bb432ed6d468b69f9705672e442f99c91af6a9af6d2fa6fcf9774dcc767438a36d5e520d49be8e81b176d98b15024d2b87fda778cde7fb88b425a694a74985587f9464b99db9b9aa36e49350effbcd64aa2487da9f87d6c0ae55bb68f30952c99cee4c23f7e19fe2cf587cc5f9a3823f2a72311e0c98a16a900e7490853b09bf6a72f29380bda9f124d97e325c81d483b0f08d8b3ba1c34f0159b95383671102912a3f5060d53d9edc6f80de3f1e2cf7e3a4846b542aa437aa3d72fb1616d25aba1e19a4beb1c5b2a0226b12cb00f0656c98fc0481bbacea32c287ce65ceb48f8d556ad5c2daa7f617fb251628b18a93f2d4dea0e8dd432f43f0e015991a1f68b1d7182c96d74d2fea0197327db960491e5e1385b117d1cf82d06617d97f7bafcfac0cf15f301d28c03da9aef29edc51984082fb05f2be939969ff1e4e87302a8edd2f6c486e81a842b544d1b1ea64720782124c0cf5724030c394701fb9a6a2977068e57618e07618734ee4df246273132aadbeeda856a1eee70e56759d45de91709ea314b6a15be97fb12fa7d53d1d65423a9bd193d07d7cdc531878bc76a825e2bbef48d02e1f5ddf53fa2f845d38a5d1a029df3f499b81aa4dfe4f9d9fc6fbd0a6113aefee8a1d9d1e8d9fb92a8c7be0c9b140332ac4a65ae25023c92a01ba414751149a4963d1c1f82f20fd0ce08d769c7a1bf7d9c093f3fc551bc67d210a3e86f6fb5aa7742151cb2adad66bfd869b01ce9914c057ef7d8256601e02ee95ce4b4a19b67083b3577ec4f4cfafac0c57e0f3e211455163015c9b19581f3000f97e9396360c5932daf946966d40b3c7b321321d76d2759685726c6ffd3eaef6c7071a9a62e4be44e324f8ea3a86da61b6add372ccce8c3114ac118a94c6311d41ce274cc35e7a9179e72115bdeaeb7f696a1e0a99a15edbb3f2d191a51f811d6ebc02d4e0e354c2a42a0a427ed2acccd2415b0d68b2b33d6c2cf6adb9b0669f57b7f25b41dc157f6cd5fc9706a7e7edfb1ad1a3be6b53fe4642c60557e3a84b02a840096faf856fdad03d3cdcd2628decdec9f2253306c74a1c8ac2071f0ec879783505f1c66c3bf503155a88b9e652ac738b25247293407ea2890b51cd61bfc40d17784f87928bc656ce1993c63ae442c35f624491c310ecbd0d09be5369d7e9512e89125cbf0553b2afa0846028ecb9b58dd10bf65ee09c535ce3d51aeeb9f22bc461c1acba54a6fdff18e3ee761216305c9c030a2c57944dbfc21e8ab80ce6821f27e4de4c1ec72107a839daedfd631e16e8b435f41ede947ece220b8e79ce408804045c3d0cbc040f790c8b5556a86601e0a5e080dc820fe12e68063aa8b14c4720a88d55c58f905eb3e76976c4ebf065a95e71963a86a5300b79e18240978ea4a258d95bf248ab3e7d4fdc17f036a48c6e6752ffe0f440b28cdb062fea89eee7b29ca8193aed3ff5ffce4c0281906abd5549e98375d3c7b0da18db094d8d54577afd6255468833cc62eb21fd20022a3f868ba0e9a22c21721cb8cad712aea83d1f026fd8bd206f0bce2fc3d1 -MD = be2da5a9473cf79f41f123520e48c0b37d0b78af0e640f6f85892fac68489e29b9992eb38215cec107a29f95cca5223c - -Len = 31120 -Msg = a63c48f1fb7d0b57fc1c832a1176ecc6f3ed70c1b3de487affd325f5a1f9cee648d40a0b8b31c0bf2b5c5dcd98947682b7bcaf06e353dbec32a66407f944ed7f92b337255c61410404ddb43803477d046806bc1ed8b8dd4dd36f0436381aaf730c4197e677f6d74d0f084f165a794b748d3260b29af697c86a95ce2c67625aea3ee6f1f7e3d6c8c2d543f80da31126fbafaa636a32f351828080878e8e04370bb10b0effa8eb5c8dddf775c5e8f757c155d58deda79953a69c97fa07b3e78effec16b7a7cf1bddd3af8d8fe8301326ed071ba5e401cfe45a4744ee3de0f5a7ee7771b2975f5091bfd46b0e1b844ddaa74ee475f6497c4dc608ef2ad81c15c9ffdb82c7766071c276d3fbba08eb8dbd19b098c3cc868ad71467fe7781702f3e5a9fb3c0eddb66b62334a45b576dbb1568b79f580dc0e0c769ecda9de0e22c4c284b6b64a3d617b5ec80cdb8b012bf2bbfeb62fc62ff6668f020eb649c7df23c9168117a415c6c09f93ee09ab9e3814744d34776734c0401ce8a99945d466a56bc7d0fcb6e724df973f644c91de7e9b11ff7b790e7aea2d92eb34df4cd477ce1d212cc1fd322a2cc8231610d8226e0b079df1b10672e283936216d4d92871127faafb03d177353cb4d759f2e91a94c8d7a14d9bf9ad37e690e5e6367540e0f6e5ddd23efe36e483efd4d66f3f1771791491d5b6529a58db1dff2950abce560ff22238dfbdf19696db93e1e254a9827010f8207cabbac3b59d1636dfe7113ea22720a562ab27e9f9faad22f8c46156628f3cc47b5f9f171a80b3b510a1ca0971e7519e64405a5d01df89001f08bf5ba4d1e8282f08a7b18e7b601abf865954d3d52d8a6117f94e530ca00fc19c1400db7b72c1f411852165ff93ee28ef3f9f6c532cffc59c955c71e48ab89cf91ff46afe7528871487f5555fd795e956fd479ff3c8751e38af05c2f9c180ed9a3394d7dd67d2448c409bb14e93a87d4802ebe3399870e786b6b8eadebcff5009ef60a69ab345b8d34f832e3e60ac515cf10ada9705799e014d044de6059a40c2a3e65bb8f00950a3f55a1091c6f801e04812ea8ea805ce32c27660c203d85c5f01a46baa9683a858e27efcfb2f320b8c68a29792f89bd485c76db7d5603fef2989195af22f4b2c7c976067dd11e0dabbd32866566fa26d94bc78d792834795dcaac3ae2212c6698974acd5ba077afbf92812db2b85cfe5ca121634abe575dcc2d721d9bcf99bcbfa0ac2cb048866fbced7f06a84c35ad9a088d453741f4120869eb262253c21d068da30bc6f0d3b3697535fa914b109b5b26111b87d99400d9271f3ebed62ff233063852e3c1e7e48fd3aaefb3dc723067a3b8cd83adbe8f060f174bb98069a10fb272e950e3496bf6afe6ce5828e5d48528874473e6fa2759c8da365978f794623a59b9557d81ae66aff280c656f0ef7f5d88669fabd03098fb70e8e7e76131f445f5a839b71817a77ed5ec458f1ce91be9c21c4e25c9128c4fe248aaf430e28c7c4f9f46ba950d80c297f91ffbef2a22753d4fc97c6c35fd6d373decc8eb0ef4876e87c2ae80f7bb2441919ac1f31a5ba802e559d74101b3fc77b1f38a1a1cf20d5a46f6bb623f1e4bda9b000ab021902b18c8445ed1df75a5aa8b096346764fb61cc62a07c14c72e06afe97fdada887a587ded23ba3350c10d9b3747bf683d22cbbeda6bd28867e8afaa4a8c3721509bf58114d93406c41e40c107cf9b2ab45143fa5b1031c550cf290747a8387d2de219247fb912eeddac9498c6b0602566e19b1d594012721e2bf375657667545ce723d6a265af71f9f699a0e87c96fec17e1186598e1d052c99af4328594c3d8a15a6261141922695a69067f1a6b80d506147c3c02c89f50892bd1f04d34f9f21e8307140df43835d17495c56a13be7a045be5441de01d84ea19d579f76e9ffa0f92376b5b13c0eacd3050c9c0eaaf41d85e5c643051d154b40d08b3cb6c3e5a3a32f74e459f42ef16453e736318dd934cc4e88482434429aeae738711535d79670951a512c047ae745c68ac9dc4d0d92635928c5cddfc6ca2a51ddd104e85bf60bf4c580b9d568eaf1dd45ab4160e792f5b61650647838356990f9e11823d94ecfdf04f785ff7f78e2f8c66f13721dd2fdb5df5c8aa61d892334fb05c1a0d60d26b4673a12db251db3b98b99c4f916bee608e25ea2e1cd1201be7fd393c7d8bdbb055aacd3010055ce8fe3afd85e48d3390fddeb3fa3ed8c7f8de6cf011167dcf7426dd45909879dadfc8d05b02a4aac713b1066d374f544e723de4c8c05f9f7661bff55274d3161cc7fe6500ee58297392b2865e0cd5ad7e320b4f0a71e157971d2ad83a044744ec49a6e032708974fdb50947cea25a4a1fe05094ff4e220efc506f70456a7e6c100dca283ab0bef22d23bd3007206595f924159bec7cac2d6ba394a3bdcb00f451ba712760d77f0bcd85d62850af7ff5d3a4614c1c26071aadbda35be852534677f8a4c4eb0d5527a3825d19f0772ed2760b3c8fd672b93f8a48a37f102401c84a716ae72579c6ae79c359ea309ffd95abffae4c61884c03c9e99df77b6c92e492cacb7854445c0815efd283585071a43828c06b069148cd344a98ab71508c0116aecf60c1959f9e3fafd0ccb0b11468e53079d40db5330791139c833cf879869fc37f85b49516d6c1ab5cad7feb6d497cbce26fbe1b9718a9ecb267238de0ddf5b1e2d0746c4919628a7d0e0f2504b0c377012560ecfb68447be03f6d374a6de02100294b41c0d0e9f53cd7a68862038406e0dc3d4fe85f2a6b30f3631d3e9e28bbe2797f3c04611f939ff08d3c0eab8514877d9b6de5652262aa6b4d6844d894268fa659879c36cc0db1410c6890118f47fcf1c36e7ae2f508558f733fe483ed0b0f9a214710b5b80a77b26a34719c6947491efd792f3e6b0739481ccba707fb116b3b1fa7e948aa33fb2cf1c938b3ddbd76ee91b68de14c045e7c913414cd86e1aa739bcdae566b304495e74f6dc0b1518948c64e1b3360aacd141ba1b43b5622d429dce1e747c4a85ad795ed992aaeaa8c13e569619d6f9e8df9003a0dba327df2452b0c1c827a4346d843cc43599c718639362ee885408ba6118829a9b3e49a0baed075d67158aa0f823914f3b5434d80a101c637549c172146fd93108c3220274e13469c7b2585bdbbbeec31a66ae781338e59d7734bea057fa5a3c8afe5b84e0c3ba4f708a87b596d1b7c8694dbe691d7240e4e4815ad5aa4ca7e5b82c50989d092b96e80aa35e97f99ed79e75cf3b8750d0d263dc208289cb24f516f99bcdf825ead894cf35b78d97e679307b6b6fff58f7fe6b919a27851a53c30dc2b78590be8a8d0d24b940b6312115a5cb1d66d3ff38c1724e32451aaed6d823341e6fe5178d1cc7b7a88ac059f14584f14fc0b3c815b40e5e835bc8fd10bcedba4add63d565004af47e062a76b981546a9cfe0d28015e966f07ec0e8983e9d3c1c76e9b7c94e00d77c443631bfc418aa36f8f4ea3ae19b0ec3a7659d8b2d76be70e940a81af34959df5b2e8be3c0e9e4841e4f6df5e8dc452857b397f201e1c96aade2f69266669f39ce559d1fb5105a5beafa41fa513773e936b3bc15e166c5d06bd78b77d0df0f5144b050bbcb15768204fc5091453100cced6cf53bf68e1a6bca284d11583d13f166498afe29819fc3135d8001ec54559a24e62bad68e0300373dc26aa270712dfdc273432f8dc3ce4bf25bb946d27d81a822a44b45ee570600dfbfd8864c574e44d52379d5facb7aeb25de890f132f216b03f2a9600234049418eb9f43800a0c862d37987877b77e9910def3e9ffe0b54562dc39b77240987b79b4436cb3e0053c2b1e43a97d0e45d073bb8e6a0128c9e1bfdf90deb7034e3162d8596440afb4d15f45ffdb83466d1baf12ad01bf6dbbaa7b6b232838d27220749645ccbe9f97d05a5d117122e650f52362f4339336270a360d85468054c0f31f9c9cf8a6562ac38ca24d1cc4649dd7813ae892250888ab70452b9c2600a713d449c38a6059fa2566e3f730f047a04d48e90e8fdd5b4ce8aa908a9b824c80fd233c5df4a51162708960a4502f1614c0db2bba9f24b5006c557e26e72dbf0b299cc2d0c9cd23003f64c6d8ece94647ccb8418132b39c3f80f16c84f190ce9223919ba07c40f55fdc79750989a75ec5eb80e8f70cd27756d11efa293d5401b275b225517eb91eedf23809ba98f1d62b87a570906039dce2c73e95883cdfeee89a7eee78639de616fb40d360ad5132c53b9676c1ff32436ffdc0dd2672aceca0fc485569ad58018761f48090393dfb4f71e47a201c54315acf462f987133817835bef8c9ce8ff79bb0f39fddbf10a606b50fe91f4a283d3fc64f0b32ab1c53dab13346fd399e1ee082ae7f8dc181b9a79f8942342b26bd8b7d4bfe9992cfca44f955de98911b0de23185ae34c309ac9e7be123e311c838ca5ebd8841dab66b4398972e10477f3b1d5829aa7746010547e497fcc0b0953588d52426afc5689d63095793e8ef433cee610b02a9cd104a50642e3b416a064a239b105857e56ef70fb647cea6db0f79f1e69a3560cabfe23475046de9b0a3dd36faf2abbedd320ec639c82cce9d2c78b45367b120b158636091cb132e16e6654f8f4b7f68ff4a3b030e694cc4c832bfa221e4045e2372546134e2b9832f5688c9c29b71daee2ff262ae9b9d2dceaac547ecafbd9da3a62bb2e8dbdf8d4c6cae222f62f1890c5bfb4184ef9c6e330d10221e1b4b53946c6fe22816e3a100b14c0540229cf7dc468c4c4bc5c90a77c236ad30c71c14782d875b7d346462ee9cf8df8f6ac2abf0784bdf4dceb1971f729f55cf33ce54e172089b42b4d04768a82b0d779c1119db79a077156ad4788c86b0b833d1c09942d26a2e3308c5d3016b593b9346f6c5efc330a03d1ab033619711511931a1562ea73290a8b0a37a3b4f09d66cebe234bfdd62d71f5eb36c10fc479cf9c3cf100798e84f2e4cf7c188dbc36a5f0b61eace30bdb856b77c672d4eba182018c86b600ff1d63e1e412d7c9a0c63f426045c9d55b7905db579d91906ef3f56912bacca84f5b252d50e3288f25b5fd6bc381e9fc4c70baec91a1666ad6d9ef7dd576899805a5ff6e1bd55307d16ca514e7b8558068286c472fbc388ba9ba37e5dda337f9a965ba4d4ed29f5b2f51ffe4d5d356883709e39438d5511b72fe964832271cf2c3021e71f0c156b0c4cdd58494bb323c407ce67ab5d3f741b60cd44eddec80acdce4f3830989be311a49ed9b2c5631c50be73fa1ada07325ff4eb9a0e5d8ad4e7b73012aa2141f03b82b10d2a68e9d4b20b3b4b228230df0d42b0ce652d5ea012917100fc149c35126dc06d1094abcf508490e552f440ccabe0b97c72cca7eed6d38e7d97110f141edc5973f5d72d8ec4a0f1431c8ebbada445620ec7c9eb239cf3e4f31b751f0fb944d8bc5abed37586e6f90effe005d49ee75 -MD = b236f326dcfab7c5ca01b0f0e172e77c53ff4e9c3f0686b0e60b91d7ffe134810dca596fa2ddc11827883c1613f74960 - -Len = 31912 -Msg = 8050922bf6bf1a5665e0a71fff730ade4e2942646a0750846f0c47d22e13a3aa23fbdb74a8043a27677cea0c159c52c55eada28d1b6eabc1cbbaf5a041660b4f9a691a1f723fba13588f0c9d7e0b05a9b59709dc99aebc1e09021556db63b474cde275b5be3645221e5f345ba389cc923d32a1da4d8f2aa2122ccf7c63d44324a4b014bdf3b2815da2358bcceadd4f89ddc5920e9dd99e55cc804d9b437f6364071a20bf787b16cbcc58397abcd135957d970401f253bf402046b43ae22cba3ede67c144b759ad75851265ed822b26bf05f11e39b5c7366af6c52fe2a8a5f0b911e01ed31714ee61b3a937aba2b4cc0e5e1b08404cfbaadc3746e31afdb1aedd88cd60f4007380993f66d83e8634cc8a6e5deb9e21b7c49cc911fb6a49179cb32c76ae2fda400c251291702e9473d13b1effefd99ac52cb4966e9d5af4a06142e322310d0e41390b137226013638812a57483b7b21ec892b85a5f2736614a593961a1115023fb05529502341d34c845eff82f80c1df3830a7dfd213c083b12ac2ea775d01f01180b3e758f75d27883dffff34d12f6a3c35868bf523e40dc4e97910f85c4cd511a33392791269d8226b640e3631713c4f11d2d34afff77c1015ca99a6b7b75f55ed701af51db9b3214eaa99c61a2de1eb562b4a15d0916b0d4015c924c7d7db68bfe8055f81c3452f6832165703cbe78b52ee55187e483726e90943d53504f5c49b19d60ae72d0a8738a9285b86b1b9b9c89a88b531628cf791038e5a57e51af42f7401a9a63d7fe3406e34560ba5e50107be596e9296c8e9a8a30d06d8fed771bd851c9e579b11ae0fffced91aeed5db90d84bb72a5b6797b056446d1098a7b7f5cb9b6b63cc7c4207dc5c572d1318a41466d4216107056c489bc91f9768f84148c5e2936337fc69c8926142caa92a14d2f8873fcf401ee1d1f20f80e5d665a826f29698de642e7fb2a0724e6c1796888cebe954dd8d1092ccd78c2384776c5720d02c0e2dd79eee669503bc99f4ca9972df5f23045486f9c9dac389ebb278d8c6fd2745da18aa4044ce9a2fdcb742a255416d0cec2cee71397a4a26941e179779c7fce28b9dfd1fedebaa1a9cd5ab4d8490a784fd7cb3a39c24848c0610c52dc9cf31668adde3d7b24ab7ff52e650e5816b732da0ca730b8268171cca410e0627814944806f1af2428a5860a75fc024ec3074697eaca9135cb3566b59156ebb237cc90ee4b7ff0a1f18efc102a89566256e1fbaff89c255bba4d70a2b1443b73e102518204f0c99987502a2ed673d33bd92c9a4abe86b4cffab2d5bb8a43974e7f9e202db9abffb4f3d1588d0022418253d26b8fc5ee053c934add2aa6bcc9eb18874516f31a5d9b3cfbce5530fe68decdbab6a7943de1488effd2148d1597f1b4a7086739a4aaf66ab4d3adee6f0ff84eccc3bab4dc109bf2b8faa4c5b8ca095be5b04514b1ad6c86e6b0bdc3dd0077def0d9efab315adec75d9fffd80b2ada162987da0ba92fa69678aeae36b00104850e426e03a687b915d507504e787e0dec5bd34ea6f5f84ca55213a8d050db474c0e446043a25ed3e50a7abdad659049e664ddc96dfbd005b85c27d2172556e73ad828edf48da8d53ee3426e7f3c26370b2aed72e9247f79d97e34559598398d5855363c9dce2d662948a68c4b64097e63964b71a1d8cc510fa08059d20f4ee0ad6bb576c6cfb52fad21ed3f9a4501c7f6903eef1d80813563aa540555f35b894103efc2f8f708d8d25660aef347d5bacd010f14e68264ccdb84f881a6ad292f1c062a49b9aeed08a0d04702ded24ffeefcf070783483ebf8216b4f64da3807b475aaf32945c2e672075ea62e34e353c64e46cf17c38d6b55d49d08cd23f2715c9e9c6a60e69919e592e90f78b23501b352686f95abcf6577603936abee8e8a4aa99b6cdb13edf5553e482e95db96844697f9f48a43b644dd42d47b9990589d0f254c9ce0441df33177d095fe279455e08d6fd05e21de93e7fb032a0e900d343aa0145d28fdb5be1ace36b81a0c9ae121b12e9599dc94dd380729c4838408ea2da887300db7419071afcf07821126c08a81dab6c5ba958b3de5dcfd80d2d829888d19b816f75e34c6ab2e26cedbd48e7bade8b65a724d286a1581279f12f76cbbec3057cd3447f58a3eb87848a300758563dd16c06a282f6d24aac536bae34e38348f81a904bb5d4cd9129e982d574028622c4ab028b31a9771de68d03128289e047be832df14f68f18b0ec35d13568e5175ad472248a7479bb8085041c32965dba99dde329d13bb16c17e39a15174a3c01ed46bee3fac7943035ac3ae2af11e7f54de5328b9cb76441bc373d8f997ead906813defd908e779e6230fd1ada15cd131c80c96ac3d408381249a8972870aa613fce5ac7e82384449ad5b32b503c9db28a52e04de32c2dcdbe8d63d240cac2f2e8c8cae97e414ad143ed05aabdd0ba422bbe4fab771a45611584e7b77ee787b407b5a7b8af425ba2f1f96d0f5f8ca34055454019fc48dfa0bbc2bcbd3f415922f0f769dc17b10758298d41cfd1caf94bbb6a6a0fef125cfb25c94b5a0e82c7ce591099ca24080e6f6f0b2c7291061cb2a2903603cc115ddec7fb2c24690644148483afe970d1b1471715958e39e89e13cf793c8c1fc052ca26ead792db466ea427e324d07a88907dc61f157928ccfdfd7667d60f56a9cc5bd72ac63bd1eda7fba7918105ada73c72009a14d9da3dacce5c0eab041d283af23d1d7065f956606978315d0f76b815d23b192c16eab53b04d4b01410bfe62f2bed357ec79e0b589c3e2511448235ad0cfa1ec3b6c6ce193f750eb9abcb4e09774c2549d75c86d0f25def364b4caa7280b20d643ffae2d7ecb16cf43bdbda5a42fe4f5a0b91537a1a5c12448a3270f6dbe7778628f38df78b1e7d6c575e15a24d683637caf8fba462bd10b497d033ba8d2effb1f84d39e8a910927a74be7a71c51e5c6bcbdfd9f069f58d1eeab26d2e12ece8703474712bb53c5ec71a9993396885245e54d298de9e99c9dc093587d1eba5c43953e5ce413df634aacf6bda79963140881c6d92df8f2e698469e61e4695ee3585dd2d9bc9a1d2b6bdf991caa2eca72381790d6273aa07de9083408aec902a9eee36b884159f6657792fc7ee55ca5b3fd3013e822b8dcabba8ebe1684478ef72bb0722f1c575058954d86abff2bdc207e53b6d6c6788fb63061a2540de9ea153a4b4d97f59c154dee999f6aa1a35701e408e46abc849fe775084a87f2b9ff4b413c668872312b8caafdaf8473cdfe9e56d8026aace4f686b10b1c7adabfb3e1690c24ca3e1d7c5df0021ec21cb0ba3efd49799f3d9e7adb0bf382f46e02ef1ed942ee24ff68ee08e82e55ea4554712a01e5b1d118bc152dac46e3bc568a9c4cba662e5f5e1b6bd4bc0cbac495c20cab893412c8e545aec6bc8fa79b395fa0b133004b43023dda0b9121b61ab5017407bdbd054b4b422cec62533559bf8ae5956d99ad9894d622f392f7b2b24c198f86c608f024f2ba79e8c61cf7be911251428fb8bc26bbef2dd4e415145503134772cc9d3c1983b57c021171549157ffceffc2e6e0b5208ee2f8b20345cb82f68311f60552f3a63c1d816bdbb49cb85943132eaa810c6abe29a6224aaedc70ca2bad6dc79879025544affbe17fa55d2997c7fa8c07f44284ea255c71b6507698268c596b7875400bd9d2ea0b1e75ee77b4634f14da3550ea0dbe8900c4ee3b675ef6e17959ad0763c4335fe1f7d41249812f54cb62973bf77bb9d17f427f683fba352d7aa3eb0067ed1a83ec738a71a9e672323807e2acb31a5e5b7797cba428229066f6bdf5d31e3dce7eb3fa5eb49ecb7610e432dd4a27d3f450702b9a982b7e4eb473119327909a9977bef5198330188117554951be5a8fc5d7f066b4eb4fb6b83e7b068fa4c6edc19696ca838568b5dc6e15b606af5434171981b0e1469db3162d9504b0f3c71f8f05c2e364634d8bcf3facdfc4c61eab333eaa71e8511b5bb0a84a73bdbc9b164be9caa684c5e880a1afa02e53abbfdd616df41192b3d397cdd820bc7fa64bbc3d6d377dab513f7d9ce87b097a053fb1e9cee5f8a715cd50b6e5a145be5adef8adb690cfa0b25d6b0612c4da027ca70e128a078eef1e106cb4f6557741805cb1e2ef5d042c8e473028540408b4b9fede25c9e23c3177a4d50d33c3bad2bfced1253e2784178e07b64ad7c2fb56644c086ab2fc6837c7917109c5737737bf3b3fbecb74b62959a3e3b4c3861bb0259a74296edf7cc7b7df2af2d4ed143929abe3f5bfcf04299826a1ad3fd9d08ca2ef0aaa2413deaaef97e60e87bafba0a526a51142bdd5e1f295d77e734182b08653b234fd1ef8a816c18fa707619234dab56d5c7bc8921710fa6d70884899e577ce5411218a3088d4630c037c6a43bd715f231c9377a194995c4ac9a6767df31d69d887b7dff014d387456a0d5e7502112daf9ab2526b2036c458d1f45296a2222b26dfe8a39f12b8342226e2c38fcc6325f91efee258828f397ed29b644dba2b1d2661db60a44b2e738b7e2424fbe30f52eaf0a2aed1844bc3a412c3340802e345c154b99d6987db4b68b9fb06200fbcb96857c43f3cec126ab2da924b3043efaddd02a9e3558d67c4a1208ef3661812645c9d8d1b02838e37917233302e45fa5d63b1d4b9d0277be61efb067235c5bb5aaf0824cc8c1165312722cc6b68d0aa5b3caa61a7421bbfbac8928a0cf5df5ca347e1b1da415e3f615d32868548aca7b14e3579351332da47852c43470e2ea0480e6f5ecb8831c5cd1ce9880535a09a67839944ecac3475953e1259aee97a2c50ebfc5129cb549e7f4a91fb7397762b83c220e95373e937addc8df3c6ec8babc3c5ceb27b718d737fd0700658d5f4010ff21091f3d119c99645e339198029c3a9862eaa4ae2a5ecd397ced23a59e3c512fdb263522f8bd258635c542e0e1b1c0b1564611d8564b08586f586a48a0a1e95ca4e88faf308fbfc1c426c8dfc2a5ff05ab8fe7cc491689d842c4b1bd033b59f412c27738758ec895adba8bfb31e34613d72a9ef06f6bb217bba4929932431384a93694351434c070471314b9cbf4265a6d98cffb459521b52e8a7553ba63c68cdcd76f4bb91c37f024a2fb91ed432047d36cc333483d492f1fe8e2730817b38b220750e2b09fbf83caec992a027ab46aad19414ef3cea8f40442528db7d98afe1d58e170b74997a99e7275c8c7e563415f20a294d4b3c19260195dfa2623bd64333eb99c29a480d043c72a249a2dbd5a7e156fab77a71388e7f05d5eef70bb3be84b11bb843aeba62f4d2e93f5be13246e5a10f938f32f45d049e902805b1513b0e0b26553773889c586ebbd6701051db4813f14a5326567cd9879ab654d4b5a31b1f41013d40809ab06f9f76ab123c4f50d327458ef665d346e97b02ac1de9dcf115f4241fbda84444fc1e87d28cfb88460a39eb08492a4a92ecb972d534f4d0d816c726a3910a825b3ebf71ae29947072dfb0a388c8abca07b7de7096c0de651a4a436f9264ae3d3e5d0a9c078e11ee1b7b12d7d81bf239eb737263b96aaf85fed8ef67b3e09a5b36808771a56679e98a05eaeebee907818747fbb3 -MD = cb16838296482187bce81d180666b720ea763b9dd3bead81134f8deec96c98bab0e938651e6c11e6fbd76fa241cec784 - -Len = 32704 -Msg = c0947efb86d54644087247f9fd95133a94075faf6250a2cc9f20df5393edbe1a4bdee20e90e877781a370a7f00cf9eee7373fc38acc54aba23b0df3f020356c9d95ee18f9352e042a9c4b3949592ccfb8a7a08b262373f02d8ec1abff7c62415d2dd2485765cab2a1de2e941a428c4e83fe32c266ceca82c259e35da5a7f51859e2353f8214efdb8de59548d15d7af3dfc780f9bb22daec0748cdb99137704a2a5f815f07b70017554f19d80d0e8b58328ff5a191b4179472c7fb2020af366f2502412766e09dce8e7716c22bea3fd412a41b4a991723049b43f6220283e9fff056ef391e263b99a00a3687cc54fb0ff6c06c651fc06fc4c769494f8539fd6512da0604abdc4be11054d3a95ce35f5465515371b424604dad946f094745d346e318000a8e87513d760388a75c29ef59c4d38b00f4c7a717a451c1dfb74c1e0e077d77cb34bbee174772cff2587d0d88cbc35d93402ea6ab522e0c4353913022f696c7b73cee6506eb4f141ac0714c59b0ad559924cdd1811d9588c4bad9bc4e16e09a6f15a37874f7e4ef91228b1e453a0e0d931139da218d04d1e44b7a04c80ed74a534d5f7af9e3c0ccf60d4f15e3be41e001a3d703152708621283e6cc29450761f44296fefe458f36a9df21a5bdb3f577754b49fed4621cd3eff2c454fa3fed7bd2a3ce770a839cb73d16a7502bc1a52e5e75e71fd7c4ce81dd268741b375f5f26edf8a75972475c9104244a7c65dbd8f3dc25308a7c57a065a8da404dd7dbd6029543f6d3cbea6e6d3f07e1f15eecb1493af022bbcfacbdbe8a6af30d0cda03fb2b071e06398ac8ae89fd818830b3a58e09a691b9fcb107d27f00d4855cc4afb7b52b6519468f33fdebee7369629a7c6a5131c3ab8bd046468f842ada5201a2de3e9714357a6177026cc000bd7c07fd871b7801ba047041c5c2de3e3773f9a419cb3372815c685c64145c6eac0764f18a6e63920ef0f8c1f521f658c249157d1066e7c926740daaccebaa055d8a18201e53dac0ced7d28e7eb3b4bfa35bbbf46a169b5f4b4ab628e1fa920ff98d8b52e9d1c5d1233f6570098101bd033154d3cfe4377e1967cd9f4c48fdd2a798254f93f00c0e34b2192f3e91c3980a5449e0e9d6a36cb852b8d7b4ddd19790344edec5b898bf2ab75692c4ede499df4b00e45df7c7714f93e198c2c2f8a6dbe86ec927324f2c2cd78462449d4a08ab9ee3a6d64c8bd706b3aeaa1efe5847b13dedd660651a9c63980b6765a7df2d95d659f0fadfd8e4063989d46f99dbc23aba33ce195ae259f6855469d015894fc67ac98871b794e277add9df5d9c685e9de7a878f9178da90e23c5302cef32b865129d37e4dca91781980594920ee665034cb59ea9a604d5d3fcc783223bc1ae9b263cc5fb57fdcc4a8077b8b3f73f1d9372c006d00f30246c97c32c5a031e7a903f0efa5d2f7a48fdf096166b605acf76e033791758f8e0027c1ff17b4e31646be47b9eb36c07d5c06dca755f501fc2d31e74bf268b434fbc34459b2e25e2b3559eeb78a4178bb9bb817b9c3acf7640d3b5eda0a4affbbbc3469bf21a8f19b175f4c651d936f03d18b31154a2e5478f9e2c04e439cd076a3e3a8bbde894bea4f46e74f1f9d41da9fc8bf4653f9b7af85b0b23528eec4fa556997bc63f3cb9d5f9945d20adf6fa4591928d97bbf8f7c333dbb1b44b14bbb333e9d5d3c890f28cadefeaa69da66f58ff4f42b2bb04a6384d2216d0184d33defcb500ad2a9751113706814a70eb642c6e4b7c7deac8709fd26bb96e9ba09f6cda82641c0e59bfabc0618cd5cfcec107050ca4c1ed4b3b3fe93b04587f14e7a6f4da69e71cdf22a37089711061556e32ec1c20466f96f161bb1c5e556ab2f3d4734477d8fb3064416e059ac0cf8a53f54c035ad416af784d6f952f2c0581ab3e7e49f6b554546bcde35d6db0c07559974d47b8338aa0ba4b2e2fe0a6f789f82b3e6f4e47ce54218ff61a54a7dd1d66621672a42a74719da32070d78be8d2c0e5da41e75612376ccfd0c3b66cce8a639cd00c85837c280b9c6ce27da38265edb27b442aaac70536d498e0fac83ac4398ea29bc30449cfeb7f3b0d3ab56a4965db49027d0a96c766e777fa8a83c9d4ce80b5a9c676846d2494b478778b4b8612a76b02493f2784e4509598cd6524c10cba30bdf5a0d40ba02300ab9aebcb25da600accf7122144985719422b36f393da833c60ba4ce2b04674462e0d9e922da74c4de9ed482d0f6a442c800cbddd521f2501187c405664fecfaf8a366c49a660b55de095acf2ee425ef5dbd8c38b07c5e6a670a445d72fb07b63467f1c9898ede16139560519e808ee9ddaf710a5bab30f54ed98230d1a44c189ea4f78260c3619827d971a4906a43c4b06d26cd271d1e73219c1a2a12ca3e949fe0d469c0922a4e833c2b42b4ffe9028e5cf9fba3607b8697b878a3b6eb33bcc0b234fa1989bccbae33e9b66cbfe325c01577006103dc8209b53a282e65dfe3a99f85bdec089d721157397a3828d690ee2d3a85e085b6180028bb31f9e8a7cbb2ef432fb89d20e4452c9708a7d917f660ea90f692449c9b1379985b99e20fb75547f9b9ffb5fb94c21a8edc2c3f3ba8d0f436dd06eef48dac2e3e0f9ec09c49392015f721f1820600b78d8f45c9c63ab6d078a3aee3628232cd38c87922b1f3b70e2461efce58aa997a1f7c75173c1e7ae5f2e50ab04afb5fccf500a98705396778a18489aaf414e4d8b13e4a95f1e6a5cb220baad4327b8ba41f62b04beaacb2e629d9a025c8b78b59ef3f26c4ac05cfe67291ffcd9d653ef904491e0ff6a021ed09dbc3bd6b14f5843619aa21bf0e41de81128a1b005af222403e4341adc65cd3ddf564d03fafabde0238454baf62a409ca07ca3aefbf4db65face06f74819c5122c0f41cdb0a26cdf02578a0e1a57efeb9dc40abd0249a2bbf3f5607ef6498eb54c8f1e1b196eeea6c6bc4a01a493b33dd2a7dec460d6008eb40149972d1bae90077fecd47f87ca9f375a9e7adb0512fa05ce28aa5ec47c46079bca2a37b7af092587b4e2281488301cda8d6209d6968affe0f059443b9f4bb26be91f5a46198a6d4e7d2c5d3eb1c33fe31f9f742dc75688863cb85a62ef057d18b05edff0727aa87d4f9a652dccbf661e5d1a64332cc4686816afe762f6dd324b27cf0edc44419ebb32148a08618c5a324ebb23104d3d662d852635633c3997ab555b2e33164717b12f8212f8f892e3c8fb6bf8ebb22a4b7d92058a8c488276e142e8891c71f3db074dcc46241a38c8886a102aece4f1df0243342f05a2219594f65f65c0dcafb16495db6eb54ee8d319a593023d6afcea61a29c6cf7d27cbc6d7aa90b47dfe363700d95d2d21d0aca24b4ddc803ccb13445b723888a60fdb513d5acc3d802f5b7d4bfe3b9a40e0476509dd5c469937a845489b2cde5d50b47300f52d49bce4e7638b3ae6d52a93f9f466a623d9446bea43620328131b90d3969318288b9ca566843f0dc340576230dae236e7daf6de45a948489ed95926d54684124255a7f75549e7e5657e5fe19872fcee0cae090566f16bea1593aea9260d54a1ff4a5731403f165051d19c887d77175a06d4f387bab63d4600d4748e42557515d3dc330993ee3add0d0ca5cd6c31d1f95ae26ecbbd524d1b050e535cb6a9760c548dc3e6ecb1c5f9eb61f436f14dbd5a9d48a357eb700ba786c3c38aff93d7e3f5c1723f972458359194104b891529ec329a59a2c17a099a0a773d9f898f0b4b3c29c69a4fd061fe83f57271b042b82cbf39fa32dbeab750f4ab3a00e10580909c39497d632063d33718a35ff330d89aa7ba0d8ea74ca57af9c23165a281e8529a52736f6dbeee422f602b5cce8a1bc4609cfc2c900a54667e7ecc242aaea30fcb07ccd6ebe651d9d18e62fe9e98f2288e454e8332ce34a1f71352c2f5c6313682ebce4a5a414ef8c1d5e2bc0fe7ec3585658d291be2d6bbf8427dd8a08323556650e040354a262d74e9432b8f116a89fa50309497f2ab23066ea5cb974ff9eaf9e9bb3f098b87e66f3adcb398900d8431a7c14c5378326585fa5312669715759218a7cd436fe4c2154d47fab8de45b2efdec7b6baedfd020b980e537ae30673e3604e417f71bd3f1b82fd577c6693a46967ac7a5abe7b670baa4ff560de5d64525317521a3b81bbc69e65503fc387c752c4f7fdaf843e231ac3907ea4c38ad553538b65b027c2d6cad2287b8f6f929a209922b715b9a5c49d566865b34d0f358b0422f2bdb1010e7cd0bf4fe7e534ab5736c54d49d942aa27e5403108d56b035dc7669faf81bcc1710c8233e5aeee695b305816a86da5623ee2b06731f71ecd402fdeb311f466ae2c0829cde5373052c11843a9bdd14e8b36f1217ebb1cab01d69fe3d361939f1322360e848318aaf61d41107cf6ceae63c4731bfe00d0803f85ba2e873ae9b69ee838b8ee2bcdaed1c46d6716ef9025aa5bfb185baf9d4ee4d1e11734ea515dbfe262a1616bc0cc645adf8ffe04d074bd61fbaf2e23ed67804fb726631c84e4e4a5566094bf8c743c552a23a8e309fc2b6af738dbea4b5a9053aed4a83ddefcab95767eee839b46b827dfaa8de6972c62fb705deb7f21a893823aca6acad9f573576544d57477b46657628d339c2295f287e986d36f2ac2185fed402140007fea6f855afffeac3dc5684554308016c958a4d52c3a16a1478d51290e6239ecec6f226949a48ea34363ef0a97eb1efe2713b6c5e676123f9960ea806db414e9db8024836999a0e775b03034b0e9e5434fa2423e2e1dfe504841a085e68d6d91cdabea666315d1f34538f02647b35f80a392dba07ba8277dd49df7ac1164a08f2360e874aecf9e61227c8381b4be0a20a343f78f479b1a32bed4746576c05a1c8d4db350a51d728bade98ec9908061cdff540a6d2a6d62f967939b347f26f6c45ba0bf6cfe85db0d480e66505390e2c2f841a8cc8c958e4c8f49c0aba30f03312f28813c13af445071699ec8867629ba3e7b372ff6b9f8a66665a94d7aff1bcd68438d407ce04aefba69bc94a196930e228f5a09e1313e91bd85a96c7f6d8d03a760580ca2cf6b4593bd34472d78bb5954fc65dce4a1cc88c50845bb18d0f37e6d2d66131dd301fc9da29a5292a30f0636210f3b79722f164d9c02abefdfcb981a092bd65681cb7f28d85339698c0abf56bbaa880828d2a4978f64a15cd091eb3e623dd8d5521437d5bcf37e2aba3acf271acc55293c53ce4370e04e0859d2d26ae7009d22da68d114deff934eb42bc037dce91545332efdc1df0a044ae1faf7fff61885c77155b5769cec1b5df03a2d0960856af493c0ad93285666bcff96d69e2dea452bbd576f7b952d78c0f4f2800c4425a8afe4c57857fb39d7d70922c8a5dcfa3dc824ea698456482e3038f143b0f64e70ef8c89c850b638fa11952b78a7b1cce2452e8b2e213ed0cdf44292f2b80564362c11aa284df7e820053a1d51241ae6d4fb60b647f2ed3bbaa598741761e00b6b0e1a8312801eabfc2a5e74dcab96bc888331f82149b00d86cca0f12c4f24a8a1ddedc11197b918e0e988ce859ea3c26f5538cd54c635aaa4c202b69be021d05d3421d09005559360cb3f86e68dc09d1be9dba25cc8fcb7b73e2420f0b585f71fa94d2e285952c01e67e94a79e98bb0f0c99123a3f273a910998bbcd54fcfa14b95d65644f45f135c181c65aa425382907d0fadb4b318e3635ca006941f4d43739243d57076c901bc845f751218b6a67d6c9 -MD = 00d3b9396a09d37e126ecceb86f5db9e8ed94065646f4d3d6bba15e8318ca9f6d07e363d60dd863ec28ac2378ccdb515 - -Len = 33496 -Msg = c17b3dd94c4f9f562edba48df48bd57800425b2477a80aad5ac69f6af2d046657241600ed82d823014d3c1236c732d441f5f9ba24853a8fa0609fae6da09c95150bf9e2ee2cf5b6919ad7c1ef5689c0a8fc63b3ffd96be1b7642b77ab6a4672ba41a82a133dd31eb868e5de757122bb299a0c3625c1856f8f2975f90504829dbb67d91cf93fe0d9da3a0ede45a1ae1248515bc752f827779c130798f6e9e1549ce0e5521c9daf667b70bb37ec528c7489b4caddf3c7b2a862d368ddfd94d365e34f555fd9f1af4310cf7381d62e3e306236e1e084cac76077cd124e859fe91002f5b19ccdb660fe3e88b022af7f43f4764a2975826bd63e4f728c511b659301809682af74665506694ef9b0b4d02e3f1a711a1379455f905e664f8c4b7051a8f08430fe4a8c0bea0584c8b2a2cb6d5ee34e2c30d5c1c415291ac456925ab574b751550fdc91f627a7bca58ee5cb81f24533e864247bc42b43f293566c8f2f036980576a9702842dc47908cbea4afc97d4c4d713e1dda04113a034f246883ec37b83c084f678668af02c7ae04cd44d9e066360c69a6219053c8611b0bcd0553351ee18e5974dfdcd9f5964727a01e5934ea22df2ca936ed60326b2284be212d1a131d902e60dca4446826de8fe2e65063203873edf0c42322c04bebf5057f83cddd189736f224cad6a29efba45e43c75450a14f1541713b7fb926ffc768c65c36c4f92ad9f4605679ed2727cddbdec5efc284fb0d65e53c616727e463b09fc13d12e9d27f2c374e148fe9e875205e521cbe0a003c24c92eaf1073242fa5b1b9ca0d0f16906452bc8fd10bc901f66c76c38b5be50945c51a51fd3547950ea54cc5ff947e746258a7d2fbb64fda25b03acc729e32de9280072e7693d3fcb42282162e9f9293eff218c45511046875d1a51fbbfc7022d1a3fd30c2b552cc60d164a5e359db56d2c8164f27456f13ae78c0a5ae9c263ccbd5043e2bc44b6cd859f95a65e9e023d581a95ab8791844974c924492a7dc9648bf2540f7e84746e4644a1efe782963bec5d9ce51d68861f9f623e5b1441a971009671f6f48cdc14e975dd7f42e3f7f563eaf913a8446d49c1d7b71519c69a7ea5ad3c1db0d6545dd9c3c6f9032a9dd6592328cbbaada03486aa3cebbd6502e9f5a6f0f835e973a581befcc1aadefe7b3696ba71c70cd58c584a2e6371b5894f8b245f1ae64ec0988bb7cd8dac69a04076c60cba4ffa639da15809f0c930742ba0a5d50a647eb183525ed7917a6319b2a421bde9c7fed1051c245e38465e89eb009bd12b12e1dd026014a991b743c16e594a4c94c182b44f035fa99e5ba8011a1586f211841089925f6991f2c5944dcfe0a0175fcf0e63d8016a7a978b95904549f7b6323aa36dcf8ace4f3937dd0553d4b3cc9f432a963c80c52fa858bfadd9285e7c2198e2fff68cc32fd980768e96c005dac7b04f91e92c005765457eb0623b2bd254418796c3dfe8c258220940051d06a08db8e60d6a4dac7042c46b5e5cfcf0573ea6d9e893fe9f9539befdd02b6646dc45af965f3c701a18c5780dfe45e84c59654b826c03636816f299dca5761636dc8416d91ddc3dd99f71b2cf16997780775ca1f9778e98c2c617551e4671a7673fcd8116afc6017ba2bc17273de4354d2f893ca7b1821940311c734b19bab458648660e7ab966570911907beeaa2abf2f07f9e2590aa6f60d67676ebb59db77ae94358c497a9c449091d26fea351462248a428fbab54059524c9c268a0a71b5f3c88bb25da8cb875694cd76ede7c9e4bc69b7f82581b765dba6af84a41736a65eccb1a840acbbc86300cbb6812810effc8ca04622d6d2c3af5fe8b193e6f2f3f688ef977aec34aec0bf125a2d60b328eedc45a0391c5a1bd65d8fd5dfe16c43c4e48ca791d2fee174b7ea887af77839993fed2ff3bb1814598aec170e6f6e3fcec9d2ff0fc5e00a87d29d68ee5528ca059ee21bd71bd1573fcc47a0aaf7be8f1e1d07c87c2ca4d102f6722413e28b823be26a8b6ea5508c900de7983be325dabcca74295e7110ddec0db0e17107680a42f1cea73ebf5c5a55341526479a6bc8aeb6614b3ffbedd74dfea0ca8e2a880922b55699d1d2bc699529197258845802fecb1555a63202662db18a04f4b5b428e4154986af47396258d43ba5f509b430b4efda701c7e1933950eb6ba2b0eb20f8ff8f1995e849beda61dc3e7a79146fad60cf6c42847f8e58cfd6b12b99f4a652b4894f768f3aab188ecf85ff484d7066e09b27852f568251b66f23428ce46d3c1ec7bcb55fb2d5705292336674a2fff83ce56b522f0319b4931934900056d0057ccee3bab03ee8626bc8c93854b168b1e432aa221a11bee1e469679c7ab8695f8d0346ff475b3e7f28d7b9fd8f0545246507668d66eeec7a28d43eb07275a39a9e09790b7b8452271843882e79fb0fd03dd812ec9c071cddeefe2c847e3b19574e45dc67d346cdeab8a0a633ac1f4345dd2941d83006da9d952ba371046525060c4cf38cd51efc3a9853b6a5abfe69e5d17f75d8b94ab029ba01461e9b807137568350f2f77987a725f11c1ceff4fe40a94f21569e6f0812dbf386e5aa19686bcb8d7722b0e2dab0efed58d1eebf6ae6d32cd6da65c07ce96996e85eb6ac8503c9dfc8a4a7e77fe864ccef9d3eaa5a38cd7cf8ec960b790de14fece2579651afefdee7f132f3e19e12f462a7463226b716c41a05a59c76f0e1a2f728f37358b08c2f3780f8a4aa72791834b89c036af24da6bcae2af00152d924b99b20cff4c64d2549dc4f5624e6059ce829a68a917ab079535e8c92a274363986a14618d041a175917bcd950b6956f6ff730c3434a10dd0709f4110d5059775f0e3f9ca55c3077490e7f9fda88cebbaed4d239ccf15b43086d8eee703675b5e7adbb2710fcb0dc6ea993adc96c1124d33e09320bb39220e2893fc81c81a2057a6d0e68968ba12d0e11826de4096895255f5c16c939bf5edb868e08dadae54f5e79c2c9feb20c52726ed445f508daf3ed5f534dce2ae9e43c8c041470e9487bdcf75fb01218f832e2e70f9fc2106f277466763fe22f199a4dc22755a655d2723c106b8798666db7a5a4bde215ca3019ff9b4e55cdf056685551823346c68b1ac6eb70b5594374c805ce6576b4de24b1d92662f55614a8369e619a1716e67c5cc2b1f5a21d58134d488d90c367f354d849303a88474417ec6e19f967e05aac21778983b6ac4c542fb708c531f8b1c67496e15f776627ac720ea1268d6acd234f2e9ca159cdc83f549a688c282dc2846e096058297c666eb0c622a9ef7de5eacf2f11d7f34a74dba539d46d10d0cb96afead6ad0550a8668fddc40bf7e04a088ac211adece9f7300adb75f151a777021e816ae775ac969af59daed30b5da585672fc4acac73fa466cca739f537b6bd2a215458ddf56d714cb4c098995ba9e6a4dbd515b9baf2426b14cf5007e13520e25ef8e27ad1714dcfa33fcb5fcc0dcbe26b5e14222671ed7c3aa239a3b39d2bc8e586e3e46b7f5f8699ab0e0a8370889d95f9beaa7618f61882c26f8f0b393e6c5960d5912fe2172ffc84c9101e7c9d44e03a8da946620cdea19269f074a3e93b1f1920079b44152a607f9516f97c8a66de92f9a4f3e7922d0bb4a19e6c67bcc3cb325bbe3a0fc9e459ddfa75a11ad071e5959b342b141682158bbecf7eff1984d22f013b88bfb60c3d3251b2a1b1fff499a4eacd38720a7c739a1a3a08d49ffcd88188f603de69f0af1f435477ec697d6f5350d6c87c0e8a9a623c34b672b09a22bc8b8447e6464013f737e19024bd6adb2365f747bc632afe669d65f463dbfb5542614ca161db69005cb7d096e56c5b6197b295329dd8ec1439c6444f22a28ee4a5a2d5bccba9d9f8a23ba7d8c8e6ada7129f37059ab03c703e4f36133984c35578d8b6069e3211617a4bede229ccfff046b4635d5d899a96f680d20d1303473c1e7b43fb63f4bddf4751095f927fc0e1867a809640d584fcf5139e89399e78ed18f3262787722dd69c03908d9d8f7f0f645a454cdf249a26bc60022427b6d70cfae8d2f7a32aefcbeaabfa18957ca8be62ebf7fd92e73888af0e834a680cfff036b4b108319f8233a5d2cc7d34b7dc92f4a83f0506adfea76f77b87874e1425b4eff66c5ad4073b260107e17d5d16911bc07710fa4d93b175024183ad8d44c92c6115aac80ae42acabdd95950349fcaf0b923479e8099c3d039c190e0e668d3b1ea3134956395da6eba299614791f5ef75c10fe06aaf90acfc58317e700872a8cb2d171898924315a207f0091d39f3478d2c59bf874b96db9ce0f7e8b85a9b805e07dc96b219819d51663ff8eeb2634bb42ca883d85e3d3d87bee2f941ad664639dbea405d6fa7929c45efbd568bc4607d5a82b9d877e2672f5a790ca691716f0101a6a1d4d51389c53f75c2cf36952a6b2e6eedf1f934dd064c20bf41a73b6f2621b837c31a54077ebb78a5c343640de030c38cdf729303aefc707dcd5f32db2ba4958ea28ff7802b325ee2dd22af8f8eda3702db748b7f7be3fec48419e6178412b4f2fda66c884d4c9ee66764e633b9a3200c807f8ca51fab22101067c3b8c1e49d112f1e21847762bf3d1c7a867f132414f668d42518ecba610cfcd95a3357a2b475c127b5091bfd466346e43ed60dc58c5cff42d34f758a520793ef282bc7d5a17d5e73a59abda4bad581224ded2c100cacae2c25bd4ca36b9c9009abe694e5dab45182619dded1832055c55208d09c0c6200008ae6d48e24385bc95418416bc69744d47796e21c45b02f3dd9ddadb212199f5071609fb2f267619ecf155fc00bb2a2da661a89dd6921981c43b005faa43fd69c779f20ba7cb64c0a6b82429b0082e604abad18ad63e10ab12e449bfe395140651c16e9fd2981758cb7d38c554b7498f3c6a320f4cc6b01bd07ffb20547da671acd4c6df37f6568a6428daf774324362825b1355c194c17906f45fad86647a55e09c42f45e4eeafe77a052e799e0e4802673bc83bd0f0b6cba2bbd8b00b35958f6ff2906cf069c5b0fcfe8be4a29f3922f9c74c2c69f559df60b5de54ad00b22f5e7c53c13883249319ce4a410753a3fa6bd843a66ac69b4c17e86e1ed25585ce53b5cbfb13a7472e7ef8dc0722c7f3092be3412249e0d58246c81a7701808aecee337b731862c7b38b02c3bf8b68b0cfb86cc7388de0a3125bb97605b13e2bfb9c69e4b1cd3200f2dc7093c2a7c267ceaff94841bd228e8cf540d34377daf38adced8a3f88819d4cc1d6cec91e417286510d46e64e32e25271f2e4a8abe37c0b3e22fe8500fdf721f989d73b45728b777a1d358ec79e68f370441cbdf3e4200d2eae942a9cf3a922e21e3f81b3e1fd2259bda6b39fd16cf06ec8ddebb6498a012cf4fd88d30f2dcffa188a34fffc52079e431ced5d5878d9cbd5baca89a00477b77a9d3839acef79dfed29dd704e24a7a6520aa486b01700261f35d2d48449d16cb3f5a1475988c0d220a0e3bb33ef73006ef2718264c203fbe9d18d3d42a4ceab35896c629164258f3771e0476a0d0a4b0e56ccf6d2f465bbea10520a77bf9ff183eaf241e11c2875b63f3b9b4d27cdd494ba2f4aa738a5f48464d9e29fe4e5ee037ccb3bd50b3a24114b8e2d49aa4e3ba69f01044e0935243d618d5c27df30ef58c15fd6c9dbeaf8cd3930840c1f0bfec877faaa33e0a3c99978d4cdbbe90173d85b38994be8bb826e8acb25f0f0778c6ed774a2f55962531d2d58bda8bcc82a269cedf9e7cc1c4f69b2c68994b92162fe3ff7950ede016f3ce171a29aa4f560b828d88f09f08dce4343bb2563f38a211b03fbd6ecd8f16c7d57c822ee3c29b5f16190bf4ef0a07d8fa0019feb1a223539d60a1f1be4c2e952d2c4a5300cd5a886e9af0 -MD = 4732bfd9941893d6597ebd157588b7438daf1df027172664f8452d019cf90bc36ec890c143016d38c2b8f763dda58f39 - -Len = 34288 -Msg = 5082eae7be7e608528be6e38b84f35ac404db9e67d0f431d9e9f04cc006dfa053c441808637ca1148872d57d7f35cfffe582ae5260f3f3fe28732a71c7f5cd4f1d666509a6dff2b100208d0da73a4cea048b66b2a6ef9741cf35c6f532d0e604fbcf1a1310101c0496b0df0fb8c57314a3502a2fd56df98e98cd207fc9660dcdde697e4d2875e7b4540a13ab38400d26cdb941f177d4df8b8d23803815200c52cf1bdbe076771a6a4216710bb112e2c787aef51f138c12e3b5202e489d64aa3ad5cd77f3827e7fcd67bd4054aaa3baa0db178ce232fd5a3c18aa71d6e99bae2ef9679cafd5f3dc86cbe5cab1ac5b5d58d0dc4f615b8f7e3fbfaa930a822ee1d542d2903cf63cfa3c767755483ea293986ee586c516aa4893b109da0def830bd8b8f49bc16dc3a198715c2a41e8e02308be1a7935ebb67ee0f6ad8f07b804f4de63b60766c3ef9841c37a91c5327dd64fc7646fda631be9d09780f91f661863904c001a557f27a9e074bbd1fca5e1741692a9b2db054151099b69627e802621967abb1eb329d59a1d8d06340dc874c50425d388615a907e330a4f104c8e98f797f5cd59ab4960349f14420020239f90c28ac83a94e97137f7ed1c4cb019d5aa3bc620146268303f0f14597e5f3fc89ff7c9720f9b3a4a45fd4bb75ed2a845052bf49b96030dad83149232f6f0a359b84ce8b7519fd58471ec2c088edbc350cf0f872529b4c13fc85798b5b0fbd7b8a469f18146c74388816c98f724f3f25ecf8e88a8139d0b4ed5802dcaf3a9644f2bf5ebb7383c0bbd3d27986c6741bed7ce51fe0b9de8734273365a590921d1841499df416d25b58a6fc2334fa0eeae239400f1360fba81836a21264a388ca6c129fcd4072eabc959dde8728818214baae9426910b13ebe7982ea9985c9126c6d30c7d2f0c2f6d091503f5bff14031bd595bf6f83ca99b18c8239bbf304daaaeff2a1e2e6732d5299906ff99ddfbca80a5f200a77a4f6e32534b5957a300de8b137330ad18779d5db65215148c0737ab2110d43d2857bdaaa5e072e0396d2af1ac62454974701e3be97fd6de9fe511736712d217db6502085c9d78e777f528592691dc821fbee03aaedaa5469e27d09fc4829ac607f9e3d1c3dccbebc31b5f581e6c66d57eb67be0731d10eaeb41fd86e5da8ec63278db7d9828ec5bcf522844f06c64b215e959a3e2919a4a2bc610af37a53ea6ff84418235fc6ab5d12c1bc6591c66a689e9f21b59e2b1d2c416929f265d2ad6a38ece7619d1c7989d2bb24294f6dd312f1aedbd557ae81338d5fbdd5e7cc3d3e30acadfd043736277b38440408648d09a0ea4f061e4bd8a1e66c4c03c8eaa3d128adf15e5cc0ea1f565fa55f8352a033f27a05b1b9aa2b5d95b860e4d0d3e60d68163bec6d5e9d59ab59cea089e0157a3187853cf172814fe16a80e0c72f0ed83710140fffba58bcc24e4731e2b6f3c5a33858118e4be35f14aa355f74a8241cdfc3022fd97b2232e2659978567b42fb92b6059658df587575a205c9a0e42ec0a6568fb4c44a04a354c64bdfadd70a064428143517d3e8794b777b86138b37acd5f2430688cf05f5619ae5ccae7454cd02b70d5592d29b53df541cfe954644c8b3bea58dedb12d114f09f0a922f72738138b795d92827aeb795f729aeebd5ffc8ae33db2bb9984df663af3ddd10b8c2fc1cbe0b7df8b8c2960c004c0e5978f30a08893dbb92e1347f05676d083568a9a52a0c8ca4196daf6dea05ad9447cdd4c3fd63072b019e132338401ea008029610f31bbfe804b6a383927fd4ed1164f38adf59bdd6801f68678ed1d930f32716d40a740bb635146d9ba7c7485550af0dc320c5c86a98f5b2d07b851337a146ba42d29e069b35176bfa9c847e89703c5201843fcd33b6b170d280e263207cd1eef1de0217038f200d44e32ffde61a7d8eda5c3022ee53c3210231723f87f0693375af38e39baddeefef0e323ce799e302923b4f6fe70aab51d3ffad0eda966d0622a8bac2a01b94827d9023b22a891d5bed83e61aaa55fa71bc6e0b57a4f96df59d6d005acd42f14364fb8cf41b628d0920d87c99c490010f4fef05b05373dc805a5e92028fde75c139b2d68936b0a288f09bab93b2738f98f305349f82a04914de1ff8504428827a605888d808fe0e59c16fdb6ef06ac69d4a33007b9f0934418d039bdaa6cbb7ed7d4f2c770e95110a07a784a20ad0768aba1b01eb25191e850bcc04f804327688e52929dcb4206af857e55fc36e5effefc70fb154915a686dcebbbc3f08e75edb3c59197f962a6cd326ab95499760c34af593874e8037b25a4a653a260174c152e76163d6211da6f8f86cedbb2280811aca490c4f6e5b8cd9034b0723aa455e9e7ad4a186f174a9f8419bc18e7c3889ddb992a8bdb81058688dff9bee5fe3770c6b254af863b9d64f96dab94a10e37e125802f54fe9f085974ed570bc9ed9bb2b4cc5d8a11467cc7d6c8c2d549d2bae470a0c6a4c9096c4d3ca7f1e34e3829b897448d3276018ece0373296545d7bcafa6421805a386d76bc855f0cddca9888959620b2e1f317c8368b609ccffe5e348adae4cfef4ddf2ba003f7b52db06612de06e000672a1edeeeed88a90ddc4d7b96f2c8b1825d76442cdacbbf8b3185bad16b09343d9188a167b23d33b493b410ad204fdd99c3cd50b15e6d74acca71f10e170ed6cbb5dfb03f8dd0d55aa14c941c07dc9cbc2d4ef1ec233f8cd8f7b545e2bf535097f39e7bd4e4f5f646815166820e01876ff665782badc460b625ba3a0db8894a38f74f64d63c1f2f2eb07d186d9751161bcbcb83fe728e88bae10b4ddd97132c152d6d1ba217bed869ab1a1a4d584dd145f9cb85e2f6107d5dc632e1d0df836eb3027200c6fc479a9dfdd2fc9fb55a31752cfffe67ccdca725219ba685f65c9a9912e8a4b34e6bee1215123fd33308cf3fb1d36dfb5b65ae97afdffc7b7ff1284ddb4b8805a27e3b9c9d62448655cc02fc44d0551c262dec2bbd6a641fd0f3a037c8152b3c8d011b63d34dab379226653142913458b1a7f867c6b56df19dd68afd75dffea66286f62e633ee4558caa6e7527709c2f72565bc2785b8a8f3b1c50e5410672f1c7926442c9b0807e89ca974e8008ed1f0cdb7ec23ec73a473d379aa5c613389d2095de47833cfff12df97823d8c4b795e589e9ed86830db828aab0b58190b0170223dcb30c4ec37bfdd9897b9e3e8c2270f415baec19756062083b7ae00969dde0aee80be1606b7d5dcd23dc4cc0cb4343ac9aa0dbe4f1ce8db2a38c8de7d670409978b88f1c6853e2570fbc6105f586d215d145d2901351104c8160c7b6767cb696075f81dd4abe000985927778bb5ba0b262006c854aa68e284d7e49ffda4197072c57461d731a5b473e04fc935d304424b567064f182d4bf8705b711e726d868f5036687781d738b2817a7ce07bb310cf53e03c47fc53fe1f927ec9accf5ee9710b835555e7934cbdf87954ea9742bb24c6128b2a77b909101c6ed02551a4546ec6b4994314dcfbdc2b68210c306d87b774645f411adaf17c7692111299cc3bcb1a40a0b9b9f2ca9f62ed7ddfc7a22b19f75c453646383bb7498f08ef183524386ebe084427933d7a677fa7dfcd7f09aeb770b9749a3f6c530dcc24354d7d92193c933c5cee2cc8ef81755b86c25298084d384886777ef7c22bbfff6fba13f9f01c56b98e8e3df1814984e56f46db7a9911195ed67e6572a73bf0f708de96e05f868f0c3388254bb23824f1e3bb6815e3bbaa890f0f814154a705b79b3b54d9b9f382a0e65c913c04d5bbfd9ea086fe6aa552437abb60f85d05549d9150fc4a81fbf824318c0046fb9ad064fa86b698b056a71ab3f2730c42df642575afebb76a0855e28f86e100f90ff8c481ee857937581f7b45554601988dbafbc2a8b1a4b49112787aedb1deaf9dab88cf486214721231d19954385cb098df6d02fbcc97042eb4626e10f14461dc5f4e2d14eb0ef32d74da4a6fe8823da93815b0e9bb12db49b21cd3a13de6c2448a8145d46ead3cf26ef1b318d52692075b6257230b8c9c7a9224660ee61a435eb3ae84178b83a21976947ddf6cae506bcfff50182c78ea29eb058fda887357837132725ec036e4fb224f05343d7deb1efc3956399c7c26e0232cab64a376916b39b99b0a9b1b582ff88de3b7c639e4c9669cb417d9eae525b126535da598637e83a058bb7ab58e207fed83ca7556bfd395b604337369a7733b7f12263d4d5025c59345e1eda9e9651eca8fece958eec61001c10cd75ce0411893624ea929ea0995eefd0e625d1c765bb142af80a4f4395c0c6514a4591227ef0fbe4797a293927b3fc891873379cccd4e5682e9ef5275e0328adb38d2df901540a0a1774bdf48cbe2332bcae1a3e0d9de25f7738cac2433108cd1235e8b0221d293dcd68a3f952e92e73d8bdc0d4b080d5b8dbc0143cccb22f586e240b7069b32125a23e2471009be3f3768872873ee4841a621f1cbd81ef65f7d044dd605f7fb96b9ede86841f3b0c5b9df7777f3e31b92e153b2a6ceb4e71523f7ca8a98be7bbb7c931115936336f5256f219e338ce3a9cfbfd857191381d10c3b4b2727554edb02c1d0f19cdead581a8619edbb425cf0b1c4d77f5fb162fda64d445e4a62f19ffce8bc6eb6dc8058f9b2c4f913b9d422381144620b24e70572bc5a727a5de054cb7647ff89c35c925373b742a549e5a8d31383b193d4aa8301f6d2062facb7a3ef08e8267e599e7eb857655d18890def134a39e0924709f0c49b5fabd2e5c3f7d80f31761cd5c28888cc639ac5edc97f6933bb717f02a1c94af857b61c8fb1eb26f7a860edee654a554116ae35ee84d4555eacd6c28dfe9705bc6ed76500fdd85c60a16959fa033e9e6412e9f101dc78682972a2f54f6cc47555e96234f00459d8c8d111f98f08cfd493cce08fde3cf60232a1489fdd98ec1a337bf914c351ea3c9eabdd3523f298885ec9145aca32b7b3f8ad4a2aaeff7874f38afe8cf18303e850963da54f6d033a337c17fa5c3a480dea1b2a1e3a0ce416148b04f60104217c9d24a5b267b4aa6aa07a4dd71ad02170856f5ae3054dd97df5108ee88851ed59c2dbc7f51385f88a243848897c70de7c691e7f31a73ea2fd33a00eecedf8a210702ff6e5c93d68294d3a7a79f7b8d991f3ace952865beb444ebe077bb874fa311395c4fcff6793b879f5663123049d41c3af3bfe39321cc3b4bf0b0d6e33502c2ba1b4a33c80e5c838ed8e4774d0a41c4779e97d163da1fbf4478c2a75c03e7226d84890f715e8c908a7751563c98881fda17457c3eb356d8bdbfd5b65b83f93a3adf31eb593174b77b79d23864bb50354ba5f26c8d72198e9f0e0f8c467be1110a736d4fe84fbbff472791a32d3b410fb391c627b6e00fead0ad9bb086b446afc38963c4867f0a71d7c9b322ffdf04b4f824e83723c5e1f339e49faa84f6d11d4f693bd19b8a091313a7633a4270412c04a381243ae937b2c2fb4403a7082a62945b1eff8f395fefe308c7755eb79f80bd59b8746513b72d5439b14256b4f8867ca734d5ca52b50d3036075abc79c7b70d8db6b10b0d0c6ed5e70feffbc0e392ee94a4dbb49db273e0774c71c28161d9db86a262939ddc7d2f4d8592fdf5958dd16b9799b5e4ff2bdd14be43d99614ef0e8da510678cd06048b33cb4c41bb37f0f75349836ed433d0d558457697f88ff90eae742eea18f210a615bdcb8fae8718ff7a45f9d8127af5a81c735db05661448e58f8090a6c2c85b9e0b934159d969393c0e765468538babe2ae6695f056331ec6c653b561105b25b47460c7023172f58b9b66c16a6ed9e7be62710108ff66fad4b341c59c22e44fe9bdcbb2bb9691ab2b72b64e4f209ff85e0ade86140ab4c4587fd4281d9f6ac1860f5c6a4db1d04365bdee62de13e7c50acf368bde1e26649a519447ad30f663d2919c57802936a581a19764e0ecb83609d9007a2ce4c2c3e2520888137d8f1d176c12e11ba6cbbac74838be1e561b33a54fc4bac70492c778a9b854 -MD = ab4cced009cd42ca0a92339d0513667901babdc49182fa1d414cc91a48827429ad8cb733b93acd82e0edcd30d0ec568d - -Len = 35080 -Msg = 965dcd60709712fe8f944dfada3235397690bef28dc4f8054fcc348f37c76abb9066d7db379deab7a29e61242107b0d9645aa27f3eaf4207a8a5fc40099e00a9b52ce784b3c6992bc3c06ea79f7a937f82d7b0cee7f0c798930a605ed5c6e3f00d9845836b7ae603f9e2baabdcf1a8d2d7ed2f0810f14f6117e3a71124a7db39a0923801e7229be74dec8e575fd5b57b6b8569544219a20a3c181a807da9af2c77030926b0247e7ec5c632d3b08f83214688a4db03d0873a0a9201d46834297099d101194dea58716c58ee485785da6d71dc29c4de7ec8998a37a4346db00fae0ee6660346daf067478b0adedc218107f36b4038588b2bd0c3f04ac915852a8ddf28800b245e10096045cdbcc8ca4296d41b305ffb607987bda63cbbe71b42b61381995a6edd7effbe6f810ba3e7e3c21cd643604e637965813fc3316cdb1fd0b2d8f717acbf03f069f26cf2f3e22d35d483bf64d9fdf51316a525532a2b8884c514e36b676b67856ab4d69a4222e894040aed922596b33984beaa4aab74467a521fa57e254b7265c89f092a170fdc8ab2531513b9977d7ed4749c3e771f225964e0857771c6ec388b9a4ccbfb11d0bde8457f0e1d66198a0dad41561492e1ca003fcb7ed0449ca8bc8ce6a575908ed5adca72acda6d4f063753e3bb0c374e743024bebdcc2d4b5b615f20df0df4dc7b0ac938157713e99a5b4dc895e7753000fb77a759eceac1f985fa42a24ba58357052b17707cbfaded8083380b2bb34e156a20ce7db8e1c62b2d459415b80c4b10a9d658e572db65a8aedd7d45625b715c83087b4fb97b229963285d61db8ffb4efbb3429ee0ced772ed43de6c13d4617c5015f6f776209cea2e8be7ad3c975dbb05aa1fc04e00ccf4469da2a8c786e61ed930869e7839fec697567822648d37fdcea4357644d90bd6c0d3122005d9c8ea2542756c452c0ed7a47159e8dad752bc5e87cee64bc15ebf64cd76fd5535ce873c310988676395c25fc4d22626df76a1be3d3038ea208b57397416663f02c29e26e78b1b66445a32d0382a04d10b6a53f5aca395aa5e5b4747ae39844ca86ad6eb4a424cc83927cdfeb3abab62c5f87b0bbe712512e396379664287f038f8ed89444784417a9c23bf11e9b436174e6c10959e00faa1704ce2f7f2c7eed1ff84c29bc732adafcf425b16243f3577ffdccf6673a7cfa636cb519e58ba990c16fd8b0997d279a9985334765ebe4cb500545dacfc5938b2d98945c808d2976dbba2733c5dc63deea3d0cba11db3e454ec6d3bd79ca7de4de4e1201367c2627d7a2dfb927d8052e56e459124d5a284de1081fa84d90618ddf57d70ef19ec72a1befa94ba7bb36124541c15700b1ca6c7192d1a23361680f977b8c8e983d350611692cf02dcb1d131f1ded9214294d29662d90b41383b9f16d81d986139f98461fd711b0a152e3b84d4084cb7008d90d29a104e5d53f7ebbcb3365004a0c176faf03ff93eb96af8a35722f08fc96959f20b6d63d61dddcf61857d90325ceda0b28b39fa2f4e0aa10407b9653a01daa67b433aec49fa5fd29bbb6dc988c2c0aa1f2b099e4a277fbd2d62260b344e340ed4de2338378df09dc1e1817c6676dcfba75c29462dea5cc5860303631d0317dba54890e81d2d22797a84531959eda50dd18b0382291b0422b446ebfd32c4f8c552ff1e7c697c780e3c104d30d19bbb69246442e2ea1e187d2eca1a4a34185934648e2645bad063c47d11ea537c058286264441e8ef880c3d5be948ca9f51bbb1606243047fed7824c405c4e1a7cf8cfd3db79af487cd51dbd240e20ec31582b4cd07ef19270827a78778477be33e4d36f13ab8a661727be1085d60874de860c7010b95045ed4e4e56dc5ec72cce655bbe74a257efb0c0ce5949b5eb49e2eb850a2d9df4675c85236bd8b4e76b36c18f476725bdec2ee6741dd773717427cfbfa38ff28600a46d2441d44c7e835140989252fe64647be2d8e699d843fc937ce1c29e80ad19af4e765f36ef357d092c9e279ef3f55f7efc233bf6ab09e9103914f0c20f12b86472444d6765b46045cbc88fb4cd18e61f7b7da556b66a43854d80b463665ce8ab20b494d076a234ed673f51fa5374ff46a90dab21bf0f13d9014c96e94e34ae6c9feebbd8eaa802e8462bf5da4fb2b5dbccfcd5c08fa061f69da11ebc8f42148f381b4ae6886dd120b0b303bb87790dc62d71ab99eec433c369a6d544f12d21fd3363c964199aa97cefff0405c57211ef1495b615a4239328ac8442e93c9edd9cd8edc1b965d692e44a38801fcf45c83fc8907d9c7866880db062ee14373c51556ee2ba4d34ca95400886fd736d993a9c9389889733351a5abb695f2babb084113f693a884e1db97872100568691670efbba8606c9d3752f716c01f9860a17eb691abcbd27b780775d0ff1f668a65712189178c857e1537cd0991b6c11eb8482dadd0f4938283851d6a7ad4d5972e451845fb94489e77d2c2db01aa10ad9de95fdbff3e332ce53d5987aaaa1e5918f5be377f011fc50329bfd63a85ebd4f7693363602f1a4147371270b72ba798cc88faa7c85a71ba6447ad4064cebc5c6ed1908c1c51b089507a2e6ec8dfd91bf206b3dc0127a64640317262a60eea0eab28609f5b2c5ecba90e97c7054d1cac3178d31f50f1263140f1f88429ccddb056768ae444468ad1f9fb33c397fdd91131e541b8dd3e58430b8d25ee1590fd0a17c4f6a300299e61e949ecaca67776139b55e5efd199a6434a10e3e791e3b2e694198c24b65d00442101a8c859445d7a17d0a70b548777fba47f19b8c54b640a787d34ae8f681a42482b5161d9ebf40e4c5f6f568d923431c2e4afaada527b3f69f8d68bb3d4522206cdcebd4ef4a597e3092516a54143ae4b468c03f8805f4d0f935a01492912ae05f10724dfe8d7dc83d7b194c41c0d3ae8ae9a0b465c78fc1455a8597aedc1acea9ee4e0b44df1a6d5cffb1810acfa9c4123c00ced6e2f141d47a8db6daac6e560dd4d38f6ae5dbd81fceceab478739efdade64c153eea5cd56f43ce4be78b210db52a73cd9082e92e636a51d609de06c454f414e455129de1d75f7c3b2d7727992e63da607dc8f2840e5e979fe5a49d4021d3ac853a109fec87e52b6603f2c1ad50e0b5d8fc979f2d04b10236962e2b171b695c1e754a2a9c85be24f3f164b5f1248a4c5c9657b9ce4d49dbc3a4e378f14b9f6cd88f2a0699dbd0af0b7f35cc0cb147e615d1700812f2106970952a4b77b75e23da0f17fa8c910513d636cecea7ff00cc2b384b549efaedf663f36d6e50698ccb4d7d79d01dad449a7b9d958369179e47c5504e651d6dc7c8c44513a7256912aa5862b74ef339748a233df3b3fb00079d0ba3e20335538828bc1484bf9ebdd90824443b3db73c7f2cf59c512504c2251626b870f58eb5175e73e7277e626fc82fd8ae6c6410bf4cc81a4415a22d66defc3e175e04d19a5cb2104666ab1a87c6669d25b28da7c9c3a6b9bda9f21ef31c957a4915f8a60b3f6cbbb9a8106d0bbdf49b33757e2362cc0dfb8d73dd7e71c62b03d5fe99b40fa8d39ec9567304059422f95f1d002e924f47083edd2bf5e9c404014380aea4ae7f30defdd69d867c3338e03112db6d62349a07584da32d62fe689b1c02011df0accba6de91569c79827e7732bdd78ad9634f20612d0ecbe45ba1f9e6ee58c8de17ec1cf3ef65ee03683be7e984bc2d00c5ad7de3e4347a77c6f6442cab7c4d7fa9db68c459942322d0b957dfd051fddd40fe4365dadde02424aea473a13553dc48dfb3d935a9e4de9f3ef09a0a5fa37bbd889d7077d1a5f25e124045384a82fbdd4225bbec6dd840be13d9a498aec6df2595b18b23d772ea5c6a4129d88584e6514ae5f1e7a8a84f15803b85e4060f135e6ba73e46b9ef1206fecea8e9acfea58a401c038d22fb148ccc3ec3542f261e5252a811483dc37444151049d3889b3e726cf17a45a27a950c4109e852f0b208e794dc8d912c9618fff82f94fee100bbf0158ddc79f2cddc7b25c57c45135cd907786a39894d12041df05211d37fd823eb8417b490d89bf1c3c19905955ecb9a99457a9d996add428843a149b829c97f4d02b887f21d8cdaca5dae0da99aa7538544364227499fda263945c316a97bd6fdd598df068949a17a412c1beb8f9a0ab3bdc4af9db301d2e11c660756c59830e345de4336e37a4eb9b43ab8c2044ac90bf74c6c6170aa34a0322b9ede46c596e79cb33ceaf5c7e771ff006a96c25f97743cf702dd4844084bc5bd0f18f3ac0ef1203e518885d676896ba7bcd092827dd9d2ecf877037454c91b44e26a96f5a3e91ba80a795c5202e93e5733d63a5b811f0254d69968e422047ce7a03ef5485ab7d318ef2542e19479c03759118291ae2f145725aa413c79e332ced0fbda4b3d4391b789f4fe2b33213b70b5e934cd09f1501c6c125423624e8422fa090ba953759cac5f4f5ad9e7c9f529cfc716b69c4dfecc33386a42e32db90ba6d05008a4363e20f99c1c93b859378b3011f2f56e2c658e03864a4107681ab05db87311396cbd3be0440d00afb949be5f318e318774ce8b6263bec7d3e8ef3aa6293a6b190162249bb0f5c9d3d173e9e48db213f00f81ebdb378c7c519380d00a8b6fbe4cdb7504b2479c962d89fd35488f2842b0e3c6d5f36b7d0a8852149b1046d8b4dbe43e02ae70c90ec3ca2ec9129db767cfdae57134655916800ef4c340c23ef3cd020447169546d99f7a50ceca21262a56db25e8258ee84b42ad696f226768232a1f11fb721dd9a0c983a96bf9823e324ccdd0624e4ef14ed519b9c73f9e20edfb22ab444b704b0b47cb82c92628c728b99a2c06380e3eca41382cf41ecd2cf947f31b4d27f663c1233c220fd97b89b3a52982fd6a3495658ff40c1e475e55ee167aa93c9117eb6b65bdd3669ae34b7c1962196f6c2abfc7c6339f6c43b76374709f9c3a0e3ba9b01335dbf6f2c8d72b1c2d3b83c7568499eedf2f0799421e355e4a3e6e28ca6739378e83e66892f367b7722e610222ab8310df0217d1654ed6e763d501662cebadd8af135f85a968d8f1193b32a5f5fe2c321b60c3748aba0214d2aa1a50c9fdb5ff80d388cf75fd27d20aaa1e3936433d5f7b933309182b5fec7f05e26f0967f9b3e90a8ad05f7cfc622ec34c454f435d9ce7e2901877699577522d814a55f020fcd2028c10cdabfeaa6bcee551a7c635f3479402290e3c4dbd346c1e6a135fd3e22301b7162854d6b1aa1210e5a6946d6b83f2b0c5476c2fc70b08e155ad7db96ec450326ad93d2c7fd4d8f68ab474ac0c8344c37389c0e29cc14af39589127ba79d372694462fa71dcf68bec7392f9adf30d262bc3d010f443c7a7cb211e6c09697fdbb1cd9f1ef92850a91259d8de0eb70e3b627c9f75dc866e0a332abc0314198ec188bf94dade6dc06972b485626392cc0e73c966a752f25c4919fc16975b2894a66690d098922bea3f761a35213cf4db21c830c22fe81636d6e80baaa35f15360cc3c7fee2a4d122ada4f144950b7b9ff7d8593e6a1c60724615efe491904dc76738eb6c4396fc0e3677e040285f95aef33c994800607f93192c0f50ec8f50ed483e61a535d91af16c775dc46599b16cc66d775b6d44c21dc2a2e07c3ebccd0c123cd13623fb9c90b21bc02dd74a7d7dc3d38a051b39b676d51309c2e298f09877bca09bb86f2f50a9edce08f7f248469e1737b194dfeb32b2e4f1c192b48a36cb4656424db411b5a665cdc24221b05b97a1070d5477ced5fea12ef4a99fe85b9f6268c66e6b02444a0c46063049342142f98e64f4c1dfd51ac027d891aba97b56896ea494e46f610759dd315ce9422c42892454d02eacb499da52ea05683c1aa333ce494bc0b7a060c6d9d02272790108e86f49811ea3f8fe5866b55f661ebde7ea0e311d708986d8ebf26f2b852713f89fc5df82226426aab2a9a72a25cfd9a724b50864844398f2218d5ad291fae9a407de734dda4ba24171b25bd017ddf2637c491bcb6c743b2f10214fa21962f69dc90fa16e96e910353e072ffbccb7acaf493107bca9aa01f22044ba348bedcf484befe64ef8cad508401ebff7a4eb4ced241338a2cc4361edea7e06e479f9d82618e5be79604f852d506f687e40f7679f85564b3834deff64d713c24c6415b5c9b887a6787e0 -MD = e1a1e25e96b2ef7504b76ae5adefda0114c7d4a7a6c6796745ba9c9d204864156b3429fb9b9aa1908038f7928d48267e - -Len = 35872 -Msg = 7af760f18bc91e656da92b72e98bc03f1c6bfb442830305529d681dc6bccae66da9b2e61b9c97e2397fdb92f7f6369b470529c570c2d3b329487981d148a462cdb992d792e34dd233e1c239657b8da0d59b804566cf81ad5f0a7a0ccb3a8fbda673887c153d2e56c484f9230d752be52c1e35bc9af5a7446237fc072afef777665c264c18e6a3c059fde2e8368f9bb898f1cc8393d1bf18b1757219670275f0bbc7deb0248c68af929111e19737479bcabab732d7e033aaeb277eac05e185e9e56b2450beaac784dd0308b7a5e8ca1f2fcd8852ddad9f7b7de264478e1891a391aa89964dae5ad0b7a829c2c9209db346ceb26c1b967cfac82ad574761443be3f0a910968239d23b11507ab978b3ce89e22b7d7283736b9786544ab4460f6aa5c0fbd228496f8fe37ce24ca9775123f947e2b3c7a0c6737fd1634548f8b34f8672e706a296518b0da3803b82f6ad828c8156ef4978288e6d4d227289dff8918eefb5d58dd3a56fc06e726fce5f8d914b79cf5a7e73616468e1d9f70163a5d8c51dad666f6734e205c5ff0f1419bafb3d17971cf0fa389e7875cffc38ed84ce34e517e2d3bac68de3907143dd8cfc666a44f55c277376e4a5f24daab5e35b19e22f3a703e34231862b70e35b0201a7bdbe63042aa48e3ddf83e9b2800aff361d7e45f393a3d122a8a221f0a153ddee197e691f801df47327842019fa1b7144f1ceace644e3d5c6b64baebed944b0e40a62d60a3b4a26a8b2ee6c7372065858ab82bcf1a039cc985f765bc04b6b2734211a2e56e4bf7148e20133417062010bbb38eaa83dfc2211d4b0cd87702dad58ddf2c677f4f480ce658af9168db4f7b8a16faa6c66c172cde6998886f012cfcc918b530fe48fc1b39dea32651255c8f9ee8590c0c3204b26d58ef1414390eaf9fc5248614bc7b0930b8d83bfb6eae14a03192247cb8ef7a7520fbc48d34e9b8b6ed61b2e9352d9e72f035188e3dadd237f98d363f86414d9ccaa2e0037a26ddb89853fba43a7aa1a88ea105311bc1910c49328a7c2463f38a5dceaf9d912be74acee4ab6d54cadc799806490c8f5218c72869685c1bbb34e8e1667a8403629d1698fb096e0985158e184b2d4821c8300f9f1a1707f1b3d85e5f5289df5831c9c4fd805ccce413158e1558f90d598ba18cb52de0a431b2a693dd7a24d7160231fc065cedb26adca4229815f582c00333e7728a0b5b601f673066c69394c73c9e65ba750446254989f2a86a68d0dd99adc8de19e0560864e3dcff1e1d3df247d9a721b4e8b09cc08ea54d3f9c1e38b3d9d602c3a6bab0e8e240b26a0cfa208ba76b4301e31957aa79e38f7cd7955abb7dbae56ea7b2e1132c048692a6f5d870d35929453ba9df7013567709625dca17621c8f032963224d88cf847e3453a25e2318da663987bb7824a40cce859d103150a2096b75f8fbfec049b216fd3f06bd61515e4e25dc732c747557b3877eb56f0ff75a8cd397f48e9a1b1a434bdf8df553abbee347cf90f3ca725ea1b227403b66c18a508a699666dfedc4eb645bbe6ec2cf010fe6899934f0422b7e4cc039fc1ea9a29ee49568ec5766b6f791dc229075642fb94c311659ac8ec6349e732919ff56a95d2743f389c92ffa501a8a3fc4361351c9bff08fc9c7fe35a9f06697fcd171a7779c9dbda5fef098dc478ca070cb846d2688ee8dec093982c78ac10b0c5ca1a5d38bc850a9bf509685600bcafefd5e8ebaef52972a39e8b574b3ad0db1688fa9593cef34fbd2f7fe32ac2e47d49449b96c3b4536eb21b2d49ab4522653bce2bef1f638ef05ff8ed8cb741e9d5c58eff824b6eef1978740e920d5d7dd5a2143e98303cb0b2e10bd2a37000257fc11f552caa67650963439fbee5e64bb2f5f5a34f7a9d110ddcb2bfe609803fa1e8606d0475404db50f04613ec972347383ecea6353172847cfa815b2d8449102980c8788108c11b2e820f3802c83a09de86484726e3d5f17263664a860bfb2185c7e354610ad49796b43b721838d18989fe6f20b00623de27cf83d1537741b39923006ccfa166d7f14c73c916301150a26fec38bce483d4030580fb7c0e4450cf5cc7c6b4169f64a8135e46e4f821e58fa1669833c31e5a6ecf04cdea192c7f8e39df6cf6b1a6c521d1a5f06ad82ad0ba5c8646fbec1cf8d0f3b75183df21c93f83f1667fbaa482c64eefd09118549a8968f44cfea7a436913a428e30aa4ab44802a4ba3579c024fe51e5ec3fffc6ca668c57b2223bde9d196c4d8cdac0cfca127ea1720236233230a42f4e5dd6a9e8b891577e51f2f3b4d0517f54676ad99305bf8f96cd38f434c60d74fed4e5247ce7409dba72120b031fb081edc1f09096898c172c7ec85cb327555c028a74600f5b5fd16d6de44d136c53fa5fce9a1b5b07afe13efc2e8336bb44916469cb85287bb69ba02ab0e26b200093b378b0a26ae5ee94d331b29045eaa1b82c5832ba50b10fa15a90bef294a480f4f0a5794f4c8d12d8f4049cac681c367c603ef0270e65308ea38955a4145f9bc41e3f3e488865e357a85d33fe28b9c9820a054ef5eafde20883fdbe2075b818ac462d47b5a6d728b6f724c0af0c2923753194944c6ce2edb703d2428f3e19c1536e57dcbf2e4aaba0e9418be69dd40cfbded30a531d7c19452af12719f8e95c62a1a5458ea92632bb879ddccc61234bbc18aaf73384332e570142b5e52a8fb280e4ffc9499fd286afd81efb89e27caa62e701a5132a70f3988ead361c5c758b56414db21896b86f25e4ad2f44a848ef9253c05a1c959931addb1bf0e51702af8bbf774624183fb4c5b433c22539f0e3f665cf5f764f18b041f0722c69e19ee5c86665ce95accf1f364f96fa551fda4e362416fc48e05338fad39c32cf45b1f6b53f009193dbd07621bdc020fce270f8fa997e78baceb491808e7f4a40c8a3abf9512ed9452baa822d07977b410819a8e9caed1df6a3a1827c2905bce4f4ddca3da5d8ecd326c60b033405554d1b3c28abc14c3121e684d596aa15cfe250c51b2841e71366548ad94a4cf1f448a3433ee98684fd6620c450751b96cd6364c468632f4196263c5fb3ab5842a1592695b34b1f7bc9ebd8c9bcc28372fc8eb943779577d0bd3a66ae62ce5fe2a4a82e9a4e78961bddd896fbe024eb90a58cd6a811671f7ad0ca5addaf5a69b8455e42bad919f34b8056e3c286445ad80f84435cfe8131291600a1565ff87faccca3eb5d1ad53cf2fb8d458674c9d832849f89c8068ab4c4d802c27f3d4fa7a6809eafebdb557bfa96a446af735c6e864a052f53f12bb1335ef845c21008eb8eab7819cce240b74a99c36ea54ba522bcaaddbd64860b2f5ef00bb3869fca534c9358ae68f73ff9ca4c1444d0c44bfebcec4fbc658ed3362dd6629232b33ee6c98067f828e4fa4862f7bc5099a6f70a6e5885b3bdd22acf8857276d30140bacebbccd7e727018acfae1e61a66b8504dbb36a42ad417b90057bd7fc9e78adaad9b8eb1c8af62422d7a53b82ba0c3ffcf89cdd7a9122827d3824e9430bfdd53f2c23d3b5f48831fd4ca955a0ab08fab98c26644b9dfcc1d50f1538e2920d41d82461295caa39b58a8d3eff53ffce4fdb14c4913e1a3ca437e8c13953d7239e1651155e4912a7294b17ba9b153ee8a9d2111be6daac6eb40653cd8cff21dd246a4094e533d44cf7cf8ab0ab5cded4832f0f70d7a9bb0f7bd0de7e867d38968f54618440755587bb7844c5b2a3560e86426e87d613cc9b6617f768c83651fc2955325812b61d03fee5e44e53714b130ddcccb574b157aefd5c2d20c4c3245aacfd4174be5e913e1c98c7ded05f047e942ea87e45faf296cc0dee1b0e9c164e64bd0d8eb5d768929ef18ddbebc548adb3e860669c69140f3cbdc8dc0829ae53fb04f4fa9bd8f9ae109094e9f83c5e2cd77aa2f31a743254d9ec3bd8341462e7da75964cc2abdaecfbe68b7d782cdb788955dea832b4e4242e09b59424c4ca968d7f7ff9ece872dbdb73cffafe2f371d541a81fa67939fd99396c4845cb34bdc7e9300865d1757f719c8d106fcbbf787a2391b6e3bb8cc01c533f74d4e787d164840d676a5b0f0cb31464d15f64ba353fe223988216d0f291d31bc437c7cb4f05519405f592de3d4dc7c82ac6d66b0eee2663abcbb48cfac1640920b5958b9e73f7cfc84da16978055ec103ee485b6c4d995bd805bd484274ac107098764c26761fc699bcae3826a58157441de310b826e112087a598c317153389c2694984fd571806188e2d4b0f3d793d69ccf14583fa6902170aee12f8202898da817f6815a940506fa64c47cb8097c9fb333efb66091de0c30e7cea46d610c296527ef24cb315d725a5d90f4bbbe1a88a9372738534903b2022adcf8fb17c859a7ea0aa0f1ef918bf0f4c17fc69f7679c8054648df7707fa2d9f9194f4cdc506b48bcf5d9477a73b0352de849f54975b56c2d44dcbc3f3cbfb7078de202a0c16d630c6c47c70aa68dd9e6f6d0f8486149c9957afe0d4ce0fb2c2163f47d7a4735202783b70839ffcc401fda1ded7498ee2b059d5e653a0ad9bc0f520307b950373286c2b3a5890de01a30f88d4f7eaaf702f6129a5e7718dfe8f9ce7a4bfe8b080ca2afda09684f6dcab2d8ab98970618d3ff812e4394a97235a93fe6b4ba460c0123b176be6842c9c41df0f5438e48b8208a4f86df132b3514763cb4dc6d1fd7c2626e363ef97688b8fae7f6ea94d1598b1f04306b632c9d27e93b812d8786efd2e73c74f5ac592efba2142cf87b3e61462615c783051c1ec28ab2b812aa09b8853ab2df8ce169211edc1c03f781fe8414581a98a089783e86d338e6364516c68bc557c27f49350394e146286249702667fd79306e60cf70e74b448802e93c9e393f91ca27443b5af05a48e6b35261cca3beb83b271b906a566b6c1a02e6f9a43fd1f7531f52fa7ba3bf9adb850d11fb69f46df5852a596f76abf618b0fecc7ce2450ef9e1f5d0fa3189928331fa2f172d36f10be31d8904aa9599008771338cd3013f2b09bd7d6b3c30e65a54aa07b4600ee7fadb45bdde74b0bb6e10febd68749f1e62e11a5e22f65e0ced579d3a57a4e4c93ec86356316775d3bdc7e7c8746957133e128cd1d622595ca8d53445855e410b3454d6e0c1e55d887c26cce34503f1b419189596e932cb7c09380fa7a20ebc2497eb20fbf490e03025a83eac6ef6d777805dc50bc09a1ce1ab0a9fdf4248aebbc605c1f64ddca67156e68d72368480e4107c8bbf10dad603fac7656afa6ea1274b3f4a6e223b08a26c4c69d3506f767025df5a1f4e778f7974f8e0c92f132bfd93f21ad2363e9f69f264345e210a20a24d00c0aaddf291a8a619a27844c8b7a53cb8c3a0ee59c33e65a87d514cd73801028b5ff043de95280a941b06ffe1dcc4a21dc588bf0f2c765283b58b28690502d2d9786e148df25e1f02cae3a500f3c2607ba0c82cd133c825a07d3a4842102e2a75baa2c49341d15fe0229cd8a8a534f46ce60dbc5261aa7b69250d20c4f1f995da870cd880fc2849b6c2a10f4b5972da6bf5b7e1e54e73b0685d62469412eb91827e2ac4d999b978f12b7ebd5b99228ee36055420c42da610876e82e121b7aaa08007b2e0f930b4a19bdb4677bdcca9e8da6743159f734f9d411fd4be1442d3bd5ae7c5885809459bb09b0920eacc165a548834430c42a0745bf1024644589e375d8bce8fdeafb043f8011c19681ad90d4b7110f33421005f7cecf4c2d98072d532fab63bb2a95f621c1467aa5e3e58c96828bd6e3e98d7244c199279fb43b760813c63d5fd7fb8bfc3dcd21af4c0fd5553b725f9532f8e8c757fc5b5d028d6a1f15abfa4e6ba2524966246b354292f7bb3252edf9b6f8b5f9c2673bc83b7355d2b5bb1f296e10c573cada9bba3015501307bc2663ddf37656c1785d83a783d5fd7472005357cd7215ec5e57b0cced9b073c0c8d86208fa658a59e44e1df4566e9c27f627ea13ed4aa4b3e03bb51a225024fc287b31703d29a1f4766956b2e95122021a9ddd2fb69ab57e8443c66c98a9eb38ca98d3a1667757f125700a3a5cd112e074b237579ad93a2eb7da684da3826e7b96766f23df185457d8aa641519b614c9ecad201401cedacc6349c244aba558cd745f2e7c0ed4412e776089ca86c8cfc66ad5bfed53423e5f6fd9fed918d84f364c9938365d72c67fe9dba4e10dceecded6743d6af8fd0eefc3cf419452e4fbbf066db4d833bc8a511860dbe31592121a18d0c11359c7f1854776b6fec191066f8a23caebf77836aceb3a565705daea8018317471dc688f27e315829ecea6154fc003a4f6 -MD = 6f07c911878a86e57375528b8cd2adda91e11217b8c944b20fb1a4fdd6ae52bfeca5d4f929872196a6f17aa1af942034 - -Len = 36664 -Msg = d2948aa5537ae4bbe587afc2d6e7386571c4d62f6a166ffc7cb83dad50c1d220a1115a609e2a21188f42554ebc960c4d8a0088e3e8ccbacde9c80670b29a46ca975611a781503d18932fa2210d4321b27019e6d8e34ce935d59dbbaee4467f63fd8c36e4c59441a2387720a39098807a69367577223d041b8662e4ceac6e85d41bda527e329d349dc842573c0f3d308fbe7fbf266f481166453d0a3ad3ba61063969ecdd90141ef389b7ce5550da39d7b71d4b4e90151a005a56b45921d11ae09f618c69a7a0078bc4ff0d541d16a43c9b38a1584e4b26d00dd66a935d5cb84995e9bb8a3feaf84dc0419ca33c9978a5b4f74aaa71923ebea6e5b4505102442b6229ffa81f99f821c7a604a8750cbdf94883cdaec19469b26caa1bf8c36cc56d4f4ae32b105610ef1f56cccd92177c22a004b2cb06f6af94a84e26f37c4243f7a474ec7bdac9479f11787c795961bc0704a182680763184ca3f85eaa442bc7b1a9cea4004599a519e5359c1394938590bb82c4ef8d81adc3a2d14983e2cf5783a5819222196f3245e3b4b5050954dfa50fd000c760f875dff00171e720d7fe55e2b43e4a1df2f70c531e4eb6814dd32e46b3be5848717889d4af5e3fc4ebc10fa69031de1acbfb547c9af08ec3266813a952870a0d94bfaa950496f197b2aa993a3df248d8a14607a75122f59986a73c80d6e245760851287c27a36761d5c0dbe6e209ee1f1de10b1c6a6c53c9159692136658714c7637edd1400d07eafb0bbdf1a8ff3ab7e7d34a230e56101c7c40fba92b70f6578577dfdc795a3bf9cd9428a5b65b9267a624aa046569945a63aa608c4db23c5fde1be8e4f8146a58f362024835a560f802dd1506962c484b71deaa02f3a6ac2c282aef33e5c2fbcd147d35234c660b33a5057272ca2892b64fe3bf5445d5ac850caddb0f69ed5821d8eea77e2424fbdd34a4a99028e3db65a5c189ca6cc6a53432ab96c1ac1ce81ce9bc42a1e46a98c15ac3a1a8d9e78c1e1a80efab900100ff412c0790d5d71385ecefecd3b5bd4aa6bd68440204bc0baa5629d841d80f23afe23916c60ca741268c908f5dbfa77953059e79e6d2e8c2d102c42ed26d77780cbcd8abaa7b12dac56fa6128729af8d91db6a289b6bf5175ac657d8a777c165dd7814ae8347a2462b3d395d991c5eee28e7d6396af66b740f49ecbe081d7654ecbdf2079a9bdfee209f5258dbbf3a04e0d0e9959b9bd040b6348ac83c871dacff347c9f379d50386b3cf7eb953bcd38813eab227684aee3182e3ade8dde3ed5df84b95ca1757d8dd6be33fe0eb79ff0d2db25c942d68cc5fde003e8414a61375456b127224cee5627ca0b798f5c36959c4c5e7349bcf34e2df1edcea1f20f3a25526de9004a2cf9270b894460511c90a73c5e06d15c6ae66f0a0078f5ffcf461c1ff4888496bee09e26b447c9bfd947bb512e6c23de79f58cd345ce85982ac3ff664eeef6592c7154c6946b12cef324a033d58b876ba8e34df3c3b998e6a71997ce84019ebaff161091329682a5f48e1d8b5b4d442b80187713821f7811ceb0ac009dabc3e2be369c2f95b1626d64edfc01c998a44588fcd5da8bea6b4027f006a3a1d2aff8f138be49c5a5fa4dc9a8033c2656ede148f72ef1e500ba9b3b426c609960a82520863f87cb58926ead29fbe57a6e6829497249ff984bad4b910ca7df8c3cf791d487e690aeb472f897d7aba3cec85d4312d3efadadb18b78b1b780c7824ee46394a37d0d76a0e212101add1f294c14572c84e8a32b1c9e4924acbcc1837eb6c4e942caa52c0329e49f5a570193e2d48e1debfc881a732ce77152267498b4b7db5acc9701d7c79097ccffe2f01472e70f6f72f305839e7e7a20108589c8d82dd16fa9aac87fd35f531f714694b5e49303a98094c16d84dc29ba50a0a71cd261cdb042cba32c0fde3f21194b967d202192547ca865e00f8d1cc67940779a8a9bf8a6fdc43ae7635484595db99e750ed9e3f7d0f798e426db7cccf32da04ce92379d8435c34b7b70b494fa65753a397021f1ae3490382b10c7154252fcb3ad54079ce7d5a3aa5f349b78c5dee5e11a1e56d461d664dc1996922e7790ea06b373b20111187f3b8ff57f697e84666c715cbf601e6161faac43ab80c5691c6e7f85c952869ab08f8c37d2df8b12714cbdcfae2d6a62021431bc75a4c2482e6b6feeb019beb8e206d280285381e591027dcbb584ac54dfa968657312e4ca7a7e133308bf301f7e420143025de99a301e3ff5580e7ab6553abee34653a34c8b26e7e735cb712affb18704d357289cf90052c128334c130d38839a41df845afae68c6fb9b6f857f0f5d25a2df7d56a364974b3889b96d75233751f081f1e72344d4f51171a4c42dc5f81a77498667e826a04310b9ff18feeac01c60baac83eb1cbcf2fd06dc3681c7f036149b1526657d29fee23c8d2b91d129843bf0b17fd0dd27a50781a24345bd4d63c0feb2fae4123963f63aeb0cf7807c70cb4a89459a301ef6770b7b533f4e1888c49ae64b2b8cd85a93daa225f89ec1c756f1bb3b11bca8cd94cbf1ce3823588c6896388204940ecb024439dd5bd3fe73250dcfcbfc2acd12a7ea8b1df9e41559f41a310535d2e49e8ca1389beac93d5b80c54e5c252195adf88fd2a6473857d6b050573d86ed61bb771928c96b258567ae41bf55524a0986cfe34cd2edc727ebe45e3592c18e8e0b0bd390cea792df7ff9aaaa204c4d3086740e8309b13a8c80d76c506dac5c717492f8f81266b6518ba7289724dbd113932e37ffb45d398f7dd2a33234110015df52afe8fd6f39e67301e20fc9c67eb89647864639b76b37ca1d2a6251b6217f359421e9f78cc4a31f4f019977d7fd29780524e20288798c50002a682a6368b95ca075826883ff9278d9acbe96d4f66e1fb1395b75970a96f5c3cbcd29e27cca3ebed43cb81d91ba64e60c058e86108d7592ec37fcaec75ea2ad3418b4fa07bac236669e4f222323ccc049f6c8b5f49061f26600fe9358eb40078ed13572ae91cf4f5230955a5cd699ad8a19aa294a7eca17cf3de30f6445b519008013131b584f53c17af38de5dab1f6f7f79da9b9609a4a4e7712ea9375eb2bb3aeb6a5f6172988da05cf826537fee3b9170affe93db8d30b35f5ec8f82c885cfe286f0e6d44537c658920285f667bbf80157f1831d0cfa2ffff3ddfd74366f7ba5ebbb94998ba7acfba5d5ed1ed3c8db3eee482f097e07e25d748488541c30df7e4dd0a86de322b5776ec344b72c508b5535cb9407f6414bd8e0aad629611124f514f5c95935ee0953579432ca599c30ce96445b225cf293f7a0178ffbef5a7292a8f39f636954cf17c70f615d42f4f13277792b5f9860e1431a935cd2ad53f0de7191d396679c304c26fd767bcf9ff6084234adc892d35e43b7e6e5b78343c760d8990df7170e5379db261c29e8e768d85e3b89643395327fdfd7d1b159741ea043d1f49061f261265052f97175126f2b3356663b61ed847ffb30c8c9172c1e271b0331682e8f81dbec49b55a5e693287294fec5605227ccc71b77406a6b4ef7cc9f56c87642edc2117d2f9ec8b34da77a8edc4bc087d44edab357a70ec54b828b3704cf6ed17997f39b76d30e4bb8e8018f796755046016a0f71850fd253a2b1433b79bcaf92e17ebabeb82d5245772ce136098ac7c5decc07353bec40fbd4a1e0209ce194e7dca403b082ecbb1cbc026b72c60254410199fa47440e1f92767ff1e55d6e835db17c7a5475730986878a1f7275e5de04925c5070497d5561b2d4e053636a633d898b887437cc22ccfd4d6300bd3c4f54ba9a7078f242ccb0ae27143257dd1ecf8b5b95d670fff03648d2a0e2460e8e7aa0ddc427e6646ac79200f54ae0cf9b5be0730a43c912590b90a13fe1b96383be6eacb345ceeb19ed87e7eb62a749c229af5b4d83e90f4795fc43a6c5be4316674990a59951e0c06bb5655e4453527b81219cc85e7afda11ab53f3f56fcb72fbf5b1002ec184a47894301b6b68df3aeaa5ebde29c21e54fe3e31d715c1cc6b60cccb43306ca31958f59445b81fd3343ed8d46020488ce3838ac66a39ec5799397c4049eaf109d94c521b5b66d4a1a2292d6bf926057c046603ba13fe5a0d7aea86a89acaf92972b73c0dc2d411db034e162b1f97636c460a5b656acf955e8ef86e6cac5cdf72642e0614129c71dfe5f2159a49f0ecbe06e4d460e52a28bb43f7b614f52d2e853c2552a6d13c5f30b8c9ce31eecf2c11e59a1124f99a8ea4484cd03a1b9870c25911a43e7510446dfa49826a948e9be8607e943a4e9d21c9fa8c5f34764b10ca49877d5374d4cbf838d5e4dcc1bba6a1f616d0092aae9c6cd91ab5ac9b91b8fd8bfb408e66d6406fe31367e10cd2e6ff14f7472a344b693d729c75fb0228c3ecaef18037b1b16c2587667e1fbc60d7204ba48c05e1ffe28c456602b8306cbc1810eecef7ebe289b9a463ba0176e1f1e61882f134ba38c309c02c0e5cacda1bf050578f377bd633bcb88f8e0ec2e2b180fa37293f339275167142db60eded6e05fbd0438ef828f47f324e7cc006cfb0b16f15967dd4796332e74f0c6d5a332cd961dd8e66e74746a1a015089de91559d7f5c2bb89137a27ff90a513caa837d2eb20c3c247afbd94a49097b420b06027651cb32ad986f13ddcebe974012e67eaabc74771a9d7f888f8823af1d1032ca3f9425b46f7959b1f4b7780cfc9734feeabb3cd2f15e6847e2dd373642767c74a05054fa25bc5b436dbb20f695c0d6c596b74c95d1451fdfeb522e56dac54eca408e3f4cf8eadf93efe29e9e3615329b55b88c08e1db0a1851eeee580d830f92c856cef1108a4c672335da4c051fb148cfc7e4724aa792b9bcb96084023a2695dfaee93394240a88b1bbbc482a65bb93adeb3c1d33321f8cd6bc6c21e271fd9b2ea07858ad4181be407d2dd9ce70b945972d7c4fc5021a5744fefb79d4b1fb6c5d3363a9826819d07881134819c6112634938c5128a1e9e3b187f3d2018188cf136f926e3c213a8803d158de32f12dfe2d28546b8397f6f8c3603e7591690c8df85deeef02f44cac8675e2e04279739529f1bce4fe6aa85d2290c2aaabf1ef6eb5045d73fd6ab705ac739b9970e44db3d1f8ad06c3a466dc771f69b877a29a3af26dc844540ae35b1ad56950e5bc221fcd440d17f7cc9a3b6a1619e91e0373b9569e18a8305c38767ba3364cc8885aa2c4ddc660c56bab43a27cbc83c89de3b38aa133e8b9e91f1d75e3e9d642d15d045fccbe29530801bcc85939cf9cf653ef367e034c1638fe1ab09f6a367b1e920d4518dfbac92b046e83b67815c3982936013b6f1b70d23e33d5dea1b49af763841ec90f5a505d1c217c9a619d650bcf5093e25e9fee3d48318ca97698c8e4373394e838521024b19c5b0ddcaea8d5ab05957aba1eb90383db7c07d1292c6e77e04d7b41eb300b2ba8c717d191b780271daf0c6ae1f8ab56fb4e009ab0ef1c8954f18d126ad897f20d68c1288fb894a95f889f5630d4be2b57aa9cb9753877d6572923931a32526e93e712c9eed4979b94c93b665375c369b936e416c03006c6b19d47ac4263c30701ec139cf63213648419e88291024277e79ddf99d9fe51c229f4004529967226211eca8af1fb8f6cf721af9233a4c4bfa985952b07cce03088d6574618f1e831b92641792556941bb589977e8182d0a8c9970fb294bf3c7996ed5297579cac9292ab8052db6ca9d985f8a92ec3c5ee9a0d7a5417c601ec061bdefc202ec046af74568dfe5b64560e3116ec8a4194a6fd3fd66c43e6ba783edf545acae5853ff227cf7264ed6723227f8c687b4318813a2555601d3b116988a9f5767bc3121ec272bd376bd99d997d380225e7107806b7889d378c0f2f454e4369571c11906b861ec9e2fd662d3f87241f2cb8f1ddbedd2f56f97aa83c97f7735905961826afa8f39a7d01de409da90a8c84d42e6f2f14e429afce4f5fe4eb026d89cf1dfd708fb9d90f5e87fd3c49b3f135250f55e3c56dbd60704cc0b691b84ceab16b3c39a3382da1feaa8da3d1e8f44891dbb8625693bc1447e78894535c9f3023490c8f4c383f3ac88e175aa76f40c402dcbf32311ecbd33d68df0798b80d630cfe95fcf280b6e2a47dc4ea35107bb15f5893ddbcd694a63916ec96c9923f8c56d3fe07fdd93ba17abdbcdae1954e1790985beb6183bf94243bd8c94cb3dcb3e8107039d50b7680329726b215c460ff7ce440e287ecf4a6e41dca288ae38ddeaafd1218e2de0e86b5532afb38675a700d846a4c95dadae36204eb3cebe9fa1784e10d2e8d1aacbce939f23cb244e3732abf00b0f5151953863a638cd88fca655e0688033c86f728b791a3fdea24a40fbbde2b970e655afe390659a0b79ba6d120b2ac1d58eb98d407a268c74ace444ca9291288489245ed61aff501f1d63561b22ea1064a1136c8 -MD = ae3d50c6b6dffc7062dcfb7788c60029a467c40b75e37f0320f001c4588e83024fe4be1cace1ebd8b1da1744a920546f - -Len = 37456 -Msg = a882a12a0f506f5fd7046f4e7ff233904923350d8f56c51d5a4646ed312b9a252f83dbc759124c5a2e288f497f2218868033e17220655f0196dab6193c58293ca105d467d96e9d3a18ce6858808e8a113608803fbb90e26d7ab5923f9dc4390e258ef4d23a6b4a45bf7f62452a3c727a93287b3a0ae134a92e5e4325fc77b3e1e4a8a3cf22123bc44bc2e5d72636b90abe1d382cb55f3efddb5d3294ff7a80fe06da49283a6a59fee42059d51c844506e06f21dc6412e8b1a93bc65351d486adb2ac4ea3297b8a3db0202608b32c00b920a49d14be031b0cbf7f662c988daf3510a71a09974db7c7da4ab4389438d16aa746139a6b39bd5746b17ce57daee2e0495215212ee9c9e688266b2c67af9f609cdded3714bcb7db655a6f47a73e07f48536a8b59356a6dfe33db4aed39a54e428ef92b36195f2dd4501a71abf4505baebd9398b719c38fd1216f5848000d73e73066ad6f9cb55a80d2e8c266cccc67aa4c5326d6ec465873d39977717e910b6a4a9dd688566c783e669863257d9317cd782f92132d417c48e2f034f405ee794e4615330ac6f32b5f83bfd0827772e07ad96f86f66d735fd2b7fa0d4a265441f5ab434f717ed7d876a2b596e85aba5644e8b9521b2d2a77b3cb1d5cee6090fa02f2ce8856de8904165c2022d197f7edce1e93afdbdcf5583ea4e0c04b34f305f8a51d7a25769532b1086600d8afaa1b58f364ecd30d527605cddac3fb2418fa494aa6a167d76ae8c9401dbd58124f7377ffc3957b2ed0558bce61d478be615b774bf07a8861a89ae18bbdc4fa50666acdac26264ec1ed7b52ff1c6e4e546a8df531818221b5accd7c53bc9419fa7d75ac71133bb867085bddf8711de686a3166593e034ae3405f50c3090c741610338a6f70132627ebf7b9f42f65fcbd599992adb832e987d32a6139ad0bb0b3476085f9676a6b779815f096722a078c1bc6ac780e0bc6ae1b15514faf30bc1e5648908e7ea153207ec8acebd7c9c87cb9a2fbe1c9f8ab0121096a2f98e262fe44d1f6563e1ea6c7a5f6331ee6a804363a14c911705f5e27ececf2fef08868fb1ae5fd782e4a2c171688cf5527308662a6035c308baaa8c984a832e73d8c97bedf6bef1dd78dacb5d867c5b823c915a70659fe65a240518ff22372100955b7ef9b4b126cbf50f04cf379607161dc78ad61fdf4d83e8921203d47faa1db4b9036576daf8e70f9be8270a8e7a569cf781dbfd789b2e6ede0256dfa11c33cd6e9391ab90daa72f2dfff56dba17fc40cdd9f28cf041b23d455458b26009db35e8ca3ec1776e94ba11b6cadfad724f9f96fdaa5cdac3a7ca649299eb21059c84b3f1ad56f3073857039717eecd2bf9000f5773db9cb3879cb8479ae86861c0305cb46dea9846fa7c603b5d09bd7761288391df97ba73ca2accedcc48aad11edf4f8d10eadba053a0a3fe1abee317106f80175dffb886f80afeffae6a6cc5d0d818d606e631a5fc5a6b69c17cd26d9f4ba1627fa22b8f99a3dae7c1fc22a2beb12549e04b3eca2d001308f1d2000d6643540da4fd67e0178bfd40a74c610a110111330da8677f9e4837562c4cf058fdfd14636e80021afa39b294bef9ac6e703e493c1f8c2048a88944cbc15c37e2decf6f2e5cc89ea2ca23b75e8972694264cf59cf76451db7d449c7e4516e2b2d7140c0a8c035721a0fd0580887453c28674aaf67a281944fba003d4a6d115ebb6de7b57d696540e333d6312d48f07972e026d68f34c04872c253113874e456ff2d2aca1688c66f80be9bcf274ef2b5c477ea5bb0ad6f9eb375a8f068f945888b27805b0eded7729538977e90f9ca85af871b9b766d0dfb944c7837467ab387b1e59ef4b0bc16ee731a6febf4d9f64d66a621324b041a03a7df57624b79bcb9360fcd33c6a11337bcdc7b83cd8ff491bc4d91aca8f3223b3086bd1df266cfb179de91749b3e4ae2d50740d2755c43e702f5e3671acaa506f0db1fa6d5c27ae4e00a9253b8e43c744e235654a6ff72a1cd37acfe0aeb10fb5b5505b9602d4ce81aec363d9a235660aaa93286bcc9ff768d7b44de03e4f48cc27cf5a22c07942f9d2bf3bed98c273c5d115be5314c48c9c64951939048de3fd8cb661d83d20f2fb9226143d17f2d6be7e4490caf06ed100a1a499b3a772c8900c8ed78122d0c6d2167f5593c8ce773ddaa6049808a6aedbb7693615d007e0cdcede24e51692a6c5875268b5535d3e890dc5838403730b77cd6c5829265311fbfb2eafccc26d7a1b0d28b46b5fa814ec3e29765789ded01a0c3668b5525e4464ba07e2fecd692a1dcf87a17f94b5dfac965843d944eee50d9c4ecc82fb30624e34ef2442e08e9e13f6fa97b79c8e89123cdc54d2d9ab3298a43cee58cad251029170de62a3e5bf45a906fedd1c3bf866583d0f0af31da0024c8935ff674bfbc8f8127624bd7573fa11353eb7bfc216f01401de49384d1595bebc083e79a346e7915c5551d746a37b560ebf0e2a2dc9f796b2285650427a971f5dd1dea8e21ca985d6e3b1986138119f19eaa90884fbc506d754fae404b8519af4f7a89e116454fc08880ba9cd180214df2552ffcd93a08df9ccfd9c9cb50b540ae261003806311d7bad28b1922d96dfe7d9cfb71279d1539ff7271f115b0d7826f9d4795de98811b6b8d159b95d1725b96fe9da5a95a07f513d3f166b919e2cd1a6c8af8af7a1004113cc494992cb11de4d680daecf543998060f28b33e07989251044ac617c311a524e1284ab3fcc8dddd14fa150f37abfaba5dfef04c91e6f16051f31a31386c6955da9fc5a8f0753e86b549973d8ffa01c1f23f2aa2813b763c77528c2e463a150d7e55c059ef3e8aaf12a23c41a55135849694692822c2aa4d3e0e27f436a332b394f346ae434b48c2f4ab0d03c1d61d6910a5b6c6bba014fb6ecff06c50ce47b1e5205c8f33c50026230f116b2bb141d92a19186493003dafce3ff17edbe4dc6e39850ce406d43b43677450622a0b293daa9998eaf308abcf27043113210c795257c95d95059f7f818883d3ce070c5efb59cc3d4023e0e8c541c6b811686fa7c50995588a784f57484de3a1990bdb677dff5b0f4f6bb17cf7e42e8f62f934ed2f159103aba70b48007f3cc2a97ba1cc2964ed16fd13a3edcfd8e3bdec1c84d4f8446468e1d9fcdc11e6383fe8a28516694f2b5b3362ddc5b3e48e4a991887e3885eb78f12574a9ae34a7d1f3cc7b0cca48abce5daa1888b0dd2d73f4f3764a2482b317e276a1c0ade73b36a8f31497641db4abcd819cbc8446865a3f8bf44999e737b3f09589ab56b298329c829799caa0b7ae9170fcf03c06fe17e7bf94e51f3fd3cda9e69ee22f0339563cff768c746e2f6737dcebbc4e9aef2d8c02dab51b0921d55d0e73dd9d75a90208ce33d7e7d276662f49db89427ef41baafa382213bfac6ba8618b26386661c68e735214ab7a471bf63c3eef9e2f8762b30a2fc4afefdde11a8467247671fe244c8343bb25c1fc091b189847d829238342b7341535f620e601db7a80de04c8abb1729b43ed461fbe0c837a3a86f852fdc885f78c4c8f3fdb1cfb37a3e5bb7bcd6bc5cb3768832c9b48f1572011199042b2facca26a076530ba58410613f261f9c9f1561e3de59d216ee6a1a10d1965f2908a25eff4fb4ba77877193fef4625b15a89ce50c3fa0bf0dcd80c25d1543e7dffc8b5dda3d75d8fb5dc12b9ee2331949c038687914cd38a2149d937146694554f1adee3cd28155a20fbdffc871600141cd3312b3c3a9e4dcab0ab5d3cdd02190d0523aaf769fda7186ad380409b3ba04b8d30a41b6fc6cc37b0f4f0b1040219c82c068ba91990f72a8d9fdda12f2ed9a6a6179ab538e775f6af389a27981f07fee3fa1e68b359bac5e8877d3f4e6410cca24867a0426aeb961008c1f6f5a3441fb190db9cc3c27279103ce7617575f61bf665a35308eb9d8497c800a599596eb9394d3bdbc755aec2793294be30deea1336d1c643e8c3fc408b08deca1f8bd849dfa1c7ac3aadd020a7eb0dbc1cf97d40d83f59098e9e88688e4d94bae4c521400910f774aa15771200c8dad1766020335ee0d40a56c5e25af608fb2e858fca4a6a2d53cb72371425387e54a4e9bd63692f68bfccddf46a9676bd5a6b7e6643a7674955174f8d37c8935e338cf34bb730ee5984c78084b1b974ed3b183bc31e15851783fe7e82427ac60ac0101f95bc490015bb90eb113822752b35ab4a30c9e347fa68d7abb0c4ca34e6b2c4bb45b300194fdcaf7a046e6febc9a29b2639d7bf24746c3943835f156474642172b66bf47e4a5089c9e8d4f06d7b2a7e6c48b7f7bf180699c294421ad9565cacc27227a4b3a7cf9637290c626ea235bb68e7fb2b5c57e08fc54e4e1907ff14cd1703768f5ddaa27b5e6f652463c15ce8b88201d890b65271b81bb3be74c125190ce4e922e17561afbc067fc4e16af86ce7c17c7df0a604f617a71369a45ef6070090ffedc2ea8589bc98dcb27c0190de5300bb9a00b94073606afda91b2b101d9e821b6e86bc96bffc90dc7b7827ceb3a6ca5f9b2562cd702ec1d30b5db7fbc33352dc23b16e1db8d8892f8e7a400a633fa8d91ff334e472df5623fec07821ae7b6da28bc77172eafcdc267a06dccc83aa16a886eea23e01fe926101f7fe2a25b34d1f252d594eecc61451bc82709d9b628e4e7e6c2d229419013a9378cc6ddf876b928e77a80a24b0dc41c4818de5f0f58a4b5510483abf9b1cf141a74565126463bd062ac02d39697e773098874e4acf952fa96f960ecb0160259b27fbc884e6afff4aab4420814c75527f2c1f2eff7d396bf9de68e76cf85557ee5f71d0ad6abac9ba9da69c92d67b740ea0a810957ad160b4e1638d1bcc76f8d9d22a45d28d1eace46659f9f493db4c7dbaa49b834507de691d08483e1a4fa8dc14a760baaa46394699f0b10d013f5c3acea7187f78571584e5b9a16a5e39b8739b5be9cc6ecbcf5faced6a62aaf213c451222fb06129a6a6d00a3126f4efc82edaba296e370a0f9e23b27e9c0d9e13a8e6a839ecabfa223d607c7fda9abc586c5764a8368f9b5a9072e2760f85bddc66f39bdf7ab562e8c71b82d61bac39e9ca95ddfeabf4fa30c52eefe933bfcbce7d0c9f78e129de9ab275afec50a5e2dca81a789544f3a132aabc5d30af28327a699605aec655e788ade3761b201441d1a359d6f488082ad0cfbf9ce4e83b9c509b2470e980d5f86317f957faf073c1494ad87ba4ebaee18b928d319e658663f1b03c63a1a7369b9a6f3bd8044840fba3fd1ad91ee6547fd391c9bd95ad7523ce1742406fbfe43b9f320f78bf9e085b9238a561db1e9550395bd9939336a446565eeab9bc215b72f20f08bc8578366b648becb861eafe0d3d4f5155ff8780562ae57a121f7228bc3334ac060e5d57a5cb75655f3be1db014feab567331695edac4994fbf238c881c3615df7b2b3f8950773b3a8c179c8c6f1cc7a59e66a41475b09afd9ecdbb76e3303b3040b2275a3d9053c27bb3953e8c35304a072093f2dc7944f3e67d171dbf2aa3fbd801f6b6c90b8837e51a6e8c1251d08dd8e69dbfb7277d78bebb0844592b35886ba115659cefc1dff5d2913faa788eb536412a42adc32fd54e10f6b5583bd91e2018ea2f5f44e604d065641ffbb3520c4bb8a24467534153bf034936656277071ff0dfdcba12deeca15b51f3ae0904d83fd36e8d8de29b38391d699028a9f78991b05b33546293df8e3abe856a838d623a1af4e5c67525cce3e4be8b481741ed9ee1c6fdd63bec27bf8c159bd828d3f263169d14ba16c759e6e2b1ee6eb53e7b6d0a8702e7a6d10b5dd8bdfe9f00bfd0e24ed1e112cc69256a9fa883418ad47a27b3080a30aa2ad290a71e7668133943e04af91676a0f37996a20c106a9eec34f365b0dd594fdfc57f80a0cadb6a2a9485937b798d984d9d9273465e90f96feffaa6e742099dd92c53ebabc49f0c780cf8b0c1d300bf5fd9879abc355ca443f463011503e89dfe4f3370a72a5d010df1622931eb761a12759d9fd85c76a6528b57fba2e69f5637754898fcc5bc52cf8bea87358b98b34cb8fb0b019d850782fbfe1ef7b4d6d06de7baea125d6506a824b95134790e91f6ecca669ebe31cfbd8e7ff17a34341486eeb0ef52baff257f02f60f967e7fbcf957313619882407ea8a03fc943062296cd0522d22a333b83b6eca4ac262943d3b415905d9c303b7f138b1c8ad6e081705d5c92eebe1a9c5c6b05d8822edf41ba6f4695a463779e5bae0b2dc2eb8cde73b473d7a163d08570710d6541de7475e21b78abec8ab2c9b2cca2dc07dd459a0f46cd597097cf973e6d65d331b17370f93d1e4b8c7e9c4e0313d4bfd048a554a1a8eba0f2e6923234b491caf84466a34e68b9ed0abb7eabdb083341a2aa469ee94f3146aeccb2f6e1eb2384fc13c88d8012de18edcde463892e20f9f56e83c934ae30a2eaa69c45d4759dc9b38c13a00ccffd47bc3267f5cbda30415f220774124a8c4e5d20c8bf6af862e1c529d28b62f48a01ec6563d2e1a0d3d036512c1000a896b16cb7c2b433c8156597797f90112526cff4e382ab8916adff11787c3d9e4cd274a -MD = b59b1626d9b8d6ff9a35bb5cd69d29702dca9471a3140e7c2106b295eea3193a850ca00d15469f6d355bb60f48a284e3 - -Len = 38248 -Msg = ef0c5e9abf77c9945949ae11a756e68dfe2b1438a38d40048e22c2fc6d6d62d7ec00bdcd34eceba9b17d5e2019240d61aab5d2edb3d211a955a79b318bd9d27068b80d6ea0bc3e684a2fd226e427d88998b76664bd66388ca1e09b3386ec8971ea9e16240cce0bfaabc9d0cc11458f2e509b9644cc30fdd7f93489a76690d103fb199f987f0a99875cb121baa76879775bc72b35e518a8afe60b2f3834acf04e2291727101583236e6518d97ae77df8d40a5ede11206803eefce538cf7272f79e76e55589aa01c2fd00fdb0b2f5a0997879ba3ed5ae2ceac9ce3be4bb7ebd6add21911f553caa09ba255d5c030f93fbeb9131704c694da2175b3381e7cdf2d116cf86eef33be06a2e58a415bbc3cc92a5d740fcc5c05ecc403a689ad4feb7cce3c7433ef4265966b2015e887d80bee02fb2654ed261b4cbdcd25789f37f70a0bcaf62a9c89a5981fdb6092ea8e4ef86f1b91ae102cbf42355b96ce9c3deb20f19fe4199f0f6753e59fd2062ce5ed2d98461de4dd75da15543662534e68af06a842a7c99fdd9410e6f2d30ef6e6d0d6a60332c0fb09520e41e5f2cf5ac02c04573ba80245f91217495fcb70f097df3ac0db380813f0117525f0ad0a6b4d486226134e8b396dcbb0376b22f5c10203a30f559785cc32fd9227e0facb2718ec673e51002e2241a523d8a04165112f2257baf9b7ffcfd800ac703c43dc3628015cc77d28b1a87b8ab753858e888a24259fea4f003ec3ea010c278cef0341856d89e8202ddd742561b5d1a27226d2ebf5c3c7e0db09516ee7fb75596609f0381a36cac1777a2e46126579805606918c780b7833ae29216e9cbf82290fb6ea48eeab95e86e507ee7840f74a6a0f1700d98bf26d0e267daf107a0758754d1d8bdd32f701d7a260a0fa1fbe99cbaaf16783c26f840e089240010e876f89c2461a0b00c83e903c67dc6507101eb0a082dd44c89170a0f57a9a29fddaf0650752ef86c88f7d371f67d1479b8e41afac45a2aaf30aab6d69b0edf9cc94538d68de6cdf1ecf4642c7fb2020419b9b1f0aa47814f63dacd9f1bfebfeff26316973432272680a1229c29c697dadca83956839ce1136acfd6d1a01f4b81a12f29fb31ba0ff38b279729bb5edce149db3993170053e38cb059d3f2198a381dd1f86b4e258c4057ae4b3cff25d702a777390f2e1cdda713a5de0fd99585fdb0720c4d511ca7f52a5dc53bbbc0922640a7c13290988a4745d8eeec1d3b42b9a03aeb0a034667fb4d5c8d90b8da15335a915a64041b5fac6b6e10d285b2cb5236501f0b2c4cd43808d42ba1be1966133e5d8b0d544d66bccc92cd29dba328b2badd30b794d5f695a2ed27d895258fac3434dd9546d8a660b26aac5ae5b55fbf7408a475028ad6fa65ce0a9c04a798e8833ed764a3612781631e35cb6c917a63abfa05af40127b5097a05c54d44787ad75a201e23293f20528d7f0e537de8084a9dadacc1417ed7d818aa36acdac66e55089e378bd130ed649bd661010457a0cb4d1ac34473e356b6bb56945b77f3c775d1a068c0a8c83da0ef71eb5bd6e6fe21507024ea1315a009c48354d5a67124be47ef188e3a45afbbfaea03a070067ee14a36484e99864265e6c90ea7e0def492ddc2cd20e039a1fa3097509b6a46b18f8ce5a3de91a5cc4f7490184ea18db597f5d40d453524b3003312488920181480baf6de2676049c2b00610836731df632429b4f47c397515274d352162c0b466936f24d92c123307d1cc454fbd00014f6267109c4f5f21b65786313bf088095ad935088b00d7227da2c22950b42c4b05823fdd33966d57fbdb049f3d02028a0c252aa060aa571f0b6b1143ef135ec56dcbdaa121170a1dccfaee079161d53e65bf7574c1f43b319973e01b92a43d76708760e7cd9bdf7d11fe6cf19ed5aa2d4bee400c14a42b611003583aa32d7266f4fcf934a1e9947eb22da8e6cc262960a7fbb0f1c283ceb65663a1278877a49de274cb1204cbd02897d0c76d831bf9de622eefaa3459cd3854dbe26aab4a7c24233501085e073b84a92ef40f2b7dc3af62cf25bfd1eecfeff2b3438c726ea2029d87c19f18667e99ce9155532c142edc912679b800097de41932ed1447aabd3f3ab4335d98b04170ef3f12c1efa8e36cd67b141e2b747f1eafa1088a91c775e4e10381cd47ad2b0ff58154e1da01896718151e79b9f57ca59d48bb77b78e74f77abbd0748d24e580c69f433c56e6c9d6413dbe4f12551d82cc6f2f6223c45f83ec254bdcd3df17cb4ce10659cc214bc0383b1c2a9e5b09bc235e8cd33c34e18d2189178c7fa468f66d8fc6c0a278b62de5576191c4d1e85b895cf9526aa5a01f002f5f0cfb3c800b13f0aafa42b4b32530d9b50def7d6468e8b39e6815de4440715e49e5ad6f0811254ddb8e129de9b101083f25842923e927a9a49ca5a876f95c5ffd9eff04a8118bee80047cfa01d8402d2861ec9bcde92e87337782cbde51a97ba4bf58c507122d1bc2e5e695a2a3d59097498f9c0b6de5957280150f235041f766d01f78ce1cf31cc9b8ba347518a879b566d5f3857f341a8a3fc43cedfe0a1e6a5abee6a437c538bc055fa02142a230aa3f276ae2260360a33cf819e664ed37d9e59cd7326c8bb9c3553da14f26a9fc9d5cebc7ca6b3aade3001a6fb489d289daf7211320c22de5082ebcfea7cea627b6468bd3e754c14a75129006ff75a25d961ab56115429305b01b4481d04182f71f846d56deec807f7ffac4a6703143fb35d5c08ab9f3a560e6a13df0738723b5fd9efb185a385f932a411c17aec49fabdeb0aa57b5dd4c40d04a0f1437a973a87b1d9be0014247d09d6e022062369db5b934db8db1086eeb969d22b5c5ae591abe88b7777b111e7c0109dd8b34902460efe8bcf7547df4aa6122df9bc49ebc51f167b6a671adcee07d9a151ecbd91ef6a855b35c4743c7c55962ac8ddd8186963a4300338b1f3d443aaa12a2d01972bd0b0129833262cd84a5e4f254b8609e31c1a2fde6706e55ef5fc03bdeea5808fe41768735bbe3f02f6e301ab8fc42ec6aaf0f1589c9a2fc2b1565fa9cc29fc800713c333a8dcd170ddbcf8a81523058892c0fb0e23dc41c3e8420b6a200f59a0dc4d9975a4e282a671548ac776131cad55f2c36bb75da9c71d379d8b94b63666b62d7195da7fc10854323e762d24d2a9771ed0fda18ef640c2bf8c6a94bf0146372be230a3f52b3af8ee9a2094c8c60188adaa307cf085c57b326e93aa9a48c3d1d141c2abf31fa2d1e21473578f7549dd07c5a0c422f6c9a948aa9340d87b6418a636c85cea2cd461a533daefd95ef716e5a9db0186b7c1cf5ad6f5e1ea27ab7e2327ae315ac1444aa08ec3c856f17db8afdd2bafac57426ff15a18185fcc1e64c0ab00c3b57b76df8c6bca7b58bb5224deb63f38f433c00d94ca965ea9d7117f17275c7e9ab9f0a291815b637f3b28fdeaeb62380f0bcf2addaedd2f38e7492f8f231dec7b1b26268835f33b3aff46a65ce351274d1dd44a045d7904bd6b09f8a124d177c70d9bfdb9102e4d0c565fb0cd1468714f0853ddc17cd66987d0f86cf5b2f3bb1f0fd67aac96691373fec89f941534b08549d2689d7391e838c788eee5440120d3a04a3feb3f3049024705e54a5c327f7050e47ce0e827eb30ad2001086e8633955d8bbffd81204827ddbc04686fee0890cbee8d443104fd1ff07245c7790f8dc495ff7d4bf2958b55114f8f76b6c4167709751c3fe4b588474fe42fbb19e979f1f839fa6f1a2c9d2a8034d8edc7511393980cac2c89b63756f9fa214bc7c092ade2afa9cf4e31f818b900933618117a66f609af92768364bfbd28cd01e9015248e3e51df5256226900a3721083f81c571b210a91a51a9baf1d7f47576144853638a6ec96926199331224d24ac942e8f445aa62b2ca195749df8e1cd00cff2007e34a13ea3d6e4e86c6fb6f0cbcc74324f3e3ea831dcd35c048e75363a828ad4097120e03dae4070b2610927ce2eff58f2fb4e92d269ffcbd6073343abc29f5885ce62408f12b8d6a394b82c2c623c5de0005a9d76df573e73018067ad069c0883bae9f210baba84a07958907edc97db96fbe70aa7b3864e7bfbf134e6d50d5e73b52c578afcb1f5399d4ed73e14be3c782c787ced7d195641651a1dc1a46fe4e65badf3265f6bc2ef6f2f72d290fc0b14308366a0926ce073bb4f94c5fb30165bfcf347ab591458326d5ef5e4d7fdb1eba6ac4a79aa1d97838d263c7c4ffa7d354770e76280583f932671d2dd501feb7eed37bac11a97d5e15912675d292b841299bb34e45ba3e39218ec8c34affef24e72ca1a2f6a58161d8db8c7d10d5fc5648246c2b94183eebfb343a4734e0770cad5e7fb0d2ffae2a8b97db07062e3bbbb8f881359e884ab6c940b9e2190c5e1849505dff2b1ecc6135ad5c3d3d063c1781013a93ea702c42929a8ebc83eb6cefc2e983b68c6aa3aedf0457453cc6c813ac25df6e0139aa385e2a01fcf9e56939201338fe7a4bfab7908614478bd4a7573f4eb7ed694c8d4035d859cb04621ca06bb5c5ff7f299a27501ada6cb39aa18a45630b39ac0f9c01208ce0502bca4ecaacb672e0226c4ca427a8f3db3b7e7d54c34c237951eca124262edcb4f685c75feb0087caec7cd6d61e19a5bdabea055fc3f147d6e14a625050a6961eedfb4f082e7a4ce463c200673c53393a8c45ff504c3abf78e391a92ea5dc56b79994ae6d7f0c095711a494fc8a3ff77965f734d2670fd286df283c662db864a681b9ab35e59e054a7e8b58400ec526a3be686c8b1b58ca285e79e39ff02307142dd01008691889e630e016d8d2ce0fdf1f006f2370fded88e7eb6881f70388292643a3901162dd52b109946fde40fb56112704436ee684cb02e692b649422f0cf3782d72e76549b789709bab380530301b45f5931efbd61c37d228e3eec644e61cd97559f307153d3e7bf234ea03f794c6c208ba87252da10f18f3b3ef790fde2acc45eb3c31880b5a9463b3fc2497aa99060661b14acf82111ebbcb5341d81da4bb63d0cacceb4a6522b4d0744e5a9b1c79b62fa55305e8c64d47d62208e6cb120d98b1a5be8621e58dae325c6b868fd783e2cd6a2917fbb40d617a64b5820ffc2aac36d6f1a1b9643c1982bb6264ad538d50e208b24de265c7cf5f2230f411eb7a6706644b843a6999bd679a1b3c1e17fdc91788d8efc661e15a2e646184fa676591ca57b677cb7d0b618a007e560aab3d1514f18244ce2ec5ca8f30307af2f653f129b719c19427facf92f573f99898b3fc804b98952356d9e72990851d2022ac50cc8d5babbeefcecd2882e26ef065c946039f012aec618779a58b48b6ad72d8765ae0667d715df024f4adb3fe3b9ae6ba46f4a74b52d53647aa29618dc06e3f2b7cb9217fd4fac69c9d80ceeea1c07122f15271407d3c4d1ae173b8ea829f4937da1f74f8104db9fccc031b89495ed444acc14750941d36baf27035151b8c5f611b1a47324cde320e283d83165cfc76e81d4a11c5bf0158ef8429c155b2bee772e8b28273b13697985a36ecdc0122bfd8eff4b7e5286f1b813fa442f46fbb4b33e8f00e0467dc516309f64024615917dbc8c822f9f4efe737cdeba2387b0df169c4dbd12d9558c937de866536a328e6b851cc38484e0924dad306c76afe3b43df237cb435643366db81ed455af1189438310ae21c5c463a32fcfb9bd11fcea75caed99f66fbf48f199933c6d870b08923108a09bb462d9207edd404b7074d87a70dfc7b068323aeb7ce61d2f74a782e419853936e354792215199ec62de404a89e7ed2e5e23492a7eca7d5001a7f8e9596f6c6a7d511aa348ce503a1bcb3058cae4b2a2b604ed6b363292273caeb923353de07430c1302e430c03d62af6a41932ad55bd564d97d9a7b1a541f18842459babb49bcfae1199dbb4b9a7d78824f588eade698527cfdc98edc085675c1bb55460f2c5a13f434dd86e7b976aa938549642538d8cba1edcd38eeadbe853cddd2805a2dcef9d50b302e1508d2a80699e225ebe11b32d0b411e3d2c2bba95df24de42cac701efc03220b6407261363e3bf5e626dc42a81f7342a28d5d2649d9f140be746e1f5e1931fc95532c55f24093d78194d88155e0da0764155a749844ae1422a7b99112e51a5c2492a44eddf50e90d70fecb85ad8de342bcc08eca9a6c223156c909e32ab54090e04c2961fe715e7919f002edf8fe893a1bb50d6a58a953540cadb90e6f447cbf9b16f74df9e0ea5574cfd2c0d8c5eea6ce91a79b3758f124bc982ad58475b698ea2912f45a16392d01fc9fa0b57aa02345e4f1efcf11881dd716d3ead2cf8ad74de11107b787a76a51f4de0027832a3a223d50da785984b9ecb858a102b865d536dd85fa6abbd197e5571261a7760945d3f968eddba773838deb0dba7cd6d42d558cd64f1c2924301c71e137add9b9f0eba79e9c6161d1050b2d7779a991524a0a6d766824663bbd97f3af04b324a8a5d9d65658923f29b9150e3a71218e7cb5c5fe0af81bf974aac85ae05b4fcd71ef1ef444b4f695fa1a0bfbab337d049feb28ccf8517b396b823df639adec5a92373b8fde33f6fcae9280746e3304ba48749348c316cacc8cde59740f7f11428618a00787582bd9c3ccf316d7f2611612ccb5ffefaa73195509bb52c641472bca0dfd09d493fdb3e623d4419ce40a8e6b6dd150f2af0cb650bec3f11286f66cda71a2f54a79f5216231b48 -MD = 757a852bcd6479d42065467ece8db9489f081568b54fa7d505ace1365ce78bab67351c10aa65fe0b8ce42291ec9d2132 - -Len = 39040 -Msg = 0d15d24f2d46d3d4473b68f9695da593e74120f1a1d753b484e541e154b45d35a80aa7b93657189650334029af082e5a700c902a5c731b8c6ce22d768c26b137a026440bc51695edd9ee12ac3d1bc141d9746b60616f004dd79537f15233752dfd53f06e62ea1482e95326aa9bfc27f02c60fbba3935caa0cee6a77b2b436fbec878f40a963b5bfc884ac34a5215280e71b786616b2b412c58bdc43ba1be6893087c9806e8723404bebb32b4e9cd8b43ae63557d7fbb2c9a7d02d75a3b0d2954c549248ae1f56542948ebc11e88b1a39ed4bb035fe4c5591459d28ff829677a807c6e0c0072db65d11aba789d8b99b953557deb16f4582bab976ff53fcc21d37d7db14cee582f1fe3efb3b4340bed7028f6f291a5a107cbde076a47e33f9e1aa3c7007dc005ddccc2164c268a8029626017bd79847140b41c3835ea7afa48da93f6d0213e2244170c5cf821f98ed9fa996633152bfb9f6ee688677f6f629e7dbe7ba4d9a1241e6912f25c49199e7bc34530f7f714967076dd968359492f2b8e93c40309a181a93d8694cd0e53258b36f4268091c6e8604661e0fe1a90b65c77a46e5f33b7d1912ec7a2eee44eca84d016a54167cb57eb6803d65c25ce7ecde370e92dda4c8a42a776ab266d64e3f5293d3bcf0b9a6b8e564405122d6b0eec3c89b3037fe8125a21e41bf7fc2e0858acc8689ddfac99a59ba2eba473fedd33fd4f5a549703003438b083f83312ae3bd558aa12667a78dd929108a7abe27021a0325db5b235ea6d566c719b84ab5bfb2d5e7ee1329c7fa2f59eda8037be5e51cff32b8b53f9276205684356736088232f5a657eb68b14721f3cdfc2a9fafe30d6d24269feb55dbeb04497bd71cab95055dcec3f84beede789fb96e37520d64b4f8040c604f2e3d00181dd35225275ef3b4671c80fb0525fb04b7e671bb88d0da46d9514194a504253909251e790347c4a27a49cca07e8674cbd24c2203a79047ffabdf8ae24298230f1359843fc7b73fd10d322461e267a99b0f889051f30ac3cc829d83608e61c1434657cca0fc162de62bbfcf66b832641d788203cef3a716556773733710c8c97da7073ec329cb568cd9d817d8884e6bf91423c5a22fcf07416149a48e50330164405122d1d6408269216542dfdb2386d6eb511df42feb603879075c8ed70b33a1181ebff18bdc79250a4e99a237197f5c06f552ec7c61e7e4b696e45f2cb925dc37545e4cd10702699c7b644a27981d346cf8adb49d9b65ea20dc8428d8a3a0bca6dd47092f29e7dde0d4ebfe30082706254076711affa1f5bfc2831261336be96c9fc2512eaaee28dd4275e7dcd166793ab7f54e7cf765ab9c302b4451d0500c9184174c54f3e0f29cab4c2cb25ba236b244717149ea77b4be0fc2e62fe115cd1e738d212c6a84e523f9b6f73a0fa2e595ce34020c40a0b92d45912284d083d31a536df93b78a4a77c12fc6dfd53302dec3f842a4a60a862f2bce01ed70462c78d0efffb0b8506e0afe066b8829012b6be7eaa108db45756145af702b0e57a507f8b8b5023fa7339c2493b00512f11291373eede5ca3753e9b091df797db9217f9b2591f0b3db359bf37c56cf396f52ef30697b94095c9c190b09b25154e74c3026bb1914cb88eeaad914a25ef2f866c671fefcbc0f21c88fa37b9b3b1a6e6fda39edace6dd2cc91953f1353cd618c8c76a63c3c6423363ae185bfc9f44bb16de3331dfdf6f234f87e28681c1693ce352983c734b48edf804d84f59165a69dbaca12c2466f8290c7703690ab512f1510879ed8da399cdf02471ba3308c1d718d602411d261e9a6a67450d526069c29c598dfb6567ab5fd67d63210d1f119f78dae4f51c9548f3e3b905e7db6be42d2fb642fabd1ff42025803b2859a1d03f563bb7ccc53cedc2231ce49d182ff89d85af474fd7351a9b77cd5814ab3974134b68f94c8965938192e36f719b354d9028c4f98f563f754e17c5488a745e73d7c2f337d8ebd7c0beadacf519d70429a19367d81dbca79a94bff88afe478965d9476ae2166eec0bd5edfa13fa4e25334e6038719f7cf6012bcae7adf48732b0b463208669751abb63de2b4aa78300e0f2e987446909b33f6fb3131fe1c5f2eae580b4a366b10c75e4f8e11785f83fb93bca04cf2f0557abdd12fb5f5a86327ad93ab7b7828509c1e5b88bf93a203a32957c117045d26bece06500fad34a89f72bfb7a314173cb05c2b7bc6e189d78d37c6a3de6420368593623d460d08561e64a4dacaf180f98e81850d2f4c5b284127d2efa9fa81ac5a73ad9e62fc6c942aeb09baf9f9abb2bbf632e601bb621d485f434d7eaec7b0c2d6ae1a6c64a78a4d6fb8ff3813df8dc022faaf4415e4df2949e16467683c6c47242e5a6b2c02610e5877528d2766b2266ca41000442a956c4b73dd6b10260570c6f506673cc541f50f0f5b021e864a753efab03e2f7c689acfc35f928ecea6c522cbc5687c38518bfa48c19ede887d33ffc23806be21803a3c9793e5ca7c75cfa1783f77d4a2ba5782e92c6950b472ea16c54f5ed96304d4fab8216bac789a15abc31d9b2c4da3e20fbc466c5c515221edcb9e5068881df171eeb02d1d093e20a97507dd6c7f35b20a87b4aeeba94461eb9ccde353d9f2180900e831037889760156a4437c819851d9132137e302713178ff831f829eacd12ab87381480ea2a11d2e9dd8449bf347e62833102ea50119fcbd680dde1f72a43cdcf625d210b22963c599a1ac146e1a988d9240b2da1ba1df9e25b44da36d1aa7351c238bc9e0943de341a89d363354560ce7cf59e8e7528a6a621db874c4bad38b8a855980556c124f3df4fd47677c8a6bdac609198eb363e9c64e08d8a00c28a6eb53267c38384ad2348db690351b9b73122cacb3384dd3e3fa51231829990f4de593d906b2814d34cf7cae59c3b8f1ec380929ff0ca6431fa62ef37c86e8ee4a204f5a66ebce823db5c8cfea39dbf49ef36668453348196671eb5f4be0822e63458e91e40aa753b48e79ff8ac00d0c51ec4a51cdd5bbbf8003924ecf5eed3861fc5966c8389427630498288280d4a1cccbbdccde18859b35052aaa4e29b3730becb7c1599c1e6710bd2b311ba0bb1bd837c7c1c12730174d1fbc5a11685b462bbeb08ae05fcc7984613d029a4847e23dd87118bf2844998ff84f4660446e1b871a4ca9a5a827c68799d3834aa2025ec357c2b91e44478bc439eb5683e57359e9a69406f0a0b6b6e10df79c72d373f7315cc38c26a2c354b4899872c172f267170d8f89096e01b25964b03559062216518e7a7a216b3f5c27915f82631474afd9f5451b373c9020b846073648619821e996f16955c6440be5f9476eb1f28098f907bfa2c42fec69c65d0287870c5c82c21b30420bdc59c9b568591ef3359e8a3dea0407f6719cf64b4eac105e30f69fa4c63dee8bd406fe61869c7a710456ed6f461c33162a282e0fc40aba15f5efe2573f22541dd7d312affc186b7388312a55c5100d6b811978d965266bf382ceb2a22de75b090d496d6872d5d740e8b6a7b80de77c3f9ff53e73d9070c41001b764e3992ed969def77548fdca8214d6ecd5fc6a96ad8ac47e7a3c9b58648965f98230a2df10eb04d993afc34c45edfdf0414995fbe7fcf94db32dd39bf4d6d207fe949bf4eb76dec39e361e5153fc593b59d2d10607c306681e8bc9aa19bace993689d51eedafd53c11864f8810b281246c32cc43717f844438c0fe013797c3f3c68afeab8be870a979fb074f20c2fe2214e3b832d984fb788e87d13fc2e05ace2b0269294ad349a2540eb614f88038dac06045629465c46b9c2af3c46036eb7ed09ab516aed2c8ad1c5bec780c8cb9b51b32f44146b48793ce34c63d840e0e9c53be63022c7966205f4d0af6c14b092771c6456d44d3ad87a13fd8e9a2d82c8d20e7e36a5839aab2897ca20fdb4dafc850a4a9352345becdb196ac774117dde7d4a1c6cd96962eca27453231aef7060e5458903766ad33cc8bf3a154e36f8b32cb667d8a7c113adda5414bfab0e9b47fe95caae2936c950a7cb168110e21ccd481b0884f7d2d8773afeb4fc9959823838c2b59d51df65b1e106a511a25e11b63a41a678b2e5d7d0293cdce2ca184ebbfb93f1d7d7aed1e6df3890cfecf2fef669f0eabbbe4238430fd4347a27932658afd12764a4eb327708297ec3d7e50b133cf07b5405312455558f63cb98123398bc44fe4d9fdeb3edc3a018f4498162971d08034e6efac390613512dd06dc9c028bb41f99afce79cf7a67066a2b0c280a730227aee0e43c7b9c8ee8b9573a8a1f82e93150be05afa59444ef2d66cf88f2a5a4917e4538b89e6e618e66757425750aaadd7bb3c97bf879007b46e012a8d91db7e9c6843f5e824078abec46d2948e8cc1cb207563054e906353bc831db0464202d68c853e57ae7899e854b49b00f26ef4a24aee1b763243341f973637c9c27c4f01da3080caaa808deda5a61990271a0c0afe0538f629f93d86dfe0a91bd4336412b76d4ce0ffbe1c61e703926db7f6d1ad46a204acbd1b44319d6bbccd04cf0ab02c24e9c0349c0ded23b54fbe2a6c0a3029adc5c1750f12c8d9beb507dab809833f3da094d1802a3860a398ac06e2813eb00fc45dd93e6ff299c1dff3df572934faa0b9815fd439eba6b5b55fd5c2fc7de1ae49a672102257e75c81b69a12326b65357cb165ff03adfdd3edfe1e734495c6739bc7c7eef5a0ca77e27b9352ebcf87e5304c6b6950276ee589b26a5d212f674604e6613eae754bfa4b6853801d0968961f79f97ae80000d3d1a240e85af3ca10ca2cc669167d70cd04a5610290c110318f61989a92e1bc850df7287cb988f9b736c080d8f56143d9555b45420c9e889fc92ccf311872a8e485d8aa810497fc2590ca17f213c9cc0486b288a65948d7c6150127a7405acfd6816e4f5f04c7d9402074111e375b1237ded1b1983e680590ba082764d342364448e09e7e81c19af22de4f8c62bc21d5ba6e1487f85a61be4026b57d098d1e71723572047432c472201425351b5a4f5562709d6c3f4a920a9334f3f5459b0e9355afb5b2011b1e6b8e2b7ab279eaaa312a672e2cb541a1cc996de6856dc86448835f3d972b4f8819b196b87b0ad7b2e756e43f4016ca0172b73405940eafc00f7fb6822a6f5a81fb5ee856f53acc09e69c6a594cc06e41ab7129d9a784bba2669f681bc229a69c9eda82deb7b6120fbd5f5c04b94e88d2c55ba1cb468c767bec86c6731506be5862b918d848d96444ea044bba0c2db4456edb5e52e7626abcefba641099732c15e57efcac1f211d39fb4fbbf1cbca7b19f674921900c2f3060eaec38ca5eb5a8595a0b0f2b129b76f4f862f345eb147b0fabbff86391ab9b7b7d8674fe0fbd40801a2d824855fbd55754c080a6b7ea4baea25f912d6d6397289cbb1c2c111231da809d4ba324fb97cfb05f8dc489f0c88532701579071cca6e2fd459ddcc7c246f74a293c1e5616464f4854329c7ef9b9b443cabccc9a1dc551e195298a8c3c148df85822c02f6e61f097bca5cdbb06bf8c1097cb01ab976e551d230e50daeaf6ca78f3f6be182c207d58949e52bf8e1a58f20b0ac622b4027b0471a4c630797e3b605f306eccda32541f6e84d2192a5a998c96e490ac0e12224c03956129420b6f232c585899e2f7f350cd11a23455e0cc24bde0d784002de9384b48a821ef3ec455dde7122be0e209a1129d79bd8b4d7f7f0298215734a64e7dcb4711b6cb78d96cd65521ef6e90d564e1b09f01451111efe7730492062bb06106191464815a2cccb83aee50c684f530bcc3a8ac1dac21fbeef9e7d11f1ebda68e2756978b532d19f600fdfc832ef779067f1d1a7faf2e278ba54170ca0fd492b60a2eec53e458c9123fc74f4f0f5ac2412b72d8d57aa4e74ffda81da17f83da302a23bf759e3e5e9f5fe0c564967d910f513063c99f14df9e7b92143fde49d16f1fbbad6ad15c4eefd9c0fb8e64fe69d3a8dc47d69d0c7509a78610efaca51cd5438d129e3e211e9645ee5e06eb4ba1006adcf166f4ea2c23f9fa805b8b1401054deeabaa253b42251ccf6968a9f3fb484fc8fcf5273c795ffb65deedca1542719776c4f936f96e1ed6faaa4e2175cd0d9016d72ba471e110146ea9211a27459ca8bbfb15d3e9d6e5fce6ad11d24f9ab3044cfc551d38f806ed6b6b9fdbd88ef90a04ba8a9c8b210d0719ce4e4ceff8eaf4e1e92bc1e03286def292a48f97931924077fc1f16be1168e1aaa6de1e54c17ea6c39fa63060532718abaf9b5f2d67f9f2ad74662fa7b74ea5fadfb41be18cc6d424b4b5129047c3d9a40e9ef58dd9ec3f55d9271b574bab45f6560dce8e37af61ab9b91cb794c6aba7c10f8c581cf94add5f309e3b414a64a04d5923d440960d4bf1be36305ac44449b7d51d7f29018c6968ab58ea85c683b8e22eb72e94b02b5c7fb53e31bad78fe6a1d5331c665a1120066d2241a6919a0fb06bf756646bc8d2d048852a2992f714fb8a4dde79657187c4e09aef185df02b349b64ca43fb7e358fe2bb884b69023b315ece33b6b6160700c023217f6e5e71eb379018a811a3fb0b1e31ea84dc49efffdd449ac2be872456664bb730451daa40cb09cff530e299de4598bf6a5f26a99380319212013d76425d84eedf94c60ad1b0323edfcbb2a876135075608430deb8e235b81900b16331105f56d1bfd03a1a918a03bc548c9d6ee1e9ab0bcdf115bc7d915b6c4f7b71cf194b7dbb48d4ae87e9a1ad1f6de8ff254bc4dec0aedfe53aacf51a7040042868e2c9d1f0a23bdea622f9a97d7a403445ab827f23a955a3a00ad163c984e40d9b176ad2265e8e50f1d7f2775afc3ad32caba30aa9401af78911a -MD = 46f2afc4632e2121e7ab844474534f44c4ad9a13a0b59eb86918aea1e16bb13f8e753dffbef875bc7818244a84e4e33f - -Len = 39832 -Msg = 60615f98c276b805508690a34676899bf8d93a365864d5f2bea207d5e9e92001418d74895e530183ce29525e1314a376ec6945e6d640449dd12648b56712b900eb9b26e3ff67e86758e7028dc6414ce26e8ed1545a46754435f8dbdc4f3f85a3e8f13d4eaa99b4da77286ad765e7cd0707b0a527ef5eaf0d708288f3a958cd13bef9817469d1af03b25450e5faed6e0c3e378a089a703c200c2b19a27b44d977f819bafa43f71f0b91d37d5e8c3b77199c8c489f656462a6915a5490cfedf1f81bbbaf8b41f44d199c0db9eb24b93058a815a79357226ac785790366ac3a5dbeb14629cd69ae81565c6bcb34c94fe1efea3b6f8d78939caa72efeccb1b1364f04222f068c50e03e958537de083e5d106ea666734d19d3f78df24d868226050b654b6cc055dfc1afb182e95985a6349c631ff583169299d5855808ee5cc096739716c854c37610fb42565dc0357b19156466c0a2b4920fc735b6bd8e91ef7f2a120abe2e45d232a3b065e1aca81b7f1dfb11745cb7768a5f1794d7c1c22103816eadcac76d72cb3b943831794e15eb189fb66d1b9fdebe0f9378e4327df3d83bf5565aba9ab62f255653b9a0a7d8c187babc3759ce38ff4b31e96f5b25d6719c4ebafa726e3af2f38f3ed6dd45f2a6fde4995fa1c2f3e2b48b5cd5a64a574434e3422689487fab189750356998f21fed95d4429e2ebdfcbe0849c39e6be4e4985b726b59c9d2bc17174e41e0113570d957038c8961e5a1da214695cdfb0db7390fc2458e62f29a71877f88db6f5b6e43a09d89fe0d19769b7ec9d89f8840509978b82171944deaba506a76a5d3d25cbefb18e78660b7df74795a189d941b252c4edaabbdde5311541a9597fa1f18b09dcefc219d3d4f60e7995dc2429efcc973da9020cdc190a2c13e97692271bd2e72a4bda4bcd34eaf77576b52191973a202a47f4d1bbe85139444d666c9ac2e1ad014d3fd6fc343ffb64bf964ab83fe435b44fe7d4255aee84fb5e91d5a0efa0a3887e59820adbde606ef9e66547f2b21e034a43dbc078ca5561a26094e1a9f710e86590179c32af6ebaab0c3be5b58c223ec06faf3449cbf49ea3397307f8ce3e488b4d5c5d3f9a6f715d72943b925a8b8d37d5182ad5daa8d9e98538b7e40d73d176f61af20c88a9ba987f38f090049f1939dcdd4a25e0bb3afaadac9b769cf8abb0f51906a15f65bee29beeadb772a70a4decc83b40c373ea6017975bb56315fdc1b0213f0409eba4c62e7f1a108dea88fc6d9fa62e6d1911a32dc19faa4b11ef2f91fa453f6c8395c9a0b4dea23bb2baccc72b32f8c4f4d64956f10e5b3a36ab84fe6bc15a7275b9755a53a2766545c847633488a5b24e62dcf9f150d219ca5647613e5b5b02083751c2240d92f4ecdbf5a7824f3d1e6ddde480870e17d1161b012139ba4c038638e541f1c800ceef1b5dfcdc30c9ef9a6ee7527cf03048622039a62587345f35e3ba40807ac8dd96af07cb0bd3500f1d3d6fd7979d2768f68d7758c9691cfd5e6157259accf00729bf7b7ad8dfda653e730377a2be0418198b449fef090bc548d9445907668236ef75427308fd70d945382c9a63facd3f144226e35d0e099f3d740a458fef855131f7e31c66d4185379b370a8a4fa8cc72fd9a78cdc211f73835a3050fa100240376de6dfb90ddcbb240d5a092b654897b2784f0234ea532963b23ee10f7000eb4900d423c84fc4f98c6d6f25c0e40a97e549a5ad2d10afa925a4bd6297b8873aafd7334f5c43d7f6f9fc39652d1fd9af107131f68f3c3bdb115a343a5b8fa015b01c8ecd3d901d98b5e23f2f39bdbdc77a1b7b432115fea86ff92bd1209e516496f46a0433df9ec8074609ecab67bec76c6d0cfdac4400f686ac2a8fb18ca40fa789515c06d8636f365020054cc4e5972e8f6b8df87049af9f99badcd502a1fe2c03ca3d7d2273738b2a0be0e47d392008aa2059cd42e2b902e8622053a84f196c8a5e0f6266d6be4ef952e73b39c24842e6b4cbf362d2fef7c2abc3f425b649b144933a7b4b9536c7e87e8118a189f8236aae4a31772164c64f1c2d8022de74415cf426917ab7c53d1c1615445c9519f45f963d5129d7d5b6b63dc6bf46d08365f8063c6b9a4452fac0a20d8813ef91feecf50e1922fd38102096f7783a935f654153e2d35445c444faaad0aa6e9d4a863a512452079b741db4b02675a52fee895e62818f50c10564f2b7c67214a92ad77135e7c483b773229b12bd7c30ad1a1977bb826835c0fca2d25057aaae1a1b38b826bf363c5b1c6afc4422568314ca5cb6e74b26ac4a9145bffeeb18e3f904f037ae1471da8e573c00cfbfcb456ce69b416d46915c68ac97e348ea865c4dcc4817544e3e06590cdfce3afaa21ebd551e40d5da70ee2135de66b6bcbac11e5d8880a0d56368c2239c900d3da5b810012ddca86e8d097e146370d0c97cb9759ef8991b12a8a7d485bb6bd1ef9ab86cd1103c6c6cae5685326e271f7a96ec5977df8b4c6bd76b941884890d774ac9daad0e8aac3b9c7c407546b62a35ce03d2d0877dbc49b65e0cc53e12493f7d91617d71ebed431f24b7c635437963eea6e8913698f1150f264375332e0daefab809297f89b9ecfef6f10e81f7956dbc7ca4a335047535a86b410ea903e22c8be7da9a818c979e0399f63373f905b9012e0deccce8d01349d60f79e9bc4f21f6c6ddb6be1c10c1f4b6ce1f537251b184632b55426c8815bc0eb49f3b7fddf504fc1966805fabbd9af482b8698902bc0fc407c6e1ba27a5c8bc3867e67412117d3296930d80f0fabdfc18e8fc679f4168f9a828eff7352a3488a4b834c579db290f5d23afa567e125759b955633b0aa58a91761b54e380cc919ff7c6b9797bcd03c7500abf799d8990810a9bd16be5ea77c5a5b7be5bab24f18519ad415f61d3960e6104c9d0d48e35d810b7a3850c51d1c7bfc89e442868e2ca2fab7641d642d24b93dd9bf4b9ac91bf5a3d5c0ee47822e812e267459ef4dfefb845caf94fb7430f56d9987dc3414eb755915d6204c9d5d75d89bbd8555563663200a1ce448d62ba28ad51b47808c74081584a46f3c374e5ee231e651206f7be3b60bd394b51bbdc97bd6a314e4f85fb6bf684f627f18ac44332d1742b96175822ea5fd2ca80a8f7128e148ccca2153873f0a02827d081d30b5da7ae286f3cd487021c2348b6c49a2794131f699d0f9847db2e3559fcf49284f7f34b8f0ef2b3d64c74935c5099364563c881ab9cbf9b462a81a654b34da37e963704c601b366af3debbb7bea913c0a71c72c092dafa20d433d03aea0175626ccf54273c4197d603b03f40de1474bd542719718cc7a4cebc9c2d5ae5fcc4b3be0b08d0ed27f6897d83fe5a8d115c6445a6a5b40f59a0c8032c584fa2ee6f31c85fb5cfdc96f98c4aa0208c336a74bc63e03e12835796168f287aa18b9e1ee4721383ad70554be6504fcc5e38e563cd941f0a12508a2dbe4adbbad607d678d5a56e99f1102e929f79d72a59044bd19fc1a9343cdeba0eca1b8c41787d5c250b47b9202326e777c0ac826304ff63683bd3c8e21895aee141e982360f57f9ce8e413d3fcc1949a150d1969fe892f7cda8b0c13d2fde304d2c9e06c221fc751b677c3f1f73511cb957cf5c058b23cdabee42df6c081f06fa9221600d38d498b39ddf0ae7a0362866de901cbe771cafa8166f69972bc1f9917b5ad83edb472a3f3851e5c0db303451ebfb1ef134e3636c2621a6e8212dd1baf031b67e93bdf26641bc17d2ada70a2189f8a9c748e2b1a0293fdf8571ca561cf78e41f4e69eb9d1bf07e9449d03707fbd6f06683d7f63ec24b15d96a3ff50609b59c2c95e524727ba1aa33f34ac2f1391487efb9b243ff7215f65444036862de17a8124834164113bdd8deaf80a0f840c6b57a9e8380f6a273142b6cfd6c12cd3d9c62edcd4d8374838ee6e7385d77b36c1d999ae2399ec3f0f3a16d847c905785fd90ef1716a40ec1310f22d86519f18304ef4744ca62670e19789e3f0665fd8f201ed4a82e4d52c56399fad734399b9a1fce1c31dfdc0c28f9f39793b60e2fc7b88f3706d0c9d12e9b29d7bb6761022fd2c8922fd68613d019b4e218f7e37ebe3b447ea9cab41a5b4c3131fb5b2ad592a27131954adb1ea1fd2f064548906ad10ce1240758868ed9fb32921dabe18681232a8308b955ad0d28e45c9f34af64bec1d7bfb626dbbf393cc090a8c64f8569b9870f008e801f7001578d8d286b0cc5eebaba2c920e1be7654d862326af52caf9f92e0346e516892b1af195a08dc384d7ecabd146a83563294c1af3699b8f13591378977eeef2a71a71215f3972198a320ffd4aa1349c4add4ea7bffb9e9ad15b486713a3286458342cb5306fa27f347167270f3e3da0fd15c7b4df59230693751a822e300bcc2b2c9ff5bf9fa975121ab4c1857a2df3f84739dae80eb332c83afc424dc2139a8e583d9b6365f19ba1926b5553e17ff5db0627725088e9dfee11803fd8b5da6ff04b97eeb23f1543717ced4ae100be3703c72333af54114e739d28d375a7babd0f6b419822a77f1cf03edd2ab3546338010e8f675afcd40f073268959b045ef22a5b9d004b2bb978bc5c9d6d416909696140feb5f9efacb20775c1fecf4811bfdf813cbf82283ef7145aa09b219b1b4b8302e377f2b8f5a802dbc797790f8d669d70833e6e498a18c6cda93cca77036f14c8c055dbc5698167d8ebc82eb72c96f2ae230565fc254e120a09baa2996c44650727b82bb152aec501913966db79c16d9e7e9d1fbc8b07a4a4349d505eb05c12428c1758e95bb0a8ca6a43a7e8ef667cd6087de20745f5ed30cc6d4a537a269b0f600be9f9ef1761b7d97f686c07f68ec943106368c0695a1433a2f6f424246dd2460e654f8743ae3e61552ed16e0231fcd10d0a5d950289e30cd6fcdd48e6191f90874176aed5ece2946d71b55c1a04f514cc4d623e21eb01aa51b26b42ec1b5be21f04fbd04e8c38d510c7948c9e6626a0c6a2f32677fc14bedbbe1abc96e32bcd2e363b960e2a95b5e796db6a1fd425d784b19cd8553b809cbd868810771ee3844d4bd26aa536adc97a76066f1edd575baeefdbee4a37d9d67f922fe92d1d37d9e4bc4cc8944ed55221dbb2160be05f9f7db41cb2d76f84feaa677e90f96c8d209d0e073a6bc1a112763e4af9679b8305a9b4fbd08d511667c67cf0c29c9b47eadec79e2a8c3d957cf0245d83c26d86308b58d5b1cc7b02c44c5922d867181cab126f7e23861126e41814464facb4cdb2cb1656f1254bde76b472815ce9616fe3e07c33bfe9fad9fa6684b1a7772fcddec183ebf918420e01876fa8caa405b627b1643b5a18492322640c1c35c22d0b470717f154260c15f74d86e5ac278383d91dbe017ca19aa6fe8900e2750e4b0a7e1449237cdef88aba7f7ed46bd4595d9a7de022b2065db9d15e0990efcbf84fd671adeedd93a5e0ed85be01943b05a7ce6a812b74c700e06d4b9cc4007bb34ff2979cb010e4729ce308aad9bfec06f6f76c07684f5422cf04ea10e841ae0a8f550ecc1391620d334d60ebe94937dbcfa7eae985ac4e41ba4ab22c8a4dd37c92703f8285f96cd4288f26f79ccadef2a6426fbdf01615dc56a12c46066f7c77ddc6b27683939546012ae33480bf21f9ff7982eb24073b51089ab0e3f931198ad5db000e990a4bf131930e492180a1404f9f9cf7be0a2f4e64b9f88cdf3d2b342f3f90b142b821645e7a009bebc9ed642b37466a1aa98232ef616ba724de31f22e46ed14fd4795fddc2272b36bf566e3f6d2e7c8c63fa4ad0d3372d976aebe4377839d9035131a4c3f3edd161e9d9e3e56f5298a3d6736fb32a2b68a213930b67f97fab996b54ecdfc21983a701d03d1b00064350caa99cc1431af3fd0e839b9cad6bd077ea87401976d3ca70d1e285c8697204fb0644d8e1652b570e23629cbdde22cf079674a75959452c241fb8c2d6f3c0630a53ed2cfbda861b3f1cd917b2d2cf30b037c32987b194332bb4f9fc2ce315e8e6794c9ef8e854c7f7c08f1263d1987cd9941cce8bc7eb67ee584e3bb2849c1cf7400839bed8bde49dd62d98b825a53aec76259f4de3704fd3d25f88501d7a86a570c90236f2e8f99b275aae99151ff250a589a3b54d4b7343ecd3eaeef5daaf59d03903487dfe8e587bbf5eeee82e2d6de9eee2ac4ca55ba76c536a7455e21d7929fe43ddc3262b3c9903af9fe7f971ab0afd651829a690651b860fca85ba5a6f43c0cadb0a8959af4bcfaa945aa94972cf5d33e32d7599e7c115e1d9cd8beea1e628a12c9b4e9f1957cb55b589653a2a01b654f39d3bfe9326a7e887757d5f79daddcfb6be9e86e2869ebaebbb56ce3b68b2d132c41f48d311e52dbdc4b7375de6885c63baa19572a0f1e11c39a48c0dccf7b186e94afe0e4c76b7640362fdb7d4d15119d97e54326d6bd0314c76fc08f52dfcd953e3a8ab9d048e627ba53aee6a5fb5c2615e4b88b5b591133af4a795abfdbb124b13ce14cd34bba171a9756a71db90459b6803dd3f762ca84b48141ab50ff5191902f9b0a4b0450730953693b0ecea8acfc5039ad457a7dac997cb01dc0ab2d605d7b0e7e920347eff9206d1f13bcc79459cd3253c000c90fa0c55b0e896fa3157bb7c21662b91ed25c86b8cfa703dfa4416fce83f1863b228cc3991a15cd61256d5e4c6e17a633beb5eef2c943246f5155b0549a448b2279902ff0ace044d614b4e703e23b5b252997d1a198729ee52019276b2353703d995d43085393668067e4da8f2f4838619774c73bb9bfe3df94ee4d88ab88d5daf666a5369a8992ee937fb15481b8ce878ccf4827b98593bd24478b139f6f4c99153edf01ee4d5a7f2be7f3ea96279df57e29ccfbf45e1f1c62d778c27b7124d67a385900cb593db0a5a02ab7e8ff2749eff6de3f06b3f66bb4f08eebcc38ff4199f59ba9be27bd31755ace52d6b9eae356c8f4577d21ba29af4546160e114c3908f92f63335349602f5a47320be26950571297dba42 -MD = 9a7e7f53e213c84fee6961a65064a3c426c68ce6432266158c60f7a3f87975386301ed4c89d222eb55ef6efd7dd23ec9 - -Len = 40624 -Msg = 8cb8a7327c0f73a1f97bc61f5a07542091f034f10afbe4a7d70c8e560bf58983638c23db2c009e25606d787513adf0a20d72c5fbb99141363ea176a9ebc5c8bdd8c6ab9fca65ae3858efb9604c11924e4ceea653ba6f07c9d8dab14630a71115338fc8e620e5acc427290f48cfdb450c958d6063d53c3e47eee0c693a2426e73bb0e0018f4299fb01644059562b20ec42f767a92d4a1ee9ac8db3dfa083fe6bfb96cde9d0fd88fe46d6820afce3ef75e63d37c477d4520a9aef29fe12b4581e175d0e7dd399b844774bceafeda2807c379c9efec9ad1dc5ce84d72b2d4fd48c13763a541391a87c37369eaeb501846d9b9825ae8f1ec289bbd1541d4c90e4247474c9f2fd9fc9f3fb196a8dcf6b5bd896a2645a34b3f0e4e777291afd322785cecb45d10dfead5a4776cad3a96a873bcd6dc38856f71955d5c8becabb9def0e670c3684d148b30d80d13806ef698705843cdbcf6272bc5b0b589d93045ecb4ce19a0474c4088b8c4bbb2a9dedf2ebd46fa21585e3915a730c993e1a63df4ccfd307482772b887550c972b1f41812616f43ff95256ed642c3e2d28a756a9d3e5afc66a2359c3470657e7a1f176beb64ba658ffab38e179f52466e5f05949014ccc79f2eed5d34b0e923f37bae9e62cf0eaafb0f70617fc4c63e8ee5bf8275563dd747ae09342f3dc600044e237a1ea95558685cc5aeb7bb05125aa609fef30a947685aaf0eacd20e25dd61eddc7c8fa76b8006a183f668cf90afb294cceb23ab9ea81ab0a47b76027829076444d07cb5912ebc0d2da353d886e99f6f1bb5bed937b6438bf1295057bb65bdbc0d38423e6ae51e65c48ccd89c855b965e8d962c0c7356da77150e18c8435fd7b923e60a05d359651c51d2641c986a90fd0c0afe0b187e189a16cb9ff56fc3f19703d6889ecb2bc47cbcf0eaf0efee6c3500606b79b4057a90de74a5ea83b0b2c23cfca699dcf08be353cd7100d20eb36d303f7b3c8d1288c135b02f8fc64da0a396ff6bde4fd043b9dc12013489f2ec0f6550373debcecb96e22747cc82c345a0d888e0556cf273652066a2745bc39f82673ba6641861ca75af82f489fd392922cc3e0be77a7fa351e7725da892a9542efea7d09a5bf20dc762693fae81d8d29238caf67ac39e5be4f9dd39b874cb947bf23cbec5fba91df5c4832e2354c7ca56e5d3a9f78d7824861d503f8c4a52e6d10aa377ce41af81659d79ccd0be2f99d89b022a472135859f1d73760c5b65d3980f84039e752cc181b5f21e9d0938c57e21ff8350c7fc0797bfede621f12de238ca866b1cdf4766b0d3972e737b09d8b24171bcfcc6f530d7cc6797b152d29b190052b62fc629f759c11003385ecb5adbc100db3268498bc50b8892a5c77b86a37c90ecc174fafce64504a5d6f8a5d1606a55eadaf3209dca46f9dee698502c3f05e716b92fe1febe281c1d3392c0c7ab0418f0dbb0a1f04f4361835b0d7a145362ff3bfe4006844931ff72397344c32357f1f61fe7f50bbacb698aeb6e21c6495c81637aef9216ef2a55accee5584e302a86038de0437674a6b9fa80026ccb87bb15961483ad3c18d9c8d4dc2e24ef3a47821f0de2b4bae69cf8db011284aa774762ddb4467e7f2c08fef04a97d12ea9748b528736705e7775ce3555e691eb7fc7113f427e2e66937d9f0b00688793e67a49a5e3259eea8ef8e51166c6ba170905c9c5a774e47ab501542ae6e96da75721661f09f567e695efe2761bfa27b57cc73376c970c941fb5bc557e462acf1653087c9e2eef2dbf320706d5cc9014d40d6f75a91b90545cb559999e21a6bf9787156a9545a6851105335fd117d7067bdfabc79e799bf0e8eb578f9c85ad348f9aa7bca487ff0ce5452d92e225c9b8c5bfa2adcb4562022ad440c7d7e6a0c654ea49e31a7a7b3dc27e4050878afab4382a0ea8ade394f0b8ecafa2fec923dd8e12766e85718d802f1d06194f9bdc7159ab2a48b4f8a74519b0fed17fb1a8f2a19fb7bf6421a88c91adf94d98ed018890bf9ffe8ed91b97a3bda8b3c914929e25de786634ef7ebb70ad947df202ec6273d3da4a8a2964410d5f47ca69768338817b42f3765f52856298621af9520f87798463bd355e03d9bd326695df6bfd7a5ae2a1d7b6e5e682ee0adcb50d7eed60285db6b72eeb8cda19c36fa6a94963bc08a11f9375178d2c59518eccacce0894f6ac6dc8b54661cac98ecd6d45b35876113316a71f68c8fa5b18d2d265e3e39e6b0cd3729713251432f12a6a332e3e410b152193345e1c6569dd5366b744f0d50c0b924512c6394efc96e11df00ea7a56cc3bad8426c1a05ec0b8aea1f55c2e1400514a0d6d430f36cecac091af9070baccb5cf6d8172454781fd3dd1cbadc4bada5f52641c18e7a3a6ec5ac1261eeec5198827f43e3ddc994a6e8c02dd8af6cbb5a9e35f222b47bbb99c88754ddb1efd1b7c5c24456a8dda82d1433c133beccef9f9a60465c4550870a4f2b70c1126ec3a5817027e41829490ef0a875507cf4b0d15435dce2b391131cb3f8e4b062e1adfe6ff98d10ae04ede9087ec8b38c7ca5bc5617245a71c5e65d81803f2045f0e70ecbded270cd291d37b65729d14fbd44ad3a849b38126787594241ce951e0505733f80966907ee4d77a4a2273e494f04205c2ecfe027ee6c7c70ce31835da68fa8359f578de0ccf5253df02f6efb9a7ab255463106f4d30c538776068fa75dfc3a488b8433ea5daaccfcb1d0c7f9380eef909b4cf13badfd6b10e9abfe6d83b195d2c5ab1f8718e4eb6b6789eda4a03714a86e92535ee7a61f8799907432c076377ede4a95397729ed04a1d954905b89ddf760af91c1089d0d75f65265798c80bbb755d12983f0f05e52c13d714ec28da827f1d321149948a136807066b450878ee69cdd61093ebecbc07624e8328da91f9492cba5cc124f7773d868dc65b4e12db743cdc00b890b91e8113e0dee156280d7d3e78459fc07fca86eaa5b2012341493cb30cb3d986d6d3422c776c3e250986c35c54140cf18ad3ea3b35755f0e6dff69394e701c53a9a3f3b8fa7668ce9a2cc28d36102f3e805b128224589e97fec6a4d78a7ea9819c563cbc514487d945c723d90682312fc92aa6c75ca3e6465c669594a826a99815b3c442641ec2cf711e8d48acb2394ccd084d10c49e5ea4efa7e37890b0441e7e8334511b4c413785faa9e311e8701ef5bdaf6744912f382051368b2b64a19d3e8e33f25e152d99eb231fb11b6cfd2ca71075d3c4c3808a552b38d65f89e99cbd9c6a2c15c3ae7d0a6196bab38509fe4ccb475d2c7d7a23f7fe8f60156943a463758107289ceb6c4a7cb707c27dbc1d4db4cc0b6407458a6f92e331364ad83c98e01f8b7fe90dee133b299f2e9a3d101094ade755a9084724afdd52a875d0ecc4a7ecc102f13b89cd67948be125b55fff3292f9e5abece37d1d24ca5532523c4f9092b09afe9ec7e0c8a2d1c1654b9381582148fd5418e5e4a361a123c986b5a164b6602d565e2fb526f97bb8a42833fdcc05dc86edb4d5c00b3ce0fc8195de22ea03daa442a249b2494190ad2873c7dd57e4bd66beea3c781b5c8ec7a3a73f3bec1e25e80a929e40f92319873b55d888c167f4870fe0a1769c6ab36c77e3615230b249e0f657b5c8fd461d3023f6ed66d23587cf28be8c21550d58d24572cbd180654f734e1916b01e54a48f287d8edf52f7812850ad85e110ee83e3557c051ea2df3e8b59ff4a6124f2b78c9413435b0854e779d1d5151e93b53f86ee2898a35ec91e0f6032d844d7ca5c0faddf9542bdf5c3aaf15dc340a70991a35a9e0bc67ecbf8e6abda48c0fe849d00bd0a0bfc39811ca2f96d18af14928323df07e6f1c88cd3fa821d233c63c882470abb2ef144a1fb4b312f9bd4a2f91cecc68bb28b06b5b7322d26f022cc3c12cddd1b848aa6fd678ce0c9d41519e664e75751f6fcfeedac76f31b37d9028b55787d52972d263c684d4f634bdb400064fcd9823aab79ddbbae1e2581c9cd5b53313487ef438e060676c726898fe0f02314964507023e2debc2f46b545af45515e148e21235a4054af08e391597c15da915d4c3e3681784459bbe163bf44120a26e028c8a6931de3ba1ecc5775dabf0ffe9dc235945ca8acf1fc34dbbff7a6402c2aaaddf49fc3ce2722bf2384766512c76f68eee0220e893374d395ee368cb3ec3886c973ccfc5454b92e7dfbfb92738a6692c2c05e14699cca201ab08d3fb5d5be3f23ca970216e1568cdf42c6e1b2c5f7f249ab7d54be7c40bcf2ad7839c6771056755faa8f965b6f6cbfff64bd40f8b7e9fc080c3a08709d0c864b63f5765ec34f26b963ff53018840a898419fbe911afc427c975ed81813916e00ed0d45eb6b9bb05e5fdbcd92159b219409f37c3d95abc56f8b1d9db168ee12648ffba5ab6dcebab4faaf768bbbfea3891a731a4cbc7aed577400c9faf1650bfca92b161d4e4aae63c0d4de3cdfcda6ddff79094cf3dc32dacea2fd5331a8c32fe51637cf81b1f3c14ef67543f59ab409359fd9bcd0623e50176ea838ce2bd074b0675b20ac773373f18ecc2f91e8539139220c2ad68f585dcaee4b3a1b609c71877920cf231cd5f25508536e2938fe1c86da01057ac6296a758c66c5ade9bf9cf6d609098a1563b2f5fdab7e400f2bf1ab1268eb319919fc93d37b79fa19925d7b08748e55e3653c30c924de6acd55c72255942aaf9aa28aa25e09b58492cd49808b03cbfb2942f4b205600d1e0613e3693e2362292d7b9b2d868206d1c7b8c7a3d837310e398582d64cdd98be4beefd0c16872042e3edb491d794ec663afd8e516a7f5be3a6c55d39da0dffd0013f7a67794fc39130715d7bdb82e4c65ef3d415dc5cab2ff35aea396761b0f7c88dc227f0edea8895bf0c481cfc7e56c6445f6d884fbd57a1eec0716f893aa9f4728aaa07d2038da62f3782e66217abe35776c508d8e0ef34c9666e4ce51b4b27562a8a189c8d34c43a65c8f2445f4a48b5b0b8c878e44b1ea3427c99f5d17fd3d13834bdbe060292791d66bb23a39668e7a3c561b0061fd1e4eb48d13bdb9c8c5c2a3661b6fc6b7353d4f89b708334c655b6574f1ee4c1f106d74f8d37b845b35f770baf17eef3f963130b2dcb8c89e3987f0afb05fed5fea18cfd1879f5efdb63b520e0314c20871f5dfaec951e2a3318443cf005c2c04d1d82de2d72f31f87014b12bfc39275cef12c64525db68a476dcc89c8becf158ef34f6f16935e4928a0df5da82f50681380f4b3f995f42e92f16e5def61724a16cb492c7e8b85f142cab86e13d5147c07374d863cce358ba85bb045cece5ad2870e06a2cfac18ac68078cc08d754d361c8cad47a6772925fa0528cdf135f74352241e4e847574defabfb3019f50790ac6097a74c1111d81fa763e52f138c6210aa5e69c2788290d8d8bc18da427067e96366b8a173ca1244c377761495755d0031bf6283354a3bca2d44ed156399405ff9bc714134a428141b15a95641204e4edfed35f325b8360bd21a1890038a0457482339f4fda802d8d8c5e5bcbe971e43db6f4cdaf1d369e3f0c6ff14c84a99197b22788176dc88d7210f930fb5e2b3254ecd0d0041a4bc9cafd10c685ae0e9edb84297b1464aa35b1f7c1917cd07f73c5f90e22dbb31187d36c2a6566257db1b2709fc4c16fa39aaf993e09caf10d1d2373f32280a8463cdae2134a488b456eaf201101a8df2330dd8dc50660204282dfd6264bad4a587d53e77201b730144a43eb23be2543c7acce4e0d13c6fece696da82e2abc29a6add0f4ad183cc468c8f36a3e66e12e0f52f4426cce89ecff255f62613c37b6df62c4925afa43a8916f3ff5c778470e48b7e2137a73036b534b278d65fc9a826110c138d224566d4ca1ac46558ed16522600a299ccdde0a794f5881a2e87f0cba5c3950c9230f72e904bab47ef71ab31adfef0d6a1b743abfa65507be8c3fc66999af829672b96a050cddc89a6d7d88a07c03276908508cc4e4bf580f54673fed5d9646d09ffeb30f2e980b3e4e944641e8e91ff0011d60f78efa2b2bed8fe9c41c8005ee1749de85ee7bf4d106d97c7d9b035fb5921567e60997d97a9404547c5aff586555155d07c0fc0e0942c7bbc206d45f1027e2f20ef91aeb91f48ef0749d56a6dce60baef35a8acf3d7ee9649db0fea6a65f00afd0b1e5ea089b6a5e4b5838899b567754d6ffcaa0f417a9079f2dc4bede93e8f1e9d8ab5d24d530ee7f1017794702f2df21351e3bb3a9a12514e1d9102f632658a8e1bdad9d5e7d317e5975ee669808be70af07f7f2a14c4dbd519e331f4923549c41af63d873a9b7d7a8d6515062137333a21a5e379b14d1e701a6a034b27a66429cf3084cd130f1f962ab6abb1dcd8de8d2c7d708f39562208664dff64b961e2a481b1380e3cd60722b77630d17716f1ea5830add57486f08346b5aea5100dcb1c79a0e0b17b993d077cd02acdbb9b7338eee623b12a868fcb02ca9677f353287b002605209900c72bc1ea230f700c6c6136c6588c22fd07c6e2b341432bdb00a85c6b2ec25eb2af78ceeca2fe5e14e44c78f9d6cf2594615e2e99376f814c5b8bd596e3ff9158fdd5eaff30024c59e4e1fca725e0fbf3a47a2da3fe65ba4f410cb5d0ad3ffc99b7295f4b54830483730809f6cb296cc1d80128fa208ba18bbb13424012ea651ee75e73f796e94c3b9aa9e911521040a605dd67c5254bfda9d088c60f9c68958f945b6f2b7e9ded2960ace21e42ff3e4c34f5322d930c955089538764d3225493c7089b119505aff4cdf93d46215d2f586d31d15af4353229ec5cce683e7e69d2874d3ece628a5944e97942b07992db75b6798b73cf309cdb048ce24265e59ef5dc12a18d6d94b5c3bd123885d1060a4919b5aaa1ad649b0fd6c90d1bd0c0b9a4ce3f0d743f8c891750ad69ecb221847c9dcd740b1539f76d6cfc951b0875838666bcc8ab5fd89ee8aa331b0ea34b10b74aa932da8f17779ccd0ec369946ec444ab711a5b55e2bcdfd48a97122cec78a229322b35a366e54501e5df2efc114485a6474dacaa11aaa3d59c2521d56c82e4414ea945da8e070f116b3191c9c8caf25d24a8c5e5cc32ddb54f0c632733f7259be6f231bbf7a5a3048600bb82fa2033daf272cf8e7d1a357d8d96ffa9a99e0f -MD = be87bf6e103f66527b12a010e50eb157524c76f0fa7118ef8f0659f3a8734008f973bdadfcff5d84cfeef0914245f47a - -Len = 41416 -Msg = 7eb077392096a265d703e730e8b65d65c5eaa03f8fcd777bd933b4b0af8c5ce3d613085656498ba236a2d505877e18fda45a2916b74828007f9c63e451e978f85d2cba523346d6fa86b0b7422f6aa65a7434b61f8b015f345aa9695481de0be69a6155d2bf75cb944d95538fe86251a3c0df100112e0643ef1c08da746535fd5161ba08103bfb29916b87192bb4e5f010dc3ff6554ce7e47cc4b9886a930baec57c36404060ad2306683dbf6af16199be5484af35ab1f67774b05398b05d6553e7bf6906d1407482c75d5861cda2c79acfd6bb522b7314f57059838665c2a8334e79772d6a47e0b6c0aeaf7c1cdab12554d5182bcffa20ea48acf3f7d048cab412575621db095ef5dadfa9eea4a71e65faad2a254f30627d85136a94f8d515fdbdc3cd8b2c6c36679b560e5f6def58814cc6b9e9b2fb22d7aef5af05e552cf37d724a613635aaf338d7ca679809ca5a2cf898d1e0045a71f4bb98bf19fa84189e6e2a7608aba128238b938e1e4944ef00d5c6d6d42f53a7ee5c9c6002fbdb31c7465991ba873a77b23768e42a1c19a928da8227e7ff3231c038c28db9c7b6d17081443ebc66fb647d6196e42c009d3b1d7d675f8bf27aa202d6a792aeec9b6a32b596f79eb95870dd90ca18948563f74744c2b840a7917b3ebcb80942d8ed8e8639be36d1fcd62f6b5b5efc0418f2804eb740fc969d1b1fcc61706c262b4190d3b43686e6aff8e2af17e1f8fb39cd488c4b5e870e317c12445b6d35c9522c23b38b7c624d51354d015cefb9da7658c2988767d2081338f52f111af09ccc01a99e460c53867f2fc10a90c499324d1970fbe2197824a0d63af508e627111766b50c6a62d522982ce1336a2d21833ca3f61ee1dfe3d468d8563ec96b33d6b2cfb8766f2c51921ac110144f75ed5db38ca48a0d27afa7d9c3c954d926b15e3ca14674daa563659590f025973b572240181eb5da8d361f820d26df9e852a07f38fc180238a850d96f0e3cff7e9e96160eac73ac07d019be028d147a023087495efbc10d028310a7d857dabd80e2e9ba47930716573bcbd72bb6b25846cd7149255b8af772af1ecd7a32021be1491517947dd02200da1e4c82946e191ef1078673629c47eef321533fe6dda2099bbf35deb4f5586a76bb24ee717147f163f108325a1f85e019c23f0dbd92d961a0911d0b7e9f40fdd649675993e36926ecd6d748893a3aafe7a89bcefd49494f2033d60524f66322c4711daa43eb0827545ffc9f3816edc3267b6f69ef2c783ce24d68b2ed21483f06db4fc9c9b1ab5b63337e1daedb26849de5c1c6db60f091af86dcfc234977be652e059d6d5eda2ae0fb65ac35b06d5a168c9bcd091039b44f8639ca0c957905a9134510771a1efc955eb93313bd4bad57180466c062d90f8af68703f22ed57e9a3119092e0cfd3948058399912b47e52a3205794a7e5a08287ecf911b3b138fff318871dc5d0149c297cbc8f722ea6a5582a4eeed8d4409f0c5185bd0e5bca2a2ba9a2ec734b295cbbd97a78dc9baa4a0afebadf2b71d79ab746a495854571e4975582937ba97832b1ff11e9a4941fcd562e29ea1236fc02132cd43fdaf6c6bbd09c94a7617387ca964e01568ca07d8ba4290aa41fac1461aa84a31051f83f1c61ff67acb721de90e346d743d7393a119f8fdb71c639c725e7ee8fbb9cb25172b5fe59f7df3cf3022399e23626c6dc0b82b31ae788787aeb45bb08a61dcd947b670a0a2d5c4d5bbad187d0b1fde1d9b5f8435789e8e0a62e6e7a8c4457928e92dfb2f6c1b0ab7f0777c1212bbf12b9cd8aa10fbd69fadf4bacbda92accb996359a798e497f0fe39470b642180cc202aea47ca2167e2f9cdf9af4edde0f9b41e021de5f1909b31fde76d7b21b49884ac5c006cd19b8075556b3a0b8b272c0182f0051e7d5036d8a31d4b5ff8a07cdd8cf77ffcf3b8a1aaf4d7151985ca8c09f8ea06496f1de77b95b24d19908ca1b531836c856e076c1e1306e880b4104053e6bac870af40d6a33a6e1aafcfc02e9303c86e0c2cd00a5b18c15a48ff437167b526f49a24012dd7fa185b2c9f834c006a8d2e9b145ba3e96dce137a4da946cecef732d0b8a711a03d7ab795e71f2383ce9c54390eef5e4e78f5bc1e888ce80f97f42919527cac856b5ad7f48fdadaa497bb87ef02d56314a300fd3a97327eb27ae7827ddac6260eec8162507efd9aeb2db36fc4d856dbc255b57dd862e43140de96e40439cea7c329b701b29ecf8ae1f94bb5c078b8eee1f5dee5ffd1e929402bcbf8b755dc562d88c35c21d69ad30d614d01ebcb43c3f8ed41dcb8cc8b8d3ac84c669d17375bd3726f1aa50ea49cf7ce7ffa4eb741838fa4a70b0a3b1085b61fe1d5be6729df3d5081e4462e370e28a9ab49f025f8552f82d719fd06c13b3d9754ed232ef80af488c2610d1f995127589796d9feb1625eef9baf9915e6d456986c57d352ed037f84fa3a01c7128c7c450c881228b4d1a753b975e750c77b8a8af0bbd6bd50f366aaf1162b0fece7b0d6d1c7a28d49cb8f16fa12eea0ab5660d6a9c03555690132646e9e91df6d8b4a75b0fc9114b878a0a0262fb6ebdc8d60e25f0ff7047f566a193b7a3d20dfa0d2896fcfe8a448ff615a0573481ba0491217d95024b1dc1996301e5137b8884dd17ad7e7ae2743895aaa5e87ab1640b2ffdde12ac544c6733f13e0cb8591b1bbceafb0edeb84ef3d14f9fb12e7c603efae9d3d45e1a4868cec2949913192a1125192c288a7a3954416b0a2bd05113329a7bdb64a80bb648b25da204b43a2a279e28ad461eb6c7cc5e8351c300ce1168773a714e1aa70a798728e2fa1c1abfa180affb01fbec7eee913f23112041df63299c11fb168ab99dd5cad3c39b594f21850591c6b299c31d81e4da80cf6ad1951a1759f63c154807f6a9f10be2645d2a13d01e1ed33d38eb991b04bc5e979c80d142a5b9ebe54a5a925cd73d61da5e2da585dc74ce4544db4f582e0e6e5684a8e79471c0b66915081139d2c29a19e6aec29d695314407b6f3d12b3016f264e9fb5836aa52c1f4c92fbe780560ba17b1ff38d515435cd4119bad1303fe1955eb7c3a5ecd1ad76557dcaec7c42370f900390ec00d2b33a4a5d711a221456121993ba5274d0bb1cd43b069f03219cc2a9fc532004690d15dbbcd86405194d3b13b5d24f9f1ce5612d6d2795d17ebd593d6c92cfe881b3fe99ba593555c9375ed190d3c3c820bce1e556b66743b41941ced6e85219a74842e8d88c1490be951bd7a717758c96922d70ba2b69f65c10fae2bdbc4d04642a816d99e9784243f6f0aa8b15cb68b9159273fa0f3455f16502fd9397175522db488c60e9d6e6f3cd5bae9f673bc932b7bf5388ca4cdefe65f893faf147787dfaf6b9d015b6fb6898db7866845d3a8de91283f8f52a1deda42a2a566363eadfda1a9a79e5af0bfcd9fe7c72e59639152a1aa9cd18428f399036453855e328c329329290e215753b11134f37137d51730b6629779c2caf8ccaab5903515bbeb238bd36e78380e3added855458688f0220d53878b095efb31a3d7fa69ee241947b948fbd05287b3cf83bc1300c73fb1ac90814869d83ffee2cc6a9dbe74d2c4de0b3455ddc780821aa01d2d0b4e08026d456de0a6916626fa94c1b7839dee4dffbf2dd9727b01cb09d499f7c793885f0e8c87e4c3bd681ff3ad8bdc4bb1ed11273583fb30b591eb2761a107b8302743eae64dd943c4ac2658771770996945badf0ed54f9b2fa78f0e07d0d17f9c6b4d9ce34e12a93fa8e6b371f318df1c9eb7a1cba02b0441b912f81787e96030dad89ef4073556a6e4ed7f2ead39af543e73f9cc63222e844d13a01164b41cb5dc715b98e7c5fe62f687262db4576c98cb9c51b1acd95c7fea0d8095c5d6076416a47d629e28e31c446042df96f69972cc7d43fbcb95209d066d041549a3b2f3efee5eb168f2b73b54e55fb4d39bd84a97b34b0b6e0a1d5438beb5005eb191cdeebb8a35e697dd38bea2c75dd8cb8ba8d3cac171028c953de77f1df77384465a89988a30a5ace7acd815242b34ea4615f71051cd07b14ad2993aa95b36a023324711d9622496490037a900bd769c7a0a884076600c0c808ac45dd1bc0679caedbd93e22ac1d893cb53fac784fc36aa0efdc7a9ea7df2e8ff0f65418a6195afd543ab5efb2c082a66c376e302546d489bce1266bcebf8e677c0fd5356e67834917fd48a63b199af7afcaa0dc61d94f8298fbd3767c4a30bbd8f6291a1f3861b9ad88c0ef5010185707600823096321b309924867b9675bb18d15186ec1763a769d45e471f88d43edfb6170ae27ce9345990e4ee58dfe597122d369d95d0857a76f9a7ed53b7865e213359e25c201ed60d0d7ad9801f870241f97e605f9d60075acf154c221b9c45dd7455a2ee3e4772b35552d291c3be9f20dcb5597a0c87c08dbb130e1b339a887d0f76e74915f79cf50f19540e7b00c0272d67f3a57c615878442d8daf8de5b8885b4a09dd45a3a74a911af84683f207dd9202c9428b8111a300c1454f89124877ee5ba52b4bd0340c91f419ea9d16f8ac711234d1a86b9eb6577aef8bc3b4aac44f0823a3a701c5e37811435b24c3f52c6112e0e3518551faeeb6c6d4bc216215e3fc1fe6d5bcdf47ba1f0f2899ad9fd5d88137f82562de190d0185bae10d00b54383e4556675e2b1ee59d7d38a185b215de9b4708298857958e786ceb0bc095af45c3b8fb7a162aa7b7e27dc74b8a99747b8e0ed077b0a9448d55460c9d2de4f6cd16ff667d3e1a9e7e889b3c7e32db04c7b47ee02aeb002535769118ad6123b13800c19f591e228ba1587ea124c3a04d2bd53d42288284c1efa5f61822a27869ed49a6acf4fe6bf78a17cefd24860fd60db8f3fe5bbd5c9f21a81c13e6390ba456b9589738261c6aa090355966c35127d626491aa9e3b1483548ad11e06e05edda187c680cdd5e6a4b8a59bcd2c28dc8efe7e6a0fc3eaa42914d4e1bf8888ec9e12dbd25576d5981f3cce22e50caec42bec374973b1470179f7fa93716d1cdc2d3c1c0d8031c3436001f79b8c824961bad8298084eae2a4ec5a66670228feb5f199c3088f7331811da4bc6602219b2de23ebfcfa1c5401706d892dcb040b10281986b33e1bf92c9bea18703046ef691088c748758f4d1d04fef1a452a58d62a63c47f10157b8995b964e20301ceee23b43de24828ee3a592e0a6760ceb5c0c60eaa694d993b686da47b47d678d6046e6bef83627025cc1a37a704901bfc234df8c6d41ceb73d1c9e661330dd7f8bbc9a60dd296ed1019bbe3617c63a0a0503a98862a2e9ab9382315933e09adbb96dde9154a35fe41a586b7b6294beb26ea048484e5f315700e11b8adc36a78a30803ab9274c0123ef2332b21a5b95a145334432f820afa4ce61e25fd6d90b73381e36401cce5c76c7229c4107c5c8bdd2e623b02a8c697843291042e873ce7d1b6f5b8ffcce78c6ec7d3091f1785ef05cdf6f29aa4b69bda9622c9adca9f9921f9a300c8ef75ef9a45d760aa01c5f202d46af054106b7594633bfcf782592998ec83e209cee15f938eaf714dc5ad4378b446cabb765593663c55049858fa479ae200b33ec5ea5acf04b3a186cdac41cbf012d85d40f593a4740676fca8e341cc8cb21ae48ed17fc13a9c87c194337b711a47afa60adbe4f3ccb8dab11cb4c6923f008f7764372d0eb2b27aaab3d35f0c855db7222e6915c888e486420eef34809b846783e09be0fbefae108ea72c7af2e3ed955e363d94874b22303c09e32a1c04b65986ae703a3d53d7e009d87f4dc8984fb0c6bcb9efd485fa3eeb983105c91d0edbec0844a73781d84f98e27c55f2252cafd82c7e9624cbc528ed3469562c46f64540a899a67eec27d5b83f8402041cecd91f0ffc15fc8f2b74bd68fc999a15254c10e9dfc678153f08d45a26f082e208c307c1a2edc03285a8e8905b5ea709e446d9569775b77f866f99cce5afd30718f43f0c138c14687c4bdb551603d787ebdc06695132b19db66064f2408e890e95f30129be8f6d9377c42221bd27b021846224bc8d8c0af21781c284b81b297af8361ab514564045f0a83980a148a569467fb0aaacf0081f524a3edeccd418aec833c828a57f10f28f7eadfc62d54bc1ba8b36ce4ffd4d67df30367aef57fb4c7e82b61ef278641b9caddbef825c07cd592b2391e7124f8e16ca55e3a00535c6938950e27bc0ce33b0bc6ff4805b5dde9ac6039ff2bd92d4a18ef9a37f6a4c9f9fee252db1f693dd5430c685dd41d287f7e26333037d9bee07d4ae24edf5c44a0bf79f5b3568797b0f917c2e09adfa6c1916af1599d0ef3ca251fff27c462158605c4bf566b4c39f3b54fd4785fe39cd56c953921635f133198d4ba69ac9e84d2572a786d65a26ac7ff1c68ce2c1155e39810d43093b3683c5cd3d9bca0f8d9ad3e13e79f4d70745460e64489085118149b428a2f34f43814fb8224caa7585b3e41e7d5952a9e9dc15f153152fc8b2c8fff9222c64f09cce0fd4b6538c9a653aee80f0af704132e378511f7d10fa7da7d4b6a669cebda6cc9e89562b10eca0924bbf14e6ce4b96edd58425ead498d6a0608311c5a104f5ff746c7e4db7facc5c943f6699cd177a7dc62112e8fb2252451bd4e0da7c650ef919e4bb35e2335cfc407862230d3351f5b2be42e1e53584f87f22b012c16c562bf798897e3034b6e3e8f0a42d0f2db208339242703330c35cf302fc091079601ab5ee6581225d7ec5f64e892233752f07b163ae2e55a2a1c52fdc2117da2ab147ad5cdbd9293c28f4e0d8ad7d2a980d76c4a8c246dd19b4d38e44cbd98eeece35766a5900c55f2a0341256dc84504e1f7e5b84b8439f4510a86a358d8bf342b5689ad6972771516638fcb668e235a40ed8d389650ecc12adca19e646feb993d4d5f8c89b8cf1c62b83521142945f6beea33a02f27661e96bc778c5b39849c986c709e463e2dc38353c9ccf3341d68905061659282565b193c70f3b9b02aaca14665390b9d23b91ce8c63570391a3e89c2af1f5cfc0e0546df167b1c5e4e480c6d96035630415b83c9b2d137a2ecd6efa37523eaff2dbb9416e078dfae400d1e349b83c2a1f7295c790856a5fbd5c056954c29c8f605cc85766773802ad05a7b5dde10bd6cc5b10b994f0c47ce959942fa9c87738b56e69f600401ba5e5fbe982be650c2fb2d61158cef8899757cb03955fec37739716846864e99dab35ea7f9313cca6fc7aee80ee67242279b2ba3ae39eb64406af5e01f3bbfa25db44db5030059c4007cba845c186fc -MD = 0310e51ec82c5fbb0d8a3a3e520a7a0f77504e0d4744f36b4d87e9cd9222056f45b591ff4f0b752cf642cf5859ce2682 - -Len = 42208 -Msg = 65c656bcb7edc6f994dab6479a4258193a5d4e9cbfe2ca4b8b32f4bea4d38cc27021d0afbd40a0f60455e0faeff61e2118df742a14e6b0c1b031b3507aa6171984a3158264efa5af7ff1e6568820c1cf43bbc96b8fba6607a30433e198e2a4aa28b4ecdcb5e31e4d8c1692056ca98a4c425b150837463446ec153c1704717b9de4bc1e65b60252f7b42caaaca377c1c09d2520a8147362a614ca969ac839e41b402374c671358bd67e9bf7f63674ae53dd83b2f42f27374ea28d0813ec24274cc551b3a7ee650f1272cc41882c86982b89dc92948f4bfc671ec55b2a76198b57faafa6af347828d21825500d8d97c9732997892f3cc8fa1811d9578670ff596467a314874b581b3ef90feb2b618e8751461e5f6d3f84768a0233c4d0e1c0da9d9596c4d73beb33809cf3dc8ab1531bed67d8dcf89f69bbe4793a6aafd24353280bf17f460c1bb7bd8937e9d384cecd70142dc775645e104ffe5611cc4a700f2d511a0d7cc7ceee204945dbaee3e7e402d585ea8f974abcf31aef80ce512f55d5f07b362274ee21ce638379c2d586aaca33480bec3f1708f7546d805eef686c476f7ac2e0196299f25f5b8db8629365f1b5def33464ac3c843539d9242d039dac5681785dc0129bb2c634dd3792f65e9ee4b06a100ef1a0c144b953c712e8302c2ef7214270e672361f7533e86e97ddfa4624382846ce7bd70956b5f0a7006dee7e44853632c665a7f2885573fd5e292d65a32423132b17ed0c78c946f3319b1bcecf6ce20d9abb2dc8d40b7f48348c5ec996f7a97ef0ba2cd6885572fe6404daa7029eed094abdef27c11fb455ff4cb6f86379648e05adbceeec221bd082ee548f44e2002ebeb3169ab757bc2ea9b25c7c7472f94b5238c4dc0ef8ea7271a2b110fe02c385dfe5c9a61e7d3cdb180678dd2faa13bdc0a26c29559f87eb1b6818b296c4dd15939a31d55e57df62369034a1fee958ed3535de5c28de99436687b1fc75f1f7e6c31b76aedfae4acde997b65248f670e29a373ffdf17ec8823c49a5760351b80158b1bfb90a4928241b652677749a04a4d8f1ba941748beb184f41ca8a8abc96d38a2347f45f21f6db340ad99ec9dbc3cd5ab74aa020120d826d13d1bcdc8d1324d36ff87f96fd7b29971733f17c73fb17bad98c6197499fd09283156d87179597db745598f89fafab5409ff15ddf360bb13e4c71c668cf2a174120e1336c69e9b26b317e6d082d4eeff4593826af48535ea7b83271a46a6637633145448148ead39ce87dfdb41ab52fd7cb9adafd1e906c31069180f113ba51d88c09757abf65c89095dea65569375d2f1aa1e1925fcac2215b165c17722c4ee65ab52d1e7560798f5e2acfb2c2dc614571d5a436b40948c2e24a6dde2ec714d6c3d2d33413e6cee36be8e294cbad2361f6bd89b0c556e65bc0b41b0eef908cf0eee7d18540fcafd3e5a046c32fb18bcbd1e1f9ca39b8843320ddcf6e5f919e7b047c8ed9a5ac04a6f4db630794f082ca2bc95d4ab9380a93284befc724d133c12c1972f7e9fdb5a5bf1fa128a373eea72cfe1bf9ecdd60c30088e5e1e65831088f47e5a9b5f8aa186ff768ed0341b9abfb079d9f7baf6f0bd11c17844e2f8299548d4fb5b1a3cb472be8201f5c62c91bc16c49040db61db3c38def78035d0cbca47418e4840801791c7c318658df0842a5b689ef4bfb5302fd65d384aeeab9b8a783a8fed72f32f76a3a03ea9dbf5c67d06cc42adc85fa41a82b2d72f7df6fd7844268cb511e470a3caafe13d30aafd16916617b6a5cf8b9eb6864088543185f6439be139bdf29f8ba558bc9a3c9e8c9993ccaab9a8937afefa3e00f011e9b996ef1139d5c7abe090ec210d3b503ef978867668216139d6edb64094e1278e0cdcbf1d0323df5f0875d79f7fab0c0ac835d1e9dc78602143dd834478f615acf43a2c15b9ae65aa6b8d203a6063c0807d541ead744915f83630e99029896cb50421cea1e9dfeb1c8e692e787bf02e4e8d45b527cbfe031d129a41da23258d44b1361f37f022e003d57c8ad00ecaa5b37c9d4def4011b80e8d7c3488f254f7ca8ff9864e8931d51ef539ade7b57dc76dcfcd316a8d2e954afb592a1313924cb4f4ceac6c01673abc52430015fc63f3cbfb58183fef9f2b60e0a3ab0f1367fc928427e9f6f54da17a711b39e14027bb5c83c05ac5f40dfaded20e2fd35e3077f1c2b7d7a5d15f89b7d614b3e02d339e9e0d88819346d5842343db311660965f4114d0edcf22175422f5d1f68910021e1edd33253e349047ccbaad573ed704130f0f25a4f963ffa11a64d58a42953daa4d8732ae1d69c8c639baf6fab30e0413ca260885ab1392f12c8791d7a32920d3a8a01994b732e97ff8a93a9429921101f0edfc186abd5bb4c7e289773148661aceac4a61a24c6ce5981a0acbf8ffa54e11bb92d59ecdc47c7b1a3ee1637f77f01df067ad5502ed978691ca0aa7935b68bb334f35ddc157a8c473349eb03ad0e41530d3c045e2c5f642850ad8cc198dd24bd9a3c1ae34afda22a1ed07be16fb7742d231530b8890826a884f9ebceec72b420312f176a41771140acad4d370622a3558e2de0c50c7ec5cf00af5208f81c44c642f5dcd7c391e2732705ea6e3bf6d6b296ab9ced7f6649870bf546d78684da9614b5f19498f31ca9d503d8efd4db132e85b8ec98a86bbbb7eef351a35c518178f198df078844c7cc00cca121997b64b0a17b592e51332247f2d3fad4432c3e541fc62d9a5b2cecc3ee8bcc6b547bd021341d6a174066861e5cbac9d203bd1b12e76663b4d8559176e766e237cb865f6784c5a8bc3eadef2677d2470664ab1f9b91a009bcc964c1cd35856aecc7421a6bda9c998312b066468a43fbd62e9f52d5659ea81cf40481b01f11ecf1105708157dcac7d58616f266dc356eab2840bda9ab85c73b21dbdb07ec32f1b06e6e324eb776ba1b60879c6eb6cf26ee1c3767ffaa80ef811a91d6bae50f0090a92f9efccec8f8bb69ad6b476039ad05d02b59c0abb4a756a6cf7ab152d1a1f9884156080be90b1f692d67d7229c8b5a0cc599d2f64c77228c3dd0d57b9f5c53d54d625bb6017bad28b29807442046539aad311fd36ee74d9582df0ca7a2ba0756fac8dc1737cecf6de207c00dec685a418a288e8a43803f8946b03f1f02427bd4f1927275b48eec0165bbe8c72979d6c804870662f2c961303349572ce67d1816d9c8071aa0426bade4bc68b8feff2ff8c45571a4a34b1951efb43a1476f146e65b70824c2273b637071329289484cc99729ab699808cd0b622f9d21fdc286e0a1f94ca5462a8346775c71261128f1773b65fbd86ae16ef25751e05973daaf64bcc3bc97a89694d07d7e00aaaa1a9774d36ab6eb65871dc678f2dbdc2c4fd48710a6e6605bf3f69ddd467fb4a695854f09d86b170a42301441a2de1ea96abca448334893f2bb0f0b31563cc8a9127172591f86efbbab6c583bb275955de3ce68cdc951a6ef6464a4f41dc65b2429b26b2ba0a8da0c3b28fee1c220d4bc2360310c09902db4789e07901daae0aa33eea5fc2c3f6a7e79dc94be526e5166a238899d54927ce470018fbfd668fd9dd97cbf64e2c91584d01da63be3cc9fdff8adfefc3ac728e1e335b9cdc87f069172e323d094b47fa1e652afe4d6aa147a9f46fda33cacb65f3aa12234746b9007a8c85fe982afed7815221e43dba553d8fe8a022cdac1b99eeeea359e5a9d2e72e382dffa6d19f359f4f27dc3434cd27daeeda8e38594873398678065fbb23665aba9309d946135da0e4a4afdadff14db18e85e71dd93c3bf9faf7f25c8194c4269b1ee3d9934097ab990025d9c3aaf63d5109f52335dd3959d38ae485050e4bbb6235574fc0102be8f7a306d6e8de6ba6becf80f37415b57f9898a5824e77414197422be3d36a608085f51a7c5776f5135e3d50349ecbf693d189fefa64b9efdfc3ac283cd6357f9bcb5f2970175bdaacb7bc2c8fbce745be06c4b49550ba9dbe6ddb1603d05bd0605247fa5d3073629b53b5deacd550ea27c0b392fc196493061d37bddfcac39bf8a11656e9aba8d705ba8e2c32f1f02df886bd5fd7c79d18de5b28e479cb55288b413505bc8fe17f1572b1dfca18ae5556e14ae2cd634f756eb0165578dbf9be40b80acf7fe406a4f00584bf1b5372ac6b58c2e487f361f3dfa369d6850297a73f90ff7cdab2fe8cc1fb7193cea924785f738e2dad82bbd859bd893048491729b1507bd37402b37faedade258a23ad025aba1485e615456c0384de2b68b7618dbe81e69df6db0cc7df2c353bf8c8f39283b6bdb4dab6e7f90682d18e8e555e1b8daaa7a20746f1ab7d78dd9ebfa0df7002eef181326c89c58a3fc823612af41a475328aa504a4a72b0473e1688b359e300ea19b696401319b6422cb08a3e0cd41305d07d79efff659f20c06afb0a4a34a5339b19ad386d3db21366feb0998f8f1a4607e2293df9cc738bcb64bfac98ac1850e173205f7f79a73adcd57c44639483a135a3083d1eef5310c7ca7da12d9182c9518b96ba3215bd3ff8fc9646722b779bc286bff6571568381c65dcf2ef2b0a27552bb8536c581bab213da5a7a29b1ebe1754f6708d87da8a32fd85a6c8c4d9f154192e31168cea06be5e516fdd2e9f919ad454b4a68ed08f725a1fc59fa216afb61e9f5c19f751d6392844a70a2a239cb4d082c98c7072cd424353585b0eeaeae202b4dd5be179a5f963235711d8d168cd0e28b72575e9ce0b81c965e6507d28428d14bbc69489fa66d79985da80d27c4e58ed875be75d1a36dd28f727b0f6f43d8767fe4157aa5ee84b4c3b4c6a4d609d747940140cf537291c191306767dd33bb757afb3710458e789e48051dd6b9d242a75ea3a2edaaf4e0943c36be93c4fa4e68ad4062bbe70cb570a5dd02354ba4a44898eb493340a0c6b4f0e3e5258efe1dca87821cd012efc7e66d8b2822f3f76885c336a832aceca09e4fd67f9fc3b58615aa0ec9ff41be3c69ffcdd4324b512c097e14448e485f2acab96cf264ebc723d48564fe8c0bee6f65dce3aad5da385b2e1a02a298bb6eb1c4be35c2176f9973719a132f28c9f6ed84a58b10aff913727e379046d47ea1d216decf7319d7b3019758a7d038147e4320ca12ba0350790e64573ba5d3fa8f083b9b889a0ebc8a3a906171864c73daecd4bb18eb9258ef8b9ae9734419c78cc09d64ff8b4876a5ab07152eb5d85093671b091c49bf7add766c6ec5b6185e2197d6db92eb69ae9bbf56143df35e334e2e5e248b38ed4ed95b6367a1504236f3fa525fe11ed4bcb30427cf1da360a451cf38ade45dce4d59a71a6494b739ea6a649a7278ba3c39a205d6a64c5a622c44b61505c60cb4eed4e5fbd62e6f71d10b6339b3c831e29ddf30fd4a489ce523ad6f8dbc9eea53bbd1a4724ccccd6c833d82aa743e0a8a61d102062ba0cf6c32e2780d42dd6b0d2ce64f3838fe758c89972f576468c8762e1e158bbad38669d28a5c1e29000353ca7952981b41dc745caee5dae4c6e0384b1cd7f8885f46507b0b883aefb547ba0d016b2c6415869664db22af85e6e6635153c5c704a273c294fc88de075bacc27d24e56fb417f8854a92824fb8374f69c9696b81c05bb342c8c3da81f071a6ef834a4dcc8b97a6a3769b61260c368fde2bb445b33be979338f0809c13b85caa3d7e820ed4b331573612c6bece2632c12e0dac0d5e7ba3a17402f731659068c81b394fb2c8368c99792ebfeeeeb5bb8ba91337964546c7a8094a0b2ebd972610bcec72914b4b73772944096b6877e9a27a554dbd8f26ebee1f50245dc2d67fca481f557306f9ce386edd0cfde375a550cb5b574be524f7bcdc9dab841d54593de65a5f20a04885256f802f6b07b5d8dbc1aebb09ee46d35a6bb8066c76199eb2bf26f85fc240808655b5dd7f7d41688c86d5e3bc53966810f2299fdd732e3471fb0a88f914eaa7a347057bffed213fab4258352fbb1c9c269a79dd9fbf9a05c2c18f77b73d4de3c36ef672b4fe5b43801cc01b29cfdf58e38a2f27790065f7ed393b2e5fe6711a2ff2122a6659f95e523d93fc7137e78591ebd3e734df98f4398d9913b9b65f3530fae10bdda602776bcd5c40d09a3c0976e4ed8498033ae3f0e22e8f8f561e1d0caeea7ee08c7f7511f3a04e0ea0e7ceda9e06666d1553ab5863840ba76db6b80b37b5e939b377428dd7e990f3f2efba0740a5f57bbcec36b93522edcaa430f077bdcab5aec4f2c527a2be6d46385cb744f353998aa10b6b5d83909ec0a393ac9667b24b0867f9e6267ca84dd11936acd8df97ba616bbb328b7357875111e7d4b25ef4110e43928dd48c2e985a3e86800c2bf9c0c9c301738a2dfe0f4597354f11ca18718a01c8a277fbd8b7aa4f541d280001138a51e716a3da0d9d63dc8407fbd2a6d24248a00d58f02e1089f3a66a7485381b6cbc74041ea20c9b7489dce3ba9e279c00c124b6bf94b90cbfd2864f37e3254037adb02343ac8470404545cb955723368a145b86f30f00131395fbb4bb4151ebb2cba45c5921fd848fb9c8a7d325200aa8e84d633e888b8e4ee40d8146c84282a6bf5798aa28fd3f298c6c5fbd2fa87f24e50336e627e3e33866c59e219f826fdb30d1bd7cea0e09d6673adc9b9e42fdc5b484e834168f7c99c42af494f0991819c71bb4188fb74a5df23804b59977ec52fdd85f707a17bf39a64569e6e00de7282c3c66c63e816a87d470c05249cdb594670885e27e0416e0b21ce661996842cf063cbace1ff2d11cb6eaf9bbd6cebe539b1b41d247dde85593ba544b433193d7fd2497775b94e7e43fad95396702705641197a87002a9d61ef2499ed05f14109bafbe70a1aef15a618c17e1224f03367000b1a4acf749dcc6f649f8f082fb42be5c991cf8389c12ce82e9a8e3620704c80f80863dc414f5eba804c797473540526977d0ebfec553c58fcd3f7c51a8dce6ae82c1a501c1dde79838af270468961236c930ff5a0379f10340f93f867f4b566e36eb6538a6e1653724043242ebb058750bb194e2bd11db7de38acf88e0bc91bf2b6810c15abccf15756b5b9b552baf84bdd76f217897df5003588ed173cd2321cecc1a4443ac9fa39b38e5763b6481e66e16c08ecc98974a4ee6ffe8bee97526af8bf439f84d51721411625bf4f77a3a8af44b930f807d9d14bab537088e124e2c2c30faff1b7f016e7974c51860f2c1a2f462c6d7dc0cf90348315517478508f331533fbea392c208d57f4a1c1d764c24ab98a2ac27cfce8913e6cb319247d7631fcd50cd52173471b9f43386998f0aae6e7faf02e0208e14a257f20dfad53a1a5c21e681b386f947ab7649de71a7bdaec16a546291c9c834780771f2eda7c1778ad35992546c60e90e77d58a125ab58458fb2b41b9060d771977b396e749de0900642275a1320be4677b7f2018128 -MD = f2df4b7af9ca9da652b5027a6a68ed91022eda553d72f61e2abd9ab46038be92141d3b3dac6c0e2f87db9350019d9f1a - -Len = 43000 -Msg = 24d97c3e28460d46216da39e043e024ed08e387b1e5fcfd3f962472cf1bac4676b03039b3b93927075ff41c87fe1d4a56bd9fa4784d283942787cdbdd5457f1f85f27a673f4e0dfae679689456b6542eaf6e2126ef78df9ac797d114a7441e6d1caecaeb5b00e5ad1ee20249ae42ebb34154936187d74cac809b3a7a9040081ad540d96fb8308251c242f630b20f01facc933a3f73793394fa99f235b8c0a5ee5aaf913b7d664cae7da22c9187a4ffcdf634fc0adce6fa18de9ce08d464c5db05303d996d32aab8bf4098cb458894bf2673ec308e9a40b01d4a9eccc626c982a674598cae20507b1d27ffee04b474f31c8b97683c33dcc1683cafe3836a9be223f7cb81dd17ec8e9bd0c6a5e88657254c1aefdc19139a7219406fe1be78a376183b020d8c91e56f95db9b877386b1b21f924400b7c1e03e8ae66d4bba0986bafdae9b842f16b19a95c8dd07083e1b462192326a8ac7647357af069618759c3d3ec3068a572ef7ac35f919a949050a4ddc8b399e248c8ddcea0aea354c457a597628c18477332df0d11cbff2a8840535bafdd81ff799d2c7bc7a86bde801a7ac1e406b0721dbbb1511745e579923729a376a8c448667c9c0697e5aa45e328ab1a19a5186c981259551c0736cad7bf8e7fc41d4b0538ed9535ba6d46d2140b9e6aaa71397d0bbf3de2c617d8657f5feab54142fe7e16787fd2d54829cd3c4bbd793e72f9ef9e4ac7bfbd7fb592b1a0a50e9621c5fa29a6c2a3937f397e826e6f0e7eb141087b3c5eb6aa47b399950827526bc289c398fec6719918602c0ffe1bf31235fa12c71d698d3575bcc15421d849672b301f8c09f403921e84210a832beea1060a53ad73520d0513b754167321ba3366a4572d4db22324968fa39c8306c8d32d5b1453c880fec3288b980284686f777bcbb2a2546997f78a68fbed88144952b1d39ce1a35b2816bd22d641df162eda708f7a14a68228b401f7712419bd38c39a5c35808d4b52a7d96355fa0994c0044fd7f5aac9639e0304244c6abf695ed1f1dd25580db8461e84365f568b49ed9e208a6d8d4776c18b9ad7d6e600808422bd3db590ab0aca22c6833a7dee9c7c50e99228e4a82259f5cbf855c1676a705e06662d50efa9a75ba8322f96baf737c1b4d66fd872ce2de89f6f1222798feb2ed43fd5c262fea572312c86ca75c1e49a883e89912fe4060d1f245532c058bc3a30b0f40b8b6f8b0f6a578740a9614c826eb2c03666cbac0c52006618c32bad2921a1d456f26523d9599c7a21dd4137226c1a5af0a0ebe78c41e98cfd0a7184a3b0fabbc92049337908e4a6949ac86d228d5ea0e664ac7f35f2c810091e930a52e4a3f28c9c8184967f1554c2675eb529d667da413a763bb16f863a6386f707dbc585c1c8ee77ded9c518ccd2cc6bd8df511b5028aab1e4a5c0095234ca0743e95b866fa59f9108eae1d656ed51579fed056349c43dc542bceb3ba0a3732a8522af8f464a3639cc70de363a3b7f8bcffbfa280f3c7a1a1d9cfa036cd908c7962ec8898ce03bd6f014c11fbfe3dd6d33b03950e8b9ea183dedf448fdfe11483fb6ae5a8a8e37cf3d7d947b2e0ef46692b5c9c41d6313286a58e2f49c39161446626aec887db18e7b535f31cfe34adfb3b1b26df5617fb06b84cbee91b2a09373d90325ced4317a72402829ea8b693e5f4dfd32badcb61a091bb71e2492362d90c481efa3bc3ffbe9eaf94bc72dd9ec5e31b1fab2fb3ecc0cc2af6c9d01614a63caed31515d6479aaf9d97faef220527804d6af27e7a1303c23b9c04326a852b6944ed31ede275c7b16d1ade602c8d7756f75385fc767ac60e6e0025f2a93ad4fc9acbc5368110d25e9e7bdb88459e21c19947da3c416aa42b3291a3934aac3f6120fd63722a9f2701925976ca059dd36ab3e663a063891a8309ef0196d76fd7517800814357774234f93234a80522f8bcc78db6eb454c95b08466d47fd7ec1937f063a30c803fb0832384a9949cb40e3254cc485f7f3ba23e129770a0b4a7817f3aa54d504d6f0e56b1cf2a3264d78065dc109c8f69cccc76450f7acbf638bca1a733f491177b983a14704ae3d5f3fbc1ddf927fdad7671138c2d673425060749d69e1d4166ec0aa7dc26903b689fdcc0daf47f2ca2cf3c70587faa8bc9961dd239423c03b446c21a69407eaba531affd4381168ef24d8b275a84d9254c7f5cc55fded53aa8024b2c5c5c8aa7146fe1d1b83d62b70467e9a2e2cb67b3361830adbab28d788aa5223825e938d02e911ee89968081761b4d47d81b1ca981ef75605ca6ba92004a5d3d84654fd995c4bc39c77bf5b3292aae801c7e696565fa329380f78dcd37e9adc874e5e6d7546065c87c3a1f08b0fb070ea25c84f70709226ef0a588cf580eaa8cf9e33fcf6544766151d9e4ca3416c1ba11bd55a790a4adb854b892e28942bc51bc694209f0f855cdee622e3fdc04454a11a9c4bd28533b385339954cf20c4bde657ed7cc1e056cd4fadce4b1d14cfa864c29b980f69f34b7962f7856bdf4bffc9b2be66216f2213d1e50ee663a76473867441c39230f00fdc5a223480f828073067757110147ded201c534a7400a96260d03d531d62c07d2879a7d6a133ff60b4f6a1222078d0a594c439dbb0b914e19e46cccad387cb2fe84207003eeb2898b1e0c00dd4f4b0c9ba6d313ecc293d6d9948aeaf871896748653be45dcb64a2bd1a66078902094e60b87b7e808e96982ec6621559a8db8f7ad2f4bfbed0dba767ec7f106f4750376f2945c4c09624fbe022fe361706f8935a7252ea6f25a102523c5f04d847a62f92a239cef403c467b64f65367bb26ad9b1ee5d4db8f33e1946b10fc90a2a969e8fcb5e8464fcff447af69ffbcdd4b9cb46ed1dd0e06238560bf396494e17a5ec2f4bbcce57aa5bfbf2beb56f55966bd0e3189b5c3199192068abfc6aeb365d823acb5b95173462f2e750ae795a1e0a4f4e17ded7f1c168de26814a162bb045c678f244bfeac39c922053920026941eb25091ee2b6901aefa0d1c873454ade521b1697e36197f9043677069eeff212d60b12fd43ee18272dbe525bbacaf54c6fcacd711e0eb8fc66e824f3c2a2eedc1c1399897faa16b3ce97643ee6684ce6fbd32e506a7aa1cc6793a97129cfa1f613db0743f45f0e5958c881f29491b4368ce0b3b64729c4d19ce57f0f42caddf963cdd6dd5091818032ce260733fbbda3a95ff8033280b4b46d3a104e9c28e57e62689295f2d5f2b10314dafd530adbb6c7cd65c7bb33d3dd5f2e078f946e4acdc637c50e8990e47440391b456023a0f86e9577945fa7b4c4e92dbf72ca0f809fd5b7e8b75356c93260a7616fe9ea8fe11464b7c98e50ca03a1a5b278bb81294d377578210e9c3383eafc47ed5ec3faf94fa7a107d5c3a6021f428b01d767975e51dcedcc09d595d14584293e4d4494b976dacdbfb474bb589870a3bebc377d5bbb6ad418e39782b316fb9fe323f0cf9a207a9851a8e88c6fc3bc970fb8552dcdeabba5b80a566ca1c5af166c713d1e23e3038b7e21a39bc01782cf657a653b1d562becfa1c96b615d83b274ac3ae02df25023195cd1a6be21a6fc76070cc27d28458048f68dd1187d50c4d0e89a810347cf30528f9c16f5e22d019711a1e76760bbca6c89dade18032bee21831dfc8cc415280b8464d388cf7603027f4b0998042b62e36196dc89777bf90f86aa98eff18ad2eb410f23a06de7ca5e59f472379cff115686ab119362a7ae44f8289f555697f89bd0864f6546e91d54a583686db09e9f6d01ffc65c4a19d265e18157e57ca260c239b29efee1e5c68c6de03462c970d4cfd97c420fba38301d4a9c09c8ea15d309827a5a94c6418badb8f31e3d6edd78251609cfd2376c8f113a61fc2528561918b5c5c94e7e6735608fa46d27284d5216c18db3cd4b1db6ecb9b87a25bfcffa96d97d355590bd8c4cf9db6b477e282b4be0f2372a7db36e54cf89c9f036e63e2bf789e4d084ad571afe805ec6f8d6cb6b7e1fa30e55967ff185bc32ad1505ac8016d11fe8e39d6071a67b8fcb1ebffa1fa0fc3fa35c2fb16de239fd85e5930e3d3e3d2dc533f76dfafab4467f794c800f5071521119e4cc6deee8729f2cf82a0a77b5588eff22475c0113cb0990e324e295662680151e979cb2b2d924759bc88dca21e66ccc86b640c3816592ebeeaf4178c30117d646db9f357d793b45e6b2713e692086248b814e49e45d4213d3ead3ff702cfee6c2602180339b0d2640af5cdc754e058e99722d9a26fb408ffc9a413455ef5ecdfceec899ba87c19f1186f7ab2db81093184f86be2d87b5e7cf8a321f5b915f115a4d3c8afc858039c200e9b37aa5d0b970e100bee349c8a4b6814fc7685c283c4644265bdfdd727ab9e5dafc425f6c8b09f044a12e89a24d184640346596e2d6279d2e124dd6beec5ffd748f6f2c0d8e4c44f96ff88e6a6a5ca2ac6e3b88b465651efbb92db98d171c0f5c73e755db4c9fa4c83128a14984ec5d3b7ed07ac7736890365766ce068259e53db09421fd4c6bd959eea60a67222f3f966b0eb4428797ba86f5e25d52b57c45bd4f5cda9c1619ac53ae5a11ebcc8d10653ddc7d4e2a5c66949a88ae9838eff8845729c6df330fe25f792cfefe0a6e974ffc211f13e21e5a084e4009019418c63bd0e22fef2ab74624580418c7653a9dfdb1c7e0b83a465f8919f2b5b55061768ac26f5bf383789f4b52caa86f6459ea1764b50966b73a3dbf0486fbdbf431d21836b89314c7b9b47b7066f61d903446441bd3e144e363bc5316e5239b08efa08e33a41e7a7de44e5db9c04afa6f31792ce009b27b4529a4ed58f5751e1505a993c21d464c2d60359835c0ec2e8bb94a78ba3fc23265f5bc34d09f388ca3dab5d0ea0b51b35f9531d5ec4f23e06c3582d0b25d5b92cc2dcdd188ccb60d38d68cedb35488d69ceb0abce7533938980be9dbce4bc3c3013b9f6b886235c75e61f59125e133de6bca87f42db5745f99a5474218f142ec8c85faabd64bfee59ce3b964499a9af2559a7226c65e1d7df76964ac98382235f675a6397c6d598d7ac4a0102667043be1c391f9bb357bb938c108c25506a9c7c6716abc82b28de8816c723ac431bbe097adad161321d83ce614fa2c574521ca84e310ddee00e41d3844f78c2cde050affc08d24d60c7a2e88c90391a6dbd065b9325e43ca41a45428b2f7ae65582be1a265fbcc0cddaab6a74aeb9a4bb2ffc1ecc61d961e5c16b7d71f39487785748c0702bdb6be7cb0fccafe7aee4db0f506a5071480f039826bcff486016b4f2a34b6019c89f4d0d429794d7736b4bffc5b6c5d0da74ac0309b9897a681489d930038c860eeb4c35e653d9fac1988c65ae8ca30ceb333d9676db87261711656f91914c1d18c083c95d79c5cdf40d2ac58d646e8214db46c7109b9eb7f79de64a2a6d252b60cf724c3a820ecd9529a5b3e4d69edcc1dd3619498236cc740a7aed7d0fbe5d91589612eff51b862f8e6ba5474b9a797ca9aa019427c5c026f791cdfbf16e10050c7dc1e05b62642dac0b1e174c07f4cfd1111482e4e23f8ad5c96049aabaef464b87ddde2d79f409f2f282f7506dbb15d3f9d6885202971a359048c8a42b47dfa652db2bd3c8c25ef3c07849e122490932c2ac36e7bd535f9774ec0b6645a62bad4d2e4be6e53b974ed3629176cc3af46e0a19f12e6910b56bf5de847980a6d4b0f55bc0ff45ec4d34c9e66099c1ed61f64eb4599e9c5bd6237174c64672c64561e9f82d556130eb76125829c2a9fcfc5bfeefd2a0cd711c6e96533365826108207977e3b1ddc5ec633b4c7f79fad61e2f9940eedd830d02add30e7e4f3613978d424f766d0207ea8ca347b4383af531b1bc4c20bd438c2351a5eae97c045a7e08d303781f74634062e8be7a75c0f6e1a2b665fac8957ae90a8d8d177483b216138a284b21ab8498868a3534cb4347a8734612ef77df65de38f8797ab12a971a3df622721c2dd85d57e62075912863f093b9f77153a7b98d5d7524a5ca6f85d4f895768f8761daf967bb24af7ff6d84494a07822e4850250e892030b18d91ae0d3f6b8e5cbfe09172647a664e025113ef688196692ddbcc37addb93d34eda2b840885e377248ef11243a2a185a39ab2a29ef5fcee738657f8496ab9e9713d9e5dec8dad712d8f981d1f1144c56ab02a0af34bfde6a1b88cf867b5eb1c7f21cd3ff36c3572624c4e3c01b19635e0fc42d06f6bdf7940d835e00ea47094ffee82d32608c3a14c2bda17f069e1fe8ce4c49c1a3eeaced7501857471f9278790b83c18c4a9e2672950655f4216b47f6d17615fdaa680eee87fe06190e97f075e298b02d1a102a5cf3989f15c17e39a72c22e41f989f600ee5ae948c59c8267cda8b4812615fd593ab599c5c3260fc265b8eb188f1d8edbdd2f2aaa8e86d3f155b23324205d44e9e2711f5d05a59b7fbc88323419b5bdc86b690f076a3ce66c9cd2716c5f0b7be05cd88517a22b392afd9c8e251807056eef9510dfd7332c11f99609ba408504c510785596072b4b6c9f82797c0875f837f03fdaa453ee3789f25966ae637e621093cd2b58c33a64bd18c66ea97976f8ac03d5c6e57ee27b4d1da902b9364c364b5d3350c064bcf7850fd4e82dd9aea94390d35023a69479d3e201885b4772d3ede367706d4a47866cdb2a7089a7716c873dc520df6998a5a6d60f42050576dd70bcc604c0025e83dd0153923d6163c4ff513793894643a14e600eda56feecb56c4fdb78692b56924e18dcb7c9a5fa3504718732b1bb49df2326acbbc19238ee39131465c903e4143898227baed3a95f4f255088d9370fd1dd804560c57de00a8fbd0d37404a7b9c34f5c1386d88f58637d30ff070580a0bc6038563e300767ca89422779f5d819ccbc845888624635c47013224078cccff8536d92f9ad870c74c4f00a116cb8a9855760be679347743f546537e1f43bd1f9380ad3e6d54437cc324043e47031b117a8590ccc737a5dfeb08e079181b7f0e69779e1adb02730fa5d9b9c9b092a78aa37d80c5e0bc738260cf65af9282872e7f92184f546183e27cd6adbde3f8c47648d4384c662174ce2f005f8c0f074a026e46a8466a000aa7b0813c9541b3d667031033dab8050e258e523a88fe284c2c8e3bca8a9c5c5bd1d98002ea6a4261df4ab81ffb66e5c42b072b8330e044020f87b7fb966bd51bc360597d27ce32fb4198424918f3321b413202c62e4609001dc361b8044918af2edd5427c7cde4172064353bdddd78980a976e7fbbafe5daf9c9bf9c2ec485aa66b9268f6519f42a0e470784948637bed99fc51c637e48d7061327f4a06eaa81fd7c37006a12e1c86da93fafe7adede440c3ad28d041c0a8d538416df39805ba65af1c4751591b56c113541a418509cce29b9d316c8aeba4e991826482d105d831ca3cb0a54d2f79ab0ddb503cdc29cd01900ba2a2ca087fa5c76184e8ba595fe4461ed8f07f9c857e014bee23e3ac6950397f191d8fc58dbc32752b9fb44eb5ffbb492cad50c12edc961c40b16c302641007de1373ca1437f7b23e5124f747ed682222 -MD = 2b73f1ea458d69bd87d55e2c055936222a83d927d4c4b1b059259633ab0b14d0ac62ddc4d04d6a6d2c878b0fa1b53fbf - -Len = 43792 -Msg = 64c756b6dd40859a1a0fc128f33f3dd0e4efebce0e47a0b77eb17352b24566aa598448615b4ad94719fe302bf60c5af2169544e66665da50dc25714800d162ccab6df8100ef48d15f792ef7d5012099ee89abfd57796191cdcf2a4dfa88c150ce0e9306aff27e82b3b32c8c4093b91fce366254349c3a3460680d4c0b45dc693825fb61735c933b26d4881a92a6e3c358e613ddae5d5c2f4e237c8932b2bbc88193953c0b8c3b7d1163be3d3ba93507172f4d13f52b2bb4ff9804aff16e040142bdecf0d91feb9b1bd73b6ebc19116d71585a71d9844d97ed2c120ac7c639a5f42b6f2a5c7618479ea58c2984852d690017e891ac07163a9f5631343659c1290e529843162d35f522552ce8355bdd8c3be453dded023a0faebcfeb6cda73f0d09d9f4c586b3e9164f7c9a453f3ba6399d2448b12d341d9973b6c70cee1d07b46f08013c3e98963d6e7250ab12731c03ac7e13d5eceb357a86da16a12859bfc1b6834a119e49c1dd17ecec945fb0a38cd25861969cb615f560ad8a0dfcbbcbb768d23be03655f077c422ca9b6762d117b729ae9dcd1333cc89978dbdebd1b0080e6b6322972ba6800bda771ada083936b3885735ee9113428a2e9e3b762a11360fb53c43216958a8477a8ebd182f208c6feae80981ae3919bad928011c2343b3f54643ec756d8b331f795ddcb2363b6b34d7fd7326c91994b43dd7a94e6bdc2457a4f668f3c6b2c2fc5d810428cbfe65bac5f42d3e7039560eb3198e9d525ee99f47e0533cf363da569d74cdfc3ece1e5a3b687239421cc022ef6a3b8975208644a57e25a17212dbb6bfc584ad2d4ec7abaed6fcc7ad48857939564a8352e57cd0544c7ad1d15469b54aefe2ac05d52427a6ac273a1020f8aa274a062b6a025fdacab7ad3e8f8ce6aac540427967159646a9648c31294abc1e3fc228e228fb81cc7f6c47580b40e53f95833ea5bf74b0913d9c861d473a124df95b1d382e55a51de8c6d3bee2f4e7cc521531b17d76e58fb9c0cf8ef853cdd1da814d9dd8950c47ad53dcc3953d60d97172c62d3f90b7aac45da2e6cb4c311259b14493b63e59e2239fcd16906ed2ff8a2856596456996ae3efbab52e77deb80d879cba45b60075f2071f18732dc096f2a28cf68a3d2d587ed3718a906b390b5c50b0621590826b8f265d59abeecc58417db4651fb8c5fc1bc551d7af8ae2b4ccc91a3b9452724b517a025aa926288bfd167725a35e05be3121f61cca7b3e2ce54d54975070328def8ea88c096897da9c094fd8a3916f176565b8da7fa0dddc2c49da15b87e45bbcfb0ba6e2b2a8c9c94d298ceaef764b01f2d24813d90245b086b25376ae14e5d689ca281bce0697a7def0ca803f488e0c4d4c3b192cdc422001dc06cb62daedb40bf0b670d2ec0dccddaf5c5612d3e520cf910ec0dbe1fb9b9de262648c7d9bdfe745f7eba6a253bfb02fed744e6076c4e0686811cf5a99a8c28e1148154618de8791949332709208c13823e0dd376980e89af112ee8e43d0d8a6b87fe37d8c39519c34705f9ef2307692a6a4a5a0e7dc4ff052cd21c7229a47f30212e06a1f79af2e808b13739abe39041fc890e318617d2f334a514b5e8e783d9408f254f725080e20eb3738b33a7157365285472396db223b9064641e34d14c196903853fc5c305bb98b436642d8553924c6b153003cf9013a744578a15bbe7373dfa431de24adbf99b70b2d61edfc0dcbd2c966931c2406397d76fccb89fd8968dbfd7b903045884fb55f73095e666bbaeaf0ff4a71dfbd26807f309a5e3e5df603a893cb0594301c04a4c9b1a020dd826dccbf9ed46890823ba2a6c65f1d7babf53a0ce71b1661bf336f83f369b7cda2d9b11a18ca7b2aed0da5d1a7f2f75ceb1f26696cf7487789b03444370197c6acbd428130ba63e6c754ed53e7b0789c43eff21bd510a6fc0c09878d051e5d530096f5978f2adf4e91cfed7fee2e0d9436e621a6a80dce69c6adddc0d60654fd3ee54ecf8ca239dceccd2ae823b212ff44a0399c6e250b4b4a2bab7232502b1fc836c29ba1a7001c28eb2a1f30e34517fd9cae5f901cfa0af6f1753392824c552cf9d57e76afbe86e6986f779e480078b24a0482a65c27335dadcf678f234517edad0c0a6432e1a796536f93b436d1bc0316b0882948ff5f0eaf1e9080a981e27aceeaa202b705e8c8aaaef62b66353c80a156e2818a0ee85a73e7410f8baf4f64edd5e7dac2a7e4fe1cb2115c2ca7948b784c244795b269f19acdeb845019b93c78724e44ec24069717fd67df10a53eb3ea24c003d2a65e44921712a78d4daa51fd2437d98a16d8342af57c2ca8baa56a9555382ee7472fc3e86738b199d7ad45ea80571122fcd445d44ed0bd5b64534008721f213a0169000c42d06b0c344ca8df0b0e844d42755c924de809bf1ee2b491ffc793518194898c1e7c0c6aefd2cb4928d09b7f9445d8e39724ba3a56be38e052d3fdb4343cb0d67e9e4e2c570a5d975e4fdf204ed05b569f391753b8506d621fc6b8d895bc2679d7a988d7264db0683fdec7d5fe8f5459ea77d9a1904392a5bb025d4522bd4af4ae3044e1da07642a31ffde170fdd446bfd83499a9b026919b9397360679aaec586d52ad2ced1f96bd9458a5a1f64bc1b4cce1fa52517513c9ebe63d0d0eeb26ae5da73208137e08baa22651599a01bc65cbaa467baeceb8cd013d71d0b2406534fe2e6619da3aa380928f6effb09f42ba1fb7048e90d7898f1dc259b52c51b2d2970cd0c70afb6cf8acba83fd01cc589b0f31bcf2bf3b8df7879d7d2546c514706f6cf97b6a6b6d0a37d018ba553108f0e240f70f03a0ccee86f76589c64594f6cf74679bc330ad9f7df8b59e737559a1e10b3b4d24af4f5a63f89a477578394cff4ca491ddf2349dc45be3112541549654bb1314e90f1d2567c7a3c91b070b5b471d38c3805a0bee5520297b313dffb7837704cc1b683e35d78d087580991209ef0fa99b740f397878701044601064edb56898dd8264bb74fe7152b56bd7573f3e49817f80bac62574731fd47a638b1e33b656afe6a99bc8239c08f0a668e1e67df447d96e03bbdb9350de9447dd7a334688c6aa0fdfe61b8d35b28df7f6b8e4f537841004911f841b30d5ea8f273b1534067137c5afa5548565d8f62726e523eb3bbf8c0b0dfa07553a8d3f19e8d6aa455adebccfc1df5b53540392fea26f89aa2780b54a1e544c89978dfcaec951dcc3a995a3f6bc9c183f29bac943125e00792450f38b6d363bff6e5d871672b692f41e1f520248e473910d8603c01dbb6f9f5ab5ae94a2a7bcfee8864a198a0db422de0333bb0ec0549027eea83b6c8dbd65f0394e2e64b0b7cf2d8fab7eba5c299314c9ace8b637a385a07a207da7dcd4130f643b215b5814bb6400140fa9addb8fe6fa2753e85248b89fb2d44e75b09bf1debddd3530a7bb08b662ec92ff07b1607c1d0bc24b182b714d1f2a757e12fa4686cc9d328ba594fe4a3b9bd06673934dffbac0fe879134f8d1488bbc6b09d95c2e19e1df135b88e74916899184f7699d975aaecf45c54c9454b560e9e49e2079ff2d120571d07d09da781e9d019e1b996b843dfc2dbd598ffeef0fc590d8b7e6218f996c4d0c5cae26ebc2bb866d9289a4c0d54fe680442ff67d021818bf87ebbbc7dcdc4d180e1c54f6ddb5bb6eb4b56996de8e1916f6bd65e79faa235b76cff55e451d1cfb7a9b8d22d75147a86a64e38fc0826d88568072b650425ab56ddcf8db3bf660bd8775f9f51858d3239ddf3a32e3f38bdd4bc246717caa65d45558ecc62531c2671ff0bff9089106e8336f9507afa91a1dbfc908a08aa8ebc0148cf9a86d94e900295608b60fc689fe165a1c978d6bc35099dfe1cce405948294c045077ae87e908cedfbb396bd036d2ce8f969e3022e7fc14af97cf1880a21bb3cfb6eb4f4282032fec178033f1d3e5f6351061a3702b21e52773819fbf2a573474162838290b602d0818dc0147f7895114ff49bd0e7ef9a418488c424f717a32a3f6d4f585d5de4ad647b3304d023b83c18bdcd9587401c5d47f55acdbf7e332e1f16803f381ac0db92c9c6d7b848af2ad7e8175087ac8df0e90643bcf2e20a9806e57effc9f77ea332ffe054e1ed6223b2fee3c7923bd3409144e8ba394b12b31e63b260b7fb074d6ca5e845f01db971d18698c34ef6d7966835af8e3cc232c68f17822aab2e41216a44487090dd9c5b5d089d0c63e4813996630102a24e5218818a57244c9915675163679d6737f3287e0d5c6a7a0eba73425647dc13f85af21b429a1843436b664c8bad961d32a6215b1c3ca53b7a688a9494e7e539c7339c85c9b1cc37352c67804382225bd69d8e1dbda5844d3274c7b5a74be5b9c3c35ee8a70608d1753eb218134e08c92cc1b7eb78ffd1593ec772cd17d9a43ef4f3806c62ff96b90d8b8f3a8379110e3bf8e3eed6b35206a448d3036afbe96e63ac493884063d9604fa460f1c6b05d20c2b5b4e5e27d0fd6ede31802a187df117d403759582c41063721ebe658dacbfa543683299c412e5a473d66cde9729701854f44a1bdbf4d031dd606fe745cd7b102650c20df2e2674cee08ee0fe2b3936f1564e0a078957e7622554c28fc32ae55be5b28441a062b7036102e4460e30123fe9d5eabc36fc23b29427ab21ba1017af1d389c6a247d817353655057983633cf6e6edc523494287da72240d08e31b89a9fe1019f46d164ad2c18bdb955960c3e786b57400eca9621d2c70bf2dc0a689cd26e2c776408f10f5fbf74c1c2fa1bfb8c6dd43c3219dd4dab78652f1ff478345912a589288e871862ac2e276cbcd3851ee8eb7d2aec6e6f95c8f4ebb6aa87ef9870e52af0ccc756e9713250cf58d369a46ef5a965bce9f6263b339f5c77182d152b63f3495e125938a139c447789c27b1529b377f25a08fd14199d06df4a98b5394ba68bebcf88de4aeacf871868e3dca5634ade391527b3b6ea01567ad9c68d83f5101bd63fa63721bf463e9fd3a2a53cc6a831faa4066a934dee4d60c9164179db044c1ed9888755ba8acfd57105be237a54d9fbb2ad0bf16beb5358c090b963260a868a4435b42f0522a482eb170fa2a6d63f05e5227f196c80d02b663bdd89fdaa31e329b5a8f7c596236ee8dd800072b7cadfe56fac5377352ca1651f9632896db5f12f1149f5256fb6601161fa87077ee1535b9c7ce7b493cf826244caa7f2da7b7cff5081714b34c4210eaa637d8db3ee27efafd61c4c21219608b362315f7ae94c407a37b25f6db57a86c0a52b2bdf582448b2a13b67678ba5fc734716f8d368289b9853018aa2f03021aca6d90a8987120facc78c2cee7376e98c5f9ee76f61dab8b1bca6f35cdf0e887550cf5239e3b9eba62f57c43d42d27507941351d63a283ecd5ce9c422e9db632389542a77d4e085a7c1e457dd618148ebcdbb618e5ddbd6f41a11227d765e59bf3bb1baccc25184b7657a0c54364b0b40f2e03c2130bb272fde6837f4ee60134f4d2f2bbf15d291de03630b2c2bf8660eeac80d171d8fda8590342b0fbaa939dea714a5d9352c542583e57deca74f005e9fbbfaf68a2196ff19be26564001727131a84fa08a277493cd498a1d12198237f8032b48e13704a45f4e4f52e9306612d335529e7d8a9a31cad75946d31e93a2dde7c994899acb7c4b2cce8a1dfdbec87501d65b741f6d0660d613ef5426dca636aefc63ea12948fc59fcc864532229cff55025ed8ac961a7890dfa1fcf9054beba1eb3c6c6607e6b6f071cfc79539945979fe2f12fabc75fb4be6e2335eb599e508bfa77760cb880468e4ec0defacbb6bb5f35688d18820cf504f3d611f94990a2b9f2c73c6897d994d4e657d0722161e51095ba4f8a222dee74337ee024b524351b454c861e8ce5be7d6c381a744af589467c7cd39b1830e57ea5a43d082cc79c326a6def991823480a58d8095ba8d02c836226a5a5d4b49ea6b2dc650e01092ca1cab1e562ba10b5ee24be29a2bb805339df2e524508376e6ef38e04c0e2578acbee9ee3f5f34c7cab6860e7e4039471dc5c1a55f2f337d949d04f98ab41311b135eab77dd541520c49c46e09a017b2d0d51612d3a561463c9e187ad479e34723a936e2d934d3936cc2906903f35a2d93f67a94475817b82619fcc9f0059c00484153d51825ef7232496f6733e30b9fad50749385f05cbd99373950a60146266a26cbfa054f9fd7a508ebd0621630f2670a8c775316393cdf205676c015eaa0cf8026b8675beaaa0e248b0d5834d40d094d4aa87a72b41e3efbdba204e88f56bf76ea7605f0d9d3b5c8d784dde6fcd8db40378fc2abd849fff0513e3c233d308430a19ea8b7723be21a589eb9d4b23b240cda92f269aaa669293fb12e6dfc1665d7d2971857bfc8dd4295c3b3a5fd1e2ed8bb1ad456341dc6cb2d63a36fd5f0a99306c91d79c863ed69175c9501e6693fcd63902e187d975c01a3bc62d1cfa6998bc49c7fc594f55cb764cf25927304a013595ac9578dfa75f12a24353af3207de8947805e22b64705306862cfdaed799d125e26dbc6d3057c34903e25248479dd1fec57979959a726685e771ed9fcb712f508ee1ee241f4aa089c132c2d601406f8beba131da7da917675cbe084dc6725661c8ef96bab198b071c6ed32a537afeac25245b303f75f8f364cd9f6c0b1e26ee0f75d5c38cc871a897adb49bed233692c622fa718efdaf5791f8b6000750a9e5682f4e7a55a61075946c3b028b812144f8426b31f4c6472b93c9cee16f8320f4ad37ce009426c9e6a906f0febd39414b51ef18222f8432e7d0dd4470924a2e94451bdee6c6cf10843c1a50d10090391e69a59ba28dabf504df9fb14e1e0a153cc647fbad7c0376c6c422e529d44a5b2695e26043ada2201b168d8fca61378756b7489ec512688f36e7ad2879d6bc4a0c5d420075fe0b26832c234a861a77078a8e9a42be3862ac4d0d058541566a68385620e6c9fd4b9ae5770d7bf1a83cf840c2c981f94c866091aae8a600f1d93822e72bada029e7dfaa9d889ead78fddc01ea32d716cd484e7d57b2e549278d5c54a6beafa91274775af6312d1a2b3e45566b72ac97392cc88889e0dd7a75fb37560b5677453555e46f179391b82d72a6b6cd059ceb2eb8614bb81ef9255ba74baf9b8f9ef51110c97f783c77180e3f828b957802930c5f9b2f68b9c2ca47161bb9cdb67139144978d4ae7857aa2bf96b7d4b26882f50a6e8bc224db4e9c6cc2a1d1897b891dd44852710f38dff2544c3e454bd97f0aa02dc7a6b475a04693df932127fbf9fdab670ef461ab47788862e695899bcb76717e8d2ba333c9a9cfffba121eb00a37af3ce85c47a55b3b441fd64bd3750c4163a905d75adb72cd066b3e2ed66265d5ca0e092f28edc34371cd37ef9330eb7460f559353f3542bb216c46fdb7d9b2dee32799f86c4c2698f5b2300930940f164facaecabb0be27a0948fa062adc985be1cdbf3c7a8a2c43ba16ea221269212f17142f203723f912a44783d19535bf53ae49a385bc6f7e4ba6438cc1a177c8c8a27501be1946308cdcb309e661aad0ce31e36e5a99c2c4b8a3803f6f4586ade7d7194f2cca3c2fef98d2b3cef70473d552e24844794da59298142bb3665d77979e473ff3b3cd9d43c0eeaa10bd0a4f6ef99058cac4d6cae26c4877156cc5cfdddf46f99a3bc123913b4d16341d860da40e33c774e3 -MD = 50e223e4f32f90fb64ffbfa33f0ea65841d75dfad19d0eefbc67664b546e60f5564bde3351b3d49df2ac3613c15e43db - -Len = 44584 -Msg = d62dc41bef5d0526a8e594471c457daad5afbea6e2c7fc9d29a87524ff273664f65b8ec0f65dc2b9904c020e8e949c27cf7070b352aea49190b399ec0fbe1dab3471e208598d2e7e1ffdd5e9051665e93a1da087b0092f1b728b946d374c611a3776a7393d75b23ffefff320a9513eb7bfbc366825610504783950eca058697aa872c79ccc9eb4c2d45a46fba1cf905a0657199fd93d8e1349c4b3b4716a9f922e6d29792e8f9ed04a16b5c11618c49bb6f53374f32531128e34a70cd30a6a2c7270b5188bd0d631083c27bc2fb24040779f6b2e9ba159c7ee91133beec1320e1b8253c00aeac6adb5d4863215276e11f35ca917fb3a6bfc12e4de8ae9166001d2acebbbd364d40cf9e4b96cefffb5d8cf34d5753877d077a135f241ed925acd3ff5654f0fc66a157e76a8b2e6c07c5bb62fd8917de1f001448a36a821bb893a0965a9c5e699ef91e9913b4c22f42d634e5698b3f0fe3361a3ed9206ae1c5510d904a0657f63cb49e53e5a81ca222fb83fb0fe23b95902616565eea5bb3a271656db307603af65021884ed9a07d3ea223245f2280177c3c732fa32cb719f651529f14242990227872a6bdcdf008ec669cf1e5d0bf0e2e05cb4b547c1f8d279d6f94ebf0f6ae6789fc4fb0f98dedb2b54bd422515ad21bfe8909d13cf775bc91e6ffb8d269ee2c0118e3d6e0dc84281ada5b9348b61bcca3371bb7f3c16c3bfb833ff96cf5c7f68a62f38e286e74c303a2e8c70b8333b6704fd157352ff90c16bec62c051cc43d62650f4514a6280a0c401c2c3e34c270024dcb6d857574d39fe422df5f617b87359987aa5a262673912c5631453d308fc5cb7a39494497f8e3adf671c046566a706b0d1c4d60f8764ee23784a51f164c37236e59151fab028e768181dc4ddd4dbf73f01982e906b871ec3084f25cec5bd2e0085b5d695676fcd8848e07ea88a75f2ee1307f10e980c6b4c1b0a1791b2525abe8bea6a402dcbb3e5004c7aed10dfc0650efb69b098599d67b9636f63b4eabc17fd17562389a46227474bffd5ef7f294bfa5bdc9ff1d87cbbeb42746b52ed1eb4e524e3680362a3f726c55688aebff448e00f93022eefcff1b88f6fd214c3463c4af85634236d3cfda4a0c82dd506eb06c7fed602d40860b02932a8bf82d4fc58357dfab2722df5e0c9c59bedecbbd42ab712edc76d8af5a14514675b25880ab0ad9a1607770b98489d1c17ef7c48785fb8321f7881dd576b141bf4cd844837ebba37f15eba6debdf298d865c0c149f4bd346b53e96694eb79e30963e277a4ab2643dd4ddc4bcb84a74012e5b258710960f37f7403695a22dec3c97d697880cacb49207ac1c61c534865e59154e0995e975eb2da7e8cb1a7405253dbc5bd84582b11fd2f44ac2da43688e4db10f02f4ec0b4b9f9a35737f35f1d5d119fbd4bcdb64cc7dddd749c11f21775258f0daf646db3f9542a3f39917b9329a1400e23b60d3824f8e4a5d4171b903b2327af9639fedb056c6bcb430c36426e2d6f16c88b9082791302b6521e13919b36634c803a147842b4f081e0ce0fa98ef8756d96c8d0ba48cea03cb2a16a8a09f1da7ad9ef2f3a55c050e9af417846f0b4db891af84e2e285e559f624b90e82bc7e5911fb3af9f9310f568eb21008957c539dfc194797c8c748b54ed77174a653b2d45de3225f6af19668630c7291f18abf9082727e323d993c9f3b0ae7e1f4abe0a0f71e512fdfe6c1cd82cbe6246b7fba168b81d1b92b42e9a02587c35d540e3143497471713f56b90c51b713cbeba16bb97f0fe636790b763f7414acf0aec2cd47b9ad272b748aa5ad3a97a28d593afb00c6e468b00f3c0c05907a4aa3ea10db34b1901d6765caae38a4343a739d909173c8c8fd30d51dd279e280467df040839098e6fb2cfa5efc36f7578483a0eb569bed834dbdb3f5f123d0f04886a89aefe5d67768831b8db62f9ac627c7489572ff9edc015f910e908bc391f7c7fb6644bad30b0d72b0a005a9f74acc477ed50c28419dc11e57aed83a242afc47cfebad98f66a9204a1df102e75aa1b0a2bf24c9c408c3403ed1ef1b75984fe0f0e725006a95b9e3ed69200457cb0bb1835355be5017203153ba6028acc67a6259e43558c54a8d92a3801fc777422557986e6618bee16d65d298d333ce39a9c9369a6e5b25d17edcfad742d4ac5c99036044d85146d4253e1a01dae5408e7876155e328012d717f351e32ba48d86d155599b1f00ae8bc25ab869c985aa21410954c4145002c7d3a657484ccf913d68be12c5ccaf4c64df2c3c5531cd619eade3935096438c205c36695b28be4dfcb9bdfa4943a5b6fbd632f438a5f51d4319a54f784af2f58cfc5406b041e91a515ed59eba268c64bd41ff9ea898c533db1ebef7cf74c6f54a5e6fcddc1ae88cb7c2856e8ce7dbdc25acf29a097c962bb317a11abad6380204dcea1d2336252bbc8f5df835fa1c83c161ac54ffd3e08b67beec26ced1de8228f263734a06376dbc1fbfba49ffb7021d1a9d7de0415cc9655f00aa7fea131c43596c7ea51d87c952fe3b233d4b43cd953236635f17336c48828f2442918e26d05c557dc8eeaed50d9540c1847f3b5cc64317b3c0f82cfa6dc3d812cb6aa8484c95cf2f29fc14f7388f7123b40e16162cc7b1ddba56a1ea518d8c045ed7e9e7347029d14cb842d680474cb8506a6ca0452a854fafa53ac2a06a0b57815bdb8a14860622a5b5c0c96157240dce3697818c06028815764ff9b6c3e6aae788e5b76931e481c977076658399772a1d52f208dc4da25804c5a1611359e7cd5c1a0d5af2e357d2c7e9f23d15927a55fd8bc03a6f15c967499f1ae5c39a32be0a8959b52b57983433ee098694055146cb396a184060a6976e1af08e43a8556aca02c4ef0723122b23a841a8c99902e6cf87780819d73fceba5dadc35d2d58b8e4add8704eefce9dde3e250b79f7971c519b7374c0219ef57691d8eed7ce418f9fb31ca1c862d274add93a186fc717cf989de3c3fee7cbf5ebddfa767a351ad9443c18e83c252896d8a10a3572b08be9edb64e5d9bd1ccb45e6a9ac30e0aeb7d1b6f55ae74e0d8eda7bd1ccb495afa51980d3eaa5f86ab1c1a5f403d5bf4ba636c755a5c363ae85f6156f843bd6e6cefe1cc3a1212af701466e5754c289c91737f76af584bdb62d6509327039694eaab0f18cbfd7bf321838924bf583faa77959b99dd0c7b6c4d39ba9d30759c737a6d6c1c77d363fbc853cc43a9c966c575b10a066bde8d95b270e89b9b0096b4271d3efdc9fc926f6c6b776bb807669591af12e6e1384bfd986222b6f10b4efef6a3cee646e0d0f616b3d2c3767a07c3d577fc61c8817b4d07f9b016b8008afaf1e764fd78e7e538cd1324746a8a10f749f1109ea721e62c081cd9e27b4613501fd2486ae67a98de9973b7a51ca04bd8f40695c606805443a1b3e643bf45b1a7884ac15618ffb29082bbd17f15227e0fde9cd5006d068d3adca71f600e652ba7353818e997e0fcf591d3bb2adc7a72440f9c1675651b58b8c1decc62ef0e4bf92d85964aea833bb6cda3bdcdf90eef1e90efa14c75277e6557413570eba8d745781780a299523a7a3f141e90f548bd45687bbeae2692c8eaa6b8a2b3899b98321fd821182db3c0eaed0c289c578fa3629f2ab4c3ffc4fbefb62c5a52514f566929afc0d52d1094aee1742119a74a6a1d3ee3cdb28825e21b9083a676cb2dd9929e83a40021d07f6d2335522f6ee3da1d4b8d4fa4491e44173ba7ce47809be854873e16c2915b49cfb935030432c1bb0bd11283c0cb15e88abf7e1aecf7024d57ebc75e430619ba7ead5e7cc37e4cd58ed559b12f9573971d25f2d18eb8cbce44d206c4aa0872991f07970492d7ecf04f614a21182fa1197874ea3d544c5c34c344e390201dceb05dcdc7e499c709d3f57ccd1aa422053642b44da4673a1f467b4a4609cccf95c5dd09d86502d50b47292fcae6fbf509b624ed054fee0a7ace15eb1778d7a52fa14ac2b1cdf28a5a14938129cb44301460c528f9861245d79238303e256827040c4a013a64936c5e02da7ad212a85c8dfdce6d1191fb729d5c8d1fa358a8de7cce85cd5b740d0580d8a722ae024e00de55e6c235b7d01934f2bcc32f59be5100aea52efc4388dd2660a182a3e55ea46e30b6314d41bac2041c6c21c86fd309f6754f2c051a2b7aba6071a19a0102d0a556e5c14177e0f675a4454357e40f8cc8eb2dd05e411e66a2a1be877ca0600deb8f1c7af9a16b3cef51f130c5fe9964dcd8e721f0008a2948eb313d2f08a0e2a8a203655e07821ddaea15f0f8069a189c042527a19f9749120672ca9d81ebd84458418956f14e209e385c8cda4339316f378eeb5a656c506ab92836ac55697627797fefcaa6f6cda3036b0b52ff9f36bc38ca74049c32c6b7cdfb8a46ca4144bacd649da36fa3ac5112ed754780f3afedd082cb858a1031600b95cd522a9cca631b999dc7947d46112f88d2a3105e2569c75ef6c7772f1bcf389b07b8bba1918b2dc5f7205dab224920e42b4df5081f98e505ffb0adb60b6b1fb84060c679209bc991b1951156c863aeaa872d771825e2f120ed2a73ce8a9c87928132924bfff9b8a5d50dfaa5c1c5a182ef2be0b7bfafb556c91c109f1fca37d1d1166940b70fc1a86a725ec194d9c1136a2f760c7667f7509a6dcd50525df81e39f49180cf44ae4379ab86d1c905d60600218340d17280b56807f20aabbd9221c0b45332cfff461d09a0bafee9b3a702b9e94d7a5938182e3cd1c7f4b353cd816e3ef77e3faa50df223942707b4afdb09e6f1de3942286631db39337f18571e64b7ac58da8ac9530cc5e654e0732a0b8b69c3aa30c9694fb1395a0faedbc45fa60500587926dddb910f76cc015d258c10a56eee149fd089f265f346630611262b4a9fe948355ef21f5ec9ff02e94ed73a0867fc5d1c0abf65ff998a341daa0c94f6bf9da05cc951184254603d9df2678821536782e4545a9c54c14d8a891b7d53a803e849f3a9531c48aa9249f1ccc75b8e95b22e8f69e5f603eef2deeec1f2e7cce15b8da07b828bd04107907b1a71548ec36ea853a7dc139b873cb9a559f7d1d3fc69e3c9bc69f7779c22a99077ffd3c040ef98f78ac7657a3e6da3433016a26ba98604f5e873dfbd30860dd861cd89b1b2d778e1af127c3e5918145ee0b9c9e26d5239bb9c3ab50f82a435c96464c6e18d98b0887157c8368bce954ee86bc8d6dc312a71241907ed270fa9da0c401bce35b5d8727e01ca112af3ae99a3971fc76aa52fbd2ca958e4721ae280a5fa18d64fb16926219b024cdb19b8c5cee64f129d40e1f62266287418786863edfd1ea8300deb2a08adf15800b34c69b6b3d776e886c9c281d9e71a7e8ab3ea20c3bd928b4dc6d49f9527b13062e1ec079a3932d0d94f88e76f154618d44d8a0ad87653b5d394ec52fb15e6de8b11d31e03e4f4eacafbefbfb053956be7add9f8c5d93a4441cda7cf4a3c778f9e4495768b7b2b9ade573d7727f2770c375d4076f636d4bb1ae9bd70fd0bc1b83f02d9ad9b6c457585da189a40a2796e35c453f1f44fa18eb17183c4ae1483eccfd4e63fae28e0ef440cf7b594c40b06757b8b164a642f43c7ed9146b7e70c91d32361894e417c7cbb5861459ed7aa79790b6c405324ec5ea0b67c83b4e3ea5beb76c236f63686b23e54dbc6b96dd61bb2cc6e0cc8f25753ee849be82fab9b8f7b578ea530887e045f8acdb59ef72c71b56716d7f65cfea803a07600829e9eb1054e3d7087b7e1079152bd9e99f40c1ff343ed3e75e550ef82c2a159484d72750bb3350556355e10764531fe44f4f38aeeeb57bcc20bec7eee33944f0b38a520113f3bf0469123d360eab1311a6a81271ad5ecbf65312ffa98abc57e25d0a556983a88bdb34bf0b4f3bbc1e3a4d52399099c22c2ca05a9d72473bb5332a6019d034dc1ca36d63339a120ca925eb559353d9680738af9d8991423fc6abc49385804d16da23bb079c5fbc251a9b29ba0a0196d8c2e027e3ab4ea54ff211d0ab80c0f7df2d25c7b230e6618fda64af8885e4f79bc7edb034ebf095f4a12ff9b1f4d75abe7d6f386cd67627d0524824c7eb4225387c26f49931c13cb53bcbe4acc80e9d3b32cbb73d76593972e90f3080266447374b5598196507c21a28ae3ca4e4ade9deb4ffec2ef9d5bdfd06807cba1d9286219b4047bd6f0b4fabd0a0a7a230fc65306bd37e464533dcf71365b07db8140a7dd3b0a78c371509f19c68cdac94423ab8c011168e43bbbdea778474d1df31fad35d6d608ea56d1b73f2d058cdf8c98ffe197f5b0cdbb4895d9aa56ebf7a327eaca03f1bcba25aabb93b9eed0a44d78d8bdfe7f6caf66867d9e492494e715fc08e04ee804c1425e24ce09b366d60b55be67b0f8ed07a1d80e5bd12ab87ac00e504f1413618e517e7b3478fdbfd34ab239753bfcc24511cfb098dec3d70145d1893cf02e637fb76e376da4284c2a8000a27d1c158d061ad01cdbce9a6148fbe7fc506f737b2408afd1e007bd8c5a5fe3a1d5cdcd9dc9417babab2d18e78066a4221fee9d2909a9d5e3220047f0d11ebdb015bd7f74ed0a44d57d76c9fa662aa8a2f209f5ed9f3f52d3aa4a322a2d610145c387b5b30ff9ae32c94817fa589c67f78d2e3849532db93bff321698ddab50eb55a90ad890842a3c24fdad67d650648837d7beccd3f97b8487545fbd50722f19429de9462d3e4b6a0713d4d37ddb10ed88a303d890271c35d92d98182439ee4810d2cb9c248c8434f63738bd9d811f8005fca1fcf63b1dc86b2a3a29d78720f056e43c4b14f3573558c44396e406c2f8266113ca94a9e2d4c3d6d072d8de79ba7b4ec5c38d0756e3c5377fffbfc0bdae606cd391e9f81db369bfd573a6a43b0f047ed295db3ce5b8b22d6848af43622b5a6c5c1364aa211cd341b3bcdf7ce7567900ed52ae08962cb6027712210352f76b0c27afa3349f59771915bec1cd21394f51905a73fedad8374336dcc384f28b18b8c0c7142beaf1eb8265ea2c195b2ffdfd463dbb944613bc8c2218f54cd35ef9feb20a4604868ea72a1edf4ce607831b70997ce34d4a97cc39c35734cf780b654a75e997331488108cbafec2b7b90b1e37e498899e7abcccd88508008152e9112876d5a64bf766de06c4d91c02e2007cdfc2012d1c38fb64e4f1abf706f6a054154f6ef1c3b1b36644c6eeb75c151bcdb4ac473c3b07ebfaeb93d376d4d5a9c49d6a05e82ed5e62fb32bb03337b4a577732deb356f8a071568e5ef0e5f626dd92d514b17d1c687b0ce7dbe0e0a63460087a16db74e21c53ac9628f3c2b3f7508419f9f0f71160090134778a6688365ff6eb13f104b51aed19994047eaccf57e8869f821d7156f9241df370aab6979dda84d7e00edbac4c8065e51f4478947ee048fb94e056ebda034b0c267999324628868fe0d1939406bd9ae0103bf3116286251e37e686471ba4271c1a9174d6074fd033c226f79b65efc51f87b3c0e89b508781ebaea41b469d3e8dbd90cde559d6fe8df46d7c44f2ad50fdf64a566c91c60cc1409724bad334fdeb9fe628f2a6446dd908239603256ceb05ec7e282fde5d0146a73e9cc85a31e1c032000a80851ebabf7dd7d96896a4dfb1cabdaaa4e99c21acb00350a633ea8676047ce7116edc41abb5f8cae79efbcb9c2187726e4bf9da4ddb93f4e708e568a787cb4317dbf3af185104cf02c6c82b2f716a03de6dfc97b48a5efdfd31a8e4bf4c69a326450b6fafcf9a6a4ca6907ae64ae3d387c82ae67b5cc2e07b56ab9747c2e68baf4269efbc92182117a6eb375b1e7375fd02fb42fcc37e20c3e0740cbb7bb061254cb5bbd9390c98065 -MD = 0a53523921e16516ac76648367b4a285bfce6b711b99e4775c00ec9d15abd092d5db3ddfa3560f3dcf47f44031e91155 - -Len = 45376 -Msg = 7f16b90a18deec135d32c836063cde963fc4e6daa1555476619b2c2cc71016d2e2d8b5557be835fe476e23f4606d8203f6a81b9b42c2141cbca3c4508e1ec63948d04c0ed54bb680ae7464414d29c8c7e527bf4e502b211c49589608dbd9ac3d19c7273c104d9920fa0a3226b5b6d86c73097af9b2d8a2fe6f824a5b968af165be85eee71337036793f935aa7e5ddb7a0715f6a65011c04b95e88852a879bc3a9dd24817c6511edbe20816d59166f9770b14d85c121ea38a2553f7f4f7ee36431f76ddd511e212064d017dafd61959ede6cfcb24e0467243868b3f496c318708ac385628dc3407703daa114135be2463000b7505a2d356fe20580959ef89d611ade15b190f8d249f1bcd7b92979c8162c1937e07400b76445b82fd2d69404be7883993af9236911d4d3063aae2fc9971912e8f32a237fb9c9fd0c2ccc09c1011a708a7f24d7777723d9c6f9200269418d8a3508fb19e0c8f540b013edee64a1770163eea2997fe2451d84a51d76299dffebb6825538ad2a4e2fb618ca96524824d2b01a00ce04dbdf3ae9aef51f8d04f6b3e80fc71417463b1688bbd0b63c4d8a50e981be0988dc58ae40875552f62ef87f43f1df40c1b54291a26d9eb2652a4e088aa638b08e5c27e433beaca517747bba44e8fc233ef00b3d8dbe930f7f76b6561df81f7787e3e3693dc569aa436e06d18545ac5fe17eeb56c52f3c41edab79e61e17c0a2f7fc01c9c92c2ac71c8410716fa87e3b5bca6999c32028ee3250ff24f555cae7711d197250635e8ff55f2ef67e81d069f05b1c531231b768efdfcc9f5e62aca965cf80ff8dfb73698047c8fd3c52415051b96a3f3cf4864668c058c193aed45d587bdecdbc6507e82fd664d2139a5f82f25dd99a9db9040b4fab2a184f9ad097cbba897976309a8066938931beea697654c0f111df2fcf2c06f8b71fecc72fdd31f4276f45de99c6c707bc8878932daefb8b37215ba9263d21219644f5b450922dc12f2b95df843fc39b6532eb54ea9149051245adb5c79320be3e33e4d2d15b019a074b00a3f83feed719ed81804ec1efd718fb4fe621d28837154944a3309c6ff75629f0dc545b9b335104c5a5b8b53269c1beacbab38fba24c2019fc5ecdacb618254f0d937276b4881154245c6efc345930c6e93fb0f48ffbb09508b64aaa65112688b3aff07d17f509b61e0d7d604e31360e01266f5b73066bd01943660834e9cc11a723a9160501603bef78a1c99dab958bba685b7875f6b891d50e0a0d4c277eb490f78389a6367fab3fa5c07d484fb505bd0e5e92be5201a2e41e1f02d553a6371631681d211bccceb89ac3c578a5fe44b1205ff275a2adc9ef7b8b2ff6f6ab63e2db3f1b9f38b06c006193e95536d90f3fa445e1c36f24cf9e2e38dcd897f5009cfcf0cb4716944cbf0216310689ac2f0fa4faa5d03fcd7c983e0c51a3beecd6ec9d6275423cde379e8336e5b426e06dc8276586c39d129786b3f1d57ef3f8ac78c57f61b732f8f544eeda4c8696de8f12366ecec40e5aea0f96ceb291bf814ceb7c2ed7cf81484e5b4aeaafa5600d5d97d8fdc3fd1c0e3bdcee8a2e05a9ef7cebca571eb2b0380a88a04d56380cd4a1fc15faaf934e945394c30f92023aaa0520b8e27f87472ef075f7ed8968239d21ecf54dd8b12c55fae01d4426aff81aaf344db84276cf94c9ca57b1905d2ccfa60d81df877d3fb9f768051131356da741cc92bfafa9cfd15d2ec981b23eafd1f807c096031f0e2914d3825efdbc21ba85938de00d45cf4d744a53453933340ddf83bb5b96c0220b17ca9d13d06b9bb9412e4804a6755770d6c600e56b6644ea23297817868801c8c9f45d19f36a630e3e48cb11c05ff0a24a49d54a91fc66d08ba001b01c9e35c9f2faca56aee2011f44871cf1a42b214b9a7bdc5af2202327e1915e10a02b46755a83ecb348fbfd561b93458a9a0273d38c061cfed8f80258eba3951d5a56ba33c838cc180bdce01a8a154ec6e90c6da2e98f9d1f89ac8bc9727fb0c191481b6d06c0716e3dae32d25ab53d8bdb70972078c168a34e6546e33dccb6e28f28f08adac5e39b279879e8531a1cc3b65779b6034184746f4bbc0e1633b06a9a1fc2f20dec2b8911c33fc33dedf255c3e89cca50baf978348574b3c35ca540fb55180c67df501e42560bcbe0d5c8294a4c87c629d2d099e53cf6380dee9d4cfaf17a42af465a44047a6668047ba52793aac210543110bdc997cb07bc92a176de1c70fbafc852e29d57d70270869137e52bd6129980c1ce29bf7a8698efb7a6f1fd83a02d0e3fe05614e601ed9f95418af74a32c267ebb34ddb8b1f68aeeac479bd3a97f2c0292577da1bcd436eb72dc835a6da958d97547d148739f6763fb8bf831e49c685189b48d0ffce3a9a01e3e80d7371dc9bcd990192f53b08f0c06a0b78b61e70051529111f196d99cc7b4b31a8375f5d38936a207c5d8f67c374c3a5c38a7fbae927b719eef1102aab2c4eed2e7d0be10df3af24fa479cdb9863a9d48e22d26ad9572ea9661021b3e01cd262c7cadf2fc2f45053363cca2c179605e1fe0780497cac7409affd06fd1253c0da99a84211fe9e35f655c38121e714c0143dc0f21f7b2e7281f04029d0eada019bcf9e9c4d69fa475482652983b1e5c0b573d58fb47de510595162f0f410b87bed8f3556acac0f6cb7e3a92a1a1c12ef0cc7cebecf2bda37d8fbeac5302bf5181a01f3d6f66fe68d65a017edaed1a234616234e93a2d14cd4716600f4de39abf694f6385f3598593a7e237d807779d76fb6c8f77bb2a9bbbeec94d3514e2ad58219e0acb6a13f664c5d19254ecb70c9f230c65d01bcb78ea153d38a14acd39ca8b197211254541ea0794afca2739f696216a405c21b7b241049aa9baba4f43ffefe522bdea966c0bb55416a07ea463433dafa782979651a7020728e82b0ed5de952da23982ae81b116385040baa15b8ebf0323ad43125e0659ac3e9364b2f64fc4177bebb53687c37369e410a3d7e75fee8d3b42efd1df454fb272232ee4af3ac5cb343d4ad68729140e5a7a00ef0e9e137677aa617bdf4c2d414d00514c0787e17255960b3588cb41503be49b90d93376e55f4d62b963033b8056939591061f5d34665dbefc929142570eb83a634e065f037c93b9337552c0981542c25bb4e88438f0fc2cd2ad635e4a5b5da60f780016f855e530901c2106b112769f541acb9da77bda1d60e229df51ab3ba73d5c07e2eb72a98d78615853f1d698f5223fb0efa88d5f594e38cb0b9684ba049504040d045c4999954adff083e80e8c6d2b80c364b0f3a743b8312b3e714287be77e0dd6d9a2b1c8ce29e258dd0422cdee72161036bfed0e769438674f73bf661bd819b4bb4b9de082e7d3938179a9d1c7a7d11ac46e89de353ea665ea00d1a25dfd18ec93359a6af386576ab4480a6d0ec7b1b87ca19d3df7e0c1124f320bbb3e4b7000c9e753d29073c220fdf5b11a24602c6bd7efa3d82f392d0ef78dda1b2d41a373f7d746c1fa3ec868b7093a4398ffc5c76ebf1a275b965ebe7b8aa93cbb7e47c8859bef939155bea488090283ecf5023d99767c960d86baa333af05aa696fc170fb8bbac1e6473956d96b964580ee6640f0cc57be9598e55fc8618beea784a50fd25d34f77981ad1233b78223055a6663fd27180bb43b533692588874066b66f7a256ea8ebba3ae492f634286eab7873926fd5a07c9ec88da39eaa7d4f6728bbad42f48123d0ba17e14f563fb91944d1306d57a3d572aeabd179e568c083887dbf03cda0c6e582b239ce442fb9a6f2c9405461506dc851d51c3fa00f3ac2befed8f061cd7dfe7afdc1fc67c0175a6aa3ebaa5a70eda79853ac77453b662db2831e9218d2f0258a40a26027ba7b3d94a758f9aacbfc186b6ca8a93bb4ebcb4d57bc705b76c6619ac20383ede48c58581db0c8b8294322b26a385eea4273a575c1d8139080a8bb92cc0deb1f07f3b29f4c1aa0ee5269cd5593861cbaada3c113089b0121b93d395aa6e72227eb58534f7dbf08b30d17213d30b76e13bc252910752cc474e92ee6da98bbb06b58614452f8c6886f24f5275088f6d95d39a1e55250b3e4f3d822c7fbeaae1b5516b98c8e0558a88b5daae677e569e700eabefbc3e15ae7044dc2e6a3e3eaed4bec0633edec9df16d81df669b8d381f649725754a6f47571111b64abbcc97adb7a4f14256f4bcea7e583bb0a2c98c09f10a7e5ace44a2bb81eda5fb2ceddce4000421c0b066de1c26a967cb76e18d2e100a70b339a6949cbca63702dc8ee2198ed53fb5e58a2a0dce3e0abffd1d6215275ea38772de45812a071566b5f7d1d4c9def22adca8c947dcddcd9521c53447a0cfc0de6133dcf233d7e72f9e70d09e19e9e3257d08e252ba4f5854c8202a4ae1256fc1eeef81773fdd54657e4007fde6bcb9b1b0f29eb4ce5b5204dc776da85428573601585e99b6e205113fb09f7b98211dd35dad25f782cb64ae441224e85f9f214882b898df00aea23bc808c0a097ddb7956c829ea23d663559e83978936c5474fc59555ad28509d2e9019091f34bbb2efec5b9313e66f36e0db0349130e20df95c6e78caf8adbb3d25d28f3bfc1d822b16519a0852673bb6d2844a96472993586fa96810dce18b8cf6234fe54373f955e6f66c4866a706b6b14cc5af61a9ae383df36f550387436765dc16b851b6ea55759d791c038e1b15b1f0eb0605c92541cf32d3c1f709a97578e52ddcad4f1bd2cc2f07aab084447cdb5805c0bbf4c21c2c50dd7b3fcd865f3926dc78dfa45475f1925f1af5f14793356d5a080b8f4b715c33d5ac633da1ccb0886ab5701f5fe6eeb0c9955a3ded01ca1534047e0389e768c5037bebbfc465e4f121bae72703cccb6f8c4368d0fe6f9f39d9dc9bb8442757ecae1160bdb5d2dd4a47b0cc2307cf8eb9f24ba6134284bec292b9ea1644d9319220954a9e3dbaa37c25bea87d3498417541d59c6c81e92e96a7c3f48650a4ff9e9f302fca24c63f6e030d019c52cfeb8bc20bd3448245f79f6021406e3230c8f8740a99a9329db80729c462e8291c95e2bd13d2040e4122c305fc5737b0269488e74a0fa32fe71631de0c50c9802546647a152112ed85b5ecdd7bbf4a932e6b363f191a20e24e61d36b0d55a7209506f8403a49d8e7b8bb0131c7020da2ef56eac69e41881478a2d418eef8ead212dd8659a9d1bcc38239ea4907a7eaa7125c8cc2020c438d0de11e2dd8c2fa5c44d4f70b8b41284b8d398f6d643748683e86047c6c03b915b62498f2f2394086d5f2319f082283457ec2d8e506398faf1cdb3a3c05af52741b752aaf65e7221a6a401d5d47fb357a00ddadf8143526425463164af4977771e3dbbcab585409deaec4a38c7154a6b2b991f6f0b6b477e98d2681ed62438ed6b65f362ff4065e9c4688ac75adb53eb551e69b13163de96e6f2d616e773c01693e0780836087871add941e6124a7654a71e484aa5958e498a47fa0155a0936f320dd83efc55fee2119eee396feb1833bc19499fcaa8dd02ed124242a3432973b07e925bb4b14f978a2a0e15d625c004ee8fdc3532f6516f9a125d7f52c408a0b99324f2e193012e921b202fd782f444c8f27e8f510671cc1b9899fbe6bba79297ec0ea91583ba03a3e2a2cc069b2b7fc5d1bf12b761c4b4dc45866cc1928cb5e5f9bdc2c2fbb0b34a01249ec5d6dc128fbe0c73d890a0b67689a13685d12e872e4cc0f47c73aba9ff07140ca7be9cb96107e507370bbc5d54d588eda5f01382db45a692a483f1743d550f9a2ecad3b0f45fe761554b7df601c9abf6a487d2357784dd41dd95389e7f8b65cbcd8417b5b4267206a5c84c3d07d668e60400c11b7d7ad3767a2fd785500ab515f662ef142aec136bbb1acd7ed17c6e3036e386a167a837951ccc54c539638c0d4befb078c31159f507ab7857f93c1a69cfb88963c08d684237f336eaa6263916409302400746a4571e02b344d985fbf730e84fdf12aaf3f25e2d044220b36ac546f56af681fc80f660b924b20cfa916d0d0b507fd8815929e1e2337823ab9f9ef17f4128ada37e576227334c0e0a693fb69a21d27c91065d85ab4b09496f3617c2a92b42e4bc0afeb4d5756f5725f1f3b00d4a53896a8a019bf0c151ec8ecca42cfb8fd1e1d6a550bb6c519872ddaa0dabdd109f996e62caa75b2cfe977ac1e8a2fef5521f63ec01f8245e53dbb21001ec923af2f72d1efd3a32e47bd4c3c439c71be24fe7f42d66edc5f22e0c13c25504c5101a5d172d2db7209e461efa323c0bfaed27e5f808042ea9c3838ea31f9b76de465225ccfbd0c09ca0d9f07e9a43e3e46c7693e00a7e1d483900ddb0a629d5563456dbbf299ac91f92c3d3c17b05d180e6c87c6c93194c39d90273fcf4a482c56084f95e34c04311fa80438332e67758e279f9de208a3df70a14ebc8698011946169092a8c05c12c3e9bca04805a27c4f617b6b5612564f862c49fa39341044bad7f85b4bdbfc5b6d572d1f5b1f5756d883e1d92a39f53c6797e1a2ef05bdd63ab34e98d4872b35a55a1e5b7663cd2ab1f39a8e6863c7cd994bde5cb1f550f74e125cf049ab32c8f45a59fca0b94e21631b6e33187a152ba6b108cf86eb10ce7f5ce80cb42f593be1bfa4abe2092063756224704065277d163026a476d0478454f9bb941cfae8b6f5f1c810433b8c176f2f86ecea0c45ec6f2f0283898a3b4056519d2f8af62763b6588dd2cb38da66daec5a501d57b7a03b186212c802342b0bcc5685050a5e68ae5cba9982e652773c006943e22ec4c001520ffc3a207c6dfdd3ad3f951ed4ed6566190f712e3c7320d37b6e4079b6744a45d1e7e7cd5a2db4cc6b05421bd21b62dc70da9ff8df810bcd58793f20d3e69d596f7cd8ef1593b721587e15e7a0192d2888a2142d84ca8756c70be70b643b82f6b362146ff6c98e383c53156b86104eb02910d9b373751bd691cc4123b09e81846341a33645f4c17bdf2c4b8fcc284dde1acbf574f4ab50b57e66544e0135236b48c38e2b4a3fd85009afbd3cb988b319257c70574f94ac5b567e28759d28ef132a8edc354cd05c2181877558965908c810cb5343cb57b930e1bfc681cda06ee5d14a953e95cfd555105a7bccabc2d255a45fa522b11dff9de7ce3558d9c5264704a0c22d6b65c9547ed1d58140ec9b27a9e16edb490d05082f567de409bea1a28d376aea17bac28693938d5e9dffeaa6e7f8b656db5053da82fda70ba5b4675f32b9955ce0f547531649ab4a0a22483a264d867baf0d717ca86bbab7f4cefee4bccb4b6d103ee123d19a352fce7d3c4b2d88e5320d6de8546949becf3f35f09bf2179504eebf165e8a2f35f432394e41c550dc633c983ecc8d3fbc3bce10c5ea9e457a09c19d716c0aafb2817e7e0684b64d72f685b5fe4bdbf4bae3e988033b86fd0365d20377b519c3b5befa73ed7cc828afd330ecad381c11c3afd8c534f573e637fe6917b2a27e134593ed418a92c2899be28567d5fd183ddc87e2eedf802ea81ebdcd01a99903466ae8a10f652c6e173f0ccb4bfd0197210f53512b8d447cecc08a48eae4036e042ca55c0607b4927ba2374cc3aeac616563fb6ba6c5a9285a264e20faec4988f794b2674ef790f75dcc4c4ef46f663db0e16779840f17f89957ef9e5848d119c5a9f70a0ebd2a6563c6341a09c897f5aa8f7fc2f0f3f6b6525b570a2d8005e916745c8c6fe2e8a43897d5f82841a74ffc772c9010faae282c3b6caca01d4cbf93fbca3798ed347b8247192f7a63ff144ea154290caba717d0fe18cbdaa60d65e3482751b16675b3eadfe70926b5050c4713e0d60d8f494ae5ac42b102a3b2a1af635d23e4d61214176626cc54c022fe90d7b9df3b2cfd8b144ed2a4419ca23c9f5252f557c47566b2e4c0c12e0abeb3d1f5c58cbd0d29a005eaafedbf1a45fe5a1ff00f32b8057162629c30d91d42f4b173ee25bcb737525f8bc3d4a3a403ae89d21db89e3a -MD = 9d7af269d49bab3b400d2b66254fcabe81cee8bd8d0d2b44c3393bebcd776402746773318ad6509fac19c1a538491094 - -Len = 46168 -Msg = aaf94b876975eaad2ad5223b24420b374cae59d2265cd604dba310708def4e8de708c907f897196341e6eee30ce700a90078491ef3e57195ffae8a2cd88bfdf35caec4516c48daa3fb4ef025647d6216019c6917f90192d559566fe7679d8cfa3372a42b6e9015b47f9792cbd40d18c776a22385e1b8210a12222769e12ce3e791dcd25ea678b2dff6483b9b039d0a048813de2f5212067d519b1a7aef41ea05a075b4b2bb079a6c88ea525f9a3820155f7501def51829763f47b0e239e3899b88c4b3ee5646b3a35c0441dd40e342412253f65a72d1733c04b05268661aa8f0715238dc1e3be6cb9b1e6fde9ea858d1fa32246b7046ca19c75e66d61eee2f4d82a5a942bcf01c2e6cc144295c8e4a0d0e9cf3d9977d1853b0d856f20b6806fae3476fe9d76d3b12f8732888219d003d8718cb6b90804333e9a68885d38f153fbdc0f39918b82cc067bf83c195de62a98c2f14ea03573401975066561e6c456438969c1926dbd880e02abd9d615859994667361f9708d405e55e562f95057cb07b53d133abde269a8b3e3ee42d14cb54dc4b99cff59d0a87f959c2d6df64a36caf7efcad4cc7fd5591826f5ea018a2237760a6c5c51dbdcefbc91114a591a3e1fba08450b3a047fa1a7eb6d2636ec44e3f30c3c8ae91d7231434abb18f9262548840d1e48871ebd14dbb7c0a1e1e1b1d5b42599f58003fce6b24f8754471ca107de64b317240d12253c02acc782e8dd7f41ed1136c72dd172a2060286d36c25c031b5afe1a17e135541526e119a804c6314d91ec92f0994576b14b91b1e7317f4265661528fd03517743da11aa9367303b5603f271805ba27a5d2179b98e01c2614fd73c43fb1fc0e4d1ac23d3f89e5e39c18eecb22d0b745baf4aa82d32196d895e153c13171dc8c44706e13bde9098541799a4fcfc9104442c2ee6b4dc61c8e11c88dd415be5b23f2e4f118b4d2726b4de8ee0f8f7d59a5b5e35fbf693c11a921098e675cf5fc67c0def7c6a4e4a4f80a1d4694e25c07ec8ccc8ae9c5f21adc3c2ae21567a744ba46c4eea81e7e15ce1e5d307a58e38f7b4fe4dc84e4869c79dbb30548d640a8bded3d4237822d595fe34f381a53b264e477d2e12b35781b148828848c2950acc53cbe9eef6070c4200159ca1f73373cca8d0d151749351b3eb9f1cc59c165d572adbf514a39d6fab0e11362d437e05b6007fa0503805c214ae9b5693c3eee9748c8c605e28ece61851af29ee3025c657761301d6a8b3ba1ebafd9d79e025986aa16592912dfc5ad0f077ddac672f9df633135eaa6ca72217374d58409bc4518390eef37859d6b11c14f1bb2f90a471da5e071e952be9e3484d14f1b09bd1fb0582afecda5581d544e5a6293e528d2c4c2077a95f8d7fe3f922d8cf91895780399e31e37ec805ac908a1d90a355f1b594a1ec67d03c730c72e1245aab0c5bc7670dfb412d5b6b20472cde592442d8f4fa08eec0afddcd45fab07dfac6cde7b8d7f6956fafb6ba18b3f272ea8ac14ad1c67e031cc61b9375dab76d17a973023bd08288d3cc80fa7b1a0560ad9c7950343f2ab5e3db9bcf865b207b191da7b5389cd95bd74c623333c58c30082413f105ae358b7db708885fc3103068ea110797812296e2f6036e27fcb06b65e836362c5bc60d522208c7e85ab1126cd8580040c886c25b930cb33f0799982bb28b25918e06c4cae44393096a2bab8eae25a81cb82c66aceb2408632d6e3fc248bac91d8f1c374ec463f4aa39a68334361f08119b3c0a3cc6f4777bb758e892726a27b6a531ef448b0df2b3104920c836ef2708b7e03673ec23076fed7e1c03fa4349451a6d721601eb960c373c0cb0773c0dea563e73b9255ac0271709627da7ef36b334f74a2aeea5e79ef6a8cf56c1afc39dbe7e48763841ab8c7d2043684013f6e63cf8feea1ae3ed4f95b5ef20dcf0500b37c93e12ee7fcf8467ec462c8e5a92c8799717bd4d4cb1085b8af6788fa6bc1a0b47dcf50fbd35f81c94f3315969114035fd1c0a4e883ab292506cc5a37910b4801faa8863a2e3d1e541d2df68eb7b35b651953be6409133802ed76ee11353c0e07a3031b1d7e3f50a1b6c9f8586d89146bc0bb7dd1cbc756d4dc1dd0e198d26717ff759c3033d4ed34948d776e2313b2b6605e6fbc3c55ea3d4b179f536c6ce7c5786695fcff7c387f4eef104a88d1bad760b3007deb3d869ec30aa5d1007a0482965c74ee31b3b7043e753f780f5191615a5fdcb148fca06bdc5d80d4f57841f1e1ddd57e6b0a0d45fba671711701dac6a5cb50d0e601bc36ef86bce9cbf62475e35124481bfd9fc6fef932c04060fb99eb7c096732eb5e82851cb689f4622091035cddc5b4fce309c0f41fd00bfd783d83f862eec027fbd125961a3fff4acad5ca578e61d6867b80ea1d853aea45d53417a709c21e361895597934764d1e87b6b0e7a2b6e128cdbec2dc0f6b6bc8a7001f2e4aab9d943961893ca1b78e6bebb65f83b73f75625e25e3b60aebf1044243f2f4b1e5dec0d2a84d66fe8e03a17b472e923855f3b1a158e54224371a674b523b70ec1b425a78ec1e7e87647d5d9afb86b9a2b4fca53bca1ff6d7c7688036cd614935b678bfa0af64e9f8d53c0eef46205082b6f0ab81fc2c5aa2273bed79180ce44b41d26ece54b94faf5ac023ccb9640d54e66033286172d3ffd134eda6c486b88937fff6669e9406375fba3ad7c7ca2695cddbda738c8bf95d5fb42f2445775c6c2341d51dcf8da41d7e8ac284e3eb52c1d7b41017efe031472d6a10963d5746807e58993879febfce11a24948b01018759e99626a0e182249c4a74060fe9eed52b3a4916b207fafc5c3a13db79f00de0d7cec400e698c32e1affc2d191bb6d75f6da67c0a5588fa80fef82e4603061a060d3d475974c4e98b59f9352317478b02f6eea7ba7b9326ac4e277978aec8530bca0cd6ffd24accc35cff071363c98eea09ddb2e01526ca941bbfddc3e4a02f6b3dcb7d55e4964306239df16ea3a53970f1041c1fc4cc4ce4f21199bc3725e5c0c2f9a8f03e2fe2e03856b2993973413456f241bdecfc33fb6bcd5bc628d24c991437f843418032de25b99927a7ac0ca0a618d26ef02ef653e35382763c3d9a508bd6d9e3913fa95c5617339e70c8125258e82c9790ed3a8af344ac50e3b07573a486dc459fa6bcd754200062175fe8a609f0eecc21bf471d060147caa1e3549ef8a86deddf5de3fbaa448e272dcbf62813c36771350dc266a629d358193ece2ef2bc0d50d2edc525b3054b320694d16510c0453b4d5123145e1eed9d9c3b38a01d4238f31caec6e228d2b6374462f0c98b87f66edd31ef829860d4efbd612a9ef2db8f591f497fbd563d5d8b698edae1ee7af99067289e5def9047e2ff391a77fdd86ef75d264613d5c5bfc2e8a1063aa429dd546d9d95e2be1db4fbd42b9ed7a8d9566248cdb09221ec4b524411f9206715000f73199cddae798abecec11e1a7e4ee40e74b84594c5118eddfe8a2a5f81bd0035fa14e99b1b24579051922ecd08b98670637e8ba829e608ba8a5210349e826c7c652822a79ebe9a150f07277bb299bc1c9778e958eada377c7a02514c1825933766bbce8f9398d0a159a8be8316700387734fe503625e99984033540278e712eb615853bfb45389e9c3ff5a8faedceb35a95c15543ae3ad926f3daef45b777a2cd78648b45b6f2442c053620de620d19b8c35e0a7cf29f1ff79a9b89e1a2727604bbe140a135c3e40f17d8b7a56ec654dae55dd9ab961f533d200076c4fa6a92a30784c2d56ab4678b9b63d416ba004b082447299645c35d41ad911eb66568def283d679a9fcccb3e9ba5de1fbeec3e68aa8a36106a592254b67d7ea7e8b724238585ecee79414b1719b50451ab2170da798f9ebc35e9493a3795940e61693a6bfada42755d992496a67c3683bac05a8a81cd22e9519d19090099f89b4abd0f2cdab31edbd7450641e453fb22887949fd55eb492447e52025b40322eb1f4330eab798c89e50c56e8d35e4b8ba8e9cdda76832a7f97341ed34d459995a599c3e2a1413d61954aaabfd2d96f5b827bb642d3b6b95d58e43de9ac415c2858428856f628cddf97d656cf63df338a7fe45abd341deb944d35b82ec05b044e91968b53f458c36ab2576202cd98208067ccbe34e0e0478c3fd09688d3bc186e1a3dd3bfe1f9a769ad75d43e5a2bbda502ddec90202855aef55cdfe12b8b20f2b9e068840632024651d9b66d50c1926217bdebb73c1d9e6039829b2011f1a54137275388ab2c5b68662b0f76f881281d7014c3937ce6a90bd1ead32dcd162ec35bb99bb5180f3a37b412e8419a94063fd38b7d0b27acfe18863b8ff0a72143e0ef3f48f19402271b023748b67e21b53109c91f06879626ed201dd551e73a6c00b9606326682dab7c194237bdeb51bb5ada77b46ee2cda8f4673aaf38d48b328b83c5f33bddb94dc2c2dabe3e2b4ca2210d3d412a81780c942337248db7391ce91315001839ce9655c3a7e3218439f1f06cc2d022acc0db341bbf3c38d86fb38231f993a5c4930d9ee453b04e3f40312ebdaf683eabcd9c3e187800217f537dbfa719b2cac8313a03ef832dada38be942c9ab1266c5c6d719e20a7730f40d04063c1c686f8bd0a5edaae16127fa3fa196585fd58243d3152d411eaa4e7ec6d0c0b7abba7c5696d7c5df1554a28a87e2913273b97a6d1edce2fd5c9f6167a66756e16db2d971ae57f154c70e079d89329b1e8ec6368bccb7a0dd6b6052f5d4532e820b576e243eaddbd29e983f796d1c1ce558059ee5082bcfaaf4f50a71791cb2622cb123b76f62e92042f931665c257c4f7b7d9bc3f8c2d72c9e647023bc48494879c9e17168fd85085c39c4ae7ed724249c36136cc403202b12b76b52c6615afd99a68e9c520616509461e298fab97a2c6639f0299576126ff7f6e547beef4f4a3550147e540504c19177726bf853e72f7e8d184293a416bff627c54bcd788ff5f5d0595f9783b623fc865b70a22ed4f48f3a75ffe51492e5b754f3a41b8682c6802d47894208963e7c9387ef1ed1a7443f49eda7b44ef0a7e184569acfa090877f6fc5437e1a0bd9baa8dd2f94c4cae736c16a8427db96ce1cc0d877124f21fe999fbad473437dbe5dcc457a2d90a3a51daad3dc6742ee22120f60810b199df477c41085480a54b30e08a71610bc9c469c0d10f89b0b5e6a6879d702e3896c32c1e6ae9e26f7f9817563eb4c67d01b915af10820ecbf5070c9062340c124f67d1e0d7c673493d2f039e5fa6457558a4f005ea59c82e52bfadbbf2d84ce74a4a0364262279b6548c70396baa60ad25048355cceb3840557d146abdd153100dc61b28c482882f6c4d07a7f145aa8cfd544a2f46bae1aa83cbdb3d21c3d1350078a3af416b012ccacd147a7f0c758d4810bef2d65d56e554285ca3dd0429ced8ee17581b4087271699311163736436abc64c310a270a594d1f332f3e26df35ed72f0c3b0a78cc6d64de81d5cfef9118ee19c6a30bc7eaed51cd94fc3b06412b4c3ba62a0147454604793feba23a69677ff0a1f0882263e92adc9761c155addd54cfec577fbf0786b02ef260975ff3ded7b2fcff02c8380fc4e8e4295ea160fb56b186c96d263ab4d2c3423d95a559055e277ed65f0292e787b9225cf934820dbcaa1b88b4c50559d101d9898656c0647d16d07f891899fadc16fa037a543a9bed82539d3ae491fc15b05c4c51b852849a489a02665274cf29c81425c84ab02e5101d80fe9cb06250698768ede1437ec1f868365e0f74cefd79817cacd5e0d4d50ef4fe6a8c18b5d0c80cd5815b19724729633b2de5148e04f4bacfa70d779815213632b5e0f482a8f3209b1ded999b5fd4053f147a6912cf8ac7abe99ff1b51bf36bae5f5fe6617f774d3a221d26526264e8b28053f4e5a39822a1d301c1c45ff20fc1c54d40da9ac0fd332c6e524ff57868261ff64a8f37c9463201e77a3e57a99d2d863d9646a16cbb069b55afec9f7b2e1a31d5dc77e28abcece4958d9ba9969e4220a5794e19d6f124fd6791a0a6e984ff74771d283a58f122f9a06e64bc257d9013194c496aac5a3ed1189a14d2301756365e9f18b5a08d84bf9cbf1205e2d597ec0d91d12a393084a4fd4ba1780b4faf25f0d4e1db1dec82b4fed22c2d6b10ea09f6ec7dcf2a2ec6e76a08ef2ec7b88a91d250ec111d889d682b5a2b890ac9d6fb79be97cfdbaf56270364565cf1cc49288795cffe2c0c4547c6b998af6e5b1f3eea8ac7b2ea2cb2d23de06f9926058b486515e608d5c20ae23572fc16f26f0352ddc3760ec2417d779e0f9349b0fec1700f43c6b787546eb61c18ae46235023c5d81b3b39e068169598347a153f127c4dfab1fa90cd2dd131df0d57b39db901064dd47fdae11b0eaaa1018c522cdb2c209be2fa0b13d8e2f3f2d360f5be042ba2c381cc4830d4d6256cf932a716d3419687593dad07c0145aec0d527300cbf419bdc599385c2ffda4408e157a69756d2e31774dfcf58dd6054f1db4b2027b0ad9b1027ef1cf86f585c0329d42b14c0f461eef9351899cb851808700393f8bc07131bae62b07645e78607942a66ac1987cc404b66110772bee24cbbd8f1488c56ea461573a905288caa5e4ae0c1260a940b5691fa24697b129a06e551a2dfc7a20ad985ab6f6dc051b04e727ea24c3a210678f477b8898d8a297e15f70e8516f35a1c25906a76b63d8020358c73e45239a5ee9c67342d512c75fc74509e022152c2561eac03e7b258031cba939bb7f9e1d0ffb051021e6e0267c82ae6b81d8fc62ad19787a08a5bab1f892a1b828dd8236ff458be89248d14e7295e41c69f09587ad3b9a7ab255a3dbdb1acaa902e96066a15be3531065668de6939e72e51360f9aa5ab968a815617c6da69ca2d61dc92a9aa073e628e700832cee2625af8bff3738f96dca766f83f204d8802c1ef52d014fb5e61848284fccda1813ab05f4b0cebd8a2ff689ce8bfb55232dab4a19fc79450e927ffab394a952940f59a4d8363ebcaf68937eacd9f6b308fdb6e3d6c800ff0d0173cd138fc74b0451d7e890eff5cabbb027b1950e52c31c68c588b60016e243cbaa1bc291a517cb839c6dc96e824c418f09bf1189bdf9b0076d85524549a3455969733b2aa13d6c2d2d90ec0272d5d36dd013acec86cb7641f57615f817a68423587007eb6a4068b6f1fe736c35dbe3d5014bc1975bacd1b113e78ba8ef5072c1fd7e93345eb543a98002fa0c49e2e54d23c3fa2a9b3254cd4f362dd85f55b3adaf1b77a60d008f7d6e4ada533d7f7a3eae18a106c3e0620eee0e76f6d61aa95f03b32fa0e3b69ecaf332aee17f05f53206b660cc643babfe96bcf194f203d64e91f215c5714c03ead556e2378d0af8cfc439b3ec0ab87504dfee182321c5cd04b034d474343551858b341eb5e612e7507cff14d615cb6fba000e6521e3c4f01a0517f64dbb170a037b36beed28a2637c87830e2b23f8eea6cd9a7331c685d1e6f707d5b264459fed2beb3d5db33ddf9c7a61fa4b93c594238f0e9cb3288cf4f41c80fd32ce5575bb13de24882449ce48dc2873c803c5d2e8daf77c26b85edbe9dc1ff74f67db4df5d96c0eecea6ab20a13230510f25e4d4f27d18c1cc45ff900bc314e78bf2b6b15d331570c73f52d48b60e28c6ce1345cefc293705fb14df0133615d4f42ea6fa397aa97575f8d929d4b26595a15695ef0ce7b1762bb11f043e82cbe23717cce17ad544a6e1ba874603928013b66e51b5d2523a7c382ebcf4130ffeba5e976f8fa7abadab126ba653a067fdaeb10fafd5c86cf6298f0e6de91b4675047095d82b4863ad2b10f47c7a3499a20f9c23f677779dac26373b7a0bdc8dfa6776f850dee5670ccfe43e52e1469038de7e916fc5654e261a389b2b81e04d538b77aa1dd0071e923e95306fb05eb386c2604162e41ce52aae9b18c774afef49197b92872835f006202bb11d10046c5664491b16ff24cc818a6799980bcfd9a4b98b98d80ff845321fafaba229c1236e6c4107d53c0369f355a405e46fca752c12ada456acd785dce1280547221c3e978151ede5c3432647b75a46f4c7282aa9cdeb9e4b285a18cd0e9ea754239e26994b7fb58fbd6b6a -MD = a4d92c826cfae13d7a80653023254365415825a6fa9810dba593ec73f6560e0bc87fa9e5eef2e23076ad5214605be3d9 - -Len = 46960 -Msg = 44abc5349f6d499111b5d019672f2de1accb5c8b4959c0787155b03abc04324812c006f6cb8fe7a414fb0d35951ef6c351fd6690cd17ad40743d28463aa30a9d80385cb8373343bb49ee82eb34f83f63f8660a0a34691bc18c26dbe14dc1a7e454bbd0622c7fe640763736248ee4912b6bae4fdfc778946380b8d2f13f868f8757f369dcf09b5799647e31c6e90b7382717e3ef8ce6c9f8e1a9c145f56194cec51852f0ecbb01e30db6a7cba8e956dd0d17edd3d916dc5aa207aa914dba3667d0a1c2ae107e6c46ba3a31ee9c5a9077e5455369657a18c1f5bf99af7154b63a0495e633beb64d0b483d21f3ad66fcaf2c2ab51ec6a337f5693c2eeef4e3acdbfd8f3e106be53ca72449f889408103d95e32a3425104923b5907dade6cc972b417d84ac28c9da3a0caeb160e1a4b4e9cf7e78e92b920c02a519d1e0c3d98b068e01b9cd8b5422a9ec89b1af08f28254095d3d78e438a3a38ff8668e6ebb3ee50e2b394b15a6539f799d467df13aa308a94622e73a49368ed9f3e5bfcebad75029c5ad2eb00994a21bb219d384c43f8d1902ce40140fef4cedd3f67bcd207fcf4795bc7f43c30d3c3a8fd1b8a9d77d69bf59eb8b59d0f464315f40cb52335debd0650f45b51de7f43efd173548bd852605121ecef3d56d5e0f616cb6463d9a2b2cfb4d88f05f4a5290c4935149bc804b52f71113c96683c3ee9f21458f845d18c31f1f50dbd15ddf96acec14941d96610dce6c61c3ca5d1935e3087f1651cf38fd9b2da65ebb4922b97dcb861128eeefa060d6c1c94b25eb4ef3c96cc3eb171643361e91616435a461fed7b0a924b17d7275f839c32f00bea0970b147f9c5f37fbb79b1acc154aebf7f8b999425b0694ebd57ad499bf181c9399768030aacc258fe74b488716b081e1331849c51316bb734703973443958c8fc0b3b7bf5e8867658ed7237baf8eee89779dc91b95087a72943b8c7a039f97fcd36ac11500bb85e774e6b38e280cb8558cf0202a2905595084ccba54465cc3429b42a718d88c077b602101a9c85469af39b856dc1635e175df5b29aa56f79bc9e0e470b22d24768b1b2f14b5d88b88fe479d7418a6bf994a6d93e2657996a4fa69f824ca49ab5a7e6ebaf498a0dc9eaa7f4981c51fcc0935f619ec6bf862683b0025cc48724839bc1e67aa3c686d321ba66185cdca83ba9f41984fa61b826ef56b136e13f1239dadf6e03d877866ccb887908917ef0d33f117b614fd291e3e91736b15150e650db9bdcdb56317f0f5ebe97c938bd691fc91401b42576c606175e0d5c635103612483ad51bb78f33331c93cdae11c6389ee98470e19e2a6e5e0b7af88b5b41bd33c236a1766b265611b14e2cdf91092aa05fab5dfab9ac70bdba097d6b6fe723f88f79d9ce6625811413e24130f3e58e8a5d7c8993903a8f07e9540b6f5a4b8fe917cb242b92d4dec6aa17b3a81fa38ce54ac09db70b1bf2c302244b9d02b52a8fc2f42a96d67a92aedeb52a4ffe8a4e388e3f406b1299c3796c41e5ff506c1c71f9bb94161a60c8541883502e76e4f90b91c11bb98dfa27b18f73809d2cba8c1722ea0ab446cfa641be4aca4c70f7b8e7ba0ed6a8648748f4d382c47d7fe5a20aa7473377430d54fc3ad243b2d50db15273ed18407f884ec9a0355ba92f3688d1ee9bb867f762fb0df2e361668b6c0cd62428898ac64561b95e55ea2926f563f461ad408c4b18c3fd5045cc727c5cf2fb3385d28d2205a74b75aa1c034a6a5efc664774ef2776d353babf2ddd8e278b4809cd9b5279124b074dfc964185dd9e70672ffc9774c354979a1b2cb0ab14fe450ec78bdfb5b273754e1303ebbe954ed8cb2e7f8c18486d52571f70f2ba6a747aaa3d4b3ebc2e481ee1b70907dddb94bdfa0ca6d7fd4d470b5994a2aba372147046f5837778cef1896caf509fc9f798a55c91187f0919094a084169e44e7407ae48b9da90cfd9963e59c481ba6c31831b59857d8c26f6dc97ccf06ea4a3b774bc1a4ff893ab9961c60ebe4461add07da459af7f073b2ae87b0d6759f38a858423227f8687f35478a8f565409b741eadcac4d8c4f730fe547d336fd1d9eb245e6aca132c758f53036c74801e70a9613c1402c8f464edba4926a6d07e5faedd2c1979d1916466de2b9bf5d985e835e2520a7b47b85659a6eefcce52098cbbf813b996835e5c623c17bcdf361e0cfee91535971db8d65e0a6c8914bd1a69fabd3dd18bef3a666ab7f1579a6091e3edbeb01cbf119bebe32dea55ded858fc5374d2e9bfdece886795def48e1f8575eaa8494859ed099ed15891e6956c6c4faf64f9899a17c2cc3f1f081c233aa3cbdef0093fcf77acf60ed389c6a241fd6af4d6db3a8464bd3adb9d9756c17b92ecafdf178b877829fb83e6f97d6b1fb4530c12a083e58b67d92357b32bd0a8fae047bb9cb3ebb72bb518d909915ace3914dd606fed255569b1ff948222b88a85b08cccbf4061fe582db6f3e38cd61533b5510870ffac8a6bca589e2fc3e1e9d963685ca9b95313586a437dacf646be4b3c4f51cd41e3f2142d14bbe096b38d9e01c2b181a628bfd474a8bf8f55148f28b3be85ab3b30540de11d34be24973d7d938114709048ca7454ce01b233a751732188ea3576fc7afdee5951f0f4f3c31d208fcd9efe1bfcdf119c8b3d1767cbd38f94c89079b02a8d5db2599e8e30e528b0d3243278091dbeb3f9a4598abcc7f104ca69e7ccb22d65350f96f27bb76c434c356154867af4b843cf962e130e0b7488121460f86c4b2c7e574e1242ef1f18fa9dcb2eb1d64a76c705a7e33ac561052354102384444b8b4074ca266b3fc84fc4f3abe58085e79f4a8320a087498f4cde78a659f8a4f729844d52577f112d90b21f49a47cef93dcd131498f83035df0c0661e2addf315af51ca2dcc05cc1882cb0aed912b7c16d566f769d5b559959ad207c0bdb9996ec4b0d3a5af85d74fcd179adfd41795373110bdc99da5b4fdf11b41d33b17feca11a8500025879c9a1a9eb86696c8a0bf99d86bb20ddc7d5f9ea3fda1cb7c8af13d412987589482c311694dccffc50777b4c4e96a4de11a81487224709672a5aaf18347827033f190597f3f57369630242bdf1f39863cf52b98919c89c480b7bed577903994ed51cb9be8785064c38591a52ef569e076742735074f347c2f28f69024edf3ed490b3a7eaddeffb0d46c85cbbb54418216013cc9dc23b9e6056018cb9346faa3cf85a6abd55bab43524fc7458d220895a40331f918025f2b8cc7ec2dca8494dd0728d6c968d69d44c59520baac490740a9e2cf6fc4d36f734cc53c5fd38d0ac37a5c94816f361edcb3a658d221af86acac05ded3e87e31e5ccc3ce08b64ba47faf8aa67bf0657433a6ea3736f33ecc0035d626cc8aeaedaa94276bd179a5a9362e18d55ef64ae77025c9858e2adc2365ccbc6e03b401ebe92c5bdb62268263138070e9d286cdc1bcb9ab0981cf73d103fa1f80206daa72cb1dc5e662c4cc183b2cf8aa81aad6483ee8f88cb8e8ea1f01466722cabecdcc78edcf547a5c6a11d9ba1ae010694dc61f3d18d6db8029558839fd1da9ad533f1727e0ec51f5449613b33d522acc1a81863d73af919c18bbbf59473866452214d1505f77909742ee119ec8c975d926c29c7271df82469f99cf31ae3da98b2393cdf2b6bede4a4c63fc03250d999a57d088637b2d5785a636df469bf219893e0334944c86e4174a3bfc6abbe63f1796f57398f762b86215db182274215f465cae2dbf899a490524bf385cf21c0f57cc77859a4f464ce3d4d0a24ca29023ca63dae1fad5c1b61dc237d9603276b062df9fe5f0e9a1bc13cb5da44c8e080c1e3dd077cd98c2d3660ceb06ffe3bdcb40b9b5bc222f3baff7e3ca46ab9f50c249d0d818c03a6647e8eb22e8c06db907fa400131b987dcce99025eb2f03c32ee530639ec5c2375bbab4526a72b39320d965eca6d3c5b4bc10011620da3cf743845c53d1a28bcb7d6b8043d6ac8adf0841ffa5a983312512f34f91e824cbfdf4726f72acbad6bf341160eb0592032ba159afbf7d92614b6c13ea0da3674743bc4fe8349267199f3a3cd4dc79eba315a68114bea589ec9421e25f0de54a2565056d551e254feaf7da5e6a7c95e1e1096248bd17b3e2399bceef1d071025fcde5a6b4493d7cdc135aef680600c4d53937f11175f1b33beceedbaa27dd683241c45ba253a1c7912f52285b51b2f566120579aa1f96de702a9e8b59df68b0a31ab31ea857585da76a2cf8c770281c5905c7615eb7b0e849bb95a606df5bff3ac07b97cd3da865a62bb209b54aaa5f37784754352588f84e079bd5b70ffe80809be46d19edda0714dcaa002cc97fe687d54bf838516637087778c076579858fc13b549944f356d7be4dd8835d4f1dad1839cf56e2491cdfe71f30e4a9f73b23791b8d2474c03bc62ab1347d75346639eea02f4e08453e1b85ed5673ccfd5b4b77bb3b139ca8a1f529913e51a2fc7a87472449d945af29bbfa7e67552cf0786063b6f8d72b214bcd216a70b064ebcd2de832c97948fb7249ab2eedd96875151ac37b40ffbede7bb6a8a9561a4996d086185808be809eaa4d1e9b54a10e0fa3d2fd949dfdb624b45a25da68efbf8217387e0092096b2d342edb30262c7c04c711988f8a41af88a8203f7a23b1354223bd7fc8fffa871ba2775779fcdc3118d16f1ab8706c199eb9914c0510ff593b687d942dacf252de67bf19f52340cb9065340acbfafd72cb5b25d217bb3a89f267f1618b13916d0a065ea92e43faba2ff518df26844649831f76780e7ce345eba4d15e7dde58241300de7b81d95a7b2bf3760e54a7071c7a78eb9465e09a2bab9165e18277a7168de9c7079c4df08d3902e41ed2cd904a05e9fdcdca80cf99a6d057a1154a1ec2df23a0d3da3c4d6ecb85eb972d827280ba05356a88d7e41e51c3ff03c2f01f978b30e476c80ed1ae480ee4fdc1403e2f0b3d1b114d50783850fef48007f43a3316a41a56e2401dca530078c93a9153c37e04274874750c6618e3b0bc40b0eef405ffab0ab57a9221610d0f7ff5f043dc96fce2869ac011261e04bc0f29c0be78dda62ee8ce08df61f68721889fd78ed8ca89c5421ccc26f6d4f48eff1fae1920123a1e97789545fa87f1477974d1b5569d3d580196f39e66d215a2129ed39f88281de29d518a766999edf9d9315927c4837a035b85d117e499fa8dc023dbb22f93e42340f562d11da0dfb11e31e886b121d26f9665df040e9115babe4b10e174fa0f4948b0b8f6a54148f5bf130a328adcd8f578b397f3236bf9a133713dbdf6af01cd1b3ff7479edfbc30423138bbd038f02d48fb7655e16f08e9e6329c9833475e471eef985458e09c093e38ee931fbaba7fadba04acc72ee5fd3d0bc810a947972fea3c36ad62087ae90986a658d7c68a750d5bbd88333ff343ae693aa7c7142ee003c23ca3489bdb583a96fa6d870102a5ee6d2b58b3f6c355c0e78ede2b51981fd20e24d68b3f3fbf58065551abee957ad76ab89ec807d8cc0ae31f2434746537fb7c89c798471ab6e8414195c4e3c57c4ee10fdaedd795eef308760a70f118b0d699c5f6fe67eeb741d449ba50850522bb4c7b8da3daad66ffa42e016f5c251309e283d52c064e391b3bc83fdd46f6f6b329863788a5619ca762a1999e1a0cf6ebe32df2bf969bd4cae45786c9adfd60bcf4da68eabc652870a06b437bbf42a523183ed017bd69e2d77a722fb42e9b093f2ac28268842a72f20a058f96b068d615fe30edd2df3b0bd74aa2ab1b4d5258c057f9247091140491fbeaee5d91e1e25b119eac6f7071b830e153897d8eb5c7d6f8c8bfa167d465d6f295d06ee8405258def2ac4c15c0708adb2f3b396737eee989cbc4697cce1f478a90e61907f6be95c2b76df73389bd2ba47040fd7b4b267e876cd3374473895a1066900a85978fa87967520f6e4ff6b9b9d12b381f72171c7e465c9953674c8540715ea1f5853df74f8d08e30a85c5bba7cc6a57e84f2939dac2c11e2e1bc15f975bb27dbc525208d192f320acbda287eacc8efb4a34e56d297cc12448f3905f61802c0c6e8154639c038126c97a05c4ef4bf990d9c5d41ce6dead4a18a131fb4b893bcc7084cd8dfb796383f52d77e941d54a970b646dcf9f63160e31871eb9b1d1523c56ef15ee9c4efac6945a617b7f02e29c43a32afbcf946bdf0827bf2140e31fdaa632d60beb0ec74d4b836ae1f32f620f37048437d40d4f3b2105bbb85558f535d2d2867c642349a66f2aecb34ae5397e4a0b11fa591810b0f0936cf57b8d62cc61409fa69447026093d37f75d2bee957f1294cb9db5f50cf1b737b4f300af91cd62f9a20f7c471ea4dff9b805706e22ac0e1ad0cc74d9fe3f6083f4bff5c1895a5d1fe620b4628c1f211b9991467c4653db6bb59995d5eae14d4517255eb51c554fa44e04b26877624bc61f6a75c00a5cc2ae026ee290d7bec6a3a38c043252a67eaf62233f02e854a521d4f8c5e175af0b0c40b221b3cdc012c5225cb0e134353369abe622d8e6df77553fa3fe889035feacf6cc1be5d4ce7bd41bfc2869c9eab5f9b0b3259179ea0889e8d4e75c62d4e2b7ac2698cff5d047f817d634741aae4e88f9f30ed5a95ea1e658f14906f3750154ea27601937afbf589d519ea72d67443e0f0fa64e7f218a941664ec2d4b01a1ac39373a6aa3512b1d35d52dac0cffe042796db5a2021c0bbaaa93987a735e0be620beef6a3f9fd36e67caa82bbf5c6abdbf7703793b376c809de815947276872b282448c21581fe74bc99d8cb4c682ad66a94577c305bf40f76c92a25502f5ca3d7d20a1a2de0f657bba88535bd0967b6012b7a52eb6eec8fbda0a1d21573d475b82e00198da2013eed6076111a296b840ca635a474599c28fbd44045ca2935ca50a1f1683fb16851d829750669af7c69146c4e1ad1054c00b6cdd0267739c8c92994a4af4bf373ba066c48bcb483e38da0e58d5b0c59444279f3181c228ad59bca6de295b752699eff8fb8dc028de8173879bc102d3ccb14c9aee2d0d506a467bb9673c28db5942849fc8d0e5cb5d2306490a1e03a982b9e3066f4ea97947c5685751fdfd5033a7d6e198ff9c9e3ebffad9206743d54aa0935831711711ca790af74ae949526a4c8f650864651ff79ad9ae7b1733d58917d616d13ed69876b3cc1f9e788d7051a2f6708399cfcf1c561b4f76a86438c28213a8cb0278abb1182436e9364a288e3da4ba871a4d3a11744812bfb5556d8b61e4a49b667d9a1e08bbe3a7acfff9749f2299af606ddf7b77e8be92b877e24859c190aec546021227fbac56472f41a929f8a45906922dcec365a9ac1c5c358dbc22d381b9726241d86bd7719f48cf90708f5110775ab36ff9474a786b62e5c01b8103c0bd833901bc651b860ffcc1cf056f26622d37fef38c163764203c6183fa74a7c84be904f626afdf00338be6c95b009acaa2ba6eddfe5af71bc539474dcb761624ef144473a984a87c84969cf3d3fc34b6824291a3c27deffbe4f9e59220fdf55301a5762ed78bee578dad52e322ba7ab21670f5c97b07a870e9feead57d84cbcf4e1d286c234e372db920b72ba9b3e35a09c609d37a80b7375ea8c5ac4392e0160edbc9d00f14197b81a12811eb70e4fac6a25c46536172abbd87e46b15b0f8b3de71d8ef0da5ebad819f245a6a9a1620c7965b969822814a812ce5b656576c25276fd41da14c4450438b4a599967fd7897228648bb5c5990440847f2a80ec0e6943659e06cafb9e021f5f8841a92e14ebfd76ad13f77721960aa69c46d4f8d748f55c8dbb22892f9a75fbd8e4073883fac1587c486fc41427163e9902882285b835ebf64244f85e96e3917ccbdb258b7d67d5b9734637da7f0f535ea6c5f28081ab19c1e359d095bd10275c3e4b7b933e96f64cdca355db669beed37ab2f1316bfeeed6e689973bd6a5c860847fc40503f7c21dcbafa880a46216e0c678a6fe3ed7721d93fbd7b7aa497970e7a08748953241148892b72f000dd36dd13e9950c1ddae7f32d8177301a54474add64dc4bcee7b1a5a730a5144442d62e42d5390bdb9a9e20a47e0d6a26030541f489de13fd379158b7a2a4f36ae2da7476d5b24fb126b306471b948572345f8851fff07e88a42ef61d19e8f9ff4da24422539764091fd4f887e2a31e6968c482782fb9e7dbbde8e259dee7b46be3dc21d7d76ec57de6629be95bbfa18600c2d4c9a1a0ec70e56dc1e09a37af5b35c671f9e99f007a0aea44ede -MD = 7fcf34ae19d002775dc86151d66094e11a187478577687c4ae76ce6e2c8666036d095c3a93c1b4332f6967a65f699f0a - -Len = 47752 -Msg = a54714c1e89bfe9406c536069c79f18d1ef2d055d3e305d921b1b8b10bdfa9aaf8ca161cb696df78be68e821bad5bf7d449b7f4bf18ff4378ed7ffaba9593ce95473e35725edec19812c77e51aa86a13b7a05cf4340cb265c9d307a48f3ed2623fac42193d886d9fd679aafcc6d83b79fe6730f9a440878c5a0b9842c374b13d43ddfd0a074faa3246b74a0bc64f7ad4a15ac2014914bdd4cae97a2d4fe521a3e86cdad38a2beaf8584e1fbd20f36f4f29dfdcb52c709b64a0d3740e3a776cbcb5c2a21ccf02771c94a6f1b7deae620f1d6044bd543d68656433508d8d14d9af32471c8cdcbe97c4822788a408679a3f0544c3c0c9616dfe9f70d4514fa3afa5e76312ccbb459319ab3aac2aa40660056af3216794c6f258d8f2c903880c37c55d7f4a847481b342964524f1bc72fc89d2d52659bc523e9a9721f64a4137b9381b018e5b0d583e67cbb2b9a25795b6f4c8529a3e49ef9bed646525cf810c7c25a953a4f990b47eb2d3e733e57e56d56ed1d244c044844f79c8261c3a5073cab590db5407047cb949354e5a61389da31e77bded85b4f9a3654acca432b654e90f5703682d72983854794df5bf8d52662d417b5d35a136dfda73bf855fbc97225d8632a612e1ef43fc284ecea6855e67c3b7745c7913224bffc967876a6924bdc4a6cfd85f596b2168c9b8abbf29a7ee066210b2f913a72ffdd62d72fbc6e3026e3e44c4bbe3f31cc2e4f355b280164321c9b8265ca8acd2fb22770db9d9bc3983d6f833cf85707a2f016794269293ad3a75d2824adb1a7d2233ae214dac98a92af653ec4349c884d9a97c2fc46807757aecc88c6db3d7789a933b765e475d9b8c27bdb9be37e482e8639af0330958e408b8000d6a38cc0b8aca84d495b0f557d1f09e60e856acbc84b8299d1b7d70400d60e4ccec72e17e1a5ef3039af1462520da5eaa6aae0879d32f91ff26cd35d1b06dda93996aff1874d9efca14123a4da16c655fec47e10300503adefa0091e11a664c2819270c22bdc3dff3ac19b8167e2e1c47152a1da031a38c023f1e6bb672d3a15415b1f1e420a22d440910a7cadca8e9298e5ea6998fb1f0329e30aa99e13d41df351197a6c3004086d4fef1afe66335cffeeb62364101cc38be3d38d28f2b9491204ee5b0ce648080b4ec7d0dc1e669ff0eda3bbe6f1b89da494dfca9a32502327f70c2496a5755fc52e1332e98b9eb826632187b438890e1e469de6645b3f389f98018bbbf6027c055e5fb5991652520adfbe0b3e3cf48143997c6509f5ecf5f3784ce4cf4075e966600bdd5d4717da08c3d7daf7778183df0e19cb0d6adfe7ce087cc4531d462442d3b61eb8a655dccaa01d6b7280c6a22b14f48ce1529e8a89d8efaeea0509c92519dcfe3dbca2c6ab04ed3121d12a58d23e8b3f28258f5ab16a3408e6602724a7b2ff005ee265243452d5c0a80123044eeb4c36445c48e4cf2cd866eae724d3252f8aa98ec04371f12a559e57694750fbbbb616b87f51954da15b4d79e2996147f00e6e6fce943c6bebeb2ec2921dbb8320676517072008c7581b20f5eaeb3b6a94f8d35475fdefff2805067c140ca05fa9ce85c27c3a9b96c1c685e17890ee079ee85cef5ed709356f4199e657aaac0bc85a1d5d5707ea666ebbe0ef1430d5c96e4b8f92d1c614b9121f6d83e56e4af1fca8704a101e51a0cf89d6613631af1aa390cfe177219ed4c10cf5f745cde9bcc728430b4ff48dc064aebada6719c665af56b24dc7900412ec78d792e14014b6a857fa235f20eb5fbe9922cd1f6fb845021bcb4a4b97e11e050166f9407b589a20c5fa34d609f6d93de782bbd799e1334c5e7f696b9fc2309b35489d0bc631b1c0d0e7924d363cc773087f19182efdbade7d332db01e04052f62e0e07bb71ca7f93736ce1d2c29a4fe7a5c8769955a364916ab09a19943063238b48648d495e73a376c6ade6249ec20cbcf69447383501ca93b7fc8a7ebbe341557d0cb9519fa247ffcdaf95f1a179a5b3c4121300572b9b369129da08a97b5973f62ac7f355b186f6cb106a916b1cbd727a198616d28a0a3c84489499c1d272cdfbe44096474b694306f7ea6cc45259e160d026e06dc7228bd9823d98cc91944bd362aba13e16f6cfc78d9fea74c383e8be607ec7f28ae80cd8fe5f6f935fc7d5c8cd907e02ba378055f910744218426fdbf01334277a66a7c8e58185dbe51453204d77945be0343ffa64c570f7f99f5e00a96f8dd640a345f35e2c426fca82ad2409e94b1130f4f5fcf647485b0da09d75b3193bc584a7cc9f92e70e16b71acb1c2a6d0beb517f88a4d61d6236fd5014823599a7bded7b2615a83a519754e39550d78c3cb2ecdde23a2dcf285070b4ac6f577838852326399dc9ad73bb48e5f40739cd462ea817e90622e600710fd64b83433d55e7cfb0ef7e1dc9dc4a3c28ce8b78b892272e33874fdee9546082bdda071e7068a999222e02cb15f50cd7b50d22bbd58665253ca35f89608be6707142431399d8942883e06ffc1a24c8c29397152aad8baf3637247c4ad30dcb82fb697f47410d7025dbec0ed75ed248a4ca56acefc70acf092ef4ef49cb42d75f623903e5ef6f0537323a27856b68522663302e2fab698b4528fa00afd092d1afae9916132c661a0791b2022dc94caff0650fe515e212ac922e1ef6a46865831ce77002f97f5a793cff3ce6f8fee827a9d8da17c6f36bfa9a47481b4f1d23b34c16a80dc170b3e87f85c01d0e94a381f9c4790d6d66de3c027b60b5d976342ae74328809087d930782a26ed9613e4878a32d30f30c4d13c75d24e0d69fb00b09674d8a3914d3419cef6569fb80115ff0129d2643794aec09955fa6b2835f00d01b3a0bde9492c6a2af1387a9ee89db209b25d56ab5edc91160b4d163eab6a08cf076818c3042aed3324b5c86d4fe46848d45c2bb4abc37795fd2d58d2e5d76aa87918fa450494689296b3cf50bf52e86697b82c7901cb39be3183770c6ca0fb360f98ac97d3d4a4ee4f1bd96dbf4ffc0c0357a123eb5ca138b138bc15c72b831ed3d076e2f95069f058d62cecd7436ae22122d2d9eede75ac85326f157ee2ca0bcda99f4efc727e40b8cb10f68f96fb8ff80106c494b97ec1b35bd8331a2c97a30409710266a1ad8577e1cfb370b077bc90dd870c64558420459a3f982270b48e80da3227be44bc679e02b04a01f9a610f29c9bd8e61b4f7042d6eb6c1e18e77549022be48dc574903415fae3cada503425288b50a371a65ab3f925d6978bf900686ba4625a8b9da54101f6a854b93ccf31679f9e22c052869fea35fe1431b2d6e4fbe4c8adfeff51ceb0ecbf26ff338a1f431ee7eb711c9b0e91630d1d72d9a0c59c353f0e86613ae1092350c915fd0df6a3525687eac94209d6f72b3ab638051335ddef068b8d0885f4e584c36162ffbe6e81107d95242296a1387ff46595aed7ad25ff1c754964bf5978829e4d2a08808ef44055d9f4e4c0da6f32d2e7b94219ee5598d9ac5ef699202573e1401cd143eaf30c981d002f8c69e46b5da46c6adfdfb5e1c49894651a32347f15a201020f6ac59ccdcb11ac0436df531b0575ce33688d0365a2b2594a75edcdc1daa143ecf6b4197c4aef022f2aa81296709e151c7124254430827c32d298866d52c43ae37606ab2e0262da152b86cf564eade8a3e2c370eaacca73d9317cd1a2713292fbd20479695b32dcbf22c3b3e1086beecea3b20cde7c53e9487be2d7e69fb2f13df2f6acb8bd26af34f8a5e5c104a0d0a79d3920a80ae584859612c0c4440e00afbf246ba09008fc7c93758d7eac143536b6a0d4d1bc48ec9a6c54b3c1c80c665b1fd5dfab3c9e6aa0dd7ad59e678ec682d72e51e0fc43ca8ee4f0d8679475cb49fb53306029b1a2a7bdfee3ab9cd82b93e92cbf5d319fc66ae52d583d0e10d9803ce48547bf084b991a47df2db5b80b71d2e246d0c224873559555bcb9fa73608c8d106e9676d0e7fde9ef2aa19f70e257c980cc2199ab6f727ae089aaf008ae98962ddcd87a69360f04b44ac305dddb6cd963cbb9dc9fab937818831a7e57e2b66de2f7c897c81443896fcba62b1202caf23fc41b679fc8271150318ed1cb9d7468f277cd3b781339ec7425d17bd7e8f098974decc71645abdb4a0d8eb6de4f513bbea57cf1f3a360a25401bb747a0e8c20ece19477ad94903a487f808a2a78bb4aba394e37b555464f91b7faa182e3ec4fb2f7a905c03582b2ee100ab81a9a311a778bc79957996948bfe0e58f8cf9af698c18a0ddf8b8e1d9ad6793ed4934412f69156f8334f0282230f522aae2b03402cacd027ca19f4c1308dea28610c779fe217eac81e7ea3170976d28604eb818a0118d546e75490ff382fdbd1f1bd43a0b13201511eaf7e39845c16d5c0b71cbc5d2c1fd3fce56cc0f9e3d4a14b4eb0fdac0922fafb8a9dd1dee9a780ab36ddbf89103834d27390eabcd25e003966c69e1bc5d52d7cb607c85d440ced8d11cb79cdeda8d331a70267c923005681ad8e6b468da2526adcc4044a96cd862ef0efd370ebf517e129cc1d68ff430beccd0f4d748a12cf8da3dd6fed0673b255794fb5bc31a967a9a0f6f6e18eae87426b512aefe4ac0dadb459f08dbd85d8cc57f508f7e84b2d52b586d97bf7c9324b325decfdc2f87492b6406e73e28b625930e9b26a3764d0a50f86ad7f631c75cec73a79e74c7f6d03529ad3e89e0db7c5ad319d5d477bb86757fd5c35f930b695d5f0bbf5acc85eca3070063219943fd775d7af173f184d6334f4cde5e28c5e660288986e075cb0adf7c9ef997aa7625931e3d2e248c4f6604f72e8d745b8d60af609fa9c88c1cc7550ae7667eacf8811885bed048a051e254f7f95534b3d85495a7bc8c5548118eae22683e2909319c92349e8c62c662a7bdd23bca01ca2d2ead6e7ea329624fed35639fe54957b7d47a9b4ab70576c832aa1674507df6f27b71154472b7430e5f953efcf03200f1c54c3a51d4a32a191fa425218d0bd2deb76b4cac9f7162f35258251de385ad85fb71923289ce68cbcb369ed1e43dd6385f0665157e0a5a8551d8a66133a6a5dac3a5236b3ad9ab56d1cbd3f3da768995fedd0f2d92c4924afa91537575379266ca316e6a7c677a50afee7505e468557e0359ab43824292aaa93c8ca90c9afbc08bb0f3cea2fa5e3fd218e286a665d26708f6ba05a106e42aea24d29a8e533a6e64ae33f65304bf7ac4d5bd04750178d77c4ebbc28383ff4239d4c5c85ef2e6c70183af80011916a814af54fdf4cdc155d9dc3128ae3c5c9724d6c69112fc7970decbd6da419a0c3e2df06ad18a1d4448bdf9baa695b2848017a565a32ec27ae248f13a83791a08a39d633f2dc9926a567551a8aabe68ffa39ebb237d27075391fcae5b1a2c1b948edf52627127afbbd5ac6e9bc3acd2265826a2706d801dac16563db8ecef1118366058754a28d7a16cdf9b048fc580b1345bd5dd12ce87ecd5e229c49a269d3c60ccdfd7f731acc3726b71634dbce6f8ce8adfd9fb66d88e572d1d1ea05702596471731b26f6918a8cfc8c38abe797956d502af795ed7219109362177e1502f7d7fa9cbf47dc187f22ef460528c9f4efb72841a660c70705a8b1b35fa1d4f1a021c4c724e856c419cad0395922f89190329fbe76ea87e9ec76046b47aa1b60eae86c8cec670b06d2eb2bc09548e7f00f4612ebd991a4ad261f07f470055cd320725e5886724d63330a7e8659f91c82b5881e645f04a1c35aea490969321dbaf97626b48368a25bc2bf34f507c20aec3b6f3eb277a203cef38e240483bed2aade6a321b53d8ae730a7feb973f12377f0971e050a3f85f1278713560600a100537a51d078830d62b72a30ee7509826cd9826afc96485f840521a09b77eb25a6c9ddd5403910f9e0773ef1b500c925d5a7ff3f97749c983db290efd744036164389795399fed38a79b6aa9d8b93bf5fa8196059f4c431664565c6ad114513d81c82efb835221b0ff4937c01d4a66d82290d024ddc546c341180b785390dba247a02c6ee5fbb44b32a92b9e4d5b52b797fc34041688ac851c2127802360ab76fce919552942afef87e5d0ab3093087b9fec4b0e153d7d463c9938ec0a2bc9a3e9ca7b1a15ce19864522ae508d9b8f0a83889ba8a18bc2edeaa7c423d0993b0f566cdc247248faf7b58b4bf32d1aef4e8bfaae3b811a82626e73558d3d530ba48af6c3db07575a2a1f4531fed9b9312efe670c307e93c58d1026729219014148cf91b9a79ea44207cb7be8d757205c9126fa3bed609e935618e8a49a2b4be3e56b6545f0fdd6b9760053f6e86ff6786149d8c5dcefe2f5a5cde0710d3cd7fb62a799ef1eed96c85f07f5e597ebe48e85b02c3264f208f26278376453145090a7cb563f99368c76aa288a3d4e9291a4e5a31c08ec33b79375611402d47b5cab9c1fc3becaa05fcb3fab3a84742ba6c56969d0d1de7898dfc6d0a0d5f939a35329eb09f317f3b8cf06d82c44707fcaf6f94c7114a18a53de3d0d03642815ce9036764f66e9f63e8be8f78904ac56a6417d92275a9d318f98c35f6437cad9856aab09bea0a9729a06cb4f784d8f77e1addd84192a3a34f4163e10ebd7484b6fea70ec7e28bd307348992922a681ac2442016a700ce05d2b5f9866c2cb083435176d67b6868ff5725a38cdaf97eabb1709d18c5388f772dc7bb7aa0e9b745b7ffa8bc28e43858c3f43928346a8336d61093631eb27e73caf738523fad0f38af499b0442fe609bc810b8d930f62c28aab4b16a3607018834a4ee81babf1ec873cfec536c1f7824ce0bb1344334c00da9cd55b28d9ecf30f5814cad84c86c91b0031b3e06bff5805065a0be0daef5524ddb1eb097e21dea77fcd12a30317f10ee838608a5685f2af98f05cad2bd12a3215e7b08e789942156782a8c4f82dcc289b1db67caa11ba124186f0f44f7ce5caed7d90feefdc881fb93b7483554fc231c2e89cfd8e2b17f5a722aefc6e78f0b50d7d75a30a70168e1dfe5d283f063bf0049ff9572a5c712172cf7e0fae4bb1bb1cee46c3f2df56293ad54efae0d99f2e0a4cb7d0a72b315f4b9248733a7f92a3c3d9eba7cfb1aebab9c72c42605056b37bf6bdb12d21bd75da75f471389cf937a9454b97c86c880741dce049e7f3c84700a6f342e3c47e2bc67f6b51d128503d773a50da059a4bda7b1d52549c4b5eb2416341caf29fdc4bb7b8935b2cadfe7ed4c1e1baafc25ff90f916aaea7df7ebbe5358f938237409b572955d772b26bc269e0e67dee6d2c2ca441119e3137912c9524c5e3ba1610e54bd99a0ccac0ffd1dda1486ce9221a3de2332d6b62dc00cbf839cb03c2c3b6ef3ed048435d5e2272d90cedcfc96991f27371a75e61553261b77b893bc3c69882d61748c452143c6f0528beeeb5caf915fc0368bf572a8eb579f3e8d2e5a82065bbb583d7d26ab58e08fda310d6ceba6c28ef57d66be47e91e7a7ce124ff0b46296b2e0c405e9f5988b93857f54fc3cc09c3f5beac60a68bba8a124412a26be3f0f1746d21218645435f34a8156dde7d803fb5e448f24b6fc65e9d3a89dd2a5c5cdeb9f4a227f6b8caf24dc5f04f7247e0329472defbbcf1cc685c28fd17dd1bc7936d2745ca77006a02e216187d5597844d3feeb0e561be3727fd83dedaeaaecba01c798e917dd8bb11a03ce07fcf08f6f006ac6137d021912dffffc1aee981c395366fef05718e38aef69f0abf64f8b2cb9750826b8ec854dab1e1280c403169e3497ee9af08bd6d2b53a0d9c49e034220506f7719041f0cced1cc846b853a090ac42af0f699c2c3174606e02800952faec06dd198c692237ace3669552f083b7c44f8a764ab5ac5135c25b042034ac5c765b004935cde335f15a34941b4287bc83a6c7f71c3d20d7ff481bcab3c80beeaceea92711d3fb6ec3697a6c9ab27347f22faebc669c4e6edbdaf87dc12d375b95a71fdbaae4318b2af87f4457a611ff17d386eab039febcd0603845d0caf849396eac8e88694e342eef8c45db87278dfc7899ac837efa69e6c224496a091661a12c966831c81b10d836e996adbe7e98a9072d2865d2091e25e804b21651584ad4c726902f6b5dc82fb6de6156b1dec924698b86e19df28396bb20a75d0b87acda29a42f0ab8df033b55b3cb5cca0ec87784fbef7c487e3f4021bf51c59d6b31bc38586c4819686a05fcaffe4970d83caa42c48bc03975fb2c032bd8d870cc7f81de897073f5bfa594941b22a40a02cec38a308134d99f5e604aaa631eec723e3102816212b3ad5bf1033f5ef6025525cc4385fa6090c311e6dc851a1e792517d58c866baebdfa34223363dbc6bf99eacc570c1dcdc7abbbc6a304266080acb17463e1b3ce7a6eda310acfc19ca996c4ccad0d1302e41d0506866eaf6c67d0b61671da61fa -MD = e796373a85f5a0372d9d6ec70acde59b60174d4298718ef9b3eeb0222fc6c182f04706a2014f8608592493c3e7ecca4f - -Len = 48544 -Msg = 46ce506d593c4ed53c82edeb602037e0485befbee03f7f930fe532d18ff2a3f5fd6076672c8145a1bf40dd94f7abab47c9ae71c234213d2ad1069c2dac0b0ba15257ae672b8245960ae55bd50315c0097daa3a318745788d70d14706910809ca6e396237fe4934fa46f9ce782d66606d8bd6b2d283b1160513ce9c24e9f084b97891f99d4cdefc169a029e431ca772ba1bba426fce6f01d8e286014e5acc66b799e4db62bd4783322f8a32ff78e0de3957df50ce10871f4e0680df4e8ca3960af9bc6f4efa8eb3962d18f474eb178c3265cc46b8f2ff5ab1a7449fea297dfcfabfa01f28abbb7289bb354b691b5664ec6d098af51be19947ec5ba7ebd66380d1141953ba78d4aa5401679fa7b0a44db1981f864d3535c45afe4c61183d5b0ad51fae71ca07e34240283959f7530a32c70d95a088e501c230059f333b0670825009e7e22103ef22935830df1fac8ef877f5f3426dd54f7d1128dd871ad9a7d088f94c0e8712013295b8d69ae7623b880978c2d3c6ad26dc478f8dc47f5c0adcc618665dc3dc205a9071b2f2191e16cac5bd89bb59148fc719633752303aa08e518dbc389f0a5482caaa4c507b8729a6f3edd061efb39026cecc6399f51971cf7381d605e144a5928c8c2d1ad7467b05da2f202f4f3234e1aff19a0198a28685721c3d2d52311c721e3fdcbaf30214cdc3acff8c433880e104fb63f2df7ce69a97857819ba7ac00ac8eae1969764fde8f68cf8e0916d7e0c151147d4944f99f42ae50f30e1c79a42d2b6c5188d133d3cbbf69094027b354b295ccd0f7dc5a87d73638bd98ebfb00383ca0fa69cb8dcb35a12510e5e07ad8789047d0b63841a1bb928737e8b0a0c33254f47aa8bfbe3341a09c2b76dbcefa67e30df300d34f7b8465c4f869e51b6bcfe6cf68b238359a645036bf7f63f02924e087ce7457e483b6025a859903cb484574aa3b12cf946f32127d537c33bee3141b5db96d10a148c50ae045f287210757710d6846e04b202f79e87dd9a56bc6da15f84a77a7f63935e1dee00309cd276a8e7176cb04da6bb0e9009534438732cb42d008008853d38d19beba46e61006e30f7efd1bc7c2906b024e4ff898a1b58c448d68b43c6ab63f34f85b3ac6aa4475867e51b583844cb23829f4b30f4bdd817d88e2ef3e7b4fc0a624395b05ec5e8686082b24d29fef2b0d3c29e031d5f94f504b1d3df9361eb5ffbadb242e66c39a8094cfe62f85f639f3fd65fc8ae0c74a8f4c6e1d070b9183a434c722caaa0225f8bcd68614d6f0738ed62f8484ec96077d155c08e26c46be262a73e3551698bd70d8d5610cf37c4c306eed04ba6a040a9c3e6d7e15e8acda17f477c2484cf5c56b813313927be8387b1024f995e98fc87f1029091c01424bdc2b296c2eadb7d25b3e762a2fd0c2dcd1727ddf91db97c5984305265f3695a7f5472f2d72c94d68c27914f14f82aa8dd5fe4e2348b0ca967a3f98626a091552f5d0ffa2bf10350d23c996256c01fdeffb2c2c612519869f877e4929c6e95ff15040f1485e22ed14119880232fef3b57b3848f15b1766a5552879df8f067c3e7972fcaaaea61f421fe7e6966e5aaf179818feccd7847c46c7dd40d5c70f4efca2cf5d236fe6de8cb5cd3988d37b5aeb9f7b6cbd4e41e43294bec2dc0b321320d942bbe78e4a71954bf40b3f290afc19d8881b2d87f6a65304f4865d2517d49266f39d5ed379e2472984e32338ae9e888b6892854b4ac88f61a714bedb65993a910b8bf0081c398996a44a9cc71046220042592b62e554d0f1fef569f6c46800a2b20d05f3da7c42dc7cc712a0d7ffce7f3ff989947051fdfe22b0c43ede4bcce00fac055e5cb55c4135e2ed89acce744f87f905a993c8fece3bcd397a584986944bef580f4aebbe0ef723954b37bdfdb941e10968f5c0bba970d52f74dd6a16068d5f66ce4b27508ae91373ae1fd34f05963afc9a3f411bd9e94f0ef213b7647efe8297650770faff3439ed790d18537bad8a4607185409a5cfc33dbda2375844c6e3549a27cea4b3ff1d6c76a895f162af5c4f7729ff6a544ab9269d33f3db9f0c070337534936ef7348596b99511204c3357eb21a4c272f81ba30596ef1d3d9f8780e0232ea98fbb8411a2187549ca7129f3d7f9243287e9d4dc3bbfa3b2a38b4bddbc46db8b31ff59019601ba77994c321f4a839eb5589c5fb478980d9c605655ed444abbb6da353bebceffd518f13ff4409f3b84c9697224b248ca7d1918736e35f4c95fcafcef9526d98d45ac86bee8ee529b76ed4f1dcc5c38c182d71084dd5e6a2d38262ea0fd4932148cb0ae6b789f012dd5af5e01af18a517af550ced2bcd00f0c566c3dbfcd955303ab3fca83bd9275d317e3aa0458e2a2762f1522ee1e855be87eb7102fc4ddf6aa024e6079b1341b41ad8497c3813448b4e5a84cc8856d4e110429aa8741d2d2e8d91ff0c2ed3ccdcd25c2f17ff4e60cdb1ef1948a78f0b02cefac55f0ccdcae62379ac285f91451228684fe5f3a62b493e3d74259807648e448275792ee6354c324a71deb5e226fe6d8b1088cda0e08863b459d602467dfde1681f9942ecf8ab1a82e4b1ca3d0f1c22333552e5c54d25a2e20eec4ec2b3dc561a4831e158919d4cc17923f50859d5d70f12d6c499bd8b7c4517db0602a2a3f32773d5a2af7c9d6974a3b7ceda83d60c6d3da6e284ae34606c0924a09cc6ef490e26e6ef582615c12af8dfc03a397722ec1a35d81cbbbaefb5575ba6e7ad08e83cd6082fe92ab11432fd2e719dd743cafa3cf61dd852898abf96d29179a1ab2132059bfce906d9a34b05065b8be9b655161a7a1c2e0f2ac1f92c4bf8d96120a49c3a24cece270a2ed1b519c67aed6961ce47346bb44e0915e09c0a357d4813e2c9f8352e0f27ccf74591bb7ae15eb7719127b774d19bcf07047aafefdbe2ef6c49a43f9332759c9d351f6dc155ba3af4fd4065d02c74c705e33caf708bae3d91a9d2c686ce8ce3912ea2c3425e8c6e7c7135d1f61b659ba2fb467b7ff32668f359184c8139fa4c7370e04e665251cc687b5c9e7f24faa75ebb4ca656a8d80c11e5c9440b0b3a31a4ca4c51a5e786cf599a390da3ef8094a9b1a3c2ad233f917dbe8a4f9cc8c93db5893b8fa964a801b04c6fa22cc1a3ce146ce032ebd8c9938761bfc1bee923cb164c525ab97041ee1d10551e7241e0ce1f4b76798b60028cdf6dfe3cd9f2d664577215458e90c0fef0747db50cf6a41f3adbfb29042f76d7d641ba33766c5d83f998f8c2712cc1becae76e2865468a3be7acd2a40ebd931f1c7b78282cbc25b46d2f716409caa0981cf79acb13b7ff9eb62ca19ce380e3cd0279ac9d6568cb7022b413acc0f10a355713881f70d160d216e9cc562b1fe56c38daebf5a908bb41cab5640f3f165af119c9bab835197a509a52c7725df114772ffdaae370027193c5b1c70dccc11f65c588a717b8f698a4a0f62763e49b0d6848806dc942fc9b009417c12b0277c40dfaeed1a0850f4848db4260cd67841cda22d1a929aa3d73f2c675e6d968b0e5541a5acef511aa05b7a9d617f15f22ef273f8ff1871e6bb8f4cd5abcab77f2ffc2b46af387f78d5d6b8d1f9182241dd0ea0f09bb64080db68129249713b8b47ff4598de3db9effbbef058d81f26ecb8e8d01dd7b42ff7a19226a622aa4937be2436a3224528097adbc93be4dc487c254aac889c5968d574d42f191dbd090cfc34a76f6199f34dbaf5ec810796b1788efadb38d0ef10a1bbf7d6f321f1a49169f63f058582444324d40032289788685ac106355cbc52e4e0c4c23d1890424f6d34a76c744640741e3fae572f25f6d5f167d588290954254a009bffe9e00acc71b486ac182d116711009ef603892346bbb4ef381e1d3eec61760b3f7c2a2592db3f85ce5781dfa466dd771a8e0b36432070fd4d224239c28dedb807b9b5bb29159d4cd81b88d1b4839fe2c8b7f258548862a6d01fbe6d2d362c4a5e88cbf317859682d54b8c101ed20e860a6688b0025b5393c8fcda01b7c4fc6a4dd1b2f5e695f2cfcacfd3c36ab9f10ce7831367d4010b6c3da1de1de89f25c0da7cb3ea1dac78ddc18fa51321a2111b68f7dca453e252d838f612eb472f6ff3107116fa4531f151c1724c28caf4375c93a82b900566f07fbfe2bd905cdda2acf498234ce58e26d6d3620f29ed172976727f485374f6ac0add502937af0f859290d92209852adc12fe47353f1373b0120d647a1428f84f2197259c06c92ee14eeb1d5a58ae6ddead4a070791c37093d86a400afba8d6a16bf74a5f2531a37e870d4a1462e6bff350bf8bcd4885769c6f93f940317cf66a9104a7babd6fd524e6ff4a984eb888e2a366bbcf8be1ed9180907964de2cc2723ac624f4f60c2b9b12c8032e45a930744d467f5483603d3bb267a6be2940a0810f46aa57f78f0faab4705f1e6f431f71f767c0a65789ce62ae226a963b41fa5eb88b1f29e980e81b740045aff30dbea148d2640b30e408ce1cc9ac333cb737d2dc9d6db3f3681db4f97f9c2afa8f73cbe98e55cc36fa5446a26254de5328bfa523857a3d3ecd183eecf54ed7ab52a7b981a3793090521893ebf749dfa81efa9f374a300ff23a4080f46a42fe2fddc331b91aba816775bd7d9d8f757e64205087bdf475703634fd44bae760e7adb82dfc39faff05e2e9accc6133bf03afb72927608c33aa3245b750e67390da4e6c4fe2a84b2f062a384c48deea0fb5b069ed45c61951030ff4d66d1f17ba1e3a8090aaae1634ca66e904b9bdbc4ddd90c104aa97a3b7c4f5c9c2630ddac6fc987c571ef462f59abf853ee6a5b161c37644d61e7c334d340b4de4fa59c49cbc90e90e0422375abd5d9361983fd234af8b7ccb691ccffb9d7a07a2faabdd25a64c4e1c25e09d4b7d679bd5973326ace9f7f04c522182a9456980652aaa2e4701f133e949d49db020062601ab28b5b2b8e128bfa230513f75013e9653ffbeeb17aa20dd37a93e71ef61bb4f9cc6882f6671ad8e21f446a5756acb9b3d5295fa2e9d9e60b905897732a1e22631b6a60939d1061f971268c38dcbafdeb04abc5a8ff234da959184a831ed23ee33a0172a7a26bbdccc35bf81054c70c5748f3af582d26bb394f439ed336e07106b2be478709b552c880354c8241798ba50ca17b14e65ca537ed6b02f824b15f29e0014dd65555b7692242e7e3451af240ea35c783dd2d9221be1f05464add6fd97c7af409f7f5524b341558d7b253b6b74c110319542208933bb014522bcd0991d27be88673fcb9db302d2db42b9c6f64bcd3bc49fdc28ee8d0cebeb039f8d2ff7c8489f05bd46495a0eac52d035d72f5a6ee518a3c978baf27db62d517f9525ee53556cc1234e906f0eebd96fc2f77d6b4d1717e93098562ab56bf252836ee5ca70eed7e39669dabca998576588ac484411d9a8b83a1128fd5d122450d4a2d553c619c8b240218f0788bab6fbae81f9ae6331b35a0e6a9a331db1aa9199b95f50fee0277749fd17195259dd795cfbf671eb292115d62b13939c526c5efb39ea8bbf4bdc7bd985dabab07db427bca4a85550c8d832b7ddfbe683fc52fe22acddcab261d003164241b14a2f234cf30377223b16c1f8db07b9f479b844bb3599a2d67f2ae95a2bbbb2c8c77612322ca0cc9f531cc4b16a31b785278d2adb5d89a077cdae10c73e7896c5d05b691f8d040d9541e1caa38be35c613583eca7c1033f7444f62e91780256710ce5105c3eb6a4cdac6db91867a6104f4aa272678a8fe7978d09290100e05894241cef31683ef70c3dc97b5626013b190ef3a463dfb500a650efeb5fff9a06f6bf08efe53325701d9cfcf6a5ef7d45852b7d6be2e9fef26a34b15af39cb9c75e86b2f6c2c6f275c7700e144feaa0975c4648ad2ecff126abe256600400c402962021ed0e4a2d70d16108bb9b41f597650a5d548dba17023102e6e4db52432164375dbd12e65fc80419f1d5d01901ae6a1cc34648d2f6efc33b6acdc1bbbf8b91706f4c16c30fe5283dd149379d4e443127826da63e18562b35e805fc63bfa8e5755e846208c52f0578b1ff18f263c284d1a3aff127059d2f996b73d471cbe027ee324c3dde090e626f98dfbb43c88e29c22df66fb4432e980ff8ff930d6b9b2182f48bf16d64ea08cd8ed167b60612e8a328296a0e5c6f2d3e99917f61284199daab2bc4dc5d2bc0389bbd6573a4b58b1c9d30285cd8cab8cf5511e292893a589e5f13ff547d395058c88bfea32aded8d493f3f2c73da6ff69356702cb17ee2675182be9fc4a7c80d71c23776e20f7997412590f77156accb53f7c283258c6ca07df5bccfd4e5d1a5aa06d1bfb0f6794a3224cc993e780e55b7d369befd6280efdbb8bee7e1142e48c5a5231737f96920accb466443c4f1202f77ea52b197db8ffb5a399a81a94a81254b800fdf6ec5a5117772fb19b3f1d52b43d8c0ea72e91b4d48b13a3f1bc2c979689d1c2fed1b61f0c7e6c038cb8ccf5bc5999bf0aa161c5202ca4961e2039c126abecea1ead6c1cb1b165619722e99017bc1467ca40f0d9a16c96a9292a96380e08999cdfe845f110f861f445e53acece4c452d6d72059960342f069b410da556862000c7ea0946313caae31d698854e7f3733a7d9e6aad646db9d2fccc64b0040fc83f601b80c21a638657a8179acd6d97e8b5822ee5bcb5fd7a38d2356400228adb8132e4710ed5573e786c553adf6522eac702893f6e5ccebb5ea7e3d53eb7de9fedc3aba6d26afe196df38c2e32d97bc2988717406d60c6c36c023e7f11ccf55dac9ed9e5b5df42615fc5253f6fd08ab84f9840af5ec9cfdc8b6cae292268b65ce548d7f75f3e0a5c756886353e53371315be6c55eca0d04ce36c9b9d199309e6c14a0ca4798f3d54d86619d846696a1d117f03fbbdecb05c9b8a6da19d55d641682ddfb3abd8c58faf4745f0301a0b1c6c666d6779b55954db4e8cfe56b705b60179baee9c23895623917144a36e02594df81262c903b27ccd41617cedc07f8db5b4041bf57771f05cce079d486e371cddbf5bb355dfa31b96ea52e20a792a0eab6824035ddd65a781856ec3c72193ad4342ae24c450147b61d1c8fa54e8ef810c1c846e7d5b4dc1bb3f0e7ec790fc53a809747bbe5fede2547f2c8a7417b72dff598b24fdfc118731834f96f0c15b57349d1681ed131699977be45b110e685bada6a1ec84c59a410cd999d2ecbe99010e85fafef67478e8534d5a35d4d4eb533d8b2e8fbac0ce3773c954fb608f9c995f498aba848af916b07ef4df6570295dd8909ad648f496b08fdce8d9f73a4e674e722d7c3d5e826dd5951c236bed09c1a63e4e86d669dbf68799bd3457c996b304874a0dc9f7fc33eb1a39c78f5072c6ce1cb06a0b28834f84893bd428435bc4a9104b36d15d4db11996b29478a34eb579b3294990387704ae32cb8113b187e3649597bdfd995f2f8890f152ceee84d6ce8922ea0ca1a05c2c1ed302bf1a01585d9f966af4b218f55f905dc93b37fc71f6280116286ce5a127d5bd20d686b16bbdb5b0075fb0624ac71e5ec065889ece18182f958ca02d19c6ddefa3fdfe7f64ac604d5ae59c2478e8c35c01f4e852355ddf152fdf45620e32c0d353de88538a5127d52d2f7d46c5e906bf52916000eded071aacca646bc69206cff7212f1526d592b046e45baf7af370f07ce4f6903fef18a5d3f403308a0f354d596ef8ad805f29466dad3e49de2d88554794b4ea738b98206d062d99a1d1d7b43f6bed03e01875006c322ffb3bc0d6577a4aa2f6d1eb11f242a7e78e55ff736c72c315008e28fd440a1a35add7d3e25edfadc79da0340a831a803bf7ecc292ddba1c788ad1b6497b0e0e5947fc8f35d33c662bc52a910c3bbd3830bcaf41bb6fde1f1f8af3eae20e41b5a2b2f01c561c5a1cd657b5289e82f378cec5e6a5768aa87311e93aed4f636bb818d4fba1cda30178d13c8a2148c083e81efad9154b96dec0568defe718e454bec396674623cff821235af1a5925d362f2744cfbac3fb49b0f76059ffc6f8c370ace07a35df0709c0d49b31dc05c1d4f6f28912bb6521b1e9fb49c25ee0068176da9b7e9389b5fafdede694ed285425e485b3e841ba70de136a2f702cee78577755adb98ba940947f74226000837ff0a2eaa89a74495197d74dfcac9079b50a1b26007442c8109fef7439de3f9fa8ffd729526f7b9a2aa5ddab97beb20825650b547bf6e36d8de3f4f21256d00339182c4897b17f3564d1cc8ce8eebb23302fefe7058994211f2837f89510db379804495161a6a7a368e14cf8d784d3523e2f6ee888737d6b2e35608daa5389c42f8bd54b97981c6b9d9d07f84cc7211eb72e315eebfdc8d322d316ba396901316474793f21cd05156acfa2932f00ce0e03f4e051166f9ae163ca01862a986c06a189dc34e78e8b29393dc8d2687801ab8a4922c9f0111e1e59e2caf96529f2cc4d90a732d022d63071b01fbbdf74e37bb5f59fcf632a79116ce2191bd364ba0acf528142c6d30db279f04f597d3f9c08eabf006a5704d643059495f55a90ed489197 -MD = 1a93eac31a9802d78492522fa021b98711d9334434ff3c45d8f3b441e1805e08dfc62237b1152c4b392ebf85ac39a04a - -Len = 49336 -Msg = a799ef180d0ed9be2eb02583263b70211167613373bd2da4d8a86167b7cfdc689ca21ac38633b9358e4835cfcaaef7f271d08e7740883c2e1c34b48af80d229af9b46c3bd80eb78d89522ea31a60fe7fdd55a53dc95c6d8e1ec73368485e6dfc06f66ce9cb46deaf65f79666dcfa90b09d1e2fecd7e2caac268767696f6ac6760b91a233278433836a5ef780d923b26df854b4eb32c15a707b9fd7f634da34f04fad9682b36fc0f1e2b0d859d9846e9e381fbaa4a2a225c367350c756056c0521b70d13f38b08ce21314c259a4c5cb2ba3a6cb7eef2d348b30728c50bb857184b705dad07eee9f3c46b33ce8018dd2fc82126ee1e0098eb21f7de1ed0d104f6f6b92399f4dd202e9c4b4ce6eb98489f91c8a2c353fdf3b1e7c7f92b61e9e62f97f4077126d04bccfd24000539453fa0bbb378be3d25644b98f9f2811b6d8b30b3a361b93a52bd5d8bb7f5bff5aa22d18a54115516217b0699f062a689c66498ee59dad89bfef56ebc59866dad318280923cf52e8b6c98718f6db202299ef2c68c89cb55c81fa46ef3ab4a94dc75ef5c77d09c9109815d2adda4793a7751b65832b5cbc73b4f1adce60faadbefd1c9c39fb180232cea3981094720a5ff894fbc556044938207f936f8093f9963ef92346e52485b4211ae1296c830db2e9fff61890bde5128c4a01bae1a6163e529d94d88254db005923b5e0a9a2240812075f6323af1769c1fafe97cd5c8a1c01b1f6d61bd18b7c3e651d1d95f9d8c939523d8e550167a6883893ee8adddf9a13dd5227f8c31d92978920c876adb05d278898806fdc5d2fa7acc7a761509c1f4fc8afb5615119a92e36c7c995e9352ca4527823b867826de6fda2aa9add4a127e1b15679ea30828c91519083ad3ed9f7858e65e7acb5dc80fd32cdf7dae70dd687d8d25f6e2727931cd1e6dad93621c6a41e919fb2f77a9e8d86e2f52e896e7d5971dd7b336dd032e07dee135521c0c43b58a3c85bc56763bb26f8060b645988d11d0651bc6d32e886b624a1b38a2d8cb5ed0b05e998499ce0937bcf03e03585792abb877bbdb6206a0b192a86c7be6cae1c35bcef089786986cfc94aa85b8ffdc2b8b60e3c7e07714fd39f211732a008e96b261fe6eb7dd6d03e91b61dd2a5454afe482a724285911fd15bd1604c6d4c1cd1f997a5340edc908cfa7cc5f202f8d285571185b2452eb9b2acff7053b46022fcbd8055eb95426ec2eee3c7420fde0156c90c9c53ad10c47e7cf26ecfdf0aa4f458201d9979d111e754344b4a32be80788863dfaf26fee93db2f3834655134ac2b4c026c52251220313b87b93d461f6f37a5e774d19c2d0f8364ad7427e43bb6db8a798f7f88a481f15b47da45e900cd089458cb5ec2220b7f03f914ac261a0fd4b1f9ab863432c414173790536116a169c5f457009e78280c81adae78937a07b576e548ecb4676747f3c983fc6acb7cd9af5cb05d6d99d5da622d99f3b8b64eec3ddef049859cdbdb75601d9752b9cfd6d4f46fcbdbf1a5572a0b7fd4026935e77b4939f3245d926d10ade5baa54c0affcb5ddde2462a07014dc9b8600d0d6d35a3b67e901d143b6b6a0544ecff1cceb2f6fb831758bd8b7741eaec4e450d55656ba94696ec7b3754c608d394bc867b7eec40080170069317aae173e527037ee527841a7dfedd06c7c91b1a486a23a1d21fedd50728afde70fd3ff7cb3f6a5a437be972cbd0d43a22f7de717e846ec24b063762beef039df19d78e0770abc67febd4be7f71edb31f4b6a581bd97e26d4833cf498f3fcc7238100eb66ef5743875702dd286156c9ecb9a12c37c110903683d07e20e9744fbb30973f219ac2c3c463901db0f70f2d10626a8af408c5d15196693d49382178ad0de3b1c1d8b3ef3ff8c5a59e9ae286932d0c9ad91665922ea54d599e48cbeb03ff2e6acd10f46ffffcea9e7ab1957d7e01d1866e53b87ad399c5f9a4823950c5f0be92cdac4bea0c59472fcda6f1b9d8c8ff733b2885324a581945e54c354ef9c7dd50491381086ff524811de0bee3a969df8bc9fb96619bcc9166e80f858da96cd1cccaad5e722fbac9bbf5c7c4a2faccb9f69f35b1b0ccdb75843534f2b6dcc6e22fd7e2a9d0548e7d06dac3ca9fd2d9d5dc453f9fc7e76f0cc6552144719bbf5aa1f91a2cc9e75b8a8a563c9a8139787a64447f284df36f9f55cf404365ed3e7f49b7bdad06ee08366ef09afaf13791f2b6235f13ebf9c376592bf8b73bda2c9b509933f52f747dcadb3145b397d50c83fb6a462a480053d9f9f2b0679a6a6ff4dd27e4cceb7ea28df89fa68d1a1ad1765ba29c330d1007105dabd21c2ba6f0d219ea39f9e2165fc9eec4234f230fc813fd52c8f7e131c762aedec59e9695977f2c699846bd439cc4e42825c359badaa10a02343e6d6c7b191413f1b5823f4d423d2c6a79240e41c8035115af6525ed6aa93a47d058c80b7bb6d3be2997adf86274bc185bbe7d361b72c959dcee58eab4038369744b4e5fd1bda594c17ee68128faa008b4349b63055a185b129d59bac8406402f4ee055f625012db46dff2d1dcf760a44c2d6db0d0e3c481181a3243ee87667a16e8f5f47898a1fb8161dacfc6928553ea52fd06c2345735b80ceb6f6d000f3aa3e2260459bdda5c37ada5622df4967c584b524b257659deb81b8a258fd4eaa86283a1784ee64566336b5b745b451b895cbf74693fd050e3e1f0194d9a2b7c2d1d746d399f3b6b823c4205ec96ac9de1bf576c46596bc6aefb339fced72c4f329a5c922e94e5d31619daaab12751a3ec48ba41ccba6f42a6ce8c25928e00ea1da2e4193e750c058c93dc52ad565db512c190fbe1ac034d3321a1b28007ced557fdb4095389d78a4a72f005c76af85bbbf083a36f754f6ebdbe1d4e8089bf994973736a54196fe9ba7ebdcce7ad491e4f9f393f5d5e7c2dac6ba6017a5dfbbd5accc944286dfcaa427eecaef565798536945ada93afb21269f1e4d456cca9c9f1cf60a0b9cda5564c3c24b4dadbaf19d8988f79f9b018a65a1881cefc1cf2457846dd85ee8192743f7e0ee57c5714609e72802677a9d770e8a722f85595fdba56f7ebfcafd0ec8c830d5249c420d0e4eeecd4e8f5e116f87b6871584781f3b0f3aa300ce404db2680b197e89a800a2d31cc33c85ba1fec77c2116f9bb26fbadb72954bd756386cb9e3185cbe7bdebc1d0db47cc9131b764519bb9e09ace3e3b0a3b00174b3616024557c5f991209a2a31e1b5fe7fd96857649e0117cabfe3e154a7dc234cc4b254dde9ff7a82f13ff0bea628660ee13a291cf296a535411328fd368fe861578348ceb0da57a0780499def1460b24905461e05e2192c19ef6966db0c26e7335b1668074ff97d5fd0faff88bb7f5aa2fde871aab4ae6581cb3b50cdd1cbe68a763365bfd164208c788ba763d242c8906022431a1b8aae105730d438446df2af5c141c812c661211f9840bfcd35b9a75de6bf8d0814e6449f5d24786fe7d99f67f40e2d7db7fa074d67cb3b0391a3ee7cb2e096a805a069339a841464a8b5b1452425f3049218a4991ce252a9e1f245aa8f0fb44934e2380851b5802c317a47d6780f8370ffc0df4adf0e6c85ccae9331a5d54fb248b39968ab3d238f2930486319534388a5fca0aadad5f161fbe0c2571bb9cfacea1c7499d0a6645438e09e342f799d162dd3cfff32c249031590b96519449cffc223b1e4e778ad4507913091e10af8e03e4e5592125adc33c3c460a2c9fc1e7377d33891183965283e4be6c2578dbcb0817318aba02713bbad869f58516bbdcfb231f1e88d73f3c68516a80eba8a504c9e4c019204b054627add5ecdd919e2dd1a47c4316badc1e782fb5ebf32891e7c3ce1f88e677d08efd3d2854b8a8df363581c9ab3dd703652e001f01be6138d0a0338e6e8f117982b5f6bfc188b4f5a2a13b859b70943bad14531466bffaf05bc9d5bb1e9c9056adec7b2ab7c05e77dfaf424eb8517aeb52a5a9149f6a4e6ee5caf5243d618cfe8cfb2af7bc120dec69ba367366530398f26c62cdf06fe3fb1b0e42382fa05fe79c8c969522d03ba9cd4c789249f7c6db18d3107f1e13542b481e1d8589cb919848fb4e81a0ad706666e08939c7a22d18127452c68d0707760965179ac035ba873ee1a34b99ec3478e32108c853f4aee68bca7a22a1bd7671db9da0c65781433adaaa3561932f0077be5847cc9371e4acf130271210a939954b0249b6d430c439a8ef855200d86cd95520f6b4fa7c36f1cf5fca233e5cc956b44d82dabac6a5fa261c139b879ac2244405762ffda64e5b92a3d3b4af3a9e4cc3d9ecb07fb57102deaa50ac8bc8a8df0760468c11727320c7a6e474d7d530ddd631d7c6977fadda3f24dd1371f499601bdbf867da534e07fad37cb24cbf298087efe48b9697c4e6c416196efea11c5dfdd30c31bcdb477788a3fd1b725ad0eb455e837df1904ebf09f885fd76509a3f29efe2783d7cf7d61da2f60eed3acf648b18452c4cfbb3d98d46a36d7d85ab7a3c8d1ba9e0bac7ca165ae81b11c18d82e5a7aa04ed3c8cbcaa7b022d78a2b895822538552b074fba0f3653be84a193ccd187129666c541defe2022cbfc4a5a27a752a8f88104e83c64cfc967ba3d6ab8db312f6f5e487bc704b075a77cef0897289fee02971639b7b371a9a527078add6f2040ee181882fb3ab68b6e8f033c6a72678811b1cdbcb277e675055f826c8109eef7a148c80fe22c9cd48f87297e280143f794859dd9b32e78dbf6d850986a37f7d40744c96b2246fdc17909b4364671afcd096709194043b31ef805d496ef85d546aeb0bf3d22063402b99b45fd4c302578fefa8203d0541fee977c90d0875001cff600fbee6806e9f8cf90515bbfb92f7bd3a4ab21e9ec399b43b117ddd83307e08baa22077ab58a2439ad68ba0799385625f9e6ec03587ad58b37dc2748bb4218ce30a410c09e9f056626fe90ba4cca88745ec7daa3457e0dec6550455f355af93c28f482d02e932d03b175884e4070932d67c076401f9da4d5ee06a0924dbcd263f7b5e62fe1f0fb60c180094a10a506ef9953377063544ad62671d17870e254b4214aa3465543012bdb808c2439e24409681296aa9d5c607b932450783b55f0cb3a4552a9f503ceb35409897328b2db2968612c5549f07624d8908627f9a23717a7186cd14dbdc4a5ef8da9ad79914cbdfed16116e5db0c605b491afe583178180c466a32dbdb8361f27f453989081935afe5cd55fd5683bc9fa06761c39e644abe41d3650bd77b760160e4ade371b13ef000d998ed0d8ca81a590408c8436c2e41bd20ee6a5c1d5090e510812578b52873d50e66515a87a15fb56939d2bb00414afadb1583b40990355e4149ab8785808fb4e424b6e7f546e4581fab7f8fb1121e9d7a90c48990a3433f0f6e0228b2e5c832e38a8a1055e72ca38fa42b1bff1f511787e6c93773185f29d374a5d6cdb691d194de577e3a20ad4a41da61fa6ad766fb7b6dfe68014ded9125e4230c2671910370b68b8c1281fa9ecea4b0a564c8e4abddbcc075cbd282f78f32f6536db52a6aff99a2c46f697923ae99a3a77d624ecb2749dbfb434493df67e79c26f3efe25aa9fe39a1b165cd7b3a3f976b2541f9bbd0ab9d6307f2b4bb5888710169804d64f86accce89054c0819fd187afcd69a00624881477a8b4a0dd98c316d2f24c01c7355b88546a6995cc658b361549e943b64a724132b7ce869537949e4c53beee39345a9707ae829dbb7e8d498cd087cbf505df2408b2604305ec626e2bc342e4ce0c0fc1aa64862177714188be6b2b82eadb3786a2a35220563f9650184ac02dae44e4cde5925f6928c60ebd5021bdaebe56e22fa7918c65b0b89609bbf1200f00643f855f42f4bdf4065baeedfb259898fe48e7c085f55a3ae0cb64bbbf4ad3edf58aafc17b2d6506b892243bff4b88a15ad276958677471d3e9d28c1bd26c09c7e2c14b246f2a884641ae7e23718c501f2e6a3cd9cf973805b751c74f19d2035878d7cdbaa2bd097935bbf8bab7299df4eee3711cf64278cbdb90a7d659539e29815afe3afc02366cbbd74de62434a63f750fb08289eab69eed3b88321f755c93a2c74745d99ea1a97a8cd82647121b77476b45bae90473e7629ee2f2bacba12f43a9433bd9f6cda7c849420b9e566004dc62db16a224333db2576298d9bb0e64fa7d8cad6b8f3cf04b98f5f6a8861690baa2db3623de672a72d17184fab816dd2db05e1b0cdc520b6af87e87d415a1735897b09a0c7792061ab98a477c673ce053fe61f54c72bf61ace4362fdf7983553cae05a2caa44689206c2760fd3d0327039422dc98c6d79b97f8d76ef9464e9edd7244e0ccc8f70c1a65d361eb9dec09c32e0b21706d3d01a282bcc5dff065b8c170f8e4a17a26076f3318cad62e6a110938957471ba524c633e60b4e20c6b5b7f268c2ee71c4613a55051ec3b52ffc54c205c460b52a9c430686dbcbdfeb1cf7d0f992fec43f9b9334a297689a03faf1291ca06abbab611b0bd3e6db24bfbad31988a484f759350cf8d19da4f9a8c36e2e96946e15709ad5a895d186d788b7d335dea387f25b572a0958d880ba677e533b3a4772abc170fa479347d4e08f3b7f8dc335109d8d2b77cffff203c6885329b7d1628165e60b114f96eece271c6d6087ff0226e036d67ab390903603536b760a238ca02b2692a228666e7b957775fd8c59b3d1a39f83bb1bd15d1f5a10eec59bf86ed9e5cb2e3639cb70e410e77cde059af019ce1158c3708cfec8b306049bd418af337b1b0654ec8d9c0f81b5aa8c588a600749d27d191b871e39f77ed3821c4bf8b7d55f4384a8739906d12a268eeff1aca2fc2a1b45828b63790cc08601db58f16bdbde0c4ed64610d1e68c196c30977cf3cf635ad00f5f758fdc1443a17a08415976e28a3bdccea876aa23aaaf85447600abc4614129cdfd864ec232e85f2391898cb1e4d223d30aff043902de55bf45d376945920379ba36349117d60f37188010694439b131ddd73db14488107d18f741a1c69f6a3920e30b74b49919eb9cfcbcdd3cf1f1473cadb19fda5210542fde97da4ba49d47ae7f57fb6c102c9c50defc8b6afe58f9f793ea53c4145b6da363c897374a4321bd5b8899a0a3bda5beb73de850c76ea6791a4671943758260e37524d3be8c253c8183bd414fc43b441161f9870d588f94bb1647dcd339d19eab9a380ac08b15a7925d03f2b626524826c00005db15e4ee9e9a2dcc1b1a0b5a37b5ac61a3286a22b14f43f467e8892ed399da479d35533ce33b0132409f985d2ecd68208fec8c76865f65908b9247c0bff371957c3e434831feab566d51e16f39eb548fab5de46bb897510e4aacf3c492d6ac37a0ba1cd831ed1380c8b64c57001658f62005d8c8f0ffefb6cbbff703f64b7374303045b58a0f22f8795842df2a565c9c156cd157d59e28cf3752ba459158ae96552928a7e56cbe05a9bf2ccd60b348cab31838de107ce2a3b5eea4510b0845e3362c2c75ea0dd0f1807170ea493604c82293732648a106786e1a1df10d6021a4fcc1b9e940f9410225f878fe8ee678de8965ecf726167d978a5e8deb3f6a2820ce7037c99038f781c1dcaad1d6cc8d541014091852e22d4830425c08482d43a1d5c20ede81d3dcb67ba3702acaee2971e12a3453730d00d3884ff210d1b15b6d383ea7f0bcd1d7e87cd731d31156357e212fd46e31a0dd7fbb0cb8cb81ff56cd206d68c7e83acf60ebff5492540c9ac3fba9503236a2ab95f1021401011e1e09b5d5ba2aae17ae67f1a443303b163e8895221267271b545d51b76f79f81699691e0006e2b66f5b43b64d65756d7e0b15172181d5af13bf1f04b532fc0ff0b1358476b2b8a74abe3c61822228934ce8b1aa2f05437493d4233284c352eeb34db40ebd28712ab0bf9c1bcce2135486bca676d3067b1ea27bb001aa8c433c67542fe55fced8e6aa46a90bb10dfc5936713aa295ec4356499c109cb1f397a114b0ee30e40eb4843f3bad5abb0bac4a63eeb656fd2064c48f1f8929216215c7c3483918d24fccab7886ee2f7245ebce161b62bc9408a60f7cec64d1804086537c0458c5b3f8e9045b0fb5b35d21808d56e085f9e10dd0df18ece9bb58f5b2f045cc925e0e73d336f3bf490d040835302b2568386c97acde6c055f1030e961442888310c6c2752ea457cf466ef63d05f9dd2549fbe0f00b27f2010f791845bf72c207bf6547c2ec85b2ffce6a7981ac1b5cf8f565edb950359264299022e67b2597cb9454eda2e773cc1aab4b311dbff7a046186d465337a03fd3e1d0b4f4f1db8853220e2a91ca0f01846f99b34dbc0f55a1457a914a1be848f4cac344fd9df502130b09951beea801e18dce86be1ad2cb7eff0644fa978e4c2b36e0696cea02a39f91cfa3adcfef3b96786211db76e2905397a8d8011502c80bd8a088cf50a4cb6d68d8ecd408351d37d1fceb123aaf42a3b1cad0ea2ed63b0b029c39918c3c07e0f2bdb70b122a253a0ce7791ee0993103dff4b6124f8913ad572bd26fd738e7bec1d6b8cf683ef2119bba524e035109d864aefe15f18be05748e80996dc3bc93b58cc68ad84d3f25300fdfd2c0d372bb602621f61bf6f3fbd5a4945c305a54b0b19f72d01f299b472cf2ae03588ec25111bb6a081f3a38033fdd7fd50ee25db9297ff9c893be0a -MD = 55851677287615c9f5cdd01c36321a3e4ee0adc7aa8db055a7014b1eb8fe19b09d643ddbbbef874f8c80c6d1e30ab22e - -Len = 50128 -Msg = 879a4e19effaa5f409f3285b3e5736c96e96495c91d7c1869f47e306aeb121165a509be66ae1e74ab1fb0daf31a3d654871c47b783fc684d16854a75713147af6b8f8c09234ed5dbe79778b455a1a594c07fec5cd63cff827f29ba09087660b18000286b626af80f756f7051f1762af2e3674033d2be0f8fa3de3ba9baa7f484624a77f26f5cd74f222afd6e4c4dedd4b67e4c24c1ab1fdb4a4ad63dd0ed8990d9168187914dfa01b57127f4af4c77a303691718e92ab8ce3b1592ae926fa93cad0c4f131265ea8ff7ebf7c9629b4fc890d3a9f5946461d040e878e24856dbf2a5d3e87c38cb2e5fb04174d6ad63fda925620ba50880a2491f6b8ec23ac9a81a8a1454ac4ca84edba71aa703d8cc0ab08cbe440e8da703a1a145de36b0f1961a24769c899523d369a61f96392afdfd448c905c1a6d010d408e1e7027f1f52f5b3ba2c7fd5d65447373f84b5eec1f5eccec805cb0eeb5478faea04a7b46fefb45973fddefea962960d74cce5b6759b6b275354bb75aec3af4c971761cf7348141fff6e74686dc0b989ac32519e0d48c5def583119f7cd6cd8a639fcf04cbe49b53d6febec7762708384065a7fa2b76835229017bd0e8167a40ea1e2e18cc5db0a1751f4c8054ee3895dbd7574f42bd2a2d586048be62fb3bec95032d60170c0a9564507c27ac9e912ec907ce21d58530cd2e2006bc900d6909ff0f4b6f1e87ff8c2f22ec21cfa0c86fa2579b0666572dbdf4b1345fd1c5a8058262e6ba554a061220170b0350ad34d4f2773c6177bb877c5694601cbaac7f8bb9ceadc65ddab4b3f19d6740b20c6cfb33c730c78c1ac494be5a0877bd2a35f91fa2ff179ab291ee2e366f7e6656e74ee0c806ad060d6b73b6729bf55be781da2e7069228e5a241d1062a1f100152a5c740a2c8697fbe2a5c96ea92a193cd9ab60c75a7bbb49c1ed52b2ad5d01bfbc80880e10e8947ed0b751beae6a67c2b3d951187187a3fa11cb5fa6d026ddbef477773462479e0eac04f9d32a5ad9f1970069d41cdadaf38a33b1afb8c306ab888ddc2d8f281713db3b2c5c8b5fe241f9bd358adaf9c2bea1b2d34dc5d61f0def50115a060e8226f4a653bb600e134c524c2ecd2a48fdc3dec54ef195b4894e7f4ad12a457f81d07ef32a6046c9ef794749cfeb895cde9bb7f78f4b8702c7f5defa764eebdf7878d09dfafb8e37c9413f32839686b9f7bec3a61eac48357d9c74db8b1867c2e8b890035fddc4cc433cb093042e90c4dba5786d67a427b0fc9ae76a8a2727ae54e843bfc39778ebffe421f7ac443621fcd84cca04c3c429d7799d23fdebca164fb0624fc0a9293b21b029bd0657f545cddfb728707b9bf490c10c9450e6cd7f2b89522fc193442e8b293e7f8cda4c94e1145e25354c2da5ab09bc381d98806d8adbb9dc60d6583a8ec7b69baa5baab3b92e982ccda5e7b1a8ac328bce81a155f04fffd208f2d3e39f0448be095cae16c876fbcba42958acfc30f60bee229eccce2e9abd347955be4e775b43044da53291960f7e4336fefc28208d34f70be736a71020da7dca4c3f1f9974b745bf5e9ba70429a1356f5923bf034e9373ae09280d9d18c63f7635ca84d31ba7281208b66b3a00f0f532e5c81351d0b3de797315542df91d13fd80f500ccb68f35f6521760bffbda0d12333de784b9f2b1feb3832d3b282b75d0dc5335deebdbe9dcb93329fe90c8e78da0198e1450fc78ce58f5fb4d4c8def80a64976920219de25ac9e298e564a0f15dacf89a93c1dad48c1e240ecdcc0eb9d5d5c558ecfc56d61babce1d7c2d9fe4b41d46c8bd1f2b9fe9cec90923f50e4778010551d7b6b22215223e5734cf54f8e53dca964b8f8496028595cc60aaa84cfbcf9f7c6bb7796e5114796d98b284d6faf3cc2ac67bab60e12cd1800b55a26d6426da022f687361d56bc8882d3ffa26fa2693acb64a69a68eacc64cad5dc554bdf0ff0bab2f67a4ab0d73d07ddc7d8feec06845a16486100febb959cd2ad9a90e1456be68751fdfdbe4c26c0ff2d4b9dda8931c1131ca456ed3f5cef324a6135d7a2744eda361b96bd6fc856beac84dcfc65c5b8d19fdeeb34bc1d4a8b3f33bb40abac5c21ff6da65cd6b421a2a21f3cd020a279e84e6b2e43a6493723f8ac91aac56687053a6ebd0b055cca31ca752dd44e7abcada4e3a0b8a2732dc303164984845557ea53894b567034a8e2721130a74390c9c83fd2e2f2252da6beeb1b434c6cdb5747f767c1bd9bde564b259dd597a497599e7bb3559ea2db2a9e1d262f80e37b0db48264c0af0cbc5ab271559d43e5f0c4b6e50f790caffe31d715b16ec08cb6d3a6811ab8b937411eeed1e2f82a9c3f93981831ddcaa12944f071677179dd0151947ff42a4aa01f2b26c3c066ba1bc65eb861d4f4572aceec809c92e81b390cf004db8b95f1eba8f810c3686980f9378eae7e734d40a16190fe13de3323351c478e203b7c4d5e711e235d65810dc9159bd0aa675905a983cacf53a3d33065c1b086ea9e4dab8d09f5e4fe224dbeefb31ec5925b9824b797f28af88e48b12f9fd395973e9a9afbd627cc22391022f1c27003a2ba9b0c3030b0a76ee8142416f92920b266e39a3f581c4f661488c863b6480177fed24ab7c08dab135bc617a08019bec8d1a937ac125be5464f181da9f0ff457ea2ce6ec2d9e21ca253ceea40a73dc656f96be1e6976f342f333ea159151e462340efc6c5ef3652886aaf4a9be0fdedc9389c275359bea29d8b6ce1e5952d9a0253d70155732313320ad78706cfe28bac29ca8696cbd2b72d92335dd3f395b79845e4ace5f810a53bbee84e15c674268c47777e158033f83bf22273a8b2ff0551b1c907ebf087af01e141fe4d573b54c61c137c43f96adc6515aad1d845b229cb01c4c0fc0f1087212c85261214a08d06123f0fc6a9dfda15974ce6e73e678b60c098568a8613d415fb224408613c35b8b44ab702141b87e9d179315a0f77a0bf7894471bf829fc5cd799d694df76f54a8cd7008acaa65c4e7ec02fa53b7b103394490124f7cb86723c6c5c5bd1d9325806545ac52ff8cdbfd9b2606d44da40799e471339e77108d2b40a53a20adb735dbb534445c69b52ba7cb041f6ae2dc7de00eefbcf59a2da1ab9044b1bcd163ec816444b8120f691caf24a62e5f9edfcfd66c13959c0d99096c5daa13dbaf20b23a1b7df0bc1a2f16dc50131cf9a8376343a6e4a7dbf9dc2f3650e046c36f75efcd82e8d5a2b19081f5f453cf81296ba3ef646ad8fa867c79d111ed34bc3aeb0b03408c4d0cfd13c5c3bb6f313e4804f6a24dae1140db03510447d9c31038096ea4fe72414125404a0e4a6e297a2e89c32309b73bf721f91e989aaddd059057817863a09a8a529f789d4c589e7b0282743b418e3c657fe44756b47069e56b5daa4618203e2facb9b83a67357a8bed7870b29d39fed21e4e36033a2a4ff6f0a452d8c4fa17785a1570ab430ea4f017f21f50c4c2678825be526ad7e3778148b3e2f410340cac853b0ab989ea04f2a778e9dc5f3061cebdbd035231a4c9cd9a12c063a4d8041554b4ec2ce1d282dbc6923620158cd3eb0ed2b182f0742d240f4a56ec27ede9f9f00780ccf2cd06f19bc96ee28fdda4283f85c4c3bd5c8bcccfe20b59427ca2a180bc2c6165e3787e4fa4f9eb742bbecd795ea4dd4063cb0e016246719c8c17552d5c5ab2e11cc0c809ac3f036d7f0822e3e6ba982091d532cd5271fbde25305d1f6e71880f81c618f267a9f122e06a6ea6a46cbc05ee91805c3bf3c0af4fd5007d7ad9ab971973b5325f9d7f3a56ccfbe92023109983e740d6a53488b813ee876f08f9e320edade9f01c84735ee9160fd5e3485d8157c0b963169c1aa078633a1fa13bf852035dfa5424c79635a230f39274416b687202342918934010871c61b2cc06b1d7656c318701ccb0688803ef475b7802f4dd97f9533281c0b04701445312c3d7541bc0d6b13bfd899ea3754a1c2153eacd9f655007edce6327c0fb2b28fad832742b4331f958c1e880fc6f4e3a4d3cea9cc056816dcfe2f11efaf05d590cae8adc9fdb8988e27f97b59ada41c9679acc094951d3af6225323cfeca230fd0ada7377e72288661a15ce6869c6cf0f8d556bb413d90f22e00ee2ad36fc572cf3d512bd1ef541a5b8e00bbc69f17d88755515bb004fe61bad9ec8f81c98ba990c74f609f3a566c5aae4bdb64c98aa99c8184909f8d65218e19f51411bebcdd9bb16a80f03b76a5e56904ef67040c8abfc3b90314c00f5d3229d1618a38a23579656a30cddafbed8527f59ed837e6a37982b65c1a85433b2f6f481df41e83dab149171a3cff2f6bc050e491be4a611d51274442b6c448e30b5521f05758a8f3cbc738e648925848214c9a702124c320d0182b5df265677e51422684bccd59a95046973cf67bbfab2d83dfe20aaf54d37cbe3356d550e834869e1d7e2a67de24c72efac250a2acbd6e5e7a8f7fd25e5fe08124d5676e132c34d0cf89aa0d7e8bb8e62a235def66a66b4335208b7527ec81cac581b1a52f8fe242044b43a78206abd8ef05254b378dac9bd63d3380f8a1e9ffdf03bade8684195b846cfd1e32bf296b1011b19c659abacf268d81dc19a69f8a3a028b025e3460831695e058d6dbb90757ee08cc39f71c45edb97c6fd2242bd19e272af700c73f22846ef53eb685e4148a4432c1fbc95a67f3682c226b43163ed31aa1a7b4643ea0949e43b81ae331fa72bd3865f33bfd9cff439ade2b2ae637a082f8f8c233e6660fced2af491d2822d7ff219e69728c4bdbf2cd895c022626cf0835d4715dbedabca5ab098c5c51f281b2f556a4998fde4d1ccd0c44f25b72265362220a0a4f6565ccd5b02bc835d3377fbd74edd68ebc1e69a3502b230f836e0c86cad5611f70d0ea588a6e885b2ec30e80e08c51124d1683563c5bbcc9c16edaaab31a8bb861c6a83d819cc54b69eb064682c934a2f9fc0feeb71be61294f066d5c721b0a2a10fae8b7cffa68eee780f1742eba4c7289ab874abb2c97164ba570fed31f6639973a34a62dd54ab2331d3fc083ccb0842b623efff698c6e999656600d948885b0ba2f831d7ff62a72e0f7fcbc02d1edaf19fb679b8858919b4a0bd110908c904dabfb3d942db594424b26204686defed78be6e567575463d29e1d69dc6e2b0ada10af80af2fb970fa3b066f8e1018c423d38c6f4b1da96ba75c35315a768c7dbeaff35456cc294604783ff17ce8aac6f9bb97102f247e31804afa2f72efd87061506dc2714d2d9fc7ca7aaef955ba8cc209accdfbb2fc3ec632156d0d23366c2bbdc8d1e8faef01abf95fafeba0719fe78675b097104a19e2da2df31158cff884bdaa8aa31b94f718cc95fb3c12f686cefa9ac0eb86924a3a0aebc768d7ca9cd417bcf38bf84706760dc59ad2f172c9e12dc305df5bf95a388cf7f3f8e850e08394a51786d92eb82d82969597850cf187e697885cd9a9d04327f87fabd2894df9fc0dfb7d057194a5f4b1f37118ed8527efbe504846ca34c2a2967167df9c6a9e179ea959c53922472abdbc4af03c0d2b0ee1658deb830f1fc67ad31655b2bfdbacfe280061aeeb79ee63f809562212fa0ca8d01110fde8c15b4cac9f7df2d51685d5805c21f776a4064bb09692c71bfcb0ba98befd60471029b305ea9f8533b868ccba544c3d4b313b1cecd9ec52b099c4c0c57af9d3b474f758e5df0392622a1e8adccf2ca7f386557eb2baaceb59390e61602f4d7eb8558ee35466f042e8d36fb8f1b7075ef50d1c1b0c2119bc9f44584670c4428ada1bb7fb5b67b0bd4f1a22fefef32689d92d589801f67cea09226816fd211e1fa32e384800ca892a1e6901030d6bd151284dd0a099211da0203b067a102e29649af7d9744d77c4b1de27d270250750de69d74dd9dd8a44046af8fc1aafd3ad8247dc64244a56a87c16bb5eec4fafea57243297ebd419393e71bf119de5f8f0a132469f02fe507fb04e8f6d20924be8e4e2c6767f87b74377bdf90cacb7853be7e49e54b6714b8f780f0ac7b4f6c392af29fbb23dfc4aacd7d40fb6ee2f62d67fe44a49e8ab3022fadf94334f83ff30dd843912cc3dbbba854067d70c5477098fbab4473fb5e87e5e49957a9942e70a9978e85fd552f3b6aa896b37ad2eac1c40ef421563965aebcdd275643c3a6468098f7061ff41d9e86d35829d7ac6ea56b90a5e7dfd566db36f049db9dd735c91555039e0f3145497f7ce13d21a23170123936f45b5fe0b1d6b66734127f6b9cea643aba458d34e0c6fdc889f364d1d63a512dd3632941b70e98060c4bfca616724f12f74d784ae90fee548ca764de2c468100f181d2384f513dbcd0950f73ea4f6e12b1a18315c69cc73bb1b812a506e93156fb31db030f40ffe20d9808636cc459b095cc2e13fdf000d495c00ec4ea84fa764cedb4506b40571c3fcf77e332938a82f037d9d413cc33c5a539a9cc3b9c4505633fee9ee7f1ebd1c3a5ee71c01f88f07d7f36c49c63c8656c9f84199ea1997ada82fa5d09b8169955b5dcad99dacd8f79fc95640c79476a587c2e3b7837704d2f61680945158fd94269b2e51457d0c6925aa630c85f291af529f8a05cc05202be55a8223e9c8028364c11b6e4193b2c42f3c9c96497f61ddf5373f6b0cec72213ca4b363abfbffc9dd769917d8155270862708c65a626d95363309d18d53831dc59b1c3ddf197cce5963b134532b75d5f214af8502c43d40df3bf11f9563d98546e8c499cc4901faa0306aaefaffa25b3aab9ab987cd5a47b6f6fe3d6d43fec28832b360bbb417b57984cd6b15b6616a2893d04b32a44b10840d38135d1d7a3d5322f278f4824567ae07e054ec7b3a6a827559244b7298051027a78aac16d35d6e6088cbbfda14780562ad51c774b6c311f83e2a1a5eca8d24ed5488a4589389a3937d4064e40b50473d3c4bedc95cdd9dc58647e691680f860746f68b0b412bb863dabe2acab2573c3f9328a7a3b420ee833962f933faf5ff1c85bdaa5666aa767aa62f5bb191f6ab11bcd23d2a47f5cbdb6063996b08a657d41ac34962896ea57de97a3dc331935d5bbf2ff7859cc2fd7502310f611b8a56d90cf2b05732df0d17ab87192819981bc4a2291cdd3cf04df827b6a33eba09c4d06331265cea6575eef53e3608d16babf46fa7f659ade8800dd7d99c2a6e8b68642867f4993768a7aace87de8ae276d5942e90cb227911615b1b82444cbe780b3b627e6337a45069f43f4a57d6d31f634ce5cee45f27d2b78bfa99e1cd323875fd195db95eb68584744f6fea152cd01bc39e488939409549447d07bcd452336e5355ec3e35f76fc0d106dedf6f76f0c7a260e602d84bc1e02fabb21d8aa7d2bee51f133ce5ee76e4b36c7f7e0b37e72d9034909663d0be44f38c834b17b87b2c5a7ebaf9952303bac48a3a0e12fa1c1636202e8e0258f33d39286290a20d97825a7bc9be6e1f7c08a967f8d9ab44f9493b2fa832df6aca93a9883832532f8f868f1d28d398694b970d0b9f25ff9fe5904966e6ca1f8eaa0deab3eb7a53a5c9019e6cc0803a89d62f967f193b369248b105cfd19eed4cfb75a5b165b0caf7afba3270770d7d088797ecca4c6377a68b7519714ff66f2d2691818b8c1ce0aea87bf13236c1886dc599b8f422e5ea6114a42d544919cdb8912a27484a06bb511b0a83b9e6e68440f7fba2068208b84e4c06e881a8503076a5073ef086b586687230910d6dc2980a87865107531509f29b62f3ff52e3c0edcaf26f8c2872677c14b5c337b59ded51dc026eff7f5404d76a82f5d6311aa4a769b16222178586146961c03ea4c1aaa05e37a0f7ed0dd2841f2c970f2c3c052ce80dbebd3d360cb8d9fc312a2475f87c75ed90f585889a81242981b12a930a02b1ce2c6281cd21f0cc4dbd041c00ff6f89ebe6042f0c8557df415ac41565dcb32abc531bcb91ec45aa1d0dd373abe60002fa4929d3e3bb8dba3bcb51d4fba2c7bd9edcef03cb963edb34c89f13bed6b848e2616e595363ab1be17b5e4f9d85c4d13e6ee712c34664c75a9770e381f61dc36bd7daa9a5a6396cf913f66e93ad34cd62b209dec1253dd757224fcb3b6fb9dc5c5375ac21abc0144c3a1e1924419e1bd34f5f500d5b5371f21043b3366814f97f7c48480e9bc87ba299e03899698b2259eef150ee0f2efff40a5583b80ab4849afb5a66b69dd709c3d743b33a4f824abb37c5c7ae6a54e726b78c230a7c23e37677b4ef5fda7726769d4f724f180bfbc3d1e59b93934f934dc0f07c74e7e980db995cc952792f3a84930d5d20efae9d376559b6e6b2a76934cc89743d738cc191095cded7a387adb660845df5faf498e09a27feeef1e2d3a28460f4af4796105f6ebc14358008e7d2adbd58156164558619595df5768a375e8f7ce5108c8fd40e718255b6373951a021be37c94d873af18af7ba416926ff3197e52da969fd7466b9b888a0f1a351ea6591e359e6e3b0e89307fc1bf33f92e341a4b6c2076a5a2fef65953cd5cc5076203e430d53022035df930dcb3c5c583c37c066a38e5ded31ba9263d20c3eb70dfbcb3e2cbd6cf09e14a2d4996b05b90421412793255f9534c346dcaabd81ec779e42be004ba78aecdb3d39cda8c31d02a630e0dcf4f7baffb189e70b111b597cb0aaaacf263d54e7db6b24ae1d1cecff6f9479c424adc45b2d636c3f309664e4da0ce9e275b6b856bd347d85ef9a8ec32475d994dd091c10dfdd548c417a7776c36f658161981c0228a02c9a49c56c166cdbea93469428e66efe853b6c4df9fb13db05f4126deab4c5b81a355124ecc0efcf930b88d551a583cfe893db99523c74 -MD = 3565d79d701a8b0dc31fb0d7eb545dd3f968a7e23b8a5bf09695abee2f1c8370e6d4098b234189c38bb0f3ba2869397f - -Len = 50920 -Msg = 146629e70b37d8b83ee828e2b001cf55630e7c131a50bb8963b3181fd500870e9754037122d176a04793d9b973e59c7f32b54868f24663f10a259435fa5e07bef4ef139b9c7d1ab20d46b1581c57011fe0ff6def72837659f113db27c9fd04383521a08b03a58e9998eaf9e833bec8dd76d335d2226fbb682266361ecb46462362d1f469deb098fbf065fa904182b760fb18e6368a73fcc7a404ed42869f942881e7555eb60601811ea1f979cd0a975177b8c94533f5ff1d7fd748ba8471b7ef9c4a0c92120f90d2298441ca5fc02f57f29a2627a45f8d13bbc68eaf4d25781fbae4612c7a320f9719f819ac7f0b491b75a6450465176e5161b8094867219d60e49c9b5476da4477f6e4c847b653ab4407c46d03ff876a7e7997ffae5ccfee5c215a04348f6cf91bc92f97c28b011e7bb1dce84cf9154942094ab908b49635b87906e2f14c51f42a9ac3ce46877b6a687ad6fc08db2bd2471bb97f7ff5dd381ff4897eb636f1fe4d6f87b5fa302a57b26a9af25f2e30ce32b6cc993ba90ec0379bc920a9d3b4de2c526393071176ad0289111278788c06aee36b4e63579095a875af10f2ae035e6e4a3fb294afc833ffe021a37c44a63f61a97ee72088cb7f1b8a2395ba4c4444bb5f0358ca9486b25276b3ef9217e844f310edac99c3274638e30ef82937e159bd9a98ced1471af3a253b03ce37bb9dc0d20a0e5f7900cb1a687568266f640651902e45cd050eabb9880fed397f781ce57e27fda6177e28a0e7ee5789a11cb307aa0d049ef3860d5dc0487fcd514a9e3785d73d30001119717d1a125ec10e881867a44df5885e20815e731fec55897e319996217fbb501a16a8774d0857c0121e59b296430c2da1beb32e623904db496e19f36ef7b1c1a6faea845c08cdd7dd940086521a274afd708ec8db15e7b68c37976d5a3a8bcc5cb8c3dfb3e2ab9c46f3fcae25ed325c904111d0ef156691c348826297ba920687bac4d8092879a3eab89ea8663ee5c906ab1cd512ba19f36afb7b818bea7cd6d48b5e0bb04ca075357c7703b7719a26cd08e053da766a520fdae338cb6c94d3afa50fe94dc1c896b39a062e8e37c7ec5ff50ccbcacce0440e6149f6ca93826395924b0f361a4a7ee1bbdca75f0417803c0a02bb683014300319105a0e01be3d02cdafdc0dc8be944c3c5afc9e38d188ed92629117526eac7a8cf6c0fa39b09693d19eee395f8d7d5f9611ace078be7ce1289ceb6c86681fc1173dca33ae0226b528a8a45d414fa098739126ba3606c2c3571228dc4e8910935285d43ec11b63e34d4d9cce106d94934f49f88fe372f0e08882e7eb3d5a155dc94f8d702574b4aaba0e36103f7fcfbc73bc90e6136b9dd5573f972db543a48cd5fb448c4d96bf67f96b1ed840fec8909b599e314859102e2dd8b4f868ee34ad2329a7c7ac09dac775d4a56aa753059c20b16f05f4d3fe3776cedfffaaa24c3b1b5b05c6c336ad45c9eb686be5250d5b9e4491d8ab64ceadec826687fd1851b338f00d0e25b58d4f600fe6307cdd563b8e93853dce73f7ede9a3e745f2b8fba206892c1235ff1150d2c29d7cf0f466d85c2ed789e09a0063e8a3e0ae0dfc90940ea6c157868bdff69c93fc95c402b5ae91670751943f8ecc73f2d114c16bc6e5bbb98b6299e43fbd1804920f8860d92ac8dc73392bece9741621373e9f7ee5238831e8a7e280b6f0ff94dc6e90c727d96d0fc9954a1aa6f749af91700abe91ea0eb047bbe2f9dc4e9db56a277f8e5836f87178ea61514dc2790e6e5d85935385b9a547033da826328cf699cec73eb0cfe5a1efccf42954624ece2c5bb2a580a313a1650235241b2947c909c8ea40e800cef1bca184fb4153155f59fef46dcfaea705005d7be621bf48bd28aa7b4d54761f115e0c965fab11773285bbdd449724de60c7697476d0511a3384e7dcac8c9c50615262aabee839def82e16dfc25d92344518bab15ebd8b46dc8d1580f706e00d62284824a18f18d710b1947e8fa973431282c5a4f64fba3908cf982ab549fd90a44e21b690064aea0ccec93bd4f1448569741ed1e5ed8a7b58caf42c5fdc21a4a83283b312f45c725cc4098a6adb7275ba9b2aca963d68784cfdcdf85f141893de83e2bca2cfaa1a714ff9fc99bea98e76367df19fa5d0da45d66a214ba82ef8c7a0c335b7fed04cfaa0ff04ea11565a2cf49ce95acd5ffbe3e37d39ae0ef13df427a9a0cb184b745985ad35e479e5436f43ec146ffa626797b35ba3ee9eebfdc4671aa07492984b0e6c6902116ee2e48da2fff537d394a7e1a4a9e295fe9b92e90d7a971cf4331b99a3d6ebe956dba838a05d1e5aef43374265dc983c947ca7b2896e075cb3a8707bea6b65d4d83c28c0ba67f241940a804a4558173b070ba6c14949738c6754e4359e8b128c4990c0e65fc5137468672d69e1c0f219bcc51a85ebb16e5485e4e1474eda445841562afa1ee8e47bd2c59911b99bbb612c357d80ef1a4a2d75c4e23169cdadc15618a17c663807b079c25de24b4cc5a9dbd93a32a208a97fdd7181747dd9a16fde34cefdc456dfcab3c9e64c0558c34c522ceb2bc2f11ee413772990f982b1ac60572dfec7b9ef131768cccf764416d115ad0accb067ecc2be5255177b5d611f72ec28efced5b8322b1b6bdd1c9342c0acd613a608d1c5b4447f9e6861de32319c506a51783ecda0454e5e0576cad9a36e3490482ac32c313c6b50145b69a77b33404cb4225981d62c9e1dd9036f3df1f054fb1394b072c21cb2349ba6942364de285a987bba875c177725b850d50224d993de98d52e4bdf4bc0967ef1f2587703750e7ed2d6409abc660023cdb0a8b4709d95687a9119e16023002ecbe8993a29b2f2c7c631402a71e727bbf866a4495bbec9e2e38d6f80f0660c3b72fb7826e76e8203d4500873ee7716e16f7b872bf193d698be87bf3652f60515a5bf77b5930446c37bc70c1f689268247173c404d899660a49f47b6a2e4fa56dd2991a6ed310bb873aeabd75a6c56605ccd3ed4c875bd2a8346836a4d8ff4774680cc2cb1e205abf705faf2eff9ccb05c000556b8447b7030c67836ef97175e9f4af1352da9f9eecda7a53a3f964f19509adaefa35e98dab1056b430f642bb3f06e48e8eaefb129fd7ef4d6d1aca6433f8205c6132bdc0f10eda7b8355ef81d3fd4196e6f1df3038d702eef2da49ad731a0ce058f130fb8556573beeaed45459664acef4499882487679dacdce4f37d2fdc7cd1a07ef87c8654167db479dcd3fc064892f2cd3835f24a873665d679dc3f1e5955ccd46004ada4d91c1e6a836e7aa2377f001fcaded70135b450e1f39d6c4eabb69e7d0ff8d13c04c4ad2803be1620bfdff6f908c63d73ef4f266c2b67bb54bb1f9be1cdfffb04df9ceb1b246cda6829da5dc2b8962c8afd2f6de1e7e33618d1b64d6862c132e4b1cd5fabad20ce62bd97bce2a3f5ad2da67bb0a7f0b9e48335a33b7b95e77ec4c47e91416881f9f7c23f9bc1918cc644335c74260e90cd7b2e0fed802f19e78c5ed80a431b38630d82f982c74a0381b8ecf943c60810fae90522ece1f9fe7624c803511b8fed148d43eefa5c9501e66f197ba4efa8e272b60303bf04b83f32744a26ee2f8c4715604e458ae83b2efc5202092009b4ae3dc86ddbee53378324652b696ae9daee6d6ceb27bbd30533cb49efcc3e7cf51b64098ed102343d7352ddb5f54cb0408b249b61bc1485b8b85b3d27eb86b033d2ee60ad0e821191b7c6c52ef21ceb87c643d4fa2b1d661f64b514f38f800e367be3b411b9f651fcf68806df8863047746d0fefc9d5edf01e0e0b89be0b5fcc5bd4cef03fbe65c46d89e8610dda762d8b4d603b039605625d3e40f6705ace3aa4030f8cbfcdb9a3707122f091c736d72b75aca5e28aa3454e6ca039e27ed2cabad97b7b1e35d739628ece8116b4c8d0df8663b4e91c4e256c1997b8a6d013d91ac8914fdd9f24f2de6329871f2bc2a701e013ec79d37c6f30b595e71006f8023e40ff7f6052496c2e6ee2972db4aac64d234bb13748a4af36d12969c07bf5b2bfe3048e5907ab01ed327825a4b7f7bb1bc069a783d45d51d8ecd0a53ab7a386fa1f5ef12a17c050953e68b716ce1ff1f837fc33f21f1ce3a1792a2de14277eb97664d4c561b3fd4b0e322c0166faa175d0a71faf47159f12af674684694e95cf2588e046f7a601abae134d506152c77d4a879412d739af6dff56de8ed377e5795566f9dc8cde77f2d891d6a7846fdbfd9a260baefbe56613ae665244792bd681ae0808d148e1c9e836b5af4ef7db43be678c6dcdd9a22ccc659f8aee84f1d0aeda75f66b52395d557086c18de31e69885ac2a0b599f7695fcc0a6fd41b523bc77eb5a9f3d36d9d012e0cf2ac70beb3231bcf8eae646d85958aaee73e67d57f9545d10bb0f206f0b417502bf2c5458b5651bb1d02628be8364894db738f0204e0d4d003ecd88bbd35d35955a90b3b58eaa48f37f7bad9fb0aadc234bcbc61326fd6ba78edac846e4d0b305617692681a8be52c3d795df24d86242d861167b720cf19754fd977a6ac467db188408907055440ca9e81a26cc6a0e1cb1aac4d72a7dcd707e62c1f419628e64813a0f008cbce1c5d17372355c865a56a6deeffdc48b134cde64517ae3ee29d27b80a7ff3da43b8623bfc4943af5eefa9e47be76a6fe6b345c4d70943032df2eed9df814ebd4fa56871639ccd07e710f832b5ac93a9e7c2fe06345cb68f4597fbeda29c7fe15c73ee5bef96485eb8c9e3cd3ea7ee633ef4552f0f9a6f3fd3ecdd87f63a0de2f4a4525002be4c003e6aeb187971e14846b7e9a3ab3ae3915372122d4cd28f4ea2a732f24f7d4eb8d2847ca8f89302b5a99e3a08a9c69a303ec82842090e6a60e0fd0eb7286bd6d52f9716f32e73c937d217b4d27dc61979104f8e6add3625d62a36541320027ae1a023588b9d9cab3b5aa4f875b9a1e7e85288b30c1bf2582af8b391aab8d9816acea9afd6c8963f5cadc65376cfe26c1a8ff444aa57cb67bbd72545c26539a0dd25aa9b6931c8ec08361c746a33103c6c2322a1da1319db254febff1eb7db4fb52fa699b76bdd47da9de7d9a485b3df79b68458ffc06638d3cd781bf42316f48f571e2955d92bc9204fe8d1da3a35abbfa4a9e8900248f763ca6a2b07397515c83681c8a8fc3ce685c6601b5fb32e479a97f3cf4f3b3a9d41e132babc5d9e49fc48620645579926779c1e04c9a30639b6eb028b61eda3a0fa8c52397821cb07a8074f509f7dc91f723b533c9c6c45d88128568b9c9c2c98fa365925ef08b3c537ed9a363bd13528121ea0114c8165ca85da506e33c93debbd69a81e7574b1093875e3358ee475d6b3c0a5215e84fe76316b9091ebe7401fd0b0df61a0187b4a363abacd2d49f3b1f3cba2fb46d97872107687a51988dbbbc0866fcdf3565b1e9da6716b8b5447303e9a49ed9a115c24af65b606413079361964c981e3a0d8dcfb33a79f2da5d8d810a70aa6ccaf22346ac3ac33e750a12527d67d4bf59a8d3bcb8cede678b13120069c6585531552f7df1acacc906bdbef88560b7aada5e0818afc84c01108e89e8cc4cb27c1e6770588c5921ec104922bb76df49c80556b64a61d3cca7b0f57aa0fcadbfc9d8506d3d47ea2d8fd9d6c304178b93ff21b964bc96956541b4706d92c18f8725a937ae95e807d59aaa8b2b39310d9c3878ae9bd516b61fb86429eb25e29b1376d744bcc9385723f6cb90e1c48c0c6d5c505ee2fda8df02f208457bc129786aa6aba11e3fff831e89840e6d0bf0310c51f2f1c19c16b817d8e8efa6ce5cce949b6d735c610532ce3c1d2d587825248301a68ec01a26e865524c4df3b444479a3f65e5ff96110d3cf8dd142871f28cda52b45d68e0a118f4497b87eadca9898378db1c8e45edbc6fa30eec68602112172e638740544eefcda3bec613ac533c5730164391d85fe66f26f6dc9dac785d447cfc34d1dff716f74a5d32f78d09091f4e5f8090b63033456add0d51bdc0166824c78ba1ea62347a24a0f21de89598e2bafefb1447284df8560da60bfbc0e48c0d0cb53adb58f25f1bce2f0d23bd90a85c3bdea4f30ed990d1cdd054ce4270b72113da241ba1f8ad16311050a84a99791c5d4ec922ac8216c564b3b39e0c61f1472320e51305ed6cfc0fbe6ddd035d5ee2ae750a3cc8ed91191b76b0d3e860426786b2072a4c79a5b7b160ec2cb2815e96747befa92bc509b53a42d3d59c15b36a82b612c73d455f2e5f1f56fc1db08220f88800d19db08781093ea50cf0274b3660558c54a2f9a249612332b40d90d16882c2c61de5561165cf93ade1ae3f13b468b6ff38413d76f0fe9308be4ac953565a54c8f3cd61b249d66873ba9c0411cce102f2dbe2b7e40b7f9761819c0410d3c7648ebc1b766f1564e68000841f4f671560eea54f12f3822c59c365cbe911c5121ba1e1983f52b1c2345b1c2c37d56b4af97afe4ff4ac3d4dfeb9d29e1f5d1684a088c80c646205387c8c745cf5a9c2c9f41e4ea90615252ab1c830df4ffcac631ccbdb3f8da7f90de39c72de01d552da7a62fd26ef39200b987ae75420f771f7b6f381f8612a768b93127d79026105c4b3cf738e571d1737db565fc63b554b8a9787210188f262f8b476fcf4a053c1d1c6ec18a9e8cbf3f7a3e401fc471e2462e60f2520ab07a79d6d51591884b57047dc41553e484a9a9318ad33c0ed5ae3c8cc14f41e72722bc2e72afbad568ef96f1c5790171fa2f65361385ed8d5127004711df6c2843ad8af4a894a7bbde74491afb532fa16dcee7ea70deb0da64eb35efcb293d68a6794abbdf6ae4962c739f5bce4a4b0d4fe695e11b540270814941e955b33202b0249ff68fa8fe0ed36c0e26c6a4d0102135139c8b7c7eea56efb8b66a13e6a1012def4741c5509053dc1a2e7d194b448208d58f39be72a2263d0ee940b1c7ae09f3bd009e5688a52e2247b54a0e3934d2f0503bbea07a22afbfb8f4a22351844b248db4edc312b7e2fd1b6db60a164ba47a182482b911f633f64b6ae6cf20ee451ed5f6c8916b62e2cb09aa69835f03671491cc1e6ec697536f3abe873b923678712a28b7480f10ce0aa71dad009ff6ab4e51a4ea4804809e991b521bff31e76599fedd126d8a6c053a581a2918459fe185dc419ebb584c75e241e81d609c8b8d17c886926849bf28d8a1424610ec599a599624746f3e4569f952c2f4261e9d6f691bb79fcee994997427088cb0f0ce364813c033aa2315fb4cd28548b654977d0c6ce2a317c676d78b4ddf754eff6865cfe9a73512a3389a3b35a17377caf44680408a34c98cf0738c7a59986174b2795f6c3bf12f3b27d762e09a1d00de4e4c531b30dd5a997bfe0650f95e8edd37118530010056576e235287e19de82b100ef37158f5417883c7675621302da5609ecfb998eb3e94661e68802a8e742dc40effc765252496a2705dee73d5d479b9a19d8d660a3e5eca29336db7675b52d4bcc6a207d57a90527928ae639809a6bcaa8d0feaf5dc32e4c431951aa0f436eca8e685a39e99e20e52760a62ff33d8e41a0cd5ba26ae9d507ff1bae6d3e5465643edd6bae92908508cb4871483f96cca809b6336251c1a97dce2338e68850dbc2e3b39c03d9e7fa39872a8dabeb0feda7ec73cf169ab17153b81a393e789f998c85d13561460c482062ee43827f0eb8e550eb77e7ce23f734c5e6f79c93a964692c1f7eef62653764647ddbf284fdf60b3d0873fd747e01c6fe70bb2963d70701e185bed6b45b8eae95bd9d2581436fc0bbb10a7f142a58b16aa0cc0c6f8f48fdabeb3f3dc55717a5fe97d143fe48ebadd3ce8595378fc49e115f746e3f3af1059339474d1bbf98f2a6f3be738374327a8c482c6964150c35fc93f9775c41c8c0a0571f2d40fcda3c95baadde992f0bceef0547202324fa1d3225a44e4d0a96d7da2d0f07bc77a52cd4d2e6acc7e1405102ee1ee5fc2454ffbbfebd1c9aff22f149a45e001597c06a6a25b10496f297accfebf9de787de382a0048c08cc8736b7f6a25642d5c3f59d5f9a560e8dcad9875ee51f331e976f4fe821583b6a0998d1e8103df583650a6dbc181cf434d1ce89b5c2d90d76dac00d9b3c6bddfcef11e627d75c40a8e4c88488894ddb13703d5bde6c6f9409af9d65c23d0b150aa0699ebcddfb4ccba8f787cbd42fedb30defa5e1c929ef5e7ccfff640b810b1d8468a3ae0c624174195f218de10b529b12ad0ec4c34e47feaa1f82899015e8bc03d69a054bd8462c9fc7f8d798283253e53d3e914128c36fa2529739b30ed470857a2eca81a68379a2f9b4b0e1d0b464f067de502afd8c3bcb33e57d5cb6f6c0721d0504981521e68abbfe21a449005599f596076816c9e98c89155c735377343287c7bb776b48f8bfd67e31c9dc3fae4aad0dc0e2bba3024f1bcedfe12e7e542d801df706f01f39a912dbe838d199f86a59ec828034420d7bb2b90d8c8f34a9ccd0afc12deecf30b036bd4ed97035b961bfda562ac8cd9278167dee5dbdc1ba753e2420d4ab7f653d0cce6c94003c7c96a88042c8c06c1aad0fc38a3c024c0f9194241de3705861b65ab34952cbd5c673db85514264492c846533ea12a4fd31899859bf428582ab85e917edf91729215f22938880fc895064df7415c5ecfda7c313680eda3224cb1081a061732d6014c2434ff16bd0570eb5472f133f2274f9a9ccfc1291bf674ac1e9f6aca655a12805076393e928d9efe0630bed668e8ab0a28dbbd4507372afffebc2d67cd714e38e367776e34b377a4bfcb1aa24786553151c4d5b00986e82314dace8dcfae2d0c69832a342829a385fd9c8526027306a6c425baf8774824cc1d85be9ad07337415f43d21ec152aaf84c4f9ee02e4117e0ec78dd9cf4fd793165478e1d9462e59e4143ff8cb4c0e692383ec84f1f7301663738ae0be7394e29889aad947fffc0699bee131c66e6fee -MD = ee6f7213ad92981ac82d431bea13e18259545c89b38dcd3a20906801e1abbcd324ba466f78385f84ba81daef5c967896 - -Len = 51712 -Msg = 5670f3e8bb9d9aaa95f12f71ea30fab7622f0a9f9edc2821ca7d0968763dc878a1e4931417e6a4dffe9f72c1abdd298cba9f58e05d1cea4cf40758b5de121dfc8fb169dbe3201910b2a7e7bea51dde1048ab121f60d28d167eaf8c94d47eec51485edf05c753e385dc91f52f81f8018935db9e254e05f8c891fe0dca008a1dc0f3735b596a88e986a2e603dee6767b40a8b765bad0be13a9547b4422093d9891b97847a075c7135b2c2d7b917da0327dcac8cfa58e04c603f0ae976398a0450cc1f60aa28f16494ba3eec411ee7d0f88c29545b02fdff91c8c1f6f5454b90c7934750c27617f739f2fb24626e015faa8b9a62da15c57943e515735bfe692d61f397bb5f7930979a0f7ff6997fb71dc26d784f041bc757faf67dd4f6af5338947f9926dd9ccbc43932460952ee8989b4a43b6f758f840a3b7f539271d2aa20f399b419c97b4a1bac3dd5a32b14f92215c26c4a9aeb7c1e6a023f423a22de94e3d4811aaf7f4bfc4774b77a8e9d76854a4a7376d0aa2fe31b01b95adc0a510309b2888ffc2341f4af6963e5f9e29211e6aef96ad3660016d3102a42c3e3a1d9c9a623003bf1bc73589e537c098edc566f52569d0f89ad2806903a908e5951a79831f911fb852c16b7860eb319eca5d148e72393e19f87754a1432da87d5e0eb19e8631b9738115d60b31e11b7a68f00f7dfe8c5e6121facf20edb876ce3c022b33c09a3bba4fc95d8a7da1e7f27086410af0ed9a97be62db3027d0d99fd8fdcf8af4540b5364e7e73c6fb4fbcf8a27917d71e1598576b85f1719ff39b9da0785eb4be5930669765e6a2ca1c1d85ddce71da8f204f1f203421eedccffe5e928359dedd7399d067fa95cdff09fd792ac2b33bea701a4da4b6e8dc8bf91e9ad69c7e901b267dee209b05aae2aff92d0a04507da88b966d599caacd461588dd0d12317affc8493a61c5bacc1d648d3c0bf1ee1251e94fe8bf43ec23939bc9bf769326f213ff882f9c09299417ce2600a119c09c7f0fb36a564b2191fd026d9cc38da387c022a7484fe3d6a56a53501559ea8c6e78754d4cbf10ef7adacfc11f74604bcebce8430efdd446827d8a980496f2b62ad6908a1a4a43aa50b57a709209b9941942a6d80e1668fd8dd9da6a48f8b0b2342208065d9841f6b6259908aee407f109f9e4d2a02a006059f7c9434cffa3252ce3423e81199a390da381e5b093ca07135b28df7fb93923696fedbf9b0c58636782b58f1f5ecaf5e9a7eb8461a97e2ab7eef93af744719b2eaaae3bbdbf3f119698f894a2d842c1bcbb2c811c9592f08a1dcc81a14c584c2c2081441f88c5a41c9e71db9606a0010945db585bd8b6ecec60294ff8414bcae46a1d755ae99a8f7bfbc7c0736a415851e06e76a9f35874617e760286c3ca8bea0fc92bda520c58373950efc593c51c29035c688165d61b8b915925b72462f3af5a2af42862c982d0efa3a5f6e399e0e1373baa6cb0de66cd714946141393b69701994acf9c2093db8736bfa20a4e3b3cf462b8e654cfda9976acc027f1db39436ebabc3a5ec00fa98890693148408f7eb3981068d238eb921a1a405d5fa7e03729f5a4f33b165aed7c374f3f5e1f42390d124d7eb9882e29e418234ead986fe4abe0b174a1a209f9caa1de269c4917ee5987cc926b6bf6d36d0d05567c1b2cde6cf25e4932d1a1510c469271834c6521315f2a3e7822ea210d8f531f3bbeab76f5a107eb6f4395a5b9cc18cac397be541d0ec2fd506b7c855e0599037ce16050de833ad5a7766b5a4b78bd7cadb98819852d333994943282c71643ada021f00e700f83927bd8a6d139f30d11c23066c40221078da53b80bbe127ef6855febed262ac6e9c7ce8bcbd2db19424a18abee60c809c6412d00b7334b0f8de0ee6317f1ee0686dfb2531706f3adf2fcc2705120cd28e476de0175b2a47fc892b66fc571d51ed81a71c899da6f53a8d92a3ddba9b8d49c206ea58c63a6366d44bff83ece6677a71d14d49874d8752e8957fbd6231174b4e7e6d2466fd89d449d12e4cb2f2a79bb93a35e5efcb67a4ab5519088b66172f5754d72e9fec21a1746b61db4bca78cdc22244d319b8fcac50521e63a882e35276fab6cbe37ed16ace6b389419f6719d172a18b5a78edcd6620cee433c40325128008a80d43e0facc261212bafdf286632c21ff20bd57ebf7af6071bd9065aa7d4e6d0e1e4a232c3faeda9f6601ce3d5af8ad91cd8f568c3e59e0771e14de2c3281e18638733f16cd2513178ed085a47e7d4c29a818711805c755dd9f7af513f7c26df8a4e6bb1e3e34c6647a959f25966406aff88030f712a0c78b88e733c795b9184cabcc1fae5982fa6d7276a2276c54e30b06ef1b912d8d3f6821851eb0d40dea6a934df42de7b8b71abe9b1812c6f6ec261a8cbb4e2036c35eb17c40377b66eb3aa490c103b07d0553a52d884d6df228e67b7f9797b2425e5482f421c2546e24a528be0e977c7aed0070547b4229efa03473f137d2aa5a1533da1447bb25ca9c9165fe64531356760968377858c1955af9480a2469d125f2e102043c88b7255be8a479499e3dbaa956d2ff07f7ff8e601b43f1e5c2ef4cfc4742ed8893d2256a902d5648e0c14e8cd0f9d3b087a97fba84accf0247cc763b4de1f7b1423d72d07348bee68268b92a5d24dcfc7088136e1acbcb045e2f4cb8dc294941ffc2b595773dd9adeafaa488e69a42721b64f086c7e70e7271e1757ada600cc0312796c28653ce24813fb6b054a42c9bee05be09714abfd4e7ab9a8931cf67b43f35bc5e87d4c6d3affe98a98d8ac2fd52322600023a07b3285363eec7be83a793b4d0716106e843dd01f17b7b942e22b0b5cf7261000e959ca177b086758720946c7904fe325dfb710e6a2f050a95926e54636776e4fb05ab5f7fd7543b9ca8aa25601d459f4c83d5eeabcb123322d3f6d887e8292df688bd53226c1b5aeac63da62dc71e97de646f695b5a8c58fa6fae08e5fb622529a83a460976c2189802b5b8870771603b25a94622e15ac148ee00ae25ab0912baec8a01dcfd31becfe47b2316e726438a4eea4faa6a64b632d65390effd063dd1dc1549420a5093b6f5f5af836e2688f468994a98fc927fe0b10e78e9fb41ee970143e9e3a307e176bc8c2376a45777a0fa200097a0cc637b069b2cbeaca36d33e27da768d33eee36c1a8499692a258b68ce6394d5dfaab2b5e617414181201ce08294d799fdd041f8db2e78c3fef7260a653bc623b04a01740c81a944877f390f9b1a1bd11cc6959a710c6ffb4270ec4d1cf537f42d287683438e4e543bb8ba03f7b6cdd30f3650b972cae98f730740a94c2c44c7b4cab45c2199caf11c4112762f17580043a425de66d67ff12f4ec5b7894d870ed5b53d773d3089cbb7ccd4ce879864f968a46781b3ab8db0c5abedf04ad5794a0e5c646cecef15248ca07385b7d65f2edc9bb84befd6ad5ee4931bdc076095f9dd34db95c731e79c09506124264db1011e1e7a8581d4594bfab8e1e3455b67aeb0e3058a32859ba2cc713032696b0510bb8130d700211c187671d29e9b3258c927db74c2d5668bd934776338e7bac5fe23886db8e1496034f65260766f91f3e9b072abd82661429fdfd77c9027b97df9e488a393abb9c031e8df1df338d6c380d96d0d228be25a672d15eee0afe387c48cf654ffd5fea68fcc7c6dad9d9d421f011f2b4a9c863defbab72c92f6c58dce7b760465e6849dbf1fbec20df431fa14d5fd88b8deb96769f73fc83f82dbfa783e7c346e63e81040611acd8cd3514622b6aca7e5a8e851967114443eea935862547d6761b495a8a42f14e2a2c167c09921910b59a1bf96d596d923297488220d3bfe1ff87f19c16ae831a3f824e1f418a54f159d4f9ba1a80702e787e736d1f97372b09b29f0e4f50b0573f5a45c5b01c03b692919090c9e1005f3c2890c0287997fdbb23b979de325e4f52396236fe4f0fa8875848432286066fa61f0941e680c79f3d62a9a56a5c76489ea90f39d42c5e0c61b1899acc766ba4dfea44b9feb4af59b8f7d55a9cd4e18b4e31b498dab9d92d4724bb5e70b915470f11abef1b1d3873546ba7601ca48560885ab719b7006852623a4657b558ee9f5d1ca4ade3c448343844857e91d44c0e74aa81851309f4c2da7a924d445addf6f29499b9feb0c8e58d0dd97ea36a1ddf3cab7aa398da63c6d66d0708c4c7c992f601f1dc15e9a1ce7a4b0a26fb70df1905e50a3dec7d9fa67e990e4fdea79cbc90e914ded078b9372888803f41ed7c05fadf9a19b7fa8eaafb880dec3a033dbce8d66a87d664fa68be4ba3901deadbeb40219001a2571a1a75c26ea57fe294da274f5b9fd0b54ba8651ddbe3356ee413023356ba549e2a3d13cd9743554d895e75dd4fed65749341458590fe34817fc4669e520f76d7a55cfe33f28e664b048ff906ae3a3ea8bc79850b2aaac02b944894e9eec7b00875bf5e7ce54d57e4edb7dc55e04e0259ad994e3711af81750be5b59c91a9a93b81ae5a2eda4ad3202c1c454f4df15a8f4ee8c792add52166cce4f13fa27f0a77b1711ad3384b8008a9065d7e5debee5387b019a367e44507c08d6f5b8b0f7ac5ed4fc7f2671906a34dbf4c69790365ac40376bf2a5a3975ecd275877b322a22c1d928914cf7c0efafe8e3998070368a361c7e608d0dbbf76dcfcd31c827f2ab4298087c0d83b4013a5ba4c9471b19e3fd2a6b16c51546554d65209d160f0b965f962ea7eea2043f82b8cafe41dd5b0887b1cf6a68ed63002a172221eb53bf748767fd9d66df1c0b1764c8710753945864573da3ff129c88727a4458be9298e6486217d51c9775e447042ffa1dfa4064216f187bee114d6eb4e2f9aa1648223c1128efe76667ac6bb00b53c1ec5dd9ac3d8e025abc6610236005d4ae78f0e6168030f83ceacc29f1d0def690f8eadab117186db8f07d6f37124747de6d094ed603fec34e0041692738136acfca2dcde35cb2cd2f10e3c52a4a2bd5a2490de72b1b06d3a34d43f47c443d32d6e6932dd36cc193259425ac6d562800a2b38b296643ddabd52850665183b0e15ed4b77501c5e97224f0bfaf80e4b05b5832ed90180cd7ae4c380319578512e8cffb072def068ecca5cd1e28f56479381b2dc1b5c0d4a96d80e2c887eea6d7db92e00ec30b9d1615307fcdb34b63e739942a83f4f149b76c1bbf0d5c9797741c501a3adee7f833ee5d9f4ad8f3416ee23bbfc0f819ba862c65236de1d2a57c3d800017dbf4a65cba759222047dbb84a48a33f519bad59a20f5c656c2307f54b18b482244b235f50c20fecfc05b00ccf2f84d9ce444f967dc561e44782173920b0a48f693b1159145e83bb0870bdfac701e5324e258b473d10e71d37e3620c8cc6598e15371d3b60a13ef80d31096b78e54fb299e668542817787704eef154d58359e9f0e64eed7cb6c709d3ef9c452b0449c1762eefa587039b5a754acbfb440e2e06c2f1ac58b0c3a65822537f7229855bc7aea52622a1fbd92e54a0f8e721905f4f53ff3f6244f1644bc205b9d8b7910d2c09f417b4c028b85c67978102b430752a6bb910f47f67884c7aac52612050e8584fc3ca412ab2c24a77d86d324417f701d1c726f7aa4e9ac214f053f4aae973b348b945b228c07f614b0ac4611b6c6d3b4ed089510dcd2215567bc3789f8536a6bc7f92f0027a7609add68f767f586040aa7c42ecf00da9ac09f2aad7454bba9772bdb9e200092fab63e4d559b9035778ad7558ae9b35b6f1f50010f8e56486ef331ac06f6a9532ad36db9ef21194da4b1e60d381556ed24be14bfec3c6f72317c73eb18187450879ee64f229ce337121c7e8bc4c68e08422967b7b20322d1775f6d293ffa04238755326dae63a0aa5626eb31af71ab254dfdd3990f76f2eec73887e6fd0fdb44a0b2cca5d119b3efd76dc69f569b40dcae87c2d4430c621297844e94cdee6c2c6a243f784923afa02c5d9b3558c7d186fa63bfe9fb37f2e57ebf3bc3210a39435a15e5656515f643ab82d394347bffcca81e454a968e27ffd365d9e2a4e7b531f72468edb3652a42fb59fa2c682c0e064e23dd96b383739a3c04a383a80b8270a7cc3481b2a5ae36925f896e725caedc32f1033ec09c587d2f182326d8ea03780279d2c1f13c0496f7100bfad19234a71d2230a34c5d58f1031cc33c8617cac08db9be1eedbcdfdc8ff7fc220441321f6313e074c52af79e8e8f2e355df93ad2b0086109068c628ff393d4a488fe497d8b62bd13b9a9b6edf7ebaeb1bf12f636ffe26600ea4f6f1998601fd2ee2dcd6a1c7b1110983e1967f5bedf3228096f65f3e437a6f75a481204d9583d9264506d8ce976fbff7c8184fe853a27372118d8026a505bbc517ff1cf8bf855141654e0632a69264dd991cd78bb3a115b1e8505c1f13aafa7b989413ee48ab9f1d85d7b25ba623001c9dcca0add697102363687a925711357f6f688f97f89ccaa1ecc964b15fc99c9e194e31b7852d6db2cafd62e537e174b9e4a2175b9601dab4e44ba59c982d3e4a58ca120f860b334564369d827cc3bd113f6b34a2ec81d840b385fb841bf7f108a169cc1fa1d86ac37a3cb2cfee5e1a6fc7ea6cd4c0c5cb2ca2a0f1d1aecebac03b52e64ea03d1a1654372936545b92bbc5484a59db74bb60f9c40ceb1a5aa35a6fafe80349e14c253a4e8b1d77612ddd81ac53990537b0c30018d63a2644b3bf85a55ba8666d08d874a95eee2019f4bd433f11fd05b6b33fffc5d6279c34f2d5c55ec6a4bd88541749712d10152aee4353280beba598cbbb3df2941842d169857602b15f17db3aca03ce7deb1f3e2458f890c9ccab86012003c89976e2c41fb8e2b8a4413b0dc1d9e8e7d8e705fa9ce27c9fd409e0275c54996f6caa42b41c544fa928b2f3c7f12c41e5c56c910860ca257cb3080c24e440470e951a2b4a694206fdc41a05b1d3ac55efcde2891078f93c50ee33f724a1cc55ce9d30642e0d6b4fdb01e13a726e3f6e2e76b1b6b9ea5608420ef168d09ce10ad60b53b70710b6716b666f5ab3cbced2ca4b41e0acc0c8d37b9aa929d0dc65af4f67eaea7e7b0ab6d77b2c2d1bf042caead1fbce910239e3231ac500cb69428c603a5fc63a55516444c8817a53e7819eb692454a0fb690826116acb6694c5ee9320a1913e4a672c4dcd6d40b02b875965715881acee6b5f65d17c613538ca30eec6280992377551ec72c8ea6d16904faf5e22d0777998f8740a47bde3131f742b7c7fc1fa0cfe2ba2d52181468041811b7829ad9b2d8087f324633e1aa4444cfbbc3f56f02b601df35d1d81d6e909824c67c395826aa07245a8456e267cb71fb1fddd34ff2349ad7073038888c166c7b4a58714c7c1775c0e1e64caa10d1660f0c9efe88185295e8ccf79f1f699d7c5e6a9fa97c5b273899eef47d014c5b0b52a98cdfe21b17da5bacaf75a8ae2db0154ed84bb16ce339f7aa3752aec373480e1f31dc24a48c5178cedf21ec02cef0e71f8bbeb3575260243d36317b1e20058995155e185ab7e3865b0f0db30e89241e05406a4ac37c9667ce79832e056b2a0d34bece84e6a276cf7ac7a0c5796534002780b73e586ac1078589b1901f5a9fe023b69231ef55f399549042e9ec6b08d6aed20d56bf23ca4d8bed216915f84c4a8b8514e71ed6432d11f15be90fa288e7c1bfd45ba0af9a81082d3d818e4a199594b1ba6d1b2f4cd3d873538b89129d7d89ce7416a21718eb23d26c9f335aef0765c4ee8d8d68f8d2d19c939803c32dde2e87554c6e622bd20563158dac2fb4ea2746170d1c872e7425f781d724be2153d772dfc8ac98bd80d668a211a0d1528401bd9cb67196d6fffc098612950a6224ac187b5103c2b53bbd6a7af4b849af1e1cb3e750349cd7bc7d5c0b0ffdafd799d6008fae1be7fa4ce2f005fd9b9eb5ffa0af5fa30da21bf3d177769705b667fa7db285a89d0f76fb6e82abf6f1d84a71b43a6c76a2af89ec1fe230725526fc8ec8b7c3073142108f89a8d4a5640058ba80db76939ecb09ee9026a26894077d9ee096b3937e89b0525aebe8d49a1cc6232d1ae5c0a7fe83424cca33416a61d172edd7bb132deb3e8a0ad24f493b377cf4e37f22c66551df317a564ac4813de25216034551e571a380c0e671cdf0566275c993936d82cb0501435251bb7ea2978683a1b8134f22c57ca5adb727618360ee08dda17ca375deface47afec0c99d8555d397c2213068dc5e1b1872135c55ea6c7e5b4bd7255506644bdcc1fd1298d09cc53f946d825e3a59b7a4a81142544e62f3435f69776448bcc3a101e755a9ee8f77897464688b062fc8e6910a8a9faf668518af0badda3b38f48e3b0a134f43b072fbeec0636da452b774a96965b681e99c41d7382945324b46ead9cfdc075492301d6fec0374b9650bd57db894377a6eb16554797a23e266435d6ab30050a5c747547451b94e99d95e6f7a627680dd585ce9933a20f4a03c723c6a5e30b9cba22137989c0549ea2207c91c018d213f48f7453004be3610104c2e552bddb11ac5463d492577f51ec19078ff20589724b3391ea7639276a6a449a9c79677c537a32eec127871eeac4a90d58029696102297acc65d15e34d84ae3151e488f6486ce53ba612f8375072f81854b87200d7c1e34d4f7d861df2986b116d59c952daca95d2ec1953d56d3e2dafebde42cfae6f40fced9e35df41eda2c259a1d297f0db693cfc0540fd286f705b853aad0b7c76d6420887c93022cd7cca7c844acd71e88a003c9d66b9694feba28a965cbd2b1ccca60801eb197d7e21b33dc9d9fd473920a616ab6e101824c30f62b8f6eda2aa4ab155d443a03a49b805063a282e591652b7f1f5ff0b1e372327756824a1c9677ae957c878d0417669463e9ddf688fc748ba3545c2b061d031742c708ee3889d82d876a433ae7a4d5e004cbba6b3d1932b3749615f09ca37157ded97dbbac7928a061b321b44cd16bcba9a5c231807c423b697117d1e41b3f8ca21a4b42f6e90bbfaac38d9992318aefd8f47019e19a057c0861fc4f5af8d02e43160c04865dd3c3c937f14b5629c5a509346e64eef70f0dc7e51de98fa0e5a528393a80f94c1365436cf75a174ea -MD = c966b502473611899aa80eebef4c206fb2e22af4386145cc1e272e2d3ecdebf1be7c21c03a47710957e82cfbeb290a9d - -Len = 52504 -Msg = 17450948986cda4399d2aa0cd697295fabf4bfd9cb1fd703356f7e8c64c12cd6c61ae1b5708e747310602817236a81e668bf562b94902634474cb09d3f0bbdd1cc2d41cd833ea227371d584f255eb6166fec076cccf3dd6e7dfda6a0835b80760fc64f1a3a460c69f653603e443a71f4a8c3fc26da11a4b9bfc9891d97771dcf782d3323fb6d59403548686ce9c8598afb8c5ae028b2211ef5fa819ce5273be4efa916702f7a32b5dc4699607ace17df518e4c231d9dffa407d6b5a6d43582bb5d83208a3f363eced3931aa2611552fb9012f876219ce454dda64ec2cc679c5ea80478f891692695027714ba0465b3e7a26086619c75793460b1737935872ed5ba7147428fda9112523caf31cd86e2aa6dc01f6cf6f1654f76414d52785be3267915b4f1a053284ca928128d233f864cdb7aeb2098d850aa089c04d5fbac605bcf37e88c2b9a934bf18566596d5947d6d3d51104e8f2e44fff0bbf8a2741507ca31e0a9b9a7979171099d21a159dcf4f3c1ab9a14f07c64541d6a6fa64e4598fdc1343a654b582b9f0ad7f5a82d0c3bf00920d7d36dea194b845e2ac1b5b239e645ebb36c1195738770895a01cbdce2e0682322203401b454aa09b28b26f57b0224799d2496ca09c8ff43b754b2b96a53635531820f5dc5ee12ef8f793e89dcefe160603547504ed1fb7996077e1c32b78f296e5f3c58dea643822a0248e9cffe01229504afd2c340e9ad8e908a8fec9b4002313e678d6eebb0641abcf29fd4bb0842b4193ccc07946e520986648ef86d2a8232a5fd55e74cee07ca1fb8067ba56b4335e97aa67c2aee098f6f9893d6aba32beb0c8a5ce83850efb090f5c8355bbea6a30bf5fc9192ed3698a2a33907d55e61b2f88b0cd24c8d7e76b7585f923c56ef73e71b28f85ae05badc5f0d92c8890b632e07be045e7f85684f94c3702c5d870310166d610f16bfb47501e0e9523febbd36ad971b39925ea53ed4de91796c7fb62f1756e6bd4e497fdc79743d2360cc52cee202b9bde9abc7c09d9d0311d89c3722da36c7993feb42992e913744d2f74a7e0ec986f36cb3f55b57c96efd8b27af71c9d4acabcfed263587ff7ebc7fb4ccce99b22ce204c058996a2a7c436b6745a54bfa3bfae7965237ee85bb934d4b0047eb865092971818013f88d3ed62a62245c76e1f8e702fee27caed96d226030f706c0c9d0c0e045c1b3cab1b02572a6dd9a7f9fe6f5000248e82fdb680f12521d1850eb85752cc4c70ca5bfd8b313d4fea526381a671511af3807ec4a596f95df39c524c7b4ab81187525f208fda25f0ff30744f39b96af8de2b37674afcc7ec5d1ba2ff81dd10d3e83a802e16392a77a0a9f411331292e7d7ebf248750dd7f69768c47970f51bb91ceb86cc2936960d5525aa6e9963130f6728750f31b070a22aed8063507922ecaace39a4ceb9afd9a70c5f0f75943397154a896383cddc189d10a0652a506d941a4a605e0faabf041dc6db9bce8c3ba76ab9f6ec754d6181783bea26056444d7f5c6c5a2f4f10cb540bbe6bbad357369edde84530e16480544d5284fe99cefe0c2ac2e168477df159654481719762203261ffb405611d9cb88462087dee0b5d509636465c7227f4ca9f7c8561a37919d9de5225a56265bfcccf59b77ed18e0df53532f35c5db3681010d3020b8600960db99c24a153e18bf994c60c71d2cb62526e4562f878b4adc24ff461ffcdad07367a1a3b79b3f563d75b2391e770580d00d7ea3fa141804869c33d3f8ed8b2effc9678d4af1135e9deb8fec24018985078d89dc3e746caca7f1139e56945c6d2c8a5148ab1ea07808804c4282c5a10ff3306dcaa5b06d8a66a90671dff735d42131c99b812ad0eba6be4f03e0cb3664bb7d9235d5cf05e5ec4e73123b20ffaa07463650751e89019e2c01f7e5192ecd89fc61e576d91b076167c44a1317a0380551002d2e01b5001952cae53ab97392823640a131d79636ec7d60e10fe202c644db8efb55db3b313eb9139787b3ebfbd0b29832aed060bbb517af9fd68b0b9bec6b4a8191b503dc36e842d3730d80509bf8d26194cc60dee5bd194c111aa501248a9b898b96f5492867c162a6d119d80a9154f48bd37ee6a4f806af6795b73e14bfe9d9ea86f9bf3dbff60cc9079ddc460488b33deea21d194ede918106299be5929d3b578df7889d774b9884b5f6a477d9d5684f24b4c96d4909ba0674e360bf8b1d747ab4d7ea6f1726d07ee50b78c399a2d96c7e9c33c771eff29fe8ccd5c933d24ffa02812edc28f17a609ec4a055cb59cf3a0242a3504df901f469ce422c1124938080dd9b0b31135fd1e9096353f7611261ba8f6030658daeacffd0ee0fae7c07b334d47b24baf4477acdc20be6a6226a8aae69b48e4115c270b2bb229b9040753c284c14514bfcfa0252d7de355e049f5de5bae5926af706e78b7526f841daa3c2642eb0b86d933f1380302569aa6f788167683c66679d3fba91e7424d49b059eeee639581a721df5260b627a90fcbbf9f3c5c012fc06d3890cdf9bec22e2c6168d0d20bd5820ea369f94f2e1e17803a5e6d7f7c18fed1b8124594e1817ab482d712625cdc85c2500053e480ef49f6b26700b8f546a83086e8039ef4afb4b283e3bafdcebd38a6b1be775e66452d95ee6100eeb3e446f16bb90f013f77658d2d35d28aaba123208d4c6ca328484cc6b8f5720bff18607e2f2d6fa30aff14ad487561f039afcf99ab513a9d0e1f2defd6cb60f6210a7f3e9aed2d6e9d6f497a9c4b7019c110c37ad476ea3260f3597a118ad19761e42a9973a151483ff08d5cf05d06ec8aeb8729d063834c65eb56cd31daced606cbeaf784f1e11b3aaa66bb0d562b51de69a41067bf0dd26630ae52fe655e9b5ae946c09383e7ced4c45fffbcdce73003b2a195613391acabe9e86f40d089cea366c65c69026a495666fd90c397437142ed0622856615c27c3f8d8ebec657572a6af234ce14737408bacad6ea3146fde3425c1e9c01a4fc215a241641edd11e371c53ae8a61093731e54d3afb4ff9ba2eda29f16eab4342e161356f91edfe0c12a470336492347a1a120e22bc9c62916bddf802c30dfc7c067d4900766fe707022bd12c254ffc250c6796f7f7bd8b6ae1734ebb63ced692d6d5e733b81b92f850d9ffff953f6a204d0c6c22725d7c2ed9c2b5831697da6c9a92976f1e9809c845d581167c0b8553252a1809f6223cc39bf5b4c2a3100ef299dbe11d718f545d2748dfd7a25b56a6dee923164ab4d2136f32d4e1d3e07c0d1dd94ea379a779a13e59a2accfd5e302bf7014b038bc49059da19b466eb02ca36cb3656afe89827bd43151fcca24364d0fe8733e86e2a6806c6c935a3c27249dcf92aedac8dc76d22ff7742e5cee57711778c92afdcdf36e26b8448504ee6ee48e9eb25b9e495e9098d494ac4ddc4c541f499cdb652638b611b0353090ac125ff1fef8564a78419c57f038dd65951fe06e8377b986947b407579eec1a60a16f540db0931921027deb472e8296bc2d8fb4e4ddf2c27c0c6f49c3ef7a20fb08490c25c6b563fba193ef7822cf8290a7d8f05cf5e9c125120bacd25d93993456317c0aaa82b191d1da4674a8db265161883dc327b710df0927a4f561bf0f972bc7182ec481ae7e23ef84def92bfe88db0bf1b9ebf13e145221c6bfa452e0bde9688504bd18a73b08122f19cc4887a184e2b0a3ab0eb56f7da886939df5a8f31f94372efcde38330f00a9b77a973e25ff9aff12fd85f33afc2a6913a72de4e15ee8a2fffc38ce009929993a8cbe9ea09b93317a4bfd84214e15f2a26852110307b45d1a43cef52e46fb52058b25358bf969fc5c2ebbf49cf3f997e24a18b9c2aab5c9e05bf73a06990478cafe417f52899db43b1e67a1187e43dd35d4d84bcac83b8df4bd480943ffc381dd4eb9f89edc9cfd998387362e5d93472f91174365e0d3fdb9d037ef40fbb6e1cf04f51dcb52f64cf9f671003912564a31f75c3d3e750dadc24d5d58980d6d3d12a9697b529d1806cf0fdbbbe32d0b7aef702d95bf054722807d1ee1b3b544e83ab4ad8def0b90cf9b082db5970e314daaa3f1f962022ed086f802f72e73dc67b9af27b1db3eff1be0a7cd79df565627060b5fb4c20c135c4846801552d9a25022017ea3b1a79150324751952665e8bb840ead644973930a46d13cd8db572525e65408c00cc61621026f408406ed676fa736819472e93c8f05309f9e326cd35d790f5c93372afbf2c39820c2eb3d60b7e21b72a1d8dd6e4ef5dd0ef1c29b3b6b7cabf099eb36913a185a68de6dd65328b705d738e5b0a6beab4f21503652dbd443a24b407389948b531e8f32e958cd36b8be45a62403747297ff7d55f834232c809ae3237a94645b165d0a7cf8352d66498d44960e6665ff4e76596f72afbfd895ee5ecf6ad79f2dd4be70f914ebf23bfc0b3a751f29f9b9314c6bf94035e06d06250480bec39378008b4943b9edba3c42a0bdcfd0fe8e34d2da1bafeb57636e43c77af400f8efce3c7bf9e971daf3cbaff63502ce34b1f6c5b7feefde948730f15e28a5bbe80294fae91966b7142d7eb66446ba616cf3736c5e7c35947dea697151a3f25a018a60ae5b1e280429c5d9d88359532517c13f49461a1d9763fb8c563a638665e5d5b5c95a7ec9e39c6b4198cbe369a3c5b9cedef75f0471f738fe1280edbe69f58318fe6fc1b8cfdc7c6a79b67b6a47e73b86bffac1869e98315338bdb926c0c0f0eeaff37d61437a7798eddb97d19bfcd50b4eb8d81077d763002b594c4c24d8cdcb409e087fc8f6fb718793bf3c0a96f4d11dca194eb8254ca98cec1d8ae09d781362b80950dac26678b98768063e26395cafa6eb7dca125ca3bfdea38f9e8f6e7b88e9e680f37d4713061f08dc812b112276c7e53a182f218346a984b6b94f3f48159c268cad781bc4ffd3380b8e25faa705b59d103ccc29ccb3e5279cbb2d592dbb574fd063536323093c7c3fbf97747ecee8597ca289e3e47a1a12ae3eda5a80cca3d8f8af9fbba1a4c32bc590100d0e44e8c0fbe3d8de6f2ba0cc679ea6a1d5dbfa4861fcad63c5750fed59a9f032da0a2f6a0a6b4977c12b21bb556542cdb16bd324a8d50d1a12dc6b275857d8746681349b14c34c4e8f0b0566042d1f4c97feb6d439c34f3cfe5d6d703e443940384c90fac76661d12d4dd462d0409c9cfe072dfd9131e44afc6aaf4e97d99324c3bebcff8edf1a9e20561728566a6b3d580791075bcb5cd291a67918e18256a09d7a212fd797f7141cd6362d12e4dbac3a829877d5da295262738375a7f9243229e155f23e1b57b15720b9f7725a8e781a0aacc5bbf8da48c37436cb57986c67fd96d3ed2ef3dd1483d82b0e1135f41f8b0236775aa1c034590b0bb07cda9fa08cfd1377269bf7bc076f01d75c01ad00e20bce135e6fab9377aa8a9b844a5e7a6ca6ad36b18e27f67657d6f9df3809dac379fc0023acdce4c3f53c030a61f953f105f9925c44fe723524f2dc07639afbb3ef18f436f3e4b6a26d887d8bbc20dbcead9120935aebbde8491df450fee0f217dddd3624df4377b765f86164a335606a000c47d32a6017f44690e968747c3c83c8816c69c989a66781246531d1d78037afb39ea85dfc3eedaff411aa5ebd596c31ddfd724d17d1374174ef8fa267c9dc0f3f9b9f40208138e7c003933834c7559c2b7fdad48e76ab196266baaf669bbb90f8a5048b7d9d6a708d35bf7b6314c489f25a0fea4e05379b85716f5364745ae78761948a53d1f6fca43e8bb2d8b02d6deb128e08e70b612a46860a28e1e22e755457abe753cd62cebd748458f62814ca4e3fd1baea07bc583e1b07ba5f73caccf7ddd70cedee3279218e45d85bfb0f21c448777ab778ada7d4b704624d97a450ea8a928592c2ea8e88c22cdb7a9770f6b5b2fbc2efdcb99b92d07ccb2cdc4f9394d46acbe2d9ff715bd6b5ccc28beecbcb05bb1de3b274a600fddd5f8da021279f51cc4a4e91f5b403328d16d446dd235cc741f6438843499795a299e081cd6f527933ab369941e9274bff541066d07fe36e3ce67fdcca08df4e68f4b5ffb8ed66b13d594b4e886320a9a90f175a4d340760f869090e5d66407e9d0a7e885814349045cefd201dc487d1f6a2499fb8023155f0f87fbb91e453bcbb45baaa3f9654ace986bccc967fe53b84a837b5a55ce9a3d30f3462ec05817f4030fad3e3c63f5d951b1a926717a16ccf9b522aa996a8d10b37c772e03c723cc856afa3c9366d38d4e69710240e44dc2406396d1951e773f5ecb98a031b7e7bc0215988746966a53593a2d441d658104e535e0b99113df34fa88b06b9052ec2a41b88f059d1a459138cce4d4502539f9b0d20748d4704d564e5bc87969c0b97f0bfae8a0e01be9b0b4c89e9a214bfd096be31368a85e490d24eae7b10329d6242883aa3e56c0e01995d6637dd8ff559cdc0f0d0053055cc142e015fba8b4cc7f60fcddc94832b133a39d3c68bc6bca1acdfffcf81e8c0dda71e35a3f9e8922fa7b0d8a28fe98e465a6c6304016b4e3ec045be838511ce5c0799bbf652ed160fc405db843c01b011965f848ee2e05297849cadaa734dc6bdc22b24b56a0b40fec78956f02d6e391b6a9dc8b5a4c84232766f4d82f0ff5279434cd07f83c59b634eb5cb74d87171ca43a1a016cb85959612182edb7298ea1517697f9344ae9dd3b615b990c1de0284ae059b20db9ad538f441c1e28cbd0627cb1b52bf3118b0c69a23a1c27de653f126341a72399a89a17956975683de3f17badd2a51bda68cc2675a0498613cfe8638a7be7979e71b563dd12f960c7eed6b832946d95eda7a4daa43526120345aca51eaf7a5211312cd9e3beb2f8b1199a9908a38d4a92721dedf5a2beb1f8f01141e884693b3a0f88e37116a919428ec488f6a80d2111eebdc8318f164c38f7a19dada3bb3960344fe84dc2e5a9c372dcecc64bf301b1450fd120a338cc0c83e42238b47836ccc70c5040696e917cf06a2d3e3349d4bb9f987189872b17bcbc6138505ea819c7f1448212b34dbab52df7b3270917817723e21035e3f71790c9a048bc4954ca97da81e88b4a890bb6540ae5487463f02dfa7417ed5ea5b2d0d329b8451e843084a94ae973d32a6bc68b2c2d6b1d3709254bd6ec77a03bd2c30185f2b3853e35d88728ed91f939c42ffae4f256ab9ab4a63f91f99b52c45eb27c3b5cce258cc0d99ba25cae61bdfd37cbba9dd2c795d9fafe2ca5231c453ee56bd3605da775bad10e409f92b6befe27233694a7192e6067af2f57d5a5c85aa4f7d5652ab2020906078a1c059e45af472de1409d486f31367b22797b96549a3748cad3fbef3996c1af093ccfc158f8de0e42097cfd6034af898e72db96f2e6e5853a1199062449492d4467b7c902c136f1e2580bdf08521902fbaabe4ea926f8d7ab89cc9ecb0ae8aac306875b48f295fc479313976f71be0def89eb658142b665a7a25b5f34c2e44e0f7f052234734457fb245ccc9d7ae4d3f4772c8482226858b5c410f369578640af3cfac3cd2c8b2b8671ae279b56d47b91dc4753b5ae55d75e57b1ff72b316a92ba32de91b05b1a06ee4d15070ebd62e4f20057921cfc70b28c3072e55bcdcb00c1e683a27e700dd3de38cee24233114b4ab2e9fce6b041b9d71da251c5c1f7ed914715ef8b8be0b7ad8a9a9c0e52f544ae58a6cc56b553045c7f28fcf7a293a1aed11fe96623451ae2aee2b4a1816179937e0890db80272a72e161274fe400d581010c20acbaad860412419cda62f842807fa9dae3853084b0f105615cfad1f19e736515bdd67c71885131e4e76c2c47fbe9e51b1d5901bb9d0a604b9d7b897e8d94b54917eb5475f5e82e0d77017fe26c5954d1d7600d27adba1c469fda89e4a4e1672b598da80bb343a076f7c755ba682a738fa03ec561596c83d2c29c75bc9ae6054ce121f99b76f043c1f822603855f9bbb51639cce126be5180a435bf7ec62f1a1e4d4ccbbd877a627ee6a701d4ec33b7d29805863fac1befc0b34ad993bd0910200c6290da8b4e86fe41c9cd186164d278a41683d53ff1d9238e2056a3f61081f28d07eb8ae8f94bc0981f149b7bf9a607c8e1383a88fc8829836ab927f7d1d9f67da12e3726e70b8667fb9aa6828ead1084fa35e7ed887733318e638848d9a2bc2cc2eb77dba460902ff3a1f22b80521356c5ef55f42240e1271ff84d4f7456a438e1a5c56dcdc57e5eabecd6cd7b2f90cce8d71d23565fa3c273e9ff925e605f1081ef9853afa4b18268bdfceedbb01935b77f9601914dfb924ebb17b7d47a3d42382b6933e6a8ca29de97bd062e6e0d4fc66b68f56f767924e4ee1e0692fedf5c58dbc074ff3c38b3522cafb9ffc3fd79aa0cfea54d738ce8faf58b250658a5bd7883369d45c98dcd87df3d60ac4c5a21b6e6df67c7bfa75ce553e789ab2230e42bb4342376eb29c6d411eea0c081b3f6918b83d34ad5690f389babbaede6017ec6e1218dff1bad3dcb775bd0e8ee8b66ae6d746e533f326e593f402f6b1e87dbfe9cb7634ad57890d271dd9761fd50d0820f399f8d67b3f8ebb15d5d9f36448a27394e19e6932c7e7d841c6ad838a4e290d33bfd35e93e3d54945bcbf6b7b817c5695e385eff3945414070a1c82ae81b7f6c03fe093e51ba284ab4010e2d62f37d8f803510541f93c21972f2ae4e9ac9923c1a1863d19eeddb570e835201d5aba42e2ca6a74c4fd85481abd3e70e5d9b7dc5f6e2c23d7656f24bb3d94edf70aeddc7dbe390325a818d1b83ac2ef470ff969c22d3c0ec6873e19b5c696110c48b8edf169247c0c02dd0498301d2aba57471111661dc68e5c33dc860ba353051b03bf665394a52014bc29e326b7e6e4b8891e75a13713d8ec36b45594247c8a8cb6980302f2480ae59e87c0a5f8ee6d3aa7d61567f2bd4c4030eb4aea7f5442a2b9c1f000a42b727d696758344809fee589821a3fb68b915f07c78f941ea3d665f48256d51417fee50711d35b0ffe3fc21869abb2eb465051a591491a6731eddd50225d07a8d359245ecd58a2b596d7d83ad5f147f9b6301ff090a305c4c63013b3eb2c20ca29294258e30f92a2996f2fd80c138648a3dad0d20ec3db9c29470e0723eca8e1df1748dc9a21b23ecfaed0db573af740d5f56c3251d1275723d9d63213c42555beca3dd13cb68af2ff3dc229fe8e234a132afcf7a2f66e5c7c8e741e03dd218d8eeb29210ff5a324f3c30dac493691cc2721860b4959 -MD = b2a7c12abd0703108eb404f4d038e82f1223f0aa15db525884b7d239e3bef60a5248a66f515dd61f8387e475b4a0ec42 - -Len = 53296 -Msg = 61aab1e599fffa75f3187dc3c0d03534dd62086688e340cc71103a99144a62e047df5ff90f8b8a26b83fa5762520caea64d3a1d785f8d68badf4ca3366f489fd392ffd797f6b614574c2f7e98da6fe000c23df99d164a7dc7379b9f18f57c51d6020f42e90a5651a4e2adde3a169babdfcd92973122f9907eb257099387bfc89e43cace0eb4380ec6ffdbe2b0971e76b5d7de92ef16296533f8355f30869178aec0b8d57384c9905ffc6028a6cc66b50569786921504850a9418d1c9a828ff66a014005a1ec997ab250a10c8727130b410b06867271d4d72156e4de1bfc09a6529df6bb345c16427095352adc4791ce1b24ff775ceb6d8d3e70c2f04f63ad2d1aff43728563ce7c1d4282f000ae6191e65fd9b84b3d50d77357ae0faf59d8ef059dccd82f94308c0ae120f8bebc00eb25141bc5b7d85d4a52541c98b63f1b60c501e9388d5dcaf6ebe985a141010e2e69da3c2c3d5cb15a4dfe8517fe93f316bbc42f3049312c4112d42796421de7f0272ab158463b1b8bd8cf7df9d2e8ee955c4d054bcdaea2ff22298d243c530cc4ef7e21d66ce3ea63854f6ddaedbe6c51490511e7a536ed859c623ce79a410b11155cf4231bf7ac55d5e6eb27a974fadef494db804a6a5a88d416ad5cd67851695b3fbedacdd6efe73d3e7c6c90bd2892d174a8c227a9785d8baf55008b697e3203aec84a0d1213ac4dae78163de76411721d2019e774d5880594da5f2384f00fb112c71d5429b5f969cf84b10b944bef5906c7f3f46ce0ace48f93e5396b4566e62431a13d9e5563241a18c974442e60f8ba16ecc8f22810aac8181f378cfcbc052b7e9223e0608e0f06bacc1267aa2ac3bf7370ef952a77cb06ed89a84a6483b0b1244c918065ce8d1dc135608f4db15c8f840cd2d65636c7947aa0f6544b625b5db95d10fee39910d7e291e91b77793592cf2d0d3639c2132945f1bc1aefbc7779b4303ccc58924ccd957e06acb606c161ab5e192553ce401de5f8641ee01697ad9b625f79333e9357303663a387ce8284af2c612422afd0eab11188c0aae53e61d56ff38611f2871d69776aa06b551b7440f48fc324eb48286df984b0deccce2f08b5b35363529a78a79d9623ef1edea91762ff82d905085f430d025fca21d96d8bdff991a5d330015135709e81a06eab88d43ad3cd81b3e7f6d86c3e1b88f2b5f54b40a157f90a401cbb7470a17e2df41be4cc4660e5bd6aefc83ccc31568c90db84230308386bad60bc3c6aed0c9f0b57011e4b41a597509468fe9aba3f097695171b572515e6b1a3a412bdb2d05459a0a5bb62ce45d4119b371c2a04971befb88093ee4d160de57bffa219a16dd077bf6f2e2d955af6565acf3feaaef31664bc3d1768cecd33c1404b64ef273985edd9b9e0fc05396077697db45d17d79b5e26b9202748801acda703c5aeb2c7f714a6127e5ebc75c50d2ddf2411edc91d647e9148da48e3057306b56ee8d29da6949b0540e619a476703e7009898f2c1ef02a31fbd22e7a9649e5dcab2e153f16d63f0ee2f2ab2a074911ccdf248a851299c037b3af879b4fcacae614dee900ba61e89bdf34ff9aea102e320f834e788ab9c70efad2e2e9847e3c7e368bcc9713c05e489ffd756bb14e0a6c3516695b09e8a5245becaed9f6cca0e18aa54e76c569d671afecab00df5b2cc7ca6e69b0f29ef104314d69d0f94eaecc8bcbdd0421c707b389630f1ed6d01bd149fbae2ed755114b258592831e6c9caba45ff6e3bb70589aa6f1200a3a454e053e3ec5194a93bc559315c754d8bf10eb7ee23a7a14fe4f7393277c577c1339f001b84cf4bee328b0248e66cabaaea22875f3065ba0b962ead876828b1ec2661e5ee8846596cc0ce7344fff5926c3a6cf23f2e8fd014a297ce15ec11984fb68fc805029d074a6cf675cfaff84cf96b56c036260d2992909963850b68750f6a8f7207f9bc9db1be6bd08eff5d1f780546b8ee1fc70dace99b367ecd159057cbcaab9d768b63c83f964c2bf60c54118ea6a30c21a4c68a33070da93b00314d60a83a6f80f1a0b876ddb14e9dee32ee90dd493b348f9b55f944b1ae5c12a019b192e9241fd99ea8eca9c69efae9033492537221616dd335c0baea34393124e446ee7e655b28a3c1276354c418e60d0e1d70e666af27b75112d17fe3d84607d6a825c2d93dc7f82ab1712367fcce9aa2b89c6cb327a58fd276f13a65433a8f165ea07d29cc9ee50c123dfb30b087f018eb3fceb0cfcfa3df7582e15f82f305cdf0c677fc1195b18fd02da4c73bfb57993ec1d204b18d3aa196ec3d7c9b5bb122e7fe77fb1295a6da75abe5d3a510194d3a8a4157d5c89d40619716619859da3ec9b247ced9840a16891e88fdf6b07d5b6602e253416615e35eec34b980d4c9482149ad1c6e4c266a92ee53ec37c2caeb4a927f9eff51e8b216515e2a5cb6c769742b728dd7d342ff1a820f48702e49276fa0dee0176f5ed6102f5e5c33e61ac94cbf5eca1e03a6fda84484bba7dc42355c96c8c28faac177d4effaf90d4c0a8f306f387b4bc2998bc59b79ebe6b4fc3d99da05eb71e957bcebf7fba6f3d0e1e4a9a3ca4864fa64d1f7efb780349dc168afd65d05c5146acedcb1280deb5ae5ef3ec1dad7739250f8c9a907239a82d7dd25f098b5911240d52f834bd600d260d9773231d37f72a328c02f2f7c1e4887c583927da5dfcd21f86dd72aa9372098c9dc5e97e29182a58866eaf732cbd819485223d67db62c575f1d148f2c9a2cd6e8f6add3acb0aaa041424229eea61ad58d190b69e41f172933c7a2400a30de615d4c88afdae4d2da7adca08b57b9f603bd60b1ff832076de9cf3e905e9011f83516655f11435e29c5cbd6ae7160b55eaffb07f5f02c431bfc12a51a87216d582eccd7d6201acc22e0f6c0a03d2a41dd37c8fdc5308103114cbf342ef4c76eaa7550869ca4a505ad8ba71e6a7348d38065c8830a13d0e5c25e1d724a41f29443ab59f80f1972a92e28655689de3cd8ccbc620e4124bc59b392c5d5f8d9538cd83331b299e8f4053939a9ff6ac886c036ae2e15e6ed73dd799d40d5b7354aa6bc9f803ce9bda9c83351fd7fa9bcb73842ad952077d8c7ff68e006f801d048708562cdfd6ae21460c0e3c86db3353e9f655d3fb47060f92e25ed80c37554ed88b70f538a9a00c44d4671a33013cc9d64331f76587d30b7e8151856be6e1daa4dc607e94af3842a0c587e066d47ed44252076e172daa264cbdb12f14f78a4ff3e36eed7e50406c62c6b8b7a7bcc01d360b1e6099a35408037cc4fd90d01855cd88e16b7bf47e3190be40c77f21cc4cb956c0f4744f995aaba8d41866db53963bb3031f1503bc3a34976837756b6808d41b33522f9b40c44d2827a81e7e03b7444c1a32d3e5c02e5538783012025df98e42c0a352ee13edefe405d44123ef63f13b6fcb3d0252b6fc89b8d9dc4e72c8efb3af0f66afd87e9cc4b8c45631e04049684a13dcc23c7a30726f5b5db8711dff5748bdf248581e59b087a1e5109ef654bbf232378e4521f9dbe7dd1da6209fc714d3d67e205b763090b9937627f12e1a1db14fd7cc34545fac6688a38149f74ed39781929fa92e284c97c192e0a190a474cd9242e6d2ba6bcd358377b2b2cd9c7ddde7b72d09ed49cc6954c0a275c3f9aa8f240242e7fc24269cf7219f24c8baf8ed2f7432445b9cf9777389d6367021a53f2d9f4a3bc193a0e20c29b26690af2e0f825216222128b9084774e2ac3e254f25d49f6495b2be2151e9185242ce83058b08d8416be7f6f565f8092f9fd60c8e89428cfabe76af922fb776e67e2a3f67a8e88e1ce7540c96d7add025d7dfde4cb29fed737fb66edcc59dc9d8e34bea3baf4bfc0d5e117482a48e522c1b02a370e9124b379e1a01e55bc49b8f39da8c69e858ab7d97c636a314c416ad35e764e276c32daee349729739547373487e2ed89b3822d55b1a58df7177a40eeb35298aa1db1b4018ecc9d9a674daecd7e0d6721012e97b72b5e42001ce85b90694f850b2829d5503aa0c92ec4c5762b0a78f1e8f0f89d9a440e14d0ef240144eaedb1cf0df3c556e2c45ac5105723d997c5ec45f578955b963584ede0b5d898a28d9d6a41b7fa81f1a7b0e1ec7b3e55b074d4dc911715978c5500bb940657f84adfa66165defb6de1bb7a09ab9a3c3beef639f1566ca4caa0fd16be9b9df5e02e347b48ece12e775d7004a0f04c93d89dda8a38b7d1a9617e8e459b59f538dcd72c7a8549673a4aaf75ef4c3cfadbc86782541727fec9f87f98fba641a4976ad03832bafdc97534723d986ff43d8a97b69e1621493c5cec2eadc773f514a80693e8123e9c8085e12027ae80b88d16a3157e4ecb7e22f8d8f62d3788e6ddd13cbcacb7a48844d2bd43d48032fc5206970eb37c9a493b144b8097ba599958b97995069161535ee24547b4bbdb3234e0cffcde1df23cfd4590388dce6a7f2db749c7761e1970673af5c658cffdec9e2bda8a4ea187bbe1e353987fe2401ac55139ce8bdc1181d6536b2a312b2fadf64e331185b5af687194022adea45f0ea81da614a85a0dea24c201fdce6bc4d8f5de563d33b8fda534de285a3a733bad4e832b246bf6532beaed56bb80e0720ff542d067a929e704941842b113dd4a7931184588475f85c9815bd5ee19479ba57d122e2b8696f00927d8cdd9db512014f84361cabae41a45a0840c0fc7ffc65c05c2cbe32c7ead255896461f216d40e2fcab2c4637327522910c658b4d87767627eb36493b4f72dbbee727fb66801185c6a5e1856cb95ad30b4b7efaea6d10964be1f9a81387e5bec33200192b38365feeca4e22abe70fe947c7b4d95f1f493eea5d929a45c67a20fe0d5ad2d00413d3cd9ebe88754a18d80f07a3a0fc2c74d2aba47d9a6279a4b4c7df84d305623ea3eb89af3169610a21a991c7ec420327e3e85d2712ca2ff9dcc93f3a742be11b32d111bcb7e8ba5858afecae05e131d70528ee2bbe1d37fe2b7a92d840c3ff3df316dd538683b497df9a7ea2a82a370698f5ee07d6ac4006035480eab35e1b1b7715230027cafe2d48f1de622dad913b21c7c3280727d6b616cf7fee666ac3483164b94f061ee59d073e724910ebcef932270428c9f04a92b873e65fb47a9628b47dd69ccc00097bace8d0e3ec654ea53c9c377699963a106aca5abb37fdf24162d92175c40ee83dac7980af3a9aaed3c38fc38de09a23a3c04b538d6b757636deff106698abf0477878f82765fc5e19498a3efb497c75e14b6f5752c961705d9b7829fba457b04da35fadd9091aeaca4104003b3eadcf4d5eaeec87cc529f3a0aace48191a2b6a4cfa628309e76b38b4c95cdca3abe8e3c8ca269a90eb94160af25c6a4cb1d61e13fe4ddca908066b0ceb7ee24c81f415357b27542eb1615561b7b46e1cb1840777684650389d862ff39d2f7d761507716428795c1fbf9797eb205fba51c33d0fc260d2477d4df46bb307f615e80f29df9cf7a21c2bbc3ec6f256e4b8b38e0a1d3a107b2941c1570792525b126b16624726102cfa19515fc9bc81cbcf09bbf21a299ec85e4ca0b7ead9a6e6dcc7d2bb914a9c9f60b325018891c79d661df1feecd532414e66931dfecf2a20dbc4ec3ba650c381b5bfe12cebbb53e1e7b5d9357c87f56f6157428f2abe079077290ceb6c80ac5c61062ce8da814b1fb99a1a9fb2860ed900e6541856ec64bf19c0d9d1cc2280b7cc50af3e3d2ad8e044945d44761ca60891dd72bd6aa26a33274ffcf7ae7d661b5e651135fcff21aaf06b4a2db18fe5827e0243884f2841760b9f1c65fbda870f7f0cfbd6ff484f0825e688614928f2d12d1e7080ebc610102b78e22299810b1b970f15282e4d897f4bcec0e8282ff67c08f8a0ad27c4ff87f1a2f63672ba19c70e3406337255f899caeb99cb34ec180c755a7c18ec693865c4e4ffa96dcdd99c4c4477ffb1a9c3dd0a05bc1157a68108de0aabc820ffe0310b07a68371017421b9060f95d59214d374e4d0c278a758f8aad1d6c5accc227430d492cd68a012dfbd4477fcc45610046e4f7ee77f35c6654177a518791924b59a106b8f39f0da5cc1c4563c683de1f761106e865399f3d60bc4bfc86e2d0e7cb186dbcfcc3af5222b4f555ea791af34b6ed47aade1b06d37080cddd72520952ddfd889709c58bb965ad1c686b98a144d3afb258070228e4d87276606fce3dbd863c1aeed8dbc3a7d5a652659b9ce0ae221e569ab6988092ab6363584cead147140c3add21c2c576e5029f5a1fe393fa0901dc77d3233764511b3ccdf1eeed78ef35906accc3baadfc88ad51dfb5e3b1f221ebf847ec74e33262a8c84622bbd77f7fc3a0c126cad581012151c25cf85a44472c23f83b6095b6004f4f32cd60ec2db27c84e8331c75de36a663b21ff97d67394602cf58230446bcda6da039073f5f9562202932d9157aece28e97450fa3c3c0e29db48ae4b8485ff12775acd6597ef11e7b6d6a283ebdee7dda57176153c0a3a8fa901acb3826b13b879a6ff5c1f38e579d9a2432760f03204fdbdd1815c6ac3f234950010c467a6194f7ca8dff2534b68f9aa81e48d8f273f60bdf5b713da15020c974aebc12820a567404c69c7babe258533e153980841dd6cf6453f08d4b82f7f6cef9d0f091dfd6fa67c71f5fba8400af2e3fd36f81c7f710b627191e727eb2baa60bd14a6e881b6f39b910382b449095bfc39d0eb11862b41b007458deec59fc430c4787e2ac2dbdc3c3f86dc4c90fec3aca1fc3dbb91ea5dc068aa45672f2a4ee23b80fb5f315ca4d0e5d684ebc859ee77be2f7c95133c94060e268a3bb8799ef78ae4aaf07da801fc2ca9090c4fa920eff6d134189aa0a9137050d8d6d1fc58e34b0a0978d84c58006c44d548a77b0f77d487d0c098a4f15b279fcdc31c30f137f477937301c83ba02d50760b603e0ea1efc9ff278db7f16fac89c58ae7a5fc580f93d5596a9a113df84267defa70a2e0a10e0ba7ea684da367954c98d4c9ded605154ba673307d4c5591273dd6a160c680ca72ec4f245aa8f158ef67541b1d346d4262e4cc39d44dbdd340a2954eccc60795e14f2c7aacd2d23b1a80f6284bf5b0c1b79ec5f4bad4a97f20a7b6d75b61cde6c35b02d9b8d372b25a703b6fcf9c7809c62f112f9553910b53a7abe9711c1c33959a42d0030d6b651bbf84502c8b1b80fb200e18f85d1cee663cf4e3b277ab02d4779cec1ff314b9fac96187f76413dde31c4d6f5853a5beb4d22254a3e6d2eb0c9d519c7427172764186365949a1966fa7e2f8139d9b3f2ec01a4caa9fc2c42aa56114f841bdb33e4370a77a8af64b2cdc054fd1151c0015845fca4592a2fb03a4c4c93d433e97607bfb74c8806be57c98d3e41834e7280a609aa7015e355aa38ea6407f921ba542aed0a42d7525ebc6a2f4bece44213f741e73ecc84da269722bb180a4747d664da7973f90af4fe574c311e5dd8bf5cbbb8491a081a512b0d9438b9195328c60e92df74ed8770f5bedc3d2622b528956465b9dcb14afacb83e9ddc7b3b136f1d7f0798d8ef158dd6996ade3ca2e005677f6a3e7568b399080a024d467d614f2575fe23e5bcd1f3dee07fde7b297f9287cd7b1da767f90028a63a85fb426253fe35da407e27f366f92acc7928a775583c9854e169f8c80aa1780d2da27460a432256396a918c210b1df17584a060b7e1149be33c1036adefaea43ed41faa16949af60ce707787198d672922e92d892c8b4681bbb97125a6bb63a36ce2bc6ecbc93a9b8fdb2c8ba9152aca800d04378c34f86520582842876d4bf6538ca20ef23c2dda82f12013e6d291c11abf735cc393c7320ba61108ab970904494894cb0529f2e64fba396afb4b02d897066242fc301caf23ac14c13ac10795f71d7aeb2d19f0879d3e60d70e08e6d5a0ebb92f5d945da511711ab35b73ac7105133cb791938f8414867ea14892a681dc75606c0e46f4dd7cfd09283736605f1a32c2775a1f37a75d997911d070a8a4f4ac3f4138ce471c0d59cb66f6918b29de83f473af4550b6207f3b6fcf2a56068f983ff503b5c02d6c8c46b5bf0d9595fb0dbbf2b98e427a0441aa036c49176e564246d29682c5d7409e645fba30e76c16d8fd3e9f8176bbb2e6b014d05452a6f0b13d1e1abdc0e131980bab1185e775daeda49d8aa75241d27634eb22d3717407ed0d22b6ef1814e98125e0e991fe7aec539658a2863fd30bfa1dd18b4fdba140ff9c26939f35380d6199476dde9441f712bdb60ea8a63b0578550c334ff8f545eed472d8557f1548414f28c2f31294a133ff01f795ed3f69fbc3e4415b3037bec29c4dae995e723f282fcb1358de3992bd467f84d37ea8df884fa3ddfbeb315284db013df43a189d1e2177869662f873b8797adeecbf3d0e29e18f31b891a9aa3b7bd4aced7bd0082b0d754334059bec2d80382c681ac89fe561f262198a686eef630f240d89602858db0e73ba2ee8a423430297cdf60f39c5b7129ba73e3645a87bf9ccdacc90a7ac73873eb047a944a2a91f47a5badc85cfcc3802e816dad76fabdccddead2a2a30bd2bcb9fb7a473b29cd96377d0f52b0d86abbf66781ecd4bdbfe4ea192f45ceaa241430fe6a2da5c047614cc9f22d287ceb5fba9cdc8cf45f3a978aae4b8e2e40810cd863c6a21a7c73f812b8f2d22448d9cde377ea18464db2373810c3c6726d9e1928e21c6ef9cce7cd31c08dcc54ca9a98f9af17195b07cb466ae704991b6fbfcbaaefd7cec410175312772f960a70c24375a9000a931bca679b97aa6089e58a96c6f3855c1a04871c4d5354a9e5e9c55fdfdc21569f0843fd62b911d75e6d630d0573a1916c18cbab3adb998247743830a0dee7a7df4bdc9a28c1c7480945fd80ff06b9092aab396273867aa9dfde7f885127ef58c454d8a08628574d0b2daeb51c23481de65a74e48fca54aaff572fa9792d94f3eec1ecb2e3733e50e472eafbd53fbb6a2fa4e293d83dc3e0269cbd2681767503df016d33c928e8fe15c456d7c2e29f5856f92712f55754f3f60dac81f2890bf2e591fec5bfcfe39f2f8066cb5d827072fce5a6c45f8d6450ee38723e54ebc65bc30205cb3fcebade92359f691da5cb4491f8d64a8f669e816f9ba2de10f530b8d7c006c6b1abdb16de5265138bd2fc37b68159f7fd7950000aa5b2c3cf6bd774945a964abdedc0e264755c6d1090afe6cb3d966f321c15473fe52691d8862729993028c9dd1b18cbd50cf9d8544542bc507c1002c5e57ad18fe872cad4fabc3256ff32b667aa2f2da097a1e7bf874132d6db5b75115bed397b1e3bd13d2fe3494e0648b3161180a24783f91dcacd47e4deb9dd18bcf5e8e97204c637899c48b8eef3df2240f7c9a44a7073dcfe9db34cd8c619701139fa6c051 -MD = 4184e0941a1fb27a613f91b6ffa7dd74ec65852fe63e108b94c8ceac88193620a2100d638bac1667072c40d05602c0fa - -Len = 54088 -Msg = 7e0c3106a5a193b751a3bcf89cd628e4874687fce195c0196b9337a6390f4c0b5bed246cbd79ab944cfbd92c5a8c3531442798a552033484de20d4f9b92065d2ca59b632f8287c854b8899b94de39eacb7288ee0491de576faf7d85a5128dfbb137871be1e570e73957183083d846a3c276ef017908bdbd8053dcb30cbccbfad7d71dc79f7ad6a4473df207ff216a1cbde2446b1edf41e93481d33e2edb60f92516d7fcb4ad397e22dfaf68733424c40227019162900b78d0bbd9ada808ed751d893e31de1709d330be98f89cab071823c7aefad0c58adb09645877f4bfb1dd2570c8fd5822d852154d573eb7d071b7b746b53e05da408e330de833918a6ebfd19ff0b5df6b2569352e5281715ef4f12116bca16e68bd00d22b01570ad3748ba6595e01b05a618704b4238735a12172f5da1deb86db60e18b5e2c58cd3553df182f5957976b2d4a288132b6913157aba9e36162cbbcdcaeb2e9c1bf552a8d08ab949b2dd137d91105181875f0aa3819c1d52fadb98770a6ed808a014f2d90b6d52b6c0b1a2b057a2eeb4d6bf056232bb221b132dcb5cd889fa4bdb4f7b90f6829566465cecf22e40a6d39ff0cdfa9700f4bce88b1e253b24db90540fb47498b2c981cc46b9ec1fd2c2076b5a2a14b853dd5b025b577a3c27c4fd94bd662ef9e3382edad7d14531408a77c165e3589b9d2321e7063f02e17afdba22bf596621fe2896f977fba66d72464c2979c26d4ac40f3521f59e663406cef0867f55c319ece2e1b08e01b7d9513ead2bfe8dfccdb2e9bf388f3c4e3db17fc7496322ede893ae368884a91f80c3bac3505c0dac2a4df9e9b23be06003645766f2d5878d96ddd3bd08c1bc8767b101b51ffb0a266b7f86d9196354478e089ff6093c4e4b2cb19ba0b8ad019698045cac21444c11982fdab7f46e5ea9e683a09e17003dceb1f64c0420b142f51aa213d0dc9d9a16b7453bacccc4c72f14bf9f87a3881dbf2d962f13c933454bf5756e48da6fbdddd2a8f2e028cd56801fa2e7d8353eb5c5a8788cf53a9dd3413164b43da3237e0df042477a90f0d5450f16bfba5589cf892b84abd2fb55b47fd7562fd6bd1fa34e1afa81a28c980a25ec026e558cd131b2bda2d3d195c5b0acef35253cb2cdf44a57b8ea82a52abfc9bf4d3dd0617fa4e967ba4e1a8f538f707fe8df960a943ba6af64c83f620fbad890e174545df9f0d630b462d6716918759157a50d4bdb3e0d2ae764044cafc4fb65a55b0806a8dd202078582dc46e14602c6abfc9ff0cc625d12706f7e972a4da48813915e7f433703fef78460eca4cdc590974f1ad8e9b96ab0df640c4c1241c405d58a28546b96d96ff094adae4858f1f1c0daedec98509c0817b0862020a695521fed86a0438c02c915560ad268a21868bd22719254c26196cde774d9f1f6b90b674df1d987910098ea2b111f7223b963e0b85e60ab794bdb468b40cfe2bc7f80202de2668410636dc39658dbf1485581d00efcde090fcb4435ee82789f62896eeeffd0ede5b4aba6562a3aae729a6d311f98e570f9d0507ff0b3a26a64734706285665b608e839d0f6493eed529470f003d890bffa758bdd2b6d392bfe79391470a3e9858a159e8c4895ee3f2dc0f15d415097218759cdea3a6daf33b9feefe83c7b04a2d5d76a26b172c11a609a7ec73c93612c3d17a73592478cf8235edc00004e1fb478a7fd3ec5724ff5a7ab69cc7a1377666819a83de78d5b0fc7137e0a409fc320ef01f832f916f3574f5e52eb6e435236b4ea31619ea181d111d7566591d2778ea56fcbb1b0d343b5e43dca92adc57a338003e34f2c26a9f29ff4e5806898a544385be829a129c9a7e2c42150acfc67c375f12e65147f2bdace16bc093964f4e81460ee194e9cfd93e77bf7b3e06a939ce32c8331ec2d9ff028973a5e7899bee0c5f94dfefdbf48005eefde2adc9295f67430724417b46ed93bf0f10ecad99bd4c98f784942e34173a57a15241606e78695878c0a3ba6210c74de70889496e42aabbdfd86b2ab627477b56d3e1129f0c3c3ac20f2ac754ef07faa295a6a445058c8ef6e45c19a3379322c26e7528e5a148b18e19bfe94512b98de9bf2c07448f5bdbe1af504122d086138d2ae6ea67c1f48584e74b6a5d0247cf638f01ba936780684b412dec5c79881860101aa04ef3aa7d4b80b490c3461788b90c0e055b1561fddaa3dd6078ba01f7e326fa92c1c0d2628cece4a4a066937f923f3b30c422686436dc46e59f1b5979bd766e08e9aed2fcee34c1ed1beb217e972e7182f515fc6408f452c5f925f86696085f49ed4713131a5f35b55d5c2b4b70e39644177684c4f8f4e846ad5f478618e2b39ef613fd6fb77527428e4118afc46693bf51ce6a4dade3efb2e452aca1e90e544f2c99f9d76e7f7eded42350723bbd5138cca415c7d0c9514fc584907eb19428a4b6616d15e78324cf5a883b5c7ef2b7faaf80edfa08aff566797f5ce6197a19e4bdf3c2efc98c005d46fb4135350dac4c23ea5aadfe9cc33e27cb76a1c8ca0e5968d8612ebd9ffad2c101cac408141a75506bc4aa5a98a321f8ee4877688cee49e097b09a6ac6fa74f2243ed29d11e8be5d8a93b7c3ab7d55147238309ec6a3fd4cb819fa7908e88d02eb05279f0bfe6f73d02f9de1de3923a2dfb093148214bdd5c30317916eac6318de878bb40b44d0b9c401235d38bfd3cabb176972c729d1a341d6ba5bfe2f3e5d862cc68418a22858ee6f13dfc1f7adb690d57a5f9eca80ddbaf9a97ec25768f96a5d9fb83a00c177d6e2340e82caf98be5528e840ddf13acb4d6ada3c20d28131380e0f87946e13f05c34d93821efe7443f56d891f50d237b9d48d72053ac5d307ff4febde5cd1d802782715cadd05973128de15d90505a7505b139293c48862d040b53a702ad969556b8a3d60ed561c3753abd045e7f42302d305ac7495b9e8f6add98d3898401a87023db34e38392cdddc9a646adce7d455a42c67b193a08cffac858a3c8f50151fa70a1e9ca4f6efac2c747650cd25e1d337506c50a8847775a77fdc86f54f7fa5c1b727501bd48c2bab00b100a3f77304f239625cbbafd1df0590291eb48683a1b80d7574841c2be3c108ba8144a5b26f3eaef2dab367c1c62e801a0ab23d469cf3d4b10fc617f65ad7523cdb9a77c59c8478c4d47af56fb18a175654d9bcf31edcd4822acb0a131a53a8dd178cb4d5132a5f7f51f7a10428811d86040f4ab0addad491cc7a40aaab9fd0453c01a6095d9a2bcc5a12b2a8b37b5951203e30a5d3559e85fdbb00e49321921d52e3938a013aa452f6b37282dbe09460b24db7fc17b5f807c57691e85c43b80d6219c47f877492ba2dc227bb2718965ac12424da0163abbf2d933cdf8d6c08bc728b811178afbcab07271a7a208b27e856abc2691ac57f543cfb49f1af034cd38d2112685a52ebce8dca93e84ca10fb278cad8d1e9443b6ffb94004549724af9b8c3beabb8c7e7cbc694d92d35c3155f2f69ad3af749a9b77047a804e320cbd7fd59ce0317757849bb6b36706357039783708acbca3a8fd5a5fd8b550675961563cb8a9701c466f07239f0d95dc79f047dc7b7acec80b670a29cef6138d9755af2013a90fd1c7869f5e45092ab79b24c24567c06e584e6316d0d1d5004b42e4eb3e3261594e5775c4c559ec0d5d70317810621013bade6bf10395d49ef6e8a9aad5a964f4c872c707d75228e63475c0e9abdedc4786280c49307f774836f51e6e94cd165b06a5c4e922b2422de3383d879642978230d7ae5fc5e32fa47204bd96da3208045f7d29e925eeba4ce02411e26e41e44c5159dcc55285703c3e73f1c4345cbc89594550786f8c03db91c5e88a7231151e5e2b121a64caeb6802df757731c1a6427aaac3175e0eb1429e9a2bd060b4dc60bdc7e8bf5b27f3c055b3931030e547d83a2a0c567feb453a5d1d5664b8319ccc06bcbb34c4212bddad7ce52fd05c33a32e2f96b653a621fb63cbe2a7c72bc8b8af76241b2e4ae60880b7e6368e8adc4bbd47fca757c3fa3e29226b2a3c27f2af4e809dc30809d4d965d100c4d9f5b42a6dff98ba2ac9104b43bd5a6c75aaad283a6892cccfe25ad8c374ef4b31115dd7c6a3155f1b2a16db19f93adf12285aac199aada90468fa8f300fec4a22823bdc3dfedd16c76b7046326286f280257db3529338e844023655220e92323cbcc0906a5f6a71ae11bf151395b9574e26a8c67bfeeefafd5280d31ffd7ba3ce259eaca24147e03d9145d033ef5c7ddaa04e6e0c1a1a619ebe8c718059031f756128799c40efe3047eb70029fbfac6c426e112799155bca6ba9bc909adb2f5c0d3f09faedaed0a814e951d5c27eed2892f034c4ad12b5cb3eb4132026815c72f028977607ba9c732653290411fd311a83d1774067605c234a51f551114b6141e7155a947afb099a67741f18f2032148fb5b03222ec6f9da79c78aaac3fee6d1db4d79dcae39c024be935c98cf5765bce3d400f2690d34f9b260f9b3a465922bb2191dd60c3c691912f7070c0fc2a47e2485963982fdb486dc626bf41d470e5656c16e0bfacbab824de949fc1a0c8694a4b6eb7de05e228ce11607f6946b015aad8d9302e1b02e6656b14af158fdb5084daf2a49ebf82510a8c4f640729a1440a1c4b5432ab19bcd15973173315cd6e206b779220b93661c19b45f5a209cef0f19b0fb573b979abf72e327080df39428b6170092a8f68cb71c2d6bcd043939cffc978ec57e29d24555dc533a548894e44718e9202aea40ea9979422088399b8834c295155931ec66a6cbde906ee4811da0005955f9372abc78de0bdb1363bc43a87939d036758f2b4df8ef92c3cf01dca9177ab77da5f135a1a5ef870c8045084004a27d7cbf649a32abafc9bb11bc284aa774d01ffb3e5dfd1515abdd58dddde4aaf7a493d513be3e2c45bcbf715c096bf66f284503b83d7278a5cfedb32dcc7cb461cde37f439c57c2daf435b88687f44d9245598308dce914c97ba459dcdcf06a0781d4879c3e66b796f787aee4abcdf405b1c144d5424b33a7386a12931528141247ceb4c8ab5451a04f1b1b1e7cdf33f1f4e70ec8787e1b678da7a5fa800dfaa9a839cd6ceb07d921835bc7dc0210527e9431a989856c143203c3dbb8248564f52b7d9b33076996401cae7ac5464998d31b09dcbf71fb683021267c760a79991d5802e6c20661d226a17bfb814f734f1911d6701245155d886f3950db38d2e24ab73075c4f0d6d3fa9a2c13b92674bd77fcff2e2c08a13d6375621e90b87687a4d17012dfcdb2e3e590288a15d1362a1666eedbb2c2874ee8bc0ab03c924fd0522d2883bba6dc480f0ad7283c5a9fe01dd60a424f7bafd940cb9acc88cc44047d53c29101823c4a9f90a1b4d7c89926b5d5bb2aa93c0125922a783b1c703c6d4ccca404596aba33beaaeef88d240b4306ea695a680c657c07620ec49f852151e81f38a46a653e4993e126ba0775dc80379d7c9b35f4c324c7fac331ba14daf978d4e439dd7bb0d647bcb1c3ecc3f62571765cb5b8fb0366f97afe4914244fad2574128a59b4f82001c4f7dbe517407adbfe727098290d8ac56a29d356bd68b5178629608719fe70ea7f61c99a78a2c69ebc24947d86c9d85453ab9827e70d58759291830fb1ab0d2a775557b2ee0453e138dbe8111b1f98cebdec6030ab26df6720b1bb9885e541e8343c4bd6814e67cdfb0035f9eff8115b2e54f218109b9217b9f3d0ca9b95524c3c7f6ead3a684b8a8cf943e00a3a8c21304b18881f54b9aae4be894ffda4897f198488e0203b473f7330da6c75cf514b4a399828df399c4b2a7bafccb3f82ea953b561163bada214390bc245379da8ff05863b9f5833832012900aecc37b89f17079c0f894a7a63265f4c214588ed965e79ac9969228b551246662543713e180fa376f2d321299c17f52a481e1892ba77add0ab496027b07e8657faf16aa807e7959345e1ed4c4e8108d2e33d975e8ea46b8c6a26ba71d6ae7f529a36927ac127346d8335ed76fd09f0d29d3483c5659d291c4071901e3a1a87f27d83772ae6472662353fc01e2a1b4395c0837c5bd19a6d1cd8ca9f614d5b36942f88873ce9dfd21dc67ff3c6482d77b917bacf867554ae1a9d92270fa2d911d42a8651253e59ddfcd16706f3e9b913a8ed4b2bd9b33472720958c56dbd2c901ef92d4378763d808bc095682b91569df1cba4efca0db230df968ef9000ebe37f105ee0cab040390472e8b95c1b18e8d003d58a9dbf7669fafefc5405b1a168fe6fb48eb317a3453bb75aa2e7accb94760bce6d88402c9e56f5f6c29f361cdfe6d23ae8da04b586165207170ab657f839fc4dffa66b244c88a7014245d683d09e029bf527be9e83fb0d9823ad7fe499829df949dd8787fafadcc3dbdfdafec390c77dbd838f85c453aeb5cbb8509901b7b77b5216de7c31135ce495568ab74123e88949d4bd92d287fe051914719eb742127a233ab62c783bee0d78902ed3d1bf2f66a00491ef34fdc53114a72a1c4389769fc22f58bf57da5ce68d760e7dfccc62bccaf953c1721fcbe0c45ac33b2ef6ab9239df0c5c56586c16dbf072db49b24a35d09d4b331554d7bb32168322feef78fa90301a2bfe1ee7466ae7a11540daaf77b9d6c16aa403b36a65c1b4fa3edea780cd0cc955d692941d4341e45469aa592a8d8efc91a796259465449cea732afecbfa5a6202671d3d446de883c04d8b0ff755ac45cea674f6e13b88831b273b46841e022d593728a862f0c2c68073e69b861818e4492a05eefbee74b3b4e179465242eb7283d0199e20d5b9f4bd6321c37edeba212cbab1d48786ef73de2a4cc8de6dff79a8ba59e72623b4579ea6a65087af7a439cdfe072300ce30ac1891c92cfa72589ee7b514b1be29a354cc3db094b944094c320fa8e9b8737c18486516ecef845ec809d6892a71b55d7ee422ab86f94f45ac90567f173ffd3e050a95322836948e884a8058373d5cc85adacfa239eb87eded6168f635e7d9faf4c7b8a76950114c6232292e82718e787b188b2137e07c66810dcdbab04078375a1835f34adc992ce849576876bec8e24215ebc50b789b440a2deb1930fa8677c7649382272c7aa47d0881928e55aa9a525b77fa2f24631adb2a47ae12465330af4567e0a8d05457b2e84e39540692052e71963d1d74723f869b79f5eed48cf6842319ab2a58b49b0c7103c952222db738c0fd0a40d93746aee9e86d2125823de8a62f2e2635fa02fc2b48cef348bc3503f1e2ee53d320a496ae199053b9d17b3f172f0646f8b304048f83b6c1dafbe3126d0e55a0e2dcfdd04093fbe0f209431a1e8fbff7017e32a8165b1d48593b55d69ac5dcc298ba970e59ddfc736e8809ec24c7a7a0e099f37948256ef1641911d313aff02355482483425e3e659fdc5437b27d79ef26b4eadaad7938476c038b9a60331c6db9041ae1a2ab2e420684968f5007933c444d7d5eaedce5d4d189479ef8e5cdec348ceeabf33b4883230f655585fc8012b9d22f77d4b704044528ca43563e913948411444ac8519c385db251cbcc2ccfd07d175b8a7ae2f6027407849f0b3e2df64af204e371f1e6d9f867a576d00d665bec9e483a008b473089ef5f560dc5f493a45971b4b7fc30be08fc9a82f2d38f73f39f08b567d2fa76962b7e81f1e53010992ed4e221da408e95597617bbe610c09802e1223621d97ba5a329494005a8183159759838f3def2a866815cb2afb1ece5af1ca9f6dfaae8bd3fa8d6818f255175c29cfc82b0d492470b057a5f943c9ce28e00742e733664e7e7424f3cea6f636c5191368977e9157d3048994afe777a9688d7a8664745982a8340dcfa7e4ef71fef9b6fd5b1e4244fbd93dffc562c2e0983e77027c29f2c8efbeaa741b38ab5948204cfecc78e66c79a2e77fc02216043687af2f74c0bc71b3788d59cf1ea44d5f3127d581faf84ecaf6187d26c1fb74d20d656614d5211da1f629190a0374dea2b0ea2a1230f25c6e4743807faeddb2e9243c5ea2d3cb4d29cc001a7283977d91140654d3a75f25e22aeb122165575eea50b671c5591550b94e94d68f1b86bac8cefefe6cbaa92bb4f591bab271d2d964375637e2b199f8ef1269e5b637cd06b866467f44077aee555bb9d2a950eaa2c53c8e198189c376299bf1c09e74c4f1ce6e8f6fd00a2eee51a1c6028c7f095bbbc4d0bf385e1c88f76fceef9e3f290c994c1c48b73f3f9c288c68b2d278b9548684c0716d8b1f81e6e243db3c1343a797737f82501347884860047bf1ca653dd3e0cfd897bd46f166b8130c0e7dbf5357994bb54122b1234fb11bc680e0b768126d716d5d412d67f5459f0a7bfaf6b04811e349e0ea170d9d14211af6580a73d08f379814d33d56211f5a4f0af7741ee781f8c8e5d5f3a7befdb6f1c8ace8e18cca950154cfe13c6899d752421fd22fb44ddeaa9672a17223d24fd38e3bdd21a5b41c01a3b3c39b3a6998bca7c07b434cea1777995cdafd7a364e48ad9141c4b9b03f31781b5ee314f300d6a285e9fa0feb25a854d0eaba109e54b9bd59d13b4753711948631db496cab238d8dca8c47bd5abc55f8b7b38957ed5bf13d1e605cd1244119b278a802e652f7ba13122332f1dfc572ff8e6e9675c53b167a60aa4b9813ac2f6d51fc65a36dae7922000b68838a9c63c85c85d04bb51592f52b9a8ab04c7a5d1f867f788c447352225aedf15ca36ab0bde89f3fc2040eeb1546d8200317d22c30ddda45891f6cce7be970d6627256e245fc65ecc0fc50ab417b0b1578bcdc23081fb5d48345c17495753d1e7f3e8980c75e7fde2ee30359e390db72f682c2ca0f14b72b60ff9bccd8c6fbd19a512b12add7941df5024e7e624ef23e67b3a9a9ae8389540a95225fada353f89bf163205e2f4cb2fba15aa1267df581b295bb494b35d357674f7db47ad5ed9a69675933422e51a42a084f4a97e58f43bf71203150f33c3a6174d554a82570bfeefb36d2c19c48fb697e54021d4d668d768e00e923836c07df4e51c5a058856f11f422864340dcc09f4c914f207f2266bf3682fa2ead0cc6c8231a91c939d3b3ba9c44d630e3b3fab6bb2fbc08416cd782afceebd73bc47d063c573f8a8f0392d139c54af04d75b1951156ce3d5cece7a7420d4488f33b3680e131584d21bc153f14cc6aeb46cbed24962d0f2798499e1637678ea89f1af81e5ad06379b8a743ea7582bf8a965db74b94dd062ebc2b04b7d6034f9f0508ccc8ee5be8761c6b24bba30fd03304d216f2518d3bbb923c2272660a12d4eeaeb866e6fa70ab15b1c09ae89a254f5ad2130116663734e021ff3031a35cb121b3c7e08ad782826b2120708a4b47475e07b5602b9081036f85a3d77df7b79d68c1fe1e2217a662e5624b23d24bbd81d91604f8d832a18e070e1751932eaa00897d6709f6e564b34d1d499d08c20f6792aa08af6575203f6f646284bb6fbe434d9109874e6745de69f923c474d8c6605369ca6e1980857d71308c5a3de279cc7ca5ec8171 -MD = 3a8838e486476a517a6a3f4bf10a0144296e631bcb1347f812f35f46f796977984dc7c1936c254f9ecd9469078a72ee5 - -Len = 54880 -Msg = c775c7f17f600e3f6f4873019bb0b6056af515a0aa3b7046d4a7ab5991cf543f7e6e85b72c5d0c6d6cbecaccc97a591355eff2aba9e28db827bb49ee82f10fa581c37230ff29da6b370ae2943eaffe5cd178613d51cd1e0d0c588dd4be71f0db58da5605ffadc062589283020335ed0765f82bfeabe56a700be63db34d383f068b1df9de35d1067a57c074bd1ff66e3d9ad71898be10bb07adcd2235382d4451a2f22361a77ef3dabdfb7f6e9ad9c926f67df0b0923757fa79750400863746e226c39b395f9ad0ab12aa6abd7dc545e903527bf130438772f847abbc3f408fe19ff72a0c650ee514dc37fe51cfa42baf49bf81009f1a9397b0a9de126c2f657793f69883bfc37a3ea50903d3985dc39f4f2ac988e7a6c3902b0467a914ec11cc8c28ad4577a0d751f48841eae0d855e29dfc1c2f11cd5f86f1c10c2b3f5eda0711f530fb958c4474521c803fb0fd299fbb9e429d2479aea08846963df56f0a50abc5eb4c1f7108cf462d877a0fb487ff3276037b2891f9077afdcc893f06e8d1e000a4e11f366c8b58231f4206e5b62a88ee277126fd88e24f4c78b7240bbbaf3b0e24619cc3b8d01066103f9c78ff47486d752624a5a35a8d9d606fad67cc15415733759f0034c5f75e221ad955aa7ef75ab6432d719297be574d58e10063297c4498c52fd5279394741c7bc564fff91f1fb26f46499cc069e2081ac8bfc713733b1df8542adb616f0ec809698e45dd4723315379150bfd17a6565e6a8c42fcaea588b616e796581196ec6dccb9c655f8cefb97cdbd25784f0b02ccd0501a0cb6eba2a97ef4a1a00172514ff6cec886b988d7e24b2933569979d20b01f1986a1273337793394460c70cbf55f0b6949b12b98fdcf9417cc27d5890c40559043f4aa703c85e9ec6c1eccafe2ac15772ba8bc9e92ee1ee4ae28410029ee56ea6b2e7eed945e50c71eaf716d574719ba90cad21ae800b16e3de3509f142a81ac5ec70af7f9532698b0370570ddc096983b8ff27a6797da290df19ab24575644ab146d54bb614d9f5d36e0f46e0990a846e60a4498c2417b990db65f6586f8d49e53664456513c942fa9ce57c0a40e423bc054e04d035f87468f978b7a7794b1e7d1e4e7180c09324984c2e7cb548c1eaa6b67648ee3ddb0df8e41992cd135c5ceb56ea5c83bbc5ff2f0440c57c21024db12cb36210ac5ddab313eef433ce0f79a288de630855b057315dd2e2b95a53c15db06c0ce211ff6f3a114f787629f2f9551c8121693f00b141a14b51076504ea2eea2695fd0f1e2ff054e17c0e879550559a791430c82591d27720ace0d1b42c87427989abe458b178671b9b57977523367b2cb7f991ad7d6667e932d010d00d0951bb7499422d8834c07442fbb9f0c67a4722991e2bf6d87fdc0b9f5fb2e710278082d32f991b18a7e9820f656fb6ce9376e11438e79037714c0e4eda2877ba54675621e9698fe7644aab4d2f3935a00492eec5b465081efd4077dde9f1f070326ebbed41342a78dc7c76a8b3a6dbff5023b23a2b14dcf37641cea9099fffe6241f1a91e179495182f76a9e8d2938110891c1ce07877d597ed8795cb392d460bbf0f8bc24a98ae5ea440dab2640d8a99075941dd42d77c5797d1e45727b3c946c7cdcc895555dba94dab63b197e1c0d8a37bf960b873aabe898141fb0a996d5a81b4d43be0d3053f5241adad14190d158609ab3382554815ec1f13808ae51c91164b0ba0921b1269dc8a206e82bd5897d78bc11c47853fa4e733c2af50a1bd31ae1ada7f1434ec6f130d24bb8ad389a7bf8aa2e4af0975b3a346b64e04d4388370aaa7a20d2679991e52225ed465878d668db65364ebd48a48df56254e8775cf8582dbcf26faa32f25e1801d077a3c91f31c65300b334371fd870cfed4c15b5d152bdfcf07b750785243a8c1cb1b8ffb8fbf17454fe7a9afeac5409f418ad474472b1a6a57656abdcbff0012ca4f681261ff3458d511f08d382158d13beac85d430cf367bf0dd846b89df2d7a91eaf1f9263243248b8ff530f23bd5c6aea1d613255d490e6b5825b42a5e5da13904c6a49744f9b4ee5be499654d7087891bcc63c8f24ab7568504491a041e1aeae283bafb81e5a8f9f15b6f63b0e9d0ae88dd488414a81132b2a48cc166db5227f29daecb9f739b5eeece45661cbe2cbf578d53ff3b0da6908f8b11b8dd31e180b388e27ff43fe65da2b19df4c74a060c2660f882ebd7e1e06a2c5a78fdae3385b3ea188106b72496cba9eb986739f74573dcb8c78d934db2d10cd98a3eace297621593876d55d09ab81bb0b972ea7adbae751725c6cc548862b1016526ba59464cbff5fb9eb874da069b7fd050f80b3f54ae9635fdefa0c18d9d84822c531202e22da245f14b7bc5158dcb95a7cf12f1050db870b9899d0ec036b569d613a76db1034b0f2b7b7fec83770641ddfc4c911e06e05e7006a3b089212694ba5883d737c532bfa3e4dbc0defbc29d79fbf2802e1ec067b7f37f6766c15a9b3fae21eff4d80bcfd10429e2666082e0f24abf5ea3d9bb1507ec6a83e7bbc3d5dc911c1866d038b85955d4b1d869c9b4dd64fd7d2dbc42fed63e0fa66a54f4dd178decd10c324c11935686cfa36bf991a1d7577c1a3aea7da974d94f8d4150398710eeba6372b86425829a8c35dba50fc61e37cbf7da342a083d51dfbef5785391a6cc24eb15f0186666aa882e5d5e77d0a628fd551e928c68e403e78de5dfb3cddbffb12190a5b70c7f1133eb558862580ba580907c980d41f559e76896f8e2a21ce3dfa5772bb85e3869200b58b577b2bb37e65878b7253a0dde6fdd8d565894d62310d54df4a4f23f3cdcfcdb67f077415aaf1b97728ca78a1bd16b3d6aae4cb437e53f69b3055edff6bb3e5202951c1a783b486d5c7c10f66ccc702bc82c00239cdd426ed941faa7115b4e5127be27b32b2b6d4ec7ac0cdf7ba1aadcd17a75a0cc699cd1c9e36c31272dbb5d49d410b7edeff8d0567501a1b30179c5291203b8310a9d17178219eaa2b2f3eaeb8f6d753b0989768b6f85e99d6c5b79218b40d68540c1c344768a501e7b866e8f48a4979d088dc5d9041013a532ce7d7d2e9388139cb94ad36943fde4f7f16c97884c8b7e5d7422c1db26bc650541267ea4a249768ed23236a2cd30a0a8b379a6d6cbbd7978db31c84d304057446218b865c3a71887ab0e00eb8cb4ec1e5afa4facb8c9f90b31676ee2c35be6809fd8bcfa9e0d9427b222a48c08e701c93682c4827a2d875515283824664bbd3a58cafecb87f953ef7634a40cd8438c29f487d7f0b654af16d518869a8fbc25e23b83f0511806e23f65a88206615705c1039dec6fc3dbcaa11fad0cada609cb18a6882443d492c9a80ef2b0d14a9de91ef2296458492f7484435a2ce65fd1173e284c1cfc344974a9e0a7d315ea84c0a43eaee252accc4740fea459cd038e84c33f344ce2bd876dc5793c4b4cc7a806f147b2e8e7653e9d67801025ea37bebe6869f536afe6c93f7b47249bee68742676bbc9ea7f1902e158a632139672de0e6e26f36cac26ab444bb90547535385c9a4f95859922e95dd94af6ea57a3b590f7504b34180239a26a76d32c0440f394b1c8ee2d8b92c73cccc2a3a4e0df7dc3bfd71b977943412512ed241b918f21b454deafdca6c7939594f95399fca3ec40e67fc7a5170fea04e4276c6745ab2b822a9ac1db124bb32ed9f7ec0fd1786ad1155038a71aed9c09872c9159471b77c7dc030a72f6a691cf44c5574f8ae55f3cf45354e4aa66bffaa4047d39c0676f4a112173e87a5e93427c6a7da14d73334a2a8f04a6ed01bba0e2b8164fd7187ad572fde487c8fd234e2aee454c42a84fc3600c31330e46f8c3ea4e46e2b5b5ff2ea79e4695050ba8baf65a969a930f196f3dd3c1d533bddf2b63d1f33c81c6681e570d7f5b5c0e8a4f87b55ad1652dfa166aeb9ed185efd69ff64607a364d41c6d2a507921f39030d58607783ae38c5b7f8e5cae722b6346e94bb76960866683e3ca711a2ff21804149a58d81d32b3a273522fdbff4da198cf092b01bb0e040548dc774ccc822f6dd36cb162c27d2a39ba5e6b0bbf1532321ad9abb7fb24360a630b6bf641cb5bd3dca419fe70ea7a861c591828fba99d7e92623e736af285fafdfc5400d7f4279ef5e9999471a12af361eb3f19fc316ae2fe4dec1d4e9d783dde5a3a51d3251837e7e3380c0bcbc2e650bde7c607d622c82741bd9df050983bcecb26d38088b804793bfe4e8790cac9b277181767bf4c97d6e7badb98316b5d95f71e6d25428e6e7599f3422d17cb034fc1daf4621670b7d1e7eac08e687b09fa882d07097e22dea1a420d144894dfcef41364542001690e0e85632191e50a8c723588a7562fdbac7058ce1160dd61c5aa233f24da7c78acd92041a827b70a3c272a9dcb116a66bad643f5be9ccf0cb578adae3cc330a0d5f8efe6112a66560b41d27e605c3a55a1c67422806ee2271b0a2320106cc68815d844ced0ec8b74964ccda90b99183eedbb99c2eb59af4762b9143324598684e901bf4a8c108ecc59c26cbc314a7c78eb40055573df8ef4291ff155fcfc292dcc0fc0079728f8e3b22d301655f2ef9a46de5768ae8319a3da996b171ee706e93b4cf774768842515bf7c845fe34da297cf0f06affc6d7ed03dfb1e4ee7cb85dc363b62fcec1037ba3bc95d9ae52d49cfa2270dadc2d3216113d964e005fa5e1d0ce8c87f465b4e925e6193fdb0f576b4aed4946e828c0d5af5d68c0d8f2581bfff7fb1b8be8cf105f0ed2e6f8bceb1aebabfa1d984bfca21a99a9cbfcc76772bd7a8268f9ccca97bb81437dabde08325908f3fd60f95de20f7ce9fdd0513c7c85c0a2dec2742fc5c7f7fb5258f527381f6ed734d6c36d3bda91a9a4f8324f9fd564ed1b7a81774100dd5b038494d0a2ab5814726e4c93162852597fd8bd296348c1b17d8677299ff2abf31fb33f8ce8895f2c249bd777e7655989dcf684425d4c71a0937ac7cf2929ee53e56947c49035de9ec9f3f674461df1ab5ad60a42e45cff3aebdbf5c072f30eee231b6000304d70dce0eb4c20a8aec54e67fbd1739ee6c4d0e50e73b6040aa832274dfad83f1c9076f7f62af595b43ee382dc5c7cf3966d032d96e41862bd24b080758ab5134fc7ed8db9257b83bae8fb39fc1dc778d842521419a95005a71ef9bd26921f533381b0f088de1af92f3df60bdf87eba528ff4e36eb46056334e16e3bd5937f75844861ef09876c6c9db884670b4d31ff150e4814a03c911203369e9b17217e00aea660c79fe3e86462e2f6d9e3b062ed08c9e02bcd1f9b887e68fb494fae638b0f063e28d05607672b47fde30d73d6f580eca6eab6418d3d230314c503acf85b41f26a713f7051fb5341da00fcda06bf19d0fce01064dea68d9f7bacb7af8517d3f5763f31a54077878b4bb216859a904001529a5fcc086b1a98805ef02892373189e1f15b776b82146ea3850ef8db1f70085877f919a2e15688d35a219ab84fe71a1e2611592ba1a67671e83a9670c346507f0770c036bfcddad53ce0885fb86140bb4bf7ed193c9a3d475a2df0c4121f7426d75b422c4ced191665a18411073c7829d17385bcd98c1d94694daa7d8287ddf0561d320c1f30ce1762e8e044b2d53aea6518c57efee8b1d9843df5e5ab0c185c123af24ead456448c32b5f9351c8039d655c2ed8232c749739639594e2089dda7a39057c8d77762ae4ed44555a915c8360b22470dce3e04df752ec13ce29e8fc2cac0e1e26536e4e76a3213333adc06cc5bf48a1829b8f7e5c808beac5dc842177e86e9c0e75c723c6e188958399b98a22e7fe12cabfdca8c770d7727f9ce9eb0a82997ebc3b1b3b742cecf4b0c1b29c06a0c72d0bcd424dd6b8615341e7a4d9431f214ea63fd505fce9c0e941d245f2cf9e3658cc406adde8ababf5c3492f4cbff2988452d08f03cfbca6ebcd27ee2f0c14ce3e82b5c0e99bdf39e26a3df3e5efc161b858b9a3c57af9f164a95f05b14ac8f146d599bef16ed77da1ad429d0540e00f331e47adcb7d3642fc6cd43729ea1f31fa2b78ef75c00909ac02d3855b51f313bd19f7177645062e0b9e13fce9887c12c0fabfccf73e08306a117d3738916ef19ee2647b5670cde52aa3bac18094842653d9eac1f63739b4844fbc4d2d9db83b50fe0c440c7f123ac214252f7facbbbf0b3f9678e34a31f85313fd11bac563538bc35afbd8ce67817a65ef91472f877f5f922f5c4ef5656e8f14dc3f60b6f4cca7d8dd2d7bfd224bbc2f7681679b7bd9d98831e6a9c7689960b8b610afd0e1292db50f334679f70bffc7568a617f0d40f1782aa2841ea01ba076375008a1bcdb95de6db7c8c34a44cdd41c16c558b0574fe8960a5e89a037a6e3cc57fba7ec6668cb8525836790889ecc13b0f3a7098f4d6ff098a986edafec77d1b30961f45c2ee2c20706e56e39fb15e9d38cf88d5b6264c6d7e5a4ecd6f9a903dbb25e691f50dab0c6b3bb37fb5b480b18e1bb903e376d7542a352223f570dcf3c770bcf426719edff1a67822f47e903dba26ec6ca24f0a863531d225b7cfc907fc7d87b47ea06b61acb68d158496f40a63f80a561c374cca4856461bde42bf3f0456311a24247c5a4173daa08c8416e0329af90a79b806ea0bad674d914e26658403a06e408537925be5480a34d15d87cf13a3d0e05a9eac253d1b02f97d663f278abef8fc4906d1a015bd9da60430c6e16beeef79a47dd93f0e4b833e56e79692f571ff7efa50deb80a229f07a5f96610aac4b16d1e0b390029e01987611231704ca3cdee1f7c824ccc6059823c1f3006d90c5ce450b0931195c00afc274dda67953ba87541f48504645d133c520ae96800ae3905c3d5b0195ad59ec72f01571fda21d93be71faf87d90315606e215ce1259190f9fee059c181051f0d01977142223da8679965c77e3339a61419ce5017529fa9e8893b54b1113ad3f92675f07576775c21e02e97907be60f80da798cb28ebfcbf9ed4c6990125b04b025059c62ddb73f9342e2e566b8f499ce3988d95be2d94054b17d62078d50f85d86ae3db15fe597e249e97aa7f24a8923be64ffba54d64e225d3506bd8801f726d2d79a0a04e9ad397dac1efc31d02aaaf275c676ef9c3e8b7adb1c5b0e564b3390ea7c13d5abc9be6591980d7e6ec3885c23f637b81458b68fd96d8824373bad484eab77d91333998901b281e00c9be885d756a7b926e3cc2496c1edd48c0ebc836befdc180a32f3716532016092fbf0f3f7af6cf9bb29f4c17adf31253d0d87c7a910eb9b760ff4a623e13405e82bc830edc92e80b97057efed91fd203280379f70d54b694113c3afa587c3d7f77399c41f6c96570a011c35579df9cb53aff3902807a48a5183891451ec55dea51b8b35f7604b8594246c1c20cccc3089e1e424396ea00790aa6d5e91d79323db6ac50ddb6cf61241206f2bb0e61f57ba5f32e20bd2e5e7e4cf9814cc1224ad82a970d3355a3f07f73f4cea70b39946cf72045206fb1b32373931be6963b2848021b3106cf0cd6ba0c72ce1c6fbe307b16082fd93b1ebf1703161e4d293e2b1bf17b74be8f74946230136991b85a4a24671d66a18bbfd2b77ff500f6e6a5e3b25d6a30c11365aa068359399d81a851d78ef2521ffe2f8e834eb25c6a5afce2a9ca5a0dc4f77a98257ab6a6963822e822e209aabaeee84308f3d0992df2cd9870bcbd6410a80def3d8aae492268546d9504e5a8f8fa74a0c703c23fa84a7285959916cc5aa1aa0fcd37b299b87ea7628c5bf905508d4f283bf319c86fce963a8703f8bf0970d97a43067600cf07b657977bb6286833f249e64649bbeb0ba317c371d5a4939216cf3d7b4b26ec8febbd34d8cf8a967ae8764471d492b06e13ade96720258f91ec7f1b0aa4647773c223f2f797b461ceac3dd50a4cd54672827d57588aaa53dcb4fa7a493452265fd40c305c913e60abb8111684050c13c55a06abca57bb96ef1ad1c99b5d684fa09bd6ab7c5e71099e86909753bfafbeb314ca453129d1bf5588958785a22f79e2742392eb5204c313b22cc60dbf289de84d48b2317375338c889642ac85002b921773a50e1e5223a7a5562126961f37b16df2712fb71eaa10958479647892eb3bd037406905f1b1c6ea9d4722c6ec22cae16810908746797e29c09a321f501f4c48fef390bb6be3fdfc729676e427d581621a0f1846852811dfeb33b9cbb05e4fdc2b4cf9b11930b955669db7504ac6614a78cb0b87534c980254c450204c2eb3245cab2869823e957ff9cb58bddd8c071504e30ecc193d6d4badca899f7bf7229bf39c81475f53fee6acbddf6f588cdf4c6ed576877fa10e0646c4eaabd84dfabd90afb8fcd9276233efe3afe7344f567ae710f73bdeedf6ecc021e7c7d999c803b44313dcb80f7bc233bb6ed8094a090b3e33f56bbf9ab4499a9005960870f708cef546894492981c38c3809430136397b4acf5a9ba2dc2b7466dc878ed5a24374144b565374733cc3f8a99ce5121f28aeaea6c48271daeb05439a4f2e0bbcc09db9fe4f2e8a3fb3ce87efec8d50c426f517aedf9aef0e4cf34723f968b1c4b1ace9559d4d12f4af8a42f34264418bfaf88ecef20ba3de16e77a5dcd665024dc4ca93887d994f9f89f309de5926fdd6e5e1aee44fd16b31088e531134d6f430923038f54fa99b856b65ad61f3e622348cfc4f61e97cef6047f8f871248978902d9fe424dd7a8989177c6843690a0c351f593cfc801550db8738148137c4f5e8e17a239ba99490170897e9073b1b32751758f5f8a643362f40dc15a5e141f2a7485f85de367045bbd958ae31ec923b510fac08face8ee5b82f559a73b368f557dca07940f6a620f3e42f0647fff76d7552a2f4875b4106229d25016f20b2847718ed8c787caea83bc39bafadd7c36f4e9ade3702ff121deb04caf8ecaba7169187b71df94ae2520fe21f08f8268ea73952ce4f020c6a737e00c7df90c6bf3213937dcc27c3e994ecea3980ab4ea1bbe1f4f3bb1905c2cd481bac23e014834d89e6a215a87a4d076f267bc52bc2a503c4fbdef9ac9da371f5bfe8745ee76bef70dbd468dff0552fe33146351e2511155ef1f08921269517f357ed3f61e2019e44fd755452a8ca550595296ee6d87e771c51c8f83b231005cd8e5ae39d86ccb092c625569525e53d22ccb5c11a7f358f89b5d8b54f259cf1f0dd920f663825ecd6b034fe1bda6e4ee7424bda2d6beee52378904ed1a0a432e9a023215088b5a97d6644a95b38ade0bf808c18a430f31e861490236726be6f2470aeb7e0faf45d1332d4e6d7e32cb90811d71af360fa820e3458e1741a53fd3de965419c015a9e24b06645165c732e7d70bd4faf6e6db638424af78d1dfd63a255173cf62e60d32e6959229af719c77c27bf253cdbb521a0b8f6e416842348de6e052863f49fa29cc85e2dda55790a80a15d4a301b696ab412dd15a4ff6e035e7eef9279d67f72fc47c5c558fa296e2768081d0db012e80eea7e3abce22629bf1216e9bc5688cac97220779b579368dcf6501c4a3c1a2ffdaa4a91c2cee4326cb21bbc8ff7341080d21eb325e05f911dd6b5d65a1217b92cccd2d96b3830a3d3f97e89893b09fabee1e1066d36e66d7683b9c9d1d4740a08dca76ffa9093f4a132b -MD = 7dedb138a250a3ff4325116aba68c7b45f21b6f83e1f381ad1df4e5b4606e5ad365728f3cc83a2badc8cd25bd45a4289 - -Len = 55672 -Msg = b7bd0f9a64f3f398ae90ee77e2ba58bcc82ecf1f838f3785b8fd002ef2eaa730452980243248b21fcb2083e417aad657b815f135cb158403107de7444b10a4efea943520e7290f0ef0d9df3dc67013f5e38e9cf25ffaf25d143959fb016064a5ec26b7f84b3d104d65e389ebb5b4177c8fc257be06e78a7b0c5addbbdb81ef3894068d12262dc0c472650957ad1debd605d8aa01878453454007fceca21c4d922a5d3fd840a0245c5f87e8e8755396e98df91d23ab7855a4f7693df61ed88799f65256b0613f46fb7373ad05d7ff209f6e4d398c3a6c987e7ba82842175ea3373f0e590450b22d8af74ee01899c992def2fb85a5fc0725bd12eb45365555ac534fb9d03bd6a0e1f2334309888458f3905f2c8ad4b8f20347055a1d3b9f66a7d46c7a43bdbbb26b196f77b1bd60554b9cfe07ce8238d43a069c1f37babf399ea4df793bf2c78fd2e9f3155f1ff567a2ea17b5db184256d3e01e5f1b197b7598aaf0df4042c1df1e4906439c160a370162f25d39fc9f20d5bfd54552c29cc29ecee6d4d815734c5720f229ef0a696c6fecd6286e9817d9488a07f6631beacab7f80b7f8dd3a37c8658fdf1e063d8aff5700d3e045371293429fd9dd68e2c32eb10a509e6e41a17b3d870c0f78920a89ad6ddc6839477baa283ff6034812ca542fefd996bb0a0c6e48893c1bde409fe66068fe871c5ef3199825467045eb0c9c5aa5b58a5a0fd312350ad19b9dc5a5a61e86ace584da239220d46dbce8c81467bfd066e1b1af8ff771808f374dadd639465b89dbf945878440c1be41b7367c56ddd480255875ad8e9c8ea75744458c20663bf802f02d89607681ca9717b29eea133673cdc50eb667f489cc74384941ebfcbc99d2fffec3c730791535b0c916821e8ac4537db734e4380661269005920c8861c1c47f35a1291d2c2095e8e65dcf5e25f45ee92ba3b3d598f7e6c226e70287b0026ff46ebbf68b1f6f404696ef1230bc8638adc87d374b96132d6519db5e791bfe3e06067ec008d773cd4057450b54a2fc89220a4bef08a22572ef4ac970eb2a07a71a99640624c8b0856cb3fa0b286db9c8ec8d7a5b9b21b14fd7564c0a4c5ea133a8a406495d87b801321968a23a91506073be930d81b9492ca3b8dd5b1b1e6d8c4692cffa1178fce927042b60f9a252e84e1a20654abd4f81daeef813e60dcef96af23ba8ff30e175b210ccb7e41533d8d22c9d0354c256f7e36516a51b9138039c5ed3d66534286f79ab9727986e75baa66283583e5cd1f763b7d38f5a4d5b43311522f2e1e7140ed451452065128af641585de475d152f8c2539942f0968b20efd1a38f03ee470c589e414308a5f624297a972899e45c8495c4e2609d015a351f00c01b39ae33c08cdf05ffc19d49bcd545c9a4f8fa511344884958ae224af8552f1327f1ab5cc3d7b01dc74e6cf838bb565fea3187d33d552a289ba25ddfd318a91735ca6a449ecfadf329fda984206208e458c211455b4e072aca28288b6dd02b46a5326f6db9eb2520a85db76ffc6fe9d181392b3a05a5cbaa349e16c01122122c26b82f4a9d90b220c2fd2b3e351b85b1e3e53a23c4e2c4319b82bd207564fa221ada2e6dc286d16dfa4a8951531b49000174d295018bad5b4f54602f034f4fe301f6f149b1040f82cec4365bdee5c0465a6669004416c381c0a1c44e33178fc96cbcfc50f1bec8e9a108d6a050e177ef6f2871e8150ac33fafe94e008d74465fbb9ab4360d0d9a1d2176dee131b4cc85b03991cefcde18ff6da951d88adbe0009f0ecd4b5b76ff87b09ca370f9d65a83be182d276407214b7a509458b3b4f97667878c13659175d3eef8e8e221ac9e73e952c883c32c98ae667d79e380a5ff0ba5939520d3d3796c3d0a03b741ce04d0d267d866c2b4db92a29e771b8a157d5ae9b16ce5fec396cb1b4e8862c2a12a1509c5f132cb166692cf2210533889d0ce947f67f57ec83a7b1a34eb772cdc7adaeffb979a44e7c6194ca6da4d0489b5d1465c3ab1ac77f0f6aa6ba15708b6737d05872fefe89f76a09b9b394b768b892d7fb649bd304936b85c414e94bef5a085eae74eb5fea404c33c8db1e11705b71d913c197a82c2985a906447b2e7e08e8ff0aa688f1fabdcfbbfecd8a06e9eec4c3b4c2e6c1c6a8237f7232133fc2da9e5b73f01cdc40d7ba49647120bd5ad8513ce74fd2475a780eae13c7f9a64236f41bf13af14845f6d78400af285f4b81e1edb350a16271010edfeee9748c8685b0e78c6c4d5c8f83ec15dc70e91344513b7e20ad9c3992aaebba0d81ce1917309b664d6f7940a8e4c2a3009aac02ceb02996364e0bf545dd6ce677784d747c9d7d413b29bd1d188321d77217b953700671ddfe1b36bd12025a0c34b43ac63d361e205f83601b65c7d1593ccd582fb3bbdcfd7ffd64ba827f7dd34d1fdd36e36245a9bf65ac61191799d066a6d1be1e37329bc1dadf141cbd9de4c9a07dedf588bc8765b8e718bbdd42e5f6896b2739e23b62cd9cedf2682482e6b01e6312fb12496059625a67d480953ff65d6f938c25bef7aa29d77cef1df3820a83d8ce7d67b5dda14d4d77eb6857876d0c2529a0668505606be5dc380eba60e0b6224904efc7a5475f076f88fd5364647dd512fc0e5632f8485e37cc609d27399f89aa171249615382d27834a6507fe298c7752886fa2679aa8cb8317c65801e26571a3f3801b8cb9df4ba75ce157fef45437bad35398aeb78b584f1c8da129633d2c003c9b953b998b65cd6da6b0d936c904c1282da06579a22c694aec386a9ae44c5eb2d37d9245b6087dc331ad1d7f5f70fdfd7a741c4f71ba4a095e9835f7ff3507fcc44f315cd3a621141ea72c2c8c0ed9d9b66e43a79e7469fe515b2c18e288a480fa74993d88c16fc6ca3995dce330dd335e096c107d0d518050dbad6c32a9acd5c2a82a6639dca251d0cedafed9798090fdd0062891c79945f9945a70743a9961c93465657b6a715baee17c00e36b5c79025ca24e814599a5a83f83a40b9df2cb8ab3fac9a1fd553ad11be981a568d96207f9b100a009eb25e927d9958d56316963a13af15207b675c3d8b40f74047fd27b41b2cd8286f64d38d7ccc35df5edc20086a68b001c1da313a25bf8f3c0c850d8df3823ad3f539223d9cd9c11ff707bddceddd5409d03392cf361dc89104b43bcfcb1a194b58b8b16a86cae2dc571ed47f4318e781d0fae9c663628c89561517454afa5bd6bf6ae9dbe2a78260a5a9cfba152152b1e9b89de55697c26a2b2d0ab6192ceabd52d5325a577688f10a3115530bfe7ee141f316f5b7c4527daa867de9e0b8ac483b83f5ad8d41dcd8ae3d0e12ccb952590336bcbd2def230afca7d6a746a48bbe9ffc989d2d0f665db85522c1015ab5605506f70761221f5948187fb8f3fa6e69a9c685f2dfe90ec75101b92651e791405fed2f99fb642db1b762dee490c23c8f7e6b22744ad6bc60a0ca3b0b656acd3f4a72cc3ca2be355c710c5df3c502df794973d9eb17de586ece371036e4ea51a63e1e36b8fe3620a09d9e62ac39c43e6f3064111eed09ca3a02d1a06f777005bd6277d5d5b8d7d4c663a057d8950f41b85bc831d67560fa0c651e5480c603d1cbdf07125b78a63a15ec9ba33f80ecd09ef326a3db57ead02c1fa8923078ab9d1add565311e5ad3ad76017aea9a361d3672007cef53aaf35e157f7c346367051f083ea01c0a8f3bd52e79ae0dea579325c09f21aecc6b80f743591508ba75bd596f94d85306980a9d0a7aea1a53039d5c5d76fef87a40c482de2009fc77473115468074529cf5de897cbda59c8e9aba5eab106b58f7cb3c65486cc1ac144c1ed71f89eab73829160ef79a7700d7ad68812c040d4cdf5b67331487b2843c04b5237d09c1ed52b24fb22d99b4e3d8bc267872ca4b406b81c350c51973013901b26ec19890519721f9f7715405b20c3782b8f1cbbbe056dedf62cc9a89cfa5b3953d9faebca05fe893635521e007dcbffba73b80b5891bb329ddad734d3c0c9abbf469c4cd462786aa7a5bbbba31d4a5ffe7b2a1eeb714af2125ea3c53d2d837b547a26338bf787cada0f75a1aec9e9a1deee977ce06ec3353d0056e2420931b1f8bfc129578ed4b2b7bbab58874750cc41162aab9d50ce03060818144a1b7b53955b95b5a0ed062926f08366985f26e8113908358cdf126555bd10e1bd2c076b1297c95fceddc6380ff7255547db14fe35a05ca214e23862126867d40304800057bb86af4926bce65a18baadfe82c11495934c789c23e70325514472846b8c1b4c0ff32e7a908f3bef9b6af4241bd635195900418e68c84f76c0d045a929d3c3d9db3963c7e3e83fb6c85cb4206ffa66a93ca184517a834eedfd33d4d805fe00e6667fd699e66efb98e7b9745c46d6b12d8257ca4d21bf08734f94a77ac9b5da5bf9ee105962ca767b3fa8bd3f67111d8d74499aea242486ee001b47f83b9f5a20dcae986d20a3b849195216319c54b2b15aa07c904d5bcf4856f23bb82465871d57e6f63fe5a2cae8bddf079aab4779817c83f8a7620ceb679a3e0b244baf6a3bb2beb3357c6fb342737618e35d9179e6211b97972cdfe335132a40a37a240960345f56b9acb17b3d833fd2727adbbbc69390e0c8737abe980bdb619c776c6e7526f167323c102bc33463bcb0cacc450b18095ca3ff88847ac87cf6790b30a163d09b6f08f536cabbd00a5f05140d219bf9ae918e97af3dc2933387a1fe18a8107a86f5a29fc8600c9d5b41da224557607ea809f20597f258b4289d7c18cb8d666cda816a0271f6a0e47fec95ba1ded40ee1f4c380fe9ab247385bf7221f2584cedbe9bc7e5d7925eec9ee8a0a53ded25933ae0c67e4d6e0d186f76ebe0340fa9475acc2111a23f2effdebb61ab4c5ef6b3224f06196a45feea10494f1e3abc67c0d79be14f7b02f8636aef4293f3499b97ff215eaae937dc3290c006a3ab666da15d916d650ae5a461680ca927d9b5fb87f8dc38f7714c9039176378373016a33213342e1bf6ef1b410198002da7aa00ca350afbcaab8d0244ccbb0ea271d3f1ba220f8c3be728434b5c1dae6e043191aadf320fe93f011a9ed74f2eab15a53f83b2a7f08b879905c7a2221bb29950966d1edddc1cd4b1c18e61a7411cc59475d3ea86c0d57b494afcfa30afc10d11f85c1992ca2d12a3dd5b924cb0bb28a97bf3f23366df6e40f8338dced262097c9dbff9d941e2a3e1574e91c5e251e7eb392bf33648720687f8b48284ec5f35986edee53aa9052c7318af879a3ea5a96398c21518d055eb2533c702da657e386d5300063e6a5c585f07c69b542e8117177e027f606452c62290b43559a588bb03356f846cecb0ccaf0bdaf67a18abd811d4315a966e2f3f87f6c2428814446563fa71864d97c8336b0e34bf9466ec95598398cd4255b5fd5b4f3a52ef1b7cdf948c4f3467d46e3399f71d1f2b7f0cf6f5727f01ed81aca9a682648c1720f6d09ed151b74509687443aedb3ec6cbd3a2ef882d1d1e5adcea71778819878d7be18ab3be376ca07f9f701ab643edb209424fafec4a5e480c69c316ee20c7c8d3ba5f19e0db66ff7b5c2925f856289c757d1bce02b034b306cea447deca603bc60225eafdccb990245275b6e7a100f1e0fc5dccb876280390c01cf29f3fd94c1c61e4105e32f0b9422a5cb6cd49fc1912671c9356c5c2a073e734ff7aa6ba659c81a5724b3490e49c8ce60bf079a57dd365610a24c48bf277ecf356b7278ced10076ff80bfa2378fb1e1c9e99578183eb9e33196a9c0a62637762df9eecd64c3e9e4b8ae8ad31dd278b05570f0b1a9421bb9aa86f74c756012f8783761a20e9eeec40102875407ae879a91e9cbef8193e649e9f7c754b3717bd6c2889dcf32eea9956721479dab9069111dc8698a1780b4048e6d9c61d6e6ec819b71d58d582f94e9598f4e28601487a447716c09f1b4df89f66ce91c661cef994197bb6514de2b3066b10d7cdbb77dc4ad9945f7a68cf33ab05a3fbcc7afef8e734eb1fecf86e6fb0d1af81354d5b612ce8489cb8c9589a75ac9f2eb920c86c1af2b4bb30e9652b9cb31b084820bcaff18e79a0e3a5afd504440b5214baf2fe333a20b1a4898f8ed0fa9a938e9c626ea1b2719282639d8b61b32f8e66b245553cf3752ad040b341568c754a8e291547453c769b1e6dea6492e3530b366f891a3c07fc4d3d779beb3653f456d0309ce1e413d1e33e2a5e0aa1babff10c5986f43c5dfd4372940d3576365edfdc17c0e68621ca916a02c0229522ba6770d8038c43ddc033f701d2c6201cfd0c3b4849fb334da8ce2b5dda5777028e95eb54ca89596f8c465524b2483bef17067429ffcaf47fb5c107a3724e4e4181a40435a19486fbaba313677460d096f5f50f24a9fbd09f3793883c51b222c9dcbc44e35155d3696374b931e2b8e6f9df0094a01136d096776b36913f29fc81e70432c7a27347a1fdded0e9c2f885001c4f8c05fd22fb4abd729808045be351e9a556475b97eb8cc00bdff9ddc8b593f60b7fba366759a451cf360a67f2df212cc738cc4668c510f6236ec8fbce7f9ab35cf32984aef28c7aab98003193f8d9f69061bf298fe016e54d05bee4b5eafd9c6972b9ae9fcfeb812e47502ae83762902b5886cdb34187d7b22d435f23ffa4f95b83d27ee1f7a7ae7fca641a99a3a242bea58bfa7df249127a6dbf35c1c5771259afdcba1d72aa49c7a9a2c94e44825372d1347794fa46dfcc4e9a2e36445f2e8c7c3f2bfa49da9a2d6d74ffae23ea0d6e63eb0ea2616485d0573c122a8442971c746499218321e9da9d41836147c3b6dbe317854c2f8d4eb0100ea9478e0a93301fb1cc3928667df6c1701e10b9f397e0d91fa53c6da880910176bb32699d6bf0048f8beb41919fa8616b98637f64f8a6ce6d361a239d649eb3dd0f961de56785ab679fdfd48997180699b901a3fc21544a68008d575442fcadac6e19b3c8ce179c9fd1bcec38ad6f376248932ca55913d378ca3e13b462d67749a0633230eacd60a1e72a8e8529d57d2e0fc02346e90bf3055ed55ea70b529a1e6d1da20401d07ed3a9d3c45852715f65d4318fc71963317782f9411586989d919def0b2c5c487e9fe15c9599716c656f608d780f31441537ff52c2e41cd1080cf780768f435ce96c55700a30ceed17b57b7de70879d528ab9d89ecfd122564f64479ea17fd3445a1ceb52906b11dfe9deca9e299393ff13c2346c448b3bb37b74c8170abd4f91da814d3fc016224a1907db874aab8a9f9525b3054ad46bc0cb7d7410f330ed3f6e8ef738b0a282988f7f453a2243f3cc6560bf0a315124f685dad61cf98f4e95ac9273ddc0a4d543c381a2176ed161fe2aefc2eb966609dd5139588b8c0ce64d0b383d8fae717ce44bdb7cbf7ee857bd5c4f6919f8a78ceda41595ed394e46be10ecdedea8bcfbf28ec93f82d0fd47825ffc1c15c67a209004dbf8d27fc7d271342cb23b5dcbc4f712f755121394a3d5cc62467f8e72676cda090babce1e3c0f1b7462364c428a4a6ed277dda5230f30183e82b7cf14b3ecba2938f9b295c5d00d60594ff2a59e94f8d6f256043cec19d9dd5b4ef6c5b8982bb92b4cbbe3126ca05d21f8cf59844f57916f1bcf56cd0b77cb3ab59429c7e795453d15486aa44d6ad736c150f2ddd1f18e488f54f5248d7884ab7c25a574638d3a08d3f6b0edfac37b122a15f60dd55d2a0931338c85086296281339cd30847a23f909354a71ed50954e939cd796c1f0f14b91f9a15104ac7c2b0b3f05aed2f27f8835828bb2ad88d246be441bfb1063706a3205c82b1aeca33ed4b3e321d77cc950e97d1932b3d2ae94daaa37bd591b23ff91e66575b379a7de0026ea4bfa7f8dcd8573677488d476a3a93dbf6ff49e9876222a0dc356f9f6830e068f8fc4712978aa03faea94f4e70d8a8d27558b442a58632f25868dd41bc86ed1476fbe0848ccb7ad482770ba6c3cff06e43085c26630e5944151b09e94089325b66e5f9b58444eedd39da49b72bc87398a736c9fe87a29c7e59777cfdbde2b6230fe11b0d469d03421cf992e9706b3a39e80b8130dae905886da4bde7fb388156ba18cdf49c7dc2eb73fd6da4595f4c374fae0e26248c9b4a99c9540dc2349cdaafb197d24c8c31c1860d6350af4db27c2447f8462d3266ac240fcad9da7e0e9936d5010f1f735baa9c52fb553adc72eeaf00c5fabc846f97589da6b10abddf7997ac9413ddda458ffff4bd1bc2b5967737ffffa99b2abdf17b9c70ff1b991864195dd7474e68f959f51a310b0f7f25fe066c2dba90cb58a4d633b12ad6bcc0410511531139c67eeec7ece08be8e3286a6270d897640f4996b18bef9a00cbdff8a3ef8eda689cdc38bd9351041789a6a5943387a7dfa097b154cbb5b764717e703b20120ba1911b1e1e370cdf6218a796e3dcc252c8234adb061c88e9c954a39315cb670aad4d448734ff9a829239342599931200e9436bfe10a6f298f61c59487919134154795f5d451482576f93533afd82fd1908a60101ba907a2cb472a577ae32a0165dbd72879a9e4cc4c0cf0fbd56ce0d05eef414cc4c03a90dcbfe9108fd3d96f392c087ed7bc481334f946d96eda2ca2d63d6ad470e2605a3036724e4ae627b3fb92ba5772faea80be28b77ae0a24bbf72ef3d25a48221857245566f109cbd9629ba5d50d008549b4425b34ebf47c68cc19f58eed411e6a8ff5726018559d37c400d71e973471ec9637adac36f5d35915ea81e6e8424381b43f631942dc031ecdb06888fd14991a198829e878535117386a42e43393b8e72fcad39955e42315e572011b27e8265aa5ff76ef97571d299f61dd8fb67ca624665e68e93bb625a4740f4ae0fdf83f35a2623dc97d496017b097fdef5a4535bec3c3ca10da9a3253e250eade688b0d32787a257f1071416ad5d3480d05358c3fadc0a2161cd772ab97fa8a1d4eebb8d98f0fd7183a16e9a975df66f0a095d42f8c1f9804e7b70c33fbd8d1a6995e67b24fe9fa9ce1827f5cf78100a014ad3414c7a653e12580287376b168802f2d424621cf3714effb2c0bc582be2647c5d578c81e7cb5bd7bf0f4714cf6b3faa0721c6b8a36874bca183f46a947892325dfe2f64eba8997f08a3d52722448e0fe1fbc96e39efddd376a7fe2c044d18f1579dbb900b6649b271ed783eb9a46cb9170af0b9f187e8d894b54018d5c0772dccbea79fa184eb167d5486a7fffb5a29f8e7c31894b13430ae2450bda3832b6c3fe979e05874fc1fad61a71f6fc9e4d71a1ab6f68e0c3e70058da686d7f5a42123a6a90e9ab70b3264ad4ff173808b34fd0c52f037e9761b4d49b810eda87fe11a6ecb86e2db86f3459ff7bab5cfbbe804351d823ce95996e7f11bc87f1c2d2076ba47c5cb530dd6c2a224f7a0f7f554e23d7d29077c7787680c3829f6b12a63eb01a457aeadee615e6c5e24cfa9d60ff98df84122235e41300393c1df18062fc9ed77c9175cc7078b4719ce9c45cc8dcc9f2587177e6c68e27fc50ca2a13ee8a5d628769fd0264debdace51916c5732ddf97b5741de2072f1c93286ebfd332301443d0ca2b86ab8d290125a398de4a3a015703e5bd318d3e08862ad157c81735ec03bd7ca7622bce1ff5c450f1b1354a58b9ab8afedc4203125ec0ba9bfb83e30c29b846189ecee8c7122ae8ca461da70c45132b89e90dc663a251f232735f809c3d28f227407b254adfc033caa3e8974483a4920563d5ce22da4442c6389455c6c875467b521acbd0e4ecf89ad2806328fcc6861b4f8464788f0370fc5309aab051060bbddb -MD = 0b7356b6057490b828893565407e4dadd6e45d8e75399499f74ab90bc917d5b48b0b125ea3fc87f45ffa12e05aaa10e4 - -Len = 56464 -Msg = 6513955868a263c0facb87b9283d87fdd02760e4fa437b896b13de28786ba0cb192f9f263e5e75bf664fa7526d3b2073a5fcde752914ec8b6ef1902d1b70c5bd1b9feb6bf0c7be564aaa85f3d8098bb35e69d3e0081708c8fe6ab31e3848b19d94ebe3ee25e527ccce62876610aeb10521f7a7ee3e53b88a4105afc476fc4ab3ab9cee7986c1986b1c011772be3279b0162cc36774d0e517624aece77e927a46893973d2bb62fa79590f9cde8a9ecafe67938d13519775b987c1d34ff71527a0554adcc26bd1333fb0127e731bf98e3539b16eba7eaf52b5d9f3cac38a8a3b07385890113e142d05479424f91a4bac9eb710cf23a22062567f673a0ddffb9dc45aeaf787de35ce13461cf8382e9c0c810637161766f38fe3a1a58cf39d6f351fe28879ecf03b00b0d63361f700f5962651aead5e722fbfa36936263e6defeb5ff8ba7e071f2faa251f5fc700385d32d4befefac06ddcdcdffda172b6f682a7cec6096ea11018b4bb482b92197dddc8d575ae6705ff03cde0856ed622e13051b271fcb1826efe05b7791c2b0b777c406f9f465af4d1ab7aeb2a26bc4bd501d154241caf72dfea8764dcbcf89dcf4282eb644e3d568bdccb4b13508bfa7bfe0ffc05efd1390be22109969262992d377691eb4f77f3d59ea8466a74abf57b2ef4f23cff7d9e9cf1bbedd226d2c5386405a85dd1709355faf926541a84047c9a667df2d41c6b371c3e59b601aeeb99d0157ae15a90feb6f7a631fbcb7ef126484ee64ff41766866d90956aaa5fd1f8838f4da0743ffb9e9e97b0870e0183224295767ae9d45831eb9ae917a94e40fb865c6ac2a6e554b6f6b5ea206c7581189021729c3bbd08e09e449de587e2ff4de062196e78eacfa507e629ec6c42b4af38dc25dc7039403a8f77f8fbcb82d894998ba1cc73b63513d913b31696d0e49044add66312afc6e7c5194382fd989179babe4c051eb14daa7525d2c47287d863bb7bcc58a98963904813c7a1a68bf3a34ae360410244e10fe202cb1f89d05acfa63050e4bb2edfdd214ec9814dc3c6bb51e126a7a5d5b7ed2894e94e6211307c0cb3aa2fd206027557b194497aa8d268d8a2e66091ce99ea50c1737985b32313f5ec226075799401f2236f22b5a2de53e50de8934e954dae6073b0ca7b1ffb3c6ac300a02def5c28fb8ea1348719b423830a736962949be26391e967cbbc809e71208b1680d0239379d973a677751a81b781d00a57314d2e5e036778fdf17ae215eb0cebf884b1e974ec2da10e1ed9158b5a489db5d629395bb16f269a28b0af5b0ccb461d73ced3f5af174cd27cb986067d214b02eaf9ac61834c9829c8ebae4d6b1050760642f9020a78d04df7817d30d3a33bc8d5832e796144f83239f387f2f123308ba3d402a6e59a5407f8fba1124218968efe9068aa33a16b3de290e152844b0fe4b44e97e628c30187e5ed9bb3b3c683ddcfe702fce1a91bd32d8a64760dd2150a9f765fccbb3cff552820121c0ff62b3caf52a37753a5307b81a8b96575fe6984ce15035f864d75f9275caf533cf1b5330697f32471dcd2be46b38827a21834daa7f22aa7713d8bfb4c681a6224fc4a4a3d7f9c0a24982723e57478c57e679d9594d77dad65566be4fe0efa50ad62120abad24331521f5a32c4b03246f035cd3cfb8aa37848de3a3ca414f726c16934fae65893a2e4bb91734c325eb2dfc8ec5746d44510041e2389a843baeb475bd9a329d83164c3b1f46fe5c1a312356a216edc7d0b7e7f5e4c557163eba7277e288bec1cc87fd54cadadf824a96dd960940a254d9cc9a3e6dd27673c3263491b4a3c95eafefc04d3e1b5eb2419cbb3f56eb2890ca1f956fdff88f29535269579663e8e0b7be2378dbb1028899b34ab70d7ef7081c11782ecd9ff7a389ff8f3e2a5173d47e83956c36045151bd6b1a918f6484275a52a0efc951467eb16e14b9c2f510c65ed0a48befbdc1ca173499537f44567b0f53ae272584f217742ea85f02b73622f315cf7c3b25ea4e519055713f86e48fa5850e6994d3910a4cd1a8926c106a66b5d374a1dad5214ad71ebd7f42b4c4b1b767202b899599d395c7a3f861b9142e218a329121540d6c22306fe24b566d9daf8ab1e1667372e009a108f585e9c9d5c0ba97cec12b051ecd65bb2eabd445b00860022fcdd5c2dbf2ce662e3b5b01fa1de502bf1cb2bedf232f4dc8d6b6f3755c77bf6b2234f003fbd049e704654307838a11f6a6938129ee1d86556e86ed7a16423828062981148f3702d47391038aac1a23e9e136028b6880f338d5cc9a1ac0400afaec2c0c6a27634f5b0b76c9f00225d71d7f22a9703d2a2307aef09ff3e501b63836a4e8914ef58e0f3e8f1cd3f03daa15b2e1ec84d64984264c7b5581ef07b874883cac16706e2d557f3262b320b20b474eec4215ce9f953950f5513158b28044634bdd56362dcbb2500931fa0e33794675aa50bf707cd4a53ed729aebc92bc0c2a6ae2fd0ac4d7ca639c112503327277f9c48efe8661d0fe789935468548ba507002536768b3eff1fc4376d0ba2f85703d93533f5aff08a990c40a953d1509a5c6baa521da8b62cdbc97d9699d8b30a3a3cf541e78a4fa3b09e010176eb8386080fc6eb8caabdeb21711cf7c27e602a6dea0f7f859e414276665fc497482b53541300698c3a5b2438e39bf64e3c059ee50e0b579994ce4f318de15a7f9050e888a0e135e50099bf694882fd04b9ac4ee7ce7230e913feb22a3a102cf66cfa2decddf0b55fa37ea4fcc85a73ad9e5c22be52cb713fc4da53a99672a0c484320ac7f3b552c1cc13bc398aaac011921e02b1c39e84614f691af5c9911fb07fff676309b874d5225fed67b7fa4bf83ef9d6074974d0175bb4f058faf51283056a2c06488284614e6a20d076d37e2a49f586090bd3bd2b90c1bb185224df05c07a41f9d89ae82ef73c3ebaf0bbc06e5c1afaff3246b363989a657ef8a8f0fe55378e84e0880a04c6de2d6e4d3c7a8e1f711b31e5521a891847d4d21409ab366fa9fcee88d551ab6357d734b4de12503901cfe64d815a63bbcef25cd0cd7a75b4d97181fa0824ea75af22534d28f17d53d2ff67925adbba2639a563527ec482ccced6835ba9ed8aa4eef81541a27fdd14ed94fddb6506550490d731c2a3f0266090143dd64013549a1d40c0b8d42437255974ee502b41fefbd96f0c49c56829182811f79056fe0dfc44e29dd94749542d1e89821b33f57bb31e553d0f6b93539b9db7f9b47215807569c5f4cd8254fdd545b90361058b95d666710c3b1dd96b92f7ed8a681dc274ab96d30dbc0daff8c5d5eeb74d2a691409baabc0f564a23ba43f9af3d4de6db046d2f32fcd71c00da4d60fe80429f9c0f621eba367c656897a7ca87d223d7cfdef260da42835f1061b5104dcb18aa26145a319fbb6cd5d1ebbb6fe6d77c258234e980ab2f6e1a9aad14cb5db7ad6cbbe9e481d110d0120c210f5840efef669ea0a33d0a25ffe4fc06fd20a2f8794dea0a719df2d92e9053c214222a7dc60171acbfc48bc8a134d119ce8eb1f014c42cf0b1d47976d0d755695a4c07f3c89cb7a3bfd5a47a0a80a65019840f210875f13705c3e96c7f5d9d6152446df44f7ebd3003def8dc845ee8345e9f1f1dbcb9d347fdfaa73c82a978548c99c0f1c34e1edc2c4edd42b73613511e4e6648ba364f9dfad75779733192bd79bab57edc813902a9b3e65f0b9cb410d8f079347941c2b38ce85e75d98c59069a259ffdf39eb84dfc9c88840a09470e0f43dc538282d92344bc40e41e2057ba7e78f4e1911cf908a56758443af248a331b6e4386e6fff6792b18336c9840b63871368dc4d7297ed34b2ba3206ee457ad0a83565856fa1faf766b9d0542dd07c64834050714601461afd42b00653a9ff7cb6544d60187d57f35a49535684637f67573fb0b4fdc1bdd8a57650a1d8f29b866fa552a6e0cdf916fab632493e20e72ffd9baf710055aeee49c99671d4cbe99e12cd37925f3068c2c684ff94a1953e2ee5089f4e0439b3dc68b0f3eedd7264246e204eeafa2121874c3a1dd1653d0ed4bbfaf2a45fea472370c0eb8169a295a9d0432ae9383cbde50a4a0f77ef84b3c1d0d75c0c99e3e344007dffd1ffb8e8aec79a3e459fcf886c7f395700a708d776c2423dff48b312be864cb3490641f793d2b9fb68a7763b8e298c86f42245e4540eb01ae4d2d4500370b1886f23ca2cf9701704cad5bd21ba87b811daf7a854ea24a56565ced425b35e40e1acbebe03603e35dcf4a100e57218408a1d8dbcc3b99296cfea931efe3ebd8f719a6d9a15487b9ad67eafedf15559ca42445b0f9b42e7089cfbd62154160cd19aa086eadd12e6ba93b148d0cfd4da99fce7f5fd5606807f6f11fe97c1d9cacbef67b12cb56fde2997450255fb610943fc60d5228e84fd7fb8b572cec1da85e2c24862dc58bfe04c539262e9ee9a646cd3577efbaf3ebc6dfc5ee952dec8bcaab5db227611738ba74b31f10923d18a6904246a0522a45bdecc86b8b06304dd785c9856868a3b3edef0ac233035b6d9bd21601ccba3564a568bc56754192f76f008f8958a1d678837f6597ffb9eaad0fd9d830dab8bb50649cc938bda4b9907966d8465fd6598e666aec27dd7b93e0e9efb15c34156412e4d01597caf84e20dcfdcb43e6cdd3fd7cf8c9f93312fe0f115ac90c4198dab10b4ccbfe0404f8b0820e9108534fedceaf7321966a47d2426e6247c8690bc235c35711f2d392604652e0511d10244f08e5211f84ebe0b77fea5154181434c7a7f33a0ffd9f682ded34bd340b8314a0b3084ce84d1da557d06c6d1785aadd8f0e833eefa6d04f08aa10eb625916e788d8ff3aa7786760573cdd00b99693ccc2725aa8d675ce0f9987ceb3028f3064b17db233828e33d762cb235061d438ca09db62c3eef30270878b575d3c353855c0ad0981a116e8d31e8627a638c5ff9e0c5282d65fa7d23a7bbe91313ad49880606dec6b2d98ed1c3374d14966f3511272dea228511aa7341c29657721f3b7ad37c743384e9dac7a4a9e0a8312e697ece388aa02ebd2ea2813d3bb761c1bfda6edc2f6312bac8cb50b0ab89a642437f5095783ac555901dc07c57c7750d3d2322b66ed9eed4df5941dc2c4d785379bf58953136eb8375618a1058ec2e8a39e1899bc11c7bb084fe129ce17829da729b40e8443903cf24fa6899ddb9f0a13c921decb48f3be660362d63498e3d3fa4bf93ef3fc590814564d66944a56dfacbb15a29c7b6b1eee77e0cdfe2e4150ba688dc1a724134525d2d4e0f3c22e8ef5ddbc8f35937802291422b534c3e63c6ee73940a8a4041aab2b04a0c12d703f7795dd4ba07660929d42f237dc3e18be9f32c363ff6574b030c8a54e0672651cb84c427ee50e6bf8d46a16fb008620fed4b0f3d1b34ead2e3b137f92cb79524a426bb1d10a41e35956f257a8a785462595c99333cc46f6bd55735912172a82f49d58f3eb19f90ee0a9447de6da22d15b6be56930533796850450fc79f26d3c404f7dd076191d36b257c6505fa0450bc7dc6c3f714f08d6add313316d642ac756e2410f171395a1fae8e298b801d63a9272c6db9dc8a1fe5e4722be9676496c5fde0b7a780e4997dee2ff1c9c05bea7e3b55c055dc6ea56bfeae66b9e2fb27383c945d74112216286cf84a5b1b5e39ae32c94875952cb25f943c7022a984d24e92d56ef1a2805491b36dbfb9f182e5aba5fd72838732cb533da2e49e5b703c6ba91a68aa956dd93c5a06be60f3687318fd68eafa332f54c9638810a7496baa31d7e9d7099a69189ab949c2ea918d7658a1a1fe541950e334ae4290b823d5b013b7ba36890200973f69ad69a14c5043fd5b2f492bba75fb276668f15b5b2cf293c10203b36cb2d99cd3a81f3f945f8079526737eb86dd01042471aefb5fffc6347c57cb135afe64259fd0501ffa19905f5ff0670e1f14a97d70e31632b2cccf784231f9232d41ab7c26acb8ccfe0d1811bc41431de3ab38d5d433e37bf3f262c1cb171a6d843b2412f0a395c100a87c22ffd058a5650f53bfb6fa8341842f14b37f7dbb5cc039726c863b8386b28a3115a324040f13cf6e9da19d722df3c179cfc7ec386b91cafaeb7ffb1ea88410cb6c3ec2f1e5805a0df22c933c9bb367f6794cd92e24597e42321668a380e5dacf994b239eb33b3d964fa0724f0553711f4276db191187b1dcb311eadeba6846a21f20dc66e294f8bc18a5c12615447b58adce4865bdbd042f00cb180cbf7bf2e7807843e70e3df9d3ffb4f65e2616e5373dbbc7b08369e3ad8dda76d9faa15e044fb9f0ab9096ef7247569853c24b5d3f54d7cf75fd0eeefcbca86da31668f69cef6e69011420181b81f30da3744231d595aad622952c74813fbd83147d434af5e1fe2394036a22345222ecd9a6ac11ae729d6232e63322df79924d9aa9b0c9b3c9e1a6d0d8e58c511a6ebc42f3d96b0e6e37fa436ac3686beccf33a22641f15af9c169542f22c4f65d2ee28bc66aac8a0af314c09d5db3bb1bbccbc76d7760600415f17a50924a989cebf620a8c054b5bb672836e852935188f37c7709b185478b47c5dff7c4bbbc5c3e6d8e158b01f601fcdb12f64295a3b6fbcc3d6590de95d1ef5cd17f2a66e61d9ebf40872b22ef713c73e121be2936184e41871b85eabf7a653d1b7143fa8a437571d4981135e67baea93e0525cc9d3f6362e0961128490751dd0a58a1d52d806b2ba6a2ddb99fa3bbd1660b0a0e2daec3b6e66fb315b6eb2db32aafb4855436d8235342013c6f6bfc8305cdeb5c8bc8e793e4f2fc417da86165e8e10c9972d9551f56fffc3cda46d94499a84a361c1057a078da5d1a21c1954be1970a702e0a5a662e375f1964c6ea8cae44973973379c632e90463e37c9220b913c3ea7da3c60ae45728a70836e98c1900d52c505811e32528f57fc24219ffb743b39befbd2004e395c0ec0da907c9a0b6d1d6767af65b4a151f2f27b5d87b2072e6c04277da1cc763e6c98ceff0e6c6d0e57af0df50b608772b7afa1ef41b5d6804645d191ddaf88a42446e4ecb6bf214b81fa6cf467ac615c06923c59867d4edb68c28eb10c7dfd27b68990fc0e18e4cf3cd80940031eeb887028bf2eae8eec9a4428b34dc6ae202393af679f9cf013e3d8c6675a762e728274f18ed122513c3758d6e3ea84b6ae426c46dd69bbdb3b33f6540b96396192d4958b3fd39a7aca5d176b94f9df3e03ee80de76cd1330c72a15ff6a95b54ec8f9524456c87f41f35620354b0e3e9aad9271d4a85c1ba74450a83708db824c815b2bbb4802396d63ccd3e27a9a1b5327d8cfd806793d953f222d897ada18e15894925ea8236153781bd2f1b81ffe0def1beb46f5a70191142926651503f1b3bb1016acdb9e7f7acced8dd168226f118ff664a01a8800116fd023587bfba52a2558393476f5fc69ce9c65001f23e70476d2cc81c97ea19caeb194e224339bcb23f77a83feac5096f9b3090c51a6ee6d204b735aa71d7e996d380b80822e4dfd43683af9c7442498cacbea64842dfda238cb099927c6efae07fdf7b23a4e4456e0152b24853fe0d5de4179974b2b9d4a1cdbefcbc01d8d311b5dda059136176ea698ab82acf20dd490be47130b1235cb48f8a6710473cfc923e222d94b582f9ae36d4ca2a32d141b8e8cc36638845fbc499bce17698c3fecae2572dbbd470552430d7ef30c238c2124478f1f780483839b4fb73d63a9460206824a5b6b65315b21e3c2f24c97ee7c0e78faad3df549c7ca8ef241876d9aafe9a309f6da352bec2caaa92ee8dca392899ba67dfed90aef33d41fc2494b765cb3e2422c8e595dabbfaca217757453fb322a13203f425f6073a9903e2dc5818ee1da737afc345f0057744e3a56e1681c949eb12273a3bfc20699e423b96e44bd1ff62e50a848a890809bfe1611c6787d3d741103308f849a790f9c015098286dbacfc34c1718b2c2b77e32194a75dda37954a320fa68764027852855a7e5b5274eb1e2cbcd27161d98b59ad245822015f48af82a45c0ed59be94f9af03d9736048570d6e3ef63b1770bc98dfb77de84b1bb1708d872b625d9ab9b06c18e5dbbf34399391f0f8aa26ec0dac7ff4cb8ec97b52bcb942fa6db2385dcd1b3b9d567aaeb425d567b0ebe267235651a1ed9bf78fd93d3c1dd077fe340bb04b00529c58f45124b717c168d07e9826e33376988bc5cf62845c2009980a4dfa69fbc7e5a0b1bb20a5958ca967aec68eb31dd8fccca9afcd30a26bab26279f1bf6724ffb08733c9a2f4575361e5458fe3fe5973150c7f4edbf6535c51f1879858f285d14e6956001c2cc3d976b1baa05e81f33eeae9d29448f3900fff95967d7727291fbc1a4cff7fe8e2835e47144365a2f218d4c95d7522e824fb43b66d4727ee570f8303dd6dd310fe7aa00d1a1ffe49a0285a14e69a72bc5847a5bcd59f6d2f56c92a8bd1f3218b5de6c46d96dd345e4397043336ab4059741cad0f962d53d26f763919ef38704347ee52ce4e240cc9248c5a8c154f92a6c0a1e4177898e0c0ea3e381700e5c81f06bad3980c9d90728b30e5884b2e728b83ffd13c43891cdf0f48b0eccca13107e173cf3296f0c742bfab2c8f9ff1e7f0075dfde7bea7101825bd29001b15b4e31f41cc06b4c4b91f0a24b70ada40f9bd92e4ee7eb29bc35476c429bbb5e8589b094b547b30c16ff2b2c30f5fc4c2b1da6dbb2e6be70c3d7948863a8562c32618e7baeef9d190f0a400b2bbf825201630e00c451425a38770e42be3c6e94e244001b523e85ed9441b3c16433bc50231a532fcb9e33408a82292daade613305cfc9e6579b1a0437441ae1a30926c0e0822adb5143edbe2a8769abb1e4da812d63507f27aba5f7787fd9ee30964e1efa690975fdd8fe3d9905343f7c063709b99d18583ae6c621d8536539c5619ed4b10d539219d3d159667a3d6b61b913274adba5e409c2f73dc77d6166ba01958cb50dbdb24dbb037c1354d9b1fb53db8441ad6da52cc6c585c64c42f786dcbea166c88c5901f5011020339da5b18d1c8b4e80f43e1c689da4654e8e6ec48996ad56fc63e8cf2856dffd84fdb91ccb32b6c204bdf1413f0c1424f2a82efb6eaa2af5e7c8f40dab71163bc77e5ea574da913ca74f8143a07d5f75e724da84127584d439201d5614ec6d4b799428e43050951ec71d409c338de0e88a88d4070b6555625efda730fb254fad29d38a4184515d0902abb1a37eaa32ed6b48bdfcb0061730d7d62416b4b837f146b10555c749335bd87f76f1c84ed004e7e8fabdb6d434c0223e368fd821b0886eb12c899f94c2b7c70cf31fd70842cfbefe1cf2766c5880cc9a3104dbde3402e068526563e0858d4cd8a885f153059e2edc8713851adcf3357eb5fe465a4cc16a2b3961caa8e64cd86719bccdbb92f0d618eba9497c4cb80b6038049e3265746a8e24172a5a8f86f83cc93cb2ae658833479d1c5a1d222facc3399049d3187c4015b4ee0971cbcc3ade397e56a80794c4cd2de53d69f7caa82c3d39efd8d049a9366e6eee8b357d0eafdd0a0034f3d7193e00bc49df28296c1fa559e6a0177d0484a31250135729e236366875e1b49f9f0ed7ea26095dbc86f22488c4c57886c0751560c486ab436415e801fe1ac48ec4a3f5f74864e30487581d3f10a55de78b7c17e2c261ac69f2a3446f2f5cae0528b1fd7c377e6291cbc5f1f530ec422fb42e3d00b040c4fe1c82de187033cb9349ad50e169a256d4e2b06533dbf6bfbfe8fff75334809f8050193796671cb7c995fa92bf559d2a5e6a9bd983485141288865d942c5cd96912bfac3518a83fd18ac2e356e81bb778ea20cb16c2c8850ea10f44567ca6444910e9c23e2411605f0eabcab978499a8f647779f46ef087995112fee3ad90124008671bbc1213f5cf2d02a7792c4944915b960f5bc065e258a177d16247 -MD = b19abfc62aace1d49392cee8f69fc6477422a647223742cc7d65da06cdd8b86cb8198c3af9069dd4e8c3a4a6e404d9b7 - -Len = 57256 -Msg = 13e3fe7856cd680593a85cda3d6ff8736f205259221e54a1a2d4cab5439cb9574fdff2e2447de8d33c6fbf89adaba5495247658569e2395e1f40e0674934f1ac54c36ff37f869d41475014a02311122072fa151cb2e2a9bef2e97ec58a5bbd8609d79c316fb031569d9383a8096ae700b6818aa564e74aca0418ca586ed8c5ee5662a2267cc2491b24803628c67ecbf20623eba8e6b9c4893b14eca75e75b0eb23aea95a0f869096c55e52a8c21567fc4a2a60ada220c00480270d3bc0f827865801d8548ec2abd1697702b065f763296adc133dffe4e641bc97559afd2ad1c6dea4579c633f45d4f6116cc917eb667e4f8229df65ccdd4ad5adeb4e7ed357b39bdf4fbaf4c504a55675b87a40bb1805df63cd1c3ca24e27b5b1f8dfaabb605578f9e836ab1c904e6feb0f4c482d23c503c9257bed2ce0de42eba3d3e8a995b55d3c4999ef0b92d72bba99c6970a2cc6a4fa5984de333c7966a215b4a2679dda33ee9b6b275bb246702c7d709519de11a83f92bf787e09ff072075093fbb22cce0580532bdd497a52887e4d2ab24deadf9e0f8b523d7f0790fabec5b276ec9944ec2b078183eeafb3a14f5753ff1d7a27d25b2ed480499ee658ca231c1483c396373c3c4a06152518e1bd9e0bb4a6ff91e56e9ef4dceab66f10bbe13771023c309b5679fbd0578ae0ce4b79b85f54eb9c2bac4449cfdcfea9b6f6989b090253b27cec490d7f1031a9cb6b82f07ba1dea539a6c739b59ac804b02ca1cd58eeba8a507011f56ee9c9e26db0423a7638494b83e0804b4a9eb33e90a0a534cd31d126aa847d4a2c4eb409299c2ffcfb62ac0d9eec1804eb733085dd050b77e27628160f9bd38233b970ac8391a4ce67db8769ef2bf6ed0492d098f9cc5cfd35162fe6e428cd2421a4904b0023590547ed5bcef912956a428803d68b69023b41bc6907ccadb2a652ba835333e3b5680822a9cb41527c0311cd5acce65db3b874b364073dad3c9f6345da537335423d4505f1dd5c4e335dfedd45faaf2cba0b5aa591539ba9c365bfe0f5ca52ba681b7b21b473ae7823c1662245de5a58ad9a700d817b7b25df9fe516763666c5cf7916e0623ccc52f5e3e446eae65c6406ec4155a4ed50a3e9b45f50dc1603e9c0ecb4dc9b871a81022bf5b595b149d14e773b088c37c0968a39ab1a87e7deb8e4ccb170c0f12d64d10026f8e6bd9722fcd1e9b0a7d92f80399644ee0a3a4ba5c3cfa94762e98980fb06d48b4e69b8cb9a82c9c8784001f36060a955f36bdf22b63c08bb01fe9367e8b69ad74d54434d9fe057ca8e1afc62a71f64bca42afdc264b86c662eaeff8c1285f68763fbbb2b7591102149b863507628f3bcccc64c0727bb20b33959026010fb53f612ce84e7c40b7f873ba6cb3f4613d2c0bdec3e63a7bae23cb2ab60765c9d5fbdea4b350503c62246f474b8a19f768e52f7fb495a4d4e0d6d3b048e416dd256494b004ff5ad47750ae480a009fab782fe1b81f16d80db2ebf3302e053bd30f412c57c3a4c3905f42d8c8915eae06d5d2c990ecb2ffae8b2cd2b150b2fd34f95c4da2d887b2f882c396ccc8ec6d8fe8968e0f04ae413fd25f193b963384874d7ba0972bf05095489a905e97f105ce1743d83d4d55c549f14d6fd6e8cff7547267cc41a527c5ee1a916d85e6b79e4bcba05123b0eeb4544fbe7d8b2ed07e24d0e87aa52c73388b5e6ed54a9d845e8f6d769fc815c035e6547aeb61507c437dcfc552cda91ed1f57efa72b3a4a17021638d6a346514718968486061361c6bead7c8fbc0056ebab3e0fde9cbe356fa8917ad5b70863290c4f3f18492c8f721f050b71e8626ac184dee3fe59742ea2550ef9e19836262b91f5d3e00fcef578b19a25b6228f61f164c0e870c21aaa718fd55274d75e0ec14230ef47ca79182d1ec357c70ad5c11d937aa9e067001d3fc18b0129f4fe717ca576fde9f9c97c11cf172e2ef1d3fc88c96294d7c8c31b7f8296825b618612d0344e6c312e2ea5c94b1bf548880898d55f2f35a167e209b35b9e5293bd83574e670dc6a7d81709b60b3859be3df21a85cd1708d7b4db8c6da4f8ee5d5974b359c65ba9c868213c6a97f2d7fa741ef61cabe08b05401df821074cd232d5e8bb74cabe621d8ecba24969e1dc87dafdb00c73e238948a37f15ffaf09a9eb34dd441fc8cac119c74dfe5097bf3e0c30cdcc7adb29e200397fc8ce88ab40b62229223d46cc44f21bb39cfef27aa9fdccad0e0c1c828123cec7e3a68719b0362f579acdad56710af1d646c938b5d0f78b630fa589962e5a673faeae35bcc114634ff4f883cf110a509d44d9f0da7ca376d7146babcdb34d0ecf710f19fc3bf8c6f978e5529fec9941f0dd55a25075a894f268890990d7a3ca5f73f0bc42e589613d6ebda12dca60cbb75b65d77f83b0ee9a52252c456105a4d7fd7aa4f488703b041da7f9e37306f6da043315cf6e608ab819689a561a1aa21f57d45b7cec555c34cecce128ae34ca4221e4e7a8fd6272350679dd29ca8bcf1fc9286940d9decdb7c953e164459250d5f9a3d272fa5eaef761807d2839ff30c09b9b54aa17b6957356658100fec78f7cd69660952bfb44e872a700b92e1fcfe81457a6206d83bc52bd2a4a62a27c8f20fee5187958e23eef8014f0467293b3807d84e60ca5ee4b3b45c9c3f3f95859a7bab982864bbba3f3d5efd436ce02e4711e499dd5859e4915376b751bca04f4fb523a2725cb2d7cdeb76135f107146ba13fcf52e3d63cbecadb37e643df2768020e8f8ebc9fe0d0976f929adfe8724ffa283e8d9e5f6fb3417956a0d1fe6abea636e140b5907da70644a98b6838c4986321bdd76eeae02e6259ef2b2ff075fdcd1157c37666ac0a1380ce90f4beb14ec37174b6bb3d363a15c32b0dc37cef2d61e81aa169e914ffa6692b32eb43e27a04618cb4ed221adc42fe32d0f76c815749035161f4e05e91a749e5f8b58fff240d392d596c5e341ed1532bfb3287d2826daa258c811531c5fe66276bba6aaf52c6417e2ca0bc2b07aa0a3e17db948bb6b525bea9774e36a593091711629c9a0e17c0a8b5f203a89fb66b95ab5c5c53fb09bb43403e5415384e79dd7516ec695fe800d27cc8fa52efdbbd553f1ca7d35a51b6dcda3eef75861800a21c3c24c44e2147250a8b6bd2fe024aa95c833cb2da755cb3fedee6fe98d7e48e903e0a52e1aadec9e6a41ccfd51458b789f9e599845df6ed3489035975756ec8588267bc226b0de59879d5f27af730a74ee668305ef2cbb504a40c2e25d8e679fc7202a9194d1ba2a97460e3f7951aa233b28e1e731a2531f798ca24b1ea94c80474a5c2cd365227a0fc844954d45dd0c1c51f0cc8be4a8994cd05e42091bfdef9f216af460ff89d057808cc979e43587f88e3a167c783e663ab85167ab7b1e263531e178cc1562b6152b515cada1262f561a286571b1870ed9b1161c843b0fdc8ff85a3a833b4fa3af153ccf4701318acb92362a0a4514eb903736d111d0557b25e13faa14c5a311bbdaa991e478ea02bf92fde4b4876a9504c71e35d2df817a8d890c47ff68ff9891e81224f49cb22fa878ea25ef1cea838dfd46bb45bd06633d5c3ab4a189c7a0e7ca1128f5d11c7a2cd0855e486a274fb2263ac1f8fd76bdabd75550b99c9db313fd30fe66baab6aa31649fe2ef3a34207fe84fa5b1534f25f86e6aca635e457bcfddc15d5cdc189a1d6c2a6214de11305d29fb4fa98d399cee76938d5da3df729587d2fb16f015fbf8e69b6bddd633b224f059245fcd52c80755785e6fe0d2a0f79be7c9822ed4542a9b9d063269c12e3b03112cbb5bc130acd2c044815c458d5edfabcd88dd7e2d1b53d63afbe1e32d0c2aca6fa67eaf5c43b713487b6061bf331dc31111463a0e33d6ee0f2084c336fe2f2cf6067f44d536ca1b7045344dc0dc1bda9d03b23180daeb8e8d899b86d179d9e1c8c5a6a722ebd47dc6c8203218c3a2967748678b0a785c5ebd1e6d5786e5ef8eedc93b01cbcc9ce452ea6c384d4e799fa9c6ae6f3575ef05a6c8445cdeab3ade6efc8679593fecf61b945f86e9e76a9e3b67ce0588396d2c506d66bd603182765244cf3853ae8a5b29af424574f53b3b331111768b2c9d7ac4f61ca395e08e01a18b5d6641803fbc84215d9c74e0b51d9baebdeac6b64998094cae360320282563b8792aab1dd3c135d4f8b4730fa0ed7a251b88c240372d2755649d345a168aa1b36bac1aed0e1143ae5bb5f8ecc452d95e7379063030e227fb8601b0f421d963647b151658b855b699cec68cdee8f5bf410de51af0fc5f10255b89fd5811baafb3f18d25c69834967c980fb64dd67d34b630f387e6634beabb2c5ea5ecaed48f88143bd19f7757ec3e02b9fea1549341a525cbd47c2d4ebea441a7301ac0d00acb2d48a14b1d65bfc954ecec432bdfecf635968919211193cae28d24490e55286484db1d3252071804d6cf099923083f91a57c2f24093c711457380be0610cf23b611dcebcdee5fed7cf8bdc0c03b7425ec0a44d07ab77606ae7cf6c49819d6f380c363b5288a6792a8947ed059593fc46cd376b29cf6869b4dc7ad0eb36afa844cc4ded5a19f391e54a2cc5ea9f45752f135c11f23fba93da7c63be2e48eaa345eb8a6a3e5a734ff15b62eb24ea74b503db3cc8cac213e7c510afbe7a7ef86a25af163c6410cfba340410e71c3ec9c5a86dfe17191f1c6b5bdf895837a17e05ca6119ea3606aedb978c5f423962ecac0811cc87471f7c2985331715cd79277a1e48bafd1a03b9b8023d7683e2208472090fcb9fbc8adb292c52817ca5ce98d307ae22fc7ace985b5e5d7e32813e392095ae25e7e128e3723685f01625687c186fd9796fbd30f2cc91359ed87d85b5bc933802e71cc03a0b8d148c69b60f794f3d12e6df4bf16f11850dfffc3ebd9d51eaf38928d61c88ff17477cffc18a378259a191d38cd9b834202dc8262cae9ce48428e33178027653be66e960aca25fb8aacea3d3e8af753d4cdc22deaf1f587f481e378a683bab1168b8fa12e01f99fa1ae14467c73d4d32f06335ad2fda79291e1faebc108fd041ff86d89fc6c98c4f90219b189149e91df40a281a14a5a8ebee71704ed7c58de96a18aa8fc567e1bff5d8d16dae9cf1053f1923aec6498dcca05da4c824a7891391b6996844c340522f4c0def86fe0cf3bbd850efad8ecfd41d2b73b361fb6dc65ca8cdb4ada34f1127c578248137e2ee4f8fd567313b160b4b230495f58ae00bb3356dfa67d0b903c58d3a96080e1cfee385da9ebb1a0c7a138d80f9481c8be97ea7a1c3da122430f2eb7acd814c622b6003881bb1f157285db00e64c2791668a54493966e3039a19426605056b95b7eac5106667d899f1d12d5d760cb682890105568fb8bf49f5d948716a7ed1db0feb0b77d0785aa8d6218440274cbb2696aa8214b7a9924fe6cdb56c15ab04009b4547d1586331bc8fe5945b8292a1f83fd53f2629c008900d750db8cf105ea0ca681eaf56ceea6f9f9bc20210550771b51fa0ed5e828eb4ba5da5d9df556e264de1d4746411d11c85c281c6492a582dc6f86becde77a1287de63261cee0af1b76411dc2f8b2a25dc2e8782aa5892086b5edd4a721f5cc55d8bd27c326289dfae3e46f1d9d47caade77c09a1ade7dd07326e9faeb1a37ce74b30fa807db3b74f076a3ce6ca37b68753fbbacddaccfa39ad09016616074f3765e01f1c2e0887726140fbb0f818f274a8f60001a4af1498863bce5fb7779fd089492a18bfad8b2f71e74ffeaf520ae056e97defa41498ae6e754b0e2e9b0b3d45ea9ff8caf93eb0c9eb9e3268796c64de5488da517412e5c6540bf3d3e7fdf82c32e52ea8a21eb0c9bc6afebbf5937cafb5b56425740fc91e3685a35fc5047bacc0ae3d010ea7aa01e83ab6026d1c925b8b881f986adbd2e6cb4c9f2ad8ab4238023fa64cb575f702ed81eae43674306244756f42ef239da050c539bd895ef65e762dece42ce6423d3ad52fc9e816f1448f11c58d676383eb858425806d9bd2909afd937fdb84f6115ea8d73c08913f82b9c1d5007a182028c80dc53bebee917eff331c7857ee9d4fd77183b30e5f85ad5319f0148dbdecd8a6c6ab188ac39d6a0142fa56186fa22923c3b7b76ffe6e04f99eb96218c1647b804339dec0b770f24fc1bfa193a4af3dd213d5c1b3da535a0ba49351a1cf0192031813d7343696984913ded3601a0f0e40f6805a609fcffd07e0007bcf435ebcad99ab9a4bcd88dc7bddca73f42c6c0b1ec029e9fcab4e7e8cc5a338e7aad64bce5c73a08de8b22f567424fbc67820c4ca254518fe79594ef8b9de119171f2d003e50e825124cd11777b50e35d79d7cbb17a644fdca67afeda5123be33354ee9eca7dea86bee14233d47e0c33fadfb70835409f71daf2dfeb0101667637154e9c739669b04c131c5468e5703d380f663be2698b737ffecdef87b28d5a8928f50420e28c2d22aa077f1a3163dcf9f7305a086a308c215220041f6cd61593558cdeb9aa7c83aa6eadbed2ac0c97a55dbe6f8e8bb54328b7812fb1796931bc66bb302536603d4a27b318789c94f6a40ab7815c144221fdf5987a251f6f366b2129044ece61e06c9cc496f54a22815ec6c4995a4d01ad06d40cec63a710aa0a507f611bbaa7f67796863e2ffedfc13c588dbe707e186fac1c868d5459731700b9645074415907d3dda11a0f00f23da48ab9f886eeafef5794ad66de7cc104b52581d741ad9f99e739be327d97847dff22f14f84e6efb670052a7eea5a21fa915b7e016a44a2361d72858c620cbd0ab6e9dccc52aeff4b5d37a4de6139bc80fc2502d3d84f8a65dc4f9d32a4a7c46b2fa72376d88e083688f2c48c2962ba1e5e49b55771157faf8d99af2c2db0c228d4246d56ffce320057fe32922c1d425c1f9040941ee0a89a96186280e36fdeca0c276372adb5a430342295f850b17cc3a7c24b92c8f62db060945f38b02c41d83e7aadd4cb8c874e862795c47f6891da5ea77d5a55a0377953d54d5c7b2e12dad4e3f284429b02e2b5d6db00a088a929ad067ff3af26ee7cd7a2d5f22cbe7a59352bda88f82a3e7529f50fb39b5aeb39faa9f865bcd0794155c59f04aa24a1dcc91a0fead781638e494cd9e658268091ae5691b966e6005033045299dfa8aeebf87736b2c6e898b67fa5dfa0be3490ba32d6f2f693afad32db2896bab292ca0e2a0cfae6aca6057433c6cce9b7cb423aedf1c2242d74a66eb3f9156e0b291ccec79f00907304d350cb7846c92b34be9b466eaa4c1b7d138c253e74bdd2b6cdb237f9f3b7024a2ad2b083f54900b82d64a717517445121d1498c15eafef810443e2e2796441c031834aaf83701f9db71e77b260a7937bec8f7448794d4bd2ea0731213a9e18ad11ea01c49547702b83501d087eeaedffa785209c6d9eccf1a7888a80e06d6f5bf1903e89d6d4dbacba8203e154473be8767c0685e3aa5b25624e56c510d92e10fafb67c7eb214966833d900589c5657c82fe8dca837ae1b843dffeb974eb3d1554b5e6467f36a0a207072c3bc66c5304f3921d35f41544f073c5e824b4aa84b2264621ce3819caa86d6b3f4cb345eec7f1c11e8cdf836e161a887ece781fec2e98348227bed4adc0deee3101f7571c0fa311f898ebcd45715fae277e67505bd3d4096f18ba6f3332821a6b203babc622310c1421c1fab34b6bc14afe2947bae7ff4c526bd4f04345807653712647d549c43ad8ef08129fea66495114670cf2b3448692e6b361c443018a52be61352fcc8422adc9691ef09777cca389c9a5e97fc93e975200c9a0722cdfd1cd937dbef3984cfc788c25909ac6d4a824f61c8993b6fcc9766231be1b2afc36676525680628402bc5182f663b7ce8c8af9779b9363449901c82a006852269ea547f37174c5e87a475b6455ac2c1916bf053c260b16bab540a071e60fa3daf565c88bab20e60a8cd530d6d5476bc55f9b1d301684c82ac7d099ab4b4c0a355e14729b72194562b1026c6b13ca196bfdab8be3db84fa1d473e1e368ea207be3f2dc09354c266999d4b58819fa89765476cdbd7f3802f2aa9e5a8944ea62ede2f3e4d13c1b0cc07880c9fcac7776859e36ba78ced0ad9ab6673c35509cce23d94b2828d5768d85537e2ac97299b2eb24804696326897c480344e8e93e9ac4250626db70645f3ddaf35a098734984cf6ebd38c0b3e80996916e593d15b74375cfa07e25d97084f2160df311b87033590556599d5a384b38707e25e9def0dce2df6d221b56df89ec0f6eeadb48f408b370b171d62e41a5d3a5ca7a3bf77abfb107312041847a49f323c04f9f2bbf4b023738481237e95f8fb9bc20db673f340bd054413e6b2a0e2dd86be8046ab74471e352a5fa7e19c09333bbde7036258318c13e4dbb13d51ec5b9d77eb30cc63a25fb6651350aba11089b2e7ea26c16f3ff62570c5f8564c2e14b6dd85319d3774907de156ce4b29b157a7fc61b12f9cde93b0845d3c8c042aa1893c08d9ac541038f21b74712eba3e356157f8030b55afdd5b7c2bee4cfe647a7b2fc099686e17b1c97ff6d9e4b749aba58717ccc34df64b7ce49c9e27bf6e08033556e15fd9fdb35a8b7878fbc55612bb063b5f05da74569b3a39cc9abb99f2c7c93651f12c24863bca53cee258d6033851ed3a318f9c974d098dea14778aa32f77e95bdad94ec2d3b9335c26d65c0593f6b7fee4d1c175f8bef3772367b291a0bdda7f6b65bef1b8d471a137e25a925461061d7e45959b24e725145620a456d1f7a42d3156079b51a8992ea3f15422003d52069c6f8b4f680e7d121b26d25b19d1b0f5ab3ebb0844b23454e987cb4d1dc8464a9d94152b28817620f0eebf371ec89b5957643bf0f86dbdc4771a426c13ae3d7a1067b5b6ed0caaa165eced432748cdd8c47b2ccde347bffddb2d3c17686bc1f5836f0f7b2bfc7513e8a5cf27e9deb2f460f7e007abec955194452ad7a26d5e4d64fe64c07bdd8008f7bde75dccf7052cbb4f0826a8a8e87020d69115584f6cf243aa685f432c35f12179b85d572e1ef2320507b3602913ca0f65f158d06e98749e078c802865115ce47dd48f0ee07ad5739e612678d9c1dfce77ee3ac1675b54d28a33db7224acbcbf4eae9b5abaa356de9f970849275d21dc90ca03a1b610139f9710e9e6c762812040c8eac12922e7016d3bc157be5020c825277bd7d7612143d28603ccd9dd5aa6188605e89864165aaba1fa3afb455cffc988ebfa37c91e6db115e1bae86799bf1a98652795016568cf7c1b596aa75701d260dc7f73b25b7bb742dc275fabdee9eb628104bb6544aa4d2c9d3988f07f6cf431d5ee07a7790c599f8b98cc149aa4ef670216581a44ada925f851d2ab66af938e60ac6032f78e1c7e58959a3c4d7ebb2840c3179ad5d1681ad548d4427d3834e8f56119cf478f7481cb94668d67e5c338c591565188b40e5d8c750a5053954ca40c72a0e6e97ef62c6d1b9d728a689beb1917b0e8cdc40070b67ce15f6a556f723e7772046ddb15e0b591cb962575a9e1a3bca3db259fe2f6cba705ca21d701c5d3d619c2452258412dad6d62c99b719f1df6ab8320963a5234a9c41b3ac8a8019515148afff341b04dc4ff62c7588795b05c347b3f555b0599fbb8ece578d6c7dacadee90ebc46d08e5efe10df2b50482363db4dd23bd99363f36099d285f28b1d5de546f1ebec0477f1e5e751926038ef940c6599d84a9e1b4737bc826e9fcde544d43f2a10b5de93144370df1c4bda7d73444cf6b90258386dcabf75913302cb26182c47b918c1583c9327c82757cf35781f7e693cb58433bd863d1cac60bc27681db8bb43a94f3fe15186ad422869d018fa7471f1c894a5dce69fe80e8d6c9281714f055edbfac2990b081f0b425cb5dc61b9a166affbf742886278362da68518af69a659253688da3c466dd119ea6f48f1d86819f03cb064d82f4dc1d5cc878424932ec10994eb0b41ac4a3233c554d5073b367a2dd969da5250c9200a71025a7d55ff351d9871c2d7c414bd04600f072e6cad05bd547c0983718adf20269e02161ca803c5b3a5974b085db0203d1665e -MD = a14ab54acad289474c703cd30f01ab844b8955e1e4a8764884b994c18c3f4812c0cfc6a2b762bd77b4e44f940ff4b245 - -Len = 58048 -Msg = 693eb5605ae784d0af3cc39327d3467c59b47b9048a89e6837b430d7bfe0a5cd1e3c5d7bd225d5b867c51fa48dd98f8b6db7b80c3d8f967a12f10d82f68f920e3b45296a0f568fa550f9b83ba1147cf0bd478dff0b2cac7473dd1cd771b7570a675e017438011a6012e0779f8b0b7375f06ce2b3d90746200181461d55df5b894b91cde375afdeae5682441a7446dde0ae2e9f6ed0a9ce4465e4719ecd9006538fe575fdf0e7435ac4e808f2844e23faa196ac791899aaa9470e86a0fe51c02fda63e10bce31b12a0319a970e2aaab8b6fabf11cd85f44174d086e6c13aaf1e7d411f9543a1590e8bc1d11dcb7e2df5bc076569e3984025622d90f4a3223014126f9a6225a1c485a96fd267e2a7f26313dfdc449628f4e2d6c895381844559067823cebb56cd41493ac0d29d6408e7d78d4a21637b088f65d421215b30975ffe71955a6857b1e37c4f6efc838c058c1359655735ae782cc601a8601e5ea27cf0ba593371854e97bd7e108c76cbfe7cae49544c0721668f189c26fa1338ec18a5fb773f1e072fc3d26fac69bf497c1f700421ea21fc5a1f234ca4d682e3ff9ce6dbf568b706d9d184c94d7da62d06dd2033d417ca68dc44afba28dcb38a636e7902dd9583a9d6279b34f8af72a0251e887d73bd4b8d7566838dbdf4ed539ef8261937aecb19ac2fdf5ab7e76dc9604a6e8b08c3ec92aced686e68067a663aa1b7c8099ad77de64f18e0910dddd13fc99b049a11f59f0a42260533faa0ecbfd0f2b65d43effe09f10d718f0a0bdf4a03d791328faede16cb85f925b8a80db3efa18c3a905bc49f7c87b3b7c43f1c0a61e9dad7255f7558f14df34629daf0a0658af1a96962f630584e4e1324c1af06499b8691bb4f8c581c459a9f337dbe0d9a768eb0b64ebc42ec2aebab12d8c1c624b33e6839c74c9fb5369737bfdb9e83f62c0b5a5f653f5fa2e3328577cd7ad35bfaa965870fdcb422e89117b63ab989e1760fac4df0a70ee140caab39e801b45438708f8d6f651fcd233145fee337a7c31a42b066361cd8120a5c2542717ff179353aef342f0f691caf1fcb811e3f6504e14d6d9381c5439b098ff978b01b1331b8b08b62960119795302b12532f94c0c93d8ebbd17cad9e5050c31c5edfea1e38b7a6d00ed64b74bd882fdd4698ee343f88a33ca41542258c67ad5106f4f23f9743f9df77c5fcbfa0748b9750926b212d70c4ca4478ba55c1382eb417f3722da3ca7212d8b1bdeeea6fcecf05be842dffa053e317196ea5ab6cc7d3f65de25eeab5c038c62c0778e7d469f2da7fd1a13271e125b079d79b875ff92f4696bb49d88034bfb49751f4456ccd913358dc31727ffcf0850cadbe019c33347d307574f9d47ff6187625d78f739a28c4cbfc352c24f7d22954397386ac26720ead9976cb0cd29a865b0b9902933028035bba42bbfb725901e30352a2fa13667f70afb5c8a40d0b72b87bbf5b46202d539aaed0ce8decd3a33ba3d1d320ba80442c10c87f346fd76210eec0f6070a9749eb4275c036d80081c09387939a6c6e013275056b287b7cd8e6ed346f5020045ac00d982d90b43e22044aea50d1a97e1b264512f91ad06a4bccef9033ac30d30adb78be8326120b08993250b761023f0669f977b565df2e3f157e4acf858da1ee700c6f5d6161e5a9d1f27123b3073f67900a8a3ca41847276311eabf76c6ff5a30410118cd345c8a5103b2226218ed931b00e0db501c33993832f66ffa5d29f29eaf4a41d409ee3e88eeaa3fd8c7c83d7d75123df45b8218f759d47d8ab0d02c1dbf71652043091b0c0bafd891846dab29cf74c0fb46910b431f2b449272808b3ffa3d0f1c804bb43ce3599926ef3c80c288aef0ff6e0ef48dcb5171cc12998467d7f38c233204aeae1e3dde0358b342ba39276a5b425a794a16fd717201a99c47e13b78fee8e24ed214b323a161705583495489a963e1ee0a6a75c03ed02f57329e8b61ea0563394b5f50169b99e25db031dcdb543353e7413e50ea7cfea939ca7859b38f27e5d27c569b036c5287bfc39b16dc06412ee9711b255cd6fd95b861f72cfa58c108ced7b30a966e3beef03feda9081a0db1592c894993b74d7357bba38bb2d1513a72ffdd152c4ba666937791e9ec2a09a9dad5f1542ba87ed09c1a05ec6983690963573d41517f32ad1e2d308ff490b566d30febdb8125021bfa1f86c57ad968e414706c2592635120f4a331d1bde8a186d63cf13630b767d3f63eaebd835de1590addd2185ba29250cb7c2e75b4bc5e7858ef79fac6da209714fa062b0f9b52e6bae227c039b766bae73a8ed255763cb9df8a1e9f9ff7bcc3ead3f5947bec4dfba94fa583a91c5ecdec50cb7e2c90dcc9deaf37ab38aaace8cc4f258054fb23265a58f3f9264beb185f416cefb6a6af36dac15d943d6d61745dddfe85273282f542a09b873db08c18949f0b9d6022347f686308e0faba8b04f402e9096f1cedd6f6a904c45c04c24d40cbf00dd59dfd01ec06c2281d1c8a0943508d939924b449faf4a8170d931e34c85ae2c77364797cea1f01c000fddeffa04954aa31e486cca3f62e25cef6005dbfbe2c40b6202a3ef72e504f32f8fa56bf4fc6b3c5d6c5ed963fef472c9809268b8865003a6b9fd677c7263c4f788cbce4e66c46d166021b563474118313a93da02c058c6c814ab2004c0bfda306d690a5bfade9c13cbbd44876450b7ed360f1b22b865bc90bab70055f7a39da2e9850960e140331a563b70177da9b8c61b0e126098fe4dc85428f1b63e947514a229b2a8427298f4a9a2205abcd581849298a70385ace1368907da6ebd1cca4f405ced7a46fd35696bfa3c99475b7cef42b6c255a9f6e0a4025ba2c69dc2041c6c27a21d14687040444bab1c46c310ced46f4b9c2c64b2d8672c3306060e8b41ce90b9dad63bb343de9e572be296a4ebefcc2a21367ebf9a5f8374761f89c8860da21bf9b1ff6538defa270e425aa20c3cd3482cedcd70b492674d5d11ba21b5d162aec2cf3bede8ef68030c909a71fa628e8b047cd82beca9e0a605032aff94c4da5b7c5877b51bb7efd36ff1db797d0a05dcf30927590c4cf667b41e5fcbed8c110b71743b2498de977f7d8fa7225cdc3f243fbd4363da22b279b38ae3eb86d10fa4e74910a2290d68f07f9285d4617f444931bfb3af1fd41bc24a6e3ec9273cdd0f27027d9794ec6b0cbc22fef7529c1c351138ffa7a209392bc0f2f6cb9a74823579c50b6ba222a7bc7e6599f3f8dad0ce274fb0b22d6a159c5f40955ba62206fd24ba40871b5824e90b86de301be266feba2d4d37869fb6fe6d7da3e012ee724e720ba751c735eb79adab5517835be9ab14f95ea0764f253733d4a6c2a77fcd12a9ddc5326e620356a9fd870ef7ee5ebf7bdc6c54c5226831f96b28682d7e1f30125b2493d78674664aa3fb7e4143cf2138fefebb3bc289d2076ab03c6c927090f5aa4bdacb4a4793d7c539d0270143b993869c3da0d48f04a4fac7a52b64c91a9af5c271125683c3978dca6a72d1c36fd39cce42bb0383ae1943f30b349c31b6486212be745130e0d32135b6ea5a562b426a1d3255f46cb8af6cbfd64de1b14c4919c22bb9e357d1d4a9021a564504d52615107536525209ab9db06f3fdb50c4e3435a1ea8b5ff7edf4eba007f39d555c8c8307326c33e8b5800503cd13316065f0862010a6f30cf3f37e4cf2edfd29370a90395edef3625fdba26a6cd910bfa058f633ba7b9f2ac3a8e08ef29df027866e01341528045bfe1f6ba16f99c38891c01e53447394efd1a78aec838e06eeaf196e8e01f1b70424dda95f21ffda499ee856e54b29a4baa251f5fc2258a1cd25af308db1a6ac194898e3ea3055c5713c1448803af82f29ba4aba245b7861619ea1efd980c153f9edd3b3d92745f5ae0de66baa9089a4ab9de4400b9b57c64a5e6404f81bcc4f24891091b2633b1b4e68d128cae83895bea1d100086e8130c60998084fdf41ee37bec1f5fc60cf86d0f1570877ae9f72d17a73a2a1418f418314a0726737acb191d37a691dcc5dd8e42c0a93275018ec929c6e806cb0cc78fff40fcbd4d17749c17bbc53acf27071e67d4e5160895f33606bf431d148e337ab4c488cff293c17552bda5e107fa1f25659a4bb9996bd17c98dd72f65564e0e0371ed3e6cab659abb5886d0eec06ccac265a04a5924dcea4c5679d19f75777c9709604893d48e54627634649e612b7b9915c3762590192b477a4ee0f632fa03e47744441b3100c4f9295581b5de887578ee70d76584fc6b795dd8b5f00b40245a4ffba9494d777cddd67ca0bb94ee58b0544ae6bf50112b2075b9c9135ae46e96f808f0c4865cdc8f021c5a2620d795fdebc41c99add1dafb5634a2e6ce4132f903fea313782b749b30b7066c0edeada0195ef16aead90b58740bcbd0c1f1221ef84f48acaf6dd560e6cf4e13bb5e1045717dfdc993712cd65381cc67d27ebc67597d49f6788e6fae98e789b3c2f05e6c68c3aa2c2444cfe37958fd126c4452608bfb3f878027b3a2cb7251b2921ff87373a27f1939be650e59d3f6771bec84a9146b91e632a4320bf3023e96c5476f0936acf50730687cb5799540fc5dc1d39f9720d9892c9e7b38a41998d6b901327c0655947ca4bd77875d0f6528ae7ecfb268cd8ee6ba60efb7531af8f909c7e36a870ee5e0133805e288c4bb729a8dc9902db41a9588b6101694a8f7842425e2431d6b61e7e86278556137ec608e4961a74a97150bf3e87cc4cd25ed0e8485bfa45ddd80eaa0c77f6e8afb5079066c286633c906b0a8829640812471dec771ebfcbcf7db7ed8c15b8c7a5180329f507e6b9dec582a031efd2835270e9b5974f7babf2cc9fb0d0acd3d940d1413c580d415dd4381ee901801da7da01bbab709637cd8fee50599ee25008c705492f587d9f376912c64dc0854d5af1231c36c999fa19ed0a5252bf5f363b81dfa46cbdff082fe47b033435a56b86e0fd93be6c03cc7756492b01fbcc8d5ab784d9594f3a852d8c9a5c0629897e12f0b9a8ab1f7ab5cf10d365d019d15e4cb21f7060d5d71d19ab98592b64d98ee6667ce365aba6be0964cf8726e315b0fbb7d6f2e8197dd9db879c820cae3ca4ea8d71cd54d831ee0d9a651a6a1f418b4e11d1e658e1d5bf5b68cf600fcf5ac606acbdede16dc04ec3fabfa50696fcf72d0639d41af687da8298597a9d8edcff220a8bcb7234fee413cc02b06110effd80e0364495203a2f365e61581fb46a5426f001f071f390bae65759c4e355c2a42fe5efbf312696c860010f83fb09abcffaa647e3447321d822e4ea68f42c1cf5235e8dcc56d245ace9ca8c829b5548778674862c557c5744b1bbdd24fc5ea5f6429237f46ceaece3b70100dd6560e854b3a2e6540ad6da0879245b8063b406b175cb16bedb373676b4ee931dc3f2346f67778ee2cd48532c64678c0591f3e72ea54f52b20c81c86cc6d86bc91cd2d4cf8b3ca75e059b6ab659cb973aefe6ef74b868125865904dcdd709b369d7c96f7c083a58511997c6b03f99a4a7e354c78b985b7e394f2b6ba1cec791865e9fad7fc4b6ca4273041021001addd5d604177b2b73c0dc331ccaf1935b2da7181c38dfa9fb24b97aaaef128393684b31bf864c5bf7fdc9772913c40e0db0546d07b5a49e508f3e96510c8ab04f6d915a4dbc070e2e6089851bee2327244215c52acfd78afc335a2fc00e916f951530bb7662b42e610ea3c3b90215c6ea0a73884b2c7f57483794adc09e2fa8ac87afba022059a2d9329f9bcdf8a2d3a531f51e3374a4ec7cc4757919646d43ddec96c1b89d0052dbf206741d77d2369ede24f0aa504e31e00184f993075228706c6e376182b026b2765fb57328aed71d3a86647868860ebb174996f530e740ad2ebe84c5767206a5e732c895b33d9e696da5e36463536b572d4cb809863371db5b0e0fac224ddafb6d08144bbf8874cc9e09d637e9be30fa6c16c895b23ea4441ae742de2d498afd2f67015ff4953f8cf638a3b9a4ce45edfc2e2c625b10c22e94cf8422406efef356daf797fc6ee9f29cbcb4b2398b9278041c4e382ab2b1e2f1503e4203c51f2509e65ebd7c1b5846b81d6fea53fd00e2ac6995dfc72b5ba858f2d6041d55d3da71159e971fa276d074e13e29982d75751e9c681ed983a6c7f13cb5313726035bb6ee1fee8a0d29d7f6928836b022da777f3d31be08c27c89e5b64391f84198f1fff94a8968645ba566b7b4da44e41831fad45788fef1c4345ce8e8eb09ad78e274bf85325fadf380edd92cddfc7c15ebb4ea4241601866117d5b0d0811728d763fc739af17f2d9b1b37f57077ff1bbedd80659b4d93d4968719618b1b999bdf78599cfc93a3af580df319d1f764bf17e8cb106a80f6a5781602173aca929f2ab71bead486d8e2f34997866ef88939ee7f872b1e4aaa677a3718584c1882a13dc28bd3df45af56f170bda1a3d5ed0ac7146d1c03153fa9118cc49b5baffa508d0d51ee695a9779d6f5ae121d29f0a02619b569c57b26c8e269af56d5eb5a0b9cf9e6a0ff2021ca185b115e476f4498802228aad1e6e0754160312137453260e23ab2822d40bed63a136fdc9f00596269b00f45b4e2fd0cc302e2711c5803cef1325e086036ff1cb0b1121390a79f8c473601d0fae9fd1debb44bcce19e5ec44e6341ba347d430c20a6b099d8af9784ad3688b2f07641173016c59b237293df5e5ff5fe168e3b32ee76c3e5b392c1da00340c8252126987148cf8725e9f538ea58af37a82d4381f9eb3b47dddfbbefaf4b115c57c48e6fc2d994cd8ff5f1e30b876b28605f9ca2095b01ac89444df65df303cd2fb8439d4cfce4b45824c44841b95cbc71c6981f4882e5f6c92f8b3b93423da513c4ee2af9f8e7c3e83e176f7237aa7a432addff9ca710ac046a1cc53a81e86b6db2371faf17c482a80b915e874a7cea3e53134aef11a956a1bbaa9c38f92ba8a448c583589fa479fe53db1f6938fa95cb09e3092809d97c0aebdac977ef2fe3204f415edbd9ae3153dd9cbafe494e025013f5432fd7c8a7a6c25653ddae1ba4498e52b8200d0b3110727d3530c79db9373af000ecc39d5edd07c642547d187487cfa19a0f83e2019bda269ae6f81243e6467c484715812a1784d19fc3a34ed942d8d60b90825c2a5edd3ef10826d227c7ff422428149b92bcff20711169e45de27298148b53a133bf426e407d9708ed402cea9b7709141e34415bc028170388cf658fbce83fd8a428d35d912f93da1ebb971cb61c3c1356e8122994eff5d2e17179640b8f8c2a060056b3eb056470419f067f7cfff5c1c33e3932f64e4a7af03176bf096882bedfaf941a57e751f3de5442bbf5087c45ec9f801fed2d60223d752347bf5c6bbdba9d5538dbbda18b7e421379292018c85974ad9882747df351a649a534518d4e1c3261b5826f9d5fa8d14061212d137293238944bc0bea15b32db0817030329a8fd67f3a51e68d98e469931ae418b36a2116dccca3dbefafeb7020817ce2a0c89af1796f5208b95dba72d24d7aca41d98bb36ed73fcad3e982d961505f4e1f01c6eb15fb8cbe68d7b354c6a1ec2a04e65a64060e99c1e0ecffcf3a94215bf96d992c1c8707f1e32e567737bf411f46ba15906e19b8a95ce0eab975f6cbf374339d1c55bacc8773892b43ed4e81934d7c449e6c9fa46890edcc01d81d64fdda7c5a238a3de26a5e10bb21aff7b46d635570f8c94866e8c4392b0e2cb2f460716f57aa81b75180eced8d774662e395ce6d20054cbe050f40ef9248385c840682351c1703d122b367452aae7b3616f2d6ebdc2dbfa689c74b358617c6c41ad654f531d4d8335ce91543182f141b536ec5f82cd8e8abfbf72e3391e39c91c1b831d81f47c884070c400ce161d9bba4f0e1bb996e9173628732133a14836c7e945f066dda9b6c2c032ecb0cab94bb1061745daa5780a6c65e9cfa091243fd5b5227a6a3f41895d1b627a622770bc69fa7c405e8fc7eed2f66b7128746a4eb5fdbd1e049fc09a4010d75c5aa2c07825aab1adcd9c352f0a686ca833b166edf9215a5dee85c3444c1f05f512c3150974855bd0a0715c65632a61c75aeeb6880fde9ebc5077b611b1b472c7231f0aeae728ef7b6fa5ba0c7dcaef60f662e5c77a73feac02fc15ad116fa254f40d0e96fde3c0e0838fba9edab87a079ed45106b9900ebf4e796e60fbaf19211e139c88196484b294b5fa96da71762dccb9a4c05d912368cb762cc7d1015bbdf9c93158da29bf641bbed68f2d84784608693daed715f13ae278dd5c21f4ce7e2fa47963a081c57770e0fad2247004d2ca89a81ca68ceca83c07fc986f07f5f4282bb1431d2b2b5f4ce2c41a5fb280769b9160844c746a23209a1707389976c26bd58561908475ae082abed24fca8f83e3f6f380495b1e4e38b59912ff47a54b63186269bb0c28c62b3f67747536968d4c40cd9b2daf6d9c0cc10f66239125f1c68ae4a5fd40a94a2e874a7b50752a152cf57b3f69ffdc6ee562f65b55e45d77dea368b0c7b09bac9a98d4717204aeae1e9b78d76ebaef698b11ca7cf6dfd02043d88b14aaea645ff7fa91d14a73b8aa9989430ddc6f1b0e46341845a6d212ad6eb0a84c374c97f6bf030f355a30ccad1675765d138ae3bfaf605c3fb6799951e7c26cc1cd55aae36868a8f811ca5f282db66f2fa4acde003f2cf2e5c624d8b0276435000d9421b87c920b9411aee4ae37e2a9f020336e727dd098b25662556aa63c8d91589670e8740583b3da6cf191dd70b368e6cd1988d411aa3fe7c093d3fca1f2f03ecb2ce5e739bdc1cc730a9576e727d498b873a5ea56a3e8daae187e934af1a730a0ba533ea52638786f940baccc53ed86a3e17c19261247dfa957dcf28e0620dec5bd92e2ee39925e912276e786d3fe611df75df8f671c74740d671a2e1ace789988b379c6b8469ffb63a69afad3491986539de024e4ef1a1f318df1cec5275d197c7b393a37329cc1d40466db5e2319d380d7ebd940651903ea367d91493563751d799913ca24c5454e8bfba275978f00506b2837e34616281eabe6fe0fc033b455f5bfd8d8e5c28eb78181d7826b2313aaa0c0c5355abc97b635539e7d9074de0b36d311c93e3aa4f92f1f03ec687c1675bfdb0b9f69b0579b1aecf7fc6ccffc2785fe4604f4d590faddfead1b5643109b10a092873a9d70b3a2db93f51eec15902a6700f3d23c59a4d3465d77fd1f0a03db38e1569629ebe81745face6c7231306d38c6fd9f1707dd581e9b6824b90b9568cb817545fccf21bf55b2f11f0a58ee9596218a220da38fb5aef05695b81b39fe80f84a0fbf2446e43045c4ff5b93b2ecab980224c733a1331fe3a916c542d7e77fd03fbc1af23ecc013bb1d30ee964b89fb3ce6dedc2fb1899fdc97088895769f190bb13b442f3bfee1a1e65ca63ed429afa54c5265585ac43c41e6ba8f7a1cdfec126dd361b4c071f6c757b380833d2c3f6fdf41af6273946c211cece959e5bcdeae7e2478631ebbdb81ddeffe01fb0422e31c172acc905ca7f0863a16a345a879368ea908a8ab2f0877e56c8f39923402a59f6d6805359f6826cf0ca7e4c14534510bdb92f3fa5df6000aa3b4a8a74e573db59ed78ad7df253a63ef0d9cfcf5a864722697d390cb3cb0ba4ffecd8ec589021b3609fbfb9e77a1c15bc84a3d4c3e175e3487d5e2f9350070abde16dd1c20991cbd6fa7255fd7f383cd686b26bb7db02c6ff369755a8785ca51c322f6b4a67956bf893ac985beb617de5e7e2db5efe579436b0cdc71aca723dc5e60804193194596e7156cc2a46fe9e91af1d6edfd1da1494f4e6ce10cfb29a5f05dfe256eff65edf9c59379116796884e74a6a63dcf410c209ccb0b20d828393989b4e2a2a2242f41d9b21b9e539a36397511811a80d4e68f765b5290e4bc109a52690bd6882cd54fb06d4c93aa617d9c51ac012bc8e982dc79b279d5a761d683767f036347dc7a73e8197ea9e288b8c7b8caa8da0ddb4b980544c3577695c595346b6bd137bf797eff3b1449827c924c0911dabdd646ab52a7a6e1aef8e498303ab297c8fe426ca14466bfeb00b974a9d106394fa8a84c9cef4d3744a4cab8f4e7e92982f211ce8b8610d416e3cbea618f2c26f7fb6c89c73aac36a0e0a49243da7393c7b98a19ae02cdf345b2306df3c1d8364f55200d721848824c532ecebd60f668efcb27d88968f2800fe2636 -MD = 511ee3ba7cca58960e5e3865e895995f988981d8cdf2a0fab5acbfbbaa0b2b5d92b3fd5c920f2529a5739fe85a8d94bc - -Len = 58840 -Msg = b3701aacb50f918b8a79d8681f79dc8b6abbef0cf3386ee993f5a1567bede254794b028577dde83f45c67bdf9873c36052d04a2c03bbc931b0b90038d4e7e672a534025498ce19a527da09d6d268f59164a6a294775321c03a77af6d7252d901bf92e4c121c96be7ba1d4af4d642bb4728a5bfef56eac0beb999749e5e14042850cd6e7319b5282a86f806e2abe75daa273569e3a967ec52b38618739e17af10df4d6913887c969912d10447594123e1e8bf671877b2eea4b2a663933c4122e1f4799c487705fd59e6110dcce9365415f3a98238c8b30edd3d611ca73f7ca4c217bbd1bbec38a7958a21e91962b03a6dd15d82e8a5529325dd1f0d56b0af7edbd17ace14f2fddb73876760d5cc961b1209412fd21477c7a31848fc4996c2f955a91f5cfa8e3ce01b634d39a82fd0402b23bf509e200af0807944b228f99c5b5828104315caddffb6a93a3e3c9445f1e1a83eaff4cef357e3857bf79ae227ec0bd4b64b0eadc8806cde96353602df765c1f26127a281a44f5c6569247574af69738793c8d3fe6ab648cc8e741828516c310de42db3567fedec33b4dd863edbf24d9c2dd39891dc7c73a3a1c031b1f1a3e03d007bdfdc3cfc50493eef50bf890d941f7f7bb92561ebc71539c24d596caf7816328c98914fdd212c73e455954b1def78252ba637af66cb87b2e4db8d06e1311ff6fa6e044d12f743d057154e76a5c83c9b6df026f98ff971a9c26cdb64ebd3c0ca2fc0a399301b25f0b20049a037b6e36ebd2791f4c9c9698ac561b30b21b89f28a7510dd8b73559417fb7256c3623e2fb83ad0705a6b3e5e2786aa27e155801aefb7f91601aae443f3aaa501f43a7e1ee7c00d4c099516d2d45d83812494a9ea996acdce3cd1e7d665d4a584dc2ab36a3e0b3a9aa242a75d7d84ad28c3008dcb4f3795ec850ee6b436217bc8c35b677b86c45e426d997768e8a2300206c0b326dbc6585824896a452e3b2eb4f3f421b98692822bb2c31059de6015f934fda36103be1efa616cfaf114c7c62fb31e6a8c081ead3fb9e8fa99276663f497dee6e690c7efba83dc1f20b2704c234a01c95cd20fe765c92ebb918b5b22da758c031b498bd480d403603acedbc77701c4c691ae0e38852cc0dda8d2e75b95172e826af8afd4349a0945a731b33f132090e99362c3a98828c4e845c3b3150cc5edec3a63def8be1e1656cfa39ebddfef8cbbcab6d54154066362d228675827c7f1c8f253be4706a8501c1beb4447c3b5e1c39f74ed09d20ec4d5b6c7ab2cce64619efc90f7c9f480e21ef1d34fe8a7bcb6897862b207ea8710c85968259ae9e565f7bfe2328671edf2e4ba2164a5734a3496be4acd4585bb6ec423d580a960922759a31117876338a9f7df9e2d880fa88271daf2e5cb89f007507cd562621bb3cc4f10e44dd3b4aa2edec6125298631ecaa23222a39fe06f02f4cc2f74cb03907f5e6e257d724a89aa21d9457bdd57f331b230a4afcb708088387bac5deffe716610259a4e6d0f1d44497ffe4f60d471e1283b3fb057236ac1a5f114c5d3f59da9ec9d0c69cbe9b025dd1f077628c0de028cbaba4e49df77d4c2962f5681d15d717a3f427594c28874652326993d0583bb6717de32ab8eedea17d3c4b60078f9e64371061bd081ee5a6af22460a889a83540b973048417152a2d0e9d8d58d4b92fce9c1e03880e2aff73f4c872703695989f08416bdd6237bd8bb0808492cce475a32953d4c451848a0891dc789df2910b0c6c0f10bd579bcaba223642b447c4df4b7e6d368a324423b131261938a7e5b6104da69b2cde887a40cb8770c92f9f964d0534d3e499b1f4f73c70fe483cdac23213cfb333df48f5a7123ab6d66bbec131257050d96e1422611a80ced599b657fb265000d8422162766119bbe5e369898045e8587199b5d878331e32e8a6c19cf2eff12c25ef5ce9361fea28fd7fe816c1cf6591b502dc3cc2f014d2874b45ba9fd47cdc22ce40b46eb376a42727828f7c2aafa3ac91d176c9b72955bd7088d98a3eb7bad6c817e8a68785d86ac3801c3abe8e375f2fdbaf15f124648ffdd31f3c966c6e49c327b06702df6cce3b2ae781f3caf5d4c2440f2c07cea607da6eb73c4261a083a8ba32378c4b075b77c815dc312a84153352bd985fefc42cefa1c712ac5ff78d601696a18d92511a5fa2d1d0e0778d2a6b4ee2e1634f650624b478473a2d1b6ed283052a6d7cf412dc0041e76879b7195180a58d7ab5329e62eef1625695b52ee54ba75c95d1954bd4298da831f8abeccc2f2f260bead2fb8f995beb675d6dd683b5a3be6b59dfce3166de9ba3bc10abc6a4a73480b7ee2595fbdd6ad54eea6c930821d858dc77a2d9ff5c49278c8f5c2628363d40e22e255a5ca0680730d5fbfc8d4b33c52108cfb63c2e392332d009d40104cbb3333902c806cb6d67cbd588a88c475618f1385eae647df301747ab9b77738654174b8c4c64087ff5ce6931d7e4c3dc9bb14af56abc17000271b3575b9d4fb94526b52743b51fca84e4bb6c166175615145216bf949930e7ffefab44c15e74de4ee1b019118251efa5c0e77d4833b9c18d7315a25135e430efb7812eb85fccce9d9f7abb2f1baf5cca0ece580ce990558c3e5306c9ddb564613d623b841d2ae9a76a57627d643d7823fd125a9b81005a7b7c79f3e6d9cb0abc47f4740ee1b7b9d50def17e3a424ca19545c8bdb433357c1f52e718f704daa689edfe03ef29ac58d4eebe149258bdb15dd53f4b57751d4c6711b89aceb63cdcd0acc87fd9afc9538f7f3c9972d9b317d5ea09c11648159f2b8e842269237fa53526372311f05b23fceaed6b5057b56baa0ea8bd853ec6fad913ca5e3adeeb962404ba8c3cadca3089cc5108bf555d2356bdacaf08cba9d5fc6bfb8cc84b392629a2d319ce3aaf0fd28df7f02444e2b558618604357126c701d1a85c95fac0ebb29b016a2b29622853ca52c003c90eb81bb4b55b8fc1c63485ff514c38501b4d5b57d5ebf7ec9c0079ebf1e6e23439923d01bb236c2020a4f54f76ba03fdb0c18063b11da916b52ed17d45d35428ebea28e327ea7f3e9e9eec3c9944ad5629fede39338db31a3609e6f8cf23be19ae166bd35c1f2d5fb898b751397a78fbdf4ba152ddaa9a79973826e91e46a488f8ad725cf83ffb1607190337c7aa1b41594e865b0ff2e3b761201dc883ba9be94425d8da6cdb6ce402963c3ac471f8e9105e098c5af513462c683801c00df8cd18f60bf62a6ff76c23a6eed4c0608635ad1097913f3fadc84167023f33af6fb6ffc4881ac17c2ef0e2b177b04bd467c977fcacf43d21179058a308db5f1d551960e7d9c2c27e7824d84c8337b76c02171988d61fc557f540caa2b860b2d64d66d4f67d889de5677a7cee8df5a385e9a10a3b9f8e7832ab5c2ffcad69df78bd41d466efc6b44f716438fdf45480c082e9b28b65cab64fbe34f10734412563291cd7bfbd27c62b2a64a52142eeef8a6263ab0eb55f100da28da658f9a12534156a6777420613f7071e39cf161f30720ca17c2c2ab6160b0ca8b87879e47f5a06bd0c143afc5e317bd37f7dda8013e5e6257e6a225a28b63128bfdc1195644381872e1ce474e5791d36eea40c9bda7493625a4f38d5d89dd48024fa7d2ea48efa5b5607fafa4a2c4fbaffe838dd149c78ea7851ea9396304b41806a093a90aae59c0c5bdb170cc9a7d22b90cbce52cc1b105108942df20c29ef3a913223b915e7ebc98ef135adefaa0f0a6441ea05920e868ce9d1ff6c8fe4dbec06a4849e5e55ad0627f9e09dfcbad414a937aabd7ca7bf845c20a2764a00a9fd40ccd7b0f2d3525a9d41a26d7f7ec3c2f629aadaea9b2dcff61c91afa8f1dbe6c617978161c59e2f8564f58cf65a50adc17444fe7a4d43d84e0257695b5ce4410d114e9029c0d30d46d0548cdfd20d2d91c413989a22b425aa9e6e43af9655948c46575dc949837c781039edca7a4bdafd759129c8dfd140b22d40bf34329249da235c5abeb431e58fa1201014b7bf3e5b25383294c93da1fb5b694c77b63ce96d34c80778b560e1040fa1946d1eb9b0313f93336c735bd1cc95626bf8a5b7ebcbf724f485b192e75bb838fb2213dde916411cbcee62be58cc57a6ae156595d95cf6fda2743d3a711d4740b4d24b9e3180c64f2f691bc79f613eb0737c8a593ab690ac81b2bcea06cf1973420c0a6d32073ba51b8b031a1e31a71a6c9c8864786f70cc22dfb50420c7cb2b332de4ed52f01db8f1b2bd287da42d3ef9d3f46a2acdf3e6f649ba2b47bdb8e2f8c67f712cf1e8e5527eae75063f3db89bd132bcba78b6578c8f40c1f4178f3513441eab187329c4be5d5b82706954f1d312e7eeaff614c8461ecd5abe4b9a9c134566fdbdfa5ce185cd58d324c90f852ff7686293acbba3c386c477fee087726948ccdb860dfea6595d0ad99bc4d9ed131d58daee22f7647545da8c4e7cc26295acd4e6f9149b8d996af6185df320942cf32d9a17ef7494fbda541a1556c7e7190003829fb49021d695bf11e3ba8004bdf74b32b978afbf97c2e5a3fc25247a73d0dd40d24488ed816bba58b5a184d976b856374b45054ef98de3bc6b5e549726adb6a4496af25b3a3b6c4f5c4e8b6cc7a4c31a35db11cd9199f2b5db78d4c7b1e5442f5d9e48f561a369883ff82049315b165e01b151a5e0858742c4fb21769615fa349735194688222675e954cff93439c465574e417276cf15c5c05bc73e53be4d768ee5cfc92e4617aad0eb06e750cf51d27f286dbdc4d512c1561142897b5cc2479d26f8e7b47dd1999f0141ae078a432811d642e24b3622b7eec20fe26d6fdd3a4a5f113cbb37d8c4ac5e2cc7d9092cd897ce4d8a7a70ba3c02d49bd3ba7602b13f14a542c31291ae714814af45ba53667976fa00e3034da02acf72c7d2edd76eb3de11644c7c90c9866595cece1c6b444f66e4f0157c5196df2931495755dfa57122024bb8046aa8742d2cc0d2bde91482247ad2723a7a82986833d2a84c6017df76e453a61863cd93054610040d3139aa26482299cc0cf5df0316fe56102d1857433406974720ab9b847e26d298f8363fe2b96aecaf9d632b903726e16f7b29811d8deefc0f25c4d631318fbecf829cabf06b15fb63b04cf68630d6cab8feede57c3e7754def79bdb820cb5393f84cf86c5c9ae4676ca35c85b80a8726b0cc7ecd5d23a2244faa3240d7c21d257635148d941ae4e575f903996a2f68914493a0fc0e591f4cfc37d4819ec700ab592d47aa18f908393f4fea2be145b7f3328c6e6a3f5393cddc68ca05dea0a42c8b7ab94c4ffff76ab1ec39c384131b5562ff0da156d7a7b0d9843d540016b2b0f36491faa1f35980b21a19e9bd633dbebc33a829bdae03fcdad554f46af1d2407935f83d769fd8842c1fb226f4fbc53628726588daa04eb9c6a1386f86f9abe20533159c36c91a7d06442b018fa45ac68e026c48177430ef8731104dbbf6e6a07fa8119f493ac77328d1ac03f726a474d62ce6f0dbf453a704cd051470af2a82cfda13ce18ba886e7a0e5fb294494d4ae838fb098de65ce925bd3f4e0fed208fde1244b209110577e3426a99ced5fa50ac6ed21a9713f6bbd248e582ff7870cf9297cbd28506e5954eb7f53d0e91558d0b1694ab6043c727f3b71f39a818c14ad4b3d1b6f562d0d1a0b32928ba460609eb776845503d7734705217fa7295bb098dac7ee7bfed7032c27f2de13cbcb5cc36da776fcfcbafea3161f24dc5b60713a3cbf9ec4d6f6ac09c632af0fabb09dfd287e9b145b317521f2cdbba09444d7000586b4d05b0698316a648de5e0baa49a9c6e5931abe567320fbf8caa60834298a9bfb93517713841992ae31ce734112a1df939eb6b415561d15710404c765452bdbd245988e10ca8b6d8574b4bd7643a4191c59825dfb01ffc36ff18b4c88ccca6217eb41bb095d5680f42c77aff0e299bea84ce481b17eac4d1a17a45e44c74e76f30eb6c7a646601324e37f1258fa67145e0045e7ded50efb9900b5c4413da1608e355e7a8e8c936e3d2034ad5590f86467fc0e582b0c0c14153428472836aa680fe8a19b6a37d5d8666cfe4a90ae33f5ebc8a59c3f2d8de2b53963afa1ba51d59fafe7f4e150109bc74e45afb05b001111ed747bc43f7baba299d0c453d27ef16513984b9cdd2bfd894e71a55ea047fe01f2e1bd5f4bbdb803dcd54de78519028a9b1c6942e90e47d4f4eaf44284f005e45f5629ba583b510188dc1404dc0a5135d0dc167c79a1c0cfc91864030fe46ee2bd3a887d6eddbec4274cdf53dd39268f383e19f297ccb2a35464bd4a4909812293f5a250958b4673408d777c928fc9c05dab3c4b4a7763771d34c6be3b4886cd69ef3fd9d62d32365c07a42603f281efc78c45309b8a1c74adf14808ec8ac40ac88f27c338abca3702222df9374b9744fc47fd4890ed25c28b040ccf64b58402363f21b4c4ed569bba46dc9f368353e886462c3c3488c6883fd3d7bcacb20edc3d67f75481db1e8d0ddb77bd0880fd03edef9ab38c4347ef52c87477cb6aaac1656d6f4d775e6a338149c7feb62cddbcb7ac0e56a207ef1e4b4aa9a7c9c4a0d935ba5244ae5c81b5a0f89407466e3b3c6ee452cd7dba083db2c040f4afa7374b35b667e42fbeac3cf250a683c32d5eab99fe2cbf2546d8761094ff0884fdb840edc978d2016d33f0febac41832538f30c16465d4a391a8efec2daf8850ad6bdfe65c4bb92c505ef84c9cb86e9dc716f36d7dc5b5fe85bfd0cef3181f1b9f9851a7d5aa3fb94e747c645f482e0b713b1d25b1130a3e0967423e4e0173eebb87bdb89e5b0caf51bfa6cf6c3d00853946d67268197a6c04e66dc5a6332cd0e9804ca21d26c91640859c142a5e8b12077e45da0a9dae8e608578ea6377f3ca11ca26ecbcd51ef6020f86bb007578bac32c93e7ff684eaf048c8b36ed9370e31bae721ee22eb25881a58d4c58486e855598e721b04201d4d843d030ad4f4a23ef7459c1f6fb2e43a48fd95099a1167ca50a6a0f83f26f07c4f16c60097529927564025c620239c05314914f2a4618a69cca4439e142414fb0e08a4e6acbb73996c595778d0c7cd6767dddcf75ff1b0c201f9c2733f81fb584565083391b991f38e13c9adfe09f8df612e65ae196c7b41a539a62dfddb03f289ce686dc2b7a4c44fe1d4ec04849edb91bd477d6d1c6a873ac68714fb99df784fa75dfbdc300c9a365601a980a22ffa8e0cfafbc7abdf011732bdce9548de581b7251742add39d3b5e2e87cfefd3caaba9fe88fc575792deef0e2c17752910051d1db5d5b09cd0f630af1ccdbf0456abbd898cfc313a98c16a36e840e61980f9728641dd93036bbb250a61fb425cac8e65994325cf0e09a12ace98cb6d043d46ff8743c21faf75718368debf3f84d33ee95634dffb7cee6878fcc422d39350d20c4944eb1c49f60293f01c828024d3a191e7e7937b2b4efd9ce8f5acdf6dc087e1f4ccc25278f7559dcba2adcbe3b5a1a474e4a718c53148debcb2d15b3a954cc5af61ae88e57e52e920f8a6e96980256c27b4859aefa031869d84f90da4d70802a28d17883896e1be18a7d7a25f3c142f26de93c953a1a0dbb5f28cbf518fa5def6d765181844ea66db36a6bd6df2583699ea3b6d993f7d262c84f237e9c50aa2d3c701012d925527902d7d043aa9d8c9a960e44d697fb0af2ac2943e157f1f9560e6510a20870a4a5f15c33d6f697c307dc9f532696b21bed635d89b7dc7cc01c6bbbefd992bf2167174e031b33a2cb23fadd8e4440ab99b58642718c8a4f92c2ccfb1a13f87f3d5eed53ca8af25d0981492f42ba0645e8ed9d7ea7b9e1f8e5fbba890bdbba2f6cdfebd3f6a0b31502b2602b1cf2682f9de8117878da93e73e29bd0c41ab485e448c7b6513e6e6794b09d8477977d6b73d477ab68168e0b91fdf3cfb680d336a38c7447daed80cd8572a1a1ae4c4d27b2b8e41bf3def88ecef8eb2bcdb6c0bf1de12bf94240ea6e09b858dfbeb640bfa0d2eff092ac8dce131aad6e7086222738911452f1fc544f09c9edc9109dfc3a2469c1b1ac49f5d349ad5e1f09b6a277dee359dc4fec657a6eee86e40ac929a025c681e6a87ed9a556f729c7ff0fe7b6f61e1f1fc5d7c6f61e6f4cba150270fa8d325818f011e14d244134edba599aec688b91a2b9841fcb039466d29a0f794f43f36eceebcab4d299d2a719a25c62221c72d4ed94bc170204a5fcb4ffb9eba72f51ea900173fb3c9ff4abd41fdfe85ff91b1388bf4756a108e938e9aec86e0a3996f4e69ad25d931ded68a499acd3abe9cd74fca0ed85b3f9a940f80d04ac814908b6591eb183e0fa0605147889cc0ed4d11fcfa1764c3dbe2d3c6986344a1347f15570f5d6142b2087aaa9243f7b91a0703d8c29a952493fbd55c57f22f3c91b97fcb48809b97a76b881ed0596873b36eff6b89f4f40de64a1b29262944da9ad43d1ab3d141ad7e4e0af67835599157e9971dd6d30bd0515207d5b965300bee53cfcdf7dbede4952495f9f0746582560b5d782fa1472c53a83dba58327b50daccca6d8b1ceaed9a839b71ef72f6d75c58a4f30aec30626bb13f6fa91d714a0e839f71c3f0d318dcef9df6bbdd97f0d9361026ef10422308015f6e1282dc47e83cc16359143106fadd1000ebf0c37f3b48218c42ba16eec71d403e3b0ef6eaf63cd2cab0d37f2872b084290678f3d310e35b8bac46091617797438791e6b93c728460041db380db31e8cc781c2c38cf8bc20ad9240a349778a5e15533da4e2c9638dbca287d6276a8b7c74e45a9d0d3127037a8b467fe975d4703d5ff93d487b933c484965e3f5d76be5a9b4ccfae478a8967b0da3e98680fc5d2905bd8f455c2bb44bbce1ebf9a8545aee598667a32dd53c177ff58a9127567750db072569f991983f63a858b33bb94eab79136db9df2176e878c7eda9e767514d4672aa16d2695a8bd415b4b3302f237969f067a8fb11c9668e776d313fc36d96ee6c67dc55176dc984b67a69f41a9bd0c2aa0ff1002ac5fa07a083b79eef3ea62970e94b102064610c072458160ffa3a09aca1128cd0df4b9acfebbd933f46f38e1cc8b38218b0fac0944d0e0463d12db574d58e0fa887b3be41ffa3ab58191792bc60d62964e5ef58ca5eec5ddaa3143c9f17e3f71651dac8c32a1a45be277acdfc5c03849975c72b25d47370c902962597d284e1bec01960b00571f0d5e4b5964914cc122ae30abe333843ebb3521c06dbb0014de655080c951c5b4b33e320822f25a060ada042888f14de2d2e242e36f71ae99a31731f32eec926a36cb564281b0920de764fd72075d492c3adfb455c568dae5534bcd76a29b674a7c4adf8ee9929be0a3944510ca402123d9749e9ed9682b01d4494b918d24ec5a6e06f575c2621e8724b2048a37617dd098e92844113949f41059d4cc5750c8a4f446be7e74e6c20854066169b88a03395f857cd1d7a2ddc6edc390b068e7a430f751653167e7306d19d88533b4815e681792bfcd926c8f7f55cea6c428b127045d701016032c0fbe5d6f9873930f3465a6561cbea95f06282fc33f900076fa2a10ebe8b6b17f08010714c1aebcfc2e36f61ab92e8643ebc963ea829d56fdc4aaf60a1498d7a6c340ff0f286e9910f3e5ee25bea490e0e568d88b9872930f2e8af915bc44df6ae7822da8f63a91132c7a75c154a92ffe9d0f78eea8982074e0d400530a432f931cd07927539b0ccc80fb7534a3c4cb64bac52a5bdb9563f48190f20d241c31e90c31cbd3661872049872d5c7d27dccdbe593d61959f3c656b9c4b98b32574b345dad0bf558392c831be67dc2095c9b2bc67f64714939b064327a3c155d7de73bb74c21d55086a011b260546d72ea9e1c0494bdabd3f089e491b963f3cc156cc7c317f5bb7788377605e7440f32ae3e7548d7c70f219fb89f818a166ca9a742a028156feff5c65979bb8335f27430e30039526be458cea75da8f33dc919bbd18e8f4e78b8f1c86fe47c3c0d5c5ef9f683800c9274a306bde6aeffc05346da8059a0cbf6609317df7df21bb5961890ddc7c40d220528cd62013cb3874f588bb9c80293d32d053a130dc32715e8cb7d0294ae5e05e00faefe78fa197b087757e4a45eaef5686cb9715b976915999f49cbb2e606214d812ef9118f3882c5c9c567b55b254658f31d633117e79ef3bb7ba2e8130d6093a6d7bc95a41885cd795dabc3a2ffac47bfed5055eaab963c489beeffdd7ca8fca530adcbe0c26d69ada71896da44117bfbb1a090b9bde7bd6d3217c0ee5ae3cea6c1357dec3d20e18e2c17f5acfd5c3dcdf2baaa2c2377be53c785f0ebaff852d313bd716f91887d43730eaac03175d55d36086b -MD = be458f1d393877c0c12100466a1215955faf462b0de86618d8417af9a278316f9bdf2ebd1ea1d1169232f43d67d36942 - -Len = 59632 -Msg = dfbbe12e39b516635f3500a9bdc68b8ebc0080059209fc0a5e5c218474c90b6ff5bd063aa4c4fe6ef44c379166ac3e4a11651fc682a7d859c7170e69c7cfff88d5a6b8e084b287d4bc0cb4e40dd36cd14474fe023c284a27f7be751ced9ae210a4fe5ee681889bdbdefce06a5d44fe6d7bb58684689439ba16d9c0668f329e508d4b6215444d21cd83a523eafb06dd63deb11f13adf48f5c4bf0560f55a01990b6172b35750901f0d28de62e9221effe97ef3276b34f3352be8c9fdfe6eb3d1847e9210ebcc5238df43e8ffcc89e1e85cbf7257623ad0de79834039eeb1bf02f694aac67bf886feb1040881d4584513fa55262dba51605620171ea130b391c1e43c1340a295acd544f193759b2db70754a874f6de093030a20cabc07ef4ca82effd621bda043250ed9530677b7ac6270e51e56f37d2bef291ec7e1423f5c7ca4c211db49cc4c5f62d5755c41fbfe11759ca0de3723e7b10522f0c28ca27280cbb7fbca76577c63986b08a07d27d964cf97944eff7bcd31e655cec5adc0949cea031b570be6dc19f8c5933cf4e24543c4ff8210142de85816dfe8536c42cdb848d1f9e8d2247269ca089e976ed54b969efcf28b3ee03d0cdce7c6d592d022bc2e471ee791b6483c555fb219b3a8f245a3b56d27443cd6367f95f1b1e7119d90e48d11ba11476678e2f0562a8a0243391c537a4cf0ebbabf4812f05133ae451cb2cc5acb1a7dd207b9e31232bc8b445850fda2620892f18d7f864b1b3e4e2249e02c8280740096cf22616e9912ecff8b89dc6cd155dc848a6c198b79d09a3dfdb5d41043e679baba6592f3c751cd7cbb0d1860029f6e7a9c56f137d2b03a9d217aed8c7b399044afc99d282544d5c2ce26d8065baef3dbad8739d78da7d54a9e789e7f8f35ec3e9597aa9519b2add9ae1944e7454911afa44517f4147d134d5af41070e9a236af5618e3c30c62fdc94131868a293a70ff69d9b315cefa9ead3f396ae7f04815a0d9916e39671d6c9a71b5c3776d47b9d2e48b36c223e51b72348ed56c0cef3218064d737f90aba25524ec26377b399431fda2c8837b0835a5203a7988a55e341fc5931b1ef1d44802441fd451b9d7a8239c6890e13e29924ded867dc2235ec4bdfeaa8d9df06006a7b897f84d91eb9eb0a923b763d411da7282ba0aa3efb78afb99dbf284f716834e6899b8b46a3b1de00c1c6492a688b61cc71e47b26f312de07e6e725c6dbf68fe3c703c0dab91cebcad9bc0f41a56ce54a4f95d770c93567596ab34acba235cc01c63ade0beb3594b74e7f3139942c9210195737a2ea7acc1c7d961fc450a089bf0b933b60a6965964a4a24778c154f8cc638b2443e33d8ccfa4220d5783c1397a0bbf515f77d9aa3150a7ca659970a9cdb2b425ca200819e182c9abdba8026bc14b11c88edb5a27cbf70222a6a909f5928b64a4ac4d6504007e0f73e74a0e91335e3cf9454db22292ec43e8b25c8b9cb9620f2970b7dedb9b1a65ee00c6203a3e99837c394b5c5b04c4efa4ff407fefb0bb364cadebcff11fcc5f72aeb8f1d7419197c9c150c301bff557c003e1416f070b5c56ba75c2e50d287eba479efde8faeafc5a740a70e723123ec256ab8aab2ae6f4002cd26247f1a3262d61e49effb8ea03a6d7b5005bbc9fe7347e2bb624aab29fa18b8df86a6bc0f83494366f7c0a33405752fcdbd00af2f39ed0de5e5bf512b1e34cf52ffcb9f6677844e0f9fe7d3b54b47c5e7e048cbfe659f53fddc1987bcd2df7c4635f8ad7f660fa90a8f770869376ca366139c05b21fe61ccdee6134253ea02782d034cda17773ba1f6e78299aee6b3312000345959148d01bc49e42af8cff36cf7988e716d237eb18e5f31e8e9bccdcb34f8573ede04fd7b005d8989fe18412f5d8fae424a0e3a3bc9beecf8d64180510a82a770337839a545a171e4068b823bc9495aa14090049d2397424e171d618f2b1fb391fbc6b7fce6b64bcd94622d1ec555e222e34154723668a05d1eb8e7c2115ffa189978fefe8dfc65ab1a64b854cc55f34b94aaa0477cb3a5aa4fac999657a3e9888f17753685f46e011aeb9a5a58a9fc9ff7247e8950f8b0ba3c50dd78689c10465f2ac111792eb364186f69bbf4c26c746d5755b47db86001675e59e4be98fcf69c1b593bd21bd4589578acd62b4fd18d79abbc553d731214531d6567d42b0dfd9871a3f22b3c4f33149fba556692ba2faeaa28e82aa965777226a67e43e2d1e006b647f0df109298083d3896214b84ff6edb11e9cfdbd88f570283948830d7225961aba488293d0bf2e99e3505dad0515ca70de6977ac9d0842983471b958c58f2fc45799106ace3771d61ae6eb11ae9daa6734b1c16d7ff6c043c1278917fe875feac0c940970d2d751196ed67ec31d7b41f893b8208140714b046319b5105554e155ca0bc2173ec61d2bf2c7846760b111f46d06383468563672d58960ec24123cc93e52c10eabb5ea2fd6dc7286581e8efd1380ce8fcb6d8f1dc6422561d930798cd62376d59e19407b876fc99e6806218943b243f1ee498d5bd1de832fe92210072dd863fa7a72a8b5810bea2e151a721f5a0548e9355ce9b364a90a94d879a8cea1fc18ebe5549b64503b54a3e3dde925e3143df4551a0ccb1b5c2c4f2ba99c49ef08f628533180fe7178a99e58a30f436b499391b2236ef9524258ad5734731f41798c4e488c01ea714e597be80c4cde5f200a5fd0fb98c4a606103defacb5a555e85bbc39e686bebc16d4db269c3a8d3b31e29d35f512c38311f37f6964ec72a8bfe500abb397f1ce7cbc2a78b540a68bf9bd0855b2556c75e072f0391f801d967aa8aa1285be1a34ea7fe8630a07d0cdd209ffc4b5e925fb1c0f2ee31f08fccba3271712df519e6bea70a389ece8827d755a01e77236868f0f388a0bf5ff9694c3d0d60112fb04fff76eda41d07b42173e1dad4269d614ae447fa00826cc81ae47467571e322d45d8baafb1f77387627a6d5507a1f4046d55654ff5c44083464c7f863f9a26182f131c594972398b52b3a01a9d314fd9390bf48f69cb02b2544a0572fece33fa777643f253d8824859e82330801cd66917cd9dc243e1dbdeaea7ae347e027f5984cad882b66f7545e0df9d9f96aab33b6d6408f16b4cf38ebb2a24d3a57e35c0bed682125c803b0a4d61b770c9250bd8a499dc24c854714ae39d0c575d897bb48d64eaa82c52fb1f0a3619aaffd309c62532c16144437e9a8ec611c98d6c79bf593ab74f0e2fde0d7d266a5522fed28f57f761b2c65f4107246fd9301d7059688a21920cea5d0c5b10f9527a19ec91baa1b2611e37f2e3180d5e0c94f4da403788e123e9a825ac912a767b1fcce56cd06d296cad7d428b56b25c53fdfcf558b5bc4211ed31cfe63732678a4f23338b582225286881986247793056741c08c9698c0c05206ba3e4d692922a0f061d17da276e3d562b3b9075cba4bc003c5abbdc6106a68b3fe9cbf5b1bf01695dea38dfe6cc548064753c68117e2daa44345594a4fa9d3595e8c61df7b8b76410e315eec60715ec128c8ea6b18753791ddebf1bbbae912756e9fad5cc44f5080750d78f2fe627a41ec9afb91587d375ada022f910ea2b67683492a5982a635e2b79a54a893333b07174c729a34658a6ddc2a6b4097813ffb511b415c333a86d62a5a8a83db4e016f2d5fd7cc58b8815968b72d6101ff0f624c889aeb5276c3e951d0830b132d7e088337a3ce21f0bc9be45afe78ca66a559ca038f7d7ce59d7ad2aec6b4e74bf161dd866f061cb8aca3e36846de5d62a2307e2e9798fef154290127cdf7c4441be980ae821ac55ad21ffa61af28277d8684cd7c6ba46544887281de216a46805e2e01228562a851bd5e8df98fdcd511c2d53c4f44465c39bac5b9543982ca9b289df384f1743257deee02827172d2b9c7904f49e9f5205b5bb13c0caeb7ecff0bc7cc385ed5ffb7a75d1c8efc60ace035447aeea5177e240bb37e89c9900a269829ffdf15ee6d1bb71a2081795cd03f7c6043900e43b21e1b5af53e42a1ceac2e3302cbcf4406de7ea3b30c809dc9020d823de09e0058c42b06349c824396ea6e718990d37d697a7e8848829aca03d28918ce52dcb3fe90bb43b147011bef7bb973d8c0dae0e19a3746557630581d4b4fa2796932f5001e4ca1ffb0578154da9fa884ce4e151ba8295c6e79d9ce81b6f19dd386493a09c73f8f745afe2a5381918e123b9580841ed548f7e00fa3bdcfef89415c78097826348ab3b95d6d680b3fa3157b49c99778bb7a865b4a6e3dd0c9f3573e57d9d7a5ac22325e0dc10ec1ea75e31ff346e2405c9f9e4e02849e73f14a99be6121a4d006d474bb77cbb45032752f9bfa8ed10028f6a42ac09d4c13f61d6d5f1c776c3ff5100f4433f3f530983f3f71f8180022b13e4c941d0eb35b58ea6692e2519a4fc763469acac05ded9c22b7345468ec3285c4dbfc705f80949a1009ec6b36bb8a2e5ccf3194c73ae1aece1b4597f7f1ca0728f6d65316206a2a4cbbde1f9d5c796a5b1d8b2a5f28a750afd0384b4bad23b5e901b44db91f4699ef10ea680bd9883bec960a141eb3c922366a8ed6ea9b0a2273a118c8bed9b459859d93ecf8cf40f39fed50ba8c48a183f06ebbe34b37d7dd5739664c9dec2df99eb66d16faba3e21d377d1b60e73db066c4131c8f4000737125f3f41ecc33dea98ffc86e6806da5725ca2f6f3ba1d01a1886a3106b8022d01377165111fb4ebd02de585be751a0040548ac7e9a7f1b4f73a362521844b53909156df2b3f0eae17ad67f77ef1719a90097db4c814837071c3c020680aa38c231bea89f29409ce85f7cb04af5c3b1c6962c5e51a6b99de1609504964b3d280c4bd778cf0876cf423f459d3d81d402dd447a9836613fca5eef52ec89ce79fd87a5f4310ad7e01c7f88a588d819e4876d8a070b63574746e016fa1c6980fd43c4ee9973cb0e28ef00ca2125933461b9f7d5563a50ef6c8e15860f26be19137534643bb38811cdc166725cd60747d804fcb4fca797901c2a5faae6adefed791c66d55f72da892b3e212f9d2c9cfab412ecb74ed59fefd2863ef434f487747a93cc8089343adaedafc140869bdc93824e584ad136e2652c3c24005e9d0d54b495e6142d6a119d71b0b7538d964ec8df21cfee385e078685b6bf4de829f9f4a37d43fec0a7074743cb73d736ce5bf10727a42fc8cd67da8b80513b560dc5dac3c456aef75d744ef06aa75a06869ca2a6ea857e26e78bb78a139a671ccb098d8205aeb315fff13af418925a716179643ac4e457b73efbc41dfafb3fc0e43d638abbac99c120f681cb5ff5370be18aac4f61315b1e563086c3b0e453d6ebca233a50d0c17d530cc9e29b209e2a8938e13129fce6a0afb255f7aff611c34438131d5fdbd89ef8ac69d674a4ee71bb1cb9ac89b78902ce09d8467291181a702fd9a0430e2dca944de8135702b66619ae8c0e2af1c0a913af842c9355c54101e9dd7fa4e86f74b879cb25ccca648c0756dec2682c1c08130bc0067ca4b7db7c2e94e7f00aec21d7a8999a405ca73816ae3885ebd6f9a46ea73280a91e4e5e4146a685bee642566462c9cd4c39cd0eba3d1fb50072e802791a4217a313172df3ca78d55bfaf0870120d24b6b026474845bfadc509075a6b4dd8537f533a0def632926371b98538107b59a10726fc1de7b3506846b01105b459626e19f069f5eb17699c7ac25eee24dab64abb17f24f76bbc6e57d4258a3fa2660267bc9d0e724d1850ce1760c1db0b77ec4f165f5ad93ddb4d04ec7ab15f8bd04fdb530744746097b1130751b5b369a298c3481649cc1a1b0b545c086b02295d75030b4c27ab1179266022ffb0b490b3d2d1f0acdb1a2a03100fccd7a171a494dca78d75a1618948167b10729b24a832013fb62af609941bc4fde3f03cf523feec91818a99dcef8be92d7ab25f4cd8a88cd6419784e381eb90e54a5a22d4ce210e888d91f6666ccb063e08c8e274499cdd5e3afb6cee18fcda91a91d3d56ce87a8535c94a245288fd77661bb0ee423965b9f485e967382d50bc7a74273c54bb824bb949a84c14a5fc39d2e93cae38d1e6e6114c9eab9e6fe8c50eccfae676c3be888deac8424fbc3327a1658fdbaafbd7e6b4643500a6d00c4f421cfd5865a975e82e1d18ab462448cd6c21391b2b2faf38685d5b0ac3e621a7aee47d0683d57ec7046117ebba8693a79d9cc6d11be5e367a7986f2e883acf8acfa4187553c00fc1cb474487ff4bba22b0489791ffa70ad0fcb5efe066167c550eec4e2977f1cf54cd403d1496fc12db4eb549d268fb8c10c2365bc4e021ae82f71d9c9752f323fc94ec5ff60400343db3534c16ca5beda3b28a415088e4dcb112c87243674cb425bc9c3bb0e91094d698b32cd3a620b61628322ef7b2c88d5bec6d6db23756e65c9ed03ee99875cb1279454a9d8f126bc4adce734f005546efde8ced6845ba313dd638f7e4a4c83d9daf9a43e8e789755bbd9fccaaf4138fe973a78fda14df3b15dd36f556908062b4d612a72a420e7937d25689b0007bded5563db39c174e4a812e4a9593ee26e114775ed2e61109ddd5766338d2b7f69a4fd0cff702df80060c43f4774100341f28fddf55b0f71419d1245668a77d3c78957dced8b2e00cf413b8c508d29930a36ee404adff46a5b3a766908792e285c052d7cac730ab4d8b43e72cd8bcfb94e442c46f5a45824741c4b7b214196a9b2814593440e093da31f9799c5584b9d97861198fd9085c613ab5922baccf77b506368cabe4675c3b8eb0caa40dbe5686c6364de6a8dc279c14f6807d9019bc9be145ec92102946da081664d47fce4425643efbf4482566505703fd189c8c9b985fdef37752ab064e2476c29e0a39252dc8e78e494568ab16776a729cf09c8732c85e3bdc3a50fd006a7e8e716b835c186adc8f562f3a6866fc968b7b5ace1203b130102125df9d89408a02eee2316b6dc06a799b440f20ba6d14a22429a5ce83a1112af6a39b8a415d25ea772cc7d5a6702dd789425b56993f615137eb981f2b2e6de6bd321935d116ce8faa99cb1d5ae09313b098a39c7bfa1903172f297672bfa2ddf56fdd12b0e4006ce9b79fc4e39846c8a1b57c44eb0388425252ee86e2bb5c7b2fab5bb3596b582cb514ca4ed91d9560cd3749f25f025b9969f53ba303c7f748dc83299a43033239ad2fef2dc3d72b76a38ca127607cef72de94a56d5e5c0fb18c65ab39f6522b0e326752e40c5b5574c533f64667b9d06920afc0484afe025fafe16504fbbebf24d569ba044b20cfe582abcdf1fd6f8ad6c0a500c652047badc784fb9dcbcf4b1816957900d8bde7339c82ac9c99f49b563f22db5a1c25d82653beb376df0a6b427679045c6d8937f95326f6b8b5ff7e720c97d48601d8b443e4fd4102ade69c5e6593008952293ea1572750d8e9d6a094b97270dc9b737ca0ebcf08c3c0ea6aa66461e21a2ef457c608e22f7fae10ae38c65134c051acbda7e8a29f5cb08c32c503642d816ca13fc1f916070f6b43f3f893a294d3bcead3d36c26591fe552a134c31847419386434f98016c1aa9c71e3ed1e5157945947bbdd6c8eaafe7c41270140cc3fd2c3a1ea97652c333f2308985e1973b43845ff1b1b8e8b86f3057230186a027f6af230e7a047890cddd16c26843477aa4e1a3f279a32446d047924f538b80e7d094d7af3bd2f1794ab2d055509764582ff5e6ea5ff5fa1a9595ebe3f0a30d881d55de7d59624bd15d2bf3ced92e8c584729bf35ef51e8a811b3faad636dd49d3f9a9e057d22e63d57a0f77b5ca90e0f7d058381a2276e73c72a14f8263c447ba9bbacb3f1955f11dc9a61f7656787c25401ea4a02e6fa023850e150b39efbb80e416115615a25035ea0b9df8e1a88254eb749fbac2119d7e7d0d643862658e6bfb471b646c1c666503c657031126dbcdf8e2912e8665c7958127a4d2832ea6c408d55031c6cc1cf53d60b75f8efc6dd890f0e2c5217204afbae23da14753edd235461784ccb85b2cbf6024d3013222bcdb27fb473c403d1550c9986d53db4adfa824da2725ea0954b24e062912cee1c3000e427c7ed85b106a611bfe52cea43189f600e07a6a0fb33db3c42768da9133282e202c904144e630342f1cea34e5110145f178733e56918915c896ac5d1c557a0dfe1e1983e2dfcbc93d8ec316f4c7389814b7b770c538bdff793d856069711f35421bc2a71b4563a8ab1d867bb99b5577d364ef0843ef02f63fe69cea60cf3e2e56eb33b4d95e1f5ae291db6c1cd5806a9549c20cbafd808482579803e9b6007ea05613b2037428664bb269f005bce3fac32cd98611ab5e30aa5923b3ec708daf8a240aaa81cda6544d47d90f5c99a3aec3d6db7d3041c5821fb4e20351430c497a1cc2a33bb1c0ad4f1ad2d109b4eb0ffe0f71faff07dc034a307ffa0078a5d2da07e0a5186a9ef7bbf1fd3ff455e1a4dc9e43046544cc3a9195a2a1e25682d411ad0fb8033f69bdf895026006c4adf5c64df8a34d42bcb05daaf2fedd27c8d687d6f5e5e17749846ece883d2548788a22e239df9c47d5eb1738181cda31a261a44a3a339b5b65d6856337dc3a2b6aec5926adc13b9c3e752507bb00c2be36fcd0d087ab1933e63aa51eb9472eb3aaa2d4e1fd50128920d6f1df84b47b14ac2f733284534347f33936c5b386e7296134fadbd0950955a394e1881b3fef7b2d82f536d83501deb55aa021d09f4fd5b62b32dbcf96094aee395fc927a9043de17ebea52b593c4154254bfab59c4dfed20de6aba25df8ae2a4dd26c51faa4a1efaa364627c5dab9f722a0180d84c8eddc657d11f0f2c0ca7e56a237403bb6ee7f8ec6e37283c58cc6da05427e60aaebfdb85fd6615b47e613de36f39c74226dbbb3d442b49be302ead4e342b037da3e5d90f3c29ea2774a116cf8680fabd066c9a0ca2c96131e658b98a3de4d11402e2374a39c4fcf363d9f894f5d3feaa820d1dd0e69bff55dfbd0afabdffaf7c40578edd72e1ce86e08e5bba39bd43891e5fcf30ac1d949880ee2a0650c61ef4e098382f53eabf706f40c8d5deb779e76fb716924fc891586e4e9f3372f2a04c6846dbb6695a703e6473c84e313d0223cab59c7c6e1796341c50c318b0efd3b14bc5d2092fbb615f6499c2a9edb86cfcc3ddc96573a513aa0fb73e1c873809e20fa7c3ae13780341e445506f60d42aa0ef9215d3fcdb8a38bcd478b56245e34d285f190bc13ae68467e8ea0546fabbdea2751a4e56357a4ea82b0b79de93d0513a7e5aa8955e8b9564070811ecb6a0f490e93f4b3c3d648a563d5ee058cc61ac9a68011b1c6d53036d22330bee726a811f710d310b7dc94a5b8dfb7f6d3a07adecbe94c9d2e1ed4ce7cce359a8b88912c2af0cc64051192d0c9f59bd888732d385e49e3b4556bae06869a191c8137d180ef5a6418761f490fdd40211371e93cc1a7c75f5d0263c4c737ae63aa90dc70f78e762592d2abc14b3de8d10f57a8ae5fed8c4702ffae20f7d9339bae7f1f77784e6d963be160036a3214333401588bfc7ac0230a12f5ca80b2504a8f17a7edea79673f7b6ae3165602ecd0eb39a2dc7f94897cdd04e0c8480b2ef7b5201dda37558ba9bb37df02f5f5992f9ac52ea8d08412d8e39c1624392bf42a88622846462b025b610efad0315543d8ab6ea3f7d79281c284a440e63a5ccb6b70a4713aff42f4ddd7b8dc87f068115484fca9d17c05ffbf28e2051432e4db43d5b0a0bd4ae488b883fd2e2f1c782c2a8f37ea3fa727b35937200eb80b0c4b391f4c5cd80f57e673cfa498d19ccbbce232e70b48403ec617192402d9ac1c44d6b6414d9236e437962277c17358a9e805d7d3b7f52f935f8136b68a80fd5ceda002561cf3a7d3a3aae33c5220385cd81ae5c4944d5c6ea720f6a04eb4e6136f216c5571034b6c51367cbcf2dd242bb5a9c4824a58af16c67bc2a9f57d4f8bf1e15a04f3cb08f76ac254bf4ab4045da73adbd5821e11d5e31b009828e3200a9c67352d4b52c7bb15d6d30d02acc03bd5569485e4a868f126861a368eef41d9973b669621a071017bfb616dc1cd400d6884565917fd9eb3b846764bd0a89a400be553081cbeec11c3b866a82f206d1b874d8a1ac4259963c1e37e9f9517148620ed664ae4b3223316964a86f5ac2dac5b3896909229434968e398f9864295f5fddc06262287f9af9c1c75cfbb7a69090ccde3832a1082add6d02e224a3306d3cb3a9a627e435bcc7cd2504b28900a7bc194d9bb33e240d63331a7e38af25069b18d8cc79fee2fd3df4041c2e5f8f648a216e0ff56a7640da68f6b02ee8559ffd85f431d2e905d0cecefb1fb9aba17b8d8da61193b68d69a5771e2471df60bdd6837272cd232ccbfcc6609bfeedc53158b68c2cf892d7ec56f5f747cc04d4d4a889ea0bb34da6634a62dafd6896894a5e2496deae8fc44d616e189677e900690601b1694fb9312b3a3cd0d081465c1b20604c83202df1014738089d200c9 -MD = 033a5e38a60f821bfc35c8ef32c48453e4dc3fd7988bebd807f1d579df4360d488d097eac9b086ff1099a447a2ded1c2 - -Len = 60424 -Msg = 5555fd795e956fd479ff3c8751e38af05c2f9c180ed9a3394d7dd67d2448c409bb14e93a87d4802ebe3399870e786b6b8eadebcff5009ef60a69ab345b8d34f832e3e60ac515cf10ada9705799e014d044de6059a40c2a3e65bb8f00950a3f55a1091c6f801e04812ea8ea805ce32c27660c203d85c5f01a46baa9683a858e27efcfb2f320b8c68a29792f89bd485c76db7d5603fef2989195af22f4b2c7c976067dd11e0dabbd32866566fa26d94bc78d792834795dcaac3ae2212c6698974acd5ba077afbf92812db2b85cfe5ca121634abe575dcc2d721d9bcf99bcbfa0ac2cb048866fbced7f06a84c35ad9a088d453741f4120869eb262253c21d068da30bc6f0d3b3697535fa914b109b5b26111b87d99400d9271f3ebed62ff233063852e3c1e7e48fd3aaefb3dc723067a3b8cd83adbe8f060f174bb98069a10fb272e950e3496bf6afe6ce5828e5d48528874473e6fa2759c8da365978f794623a59b9557d81ae66aff280c656f0ef7f5d88669fabd03098fb70e8e7e76131f445f5a839b71817a77ed5ec458f1ce91be9c21c4e25c9128c4fe248aaf430e28c7c4f9f46ba950d80c297f91ffbef2a22753d4fc97c6c35fd6d373decc8eb0ef4876e87c2ae80f7bb2441919ac1f31a5ba802e559d74101b3fc77b1f38a1a1cf20d5a46f6bb623f1e4bda9b000ab021902b18c8445ed1df75a5aa8b096346764fb61cc62a07c14c72e06afe97fdada887a587ded23ba3350c10d9b3747bf683d22cbbeda6bd28867e8afaa4a8c3721509bf58114d93406c41e40c107cf9b2ab45143fa5b1031c550cf290747a8387d2de219247fb912eeddac9498c6b0602566e19b1d594012721e2bf375657667545ce723d6a265af71f9f699a0e87c96fec17e1186598e1d052c99af4328594c3d8a15a6261141922695a69067f1a6b80d506147c3c02c89f50892bd1f04d34f9f21e8307140df43835d17495c56a13be7a045be5441de01d84ea19d579f76e9ffa0f92376b5b13c0eacd3050c9c0eaaf41d85e5c643051d154b40d08b3cb6c3e5a3a32f74e459f42ef16453e736318dd934cc4e88482434429aeae738711535d79670951a512c047ae745c68ac9dc4d0d92635928c5cddfc6ca2a51ddd104e85bf60bf4c580b9d568eaf1dd45ab4160e792f5b61650647838356990f9e11823d94ecfdf04f785ff7f78e2f8c66f13721dd2fdb5df5c8aa61d892334fb05c1a0d60d26b4673a12db251db3b98b99c4f916bee608e25ea2e1cd1201be7fd393c7d8bdbb055aacd3010055ce8fe3afd85e48d3390fddeb3fa3ed8c7f8de6cf011167dcf7426dd45909879dadfc8d05b02a4aac713b1066d374f544e723de4c8c05f9f7661bff55274d3161cc7fe6500ee58297392b2865e0cd5ad7e320b4f0a71e157971d2ad83a044744ec49a6e032708974fdb50947cea25a4a1fe05094ff4e220efc506f70456a7e6c100dca283ab0bef22d23bd3007206595f924159bec7cac2d6ba394a3bdcb00f451ba712760d77f0bcd85d62850af7ff5d3a4614c1c26071aadbda35be852534677f8a4c4eb0d5527a3825d19f0772ed2760b3c8fd672b93f8a48a37f102401c84a716ae72579c6ae79c359ea309ffd95abffae4c61884c03c9e99df77b6c92e492cacb7854445c0815efd283585071a43828c06b069148cd344a98ab71508c0116aecf60c1959f9e3fafd0ccb0b11468e53079d40db5330791139c833cf879869fc37f85b49516d6c1ab5cad7feb6d497cbce26fbe1b9718a9ecb267238de0ddf5b1e2d0746c4919628a7d0e0f2504b0c377012560ecfb68447be03f6d374a6de02100294b41c0d0e9f53cd7a68862038406e0dc3d4fe85f2a6b30f3631d3e9e28bbe2797f3c04611f939ff08d3c0eab8514877d9b6de5652262aa6b4d6844d894268fa659879c36cc0db1410c6890118f47fcf1c36e7ae2f508558f733fe483ed0b0f9a214710b5b80a77b26a34719c6947491efd792f3e6b0739481ccba707fb116b3b1fa7e948aa33fb2cf1c938b3ddbd76ee91b68de14c045e7c913414cd86e1aa739bcdae566b304495e74f6dc0b1518948c64e1b3360aacd141ba1b43b5622d429dce1e747c4a85ad795ed992aaeaa8c13e569619d6f9e8df9003a0dba327df2452b0c1c827a4346d843cc43599c718639362ee885408ba6118829a9b3e49a0baed075d67158aa0f823914f3b5434d80a101c637549c172146fd93108c3220274e13469c7b2585bdbbbeec31a66ae781338e59d7734bea057fa5a3c8afe5b84e0c3ba4f708a87b596d1b7c8694dbe691d7240e4e4815ad5aa4ca7e5b82c50989d092b96e80aa35e97f99ed79e75cf3b8750d0d263dc208289cb24f516f99bcdf825ead894cf35b78d97e679307b6b6fff58f7fe6b919a27851a53c30dc2b78590be8a8d0d24b940b6312115a5cb1d66d3ff38c1724e32451aaed6d823341e6fe5178d1cc7b7a88ac059f14584f14fc0b3c815b40e5e835bc8fd10bcedba4add63d565004af47e062a76b981546a9cfe0d28015e966f07ec0e8983e9d3c1c76e9b7c94e00d77c443631bfc418aa36f8f4ea3ae19b0ec3a7659d8b2d76be70e940a81af34959df5b2e8be3c0e9e4841e4f6df5e8dc452857b397f201e1c96aade2f69266669f39ce559d1fb5105a5beafa41fa513773e936b3bc15e166c5d06bd78b77d0df0f5144b050bbcb15768204fc5091453100cced6cf53bf68e1a6bca284d11583d13f166498afe29819fc3135d8001ec54559a24e62bad68e0300373dc26aa270712dfdc273432f8dc3ce4bf25bb946d27d81a822a44b45ee570600dfbfd8864c574e44d52379d5facb7aeb25de890f132f216b03f2a9600234049418eb9f43800a0c862d37987877b77e9910def3e9ffe0b54562dc39b77240987b79b4436cb3e0053c2b1e43a97d0e45d073bb8e6a0128c9e1bfdf90deb7034e3162d8596440afb4d15f45ffdb83466d1baf12ad01bf6dbbaa7b6b232838d27220749645ccbe9f97d05a5d117122e650f52362f4339336270a360d85468054c0f31f9c9cf8a6562ac38ca24d1cc4649dd7813ae892250888ab70452b9c2600a713d449c38a6059fa2566e3f730f047a04d48e90e8fdd5b4ce8aa908a9b824c80fd233c5df4a51162708960a4502f1614c0db2bba9f24b5006c557e26e72dbf0b299cc2d0c9cd23003f64c6d8ece94647ccb8418132b39c3f80f16c84f190ce9223919ba07c40f55fdc79750989a75ec5eb80e8f70cd27756d11efa293d5401b275b225517eb91eedf23809ba98f1d62b87a570906039dce2c73e95883cdfeee89a7eee78639de616fb40d360ad5132c53b9676c1ff32436ffdc0dd2672aceca0fc485569ad58018761f48090393dfb4f71e47a201c54315acf462f987133817835bef8c9ce8ff79bb0f39fddbf10a606b50fe91f4a283d3fc64f0b32ab1c53dab13346fd399e1ee082ae7f8dc181b9a79f8942342b26bd8b7d4bfe9992cfca44f955de98911b0de23185ae34c309ac9e7be123e311c838ca5ebd8841dab66b4398972e10477f3b1d5829aa7746010547e497fcc0b0953588d52426afc5689d63095793e8ef433cee610b02a9cd104a50642e3b416a064a239b105857e56ef70fb647cea6db0f79f1e69a3560cabfe23475046de9b0a3dd36faf2abbedd320ec639c82cce9d2c78b45367b120b158636091cb132e16e6654f8f4b7f68ff4a3b030e694cc4c832bfa221e4045e2372546134e2b9832f5688c9c29b71daee2ff262ae9b9d2dceaac547ecafbd9da3a62bb2e8dbdf8d4c6cae222f62f1890c5bfb4184ef9c6e330d10221e1b4b53946c6fe22816e3a100b14c0540229cf7dc468c4c4bc5c90a77c236ad30c71c14782d875b7d346462ee9cf8df8f6ac2abf0784bdf4dceb1971f729f55cf33ce54e172089b42b4d04768a82b0d779c1119db79a077156ad4788c86b0b833d1c09942d26a2e3308c5d3016b593b9346f6c5efc330a03d1ab033619711511931a1562ea73290a8b0a37a3b4f09d66cebe234bfdd62d71f5eb36c10fc479cf9c3cf100798e84f2e4cf7c188dbc36a5f0b61eace30bdb856b77c672d4eba182018c86b600ff1d63e1e412d7c9a0c63f426045c9d55b7905db579d91906ef3f56912bacca84f5b252d50e3288f25b5fd6bc381e9fc4c70baec91a1666ad6d9ef7dd576899805a5ff6e1bd55307d16ca514e7b8558068286c472fbc388ba9ba37e5dda337f9a965ba4d4ed29f5b2f51ffe4d5d356883709e39438d5511b72fe964832271cf2c3021e71f0c156b0c4cdd58494bb323c407ce67ab5d3f741b60cd44eddec80acdce4f3830989be311a49ed9b2c5631c50be73fa1ada07325ff4eb9a0e5d8ad4e7b73012aa2141f03b82b10d2a68e9d4b20b3b4b228230df0d42b0ce652d5ea012917100fc149c35126dc06d1094abcf508490e552f440ccabe0b97c72cca7eed6d38e7d97110f141edc5973f5d72d8ec4a0f1431c8ebbada445620ec7c9eb239cf3e4f31b751f0fb944d8bc5abed37586e6f90effe005d49ee7570fd4a3bce0ed79110bf9df409a8a3dba90afaa52160fcd04836d66b3e3e44ce4fa19c881a930e99f22a2ae28470a2d9bab75281e02c7d9a06af5a14a5e2cfca85807c6dddf1fbbebd1b6601a97a1aae8673bb69bbe57934900291e4d95d16d1d943f1d2614f276938395a3abfef93c2d5e73e45f9b37608aed683c124d6a14c1492039fecd618002c2d0d7610f6937d6fbae2fde3bdfe7d2ad33994cc75f9a1fe14bbbcc7ad58ed619e879be2b8a4471c95b07ac12c98fbcba2ba461a64a53a5f7220123afe6f969f35d1927e5d4d88a320aea2db27cdea58eb0ebd56c82d7dff543b878ceee365ae9af2442c0c17a8cd02e65e78d723b39a553ee3c8cc1ad4a660120407a73ec05574f29834ed880f62e46097e16424bc5989519fb895f3a61b41b072f15107115d6bda75dd292a252a6d23335ff5586e5c2f4fd86d4e405b279d1ab79313c7bf8f28b1c570e88553ec46371c38b246316dee4178301d8a5b921d5abd35160532b1537f6f35511fff7216a438b4c4766e526e2e66492a570d2468766a1f8249d28b944d5b748d8293828672711d53708bd4581e8a009e32dba42779a8987e1c07e791227175c33675e53eaaadb986bdf2bb5419cc9ca1a02cdc01685ee93204398bf506997f1cc10f63e554d6d286e409cf092814675a2b69929f4d745bc78bd0406601bbdcc0adc7c32376d3ae7b6d3ad820524aa7f25af88fa82fd134653934ce8c1cbfd2d68207cfa21a8c958ce1ec9d40a056a591b5429bc5175fbc3395cdfd115e8daa87c6364d0747e9d1e1c686e7121820a95dc5af7d9e0c053d5a2704959ad00dacfa03bb06fd06d2a9a3a7727e3ec591fb8111a8ffda16abfd02773f5dd278281f58c000c22a5e2f64fa09172a6bac8fe2232293e7213d3945510ee71e5e60c44dc8866c483657e84b0d76ddb341d703a86c7ed9fe1d8a985d727365a0e990ca7c73dc6762caf9e5a605752ce06a4dd69383afe30c7404ae8d8b2e1fab190e23f5804a59d68e4d0fbd098f6c7a8b16eeec903d18d9ceb4641dc5c87f0796e4b5001858aa6d295a4cd7424a05494f3b35fabdaedf2cd4a0a35447c8ec7b091a6ae4638fc3ef4428853dd83160155bc39207308ca2cf2dd2517c3ab6ced11ab629eb88760a2486c0a338f2c9e3a65ab6ec59115ec888825257dbc51b8ccf70c2d95bb096e8d498298c0eb89cf7c4f21c2d3989adb9207b269eb9117d903eb445647d0275c6c6216b2a0753310536cbfe3cefc000dc5fbf580d60456741e58d48b199a79d0ac3ca8f636deb1073c58e6301c3dddf9b0cf7f08b178a5e078ea4d2a8f7c6961e933b9c2186a7c2aa39e35464fd08d25df1caf4022508ec4affa0eb31de88e668fe1b9a4b9cb0ce135a71d84de46b628bd4e16e59d3e69872012b9b3498151752cc1292c9f52ebc15efe1f7a4c12b168b7ee36578694deae75ceaeb996b94b142c4ca8b83d9481517c2dab951dc7377c6b779e2472f646b12d887e248a02d3aa2afe88d6092265f839905273c7d690ca4464becad6c54a2593daa892a7e0a3cd95517a04b67f125c03d0a484eec355d8ef5008b956a44182552fae6254f503e4f7efdcd299fd1ec367690256d7000f2ea8a41c7e46f5d53dfe0200422592ac96cf2421be383ed3e4d0b3fc48253f25421ceb5a983c4c6ddedafc3e80ae6be6498788f93615b6ea26dc6c12f76db320a9c8905385ab1a83eb9878c9cc33c34973bda8c3b8b6f7ba1fe6dbb6e2f51e99cc283d87d517d2bfca930232737a3b5eabddee01d49063dc268c9d88797fd3e93fa83d77e517276a127712f914c6569e6864d33418469dc8d13a2bd8495265a75ae53aa4540d6b2b59a1459e2ecc97712feee2fad22e17f8a68c0156c101564cd45b9f8da08f206be6adf4823fe1607f68e8b7a6b0db44e42cdea8648f2138520277e69438f0e9b46fe9ba45c6a95431b9ceabc832b2a723cabeab81f2266e5f8bb6aa68abf7299d4c0101793188e510892d49efb668d13006b8655f98856abdc6b4457b77e6527f1170547d2f0485945d611c7dda5235817738702df0c2d00559fd624d0b6306d236b43dc20d90d845bd269e131d0366a082db469d796310beabde6b3df4e1c94f525937f86be23f9d1eca491fdce0c715bffd732ec0eacf5232e3dafeb2e6fc4ecabbbd80a84d3e12f8e89814b89ed949953b605235ce4e5885aa3befd3e71249266838eb7146564fe1fe25922e823fb49901b8886682204a2a9df881c666cdd6ebeb54a925621a9c50775c08bd3f5cff31ecc661c1aad79f884bbb6508ea616081c17b3a5324fd90cad0b5f8c32aa381f659145ed5bcf6d1251fdf0a19e68f8e9e67372f791361b5c7b6bde30ed8b5d56cd34ce0211ce0879796edd187efaab98868f2e90591f983bd85fe47cede0671fbe7ba86226f371b465d626bc16a4569d62339079745278342cad197a18f17d03a0307b158086d14b7cfd73964eae2281e4293fb9c817e2cce01e27315705c889db19f12409cf4fc725aa6bac0f5f36cb7238e4583fb6fe8d5a7ab3a993657039d7ffb096a71514afcaa7b6083f01bb037627275fc076f5fe038968ebb25a9c9bfca9607344a2488bd2bafdb2c8dad8b257bfafd532a1efa74312ebfe9e2a7438b3e1aac4c7bc11e4a5ace8b09033b65f7dc825c27f7d131183dfe7ea3d1d2197626d369018ac9a40ab441e0c81537c92500a302e8e538ac329b602b8797dcb407316abdf1fba092a4c4c48ce828453d3384c7922476a7c459f60e46f389099bc4ca4b1b9c42d8727f08a0dfc7a0c63ab9d58a8a5920c10204ba5361764a0b49257dff227ef4f3bc1ffc816a05334d3a1e7f464c0577f6edb974ca0b9e4f3444afa8f133088664e7fe1cc0ac1f444cc3e7ee9557a7e0cbffeea1fc95ba0d1706d9f7bbfdd77bbe7e9fe5e926845847508cafe24dbeffb2b12abe45a0880846082ad6c9c35a4962f88be48569c2e3bf78934fd79eb9394d99e4464fac56c533d118c2a5240f73e4ee38a51fd6597b3794922acfbb3501ff22a1c67529c4c852fa2a37d8a0659fd6b83c84030cb683224cffdd5533a0fe39d3e9bb50a9408635dbe5c2dec90b019aeeee2de96d789011fa32e3e2988b92903632915c9b58835f0ec1e011fe5e6db40ae3ef3d890e268934d1bb024a634394b202e503708b5430fb552c2cc0de18b494b46479dff5caea8552ef2ec9b6a5b9efe122efd9475d4e3a05e389a118b71f04b60a18e2add1d8544cece2a6f41d724843d77c362b1319435ab2b32f8cad55e38f6ca521b4efb53a2620a862ba3f4043a18f3307852a349fca1633bca88febb996f8b92da989139f5546fa7d677fb67a8096aede03e702a7ea8a75e8fac352ef733aaf66da12760c70bc53678a534745779a3a2a25fe0604229c143501ec2dfd9aaef25de5305f09fefd4da1a14e754ced167f6c49b3d13d08a779115c6edf7c73c24c8359572100668633cc2ae5c2e95777e9150dccd6ab13592f0e48cfe9e49510f86784eb8e883de3c037b5adb2b35d5b01c4d09da8e6c90da0ac7583cfbe8517a08b1681da19eb925d84a00ab733551c53fc40aaaa789051684c512f0372ba42bf6e7caea63df61e7633989152d1d5584a1bcc785dc91fb1009e6a262799bb2eaf7235c6655cf3f4a4b4fdb61827648b6eb3d27b5550bda8e3f33f0daeabee381b36c06dba0f5b9153994dfd799c69223c45015813b7f0959ceb3e4a0b21fa0b6d3cab08f6bd93812d4117dbe9b989b93d5fb7630b675f2395f6f67fbf8434f53ff4542cbdf042507c5cd9e60af71cacec648330bed76fcf59a6d5f35e4b45a1edee6a4d724fde6bdb3d02803fedb899b3e3f345a09098f5726b7b694a0f927e019b4bffb614ce5fc472305f0af5d40c4e5e7616531b71325ac555261519a206057b7797fbf7a888b29cd1b6feb80550f6448a2738e07f028d34d1de3221fab6841f8bbaa650e393400d654c7daca3145636ae0cd48818f2844a9fd64391132be7f7e6ec67b905fbd74479642a3c53c2e895601bc86ad56eda671dc2abef81c2bb85278192b8961ef2f27cb266ff9de917f13ef867014ae3ea2aba17eda5ad177947ac3ec9b80a992d67edabc65ed8037eda990732f3d00e4e06134a8b4c1b96abd003586f3fd9e6e1455ab4cae2988e97921cecdebb0b2a8079a7df076b43cccd8ebb8315c88a84a8eb3261e7135606dce8290dacbf62e50bf5f639e45bcc26490443333feaa2ff0efa03379d79a6e8b92d4bde4f896daa4b2b7d1f94c60b3fb8a128dd500ea9b26dd24baa708df1c0d6e1f3f319a18206e86aaac4ab0287759715db05f8ad155b50048a3ee2b8cd1b9096cfd09d8056774e340ddd99c9c7646eb2e8319c6e6c3650213d6976829f4590cc2dfb6dae4167f72824cee3645188aa08cee4adab14efd888e3be9e83fefb31e2acd7fc93d9757da77e1d1a6aac6ec3a7fd93ceeba5e473dbfbb2ed3552990e8abafabcd9951c4c42785c91553e6365e0f2c352b8a5c09c6b03cac51f40ab7114d6d830d7eac8ed89b1e20abc9e22eb645cf7eb8a8ae0cce69a7ad88a3faf24218f04fb277107cbdda951c8f93209dea28ab5fbe9cbe18fbf0e577a3ea610723151e57e309e5581cecd306ea390a4aa2c0a61f65eff3f5f54fdd52c851a7bf5b4be0e2c9be93e89cdabf26e34406ff8516a908d428b46a658e7688206134e293c31f398b1d82f5e6ab40c3a33b7e823b319d6034cf6b40f3b39a60d2a171387283c1a553ae1b46a167402651a6d99c6d1a6870ac6c7f3f46c83021069ac488a195af6c46fac4a57617a698160e7f15c3d7f4806588582f07d41f14e6d2969cc700d2d68e88e6d80dc25a5f1af9d8b5e47227d887aa5ed8dde0518197d3503a8dcd112d53e0eaa80d7043c384f24c4479f2ebbf395bf90271f3adb04425582b9b0353b7bc8b36dd1f294b0e7c7e43892960277fa32291746b151be8134e183798aa82bef210343feaf659862c27254d9dc3c35eee878ef7724e83722cd8f6252dcb85881df74b9517de5675ba745a587c23a6a5421258532ea7cd96b84b5cbf016d445d63c9e2a94dea28214eed4a726f89ba9bc64c57504827e29cdf2db1cbbd98a787ef0d63413521b8d3111b5d631efbe68aa3bcf3b568d7a8ccc8085d120854964de74b3526768beed22a85fcf2308412b800eb954c35bd086e9c63c85c8baaf9f6740cc020b930b268c2b48de94e29266e065fa3db58e3eac982c75a71eda1b8cbbdd66cf7a619eddb012e7a0e1ff40bf4dda2872b78513726a3bb7b18d742bb14eb34a172e44d85740e7d292a4ceca792ac3ca7043e0ed5cd27c7931bf194ea1925abc75a1cd4647b122804047c19e3909bb36d2e5222ae0635730a40e29f2e2194c54677f5b7703834b871665884a835d49140705b95a919f5484850536b6d755f09869118fd93f29db4da168734dccb7c5d8793026fad4d90cdb512eb01915eb0fff0702caeb4f374a4a6ddb2316898bea0ac60eeb9a4ec2e8bb95053688022ac30eadbdad3bb81e2113d83818435e5c0e1169cc77b753cf608bdd032a824097d23dd9cca728fe50f8207d09b342af9aaa82d1237bb088611ce275b31ca635d4b603279a3961a67227f6c8ca9492e1ea57e5989e4834511a76561b9f8d427643d704f3b0e44434e4490d47e52cc2b9ad9e902c876da1427df53d1b22ed157687cda9eaab286f2e49c3ea76f3fc408b66d73909896c95d0ee122e10e7bc6dbaf2f26858d38630f6f53104d271839adba89a46bc1ec56080fd659f89489bd9b817fdd6ead47e48338908f2e6e843402ee5703fb0b1f8cfd72e6817d0dfdbd7e289486c0d3880f34877c41b20c2bbbee99fc18a93ed870247f3821da4282cf6eeb95a9e3c5a2ee0ba43fb042c8b6d95c05a36bdb21be0c657ef5c176f8befa5311abcf3f4c3e89f0d60064446bcd9331787285fa7d7a67a9b644eab9fa594613e3fd7f3c2f04e6cc66e7e422bd17f3563b91ed6f1ab389d6704e220b0ffcbb97a9b44142389b0f859c1db842863d00b396292ba1c0127bd6f43af4d4fe4f62c7abf79db92dac0c05c0ca680e8ee6c230 -MD = e9bdfb8b069dddf2bb86059553f9b337e869aa0162ee8885cbe999dafe2185bb411aa8c06cc524e4f3b08dad667c6904 - -Len = 61216 -Msg = 8246bf7b81b287411777df7ecb53a1795e54b150ff3dd584be2bc7b8437889b6c0e0f9b324e2a5d49269e0f111ac169885535c55dedb4b308f3b0f7841c8bbbfc956df2658a05ddbf2ea78df22e42e0debd2c85801eaaf543afd81f83f5a64a287f09b5b86b2575c2140cfd266c392df7a181ce1d232a8f6a6b946c0a3f72d65e1f552da14e13a6206b30c514511ea16186f8178b87adf20bdb78558d767be12beaf2f2c6cf5aef2898d58e52795ddbbaf1d1fa61b8cfcd9663e67494172beb0086457d8f4b65d169214da14741814d4266b1df2632ea62a899814194be0d648a65df56616ececd50992bb699462376c65a1a4e5f92985190f0bb3535c78ade180e22f5f395e0638d64d2269ef3bed885407db05434442b1dee06d7cdb03ec837e3a2d4ac4d55145e28e389eed6bde32dbe5ebddaa4985f7df5f691e324a3a3688af18af21197506139c248ff7b9b371e282fbf297fef5f5facfd0c0c812400386871816b7f21b8352c10fc473ee144e512734ce702d3bb2187ac9eb0526a5f1600b5408ee28ebc3884321c6cbd2a8cf101cbef89e9cff361fa67d26514d1209fe83f50c2e828cce9b6b811c652d18ff07a9c0f88a14e88af99c13f9144e2f52483722abdfc9a7ac7581584eabc70be31f1662579b5c9eb58ca4b4ecb6f2a3d4276e046c69c5e366fccdcde503682a853eaace9c383ecabfc20588889f0117978172c3d7353ee9021a960968d7d71dec4dae294fcb8014b18109b654384332a440898674a9fc608bb626345f8edd8b20356a9ef8bbeb2392b3f667d9e77f9d024afc75cc2ec6f106b7c3755290421d2adc2652207047a06a3f15c29d157fffb98913ba662d66447d07b6f4ca45ce7a112c2a704e525c32410daef02a2b0901d2e3157aca0ca200f78d47da4f15484add0cbd1e0bc9f18220050918088fe64b54424ce0813543cd7d31bd4f67687a3796632984de3dd0370e0f6d63bdabde84478dfe11120e115516db627a9ca62ae7451bb4cc4f16bffa141324f9d3e6b854b3ac74380501d33dca737c8475372102f21ba71be6bc877339f97401d2a73e65a186f67be3745330a1e154947a832731a34b4a9c2c97f04985a9a6a34058365c1805cb0233d157d4a40d32d334f3041c6293e474a80fc125000b0109a76069e421103df67d7fa8d1dae05d692aed7f6a36dbbfcee38dc4aeb308cf588e279fa3c38f927f4ae60ed04c401f7de4da61c3280b21d06377bf8da58656bb7e159f41066b13c4206e50790016be37eb2372d13e0b53a2b2377b69de6ee058fe923367f28a08ee8a7f3873004b83c0c62e7a3982c39d6d5833c0eb67a9b357960621bd90d5b9240d818c6754c5b640fd6541a6fc1c4659dbd555bb471e17e1ced932eae7346d8f33dc15fc026e9fde192f8ebeb3fc988dc584048086b4561e2f732e97ff906e5783f89bdb142d86c3a1f32b29af4dd9329da793e22d55b735403cdd6be1cf02a3853ee6ab91e9b2171d1bde90f8f5526feca8cb8b43e8814e899d070f94db729bc214bd15828c6c01160e709b97de4b6d39ee7420d054fd9393fc732a209a0669c1e3e9c1eefdfca91334a9f193ee0b530ce1564cdd83732ae5c2ea658ef605320a143356dd24aa389cf5503bf40fdc4aede938b5705c2a3b08583468e5d6b921260d607d58e9bed639b92f20c228047a656ee40394c76cef822419da2d21685b9c383bdd65347faa73e80c490620cc0afbd820df4eac7f6ddd9061636fc15b0bf4fc8b1f0fed36ddd1eab05dc8e17c23388fb5f1a8f3acdea003d3acb29dda57b7c017ea5bfc2b96dc27e3050e525ceca3fb6be0a9853b6a54e5385dfe9d2c676ceea8e75349a6fe1a086ce9e25bb48ec485095459487438809d581e5ba99b649bed06bdfebdef3d15f315b04be4cb30239359f7c1259f71ac95fb95d2a96d76cd25f915643e4d7a5551a40352d5eafb498f216ee804033c6134e96d6a85ebc488fe49978eb50ade608be289fd165917bddf2a64d7cee9c225e2e94c2c255d7757e0bdea830b6c90c00797eb569060ab07ed3c7f9469992b8307c5db1e720bb6bf331fb74b26bcb8fd2f8bd0652947dfb01f1f6729bf5b9e000b43c14a523caa4a5f35a5eff041809d6a85e131ca55dc3fdf9ac59db7774326572ca6b8ae3a7b7fccc85d7650450e2a1f4fc6c25cd3ca3c947641f93834437c5147346f6f4b50e6e29f86e82d0e8a2cb8af2620c509d12fa57b82442cdcc68a625e11777bb851080a84c94e71e51d299c6ea954ef3f17a17c7131867ab5f3d9f237e5d8bcc9a86caa3dceaf0312efab3354f865c0bdc71a8020f5c80a08f3f06a9c599a19c57a9b2c933c13cbdd2739e528bb5b22ca072019507711c41cee57305314c679f6f21bf64ebc82b18eed5c1ab4993efcb0ff3dafc85f69903b0b97ae24bf64c6a235767236f5059d6c6b9a3abe3b1735b5d9f8aa5154d856ab72374bd9027ae7126e33061290a377c0c67ead0f49edb722bad973b3fe67feb54cbf6e388412c48ec3db1cac346527d2298ddb6f6ac9693fcc6970b6061d70a1c1b8810bee33455d5cf51bca8a5195eaba512da546b23353372f0a21140394b7f8a9eb18e7e652c962096b353972aa50a151097b86b0fda823b4a9becf1f523f1a1a14281832d318fda074b5eacd4c4b0715d8b7d2cbaf84b77eb653e07b93804e936402291fb09354419d12456c642514260322d10c32301b1797a9ee1f3dc3bd9d4370c1b5d18290745013f156db24ef0bf0842c7a6cf47807b688a2113a508ebf193888fd1e2dd8c1f58197939791c14c09a58b1e4617f6d47ab8a45b706fea824e2328fe80db55b1f224de2c82b4b172b54c94fea8e3bc084a009b05c968f96d4af946c0ddd62fcbb0c46f2883d4e8045b43f2247b9ef32a902930152c82e20875828d4c1f648d979729f18f813a8d8a65504b98a591c2c3b3fc0a958006cedb3885a2a92cce979e101a0d69662fc98c3a3c48601004525a1b3ed28caf3ce46ff9cc30dfee5c776781616bbf19f9c49342ce9086a23eca7730ba2f03a06c4d4b211dddf74b55527b53c4b29882e0a526e5d0cc12458953a35937ca013bde30f7194151f82d035360ef0c8bfd892e95ce8b08a30ae02b1564017c4a8e68dab6fc480035ea7bac9fa0bb019df51629bb129c40be785b6d37458d5258b20fa707e1152131d61d9961c3216a9188111b407a803ec4639e97e2cb66819c76188e4a2eea6eecc3fa12bf4f88100ebe624a4b8e9fcb5ed490f13d80f4d1bde16bd7a86c2ead0fb9fc5ee1ce58bcbda0f1ff05d762ae34d21bc371eb9f0a64fcf1ca482248a741c00ac7f0c7f8344535a68195dc2fb1ed652654a594d0f338ce90ae53d8a2242be10c9314c3d24050866a1a24256f9a31959aed0204ed55e25f31cdf016a3ec7523eb0b74494daa83992310da3b8b32aa6b5dd6b0c260f809b7bd6d4865b3c6c68f8d7739e1d1398878bbacdea5e941feee5857d6568fa456df1ad7824c3a7bc62bdb1f8a13c6b4072b183659ebf38fd52773b89c49e42170de3253c754a0d41e01bd4a906895e4a7b824f6729610e3d81c97402b22c53601bceb283f034e9676191c427367a4911129c533522da706aed7aa38ab699cadae812fa011e4aa8c7579de4d5a995c82ed86e537203822c1006095e844a7d04c2136e501667c1d7dc42bedb46d842581e2d56b480540e8da76bd41981c62c9dc02e3f594655510300b372fbfd6b2685498203faf29cc6119b7f895905e25ef24f88e46a137f6e96ef1a38eb5baab8bc4b86e49b4b364f5486c1978173075aaeeac41c27003e712ff1e79f1e044f5f899eac8719ecc900c2d3c26d477badc6200c6035048f2b1f1ab3bc13f86991a159bd5359fb79bd90e92d02990f625e17f23edddd8732cdbf03af08162f0e4a24c9222bdbb4549c6633dcf2994dd990d691fc9d54337d8ed7573e4c341664b1304457868ad91fde073f6e22fc8743de688bc03f677dd1e6fea1fc08ec42ff6f7a47d803f5de3e0ada787b14214023af645c243455dac27eab6062bebd3950ed59602e249b3831ab765b7e36a60d1b8c506f830ccddee1be641f0cee056debb36419c458e98b8d286164d21af9427ded934277392e0e922e9f3a55078355324a10d135117f2cb30a02312121a984dd4bc3817b49f4ce7627d34ec5bb8583c729e622eafebab045d8ff2ce5fb2548bc3f678909afc0b2e06296c8f94aaa8e1ccb5a8b60712a9ab81dbed48af80b028d30d5e5acdb0030634760354a5550b895b6f47740095d608c30a7b4aab8a956e2b8b513cf6c31eb914ea610436c16a7e4753a72d437b18634ca6039afbdae9a3f4f8b800bd3e428ed00fee67eef7ae06b7ea31ac78cc59034437ef014678961055dafd6cc92859cc8d6d134476febd6ad3ba4bb846918031d243a647346a82fd77bb8749c3894abc768a366475de81f2c54d5e1855d175351e5490346eba97b18122be5e5269fda6b0f0c19094a0e1e5b22bd3954e94205751f115909c70bb769c980a751fd15ad266271a8e7b4bc48dc5da10f7d9e269df93a39d226692d892f0a4d354d1c84987beb5ab26d1e7143023e47f069dc438140bf090b3722ad54ea4ce81c41157b20ee024da223f7db817f7d187894341753fe263560b6b3f9af2e19e7c8d87857daff5fc11496c13988a67278f4a726208a83f8157f2f7da0fc6ce9d2d77da5a92b225c3b76201b49cd09b70010fd32ed9974bd4fc30be021c129452fa4ab3ded95f97033336a565ac33bc3344a10eadd0542ee3ab8c69bfa91d5a454ccdb91a3bfe7443ef8d0130b0f9f2f9c0c8cae7d6260f36cdd0a0199e3049ff8cc995159ed6e30c522ebc1c906b6449dd4bafe5d1571656cbc20a19e39389072007eed7ec300de5c4e37f3134d13bab03f466aeab2d6dca0b2b50c6608e41e5724c6d690b541a56ad72f27884739ea79a89974a4af1391af7d21a29fe699922e863bad2e58a31e776a4bcf86998b6c60ad3eac298eaa5cff6810f48a36bba45ec137c1a601a7a21854186bac98aab8fbb9a051d7b62d6706ffed72d38ddccd6e5235b4a664b1e8b4311f7c48e8fa48b16a69363dd9ff785cc121be0a607f65e3b5c0169de6745ae18dbb8209ef0c94081be3a9ca5ea2e9674858367d33161645586137fafb416106d6970d6e3f5433865aca2d1bb8ba32ccf1fb6cca9a335709d693c95c37bba3ba881c8ec43e53afb2b36740a07ca80ce45a85d170fa4990a7acc22b1010359b733ec686ca80ad50f3925584d70efea053ee71f4eec7eb5bb54786dde5196190a7472f75df9aa3dfef940f5a4e1410b5822a5a57b2a77b20a9436c6219b7a25bed5da1ec81e0e9a50d151f4163f090b4f59aa96a5b0d8b880a0ccd584c7f8a35bbcee84b4fe7e138b2b1efcab739012724bbe9bd566e9eea3e102410ebe58bc679374d2298341d0396e71b66c651b474a61a95c1234f17dfebfa2b2c766e2976cc135af3094a1fae10210ca60fdf5d25e01328064023a8d16a372d2b8a8de5df1aef9c4cf19e4b90c4fc3df902465dc369423b0d3b80a4575f33c46e86d93357fc288b810fb533441bd549d02c0b28d5b834293683eaacda219c6b95f9b4a489d65a934fb20369408b489aec0ba250c543558d22a7c624e257bd9d1261b4bbdd3ff26e09771d500e99c2cb7d2fb0682a9112c14225b79f087833c3644d6debda9f8c563ecd677a16ddd03633e6a9d16e381880256c139da4f97b991c1b34b70a8b84f660238669f1bdfd7570eee31f189eb3243d097e8350521168aa699d9fd57a78b90e27de8217c0a6f3e4a710b3a23b9f38098c6cf2831881cc8fa72d18d3e2e438a938f464f16c795bef8da741a3a529361b43536dc5c3493f4c5257b47e6b33dfb1d54c852747c0f7f2211b2b9551eda8d2ecb64780d8d43b5109a1f54d6a0428c89b6b5521b93a62acffd0d3efc8590ad0e72a325cdfbf3b4e2b905db965b1ae5de9c5776957222670888cfd1b7ef7c685a11390b23e66d99436a7505af4e8dad24edf4e768834bddd4993e9c0fc467671c8f6f5197b6770b3b95b6faa8df638c6393d5cd1f2ce9353b19a4c48b6c19525bd68d20b1d3dab2d32211e10978632ca475424f3fd7c31745ee4774b4505ad020cddb9ffaa55e3712f9cee25b805732ee7b829552eba229fb0170d210d6f289725ca1f7f995ca4201023527255f05494a8ddfc8e0d04e16643a66062967a826596b264f3609e87aa6268dd5ef7c3517bf939f106fed8f8488817339876c454fdde2b3d03a6a7e880b4b20174241b14455750b9489ac2d1c70bfdd93b04b92ab07a990a18c215513385a3413a4154079141b6b7db574ef8523daed3b2e6e54e3dea905ecb59435c4333c12f1a060a95e056e07f27cae9e67a9bceb5a893b569e6ac85ad63b2de54306d702dabb8bb59a2f54261c64c0026c0b4b1f17471c5f85b4efd689a8532f37b9154bf67ffc2cd69bb61223f713e33a5071d09bf2783640c307c22d836dd94952dd376c731cd6b94f7d112ebd0f09798015480d11b6a476a0f666e955e5ac20db160c651f537aec558f6c653d1c3cd2a41fcd962d4071cf51a60ae6a52270655baa13080c0ae216b5d66bf1ffa343ecc376a85ecd7d65f5e0fdf64cfb8cedbfdb80947ec1a7d4e0753955fa8b0ae771e504218c79d5478d54e57142df8bead76280d7eec69419f19f9f74a76abbf00612b07f49bab0e142b645c5f0da873154f8922381a43779f33af20e21231c265553620cbc1676f9b90d04387f73e888dfa59ec25ee2fabb8b4f196c903e975006af020e0e178f589d610c13173316b820728cfaaf0844a963e5fcd61b439338c12f79ce664564c694bb449edfa17a89be664414999f7c0923048393eabb78a42ddaad94ed275b0b4622942000457ac2628aaf57462e0ca473b496ed262ead5df2b887a8ca45ddee5d9ee4e3a2a77f2db3e4b30dde3d5b42f9fe1d2af7229c2bb9d1ef51262753387e371c2deb50f2905a7f397c8854d1ab60e900938421acd52a2eced8295623b153f6254706c739b4fe602aee6dfcd6a64e7e2770f6b24525ecd60a85fa59b72184e2e5791994be6148916ca9b5bcd2fc6cc47a09745ecfe1a8d18da0c2b87550b903450a4d40e75edf19e9f6871d2d7561c3e2a527abb2d205283d71a8fcc70699622d44c9521e756d00871c0ba64fd9d583458e372357c0ace20440d5ac140acc06866db652ca6c974e30656bdfa1f0720d8d0acb4e24734407c9547150c325fbf836ce3bc8520c070ccb17cc508982dd68a0620bb382b276a074f6a3703e1fce3e27af813d201d6542407b59827056c19c68de20dada46eab3ec6e9395ecc0ece23f58af399b6758f677d937fcbf35c4b2cbc5324b92f8474b1b046a4635cffeeb6810ee422bb1893257799146dce78eb1b361688f148e356de800500c8116ab62892066e238c5a0fdcaa28de93134c8a107f8eb2dc6d05e233ba96c6e385b9c4e8ad03ea02a694460b89d536c24e41a8aafd3e3ad12886774fc48e7f4c26778b752689f046a661d6107b30c571fbe2b75923a77985f7cfb691325e8268802e8a6cb30b0975e84d40ba029e033898ba4699a74cf741475c0086988988df0f39421dc709ae06f8a11636b4af686ca132c6faecb14cc9b3b5e5be4b91fb0630423336d6f846805427b73505d77db4a1e6c8eb6856e255b967e6a6dffa4174afb3ee1677697b58972bb4238a98ab770740cce9beb0409bc4ec83beda44f4b0ba18c35b0cdfa5161e379d8097758a4a6dcb3374345ffff262ae3d94aee49d310beb63631bcd6c4f75d5c3ead0f0929542009d297db869001f478496e26ba37bf1a63ecd28b5394b2a80c7b0ab9c4cfe006b8a67ff4c242b5722e943f93ca00827c3c607c81984bf98b32970abdb11cb35765bbe4dadba0aa6daec3a77f9fb5c0aee89915e7ce7036cf769b9462f99a35daba1aacd3f82f49ac9fde8d3064dee076109f86051c8cd03c7f8e8ff2c4d1ce595fcac1284179f8f9aaebd8ef3f044c9d5c7bb823ab262f9af678e5b33948e79afcd30921df05201a77f4720458ae6beb73349289a3c6bbb182617dee8187e667383e6e05fa5b2ad8ad0042b7d864a527fed2fb7f2bf5dc49cc523feac3163586bb12d71eb9047cfbf4183050e7ae621ba45edd4c6b39fa297b5213f1287e3abf2e572bb24587804bf6432416ac150a8d0edf1f398c1d7d1a386ae149d8465fdc3916540ac66c9d905889065250200546e45da98eb626cde4aba1913bfaf60ba38356396e633c3a91c5f2be4dfa58bc0ecde1639310de524f7bff0b0fb716a5deb51fc225447ec117e387354cd34395ac7171358fc3cc7423518c370d362f97537679d77992ba99ea5a4f519a036bf9ea791807ccf6789c27d451fe7da0c848cb6f6d60b075782ad2d352fb7eb158518e8ddbc190d26b3024ad5546a61c6a200d480245131441dc97f6991c3f0690036154c44b247f2c9ae283a0f9d1d39c87e3a8416eea989c17006a2b9a26299d792b77da8dd024434029ff3bfd46ece6e5133730c47d281243d6d8115f7b420719b49d256fdbea398cc1c92d3c4d90d0a2669eda2d13ed2ac8e1e75151867b544dc36faeda8ff895e471887e9c2ee7e326a4854492f60f6c0ee940f55a8efa0e7c22957cb43277dfb202e437073018a6da959378dc6cb5607eb68a0461dde7bc0d97b697e70d8ea05d3d875f649c4ca22400717df1be078f7e0f6e874db96be76aeb7a085968665e4de716fe9bbaaa5d6dafc75bbb342e8077be9485086bae16fae68bd6f48b26a4eacb3c1d93d25b611e683c1a211552bbd289a306793ad7d1254f8e099ebdf7f79cb09fc2362c86369df478c30aab9ac9f539441388700ea153f02eaa414701e1cb5de7f86b105462541b245e603c2f314a961eb21d547d0cec8f11c0c4716be9df9bbdc41ac5ed6fa9a4e8f10a11397b3767daee202d499c58f5df530f835e984032c9302b9478e506596b86f072df3026761fcc79449dd900ea416c0ac5017456eab24387c51d4ad2005624faa649d77e89965611e19f4a4a35de119d7f7d078a8b200514a00628756250d410f7a0f8a769e693ce4b77779fa0604db0f8f9d942dcbd7fbb6c58065747029d1aab0c1b09deb88b99cc4ee868f16c252b799e70e7a62eb865733e6de0771387000bb4c90cafb4475baa4c260bf1ada3f64a9356e2b11eb8f8fbdee478b92c9aaa5fc18918a681cefa2e98b8f268c8cef9b3011399c533885e4d60f387d6f5df00ef5ae49589c82860a05b26831e68ae1dfc102d76aa152f7db1ed227597155deb02a861eb21305e7348bcf928da334c486ce72ee0276db53f6eadfaaac1351c51e2d388823662771d6de4b84866d1af634caf9e3f06e3238acec7028e1ffc251cd502e1c290057b4459faeb4a88ebdf57e48f03fa0d1e80481763c28978137f32245df514f6c273d252271a980929e50a7cb0e77b05c7d46092abc3049321327d170d4bde314166aea193ce99b032c8665c3ad129b58528ba87c58c6539cf47e3f53a6b890a295cc08e658eb547af9052cc544a6ce701833e3ed9a61632c5c54e080bde7e46235df060c6e354944746b51326d9ac61e3edd4fe10977d46aab4a596a92b24b0d6722661dd54de61a3f1797ad90651ecd26e641191e9043d271dd0e83cdae20feba24ad7d369bb746a9985499559c350760fd6bd852312dee307b646eb74222a09f6440bcfaa54954546c1c8815b6b5578d7124b14ce0ef2877a41f7de804bcad974fc45faa00f8edc01153ec693afc380cf000365716241ba7e58453e86c5b702265bcd7bd25526d6d169f58b89f86135fd892ca1947593251ce376330ef7b92d1447ea7bc88f24dcbfa533f9c6aff8406b930fefc0afb06f5bcbd3e4a14b980245a9e5220b235195d2b14138d13a50482107f5787b78604144f6a47ac6281b28c16a0697227b75aa1275676f320331f625ce246450386a43dd4d311c06f60c489070950395fd58c287daecc7727063f281cee5dac457971c30b8c1f3e81e3109bba5da8ded13c1863ac61a6718ebade33df17f02613daf7545209e27f406521448f01d5eb124799d32223777acdbd9725f1e3c05ae537af5226b0edfb21739104238a59d699749b177d78c21b7a8ad46f13d620b33ffbf45d1835a43abb9ada6ae67bb739ed6f76712cc618bc0b9f208fa353a3b79aa480c5a4eca7c6655757e9664a708d6484b690ae8fedd4f786f5f83f00cbe07bddbf3c3b6a5b26b515a3f0117b1839c550f5f6715aa40ec4ceef4935520bc659e41a216a2350c43172492f868210d756509f0323aaedc209d356e324cbd5c1cb742c05bf9c0b3750d9b1e823f3ecdebe002c5723e52d872d40e7668bd2cc6b36fa5f598a58fcf899d868ca78451ec852fc3862f0bde5c6b573fb43e90b623b22d34ebd78dea87082eaf836f1fa291ccb811da71889a92918f90cfbbada19ba25bb5471f9918037927dcace3f879e546e4b769419dcea06fe4cb70e8fd35550a60f1b479b1636c64f2d6af0af81e107d1b7bdca632c1ae8abfb63ecb66bc7a72a4b0d8ebbd11ea51f66533ed05d839f9c627dba92fbce56c861be26fd17c31628fb95b80a56ba4c99b50e09208f188404b810d517c076c9ca3c003d927bea36389d6e63d51b9c35349615f03eaaf26dc14521ba602ea6ca27c6d4a134ecaf7fcfacd212caa436e78685e5848915b3b558761acb0a7ad0d077bec5e2430e856b64a67b3549650cebf -MD = 4d7909d8e5613249cae1a82481093c7b3260abe835294e5f72c6683a65bb0cc5142e6b8a21beeae531e7c3fc8238349d - -Len = 62008 -Msg = eccbebc347859d4c096ba63c585986dee7899de826fcf7fdb61c6976209fdd62c6aeeacb1a47a83c0de0c27fcb4dccaba5e3d75f4ede43484b00d5e9a57b099be111aad2317a9fa3ec0608833c838a521761e6987014d10eaeba00605dfe8231233c525ff6e62d898d26a1cf14c467d9244bf21bf2674857c7921163b0efed2c76760bfbd052f8f7d887b4ecbcd80b4ab6e822713e9f512b7ecf307a0618f595c109fd2d2787a8f4b5736a609a871facb4819f21ba849393bbbb872ec73f4073ec3b4f7d644ee6890c30ebb518994b08055e91b3d0ddb796669c3b065b2d76cede552a73ed6d5abdc5075e729dd5366593c71fafe774643d67bb778b2aaa40ae819eb5982bacab98c840eb20900489cb4504719e660f438fa66061439d7e461cbc60197386d58122fd23bc465beeeb43035cb008b777fb940bd321b81a702f1f77e17d8d67ae86644df8f66c655b05d3b5190473417435547f5be0720a49a3c09a6b0a6c340160659e06c41b16137f86438194696cce99d8e841c6f8d6d14c060e44e79a5794b72dda964cd9d6dd006196dd8971a04cce2730cefad1e4d0cff9b9b43e9f362f34c5e7f0b6310d83306e94740a1445b77d493d47a5889e0ed7a1840534013b9c7e34af5c2ba823cbb8b4269040d8c3d74d47f9f7eea26b520a07577df34acca23e821822d3c8807e403b357753488374e7284a25fea9b26610321b66a30153081cb80c89d5188d646f0ca7726ae9eb56f2f41a18fc25dd10922ab6066baf3797bfdd72da5920b044ee2e66c9ad45644417b35019119c531938f812a674dbe017d0f9315e896952e764a958c445e35708fe6ed47065987c49a9a3168de60db650f615335a8b7adc167a8667ab5a4b2a684e2d8e651fa0c0678e33a905e8ce2109da375f1987dbb497d8cc7ac51306472db0f66640683d873d8eb1b554a2a4890c246a9de2a61544322583785b999b141fcbd3444867f53991522421c33d1a561f7bb3d5fc0faff3b10ab34bb51492fb0548cb10c645533e2c8194d59ae1b5f00b871cefb0ec3128da2e65da1bab7462a8cee6b20229dcfed6c409b821b5ffbf97f1acd44662244d773aa10dd586c7b3d1062d12443c1ae256c38cb4a0e27f2c8d616b6a069b0fc94ed56dcc2ace16554697a718d4a59450762524b05e8fbd9db37e629a37bf7a0428a8d3ff64abe6b0d02b5dadf98dd2b1fc93da95a4e5427bd3f1984d23f5ed66cc5ada8ec944c12c366755b7fd1c5d6eb1b4b549ba0c952fb36115691066f15704948a61a2c22e3142f5991f2679bced5d31bdb5e82b3e1f1c77e2d7473a0d3f96feec61364cb627ba7d31cebdcd7798c8b1fac1766bc6b5d5db06801098ca864b3f0774cf0bdf7667a623ab093f17d6b9dd7556abf3b458a834894bb2a8af94eb00e483b32734861119799d54f8230efa5d355ad0ec906f5b2b741f779444d13ee889772bc73ac07f7e3b8ee42023aa51d842b72d7de364b767cee6a58111a60ba000367f137b8a7b7c6f6503de9f1187f6a5530acf339e84919f8785999f791ccf51aaf7347e4dcbbb1f0af75a20ab64606518af090b858a50f0ea5f0475b3371e82b9db52cb7238e4526408bd2de0afbe8aec6354f081904dc8f77bea1bbd25359d4d7294eb5f8a9f115d802f4f1832b71db970d86cfa602f2f9620721afdaebba94d0523657e899363dca5d70dbbb3f424661cbc0658c09f2daf98c4f9dd9959afa1dc27c136fd6950cac1deef31fb1daadbb02947037945cb2a290940c4b0b6b6313fc788eeadc8e00d1a6b7de2d2d9b4007346b56453c810ef1c69781ab97bc6e5762b411062591c8ef8a74037ffd04cbdaf3cdae115d105e6b90b28467d4fe7a5c87c7403e4c40b35a5babf964cab79faaa323ee38907b0f84718d8b2c4db22597fe2a92ffbb0b5eb68cb82687f12449fae5167d375131b0b10b710c556c67ee9e18469fc6fc523968802121661acb39401c0df17a29c4e085a1159e7fab9043d378b3bd207ac5c1f4e88f606ba22d1c1eba82e19d84b4fd86e4e3a807a5cbb3dc81ea8198c0d686f0285b6a2521ba30eb631da3fdec8286194953cf89c56abd2de663739c78f506dec20db51f0403364a8826df37ebae18d130ee5b82950dce2bf8b709a7ddb1b005382ec7a5e3988a90bc46f9c7ec9804335e2c026e8f15756b4b4dba47999d11281d3718762adaac7251e66a1a79e0f6b403952aba3e22317050901c082707b8abc3af3dfc545a2a43fb9dc6cc1e195ec7d3a25b020ca480cfab369545f08204f4ddff9ea4ea8772aa0bd5864943a1bb0340ec09b2852cf1cdbda9bcad90ac84b7ceb0b10c77e313f925163f1e74fa89eaddcabd58322bf31efa52088b81e7b659086b1b9f671d9cd5b9d847b84cb449e2fcd6fc7f9e120327f3d7ff8c4eb4285d3d7744da52775bb44ca436a3154f798030993d85237fa06d3ca4080c41a24938b07db349a4810f195002827b792ca7472b79f6f55ce56973373ec8a82522a78013d6fd69e7daf579666bc18de2fc41ac2001bf6cc4b3bcce7600a7dc43c5b1a7da2b69c786e5cd58f2586a66dd0ee733b0b90d47d59b28d36ba22c15380bf62465e3aecf2c21e53c7640e392e1f4e6527018671309ec2c26aa9bcbef7c55e38a698832fd221feb9874cdd3ae7c4efd9cc098335afc27353c95461dc77b34185e37917cee13502ef17057a0f6167d6b8744c1188c16ecd299ce498839df36f2f4628802fe7a334ddbfb66d2264af0de865f1b7d22d4ad92a2a80ea1b2f2df02017cd46bcac169c6cc7883fdab8449b53e721fe7bbcfd9e3fbd51de0cf608cd3e9e92efdcf734418276a2779e24cf88df44046ceb363024519b7ffcbeba2d0d73239d05f691a52b08152c9dd871f8dc76c2c18b8a638a74460d31cc994344b8a6ed161074431262e7ec503aef6766a0ffab81e3c10ab495085b8fd70658f4d7bf452696bdd323ef054334d54bcec2dc62456bfaf6f5558f7dcdc2a46bc3e570a573f52139097fd94c6200f6546eb39687d9a85a92ea166b8fabf2bb314ac08e42bfaa3850afcf28a390dd25720fe2d856ae5f8bfeb29f30253c46a5c1b62d367d706d646a8bbae4f117f3eb0d78f6a9b70eb913a11597e626c9e7e981ced3723ed0682bef67e916203d69cf8d729812923fde7ce2daa6967c9afd0fdb5c5b496d25c018470903c6174b675a5ac57019cf8af54e2bcb75470ef7afa036266cc4f3b8a0b0da39b1fabe881712dc3925c95637260fe3aeac01c4282523faf6afe9b6d12e7d11c19bbcfd3e9f817b9560270f8e9b49714cf3cc867488208e92ccc29fb8920652686813bcb3272fa0a3c83de2d779833f6df0b13c25001f5cc26a5796b4f5d306f5c108e331d8a3b1290612b859eb46b4d84eb7ce81b4a9cb5031ae840e7f6d96314da15afed96518f0c1ae775d17193857b3e724d1cd454302cbd14f0f575b68e4b5e8096253fd3bc0a21a092b258433b0c847275c727c2ca2ddc8e1fca625e6d5a0e5d9a76ef48461515d540b3e0f0dac34e2bd6cccd5eff612992020935477ceb79fb01351d05a9a757f42458a432f139fbdcf4703d8f2c70f4ef6c2476f8295a21e78f0251c2434b689ba2030a7ffadb3e246363e0d9edc7fef4a29e9fe71f4086a1784115d4cf8be82a3e558c4e64215580881a5fd5bff0882039ea289abb0918c77183e1d39ab3272e7dd2c204d997027ff70612f92f652110b699a999894e68b7ef3d4e35318bd616d4dd1459a7b6a58114b9a2ba98a06a349d2f8b5a067af6f165ffa38020605581d8072bb37b0abf12859777a0a83cc41a521e5662bf0934026a2d8a3ae3cb25edfbd35088a00dcfd2be321a31ba94bf2079d8833a1f83b07950597acbf836d7c9b4b42b6fd33a5810231c02e46c42cbe578f0aa46a474fcc4dd05fdb9da3deb93973c24df610ad87958b7ba4f29b16ad7d3f9241eea57695354b57b9b064ac1da17ddd53df609d16cc397a8c86f7b2c862f5499396da586c35bea8cd618e7fb0bcb1ba521feb1c378f82e66e6ca0a816ecf95621c8ad9e583570799f16e8017b705682d11e79d3f1c6b0e7d20b5e9f9f0492e273ede8f0621daaf3b8383bd885a6b65c5944d26a4c5909a441cbf9406c930a15126e51f590d5b43e9f304facd647177171f9bd885030d64643143832847fa71685b1b156ec46d681dc65ec267739c2e9a1a504d506335ef45e4ee41df0b2b20e5420cfbb7e5658e5f83edaed6f66ffeb71b06dfb754bebd71ce1c5abb6127224082275ca4dee81917a25e0aac6b4169f6a82c19fa55ec3170436a382e0893181281e692e61f79aadea81c805850d4e2e1383c76c9f552fdb9eb3464a75fe354c3c7e748dc257eb63d1b958a5b358f0c0f41c49076a19774b73c176ac7e58c8aecda95e9079f8bcd9b6375933587d447c96b30d1b0e91e3900ac9fa4f028130cf6207efde8cc05537216292567d63928b80b2dd4e94a4bbd2eb319bdd0960b5d68300ef200699fda69aa2cdb728f422153a7f7f48033c46389f6221fb9cdda1ecb8fc25fdec6afe4eaa5fd0fe64173b414d84bbb26340cdebadc55453c1e03a388a635a1e481b9e56d80164d236b4273740275b34bd9798139dc1fb8d8251cae3809d562a219326e6adf051dba8b42c209bd22575182befd6f8bde051e71897142312e1ca80bcde28b0955fc2c1fd9324e7ece31e7ce31a5f4523c945f71eeaf4f92bc3a66c7d0d426956562f8978a46aabdd5bd6f1a760d40c5a7f14ba490aab8c4ec365edbefc5c609cfdc9090da61b6f0c5646805f0b5ed6caca643882416064e4abaf0b67f49f1ed01d3948a5e35ebce39b1630f3612429db71de7ab2d53b0756412ecf613b322a587e264e26a15c18c9f4ed0a4cab4f90f53e2987bf0f65ff0a4e874092193e0c9ee839247a293c0e262773145030069080f7ed67933706d46a996567e3d8eb4d08231ad187c3272363fd5158e83a72b3e465d4231495450cddec6e4a3cbf607400f6705d37b645e1e63e2fdefd0fba80895084c22c704b31ca0d4af38615c609ed2be4d1704cbdcf18b2b4ac75f8087fd880a54cc21240ca9bc5a26aa723449437881d341ccbb875612089cc3a3d813937bce0cabdc14b60b7dc1eb58931039e45d6c48e227c5d5c2a52564632264f350fcddd4307c6947a861a65de12862bae81dc80e86aa7d50bd90ec22047fb9afbc97c43bf876944a0704720ed2c6ce34d5264fa49dc94470ad81d756460038914cb8fba4625f1835bdd2af6e8be2953022034d9b9608adce28d47181a648745077fceece1c9a87831358c90d9b006a4555416c640ded3bc1a625353483dcff65c4c037e975bd44cace03595c7ea4bfece54cf69e73eb50e3abd0bcdf8d223c29c99f41b71c3be265446edaebb534088f6892a69b56879fbcb08352f310bcbd44ed06a6975e9ae2fb0d07c83bcd52d6b545bee6fb34466aa54aa9a20fcd00e52fa582d10adb6eb8f48e4a9bbd25759ce7133e222e7bbc6435d0b024960093665299905b92110bf6da4ec3dff05c20ddad377d02b5bb3dff06e933551659e893461fbba0cd8e170f14d4e01f65efc91b704917e311715fbd710aafae2137750e82de613b0da0f4745ca74ba49e4ee2d8c8ce7b4dd21ca6020cab81aa1737dd2a812c2da4e2f838c8ea3c4339fa0802981f1e33cd783b956f425255e388c96599d9af7d58de02687f761a833a1989bccc0bdebddc645c9277ba8598b4f66ab2bee4cedcd16f3df80a58b8781f7d6255f6e77695e526de419dcdbbd6c8d0aa591c4b00c89907395bec3a9c8e64862082ab6a8c4882405f1764046b7c89b7f6ad3474fbdd3a465328a7743d52a3c422a75bed76423e414d784ce72b06620cde4399eb06671fad39d2ce9e215157c807588ae8cb1f73aa3808cafe6110fc5fdf90bf25c712c39c4beec430df06eb024cfaaaf5013cbccb9d3d50a2a408b321693906ad944cc09417d11aa4dceff80342225e9a9f268455eb8a908c7a7a20e2099112fb149191451c2e54829178e92ba553f8322b6974b9a174ed144ac1c0224f3d6686be6dbfffc75ae452933e491bd5041a540c71e8676d80d8c29b9c0b52889273e9085d9754a7eb5c9d58bc92346fb73798d8dc5a0f9e42e61ff3557d037434cd9a78ddc1c44c542fbb68505f05c3e1c249071563e2c21f9794c88a9fa56098c603866ac9cf1339d03538a5fa1070185d1d1d9970b1578b6fc9b197edc8fc331fccc77119e5aae0d0a3403a0de4f2cf7a6d92e52acbed1ac1271529e1de95981d4ea2ad3ca851fdb38e256904e3da7b8cb2fd94dcc2f1524e1589ad1666db3c5111ae6b9c77c6f50b4e4edf79ad85a10695b4051116f2a6694d759de5f21b944dae4148c3e4784b2a7c22e9d6a292d49a8e6cd252385faba5177f88eaf0f544858d11a14d6ec48493805834a643609aaaf57e793ab7c6c6840bedda9ff3f6a17b26861193875a25f903453c53309d47aa736f561515967b78b3671f7f6b7e4fa113151630be9793ad6d705d77daa7802b70c6158bc26d5f157671c3f3d81ab399db552b9f851b72333770348eb1fdb8a085f924095eb9d5ccfd8474b7ba5a61c7d7bcde5a7b44362cf9bb4e02472e759c2baf0e183aea740181158e15929bcebda0c28adbf1a053fd1cb8066d1ab82b90ca2e3022f79dbe75d9ab9ca7f17d7eddbeecddae98ce502618fcfa499d096f00ea1d36d40532198c4fcd0ce9476de6ba9ab2234cc10cbf2a970096025eb0a47f13e28e85f45619a75be07b4414fb8ad6bcb918211b19f58cef596631c03c606dd024a3c345583369968c5462da94ffb4ad4818e5f74497cfba7df752721b275f973a231668d6fb45882714a008c8a9d6e505a1e5f63b1a6560c4a5dee4cb6dc6e1b968e9ef50d5cd9957589640151dafec683fbb885c01e07ae40e5188cba8263828f1d83944675452838cbff0e8cfc23bf66ed13e25c2b37152ad34ee9a6b0012ef6a4be720049c3c422d779be234904c26abb18836e170ec76ef0376c62ae70a931ecf697241e7cf09b777b16ff0aca57f72f6e6fdf28b34e76047c1cd6c4d77baabdd40c9b3d98340b71ad2006869c06750fbeae95a74f32a8d7c402eb3a5e2ac7de00d84bee3e18da8eb6e32107a3584c24af497adc09f96e30b82487572f40f21921031e79962570963f6739d306d4e536ea47750e0a2d2fd9ff8c93646f459234df96fb25c9e23651efb53433ee03a60d16b06d86795552984242f8a949bf0ef8e498c93bffd892876fd4fc6f836bf870dc8d4c8d7ffa4136294c9c6ee338d02dd51172035f8dedff66cc77cfec964428e4e5f96944a3637b5bb469fb65373f9b5d09ddc5128bb0827da68f9b520cf0fed5c05c62efd8202e81824697f845c3092289f2c9405a41d85c692b1adc5366b758265dc2a922e01942bc1a8cc4e9c441cc9899560f800ac9aa1d3295b3f50c1e1420e4cf99070b02476ccf20f0abaa09043fbab6aa87711d0fca8e54fe7a4cfab2b5d9d3e81109b238994c9ca413de2a72853d2f37f7e09b3579269fe6688d12d9ee2414bdc843f1bc4c79480aaac66cbd720a0adf56be0cc132e2be9349362f32d1addb41b31f867b8c3e6b47f7cb968d0e0a8fc92e73385efbaaf82ca4b11964695d6f9b5a063b1e61834e868255728c6223051e0667e7b2de6697da02659818bb1a1af44561d64dd3303aedd4cdc660753eb6056702e165e2fee1c4eaba74f6d1cd2274fd9620afeb2d75a474995bb14f44e8a7d8aced200f5a1f13e41874a5b25fd042090fe1edb06247d4ea23f928f91be42be1cdd58b6e6398ee78e762ce66b66c87f132e1ae2bb8faa5bfd2676c7aadf2ba0acd5f4d06ff967e2f8f0418f6bc3e6a3e69e79b6215d53e7a0d6f26dae0597cdc14540ee0175fea9078222c69578d14771bbd5c5f631fc8a33ed7fe229e6398de0a7b7802943c5b240b86b1c771a3ad24af29982a88216ac3cc689b59ce563799179e31765c75f971aef75018f1c65ccd8ff4f7c96e234d611feaa687587b8093a483e1445952eb01ca3cb165bf3f49fb22e62346fb6c98059f25c6b4231a9c5617f33172711b5a5cc81e7bb5c3569d35d0c6c1a819467437b4e1a4e9197bb26adab6c80a8e176d080e655711e5528004015e7cf8aff70980c6e5e82e21e5eb5553945013978f4d8f06d9ec800d7d19ef1d74f93da4c87e673dfa398923a26fa1ec556e9674cb21791741e30a231d917e8cd1e37fe201fc7581e83f0408f865d50cc0cc9a0d13124ca867e3b70f7b0f39b73de0c750eaaa30fa77a3a6b630f57a1a9f12274aaf489223119590b9dfbca9047f981cd6cbb122106e0d771691491780b8e84513e6ead2ef08a09c0990c055dc61b5865ceb38d32c97248010658634a5d3f4fd500221957414aee4e8d842c5a8a9dc0dca9368cab4b891c88df2d75af1bae156e94914621afc646e3cfd6a82ce20b7ba080b698f129afc577382620fcc345559c604ecc1498a6c44ef486113b88eee94ff9b62aaac050b36ac5b4fde9e08f80dcf7ad03a69846e6ee7014f00ccbb29a3958b7ba4ecc1696c1ec5c74ccfff747aedf5e956e2b311f20e705cd2746e0ff0b322de033995bc01b30af2e3c7e16ea806bb5e9c1cdffeda4addae101771488242a9b052fa4aadfe5171f72aef7691a00315589580d0dd2e858f70421c8a7d6228681c1699a8e36ae241fea9ad858269cd4bffc7744d55f4a6cfc8f1ed8256964fa747d97d77074d4dc331e96ad8ec0b4aa57abc61200e3695e5dea4f1207a289dae5c220e7fc0b07a3fb6718f35758f646bf2fcb00fb1fb3a19dbe3902e921ffcc4817ab488b79a51fcb5c98265c5fc02e48e0dc7e3e64c7db2e736327245845333de68d7599313ba44577aad30855a0c5977791063543046fa29263fb63c5e89419d74dfbbfd239d5dc30b775d5db16912d4c8f159a4af7d37ca3a1fc01eb58837e32634769dd3e290220447b6f40a0357ce80d48b7dd10ab2f1fb3b589492375ddb073e521a2a71259cee8701f36cc1708d2b20c3889fd5b3c7eff94846fc7efaaa9e66171d30326458509e0701e08ba438503dc76d20c68274a0c257dbfb45577b73128c4dee0e957fb2f490c76d493df878935fd35cc6661f96ff4cfc9774bd740fab7a536bebff389cf164ed1be381f42a8a55625cbba9f15716f050d9f472bdf99aa9d6b0b3ebac97fd4a1af242b955ee8a70c3278f91116d710b80c8abbe7fb946e17fc34ca1032a800bf6fb4c2c424cfb779ec52867a7607665336c82ebe2d816eaf6aea06964dee26f2a3dea24e4cd45339a3f7072ddb68fc512ce61400ddd748be279958bf73a8b3e5ec005e762f8d06c609c4dfcd9f923f4c4f531042950c78eeb2a154ee6c6e340398d83bee55604e998e4a94bc3b099bbf2e9d8805dba76b9bacb07fc560a533d64ab4ef1956d4a74e9206ba8c4645be044b340fcd2a2ebd5f76352db718f41fc87224cc899c808d3fb577b5b049cd02b615a4fbfaf908da94afbe0345fdc164649fb678b1aeca7cf7791c1acaae06066f2e6ef131d0cc4ff599a984e48793be3523d85813f63903005d624e3deb873579e60073e449ff89dcf48627353ef169b4bf090f331b42abe4c2f8f47caad71c80ecf7f894bd0914c520d26e9a8c51136dc1d6f291767dc41f5a3e7219346c37fea3b3f3c5b28f7d48af2ccf97083937baccb0a6b1a041080a73b15b9640ccf44d9ad2e9f9b2e93fd21fe3debd3b203336402490162142d440bfe01576386fee1832b36fa346acb8fbc3a5f07f8d9cb26abca1432161f9b55c9f49343b83cb81c91c03e944d64085106ac1b950880521c2a2c53485fabc17b8825b4c48cb666bfab712fb60fa5b30ca45e5adc2a2f00dd892fee896442097ef09a4a24077d6e907848efa8a2b4328841580225876f3d306fdccd3e4e6bda25aa5a3ea950183a58a14c67b22d19ef8d83a0fcb846c771df8439d9ae44af9c395e6d799c900f30decd857f1cd85d50e3124031dd91c004b07151f8236f94b883b3dce245eeebbaeca5fc202dcd07bf51974088dc8de05f6cde2913e3f6a494c852ae60eb93323f48d1b8302e319fa3a1baa6e8fc64b2e8db72cb1337026799d3e3ebddd7a66f27bbf8c198672fad6499227c3b863ebb08c4d63ede67bb642f6b0d9b40525027d90dc2204120ecba6a0278ca68c2428527f0b28a5ebb4823bf5778c771a2b9e4bf06d9dc12a1934d1ca3639657f89997ae28adb8797bd22caf60cd77570f082d406ee2fdf2314aefe4468ceaf0706a7903326fce19ee8008694eb4b1dce3668bc40c888ccb1a392729b19acd1b71deb490d6a1d7255d7b3e53e9d47fe764fa85b3a9709084a28a7d54ad3648c0451dcfbcdeebd88510ea56d7f8d6e861dceda3760d451105126279cb020861c7324e52ee10f4db214ff6d85c4561f53091666d7300ad1836b2eca4f778b72218819ac5903665e7e162c74d4a961eac3dcc8e6c134a50abffc94d8540d7ec939b7a28b10916e505ad90843d08b4b51770d48c27beb2d8d548a1b0a50fe64ebb3964219ec1791d3c6d23562e0067cd3eb1f38926dd02ea9bf9803b8aca6e86a2d889ac122026b494096164aa99760e27e96fadf2d6003107faaf16bedb373b50612ff2978ee753156993d7383bab22dcfe911f121375522033766ac9a80916cebd9f1ab47382a2c87500d6614eccae65daa1080efa28f8ee8c1c5f319bacbf23d2214df237c048b416f28aab3aa25dc863e78f6ff5e3c97aeeeb1c801ae7dd578afcb3d74269eee132af1aa068f5d40f83aaddbc6b6c6dcb3f29ca3d8f841873cc7a73edfc453b58b280afc83e8dbe422134197dc48c8de9691f90f161491a7d7fe1b6bcce1bd8207fad71aa2531c16725cb6c3b670bd1dd52159723f8ff88 -MD = 7ac9b2b81f25cb0c96971b4647943822bd86d0006fa26049cb9943a09dff78d287afc49831f5c5e8b225a25e0dadff44 - -Len = 62800 -Msg = 92e47b82b728d639777d5d5843de2a5c364956cb4b21cabdced2529b10b3f4275f307fbc352866d7b094cfd7426ae801aac17ac72335c04adb8d791da69b3c4cf4640c9d01812c154bc534be492065a85ac33a2efc853f7a3e86264c781218f639c849ac81fbcffa3058b496bfc94a582e9abe873ddbf056df0582aeece0302e16a35f711e5df88f489576e60c2d3e1a0e8d2f5a50fd7be5a651b5cd6bcc2bfb733f757440714edb79c3a3369714eaf5e2e3b5309cb387307cb4e6315e9fb16638e2b43e50fd7ae6ac2c620fca46f5f192e5778f89c7bc3d47743e602b216c764dd54456b4ca23b8ca16dcf70c8a081606db9e027fffc416f1dae4e43c1a01339a604c44d6a0f25ab9ca3978c6aacb6d270d510ee62544c3602e0045f7521ba508caf4911d478fd36390a01a5e6ce5fddbc2b93d26ffe74a7eb8bc09c69160d57d5d66c4f086a12baeaf39643d99ffce0b43fe16a75652b531bf3eba109e78cae25fc765b926d06a84712ddecbf9c0e9a0d94721d2f1300c638daedf3c420c8c201942fcdff0c699cc1ca4107053d15580cabce70d9a2755fb683501b445c4241dd3fc12caa928c06ef9c5839570d91a955e87efc117df9ae199fba7df6f4799c3d5202ee11ca1e55150b9bea0198141c5dfcdc1573102e2fd68275925873ef3f966d4d98e10d7125f69a849fb1471d1fa93b9e635b03536371ce1a0ee57503ba6cf409a394c724e7f8bb9ad0c2950d21bc470e5c55c229d77ff5302a2a52678b4598ef948991ba2990014713d22c74d10b81d466efd711fa557a209a93a67b20a49e37e24bf7a14960ee21df5c67d48c1b7e692975acac4a96df93d6cdebcf190ea6ab2358636af5cfe4b3a9bdc1bce160bf350aa3cd3956b897e255158cd3e2e83481ce3b6f778d418764f992d48e4f7fb6d080e6b3799d3f35949c17241a0cc5ba84597166779e6a38ce45681ad944cce7c432baf9cd8caf2b33125f2c12052bbb0b3b76f2cb97be9b4813a9ff1e5fdcd478769d0ab5b36cfb466e3a1f4c5a8eb88f0ad89ee40793017afad51bde0f240f75f30950b2901d3836f65478397b7335984df2c5617cac1dcf5175db98b136fb350e8c7644a114349d411ac159e65db4bf5b7200b4554e42cdce08c8cf049a1a4e4f92e60c7506a2d1e519753e39b2a85cd9b2cb6d201e02feb70a6df177a1ff2a2cb92a5a7a48f58d48cd2e46d42693093f51affc7b7ff0caa307359068f32c412c6bbdbf2f7f9f17e2923724440e173d02cb08d2b6087eca186bba3c7712042bd5371abb130f121a49253a2717fd7770ba8b70906e3c1f659db4564620631962ad87bbdeb37bf10cf2e2a1efbe59663ccd1f61a6028f5535998da45dd38afe5e1bfa2b8a8f4abe586656f8eea5c65609c0f376942176b2a292342ee42eee05a6b6eae44f04ffdc9529fec9947cb8b9601ca409eb3986aa452e6450699100e1a4f4f670acc30fce3ba4467e81919512c856ada60bc933be95b47aa36e8857f5015c894b2437ff15c46bca9236830ff4bb057cd5764f02720ccb03b2539377b224643ffe45e24245b7e707af13cf7dd1a09f9e12cb39774722e88be7b930d4cb869276e472407dd09ebc6a1fa9e5632c218b9de87b1706a060737fce2ffef393b06dcaa839d10648d1427e8e79535486a65fd8b0f67645305e225bd0083c589d3a6ca7b41d128001081fc15602a7c653b792eb16ddc59759644bac97d2a7785a7d059a829c935fbbabbabf10c6413d25ddbb5184918381ae2b75ee702f9ee75e00cf1fbe28c209bb2499e44944be3d7f713f8884924ea8810c279e137fa10a1a5e2fa3a1522d22921b33bd69fe7d2bb31aa61c91807560749ee737dc334c6501fdbdc2e699432ec2e82ec6ed641c9c8342757a25cc963e1b5c1b4844faff9cb767eff9f87e9272e023d18d6e160b144281241ddbe73fb5c7bc5a4bd82748f5bd153cb5516299b35c46c26d4674c707835f48940e50c05c2c482abf2058a724658e3a917bf5c754b9d988031100ef0ac815396947a9c6859b77f32e97ff988d435b5ffae2a8b9db6b5488db486ad172837bad0a0242c0e6a7d449f6b99cabb4f8d5236e3febefabe3304b5276e31cf337dae9f2e8cc2de3c3d595c40fb04f1fd8b40b77ce3fb76ad4054605073a3ff167bb96b045969c0192047cf304caf14285409e941834cf8c903c1f6f93b0a8f1a5b629ceb34269c474e95620334d40b16133433fc83b8695ca5d2dfe86e6e668442319aabc5035a0feecb7c805d79be0fee4aff738e47afac4d1084e6b5d76e9f5aafce0cb307e3b9287184716ca9155d0dd2b46f4a02b30224014bbab84e8eb2cb639ed6a73a1d8d2610e49c0c69f8479954b9b85ff05da5522f9d2e1edaae04bdd673d048a5f1d30d2f03c9e3c34f14ba597816761a96dffe22e3088f84b6de578eb6c43f4f47d2085749c299be020d97685851378644f650608311b5538f88c115cd78334108d33c0f1e4ed762f97a5909c130493e50337173e711354f1f4a24f322b4cd811a1ed4dfea3445b81da327c41b7d554aa3de89e375d0ba804f6ca8ae1b42b51967fbf64f153d8ac754cf2a22cffe02b0243fbf369715eaef083574d022e99210d6b2cbe807314e9887478aaa437cf97aba9d3cf6b4a96da330efb1e19e700c6f4e8a7a3129d83b319f546ee5e0bee1b04f4228aa3355eca4b0e08667f7a0cc3db9cc2bb3e1f9f79c823cfe590e8e6358ca74aadb7edf0ffb71501cec94417a82fec108f4985e2ae11a47649036b2277c127cea10fc0f7daf5a899af7df1bbe4705ae367eb7cd7d064dbfc512bef3d42311a211d115afdfc852d229113ff53e93b6dee0d9a40f971505ea4c6510191256ae2d47a73185dc4f4372f1c01c98a56ef9982c8bc9ec221529121e1392ec8b1cd167b318b85b1d4b14b2198fdfcd99e0b623421e8d2bc30fa17d66a4ae34e47d62967eae12f749c4addaca03ee5ac2f2d5c84b1a5796240a55734a9ecbb8c8814a03cff1a82109c2f6322ba6b207caab3ecf6f0591f3ed0e2d3ef28b5041dd316ff6cf68e0a3054ed70165ff939e5614d980d569a20bc624112587f2a797cb94bab6a69b2344e46f38919f96fae511338f22a6cdf2a65552e96f315c37823bb2138d7b12dacb4f2e012802f44da6a01246ff09bae98c45a29d65175068cad59463c176566b01ed911a0fb6a0f5a7aeb9e75d27b7ef843c1c154f6256a2364041909bc1ee40ae67a36b8ee2225bb1e12e5b85284c6c57e2c7397539f64d8f25c184638162bf9a6469dcecae03e68be17b88bf3301c8cde1abf21ec5b9d19d2b1d2561e13b528c8ded567343cafdff57a85853705f6baeded026932e269728fb5c5ddd0700604d8a36bf69c9ff0ad3ebbbb28808edbdc2843fbe1d9bc605f83c86131e1b3951a6024c0117672b74d044be7da7233327d178ffa302341f84d497a42f6d466e8c5c9d3802c546d5a3be0bb8a3f8e8ba0fa26518bb8a23bb7d86b4bd9812af287b3a0401acbb8e85ff65e7b20bc38009defef193f0ff8d2256d43ad9385580ee8507dfafe54066c3f08c81b39d5013a9fdadc47729a79dda7987d200f67dde49128ad54b979df618defd80c341e6c820d27787cc4ecc786d4c67233bbad4f3c08a8c8fdba91b670b317e8deadfcfc7f8c724e29a46b44963393bd6916ca0e7db56d5b56a0300e12551d850315f5139b8437b7ceafba73642a6cd920bf52ae222dc2deefd8d948beca6d3709fa9b546e9ae45fec354ef6794fde300b03bba0b1e855ce29e2f218eea9936963da64315126f4a0f2e39d305e0a546c78827988a56b9293a54d1ed12a790cb69123c42cfbbf0525832929a38af06be909ba10b8852e15e9e285b413eaaf458922654fc9b6d982581d7478d2788881203f2925c2d9b63c1b520b5653a7b2ea6b881d7b7a2aecf8a312541f4fbf3930cc794e0d4a0b8a91b2847c7a12fa2a47d842cabbc0b09fd4b10256617db788f72858975b90a3119339ea27a3d45a7c0a49e2eba53ff038a2ec7de9f3df0a0e40de4da3753928f1dd3c03bb480a313e9e5ad8feac3a626dffcfe58d5af62f2faa58d8e10ec61591cc136195eb4726e86065957255627f9627c5c9ceeb658f73a0227ade7ca9e177ec6a744611fd93e01d04c8f5252ab047c788ab1d498fa350aeb5b40a3367252aaaabcc5a309010dc10b2b3f590059d095b6309f6d9d7136d329d14d2e7805900a351ca30ebc11622e7fa16d22a85ae41600f56fa30fe582fe8530df6fd87e5c052f6fe6897f32c6b0f354239492d5c8651c81285c347d9ff1c421fb4e9e053b035f5f97fb998cc0af31ec689905f305ecd27dd28256621716b14babb311c4b76c8e92bc4e5346d893ff1245184bdc2212ec9176fcbbbc72d41357f6867ae057a984b06069f58996c4266ec0faaab7a73e30641bb2abb23692b1ece5af2184a32009628834c77c83ab6ea7e4256bac1dda689fc98c706cedba54b37e174ed6243ae5503e97104826ae9e65b682d5e50b4d5ae9887251131eb3c453cba449fe615fdf21897a1a140736805240f93287f9ffcfeb614c95cf52e5c975d43f5925e3f8c17d72c52b09afacda148973c8bd6f588e4d5b0285c710b82bc1a0d1c873306b510eff608c4fa576755399d6e1adf6c061b67f7c6924e094b1de3740dc0fd22258793a33850d71fe19b8790cc37f159f0eced4a3890d4ae12575a176de2251839d692b275d6b9caa8dea30fbb65c555d5e3e625d2cabd7074d2de65915d333f8ea84d9225e92ade49b92c68d046c3d6219ae31939b260e6ef1af0fd3cb4b02e805724c0dceaa2c13095844a8f3d6551607c54a2e1fa5787edba324cb46b145bbb7dc8cd1f6daa29ea0e3b136cdc325e2ef2cb414fe509ba0d2af2b28d02e85d8c86aa2541e4b96ef28dc151ed85a362c9b8b772f8050013a9d7e2ed4afea49a900c395808e25906d69ea78485dc40f5dd1899c65efcd32b605b634b62b0c199527906d3c8d8f18802bb6e39ca32838de5ace29a091eeb57ad20046b68ebd7d040478326f64b1b79035e85d02f4af3a16fe0329c7b0dc11f0cc036bbc1e24fe5e6024ed035cb4f4055027ef6296809c6c84d0a1c292bfd17eba68abb0256a230c033ba6dfbbc05848441ba0a4d2c5e64ab6dc9b797fbe7a8e66d60e7ae9b67574b56663ebc9fc6abfd96d78b0f0a3a1175ad01ed4c101968796f69d03b3317bff3e4d2e0fd091b2d3d6c57f6e3844543a395333bb9fb1acd113705f31ca02bd1565970e3316a7b8ec05cabec7f2d0871d1b0ee11660f645d4a5eb5ded7853c31ff3ed0c3fe46405732c253ca1656ec227c8a830cd4df7e8f7130f9d2003491683b1f62e1b82f320ce147e01e6da478ec007ca28c8aedd1da5278529b0b40e3dab645b7eb0387a9167857b167c99837250a11cd2efcbcf6d43a7f50987d3cac0fdd7c304e44e22e1a547c7824dea49f73f5f45352bebf65e3a5c06438ba8a428e3d1d7c7a00b1297ef21084d3f15c1a3f607ee5962577a7af20e61e1a67ac5fbc4193fcfcdb9733bafdce7803c611501db61be477d588249d385aeeabf9355c40878a224519e6c554c400b222b186a9657375e066534365246889467bd397b0816b6a8cf1602266e2e151d3bf380ebecd34f759e0033bf1db1e1bb5f8ab55f51589bfad7022fc80dbd23c4d47ee1bd8ab572ac18389f45327d56ccda0d4f2a2635ee4044ff6c7bbb6132a9f3b3850bf86668ab7bf4beef1a13b06fe12e4e04101579211ef40067ff820973a37ab3fbbf4ff919cf1cdae65cd9b64b7ad5fc14966002466ec834b3618871cbe9bbb2b566d7ed9f1d97395280393209b0ea9f83407f52573c65508869db3259cf5ecb6275650be46c4f235a0e9aea508855807896d831fb8eb29c0da0e314c45c4c462a74631c91c42be2268f64a8c90cfee71c21d467da6e975f6b8d08dfb5986b6b34ec38e84d2d13bddf8bfe321c43ce1b9768dbbb9de3fce3c9b9b35ad38ca481a9654c37c1b0effbad88d250f035ab6610f356f6ecf5c96e50aa4a4ec73fe0d2b06507d19454a7e5b71047ccedeb7e0eaf4babe06eade64927ea378338b905a47276d17e6f2224c326aac56dbc6c305c9ef74441cc123cbc7801e0c1cf03fc40171f1205fa204cdd21dfb4fa05c0a798027f87e1ae2db10e6875afd03424aeeec6e9322fdc58087ad1357d3c6ff0cd0a066cde88ba042e8921d00a770e2402f6a75a99c4bed241e35e3686fba30389facf45b0fd9ba29c73cb995b7f050cdf9fe3fcaf8c4795dd61ef6a38fe4901c2af88926509f70ce1158d5909b1c2e32f32a257dd4e20a9c63aac58fb0f08f3627257dc6574774ce7b790977cd3edb1d9f70bf189d4f016e2b6be8838f488e0508b64a91706c26894a1fcdb1cad2e7fc53647541de460e41b1f4d82557672d07442d884e586816bd21af8ae51092b54db377d08ff47181c57bb80cfbc5d6ecbb6dedbf236be5b5a886bac9683ad8f380341d69399c5bfc680d480f6d37123dafea9947d7374f93f9edd411d1a620033259e7a7f5125fde87db0757f047a3a0434e92cac02710221fbb6dfcb7ef0264e2994905491317c8c369786f3b63f5a5240e7cb074c7d1f09893ead27171fab90f76c4198c0afe1b993d3dbd850892cca0aeb9717b95ff8fe2fbfd4b94eb73402776eb4d54568d7787cab9db93c2058777b3dbb63b2e13408d57f7c09897f6caa92e112928a2404d0d966f41be1cc855e79245d749dc97b2f63c7cba03140f8922e0f8258f6aa10c9924d0788a7555b89edeaa6d0e3e0777cc2dfec05afc283c2343e2daef1c4a46b8fa8ff87f68284ffc0d5bd01edeecef6d80f05c069cdb3408db73a1ce33868bfb9bf03a1361ca5c8d82eca8f22bb28a68e9f3f5ac92930161fc2d22a34cf03ccf6d93c5ccfeb69ed1f3cf700e90e2e92cdd6c15a369da34cd4a61d614d511e9a2f3fd2432ab775757c496adeacb187c47bfeb44818f3b4e893ad4248948660324d3aecdbad487468d69b4bb0d26adc44815d3fadd6f10af4431d6a687236729b3610b2aec1660cce177bc3ffc302d518c83b8b0fda604e77ce3fbc475028fbddd4094d43cfd8e5b02631fa52e641194a37e2bff98b07277a1b5b616f9425a4010d6fe5223d67a815eb051731a5ee51e2b59904f051b03e0412b98068a8f5150ecb88a1d474dbfd064e3f422467d324e62ca7827e94213a1d9ba042b8f260f50cf59eaae0ddfc8b8a3726a5b495b63b608355602abc23c5cd9e5acfe9dc2eec0473f728cedf91fba98e03656895603d57a2ebc77c317e841d032d4e83cc26a4fd2ddb4227e164f46b3b1eadc9d099d3d471b1defd5cfa2114b262e70c2c11c2ff0a9420714d3b1fd926bfa35eae28a5ded7eece34a35f44bb9440c40e63b7f112f569eb378adf24fa382e6faf98d75a7dbfecbeaa6f7494188f110a10d9e0d73fd3a1cbfe0018aad757b23a44f46c9bb90ef1d7e52902ba368c1be49bf6541c8d8d85e75017ad59766c952ca62bb00f9bad46406f37d15d1a74a8783622da69050b5d68b43768dbe1601d6c5ca66b5f2a843322d003a926ce2dfeee69c53c66ad357175b3c80fd520199323eecc65326f7bffa58ef352bd59a1656fbc4740ba8ff30837d4326bf239813f78e5046531707bf4f0337193c9c3b62723b810af0db32e6bd69fdd44d7367f6894c7b83504376a582c47e436f314568b31e48850091fcce3799c32622f1efa579e1f4f9b52cc32748050b401e25568d8c1c818ed54ddb7b64854978ca0fadc55bf723160c335b99015d848bd3e8ed457fded264c96f5d52c6c4e758cd2d10ca81f4ac54c007ce9f413660a32b1c582500bda1c36786d108f0d1235286fab7298e52e7526b1a9a8e7a1836127e1045a0a13176073a14f4f2552293d291c91f66f3aa7a9b87ec2e0b2e7b5b565765243cf3e2d5ccbbba37a38641af75683898073453cc7c80dd1789e0e876fb519b828e5b3a376066b6f780e6b6dc9794c9ef8ee2f75381f09dd58f13e7ef5dd723cee959b0118eb5bbd33ef8eab1d581fd546261fda648518ef68f39e24b0a528e97e271ed0a94433949225f55b5abda23852643ef4b3c1e20e90ee570008d7e4c4c0e3639791d79afd7df7c905e86e80ce04efb34a8e9d1042b828909a66394dd79c1193de376d39fedcac32312f335f9f4511a7645bdf4a93c8ea727b30950c29fbf8d52e05cdb8a2978d576897d6e8b4fb1042cb8350370aa87c252ad0b1c8c2c3e1520d62c1beee97e26131881dc2141035ab066fb880ae4026d02fac552aabde143206b60ff3ecc2f377156ad295c76ac80b9d86dfcd8878309c132e4bd9eb32d99c9e6a8001a30107c29ba5bb0bd6f31189192f8cc59e39e1b05dbc5a7e8aa978b85fe4dc8d1b3d676a4ba1a1ca4891574e01d48910fa69833595c049c1912a38afd08deb425d5c5c96adc64b7a252ee482dddc9c57a4f25c5244a1e149079c63a979cd74c570482c6e4a7d83c476b1fe4b36af8e42a2bab530f1c7eabff4e93fcde30d41c15ce71f1ba92c0f504202eed492b52678feabd5f6249a2cca60f8154495b318dc2a237fc5523db8c59109fc437c562ea2c0ac06cd65826e1354b12c361729c2bee1e29293ce1646cb6bae6fc179fa6c67eea48edd3de77a42d7fccecaf2d50710890ea2aea421810cd9d991751309aa70927db64d333116fef2c14128ad21ae7a2b8ef53e5cc4312de272a888d1ebae64b31ec646d0c80beface8ce79d07481a3cd4ad36a7f691dd98f61fd213b0840ec5a6f06ef9a1420be0d59bde5e43546347a2a865a94770eb6e78ed869dac82ab08e58bd711b7e1f131dfd569370cec6d4371655372356cc6cf2e180883594335757c135f3db6cce95e5bae1acfca6c92c0ef68729b46d1fa4b8433fa5d5d2228abd92b49e6147f7ed6c79a557102517e406b26557d026cf06429a5be840ecc0f0c9b38399357860c3ba23ebbd35b377a3273237eafee8a33997d01d7a0048d532820cea0ddf65d2bed89efb05f2b8b2117a5f4509c71c64e6bfcbcd839d5029f7f1863022e7781486cdd41d58d09c90d7061fd6ddb228dab4c375b32a9d6a83e81c079fffd618f0c4a1ab99de56c7d99dd45b338e4775cd4caab417988a00acac0d787dcd34ac2c205d0db6be0ca2550aeafca5430e6b05557c7240f5eb796decccc213b3879e914108e1bd217a93ccc752e872249072497841967768493d8c505fcba9da5955e7d0aa0ff62e2903057c1409e25a54f3635d020804192bb4d17fd07d876a3139f6744c7ea90ea05bc9d036453f0de25419abc7b02f311946062227bff48a98b285d6f4181ee86701e06bc286cf64c3ff340a967640d89b5bf1e06a783a6215285e9dadc49de5075f12f6bfb3dc887e5a7c2479427e353a5b5c62a3929f1b300347727c6a6d2d07db271936b4aca19bcfb89e77fc32717dae0d50d9f46cdd71ab09fd6bf3d7e7efdfe67b2e7187d6a3c5b223988ca4b3edbccc511586e8cf61896ce58145233c48d218c5afd1b74f1da43059e5da1c2410ed630d5e305d1a870337d3c6499953981c859ec2bf833591d3fbe865cee2ec71aa982dbcda11e56b82346e43e780556a25f5af6d2032b087bcdb7921513d3295593559376c4d59966f295fff082269435430a0badd0de788c697b41f49771e06640038d8ce599e8f30df4d0292c5b8ad13fd18b1de5c031b59f94069a0d6da4b31c273a6e97ddbde2f1ee1556fb2692fca26bf590b672bc9ddc7c6073ca38bec2a42b1a9a301390cd2adc3ff8531a552df713eba4c758819bacaedff07255c71b54a9beae52cdfa083569a08be89949cbba73ddc8acf429359ca5e5be7a673633ca0d9709848f522a9df0e7900045d97c69063c8abbe80bf208fc023c66cf84a260d1244a29ba51bab11c95935e829cb68f3598599886a2678e0bc5d8bc014acdb59ee6ced6e1512f3b470b0447e1fbf0a99c71b3a75294fca86fa131eeaee13c34c17f25f086d8fe890ae87150e68fb124b539378cfe5c27c4a214c6732b00646ae32dde2b3d61af26c28e590e02b07eacfa8f43adcc508f8f2d9114de07f0ecc46ea365db5783c791289d29d3b916cf8ed6c4667e6f2a8a446cc69bb3b86b2bddde404b7577a7ce54877562469c2b1a66f4891e933942aea10a05c968cea7a813bcb4fdae104639fd79a7a0db0e55e5b1be3dea70bd2173116fdf2c71bd6ee80284520ad9b40780d879c45405922fb7ebbe63489b8d4f6e0218c3436307097226cfa7e18cc5443981f22c0a5aba2117915f89c7781c34f61f9f429cb13e0fcd0ce947103be684ca869d7f125f08d27b3f2c21d59adc7ab1b66ded96f0b4fa5f018b80156b7a51ca62b60e2a66e0bc69419ebbf178507907630f24d0862e51bec101037f900323af82e689b116f427584541c8a9a51ac89da1ed78c7f5ec9e52a7f441ad5e1382e083a95224f395dbceb69fd87c859dd1baffa369ebd48248b142cfcb2d0a1df813d178f8147148223312135bd8ae4c3d05d8ab68ca9681d9610e1df08d38a4ebafe8cffc0e04ada33be446d35c93b852f4c97005d2a05dd8d88649523c7e2ae61b5628de504228c73fb9a4cf56ba74dc0e5e8bb192a688bf8e37ec70c92f226fec961e0fa9ae3c06c4eea7b07596e400c8e4790c990da506089f71dc91e02df1aa251a10689d6a0a420fea1727cd8889ab07a277444a1544be2973e64515a013ca8fa7712bb4351a5da9c673fbb2f4df2b44a27222d05be445626d3e41541b3ed43240b251772fef7e28d7575fdb9b69d007f39db3550b6d04d6b835251011db4db96054785aacd20a299721c2cc0ec22fee104a843c866792f2ff7b5ede06819d8190c80ed34e6aa8087073d2f8a17091537319040b7f4c6643ad615d027bca4a275c8d93758721de621dbdfee5f5ddbac4b679c1263883f5454c97be41d40dea172e2594c5e99ff3b2d970a5189e91f2de34fd3a2154b6d674578ed100c1d4e3dd70209128e82dae774e2c6404fe15dffc8903dd81464d706d48a763c3a7a7ddf6ecfef7230 -MD = 4a86527c19095982e491c56f5fad57593d827683ae08f0ce40b607a49ce25222abb4b96762596e4809574222307e2e47 - -Len = 63592 -Msg = 999d4df7f8667ff969f27d5a796a5d2516d59741a1debd4d44d766cf86ff6c8e1c00573c02bc1858cb49fb53363ad7f2012187f302529ef373e9578f8e0ecbca5a7767aec42f9c37f196d86cd3aab6cffa8472f7ad259f7c3a731c138a7f44faf80965976346735c82e1feed783f6285a9073e96cbe227af407f9da3a3db3de8a1bf393d0a8a068f2730541e4f8343dcb5b1d415840e9d552e14c28700a8205afb9fcbe9df81bb9a888dc2467dfdc19bc78b1cbfff336b36ab3b7306cb715419aeb403e20ab5fb444cff30af2d35458c869bfedb65d8f81a60fb986929bb41ed6303ca72b4ae2f541c8f869f85b435759beb63b0dd86acc9f45c19f944104f9dc29606df05f2bd939f43ac5fad01fb1fad83318790c4ef0a1066defb44f7e6f37274a172240b0fc97e258b37cea4fd52656952a8a61a29a75c22cfba51f96eb51ca581733a818bbd603d096e1026a5d56ba7ac5b4610c2667f97d57d919d4fac6732902a6eda9b39ee910f4e9a0e5a72664529e8982f221022cdd68b2f6bf1a0fc22b4dee9a0a603d02c861d95e483effe49b096c5feb26deccdbb2d51ebbd59827dd7d9d25a14e4ad13542428318a15dcbd28aff506d844869e6dab20a6199ea24be06152914ca42d5063ab7c7bd6aca8a87b794fcdfd5e9748d34dc3236e380495b7bf91ccb80bf9e999fab84dcf7c0913903dfcdd8a84c8d4d45b62ea25f04f63443bb693bfe1b9e9e058052cdd4ca8054f4224bee57cc1495a1c2784a48c2bbb6f1cea6ec9ed14551f0f8ba268e62d86a0d2edf6780e29af4cd9387855d442a720ac54e63ef8b3373e657136d8103f9e6b33820faa04a90f91dabd4e9f92392e3f311d8287ca3e9624a3e0719593865698ae0991e225e8701367df8fe98cbb58b4f46ccb0a2b5c7bbb10ffd90737acb50f8bab028a388fdab9c8c5c29d8b6e2e673d6a4830e3b5edeaf6f7f897c356c4b9128fec090645556b44996f2257fab740543e8161b9f2f4999bef56ab012e8a7c8bded6c757b3ea1124801ee0b808fc288012fe0677bb98b0481079adb7dc0f413dbf492cf280a094b1a4583f764003050a0b4885e3b7e2184582eb03ae085bf1715bcca0a15580da302da4a75849d6c13a53e648c68fd9b7da6c3417ae5977726fd9e78b2ada90ccec438b8028cc7d42581260b5e7eb86764ff6da4f7f776aae7f62225556b6da522c0c9432ac70fe72ac6f3f361071ef3deb4a6715e80b3c8be91e0666ed92665537b34725adde63377e93093207cc1ef5f88d63d0b2bdf5f3f4341a26b7153abb565e2cc1f2bdb47b15a6491195a21b84bcea54e7a5349ecde9cde6fe7ce8606ed136cc6f45b6f725bacf843a829cecd48087c4c489193f011010f35403b2e054f062ae956c71361db536441796619bcc8b8c3ace2613de76b126c891151cc057fb0a5a9d3095784b4e04100f999a305327223f6d44cb85161436ee1e7ace0a5e395859ed59cac697cd61718a52eeb1539a715a09aae83bc88169eb61fa6fc650f37232efafba27e97974eef08a0628b32da0130a211309743fe749c45ca7fa1771806d09fa0ba3299b660faa09899c5b28d7f2d971f4f50297d78fae6a20b09afbab93a50165423f7b5e5c1e97201632d34080dc62320a5bd1614687ea7fefc1d91a2b2a8d710d1361855eb5fc739d227500447cbb764d6535aff5b6a56fc07452f7bd0066d60b8d95039cd7ff2939135842c6214667c8090ae624a56396299baf67d18f543d44965eff9eed6aeaf2ebc22c8f34c9ae82309a315cbbec9c351e3994f03e1f4ec11406a1ed5d0360d193fce6261b0df283c02bb62360072ae9e535a6a1778eb089f1d31310919331ddf34e991340dadcd4a3069d04fc7ee84fd9eec56da26a0ca4130e7a8fefe1051ff3ff6ddf09f8147cbf730f84f7177d6ee0ab17db257b091b64fe01f3e1b7859d7c598911e02e4183feb9342dba9b924ee3b3c773698950f5caedcdc3cedb586174a216312c450bf246223386abd1cef8cb4ffbbdd65c883a2f2109871e162773c5233bc855061cd081f434173383da737ec7dc42d5bb5af37ae3dbc838309ad95524215dc336192596786169bb775dc7e6639189cc706e27937b6b0c86f1589d0eedef78dda0adf96df6e003a97600fdea6b421a24416bde6231e2de6f210ac7d6c5cea10d0b7e55eeb6d96d66486b1c7126197e46f7fa20ce4d68c35b87575d97f6e661bb3e344001ff75305bb5452c65dd3b3c985ac2f6c1162445b2ece86938c65e3f4d0278c38e1bdbd3ef853636add8d3dc84316c6723d53febdd1864f2a17e5fc42c1ff2e57d5035de897fe840315f07e771469f7cdad3e13d42d37401ba651076c05d49aeb6e7a8da936d0055d9baffe4c75f043ccf5530c44ae5c09d6bc59ae07184252621275e4e7415297a8d30e45bed4542afeaa657075d15efce9ce42487a85b3056a75a7fc2943f09b9350aded44dc002dd140d7c8fe42caa9c350cd7f5cbab0f452ec632be5bb54819b99114d84e97eccf33d1c8e245f398101e83dbb1443c6dfb9fb5a0cb313e8fa3010aafee5894a78c303b628aea2f62313f91574379d6f081e36df1707ea1865df5c0d69fd37ddc1cf493720f39abaf0880807334d44140dee0374c36aaa7d4517efab272271b3288662122f79c2e289bca96590abb44061a805ad9a41d18218782ff6befbd3652d76d2c98cc7a7f75f4031d2e5098a9ea3eaa20c2423fbc1705ea18289efb96e311f3fefc153b673d1b155b1d8bd236935146cf2c98795a5cd59f8d11084a028e3fdfdd775b46ae2816e6994b45d1b4aa5b3bb0412f31bc98ff88a650b41343fb6719123125051ce0ef601ee305fdead665730b298ed0a874898cab0a2abc21d19488e451fbdf780aae6a340b54bea2c075d5280c3dbfe7977d95e36af3af64b9cb169dff653c8c5159eb21ebb97ca21096494e11c56541abe28a97959652d45a16aa8465ec841e5afacd2eadbc9fb36dcdb7c660ad297d55c1520fb69b0f395d7c2ce0a81720f7d098f7a376e58f9d7f2407d9227d75653f21d793f38b4d5a690685faf36f76df593c51c871bdb428efa221cc7fbeb0bf110a006b74ed730027ba9b1a6c7bef9e9dedc3e4c3cb771c654feeea9ef741547285b5de6249ebf33ea257873bc3f3fb46b3354197973e408834547aa8b092ec0b98de35e5281cfb57c6a18b89cfebbff9968f2513aa725d01583cc3c4710a4f844e64b924106ee01a2c626c7e283db2609fb9d95f8b7c3b77c48f0e1bc3114484ac2daf488c49692ede80734155539c23d59ba5a4c2c2a2937e33a3d52d0f94b3bc2262782115603ce4e5e8fbde9445ea411ed00ad8ae5afd9012ca19386c07bb852b19dd593a8beb447713d34c67755ce928a4b854a72a5c0113cb0f6a9165410f311b9fbb20b2e408203bf22536f321d7a267d7be14dc59da1dede04ee476f0631ab1e5cf309fcf38c7aa7ff46888e21375628e9f5f369b221a7ab469ce026d88d023d71ed01953da54a6a33e65fc47a387dd067eef01cbe1f1b8b245b8d0638639b99f2f69e718f8ae78868d9417f791c22066e32c0490208af0036908a978663fbb628a64d2c799bf684f685fa09be50d72d7567e0993e6cd69ce5d2855542fc9704bb827a208c66ebd27582d61daa54f1d81604dd67b3ba26d3caa7e9ca0e9be217f401c1f8286a3c135e467205ddb72678b880135f127f14275d77446049c081629aaaa10dee146baa29473a6cb8e5d991e5702eb9db3a231a06c701a27518e976f7f383fc3df40f195f0babbcdc7f8fa6154b9c326e69d82e6f1dce1b21038ec79463072da8977ae3781a4260b8d2bd47d078c8435c9ca7d6eef1f634cdfee5c7087f972cbe6d439afce9ab12ce8de6d99f8e4f57162116a61eea1689ec898307ccbfb073dfe3fd9265f0222d9e0f90fdeb02ae083bb5b90e674cab850d21eb1c4989ef8d8daa1d7c4bd4542b97e640074b6c40b12dc8e38260b021a0905682471794a0f4581e07bb06fccd975c9088882921c3ec7cb94aa483ab158716a5fd4aaf367122cfbe60d13fdfeafb4cacbf130cd98434a92532e758a3f383108e90898905dca345199d514f0428b1f879681a8eea2e14239b50cd5811483f1e8ef0763d794ff068ae31bdccf02375d0a52820f7da1df57c6a18b8fa9980058105a1a325075794aaeab269222a579175be53a9002fd063243fef4cc8a34790f8a10892d8466ffa7c6d93f5f72931af58039f250061d1e7bb7b68fb3aa4eb4be5efb9c7efad05bc5d954ae6b4533e29e8334f17a116befd92bb0a46d93507b0c92029b4a3a1c534def06bbdd26ef98bb6bc08134a94e40f5a6d47b21cda094a1300ccdbccdb0b0e710d6aede9a2e06f341c4e8a6582eda77300a5cf8dea8c7263f037bf93af6393a45acce952b59f2ef0c276ffaa5748606d13a8e1a50cede43c8ceed2c0954b8ef9570642b60d62557d4d35e5518860a4a924c5aaeab7c9f9fd2556b7bc334f3ad090ab8c7c10e67d2a2affde13acd2eed7a2808dc7519d4e365803d0eeffdb41da8631292d7697f087da393c692b1bc9492b7e0ce380d43b68937aa0e1517c1e77a61bab4295037a26d976a2ca99b7ae9e1df29a97bbfb5c14762fba3beeae2b287edf754402955487a73c83a05f132946f892d98c799f1aca6e979f471dee126d8f0139aa25da2a1ad1ff618301caa3d449e32c1a302c11eafb4692ab65b85ec745054afd955e6560d843cefb285ab8b6904814c9762ebbf69ab166c15c995ac63f703bb6d78e90ea288e1e71193fc26e5a562622b223838dcb7c7e31790da0daecb67e5e42d727275142f27d7ad67b7c0671c2be8a8703110bec3b743181cb85cb6ca56c8de4b2a8d116cd88b3db2e60234f9ce555d5b510ea9530f21c92255759f7236a0f23addf365e121b6aaa65ab4f33f73fba9c041dd61bf133a0cb68b026da8acf5d10833adfad62bdf5c0bbcde8c374460f569a985cd4fed15479e02090ab4e04ee37dd6c5b6931d8ebba9b386e629660ea71c2f0fd44bc23be4a363955ddefb338f606b42835f204c2f47e8b6eb5d048d29a27e8260fabd32498d56ab4e6e252c407b9d2d48845c9f20af0275821a4463e1c33ce658a50384e0248255c5ab85c25b94118ded48f812f6a7aacc93aa4e1a39461243a394bfb80f30909aaadf447c4974726a59f41d2a19f888c107534b3a97f5a7a22b0f175740782783e55089e372e366cd76cff271f16a435fc45e63496596a40ad75e33e8dac5f0165f467d7d3ea895bd2b23a06ee7c484abb313bdd10af2b0848fc83cf345df935dfe0b48d5168da94260364ea961d0f2afbcb98259eed174173b965a01e88eb760abe6117060584764fd5225abc8543672c899d96a79fb97cbc411b4992d9a04264f1e00d885d2192cebbd4dfb8519f7fcbdfceb8b1337c2a8107e73437bca24b7d0fc3f94eec3c7a110bfed21fee7de568528e044244e9db70828be873be7bc1b18c8f32c02f3f9cb55a22da69d8593870666df1d1409cfff9456beeed3b9775a0dca4728282956b3a2ac3611c9bdbd972afd109f4b2e01889d4f9bffac08fa7d99496111ca2f8660e02730eae955048fd7379c513285da5b095c7c432e9cf08ca38f696f4fcb32daf55943ba67161276f75aabbb2fd8037fc2c58940c13dff8d12e288c81fc6022acb8b9507aac88c5471af6466abed23fcaed2ec80ceb2cf8ad08be5a6a2e79d574904515c1a331d312d7ef0d90f8de3dbb7cbca8bbbc4098ac4d1aa9040f8ac69560e9d3e1f1e6b16130f779cc180eb23c4f74ee7f23b5596d6fefc0f61bfd669dcefa13721531e0a0ba920382b8ee2dcbc9f9d1ed9df5ab5ee5905aa6d06c45ec2f087ce8898df16fd951334b37f710f890be2b8da77c1eff429ede9cc931d50f059748cbcb65641d11c7918c31a3fc31283433b5ccd314cd0b7dc54e62e8a484d7292f725752a936f847a6dc228f5003f4fe831c7a753d56b4bf97423a1b34cc38209992c9c0314bf153dba18713acef8b6fa2182cecf91ab2c6cd0ecb33f6739d301fa37f58bcdaa19eb872cbdb7362501a194f70a4c8979a45ef0a72bd79e98aba1a0b04667c516d6ab5d68d4133fae7904118d2272c3bef9f75dbed222fbc6531115fd584204ed95a6c2337ef7f27b634c20ace0eb4960745e9e9770c985ac137ae188f3c293159e0341f5820b55750aa049bc0a5c23495dbc3b9ccd73443232048ab7de8f797839eb5f17a9f67382b52915256970575ffc38bd33b0c94141fad69af4e352befcae86a6ffbb61518bab0f0b50c5cdef8c98fbabc6e27283bfb11999a6c8b36b8b44fb9d1680f3f9793579b4a3e61bf2b67b2c8dbc2c171296a0f40d345659870c4573ccc4bf5572329b8f9687930369c7ebf4ec7d5460f7ac0f90800855ed1a66f715bc72422ec4a0257b3b65962c5ba6317b4e7122f439eb461479898d162d83a30af486cf27f8aa1b622ba3b540d03b95e83e00607ce0398ca9811fc67dc64a9079fc6a2fe81437c46fecabb9e4d16e5e634192d49ff5802b771f32c7caf0a3088b5d842a18233169c708e369c26427d616e18f47067fa769a5db2a59a4b07651689e3e875f2a7f529507b58f82944e4327a55f825986968f5c3d7044b310abb43747ff10673309c7ff6f88f1cc66cbeebe156a4a3f1335e4c3ce6a50a0172b7921e12e8bd545b7102dcac35946e4861f04ba186a602c6cb20315814413cddce84df335c154697174489fd08d9b15681e201bd2a865dc233f439a1deab33ba749e3057b7a8aa61f3c78771655710157323bc1fecef62842d5ace6a708296874e30d9f687d1f04a9b1e4d9fd7b71b13ca47d3206a2ba1ab1ba668085671c5d2cfff14a6494bc8bf718b54dedc5422c00bc0df850ed5ab9583698f021cf3520b5e5b78dd7850944f1bc125b4efd8c7a89c2149b46767d0d1f936abfe2081cbbf9dd88f12919ad3680e4248c88e9f9a4c1feb9a14e07cc1fef1705742fd97835df2f8cfdc21851698ad7136703522fb18fb82594d266eff6ae0c9197720bf2974e22ea390b4a9ce6f8de067528ffd6a9da377ffb395c8d9a46b835b1126631e830ffcb2d6a7737b4b341253c5dba97958cc4f05febb14e149d641a4977b2de306c0e56624866c9dba24899460b491a7c8ca7a047502ddc6b9d5768e709b7a078ea97b45f0ee0fb64ac3b8a1b9b750666c228b63bd098dca72ddb4613303d20c792e20cac22ad7556bb611f417306035b168f5bc3d3b9f9d13436dc56540b05254c3787d2ee95deb9b6038142fdc4bb647023b668c159d9f09cb15337ddeaf89a00dd4d58d860de968469d8a6a077d388b82df0b10240240c4c94d33f33a2a12f961d85c64ad51ff40fdb4bf3c3e6f6d0d6f53027fe36832e2c2783f4befba7ebf63f57a5abbd46db3ea102b3d0daca42b2c39f501d039d5c24b28ce0e6bdb3d7088bec7b63e0fe53f902266d2e1bf7e935df65b7c86e1ca01c7c168b14af6cf9b5486cd3da06ed652847dfaa457126ca4590a9e16541a502fcce487cae9a7b5be3c0ff3277f7bb18b4b954f17da4ffefcb2093585e42e389acf04a3b1e4687057b39cb22a47a1175839daeca3e7b295fb0d54ca3193a7b3d142a4550ca7b39fd66fcfb2ac95997827e3e14bdf0bf4d22daf8fc4a00f018261dc461441c01394d8a51b5d34c5af4498de3af53fb38124133d0cad5792e604dad05c59d7a9f2efdd17f21a39646d0d299d3a713c7ae21c3a2a7dfcdeebafbb9ad369ae64e1fc01322d069240fe4d52388572386bce921b00ec363bac65d9272069f07a4ff479899648ab2de1ffea94644b74b3243b0bb10616d7d2269dfcd819e883561f5e05e9681f627582f5af443b33b48a1c2cd97ec82ed558f3f0853ed5f394ba498b1ba13605ced1aa5c25f20bf2b425ba3065c4b598b1488b0a0cdbe30f972f650845217e9042facebfb91e74fce60e64c24b236ce8fe296246ee2fdf812d2de851fd1aa0435139767d033a04a6dcbcc27ef43b4c940e63f033b3bb1a1ca92e49f4bddd49939c1628308ed519a50ab959a2eb4cd32e8490eb5cf7fe2126adb9006d01e9e90566295a66a660426bf27c70fabb089f1cd3288a2f257983339d46b22763e0fd1d51eb837c047c0d60267eced2cddf1ee37ca37326c6bdcec81a6fc5c05e23045fe1c54a0d0378e9260948b9c7ae30c127039a2ce0462b5258878cb1a44b407d21885f04863df754223d62d845d6be343bfa651dc84e52cc6987361c5fc5c9f616d80159740e77dce9154590d9c1d7c6a6b39cdc6b29b48b7f7be45c6f582fddb43364af531f6ae1ef337979f01a0e170bd1c9df2562d11e0ed83ff83f7cd2b26e3cf17cafcb4111b90a66fa2529d1a3bfd7449ca3a428f2ac4e71866cae5302c9572047e6acbadabb2ca6a7e58bb2db5736c5ab42583cb7bc21417d6357314d3a0479a7943e08ab79fcb0f9bdba324c56629571ade97ccbd3132843b021fdf054e7760244f9eb128a0d0e761a3fc065220d6c8632e289ad65768e8fcf7909aa9e52adfe555aa29e4fd017939776fdc46e79935f7dddb3eb07ddfca83dd6f4da7ae879d251faffad5fe874d8920a4ad88049a273eb35abf31eabfb2377b63fee7f1b7244d73532de2eb8aebba67428100bf0226a0784d2543e82f28809b15b750f6e2fcc31a3ec9f20b31dc3512f261965ff9b885f35b79cdbd57b5c6032c7fcc042eabf1dc19d6efa7a5a761e95b53322ea66755ed2dc2b6b260e0717c515f4364c6bb3d808c5dc0070ed4a5b62662bc7232ba782e6b08e80f7232e9ce2c5d9b5fd0b411d03e644d7393eb6b3ffa931c74c539567ebc534a1cb43297c16484bd3b751cd492d8f67e335c751a4d80f03a7c856d57a5c8acc4214f68e11da2d99140dc7dee8f01183b8e92fa19a85f80fed19ddde46a381a3e656b5c30a98d66ffb82e5ec78f62d46cce5d00d218404b51bd33126396b4a6a0312e97ed2ece32f0e99248c75aa331f939e411ac65cb5a198670923ef1e357d2cdc3a07e740c454a1c31c256b76b38ca1850b40f56a7b440757be7db436e35bd8150ff4d43f0a8f79a3254dc6f62efc7b2c87263b57d61acd27d98a454fc484795fe3dc0632262dda8be86c14a3160d95175d11148f46a47e59d2effec36995950f4e1419b497be691fde16d108093e63b7f5b7fd8b5d6f7f5043056d2c42fdcfb5b7337b50dfcf99b16ec4889f68ed7b90d98162c67ada64cd92610cf4d12b6de5a7b0a7718ecfd10322fbb7d3c5b9513470f3e0eb3f83b30459995ab794bd1411a8221aa0f53dc3678332cb3fa0207915648604441be9eea70104d2ef2e1136cc20fe6169d397d56117f04f4d789147b62cbe297b807b7c28113a01f5ddc66a67babc08268a7c8b7249cac087bfaa61892212ecfc1db6effa02af6486545b1396ddd17b718a4a5a3da108ab78f5ca4b10fd1aab40343abebf7deb76fb023dc6bbf2d547e5639fc605b6508c9bbb8f58e0163c00d274656ccabb64b5de67ece859a23dd9dca6db537ce228d05a61583f78f5fd7a4d4ed57ebe73b1adab05e71ce25481bdc1b48b8705bd08034f97b3534e14e563fb33f9690d1f38daeb6ccac9089237605f1d2ed532cf64b1e5bf3f38c20b8a7a76b44fb0391680aa09fcf6711ed3d57def6143d28661c558b7583a549742331a4a5046f8b5022fa7913708a9b7a1c2431d0158e3634cb0643ef3633b104195cfe0988d87136a8c601bcb6fe74574a47c427ddcac6bc89c60d7011860df921907c3ed720fe6a81d4003fa9a9e4ae4f265fa475d72026e1fdb3a01e84a47ac435e7edf92d7715388e3e47517435a4b12bcceee49f8c9b5813fb286416c0b088b307bdf7e9275e525b827ab747ad63fabcd2ae320852437870aeb0eb25a7c3f873a457d83a556e59a29680e20b9613b143388c68fcb945c87d94dfbc97a2da99db8662a40a486cd5cd4002daa636db5f27c72f8d620ac9d0a0745ede56f91df5547487634049814c4349a8a802d6e48bd04740a9218ef9194217d45948f4b59347386e1ec4a0d5486c79195306bd56bda68066c5238afb2acc46ea3657dbcafb1a98bedd7e958f50b097fee39935587e11394ae74f49f78ba4c7487c6af583b6375d20a65670d8ed776dfe61a5841254793c941a8d1216c534629533688b094b044f3b833478d7a529c1c2d411f3adca464feb63c52c7f5fe3e17a633be58442eb35b87b00f6b5032e5cf144c5ca5165e03bf7ccdfe05ce1180a9e15ca4b1b2452d83e96a232998cee0634b9a85125afafc7615cc476d2d43da7aa51fd05f677a30176dd0274accad286333ca4d0522f1cbdd11b5a360bbfb97e451dbc5a3ec6457607570804154440a695d4a08eff6d8de3ee128a672f2af4581883ef941b96a0009b0d9d29fd82a12c038a85d455f26b0361483d53659d56fcca8a7ef9b4711c66d705a72d8c0d5ee1246539ea7c451fe3d1c55940d6a14734043a51d232de217265490f56e96cdd8da16da5189bee0f4ce792c777aabd2fc66e9c5166bc6617eaede1beed3d2788f821aab1a6db76a5054bb67040087a767bafb764ff7b8f669716d39b39afc7c6e94d2546db636448d8a4393be2185f841b709473e397e4764189298d8468d3fe2acde54a005c405f8b9b240fa704f4c16e5839675b37eab0afeeeb7e1490d39a8148f2a75ded9354e7d77ed6d5f1c1963b10b026af832b7aabec1f55334e4f01b76655433a3fe38eb4014f77b5094f694c3f019a27a42e3dfb2bcffa27cad09b94d01508df79bb75bac0a0da8f7425a3678e32a90bc27b6268540254382dddd0df2e3adc93c4a071c0bd78e7ab5acbad55a54d3da2049b4fba0fc14db09fff086227cda9a0481cea909fdf8650e2caedde2b593d3593156eb90313ccd547bdabe364d4564c2cb648f00fdd9fc834a9cdc9c95f910c9771262dd900baf14e9f212b8d5acbe099f7f3a9b57b1a5979f0b4e02666216f3738dedd3890fd4adb2dd2024964f0a3b665548338c0df4cd9280ae9eb76d5a69bf10092c9cc7e2817f0272f40fcaddfac8ad14541b5d6e97bd836adbf9795f8ec24f31434bb25d52a6f867c1b29eadaa2eed3b97760e8778888a2f44bd249af52591f2b2065db983b3258af82f48fdec117c3a583cbfb4027c0b586362ed911f419ec9f35d386b872c206911c63843130 -MD = c55c7d5fedf6c5f93126dd90b6f19720f56f791590d42903c78a778063b93ed5174502c6b76b0d2b75658ce813e867c3 - -Len = 64384 -Msg = 396d1ae30d314d107565a956d7ec55d02ae9b7dfa3d437d690ce46f784319f9fb46ccdbda10eee88f720b672b5b8b7578fcbdffb914342b30451196295050ba7b41cac553b1944245097d1a68cdd4f7c5db336c9a87445e7b3657e59434572010125be93227ad64a477101daa282a5a55b48c5313290c8da65b07cc4d41a5a1463300c60a05a2c63a6564ff641d0423c5233931c75be53f4e2da1b8b91ab4d48a2e59ca2fbe1cfd833f0c1e2afefada70a1ba870ba276f9df18c6397c221d20585eb78437c36460fb7e4628634066e504ba90d1749f2a33d5c6e5dceafa372b3d5eba8296b821972f9dd37ca1a3d0e9ddd85c9f76a48783ce92710199f5ab3ba5a8c323e10ecd168c3814a97a7bd14f88756e4fa6551750261608561dc6d2083dc772068b29df558db78a2d325ae08c812c46707813422f78bc0c28cac053e7423537a919bbc0dac0a6b4768da38737447795905081a078431f0d183584a97f6f6c946a01172a1cb1802423c0f81db66eb1ac2de402aad0f1997ba2f2763b2721f818e7d5de73a1dcde49a390bb4cb05c952ab79728d9b020c5e83776379174e64225910c7425f0af1ba574618f7c8b9a8c61bbee56a59c3d2ed364252b34ff48e55b04196ac99fa4b2b824a7c725cea4f211a95e3ea70bc33ebda7a3e3ae1ca65c19af8144c6f55a4e0212f804f0e008709b0e6b2356753f70078066d35553ab00f1f1d874b6983c4803fdc6cb366631826e6999b72c6f2e5d517ce28cd34aa39e6479838d00fec73b4e13988c8ed7cca22c396e6ca1600c712bfbab62a0484c6ef1b516f04eaf97924112e1bb62ab165a24fc5db64dde5635f78b26173502f20d1a230740e81109d77d6a36fa5a66bb051930fc269a60881624b9e6fd19d130f35e41e8e175c9ba8563980cabce71374d4965ae200f6d3ebc63f66296b75985ac3ea0106470400636840ad7523770f79d66190845257ad68315df2d76a5f26cb22bbc324c500a99356f512b803dec987fdfa97f08650febf4cac2ac1f5e42528fb5f4a30bad8fc03c76098da84a2a766f16b596ec56a2fb9be34f72e358afd3af5df80724d15637a64882525cd4d13dd5bbcbc46372ba61e2ffd3f6851dc16c9b9424b32a73e45bfd575a2df076774b6e3f3aabf031dccb64910ecb5725fd99dee9095b7efdb099bc12ff851597632b7301a0a2252c80948b174e45ec09dac7d3dd2454a4e7519d6d0bf0dc3ec04b5a9eb38c3b74bb3c69e123111aa621df8324e0f4333ec93dc38ab2ccb7de7986453bb56bfc61766697e125059e381672685c84f77baf0bdba89fa7e19c673bba97f497be597dd695cb159d8a64f44049c3b549ac927837b1b9064bddee8b8f3ebf33daf1d72c64505ff90d1df38d47bc41f99f921c1cc56671692f20429ddcb93783efa4f9efa81ce2f5f43ece4585405f8407367d1f4d506e32c2572d20bc807d6f4656364a0a51e0b6d37b59cf918c68df011839f228161bfd95c102a6974b0d508f7420ce0395c5963b421a7df4e71a752da5d737fe0de7241a1c67b2056f63d22b9d2dee3c6f2e2e8c31a4f317e6d0e0dd6dd95337ce6c30dfb7c0b57f642d5e9b1fc21d1d4476ea56b88da1830228aca0dec4c65dde27be5731a2437ddfa6606e9a91fd2e9c3c542b45191bbedf8e3318870e23d893862700f880ce89288b82069bf1e0c8fceae66a65ebc433c57e0e94e529de40a524057d9ae0b919d5293e0372867aa4dd0f2b94a97a3d7a6a74b9b677bc682e896dd41d9756b5a87c2bfee5dca42d2ab3159e5a7e48da0b250eaeedcd2a43ea96e01d716c3726cd73e03f1e38ff6ad3259ab8fc52ec4c5e8ba868bb43e8141d74173c198826aef15302992cf5dcd6269b1b061ad5b8e6fd04de619f7a9a3b3f976fca66798990acafff7782b1e0d19d99f3003665534c6f372d441adfa53bb9877642f8cef48e67d13364bffb9fffc088cf21df802fdf1d88f16abdf19d9813bab73030e6dbeabb6d4adb55116eb3080e1bf566c4c3319070e75fe95ed7d2e6a7af0cbf5fc4580fdaa265c2b1d19e0c9045f56c91a1c650955b9e3d56087eaae4ca52e4983238ddbfd67e894b6d032695f9ac6175302fe65ceaa01a9593edc8d8958d513e9a1fbd7353a0295c95a4eea58384e5fe12b0ba3df0f0118c1ec2d9199d2675b1807f27aba6552343efd5dd4590095a8abe0b54cf2b28a2a7ed70442e5db8d27f79d994af4b07f7bfd0287adc9bb44fa996824e76e5945e879478a27d33bef816eaa19d14ce53272eeb1f3ff1031025d930d7ffcbbcdd9599a86e7c8ccb9347065789a9728ca1220fa51ca51962a78da8115ef1341d6ef86cadb42ad391e04fdc44d4323f129c88d072c332cc26e4e784bc99bb5673b2f75ef8dc35f8032092e73723cfd10c8fbc1fe885717fec42b40da71ac6997c64030f2e594650bbde80d5b2faeadeb6f54c5c8ae5e9ab2f6b738145549b8393dcbbfbc2bda4740874ca262cbc1bbece87aa04be66f3d44ca9b6ae2bc9b29b369772834a7c08e8957dbf471909cb07afa175a7177b2891d097fde2df0c9446e12ed7541a06bc14df73d0b71c46814fc6cd0fc21ab5005a57b0a9bdb37fc91d200d5aecd600668f32d1bef48b04c6ddc074f8c43c8713a44e7e5a9d5da5c9948fad6d9bf2db70be5c21da9e09c714581933c15be173cae6316b810042010e336ca9800ff50a6338a7eea3f1fd0fe2353d83e9c7ce0daeb68d12ad84f5341f70536c42a7411fd674a282bbcef931c90ba9dfe2b646b7379bddee30a9db9165e1e07026008b7e1308d8a8725372ff3131eac24c95eff2edec8058caed89cb89fe704f9a9a28c7c15bb6aa784dfeaaa34e7cb577f52e533a4f310cdcae7424e42caf7520d2ad6f69e3c9132e0ce0d6a7b7dc33f542866ab52a5c54d68b2f401d02ea6b49489de775379c7d142eedf5a71495b8550c8c8be7145eeb58f21f9f9d07bdbc847a5ec26bdd8d32cb126aaa39db15dd17b1b5393883d51ac481c9b5dca185c362d67472b63c27fea355eb46c871e8fcade0751531ff4b7db9a8b2055466ff1a54eb739afcda091b4d67e47deb8f9bb1980750825bfd2e7e98d56d10bcde764bdb37e08da84d8d2319d6fa921b7a8a766694ec132ee3fab7f2965f6a4e6e87c2763a2fdd30fd40a0a9117225c0c951c58a278c4a137a3c94577a0d74b1ada008b660d60c3f6fa01e6bb5ffcb74026e19732dd599b1f660ae27ef0bb26f026b990c5a579d1c2b47e6e212f7d5bdac5c0cc2164c84830f036ff463bec5df0326fdf87548f26fa694b4acd70ef7062d97f9f78f458cff1aa1543d86bb019a267e920b401ece926802e21c708981d61cae7b73e775359eafa6e573b6650828f2df1fa5594d643cf63f09b15e1c18b5effc0bd7bd4ff0da4490be2771613bf3eed4d1571f4965c7c795961c1e2b1e2e1e2d25837f3a514a600b28d956143f9370dc61a100b745bb52a301bd3f2b24972dae4317bbc8c9578852c009c31265703f724b13ac0b76802de3f7151fb0ae89a4fc0ef4e17feb9a34241e2946d060229112f81f8fba9adecfd4c0945e402e8e0a92c3bb9ec41a8ae9db8dc86fd292131c5af3351a4904ffaef208eb695e271cd51f1bdc3239e8921005b9579c9d8dda47a6b6e4ea4b579b51d83a6adf5f2aae8add71c74a45d8485d2f0b675b85a5e09972cdbf6e16051a3ed3cf931ee7abcb926a501d457c6c3617b40e682b4f9cbe886ba225144d9ff4ec815304a67c1cfc8252513ec24216b3d6313cea9a5fb4ccaaeddea67b567ac3e17d4f3004910099e101dfbc3f4b5a7a1f23115f171a90b35775ddb411d5380f94042e95c7aaf95c250566061adcb9d1690616463014b2db449019ee662e6a209ad27bb65e3e699bc4e98ebcf39ab7523a56c63053d29ddcc8c92db5e6e653bf6c44b11246cfd3e1571aa44147e9d5851991bb9e10d8a4107a8d939b2271b7246ef75919ffe3bab542056123866e96e27d4340fff5ab881ec069b61e9774f7083956fe6e07fe90901c562fd44d8d6de2dbe7f0c650af9c6030ca3fb0b45485c341dffb6efd94f7fa4c797af3fbbadd1ebbfc6591d079638d523b8ae21784f5fe2f1eeaad2f2b536c68ebdcd31f9b76eea40cf9d2f37d7fee9b3a12231faaca11478036993b46355ee829c02237939deb1a76381a1840341c725270046b2a749521a089c3a05a005a50bfbf31b237e48c85e4aad7dd56428f8df12f065888880253fc3eacdcfb66e7291a44b24dfcdd5b8cb4cc8cb1140dc034b2a999864966d134ffefc56f9ebb7dd7c5db043956dac0858317a9122e08470d036a4e62e1a39a6b27f79dc6b88096e34efcb822da7f7406cc06dd9ef8c49c8d500b858ce5c0b66d10f0a680dd48bae212243e88fc3dbe96ec246aa608b5392c44e7ef42da40cda12755701c7196624abbdc07da409828ac800b00d5d27c95604e99ec4313a638ade7b07af819dc1593b8aec4a52c014abe13f5108cea6d39dfd99bfd0c3653afe9ee7c27a23aac5d3374f6c568232b8d4214ad1a69b519bed1725891ecc6fb6bfb882326b9586991c09d5ebaa1da5978ef0e8d9ecad7046d1ba57a6b9329e01549614fd89bf7967bc17e40f4c0962d960b6e011e4ea4bffce4ef5bba6df3b43459e65cbdd89cd5439cb44804630b1a5d3dbfb20953b29ec6e3bc873eeb98da31b3a3c456ddcc88a1d8cbce7a078d9236ec701af0788543538e998739aaade4a5dd16212439eb431efc115ec60cb247db9e3ba6543ba1203b4c12d66b299746093caa0db67b9d77038d417369010d8d83c95edeb50b7ac7e6b294ef23c6d990c458fbc48df137a707f2c8a6e372f3e5f804664e836696acde48ac5bf42109276fc877e00b596e4594c31363b5e0f9e370c5fe505feb79319a74d5876cb69aac73f1ab0acf1295f52284be3460c9a408b684639eaaf8871893dd8d0bfe060282797b018f399b3318399e2583749b76b811d65283e51c64a462d95f44188dd53bd8bb1807eb71ea315295e5eb51d4e6941b22379a9ed586777ffea8ea5cbc875b2a385aef55251fd306027bd68914880f4afe7f6d5892610453c416492b109d42d67956afe733487fbc5a53df9ac8bf9c29d1b656730188cd86b0140b14389b85760477e4421af899fe041a51077001cd202268f0ae71625571492e8aa882e6b581504b06d64aa4a443961bf54f88f304d69703c64b80821eac05c242488e134570e35ca22440d1310596f516e39217f5a5761331daad6c9bbf5c7bec84c8b5a7cd440920acac02c2ec7d12405429c4f2256613edec56865ef3e3b7c3ddb1226f1ee8fd1cefdabddc40bf100c219eae9cdedd8234f12a63db12020282b3e60e0dbe4884e15e6b76efbae35ad4dc8f19582a52eab179879982725de883c7b5bd0653f95d3888bca26fa3707f24d579b9a6904cb9ede60c7c079d4dd65169ced3db4861d26cff6cd4eea2ece986bccce42ab9417c44e707afbd0b5858661a8fd71f3418810912fa92ef21bf1684e3174d370dd7be50dd2789254513fb5c6a872b248f93d59763c440e3b87da279e8d7496df665dc8c38eabcd2c2f71b8eca33649db34a6c928278836ecfaf0a005e9b6d321b7263619aaf9f381d885587da1307ed57d2a284cf85ced2efa9b9a294c22d25d583ff7b6304c4e7ad2e15d1eab48985e59313d8db5a77d291143dcb2bea0dabcd20ed344278b2440a7ef8f79c766e19d5223d19068532c04c6502f4948183466abfd9268989ebefade15b63600729fbbef69ac00184743e8a12a5b96f07229826e73fbcc8a6c64d100bd99fd5b541be0b8699683ce6b09fc2b3a2840c096ff39a0d8d71805df5ded944e0174e2f59d32368c57c191a7c869ebe65ef0c06cfeb2cb93eef412def3752230b6469c3b6cdcf03ab66469e3c6566a97c44df7dd7016760e0806b7526c9133ca8019910fd2046fdc7d115e074dec2eb623006dcf9b8c2ab0edf9fe21116b4e862796ca5a15d339d8727279fba352c1a943b02a2bc93d6ee16473ef342a28fbcb72644e027e70d8985e2fc1a710b1abdaec0637da4050ca09371c9173fff3c2022a2b25f15503d48208f03ff4de3172afe6a99bc348eec6902c9eecc6d7f22c911795580de2b6b3003a5cf9c853f9a092f8435ecd2b3febdf0c9e0816fc4dc0e10148ee406cafff79ba1bf90db932bceaec7989e22f6ac05c9ec7ee49b42d065ab0ecef703d163f5551d647a956034f1f88f522e99e98ce70acbea54948ba8764ec2a64879b14fcfbc735e9867395e099955f34c9bef09b83fc2e35fc001bca687caa546ccfd1bdd5e4dfe98a5710f7bfda5ec46cd89bb1fe58bda74c237958cc2913c70721740a4a707d4e9f4c9b1dfb219bdcb933c0984786130220fbfbb7fabb0dc540d8256bc232b621ac985ed8b430be83981988d6c84ed94e5fceca7158fa4257ff3e0e69a5f33369988482b353d06ec2f1d01bf5e87ab793f3e50d0e50ad57842c99548b5c7b9b2e4d582f333ec953a0aca1a07d0ed054dac388ed14499ef755af32225a4d929779b25c8ce2dee31625b2d43ff4a41a592ab7fe920dab93c8d070519e5de100cf51afd8c2479be65f59e9b122e4111e6d8cb7912380dd5572ff583ef01c808ceabe2c13f8eade99d5453a806ed4bda53907ab87c8f649ac9eea4d40411f930091c8115657540dc521f08d884e4d107665a37b29abf6565ff49838a0b9ef80226b7846e9070c9232eb62cb12e8d6725b986810bff1086c381b1102a77f13b1bb21d5b4142f9ad3a8daa4da6664f74b1a7a5f5091c5b4f3fdbc5d919abc138c925ae7411ff8873aef96bda4cceb38037cb48f24e64d8353777e85cfc497787b71bfb7d651895a2dcec8b5108ca5220249ee017408b1fcf56e0a90a36c39c8e51ef74c5cf30b9b160f189505edb93cb049cfbb293d1aa83faa0786f4d9c98e3262abafb94da5d35c782d646d384f0e764300c729ceb00d9af21e6fac54704fc90583e6d7a7808967d2b02a2fb69121ba01292d5e039ab56f0ff754b225569514cf26fb9c49c3459fe448ef33aca5fce549f1f3af23012824ca393cee94a2e77a883df5f27a978f6c789ebc6165b32860e4002303780cec23e98c3048e97dce63f76fddc08424f036545998a128e42b929affc44448e48bd2349a37a86b0ed137e565baeead91ef6541228cdb3c5f8fe23296df59dcb08d9b750859f6637e785f1ac794633e07156107a19ff7ea4ddbba766c7b2a7c9978e572819e1a19f44b415e3c74097eade8926e7dd9dd7ad698812c2aa09f6fc7d617f4ab0ffcd599d346796c61c7b7acf2613e5f427534214d9e1d7756a0ff612e9bc32eb385df9497d6320063852f2bbb343eeee3a85f57827b11fca615728f09d8a7b3939b7e0e1f5a52a0822b3053c97437d3c35c459fc07fd06197e6117bee3668e2b527fc2ff438a2f3c7a2004ba68af2b5ea7a2c228d12214d32fb244a651dcd6223129f1e9ddae7a239d0e73cdadc343d61eb5d08749ccd687e3cf327f6f5a0dce542b004a2a6ec54e09e2f4eebd4c8132f952078fa859d5b8392c5382a26a7f701a176088c0678b2c5f41ea863d975de5c62bd9aa93656ce49e3e4a58818ab5c81163b53e2615264efbbfe73ca520246f1397b970815c368d9199697993473b26c88450c2c1f431166d915d6a6a938f5f501a3979f8babd23a1a2436e3e0c9a2cbe1de5cf3a713613338acfa8145df9070a47dc1f701d5b474d0d6a9f08573d4a5084c6bbd638afe5dbe0a07e28ebfc26b09513e97dd0ab49021f319488c3aef02e5d76015ba6f8dec55792452ec9f30ec1867360788127d95f7c5ad715be69ceb60c96480148cb9e9e43f7958c74885feb906d0d06bb5b58b39928ef55c3f826661689e88d9a7275b53a52f7c878367a6d4783479edbb057acfa3e35cf60c4a7ed0fe37b47289824a8af36e4694167fee51038b8a75eb146ba040d52c90179b3895d1568c45fa70bf70715d3f57c974dd18f0fd8c6d0e8b6596b08cef94261e9e98292499bbc299c0ef6725ee3666ee7b1287b1063cec1171983d2f2c69027ab7c250c9623da8a758ee1ceddb9ab397d1250fd0804a4d4f968f2de66c7773588bf98d6c7031753f8c56d9de8fec7a14e63ad28182fff9ecdc61c9db36264160232627354900f10b660de62091928110c33a16ed95c3b7914bf7593312de33398632674d7713e4b3edfc8bda69f691316e0b243b40fe51e6ec3925198807128cbc0395dc82d116df290b1035a07e711ff19744940c188d92c60f74b32109a600ce83f909f0a14f362323bc58bd94eb8354c4bd208079343ee1629029644cb73ec398dafd4bed5660e22ad86b489fc5059d7cd90624890e914618bfa4da390deda32c82e01a1cf4066e0aac98ca07c84cd6a6de6f80b1e234fc1b4a4c09366fb6772637d9e696f1d0d0a98005ca33bc01062a15821d577ace0b5179487baca741466e421036c215650ff19cdad08d69cb36f0c66882e59c087ca493c1b8047b3518ecebae920a276e33c84740647c96536ddf394837c1118a56fbe2de46a4b43bf58879db82d5f1924518cb5f0f680d41b3e1b54bc555a0fba13dacc8aff61afae62a36be8f8c397a4cc86e5e58b9943c10dd8499b307130466543aa67b60741bf2ba68804095c8cd50c07965c8d8f4ec8dbcec598941314cac27d4a1304c8c45222058481e5966345ae8349ee52bf5fa316436b4d06ac17c7b9ec1e1582128217d444e3fb040da577028e62f3a1b5e0e05bea9d10fe98c3bdba14b8d7a4711560b0e918d7eb3eedd9d68d8404c11f9cf0fb28fd9ce285a32d518b8cd1f260f8dd4676b591018686fe69053faa5738ce659292ef3958ef20870eb51cbce26e96ee13522cbefd811b455889d84ccaae0faeb09d048ed831e66b5035eac0faf69a03962ff0da25cb155f138fe07491fbdb4cb3cbbff5d6fa4f4aa46279b6a2955cce4d44a44b10b10f9c288c0aba539eabc03a837416ebb4d59599df3be68fc7699eb754b9ba54cf549d1612a97675f31b99b378e36a6cde13ecaf00c3d909094b0552b4a3804892aec25a983f417fb585499d00605900e284a0428b8416b4d77b82ae08e435929758bc64a14e93d742834075ae9d7b1e6ea260f2b40f27f9ce65a727b60e529949fcebd2a259f62326901ecbf7dd393beee79f3e3ec7757e3aa3e36e40845fe31705c1133fd3e0d9de36551e60b22bdfcfdecb83703f9788b8b0b7e03ce8d5f6aafdeca4be6edc71d5d063db7daebb70adf27670ecf9f6cfd516a50c0f9e2d5a626fbf15c26d4171aa18cb81a34570a4e5cd108529692baa0c402b603d36ee74e9b5c8d4d061c85fc75a0cbf75f8e3d323b92a1eaa1f9eadbac7cb7b4a2591dc8d7a9a606ceed992ba2ea7c36a4b7d81c46143cbe38fd8418d07f5bbbafcbff7da289456fc66edc0ff011d5bf4bfa637643fce0b6a2c611bef9b4ab0042eb16d5c3a4707036c8d51026bede7a9c8067a7fbf596ba297b1935efc2ae6ba3e1e93904a332f165220d970e989e50df716c1736a565b2134422e47a536de519d6000f2b2e90da9ca50a0a6e481d275bf5f82ebcb45586a94ab635620cee54edf2e4c001ec9413237956d30f7563e95932955454cb6e1e33b55c8f6e973ba2685c1cb54e86458442c57958b9c8797c2153caf1c892b962f9ad9d5a689c5cb5cf3d3055daa3ab1641b1f90333e866cafb7e1f6ddeb03d3b4259ffff16c257776dbca9076ceccfaf6767603b477f32b92fdc1d305fce028f58e10ce440b236ce89020e35ce09b838fd0c3567bb32e63304944ba212931148816e4c72b01401a46a36e746c6a16e9a4bcb01f158ab881fc3ce322cc1a8714c062846112d8fbee05981bda21d5cfabb99ca4b40e6922364b5b4583432b42a852f36822a7ecb776a9e0b16b19be463852f319bbc2d8ebcec1f6b47242e6045d943c088236c71332a81fb7dda07deb1df542979cdf4485d9e4c1e87627d54c9328cf0e166bf29fb084a7977882af5edb052da6edb05680d6283f39e58e737be7750ec14593f9ad6ec40af8e20cdcf1ee26f6b014e2695d5200b12166c34b12d90d8dca966b36dccbeacc3490bb6144c5cf404bb8e2077bbc02da477082b6c1d646ce928f4e549e566d6dd30b1ae6d7f0629cf2303bbb7ca2b31d14793960d96dd533b1a6a9bd72acc0626cc7a7c82c0c855f1c116befd07475fc010753b3fa0e2d7f907329ebfa2d884c5a4cfeafa168ac1951d2df3f07cfdfe9a5915e2a8445c3e4b75b3b6a8557397e34116be7d8a34b6e1c0b2203930365886abdd55f08931d15aee55aa3a4c8389a829b9c1b523ae7afd310b0e802bd8b3ad8d345bc0784ad84ef980441e8ef1a03be61ebb47e9e05512f8a2856c76cc58378782bbc0178f9b4f1f9c4afc23a625c500af74dee4b391489edd4da518fb8f4b21303e9770e86183e611857b14895f6dfdd2b3201d0d75c6aa262dd4194ca011e4a4aced8b3e7415d948bd446881985c67f142b59bd848b5a4e4eea182a6d2b25747cd6c6e771a2b7da7baff277816b9c573e74666fa533c147e58b35af36e56038168ba237d9cee5c9743535a5523ada0c06b7b875dde84835e33b3a91abc246ebb477fb2364285fd8122e8080005607f4095fb05e730b579eb474877030445225b3064218c5318e8cb1d67396004f9ea5b2f6fe88293f67c8d5c1bcd968ee1a7cbec107a6619d1a6dffd78f55f6aa16979ff7e39154d6f16ac39d3b2bba11f8371432dc5abdad6be2389c245e47d7f8502cfd1ff87a749ceb0a7192f5a872740b7fc600845df4fb8018bee30d887bcc55e650f42c2e9ac2c026e954b5b86226504e1534d1b70651de0c9a3bf21ce7fb2f589e10aad5bbfb90856ee0ea6e7387bbfb8ae9b15d43f73270d8af9a89bf1d22f05ef603045abfc2b27cd8023f29009524a18fb1b550745401d4be6553539b075a0e04b33ee977ed3a8d9aabbee5397245f3a731539e21892c18d8e11e681d12d215dd49e9facc569a2bb935425a8ae9dbfbc0eebc9fa7685c3f8fac2f4eebfc1510d0259a0125b53dd1a43d7ddb8d5253145d1864d77e681ea353151a8aa0197f899dd4d39f0c8fb219fc32d5faa94247e7dc6cc0d81f1eefdec3ba74add1f19dea86d60b26e92c736f21a3cf3a773026e0ef4a6503e1d34c5c421aa22aea1adcae3bb7b52b64321e3ba50eee0d7fb27c99d63fc60d9f5bb0a66ea44774610bd85f1ce8762ed6270f19f6e2a7061b3fc57d51cb78378feec937a9e5c93cdf4b0d87cae6a2a3e781c294b7bd7e96e23e7e05b26bd0244c22d2aa746dabc6ad3ee8829640ef2cf0c8d -MD = 13189ce20ec85fa2c86f0c51fa9de0d0678e6ab13aba4ef0856b37b2daff99b5530b258901b6297c68d542513082c115 - -Len = 65176 -Msg = 44bc2dba269c39d3638eace048f7670fde0dd7e71d3ccad05dc981d60db506aaa7e4c0e9e37e44a12c966e125009b1b17ba9ab73669bfc47ccfe59e41ecddcc677079e73d20d88037b4b66dfc31a3dc9f8e5df1d948bbc56b505fbd3cd49cadc9b6ef2e05a10ae0038f6bdd209f2b65e3d099c6d0fd4b2040026902b84f077f2fb61e2b6e2515da14bdf9a708a59c279325d09ec403e855995a94072aa898c137f27967fd4963eed9c4e2643af170921bf294f218d91de5d5cd63232a6ddb0440f0a37c297a8f9ec138b89d2def3345eccb495945f9464193ef58ff2e2b48c8f9350ed08934f35a699ddeaa580b7eb38414704ce1f10c094214d7e3bc5d5c7fbf342dfd830529a24148e7145fe29d5b8062ac45633ce99d6ef272894b70a0a90172836bad67bd16d6ee44839be129be503a5fcb4059398e88ecbb5852019fd57e74a1936ed9082898d2894092a39e5c82100d471fb2a65d1e8814c9669cb47574cefb1d5dd5a55815ba1803ea9685a67468275147f5aa799e3911550f8e891992c61261e0ea1f05cbe99315fa265a2cc5b740725f8ea06496942393a3638822371e69f9ae92dfe22a056d2f47ff966ff491eb12dcea32ce861dee0dd8b82c3ff01c744cfd4c525dbe8218985a7ec4e06f6c89cb3684dbe7eb2ab31bf6090fb35c64c3e4738330d907e427e9b820601eb4cbaf03f30b0671446f2556a1b28d3cba6bcb58a7e3d5f494a01dbbd780f28b6323bd4598d93cdb004fa74662613f3cb8b61d01e0cacc30c33a6c574f1ce6a6d8f95708ae7bf985dd40db439e719023c5c81b88d4c47e0e324786647550c701a4d0eed59a7fd71209e71406dc801a9270165955fa4d85fd502c0e6be0c91e1c453ef734f331300034a6f3e8a2f958f9361558e1a7e25e7eab6c76d617e256674898029f2f4c9ec0dc14fd716869b5d886698cb4841f8212b28d222b91490a731d70838cd52e9dd46e959329b34dcba0ff77875705517b59f402c2d4d34994b0325d1c865b6397db7abd578a0a1204f2efc3bb41b224a4a4fe71cb7a5470afbf25b21004486837167f00ad0ae352fc3ef5e2aafd0105b884103e9e84ab6a95e07614108f12c8d645e9e41634c58d0bf5a038d8f178710197f7ddce7c3e83f1d491f7909f40e20fca59ec2580272cdeb76d4ac7b78ef33a2113e3ddd984493dfc17e102bd69603e143d9d5d858ebecee4bb9ce9c7cb08acefd2d54f152346f4d756450951e2a00bc4036c20bd72bf671e19b3d1aaa32de424d31684c781e990e6fba7f705434dd35a59cd018069ab21b41603f1c8bddf6a90934c215926cdacbb769e6e3001b63f379f548286da1ea9572f21dcaa51a9ca9371dab752985fa2c5358cd17ab475a9fc428726295a664867c371f4d834f96eae1d46994c4d1c1d84d6e7b33dc208ae08f1d96ef0513e99768198ccdaae6ad150e404499ebb8f778ad953a601c0eba5fe1bcfcf6454e41703d7fae71a445a9d2c74b86ac26a263b379b450c6f279b4c4c2edeca0dec134b80350cb62f7d652c813dc75f7fef7ce32bbb2068ce6c93eb63a98ad1557d28a17c2762cc82eff70a0fadc5b9ffa1f009d7a79a4db806621dd52a5887c38eb0a3783d819cace2aca0284317ecfa383c19bbff072da49b825e211fcc5fd0a737ebd4d5ed99061be2994bac427ad7f89d9d491ffb8b2c828116d8085acc254d2ac5429f0b6436f235501a37d9d61189a0ff1f88ebd8a851caf25a52984f09e6f5ca21e76f60b7ec016ef47442a14f61f2c9afc85ca8b09fdc5b38ace97b271b4584f34d8e20f18ff3407af0214ee9f7ef976a6cc27dcdb341cbe375d2b2e5308670473fec278c44776f0e29da4169d213b2efd4c1ca784277cefb2bf898ccfd35069e4d1de6d0b01a552e8ff22b5786ebd6909ebf1118a40acee05daf9f56a7edc258e377d17739389d7ca0ed6f2b6cf46d0d392ed4477e676623898c291ae6fd3e17a19e99e8666ea258fb407f6e1ab9d0b622a5968d280a0f451e02e87220ffd44ae606829cce290e43fd8ffe880698bc1bf997da42478f34b5a9983004ec621f734f243e0cc6f43bde36204f11c73d89af0c9a121f43537105aad0a23bbfd09a114b9c2ec0e76ca5782395f393c304c40ffa00d07ca1f34ea5a030b19f01a7beb549c2c751a5dee5c244758e76808ae58f308087d2e9eb1826183ce097587407cfe82cba2798e7771d17336242963c88dd5e8dcaba91a787f77159a1cd3aa20fe1955e59cb26f2d4092a5431705a96084ac27cfbac2fb4f8aa4a1b97991ede216aefcc38b4d6ad7716ec5c5e986423fe880af2ad202a9ff4bf10f714a37b7506ec45fad96d2e63fac6ebc05c134972d5f5a67351af08d506965470bb44e6f30ae6366eae5ca4b2b9899704bc8960ef291413737bb140d098d0932cee15d7f4b7e93f9c4a1bd0064ddf7cadf25341055283d077addf692f45ee3b604f9ec4e69845d0081f2316fb22490b2080196061fc956bf44a61f85d785febcf3238344526bc8636affb0ffdc156d110f844556181e9548de41164c7ba95f2de588abc9cdd9dd0ac7f1c118ac5795cd3cd5c86a08cf018890d46351a87310ef2050eb45a377a3dde0efed22e89310d0d71da7a8b784a268a1888ffa258a18eceda2cc209cec22c5fc22ba855970e70028836b7aede481d05b8421b1bc987f0a93a6d5c280e062a865b2b2aac797214777309b477197a5a904f1a1dd33424d335c868e9417fd6c7061c65df7faafc68c0b4cbf760c4617d9e5f697e553328b4e8e677ffc29e84703398642d5b961dfb72dfe5f718699dd4a46bc8c33e4104143727431637d4cfb4b351be9adcd5572af256e049fa73701e26f6a082eae8375fa50d22b32dccf912e9caddae5ff328a5e3bc5356836c98a8ba729913e7834315a70acf5cf0e191096b8639ee715a02cabb72b7b34fdf6812c3721b1cb0ccb7c4d192818a4dbd3806acf66bc19d749627ee0c75d6bc267edad6779ef3d30ef5fbb946e1b170ba5e9922adebce50fd233bfffc263754ec3d6f57f5ad3fdad48e08a2aa78692653654f511f227b283e6a8565c4315bb69b345eec7ebe6714b7f0aa320fbe27cb22fc87dcbca83e7fc2bc72c3f73fca3dadf407f8755af02d13ce2eec191b53dba374e11a28f5bee42499a27f07a9f966beed29006bfb7180926725354928a3d45f7ed99dc69342e1de92930b67f86fde289000a8d52841cb9e6c1bb2025e6e31b17adfec27f980f55b37a30dbaa3a3e0857d4d36435a074aa24d70c6e735399033e96269cfa0ef9b14e980da52442c3a50155d4d391938aa487bd3086a458c7c714b1fab2011f54fb6388b15d1526f2812e8bf5228ee3c56fb77a0db0df7ed32d4305624bbd5188f99953024aa56f3563877f1f98531a8cd25d168d344c4b26fe709a47b1562ffd749902eab6faa4f315b338387e09bf4996219a97591449280145798f2af33e1c330a9d50e73f4d935d5bbe291cd75b6383aa0d12695f0041006aa924ffbc084b00952a1b269af37f04271adbbae6754261a177e8aa54f7dac18732ec78da14f3a1e2b335bb331d1ed2be5335a05e954ef8ade000651cb6590e431dd1dc75ea7ddf983f85ee3353d88ec9711e166644ef10775142e1dec528ad4671ba75b4134f825fd7f307c21d1502ef7d806326088d70a6d19668c3adad6639368e89c016d352e182674d07043df4d97e42d0c76c90e1e369e440f3f55203c4753761c17b7017c348c9092b8fb82d2f7c4ca571f5602bd62014b295257e4a8e359c45decb8d98b03101845547ef759880862a4b2d651626fe0e06d2c59805407ea57c3f8d949e4e46f803aeb24893bc90d8a67e9b076a7c0bba84d15e0afa81583a500d49ecf1458e94d15e5a2c5144b72a6331c7afee7f500174bb773bf2facc43077087fd593e11be358cc70475d8fa64a78d3ac36bd8d4c91db79993b453e1a8ea8fd02f9ee1d85f76617f36c81f636ebbba7bada92e9ffcc8ee4b7a0a33a0514193abea87d5ea5ddd040c2c12c2f930e7df12d3702aba80bd871558ba420f2754a3a196ddc350a2b29df64c1b68c4927225889f88742c3f44ab7f958d2939106ae8399b685210143d56c300aabacd7da6b36477b8b3fd1fa58212994b9023f5cd8afb61f02b349dc555fdaf89601bd7c9b22ec5c98f360a273355cdbc1ed7bfc3b06f513df5c32494c22bc07e01b68a24496ff084b2dee713e7d197a77c5c5495821ed11659c690f0c6d69d5245a77cffa1ad60aec1fd9eb1c50c60d652ba9e8b298f4a45ff44cb228985adcdd6f597a2e1737d12679c1649f690910f47f984eccd4a25908e45bc7132c058b659a8c1543246af774ac13923a1e5901b0322ed0295d8c8c0afd24b27e91006d779c9e45ebcb05ea41277ee87ef91c7c22f3dc313aac09d9d09f1608bd8fb1ff6dc5fe708a638f26268c31dbc081e9ccb7350ed68348a0aee45ade3e4240b0bdc2a72b29a1967d379f4afae0b13147900766553495abf797d0a0bbc7bf8c833510c0b2d5c3cc369b15d428abc38f9c527e183ddfd44e651100115d4987ab9fd1c2930409638d61dd24b849717a157e8095bb373ce1b87fa70d1d21182d266d2072becd38f342855a3687ebe6373b54a6e8dfcfd02072adc65234a5c8329571bd8b744ce90593f7aed5937e8ead99c531e1e6663e22f585fb69f869ee1a7153e58784219e1cea5f578c9b7fbf2f9936be0b7f98db6bc98eb2dec8dbde57327a54f13ed9ccabce22c0c5e07e1c4fb22fa7d00be63c6d573e890b367a3d7b615b685334d40934b7c8971c02e80a808d168bea0bcce59a370bea89b1d36ff9768dbc17e6beb83a2fd736e9834c2e548291d6840fbb4b94e17d53d4db660a43fa77bcd9c4e86e3eaed52cd8e228dc5e2b181468784ff2cfdf09517703a0710d55afd6f36fefafb4ad28d5449ffcb8efef1fc1f1e5e95fbd88467fdadb215898209cb70f4842d13eb368ecc72d36389c672f7baac91606e085ab1b8ac2571586e3d4c977de70973f5a0bcfcb0a73dfe60bbd8e0da2646ccb5fadc11149b03c5c07de8ae7a2f75638f997faeac824135f45509595024315f06ed51cd8e1cb317a152077b9265582ae1a83fa80e6c5775abc6f0edb593086d24ba77b7c1b16998384311c86e909c11145564b37d6d6708ac98f764b27cb33f37e9b59656610d8eaed86e5bb5b8286050285697a18e593420528585eee6191d66037531f43587422a9987fc10e5e45fbcaa7e1c23d615422f7d011912d9244ed98f1e514433bffcd50fc2752720b8558162420aab4e837a00a0d5e8c55dbb1cb91518beed659e04d6c1888da1708c8cc6d80b28e0fc8c23bc4368bab07bc6cd2e1dca4098d30aa15637420b27de484ab495423f6bea16868aef22577a3a2eaa5f309e9fed84ec1c7dfa56b86071d4d873204d17f3200aec932a6b87cca3d9fb75d5fba293802dbd72912e5cf531187e2a01967821a4519bff7fab114ebcb0089795491333cfb3cc5e8430bf8d26fd8302c1832a9d80d1dcf5734abea78f9b18eef7f1b8747a6891685cc6a8d159693122e77ef40ebc74f69d90b05680248375a2835959ff873354b9a057e068d145ceb2fbeea01d5e2133205d46a180814e65dac1eac07b01fb5c78d84a30fc967aa3dc863bf47170c0d9a662726650b0e631be3a0cb491edaaf2ce8d095e32b1eff8c60fccb9b3f9383156289d6f97b93121777528fce955275ee345fb32b4298b15981e0bb68a02738359363082fea2197c2dfaa4612a405ae8de8b88762a0638417b3b5fb59f925817d71491682d75858c0752eaabfdb72bd8e8e418f03b51ddc597ef307c99b1cf34f74b2ae9cb3a5c972e0460a209c1827528da1369901161e913c1e7d52167c023e16262cc80f788e6ca98700df7664708c7f4e2aad14eaef5173aea86dfbd132dbee1a0dbf6b6f0c1029781b66eae62d9ecbbeb78a510ab31cde0a2577abab098b6514edcd27e7c6ffe88fa6317a2bb30c0b5979eb46040e55b3e77129b6780acf039d398bf58143ae7f345dd9a493b556b6c4ee2a7455558e9d9d27de9ca69b3952197d7634aa068e560c9ec9eacc88f1468790e26c8d2d3a03b19620dee54f3cc910260665f08421f58ee57cbd14b28e32f7ee8d8f09f9ea7ebb687aed82ab5be127cfd719c3410be621ce8cac2ad66014bc73966c5a50127710fb47592d141922b6d742c0b0d1ae907bb654387d4929644bac8774fca4448568eb3092333df71653d8e3eb379a7c9ce3397dd26aaf3c9a0c15fb497f7ae3121994b149337d783475413509c6101863fed4641a916d3c3e943c4c5a415880b5a9a433beac470ef591acb09cfae6e47e24f3a1717ff78aca6a8c0517e0a1afd89f8642831c4f4de23f87e125346373440c23a06794f2bab60571b002ec0ac30371b7683701ea9772e54f3123013a476e0af10b6d6ed34e89eba9d7cbb1d86cceb6b41f3adbad8e30197f3b26ffcfc354a7c82d036c1db8ce8380e6a2d0bf0f82e508c21f280c849242a469a17e88998079359fca2b368bfc63935758d7131dc873221b54658c3d22073b47130c191c89e5a5ce120ab22a8c125db43e23692a17e79c656b22a0fa67cdc05dfc36e5ded973b5528bb9153706065c87c34445b6f9b8d44ac3cdef5ecc0cc008ed6d7352e7b9c0a78784d413e2c5fc4c98b82d46d67d66260ef5cbdcd75ab6e2374e460b3d1e7457a61c7343bac7c97d2f0d844c469bdea1ad08caf7022e01749a27d28a52183ccd67de8768f6824083e6a2ef59b29a8a281e95613fe4fd5c3a66a8ad32cf4d86733d4964e61e8c0e1b5026c2d1b3000543e41a3309e84f13ae2d3f3aa6fd04ee0396fba03d9b5b6e8e1bf7b356c052ec6f9e0594f794a9c43a6e5a0f597404dfe91553dde215670e667a94155b53198c159cf62b8b6283ea89aa979fccbc93d88e38e05275e5354a2f2c8a7d41f3aa80c0615a4b37ea73f2f6526670634f58647d623fc26bb35cce6282595fcd1aac571a9ba0988f94d08a1af65505df94b9003131b09225e823f78b1c7f413f30856b6eac7787e4ea5ffc5226c1e474453c483427e13656fc5152136b6aa62afddc5a47043d8dea6348d656445b70d3a9688910a5504351783b5a95ffba1312bb07903e43613f028841a471df805f7059b45f313a7c3db7d4689d8d39dbfc88f09da9beda810fcfd1c0f34f68bee4ccdea6472067c389fcb95f8763ba4ee6e0470503334a2b74a4c84d2f496085c56b90c4bd68bdc4bc826f96a4a3e19156cb26e4395602bf0223e45cd4fa776365bf28864e749d0e4a0b8f9471d85031c0ac08a1b871a4ca3cbfbe6670dcede64a4a0e6166de95feb6da91df8b7b76aea90564d40d20a0cb88eaaef07f5b547cd79e9afc82f1292487821ede3e07d5669469e3e1b3ed77317b373e817d104b95b21f86ae4f66d70e30947f271607fd08074bde512922a89a9827f5afe67633df5e6f39fd18aa201a46743b30afe64df1761deca8e98aa575442f6cd247f78d9830e03d7f7b3584d74dc3eb81783d58c17562776f81600e4013d00c7f1e3ee97eee24f98be39375d39ae608afeb879de669bc070b6d5d33899b9c3d2cd5a6b7f1caa006d8ee3e938dd26d0b02962f9dded78d240329dcc5c02ff6a7520ab9798f6ae3ddbcf7a13e6468cb7b2fe4cfc919435856fd235935726571b39529f1cea64352f6ce9c760705e283c19e73d2b03441900840067cf31eb08fea4cbfe9f7d4f89fda7448f75dd0b41886c4bfc2e3ae36d6c0723f928f33b5c3d40f390cb5a9df0d014489dfd353721c2339252ac3e5a79f080a2b448a4fd99fd95331c458838b3d03c5eb89e80c90e13f723074d189285b578e760d44c19086929f16cb80f061a24a6eca700c7a951a33e68e3bacf72d9e37759c577f376f1a6879646caf8f16cf5da5c33cc12bf329993c8ae9b6be1bda10360aad7a2fe9cdf348b73234ae0f36a611424aa67f3f81d7bab2f97f5c97817a664d99c6198503ab937bb6c0dbaf5acc27e4241d02ded5980792f577411536ee7cd186f362c57df9f01e54d4969bbe28500543a54555772299b7683f0a196ce4e0430f82ba3f7f76e53bb6d07d48d353304243cfb537f93fe77ccc27161895e646fe9de47e379aaac9403754fe3b2cd53f178f0ce0fade28876f9bc00397347b0770ac992d5251fe32b860c277e74d16d2f19fed47129874e00c41aa4119eb0bb845d631561427f9a820cdb998d196a0a26cf0d16623aabd97ef68466d150c20bffa851d7701af15a005d8aacf8eabfb13e61c59ac82976af5657a14c61d2a52a4eb43ee0e8f39eaa0d40c068a72ff9eadf99d06a8d3f0f5af2af1a61a96c80a0db49d039b316ae12117e25d683303f3d713dd38e97c19f62b8c696aa91657bf30d2eafe9b7cb481a74df62fd7234ba335c16790cd0fa4d4d1264be310207c0ad4b2d84f8de59944b9f2b1fe65d85915308ec67ee1e3142a567503afde2987455ff0cf76f0e0abb2cf82a03972d69ed25dd87483c6bada5f11f53b1161b61c2749094af553124e546e8a4b71ac829f63244aec2fc9eb79fbaa235cc8593aad091668d55b22ef0391fd860e377180dd301a32b7d389f97588757be325134bbc634e9bf908fedb6e0412e272eb4045cad1b63c422f75695f7e0a8b58b82e4dbcde681f209f356be023454c140db7360ab06ed425942abf9a54dfce481218d530d2d96ed68e6514fc57eb0f6c2f34f5ff64ca86cc920860a8957bc11ba34166cad9490795470c6b254a9ac8e5c057fa2b574fb0c1b99cf11cc854e05dec6676bd5a0d75e759a9d30d53dae50b518eb71110750e8f7b56e5695601b8896dc689bafdbd364746bbe0f71c0200576347b14328c0eca037d4b210d6f8b628a80014360ccec52f9ec11974fbc6975466117d23f8b9c78eaf84eba5b3a075a61b91aaa13fb8bf2ab237f1298b8f168cea8a7f4618d64ba522e6068a949f539c3909b19eef1160a331aeec6733d20a6b61013c2bf19cd5ae42867751c25bec75a0b6cd81935f76338d947fc09d25ef6a5a2438482b73f1e47ed4c27de55cbcccb35752fbd4f94c5636673fc81ff132243651f82d1ef22d02385f8c717618310c1139f6602c857f85ccb590e044ca7f039619004d54adf3622f9529ceed24d5ae2afd0c40f27a7c3ca10e07aba4282292f9e7c51b54fdc19ea5041f08c2e9374d610f1920df4ebef563bf287ca680c95cc25cdb29a8782402392af091900bc24463eeb1923b88d44a756767f5d46aefbb9fd696fac78397576c88330bccd3033da42a49e7af9f48a666853a89a65ce249e2e3ad012ac6a7e8af9a5ad9d1f56693923066c394288893a7a734baa4cd6d921c1261cf5ab7b24092dfcc8e57d988d0ce9f8ca8918b109cc93bdafb4832ce0edbd179d7cfbd62f986c72c9bc705d69fa9c61ff9205d7d1c3bb191ee1933a01a82af499d026e167e1bfeef7497f0ec3ac452b547b9062aac8fa6fde59036606fb10a55918b406948c2d599cb5321164c9ec3d116d42ba5c8359a738435b1ab58d7811257d2bac7d41bf99fe2711cf14fa977f7e8fa147af9bdfaa74c724bdd80769224527153aeba77c9765c8a5b09ae750d9e20a37726bb9955eda0fe5b73510ecbf003df91aa6666c3b1bc0751dc0371e3387058ca1578481acb240266f955108d09fe860b37627976e6736097c4c930a75b3a9263d3ca5ad7c4385704fbf71c53e6a4fd16d239206169052ea3607a21a87af1e8fafe2c321b7d60449be7d192befa99bd4b0744ec01cdf3e9fb4b90d5851c38b4f5e1187e443b3e53c2495f143cca4f3f1e43204cd699c1fb05d2a7bccbc3618ecb19198fd0a2251ceead0a014bda380b171255b36e40f20a69821957dae52eff01229a077f36b708976f6cfa6abed699bc015fc02747f6608cf680373105d35e3e8a34457e5d569f431cf25027ccbd73837ca8e3903361c5e69c56cb6cba0154b9ac52ea7caa9659783224b2f1a85f20e3f0bbae4787a6831ce01784fc563b5b29258066f89308bfbd5b9e8356b63e1a741a22809ba94720765e4d045e8ee3d9f372373b50aaf04a78d5aa51d59accd8ba3557fb3b3cc636b98351ca01b88d69bf1f01e833571f72315ce2aeecbaadd40cfed67e74a6963e2cebe0368457aa82d2885afe0f2bd8df8d3dd1eb0a8a33a502b328aaf67b599f670452ea6500ddadd44abcdd529daedad314e2a6cdae00b4321eb8d12f2f62e2ee493456223869433ad2a2068c21141ca95ebf52948a9799f17e21b19d4754a129370efa2a63000b8ccca51a3a5aaaed8697a28efda46acee77dddacaf37a132be5a3d470c15243f30753088ebaed5e5e14c46ac678fecbb7a8a5722f384cb40043f69dd35c33886cc78cec30ea2179e4fe9164b70a1aff8312028c508b35531a132ff2d45f1cf5ac753ea6911b9026f28fa9bdc978e26fd91dbbd033d57b19ffbe177a79b255b23a7731deb936808e112fd31e05aa9e4441319ae5e2fc672d39ad76decc3e26e89e372d3bb1243ad9c846d92f718996a543b6657465ea41b7504714c6d5e9d7bf611bfa6580cb062ea03c819718fb12bb6814e524c28551e1caf3b8d89b9caf5e0a8d5f052e152bb5207994ffffe959ad37b3e29e03b7ded1311b2cbf2640f7ee21f426c3c4e9f398d065d90e303cb4a439fc2489306732af0c2636217ebbf8962fb81546492ea4fc38691a6db2da6bc8f455728e4f7d93a4e47c9fa7acf7f77fbb40f537c5ce870be1eb1dc38dadc640f22795556ae04ad840852ef8b7da3fd04df68d3d40b0e4ed5255abb9c99c0c35bbdb5685887a9f72a8a8adbda74e17b26d41a701c3bc03ca130d8cf76f8e87ced5d77bc6b232d99aa450e29d843ac64da489092a55da2bc9ad7d8824876d7d34ca85ccc2eff0427abde29741578595c879377c61fff2a612a70b67e81720378e224c131e479c20377ac792502819cc4c75b1c84ec8ecbace8921f0ed298ffd0563931685c21fbcfc64679c73fdddb3001e60b598b8b0b025dc26ecd8c4a217c117c49e9d695f5eef012a7c52e0b9910dffac0be8d727d03e26822454f141cce9c546730e43454e38dc79fc94d895b09a9dfe91e52e376142f29c5d07b75465a6f6815d8158b9d3007abae2e1ed5956d082bc1038c4c9ad58c5de62991ec32a1f31dd249eb1a4366f6557f7e328eeccd735505188a1c6faa929affab32e76637dfec28f0c55ecc0ac24b6033f903a5ad63e20197ece14915da577ecfdf05558e7e59868744c7bb6e03f41cea02e2647f5269633c2529dba9bc29f011e6b4951866fc7757d9f3763323e5e1fac089add5e731866fb3547bc8b068d01bfa738958123b77fd0550a0ecbaa77bf0b297f6236b01079d180fce156fbaab487ad0c6d018ad04d1476dbfed20bf3776696bb1fa862e535ee3aa36f24295ee11f84ab212e2a7ba9f20b917c70e73a0d6558385cd9 -MD = 43e98dd681cedf885992d37e500247fef6beadebc6d90eb05c3cae3d808daee1a483087606b5b9774903ed672ee9645b - -Len = 65968 -Msg = f6bc56734e5ebca7c400076eb49f15c27d33cd7ee185a5ceaa4167e3934c36eb6557cc4061b505dfde69a11d33844595d7aec465c7029d9a281fc5e82e7ba69f3cfb67da4dc16ef9924623525ca8f7243d45a6cc6a88b83c64034ea8d8be1b82c3cfb1a9d92bfede28bc1677f9b43357f720f91d93c0ff9ca6168c8c58bd9e7e42fc3116cf9bbd74e8f501f3d04fff164c6848bf085179a2367f06fa781f367a00a96f87f5b8b4a419196c2eaa2265498645181a92e52f375b67445bfe8dec5f46fff465152bea57054fdf904ed46cd8ebdef396f82127415ff6cf18b3aec7135c264719f59b6773f2c0e381860e1cabc45c609b04af6ba988532e975f2bcf7f8a45f0095eb134e12994ff6918787eab58e6e8917c3703581fa7e942caab0c8b1885789f1715588af2f2bcb0cdb999bef1a511e02960f5356b198980bbd787204d0d6642ea6edb559402a1be6d7a76cdd5c166f0d3d34b27b6d295b8fc574724720642599d65c62959ee36fbc0621bc14d616c2a41380d1846fa955453d25481cf97954ef9a120f087db03d08d1a9280a1adadf43d3641ef65b811bb89f0b71dace9e588c6cbf19167f391a39e49e3f419ceb0b78d75f19459349255665a77e25123bd6fcc8a42f4415e67ddb9981403fdecfddcfa9e24ee6a979f8ab1b89cb6056ea26bd2871a015d440de7a7af2f97942e1dc94c59e3e7e209c1c234b12f8312f21ee4a26981a002cc0c2730353b9727bd97e84b4d356607b17f65b5ee3630bed6b84202d97fb97a1eeb071bd341ebfec1f3a0bf23225423b861dbfd17bca55243f9edbb7f1d340b6332ee3230487b6161ba586f82b2977c45ef8cd4d3c6ca1560674e950262f9fec36a443bf5582f98c5737a2413ee185a81b2e101ca5e8751568ccb570b57f09b651a70ffc979efea16a66da67eddbf079431404ea58bc44c4cf0cdcb4102022972cadc4655b4a3a17cdb99bd6a8775caa5f412810c5669506b19bdb74d6d15f21102efd8401033031e9b66317ff520eadc84c063a6c55ea3da9101e4d6a0123c6b4b117c33968759256d3cc9662ea9b06268b0bc1ce38b8dc2e0031a85a1e250a82caafcd64d87eab8da834ec73af9645f284c5415b5d8584b8c2920027a6b76ef2e221ed03d1c000069a3894922f74efa4dfbf23a452e4a9c1fddc0f43397f568d7e2abca6e2ce125a2043f95ed8ab55c5e2460339a73adde2186c003d24d173cb2506a6be9a0d64e0d0e3b53a39ce3ade33164a7bc91c738188be9d86175229344d5255cb56127a3332a442a4d141e146589c73fb46ee1d38e56031be7f65f9417daa244da561c4d9bbe21c2f2d9afb96b9450a289f442d70a4ed6746dba1668b2c5aacc6166fd74cd349bc49ad5dec57dbac9784309346b15db2989faa88f369dff059c517b113f52f27ad84deff2602363f86beb97fdb73665c60596a8112761f17b5bb27ca1d7b16286a5140f35b1e6f7a7218785e6e4f554738e49a2e5638502d4b18c50f56472ea86d4f61dede14dde9c4222bb371ada11f9cc1c7e54119199d748e8e1550d1ef4440cfc026317e180a077c12138806e0220691624a45a0d204ec5cd1609fa3ce786f62da4df7c28467a686e9f313f3890af0a407d1d6582feffd344d75854542b153a91eca838ac96f4bc301d697ec0237059a06f095b789bb218540c8c43ee28b97f30c20872f5d9d41b108329668f2429fe41e3ae63755f313c059debee9346396d130f45538978e32f14b9b91f2cf9a3a128c256a603b243e85f73be7ecaed5fad41b9a802f2d9e99d46a761d01f0ca6e95ff2474ba9fcafc46b744c1a1c85f1e7c2aa79a7b866ae10ae3669a2f1c4fa7eed5dc97bf0a53e773089dfeb1076b8c29fc8006c6186f92e534c18bc29886609dae9265e5e15b8aab69bbd192e287ce7dffd857777a0939f3dd2b7464fc2b3322e80a41b7db4e50406902fcbfe0305fe8a304ff0821e450c74b18e6aecd9a9a0f2098ddbd5eb8c2e27527d2909701aaea949a7000867d51d01cfe54e873510fc2e6c27c5ec2077cf21c7ef5cd6d5859f422fd5cf93e30b79eb16041aa83eb0ede891bb024cbc6c90fdd9cd8ced9b0c7a60cc2184aafab1c93a6d32f7d75c511c2a6090b97d283419c26f5ee0d72b78e70807d247d6148db4f6bbb90d9df7ba30fbc1f01305cb97117870eb811beb908d44c832429d9969e328eadf838177b4d2649c21386e0c5c2028c6bc9741451e151bf7879a8af10bfdd8e1ed810c4407aa6bd96c4f40554defd9581949d2a0e826967d1a7a22843bab0c882a31c4c67b5f1b601980010d3026930e4abf5564b869bb403308efbbc395cec7e0b93365d79a791970f53b9bce6d5ed0962252f8548694291a6c78fc6a6225865541e18ae5028fecb9d37569ef6a4386479a51c68424292016cf45b0f7bb1aadd3f2559b6b4064c23b4538de5ac84918a34edb3512eb800e7059df403347b324a0f3170232fb00813f710b62d92d796ef36777adc485a3d97131cd12e6affad3046daf2502dc6c130d7f765d3242d9717e0cae9664979a6b5e809790d79af7a34988a66ea38baf5eed9801372eae74078e660759b8cc6baa826dc621d0b1b17ab56b8244dcafd14c27e4355995194f19699d0a5c89c920802421e12c979c3042923fce0e76f0dbc4028a99292f2d749058d83f089e39c1d48bc3701bf6027ce1262b0f363af8d4adc7b2b610c48fea52a33f2fc5c1c2548d007cfb55b28b9e41ba58cf23ed6cc4f1bf8612771beab94992fb61fcb80ce395cb740b4296e09d4895ee953d5af7b3772f2b37c4fde4ea5b6d345d134cc075d334d2274a69a981e00114eaec483faa2762ccad61322583727b11ac744586132f83bfd8d5f28d52f044f255987eecb0e99f8ffab482568f7505bbd5856b05c491ff62a54bfa35195fa7b15ea9c5a7cea52d9ca827b51f134c535a60b086e690e1f1e416144949de1772798d87e5180b43551c3f20922719dfad15d65c5dd07f07a16cb398a770a7ffed716b9aa6e66fab5f374509e217a8165b14bef0b96c9aec57230540dc527eff60c27f4bd0b902c6931444496d96c9d9a480a0d66262e8765b309372af986aff129351002a3bcd7a38dcc348fb4d8310d28104752059718ef4bce597eaea74e74c0d6a227d12d7b098b64b6e54e4dea32b3e7335bbfa3e1d6cef841853efa29f5658511a91e62851f9cb63233f02e27af8e0757efaec560909f0f75bb350fe10789b8e4f2e60c943a44393cf864f987d808e90b8a6d7c23c14e8c6cad1b59020faffaa281c27c170e14563daef7507950d714e4b8765889cd4fe7acc77c45fb823ab2c0f22e418bef8f95cac431937a8e5b136a0653cb213935b9ac86b2873c13cc79c6b0a3fd717308805ad49e6319f5175d01d080447889726ae287687d4218d7d83a39adf0562d21ae646cb81fc6399e5a52b386650e22a883f53608a8bc25ef368219b6daa8726d688dd8f95a0db052a3c33bc09d40b92a9d4b1f1d89e8af751d34cd490cf6d74e572dc5fc826eedd6c1d9b5d97dbea17b0f5aaf11a18639fc04c8c0ff17afe046f2ca901c2958668d2d1cce3b56e6703c62aa627f7fe34a0685c491238b6211d9b3fae3d2cf58aef85df2f160d936a9c12fc0d5c185ae540708aeba60c88be09913251ddae4fe1baadcf2bbd4754db2cbdf2475824335dc8005fda9315fabe0e7a8dfca7efaa7511702a27a20bb9a2f9ee95bce3c492868042627fa1fc1307757ed91665980e2d3cf9778d8bffc9a84cce6bd5c5a07e47af5c1b409869db8286c49d07dd5083f1826e3ec441ce8cd36c85fef8c55fff889e7612863f035b1788756136d8c012a92df808348c1e0a0ca33ad68eada91d3196b9d0ba5f739aafc5b8ae0d1d90c23d83be5b4533984c3c371579004328e12bdd4cdc42c060a03083b60af376679c96cde9c25f00e35949713f71b45081525cbb58be882a7376840b960050a9eda69a52a0c2eab9a7391d99e046149b5f79ad7a05fff265542391a581158d7fcbea325c0ce54e278ef59ef71f7e87ee685c06617a26ea38aaaf41989fd310c0a970473154b2f3123e94b6d225a3740f440550b7e0bbd76d1e237a2e17c142342e3ebf1aa2b142425f1e4c741a3c45c79c7c71c55e4621ca578626ad12678ba2035e845f1b6ba17e9a9c472325d261de18c753d31d502f18fee02c5eb74e54d4d0d87c48e967798f971591286eec301c5ff0dc2845606b1eba3a74892ffd03903cb2911d342d333efd9111cb1e121a491afff60efdff3ca6349be676a1fc029feff6aa25234635517418af535dcd872cf0fa88cb6db40a76130b6a6c36d4b7c992acaea9df39e990a6b3530a52a3df8e8aeb7aa8be073e580092e8b5160c8cd5cdda87f1908eb6c53869e536261e8a378fd9b4ed18803e11a3394897682ce78d478a1c455cce03b6d5434d2000c6f0efa8cd1de2a2a8736ca307725b55bd32b7a9c355ed6e803a2c2347731009227a7e7dce9fcf85064530a9054e480446d41c9a8e1a30ec2cc2efca7f404d69ba8eabb5e421fbe8231d245c39c5a89d4f3584c3f25358ff5b03c773f39a214716963ff9178caff485611265adbdc14a60bdb7cbf7e8abce93657cc6aa6bd2cbbff803f070c633d1b67bc06b691fdd3102d47c5ca5c172825f50d56aac99a91f3c1ebc43f6b8cfa63ed1f61773d4427abce29c1b05c7f442442c9c08010dee68156e3599b24acb9ba3cd7e11d5c3384e174fe0b21ee07b37cc619747b2b0e9d1d352359baa656eda6fd51f0097d309d59a830dc9f8f54d887e578fd0c569e27ffd3183f1e8ef01882953a08cbfeefb36cde7ee079cefb35ee2764b4a451f209d1b72e84274d2ccd05aaeca5e57fb589a38e14a1511b4f5e18127955e37bcec51b57f2c3654f417d8894e651e66e1662864dae89a5f2e5b38e2d033b4a5278ec354bf1776923f2ac83e9b3974f58a6e09d83b913f8f432d8c8edbeef396484e1d7f9a70aa36994cc902fd0d060bddb7641c6a0daca8ddb2040bae8ec313077384bf78017a46ecc7035bdcaa7fb0c28b62b9d12488b2e333c9e3b3dbce234c47229bc1908ccc1fe19dd4a0d985ec21302b36d69e7cb63df8029d509db9ceff101f9bdde68bcf1ae3bff2b160c0c8e2efe61be3422fbad349d8c2ef9b2f1c0817a34735cb1d58c515933f7707da4bee10bbf15fd94ac98d6e73d9f79ed6164fa4d5282f07ea6e08be3e425b98787e2bdbd33eb22b74e853aefa6ad06e56c3bdffddc534619b19cb27eb83c3d945678298568d430056210d5396fee1d3582c386fe4a6ada2d861f699c08b1894e610db8e6c637c20977ba3a36e1c94958457a93d12540092484f715ae5e1c38f06811f063b4ac453e0fffde7ab4c507b814ef9b28e5697f994ea24b2830d2a934bc13448eec98360d9b3036674167e4ef8190e148134d89f643bf7ebc298b7675dd7049cab69221029a19e6af20384d690bed2ab12772d4c5e48d34cc909d1d5e5ce764a9ab0072b79d1b4394c9acbdbf2472cc16aa6fdc72d1b9e1cc1e8dfa38bab7199e5289b7970492e1cab63bb25c5bb039cb049afd977bc42a4d1be4b9af678dfd3b15946c1b713f55b37e7bc7bb22341850de9ad4ae531a52c22117c82cf3da73e29ca71cdf537f03e17ad37a76186cdc4a90d5ee21e84b1fbdc6cda23bd00b12272038263d3bb060d743e926f79ec8fa1ab3d2a68cbbd4c5b2654cd4469cbe5c9b78ce34cf9a9210f7520379ca35e6f643b0179a693e260922853bdaf7aa52b7a1eeefa500e08288d43dd8cf686e2555483e2b3621ffdd4e90bf0122a99976b7ccfb03136bbe102cf05fdfb44cb8329baa8674065161590a8f7b4347e6ea78d18f35aefc8a73b991de406eb501946d3ded519897721337c1713258c73a0df7996b2749bcc7a1ed4bf0882c4e019353b08307ef45fe85e807e88cd80d0d847173e33879f0bde939bfc98f8edbd72574a80e120eae7129e84247d34795fbde650579f1a624d79a0d61ebdf1d0afcdb4e68d1187d4d548fb70521be0e0e6f8c40a2b1db64c59f3506d6b9ef4d47dd255f879e83918f2317e2c508a5b1b2e30e92e00d6e2c5f9f5a8492c648961f12841698a8dc02006762ea066f12d94ff0e5ea51ff22635f327b250a83638dfd178801f0929a452d9be14b5dc78dcb1203a2a55d0980a041030756b293d8ab6e6691b043ee36b1832b23651f949f2dc5b5b55285bf0179a18b9f983f5a0064ff8a419ff70e49fd9dbf99e5d0689f77c7619e8050723d460d369477e55883510cfd082f7e853c7fc9a3c54c24b6371f83a1eead31d59cabc09e96646911d9d6232965fd6ef596ceb38235e6610fdeaba6f0f637ce5b97f1781e05ec1f186c8aeea9eb783cb1e150d7d55c6339d7fe929dd975be7a76c7dda04f738d9bdec3e5ac08f92e6c4c94aca307b94103912f7ad4b5cdbfcab9a4c6b5ad6fb753c7685d07912f8e72483948a1b3ccee42ede9bae8306eaa3386972344b24af7cb74d2776e0cef26e317379b504417e99c20a5d944b3e91c49804799b9f895cd87698acb6bc6c876335c283b3b432ab163ebec5c86cacd7471191e90a1daf0b70c1809af7d493c0ae76973aedf3b65e43ea245cb0aef7c414ec3948e88e3bc42ce02d7ba0f1eca3373d1b25c988759e080d61a9b5d8c760147123209dbad88df41ac6d61bdb1e3be7d175ccb03d18734df0a0343fb4c6b42de778f891692c70b0b97434cf5ad28da47cceb70bd847e5fadc0786b7089ac748985f592c63df7448035e1c2436b0a357844e6f4022a9fdf717be26839deba14eca01cad66f9aa1a441ad1682365f84e9321c7bb9e3e7c22ce9ee9c0d3b624b25c685d3f7570500adba88aa5124883840ce6163dce3a83d829cbf71bca9a6ccb7d414fcf7e1c79849b81861f9c6d2c846a044b013e99574df77582cf7b1602cea3bd6ce3ed68872618184c2e2e4e63be1efeee9c5bf56712dc1e25528193874a845f2d034fdf294de5ef55675486b99fb058796592b923c52c38475b6aad5abd838918b4120ab08a69793a318b90aea7b28363f39f6f1db38c56713092ce0d9625dda85ce055bd6a374853334fe6b3749a1236dcce81d58c50eb2b7896700062dfcf6484175ab04bb3df48e32e035874db877a77ac8bbbae3e88ee99e23de3b235d0c5c0438429cd839073a782711e36fb45a76ab60760a79992332b02722802bc745477d16caa5e1b1e7c1709ba65297dff361c776f34f6e6a9819273c73db2d84c99316d7e828beedbbab81039ddcad7f6bf036d3dd91aca316276b2a795612dabfc73642462c5735ac7e12299d8999dde9ab613fdad91a8cc4e2e4b9ddf8c0124f6c44218cb994d1e2c48dd34f624341961bae81922ea06dcbd4fab047c92073a309aa3a62d75d08840459ca5a6e93f29ac78663af98268d528516d95ed21a47e026cf556e8f9a24bbc7ded668b6723a1c3752abd61f9435827c9efacb1a97d4314c1b3c5be8336bae9484be1e40c65f44f47822b1ccd2ad8341fcdc36a97d64bc01f6b6cfeb102686f3b34c261679aa3b856290e8a6c93d7c5c96474588b63da9d0c88a729f199c6a6cd34628407163297276bd23b55f2d9556d603a3be28a7213ef981ee0c371783884c75cbc498d236441e7009027dc4f8b523d7f653bdec4cd5f163e83a50ddf8ce86a1b8acd43f8882c17342940c4bca04e48ce7505b53511c19f80b324d37f2c7ea9297000ff14ab4c68c7774f20a36c883ea1dbcec23589bd707fcfb176d99f9de0f0fc63031a263978450a81949618b67b9419f57a58bdb945a669d94c714eecbe2c8081f47b8169b22743a675076d4f8c1fa0284211063b9b7ef21ae8d8c2e1ad16bcdc47bb5553a308c31c6669b2c9ecaf1ec5bde0fbbace73f8e4c06283f31a5a01e0714c1a8dc743f961dd5f81ac19bcd65c426b16cd7b2ffec567b11ab7a250e02d05c0398e9b8367053e3b726c9fd3775a73f1dfda1dfd743b3346efa5b1b5e810799a4acc9c218c752d9fdd81eb8d725ec727cf671386e9c4d7968b23e4d37a39414cb6de55a8ea401fff5b92894547c7b07f6e0b1836dfe0b92275d8a8542715f15a161a34a400e489cc450505957823c46b242c8897b72d5c6d282a78927f250e44e126c59d50d0ff99525fcce87401877d9a41e1241ff935f92aafd218d2e50c8f908a94ef6a93e5f8ec195bc8dbdf5e1928e1be667ad2da38e5cf4171c2e450bcbc9c0f24aebbe14d7ab84eb1002bdcd068927cc94848cdbef20f4327df919f3ebdf1b0d7ada7560996b3023b91556835d1caa8d708d964edc7e65395897b2c981d220672d7e4c8dfc8a002c3000aa4bbed00cf1a4cf34467effaff55411fad4b72839c70ce02be2278f5ecd1ccb9f6d512cb5c0d8524f09fc2a3a2e1a6ed75eb36bcdf6be07fba64302b1d0257c1f3040b80dc2b31fcde07f886eab52b633ad9d2243bdecfba222776c60fbf41d11deb0fc7dbfde3d98132f9fb436a3f2f50a9ed605e23ec50a9eec54d51731b55cbdcb816b7e01b496ea33fa7295b52905bdde0e7a2d5b6c1961c94277eb844dea16b9ce40c8c38db1adb41e119131634b0e84520a68ecf8b9b537beae4193eca230a26b6565cccfcfa3d995faf2bfa8ae45b82a1d599872d1e05e51e2df099a6c55ade1401dc582da15cbe69480060119a9a41f1bca08e1492b65827b8e8c5f30cb02b73bb856afb94bb1994603af7571836db86d81e44d09de75dae116c444d6dbca75bdfd265d548db4367a42610d9f1b3e7e7946d3bff841b5e07d3f5b5047cd2da42db5de949323fc469706c5d08bb93df8a8e37d3d009c4e1cb5d1f68c69e952cbf5a8255c5e54b051051783c61da592ae621e8bd208366716f29340fe257762727c9ea4be9d6af9dd2b3d42f73e26662810c1a583f95829579d4edeb064be84212a5f03c138abfe747340aa6cd486e1ef1892725ab94abc661cca7baa0c07e16167b2e96e1760e89d44e7642cc80b2a8ae45a9b5e315447cbd9cfbdf2069aa0b99b61fecb23d0dee106fb183f03fe6a81dae0c79749bef20f3a254c923bbfebb22e32ebe3424509c622456dae6ca7c85d64ee9f0eeacfe7b9a993d19292bee7d289ee58bb5d0590d6fe8a0c80ea4d6da4e94acbcafad04b518de3f4f8f2debea4125dec5d5d599c9903959dbd673980e1d1bdf2d36209495f4edb5cce456898ad324650d028895596992dc76dcab42a99830fbc320bc2066c5444b21c72a49c7751722c1ca8dde25529193299fb0493566908d3eedc43adff06e59de861daf389d8aa274ac39d6c5e19228749e171e29fea70dc0fbcd364a1ce88c63cfa52c46b2db4e96063101a3ad3106e83664540fd6e0e829e95bc53d913f3d41f255338a6ba581b696f7f1570bdab8e5171c6d4f75dab6aa24e44a42f3eef709aca2777c1e660656acf32848841ba90baeb3ec715200f3f23cfb47c2bb54442b3d114a84418926e6d6b71900ac6071bc7baf340df1d02a72a00540656e1baf1742263f4b7bab8df792b84617fb458d87ec72e68debd4c4abdc96b67372a1926e5a55c82a333985f97f7b21e6f72766fe9fa36669968b4d2e71243ca57f928880d43467b90ebfb97ceb745f0606a2987103b5563988704e4adc322553cb4b0c0f4e26b06044aa82e265383fedc0338c8f973d1876480022b19c4513070c57975a26b114c89b869cda7b3b5716aa56ddcae88f3f984bd774c32fd18847b924b5020c78174a69d041c5abf227093b88e68376403e280a42af20056be79e385eef975dc03a7e46142c246601424dda464179aed4969e19fe5c38cb88d3632042917a994de0dc96ceb68737cd1b4d2d2b78ee10d0cb72e156e67dd09cbe4ef79c652c5d65ccddf26c7b5eafca249faa84f7814ab96f3ef6e8e87fb33c1aaa34b8b54cf89c310aef89d52b2c9cf0bdc8ff37b39af2d46ad110dcbef1cb7b1d5e241c2d2975cfdbd4837e6d3c9a02100f06d3f5a001ad8ee68b3dac0aef4200da6b047d3e76fbd947f5b1a56e65db4ee31836d7e88a5d03dda485d76cfc220d4ff9f89dc614477bb06d29642074deb2fbcfeadae2e15571fcf93fb1a6967d9b055d730f4ed2254bb4364019f14b9ef4af7a5a6f1dab4941eaf5d5db3632c722c1021e52473537c1aa0d80476f4e9e7c74c42014f74c8b0c1e36e2a49a55914cd98435073db1d166384f846ce9125fc2f229b65d0e59ad290d18e0be51736e61d550518e90dc94a1b578a70afd2b55608e07a7b7d13722314e285a88da10b11a3b031e58ef29e42cc805729219fe01cddf0a5eb5de798cbd47e1aa84c2b1fbce70f8d616b70e623fd69271a2de0f07733b9e45c784953f1590e17b4279dbb1072dbe3328770e7183779c2eada7d2b8e94a30177d722ecbd29f8427328df2735cb7df900eadbeb460118ef42315fda8a8716c2e38158ab58cea6638e56d9ab527a5b97749d9738d8e3ae78ca386c4492957af1487ed5d8ead07e44acb9748f8f08df8735a78e16f465a32329f98db3cf44375450d77fbb9ab5eaac765a961a15fc7090ec10a6cfc31060b9087cab6d681fb5b4a193409c91075162934028950cde757941e1c9aa6c6b4b010ec7acbb86ab5dd8e3baffc2f74d1b2fac7313489c37580bdb21deee17ffcdc5e4e47ae55172958abf55a476f310afdb69fc3d7beb8d800e63d8cde4ee524fcb31dbfb33f0fbc690dc6b1600add7772e71e29076246b554a800e7ed416ee37dc9eb219ed8cce59b3e4043fa84e2adaf06d2df3806d563f86dbccd805ba5beec0d373ba5a4c74b4bb7c2806b6fe9140e804e64de3eed8a68c1c19c5c1001fdd3f7726c8c3597441704ee05371e49511dfdf1488e5d178f222eafe2d4e10c46b2132d12a70da56679a02330e2229bdb69da6bf8bcf3bbf8b11ed82f6f513d2ff2dae7ec8a9f8a38d00402a2011f49295ea00ef3ee95633da20cead09fe31cf032c90348ab6dbe21d6bafcc6f866e9b178e95ad897a4a5e451935874eb19145dee783fc58deaa9b7ea3f721e4c9bf60a4500e0054cc3fc835c2c919ad565cbbf8232ddd1a6b8e561870c13167210e69a5f913f187255cf713e5336a0f34b9bab9ab36dfb8a3ae9c539ab505e1d8833f80514b870acec97545481b825a94d1c98946470a1acf33f497e87aa4383448699f205fcac50fafca35b4276a78becc70d0bb0867293644e74c23b916567e826f682ef6c2a12f367c49f002294ffad137f6d320fdcb220afcda13196421fd5cda4543b97884788515ebc652c7c99008a7635638d4e9d9acbba980439583fbfc309d2650f35830c51d82fcc04dcdc79a477f0cf7f56ca453ac2132deb163be8afcd8a0623b03a01d1a765bf3c242e9af9fb3bc06673acb2758abf093c1a88f2fc35d7997596f10b6962eab942e123c6e3865300c323d964f46ad840acb3cb6120f9679995482c7b71814b44a9a24090099ff2eb25f5b4df4fe91b4eada067b5d67ea670d34260f49298f3dbe0d60978d4ae77fa0f57e373d09bd49dbf3ee263554c10d9e02422e94500710978fae303cd487eb7dfc8d9d53ee9b0b8720dcfec45d8431f2c5bd6dbf15e4f37e28f61a35be4539f17d70c75d3591c193 -MD = 4cc9b319af23213a45f5b8ec966905e20aa06248500cc2bc736b171c9fdcad3d67493f930753912d82125e8bc188e72b - -Len = 66760 -Msg = 5ab80169184541393a6975f442ee583cd432d71a6d1568fa51159df7c5b8f9597f2b025c5b2897344f1c844da18a54d757aa6782f057448651282fe702dcfff79afb2a1c78ba22d3b41fe4f55567cd3ac5a5b0fb82ab273c152d26e94824d6609471a030d9c3872052babc74c74d6c6b0469dd0c8bdab922866faa86ff59269c53d58d20e40b71230f3534505e03d974fe3e143e73ada3438a35e1448f4399b4c16f1875035986e3d4d776138153bb5c996e7d17a2e98da40ac6f6ae61aad5afc5866ab69d766e688aeaa7449a03bb2cbf40422180591e4fef6b0f49db5682954663aa6b192bd2ba17b4f26c10dc80eb57fb88e476c4ff4b1f6c559f660f496f2e4f011de13e5ae2657e7d124ba6b3a149e87ae7eaf1d8a08411ef376b9cd244649097535c77ade75a8f70beb329fb577d4f3db245a9505705a2059950c6c41cd06e9395f2a074d1e031f4f9b02c0114da78fccdf0b40f768966c14e7f55c7ff5a331d6b0b7f56a8deaa3149aa796ce04aaaddc151dabe08faa649dd5e1185f6ea255f5e0fdefc753b434e3909d6e5c3b52e0814d2e305123faac5ce57c1a308688e7ef566830d40e144734e350c14c6014da651da968b9e40ba5eaad02fcc3ebcb4a5b97936320fb7f5ca1296e3a0f0174cdffdd0bcf9b3e51e3bf73321a69ecee0fa30aec113eca59d780c9422324adf76daa21e1df65a161d8640e760d9338659a5e46eeb57de9386a8c4989371da4112c0c72b812b9abb00640a54b40e02cd69cf5d227ba7ee69f680c308fc06aa2667b8f55fb03f7bbc10ffdfe2e4ed158956a021303aaa220f3628904e2698c274beebb32271db0501927f46f9ba1d73a4693fba02f009846e8ec9b3d0d9d028155f8189dc8ea74172d10cc801fc472404ead5b0fe646b1c6c458bb5f8dc56e6ef92a1fff5cd4a36f814ccec62731231932189898e6079f0f2a5951d2df9d104ec9f739ed5f76dec79a2ea3a84e727a1375584cf19aadb0be9f41073d6f6e988f3cd20ede5d4b76cdec48c3ad0202d7cdad0ed09070b3872377b23405d9c477ceb66d0758b2bd1bd10c2db75ace5cdca63d8edc0bf4b382fc682f70a29b393e7beb0aabc30c562e7f6e4fe7281ffaf94bab6ac7bab3284487c51b35ca20374d253f4d74c3d6b13f377721db9b8377ae2c7b251c23288c4c8432f80bb3053934492797fad18e38ce87db362d3b753d6ba7213051dbc149fb4026686b13b6d98456389c8652bf574ceeff0f347e81b6d26a323ef15b19fbe16a13cecc52b172addae6addfedd6b74aeb471f89db259e42d422838317af1c9f507fadb80681af1155b65e400950c338fb67e9a5e7cd3e6d7376b07fa7dd2675a1ee77a685a3e97f452c206f1bd9f5a79dc5f0011b052192d6a3485f7230a404ccd4df2076a4ac1837cc96a5bbced90740e5b543eb59e2536c3cbd9b0d460fdd3fc726ae5fe0819c9bfc239c5fabe7e8934bbbb6df37fb3fb2b772dadf99e46f7939f0b88803e47ce04f49ab8dfd9cbbf37c85f27d2bd6b828881a677f88ac2c17b1cfd7a56b5f39a34a8b6bbd308201ffdc768f3ba1ff4d5c4316e953bed1a389a316743ea35c4363526b4563e1125af6f03fe5a136ff7fcc5cfad8f288ef665d9267169a28662a9f1b6bd1188bd817975c347e345731bfd75a38aee2937fc4e20424576e86f76fb4ea0f97519d4dd85f84e6e16b8f409e2baf52e38a5aed7fd58cf08f223b9a834362b8f09591ee0d9deed997bd4b968b37e0cc1f804bc2d7a6713e563ba2c9f5d90a0a855b163337f11e8f19b028ce176a8316ab3ad29a7cb375702531790047e44476be2876a7d7f77879dfda8331c3520ac51f30abdecfaafe28749a1ad7e9d3968013744fc67dffa12c5293077c0f7cec59f3f8240a50fb6fe9dcec04bb6c4594b91dd51e199a981d093a8002075c59ac47c207d79791036f16c69dc3153fa8b38445a14e1bae5f30a2d0182f6e5a66cf00f1d6331110716041ba25d28fe48b7764238f7c372993a08bbbc1cc1b6a22c9281be9d3014fb3e7fd201acf85fb4c54eb2fe61516bcf3d126662384890c1c2f2f98b913e2bf595aabb0f2f691d499e08bc35ba514a8ee470557a3d541c0c1658a00da823fefc05ccfb534f42e10c28ec8a64698cbadf1769b28c93ad018a100c9ecb4aa63418762fbd55744d52074c414113d8ca61c8be46a220a21be84399551a4de0917551ce19279e07501941f3510ccb6ed3e754c1504fbfd1667940977d3c1cd0aa6bb0f6d361b56e14ddc203621112936ef58808cce1f08a555b88f4ca2ebf84babc3cd6a594221361479366bd7873af65336e7c05803c35b13723968515be628810fe56d6e86e5cffffbb02aa6a732a7e480d0342522a3842b41a67f51ca2d4de10fc5fb08420b3b5ac42c1700f9c6d82dd6d86ca8242fcd07b744d6468f241826340d77991c07f4cf63189598e75de389997eee6360ce923333932182436113db2d2a87a36d7288d878f44ab0f86e66a259221de971168028572fd5a76f7abd7a5b8b8fb9cec163d0464d9afbc58eede286609faccd8df371926967286bb7918e3fcf144ea87b02718b830adbb725c5d4b1c8d82fde9b788965de5a87d0de2c815a6399c49306012699431ed345c99af36bb94bd54cd59bea51fd14483724eaee2bc7a4de1708ec59fffc4b6509f0e9c904b08f4f60b2ba1ed75448dbf742593f3489b9dd9cea0096302d15236c222ec01d5d06f0e2b97f8176626cc5a9ad03fef5184d55ad3ffa65da44007104d3c66335fd476c2b6048dcafb5d4a7c6cb57a7fe01d3c8b05136434edf91e03c9c6d4cbf4fc513a33da26af3bd24c4b733d0c4bfc4e1c95ef440b90e5e4de39bd27fc749930479f2a808c6d2e6d1df236d0bcfaadffbb9f16fb621b95ea91dab1c7a6d45858a119236087addc1704973ed75335fb1863d2049e327a04f17d0d2d0e9c93385ca8cfa7e1de174eb6486311b89aa3ef815a56409743583ae2ecfbba64a55a4224a1ea3d6b5b528b33327d39dd56ed9022e852524c5d5b40a624ccdf3188d17c98d7916e66c4079b770a0d3eac52bae7e357eec327482b1d236ea725dd0e9ff0a191edc13ae2dd8769183da68f55b3faaded54198ecb71d94311b413d0ff6ca6251626be507d7d56f0a333fbed2680d366f4a9dfebb0d57ded571d317223e2a40daf63ed0e5d8e10f6f517c42e8ec87af8b2189aa5bdfe10098607072c41a7f442a4ccd7dd49b9be6254128ab95533f54970c6d424bb959a7ee79c1e6423639eab3d8b03260aa6661c094cd4f8436b4e4375de14d071412436c204fd838fbfa82fc2c5f94f68fc130b5bec2a521f158dcd0b86e311a9abb4185f672cf24e621cb87aa542c22b64ca19941a142fb3dcb8ce78e6c84f297b550c05ec341828f6012dae5065e51b85952dfb001bf7c565d93005284bf2ba580cfafdbb9c5ce4206075a6f1ea2200087b2fd7c3c6131e5bf7dafa71f46224eae3ca90fdec284c8a407aaaae5ae0a1948508718e9ee986641bb49fec4c072fdae16403daade326dca92302af3c86c7d2b99e11872ae2c5284ca63bbeda4aa3d00eb1a17966f43bbda458f51d187e3a6921dafed6f266a25192981812269147737397b1039fc553d63701cc20772fc202c5a482a47edee684f5727c0eb945e46c17ff7a9fe0bd36cf6d07d0dfdf012745abe5e31957b0596b7e1cb0da1acf426203d24576b244ab4f4b504683db5c30d9dd836a5c0446c3ae347efc9fd19529fe3df65ab09cc27bfedbc57933f0a8a76763685f960d07ecf52081a785670161e8cf550174279f6e86244eb018a84d5296437a0aeefb5a9ce7480bfbb3637ab1c7c0d682ead9444c8c2ed4325a8ab3f90f87a3b28d54a99a2cb6053e524d67e3441960243b3d17ddbb023d48201e43667a37caa19aa35baf6d7258b989ae32bd06e1dd318fd881e9b8a7733a92ed63607e59d71d3e6dd8a35282eab4810d4208b62034ef0d34eb372e255c50da7e7caec3f7b16fa13c873e82f0a57761f2ff8bfbdf4da7ded8bb90c385e2d21d59f719f21842dfea97d247a6c4704952e5d1107e2510a0294c5bbc1fceec0786073a69b3c571b442072088650432747c6f205de6fa652417193183eb0861383a0faf66ad052638d013dac768bad53e0617543cdc663479d0c6a7adcf3b2bad64f9bdd789e049b1bd4366cd56ed40f01966d572087265e87bdb2301727031ae2a4ecb86ee5ec368301f2d62d8a65bd1dce30cca1125e0b941e00f487daf5b83b495433985887aa55230974d96ec0e2b78165f0ba0888d34495ed24a97fe91732b568cb9f66557b04afd0d5837c74144148737fc5ca154a1bcddd4cf6967bbc7b71a0ecee8fd42d0410ef549643fdc66d9bffd67ee7a1e47c1e37d9f9bf1c1c87f67313f0359244e5fecb8e9c45dc7d7ef451712fd1bd16f81fa3581d4a48bbbacc85dd6f080e372cb1ebf000028ebdf7da1efc5328a576123a9643fbc8902eb65c2fa59577a6984ae2c7156bfa92ec8ab5ceb4a35d19665d079729ffca70c9fd3df7091df509ccc2f9f35b2aae679d8a3fd7568adf878c3b0f0c76a3c07921e1ea627463109669277fe75de68e9b5598a0cf4e64205e4c2ea98cb6723af7db16d9f8840f5adae1dadd198a0a2bac8918b11d08d9d02c1aba7f9e7605aa9b3a0e853f946d2455cb6faa106c1005f9cc9cb95702566f6f9c60e99811b89fd1e33b949e32270d857a586f4260929e2174875203e7644ea735b4802036257b1a5b20509af9a786e89327855623fc64a2358af38a147e0e517b27cbcd3fb6ccf2f64f71cc377920fd9a5f949212d7ea0a73fa1670161e2efcd13d34d5bae715ea692b409898065c42f45305acc99faeb8a467534c78df1107dc5753f01450e67f1846758677f9a94735b460fc94ce233b6b550275991b5510f11891a2f86eaf1f8823692c73ad8888d2f62f0810edd8112d45cc92035d8b96b3f37644c3bae04a3d4493e107bc8a76609ad865ca693dc86eac1a18443ff517a97a9a7c02a01a8dac1c9e4aa0812f9e4314f58c3dead4cfa41a738ee81d4202260046af21c8ce68592de0dfda95d86f0ee6fef1c7cd3d9561f3514c4b9ff2e4ce473364cd8f7c58c90af4071285157738a35d1d049ac8c82cd93bf6fb12883e1691c923528e94ed70065056e4c9773534bca88480de16c6793eac15832f628c738270615d20a884e2d27e45cdcd7e27a7a569ceb901981ebb862a0e6031124e899bd1a559f037bda5e1e66a3a1b8adce5e00932099fdd4f78622e680ee227f2ad306575b577c2f61da7212ab63e3db3941f1f751f2356c7443531a90b9d1417730294490c21cadccea4a70dce90074a269514fe561685248381cc57d2dc573b6f64e6a5ca78cfc04d6ce099ffdb681f01f472444af3e8c5dada66eaf12a71dcf6e9f4f28d07424f0e628645a65ad080dabfbfdd6a4612499ea189d8e301e45a9e0417d5a037a2e77627d0a77ea8e14e055966202077621e6369bdb824ed3f52e945f7c5c0949218391f8815c5401aa516540db33a2288c2bdb57aef3366d3445d11fd294aa8705fbbcbe53736badd4482220f1ce3b1c6c501f73a149ae950bd6e1a9096caddde2c62bfa0722f73b99add65f2b3c9bfdc93c4b1839ec7ff380ca0a26a94adcf2c1ce26d226d3bf520268c72412e58a71acd9a66d0044712e9e0795be3898fd6fa9faf56e37ed8c9b15623d982c31cf201c0e7a9b7dba4bef6a76ca9840bdd9fba332dff7c2d826bedc8182e3048934b421c30dc938b4d7ddeefff0dd4821383fb65e2d9550fb55625faedd2c1f537fd2c3e0a920ba9bdba1318b50b4d92ce2e2ea67286f68c0e12fa5d2959b07f879240b4e94c88ad820e23b0033467a469e8d473315ae928e91cfb6d3f35a43e1ea5200f316e830d16e491548dfbbb3d735e8d6ab3f7956ce2ee79a9b3f8e5b759a04aab879a835f08c7ec6499d3a0c47709a9eb7edf93de680225910c162d71b50e112850331209c442856edb4eb0efe154ca7406656ce3f4f25fc1cc0fc403dd6913f43feab793c5cefce1a6ef74065eca5fa2cf3b79241639b8ba686841e42f2bd39d8b03ec93a9d7d35ba11862ae2bf4e9e65dc440f54842a0c955923f7926d0d092e621096fdcf7793b4e6bf55de54ee9bd16927cfe1797a89d3820055950e28b62c5b4c6bedba88f0f035cb48c2742efa5ae2855a4e0b3409474845bfb39fb748b9e518cd722556555646d28bf4e7b6c2e78e893605020095d9f517be54e661c8bf469c46f4da89c9ce60fba7de752dfb5fb658ed6c26853471d0a0d9e0adcf3d25c7025ddb9fca5540cc6e23e6e63caeaca21d07ed3e6ceef7200898bfbaa8afd3b06f9b8f3dc10094d3548776018ae2b59afe0aef145ccb532e778359d59527b0490d86787c15d2b2bbd55cf58fc09f62e62380da6efed46e42142316c83eaba6d904a8ff236ed382cc1829cb5885ed9bcdb5f01515fa102ea307ff5f5a4a469caa7c898afc760ced5046765f2482d54898dce30ad1f7887c9b799f9a5262fd7b029caf83cdd284d98d86cc1bbb5e5e5190bfe020699d424170928c31792dda292a8ca4505f2d4330cc01b166e5c2919efa876fbfa79648636b794d8a9754e48f6a75f05b7a2d52d855deb0a869567418215b184f5187a2ccd4576a0f747e2395097f190ae57ab8bb70464e4a10c112a54c646438301b5662f3536c26d754a02451d1a9c76abd7dbf656115b2a2ac702ec2cadae30cf86e0f0f96da39897d6222889428f9cf9eaace7b568c49e7be989cccb403b6adc6f1b972473caf53a27179f7ef1c07ddc446cffc4e3b77a6a091d5b24a651ada2ee84a628f1bf0fb6bd60fe60b0f5b5cd859a92e70aba5a9f963c3bcb68a785dd75aa92896fd64497f98ce9d0f885c1481ec465ae56339b672174d321dfa36fc6b4fbe0c836d730787bf9c63241072cd68058dc7d4eb9d96b3b35a5baa3bbe808fd071557ef085fb2a546382722e054e35af66bf66cc37116342d48082d776b0ede3aa4db11002ee115e0a40206a7d608fefb988c38d71ee2ac9a2e9d056c8562d93513a425452a9e4e579e6574c43cb1ecf6e6b12b6b2f7b252acdeba3e1b38f7e54e655944ddf14af298bb3e5dbd578b566eb07cd061f2a0e4daa76819d620f1e389161f690b91eb8b4f09fe2454cb7e8c9f9f2862e8a89f88148b036e63d4c694eb95bb4a454f70bb8616be2970f19e7aea803ef4aee1554542d3b3c6291c1c005a295670f1f58187252ca7f57a8f9427379ae80e1b646a234cc89fa890c29c30bf1b18617949c5f91491e10fd86e079c6f364c3997fb872a1aaff09c008ced2b03b328a74314e5183b8d93fff456a0df789c92fc8a6c546394d3cd2ae144b7f90c39afcab91d88ec826ae54e350f07fa3c14e3e05c8078d5a37b5fdb9bb0a4a3c4f5d450412e577ed26e00830260e3f4a2e6676c75ff9c882deece3696995a30122fc0c3450dfad511e30c26c512ddd6915945283eb167851b7541c43bc681a8dd2e9aaa2c8318f9290f30c0e5ed9ca7f3b6a69c1d5e82d35658e00bf001c2140f3b8b8e5e5859f3003b95d8cab9c96faf45b1517bcd947ac5dfd4951e10c57b8f9ebbf6435467ca80ae63f6dc3e0b37ad4e8fcec1c746834f5245ea2ebc31e5459f516a433fe78690b2c1a283440b06d519679b551440f5def85a9086cdae5a19867672c6e08430178dd765279270e40fee6241a17c29d8591a3c11900be6e3f39a51973400e4cfff88cec630f1e3d94314a8470bc7a935a70013f5b33e7e87bb240b60f567af6b2febce4e06290cee59d46035fdbc6a13b2f206c2562d214f596ccb5671dd8e0d8ffefe831102922a3976b294de24117a61383d02e3a17541b5babaff102a28bb070987efb9441e96cb42c7ea16c749729c19e13cc1622268b85600e63b15277f7f53911a67b65738f87fc7c20d6db8044bde1af95838d1c94887c49058683061df25438b8121e61aa677daa12ade063757d00fc010eb2a6e4e972e87d1e9ee680fc7c5ca714d7244be702611d7e1dc14a634e9195142d45eb3cc67520c61069cf781405f9d02a4bc29b3d6997c40e2a12155cf8c830678a15d6f977973972305809bdcd36f08248ccd8810c27fc1bfe8b07aeaa20effbd4036c7e5846c55ebac905cc0ac4d2699bc9436fc12492d1bf13cea62e25af54c42251e7afc61610698100d1575a126ab526507c413424ba0c2abee5ed5cfb0ccaf11ba7e69b9841dd1e9f602b3d2ce035827418d4dd2e5f465e7ce0601d6f7e68fe4e41851dc86d860015fb0f048e749d5c42d824762c1bfe2d6d283f0d59442eb85e4703e322fde4c429046b36b3825d22313c88958a9aa3f6242fd2a364d87cadc02afb72347d89d93d0ed85a38b3d562c3b8a9b1e625c8672659b355feb5d35d186fd4517956d5cdb69cded58a63c69c7ecee061ab77ebfed84869bba366e334cb7816e76e2469004a10d73f252c813dc701c51b66fb8f0bde7e6e4adf55fcc35df64bda8f60a41f5c1d69fd957895d530d3d045951b123c9d6e296a2f2db087444cdb71599627796104ffa757d294e140c79a76a27125ff999a23b00f388f0f12ee5e62593f63bcfd8a10b2f8c4def08b5f7c353b782ad35774f5a2fc10e8b95e7d4d141ab6d94885ff35a6d4b9f46154fe0df7bcaaa1465ba117c972416e246b6c100cfab708ba9ef6e709883c75e24245b844a27329c71a80f28a0e348fbede2d4fc3959a6271ace39d419fc6d3c1e7a91392898c14d418a72e6b2c84be073b4374ce57db870c3447e0e567e38eae99aaa867de3ff30bea7613e3599c899be740f783de14d6e8d9b62a7b9d1d06f6fcccdf3b1d1964cce4905b9911f662cb86a8709a74c0e2a5e190f26a9bcded3965722092c2a2ba95ab686de2e22cea348ddc4868d85a2ab2008ad138e090a1e4885d24f57b669504b370b36746aa7055517f1775655b3f9b9ae63f7cf7efb596c9c054e983cf5488714bc48ccbe9a5bc95e34646a84e61d13545a59d6e45a8ceae5e28c58867a99f895c29c9ce74fac8bfbb5d631dae51e1441bac10a02cebdaaa89293005a9e4c850245ba4dae6d0083369d55131f5804a6bfaab7d3a200f6932d3debf681096815a26c2b48d99d6099561467781ae6d8b01452c4998a973e8fbb091aa4c364f592be6076f43086d2b5a54196c89438a11989db6fc4833c9e869b21aa70e757fce39e4923b87dd161bf694d696b55f667cb666d41bc55971c5e16ab23c4b78983f08a4ebafe8625129feb6068c925c732adf32fc1eac84fc30072d00b07f9a395a1ca97c42d142bef3d73a01c4acc530ba7784a77b4a40d9854f7b7eca1764c37dea54dc9acef8aff8148380c571143f9a13ce6eb83b078a542ef894dfaf62d738f65984fe5dfeb4a54b44ec156bd3f05838829a6c0b539f1b3a06db77a41ee509c509fe03facf6d99cfd0bc1b198ee3635a43e2fd17bf7848d538cb1891e36d7edaf8b03221d52b3436c9696ce6af994a0d84b0e20ca5b67ba510dc38f56ad0e6ac98341f6fca8e02f4918c717fb0727aa6c79cc136a0da120df1975f4b1fcfffce8b020240f9f694adcb8ddf213c1f83ca7eff01422b43aa948d85020f7cbb289523a2a121fe0557a6c9f5fc979cf0e3fd2d6028abcf83b3cd271db7bf0c12dfa5048e729f312aca943f4d503f6d8719935558addfe83abc0c70d9e6e64877a382a02ded155de77bea7e0c80852842a3418951174b1fa921f6dd3225f1ac5a12a289197730becbda1e18bbf40557d40f6c3bd1eb99d08f8400deceeb7db22a8b7921d9a75dee3863a391c4213c668bbc97df63a138953e60bee7f8bdf6f4699c9afcd7041966cda71f6bbd9e96ff0a4949068ecea3e8363685ab57f3d9eda7b47c8caa03dfb2ec22e62920d2a16bb023f423abca78541783f97b6543b30865718253cb2d3d4d24559c3c6653e8471ddb1dc9532b024352c78eea99140ecf134260e4a2e6aebff6cda62826a8d81bb3dd4a5a0d76ee30687fba7b6bfb39bc41a58cb1c9d69065e3e9987eca280d5412b8fe78432498c5c91b00a0765fe05a61296a3db873aee96c37e7a2c977d47aaaecae868ccaae5e153805fc10b88f24022c8e0af72446b500372826bd1eda09ecf6df2752bf7b83bd451ed0f3ab92a3a55d6c8bfe8ef4534075be8d1d739a8c795614bd2d99acb121c0dfd1778f9743bb0a9a43470a343e9d623f58530c727ca088c3ba95ef9e60f349ad70150b09aeb3d27bb3593c82e1878b0eeb06701e55230d70c1f407ed3d923e2c3f6474662f3033957ebd7c6ce68f6ec1e79014ea905162a045e098f5919f1cb091ee72395fb0ac8be7ec706eb8257bdcc0988153d8bc16e6d8e40963f77a73ff0a0b7b0fbaa5bba3915e8ee4d0da30d3f8784c0678d39898dd66efa4e9a4c25c1a43f535ba9fdf910d8c4e7bbb2e2c3c01c7bb6f0b38765ad5f1a234e2be864c55408757e9ff86b8bf0e25aff191dc797f0f75fa0a4b2e91451cc7907d184e641d6997f2d3555faf285caaddfe95c010c2a7f233e09c2fc0cd30d644035269280527ad72e131b8d8cbe054a24cba55967f39c6a9489c088db0d634cc3ffd950c9f134e749e0520ba2c41a97966602b7ef72d49c68cdb374ca28599956d6a20863da4e164845025e7cbf91fefc637a03edd0b221837ca3a8214c74b3c2628ba2973750cbf1e9346d62d6f3e51f691525a934bb61ad3f980b28a03e02ce4c9b07ad2dc3700e75f0209c31c6b6c821dc056bc779c5adbe9b87274d3eef443cda1dede62e6c65903c5f71f995d8bd32d68b7bb073b34da0b303657afce0ead951cd9e8a1927bfe322122b56e5b3c7460ca020183194538ee9682b50013e8acc07000a400c09e315a921106f40afad02842aa4273cd1882f449cc1f7d472eabc049c7731907a9bcfd974696d2d34391048124d041bd0b42ccc886f96fde2d352518a2e852ce2adb9bbf47d7735aa3118604164d856fb9f2c89147d5605f80c36f5b3776369a9e27a568796b6de795ec1d29e30ca76b910d88429325e731b5f0ff8fe99f3ce3702bbb316fa52b30988b4a810fb030271d1d8c4add7d7cfb292866352de5fe3f4d523d88af27239c37699ea810bab828da8d3518ab4e8a2276e423d998ccc3049225bcfc9c63efa0df2179ed8aae97e745e7134a611ba72e1bbec8ebaec643e9cb30aa0bdbedf7d50c2d6cefd1ee57f8ebb5b74eb3674ca48412b5f9d464f94564ed9514c227d4af5af7f81d7afc80c438639193f6a3f2fc4c7a8b72ae2b5bae0bc70ec60393fea6281bac050a7baaefb89b22c8cf7432bbd170a9e4907bd39a0c57678e04c4ee401002e924f4ce2ec1e8a6fb3b923a7459bf7fa1ce2ff8f98003094feb4a3d2c039f484ffbde8694e145218b9ae379406c630203add10545f67c77185c486f2077124630f80c1765c45a95443537a31f4a78a23ff228334173d50b615f83dd640135974cb811f329f1a56cb5b9036a799a4ccac7499a05647e9940ab6380fa7f3865b5f3aa84cc59ef92326084db11d7d26c0629f2baee377d55b16716c468da832f2cb64de8f56e14bd60d537235bc26962cee8abef7022f686d814d7c28afe87fe66052092f0df179382742e708ab1e5ad9f73d3bc1dcf80a91f45350fe363ad5fec70b12751355e9111de0947213eddc8f26be8b5599592391178ad00f49279c03a897e2a990950529963261bd1c198215231794fb60db1b3391fae5 -MD = 63c337417fa6fe40cb3c6ae8b9d9092f4f3e7f4dde7e583d94f540383eebb0c5a80daf3b4690861c5b0e5b0d29fc448d - -Len = 67552 -Msg = f94b0305ee16e4dd360fcbefe9793fb765ce25974eb2e172d325be7633fc903980929808a4bba77ca1f9864d1df3966b1d22b44b11ce5f7f11391d8a661a1af24c4c1397f6c87242d3d1bb81106e26b35e1d8e5ff5c689cad8eed9c85b2d03d2e3e23d59ee258d5a53fd3033cad339b5ae277a7a0282a778b3acb9d71c1e9100cfbadef793ba40eaa9e7ae0a540b159998a8414441ea01b427db8660b1d60da5983ebe18ed6fd31b5ef5fcaeb5fd0288a108ab67b9e7dfa4bee3080a203cbfe8c4d5a465052d8d14f991e4c8f5904aaa53b08088725f8870ff2c077e7337eef2dde65985e2dab8fe02222c001dae342635068852753c4541721e4b63b2b1e3ea6bdba6218c609a0001109dfd333e0724cf738b6ac9645e3fa0229b62e391e7f9f41b51e10ca57b437fc2ff6842270cceaa60507b76c11b91109ec12310bf4047020e226c6993a5ee04a21ae84f538b4a4d33a02b8539c3604afc834d402236fb1c1ce36bab115f2a1617b52664a9cbc040564322fdb6a0d3d7a2aa887ca4133ecbad5a85db06f01f3f899ac9881116590c2f0109e61ff8133efafe7ecb2c1d3795295063005ca1f406608f7ac473b23c3828a288495c1447076a46d435a39e0f05f88ead22fabad2f3055de11fb7e8934ca7ed462d543c98bb5c4c35c2efdceda082d90a49c883e08fdecca5a1c60083d116abec9af1b82ee137d6477bf920faf030fc227eae43476154a36f528642364edca421981acf300163adb267a9b15d7c68bd9ec894442ef2d0ace63be0f6d44b61a08e30b7cac6a448991f8ee8d93fcc93e6263062ccbec8b8adb363bc6384500d67db69b1f11a514e6136f99cdec8691a3d61bd00241e6d756f7dd203d26fe648c0af4cee8c5190ddcf9eafae091fda638bf8775694786970baed919b8bbd947a75b2df57e396e95da900b807a26da7d89792664d63f1421055aba76ed695e30b4c8d2cd43e0fe536b8031d8df1d959e02bd893cbdbb382bc0a5e1c63fb1f5a630ee83b4ee4e40bd0c450e52a3d8c77e20d7205b942e6b0de9faef961418581ea836a12ab1e3ee393958e18c5d0ae89480607c400e1b155dddd454552f2ece00972bcbbd53445f6e8f266bf46f0661779de3fd986003df8218cc8081d547e0026a4863eb26e20cb35a480e194e6dcaadd5dc44b35e7b2211274e24aaab06368abe26fa12c13f8ebe374838699fa39c9dc4b3b22f4dd3759185c3914e14dc3a0fef21fee2a6df4dc5b2718b63c73a5fdde6f4f67aa2bf4269b0e756daa75c531899c3f2d93c23d280488e67a659b47cd4b92a621411a121303503f5eed6e91a2b2aa7764515bfa56455e96d9fcb848c18b7ce858a0f0b9a5b8eb3fee9281507be3e26e9d4b8054ef8870cfdcea13cf6106f5be14aff5106622a71c2581f62a45830ecddf6979737a34873a8a15f4053625c5d05e567340dda94b7e0ba2154686faf43b33938d7e7fb16b7eeb66a212c74eb3c53d7db07092b6a10fa9dd25cdc9af5d619fb1059d8766e44407c5671d9cea8945ba0cf5c90eaf6f74061b70e6930c10e62eab29fa19bdba34e71b894e3e620dfadceb8a73d8fe7e582a423cba6e78d774e56941babd1db4f5924e51ce341c0889ab03b795780996611e3cd271e15b78b0ced49508fbee9c30104807c50682419d2f3ac458773a7e37e9ef7a32751ebc44f0d26d0a5c99388c6aeff35b3dfb82dc7179f8e35cf8008393457c25b0276bd8534c10e8678451b2a72d5db660ee91ee78a99d5fafaae2ed25251f731ddf4d13002bc7cba518ae49cfe98c01f7c5377c4cb0f9f3f9baed1ca676ac4441ae299efe55dadb9cbd19faeb0bc9628be73c2ef67854c8c08fe9b91e226bbfa6fdc92055b4913fd6dc586d017a5c01a3bc68ab7de7f8058f919e6b9610a40dd332f3420e2f3320dbdb34491c208d07c7ac839ce9e72cd3eb28d4db14289f5550b770ac30ad0aa53124753741e4a49c7f1f54a8435f375a5ebc52b1a352a3c0a6f20805c3185cf7621de3de7aaee8e7547da478923662c16fb5e1944876fa765c4d82f6d057723df63045e7ce66a211cd2e3bb3de56f531a77b492c0d7cea9efa2ea8265d5294a073c465f946f51a41739ae1022fa638d18c765222f94cbc6108ff403e75f10a48634009bde84198a0cc2a5e0d8e0e72caa80fc31e14cfb8e60f2713e51d1c1b5c4d0efadabe3364566244797b0276ed4383ac66c767eb2556970ee9c45fbb1004ba9500f9d0b3c58abd52fbf594c6ef65a3b701c6f9894dd8261c8a8242b6316a313de2c224aa056563baad224be6c15792965dc2d392769546b9bdc8cef5c6b33a6e6adcc4fe6a0edee654ab2fbfab42d8b34264fbece9b47e4d4b3e0c60170a5d905ef0b8993dadb63cbb374837f44efb7478547b81ee5e5640fd8b03e06c95230b87a50661c56c7126a96f9f37e6a28543c6395b37ccbb57fa9958bc5b0c7c1348ada4b8404c71990ae5fa3ba8c767fe87f5bca1f8cdf208e4e74c3dba40e8b6ad9895d61d18e4b55238822470e0c4eca7cd8457ab372cf264b11090e6500192a30f1e66df72ee4e656aac637979e2d90d163a843853909be3bd4bbdc684ee3193dcea7270a2b7ebab4322ffa9dae94c209885318669478dcad4a6ca4123d81be3c59f01b7f066148c8b8c00ea4a00ce481b0e657fc178507fbec9c14177e6d6fd93e61c9ca423527009916f23134fe6ed667c280aa24c6a6c435ba9adc641ec470e66ca0705182bbf86da533c7bff1c774278820f56eb65f72b058b6c5910e52bfdc813e05c6a29e1ca0fb41ccb38f84f77aa7c77237cc98a3d6e6e68787c470f29b3ff0ff144d43f9dd79aad4a2103dbcdb91d2852271c8c423e5a886bad9c5d5bd0977d0cccb33fc7da0ed642e3c4840c4e6e0b2a16e865031f58b479ca6b7c59c7e210f52a4e4a0fc1177ff9a5c3b2fb107508f56eb47c45b76ed4ebfb3dd4eb3fe8b1f3872dc93e34be90b89089ce63a83c08f95a093bd3aea7d1096a99cddbe0b249500bd9221cda0af2c7cc9d3e0cbdcbf180006e0974ad08911b3c07cff05347be52ddd9bf715c038b6e80876cbef828add0886b4eef5c9bfd699c0f42f140b0fa4226b5060561b144f5d5d0be41015d22311b88730d6267fd3bb03a8ea74ef3e3680df661a0921d06a3f2ff9e5c7f723aede14ede9668747ad8a00f1bda261a630bbb233709974eb7c2ff9c73d91a6ddb4b0144f85215cb5a8995175251702c617457c4ef09174c40982630a57e7b58ef92a3f3290812738796b7d899d6d332c4ec0a61f368bb208a6e8d429c144a3a5d0bf1e1da820674e7472ddc592ff73376b9fc83aaee2ad17c8b5c5abf622e1c0dfe109871869ad764e320abfb2585375e2354b17c620c67fd39bc007832d005e7b22ba058dd76a3e5b4b7cbe580254764743b74d18e0bebf7bed5bd2f4ad8fdd371687ff54f41e051001bc681087e6970f2d8531138cd645163ce184a73ed0db981efbfb2a3a39692107324368539a76ae754d6a429fadaf370cf9a3275b73b812be9e7f6a346ce8f2ce86b6bbefd093a99d685f3293b55c52d02c94f18e09113b77e802815cf90309ca2258a7c7396c95187e9640038deaee18d3009240d17576dd511b2c2e9e25da7c8d9fa874356fd568e896075987c99d69854c960e8d436951722fb723acefe96821023a71451bff214ed505103386b524cbff59519d096766b3c6bec6a5bfbb1fa516da48e90f86b419e9a5c23190d9ed0f8f78b48136159fae66afa22913c40552440455a1a8e0a3c23a85e9d2767024d87350a1ca67d86eca860620a79aa8bbe11045320f76b172e04e01f1c6a61c5ebf519da3d90d445680ab5edc91a2bda5ba12197873075da3ecaac6646ebe431d1c809c254d94cde9695d163087da874545bffd638cc969a95fc73fdc3b1d68c288b6f8c098acf989fd01d8c6ea80aa2d2c806dbdbd3b5a15a229caa3cc4211f17c3b2fe03a944bdab43ff30a4a537acfd6e9f6d174eb935b6c59136592dab32c7fa3ae1eb419293e177e016517c19dafcd7305394448c9fd16cb969c1f35e0d60b76ffc6857a3636af329071e339773f88b2356fbbd1527d29f7c0a1d1e20f70983b91923f55e746e3f40cbb2d498c11810de3ef4c13c14e2e642e314b7db3aeae580fec322ab1014e48f2ab766060a85f0cbd32659e9b028ca73ba4fc4761c2c652c74f1e7727d84697cecd2f2c89766b350dc3a8c0441cdd277587550d9e6f78b2543554b9b04e75671d8ad7fc6b0e4dfd723d7637510f887b7852f60ecdf72e0d33396560fed6534d5b7f015e89d27fec76ea6e42465d26f990825fe9751c6eb9f0c5d10b480258a105143bc16a5569788864f19fa88831486abfe31c2821a34ef955182730550e08a6e4c7d381199338233790addc032fee734630255bb97442c971bb335c30dbfaad6b65f36291a591d3cccbeb65607b3226cfb77384465a2bfdb62abe00385adda50276bf835fe91c16bf23d6e922bbda11b6f9b5365abd60e26cf735d0ddf3482a647a8667d7064d686908febbcc6a4ca0966738e66926983430a12952944dc089ec01e69499658c45651bd171cffee07fd8909d28e41e285f8ba906f9fdc2cd50137d5e7e098f7f3a3dacdd9faff25bfc180640527e0c97b0f87f6d2b6ceac519657d6c98b9fc9cb35d6ca189deed0591bf28c117799a7cf4e1b4ba8b743e4e427c528f892d355b5d3ebb9be4ef3783fd4878adcc79203e87e1b97d8ea625df77a2cd35b3d5b231747c1a4b25536a4d8b4e865505ef3652e6732e24a97549ef05932e0d9d35fbb5a570192dcfae0dc8c82bd255486e55509d00635e606402f398a7f565c9e09a6e7cc538c248519a9c308add3cf85905ce1823f97947f4f9938d5bc3dcbe47f6b256d5e99723d0891e50c6175aba41b011e4686113c49a9635704919d0deee9927b04cbc1ae6bd61e5a578116cf2baecd28e283aac6ad7515fddda57f0c0470a35357410cc057aad88bb1b4bb23627347681edd6a1af3dc38912aa1eaaf6e3c27143069839049ad46dee1a26e8f908ff744c43c59206305537db12ce7de7374a62555eb2d078907f0bcb1f436fbff2d65259a4a80c14418ee283bef7d815c40a6f08e6e130b5edf5e8ee7521c4ff5731a746aace6e3e03f91fa8f92b48171c9b1dca59a3b85125d19ba4c632673bb899d97fa0d936f7da0c55b77bc94c4fa374e516019af5eebaba8aaa8d05e4f999876f81213904e646311b3b91526333fb206b78990777c32ee93c4c340ccccd6c82efd7c66e466ddb1fe6a1e4671b688615f77e6aa99c92e516372645c77d0bc404c10ffaf97a12fb213e86ef77d361c6ce3f7400d1f2c29f99f1b55cc6744912958986296b2e6a48dd89671cf539944fc1aa05e61108c6911cf265c37a4119eaadafd6ec23c1c826bd5daee77fac948398bda0a4f75d337bf7bfd4246371d2bec5ba6ebdc3d2d1273931daf977aac704abe0e0a7e55e8db2b2c07cea02752801763fda18bbe009cce99c87ad6dc2c03573ba22798b8b39d7f69accaed7c97e45278695778c57d68a36f4118dc27304b8a8b002942a71cc5e0bb54fcd73ed3a1c52452d74b5d8cbd1b9ef25152639f8e09358ed826280b9a78a9672e0476f0fd99ee20e7ab8b15e55ead41ece0996315fcc1b6fcec4668656fbb4d261c2cd541f65e3c5040590026932498b32dd063288cb7df5c3c061b6eed796fadc8666ab403fd0cd9b3ce35c9e28c5e6ce210870fe0a070c1bc720cfd196c338ab02e97a0e952f94cacf29d15746bfbe0a661b7112204d3f31791245a1b1b02877b8b444bcfe66c70d2ce1e54714cd7d722ccdb7777696fbaf36b49cd1c0e456ad18659fede3fcb0cce69a1cc01b45a19fe58db8a0959acdef909649d44ce62fc5c25be013ee77fe947cc0fc74a2dec6de10e9f8f005bf226d0725e13bae2c305c1725c9c1666f1cfe6fd4e8b773ef59c73f410d184f8a95b20ae1d77a7d2ce4dab7519178e42888553064860ae70dd6f5d151497bbb6394593c68b113227ed9bc035deb9d005abd535eee39017490cab47769428d0200baccfc18f28846887b8a8ba94cc0136c48535be0962dc53ea1bd82179cde9bb85587ca71005c41d036d0c0c21964c5e3a5efa7da11d2216e086b91da9ce2f1110114381f8f11bcfcb8094346f60d70475282d33930a141954b392720e73c9a9159ecc562e32b10546b9e7396471cab0ddab75e9c771d7e4af6b0a298f04df0bfac8be2e9a10ad47dce2ae23ea134eebdaae7ba6249a96ff5a76c94813c89bc02957c11124d5371df5c190fae88c8b3bd4fbe67294cc77f3bb9c78da8408234f08137f08b4c77910f92036c74525a82b33585f55ff50a2463ca5bfe4c90c9f4001c39d1a323098a750c54792eb26cd405f8e8e584b6f408344584570ca1c381c7a31c6508656bf6b63786c61c1d72404c0651a82616e792f3a7eb3856f801569dd23a0b0988214e298034d3eaf7fd2febea4acdc299874d488dfb02ca07f60b29162d34550fbbf96582d91309d6802b6c215eb6c8b345af99543e56c45623e7cfeb60814970be90f0cbde14073d8dab5327e803c70895227c972f94d4672d9518ce6e72753f8bad31a7ce4741918828278a81254bee085e58c3395d78bf459b8a3bc17856e0b596cec3243d6787023a5fa5b4aba5f811bbb46506113fc33e63aabfe4136ce8cef62e8a6a56e7627e5a7225ed07839b43b315f8f04088276a65e0c750c435dc3a33b78a2b342fc87ef0f577b4b9636c10dd03fb927be0304c4ac2ee921b301f79e8103ec155df3d66a650078631a3defba1f4f96713e682666ac7a22278ea47207bbf14d72c4415d7d32871ec10e35886aa7f5ed8b8f9a24b5e756e7c7dc2d7a0772a98d7281d06451fc53350d7908d244ee9a871cb98046d8e42b01a9a68458c62d9574be9a86330d4ecc85ee649d16717ea72dcdc501d4f72b623974f491546b741ccafe1a4d11daad5ad50dd6dc9b19df82a546ba07153c456155d0cc3cb51fcfa656d9060c48e0a365ef12d7adab629795b72ea07952cdb9921d67386dc509c79be1f868ab1e46b75599a46ff88c7730472d2e803ed3d20f5c5bde3f0cca52e36433034711dc3572929c6ba7a5877e32ffceed6140e074d026d5e0e9010d21ac6714a1ac28c9d45a84c011869ce4a0232761144b66c1da835a54133f34d69fa90d4c7a9ed72f4cf994cc3b15c6eb048d26af4a4698bd2eb05fa01f488d6df362bea237250654c4d7288a935b09e4d3f76480385bbe1d95df9d81ad0df519475fe3e080499d81657aaac0c1604e1634ea499b8591c12a39997cbf65945223c029e2ccfc1385fe576c80376d2c7eca50ed3dcadaf1872942656421eee78ed38847252f548aa413c13514b73ec87f484e88a8d3df81f965d8ccbd71f10e8f71c74112d030b7e308cb5bcc08dc3b3bd85743f27f3b4bff252155ef75150f3f45a4a0137936a02a249f6812f1f08d98c293a78396975782b0488862f603f4849748ea8ff0114f62b162e44d3b22c6804d293bc3e09aab684f73ed7ebb62c548aedbaaeefe67cc71f53f55e4ae19efdac242871b25ed519b4acb0dac8edb8872d38465976be11d41395c4541127e108e690514f12c375101e9776f52351647ea4e6ba5f4ff264cb9c4e13bcb2ff82f838a9b69aebe21b184749f9bda79ba099867b9f16c82df61c0e0f7c0eacd3056a36d2b0fbba3537b0b326d1aaa226fd7646696d267bbb36240d3c65b06b3cd8cd55ade8c7ea374b77d6c07732cf8dfb8369229cf4d734b5920e6759487aa78da0198dc6a61852c6bc46a952ec6c3b0b4f6349b7087724e4d48612cf3d67ad9460f704c30cb1325a1c77440d4e24a8ad38c94133d7b8065479f8c150159eb97dbe82a5667241304606ed22fece756161ee0fababf9265384e0fae554579c45b9e720e2496d34e74b1a1cb8cfe3daffb9cdaaeb87d34e86e6a801117479ecfcc999663db45428c1b9a48a87c924c1de25563f734ffcad3afa3d8fb819031d293d33d73a6fdd895a1264bb229317b687352611f56cebaeca50200b5bba7989657544d84ab44fd30af5a922ebb623457559abe6c48716efcf68ee087ee143de3c125b0df12a51927ed4006675aaedfb3313560272f704cca4a5060b842608681794d4ccc04a5944002df8da42c9ce244ae2c31973654be204a4e6992de12dd3726d40b92a9ced744973f102c5cb4a6d27586170682a42bc49d92e15bebb2a9ce70c3d37b28a748fa53697848107e93252d4bfcba3ee8fb7fec24b25c90c9520f01218ecda9b8502cdf64ab40718312047f84c7fc90a99519df0ac2ddf6de40bf7ef623d1568a58a0e238935ca64a893913386014a06d635a1d4efb264479daa9924a7acf55a4c61f05ee17e4d75b618a906faf4a97bfcc0a4ff8437ea3228a94e3267b0fce8e0371f08d1e1f2e3f03c09f319be69d2438f01c0e842f3b62b84719910ed8ead1785e4a1d9256d07dd5a3e7870e2fd9260fd52d9aa57f33c0ca8bdd941b74d0f48caebba75ad1e89d41fa1178f06e744cba8129a38eb7b4c52928d7368a29aa7fa628ed315ed89c28ae8fc40d27ec961e9fbcb932271ee5f73de6ae7f43409dfb309685c686b314a58428a94d9cee6525274e854e58feefe16e8d0a772e00d3ef91be2e6bbaa9799c2a8e674037bf0ce8bafe34ff099df90825e4952734b374e331688e2ae203f3950a89a7eee1a6b1f0c1956f4d22452cf6c8b4f4963b9fa75f785e4d0ae60aa9198be0116080ea7dc3a2dcdd418b3cb032c1c5d2cc2c0e95ecce671414ae03c4af155d4c9dfdd497ebc79827e22ccaac4476dfd5d2f04666119b4a8b4e22396be010c601ad41ac27f09694f439ed3948b551caa5af6d90415747d059c22bf3c733e4e4d79933ba57587997ed4cb7cfae0bb84deb6b8d334e453ac12678af780030fa7f7768ba454dadd768ba2570d603d115324f0f3779b763dce59c7697113d5fb85f8822c097317618d002cc0294728ccf3f78a253a8a139960361c6cc06a649874bb3d02cf62c3ca3976d47535220c64e3d0f2cc8093650cee51d70359f6575d00ca078e6ab6686e285a5a04d573806faf3bbb680e49e2fed51797ab9249f6bf96af625d5fd06dc3c614fdfd7ede0d53b2b25466281015e5c101cee42dc7fb46c2d5edce33634c619f5160ad85a40ba79abf5e75627866682eab0d3b7102ad78f1d7fa7f79d1acde1079f2b3ae7823d1c3cd29e441f55cec6a6da32ff08cb5ccc02028df979dd78fd609549e4dccbe68ca6647514b2971e920e4412040c88cc8aa38e97d213a850d3c89e6dbe81463e31b15473ae2574df4de8967bad6489ae30c9cccb68b3a1dccc07629eb01d18cc74254aa0fbc313985efd7776e257f78a283c6333a4a0f0a450e48be4a2fa6c18bbc9ed05e1d39dd12f1590098b2efae9d9c4fcd76e24be30c828be477c5e68ab6f66e6a9499c391227f8893f9132b951ab293fbdaf8533099a9ba5d02692340cf9c4dc951c6710e4ae6d091ddaa85d4d0632d3ef4d0c76b63005e88688def9c3bfab78cf407c4ace2c3db8ad4fdb0d6252a961753201b0bff12e2f728b89df592be362619f230e59093040f6d812f21af754905544ac08ad44de219a15dd0d55a433415220a4840bae0e46005e9434fc5dfb09996d54a70693dc66080f20ac3f9165beabaa46d56f819f75d4c7aafa90ed6874499443b45545f1a7c4629be3a05c3f80732753290aebab7279fd9c6c5f0d62786ba1bf581fc2e58cd4f496dbff6c8a30b27e11a76655f9e8f7e6b2b4f026b0bd097b11bbee7180bc42af59bbe4290d757197c9780a25527d576c34f7cba11bec2a0c810449bc89e0167a2bacd7fb92f8b75ac2c37ec57ed9a076696079e46badd73b565cb90aca9f563c56d6614adf608caf46b14b9b45a5daeb9a14815968a717f0daeac5c409a20cdf2060097ebe56f87e9b6af8116f890db50f3e6b67d983f21353d7f5500f903f4ad27358fff48204af0a150d8dc32c42bb1004c07588e8708d0a4ad117a412f865b336d5364c8bb72adbdb12790a3781e5e58e07ed3b7f9a44476ce2818fd03e180dd208898d1a1ad756e3903c0c51d01bd505c836bbf077215264aff79a71194b266e79617ed6339ec3560f3e9123394529918cb8d0e20f0c725bc0df8b9e91e64833b127e9680c68695b15e76155c34b2a59d9db41fd6beef0799ea22bfeafd1b94937419477ad1b911b2c9f438e76151d863a07d8ea92ad14e5d0a9423a7af5c1d7931947ac1ca183bddbce01765b8c4d3f34a45b518c3326c8de5b98f9fb38aa054e15ccaf63e0876aabdc61b6799601ad511a93d962666e49511ff4e43883bafdef9fea278ac2e54a22312cf6d91c80f818d1482b1b303491b05f20a23bbf3be4fe1e68bc972ee484ca3529dd81071347113242efbf78bfc78382e2dc0cd273e503fa0f17940bcd412b5122147b3d02c2c5a348cc5726581453f0033ab1a6ab25879aa7e08843e8a8cbebdd43cfa89593bb8d246aea2147a0a6104b6334212acf1268f8be7cbd7de2346d2411832f14df7b599c728053d492074c81009c2d3a092acbc95a7761d416ee3dbd26a1b9c6d18e6d798c21a34713fb0b6fb8f2b121fb592be35c8117356d7fc5702b3030f48e7b33825fd6f9e74a0cb6db343d9428cf26f10f6ba2c7e70f716b07c8397be641ca118194a63dfd60c1b38e1c85c097aa1983132fe35933234c9948a4c382e41004713cd29a57d17ca26b5017d31cb6b6bb4ab7524bb561d196b6fd68d62d3623b0ba7dc2b930abc73846e8cd2e90cc1b93aec579e3c4b943d92aecbb7a6423a356540a0c0baed3690aad20e79e0423012a18034eb26c829e9c5cde46b80ff4b87fa7ab5798ba9089a106be0d2b60018f06ee3b79c096060d68b69ab19716f289b21b2a4b693d2c4f83ba8be6de8cafedb19933a2152b8bb6c49feaa32061623f77184e91851dede43a324f1bbe717544b382b470ba115ac1387f94c45ad88f015606ded1f4441c704ed5d253d3f59abc9210858bb632bb574cbf61bd4d64c0f8d84da3b2bf98001a450adb372601687cd8aa709c1174f5a089c5193601eb3c4c845565dded03e30ba93b346fbe7e25ad0cba3b4bd3c152c376fa84d67f564c24e286ebfa866c0b6b01cfa3a2a4521a76b7a7af3f050018e89cc66946ce8e38a87b49ffb093bac161d62ef178de678f0060d99421af1990398192922ef67a4802d60467a71ad74d15afc0e69b76a3cc728fb8b298d7f302dbafc4c5340001c4577c21ec8826aaf7b014ec49b073f018f5cdacd04d8778b6f9aec6cb03f30df3d2f30656fbbc1b075a8d1de462de35bdb1a01db8e7c68ff3b904fe6c41d7851e98c51d6da7e612c43aa3b87d56be5a01cd9373300f9d2003433bd66f97b4508dd479ccf935ab777879dd26dd371b462d722b16016d12142cc0dbb49eac935888ac987dc14c1432693ec4cfccabfee388c7f26ef3a83051b7586a02bf297b845748a9978e95272cdfb2de1b115a6e185cf56fe4cd69fcc0ec3272279bb575bc41d1348228b8ee4b24fdb67376ee73cdef232ade5957804912777a8bfaf988e88f6fc2a5575c71787f46d13dc10c15ea8b7aacc55d1bc3d5724e0b96a49cbcf18a49da6ae329b79c37b5b9e2bb5e5d5876227c02a25ccd4a55e0acb0604719bd7788043893c9c89d9574f5cb2c8c52fdf84222fbf0c3a7920155e541f7a2a835a153c87830e1ac65e1a80d5fdc3efcc25b02271a0ef85893bfd43eb1325470414fd3af90821c6bda637c8905921b648fe58b12c6c6a2e837d6854068d70679cac83040e9511f0ee66216f22718cb914de0056b66de696064909172cfae5fccb6559104eb6595 -MD = 025dc380479269ae1739ed9631f7606fd2927f71893ad74ae864d6af7d14323be5fda67b2c456fff98387239b8eb3a13 - -Len = 68344 -Msg = 0f49cae81c8628d290d4813a453132162575fd2fa5ccaf339069ff060679ba5ac4561d7fa6fe827c69c3405eb644ccd05c9b24ecded86d512dafda76b66dd13e9f3049cc4e5877982c39a9c2a81272a77e4307b339bae976f6afc4f96c919752294016761e7c4d4f5e9e850e23856bc312d46f2ac05b6bc874d285372fcd56bfe9ec4c261e524cc889599cea3084014ba0b624fc7aa13a722e80e4da070954ac689db28355c3be2c34d4b6fcd5f87a67b150eecf6f75a09aad22ab87fc2ddb422cbc1136cbb5e9a2e8769bef1cc71f41cc0c954ca8c0e369771ea0e8172131a8bfaf31e6881117532ca712690dda38fe7951e01a2c684c0616de8ca55fcd9e07a9e0da3c95c08e6688cfe512af190dc9408898e10357239912c83666dd1a6c8770b5d4dff9a996048456da940a6ce5c8aa17854b3673b04cf14668d297eee14f9e98e679bcb37955a9a5ba9426bc0a233e676ffecca63a453dbfe89197334788baf0daafe7c87d807e224cbd0cefc20384e01ea2cdd60bac7d9b7f4ce5cfe4594d25762b80cfecae8c365ab4c3ef569005ea5ae042ed69aa3a41f5ab87ac01ebde9f839592af0c065949aa2453a20ef148eeea6032d29d67fb1b125587b0e566f5c5c894225226b16fc406b3c5f2314fd65297c9a56def0a48909ef3ecc5daf11b010fd13a9f81d6560d340920c609d1358029c3a3a6a6bba908602cbfd226b4d6ba1ef4e17e679e948efccf6c05dca0efde68f835650ca4a7eb21a907be12d8b159bea420d71e31b3ae28adb199f3e38cd61b0d629267eac9a2a911cc73e6853144b789fe92efb63bd47e4af86996c392cf0cad331500b89893c00d17d8eae2e0e4d14c83982255b26ac84f485d0c688b31017eaed61f349b272e45efd5661845a1d495b7cfff38a2d7cc63aa5d9ff9fe63c328ddbe0c865ac6ba605c52a14ee8e4870ba320ce849283532f2551959e74cf1a54c8b30ed75dd92e076637e4ad5213b3574e73d6640bd6245bc121378174dccdaa769e6e4f2dc650e1166c775d0a982021c0b160fe9438098e86b6cdc786f2a6d1ef68751551f7e99773daa28598d9961002c0b47ab511c8707df69f9b32796b723bf7685251d2c0d08567ad4e8540ddcc1b8a1a01f6c92aaaadcaf42301d9e5346335922db6c19f3555fcdfdf5833bcfe13f6dabbe0c8f7e41f1a16877a7bdcc06e093acf062b4c6dea828161991cfd4ef3eb3bcffa76f7c5d9cf4bf026c518bd645aa75fcc7890214ddfdbfbd1626663c2538665cc3cf1f6e5cfdc868b2060d44d1222068d0f33f984fd35d6876dc0e6881504a7df80af1f4b04117033f57dad3218f3ecd35afd9c99c2d71943a5d27e4d19fabbbaabf7e7115531d7a6aa38ef1a54623825c0b6b3931808ed8d7266d41a47b3c9e62692f641a986e26aa957420eaeb7130ca925e57be6127aee3c428ff68776fae95848f5e2ea56ba0958a250150e39a40f7d13db58143be7ed6b2f58eac18a754da8e08cfdffea860b21e3be375c3114b6a5483d3289cc5d1367f5d7fddd38639980246299d08a6ff66be0377c80e78a89878cb2122f0c03e6985cb337c3c8ec5647da20be457d9d549d6261ed62a32f118ca7e2ffed4502f0672c95a05b82370b64cb6d74460d37ac2131e491ebad2ad51c607601abbd81b93a2c24418ead6d4041bff2c4bb8065875e156971014ca45da080162051bea9c77a2509214293b57e457e57b58c1f516cbcd698938dcac5327ed06965c88ea1a490e0eb48607a384bd8cf4350a13220e3a33b1801786db4db201518d7f67592d8e22273bfd1ab1e32627b5e9ce201fd747b0e92c3a87e9ae0ec1aca7ec4bda4e9dab6498d7b6e8eb84b4b51a138d30ea8ac15addf07449eca4ca628631aacfe61df6314ba480bb067fc04c46789f27b069e19125f7c09e920a780da8de18cc9c858f07c4f1fc9adc6db715ef7bfa46d17bae1684aee13a26a65718704ffa32ca4af262b53e7f1ad5d5159c858c0320c61663758a947acf231ed41d7d15e3a507f4bcdc6ce8acbd7b5c783aa9276e47f6e0be18a836e1a01fba9b874fbe4985de094adf8c9ef9f5455a3b8aaaec701efc612a8a5e04ba5f653009d038a7b077a50f28d664afeb54cc54ec073b39dd383efe15452c9c697fabe5aba2f870acdcf56cd36bb5c9f54e68e3163aba9dfa06473e2ad3844c73634c61fd59df97933857a8d719d04bac64a37b369fb9875b1b9da7c7a005c36cccdf2b8b7f8e8b081c4449a04b54c3751a1483b990a89464eabaa16855116fb9fecca8b28e65d96ffb33d5db7aa3bfe3e134a33bc81833cbe626d1a94d47cfef7bad701f00f5e15f57bec3c5424d9f8d5c7c4029a078f3e4b05aaef703095281e5fa083d61df614aa43d9a0a1cd2f0b5de63e10fb45b4353bbceafde10e695f5b02ae77a3b52a7c67348df2684a4420209740c5a7e2fa07d7b1b4acaf16018cf5cb87461f81043374768f986f462120640353896587699d67099064a1ef649835e3b55912298b22193067fc7f67ccf17251fec4ffdc0adf33ef068d80429a696372c0174455c7319e8b9e845f554f7d92aacade3b88e4b582899f8f14b6ace9c79f2ee77dacc1494aaebb9ad9b9b2aa0b363e3fe234ff089effe2d225f4a1fea893893384d6805066c146a5b33bfb62271ce24fbc8764becd7a58bf7ba3819250765862227c0c303aeec80db682348c2c853e77902a1ac1582287bcdd6c558c056f24dc1f466ecf0e5bc839aa3764106398db1d28c429f7871ef93215f724d410a6740843dbad172a30ce93570194d6147e40ab4afe9a4aa197368ae9ebf652b944d05055e4d1eed59662828489cbc5875ef587bf8074a1f0b4c42a22f1d3ee4771c01b1f08e33e59b50d6efb7711c70361831b4ef1bfe3ba9e2d7c88b0c4900454cdd267f0eaeefcb456bf82726ec3d2af71cdc1fa84fa487cf9e6e2d1d02036167edbf643eee607bbc6dee222eba23a6f4707df42cacde277aed2fafb008626de5c9f94aaf80ec2f4e331e3308f4a84ca8e306f729944cfb7d6a796d75baa1cd5ee8608cd0e4e748538214c4463a4f7e7cdaf3a31f9475963f8cd7f0ce9745f23bcf91c533b8e66964a17e7056d98ddef8cee0828f3bec6a39dac7d43b2cd39ef4e5e96e584b6e150a3797a1cb70f7c095354a0fe8e915fa14cac5724bf9bf0612d1e3f2af3ae2bdacab0ce3049ef1e5eab49cc5cd3a96c828d35d75617c8cda3e0a2dfcb8f5e8c5d4725abea292209151b3552eac8ec3571e8afc382c23a18daef513e6f60ae4e01a33fd8f2618e85572c81fb4f77430194e682e44fc9db1931e39223bf6f87b8ed65651feff91ddc4c64938f34e8961a130e160266339118ce42cf5862c3cf114a1501468af7b6541b4ed4d64022cec617e9d3e56e08465cd9976fa3016470a23f3b7a166a654037ed6fac981c2dd14ec8fd22541050e12e7b67dacd445b50b3f5603857374aa5cbe951849c6f1189fa4dd56918f4144ad6db3c779ed2af598b940ba3d19bafcc59387bc2abe2d6dd11cff611f9c15c699c239db0dd5468717443c5234b3c9b9d280175d08d1d85b4dd75ea83bf202e26c77813ec54718f82b42a15208fc21600826dc8140ac726f8a468382632b89469a1042594c9d22b739472830263d629ddada4fbf8e988bf90afcf68611a32951a70ef5b0e051f442c5c4397319020da1cf2cd96e2f40a5a6446d3029e3e3539217d613dc3d0ffe39554c4da15de4733a59910213cf1f2fe5cb09c8f44676a89661081541bf11a0e96c41ed31614f43c60ea96256da9ebb460375197bb5d788cd17177277f3219d017f3780b9dfccefc362d872adde49b8358211aa06ae8094b4be76c3e5559a42e002afb08105c7e7b0da90bb6f46aaa732cb72034bbd0c2ccbabb8822062f623239b1cf54d9fdabc1cfa748531a02c18cc4418bda15dc4d190836f25afb7cfce3aad01b775ea7fed7626f6988b77688d70807831be0d6523a1b9dd36e9b0819493ccf07f709211ec4b04994dd338ca65be1502f7d85847835dd3b52e74d9a626dd5f5bd5e4135b5909f7df2dbf60dc4203566b78a6aae68143457984c7bfc7f565e8b62336da968441952aa0968c0892fee8f44caf81ecadf0a38cc258cf4170cc0d921fff746e1e60511e4f0f26f9e8ff214fec4979b459c462717fbe84bd298e127204946d4c8814a03ca16fae0aa482b3d0c00b0ec8155d06ca154f7c95a01abbd8799c21bc41ad26d8105eadc56637f519606a9da2711904f91bb2035544f05e27f77d3e27ebb849a3445282b4ae7d89ac65fec2ddfd96e180fb5ce586b8bd6e0306ce1f39e6b48d1095c1e952ddc1d5ec292dfad50b4520e45cc66fb45bc08fdc1ff5414cb33065928d432e2a74b36e6b227ec2123aa247a598751e48aea82825ab9940ead19a67bba35ced9623b0a7abfa67a53ffc3cca4736ef7dce31d2cb7252109a9ed28117fe705594403b483611198f0098d0832d4bc0ac0aaf85eeee347bf1cac33652dadd6ce3be935be88e5cf85b80c75803e525be2151870b4b04feb1b33e126dae34cb017db909e62024c21f339245e33d965797f5cecf3285a4437beb80e6f8e1ca69c69a303e6a7d7df306cdb18f02ae9573e67ffef2bc1d408532f11fcb689be01c34bfa09b696f0e6247706b2d46c576ed12464e9bd8706e368f6a873a2d4b2a64d454869b63535a9259d22b8b2010cf35b3ef5a25482d91f9e9ce33bdb76e1dd61dff6ec8d8e8e6f596497f331f2ef2d033b18e196bb33031ca82c1b0a7732ee27a26a5ae3a9e482eb57ce2bfa46e766f2a537702b39fed60ba2eadcd7e08c20c8150d7b628c1d2801fb2d28b505dee44f03b915bc0420e192128446e9b8d9bc6cc14716b04123aac4da1db10938bbf143de0699f125836cda816421e907000a3a2c81f575d0dc505b7b07909ee666d3f6bd86c371a30dbe0b77f1357ed5e9525be021de5a3f3261ee66518b1d17c6d28f28a15de586a8214c7a934a512b7cdcf765919a06980c27a724656b2ed3c53837a7bf2df4d73bdbc514b2270910a1ef354137f123e351e8ac3ca9f778234a4b15c348fd479dad359fccb6954f8d40d53dfe7daa5626ebed253687f9a40e3e555203a49385e0e877022a085ccba941d43823ca8f496bc17e3b9b6637599d879c15f03bb757a8d3e915b70e44246c8c354e398566a4b9bbe215f1ad7b40d70e698710753365fe56d301fa311503de0940a6c718f80e19c163ddc3c68b01c4bb03cfeebbce56e9597ced7cd9960f08a13c6955ea0d3091bb47b896182f436c77b4170f734fd372c42d02c36f90f1f13a73be6c636db22c91d7d0f40b31aed828c284fd077f83a07f2e685959cb50a1bd2bce93ebdf3bef2c5b4d640758eb0fb776403fdd260f7b73c746c6010fd52113adc052ea2c73e4721b576f746ba2190d18735d5f0c1e0b8640c490cd2428782241bd31c81c04124c5e149bba337aff10f044dff3f85959a1e00c4127d1f0aed42eedb9ed779381a26eaf7341781cc8aa45dc4e03b3676cadf0436076dfd5cc10be7771c205cb3a5d914e7c7201307cc2616332f606f24c90b89476221781d9bd3784e1ad8e514463101a40b3985d24408a001134b69f023480250a933e99ddc5e23b9217d9d0a79e333a466d034bc60b09db75258e18957f901ea4301fc8e10f07c50b69afee6cf541d616090ba36d0d261de53155050d5b2fa8cd6381b4eb83ee49d409d8539a4f841839ed780d1e2d28eeeac0d20d73afa7eb0b942b050609def076611ca83996422636831230e35359750b3aced9ce633e0ee929e664378921e278d7439552b1c4289532a1b5c367ffdbd0071111265e3d39ec8b7a7988ebfd4662d514c1eb885247df61ec43c7526347c18f635c838aec969e22afeb0017bb44bdc258d50f0333aa9b7abc83f5facde2673a8c62eece924a86564d62a7f6a2061006d778c30ab17b51e4d91d574884d4497153cc6e1278802c901b88866efcb1e3095953118512df89070bb8f524d244ef9a82420c3ee75e1936e202a4680f70bf32a60e005c9f00cc4b1afcd577fd5ae21fdf6bcf3b250cd4b26a7b0acd25692aeb85509877a006a118cd9301274e40a96633f0bfef7ab3e56a7b99be8384c4ae9cc0c1e2be5d1991d6ed22811e0d1bccd94578e443307bd5c8dd04ca7474aad3ab1d0ae51a1d5f23ed42545b428216d4dedfac471f8e8b2b32576535863f43208165d3aa712a03dfc594ce997df55648dfc734ef6cdb0c6f12b36408a32cb61d865fc337adca2b4dc6ab3b43b6ad06b043c6b7e41060252acfb7a84ab2822c5222d58396b44600f6594f415fd5f34c9572a4de2ff565ffe3d12cda039b8acc48be8dbbcf70e6a961e44788f7c10f507dd42950d70131c12280d9a13c468cbf86c05112e8c7f14e16d15cb91264493bf3d11db5e41e0e946f4488a6fc9bcf2c9492e730eba3b1199e86567cb9a5e8357cd147b75f3342a05385ff914b829d3cfb9a17bedfeb6c30806dfd78f36c3665a23c70fc4f28160c55ab070931e33c164242ab64cd876bbb44ec1856c8a179f4ec7a602cbce5d201fe1e68b6b7a6f5e4f1f169c9bc5ef6e3736d71bd402dfa0ae2f3dff0ae51bea6d446ea41e4b310cb910e1b96b45a54cf9457ce5664f601cd0d0fb5f02e562224618c5552c1f2d5f5a9038772be62cfa92f12f8c93be5d668f437a9d343db45a22d567090544b8c8ac1377606e05fad96cc06b7bdcde2c00120d18541f6c97049be0d04a4a7a77cb16112affa243737c0f49bd2db23d608c117470fe44e06eb419e1ad935c2ecee9312fcfcf592d3b54f2e3913ca44a7f7cf63ff1061537bfeb155e3b7ecab042a585b5d239f311b6f6b03484032383fd3548b634f630d10f1c169d266716cd57827c59deda109f7ac3afa3022bd0884e47718d9969085ae0b9b644ead6b0d492028d72422a32250b6e79b598111bb60746191cbab90c23b9564cebe568394476985195b8a4c850cd3986e2b25d659bac9397ea0570ccca0d7472d8c27600bb69d6313a8ec4539154c76fc0fd5b5eb792c2868c062acacc6196a0b1fe9ab798002ed4e741235465169a8cc6b5b557887e556d69394176994a3f5efdf630be78ce0485128c2c5b5aa715666a87d6008cb3cea5081b5f60bf1bc1162345f295cc2819fa42ac59d8d07aeaa532f047ba42d790c5ef28cf09bc7aee6eb86a3ace00a2c18d0e4e364d64f66ca1a67b7505295e3e6894ee2ae1ffdbf9b123df93d7b4c28db5cbce3c3986ce2de43b760871cebc39d58fd7fd7a27b38585fc127843670be11d01c8f61dc456a0f5789c5c80a17615c54672b14292961475b7bf528185e36e2b56bade7a9c24584dd44b0ba2302054903f4ae0dbeef818d8dd12dd22affd875911106fc08cbbd675d4fe7056f92f78cef0dcf6968b5e1557d2c95297339ebf3ef766249004818dd5f143252f6b07e4ea01857d13063cac5b4f5f7d6fbf5b9835402897599219f106cfa5b49c145e4b79d7f0fec1ce18205b9921980ca1c884e4a1d4229db3f9a280b692891d7376fee6ea8bc633717513e146dc3d0e994a17c582f560dcf88514cc5c963d34070681c9bfd29dd86ed81984eecbf6d5f474c3407a08ec87ce50ba52183d2b605d61768ace41d03134c593aee79d401341bd19eddd8b003eb3e125ba7fd3ee32d53c3fb2ac75f7de51a204d7c7bc93170fa77e3643f8465227cac95dfa06e01c0ceb5fc9d0db8f204411ff8815a67a71ccb872b243dd4972b85227b52d42cb9c72e36948b1ef00a79a79e64847d760b4076499da43b66400e43bc3787023eb3485d8ceb7e62cf6e4b36e4b80d4ebe04e2e205626c9f0309d19dc1ee06906d964e42ff28fd411dc682d43b1da434063b0cf903a104d3739a7e7a7bcb58e8810adec5d9749123a1b9276be9bbd2971858c5a28a83f53d7e9a1cc430f3047042b902ce60f6c07024f040e237b91edfba0216c5e430c547ecb2b462299192927848c145ded715906e13d8216d401175b5e1054b57cfff5884894d3caecb8bb5ea622412993e15eb47c9f410d37731bfd09e9d1a2c8928d70fc8ef3a06c9764061ad311eda544ae977ba9e97b1870926d5e1e31bab85ca2e5616a2447bb4db9da5d1f24fe8403bf3c58fdd9e4e971e138a51e1361bec6cc41e1c6f4253b442337e776f8e0d2b706ffaf0ba0df3d0faecb9979e54c6e5970132815d1cd7f0346ab447afc48f3d72c7de843bcce85a241a285b225bf299d24d59ee75ba4f9138aa0ee8bad7b79dc86139f46bc3755c2406a0447635e82fa5105a0bbe0403bed75b550398b1cd74faa7d3e74fdbe2fe8317e8faa1c8f0d098b2fe7f40e33aa098e5513f523819e991ff7406f1fa766ac8b4ca26abfe51a4349b0df3033d3e5f03b1ca45ee56e22514d3e3f958097ac57b470c709dbd55d200344f0e10fc5522a02588bc77f272500b8ae9678cf1363a2437777f7eef428385e38b796e06c811f8aa524df2f30f91fe8c4ef99698f2ee4cecd3fc567b61de49118bdb2545df5692a9f2a0694302107641da567de8f60c7acee88e2d49fa0cd62715dd3e9fe116f6882e5ce3c993f6fb11542649c889ba37457dde0c415534b48bf227c0fe187cadb1cf29696d096b13648613021ff5200ab95c93fa4bb97f69a7ea60b349caad3e8a9db10217ae9648a236c3b1d780687b924b56004f70157fe2c4301f6840d4317d5f99b6afc8a021332dde5ed773b7123813cf2535c01d7ea34a410d42c2170ff0df8c8d1da0b0267f330d0f07163858137ca571e5f2bfec54423884c1979e5f4de33090497eefe0ef10f8ce4fb010d48b4d81ec474d25535c75c08dcc0992a9fb342dc61ca985d6e98b46a2978b6a0f09500a9f441b743a23ab7f2f4b5e1b76629a2c387c6b9990d66d9f94c7ed6c8ff34be991c2a2d72a11ab1d7227df604ceadcd5ec520a53971f7eadaac71f3edeb307c5caaa2c74aa8e3f435e46d48ab6fbc4cfec87cfdc722a8615ee7f690984af4c4753e5ff7342022d99fc9185c039fd18c34001025ca9614d8268d812f50751e117335a63fd7ad53ec653f0392b5f58a158eeaaebfac52b9a9a1fb86429f10090dc72f0a23adb6f3a736b4c3af3af7427370069d2df4def37051b09a5cec9231f3e19910351ec38e9474d8bce3fb1ba72077d25fe33c917ea6c64b11e0b182457e72f24cd6a359913eb00973e37ee9049716ec8b81dc20a7c77039a1709656a007cbc9049af3ff87f068c56d205ed5f751dda3948c5bf30b5cdffaad7ef385de2a8c9bfbf4691bef641fab2d1ce3690bfb2c960f65448f15c1760cba8e61965c4115c987657b4544044519285bd5289ecd944250af2e5b53bfc2ee4d01691ea705f8003b80b2e2025b699dd34f7c8b4c7395170cbc61fe4182572dc98a62754ac3b3ae8cb89898c6d3fdb7d27a72078177bfb2982f97de6bc39349d48bf640b414d942ff8fa4cffdf881e59a6f3e33ca346473877b28823efe17a0e2888cf77f73c95c1878600e144396a59f803986a34433f85f21ac60478c54e17802af00195b04584c0542c9964fac7656700c7699219eaf93b59c1ef218cb7a097cc4f0fe553ad61eb8d589107713e653912f9a18571507a9996014db0dfbe91b697750badcad4404f580d30f549d641b760b47ad5f37af156fa0c87ee6569d225b3e95bb6c0c30a35ded1def52898e12913835c49466f47b8ac6c03a3c7c24c2c473369c8db80a5e5472f03d1b78a2ed752ebafab13376208d4a92b97acd1e5137bdc9babc315fba7baac074f9db60e084676dbc101db2c8d9c496691bd9d8621786b5b262189f3c35fd2533882246a0617ab4854b9628c912ad61b5ba22e189f666810029de574805f284d5310db2b17ec125e2be2d4695aa6d8b4bb028c81d56d5b2107de306828e2365e6aede33784ed348610253aad3139d5987a85c0ab0bb3cdf8fd8d72b6010f85ee43c1447895449826c92a9b3f5e0b572f60d4d17c896346fcac51b446540f9c66a83506d59116c7a81f98ff072943e5e13497c7de96a34c95dcd3fd00680a032c5ff03235c28e4772da186eedda090816c075aab87c9b692b54bb55cc872743aa309bd0826ed1a2eec251f1d9b8874636ca1783f181752426ddb0c492f78ee347e5dee6a3de0a5f829eec8fb30ce22aa91b255973ee5605ef3f5a533a01686b6a44607e805a5f0798389051631e4539d77b4635250b6895ec426209aceddd647d17ca9f0129f8219756e63dd136d6fd29b1221eef1fd35b86ad70efd0031455e724c3520e95fe35e7c1955ee69cbdfd0587621cb974bfe0254a2b0b8e8b36c61034f49e8fe499ccf04146b9889723c1d4c3ae376b5053aa32df3c67cfcc6a3f600e058b6c5ff06d199ea158a07130d2ff2ead78eefcb74313354a0b790fd9493f7c9d218d4e2ca0cc9f4d4217700bb7ec9008e628c014333214fefd769caa6b15446469daf974ed710df37fd3ddddf805b1678a02e39200f6440047acbb062e4a2f046a3ca7f1dd6eb03a18be00cd1eb158706a64af5834c68cf7f105b415194605222c99a2cbf72c50cb14bf2004b0574fce90376a8f560cb58c0168cefeb4718e69b8db3029c313b54d7bbd86a936615c2704615d5eef2f886681bc52ea8734917e15e89a33ca8ca66955a27be538364824ccccd0ee8697ca2e78eb88001bf5d80c4baa281393fdedc7ab5545e03f3eda6cf25e0a66a3ac468befdcb869f71d29b9630721eea7cf500e84be2cc1d2e1dca87e0155efcfd5c326ed772a4ca3154d2d64e9cfef8c6b98e7e9c57ab17a87147f769cf7b1907d08a67aa426d2a8440c115637783bcc378df9e15275d7be984c9ae41739d37109deb49e4bf3238d112d0d42d965fdef9df6ed744d675c267c4aa0cf5a637ef7e20df86254da66dae67ac82fb6de5b7b049c6aaa9e96673a9bd73a404cbdd9ac705d19cda723c4182ab9eb25b82a7dfad448198c2d4b21835eba103ed78f0d171b96c0e82d1664ce44b31d2cc6938cf374c0a121e2cdb1882bbdc9d1e22041c04c7f94baccfa6f849e30074dc85fb0ef4eccac72a66640d16ba60d0156b99e3069e13e4b6d190cc29ff8518fa7d71075c936df855f5cf6e7873e86d719a24ceedc8465a3f9b96411afd2a2fb4943d50d4dc5e464f7f8fa51e54dda5a142372820b30b2cb56239ef83687a29797eb263f4240631754827597ef9bb1932f84387560adccca6e9fe3009ce0fa6d79162c94117003a460428e420cefb488530cc74e41c25da827745baf4aa25285d80e0f93201d6d15017f6ed9a3128a436604479518390a6d6bec2d90a69851e59a19f6c5d80e497221833ce41ecddccc51b4e0d34cd87d22214d82281989a097a98009b0a10d3ec1a79421ece4e65229fd64b88e45685ecf31e081010c3ce7a3eb8b72dee4e0f40c7bfb45785d259364515cfa516bb0547a82ed53a2e57acd0f4a8156d70750145a8500cf10f154488534e3cca1267a082dfebc1f930e0bfae5adace021742546b4adeae83c0839189290435608de8c22ef8c940e5dedb7172dfb52354691273121db03b7850a9eac954cc2c10dfbaf49c914bf4887ec46cced1ebc80cec81e7ea9f79165725f49ab9550a93539e5ab25c17f83f499717fc02ffd32e73f80d1d454e9dd198c6f02be9b8440d91204485fe2b3293a1be62b9cfa80fb92232009dc2b992ffc59a3938daed0ced622c14e9f3199f84396b21207578f61aa01128e3e35efcf366361c3bfd61c9d54f182848cb8193a37923dfcaa4c12aa5762bd28a17ad404ee321259fd1b50f37a05b0b3cf7e1c353e95efb12ce4f11fc0cd899fad032e174c4c1f1eee86541970e8b4a3108b88337e2930f8372414080ecadeba0bd7e750793beeda3b1e10575f22f41cf6e8477a22d5689b701664ad68e1244263fee5f79d87e9548bec6cf46f39dae6299c3f525022ff6081c1c755f79bc3005c811254dfb6775687f6513ac7b7cdc852af5a0530965d10122d264ae37f23b99f6754af6852ffa6d746a56f -MD = 810231a63c06bce7f411f1b8ef106c364564a4b90fb9b9b275c0749ad3c83983afe2044d1844d8ef76c03a1acef7c6b3 - -Len = 69136 -Msg = db321b040f8c684bf2fa16954f6d63fd6967d8b6355f1f95c66714cf090c1e03b27ec07b76f16baf7b42970a0dde12f192e09702c079a2990d95839967bbb1692635623c3f725896baa8fe0c66bdb34bcb68665b60946325fe056c33953d0cb81ea128d0d0d8d70897747421c2d4f111fb486d4b7d77094081fef826f95ad6f881083bbe93ea8f0efaed20d389e9714d0cc9d6597feb3df37eca4ff9fddab83139b3c28eee7229afcb5c2ba923c5de06e531c60eceb8a745ddaf98340884596c2deae6c94b364cf4f209bc2bf830de456ec867f0d2a6ee3e86f6fc60812162b145f5cff61100a1e3573cfce270f219118fd8e189f47cbbe662e6a204d2797a06691ba49da896d087e33d1255f4d2397230a75c619a04b54657c9b2a862544a7581a58e4678c080e57c53270dea99e370397efffe2e0485654ee556d4997a790575dbb47ae94859070bc86390bc0fc11492a5f2ea1645d24b3084b411dfb3b0be2d053fc063f505f479e2ed68d0fc7b6524645eadbc8f4501e3ecf4e69cc697a9926b56a14e8e29b4aceaee1c9028b96bd5036bcd86aa868e51653fdc387cd5cd8a5522a412dc70508e278d35635b222f8ec940d4de5d3cfa6039bd7a1b9d1333fe0aca5117a77fcf06e3f33ab05c5eb83800064a2b710f4efaae9548aef1f8e1d7d37730c5b60139fb6447b3e1f4160fb9eee4b5d4afa991060ef0ce573f2de1fbf851ca85d39c9657f4b2295debf23afbdb039f43dcafcb6c9ff5957f51593b54c17fa6bdc4f8ef01d95c238c099943e4118a8fdfc3cc0414aacd248fed25f5c9752a4cd752be4be15b6c29d615b4315ed7a20e102ba645e6769f03eddc3919415e7945394596b3dfc40bc3a3d9ea0d507473a33edbe595ca4d94bb03e53caea6c295184d65272ee35a607a5b1be4dea13124d6d19c32fda875d4d338d2d7bddfeaa54d797a1ac4d56794d566a449ac3b56de2f31363584683786d3f36ab14dd41ed26d274b167d9d31ce5d2c3cc280052bc837c7719532f2dbd2439e7473666da644ffbea1c4622301379816aaf761e7f70b75f915fa0f2ea9e1aca0b9c41092c9228ba644cc7a501ef7108ab88f57c904ce7130e90e2404e9db9661014d542bd0949946fcd5ce0ad2354df12c336a93983ab4d5b676785de2e8874913b5392003c4b2089187643a6319d5b4cf8aa32dfc77c54e44dd131fdd2e09c0b9a5c859aad75d53ca8c46c91acc3239693d098078ac2c055be9fe3422d8a32eb9c508be0df8239070897c9d3f76eceac2f3a47253017260c3424082f90cdefbdcbc0138744d8b254b290ca01a3e892ea1557decd79f1ec94391e1f3aaf2408fea33bbad26fe1d7b231100b8f24d936cd00a9bd74aaeb8a7a57eea6e7cb45352abd13f076c3461fac0ec5fcf11cb920e15bb0719f555c962afb062dab9779fade73f942c8e17e00aea6032ccbddf0c7b3910c79c20bdd8622ad05121a766ab066524c206d4ce2114681580973fb18b1b04b0e546130e6d0edd85c02a8ea6ffc6ee29d27b8582ac7e03b55118df6a96563d446801156f10d09278b5ddb86223564af6cb75eb5a0ab283e5ae37e432b694ae7359b46f084a0f0f513b226cc0a01c4132b5db4c7fc216b04f9ddc9830713d1de6bf476a02a2341db757e1f1e8fc829a859895f1185c14519b29ef418d52b95345a2a14c85a1a5845213029003c2ef1f997d8a224e6113307157582870de7018370bac5db8cdcb0ccb766d913977cb96136ba42749587b137731ff95029fcb3364004fe7c4b10e7dca880b3cb1a57dc89e6bca4730c9b3c358becccf6b1c306e758c7230d1d2d79ef652c2d894d36f7de084e4cb2b3c2508ba06a820d2dd088f12b4fd8106ba8c38f8db7baf098a087d81bedbfb643a38a9461279ce5f6bbc5fe282d9228bf09713772c1f073951b08f2a21951f004a5470a3e929223c4db2a68efdec5b89fc5ef71c4b94294cb0cf7d83b6fb7f2af5e12379939e648e0b542cbd2d1f7428674bac8f42c45d692fcd0d3384f56308c2478b7219c2dc802e09b8181b5bb48fb7c4f9771995ebb8571308e3936c12c239ef7034827bd2373d381447ce8665e77733a87dd6f11a62af07353aec46d581e23f9a67d6b38ddec04b06f14e89cd572cff7f4883bf338fc0125ee1966df46d46a0d0b41e51569b3fa957bea44d34086090478127e77e66109d497f99c7b7adec7bdcc3613d759643bacf58d7b9e4219a4ec7cfcb504310290ebfbdfe3e656a5c36843ba75f32f953e63564efb424cb63a1c9db76e4cab593ce8843ccb948cb1f3b91c4f89fd4e9f895538df5283b2e42f1134c308a5a7bd4466cb80b1fa6f9bcf0ca085de5a590b92fef78f0fc7271bfa66fcb012a3d8d76dd33c4c45ac81bbbbff9acdd19eb161e1cd2d0e81811bd6228a300f2adb91101faa410fe51f65aa50fe45b8123efa3afc4c43be6646039b4df77920af91730fb078944c1ec78de014754bb50ebf95df5908c61f0c8a60e3c34b52a52f79f11ee6ba808151395ce57d111745259516f77e6f4ec112c2d63828d236fd08f98dd618ec90203ae96523014e32f8f563effbd2fc2814e783b610f538b0a8eaa4cbbddd8b6dd92a5c3941278929410c8093650d4bfcab194192f6aefb3a2942e01d4e9b1363fcbe064b98865e54adc99fb3bb73bb36f41680ff71bc763e0e805004f0d8110d1b448c1ec1743a6fafbaf5a377ace661806dc64deab45656c94159155d1b00d3a58c32253497a9b4b76f46e5122f49f6c09d9620ea1d080eda048fb0ebea6f522bc3ace16a5728de6544e81b23614281351454faf85cf7b0b128488a15bcb9033ea960e5eb39443729da7d9813e98c7b6e60a74e8e0ac1f6ff4b37e373088a513e9bd2a53fc46879859e6bfe7c3e745fdd10e19e239ce34c14dbc26f7c643fe6ac1996a1c07f11f0091f37b0c4c69698f193b86c5189d82a82687c80aa46561e17b1115e25cfed4514db655176186fd15c67702b80581d0cd86fcac975357971f1d0c75cc84d36e33931795308aa6c736e1acd6e389e2e7d8750319c7598068cdb274d00306dab5506dfe82815031919b71c14b6f2b289070fc8459c240479b933f306fae6a7a714de253652f3a8f21eb7e9ea78474bb913d2167b2af8f16fa18ce289af6391a69d5fafe8665d1283fcf112b3249eb04b2e9ee946db6cf544b0566449903fa24668ebee72d499b65b5ef305036e71869bd196bf3d10187685701106cb3fc35ff302035f6a20322ac4af2e6f5f986835378779f6d28b53fbce6b5d388310973138f3468142cbcee66c5813802c44cb52badab92e8b8fd80b7c0c9b7805b543ac84b725d27159c85fcef43305fdf643557225d4c4dcbffd0c1ace4c43c790215862b811e18a3ca71d490e1d5f492f48b41a034d685a7e3ba4273ae03a4d33e89b5f80ab3d01f6f3a5870022fa92525404feed8377794d2c3a2ddd17ba1b12e20bd7ab42236d1b266ef564f4767df1edbebd6f2770adcf4754ab2f234195afa61067928753100bc7f000b6f24140a08e47c1e2a9f28c67057a0babc37f617cbd4f8bd0db4abf5b40df5580bce9aec0ae36a8f27b5b8996ef10dbdd48b1e30c902fc0d0ce58bf9c3963503cb4edfcd4d611cf192c4a19e18ccfa82e5387bed1b727833cd12b95211a428d456abcdf7f8e6fc0c12d1cd1d946fcdd29547f395eaacd6f5f7421c48c5be369555ed4bb134f871a750e6235d0a62f0758cbf70725d397c1c327e9e25086dc70c6f1d40422921e38cf30a8ba8a32ec93373a8d9ca9da0d47028cd262f013743024d4296f3fee8ba81a446ed44865ac2d4f20b16e6d16944b87e379db0d9a712409764340cdcd55f4f0ba1317add6e411fb0ef0e0e221d36bedfc4e9eeb7429c8bf48b02d5ea7138becf234092cdf3b0dd565cab8ab8431148f17df332c4924aae0cc0e8955143ae9599d400d4807076d68b5ad4a1ba633d1f5c69a3c3271e826f880ace9638d42a9e10bd5a881e6dfbd2f8f2719c5006220bc990e2eb096ead9810729c1ec8aa129fdde536f5ce72a799452b6bc3a4b328d3e0fb96f0920b34ef4bff3a76284fcf61a7547d64b908e2f2190ea85edbf2b74148b1a81be97c7d3de2b990e6824bcaac1713151d07b614a71ca111b5204b371baaba01b43749f2497ca887b5fb246a47d529e868df05a57ef7ee8e109947102aad1f8703a3fbfaddc2d5052dbd6416fc889edd8d697cfd4052fd08b66e6daa36fae7244f5619fcbf5c47f394f0923891d87bdbd3cfa384b5d4d465f0c8456d07381abfe2782b62b8f1063a33bb3737cf6fc7cc843602a3a4267d8f06cf58c26410c1400230b99390291bc05247da7b7ef28a97e6c822c0d6f0006c40aa2d0f162ae38ef8a64cf70fae8d6f39bc036c660ccc2442ad8a4514d963e6e5824dbde62d88930c036bf6fd25642e2f413b724e63965bdf0dc2982489b0e43f7e3e3599c2b836856f9ff82139a9e47dfe08f5009fef24070f5323cea9ef4d94c78adefa907c5fad116f654490637b6c1cf55d4269e06700dbc44cdce1260b2d84b81fd040dbf6ca1263a52ed29ada42c38712dd69700c139a9d7d14d85f0552de5162e279dee425990320a7a856e9471a487c9946a7fb8874671d4037a1234bfddc0ef9e48c0f06cfd83f77baa090c54abf033da88d1ca790a89426a5f54d5f08e18bdd28ed60b4dc696865af7fb7027a741093392b57b717eb498fcb616bd727e94056ee09bf79e73e043b2ffc4647d3f009619e88950230b5a64250f065fb847b972cdee9159b18e07cbfe41e25dc7dba587082acbcce04901209dea72313441ff7269f94486398d636ba73ed3d099f5a63888ba0b664bb03f5aa1a908e67925dc80eda1242198fa89cf38771741662599470616b690c7c97b8eeaeb28c3f94be73aa366ce90525df1534c6b3b34aed3e52f2ad15bf0e6fd2c19d421506e272c95ec35ca9276f80020843d8bae3ef699104d417a79fb1bd3f797f7dc2e5995507f220f3d1e39ecb99dfe9668eea4bfddb14df4628f03e8e63485b08c00fac65fe978ba4ed05db2c2d01ee1838b2a6d2a2e9dbe3a09cfd09c897fb8a176e63c938b6ca1703746ecb45d61a95bf214a0f71eb9095188a3657f5cc25acd0e905aa3db5a6f31e1a9fd169c635862b217eddcd82c60596a2319f7251a216f267dc2f93fee7e143deb6662139069285998964401644db25cc350ac88c3a6f85d22e81c4f755887ca8fab1f6975662d470b4cb510fd3becaf08cc07ee7b460921144c7580ab791d060b4db6f48ed9d2090473b89d53b568ff67ce81cc8da901f0c662ad59ed7a348ef2c0b15b493ec71e08adb6ed0444c7bc64eab2a9972a837abdcd2c51a7b67ea3baa6a6e4410f7d048c4d48a69b54896494a3031c1454fdfd6ede6afe86c84c02d7620045e2b6544b03f4d650658f1e965b7a0b9a81b2e2175e28e1c6f72a3d2add7545f6caddfd600416f8511f3f07b03df2248b6bcec047003f49317546c26a4172f05d45f0c8d20136174f04fec550c08df6853ef3290af983d9c48dc86c6f87cd88000069571f9fd4cba0d348e7d667bfea0e77da8ce1ae994bf6ad09aba934f7758566d218a714658ddce6a7efdfb80a878da2ff5c59a3e1f85e5f94f085bd73613405b59e17138ac679db863ddb15e057994cbc27e15de0675221f4eba3a5e3b3b2497e47de21971e0e1e7e623725f3c2a7e19b6ff74127218870a3fd8172aae576cea6c66aa32cece01bfaed925c97614fee37a52a0228bf47d81c868d984b8f07f1c96a5b3cbecbb67086406b2e5dabd7defb57f805678936d4e94746ab4818dc5f50c41e32cf32e7a8aafb300fb91af6406108cfbf5627dbd374903b10230b6a63d7642249c0ab0a20d38e7f953c27219f03383fb497038d705901e96b6edf48abb7bb15d6559c84758a6aa8434968c0675c56b6798cb4e218010cc0117e2cdd938c49576cd09fed134a20489e83587915d6f4d262b9a47056f7215da6e34cbfb7cf9f6561d42daa969d4fef1b5c6eb246fd830224a06a9e99b5d0109030e76594fc1dce79c2be535bfe39fa2e4713e2674a81c423d37fe37cd7a99771e96555979c4501094eda6defe78f085bc600aff35891a6e4b54cd56cb71e40a07f4f064c1ab59b94bafa50ced3af78287b8d6167721308ebd859fae5de9eaab0551cfe3f01e00ca0a9a6b2855d2be828ba42bd50518698bdbf4fba74d8ab44362d57b3ccec44c2c19d67f98fee74d6b124a90a3a617ca4bedc669a962fd49b864a77bd9234645c5c08a69c6b022aa2762d28de821c65db73b26711c63eab2f454f05720b74bf37e47dfb218332bdf9cc365aa0d3fcc29b70d3a9c6819f8f5dd7ad7987b527c5f40f5fce1f84ea9f4b47f2b7078c8d23634aa2a71f54cd01c5d1d85c551bb8190f114097ecdcb44ef55dd4b6692847f8d145b1f792cc31a2e5b86216609bb018e7aea3012ff70a5da6924ed15c33a7c354168413a73487d34befed4030d1aa562c4c09724f60674bcd79d3b0374b47036a119b73e33a1a13570cbc625c4a01413b6dd663c1954589e87905aba0bb804991eb5aa0dd5972f3958351e539614f6a9378bc6e2d224fa87614475c2f20fe0659f86412dbff2cf495e860516eb40f52d3110df9f893c027f4d03b2a18f81aba20bd2a5285b7a286b6a04a2f52beab7a68bb5d8faa465178f331339e14cd50d584ce2fd8610f7e3a964f91e78bedbe41c2dc2d97c8c67e1bdfbbd330990d5b09049fe72cd4530a70b34aba0270ddb2597ff7f0caba90a0a138d49c8a2c2473952ea6e2c8764ee1d98c363518b7eb22220e833971263163799d1ff1f334cf453a41779523bd4f9ed58f768582b7a2782bed328a23623521256b027614495a4a490b8680c72fd19be53b904de8f6a03ed7aa5a456a14f8743521008b55e051ed41db58384b347163892f27d0b40b40e0d5b47f0dada517d7295dbeb4408042c8c53f612df861ab7041c881c06c5c2108769a15457698ffc4628f71836cafa94743b645d4873dec5caf96529f8a6fad106ac9b17f5d773cc67124ed7b22c4f1f33dce5ace503fb0931326fec086cc618302d1e83dbaa63b47e5bc670e0b76b95723f6246debdd948e2ce90ac5f9e8dafadf310de326dc97e330c492ae9f2b7bed86ac4745c2ae04d85d5afb324c4b65c26065b7121a50cf02d2bbe4ff56599620e67f17e87d079dfc150b3478067abe8436fe584d1dc94d315c30c252b997a48bb3ed3ac86390ac53e4686b19b0ed31bab35985f6a99c9ee92d91df5b415c33988f5514582edfdc8a5bf0f399c4196bc07605a491365130b4d77d806b861dafd1c965293a272b8b09ec33626ac885c95fef9158cf4c7daf0eda425a25e06295c2128c0dc0f52a545d05be3c2f26c8d6c3906b06e364786661b69ec0fce8b161e3cb48269f0152a4ee48efe539774910a5f921338016d7f357fcd159631780b0a174180826e41b19581656f22c229d13719a226317cc22d25c0d8897faf566fe95ad7a26fb160a1e050e61e779c11b3ba0f40d1a3d0cdf9fe87922e126facaa83ad7ed077e0f962f8f91bf49a4db6a05de873fcd4241649877b04ed979a0224a0b63ff2e323955ca5230cd7d2fca001e64d448f0da12686894535af5557e144082021f0fba4bbf7ae76c0b068d1553c1ee5b972966f8419cd8c2d5a95cfcf7482912db20788f39bdd9c3f68a4f55fbbcd59dd8db7b5b86818f9f5d79f29561cd8b16a204ffac6b0f83a91e5ce9046e4bb50b5c8b89c4bdd3534940fbb8efea2d02ae0231b20ba9ec8fbbf112ec99021af734b0ce04bc4dfeae412e931264e6f33a197a1b22259cd1584cfd30cc9c7d9736aa63f79eaabd501b1784c4818ceebc8c198835d292ba5a780cc12afb87273cddcce4bc9a389294045cd22498d067e592feab2645db78f4595bbb860bd1a598671cc16199ce542704519527cac7f91ac9695150fe585f1b96ba6ac670046f266d2a78ab0fd4788595c64c4299ec08a8b9ca293a5e91d34c9ab94d60caa7ea634a7678ed8ef3763c230b760988a51d3bce91816709308c13efd8e1e97e34bddba971509d79a3e3b7469190e1199bbd20726ff85b609cdffdf089b6c4fd233ffbe4bb7e5f625e37838b093b6dbf385f136fb5fc7c073f4557675c3a87da0c074096b58097db8af82d4ad2c403fbf37970f0f41c6d6fa052dc9eb0eba69747aa5639efd5db47d29c21007ec9485265a2b5c0bac6940c689eea213858a5b77e8f8938cb0c9e299d99eb666db9af54f7517e396a99845fe08ffc7952f019bd192d663de78355137477f8c74023bd66210c26d593f3b2eca08ca0018150570a900a8993c5e89477dfcce5cd6685d7289b394c1fc763b435313b617443d7f2427bbd4fe4d68ad0d937ff1ec3715e90feae7f5a926567eccc1b02bd2c3b158fd754ac45abaa089eba25852043d12c8f6ad334deb7fe8ed113c6891fb3a797644b835de752a0e0628d210576e9066e06ffb200450b033705aebc15158549bc3401b058c1646b90a0e4a2e6af1d9191bc1fc3582a0613ff0eef645d1b2b721263bc3413507b6a97ee3333af254c0346036d7fa30a339155316867c7ad00b12867bdb71400e21e64bf0b4bc5760ecbe9614b5f77420e1bc831ac3edb47cf977cd49891d17f43079577df63d00dd06bfa7a4bdb5b7e1013c6642d420e87c2857e2edf5ce21808a698cd221455793b5407a2e18bb62ac409ee6d5e19d7c9942baadaf490bc67cd7bed1365c5ac349a247f7faed91db4a46e9ea1d14edda9beca916d7aa5d6eaec1800df3cf06acc975df064f65c08c83bc2559609397684ad02a05ac424b81e0eeb82a4fa3d07ad9d50d8f77a8cfdb1e4a5b1de78623906e96486277395d67d8066e0f93004096426adb7ab8dd4632e597921dfa1619b9cee6081580b71b895fb2a8a4060ddf66cbdd50af5b2caef89e4cd241e16a024a336674060fe30e4d3c9a70d1f2f334533ed67417a7be8d9512102371e3ac66ad65c1931e6ce5bd1c3965cd7e9dd9c8c662fc5098e6bb6e71098c8e954901cb492c9d6d43dfe6b05f1cbbc89350e82125fef8eb1b5e4bd6f44b681a955c93bb8650a30b5eaf0e707cae4667f85348c9d9db714e8959944f869f4bd059618abdcc987a7458258484ddb7abb496ee20484bc1107fc81dc1608fceddb6caa30e5a83cdcab017897174e8ff95b753699824e2777d88c2f2f89277a1c7d7ce69451813b73dc88523fcc9074daa77180bdae705c75f705d22616ba6ddb1384efa5a82e51e79c3893a4e0aa16a92fcce1e0b181e775f4083f42675844d42e3339f731d5fca26a90a178ebf1d1ff64e5be85640945024ff1baf6c387ab823df63a0b973ea83ed83f203e571e5327e76a9b2e1e6cf1a57b50d9c5e3beee5fc34c845530bef10765828447ba7606bd17b9ec3d492379d9f6b41032106499d74eb49d6696dd43a6830942277e9f6949865246558cd34a0a5289e2ce021f4a8330acd9a252203c96b131ee701bf0f737a3c22de951d2eed10f40e5ec11555cee29c3edaadb1e285290aaed943b213d220097f77b20d8d4a89d779e2ec68d6d729a683de29a2db35471c2c4262496a7731d42578d722b980b8dac5018aa5de8aaf3284eec27e54a370528068890d7d2a56a3fb292ee61a574404db00c351d4b01d4729529fcbb7954ab29294de84b2b53780e9d1dce01896d65ea32abef622111aee5a51ea146bd47d474a0d893872df7b72d7ba0c981c0715ee05c6a41b2f754f2eff34c8ded828b216911db3b1266fcb82ad2ae4978c70aabeea1b9c4963a4630f004463b3665891294d0a8475342eceb6536a8c64d29a3cd63872cf072665ff9945c6e31a7d2ec187681d230e06e42d18b2c22d87544d743cd91365dde082cbd5b605709c8570eb38c89eb90402588fb0b079ef897c50fafab3468553f9c16eca3c4830c0e6e7b64557d56ddd92549d8436d9f9f1b16d7518b05357f2d9eb9180bdd64e0e085bcbb5fb0968231d9eff9f2d2874475a6a8d9cb7810441e9c8db0022f8f00e5494d1909e84d15d0bff5c067baf8714e110eb90af1ab4c98f1ff55154f63f49305971de278cd114c33f5cc30ab65bdead2737fb82648e1034b9867b3a186246057353a87e6a90cfaf26a8dcc0851730267718e617a8bba0415f3787bba6818d3cab1ef68b663516367ce85c8763e48fb4c73758562d63011cd7b07cc1e7c6a73bc77ace36c7e971c008c348469aea85bfe13c59273dacb92fe998623324571b6c8f113a67d7d369b593e2aae5705099af8bcef1721ec152e15f9842f8a55c7136cd884106dc1c857ee5ed894b2e3f54ec8e95291f19c85499005723fab2fe3200478aebfb1feb4e81c68bee621bde3cdeb23b081676ea45c1937e0d209364e534c6bd412ee8694b27fe64e0118156dbeebe6597407d4eafc0e1b408528fb8123912c94a877fbd04d854216740a6ceb9827cbddd83761d19feb2a21d78ef1f4177f3570fef2b1101fd926a8bd7d36f5c04b2ebe2c8a87e0ce3cdef537bfcc3fb56310f964c358acbfc7ee655bf50614eda2997aef85c9a0fd7fc44b341fbccc73e9398e988e552e93fe13eccde65cb176ea9684af9da98aa42054943b337622e97e39b10898391e32c821af91d5ad53d26fa06bdb56aa1658cb1a50db9f7abb7c9e7bf1139576e422d2b20e26476a94a6ce31a0f1254ddc91dc801193c82d2ea3c68adf67ea9128ca9a2fb919c036cc6a72d4c48fadf735d5d12046d2221fd4f582d0cc742c0a54c08b0510eab4749373ea0437154548ca9b5575713551c556f8600858a6ce54e07b11dcb5f7b8b66279b04a89208fb4f368b5ea113bbbb01d12ca7c049e46035470eb1108ef316eb1d252122b1fd1ce58b48f08b733e4629fdb4eb640b927983938634c9a3fa3201a244bf5ad81dff753155d5bd3dc504f77c849419d95e786074816d9da47a25d03d60a5f70e4fec28ae18d5de79373e91d5066a89ba30a4f3716725359b5a387f76e19ca25c7b2a268cfbb7962d7e3c1f90a0355ab6f0466512a124388f82b336d5306c03c88902965265458f638146ca36bcbc34d586a6dddf95324f89d9de1fe3b3ddc15d62bca089be456e2228a4b94ec1c8c020da0c8461ac17229049005f27d3b68520eca06eb86d80de735b9d16601721a59ed4c0821f4e9a58acba632129f8c1f61b10f52567dcbe855c027a06f4268f8c575d09fea1e48599e5124d8b728bc4bd55b705f01f72c70be80584b39355da1d545b312070d49e8f443a07c589f28881d6c716f5669762191c4c0045c40ec9ff9cb87e121388aee0d01ad9f8f697d5eba72a715cc7b3595702c039e410b925db375a39f912667c34929a0a4c42e073a3cfc65e4ec72e726ca14776b6febcb6582e2ba900f6d8d23490a3e4e8f4372950568524f3f071760101cafee61680441f8811184c46457687d41badf59403c09a454d0d72c9e22cbd2b321a9ae06d97d74df6cc088a1531d666ecae9aabac012ba3085ff3daea5e49266512fbe5ec762986c10e5a4bafcbc94cfc2f00c09ab1a8789d63a0acf2d24cfa4d2e30ac63abbd3a5a266a0f7d0c079035784e5b349bbcccf4619fc660516fb0d1b661bd3bfc3a71a95c6161e6bc393a7dd0ad04e4860da8f5a118b09da35a4fd8f1b8a1dd32493395f867c652a20650be81454412394313886a34f31290b4df4c285adfaf1591890841a3c8298717dcdfd13da2247d071695061a1626e0256914a372ff1b6cbb7aea803eeed43313e5c809bea7831a01b804bbf4a1405a57f318aa268a88016e0f21fe60c0b96ea3746170efd997d8d801bdd2e71dcac8ef8840859e075e9a534f96002fc741006f909250f9c3c87f34f9a8921d112bf0982d747b03fe0400114231d1d68ad4b01e4143ef03ea7fd6bfa9ae45be05cb9af8ec9cd57df7e4fb51f0dbb87b92db47598f5c9736d822a61e18b531f1811290b7cca0dc337b6552bb627afc4765bc8ec783c58eba141bb7fc4ea6a0df0e68997ed668d54e11efcff69ff7e6618de14a1124661cb626d0d1ff546ad8b033357cf510dc0bf542ea38abaf3bbef192b046de7b278b5297abbccf31e7228b79e102c384e5c55195be56819b2dcc21fa9349d78ef121b8ed123f15ed07c59867d4f3903a694a -MD = b3b87315402171643f4f2826ccbfa633607fa9eecdeb224395b69ddac04d01b1159034fbcde1e0a7fb3c38155ecb6062 - -Len = 69928 -Msg = cf183fb8b2020ced8090b342dab7e400f89ac8f285077e0fb045cb58800d0d0467d671db1b5666e0a1455232aa64833423be68ec082d01a9792194e90f9da279708219de2110cbf49caa1fd5a3d906fcd39431ab7cbf8289b0f1c0909a7a8e2611a59e8a6d3a22729a4783f36b2056a030a58cf68ac3e8f87e3eb716c9adbb5373c668a7a7db53a2c2a5e753aa4159686178df96da431d3c0b8ee043433d0f48be6ddffd77fc45cc3d4bb1be0942f99c8f9593541346089d7e6ca5deb132744c19226b5383a4e23832c14bfc2f2d1d83e18511f6ddd59165ff5d6db1ba95d1a9ac6e747376db112eca901bd5c609ad6680cfc044e2f7a0dab8eba182076d0da5a0d86223f6a9baf52d3f8b1173df908d93fb0708c7b41d46ce9da71a3fc212891de99d2cab17c5d682560177e0b6b040439250083714f0ef6cfbe8410b9cc79d4a278d563f2c1b19f15ee7d0b596f4c7b81b020dd820021eb88eccbe13041428501c9a6857f1a206a4dea4e499884469191e84df52df391adaddbc5bfe01e17457502d2c9e6c43e4c05ea07b359288708e2340464e5a7e2dfb711ede759c16c7864aac68b9a7e7fd7066435d31bfa82241b39d0a7497ba9d43d05b101fdc9c6a059281e553aa7497da7ff55134148dc8575503f26ba0d3b3d984dcb9a5c959a5fdb0126b127bd4fb26301e21e69b1da9fb92dac8dc7db3b7e61508a1ae6b36bf962cc9c29e24ed717d022693f15b410f53f18b526e3440f19109468fe3cb1b02f78f0db1a0ada940077c7570fa5ce24087fa7c59cacf64a803ea004debf0f1b449614501c01ceeb2eb26737faca7e685c03516a497550526633f9da170e29e1eb328db7aa57ba60d5288898aac433726262bc1fd7ecf0db1da91855417aa0c885e6e36e4f8d1b89a632b1d57a538bb6be063e62a2744639290671f2e8a4f213971babe0760270ca1479699b03d8f5c9c1765ebf439bcef11ac49d5f671d9c77b1595dbab86848a6a2551635b1c4f0000f2ba3a235d40997557bf0e767351e5947286f59711f01a3c26e5e520eb8091e09ae9397f3ad64908b852337439be63cdaf157494aa74a46172d985c9522af684367a52cf7989e710f889aab96b28286ef5cac06af916101f30b5ad1cf8561734eff6ecddc15e5bd63eeddc0db0971ebf6b2e41e1a5e046bf8802c4e3860cdc38ede46e6fbb5f8da2b3053137b0142c083ac860c057da2e88a34632e4a3522dd757cc424e0e9366bc7e59120114a63a90892083d1b60bb1c4a90c5ee8f832f25b5536cf426302cc6bc971e531845631a081bf14da6b7bb5b9c2d9b2b62db3130a11ab7d1362b5a8f8b9d61390a72bf7804a2c79a41d3223b114379518e9dd782db0b2b488b2b3e3ab780f05e6262d75780bef1cf77539e4f2caad6fd4d4b90a0b5dd4dc6afc0463cc2ea422fba86493d0ec91639b1b97dec40ac4a9b3974eafee3e985d81e7b112a3021dd196d6d93acf1699b857b654fb71fc02a97ddaa5501c7b86a0951cc1d7781d037c81589350beb18f82f4ee792240caf2d8fa44c4d6de3d260b6e423c9992a7de8a82d59abee5e4fc283b6d0c3b7899199ef17eb5277cac0107d3022b423ac7346362f6f76d8cd86714f1d8182d629401642c30802d3eef9efd8e0495b9b8a58f6fe862b144fbb558ade1daa2e246e0319071012bce6c2f855365ef82e6546a7615dec1d02a79a2575bd219b4416ca8318c8999c0f44d933f73216cfab1563e72c00abd5d0950c7ed868b3d55321b128abe3ca146862a4453c38a22060205480ad536fc5ec8c64da196d5ef8e9d9c46c39051c1c66c4b6949ad67baadc1aab1c6bd2826de4f245cfcf378d7666a386d646992a0478ef82baa9782dbf8d68da02ee0a9e4e286b21b85063c9ce58234aff5b0c5e7d1d479b2fdeba12eed29f63ecba680de7455b7b3c435e9e613cbdb33ffcfb33d6c261525ca108d5a97a32db3247877bb9ba47d4c41e9465ff92e74220a2d244b216c16ac9a6e0e08fb2a7926c1bc5423605b4a0c858b1cad9e9346a39c32e0b9f78ec271f36debe023a724bf2bdce0c0c962671e178133780ae39adf3f46ae2ef77462996075ee89160374a8e93ee337e1a11ca87f3553694604b8fe7ad1575228063d4f66eeddacdc24b206834c2533ad00b0d3460d442759e0e827d53ba4ce922d9db98f4081f07ef42504826c6d5a37686dc6f373cd5b4b5e7282d9ec5a4a3dcfc8ff62d3a2fe035a17c76d08845486bf99aa0eceb8ad25659d380d4d446d32d5074a6710087d733dce7acc8733caa2ef7da61f86cbc4eedfb371fac429e07828a2c2275d7a16d68793432851406494de61e3af03cf49aeb3fa5426bad04b17aee18e2923c171351fae4a07ce73c963768c8845ac8be36dc9bb0a1b98025418510cd7f5cba53597ed67b8f46696a2179d48be6aebc93b34093dba61c487a682f86ac414bbee0b05d906b574816f96b93ddbada5274ff90a5bca8d7ea827e75d8b447e0d5d649a86cbd2681187c84e4f3d8e7c7ec9e6c4f8a7a8abfcaaaac0b1f1e22c6818cf8b22ab14fa52e06771e485a9547d37564405d5203b6334d7d887148cf7ae53f685e1611593bff414a87dfd745c2bda672239cd7a6639ad77d8e6db8a076678a231ccd51a59e12b999b248d37bd0f1ae1069c77fe53087d5267d72e238318ee9b36eaf06e773feebdf1e01d399eb2608b9737bbf42b570b302e61f5a1934d1da93e4498581362a34753ba95c3289a122e7e1182a315afc1d9d48c184a618b6d94eee0b61f56d0b40068b8dd1d82519a926332b2543a97061402608067125d4623f0c8330c671387b0d9e5dd8fd65f5e7feca3354fc19742ab60e6133fd1481020ec04f5676eb3861f4d467e61494ac8bdc46bf1dcd337de649525ba1cc4d63351899ae678953617146de5a6da059c3e139192d043980040084a255e44138e177e7094ed860226a458e1c93e4332dc2a4bfc21b9cb3779d15f26efe500e7f8247149f9f1dbdd0a94b450fa2fe4f793f32bac1f93bdd92bf930d28a3998689dc3f1bbd2dcbd4f6b4fed62815f057d48017c4a944861a59c2145f5fe4054bd045ac56e26957580d03dcec065b8eeec83bc057d89bfffc456af643854e47c0fb653b60bfd044a97c1c61e12ae21e76bcd8c90ee04e0df5de10d5643930b578539148c3a601186bcc652a4ff64813722acd9e34410934999c3a1e2bdc39f2e4817070fa255a46f196849293090c2273aaa0bc828b2c084a086d5d24fed87497fd79206ece7a54fd32e13754d3acbffdb4f8a0442f44fd999b110eda018abf053021f3bbf1bfc6c15a11850fd6884072c22be6239dd2890accdb9fa594cf36bec1f1574c4fb910f0547c082e824d58656ab10a9b67534f103613ac22191470171b6dc7aa38e4c7fcbab74d2b775a6c68072e6a060c55943c3f5fa0da1f08ffc0a50dc1503dc160690529a0a1264df0dd300a911e0d480d0171261a28070b3a2e1747c0c8ceed5ea7cc69cf0a0f768a477dcc2c2ddab92de253fd74b671a9b3c1baa2729e7cb7374b68ee04d0a3829d3938e977b005075b61504c4cefef43011e37a4232bc7bd6ec6732d0e8f72f0be1509f9206f1cd13a010e990f4ec09586b5f6d36f0b207e89ab63ad28b10e3f418d5961a2a572a52e33e77a385da5efc90b70a6b2b72768fc5cc2f50fcfd5ccdbe4bfb96aeda6d1cc9c63566496ffd05c914d949aba4d0b5b7d099b10465a27f1cd957705b23a05898d0ab3f0854ed595e9e633937ef1e41b6ebfe5d6bf1bef17aa8300ff9dacaee99866297893036e2977c2fa199fb671b0b45e8bcf948b70a20df11db50a7f4c5140ee1d795ace186bcd7c6ea9771b32bfe05de36761295b455a77f3c273025c75190b065f470f42f14d6ae7dfaf90a59d6546933a9f960d66228049a472065db973558ab6e237ac4e8a271c0893a758ddd59101b5ba321578f89275d791dbce93024600fca6d782d8062961d0eddfbaf593d5b5654b8e02124f371ed83cf33da628650fbd2f8f852243fa6fb4f89a5a79327d24c5ce1a31b698d68b32de0d1947683b1d64c69011b1c6128c216e77a5dd340fe653bc6742da680961541f59f00b4420a08016b9c70afefa4d9299f82b961af660ab80e5a3f22f3837c85b9a30663ece3f9b9a4d0392711a3aa5058c5a4849d92a19d615e39260fb551c3d1e78fcca8c4113cbca55ecaf1ac9c55ba4c0485320b94b0698603fafbb6fac1e87381389f36b8515c23c7e1b44717ff6f1ec3ac955849bacbdc86e6e00ee148a44dc6edf9c056c22c535cb385fc83151c43c741ef012a823268a832e6436c1fad7f4434ddeb5355d33c068a8a5449606cc4fa8c678f9dd24431522534df0510ac11e554733e17d3fae6abacebd6cfa804a842d526890c70a93f6d08f36a13e149098f97e4410a03485a3462d10b7eb48ff789635477de250a9adf234a6afe5b2b712c43587c94af669f8af46479be4eb3b9b67f18e17bb90f4b92be62692d46fb50a3a1f6781e9dfbbd93aacbaaf83c18f7b1719a504bf45f596c2163ee0a6a60afdcf9e7bc0e96b0bd39cc2f26924767b96281034cb69ea3cc57947482fc8e0395bf9353d0ce622da663a1b773f6374805b1f77b5b247e82ac3a5ebdac6b7c8b0a34b6613dc4c91980f9728c1b8ad462e5861a2907fd5da502fcc867f4bffaa11723ab398a5a931c54e287d5a6b8e65e60c93336d7a903b3d5871a9ae261d1edc274bb043ff787df290828bb9ae734e37e628ac9539038552ec29c7dffb7c916150f2beae5026f0a07529d66817e879a4839670b041ac43314959539d22aa9c518dc461203e51145f6a82dfde2e7a72bc536122471b06ef48fe84ff5e3233ba1d2c453a521073536fff222a846895c3dfe42d23b23b8ff41a7a310dabb0845534bad99cac7d0a5882918c29134cc6e78f943f178a09c40c165af2110e14290828b8161aa7ea828e17d0356dd3418a486c023b50472c2f61dd0f2cabedd3ae4d79b26f36ccdf785ea019925b7ced5c70c5bc867072094ecfcf155520d385708fa8286973a3d25854abfc379458b6b9fb5d01c4ea83378e907cec003247900c69248879539559af0a9bf6a98aff243f4262905b41032d8b4e6711c232c289fe447f61334939dbf8eb10874cb1e8cc38e0a6e6ddf67a51b1640e24ffb4cce9b2bc39211be709dfa2608a1cb5abadf543507a53b18d415a9d7bd2743d3adf25c63ab276879f7deb4825695558daa755fb0c5d857a77f09eabf064adef3761c4a54aaba02ae51e7566844e9fcac17d64ac8ed0ea8d491094695c3530aa2d0d4cdc56655c6a4a54046a179a7a6fe28887e45275018e7329d25239b48ae29e3a34d8087ff9ca51c72eef59ed73dcc061564ef1aa58e27894eef2f3733b2d0d610324bb6c16cf7de04b52b5b7fa85ed805638d6f15f3debfa30c823f1bfddfd1a4e4ef9ba21ee3127e020d57a9cffcc7dee2e9cea82d52fb25e4e45a09799efee5cb34ddaa9bb1e1693f613b5c9aeefb2a4bc9dd6725cb665adf1d30040d55835d4fe124e1c9a9724bd3f0aea1f17b9b7005f64759c39328cc66f46a14a14b8894d9c01a509113eeaf2682597fbcedcf397838b286f0f16803df32b0411ec93611cf9765fedb367c1aa0dfe4fee38ac10c0c56c7f7922c4e86b49fa9946a17b45c9b2fadf3905b4516a9cef6264e9b9671291a2db3928d04dd4b03fe146e7d2bfda3509b3896ca702aa9183700e66779f0374a8cc2d95caf900e2657ca1243c37c51c1d6d4d7cb26df08855193913890129eaf8e2d4ee17a2763d05abc3fb0a3620c4c07cf3aa68fbb2edde9e73854035ec611d9fbd8638b2bb4c8b2f4db0df4373bb7d632a6a2d24883e8aa05c404fb5d18381534612c0a2468d7057acfa2dd8148cbea040508180e706e39f41b90a095faebebe1d0822098e7c5fc5404b787ca9a50ec4d3e2088945b3641bc27401990d5f402090daef511995a3e8c61941a99990e831539324b62ad096866ce5c8fd6121904b4fff7b016e65d742acd81bd77adcd5865de868800cfaf56f9fa2b29ed172396ea90a779303698453432c598eb3e541344156468f727f0b47d92f6105f4ed962b4a7057ae5f1d15ab477a9d47db46c5bbbc61313cd1f942afb7e056bb41d0510192c58d8c07fd15ab1847599b577ddd8d1d9dcb00d1e625f79a6a06372ee6d482208e9be464860ee3441710e1cef6f338e3607673c8b23fc02f20f202328dab1d621005201b545be4496e45c3985e914fac5dc62e4d09fa89b4a99c94e3315f33d60e4bc782c4a71e96b18aa949f15221e6fa2c68c549e0c4e9688867c77e3b75faddf25331635af2ba85321b6a7b906011aa3bebd7fe8d022be2281345c0fa545f137b5bbdccf221335dee926039e68abaf256ffeb9449b20aab0dffe4a5f64f612359397e4e070a8fa01296c1d8cee25177104d76a7c154e4279cb62a99d9d7afa21e84f983041f3df030a115b4b437638cfa3d0fa56e7b66fc76be9e18ff7da8f43db6c5f863efacd2eb39c27a20da6fc867572d29bb96017e0e71a5afe1b1dbbe29575a0ac0ec7aac84c95e85af5be4ae0a14458133252230d687e7cb1b04b65483df2c5685a62601aff85053ba2c509234fcff585fb967c96169bb0725f6d75bbfc6b3583cad1d56cf2f3e80dbdc32398a99911babc3408c318fc5c07d089d284fa6958c5051ef3064d67f898edc17f87d42c157b1c32b1dc9726ea39aaaa66eb5e7396f5b451a02f39699da4dbc50538fb10678ec39a5e28baa3c0d095d51837511257dd7e70c630de823ff82eda9df244cb71bb5a74f7f0aaf948943b14d0b2facd03430c854c516339465d8f052fffd7e79acc89c6637c8eb3e84d416e76a2822c02f005971adaf0171b9ba650a3a5ddec4987f79a8c148f560ac252ecf35010b7bcac12af1813afa3247a1ac2e12d7e60e8b64df75900d56c15bc14942d04cdf79a3edbd42e44c665cac29463d2dfe1cdde1f32e6b287877d71032f700d06e0730270070e44b45de5753abb3c5c022fba938b4f6d7ff3cd0f855f4c887b9d72b35d083f6542ac9dac8eab385468e08fb06fc14c97a88ad0acbb9813e26012ab4014cf2ae21074ad417bddb2b4dfbf2a36da8bd0691695b8db7a752b88a2adb2a18d8d718c9654b62ca698d262a7e828d43caf83edaf5bad252bbf3d822bb6b05e320abb6cbd94e0f675a44068aaa3b012fdf60e2a5c26d610343ef0d6e175cc006a0db1886b7b522652c8a3cece37ea7985281928063c5b26febaed8eae322f0e9c60fbea89523544a4cda39afdeeff903c0d4bf093e665eff1fbdbb27934001032c9409a0061b0d8d37ce9d61e0e17df8b6c4d89ed6c1cf275c863482ac4688f9311289eb6f0ec6b479b1d8919e059efd80fc6fbfa16a7b7f3eb2d5aa82a8f1227005d009547118467f2e7bcd6acee478cbc5f4fa42c2ec6d12ae0efddae9c21565d84c884ae46ac9d4bed763cbafe70103cc08cd1f5dba8794e2410b098b84488f248fc6a6cb36a516cdabf3551b0f0cb5790ba6bbad4e4511fa3c4092f0a0425854ea631ca8146e91e549fa9ba2c5124d478e259c34102c3640213d0bcbbe895df41cdc010d8c8ce29031f7e3e9b1a857d1f0a83584b8a36e7ec05ed87f27940c8c77aff86df79685591469d2325d455182e3dd1c11a05126e07a349d8d83d8f0788b4d673bfe01f6aa31deeb1f106fb6e4c802b45d5fbbec2fbf4caf795bee8662e832d219f865c2fe4aa59322838e14722dd792ea4f2a4ab7100592b5084b4ab5eefecd6a8f1856df9f7c7ecf1f36e6b575ba3c2b0742bf011d0dfbe31155c9fc201fbdb02ab04ec8d0c1e2875bd0aa19402914a2108bb5b826b42f661fb460a02c04278d43c3f7446ef482edb211db281db2c0d1f37bcb26dd96c1c08bedcb4c635aaf4462aa0cdccaa2b464ca40f67c5ed5a55d18796be792343774de48564b566199982ff8dbec845b1b8f0d04986094104685f82b2474f50b15159f7a8e4775d78adad427011e2c6c1cbee2c31d7f4dd138ff2b0761596689df0547faffab522b079f27cb08cc13742c96f4030242fcb6d12b2984beff774ee9d6502016f17bba7457734b5f80e9f1ef89a95af336113fc39c6c29a9e1a7b8ea0b40a060a4432475964f2e71c70073ca198b214cd33bba64c56b6c9eba68564416a1e2695e58f77fce23faec29076840b901fc8ba4dcd55928cfd429b449b58c8afc7c9d6a1d81e7719a172b015f4de80ab6534c25650f0548e1e6b799bc3527caa8b57972117261230a29bafa88a3246110bbfadf74d5fda84a1ae4c54073aa784f5389e0c5376154fca9187f13e68a6e999d042d7cb8a6c970f72db166ff88f648ad4b30b95f6c8a0a0bc00971a68e85b98d14a9fd25952eeee1eef8a02757c73d494a0c6e48e7348ac85e243261a54918f298ef66bb4d3b3c91c5057c897b8d95ade2ce448265d727652f49c696732b00640d3859c83390b25d3c626c9478abda41b1e0ec9a6cf44878cff4beb35c9e3857ee4f36faeca208cab199f0e6e39473bb43feb70f611e6669ccbf7b46e6250954b88e9ec1dcf1a850c10699ef20ea1a60f572444ff6b819be82049cdf8451fbd0f860f1ab88f21995e752d81bd51f06d962e604da7253dafdac6e93dbdba798632a70c0168545b4e090e92c0b54a5f19b08b4894d7864129d9847e0ca30986771cb389a91364f32f75a44162c4401331c437832078d7b6914c24b04294796d1835722d1ba2080fc10bfee16fd17d373d3cfbbafa7061c3709d6c29e8775357f1e6aba15efe88d88e31e61bf0c347f1c57f9d9528a969914c33258e0633e06b8b95288c7a0d2c751d502297ec84e76952f5e5bbb4093a48b076178aa2b265d26dacaf9778b93c0ef6d17bfc6bfba5c96b069dd5a57a1b0f21ce09c3c6db2db31f91096a5fe9ffcda21ab9f37510c836991a8b8a04e3530e29a3c4e179967f372aaefeac3785bed8a895a42313ab9ada63997983d82b2b6e4f5d118dc4cba285156955050874c15790a903354cb461dd51eb2d68293ceb571b64b66fad62dfc7682cd81fdba05073e3bda0d029136667eb786fe000fddbf016217b2e3f447e22ac5e4d9fb7f0b353273b419db0b1f19ebaa9099364564262c7fa2a727f57c7c068667d30a54c3121e78aaf43eb7449ad45e4c12a5d2f6ad4b75889e5778401c924ae3078ac9c1402a812b26be245b8ba1492614df370996f6ca4622d2eb47665689d2d1fd4c8a220f43b11bd9c0d84eeb01cafa32f02185b70447bf2accd6cbabd9b3ece25b924a3526d96e021b2f670a0e874d518cb2fbf4ba29cddfab82cf3aa10292da855e1b34b10077d791e56696c60778ab6b425c383248f951f5efe36b864b7e364852376668c2d3bad37ec009deb826b12a54491a2341bc323a629ab6d00b099613230172b49d0c3c3e7ff5ebaf05b203387d24e3039070f0f77f77c544adcf6a84252bc22b0b8bcc614d9aa4bd9cb5022401825b39b1c20eabbaecef2ab03a3409fce8ed427accfbba8c00dd90d9aa3e5ba5e3cb5c1229fbc5997ccd18cec47312fefb4c81776a4ac8afdafebf490c386dbecbbbd15e1338d39fa9b7853608b84dcfc5686e9dce2a0a2d8b709f675550c8d09cb54fe208566431f666f6a2717408c3c9e9703a732a0d8984dbb7b100480b7fe9400e4a93d4e5f4d533f3709926d29f8b282cf9f3bb314879b8aeb2a75e941143d4c2f42024e75ce8a6f24cea4149a79bacfb38ba6e13eebc6fdae8b534f1290eebd48b47c6d6de83487973df63cc704df0719341a323e0df99d2cfb44bb14bdd1dd95c654b32fe4790ffa1f30ed98e448b1686340affc355af0ce42f0332ee20b337f423228a30a8090b43cfa2ff55f1f5508dec05f61ab1180fa2701c24846c7476feebdd5b2a172922d5cfa0bc6bf897b616d414b53b647d519741c6d4b322ba2cb949ec142f3769bcd47db88f34ab0acdbda6b79bb9f247594efeb3e1dee5fcbfcfa7df43c46b535fcc443af6449bc6fdeece7f382afcfead161163ca7c28c4a6be9007789e357e7229ddb870203d54dd26a5dc18e2b71bc3a91456fd1f6daa87f28d2510f128339a7984a18b3c221cd1f1d74e9c95e317136491fe084d1706c9f81998ab81a61b4f37e386a60cccb772dcdd5751a8f38932c4f4c96a69c771e35bafe2b6b451adf6e164f86f26bf9d36441286c6805adaa866c759920a01647a89ca83b10d9d643812a34734fe4d46a2d4314d79d09b93cab6842f2db22766e60ef40c28e1fbc6692809239618283c3ee9941bda0e384d3030b5aa8be6dbe1bc57b6dc9cf5ff5d20be20fe10e8c2e66100c582659db35f6f61d66c3b0c817d63f07d856bae1a80f521653714049ffdcfc64011bb039f52eec650d4c9b7aa928365d287437ecfea3d1e407f4de021cac1969e3a28d44eb014dacf84a66cc9b98124306282ec91f18ee16d36fd000ad5ecee3a7c6d84540f981bacec5f90616af3b821a7c87c132f613725eecfe88db7b8599f48c79841b9ef05738c63c7041f319e20b772a1a60c3a7c2517250e5cd8aa55473fe5849a577034bde53175145ee142a8221001cd00912cc530aae5dad1396dccc235edc050c205d677772f3492895242683ef11ab4fbb590dbb003aa09ebff9a603718464e5b1577c37359c76280296a0a4e03f181e0c30278d2ec2d0b48a73a9a77a8bea8b1cffc49d4895f476c549978dbcef40fd6c1b4888203e65dc5e117e166237be85cb1ee8b09326ea9a4405b444696a4a7443e018b5bef5879fa39ccd580fd1095b247b8f78fe96801ce9919fd3d1f55f0bfa48411bf1315c84c2dd3d766ba0f29691e062fe722fe0851bb7ff41dadba74bf71b68c29f380f13219977775deea2bd78130849d5372f5d413d7c976e6249bba32138b3b154c6d4299b2363cc01415843dd2a6111f7982ac5ecbfdc74d46ee4662156f510caa95042aae843a223f6ef5906704f0cb741760e8c7018d4773d4ca9e56d90a2e5e20ed58d6e1ec699e90b2256811ab0bf52c884e537547694df7dd233238d51ec9696480d5efc20ae4333069506cae356f4a98fbeba9742727bff4bd420f30426f07105f260e598a92cf06d8aa6688fc54ea097e1a4e9205b3a587a900dcaa3dc152672041be216d1cbc9bffe0afb9b558a3504149b52f8954412c92e921b1557303df90a38fa8270494664b9da8bef4bcdf03e2047dbb269c0b49f7856ed44dc673f01ce5e36c4cccdefc583bd2173f2425aadcd528b361fd6c76334024817b6e2b3f116369cc42d804d48245bc30f910efabae2616b6cffb0d27f2b3d34762bca2133ab68376bdd8ae756635d7cab6f5c58cb291f813c51735d5a25b0ba498547112e559b0c9f23124558096b512fd552fd4a6831d78f5c4af15cea03e1780a800c4adb7725494640f0b4de2c4c830b18709d6842754b695b15ed41ddb2ec039e99ef07a689528f3d6fd4aa49748f59d7392ef1f8615ac0ce5175f3e6338bb7c841859fcd40a046314a1e3569d13c07b7e163cbfba5a2a9cc2d5cc9c76e3e70278b746c97531db3440afc47356c705cdfefa6bdf4490d6c7d320a88286bee74e3ff2536a9c9af1d9c36d5a7554c14a178eb5e908b53825008e7e8fbb031810d2325fec5aeaa40ce6456101e7079111fa95ef20c67cde89e95d45ce908c8e1800f8668e04cfeb70cc2f317742efc4d1b9bcfccf931be299f4e82cf19d838f418d1a9cc512bcefc20de94517139dcb2e075c6531f902f2c985978aa54c789a41c8e1690def421f752e1c126dc362127b560cbef462d27d9d4de3e53627dc4d7d371561e504f0090e9f302fe7fd0d493e184670835afae189a065d340ba3f177869ff0dc6ee372af2f3be04120adfce0ad082106b5bfccd131f85cb317e1166b7e436c3402597f3c6ae2e2578875a1f5611582528e058aece2ddc33a4dde3d9b0083538dd2582f1fe30f91a97fd1cbba45d211528828ef51f5dd1b3076436def57872c4ea8898b40e2eb739dcd698317a068566f6ad104e9b21febfd5ab7af4fca787fe14a949a87ae9e129c39e4d0f4bcfed911fea7d09a60ccbb08c1e30aa3a07ed5ad802065dd914ff60f8ceabb39dfbd23a10a535b4d490b14bb736e86d322c0b41a14d5f228d127a55c8e254bce52cdbb85577cadebb3057c7d37012bc79867a790cc5d4b52b74da9ed073a889b5d552927adcbcf5ae7e27db7d74402684a9a3377725d78418be98a28bfd47a89477df6eed4e8c8842dc99fcf19de129c7f82e237cc807fdf9525ce777e992a7e5a6fa941937a -MD = 3d71f08e52812bd83b34694c14eefa3ae29bf4084e608c7832d23edd52d33972ec3164f40477f4c45ae52d147268ec8c - -Len = 70720 -Msg = c3bf9dfe9d6c26f543188fb45729b771c726178cff1b9a185e3faf96e7d49d033a4f1816c2b911c32f55d203278349d738e4a48a12bf1f37f3a31a8c624e6fcd20ce021c5ce69af726b3ef02268f04078e36b63b4d2895c3864ef47640df3ce55f858698d3bc689b0f7b0e3abc178d08af647526191da5c1fe8664dde94fad51ddbcc9138e0324b6d1f6593152e18fe285b608d3df67f73b45949248c566691b84bbf615f78375515669f6714eb7b09ef77398ca05ce323842c0a73f3cec194b3ac9332475030473851f0d821a5f9843ece54c94f51affc1dd51cb4ab6a864e7e92fa8ca704d7824465fc7ea1ca1f0d94e524db8151305ddfe9125f29b63f3f978367f8e50277a6c81704b33be4760690403c2becf81ed948dc6debe53e56d88cf23ddf87e5ab2541e9bc2e467178ff9f640d42f8a2b5eee72391d3746f67b9dd641ec9160aec7e3062854867edb26940c51ab91adda01f495320be3dc5ec53f75d7d4e05fea62221f5f28a06d59cc3f2e7d6e6fa2567eaddff8d04c7ee4f276942cbd6ee4d82a17528767ba9b5a2a04440d464ed0677c2236d593fa9252aa4a1b89cec1553ec8cc88ea385d70a5e8ea36495ab89fd5a359840f7c74826e97c4f2362f631be5e349a7cec40f5404adf9ec79d33477679c5cafefb542b4015feb017b09dc9f952494987c335baf3d213a4ee5d84bc0e60f33a0bd63ec92d2aac831a084b2481532b7443cacc6e919edb445d59283e21ba3e440c1b1fa82ab216168ecc76f7d2fb7ba925657da6a60b970b790286745cb01797643c5f5ee526bc08fa8fb9aa8a958a369115d1e9bda2c748e5fc37c52c1d1f9298ac7653d9031ed8f1d47bc304cbf7cb3b6e61ae24eefcab08a8b4c6fc4ba6d43dfe0d0d72d1bee4e90d45c7de0944d578d1957a886aa7a0759a75e059b64dcab8a37c024f1d0cdb64cc902f72d7e1c3dde1f5c5648048a7913403a7d0f784e49d3f6bc8ca4f992ae984f3706fa26f34df120b1525da504f0027d693de89ecc0501424d770d3d431dbb8e81121134d96f0d43df068d36ef536c8772afee7d5cc75e46f94df545eaedfead6b83384fd78b7cb06dd89f5f548a9a85dd3ae8be097730274b7624b98e05a9d57ac1381ff3898490e3325dc73a7cd4a03345a008d8fdc010c85a6240384d042d3834d94d37516e0bca7b8d17a9136200fa3adc04d3415627fa617782efad56de2c44e281abcb8248a91bf8f6aa368bccbd80655a012c3a9468f42a28bb0de90fde5a1d6256e00770087a660d43cd982d017f03b16aa4b3809a7944daa45503e9d7dc5099407647aa6f009f047ec1d14a509f7db117920a13195a8e3fb36ded949e3444ce7176881f67156a8263f87e4c31489d030fdf88746cfdcd00ef3def37bbc8c1a8f2c913f67721902ff95be75a2de2294f5a7172cc1bccccc461ae50fab7028fcfca553058288cdab448d2549dcbd5ea3c01321342af2d52340fa65a06194975ec0104266d01be0db958460c3c9389a8730b09b2ffaf8a26f8030e538369043ca7a0bd3f5c8a1ff4e5329d58600d672b9c80dd962aa34a11b745cf8499309daca7ad67c14e4b1856e1ddc18031c2d53a5e699808ec13d5db19dbcf356ef47b8d9533ecf56acd0ffa546198ccd6393c9f61cd21506d88934cc8cff8ae2d4006a718373323d9976da9e7c70c8378fa05204eb460b6d48aec2b69293136fc99a6c2d9c32493c2319b2b421604ef3e8e9686cd263d824a9f4842a7ef61160389c3a57fdea78c4e24ff480c566756517c5998852ca0fbf6510f57272b72976c97c519b391a458a5f703c8ee8f1f01d84cb4201fcd716a0127a93394e44bff5c4c14e61de3033dee320e728fca1338fc8711e44212981792a97e9e9423d496fd2e18d464dcac84525e870f980f2b43e5b4d7ae9701fd4ad260f660cfeff5a677c73aaa31848874f802d867b0644f69ba5b6e44c6a5894be8d37a40ef509675f29fe0322be47d5708a6684280d367f3a4043e6e76032261fd8b7007994e9f4c953c7432fb037473acd29f68af635b29ca38aff64f25b1d6390e427d77f2f87388285c7348e956120a0fe5a1e61c1353557e29a3fb121ff0c3e6566a31438a32f4eb02bdbb9f097a4ae4a2b4cd0778b96c5f143c1fd252f8c49a16966f493bd1010bccd8fc2c77f395da3e6a0b2b70a33862d88a666e343563b3e9c9d80df497d612248bb29886c71378218b4991e458e00fdd5575edacf1c9b836ca14969ece9c88719f85ec203ceb46b4df2e3fbd218dee8b64f757a1721d316762cced1fbc7af31add1f2f2c9c46cc5d2d633fe14667884b8192b4fd0288a7e359a81861a999dd890a2569922d4b93853f8f993a0f95648372ee0da7e732a112774f214adf20cd25f142a23a38232295db5b53afc3400a9d00b469876942a75c836a0fc4a5384c56591ce30c04f501f3ca6f7727ac8f03fff38cd185d2e1412947a0ebb64209e184095b33f0dbeab909d3720c8c10abd613131d4c896836f8e1899abc07ffba1417caa89bce032ad13ec00d1bc538bb0b3f2810e27b756a53ec12ff8aa124746d7764ab228ec5dcd1f958e7abba6ce82bedf90c9b433fa4dbb2aa785e6bf95e750d9f0bd018692841a462a9c453f45abd844fba80c90f0d169c18ad3f4dc5a1b33f4370ad543737aaa6a7fa6e781738496cf2c298f62ccd8e102645352fd264af761784c22a77319467ef83b2111eaa570caacbecb0e00bcb779ae948f966d0f21be4ec1683703e854f01eb970651da70ce3f7d82e071ef533a3d408193ca0d03947253b1456b8407c6a7db263ff8ed1b197882646f28a2b0bfd7f3e7e646426a4b895f9c5ab02ea134a7fb66a45b0ee1561e7f9a434d4c6a7030a982d82197b0a6f1b8dea88762dc01caf25f1ec26349ebf91f2a46281407b40f0b5b52a5355c0f71077f1938483e95d86919937414db41d1071e5e002311f23ec0793d1844f6edd3f488940a0a515899079dedba4a1fc06ee27d751fa110948371e57fc3eb07a8dd26000047cd9db3d575f212dc2d9ed098565072cbb58a01a7c6a502ee5316a85846ef4735bca90c535a20ec22e4dfda160b9e3d4d8709a17266c3ace1a4ab540bfb5e501cfcfdccdc5f3061d3986a44b1ab6fbeed4014dcabfa4667e3054e16c0ee530346b8215c382c295b3970c87831dbccddf208341a1c29371a3d9e88553dc7d948fa169e222f6813c19a9580dc5e45bb82a606efc38b9c9dad3898e07a4b2df5077f3efa8888bbf67b3f2e1adaff9147954f63d03fc1fb80071a1bdfebb2c8b1281e59c0f50dcfdb7070641fd9de6775fe36465cf686ede9122b4e0b113a4114931f8f75d18449c98a755f1641c16d4fa5a3d81d51a11adeb5b55aef54ab402631ca07a383b6d4c9b095468779714edc72dd419ab6dc2b6ad8fe67101dcc6cf0e866ead1756b16e2ca1941faebb6b0244e2ea85b8efdc892634f9cf8d2666e79a13d5f880e6bb71cc1497af8fe573c301fdc35e942cd98603ff0212edd41edca45958f4fb67d607f7b6d16081a1e9907cf3012cb381444db52291f3aa42592e9bab7a2aed56bb914e1cd40b3a7d16fb144726489da9a730b8542bea591da05e0eaebbf2dd3fb69e2dbb11e800d39683768ea56ac8f26cef9c18225f50a27edb7bb790e5519f619f15260d8f7b51e2aa021e00dbbbe82fdacec337db579d6f37417a8b8ad0d23704a2c2397a005485df4599bb43ed174a72cef9bed6a45adbe21e5c1e5be184c17f453428304667eaa3cf76471bd2fc57482b3029e9ed675f7c50d0cbc0ea337b5f7ad05c3aa418ab97fe3836cc1403d0eb51fb2b7d894f5456976d1662714adf35c24b3801afc3231c50540cfd16ca31acd1af261a1e7f751140a580b91d476792a9f96e1dd013fba1645e2bf761bc143d38e09c4803741c2ceb0e8d1d24c5aee6905f40f7ab678fe7b8bb36637b55d2ece624007fdec9d419f50cbe374e321fa224016317985a7a2fbbff9ec9ca24086c67edf53a06ed17690d34767ff0092465c37447063d592519fc9fd792d4a32f1c4ca2ecff225a508a81fa586f90d777a1fd2c6f4bf0d02b16e9107337316fa17ce2e74a47a7ae3a0f01d2d67ec71963e73f9e3e41597bf6a70ff5f45f56c62a2ef92fbf9c0d351e56eb526335f94b7386194e468eeda9125adfc4cd53bb530372cde09f74d99b9802cd0da11dbdea413f08b11aad03e408a2e6e170cce5a2d808ffae7c5a835e11832548f2ae7b7247529c6b2cf462b9340fa3f091135c121251fcedd8d590d9156862b8ea50b87fe07122e0f02d50954f01955680df854d4cee4423274e98b93e2323b1fabcfb6fb70b6a9706907404941949a7c27a07a0d22e73f30a4df16ae633e6e8964bcace3581a201c2c63383bdc72f48f88b49a96c92fab1d45c315a981b0aa16f759d17e69487c5c74715af168bb4de757bc1e356cc470427e1ef24de592d90c8d2e8e934947a37869ba0c358e778ccdbd416db3b3af74e77877146237ebe2b44dc449eca01f7fb832c5b7cdf6af9989e2caefd745f7a1545b56e3b01ec4ad5660a26b4f17d9f763f81ac482476b5c63eddf0c6bcba4ddd04e43c7fe4324223aed515d85557bf2c3e242991c29b1bda306082c35ecbf12a479c728154e1329a71d57865603105a1e19c4a063468ba49057ceb7ff514f271905696ebee69aaae7183e4d89c99d16bdc428401f4300f97305b8158fa15c04751ab201bfb3bf8d40058d1ce84e2c0ee80cf7e017cb18a4943b4faead85ef9100df294ae05f8cbafb0ccd5a393bc42ae719b8ea1484dc8d3b1f19eb23a50eb6047d56afeb8f09195f57856e45376e520112f3c5de16539cb0d9a032b8a8c45bc71cc199a6ed3d93b60b3dc2d4eb316e7f1f31d93d2a86ba3a926cec3337166892e2f371db21300e46537ebdaeff1566a96af88ef9687bcd237203825df90ec5adfa739d50d3ea735955cec79a1a2222c718d34cd9773cbeb1a0ef5afe97b35a608ac987ceaa74ab3539b84861e4618a2154477ba600d1762d45b8dedeb80d0ff3bb7e951c4ed59d2228c1a8cb07d987ff44de8328aa40dcdf88e475c40525cdadb41931046815306a4a7350a02892ffa8101fcc271e93d70e92fd867925027ad89e22c24ca03d4e54c655a6a8f295dc65e192be6b03d251038a8b7bc6c1ac00baa021b0bd9d53de27c4ef13ab0ae9047edfc0c2bb020331079914bb71812c459be39f621f0862c72c6eca00701b96613b31303ee1c3305f60e722ae420c8933c58e24423a886ff3abea6dd3c0cba5d9e3006a9ca3ed60c2569b3cbc030bcbb17fca36b7d5c68449eb6060f663c21d56c073f742ca289c4433deeb4d7a25fba610bf5f29ba69a8b136f92ccf21a906bf18b35e9a1e1eebcc3dd7b5c9700320fcc1942600af1ae413d2dc58c8c22869fc34e7270a66745543beaf2598ae4d429ada7213a57d813f5708336c470de64df45c38dbfc6cd5e28ffc8dc022f9aa6968a380af7eec45c1662023f1b6cb8cba91d8ce01d7f6e79b99409a10d01cc29e4e63e781f4c30f722662d66e7cc4c1b8baefd02103cd528749d1fd9c08dd3ee83464ce1270cc865b8016746b01c02e5057ea66c4e8b9bfae88f9dfec3306c65002ec5ee858cd53835c832470ad877b895111ba71ee81d6193cfe6889ba5d01dda044be8d158f1df2a3f20f06e8e04f6c8eacf1b07def3ecf4e29bffa03ab9897f6b4188910da8db13bab5db41a9552fff7033609fdc9a0d8a7c20dc778b73286ed839162b0754bc70ef63503ab6c2d4c745eaf05d6d8a33d2d117979804b78b36bfb53a25c2afe3c031bbf7a032e885bee04842b70e4f005ca5d2c97822d1225596286d07ebf4e19016125a18aa30a324b3ede0333b52e3865f04ea9e826a7e4a00151757dfde565f2128c00a9925cdb7554e516881206dfe610063719fedff92620dd18c1ac6828bd741e20c6c4265e528ec0ebd5c4200134067cca7d7d646bd5075241b294826a4ad003884b020fc1cc33980b839423a6391ad9e97c6bdb4294fdd779b87cd934816d63c09e12bf0eca8d94fcfb47b8d6dc93451d7e8fef874a4b94463b2e158d4a95655129bcdf4d33e2dd48a4a8869a05bbe7edebb24641e13ab233a370df7e8d8e31c252ca1784f17b9a76e57e36f99cd8e8e12b9c8878401059c5580bdf0e32a1f09b83020ebdeba0f40f28906ffc8a336f81a6155e344f15b086c2c7bc452116ca65232e6dff0999139ad4a7daaab514a556c5e5707ef693e0fd496b1e2b4235e6a69a14db5333ad1e9f518b1e0b06c2b2e7eed3655d1dd010b256c1afc97d456de94f7d01bf51253da70604e4276587bdbc8aa9e5daac15692e4f8f1426bb9086b3ac30864e4b499a395ddad407bba9ee5e022d9afc8baa13f89e9ef84ae25c5a8e18f7140509615addbdd495b2ee716e54bc2829cba3d73598a9b6013edcf21101fb9850ee74b5a81b8ebcd030e827652622613d4fdae4f897da9ed7098f9ad295bedce410728daa7c39582c8a8f13fb5d9ba27c911918837c982023b3e59cc5d0c78b7873ec308887247152c7cd7d56808eb18e9849bdffcf4a028d45c53f133d7f6db320cbe76bc5b8cee9ef89aca11765571c6c501993195a0dbcc616cce4614e493e1ef5fa7bbc5d399a0babe902ab875cce16187468e02f09593ec28b5fc69de9c07554b1dff67c780d211a7ca1c35c884b9d8718a5af31be0bb6b0c4adf3d213e22ecf53c0fb7b54e93cc0ada7e74ca33c09874c730bc8f47b34c8bff57057904c504d2a4551c495d76184c43c9fbf744863ff57fa7e5c7251c3f2c360c69228a5e3b87c9782bd037e9a4e0887741dc418b2d682618f55013468161a167ceda296f0f792dd16d06587ee06c2b1edce5b53fef615d1c71b69cc2d1c0a3e1acec8c67df2b4409364859966953ae1933a01a24f465871ac1672c219ecdc01289f60de95912ae883e0295d08e1b840ecca7eadaeae926ac8afe3be346fd8862fc733853dbc3bfc6dae1a7aded384f682e4991b22160de3a34c8667878b45f6b7ae09647f5b30a4da352099f053e52addf21b95b4660f05c357216619296d7846bcaa226256510a51dd0262444a2505835acdc26b86e1f7b2367d62f33296356659dd68ee95e6535a0e8a7ce49e8aaefe86744b4f5fcbe2f85362041b8c09549eed6bde2c0037aa7d307e90d8395d4dd6dcdbd768d714ee1b1498f49b210efe76e01d2b23808c3543aba7452601e50c91c6c90fbfd70642a5e3e6d97bd7ec5b779ab9f8dcfb2c1c33e8cd44d8e06c11b9aa059a5b48e7071e27155cc198ed92288407ec5d5a6088d64db835f6bd3884d5f25822441000640c47ed24774b57cc1204d1b0b08670a1b2432fbe867f928e6e058a4c83199982f9ad36daa4d87330bb83ddebdd66a48e5133fc8a9210c2570b4b63c21f49fa896cc0b825512689e7ad6af446eae143783b83e53f21571006342cab2c208a6aa0eee83bae851fe118701fde69e1e19786f69db3863c3cc4c3721029318fc333ef068d861c48aac2ec8a0c63fbc94de6e10ce72e06eaa725b84b5fa67a73dc9b9f3c176218a2af768b85974ba5ab0c79b005cb1d6833807c0a4981eaafd4bcebd818ef974a9c17431ce92a5d0e8e08981c67af49531faf11e4f4dfbd77ba4d6ac1237bed593dc872c73c2c62de7a288b4dbcfd7b70b71d2c6cd3dfe77a2e766283e4242cee8eab4ab6080523bf7854996a8b1c796702b015ca6eea2f61371f1945e3521bb095a8150ed41c65578e740b9b5d740bdf085113274d695ed4de30d830a96e83485ca819fa29dbf34ec771290ab96dfb80d2e970abf9c23c7a2a92e76cbdde2c5deb91a0a08ea9944d28313bdc276f10f3675e727df95f91fc232b8e20a70cde98484df0288bee0ffcbb9d893c2fe211e0d09a62c6d5a62501d1e41575f05e61a17dc251bba8132d02879d5b505a2ec7ee138388ad1601c0323da6c3921f3e7c1f92da0d816e7eb608941af8402fbbfac63a032b5b43d729376e57e29fbc13f9ba8d7b6ba1649872b5ebfaa93537f271104c0194f7e48f29b76ce0b8c650459e1b788fb24313c928b29327b657f839f67352640caa8193885b402a8e2d623c34ea5afd2b91017aa2a6948767cdfcf94f975316d99ca34a0ecaf11cabfc7a5f82ce3cad1eb0b811a63af70403c0cb9b452557fe43f4d11c82ac879d595c201852702587d2cbc0f8fd16c385d457eb85a0c5670494db9471aeab0b97de75ddcf6a781d7391089f956fe100f120bbe621281e8910127873b1586d84f1836e38ea938d2d59a18fdf52c343b632301344d6a5d9c70a07f4f644499afa93906fbad295575b214b890796c3e6ee2f4c888b0bde9d29dab976a59349db75654da2e9ef3880b1b3d71ea0c8356fb0d0bc42452a9c13b6697127090420d8fe4e012d50a944ad37f78d753152e28902fdc768f99aa7e3769d762ea90095389c39f63874698088f4d6b5b7429b92daee9eb62230c3c7b4715f12b40df071a3580b72ecdf95b5b9f036960b5c0b0c0a7b9bd19a710dc42eb0988be1be3a7cc339adbe701897abe83301799a060a1ac2b1dc60f544e065fa3a2e2adc43487e3d470722eda7d52abcc61da68cc80082aa994aab5e31a473c0170b37ce24803fbc8a01e58b15b9faddb07465082a550d693acbfafbc1c1b7275015fadeea4c86e60b845171e8a9e2f4f9ecfe36b57183a89d4894f47b9ff6d8ec36ba351c131d63d176acc8ab0faca9aa6fb83ff0bdac0ec8aac272e8a6fb7bf355c1fa423ccadce4c13fb7e3521ea3c9e4dd4b639f5044c5d7cc9d8e3f8db76e595556e53156f94d4b52671ada018b6132b381978036f19cb9fa9cf7d07334642cbf718c59896113fe2d00d70f1c087743830a13c927be53379398abc3769bddb54772bf1c2abd3ec017a9a35939c315fe940e5fe0eb52f438e1b8307e5e94e1dc348206e203b4d77b5a8a05201e63424b30b4042f4a5786a62a25106bf3c67989d0c8ea13daefe4163ccc85cc949107129d24891c0c721268b706d3f0fcdaaca4616df217781570790697abc563f56b3b24877611f84d9f66d084ff77437783153098a757a5cf808cff120073533676af0d055475d7903588bdc71e678e4604c485728f3928c51e3771660b3f2cfd3054a0c5aab071e3dcb6c5f6b728a6ef399aa8233426cb9e5162a2ba548fb5f1a21325f0002a8eec9dd83139532253192a7de0d21e87540322f5db3764ccb7bbd3d5e3addf4af6567fd649ba79bd5c6cde5676a7d3c28c9b97d86405c25ffb02cb802325cd7a70c78b98559eb1618b925d0eb2cbdd413b0fbbf3854bf6ae466f93fd2d7f5422c6e7c8069d108476a630af8bdc66c46a2906932e8632892363aa323549e4fca8be603e096936786476f1ddb73c9f0ea71d292972aee10225185ab00fbf7c4c7521d7f58700381793c37aed791a9f455fe12084a54780e91b2f271672d66eccf1b6f7f669ab3fe96b5576eab8bd8ef0f93b92acb19739c76f6ebb6b48d7e3048447654898b2737555f38bd95e6e9398dff427aa7ce73223889ebbb7780a027d979accf3fb5dfb43b76761c45275d6c478d48885f07e9385ce87d202eab7f4be9079d20079f3ffdbfa77a1b27c1a80fc2ca25d45f4a68575a9f0a6558626e04fd9aa1f76fcbea9c687ecf3acc4a5b9c963284df36fa5307c81a2dfb7349fefb9d8f55c5d6b041f8bc58dfeb9125da8b1852c01954bc4bb21be662631dc694983f72431bdad0e89b21b246be14e8b763efa7721366f4b4eedc80223ca66cd15359dfd459fac2410c3f377e12c60774af82bd154dbc3821367083e7d8aba137c58314a410a4f8edc47b45009a330694d667e01428e2fb02f17e4e4dc79c083a5731dd1cc077e9314c6c5758b4da7a9a7105cd194569b1fcd85c5baeaa06164b80ec85b8f9d217ce0c690ae0e33ab7e7f7e2e07f23cef15133a148a4c068300dfb19aaf32d4219169d17cc53a5b2532fd395a6c034613db29bd371aadb30f9d40e5fb975cb4641ad76ef180b9cffe0b4bc84ac8707eefb938969832b3b0ee84033153d9b546d35f522657a930971c528eb364e3e0ec6cf6684e9d9c060406fd511e0a3ee69156a8017f17064ab9694ef1831284fc9770dce06cb01f4fb7414f5233888e979dd63c0c039760ad3fcc4999bfbb756c87e4b1c978388236d286c42df836916f7339649c3a407e01302c89b1efc67cd7c4b1be4afa9d8e625cbca20bf57a0e171a6968d9ab7a2aef9573575f9b9d62e657bd4b8c7b460b7c5dcd3213b3bdcf379a4c90eadeae2a1e7588fbcb4ca7ee4047f2a0b7839dc12bdea0bc6eb9689a76fccc23f75b424738d853bd1f894cea8d9c3704f298097718e51d88438fe1387c47d06b2aaba049e2c7bce580dbf41c775e73c16544f2f7eb7d2cddbbbe9271f2833faea9552ef8c648abba18c9074ea496901d390ec0074babb505fecde10c80b903359ce1561c8c6608850fdbed46bc4c7561967edc70e079a046334438d3cdf003482cd77f7cdc26bb8e8d990fcd68860ad4a31dacf953eed5e982acfe8c8230272f80c010e15c92ac1db98cd3aa504e37c08972996c4c123d35148b9b0046815731c2247313b7b1c47abb3ba2a71babe46b6f060c9072eebe74116c77f7c2ec7b9717890fda938be9edbc2ee58a71a6f91e7e5f6b2c6e8941eca1d4fa399e787baaa9794cfe992904bde4ee021cfc455e21de071f09e7ecafe7ea4d8c8d812e3fafa07b92467092fe335a0263256192fcbcb68691ef861deeab175e95bc1314b0f12418497bc0cebd9747f26e6d4b95b9372e6228a5f326e8804e907d8ffd35b4b75bd6d96533e62b31d2478dbb60557ed970254bf5d50e83b0b769accbe79634487040abcc6fe12f48248827d848da34eca15664a5d5dea9827c738a3b784119ed89db25781cc7b025643da38dac2cc1b6ec7eda7e9a9d413dc23680a6593d49eecf31b031e3a19811bbef6ba034540f8077241548cd53332ab439f4d33292ae9369c9b5be6c76ce525125e6d9875904916ad07dcb1509679177044f8baa492f247f2b9ae85e4e3a304d677c024e438a33ee0b7ace1bc6c4ba361ffa966968b3e83be0c9776131c4f5d73d95e1301a88ac2b5b741b869234ec17135bbc18fa2428c36fa8331f2854e719309940d6e7e545484bd378ff759f704266dcc55f04692c3f60a1e33d3ad25038c7f0e5e7b28b466d60ffae2e78eb8fe0a3e478e5906a3cd83c1a51667026765f8b03980c8161f7c4246085baa2018e194fda9e53a50fa0b5897d4340d038a2b4023823ed5e4f9f721e5ec44cfcc9b814f428ff504c409f00d231827365f01b5fb6f84d31503d88a2d662358b8c2b54fa193563858ce582de9c9ed6a834372b892facdd816013f87ad5d29e205c10a9f2476992996de69279712c068747f3185af3ba9c8494b93822a218c8b2745e0025052c5335f72b14f9d843dcb7a50e2bf98c8c52e3f61890c3c59a7beadaffa1bbdbe67001339c53865a4b1ee1566eac8f8288c6458e164785c7c27e7098d9d4db51ffafa4282296467eac95ac63fde3435b18c253629ca78f2ff79bebb6d6e1adf0dfd9c7dea32464ccce09c1d3a1173ea1a30cb57d93f60a85a098033add0f5a3fefb6115e084606cc1a42c7ae4492a7db916d12e4e17d1d52273e612ed5a80ac7950d2baf3a445507f60767fccd9aa79249ad12a17084f11cf355ad99a8f2e40e3aa7bcd920667804cb2149c62478664d35945eba2653ad6e6ca58e843d36119e474d6de5a1f4974b0259141431740b94bcea9e3aed317acdfaf5adf67cbbb9ff22c5e6daa735dc65017570ecdcd5bfef46767926ac6880c3050fb2f74dcb02b735d7cec019726dd9323d07580de5a9e73b0198884b3ee6d7f5b9448f98ac1750e74dcea0def3722ffc7b7e5faceaf2030453a367b1fcd59232bc0bc745a71e529fee8d81e00014f0c6f58009a12dc1cc073441ccc8e9747a24e0b1a63c044043c781b46b06e17aa3fa74b35fd4f63fc9ad6c1abe774fec1934ecdb35660ba4adc6cfea6638ddced0ffc0bf682d8d93825ec2d745a67464f7c8aa337ba904731704a0d87b5e3d35ff3da14d2d9539e77f830020693da1059a4ae06180ee36d40ae9bb25b1614ad9b91cdf05b4f243604982ec9c33251ef78c20570d4c1eeaf00dddea7a112749e28504418e072ef32867c54ff4aa44336155b4d7dee81f68eea848f37fa1998578ec5d91912e2f916761b2f0d0d783286b7b6c287c5bdbf8f763929fdb6b9f45c1758f95b52fdf6544c0b399d6c0ca443f88b21190ad38e233c723b6377722d0e8a80216a31424b7e80a2f10b16f02d10204ed5bc2e6206dc95b63003acb086f130d1edb02e5e8ce7bca8e1e07ec1115df7584ceb90f7ae2e2a7bb458d713b6a6b2d4cae7ba812f32485378b813de159fc65e1321e30 -MD = 6a76b88ce50bab0682ee7cb670821ea8f608e7d70801e7785d26f9823455767914c5c87f0054a576bdd69938a6e6d9ec - -Len = 71512 -Msg = ada7dacb8b05165188a0d2bab906f0ac3dae9feecd398acd95f74fbe42ad32445d961314d7a79d78e517c1f10e1f622081ff52e6ad417ecb0c41659c3fedcf5860cabb4e9438997fdff6b9493de80447ee18ea7311fc9b8d74f77ac1ab21ce845f4bbbbfe93e722f1f44a40b6eea3ce82a034ddb21f049dd761f7573add2998e0222fcafff438f504d096980cbab73cdddc8656607a7f181bac33dfb6d87973ef0566568fdce5aaa114ef0ed79b512bcb06d185ee8a9f942e7eabca114c8305ed2efdd310c683a04111a219da3907f7e4afc5009ef7ccbe8a59dd9acca1eccb44ff64e5154979727f875e4d76fc224db557cf4b141aacd3b9ee37c66b60fd30a10729f11fce6dadc6c6721e205d5689a76f6ec9c09bb690377c48d150125ad26bc6bb8b92dda69e915f9c0078e51b285577120126d350607db48f502d2e8c3d0fce981910efdad169d32a98e32bc6c62a0f5785d95a20b1070789a7552df7bd278f5e2e0c8d60e2da91bc4bf18a0fdfaf98bdcc4aa89e2e6de5b65b5a9923ef3d796c3f082edf5f4e4bafae16984cd150839348ed473f251cef93e0cfe8975fac2d50c0765cbc835f319313e4cf1447b780968043ae7a319e85b0ec0794d86b0e0b8a56e99f7f0b68140521cea6ecaf3ef03606e056d5d05d388bb1a4465dbddda4a766d45f9d640343546c46b83c746152e04145c8d88de38882f628459da495790674b915ae19ab402f37ef6b8a33c94923d3d68d08c6cbe6450e064b2edbb00946152a6a1788eaaaf4392b396c69d1137f13251bdd2770e2308dc0af77bfc7d5d4ac8ac5605e2be421d47cba498313726093c3eddc0c7cfcd3e9d9eb0ecd575f30cf6ca02ef5f97c568e6666a82c0ab666ea157b6bf23aa6bda6c4965a70b905f8d24292c9ecdde3f0eb7ab71ea1118ff06a9c6d238554704c391329f166977a8b79af15c7af43ab9f602c34039ed24fabb9eb0b991234da0e35483e5a0b6d2d6709f491aeb9b543a080fd660d81c775e74c640f13456654721fc61c0adb948f2a27c59ef598cd3ca2c250b572d66ba33196b9b0487b6360265d3f6b7a53b8202347a4a622c8d60714a8e8aafa293958191d3ec7af40a69d8971f6a52f10428110edf44fccc67a3384a907cef9e6aaf51c64659d9e11ca5d2a029e519f7dce12418f36e43a1e24326147409a089b4b1aa9f0e0aabb8b293f766398e95208b55453a00f1c114c5e94491825849ca39429504722877e095da4fd2978d4dd4d82d7b5c4cf5fe8bda3c99a7019272cbc10b19ddb9dbc6c18d23e2cc8a0bc97c8d11cf6620a1816fe7e52d3f3bdea4f314b43e122c4a1fc36116b93d5b30927e70a84740c41dd229b58b0842766565aaf9e40c8c139e0a4edb5adb0b53232f444a9beed28092791f0cd73396fb4e40583a438c31b6fe0fcac1985020b80d2834e291c9059c28febbb371b52512c2ba659d7ac5ea5c93b79fdc772162d21506b80233e2bf5f06ea64740096d502e95d3aeb31bfa04e858935f4a055bbeb645037702940e91355c581152cde9015eab03deb0f8339d5fb0ef5d1baf41249218e19f51aeb6cfe3c157c5f9f963d91ee3bd767bd189f371dcc453a6e074e357549c559afec2e68e464bc1afec6c4bf1c877025e386b8bc144d8ef8649459f78807a5648f4a199b7439a90ef4740de79d1b71ef28d66eae081939d443a61ad7815320de620d14de151dab0227aaff51987f408b340fa75320b6ac93b442791d88b29e8ed23e0678ef972ac03f6f8444363c47c1b0394df585ae51005e725e10c7ae873d85e3d9b2292f8e0ee5cc830a9fd9ed5b445d47da5f898fe2ea3db1f963ce44b3230774d4ec6d3fb5c1c7e5e9fade991f97827d4ad5cdcd00ffac5a20879a3bb855afbf265fdaa67d7a6b902a6fd4b5d752b0d78f0f04752346c542cd599bd514c3e5a2efabfd292db8bd6d142842a8491cef3df036b5ee1366924f4801587a8e14b00579f75e318f25c764f14ab0da3e9e4897b47269a098081b6ad8a85a93f0f019d00a6c86276967905e0700a6b37d80c2cd24eaa7f37ad4677cc7762786000126ebeb32fc7184262041a070ad9bd06966c788c7f74f80717e6b5b9249bd87ece13e64704879a80b80f702c24cfafd013b6e2830e11c74886821dd25489e4c5c52b2bc4ef3a59cbdb766751f0c38cdf149a84b4eeec21cc02d849456aa9319f7802d3df5845f2ae5cd7843af74bd08e1985e3a49a5a940c2d67eca4ef903b46573982d8d830e182bcb13b2990cf1767831793e488f39aa366bf6c534bc56e64f33dcd53d79192f36b8210c065c3dde5f1bdf9d7332db21c2f2d3cf317cf3775dc9df7d2eedea37af9c89971ded070a3e5e7a9ff318f56c1175ff2e6dc0442f363c8b6d8867e8f83d7f339c0746b8c0bc03308ef0c9f154c9fb612a0f10b0d68394c7ec726f7b3a896a0762ebefb9c98110ebb091cc35a1938de10d40f49f33ebd97a43148e0bc43b64ed33f27171ed3690924fffa82b1b1632671d27f5790f17148ebb974b005ffa76cd55435347f383880db162e83989fbf2dba4ed9aa732ae4dea9a232fc3d36ea78f11081da5a50f02441ee111c9b5e9d525e8b96c8f64598a7628dfc1bae840ff1baf6658f2c983051fe0a4ad426589e42e32b4f29a6dc0d51aaff4894e6518865977878b9528869a863ed4430c628326dcc905b430148a35be758a0fe7149d4532b1933ef88ac1c8617f995c8f747ea418f7d63aba2260b34ac3c7dceebb78438ca4b1f982b7db9798ec1a7f32622264cb024c0d9e60e955a6e1d677c923518851990a459b767d0f13cd803460f61870db3391b44693ce25bb17dd68e214ce1d67d8c6a9ab904f39ba6af2047ef608d032d2cdb71886b62b6fad0538a0569a09b8a90cae1acef81c760a9975f52b998ab627279f7e004a6eabea756e6ab05b542a5404da51f621c02df69d112d5d74a85179c8f2dfc832f658185692aaebba07a720d8b8b6d0712ec87725608e544131ea12d83ba3a715cb5c7dcf2cc7cf5e291657adcdb226916d30d359e981d7a72e68387eff31659bf6a16109c52924f0c25e3faea3aebe28854b5262346cb04ea6b534e2c8f3ca6d7e0d0e2be438b217db692000c11061df7f033e68c9b8a5dfa1b84e2d1d509d336b8acb5e125c417c7a1e44ceaf41d75e623fdd9231ce7f022859cd8787b0a894c5ffdfcad6fd98c6aa65f23ef6aae84c36e77909f314055e4180fb178d7bb13995539396b883809e702671781db25c5204e258f597f4019cf7151e06b71a81cae3702feb4056c1acd6490aa5acc0fa17d31ac27da5d539634f007f7b8df3e0eeb53dfbf0f7de2397e3b705ed2b3e8b44ab7601c9a61f775c5329669f986f964d15a23ece64836e089f56aa772393d78094de5c022239812f0a791a9a5ff66a900a8742ac10ae69a6130f406c1c27a674973a1a509f8d1f837cd6e5936af1255f9cd44db381c5dd1a46cb11f39c62c0c7bb7284daa7821b00b2290db242c68f61d471a80a4132920b407063352daced22096fe2c9c1803c4fb35bdb216edf703fb9479bdbd85b50220ae77f5a566df42d87177c4476ef49188752970576a290a1543c6d4bccaadf07ab19ad89a00d9e8f3f5399744c380b0237f88989e379b72dab396884a78506612bed35ea91f4b3f1390c8281cdc14ab6ca34f9d23ccbac8ec927d2aef0568ed8934a5ea6b38afbfa7c28809281f3cddc48ed2e0b0900386ab3ecf4f030844015ea1a71e58e383d531091d9cfef365e1bba0d715ad380236a73721673ee77e2c03844b6cea86443a3fd2dd5619ff3c31b277b0ae720b235350f9f805fb2973c8186b0758a8b78d3934be6be701990c585971f41db7b003574925d79db054c18fedb46f640bfdab6cb03a2da23e6772c0112e15d5e69d1edce01934a0f6dfe3ce23fee8019caf4b4f22d4b73a38d0ec036a1a9a897748e23ec66293c24741571d3ba905d3d362c94b0cfc8cf1896bf49cd4b5f68af239da075c8069542a2f97f795514d3d38bec20aff30136a98af18e6d19ebe6cefe672c1230149d907e122e7e17622b044f9b1e94a0def27eef0b58bf11356a1a8e548e6ba53a9e3790c946870962adf70ca0570adf474ac050776f6b3e263cbe5acd90272f60de5f60848e3f31fda0d5496593b7b7248597329c9b18a5a4a3e0eb38f8eed66ea62e77accf4b99194ec58f519943305dec2a1fe2a46e5098e9a9c7fe8f6aa34d3ecf5caad156499ffdf065cc335752dac7a29eb1511746eb544078881d419de3ee6897e45c064778f67d533e279b26845e2638716bb88f832dcd863d6a1bcd19fe22b1c438039d8a8195e10f3eb6b341f8df738abafc344abb7a77843da139d8b52431b12cf653bfe56098a8405101fadef5da6506883c27486dd5c7607aeb065d979f1302876ffe6c05ff6ff5131998598ff2681707af011ace276d994feb8c3ca28451805dfb2e5cad9fcd25a50201afd545fcb51f95c27ac6f6deb1c83f539a6e66d56f21fe39fe7ffe2b97aec41f28f05a8aa778f751b07dc981708cf142c122d006967a81069aa4a6ef14d768d80e08b978b6bbdc96041a28c09d440940f8e7474cbf118b7d78431f8364c8f516a744eb2faa904d79bec59b0202978d3786e5550fb08d2486df85ef4d4f2873c03dcd77184b9e51e225a8abb0652e870eb44381b7329854091992a0b79d9febbe16cbe59a608ef0b982e8df308fb0feadca2a53ac0dd724ee6c91ba2715d764f87a65be1cb30732e61db0c0eb48c6fbfc10c1545709f49b1d21aac3078075e655b3c388080ab220513e26d549571885e2cd310b1eee97c27f7f0745bea62479c0080ecec52e37c1e32d72a6b3864da44a4ba1016a83679ffad0cdc7b44f8a261ec06e15bbe73d1e8231bdbb8f9b0e6019d03abca4910d3d775a27d251434ff458240ae752fc6c3d17942f9d465f02c238a523c632e030a1df673bedfd491cec567c0bcbf2376e288b9cefd3419ad2d18f1285a77e3879d5183d31a0202b99140010984a035ee8e7c49226e5e7142596065e88e5ee6190e00c24327322af6d763e27daebed3a8580acbefb5c9f94a41786d3530aec221ccaa16666ef6b9e401af90af9361893eafd2a6797bed3e4f75ef5b70f9edf45c69bc14af49b63bfbc0617021cb3ed31c26525d62196eacac5733d53e3272f90355c531704ff73dc874482556bebd2dbb3c18754c2694c0fb65c44eff82f43cc11153f16c0a401bb49dc204b0f65305b65183727a2c1607b7323f4d3763d85c104cc6d8f4e117725abd4db2e30a9707782721d97e82590d5a4d0334684da5c36b48bc5c9d6ce3be254369a44f540f8f8afd821eebd1e44e7f169eb914a8c30f4c9592e0e8164b7baee0a45d787b132a596502b724833e27700f803fdf1de6ac4ec3f93a4765a51751e56c32d0e848448dfe5236db2ecd34e7c8463d0a155706cc543d9d4de3873da8e24fe8eb14258a7329cf12522d17f340b16f352817babb4fb70e9e6e18784b3e67bdd449872158c357f7de3c16b4ef055b59bcdbad7836637cbab22a6ceecc6cd644896ec9c23bd9395afeeb641a94c0369438773f16148205e07d0569512dcece527cbd548ea02f2e670902adbf60ebd3ad3c9d552ab245f30e637186560bceb09622c7affd225fb7ba60f45c29eff2a3133db0881cbc09b492ea015c43d3071d5e201044843ec555b3bb42e7d0ae7f3554b05330627e47db2c953753d11fe26538d929aaca521a88e15c70e94a18ec0af038f7f6a295aac729d985f5545efb48a4c2665b2608a9e1d1e900c90cabb384544c0133437e9d19194b7fb963fcbc08208068de2dcf0dd0f3c5651f8ef380321f4e218ecbb58941895f77287685af544a77b39c4811a0d6c5963055477cbca4bfd3bb51b1c709c0e87a2ecb02863f8d713cb91e1b8d2d73d5cfd4e2dca3d35c945141348c2f9927b54fe909ae8b07443323ebec0e7dee3892d6d57095055eba5b6b459fb15bb1d67e35487cc0e070f91ee1ee8e97807d858b4fb467371dd95e73765b0bc7d7de6db1cebf9ce043171c82db136e5d1155eb2d9ee44f0959bda95af6d4014620995dee70d0d2930f643f0d941d13b5cd01fa08490780a245963b90815308a2c25d1792c00eb64fc1d2d12d914e1737f00c0299d270b4886ddd75a29a5a9a7439a42b3d30dbc07cf70d63415728d16a46cec560cfc243223efdf81fa65d2f10f2f9194c47ca89b10b5e76175a5fdab32dd492eb957ec5163592335639cd4f2f9ae6624e895d6a729b5079ee1f45aba911b7fb98c7f8b2cafe24a7e4c94d63267dd686c25a06fb38138dff541a6cccb28ee37ff6ebe284c6d51fd649d930138c286407364e49a478006176d7d047a67611e1909455aeb37076fe3f03ee27c8c736f96418eaa80ec8ee6560e7d568d15a372ccdefb9cfd77e304a52917c970b6e06111df893a482913a144e12ae42c5e57b3f98676cc86946bd8ea18118f053e732359543fdc1b8777ff8aed6af580c9e3a9470aa032ad1405b25bc3127e62ad937f17a896d8218d22c8d03b26d2b1deb01c5f715f169b811b5b9f3403dcb08ba73bf3e4787581c37dc4bdd147c4e62526d4e8c39dbf7862149c5f73cdf2165e1920940fccfc64b1eebbfab9b3114727ad988b0841766b40583b43865608bdb050f6a3317ab5f1e0de742ffb5401fd6bae32f04933839ca24f00f2778866cd08b485c75369e851d7b6b8039d10de30798f68be8e5b2e341061b5154e4a536defad94a97b83ddab1edc4f1ea9d1ee07daba039ddda1bf5b12f62053118319c5eca3edf0b4afdc283eba0129267e7bab1595cb3740ed7d3831760b55ca1dfefe87fe564503d52cf0beb696cc1dffcb44b28a8731be27b1f4f4493cc380ff4b404826985072de162a263ad5ae953c26f93a0001365f37a3b6e4d77b443c1147b2b8847bb808b0e2ffffad8778961cd6f2345fffec2c059ba787889280053b3c7d5e7ec626cd34d896cf7774d1298a2258280e4afb2c79e1ef68c54720e36570c8c27d4341ca523f1821006462546b51539e77aa0c687cbcb50cf464ccde772cbc6deab8b206f361ac7aaf1fd321a8ac0a1f01e6c7e6f47621fd7faf2bff59b881e62bee2089fd847b64ee6ccb98297ba63214c8d3b0cb555dc2ccf1e64df45c3eb5aaad345c5af1ac662515f2c0d6064e601816d9cee7a28ee345f1a4d02e601c63cdbc9686f0f06809bae0f1a197942b307599804632a4dfe850790e91f00b4277fee5ed0fa9c8d7d316967043556e652a9419712292a5765a574fcc9723a7d879a4eee1006bc3204ea1ff16aff6dd23d6db5e536af1eb7bc1c13c85ebad7a08f226a01c6020276c02c3e28cec64278dbdb32fcf2436bf17a3f608e19378cdf869eec34337af3de276e5087a028594cc6685558d5a4969718a5e7b8a996ae7d066631f018e004dab326d3a86fa436e0859b79934131231b3fd615d25046d12b971ed7bfb6cfb9feebec53e5bdb85fb681fb3c16c58785f028567755ddd6894db13f4a1dcd9887ad4a353dc9fad3285153fdf95df30663a89a9d88cd72b42b65dd3e0574add8f28856881defb7834523741a5df33a3c10b6df11c6a3ef6e5c0673a1a66ed81f8ef2895b60a164572aaf5ae6c6510b9721ad9e59bd7384738fa23cf08966fccab18e5b2592a991bd4d7770d9bf01f7b61aff30ebd9b6d2523abb71a13ae75c790eae548d4042b034220e6e69c4807f07612e3f3eb7d87988e1d4ba3a378aa7890af50de8e617504a4cc6ac2d63571209a8ad21c8b472ba8619608f321bab3e991ad4efdef081e26e2242a27b17f0514b361e81207bf035e845f1591f33d3b227c2e052c5fc3cf71e5704fa095ed6ad3aadd4c5cc5aeb7c1e0c09b0583c9e8293a78a0f3465830ee93f800b2ea494965684727822fdbefd95b00c2d838266208b2d345da0c90e8a4d50366e7185949d3d4e7a00dab1052afde69b191791b52c7cb891d6a1933a09c94daa8c687e61324d504e084a313884a524191b8b071606c6fe14f2ad609ffdcb6c6f0d7a0b74e6055e70e6f7ead3ab39dd189d544f03301852203a3a9d9ae6e240d63a3c996a3903bd95357a4a610f0a961c2719d60748df495635bfb6d5459c7f72bb16b49babb6f20d7c27dc6b10b5c3964132389ca19a68294dc358b9aa686ce7089ef993ae9d804c13b71d5c60ba0a096443e33deac8231c1aebdfc285c48d859b4bb4ecc2260cf3947e89af6f95ce0808b5625584e70e91057fd88a583f75f0fb93930176feec769704adeeadc783f4b70d328df0758f3a9615bf6ba247aa9ba20d006c4d76b36773dff6949bcdb061f7b1d041be02297b55441100e46b9fe8072e79a7a63bd628b366f03bca26f7c23359c81b5e0b71d5cb6169c4af19ca88c36e8b2e21acd94cee40274eb941beb8025b8665510fdcdc5114263152d0bee04f43a17a304831367ce21837d9dc7995dd4da7da276ddef19ec2d2d1803ee17113545916629c7297f7d32fa1bc25bcfe3c8688c451c3fca7fd03fc2fa7a2d6cda7f71e8d392821c3e779f9f6c0dc0d53a8bcc5ce50a0ca72044e0e9649bb035885d26e391469a35cb46ce3b1985dcf389a56cb52b472ace24d0786cfe6d5fba4254cc4b494df9bc4f712995c9329871f89cb25fbfdb8387b2fc6f116ff8234231eecbe8a2b085f9f1811677251ddd96b1fa052148cefe1af2512da16044e2167cb28b8245762833dafdffa7d44d91acd946ccc46f2882ce0d561ae3785a867f4d2875e1d9a7c9b4316d4bee7fca9df99b097111dbf2f9ed2b949ea16041f5c3c9d9efcc074c50c21f5a6214ce9deac61dca5bcd34344abd739122a1bf01192a1a4c620d776ba4a6cc4bace168cd5f5a8711f2c324f45d870ed70cac3ea3d8fe6809376ad00fafa85fc8911df662e3ff02679eba513c1a9224eec68a852d1c85da99d4acbb3d580f0159798f1f6560fbb652c77963136928dc5cb6033baacc099983a39bdfff8725d987cc008cddbd97ca5cd5c90382328f5eab46df081fd0d0cc4f0afee55c243010d9f238e5d2e21b660d3072d98f5d10d362dde5969610229c86739e745d1879cdd853ffd14db7cfb4ec403c8c45d2f3630ae2de8a16734931af454435084948390a571df85423fad9816eefc5a97980352abf938fa8e38cb252e8b6cf67a0e57cf9675903f211e6005420522bc53aff724adbc94b53483248f8c4bdeb820597bd2de97c9a2c66d94feebf2e67a0feb741f39e4b661f88841a284120315f61a7242d474e640c0b1ceed6b44b2042abf1cbab70e089148cca516ac7a948089a5dda81e7970a99e8f706946671ffb42bf537fdb94f5c3b3c4c1446be1ed9859a0107b1331f33dbe5b1bfb13c68abfd640bae6ee161869b80518c458e488bdc47dbd24591ae88dbeb9440b4a0f7cd25407b588850deb03c4123e0ee9fef07178b3364c66b0bb1a0e0e6b225f9e80d35a68c5cd26f8e8127650839c959dbf53e4d50e5bc28ff5532aef03c8dae0112347d87e3d4a438a263d649bf5f25d3fb57757b7cad30521c9a3bfa0772290b852aafb4141758a6baf87a2d993769a0c46ceafc5123ebccb0df714c3b5fd1cd0d1f235b1822f49e72ef3bfef0da8e0af684961b8da5c134b609362dffd90e11531cc1c4167ddee9724f0002ebcefdd93aa8602058bc1a54d92174e77b6a489dff28713737b1804f6120b083b39d1dd537df3052d9ee5ef2bf2e12c0d899e73ab84c1bfba3454197e76b35c76fce55c69631eefa39c6f5d71038f8013eee53b0268fa75981c1888bad37761748ea0f73fea682609fc947cb75480ef1d4f2f5c7f2f9fd99f9aebff15b8c5bba6678b2a51847d5cc3481bc9695643cdac32c3347c492060335934d929972ccfaf000a6248c1bcd862075bdff1a976a02322576f74363a8de5af89a360df2b11d0f0b52b8012a53d58a2db0cfa9e680b24a6327a01873cc7493650ea46213f26cea2020291f7d50039a32ffceed5b66323370ac0aebca5b0b066311a63ede782faac7773e8f1baa567a0b10c48bfd04ca14d46ffd63713becdb790b024a5929ae7688bfc0f90c4b174f404d792ed442c21515d641286f565f3b3064812d8eee3077ec61780459198d445a1db57ce9096160bd4b9de3cc92ab4e0f84eb8f85b0ffd47ac32b5909fe027ee0e73f1d433ff11a5435db3c91d91a3b9ed3081a455561b6bb4ea4a024e1bc285a15e0baeaceb86e60fcc1dac512f22b65baa074d6c69f45356aaa80b3a90468500e60fbe79cff826b07186670257c45ed9f7a4540ec00a8728004a1bd4022664b3a878741930d7efcc0a7879af900b2bdeb5f368baece08faf67bac4a8d5e4cd3011c07009a2c8b9c8e38e64c78c6995d0717eec0f34f8c5336d7496378003f6ecbe9222d98a2d1d1d9912a8e89152356596a16e7a5cd5d07a6e01f0ee94f69a600b481cf77b877260a7bfc661437772f4b205606ab8ea29eb05dd755c894f2020846cbee1eb6a52087be04de0272bf7044005527eddb849ebb181840fd18020a4b67a99275e48549b922e9fd390f20a2acd3bc5153fb2b912ed78bd67120bf4732dec3c464893c28086f54cba255c44cea61328dc538befe7363d81f0af754402375c08bd3eff545dd6cec51258ed3f6687260e22bd8666ef184a623b1e4e77d87f249f0aa5cd6299ee25a96ab0074288dceee586d244a6810019deb4f2ea187c71e05fad119075bb59a45a21af5d06bc13c83f77364937438a4667eca1ea9e549c19db1306eb1638859567e5cb30f466c86c7c825e0681ad133a9e40cfc281f77a3b81db0a2fcca81ea353157825842f67264d26cdff2e343770d26fb1045beb88bff4737ff0f17061489c3f5acd3e5c8c9ff1d2eab5856f7383b4b81a1294973431936aecb13d2819efa3d1c78aaba485243b2558ac3fc533edb5b85f8fb481291b0f2fe4f2f84595132a6b62d0246dfd7d598c7c55b5bc050945fee5ee444fc3e69840dd38cb4f6f5d606aa140613f51e60d76ea347fda7380e5da6190cc49912eef3c59f51eac0529166e075dba8f3f18a78306eb06a6ebcf26094719a5051d4e7470dfaa7ae1f2f08cd4098ac8d3f16fb82f76cbd287fa5e86da0b0b6708c4efb89cc2eb6897b55e643b2c49f4b43555cfdaae797c140ba978eb21c8aadb246d3c0ec81a5023c8dd1d01e42dc69667855f2312565bd1bc5a8cab2ff3b8e2b8517f4543c9da2ca9d717d6c5b8c6f0f458d68746f50a2778cc22a889ff49c5fd36e2deca6c5ef8d4d70518454d7e5a886ad675a0c80fabbd98eb41d45db5db7f780749c094673ee6773554e78e45498015cf7cd461c4c5172b4725738185b99bbf6d04cab47b653b1258fb30edc44477f4321b5634d21a01fdb6c1fc2d41e6ee5784ae4d6f13f25f52b09995de63b1dc70aecf8ac3a0010aaaba95e29372c9f3eade94cd06c96cdf930cbeaae2bc382a358617f690c7109d9ce31fab6680f928e3eb56de1df43b186dadb8c49d363ded9d58632e2eafcf376e90cddb1904fb19dd2b62d5372ce3b63d143697605a499322a65f95efd2a3647a743ed62d672633212f5756c4fc0d25abe0b677de90c1b76ff06bd276c823a15addc141063020f17a6792e769ba1dd31493970a5a825cc6dfb6f6483608d68a7a6e238055e871f12354a3eb781f7c6b119d76b386a7715dec7aad8bb01d126c7385a4387f087faec67718f78274cf4a2d7ec3f7c56885c930bbfff1676d8dd3b0b4e1cdf418c086de6f50700b527cfcc2a81d6ba95e30a526eb4c3dee82af6ccc8c5ab55781db15c57de90995411bff6bb9d17394e0d88e498930b597e4dd74217c8d830bec35d82653511892c912cea3248ea43aa8f3d113264bed161cbea659f5e8bba3a0474a8b6017119642f7e6e368a371ed1f290a0e42dc68cb82c96fd098fac39156b5e94f24a9a9124731d4b6f6ce613eabeeb5b55f80ad3acf642d1fc6323f6767d830fc218733996e6724986f5e06a1e79b5082ecc72ed65b358aa21e3d83986c44ce0ce74e458df0fe32f232e0b6b94ad557016b2e6240aea3f502016b44a6cc71fd1bd65d5382a76d9c7ed1d505e75e1355bb6b04ebec4245f8ba0059d70510e65a837f42e1f9da4bdd78dcc988ae89ebc91b6d19204bae8202349b67cf45d22872ee628d7566020f528aa43c938166b52d9bd1a9b3e15beeadfc5333a1eb78aeb2b6f09b9259c72eb82ed89ccb026d05ffc73954fb4fc2e2588b984bd3688cefb677d9fbad3792305acfea58a3a41554bc3814997ad98c139e6d0afef84f7771ea9b6f3c3aa1ebaad7084a2ea1e8f837ff38f3e5c7310fe8ec1b0beb7502d0cbbbac20cbdf0b4bf4a942885d3a337e16157447d844c8d6e8ce101b8fce152153c634af28eee62bb43e191582f1262f85ab6490df88137979c0e6ca6a8808d1a086af6ae20ec5135021f6723e5b3374ed3d745f6a1593503240f988fa27506a487976d475932a8b5ee1654ecddcedf6d3283e141661eb03a8ead2f7bd208e63a21b458c5230790c36f8dfebdffab81dde082c5f52e16cfc240b0d673208155653e875e3165b531e8ed4e0d9d33 -MD = 5377572306ef61982330034f0a28fdde93da57c53cd1365126cd496847bc05694fba3d508b55c97db476a75876ff6474 - -Len = 72304 -Msg = b6320a8a22858bd801c666aba0e461fe1d4fba68c1ff18428fb7c20c1d8b0f0da3a01e3a5233c659e7dcd0667f146436adf6c25aca4233468ca73eb3da421e41df6274615e8e3a7245c9f82a84143a381f35412782b7f98616322b4611ccf463920076c7ed9ecd6b431344bf57ebc94c9c949f979365534953def18e693277bbe3028a33a86c688b0b441eec9fa1fbb94c9c4472a25429d96e36f8538b7b9190fbf11a6e36fff41bc2e3ed7a043fb7c956d499805a8d647c8dbfa95c1faf292c02558d41415f57639379193230cce4c2e3c404896017ea7bd9036a73ccd727d51fb44b716e957baba48d0ad9c8506ced1af5ee545ffaa51e7989a45e3af972d47a98bcc967a8463b1da7273a77d4369224eec0aafd3f7cac95d9c0e61220f4713c884810d4a0a25a2750da1ce35e2af92837e053e2ed566f577c24d3fc5194f38d0d570d5c867652ea0e8b46b4f930694f59b817b70c1dade5f93aed9f963aa494ae5189a861aa698d6ca08193aa302cc1dbaebe24a5b8af67d869fca4f6ceca7af39e4c603925e838ef8295287b1288a5452c0fd0be0fbd06a218c7b27a39ae6664a61e2b16d1171521994a1a73bec6232099d364620a1ee9deb11772286198818ad1c7b101953d49894d68119a1d2d65f35dd28796911c3a149bb48c0a2fcff3ec880e9b0159a3ffaf07b6b7f915079046e0d4e2648cfd1ecc3e66a7288b9de31231bd911f05925d1c2dfdb1978f9acfa289a11dd3e30abf8f02f56b885e487985369a3a6282508b572905aa7d7430488dc200dfeb7e8b45e44f2882348e19dfccfd6e3fd2b625b2e8619648b1aa0f2391f3bbd0b545c8d8548dc8913405583a6ff00047778a5bfa583f78333d1b7f89368298993821089e66249d438ea94db5f7751afb5ae6398a2e29721428adcaa203d860e27df895c2a27c6f3d4c644075ebf6820382b3068bf2894e937b4a3795805dda528ab4b56a90fd062a761d78a5d3da0106f7d70b242dc6d2573dd90d8b3579d092693bb1bfb9102ab012bc3e6b38895fadc23c907e6648c709764295abab95084a2277d1e8a41ba2772a28daefa06b649feac8dcc02577f4502f6d171e69174c21bb4e5c0dd9883728c54b945a96e8d88477653913f2bb23d56f42da0bf76962bf3eaa9c58e1bdb16bec0cb3d49f68820672faed9f567c1a403ea9289bdef112cdb272d7ef4324d8e7a653818445532bcbe26f418bd822a238a48a47f5a51926f3208e56fa87237345fb0844930f119b7bcfac7d0001158365aacd8043d44864d88fe561a236244c2cf3144529850a9abf4198e92557bd8570575a1baaf4e5962507613f0ed78e2945975dcc6c30a6f03f411dcd2364837001b41960548c5a828191e93a68f2c9d338eecc2187974e64a2d6227021b0cd0bbfc7f29769240ef195336698d50f3d12ac00498ba04368c09009901b48c1041f539ace07104469aa09f7bea27fb752ad4ad6bd53e0ba5ecab3e14d16c0219174643593f97275d37784e5daa08e71706eb9770ec26e86964bb06642a9b058dad29b9e2bb5b73eb41eae04a2da2ac6ff1ba1eb261e732e7a0a32a0571c40ec4901a0df7c8306287468305cfe97793d677dac3bebaf163b70d1df9875b69a6745c81a0070ab87ba7b1db2f5d721a65e105c806e47bf8034e2665f5582c0e35135f1b207ee74647c3205dbd813bed7b16280c58c2194d8a137925bdf6782463083420ffedd28c2f6ffe7540c9cb735bfc6b0249e6077470bd71d7b3f0d44e98e9684daec270dccb14b8dc4995854e70fa2b644abeeb0f5f92acf667c5b4ef4f2d67ebadab36ba7347fbdd48831dc15295f58cfbbb28709f39870c59e38e790e5abfa58cf698c7e0701402ce00e99e996665f6ad79444ab8189c73fae8e59e5ee7dbe5bd331b777b33bde73a9d6d189dd1e92bf057c2e052c659d7db244ea1a95b4946ceef333babf935e52eb73cd1d86eebb764f528e3c7b94ba26b542e35762b8423329974970b3738a70afccd5ce1a40a037bdfeac7bf77ee6e3bc708cc6def290578b0541c118422876fcc930c3207b0ba95669d0e8268be95cd1b62c8c90c848811d2663d47468010bdb5228262006c274227942ab92248a38fbfc0cd400a33058e6e0f6d2524dddd8534f031ca24b8d41291749edc3af9220432a75c4b7ec1285ee1c44e2375984846ca80acf2fb136b8742c2fd64096cabbaf28ad843c09b4af3dc3932dadf4bdb82e4685674ea083800a9e3a8d913ff7b24adefc3d1764de7fdcbb2cdb3b86511ca20fbc0b88803e42f357b33b3e14e4ac1934ac17d1635a9cd2ee57136a770957cfecf6e464ba2da5383de207cf7b585226130439f170efb027425cfdc02fab12bec57d1a6ab41952e03a0e1acdde1a4c78614bccfff26460e3a182c2c716fff4758397d422d7c9f0f335809bc0a4f3411708caf7845182560ff2128a0794cfa6fe0c8d3a158b07287a1581b32e35abd90ceec9e307f4113ab31d547c0712e1cf614aa776ca3999a27bc4578aa1f90abd5efd8fb71045d9b3d50990c14ff6fe18a4242cadc947480501294a47a058d895151b669c27aba16a7fa00e8067aaee29d181660a9b1fdcf9112ca413b4badc083a3294bad58e3307b8c915e2d89479a9ef4b9bb2c7271d28b5b5ab156387dfbfd3296238a1565531896cef0f281e6741076914d0d5c9d337f4aca9763827a962ebe8183f146cd090f872e22ee2af7f9820c3198a4e6cc5d1d7f9e45db80202988757fef6b4366bcd10c137688bae8a574241f108b977bc9c6485a5f36d80b209b15e5c860c1df090d64236e4ad85512575cbe6739e548040a536335fde0a805e70e57916a18a258054dd26cbcf9b99abc2493ef3856ad966a2f5d8ca9306353fcdd49ecffde3d446917b51447a582d9030a342aff7218fb662abda5c15de9953ce1313d9a791c38a9502fd783524d47dc8c13ad07be169d7ed3e823cebf874437e8a205b27fdbbf3695c738e8867551a918b6e7d9a1230724b9818939dbe8eb6e2220d7d068e8329146ffbaffb89790e93ea25dfdb1cac2e859fe488b496af5504c12169cbabe5d59e25dc0317f20802d6c4a91ec668a5b4a13d2d44b7ea9ec8eb50a544febea79f106460b1630bca9d63034061e35ce3abaa593def2e2124b69fb8e139272e922e7116cde2683a8688418d33d0bb612dbca5da5ab0a1a309c829df1d6dcf636e2bc9226cbdace8066a784cca95d5e04d8f9caacdaf99d815a590afa10b7dc5033d2070856bb97e10ec11264cd5b93f09cb96b0de159e280ff5dc0fb439babc180d7fe8601317626db6130503bbf0e82a189cd4d40a36fbc16215e6a01f0db07742ed7244de4cfee56f86d0356c01417820b5fef9b5ebb9f192441eabe7fe09e68573f67bf4e2b93fbf726f2b1374b4ba88e916933f44ca682d719e1eb6152f2e7e185c4b7c61fa4550e0c92dd6d2a7bafb4004ebcfc996eedca24e41b7db8a17d4e48cfd9e4f2bbdc7d7c882dda2843e1fc3b0498e03864b47e1165b0fd7826830df6ed88436b370cf605374516cb20f9c7903f4a47900461535deb6e99280eb3912eb26539dfa260e8252495ab999f51b6be33638b36da8eea78e986b92ea669884e92d360d68a62c45ae4a1f0fa1b7449f3955723a36397c3d0e4abd612aa2f43d5137530d65bad2b14dbfc9f9321fbe1fee9a7b95c1c1640146140887a667f6460c8ad2255928a8cf18f07ffcb4f332f3e84d7b4c780851fb1f3d748ac87c46a6016edcddacb955a6f7246aa28ffc472111b699e8c2d5e9327f0f28f4f7ab8b65172d99bec635823ed3a5b2722b02a6b3501dfef006f2d4ae50d04d4c9aba6d8c380e304f0f64d6a092b97ef4f1cdf6b08cc9d2ecae25bb7778c90a1b1b7296224b58c918f00efad31ea9f6b14724e021af033c6521374696e14288e8e19bab2f37548ea2cffa95df5dbd443096d00c0da01364e2c7f01c127182ee3b54fd57bce64aa57415f150cd393c8df9479a217c474173eb0817e6f312d3659cdc5f40cf3f8136172bbbd3a49970fc95c047c8778cd591084c764b41ab7b1594e18b0e732a436a117720c56c649fb68b6ba2a8045716e5c2fbd3f40523c325aacb476aad8fd668ec63e8ce2e8412e663af726a2e904d98a07df7884764f3be67025cfc875683592f56da97f1e011b2a6f37eb5fa1fc2d12b3aaab00d55530752ee926b0868926563b8bfc8bd60e342dba18f3272ecbdb9e99bb31461de2b29f3f8b05f38ab4bb30ff05f099aecd2bf8a206d889de086786406dc5b4ae7c24bd28680822008f66cbb688200916c24513cd8e06083e1643524e4eb2ed15861967802c879c767dab7f087f058a9c8221f7731b0622dd8a119af9ea934fc1950326cd251ef36b140bd34b570b7ebe81452c693a435a2ae834b8f9ade16d513d7463660e38a73cc70a6125accc65db54211ae668682ea4953f34c42527b642c3efa5f1246f288a2b2990fdeca2c0915f385b9121cf00e93583b6cfdcc0cb04dcc776e5241d07c1a4ebeb5aa3391f7f171d66eff2f281573dc4979321671c15fcae5eb879dcc581b8b3e8b24ce9f2e32022b559586d107d02545fb4bf6519f48806c5e18228d238fb34119b565fcb6beefacf73deb94ed947c5878af355453f23632506f98bce55d0ceee8c5be50977f8083db5d2419cea629aa7ac69b23e443346249f3c700a76ddf6e7fbda344d95cfcd58a5ffa07b2ee746288f8ef665a25c122cf0c770270a773e96603da7f853cadcd8aa93507a154a5a82badfbc4bd7f279a6c226f6a48f3128626012baaa309d99065a59dc0a4c003a6e94d85e61638acf4a79d78df3739026d461e606d39aac949a2b9f9dbc21ad7814d4056746c3a995508e65a0946618cc74ec13f6f5107c51eca4f13ff044a6964dcee3615c86c36e71863dd917c53f8bcc7549259f208143764ceb1d57038017520c0ec7131b6cad25e7dc81fe2f78e73383e1fd2259500bdf89e9c0411cde7dca01c4231af009f3e639ce55a7e35961529e7af83f196cfd80f279c35ecef62c2e46bfefd4a32fb52ad29faeb5af657c922b709145ef3caaf30d079100b87bc4f7516e97c0b352736c68ad0797e201ab8ac16f72c7494396be303fa3c757e3baada83cb57f9ef6b1336292fadf09d27094e6c3f733c616433b028e86232ba28fc9b1c6c361d490e11836ddf2fba53c6e59121aa93bd43923020a50b294b25cb6c414893bf7d2b5a5737bda7a6e42c3f74fc9d0031ff200d8abae32b3ac7a66b23536e0a9d237e950ed98350bb740fd9dd174809f80be21b68064a103cae24514859f897761728085df226a31574e3dd496a8b8c8de86f05f28d4381d80889c604db4d03f35f13fb6d090e655deb9293df7ecc539b9eb11352d63448b6debc107f62d515bb0525b565a6a3613ae20343c8da7424c8368e8cad6a862b7d37a577e075f897771148806e524c5e55601e352b06ecc8bcb7f0ba2ecfa2f3d61c2c45509d1e4fce8963a2b0937423556dcbb1318b9b072029bee3fa8fee68689439c0f661af0769775e6452f48079e311f2fe02f0e8a89c95e0503c32d451dca7b432fb491385efe2210e7dfad928a7557b65c5bd3d75d7023d491a3ebb77d95d85e186ddb29209d393e8582fe7f848404e2ea37b01347a78bf15bc3d0ba308bf9416c0a6f5f55f519e3a0c1a12b16fdb54a1c3b19bae2cff4dfe4bb62b9b10d4c918d02b42789864294bc043c31ac32d73054ee775ab96a0cf4aef3285279ba50d31dff402e15c141d649d3360fced3e94a46ba5f6f360622e42cf3880114e3846a7158a9ef9556a60cdcb71531f9416a0c44374864d314e502e14508420d3975ec399747c88296ddbce7185024b61be7daefddb8d82b16a1e56e502f91bd2ca3bcd943a0656802676afb7f8d748fb3d15aac263735b89c080016bd748cbf2d7c70d2d65a32a039b1ab7c65138dd0c9b4effba92a19d61585f79ce56d7f8dcc8e8ca8d7cbacd59d6ad2fc6188fd439e012f70cf37d13e038a10435080f6938a5884edb07b5082bdf185fdfd643f32c1548d8e10b7084af6a30ebc87358e8ad748edf408ffba121bc448f3711bc038d42d8eb6064e3b776f6f276b1211b3be33fe2c6e49bf460e2771807f95462cb036da978b2853c75dce2d1ec159abe2b830d6c4beeb3080f17187b0e4b249d1537a0a5c7fef6e5868938b4971f64ab8035e714b5875f9f7467a557ee550bd5a7d1e2b31f6d4044b2260082bdf4094802a0d4c24ed62821597b2893ed4090724a783cbbca27eac3c15b4025a7bf11ff796ddc5e5c0495f684faa81754343cdcc6d4b4a60e537cc87acf02849da60237ac4307d028382f86bd8d2ecb6b58957be38e555a34197ebda62b4d87e6d1665764cb5e00fa9b7c3acedcc19779d525b8694e24c083a279090d162a16cc69c4c969ade8d61a5506787e8e6963c8d374f91fbb2bc04516f51477399f199596a5f48390ad3bcf8d55a9944c2e179e7908a7ce7e7143c09d7846ac3bb7788a7f90407a1cb615626bef36d9bd199b44ef6b2b3e3ffe2f3e5d8c0773c6771bf34d0d1515fa0a4e1b185e85158a31d7025e25eb37a5db6e0581b8bf967fe9eb1827a4db1dd2b1cc42bc2a000f5a7fb31feebc5181580fe65d2f85d6db1014ce4036defa5b4bb4791f7ed90e91d60918e5c6bac4e301a281908f79b40b2100adb5a242da940e1a3bfa87f51661a6d9ec9a0fa7ab27489d25e5cb1ec1ee59b671bd9259e493c3ebfc1aff06824871f71987f0097013d407bca308fc664b613d00a12ea97e1f1130a3c80d92b90edf6985f4926a7a704ee82d13719909ebe09d44a9a0bc11ffa0f0184cd923237b99391a281c5131055d48607d2b7f14977fdf241c0d1a06fc193343ee8c402857476fbe6db747fd9caa303d296136ed15e60a8744a049c3de24010cf64e72306991115b098bd346fbdca7ac5e3944fe2dbc2657677ed3b26d68635bab463fa37a1d29d845bf7d74eb9cb69565db33ada9aa3c7bced2403a708e6018569d32e95296be1d697ccdef349264e086708b64505752dbc1c216c2b13d012b3f7ad06ab9a2d912bde94c209e65b9750920d28ae96c735f8776dfb4f61e4d7cae06a38f77e9819f892f816df1bebd3c361292863d90a4ef6a17227708d94cf3eb6932be5314beac1475f43ff444791e556f52c2146cef73b0cd6873af1506793dca056017cb9821a7e42eff70a0f401ad5e9ba535a75bd3a2bf3810b27a84f4ee51a5de89b518e68aa4b6132e7936cf8708f4976aeaf0f788161ab6dbb1cd4e4428999e727b45e305dc14e5f378486e2b95e50079ddb7c7aaf996cdf062e96d8874690a99c5280160b4d1db8a4531c8e12cf6492b27b72c4f9135bdba35e13b01609e89c83ac726e255745fba87f9c3f1f5b0d84871f90cc1067eee01d0bc9ef911bf82c5822c3bd4e785d84ae6a949a2199a1698628351467ffac98dde8280b6b2545f59465f297e918dae030c48413ec03d6be2a35fe127242fb425053bc88169e5874c2e66d6287c1348ad9ede920b111f40f0db95a6ac1ea71893edf05ea25efb6266e14b2c1ad09f10104774265235cafb88b32b861c95ea5e9d3fa92a61bb1d586f0816129bb4b96df3ad10e45a54c60673d32b6bc1b07eec0ca36c1306a5d4d12e4acd6ff550eac71f78bdb46d9499c779e29c3ce198ed2ca7c04304d846a7356c507a2d6ecdb9875d51807ed120cda8618987e1c575bf84383f35e220c61eecf1c124334f53af1373e0632acf1eea0ff56ff341b56e7a5e85c74a96274dc15e8546d469e00952d429cc6da1afb77666fb3de846f8aba82158018b08320219f4f08791b768182d3249bda6c9b912fb143c9a6fd7d855d0357795ff208c0dad14f92b630531a8c596995d178b35580081802f8edc9b947b02aa2aafc77c9705276adb523b81e0a466e351c7d06ab00e158fa34f3e8a8f30f0bb68a1e349c8aa96093e6741a1e8510ced44be7ea143ac38309fbae3ed6f776770f9df5d3cc723c89ffda9ffd9e954ee80dc057e223862522dcbd6b40c5bd8cf9382711e9dbdf824f3bf215e700b367663c1a3b935b8b8cb4cceab992e7cdc90eaae5d0db4d1b214cf2dd544b0757e0a609ca01622eb370b5651417b9dfa0a123e22ad11c82cd8fef9eecf9adf50b4143d15057c30f8667a12fba1409ffcebbd5689691422f5f24c3aab174946c360fbc3d3d9d5a808cd814a75d2d27daa05fafc8997fd0b5589655a0cb3382df70b27ba7f2408d242f586c466dc177f2de32ff6ca41b4c97424b121b8ad4edb133c00eac0effdf6cf65f34977c8f9ecad0ac60df56e20a4794b9857580d759a407cee1a3f419c5cd6a52ea1509d5f0e51042509b2272be68c8682c393d994b0a6525914a422cd4c803ea1949863302b4257b6b2a873bcd5d75ed72e121b92666c46a99e969a780df5b7b2eaf722568ca88edfd0805abcbb7f5aff607dda5904bbe04681bdb285e85c98cb6a17e3b879aa2e0a2ae2e411deaf0363217b1fd0d2baa99885c271dc25dd6a53de9dad3e3970c19e89741aa4878ddf6939b4f1df18922808714de0650ca2b4b20c3489d01623cf03b5e1035dfd41787a6fd1586e1d6ae5fc0f050509e4d0fe4fbc827e5656ebdea076cfa7248af456ff8c7a5c652a6b69dd2593eaaef792d194b82f94b842ef78df94e70fe274ceff5e595606ac87bc3b147c9e973d8b0eb3e8c7e4d3de22582427d6d0427d04f6fd019b0e5d2c7c87e407dccf129fe96c2fb3b04944b13e4d6be1053248df8295d84e1d4969cb51f1ea200cce65ba59d5ca5e3c05ee17ddf7d373e9b72aee36d216afa6b033724d24d7c6d642987822710e4f33c1daf9497ee6464a05ef9467d6418bfdebc20ab948326000d4b1c08e6782ef5d240e40c8092cc2f0c49fb85fc8e049eba11f79dd848458532bba79e3e0aea681d794d2a3c02c4fa39d434264d17c53387a50a90101541597f0ba8d6a031bdd6981749922cc6e562a37e219bf199c10ac205f806de72aff94cabae36bf950fadbcbb47c8c557a3d4e3c8427b8c7c8e80e3853e8685d8e7e1162c1632ee9d567a05c5e622b82d96ed751315396048943286d35c83c8b09fad85fd7f5fafc338a80de7935457c124f8d20f285a3f76589c0640c072f9a22dbaf6a04811959f1cd42f60edc236bad4a3751cea525c9e6229fc8e08f8ab262895f2b51efd12a9797b04e243f0d7632c69f8cce9c65a194778d3fba4795fa506db049c5276b94ae4f908ec3464ac52a2b8b78f950aba8f6ee5271a117979b74ed696d69122ec1bd5fab5ef3d924811de0c4bd57aa3f0594f0b5089de7dabd5672543e439664d94c2ec964bde0e1d2914f1204f09268e1f6e67fa9b69fa4867f6537655e9c5303e324b24b2843cadf10df3cf5cdf16f64a53678fef5283e21762cdb89bf0d45680ba92db93dea27d121f80c37f5ad9cb5284a68af6168f0b4c331085370cf80304b25035703bd40cf4d02487370b037fd0788176402480168efda856a78cc4d822c00fccc82a55c021a65b95047e08863cb5a4dc4e1b0bb6481911c78dfeaf38635a2e0c0c288c592128a27778127d710fb27d177058964d101bd9322ad13bc66ee7477ddcc50c1a6bdd75a8f266c6b2c1f566c2677b945d6f7c5b312eb2eee47dfdc89c8a7e39966a2b519413f978ddebf51e6793d2aa69cec1344f0a123d2549143dd2c5b2b95fb498d2d35d28f854e647f071761c2cf4a680e0e63d5dab0b28b123caff10efc8d3ac55f12ea3e9ba5954896a9ea6b0709f11ed814913ad08c55af6ef970761843fec775808c8b170bdb145dd6e10c970111ab6cabdc2d790878843bb3e04a2f461cf93729c25e40a7bd4b22474d8dc7594f1d90cfbf9bf44e7bf76b8549728abe1cc56fb2939f5fa2c355aea336d5df3a33dd0d28406a8a87e672c516b4d571d28792e3c60836bc23759bc993a5ce27cb4651ab5f6a8380db425c120f285d2baae3c75c0b270c9f535c833abfa05fe7350fe2311c42ce2171151d1a17aef1026fbbcea229fa07505aff76cbce3270669f17f86906d233b472ea1da5d74d793c49940e7dc98910165fe6dd426960eaed32e4fc19c6219b800546c37bf70dde225ff8efb593da103b8a9a1e683734b3c41500540a0437ecce53b379631ef606fcda6ed9112ef8ed0504a2a305e1b5b43371f36a04671d10e684b8a727f411da12e17f345b43e891bdf586d2e10eebd5826e43a5cf97daed10bfdeb38d236542ab9db1685979b3e2aa85cf15c367dffff8337a6c323d766d942cab065e50fa2711368fddd47962ca16da04d375939818dee91f29f601fa77b9f4a9086125d96f8ad39efc93eafd30471fad73bd3b1e097cb7bb43e38a6df2c93f6021604a09045f9c682b60758afb867a535f64077abb1ac6d522c181d7c80a3457ba216792ccd8ba74d301c213151b137dfe329eb315003ef52e588d40e0c5fc16396e237db13c554a5d3f789f654e13b3b8eea9d1fe7646a4cf7057b12241be25080d26d19ad594732fe23f37d367a27df562cfdd60c306686dd0863176c8a30d8dc619966ee9a076b3b2c1e247ade7641d54b9de2230a7cc7041c3c9c4a0d3553263a4d517c1a1db5077a3a8a9690bef988d0fdc2c055155408bb680f41275855eaa6e957ca5be2b6df89091e1e435a7cfd578e0668a2b8d4576065eee66b225786520de85dc1fed74fe2ea6d8638e1228f39cf0b8065efbe7ca5c6b9ae4b1beea5a61b81ab0eda9cc5125ee74313eba0cb124170ac311278f4e5fb0e1d49bd71b52da2c236750e7ddb91e719e956c27e4d5b85a44076d9aa3cbb834a97d97f973143341884a6f300ffec1383fd641df1628ffc34e1b9adb8d090effdc28ceab5a6a130031a1730bcae7b54a3d3de46c0c72a2591047bf72b3d00a1a601d6775381a226f07b48301763da3b082127d562c7b482472d205e87fe8548c1fa48bdf75ed0999f0cac8997bc83270f49d3623e00a9a2d5d0693c45718935dff05627279ab7083d52d6a5b41500b947d25355d8fe9407bb729928ea5296f96ea8713b5ad1cfe379f2390cf319dd52304f4a28ba0dee1166a8429cfd0e4923ec773c73177075cbc34f5627eb17639267050a6367db225075c5f810d400ea15d7e11a56c4036321a7eeb09ef2aa5dfa4ab8269e58d2db6557702c1d35d7247fcf6a9d6f0716f2759644cadaa05f06ea59cd1122038163908a1b412a68fd72a2119838145707be382cd627538a8208f322b87c970e6375929c4be9c103e04f2d7cee7cff1a7220f9da3738a207dfde95140ebb85bff56bcbfc7688698d2c24823fd1ce87e7c2b53b0cdc814eaea4e250dc344046beb3c0ad292faf9c7b3d9d40f8e6bf374596056c533a93a1f59ddea6b9cdbd82813b1ec6b0dbc1c2349113da26a1c1859a587c1e3bd5d24463170e175b4f85a19dd7c099020f61836fd322be4777781b7c8693b13532efbe7dad0b132f1e2b2c6b2670b4cb3ef1488350348de9ec353152ace6d5cdd62e78abcc503aa3ce309b7fb3897a4aef0399f5a4d3997c84ab9fc337efec643420fb83f167fe67e4187751eb858a2f941ae05d5d8a917db52d9f34b4097596d169cf8cb8dcced9d45538785aff34d7c2a9c420c6c3e67c124db82dadde01e4326b5d3c8f093c78337967596e513ad20f32bdc69d1a08e6008e831481e801caeb983d09e087b7d165f77c8bb215ecbcbe3825d53ce7894a2452889fdc8205b94192e77b59d2d1640041f075b2d7cae6643ca4d322d6e826d25c21161a667e4df8cdd507577509ae770b5baddcf165eda5b2a326db4295fabeede51dc7ffebe755bb8e4475d8d12f5e96269abd0d4e40d73cb966e2c523343e9a6d2d71a8cf140cee8ba91188c8551b84e9d2cf75d47e9d3d5009c5c90071d5e401bb840ba86262c955abc71f4fbe325a0ddc80e5a8f55c36ff95f0e8ce22195d4b5e9b9308411bfe64d312d6e7c937781b2e7db72c5388ac1081f08eecc37d58b26d04d95f3e8cd041a5717a11149f818a3f1284ef07c71f4b544135dcd47688cf8d7c492dc939f174995f636c1edee8e384ebb951808c0308836f781ee399400b265e5ce46f97d46635591d49567a20af9675cf045c4bf9c0a5e7c0336f5a20fdde179f23904aeb9effeb124939f5cb56fa2d5078098b561c2226a8bae63dae000b548a5bd9b7c9975f81ecdc57e64b62168ed81d06ceca638eb88c05c6c839ca3481a90dba62d0e7daaa07833ea013697226b073e28aa94f5229f4b4af6e66a4f02b75a9a0e0a3f907effcde4cc7c5d5a361840d1b43853802d77d380ea4c738a4be7ac03b95b5535db0273e00d1d52f10ebcd591f8de0a6176d8010431fbdfdf8b712e1c906877f52973132f932c3ee4101f6d86dde3e221638a7de0b13cd5d32a1e87ef7b78ce57d11854da48f148bca608b1b9499102475e54ee1c54567df090b6608463d582e339b9dfe713b4990037404831252e925bce00fdbe019300bd260160e12ec5ba21ca205b61dbbc58382a90dcf65a03bce61b5451d0a03986c252c63010c6919e9aec14714d8a52aeede9be1211cf58a66fac199359189136887dcf7719118157d5085cc9b507bec3a5db9294896b75787eeb166a6253e3399610e2de02f9dc0d5a84c10aa03a48beeb68d60a6618a15b9b3f157ff23877b77471c80dd565ece7b2ca0bdd170b38c844f8501bb1bd25774f10dc7911 -MD = d3e8ef0c120279753ba4211888c2b079f5913a1d9828500cfc68f29c9b182a8d38608cc7dae41448198ab428231c24bd - -Len = 73096 -Msg = 6561cf13916860ad1cfc43650d1b5142a12041aeeadf6f26bdf1db36cb4d75a50e1898ed67bfd4ed8542f0e208d32f94e69fd3cd0eece00f4c6422866db0713ca349348c2b8b24d92c0c5380e32b6c0afdec3ca7440371d87e2ea26b92c890aced9cacda24f7d9d8db017225e54c8f0eadae8422d44cabe71bf864cb84bd595db4b707bd9c287a5158c957ba575e2007bd8db42805f015a5eb696e9089b655b8c0454d1fd9498fae6c0d0a288188a85df633d3a02117387ab52acaa0eadb0a23d8ec86e72480a056df759155abf3ae772045e9716ee89acf43e280e5ef550207c654bbfdc5f536b179a8f62b1dc7babf036eff85358cc50a5b3a9645df4cc5cd5026f44904d2d827024f41911e2b549c66541bc3bd2b4195c6da16aa04e7d9db3f0a37b2293c0f204111786ef8470576129f481350eb94d64c6907fba44fc89b5aa78e237b5d6204ff97a5acf14454b6d0f88b5d34f74837b490722008ac1a736ba60081435d593b0488cf32524acac26607ee89b275e51ec8f65e00782555cd38ae95b5ca647c2d188dffe86380ed039c737880128ef1f54e44d3853be203108b6856a755995443034e3cb66b0f48e13ce431289c69f6230f21da969b0caba42a7c4a3f2f2468e38c728e84b41f60c50c04226a982f7b10d336791bdecbd6f1dd917a669f2e40767da2fd3a84d7bf15d678522f4d070924622abafd4d460b5f6e4fec02ecdf65659c8592c0245fec3b60ebc95d041a27c783a6a52230a6d256a360aafc5f5e5e17b2c454fedce06f9d730390dd058f5d6100524173cf12b33e4669bc3d40d4b3f386064cddf382d1a5d668ae98988f335a9fd596d871b3377f1d1528acd768ed63e2f48043b36c99b953c32b750542321a29d8ac3a60b1e581f109f8306b4393cd8c35fa1962c74f43b0bc105b93cfe10965028c7fe23346ac89f034b3458c2d9b4d72c24849ba7baab6fa64348b5fc8901dfc3d914061e069af70e21cae6c4434ed53deb7b06ea6562d262fe735197015176dc756c2643e1e29310c53ec0b5f00347f584dde0a57afdde77a5cd92660021cfe33b8af64e535c0dcb93f47900667ea9f38f41db7171d8de64c7bbfad20bdf457889e51885f143c19f2ca0923c1d1d65a8493b39d6d0807cbad2c2fd739b0671fceefeef93225658fbedb78ee19a6c1594611e9e3e1d8113da55770cc32413dfe0d95cfdfe9ce03e7255bde16954e7344855807b2fbf574e43de4cbb393da3d9e4e773c610979ddc92f3081c6be32b4c24a4f553144c7f8697cbb88b4e5e231a4987d7ca71c8dbcdbe543aa241ab84c7b9cde1b8943b764746bc4eff9afc1dfbbf48fd9daaa7268c84e7ca0583349021883eda0e1802b82ac10e847a779de0f8969959922398fa93672c3ad8b914e9f4107642d62848c18ba750ddae9cca38bb6ff7705a6534e47ce5a0117e5ba2dec9d312b0a33d643ef45a21ceee52e771aebbe1d658f7f1609370d1c278d3850aed5082b7f7effb6cff69dfeccc32ac283d0af7001044650b81993fe25ac931db090944ad468854f7f757099bcac45ed8f0cd956202e2e621c1ef58d596951feb977de71501bf275c96923d705c8095e064845b80c35c1b5fdec3ab30aedfc5a9032ed893cbfcd8f737bbc9ff13efd7eb02bf97f0b4087b1232b6a57825f1b98fe68ca78e07b9f07465245d8c637a9b5545eff91667707be56848e6107e83722cbc17b288478ef440a97c56ccdda966cbc885fd86503c9455d9eadb8e2b0d75fbfe70a7f70de45ae87f145424e504b09ae521f3b4f0c55ac0123cf465bde83b7a17f7e67ebd429ad8409cc4291c050f6f36349a16eb9345d0ab8fcf2b99bc4923b34e0c73f8224a9cb866254dd532e995365e4f40833edbe40073da4460e205853ab3786b211bd0a22110f607c306c5c95fdf91b66a208396ab8994448602171b28f8b8e8da97d385252dc4eb48192a683d58ffed02d0d35527319bb08b84f462086e5c61871eb9c23f0d006ce6b29dee395ae858dfc851abedfc4efce3f313d65384c169a928f9c5c94f4711118b86e7ee55e98e738f84f77a4a2c9e21c4fbf484fc8665d34f1a1c7e54e75c7b0c7bd1c6ba81f2409ec3e456bbb318b7831359270619ea77d9a142a8ce9fb365ade3385d293028d96eb4eefdc1810127b60050b4520a7c198115b4e30caeca83f863880c028296a087ce73f9ec04cbf4c63997b760c67f3abdee0fb7afb2e63874634d6de6e7c03862871fb5abbcfda14c257aaab2dc784df8a09f81183abb059a78f4fd36de49f397554ecb7127fabfa06a9608b8cafbe5b9c400f9f6a49d6dd30b1b3472d478849edf9da5ecc467a27b6f664be3008e7489cec06c9b8f21f3d6903cae4b78f04dd18c68df6f10b8ec35aa57fed22b848cd1274a639768dd19edaeb5c4f12a25c1d7d24cc288ab630f57a2079c068a929138742b797ac02352b0cd23033466ad832a47c609c9d2ea8e59fce1ade0cc1d24183bd018a6039930986210f365ccdbf44153412f9355d3ebc501729f015ea8a808c4d4bbb9c193363d03ec1005bb55b7a59b6a8e7572a3aa21663709d8c0b9af82c5a5fd2678c5c5f73930e3a4b09f2fdf768ea100d7de3be781ab58e780c4ad0ea4c0376ca7a5725f686be8c34b1cdf577b4a2195e3e8239fea4c16ae1d4e2314e8c004fcbc96ddee181989d1f943489620196ad53555f3a306a5cdad04daa42e1801e067562e3b2bdeb6516139c6ee13eb68f72f2abc2ea97d24d864b5eea2c2a912443cd2d04c8102ced9e19b0c526963d55104526f371ba455e155defe916b227dcaddd12174965acf8de38b87f80effdb03054af39f6212c55300be9f029ffab0cedacfa635c41d24e7e789de516d35e687a252fdea155edfb7e5f32478c9b837dab42cb312a2e08b625e1453f11c9c84495c38c289bddf218a860b336680e19f78ea86fc9dbb3b6fa7b7c99d5985aa30e2a33b0600c41a17455165405e5ded4423ee5cc73965942e02a5081eed40c578ce07e81cd1c0a64d62e8afefb2a951b256401cc7783a61531d765e6d4ed6a4c8760ade9b9f1bfa208dac3976160ba5869a805561ccb2497b42cc4aecd0af9ebc651c8cf6ab6e8c2d002c9087faed6f2d6b1f851ac965b3033d174c32253439a135cd51a29910e2ef74ea53a9d3d70513428e2a76d0bd249746e7d0b1bf1cfc23429deb43eaab84d45655e14033510dd4bb4cb3fa853114841aae870ff0c25ccf25fea84f12a6e8781f0fc7df9bd3ffee3febc01a495a097602dbcd918cbce1e15a602728a39b8447596885fc6fd831cc3adbcd5abfa089c99a0012dac57512265a82d6650fe1fece70009a1b31e679fb46ad4a303aad0c1b6abc05604d8363faa0a73488ca22ae7a0d6872b084870ef7edd0b53f5cc806d7df5003b687506dcab77dc00874c629e68bf0be50da22874e9ad69cdc989a007b827c9c41f5648633195717786254d7706639bb709551696bd83f6f9c708b9f92de823d973a4843b040c3993d45575db446b42894688c2bec106bbc0377252aaa5e11762aa8742ccec853c3db8036233e87f05430a64b552bedfbf0860eef482e7baac470d260b7eb1a8835e79589ae5bb46eecd9e1176bc7cb50abb8ba526e9bd1aeb70e4aa66b91a1c15dc607ba75b8569040f4ab68d62c331a5bf00be7047eda9dac6773adce5f08afba1b59411fb0e8f4ff1557c83ae5bfb97fe07625a044010842f0dfff46afb993b93c0cd5e2f1d61d85c098adf060bbae85ee8b96d887ef7ee94f02136b003f2df9cc84c185e7c87a636ac0929d49c16a1c9eaea303c6f0522de66c72a20d03ceea31739c6eff1a8c1698720ea7fd7b9c926561e2c86dae327f3b81959202920718ff3bdf14c456c32dbe2f8a86f8148685d747ce7cf893905bd2e404a19d8466f4aa50020dc407d007605b8ee0c656e87558c2deb8042aec4230f648574a355f0bb7429db07a9803320378941be4ad12cf8e658c0ffceea6d0ca5ac939753f6fdcaaa60ab354a20d4c3c1932bedf719622dca26ecb6f59608623641fbecb0d09c5f8ecf16cee903ea46ebfd330135ef2edc7fbff90b7e5a9b0c0b4b45d9818cd862679ba63a4fd17d91fdf0e262ccfb9aed4e4a6f6833dd30f26cf1fac890d1b6bb7eefe3e24433968c3f93be7884e4ad497fefd434dac8cefca05ba120a34840531bf1542c8fd03b1ff90f51ac25526fd65ad8b2d73cc27e12f1b2c24983987d1085c98181fa527732728b236476efe97d262a90b92174471ca51ee5abf86a75db06a0f24a4b5e4fadf330ba09406022272d10f7425185310205c693aec966319de49e30ed4b9fcd78c425a0044b5022bab5b06eda939e44ac59d353bac033b83c68eac2d4c2baf87b2d935dbb5f65f22007327de9b0678902e96cae37a37a12a2daad3065785ad89f76a277984447993f6bbfacd7718707edfcba2b8d3be248b5820e030a342576cae6797802c19f1f01287f840c9ba7c653dce552245014615fa736c22ac0c3d9e5c641e861a0158d4c88998cf0f96ecf1ecf14ab64aab76586934cf52ce2dd09d95e214d1ca750ea0ad1354ceb528529341e6fbfb610745d148c79247a631b0f8cf642319d9ff93e224c7d4d666d93dc7f111f15804bf350f0dbe5d87b0a24f2e8d6cc1b4b4fb7927c419716c71341f1e5ef4c352b24db4602c8b79897a1a1bad446e6948e8133ed00f8ab30780c376f50021da82060d547329a18ed36ee3970378db823cefb155796b8e221df201c5ea790bbf5c6ca885c689b2f5ec0bb951bfbf46b50738604d826cb6373661799c7d2e24ea484299d8c8c1125739dce5cc307c327a3e5eaa879987757ad74b855b1b840fd3ec444bbe0864521b436ef3770434213a58defaa41d405e65870ccf92443f1f04aede48b5e3e7f4caaf1e8ce2b97b858ddd15db239c2bd37fbc41b2c285a3f505067d1b4109d07cddc3780c8fbeb6f1dd31afb67674be6731ed76d97c6e57045d899d3dffe8924cdd2717ecee927ad8b10d19272d555c9c14a118ae105cdcdf66bedb2b42feb1f741505ab87fc33bbca1b5cea7a8bc9af4a05da3ab3eef89e8c90ca35daabac40e92c5dcf9c3cf7e1017c25cb288f90de36da9a44b5874f2b2ed09826fa7ab2cf559fdfb2b4b15c6659bc92fd24eb909fac4eb9718edababb05b2c04bbba5e714dff7f51b78644894f9620d4715a7b339d4eb9f89e7ef229839bea86cc6323257b0bb06d38f5ca4b109f6fd73a4c9e0f6d738b55467cc6d08f17cb953c22c7adfef7379a3a3a15906b301ca47785bff1cddbd6199b77b855455755bc75898a9f5c5a8b851593c4edb1d0adb8c3a64f7f40d030c227e0450c48e30f78f3080a6e15ae02aa55b346a786f999a0991edb2c690911fb5656db89fc435f374f1eb59ebd5a6376951919724d2366e8826fd17da8eef001b14c0a42f1e0db93e44e2aa5b5f7f4763e25cbc286e6abfcfa09c0e772ea6191c3205fbbac53fafb5d06c81781ff5c25cb79cc0cc6abcf6a8a8d27fe6983dd17f6742a789e1533fa03e91c68b3e8f111d78598d58eeb579d9e6a85270f53c8f0e5d818fe499d2d0c9355961dce3d69a6bcc9b0a1424dbb12a01256f5b6d2cbd8fb9c99b121543c9f65ecd3ab33750c6115b6b1f4832b90665a252bfef2794c2cb2623b35d7e2e94f061f43a586287fdd5ced0b43b40d4e150703528764cfc068a4a95bf0bfc1b987fe5d747128b03a881cdd3b13677b6a8b514d9933603ecf193cd2aa765b6933d6a927c4a2bda4a2ddbff7bfe81fee6c55a3543e97875edebb058e753b3d51deb7b11ed2ce978e6f6ac0dd08464feec9e077c7d1084c9865ca793d6ac3d80420a780a32d3958d5f69bb9eda29279f519d86908ef2a22840ac4125fe984ae089022a24512976403bf0d25ba2d611089c289e1b7e761abaa24346b76700241d7a3c59085415d6ba04f2b7ec2f746b6255a916c2558333a634897ef01acd115e9d1ecd5e427efb2341d733f889e97dd40487b72f1c0337157ee7b1791ee55acb7b114dcd244e2ea27b060e27b91f8f87322a490adbdd6c2e09c3a6f97b32478d9b7ea3fd016cb75f39e91023c6fce9a366fa94fa98f91b1a5c8626193a9b1fcc85cb9597e1c0de8303e70191b86ad34f295f5fa85d3f8b00ff99f98162072cafc262ec43cd32eb366168a81c985094b302c174bc319706097b62e7d8fb60b45fd9a96fa8cbaa259fdcd4ce6a6d9575f8798899dd1de9d25d574bb8c60e8d0004520ae86fe610d6e7fb943b233f23be46161c97b3271d38231bbb33f5a17658c5b6eb1d3f234c4435470eb7f016e1b7c462e535e75a1b8084501a210abf0303ca8cb6d8c18c46b7b247ab0a79fbb7a79be44c3d21bbcbf2a77dcf4ab06d1c4b3c5cd2df9d28e7798683d3fb65f58dd8f224b775085415d6b52a44768db5a97643afa7fa7aff15d1d883ef545c0d4b90f2ab8fa7452ce273d5dfe06d499e92cd060b9df3001ab906d0d065db084ada18c3003d99804b181230250bf68d30bf98aefb1c91d880bc6198f19f590eb420b88cac271460baa1fbed832ddb0174181f62048c9baa39042a556e0395195306b77635b7df8d8063763582aee24c7186a94bb055da1d4e7ba932d0fb59cf30745fa82554c4b0a548cb30a8f7d41630ef809086df16dac60825559dee6bd85253f64a0365897132374105806e7809b73dea5b0e931689a992e8e6604494ddc189c5865854f7772e1721dd8f7c98cb105630d1d1d7a4d10003380e9e649c8686001482ab88d66ba1d2b3df5f89fa0443249a1c5614865ad2425ef4e1b84b7aa89e2b668469eef4934f3f3477fe675d568d6f6425b385cd2737a2c2b0a769622f4d515b6b5f06bb0d760d035f41a77d537bf9d0c71a69d207ca4b9d9499bde524f4cf89e9d2e867162f6575a0bc820e41d57e89c3b3fa107be3a3af14f610ac8e7bed17852a5aa1b7628eb2c1d6c0b5298347b7a1e500308a6af020b8272a5e75c9f32dc8cf2511f7f7d1e14af6281c126c9c80ea1742d93d477b180892d3a4e1c829f5392a115eded6762ac38684eb047ac40f25b389b49b628cbe8da0d326db5fd79460a1e53174e8c5b6b5ed9aca0894098ada209d69aca36a3aceb9f18b6a764435c59d6b31c21305ada893325f24a2b11a92c6469f78f35fb55346f67c97f6b9fef1876907cf40803722e01655628d05e6d30d4cfe0838b157a5adaba069c57e176bc5a85aa3587c7aad3c0d52ca3b4d17285d7630635ca9474b58d5a0e8ccdba9bbc1f0d3474142a1d00fdefe6395d1d4161e8dda91458faecdad3f231cf318dc6ae1081ac2e51ad214c152033583d84627b85aa79bddabb3b416b0d20e237cd7ff8fbad61c2a4b35ffba310648eeac94e293a23c880a447f87faef55c54250c30232ccaf5efa1ff41b6243b2a5bc93e7cf17304460b6a439cec1c5534939dcc7fb31074f8f3cdc34f0224fac53d7d66777adcb652bc8110a12d2fa74a3f1680c73f6335bb7d8cb2004601f9f5a25bd3b61bb3a47f228d41ad9975661da513cbaf2e8187edeb534dde2857931c3908f8c15ab4693bdbe3590ae77a1c2f640a0f8fe6f7d5e0dbd5f960ffa260a95ff96811ce3b7f192727b9416daa23e00a8dbee21f32ca34cd793711426eed3d8591843fdcd55087b2cf0509b28227eff7036c5e2dcebf6a1eb1a967a70983494885ef940cfe7817fd4dae9c4cae92afb80f9a5c99383ff16e23a2ec942eed4d273b0cc6e533703a652828a1926bfe9fcc06cb55f7ebc65b2a23c618703b65c9a0255e40ec00b37f98e305923a56c630b18d61e2b065dd07d1468563e1ab973f21d9768a87e2cc57f702c7e69afb7412f708107b69330ea8020053675f1bfc2e4acbc81c5f5625441e1bd2274ad692b71b0b399868efb58c2af5d28b5ef90f177970d56ec8d748c45c72c6dca054ac8d7c0b5fc255d87c54ba7b655857cf3a7b3c6d210a5ae2c17950cc286f52122c16c88cf571b6a9cd724f259e56d00b18ca12253d678c0509a3996c4967d67b9bd35f048d2ee1c013654768efff5e392494891d7d1ee2ba9c0374f7dc4e841d7653ce16a9728da808be31d9ccba68e5e86b1fca8288e57ff2e991d3439c016436188417bcb500edf7edacdcd720767ddeae24c0c04e0ac1a8f67ea301c8c4ec65821fac499ef1fe7b64070671ca1d7d71ee5674c8d6d93c189a79dba96d55128f310f28d278c7560dc1dedb3f0fa4713cac237b0eabc72bec4631e1acf228631d95c131e9daf7812977a2cf9179c1d5a957fa37f4456b2d7e9a25598eefb57a8b20d43be24e190c5905e1581b90fc37427269203c2c1bcd5a06d2a7c1ce82b57282c6cb6e4a825406fd19092fcd99f2929beee828d87f77f90cb850d80726b04e1bf754f048f9f4cdbdb85750b841b4143509e45cc2fca9f62c44e9443207d7885d146ceac1b66b17c85dc730c989d831ce38a94a8429ffbbe606d598c7bca7bbd67c77e06d6e237fbd67dd2289b8fb85d7f9ab74947dd5d4aa8caa4840abad5318be0a637477ba500d750da861758a8ad2cb6f5d6c6eb8bb1a34dbd5255b64d8844798d6af69ac5328e3ed54f93601bb5f3c6977848334d9959dfeb20e424ac6a9b7a7cc56ca55d3a052d09aa980fd91ddbb2e556541c6dabd3667813406dba8196cbbb70300636bf4406bfc0adcda98ced622799720eb18e18cbaa55f0fa3f7240549294ca23186a51b23fb85a0255aa30bea5682a71e3ea30f7ca0e7c3203e89efe4959c366cbe33618d1bb2716a320acafa7ec05aec96924d11f656d7ccd89baaf27e6a23616d1fb1fbdf19d715c96691b744c8a2b2cb1fb40f383494267fd9b507564effac2dda6b14a81437b48b370ec55b14251d36abd2e8c909beb97ed49ca7cfa331c97ae41b5c294a19d2e20c8089243b388883d738233b3e8df2601cd0381d1f4035dedd3126b51403dd78579597329673911d124243014ba85dce02ee5cf10bd17dc4165b28ee1a7c50c888cc53f8ce6ca37d0d8fbcbdc984780337457ade013c0dc53fe7c726b5e9b93d408364093b6a5c2df97f14c330b8cdca1a7406269806624caa6586118ee29340ff593bc6761307aa86aedfa409abdb6d3d08a37d28b717d4f652ea110ded5b9e25bc4fc2f6fd527d358d81f2ccd40d770f71c7444bd49af8a44e67b7ab609e8f443b0481466fb90086a98011e2c7e072122de61e69c5682224a69377eff2c8beeb441e83ed0097eeea716e83f40df0d8e5bb845e1b201bec0809d1d4640a66877b75e23d43469b92d173a1eb790ccb35ea9926a5c87b02a0bec6b75f701de483853ef42ff1b82096ec2edeaada4abbf3a15541680a1cc8fac98bb86bccb3ef2d890dd8de60cbc3659b115934905e5fac9a5e692758abeb54a8c7699bb242d3000760e4cb28f7f0795eb9b62b53ae32cb463302662caed648ecf82f61c9713c8580e6bc78a2c3345cb78689f16cb0c1da2571b196fe7c0641f68c9e508a95983875fdc46976c40b8a26163929741c7943c888db5c66ba17ca76232aea7e4652936714a1000d60f28c3ad73825d237e5b2afe6f408cdef776cbc2a49820cfa0820c4d9b6eeef3065dd56482b993f9983813c1aa03ecc62918359209ec9cf27255b2fab9a889498e1e818f777d5f4c7df49fda24460cada12b8dda48f342d6446ccf808a06f86210356f343917e9a294577750c751141ac6767aa049f23b027c8d0ce8f8cf64c6f268465eb2cf5a864728432b7a6b2d9600c3a5eef434aefe84811139ea4df4fb9e80ae12c9ecda7dfd31aa7324dd7fa8b7d8b6cb3100c453c210857b47c6d18b7a45515a66b890111f385531aff031d8537e5440e89da488a00111b7f98322fef07ed43d7179a5c91306ec6d02e96bae3c7d275301547825841e5cf4e7cc10da66f5e2c4d378412d4263162d051357b3db9dd80e646d65b3d82d0f3af9e9c3a9467021f572fd8ac614167b7ba0b51a6e96a60f79f93095b903f7d191172162f2f7b839da374fab1bf2e9c45ebb16df67d65f739ba9e430bf6d444b0229bd163ee195d37b0ab8cab542a299df3e7fcc270491ad7c5ad35d4d7edc2494170506146cce97ded47e101a6d0aa1041138093586046524f54345ec9e860550c9415bfc002d2c0d7beaa4d4dce985d71d89bf19c680429c637d1023350c963c28b93c7e05783b10e944ae6bf607ed6048ba165c2acdeceb8ac9e57bab347e631ab5d223e3786bed04d45865222b7fa67b1235851cb20c19546eec7b68c766ca887c447202f565aeb6e1c84cca1fe6b19fda451c03f94a2fa8b64fabd48cf57b5b57bbf4cbb7d05be6b526a755a9c8899a5b6daa47684d346de73393584dd47d798e5f2fa48555fa7c969bff2b92ce3756dad6b64fc8be308d4ac2bc5ad0aad8cc6957adf6289c955fcd4fdbb4a19fc2b9a2a7c885e0442bef2724ad44de20943b2fccf62a694c3379a269c357a0e432adfa0968507a882e7bc681ee7c3fdebaad2ae590a60e0dddb15c113f7f55448f1929241f185c3140196e00086cbb8b520ca0cb05d4df899aef4571d8918a68e2e4781f74464fe86ab169c9827a1acf623fdaa5dd1ba665721ba3ae15f605f733f82f23f0401b55b32bfd05e4102354f42e209c9ee2294c6d1ebff37f168f9a883c9657196f881f236f73dcb7959fbf0fc1bad8d29331e494dee1669c59eff9eb98f4e47a3b5eefc2661375817157bbbce0ef80009586d5ee44512ff728efbb63f493f1980d646c99f624f9cd0b10ee027308bdb150f0c88338567715e95588f838b9a7fd4b633faf08f08f20cd9500e9624db66c2c37655ca339668006ea0ab34daf2e305f240f0c85bd60041ead9a79950694b9912253806b4323bfe576e69b19bdadb9af6c85b953d49400661f64bbf47b7e20e77b3bf77ab9d75af0c1c7b9852a4c21a50649bd5c7d529d0eb405b668f49d2a9608c4cab6e6a9d98d925313794035eea7b9022086ffc2617c342672d7b8185e069297000911c2c526b232b4de458dab1f4c58ebbba40dd619676ef82b1018459fe05ba15a8149a622ea0da19a827fdd7488f525e2b25b844d14864f4a44c565cabcb9b6907f6702e9008ce3973f300e0e357ed6e372d3f28105157f1e9c4649edec594695534463e3bc5683bbc4cbc5551b9e06a62c9ea81b00c4918d5fc4767239e2595045075078e81489f058768bb101fbbe1228e32e85ce3b8c81d76676bf6bfdf7a99dd952104a6dfb1d4459e78ab03d0511adcb0d25372178e14a55cf3e4a512988a2e1f013ac0ae32ad19e6148f10de48b047ecc65021e5e9501b80c559d87f6d59d48b2e9d49248fe446a81538a1362667623f3acf9dc458444b8b26e2e466778d63520fa8aae3383e8e8d01343f6878b49e30a61e20035985b7d4bf0c337835a95d1c3ae9806aba0043dd5f1e65e5be2c5e59aee863536b88d2e5f43250152612243226ec541b83ddf94185339f5e75334522abaad2151cc23f474cf1c4ddc76c4b4c5a0d8086243c21322a2066032c7dc51432d1e6c8dbd65f614fb70c32a82c54c35ae9a02b298f5e27a47134a4424070b6cafa3bff3719b5dc631e80a436b6b32f9fed3d8af25c02aa8a828592654fba72da802c289d10d5013d94dcb2f1bff8f99fa4a3162d26b13352f0f35df3d004e0e80041c59c503f8815967adf778c88a9e08c9b6d1883dc4a8438f8777c96028989f71756b36c47c9a1afe59a26c104c8f92160f062d7f66894b6ff7f7df615c526e1177c50a9905e684da7638de1dfdf4fffae309aa7a2061b1782c66664d13c553acc8712bcabbec00c2adc2b539c356b73ddae0e8731bb7dc72cfcc486a7477b70910777f9fc534f480a646dbaac93b22a79d95ceb57e13342587326c01a8f203f1f8ddf05f4c46c9da08cf37b8352ea800d430438772fd2158fd9fba59d6be9d2c27ad655477abe8997c62b1ad30b4b10f27b731301ffe0bd5d91b1abc2761ef8247efc5c46feab785a90931cfe157a59d3c347ff9ac9d5a62c2ae7470c3655fbbfda9faf85b8ba06538cb9f68719eec72beae152a426376c86061b0bed152579ef3e5eb3864160a02d0b1e3be0711ee56532edb0b08d7c8ce5c3bb6ee79ae3ef4d1aa80ccb2145d251ac1e619cc391311a3bbb9e32781b63e5e446e48e5037c853e01a1fb6c0d0094bd058ec3e89dc46a575d97fcc6e9a9df0d85c1143ad87919e3f0360ebb875d186285c40382c6672b171c5d9c0e980a7812059599a3b69c786882274dc60cdb78b1487120c23a661a8a01f30c27153fd214cdd42046244f6974bc5c00b623e27e51567b63d18327005913419438e8b2b5bce364f14baafab6afa8be6fb255daf0ebb7cc14d72914a42c5b2f7b699ac9e8b2512f54dbd00325c34d33e2e3282b9726744a7bfbb293d0a9dfa60be4b2ee359d1f1b911e1fd37f55b3a4a070263e3bab93dfdf66a80e4a7ba98c8aceb88862265312ef3b1ed28b10e3faf282d779a4211f728a4092ecdb48c1cb415234ff38f4f7fbb75a56681399e41b2041c24599311deac2b0f9954bb92d497895afba7fb012bd32a54dfedd9bbef172d46f0be3839731d0de64716275f7f077c2b123ff01ad42a5428dfab3bc7a632f6466314abe942efcf35be8e82527a685ffc0a17f90cf715b599ec65ba41f58a1183021968b1dc98d176662a470c355eb74669cc90480329b1306c89dfcb5ba0e1954418f9139eacd710e475fffd5e4f24b2a7ca306c86dac974f6a436c4570bf8e5afbfd79f079022adaffe179643bdfa994aad63eb00ad70e0013139bd562fca0cbb6a7ea4a5e756953f2f2877942fdb82d8c2a533ff264a0a22ad73270780d772dd9568d50816e57ff885ad11be193a07c8b66 -MD = 6486d90890cc9b399c800127f495bf67f692511b6f26c08c53aac308d3d3583e7184bec5ca9d17905d5b9717d43fa0dc - -Len = 73888 -Msg = 6a39c81281bb2979ecdde0401331c432a97336783cc657050a40793117a9d3a37c807875023f8a93efe1aa6420a0b4ad5803a9b2d818ed9e30feb32454a7b567f2dc28170382efdda11b0ffa1890632b3f2d91cf09ed3c4b57f87bae106a8a917456c042ad0bc121a795f5492287397306f8d418f6ccacd62735ba157378bbeaa9f5283c28626925ac57469a670f9e4f546d5bd5c83da5054abd56a2a45bae3a3ac1494d9b0f4db25667e8350faffa85d1920e4ea6c88fa26598399dcc9bcd49cec209bf2e9ad78f4dcfc56241f0b5de2671d5cab9f6d27323cf494e12be7fde0e0151d80b8c6e863a97c36925583722fb129993284ed641296870fc9f4e2bc3a2850ae2576d795dc5c5cc91e471e819f77b40ef1c5904d3226e94f19ad33bbe31561a233dc362dd9563c724a6c3318ac3b6b427bd9dc2f3b4e69f732cd31698637d6be4e31890ce53789b6892d4783f07cbdb8232a4796787da78cb7dd82419e201e36c71f36bf8a60d32a6d12f26fe6ac09f4aa4f692f844510741b469cd0853ea6c0510dd5b22372973258a59a490949fe7c53a19736e9354341cfa0f792e6141edf5e85dc816aed4462fe6db59bd2e709a3d1d9786911beae7a676509054b20d4d8520fb1a9ab216930a0d3eac4ce039a2f874f83229851b082551b77a40ee5676fde03fb977ebf842ff260a07075104e63f68c2defd78ef7fe2b2c99fbbbe244fa552b20e7502813c565ac5d1b42ad84e59217ff4d69d6f3425c210688cca80c0c49bdb7f5b9fba6757d0f9711c12bec290c6b6db7c9ca21036a8133b7db971b1a4e64275f369a9ac4ab12d5107b2bc2a2a80f0fbb71c91f95c8d5a815433000a8b597059030958f47624ead83db2dd6e7076b4bc4fc542d8e0996ea3dae234b3c21cec915426cf252452b76e85b92677aad18a860b41bf960af3d607d76b159591583e87ae6915289c621c7ba86fa12b20b8fac1b435101922c41a171379ab963f35efa1d87a31e6267da1676f7d557319548dd5124c3b4b7033c33a55b2ff9f16da86499c002e460acbcf9b9f8b4a38dfccca2aed2c4a133c6958d766be18995c708be6c0a4112f8f732d7d03408960b8493a280d7d4458cd8e61580f46fe6a5a1e87df0d0de48bfe9e4476624519d4edf363383ae832046cc9662416f2bafc580d019e4be3af419f739aef8341027dc5f1cfc03b141bfe6142f0a3436953359e64818a42d07839ba1bb94e2fdd4d428a6c062ad9ab072ef422863d6054d1ff734c8f0bb97a495b97bd29fc2ec1010a828b8edcdc52ff7c6d91b15a335a3d4121edb4897a89298f7e827062489426bff777f1400cb309d013b6f86286249ee3ee6e776c4ba621bdb69218e745ffc5482f57b7bc307630122fbae3bd1f59fccc23f8611df57937cd8814a9f2eca9e48d735466ba1243792a09c4fad3c6a25fe607b2f90240a975a73c30a9ed063b8e760a9688a178c0ee00e9fdc60d45a7d018e4c5c784f3dfe3331a10a23f5b5cc8eb3e44a4d92b98967d178dced1630f564a0058530bd8c2885a69d91b50b3b59cd4558743caf3717987da9b9a88e783fa64a5942600b5fb6c0273b69d88d6ed11199886ecdc97f4a0077c4fb39b9aaac34f19a1c7c9533197147ecdaf4f8cad2fa24f6a2777e1c812e643d2a070442db9f1a4a6bed07a0d1279d346d90d9c9dff57c25a7c039795d70a784ce971adb3e43390cb947cf136e417ba4aa32acf648821387f74e88205f85d62e417059ce54dfd233ad034825515d87a01960eedabd3e6fb00968e6abe7cc64bc3b193da6bfb38a718fa62f312aea35d923921be19e69051066b5d17686b2c79113f8530ecf6ca62909a6d0d14b55fa92514cc0957cb0583b97abe50acce7935f54a426310479d9dc739bd980435f6a7e4b075980c8a2fd8404b17de32ac94c79759323e80f5989fe85eba5c89334f9ff5948631e129f49ac466d18aa10d657720f4bd88e408a2b21992cc214cb952d98048659d7eb23e0f6c54551aa1f9d48db8a34b08e389a51c825c5baef5cee79cae557ca48a2cf481619c0a56dc79c95086ef4487267f88264d44cfcc2b7bf632a642310daea0fe36cac65708f7942c09b35f10cd55f233189fd2904396c767e19197eea291154477d05aa6f69d53e501667c17a217ea8d3aa38f06dbdfba22f297dd1a29dc93ad8b9be15ee974bcdc7dc8ccc2ce147080d37e02995bae5c10addf9b1c6b362323bc52e3e6a924dafac801d97718f58bf42d5bb4b28daab6175992595e3048cb8e501ee6a8fe56b22529382b9f4a6244cf8e602bb7377ccf203fd7a0473fb995d49026740bb0b24e46e79648a32a02a2fa3fb5f11222ccaf14a8d7f63f623289dec493147786dfb5464b42bae9817ead5d88838e2916415fd9dabae6ae5f5bae94348c4f544a86ef0b9d6409db167d6de0b0f28866db83e6591ea7f5fcffdb0cde273aab0bc24e057f2526bbe0b3a8eb6c01296930383b4c7abbc6ad920a5baba5e7c4b202b7e0fe892aae5a5f1ea72ee7c151b8eef6119a26fb4095d6488294cfba53eca2f0e3e210f6246ec220213e3b3991fe0addacd744243d353181f9ce46e90fe0533700b9fecfb17d7081bf244eb112c2ebb5b50bbc7fe4160c7c6761f0bb1f167e52df8c3afe7d11d10928e70a71fb8cf946d33e76545ebfcd027556b77aac16890a2762accaafb14d80048f55c075e59c58af7959ebd3b8dedbcbb4826cdd69de2780443c7d6fe64cadfd2519e8a8533cb2f0c34f8b6a8aa5cf108338dbdb96e3719439d25ee7363659b9af3d2fbb60411d3f25407d4bbc8ca6eccbc30dcd2502b0084956b43c2c734ce038a9ded794136144a6120a9fd6f92709950a4bdc9ea2ab877cb0c8994d6b4e1bc5453c23761a46a64eae788e61561b0ce8f5dc308a2a2bb7dbc8e2242387271260f993c88ebf940e25fc0f3fe40a4aa0cd6c0af07104f8406d864905352d9e6c10ad29ed6468122334e419dbe77d7c6b4b571b45d997dacb3bd347650bc67dd1de4948bb817f898e824fdc89f21779156a9e58564c4b99004b95226c2ebb8aebd0b5365a6c6ac1f61723a1728e400847322a094c5188fc86a7b6234125728e5ff1d93bf1ad938204fc4ab0bd4260f3a9ace1764e71b6cc06571c920d785550d8469da1a8cd60946038aa519397df00e2dface685323dd12761b1b7f7b0cb9afcd9eaaea8533bbeb1d32dcc1c1425f89bd474a3181f86d392cf5bd928543b3273b1a6ac19c78bc99fd6ba687f419aa27b911ff330bdf79aeea90442c7ec0fe1e6d6bbe123b2b77ed448386fe5a6a7c82b20961ff596f9ede4f59338fd00ae6ffd510f96ec9a29a2f531912775ccb2305289c26e8e31f5961cbdf004f21980a45f298c129f0a4800ad9aacd9583a25a399d28a2a2416515b3d0803eecdbeed48b566199f62877c5fa18a71ccb57866e9a805d599dece7705f0dfb43db7785d22a6119d835d9b2d867c09c84ab50fdfca26298d05e5e0cd5cdc49eb3bd7ce38fbdb300207bacdc33ee41f99998086f60ebb4799b460d4bd27aa4e902e5648e69bfbce2f739ea5a64f81d5cc023d65157c1066e1ef7833ad3001f68b5f5b6ecfcaaff00c0f33ac3f81fd3249cd1535a3decd8e4dfd5583073d8a4ac4160fc95c509fa08122a169f49cfd3ef8422f7c08fa9ac7c5281e4f3217ec51239b99e0f3f472e576f610652e672c02c2a9b4c5ab981d1a31b6fc1c9686d0139135223bfe7fd1c8d3d1a72656ab2f858d49cb95f682018e79f016749b51de99f42dd263e3ba634f80fc8e36d230b1d0436b9d76507fec2c851e95dea942bdea36cbd0df0c6ad18465bfee1d0cbe58e9ca5751ef215687fb3d88a0e3281f160e3d574537df5ac26f6b61ef616a1dccda0c551089d2d079038a75600980b1900ef31958f4c651df17782cb88c5614b6abefad02cac9b56a4c522ffcdb19c0d4f13e59329d2816d08475667226376dbe625da64e3c6fcd04df7ffc9dde5c1489bf085efaba6c723cbe4b5844b575ee8b093d891d672cdfecc3f7256b9caf7458813871d9d4fc2dcbcee04a57c37860c6a7769e96d269b5cd00a4f18d9c7ba9e93eb6daf7723f0f26bb1e84d2d7a78a1645f22de2058c154d9f6caa2c66297ce3fe6ae17b1c9de0f58dec4dde7a6c3624ea987e2888ffc814a739966f831fb2efc93cce8e5a7e67df4c31efa3322e2a989e50d991e42896cb20f2ff7f7ac716b4a814e857b54a6d8d01d7b0488a562f1969028545a071461a127f2b83d3886fdba2da78ffb469baa7b4c5d9f6074a0d4f5496cb6b4441a2a886c863a417c9840bc076c6ade04416d46be3b1d433738ce366f5f32b58ff701e83b4ee0acdf41eed09d01a8abf4149bc3019820b9539747da80545ae65157923122d16dc7d70052885d0bcbedbc91a080a4f92c2b5058cc420af081cf3ea85603a1b2143afa501653c5ff370bc455260026d2b221c3d9d61d8dc869d88e65c7d03645866ecfbda4c376309c8e81bb96b1e5b9353514b6ffbd8720557ae71c52175f1036ebbda57847dc544efe9b517d26801127cdc95ca3b265bce75ecf389f499aa6a82a5aa42b6166eed0d4779343ce848f2c5468576c9cc7d291dcad470a07677d4cb31d361890b454b4988d1d852a516795716813a4cd2c25d78d17c42ca14418b70e7bd7da66331a8cc3624cabca755f15ad4f3e06d3e10b4ad8854c71c7ceed59a4fd05db4261c4abed8d9d321f6eba0f509422ed31a5174e478c2c73eb568fb71f275cb5c5ced7a46f75abb2a9bc2cf513cd6ed266e6ce647272f09d8c795441c57128d460e8c808c1a0e4a7e9dc0c596f517e410404952fb1f045691bb5ffac406116c1944e0a4b9c95d47c604cfccebbc6ddd379ad0002be8a7761198ad639088d8307e04d32ef58daf7ca9d8d62a781a409e4383e937fd088231016666c9a964d1a11c584c6567ec6cafd022bc286696f8f1dd047c419909fb4f092e7472362262869c4734933870fca9e2ea6b0eddb9fd9cad23716428737c97d0f7bea7604bf5a9a5d971fe8fa1c8328836ca240409b7675aeab0e9d2cc6cd2ffc92caf4f66f1d0e017ecee950636126a10c1b104108f1c8d612118be9e33c83daca6d42afbbec4f4088dad7227af102f7f38ff0556eb81ed8fad381570394133a9145c1a92c44d8ab53d824d8c9cf57f8c17542e623460237c3a93fecbe50589c75e9046b46a324a24e2b44ebe6389043d46f9a7bcd37fd630b16fa236a1dbe60f6db8d7e81a3ddb5f658c9f446e94639cae3699ec2ea6afb4fb152939d58df287271cf4b73c34e66eaf5265a623de47b135522c7aaf9f550ffecdba5ce7e156397503c6a836e01257a74ecb6dec2e5683c49787efbd317249a4de7d2840a0ba2d40b774437109082434c7f620304e381a444bd3d3bf23ab6bd4929b244892c56a6e7e2710557770dd400711475604967e9bb737ac1f3eaa7b762f3cd9677e20f8e8a107984bf1f188b254426ac81918b8b323dc04444a178471fe87cd062d73df97673b62b941332f72f7b112ed5565ce72d7e962960f998baf47a58a8b686527621aecf6082ddfd9673888c62d7f26cbc21a874f7d54d99a1752be9860f59ed9300041dda17e9d8f7b5eec0ff06102b48a36de5261e37fb89166f97deb9cc7fdeb63639eeafb145895b307749ec1a293b27115f3aa8232ee05cc7ec3962788997a8979c14d6eed3c9d7d017d9f68ad6f211455bac0fa9a435bcd76f1c85c88b7c5bbaccf319dcf437c0502b25c1ecc51c166c5300c1260bf7baf0990e805705eb440244ffe5263761893319c3baaa74079b18edcf4942c6a4eba5e2760e8e7972f6208c91b5351dc5a6eb6c2a5d6e544313bd746e146a54dba389e3e97ce96691e6780c5f268407d2ae0baac03682f65d14ec9f73cf2746fa86ff05ef57e24dc6998b6ccea5bd862712f65e3bb292cac42308c766b5e41d801a87d0de2c23af8f83dcf656bf3c29215a4deee37e185206a29474bd853b391ab2b6cd6c66080c6b39ef619ddf7a61500874e55dd58e1ca328322ffe99872a19040e63e09219d4d8302516fa9302bf41820dca11755e9b08284461908f72710972f13cf13cd3a954eb308ef3566fa3647b6b1594ca245dc4376db219c367ae7a73f1a104d2cfea7fef74421ea60bbe37493f405e3059c565b9f08a00d1e122daaba24891d05928a79172d8e30e8150487fdce2e46479624b448f61dc27798ea87e658c3ec229d46a95aeabd70c4b0a0673d675bdc30dc5035b8cd202509b326260cdf452349c8e4740aa43610bd35bffe9be6140d8716e2c539b4319d9b0cea6f73e0972843bb6bc46d82827a9b4c69335e73e14116ece04e11d3d992f74a3d4a65844265d81de380cdad2814269ca7eed0384be0a30454b789539f6ce316289f28f3cd40cf975590704cb04826ce8017375ad952f70945e8e95c0c942818b2560554c023f2d0c8dc9f88a37d6289fd97dc041400daa1bcc87915a7708ef7e35744cfa4750771444ba189881aa3762554075c82501374c04181a7f869dc5cc38a2d8e009ed721d1c7c076e789b13d0037008aadab6c2b593a483a87e8dcee5bd708b65c062a89783842774931548596280eb71d7aab6e8f9c17f4dd535456b2271c724015c850408470b6347a54f6f0107a0b582399e46b4d360081130d3bd060b2e83533781f3294925833cc783915d58dade810fe36f436ed84fb91cf46be6c1240c2c8039e5450f088cb8f89f60d618cc655a7a20c333f84a9d434611f833184a3703c3274b0a0d16c862b50d4e19ac27d25524c0c2e51429693638d6d27995039c6f7cb4a4e6d7f2ceb09927c986a76fbe278c6e1ef527074c08819d8b38bbd294c6196c7349d40f1828f1a963ab8ef671380d6317e2c566ae30ace0a2eee149c8ae25d946c1a5de3d426afc9d06b76ea41d445a5e1c53ca1855174a8a0ac9eb909e3e658feca1e29683618bd606d53acf3dbdae422076a402dc5d35d12aca0a950cafabcf097caecc6281e1bf5a5ced4b1fd5f9749d8277064ceb2ce8ad66593e70161684c68ab537762898b94fb2f8b04a29a655c22bd59b1d4dba6131234a057eee3031a240787024e21b44757bdf8723255f765cc72229c3f148bb24854f727fb483560b527afef53ad3f15a1c144851556f46bbe8ff4ad77262671600ec2df8f57a8280253f4c7d8f7d307c18396c5b4660577e05bf66de4d91e5742aa260811d90179f3d27e1147c51923a04b17b9754cd2901a205163eef41b6cd7704d29eb97eb5c70ee745507e0b9732461eee9c1d202be54242c18fe41c7b905a75fca84560cd761edfe1c80105aff360c45dd01be3d0976b1b0127a86c745b599837344e10cf5ae1846ec1a1ca4cdbf96411e9bd92d7a680d04dbcc8cc619d08ce2ad93ff94bb40b771503dce41e8a5450c33f9eb7818128052fb5a1b6a3b3cc9a4ffd9774c33fd12aacd51ecd655d262cea481bcc6ec5c54bff88efb5bb5e398f0f27e12db64ce7017edbe3f0e1d2c34aefa9d13c0fc2fcf755ccff3428fab40ee0dea98ea569b1be037ec8f8e499d05d5bcb4b90d52713b9cae84ccc7cf7e0bc8d886d120124d592e3344a401e10c1b6b722d7756f60cde5b77174e917f433fa3dbb884269fca73296a2c450deb60c097a4721343eee601db3eef4149a6e225aa9fe97ba305fcb1f8630d3c5a71833981dbea557b44e9eb448b746d964d420502ab827c404dca5ac4a6504f917a5cd1529efd07a700fce6bde70e9a217b4d27d687e950a57e1bb8b4bc5b475a0fd3cf327613ef6e2806386ed8258f9238ead24cbc88bf79a0d911f12c98eb5c37d07a48ea94d779c6f12a80e82115908c01508cd1c69064bcebaea27e6d0540fa3b1cbd82e88570e1a4041b9f6af4c3807be7bf4e0a8d10d839d7f03b445bad60fcfbb8c678c1f982070e668468f4d41b3ee00dbcbe7c22ffabd303ea84b74c72fc5f623faa55bfb002908a1f84dc6b6633839da14926453629ec021395dfc5372192e374e70768737dd1aff824762f674217988813531f879b68153fdf9bbfb754db62ed98a19dd3601afb98b288c92854e625f684ca58f9e99066f4cab5e3fb7e81073323e905d993b3998694dbe0b14f366d7504559994fbac1abdbef3d80a85cdfccdf2a8498cfee4af4a34371d081d50988cfbba8a61b9045c1f231f46ed530766436ba510f58af5666df8642837a47ccdc4d1c2d2670cdf52a461ffd7aace77701ef8aa031a1d2de5764a29a846ce0134a3ee3519afda8724d3e05c314be0643fe5007dca05a0d555ed914f463b8129f6b3badb093f0d42fb3408fdfcd77018fe20ebe70cbefc35dd5a349fa920a73a3b7c9e7c48218b59ff5042ace15765d9d35820b0714b1795a6469dde79fc277d2a8500df7e5d3e1457aef42f87d2a9f0e61309a0a3b6db3dd73933d760d8e93aec5649cd54f90cba2cd7884f985023a560dc0d7f47072f7499b95e5104bbd5b9a877e20e71ffdf95a55164d4b9dabb3f693894140844fa84145086130dadd3418771316a7f769eebeba6f2869476590828b106288b7726b36f8513e624b7cb1bb1caa0a923673105255d982dd12fe546c6cecc837ba79a4ad3e06d92f1dfa5904d0d969207d97f2b7cffc090180a47426b174ced7edd3e9067eafddf1b2f49e684bf7beed3d472a41813d1780f1168443d15ef2e3c20facf542a29954baf9f657d6ab6852f61f1ba202133ad614b2e93674f1d0d5f78b64dc1295a7b286690576195b11fc186e5b3bcb24df7b4c082790f4e3f548ced5a54d76df95a5b5c020257c9d384344d34d8164d891eb1794d3c5e98bbc96d88ce2abd806cfa8b99deb0888d847b2ebec771537a4ee9ff7d75257bb7fb35aa50fa179cea1d2361260da71b692cce57e086c69ec1052146d4e47c8e33655feb4ec7659c31729d840a762f39e5334359bb591e1dab148e30878089c1926311d7881b5ae4dfd52f9e4d00920a8a02a3d95729c3f8bfe4f8639d33933a5e5c111608e0409d7bada354f89516b5dfffb582bddcfb5885dd27871ee3e4211eb82851d6fc5dee8e62bf50111c05636d9343f9f45c0f658667e345137ac29f5bde1e30f859fa009f5c4c3aa37ca53bba2613e9048f474649ebf34583df76dc9c38bb5a78dd5efb360211b9b39f3f665021eff8f65fea2457cf202e76fa48ff692dc7785d72d306dcbed8764b6c1a0bb7ea9dced1b34226367d32a8f4b37f304a250931b0ff9f4917f7671972cb805375ebe5149d729575705bf15d06f26599c8884a2e786b0bed7216874931a4b766148b917262862c388dd324f2b39f405f6abf5216bda05f1a728100ae8fdf086b1c31678f29d64f98134c951204a259adb930e9928885e3f7a1a19af19465bb8a13473114f94a45bd8c2e0a63ffe3f8a93c44d74ae002dfad86de1dba481c18ed8334b5a8dbca58ce7fe04c8dae4b657b7b63e3e5cdff9a63a9a150b0b4ed67b9f360bcf4d63ecef375cc233919c0e74cfef6d70c57645d429350fc7cdfc0ef19ec330da0f28ef056f559560f472bc7444e63796687197072cb55e9c6d17ef933f515725337a3061c87efafb640754e8af214929c64071b1ad916df35930dcd2f966eb1b5ae635870b3f6f4d70c84c147726fe955f614a66346fda6712c57b33657a6936f5eb72d7802d6ee19b4426ba257de483a4629587499700523a443f370c125e0295087cf5cfbf865253f9693c427c875f25b2f7a765ad9c6f304b8d4045b53608a8abc844527c221a2b56780d46d9539263e0c5490129faf8853a09f1aad99da3b163c955b0c9de9391e9f7bfbaeac5c7ef5aa2eeb482a898b99e29ddc405d18e4fcf14ac534f286928325cc617477a6a18aef50ae84e21ba3de6613709b08e02c42c2eaac2727c154ebe1bb2d465ddf3804c501024e2f2f792b144cfe4703fbbbf296bf376ba660275fbb9088adc6ceea6c138b0f2f798bb487d48fafcab5313a13570f8f8ad52bb5e69b9299301a3c60c9c134fcae28f8fdfb8e23aaae854951aeec23db0c1eeca388690a8957c2f14223b645f254a43efc8e2a51187add0da7ca3d434477e8699c4d0d407faa24b53783dc0518a755255848906121b72443e56f32b6f2559a6b463e6f7ca4b2a950e7f01abe9731a475ba31a89bececc1b4b2a5b3c60c2d9eba496278061ff6b989fb7258b6967af7f5c9525b46a2a11e28b775a8b9ba885b1e4ec20e2519febd291b117e373e08b76e2eb28fac6a5fa2679ce6f9d826ed395ffd641a23ba531bf9eed67587b6654da990592d136dacb53808018e6b75e4a044fd528546297c3dbe1dc823ee27191f6b98501ec4d313bf64a3cd4fbad2f5f897f79435d78f0189434fef71b6b9aa977fee9e4807c31928b41652250c63a9a91e9230141d136b694f2d54472593a21cac394b9524654859ed0998f6ab50871ba277300962de4144a95ffe8e85de8915b92160ec62e227b8da23a8acddc218b7ea4d9bfbec170b821a8cf52c1cc1e5ec6f50e4340a623eae420d892debe1e2e3c0bd7ad405e7528a6a5c420b33654008966bdf57640c16a4ec6f43631dd46f08ea6fd47bf3769cc66179ec1111f221d1f61d5a3cb8093600a1efdf34bac4478f310ab1d8feeb749dc688fb28008f11af560b5bcb4e81262b2938648a0cd8f0de5d371ad3706f5f77633478374664970a7fe0edec6d9b6f8e4cf0da4c5939f45f369d15548f29e7bcfe226a262c9a3b4a3a4215875f7f9890d2c04962ea0edb7983e5ad43a54293d560fdd9ddfa5985d74ddadd846a562998824fbab307802b930eb6e788f8e1eb28516bce43f8c8fe1a804f4ccbd748ab1025463429f7b76e179db9cd0bd02f781e99144f426e102d799d496a45ee7ca55f834cc0ab04da2b6cf99566b57754c120ffa267c1a3589a5d6a7240d8f61b9fed640a65227411ebfaeaf3ba6c34774f944cba1ba9e0c9ce2fb16fd56d394c212290272b7490863529387bd2194ec0a8e3480675e06d8b505538eb32edfd38b466ce4c1a8aa05e9161aad4b5a50e585676bb2e7c4f92c5a839c88c5d3e8b06df21e8213b4cecc4870a09a76bf6bc67e1b46dda38de97a05f4128fa604a2bdf2bbba44d95a2bbdea08c1d9bfdf6a014cf0426b1b276c343fcd722de43f724eb1f9ccb79307557d4634fae59728b0188aad0ad5bf1fd5fd607627ce00c2fc051432c254c15ab06cf59bc8488d29f29ebf97fcb81fd5db383094affa7c5d9453a1fd4796f4b2e11f7083966d126195e64457948cbdf7c077089f673dc75ddfccd3cfa9189dae4c073fa2f1edc75e1e91b1525ece09e44a3c50fd0a02625232d3321083343cbb75a6cb7077250c7df1239f1ed7e69429bceab233f4d2edc92209356642845258e2909c5272bd624fb20e66138c80dd46bd24a4eab449ca2141c1664783736f0507373aef91115951d5d49ee6f90755b9bf5c9177c4b177f906be4d2aa2abf35e781d1fae3ebb6212d0f8b1ff89f48df138050071b2b477cef53242864c887fb3a9b4c2f4f8360d1137fd37d3cbd2f69bbbb09a4eeacd5a0171dffef0dd8374a31080cd7a49fbcacb7f54a8fa3b1d2ff7bed1a795e9569f4f1109cae0c23762ab41238794a0871ba01b818dd9645d8ac3b5fab0bd4b0aa7e657624edcb71eda4abfff89ea9862803da1264ef7b3fea75e35ae5e4b6c341485c95be34b18943bffe1876cd29e089902849564ebb68af645b24ef8b6d97d55abcb7930c2635218496a5d78e32e03b68d5a61881bf88d0808b05f28862f40fba6f22cafc923b2ff959ee46692c4ce793c771cf10ee67f4d15b471664fca197725b1e8c8d5e641428303ae9e77fed341ae8f2a684afccc460b43182a6a268148a6af50145f078791903d3e88f938bcb041e71c3636c81e7347c0a5fd6be0f2f0883ed50afb13f05d3bbff6cead0ee535953354e388c4c06559d1bd47cb75f8ff68d50a2500981615e3e079d7e9fdd75216e87708877f6c9ccfdac0a21f520dc5b72641eb2610534c27633a2d66621d96557af50dd9447d7a08604294ce01ac0401972ed5c1f9427074acaa4778e82262df6f518be4d06d9d91e6d5886e014e1ac6ac136d6adf6e236a116caeb80c8057f33a0edb409fd7680af2dbf565dd8e7a74d9b22a971f30c57655d3db9a3bb1d65f6faf94631f2579c208d8744bf2c7b3aaa46d95cd5524d707de824695e2317e6274964fc2bae243559d5d8d86ed9456b690b82773fdd4f8bd1ffa8831bc79a0aaed6565e60f98454424dd99bd2a7ec4472324582195ab7af49e9f19041704fda73e9f6f5389a1fffc33db314535d19cdad034b06ca9230e5cdf0261838e6dd5d5eca6c481c5b9e41c4ec8dcc5ac5730d03c6bc8bba4d6034455a6fa167f1ee9c58c0e1df7202a91f2da390494da5a30c5ac2c0975153efa49970f5b53859279d47147d43a358e7a3e6aae41596c650d29c407db4f76b863db17ae0db12e5326a150f67fb182501d4d749b0b89bf02368af881e69145fcd0875c0589c5d5fb70ba8f6c88f38319ebae9c81cb8c6eac3d57de2c93e10f56b0cce89847e828d5d86ea14c7886a43675e026e529f7e7eda21ec96a7bc53f60951a21f8c0be737cde5c1b08d6d182504c70b8477f42a720d55e6ebdf6a45294ee0dbc899cbf527af30171141c6a99d1cfded52b640348f0677522a99d14f58e3c05fcdd3451424aa6dd3800c1c857457098e20350a039d6d92179cff77d7496ff918766101adf566a6dd4516f514725ff2d8361cdaff64e9ab1f8636e647c59b94ec0a6b8726638ce21da886dcbd5ed9c0b2db943890ab23cc513369a605940f98c5d31b60e936c42a7bf18456eb01707c0359c5ad1e3cc3fc95eabe3d7b7e720d8a1797135c36b585df673aed0324ca2db5f6d6c011dd7044d3f25d350f4b6cfc231f0728e92a08fb3153ce286e8d8fdbaffbeffad157d2aaf3946f162bc2a76c77339427f7dc649459fd688f9405688ed9b03ae2c6729239de181c6636adc865709a -MD = b0181daadc927c25b4a8b4f634aea80911d31181a379d3d4689f164e073fff0f268f518ad3e131122439edf25c53bcd9 - -Len = 74680 -Msg = d91a18cec8f9bb63d2bd0501bfe310b08556a4635e38f3d71ee087bec41f781d4fc8e2f3d36f961bcb701073b134aa3eccaf0fc74a2df1488e4fff09cb5011ccd28da669284591b65c9defa997e75cc1752367a113c643ff6abbbfbcdba877540a724c79f00313fb2c4b8aeb9a84900027bb9539e48c4fc4592dae1f1bae137da17ebd6b533283b3e482c981e294adc48b7e81d7e3067e6103abb67ab4ea4b0f3cbadf8778594ba62b4a94b2969f1bd5497413c338bc389c1140be14cde488d1862c9b158800d29caaacd3c8df2b41fb08a534440c36e63f2bf1af368f25338c24deda5caaaf805d09af6e09e4c289fe701acaa487fdee10f8c86f282234b208c1d882a507efbdb0ef5c4dbeceeb5aa52adabe29d098bad821cce732ad996f0d03207c38c647f15f04b9592ec42f1cb9deedf91c108fb05e4d05ff9c58ddd06392c0b15d11408430f1d178a3ef143803335c62c56e6b3a6c257ca0ad4d873fd117c0085c0d60dfec5ea9936376241448d22ee06b13b2bfc85138b0aeb11f23213a26687ce432685bf24b93b782e71953636b5d5726efa73b784118e7af2de419a2fcbb06be3b884456be5ee73be4afeb8d1bc0d2d0a7598d42a0c1a06c3aea82f84ae842c205a770320ade3bc8a33fd7f847f12239643f86595c922113cd9c23e316d77819172ea82d38f9fb52ac2fe04df7d78f88adc0ee627d72b1ca6f64c60c6a70f0eaf983b2ef4e996e0088e9ce34315c63e60b448c080c4b9ab9a7a9311a4d9bf15e3410562157a5ddfbbed36954ff67e47a053329f01004220afdd42db6c840c59d4f3c5e6b5805906ad657785668e15c6d23f68dc5918592e2f94b8288e147b2ced26e90745ba1cf7658dcc5e175b011e6edf3802d98b6326c2477f837a298011a4510b6e56761e247cdca169e2cbd4c0eec93cad02b7f49cd05c0576c131bfaa831899665852d1004bd88343597f0540ca73e325855c82130258f66ce3bb9e4a11e41f99dbceda3d6ae80e74dbe317309a65d826a1b7900bb0a4aee062258092c92a0a6341489e1e42a19f68ea769ef2d725680b1877a2f963e5bb7bbd0e1af72170e67d395e91357b8bb2ba25c7e119f9293f5d2a0b3f6ea492889964e3d1f9a34f3022248f58056e1ce4c2ee55a21888e7aa8786e0c9cdfb11b2c3fa352a1cd72b740c83496720a2bba22dd48e3670fef756349fa6e6b9c009a675dd70a7c3357c2e96e61b22f9a20e875548f032a5d3cebeced4bbfa94abd0f0498f34cfaf36d7cc5bbd832002f48be0d3ec2a1b499fd440c0d69e99f1071e1c99afdff61363c4e9b58a0ff2df12aa5b141e7a54becbbe78b515dd29517a3787f08000dfa234b9e35ecc1fffe074e062b0508f6387efc3e31602e64d286db3cee8d015d0de322d55920441cbb9a3c4741332c7ec3764bb0c6e3e485a086a295ddcf0ad7e29d495cd09c303dabd17dd2bc735c2433fd2da51181881f453f7eeb15762263c07a499962078d4a17d5980d636c9fd0d23a2c85dbe321190ad8faa65f2b52e9f1a2a8f6d60a642a47cd156200c7fd6ae656cfb9ecb0b75b377a9b2e8196a151bb3cf1daf64cbcc783e27d38592b7edbb8789ea70c9153cd144cebeb435e17836770a9ad88769d08133c56f638412b0990c922b8032efb57e97771466f2bbc683c685ad6552f0fd53e022b0663b10bddb671e254982ebae1fd22b5a5cba799e684498bbf25201b164e5d81cfa222263f719767e4953a9553997640712178b5e6853ec5cfc0f0c8b38974e2b9bf3d85180a6337cec0f99695059b991337461851896c8f6eed481f953870d52c80a92f4ec9fedc7ce114c48f89b848f1d5bacb0dd6fe710476d026a2a278e390af0e2ccbf690de54c232272a6df5d675c57bd504b41af3f9212fe7c311b5924d12168575d940c3c02afcc84cf87bca06ce323e1c6de99eb6b70e6ae1cb4e6dcb72674136ba371527e019aede7372ac0bb7870f3f4892f9a1ff14b5e2196cf97396a968f5e09d5bf1ad32e1c9260205ee49214f548c3d8d23c3ead2b04337c0ab4885039a94991e8559ef6af359515b164ca906438214e0a5c937c93191d649dc4ea2190c1e53e54dacf75046548a39eb88c63cf4723c7c8ddaa4a04f4b721c6f71aab235c6f438b06ef39ba95ed324d5c421fa4ea3e0e944bed961f0b832c2ca7942d6fcd4a49f16668a5403c154a63cca62473b5f26ad333d7d14fe213fc2572e148e498f8aa3e75d65823ec337468860302ca3ec3652c11f38bf60cec0a47d58c8e10440cfcb8c1b2c2d41ada18d214f33b06c933960552bb46cfe07def1a3be06d8162f9aa06b68865df4c7bc01705e14db7f9c575d592a9622c014c1303329757a65a414a9ed0c1b1b3f58b02cdb577bb5c44fb7d334e589ea8e3c90e99461bdcfdae7656e7ace946e0aaaa596cb000f4723f482494e2133cb50c974a42e2e87df5d3fb4777b77995f3d03c2c5a923799885d2df480fa93ccdee0194ea69587bb3d7f6294d56cfd1f5c0ac2f43db8661b0d032f757df444df8502d1942ada640522e52ee77759ee5387bed1598cbf26d98ee5cf2fe26b90e555f942a3562e17fc44c9c287d3eac7c30570d9c4adf2e4857c598f7c54cd126eb0180f04af0d1df12171b02e81bc13fe63a56ebe3810498f53f2e2e35b9543ec21f379209bf3e09437919a23e73a4d6610e0e2beb183a067b4365c0d5d50afde3a20239fa37f0a45f59dc300aae1ee8a9b97e83e80c9939f0b887d52d09ba0c5570290da6c1ae596f9eadd5d133f71dc725ee1c64c4e9da5c88da94c6bb2e122073f43594c342d07932d4b81d6cf71fc238a51de6aaf290c89aa72627552cb84d91abda4ca772b088fc990375c0e593a2dcedaff7257b043bd635b3d83d7da6e3b4952357d307a1a1e444db62978b2470f80cfa1e9d4eddbd24ce6262dde983eac3fb393cb1c94dced21c6a6b5aaf7833734b25e37a31c4566cb85b4c9b37f76ba6254383a77f5916ae6ad8186f1a37f337f259ce25ed610f963cc71ee131ac6c455b6ab51ff3708260764df13f940ab82b49bd68044a5bef8aa2ce61169d47f888e5d65980eb3818d188f07f32e5998b37987a38800f5bfe3132979ca1447314570aaef7323059e2e7e8e949b1d48b734326b7c60206084571344b57eceed6ca9a141b179d8a7ce88bde61d7222a8879373c9d9bf0f50bcb33ef111b5e6218213949444229c04931a6b180b2eeaf3aa4fb22543eb3a50b9960ac126e5f6ae2221cf252ff3e9c67c51eaa6d617e2b46fc78200337b4deb1b5deb375db57ccdcd32b566cd744e47facdd11516c39665789947ed20f5a67a529974c63e7ae51ad3e4fbfbb51a36138eec92e535c862713543883ea4d0c0a8efd71bf041ccdc1fd6b6e7366f5c3db3b94cc489cb8cf3822644d787379348d143756537f011ae4766071bb964b0c1a2fa6cda853087b5f2dc1b9a5941c39b9e0e12d51fd1efe82be2741df73dce7e5bd2ab397a1d5f265dc74665276bd83569a02de01a5fce2627dc8c427242fba058d2a685baea59b12d6843ac741e47a2ceaa350aba0222c4d5c49e4dbd2ccee4346add33ca103e02dc4f91f4b1c19860276cb6d971518460b02b48842a43cec6590bcdc84a27428804ddcfc282fe50fa2e9821c0d2d679664191098a5c3061b33155e6b79db82dcd11a34b8a4a3cf7dd2e9d04554109686204666fb4c56b2e2777a9b686571b462e9d2093d08a060385b1ebed0b5e52d7c0633bd9b7f86c9abf76a7bbb8e8f9223901e63729c4d1ea8053253a678d4b5e2df881d5f867bd2dd7c8b074d3d5ba5878da64b3fa7d3933597ca98ade507b51f73ec8f2fa85c55dfce854604b9fd74f7aa11c88c735a4748db9193ce43a3b59b8a0819f32f51da1bb50141c94c9e88d9ad08e3414609c147972c4ef2dcd33dbeec84c6936184eaf8f9a7fe853c6667965f32a3476908899c9446d1fff6bdd6f060079bf8871a0cde611e871ed27c9b9788381084248027ad9a8522dfda890799b039a208e83ec935b70fe47e5609ac43f0c132e1be9923e471914b78d0605921a2c4e2acce16a866c1211b8b103420015e761246817a06a8e01354b41f6a53f0ff4d63cd7fca31d748fd362f4726813b9cfeb79cb34c5860b0b3437911ce7d6e8e7f2e514483ecf1134a3c5045065658700329c99d369f76a91822b1ecb55f0419ff4a226569621cecb136d850fd28c0a32a71b78761655193ebf843f94682186678bf262aa31ac199da2baeb1337edafd1d964cb8f4315936d3ce1780aa6d143f909647db5a9c46e36c23bab0cfe0104584a0727a188cf65a79ab15c908a85e6aefd66bbfb57115921027e494fad6c94506981013f5fd90c68497251b89bc60af3e877c1fdd20946e6d3d14a7dbe96ec34c850eccb20c8f439d9b2fc0553080d825b16143f9312d3e2c70322f9ba06588fe6f53ed78415b996cbd1bfe938c28ab4b5d0273322d47ccf4c526756184175cc35ec9be6e255c909807d11e6b59bff2599347f7b09b49de6e46d8c1561cec06435b5787bd3ffbefca813967061dad73f65918169a039d3d41fa315ba1f04d50276de58f8c179e80a9323c238c6359f7cbb95d1a18edaab116e9178a6c88a000179d5c1f0436af09de22c09825b02d4580bafe4954e2d802951c7397dc6d4edfbaf2a27f4d2394531059ae10f78e9027bc64e3ec73698ff7659a2eca1b26c0b5b974a0f78e66b726e8e0efd12d84ea6327c0f54aa00b37592f6b2e6b513b5d4abb2b3ecfef887e4a0ebe6923ed1ba4c26ad51aad014f38f09a985dc2a5348c656920654e9910538629fb06505fd9240c2dac3b5bbebdfb844f28a217409ab7d06b5afbbdb4869da3e1a0ad9fad49d309174b419d00dde6ddf523e4b14af5455168e1e9646773c36ae0b34657fcf01980d1bc12bbef3862c235920dd9eacb9eb109be188bdb5e2fa0cb3fb8c177585f3b030798fdb255d8fdb77c04d748a62ab7f5f86f7a38cf48104d49ed2543080b005432b9ab72bcae5422e9b1f38d0d502dd497d578a54e76810cdbcccb8b8887986c475f0c56f64e901fe1fc75e1897bd950a434cf4a6421bab0fc3dfa756139cbf44d7169878a1e79556dcda46ba110850f2573c55098b184e2b528fb291a8b60944dd70a2c0088d66d940cc954dd78f7b9257aa3df738ea74a0d7517d03be421f34e79376ee1f2710e5fa12cc3c51bf8f7a931b11e7c21eb8f0c0d93924cabd4ba583f3875b4c610e1d47415e1e2614f71bb8036363bd01859bad6ba96d64a429073115468016b7c8dfe6eccd6bbb3c6ce624f7c4f3804f55220b9d3056128331ea8d7d56f51497dbbe27598c9d87723b6a786c98ffc264b20459e250673ad6f0cfe7901b42ac8da138a72c3e2c2172fd3900d66210e9ce26b316ef9c29641bd017edf215c17505d3cfd4e934b00f9b2ca28cc9b2bf6d082dced0f9761514ce6a52ff17c929d49ccdf43ef51291a87744674abafd63d28f31a806b470a2c36b3a119985c7c461bf0a3653f44a799273ced7e93ec496a0efccef26951e5b067e99d44ba0742992e91316a25b6ea0443d3674d6a98ad05e967a04cf0fc1b64485340b940c60d1eeb77305a88ed1de342025de91afc299621fa3795ea92d4d13fb8337f13e1055eb869493d523266bf8c8f775b8960e6a61e7e3cd53e59377db5df1e9e19a051e0fe30241c6acded1e89425caaa10b0bbc47ba5614d49a6df21391a71f3c4b1a2c269468feb806db8ba1e5b5de4847c16106782e5b949c9db8bf967909632987cb965dbeec2425588b3c3e2900685a301cc27e6cb166a9f05523b63a647683c144b853cded96718ba8c2176116e88d7f75e495b71f32078e53a5b993385ca1ef1ff33e3e09f6339d699b36042bb028d7f4d285b7ace0ff9e3aaf662b8effcb3ae5aee5b8482cb4b6562f63bb44a8735f22f516156058d94990a886ab6d4649ca1d5311e4b32039fcf8e6682e6bb8b64086b510794382ddb6dff8e1bade1962c64f498a6951bb0d9ad6290c04a7c838a1a97b3a8a5e46530eae063f01e860605604f818f12be377b6795e16e601c042ab11ad5df1b88d8278863c6827930389a4c2c883214781be7967ef4f7b7f881c8548b54156593db31dee0123d5e7eb26d5142192a3af7e2b0a2a427f6c2c080e59d6f9ae5f4a402e246ebd3ab3edfe7e147f6b0f1f6bc006914ac16e600d29604c41e36cb7927c3bb68ed97368ac25db878d0ec03c813197384dd2e3002cd1598813d9420439db22fbd7bb979d2c498356c5726da3fbb82525bddfa7f490e94235d345faef48442a1ad0cc6ef97650bfaaafffe0fce03cfa80214f83e3415a637a0a8e5a1fc69e9c3c0274bf259124d7abd41ee0ee39a75c72028a3c75480a04803f1c2b3dbbd3c088f31c54c885ab1380bb3534210de09423e7f89d53ace36d6ffa5734f030cade272d2af38b5bcfbb52edaea53e64cfe9ba58016d2575cce66ec4a73fe12b6b3e40380865161a761648f0effbed475ca55fdd0d7392abacb6a5237412b7b79e28fc9a1c7110ca8a6d8b4e62fed5bc6f0e3cff847843576d263da126771bd94be383ddd0e12274f208428e6d759fcef06e7645ce44e081f67e5ec62533b59b5ab8fc888b7cf31f962f96397a2af282c70b3838539f102f2f062f19d9112c04b3ef8f24b4092cd35e2aafd6f0e377e2dc2ea85e7b517b6b0005d922abd8291c3fd06638b55174983240b4ed3769d6f5171eee42af21ca3c51c58369014f53ece4a2a64cf51c7477fabbcd07b784b6c36125336955d9a5ab0a8c56774440537b8baf7ae9dc31d3779ee124abd7fbbf55a0899f5dd73fb3be13a37ad3dd71d0d21d3d0896d25a3aa106fbde6102989ab2be9359a59b1c9d7f5452160532aa73f7809578db3f5d51fb1b5026b19d21efe2a18b8ac90b370af6b6e05396adb5e4f49efff3408b03bf90c32a2224115f65ee33b959518d5aa32a1f97580db559cad15dc2a14e1e142d65e7cffa41c61aa5dd5a64efc68b4b102378bd4ef2b15dcd94a728a98c615842847088d790241a57b700d673b06cd3f8e9aa9b5cce0b8a964763773382ba97a7f4449de19a942622850c550e9598ba04859c79ab272aa8cdf179f869b9929803bd4d563fe67c08ae4e662ae8ff77c8dbfe359f6288767f1a9bd0f371b85224ffe871fb1afd4586a41af69d287571c5255c5f54aa7657d6234c52b073076003437b9ad399655869acf1a4f5f780ee788ca701e1ab7b3576930ce676982f26fd7681af27e5a81b786ddc587c7ca756aab6e8028e8c1e782810e3748f07b70ad940ff983f254df87d90e2fa78e07211234b274ca376e888b242dae541e92776614bff3d6382dd563ebc0c72324a6987abf46ac668905fcedcd3f81fd56608d15b3c8886db24df9d859a61a8f2e315200a59bb5825030db07068460b93a5e18390bea35bee32db3418d2e98400d2fd45072121ea21f67a9734acca91c2cf3af4c87757a4e6d45a85bf0bacefa340a95c6cf4a564a5922cecf2448e9aab0b9b8ccb0fac490934e3f744edb3cf2455a2cfff7c4daef9fead1570db9a0c97828db3602faa32a077fef26e22050ecb386f04895e23b16563857c7717f4d1cc5c97d1517f5a47f2c833de044faa92e0129865d1452f5331e93a87cea0a6cf93c0424e64a6c371494d0b24cf1fab45ab0aa658a1d7787da4b756a03f1fb8f033d61592624ded96eb2e0d2a97370f0d74492047bfbc061807f6612e903c301af6c79805121be19f2194c2592342ded482f78e99f49de10aa2cde1998a9e183722bb530f3eb9a67533a7b0193de620811e3b78b60822123dbd656048f5ee772e00d9cf19acce44fe698e61d3abcbdefc903d6706c3f2a097a0e665a599d356e7d84a93892503c4240b725ded369a202d2026e3f1edb69302937779173df6bc4af23627c971002dce607a2ad1a6fbecfc161e72df4d15f365dd402306abfeb13f95c4143f586c87e4b1cf52e5c3954c51b94c9e38acb8c9a7c76aebdaa9943eae0a1ce155a2efdb4d46985d935511471452d9ee64d2461cb2991d59fc0060697f9a671672163230f367fed1422316e52d29eceacb8768f56d9b80f6d278093c9a8acd3cfd7edd8ebd5c293859f64d2f8486ae1bd593c65bc014bc49c5d838bfe72575da60a098fd936c401942965e2c01b14708ebbd0756934ef8da3eea94f94fb28878024409865de16bfd64cbf0e58df1de3a73ced4eece8f5d32a374c6f2b8782d9e4b34db300301d46b275dab600e909b37d78fd42c5a2013d85d3f75b20cc08dd5a337b4046e15a0ebf31339a76ed4a7897dc5b0171d494154d5134a4231d2cfa472143d088464fa0530b63fc293062ab7cf3b0fb80051102f72b7eda911f61d9420941d462e380842460e68b7676d4b4a33b89a15eb82a7f09bf505ef92749c2c157ffcc655d7f2299ee35990d05333c91303f938c7222f1fba933a1d9e9376f4ba9d848fdf8ae1439efdbd55b8fe0abcd6e5d3297a7acf45365a36391c9dd37475b55ba8b699fd16af243a0c06b7f7ace426d0eeeed2b0e977129e4ef3d8da35af91291cc04c6d2c3a1f78bfa2c62220a58e99910972f993e5831d610d8db4bed1f797f0e7eb5a0da5b720757373b4a081e4d61ab5a1d3cbe874597c5103889741b04c2e11bdeb3f59b4da376306d5b4e0f22e8fd9a8661ae8affaa6a7847f496984f1de280b494cbfde4d0c59c6ace52a7e4afa5dcfd9074dfaa9e8f756c15bb03a2e06131d9bbc3efc22fc3efd62bac751d262285e541b7f1e0e4929c275557d9caab0ba3b0a153dd8010ff8f11ebc1f336dd0249d01dce6e3d0d12610c4c03a700ee305adbee12638904e70ea09719aecc34b38d406d4ea109788d488d5224e7f01a8dcbadea760e57ac08e324b63a1437ddb4c4a8b8bf46f0d771c72d10621912c0627ac92f053a7656d3b100b1a9a0143884948b9886ac6d8a5e615dff11b6e3705cec904436745fa5e5dcb711defeebc5b1516b753b6dea01a1bba286da4ddc9adb95a59280489e09addaca7f406d2915b99fcae743e7f0edfa1a9d30124a78a07d1a6bc279239bf29a4fbd22749756a91bd42c6736c70c9fb622a09360394241afcf753c9791e411499001d3e1e9fed036a2f26d9a77b7a764585f292a96c3cee2393469521000c62a302aec2ef17c5bb860cf72e5666c9593101b59f7ef77d8c2fc3be14f3a7c81bac4bad3b23a698c1fa2160f8e3fa5dab10e77be5ebfd8cfb06cfe3cc55da1e489b21432f22140f1bafb68ac1b5ffdf74c97f6beb5645144392ffdc47b063b5f058cd98285429d1d38c139d10343df6bc4411ae392898bb6db99bd20d6d08371bca96d3ad21ac87f17880c06ec87c4b8c69e56b57cabe298065eaeca4f29249d1dbc61c47f167d87b5d441b62d98386eb2043cbcea27f07847d355396a9c8951b72a49d7c2c206d7b22a8d774cf1b4ee25172f6241aa3fd82e9c42e6bf874c30077777bd73aa0edf8aff41c2c120c4b78e4bb13e499f1b28091dfa6a9495c7b89d388e1dd83af01fbec7011130a1e26b5c1664a938632cf895dcee3da034964bd6c1ff5187014518bc163dfb0201887a1d0bbc5bb4b2efba235d80c858e0426a42b83df0f679984b01617ad8bbac41545fa01a9e34faddfd50147493352526a46f8fec84ad1044272d3d2a42d42e879a825822194fa772329a961c46bb7fed8acbcd6d852171e35dae0ddec1d1e4d5bd23a845255b4536ea7156fa2b525ce17dd5d5436ae9faf03ef2580ace3b8bb61cc225067aee50b68552db80e99048cd0e1c5c00be6d37f54ba8a020d0876fa369dc32e8627f565ba3dda862ea0bcfeaac1da627e831a55d141f8ad3613c2d1804d0765d8494d2a0c67021f2a51b5ed4e848681b80cdbfb218e55c74f8c0309e8e5d53f849b532205d98ecc2b3557206332b067e0098037eda98b9982fca06a156c1402b2a670144e9d67d559d20b6192d4405a1f0270d2dd98806bf5ea03bcb0eaaef78cf00cc98fbb7382dbb3377683701da39d80139498651e85d0de93c760688a663703900a6f399c1bda5d4528dd11318a810ad144c7184b2e3c60b853ceec9097de67629d9621c9e77d5a9b3f48bc6356f42912ac11b7f1af61f9da27a181a8d1a7a2ec4aad7be22fed30a3836e7b9b511d643e921f4cf7506630610c822cba5eba3e95db5c4dce3b516ac3bcf455c1c12543bdbf98de4559738eb6ca19f7ae8440c3c4164aa17753d28d65b18553beef334ef7fb2576c312b29a3f290de96c8c61b7e3c5207ec4bf9823f02bc77b7823700e550d6e1b59c349dc65f1070addbe44a459ae85ed9dc6cab4ccf262d7d8a5030a3dbf1ad5efb360dc90e9ae63e76112118e9a22f4eab290c660ceff6fc6bc15ca18d7d2ac6d2b202329daabfb73bff287ea509f9e93c913e3168746492bb1ced74f1e3da9bb73b038968ca5db6a1e0d8dd59aa3f081547b9255e4de6fedcc55b8485c04d3c1d339a341c74509b2c78babb73ed6f49a9af05c86ae70e9f655d3f56d59ce336893e3ed9053338f35029369f805e1b1c7e599c70fada3bd2c946f1725dc44cf96fad59dedf71675d9164d5000b76c2ff17b9e5d59a920f579d152a5d7af0eb13451383bbf7c96c1884de2e7371c1e77fea528a6cc6a8e99c453a327ed98d3e12be0334f6eab5c7d29ed7ab606fba090d8ab5f29d0b796aff5638b26ce603b6561efef62624a10b0a43f3c46d31e998265d56a6ece5ae041f3493229e2cff047c0c694fb02215a63e18b511e074bb2568f6b71fd2c191356a84dbfb891ac978f2fad49a3b8fae09dc719e1c70b4b93133cb49e5f54bdd7f7fbb75b5b43c1db4395eb36e1ec9b4d66403013c746e6e3c156f9171bac0ed62bd4ce2d9b60d4616ddcc9843d04cd47c634190fa81fe34b69c48204b99ed3b5fa1bdb5eff50aed414eb8f5b3f695876c6891dfef1000c72116e978ec191d61f6cb82615107b17da41aa85e2708304846d2882082b502701c43c80ddbcedddba8a94f77b544ad61bfb01f24257ba9916c4f99054dd76fd9f871684183219b12e5b9596b85523b5414ad820a27d77ded7d1e4910b8fdc56f564e4ed67a97f1a24e7a44af39b6f7af13617552b68209c6c9ed2cb54cae9faaa628e01f3ab86df4437aa5d54ac97eed5c8a6da05a21f9b8033a987581405b06789fc09e4bf96ca35528d15041201d995076df757b3daa3b996530d3ef89841d4e2174c626e17a1a04037bb2b551703d9fc55f34921bb7cbfd1b6a52ffb0a769874c514943e712d2c0a8e96f0fb403348ad4418057628ed3becbc9753a7c4155c48efa7a2b90d3682b77cf07c8ee3338a2423acb0398bc0d5ed4c2ad1832ce6c7647e4eb5675184494fe80ff7966ac94869dbf875f34bbb34de4da8d217abb382d25851f5cfa6de2adbb93c88993cbe2a8252447a2bd0a701c6a9577decaa42349a67f88979750dcd62d9bf5721c1d9d77972d8e769824be3ae4780fb898f5c86c2918b99ed24dad9ec2fe08db561e4f85622fbe536c971839d0f6a7376c3c92054c0514fb41d0af782a3e752de84a5341f49f69c180ddf889be95f0e3caf51a957db93d155c668ce2a1d1bcd2292e634ded1113399b65e9bb1bda5f462babccad4ca99475889bb07ee85c6270cf36d9f9aa194d2412cb664e573854c704bd12ad275abda46cdca49d6c32e87210f021e5ca1c7a397d7af8a41f3473eefcc597259c411b1a5f95e3de9c09b16eb4f6f592bb9f2cb232011b6cd2533f466a41d49729f12f600773f8a2f6257fcf1197bf70fd15c756d6da38f90f291935d3be25823eef8cedcae35d9b092a960bbd6eda110d14ec7fe272ebe9240a8465cf9734676990963c30608d27539d86ad2ef8efe37a110e95db77aeadbf9c133ec4697bc73888edd3ce77f1c853d2d44bdca26b78b2aea0412834fbc74032482948a156221a3ce64d0b96460e888f01304d17d7314522440a6f575dc6448195cdd2db6df88d3131e05e47d45a7006902306b5adbdb0205c4a074b3f1b3aee8e94e9742dcb0fea33666d09374c98fdf36c8ff8696e723d6b98867d3a3691fd8506f308100a20dc7d278e66d94561c9cda54f7ca4d419be046e7389b9c8f8232bac8613af465e9c71bc58cd54e578ee6145cbaeca8ef546894434ed4812dbe3f4ee290375f0178eb38d42b914ad3cf060c69b0b44efb34b9cb271146fd49bd443544273eea7fa47b512d2c6a2fd2c644ec0241ece86c251a1218e9b8b6ed668c96768c183de654be9059f528a65c5be7d9b0d55a1d4b0ed291a03ef35420a15e9a01298dff3e70fd1bdff093567a7639fdfad4c8969fd62a714678c080eb5601686c6464d88fdf801a478472e833ff808068a6fcfb70676ada92ffe5e2546dbe2a3fa76772e28b8fb61a188f0390de058a82b3bef3c7a8daf30d3c2a2166cfdd0503595c723e5b7216de16b05097fc1041d164d826ab81c1e53e9559e52662a6233fe10c83ac3770641ee59e76523fe8d0dc1f103d24da69d7ae7338d89e0f60ac7ba93f4b3307d3c55fed211ec990d75d2b4d30e03a9b18f2e33f91a0d5bf55c83f18bc72dbb3e1632b9600f003d823114757feb6f6ad175e675f2ae5d358cb9d14964da1ac24e3660948059308fd1513b7a343685ff6ae42c23dcb50a1c30b56818bb880af4020f6826bf6b0e0e9f58c039bc69d7d5f24c67a3f3e8846e95d190f5fc6b6ebf0e2391d679cee94820ba3b4a651fe59d0c31419cf4a36cab1080e447b3fec681d6f5a62a4bff62ab29e81512baa33fa32d1512754b6023602565fab45ebc92fad117fd98b276fad5ff84d62949ae3696b97a82a364b9391c68d31c92692f6478a0dd10b829b0222735f307048e9b6ac655d3facdcd192e3e4f6af2887fb1ab89aae777ff2e55793d51c5202af5f56cd066b3e34b010a63444d9fe4fceefde8bc73b99bd44cb15076d77daa031c468d33808ce4b19cf788dce7e49c66536eac7f7fb614ede16e58723b7f0d236df97c7e27d17777fd8b0f56a2cb616b298e5741437f5b92a8e6e1adf26be21267988b0ec1340434af1f575002d6dc61fdd779b05387d868efa59c8890a6914695ae6963d0f7134e3e3ef1478c7975e12cc4943b243223e74234d9909ac1c3467 -MD = cca52ac605ab74649fd6c6bc13da780e913bf742ca25fdf24b0092170ec4909514027d8dc1e3036105219fd5a2f260b8 - -Len = 75472 -Msg = 89c1c6a082f5058df81f29804be8c212ba6720a534a0c6036a4a1c4329d664ede7acef5e9cb8916dd325524e006866b7148160424f7da213554018ba8581265a8616de0b2272777e586cfae0ac423f00c2dd18b32b56cc787fbac758ac0a8f108d86fa72bf2b9f09b07b8afcf87c3434ed03b2c171322c7a0f4091e4477889562585ab5a19ecf15502da686b8c202c9dbc7c9434c91aaa632e5ade28fdd4fb73769a598ad8bc55ac7712fef40f35118158cf28d4da152e79039116ea7725ccb0a74d6ccba5a4b35437aab3612ac4ca29e884d4694d2ba006b76ca1f35c73e655e1264ce528abf396692aee7984d43fdd952402bac964e8507174e70b55c730aa4bae62a008d9fdba351a1903c66d58e587361990f7c9eea05a2f51f90a2892f60e6c14c4ed36b908c4039bc89797fd88e54281b37f619b3d9a274587229ef48351e8cb1881cb0fc83e6ddc90a05b160fd7d0a1eb0835d57158e42c7b46313e973dabf065699fe841cbde442288c08bc28769e3003a4b8582bcec6f9e1dea587bfa3ce97350ba2abc91e03b48f8cf44e91a94aeb9bfad94b9efc974b850d02b77af23200adc25bf81bbfa29c8988f29ccbbda6bdf3c63e85e1903a59186eb9dd284e9fbf2b5e78dd86fb5766b0f0823b390c2803a5c736bb9612069f0684497d6a215e4f284087e09d5978af9064218e5c1d45692c4e70311f0aa279f9de202c9312f42d4f191795b172acd3a2446f2ab779855af1fc69ab0ee294964cecec4f458c07d5ea38965185af6a8f6121b974dda97e559131917dc82233608a30ec79f404ffd5943f82c86c98281f477c9f11311586f5748e762ded4225653c3acf1121164298c78e7b5ed8956c1fdfc59e64445635972683863fe0dad110cd7af2c94f2876bc1eb5ce897c5fad1d949d2602a9d410d7218150283554dcffd86205f6e0b412abe4462adcba3f71750053c460b4279f11f028427b7d388f8ec790672e98519cf4c2afeecd04bd3fd29d89f80305b936f40ce90bae0b0e9f4a258694c4b8898c033453a8defe619ea2e6c04f5e11118ee9f243ea34713f52be7ca52d7dc3b44663b3e1d78709c4e462566728f668c8fd602aa98ca342536068277c7fae6c7a8292cbdaf969b94fc78d771f23506f3808e320ba517ee0e33eb3d08d39daf544972cd69f9cdb7f7aaea0c338bcf0a6e7380f7ed6d73bff57443de257ba88009b1a7e7eb02060eece1038c544546ba27f11318f9f9c4ed0282772e75c904a10e673242ead32ae69c282b1e7d28805e4381af5fd650f4c15fe4edf5a1c4975a8cf379a60f721f882f07ca8c563d663eedacbc922c7ae98331220ffb50744af3abdee6db02e9cf3ccc06489c868be0a24bf9a27aa5808d7ba3c544072be206b392aedfa86a40204a9bae0e17b61ad7d185f0cadfe769c6f1da54f3e3da15b1e46aeeced7f07dfcf9c58682c48df33114c4199a899a3d7e2c01578655041534cc5a231a2e3baa4a9272170d6db41dd8b330fd7b3f67059c753e56642651eb78b38bd72b76f4cef25dc9e718d8d2a0b2f6f023d6cbf6c80814b9daf51e6b9e64e324916976c2f2dba2f38009ce9085a9242d1311f3ee8eaa519c6aa104f736dfa34eda3cf84e1defa9186a491796d3a4870e569680f75f6a730c8fd0a2a0bcd33a31390cc23f5715b95e2b417b8b928a65bc73cb39bb4430c433d0eabe0b3727f1f436419e3ea8351cf04d58c217cb45075ef21ae8df44e48a39b55721e3afc310c0594352f3193818f458f5b3e385bcb51d5cea530e686e0e46c67f93ce2d8fdfbc2b7aa605b104f693d2821897c8d7b72138a243eeb7b698808ccbdb74b773a511334f641d7982fef44566b7db9c7e54910eac802739a470128ea1c37f5857ace6f92852e2779a7740380958550a99d595676fd262f621dd22546a119415233a64066e3afdb535ab9e34d3c5b019108257c9530147f71328d9678f8e5df8bf98b2e18ae2153b39e037c02cc592d2cba3fcbfc0d47d43649a5e4e76028208130efa12e212d30f905f32647c1fa43bb380afce1e15ade2fa79da918935ab4d07e36122e094df3b2070b8a82b9c8d5fae619680d58a7eddbf0d74b92fee7fd084611198eb2fe0c7d35af115a104f543a58dd95c4dfc993b99a0554dcff7a69870ce32fc6aaa7eb98f670432461f86f1814da1eaef32a5047278a4d5d316c9adb573ebd7c7ce621b3edd1a8783b4e67028e916b321f64b4031de8adaa2149018399865b0696334f4c7055a9dbe8dbdc884a95f3e4c0e33f8be1a2fe3a4b8a2e0e685c80fb8319b4d1227edfb6070b4027cd4a513d94304340174ba7841cca80da2813b7c1cff402d078bfa2ad2267224f7b40fbb2e5d66fae2345321e11649a857d5e680fd96cb9c8e78aab07b77a039df8fc6bdb524035449a12467ec602eb8eccaf2a2c3bfe3a38f382517c22ae6461baef1a1d56080491e0452d1ca70fe4549a6876bd6403048f21192e61109eb559359b9f0f5d888e149a508e8e30e625856b1cc629fe15c959f4c19a6cfda586d2fd846317f55c125b2cc6c32a00402f7fb35ea0f846c0c927e30e4de6366d497d772bfecda9fd31c41c1a6396719852d207809faeea7ea4678071816377508da73704caa6e7e67cfdfcbdf85a11494ffadc34fac465c9eb97317e0d7b2cf9c3eeb1a17f1a3ba254472343f9cb7bed6778a5ee7acf251d0f358aa62a73c3b37cb27b8454ce11ab485e342ed080fdff49c9f91f7825c4f27fd1006c6113d82818a0f9201409067bd9a1b3e1251133f9576d4a4a8b7ea1d4bde8273359a1d6c24828cf071571869e7890170d5fd2aa5620e12de21d20685e59e953bd7cc45c1c5bb8419bd18e1e8db5c7c1f5f96bbda026b3f898b5b174d9d4633a5d32e1b490f3ee1560e0b53ac401b7694d7a430a71e9545eb0dda853e1adc43f8514808cca71289ef8cb9d77cbfccd61866adf0d25e950a4cd0d8b720056bac7d7ba37511383f662c5ea9d322007984f1343b6323697278f6fbdd17bb05f8587c77c6c8e168ce5e54ad63b164aa29676768d5f164e8347630b76f0cd6c38d2e3c6d396b04dfc65bb1a070d70b65e569c42b04025b82e4eb412c18fe3be63116078685c442462f44896057afdfdbb4714ea44efed1e089c172815f55b017edf823e9313d634512012514a09fa7b19e684ffc3e4d8faa2bdf0bdfcc7afefec8bcd9c0c53c2e837679cde5d4112d92ab340d5a59575a87d22d546de8d3ed42ca4b7130ca2b6ca96396c9fb7a6c3724e4bed1e72985fd1f879394543ac9448cfb8b3363c771e55ee13f607d1a188e0f50eee2ca353d3e1b51f915bb4bc5cd83646567814476614bf95cdb933d7dfafcf7ad8a2c05e8e72339471dcba12d4ed00cc154b1c9a2a818b2d682676a034293e2e10f3522efbede4665f5abc66a901afb88431cdf5d816c15939d1e2912307b1873ba0c13b88cf5803be58542e55b0a3aa07cea0d0fb6ef287c74e302128a5da14cd3da60ad180fefb2347e9b057648d0f34742dc200d4af5794fdc7e6b19e08652a2c692352cd59cb02cc05b31ab7bc568ec4cd3f84f25847375312485a5adce6f6ef930b78eef8e1e137309d3c04b22e6b2327aff4427db502f0b7cc8f66b818a819bc29d0704cde532be2e527e62ee57e319599eb3f904fac5920f9dd3c3a88b21d3d04e5fbc62ebd1ca5116ad6531a2c52bf93b654307577fed646a055d4a5997c9e3325ec1541a38bffa8715fff3afa190e14023acea51a445049855e06fde2ba682b1ccb8ab59aec4b20d7dd63d66be709913b3dcb7cf7ec1759088f51f0124923633704c708f7c01ff10af9216af66f2aa1edd7c76b8538a41b9694363aaccb486201323aaa6eb9f6cf871dc8772df3e9bc76b342df66cc7ef7abf7342c16935fae07de5618541c67e2d8c5c9797727df47823abe67011a1083d512cc52f443c1adb763b9d14c69dbf17c8b94e0667d73e98cf8aa80e8a401369e817f3daa5f26f7ac6cd673bc44db61eec9bb4a70673ff8f35787cb81ecb98664cdbd4abd37f80233442c6e281fdebabc2acd262967ac2c41e1e6856166a209b4521708a180ad53f8a42c3f146d6e7241091af2061130ca1512377d0ba4732729b91d060babbf7378e7765505b0031f39ff553c7ad67678d9831ae0e5287565215d2fb1302bb6d710986b4e808a2517e377ec741c39e5af0b9ed17f9265514a37d8df98d3832bf57c21ab89f95e5d02f9fd41274ebdf6e337d01b9777ed7f5ce9969d3b4a448765083d97a5e49f0356da1a03c4a6d5229bcac159c71a1358039320f90728e2319c3126b010e6eec089f038a4eaa902016f40ed0c9d0d8983e4d0f2638ae3dee301a387955954a00d22f8e394f7b9d71ba436adb477a6b28b572fa57d450facf44bcbdab7fdd255519840a5647a7dc6c9f128add1e59a20c6f11b94a6a3f0deedc1169a886cc491268063f883f15953a4cc7347f5754c46df49015a60565be7480810419724cfd60441df5783dad100249cc3169f9521b72ca59d614aaa95589b87455a54c4488673731f3ce4c5794ed1f8749420c3ded447bd2c43b63f319540d5225f51b9b334ec8aa023171fb6b23556243b399fc830a8f65a6c4372b53fe06833cb0e73b463e80f0ea49b681dbcb73c3e963a67725ed8c7946562f3a4bae2c6f627fb80b095ee56b73bf22d12d0e011401fb3e961b15fc756a9a5106498d057f5f0a97f3c3d78184643bbdd4a91388bc54226641aca966c3db37a77895c31b19faf88bdbbed0dca18764907096039023aa81286021d153ca61d639787677f6a7fcf29dab40727c2ca2e3a28e3e059fb1cbbf8bdbc2b74af2c31f0def36d21c8f2e9fd44b92e4eb8b7e5ffc17e7423fce7e85979ad780d3a3cbb92dc31bfb173b55a838a4fc4fb128e381a4f1dae1f7e28c7b5585a85776453f4da1de6e1a6f113cb4d19cc5db546999f1a4065f0b4f55be48cc857d62bc40e8826f267659aa7baa6ca81c37af5eb86756043cbde8d08fda9505809dc92cfd8e01a1857dde52df6677c40d98f4577c1659ca7d3e9f01f9a809065f51b54fe2f9723fe2c9d1eea7397f2d5531d1c51c6ea100b028596bf9f24dd90be14eab58f07b4f24a35b073aeb29ecde4a6f320237d7adbdc43d94f87e08866b95bbcac83dc7db3553a42400441f088e2bf6259539a2da8b5a74065f15e31366b4253498a6fceafc21d3cd610c09894f1b8d273d3cab8e04322549947f868ae688b36f32f4c3856155108bc50a8e7808645cbf620799d10f9379e3018498f2d2578e05fcefc3b34c3685e4940757dca14c8c756c6315ab94c7985e0cecc254116add7e605ea57ca50d576236cb0cbd011c45d1c418c7257c14a9421f7eabb78d09c960c40a10e85422b18d141e5423121bae5cd0ee5646adc3d415a103fb232d7c7a3592bcad0042bdb9ec94c8d717bb93f09df9ad6b17101b4361fa445ca1d90a1784313a24cb552697071f903ea0e4ca321ca71cad9e8d661bad9106743779fcc8d6094c1c5176a474661e3f31c775099d624304c5e50dea8782d014ebf0f69ab7b282bc3d9b8e817892f79d5793579859f6332d5af476f1ad671e356ad1362c09a0045130b08303ca121472590c70bf8d60e15f15d1b2c1b5e4e33099e422fae928f7d29d993f73936edb86de3aa9c66229b3629e86a7a2c88188ce1f30a24c7dd3c3082b5ca819fa2fb6a18f26ebf4ffd813fd9c1b3fde0ec773d7a5bd9f69ed28d0bb8303a83c28dc0c8a14d71c938cf568fab79660bcae3d0d13d294ff9a62b087b24d95262544fd440a145525e933091a1f9801f483d06cbe494fbcac2704f14eb7301b091d771ac8e938a9ef3f1a9b9135e763e27c9edaef43c33d8c58fa758e90d49c3b6ae9bcffef27da61dc693334034bc512ef3d1106c7d72089746dc4b006e220a354c16a51e389f0620a49596d536d2e6c23d8996d9e336c8ac584641ae102b0292528ad268f08f4dc0fe296a4ebf5a6d86295f88a907e29769168df36e9db52b523450ce6b94aedb6345b713f948a363ef29cb8c764605f372140bd6be616102f98410ff92af7e3d8c1dc73a716d4e4861c16608be48317b4bd3584209f5af27fca433ec8aab8de2afe8f2244397dba98282b793dd68c59d5ad6fbebfdd50ff8e027422b90135e793329a097ec52ac05c5e028a4703262b823815f2af68a03f4287fb4235f61505fea725adbe8185fdbb06c41b1033f797a3a74fa95808f1ba84a30126a552004150a359986a3636799b6798b5002da7a42042476a2285eb793d9cae576fdda0a2726f5d51ecace53ce6caa7df7fbbdf5ae15122bd75a6378353bb295cfd5f9a304c535a60aaab394f82771921f5a347c2cf1c0b2ab9347de0b0489bbdb5a099f3c696784e0efbdab959b61503caae86e3d0eb283a56f864993a8b2b03016743f4c982dea17e63718251cfc30e66a445c6cd05a174b4b795b5dbcb02b5487e403a3b5db5e464ada6b354094cc9324d2b71afb39f613b3cb83c7a52475bf1ab39cd0670249c279f205249aed8bc9471e1ee5c3d4a87544e7437fe66237e66b7d6b6100354532f02886a17048e70f5d70e45beebc97065b471ad5150bea50e6abefc435e6d90e49d8500a854976cbe485b7cbc0445a4d83758a65a583f58518b9aa785c896dcae3ac01ee3e51b38558c6f9d3dd2e5a9139fd12a01c5cf1f97e411c0c08bf7bef59fe0cbb001415d246bf4af2b9bd20980b483422ee19583483bcc4ddbedb9be21958e10f7ee316291ad8fbb6da8334c853d17f5c9f2ba0bcc597259be3704649ae472f4a0f514cf0619eac8eb4131f88c04344cba4165408c06ace951b0ff39c854337f945e122dea78adde8daef497fccf834de916bfa8ee0922077ca2d3c414ad7ab9b9715203a59280053b36a3b03d67ac023fb9f0cd5b2c7bba2753a78de4b6eeabf876fdd99f2f0946dd2266ccb7945673a2711f373c35600b3a0ca41da138385c3ab43a383f17f3a85bba6772d21d29a7fb87746cf7ed78009d15f2fbb4fcffd4657432a6ef11e4349d46cb2af6cccfa6334318f6f61c6ca438b6b8af83c7ec1c62fe0cad17e784f18b0ebd7d8b67ed7830ed335d9f8ae3fcf3371fc27864a73b1a9af1d51d5f7de70e5a63f1f9b72e26dccdec275cfe8612b7df4ebbfa99d739749009a56a42741e0c71e510a88437b61e2b6cde9442fded6af86d227030241f57277ba56657149f6e9c6c620096b333dd4edb09ae1cef95f6c8a68044ef38f4ada8705d796802711d23206e6ab448a2037f60311455041341981f5cdd9fb8c05d5b0f560c3be99c004e28bc4ca89e0d770623dd2db5e56e35af003ea3084f8b4f888117859a6f29fe64acd40f385e7b212b4d9561033aaeb95772aefef1a35e6b77ed284e4b3c1f01afd63f1c2d30f5e93606e21809aadcb4d69d3556235c4099707c12cd16f986f075cc84da4ebb82b76e754aba8ddefe1075a85a1367233ac1ba565c6cc54e66b2ffb62bb065a82a731cc357af587e1fb47cbba69d83a053cb9ea28e921ee2c83195bdbc08389ef50588179160323144883300a05d3f7a939f648931a6eb5eb3547f09c0499146ec55fa9a7f33e29f7774e19cd0b9655902255432cc12f269300304c1bfda3648164cba74a9913271bf60d0babe1abbe7a946b5c5e73dfcac46266d0d3f25ef4b7cd00fcc97e3e84f25344680f3e90bc98fe8d16c0a8fd0cffda60216ca9186f724ca43cad28fcde0afd88c16f68c1baabcf4ee4dbe7038795d690b04e786c1f618239c98e1ffa9cd6734eaa54f6db330395355908a48fa526f58d0ff1f6c6aed60c1635b4c9944bd5531a75587f29d030deb4e5ef77fdf033a5b992ef8ac4787028edf3e9cc7655980b50d4d2585a0cc40a620df8c7daf34c65badb9fcac216a08715a6658f0d649f0a962b6b18d8333db6b153ad1ab328c1c3e55c9b3d5bf3e79511afe087b5d34adf6efb7b3720fdfe52173984e6f2fb443eed986a48febac5e18682c34d2c3c3c082fc79b49b0c7966b283208c3270544351811757436b5bbead8c18655ccf9d3037d1243c7242a867058dfb125dbb13255194a4545708f5a1f8ceec22814b6a05fcb5dfd15e7815ee02d9506856d999f0d55c5724358a1f10e176cdf4a9fdd447b8f2d2fdc778680691ae481787928facc41f564e43b9831150cbe5623caf81ff55ce2647150848b49a560ba656ad9d620826c95aeb5dc9af2d165cf4a2271935ba920337b1f15d020517c09d2df46a1988b9d9d0943d99ef609f5a32442e45efcf85905601fa50f7ba3a8f85732d9fd92c20ad39a52299dbd1ae06a5888bad377cf1f62b6eedc99ba206a1e49021e3aadca26f1d88d4747a698b88d4d708f814a91c5c3f61916ff7a3c51e45ec98df9580884402a41bd0d40e7e09479a6bce8f3e4feb1840adeb12a6bd2e2def5a3ba1001b567261bf56f2a9ceb187377dd9ae23d2cb40740ae4f59438f726012e9ed744a0cdf42787addb23c4a71b1806be7b41ed233f667003a6537ca4b78addb03d3562d1115e3c7d9762a8148ba3ce28fe7ee81b9b7da6f02fcdd15b69f2301adeb9a8884f6ea6702f50c21f60429cbd3ec30addde20765297e88144c2a1ec84bfb9b91d39c08d2caad459f1215c392543f99d8e8fb9a6d2e78ed3894cffdc95ea1edeb654bab95910d5b6b156586e091506e75937afff1726a60e4f8f75c7f666ce5f7c2ac5f2a06a3d228888a00111bdd431645d6a49ca5c187bc11269744f3bb38496424affa9bff3e39e3e9bbae44249c2d789524c9292cc62045d44ac4772b4952c24afa91b17df411a00b1632bac4fe4db44cfcf18cfa90b43f86f378611b8d968595eb89e7ae98624564ac28d03cddd9814499c031b99bda46c50ddb523a9997068bdf4dcf1f9f8e6c9cea1b350aaf635842879fc7e84c14f3f51667cad6e1d6cd936247a83f7e185e0a5c6449bd077da19d42fab0150606dfcd99982b9efad85352f122339cb872c2438f9e9ea26a8b15db586b7abe6df26284f3f704e1491e20212847d195d33011bed044a4794d0dfd73345c9852e89a14d1d20ed75c510adcb4643302e952c2c4f2dae0eb902398f0fb736889510a507f2aa04a235ea730b153317e57d5cbcd64861bede495829e78ea71f9de5757a7fa05eb336966b03266a41c744109829278ceffd61fd7ee90fdb6dc9af7d435132dea1f452a030052651d81df4ee33bc46a5413340df5dc1307e6ffc676364724834db919e5c21c4335360df9e1f13bd5c1bbd2722f7dbf87200177f6da1be25e82a7450c1d1278773f741d6e9ac22749074cda3b04be1d8fce8cc1c683f3bb23a49d4fa6407289511c5e3ca7e9c46280b3ad86d92e658a7f7bef5990043c260671864572e070d373345af8304f76923f4f4464e6fcd26ae8a0bfcbfdeb73a7997208a2ec8d8bfb502000bc824c572ab742b7e0eef0a3535de554856aaa28d43f1e7af48d9822557a57d6062860f4909b366ea75bba36b841a2741260b0da2079ef73c6e0a0e26654444171ad1ddd685d82df14b7ba3b2e267064ff6aaff610cc6d897660383ac2609de96b6ad3501660c08fb57d60ff199ed7cda902f80b29c8f102af86be99ee31ad247fec421b2f67680706275f110efd3104aba41987dfd24295ceeeb49e3e49fa891bcbba8d17b3f1cb9340050f62d424b073d8850aa78abab940f2aaa6571c1e9dbb63dd2463e8e653c951e358d9a61b379e1aeaf21554d1c3c22d1140bd2a71c8fb5f0a8f9878ce2624d77a7bc8059d2096d58becbdc3106bbf0878fbd4e7bc914817c31d29e601b9323b4ae6b2551301dab30848e5580f07941f524632e6278d2e28a76baca349838e17d5282d272531f61de0953076163dedcc2dae6bb86b231a0c27d97542de2b74d799ceacfe4c575580a55033bfde6528b97ba2c3a0ffe9982cb50538475807a3051938964ce0e89585b7184397b013d141cca1ef625e572524ef7d4a234fae751ad4048d958b4c1297964c049043c0740f814a436eeee24d6f27804f691d9687a33a90f75ac4187920d369db3c02018d7d4a0a74195a117d760ddc9c8b5a364718ed8c782ef3d425cbfef05bed634d8a157740d604086b31c3f2e0d5fc8e343ff64d556464c2e594f3698dfb36f00b0662a9ac0db1826616f3871b704f11e6cec5ea6a60ae99e36331b3913dab20d06edf41aa6fa44088796f3b0afff58de490023559e15ee1440d015d8887bc8e243ff5efaa905ecb48f5a17f2dd9826aa41035cea25b18419dfeecd7f28ded808d0641044b0433ab3df834c402917830bbcbcb06b2524d3347b54ea35da4b0b0513e4b100a2fd548ce1d93ca17bc3968822f4c8e285b702ed7ccb1503860989637646e934697b62c7fb248d1dbbe588a9dc734b562db239cc4b1bf6ef146179a9605462eaec058ded972be7bcd1c580f65001e2d0045da25a4e0c34046d9b036039d4c12913e3fc851cb7f387a5aba7f8e7663557f4ff621eee65784777ff510f688fb1fac65cd917f29058851fdf25360969ebf3e5e2a4a093f069c21bd4883e574dd863edb9492b817ebfbe28a821381fd4acacbd4c8e69a673b07c4264d3766dd6de6f7043764a3049d03ba650c3878f6d228b658648008db7f47dd2f5583d12f16c23373f88fb69b83203831d35aac3fdf397c5d8fbedb284deceb5d03f1eae682a892bf8a7c794948e1ea5589c29214bc7d9c589cfb97ba21676d13db19ea901bfa832b5f93517a58b95f648238d132147574ee3ebeb52d8437d1083d6476c85d48835bda9cd5bb3d26f5c37ef5d00451a1b462c780b9eef0dec58ecd5a05dbb10321d59dd17c8860ab4c16b2b215080e92d97ad9da2c7b01eca93bed631e56d1cadd0d1be9cc7e5dc6d0c2dfd626a9a5c9327ae833735e01b1fa84203836d619f01386d73e3be9af0a125c58da6b85b1a57e07751524f4aaff37fc0821d5b6042373c752474166bed58f47b0478a18bcc81a84f307b7fb5804f00807b871832ad56c330fbd838217c9a60978a5d8df119176980483b2de8363a13c9174a0d9f8766b7e71d968a844470536046dfe456aa230a50c019bfac7abda0e57deda16f7870ffe2b536765beee1b51f61850f8226ac7308c19e9ec9f4df8f1ad7f83b692a7a8369e941637021f66c1d03d7743d36bb8cef725032074ba8c8b14af44557428f2bc4e13eb98986b6619f525e7c4f82573d4ffcbae32e272033f1006826ff6bb4df3ac6b5df6fc4297cf079a18f7fb1886e6e86611a053250b92421dc46294bf38714c02e3fea8457a6579e2916966c56079639cf3d55113f4090d4d80d9f8a530b9bf63240c16e49c51bea7c775d5acaf00d3d8bb6e66ff5b17f42e5e328d1dd531491484abe2906c28584241c9924eb111bb91deb80f27bf537938a308bc89747cab8f9c5a75e9686dd94a96b1571c2520ad50e46eb42d8f201ee505c91168bd00494cc1945b402f86b4491ce98ea559c20bbe42dee081492247bbecf0263c1d4094d49af60d451ff76ba66ace937aed5a7902a0a53ec38bcea645cf1a6593f3c220af8edc0658b85481eaf6dd1ffd5e7e57f6544e0954b5899ceb22b449e0ff197f3623c2c10b9712799f57818ead0b823ad1f435eac554d7ae349e3a6da39dab0320e056d7de1ab5c53bf3786a2a932a845df6f94d85f85d5cba88292b6c3deb5ec84ae4b530e1a2e739511e2cc683cbe6d2e304cc26fe7f2ae5771d1d9b7e7ed4c4da18e3b45a8e721ff6ef61313bdab4d93ee4c12905b18b3df172bed1cdca177f044fedc903cce8786b6881cb49fb80f96115d6fc7c99002c7db6797fba41998f50163dff6be2acab152619252c92dd8bf0147811e19a3c497274f815b299dd5e53f84eb8017441509a8491bf62352d39726d2f19c339621d862a9534452755647652aa9342d648e1521085fa7956e25a5e9c6674900b44011f33eb4bf07e844a3dd1dc01ce9d15d5d2565086d07cbf971b0ea8a2e66444aca44d64dd2303fc7820e25d94033d5ab691d29bb5061af7584e40703524e8d668bbc39c688b6c3066a600a9ca6f4b6a0c26f1c22598b63c165eee579bea1d8bdddc32ec6e67fb92ae63b93b05812bd63ef8506e58f6d2f069c344c9578456d7747c17ef5f6746c5a7b078abe5e77321d78c6afacfbf05a6cb22004ff8a2494bb521ef1fdbf7d23bfb32cb56dbe095df5e699df1ea3fa2e1a2e19d45efb2595b184434f83498325811512dc6682b28514bf685de39174f1399886865bd42fb782689660329d6cbbc72922c951b259f4a18e9af2a4cd47ecf079d1e09d1c2c44568380ecafc2222db978c243d554e6f0c5d89766095d5967685861abcddb0382545f6abaa5c08bc381895b119a7240c2a827c681b94b94aac8bd9eae921a9cbaa583ba93baa091c544e456fc491351b27102910a5d9fdffc3930f0b395e0df337077da3f96691b7a2d1219cc8a40000749f25fcb9c5f21a7e33abf807d35b437dec43086e223102b619a0e490400350b577e998a1f9544f1ed6273dff321030c17f1263046d65a200b049c3a605bd804c42ea5108d482f23803174959fadb4fb42862204698be0a151d92a694559d23bb78aec258f81ca84c32e2b6d28e0af4c880b8ecbf44a8af65ba0229c5c0309f8591bd690cd47fd5edfe1fe2e37c3dc471009d14d8e19406652e1eb9c4d606683d168cc1beea2b0f7fbd2569f735c233403085352e002ea3a5e25ed31bf78d12348f9348c9b9acb99408a9c8a85b56d5a888e7ca2920c70bba6f290225a543321e65777ac7b38368ad69036b514d6a002c825b4044b3fba2e53d33c39c7fb72c5d209fe433783da12e46c8ee8c9c5a674ea546342b3a4b1de8c4d593cae7578573597301976849d7b92a70aed4c8c65f817a4f12273423b127aea4ff4b6cb2b1f368a74f5e141680b0ac8148b4433c7d6779bc66d332241114531862988047565fe6934a11fc4240c7157138959c0b35531c34aea9a4aac2414aa67a3cc283d70b4bcd7e3d915b7c4f2dc6fb0343d10be6ea4e66351c462930fde582929406b89810cc584b73a0b7cb2e08fc87db1c85955c4009e00984da66054c2854753e6f88ddf654c603d067bdcebdd99db25c26e0fad02654ecc54a52c940e7dcf699805ffc021027d25920b9683c0eaf7a0e645c3e7527ee36a5ed79e27a2da698a68f800346070b5fb96720832a084792a1c269af85ab168795585db94e863bcbf3e18b7c58b5cb1c6f9f95c7fe63008cb4c58bc6a80c8850220f70e6346e2710f02ae4dfa -MD = 4da010129dd22d2daf6da3a9c760e3ba8a68ccbed9b59c8525b84ad72ec04be130042794b8c03a573ec41804c9de3eca - -Len = 76264 -Msg = b78acb49bd88e0212f862f96ef28e2f5a6c7fa0f715b9f3cd79eb4a0ff6eafad1f73a8e93803aff2014263bf208ec128a01a39a9a0d80763489dc06302802b27e683535e7575daf08b16903e8f7d44abedb7db5bc6b19f3be657d941f6fea1f5f2fff530dea50923b54ade9ca3bc168573e607ad4bac0ecc971625c143b1b81d2d32b5e5da5de39468257460c315ddbe1ceee5289792fc1e4420cf6b516119a97e63bc07d063104a8af07b12594e425fcf199e53122a133ad6bffdc788d56ca0ccd9311e2a80394d04f41a3bcc30ec6f74ad5ab7253ef8273338d85e51d7580b01dd3db04f7c06a6bf767a62848384f6f2f340da369456ed45d687b7122d85f104b70847a71f1e5ca2c1c20fe90fb1fd33337946aff6d395f2e0325a34a09c5abdafb96a9a312a77941c1bca639b1c8a1eb52c83f62a1725249d03d020f8454f140d79a29079d1007fcead1c5af16ca89bc0821775f8cba8c25620a03dfd27d6f1186f75f1c0bcfe4a209f8c36d74a5c929da38c922a9723b454b152f277ebfa3c19c46d25ce9279dd5a1aa35f165eb0eb95b66ab78622a0e2dcdf6fa92d38c0dd589f12946bfc7a20c445e73d764fab8eeee4374bd615263439d17ec9e8b732bc1d29eba75fa207fba549e238bec65564f0547db6e017be92b1b107ba701057c2b08980c4712b2b56474d1cb9b86ab753e52fc35f6dd16fe48ea492e38dea37d558e859556b40eb19f07a1c262ae4d844139c92b044eb411216d4a8ae07eddbde5f6effc01388512ce9f86ae9dddbc120c3c471102f0c3c049269d082a5c24ac60b42f96f32ac64777aee8e6899f878cd3ecee8e7f4dc69a2498b93c730118c73a58dcfc88f532ce2ea84100d25e30735c9e37f9e5c05cfd5856078e67181aacf74760a35f426b25683e4793f4b43753eaf2bbf9b2f2c76838c1307452dbbabc1c226311c27ccfdb98b335165d1c0cbd236cd2f4735fc6795a8cac84d2f679730d5c5cce7f1ee15f54b9c1ee9800310d8a8f2580a351aa9f41ead44663e2c7706f77a63fd1a3403f00b456a3220b44c384bc1c04df931448639e602f921b2522a6d6d7fc66a45ce941356bca8797b88da6863f17647e74135409a8a6ca1a2308482c7a7aaa9ca7ec7aaf89db352fecba646ff73efe8e4a7e87af4652986a419fc7db064119e6a1c73195294bb75e81d842fbecc1ea4d17e8730191a96985f167aa54f3d6312ceaf7fa98e2928a8df865c69c8866d4256cff9ab34311d9e7c2ee644cdba08cd9e3fd39fd1e462b48b0f163d4428438c1aa128306b332562a26a28a05163699781d55746464ed16196bf9af35a3b0748c6fcfb0ae6a715aa7ad0280104c1ec381f77f3e512eede76a59fd0d33446233f01e85a7fce15573fac6bcfb10e5bfa7721308fc3604cefbd63b5a025f7d1fe39746e2dd94b0552e9df4003f796b9fc1d2f05132956f16efc750bf330ce6500fec7955c5e84006e6fbb59ad1ac46458f2f000675f1c64c1fc86a9af3ddf899155a166d057a28d139beabdb663c1e378be0d2873addb2d52853c95be9452c51907aae76f0bcc35a9331174041ab5bec2492d85205bbbd5875f3fd9067d50a100dd8b2222c42b7f9800db878187c87ea05bf92054b0e3e3ca51387d714001a6ae9cec1fd2c8e7f349caedfd13f120aa79bb1900f8f57cdf8224cf87e6248c5b8c0f74e5656127192259f2dea4a2e8cab432342df573ad5216a0ab014c72194800fdcc7cc5d4137a8c7490321be04667bb88f2b0316f9fc3f08d75f28d73d2f6732d9cecd86cd59df0e56f0260f46208f585fd90963479ba77b3d463906cddec4e688b3d8870920ab47238555b266535caf0fad50b0964bf13da715b3da862b2f7764178bb27754a42e49334f4bd7776a29394887735885b2cc9f3e27c6e8ad1d81f67a55bdaa3e4000227a61303bf54e53471b0c4010c152a49030035057cd0572ba5ca4fd2476058969db3a03e6656fb9c3955d9b51976762249be50b66137de61a2f17f548747b1669c6383b793054d93957f9e99d605761c6c23b5c9618fd48a0721d3ab8b20723ccdbfa4b66fe741e12d37fbf46c4a93fe15384d86a35fa16e7b63331e7c7305ded8ceeb822286404da884d81002cd3592eb04fe34502facd5a7be87f482c9d11464994165d36ab3a0ae6f1d33c117c59e978fb11d8f885f87323ab776c4a83ea819268ca5ab1900a2e9ffb2a6d1afa9ebc0e14f8789f0214bc5dfabec6b9bb460a17fb68bd11d911bfe3c7fb1591d4b410f03bebb66f15beb08b64c9e9e279b06a1aca55f6dfeccd3982e6d9b81ea12682cfce8014d13732da2c680d386d65b60c4b34369a9421b925dde62ae739d6527bed4b3a066ddd2da3c1730d44b2f5c37af9e76f0ab73e51ff553473054beae476d9309e2dad7e0ba7db245ea14ba07520d75283e9b1891430995056a4fd55491e342d10dd18905940e9ea55b0900c27b843e4099a2ba89c641ad82a4896bbfcac5e9f36a727caa3196e33a6f5488f678bc03a64ae8e0347044a2a8262d0756bdbe8e5641e637355abe8aea701ada0c125fcb42999412fa08bb7c5e3761328331743be4da554210d52e9a9fa4867f6a11129ffccdced943584d448b204d73aeed8ff7847ce626a16a8d1b4055bdfe7a3d7f86bc30c0bb7726a301192a1b523dbab8cb1e71c16a52e38416b5c9eadfa35e4e886a088f42fe3b64bbef9af057996097bd9bff0f968a07ba91e64833ab4c3b27adee9e66f6415f397af5bbf70b2aa7d3d8e16ff833b09dd897bb1cc0e9df9db0fe303a6b5ea659ca4713d455f558571421d909a3c82e6e852d1c8cba21c34c94821824c60296f3be29312c359e8c3704a26b1439dd6b426a5df1df49dc601079418fa3a06a7af3be29370cbd8c2c10496280dae1facfe02e2e225e94a01eb108447b00211fb822714e0dbc1549a2aa8b69fea1c4a8c2127aa99751c4f865f6e892c68470a8ba4880a09c84665d54cd73c0cfb2096eac9ef6d4380000699da8c1335674b68de62d9227caacd84eac41a86ed955d9d5f54d49b9eeb2717d2e8f3d30151b1a57a69850ec807b92a610cdd37b06d15c6405e71c609fb03fbb80730290e9c0c58d615361f6a73abdecea3b9cf03c70b9a3453416cf344391abfb1cb85bbcaadeb77e246f4d253280a9a151aad46578191a1bfce01096b18fd60852089a75228e5d67d41ffae4a804649dd8a62f6832a352f006212bab4263c30ddc9a54fc70fd08832b1b04cae770a5469737092de680d22d1b82265d4032fa7483159139dc523f3af00b73c136edf50458066b9cdcd7223803ab0b93f12704a30f215914aeb68bf4ed9650b0dca3da3fe1bb5c9d5bd1cb7b8643e2359f6768044867b5752d507319e865a27e22b9de5ffbfde518ac96545c6bf3b12a901daefdf58fac44a2497f11aa207115505889cc6e740df5184d45457c62825c0c6f5ff8e041476955c83745fb6ec55caea762ee02c9dc1ce51f279d7f385cb25d85025ccf248dcc8ef6241ba2f7a73b83cff12e7fa45a755b3380cc3d1f4814ca881f918be0865595facdfc69641e9a19f7bef2acac90e9c4b2db3a7ebd4c6a9aa03fffdc1e3aedb1fdba51165d3361b64852a3528a855e66c3bd4f0aba739c16f4e90e8986b27a2c2774807289ed78a3ea34aa39e641bd8b8fb073a8bfc29386ada5265cbff5e54c9f82f3459154c82804ec6d2966cdef793d3b0e2274433532f2fbaf1b720b175a8e6c10571c70378cbe0356eab530db78f6e7883e80fd6b61ec74118f46fdf79d1bbb416fd34aae194100cc43797268d2e23a49c58cf81e5cc397b480e4d26c5f6ff6ed575ee91615b56b36fe5b9c80cd28beb97e3f3d346c9eec00b6f39260e6b1a57bd5645555c942cdfee102b50ab3f1fb403342d397d7a5fc5ef81c45ba7c0a5155b28d97557d0eac8bb517c5edca647847aa3cc22de5024e340f07f46267a281e2b583b6fc794493454141d5135baabd34acd613e0e0da6bebc45ba73fefa0bd8aa8ebba34040a07944f29eb63adea527101b8cd960e58d9ecddc0643b5e2d8db55170ace4678892e0a57612c50a4dc0647189f839b9a1229e22e0353dfa707acb7ab893f4ebe8bb910cd14f21b8fb8e77c4f19db027e0cd685d60212e0d920b34e96b774bd54f0a0f4ce2ac5f001b4411c19ac2e3a03b63b454eb30f4ddbac959673260d370e708c32d5030682ad56a99322972ba6eda6be9d0276b78b3113aa0bbb5577303d83c1377c4e3227e538979dd49b21dd8e66d6e99bcd9a2d6bfe872af9b6313d54a2f68f1e5ce7644ba28188aa08cf42587f2ad7753835b90eb5b38098c8d9b2f64672b655cf84cc335d0de03d607279ee4810d32946f8927bd19589232dcf4594e6ec299d06a8d44e908330f942b9e8b26a2f69126a715e45eac3c123258049b31cc9755ea2a1f0f01587f758201423474ddd05eb233e80ff69c4a513709b43d350710635242ec6ca3482afe4790f9e0f7bb045fdf19e9f0ac6fec16e7f8ed8681a9978aafb9dba3f8619c728be1acd8d7c3f85d5663ffcea9af892aea2c95c03e3a9391a998d3fb272a3e99f8fa44653b7e151fbe1914f315e38856e9ad953193406c41e9e6bebd582c763a34e5a7cd4b72c36fc0410fa5179453608c84d621a945896217ab8332b5edad1fe7aabf5831296b1304e5d72dd74951107ab83fdaa7d054bcdbf00a9f63f74c0eba4f7250122b73d4310c56d37e8aea305c51b7a3b66a3416dbbc3b4f8dd2b9d054deaafb19fe457aefbf73de34e08686d95828c3fe999139c217fe8959045e2d5f5e4ea36b2c47cde805169820d18ddc9ad47983a6e8d4ee36093b94ef17a2ec80d8468e333de395c1e627476be767f846cd922bd7dc63fbdf9bdab97893ecd761537a0497b78099256a8f343caa7da2864b5b03b8ffa72867d4c3401cfea6b4aad7d24fbf2485a2ba9a34a7bca135a40257bc5272d8083f73bdde7102e2374c036d36b6d40b5c78287dffe71354f8c561f89d622cefef06ae5c149353c60767121b8e80fef56ce3181bd83e684b2fcc4c37e6790fcdc247bdbb4bf036337ecd82ebc2f664691dab327da8f2e30f40826a1a7fe043f9eac84be26cced4b00445f9e5ba602fefd7971daa554cae2795af64ac50dfeffbd052fed7607655c501981f105e06860f027082aac994ee1b941be1f241bd3b5cdbac7ea40d30e0fadd8e9e74972f925206fe0886ea12ce74a78d8af63bc450a372a074515d449dd800ef1b194b247b3f4c095845a20e74b935ce07bf243a5658fff488e437f9b5e6d2834108632e685f3a5919efd8cf0872a6a7ff55e6687404e9716167829850acbc12b548c893813839b5f48d749eb32761dd1ac16796d32e98dfa8e1286995b3246322e1609bf054b2e791265dc39c61d03b010a910c9b5e7406045b10b4ad82733f2edc1590da3b0bb597c27d86eda75a885c384a11f31ce5ad1edc22c1c0a2126e8140ceb86a73aee8af69bb2ecb82678bd2547cee03f1539e9d6c46d7f59967b8c415735dc58601488024ff0560795f0d0c640eecf464269f2a13644074f1dce59f63ebc516fc6e9cb3fa3151d414abd6b273e851eefec6796dda64426631d8bcb9332038835b5baeeff43a5b4fdbb1ae6b86f26518459bf40dc82e26f3e2c306bb8cf900342d3244dd19006bf857da5ddfa714729bc30ed7b3e6ab34428b048b4c775e6452f95a2724716cc9f70f8eaab7dd36be9f0085ec063bc1b37cb4051315fb37ab05483b1f6d0466bc758b365f9b3140924b8369f9afcf59edc8e62d66be206c1e74a13df360dbd78d9a54384232a91a36c7d423c755aa5c284fa7e44beeeee605c88cc86da4fda5858df1fe1c2550acf23c7b191ea1d5b0ad3882928c4d6e8ba828914453e272baea77eaeeb41b2bdf0ed200b5c53b573fc4acfc9fef84a7444ebd39196ec143fc047fc872d4bd4499d1b0ec5e86ca38efb4d39f743d3ba1fa40af0baf86ea77551dce12f142b3a2c385ffc77b27f680aac7d4f2773d196593c725906f630416ac7b8b50d3c7a44d4670e617767169385743d87d11b9c7faf929474ebfccb829e867df0b7f2b394e08da8e66b62cc868de7106c9aa77ed6812ae3ecf088aaeb6f329f2c95f3619acf30d1e3ba320be162799875dab4132b8c8a0329bb3668dc8b409eb15dab0ec6fee50bf1fa514f14c190382c17add3ef101454a382625fe64134ff27458605ca0e0ea999924d209119ef6207e8113ba1ba7e7af30cb92a894f8423170410f0f45b324d3318820af6e9dbc891b27ad4e3fa1cc890b0974345f4b2bcd90fe85ad694e46966f39c78b69ff9be420d371a164d73cff4f479249cef452f15cf58adf11999809dca08f440daadc5916ef295c9231813986efb590e7dcffc35d8fe64d477c6155ff233f825f87c61284e29b26d197e2603768a5b0b4e97a6b1a34609e12dfeba1602ba1ef697ea334f21490a82af1a69ceb1a2a523d040a121c4dc27a7baa7c1688217b313278b9eae8edcf8aa4271614296d0c1e8916f9e0e940d28b88c55ddcfe6b96f0c25b525aefd5227348217af179c912bba0058dfc0b7759764318d61a4a73bad52211b4ac8e344f0b1dc81a5a639606d28abb0f8f0a581ee6b48c2ef8f59fae87598027094e721ffb2b023d78703cae0a4f1ec6c06c4deb81e207af9f86593caf6f92f599b6f75aeb7ab82c732723d20cf818fcb8bbbd86efd5729f3785082af56d2d64834e2bc88213d3307211b33c808d90f79e7e10b8d995b647e77b1341005a3bbef09e773069fd398f9db455b30c146d019b3ead49e72bb9efd8efe449793ea349072f415c4840d4911d9a6ffe5b979960d782fe01c09e65df3269e20a07214d4ef188f212c6e58a801a4b6be6131dfb5c79d26aa80df6a15e1c71754c530c2114d531f31b8bf245a2bb4eaf33ddaf7b3faab65905753b54b5be9005d6050607e5dcb3ab3f4072ec41292aa5ad6054014f91b733e1a176682d414dfa71c418e7072d9581458d6a67a38c6ab31b451475d6575c610438afc40ccd31bde53849a9c3f25fdff719e49e100b93434733f7bf1a232e4936e3ec509a89c3b4fa0aa13561509a2c1b8de779d2ce2fbcf7d306c8641eb4543f4a37f4219e8b4877e228732971cdcf7a907ce030fec586f4cd4876fb6f76eae6149798e73411e12667e74c637d8032dccbaabb71c3de0906c8c6b22940fc74f4ea15243571dee8cd42e5a6569b3bbc09e579f2de4401acf46c866534b6cf583273b780538079c3351b2a6b4bf487d5c887f16dbfaab6da8862927565fb76006558879589876adc2698bf818ab0ebe5e2591b145c1c86f88852f2cc043779d258408d491faf3a9a6864abd25bf6f0542002fed0fcc3f76fbde3ac5059916138d2d4d0855c1f7064c225f64406ee1c8b482ba287e8c793a7efbecaebab32b4999abc58328a0094a4fd84a9c1d2c2faf0227b1022694fe208e68b53844442fd5d799f2d36ef792ec1e128cb3009970fec789b4f8ac5836bfb69f150026ae8c1eb3725587bd3b3c72336ba6478f198e5e8103267a5448cb6e64298c84f664c8aad9cf7e0e780d5e632c4e17d83d2ea034ab3e9615d30924b323729c3528097df0a6fbdcd643d08145653461c38f6b8f17b29684499cfbcb348114c4af3fff1496a7a1e27d95174d8f7aa904c7fa42838e43a5618416b33758e97a8631a2d814f3583c3f72d0540ba7d9268124023625fecae5ce63c4a1f196e93e619af507079d45354454aa1954250d3767863bc8feefa4c21b574b4a7274fcbad719ab1e54fadb27817176d9af9d8356185d1b7d76d78dd4e8dd0f3f3289909a675c398095a2968d7777cb078667d80d241705c6165cd298a76384e2ca4b313792c134c0421b03c1a6c61b45612a87b70b529f2565e61f87e79940c7a2107b1cd9e7017fd2cabf7e9feaebf5d83bfefe4e8e5c3ddde9c12d19dcc760429fcad4ad4c33f1c048061eb364b1ab4432ca4d5e28a151f6fe63f2cebc9d4f343face99d5f50d8b309942c91b210d85da5562ecac01314498a7463769716e6ef869db62a9ecc96f385c622bb616dff5cea4f1d14d335f73e247f09921ad8b9eceb29d4c5992bbf3a53389b70d13da2ea97f182bcd07e7d4d32e05fb1b6674ab4f3bdc00ecce2b3cfe857e182b014458f250a0a235641090f5c44d045e8272bc036d5f266a876075cbba0af415c6669a327e52df8c3423cfd0728f5df2ebcbf971b0f065dca7a3c4953af5f4d54c881df071f48ada5e68b8ea9e95addf87c78b216d556549153c51e26c07bf7179f209b4914e4b28ca2774cdb2259d2d40b09a9b0a57cfb9b973453dba07fef437eb8507462ac87d60a82a011408d5e5fccc4d68f1be4b347b8fc82b8bbf58636dbcb96ff84eace10832030c2e06fc0fa565cd0f885280c343da013648f576c803aece760f839d5caa0f277866e6bab122c1421839db176df99a19e55772ff2ae007eca4f39143f72e85bdcd2672b9d55b28d30c6b20b73b851838c021fe9c92ee0f3a800c4048b97cddee91d5709e8238e4a87185ea0933cf9c84500e60f5071410e192c35851ab7c5fe14edaa914c1a13cead2f101b560c06e281c8762b1913a5009627ea009d31752bf8b9fe5c1997e77c1b4162d62c73ed54aadf2ca78384818d879a6e1153b3300afd18beb4d12b7de54a15c36b872321b1389b861f40527b0795ea4e320ebb9afdaa70685613434b9cc202be361688586aa3a42efcbffbd601299de6ed0e992a867957879a508de5050baebfd02b11d5f3748f73ca52ff370ccb3be4acd3fa4337f234990c0959bea09f5044c4656e4ede4393e0f2b9bb227ce33ab3ec0f5d9974adae2925be354d01f5cdf98d25ec17ad7978132044de0cf41a10d145111181eef41a9471dfbf24bb974e2a951d19b4c38e9276bd94d66ae4c864b92279d480e97e10777afe45ba1ffc7764769b75cac30b8988352a12d0c1868cf81eba053b0694065e9b8a6791a1adc0439c219ebe2e78b3b4216531c33ccd200a84423204c8ee82966e14a3200323bf24805fe303684ea7a6fce6b1a6a914946d1db2d972a2d61bdb6d2d770996e6da93cda6f13f02f5dbcd421ef11f88f5709c257c6a0916f3187a132551a2ff7f992dde8737c57126d6a37b8e9e826ed83b14462f623cb7ce2f1efa9cd1808f56714f2d81253b452a1ea613a60873cd455a61fa1c6081e7bfc6167e146526c8f4096455154804f1a82a51a505dd6826b56511bbe3d37d3940541d27fc8afa5ed0a829cfc42eb7090970329a2e7bc3fdb0d180061649931f187f8f82e5b1afa38503fc081e37d5fdc686d58d70624bd4b03649531411482b709eea1940878b29897357987401c63277d496d98c2f342e4be9ea3d7df910c11148b9559d6b2163469cc8eb65fb1c6995f00318c241217cdc82cf2fa43f919252f379b26ceb06e354d6cc9b84a25ce5995fb6c5c3369842fa9784a437732ef1be25a7da3f65a02c2cc7df032095ec490a7a1e6aff8e0d032e7e8735a8226d61cb55c0177589819046d67cccfa246f0651e59662e796045fd0ce634e66cbb185031a5f04afc53fc23b89225341fc49901808db681c0cf29b9a0d957903ddbfcdedd9d11c6e871f4463567c30c87bf088b58a49c4fd517c58d2929a2fffe6dc9ee41ad2e9126dc47956d4c6dfde321862c2b06e140be1e61a2313ddedbb759c8aae63b0d53be7a3d39e7aaedaf3ad1590c831a4dfd85ce45203f7fd3ce6e87413853b177b5b635205a2bea09cc94b7c952e74aa72e320db82edc56487e2ddf7bc01075345e18f4361fc2728af9fabb2027e0feb97bcbc503f48e2a0693fb48c06ba6f10cf8ec9fc9b133ac37e072c5a4b2f59c498a5add6f9be064d6b6e1ad56609c8bc728381d1f3806feda2907bd9f1cae8d2006e63d424b576a7e8fe5f386c87aad2c98065880dbc4d2397cbe8b578c9339069578cdc42b7da5c6c5120398cbc9be05f05d3736c2f48f1e7fa117152b2d08c2df17753f64d97d78016dc5d490102618d746a288161e9d4fddb749202003631e8dcb1df91df35b5aea00218240d74c2ef6c781bdffca64943c080ac2949db0e0479cad3b7f54a53629d200e902a79a0ef5ebbc1ea4814cb7459d4041af8458d1b4930d4db283c5d265eb4852ff0677827bb73cf32ecabd7e9f7dd5e6983fc4b97db72577dd0821f64754e3055f7f4b503035e784c42e1fb3f2b0aff978565b604a11dd01296c236c7614b74a49977f41be6ca6188f34da1ce83fb8c27652848dc2a71e32bd3631fb9b33ae69e5d8791dca6462f8b76456822731d688bbbaa90a8d83ce54c2eeb56a5ebaafa95cc9a2acff26016d6346fbac578ef3956f16319d54add7ad5f1d168266b0a154d6f262b502b96dbdbb633264215ff62fb8ef840fbf2b1f86bd4abc0b5c1d6eb07adc22027e258c30e84261702dabc79fc1cb0a277507902603fd0fcde709fd06710e485919734810126bf299227a4e2db0352baf1f4911d75abe778fb07d369de3103e837baa87a360674ba7a8d47320aeb24f6d64f789dfea165c1b5f8001bff76b6a484dd23333fbbdd66269c21ec2e2ccde2bed1be287da8c26379b1b46b2d5a6366f37f433060bf5f9920a4b3759750a40af61bc031753a93dac0c55edbfa64909c2e0166f64b7981efe3678a62e8ef4ddc169e3d4d77cf309415b36de2e92dd4a07f143cf97272dac6f9350538956131d2bad973d0e7ef4f3c030c60247c0e9630711803be6843c0badc9db26b1f5ee69b4d4e02606803461ef320e3f5259f5bb8ae9d79b98f64da280812108f0920e272387c67705ab3abc980a157e968489ba58214fd7f6a4e9dbb0632bdf8c55f9c1416d521854268e6d8160e3a85c6a2ec83860f0d748b7971d04160095ce67399dd62f8bf13b1ab8da73db81a3ec326b4df34ec384d656e0d14543a810fef05625aa747aeb01af406d3523f6598e05c9b15194cfc4e7aa4b5d3b912c3a6417d6bf84e525ecf00caf8d91e14ab08a0bcf5c1ada1d80c4db602aaea993f9480543d52d2996dd4e5a8da14dbd8692276b05b716c7b3a1b610a7a06632e537f1e224ce6ee9d5a764c06013325eb1e6ae4ef3280d049b0d0371a9272ad52adba8d502120dcde8307a67b24a086dd39467db2218c639ddaef327ed28c43a6bcdb5066409d27cd962d8770aae9791f5839a3b19f00a0d7f6ad05afb09fa08b0f5609ed21b879fb024c517f1a7a6731d9d8f956016a1288b2be0315c3495e7ff3bf1c5d4b0f2dd735d8b6fee9dffba56c98e1280f4533308d86dd5970f5d816287afa2f330dddf2cf770a889f8680fa5efdeda00f0e8d6ff59bd6e3404197be0c1e35eb6030e4de2d9bdea4a20aa1a14f8c814687427b877961823bc7a938081d1d520a6914dce9eebb95cba7e8d82aaca94e941e7d9827876c81cb6d991364e9fcd114942640a6715ae276078d8f06f4e8a8011b1c6db0be41482aa88dc454e1313592a7f19aa453fe272c477550b6c6cf102633ab66c36c5437d20f13c568a16ee1fceae365640519e666fe4ca7ca80d1396bce971dd03029e34a17b7811088ea88bbf3981b561332a2be82500ea2b173665a628bed57a836dd0b48e5a1dd26587c78486c370afcecee8b7a4bffefe74a396a85f67fca230f878e292a823f081d4f8a5ffc32e3208d2c665c7ce60280aa2524bf432fb83f18655b2ef2bca68ccd649aa0a4b98f3ca7dec79f8f7b7b1c37ac11550e87a25af608fac0eabbb442cd7e01c112156f9fd19827b9e00aba285750a90db51209150cf4d5855f09d8c8b1de5837b0e0f4d87ecb2f420b2e6023ad95644fd3496cebe19b73f2dc11946d0f18165b0da6bf5523fa26be8d50dd9c9efccb81f5a84e4df86f6e8ffe7d77ce39bdb4c184d14fb44597a685d31cb301aff9574a78c90dc9d6032db312b7e35ac631dbf1b2faf6647846373e78dc50e1551d800ff9065bddfed92a12d53b67a12916c472147e73f42068515eeb3a67ba22cbee58d2ea98f8c773fc159272952006cf36b925e618d1c2807d5da69147fa9da6faabb30055a8e4461c31f717dc55b3dd7b3d63cc858bf32113c1478b72312a112d7f05c2027cc9c1f30e6f75adb0c4c43a755a9c2a9126ccdd102a8396ec5cacff4937ca3fd2ec9a18f1582699dfbe15dd0776df787fd1d611c0dc03f69aa9ccf8a0e5635e59c12106816da511210444db5a54f11fa688ff5a59d8a741aaa613a20c8b37fe6febe944450c7bb4234bc3cde4519b50a3b08b2f51bcc7d8bab5f383f295a28083c1654a92b114f364d9352d4c1918dc05ed1bf93ed4f05c496e0ef6e9915d9533f6279220f7fb4f5440fb61e7f804123ba3245077ddbb2cb542a8a3580aa3ad0edea2a3464db938702799144e9ad793b35726cda32382caacc852f1c46e2f2862ff5906992eb93f56e190acf65e2dc11b8db5b93732d1c69e53b07ac5385aa7eeeccd24801785d466f364a465de512ac2cb33bbaaa832a0e8993396c105b09be10b81a591a499882ef197831387fc415774333d73e02fda39fd4ede5e32bb8507eff8d254328edb2d50bbd195e789a5283d36c7397723e2f0e474d9d35bf5e3b21e95533e5db04dd0952418437983b6d36ab0e151d9b94bbc0347e1e6fdda488e0c09a0b692b840b72362bfd2ba7506d7a1240463845a84e9ce3abf0f74e323ea2ca833635e01644fa01a309a26c805b36522a8d503722f08a9bfa9937daaf655151393bb3c2619188f9d33204b0743e52b1f572cd3aa9a972a593a39548c406d49be4a24a980ef90568e1ffb93bd31eb578c97d1716e5823c499f967b62182813f0aaf4612cc4855794f5f829d5460449eecd3796937f82d1cf46f850ee54d3f69ab6b862442c3c67c638a6bc4675f6f55d2a27b2781fb2177faf537cb51f0f65e02e76b4a9ed261d45d190db5507ffa10b07d6d48f6c18f7a1032e677f22e548093bb7bf23b04b615be93feccca52435418dca629e0fbe597c69127914045c875e0401eb7a1db41c4ea8395971f66f9a47e48dc66eafac26590a861a3b6e7d0a27b2dfa075db6834673508880da3e7b66533a766c7f5e944800e12b2be084fb9ac6cd646dd936f93eeb933e367539472e3a29eac71897d9d399c3ea96379da7d345b70457aecd21f2b5b43d049af7fb7085bfcff33127018ccdc9367f36a263c08a63405148f98c26544bfb9795eaf6b1e8348c6d639ca9c80f7985435823ce07177aaef7323c963e69b2f05c0092c776b450b6b23a594139f15d6d8f36a234fb5f35b695e516eeaf4891c1ce658ffc438c7cc55dffed6646f5dd35cf3c9e3731c44cedc9fc18d3ed8360d66b3f22f39cc3113ecd5ee967739f81946fe488532f0928bb1fc1a3149dac98a4bef80c4bd71ac6998cc1bde34440e3000dc8f0f7677041b4e -MD = 3e82f9f2941e2e8edbd0942f8db71b923cfd2c62cc80f50e7064385616c954eb05bb71a0e52d5bc73154d24ee01458a2 - -Len = 77056 -Msg = 693eb5605ae784d0af3cc39327d3467c59b47b9048a89e6837b430d7bfe0a5cd1e3c5d7bd225d5b867c51fa48dd98f8b6db7b80c3d8f967a12f10d82f68f920e3b45296a0f568fa550f9b83ba1147cf0bd478dff0b2cac7473dd1cd771b7570a675e017438011a6012e0779f8b0b7375f06ce2b3d90746200181461d55df5b894b91cde375afdeae5682441a7446dde0ae2e9f6ed0a9ce4465e4719ecd9006538fe575fdf0e7435ac4e808f2844e23faa196ac791899aaa9470e86a0fe51c02fda63e10bce31b12a0319a970e2aaab8b6fabf11cd85f44174d086e6c13aaf1e7d411f9543a1590e8bc1d11dcb7e2df5bc076569e3984025622d90f4a3223014126f9a6225a1c485a96fd267e2a7f26313dfdc449628f4e2d6c895381844559067823cebb56cd41493ac0d29d6408e7d78d4a21637b088f65d421215b30975ffe71955a6857b1e37c4f6efc838c058c1359655735ae782cc601a8601e5ea27cf0ba593371854e97bd7e108c76cbfe7cae49544c0721668f189c26fa1338ec18a5fb773f1e072fc3d26fac69bf497c1f700421ea21fc5a1f234ca4d682e3ff9ce6dbf568b706d9d184c94d7da62d06dd2033d417ca68dc44afba28dcb38a636e7902dd9583a9d6279b34f8af72a0251e887d73bd4b8d7566838dbdf4ed539ef8261937aecb19ac2fdf5ab7e76dc9604a6e8b08c3ec92aced686e68067a663aa1b7c8099ad77de64f18e0910dddd13fc99b049a11f59f0a42260533faa0ecbfd0f2b65d43effe09f10d718f0a0bdf4a03d791328faede16cb85f925b8a80db3efa18c3a905bc49f7c87b3b7c43f1c0a61e9dad7255f7558f14df34629daf0a0658af1a96962f630584e4e1324c1af06499b8691bb4f8c581c459a9f337dbe0d9a768eb0b64ebc42ec2aebab12d8c1c624b33e6839c74c9fb5369737bfdb9e83f62c0b5a5f653f5fa2e3328577cd7ad35bfaa965870fdcb422e89117b63ab989e1760fac4df0a70ee140caab39e801b45438708f8d6f651fcd233145fee337a7c31a42b066361cd8120a5c2542717ff179353aef342f0f691caf1fcb811e3f6504e14d6d9381c5439b098ff978b01b1331b8b08b62960119795302b12532f94c0c93d8ebbd17cad9e5050c31c5edfea1e38b7a6d00ed64b74bd882fdd4698ee343f88a33ca41542258c67ad5106f4f23f9743f9df77c5fcbfa0748b9750926b212d70c4ca4478ba55c1382eb417f3722da3ca7212d8b1bdeeea6fcecf05be842dffa053e317196ea5ab6cc7d3f65de25eeab5c038c62c0778e7d469f2da7fd1a13271e125b079d79b875ff92f4696bb49d88034bfb49751f4456ccd913358dc31727ffcf0850cadbe019c33347d307574f9d47ff6187625d78f739a28c4cbfc352c24f7d22954397386ac26720ead9976cb0cd29a865b0b9902933028035bba42bbfb725901e30352a2fa13667f70afb5c8a40d0b72b87bbf5b46202d539aaed0ce8decd3a33ba3d1d320ba80442c10c87f346fd76210eec0f6070a9749eb4275c036d80081c09387939a6c6e013275056b287b7cd8e6ed346f5020045ac00d982d90b43e22044aea50d1a97e1b264512f91ad06a4bccef9033ac30d30adb78be8326120b08993250b761023f0669f977b565df2e3f157e4acf858da1ee700c6f5d6161e5a9d1f27123b3073f67900a8a3ca41847276311eabf76c6ff5a30410118cd345c8a5103b2226218ed931b00e0db501c33993832f66ffa5d29f29eaf4a41d409ee3e88eeaa3fd8c7c83d7d75123df45b8218f759d47d8ab0d02c1dbf71652043091b0c0bafd891846dab29cf74c0fb46910b431f2b449272808b3ffa3d0f1c804bb43ce3599926ef3c80c288aef0ff6e0ef48dcb5171cc12998467d7f38c233204aeae1e3dde0358b342ba39276a5b425a794a16fd717201a99c47e13b78fee8e24ed214b323a161705583495489a963e1ee0a6a75c03ed02f57329e8b61ea0563394b5f50169b99e25db031dcdb543353e7413e50ea7cfea939ca7859b38f27e5d27c569b036c5287bfc39b16dc06412ee9711b255cd6fd95b861f72cfa58c108ced7b30a966e3beef03feda9081a0db1592c894993b74d7357bba38bb2d1513a72ffdd152c4ba666937791e9ec2a09a9dad5f1542ba87ed09c1a05ec6983690963573d41517f32ad1e2d308ff490b566d30febdb8125021bfa1f86c57ad968e414706c2592635120f4a331d1bde8a186d63cf13630b767d3f63eaebd835de1590addd2185ba29250cb7c2e75b4bc5e7858ef79fac6da209714fa062b0f9b52e6bae227c039b766bae73a8ed255763cb9df8a1e9f9ff7bcc3ead3f5947bec4dfba94fa583a91c5ecdec50cb7e2c90dcc9deaf37ab38aaace8cc4f258054fb23265a58f3f9264beb185f416cefb6a6af36dac15d943d6d61745dddfe85273282f542a09b873db08c18949f0b9d6022347f686308e0faba8b04f402e9096f1cedd6f6a904c45c04c24d40cbf00dd59dfd01ec06c2281d1c8a0943508d939924b449faf4a8170d931e34c85ae2c77364797cea1f01c000fddeffa04954aa31e486cca3f62e25cef6005dbfbe2c40b6202a3ef72e504f32f8fa56bf4fc6b3c5d6c5ed963fef472c9809268b8865003a6b9fd677c7263c4f788cbce4e66c46d166021b563474118313a93da02c058c6c814ab2004c0bfda306d690a5bfade9c13cbbd44876450b7ed360f1b22b865bc90bab70055f7a39da2e9850960e140331a563b70177da9b8c61b0e126098fe4dc85428f1b63e947514a229b2a8427298f4a9a2205abcd581849298a70385ace1368907da6ebd1cca4f405ced7a46fd35696bfa3c99475b7cef42b6c255a9f6e0a4025ba2c69dc2041c6c27a21d14687040444bab1c46c310ced46f4b9c2c64b2d8672c3306060e8b41ce90b9dad63bb343de9e572be296a4ebefcc2a21367ebf9a5f8374761f89c8860da21bf9b1ff6538defa270e425aa20c3cd3482cedcd70b492674d5d11ba21b5d162aec2cf3bede8ef68030c909a71fa628e8b047cd82beca9e0a605032aff94c4da5b7c5877b51bb7efd36ff1db797d0a05dcf30927590c4cf667b41e5fcbed8c110b71743b2498de977f7d8fa7225cdc3f243fbd4363da22b279b38ae3eb86d10fa4e74910a2290d68f07f9285d4617f444931bfb3af1fd41bc24a6e3ec9273cdd0f27027d9794ec6b0cbc22fef7529c1c351138ffa7a209392bc0f2f6cb9a74823579c50b6ba222a7bc7e6599f3f8dad0ce274fb0b22d6a159c5f40955ba62206fd24ba40871b5824e90b86de301be266feba2d4d37869fb6fe6d7da3e012ee724e720ba751c735eb79adab5517835be9ab14f95ea0764f253733d4a6c2a77fcd12a9ddc5326e620356a9fd870ef7ee5ebf7bdc6c54c5226831f96b28682d7e1f30125b2493d78674664aa3fb7e4143cf2138fefebb3bc289d2076ab03c6c927090f5aa4bdacb4a4793d7c539d0270143b993869c3da0d48f04a4fac7a52b64c91a9af5c271125683c3978dca6a72d1c36fd39cce42bb0383ae1943f30b349c31b6486212be745130e0d32135b6ea5a562b426a1d3255f46cb8af6cbfd64de1b14c4919c22bb9e357d1d4a9021a564504d52615107536525209ab9db06f3fdb50c4e3435a1ea8b5ff7edf4eba007f39d555c8c8307326c33e8b5800503cd13316065f0862010a6f30cf3f37e4cf2edfd29370a90395edef3625fdba26a6cd910bfa058f633ba7b9f2ac3a8e08ef29df027866e01341528045bfe1f6ba16f99c38891c01e53447394efd1a78aec838e06eeaf196e8e01f1b70424dda95f21ffda499ee856e54b29a4baa251f5fc2258a1cd25af308db1a6ac194898e3ea3055c5713c1448803af82f29ba4aba245b7861619ea1efd980c153f9edd3b3d92745f5ae0de66baa9089a4ab9de4400b9b57c64a5e6404f81bcc4f24891091b2633b1b4e68d128cae83895bea1d100086e8130c60998084fdf41ee37bec1f5fc60cf86d0f1570877ae9f72d17a73a2a1418f418314a0726737acb191d37a691dcc5dd8e42c0a93275018ec929c6e806cb0cc78fff40fcbd4d17749c17bbc53acf27071e67d4e5160895f33606bf431d148e337ab4c488cff293c17552bda5e107fa1f25659a4bb9996bd17c98dd72f65564e0e0371ed3e6cab659abb5886d0eec06ccac265a04a5924dcea4c5679d19f75777c9709604893d48e54627634649e612b7b9915c3762590192b477a4ee0f632fa03e47744441b3100c4f9295581b5de887578ee70d76584fc6b795dd8b5f00b40245a4ffba9494d777cddd67ca0bb94ee58b0544ae6bf50112b2075b9c9135ae46e96f808f0c4865cdc8f021c5a2620d795fdebc41c99add1dafb5634a2e6ce4132f903fea313782b749b30b7066c0edeada0195ef16aead90b58740bcbd0c1f1221ef84f48acaf6dd560e6cf4e13bb5e1045717dfdc993712cd65381cc67d27ebc67597d49f6788e6fae98e789b3c2f05e6c68c3aa2c2444cfe37958fd126c4452608bfb3f878027b3a2cb7251b2921ff87373a27f1939be650e59d3f6771bec84a9146b91e632a4320bf3023e96c5476f0936acf50730687cb5799540fc5dc1d39f9720d9892c9e7b38a41998d6b901327c0655947ca4bd77875d0f6528ae7ecfb268cd8ee6ba60efb7531af8f909c7e36a870ee5e0133805e288c4bb729a8dc9902db41a9588b6101694a8f7842425e2431d6b61e7e86278556137ec608e4961a74a97150bf3e87cc4cd25ed0e8485bfa45ddd80eaa0c77f6e8afb5079066c286633c906b0a8829640812471dec771ebfcbcf7db7ed8c15b8c7a5180329f507e6b9dec582a031efd2835270e9b5974f7babf2cc9fb0d0acd3d940d1413c580d415dd4381ee901801da7da01bbab709637cd8fee50599ee25008c705492f587d9f376912c64dc0854d5af1231c36c999fa19ed0a5252bf5f363b81dfa46cbdff082fe47b033435a56b86e0fd93be6c03cc7756492b01fbcc8d5ab784d9594f3a852d8c9a5c0629897e12f0b9a8ab1f7ab5cf10d365d019d15e4cb21f7060d5d71d19ab98592b64d98ee6667ce365aba6be0964cf8726e315b0fbb7d6f2e8197dd9db879c820cae3ca4ea8d71cd54d831ee0d9a651a6a1f418b4e11d1e658e1d5bf5b68cf600fcf5ac606acbdede16dc04ec3fabfa50696fcf72d0639d41af687da8298597a9d8edcff220a8bcb7234fee413cc02b06110effd80e0364495203a2f365e61581fb46a5426f001f071f390bae65759c4e355c2a42fe5efbf312696c860010f83fb09abcffaa647e3447321d822e4ea68f42c1cf5235e8dcc56d245ace9ca8c829b5548778674862c557c5744b1bbdd24fc5ea5f6429237f46ceaece3b70100dd6560e854b3a2e6540ad6da0879245b8063b406b175cb16bedb373676b4ee931dc3f2346f67778ee2cd48532c64678c0591f3e72ea54f52b20c81c86cc6d86bc91cd2d4cf8b3ca75e059b6ab659cb973aefe6ef74b868125865904dcdd709b369d7c96f7c083a58511997c6b03f99a4a7e354c78b985b7e394f2b6ba1cec791865e9fad7fc4b6ca4273041021001addd5d604177b2b73c0dc331ccaf1935b2da7181c38dfa9fb24b97aaaef128393684b31bf864c5bf7fdc9772913c40e0db0546d07b5a49e508f3e96510c8ab04f6d915a4dbc070e2e6089851bee2327244215c52acfd78afc335a2fc00e916f951530bb7662b42e610ea3c3b90215c6ea0a73884b2c7f57483794adc09e2fa8ac87afba022059a2d9329f9bcdf8a2d3a531f51e3374a4ec7cc4757919646d43ddec96c1b89d0052dbf206741d77d2369ede24f0aa504e31e00184f993075228706c6e376182b026b2765fb57328aed71d3a86647868860ebb174996f530e740ad2ebe84c5767206a5e732c895b33d9e696da5e36463536b572d4cb809863371db5b0e0fac224ddafb6d08144bbf8874cc9e09d637e9be30fa6c16c895b23ea4441ae742de2d498afd2f67015ff4953f8cf638a3b9a4ce45edfc2e2c625b10c22e94cf8422406efef356daf797fc6ee9f29cbcb4b2398b9278041c4e382ab2b1e2f1503e4203c51f2509e65ebd7c1b5846b81d6fea53fd00e2ac6995dfc72b5ba858f2d6041d55d3da71159e971fa276d074e13e29982d75751e9c681ed983a6c7f13cb5313726035bb6ee1fee8a0d29d7f6928836b022da777f3d31be08c27c89e5b64391f84198f1fff94a8968645ba566b7b4da44e41831fad45788fef1c4345ce8e8eb09ad78e274bf85325fadf380edd92cddfc7c15ebb4ea4241601866117d5b0d0811728d763fc739af17f2d9b1b37f57077ff1bbedd80659b4d93d4968719618b1b999bdf78599cfc93a3af580df319d1f764bf17e8cb106a80f6a5781602173aca929f2ab71bead486d8e2f34997866ef88939ee7f872b1e4aaa677a3718584c1882a13dc28bd3df45af56f170bda1a3d5ed0ac7146d1c03153fa9118cc49b5baffa508d0d51ee695a9779d6f5ae121d29f0a02619b569c57b26c8e269af56d5eb5a0b9cf9e6a0ff2021ca185b115e476f4498802228aad1e6e0754160312137453260e23ab2822d40bed63a136fdc9f00596269b00f45b4e2fd0cc302e2711c5803cef1325e086036ff1cb0b1121390a79f8c473601d0fae9fd1debb44bcce19e5ec44e6341ba347d430c20a6b099d8af9784ad3688b2f07641173016c59b237293df5e5ff5fe168e3b32ee76c3e5b392c1da00340c8252126987148cf8725e9f538ea58af37a82d4381f9eb3b47dddfbbefaf4b115c57c48e6fc2d994cd8ff5f1e30b876b28605f9ca2095b01ac89444df65df303cd2fb8439d4cfce4b45824c44841b95cbc71c6981f4882e5f6c92f8b3b93423da513c4ee2af9f8e7c3e83e176f7237aa7a432addff9ca710ac046a1cc53a81e86b6db2371faf17c482a80b915e874a7cea3e53134aef11a956a1bbaa9c38f92ba8a448c583589fa479fe53db1f6938fa95cb09e3092809d97c0aebdac977ef2fe3204f415edbd9ae3153dd9cbafe494e025013f5432fd7c8a7a6c25653ddae1ba4498e52b8200d0b3110727d3530c79db9373af000ecc39d5edd07c642547d187487cfa19a0f83e2019bda269ae6f81243e6467c484715812a1784d19fc3a34ed942d8d60b90825c2a5edd3ef10826d227c7ff422428149b92bcff20711169e45de27298148b53a133bf426e407d9708ed402cea9b7709141e34415bc028170388cf658fbce83fd8a428d35d912f93da1ebb971cb61c3c1356e8122994eff5d2e17179640b8f8c2a060056b3eb056470419f067f7cfff5c1c33e3932f64e4a7af03176bf096882bedfaf941a57e751f3de5442bbf5087c45ec9f801fed2d60223d752347bf5c6bbdba9d5538dbbda18b7e421379292018c85974ad9882747df351a649a534518d4e1c3261b5826f9d5fa8d14061212d137293238944bc0bea15b32db0817030329a8fd67f3a51e68d98e469931ae418b36a2116dccca3dbefafeb7020817ce2a0c89af1796f5208b95dba72d24d7aca41d98bb36ed73fcad3e982d961505f4e1f01c6eb15fb8cbe68d7b354c6a1ec2a04e65a64060e99c1e0ecffcf3a94215bf96d992c1c8707f1e32e567737bf411f46ba15906e19b8a95ce0eab975f6cbf374339d1c55bacc8773892b43ed4e81934d7c449e6c9fa46890edcc01d81d64fdda7c5a238a3de26a5e10bb21aff7b46d635570f8c94866e8c4392b0e2cb2f460716f57aa81b75180eced8d774662e395ce6d20054cbe050f40ef9248385c840682351c1703d122b367452aae7b3616f2d6ebdc2dbfa689c74b358617c6c41ad654f531d4d8335ce91543182f141b536ec5f82cd8e8abfbf72e3391e39c91c1b831d81f47c884070c400ce161d9bba4f0e1bb996e9173628732133a14836c7e945f066dda9b6c2c032ecb0cab94bb1061745daa5780a6c65e9cfa091243fd5b5227a6a3f41895d1b627a622770bc69fa7c405e8fc7eed2f66b7128746a4eb5fdbd1e049fc09a4010d75c5aa2c07825aab1adcd9c352f0a686ca833b166edf9215a5dee85c3444c1f05f512c3150974855bd0a0715c65632a61c75aeeb6880fde9ebc5077b611b1b472c7231f0aeae728ef7b6fa5ba0c7dcaef60f662e5c77a73feac02fc15ad116fa254f40d0e96fde3c0e0838fba9edab87a079ed45106b9900ebf4e796e60fbaf19211e139c88196484b294b5fa96da71762dccb9a4c05d912368cb762cc7d1015bbdf9c93158da29bf641bbed68f2d84784608693daed715f13ae278dd5c21f4ce7e2fa47963a081c57770e0fad2247004d2ca89a81ca68ceca83c07fc986f07f5f4282bb1431d2b2b5f4ce2c41a5fb280769b9160844c746a23209a1707389976c26bd58561908475ae082abed24fca8f83e3f6f380495b1e4e38b59912ff47a54b63186269bb0c28c62b3f67747536968d4c40cd9b2daf6d9c0cc10f66239125f1c68ae4a5fd40a94a2e874a7b50752a152cf57b3f69ffdc6ee562f65b55e45d77dea368b0c7b09bac9a98d4717204aeae1e9b78d76ebaef698b11ca7cf6dfd02043d88b14aaea645ff7fa91d14a73b8aa9989430ddc6f1b0e46341845a6d212ad6eb0a84c374c97f6bf030f355a30ccad1675765d138ae3bfaf605c3fb6799951e7c26cc1cd55aae36868a8f811ca5f282db66f2fa4acde003f2cf2e5c624d8b0276435000d9421b87c920b9411aee4ae37e2a9f020336e727dd098b25662556aa63c8d91589670e8740583b3da6cf191dd70b368e6cd1988d411aa3fe7c093d3fca1f2f03ecb2ce5e739bdc1cc730a9576e727d498b873a5ea56a3e8daae187e934af1a730a0ba533ea52638786f940baccc53ed86a3e17c19261247dfa957dcf28e0620dec5bd92e2ee39925e912276e786d3fe611df75df8f671c74740d671a2e1ace789988b379c6b8469ffb63a69afad3491986539de024e4ef1a1f318df1cec5275d197c7b393a37329cc1d40466db5e2319d380d7ebd940651903ea367d91493563751d799913ca24c5454e8bfba275978f00506b2837e34616281eabe6fe0fc033b455f5bfd8d8e5c28eb78181d7826b2313aaa0c0c5355abc97b635539e7d9074de0b36d311c93e3aa4f92f1f03ec687c1675bfdb0b9f69b0579b1aecf7fc6ccffc2785fe4604f4d590faddfead1b5643109b10a092873a9d70b3a2db93f51eec15902a6700f3d23c59a4d3465d77fd1f0a03db38e1569629ebe81745face6c7231306d38c6fd9f1707dd581e9b6824b90b9568cb817545fccf21bf55b2f11f0a58ee9596218a220da38fb5aef05695b81b39fe80f84a0fbf2446e43045c4ff5b93b2ecab980224c733a1331fe3a916c542d7e77fd03fbc1af23ecc013bb1d30ee964b89fb3ce6dedc2fb1899fdc97088895769f190bb13b442f3bfee1a1e65ca63ed429afa54c5265585ac43c41e6ba8f7a1cdfec126dd361b4c071f6c757b380833d2c3f6fdf41af6273946c211cece959e5bcdeae7e2478631ebbdb81ddeffe01fb0422e31c172acc905ca7f0863a16a345a879368ea908a8ab2f0877e56c8f39923402a59f6d6805359f6826cf0ca7e4c14534510bdb92f3fa5df6000aa3b4a8a74e573db59ed78ad7df253a63ef0d9cfcf5a864722697d390cb3cb0ba4ffecd8ec589021b3609fbfb9e77a1c15bc84a3d4c3e175e3487d5e2f9350070abde16dd1c20991cbd6fa7255fd7f383cd686b26bb7db02c6ff369755a8785ca51c322f6b4a67956bf893ac985beb617de5e7e2db5efe579436b0cdc71aca723dc5e60804193194596e7156cc2a46fe9e91af1d6edfd1da1494f4e6ce10cfb29a5f05dfe256eff65edf9c59379116796884e74a6a63dcf410c209ccb0b20d828393989b4e2a2a2242f41d9b21b9e539a36397511811a80d4e68f765b5290e4bc109a52690bd6882cd54fb06d4c93aa617d9c51ac012bc8e982dc79b279d5a761d683767f036347dc7a73e8197ea9e288b8c7b8caa8da0ddb4b980544c3577695c595346b6bd137bf797eff3b1449827c924c0911dabdd646ab52a7a6e1aef8e498303ab297c8fe426ca14466bfeb00b974a9d106394fa8a84c9cef4d3744a4cab8f4e7e92982f211ce8b8610d416e3cbea618f2c26f7fb6c89c73aac36a0e0a49243da7393c7b98a19ae02cdf345b2306df3c1d8364f55200d721848824c532ecebd60f668efcb27d88968f2800fe26369d0e7aed9de3c5f221e06a69cbf62b5c8b239c61b639d77759e17232ccdfae188a98f14a3fd1776723b944ad872a5d61ad2c3771ddbb7059b5cabd43c18724724ce16be07547d02685b3fa9d7fe830c3f9f8c9e02b08e3e9465758a4077dee0d8bf1cef965ce38f9eed77481dcb80c49168f38f4c7aa9af0b1922b9dc54976b1f0d104db37ed17a6062c9ba1c52259bdadf96ef6da29fb35a1831f75237422252288f3ce142dd5f676ba554463af7fe5653e512d8b0b7082bc311a764a855c33ca1e851c2415dab1e6898bb3dee6e689e767cbe303da609daaa405e662048ba1909ca00b8e2d8e9ffda226375d50f673db7cc35e691d334f14e4c90e927a16381b092ee57bfd5a87640c0c160873186ae78320e8e65d5060a2fa4c36036e67c0146d16f0120ea433c3cf279808d9b235b686ccc7a2212198fbed78a6dd68e50122d040757ce7d569c1f45d07850a2e9dee8cae43c4f10dbfc8c534a547f0f8c3ee3b94bbe01056f2068198a9a68df26a389eaea675557c9cb08a677c698f08cd20b5fa0c67128e963b81bfc894e968643bc3b436dcd6d6f85c45fb746ccc7de85f475aae3874e41c08f9baaa77a9f652a003a83d22fb849b73fed7d37830c0dc53f89cea7dbec24e14f37197765206fe0e6672016e4dec4d9ebbe3e1b4423771a5d0a8085b798ff20876ccd9b96eff2e2ef5fbcbe95377d6858607e8498a4b6efdd76650fc2cb2d18b8bb3b7698449aba8b729e2ba958dfdcf662b2e5f90649d0216bf0a885f95b346390e78ae1d4c3d23b5e5900b9b978b256437fc1cddebc45d94997d269a9f60e088c565afc06fab47f5181b01eefb492e86139aabf846acb659def2ff66389f0280c0c695f51dbfbd81a8ccc61523fc93d6a8503269df1db36e74b13b4ac839542ae7e38745bb3f2d617feb8298756ffb5cdc66dab91ddfffda450201cfb7f77d8d2303ae36b2f43e9b83c05c005b690f1f9823ca6f67b940a5372d797b6e9f26b15a6f32526aa699399e927dd33cb17727c5d12b1327741fd83479cdd953f9f69f75703a214b1de642b7ab0d9c8010da7c49b6242dc4d8437a2330226ecfcf965e5d4cee2abe20ccbfb55133e08e4ee0270e1ade46a6ad5593eb98a3c44be7adf6f84b77f52979f3b782cd1729d033322ffa4780e535bbfc2c76f975622d0ae47030b7fd0af5ee04320567e2fead86789cf7843393d9cae14bab9dc3d0de00e3d3ecd6a7f28b48a7392666bce88d115976ec181fd7faa1abfb72cbb397c791512714f29e34514e83d2cd14cc6ed89a7ec6c04c6b3900090341b3ca6d3e4f85d7758f510a58b1ca4108e2b73b18f7ea8f945d68404153ca912756e31a4ddda31cc4473b12e6128288e04d98306e50c933e6aab4c5785bacfcb4445ee24cdbb4c91c23fade67dc400164f6ffd4f94cff12c68f7723658077edf06383ecc4b08085850bd5976376ca549bc6334f405353d53bf4fb81912bf20be49c99613dc4cff908e71365604ae8288da37ec8cbce8e244dc1860882c2e6ff97d8ea683d7f69ccac9ffd6fe8bf642543762667232378a605de61dfc2af1b7011fdbc2a4e4916a77a1cdbde823d05f4c4287456cfbcd9046a34d430d95859075bf458cff78a9d327844f5d9b72c923d189fb0ba57ff79e685a926204d27686c7ca6067ec1aac714b00092890df5d4a748c522be445620f25c26a1d9a8820f467cfa0e5f32115cf62a39fb160efe93db5b8112871d2895d3fa948b8371d3173d64d7b79bd427247fedd579a742b0968159bac7406adda12f64d92d45318149fa3b274a5a2f55e65801be52643073a7404b5a8a0fb4dd0cafa4dfcf486ff46b2509d10fc3c9016c286edace7660b08cc03848a31c818f9efac08cb9b4b3944566d7bd4eff2c957c983c1337055acd0eaa286c5a905c5d1eb9c3ca32b086c9a163acd34f35e077df50744fd338a734f5a623aef693caae5693b28083646efb45c790fb598e6b115df71e78ec38ce4b095b32f6c14c55eb0c319796f5f9f592fa388b1db63257c9bd354075c82d577c12725c2c01e4847a093a79f3ce97a3f6885ea621ac482c09c9b4e42eaf3ecb2ed792aa38ff83dfc4155761815665ff8fb7e3e8ef84f970384719118beb93b0c821642202034fef31f7305627d78c91c64f6c5a6f866cadbd000fd074c35591b4b890cf7355733b2a796c60cd9734e10117a4028af9ca6a02bc3c28d17eacf35964bdb6713c154c1561b3875bdf8378a9d830ea26273a306e4248218a65bf601fed93e1e5025ea85b78afd4baf7a4dd275abb1a2c56e586695cdcc387c0b75f6e1abc57b8ed75d96586064ed027bd98e165eb9885cff2f45bd0a017b1d7bb79aeb4dd20d04682679a5360fe86b7f73241c1686e17da8a02ac673b24eef1f4344783a1451754afd861a666eac5ee7932ae35dba4ccbed539c5e956f227578a1ba24fadcd746122b62449bf1c73166c20908bec408bc5fa200c1e988a4552a4b325e0acc0ceb303884a02149c7975f7854e89424c3b352240eaceaaf32e286a8639fe44260f937bd73b9a0d70c05343e752f886cfc657741fc8c03335cc21051b47701d081e49b22a5ed951a22ffa77d1039f5fd2137319470cbddc5905879dfab5ffe06de31dcf091d86893aadb1bcc8c948765c0ad13840208d4d66c3a059acec73355e4657fafcdf6b5c3e24bf3a560cb9727593b8fa906af82d64edb662b85594c3e22f3e5d8c0d4e73b87b6d180234bbfd25967287c154c6245c6b0fe0a657293301861b1d400df875af9a037f54a916bc75fb45065b44bedc5525f3faff59fc2cc3333665a148310b2c69c996d5d492596caa7a9fe4a4a9fa5702acd849c5d357311ed75b3626c0dd36cf06860c1bf77c138c587ce6db4f296aed81a30f02775c5230462787106f92d5b7047682e70ccc708729c2e851780f97cbb983d678b0e22f4fcaf21c6c04d31106098fbda19af28e84339c736eec54e5859d9f288f4591ce64ade47ea34847f3a55ef847af6995726cc0300e9a72a15d0375208caf001339583524341e0397827c4bdaa87b415e262516a6413dd49e052d892d8b40a70d7811abdbc644fd6ac773175d666beaf5b1997d2794bfd8f2e7eb20efacaa032a91795730bd7cfd69c8730ca80be92b011bae3fdb908847450b26838e7755dc0f8e77804c9f30cd3c8f6270e41f5cce2b6c4ea3e9bc00e84177c4fb3174aafa6776f26f56f7c7338a242a8c38282c991aad60f079a090858c35afce002c0f24d852d46d774aa9f8fb8db1a8cdb0c05576e6cc6fb5c59ee4ce4dcd442426ed240a2904c0d7223de438d4e10ccb3e82cae91d7a68c3b294ce -MD = 66e646adbcf608c86139c62ce5c1cb76112fc0aa7c3f83ac24d3e6f7c5c7e1a1b6db310df87f8f9a0f84c4e5658c6fd3 - -Len = 77848 -Msg = 6bce5b07be558a6ee9f68910678bd641d0a2dc8d08dbc844b7929837fabe74bc591942f8f882755d119f2571a1c665d1621ed176fa01663872a59790e9fc9ca28ad80e7bbb53b197976e91a69ff8508facb2beb629b0aa7b7e02f803cf94f43ae753e6186f91e72464abf237c8e93e8397a5cbd3fcb03b14c5f1e415154f238b58d2f3587c04be0d5f9e73ad8360d8b409412257ddc8c30e2eba835021f5d29dc69c5cc24b74df596f8e398f3a27c62aebcce8ca33c2e76ea0a4fc3b5c4ea87917fa4adf42a9f1107ec56f655404afed268f48b26564513e05f8785e2e214e263534e535ca6a9d3b73893bb839c03b06a0d26899dd77a98644ff1e4200386bac0692544e4c818be03523c50e5023137c43dd700602c2964c45fe176e3859a814745bc0b22eb4620aaedb36f203f4df57f6f789823c0fc19af0408a6a404dad6566d950e7dacccabec5f8b6e9b9fd469fa069db94f324d2772d0ca0bf7edc21a7c3522d77b6916d0662c46c7ddb04f15d2b7c8dc48fca70ece4a980f45ccdade3750f7eea2ccaf0e96d858135cfd288997e75c79a78c943fffd60549140eaf82063586cc6a241fe70cf841d99fe2fb259819fb39f17e9f4ba6079411f94f9ab6675751f9582bc3da16e096632d0e217a71c41765ad2f22b25f53c7125bfc36dbd93adbede33045586335b8787aeb5608a37a23b5312ab8f47a5f00c2b2910e72ea549722a1de1ef2706c4a621fe6e350bba0b281340ddc92856df39b93aa8c0c093916200a81ab38ad08aec8629d63d308dc46521c25081d0f14f21585a52a17c45cdb7e83c7948b977f6804098b5210399151b0502cc5e485f89ec8ff1d83268a445986a41c457bce5508ad7b2d3898cc44672486619089786d5c1e767001a8f96412e0f1fc4879900e034d1def71bd2f79e917158fe28c5507ac8e7249302f60408a05e3e41815ab2eda4b886eb82dd1b66a1083f4566dba4c22b17905891a7d7e317e00703ec07e2c10213117564b516e7c99683b469e069f30fff141970a9f51abb1be0d171a678a2776be75e6a63d26632a28b14dadc89569e28169c460448f5b3993274b8415bd92b47706d3bee352e03b4c12c60d7eb33001900aabcc0b7bb28e266b568df75ae452f136c805e298665548cc6a4da77d25d5a380b7ae629b6417ce25a2989ad68edab3b21e0bb95b5800b54a84dec157adc742887277e882c27f1102ba546eb514d444d56040e60047b60829b0416ad75a5ee36e66b8ebb6601c957f2811e17af8a81b2d1935f74bb7fdc7c67715f2709e150cceff020aaacf88a1e7568191acbcfebd25b36b4b822b305abd43bcf6b7fb823516b5b3b3d4634becf7d0040daed420815bb95171480406677aa0b6e621f51ed2d2357e85c7bdcecd1d2f19a405d0b63e4bb578f701f4d8449b08845f230d539c7dc8a2eef94199d8c3ce42f34625381a5212424b44503e987af5b5b04fc6b8c89619c15ded91258688381089f4542ecc2b6a6dfc93b8a1c9b702bb881c93c70da7936a51192f0a5cd6e6f2c674fff2ba14282c7954909a5ebb8a1654fe0706c22eb00e77007da0c23c757a376c5b3c6ac8d63e501b6a80de152656958892e09ca80a1e2e480f916d254e076b2f28545495eef3ff5cc91dae3051ecc820b9ecd3800c29e5344744a42deb3ac051d9e31e27ecee05ad1e9975b987497b7b0e942d5330a24a79c7431db2c774d568d2512deb6a9cd160edbc9b0d411d1debe37f009e0227bc6d021510608d5628c8b436ea5cc280f13cb8cfa4a819a82df7eaf5e3dd1b1ab9a28a235293875f2915f20cf9f88f2af375027b19167bab2a2387a14d7cc60bd09eb2062ae85fe054c51e3bc34b4b0b56ce4d277ed4d176a0e34bf9a419ad7b8fd63c262fbb719a3a5a9b5becc16092799d0b5d3c6fc59b10db9a779e103bda45dd6b1bb7a966dd584aebd5ccf78a60fa65dfa4d843d299087105a3821ceba8a118d14f891e9a3a2d1a9241ea5a02e747ad0c66d8fd62f0e6282ff5f68c5787100d0149eaa7a621374e2118cb6564a5fff7444bc4f8f12338755bf761dae9c6114e7d9372c0f532f56a1ad2f6a64a2d71c9099c12d327a07ded1c106aa52d16234198a4b7f711dfe5d2e1f8e2a91dde4b96bf0048f8511934f402e967679bd7d48af50600b68698872d090315ca4a48ebf4e6f0ede527cdec3e82dafe9ea08b939f1520037bcdfd67ed128a16a669ede14813e66835f66f02013e7d86b6f5b1fed27b9b26d3426ef67770e65ba9f74dba14c8694e47475d25007839964ce5eb54d99acff1599e7db170b6b05b616cd8e4ef76f216b5b518b390c2a7a3cd0b885418f546d95b3c9a374d4660ac49552fd04c920947fdba323c56c04045b3d1197b250d886564a754e681c28fb4ee2ab32a90bc27587bb13a3db6d38be2add13f1862561d2c02692e4da29d960bbc67f3526067c4dedc448126259ef310f78649da75617d83c0ec96eb1459fc27309760c64ff77a318beeb78447650e373d5aca3fb2b212030ccc2f2d7b6a5a7de7339c14a41daff7071a3de680d845ebfbd94096ceba8320526247b33c4119a64cc705cbf13cee95da4194bb665b22a59f8c3d9e1e0d39724e5980eadb90c206ddbc3e3adbc7bea4721f5c716c803cdab4ee31b4150cbd6f3d1c5b52ddbbdc36169d860fb85088996aede5a707c9fd11b8799d57684b777dcb154779b744d0aa83e5ada91b69e4fb2147c0daccaadbe136a8f1167c4c002464eec5ddfcae37daa22ef5a579764c3041a78e7b2fa551afac06dd6fc580e009971366de225a8a5cfdd3fe7356f836df28a7af06a54c16f3851da2d1d87c8f93ce0d9b18acfc4098036f389138822d5e52b2931bd20164435e57f1cb29a177399647e31c00f5e3223f7b348d9286a8446c42eb191a57f22584404aea3d922f817c4cdf46d2c9ea622e6262d6f9883017b1e3079d02c22900b3510e8d88c120f1eca6d02776fadefe3ccf53fbd2094d4ee01d88f60fd2716b6824bd43afb0e41163c0763c820b395d070c887ab07c5860534cefd2b60b73cbff15f79af6e3f1467e342204687d71e4f9c450b2297409e2a81b9cb179dfa8b8f4bf1df202ccc127a87c73fdbeb4214ca1617d508162aa4c4ae42ff0efb178a8e57ac0f767edec3b5f03dcb6e961cfea8a7e4ed47cdae203b8410a3f7c336c224df351097ac9dae81e54dc9e6ce8c6551175559c504f19bf6cbccbeb93e81b9baa937ea6dfe305b472f9f432ddcbad02d2e11236c031e9d5f4b1d593eb11ef9b67f58a6dfbbc0526d96da402a08cfc7a4b4c15322115bacddcbac7b6d67350a8227404bd42d741c5de2a7c9c599f3d21e700cefd177d052d815202c2ea7ef72846998e1369a75407ddbade5e6d94d7a032b9b01607ea716b8ef227469b873bb260f0871ec4bea463749959c750e0646bbad1590b76b0580e6225a5c06e3ea6ccfdf3701de88fcb7f2f306f65a8145bfaebe23a5be891419c8766febee707c0ee6a3ce9cf499d31915a2a9fc7d7a336b44266d475d1ffc68c7b20a2a07a75028d521744716c596f70a1e26b5c740f8d4e6ac9a7e7c74e5f64ca0d21f3acf8f420322d20c2c556ed6382f242a1e1dbb82fa1a525203d1f649bd0670d4703260e5d86d90f21e918240079d4b616c57a4fcea363fccda7e57eb83ad8b518f16ec97bccc5501d4c1fbbcdf2f44649737ddca1cc907f3e9c33164075dcc9c80c45be31705c942362d00d328aeb73b88058b74fa9a52d019e8ac3ab0dddabf2c84d44e51e195bc2d1dba0b4ae34bec2809d982ea73c9695034eff7e5f75fc27a9e7f62d22861789fd850efad93a9815e8bed7d561a13c877f02322107100ab515985a603a2d47c76a7eb04ba89790111d2efeda558d9f577656f44981467849bfe0ea24a1697d298d2b3d4d78c62752b2708583ff5c3f636d8fce4e5a83c553fd541df104e5282efa1cfe66d630ce493d25f488cb978d59e94f18a5ff52624252647e4be10ac92615b68c2e5d72056311b1e44f46ca19a96e077bf6ec2cefb35394839ba254d0cd84aa5f1a5b046d4ed496ad5dfd5e54b0503b6097ad9dce157556b676e55def73bb4affa17b62564afa66e81b5bdedf2d546d5f3eb00f7df73c4d8f54067075c72e2ad65a2b066115f784fd3deec6196edf1fd022900c7fb71ccb86b9a256f42641cc8bbad68b0e0e5083850c22ae840354c55c09ca1f53f39b63352e355bfb1fbaa2882a2a4acdb299e4f82c93f2af7959e06b4acaa29b3b3ca703183c09eb21ed3f445e82d02091482bcf05cf2d0c3f5313766c2e50a5ec84f9890e22eb54bb5e05589e7cb59728cfba822e10c82ac3d4b115f441841485e8fd2f76867ac86a91972d80745591f7a523ba1c256e7bb5535bc269c0c76795ed047ef7d322a6be0c674b9b065ab17c7d09cf46595a8f725375f43308950fab15b1eff8958d701432f82b54af1f76259baf4a334946c699698223f6a5777d23d7880b0f4a25c50ba9cc5533db2e4091a5b6a37951adc178ea22ea1b13d9409ec6e958926d561602e54641bf1701b13f1fa2737f2eea00bf69babf16c044fa8a587841287bc8d3a85a08895cff34488c5de522bb2d95f4db7ccc1b805744fb54f0976d3801e89e5a9c8594a3d0206718050149b3da3c1e3b77d967ce3553d3bd43d925577c2fc698014fec1a46709d509989510fb1470d7e0f655c86e6fc03f1b6b011fd5718fcff4cba0826de8f6bc48fefc1254f31131197e24210e8a81cb0cdbeab903f3ea1eec376616fe4e752e25ca7227b00a4ff7495e2b112b6d27e68fd476ac6710b45e4f9e7904c1602d3488431ed9771fcf335adf941f2de15b998ca0cd7f6b909697074900d41ce8c7d559b229af11fb3cec334784d47caec5ebeb8516ba763a37d2fb80240f79acea1a805fba31e6663c2bbcde25b6809c0ce494cc7ae6efd74017138b0d3c3f763f09e592fae85e2877f7ddee9f4fa272d98c70bc208a402f586c37b1e2e3d60c6ead7193105be20897587ebd1a2748fad3ec659f302ed00a28db4f3bcc8ca6361e0b0aa92513d8cf41568794bdc4dcfaa30b5cbbd45a0730576b4371f2c017bef72d991e6196aa451ffae0bbb0b0c43bf0f13e5a32974d698e24fb9b7d06916ba31a0738eb6ebe32d94b727a1c736a8563a7f1c2726c0a7c750f600194e77c04c7da3a40ec227e5e17512319299334a0a4345f3bbd62a632b33358eb60ea40520e761c7d8b3b51918015dcdffe9a8c535aa06e0f3b008953f199cca00897451d1df59439f1409e92bc9e8616c410d9672df4088413ce1ca7d647a569b576f32c9f5f89ba45b9cf2a74f50704a27b82a5c73714e46e54c5f50b47c98e8f10b3493abce54ab02f4b21502049f1c165f1d2cd717a75731bed0737a12257bdeceb3a96158f2f5a297a3ff729322748558db9eaaa22804baafda3035b970b689205c85c716fb16a2fc44b1217aced60d4be21c4ebf44c1d895b92177f0ff4b78b67bb34d96d1a09c9910f48f39e8a3169ecd1033bd8231241719b1a147458d35e7bdbc55471b05e80495142c4ef47e29c7f9250a3b64b5259a688b523ad80e393a7f0b8ea63bd92db54daa792896c9cf5df2c532a760d045961208fb3a2b410b355c1b4a32b87cc631a722066534186fd7567b3d800b150c90c2a51cc3b3c8245ec176288b157359e04e05547350dc93ba70b18b53c7f5f320e6fa276605f60d1d4ba6aa0de74f51678eeed3d171a8c37dedf2cca12bf591ccfb72bbaf966d2df747273f498283353df629150e1aef87a83ac941e6bb8660db7c9939fee9902f83607258ac8b917dba205e8897b12358bfc3afbb92db3ac8f2e6f832e274015a381402a6c5770ca38279f9befce8e6af2b35107a442f856299c6fa36e8ca33669bee627a22b9574f2d8f8518ac069bf380eb960e690cf8a6469929a67060a8bd153c1c7322e703c8f1cd7b3633aed5de47739af87018070c6fda011217bbc3c63a999af2646484b995a06688125606c7e559b9c907c5232d9c061afa5d50272a728368a855d67c998fc4b19ed670b138f10a5ce08e88ff5251b9d1dfafa2455263860fe585a13dd12696f6eadea367b9e1020eef72f7de431741b0228d46a0c6742deb3a62595af91093a0ecb9429cc33bcd3a3663864248534a40738491bc0f2ac795377a635689c4473a24e4f2b2dd67e88965beb8ee0a9c400d43143819850e0f983d4c53a30bc82e4d13f0285c610bd056fe130423e268af7101ba9e2bd084426edc36aee2e772b5344a59580c068e213d5fdefc76682f05063fe638756a242c7394f7d978b58a789a388ef624367537a70b9106681485dd577e358b88ca741a60f7de67e6ee45e4e95f1fa7376937902e91c7b67b7fd394cf1d172bd879ea98915578deb00a5b969c2e69dfd8277bc73e82e19122f2beb7e7cd198dd6e0fe139f6e45a2569221ea4d372c0468f98859414f8d0ae1259dd33beeab2616982537e582c3676d0e3f6c5709a4b97c4803a2e16818985871076335f24a991a280661fe43807245d71aa954068273849b6450995d22dddb7d71e45088763b53e9082e6410fb7783a53a0dcece33a7147c20ced3af1a2ffca363d33611cc915683b0f9917b92cba8c1142621b136d8ae62df9a2ade8d233e7b53bc311eac3f946087501103f50327e34f7ee7601a9ca4d7d72ef95bfa3c136dd81bec1f93aa8007f1de6d2a809283543264aa5b4d47ba53de19e9b7cfff0e03575eb1852146bbf286d1005fc41e3dcc6393c4f34d7e315f2ad756629cd090d468014bffc3b8aab8cce465244dfac9945978d1c8a9b4ac6263e3d9fcdf554e4960bff5dff954deb32a9526187cbcb9449a805b6bd07fadf60fcbded715e198eaf7c759b640cfba8a264fad9cded88f759d46bc2d5023a89294fbff91cf2a033193c3e213287de09656907621e2d2ae7fe8389ebdb7651ec089f096ad69830f95ab4229671ed3c37021e40a68373fb8ebf1d25d6d64a882f855465e9a738130bfc4be9a22a285e5901ed6f4a03a74114240a082ece66277b28d6991e98bb8f8f87685aee641f8c98eb3d5af9a7b145a1b5b2fa99ccb276f77a8d6db0b007edae81753f2227ba0e1c4775ca5976794f5bfb7ec2bfd616bccc02e2ab48f805758f74d95ee67be12b0c9dff871278e7a76d7dd42a4af77a4321483b198d769d6e5be7fc7fe0697c2c90764259cdb5e494fdc31df8df34c6511fd501812834b8223963466cbbf87359d258a6083236565f3456c2f52897e22fed309da9c03a3cd7526f1fec1d31aefaf7ce935be802275139bd29e9cd27b625b5e17559fe8e13d6cd93efc6af1a16572a5d711c98213db03580bc9c76ec2a7a9c71f35b8a3a2367d3571ec318be91b8918fa811e99c82c44f28e2d5caef2778cc677e760b4656d18c4414ab0022086454eba003847adcd7b03c025e713793656d4b7d7129b8925e1fe13946115064a49cf9c2b910c3352f7f4486fd14cc588aa6a65a158d9ac154b5b6f65bf14f8bc0914274fd367f7415e5c9d57b5bb75c2fa0ff7c2adff3cafc754cb1b4482767005a4d1f959eb781d10a52579fedff899c83de4b78c6cc959e882ad317bfe1dfab20a22c4aef7344ab1567743373acc51876cb2fc6eb2c0a8215d9c54dfd83da0b0aca01e4d1b9a5eb2e9094fd94c7faeca14f90ddf61b11ef45dfee1eab184266414c082bee938cd87f561fc7f9570f612df1d6868ea2922f40c6b55171a5fe05ecb0a8e7eb08e1bb2d407d574964ecbd423a69875bc775882d1584b0f634f630347f48df73208cdc63d716752df7794807b1b2a80794a2433455c201e3cc122f414052dc2ce4758347a153eb4d169e4ca5de17b3371101a77f0dd60ddf763a493a7b2da6be5b84f801289a8050cc430f4449016e95457bfe33c52a9c933956c747b94105d28ea282baf454fbdf1e50da0a7bd9a3c938f68e7b062576a71d4ef19280f6c11083b56b9a8bea25a116adf522fb05187bf25ba17d562f62c22a0a0f405bb4a11f44a6f9c877c2c63fbb42a8b251ef96527c937d6140b0298c6972697ccfe36ea8d95e756d4046a66015f73be306fde4f6dd856a50491093afe16f476c66ebf05248c427b06cdd8cad2db5f5dca199cc101d18b272fbb868d09ae7f038a734efc69bbf56ba85ee41cd0a6220c6aa2a144845369ceedd0e709a9dc4ad091a2633abda394bb213e38e69b4e802c8a91885455bc66fec777b73b2f1ecc607482a83aa0b194fc19c233929342de30b27cae7b06aaf7496526838c39e498359b8a6a96b3847a80faa160ab4911b0db6acaa023077dbf312f53b8873adc12b28f2046b9568aa9ec3c424cbb3d399c7f2be1f9d6e8c313388e85e2b6a253e089b7faa92d0a42c7b0673b542cd038e58e7e7918211b0997e21b437e9510ea760dbe602e6c6f3b485ff3d3138ab28e409bcae6877c2ecfb1a04e0308ad071e47c0faf722e1c5d2b06d7ad0076f54a82229a9b0d4529473f505bf4afd58e55dca4606364347dea7744b5488ac1527150eba837e6b4edc94e684b791e9334c27920f6893fbe8fa38188c29838e46aa636ab0f095c8bb77a0eaafef6e48c69c0a237f8a96b95fa8f3119252470a5e6f01cacf69ad8942e63685e9cf36988d6583f328e4c508167b6704107749bce6e58ea348670c095fb8b44cb4cf8154f23913959e2f956497e21244690112225a9e5888ce6157d57c5fa8b3a378e50a8f77476f41938e5b7e6d73671e7826b73409fdefc401178a235b923f3853c825dfa07df4b5e91659148e08f0a354fe07fda8ed5cbb9ea183df3cff63e5d8b1334d5545ca6d78d3ea04b451559a101e81320bb53437b2ac4f2a644eb63e7026bf63063d64cacb3d8ac980db2a5541feaf5ba2d41aaae58e687f621e9a94d29f26bb23a3386068b9b7dd6404d38763150ee4fec884979fde5c58d6dda5ab488115a04e35d9c0d9ef0daaee7ce582ebf81c687010e6805a029741030a5bc46a82e8cce663ad6e8733d8cc8091c4ea452e5450c73bd4f7ac91a5c2a7232182b10b3cab7c9b47bc093eb5ccbae21620171e433834a7c45ff012044813c69b58b4806da6716b2d5bc84630f60dec4db6da5e657978f3293bccea3f6bd9532dd8dd9918487551b2a05d00c702ea2ed030f75537aee49c982dabb0b38878675d6594aba92bf8cd9c3c2fe4d46de0184201069936430802858814dc0d387161ae91823ebcab6c5d3e81c9790581704727b97090edd063c375dd80e2a8f644d095ef2ed8bf61507f1e13b223c6f82b29d5ccdde2dad1886dedb0885b133c6332a7d0e2e02dc835b1bf54627b953c613ee0ada6f569b0d650518383abe8957d1658d9571b745a9c7396d652f6ecc8c2f4dcfe544f2718de2945d91b6b757bc2ea3d8ae3b14f82e563391c2c1c5a27c0fa3f116e66af5420473f23b800666a052caa4821680bfbc0df1a98265259c3dbad6b996dc24f0d1d38b1f5d20117ea946c43a39896360f8f65cfdd0a3f6847838d06f8dae8a29e557c22c201f42667f1177e2fa1d26a48c185ad5d204a120d492775b23e5036a24990160ab0400e8cbbbcde4ed582f53207bd478b00f8c39facfb5c57e08f67936a031052757b2ca354dad873bc5e7355b28b32f934d209691f771f4c99fcd1fc4743861bba1c2d564cefe140ce9b611e626dd42a344c501421393312a33ef24761e00bc906897d10146aad3874e05b1687d3cf9077ee440b52902c4c94bc450f3a56f60cd379986b3be980cd57b3adb8a36b79be883e31c9144a8f5cf6fb46be4116f949b9330bc233cb0071df8bf58f45835726dd92c5d7f696c0c6427273cf06be79f2206c43af9cbda0b884efaf04deba0c4bf0a25cb26a23650affc858cc0babeca8917bdc9dc70fe623e04556a3ef8dfda059e382d2ff6ee0ad9753623fb06de5df94f83317435045266a236906e85dafc681bcc4d416e7d82091ba2c94a572ea099347e3a6a21d42429b00728869d7972100b48f10510c9006874324655b696da925017ab663c5720aeb72ffb2d45a48324f516e222e6bbcc1e0a4c61c32afe550b2bb44e0f8f738d1e3f16d10c874378cc629de841f83b2d52655ae33dbc4e572d4bbfe90e2111b5a0ce2472ca6a3e9932d945ca0a4c326d2d0bc2956a736e291f3a9e450afb1ade5deec1a510f67d2e7be2765224ec86d2d686ee3cf35747130a80bb2aac2374517c2655338634e87fd205984638e021a5755e44a37f70bf5c16a37c609ca3095626fe48e5d32b68d45dcb136fed2ee92d34192e91b7c7bf4e6a2d4bae8183bf3483ff0281a0e4e37444bb5095ece0c8b4394112cd4263302f2fa68fdd04c98035bab0eccf946542a8b05eb580ddfea580ac5d5a20ca4cf8488c94afb5cc7f339ff49a6c9958b86eb8c93aabf7668e67dab6f66d52f48b01e1aa8115fe82acc0bb5843eba593e54eecb6d99bc4329af80a7f93b32b6a273142b1f42880cd590ed10f35d2bceef2c98ba0c3ebade7293f582ebc9473d42872b2c8765003568d072940f887a611e9c9dfae7e057b2e44240cebfa78f1d997ab7b178ef54ec450920a1412742ba3d1352e09944ff6aef28f6de0d3c76e227bc4e3c7c47f2ac0aa97beb30dff134db3f4c1d88d33e5103b68c432d1e9b257dca43300a0575ff2a4ff8b44719225b696f0e044ef1711fb2797590c7c47851fc235b2e9abe3b50145b0baefc4942a868210d37544654318bf0574945b47af22365eaaab6c8cf496969392de906deb67803ce1921384410f0a985df2f652f7093f07616d6bbae3589d905d365c842dff965c53c3e5dcd38710395b4fd5d1267ce618205831d64bf064906122b143bbf6cf59713241d5c328dad1b8d3812a0422327a2f944546f405f379e8c816115cf530198304afd7d89b6f46baa581c759a42b13d6482f74a640503538501356d7a4c385d164b74ad988d882aaee5d0eeda9d9cc5d9d78c6294985aa99e3307bf5aa8f85a378e2968f961b6bd0d59e6988da458e0bbaa7a644c79ac255a9f6e67eb09c024068b723c26e42eb7383cb3ff1df763f2ac7447bc1629563b3c9ec003a5df3e2f15dbf5a39b854e9dc1f6cf7f15f74c800eed8ad66c38077fa6b9b31f05a9b0ffe7f80a1be1b5a4c54d209fb50034812d655eaa4fc9262e573b989e26a4e9c6faff58461173f5bfe21c42bb2d672f904f32402c74a76449566d840796ee2ffec4be853030dcd5fe68b1c59844a548f85a184a8801a182d6f1af34860c5becb6d1c7f73ed686d6fecdc031cd97653137f269d65373220255bd93027fd378908d968e36e89f0c691f85aa0fb1920158cd9cb96c0525b353541e9b767ba8bebbe1a783bcc3e6d81cff24f1c7eac1142027bd897423a5dff630993b18ffe8b8ef61794b01373a64531c2019e2dfb11837d4d95ca71570028b99b1f462830fd17b8b8046acd9264bbbe51b94f916ce88006364955d8110c553fdfd59db9baaa310ae50f9081026f8b7e85be5631685de0a4213e60fcd14830fcbefddfca035a82f686fe4ab82b8f5c79475adc9558394b60f3ba1467fd7d61f81ede33e473d4b2838319c2f9758cd6b880d30946a2446b41950698a0ff73903be9c1c28e72e26ab9c4a81dcc482da242167204cbb046e54fef6a152f3df264ce05eeb450684a52a132f386b90c3b681ff37ff6ace8076492e92db39d21c285b85cad30b2bdd51142b3422349297fcf58fd420672b44e8e136c99997011aa9c01d4465e3dd94b50a530dc1c0307be80f41e025da47be50bd95ef4f033777451b2570067782574b6d0920a9a700ec323fb3d0922caa49284eca987df6bbae64bd1cc2573eb0718eccdbf14c516a7555f76419d7e6d991ea155339a8fa242c933691afba91fe8fe99a4a142c47f383bdc6c14079914c151091be675285f77e4b07f2bcb329b31ef665b1fdbc0332b3e43e59d8f9a4784f26546a85fd12bc1016b1de6dc36e748b3fafc2029e0b8e6263ce9c47caa8e4acb5cdf63a2b28d88e60b4a3378dc8c9712ff8e8e724d98d3bb6e817118f0727ba297ecfe84f40d345c390ffae54c1184d41a1a50ff2e5b58c482b48ca9957a7f40bd78614ebf332d2b9d73236caffe79c0f5a74e18ac87df0b1f8bfd78c02fbf6d778874473a88db1bde7e97552ddcdd9f383d7005efa6cf56ee0caccd9a17a1f06d261fb98e93a7f4a5383ce8ed3218398be49e0d1e3f906e974182f04bbc8e9346594aeae2dcf77d99aafb6d1888925694a5c07961db8a1bc1326528faa6ef1cab2add235fec347f63dbbd2bd567b2befe87be91e201252414e63ebecf5b2a54439fc0ac2d4ac7c3aad3686b4d55e2386f93809dc639c9533a65f6faf365a903b7c3dbcd737e160e179be575a7dc8a8e8fd0eee5380cde6ed8b773248e4cd2f1ae9b16ce5a118b2b523a1d910c8410860846f1b15e00cc3e99e59f84c7960fe5d1315af6098a8de002b8f707a4d4dde97ffd6f48609ffb8b22f56162c7cdc7a9c88c8d8fa87183f7cf1e5a1e9654597e9ffe51f36771d31d1ef2a005b67861033ab499df614fd7366373301f0b8cec0f0d5080fa9bfdbdbb33e146b6bb2047bccfb2642f5aabf06663bf60522a05ff6274fbe3a523cb1f2f09cc3abdfe4ce09c308dd8c6bb0d364f7a0ad2ff1c46f8417a08613b2763623f49ba6462a884946a054ddceeadfd11b84e5d6e6e08d74172c77ee406d14eefb49bb4acede151cbf0f5fb57ed5804e96a87bf1ce7174140bd0465534c47132d55a6c1faa5d039edf4a99d330ce3a9262ece39c4b1710b5fecd9c59556b13a83ec13e936d39ec6623fc93e5793767530cacbd24e153dbd05c5eda7946c384b5b3f893448bf72809399fce3abca3bef70062592a25ba4e09912e91237d604cf1c18b1ab18b175eee6c9ea9617f8579f4cac8481a8cbcdfb8599740f66db3c4e2d3d33558ff1cf98c4993c5e8367f50d2d8292a849ace096302337a509c4084ef876b63b93c6a70696cf9a44d75d3bc27c52f40e6b4807390277dadc09d99159e48de2630d7a25c1c234ab4efb2351459fe255bbf7e5686d635f04bc4c62fff6594861d7e6537350b2901886d701601e00fa5bb8d6cc2bb9bba15d4ebba77aaebf71d89f049ab63bccab88f4543e90d60564ae0cee4579a672068e993ef029077fcef2c15196190b7a4ca49f582408f418e7f7bf29977abbf0563fa5be84348bff285547b491c147233d148fccf9f100a04adeda6e0c55809e59177b21acc4c2a846a93814d1d9772e447fcc9906728205560a64a4ea337de2d6bf2251b00133e2f2979d5b9f8723052a8e5fa593b403aed32465b57a3b3b2597dfa234d8126616f2c67d7043f3d40fb6e84fdae8df0b0589d3e688049641d0621e04b46b1fe3aa0fe0e03b054711b4b235a41f4c1a20713fc0ed05d06b174900244fb8b3523308118acfa42da8635ce41f665b098dcc5abf93851425e346fa399a8b27f6d1dd96c06e50930240516f164c9e7865619628cff3b39d4d265549d428c1eb7dc469bee4346ef0cd3763550e64545da9be0644388881888e5bcca09b75f8eb90545fe744842ea3d6b5217795108ef21ccba514c1fbf6bd31aa3466542a380f77a84878a9049a9465e1143b72f8561f08b1fa0134f41a257d3c1303c8ee893f79eaacdbdb5fb9acc2e3c30a6fc3b3ccb3978e74581af6a6bc39f4dfbf6af463df3f -MD = 1a8b75dd663038289a4fbd07a51bd53c4b6073a3f0a9b9f91350ebdf095b89281398fe773f755df77956b1a57379507d - -Len = 78640 -Msg = a1a05f1a7861889d2fb94d2b30f710ad8d75136944cbe0d7c243e8afa58d6a47c6b4961c7751f3ae09fffe92920e14c2ec7c913701203aba4629d8f786c726d3e128edff14a66ecdfb3f00435445fa6fc556d3f9218f88ffe7fd3e1c0b5429caf9e4acebd8c8c2a20b619c67fe038c5b1fed21d82a7f944daaa76249bd9d3bd517d01b074920b7d4434d1a2618af902e0228c3fca658244d990f8ca42208239c42d4827cf114140cabebc2a72bb3cf9277ef008c1c8101a6bb1e0455c4feabc682d82871580da3f14a24db13be76112d842a22b11564f30118ba11852be899fcdfc4560f04742a2c28deaf915a601da734c16f921868c106b9ccfd5cdd2cb6e56280547e7faf72644d02844a86d9bda98c9d3058adf5355ca53d0e016434ca2a12f46ae551284342c279a366ca49b7db96a4ac2a5c7315ace4f38d9d48669d72f809e06c0045646e8e29540cae18d4e459bf2d31ae4a2a9d7fd8c2570f2cf6661aa5fd3d16709f8fb9fcdf64bbaedc6dddd7f9942ae33cd87dd3f45843ed9fad82b10a7d1b10ba4d4cd98b977874971d2bd2597c59a41304e6cb6cc76b105ef038164f57958c7e524ea7a1cd6ed0cd9d4a9a9511c1f676cac3aa73cd10fffcd742ba14f10e4eb343c750692d232b45944215f57aec422ed21b574f92b9214109aa87a1730dbd21cbbfbb2be021eec8ab1c2dc1e062ee04c3f6ba483deedef42f78643d061b418f903fd02f0ef07f1e8adfc9406aa964bd465cbba8f7389edff0b23832d2bf42c73a4e77bcdd16480fd893d0bb414b0a24025642b5e71dc9c8f562edc6fe81288f72f5981c781daf633d402c7a8cd04a00a0eb37b93627c778e68f6a42b2e95cb0e03b1b95058d1ee163efc4c574be8b18c72482fa0bde01b76a4297ee188044f22b28e870adecfc52efa880e4219f343520070bc18fc9dd4c29825c1155cd491cfbc4e8f597c4b17e8c71481ebafaaf1f529fbb55e970c401cc57a1f49458d3f8fa18016bec9ca52de05404bd6858639e06f17800425b1f9cfbc94ee0fbaa4b4cce2b1c1cd3fd402793589c075240b87ae4072b08c21354e65de14b1bb24a17e11f05224e756eea334e85f845a13a167a93e8bdb6901fcda79ba680ede2c0a17f96aff94af9770b1bb9e401be7ccee568bc9c1452d507f0a75c21d6a0b39550edda308b5888a00ba57b7c9dbc0c858d0a062c1a24b85427ad4958337b4c508bf59490bebf4a72529a3c56b58578e676281a9fb573628dd9830a5581c5d679bc5d6cd87cc9667448c1a6783262e97a098c9ffdcf89fb3a6def4620a6c778994aee090facbc052f55e45fecfa9b87c7acfd3e4e4facaae34dbaa5bf8cc95b379d70143d36e14e29e2c90fbaf7787957c8429f9b1d259711e0acd13c1912a6db1dab346a01806aec55395fe80f41e8b2c62469eb213ceb4b8e8c6f9e37ec820d3267129ff7e1800018fcf6802c3dfb5e0c6b45474338ce1abf242aeecd9d1756446b56e4ff4bb9eb91da7e8935b5dbe504dfdab66b636705db3aa733c26e8c3dbb80a73f01083d372a9b9c0c12f1afcf1547d1408103df944a97917500a70a4bff6eadbae65e336b4a06fa10ab39a0a2a66dd1ed6d615d4f75038ebd6e90b80678fd115c9496c31058e5409de8d5d6e8211783c617c50abfc2454612f471bff88ef47b2df4f717adbefe16bbb10c7828ed0e8ed267760e6b9a27637c7a9146a9aa1d9236eecb54cae3192273ee28afeb721a9c1a46be90db666f8a03e83976a0323eff7e6b58a5f02f000fcc876fa2b8180252a49ae3b8988ce665b026b1776590206a0d51e830a50a7a83cf642a7a1747905a7a4d2eaf2976549c8a1d4170802a8b79ec8ac11d74dc4e26836da05e90678a5ca445e79d168a81d799b331897a6a47d722fc2b95e20d45a2f08b1b77ace0b9ff286c56aae83234bde6d1c8ecd9b71b2ab79170c07905279c1ea4e1ecf21ae5ec10a8c3fc26d537f678604fbe2878d01bb42fd7c5c02dbcbf16a13be6eb7ed6cb64e375be58da502b58460e2aec172e5120c0a7cc3febcbb0df6b718d1d7253432a04b51607ab48048c6d4d55affbfd75032b29ff7fa81e1a81e8cb08125f26fc6cf3cb2cbaafe6281ebb546af88c052e6658a58407cd7ba30502918052ae159f3198ff29f94ef440151a6a8f50320e25502f62835fc0abf372a00a1c63c5e9d482db98354cf038f37a71d9ec3e55df01c998aa2510eb76b3d0aa7f05cf0e694266a4e0773cfd7cea54a7e7ab4a5d416bd97bc391a1b5a38b270738621eef5f92e5db1d1850dd86ccaba6ddf1fcb2fc0b89c0f6f09a85fc2280a17d5cd6d2916b0768983f11f91e42885503e9ddbcd888e04f8b6a84c54721e25f961b811ec976d533991505b70ef4f29ca0b874e49d8be610ca26e6dc4d2f5629cac6a63bcd5b562468c2b6801d89f163fd89499012bba4ecfb4d4832d6f5e3e76386ce9165c192244c6dacbd12aa8d926382e52900c121c96506322faa1b9181a78280885b5092198f3f6dd4b6fecf1218cbcf182f446691517a2d3b904868e0dfe3448876b15ded775f832fd12ebec9648d8fc467ed792a07d1c0be512471ea52d0a2f97d8cfb864df576342be162a091f0ae947064647ecf327420b558b3884a722343398875ce582bcc4d8bc0c47fe61bb3f211502f73f1c5d0c9848c36a30df04ece724ed2abe2270fe1ba72eb4faa3726451459e0f3b4b45c2186670321e473ac02ef861a073111c65781a0dff6266b90f43f2881e56224a091839221ec1723c3487ad756c98e127a19a6f2a95ea2e078695b651930413f257f42b598eaee271e06d9e98dd94152b28ef10f506d65bd660b2fb8b1be9a2d72548c777105b1a842a5d565c71f92f8f61e2ca0dc0db92be24285c75076b4160f792980b323a7cdb98e36f30c82c92cce311d4c5625e4527576233dfe40d9218554e179662e19bf0a28c43a65ed2d18c32f8ebcc59d2f59a60fd2c0c3044f765b4f7c0a930d4fa5bdda47e3d94507e15c814598315de269fe755af8a8aa5f3e19d1c1da41a891a85a0e869571739fb2228d0a87a34c45a90411838fb41b51a14841799278e727f06a2b4af9345f3db19cbca7312154a0424049152af03d6dc66f096cd940b258a475995bb72af129065276e23fb65c3a5b3a86d77462f9fbd616906258a2f16eed01bf81765b12aadacc248559674d5c1d7b319212143842f8c53e23b7a58caff2980784ded0a80a55932c56263e0d4eb08ab00eaf0ee08b55057b769d526b64dcc1d82b98909c8f9e2ef81e4f4285583bef6d13f156da1e145daf25b2af77d4d2059a3f4ca3d782de25eea47b7b9dc2e633ce6980f60f435f5642f69fc79649fdeab689a112402b3c0178b253f23ed3dbdd3dd705f666425b769db20c9fb10984fa92ce40e4bed1e148fd0e7fae4ed43f752127285cc66232482621a041b15d90bd97d9d1213bbdf485e581a6b7b60d3d83e21f903219ec0c51460a04b47c8d49ba2d71fbd19e389e3d97d370165fc6fa90e888e6804628101b6536e000fce1d679bd5d66fdcf8807fa7dcc87d23047a1239a29d14c355e672dec6edb2e17a16082ad66bbadb5f55643fe3490f310d758c562ccfaa0ced6380f41789d44b7140e5e6754a2e73ac9b4a182d23682e9c047fda7370883f9d7ac4ace1ccf4dc383099451efc2b5454a489b716f1e86a2489853d233a4fe9eabeb65fa24194e233678acd5fec41ebfc23bb934d3f30723b8704f49887617a5981ce82c562251bf75842e5a4b4f2b8e77b48331c65b0e5458fa7a75fe25d8f6e7685bce7c935d7f8855a3489c0ce29bb2dc82d110fea11d6f5b5bbe5d5a4979e0f647475c137b4bb6129306baa34dcebada3d7c7886cb6647be7b8d6cbc7117caef34ffbf4bb20b49e484fe6dbb740fd9d73c9bc898911726496048f4f458b6ef7aa85e6ce20aa787f200977cfc5d4755fb0894c6dffd1855249459bda9063f95c02dcc2d818b07b9658e39b110125c776d28d13b0016511c789f268f84849b05e84ab1c8d03e132664b74cd29c9b38875624b8eea6e4aac26d0719322dd9b0871b887506762ab418180138a84bfec1cddd85b3a977700c912a56986d4b0d6862816d80af1c57d0d5a8f666fbc245e1902bd229321bc15dcfd8130d0a8629aae041833a8b69ce50a63d1e3c93ac787f1a679382523bdf87c59ec7dfcf88335d4784520c6106961dd3ff002337af9d83b1ba5125d17fd370bba5f97685f6366be071615cfb9ab71da4152484b173bed49e4c927c778ea402f814313af47b37bbf33138931fce3a3a61a812c5c7a1e25c2944e1ee0c115a23c614f893e3bd4035c8eb5f1a964a265b51df535042e1120299cbc3e357affebd6bcdd4e91b6458c1a6c85f5728b58368bde36e8be9da55ae3808c2c3211197b7306650a465198847d7f0beb49cb85a48eddbebe08635b3484c2465f732de2df95d08f12c8784d7afa18a0798bcfab2e529f053b6df9934b91e4634e552bfc96b3ada41e9494c4de14dbebf6b4e249326b94a2c74beafe1e7f697b8f6495c71f50f05c7447519f2c622b670941bdd05f3e4100184e91fc1bb1c3f7892de5c307f23b00ba3d195cf446a97a17debce1134f46b574d2890dc1dd765fd22db680bf1bf04966f2766eb446b8cdb8d869ebed12f82b83745ab3bf67031cd0c06270c332b29ef113d344eaf6fbaa52cb3f615b3de7eabaa0617e52c2fcc72ba27423a2daf469eefdba8016bbc4c87c23c7e1cc04886b90e357ce2a95c5e749208609dc893832c73cb690b629a6809b7e7dddde1b7c368cb98843b533f0e59fe702a3eea1e092004d420747a5337b4747dbc60ff715c4349f8d5f7142005ab652647247c99000209bd75459d2ee00f5fc5c2ab00bf7acff11c171ed3466bf12ff36057674c905bec4f0f85b2728ba3e18998c8cee9459629cef3b978fa67b4c39f1de0917fdfb11452973ca16862f6638fe5bf4f37e41f5ad410cfea84217b8bf225c6e47a188fe98eb47252588a924ba052966df180f2edf71868132cc2ceeeb421114784617ad3ca0f30ac892eff028487570e5e409848ffb08cda3a723554acb8caa1e7e2fc3ad0507d994574c3f1032b0a1cc74d98d5b4824427f5583925a393f8dce9c59c86661e6201d284687fe5e6b57e74ce7afbde3697e2a69d61ca615aa3dfd32fe31f5521e6ca79877613f162621cadecc72144748ef4956836a9aeb4d392ed4a576e640211dd82a57317f04418debacf06b1afe330430ae23f2b524991dd7e3e82d95d69eb223505e9f2ab37e0ace29ebf12e72b85b84d3304b814c2e4a8d033ecc906fd7d81dad05f0ce7e1c16e6f827aacb4f5953ba5820db9bdc7d5db29501ba72967cee3b82d5ecd6feac30ca7a2c0e7dee969b55cf7e39415ff6b5ed2bd99d98c4fe62e18456d9d0afbee6ed327182b2cae080cb8bc0db3e413ae1913a3eec9f85bce4c424014e47fbc4b7d3a380be067ed7a2a02f6137cf2aaa6f5332aa0dd34368d237e45db0a97d4e11f26fe206e574dc8f581d07e59076d5cd87c79397f0a862b9d147c4b771aecb83ddda0df3dc477f9577f70d4b1ea04d7ac34b9411640f4b1a14b0eeb93d0abd9c0a847d0b57612153742fea0ec64161f57a4113e0a9f2726166d2343c780ba4b8ecf1b7c3f34c7257c13a367713d4b3dc314aabac2efc892e6c0e2dc79f4c016919a436a41c83e2f103a86b3aa3d4d38d6cbab3ca8f87efef88d743d13f26643af51e82225f81e3edaffd10bfe2bc1187a133d4d2381f271341b01eefb4354d9d23b312d518d0f57c2aaa9f8d5d152e6963288749b54cbf382b4b0789baf31e0e1a147122f4fbb84b082380198f5a6a91171b3397837b28cca9ea96259fda561c4cb51592505c7cc8cd0a6aead606569d518e72423f34f45f42215349ff75a626301788b9d79de383edc1b877dda382ec96f4bbe02504925e8881c77d463f5eea68be42ffe71a6ceafeebe15702bc701d5be088e7e1549348f18e5b25f0a210a75b0bccdb0b6c798c54eb7dfef1ab9e9e14c451c000cf67bcf1a996daab484c0b8ba29ed1b10ea9e69442f6d6070b6efd5622bf1eefbf90191d55f311c28c61757ef5218a746b7e784174e482cf5681a9948e294b1abf9cfbe9260841d3090183a9860d5bc22d57bfc103bf7bc7174721646918db2e49feb3c99c3f115928ac949fc7aadc26aed62bb771f0277ac85ff32a46065586d935ff532b1fd6c175b346d65c92721e7a6a4a79421f2c46d41cad6a978a30a107c33cfa552328b87ab618c1974cb4161a94aaaae6a4e0d7e50daeb9e01cf3293026db439cd17d8aa24568f61a4218aa09d5cab0e219eb9a55b3757cb227237bfce178b374b34bc486c1d5f8581b2656b2be091fd6f6b30ab0aea04780413815c88383ce7f312a0282bbee2cd3205388bfbe046c17c3bd95804fad8edcf3a7832d8d9ae91ee38ea130a3f0281e0a26cc9b463b1a26f991e73f26fbd71aa6f84086401cb7d632e04d1b0aaa6e8b2126aebfe72baea700a66c67b529a4ebd3b0da8d7b87af37b7d542ac706b64bd1dc99b9831449dfa9181a1748aa56ca31257bd8d706a33a5eac44e6f45c19f2648860fde85146cb3f4aa02f007fdb2e2eb636610cf42e9b33433acce1b3b925949f297dd83199f45d2861d64cd910c2db74a60b2089045e22cba0a536137d2c89a85b02f9bd2ba3293bc5d3d4c1ddcd61e9339db8ce0bcb55cbdd399a854d4e6a2b5d54f3fce21fcb0a35f03f3e2a99e89d46e17fc92c29f1cb5950b60f11d55fb0993b6ff7a7b26c1e17f33659df6c9717459d1a8450c221537cb232bcb10792c0767f15b463a234fdd4a56019e58f96df9a9a34075ddc0becae26b591162d28e25ce78c3dfc384a31d5ce6686224a0e7daba073583dc0d71d5776e798268e4c9fb33d7d9a5cbcd7428136efa87fe42779e2777f81d6b6ae6fdf6872d8ca74247ee4478fd1697602b63fa4a488e4a7085ca6e6018a1205b869aec5fb59eb25d80755ce6bec0dadf41779e22c2d3ad9daae5eb6a179d7f71c932c542d246fea91c26f99b8f22eabd4ec96b6319f67c3c4f574af06580fd20375c2dfad40400b77389a721fecb6b6cbbefee958e755adefbb4f99d92ea1df9498d62c26b544d0b1f03f1f48e18c17011418434b0ceade8287573cc1047566f883d2053e8c65816872c469dad998169d764e8bb21610a0a6e2f46067e173af56be1c309dcc8965c34793187eddc2fac86c078b340eae3983538ecc72cd8301d7d21e75ec7d9ac5ebf612f4dbf3f20da97fac097afbacf240628d498bd18da6a3463e9ed3a77fe90707abc49a2610956936a3ce2ce5f1130697599f5af379e4e1a2e671f95320194003c552627b04db2f1a55a2f1d467e4fc7b5a96863d2f04b96f7db80789659dbe71c764dcfcb62724b22a4c71d1f5ad4b95f9f5b8b7974d54336b39a44f36bca8d91bc3afb00fc16f868b9655e383b51a6d9c8697689a09da7917bd79af7bc026c32837849ff5f03a1ede464513fa45928cad0fcc581e7e73c6eb0b2eb01cef62b8568803d251fdaa038c25e86840a5db799259fe8f0cf645a44eed6a5a0192813f0d7dd3500c30e9bcfefbe7ea3e1d1cbcb52cd6164db77b9aa829d5b613f0aee1b5df9d210cd11fd19b90e9a1dcf57dde7c50fcf4c7093b31628818cb38530f25b676084e3b2873cacaab979603742766518c17316436adefe2d2dba25901cc93790abdde807d0e30f51699d099e342dc9ba9cfd60b85fb5f91cfc5415f430eb3646363d9c217188b83979657878af5c9c170cee9a43d4a06d7467fb23061fd0ee048a348eb3fb861dcf73734b6b169b42da6b97516a7c56e1d01b1fdb6a3c02b56832532e23d163c68fd236e0da0c62546163b7f4b0b911ec9c60228d75180922cda909f8f595ba38e73020d739e33a47487fa112ab1d99e455e1a3d7db264cccc168d97dadbaf1fb91f7e1ad2f5d8ba1fc09e329be0c377f791a2438f0f95609cffc323ab0a39374ecb3d9b11ebdeeeaf8ad0eb86e1773049264243f5b03ad6065cdb4aea2f2273b63de79b18c96dc98cad3843d3fd1e51a2e7a14497dd7cb770f77c157f92915b593e251fcfd7acd21ff17d426b79e062699a684e5dde838a44964f8a527baf789f959f311e5cc491ce1e47f034a0e4ec08083e692ffa76d7e902fbb44c32a451f10cfcd8eda2dd8e02fb405617b95377e6f9cc9ef57b7d27c703299853fe976eb569e41d24ef1d5224510e7bfc0b54896b35baf497a7c200466081405029b05855750106ab8caf649ae85967ccdf10acff83af74fdc76aedcee3aab32cf9199637f8f89e6ac1b94cce88ca236d7daf670aac53250f22a073c7524df9cdb7f7b0c5ba74ea49d5649326f908b6c92d5842f4794f0fb6028a1c9976111b1daa752f65821bf43112d7c00c02bc28c73733c625af4b3ad8ad506fac179f20031cb89a811995c308be3b5be76d8e824ee2697a0619eeaf5e6c1bf469fd9e106653eb7980488b5fb822b7ec1f0025cb487822e7fd7ee1753187133436efb7f330983455cad5a5d1278674fc1c842a0b9c3f859373a5cc9437465fb67cb692d24833bbb4c7888a203f31991245c0444a3280bb08d15755155af12802a41ad6b4966ca921df2be354e66d4fb7047e1c91f282ebce7d5c27ff81cf95a114e32ca2028b26217a8457760680be72c0845ae7c48f3e6be17ce85a9429cf1a36d93ba374d7593e005d8f8c86b30dcbe29ba55590eddc69637f412e7a47fdf571c4acbfd4996bffd97c32a14e4e654ad08ba5e23ee5ec506d2cd9841d7148bb2c6b26fe0a1a84ec6da9e9ba4699ed78f31c0396b6bf97a6664c596364efd8f3d1975269fe9fca8e24ae5ce156dccedcb3166779e0c304f5b6a768d43708d425c710d7079973686c6752321d665e2fff79407894a4395cc4c405afde7e0664da769e5fe1c1dd840f9c5c14775e683967ab63dfeeeb68c69cfa2ed589212fb29846098ffd5f2447fd2d95a9f52642139eb347448f9b996b04bfe983dd09cce3ea9f1811655c91d8c080c59aa2a634e72cf7b44d809e1472847b0061e31c242255e9958d219e6c5fe0ffb48e83c786da97e172a5c8da2104a4973916a2438195638c46aa370ffd06e310292ea26f7f1669d748f26f390849ed795d4b226729649bf0f311b1968bf3531ded22068768c3294300dd7ea21068e68a34a76c6e65b8857d666a961a604eb78dc911b7f88908608c600dfcfc828a183285d387427db9aa9c665cef85c24098c882a3bea82a0e951a312bf131a6d609da1a767bc9b98e91b3ba8fc3befaf17d36e381228193fd50553ade6628c47543e8b93951ed6160c32c2bac1aad4f88ee3fb353eb6a0cfc1aa545cf61c9248e4ec62bc41094bc56c66d815bfd3a0b2d734bb9c0214adc33797218a5edfc0e4ab0da37bec0a8139924e08443724d740a95c2be71cd0b4ccbf7247d090fa9c9d1f38ea7d06a10ae5064ebfb0d84ced444db0c8a0ef794a4ec1c2339a3d1b89e4a9e4942a115b4d5a40ff8b06038a57106ce91e53ea5cd2cbd6fd7171a3a11d5dd3a72cfdac97cd0bdac6e69e598ba9476f4b997a9e19e2b6778a9de17529db6b44e7317228e50e6c2c3b5ef44abf584bcd8ed67f8b2efeb11bfff5541224288f462b3e2226d1861dbdd350a24793f8b01ff931fd321a8b2e4cd424641b1e995c8ff9af7816dbc87328155812d0b7eef6df31585e134b1c90829db77be087b2356ac9020e89724a1ec37801e08689cf9273bd962cbf5f278a45b30b0612dde7bc6f1fd23fff139f634871ba75d987ff1585f497d386c5406e1ecabbbd22afce5415649c96d86e1d030fa8fe5d3a4111f27e7cba0d1a0bdbde663b35fb807bba8ef64dcdadb5b0575081744a0139338cabd5cc9913e9916e3dc48af63bbca050ef7a21f1ef07a8e2ee566a2a0c56dde3c4146aa19265f48c1ea240990847dc15d8198785d55ea6243ef7012ac903beabbdc2bd60032fb3a9f397d28aebb27d7deb7cf505eb1b36bfc4dbcfa8e1c044490b695b50e0974d3c5f0de748508d12ed9bfce10eaadde8fa128d3c30c12d0d403f60baf0b53d2fd7a38cc55dc1182b096c11d1ec9f171b879a73bd6ef1aa7825bc5162cbeba1d9f0739d1337c8142445ce645e4c32477cdcdf37e99fedb9236e24a3d94f0e45ea0b41a74762efe19d27555cdc89feef5b6e533237603fe98d8deae084f69799deac9043e86b830104327373d3427f9f55b0990b3d4c42ac2509818ffc5f122e0648e1eb5cce2c12e7dbbb41e8f21ea7ea48132b51b0b08178658b1ab5e508731f64b9163ae76567c6979f3f741566c99799440b1b29e409f6266a093834d4f97884784d0953a9a00efa81d50b28e254dc28ce23003457962cd090e3f9ab2221b02cb2082eaf832c4f89159b14a91bda267af42b975ca5b69ad8a23380d45aac34c1f8c031376c9d06a7dd0a37126dda0504685d470f490bbec31060542cf8c994f8bf1db7a7d052a2fb2aaad8f172d506598d6095c8abd607046e02ea31773a5f157779085d48edc2d790e580c2a54b98fef5be1a2558d612311d83c96e705ee1bca45ac9e450dee4e19242b5028fbe3b4913ce3a81da5c5ebda17b68505ea7cb62d84b72c962a6678dc15aec3d8c9d7bdc7a298d7a9b094b2e8c524d73acb57a8c85b3797908c4e95080969cd04679c93d9b58697c354d65f84090ef44e5088dbe3f3b646fbdcad8ce627e5d7727c3a1c0f9c3751313994daf60bfd4409201635c674bba39fc18c45be98a947ebb1ba42b180336bbc08d60b86f4792f33e409a0b905cf1543e4f2a8d8843d8737ae23ec0688004f2c69a2da7cec081d9343690303ce7904b1ece79d7b122afd1e1a7d0257dd28634903022f1f1a3476f2e63f45edf841d8af82740cf06af713689dd16beca63311db7ffdf2b8a784a218749250bfabaffa064e9fdd80b52c30dce026110d0ca7c0a9849b0b8fba8009cd966b0bc10e4cd07ef772f8701b52bb448b84db02370ed77cbbe562ec7cb113d9f4d15e3a4a9fc3de26f5450bc3f01e6646f3b1124eefc01ccce2df17159e290335cc317486303cf0822fad98d68ec00ab77c7b8779d3e2515e9b6b57acd0b11402646cb5eb88a17ab428165e7bb409fa892621a7e241a5e31916ecf669cd15d502a2f846a12e5b4563e86aa6dbeb61fd62fa8cbbaec17199a75d4c3a751fbb0bde8dbb6fcfaad31938788fb81dba30daebfea20a08dbae3cad78716cf84d0d813d2e9e779e8570bddbdf6fdc6baade5acb3c4cde1618c494d66d45d319e071fec88b89a8354699fbf325f05aea42d345aabc737d00ff1c69c746aeb9015f514927ae6548bd75b8992853fc79c40a78633285fd30ef191c832b0b9664d852142b019f18a05d9b3460246f7a83218a337b099ed43f0bec2daaa8c2e41dc542226cfe648cf83e3f75188c8451be284b6d57d712def27b02b8a5e675802cf0b6e3d4c707a79887e9e3890b976b7302d48fbd45e6059168e3233d8e2b51d98236bf2a049053c76121e67a47b2afe9d6adff76fa242f63f915d73a48ed416ca34a1e385c0577cef470e6b5e8dc056acd5f274a9fd446b157223d64bbc2372c7a7b68c47870fbf5675d4b00971e553c0f716e00dcfc31c3a992bc8290b21c633050059700d8c684e2717d24fc7f87a8c36b3b6258a6d8e118ebbb5e6fc5d657ec525d799b46c2c38f32e4e9be0784f612d6f836bcd92353ccb7a4befe044e50d707d832f1c1d6fa942ae81685be326e23380c45af9efa60ec7dde6be8766c9819f9df89ab51ea7019e1f275fbad7a581f1cdf57dafc4552a0c6d12dd3231976d9b0d84771fee76e47de68ccc6db44fb2d07d934e5fbec6f1219e5cb68143b313fb32d34ead1b33c45a9b4e48e5079a0768362a377a3d70067fe820f4e50bb12758a4418bfd137223cca3c85fc15ff8f2117e26d38fdef4ccafd10bf2ddf8261a0bd87bb98075b6854c96a76b731c010574cc15ad2101a9d619ff7a4afca7766ebd45ce51b790855b42fa58168aca36b40a86732eae44139546b9f867a1881687c582d5df33124328584546cb78f8fe703b53cbd2b824d69ccea712d36d18ab17bd161ecc6379847ee4ee1004be16ecdc9fba9c33af12475f1a2d3608cfe798711c5605a3d914ddc1817b305cdaa2765b901140bc239b0a5ea1d2ee923a6363366be926fff492a392b663243e4f2a2f7fc4fe65e6963d741e0e3eb8ea5d1a8fca1435ff2b56716a64ec4c68239c2c7cbb96d8884d7768390fa7a7018b787b92ceadd2fad06f1fb6aa9b8d78974217e2919e46045b57a9bdb616c274e03d1500a6b126a669bf1c0ce65cacd213c18af58443ad869ab78076a3c4176fa31b655dd496d78e61b6e4d1aaa82101239ae42a161fa57b76076af85b47fc7e2e93fb1eeaf73c1f52f718a969f69082414eb1f4c98a944f87d7f7b74f1b081cfd2734a85c3aeae5a7f015f896d061e1e75d72ea113d109f4a998537e1a5b0c8a945a09e9ada5a5dfb226b43d3be1b8ca037b58e7f7f90d738dcb1fed5709d0d8d8fcd66496e00f4a70e871f8328340ee67de83686faab83dd11fc707d241358446629a3ca6e8556463507e037a731c534908986aa06b72191c9d3315b08ba35485933bba0444ddf53165c3a63a39b6c14f028036b5c4a3d1164b4b5e1c6f82123e97a326d97c11c5823028289b5e740024d32114d43db32b6833f82c3c763a841877b8c84c19589bffb796d3c469c0d76e83654b265f0bf0ba5d20c538273373bc3a64e786a219414f04f3eddde2010fd61b3325d2b111e8b3cfac72390bd5a6d1e88ecdae9fbe7d1b1f29bf10529e7003a272e800bc2edafc93857b67a889e7008a1ec0ed98ae180b0e1e91834001c29e200cddda06ca8f3db19128e989b5fcf126fb096b1651dac6dbbcab5e3491cd4e9ee84c85194ed01d2fbac1e833c3ae4bc70ff04fa00f8af58ee954cab6b659bc22ee7d2c7d20634417e78d8b3019c5b67241bcc2bf50f23f2d8fd5ef4fd82d8fb706b7f5b8aa105b7100d5fb062109dc3179b7ebfa7cd84dc29576f4865f1270621844085453a10a43ece15f404142620b9f27f3d9fb05c654e37f01e4b4d0072d0c6a8ed982dcf89795f9e063e337f3099c5501e4354153ec613840f03d2ffb1fca72afcda18bce74e265a6f96eb1353156893ea493539c91f7e9d73263f7f5403ba492ba177433e3bb6cd88a4a78d08db60bd1a07b05484b8dd9ee328eef9c99454760274c60d0ea08589e9cde546d25a422e360561d00220b51ae7927e09931d1a5409da8164d94b16f21b9940db4ff09179c6d8d646b1f59993e8e94929311c8045ba3936051e69ffa8968d36a4c25cb32234e86a232495ff9c7f93fcd333f10add9c1750484eab840fe320434de9fd4bba18bab9ffca906b971438e5921c593e8e17fb6cb8fa7e58ba79d8d3311730afa3dad63227245342063f3ebfd04ab37fc9b66be7d1a250f21ac33d72f8eab5737203b15f53c27d277c691bd8284f7e63330fdf5e2cc6d1c4b367c4af0fc4fa2b971bd2bde0157c906c1a56cb14ab387d3c8ccc4c14e86f6516dff4e3d0465d3c959bc0ca669dbff157db86050fee602258a5c91e44778837b78444ce04ef7d1af00bf20151ebd5eec2251002748993f719f34c511604cad117fd3aa9f810c86b38d4ecff2c505cdd3d7f9b600ced325ff2fddc91141095a5aac35d24345add91d29f1810709b93311c437eaa13b9c9e1661dd04ac91b7749f25f12a9444e1b234fb319e1a8fe37aef129302d335fc92ff5dbedda9f95fe228128f1c5923b0f9412c958ef4028a89b5e99567 -MD = 8ca103dd16385714893331aae8b98012b40a1c359b4b25958843093a1ed2cd36a58aa0054a6b9e0a18b08836ba6be834 - -Len = 79432 -Msg = 068a639ec92623e69af04c1162fe2e83027dd272e7f72e4adfd19a502b188885d57d6fcd449d08500d86bd210c775f1eb4e81717a3ca9f327910b18deb6ec0261361e7f80a6f1f67b9b0b4deec8dfab7a8c83c5bbfbdf5aaa1e7429d75a59829693eb2674623cef3477519922bc76817892528876455987bff5c36c6f24576587e1dba621e427fbb5eded483f0ae1106fd08c5e2b91cf06d3a7a73518ad4c479fb05e631ba539988a7f1cef964c85d4bac78fab6e7996647fb46e28664dce95587ff1e1b43de8422cab8ed3eafa0b5b0407daf49155460d3e9ca6baca9e44db4cb124a69e16ca7516e3b1a99f8bb7ffb5e1fcce56cd647d7ad0df70c8075585e6e465364bb846cdd3b813e5167a324f5b0673ad014a6841cee176cef1216721a19a31f51faae3a8ddb923faf26df0d66de5cdf52344c7d6a55f1b49b874f03b17432977bc5727a2af37607fb5af7a1169006a4b5f4519c888aa2b55906a873ec26faa3294559927c2e357c7d2e7347cc6d6e713f7d3c484034325970b7aa2a91d8032ca2a2eaeb4b31d8887cc8dc69521d9b2f3af795e858fbaa862ac3dc91683156182f03aeed5fa767124250ba6e6e4995c4ec8ae5e699891126cd52c60e3bdafa5118902b008036e80115ef93bee999651a9e5cb2a9cb836f20a28bf10ad07af7bda573eb8d7586653f3eccf1c18ab4121897988799b694cc5cf197e4eef0ba56461ed176fa0740e5b304115bdf1b43a4a52164e91e216231c2029e272063421ed3cad552b1fe0c7145b1e35a8062ed24ab82e862a0d695a53a1cc7430af1b9574bf2a40918229110dd8c6c750c295b9911034e79879bd631ac883abf1262c80a98de6923993a78ca63dcd434eb36340bbfecbbb73b39cddc008f2023a27d163ea1d64a269b1068a7bfea431f855121839c8559a2247821ae1e77a1f8210b4cfb4e226f9c866a0ab0dafee0bf4244ca07921550c4ab1f7aafee88e4c5f7d411498709010cc11106ec9a5fd39b8bd6d6a288e6c8a536f882e8590c12128ba00e3134d428ffb6cd0364e857453bc6ceee59673ee8cb2fc9de60454952684737eaba3dcc0bfccc65a91ead2c5e285df5b9361566d8c0fc5b391f9c88cd4d92614eed8a36d38b6ba3a224cf2745e9b613e0407ba6c10c0776392e4411aa4cd4e5e2d0045da734fb4d937e389023063bf00a7f8145cb35b6e18694272c12ea768c4d6e9188b080e42c2732ceaf1f085253e0fc108d1dc57366c9592b212db1de1e38cc1afe16f68f08044a7bcb6276650509be0ec4e044a5cbaa863a37222875634af48808001f62a9d2cd252e13d8dbcf2ecd65333b38b3d9d0223bb81ad7a3222cedc1ee9681c6d63ac4b61e5bb71c77f732fb22572b0758e43515ea3c47d12585bfaff802a62459e33615e4629990c50bf4bad95ba408108dc8b216b1ff6532fe73396e6916e2f8772b2ac84f099f83131b889f702c1ec974e1f983a087c9123f0f4697f6576a7c9bacdd114a8cb177b6b04fbebe4ab14a418bd27b3268638def9ec0bccef322acf9bf16097dac2e6a9dbaf67c6c86295c9bcb25448f299d6ab6258e251c727452396fbdf60ef07e2570416522a368efc72aabda27de52de733eae981a065ac73403c1ba2125e0096dd64e84f78a7969539732da6c486c8d6e2c40c6e3b435821cfdbff5d2eb05370d77e73b454a4000c78a680b5bf4fe14242be400c74f8a0fd0d270575187e671cbfc1772520a451cedaa56563c0a90da5de1a12e0fffe2d51828dcc6e5220c1d710de31168f311268ba003a356b4aa47e0f67f3804ebc43cbea80c2bd7e4fda5c5515500cd2d2b846a1378dbf218d5c377138606eb3cb8ac88f9076f6ff4436f90717427c9df1ba052acbbe4585e98b6e8e0bf800f19468d40c3d578f57b66e59914486ea6316ae10b13d6a8d0af7c88fc04318fb7abf747acb07f30b1a0ec6daae3dabeaa4c9fae5cefd00ea23308a17b28e4192a1a524295660c7eeb8c5f71898631fd1f5842710ee9b2fd1511c46a2df3e107b18de0e7c28d8449ea664658ffa455154b7cdc91e9a8835f72723849da0e2f42942c279cfdcef07bf7572a8ad4e54fec77e1f476b5d54b1b017deda74920d6b11b20b1ca0cd157fb5a87926fd0f3266ceaaf12883a1713190a5b6aed43d2df3b8e9106dab83dc1b15b1d066fbb73e27cee0dbe2f4017e241d533378190cc51ca34a6ac32c9ba368542420ef25c108c03c92381d38e7cc07baa2eddcdf8b5344556882d3c07f2bf5f561d33607c702bebc41ae2dcedefb5afd074e337433591933c5f115f3a8a6327e0d7fc21e33bc71b271a6ab22518cac5902cd12938f66f9e2e52de02292d2bc52897f29d591a697b3a4a9fbdfe9e06a5327e300aa09dd64d74891e8f9d811d2176869b3ca6b417f345d30b65402a7237fe93864243d5ce88552d586d5e2e442412cc826791b3db6b8fdd3613b26314643b935e39e94460371a66150434dda5b443902c84e4bcbdcb618fa72d1df2f61233a63d565a9293430c5bdcbce7364aba53fa23fd657ac4fb0311e61d497e202a2cf2ad035d687092703535fd3ee03a1f8833ee38dd92f8e3bd8c7b49feb098956fa235a8bc6efd0d911ba82f02847dc92b63159f13af616cd728ef1b0430683944dc5eab3d4b449cb636bebafbc91ca283b12098d177087c980cc8f922a59800f2c8ae75a9a74d2826aefe06f1581e91da46988ddd92f4fc4961914d22b72ed1c390af6ec72c1e972aaaf17bacd88b7d764a05e500a92dd5324ecf7eca0f3493fd59e9fe6180c1d30a521d82f3f26b50a0e4ed080264bced9bfc0cf4e355b130e94ee38e3d4b3ec20ecf0c81904ec7f1a03cda5eab6aa82ecc92cf173431ae8fcf94258425369b4e7e4946e24993a648be7b534fc364f97f0c39a14f87493298f756374adee8e25ea1e7510be769113d42c9e14311f9b8c7a5190904a2484533a8baa246330a1bd9c0d2b766327a0fb8734d0aa25ed2ecf0dd598f9e4ed4ef482ce8ede2eb444ca923320059f16ba8a19b3059d472969de1fd22bb85539539bfc909a085cd3d7fb5122eb24eeee7e4e00099534115eed3824c9b162179352a80c8454396a39ebbe5d5ee57acef94cc5deab182510f8297bb14ed27db8859cb7471c35f7f330e0921b39b76dbbd1a6701a3a06d6d27f9f0749b3f761947ab22810bac7ba746367051f65d98432022beb2728d9cfb27fce7952bba8c447fd33a90e0272076a3bef85de45b444cdf54d7599ea09865d53283060a85f0c5f879188a365dd554144da92dc6be025ec457bcdf7003e811f944ccaf80ca2a027a44c655567622a95f8b8caae3ad5ae195d4752a30db14695dd9ca79d7aec365cddc4bdb88998fdd4d22a8ba8551d53d1b7208242653a5d3c89a864a555b4255b8eaaf0213eea558a6b70546f2d2fada1eda7fb4999022b9012e070c44f92f3a0516fab4419eeb8332f5ac377357522066b3e1c1d3bd1382d13f55a5eaaf137b7a0735d858d1eac4b881a47350086478baa637351a000096007279ff90a67582e0666856a1ae28840206f5e4d10eb848e35b88f7b781725d56717a007d06ddb6feda9916645e2f2cd62aa8713e91d6f9aa79dceff269f13f9be46092fbf6d37f9e0cd2ffe9098722fd95c401deb847f4d5a93c0512e003a49672349c509ee04586a31afb77d5b6d03ff0517efaac92a02c92ae21610d32f410c4fd05c5278b707f487af257ed469c63e358cfda953f6479dd3d2b25190597d182c3b7a2b95d6851a3f8cad277bff03315dfdcc69ad6aa8231ee0ba72c04f5a1538e992f7bdd96c45b9f6c2e9ca733752ff18d06e3e0d91037cba92f6cb87648df6793b4969360a01974c0b38388cdf2d893cae199e558eb96dbed0404a8838dcf558d7832072fac8481aeab55e92672b9cf7ba1e46b91dbf726c0701a5d8239cb616fc475c26cb145cd1f5c3953a6bd7aac888cebfceba802b508b9d75ddd147a9221e08a4b7d770360f90f584db59ac233d9ebd71fce195e8faf286232fae685f08c14972accc66743260dd95fbbd2396a5605cf5da2f8b4bc9b05e4634377938396a8c5e8bf66197d8c9be511202d885be824fc3cd00bab45b69884791e8f4d5428e33b0cc01ec0161504a4ec4c73570e758e8646be1bec31e6286bfbf5f55b6a2b0e221e36b80417a88e3d77a76c4d89e68c9403d5ef1e8815ffc0712f7264cd8571a1a689fa8f872c83d93a9ae013d624664efa7d51ea532a63ac6434ce10862054e12d20ad066e8b299fbe8b9651fd1664ddb31f07f8990d9d575b6cd1099ce2ff093a659914d4acc9b88ae357ae04a3ce69b621daef62a6f5e8de3f42f417b5b94256bf855fc277aa4b270bebd2f5b5eb198ced9278b6ddb2877515eb7c0080ccb408963a8f3fd416811b691a66d7330416bce9f73a9e9a1e5ea95692475e2b7e86d853814d54ab5382f067ac12b3046188ce7fd0de21c57f92016a00fd399d18e14e5c204108e4aa752d6c687d90124a964a16e70b48461e4e06b9fd4799c0e1ecf31adf12636763825bdf175076440768b915026a1a0543b83eac51cd877b23d04ef588686d1cc6d3012a81326e82df27a3e6eaa29fea36f833a9c3360ab624b4e856e1ed2fec1b8da7b46ecc7eb41cfb8ef0675cdfde3e376d191c2a2b592ec147a3b447b0bda9dbd6e5a6c6b1c2040b049b4140e3c7a49d73652453f14d871ef546c71ef879b9e31425f0c70c95e0808c4f3ff5b28fb151ccf3a356647877f57aa5e21b100693cdecdc16779913f781af742a24541caa7c032d61de8cc3486b5c2acfe5ff4e7fc2e372de7f5f259337f372ca74d258da459d7a2591721640aa253b5525cd37c5ea834f118766b4facae3b2e78e332988d52441b9171d5aa9da5c423b8383abac6c53dc7736b7a67561049a49197f79fb5320ece3199575c9228aa64aa628917d70db7fd73559e54c24e093b7bebe2f7ce817e26c3fe351e9ab36cf4a37c4d08120a4a1fa2b5457c73cfe06fb25f93353bc938b1c300ed5509de82503dd6052fda235aba9c1b1e62ed1e659dbf5386dc8f61b4fba951ee8481f29103c4102fe3c1e1603aa9f7779c80a21f620d781c523bf389610151c7417597ff8bf0bb5bc85bdd013c56caef7de1036439272de23ab3e70c8e4590f600674754552e27e741fa6ea42c4d15e4ab80badaaf86f566fa99c4e4dff08ff945d98905fbe6e670e5303ecf76d7590599e220f911b75f1916500578d29cbf4f764ec5aaeca58777369f95f9c8a014c0cd87de262c42db871279315f1294af77363995a9b4048b689a9b2ca98e11c984bad45b184b93eb2f7377c0fdfc92c0fefa1c6188ce6e52d395a56b5533b6f7efe67a2015fc352e80cdce4cdc0cf1a4554679c1dea86d8e36cc60ca8355fa1050d4cbb5c5ba90e609660f3d8fd04bba088fd43f01ee6c8e00833fd2ca6175b3560a5b949e0351c247e09d0b7fc30b82874abe2198ecf5e2df6ea51c80e294517e0b9c351562d243cad20a4f2271bb8e500b9a221a40842d11f332f05d55e06b273d202fa255acdae0aec9612e58c64e0156eaa8fc75b1bd46a55bf6a637e470f02369ecfb584c0847cb7cf9e9d4d6420991323eb5e8e923fbe9a2b7f2051af34762ebe556f72a5c6edc7771eb9245fad76f034bed36a4e19054898cc759ee72bb5028a16b9ee237a4466b51aa0dafd90924d068e8db7f86a26a830dac82f96fca9fa2b99fcbee2aa69dab11bba37e7d0d772c0e6f43d373b09021b3082ca65ad385ec966a1ab8b5d436b94a86f02c5752ba68b4b70c3b493969e81560c38fc484c758b060e7dc69cbc63864a27053e8878338f476913167ab5c389d5cc4102d4cc889a00adfc3a6ebb08ae884a06fb0fa55ff36147f306f84ebb5b342cac205aa0df1edce5f090db29a435ea40cea4159a73e022722c2c1649cc20fb9343fde1b0c23e231d206febec7d42f87125e09f3fb67d1053862fdb8e3f00b369cc4271e479225cbf5580a7eddbfe3b46d257b77c72f3b550c8b850055c22e315109612244bf30f32576b161408913a259fb26439ed6999d2bc6e7b976aaf1301d7a2cd5882d9c4deeed7404a4b227d775299af5e7108424228fa662ab3cecb94e90da96864fb042be26c2e75ebd98da5b4b39ed344f73a06d50319a77da894360d80af3c3a825681fad3e77e31dff1158da93c80ae5f09888b329af71165f54f0da3e6bc4b954348ffb4734e655c3131a5228e4df968352e112ff300b72c7747af1d56d1e15d52e8bab6dbcccf77d660c3c79e236b39486231a12cacb625a087bc97076142020bc9f08226dfb6596709b14073e84efbca8bb1304be25879fb75fbb80255b7abf6536cc05c71642a6c9635341586e8d541105a855a8ae3500d7a36294e9688809ceff51786691f116e6e184c8de382f0375bf448608ba0d160ff3391f30bfdaa8403522fabae3036f4f9212fe2e9637433d3472166cfd7257b6abb99fa9b5e5136f94cb1d32adfc2869f1a851c7ed588bee01ab6733dd073e62496e96a30f29c3b37ab4506c473ddacc8c9f8448c1e545fea37b28fbdd2e42a968c284bb102b41a2737924d6436aeefdcf82e60fa87019e5964bbc23726a0ce2765fea505d6c15b2fb741aff26e5ed6436dcf7bb058b703966a79159315ce5a3ee8158116b6ea87b9f5f935576414ea65f1849a96d99d170711968fb9e5975645df12e6cbea57252cb763e67960f9b1ab4bf5c79452dc611520b73992de224ba310a0dd0cb931bdf0c627ca41a935b57b45c909920a9b6928618619044a98c1c043656dc16da0d76deaece99789ef7e3ea5a869784a03b8a99aab3af86f203e0442099ed24ccbfc0bea5a4c644650925d343ced2e5a3cd5fe94cea15797e34cd7d43578289fdbb332901afa8e297f7b3eba2a9f9c826d489117965807080872a1c09104a9adf7854aa2d4fbff7aa4c14bff1d87ab0abf9ac9ebab66f20ab839cacfc4493ec048f9bbe92f589d81e9eaebcabbac413959520dd7b6d3fee71b27bac9774fd01ef697ed2dd4185286748085e4ac16475863f8c7a45fa715e558c6d976511f451028e748366b4305d06d0b831699cda6af07155e1a4deb1e4e989e909dfbc087de067235cb9be29ea8fd114c262ada44866b303a0129a70168023545081c3a7cd0b9bf1ab60cfb04564c1c48dc06440b25b7d1c3219ae1a67cbf15617d5d960e2e695660bd6799212281b3df02d613e2d31480614249a3f5d1f6c64dc566db243f3dc070a954c1dc53c45f795e414fb0daaac67c2bddf4d6b1d0ce70a8de11a54c5e84b0417a7d1d333fa67ebaf0015f80a02a7ca5ffdd316275b731ed6d417b9df42a8a4f82d4cc08171356dc8a31d60e1e35c9785764ee2d0c09fa5ebc728d7a263b659913cfd21b772b698cb8e5fdcb4e6dcb6c8c94f55abd4a32c173acc32b1c3ea9e9d67415b4857820942227bc01565cea4847722e31b20440df3af705f7ffbbbd0573cd7e1b6981e1bb6ffefbf65e8a8fd62f0881fa10be8e80b75c3b28f73a0bb591e2f5974cce15c84873a2f48f7e20dced5dd7fc0201836b95e24d042b44fac3d8b9637156e82584548c994110c0072328791680ae54876a7a9223d4c460f2f5f25caef2ae5677b73c53c8250ad8aa73896528ce3c3f02430f72a6dfe9175b1584d3c05f7da07528a7d018eaa54f7394b828f32ed54a5cbffb8dbc6fc3f09ee939247f03ea4f86a13e0a6fd608abc94d5cca61e8a1fefea6e6e84eca7a73213ab659d5251eea11e8a909b7335c7713671d545943c7e24ec07a8d453935284dcfa67aa90c40f980c78fd5d647c838bbaba5cdc2886f7fb5d55c8387041c988a72af8de20179043a039877b65b757828de993d8600c35b9cac37d2fe73584a41e9799c6a4cf194a7676df63db68bbec2cba4ac8cf0e800690eb18390ce11c6d8fdadae2835cf302fbab65a55a23193f1396c23bca309f686c3729c275c6e95b976f3cc04043c613ac31aabe5658f7e1def99a9fe604cc359932328aa66983e4a1cf2fde6005fae304b42f2d448ce07aeb6d4473a6ed9f14c466c2c0134b749f5b75349b672619f791ad6370c9316b60c56c5045816d908c5a3f4b2140ef23f210ebdb85ca269bc7df87d80748e8e149f9713e840a0748e2e7364c1cb3c71a735ead953c1d8a08ea5addfd7f4815fa8d04166fbdb54d10dee7e63620e055d099b134f21cb5c2d9c5700a54374b3b0fa051b68460f79190c6d8c9a9cc5b3deedba51c62a6375396efcbb77cddc6daa93a7eebfd0c55973141365b177d88c1bdcfa6ce777726dec8dfda4fc7b14f775fa1f8213a1e63a08ac48d04ffb2fd93d5ec32b590fde8a6d80c084dd57059938b7d49f0dc25865005c74971c31b2e16bf97d57c4fb9115e5cfaf22c269959b1c532d0d543a052282acff80c2204aeece3790b8d24171557b03314851b8ad44485594939111d3b9b6255154e6d0dd468e9f651629eb689458a3adbc354c36dde44570fb6c50ac71c54ed2da334a5432d2b9623971005d18a3378d47142d16ae1aac280b8cfe7793d7afebdc4e9598fac20ef0e95389372b854838b1976437ff1011268c9a231c6713d10220e2b990e6872578ed768de013265d16c265f77f18eefcd1453dc88235a23b817095bf233e4986600e84143f18adfe8f4227f1d840ddf591001ef39345ac75ce920fae3b492fba111422273c8443b30bf8845729c10585ce83e5af36de5808534ef98ebf506248f4c7faccbf9d0f05f2ad25335ae18d33f0973901534ace7b766efb68969b0ab870eeb40db0ad3a7bac29b18c52e99d885f04c2f3d3cf3756a1b8bc43aa724d93ec53f8f2f7faeb9ea134d16bfb215f0b8492298c9cb6bb223bf6e527e21d5660d2bc6c827dcd4bf43a962dd73cd0f944c50916d497478166acee1d1c26e34ba789f2bbc5286d8207dd166cd8fd3f93bb8b3030d4acc9b2aa5b690d2b5e0e55f179bd8bc3e124b75ff37e367626b756f93fd02093c4867577b22e5d5b72e49bc40ae4858591381282e59435baa07e698547b18d19c5c4f3531807b4b54bae46aba43150121ef2bcfa19210eab51dcf5e70d9b206f99cc53c9f5baba3fcfb37d2baf6a9472729add4ff9ec6c52221b22a8f756819c26e6be5eb2101803e73d69ce9358fbae73789c07ecbff5b5fb82174f6fa957a856595c9cb5d176097c92311bb8c32bcd0bd322ac596051dec558fd64dc5e4b9c0f6f540a67c57b5774fbff9a8773ccd721f597c5aa9829d566e6fb6fa63b047f3b6ecf3030b3d0f7b9c0f8d4662f87d59c2422db462f25a0c8743af934092b59c19ff49779651df131294650bec004ce66a9eb7595edec49d149e289f08f6733894aecc6a8a1094bc67e1196f8efeaca66cc1b1bff9a27d86baf1aa8419761147bb7de4527303c0f5f06802f7a82e1d184d4da56ecfd7d537dec0add8fe7c0047f2df39d5cda5f45e30abca2ae4193eca80b4facc4df97c4ef49dbb043492d0b7df65355b1661af33cd2ed77fbf6a522bab7a3a7ef081c32a90eb5a9c38250325d5825f58c9e142351a63937c867c27ca221fdcfd540b5a69283bf51785dd080079c92065748f6dc0acecb697f5d9000489186abdf4f0a2794f0222fcaa156fe6309c10f792d67274f91c99587a0b7b8954e66c373fcc2bd969c05cc221589b25ae9da985a15100b08395c4448f8e0ac6fa2c49ffb10867081d091aee68312a6d282072962c898901d0cabfc2a2db3e3c0d3c8c8dd54fd493bd4ee5f80b198e2b41e6e4bf90da9be7653df489506d7656e2a9cc5838dd04fadf043675667c46ce903378587ade89efc551fadf14df53a62ef651e5386a68bbf6cb84cd26f3e4e58798b607471ff37955c94b5a6c8b46b856a4e5cb70628035a8f77985a90ad90e8ca9263281e96912aae65e71c40bdfebee37c0616d4fec164a2a5d25891b938833c73160c7f54b5a494bbcbbb7cb7fef4a11aa4d7b9cfcdc7ed6d83333b0b5010195701865be2aae956beeaec464b7011ed4ebe647d432d69b8f53253564bdf76a765adff79e778e33c95cb1564215efc0f40dd24e803eb344b656720aa21ee9f2fc6a1e0a20c28788e69f7a09fe0cf9d4f1a887fc1b70f0eede6ab02fe338472f8a1658f9ef9c1929361f4f3bf30ccdcf40148ddd2079fe1e8a084611b2ca9d74c1f827635554b1894a64c788cbb5ca1481fa4a6e199a59482ba7da5cab265b671687ffb2fc9cff2d95f8695ce2687d4919c2442b718280f045c1b36d16dc1f7b0a3e48853fc5308aab52bb44c1c555d18a0501a1c2a313ab6b0e87cf807c48351f83a846a97e2424fd0c23ccf43cf242552b194d877c7fddfdb6be0092577409c9007573c4181880fd7d3951f43fc1200dace19b2a8f240c8082cc8ca72e017d993d66891a33ac234f3e72604c5e50df0612f127365baebba5db49d059309f04f292c21316414d8044b8559467190fe3e0f5de5e35528e6fb028ac88033fab4477893e9e42d18b2c8083595acee07ce330bdffcca214319d32036af04f8ba4909ab922871a64c38c7517f43ffe55263157e3dbdf071146c8cdf41bc588a5099dde8b247a176ba534b4fecc907fd77a72c8f00921deba1c86d6632564692c78b0b5779ac3c466ae99a2903908cdf8081c267afe2183af413bdde91e494b82406da2271c00abd62e3fd084c00563274d81d2dd214aa041537c56ee7d00ba371f4946e22ebd284ac2abc1450812c9f5c96860af2929bf20a1acd3fba8173fcb63c7f6613965e4250a51f74967cd8ce3fa2452696c3b3abdda61c79955f946af9c6e32fcc2774a0543b6e51a757206625e4a2a8460fb9d896c1fc43fdd23596447a0af4d508dd46c2d6f0d2097ccd101744e5b88ade77203b55b3c57c4220279e403bdbb79f61dba15dee204651a7731baa5580eb98b32cd6498a2899171bc61000bd0cf956c708fab7b062e64075383cfe3b25f0a536a36e85c994ddb9ef1ba0a2d9b02394d974d4ce7ec16fb001067f28dfd2226ec82e0cf1b830ce9164cd580ed7efbdc05dc73789a0656b091186ee1089ad07593075b7759f25f6054185402cfff050441cab2cd05d7561b26e5f909f81de29cf381f77f9c59add7e50ea5fe598dc6387dec6b98bff1ada15e03a6dbb0e8e1039a6d5546573b8096557a5bd1fecda7ff16ac0e9a2cc7b5d992ebf8e4d7ae542fd433e57a1f1a704201f5d62c341132bea8a42c1fe0dc172a62295fa3e0b0a4985d7038795878e561970bb57bae0afefda04f44b850913a1a48265b9740a26ad372acbed2a7d9585b61167a3ea11d55329a17d8e200a9a73fb17d6d4d9bf60f47d033f8f461ae61b61cc084e3d1cade03f298692b8567d6f14a991525471e1a8be2c0677d2a7a6a0816746619a48601d8564b6603336e51e55003d3bcc69d050616bc9adb76c009a7dabcbe3e8de1693611ab6ff7bf2fa0627e383982bf05675d0893037dbb11a93bf603cdc1126f6c83c122d7776d2e3b1f31b0b70584c9b9e724ee21f28be1c12ae4e4454fc6829467f15c4d10e1ec9a71f717ccb3bc5c653af81886d85da2fa0b23c895491ecd79590eb23142a1dd36e15aa7fb1bca5001defecc927d94f7bc433f4b3e3b8f9263bd95cf148b1182a903b91bb2bc33270829a554e570e632706993c6b0a59d941c2c030d6758d57f595fbedd94038b63f0c1885bf040b5f5bee4ddd59d05cd24eb2af2e7ca4a5225d03bc8580f903779443d244c337b88b4105b59f243da92d76910d1f88dde1c18a64e522595c0cbe98ae2e5902f7fd2efed23a4974592932e0e942cba526297ba33fe08c0b743cd272d5958e254cc291bddd44a5f32dc228b541b6fa7989659ad11d148b3f4679fd4b4070a9d43eeffda4af3c7947c05d591c22d174ac0d7d643b85e9e79ddcac854b782573b6d66cb8dbcf888e181ae30b3e13fb00e7ba59220affc767cc3dbeb399041eb4741b210a8bc592ac0f443a87429c9c68d299e21b651316d5757195cf5e6cc134b516f73ddc1ac19ad3454c1551451c7214b1fe99754a3ef73f811b21c13978ba22cdd498f5557c220d25fffc9397e3e7550b96e2612ba795d37436f0ebf2aa10634aa262fffe2d0a65ed3d862f19598e3fad933f523fba79d852d086041fbefc1f9547e4219e3b1b82a4edf94e54e63178a1dbf8700cdd6af723d02933481e47feb4ad6684bc0e1d0d52f79e17cef396a8ef5855e21c792fd8f01e22a0f631b9aab1ba2f4fe00ed8adff42bdb311e686789df09ed1f7f79122c0a2b974b05f19c8935889ab92a3140bb4b89e49a529c98fb58d1a6423bd587e9c4435d7ff103103636ebac05b3598cf79408802102227973e1612c42a354c938bece0f06aacc70028e30bb5c22c2da054c2c506dc3b68354173ce1894c6340a958200e8799ba46aeaa1c4b350f09b264f279b7c90db5313c58c9689e7d7da8ac2eedee6b44690e7b28f2de18be9aa0a7155538cb569b2d9d249b23fadd204bc1b18c213a413521f87958e68fd7f21f4c2353460d24f4b2f709269616d1e7b47a7e8f397d06bb4bc719b2e6f2e1bca8b4baf881d6ff4e6bba84f0518b02307d56f47bb99c0b77c637889561fa5236b7813ac95ee15c04d288168cc8bfd496f0b791b6041fd5d73bea5474ea0ea01cd632212a5f94a1b471c04c507e3dcf87d93cf4e2bb80ec76175ffbe5e19851bb8f281cbfe66996d9b3f384efd47d598f71579c664267b5b0e308ed4ceb2ffdbf4d037bde85e871e123b25ecf8e07191a6387d6d53b3cd8341965b72e595dea848a34cd2ad099e9674b5d3853ed5374b52a5e52940858ba6c44f6d81ece7ade97d14c9f0948e653e89584b02184fb02fc304b9e472c73d2b5d04cde72bd3f1085bcab501e415647c18c9944cce7662a3c0fcff85329f6c7cd55d818eea7e346caa6e18ece6c824b9ebb3b649a871d7101335c1f4c8359f00f301935c7113fd7d32a7fb99e2cd2c5ec8bcbae3ee6997df825806197cb25e1f81990a3b07b8d5a3bb1e65f01f4c04d1788ca701e7852876d60dd7dc953e314145ccef12f69543460c7a5ed9e76e357cc3cc858bdcee143fd6fb3b255d00a1ce094349c884d4cfceee64ee3c805a46c670245c6815cbe3a04ccb3adc1a21352e93a52047fa9a01a329841e013339bf16493b3582da451b03fe24dce915c876caab9b7d76a012622d8581f510483329d614ba17c0738446cfb6af2a34961eea081bcd673dbd6179d5ca047b51076f0b6d9a480b0a27afeb6c3a142ba5e54b1b51aae2e6849ab2ce01bfb4b9adb816ed43a38e184840ef934252fae7254976910e1f830233802bea1a2d3ab60aa24f57c0f7344662046bc5b9c809679a0cc8d2a54357c433b5f45489dc3d7b520e43d24c5de19d41bc4c093963eab2ee74686880de07336a813694b594660e6b441ae54f9e3d26cbafb9e72aea45d007ca7edb05b83a57c12e1933051d5d793f8cfb193182f1e8e927dbe8f426c1cacf5534b19e9899392003c4b8e33ec9c4b42e0ef55ad1a5eb846ad993ffdf07a72c5fb074b247cbe0704760abb6c152f5b4717d013253003882c1dc71b3dcbf6f082e1aaba88e795497431495e56ca116269f6dc522d0abd6cd740c0879e7902b4a0b9bdfea334b9e7f3f09fdda085e2ef1fe08ca900f4ecd4bcb90e3b7c622e2da3e5b97dffee8c50e82666bfc5c3146ffd77697e5d99026e60e9187d6421e9ca00f815befb9f9d12e565467b332c0653771dfb48af619e88484367e3f232c6183c635b3822a25cbc601fb7a6750b69381166aaae52e921b0f76a84f5931f33a6eaaa128001b15babecc822b807fb9d8c50c3f006049a3c86e2c0e828b341c2e4604ea41d25271a6feff12036687713deb9c873e620ef3f689ee919f3ff34e46f41c3b875e97e0986de2d289823088c9dc0e6aed52462bad4804592fdc373289603aba810db40a96f5bdeb453a42a3857eaa0f949ab9f2f593b58dbacac870 -MD = 45a19bfa408943f7a44e3f8bde24b08eced95632b92fb30f87c04a8dc18c8fb242797dca783c34799b6e99907239b589 - -Len = 80224 -Msg = f407e8ad17daf71e1feb8765a879acd211706be625857b09fb814c7f1add4999e1905b282725ae371e10b7fa7d427601defbf8b164e021f5a24da831b8ec6378bf87c5fe681aa5d0df2d40c2f66082a97f4881cbf9794b9470e4e18b9e64838456932e1623e2644f2ce92ba75afb5833bdfe0d1b2c79814e2cefff74146c32256e5d9f589fa4731ecbec7f90f33a810560c5a58945084b8ba0150bd6612cf6c3ce8c1fac26895ba384df446407468489304750fd8b4d32b392ff0c98cecd5ac63fc9b7fafeb9a348216a830ddf47e926f529165f4771bd2ecb550aa2a377e39689bc6e2a705bd37468344372c36439437616ff97c29b756513be0edc28511b9b740c4c24c498738e23e68c7bfac5fb4a7cb4148e41f4e0be31e21e2ea484893dc86259d042970c0018276610ce93b7a2cfab5c2a0fa488a2ef6a45806137b5e54c659e173281253110a0da1985f6f5b337a4df5473d2f57a13fe88baa59328f9c9be22dfdb7d4789d2f9ef7e68153ee57c47a6f5b4a7adac6645f1c4b9c069e30714ed1286b4f97028d9ae27bf1919a0653bb8f31b4a3aa2b0e88786e5e50009ce1008967b4dc34ed8e81dfdd2290f4cbb291e38f0e324c2b98e52e8702b76d5e65a7a5502712d8babcf47e6e86ea75146b8deaa7b9cf17648e05bd3a4b952ad16994b356348c08f693631cb4b106917ce910233039b2b252786a92dc7b81cfb27758420e5f903c3dac4e5954136dd071b5b91bad20859361c2744e0224f5d26e2982cfdd1ad7f8dc5226a2a13088c87f4bf94262e0c0413f06b35d2fda79b960ca74bb46f8bba56f4f8c87409affd002365126160cfb3236bfc83eda0e761b3704dea2c07bc3e872ded075a6a53b8db6ef41352af78eece547f3617523834e5d5300f4fe167938639a930c3801b467e9e15a0e1652f3e7c759f573a5cc29e9402f8c50445b53fbde0d54b9991302e537b6fbff6c91e29959402ed3d06ac2628c04e11337acecc92e9195ec3e6baf8c0ccab7b79226a39817a500008981f5509d7dafdc4c9d9c26f1e1c7329c7e02d2f5b70d952b93ef6a9ef3299835a42b19f0f4390a07afea7bb458791b37bca5407ee67e36ad6c0e773ba4fbe96943ec4533031d2add56705de2701c1494ca1f5b04e37a0a7c0189448a5517a298d3a168b014eccd4213963408c330ad3808d9892438918f2c16f859176ddd2248e5f2db04b3f85fea89f4a493cc4743960b5c615940554341fed43b4f69ed06fdfd4932bd6af0511b0bf4161fe5d0763344206a10b525b5323b9551bed397bf2c8c2d0626a4455f782c1d0f09ba6cc39445be19e6e19353915fc432c2359db9691516abfcfa67c9666ce7f5edc46caa4d729de748601ebcc3ddd96515fa4f94181a8eba9cc7e82d8a30ed71386e6098a37d4858b1bb384f6e285d5f16bc2dcdce1f0db882b7470a383a85f77642d92d5aa835e4bf5d6089d4e1b88730d5c8c50f950c0c3b22f4de14cc49ff23dc46c6b795ef21ddb1380abc7c837410e1a128311f124c42a582179478c20edd8529f36ec8ec8679612f30796b46bc235a3755f71fb8ef25a96f553bc2669cefe80341c4a3b6892ef7a69990306ab5e4ca0bdcb619587b50c92d057f3ba03ff77f63207dd8c5b07abf4ea4955e7807d19b8f3ae28e7967506f4ba6d337174e60b5ba1deebaa282d95277fffd67e718766941ef20f1a439a1163bb7dc67246ed82588a89bdbd576b74bc2fa3ccf406e4f9db467e5e56168cf587dc6ff2e6007ba394f4ef9bec712b0f5a031d8070c7fd9a36733a5dc298b47a09242b00f52bf737b8e7facc5ffdd42faa01553a1b3d38134dae0e5387507868919c9938c64ecb066b6b919a3f83ce9c533334421ceffe2bc7fee28accc64186c64aa2e182f15ed856899c4bb48b801efea1a0df9c65b8a94d6c9e48ba83789d51382c44509d187520480428e59e547d5352825ac328cc5686ff2ad6790e8375d96e20aa59d861a572b1af79fb43b180f94ec3fbb8bfa4fa1bbf6e7c30efccd607f26759c52da12ff4ca86861d03fff1999d490aa4b2a65db3b4538108afb98883cee79abb2140dc4d9d71967465a796da48fecfae8a3c46f7e7bf2f28d5b452f40a8ab4633ea674263259f328f10f376555c992ffcecd7e8e5f9bccb8e924fe03ac37f1e60b3cbf268f24e3602fa09ee1cf919abe06c0ce2224d0a1e274715257bed6976c106884f6bebcaf44a8c292f7bb403014bb7ffc583f45f6ccfd021799474eef1cd6938d3dc7079ffde3deda4f23bd9c297371d0dab7e1139e0c4114705089411fe426a0a4b0effab3685a3f900ef02624b9fe1450948e3f8129951385e06ed59dc28786d3835b0a8dc0a0896385c1162e128e8e61df33c39ddd66da7fffe5f2bdf9200771483215b47216806f8f18b36e088907b69fb7e719af1d3307b5d6e1a71058ea26055e64500626eb5d34dd460d225848f7dc04f31d2820e4c50b29eb848f96f99cc4c63f88053794d47cf81732e96116cb9e012fd3ced8b56008c6567cff44fa788c52ed84f6b0417d70516e06e30d3cdaee96e3612cad7081b5966ab6e7c9b66566eab86d61fbbb0017d193b19ac480cdd3ab56efc708dbcf187f715bcf8df5095876e66bce7fca047a5ecd5a96efac4c5628d1a6294fc0f33c6ab1923ff87e0c6ddec0a5c6a435319fe166295df486fe7ef59cadd9ece59426407384c0721b17aa0a8e44d0d2c6309043a447793dd78c53fbff2d5f45125be0e7ff58d96392d219e3986f757143a9556ad0dc7230669ddd20424e44c411ef71499d371333ace4c14f254f3ce97543f440310fce37fdda254dac370fcfa9fae14d9549f54a31f6aa377f0cada324a777ac110917b962eb326b861148d0a12138da2eb50710e9afdd84eccd5005187de595b6f2d41e5e770c601803772ec20e7fdab2a4d1ee9cb8611cb5baae78186c47e569f18ecdb926bc16aa362551d469be34673ddc4a11b83ee922fc4e65ee1ca483722ecc303ba2497384d2d9a19fd9fbd096a9af8d11587dd27abbb8326036045719d216aeac90bb61eefe1c86ea074096860fd220644025be071e754937627049a605f4afd39b1bc72fe275687f9b946e8198ce69d2173e970f4e0c103a47ee4160eeef9b7969708c90a76caf243c0040cd6c2ad22385d144db7305f1338e892791b68edb66a2c29a597589c3a2928af4b3b26ec21e34e4adb3b4e952e8de46e37f845ad562ef19d8d273550cc0463d727b9323a18cc982bade393f9d23e02f5d7281daf235f87e2e42ca57f348001ea26d36d0d635efb053a62b8f39aa3c4b7eb4d5969aa664f884f3a117de0067376cd1c4fdcbe14c786051b2628e4599a22c8ca716367fdb90c22b211e36b2248fb9ee6432e75888e1c928f53e04be9f3d50411fe32c86074dd13372f36424df2e6f0d3ff892614cf376731dae03dcf723d31c6784e6848d379753bb1fce1f3f1d78767cd634c640b74f7a5137f366495c9b65a481ca401856fdd22528de6aec63ba714455354d0b343d84ba633c253cf19264016342844eb3ebfad798fbcf8f081f46bffbfebf557326db7fb946e179e99f60a4b0b516d7554a11f9f68c14d0158e3c1453f5e3c87af4c5cac17a61a84ca9a3b5f38bbf5c440060b5cbfb025691ee9c6ce283830a538d8bc0043e6f70239a735db12b478589f72f319eaf61ca8429aeee321065c306db758b09fbd179755919c374ff76f92b15c695f710f9d3f626bac3ca05529c99c4ca53581a506c4acedd11c36e146132446c0a5e86911af0cd081232c8123c1632d43f7a01b4f1aae1066c27e0e864a76b6ab85c79f3467906e004f3c36d4d840cd978f61ac5af9e7adefe27bdbbab917208c67851e5009ab989c1945d2b74ec3a222654cc4b4f2d81abef4b6e55ddf8408e5c3b7630f05ace4c709dfd135b55a3f76f1d7e0d7860deb6671b597ea3e4bf44a42c519cbdc12d7139960defaac7319f7ed89ad4d33e79478d20e7fea55ed672c3d348f010d7bf404508f485094bcb64790d876808cf3aa589e1809c8a6d6d5fe4b8c4f690a56a00bc7b1a9d1ee7598c8945ad91be1b0a1a84e68d21fb1a6d542d642e74e63217fbc675e70194a5c460d50674179d2bcfeca6b874569f6cbc99c65eec33b986af778980c378118df22886db44c14f06736416de9f001f6b4376d82e68fbb2aa18bd302316c93da6cc2cc349855879b4dccafde074ea221fea338b5d089379a53c15e1e748bdc2f83ab3b5da9fa5c63ef46682475ddb51919a17067236c5b57f01c6c452c11c458b25078315fa6ddbaba17fce9ac19a54c8396b72f559570e41511a03eee9ae7168736e5682fe7b6303cd5f086108f0d2ccb077f66ed8122ef21357c343293aeb960e3156aa1496044e5f4c592599a573a6e883bb661dbeba9a2fc62fd7e78a5e1ddc98aa14a28566953f8fe96cde81e05dc8d7e9658f235d418caf6c358c647006c7ea7b48121132e05570dfc13e4cc1f937bba7f19608bdf0145aa5e28191c958b671f0cfca021035893663a921cdbd831f761d949a3782afae0e00672dd9121b907332303420a79ec32b9faeefcd7d02675174d5037655844215a54df703f3573f3968f3b632a022eb95b8571114a97ef794d43c3a8ede79b9b5bd1c49d91315aa0bbba1ba02a2c9e9bdd92ced6ae8ffb7876452a547c495f937705a8a211b5db93053c1a756569ca5eb28b6ec97e28e8f714d9ead68afe0ebe3e59121a4b23554f257dbe5f764a20767cd7c76624032679cb6a9babb496377004548782a81a76397f078dcad73e4f878f107f494aaf4274ec8f93506372586d8b708f67b30bace68451ff43f2b685e67bcddccf5c7dab7d0ab188412242efeb16458035e66767dad7f5895773638237d5588684d40efff6a868e11a7b687c9d474c0079ccbe459aec5ab271b395c2dffe5902e64bc38e76381e1438c9537cd890ec86afd080b48b240a112f4dfda6638937b8802e4bf5805c69b818b6a46f4175af99549c5f4330317c1becacdbcb46f88d3ddee608b38967a43356addbd24c881daee48a9a503e773939365ae0a01ebeb1f95f1d7a4715fc862c6f295a347e2abf4dec25d289ea77ca0fa8c28ca34f5e5e818d3f213e9a8d67f9ceb3b0044aeffcdce7e8985ee8b596f5909e30635d59eb5cd5c58df8ab9cc221f1d76dd0374a6ef2445d4c2dada338919a288c5ecd33d0e1e53b1103ad9d3d4b750ef416c7cc8e24adfe6e949de3174a320bf104137eb7b7282a7afe351131bcc4b4e34670d8b2ca614680125dd7cba5e4a2fee1c48cf8532afe0c26c6ab382c6d73abedc701a57a2ac021355203be2b1ea8167654f12b3c4a30454bd69db8e0dbc5be8b3ee9beba46e5b26c1ef977506c65d830494db8e9126bc6abe99b5c909c25ab9d4cd376e16231c425192b8fac4a8694be15f539d0100b00e574166ba22b0df3a2755156a5f93ec6fed50c5f9525650c6e4f8a1687df8874770a819e9c150917195d05e66e78674b67d72e7fb1a98b8fcf6a6ef776bd7e91ef117f4df4c681968048439eb16c45c1ee940458783384af6fdb3625334658099c2d61f232dc11e275dbacf8054144bb019020825f5fcadbbe2652483416af1c3cb2dc33dca2349b489ba47ad0940e973f500575dd8ae89538e055d8ff9aee7a1f56408b68d5642196fcccafa9d0edf6f66825bb8951488c7e8da3400c3f8083d26c21515dd21b05ef63880f07847d5ac52cf3bbd92f7501ed72ed25c0912fc9e479013e2214d3c890845901602b37233a33020f5381e896045475f2e32c26ccc411729a6c3a28da48c3d23f4a4195f0b3fed32e6ef53dc96196e02fba6d100d0fa9c80e72ae84cb669666013c442443c104e981a205cf0c73bebe34dcc075fb15c6a3f30bee720c8890970faccf7c7cffc9a7b1931026ffb92062bab0e2b32774ec88f06e767b2e1d36d7a3122fe93cbed1b02698c0dfe3a0807029ed307202ab7fd98f30d2fa9092fdca741301f4e38ca1756949745478d84358fad8461d2d38152817e9808ae48859c1fb15c24a11e7bd79e22bc72f2fbefdafb608702ef7a930f7330f0ba69a7bdf6090910d33386e7a30399625ba78d2f3c6d3f45b22025d57c958f7d0d812dc0328dd2b3f6ad77f8c3ad83f0c90d4a2da30ed326380dde2fe01025a8c99fe37498d593ad53b6fa957ec367d084cc3ad15906a3935e5dac89850b7ad7b56acfc27006d465b3f716a61d6ece69548d6504a57c37f2eab998cbb1af14739a8bfb92014b1e45dd17d314e8d53f2301f8d4acce9818aca5c8a8ddad247de540a96fcd94caf7b49bbf39c52721426652b48eb21d84cd2a5733e6a7c1913d946f6d325971abea1ab39751a222795f9a106a9bffda65ded3c8a15a12341edae7ef7e4b20e0177ce0ee46229321061f2703c1047a4d66d40ebfbb0b0450f5de488786c5092936376c1475b4816bef0976f362d00abdac3645062901665b3bd11e012aa5fb932fa227edcb1052495da6eda8f4079974628cdf639244219e1b39d02314f5e0672b457940f13df003787cf5e920b20eb8ae5f449f9edd1b61bba0c8b6ecbd9fee51a9cbd78e4341e16715f7808ed750d2b835db82f6d33eec438d6d815903206dca5583784b2b2f2a53f95933e581490aa9990ed3422e7186dc89274e04d14b2fbdd10becd0fca12863ae85cbcdb5e0a7a910445c29f69b78ae1b5ee3952e087b53a6c9fbc4be7e21c0bee110f07dfdf3df24e6e35434a60be0cb7a09b3233f98b35b276cd07ab05e91b1d7c9f3e08834745c5a316bf079849a21e38806b6d8cf07788b099b371e27ff0dcdc081e76ab39040090e1530fc2e06a6022837f1bb6874865f98cefdb0c4325c2dbb409889b859595b41fafe175049e13db1eedcd0ab240c0ae210d44e7c51255e83d8fdce8afa2eb994c361b2318e5afdead27e00df3f92f4af0ac5e09885f1c8e0f21e2173994889cd1862b51afb9aab9c8cdf314eeca085c763d74e60f547d39936016bb95f2d34b5a0070853b828ad8fc4074c3e54bf25f1c413801ccaafe7784bb092a573672314045a9424ee8c6d8b21ff3af89f763cf7d57f5f142bb16c43da33807ffd7ebdb2ec633fd5c54f51584bcee1c4f44e329f3d26d19041d6cac38a901b8f27f86956fe29f2ad64f8c3bdeb7c2be97bce6fb2a50dbfd733a569c004d14d1c175f91cae5b496f5f40f2a84a912ffb15e7e5bf7b43e12322aa7b202effefd70f53a9cd4470c11f69c1dee732c974462c2e65f3813c0b0e94e620b50f41d13d1ea12f23dcd3a4df585a976531d13e445d18fe13b699b8344c660dd73bb3876881e6efbcc1e45303dd63b2ceb238ec6a2b3004bc95fd7728abb299134eb5610ddb8d61e4be335a415b85b7705e711d2c190c103aa9d7d640554438d592c80c817e0d2c680c31290c45392bf6710a3f0e98f5b73a6ca9543fbba383baa28bd8680c0eb583567e5db93ce676dda474d0864d85501858e25f6b5149002f18415325e7da83d3076b66fca5263e726341602789437170e9337657b8bd149f4eb90b5fa4292dd3a998b33b1060c96137e06c66eeb8a1c0a7ed2789547857a7c0337f59c352fa01a786e0f8f13ede269ce253d8e04d47842faff174a6f33fc517411db8c7e0aef9aba66ebaea08b34efcb7c4d1f08a0927badc52ae32c64373be7264f1146a83080077baf54d670f26e1e12df6b1e73d4803f2c99a8a59f9302047f3a74b593cd9509b644cadd2386af6eefdcb86fd7a518593c4ce1036c786d722382fef2522ca1651e9058dc2c5677641c2a4f23536d0aa3fe2bd66d534e46da1a11f4266db76cc6bc7c45fb14cc91a8a0b3786170951fc4791fcf0cdd7d53e36dcda1786cd4bdd296f0db64614ec4e1835d7a51b4831f65b50e1307916d5d3623a04c11d8ed5d31b7d5603c9e46d7b7ce129f1ca9a0d22dbbe2eb87f8862b7a44713c183969158c24111dae501b93d488b92dead754ffc592819fb498318758d927bab615b0ab8be68e5adf0135c0ddb93a6de2c50870d442d577b5fcd43778e9ac0e13f62ae7d506325ffa38fc267d697da72dfb22eb03d4c4bab3a9d904817ce78056633f93138ce773257ed88c5aa16923f2010c39fa4f38b2d529a6b61c9ac058a8e55775ec7e94df885a31bb1c68e8285a602c2260bb18a54402a515f04c1fdd3003da5709e621ec4d546f7c6cc7e2ff8d9fec6ddd214cdc27bf3ce8a699ec58174530ff11cb75df99f4fa95f2c53df1b246b3e41b88bb9fa7e5d5f9e58a0f118433c135ad367a0397c33ace556ae244f2dde84dbff84f36ecfed70e56267150a056f5c3852e179f6c4898f13dbeb94074edf5717479efe81d92aaf0a075f85d9235357040bb34fa430b7ac454caaa2f61fd4118e01483fe6327b6676c7f8d7f8358e70387e5ba5d429549113f959e57e0963409abd0f4c0e547623b624d19009b48754501b58f10916d6e9ea9277b021a3f360e7eb62876cc79183329e68226018c45fe57329c5b591b4f3338892b763680afed01cc08683f4640186a52b23adeacc1f53065c986c228569a94c294fb5de1076fdb1c7cde673440b2cc9a8f8359314ff43554ffd8f31bea9a66daa0dbb7eba65cb4ae6d1f6bcd81c9f8c5034b9ba259c10e09249a157c72fa56da365c6b25f57c3688c17474996b2595dbf5d8cc874625628c21154fd458830bc93dc8a2185a9707b46225aa1f678d4ce54c7412697ee8d9e3df8ecaaa03fd2eaf9f65834a3e74cf3a367a34e7dbcbc5e9f26598ce69d21c184550ad86db306695437c37450adc372027ba3b7930a5a7f2cef384416fabd3333aa221f048e35c821154e5912497e6701c2fe65ecfe49b05c868ff47f83aa63aa8cb4e71b2e0b87ef137b6b4f66d8632fc1f5e1d1e50482cc80a306a6c483b3776145b9081ed2191cb6bd238e626bc6cb1d3ca3e87b0576eb6234031339d3d318cc571d61dd33fc4873960a55e8932282293534971cd6fd47af95624b5015231d226b7caef59bb1e0de98881c55f906d37a721c744703964fdd49bcc5a3c223e307e56f45d493da745c3745683707d44d8565b40675f5c2825fe37b08b1556608e1775dcd06a6c68180f49ab0084a2b3ede92a3a44638128dbbe5159ae56969fd4373d0bb183f1686c143209a363a7c55ea8b53f4243506b085b114d2dc58904ea27d608665d73b02b1b55f7d6d4337f13db25d6c9c970f9921ea0166e2bd896b82f675b59c09b463b6cdafd01a1eeebf5caa18841bb8ada634f263cdb4f2b5e2696188df0731134864feaa38a908210eabd52db12e245176136ca45dafb28621da6132595407c82f20cad72da6a94f6dbfb5f59a5064ab6761ab5bbd5f57aac83a57dabafed853669ea4af159f6cfa6b1cdf18a60ef40c289450f253306c74442dc81a7a643d35ad232e9a96ffed827527b30f5ac64d04081fdff0c5cf6b830409344a2e10a0ff5142db42085485a81a84d4322f22ea23a488badf7b88df47a6712f124ca0ae0101920d1e0019efbbd9a8a539998155db7c537426eaf93242a9da0aeb3c80aefb2c85668714dc663e20f7c87e308e1aac0e048e6f9a9cfef46cc86a3d943d4e3e30916a259cf883bf8f1690887a85a305c8108c0210e0afed8db0dfa1da32e65abc4a7a622f1ae2b08279afd0de248989390bdf96d460cf8e7b27ad80751e11d13e1529d531afeda1899578ffe1d72896df5b0b866b99d867c39186720b3b5b222495faf75b142f1332fe8e6e0c0a1acf398292692cf85509e582ecfef3271cde1e216030f2040175ed194293e359da92c626f6b7bf18bfd55f70338fd37df155695bec2a9cec1f5a367a4819de32e272139ccaea9857935a9fee0c9d028c5338b4ba113cc238c3309d9601587321cced8078617a3f515a2a3550daaf26eecce88ea051ffe876b78980f100e838a2e475bb2e6d0f1a728ea4ae4d204eb721c8f535b330eca62246c59f1fc931a532d3ab22334fe1b0579b5a79477ff419b1c1df6877307b51c80b853686ccdd2f5e24ee343b8cca975d2acc04b43c27e50b62279550d32491d47048f5aa7e336d8122cf8f9ba602461f9769ff27f7629fbb043e2ac48b80dce41f713b1f6fecb65887cf82c81e21430b7bc4c727442cb03d32a3b766dc18995353ae953a1461b020be5ecc6567bff4ad426cdb1674febd0e77f8c9ac47446dbed75192af0e2ad18620fdbae81526f17185b2c99a3c411cab4e9db0095facb092f4fa91c2afb091056a3cdcc4a91ebff4b0471116fcac65901113290287ba085c470a31399b8b850af49cb08f85dfc6a34c8a200128990e5989f9832c41e4eb974810ef68342414235a8db4ad5e128c09c50c950d528fad63f3a16ceb30b5c0b062af3ad31c02c4daf69087a2742fa694b44ede800d08994bf8ab24c3b6b52e54412591feb5b02d8e733578037abf7cd094b17b0dba8c787e0387694a566b9aef4e24836f93b494da3afd2444d42a9549e0d4e90add93b1769ec6a8e392318cedf41c9d9a2878c13ac8580afb12f9767d1339a70c08a6dad244d95233ecbf7adcdd8e2f02f685092ca5c69a7aa9b496c6b6503385ae4e6afd704ff39fe85deb3864f9d64e8051f32c4dc961581ae48cd354a92d0c40f2d874bb9b0b9bf7a5648d14d021b1587805b64ae0ee27f8f1bf0f48b4e204632ca9b4813b18ccad1e6d4777a18fefe15fc75707ad9f4e9674a3f73cf40112775465596ba099867b317bf417fe7f5ebd81ae8b1e700350a5d5e2079bf6e89b101281cfc57c0c7dd487071f40477e923f7621cef9e8a8c299adefdcd03e2712afef8574392df0076b779525bb0d1c0ef9b5c7af2477fe08d45523d3842a4b2db943f7033126c2a7829bacb3d2cfc6497ec91688189e81b7f8742488224ba320ce983ce9480722f2cc5bc42611f00bb6311884f660ccc244788378673532edb05284fd92e83f6f6dab406209032e6af9a33c998677933e32d6fb95fd27408940d7728f9c9c40267ca1d20ce920db5278679dda94d78254079654e3b69324e446dfe98962cea9d6a432993b22f57750a6d0c4becdfb0ab2372918082fe320ad56ee72618209ed0e78f00e6362fb92e4298139bc7e7cacc74611cd69c5a1f432e56575be76d88a2c6f4c9a1c159dae9b64fb756a42b6d911b8e2dd8f1459f02376d78bd6bdb4f1befbbad4dba7663ae4eda2003ea7542000041ed0fe9875a4ed8fd72d60d319c434b2bd3718b4efb83f280752a018bf1240cc28302ede7fa2ff94c6d2e33391623c08e63959ba94b728a8adf53513521022558183a632e24ad82a3904b47b966c2372a8741524ffa82fe408507423d7aa4344dd43db52482d15b4a03b7af7a3328994965fe1808b1bb36ea90cd3c6aa61122e7de954991bca26d89effad544265ecc312553559b18261bd0272ea7834a51d56f5fc9893d7a289ea87c9a1fdfe76bba2af0c971d1d6ca933a73b1eb51116d372c7e62dcf0636cd7eed121f7121d57497eeee7d47294b0876f9bde709ca06c2f6864e7a9711f7501a51717c4a6702b63734635e746f9dee0b8c83d9e2ba256a46938e05a89574c02137502ed648aeeef53213b1014ae5e845d2257dec8bd33807923d65600b3f7c480146cdc1110a8d564a682b8a65a385da6d0b39639990caade4d50059eda802d361bdcf878ad61fdeffe9148c2a67252dafbd93047dfe80ae0ddd6cf2a75ee277cb3dba96007224f3b50f026313a164a43ca5212ba37d088c9fcf01c6e2b4a999904f05790c6f2b392c528bcbabd2b2f2766a5a65a48cb0cdfd1275430a59b6ad635a36ad193da113a85c07127d8bae8cff65a52efbbe17e6c8502df398ae9847b6f7c4aeb16e1517cb740ac3f32ca5d83a3fa8040371ac6b63f0a2551833dced0d90460a6f60f5ba08330d7c97463768b950c9716657fcc0628c58f3f389e301c9cc212cadb6c17ee1219598e458d1b2ef318ff39ed1779a368bd83cd501492a9df3ec91e6f016dae8c839a564e5134b5e5a61f7176ebb3d7267a6ac174a7dcbdcb01ee6b57d5462719f402e836b6a968953f6186a80163e88a82ade44b60f6a18892e7793ef088a2dff6f90ea6c5628f286a2c3f2d63721fbd5fb2fe7e46c99d3d791e10ca5b1d670910e78e46854772c9b0e965aa19c6c4e799e3d7b4613bf8123ff9f8a31debbebdcb3431bdfe41599e98fec0ca29491f2fb6a73696ba35fc306be2f8723edcef23ad48bfb438368bcfaad418329de177be4065e5cb58a0efbf8540dadfc7d74165408b00d23c1051856ed3358d7c7816bcbf87aafc44621ae6167b6491bfc3fea80c66bcc011b5f3e86d63df81cff54250b9744ed18465c5cea5fb5f312e8a6c17983fba25bf0fb91f2eedddb69d4044a2b89499f1228f389fba2792661d13d3d76c7fc3aa4f04ea5339d7f8d6ee4164db434f520525caba80dd69c7d992467d13108f9ff7c87ed0ab178bf886cbe0e923e30d43b496fd94999728c432980bb1f10dd516b33264b1504f6fa5703a051da11e3632a77c100f136fcd5218344ab699e9bbef86959ed66969edc63c4698467e7f32e886dfea7116eebe393370ebd5342fa8f41afa13871fee6c2592f481ade18b692df8c87502c99a64412c53d656ea6404eb1468ad0c9a655488184ea89af3cc44c8a53d980c55fe2732abe5f481e212369d1fe853ac01560cb8795bf554dcc9298336493bd5e29f70d3572f2b9d45c0a8d2e181edb07c49fe7d5b235125c30a812453f146a69707a5edd93864f43af7c152023b646035c7919e67afa253d018b574a33fa2c79cbd3048d80988ccea3ee9e42b1e9e0451572de54406d2272d7a2b3bcf3a35801a4977acfda87d6e7d1d8852043384e4fb823a189a30c7e9ffb84d417eeae8193934e4e1f01f2d221a1c06623481fe4859cf200013366be1715b824d5958a4d92004ddae58767e30e9c4ccdd6410f57793c64865551fa457a8ea3129088b4f0af844ccdddeb35adf139c408a3be94fbad2ef180f08f35c92cfedc49b328bd2f2e879183429e0a878c02dcb336213f6593ed3f9c5d5bb7adb0ceca26c7f6116d9192d297ce204504317fdd69e8096d09cfef95451647ee67a8770336499140209b2e7677cb02839884196c7943e7bc7ca3be98f795c4488b76a00df4a25ac7dc9dc303afe3c534d8f668007dd44c9c22d1c2c1406651548d9da250ee8ce327160bf8f0ac82d8d739fac41ff413988a80bca4949bf29fa0e2a0166280439adc517828c3fa42cde93023e631688c5c163ad6cc8986e4dfac2f0074b9567112561364eaf4158e14f96fe426eb379917bda5b2b3268d97c1e4c74145cbdd9fca32d054a8178acf3e762dce1e840de45bef55d2f0e20c95c6d94fe4e220921a22d11cb9f894d6a0bafe0e4425b247d89929cfa9fe42a0695ef82d6e024df09adcef5d2744f2658d0adf85d8e4ec71e0300b77ba33ded58d0acff43f0eaa857c28bc160f25c6c40ebeb9391ec4a918b5e0f2e28659fd187b5adf18ea7fdcdd48b6e5dbe403788e8037197c685d6ea8b40c8e9490a953e5aebf942002ce4b448b07eb1348868e018c145ee45807a3ae55231d126bda49c9b1b98d8dfa827c77bd9c3a509ef78de9acd717e5606bee9623b55cc07a4565310ec939d73424f6d34ad4622879feee935cefd31403f2b5fcaa339c333e732cb8207f1770623e30d3dd40e0ef4c05268b06cefed4d524804e534e79ff3afc06db813ba50de726b115cf7235399792dc5d450519cc3689d417a9466468f24899f7cb9f60f445870e05abe8ed7bef3066769222a25eba8b37c536bbea24f6d14ca94a1ae9c80fd79e2fed05684ab5665b6378983700d3b111e3662f89a7ab3e957c972eadfda880e7f12d68340a7c9d21a052e636571484090ec201a155a1d91ace3d4b0c09a21b71f5c771ef5fb74d6fb9cb9d2ec5ef8c6393d4e2ffd35d49333aa710a2707f2fd2aa65c2e8af080f8c1c5d1d9ed1e732d80f0943c3954ff7753e6eefffc6a206708b62cbbe7cc15c1d4461e7e50f7e0fccfcf994bb1ffc7c6735ef697270bd67e215490cef4d75ab89de74acbfd3267bc8da006634d7e5407fddb2fdb90323ac8de4a306d995b78658272fac8dc1632f4212c828df5 -MD = c16f349a856d4f9146bd281fd2b1502087f75ef0e2260015e6e3201f22eedbadb0dc40ed3c9e99de9ec5f761478492ae - -Len = 81016 -Msg = b789d22f2024c25aed11387b3e4761dcc1068e5c6dba87717322226971b114f5e93506e7f3b6ec3b2ea19254fc267789efdedfe07eb12419fdf74defccdde19ace0afe981c83a5adfbcc58290c51e769c30487a01a4624d8870bf8332b395d774c52dfc9055396b93cdcb37fd590588425bfad25aa4330b3f9a74cbef78f2e934c53d40315ee6666d917cae0bfad73e3fe5879f5946eefb43b13711799a5fcf6b75702cdb41bbebdbbc6c6d3326edf8d3417149a428f0ae235978ec6774370a973a494af4aa446c4c830cee1969d448ab144a69c1a702845d07bcb54fb3331b36a82b0313f4fa585e99f0b9053004ce35b27568186d8f2e6f20651488c3ce81c823b7fdcfce584080759a46bd1609d9f1c084dd3ed8e0fcc8481482a91253deda5162837e72d8a5308a7c2f77984dfc6db2eb319b75b28ff6f34d88374b7d72dba5ad3cb69f16070d6d18dbeb136bb6180e2afdc4b07e588996727d99cba5fe4a950aa1eebf7ad67571f2c47e23cd877f26c69a3135aed6eec6260b771f67c1a5a40d2bad3081a3e75d9c81a755fe0101b140af6761ce9b94f6ca9a25b32d7d8b47176278aec4fff164688c0d0677834e222ba5ddc148072a9cf2a24c2381825a12dbceb796bf3b224af95c05d1c4aec2fdda061ad0b5ba0e4d10dc40ecee60a09bacc90074dae5d865c16a28346fe3fea8ee58952c9224be7bb770ba7bde98ed261cf9e9b592a0a249534efa9ac3c36fc7db05e31167c7b9ad5927ff6cccab9e56aed9b9f580cc0e6a2172e3917abd84bf22a67b3ba1139e56686aa61c531932a1d4d117a13ff88b4cae6e79a4ff32dc0357b2c407c8a8cb0b87b14516ec52589c21887944fa9697657caa2341cbd3d438dca3541258f7de31198432f912f76eba0758655d7b26b148feae86f46b111bd443f0b1c7dc71366ba05c161f4178e36008d952572c39676bb6f40b39476b014a004353b4cdb5621fbeb1651602376542a883c6ce784f38522803368cfb52232ea3e3b045a724efd1b72c8659cfe352b668d0392ff9c89270e4648f6bf1570fd6918a6e16f3504e064c16107724ed3a5fcc473ff82b46045c5e807c52c3fa15f67b8fc3952cc7fb41c01699ea8bc59a93356131b387381c8908ff83ddedabd3f2a46c874ccdec75f8c59669207efce1e556b6b4fe882f396b763a4c79c8fcd84fbeb8ff9a513e5cbfcf2e24a57903aeea82a04015c88be99828b92c93006d71822cedb32a515e0deb3f364306046a60075bc659b5a2eebb739304aad60e6e6e2e71933869389c082fb8575abe9ba193c03491683ab1c81da237955d9f5d7ffca92f1205d391a8e9e1ad09c23bc939b8a9cf8a02317f988e9898f3ab7b7832cb86a8029205d6e511959fb61009f7a34d286f18ae1656d09ccb39981ad6d8f7494b8eed635c82d11dd002f4cab5b17edfc0a5d5c275f220a6be9c0b325e1a6e046c463af054200d6d15793e68ab811cdf070649f5ccbbd96ae732c5786d96e76b7d6063df8938fa9dda650b6067d11dc97002ddae772e9b27d9804f5381e8f40cd36ff0777828191e9348d448874be23d702e195321c4c68c0a27115a378b246712c7795e8d87e97dd4a73197663c1a999bda759a4908ebf5fd79a402fae7f8f8cff9670b45d30c2a1302abc3913c177c67aa8aca59858c04280a8fd448a9d2304f8831f44d93c1a1e2ed9b53a4c679344810b199dfa527151e4c2d54ad2b50ac35f672aff144da73a8ca88de0d55b07fd1af925f47f23dc754d114fa94f6e4caf7c691a4cd50972de91c0cb927844dbd78d9a5a13ef73099401bcf3c9c971f2b296b27695e61882f38649f7bafbca15bc21153f6012ecfe9749ec4912086504b3f669c6410d23df5fb36a9abf2796bf931f935c44b034c5676dc9daedd3f38899e5b793b813d2920c604c3b09c450e044cf3b3a2890f366eab57a2dc0f3c3884ea9c46361c0cca2e0d51762009aa081b6793660727bd2e70a6928caf4317c0bb98ab7c1a6dbba17c559f2970c702ca9d365ab568c397852aed0fa3af253c61ac2d2b832ee2e43faa236056395109f6082dbc3a5dc928faebe33190421214bbc51c7f140a27f10525eb2794d03409faeab22a6d4cc4ebc0421daacb0e865b0f94eb387722897c827e31676debec9d49c36837b6bc234a95bc10ddcc7b1e5a0d9a1dca550e93e148118aa239c2e73e8310c466af3280dfebb8514d1d0e36ac165338b71634d3b9c69e5b5a911bb05807613b39df365a1622d5536b253e5bcbba4ea071332bd5807e6328130c5ce494771341139f3e1b87eb719bda7d821a3379faf9ab4469f5bfe01e754df3fcd05e22c58aa697b041afa64b9efdae8fee7dd5c6b8a7c255c0d28c1ed77de072202fcaf65c45314368e7d391e15700ae44f54e5042092595d362e2e2a3256a533083b0045a81f45dfdeaf402e7694c73ba5454264a41f6a099eb75087cc6fa16adf4729de9ef69767d03a80d25c6ca66caf5779715e4adec70c6c30ec8f50842e4ec9321aed0091362dc301f30d202fdd36339415953c3f014af4d542c122d6e61e6921dfdf64bbb4bcf5cc77d2d9eaf701809a36931c141e1ef9476fab0c1dfc17ce0017ba4b9d4a4775e848f3bf6022dae794be9e13e68651208f5d9537e3d701a1d6a9c7dcc05e94ee5d4cb8f918c787108994ff493ca0ab13b4f2c6caafdfa489ac7d4e40ab5a6d06346d69b09a4cd1a281a0fee59ed6f37abe1888ee0a7cc82f897b979ee6a4986574914d0b6f1b804685cae210948ff3fcb6b621cb7b16343a758be91ffaa6ddb425a2ad331e9a5ca39bfaf5f1a7347142a3b4da888a15b15379958eeb6ec6069b4f87d14f2f332c62ce187db15e2b36f48df9fb4ebfe107229b81cc29ca6ed9c1fb2801882b4dba2a230cc37742dd0ab97c6fcc44a3e2fe4ee537ec01970520cf316d8506994fcca4a4be0f6cdab2b43979fd9593bd815d805f9f359c5bf3a16cf73ea4f001a32b775817a9b7ae13fe1d8b8b9d629524ee5f10a2f122a19f25415783a86eebb09f4c47fdd8824666ae0dbb022ddab4357794002666bbee7373f65824d7aae0def0cb7a59e5f22b148db010488d23a11ac1c63714de8dccd6553202097ac96795e59bf8141831e48663af92460564e43d949ebe559fc3c230919d5e1bd8f6093d4765c914b967f923f8b149e4ddc50604b8c49ccff18359eaf0e073403b574d3eded0f64310bbf252135f3e0b5c6f8ed9f4dfd96c1ef5176a3aa34a61e914bb01728586886556587d7e6178a1cb8a042311977e136d438719378de9672b56dbeccb2b81caff60b30bff5eff8f723df149d89691ac25922e5fae475a3849453668b06bf0f3270089645fffdcbe99b1dcb50e811d1e8f0d96a56979a5be8b0853deebeddaea255e64f065eb1615880e4dce7e032753f3d946512ecad0df39c8bab44258479741a3cb16dbcab57b867bccfcefc2b9329921c6cdc6e2e5859aacf4547e553fe2c3f747418746c2dadd20e2a72866daa3c80b9f7ff96aeb97f7dd8824678bcbb3f2815fd633054319d3261637f298938ec9bf58d18e0aebfd9882fe8ec4a3f2f2176a9b3ea5af4320b1b5f1141500ebdbe566792a4f69ec9fc5c4dff85f44bd877ad983e1a6edc7d7bff4faa75945ea7361288af10230f665c6cbb2ccfe17325a63f7a027fd67d926440cb956860f983c882c149070061137e2beff716ac35c541aec797974c480f58a25b68a6308fe1fa19b9f6e619446fd63c54f4f6bf1405be6df963dd1acc52cd7657aacb9d62304f39cb1f39d829c9f8f0a28cec849e85811f880ddddc9aeb374f78c2250210fd4c758d487eb771c05afb215564b725b34e161bebf60c04672a9017456f092cb7565f78f92141bcd170ae89b4fba15a1d59f3fd84d223c9251bdacbbae61d05ed115a06a7ce117b7beead24421ded9c32592bd57edeae39c39fa1fe8946a84d0cf1f7beead1713e2e0959897347f67c80b0400c209815d6b10a683836fd5562a56cab1a28e81b6576654631cf16566b86e3b33a108b05307c00aff14a768ed7350606a0f85e6a91d396f5b5cbe577f9b38807c7d523d6d792f6ebc24a4ecf2b3a427cdbbfb0d943c3f2ea7de041e5a7a501b03dc4ff052c84719e13acd280cf23a68033059bf1dbd62d9702a2c829e5c9e54f1496793abfcee5597df8ce6e439fa6a33f605c4efa789b7ddc99c4bf44a0a736e4902ec1f1e0e68069a48ec228fcc77869369e4b0029c111742be41034b7cbfa16688c557348e9b55f36a036dfd98d52491ebe709d6822f451df92c7467dc81b32761e4fa495636ad7258f36d8a46cd3478f594a12c255990e3b4d3eea61202cc14f511b1624e8135a07b84cb3ebea7dfceeeb4210b6cd7201b59ff1a11068712b6ac1624895ec416043b7e2f21e8ab4c1d3e0f307c3ff01c4d4f789fafa15bb094efbafac56e46772701a8403cac21a4ec4c6d778686eeac02fe062789c9c5cc3724c4dc1f6650818f33cba796f3500ec482969d312917fac0ce7157a5670c8f25b5fd719d2e2a5bc63baf0c37a381b32c47514b8511b42b122780d90d647920e8082d624aae1c2f547f1c1528a6fcbaac0368298b240c6a7d71fd55c9a654a708871c562bcf6e22bf69da6d70e2094ccc1fa1de4a4b69dd8b14ae72df17e54e0b9891f64a77675e915fb0ba1741f0911501c513ca6f11acc3785bd9599e733b7ba555eaae8f500b51cb68a526aaf8b00e129c6f14764d00ad05ce323e224896df1531d95f0071508814c8d5a4046ad240baed9b2f4a6501d224ce24978daa88c050ea6b66b01256bda299f399398e1e3162823e23d1a1d6b93b22576bc6e239a5be4b49ca897b4578dda2a60e30acbd6b702101f9f549a8ebb49374c2b537d016c71b1b9372f444422dad9709d10cd6764e938cb89ca49eeef5e923a542f3759bd32188c952c47ba1fa806d9504f692d8629f8668b0fbe14c68ec0b1a555c52bd4a2639751334131face5d1b7b1b1191b160f98121896988c7363d52cd6bc8c0394f2d69f9c8c3444aba16b79c08692c6d1aa69bdbcbdec37801828e0ad594ef6194d064dd51405975f7fe2e219bd2562fa37a27184b805d4f6d1ad40c27cbe1c41ff7189a613afa03146dffaa59efc76fb7fea3658ce0aeb3d570c53fd6c040075cfc05af7d359e787bd09ca4a703c8a3b4aea1520492305bd72ec21477349271b879bc9b09a2cf5caae0959f17d1027225f4915c46f7aa9dde9f5b386d7b51b9deda9dcb9b1505163df86b0830b9ed41888b03f2c89345f0886d010a4e16f6361ca939dfa60ec83b81829d5e6630e19858bc79941de7cafa30f254087d9a087d1e500145cee291433239ad204cd897ed131352ee9b87822174d9b4c19076f0f53089948c5a52e8b3bc780afc390378c6442a3030d5d503fcc08db3b40b2058451f906411ecb247037cb83720df63fcaa786b82296162d8e2a088d15e624896e3281ee0750a9324c91f84c25c945c9c000c51d926a2b37989a1458e3f2a324535e68faa3428781a5b01683cfdfc6fff7d8c6795b73e495e482f6e4ac4c78febd3d76d11cdbad3806fcedd07936c107f698527586978970fb4b74da78dceb3e3337731b7a056280f4dd44d92ab87e0945a631b919c061ef635e57e24f8a430d3eb42682c5a7ef81f9bbe449ea4c442e6d6c2bec1fd5b53ba62166a33a3eca92651c58ac06a89c629cfe96c6c1da5d9df55007b69dbecd7b4bfe6bc640e0c6f630d7d14145f2b14c660e20f8b84b0f7f65bc8fc19d63f1d8db5c2cf26a588060274d59ea886c7666dd544a89d685a3fc461789b226ac697adda373d0bf8e40f9d3e6b84fd9fe33d98b36de1e2471613b1fc9be3441817c88d93a0608476a4ee8bb0bb5173f902fccf81da262a8f79065783af6edf5ca742a588bad410ad5f15667221aeac30ab368aa7260fa6c0079a1d9d2f9854a6f978ae1fd322311b5726b6095ad726b5407d42b9bde9178726518cbf98ea548582ecdfcf85c5863f4194e2dca3754415773390302e5cdd2379af2d5177ff5f86d801e31e4f28508782e28562b7f3b4df93fbfb80d3c56843561568094921c6197d7a3092abd55092bf920641e4fcd9623b28dd426add59656016c53d890c38bbc79840b30856d6df3c25fde0d6db224be15ccdfb4fef20e80c45dd64b40917fc5afeac05f11783cbad00d4c5fa293ffb0b0a35f1ff854f69df05191556c2f449bc1fdae1f2b1c7e676c51367cb61830e3cb3bdece63a45594ce6f0d5fda44e224f7e45fd999013ce2de5325cc71e8be3daebce32b0789344da6e0d1cf5379624a99c85bf324d07e136e3ca1b79bacb1a8a14df79dabac9ab0c0cc650f9f76cbf4eed028d794314ae2643430a5fb0b110beb16a18c19b48fa5635a528586e2250a3f2550ebb1cbaa3707625cfe5aaee74dd5406960174a1c14d8b21f9bd0657973d4ee5b994347a5faa0efac2a803c3a58a7f3d7826e1647e568fd54b844a8ce19f554cf48114c43137702a891355e1313a9567458e6bf1a0058637a43ac532ce3ea7f365fe4838d6ad4c4d99b41bc79662292c74b46ee9d4df30b18a6ce0e9bb9fa96174884948ae7ff5dc6b16bfd74395cce58c4584ad7b5801eb648727f24836fc1fb6ab92643733ff4f8397cca0c749d33b029e27cd01e46c3dc916251ce298f2a692d4be1bef4deb1f59d3dca4a002ee956e3ad2b90728e2313e9652aa294a3f6e9f9016f055422bd474373a635c35717d25b81002097a065e2b842b3a6aaf2500336a475207954407595e905d6a65fe6adf825a38777c4b3d266c293e454c65e404cfc9e154dbb6108f966903391907d6e2163bbcdf842326a5bad72647b654827a4d18feeb6a14987d9b1ef566d30059d4001f0fb04610c3200cbfa2d05183741a4ebf3b39e4c207a9c93c9472088a5c3bcc8ec17826b69b2bbe3d146dc275314b512706aec050d6aaad4c60c94e08667fd80542c59a67073f5bf9fbae6dac32a400dae1d881438de6b3c8fafaf80cf116bf1d33f735b4afc17250d8e0d79b00baba556d359c1ca5e4792cc385bafa9496ee20f5ab7d11ed587dec2cc374b413d5fa210954954eb72a6a024ad7fb63c986e1db0840d521587afb2677c4e999f4ac5cc836a3f14c2a3f02c401803ddaf85d3685fc65d245799f668a4a439abf1ba44ea585a244b78788dffc880ce6c2a99058cc4278f900b93c3ca204ee0c9601343c6376dde3f347ae5e163eecaabd75a6c5186af8cde5afe809e84812b3b14df2c26c6ac56381f2f609ab969dee2dc52707e4d663a566b6094ad7746024834a566d3b01e7480612167f173f9f25861097addc3558240674467bfa2a44d3ae8ee59959bcb215e21d860af39a6ef568f06f0348e834ce3752f619cada3f4575a416d3330bc431987dbb59cb279bb248dd13c4c56f88188beabea0b3f4bdfe8af260a7716f8c3fabdb2cc8087793f0a84f2c4edc4bd0777693f6ad500a5f73412259827f5878a49e8e50f2360af63509cf1f2de7fd9c8f89f7449c29ab82285a9c77f0c77727f4e33fce44de321103dfc572de93054ab5388d0ef9ab28c49219c9327ee42c08950c480b5c5bbd92c1acdacdcd47f3797cf4bddc425f32a55511412f995fe799299c3f9e9548edfa02f36766968138976b51123312b02992c5d39ca5bc854a6816f59ede8c2053955c4603f3b6d95522f4d01299c738ae1b88d3245b651eb4e3e1baee61ad7c7f13221738ebaabac9aaadf44776ec6310bdf29280b73f66d79b0e4e96be75a7d0f1e8e96ec4eea016acfb3019510ec9f1e8b7842a2f8807f2fc1143205b715ce990352f1e05ff13cc98611610ce8ad7d22a3c3a994afb6cb7958f2b33af2ce6399c8b6adf2558904c0b7408c6260d173200f528469fe62f95e5dc59195004ee3165502f2aa987a01564a89a922df1f281eb76dfca74f4ab1e7b9d6f79b495df719927ee791908cdc932734e0d1cc604527835c39d809379a1b526d0bd636c247a96771b52ea6863d7f36895bf9915c71405b66628394f25c0211d1f5cd2d477acebc2583094032cb2360cf3f2195db557327d59f315840a0a4de4cde0897b2389079e07aabc8562f868b50b7d240a599c7cfef1a69bdec0e0aa224ee10ddcc2bf886ebc29ba4bb11b0a052e893fa81e4453bfdf8b32bbc4d3b43a24c6c655df90dcb8e82613e2917aa881efdec2b39def3534664970a7a063fab0e21a4992d4ad83010e386fc68ec7b29fc1c653b9330db0014849ec2ece01fc0b09441e003c75f9ebb0c91483f362b6d336e879358820528ad804fbbdb84e26ccfcecaa1a917acfbd5250a89779ec33b0d1ad999507b77b45a81335d0e999096b5f6c746e5e3c731a7587a26d8cb4a7ad048e4b642c43b8d63afd0114fc83226a835c03680d3b62679cb68892a66c814c5222e52f70559991031b13d64b9ce03f1b33ed9428e83c493a65c19351646f034cd41d638e5d7c2a9305b4b16136f17d897c897f2bd36f13c12de3ec184caf66574a5a8cb0cbfef75d358a12d7e1a49a40ae7d85a07d597bd37776095575f0e9f3de03278231908bd432ea971a4d9819f33220440156a9d5e3caee77a380a202c507cdb09d2ebf4c9a768c9aa2ab3a70f3b01836d8efceb67490c3c38cfd51452d6010a44c03f9de1288b6b9fbbb1a43d490cbda91b9469208818c597c3c7d25af7f529f3961cea4dee21f619fdd95e7186cc1bbb6439ffd11f5aeb5fbde8438cdae29fdcfb8bc35420b2d2e09835bef319c8036d10f395c1365a165764414d2fa84fd4c898921040e6c466bc35cdac0a2b88de85c8ca1339f6a1af4861d9d98d88c5307e153cb95769e11c757ca711ffe49515cc33c7618186b61cfa5bb9d0eca3cb1bc8198ea7e2d1905bd214cdd31a6b760e0afaf167e10f21c735fbe7189521e9fd6c4c92c028465a8c9ca647dca3e9b33307c4510ea1b96b16c1e96d9bd029a73e33574fed73efc5159bd91b12e285d5eb8a3aed3c08ab1b7365cc533fe4e38e46e5e2cd1709f45b5f9756535f1f68639d5d04cfda5f0eb945ea4c9fee1b78257d4a941524337ea4d258c4f7aaa1b9e5b346c9ffd1ee09cdf419125b8fbb10f44c29162efe39b527d6a5cc0ddbb1a1e4940e318307fdc5e0e8b8c68e0a0dd284194c0f208b63c06cd448169fd99748e7a87de66566d46a79888f10414759e75c4d7928f4b5f9c7fb320749b48e9bd576575a8dadd5bb1f213e68967b2de77705517909b16242f45d5aab0d55e1057119096fd1613bf90c5f72090344a6fea9058c14595f7c876d19b2fc0c89ba1c43592682578b82d75abb8a3bfda49ae7a5e66511c107ea105ab7a4c1eb58012974bd165cca32919d31bdefc62ca4efeb942f463ae8af9425e4bf97c455ca9e742bce41c5d05f5093b8ee09723a4b8e509e6996557762620e33baf3cbf0e87a45911210841119a70018d54007cca25f5eea1bbc2b15253c126e301f9f64b97be4ce13e96337687e2e78fbfd4c8daf4a5fa1cd22846b020a7bbda785085a458a9809593528e754bd6301e6a60a227c3899ea082f282000b48f49a98ccd7a9590ab6a6a5d9ccbe64ce8db20a50936110f55ee524bdedd2722973abd9cb86bb073631ad0c7878b2513052d3160116f74b9dbd436de6f4a803ddab86c1d8fd69e1d094113ddb1cf1afb011f9f41ea75af1c73c53950a40e12eba2ea3c771b626874e406b906e13ecbea26dbf4ae5bf1ca2265e9e50a43d2e61535f8b71324b815623e924ca9e18042c9ba86b7112e8bcbb2f867c172143d02a4dc0b6557727fadce5d0d5430773e8781064b71d129eabcb3766855f1e1f8707edf4bcdaccc60399f8a9e57026c20a0f85250a95615b7a40f25132af070aa388d86df777bfb03c0bf0d6ddf8787cd9718e6bde708b9998cad4e91c7d58afc60b719efeb2ac80f4a152ea3732792ee74c809bbb44fdf397b753809b409f796f2e6dfa5b223f82de08935689c4a532a3def047296934d3e794f2da47af57f1ff501212753cc5604880369e3e058942afc771f09173ccc518f23738aa000ea4072f0279d568fa93d4c6b143dcab91b95b847a2a8bfb2241ac3d953e2ae91ffa0709b393044d3b87f34a97c9ddfd5b0147a47d579155d1d401f5915d42d1287e8f7ea9f07a3ff4c7347a6e92ca9151d4f495f00a1a1a67f6cab8b018aa4ea4bbf10c5a04cfe7d2dc08d48a512afdf29ed2d776a4bebf311456e585f299b8110cec1148624dab4230f0e78f776799c9b972e775c9d7cad9c7470a676dc9a3fa1bc14bf97b9c10cf608d31f268090b53cf455471ebfdb3de8a0b95f8fc92a8cc53211ae1c333aed6d52e3237b5a7b90d4ada9d0f8da9009bd725269f218d2d043d8bfc95cbacebf5296466e3e29c2972b6932f83216247be39242aee7f21b73e45526f9a17403ea6b7b05e6b718ee3108d1f9a8139a1efa21a79114b67f8cdd70524e24318c64d681aa27752d4c86c5348c05c9e48f06ed41594785a6e6ad76af764033552876ec5bcab402eaf012bd78435f41ee1c65be09526de8005006a7686a030f5571c392c384b574342a1a809a9e0dfa766ac1d442370b240de420d665d59f9e798ed2317f8031b554222776624419dac7a1a597b4b3272312cb826d6c601dca09a72b32586530ac9202c0079ade8acb28e8966f266ccbcc5a2cb4d246b3847a4ce657fb16dcba4135ef6e9b081369b4e0671ec4610afe072c303f6fbb75dc968b71ddf6818cd85c8713b89a768cbd7c3847c4fe2e36c9bccffeaaaa924e2d050e70458a601e91e5ce96266caaf18e0d78b01085539832d38cc07ded95e880b11d0c181e7d39eec453a040796ce9e54ee8c98bc298d74435ab9b419f8ae8dc81006cdc1c9e86f5e25e578f2a861cc927cfbbbc1bc79b04c874b97d273af94a5dfeba1ceb8cacb02536e69ae5be33428077ad2cf9a68e7c752e42b9ef6dc1d12d611b5df30f5427762573e913ded6584126c861c5ff56b325235e7d5eeae879d96fb9299cee2661be7127051dacac14532534e5e5989bb1be993352dc7b174a4a71bc074ef3c966e363297569f15e7d9cbc1840c339067f29d9ecbfd1e6f64d66ae4c8071e4e63ecf43a2c16174939b05329cf8c5ac3e244f2baf4da5f42c8916708f1b6d8a24f26859b9726cfff47776d1ea9755b8eca817d6a482c16d620643fdb060aaad2c8898ec970ff1582918d8df27a5da24b8146824f5e98b193fcdd39fd5d79115a50b454663205a48d98711a57ea8bcb9496f2c5bc7076cc06ce5b09b27098889388059ad462e0e97acca0b6b152a623f48c14ac44566cd299056c03ccd7df8d38df1bb6a68c0750d4cebac7914b2367e5c12aaa7948d141d5429edc9efbb4ab94b6553c5f05ef7725ef1de16a4c99f3d2e6b344cdf04ab6460651d89b74ce4041be509050690fc8d8de5888bedf5054666d3d0fa4c54f8c65b123ac54bb7307ca478c574d4dfec277ece922116c1d05fab5366fb0304650bed392bc6d38494e88f266f587fd22f08dcb4e31d47b26951a5f2de952d9c58fabfe1d8d1783c7a1183f7effa32f22df84da065caaa5236e3fdb82011f2a43b5c79122931616649c029f42da213c54fbf7998ff6f6428a0df5bad14b779a575f9c3d4062cb88a69bb292412984ad5fb240aa79953a0bc100b66daa3ceeb276e994330570ca23042ca2a90842300aa9af1a5d21cbf8497ec31c746b3a06fb08e04a42d041749e13cb7d43e6c8c5dca95ecf4236efb38409d1726f92d732eca3d018cd4f596d524bf49d038b31c88bf52de9fa1784fe53f8c8629fcfa9050fce35aa42c13d06e823347c6863f18aa113b8e4e542203b31d20457b56003ffccee8d5933d440f3a82007a5d2efacbea46b7c6a845555ec961c01ec20f29c75ac9b43b010f719964ac8eaa3e3acb7c71e82d4c557bf7a95093d6d7a7305c729374af5398ab83b81288459e11b19972667f07e9fefef12d6f3cc939d1c08186cf5842e7fd1860b16d9f8e207d9c4ef6f291ac654bd72c2f4fe3010ce9c77f4c35fbd3bddb5ef2cf9c78cff62a02d1503da88488e30d8ffa1710e618964e400ceee7cc9fd8861f59c79b71e9c1eb0ac86e4bf71a6fa801d5f04be024815bab0e21a493539c96d1961891ddc1ea60e1a6ae036de296b16c07021d57fa51f9a899f7b892a1d099efcfb5e17a464c673e3124564ea9012fb7d9740db360af2d1ff698ad2f531c94614dc613af40900b09b2f9ce0237572aca936fa45c1f4301f86e2b0bd42f27910f5574b0e6765d512a7154f3f15441ab8d7d1a68baffb47c1b47d958e8ff9a97e132e63f86b15c4389b65e4c84c867b8e8de9ee335c7aba671c9c91ed3891cafbf2a4648f7b935e80fc93e61215a705cc300229d3641cf88e03e24e4fc9656e09187b953a0568f48a2f11dba32d4059c0629cf1d2333c92951ec1133cdedf0323f8f69e9eb50126c2b7823e01dfccd8299a2cdeb66664092ad1cb992ad5891adb18b7e913f6e675b93a4775a4c9b711564b3438f65a2ddc9da174389049de15acfc220d40479361dc0be42b02578985d4fa359918aae48d8c222d8a03b858a40827e7539a33a26bb9c0dab6b125deb6343bc397a3c5428c64b88a060b8d83167b005a8488276e03c0edbdb127910112e264408d2e25a259c5f8fc250e45e81d842a1df890af80ca8fd6efa2dc45ab3c6e284f11fe689e861e58167f927de1f9a21974285a387510853102f445a0379345dc41aebafa9191dc5a4b6e1ea22b6b53332fbc3b6ea5763f706a2e0a3d30a7f814cabbda58260d9e741d89293f0ec3262b92fcba9eac7c1d19b7c8807920faf3463cd1e30db639c339ff4948c11691895730926e64f492ac916e5c5ee072fcd6052a795b87ecd6e9108336d3b4dd66fb4a9ae5bd3e184a7c7be041ec0fb13e0ec6263aaa5314457e9c2bda70a6bdb40a6a449f2da67213fb3dd021be53663f0c0d826e55fbd70602316b9c960351f9255a9007462abc7fb75b90644c680c606c4ff1bcf4eeafb90274c4f5ca4714b6da803fb68d2731fe1f59a3922c9a1e428e01e67efdb7f8af0ddaca9e740e806d987f863569488d1fc1ccac33c57606661fc7c35cd6c46c8862d7eecf29b62f9dfdad260c60fb28451d090cb1ad986f4b60062abf26b055a5c000943061da7cc8689d71941abb8e0eafa337945b5db3531d418f1e53e85eb7a3c96d4aa2e7e26d77d50b74ed0648fce83fcf6445527d2d960e6302e4f8e21e6cb6dc76636b0afd89c846176e67c360551336a9f1f3272b68d14905604e8a4aa93d645c29d061093cfbd404055c980984e20fddf7dc4bed141e938e4c75a1dce7e197647cb45f110ff417c348613128e600ad58bd6a45e3165ae5160ffad3458737d817c2938f956125a3cdadf2297ef713b1d2b919bf9dee2ac025313a99052594b8ee91da6d16df24da8bbc9bdb5c368f9fb48187137e19e2874446d16dac31accc7171056215d8565ea5eadae14132d8d9769d2eec241836dcebb74bcb9b49d45528d6b11902eb5e9274bf1bb5de6a83f1a1627d93f0678c239409063d62cca0157d3949fc6e968208a0bffad3845c156acd77ffc5939646edd5c29d2d8338947ff72f5c86c96885338253d4b4c37601c7435421db6e131bae196a7d268d1c25e71f1f4542a3bfccb5c21155f42c46dd79bb7d805fe06c6ee6e77732b2e0f5d8fd6d8fb0aa7e2accd1c88eeafc1f4d0d048e6aa7cdab00b52ab86f3a5d1f4422256b071b38c9280a4a0e12f0572d0714fa4481e4af2e8e82dc14b9007fa895a5f1800be178054609711b44227fd5f389bd7679d36edb545c9d74eb21b50d58b8d455049fe2c2f34ed978a8edd09aa0efe08cb900973200a6c1618c2a77ce0bef604297c30372be4ef59e97bf13eb7d9be60fa5d8b2e301f5fa630267425b2dce07e11be744a5058e5805c712946908324067e6e84c3ed6ceaae1e484af454cb94db9278940da779173368d84fc63df27822df29bcdd5fda54566b8ff191cd755a4234105627372dcc9b97182969c41002dea3f8fb228f4fe7c89e6230a325c079db7eef8341085d4de0709980d42fc309605442083a84b4e9293f2bd0d264963bcff87de30223f2e3297bc41bb286f5d7d0796eacce46f2a3a4d6519ac893dee6462a223d138fd2d49e41ffc4a9cf8db2579be6af86deef5d5eec3c532aba80c3679d475a1b54e7686949b341611473e31d4111d90953955f820853c6a3df631a5bd85203c37b17e9af1b495b84 -MD = 4b10df4fbdbcd0ab46f3132c2285a26e1d9c74b1b7565526f02de3799383ee3e183c6d11b9a500beda827873039c4523 - -Len = 81808 -Msg = f8c0fef4aca77c1e89454323a7a348f8baef10e08c21c22fabdf80545e9df716de08351ec3a5bbb6bdb5d4d0845d254a120384700ffb0ec38d6373f9f54b9544411a52d76c2c9da727c0d46ece124df69ac43394188290f2dae6aa126c99939089bcfc288f864a77312eec066c0beb84bcfac2538f007147fa30cdaaabcf1a831fb7db1715f9e9b142c6c39f4690257ddf6cdcb65cbbd847550983c69a3551a369d298afe4cea3dac151024144e823686ae327c368fcee7c533974702113617bd0d7dbf5e54d9f7c189850f44e5d0ecdc7274b84990ada6d5d8749af28b07190bd8c4bf300bd061eae6056c14c350e345d00f101d82fc5a2d9bcaa8c9755aa6c96bb91b01e68ff49eb74bbaf26b94a269436c1410eb1d7a431a03e0d564a3496c42a55342594b384379b28c7c431eb2ad490624c21d937facbfbae3d4dd73696b0a23e88ff8a4957fa9c45100ee518c985d77d2afbef0e2c1195a1216544d8f5c1eaf4b39292ea4a9c40b992ed1cfa8a0fd3b9e4823b83c36936c0c384d8443a5ecc20bdc8f3bee6854f2d554720b9f5db4cbf80a004bf463da5b32a93dc9fedf10e6aaf87f7ecb21e91486206377c924f0a36093c94ea3df4ab215e7b981496e1797990b9e49d37cdcdb3c010aa6bead4d4c7843d312b30f610b3682254c8be96d5f6684503f8fbfbcd15774fc1b084d3741afb8d24aaa8ab9c104f7258e6ec78ea883f139c268811571790a9c370e8b2b0d67513b5902d7b16e01b52eb94a9ef7fd81e0bf74e667534611208fad69fdb51a3fbb72b0545ce48cdd4a957fa7c635e8d0c155b991b912c9a0553ac0730b41f2b9461d0307a0cf87d8361e242ed3c4d501219122f31cc066a7172222e23a7e11348f9ea3a539def983061d59184e215c937ff6237308d8c7b5f4ca471011a61061f67c24a58e9f5c7e1917812cabd7e9f83af94d99e3e8472d6cb79f8517765aa2293a0891259d2b2a0d912ea46354f7bfe11ef3f0546b7fadfd6ebec9b25b6a75866cb1f08534d007421ed4481b35204b10ebd8eec0dedb981554075688c1ca6cac68d33c2402f5966514f46019d4de3a38c44f1dcfbed57c431c1ba3e145e4f7e9c2cedc98940677c518118505d09bfdc74ce8e5c78817db050b6e4a82546497ed1f176a49448cfc009cbe3f6594e4165afa18df4ec6fd34e9b671a2b279a3dd24b24f6dbcb0f3c3a6274cf79fbe311452405172cbf8000a5fa1b85518223d280f40d94f7955c54f142c60363aa92d684ba44548d597cadbd561c4da19ea9b192b3f4797f59f9bfed9307a83bcd21382b5ba56b9e222b819f95b099a3e4f4810f6f20cdfb81ac26363b80e58ace59e141ee6f84e783552552a12091e0bacbeb0012dab7f4743e31d52479e3d7140276ce5aebc9f1e2c140de60b45fdf89f7976c836a5ff19a7787d13439c9aa07e4a2db89616043a8387b4cbcb32828ba412c5baa18ee7a5b1ed132550ac08b0fc60b6e621871663e827ea39c671744b36e53d66f2c8c171ffdb6006e32f00394725992cd5a25e00a67f0ebe71651bade49b3e3baed60514edadf4466fa8099feae354cb26da33b76af792d87090112a299f58d73a493af507ef30627aa99d6b54347a6f99a14fee921c27063884dd56625c0d982994cba8db19b4c988a624121f936a78b29a0b2cb8673bc63da5d8a94b6bdd1cf14b4f86e3a7f20a1e20462ab97aa574e626ede83a634196f495ab99314937c435df3f359e346892af9a6c1b9e74dbf2b8da70a7b49ab906f1b6cebcb07ebe2c4bb3033b77299901b1871e7b5afc4e60af172bf1a3783284b99baa6a4576d0c3b78943ef1b01f3b5c878d5b05b8bad5d4d7f883c83762eaeb0b6d7586cbc00191da469e6d658194d68e21a513cad5926f8761e1ed13f1dc38b9acddd92d8dc9ac2a6edb955966a36f75554e45adbd27c549d45ef191d70818eaa06805437b6d76af367bd053776f108352dd05281b9bbd6579843d7abc7674e8719d72d633f4d6b3c408851d5c00a20140daba0497f73e2279da37954a2d35f9460488ad5c66b37c400a1e7dbc5e0b3747cdcb09d84232cafce848ac273541664726b0929fccf753d307023c3f92356d8d3fa2ff878480a32937d885fb9682779e8a504ba42d8980a58999228ea306eb3db8a6ae4bc610f6294e50ea6f58df7370b9d2a11291514bdd174bf6519968f87dbe3fdecd0fca0a24b516a12a843fa4e8399c5c920037fca33a80822f7c42de75dbd556b567962941f59472d5228c502b941844cb8323da2178a08cd1557be34f96d0dfaad65c99a89531271838adc06451ac206621fd2e7c5c13dddf2bfd5030779941546504a3821d54869ad08a3cb9f9c2ba0ae3ad40df6b413d0007af6d420796445c1b768ff716675904f10b0b5213c1d860cf1b58702f9373dcf07981adcd30af6a019aa52e07d166fda41877582711430ff030be572f6f491cee43d69952cf4c251d582d5078fa762ef099c6f3be1ac3c04bd2b9bdf33e856809f5b22d1cdce13679996e84f14a503fdd76414a5f43201beaea93ca0469f0674a785e91b5bd37441d43b1f3fb29bed77397308692f621c7d46192a5e95652c2b8b222eea5dc16f80f403ec41dff869ebbe4dbcedf9b8f6d111dff772a6f73215c8c456c72a046fa59765d20e034713ebc46894bcf9832b4aa082267501b1a2a3cee1132a6708ef103cf562fcb30475c7ea38425e956d245a609429ee2c1118862c1cc69c8b6b78613327018665bd0a30ae51283b53d37c70d07a84368cb1ee1d6ebbf3861d98a609386f404391ed3b867f27c8dbcb628e3e7ec9d7f6aa00ade9e5632c8f841cc288ab52a1acddf1a469db40a6d85276f413d9f677a71a89c26c4e86c401556488501a65a83a9076bf3b511034899f9d28816084e5b044b9e62508bb7c9417fc520ff41cc6655ff8f67b6f3b1497e951a617b0f9c4bacf1d6394826598b02270aa08c6ec8ec5a2e4e4ba8415a95be610f73739c9771f0020e54b6a19bade3b3e0aeb015953d3ffb6f4794e34757e1c77867069789f658e60c5aa1e4c558698c0ff2741e7c808cd0bc0281c0c0b56d2e1ee43ce8b8016c0599f412d61fb31e1a5f13df71c5deca14fb2577c20cd7ecfeca931e776dbbb5c87cca1061f1e789c598bafaf7b87e802ef5577ed075e6e59e421bb32cef4bba957f83a36c821b32f6818ecc969c89368872419fd2410ae1784e2604f088da03d568c7d3e01b78a213e3385d37bb2674893a8be1b1b96a67f3b85917a97e9019f10040a9a304266086865fb5c35b7ec39914dc4d53252fff77475ef6411a94834f0f942c9e854cf4b532acdd20c5b8aa20c9dce9a1cd80316cc2dda99ea40fc9595d6b65b9e612e70aafc6dc3841fdb2862234bf83f886863bf27d36aa64287476b16e5add6ea1c0ebc457baf116756134e48cd7e2f069854a9fe7a74ba1080b0dd44415f0662107c23b047f358e474290da8b37a4fb50b70290c3046ba5d616888f969edb16ba45f6da7734ebef9cda03cbdae9b36263a2cb8fb853f1b6bb1e4ea80cfb87c69200ef6a58e1fb829bb3f67e21f5f56dccd00e626e9ec51ddfaac7e74d36dbbed4c315b24e8c4c8f6d54cfbc07615463b0c931d28eeccf2269425b160257be45a613d07c023fc85e3945f84d3437b78e3a139ea7c046f70c826e72fbd2641aa5307a888e1c015636280fd7f9517f05348f38bba9abb3252551b774606667d6249b7fa5b143dbde616239d688063f289edac0f2a0f83b41b3ffa4c90b6567da0b0fab8fad1fd349250e4b5bc1fa8107144131aa534ee633ffb3bed9c4786d0ea2b384ae4a59f47dcb54cdd06dd64c8addec154a8b56bde351968b0d5547805a30b0946b509943639a5d489c5441a9994304f33c10b8c739f1d095cb8579a8a6ff2e632c8686cae3dc5144273ee49e1c8cb154e7aa1b0c1e2688647c1bb7edda5554775ab5c990e6d75847d9f36636fb011abfb32127957839e67e89e0a858de7b4a5a5ea50a9d52d598db1a3a71761eea68bc083c85693172136d589cf5f09ab939949e1ef0fa111c3c8752ddaa686e8fc2d34ec4dd902f1937b9531645bef65649ab84e823ae09f46ad4e9a2bb13d137518ded82d6135c7679e8e11841c8db9ca12977ca4cc124a74a4847524c7f302c3d714d3b19f99ed10284696891182fd16a96de8e133c487c066dd4b504b574b4ad08d7ba4e4adf71fa1555cfdcb6dc3ecb7823fa1f265fbac3cbf9928cbc8318c9d8f1c61c0f069f88210c15caa8c82bed59add7198750aaace81cb28b9c47a0bb6b04262b4ffba3d432f60204f8dddff7c0e4eca8670394e64ea7deaa5ea793a84979a32412a6c507cf7b5e32ae01a41236300375cf60c09c8500dc91098a3bbbf8b605af60ef4d498103f0fcd01ec06642f9e227c64f75f4139174e7a5dade190225147342be82c1cef68108681b7c1a6ca7526755b8fc1682c070553b7ec5edef2d9719bffbad9841bcd9017de020573ca21bdd83839d2b5af79782d15e385d45355848e08e16f55fbdc08d1855f4443b5305305898a05b219db01772627e918ea71da9ac5f0501b262fe544062400af020d809dcdf4dcd611984bb2372e1b251eaafe42b56c2e4c1115afffdef4bd0e3725b0f1841ecaaa1d5db17ee76a7e81766d6a0655c94c514339e3657e45ebf9db257eb13a4c4196a387cd2da56195a678359856357c5cc343190a05729c1ffa5469544d5f21e4343aa3195effa7f31c9a9023c2c319b23a871f9e604a6bcb78398dac367114250b493c008364a2194c540976dc8d05feff85da0b06744970fc00ef110d0eb7867455cf2d2b62f46ace4b0e1c0401e585bad5c4fa586e99930e312a1d2186608b07f6b8f9c788f38a1ad61a8db9b01d08c4ed5cc6d6b7e0b42740bb1b1486c3954e9295f0d82543d9aa9bcb469e1630dad6332e0b11eec356cfc61ea5767e4557b0cfe29cede649ebf5e27cc101a2b58e474da5319a5195fd7027b14697db5a24c6e53b78694a9a339560bba784f41f9590a35ed4c0aefd1ab0ec3f79293c969f0998ecfdeaa09933019d1444a888d3836acab76f35555d20fa8a05a78af07f18f15193a7e2a6eb8cb2ddf332ecbf65da0e3a4b5b58c32ac2b597a06c3dc57844f685ac00d1bbf58331c9f4ecb2267afc13688733bb970a528a8bac41c1fa1685b1cbb283486e4bc906e775fca94c577c12dbf782ce3f6062e1ec65a2b82cde6d9b9a23c9a72c42c09a9d12cd229f9fec850b18c3113ac1764410790970cc446f2c579c2e8e749efc657147f8ceaeb89fd28c777f2507a1ff39ce53008c56cd0cdcaa783c5ee5a4ff0ffa81ea0de8363883c670016a2486803b4c90028b6aecc934f9447da8ddf92af2af5d1b50eaad39214faf14611fe38bb1319ca9ce673816bdda8d6cecec1012a5f6362738046204339e91029a684d843403f540f5da1387efb4bf74ab9e6e48a265a97843e4093c2329b266868c290c4c3a16727242139f331e574f6553783f607423a8d508174388777faaa60a1a76625a9ca8c42dcccf307de1379aa9c25978b831139bcf00bccc1e7569894076750edbd47e7bfb939a6069e9d7cc0fe14953985e52d8c749fa7675100d90edd16aba347a4e0a49fc733b58dd9a6a04396179ab07d14c8f779f0011fc116d60cfd9ecfaeaa1ef878bfc39c1491a05155f445346da3947660e2d018b861f7f27b6452fa5a214ac32b697d44998b11db1a764892221d55a097206f3384a8236c1192eeabb3d10b0ea00d8a348690a2477c63483939b4004d837bf4daeb5e434cb8d19b6b21810ae0bff311f44168fb9c62056cb318303d860e3d8795554afe98576781c10cfbef4170633b0d34dbc3e2b3a2dd862959b3521fac52ed2a35fd5ad59dc735dc0561399ba43006c5b1a2215983c33dd2f70bb99f127a69d2e7e8991cbb964ff96808d128ff17675eb142623bf0455d7dd1edc374b52a92b628665e13091598cbec8d10ffbc18b966a548ac41308b7091b0ff7987de88ee3cc01fb0a2cf6d97bb5898ff08235d8345535f08538dbefe765cece2c0d4bc07cd76bc97b154c5d42f76d0a42c7b0b4d62832d7d594d068d939d5a0607e1ef65d213e51b28e146d8900cde09510e4da027ff5a133bb98aa7523bf2ee454b498eb1604145efbe172a47e3693660224902fb8e8fd2e11973d31afd5ba1605bf10cd422791cef336253bac31a31420027fe46f774c334b5e89a54ac3d2742591067a12434a80e884cd953739904ddf010197103b0ed1ad4128266104289d18dcd25822d1bf23504ff4679bd8db71b392cdde27aec597cc01915b9f110cef73e51d0de04d6014df0a32193679f50e325a2d10224cf0d43bf24dbb5174ffe9bb6c3ef1c720cde3c945ff30b3a76d91cfa9b7d39c80213551a5b5bc24aa822a53b4c0ba63f658fec385c4348febb59b0013e6af0302c739c19e71d4951c241fc1614abe3338b1e4324c299b27b15d98682b41f8d22f633ff03f0a9b0f547638a8f42573b1523922b9fb87db1782d6086c524247a67075d65229d8861fedc9036edff9816afd8f48bf36678adbfaaf69811b7021dc709f8b8bc1741c2342bd1e87a72f4dcc74f4b4a66f5110e1635a3a4b09440e009a10ddf1a865c3d5edc2d887cc4f5f526339f52418dd13c46767092e8e5662af779a3c2841161394697adff3c1c23ca942af98acc553fa01714644a02cffd625739c24941e0d91eb203583302a305c1d9dc60da4e76e3a050b888b5457c8cf2f289725c9b1c4c536bc8360d16802343bcf3dc2a111845a5bb09e2b9fb149b41900fbce3d8ed4042398f4f75bfdc05b9061475625b61ee181eb07d3f6abeb2b7f976a7c6417a3f52e300ac5446df34897fe9346b757c655f42545e30dca35abcf4643ced1eecd0eb33c25490f3b0371def1a202ba78f32e4ef9e8f7297eb1ab84a828240b76a7c75ef7e4f130e7896db1e4f418b38c3de0dec3517efe4bd7b13c37781a8531dc958e0dba6c3df5eda2dd42fa073723ff04403c3fe8d0a41043527eb410b3c2d41fdce82608aae8b8a7ad86244cc9b2cf0f0faed4c3653a13d873e88cb53b8c16cca811a854fc2272e29f391367cfcb166789a5d0ad10502ae6fd0f326661001d128c04c1efa64594ea4ed647c6dddf7db46abbb4046698fe056a4d75a2e8c16f88054c03172dc4973528e8220858625d7c1f5aef47dc76d5aa583da709173286938061dc9a17220249b9d9429ae3e64e0513fdf305d67c7a4c235a46f790f5eadba9c0beb6e6e06eae7e441a0cf4edc805e53f6fbd090c3471782de5fcda6e14b6cde34a1c117224c9e29328cd0feb43e50f79a5ebe8b89ca0a3230487581d9cbb8963df282b69dd228350ef5989615a290f4735f0da142b5050c413358e86db6058ad1e799939e04eed07ee4115e263584122a09a61716916fd9ba276022c592ba839686eff64e6b56c12a5f229e107e9518676171382ce4b061422d74790aea414934d96a27d58ec9d2b971b39dfa062bd0d171564bad39306c824c7c33644301a454e8f36d5af5b0c9d41fada40d53af0011403e97c01556c2228c6199fa27625c9eb973120529716f2273f6fb70ef8771cfd60f658e028c2ac9f509f3f51dcc38b957d05cffb1768c4c7477ea4c621debb23cb3fd3f873a6e1f905d897caea7024ec7f494701525e8f92a18b9c932d836627910a7fa2dc654ce6445a2b8605b800412c50180dee84ad29ec2af0ee91f19889510abe77a99a57b79aa88d1be507b84412ded5593267c7ed75b15440e5c5dcc999a502ff81b28d0d87281ee4defba755c139e1abc4644a6ddcc33922af6cad58c95e0fa2fb4a7758887d637979e0780695e5df5e2b26bf2b9fe5121c455284c76eba16fa6cde81291cfcfd523c6284d72f8720e8cd1b90972d8b71964e13fd85f83dcb7e5ccb54efc34b3f079d0e6837ec8258e420bf5941041ada19302d7225045d8f9741bd4d1d09dccaf222209ca96b6be9d8cc8e93a9c237ae1d720b7d15019df5edc200d4415f1603ba52659ccc1aa8462f3705ba41d656702bba3a88e68e7370ea4452a4fd41ab8bc8a439e2e078cc006fe6b147a9befbc2cc4f372019f97293054f1f19914ff1c595ae09f9b7044bbb03622dc631fa9c1867c78ddd1fd11fded748b2ccbdd88d33a9c6725b905bbba8921fb7a07af7bbd396a9ab1a78a3dfb6c8d7da18c379d2788d83ff830cdd708b9495fb80f564dfa6c16c2b52a4f046bd6262e19852b265e6b96d0e0a9d081ec6736b75c231907be480956b203534c9452c8065b5ec00bc10a5f82a5cc17a2adbc6e692fea029152f5cac070d99effbf09fa6d31beff34988ebabd0e40a92094df7bdff90d18d3fe9ae166b7553903342244cb614dee8a2b1e30e9e4ae8fe5e9f8e57f823363b50960d7b24f1f2b423bc62e88b4b498f3c1e3486eefbdcfd7f43132b39105ec20bd6e330affde7ca21c1d410cf29b0258a4058ab4f71673e0fcb0ece2f02bbafa60ed7dd8903a350d1e4e04c0e3a936a21aab7e24c46082e74b9d9a73654cd52d3b043e83cbdd5d6a8a82000a4e873bb76cfdad241d4405d32721c5d0b910469f96dcfc73756cfca1a8e0bb53fddd1981e2249e1dcc6a038ed964f460b421143ab99c421059921b99c091bf04b652d8e7c348d978977984ffa88daf8b1d2447e4eb6d95c23ef5c03c1abc9483428e81d05990e79b471a910edec47fb9bec4e88775777ff1eb3df671fe8ac03a693a1c26ea254ff0a4f430a3c233ea525da7fe0a9fe187052913c220b323cd8ff2feafd0bf2f99dd75b06ca69bff7abec3759155b1d43666c01f2e3182ae43eca78144b620d54ecc84f54affb253b766b8d7aa50f377127c7808418db353a8b84e6ce2c0543ff524976cd4974f5528b003744fe3adf3a5b01976031a8e3c865bb06692d6a596164d77bc1154b92d55056ef68bf6266f77686a137dc15a8e643d95185be0590239afec8e091f3a04c6cebf026371a7140e0d3484b66b6174cbc6c52945c6b9aae7b2bd8ac5e118020471bf43e13c7809f4083f74b6fee914425e074258700db7a7beb4574c809c4e9658365e0c3fe177b1bf538986643b96516d240b9dc69d50023b979ea6e60e1104e9ecfeec632a86cb9c386b2d839f23805be52b1bb1b09e7f912f06dcf9b672d78ea8c98a8e9a5dcc06b5c3b3455ce358900f4bda1790c9a6284438f5a3db9a96ae3467eda97a253c6594392190bcfd60746d12e3e283f8ff689edbf9cac7b0c9b056811d9d1205a1209b747e4e0599206fc6293df8d25313ba0498f158c0ddf8fed7bf2350aa2685a1931dd26680e121eae137f043c50369843f17e4340f49acff7ec806ac8ab06f4f43db26c075fbea4b87e505a9a330892f18ffda46fc1b6c1b1545ce98facae892755781442c0f04fc80db8314b601fc2454f9db76ce7cc1ba62dd84fb419c77d2ef39ebdaec46f56394c0726b449f49cabeacf0accf9332442f392fbfa84fa4777a286c6affc747ea8b3ddb969632f8881dc120d0458947214200d7cb770bf7e9decc0ddcabbb81f82cf9c57cf4e192c838df74ca798588ba63db8407f6f7f991e3ced518394a2cf4409d3807a5d49ef1d8aff282b3b07e755c723f5b6c3c31d551d6cd06f19bcf488fd03c1ef334a46bc5d8a4e13b31b0bbf46c0faf2301271eef8bfb8f1ad7f25be13bdaa924292c9dc70392cd5831a6f5f272fdeb616f64d586966999fd251e95fe85199181dabff1a6d8c32f53d8e9891f2b10f76fae6f60de9e1f0de3aed95eae5702bc5270e4ce29fe3ff0744d00e1434050bb95e5d029bf4c23d4129aae1eb8599b13df12249c1a1e0ef603b973632658c5201a3d1096f1487fd4d310223de532ee7e6fe906c43fdf392b4843cb798f1c780c48ddb6113b393bf76d38bf23fd8b03e64c1d12ac60eac6768b148f8a4733706865ed4a0167c85d242a3b0c39c80be031bcd5d0bd47e6c0be135347fd1747b51dba9755ce3b9cef43504191e50d5b8f490839c95fbb7c2ced29297c3cc5fd50128f015edf805ef83b2871d79096221814787284fb835414ea15beb4ae19ff482e2c53ed9efdb581f6faf465a32909817c53a889f768157f9d1f397abbddf5a55bd8b68a727c4a915b0ef2c3848fb8d468e30261bd326876ee8fc353cbd7867080dc52bec3c3c43052ab927a9d90d619bf6ea993b3a9f400c5ac83c946d05bb084804e10fa9ccc66c31afc1155f30b566b3dc5a7439462250abfa26395911c6d510cd2097dcd0a3c96a459101382019553987d26d4bd59eda51047aa1edf70afcec8082fb51e25b9b38fd10041035ddd5fc6f997cdea82617ee79b244a85ff7fe3fc160d0a59c6e603238b68463fca377711628298e485887e8cc65b814972e478ef2428e54494c96caab0d08afeeea983bfe06f9c73096b8b46efd72cf571e775ea5b0aaca9386dd76a67c07507713e6b199ae7415eb6108e5f3e1eb14fa38fc235e23ac94e59d72dacd9c16f24fcfb1767b971ef6f3581701ddcba7a20b1e44818e240a2fba01154b82d5ae01b37ea70f164960e6c2ec617c9f133ed2f42eeeddb83a5a17ab42236d68c1430b5c9125cfec4dd061e48e56daaa40f7446ffb69ac5ecf02c923f12ba4e1e76c7ba5b7bc4d801ce404d2ce8590a1ed8762b9043381f46a9ad0ae6e9c7670a080df2942e91c542f122c182d6c22f87155ba79c9dad31b8588bab53b0476b79526b251d32a90eafcf1541f1b89262064f8a82cbcde3436b862e3d2e6f21a092dd471a9d8ff6fb71ef82972195b0ebc30d6d84c7dac09d87bafe881e2c3d4f7e300a9abd4e5fd3b0d9cf89bb750412e7d76b7535cc2e87337d6353ccf183bf64d31d6d2576cbe0931666e06761761f9a35ec1cc0ac14489756c568e0c5db3a6d4fe65b7c0f2468432dad63cc5fee5903b058420e815929dccd8c8d01b12d06c12bcf2c6a2251b4e8a60edc937a540a4bcf18afc753e7722a6a208bd7bb616c87ef3fa799b53a0ca90aef1163b79078991b922b942aa56ba8b6e9290bee5fb4e8249e95aed3c7b7aee0bacce5208aeb161b2f7e1d0f7b5b7f385031454f0f260b5153be5481e0ff20b0d6d3c1bc2badea57576f0909518cd678bb692ce8590a19fec8ea31c96d2a2703abee9e9359053c5773c800210f44d6ff939b69c026a739b364e1edb25681ea5fa1e724aefd3a34a4e94fac5e9ecca754418da4df5c4694f98f6a3144834c924f2085fc140095fcc523cdb2c8e46c70002b08844ee52f5157b14fa588dcd34658908fcecd485eb9428709bd67ca6b5a89bbd3b114a7aa99563256f0854a5d2f0459ce41e2bfdd96a47fcd734438138c7958b8d4398cff947c7b48ba44b33474dae30afe5a4c59b97172df7c6617aa2e57697d95c67b756954f2ecadcb019e3f62970aad3dd61c4a34c80881d54d796aac58eb9bc25b554163000c6f241ae4b525db98f594476c7272e8102a9ac4c866ff8cca8f3516e743330d6ea857e84e00aa187a7e66869258b53cbf1ebc62df4ad86de218279373984b82db016a51234879b779f1bb7bd626842bdd064311053fbf63fadfa1ba416733c51b21673fadb41b1e5df69b0e7f01681d318938b8836d3dd6dc8baa7399d97440f6b25599326d17b7ee340f27d713e87a8450a23fa1fbd92e4ec54ba6c216955a34593d47fb9bf5e9f4541eae24848cab9e02898da7111cd319358b3b05451e7a9cc0263050643e1b36fdd18baf7cdc164748f58cddd98d2e0582721aaa8e970af88f183e78f379b77dd82fa6c022612447caef238b78b4a5d955082cf91a89710e6e1c58bd6e2e24918d40e79e9ea23d652f7e3af81919a15f55565739117c17a603386665fee6ca3ac30c37931927ca6a20abba6de2458b5d2b6384b49bf6648af97651b9ca271140229c7ce5bb79311f447d8932fbbfc99c7e379cb0de81c081f6deff01fb7c616a54f7a0ddab1fdc4944fc908f8d0fc5e4f7db857605a49352a2775985b86a2281fe2589c312a131b3c730b7ccc0bee5fc3e56294e36e845c6a749478c2a7bbc4ecb2f21df17889a247622e730bb5393aefab06e7f99d33ea5aa5cb26078369796601c4e78e35b7e63f9d90604a75636c0d3f23e5358efe6b756b98047cb231b2468f4fad89da24539f75dfd90ab4f35fb7323801098c4a6c350679b8a4bcbb1bf89bf0c456ee6566e18b7b51cf0c7fa277f4b1cff84d8e493436ee9711fb5bf2e6b866c087ead1bca05ee15f09e46ec0ca272f96841b609edd5d754437069af3ab7510269f482fb15660a0454dc52737182a10193fae37e9aaea9c34a6570e7ab1526b6aff8ea5e16e2146c8fd275f720c7e01bc7d5e8aa6277ec1dcc2751d1492c0f7024b46fac96221334eaa936e0df1a352f4efa4ef40cd8a84c12dd94d3dba513180e4d984e5dce0f44ad891d977723aa266e929dc66278e63764b0c2572b273a96b6eeedaa338d10842099b382b08946e670c55b872a00aec609c862c4ff5b8dd264bdf729e0071fdc8a027f0a51f411589cba129e2d1706e14b4cfc8220e913b460e23d332be5433435eb0a97240e1464399a49753366f870706519f95678d525f1864831ddcf8574677dda92ef7c56f3918c897304958b5bc13a409168b0d90b60d19e89be6ceb8469e079617be9dfebeab95900674bc78a86f4f9b2203b2950f6eac9a59665804c833b6f6e90fbb8368d4941842530b5e607baccc444becddaf8fa51eb2d6149b4fcb64220f55ae8bac263c96706ed5c558bb5422f9de4cb93b128bcc54b0950a51e7b7cde74af7761d02f7a12d22ac5c05c0ce25bf3522d61689d949ab7059c052fafa412d3a26e1101d6dbeb518ef610c0e834b00eb3fb2e648060d23afc35be787d4323dbdad4b49b80755b4bc2f92b0071c197b5ad3be1eefaa9d59c9724b6410be0795400b131e754cecb876ed6fb64ce1076b2e8f7624e33f60aa57d70d7d281037c06bb0e702d7b70a1ce3993673328aab6cb0d3699cc52cfdb1c56210772083594b9b4f259b51de347e8cb3a56b7a615c0c9c4016eb080bcafcbcc40306ac8fc29349365d4c660ad239dcdd2b23671dbfb73b45fc941e446ef7885d33903e8e3a340ff6fc9a96f589fb5e76462f9b083ce93865892c8a7f401ec29e50a82906f6aa5a01920a7706c21f7c0f74e488c96a3efe2f4b18df04f4eef617b8b32ea2ae62b1f6ac1068c6f132c01935e6b2d9be1516e3c0ed8e8de3e49d59fa45a1b9b7f99246b940eeaebdc1c51407aa9ba1aef7fd53791f1b6293ac12c583d414e4a9eb956228209b367e48f59078a4b5c9c3741bded231f84b8a8200eaf3e30a9c0a9515e99713d0e6c934dc1ef76993aa82061cf67aaac7714f12e25aa8f6f54840a2ae3d84af32481511d300126db7dc612a5b2ac0fdeb9c47eb316541846781e270c8ee5f6731c2e86c94e4482594c7e75d70ec43bfe7250b6778cb2c2fd3d176abf07ca5c051ffb9a17c4c0735bd059b2bd8db81553c94100412dce73dbcaf63a0af58f63f15571f5d03a7ddf2830de2f20d58f8427e71dc6dba1af14294843feb6013af57ee517ffbc5784b009959655c78e5172c0f46f6f0b915d8e30de87208bd2d5f9f6f87521a2c4dccc4627078c7c6107c66717bc639aa5e1c735b54807511167569fb514c14b298d1d270dbb3d05f5b86864788e09508442a983f4111bd065f9f6c2457b49802ca089f3703ace2bf46c3fff406ccbf4d7881b61c467c4d07792c0a6cf321f07781cfaf4770aa9b6032b358097df105045bb04164dd46a18ee3a9c957cc2ada8b30957704bb5346eccfe312ea46e412a77e44eebb6df757173f972d574b2592d866f88b013c3d91bf7ec1c5390a1c44b140be02828114da3aed82aafde8a8d5c985774fcf8baff842cfedc358200027bc536a215caf05a7646dead6be2d3b0ff92c8059c22240d72123b5a1ca3146381326f7cf9c50605b2e414e151aa142adc1bcb22d7b8886dad51ab7e521b64502702bd561e40dbb41e2f80afa95bd562bcdc67b3f6e36f86fd9256311e11782f33de2918ca64f5d083d02cffba209fc2667ca4a141ca60c02a7d4559c7add9696e6db9aa4659dec2a96e20bacd1ff8b1a4a48ad20096e383fbb97fdf96190e67a05877f4da461ef158b263c62a806b973cfc222f7b6e803739ef0cacd37a9f9091466bdfcd533bc45843fc0d196c7dddf72b73a0fa7bc044acc6f5a7c6fb154b08e09c5169aabfa570cbf676e20bb8e99dda850ec4e42a131ce741b7b6c1f702cfce1233f47032fb6aef56e8cc84a324f6b0615f22d2470a51f9f8c6edf7cd1cacb7d56eb7d01a2d0c59264d2000c6f6c9560e7d5c6d9d9212a523bbb1c320016843eee8faf001a51fb16e8c27a6aac8e073944ebadcb61429 -MD = f22ba6107688aeb25c2f2465d8fac70a67acc7c104b2ec614c281869db51aada00df0eb51ba6a25ad7efb72744d35cdf - -Len = 82600 -Msg = e4277302ef90e1fd71ee5a1abf54742caf534d64fbca13c9e7ffcae224ef49b5f3e386f68e441478c3b0eae7e24d66b9d95e92629e14a5c7cda6cdf693a42b14ca881f96658ec7b50fc5c21b0f663ae36f6521c05d47ba7cd1335ca5704b7383b13dc74c3e14019b9d556b1f0f47f790b89283e8010b5bcf3bcfff57858f27e9ef2a0580df81ca14b4876b5aaa97a5aafd0b3f40520a8fa852a13f7498155130cd786198117b2a089d834c33a7ff4d1886f8dd3217e95eef5fd2a3647288f83f934f63fd9caa2a5da1729514d026f5c29b82e5251a53d08caa89b48fdb8e25fe89d6941748b8d1fc067ccf64ebb5a89084d1e08121eeee687beff85e9acfdf55f6367b4edd4a28cd14c8818ac1536b6a880c56adf562bf691a2cf93779f52e2c2496a10b220b35b8157f33f01aa94838f15bcd135e584b78ce673f833ea51a6b591f8cb4e0a002a64fc86efdbe5e46e205e7cf1a23789b7ee1c850abb289acfadef9c6b3dfb4977d0bccb819741b6d500dd8e32a0e69b6619978b6159d49ebc1fb4bd76ee7edfa2791b29cac0588c66b505692abe5d4a40b3f9ff92bc78de0a9f73d454fc0f3358a29a39f1e3a4c58191888620571606e621a649f54f7fc91981cf99abc316f50901bc74bd8d9102c43ab96dda17ab61b5074f032f7f73e0877b0a45d1f04095120ae452740aa7b48d252a98be5c87db3bc936b3a7e8dfc4d2ffc6917dfff6842212c46bbbf7736b6ac55e9f33a225e3f8dc0fc3d5082de66a6486e4f64eb352a7ddbf190be06e87ebbfc7d9d095101c6ad43cbc5d59d8b5dc6dcdb8d168f17121b046f2da3203aa6e58f8d11b81e0d500364015975a8ac3a76ffd95a5db5b701e3eee71ad78dd438145543d8b14e2be6776bc6829869e8039dfa903ca123bcffbde382e0c3155d3b2f97c5795aac028ef19f41c6a6aae8c2251527bd4aa2cf1591296806ce807eb81e9d3b7c1dff3b52594a9bb00731537ef598c665c0fa98494709c0145f95deb6c9afce6a610e7d3a97b2fbc523c6d240f5cb97bb6bf3bea5c7cbb293e01d263d1815a5c98da2714d941f8a8f63330d0f0df6bf47b455ea31f9b7680ab8e1fd56f316ea240b83be9336db70952d3fabf32560699101e7c3f4c61507014fa60c0742fcc20042790d14662dd45feab155f42552bb22bb72f2f6142cba000d37fa5aed0d57e79a4c06d90d5cde760352b21bf514dd814bbe1e3fcd45a7905a5b7057dc92d1607bc350e911b1b861deea6b6f7eeef8361793f0d8d7a8f6389ed91605f7d258f44da8944c5c7487a8e54127f8a62834ca89b910c81c9dd081417a936c2717122978c1790bd4ed76d47f1e8fbf5609b8c408f72517826c5df2ab06909452a72a8a64d7a82d6363aa6c134a4acb77daadacfb17d7cdf35cc4134445b48661cbc69c7ab1c8baf0204ef80b8e0125efe43a0bccdfd0f356b62e6c75fea8493dcb0fe9201982bb626a8800ceb05cd3a86c8867e218b59192c3c286a4fb13e5ccef2cf8bfd57e37a38a800dc47802df88bdbf4ba58a31ad91c8a9e83b029e63f87f4551c0ae63369ac860a655b09c50791e063c7dfcea513a100a1aa0dcf1caa8c2847d896cdac02f6b4d54e91ed12f62d685c4d237888475e20ea53d51b322c4010f0384d78ade4abd719ee88c4a832a2e656a0c04b44f2a85dc1078288c7333840e6b18b61c97d304f40cbac0af54bb6eceb6932916b841429ee3bb2b26c6df93aa3eacd337f4b289fe26c782a7abfcdee731d06e55caa36179a76d202622af760a02aaf484fbd094b575789cda8fd5c5d962299d198a362a97e3f5d037908b74584279e2aab6136c448033d4f1082e6dcbd2077c0c02e3e4201fbd03ff175bd7b9838165522d645bd1cf61f4941eef1ce607d3d5d43993d93ce32c8026bf07e5574f2a442467aca785eb6bc26ada011b528bf36e19372c4f11b8aa11559078e75a2ddc49c76cd199875bb7071c434ab236e6d10f8405978fca259f7c34939424eaa6ff3ae444bd7900a7af8a5161b328ba9ed382bcaabde18db3738a6acf44e62d41fbe022f8568f1758ba15b23d24c7083d638e6a2e858c82e88f03a04c71734e8638032a8e8622f5f53f6ee7de86d5454be8fa369ad6dad34f59af7d13011573fd1f6ba311337cc106a85e974dbf9b9c4eca8fc7f59a11a56d3a56aa2bde11c52f16df368647e3a4145cad6a90b96133d07015c647b87a23cc9bbfce9ceeb26ba386298bf7a9a0c6a6c3230ab15a6f32584454da98185d72f3e2b3926f1b3f8de1d80f496b41fb4e4445881cb78c0cc26fad13acf1a202bd6a79fa9eab4bff5572725a19ebf73b64764aa34bab36810b9b131ce4593eb02abac65c9958683be9ddbed2a27eb3aa32c53a3d3c9440173467de3529d9d4b1e16a33a12b7f593c71aa223e8d2c5d8eddb87d1e9a7a91136558772723784c4b0b022690fd2706471662086781fddd3090d87b0e0b6613c0c8f844b97b3e8ec7d00a09f2b75857a7ff8cd71627fa1bd871ab9dd5375ead6582ceaeb5d933826d570b438f011a34a256b0f711272a00cea8bb493ac86d4749be621ee1e4601184c98d3c2f817685824056d020289672595e90e8076398cab5a23dfa0745cc21564d165c9ae273328de707ca0dd2445ac2bbb0e302b2e91cf156e6abeda47f9b290c300b97ca1a230c734a4d9fce3ea152e6a5a0f45d67264503e59a5ca78268462e62b1f0e27241460ca8c19dc48c2d4e08f789a40c1ad0f9d1c32e1bf9dc6ef5da34b66bd1837285d8a88ed05b34e801482c05dc660b0354e707cef44095977d382f82d13f559f0f02d21c003c40b9b2cfce7b621341a59f6e39e4ad25b6ca2871da7de9d6f1b12eb0aed3f40fb787a8c46555ffbcc49f238de2d70f4f46ef3cadbe107d3b5e8e270bc51c767ba23c2c5077fa7b099dda256d890fe2674ded021361a15319a420453a9e5d4c2808bf869b8ed29ea1d33df035b6f4ee14d4aec2cc4d9a3516cc4dcf65c1ff3fbff1f8fecc3145302d6eafcb0ef1eefaffe119c4ff0a61e9dadcff0cb6b76b17e866cfdc0ce9bbf854771afd20c365d0cf7f164fd51e60370edf1d455307089c4a6d2c67823c9cbfbff565cf92b3c1362db38dac7613fde95ada8fc364393d968e11f7e857b4504d15f078898d4a6af5c18766240971a2c565d73dcb12d674cc5b5718a7b2d93f6aff713b73380ec8d5320289fdb7beb695d8dd0fa8846514075a4977ecbc32d2de257e96d4bc89439d292cdf7fa784a11f5af5eda0e46e850f33eefdff9c476f702e2271f6404344174d0e4ef4024aca2c9426bffd57792eac8d4e90277ba080eac362b41fedc3310947afbfa2ef999b832e786d05070f79a6107219ae81c66b128b484798eb91743cbe181bd297f87beecff3df011cb7cdc4656181dad5409ab12fdb12a9613573785b4f48cd21efd2331fa0fd38befa92cf3423aef4a096738e5623fd9977379884c65e30d8b606091bc886b0f4135f319024c18a4309516073a929f1b257204a2aa64cb93e7ec6866e6fadde7b466e10ccde42fc1139f8c726cff4d43a2678f030a322cd45a0b6b2f4bf1e70177daf984e0aaeeba458131270718c907a0fc5f45f66e75337455ff5745de04f0de0ab31dd4f0e41468d2aa81937fa0bba3891bd7f97a3335a9447b8b8f4fb61a899e944405569e53c00c6f1e9c8452f42c963b358de5f55f7b6f861862a78902fcdf13740c5c7bfd1da6e55a8cd75e259ebc43eb1e122a155d2fa5aa7a75ec3e9a74c74a54730b74c43ab3c1ded930e48c53bc6544bf4ffbe11d309e314b5e21f4c81613782adb5f462040e11d1a69a588150b307c2dd57789b0dd8011986d41ae71868bd1f45a1136001334c21b66ece448b6d93eee691cc972f2ecb5dd8831f9e9af001c50163ef642a149684cc72f539755cc0791695022dc2720789b3d679998e60c91de7e3d0970817b7a2ee8e148595e95508764b62874d0e7e441fb56e017c22decf020a002122a5762427aa7253737a1c460c9b34ca5869f837250848feec9d088257bec62900279cb27cae58c99879dbd8e26ebf216ceb3d0accb74db767390edef0e869d72b03f1f3f7820e0f8b4c5b6900aa4cb210fc14641dabc655745eba8dd47132542aa33d909f0edc4ed45d649f6c3923a5cc0446ed1ecafaff9c74d2340b3f69c8856d48307c3b0aaefc12be2230018c23286b9c4ed9fd33de66e31f7e9e3c565bc5cbda7c97efdf568ad5309b54eccf54ad99db2f562db71a5a146910944e40337124ba1cf713a46f060d83b2dee1335fe2f7ce379c40d0da006d7895f55f717b11dfb1b7a490a220f9217f0ed8c7016c4feb3c0fb320c346e15713b3c9562f592e6687f5a74c1e92ea7bec58498882a57ddeec5fa3b3db88843b0412191bc3f54f200480073163ec618292373a0bfb30f339a7ce74e35fc5717f115bec967578fc75effdcc26b857e69e3954b238b735396235042f969628318d03364baf8c0abdcd1217ff1264fb0237a856b9f7fdddd8c35eaadcb6c9d64bcba14a3d4e52d21b903374a7dfb0ff3cb5a8e65730144f57c2ea68812a41fa47a3b540ca5b0df99d261bbccc74e48c1d8101ac95cb45b43ec9a0e528da43baae7c05bffabe06a6ccf8929876b948c92c017b4f7ab0d834163f49cad8ae1a3e07bd5b70d65f85022e6c60b0ae9623dff19edd780fc815f6668cadbe9a8e0dafdad07dfb6526d1354deb4cab7bf3bff5f4c0f1ce5bf94323b617946a75626335b01c3307b0fc3466b1de1f31e6b86234bed07dfa662cace28f4ac675711265f70f09473cbdc7f4bee0aba1ecf6cd55c4d6344aa3384a965c778c0a8896865b1e82ff7f4496715a6464bc9a81b31ae0ccc4562072da394ab9f8462a4beda78dd18e66a5c443e0ae80c577d29b25884a74119dc70f53e310209adeec657d5b4239bda67f67cafe383c894611e055fddde644700621ab2e2fb9e4bd197f4e8bc37e9627d6d235b13fbe3a901ef84a62df47e539a650ea04f1ad5e4b7940692059c7a15271b08ce30d2e5fbcc28c0ca099c27c5f7046194c9c2490f0d351d5004a3c678d1aa7d57be8b58134c544a49d537c924a29a840ee79450315f0599a15de076f41975f1a61197b275fefc7194355a0ae619c2165d1d0393e209901c1455f4d41d7b182627de8a7d9a507be7379e654590e905792dfe928c97b94f1517a133966b530b5b6b79c61206ed7d0bb264fc01ab9ccf2ceff0b392d8ca9d0529b44f06545dca21df77fd3822225a6f834d90e79c8199b22198094f1bda247cd90389dc6ee7df19f25d7228929bae7328ac963fea43ffa94168e629d7546fdc84137661217da4a4429ed79bdec5e3c71106aea32b506b62fdc7ecbba1b5c9b4e968b73d02abc5315eb09fea5d1d84dbeae03c89c633677f85498f6cf19adc864777bed888eebb7195373d9c941f2c1204cdb28c51796e7f966230c64d6012d14cc4efcc3ab2f1c584a7233b1a57241a0d23b303337efac39fb693401ba1f71657d4dc707e9502bdbb64f34e663217445286b08702d096ec0f9b0972f2dd13d6072c077dfb0158ba9815303efe5c7031737b3d9045facd6974a415c7597dd390b93ef33d06847e4ca91c3c954912c951ee55bcb7537a08bc5d464ac5c600c0c70c921246479aee047d0eaad9ed117d3631baa054d1bac36528160af6bf0265f97fa9f72224b122527240fd8540c5264edc2e9b013759a7f47377f8c2ab0f3d9860fb24492463b5b72777971fea9a3f2c4c061f350ac300dabe0076c21063b2347f1a0c23dd3f12b31b071a12412d322f1ff57f78b28378986634176d95bc5e4e286b116aa58fb3d6bb73f904faeaa9e7b6516e34c51769ae0a875d3d9185ac55db82f65613f223828742b6506e5ef0e6adce5e01c8fb7e9c297ebaaa9a3c26ec26e60daebee2ec470cf7d49d21f6c19c74b0b16814ac01e3318ea24d266c58619908e9acfcfe78a4cb07c633ac4e7689999d1ac05ea5ae03c13bb69dbc72ab66805ffd095481432c3ff71dcc63c29a3e8b07fcb30d74dd7e470a7a04c30bba5b9b7fba2c6c37f64dea4a4dbfef0fa71bc775d9a897961ac3317f4f2ae083efb138dcc38e9a7eec7a4875d896b46217a1ed6b24298395e0731f0ea8687b77c627f6fb9bb865c2a031d90e40d94a7686715b5c8eae57d0b8fe7e4d38562a53d8003450953264afbc151a88090017c95e0aafce5bbf9ae31ed5cd9f516c43a49fdaaf7052750d928a949b57b3a3b2b718ce49352dd5b3598c998b89a6237de6782796ef5608c717b620ca01b32c91ec414cb635777937808c9a46a089042f961b77a902125627aba95a252a9a133bb561f67523bb12ae1499887d687c96ef3fd43b446d09f5b5caee914b26cae026cee56c14948b4a7d722dc49e36135413404cf2f794bf6fe7f1f0769a7ae82bd985661e031c4a892c15d3ef37bdcfb45243d02f40fdb51d34bd596a91bb544eca654e7ccf0f8b57409c0658c854244022b72850af2c6d86329973fdcf5cb1d1800b1908e702c01d31614fa1ce8d937ffb269ff790854b5357f2eaa0b1d3635c80d34062d97a8b73a5020a4ac8eeafdc41feb194a3bcf0dd2b6637e3e7a3eb38435a7eeb14fb3fd2e1fae0c425ebcbdd9dcc07b84717d0bc037fc637bf62dc0d4e0d0f3237f96fb39eb84d9e94099a0c74fb0cc2f94a8d48969c103cc784983417679bb8a0f9adbe21c6bb4a61cc7ce15e283b4548b9693b4b37c0338e9dc25525f68eeeee604c2b11a2b4583da8f6e4bfc00ddf93e8f6eca7ff30ec72f2ccd9004663557ee1fda2f4e8c33876339a8f104f1ec2995dd8d5234efca823382a481cb3a38ce0e324be31e5627ba9d0da690641c8ce978c719d43938df70dd25d2af1dae9e5a2e843d56f350c82571538daf83496343cf943ad9f896f69a165f7ea263880f04365ed70e3644bfcfc75288d7c942193e828d17e8d8d1b706c476d0e0039135d30f0841954df8b3c18853bc8f9ece57e279fad98941b0c9bed0b3f1f36791b5cf9fcaa473a2344d019a9e545f6ab4c5389d23a7449bfdd5ca235e0963f5503a00cfec282e9bc23599e77b76cf95bd0a47d44faaa24f7e8230a4bf3fb617956a6f88b5f450a269129056324b6887b1ce1807c70a2ac3fc79fa3a1dbc763429ed23b06f31611ef08cefce0afab1a958bbb11fd4ee65603e6130cfc2a82ab3d56c24306006e777204cbd394cab336179771c02bc7ed98e0ee3d84af42a5bfe5f8f7bf1d09c6c14c1fa027e41887418deaa619ac7e410b632a7fc92fc6a907c8ffd2fda091a775f9b3ec7852eb6fe374dfd86cd3f45923e7354a391229151952f5f48d252a991bf75be13365e6059248f1795856acce5909992d62eadc727b1055ccfc3f271409c1825ee7918ac0b496ca295a9929e93126c0b9c51e7339838db9dcb9432990f5f4d196036a3c29e0dab438f21fde6242eb464fde216fe2e9277c9442d5a4a836eda42725548cb9ad716a48ad5f3ca1e4b384801ca834f7128a1894276b2ab2632874a2bbe4fef8511736d8eadbe720bd0c15db1ef764fe8602385ce5781e57f131ed694590055e9228b46a491a5077227174b143a36261ba3c464efb8111f167a6591b30fa2264d7226d5d269efb1dcb702bb32930dfb925a4bcfae81a88274cd262092c67f893a690cc5221de597d0e84a5514e341f6d6eb816d119a8f362075272e3967dda7376f04bc9c95cfe2d622b6c0c1101b416ec02ee723eb0e62a2db3161aedb05a8ccecd76247b9f5b976cd0fa54104e301e23f1ae4e95c6c2e83660b61fb083fb381484d612b729e4539511dab9da5e161bbd20c0d6dd6f3c34a7d7fd728d8d3f0dfeb2e5e50a613aea617a87bdcdd5d8780e0cd0ab63fe9497f8a536b3b3208886d3d4204bf3e9d1b468578bc06939e9bb9d12682cc8197e7abf450c43efd27a3b3a751f87f2382b49f04541724afedc6ee0cdc1db88245c655233e8b382378683a8f22e5983b0aa33bfd06343d18922fa8fbba84812c3b0e057fe567328b4300895e7e7113707f0da2d654ba59b8d5006e05875f2f65c0e643700c01331dd093297d2d44f7a9271d5af907528076fd5ec9920a55cb171d76985e7d0043c16648a052f7074cce4cf8edcce7a3bb3a5473400a0c0f5b299be78bb1fe0d6a5f4f477847a4621ac634c9e3b9bb5611ec20675bd65535ea838061a5d158d0b1dfd1b938c3fbfc6a7b27b6c2264d128b75aa62a25cad6e7d0d140b6c2653f01f2935c6692ec57e43d46fe7147d638030bb3a8b9e05dc621eafa10e6a19b616bd26c39592efca8faeb953856025c64708a7180ad639a9bad4516d9227104be992bcc24f3b70d2d8b2121ab82f863e101b218b08d261de1ea8dbc1be2a74d812a6d47c1bed18a50157c70da7080892837212dcad1be34135a035e5bafbae2638015737222e4f0ab1a5c1747b73138c471460542038299ba8c74721af2224fd04ac2b3c8b897dcb90a5e6975bf80ff20509f5398ab199b31e22fabdc52740241eae3ad37f830aae475e1fbd7020648d645ab7d3120f9d5340bb3400239369652d0f6a4326a65f7c7ed8552fe2727a250d0e906ce1d99c41b699de34f2ee0686d9d7a5d6a779e2fcdc1c6e36d877ba82a72d674a1e97fe4627c4e19f59be8150cc0fd2d22b84fcf80a3154187ab58a6bdbc023b6f2d22a2a3c452389818d418babbfd980d9501536b01fed1df1b653a951cdaef885108ab59c238e3c91e2aeff21eda228da64968075ef238f65027e05b05fef58fedc85afef6609ffb2463073d4a314125548e59c01a8dcb4fd1f7144a17bce1e85bb83dfdf177b190c402fb16ce8198573856c52fd5202d6e2979631cb2b33914437ec0e123cced3c658137f92c598cb5ca2926c11f67c3b3cf25493d77606fa60d7290430e0e975091644a6ee407a2a3727beb0e49b322b32b612316c652fa10423a089e208b447fc032bee2764a5eb2c9d5ae81f490cf0ec6d3ad433fe97ce56a4ba65d0be1790c8a62e1ee5360255658bcdda6908f2d1939e3344d34b24c97ee1df5fa109fa9a9487b600d2c079b207797f4f6be1cc154fd26549f554bfd9a5637841fdf245ab892f2c5a9409f3483defd80ecddb8205479038ab41205148f3b0ebd18e7fe00ccf25f6f5d31956612d7640e136fffce9a46014315eb7c05c8f52a2d8f9bab3058df17e9938f98c43ff951f8e4e5423098dca61a5f521f65ea2d1031de9aba7ddeb1c2a0d6ab07b36dcd5dddebee2ddac2b5787cdad66d99553b3786a0459a2de122d641b12460d84ecbde2992eb1131ba68eee712f8f534bcb826885f2cc8d4e2aac9389d8c4287356d5968745caae9f25f8fe5b23a44bc631c53b375c0c51765a221e206331b64d43a5626fac34947ed01b20522faba850ae055848ea22d49ecb166fa85c959e58dab6ac1b0bf7af00d081ba1dfeae542f6ac929804315000ea510ede96af8c8dd448fdd51091ce56f4db2368536b436ab8c9915a710edbc0d0f9800ab36631c23a8b85eda4ea920116e35fa5280c6360e3dfd8484f8b2efe4313710b568dd82742fba967e83a947305c91704c83eb3c9ea47edee0a46d83dc347485d0a76fe216001cec04502142123f51fe3ae82b30a5eaa38c83bb265f3b40d8c8c49b2024524566ca365c1bf9ff3efa0ee6568efa6936f5f435e6e36b497cea3f59edf83070232197da509e544181160716761d8333b1fb7fbecdae8f501132535645ffeeb8c4d4bab9d3b33b1f312c5193f0dfb14a823d95e5178eb39627386c854a3e477250079d9b8e6196e076c554256bdd6df8d3439f736d8cbf64e485f3aca5bc21e5ee42a74828b04dcd776877938f1da083c996033176ae9b0273a04e94fe81665ac70e40874aa8482e5d9d25a705a930348ebd2be4dbfe30b8fa11e705fb96fc1903f2d0219c526f4b4fedc327758907534a407d57438464cea26125c74702cd6ac977bfdfc5b5ab6b76debadc86c30b2824a863515747208b92176fa188cdbf95412376876ed9e2d7fafa728ee16126fa457b4499bf4f4d39f3bb2f5c6700bce195815be13ec7fdd802c953052e6a3f13d54488f822a4d11eecd5ccc08ba2ab98ea16d7b7de86e5b4b6d2c60814e73db9fb889636284f9682a6eeae959dbb73006b6c53cff51e80b33f9d31613bdf0a35dfd1d81b7a5782af488d3da34454fe613d0a35f22c98b81fc5b2fdd64c5a8dcfaaa6b56ec0c47fecfb3be1b2297333058b78e6e82bfb743e6f9a9330ef61aece849095f9a19e7480e77f0289f323fa337b3fcf79994f9c5a66dc5936cbfa557c9416e082c6ee48b433e108f14b693b3235e6576d1f9d17b9d200b9b289306a1f03c0ffd2d7bce5d008e95bb2d94fde4be2f5e58b64eccfa3da8e1a6ad008d500f81658b17b0e321c8d20639444dcccc6aaf4e39c1144ab62a60fe428498c7e679ca154e75aee17dfeb0d885f3518ebebb46cb868cdad933d5f0b7eb29cc34e9b17e85b3b1d637c63493933da530c240129e5ccb741306f7b2d0852d070b52be69073d6766c7549eed02acace47bf605230e5875114d427653790c74c6d6bfe8e2fcb2b60ee2d66c9a76ab703b8398524f2f651feefa2a443a62a45ed3cecb0dc1e77c4c14c92bc3cf88160414f837cc0979f92857aa0cc5da15f347a8540271882ff07612ead318ee8f52f50b4a42e6e4669b2af5cd888fa51b5fdbcef704d8a86ec5e083a84ae09a1508af78ea4827627da19443e52c163deb6067b2383097a4fc5307d1b221cf34b19dbff858c5f1f637c2f0cc7155de16feab87ec981422f0812e589778c61950dd989314263afb222d75dcea02946ba2cd87b8f8873e2f2d75ce5f4f7cc67371017fc536d3159778b710954709662363e08b8740860d00be429978642e814217c5b9c2daeff45b6c7d49d64e0649b9fcd02d5f6f250f4c25804650601eb529a782ed189abd45bb7fd887fc7989cd73b004f3cddee4b365e5b72b63edbda08eb2c16032d0fb883c1561319453f460054007653f1a35a7e2914fdf3f479bf1e5dc19d9ae280b3a51efaffd1a57d68fd30f5ff84faba84b469ac2c82f182a17b365f4bfe70a6cea91410d411b1fc0cb617067336bfdad2c0674b87ccfd9f8909be2da7979f2b1077ecc118402f613913535b58d009ac4a8a6b179739df787eaf3f5439ce37b482f7ee3455c5e857f8fc2b1d39bca0d8f7fbbd3be33261b48855fffc8909ffec2a126192120aa4845059e6749b614c05def9a4ddf41d49fbafe3474b20b1c07812ae8f02d8762a904912cd870827d5db096d6a26506360f7fc425f6c852f420342b4bead2e714424eb0f287f077602047f40553d816d6e4e76588f8540e94d33c00d37ba9c63b8e83f393f8321b69c254858ae4a0fa23ba8260e1fbfda49a9b0969f4252aab44f834c7659bcdc4f6be96d9fbc7780698eae124d5641dab61d23cc54269de1cdd19e1aafbf52c3aa37f5f5fcc9ea5e2c310744fb7e34c898733468132dc2c81406e0b2cdba6c5b2dc8f4e8561bcb3052ea5cc401ddbf2d56718a74c39deae8f2b6f21bb690322e41e68c4e97fb437f4382559848bb0b8f5ae0cef74ebf3cc7d0a87b5d5489cdc34f586530a6b17ad266c199cab7623f790b87a7fa9bdbe1ef14a524818def65a2bde728956b8597b1256ed16235198470d130be84923900e82875958e4b082154f45b7d86cebfc2a4e753a466ac2702fe14a1ba9d1b20c23872e0758c751e2a605d7c0b0ab7a625341536bbe003d5e0aa3ca3454d1eda4f695cae6c84f377a84e5f117b290e83e5e815e0bdd7226b47fcb1fe049d83adce034ca6247dad5bc2a761e474ebbb9e2d4950195354f1315e7ddc7aa19432e2678cac91427f8a14a0f1cdbb9f59a63f23de2ea8255e576e4eb423dfc43b14c0448ee337719275e96bb70a5fa47ab8aeef2f1857dafd3f6c3e2aeff414980f918a90596057bf53214b7e80982a57d732bac474ec1b398e715765a9823ab60c9b641b76d49c0d0d0567d0972dd9f6ec15ac26ab308f1b2dc6c0efb751dd9af428f8b6a25ae9858bdde834b7e85b61e09decdc26ebdfaa04b3a2508329a64ead7e6ee945bce62db5f1f533488f55a09913a36e4ce5b2effb7f250e73d23dd921e5ef3cc7c03a0f7388b754b2eb72b901bff86584e5b1f0fb7470b3f113494336a7a338902f8d33aeeb561f5dc457b6ffe8144738b584b7ead8acc764b67394d60bb16408d0899f4c63f91cb2e2af9e7ad71e9fcf1bd24cb2f400d0348162d5e8584148986dd45d3736c8d4170c207a5cd53ff2b1e043b539109558c83dbe0e54d77d6da6cc167555aceccef50c52518c289fca45cc80fc697493e68ab2314502d08b5a9cb6f8ed900f8d92b5a8ef2bf21865aef5a6312928672103e1a76184da8a9397e0f321cfcfa5d2a9bda99c1176efba272938fe426032673535e5f6d2c34fbeaddc4b3b23fab8e49a77d6030900f3c5bc47488d51f81e8e07ef359938a8653323f686ebeff88eebed49f9cc1e786eaff5b89f895dd871befe755df2bc6e151b81986bdb3db36f0e2b9dd89f55c6a69f5ae405986fe8731ea43025a869fea79e5029c4b31412a575dbda3d22b8d2e4be743341628e106ed780885764444063e31711571a7dfd77498568ee004e846f33ca0e1d90c238a8101ae6b9cd571c91135eb7edb97e5c2cb2b1afb3df1fc59127e4db5fca13486af2fbb0158ca97b7855ae854d3822170dd7e8175668347b90c24b03d0b78a28fca5aa503148424361d28de2413e6e1762e1b1089d429490b52b86ef38002ec0a650af2cd5aa2b5e94b286368f736c4273f795ea521547ea488b1d065f4d08f8b01c93aecb596bb2591c1eea0081238187421b253b8b5673910999af0c451eb96130dd3cdafe0a29f838df645c0d9bbde7eacb21214ac811d7ce815409907ae903b51540c94111aab82f500d6bc2dddcdc162d46cbfaa5ae64025d5c1cd72472dcd2c42161c9871ce329f94df445f0c8aceecafd0344f6317ecbb62f0ec2223a35b071476a3f7469bf4d638dc141dc679f9b29ac8fd0c2826e541235a6f87e2b5576a41aac4ae07895c41533985caaa3ff45d2bd384511897cc3fcd6ae22402c864de502ee93d431acb697a9423e616212134e96c64beb2eef41f97aece76e240e5dbd67fac2577c4e4a72558790098e222e24a1018c595911f593892af012fd36cdb3b1967e7241c1a82da12efaab0e75bedc44b1ad62f22808516b2ee4339e46c650488b6f2c684ef950f401234dca53eaffe99d590fe17da1bb88c06cdaef866f1a94a03e8dd93d6564b5c6b4faaa06da14f78e36670e58e95a48aa300ed83df19bfe9f939d7dd613f04e4654b796d5b7a3d64cec72610008b514b3d7d741b5735bec4e15653a612c7c2649ac8e7607a934ed9f2438c3bf255552a20a3d12341ee1c7776decf925d790a597648632e5d750a64f86c21adb68c06c407049330319b5f8e0433aa36b3db533f723a7b2b76a7e6823b917509dfa80c855b2028c6a8d5fe5523e581e7b8572383291fadfc589479ce4663f4b4d031dd0a9777106b0a267f894064d549dd8501c1057869f565d32a85a3443f533aa1dea03689c871f7f56987044212b195ed647591d54dbb30ec7f54dcc2a3497180a802c2c8df8fd4db42caca0dd8d363e8c22d58a6a7c25c38eeb85d5fcf2c0756bf9ed6c4c429333071e11c188613da1fa134c47d268f2a410f2c9f8c116f7e8c9bd0cd0df4b295ad9d567502a8f76aea98385fc948962dad473e3dd82888499ab3451ff50fd07eab1b976f4ccfe298e20db4950b6c5bf8d62d4992b4730afb199c686a2a73f740a1832055674989e68e78160eb42064fe4437fb48a16f6c0581bdb7160eaf8bae295a8de1d2d441d6587df92763f335c08fedafca4f9c2feb5badbdce223121f9bb083c7f2fceaedad875ba799b6342c211b4f381ef77cb2f1fd2e8dd05974ec5df12b897deb7357676f5f66fbaef10756234532a3180c24336d3c4cd19506684fe109ec6501c5a3bcc85298452f5137cf9d24b0d9655a9ca4906de38ddeb0dd9a0783b75346c919d3189c051e423f03b511537b68e54e626cf12a18ad3c5a9165eb02b4eec36700d5eaa5752feda0b230073c5bf9a1d1bdb215d9b5d9b7eccdd916efa9df7f88a2e9c3d4b0203a5d8d67084617349fc9f79e86e480b8584ed91e0fb05fcd821245382d937d98315edc839bd979c0e920565acbb142f32669fd5b5eaf9e61d5ef32e9af4aa63fd98be7ab495d474687bc230b6caac231292381b98c522d437f05b125d25ff1be3accf508993a4a6d7f87a5dcf135ca1b6a65ac5f2003d61a883e09141c3b27bd5c0a4fc213d94adedb6726f3e3bc2059f018c875a2295f8ef98084dd174610e3482b3e003fa00f40a346ec78caa68d92c4221b259b2b9149d9b568a94be873d9051908eaa6f8603cdd0b40942c5bd96eec6dee95927334f030c4fe9f3f8a19479bbaf5a9cf4a067a939e6a6e9343cc9772df88ed0f68102e07958ee87b92cbd313f84f6542fcca -MD = fc98a8a7b37b9798aec687fe4e80e30d616598d0a6ac2c4826058a98db089df3d65fc9f58c3c1c518cb46c3b164a203c - -Len = 83392 -Msg = 3333cc66d86fd64c5d8003e66ef2fe43ae6c235efce2e3f4f50b6a93b91680f4f299ad8a13caa15bdef1d20f291d6746e116552f4f94c8579aaec4be8e950c309b8243d221ed51fceb000846f94b08e682b9df3939c3759fd0e3a88cba4c33dc36d8d4678942aed68a95ecb564e4a7c9983c09a341d7b3759c925d25c7a1bca0c982a971d32f7f92c698c581f4500d972b871b96f0384a8108a32cb03dfe71235e680a17881e8ed7a4f1dcd531f802f944825d39cc4e026a1bff5d55a2ca180efc723e812f76a14e2e8979d7a2424d96e91517b55f82a3d8dd8c383e806d7a08ac888fd8509f819e6b46e3afcf97b81825289031313af475573304905e4f5fba759243447301f6706311648640600924fda311d6c8dfbee690dd0b76c5d88fcb5f78a3ec2104c76c1fd342847e0309657b6ee2cbaedac9d6907093163c70d1e47222f7f9e110be39a672c6d010ea8080a6714b396b91ddeb60d6e5984b7feeadb77887923c8da18000d838937e7b362086959448856ec2cd07f549257a6dafcd35639ae0b9e339e836ebe0f45120f2eb24c0041f86d83f258db706e552a2d9edf4c97a0be07a4e1a4f95051c10407e8987dbe4e7f6371e9bfb0266ff5a8637b4fd946d3a39baa8bd53bcf1324342a0a3b7cf7cc75bf225d658c0af9b1a8190cb57aabc954d0c0e7a4b4aea5f729021e1bd8214e83f731d7facd82ae31bfcabd90af5af45a3d649f93e2639cb2691c8eaa0def4722921cd3d00321ffde45d51871f5b8d72c38122e13438269de6ad5f6768ca648ca264ffb95bb6d611fe0e4a7d9dc6a04336765edb3568f8fe3b4cacff1e2dab5e31a4799bc54c9648ef755e628c1d2ee1831cc88e4a9ef915acd6795bc9f112115e49048a46dca9c941fc55dff548807432da27a37ac26f0bc1b38c2271fde1cdb1bb682ee74e55bd7b0af69bdf2ede23cc1a42c1cebca307024cadfd1e3960b9b3636d30af8ae34c26060a3f52b98f16d843e2914c74dd32f807a694d98dd6feeba7db38a7789b9dc95a597256d0dd76debdcfbafed365b32a4d3e8ea9e18dc3e1f079edd501c4d9ec6dabddf45b0e6b66efd1e5ecbf82b320873c94971dcb311ea710f8430ba72718a7c82733436b1cf943b0ba1d217d5a631b694daa29d97029326800f97f8db0d37078f91c6e3cb21e2033e099e29ecf7a738d62eaedffa78afb49aefd46bc9ca83082fbb5c5c9545eee240068e82d3bedf5707a5f5284ffca687baa59467d121c4fafd40830592b401649c1931d72c5450bd93e123eb29f70e3c59b1569173ab935c72d1d98365f4cfe6acc2068b596091c91550a9acfaf04d3f12a3796d43d064b92adfae3a6170a0f51c81ab03dd5c18f61694f4f24590fa0c5fec9b5fa438bf7d7fda9fbf27b03b1c55e86df53abf6ce0f1fea44f9c318b10ac0d2add273d1a260c432c662b4be4d8d366edc3f402e406321e2609615a77087175b68a4f65fb5f3ab9b2e3deac34972f7d98f49bbf44d27173f8d4278444406ac6bcdb8f4bd96595aee1acd449b0f3c4ad0e0b945cd5d21a80ab2461478954d260ac4559474af5a78337158ebcd05b3d65ab7d60543d81a7d4ab6ea10cacc262e4035c4fe0b67bdad701d2707e1959e447ffce924dd27db3e07837694c34f576c16084e5b0a254ca3af0582bf6026c73b47973ac924b02992490032cae987a887932539d3fa53cdfff711b03bd11ff464bb70111d9edccf21191566d8c7dce328c075cd8d6258096c5129fba4bceaee67e270b648d51393947eaa59e6e2b7cef6a3de54b2ca9cc890c335a922a9ee7debc57d707151be3f9381a7541dc47e339a47491469ba87d113581d03dc219368986a8089c0984399c529f49fa4f49bd8bbb19f56dbbb81ee9e15c951fbab417917db62475e340c6ad37e7a82a4fa748502ebc6622f54f2e5d90422dba6d06076102009f373ad7f7964881f45455f730416fca8808e0e427f6b2c0ee8061758282a3f5fd4268906902150cc2faeaafe1ca1ec2cf82070d984fd9576c2430892570e424b34a0520875b2dd6a8908637f9448c339110c021fbc364843af842b74cb6430b459098fedf1be37df9b7a125d35b58ab9157b4c7defbf4c5bf8f109674bd312848c88c91ccced6715ad2d4000c79049934a94d759e43fa9a8e5b329d4a103efa2154587ffcee974f2074974d0128006aff9802a1c645f6811bdf21321939dcff63c6951fdbf576660f1f53735dd2ecbf56966cd2f37c7907dcad550b8ea49bb68491caf7e66e24646b2591097f2429f4de46f49f8251e29d6528567ff6daeb9e083852aea8c301b8b939e875e17638b9fb0c325e1f60c3c039e2ae060e675d44634cd49aaf9e9ed19dcec24f2153995d31689e951713bcfecf6eb44411b451182a21b952475b6c4d7d56a70bbb36dc8d15eea1eb05f50ed79a1f01a0cd6c77a7c159895c1c83fa9adc541f222bba72981d00d4b6588f69b92e962ea28dda3161dd76cd1e9b92ba383f698328df38ec2cbb41bf8dab4d3e31f14693dfdf880ed4b2fbed1051222bb41ae98b96525cb9a98513bad76ab8fcc086b2c99f3f10608ef64b61e7b99cef8d036690e131706b9cef096f3a134d35e3536d489728fde6ef2bf7e3fb517d46216d632bafd92e62857d95351c31947a28ebd8892e299b0273a883bbc1953df01fcd51c438d5d13ee19549b504420929ffc47713eabd8233cb107181e111795de6a7d4e332a423613fea996768d125c5e651eb6143514e0b43e833beb04299e004914f0113b07f7a0ed1f6b4e04b64fe5b388819ce9148f97c846ccae5a52a36f7fe32c662a75fd9ccdff435d12d6113ecccef75f2da2d7ee3996f4ec7a5a4c34f63228b95e54f10f8891452d1f384a719a3842e46a8460c078bcda2fce09405694490c923f6c7a01051d9a4594a5a384030d8ab30983d3156d00a8febd2728dd436f01793584417b2ceb692dd7e5c381f197f6557067d8f500a983e2af7babd2eaed2ff7a866ed84e543db6e52c0546f4b1caf5109f81669190195620cce723c710bbd9300d82725186c188f6cfefb57f9e5dd2f3bfe3678a04e06063de82423bf11d3d6a5a39765adaf47188c666240e23aa6786d40df2b7dd9fe56a8916a8fbe479b47008fe44c8c5490911cc23132f06235b30987ba8998eaa4dbb691ec8955f53a6e7763b7e29ea31c8383d810360aa7b068769b6f9ad9c8201ccfaf51186c62dbd373e9b730c9e313762970a552184f40201c44a56629bd9ba15cb44245ecd7a4ff5de78d3df65e9df076549b9003a30c61634a04f66e0f3df3c3696617bb9cbd799b26e0110e5ae07bd24b98f8b1eb3db6b374365192072d996e936696c2f94fc9976e59b5f720079ea51c44910b6ffaa4748be07f7bed941bc3fde9cae9368278b786a0309bf838e257904963f9766cb50e58ad89130999022c6e98bc199a7d0d65385c8ae0299bcd506f4c76644aba70e9a0427640a265d510ad1b73386e6910084a35ccb0fd5ae9f881f8d332310d5d6d2e4a4eec021f1cd78319f72ffa6d090785d5fdf2ba9abeb88df2814d748d0503c96b19fe6ff060e8b83a51e786b281ccb1e1258ea986d2f65de5889b5b61ef11384de05e320027ad142788475a6000be96044c6b1243b01bb777f1062db2a3014499abf49376fc8d5f88a436be9e0c45fbe47b733dfcdd906450c37534a7aa39b5f780a8d97a64f06004ae9ef9942fc9aa29ba8d71d7e2bc2c1906cfb6698b23530e69624e36e93ee044ad66546bf0b2697c0fa1f8fc4806d67ac2fefc1fce25e5876d0a38cf12e0a7f0a976174bd76901858498189497d82c1a00e94ef2fca935099488e070673c7dafaab68a5b6d543aeb20581ac75599f4a2c878f30a9c16093de7c48e3f71bb2a29b90ef4c439dcdb56ebca46bc0cb0f7b92093358e36d42acb6da68a64b7c57507dd669fadc469ae70eed6e39c4387fd0812225aa7534b605a2f171b08c2c327f11fa6d13f946479de30653b8e8385ce37a50dab7c7ae3729233fd8a53181b088e85b6d3a23333054bb95d94bb531231ede13c703633042a1d8342206c4337e0871a7eedfd29401a5d92a8374b3b96efd2cf98f1fc06164ea027cc227ccb7d7783e3e66678fcf27fbcc22c6c65c379d08f760775f77c81a7c62585dbaa3657952bead7883d36b0fe1151d37a3174249cccdf72464e1cadfd348753921f0e2c0127363799715ee45d044883abd8d5fd1b3010c2aa2a6e02189555208e02da64841ecff0e23ffdf5653cae2645826f6d156413ddeab3fbe9bf8f95d3187c2367e6b9bee8abcd9a4bde628ba39156c8dd5110f0ad4e104ac8bcca515478b5709cef9f0a093c43bd4e901de8e2d77d6ab398dbad191d6ae408d5ef908bf6d4496d6678bb39dccaef664316cccb5f1fdd59b26d5408a1e84f12d3a65b60da02364115eeda62d48ab6fbbef53f467062a735676fec6420b3154d7d96b9bb6b66c081c2a76d6b6daa9d75ca61493b537152b17f897e14e3f2bd209d68b284f2296e93364b7f3cec52293c2f02f39251726633c162110032ced0f5f9c44ea3b772c9e0398315bd9cace4b8b5814433b08e6925f6a3ad10556fd5335b509600026a58d093f739d6c4dd555123864506b8ece5eee6f35a2c93fc544189b791831b38a3cc0b4ef26fab10047043b8fcf4b3b561f659fb213c359ed6894b9f47154906323a6a3049709a6b7a7bdbc073e3e71066a517630928837ce2726bb1c19cd6f98e83784744c1d9163edcb445b2bc9d267b63e7d21bd8c5bf0064af940601083b3e10fd38ee4ab03ad8f996f0bf681d1e289893f05e34438eb8c7e1f01e2d28f4ca48c1ae4cf467ffd13c4969a4ceaf21f5ace166da2545129304c76f12077d4bbb928b4f68a5458cb00c945769d59b576b079adc9791127218812ab7e9765169975825c34946930afdd04063146728e7111186f99e62f3d7d0a7d170ab64ea76e90155b3f7c09aa041f21534af6ba0fa6f336c66f67e306941de864361b8919936f5e4c77bf99f7702d9db7341c849b70ed315cba7cf114ff58f0fd7125a8efa089b9aa6dcdbedb6cbed5ac7d3686c47755b4aceba3bddb2742035d6c63129c2e65d3ef9224dcb8621965ad96c3250d12c31d11a36acdeb944fbc0e58527aa1959a29a675536800f8e3ca250140e3f7ebcbf725523095a8def8678ae58235826e8d374997e8055789947fbd5d3e47f76ac6bf728893a9a55fd2b25d9460e7d121b569536a51292eacb1f2d10b29c59e0849f263a7126e63af4518e0e58ce5f047a94c5e7d0d47f8caa2c00a8b81f15e4cdc2c934e2b786645e5f7cf4954c46258ef5cb5409ae6387c0d73c46ee53fbac0e3ca6bde5d4c1fac2bfb73305707c9ddee27124578888029586a8915a21535dcf74867e8165e025a9d80774b0234893f2c17d00c34a3426afa20d320671642299d4301ebe532b0c9a12345f9f4bf12f53fbb88f53dcb01b989433d0fa2c7721f2c36e46a484ead81dd5059bd9d1c09b88f9ea7a11264408d8c3e2143d38d48265a9069e3ce165b0ba8943d1669efdfc1922db6805113715f596e2a5d67fc36e77efc1cd8d52e4bdfa96b6a84f99f07d8fdd52023683d36c7977fa2dd0e88c0db2fb677c9fc0ae26646526c99ba9e043719419f0ac655e32eccdf451305a76869d36c0527b110c14815c5bdb52b8177947aef6d96fa02192d4ff96bb00bfca02c00893f8282f46afd7e41c877daddb459a93b265881a64b2bb77a91348fed1a8a4daaa15ae00a41ef0663375226f75cff0aa153dfebd6fba289cf4000effd0a1d012cb52166e6d8a5448664c4ce82d40d45de609d97089d3a4d6412b5caa1214cc1abf576760eb1a89f47eb400ff4ac0cb13ef70211afb25b68d563c39e7de2a21584ecba9bd64f719d04357489c16765f35f61bdfa50ed7e629fcdaae9e7b0a56363f57e56f21488c467cda2ba7d78b1729c4b21bf80711bc12fbadc1b732def31a5ca2225d6a3668bcf3e8b209d6277b5821dcdbfb31fdc1b11b5e7c1a4bcb816e6b55686f87e9379c6e27e3a85b70142ad4412996d3c07c6c2495e7af0efb87993517bf8dbf88804db63fc86dad916908a78a0cb1348575acddf9095fc2968d038291309f5b3ccc3793d9694016b00358605f8d349d7235da0f33ea10b1c31b141a6ac28da32ca2c2cc9dcc0adcf66883c867b20756af435c82eb92ab21abba34c44b7e3fdf818a562b32fbb1488a22f2a74b8513a765279cfec80a195b76f1cb4adc6a9e57620c5b7641fe1fa294b90cc5b30e3ed8bc6a004b725940a74b494172c4919053f8b1397671db3a323eb338e945547130db93f23092870a4c5249fe05acf8fe1a6a0058f36b9cec3fae9ae0ddac5f95f8eb2ad977d09d5e94b5796aca3ba9d1f5e18221b5d6491c130cf56b678e37907913b81de6d3a223c59961ee8b1aabef2c85bdfa835be8b2f4814d415094e54cf87cc42546449e4328288af00ef00642077d3b4c26a283952b3529ca5f6570afc04dd65b5eca99a5058a7bda1c66c2b1cdf28480675221af004f116d5eaae0a318af7626f80e9c31a4e7bc127d24e823c80b1efc0c13cbe7baf78d95130a3d0f47ca2deedab7aecf4c66d602f9d180823ef1932add8f8825a35726a7482e90da96c5821ccd6ed867472f5010581590b578cb6b71a46b60510194630cc3bde1ee4dc9fe1699db21e1db6bb2a6619a22a4bec22c3827525b541dd9cd2c4d603632b4fd274506a591255142852bdd053d3758fe60e92fea82143f4cea6fadbf998e128a8811dc75301cf1db4f079501ea568da68eeb84dbdc7aaf15453ead8111eab197a6e3e2f207ac025f9ba14e3430e9a6e33fa6eece716eb45d63ff134ea62ed74d0b21e1c51dbecef5ee63d34617d8ebdcfa82356b4ad9974cce1ca8d06143cdd43e35a2957a3b9bc6d2b4ebe0a70ba4ba47e720596ea1a1090dfb34ac490fdb53c785ea0b2709b2facefc5daae96a19a4ae3d7941e5b017bda8067f8d677b48f22f7b84cf2b125bb86ba4f24be4de92c3b8ec06cab8ec448f27a35019c16f5edbfc7d37888e3cdd282f12726ca04d563eec5c909dee3f6fa8133c70f862d46333b9f5cade59718273a4afa5b426a1ae3ed3f5de618f90df2ff438a8d34f90a025eb4a067b939890c152e352cc7dc0e2ebf320babfa4c6dd4d50ffbe52918d5dd61ce4b30444995039c017435bad943a6cd743ea5f34cbb12ab1f97a1c31b1e271d32b9924745c0a0476b13e0abf03fdea04c837e84786a3ed9e8ea6da37e6761c99877f812cc80649fc1b0c81baf7758c04156903e5dffbbfa0260833a91362fff5602ec373c78b31dbbb7567a657e87b5d94485717be00c73e296ad09120ef446f1e6f935241e2e49afb40648c0b9fde9aab9b8de40bfb2e00ff9258f6f462108f290899d01c5489c142372273fae2de40c42c4c55ae341b6e104874e179068edee9c17cf5412749d8f72046630ef9a3d946c13d7190f3b711c456cc599622e3e3c764e4c998a34b6884c47b642e2b54ed99230740978029708483076633fd3a2629b77b550912b8f850eb677f42c11a02251a53caac229a13b696ce1039e0b9307884e6a07dbab711c35cb2bb33031ca2516ec918b8233283c458c8608e1388881d91d0b2dae5713a45e10521e739835487e61031a1c9184714919e5d1bded0b67ea6df940ad90dfb3e4008b747ab76a12f4bd11d515d75e71008f710c889b943058dbb4df3deb4dc164262873ba11e0faf65b3e5ae2670ec1e877c7f7e5b6ab6190d0de57f3e8e6635afbb99ac62a22870fc5f90a26e32dda8d4d5b4239d0c9721ed7d65953fc220044fbdf380372b74dad87c26147be34215b8a9b7a098c66f87f6b2d41c2b7993e9ea0e9fa168e17a56c0b3b0eb97a9a4cdfba08ede91c1c5b2f0553afe48da454d4756a5f53debc24a7eac341108af8938656343c4d324210aa30da022df0ec0992f3e0b66fd72d41fd80ebd6d161b7cbebe9ade39a5180bf7d6830d70373c8c336a6ddbdbf29d393e978250e70b1602c7cded65274ec50ce1535f89d09a8d2f85c08d1d3b6295780d83aff7672dc7a5bb5b02e2751752ab30e0481c2a4e2933f5f943d770968119f6633eb9d5c657ec0230845c0b48e8714c46e6cf669c3720eddc391361d68aa46000d69f191ced5f041419dcd129aee59e4ce2a96cccdf7cd43217d8f66ad8a2b32320af1c77b28729cf6969af01cd8f8cbce4b224264bd112c3842f1799929b5692c3f3c421ceebda281d0b8d1a6cf77f5d93f377f2a0a60f57291eacace115b3166873fa6168147de9ddca53bab4a6e0f698734b77098432b6aeb09debec9a3176b736a77ea8887cd850afe92acd2315509a3b8afeacf2e5a7baead29edcb1387c5744b1c1b7d13dbe1fc137b2def6883342511acfb17890f4f5d6340dd8e330eef1a50272bd772a62f20925990fa89f6638bfe532419e9963097ba98009b681952c6280d9e100a98e6f8d9c298ac0c4b3238dd16f84ed69bd9be11a3e96b49439b181153d4cf62408415782a874c65ee0acc1c8cda1ec68c956117090a865cfa2270da8e826e002990e6fc15ff842d5b67a65b195c024fe51df1291be67509b97370b20209647ab097fdb3f963bbd90fd368073100b1b941be1ec6710fafd61e18985672ec4b287203ba5e69568bff97d871bf883a85b90f102a8d9cd8af48748c482645ad9a9fea6ebd59ca3a5ce77fd163d2739bf6c5c99ea4dce3f3ebe7794910bffebfdb4786236714b091a7472478aeee87979d45edb42e330ac3fe2978d9727202b575c5d1dc583da10f13852218c36238afd1d0081b273e65db4e851fb7fdeaf601028159f3f1231fd4fa28054c41ec0b574cea951e103d89ac6590ca5f03894d34fa108b04d27381b5e3b62a8d9ada8420670c015789eeeab9dbb2f54933eb7cc3d4d9e1897c9d7b1468a61e474ecc179da8aaf931e4910d7609924d010f7019202b6409ec400f6062f18e6d23ce1f4a119a4dd947c0e2667387852e10e6c586fc564540c7cd47d63406b5738da962a04ea47b2df3af418a34ce2214f35a3a6a9aede4428694e5410a10d1ddff51349e876f9963eff03ced3c55ef9e12ea6d189e7ac76bb317563557b86a18f365e3a96e545f1777344303fca754260a17dc2579556548c7c52937af65c4a0f4481e6565eb02b533fbe272f84ad6495352e625be3644465f3ebcac639197f29c984347009c4ac9a0b7a99ea1a91c74593c398ddf75fb00c3d4af1826d44aaa36a6d0b2b0f08dd147e7e70b9b5a6d43b63434b24f9cfff4a0377f1f7b9663246d14655d09804248841d492e47d76f13e4cb76579123a99e7ed78b06a46067fdaa617f9a7cb41eac0fc84e9b399888715f626cd24692ae6aba25718263bacf92790e6dff8d146988256945b6d3264ff890a986b6d28264e5ecb1c1072c1e108f438bdef0bd29b9497f70ed25c6f93bf623016279b74b739c70fcd7f95002b140b46a31127f5c948c788f935c6799c31680fa6e9f878630faf17744fd81f15853261a12d9662571ad9b15e6cf47707bc62505399ca59b538de8b1867834724c33231bd2b9e42cd749719445e2e925dc71a9a221f5a42321c1c12c2afde9fe236d35f01f388bdb4bdc769b3f5bcf224bc56961d63f05964233154790f3050d646dc93756d9cfa935d3248b418e5bee702dfec4b4ed4c6d2b6e4fa456fc381885c177420822122f2bca05f4daff21f2b017d43b4c64db2043bfeac2eb7dd5b81de4aab0a18615c5942d95688a32b3c7a21f74361b4a445831c48113dcfc70648363ee03b18a2d15157a4d46ddad83e5bca1795590122a6d6bf87d2799fc9a965cabbbabc6b2da86163ca81033d414c5764a3e1a4930cfe858e8696eb102a6c610489e194f74a0a12ce140652b4ae8ff55764ce4b54ad7419ef0c0699083478c34b6ffecba6401feb00470b6228662ebd0b2205552b4c31194ce0ca8d702df5130636b96a5f590e74612e373c7fb25237e9a52ecaff305c0d0ccb89cf315e0bda9fa6b97709db00355a9033e7a3da23ec57b4f0b3baa21e7d9795eb65310fe09e7d87a7fd8e0f1cb75134a66b7a26c863be19f31743ea9ff255069a595a889fea08a12a01d53d8b81afe339d1eedd6a24879ae0fe825006f4aee53bb393106e43a8bceb8dc6ad741bdd659420e64930b818005f705f1c7c090afc7979c3f07533c59f91a849a6000e41825e6049b043a6db121776c29528bbd111f9b5d471de41c713c55b467257e145024099015bca76369ab117930433916bed666eadd9cef616e02fada557a01c50ace1d4f592eeb1935ed45cbab1c413405866ad36706fd81ace76a64e9e0448c949ea190d9dd7de5928294b1fe404cab81aa1795780e9713ca4434e2a8eaaec1aa1026e31c3ac85f0be58efabe51a3d3cfac1daf84f6449e22c3dae1f71ba90aa7cd2dd494d962ec0e8084d44fb2ff532c16bd8012607e6762c0dcd168d5ebce1a2016d3d83bc623170e16fd3706b780437497c5a4dfad25e6d5ab3f82cbcf927db3826f5ad47a8ab1d8d5c418af550182403cdec0c669504b7cd69ab94fccee4ee1f115a135e8996b6b11c7492f604d85041d39dab73b5ced20ef6190d47c480a45d3552fd2a8c5a04f8b856cf951dab83aa97567148bc2685c46228e1c56263c59b9bc6b2d2395fcf0737ce8bfb22f884e62000a80e32739997b6c2569d30f61980499f7b7f180dde89a1c30c4f9b291c9e778196ec9d1cd731f9ceb6f8b69f67b549c3a059b2cdfb24fe1f9cba11a5137aa2c3830b878b0437333447fd7dc779e1a31c69878e05ec8057c981640bd43121abacb9927727eb546cdc52d50cd715ad5d911d32341f7a46b3a90374111e3d3c99267faaf658532eadae1ea7eb3504c1810906812d816d1e1ba76c13abeb017275181c7b8b86036dfd92f59ca34b0dc4166e6a9d00958daf96ab026862a3436c4669d92cbe19c4ba65701ddcbb80fa5f25a792ad35c1a2a22c9d0f9cbdaeccd11403fee617795ebdec30df8ebb3b9239b59cc6da556f739ee565d9d64574644ae8cdd3d01f0f991d9aba83da2be69cfbce354e4ce706c94ccaeba93f805ed27fc9af9f135d413d8277f651e994e8e14c785a712a73ee6c54e218c6fff8d2e017bf91acd6597811968ccc91e37ea929d5bcf3789c818e245d36d27a3d353954bbd25b40429c1ddefee0258af06f913b3da1e8abcc9a50b90fcc020b21bdfcf7120bf5a47fad966c657be78536f108e12d302152df459bf214ae91c2d41a8191c5714820b4144d837166fccae08b76e14d7086b5000bd89811e465e77ed432ea7b0c3afb095aa8ebcaa84aa114c643044469001c55736d73b17468c2467176c9dde5b47fa706116b1949bb52fa28d712bb2375ce0605c34b9968809a557bb4f892039ff2b6a0efcd06523624bc3b9ad359a7cf143c4942e874c797b9d37a563d436fe19d5db1aad738caa2617f87f50fc7fcf4361fc85212e89a9465e7f4c361982f64c8c5c0aa5258b9e94f6e934e8dac2ace7cd6095c909de85fe7b973632c384d0ebb165556050d28f236aee70e16b13a432d8a94c62b3db9e087727e9e65ccd0c9bd77f818ba001da5606a0b9e727e333d9362f2faab6d16ff8c3a9edcd6fbc17c1710325737d9a3ea14c8886469ba1da3f487aa5ed8d705a440385985456e270f120a8a7c453fbfa999f0e4cac20d005d9920445c792391b7e9953a017bcd0a69f48d89edacda7bca380baa374721e552ca56495b58f9bf20d078c6b840bf737405c0b5133453de3539415f13be9bd36ccf5140c33bff99c73d0a87135bec68178fcc9956a552f0d3e4b98dc5f026d392ef38b1fbebe026947773047896fdf43ad8d9ba1fc67eba8a809cbbb7a568ecac7333246d30426e70c8dac550b79a1cc5290ea2d46080434357117250a50926a3a36c2280d1ce7a4176675304876aeaa1ca93d8df3bff94e7af4139f8b7b2895dc708329c982b51f1ca4435face1665b40391e4a61fa4b35cd1549817a50b1ec32732dd294b01fb660c96f39c544595e71c304f93d417aa8c0571171535bbecbd0b10aa8fb3fa818a84881651e0a083235c979f0c21ff815d93c03f5b306bfb34baca213798bcea437a3f25803ccf364e0def5f7bd0053eb9c26a974f5dc2540e7d89ca87c2ef3e7b35e6a8932e79b651755f1447a7d0eb87db97a85a8669fe359c752ee8f83c8619fea327f17f460c15dc1048d86f098faf266ef8e57107018f5fb5d4c3044bc9051d9e2b02f7e03f818c298296ef573318eb181156e74566060d72447eacc30f27da013b2e5dec577cccd34be9f163deac72bd7b16b0cb3481f0d30783b94c60677cf1e0dd7b155df0e3362a393bd498520283bc8e944073e74e01a438f290c5ad4d98a177170058c41a79a7ee975369f2e5955e255b4c2c227023a307213445e1931e0664fa5850e0b9c54a70cb885a756119e942cc9866199e628d570ce3e9eb97ab970cecc34e2c08419c279f1a72c1bf38e34fb1cc29b420e6e98f7c43b8b3a165ddd8b4e958904e16247cddb2babf4719d6b3d0907ddb3dd63f1939fcba21f9775f2e1c7479f4d56b6ad54bf7385740e549d6f18a6b763e5a185c0bb7f71ee607a577ea09b640e369f79bb392f672f4c3c520de65fa6d6b9cfac0ba1c7890b13e381ce752195cc1375237db2afcf6a9dcd1f95ec733a80cc170ad0dd24461a3439f83dbf7a930b7ff030f8b6850cda857f5c938591c1069f4ff8bce826377023f62168ea06ea40ce6938d8df4fcdd395db9f835c2c08bca5b31c2c3d3debc16590a3cc7f471a10a168918a8750810a316a6ee1daa2402761e8dbab56ebc1629ba1e5c509bb90df7b76d17a3937a4c30a94313b8bb525eb6669bdc6bfa056f818926e0ef3e4ed21cf0c8f447f75c7b263f18d0cd9b5185d25be48eaf20c1ae67efab2f6d8539d6c1ea21165c49b584ceffae8b26f229611224ef394788f9bb231434b1911781032ecd00e5aa308e4f70128cad8969e3d9bdea4446fcd9b57efd1f49ce259d2e3faac0edc9f855eec4549f3b9fbfa785d41dd46c1b96bbfbdf3d3872eeefbe49747eeb712a0f60ddcbc1cf41c890551a3c780bee22ddd8d5c62a893879b923d989f3771370b8f8644c01ca288fc31ba7f817b652c299d54a1b0d3722d74973e6664f8c5c03b9c5892f5ab7775e22a036f042fe2162915d62c62e6db970675779f3da51d34cda71565c15beb79c738dce0c410be26c8e1626afd55183addd779818deef00b1e5a1d3bb79096fb07f8978345b041d4758a89dbe4a0b0af4727a4ebda18e6b9ba0ff0735d0bd27040e3d3b50d9115b5bb7bcd0dcd4c4d6aeed09a0ca6c549d73d533fab0600568ffe8511f48035c221073fac5efbda46d4417cb9827876c1d9f4ae5b4157307b809d46c2c04210afdce530986e04bd2591cb8693dbc3afc7389c8bc3e4d4feba28a9b366b6c7b4671fd20921b98c77722a0988a9771cd2d289716609f3f3cdaabea0559e36959360805a23c8afe79ba4e377ed7af2f8726c333fe7adfd284fc5d92da7a9ce10202494ea1b0ddf9a8c4674833f78cdcb210ccc446b207f06e783fe8e2449fbebfd3bc40e5951c739dbcf53d809336629412cbb2b7af1d804176d955e55cf3e6d8d1ea4435944d53a1cb7e7d2b53b6a775554964191a2c694620b442aa6da04395235ac05b557a81fa198c70fcde13959f00ce44349a3995c59c5715fa1dafbb3df2941e1d7faae4f0cda67ebddd5513593ce0b9cfd84eeb05124a389d1427381a6521c444bae666cd10550f34f78508ea31092bb47b725350ab16115bfb10a172a5881c98b035eed7091f8b2ad5aa5e9b06d002a92caeb5ec8e420afc7a73de8ed9518ce0069f6558e18f5a681fccfcb4e4bda7779309f922e55689473857d6b62a057ee6672cb196bf2ae4b37cf3ca7df25980e6578b083ad5dbf805dec47332c02b597079e5bbdacc7a92d69428b03d592bf6bd213cc87c8858befe13c29c49c24b8547e4d16b6b2f06ca971072963e40bc72c698252230265543fa805a394458ee6a3351f8aa931156f5c098da64c6d0925ac7654dfe9dd65aefc1cd93336bac9b70fb68635e989af37c17d367021e303717892fbc450cc1f02a1aa1767006e3daff69d01970c3f164c5656a21588e8a3312d49f7bddc50f9e5ccfa409d95d28337f433222c95c3f313a7104104f5d030cb26f5d91b010e7ededa67f5656b8a12f585235874fababe342054a3dcdd5c54c5e241006a53571644568da65d05e7655f25e824fecf75e0144e7e4afbb3cf87a80b960e3a37bd78bccdd5c3c2d98d02db52fc082878a8013aae0796e02dbc31f7ff7f72f942c3eeaebccaee557aed7400a8c982908aa38a1dbb8b18388fa4fc2c3a67af25f8ed00a08fe786834e8b215573eb24b56a0ae343f3736f537e1c4ebb48e9434eceab5728d3c61cbae8d8a35050eb5f05bb40b533e25adccf6d74923ba76ebfe238715aae04c1118ace786267dc14a20fe2d77874049c111ac2506f03d282757ecaf173b6bf63157153ccf72262218e427551957ad6c18cb431424dda56af1482fa8e3ac9404698ed3d58ca067f8c843be721a4bed565a02a2eacb6f5a05f1d8d4bba285c53c60c7cdfae639aa0a0146accda1eb68cf30beb1ef2230c4c1ce -MD = b927381128f052bf16953a327e8bdb5fea57b3715142ea1e0eded78b5c2061dc68cad2956fd5ec7e51dc22ebcecca4a3 - -Len = 84184 -Msg = 97370b26001e364be3c39b545be4dbf49cfa51a58f56e052bc6fef536d7bb19f103caa3dde1d6ffcba7dad645c4b6cecaed3956e76d7b2d736e2f62350d97d896ed3d4f2212abcb0c9d32b6db4ea94618a9168c9e8fbdd944bc4ee5f3084a3a379a3922d136fa6cfd66b1f56aceadabbf6ddd39e2beae8efc2bee0ef53a3ab57f955ebd6fa11b4c1aaf090078c73c763bb5fddd588cb5b526577d3bb025f1e0cb590e8d61f3b6fef0d0887679cace2bfa1be8e5647c6bf24fa98cfaa84e0832976fd9013ca135dbfc65b0b6024beb3386fa3ee09b0059bcd4ac8dca6234d62180444eb7643c1089a9f9224d96bd1c237efb506d60bad77b51db0039725ce4440270c01e7d16ef8e95e55dabbba0b9822e79ddda69fe9db443bf74b63d38daf09a7fddb4fbd42b312cc4b36ec5997bc6220027b5fb5df50e26b46bdf375af2edb4bc080945064c37fb11d3f55909bb660628de9eb95b75df776455f2f535f461edcfdf8a0cffdb096d573fedea7400f8374e62e30879a8beb259b3bffb4c3813a235b4c59853400c1fff37970e5ad4e3220b45218d3b061263ef1594ce2036698e58383a9b9323d67f948baf1930bfbd72c9f5e8ac020671089eebffc23487d9eed1da577b21eeeef8918c94bf9819ed96151596d97132511d03b77f9c0ba4fb502d0bbaab9219cc3780cac645f38c0a0876f4baba1b02492d97f892901806345eb44cb2c1663ce4a8dcb6d260d57e89466a43d2b2320ebf96d63fb762dc341b77122e0e4110b0cec92fe14774a079f1dc59535d5688a02b0548fd7c78eaa72715c12ffbaf242df114d4ca74160706ca36eed3e91b717f21d56aa25036a5e7ddd74bb3296002fcd21885e306b95b9d78e27525d4757ee42aa3b5ceb140a06ea6280c6806084fb608409dbb6dd320b6846b96d9cdf91397abeca4f33e1b6cb42674adaf200c6cd20a3996c427f7e8da833ece50241ad1d23c0cc280452b5d50c5698a08e5f0ece94e4ffb9db39c3681ebd87629756f3c4c41a0a92674f514bd09633c05e63a42544b0056989f347c3534d548e6404aa56e533493362c0d055178fe3e16af5cffcb8707124549554c7cd49190e70341cfa0e7354b3008d7b1d67a96fabb8fed978798a0c944507309b161b9f8dc4cf8fd9c842f2bb469f9ac84b4ca1c8536408c30e689e5f63312369b629aeb166bb4c1b9a08eaf33edc758148e03fdd4011a505ff70ef2db7fb775633dd0e2260e29be70d2d0502ef2d536ee8cd129588ebf765d50cc6a7474e728c179e8689ba2ac365a8190b91617a7eb7b27be29534dc480c17a3ec741d105e33e9d3df8e7a7d0ebff335c4479dac3c852e5377884ccbde224d9c2a3d412b817232e6e1d8aac2c21a76e7f7cdaaa9d600e5bb9814d69f03ceff6146aab9852472793e541051e128a1ba986eca905b944f5e1c0fe1dc42fc38b65908628f088e5b464300dd78c1887946b1efe758a9bd9b21dfa298659b1489f9ec3a0ecb9b0954225dade8264c2acda29843cc097a9b0bb76a1ae17a9292e95182a2557325db8593f422d9636955c357b73220abb874c8a7273e63220fbd7f45830ae091904d172370285737005383ec75838b474a91f9797cd8c765fadf745d5738572cc3a7325a39870aabfa6a36e93900b7e3183ac7b6d3aeb44b3b3eef2167f4604da631fdbfb7079bc63de304d76d6f498a0ab65ae5938ad3ddbb22191a1908a6fb2133a1da536fb291b206143c7899ec41084fd98e2432cc2260d51acfd63acf3e1cf446337389f612411a8fa3c2464612fa4b6c3aee6e4622139e19c80754841e7fbd1253811b1053d3699c91b33dff04c8f33d6f5908eae6bdc43e8e121c6ca432d630c1e3eea75c4e396490b348c01f5a8f71b8cdc65f754490b3a8615b30d71d87c60503ca64339cd30f272a2d316c9867339ab2724dd8924a9d9e5ad877c02918fda84777efe2a37fc4df80b5f9f26bc2a99f70d25e158d3a27f9675dea653cd0fc3119bcef714d84ab3e1da8c0bab9eafb4e6faf38361fa77640efb031d03ff8ec28e0620de6802cedce69ce30ca6c25522f17d083422fdbb5fb5a9af3091bd8f4150332f04b26bdb217cdefef2c6abcd6cbd1ffe842a41c0ab30fe3d816b6b83d81ecf140a7268021a0afd2a5e89df7aea903020e3d68b39dee78538a01fae0eef4026aa70368bd63f17840fb04eb1d035217a29f3b62e89737fcb2aed2ce9730f4ad64cb66d4bc9f929101988a3e78fc4c73a740457a02201303c7ef8f19272b0b55a654d852c4fe0c60dd26817d4ec22181d99b61984b5f0cf55bf242c5d606c062f9eb62ca1ea8e54f9c4af290e87c58a700589aa4097da93b3662f2b9edea9b3c25380a2413c4a8c505aee45e8e537a4fe31ff58685a2723b20e5a8ddb3fe254cf2e2da48e97bda2ae1fa5fd1876f0ee04b967c2707f4f05ee1236b19726be5f82892da1ee8f405e5f8d66cd01df79cc20068366dd69eaa0c40c64355705864a98eef118f5a58b06012e811449613ad5cca3b2b413cc629ae07733879f7ee28c8eda2878185ce6402f7db58133bedc81871b8648c7f95f3aafcd4536d4d54bbbb0d5244ddb37fa8336e55492654aa755dbc86e834e832926ae8919b19bab3a5ecb6a8518c2a92045b41feeb6529753c94744dbf23bfc58e549252196688336cc1b04bb575323000e2368046b80174a62361b7f23f4c786dd2c4bed33afdfb9aa4c2e5787f158125311680620826cf3a734b6a8872d671b94b447dd37f6334b6fcb61ba39419acfaaea8a9483bdeaf80ecfa0e89a2a7d8f927db38211b0005493152973c9b88da08c2b6a0ff3b723c01f6364cfeb905d6b6cd5197c3f81d97daab5f014e7ba832d5d506108fee2a9d44fac6ccee9e399377a76e41c3fc0112f1d1a400de1ec2ddeb50629f013e4dfbd25e733561398b36c41cfadf2811f69d170deb3df66b1d02d29990f55c12257d318c052f5f7242e72594bc18fb1e4260d2c6fa609d4a03ca101a58bba851f84cebea4464f131a8d023777d95430a2e84ad659a10dca3ba5d2f3a8499ede50f8f88e2f7791e5e0316452e05fd08bf02312d5093f5ba5e8be2b760da3634b5b26f8edbe819efe19ce4141f1cf95324068edcf0adb83f64be812ef6243b84a92814873dddea6aa2bb6017b38a312b2182c441adb001739b9b641e63284fe6a9bba5fa6f9f94998aa8b2d652164c989ebdfae4f063775fec6ab00e0faf1b619db14a70dbf6c0847faa03d9658af3a28300594e1f8fc30a3f729087628047fd6d532d70e8a916326a0a7ba952accd52b8930906a4fc8d7c7dfc2a10c4657ac202e97382fe823dab341141cd834583af26be3194e5727cbe8c50a6319d245cb942bb472e8547def7c3047ecd5e1cbcc1b3c9fa814cb938d756b62d72558696e91610cffde5c1a01f012e59324dfb219148fb8b543f986acfc276e75c5453d05b6632337687b82c2ad5d6fb82b7a85926ce9d0d9528d9baafb7d7fb760253b1151b679c22d1f4292026438b4804ec0d892bf7a7cd6e42cf7e1f229148c84de2211bf832872c3c4009debe32099b8fe5c049518283799c5244e1a0d35b0c0b0b87502d1c2f015919eee48f184fe65988d50ef3c53fb1aeea09e596e7363753d34da14d83a2b6145bd620fe64a14c129fcf642499897e4240d6134ff562b2eee27df5a28e66b533aeca7a533f883581d1b7322e26ea481efbb253122665e4a4e11e36726605647ebcd1dad5d08b096fc794605793e9770bc4a68d26a1c9343c78394b0632072dbf2af328cd403231a4296ed5e8090f73d143b9a9d48f150c804ed51ca61bf277bca3384c83b60513e89e4e7b28afe2a4381ff38f6418d2d3360cfa91994950a93ecda92e3f5b8d1803ce3b3961aeec7308015c271e6387f02759b09229e3a82d0d504db7495651a8bc623df7d92db5460890fd5a4999bccd1bde00079c11836af1d52dcde8d0d92cdc025c9dda55c3860175dd0e2fe1fad1da43f1d83bfd68c8b2044f5966f1ae0a2c55a114aa4da09cbc57042c1664c7642b2f8ced4eccdfaf1784bd4409e057ac71041342913ed4eefedf7b9d474aaeeed74ad82e1da97087eafe7f741ac65c7876b6ba10d950e5e692b549470aba34d7a73ddd84efbaa4b8f1199bd3e0ca46d802149f66c8aa5deb3f807614a7dce38860b0a3d50e2702aaf57e1b48a5159c33dcc6c92da875c464cce80beb65d94267cd4a330bc01913c6bdd406baafcee6f1cd73404bbfd8a0bb02970fb38dd9d9ddb5b4940c4eb85d7213c46513481ead799dc30daa56fc7b57a9328a5667033153df96cec2002b6a17bdf63f3ab62d773514603730b409dca0896485bb3b80d12f1496ea131d9bc21e84119c174122cf8cf9efc6c723264cfe69d206ca517841da1c5fefe9ef2febed30be859233263ae6161bc356e97b52d91227186bf0120abdbf97e52bbc106fee89a40093d26042ab318935c54f3176994d09c0866276b33fc5e7d4c1cd65d688566c180268f96e4413e424fc9d7040a6e0210803edcdc4c7f5f6c5926a57a62261bdd2c73b18461784d299e21b5f39699316f7cada3fc6bf186dbf88da0e6926704038ca93e6538d4cfb9a611127e848309095c471f3408ef6f3cb8a67b1a6fb4c9c51f4ba8b1c0f32093260c6efd5ac7d39ebd7f912ba9c5731f0815768e609bd7a252bf72e2a03ffa166c883e089fe44b600ecbcc3bc5103ce3653f35db0b88b82bd5891f703d27b6d407f90228ba44bb2ddec002fcf15c173a5e983b58c707d5b2064d10f31e56e15c76e35dc63085bd388bd0e7d7a505bc8462b4f9b02995cae5635ff9e3ca3a041037dba379a903bc10b492ed6466a977420019e359b9bf02268b563cbaa73d998fd95665ab7a6b5256e76a762bacb3e203b54baabdede01605dca44bf05bfe0c2bc9c826d42b18fa7b72ec3485edb1873a00ae92654cb570f3d5eeca2d4ee7e68487c569ac41992eef058c8b1ba03ec16560d74ce83c8b9d81158a19ba0687b32aa1b2a07c44586a320dcffc457a984b06543a3caf53ef163e0a0acd2f0949fc7e96346dcca9f336d50a2b0aabc37a6ead696bd433296c557b21e55704cdcb1d00d3af1425e8e60f58791238a71131b6cb0ed0c60c036fe5d8fbae39d3ca77bf41f8a7561097ad7e3cd939f8dffa7aaddfb2fd64a2988641c805ca080495ec3dc263a186052cb5ede2a8f6edbed591de6c0466428f5f2be3d8cecd242fa67522f2a322367c2eabe8ea76ed69bc3933b2e0619fe23aaded667bc52c20ad82bf096345adea0df3dbf9c4b1620f60abccb5ed590eb63d2b372431776b8016a1264b94a9a9031342d28b01f709313493b961d3593750ff4d95b78a540fb4f3885783f77da82424623c3712964791b087a64142f0ae24f99b859af6e99d51bcaeaf2d1c002fdfc9f85568873db1835cfe0fceacadd7b4d48b833907b678c8da9aa9b162ffa4786c6bcaa9c05bbba8a27d528480ff5882e8941b3c2d39469cf5c2e3bb7cbaaa80943318756e5eea54197c1aed60438511de4bb9fee7e06b4066bdd9a5b9cfa6aad9f4bb45e1d5a2183a80d573bb38f1d40e28ec0bb85a7b55d5f1e7fababd3d4996171fb5bb5e97878e01feb2024e236bf0a22ded2ef5db4fabe5bb44eff1b2df6110d22f6b382f047ca60322c5e1ae2c3e5dfc1dac412f80513fbffeda0bcbeeb3786f2d6210cd319eb38f408691d6a74f92e307c0cadcaa7e3662930979ccfa15c4433a306716715cd10f85b4dd516f9d175f460d0167207b803fabeeba5a74007afad076b98f564f74e07ce12292d7bf21dd52d1835384f193c3940a4bd90efc12f27a85769c42df15ce909c100f921e68f9b8ceaf263a48f78b05dcbced0d6112c6b2ed2cc1e9944a066b36244c01434320e2450353d30a12025be67bfb01e7f0e3f42e5a949d077844574fbdccb7b646df69e51e60c1bd79a610b807878ef933d6c8c96e88ef9126e50f696b0627ffeaa1aa1f5ed198db94f2ceb1fe17070d621bab3ef71353c9dc84dde3aa8cc488b5043d64532acadd0a74d064ae2e0cacf22f060f82c86c2a1f905d7f0ac53fd93c739e4489d0da3a30b8e050c630f2407a9d83ab802c9b3a6694087bfa43dc69c76c47507178398bae1b5906a4c46a7041c38ea37d945373280c696af78d3cc30c7ac2e888657b49e928b4e6e85cd7b50e5d9177d9b4374cfa65eadc8105d37d621b8b9d5d4d21ed687d8e81ff6ecc7736a836a932e0b950443d2741354232f17ecb2bef6e739ffea2764058588ebb3f315fd8a807ce5c059bfe892972d6cdb799160e4f1a9d77e63d9f64ea92111695a4d11214c6b191e578269b05c81826386768ad4d000f3c4c807586b92aaa70e2f7985d400e5eed685f41c756b3aabf0c604fa369bd6d4f8a1185003480cf5cdfb03224da2d1ad106c7ecb8acb3e30aac0a377b15812c3437774a7bed42d43cc4552b0343d169ff692863c96847759b8fcbcc8ed119c08cdd08325463df7d93395cef730d69e09ad817638429fcb6d4202b5b693cd5cebbd37ac91408b51fe2b73dfbeea77503660c1b487362324b6725bf8094b953ab43b315ab457c722fcdc68edcf0a27146d35d8aaf11918697a6e8eeb89bc701eaa7148f25731f854196dfb60f037efd2f55450be3e938782025e23f8fd8f66f0168503dd407626ce9e06b5a0ea19d57217e6b15a354e7756966ba2862f6b7f98409fea8338cf5978d3d11d158559e4dd1b1381e5a0eff0cf7dbd94fce5f9c4fe70e8864c06e49a3afff3bb28889f21f949024ac74521fad4017b81c4e8e13c0aee875ea1745cf0fc6b97173fbd9296afe8dc9367ec8a9e4e68cdef4500caefa501a5fbe848df64a660e3bac4eadb4ae842c8e52f5fd2e323fbdc68e7f45ce6b5f36ae38b4b17fd2024ff2b1dd822458a9defc78665a2d23c02d073128e4028230afda0f045a9c352ff14f2b44f0e907e4279c1d4c5a27181c5d1992e941ebdd88f87ba81fe40be253b4a98ef174732ad798d5b824879cada8b0560a3cf9daebbc92fb7a43d82f77f1fc8a438f77633fe8a531ef6b6cfe5309e9753da076602b3021e21c3cc17754af2b79ef6b8439c58bcf49199d74ec86944adf7390421c1aa807b7f4571a8406cfd3e0e90225574a558983dd3729c7d6fc670d6298d75f4878d6f5a92f5dd61cf88867d70fd55c3cca666a80d51610c286c0777136c0aa2326f2239121f5ddf59dab773fd11ea91b5ee875cad3a467b7e7d9a625d6789d3926ebba42db9d1c2f43df8769f26bde7487823e11df6f2d45843532071479a8f91d463234b89e01387f77110be0375cc6d8b61bdc34d0f1f9d045838b5d3e4df16e7413fd45933d9f9514bc8c271bb490c71697a090642623709d13293d510ca0af17e7f30ef711c3493ae26143837650d70649f56eb35a70d9ae7977213c5595338416cc71343e41f05c1b31a20902858d17ab511c290f507fec1edb957ac93da05b38c018f513aa2efadf63df16f9ad5dcd243a454fa550d7f89bfd2676d80879ffb6a472a4225a5989978e5727bc46dd895d176691ccd07636492240baf284350438bffabbfae1049aebf7b6c5dad060feae8efc99e68ddf37cf0170d1a94f45eb07993db6fdccb4a145565a7bc5d89c7fa0f773b272b7877f960133457cb83126cbb6982fbb7bfe3f2c20deb41dddf49ecce76885f20be37036b80470ed5d9b49fd9eb680a47d25c708cd9009434eedde9ad5478f04e987ac097c60fe6bbdc8c705b7f544595edfcb83d33ad5c6aa0ca193579d37fbdee8a5b6f4d54888476e108ca8f0f53a8f90cef5c82bb4188dc5aa3ed4e61b776a9adfa787edd9c388efd8fae8262de88dcd440722ef3ed9589d3b05d39ea3d80af2cc63cbf74c9e00c262c8dc0128b3e809cd1069f1a0599917e670ea335bce3ea4fe64279dfb782d7a507f1b1ea04d1cbaccaa03cfb349ddba3f187f50bdaa8415d821215e70f29d9c24961bdb1f149a74b54c96f5d20a74f8a755095343fd69ba0c435f95479daf9c41a664c2ef9affbc39707a00771c2d57a1cf2ed789475e25ed2328fee9c9f1ff5a187c62ac50aaf5abae535c2d0f355bd0ef4639f818efde0d4913e7d217f339b074c936dfd62aa59e5e89756e544b79972de6170ad27d46ef3db6dc8af831eff733d1bbf48bfd608429a2e8b57bce35770394eb4c14b4f4f56978698efb1c6690ee3c6e84e2a1aaef6826229ce63c23e328c923364ff56cd274df0b58913142000c5fdafb8aa5e942c289cf7f4423a98dd5f95b53f4dd12e8b8513e724b1f06e706b26de2e488a030a1542be6e6034ab9c3bbe02fa3ca8bbacc857f668914399865eab3b570b8741b8d0be46e7c699c195a677e13cd4c3bcb29d24a9ffbdf3ea6c25f28fdcfb3b965fe17657057a4f20f02a281cad1e0a79c58de2c98e3deaa9474865a164208f4c27d1d4b970864010d64f3779f62166390b1ff91ec0170e1e42506a3b98836baa37273e33d1f152db6f9c0dc1bfe6bd46afdbd1703a55499182c46b23202bb8f7b86b1e8fd0c46fc8e29912bbaf73f9e6d749d287a7ff8249322ccf22a3205c7cd126db9314067e1e58ceae316fd20062acf2652bad1ba18f7811fe00ca6b4181abdfdd0846bf6726f8c44ae9a70bbc02555df023f4b38dab7cf960853c134d4d6d1e8cb50df81228eb024cadfe24130dfa12dd3825ce30e5676f5d79a1206a2a406b506412b8676b58101e431c27efcdc59a9232e875718461f85da3a39b7f5e4c4f91dbfd074e3968772673aa1b3788dc7c79d9e4af38d2911ec8cce88b7432b851b7e375edafd842bece075009d3876740f8f4c2846d15206806bc18f831eeadfa2a4422737291106d7dc5b5f8aa128f6f794d29fcf996365e7f3bdcea9dda52d052c6ada07facf70d9a7782f0a6707b9063aac220c29df9899b11dc6aa23ed05d9831be7dbe7121258fe35efaaeeb552b1ed435f7b1729470c305bf7f27614e29624cfc101728b63dc3d2f21cabc942c812932989ae5c2d9c5de12d32158cf5ba19e010637318dddd9e0be66083536cf0a7ae47dfa2a4ed93d36bd08a5207ed9a26b5a17eb88abf8e8858e1ce1fd1fb2a45ef36007393fbdf8b6c4d8fc71a5d51ef935867d0c684d7e97f8b6d678b17ff541c9ef40b6f8007efab4f495c0d6d65de42dd28a114534129498d4543c8e6f63cfe29c45080a39465f27cc1fa2747605a89d7c915bc5453b07e8f5e9cd29397655d7d772c108d0d57077cfe87b110caca32ef501305b195e7e638c158ef446a37014215866565fa2cb3f808ecf3f3299803ccc782398f8f34483175616822f81bb121a745c854e44cbe98e8123516072bc517354c9e19ca006e21829d8554c87737c134538182521ff003a5e0bfa1ebeb3f77a3587c74cdb41eb1f1f68d0262b459ccc497d816cc0d11e2473dd8bd5e403b95188e1dcb20b62189c953ca564f3be0e760f91538da7ee8dcd713ca92e7927f189cd6c8444c703f50129b8276167393bc0e617f1205da3e9a5b49db470e49d5a93718c407d8483fafd4b8fe8a3fc33cf3d8b75fc9d489dbc3dec754045bcd03f0f23c5a3d4ca8eb4d189186bb5395a134c6e3fd88d0f3870065757df35787d194d42ad20e31f709d3e50e6130d9508c26dfcea1757f800af9fa3b9d3989dd093ee6cb74a10d9d62e84417d913595bc3712b5e93b86b992b55a401fd01793871952f05871f6b02be353c9434895b200ebeb27c1a7a1ca4b3bd6cafe671b001d342b7c155afd08ee561d56dbbbc680637b57d1180e3190b6bd8582d9eb1b59ef5ec86e8247ac6a99e15178bb6d4077504fd93030b1aea34184f73636dea10799f3ca5603da8d4bbb2f90bd46df8c1d53f3ffc3c0448178985c9c2399d444af89bd91b13e860832ceab4b83127511d8fae22c1a2b394287079ef4f9875e6ea85b06df0e76dca59640cef278a2e07a3091a4fe91f5f27a653bb6921663cf97887a59d2cc6130fe0cbe0515ec8c841dbac4a6d7c9a5128199914de408d3ba47d664313d8972357a0c9308367d13e274ee0082583fad2c007aa4cf6b5f3ba1080895277fc42e5c920c7c22c4a8fd8e3830e1a1f04292817faee2b5a87820064095a9a709eaea18ee82b5ff50de9dd9a029c49020a0e9b5479cd79b2be2057c9a040e2a7c8c59fcd805fcf86bac6977754f45d769a9175a00daffda563b70567cea3f4c4816e26af71c9da8658104c9f007c1e25be9afc223cfc80dc7c2e53651aeb966ed291805c41d3489ef0ae453d8e9e54b47d117a03911ccaff146d89ec0d81914dc117f3fb7be4e0758988ca7787c1c6cee0de356a9177a3b5305cef232dcbac0a59e6c8b5a4636bb42b862275724c3d19edea7680c675d3a6dae3cd330532b14d9fe747b146bab202de909760d7a9813dae1b846cb77f217b19ea6a431a1f66bd9d02b718e8507a08ab8e6f603e3f5ae32b5aa957ecfb56dcf6590f7cf6f895035a206211138d8e6d9968f39c307690b36b902b69ee533a7077180406202604c7de278ec54ed9b5dab1066b3d34b6ea5476a353c944ed95e0a70f910820127cb03201845b219cb6f7fa501f6ad367316f547d69a076332fd38b27feaa7f23c4665d948cfc143e5a6b7c2f564c94f12dab0e04b5150d8bd0f22d469216c4c0a69267caedd0b02769df3f895a0bffbda6b1aa227e51905f3fe5945596717753e8dc5989f1fe7cc0abfa4c4871ce9c31642833be0e7c87164553c83d52e6204353eb3abbdeaf016fe765aa52e4bdf4b62eb9aebfabbd7a18aae5d2e40e9a48f8af681247fd0ac59de7c76191fb028eb5ce0c250f9e3cf2cd3642b93412b876dac4fae915963852b371c97aebfdc2f2940ac89f952f22779db0128514a5663351594ac80df16030174e13fc4a3428a9bdab952539a5978ff0e2ff3e6b11cc06c538ffb61755abe533464cef95e6593a96791dbee34ac2c42e92afed239c14779e27c2bc1b0c41fb6e201c5bb45c802d893b05727b64cc9dbf89ca9a238f630e44ef3be1015c49fa2fa62d498edec30bfcbbf849e93cdca20b8ff94b5332e4541f58112db18eeb68e09e24c00db34a5b59bf9c4c151a1b5c7b6ce40a9bccbcd09729eda813e951cfe8d1acc918253ea507109982e845b15275e732dee3a7160b152c765b10b7a0b6af076b6b977ac7726e7698f44807c50c62c98bd01309188bff27554d8e3e03a69d0709ae73fb0c48f6b841a81ea67f13abda99e6133beadabfe3318676c8a0261a9b2f9a92f036b207a03ba8536b08eeb6e2012acb85b580bb28b30fb19b9fbe8e898538dda16c3509f42ffccd9e8825eda96ea4242ea1035dbd83ef26ff29f6619ab28f3c55d75b647dc4aa76872641b7f6865b0480d5ed0c6c482ebc3e6657fb965fa798569fab8003a3bc356e0bc97b93f15755c17ac52ffbaad55d9f7d68c4453389d7eaebadc64e7339f19a5f45a34658a0fd3ab714303353ebf06996b1256fd73ce35ae3ea9c25dd2a9454493e96d8633fe633b56176dce8785ce5dbbb84dbf2c8a2eeb1e96b51899605e4f13bbc11b93bf6f39b3469be14858b5b720d4a522d36feed7a329c9b1e852c9280c47db8039c17c4921571a07d1864128330e09c308ddea1694e95c84500f1a61e614197e86a30ecc28df64ccb3ccf5437aaac81a2d52950a3c4c0a3a50d3c67f29b707411ae28b452236088a7f6b467b50518c92b17c943531c84f3e7b7f51e25f972182570e9646b60171db950fb9426c88b3b745aa5c29fdf487fb2030413de04af4bcdb65a4434cb83d3a8518d23b27c6da025a6a514af947610affb518e464290d4b18a639cd6ec0d711c01505c80a825c0e603b183acc3756e85a6c5d7853d7b7d78f3ecb3784b1bc1bf692d87b9d41d635d7ab155bef5ad61dd0c4635c27dd90ccbfaddd24371178936900ceb8489bc5135128dd30cb086b15f36bdf22688134a51a51e415fe567922c7fd6d10a4d6a5114d42d45bf7f6825b22b1354d8e88fffb3fe9848f32f75a4473c718173ab8f2da3c67af3fee7bb877ff32ea40025b7f3980d312f27d8a7872fd1c743e62893ab89f25a24f272e79d6d97f829c8c5f2eda9d9d23d246767028d45bf5f8b4edf946e60b622c3a75430251e582d5652a7b78e6a64bb12641cde09a1401c8ba4d9affc177733980e6a074e9035f6d2544017eec8cdf119572de34aec34c40eb2eac6d91f83a0993092ec91f679cd655124d671fcf7275fc904d9f92e829d3b017a9fad80c4b1f09432a596570bfa37d3bbbcc00dc8a50f420888bd7012f03b18f204214221adc2c3b4fb04bbd3c56f616d9083032ab24f48a1b83fb9cc04367fb8bbdc6e81de3a437eb6842ab9763584a21c61e60498476537302711982353bf368c870cce8a7d9efa9ebdada554b3c2c22603bf3d9d212032b91c805e93ba5fd341ca22effab65b8e7a584b7fa80ea635771195bf0a0201fb1bc60f069d94e7f6a04cbacc760b03a414fc0d2fba71b563d7327171271491f81ecec5788909e00973b6db4d45a41da33252f99dd20279b50d0e5a3b3b7f579289dcab9c9f40d17380af8e5ab1aa31f39d011ab238e97991e34e5805906bdc312697c75a2762429c90e0dadb0045c8fc1db27554334f3d601f9a73b76cffa63ebba8239b6896bbec6af1c7b87b9c69257a0d146c0d5c4e8b8a99b43a18633f1f11b6c745ab05c5cbd8895dd96ad89cd87bb9fee30c373378ecf42274dcc02f3ef06ab94238d6e7a1a050a5261520e97de95f3b9f790974910d53c64eff3efc02206c03785732aad68bf0a688c39dd97a8ca6d48a9cf99a3db45ca6b0cb0430d26863add1504195d2610e68e5be77f3382c37d08bbc302ce3abbacc83863b521891f8bd346a2a30fdea55f4274cd5bf1f91b9378922d5b2edb81340ad790aeb3b64d23d88ee1603c0ed6a5134b6dfc69882d5116e1711b4c2a4100818ec9a82a3a69a34b7242c978134f887f644bf8f09c9336721e10cbbca36582eaa26129fb822f7aba8549573a985a59f533d9aa3db2c7a408ac8ed4e6d3894ba4d719bcbe19f92a943c6781fa1a919a035eb9b88777453a59116ddf613706bb2e8135d8c89e4123670c2fe24d068fd928394e7c84369659d1e11033a24a8862063557f6d15ba205a178f4f099d89f97e2581a9eba9d25930190388a208a68c0ba67f2af3eee9641e2076925672d6b46b02fa07771078d6666a3293b62733267c98d985a87c39858973bff094b615d761044629f6e0248548f9e74dffea16fc7a23abb91327722ca4f9b2904ad00f096812af38ef809c0dddae69dd04b719b50d2e3cedbc585b007698969b002a8cf389147b5ceb5aa8182e72026c4df702f93da2d54a2c75bdaa0739b5383e2b543dcbf3f3bc71d5124b412bf82263139a721365bef8eae860d15fc555908d3b2e8e37955f810959a15020c39426cd71a9c696603f1e7e170c1e8722bfca74c2e38ed3e307d23b4e1ccfd3201ea1137bf79dcf7ba0e4716c8938863a3b0f7c283ce6a9c532d8901d4c6f602cdebabe984ba0c49f28734a4d9ec964f310872bd6fe3ec1242abb8f2cf9d9d1cd1b9a552f6e767fb220f391241576293788590c32f43d21e635a2c1e4eab52eed1f6860aa29c8089dd08ccf58b4e9deede9aea4a5e58cd3f59cb5acade9aa7d73304d6870423e654980648a5144ca8bfd7cad7d9898d3df37a71edaf0bc60c8479771f4e9817fa09d78a64d778cc0364e897f1e71d6b94b969d02d3132c8016519cfb8c7db034c180ff789d325674e9ca584b0f9a67e621f9c88c1d8001b270798614b8949504cedc5f0204ea688eab58303ad979130369476ee1429d039ddda79fe30196fa98d198de6d09078bb585e05b740378a2b8296ad82ccad4faea65c32d91eeeba597d19cc5e135f187917d4b1f2015fddbac6b494e933b8cad4010b5794508fb5eaad7d05c850e1024cb9e7fc5669772878836cc173e1f2ce548e765cb28d52fef79ea1cea821ecd2a0bed65946f123e6ef393db7d56fd1e6aaaf1bb6b62dfed1fab1268b900ed8e60f874e5d6630ec95896885ec6035ec9040d36a0a01aae9eb5e9579c0f2601bc8f3b3ae8d16a117b0d18203d3b6cc9957b19bffab378c8ab7adac2a0351ce4c07f7c4754cfaaa5bc5423606024bac6ea967793b3eca5b77a36275a5c730b1e00f862a413164e51f4f75c52b0c914dd301ecfbab193c90375b07728b8101b35e6c295580bee7c9e8bbc6dfd1371a397cfdcc83ddef00b3203b273329d5673b3d9a4be6b26a15c12e96cfe6972668f7b2f950b23204b94ce8b02c382f18b3c20406885e64a76183776cfb69fb6eeff12b914407461eb8c5f77690e209ef89d0285d491d061b4d5959bac3ea6c5521be2d3200e3988191a6b2eaffc128ae5bfe30fb18b3152a4beb2becc3d8689da0d75e6801d797d1d667c189c36629f99c94a46c61a11058ef81849f85c48e9cdfa535bfd163c283f99199df86418c35ee4c092dde77962baae4fa2f643f3cc750d02985fa18a71c7dbcb258a2e3ae07a38cc5bbc9970516f06dd338e998f1c186b0c076e656c40fc5318181b3ad2dd36ecf6092cd9ffbaf6284c628a0725c0ff3ff90ff10be97d272a8bde7333e7a2da29c604f54f2d85973d2499b134bba072af4f17b23a0a109087a9df5abf8217ae16c5b5dfa2029a9a6deb3fcac95ca4b8e39889779bd6e17f93fc849886aa24fadc7a82b27b86e147df2bbb9e6d0db41b045bcc09d655d83c760b33f43167b105a26dd43581c243e6bc6b77f5c9d8b8e13a214830928fde0e575e553868c1a618912714315dbda6be2b34da9684c4 -MD = 1b1979f92d62c71c5756924a1778ef10514450677754acd36cd0a9d71d9ae400f556e03f5dd8337a24e8e6d129c7c919 - -Len = 84976 -Msg = 9d251427fc3c6f7050f75c8c8ec5a0ffbedca25eaf22c556e94ef4efe34a7f1276dc254a928672c730ab4ba887f2c77a83f040fb7301aa240276246768f6cd36e11ed9c45e6be40f7b5a851eb2cd2787ceb11435a2ded368fa3eb4fdd232a9f0c631571fcab36d511b4d3576761d693187684793a482e72abbeecd3a89c7bb4a0d5ec8e23d25b694f7cc81393aa9347d965d009ee1b58f702cce96a5f57daa4b9fed54961f8a67e0f71e91ee683a3175e3d868dcc23e7344352638c67f1b1efb622622c2d7aa283d038d8e1d679807205721a7d7ade73aadbe3dda258d6bc1633f515beecf4d9fb4035fa04f9f8b5f86d87fe4170b768db4af5ca54b8933388a1eb526a36e3b774cdfddee0a78dbe1b04f3c482245b4135ff0cbc1bfd93c2e79e89bac671c3b560e7f4fa1d95a4f34a5a59efa82c16975b86ad25509e74e4936834b15c54117e500ccfde041adb1016dc0ee22bfe95d5ac703b989b2193131cbd90d88424595cb2cac2ed4ccd9c7ef118a73ea5f24576b93a4c78641d9ac8f3fd1292d68917eb09a082ca501465aa798ea7778ecd92150243645743e8e880b9b52e62dbe8b993e51c93d7a685c31d00ac740f4ee7281b0829f7b7b319f8d4ce6468eb0cc9cb01b59d5aa7b8a841613700b1787eb564033b6c9b1c1a37683fb289467dd1b2c89efba16bbd2ee24cf18d19d44596ded2682c79a2f711c7a32bf6a24badd32a4ee637c73b7a41da6258635650f91fb9ffa45bdfc3cb122136241b3deced8996aa51ea8d3e81c9d70e006a44bc0571ed48623a0d622a93fa9da290baaedf5d9e876c94620945ff8ecc83f27379ed55cf490c5790f2783faa4631e7a705d5c79852b0c5c410498b580a4dac511f2304067e1d34f919464db6dc5c80918673601a88a8ef41e80ed5d963e7e87c104934f9541f42b43b1766b6ac8d0bf8a53abfabb5df8159f4f8677955cd4732f1c2413e777d0140dc5e1310433dea5ae69e2eb256af1c8acbb8c8be5c7839444820b13c34d1012d71acdb6a3d099c16cf1045c4e7a22142d0a2722ee4734efe67d71d792895c2d89f66180b065aa1dad3238d59e5433010a857ec317a48f8efe577ee8bdf45b6e0ca2c51991bbb8c15775a7df7dc2cb972b74baf6caa53b78755659cdaa56b6dc46662209b09a6cb354027801538a92df781f02436f13e1b531c32b0ec37715802089a0d674ca6efd8a21d4c4887532e0dacd7f336cb6284e1ce61b346f1e1e608255660a441265a7e31ae3af844b50a237c8594d2a56b94a1d0652c615157c8655109d2c8a3bfab74634cc4aafd4972e7956b71911bb3bb11b6cf74c1f22d5fa7f036cc5ad0ed4379ab8b81d72d7ac8b86c0c1208aac578b0061334ef40ed2c2ea76fc5c15509c2ec9eeceb1331e3ac1484ea1e9fbf3b5e1b32b2e55fca01ae87cb074792accf9a5ba1e378d5b6fe7d9a5477cfdcd56fcba1c120fe89fa256741ffbfda5534994a355901a3953935bda87f57de2699ed51f2360ff9045da2d6cba9dbf66fb8e1430828ca03e82523fccd59ec9223593e717b05b25d4561248da35dfe147876422542959f1234f733bb8778b8b459bfcdbaaab4daa3c3a104ec578098ccd609366183240347024c0f6a55404e9d102a258e0fc7cb550599de8366a63e782eee38783858992ae68ff199b56500b50d24e07c28b316f991c80be34f5351bed991c2e9e0b7c326482f94ba264b91a4972c68f5740b3ff9ee98377c700c64f96ca050270aa603d1adc7635c366853e454cd29aa8044c8ee7296cbbf7745fac06e767ac014b7fda58dd3e7f0545fd9ecbc73ccdbbbd4244fd450434cd37485ac45a0ad359d71f32a7ed18d071e76963634bcbd29a55de4867a313885032c9805889b6208134896c8e74cdd00d3511b4954046514db268c3adad615f894d2a464bde333a804c05b196da2628e3173cbaea0f76f1dabe28dc58cab5627e71b2d524bf48cb5e05da294588e880fb76349de91e235b4b5f65bcef61d8383984aa556b96bf78234952fb26e4de7f5b383f841bd61437a87f698afadc938ac26f5aeea9ca5eebd8ffb350be57cfce0d47a697069f132cf7057a6f02a2ac001f1b0ac664c3eecc850f464f974a82151989b10034e2e6e242d9e1938e1beb415a6f020827e936c2306053213823c0fb85e8a7e42d05560290e3e61d26af1af67b5289da77a40076e3dc22ed294c51285b4bd26e77722b34ea0bd03652c6ffc688aee964de5c1290a56afadcf32bfd45a39978c39c8f2d1f5739e9059bc8645a8b6a68cfe37935b77ff225161d2a8cfa63bce20e24c6246cdf5577b3881d0f598b6e4f430f633193775de9c22fafc5eea59b5875957ed7c28a47c367a22dc86c91a2e6e7e882cecd98918f08b12471ca701e2120791e0fca61f7154a6f61593ba4ee74e4f83fd40de7775e112cf05835cd2d87385710942c6b4db584791f896dcc3a4362c7000afa6ef7a005287b42d8c2b0d0e5b8bb2e8fb032ea3c48d01fab116e9988db2e393d34fa9b0c2b2df75a5a8f454e2387a59b398cfd9a62dde49c7c72bf7ebe32297e4166994cbf6e3e659ab22e9c20dcc0f90d4536c751aca0e9142efd6df872a2649e25e0f06ba6e19e8c02d3f6372248513443ddeb9da71a39e28a9a7d0f586c97521db81eb83da6af37657b85f1c1064ab7703a2dcc351c35ec6fe0d58d4b4ec065386bfe2c9b5640a3c47071d521bf8d9db295b668bd6c853cc3159efab21287e05c40ba5128b9f8d908f8e16cab3ec2eef335aef9a9d3d0da7082ffdcf77e93ca737e77af4d9680e0175cfd3cc54a90b31a633c056019becc5c6f21bd815b8d2b646e60cc70b67fc0dbe4efcfd8aa9ff30f6788164a06f81c71232b24b8701c0b17589a32fbe29e823bd7dcad4d2798b6ba89bbb3cf6226d295e8469a0487e9737484506954e0852d1e7fef5c8a8923040311fd6557f4f0f4b2049aa6cd669b6a6339a8f7e578dbc96e224d66f998e7e6d24675b24a85fc8cafc04ed07bd6dbf9ccc0ca661474495f12092153011b8d630f714c2510ddf5a174648ba0769f51279761df3e4b9b76f5f27c91a909dcbc84a2daa94311c4813ce938789f2789a4fcac640f05f1b40b96f6c2c5f27ba11d5073c9b596b6024864f6843e54f45c7d80f31181456d88af470625e6b5be3358cf6a8698a5655ef321838f044746df83bc55b05e8529df0b120aeb1c7b3a5a1409705879f887a22a7b78a2f30186db5fb7b888cd4e8c80c6feea5d8ecb57ddf9076b8980188594947bbd0533091a19b87906e2f727fe3589138ec3652d7d86b0d0455fd78cc5fdda283a00ebe76c5e370b25060498e7c4fc5ade65c829141be16ce423a3dcb1a4a48bd8db4324e2758474ff3c1b29b0f6c6dac38ae048846534e4321c0f91b05399aa7ddd6447e62546bc7acc6463bf93909c237cd511352c4f3f1594403229d0618f124f76d8df3525ec80fd08cd7d6301a6e881ce0d9038dd8577d1614786e4a5428079a060356ecb0bf8192ff0522dc202f8e2f3c2fb5084be3f1c98582e570dc9ada30b664f98dd21c9660052a7bb7ab83de76dbadf3eecf355bd0dee89f1402e8315df72977b0637dd2da47de2d3d2ce9dd7647da5c8be2ca1fcea90ff7ae779e916430c74deec531bb543f96d3e724e02fcff91b3b7a26f0a2154c7f8b9a9b0c6f05fbd4e8a37806b48034caec4013f539c678073d23fc67b73751adc772fdd04e95c0c8e4890c3b52c0f000f2c28aa7800c4d24be33e38d93b7511137c20078a4a62829ade9f26e1aa8d9df6408e9658703d0da5b046cd0dc27c3405902537405b98a5db140bb0d80aa6a9cdc6dc0bdd33fabbe803008eff4db10c1b7be6740e632700b9b47c69809481aefb87b912ee9324637ca2148297273c20bb040ac6dcac37189d849c5ac2904733e84bceb173d6e38ec95529b2be9746f84ef53a35927cef77ed4e108a87451fc1fcdac2f255455ec337e6e7245ae4f71d3d141dca181c77a413d88301b5fc32df9ffb3edd7a28be8a2e1bf8e254577616ef2a5c8c56d4f82775eb9bc835fda7153978ea79cbc72a6b16be01f49538ec6bcbfe9e8435eb9a897d4e00e6f090a7eb32176dce3069cbef5795ad6004cf80a53b5a8cb89bab845191cb5b63cdfd5aeaf2a170e49258c99d5969a13088635b4ba504cd32715adf071b285448b38be799e1dd9ac4d7da4bfe8401886c0b3da4e573c50afaa041d233822e929c8c83778068959475e93879984127081a74a684fc0c65eb160fa8865e2ea5be673f2d3128ed8f05ffaeba7cf6f6a1c944abe42317d8ac1790a5d6220f87557fb2b4d13e18da94966b10a77c9d0d3874f1973fa8be3f6237704c15cfcff5057e84d3b7c5d8956cefc0f649a017ecb4b12a22013b79a94ef2bcebabb525e07f63e58427eff188dfb70647e611eafddd27f6337006d17e39f17e69e1fb99b089d5ddaf68e4ea19b59645edc7f7a1a67b7f5db3d62e4d26ebdcbdb0ffcab3cdec7c753cc3cb4bb2b53686cf3479c1515561678879de760a2c5a82a74d49fc9f7001b41380cc9dbaa93cd0d574bfd46534731d9ba23cd290c413d43613a1fb8fdc0ca31ce711679957532ce7d1f2624ae06086d49870eb217ab0bb4598f93803fa4448403fbf31b68721a1ed913af16721ceaa1ba5a3492617d93fbc257a3c649052ad65d201847b034e37cffdbe0b26bf6692590ffd720564356983024b8e1b67ddda74e6fde64f9283f6755da737ee81cf45741fa5f028266d40837796b78e478ed556c4dbe29afb68e7c8f91cfe2830b1cb561dc44bf52828cca2cc803d27f70da8f1b4c4fdc507a411ae1846e63a94b62de5518109d6310f16c94833aa4d41015b2ffde0c1367ee07d10044d798d7584720b0205b43208ca25e134d78567eb13f4f7e956b55628c331d703583f899bc3a2af7a77d370760002d0d89357dfbeea7d30be4f618dccf637e95e8fbf96ce1cc6b9ff00effa4359b3807c90a71c822ffdc4c5f24e44342097305d1b811dd536e510dac88f37377f42d768f6fd86ff897d9a466803e126ea579347240d8479bb079e53f63b8f1917b6bfe3ece185fca1049a89d808ce6bfb81f966d1ec358250344ab1b37c6ab3cc181f379adc81431e9aacd56be671cbfd1c4c004ba596b89f75fc3e26d830cb436fdeaa2975e29aa947b8744824340d9531735ebac011e250d19c4078d9492a27c3e685c13510caea14a6ac994a7efb6dc756c845c50dca0b511300d0071e981e1d1e1089a3749b88085ec683e1b65b2de6dd85143df23677fc47c657e915ddd0846e92aa4774d42c2cc909307046f67d96f0df50b027ef3cda21da340797c0e700be554ca9793f7d86cdbfc87f959403e0771c21a416bd03f3898390e90d0a0899f69f9552eca22421532e72960bfd6acb5a85aea326677450680a9318dd83dd58ffb9b0c933c6c80244a0573e10f8586081622034bfb736f8a4b7641b71f30e44bfebc396b8731233865b9ffe0c4e76a6d4fb9ee04973f2f327d22c7a2f2243651f7cf742e170a9bb03a8715f67c76ba53c97512d2c644f4ad7a312be81d823c407b67354188737a2a1cef5e8892bdf659f8061a5d152f6049e723f6ecedc566860df6054c47e61f04a175521db427cefe7fcf5d09e058e296386db127df7855a1040e5ca4c1ed1aee5c9b692c3d4e74afa543535fc44c0c20e280d32f8f158a001212b3f1a2f2fe45a2d43c4aaa8cb7ec2d04a5c54d834d586a0fd57a692764419ca593b95792298918b213ef987ce9425b75ccd0c8a916db536d408efa1884d4282984425c353d4712b7b88163998930d5392118e207f8f8232bace3be835c4639210e432d76a9fe454772b6b86d28361ea15af4062a845d5dbd630f22d26b06442e8a2247b0e02d24f3dae5e36246c09c50d2f8c1ab196967a51b67c3902192cda49066478e7032165f69959103557ec2ca11ad90e458bad5752e842d47208a5a25a9958969eadbadbca75c3ddae4bf466f9f68e070a2a03ba024faac51e83b6e244e2699cdb0585fce0c80465365108bd3e4e15cda87d7eeb89721dd6ad9547e12e6aff5445156a0f611d84707670107798a7d528c88c07310ed904cdc84341e841b7838485e4525b74f9aac616b0f5dd2e8b36e0125d87d6b90dc57316978a3fa4535bf5437a232942e6e02ebd199d372981a0bc2dfbe420b395ca9040980b2e80c6f16f26e0c7c1f36b8e7213b4f1cdb0127b86c26b085824f979eced4eacfdfd96acbad61d246bae111a58c288d9e6ecc42f0478b6d9c534c23c4ec6c256f3424df39dfc39246f9b5eeda96f9d3ecc052224fff8e541b109777a8072fbef59787230e1403dae14e3dc6f2cc4fc06c522b1c33ee9002762cea09a489a016077c68eca4e4930a9a4ae1308ab69ac1b1a6bfb728bf40d7221a9c6066fe6dd9295552829acc01aff65238a21ec06b5631309879aacc1160c36c27025bdfd966cfb4dc8b5c34c0397a06bc920b94220c8f724dda46af722dce942265ff98834d5f1d5f7d65b96f4599cad586fd8c5f43110e386f68d3e3aca8251701ced2ec0b7be153bf43b45f42da312c07411383985a46f09fadd4065be4816d7c45f9841f9ab361f772c020cfbfbc288992e43f8aefcf0ee1722a2aba084bae2bf186ebf83006028c7f67543abede43845f58d3893608dbeb4230f14587f641a76e057433d05bae04c6145a125c1a158df30bf011c176e003ba92da9cf7e3d054f7efbd30f016dce6e351b2e51bf2071d1a5805b316bbc3c137ca471ebcc6d2db3bc037ae13ea07a96399ef3182f8a0a821d794fbaa29ffaa4641d7495b01b1a0b60173d9b027c6d2a3677f7605806ac5a5f52e49f053ec3562940bbb6717052bd33de262596292e94f44d421383bddec135b223c8dcc21e9192b44d3458935f33fd013c6742ce453a3bc9dd17f8d6281f6541121e6f5294bd682233f9adacc9d3862787494d943b86d393cf56ff7a12dcb8a8bc870517ac42733173ebb8e5160795f910b401a297de835220b6e0d12560f68f26ece839ee887b8a17f4c064d036f41fde8ea421e1ac14aed921e202e814e79d5a365edfe2f848d426fb0f517ec76940f9c17f38a2574f51017e4e36e45e527b5f4bb03111f8a1b8a9e7ebd5a924bd046a33da106047f9e0a0b56c949fa701d13d15265802f150dea7a29d18d8b4b81538cefdd0a6e4dd06bfad8445a358ba46fc7b077c3d4c1bed28136c4193df21186b782fa1f996c2696450de7078d74682a5649dc44b6fcb8e3522a278630dc2b80c1bb9abe3c56fb19a85c23ea48e6d2e40ba2e59b3c42868d4b786e7cea6619b229ee315ebd9ad87663477d7b1e3f6f2d3640363fdb1f92410ba5fb35e12c769b5e9f5089a3a4493d24546622740ab75684a6409b2a00869ee1376079bbabccbcee437ab7650fc7ce5a177078c0c52600654987359f81be078ab13090c0407687377f12709849deaa72e52f06aafb45ab66ae9ca7a21fb30b5687de1395972eaaf8a6aa3db3cee8721d51e424891990c7f749d369d837002ad33feb8aa22c3f68705eb4872e1b8f85a7f2528af1ac91d695afdde4b8641fe69f5dcb6e8c5c33705d0bc3d58dcc3e85a12adc826b20b367c0451eb0b9238cbf09460027aac3a5230d325ab1593d7fd2a78ff4a35c128ffc15ae184660f1b124afad2c5e83df0f210f76eba2f70bcdfd19763d764afe91f3f45f4d2e365b37a800d7a26bbe2acbdae22de9130da3937575920973ce4133ffeabd4fd0afcc8ac99b79f4e7a02385b113dbe59a03918adc5a480b144c871060776c72c633c224f9dde8b64ad045a754131563905f41fe82262c94d04c3ca1d618c1687778e880c956c8491dc52dbb347e4ee5ae9751791767a4495053ee52b14d70937cd58c38b8848d3fd905382bc2a40cee4d323c74fcad439afce9f8bd9293de764ed039c737e5ac0cf506f1939f22c3efe4c66f9cb2558f0c3e85084cfa7a8fa3560f8d86d7f8a9230a50e66d1a88f85d0dba673ad8feeb0fad9b798b496ff88d3ad9e422094c093471698332d5353ec83084bfe9c107ec37b2b3e8f31ff2ada665c5ca135c4e4093d2b7546f4fb5fbb3f5bbd6240b1f06f6f654c30ede9103815f69cbc5318de3d396c0e67cfa89b3a2b5d656742792cfdfe104844915c9be90802c55c239696776462c9606663efb07095a9d54a711ab54fb39c93c460b23768083f494c48f5ffe5940ff860334367358bf273ff9fa3de8bd6afe52ffe3d685d90714b7736e11ce58a49f666217fa5a3c8a90a0a0dadc1d902e902793d25c50e23c52a4c6743178ccddd231f348bb3e2d3346212c321a762bdb2b24b265096a448a2ad72e3043801e4354734744fd91934fd43c0c7e8d64e9272bc4dbfa7234688709e92b20ac76d57b72a4ce9b45e71746a75bc23e897c40691e9261212b31d6a98c353dd3f0cf7afcd93109ca08c111ae5bfaddf0b31eca377017f277a90517680e45e6a8a4fc873de4b2794fca921aed5eb3c0138eeeff08dccff04c500093491cb5a64d2d7072b511b3bd9b1fecbb9a2bf10935714f57539114fb3dd4c6d2d333ff0d001eddd6090c9f174a6d335c2b304d29c4fec25bbe49a163ca8bca6e8cf07c8b8fed97298021df36cc2708751728129250abea849f72dfda51097dcedcbec8923b1e3ed5e0fe1e9c9ef1ceaee4600be356fd2a6a7d893acf8fc2736c591b6dc1a025377371fdb7a9414208622974738d4666f465ef194ca3d53b2ddf7872d68a4d97037ad9ad44fd418c48274ce20400ad7deb0f5a9f7ff7aff81f90b1718d6c91e835647e9951091e550066d51517ee0aa680df46786f5b9e7dcb18aa841cd91b9d4fb8e72e364d3620c3c9389a2995dc75385e495075101f30a2dfba16ef60592ab4f089e89f3a377404a71dedd3a8a17e73f4c9a43be5b0b5596e66c68f92c92507a3fd54d66080c33588cb9c8086d806e64b4de02e2cd170314d370f77d0f9f0aa3bb80f9650b092e8f6e802dac11eb2e1ba4c90b6562ff5dce4b15e22ab4a223f202055397b35679169e9dd2cd7b41708da5c328f01fababedd5c3f3a92584e1909ece24a508dc5c16a4767f14b5687ce13e341f2b0e043598fae2f0a26a2b8da51741333612811fb70975fe28c64a9a40f884b9bd36f042f841daa2bc89816e58f3c84af3da2e0920540016b3b6ce12d25a1bbe4f9f581c353214d1a08c6dced2bcca2f8467cc637a0d818e5a8ddb2bbeec61f6885225097655f645f67ad6f33bf9afab90c14175ecbc5f2fc7545b2f2d36bf2911563d52e333e9c5655ca626ba33de86bff177879fea02c1a213356446c19b1e91b38a3fa553561b9539c4af77f1c188bbfe54e1bb1ed20c92d0511332145e9eb172f317e43da30d2f1918d69bbbbf7929f0c2cb67e137d74095978318b77171199a5f24c77a3a64db058ae34e194020b4d0a88ccbba99ec5469effe21333a5f7033b8ac779181e74003021db794ac4602a5ed6d10316011755541ca750f23305e46e5f81c0ae260071e68ceffb36cb3bb777bb65ecef40f4b5f75303bd393ab8dd9ce50dd6ec395d75ba43c4dffe62f884e39afdc1abdad7f9273789c08f299a2f75bfbe2448e5059c49eafcaff838211330f9fb39c24b5b9f323eabf35a7c248a574435414aa5735603f719e3bab73fd2de5d00adc8feda08c6dcecde21cee25ed016e5b677f7212376dc9f03bc7ccf445a3880a63671fdd643a6bed97b8e5e1d6eac51ec3756b985211fee8883d53a0823210dbb815111883700a48dde36e25681790c6b3f40970b81459b0a977d1a6ec78b0a464ff8cf8f2f9f3053b055399ac70177abc641342715c226d26db0db18b5eaf8eed8f5725b8bb6e4d3a865ae4a9dea163682d52b586d3a14a88d3d16768cc57c0dd2c3c48dda0c34860cf4cae684778a83eb78e72fe601d6d55c6e3708aabee62bb3d01096a8f391d3846f0a1ef95e273c66b8e21e1eae0fe181c0c75f9e1bd9e102c6f0f666f19f54754106348ae28e989af1c69385b3026563c141ebe580c9a63604e03d92aabf71761729c7b7c92340eecfef20a9a560c9990c312e0f6237e3c41668ccba7374c2fd6dff58ee5677cdd8bfd655f8f9ada687fe1fa67a5497323377e5345ce051b17191f158bd3f1e87ff2e16a3f2243b54c71357d5c4cc7a1a1aa60ff4e875d8d5894faa6792d76a17b8b72a8b33b9bc7ccce8844c6d3e52f3d02d239efba86ca79ae384d61db3fcf59bd78c8c2c2e83870ffa2f6ad21eb4580a79da92f4fc9f902cea0b44ac49498a2efba71759f7330c06a4b3c1920210df10289f6162e6e427b5efc833cd2bc27dd8b014cd3ba84d645784bbe13b7cfac18795dc9ac40bdce6dc5126240ec01a292f81501e4fb625286916923a2ce3c4d7d75e3c9fa6bfdc5606baaf75cfaa9324a9ebe37b04b57cd0b1e6e14cf4eb116a95fe19f0798784fdab88eed9ae5fdfe8be5c4964090a96f5d852338a11d762f239d20f2dbb07492651485ea0293452fe035eec89bb4a15f03304d382024d3c17399686b7f993ab988e756969bedc9eccef60572c99d87c68585b7bb544b10f422b980b2fa3d12eacc99ca9b6ddbd05edf90d23fd335a3cb6cee286a467b74efb767326e5482434db792a99e8046a4ac9a6b1ad4c0623c973fd267edfd9a48dbba0a44479652170cd33abb4add148bff87efa8dc980e9c5186993deb8191d4dfb3097fe7c794d44ca8fac7448b2fce7f2f8543fd63200922caaa720cdb4960242bceabf3ef30c338bc389737927db5531993b2df2a80cc32916fcef912a934d2aac09016160d2cf59a5df1c9fbe887a4cd83be2bf5162da8664f195a2e989810b647f5f6451557aec7d29ea2cd578e99d4bb2f89caca73acceb21ad63800d306d9cba43b842f8b89ccfe666b10b1105bb5a5cda0b384e86853009a1637c82edd9ab4638ed94312ae324810cccce05611f8a75f19b72cd2017ca261c233d8f1bd816bfb974e3a3246811a666c0acba8e4262baf9bdeaa7aa2d1fe3781341864cd175634fdeafa34793fdb2ef4d25a4dfcc69883cf31e62871db7de4fb4370ce36e3ded568b56c606ef6f2310b2a758f806056a45db7c8249621872fd967c8791f6e6ba882b878fd4e2dc9375a1c04b4997dcddaec7939b53a2c85e1c3a908abb13e6673f0fa0755406dc70889afef056ea465ec247d1f248582ddc2600f18ad14dd35ff5d83ffae6d3d546b3feb1eca285d86a4afcd64ba9eadf99a59a4e0c76fd342146f5c4a51fd25d82924d97a4bee3098c83271eebcae353f31556d4840eaa6f479ce8cce8617adbb0ae180e9cfe9a60321586fa775dca0194ffd743962afe0b2f8231b7594e35e66d61ee954a040462f77c6d1752c5178eebbf9c09973e308e657161225c58abf3f55821aa4041c988492279f42283444263ef05952bcb1a7f75f4e78c85f3459af4fb61dbf44a5256b3921dff5b2ae8d29a08b484a853f444dd8745545ab08b21f8b62fa8fa802744a365c9b7612e7da5ea971946b16b567508a2fb284f12f54f5d22db7fb775c0e8a4f81daad9006b32f204a459bb63c99683d28966d79d1c79becbf5eeafbda79944d38a5827434a003cfc064c4aefc60fdb80709e88a149177a1c1f6467aa53fcff72803dd05982a437c79f7cd471c4777c47313dd6d233cf3b9db88f63de4e7a217fafca68c5bd855f01d099ec6c4d33e2914bd346b245075fbb41be28cc0fa77735698c551a433a2f3559f1f761e8ebaaf930ed5ca40536730f5b7f2af61ffb5d5e2e0229c9cc2924dc9c3389e4fff531d980fa8d29ecf302045640eedee7ec30349dba5b56a0d8ec5207cd18582ae723dcac696cd674b38934d2b1e8f90000bc5319137e3389cfc2402d3d274dd247dd5d23d8501c250e751b5130add6e0cf4e5430bbe702bf8453219ce23b388e8deae577c5eb7d865a5212425ba1fb12ae629265023a26da8d2b70a78ac8aac82fb9002890a37d012dacd4268169d80e2495b82684fc226340a7b80d65641717b3e437b6e70c9d3dfee1bb8e4079f04bd8641015c29177d25544521f2071ffe5a0e8e693377b5095549d42ea1736c644203a4493398eb9b011adf95d3a86d7ca7d23a75de094299fb53c04ba8444dc9fa294b02f58684a853c30f8581227412ebf40f46790dbaac5975a6b800608a5b6b6000d5abda2bcba0b79e99055b79e9acdbd5850b6a6369f8154f1db1b16b411f1189695c7c282c725d5478663dc72875ef54d99d0a86f95f9d8420c41d37a49ea2af681053c3f4501ff8cbacafa5f8cb9854eb36d46a8316730b6c408e38ab6e7d3a77cf49444bc3645439df985a81383e9c62deb05930a601aca72debb47f1908f240a245f25852952e6b08e22fea4349f5e79d86992896ad317a931cf44727ad9f6b9030174485184f082f746c5c752127227c3e73926ee1608c7b08402c1ed308a0a2f0f936e4567fb95a3659fe542efaba82c12f96b7040386ec99e05688e1f686df6ee057f8b7852693103df96ad93658b8f5155ef87ee00fefb61becec4131c54f9216cf48a42bf6e1ea62743f88a2a324c36d0fb9b6c0d08b473a17d35a8106fa45e2c55c8337d24dac0e9859a40744d0137ed483166a70c83585fec494aef1e96d8b61bdbd7261dd3e8a8d42962de2c4ce91d3dc05a898ae6644ca47577f2d23f35acdf2bba44c9b881e7a82c5dc2607daee344feb40f046c3bfa2e40bbd63b0c0972e83e4953a8f7311879f98dcb7a021dd206131fb1f97343eaf2418303a99bb8aaff99f0cd4c0e5adde2379f43f9a8aa6bf9c3da1cea9a208188ee7a05be5cb7a75db56d3c236c738a496cfee63fafc90388778faa485f36606abded56d9cdab1abb170b0abf902fb047e0190cdca61e4b4aa4acd4a3211a0a101669619c7cf757704556c37127c3e246579a32512a0eb5a8e1ce467b8e2fe101ae8ad076c910f015a6ccf0f881f492cd29eee12d8a1ea53ba5405a42050c77c7ecae0de960ac7723e1fa0db63d263454ed83b3d264c2cc6b65cf9a97142450cb376f8464a21e4f235d5a942ab7cd597608f504e0389f8dc0b9a881db39fbee94352bde992beb0a8c9f7b0ed6907e849902bf6ec784095bc407879a9ef517b3ab6c8f66c75c971bd81eb7e84a55ae1836614f5bf8b594c90dd5c96f42c3fc428923e6d7afc2b7059e51adbae655d0b6f6bb3157046bc657d6bb0a5a77251e1db611ee8b92dcaf5a27eec8e13b3f8ad32266e1ea7b15128ad71db6f69c96f197aaacf30d1128f47c3d3ca615c96130ef71faed70bd301dc487745bce33a81b52ef6b90d6bb362b0e26d1a1a31179677e4dfdc0945b4b2cb75055654bccc6ffd1ecc44462f162c7628d24582393c693021ed5e7cfd5c4d3b5da476fe9d88213973b4d8a5c445d3e2bc8cb4611d0f7581d7d19ef8dad4bb7528db0d842e7480b15436ddf0d348413cc623ce7f8598a0b22e1402458423e2c1fd3383ac169b72adeadbbbf003255ccc701dfaa317ded30a4d3df42aa451ac660433403ffe02e0745c2ada6dfde60ed9e004a2977ee9f7d25dd4db71e26700ae6763ac048db3b34fd3aca32f68933ead3e5f2d2160c1f25385621fe0e56cc5df4b4b30c56cb5d18677e77cfded32d48eb3b7030a666faed2ee6e27405668e542da743248421024616f65cea034cdb7c567938c1937fa119abf805d58dc63471f3c651c56b8cc9327e4ae02e1e46bd19a817b2f187c6a05f2212028f22066d3be99a654b776f20522fd487e86a515095429f757cddcc771213cd7f0d4c978716618c04433238a6498e3bdac5721d2473d89906902001a3c70372c1ec780a20961e13a5292679a97d2bd95f31efdaa739bc6cdce7d8f6b50273ba81893edeb83f51d9ce89bec2c8618b456baa1e4a576b70b37ee0732c0948e6fd14700b75bc76bf46f6d17574719b2f08a6ba97ccc36d97e5431679123f0ecfc3213d687fabe0b8d3949cf53f438e798b86dfe6d269c4947af0067539b4c8b0950e5dc04d14e1c1185e388863acb00d569286860bb904e8fcdc1cd203090b1bfb523dbd7e760e8a7d8a50d9821ba45ce2404affd94fb317e38de62a2eba5a746e8379ca744ddb578bcf62532b1edfeac71699aebb8c33b3b77bdee7ed371b5c57187e41df1abccacb83e97fcf34c7396d8bff3d32fd2b1ef12c8395ff1dd2264d97d7ee1f5b4756a55e62c9deec0ecb5e26e805c020edec191650aeb4bd1384da67f319a58def7da1954acbeaa2fb03016de0a2f386109da7dfe2acaec363da563f7c4f023139c258ef1df0630830830fd7758f3d9b279615efa62a5d9f27a97954c008d5d3aaa733c258c1e87a23cdd1da23451eee8777fbac178241bef3748c6e6ad160e3b6aebaa597dadb776945e01c564f17eed4b5c1bbb34eebb13bce37d2d93363efe24b660f3785cc9e557dc2e4ab17a91a83d1f085060acc148508e43897993f66a20fbe65d46d3c4d9cf7e2e97e3952f0195f10ae8c20533753c719f6228d53d69a5e3c5fdafb9b039426d8716c2e961e09af9a8eb24a21b82c9b6192069a51ce3fc96843d7ab696edf9d0c42d151f2e2d95606ac14c2a80563c82392b02ab9abe6e3bab8471747ddc3cd06a46a6de9fd0ce4dd8d202466bdbe00088ebbb8ebfe341fbc2395a986df0539503c83bcfbbb28de97b86109ee3f8fc558dc95ef6933abdfd52c6fecd6e108546171b9d998ab91a5bda463dd9f095d7acd02bb18d1fab2c6ae29225b989241b0c2ca794e514cebccc7d7850a09a9bba2bda7a7ef86a1fd469fb059604c5155d0eccd3e85b62dabd64ed86129aeaf0edfa321f8be27c7cff2324871b572bc993757e0960a27bc3634ab1d64b70e77db8426080a0f15eacf3bfe5807a5ac1290568cbb1c5636773f7a751d2c2c99a2a632bed0787cd1795f866c6587cb4911dfb103931df452fd0c0a256e0414e09e035dc601b07 -MD = 9dbd0cc2c35ddf97c3940ed706ff7a2cee1169ff64661db7d1a805619422eff4bcd7b3df0703cb8fd3fd060822dff322 - -Len = 85768 -Msg = 4cfd1111482e4e23f8ad5c96049aabaef464b87ddde2d79f409f2f282f7506dbb15d3f9d6885202971a359048c8a42b47dfa652db2bd3c8c25ef3c07849e122490932c2ac36e7bd535f9774ec0b6645a62bad4d2e4be6e53b974ed3629176cc3af46e0a19f12e6910b56bf5de847980a6d4b0f55bc0ff45ec4d34c9e66099c1ed61f64eb4599e9c5bd6237174c64672c64561e9f82d556130eb76125829c2a9fcfc5bfeefd2a0cd711c6e96533365826108207977e3b1ddc5ec633b4c7f79fad61e2f9940eedd830d02add30e7e4f3613978d424f766d0207ea8ca347b4383af531b1bc4c20bd438c2351a5eae97c045a7e08d303781f74634062e8be7a75c0f6e1a2b665fac8957ae90a8d8d177483b216138a284b21ab8498868a3534cb4347a8734612ef77df65de38f8797ab12a971a3df622721c2dd85d57e62075912863f093b9f77153a7b98d5d7524a5ca6f85d4f895768f8761daf967bb24af7ff6d84494a07822e4850250e892030b18d91ae0d3f6b8e5cbfe09172647a664e025113ef688196692ddbcc37addb93d34eda2b840885e377248ef11243a2a185a39ab2a29ef5fcee738657f8496ab9e9713d9e5dec8dad712d8f981d1f1144c56ab02a0af34bfde6a1b88cf867b5eb1c7f21cd3ff36c3572624c4e3c01b19635e0fc42d06f6bdf7940d835e00ea47094ffee82d32608c3a14c2bda17f069e1fe8ce4c49c1a3eeaced7501857471f9278790b83c18c4a9e2672950655f4216b47f6d17615fdaa680eee87fe06190e97f075e298b02d1a102a5cf3989f15c17e39a72c22e41f989f600ee5ae948c59c8267cda8b4812615fd593ab599c5c3260fc265b8eb188f1d8edbdd2f2aaa8e86d3f155b23324205d44e9e2711f5d05a59b7fbc88323419b5bdc86b690f076a3ce66c9cd2716c5f0b7be05cd88517a22b392afd9c8e251807056eef9510dfd7332c11f99609ba408504c510785596072b4b6c9f82797c0875f837f03fdaa453ee3789f25966ae637e621093cd2b58c33a64bd18c66ea97976f8ac03d5c6e57ee27b4d1da902b9364c364b5d3350c064bcf7850fd4e82dd9aea94390d35023a69479d3e201885b4772d3ede367706d4a47866cdb2a7089a7716c873dc520df6998a5a6d60f42050576dd70bcc604c0025e83dd0153923d6163c4ff513793894643a14e600eda56feecb56c4fdb78692b56924e18dcb7c9a5fa3504718732b1bb49df2326acbbc19238ee39131465c903e4143898227baed3a95f4f255088d9370fd1dd804560c57de00a8fbd0d37404a7b9c34f5c1386d88f58637d30ff070580a0bc6038563e300767ca89422779f5d819ccbc845888624635c47013224078cccff8536d92f9ad870c74c4f00a116cb8a9855760be679347743f546537e1f43bd1f9380ad3e6d54437cc324043e47031b117a8590ccc737a5dfeb08e079181b7f0e69779e1adb02730fa5d9b9c9b092a78aa37d80c5e0bc738260cf65af9282872e7f92184f546183e27cd6adbde3f8c47648d4384c662174ce2f005f8c0f074a026e46a8466a000aa7b0813c9541b3d667031033dab8050e258e523a88fe284c2c8e3bca8a9c5c5bd1d98002ea6a4261df4ab81ffb66e5c42b072b8330e044020f87b7fb966bd51bc360597d27ce32fb4198424918f3321b413202c62e4609001dc361b8044918af2edd5427c7cde4172064353bdddd78980a976e7fbbafe5daf9c9bf9c2ec485aa66b9268f6519f42a0e470784948637bed99fc51c637e48d7061327f4a06eaa81fd7c37006a12e1c86da93fafe7adede440c3ad28d041c0a8d538416df39805ba65af1c4751591b56c113541a418509cce29b9d316c8aeba4e991826482d105d831ca3cb0a54d2f79ab0ddb503cdc29cd01900ba2a2ca087fa5c76184e8ba595fe4461ed8f07f9c857e014bee23e3ac6950397f191d8fc58dbc32752b9fb44eb5ffbb492cad50c12edc961c40b16c302641007de1373ca1437f7b23e5124f747ed682222856715bca2924c2f44fb62388467d7eb78a510a5571f9f43ddafc591f1b4350586641baebf645d67569621503e328f7f8718d8f2836477c82743b7b1b30675a4967527d08b661dd4098e0732da96b801097129e302eec137f589d3907b8769657c42400a50c113de248b1cc7a0bdd9dbc75b0c601ee405f710292314915e99b102726e44549cc8ee713769f5d7cf7a74867c87511d6ecc7040caaf263cb58df1eeadb966e120c26ab637f5a5c9f32334117ca59e48b69c0a4c147dafc6b1ce8b099d2a583d748bbcbc36c9c0bc525d832f046b30e7e1002dfeb19895757ce3e91be8c802b0c2ab4a4bdaeb2cf914afc9a7bce3ed421a7d411c4605c2923e5471ec369c4c842fa87e2bcb65d3c860a26e424b14bea0879dae6f7ecd1c641eaa8d4330ac1fffe50cbf23b23f9b705ebddac85a068b4b50e7dcbffef98d35456ca4e97d02616b0c5e74fc377f6e3b3888760190c23d899ee334d47191fc4bdb221da7c6a6fc0ecb27077e012f336f138ba8b4964fbaa3991a1c757d9b50f007546243b39ed6314beedf71b956d2551a4fd9ab13b5ece16813fd6cca217369f18bda85ebf4d91bb43b649d06fd3235725b72acb0fdba8a3456407f012a4c01c24eed3717b0ec162d97feca912b3d574637d980152e0be8246c4b77cabfc3ffa226031fded8f668de8815bf02e8da02bc6c78efe950c94161dc881bcce7c0aab89a8407e976e15af0981145003cf180fc81b6c0d46cdbde122e5d35b0aa2b4c2d32d8b5e09194348b4f5a2433306b172ffefabd8088290760eb348b1d10ec2b287668f16932f73ed634582444cb2e107d6caeac92af9b03739a74e7bc22ec8fd2ef9a852f60f2c0facf740cdb1623b30d513956b5e6191c72c3850f35e711c25324d737d8236d011fa814a69f173247083803838f378b9885efcfcb2f67440bd29d88d10d83504a6b48a2b839d8441695a674fac8a9d9c0d6a4bae553ab6eb177e31319758983e30936840b50613f66dd25f4850944ebdc8a6dae2348ba75fd6c7de2d8b93cee141ffa24678db80d80083cebeafa11a934cccf134fb69d4337d6f35bd580a57a25d61de89498e794ac3d74c1f24217fc0fc254512f475abea7e0cee8da73ca0d5d55263a5918f6be31a453de65895fcab79483d08ca1fbd094af95f0ad3ab59005c59d817fb6eb71596663aa0b79effd726be4f82d6c8760486ed0db177c6eec654d0a24cf19d0976aab2c8eacb8d17b896f0032dc51075509430810e0e1fb07c516f68d0ee9ac17ad9a35f00fee0d2e44c75ee45ff782992056c3f9d01366cb6d47e92307d088d96a5c0639fdc4a9fcea9c87787f080013d5d08cfdafb7b71fa409694e81746bc5e91827d23ee1afcfc515015404298aab6fd9e8844478f4eab4840076437d5dc371f721219aef268e1b5b56e2b6042649389861f658fb2716e3df3503169467bb4b217a90d993172135950d885d41dfd576367ebcb3eb578a7a43905dc2618f95c0bdbd86c277896f5becafb0c088ba3772dbc73c1dee8d2ec0d79aed0f8bdf3916f46f6b1e438462d488c3c1a87fc15874adc5df5eacd0eaffc4da19c5bb5f8f95ed1aa6b59f11e1ea90d123ddd1fb1ec3d7ff0d3dcf28a67d31d94aab98168087d145a14f3136d5e32c623d27247072a97ffe2f84fc9d4a84471de98acb0cf232c779c3b4a4fd240886fd794e21293d6cce48abf9dd38be5a2d305c2afb49cee0f83d74ab9e6eb7a1c32a3e196f2d6555eb67eb651a00ea470c9a0d53d1d6fdd78b191cfec79076f60e71f551b684d4acfee3558f5bfeb7950ce162cdf4ba665fa9952373c96b494e8d5b04bea03770b93142534147380b8a548fc55f0efdf0c27a3af2d3490719f3686fd428d34d23c3aa0e4c4186b8d0700d2b9dd3c4a88546258fefe5f26dcc2bc835cd57f7ced31491cea858c186ec8d5e3e52efc0c10c35d31d837369a44c3fd5365713b5c36af20f0bce4ea0a8492a704f4c7caa536cd5ab6a164359b47f77b6f9db23b533cfa64c4c28ebca28cd8e6be6f24129638f6fd600111f68a64f1a9407bf509e26ea786f191df7e80d6203768cae08e6fb5c4a7b67dacd3e81a37296e66d6218a4a3afa0fa1539a160efcfb9c7e7978922bbb0c325db15844d62c5e5204b21cdb6e2950978787a9e285b3b5d2206b7b9e194e7d6c47bc1e212765ca83dc35462638f70cf1aaf82866d908f8a2271301e3fcf38dbcc2197ffd9c67f08c33cc582b492891d69201902387513675191ca614455ebfac3376184a93a752d3c1e3ad3afd32819ec3407ba90f20f1d36ce4d2af80c485d3324e5188bba883e2fd07cfd5e3b95eb2b5313557defcad35991802064dd9729a350ec64862efe6325bc53a9c9b017bcaee6077c07548db243402cec8fb01f899c233d10a27e20c6a549867ff71bf7b4fe53a9d63709a0e27b451936816e29a3a505a2c3e793368c37dfdf26f0657efaa204c20c14f74b8a89060fa543fdfd9f465ee1255e5388e063e62447bc74f1b7225f19c5a604d6d3f6edd6e1dc47e3a60796c3df0ea75de8b2c61e8964329b1207ce78aaf61988e449603593543323e0711510990077ffccabe89595ef86c334d7b8a5620b1faae60ac9f663b4a804740b4390fa3aacb4b5d7b251126557b0441d856996eefc8400c28fdff80390cf8a5d890aabc62cc5cbbc8d19a9ce8fab6b5e9c8ceea59a5e5bf81ab9fb49d2cd4cf04d4854ace17a35e4e2b6023315fcd12467d6113adf801e34d24b138e5643e04bf8109cf2b21a1cd717f1c49bd1eb9df64d0fa8b4b53172fe1f5fe9db047c6ef7f32b2ba286efa71b9690970fabc0f85db6fe5a1c03bb7fdf69bb2437c4bf1f7aa561aac3473fff3ac55b25968bc209e00a6cd079b1646c5e18286dab7e531a5e7579c15edc534bbc0e1c1338593af907b221b2d3a6756204946e6c3e1a81882acd3d177a2d73b427d8990cfdfd70ef5a14e5a733cc3588574555c8f8809191671473551f22e662058a9bb6ee5fac1462998057a00aee07e194a52ae198cb5c9cb1e42255a3f67cdd8eeab91268368fa6a9b96b2248e6062ae72539024b7612510e58272598e92a384b4ebe72fe5589aead598bc16e67aeb8a79e9e627fdcda0f92970c96e908969d298f6d140a532a030b295e8665b726153dd900091d43dd5ca56878b17e9be59490746d027576992c2dee8d78131e97c90f9b08000ef443c3af94137d3fea42a5e8c767442507ffb17973bf9f61e6295a87af5e4e383733c918e48602153cd359994e02e0044d831b597f9d04375503520cdca9fb8554d5f8491d7948e6dbc0370bd2e7e0f9924ef134d9cfae7eb54e3905e99110dc9252d7a80a93589c0d32c8a71abd4beb1c87bb724afca51c4c3195dc9fc094243ad2ee9e727d391d1b5192d3f02d2ac43557027a9accf2fb63d5f0f8c6db8f47947cc6941cdff3534d441ff81adf846b23e64cb691e99c014162d1c1268d0a2ce879e6f0d15f8f24ea34f77f617a61c82e5b248df6f8ab1830ffc19f867b0bbb7ef1d61b59a8147a3c48a0ce8da7cac3a0df0f6793a4282776d447faaf509ddc9d0b1f7e7c608a3c89a9a44f660dc544bf9997ac2e921a165c0aeb3a6ab2c5778fef48800230f9521a7e8b69b3555d33d5b243c5906d89cd2ac935c77d4a8d749ac6d988b2bf6aa337f0db833e26977828519b1881db7e332838ae0ab0bffcbb07b85b0055b6e41927271e07cd297dfb009f280ec984ff329e80dd69cdb91a351eec554fb3bc709b344adb5c290516a5a7c471102f1217b1d3c84a4d9ae2f0c8268b4fdd947a1512a4819bea1a636a5c64e7ff847c2acb9910397e1fe1df855d69bcd112c097db64c0f6e51968eb82097e3058d3787625d09dfb0045685be2dd2da86456febcca7ad0ce4151da4465953ec80666eb9e2c3fc2355829f8fc0d2ebb768f111891eb3c1c3437fa39171be6ecd791a49d4ae8cec7100f31586a103a5b4fdbabd4bd4592eb4e507c4d0bade6d0847ff456216266f3b3acc7524ef3e7545bcf8cfbe9e0658744133fdec9227b31f85ac0ddcba1ed8f46b752ac50bc1ff0c1f31c55bcc59b363f09acb4f8828f595ba96ffbf1ad4de3f3b93a2f1775c975aacfc4a9dffb1e4167b8299641d6098ed4f569783b8f6c37e039e6a34c25cd2c3deceac1f98ad4f0e3aa1f4e4c25d1198bc5151c504e34d335bfc0d096d5135da3d1f863b37ba78adc67f7a2c077cf42a9a1ddaed9f28bfe1bd32f7d9e8c825003065458b5d57e597975175b46d4eb50561128f87d845b02bafe9b740c52044c86146867a6a040a3e35ee94185450d8db99e5fc0e50b8b2539c76c7b872f809b54829a5a2fe5d7b141aad31b26d11d3ffbcfe8cfb88f03b0c0b70b5bb72cdf8394d854f8f7ab2acbbcdf3fb3d08103af432d2ced9f19abeb7954dedc4550074d6f9ffd08a7fa21387c8794cf2c5ca725ba3f93e142af6b1d8a294ec5d9a4e1400c5efc53e6daa442a8293a38e16af1e8888d8675485c2b8f1bbbc4e01a2e55a6949dbba15d549b2f684e99b698b3ca42d49f6b6f5a25d38a5594a6f3b1f84cc52ee4a1b9b36fee48e67d1910f9401879c6feab981f144b545f3b5dc7450aace703bc1665913486d5473e2210ab18c5d68831afb840307b35623852247f6a5f523aac826b9fa9491eb6191c7c5743b7a13fc0de9764814b778614ecd107224b4efc3d4e9484d8206a59976f1da4cad82216349ffc3410a461f2569298843a5a2571f5e0a8e9c9f303583f83bb3bb40ea133135cb157e46c3acf86ae3f9fb8731dc05fa16f7583ab2fdc9ac01ec3094365bee87c7c76058d4b442ca78fffa67d801200f9b1d10e2e370d2e8f0de5d15eb7e0386726397ceddc7ad1e5504c0b62948e625135a472666312865651491547dfc08d84774750763499fcd04a30f009a25d0c0fc497b73afa14277eb296dde625886e3d3649890e9dc836d044515c5af1a6869d2652e691463a9b70f8752f23d05d64f92de6309f5d2f064d0857573dcb925961237c07558dad6993eb8d15e62a69f62122c74c10bdf7f4af5cebea9a76490cc582bd206d1894194e5387961779d4ac1bde94e5490548885e09b51b593bf2272f0dbf3bc12f18330bf70aba9e06c60e5029f404327d494bc2d75cf46262b532098a275f3919614031a0bf8a631966a528ca8fafb36d23c4438d897d9d33bbb6bac2a095bd2096c828164d0d4efadcf80c8b0ef1b41cfd7c4af5e3bdf3f62c3baa7dd0e4358adf5157215e4c48f0518f623219cf1dd300f93dd513bc4af2304741835f5489a065652889974d3744edf393885753d6da54c586f6c0828c70ed64e79bf6eda1aa508b0215a21a053fd7ab08557184c77920688b2093189fb88e19048f3db865f0c84c4d8f27bb9826383f28610e6ad9f88c68b61a33856d1239ee0025dbbcbeb9f42e72bdcd36da4437385a73d70ef29ec24f6eae4ad1dcc6176c43267901924ffcbbd7673d95b1e0fd1d08557477fbb4e7a41aa27d05d61b4f1a3559be90cbf8097be5571fe00741b17699cd8caddd8226f024bf7627425a09813f8853704ffd43f504541a1dc3b07ccc75a4c7b97e50a5baf3cddd4207cc6f27c779dfa908a6d1b19d25d656cd7586a504a2cfa2c8668c8aef94595b0fb6a69637f50b44dc3adb371693fc920dd8f68cad8e4970a20b04e880db937c4163d956f5c47f48b5038b10d96634da6b21f406db31e02cf389355d0e6c33ac851a2eed6baee2bd7a4707c34c662535cf97aa9df3543adda5264670010de0f4c322cde5ff7bdcac134f77d8d95a78ab21833ed85ebdff8b9f2b5faac187425ae3c4dfc61bf2171c676304d7e70cd444492dd83f8435d83ec9e0aa92b6a202e9ce488c1626dd381560cad649dd42e2092fdda15bcd836dff0b8c4cb04925c8a66af6fb5f8802ea9fe5ce14b625c54a01bbdbc0b3a27165d54d78708ce0da3b9ba0155528a829d3c3dfb5e6a4265db334d66e5ed069c568c977ed3cafe58704cf59efc1faf01c9b8834c8759d48d1c5ab66e0a3388c4820e27131d8a0bef5cb4a7bca685cc7a2ebf7cd4fe928f3eb296d5477b67571c23228238c6de7d5ec3715efef72d695826b1692926ace8f718782897cc00f82fb49a37648230d9034f0379ea606f0c385c2ef6bd81e15842c86f3ec36e88c25ba0b5c50ac219959949fb86f374c33b773988a416b30883be4cfc764ef5776c4c9205a9bff901397d5eca149e96d26da1497edfa91c6ac1a610a06dbed3454c6ee31a53d8a9703b1bf7ef916059152942f65228093090b8a6adeb9387aa8af93f2e64620955ff2111afec8bdd3df3d4e8eaa31b9b9202cf4c9f3e763dcdb0e939ce6442a6710681eae1316269b80716ef70f208f4a3397be44f298435bf4f92eb6daa7454ad1eb404366ec39a59c765e333bf9e9906cd552a483d4c2411cf8cc0669785884ca05dfa09e51de385ad2840ad8c4aed1f16d16b04da4c7d47a94d5563cbe4a5e243d638e644efd9ee20f4a438b87c856eae77432f90f3b5e3754b16cfa810520071b35d560ea7e1d5db417a8fe4c1e6780ccd3f02e1e04257ac1c8104cc970129a28bb3d392d49fef34a52ffd91a984bdaa29ab495d80b726c61820cda9f737c06eb5e8e981f4689cb586511c3fa1e4c22f43344d645388c34bf48274b0af6a572ed868f24c95e050e66b7a665f298b07d470568986d74bdfc6080284813e1d607b49c09863277bce3fdb086670deec0152578ea8359a54be9ce94d878c11c57edca06c465627af473a4b878705009c41215f4914010b47f2590eaff841c90704bb72e886a6250f6e5e3374528c5cf049ca0e124779a8aa1d82eec65132c236949017a1d3d39df0a624295b5397329c7d94ca76ccf000df9293000d1cefabe891132544a85ef1177124a3a904862ff57f4a4ae31f14927ce411f900c5c8d4a19c8d123d8ea8dcd871c828f9e009b3afa132d5f3a857dbf6a488303df67edad6199674f90161afa80a972faa70625c0f95f71205132a5bd1365e2c10f9423d1a9aa7b4037ae9e82abe0a3e47205087b9cfff75a3ca0c70812c0c632678d369c3923955d985d224c50ea9cb6c8a34d522a1b4776c478ee8aaf82b6beaefa2ef8582d3e107ac9ac40b7eee5d67188fb2cedddeadab1621f2a31d33bcdab8214cc50f0fcc1a49a4746271507ae355d1af32b6b67f0cb0564d0e2dadcc727ceef0067935ad6df79f846ea8789a4dccab38e2ded461fda0ac46408c02114ea86c77be63eddb8f30ec928466bf3222d76cce53b8c10cea51848cfecac921cbc51a427151b0fcfa800c1d484e9ce8ff10a70e09c6f4c67f5d8f6f7d6c7b84765d78feb3b4f7783c6f7e833eb2ba153f02da4679ac0825192f2d8c50d391afeacc18fafa1059d3d149d472bc556f4d6f28872627ba43af4440df621db2940a75bb7ad5b90630a635b97e5a55895507fbfc3e1b98845fdb8d3d156f486bfb3ac3860f0d84e91455f6390cb8aee0e3bb81e85f95409cb520506e802245725fa730c65600c23b8d697f42effc0cde93fe9d976c31b465ec243a6f7029b96809d669e6d05e059004675d6198b313d4fe478b63f46f78624d4da7ba95c3f8bfb25ebb821e83c37901c5fd0fa76c38868b1ce7e888bce134810324da31afa7ebb196c202910090491e0bfac79c960f55b2e53f8f8988a33f0feb3e49044b3b6eb01509f2c852d092a1bfc303d8befcb51e36fee3877112f4527c60816e0527cb166fffdd350928e84547e25efc4585371598b26f0304d4f6e12d180ddf8be1835cee102c5781edac613ad52367d83d5e4170d6ac7c924da93473e158e93e1d2a0c45e76aa05bb3719e0f181bbbd5898d1a55f80654c801ade4f738fd1baa2f11acdde202c0050eba544b278268cbfe6618ce73073c0485575b1dab64d74e9bfca73c9c9f170c53f91c658001ef2a005bb530f44992e64d480f5d951abc99e82d93d8739a15d027b06ef4be14bf8e33e09823e827e9dbbdf28a4da2a92c1aa836fb38038e5cfeee72b45f3e356a570d970a2dbb4cb1537bd94454407ab65f30ab25e1c8e65cf73cb2952b9cee7022f1e1a3a50a0279fbfb8ee607fb19ebc625fcdc5c402c864786e279e0369a51508552fd2040f3b413c165b7df3f012cedfc9e671de5eb697e6194eaf3a7d39e8e4c5d6f25fc8af0594200525088bb0a4539126e8d468d96fa314c60fc7d24a83a9b73823c9952af3b01e14df264c1f45a400b4b40ce9d6f498a7b646103081ec41737decaa3c54127858b034b5f907b9bc5cb95cf0a8582ead1a46da7f5f862d9241ccd66a86d66ad415ffab1d5b120981ed5c69e66f0526cbb4a0557b26004e86694d68713b5803ad9f2cccc63ae63cddfdc662580485e3d8bee93f6b4f985504322a2a282381e6e93c5d1f185e2b5ab7d21ecfad30816dbd804c1eb9a0f54cf3e688a4f505fa1a7235bb2d7c8e8a6cf6b58d394dbba1cd6342ef7ccce2c03a3dcb925f41ab6aa72ed26d7d5894aa7984ee3b27a06d8c0ab14cfae00cdca028c9296de275db7a96075a9b971536358948c54f210e0eeb2c8ee596d3e1583e1d7f4a44b5f75ed2eee4176f041c3dd0a52a82f1afff65653ce457ebdcb31c412147753d6131fc19b7ac4f0f4bd47025d3126c4b5adb3ba3409ae82083eaf2523c09f1806d897cf8f9494ba3f4a499dc1de8cc82a90a584c4398e15d50eea01977ad07366169a816bda2535488f67e9d8b94eac125f484094ac68acccc28ee3dd91bff87c638461c0a9fae498e31e90f24ff0e2e540187825f0c2a927efea6676b3c219a225e1fb1e928a6ac8ebca0daf00f80f1c09a285e89520adaeed98e3e34f6b4980043fb7e612581a210016ba7f7ad8733f1253046d18073caa522706b3c3202a8e54fa22a7a7e88559d67141e42c26d1c6e0c68e13d7eab8a2a3f12958bd951f35beadb5e3c1c03edbc5661e6d83478d3bfb595d8d834fa43059a3c652ad1eaa1e97c6fc2b0e53a91f6361ca8c1edf1816c8a82d2a78aaa1dbf99b882200415d9186d27fdddc2746ad2700b0b06d3204dfdf1f678b469023fdfa64d9675581ac36e25c9b8cc9bfba0d86af7b8aed04c60fb54b87206b749d2ed28c24631b74088750c1d9a8359155a908da756c1cbbee1ee1a9167a55ec8fd7287e03c5d08d050b58aed4c0ce20bc08341e58e48abbff95cab49ff9a44c7e9f52a6f2001331242b508ff756f2025fc38ef7708495a95d0cf6fa8e3ec538dbdfe7b3799231f4e87fdec1cbeb2faaa3337fd266bcfbf888dcece76bba37164a215e1ff50cdb6cc4615a00ccfdf57e49009d5ba5fdfc2e259e2307a2ec88892c0c3c491ed06dfd3a8868a974ffd21193835ddfb8e834be95b91fd7de5617f603e8f8cb317d782add5d61485e7153f9256437fb19dc242e7bc669d4788793e164502a22e764688a0f490a59d3e2e999710bc22a337a58f22a3e678a0be15adfcfca26cc9b35ed7f52e39a4a8fd50176f8e272d9a02321be3399bf6502f3fb45a8cfa534e762458f4aa5b7b6fcb83a164f90c0a5ea673cc71a50c801e84fe3b771c8fc08366a2f3e4917d91b751d01fbc79f320b7cc708b1610c17cd3655b2a9cd5eb19322cdf910f0a284e4b363e79c03565d76d1c304118a2435437795c6911df95c72170e318bb3ee31af223d697b856e997473dbbd4c082196e12690ce01e61153319d9b7723154365d73c09f61ec0308c80ed8192e56d9cb342cdc70780b83f4c4e10f6285b975a97f97b4a1c0a36549d28a94533522cee20c4d7b92171f6fb9e143bbec3b9ac9c5e826a8e49a27a4341e831a6fd36b8ae5603cee79a6a34aecf405855e7a1e771101e84371d9bee75112c11178ef7b355c97c2dc2d0edf3f1564f014bf2c8ba81630a42e4f63b15629170b22737098f6cf19a7eeb7351b73bd99cc1117382a835ade24108622481b43962bf56a400bf5c74eb3cb1e059f116bfb61236e86433167742e921ffcca5b27f5e73164461c5bcc9ead1b6a65b23fa8f276f3cdfe1ed9c5588b5c21db81415e9e087e6a6a125064715f88a33c9e25fbe6d5283b8802a4faf4031594a6b3f26ff75686839437fb192f8fb8d274a9edec3f446bc10c39ba90af5d658045a999e26a98eeb7acd18572400653fff41cbc03658c64667209420ff063f6ee9fab5c405d98610e9a2915f70c8c0230a43fbdc9c075ba32a2bb64fd21db6de59e0063103a1c85914687d431fce96d6f6c5915c5b8c6162d84964ae4a98e756e29f2d7da68ed02479932eaa776e43bc334b4ef80b6491f6001e4194bf044b49028c7e0274fd3813979747ee1e3461435e496718020c47ed2ffebfcbb5ec4d25384c8a57d5795aa6dcf93b868acd7a2cb6448c34f6000da8b67f519bb5bd878bf233d4f67e8fd24ed84d8c1c3375f8a8f9c120e75dcc5dc94224898d34f464eddee6e056a6ad198c17e8bc17aeea67789753b7a78feda2cf4172ca28ba2d7fbb4cda2f01045daadefa7f4df1638730fc0d50d2ee22d0971b32deb5f6cbc53284ca92338e0e1e00c81e65b441e7c90fa3ca6ce533ad01853da4eccf6fd05827cae68370462a7ab5c7e2207181a24c3e105cec7100951d07c7061168fc6e62ca0e1f4277c1ffd0246ef4541829397d56c2437408ed617f9917d4d125450c5183bed333bca9e4cae72db3651aa103d8e42a0c780f4298a5b3d0afc086b220b0ff6db0fba1367fd78874add7fb9197eb50c8168d16b8a12bd261d553ffcc521d979b26fee820376252e452213d736c21471cf01791b8217e9f4c1400130bf6d3e6b7a3a1d3cf921800ed2ed542bf071711a9379c12b9801a550fba5942e9a5906743c5a906cd16550d0fc268bdecef395aed5baf1c45538bae2d56c411fdd4cf83dffb68f3814a95c1bc8b5001759b048d69bab510d4024f051567e502b11aedd6ecb3661c849576d984082fbff1711513aef34292fe12e0e4586c10979bde67dafa8c25045f8d64bee6b76c4be927c7a81d83dc051c0bcde686e1eb432695ea0a69f42a2d7aa8ebec65177a27b525a89545fae5f9c6638265f157d987d9e7d0efeb79ea0a5e5e78ec8fb6edf5fdd14475a8a6f4e385a08afd584c7fe83e2ab8e5df9be92d83449829b7044c191bd107c3c6369d54c24964170c1e22e6cc050ea6c6b8bc0971c1c64e8b8df91397ab8f0a1f2823c004d48a4d8d6b8705fbdd4e8d217eb710b27c8fa56dc2996819a736a323ea3ca7d5c889fb6ca300c8463a0513705c7ef5cdcb50d8ee3091a8fa7a8b4974fb5c8ebd9bdfbb2a6314904391aec453c0880b1c34b6437d566638b29c194772d9e7e724c4e807371a57107c7ab83a2c4946d3265f3c9fabb2aba9ea625d37ae14834383ea5f6a23373cab496bbdcf6a555fe094913027f9c3c67f0a83c394972993268372925e6f5839d342db3c1eae7327a5bf815d86d8084b2a8b66e8d8ce87bbf28bd42d5e8bebd31af14f9f82593122b53f85f136d6feae3ee592399ea4bd525a05a58cd509609d04cd4f74950b1df5716d35b7b26725641ec17c3230ca48eaafa95d3d6c5854fc033f4147e13478047cf106fd74190b015c77bb6f49afa90975bf61cb8ef94774a8dfcb75d155fdd43a43805f165d2e0a7aa0a64d43b56c234ed06993b77ca69b682754ab0ff00de92bdd2848f3b3ece3fbb4e368a97bf0cc8d84cb32605300d4c39e6343d78336b7e4366547a6adf632522ce92e0573d569d4451d24340cc4b54dbd7ddcd29ff6c4d5e7ddd7a9bba85a00812e19c23d888f9589b5f58d1a80c158fd0ad27ba6cc948359e865776d91dfa95a38c87a2998b253cb4c02e5fcc36d87e5a0c15d2826ab7f151b9d8a2431479f008f9697d87456919245f8d933eb3e5cffc625d194a37e2b91edec6c800506642c9920a5cab9f0c1771a33d15086984ab3f17c839cb1910b68e5be98f19bb09b26fbe31e50b81585d25f3058c3242fd3aaa931ed70df68b10289909a0953ca96981e4a8c3b1d49314c7b9aea1c22597a3c53e279e19b899ee7400eea27cba8f8e876e359ca57e0663e05c01fbc2f99b0f1881aa33f6458378fbf95f3ed61f044a09c3a119ed69f973f744c34339a851a52cc27141ac8791d844ea261cac524ec5904bb3e1937bb36b94d9bf203019018e886a426e44640a33d83c09e3053bb526a36e359d9f9e7e744082bc3bae34f3f1b4e2e662c5c638b43d58d13ceac28396cb94edf417b9a0b681aa813bbbe16ff7399125c637946180fda446ce62cffe3c8f25a58f05b46258e2b6d7c95f08bcc89edec642a3b6cec2a08a2f42754a70417789231570770c83e80f868da391238b6b33937d1013c7a0ac71553f2b1b1fcc0b28302f61e9e65e1d1d562e8e64ec6929f7522086959342abc1816e8d2a5406d46b9385dff4381208480f55296a5f895f91ccd20d237cd124e17976a25f561659b816bef27f49c631f978a97b89c314956bc93caea5c875a03b050173a36f2522787f82a27362a321965ad38caa623153ec11067004c055a636efb406dce55bb814977bf8b6cbd15f897d7a64b68209227c6bd75c26ac9abe3afe3965f401dfa2f2264ffb31cc777338a9470c936cc38983a05778f4d46b70aff93898d10bda687cf4a6b4ccadbde60da6e18b2b68881169792fce567ff145fea958a55d4b739319c8292970b5cc3f6e3bf2e964bd804097bb076635f754c48dd642967e08d3aa306b7f64032dcc06c5321f2e28b5d2a1733186467782bb76c5479e731e8c21352ba6516d6e5de5c4795112635e96a7b966a2557806694ee10ec61342241d86bd713f474a9a8d3dfff2617390eea92612d9d51c04c8f4378fd119490d78042ac96afe08056e05ff429829e9bbbf367833329382f0a76a9b087409e9db028934e17ead3da6d10c5112d3731deebb85c4a4dba42f468a15a5d2615e9bb5aaf3cd8d15128d33adec5bf90b05b730c9dd33ee3ad0cc0e583b7a77fee006a2588c1c5697f7a1b6e9eb467ea8a85e8ad188ed98b9df014efb25457fb557d3aaf49a4ac36c2220366d523a2a1224ba02bccc192abe9875105a1b2c70ed8aa9d566667e5dfc5bb3bc21695e83b141 -MD = 87703bdb80194b39bcd2c71c2347bf71962fef9d9b77f637f798115dad973d0642c50ab15ad7bcd9e5452c4990376ff8 - -Len = 86560 -Msg = 90b569513f77fb5833b71e852c8ca03c8e182a5757b0cd6d533cde5493e104e41bde8ffedbb40bcde18a154ccccf6e0984214e28286efbaa485999f055df447a553a5cf5db05207537a27fffead92a4a5dc1eec6d2e441de9a9e1b7a88c607c9a790793d28b262d79ec602a46ef0fd8880c0b23a3b5ac890b1d409fd16df745877aa8ddea803f87b7fc046453f5d0f4957e6418b4d17b748f5c30e7ee672b4af2e4e41e145400be94056f4e94768871849fb44c1ee65378fce32d007e0c7ee5635453d4de6b0c2aa4b51b4996d588e7abec662e5088a70eba4eaf79fec254bd6f257282a739c464506782d5c99774bf91e1044fe82cf89e7dfb42c4ff2d6f3b5cf4bab81d34cbe42db95083ab30be71cd2a19114447cab08e756171eda200d7e33eb6d59f008532a316eec3ba45d896b4041f23036d9fdd824985f148c4cc1b686fd17bab1182d836fcd826852b55a6fd1b80f58402ea8deff44ac39f1a139e72f4a50acfec373d8ff7872c8a65b82afedcd8f974ac2d3a2de20a896ef699a98989ac138bf534eae48376363889628b4fd4a1bf23cdea7ad2af6f9326fea0f5228b51165dc0ee58fb2d4fe42e1af740467f55a73feca4c864c8c47155a6ebd9c4762e93c3e3d6102a515ea6c97ee8f299596f52178cee9b5aaaa3b48963bcffe5d6bf1c3cb27e99089c4cfe9949ba1abedf793049332a6c3ae1a7cd20d996b00d296d0046c16a6bfc6a757c2befed110d9dfdd25353dac37bfa3b3bba5d2ba2b0fac2f070a50bf1ac48728feff5f48e2c0157a8b47382399440c880c482de3067a74b5d28b1e5d26ec2beaa53e052ea80a62133eb26b3372a71ea2ccddf10e1a7cb80b6fd9c8a86da45d46c06339aaeb1e8e50475c1e02484fa1aa034c6765ed7e3ed8e6da96c77655e3e3565543e4326661d8ad2f99bba6a45d47b97dd70d09e6cfc53d78d0e3c968866b6ffe6b050549a35478122384110e1922f7578831f61d337a7e99bd23ef430e831345f935ec2f1b6bb1ec068513f59fe3c4c4c4f73a8c329eb127a6b06f5043d54b12349b708092c65fa788e833c1b53129acd1875f9a94d9dc09d3b1d1f6ed091e4d656018a5d00d8a2af2d2fada24b42df5f80aedae20d509278c4f9e9cd3c795dfd4ab6d049de73a5d8c6deea9b315d88881a86a329f373f6919b25dacbeb6b7aec9a5f606c1fc78289de199942cfc324db488608ddaaa87b7c101968d767e8ca38c763b1303f54b736f5683045510442cd9d3562796d4e8f9ce65d1a7c3c81ca66445c4942c7abc2648f33262f8fa150e37b0d5689e5d6a17860597626d3c70a09b3a1aef0432d22971e03014db62add9174864b8b9ee15f9320a6f263b818f77777fc48e53c6956432460584c7ee1577c1c38b7fae2ff288199be25bf640811541394ad7e1dd0dc0d24d3718834954ce7d48d22546c708aa85e1776966204f6040933534762043239b1c503ad91972c893ffc212495f5f48bc03b6b853ca0042beb30b0cd9373e77d3dcd8518f07784c4a11e2ae7f9e004b072a27b085e59ca201c157c7d3c906a2c3b455c56eba6d41eca6ba62af2df299ae7e53bac31a2c6752e69ecc2c7ea48eb3cd51fd3edb5991bfe5d394a3b33d1cf926c13cd711b67bf9496a85ac001f21ea4e5363c71145230cf7b4ae21d9eaba304bf9a0877145c53e1442591af47f45b260e45ed00538df1a04e516f247005d9a14844c9ce2de2d696cafb04005cde1512b8b56235e3aad3333ef36dea487ec80aae9aade0e8b9bc17b38f3e4d910dc10d6d0b386c553759dac5974ac98884f2a34b020149a53f78f696588cf185020378a3bdec2e28c1fa198ab3a26cd096ee0db621808313f291b5ebed8c96b95940e6e553d9f5cec93871f6eef12e81531eac786f98079551aad81cc4b9a7ae820ddaba539e4dc7bba976829fa3994b1808f1fa42b451a9fb08dfa164a09ec50aceb68b33b5b09427a199c64c56377e743190c44161fbd25d403f2243bdf69d62081ce08a9ca8c48bc54e2a8b75739be62ceb5ef22d50aee6f56917f87e49b8164e7052becfa0c966991637b38df833fc5f7432cb731a80267cffeae97e02759616534a46db3323267184668b0c1fd7054dbdd843df94069a6b66239d29bb866fd4383fc93bca626a031b4f487c64e5bf8c4ac7e1cf6792b1253e4a99fdcf4b121c81bbac5df0f7afa24d5a926b61e0897f8d7a2bcf0fc5195edad85686d8341b63d24666de215345f38d00ef359177d1ac0877885af70e316cde45594140e1ea2eac589f28e615eb6b6ceab5777dfc46a64e489e0fa7ee77c3cb2a28b9a3d51cf1727aabcab9bffe7e6f609bbd71ee56d2c155c339ace67b1803ff2b4c7b7e1230c725133016b20d91071af85427de60d604379e758076a9ce1b2d0796225d68810cd06bf5777c8767c66251f80a3d13147956965fad1f925a933c141352e39e56d6052c8776affa572fef4ef593aadc12a34b31448d61b341eec4f75067b11216954bcb627eacd4e3961a35f95e783a45147df5b0cbbd8b18a02017b9eb366264dd1cdf1309f3b591ab6bad5fb545ac404f776a40c2b388433a05fbcc57f40db61fe0be15a3350af5d25c2bb54293a088b6cff5611cc449662ecf2a04287a828ec0400ee6c4b15364ad84278680d2c582dcd02d8e34603cd5e0e4190df72a5f5380b3481309290d728f4c274ffa9369c344207944a427e12712fd5f262e9402a8b3a2e006cadcb7b41a4ca17e1a563bce6f597f10e68bb4ee177342f949380b02eb976d5e947ce08db0ee3c9d5a8b8a18c0b3957f65fc467f70de8b03d196d6d69b194666f069f683f5a94f2a55a3f316daf762eccd0a147fb1a79dc25220f4a834a101dc6924881b5b166fa1765ff55d307d5df566258d435c56d1a13576f2fc6ab7361b594d13d843be049f46e00f6043bded05dbef3f8ec374ed4d15f940578fd459905b44082f61f8a4703204bfa4974196aa88b79996a97a37125e486b2e2670c2f7e999f3a5186ec5d0e20e74beada0f150172f3a1f50ef559d88b4e204c12528ae8ecf54cde978ff1db19dccf2f94473a2e1b68f7d6c4cbf3b2fef335fd259e120b544ba0e57bfa6d34b1337060cb493ff82de08355e0ada97ae57ddb3fc9792faf7aa81eae59b537df90f314c4a69e8e2751642db98b23e2fae7f5f958266a499b0514ae805a49b9a45f24a5a44ecd8d832efadd4cecb607f8ad62779163f9c8989e9838a5a63d594dc6ce0a48ea5ea6d36dad7b542ced7e3ddfcc3c32a9ae146eed3aa463641981a06cfa2bf8a3da40e1b582ef1a7251b091243b32831f1295e59904da03bc669867fab0f0fca1c8c273af8321e6e76905bb24b840cceeacb4c44bfec2ccd7aa066817f6419b0bb0965202b7fa00b2bde685884a4e543d04d7d5aa2f4508dd70326c6cd6061f091a2346572660affdd5b9b5f8fa456435a368de5f9f49fdf63d863aa15727cec58fd11756d93c3ced3ae7141bcf0b44fe10cda81156b7f5489b699c5d818cf16496088ca6d777efac73d96a9ad1893cbfd370fb695d7836fe114358485d1ecf11b8306ef028f7106208f67f1c08a794a075b79f0fbb72083e287d370bf2c3b2f27cb185dbd5a6e73681a51a4a7d4e93ca7d0c5baa788fb530667d014e4964e02f6af49910e56bbc51675005cc3764826573d6f8e29db684fe56ac7eb868eaa2f10a5f7236602dd6db425e06493ed2a998e07c3f6130cfbccd7d7275f2593b4060e55bd7f64fd67efb9837e66a9b81508c4b68f5cc3cc1a6c86538b0a4244102a3825192f8b94dfcd9f3436cd65558bf693c01e5cec6768a149564f575cfe230e369a769e3a67a989edae96235743e3d563bafd60dd8d5b0dc95600d0d6408114723c725601e459a72d6948e31011d147bd1da8f3179c65f46ee92c015ea9aeef837178e162a96497c6ea9ba7002dc8a0185ead9e3b231e07a2764d5356a800f1d2d016baed155eee52a91ac9a8263e810e0477ccb8afe7ca1c83d1614eba2bcdf8eeb86cf1c6ad1d492b42d58869a76cf695a4090091678e35984495b75e83d66e13fa52211bd3a722f7a045218697b67a889edda375f1f6763a337b1103ad9d9ae64914ebb3771e7884cfb2f3fb84100253d4a531dc2b8566e01a8bfc580da607ec212fc1fbebd5a2590d897046f0ec069df20a1c2278ad70006642d9ba28625d7c1efd4473b68f38fb064346d762bd2fbd5376c2e77de13a31a32a29b88264d44c9f27d3a97b8dc4d1267ab85b5e05c6389575d6a98fc32dea5dbc6cc1a01034a42e1a000b8f63ae720a9a7511474872a61481b7d742c5b390f28423641616d739485e4a2886938e640f1cedb7c317ad7c7d14f6ff2b6b63dc0debee1e38cb34627a6f227ee5bfbd1dc08c82ad35d5ef222bca149f9e16c7121c8e1d6e9cbfe4b640c7197d112ae305bb73e4603415a03dacfb81273f7a55e98ad541c3c66760bb17e0afa1bd7778c25c4d838f225979357d33dd2473e888a8e54bfbbc2a5420d77c56559b3f27e6ba2f73d078a503c29008fd7915dff3e7f6c86c8bc65d08bd91fa929bb81abec583a1a16bbb10c724e3fcd2f589d81eec5980b1a260c2e78f80ff2ff296d4ae9d855f30a5d519f61897b53ed2eef0ec1e27cab5b019f0832f1b1688eaa5f169c755b4cc2f3515230621deab81c3becdf607e2e345505a6e04c6cd37f463f582eb6b4ebe588996d08618b5a382969646fc7085b4c2b2850ab92a7fa7905f559c723c8981c211138100f2e6b165d61be9a9d81fb4c8aef4ebb4acca625f0695e8d45ff1d0fc8a1fb71f36ee5fac00b42876c51d6db7b42e737fc429f2a0e84b2aba3c241658431fd5296b48f8b5b4f385fbbdfb4a2050965473171ad32682c9c47c677cbc75ea987dc7e6632723516e74913955d48302c0e156fc198e2044a638a348884dc5cf1e13635ee96575646986efbda987604942bc6419a27e4ecc7509b775b344d89f1538a43b283e0c7c993f5fb162fd48a2703852c6424e02889aba2175aa3c1ea9225fd2e1cc1b88f8520079bb2e809c9cee078ba87557dbe7abcc99aeb98e189ba9eb980921785b66487cc64148cbec97208c7726b8264b881ca368a78dc556d5207e6c07e4ff0454d0f6bdda5e39a93f9c49bdc78753d1d851f116e6838c49e43a8ab77472fa04327010d8fcdb4462e4d5c1c8117f5aff6700183cf2371d62573c9312c55803eb8dca5d900f5c969a2541871e8aec9624a29b9b43411523409ccb2a067100971ad5343f8ba83e8acf8f840c39aa7baff21988ecb259aa2865235ab1fb1e094e22874239145e1dab7371f1b391d68902e84a5caf02a2628730895fbd6902de73834278dcd2775663167b3f2fcfb5b13967938b34dcc1dada434d6ebee8e5fcc1cd654c8d4eaa956c3919b0d33bbe60ae00b39930792e7f9c1dedfc38f33de083618e31dcd15e47114bcbfb407e6733fb33f90b04905ecd4710c98cbe00612662d01bcd4e0318d7ecdf0072fa0036978b81f255339ab94065cc8e94a0a8f64adaa99c83537c50e4695355bc5259a307e97b2e0c3ff0f48562b19ba8a34563aa454e9ed87f759ce911594a3c0be343019f700aa4ac4b66e8e8608f3d187e4fd15d4f814144b763526f414c7669558d0108012692eb02a7074149b7c682bc016c6d1cf262259a3abcfdbbeaf00cf8e7b2ddbef07b8eaf2b4d17edc3d974772eb7ff47409fa49689852729844d5975e9636b09f6a309b96a46c6bd31fa50483e60ae5f1a7e4444d647860ad6c2f13518af4a62b7cdeea9ea60f848708dc897a6e2e4b4ee62772db77094e0210546beebf2f669a2309009324807100e182ffdfeab2ce91b00dfa993acde3a1198dc8bd9daf98f449fb04fd8588d94693e08d3bc45f17c4ecdc040f138cc8916d2252478d3be342d5fa1f6231ef6562053e5c1463fdceee82ddbac66b0da4daf65b3013f59def8baf4f794c907dbc5b1ee493f52f549b1859584245ab1920859a808baa3e9b65d7bf4239420afa8639c8195b63902b24495b95c4143978e49843d88a92d1feed2eed1a88cd072d6d04ea26dce8ee4b14896fdb69bc7ff2971ed8ac5655148d2e9921218d74efdf17c56b533d0bb17d11e07d7458c4e34ee11c4144167a7112d11f439d71bf2ad82c8435e8a7554187c3576ea6bab4cf566c9c66e8f38a4f537dc93bd75b3620e055472f2d414c0731d4f528bab715aad0dda52fe0150c161adb9ef117746239bf3a18416a347a6945e9c394f8766edc85df408473a3882d2d93a64da5e3cade3c82fe53e6a767d089adc79aa72047cd3d18744debc587fe544ce938c8d1f67521d5024deac399a5c7c50b2310dc28e5c03049728ea590f059ae7098c9666f6834dd2a17beaf9a4ec5dc97157cd39a8cd5d0c7dba5682b6b03634257f0c9bc1d3e3f809aaa94f2354c98715a312d242a46a0f7707739e0d71910675b852365fe06a60cbcf69a27c023a1a3d878114f27d947e01a4e3e389d6460e88ed09bf37156b8d566e9e8c35914a0357998a7a2eb576e8abf709fba23acf8ccd6195aede0f41de381cca74e67e53d2d23db18a5de87bcfe482685efd2b8831b1da788dbb2a97e3ef3e7fe4e525f1f95c0878ce06833da439eb8185d1252a7dd4ac34c454f3d83efa682164d814aef7437e52adcf2216f61a76e7f8e4c400c1b45b5ceb41f78d3fd80e517d25e6e54d3703d1b20e21a24614d90e30ae64b5bddf6c537b08a2217706b5828665092f7b953d78734a2e6a14a77656b574a3b3c29453bafbff802f6504e227190bf807f2ec8fa95a1984d8d240d3640ffded856091a5e5d6bd1e119a6108c1bd813fe953bb7ef6dee2e1790f8f64b898a0cea52845d776a3b7d8727799bde4ec6b5d5e1e608ff38a3cb0b53cd1cec6f7e3b38d7a2f6cefdb764bcc9d2d66031e30bcd0a39a36f1e49d6f37eab66611a65d28b8e6ccdab3f68ee48a7b8a959edb67eadb93c708a4667b995b99abcf1b1c63bab1fe9ca5658d584f26833fc13a9c7773f95f65897d985dbb9aaa306e65c2add603122d6166f878c83b54bb7d48e9f5c49476f41ddfe2ba429fccd2c86451820726c1dd735ac0470c43509c3e5c4c5969476af15a5dee27cac5521171a91186ca87ae4b7f938d6967a9174068e72c18ee8cbbfba37a031cb095ea5ade96bb229cb007f5cab3b84687070956916c11cab0ceea61adb6ea1f909be63d73df96fbfa3a9f4b092dc974c6d7b72d4c7d85d54ca866c1bd96db96e741d637e5c63d697f81a4d99f84496ac385a1530e7e00cf3e83b1aa778c701931225ac888fd2701792fe9201239b09ef9ab48663bf00b2ef2fb7b6a502a401ceaa7c45df1e6ec3a839fbc9cf5c08797d5b31cb579761d6b0679f4bfcbd2b428806ca3969515e59b3b4b9fcebebb36dbe437aeef2b72a009e589ede96f2854b2aecb88d1070cbba9ecce1323c18c56d1a1937f71e6684b821c95a795ae8d9a41a25ed4bbac2dc6cd2491b74ac2b6601f9a70fecc2ed9787a1847b2330e950d6c279127b5190baf9b8f30ec9226bbdb2c3b3abd7c6948af4864faae5003b126889afcf23bc228ce9b79163398722f307e006b3bf11a3858838f38fc6b22746e2d691cb4de3c07bc236edc2ccc1962f89b868cead8d62b2c91f38d1ce2ff515cd13e5af00aeb2af0e9fcdd18bb90f9abeb3a1a4a821193741a3e518055deda6afa7742245053f4f5459fa3b7d57d75c303a78deb8b50f3c782dc40e7425572213fa06cd23d0b1831dcc3ca6aa84359c67b3b624e5328deaf5239b59226f7ab07e746358a2f74e75f0605abb1b267082ea88231d387edb6840ef33a117249f797a7d526aca625f4a557d1e21d726d138411f8772b88241dfe1f7548f5c2a0ea48e7d9caba4fa2b2dd48b4e80e66da0e3f4e2aacb6e26077760a5c5caf86b0f5a43dc09c537a5fc44f6f2b38251e225ae8b3754ce60537457466050fbf3ceeac31f02615d8b4c18b7421a15cd1f6ca7bf8f884c2698efd1a81b8fbbca563ae606ac576c1ea9d8c8af416c3c0958f5703e883c5b791ee36691659ccfde28994c4c7244f2ad982f5454794eefdf0564c654fcbb4970f8187b3baeee54e071d264bcf82fbab5603b04cd7429f8f62da1f229756ddeb2307558ce7ded127739cd767fc6818ddc0ae22043ba661df8d8933be47abae1e8cee145715b01d14c8972cabc64a333ca9d0eefddd16b278a0e24ebad940a1cb9d846894ccf92580768a9a89c5bfb742821a6bac443a2dd56d83b49ae49c555ce588b6d886108704fdf5a574731f3189e9f92c91f987109043dc09c0c245355ce5598394d99cbe1ccf56d20e471f2e6d31dba64175642713c469c2df2aa1ce462d85535c200437327b2ca4b9ba05fa770a606d3d4077cdea5fab544866589c932e8aaa8101dd9ed081e59209648a4231c3f5e5d7d328719e761f428f0dc00cee58d7fdc5e78f319164203e6faf0282280f2aa4c3a60cbe7ab8341235997eab923cfbc17d59afbbdfa25aee7f221536c44c6d2e63518b0139969857be91fb05396b749a29d0a57a25ccf4369a3628dc80fc4be7493e29e63581aa679c7fbb864e44c0ec5dd507190e249abb5383b3e0089f2563d7f46fda1919e8e651cb36cb4b597f3c7bef5af4f379acc13d734ceda5b5a838b1fcd3593ebfe23870fd0330ab29ee1f267807ba601ca90caa9d6a61f2d042ba49bfeae020f414f26c9d97430826bbe8c00793c5ee9e2de24d5a82c97a6f637d11c62d0b5a46ff98c715699ecce0674deb369593f96e99d678333c9096f3a905aca7f0476539109ff30cf09073e75e930a6d73c11b1e7b7dcddfde53e30d81c87cce0b00bc4ad66c82ecd2c4979c207ca014b4c9ce1e513cb0890e9ff90d6c5a04b0a3e3d9ecefa2f92d76a7928f5b4f3ed4df1a8cfe9997c2f743b12373e72ec6e8714d489f9ac7b85762b61f214daf4926693fc22fe3136782f453fce180bb45edd9c982f3864f62e31d7c780296015171d9a618329c3430b4b6e50fd6a774042973c5135920ae6b690d674793b2e9ea4fb6f9f9a7437e911501d0b6b3ea0d8433a5ec646108794441b903086532cd76387787e0ee67571b2c4bc3ac19b6dc4895069c008b8c148015b6ec24f7842087a491ec6888766231531b2a3a68ac64b3b61c5072394a14a14d7d6f47bb2587811c9c93eaf60f046631e670fc31193b781f3d96340ac0fe1a617318cb30956705190e2af2c78fc24c3144345c03bbc4e84900f9c0706f456dfa4e8539e8624386125cfe1a6d873035e9aae0f440d2a596cbfce791fac36f1e6056111e530aa186a10fa9cc6863b2c5c381033f791c31f61097fc331a6bffae4c2068e2f10d15894dac9a8348c3ee7e476d17a82ce70ea8af48842e4fa75b900643e91252c7f3f060aa6cc97f2627b1edd59ac8dcc1a000f0a52bee1b24276637270e46f8e9d16e928f8d197be913233f41091bf94a7aa19d345ffcfd60d783474064db43e142564bc2780ddfab2524b435ff0c12d0130d0d6c9cc576cbe089cf367959c42cab4a04f9b9f11adad248d53ac933a9f0eda5b9b47ef217e3c6ec376fb84d1a4a90bc568bbf6dbe06af022ab6040d3f3b8f0e2aa252ed41371f2d0852ae1f86c9872fa90f14fe19ad0fe32d4e4c03430e5b98f8ccd52183444dceca85c76bca07e30674ea570cee3c995e4549fdb045e7f7e88c8a52397e89d733e68f909c24a458e352a3d2248c33dfe60b5f858ec866d87f5e61768f6376400ef4c6963b571d4d48cac222df7431282cf7e590193ae971cff6e8aebe02981cb26dd144c3b1e134a935dbc59856a31675938299ca2e1e585cee96672fbc7dd1c0ca1638bfc58ea3773c4736e974182f5256acff2c0243f0989df12c6ef185e3bc922bceaa22741e5536ab033d8ceed765c9cb5cb96818df258d6f8af6524ed6f84e8882fd293009a5cd5d971ed1b5b30255742efcbffb78664587ff405f473026579302336a50f9fb68f58f08130b26ca921de2508a6a50ed5ec0f5f768fd63a955f1a8e7664563c882093783a13dc720f85f136f57f40d1d31b10b661fd00603c22b0383ad9beb8fa0ef4d1c0cebf8a8008e3eb39916e19856beac26d47d7bb814859e8290a2d5d36e3e1c2bc6945fc24341d0a7de5182c1366064b437445958d5b7c68eb018c716126c415d6ea550f2290055b68812753a694ca198a8c313488e3837e29c6c43da6600490b55bd60da3a404a8a36f81d6667c9ff3eb9882e19966d5f38b5fbb092b1809fc02c3b23ccef983b7d5b710fd7aa6eea20e9f22e4e86eda8eb8d65b1d18d63b20642bd0e5cc16e851a75fba100a9a1def9aa9f8859e82fa1959338bc0962302c6849a184fc4839c3ec171695640e1969f38bfec0ce32b9d5a157c323bcd85c6b4091872c4dfc90846caf404184202bf7d8fe7e6c0deef2b1b95bb3ad6e486efb39caec68a456f93316bf1739e38850250482bceebb8590c2280f78ad903aee58be562fcea1dfda4c64b6f9e304bf3c6df0a938cd398eea8377f390a8c548410048b3efc2c8ffca5ce13766d16a2d272f37e2609c0a73868243a88a237fc90d9e6374aae98c5f3fd126a0fc89767ad70544bec2bfc0dbeb2b058ec3a21265aa6f8908dfb76e46a1457f94097fdbf0927ca1aeddbcef108efa2826dba93f86be0033f0fc90d17e952686713c28ed470ff1d9332027d7b9f88c35f140ad59a4af0cfebd802a684f91f0c5d903193ce6960145dc28652d50ae3db98e8132f357f3c243df18c895321e30a83becc53d57db27921a5519524d16ab2d4f1bbe9f1932ecadd6151feadea062b80a57c180f325d1286e4498e937d840fbc38eb4af50d2d887230374dbadbf037fd4d2728a713c9a835865884479598bbf7c48c9b6a75a028a46628bda17c09f6a1bfb6ccc3a55f02d59365c16ba1107f2e9e84257754f1701d0c0b978b55ba2f1502124c8c7285ea0f14578b2529532109ccbd2d45308729822ac7249fef69ac001e21f02901a4268b10182b9db6c9692f581dfefc94ca1b7ec646a906d180330b1ccd00c2da257ff08f8fe9fdcfda2149498edfc305220db7ea6f71e783658dde03fdc381866ebde799a40c6afdee0ffea8f717c20df7c8d59d2ac36b8e828220db99828c8ce9a817373fde0ec76dfdf77c3fef2233b11581e85fe6b9793dd979ac88850b74fd07297048a511b5bfb1dccd50af0bffb8ba63d1f623fbcc005c937fb41427c711a4c44da7aa9b4f4cf354a4119fa4fa757f2263d8c2561032d1135b0477070b8f4591d44535d21e7d8d07086a0616ab4e2e66a3eb0bf4cc3a01a44960f5d5cbdeb3370f088de1a9b8459e01432e889bac8dd99b1845fd8882b4ec50b0d8b68c66b65f06d9fcee7866e5c197845d2350f866215248ba99cc71b19378dc66d4d88f15b1c0a1c82214f03317d316dc0f54987fe6d061b0ee216fc242c9cde85736c19ad445463aa404bcf849bcdff3732ff6a0d11e4c70270ee4ada14c69a5672f640b719db29a9dd034fbfe5ac8e9776778938943f2426a1c383b570899e72a4ae0312fd1cb303401bf06dfb6b9084586881fb7473a6ddfd1d4340d0546f4cb0f9dd4b7e77b43921ec4df94d79b9602148d0b03330b3bb0b81e606a4c5616700604bcb0eaa81ddeafad4fc4c654dcd997ef20140e4ff202567f8717e4b39242b87bb0c3df3c04413de11e1789ce22f099152693e0eddb00356070bbd543b368ac6b7a98d01e41e34fc814372aefb06fa169e527b1cd3ecfdc27e4ff28f0c00a6a3de0d6c4361ceb6dcaf9c9b0a1cd7f385224798ad7639ad33eab8be4a000527b57ab26c46cdc811f4f947824cbc248e438ad3172f39187a30b8d06113dbc666623a32fd7a8cbcfeebfaee98d55d8f1308346f6720912bed3f85218b8ae3d6eb3078f9a05d22ffa61820fc7f32654a2a19cb87091012c68eb6bc16ae0dbc893eb6d380e56d2512d01007fb85f288185c1e9ca48d7c328ad73cea3a491aca8fc95bc6734d390798e54a2c664d742a6bf17d346264c374eb4f488c06ed30923d3395ce2b483f5ef45e4ceab75665c0a7b2bc3f2b1f946e5a6f601e06eafda833d5fb571356fe7fa7b39edf890115ff6df861f9892e5d637aaffa1cb4f2c070e64902fde5f9d4fe358d968735fe231b213af50fe7118d08ae999d048b753780d705332f0db1716f3034ea5e58ae0bb86402ebfedf49b1d278b4bf6214f2b16c78931266e51e5226fa5200e15b913e5ba8e8cd32cc675a356b79d7b1cbebcc786d5b17321680d5da265d50acd938498952450f3858dae4c5e9518c702ac0e74907f5b81d1c999aed36cf700d3c03aba602b0289bef24fff894e43429ac32a062fadb7b8451c90fc49e10e5af0e93d3464ca2bfca09c5fa41d0aa755aea81763a8884e814708fb314deda07fecb696efe62a52b4f334e62263f0ca660406dd754637a7429d35e13427b837d78fce4cd23172ff197f61ed63a32936df6683852250e24a64104c4aed1f695acaa1da67c48ccbba930bcc7a4e25dc73269ac715540db3c05068f53f447d2992c0e981f0af3e5d0c8a611c98cb303207a5687b98f2c6d0906d6dd7c621881f6521306cee7a904f7c6647fa4cc20d537cc29a4713e4c4614222e79bea6c89745d553e42690dcaca938f860ea01b05665ae7f6d290124c8f5fd99de8b00dc84f02c4dbac6a5034f5d76de6ff9bbe5e94277b46c51664a9816ef9586722ec8dd9dbd7cf52f72b15f9d2682e76459460046de650c7aec22161f7eae0c047f2203970f4e1db1b86b7fd0ce9281aa78355dfb38fdd815f14fe548213fd9a2705c8984985dbf0db49602a0c569a94c874834c82e0b49b3142868498de779dcb0ecf1eeff08338415c59a85a194d8bb150337461409fbc2c340219c0b215723af67bf2e99fa25c54a7ea9e7e9809a868fdae7ed817648c59d2b93b83f7a0c17ca3153dbff8ff031c125a34003d9593f76539936fceccb5bf05f5106816e1319affe426fa6564d6a286f394696fbbf3656e1fdbafcb9fdc66b3fcc3f7759d6b9bf132d6214c977cede9fbe341954170bb02a67d1f77a5ac57c5187ab87d9f1787604575bc17619e0525bb4c0e19f0b3000818a2483aa5ca99248e5d3496aedc6736672a532d8ae4f3207bf55a6290643c68bb71b07d69e134b6a996f2299162425add1d6ff6daf5bec48306acd8e92b780ad813e1a6b7973165b04a7a9c115220b4f27797da197a6ef71aa88de3c2aebbd6b6af631f58949718eaa45559f654092ced6054410e1a0ca3890284ebe5980db49f6ebc4e14816eb7a0c90ac6080f06aa15ff2d93827e9faf193e1958188f768cd978769db206bf291be4214d0e2c1e16b47daa383d4e2f030f81d492243bff46adf41873fcca9158a01b2355d2525a58100153990731c587b6f63e01d146afca630a2b37b876ec2b7a9697451a2ac05871b4b11ca8cf672355c2de0ee6558f0043e43653afb1d88aef7e0587af5c5bff21be4b2ae7d120bf33103c1f2d13a5d095a7c12ea9245e5d49fbf582598f30336746a92c8ddff5439906e19e6c25fb23a07e55306e77858cce34f09edf6b49dd8a74548862a0f097cfcc54f16c3699dfad8f79c1c5515600c7527d430b9aade6d371d3a82ebd18a31d8b1d82f5ec85ee0402b549775ad79f7b7c25d9a3c164348a65aef2b9dd7550cb6bc5b7cfefc936ed0091304d3b125234db6fc8708b77b1f7786ed0cba910842093d3fac1e86da1b0b196de0c9c0f023897e3793a9ded4361d09aa92bc9f028652ccfb2947f7716943c4bbc7f24d595d1d70952c9a2ced41298bae4a2e41d25e35d4246105bf17ce2c938306d7c6cf544c36abce440224b50f657ebf8a2a061df4fb320fd25e2bde382e6a39d4cdc08dc858d20551ff2906412f825f5ad80c6a429aaa7238453c0dc8ddc7ed83b2db8e042fae4e2e8458b961525fa60aac53b7914af434a214b6d1812a227e6f168eb97253a72544324242d2766d2034478a7a5384b5c39a3d2acde3ac1088f17958b4a53d43072d79643736f4415a421a0f471bc055ab9b3f065752cc0879b55ba7f42f75088064da3d0ae16462b0ce9450925c966a692f9ae802611270ed152e1afc43737e1d64c53b32743f57d03456fce0986f5a68c1c13e539117f04fab711031b3b10a2ac7dafd4261fd77151dd272b641c3ac36ec5287df6534fd1de2b53638e2c63354e88be1bf2d27670bd58740880b2bd65029bf42ea4001fdc4557aeb76432b90184148971d5835ae3105e5f4da37107f50e477fe18d3f788ff7e22ae7e674986e18c916bc155b09301299efe216819fd95b70d17ff739e051bb75cfdb5c1b8be4d0516fe6fb810dc18bae2caf21090d7bb1bff3ee2b16e18b5bb8a67c0e4e17cb76519cd5cf1deefc43481e9d0b31da42d8dcec1871fd03a39d52b6b04336c68bd074a373d959324b020dce921e238d95976ec4e31016cd024aec076044fb1f8ca75f8ea6605b63158fa54377a004aedeb71d8339528ac7102a2da2755ac4aa37c2bd6558ae4b08c1b3b98535daffc584019332017d81793504be8ed5cbb9f0f2eb342e700952aab936f19db214395bef3a75d923da226cdaa146d36adf047826e86cf3d6ba98d064e0f492d896ddf7862d6e7e86b1962765ca6e7a1ae0caca3c820fbb720944022a786b6c8ea71122b3a1242b144a05324045de8acf14366f9a81c28f2c3d7ec973c8fd34bb90fd63de5d3fe7b4ec9616d1da3d0b70c56deeaaad2f76eca070aba79653f1499acb426d2a68bb4ee1715a82533406e5399acfd3cefe789a783f322eab14ab1f0aa047c9d047adcb6fbf86ba776a8116b8e39b7cabd79d1e0e16e671cfe96a252ba7fb5a1783c811dfa823e00d8887eb8c70d90f0d60ee60aa1b4ed6c97a37434405e588c7c411097953b85ede351d4cfc6a11f3bc4472489476f2c6636e19619ce58ebca7b4929b84e9cd9bb21a4d214ff9cc90802931bf13505aaa636e19677c6d7c5c80f952b04a91eaff50de1e52ce44904e21b834ab70d10fe892213e3d2cc539d21a3b592e117498f2822a99c7c174e895669882f6f42098eab83090ccf4164d843d23b0ff22b95edc0ea6c46870b059cd18712386e4667d169d4217fa1c883edcb1585e09c589c525bdf9a91e22216d5effed20458bca47d60800dcb0eb4296403d836b36410c543557cc50cf20efabb0e3b2801930757d91c311e6d7aa6ddc1aab4ce06ce0699375a4c6bf -MD = da81f8b846337c2dbf86c1818305516dcf50b6bd9e7b4b91312bcd32ee8e0736e869ec791043a7c67bb853a70f4a9f84 - -Len = 87352 -Msg = e3c137117f3738282f808dd94aec5699fa4938483507f46eee9a3fc48c20cef69b44b0a7c162e0b5f4ec1bbfeb0cefe5d28a15cf42f100f170edb60da5f8dff9ee351ba2149c9951ce58e62d366d02027a9eb940d48e3047bc25bfe15c35fe10445e230b5f2f8b83258d962a1359b876584dcda2d227adf7380a0149992155c405856ee98a61ddd36254d4bf6a1639cbd65ff9fe23049f894e63254c4402099c9973a4447c7bb8c9eb7348f323edac885b9be45bb16d2d8565fad2f34521452168f06e241fc443ee29b299ce262639364eca37c163aa7f74e495b14584c62fd9dbc474925a86a7c984db6f585b090a5c19b499392102bede35fd694ae939ef4e58b65d9515070be365b4749aabde44822321b3c9d3bf1249bffaa30a5dc1ae08488fd136389198c232074e9bfcec1231d4d92d7c6127a23fea54078ec6a7948e14177a7cac6a75f0559aa563387c9aef94a3ae57b48397471ed23cdd0e34c8672216fd6f57daccf5343522fb45d60447cb49de64b21a18eac33debff1bad731edc540517222bc25739a26c6a0d4279bee19166aa44364eae415dbbfdd75dbc38a998387df5a381a0caa82cb8760821de3e44ee31531d611e01fa55de288bcc3ff0ac3ea8b98c3157510e0aee6a6f232e4b2a1d02c51878bf69dc60aaf87ecabb1b56c0a0542cf905359dad13d0c0a7366e0a9c24846fbb1be2ca85692e7fdf32915f666eb0cc0231de1dbe2f8f44d77f10ad129f766a53b9d58e6c24b2d6332eba8fd719b4b37463b456e44b9140d9909adc287c85516821a8eebce36ccbed36feadbca9472b76241f0fc86dbdffd5f1725d86c2986b21dcc5b31eac44a636d3c583bc27537a30fa871212a0fbc8f42b02f8d3799601a77192a5398922ae358b77d7809abfe9cb70542569e933e25dc5b177b8a9695b2268798bb681ee2c13e97c72af0a73c06f0bee1175524d963a47e6a0dc5bf8c1b94ae02e3c9c9068f7723c1cf27f56474355bd9ddfe2322cb03a0b3de8972b7b949d315774e3f0aa0ab0209cf10252c670d52a934fa1c8ece92587148363ead0dcecd3cc055df63a732a8ebc539a4e841d139bb96c98f81d0d90c2ee56c91d0ab9bc2e5699138b5f5b68ef42c15033ca739879d9dfceab094303249208d0ac6f5297aabcd50b9563eaf3acf7e22be7e09aeb2db94f4bc7f6b40715ca42807f48d004afc8634ffd8c47522ba35f33530eb9941d226518352d8823fd5cace27fdc5a8ca540ebe7ac239b0dd60edf705f9cf91cb3dbc93cdef6e6e04411edfd927519b5f4ed14d9896f0dad14ff0bebf4d1810a56ae22bfa998f6c552b1aedaa159350a0497872f7bbac6b94c408babf8f67ae66d6119aa7d5de25a8f04967f95d1d5103e05ecf16c4aeeb9e89706b855530b3962bd5504448bcf2764d14ef6542521510801ea254369ac354fcd241bf1305d899c8a7fd5e56be7b537e27d47c89d4254cb5129d5e85d28b6e9aa8edbb6d5976183903e264845528b71fdcc78d78160a1f0be5208426e8bc31ef5ec008a89e2467f963bfe556138317bebe3936b18a2c1dd100dc73be6fde55678e593579666c2f8661d65f406c030bb74699f6bab313bfc0f0119ba0ba5a3f9f9229a04424a5c56c68d630d7e120f9b5f07a5bf823597b483d706a827ac856f414b2079d6b79d017f3301880f5756827664ac4fe5d55e6c333696eb8039132018072a9e99d40b6259b6464d02b78ed87f29bc031c39178ee8c7d26c5e75d67545fec25bd5ca30df1bbf3b449f593e0443fdddc36e8a4a816a32c1130b8855d492d9ef98d0c094e18ff5e6562d66ee708a89187725f07fad811e6bc9ce9918a6c540ba3dd4dfbdd17b015169f60526831c74740787923f7af533d974eed0a854a7da2932274e3515a88a8466405f6fa5c067fa5bdd9911508d1a12fdb4568c440050475f11368417de398536549c503e400ab15b6e2c7e97127b1e4d68534ce0984919acdcbf303de4b65ebf7ae352b66204a1f084740db74dfd064b52ee718f366ea902ce10c3f184a817ebf95cfb76effed200659946180349d1deb95082b8a467fe473152c59a84b7b6a11b30d6e4ae9f4d745ac2b122ff0787f0e7a107c5a8db20654bacbc9fad8c45c92687686969901935ab17d73e08de31682208891d0b7318426547326ac7cfcb4a63883b6ee6783e2aa0c13fd2e576d62db3ad8f2894d6edc8c64bae629a28510e1a5cd659ee00c53a81e871485f787e29e2b9a14e0daca7ddb8dfb9efed3ddefc932ac19349d0b54f95b3f6063e8c3143f65447f73c9f4f6b812bda798ab97afc151b8585bf8f1650254b55764a59f86339a50a8beb55eb596a58996837422df6e957a99618e5f02479d816fe4a88da71f1d57172e076868fbb8e7e25bd8000d25805b52d1b7c4cb5d981c20808c0e056670b0514e4ab25f5bcf41216e41dfa78a84e31b492f931ea8d6ee0fb4aaa11f8e3704cdabe9cd273b5b3dca473be24d12159a6924307a8abdcc8f83fd9ee7540ac2cd02a38f094f1edf26437340d84c30d4f9c2ff64cb8e010b7923c7d3314160c66196d184f7457adda3338edb22537b25799f3757069716f62375afd21f7634947ad0c2763788d3d93d00d67550c165a9a2746871cc34742f26e012361250dacf6166d2dd1aa7be544c3206a9d43464b3fcd90f3f8cf48d08ec099b59ba6fe7d9bdcfaf244120aed1695d8be32d1b1cd6f143982ab945d635fb48a7c76831c0460851a3d62b7209c30cd9c2abdbe3d2a5282a9fcde1a6f418dd23c409bc351896b9b34d7d3a1a63bbaf3d677e612d4a80fa14829386a64b33fa217c9b26e8453e4a6b28940d88512de90ed6d54d65d91cff97fd0628b26019dad84de628d9dabf42cfb195165a369c22b49d4b012c02bb910b4bb03859b73d07ae949532683d9c3b7774fad4fea888e4c5274a1cce5bff67050b0c461ad510091afd02e44202578ce8ef5fd9e41b66b7b7015d00eb494ada1bc784d2643e2547b3f3c9bec5bd63bfaa8d1e85a8f3d81410b7ee4df15f407295fdb45dc446ff5bfff5441281c3636c12dad178cbe63f7258b788648f0252c92a0a0548c9a400be559e2c9ff4b8b8eae854f313cb571f5b058cb5e4f2d704364e991233d2c9dbd76b4acda7ad11e6e46187fdf705caea568da3f13ffb41d7425a1745af7e2ce33f9787c1d9f9437fc134f07c9329b642dd7799b4e5d6d74e95f2f12a1c2a41a96f60c183a787d1e609c90ae96895ad9b5859ea9b67340bdc799fd339ea75acb0ef5da48d80d741ac369443bef7e815766f9af2ff448163f395c729efcadec27c27f49d69f6462744d03d4777b17f82467bb16f6afe4d543652ff61d61dd4277db1bc18839872d7525f1a62ae35ea788e15339c690506711739af176763d45028052aa284b7ebf6274bb241bce5b77cdfc4a82673f93b2f18c25cb72e2d8db12daab6d7c804ffe8661eab514e5154e39df2658a063b5a02bd859edd94db3eded11ae704d7d04d4281505c0dbd0941616b372223aa4bf18067ebdbd7361d864dc4ce31c62eda5288fb794af3a36e0b5aa9fb34afeacb801cba6daa408c34e2627b3d3d9857638e104701fe9f6bf02153ecc7337b120a845c37a360b5f1e1d1d166f05107cc0c7e9cf682fd6da14011c196239511eab97cb331f5b5841184e2ff1a801271074592738c64bdeaddde5b485888e000cf38e7b66c0d1f57659e746ff855088093af78387b3fc6936c1b6c4c866f9ac42a0943da3831e48c68af349892f79992fb9a8e50356c9df3e697d332b2502bd895bb2f93190ccbbf9537720d7ce04c44a9a7435f5d83aa88d7d42ebf6ed319ba9ccef97591063b4d65b7db331897a702184635ba560d72ceba40bd371e50fae6a9a53ff632b699d264b0ceadf8862047d207e405b1729d42086e2d3e436235f946de61a970868ddb1ca2dad28f444ea2616ccca5f24b706f3ccced39607f514eeefb1ce3cd0e7dc3f81e7e456f5a889e40d55e2f8b0092b2e1ed8bbd0810e3641c6bb049caa6f0298184277afb217497fae227170e3a8ac97230673daccf52e559a0ca5fdbf87b78336464e7c541992bea03a5d0de41beff78462e4fc0f3263f214ad97a837b763ca83fc51040234cc6a8ba69018dcea5e15e9f4f47e734e3ce0dba5c4e539876e33a96b6991e5f25f4b196cf0d8f29e60bbf8c38ca71fd023e698fc12fced8040874d9b7c6925dab429f09667974fbe5caf5cd795c03b407fcef3bb6b347c29418d1a9573d5e97431ccb82bdc9b1ad2bcbabb38f511f127b75e93e9b6d60e0ada0fb560371d59493ffc1a34362e7c63e7a4beef96e2670c355f218edb2acaac71d3c904af899ee04780bdb85f969df845350c025e7bc577609844b3c178d99670a3fc8ac261e0c1af214bbf3e1ba4193e354e7c372334f0a0d3a55e520863503d45f6f95aec4675e0a76952bb07ba4e3a6b2b620824dc005dd6ec9a75218f63428160595e73f98343dac177bea00620a1a04cbeb9c4e42eff6ac06c120d8556e521e2b3b53e21733f81fb382f30b116db9c5897314c7403ee57c9de12126eb190eb230e4995e4ce3b66bf9df6fde2b95027f8f65a04b6069365b0f75b7972fdaaa9cc7201c06d1ba14fb3adfc50c28f6909d4e21b33d0bf545c1dbfd68ab8c19b2184e7c506e2e2d8058270277079228c0993635c22eab69a03b73f6b8c6985ca1cf4767db16cac4850d2ee60a72efa22f1dd81051a2d74ce23277e03c9acd2a161c426110732ff59f74c30903b099d94875c45ff61c080568414848487aa2e87ba9b006a515d6673c4973d9d7533954894b5b6303fcc629cee275ad80f8a24e4ed210a6ed61466fe7d5b1d719dd46aa8df93dd81fe79a306290807e5a9753921c3ff4e06e0808962eb42d9f2fb13a21b329cc0dae5eecafefc5e93959c93f7a404ddd41bb5c85607d6f2780ad619c708537869243b545feb31d207ce320be5d67862a2939e165556061302a0780e60d90bd0e04549d2ea358e0b6a7ab1068b1fe637c258e38f0fb5424e809b2719f6f5224c2b275791f443dcb2c48062ab72e818043c50cc5d0b8d534bf9e52c6210c4609354b0acb9047fe26e1ec88d232197d4701665a1a8d14702b17565cf1236ae8d4e63ca9271a3506ae87f3a7a952096e3235a7ea997ea491528fc035751f11b70245e5c4fe1581e3ac7efbe702af84b0dc610822d53ddfd545a97a70e46c773d2be4f4e2c32ab521cb4763cb90a302019013e5b750432ca89ec4d393a1a421e7bc33d88718c2452d5571d9c9b5c507bd17beef0c9d072177a8927a124f4ea8433dc31f166164c873057ebc65f49e1c6fbdd272971e2244ef0d72bc714fd460ec2b1327353f9aa59f45de9a24cf86a6860cef2eeb460d0d6b37e6394515dde22efe948f57f5cc731e8101d19ac9173c9c8f75627dc73ff178b27d7ee253b3a2a832d7b6033682975d6199111c53e8451fbff5bbc2f423779407a8ebfd6bfe38c4724d49ab7455a8f841f4d73e1252668c0900995f6f60364991e90edad1360b200775a8c531ae2e5bacb5728466ee076e04f699b78b6e84060bce561f25c390279cd161e4f0f47e142c5b9173c423be324e682b4ffab70755bfb9604edc5f7e679cf0e39f24e13e9e3b47b270dc9be1751fd5cc9d1fc226b5384a9bde67321c5c7254cc385fccd676440a342ff2af17b323b00c337d2868a0ffe297324913f062c76d8a65044fec28e123b4f5c8e5c758e4975887955253b59121b10f045d913706ab8c89b4c2d6229d24a356a1c886e2ccec302dfac86e4f768897b92b778535baaf613ae3ce2affd28d9de72fdfccfd573f317b10032efb2a77a9c5211a32eb4de9a6dd03da611d1baef31bb5840fe51e00cb13678afc25277f75b7778e30c45aeaac04b77fff06e3394168f56dd6568bc16b7b73d87c79f8207a04b16bf55d4c030f3651178b49d39d075341f5a6ae2b01a117c764164616db2531413bf712abf33ee673396c52474ac36f3da3f7786631ea7cd4c66035fe3005c1b976bc90f51bc999907e38bcb8e2f4214af15f31d7e2d61f2e77d0b628afaa3a8c94cc34b1ed2dc42b2e66f5c2c627fdfc762466fa84c27326e0ee4320aa71103d1e9c8a5cf7d9fab5f27d79df94bd69c4ab1d7448a85e1d70aa2f5970c108c73d8ca41e60cc5ca1d342f2c589af42f9260871064cbdf7727e2c0a859383bfd41067894d67cb345de5985d753ba65730a2f6e58971463d16b1ff0643f35324db6827a2b3dc84ef836f7b13e57ffa5884ce2ed17a40d17d7eae8ba9212acfd621875586ce3989fcb6f363ccb2b11bb58a09f8db6545d0572ee66a7989a44a226af069bc19092aca7d03dade59999b2ca4e8ed49b6fad3588bdc03edf9fa62b80c55eca910b617f72a0358cf3673f8fc59dd94c2fbda4ad02a01f07cfe9799f57a0a46d431dab20162845625f5eaa5c33d7a57dda05eb77c9dfab8bd03f66079589010d418e199579b096b590468321fb421dee0511299bc4c28b514b6b156a21c89d31f22652e8857f5010eee771e40526662716a7071fda91e8e2a6332dd0e3a59f61beacff2120df9af8e1081daf39cdabb077902d0df593e9c44b605742c3682f250deac74634169cf7d1732e897f7e12128e94426cfc11b781a0ba3ac6a958770647a65361a86d7f9426ee4d7bbf80c3d4c57aef45d65379a10f087f677dbe9c8bd4a94a79642c6b584842228be11ce77e830cdb9f6da158aaff14cd2a27e2c93d1dbb5597509b87c9a03754c3cd9aa6982f10ae82a8437c26d8a4cd198f0c24a288a31cc25402fc7194948c2b6b4227ab334f12f76f800c9c0181263b9e84d5447e2b460258a8f1d88d2371caa45b933ef691ad04aaa23195e47381983a9105ab68197c5f44d68f84f4aaaca85e2f11dae09d27b441ef1298e84186394c7ddc5dac3665e200d4feff2ff2e4cd8204ca06593d290c1db0d82d75b5dc25bd8e81e4b44aaa9274ea65d1a8c3c242f923e64ac9375b16242caadcf3952c64730d1dc8e61df2788960ec80c5e4ee0ea9d48c2e985464d93fadb12ecaaa1dff5842d78fac76e69a257dbd96f01f0f397c5fe43b2e5ced5d577914aa63bc58fd5374d8c36d1f2d02318afd9b903acdcc590b17f8f4179dab52d9fcd9249384664bec47eb90de70b896cfd7150cfed2ce27214dee504d1dca1a15914176f64a432af34d907f7c57c23a94718ece33c347d0e9ada3abc514c29575fa6cc2ae529bd7cf1239a1c1892a0721f38d3da14b3f3bab60a16e482b9cad4160e26e8443763ac8bd6e5e74aff8e4bd869bc10f10bf50af8e70ff9e0a5f49c0ea29e43dc6dc3b2877b81e5f7032b8b2523fc247bacef73c5d96c88f5813503bc1cb8aa482d6c235679d494875e26d467e01a80ff275189cf89d2fe3bdc0acfa0c50ca80206bb739b6a747f8660feac23269dc3060bb9b15850d9e61e36f4445f43e0b9847a4027a8b5e8137eac2176e9800c472aba868f02d6c7cd26f280064a11fb4b5a0878b410f495dcca902dc91d54dc99c7b446875174431fe0cf1c89e3a7a2f9fd21f3bd569f044814cd7217414d853787a9881eb6c1c25ad60d4843de8d8e31e8671f880c2db9f1c7b49ce607b2acbcc4eab9c9c537dc0a713d81c87d2c038fa6487ab884293d466dd61cb9b32ca97619f85a2cef5ee6ab3ce0578c521ba96fa13683d36109f4d271b26006d624021ff162f79ca79f78b9b3964813efc4e65e83c1c94d255877027dca156203315d06d5ab00bd808208b25fbfc1d3c8c050d8a86ac9aa438d4a72dc9d8b3fbccd00b7514103e3fcaf2d21abcd63505f866f6a89a1f35f3e20d59038ad5014556f93cddec58fc49e6f4c84126f8b2e269fa890c1f7d4f097bbaed6fc6a02647f819ca6e898f2c3c85afd564df6c7a1b07472c7dbececf2c2a63cd3a253f0c49dbb71df094bdb661cea962498f3a77f8f9d748c21f1b9da51791602c51bc9992265b9d2bb4ea8100ea6cd5b9df688fc1683246a4e96ba1bc6bcb0e0cef1eb76c028db2e7921f77610080987c7600acbd7bde8cebc5c7c3b84e9a3fa4aa6e4d1d97d6c4ebd6647fcb396b115afe09b5355b65845f5a36ebe3e7855bba27b342ee0cbd3b0027bf8188bdb7aa1b1c8c92712f4f95c751c001835f14ca1711f580278acb7fee2d3a66deb3ebca867a902bb9202226ed516dede1ddcff5830e3dee103886f87d91dc14164390d865c01d68555668a197034697458a3f42c5c69274f13f780e74fbad7477972d3e7e963b318cf8a86d8e0e52e7f68eeb1aa7e3fcfa11c6292a9d12b66e4bd44a6399a2f36ea82f6bf29a1c9ac63e105be6ef0a8368b9f620b2be7ffeebd82570af808f4c07ef22389882d2241a6338180c66e530a631f7e510a0ea8dd168b0258afa034fe4aafa97c710dafacdae2fa9f6d41c0a9dc1f000aa0bf96c0a419df45ccea603ed20de10e70adc24c5671d960a01571933b109faeac757a27cab15628dc522700b9bf72c60397fa8ecd62a68b2b43d6651486c59379baa3711f040f985a71c9e24616c729a656c9028437ca655b776f8e0cf3ea8f8509b34af574540ad3c3f9621bb666bfe564be463f53ed85ad0abd8c68eaa6c97aed1a040274cbf6b4b305febf10d9df2d3c3aa843596872bc8840cedcdd52f7b7df583aba97fff289e9a01684b8892dfa67cec734bac3a2f66a89e3bd4ea780c85aee6d82504874dfb2385821100d22e951fb1187fa979ce74c0959aea0fd0b28ea5d0afe203df402b73f2208a9ce3456954025b18b5cc70b873faf1596cbed55f8149182aa5906bf633502aff854f8ee9c2e62460f7bc7dfc6ad427672bcaddc1eb59fb43112135230ba787b8e29e6fdf12655b9d98d05d064c2b265d717c327c8b094076701a057ca20021fddc565211eb87e818bf91799ec208d583695d3c580860cf0bea0445c7a162df169b019e49f655b3199585378e74721c2038f4641d0b66904aa6665ccdafd6a94a4626bb4ddbd6a4e84236009d0971e37d09c910923b246c7bcdc8b256756367e3064e11e54112a4cced2c3d922a0d12e30265a98041a149e586b2af2a9b110127020008dbd012990fbfed54367e4f92984b4f98afc4e611d1faadbb10c8e8605f63c408f631dd6df7df03af51ae3e49e40d0f44e76df9aa8751403ed1a4f16ad2502279fd0c7b06cd75f6b4ab61e22011702e14f0e4e4fe4fb2f4a035d83308caf2a3c3b908f54ed8ab4ccd0b4044ff669b337291d0aff371455049040cb6238d70ce4ef2ce522b62a78f613af26bcf2ab7a6c594d960733434dca106e783a164f32c826f069a87b19146d701205f76a6eb1074bfa80165e2a420110312a16c97a343c8fa57d6490e92fa99267229de2260f8e9dbe599b0c1bfa5ffc235186a6ea79e8659690d59c1d2320e718fd0ede53de68baf38313e1aadf2d40cf7f1853128c22555e5479f1278769eac205c8d39ab62c20547d0f634968ff9a90033a3274d390eb6738c0249ac4eb19dccd6a564d2f5f6a3bd7ec059a105d461f9e6ae993f8aa844bae56dad9843af0e3c451dafd9268f52404384cff6dbcffc8a138dcf253d5ac76359c58761dc01c518b1dd62e97ef5da78282adfbe9951415ac1281128da8e0615f1f31f32a20d8a0723ccc5298491030f349bd121c8c1f912f867a770eaabca79b4dfbd311c3c27b1a1d420c2c0c995aa70bded46ef89ec59c032d824f519db37aa71a986d2f662bf36dcbadbba0657f4e2797b569610e2d82271ee6d813f01f6db922a5a4ca405d9e7cddc9dfbb1129294b8c27845bea337250c2f721887045e50288ad513acd6a6be8dce300a308e2f8e600bd585fbf61dd2ebe45c4158ab18101c0f1eae789ecfc205d8bb6fed9371d65a9e94dd2fa5322ff75452851abfcc2357025ea56e24fbfb1d4266b34ee900768fc3dfd6c2761f4716c97d6a36092192c0abbc81f832d372be535b5dbd578576e6c2dbf61d328c1f3189047a124ec0643e5161c87d8eff2ece54bff5a1a7a8dc46e2b2c8a6a120c131dd103d175951a1bb3d740565012637368dbd03629f10b2996c8cd1c68a8434fc0dc93aadf17b511eb81ebd1753f096df467a1068086600c6a8909be5b660807c6156f93ddde67d4f08877afd4c0752b0c721a31aa951ccb5dee7ad6cee5bae9721e0022de63b2d3575d6c37eb410739057d845e24c7a204e56b88fc1f81dc437948edee7d42267ba4934210252b6026940c77d27b7880379572cca4e9c4fcd43038914d16f4235c5cac81bf1ef9e0622c818d352b3247e1e2b6be57aa499cea3b6f82c557e449e3f42bb39b4537387a338f0cfc908f69725189c68acd6a2d13ff504aedacbcfab0ef73403b146db8ed4d87afaf57ea5587667e8db4efc13ddff08d523c81c8c621b325c0251907e219defdbdb3edddac9f96076c7c7dc93fbcb369213863a23cd4e3a5abdfcf8064be6c73efb0dec3cf1974a6fb47f3fcb328bc964047eed3bf48f5957bc1b48181197a6c9e0c87474d8366ffa28deec628a2707728017fc7cddc7d57b8814465f7d98d5a414d93d2986bf1540ad4cad010b8739e50eb9319092dcf7eda851bb8096d19cf81fa60f04041b8568ca314850be93a6e437cc521c1bb807d6a4386e26642a42ed8799b2ad5930079b08f586f6aa34989881b828cb7e414d5d053329f7f08c11aad618edcb8de8e201ed002f9cd750552876e67b42c56110ab52a9b29b41dd4f58938d8a06a92a60c103ba0be94ed026bd9ebc132cf8ff9ae71302d2bb5f07451e475f4f08b3ddc704d28ce186169d537f80a3b72f1d03313ad1a551ff53f03b2579f60576b6eb60f1e1dc7b1a379d2495a40431f33e541ecc12fcf70e24827894b1ba74fbb73b73b1b8139f4ebabae1289245472162dca9c4616e8c91daa346947813633dc0b5486bdf9a16caa6dbd15fd3d0c2619282194b4363d72f7e3deb4d54699be4d8412648dfd7a83503e83d63ee0b695ad52eb8884243a1911737b0e6d024e59908c757703e341c38dac86d5b6b6006b533c8cca4e577b25ead79dd8871ac0704572f210a87183c7a3265a970d3365f19b4399ec6b465d23f49ebba5ac169c9cccd61cd3e3febcea413a639caacf43e2f616776173876c9dcf1758f8547c4f5997246a236f0149b5d857364908104699f413b9cbff8125edcb0ffa3308b2351154fc4ea1721fd6b4e91b474ebd7cda8105c9d57e57da25be88b713f8416efa7e66bc4eb0c5b0d061e3e51af0238b7c52bbb76f0b14d8c86a78cb3aba96f91bdb4ce2fef3a25ac337695335efe2b2a869765acaf4cf23aa7c2baad2fc61e6f5b2881eb3ccc0742bcfe9c40c806398eb5fc6229dcdef41288e01d481303acf34be98be21ae88937675d5d613743e84b1804bbd3bf8ed97ef0aabe6a9e89a08454a0f4fad3b734f4fd3ce07ff1dcc3c978557794a0852be5a6c7a4fc198082893df5c51dae608fdf45422b803ffa4f719c979e53c6eb71af73e0d7e7cc10db6ccf8f0532f20b23610918484e69c516a94e7339f87ae734431f9d6011ff5f3194d217bc21e8e276e30f653fcfb7649fda54904f6a04a1fb0b72a54664fa980f690e34f2d2d80a12cb20d216ed7100726d7798e893ac424e6e34a191c704e1fa534a8fb02c09ae7f820407d78edec018c87f300c5abaf2b5d42c384a2167627cba50d0fd19c5f4437183ab8a9c47cd18553402c4a775d8b9a52313785c69451c06e69ee2815204e8ff656635fef44efa7b5eb61762261de14ae1da235f53af639fd5a1664af907f69371e2e29c2d6c47a1c4f40e7415e8b6292e3453126dcad7eee482915d0225f39770c4985e3a4f86312f63b0c38a62bfabd2c9115dfebe0259dde96ba2b58569722bb7602c621e3f9267ab0538cdb384389442642850b36c49867dfd015a50df8c676141eeef02fa2c347515bb25028d393d47555ba9d09b27a9e74e6338adde4def6a438c272240675e69e935dc776314957febde523d19590ccf66ae98c5ed1d8a7b6eee53a798abac2e888c383c8d3364932e9993236e4978db4eccc2c09464ff3ccbfdbab88b60e76dfaaa827693fc722a2675b3aa205db4b60da3fec55b8a1754619fa67ea0eed7cd48750150fed987eddc58fcf9b9ff8a06ab1d94fccbf79a6c38bd5d205fbd44f779d7fff054316a84572cb439c196c0743121cb8e6b13502b594028c75035f69295b7c27e206ce4969fd72491be8a1fa7a696eda3c347003acb0e4f9bfcbfb447a5fc9323e7f1bdcbbd43942a3a426f48126640625cf9744096111ac3eac148beaf90ba06332abdcdb8564b2bbc2878fe7e780df4bd9372e6c32fd168a2a5789ebe5a7f518b7eab4198fa93bdcda30172f1b49b816e7bc3d45952bbb1add10d8fd7422a29785551d26616b208f41bd44b73023430f81b2fb1606121c792afcf3b043002b8811875262991f133b9f8b7320c4a1e29e2d97d25e1444bd1d9a585474c0c50262e2de0e5e9559867a4a373cfc574a295b41f77dae2e381f80b1df95eb8be5c9b07fd5ab8ae49efcb3e82d0c9a568089cf754e3756e260b64af7ef1264e2f6e3e95f0ab4781553e880efe95c9b40f986532df8aa18af5303c4d3036471845ce375f6f9a396961ccc59c808c76fb4f9a19ed2a340440383aa96d9b906a1ee9c4afede0f0366f55e2ab716e7b79811155dfb19ca84697d76fd29827c637670497cec8ac75e89a19c86214312b794f3e12e0049db01098ba18e0553ca255fb7c90bb773cf1f4f296c6110d32641f6bbc19437195120a49c97cfa2d42ea6de23bf79f82f72c057fb224e0e5d8ed13df75b2317dec97dbb4ede549a7a16726242714a17244edc14a5629f8238a90fcb34f25d2b20b072be10c99f44bc1e129ca2a2eeace8dfed05a6b1e814fb21382ed34b94d97582aa4d60fe124a10a201ddc2b8ea11e3925dbb7d74ba2f2b73f4e970bb7cbb43cc8ec9ddf050132e5ebab60117defebb02b8a6a84f8849301dc08b8bc67739220a8ab3e624db285b80b7b60c641fcbb59d8847a586d4fbaf8b258592e116eb86a938abf82016022ec4934e33122ef199ef372ef3df12aef0488e4814bfde3ae8451302a26683292ea6b7ef23a6af08ae646fbd21ace3dbb8d285738fa73fbfdd4aa478636cb515c19390394c95f29989a97c82ad64ab1a5fb58578623bade2cc46674dc9972e408e07d68d1c64bbfca20af80ff5baeae36b6e18c74ae1bb3c3ba4c613339a5141fa9fd58b11974dda8e156cc5990425bf4268ba00984dea24b2025b693fdac0928db82793dab23a9bb455354415d4de169b31d384e8b4bd54b5db91a05cdceeaabddd4737c629f4b8ab570bfbeaa19681dc661ff49aca9714bd9d0368f9155df3019bbef772732ec9e9773b6d95fec1797c51d9a04d042a1d3fc32b23c31871240f6ff9534e322b47d5425e099650f165f1a1ab487dd5c8b6c2ea6351196ada862dc670cbd7cb8cab1554ee606a2ca8efd2b20f3d8bd40579dd7f66718a60ecc1f33bdfd1adc3c57c201b66f28ff64a7f962f7ff0156362eef5fe8f2584af4a4fe64c70f51e9f68236bf242408642788dc2666810a928538e92e457bd96ba55887d54eeb6c8d2d7497f962acadba595a2ede3621f957779c13acd4ada4ef6a1142ef193872ae2b546c1636b11fe7434475f42f86d88f5283f5425f2dc0c08bf7b81af29f6c36364b3e7e69d867d52d6f3bcf1959ae215f141856aca635c4503170bf9fc8610c97819498c3cb8c6a5e0207d7bc4184f5e678035285be0ce501e8f244e95a5918961df6ce0b32969020266274e0e761f32fd63e9cb01d4c09e543c71398fe5d427a48ec870bb48e2eb903d30e4cf24d038157529ef56cfd1a456b7692745b73728d29ff2c89fa7b2c72c0e20dc90b510d2623c6be1e5327ff6987872b441aa69015e9b6234eac6571938617d91fda73f964612266f179d3a099c08345d2e2fb845baf9ad5227154e7647cfbda1606bdaf8439effd388709e51d3ef147e45c7c36a7a432aaccf151752dcb157975383717cdd4b3ebb924cfb63c28599b432f308f41ef060b16d56303359aed1c0617e81a895af9973df92ffb40a643a8b7041f7570ba9e5ec6c5937ac5120c2d8f4cd89efef3466b8bae309c6fe238d6088352d17d2a830ca568e8c0255bf912d97e0f8c76c524ce6deada811201bf8dfd53d08cb0693c7e7b676abe9d9c3c35ac5696cd37fb1a28a9553693702e61355f1da18c519f511b1069215c75fd5efcd07c744789bbb1e208984bb8d38fa536f688cebba8f34a4a2b171683f4a7e6d10c97b1e4b62d6f62525b22d9814c13f98a3d5e00fd8eb0759619501963c25c1b294f568b057bdf114f45c1dfc38e33e4e3e3594297980b031716d7070a754941f04e6924bdca8657c6ff32b0e17d8e60c823c86bbf38e15c77b7b43631e934ad2639f5962745ee9d81317d362340abd603a5b262bd96bce87da3ee8d2046a5c696bbffcb8b119e494682a857d10012ac5a101f0fd9db230ef3828df31eb324f4077a91aa31591ec5de9abdfd32e44c4c960d175a5b2f9f399ffe9a5275583a9f401eb21b6043f7771122c30f8f15e01c7f43a32b8ab9b7ce4bbd1b916b5e6e2f0a506b0661f7b0c9a6c2c37530ba5686dc5bca6aafa2f336bd671b9849ed490c2db8c3537d9ed1226721c4175dfc37f077fc95ff1211dbd9bea59f4f572c529f71fdc2ebf960e2e91ae8cedd5e030ac416cf0ad2fb2ff81f151fb19edc44114e9ec770b420646c8888bee9af7af65769827b34ccb224d1718c7c586d225d0e827bc0d69739d3f766794c1e75fbfda74783a918d37e17ee35e9649da46f9dd2a4d18efb7c8bd409ebb53a7417274280c6e001c0d0a930d8d5f581862b0c2fe41a68d9e74c5f902c7f032ff47d47ea6d4e632a33ac799916b778781eea4139cc4e084aa3edfd2fe78a2cd3a58fa220f347d2cd794d377730453af46ac955e413a679883649add8c274f9cf8f36820a9c19f6919b9d2af5afe5029b74b19257408c823ca847b7b346a52fcbba582dd0ef2c971fa0839c381a01991543883ebbdb67ed0e02ce62e9fa86996e2fdeec9b74e97d1e90e6d36bf900c80bdf38a2376c9f80a54bc8f8a2677dfe61f5b10793b4b66f3773b018b4d54a552551a706f47c9c04aa8b1cbf0513f3254c14b7c6df36fc361252c8b33b3447080aa0bfb11992c540c4cab2003b8851d7d595da71a882249a563416ec29a15fab63d466edcf3784fe9c1172026b4efddca77f014f15219463ac22820ba6a1fa04d7f686003ef24004da67440fbeeb61fc68da14a94f9ab659bb23f457d9be80dd0f0c06338d4b621b25d5106d5ce9e3ffc1aefac77d75f1442c3f5419eb7f59fcb221cecee5 -MD = 2714b6e51ac7b317efdbfce1441dce76e98f3198b495651fa33b2c90479c15b8ae7811b203a739d3e809c2e28a4e1f95 - -Len = 88144 -Msg = 19591e3006d32cd4f5b0d74e5181fb61dfc3ae159664bc5db08354f6017800928814da364429fee1484d3b6e12dc0ebb193cd00ba5652ea9e3a0dacf398e80c5d76dfc4d8f97ca3fe64bbd716bb0f4d947170bf616818e6bf561b3eedca348602fecea3d8f247837f632c71e0306970392ddc69d90c0c4ec0e4e471b93bc40abb71a0dceedd8f011a188c03e83e5de8122156bc9bc2bb87154f0fe2006e350ee987ecdc851bb1a150ed710999256b19a1e47614241c95345f2ce41c4dc1f6070f9a193f262d6de8b66a61ef7d960f898aefc10d0c9a37baf0e7176cebe79587a0309c515c93025bad07e5420ff0b9bc1fcbae03bf9bf19f6d15f070753f72054dd40cdf92ed1d5eb75e619dbad5f835e2d0c394a7b27166362225a3744a4a046b1ce116637c2d8667c66d5f28b6596b66c7783c7f7e3583ee942d9263885c198a439fb248f0a14730e86f12b4024bd13df85267814f9c9cf9045ea9bd8a46991e00bf1fadcb1735a53cfd34f75a4e1bbaebd8a257b73505d7db5f75fcc08817a8dcb5db2c7c0dc6272c8e426d1eee8f702a71798d458d432d819673bbbb9f29bd202a612f73e36d494fa8c77fd09bc0f03cc3698c6b13f94cafaa2f44dc0a23cd83734e315336bf8e0eb340ca0fd434bd8b34decf98578cc7bdf10552b247ba5c7f26fecc8a862167f2542ab63d367f3aae5c65d16dc672112501925fded641ec6bcbff7b9a303769830201dee920e4ea0e807b3c5bff4ddb7d5252b6a2344eefd1b8cca8f2f366054923429e84222a5e3467ab6ad34074694f79c301bcf055e95993e2ff351e31bdbd5e899faec8a409a86852d774688a6ce3de6fcb8f98eb6b6be3deb8d13f2f05480a334cb972e67ee3192e2cafa5f4390306b57e8a7c73e8711f1c9047c4b27e71cccc1044bf66207ce089b4f5a74660056930953e3983d311ac3900194d708be30cd094c10ca780ce54f21ae6daf56463ac7d9a2b4e9fddb6119072b647cdafe440dd44cef92f325ffcf3c8e3bf95d8b616d917d23a2c4ae6f5cf82bf323e7d2e1f4e9abef36197ca3efb397cd38c1f755eff78b36abdbd2cbf529a84ab575608eea1212199e3336591a50722a56cbb19db3d475f7ec8a6efd4a624b6f18cdd0d357152973b3887ea9b5d9c75a39c3e2c123efe26e4e18ab8ec56dbc6c36374b38a3bb97085b627a1c29173d66cbf1b149a5127ba2b7cfb005cd11a249f5faf94636cc05dd7f075239ded27d55f29c47bea303e89b10f5a6eac915a50c3f60018479101afc08c02f883cd22f2f980ecba8848bd06142d3b4c623426ebffbaf8b7ad24f7f6cdcd53992acdefafda48d668db072dcfd34b1031f4260a5691130c1b1aa50db35e58e97de94c086c6fe6240f78f80b376cdd7ba808e37f213682bc9b06adcd760093372f55d3e7c928ed5806d897dfdd4f78c026e6f8efbc4eae8cbff78bb1bf3320bf15d702184693c2d4f780630641f991903734d2e6b847eaef0273eb54ef9475f3da033304554f0b4d49f6e628e609ac6e41690e0e85b0cc75faf2291187730777d451035685a92b0386a29db239fe4dbcee0a06a1a527d79411f8e192377d59bdad56ef694840a6aa2619f63cce25ea0e857e694ab70b70dbe00e91314001e137cd7b53d72d9402a3b0d38c23133f05d5b05c82840bea3cbfdd99b48961bf3268ad34cd0aa611c382af55dbff99982594e72afec844229fa27320c804fcf3c1e2c529d77e32487db98a17424cc1dfcddea2404aa1c0632e36393a483e724e1418cdb0ffcc52b675cad9ae7b754c5463156a52d28b312a4cfda85cb180722cad8cff60a26fa7da60390671c41369b499dbb7d942fef6c6904b48fe90957d2df2a202bf6bc27222a186a907d891da7eb6941329f86781e67cb183a661c7e3b0981a5033c87f723dde3629e7059aff015dc0f4eb8f7f730886b2e0daa1a25652e238605424f0f87a5aca1185f77947eb03f4e59464814a8b22e1f901dcaf3593759ecba71db1a566cba4f86b1ac7559a2da25d9b1427690cf5a134b27f6911e0d6bffa831f5be9819569370cec0fa8ad5f5bd5860adc6efc63831c73164a6bc96a1e659eb63a35694c8955f1e7bca182fd83e5dbd51abce7f10a28ba1dddb3cbc43ca5505ee7298c5587edb09a58e0b9acbcf712ff5ce34e22a8e1fe129d8a56698d222e95ed364944e766af705ed6bfd15981b1e63d629d7cd1c0c571044ff7ce9274afd7b6dc4e9f1a496506490413fffc2e3f2616cb6464274d96d5ac753e57ef055ab0de9bfac8a31e67c8a1e944ad1755114b838e117d2bf0e8ace0aa88b9f56c95adbee5dc56144e2e33f406d05d3d8eeea30e1b432c225341536b5065594813071ae25a71cbe0613ed4b9ed3584c1441dd9010377f5dcdd2785870752ba498115a4e36a499e99f000375dfce2b8650d256a26c71e7eae0701afce1fef519c3f57c83c85d252936328b86ac6666c7b52abb2c9e6a50b0859663ecb3a89b392c633f1583d8a6c8f32fef47aca4f2586bd075f74d2aa4f8e5cdbbef8c7c064df8e30bcb111f060cff81957d888fb581994cedcb22bac90a279c8acc15801c9c52fd486e173a2b3e82afe7f3e730988968278a6fc521a92e758c384cf5bec670603a5ec6402fffa5a3424b70728d83baffe8b3addd672aacf4242d37d43eed0f4a21b69b3108688b8bc12bbbd1b05f5a8717d24b129536cbceecd2555c0777c2393bb6b595cd503662b4ee9daba112b2273d4e120eb1b4d52b6c8d6d33204ed1550ec7dc12849eef4fa4fcdea866860a08e18fca76c68b10322dc74901945884c52452d750373afe7a18bd467109a1aa518bfd3bf5d9a5c50cb6e9af6f687f23b205bd6ff8ed0bab0c98999cae924dd92bc3002c31f4e93be08f596824a6a9f54337716cb2affb3e2dacf8aa060771e0be120067d21e3fbcd741813cc956c043a144d7962584f1fe04dd42362272f50731ff65b281608f8e1953c8f2067eab55f3b456b4fa74d635bab2df09aadac096ac1397d6e6c1c1facd4d955482285273620d5590d987902976b437eb4548bcd559d4fe9ba849be481cb85228e65b9de516d93ef068c608226169b2a49bc3d00c5ecc02c86f006cc02d1a6637d92074f2369f789d5238266aa35bb9fb5553e482e3830c27e5efb4aa29fe3949047ebfe4eae86b5f3de5d3486312b2b91b00e1801180827eb01d7e4d37e933260f7d66015c3b7ffdd2d6f503c91507a694d3ad4e0f4bce967892b3f28065bc95a1255192b1201c41b81275e4ffec1e8a69d33134066c5637e65739e12bf93c5f627f69de141faaf197a13c332a1f612d4209557a1e6b8428a173fa62612e1b4cfc92942fabc191d6198c313875363657c57b02677ed1bf3352eeddbd4a8ac1241466bbcb9e8d39b8e4da3b3a06ba07cf9d331e444f266e1ea1d1c9390d9796af5504c7fb160c0b5fa093448305333b5e70399259b8f0fbb23523a81fd3dd03b564739e073bc46d92f6c033599b273acce79347eee2b9cdb7b7ec61b7c3e36efdecbb2a37343fc81b8d68f005f0206ce1a94b244bf5084cf5ce34dc490631405093e551d32a0585c00f9362ce2ba539645f6910b81866e0342304011dc34fe27601f8fd22449c0a4a214973fe743f091fb0f3f57c735af13b5e63b87b23c6ba37dffc156dab8ec1806d930adcf57444d845f3bae02f6ce7d3265ae9aa4e1c325bd5fa81fc8663102c9b780fafd3cf5258c570472c74242ac423f07cf36bdcb1a98af82917fea1611453016bc039d59b67d97384a8690b22d6fe2d599ea28b9eeaa701f5063bd21b013c3504574d1088cc2903599b37a838d05f1968f31db363e6d31acd10647da6bcfe1cc3bb37077f515c28ae4f0583d27cedbd923901db6765b74d997fa12b6a0a42be90362042e9bc1aea6b0afc255aa05120bdba798c122ffba141991c63cfb6b024540e304a2fd60d52781544153605334ad2bcaa4dcc0b461fada7faad3d86ef55f58c8ea6b767db67bdb804dbd0733944ba88bfa6fdc340cdc5f066911c44a8595df863deeb372c32223a65008eb20e155b66de1f0d1d92b572be8698d4b68239729ad67b320da9b990e58e0bda8958c59f9d304165e2e4df9a578249cda526fc1eb91004f3b3f906edffa7841bc1c05d6d77dc936bdadd512604832d6fd83baa489f380198efc52123d1daf4b822ede4ac3a0a9e88cc2615ff0db1ca23196a4cd89277fa888ab51018a34de21b748862462fe4e8248167330bba33ab4f2e5be8b5dbf5782b4c70ddb6bd28d6ab7f38e0229e8ffba8c247b1345332555de0b589c9c2d902e9fc9f90e3669458d00ba66428cf365f7a556e99611fd552b3f72034fb8e4c212a64e92f89e7b9f1f2df79f94009ff9a040285f37a674528bb3b46f33389755c564af7c48f88be2879c45aa452961236ad9334c56673a962db74cccd59f97d3bd5777056dd91cb86ce82f16f46bc98bbdcce22190f8b2a857d695dcb56278b460fb3fdee5b4a0a9257e1e56104c4b9affb7df8f65cf7f01b08e39ff3105bc8066dc54693f1fba1d47da9df8275f69c9c71665d6535fe22ace4aa3a4f70dd5b025577f24d87ebb8d4a8a186db7f996a09a652fa6c82eae8be7886d7e75ef46dc2308faa240563781b419283730bf74a7f020877162b016bdb2e3f1ec1c3e926cf67d6152153ab0830ae447d5302566585ed527b68198cd38a6d9cb6e78504adb06014dc4b590b919b597f1d814affe3a3cff6ae6c32d248549e6648618e8d2bed8511a6ab00cb3be5a80b0b07cd3aeb6110bdb9295f1df1bf27657b35c4ccc70f3d941c472e322d9505afeeed714ea548186f44a789b3f6557161f86d1109aa9def67e629cc899033d7346e3920853adf4fd4f6ef96dd809ee42266115c8bfb1f0550ab59c3188b47866334f5c125d2ae1eb3780870e3b721e86f6e278d9be31ee61813ddf927475a7a02e8283c77943eebd671fafd0dc266e612b8b98b818a21fa87c8bf58feecf31ad932db79c3a9161f038ace27a3c9f544d1ebce408517b0a9646f07c7e5a19bd0b2b8155f5139bf23036b8bd4ecf6576c75af6f93efb3535b79b3bb2d238ed9045325ded8686bbf5e9ebb39ee316f13c4c6aea36c068593788c39e57401dc351c851f3ecc5167a0379b23e15cba5cb1b68b8d72b313b6f76866ac8c83c7b33781104e3e215556e918c44a8906cfe6b9a98ef7e4505e6d0893cfb2b942bd3a689bbc5ce5c0ba602368dfd93cd4b835b4059592022c2fd34c628ef373992a9a4fd251ee3c91c8acd58eb577ffaebc702a316906d32dce104d3b6d19c27058fa758f96af497cc96387f40ecddc7c25bfa197d2fc5f3c824b938732c9aeaf8d8360385444166a03acc201b282da26394ba39e971caf4295aca4afa6ad403e125d9a375358ab41bfb00c1d683f0194413cb7ae820dca254d5c0a19916d7f052fafabf25b910eeb4596f0b0f9ac5aaf84ba662f5978b8cff3834d2fbbb174ed2ba119d33497494edd87f3222e70ec5d4cec3689e5048226ce48f358eb2025dc505d6e40a5136454cfab9fdccd34c087dffab125ee5a2f1428d486fbeb629cbbe40831a378ad65e462297b449e9fdc16860d5f693c21c780474f8e828120e17330cdeb63730c56e5e02a0fc36b5a4af0894dc7be9602535174e091547602faea7cd223e85fd93e418fd5e4c2fa0c12ff30e1718dc5a5da71f7af19d991aff10a103f619a03bb26dfb85381a7145e3a29c3f1e53c92b164c718e5ad799cd0ceba333d2ee1295b15a7a2cb6edb81f8cc5889a7ac35c2cffa3b1faad69c5d0c97e12ef4102597601381976634c70981cf73cb294dde20a6a2b553251aaa9e0c5669498b91ce16732955dd4c5ad274a24c62d19f50a173df661dfe7f040b25771239cc2a39446e3c5d0bbda4686389024a0de3323ee582214e5b66df1927baf6d439fffb8fef6762b98b7f96e7e4114ad15c49099d1116156158d36ee3672731a3512a231b38c98e45bd6b4c5ebcd521ea374a4ef88ff762a7fa8f54e93133cf876994cd65855b67088ac9eb55539a309b863026d4c6edb1282ae1b8b3eea5798869861ff63fe6960ad8e09e54112b1eee3141bbbb1ec0aaedd110c2ca0746d6af39484155cf32c25391f98be45e4f94eb20c63534ff37f4fdd5659cb5e2de8f03c2225c0a9b0794ec9b5cda8ca2cd3a993b06bcc8d11c386020286bfce9354b8cea5c989e0d2db4dce051b4d5456eb7006b4b76fdfc351d1f98a15a288312b3539a3d1c988c6bc92b46204146affab42896db8e5ee84b4c4127178ec0173e6e5fbb0e11807f8b7be1b710a8674839d81aa5ff2a70fe256cceb4d4324c0f8225b933189edf505374071a6a12c079f2ccdd81ff73bda48d26cf261e6c54d2a48067eca0ec3b668c59a55677a6daa8ef3779102390cc4349224b673e6461c86c2673ccf1231f29fed5c1557c8d3c3ff6c2f73cb3a9254422074a5e7c44fa59a4c0e4bd526a1001708e65fec4ee6ea4d0155eecf6e8510de07ed4f31f31a8ed12f5c3a60ae99856ab2c983996f2f94145d7b6083573d7084b2ef20e7155f2ec806e176e62c93e90785863ee39c0647c1cb00777b8723f9c2ac0ab97b8d860beb4d3e8ffa2328a179dbacc05f68237bf1f4a5a23c70e123047db08763de27acb76cb3f40124b0554e2f9de67155dfb71144ab6f3aa6ed62e68280f944899c97c90fe2319f93d36ad11bd9efade7b37f9c45b24cfa8bc16fd564ecad72028d437c8159c72a12fa68bf0b016a7980473c1f723ab9f0b1d5705d9f641280fb52365e8b8b233504adb5749784d578d203730744a534b19bb23aeb8c87b705b693f6fb68e6e454fb65f77e2bd4bf003f50cae057924bc1bbe0160bd6b80954d6bafbbfb40d78ee69aba558328195b43ae79a3705827d8584e7a83ae8858812de4fbb37e75f5f75c1e7257f660be81957107777e8e63881a91157f54c60c1a43fbacbe09d6d168fb6c11e7020e424940663c93f7c4e0b5a7b25abc77cea24ad6d94943620b72ca09a91f6c6edaae9a8eb7a35da3a1a74549d7d1a3df4725f730a55aac52bbe103cf00224e036b095ec589c13e4acebf224529039a53da9a0b97886860a18e24fd9597a4f4896a5b7c2e07209fb3f23032e6cf770a9d2f0b6d54aafac7172e459ea3962cc8c87eacdc115647e6a7b6035f73f1b55c83ed7f05af3298497c404bd04026433187500566b6a1be7deec23f8f33b946f6cebdffbbef48ca4e976f3f7ab56f6f9790886d02640e0eca50bdecac6f4db142464692775e16193e316028844b983b62a9cded9865c5be37954f139d70d57ea6b231402142c10c8112be0ed547c92cfb9bc78c10ffef562a8421bb4a7b7a368cdb2511a1e4742c7f022ffa57f42cccc82d1f52527bb45e0de6dbec9bdb63605b8acb0edf8c55ffa1c95bf2f199e6a232297d4746213b5f478325ae78d6ba847b85cb3ec4828c0f4d2eec018b7d2236a2558874d538ade14023a50ac9b6a42a5494ccaa360d42e4ecfb872c0ee906117e7be9e0e50a316a608e060776c14bdb4e8176581e769f04e7f6d67d6025baba2f6148935fddf0840f8beeae6740d71ed11372526506caf9a4e881fb6a7967b91ed04b962cfa12b6b5e40606857a707c451168a0f102ec4b8d9830ae142d3597b28f9df032a9be88ba5ff517b6b93c7c1244ff48acb52c8009d08a9f47884bdb5268e4a95b311c8386c563e9e34366a6a074e0547d66b3227f5637d5e9d3d20d6821c9ca8edc552e81ddfa85f56214825768b3cb4b5ca8b959f3e058e357f1b65b83f35ab3f0911214715ff2d25b6f99a0ea1fb600e034cbfe6f2d311e59d15d93560b61b1b6f7b5a5473d3864799e72e1c0cc1c833a7fe2d692c5678124998a7862b8e87276b0a19e293a609103c99583b36305bcb2b08549245102f3ff72c5726ea3f5dd78e35e65ddfe7043401a8bef8b8c7a9390f03dbfec780b5e318497e9447393da03b972642b32736179b7db8c10ee81f01b6690a0b3e389a903f68745aad1c751605a6701dd7e6ed3f7c80dc10a3225bb9c3b0854413984bcbdf11eee69659b2ad8edc5a6b9896b81ff76aaf840ff6bdc5b962d435e23057fa79ce24c49d6164db19b12ba89fc7153dce839987bfe5d3ba0a086d6d24912da08205dc711cd40a3338bd8a5137e8931d448420983d702c1b3809b736452b6b52aa417c88bf12212a8e69ece20b8ba0331bb4db220316254db5ff484dee7f6f8535197b57debc38356d3ed9f77520cb1396be3fd1ab486dd62651a6f06afdc8bcc4f65f8b0622cdf867b4c7fe2f3872335808b51380975458eb9949ea5536f56ddc509f7ecff630c810543d6274334416c22ce1643d83772a884ea77827ab741cddb0b1cf86a72f48c9a5a0d0fec1af4287733b504c8d54ef7eda56467cdbd35e6bbf4ce9e4a607df2621a8a62934122afaa4294408256c0c51d4ccb1af388186e8a4c74a4473691f9840ab6e8e3b2b44be1831cc2aec2af583c6716649520d4ae739978d30afb17eb29b3f96881749341447fb551f32205fa717eac0d5b8e4fee9c6541f33bb7f70e789bbcac188fa5dcfdbdc8b4f97da9f0e41af5ddecd973762d3737cc827319ab9a4c657a4e0cd46331c5bbb469db8385bec2599cf109268d4f98c22585366509b64e5e9bcbf2071d0b20f819eb447b0027ff40111127527c290f4ac8ef08c372f5270dd738492653b055e5ab26c179a846581205f53ade8ce524377b66f11b2c7f61dcf53d1a184e4becec31c35965c744553740454ab202a85ff10792fa55807b8332bf816cc753026e7475691527a3487e188aa860b6299d49e0341d2a59b6111676fbad471aadfd62e43dc1fba7847b5c1babc682d248e9696dc9ac8a0f166ba1127268b3f9a26550a6527316ceb40576a96a48bbeea6b747fe90ea205fe8aeac6dec5bb94c7c62c0217c266b827a0d542b90d610f28c2d6cfd4f7cf6327305c0ef312e60fb811b3bbd828204ac1dbb7f07e5178bc642735fd0cf0d146e009664000888b1effab948e22e31e835e6387ea731b4335210b2a8e1d84380fdd78920083a11b20e2e6370f846d81f031dacd9713c54107f3e12d09632c644c540077c6f90726d4167423a679322b2000a3f19cfcea02b3313ba5e59a43f68b08338019dcf53ea71eb7e2e98ddb4a812f417c528ae408b57d8d3da91f756f2a5e74336fbc25b3084043ed4f1ec390923255f65e3a5db38d4d684cda5f3b2ec8bb550a3ef30334764f7aab5db8757dd1ae33d826a7b193b9052f6beff60fc5d4c3689d1e2e08337f70fec58bf78b62ddf77d9a324f8a49b759750350606db4ecfaf14473d9bf208279329450385ff005a295c5079e321606aecbbba22adf8c6fc6b198d662928c3daca8c051177da5f7340ee11d1063b9356985fd6bb1cfacdbbb1c12cc752ce70fafd3a1f4f15ee511206b66f9427983b23e46310391c8a6bf4c833abc6de8c156e755e1b2729e4de1fc1ddf12a0fe060b818f0f1057550a98ff99892cd9409bc1e771e820079630e82ba8a20fc86bc0afd7c2d0085eff38e748c186a433dee6cf24ea2db41cf14ea2339e6827054d442da5743c522511c238cc9daba90a1e22ed24113ae54f19f79ea8519a1ef40cf0f37f359c84465726fbdf7070a1b888e09a6979984a0a7abc4c0e84a05e213557afc96989254f19e7af060c6e34eba990556995be38dbbe0d18ba8a234af95108a118928aab8be474c0e4a40cb90feac2aca8f825683f3e8aa350e48b8c08ea5475e143098da9416eefdfe9d4c4a1e6f81ebc13562ea196857a46264197bc6bfb9cc7ed8e5213bb367a7c404eee2e089119f769d912af30bdec2ec20dd4a0504e941114a18f47ac5bff2e39d38c10da3e2cff7e26aab4a764975f3a28e94121cdea613abb9bd1af4fec8a591b24f6d64fd648d2b75d6e554a0a7c112b3c0b6b0a0e4cd2650e3e4ea2d105008e4f4c77569447ea03b118e4be93f9c99d538b96838e187e066ce9d4c54b22d295719e47d2e59126b43c50b032e25cd5f7b63e3ebad87890482e510c57995841d92248d25558993b1155b252676419c8b2da9fbe207bd1ab82d9204fba6a39d0c1d7f8815e5be479d3a39a459ca7b50457472cbf44f6a8324ee3d4096e2c3bf1d81909df4e6df785439c9504631bb33b7d62619ca8c780d724d4c8d3f36dd347845c1966b61d46c019a72f195b3e98b06dd2dae0bc6cefdc7d228b39ea8da4246f1793a215c856bcae69b4eee58eda15d11f0526005549e4e06397a5a43a032af0e1f50bfe2dabfd7a4ae30f729afbde2f9d5cc7152f2372c70e7aa1b0c184cda231da1ecf8bbaf515c125f5b2d1727bd1d45e6e5b4900f8c999b0a8b0d2ad7f0b8daf551a8108260972fa3c06c0e261705a9666534166f9407bb63504dbf1d1855be1395f9c1812bdb6dc4cfef7a03183a671598d96c9f6c44b17d12d4bd647b8331c561f4b6f4dbb334892fbd4507e743e9bb27ab7be73dd8e3207aab0ef540c99bd15d9fd72397a4ecbb88de5577ada89520b9b2298f2f49bb142fd9981890b0640030040d558838fd22845b949e91f2d50bf7f75fde69219f20da66451493bff41a832b3ed3d6f6cf86c93be8c3bca810468881061d14e7f90e235bfb33707eb4e7fd1a53e6a866caafff863b2d5552ad9716580495572430a4b1bfa4bb50750a2f47db35d426115765cf457425857816c74685438b5b5facab2d9a27f55a2d5fb90876cae57a7edc6fe17f7bf374a3b29ec20fa94a4720d5ea3ef46c29b72d1c4ee9f1fc63c935c396dc3c38df495ae9e332fe201944f0132b8dd65b9f8efda7b69256b2943ebf72a2688493312d2623603d5b8f3f7a55ce34c247dc9e08266ab9aaadd4c2fea3535b2e607430478ec8db8c2ddd0510d96ece8450d76f4d2fcb1edafc49333469cc88d6d7c325c01a401dc77cf4b32f045bc17bf8345b84a034afc94dfb2f069a47f308f26858bf52f4ee9550bb91fe5dfdd55047dba8d6020c321fa7d1009cbd2b626bb84b116dbf4a159eb21ae6a66cbdd2ab45b49e6adbbb708613b3ed1f5ae09ea7315498f1e8ab5c8ba9f9fc4eb9017f33fba88769b6a931a497893db7face6f65656c3474558089043e40191fcd32a591709da9fa183e3d213e3b398b245d9c4d5d792f1e8f2f65b078d786412fb90c6dac7c4e468be25ba60db229c460f5ef062064cf161d22b8385fa78bdb67fc7c6db82ebc7496fd55db0ed4558936fe2e39b6165d8587bf4a43fb966f15fe65bd3c9b9a3badc2f7f167488a04032fe0228d287620925670e27a558d7c187b5b96805da715199538f8f3c3bd7f5ad20393ab7d6b6266119c4a857475f80c6645d1e2073f90df9928312688530fb5a7cf493abddf692840aa480b60342c19488d3409a049f628562f66a99e36fa3c37ad0be3f0b97f016c04a5b422b46065a79a889e30ac8d1b53b65d230d4c88190903a24e1fe1ea191c11282ac1dbdc1b0ed49448c0529ee11823df3dde7f0371a63ad722523ef297d8399b124593e76102a322b0562270a12de0b49f18b5b16f94bb70078fbae1a428e4c417b7c3ca5f0d6ff87dfd044d841b53a4f0c3d8dc385ded35a7e03cfd67957a6ddf1e53ce3fb6a0df58bae07bb269e677d8e8cfcaf78837f0a74cad9009a6635c12822a3826859e9fe9979e43529f00f4018d82c3d29e0367b2dbf3e0b1e4085a59eb32533e03d200d79b27ed8c4508e510bdd911f126b8636e96f73688d5cf2e5c625266afb7a2cacbce61c18ae46810b07dbcfb7da8bdac8384a1d9b60321a2c2ee72b8a12a77c46c3935077103873d87d713c89ead7c0a9aaeda1362f6677c33987a923be2bab863e38b066c2bcd363dd2c6c17bbc5c455b1a882ab43407855967533ca569d16c57d54c07a0e3a2c27b76bd2e3d5dc5246dd29467d5476b85d963e3fe084726a8f1155e5238b36ea8e9cce1570b181f7179dee712edb7f9445e9413208c021f36d9adab2f5a2399b12edb18830e76d3f226446873230a1b898e03cce9582426ddb6a41ae62fbc8ba5f2ac4bfb6efe47701d0efed1a0ca381d11b7f4a39535a264300392bede05ad4cdf4563085239e4b2054493768c7eb7c990b874946abbfb94f0d1fd008f87656d9bb046f0e2ad128287ec0ea80eaf0253b30f3504004098359e1642f56cc81cd2cef5defb48e43aa64b1056b04ee4808321c31e3d7e4be30fe2db49e29a523b41211a1173a966c2e7f8b755d675a5992383dc16860d6543e96227fa1244ad28833b29c99e30b9140d36eaf261ab7bb5f980630726d514208cc9023dcc905f4d60c629edc6026796e0afb0159b17ec3ccfc15fd866fde3e3c1bd74fa57a6f2119f672365314af8b2280811a6cae282966bedd8718eae57f24ee68619fcafeedb0ac81e19272ef2cfacec158e3733c52c95add6bae60ffab6fbee3f8203d3d915679122f1f2d6df543501c5b32a333c6417a9629bb5495397927aa81db4393d267f6a38d5d96b46ab8bef28feea0a6fa7b88883fc4583eafed935c7d3560aa1761af966ad2315b03b765f4657c1dfe65e3ff342c5dce648519ac4a68a336d8e6d00e9b66119fba46cbef928a7f5da2aef7591a5dec39af4f99bd24d2b918b8b73f8e030d90346aaa62a64d5d4cf25c2c4220bb72f42c6765fa505c29fb98c20f0cb86dbfd291d4a51834955c897e536430e087da0a09257ea7f050fccf397d54c4185bfb6d2a90dd5914fb16995450fd60031011a27271e01f37b3c9c87d433ef2282e4ea47127a9b1c1ff0a1116bd4e4c12e4a831dad530ec70f4ff6bc6cc14136285382d17f1a09ec601a57527f0dd51aa660c5cb4b7f78c46852c1db8707ab451c1367b6187388c8bb3873a1aa4210d0414cc6792a29a7b22f4ce72c4c8e9316092c7f3e070f817ad851dc4613fcffaea815706f72d903590b464ff7e4dd627295a7b4b371765ac85e6d7c89e4c2097b83c3a9f44a17f480a547e184777d8121688bed5b812e7d7bf6943ab1421d96fe795f5b51da6ce2f1a457851a2cf456eb2be012805cc1505b47cffe0857940e0033ef6dcf4b5f3572b17e23032bcc4b9886ae0a682db73d2ffa25b0d44bafda49597ec7b4c57955cc74c5a3859d8cc7ef20febf5b1a96aac1b69f395e46f660a1921151486f40aac79433ede9aabd32b9a2d718a34be801d724447fee6ff209d086b2f3d5723e9d2abad1ea7779e6f3beb342fd87e934a93aeb1c6bccee2a3d9dde6895a1f6fb94bf8da68076338f74c6fc46564e1c030ab2b42fe53fec2665d2423c1ff522fef84cb6ba9830ff411c9925eb0b410bdc8c062786d690916fe735593479191ecf329adc151beb068253fed53905a8df479700eb282408048c2d8fcc5b8b5513f6a871a8c0eff06fdd81bfb4392acbbfcc9366a91db9ed6e059da742b63ef129fbc498c2c2fe8763d70ea26bf263f1d4f4e801086e7b87f663a147644f78348767edd9d1232ef70afa6370a26c99634646fe99b1225420c52da035da2d226856c28afa7deb698a8bcde6f000b0b26a3c4b3ef64b412bfe02eb023a4b5825d3bd9205c4702396860fd800ec2ec5984cde890edf7fd4e76ad6262e1e60d967bde561c5ff4fd39d34bda4192ad4b33151558ad71df5e172ac69648ea9c0b7d270f5b63273c50166dcbeb89a74998367c3c9d602795473b30ce23089a313fa4d33161ab4e778b7d8c6399ce990253c20e861f3f5b8458f92d2690f87d303abbf4d7014b32510fcdd3957d9704621e6460a466b1aa56f3ff745288bf00236d012072a2c97f336d95c7f40f69660358ac06fa0c6d8077b8acaae442b2df854742da96deac81a92543ede1b7bc2a4082f765f968a96a51079f355e877a47d069cf87b60d7af62cb78699f10f15edc43dd50245041be48d7125b823af8be59f4525bc42c7ab292894ac60949dfd1ce8d9c3605f772b7b8775fe87d6235e353c59d3ecef85b3a7476d43d66ebcd83438f751049b3a6e9bd9968838d89b77c35218689dfed03b0ce381db7fc2143dc02f16fc639ab64bc1fe53415fcd704efc5b213244033f97a69772d1a1511ca44d55a93401d083498a502cb841073a6a6cc1d4ef739f1c5020ddc0d50f7e3e9238272e8673df19ee5199935ba12862507110d3feb114ff0ae810ec43feac029e1d2e27621e08f2b0b41517a9d4937077c5e28ede6127601e88fb65ad138d011e68d5245574f0a6272e5d3a317ffafd66c791660d1828e8017fd7cd8ec273a299a7b695ef2d389cc82cfc7b80f7a15193f2b80a095aabef6a29407457a0127f96663d0c8d8b234efa4c6d3bf6c0492595c3c0eb618d22feaf31c00a9620cbe0ab00f2f8bf33434553e91a2c218e34e1d2d7467a9444209e4715d0e0c8c9128e3e1452db029a3b186baf9dac8fa5f70ed199b34810041736c841fda77e0d78c0c62ce723d6445d2097ec624dafac2215188781c463318950b94290cf14628130e9a72a73d8b64c065f4c027ff005288d2e2d4c801c710984809444b83a6cae470f0f874b58646a32582ae8c3ff459cef79077dfbaa36fa4ac4c383f34e80629bace2a80af3d33a2ce925afaa2be1d1a49f8290a77af7de0bec3cd910cf42407759bce74329875e5ea8b8a1a3147e7954f83b2f142d3847506d7cae913b26ca828beadf7477f539500d50794f375fe669199d93b22f7ca8b0cf0f9ee520b26345ba18fb2f5da14da99d8990ff131acb797a367912003984859772049d0e599d296ab3c4c449101db3cfb0733316437adea07259a42df36d774d208a2952a0eab62447b6e3c8c62c171a91ba9bdf4e872112fd8ff9274ec5ee56b799faac0cde746d415c0e6b37fb3c1479b199dcb072e94814b6718a8020635a93beb16911eadcbc3d3e949ef9fdab23e502ad7cfdc08fc67457bdb64bff6ebf3152ce1834925777a7b926d260b5ecef6028575eaae29cf488de3e3916d578fb3d00b14809579d55fd5625b410c669dd779d27e03c7b9988cec4638155250a950342fb66f4cce6adbab021a29e81aa64a7cb8fb016ddfdc9a2a4ce3dab60ac2320941cf37b44fc057c319b2c4e7a371b5d5dff3cee9c325dc0f9eebc6e3ac61c117e868c215215e39e6502cfc532986814af06e51838efab962e458c3205f0f6526cd87f7b96fcceadc4f8fb872d36e17a49375728268e499edc532b8b44b5386fd9737bee75f93d36dbde3e08ecab0ddaa6f0e1930786ae476ea828ce897b58c65ef7dffe6193a5b6143315bed36d43d262d442ed3e71403c6fb5029046cbddf267d63a2ffc649e97f888013d73e629ede741c99b4dc6a5ca59fa27650f1f4e708e8f0907a8e48e79035d8ef960ae3689ceda0421b80f558db7e825b134fe10cd3d92caf9f98c0bc5cf141d771c3df022640d7124ffb3c5f2f41f7c097ad0db74ef720e8b50d39d0ab65c4b3af91dcd64414c9ef9a74c7da6a90098d2234fe4e42ebd3240614398b4538686b999b644bc0117fc242131f2f5412c1aafd0b3e3b775c4d49d8d64a -MD = 312e2d967f977a0a1f7dbc9bf1c4c47a94a87954c99a3a6aa3d48ecbc0764597e1efbd988588395d95cc702fb53590be - -Len = 88936 -Msg = c67f9aa8cf1be3b4377c30c175d33ab2af390982c6a015d99209acdd6ff8934bf825f0c61275676f2d2884b5c654596f3092682895f7c3b93846711efc6314822a0bc99c6fc3503e240e6d2bd2e38d2af65ead5801b678c2a36faf3349d1ce4be598edd1edede44aa695b2cba269200b8706a1bc13c57d1c5dee2ec75e280acfaf34230e94db6cbb3a251d3c3dcc583b6df00cfcd20c1aeeee29b68041521035134734fb6d762fb969267427abf67ee23086b6c047749660dc8a0f06fc3528a69639e93f7fa4776bb9008033f5cdd927562f66af78e33b9cb177000297bb9a4ac2730883d34e8af9b41c0909223bb3336952e6716f424fc7f45a531c18cbad481e5b596e6f5db18ce2e0d7503a27522ef159fcaf347a1b0c2e9acefb894cabc9325aa6a95db7344ccab5b1b14678ff3f74ab7111cd71e791e69f3a48f128daf487d9b5dba5465b60f40460d44d18028e7cb00c3e4411fb7ea4d15eaa594683f2a43e4fad4df06ef0e833ad6057eea34490d097dfa1419efcf19804cac88eedea11f23cc75f9fb4262fac5dfe6de22a893973d89beae81933535cf24f46e86205575e44d0e23a762850d53b5595dcde84fd01991b29f0b44a5485f1e2dc3c286bfde92f71dfa9fc1ed3180e0ed9c4095e67e2a0066540b7697c7bc92b907288438bfac4515dd48e3141dc9dd04182f13efc7eb505a7c06aba52a642d16c72cab58afbcc1964a374882088b144d4ffde4d463ea2c0f65815625e6f247d782436eb81531070fdfef54dfb8612119a211ab3cc882ede5af0ff8c283c36d6bb71140af86a55ff2ecd5ba5573d88e09bd1ec9716c52008db70715e397641853d3fab3d77a8666d01f8ecbabe15db59e0f89b21ad5e41e582c0b30018860d31067844aa87750a637e67f1b4b776d223707c707b18b9591e56c90d9b4dd262831f022779af390889ac02b1bbcbc837e75347b3cadf40305a5f71c75761c408238fc79cd3785c298693b276f58073d04c923fac398b5a8d42a6a1285bdbc3c6b85eadebe0694635033b5d868d61df66fb344ea2eda36e397d324279d0433666ea949e5bc70a5ff4a7adec2aa9f375c09b415bdf11afe6fdb40c3a03dd2287ae633a8135b1e3102d1bf048aa72c09ba8d5c24da9cb37299f8f3a730babfe1d67c8583dc2c57dbfaa060c574e0f4fbae451be0e4943c49fe7b5c6d3dc62626059c4f4bc472c5fd631110a035ea8283b3db63d8507a3ddb09fcfb744bd29d3b84bfd18e50f0d11bb8be4f1332167d4847bad479a2a100bc48d8416adf528db8d061bcba061911cd88026c9cfe072daff66dde535fcb4d5437b7deaf5cd88014753c716d584df0793d77f9abee3f1c213c5ef1e3ec3b7c3952f623b068d71cd4ef8a9ff6cc1215a565a996dea720d1527628afb9dc8415d2271da12c77d0ac80bbd68914e607c9e88cf19493ad5ed59a50357823b53782c530b8d7620e47c79e46cacd161a91a5a90ffaa379653bb19f471fdbdfeab87b78ec3246ff90cee6942cb1fc98ee32316d8b2f23ee6369cda7c7425b4cf1a94863c6347053a3b891e8ea46780be58bf5ac7af996612c4ba26a5d3776e97e6c822c6b19d41ccba75222ebd2cfed74e14afc5c048b703463d84d7589af33c584a129276cf2a95d1d9fd8cde174cc20e4d9c3aaba73a9f034d7d7ac9374ba8b843de0a7984c87ec7dd350ed1cf7168e090aa8e395df6cf451098f6eff57fc14eda0f958465246fe6ab541e5dfd75b00b055f2a3213f37c52b15db3927d957161382c9a5d1a45517468e22349496181d9d646745e703a8c7456541a7a76989e3b84bd83cd4a340aba3f65855e5a3cc59028e4d5851dd2e9f02806916e898d3222e74bb79c9df784005667ab64d90e637926c3b66ec1c379114efa81385e7e145f895d9e92bd98a58ed56fff236ddf43dcf56a7de20516261ef0b8539e9c722c3a917ba0774f1e57abe506e862bfb84d01c06194a991d2d65e38c96d69ec7262fa272d2512fe9281a0aeb2ceeb77a0692fad31618b0cff731a4cb43961f5859ee975fc952c6ffb0bb657fe19843ca07fb0e4614e501ea6e49b54011d4d60b3c84da06f588d4d61dc32086f32f6b6bf77ca8e79c1bf70ce1126793983f6d404c86fd30fd6fd3ecdde5feb8f7f088e0539c6d30124a1aa7fe206e2e3d225fa81869734627844ea45f88425e569846c7aadecda82debe74c13f81b98772a07a31eb0debf2a429fbd412e8e1f95930f727bc83cc8457de749d10e123adcb2ffb1ddd182147c376167f15d44554b5d6d8134cd5d08df7c9551a3d6c4ade459c254b4501fee73ef1e550e790797de63cb74646280f272646bd41ae6b56a148aea1c50c11a95c7b63104e7164a6fc552b3ac993c5b1d94c1f55194c256f7f3c2c1793188d4b2ee4933f819b98f45a696a0ca319f4dd2bd11ac4aafde4bbff89df2ebb53c00be3e04b19f24e738a1e89c3d3dcc2fcbba61d00b2fcaaee65a9978f8f47a4f11205d65146a8703e91d01ffc387d752774d19898c9183c8d9305ce03e23ef267871c306e6fabea4230f992dee28d1abb3035abacae0599066e9c9705cea9276b93ae556a3c04a5c490204a317a1498011658bc020ccbaba41df5585bfb8f2a455e45ad0d54ba880fd8cdafbda71bd9414fc43564897358aec8987ace12f8e33d0f68a01f60d57a6a3188294912a8c4c302017c98cd038a6b990e6626bbed3a9bcfa09667075e651cc3da209f62c641ce5895fb6681862824b6de832b9d7417a6c573f7aef25c306eb54afc85407a38ab790a18984d011a22479038a5619862a71a6b2bbcc8d7c3a8306125c454ce91a38ce83df4d87e48aa75adef5bae5e03e6f5109a5932d806125ba5032445c934fcbab5d144cb049a0767bc0f162dd0e2ab7fe9ad4dd865e1f35fa0fe6cbc730afe2afb3c4ecd9cf87f4745009e86f5e83edf7eca5f61893c9563da7f6660d5f9f30541e5db874d4a5c3ad029bb60d5fbe63e575b597649ff3e90daecd8daf6ea21721036b2a11f78e46ae6f435637904edc4fdc601beaf12370e28af8bd1dfc6d19aef969dc21a6a60ff0ec8d338e8ec9998f77520e2c25dc8044c2e47ee96734ca4666d629247081721d10d5e872a9933e3cdce7d898ac8389aced3d3d925dbd7b9fd24cabbad3b53f6b62c9ff748f502cc083be25c103cd1fa3705f93993e4bd013d219de254e95aa9458b5b3149e7507c2f2215025b9fd9490f2b7fb6e97844a3adcda3b245fb766006935ddd3556631bcaeddf2473db99b2dcaf2ef92e7eb6c8d690a3d0875aec4382ac6ca2152c85d06103086a61d6595b28f8ceaa6ade59973ed367e722ec077c403f4f28f050fbc37dcc587b2c7a616c7a6e2771a68076396ffcb59d1f9b0e30c8b2cf18ceaa101da5b09700dcadf80e5b7900f4e94c54d5f175569a854e488aa36fb41ab7220b0662178ca07a596768528123de3b2a3d944aa412875cedfeaf58dcc6d5b4a033a53b6900040d65f7a4e7ee56d5a402779e04f3b00cad5f79ca6f63ccf2cc0cd223b80ebbd49db9ede7a22862812dbc4b1aa6c9fad07f8efe01716b9018084e2ea7616f85b7333d945c0c970f8cdd400130b98db67cda61d87ce55bd8f06e4e8f5abff22655d5d93328aca4249bbd76e10ac4a9adb7c6c04d64539d6d2209f53f64590065578e7511760ab56b59d34633cd4f84a72a4c93a7e143981755de2985ecb7020b6563f9776caf34aa6b29993ea4e3866c7d73c22c1a3eb49d31f7d3a81a625ee0265e4dad322287aa7cc7554bb50717c35744362538cb59c9605bdcf117e17eac438659fbf1eb183332b364a228439f7560c5d5d96273ef6187122aa80bbcc83763e306a9d1934d0d35f7ac8b261f864b41008892c1bdde2e5125a7151e7ca6492f7e3afef9a190ff2e9b174ed724340aa2fd38967d318ff8639b397f76a87fa94f5ede43929d48d2c5a58c3262d9127d2ac3cb2fbd576887687cca303ec8ba206a8bdbc1c310dc4ea11ff280efc6866b825a2ba2a9b8d2a206d0416e9c65c176280e17bdb581b63b6b103381a874f99b52ca3e3a6bdb3613e5a08682b806fb7333ee7c828f783d61ca81367ab36ad4d6411bee3e2848faa0aef381b4bb33d0de3033f1577a7dd9886779e3b638307de4f75621f50b88881209d21a4bcd74a881cae65d839e19f277e900227c604f5e8d1d83c1a8392246309d4439911552eb22a70eaa4f22d3f0f7f91edb13524edd995ba8b5a0dd9e9ec41351c6ccbc54018a6fb3bf032f343cd03fdcf6c437b564cf58cfe5221d85f7941201a945e9035381cbdd84e7ecc33cca62415bd7370d5af8bdff3979215eb86a435dca44c5e547cf6395e142820859ac0b56f39479dd27dc314199ec12b14b0c4e6c11107884463bdee2be5e188bfb40e122a44226ad32435d9cedc218071742da3767f32968b98ee4cd0381d7d58b4c8dad572b6506e5f5e8181d445ae684d68fc4b233011706901f5d98f4e76d6f99b6fff5955f6ea7b97bbd11ba01d9fa8e171ddc19271b9709349a65ff6fdb11ef052164c93c6fe159be94b26c3465e134174acbedc3fcd2c1ce8c53e997a8d816221a8e0f2391f99b58a4e6a11c14a18e3a5169f7ff402180933c48fc895b2bd5b4f259ae3c5b5848f2f596a2e16da265253c9c7e0171eb0d2bb12d7e6a7c74f563b1aff0b05566283390abb8aaf84d8083134eccf11697313ff3ebb865931a3fd960771ba7078b02c47c0b299f3e08a9fadc6627f8b88fb4770b68f29f298578bb07997848fa309f4cc1a03deac63ca632a1ccd83ede3a5e7a008e7443c51c6bb4acfc4fbcb5bbc87468503eb0185240d5696827ea1000f6f1da448577f049df6a598ae82bc09643e47805721cbdb03f883d225b24d7494683a2716e6331749b85152a8abca427d843f9a623533cc06bf524e2be16b97d14d95fff7831100368aee9c47f97e8d8513af41b97801de98cc4269096e54004299a19d5e806155f0e8ddb410de5141075706f4c16c9e992699d4b142cbcf4474d6fd8db090dc9f055c9f6877dceb1360b8e7521ea562725cb269c56c8c15cac4700a5f9226bb31e050a3f7f177946b4dc3b0b825a505f097a0a203eb21c009ce1f487177a4b5c52e5fac011220f5bf1b0203b57addf1aa63eefdfb531f66880e1f4871d5ad34af2be3f8026e8b778554ee40c882c2ade64df7ee2a18e771dbe10a7acf30a2b0768588187a4af9a2648803087fd1f5a36ab245e30ec12c6a6c036b6fe82d27c1b1a7b69de75c0dfec320cacb29ece96a7e3d637d17c020c8bec1bc885b0faee0c72ef9e8c7f63af537bbbff97548007bb74bdb3ce3ba97055ac86864a66c9a864d67bc999acdf32e28b55d23e057ed5f9c6a1782e0f4e1b8b674197548d88d3aab0e9920ee27e8f21cba2ccad9a1127e9414a2ef9e23834b58412a5ab0b80966767ffa0f20b86ef98a16a96eefc7f25144e807e389bb0e45b6dc25558caf61a2263869c4d0e4079d07674d7091110f901530a10f222fe530689195162b03586630c452d27d3f45650b3893804c30ec838bab18b2f5f6aa83d40de41d1a78403b3ca06fc8942eaada0be7161e9f9bfbd42e93d97f73a3c0c89fadbccae962ab998058fb17a4369a74901f4f9c09b6dfda64a76dd539bbba6711fd69b006470cf9c25a9f303beba6cd2e2d9a98f905eb3ec4323054a6a309f7d179856cffb9e6e47921c6a2b9b2623c3cbea1860c2da059d3e0eb7e58fe31e354be9a42342fcbd20b4b0bffac2f3f5a523edee3a182b1b40a2fd9a2bf21c4c2221902d0521d1e5aff42d9a781b6909fe52abd5267a981e5dd7b956247b2350cb02579a7c80670d7cb85aa2ae8fd28859c0ec732ad068367d450a94d8133f53b85704939147045e10690080a30474993bd578705102e48a2754b7fc50a0ba7d728660bf4b5ef100f270e7dc5f6399652ef91675a0f95443e36c8a35930bdaf580f933c7b2ae761aaa33d75ceb958713b994902a219b008839f549e8a93de8e46a164552ce1ddad4c11c98ab4e8186cc650eac36dbd12f82b257bdbc9b1d2b71b9475d09a8946757be92f16f900ee0b8b8cf3342d6842a59d5faae5a7092edc5f4f3459447fc63cb29fcac51ba26dbfe3c3fecf51b9a3a342a46e46930867407a381c39ab33b17588bc48ff8d3b0c1c779c6a1f8b1fda53b3aa42692e3e00a604f5ba0c3f53bcb246a51630de393d83af6cd18f2a093b3988c7a3d7d9288f5f87fe8a3b914e2c75a510bef37f3b969803bba1a8cf146ae70a931f2d145657df6bb909621181a5220c55afd1f0909bbc0d0f76f6eabfcdcee17320b360261ec838bbb3fa60acab59e50a6536c306b18233eeadf3fd69f873760e45056d36388c678d168eef1da39fe7957bac76dc7c6d10cfd32a77b16f5760bae8bd6bf549be8093ad7a1d5312365c8d5fad8ca050ef1c2972f50a0496ed1a1fa8261ce1a6b10c75f5568beb9befdc689db464e0e38abe81fa0df50203c70a92ffe9d099e416738a6a9ebb55951eefad925ba01c88c2907ff4bff9083a67cabb4c73277c86415e6789dd1c1f92360ed2e9fdbec1c5290a69ef8566a5af31d30f3a5c921811e41593ef7c2eb817d7a25f1135216f2d10b4e64718ce58d6c7abf53600a0dafb513175e80683adaa7642c8847c6883352bf86b97d4a090459bce03cbf9c453b72b4aa420068b6eae9478a5d03e048c51dd7d605e338dfa8020a1b168c28d10e9d4c9a503f6d679a8b4bc5d6114860927a79c6b06cfd6e5fae8df94a8d55b70f7e026df2041d56d3d497675d38a5d781b1cedf22e041bf12a66d013e8bcc01255cffad8f18208a7b0e54f8593f9fb67909fda8c407aed8aa33d1bc5b4d34b73a816be18e441f0b7b7fa9fe32efdf0464cb2eaafca8eac30d9be1b0099d36df35336d92594ec2e2bc6fbf034f100dc929408b6b338d9d882526c767b1417a83fdbb2d4757feb0162528bd8e1a6ad10eb0ad3975d27c702dd81ea869b902a7aa7c61d488f01e92af9df1cc28fac4d1dae15d63503f3e0abc10c9af3c8ba8655d996c8ade8c740fb60e11145757e7b835a4972f82e49b153cb471016a8dfb5ea33c2676cf93cad0325fd1bca69a9c2c27e1a2c595285a36b6ac5cc97b29c337844dd5c1e56de67c2b7879ed9a29a9d5b980c74e1172451731e0d22df5c6c79b08b5c292a88390bca94151cebd6dd65df2694ef27c2c2260b5381d5562cbd030385a35129f3b9238b5a2a08896ceed69db847fd860bdbab94b9c846a49a2a69e1b25756952feb3975683b042adb5b4a47abaa129448dd5c8f9f44e9433b2118eb9feccbe4935ba8295ccc7258b88f5b3d9f1fe0cb1043b38c928c4faa763d9a81bce80390d4670a078652e59b7b076410012dcaa2e8ab3afc3202ec52d1dc593487bda04259b9d9a0a362d05b99600f4f506842b438706d5eec4d41c4d489ef848ef2244199a091750270b511aa15a74c2b33eb67863fc5452fdfd28904c2c7e2410a02472ad7bc05421126661384e6a6f03527356865dd1f7b1f2117d9237cee3c89ccab73bbc3d1d0a886c16c5a27e02dd078b6458f1f7e6c9fcfe9d80878f8dfe5d5e70ac9535b3ccb68ac2af1f578528a6262a42806b262e6117767fe36a2b9a2c092567cb501f4de4e9ec5e8d9effce776b31aad1d8bfc6698692f81507c48351f25fd6293768775ab11c3ab4fa79b6c28300f9ade4ba7b5e707951e30d60a31443a560769296305f09daab5b14fac8cf962098dc371e348600b1f4162507e1bc21806d7908b2623c19af194c938aece5cb17ed267af3d92b5bc44776f6c22593b67765fb42c2f43a0a22ec4d20310a4e4a6f625355415193ac3ab4ca299857df2a12b1c4e8d1ce9f04bc8c2763f80a503caf5e2a6f1186061999a1dc659260e9a5d9b79ca1e4d8b32e0361a203e6d434c9604974716a5fceca6b787253b726f94e55e04b1505fac0b181d485a904514218098af90255c432e837a0559a0f92574d0d9498ed3b1c0cb5be4b9afc5967c152328b81cbd99d799b86814de3a28c4acb893c4dd18f26e061412fa7a5edfffb9e64b3d474fed2ec0adf8321d679fd1bf0523e3068070084dd92e9754bc8023625256ab9a4cc4cd35eca0e9b1a9bcb13e3ef040a5bae92405239dfcc97f356bb0e0018fa034cf176becf8a815810e078cde8f4a25189c55ce8be7b733175e5d2827a255d3a85aa1c53775f9c37e12292d5c678c2f3a27f1fc6aa2434c05695c2a91dfaabf17f600e4549f5b460157bab2410f730e900a9d3158541d5ec9e50d5aa70fdabcf43f995bbceb5917ab4d209e14ed9b5daab2cbefcd53c1f5f56fd51aefb97277dd85ff7dd8c05fa2ec70ef5350985196facee28a4247cdabe86847fdc4730e5a346787cd40d4eb8245419b748c765244f0ad95b34f969ceb434cda75ddb31afe8962e6ec8d9f9940366da974113e09e22cdd49ed5dd6bc2e76abf11583f004bf4cf6713e0766c53740239dd48725e4e92fec638af57ea80ff2f4404f6fc078170f90db5456e11c01e321ed0876e47fd45a39972e9ef4ecea58c43ca5f99ad1b041d079a1f494fa2aafd71b9238e0473e3c73494ac2dff758187a5a9ba9e59df57423d0a958d8dc0bf6c1ae0475afb78156f7fe61f9a663d3a2b50ea2f9475971270974fcfc435e30685028d195b95d483a562af6bbde9ed787d2dd4e8026809dcaffdb0f675aed326520f08c1183a4ed470c539b71ef14fe58724b10a709afe5e08577432296058c8db2a98681a53b0b0d990ca2c46e72927501ec7c066733d40828de4aa67b33a94273c8736e746c0c1e6ababf2bc3144e6e00160306d5b902926874887b70f40313e2b1b52097d47aca1fe2430083968cb40b7c2820cbabdc1fb2ee8f0a1dc344828e19de5085e0c1c12727c0eb3655c7d772635dfccf88db109680b0eae82dc80ed4454166a53d9b740edfdb5441feaa58d38036f347dc8a1581efa0965690082963e8a0eb9c374253358ed4d43ced8eb8bd37259ccb13638f139fe084ff96af62bb685f47c16a60ff39c95fd39d9eff678e1ccc61cfd9e1fdb9f5d33f29be182b2938ff13cb3371d899f3deeadaaf76f5c4957ddadc7cafe1e3a5fb3d8b52cd135bfee2d8004eff6fc4b2d4827a8b8fd3ff35cc70678807cc3f04eb089b11489bb21eacfd07096435487ac322f3bfa492ac722abaf798941d0ab70518cf561534da1cd00b45ff3ab993a03d44ecb84fb24adf3b23131adf650520fbf68ebdbd6f227dde7b539cfd7d44e7b570bc01fba368d15031307b34348cd7122a8f949bbb29b64ad5a67f26e0daa5ae3ef83932e674fd1c8dd6565cfc204dea1d18975a995e5a8792c4f24194a36e89f817aa800bfdb6f2618b28943c5dfa0646d022549a4eef274b25a2d8095da6fb4490e25d8461937474b55e8465a46fe9403cc2243e69c89c574f0d44af57e354acfa7d45d05f27153feb84a8188213f591c4f343e64d8b796fa7ae220730a83879cae7b38034c6471b942779b5758acda3ff222e2248bc20ccd5e20a91566a1963789e311481159ca055b363dcfd38d40f420b6d8309bf3517406538ee57bd79d28a2d48edd279886696b500ff97a2ab2c43eb6c890f2928d77d84676eb2f6dc5f860165ac97869cc6eda8eb8dc36ca5935b5eb594a76e7e75f3ec00a2e6baa352e2a701b14ea14c49a11b6e180edb65dd1ed1d3468113988b29f88f2b618d816526aab7ac767e09878769031ee8837e5204e1401f1aad298fb6367d58b1c3d8fec878f1ee9d6176d8d72e6512df09319a9419767ee28f83ebff1255bb66121c985e9e4b0821eff6e636e7ee8450b1222f42c700e6675f4a288b38a2d3ecdceeba4f872d79b29e0c081d0219f3fc3fe288978659f61780eeddd105df32b4a8b1ed21c013c3ade048e6f01971e22ff9d52f18e3fc2e8198d474770685485bf9f8a96bd58866a25b2feb66aa80cf6a739c9b3d4c51e0140bbd74d3b71f9551353567843405e30e63138dd721c12c4a218b557b4c15cb7d5dec677da418aa330efab0016816c9609ca656c80bad793da823d6595f9230fc03f3b4db3a0ae75fdbbb0b79ee357a377c5adebfe4b046b36c18966df371c13e9265f582f560dd562fe8e24432ec85f166a37e3539740549e1cc2e2f941efca39da5a1fb62a50ca47026cd06e2966d3cf002cdce7663457fada105f4ddf433c96a5532ab1e51f5c940d7341859dda068bd1b35c2280877b32449a6742dbc072e9cd7202864f21943168ca01f252cb003023f5ed6cade2c92fa2898140fc0f731b9be12e9f30ff79075b9b981b10e2caa73f1a162db4ed47d73c0436af09d8471257c53662506114fc2d0b8c6a9fc76bd96d4960cd5e4fff1359340cf8cbc2f7b84949a33977ed6bf928446745c621ebadf5aa51b473b1f9cc42418d810a768af4b992fc8b6c4e89e7926eb0164e98530a1e66734abbba3ce8405241b38d9c08adeecbc9c0f82a73acb4b0f04400d5aada31a54ef8fd13d051998faff61edb7acd311a9340e32a3332d633ae37a280f804768e68240363bded95215fb383dbe73bcaa7e072f5f5cf5f401f7257fc414670354a4b3893530ba67e30d950854557df019b3bc0f534521d399bc50cd8be9b06b6007f9a768bc3629ae3a637ecc1d2a11d1e2991ad8ec1530acf2dbefca2ffae40d98ab474b2ed0b33634dce80f661696857344ee3ac26e9fce434d531937a501dfdf6ec54708f888fd8567f098d0b1f286fe35d603588c6550262b93f3915d493934bace06fb3c1f6694ab14e2dd9aba68ebe27ecd2f0d45d503ed2ee3ed722ebc40f5bde54609eb23eafcb187fd1f52ada4e144e2b65fa5ef750890647c9226db7cc6017ca9f070a8010372f2bfee6fc7e1a8d50e7ef209e1f20444efff1bd60950925537777e44557f25c5bd8656463a0abf8b8ae962e66ee376c8f0b59d90e854f115903f01daceadfa2642e1058a96987be4f2a630dfe8f1c6a9116095fbdb0258cf317129a87625e7111d706ab14003848dd015da3ae2857a41cc60738b63d13fee75be6441ee6f8312b784f43ed8d46fd2adb8dd9bee27184f8c35d4a4155a1cffe767301b89f334a7abcf40a7b3a3744fd61f99875e4f171ecb6137fa52058680011c1ba9eb59a25c648fce7082d9587203aabc61d575fd3c2472fbe2cc5bf2fb5d3d958194fb228d7c76fc1da8ee72d590fab4cfc624411401dbbee1c6d5f8de565c2c16f9505bc75df55823a86b69e7188ff135a2e26952fe1bef9be3fbeeb576e84dfe8b01a4a6738b711703d8941304cb10281e290c6563a41c65a6466afd4972898cec87938767b9c56c4dae8805d04c900b8a7070c7fd14b3d3803df432488b5d66704abef6a500d397e855bc2c2574df746a515cf704de4469f45af0d0fe83380fd8d37d80b5e11a2e5686b7025ee47ce74034177f25814c9d95260775d5fab7ed68ba55a204eb07942a89ff04f70be6d8aea136ccd97e4ae2c517ae7d59724b83a257edc73c7f2a6dd7080ab0886bbbcd0811417c9b45bdde16a83c74035a615738348c8ca72e011fee6950917d845a28df1cbdeae57823f3fc7057e66e43980c8ce8e85eef781a3ed326673460d640a0b61c12a43275fba908d87740f4ae6de802ed57ba7fdde42f17d7b4f5bce20d990fa7c6451cdfd371ae79211030fb418e4caa712bc2cfdd754ef5d061fc282f865e386f2a0f0619f27fbadbd09dcac163ccb8bb2f72ee84b5caf93015a92914fd245673ef83995d8fdf160e0eb59d4c0d0580ac31ea8a78452e6a5a7d4e556c61e48a5ae2150a0cce4f233e26f2d36fee79aabadfa45406c7ebb1c5f5464d7469313caace2dc8a612626af2b5e00dab9cab9f6d853aabdea27577e93a4b71eb577cf5e9f05865b810ab45b237f7cc6d7c2dc73adf18225e596e156aa8a8533fd13a3e7ef50f51c13d7c4bf339c470442152bab929b7381471482290ccf761c04afb8ef038cd1d5ffd68064c17b099ce00bcf25f01b25d8f7e76281203b33e3b49336fd4581c48c2d4f0ed137e56b949beef06930374232dd57a8e550956490f306449a1cf6744b8589968efba214f65a04b500b8b86f98e1ae7dde04a7b129ab510a4cf0b48919eece4124777aaeca05974771f2655610eb3208f3a237c0b8c3bdb19e2a84acff5364361a1135de1683edce4444089fa5e32d72ac930e3c4423906115302c850399949ef8339a4ee4be4e71021867f25cb1e5e2913ff4cbd6b312413b6b74bb30a9a6a1474473a63b9d045832d54cf53f3da3812b0eb015755b8d7a974326f78b6be2668eac868d240856ac5ce37d53556fae7601690cc329034733b12108e01ec7901655d29caca5e78b9508aac2b2a63050ea9bb6ce7dfa938995126be41ff0a6f7d825207cabc922ec3abf92e5bb3b66cf05825ebfeaf1f39bc8418b805b09ee60d584fdf03195a2c1c40803ac151bfb74ee3dcaa7b3150bc5f3c6e7a43d72891335fdd1bee6134d525a6c65e1684ed587ce54614e806fc34f3f2ae91a6c325d581f1505af744a0ce62572204a5eddde50cc508a7bf8050480d3f4f7a991515477bb56ff8b8042c8c64da29cb09dcffc1611b8aff8c3e1b4a2d8ac7b1854d855b73247281ab504673bf98441dacd2c1923c514378b8a0bbdfb75dbdc305cce4762ac70e823b897d38b51a1789297fd1cbd0eed8afdf58905d4d30882b9523b14be505aa8703403f2fe7e80a79ea349ed2d17c91015ab65767419bbd57bdd27a314478ccec7cf51aedea8a938c7981874bb0633319d55a7f725707c3d3da69bdcabb98ec4f13188ed71f6a591d51e7299ae04b0555b9a556f2d00d422c9559ea7cdcde9f0b603b0990191fb1c90df60445038cae4192379c8d5f04aece59139ecc0ab24bcddedd299d4a1333fc080e95de7cb08469d971ae9656967035a027393cd7cc78f3096f4d5324dd6642cac16ccbce4f2e3af9f41ba2592b1cfef5154843c685bd075a7213565bd6bf29d09ee7917ac112319e3f5235c94b2b96e26e4a8559667e975c75ea1b41a7a51db3f794c3f4bec6fa20a3e0c5496f2279d282ce5602f7341f89fb501668c8be8aef7bf2e7ee80c2d11bd245d53c1f88246003324a45a0740c6d72d3dc43a2721ded9c9051aabf7c72fa3b0fea23c4c332f56014e6a40ac4ea616ce3d164dd563328c9ebb5cbd37a3c465e9d7893076a021d19f49fa08e9d36104a1eaa4ec1e1773b946368c46542b98aad8d14fc5fe33e31914ff9cdb4737bf4aad2ab54089a36907ca60f26dd4c5721b83d23e226d533fd7685698e14de28890fbe692719e70dc1f311fd65b41db1b5ff4c39c704b67fbb3a4383541833d847d910784a6e5e694a8835d7f3822d45c1f338db2d61ed9e054cf8cbc2471ae7bba7973d107e76d584bc801362b0018fb034616c87d7010b663f13a75b1a09e34efbb14c1bd2b6ef2b009f3435c620fc0b23748268dc87445871329a811977678c35dd09ef0394f287e4e1beef4d02175d50e0a132daf6d54693b439d6bde9c0fde6991aec79a7ac35d9d617f1bd2b6e013d143d985ac63adb0746f9ce8fe7ac1e9e63e3b6bd5558bf700ad3df8f136cb158addbebe47be1605c395ecb07e76568cddbf8b04724a47f17ee771b4b409fc8340bf0b0008e65810329ed6eae6fa956e55fce6b9fac0c1f61ff76376a4973b04fcd1077278443b78c870a2bfbf6d473856dc96b2f41fbfacecc55b6747485240c5fbfc3d1e3e86e68df498568f373491e94ae218e8ce0abbec39a1af288507e0a3253088823d03018a12ffd8e1c02422142b11135e376acc283c7c75ccb4248c9e37ec7c2daa7872c6b3216c3a6fdf93e1686ccadfc1a687a6b436e1bd3f6febbf197841a6ebaee049bd443b24ae2c8b58e93b66f2d48893708b151d828cb1a60db41cfe756a6df41c1ab16c26e5d5b28096c60e20d8d6998ea7624ea305b16490ee20dc238d7c5646b0b028c97aa0b1615754ebf035594006f2649fa81039ce51b0cb0237bea5adcf69889793d6563003152e25ea54d931e25265361a170f8c57e367983964aea1c02b83e00e61bfd66fb69de3969b1e132ab1ab3b8181fc45ab6d3ac8b2e660dc20e0e72cc283a24cac24e74d7d73ef8fe4f67fd763b6c8a153388db829ae8303f76ffda236a5c83ac245548c2645154d1a0929314a1e3b4a592aa7902623dfc14ec00d6bf22dfa46ba032ec8197759f4d3d2f173bd211de5c42dd27931ad3bbb2cbb5fae7e85fe1b9b45bb28df73812c18381fc24527351d9d28549bd3b4619c99483a9463139c5f6df245d5ff9f559ff026fa4969984c97eb02761d93a0170a9d4fe84528419ebb38f412f701659ff36381cb2db1dc2afeb6a58027fada26ad41b8afe85576cad605326ab56e2c25d07932da99a55b97f807f8bae38fc8562f8c6bd8a57219ea59db949737cd5bb0df3b216fb3ce7d5b2de5e36b77dad36e358750aaa50894c4ebc302e0a6a65c08c7b036d2a3b3ab3d47584edd0b6363386a38506f109e4e2135c4648c2a8296f531e05a4a92dc4b07eb682156c8b3e17a73a9516d0ebdafc8dee6a2e4eae7713fc5d47321a8d2c77fc31e441fd551b3fdfbe23ceec5ec1f838f31a5300f6055ad2a936a9d0c1c856e7781a0805bc54389a8e9fa3860b30618f0ae53b8c072aa0909252807e742ef9baf991bc08298f8e622c87293059acc50a86495c326a7d819099394a760cd6bd0126f9e29715139db12878b49dd2ad9f3605c549a688647a6d3e495c4a04463d3480a120151787031202c2fa10fea96c9bf9c7686b09760770e2015a7ce2f3e6dfa735d91499504b0f3c145e2c36369996e2ee4cd236389566350fb9913176466d0b0692182315d20344db455231bbb2d141987b7eb712b097a7b2fe097823d8671cb1cf924d3e3498ad96642549cf54b5a66468e3049af59faa998c481fb319586cb60605604fef39e6c42f1816e7dbce81c089819747b0e8ce2208ff907a85ab6b91ca0404b16e5180e30a9d017bd486543b71fcf79f9f0d72fae8729300a9eaa9c38ff0b3093e89fc718b369211bb67ae43a697ae090c684972bf637fdbf29097c9bc6df3bddc4dba0e257751401d0ce0679be4032a75a3a237d224bf62fc37c622f3ce3f55c4175a077dd1c76d65c0ab15c684cf6a872a2da8d548ea4c234ab54dbab40e5782615d0bd8d85d10223d5edcbaec4b4fad763c443d3278ee1433d5d87591d949a3d62369dafd9acededd8c3aed7d1f5055126e987e93f3df2badb821b8fa388284c05dcff8a3f90ff82ba3aed2c9a3f31a8935242dcfe375f5f2ccd8095fa4b8c1ca5cacc67e004a0a9245b70f5481de6a351065af58b068efbd9459cb349652c75eb07ea8ee490382cbe2d1f7a02148c0b090db97c0f31e95589f25831b85c721f7f9b434772bc2fd12fb8e302f1ae8ba8627045b9b141d637e5dd9d5671bac5e1088ebedab211ed612004a2d63c724b420536e8f39abdbf67940d516c99068c842fe8428ecd16daa3381a463f0de835a199678974f12d0bae3f8a5db95bc931d19bb2b9adeb545e612001b5838999af8cc70c1082df1a22d48e5daa86dd8a1b8df4f40a7d3351e2617fc1d9eada0c22cd372b64668c0b6ca1288d1f1a47d1b283e4b41d47ce97cc6cfe6398be28c9f72a90cf -MD = 72bfe4c4e0f6faee65817e0a46e7b720560d2d8753267e398637ac21795d72f57469ea2a0d3f6ca65d948b272d5b5347 - -Len = 89728 -Msg = 0e6c9fced82669cffe7b5a6f09dceec8f95bc397e7bd55f0e9d10c3036017a348b27ddc8cda2ec62efa8d01116dd70b0fb25f15f91b77d34e974442d5276c169c4eb3f987f249bb1efe94be3d3109fcd9e4e47f11d4c16665bfd06cec2307b888261cc2737d5ff22c6e6d4cc879b0687aa7bcd35d3a3a7f0081758fbcd562ff88d318c5b3cdc9f1e3b4672b77ca62a47e6568a14fbe5b839b868449cbc106621ad02871dd862030e17b12e89f85a95731b878674dc39d2a93298d199d788a76baa7cc656518fb45822d10f2b44dece7511b6c93fbfc87ca8405007da66e37a3e4b4850ecf08a3966244b1d85a85b5db3908a5c5becba3e9ea838ef48b14c6702590e2dc9fd7c1a9ee5ca607f6bf9cb9760ab46b2ab36a0f333f790c900e9f71f9d7566d3c08ce06a2cf4e102d7df9e8748c28f2a44642b0fa936f3469ae2b1fddc2602f480e31231c371a7f4323661ed127740adfe6d665bd29c1ea8c8601e04e1c9091387a8385a70eaba3fc525993084715f222379d93d76d21bd5d28bc49d730584171b04db4ffc0723c9d8d5d0b86759f770f9af0d1e5c7ff2b7008a2d2e59827aea851f82772f6fe97cb36e8ded82d60d81c93889674d4ca9359986e1215ce9f3730d20b53ad0cb143e9d1759379f91ab3cda3cd57e11e04a36e7a666dc44e2f79afa30fc00a9c2adf9e0f8bbfe8431d88976e27acd70e5dca4301346c9d9148f479676e03180fdba94c23a3baafa5f9d50e352ffba32006866bdf4094ee228c262271be8351e2346f78c0561a3c9c301796ab5ecaf1edbf564d67235d529c599d3f6469d754bdd560a8580b651b9040ced5333ca13fd1e8b86c3b554c574941a824b208557ced3f4b5f7d4c11d92cbc692e6f3204e977132b4cbe4ed868c3d4f586ed12a4471ac27e028280a6d1bbf38516b1e76c8b47af3d6372789803967403ba68014a5fa11f87361a51aaa1d89691329db55e81ce4d5d44fa8af1b42baf4143c55c9e032a96d56ea73783d61d061be695343189655e1965b8ce7bf71e073cc7879d35fe11d91710bb9ac8cac3d293b73adcac0ec751e04a3febad48c7ec549a214ba88cf1469ac0ca03f01c978c8738f127246e4ee94076f24aec25c3ff375024d04c5c337fff0344fb8037e28464d05aac21347654b8506264df1a9c80337e04d3b7d872e5a23cdee9ff995f5acb01c9c428fdc854c67b12d1fc93bc40076833ce617e1a0822f1da77d4dd48901861d117a226df39e96b861abb3d9d9ef1c34418efd9a3580fa6da0d96604894db65030f335c05a49f963e979154dafda103b84ba967a965b6e04013baceda09828fd22342e9f605677f9ed11585defc83ae02ef24a486b1b722cf32b875674ebc46c0ec577d0adccfac497fce5d241c2826b67bf81ce5bc9ed2b9e325f08ad4d72e51d2f761beab3690a0dc123734ccfd02356a7a3d20f6bc94a29d79cccf4c71aaf77f9954abf13ab1477e8790ab9f70c512434181d2f0cedd1bca3a668f160a41343ab3b23d3f5aa2afef9515d2f421e3df8ee497762b14108811de6a44b20f859aacecf70cf604d94ca7d123657b9ee2ffb5c9ca75064ad369dcdc24aaa0ffec9d3e9bbf75a5d7c9902fc235bd963656f55067a77a22c19a53b3ba320b8369faae68466811df31f82cefcee945c4969442d744cad00126d9b81f0f2f01a9cc1460d2738d5c02a1f975707daab8871e3f8ab2f7812111c9161977315807b494de36e5b99bdea0a6220c5a44f6607e5bcd1f9be686e7e546d3fa64c769881462cca31a7f1ff439cd165405cb58f7eadda183ca98289eec2ea7cd6047b02d49a44437f94a86474e754aeefb575ec98cf27149f79302a0a6dee624e228e851d4d7f9580a926b425f3d442fa39f546fb558a0f47b5d91b7a5d6237372e16e80468c40a5b6ed4b7fdc9376a8a709e644f46ea4f5fe5e422e59a2f44b8b07bf430f2fae8396b1834a570676ec7e1d8103dab311d0d91bb08f42d3bd1fa3124714af30b7841295bf5c5f04a96d8140c106c8b46c17942c5944e1d702625397b27f974de029c2f06c00452ca29e591a02d86ee1183cd7f6a909b72b58a604ee7dde67b5bce71057f5e0a9dce7118e1fe2f30dd7aab2ed112c28534f147d3fad05db9136a23e934309780d93db4978b8cde145e6980c6bf25f4b26c0ea3a7c49e6d1941f34b2c437f320e0f013b8a17b402da7cc64bbdd10becca22f3e70434bad6ae0fde8c61bad6f95b46014e1a0ddd622a3c79543b8f2d73765c885a11d38a5f2184132fb0229cb2108625356ef66ec7aaa86ae36782f1505e24b546f72877d21aa87b7b42013926d4d75537b05ad1f905c782406931c04d298162f1ddbceaf64084fcba3fe2151d5042799d05bf6dc0e1a1a7b36a2403307f7c77a4ec1549923c1f7f32cf4a985f2cce79b097afaae4e73fc28392e420c20a1bdca74cbdfd6fb582ed2d18c32ab30f843db58eb1f02cbea8bcf908f881cb6f687a42243c6f5554b32cf145d433e2a16aaef7124ea7610ee47b5df5e88c13596b37bd9c18060bc1bc26c67c061bb58b8bb2bd490c374b81fce9f7803dab616e2bfc5fdedb295ba3a4c1f6e5df4af175ec324e5e7609b2bdf7ed0ed27e457e56b0b2720f0c420ba374e7c8aae92861069717f37711835e6add6eeb1233c133ba023f3c5a34b8e468337f83f0ac1ecce79347f4bd670e1731b756d769e58946422a8d06e5daf3ae9be97170e2af92f9c0e8ac9957ff13a4ba8c8c18ff1b047f952f8217d8865b31e39fa5d7a57aedb1389f2d2a6d61f8ceac64f8f6fb5d9aa85c1908b95cc15834e95c0200649598bcf7beb1ee2916275daf4782bb8533b3873ef0063299115281542872324589f9e2a650222eb1a506196d3e12adc726b7e6e4bd63cbb601b1decd0bddb670dc7aebed5a67322d96ffc98b509016e6bd0e8bf58809ccdb16dd14fc0e29d50e19829e73e66842c6727837b486e43c0d81213e1a57df7d32da3eeb88383fd447c578c4e1fb0da6a3bfdb298ee6f66862f856c9fb34cd25e0d43c2a1a9207fe426ac625dea23ea5ee088f68c17baee10dac16f33f26bb0e108c409b5922699a288fd38913e2e388ccd2fcbcf64af5f13725ca838f36917ee88bb004eef24eef20bd07b827c3e49867a78aecd55db1de08e9d842926a37be9058f62e800a9c46537bca79c34d291ae70ea1c205bbccf1a782aaf8f1cc9616317b78e1b8703de7e95184968f899a597490a9042f6c2c723d78a66c536494cdf37da0e43e2e171a09c79dd5327e209c34b40a7bfa79bba9f151366861381a2dfde5d501b94c1427db667dff5534a12a52022cef0fe95fddec97c1b2c353117c783b7efed1d01b5588b58ddc9fb4064cf402782815c4025855d1af1320ba5f038b0805a42fc413ee383d3333b905384a433d54edb5128b60558867532077ee0a5fd2d1bb7b2fe6381284d8cd4a2f1e6c663a290797dce23e1443533a6c90a4d91b244a0b5c1a7b7c3f14e573fb3b9ffa8581603f622aef3ab98ada90ac106bb7e883d85b7b8cba01e775c0eb7430a53bca9b5f5bbe029a9b6de5641c87fc2aeeee79e375808d8b11302dd3fd5c1617785b0f9023556ecbab57dd59a7a65ec9c4548dd31f1225d6f245c685735cf6dcf960655a61cc756ab0a0f922f9b13d2f8243481022d95d83ed4cc83d141bd7de06022624dbce1f5ff36fc225da4fa2466fe23002467f3c7a4a6eb965a742c104e768d9585a017592bcedbfcb122894f5d55acf1252a9cba451d22364f578bc36e3bc065da60d7eeb5341787c68e51b24fad2ada6100111e74aa18da2c666d15c4323359b879b4353ff9575a1a62e3fbb27735028462f162c7c028087e1b3075f50c7ef7ac553cab0090e3fa092aa09a3a46542febddbe25c301e837b100867254fd0bb6227dc1decb9d65de3f50280c2b9cf0b923dac7e5dae1c1ee6190df7978b6622bb77df44ed571557d096dead01aed9314a8e4af1193e25d930c569c19d4bafabed7b03459d2bf2b6d13fe49648caad3e90775e437628613dc1dcc5cd20d6d6de60fcf12ae27d96004db6bf45805770bacbc1907c5eb3f7d10126c821067501437cc150fba69429c0acc415c28f9b4d2b623487a5b828101d596b1bc739705963aa94c9bed0b9d27b55318f135fdf6a1bbf98ecc66ccfd3aa2f7265c79f0f05c5503b047d4834b9bbb2c5d442d76aef1149b566e561f069ffec044f27229a2df1d87fa83ff64d07072a488d57de86059668539e0c81d3f9a5f9e981f1a958fb70a8285d0dc24ce4e8258161585e79d43184393b42b3c0ac22bce9a22d1b9295c92afecdee947877e50b39f94f3e8c836a0530e690dffeaa009fcb5ae162902384c4c99eea541ae9864538fc4366073ac9540047fcedd61ac609595317659ace2ae0507809ea7a61533946133dbd3223d7d7710591c69024fd625932d60cf8bd42e55c04543ee008d5502be6442d54631bf74ac9545074f22c1194a2273ff11a543bb5e9d238940693f2ae1c609eb7251d1c553a4f74c9a9db80d24910e6ce0ae84a23d08bc1dd821588995d99f6a18f66af5801891bd9749316dbcf9ce9d8b787796e6188bf05a4e478b253f81e5bc97d161cc50a2bea79da3b76ddd0305449b8325d43d01c5296872cc2a484fe2dfceabb692fdb8e45e03b576d1bb6a48de804ddb91f6bbe0d7d860a90f8467e5e50360407e7032a32d23bd28630552bcabaf2e04a9c628f7d846a7ce6f8448738ece85bbd948ae9f87764158ac5b5ae52ea0aa4d863bc75ecd0bae98a4b88ff01f9882754de79b1e1f63d864081df166e9ed4912b1b815aa08cfeb9459a1ad0029e9fd0956fd76c33774e8e720dda4966ffd9100a6dba25e2debf53df8d00e08304b4be45ecac0137242096e610ae318234a0873f016ebefaee832120cb4419cc524f582f00005835233a04653364b50a65b15f907ea50d30e5d58ad0fdee6124b1f8081a51dc59759c2441b71e03bc45bc9501c68d67f9cceb3af6b6ca04a2d5493836cd8747ec3eb867b6a47893307c5ed3d3a9d5bd6c15273ccd9bdb90c325419648114b4af9da9e8acaf4e91df8f776f33f00ffae4e54c2627847d799ac5dc29ba7ae45ec688f7815e46e1ba7fcfe2a7eac95b24385d2e4345d82672845c4f3cdbb6c1c3521a66b916edcb33c24d9a2fb822e9783fad4b33be514334476a4fdb7ec13782d0c66a185cf045ce158cf07f22894557695a55afe78c4e2f5274307dea36a03dd121942796faebca0802981eb088f95243f8cff067f5b1d4340eb3acc463a624c190575f5b6a47b808430376f89e6ff96ded0cbd960a28b37a9e2be083f4b40820a7463820cad428a4c29520513633ad35bbae501855ed5d84a70ba1af4654388ceac34a7d990b9c4c05ff9360eccefe39f927506545aa22f0bdf568bcf5013654bf60fed85168738c9195589e2eac5cf91a0a56e375d9b42d575bce136d359216b991cdb780754ee4d9e8e86f885659e182b9bc3952e681b8e7c11a793b8bdc515df85f91a2bcaec3537cbb5b66576581e7d7f8cd696b0c2203a80624dc5e658310e6fcfd4498f3c6a2c349f8551a1068adc7a52615d1b3d71f82e9cccc37de2a66f04e60c2b4be6d3c5f3cbce128eae4491b49ca04b53966bfd46dc7879296c5e4a6cc52b97a7f0574a2dc1f770e45b33e354f2fa27fdd5f593eeabb9b193fc40e7cff49a564a64e0020d0a6a334c12411c82dcd7bbc400f6004e90f731639d348d54fcc030de495536b82d8d236ddd558368e39fcd4d21588d90139ac240542285236404ec08a89d2e59b2ca08f0c3575f2b8ebb26433f0282d9bc0a2cd22bf21865b4d0547288a232162288a97ccd30f9f666918e4c63dc275414af37c2298c8b42758b2ec4f14b8a17042ecfba01c699eff28acd1094cec326a2f2abb856d929e12e9c43a5ec807d85e02642516902863eba0eaa39dac0a07aee394f5bbbbf396b676d5bbe7f2954883fd7caea0dcc0a0c4686ee6c3d9a047681edec545f270207a8653eb7b52f5847a7a92f2df30d6b811f586153c6443842e2774a4a4bfacdde7aecb3379378ceeba30438c125abf2c4cceecb967ca68407993d31e6851ee218646a83e623ed019bb850af4fab90e7fed5aff4dd68a92fed2fa969d0177d89dcef47766e6c76388070f55a7e8ba29256c302a4cf9033831b2b22b9af08fe0a52a1ec547476fcbac2525b01f7cfcb3af51c51a214fe2dc6ba150feb2c6188aca305bfe5a34a65d088e6eb6e627ff229026b03b755ba8041f176dac5ee2905b9f7a029f1a0ef9bc2fab50b6866a1ffa5a63580ab3aca123ce9d5ea109e685c7775fc933f166d84d8424624b6ab3fd9f709042f466a38cdffc9baa793e327752f46a06398abcd0a5a85219f21da606a67525f7a4f8e0c98d1baad7918666d3828911403c40716148feecfe2719b0d993caacfc8904d4c5afce437c865ce428dac7fe1d98bd35089c0a2d7576e954d4ec038db82cf5002fdc66edffc44c4ae5c01388e4fb5b7835335ccc165df71287139250b0ed53e356878812e7d7af0ba8d70e3a3cb095ab859369216738ed6a6ebf098e7d56ac0ee835944abb4d2f96d0841a9a8b75065f7830b1c5deb416dd0a22dbaf83f557e3436b3e0de071388d0b5bcb1267a527f46b9fb931e34c1dead7f38b2c5b5601f0f69cc7c4fdf0444e97c2924a57cd751afe34f1fe2b6d6d0456a58a9d69d514c8704ee4187a56fd6c246cf29ab25a78339e950e72fd947eba14cd6c7b460f1aca5ef5f570dbf1ae563f9f7e9c2dd89bcecb343149005ded8c80bfa33e66708e8701367e56997cd1ad27fe98b710c47a4d12a73cd8aa2613fc2910c16f4195ea7f15650132493521d19beed38411aa7e4ef34273ba71899c798c4549767ddba922ea1600bc51d709540a04b18b86f72244fbaa6866ecf4e19518e1adfc61de65031dde1f2d49cee2a4d0c4a5260736f0bf7a539d5673048ddf5d6a5159940a88a02f019f3d97895854ae9330fc18f6842f1db28501ba14eba8d843e6269aec9e8a7c451335d182d4e3e214e76612923714546bb21118b2a58207f2deebcce11112a3fd0dde8e67e2c329be3b0caab6a3ff9cd3a6dd157a260b6b1bae01d0a47ae924be01700494fc82d3f3ae4847b03541757ec5fe46b7f7a57012d6111c93566e8cfc7092fa969ca37f59b3b1503b659a6ce1a1cd131884d0c57cd982274a1e233b2ceddfc6f95d958a54ddd07a94df6af190ccf200f8782dc9be3aed77154ca7bde3db8ef01999d993799f1e2d78ed239200a9e5a6f42c0d0b5b7cab82916c5c93a5cc491c83dc00193c79f2cf443964ccb5cb106b883b0ef8e91154e04ae7b24ae7229692c4be799a21f116f6832e9f0024931ac5210fa410cb9b7206be6959422c90f009689bc684ae86c329a24742ead1a46d5a5b145ce1876d7b7c484bb217ea79ddc6cc1e776746cdbfef4e0df0db41817081930399f9b129d99785194d4aa55fb8717b910cb09f1845add30d196ff88cdcd16547fbb7bd33250f015c9b48f1b5289003ade70efc08fcebddaf2d076b58fac04e4bf2aa202be64939801c91340ca688e0bf96c102125e2fda7ebc302e6862e4ba9a0f5f6e6685bc8a1e51c1f0e8aae28f60ac7525b6e1f035f64778962dada536bcb2361c959bff9fa1db49ccbbbe238c1b9899fb8910c38ca04f5f472b23884f1e8bccaf1b9178d69509a70c0848d2535adbbde7eb63204af74442c5e36d147059ec918a7afececb726d485350e36571a8f65f7f60717d0d85c6c186e902c026d9550353363c57eac496cc17280653638068dd168a945020b62769feae5d21ff2765c08ddfe2aaa0f5e690ebe03a32a56bb3d561cc74404113169ab196049045ce9f279eda8a3dbaa10d45363bf769b3e557c6d59879a3cb26f4d2344261b1b73951c70aa88b9764304b478a7db69f1b67d53fe6911d114b5c52aeeb362cfcaff23e1d55ec7f3e4a3e51164d380019487dbc8f2928e71f2e4da09f6ae3aee7bc73a4a904f8cda8d9259f4012ed5c8ec7916e62f1d2600400557f1227dd6ff9594835d8ac500f4d9d70864360203456253d7b29e52000865e1e3eb5a675f8a802ea624a90a4bcc313c9c69eb9531005cdfc53627784510c94027fe86b5fd18a35d4aa7d66594e7fb87ba0b0831888243e38979b3d81ca1d4eaca328fb0d73068e917edfa1d03cfa0810c53761c30528028ca8328bbae42eea6758f5b9d165a3699b7fefb7bc20b89f23a481b9e50f87976315d7067237b7f3dd01ed3c7e11e7636cfe2c3c7f6231da2ecf2e00110fd9894660e7125a2d4ef7882e6df7561058e880aa13849ca9fc358c95aad8b99e8444c109e153c53d6a61d34ef68eebe96e7570d4444486408e5de79876b861341e464d71642f65f080df48d42547b1f5ae96b83d3ce0eece6eafaa5810038a691e2a5657de299eef28ac736e68d64acd7fc8c1254bde18bbf3a75f55156ea785ea5d75fdbdc6e271d865cd6e3f9f18f97898162d1fb0a681d3d1610fe54e3b43395c2703818bd33106a7c1642826aed22f6131c516fd0ad875ba79f90e16d80951a2d3e9d7ece3a539cef9e0a0f16f1fead0ae8dd017d7f86fcee4910e7ce040e9ce27111f6e8636f867d1543873ec0b5142e6d7c995808a188b5b7854d4f6a2583a7b29d6854d6eb8eee24f6d42a85cf954654361fa8706067c290f7fb38d7633745a948bc5bbc4f1e09722add2266d2971c44137bb6df4b01dd7d6fd8d1754e2084fd1ada433d249d97a8e78a6e8b488276e61c96ca7cebbed026f3ce616c70a72b561baa5480f173606d35c3551db8bd1de258562b6fc70762328ec432e45132045e5415d8ae3e072c6a1d702044abb2d9dfd0a423e167425a4a45a38a04772bd5bacc0115ee94c3c346a6791827a8c871858a69f8fa54d981152251b2f46cf867158b585469790eedaad9c682ef3767af7e908bf3e115329f3c2cb7f2ddb80382159a00dd467850713ebc40a9c3e0f7596feaf45cbf32b77c666bbd91e7e1b2ed6200e3f8ae16f218a95acdd4cc2ce038039e8a7bbb34cedf3ce84cd939716f72a5c5e7edc9dd5aaa94b8564a32a28b14e0b63797fea2e19165aa4a10fcf0a1d786f2f603be54f1efa6e0c4541ccb5eb5ae39e1faaf04575b8ab9a17f57e4afe5ac8ef784b6031fae88d9fd3ab22dc2e2163072eaf7e39803531e376e73d70364c0a1d1b6d8734db1e1abeb441e522065bfa2d1b0fec50c5167e0f6257750041c69346ee24d2be1be5a5f75ba85c2de045397e694eb351b0f6f07c4eb8cd81ad5504db54f3cb3459e9bfb82e312036688771899dde6b82d03129c8b0adaf6ad561df78e47ce94df194b8afc08ea9f1eb8d52bd2d519d8aaf6f9a632c8883225687737e1102b5519f61211ca71381e705e15db79c2aa1cfab1cc2da16ebf14ebd3061796f37a7e5aff9a9ad4662206c340df2d76edc10c85f9323ac043a625655f739e9638e49809fa882c022fd0e17e28d92bb19e8731b399d3d3779166ecfcd366d4c727902a90b087d03c136b360bdcaedc131d2312ed575803ae9e26f118f986c21208a6bc56e93d8d6a5b1b8ed124044882b1be3899fd69cf4db40fbd22977c6f5f2250d6c36c526b7450077038ca8478e7a380292151ad413c1949d78076efe497beb4013f036f7242375864a894d5732b3b906feb1ccd606315fbc79c5e8827a024fac432743cabbc5b35f2894c9f4134c1179261257034aaf24d16dd17ef42649c4ba80488601dcb03c7a343b88cebec7d3c18e9363fc6faf6684baa68cb3cca6ecf341d0784d0557636fe3ea142783ab7288bed15e21d396b74ee6d1ac51eb9e1adf0e6b94fcd43fda98ce3ce69f005b60272d48b0041519798888df584ef1b3e0e64c5666a1b7ee048d39809aa5c37c3f3560660413b28c3fda072c1b1b7d7cd191923d57cc2ed673c5dc618adc3b72623beeb5c4f12a836cbbe8446f37fd5d6f79669cf2ecb77daadb2d6c4192d6d27b932eb47cfceb83a296a2b4cf34efda1cf63fd1c283d0680c2582ed596a2410ede3a6ee86c783f153f2dcf9a582c3776ca094984112081a2a4d93813ce2b1b22b95fdc08cc172710368ed8f9cb216b9c100fb3cf917dcf887bbd5b4666cfe3ac73289d6f97b357733616ae31f436815cc8fda5c4525bda7a6e8afe35099781f4331e19e57655b786664bb90a7a7261fe1a5c862cf9c289c0a5ca8ba95d89dd4222c7b83210032f91efb7614c06def3ca2fb2becf31bac4a14904696a0ab0e0de68aee31d0fc7a7dbf9e20fbe3f8020072f8ab575a04c736682c10040b911700f2c58007018a907adab532929ce62ceff4269d2e6ee7f7f587788b8f312b6761f964f79f1d6b0374f2d9219555a8ce6f88ed97fe9c45ccebc51e1f94abca6db54cf1ab469eee41f09a827450a8c04513b3e612448cae949dd37542b0e60e985f7ff411b9f0b4da823449b17100cd4f510788a27c9a730d802526ab607a5885e4f4d4c145dd3f4b8e42874f52e8104bcbe64daf13503396472caaa02fd348a4da6e2c40969eee038957d3d492e939a8d8f2cdbea53880ad376c69d77b8b4f73942e631618c0519117e6a7b7ad6eba04fc9f5157aeddcad0f566ec97effced70c6c8019848ec0a829e718b8f0ef311decb5ea0f0ac9a72afe5aebb87d9c2a33ad6cd806da37c6946a18ae7b13400d1a4b9b305100b192878aca65f2de556f12048a177fcb4fc0e5bb58554d4b93259e54c3f263c66a44ce9aed03fd07f3457df90e650dbf9d55a403f135b500ae24b1ef7456cec2bf6607150cee63623e567b743fe9361eea2ed82c29753b9a5ab05b04f884195e77a038e56f4eac55fd47145d67cc8550fef2891d493e67815f71a57b95a5cc0159996bf15e4a5e4afac3509ccc357fbda14abfbe98b7c21d8511963c94e16f122ffaa721210a03a8fb703819b64daecd9bde83f76009d3d7943537303d5f8bfbbf6af55dffb722d7c9f6d3bd6f3c99e9b355dcb0e75b221553878e3dd748a723d2925c8d4279443f2cfe2a6e3e29c877b358d3d177d638408bafa64cacc34cf22f1ae4993077f048eb3043156a3cc4e1618e6f4256a19cc10455844602f901d0a0a9956912daae5ad033289b3c9f148d85a0b8ebcce6d6fe8620321122124e25ebe778e62fc906dda1b0e1e6fc7740e5e935b6b523ca6f61d9b8b7975435bb59d97e94f6d16d8139274e74e0f2efd14f54f67286a177ee51c4c61bbedf8ad1d43213f1823eeea6d62ab6eb70652c4e358d8af3489015db3611f266700d3a17ffbe519873bf73fe1c728f4d7d9f593ffe5d9b41e136cbbf7786e3a194246d164044dd90af9c241074c682a3f1e69c2c128cce653bdcc2217eec42d4126d4a54008e62e1201d2a6444ef37f4b3831d9ed9e2cd663cc92289b20ab605d230fa5ba8628694ad8aad82f5b65548abbe051dbb27404cce47127f7baae83ebbb5a5b39e89f1b03d2ad4f3f0e185a8c1de7c2f2022ce20d89cba8c41927f86b74371e24ccb4c3dba46c83e9c386e1add2da95e709c20e9411143376c8b24e6ae23897218ef3f440b26b1eb6085b9a9e7f1b531135ddeaff3eed509645d7f64869e13eb6cbf71cb1812b682a68e0d5ac773c830712daf7ad57b978992d0370b28fa38d3af018bddc952ff8cd51c133765fb08e4f2d43b53cf00b23f5cacf5e07c7f1fb4497e347f062db59154f77247a9d0a0d4ff192b41c9c44eb32bb860ed6a77f115a2fe15bbb7ed00178de7d3927c3cb689fec5274dab10916e68bd2139db28d57f2249d698c4d807a8e7b4de21c485738959a0d67e5d2ca6f77983dfccb5dbf47931261e1f1537f3cbca253afb6bf4fe5e7672e1dcc860b3d6c8d243afe2d9758b375e95569251eb099e04902857d1808fbf03ef6fd2f4e194bb72f5e94867813d9cb9e447247018e8cc1787b1726420a59a1ba940642f57b8bc2a9c82d1d04018c8ffb3fab1daa2f2ba27c89da2f407277181b756675a3eca32c4e083645ad9a323f8a97522d8b0afd1fbfaf4d1cb5c9dabfec0b9c1bdbd5285066bf3e84f7566166c6fc260b26aa6795dc6bfe62f4890b05a6c725ca0fdd91cb9e2da47f53bea0722ade952b0f95f1b13d405c969f387e85d65881e4b25e661a5f040689554b65fe30af0df1a85621de6cbce62c1840abbce5003f1055e02bb913b2e3376e75387772ee1f1373538e99e5422997e23a19177d8ecbc18d0b492466bab90e21d47e5a6c2c36f503268e503160a56eafad5d21ea34a67caa2844f8d29c0671f1e1ce3386e9f40ada47a7bdcba8d814b2e2de68c5925d964fdfa582c1d74a0761159e8f4d97c4e96b2f612f3e7b402eaea323589a385fc2d089f16ebeecf232f1e875ba3ac6280538465110e4686c10f546a28dd2973b76fecfaf19444d9d8926f2da60d8e5abe2b434fe2f67e0ba602945f254f92f6f270d09452edc99ba8e729d330fa286af068173aec73384b9a0ad39995a88617957addf39fc0231c797577026132229dfe5027b0974d1c4f8370399fe1b0afdd89d33aa142d3fa6435857f40a17c23f8d12c9c384b4bd11e4b7dedf86f2fb250b4c31126a1eef77cc25f691858a2d3854f439d5b703600c0d876182fa9ed3a78ff94870826dbc16b0a4b5e0fee6adb4b61df539f6ed6503e14a6e1c9f6b1ed5e528cc6d137610139f39186afcb9de352f046e68faef36a9fe5547150bd45730996f5f6083e475fef6778087f580392a3e2c17db09655f5eb35c7ef4c686f7581b1153e36a25682944d490c07fb6391452198408c8fc39a2aeb4884435ef89bcf8d35c7e2cb5613308c4dbcd01d868740931358aa02070165ef1f58bf07a88cfa119cb994210fb9cc0ec93e6127351d9d227aed9255e7d1a429949247cb46f10a24943bd50c481d6eba08ba427f36fb63b51426cdf22cb3ed81ef5b64129c7108b063752bf4cbe721785159fc8f51c89a332a2ce23f9e4e4adf77da9c4470b5fb9c529021415ebeea30eb4216be502d4a86042759a6044bc22b75387ac98b64ebd0a9b43c5bca4ad3ca1f9f1873f9d17c95ea3ebb8d27515d4d319c8309b527e033b00806aad634e32f35958b18165d384824998e5ed009242df32f416db5a6e3afafb506974c242245754ef6146d788487f9615d80c51a1eb303183b5b5588fb2bede2c488f2c199f526f2e1cfc7cb6a3ab3bead5bcf2e54c8a880f93c5b763190b3b8c9e692b44f2892a8d4b1ebfdf14998d70857b5eacc522c8f047990178cc4495f9c1af2a44cc4ff995822a3b7219cf1d5f5dc41f8903ad56ce378bc1414b0f7fec58adb3a99b2b6edf48ab5a1031c05dffd523900a869ec401ea3a714d13c05becda0141e3ddbffcb3151ea629eaf1e1ea62166a91ac6b8323e6118c0cc51bac63bc367f74026215b96df0aa3fb3e82ba7bb1909cf038836bca19d9c00cd55f3f975a9a6eab7a66c7ab9cdd0b20b27ada016b7e8132a993134a35b0bb99b23c506acf762a85c11434f8f12a4317f14ea6c2b5faffe6003251461c66597cce99223a89c3d4d6e274cc0644bbf2e8e5464745f8cabe1625a64d4736c343bc13bedc92f04913a7c5ceb75cfe56c19974aae5129db767c9ff3730d4eb8e216167f2a7f76ccf90ff526a1d8288c4583488c1a7b20a89a208782f2276a3919a74b47fabf3651ff2e6718f250148cd5ec008d4b6aca90816da77d44ab4c69257fbe1ab0f0d43ffe2640a87f760a8387c46dc2b3a88e1fc6c47e570d116bc5a0001d6bffcce6e3808820598bc270fcf59cdec0e5acf192c4b57a849de24edb13c8b7b0299bc4f920b474a0b9cdfe5589e5d20c53e08bb615c13a9a79a67c25eb3a3b8be0f614cd494bcc128be0f919cf2fe60970fbb2e634782d0d42d66a12b0e5075398545cec84ae753364b3f7d63feb994cef570dafab3ac0617bea9f3def59b9abd24ee3e34d6d2e67f6af710756995a4b017b027ee489a31b775b921400f8a0f9013e602e1df85634944c0b299dc9b78869e027d06af533afd7b1d91190528bcfa7bb584970e06b3dd0121cb99ffd2f897b1ef440b90df0a31f85dad317e7a894584e12a1d0b5fbc83c8a3c33b79420d2d79fee4c69247889b1302dc4f238a5fb755f45e3d7d986882c1cc0348f3f39d8e1eb7c5fc5e929b82f593853d9c5f249a177687bd0cb79e241527f18714ee9103c7a24f789cc82d30c69812c19001c234f1ed0c6661c646afec39f6c2853ad2d49c48eb01f3f225ebad9aeaa4a8791fce0ce3570024cc476c6d8c7bbfeddf4749c630ff5e0b176afcd22075ad8bce25af90dfcf53fdd28ba3c1a7e647f5e6d7aa6de2f5588d3fe6ab5eb21ba6e108ba21a46adc2692dff99c0f12a02245566c3eb8e733b72172803f79d844555430c86a700be6438efb799e805612188437ed4ed0c623436eb920024a1b58848a4c36d31d4a5570972ef3f23cfaa3f15a914122dd072bc31d1bae3afa02bff92b67eca4d3af927655814fe16a86ba74716d52020633b501d5a11330b016e17de086d225b9c3031d72fb75b13382c16b6ed2073673d128c33f52352c95dd27d751b3d09ef80d112c93a54eaabe771f9cfcc948054d69ecd20336fd75d1e1f7d125f5ce56b715246d6285c01634ed3ccfc159fdb9bc8369f6c85553558baaba310455b4961f64a5a687a6b43bbc6a80ce658a0e98e7a807f636b82012ecbed9c098d96aa65881faa0aa0d13637f785360916464ebf75f2e9cf6664af51ba7ba46868bd8ce89f48d2372c4c3d4a49e1d4cedf0e5f9133146aeb067bb4640edc78b7973e756db46c5f787d2aed65465465b20357a0c64a5b7f50bc4594d8516675617987d8575fe09e3923fbab3b7533655d33b0c6a1243e939b0840e5210ac0170080283a47fa4c3b03b13d1b1f4f25502ad0b815c4493444247afc19c0937ffa2f5b9e2fb23c15a262957da1a34ca0c2957acc32a221e31d7774e5a74993dc8b286c680d287dc360d0513bd349e61c1947826b81cd56b16c2e867c022e848c46862304771d37dbf2d764d62485b41dd09b9824a7a85025cc94305ddee1ddf5b8e32ff1e1f302c5d4e250fb19d92f2c951c2c7608b596c6cb5302d981f608bf5ea9d3bec26c6727837b960927d6cfaec343afde1987a30ac4d56e9d9ffdbd2fa464ced9bccbcd678b1db49ed2e11e3ad79c92db7e910d6865b5e4088d4b33fd268e61d125a3ae1c58433d0aaf9a83576ea185ec9c642e761a5ef3b8ee71357e51814d139176a19c7786800b1265976ae4dcf98ff7738eaa5f5b2e0d18021a49c207e13f84d7208e65423deeafd4e30bc6b96e341431b67b9114f393ae705ad5d47cbea37427a368be20b743dc6acea0a0c1348777413e607c16d4eb163e8fa9154a45fde40ab2a1ce8c9c993c89e2dfff7f1ce895047f0f6cfb4251f3df214a110b078d58d2c6c032f04e5d24c4a8003f6d67e5f20e00cee01cec86abe4a82f343983f04712684a67f65d1e49ad86b7ecf6b5ee22b05c35721603f7c2b19ccf1b403bc5436c1fb6fa09494affa7176d84b5779f8bbdf9c9af515903bcf867b022d9af6ab222457c55938361db43d2a7a3242d48a16961f1d4692c591f1ba168d7405f5f37f78230f73f9c0150f630eca4cd679818551d449db82e665d8dc25fc53ebc11293e4e4b7b781397e540bab3161b86fc3503844867e8bf99ecd1530b68ff463f2a7912424ea75a942cc5f87183893be3abf74f63df5550826188dc023f3c9e27902a76abed7801848bc842ce59a0d6fcc1a2d72d409891ae4016b5cab46124691ee4d3fed -MD = b1934f70c974749fe74769d3fc2f2f2e9e315f4299a739e77c7317f787d8d4d48a8513c237773f1a3af055b4e20b1290 - -Len = 90520 -Msg = c68094c26c7f017b79f126dc26b3bbcb95f97535ca412da5f7853e15fcb52f042e6492c857c22b26ffca5520eabca20ee2cec2f0b71ea60383ece49232065e0f42831f62c8b48581b458a541550feb6c20120113ad20f22502bc9041149513c98b460238c63f57b51f03dee87095de0cd62cfb45b42e5b34fb5c08c9a94a9559901305f1594ae8e9c834c7bc4234c2178c86782fd5302758f73614d4fa0e2ee8d953ee3589be814638512966d3d5e1b4ca874079170f9fb87db17e070dc7249eef6f86ae5f816af4f6c4cc8d2b61810c19971aca83b10b7d15350d0cec5fc0a259cd9502e27ceb1a8af378da53beeb46001ecfca1fffb3ce472a888b9fbc4a1d9fd7e3d91b974ce07d48f5f452d6678b08842822f5e1ded49cf9b82b2cc80a364af437dc10bbd46f56290a85308f3c03b732ea7a0d40d6b79b0865959d694716e18b5ab2cbceccef9d008132f5d3b4d5988ee0796d02e19ecdc05671fa894be4ec06150454b97c88db3420a5aa89152a3001d1c81f1148b1b8895566490f5cc9f4cc2e7ab1652c60962db0865799a82909f4840f2b53531ae6cc281c94e3c3ed80456dbbecb924a25953f87c02eab5fbaacdc2f597b249fedfef983ce2edc87718d99c700d9cab74a90ec230b56684c79bf653226d157488295c6d6e3c15b29044f081401af80bfe10c6d44a77f45cb665d5ff3fb5631add4e796f59a943cb5f8df2e6d41db48a6915e3f771517c87f08fd48ef475868428d6b066a6315f590d7a4791d31db871dd41cdf34d49e74b9ca159c7e8b765fa8f476819fcdc51a5c194574ae623ec08811aec90876a1bf1e223ce73c482e8c33a2b085104b301f7a4618bdbb53638967e2aa996c7b901c0eb9e9a5a2fdff7295209fad666bd5797de6b490be75e8465fcf96accb4408102df9a2544d2d47a72ff6aa570c9023ccc963afaa125a3b8bb220d98fbf70684fde69dd7f9546c59e768d571e7d58b96dff4540766160ebce118f09ceb3813f0fb263118405fac7cd0b6d2c602335f4f182143d62263a6781f072adc641e70af42cadd50e3989ecc7510e90c8a8b864dbf458fd19cb374d4bc1741c22e5124a71af82ae7a8a9492f1d9fa3ab4884097a1c87be5f9eaf7eb9026fbfb5107a37c2cdd89e45583ab58e128b870b01c7efbc77105ae7eeffce0d37382c1cd441b2e6a294c3d2bbf2ebd29afb1e9580fc40fd1708ebd3554a6cbaa4990e61404d9cfde05121f7987af2e1fe17eeaf8cca05244596f78a9b385ea691bbefeb1d47fdeed03a3e1ab879d2a5860981c2ecd9451949e208748872aebb45c5562232d6dda1ba74a4a5e498940579f65f3769d208c46b15a5f9e4a064df0ae0cc6e49a345fee62adbfee27f3fe821090e74cb5d560df3575781766a86fc2634d83728553ced9b82698f7ad5db38c46718e3da2138dc28cfa47407761ef9e2e802e59895cb5622a4d8be764371dcab3b05eb5dc7b51953a6173a5f6f33be8625d2e0610bf921c3b9b0f59d7007bc1eab5bf31ef6d6acbc03353b46fbce335a12d1914b5ece36c6e9779bb605a8c064dfa465e357a27dab0f88e084c2f640a6d8865e1e37527d735bb7178aa959d0c70067a87592217468f2978fe06db3cdb19e79b0a13d8edf1238f7d3e10524d48d362d249c4e5b7a3ad3eab124a40dc2c48d33f09d198942eaa7c03682c010b4ffa87d411f3359756bda0aaf160e0d0727cd3b84db724b9044d199a837832558657fdf67c8ea224f41317eef7f54ba84228519d620f1ddaf68de0a91c6f66ca807e2dbfe5d1bbeee05fdcedb261e1d22fddd564c373e46899ef59b5af8c0ec8d2cfafa6ea76e363cfe6983dad5133cc7fffe7950e7008e042e3ed569958aaeed1eefc31f6e89911f769a245352db215c71100a49f7dfbe0a5fe23f2765fbb8b223e8bf7a7a17d781b3bb39b0661fd4ca9b3a929f3085dd827b0962fc2fbc14c2840d74e592be1049fef24a58d9875bf7c5a598b95a97f353c8dac451bd74ca0789876cc98026455f9f67e0b373bac0cd3779a4013dc009678f7eef8cd5cce067797e2f8f0af87eabde448229fc610b3338dd3edea0a625a5171d6b17406c60cc9e19439df9dcc11403aeb9223b23421012f9efb84cf152f5aaddbe58c6fb511d3e81325d1479188555cf0c06f9a96f4e0bf63ef80a4a953f8ee972b92e22bc42a2de843525788ae31dcf033dfe9a99d46cfcb404a059f86b0c670fa04288a8221257bf8ff2801f17a4d6262f129fc98a7d32d745d6c582626c801b77c8d61da7d5146dd2453ae0092f0bfe45fd60065885c1322376363b0af65b20a589b324b8353e1566e44ed4a1099612e586845826ced14a0746562c4cf221a5924dc8c33d78fd40b3976304c879a0ea7877b4c7dc9e89a95710ca5c11a7f933a6dcbc041fe778752128217664c6510f6796975c623e11d67d9a3dd33f5e0c5149fd38ef44cad83c185d32345e39d00819acd61ea0f69259dfad559abf5f8187e37ae48b9569441d00003b469f1a465df58018167f0d34bbe710bab87af2815ddc1967e0fa0be5a141d7e7b20eb1da9765dc064ae5cd1e83fb8d1535575f345c9ca36af65cfae34f43abdb829245b53dcf8647c4bb7c793985ea0e1a3dedc10b8bdf94d6a17c65b06e43c2be151ffed79d47848cea636c65ecf04c6e16e551f212978e87b3da934a2b69426c7e88deee36e765a859ca209098677839c98f0b9a9791ff11785c96a8e0e30396b5c67d09022e9122eff8bc41f11739843e33188a8496907dda49964ff77aae43a12102b069e4b102963769015fc738565d199f4a3f6ee9d2c0ebbac9d6f6eb7c2ce3956bd3d06c4e35cd4f574a411db70e89c96332e1b11811882b9ce71f61483d5260c3a8bb6b10b30395cb1a4b8faf39cabe5cc3b79057b769115390bdb9afbdb8883f506d564ffa2164e537ae3647c625a5bd5cb7309899d693733b979bb9925b386834aed414f16fe32e0932bb869de2a60f64ab36e29f16d9864f76ad6fa58496c4ba468d6680353b2df99ec675a649ebd943594d3eb1730c1434229ad8de7acadd4bfc2a4d8fba936a6dbcfe1acaa199a360891bb3b73354a3516308fc2587fd3b509953d10647146ece520c7fef34dbf625054849999fd8bd1001a0e463f157642fe6affbcd24e5c0852997acfe48d758f9947d083fffc1e9d8c309977e01ffe252a8e7d2cd9930e9f80948a7e026b55444fd62f9929b36b01272eb1d60ff1e3d1faaa25eecee1a6f91b9c77a7b169e6f6f099e2378ba609824d6f07fef33dbfb00b389a8136acddcb703bb2db95fba33e080da8fdaa6672b77b7bec415e45fa65c8a44b72b5671b7d1adcdc6814b3027002abd43a1a572f173ddfdf4b95cd1c59af87a941afa2d894980a44fba2029d337cef049b300a97180105618c3e15ae124c5d345ca9e2ad98644e9cf4e27ccc0ee361aa9faff3533071770371abc228161b9f9d4218a902ff0c1434f24a842758b28e4695de93ebf6ebbf559a835502db99b914809058613efbe5bd624ebb27a786df593c308eb9e1fc48a8654930d6e943546aa6959340eeb05d86c363745581bcdf72e16a2655780fad9c7062080ca5a4dbd0128ccc3a74c5c631942d62296de0f8f433d00d472fb248a23a622d2cb73aca15530a75b677a8ca4e6300e73bc28fd67d9206a5f77f70c45a31de22af9481a98af683223d5de5d42dae8285d53605d27f8a7272eefdc78b14e51a8b1db3f5f4a16b8b44479de96e6fe536b0ae2f0f877a8ba816a621131762c2bbc8ef9c14261920877e6dbe30137585721a2f13f96fdf241be3b5600ff3d459365eadb378c822b40c12f845664def3dd904c08b5ff64dd2427c85510a9aea272eced0a070557ea49db4afb9d8882d4ce0231b0bafa52724b043ae6a9f9704aae99be0d9b7588d6090d5dc82235cc0510bd7970b65070b89e9db89233b52c4531b4866c59a4bdf7699e91744b32638d8d0a4bd111c965b706396bdf16a6899ce1856cb0ab5a9d5651d80d868249f1742b30cf5a332dd97769227b57bb943056a8549960f85ed0faaa01fa862e401bc2d4792f9385447601b19e0f828847c87b6d683504a779ffec5a627ffcb6e08b806f2b90046dd6e15cc4f64fe7e686fa14180a67242273d2324b43c57184f1e9b6e48f1d3654aac5908c72640e3e1a6e2790825749d014f0d663ecf36dff3bdc6a1bedfbb0a389c8a6ef59767ff6cccbbfbf182efa192302df8ca432768f850da6fb8d55fac03b92a5d7f5acc37862b9e18c1414c0656aaf56adb4aa169c9924716eb6519d1588cc952b8c2f612aa4e297dfbd30221cafa042ae6482d48e3dc8d45cb1172008381e7ed36727e1765cebe8a05caba8a6bb7cab76fce338ce3aa1d5abc7d00b03122f69b6cebbccc3507fddb739acda6c56ec9aefc4f4cbc258587f443da4e76ddfa85dbe0813a87849447c0d9c5c41d44798150004de14d35e95d70f5eba3aae673063d25f5800ff0fe2cf88cde364475827279103c89c6916ffe7f4713b8f2e727082da19b259bf6a02de111368cb2e4f42d58b0adbe9ed463fb6dcbd4e6b54c810c2bf7f483d20224caf91b813ffeff59029d4613e85c5b7fd4cad8b1c588a30b72b67d943338afe674dee020d87f412ba2a55501af85b31e0b25123cddd38740dc6bb6fcac465c8fcbd123a7eeba36e67e0f61f97c8167c90efaecd8883c45abc9aa38806761946b208e3a78eb466d04054a015dc7f5d5fb60baed175d097ab69af086e1fd40e4132374b936369a402ec8d397b12a49aa3fa0f3876bd4e192ebe0ed0673c63ad80235231442892c4ca1493aa9960c03410030233068885b2ad63bee5bc85ad5ccd2e5f7c0303b830f1606fdcb7ef5a936e7aec89c7fdfccbee00c72db5233984eefb6816181c624f3f7728b61de7fa1f8506d52102453bcabb3c3292993e8f8eac3174e6cb9c18897b02c61f136f29401d50c6e3fe87ca19dabf06fbb2fd38e0cf788cd464ab62466fa85201e0af6d5efdffc6b705ec321e13324b4f4689bbe41f7ab7c82a70c9eee112d343cdd051e1eebcde855d9cfa43303d0a789e0aa00164dcfdaa6614d4e99ae851cd22fa5a31b82f15354fbeaaeff7874a5d02a7709e6549666261be0ca062d1d587275412b623ff73af237bca8932b913e6b988b225eb67fbd96097f77900756559230700d8f7d500db21fae37ba77a6dfb0dd6eefdbedec3f5aec71fdd3e7d0c2b603aac00fb58c5a291647c2c1f73618444b9ac8ea657c69f92750c35e291cfe524169f94f831c9eabae01e04614cf669a75875406b7a0dc053ca44e7b558b86fb8c360feb607149de597506b37ac35927edcd07bd4ee9f3e3aed515d7f7bceb1646877a4fd83afa15ab09ac9673b24e8116c46a7aa5c85038f06bbfd08a119936f2e6df0954da1e061548486baa2ce51a7315e2cb56bc5f59a3f08311773a2fe233cc948450cf24042ab970af88938b68a53a072bdc469fea2bec260769970d8c6bb1316d668abab44dc5abee9976c0000f994e28a0e7805f1ab70f1ebba8b0ba1d2d4c1110bd308b010560854757115524bc3e2e3f2fbf1cd2f9b4e3f7efc7dfcaa92b1bb9a723fce6e115103cb4fdfc872b4db9218f9ac7f72cade3a8fca181f6ad84e9fc09137e61f1502bc400e45a996ef365d277a1d4e9b8509a392fdc2513b2b00842336da404aea81487cb72e3fdefd590dc8872c84d2553744329e65db45152f316b6c0f241816386f285284d07365ae6aa226c16841c0d0e315b4e805af1d436f4138bed9b1238df8ece52ea57daf9b3b5e62c4410d503c49e3473317a2cca4064da4cfa83c99eaad6f7a140623648a4aa3401d58618de43e45602e5945a8babe36b72bd9e1feb6545a181e3a8d0be25d1acab5f563fe2e89e205c113c13bee5fa479b8b4cadc59b654c8348be42c0b3d6a07725f3b2b83f46441d48c3d0da6b041f35f801cba3b9b06913e3f504f6db23cff3de0129c4c4570194f0de2a44b7ab22c09870221c4cb177b249ff8fd708338bbffbe10daef45b1971aded78a4685a22c9c0fa2985c0d308ecef305bd7c7a05429e425c6cd6bcccc21d474547fd99b7fc026124a76b2af9d324839e18f95d4c9c04b41fda67726ca241905461da7e99a321c5b1d659eb19510f96ec954ff5b4d2175c80ad0c2e37406c002b6244fbf129e38271ae8e153910757617bce60ae6ebc181a86c2cbad5a387e0f3d2a3da67972ee28bb67273001940694615266489efe86dbe9f2edcefd37b78d3375ee1a2f4ec2b27766dcc177356b8a12978ca46e77666ebce7c5d2dd92e10f41bdfd94b4804a66f77e8e72526a1ab517f4205c5da52b557827d0436bc8af07e058d89099c5e9b8940498dd33b07897e9feddeadd064a22942999bb3847660987ed0bb85f7e2529d5afa86c9b9729c4f12e21aa7d194748a9738e84b3ad9a76a0d103567617812d44b619aaea8c92aed5f88845ae6ca75a108c2b5a7e59d0e1d3ab5c056e20825559de8912b11f47c800e46e36f16eeeb971d9fc86e8da9ddd98d2724fa837ad149d7f632e7fbdada2fa886fe8d6ae81f935e38e9493ae55cc58fcf29fc4bb65fd882f2468b6e658b22b4af9e5de8a059be54f3e2e0f539d20ac713970443a41729254695be727cd982ba298b869affe13f86397adac58d89cfbd5c35b9712d40654859e72910070a77425b8db188ebfe3f7c7378e0b3c9c73dfa13ccc4df3723b3749304734fef6728d5af6c86b94df9e6bf07a599c6d5d57c059e24cc95ab093c2f5cb445381a38befa8cefac350e1a5bd65fc9ae0699fbb36667057a99723828041cbe47d171c5603a5ae0cc0414a9c749e1acc67bfe800ba6d43776f572f99e783beb2024dc55371c82058d2f49ee51a1f7158a2eeaaeab4c4f8167b19593c6152103793944326b286a2698bc9431226508cda12646cbbbe03fadf6d3c250c96237cef9168fa223e67b0d94b6dcb9611d7b9db56bfb2065eb0c81ca65e176cfe7e31349c5a7ee87df1d812a220bcf3752ba4b6b06f0f5cff41dc68c6ed94eff2d8e9c104e725ec09ab949020a08bbcc8a2c9f6dfe0c922183dc43e3f7942082bba12ff7b7da39f69fb52ec375bbc547503963635b393e8420b0c27807f93480198295a60ac6c950777bf8166c0c35d129495df4265e4220540109f2a6f0d120d09b96c44f1d54f7a9716fa2f6e352919fc456c96662e61ca638e2fadc61408a6753f9f98cc92313bd015a101b2865b03913178a232f72a09fbb1338b234cae7661188efcbb17ecb3c928307e3c3b655809c65de65ac2ed6c5f364532f51b55f563f094b13bdac47ad8bb030579c8da9fac80b6d35c162e4a3489ff45ca14919be4445b86dd5f7b09856aa337e9c32d431ffcfe09a5655f2be238ac23f0ad03e268804dcdfe1a52e855a39b761a9ecfdadaa7bdf9d535029a0eaef66e37590f516730d5f74c9ffe8fdff246406ac054cf42fd51145a09bb0d00794874dcbd267176d2aea31754d0787ad35e3778ec3ea90f8a61f9a267eb0d6e041ce87f2debbb0de212520ced7b2accc32dcbc356fff096bb5b0a4cb41513bdfc0e298d4fc1a6a2ebbb748bae412f3c4e4f6db8b50b2e5f2cc6d6c782bba866ad86d885874acccc5c049b122be4fe4fe13dade77b02caef4b1fef91685143feb50145f658d985e0bf88264efab9007e08730cce0d595ebd92d0a538b9786eec9f18126e59107a8692b0b6807f4fde5d3079faeb008142508083983c1a9391c6c835ce5bfc6203345208bc554e1bf05405dcf8bce91d1e3eb0a35909e0355503cce4ca2db750c8608a0ab84bdb9feef8d4f696b22b8f5ade9fba3820ced0113a199fa6721e5f2291b7313ac29c6e12c24a6155794c5a80b6aa22e62f2ae65ec03ae0e3b7960fba5e4616a45824e91436b297a550cff1186d6c87c37378faa63cad32f27cb2c4f81cd325858af9a36bccca2417072b059a596353509c5d8f8005ed10531ff9215453dad87eb98f2f720add711adae1ea7f110b102e083d1764c276f3964fdda767a9c9b9c09259dfcf678929316a89124f1ad048bc559c14dce8e7773c5ad4c99a751c442b73ee56ec694996fb24953f82dd5f577bf2ff2a40ef9af5a5ef730a754c6f01fffcb10751969b44c8977ab4a2df14e6ed7edaaa495d1e19736c4cdc70962e7dbe8b46738755fadd2a41be0427a67d51a147c3275ea7fd3d255fa6c224f8d701f7ae132e065de4baa0a1e3b0a9ba153207ec2d23e96694eb2c48355dfadaf5593be3ab9946e4e557cc36604c718058f2b1da8d1281ff919df8a45d027ac305cdebba8437d1a1794efd8dd83a47afd53e1fa16795a0f96fe02af2a2522d2794ea87a111ac2f0a1d0ac506affc747f065ea1cf510fceda7c3c33c199bf7aaf0f29b015f848d7855d05b33f4c2580a468eef8b2bdf38429631c938f97bcfb9fe125d5a78ca033b995ea38a6512804866969850a22e3495ca10bdabb40dd1890b74968d46344ec0d6402c5ca438668bba458c724045186eab28469d319926a180e1efa0af09968f753f9fb1997c345aa96374f9ef6b0d55a1400d175867f589c3210f9d9d930231dc23a4912c250f3e9bb7f7ee96e93bd31422b92011bf67ca3efca08bf718bb2d75b4e205457d21bef80abe581d07c96f6c94f3c144e8a4eb583a4773a5e1e90ba7ba0214ccca92622924703f6b0ddfb2115f6301d92bd37478a2ae5c8e36b254d9fcabc7a9558ab294cdb6ab6a43a7236c4bb0e8b8d01ced08fe7d4e9c5e418f75438625c4663037a2cd38a501f1464ae31f837eca1fa8df6f145c52b6a3bc44e2573b360544ac78bbeb9d34185ee7afdfa583ccf55f9fd215acf16ec44b4cfc88007102553927fd48f08e6198d3b0dbc9a359d922da294c6290e7acaf9f183dcf06d0929a8bc94fafa5b2336798c95507e2acad3ad66cd7be87e4145de749921f3002edbe83b9f55acfb2b26ef55ba5032a2551239c93fa915890adb76b0680e047ac1ba7692077af3935e695328e5423426cccc774c43e43cc957fa57278917a1479253f85255e18aae4d8c59689e9d1f428260ca527293cab98921046c64c555c0e126c1ef131fce9678fe46a75ec74060168dc79e645e4bd44efde2d1939d9ea16ea187eab78c3bf6513dbf679e57341a1991e36261aa4c93e9df97099e16f8537b52aeb7cbcd4f4866d9382be5d386dadc1ba25122ee29931a447576dcb7df4197c8aae8c83995073a4f3566cdc2a52d0e8978ecf0c07f3c30db229be7f6d006547200f0258799bd4c0e2baaae8b1b7b0179fb988397ca09cdf2130b386a571c31cd45506c0dc9c50ca4af5a00b3566f556b9ed633ea86865227bb275678f0fda058ecac2452a1c90c9125077cc1e2548abcd7488a4f212c6deaaf82baa91a1530936b45b6ecce33cc5221357b3d5bd5120c49420f3c468661c954afed815f1d530b45cfcc328b9fbc662866749c0f6b7bc849653b18530eee424ef167882c50983f00acbcda76675d5baf0d01548972287f6c248689c33053c3f319a1240e69709d206f013b1b153f9129bb9a0d56a3c8a025f289f7339542ece56b32fb71c26cb4397941eaf633d3b52cd4b70d035aacc91b71adf710a83c1b9a788564f2e5ecf2906df740744daa162cfae0f9fc11755891047affe6d39fde86c420f70e6e91f6e9cf89f231cd3362ae90905acd6292ed4b3d797822b1eeb44ed08e2820a6cc3f89e082769b3cfff926284d85e3b885e58e8f11f650cdb92b3710358ed6392c1b157369243d17706838449121cbaddedfff6bdd010d818fb1e425af819b900237f0eab6a183d7352e3957d3a5019d0e4af276431e9577c2c6ea6364a6ed461f14c0a8e3650c06aeb9cde4bd96121084a52c10ecb5951b02f89e6bfd7557b5b31ff94087f532205da94a7d976b79a2e27cf0de224c98d5c0c594a1c26347896ed80f441cc882beb26b5384f99ba4ce9840e5309c69fd427c9c51976c07491bb2cb77260a559a2c4d7e5d8d6cbd2ffe268f7dbab3945eeb970b49df42b7e8f72f78c568e922d513af60ed09692677ac1db72ecee0321a3bb08101cbff1b9396255e7e7f21c6dfef3891769b679e1862de567cffdae9dbbd59ac0dffe998c59344eb06eb5ca7f72979be8e85e05a8ebce8fbecdfec21ffdae2dac2edaac61b590eacf33fe25cc75cf316998b8c024714de05f2c1ac51132efc9bc517bb19f171c322c7ef6b4bccf435582c0e931bddf52e132347841da223f76d88f0830ad45832daf97c4ffb8479a0e1ba71ce0dcff8498202f41bde295473de831aab2f5076be341c5928e26a67c651c967756e7978c0f0f639cc29153af25d47f88bede277d5dc85285ea6fb493606dd5221a4870114ee819b2d74f231e3784c1cbdcd06b60a22d84c79afc39840af6ac46b46552bc5b9499aa8484cf3c7ae03f9a94339dbcba59a4802634fdfa68a0630bada8053540fa2bad51981db2f6d1411e6f70833bae33f9d7177ec79b845141988c785023050117e3c7f3d628b33d0e7ef4ede68385a2cdf5f344610f65f28f16d93cfc2fb093a4736dfdc245ba0eefe3ac138d3c4790660245ed91ff136c96ac1d5ed1004b971c86cb1fa8b2122a2c751d4a420ffde40d2592e1201397a59b83de45973fddf4c5436abf5117c37b0d5bd1fbcba3ae860a866487d6f2f887e9c2a75916936f94e8d3d147861ad6e7d9be508cf1a2625da54e42497a453ef9c792fd0216a5085ecc5d881d0d665258dac520677cb1215326a5b58ed6b371e27c1b6aa85e1cb03abb0a18abaea13fb55699cbf2347af44fd4b244bfb0e59a2c518475b3b7a16f10fb0208573374a5e69661d997e1a5e23af99e7742d182c1be8ef6a78be9dc4ec8d56ce08b62868dd2e246d0bd4adaf4fadb90d6800133ec807b988698bc74544b917029ae0580fe6382703acb38c03178c2b1eae107a0255a5f939c43f8128a7f77386a28e2090180bd069e2b73ffa19cf8293acead707334840e71f2645df64dcfe92b60c2ca9d11dc318544c3404c4fc41f4eadb94cdff630328b0ec9fea29de0aef5c06c6adaff2718767ef02b3b776dbbafe7f4db6f88ac277400ef9c9658f3ad4eafaa92c030e6e4f941c16775fd3c27e4e526c62dd24014b42f9ee0d964500ec19542ea588d61bc96f5ff9d02ca7988750e17b421bd3321d1029e7172ab3ffad3dbfd19a9fee0c9d6027274ebc56c09ebc98e4e522fcf7855e3b6f96c1408990ee7a3c8bb6caa3240d1e29537d55ccfcd80553cc8115a3ec839b01dcc86f212f922fc9e97bd08205dc817a7eee49305a39a32258b4c1d9eb06b52879ceb468e1cf4cf4444db42bbb350d85319d957d1f67feeb1a4c660be97e365dfe42a4d3400c6e661caaca02accd2ef41be9bf15b4c9651891a696bc60408b0ccaa2b4c2d2cfe079e321a699630b42218e814a9cc30492255f51c85df8042fdf7f8d68ea02806fba3830ce72665603a809c2bc64c27ff2bbc3dc6f73192f91208d5135ab67d448a17c5696003f53cff23e4c89202bb213267fb510ae3c295b8a64acaf796b2227ba3011b1d5468b238a6c7d35317731500fe37a4031d987eb7795de3ae6a4f0698ee3e0966424428afb44e3552b3d7445d28f7a72d099d1dd72a1846c757dd5aa7a1841b83f513082af37fd4d7fc7016108d4542cfcc58d8e06183db8a87e3857163db39bb945cb9720b6499291dc5f4e3d6285d3091511899c5a58b3e22e9efbedd4c4b5748a8a34fa5056c923c5f449caba9e0997e1146cbff863c2d4f770056b6de399f387e2e886968365882c46f04b3ceb352bb1fc83eb72ed79d37162000979aebdb8d66c2e7fe97ddc4167edee397a1bfa3710308ba94a645d7024db78628864a536ee8c7320d9a4b1e2015f801ff2aead4c8466c073ef56c23d7a52dae10ad3c4f048da5323d7766aeca0f242591701d2ce76f5eec5e2336c8dea5ea41f814aa1676dcc4af373818bb3af6cc19f87b41f4f70645339c398a1041d5560687c57df1ed5e8d71a2e5488f985157a3da533c751f9489a29f3e4f4125bddac766c79b289199663f2784de700da92d8ce001f8f488a09102103a6fa4b4e6dc4a3c22ee038917b8e26e1fc1a7c185b69bb18c5bbc59b2c71a9635d18116d7c658b2de5dc9fe60ec231ebddb7cdb6d599af6fc4f14bb5292b4da385d207318feb97004cfc417fa68c8df67133683e9814f5659bb43d6095a96834afbc8f232ee351d9c2e3afd6f96995b24511fe38293847aac8692d15e88893a7493c3bbacfc9461ac6174d747dd6037fc7d7d20bff8ff09fd9a49d5da8255a7bd0d57f70e929de63e50bace08a4e31ef7809965291889ac52deb00903b1c2712d51cdcee117195159e3540a3c55ebb61e40bbd8465be90bb53a0e96647d9841cc486d67abf3d14d060289b26a5740a778a62ba1a12ae9cd2d96ada3824f9ebea3d87eebf78d8a804c95a2ef1b12aa9a0d9a30e9bfeb4f9ac2dad359e78d9d91b9ea4a814a4f0f923384e7e8d6eef137e60513d82a08e41c7defc9e01aa15e61166717522ea0272cc3b7a0c62353dc250acd1d9569e770f865bbd75fa3f1a6d7c3352e862ae899f6051615b08aa9350d81dc934904f2bbd9832744fe0be7409bc73ed744c7902e97008a8ecf9458c2965418c01b838f8c65dd1b5ae7d8e9f3542a6859b48bfeaeb8bcf9524ac8c84c698a6beb346f28ac447e805f3f956186aaf59dfeff009be100424daa4aaf619a2d2bbc5bbb5024e41f6b3c9c31c7b6c2472fc40c4daecf8e18996cdef7cf8c768b40f259d9acebfa9ead3959e2f8506fd0e0c5ccc51c037fa7c9403678b3afa62bd0f72db60de5b6684d5dde7daf9755f010888690d29d7a56dbaff9f6e034f3b4e3b21f79fa7ae2265392722875f33b4dc8f482d5580748cdd6a37198e08125cf810b774bfc12447fc5bf5e0bd1ccea8f0ff307bd37a7b1b3c203e48739000423b3ea7c539a15a61cadcceb504b8a2b5fee6d5e70f6e77cb0a8b79bea76175759803777ba5cebcea412a05e1c6b95c4656c48d0151d2e736e8fa6deea1c30e818f1dab0a7cafc84c0fd25029aba557d48916da3d534e35c927fbaf5afb5b27d090dbc6f436db0921875421eefbf3320b065c41fd7c47000c780da2760c905dfd3dcc3fcb5cc70bf5382dff94602957347f1358e44543c27b39beebd26de91d61f66d89e266fa2d21a2ce5dcc50ce440b23ca936436daf98fed7dfff287ebd2a95b4e49fbedfb094147c3a0f9464894d9c4e0661fd96311d513d93358f30f3a2dccdcd45a4a300cdea79c7dadc92ea62ab30365599572a7c54d3f3a7827d9b079db97dd90143fc44432c7485c51f714987e91f5a4038027eaea3e79d2aeb1b217f81daa2fc480ac3c89b2a57769285c9d981abba1ac221eb07b5585eae04dcb82b2cceeabe39941021d0cf9918738da94901c1bb4e7cf08b090f2c333750469448c240f76f9e01f4f5d34c94d24bf3b27e7048a705efd5265abb4d64ed56c27c7f4c17133500b937ecaa8a8dcda11eac21d62ac466a13983a2c1a139f79eb63a78d03d843be524a1af5f70cf30fd765fd93c4e5b9a1c856b8a2712f97eb08b94da599992a7d8aafae6fae5a124e763924fa99cb3c8e81fa6b9f787eea915aa534eec1387a25eb3093981d34ad1e84d0f2b25fc16198b71fcd939e75ea154793f7b9393a95301a7974efe21135e879c9c14b856cab58fe1358ff31c928df5621f0a550142e348ee6cd078b744f44db802b26b9218c37cd918852f0dd29680ccbca23b459879bbf05065f87d25bac10a08ae4598486bd8c06e63f4a266e47e1fdfec4b48f33ee3150bb5855bfdd96bf878b04e50a2d72dfeffd04bc3959e77c24e8f8ff09d5a47c6646927391678d3eb195f8fa36e2c02fb93753a58a8edf11fd2340f26ddf470692529e6ffb6c0824cb2640f77f395e01ef2facc49e7f8769d3283d2d3fa34e468149ccb9526d9ff810c66d7b67a384ed1e306067e9ae88da43823e0dd3d432d29fa6bdde3aeead2f4ef0eed464b3dd47c3041f2e009e4bf9caabd412eee49d3169e3e25d1951b840b22045b11aecdfa859f5597557c1592ed51f8feac556d5c95cabba94825969c306fef29fdeb104955f9e7fdc63aa29000f57d1d41b9d85210448d732ea480a2ca9c785df4492d485405a22d1c8cb4413b5ef3a9d464b23ceed55a8b6d5b041e41724601dd114c80ea8d2b2e3dba732c075303a74c9c22a39745cbf7eb924799fcb9021c9f8c977780572d08130c06d9cd9d552193aa500e735c87c19291749b653953b724ff34b77c2d4ec485c996d0f304901e90d66505eae237f1489fb1aae3b9e2d953b54bc848d536697a3b4a9ae3505da72b678910649e828df7052650de03568a14f505304a178effdca84bbe034963c34ca7e3b84959119f860cfd14bedd58d24f068979ecbdfe8f9259c0c4bdb74b7adbdc9c8401db8b2eddf95b7eec1090baec31002a958d2d1f8496d2357861bcd4c04fdbfdf4ec9943e4176a17ce64a549d4be92ccac51c4ba9aa7a9979b105fdae348c9a98a54e3e583ad5266cda04088edf566e69bcf6a65bcd36c75908cdc932d0e8e122cda101ca2023bf4528e087d201da500c9d0c82ad2634454be9dda0884eb51c04048c8f0295f4c47c3f4a632568076a39e1b8610c49f58be8d0b013fd2253a3a3064b56a000cade9899bc1af75640255827a4b1f7acfd13a659dfa42fd05730862f77d910f5187620d4b02fa661271a1ddb3bf60dc3bd651ae1c6d19eed321b240c8c86e3f760238b6cb101d12d2ea0c178f8bdad32b9089d05101ca8ed76fc030a13f0776c245f5ebe5952060ec952098d6579645e6266d33015f5fc45983bb9c4889669d7e7920165f360937a79b64c950ca9a1cb5c18240f72fdf77a0852beb864f939df3c5429e029de2814c246010c48df03ee089525dfa185391f59e96852339945c6652e2eb9672b32523579dd6fc48a095afa564f3d1c2c2f9a0f586d2e7ee73c422478865e35c820b745da284bea2b007693e406b45d63497e9b4823a9a1738bc6ecdbd74b004591b875ef780d3432a7e587b6f2b1efcb25317001325035be92b910c0780c7123f3da381253403d415e1c285789d24db42157404bffbeb6390fbd42bf1f1ee2d3d5912eeb30615fd7a18f083e3281e1cefc546e511241ad734137f53002feefd59571ace2960d365600a2a9e3933d666be4bd6ce8e08585ede5bdaabbea28f2b9d1f044910a903b5cfa1b8fe00281262b98f6ce5c00f6da095bb2c5cb2b2985f11991886ef496e94d0c4e1cac36e9bb8e77a50522ea22046611bbf8d64c8d340bcae9dae4ea8dcab695bee2b076d390f50f2c93e60273af84a63d9675d4a0677a644dde8b52e15a2a44f2748568db30ffde020d1df08845d597bc31224a2faacd7441e5dad43e0208986d44a3736d361f52d9e3232abc31e954bc5b5413677865897a934bd4f06cd1fe93d5833d05fad40bf888ae17ac2e207bc26783d7045ad3023c6966eba50526e60aa9bd1c3209ae780290075db4852b5b430849fb72bca67d2bcab47ec83577ed4623a9977ded1f157c8bd75381c16a91c2901ef72f285068bd59ad04d6a83582bae5e135561fa662bace869f807d5ebdd5a17b60b62851335578c9146cc7f034fd62fc8c370bc4fe61eaad983d13781dd0bec7ae9437399ba8ba8133d70f2872622d43f2ad5bfb36f662b4e4142e6750684abc6745df69d01b917dd9b1f85ed9ad97600f356ac9aaecc92509a2187cf3f0c7a1f1478b729f2290077c9a1e03c92453c9484bc2b0c8b980865f638c5956fec810f315b5d4475228c6a2dbeaa7cf5ac4f8247cee312ee11b417bd4d45d1806dea1d33cf91f772eee33d313e8cb5ad57d652a2567db3bf80bfed5729b28a59d5dad2829cfb49d1d32c783ce8 -MD = 4f7cc474699e94f2576b1286e583a744c94944d276777d4393a5d478de1dc10e619596afc8ffd242f8ff3fbd395e674e - -Len = 91312 -Msg = 22dbba2b1a39074ddac736767ebdedc37e4208b233e03b349735f9044deb9536e1eaa81350cbb224cb90048db893dd9dfabdd3a272f87402c5e72e8760d46cfbbaea02f5d9a4cbf2188590a7270a2c9653ddeee0084b3f5a94f885e22dd147f436439178beaa9ade4a0da46dd40824d813092313fdc0e4648bd0c7bdbccb6d49dc5d1d4506c76611e88f0687c6760b8bc1ab38e35a3eaa4a32d7bcbf13a8272334a06e03b9e279b37a757f9c053d2ad6e62af6fa26afdb3111762b913c52bdaac7754b5be0e319eb8826d7549a43c9e209ee25fd69fabd43b113dddb3faf77051c427df582b18fe19b0ad6598c7230d7b25f8d972b0799a899189b4422a99c5dbc70cd78a73623be3a894450e3b1a6dc6ae5f56e75beb68851eb2b74ef2776d92d68008d57591caaee0be8e4a8e77419b7e8272a4e075e0a62f65514ae104ba2f991e1db9b02c4cc3ef88bbbe2fee3b724d0e974bfcad756539fe3cc654e64dfa752370b7a19614db2b8f57d99dd39de360504f4cfef6a95ac509b431ec809b9c015c9c4fd873c54d2b3eed3d56cbeb577ef4051865e5feff6704722e0668258cb4160af2b329d0a27523e659f93bc656ef66433ecfffe8bb767ad10b41016e3503ec4730c03cb9738fbacdafe3a7915a3833a440aba8e927a9c96b6a0ae0e82d873bdb9a8e210228d1702dafb493eee9ffc8829e778592bc479c9bbaf28b25fea4a132908b8b2d3af0f060f9da85318e9cb178d8b1fa57f1f6510c9e6664a9f0e2a8d6a336bfad32549811eec4000ba0956af16ff99bbb612c831854f511e6dcc7bf52531e5304a772f3ab2f0f78dfd8807176c4acce3f7260bf599f1cf76efada611010b0c9c602e28fb71b2b64108ed45193874a2656ae19424add4c9994d3811aaa7c8ca863bd19b8a0339666604c0777b2286028838cecc86680128d0b0f62587be70063506e8f2b0118ded42188a0706d187d39589721be2737fd263406d4a72ef0ca8f2e7fc943543b7351d6dd15c82ee7fffd48457ea027556b19a2427e931e2a297050694e9e140be24412a20deb720776d8d52049fac178facbc85ac688d3e3dbdb68c38597cb1aaa4f578fcf56d107505081a01a4a90131aa138a82314eace2014da1704ccd3d849c807fef096b6684af8c05d75fc1da4495e55c33aa3cd39b4b116cc52a9d8d53f32b6680827ac9a953633b0d3abb4bd1547b22473d1e5c6f834b16be5bb4481f933e5638c862e1eed9d3e32b9b61fbdecf1d054451beee679243c6e447da17f06301769d43eb575a292526b9ec799376ee132db44de232895e41a5bd57d7a2cf4bbbef395cdcd3f52ca12b4094ccba9e99a4c11e9b53cfdfd08ddbd3f17290c333b6e89479fffcc8c88e1b48fb221960b819e90ba2d96e71d06e8fae7f748ad503388a34041a7bdae6361d57894357c333bacf02ca3bb745472eead467a6370ca38afca363f6f7346fdf5af7a6f61dcff2cf988b7b4351651b1313cf13cd4070fcf46769005b19dc49d2f9afba04138ddda06f2e1db7e5d936663227e9b44c09f4bdf30c411189dc5e5723072d36e004dd757a7418601aa77e6e7162532204e0742fc71690dfee3c94b5008867522d3dd895e1e4d50699d9dd75f60ab7de0ffc65900c0f548ef102d536b7b9d120a13eb749cd07ba710a773ac1e9a67fb11765ad29e97df4e6393808207123d16ae51163d96663306813877c9b73bf1263c124364287eadaaf6fe515bc554cd0f6a0bec38dd382a0b55f138d4bbcdcd8bcb740e6230edd6db13a12e3528cbe378d7b4bbeac3dec701e94225419eb853984a1c1a713a5df15b443c65c2a3d016cf71ec23e80cb270a6c5bbdb94d28439d8226b0605c74773a7f3109678b919bd9fc302a2a4fa6bdd4675beba42e9d9c6c7fef14f944a42d44dbade3ecbfb016e4645a8c6962f53638d63db4fd056f1a0e43a4f559145d899c905f5dd40cc1faf7f643efe501e1189c82a820ac1ac945ec96ec5b6a13c614a866ee7e05bbeccd797b935b857492ed6a3445389ab5d1a46c406f4f138b0855d125034f68135b19d2bcf4d931022f3c09b2bc03ad1eafbff708d6d83cc24ad47f9445d6e55e3365697e0c6fd1f4e08ee1c4b489ce9c8c1ef6b7c9ffcd01b51a1b7c5d1d65e29f3aa88c83284e92cf6a5a34d5d3e679904acf15efcbaf9071ae0ba5f22ccee9c51ff6ad02098e242158dcc9c8e8dbfbe2caeceaf144c8b7a518b9d7ad090ab9cd9cbba8311c7af201e0cf4a35d1976bab26b3fe767201be7ae18bda36beff9ae0396046b768fa44958b9b80c394001112e78e19275e43ec1790eb75345397d6267f4b4f3df5f76105e0a8331b3b00344094e402ac0f748ba4ad40724fceb8b4c6f5e58b6acc57927a685f2ae5cd7e1d5cb51c82ac8d7de14bc1f29730394c7be82496c1e7f4041f1ca9262fc85361158fd2a061d0e14737325369ad7f9b3a74b692c7bb5b75e450122d66086cd493620174d767bf12b9d481eb0c7be3fd6ae755c9de3f6f58e16c857c887e7a58fb4cd922295b2128ba02611145cb0566c41bf0514516cba4e2bd9c1cf2599ae8811d4065fe07a02c3407fa4e7c638dde305aadb062081661ce8980970e61738a0d1b5dc4be31e2250e2c7329170c226e96eab4709fdcf8978f195875435eae48879059c7d1a28f1b30b9f42b7f8e6c1cde142e18635c1b4f0cb54d3cf817f22ad7c25bf6a022501682f6a7da1cb115f2f0204331154e24912da587769755e837e6fa8cda9179cd1feb2ab2c1563dc2f8b4561a421f7bbe63da302daa87e038779a7f13fa0d6ead3d569f3d6596f91d3513fedcd3e8ab8fcffb9f6761308089f2dc9b19de7dca9879a89b715042aeceb1f35fb06dd8a53fdc783a5f22fafd83b19594c60f475538daca677509c4247d743ec2bf975733779239493a754d1ecfbbabb34114d5d73268a44b72188223d187da6f31d9cd1bdffa271423e291ac15180840b3758d18312b1e8e9006e67372f1b1ae2dbba2261e1b28e340f22e70fcd1928343bbd9dfdb2c217af65956db09baa9c7dbc63e1cddfe25fdb92c8c2f2ded33c31a6d20f6d8729355cd9c3c253eebac0164810ac5c3a907abb71913b45074d24a5f13c923d1055e683c54ff17b88aa1a6f0746ce97926b435623f2cc60c6f565e3b363e2f6eee68fb6c0b077a20a26ffca628cd4fa67d16e3e1283d2c09e5a948d65de6e256349b568548bc151d38004caf2496c0f3b414fc5d5cb0aff0deb2505710290332dfddc0ae9486b258563bdd33f02d0407d595cafd61eb17696259bde7d76f5ca9f818830f76cd17780308f95915fce38ce78393eac1582c1b7a86d9ad3b20b3648533e5d176f90d26484fe6491a692527f3c5a04b045db5af2d21ead2c3a4d10a91162f1c1c725c0a2cf8ed2c87de918200433949b0647ccc8412397df8647e4421a9a817f1a0cccbb7ec562ae5c2f04516e5a60c4fd4471b85410ed760c681ba3fd49aeb7cec2512f111696abb7d0a183d932ebb6815df443a97b1088533a413f27f4bbf45bc2e86e3506e159177a7a17e351a7e848f0ceeabfa6937ef14adf8439204bcd579b0d09492ac52f0178f8be0b3b27f2aaa95c1df537f8c24cf651038f50d0ab38c74970cbd6c4a5ec7897c6cf53ee3e2ce4467de8b3b30aece9404dc90aed0675b3f8454baf62465ef5f1c29e306d53563df85b088e54b1577027b344b2f377a50dc3f737292098df5d7151f66527ba9d12fc65e34c504df34761e4a0fd76673d2116f71cc88215d42ba0c566469fdc880fccfee762384966cba9525c2f085da48a8bc57af1f935d3ecfacd7c694841ad80e4b6b3546f3c1869487cd4ec0be381c67d02c05a0881551e09aa9751b3826422ce0da5b7778e9eccd9c4b99903714b51750f8b553270ee4b381d45846407424203645cffe3b95052d7da68da718f67b80e7c3a78099cf5d120761565cc48ce7b0f6b37923654d397bd2e6114f8a66d6693b96c36f05e026c3d45759a7eef7f4a5c82d412e1e9af08142140cceb5ed2e9bf478f16894caa58e91be486de43cb2c653ba0f668d0292057636686dc012ebdfbb7219b26e14443de69e0af7cee388dd4062cb14db0f87d016570c74d35e75fb388b2396ba466a967a00898dd574e0b0362d5d802f4938aac97ce02b185835b712cbf75ca1e97e63f6ebac7721782109de24adf2b2370b5a37afccd9b48891ddf13a7d4c4a84ea6a01685bfcd977b2aee04ea4b28c6169aa09f7b8c8d276f2337fe19eaddd9f1574447e7e6525f7fd67e3b42807e44fbb60e75d8c3e98abc18361c740c984c267486735fefa2e8269fe8f5c223be28a674578e730842eae649342f44ce6657648b01195c1031c9f5e398e507b94b099d721659f8ce2bd07452bc871ab4da8422072eaa7b0c817d744e28598195b730471bc558d899f6d3fca159b45434676af57579b72b39146b084bf1f3ae6d756549fddf1b80d0565dd5d186478fe18f7445527ccfeb3a5d1b484990240c9527e10c84ee128015ace6965fbcb13c30d528983aa2454964de16bad37d6b1a91216c053d5cce54ee7cf6b4a87771d796bb00647a74c7b46d19e5c67634496706044ecaa3b5bf8daf4916c7384119e0a7b38440ae8ec7ba9792f0f1be3f3f60584301d344735688fc93cf44aba409f5d8513ca3533ab5da98cbc0c2f808dd950c604da59c3023d54adf78936f0ad265ad168202e5131282d546fdc0d02b748396ee5ac81756c7f10eaeab59ff0003ee9a660cf5f0a27e41c176e061b311b49a8c3fd1a14271937adc63effed80e0ecf24e235e2e25359a601ee112c3d561e7850e74ac7a9fb16d128a1bef8969f53a5d0fd855056c0251e0b1f1886cb53127b89772ea1ca6dd27277da80ed972e82f1232a73d4ba537118418c5f17d9a311329a61e5d6003456fd4e90ee3466561d3fafeb99c68997be2349a87d5604c0cb2c183a08caf80904c011474f73909072ffbbd36fdc41077cdd8805cba7c93680c667621ff72e366c7964703d01825834afeb546e5c7d2d3d958136e2a3937ee2a01c6c93f0ff571e67bcae3f84c827c2dec300fded9a6360f9c98e5acffff45137bbcbfd3f07e56b399e53bf73ee89bdeab74bc6f625548758d5ae9c936b415cfbaa02c437b46c036d6e03353551e886725c97321caa8b21611a0a007461e0867a8ba37181a1455761b02f596f8eeeacf40795c7a79641cf711b135f19805c4e22c5109d934b1bd7b5195a647911e6a1fe6cba104d7542d2276d6ce0c9231f1482daec90e30e6a14d5edf71ef8777af5efe0667474d3f8e9e265794e29d6a38a2951aa0407879a9f52c297c1542c162947073d9ca41ece7730b7caefa227741f74bdbb6f673327c7aa1baef412ac42aca245a1c151c24dfaa0c8d44dc8721b34f373932b889dbc3e4a7dcf3fca747b00701035bb047af1e4910d18011363036b2417e3c0e223a253b25d5b0cc21149b53f1b5bc2428554d5b01918820956c742951f0fe81a6194b8802ee4d3c00f194b6dcb967f729de14e5c61584910e9c12bb4fd99d987d3edcd3286ff2d1aca74339a85885b4b1111af147a59ded078abb71237f44dc107181227ea0c9158dfe4fe33ed73ee027b708866c89fabaeafc1551b52b19d3c57ce27fecc8f78f0bbd61bd8681b905f59885ad1d08c5831ebbc866ed2444070526a6f15a31a7c78fae20cd689d1faa827c3a6d426b23cd0b8f7db5b4b4ee0039367681b021ff467f97351dcd729758362bcecec3fb3e22193fdc48f0213f44c775f935d6e12793454147b59b494a96796cead888fd3e09b0958c268bb45e5d19abd817b5b948364774ff9bbc6a60ecb309369479bc4b0b385736576bb574d3959fba2f33f08ab8eff705d9161d00e24cc859097f7f8baf194e81e47a6ca82ca51b488339d014a0a494007793aa5201ac72fc3f808d297dbb4216d49e2023f2b0e52a1eb09f0f76cd11987b1a587fd03ccfc63f652f4bfd87fb9c2fc11b0cac1ec607057ea6a2c3d43776ef9271afd862a6601017ad1ab8e340bcfdcaa38ce3568687428d2df60d20ce42dae53b099f87c071ba7d4fbd3538da1e47a101cb1ec2ed53dbc37c32df199ea345faffb6af14e6a2467e5d5cfcef9269152e7df0e5c9c313db0ada7fbe276e4237b904de906fde9bbb041e21966e2e456d595e24c0d3cf6e4749910534b208c7b80a94a7c802700321f6db328a1f765c590aee8e3848da0d2968e7ebc82232d9d0d5f53ce1346683813bdcb760693453e0297357d491ac98884e255a03dfb520880270c3636c87c2e2bd69d9a1b32ed50a9e36a61d140db66de592796b515946e7794d65d4149a694c63cabfd4672d88e0517fa49a3ac50fdf1478718ae1e5f0f623d449be93681fc715469381ecf914692a9678d36b9b4ce6c31d69e8f523c8bce64d98a851b98d5cbb267a30aa5a22ae12c24c501059158adaca8a0bf7d97641abff791bb6545a123eb39e6a09185ab5ef4c459a8fc511d442c7fc7d4dd0a28d5b33159e2a032ff2843227b671fa6388ab7c8d3852a8e9cbe15ce6c661d0f3a9dc3193b9158cb40276ee3d9d4acae62f2c9a4cb2bfc94578a0d1706c99a1119c18411cf4dfb8904cfc2e06a6fc4e8ab05ceea99140f2cbe1676dc4f95f0aa56ef5abd8d8f04f6cd8ff39ad59ef4ff81521c0cd5b3ce926101f7a07f51ad457275db6eeecb019efac6558583e8b94d7666557e09b1b77fc0dae3e64e631c7ced037ab87b888dec2d218d330de39e7d0a90ffc09d64464f6defe0201560eabb3716bd2cac5de658c52fef25cc05f0e8be807f770962178bb8df60d06cc1848ad10e073e09a1b77f63201fd046c67d2af2a35903e62197bf4227da99cd1b76665b780d6f0c0a8dca87c083b526bb7fbe478810f9bc3943448a37d1cebec53cc826d324323bdeb5c4938faf56c44b951d4d9d3bbae40fa6c601addaf1aa55443ad3bde01a11b4ebe816cc1737a7fd39c255513dda061b4ebe38e85aa518423938e276c59916138ccfa2244fda5a56fa37ff429bd98ae28797a085c55ba122684cc3cc5931b18114c59616bdb143df42f8bbffda3bfb0bfdecd8f4cf77ad6c6dd107fcff769c7400749321e54f1cfca08f0bd77d73deee1e1832b3ddabc586b6801fa73cca0f62fc5709b45b161e359f657f680a039f0f74c44e41544a6217eeb48b49a5ceb2e454e76a7c83b8e0208c16873fe48db3f67e5bac3bd7e60b8652f8cb52aed70f5ea69045b8f37a0b34130ca3bdb154d629b758bcf1dd013a58afc76060dc857d686e0c2c183f0bf7f6c0c2656fd50b4e1f9c35f111d81e771531aaeae2935c956817957e08aad11edef1d23cd4e403b45eb99df8fa6db03a32a50dbb5687beeff44fd6cc08db5c185332b6aa7b42f0715d8bdb2539e2490c37667a524b0e4ed583533a86a7551f5cfa0fea2ec196343d928f88165efa5b55a9f28b602ebb6eee9bde5b4e528c9d6549f5d74a56425151a4212f4cb7fa69bef0d58b357003a1b3b45d9373990658b9b961288d97dbda55e90d3b28f386f690a27c2472bd7b89ad533d8da6f946d3c2ceee385904c731c30790364b900474833572d18875878933ff0aa458e1b281390109914d2b88fa2156569b14fc17860f30560ce726bc12f02e5171f9e0fdf354e62fcdca8ab585e97bcce425b6248d8d1972412f5f8dd95a579e710a857dacdee4ed386190d17793de7fabee4cb00d95676418c17e712efb013e1c2b2db6101f93be8b92ec4151b8f4cb5cef3e4e78a080a7fe3e020a962ac1dcfdac783bcf9f691011eeeb9976a1654c71a8f95471472bba6bf588be91820fe7703ec3732de6db7e75c61d4e8915967f749c0c6669e19f27dca88111c39941ea1e32bdf0cd8e617621c8ffe4fb6e1ee0e048e5f8e518715cda9779888ec90e517228b63930eea183906811d1302344fd5f202480555438e5e072d09775a9dbba06915ab0ca9002236c13e1a7d9cdcf411bc236913d1d5c3f88ab34d2fab42080360cf9fc2d0b19d1ff6ceded5ac61438d09faaa02edc61e63da104af906083409aec328fcac84f1bd4c3a50635c49a610828df418d39c0566a04cea1c9376a77afbf92c01650187d86c89576ed21e8461cfe62d9fa8e2e2cb847014e27c14c91ef177941a22b0c538fdc3dd4036674549970d3fdd971d1c582d83b091e66a03bc3647498f0b1a14a4a8f1c91fb1ad50908208101bc5d71bd6448da572fb01bb1e727132a84ac6dde5151903546b770ffe3ae18aa05d97470c7097ddcde3605a0a4efb36ad043c86c3eb4672268b4de95a64a094b685e608c45aa73feac60f494971ef3fe564057906d37d00df39b7466eab4b15a3654bc6c4aac8b310cb97efa3855434998fa81c7674c894c69f3e8e00b4ecf7b0274ee9d507ff21881a7fb3df2f33fc11b0add9db772e1622e2692ad92a8a2125f077d9bf1956719bdc4fffc719938195ed9d17fc83b86f3c2dc180c1b32e7b4aeb4ffe4a89d48b8e39903a21eb7caa6d6eff3da2416c855ca6cdf980f7dfed663d5dc13eff8158ac58c9cbb64cf75fe05c5bb595585441c97515fddda0a55fc3112988622266be3c62821c4ee50a8837df3ae69d71788bcdc321f5a15388b9a78d3cbc7f9b8aa6857e4394b15ec00ebb1e22388234de4caeb87a4794ba91e35bd91dc65d11f6f9d0d5959ba65e1ed7b1429e130b48906ab57ba75d7e7dc7c5271e540cc42db09d658fff99f68d2ecc647233df025696cf2a35309e2744334852846af87c97c27c8cd30af66995f7d51bd76b042d05f661550d9e7157b6db522632e6f14cf6337d8dc93c1bc71b81db1d99cdea54feba0a7d2c7740d57bc9cce951505efef30c87af9a206ed8cad5c4b3dfe1fa41e9eab1ecb946726a3c059fe40831a9583554843c6e3b586447fa7a25d1309abb6d8c3ee8dd906fdea195b15f8010392365135b7a6c1742323df8e3bb9941338932aa98bac0df9ef95183eca2e07576262a52f4b2bd3b920b52d8e9bd5c9c2e74e14ba9aa89ba6982f5d737f451e8c82b2d18372b882fb2b72ea1737245caf144227858ff61aa37433497799ffbf297f8156d0c2ff67c08fe7a5b68237952e6c19c388d036f367102b7cd9ce9051a4b578b595b042fa9fea8de0eb21823bc74b2f89330fcdce67d882580871b98e94c0d37e50cf35a3efa7c01c33899699102e1dd912a33cf42c49d27b9227cdbe603e5c0180744a0c366438c82e2ee7358fa14f43b61f071d3ae08657f5556f799d6a6cffb343f28c1a9c52651985e6a99c314e598be7be920a49386da08ef138a2e170b947b2c1bc02bca783a423276ddc5a957b0291b60b10c0433d22391584274021dedc552a046541a2a44c8b3beaa689af28c8b19fe0f4f2413708e82ee480e2dac0ef8fae0dd8c7ce37712266b8b14b15f33cabdeac1d6bbcfbb320afc24666061fdfe6c020c3bba4bdc09d6a40531b446add04f4d4f08910ebcf573aa5fe265e4c4bdf02f5cc99a0b7a930a92a2276c4e0383174e424c6d7979c0032280ec03dc6b1fce8f539ee5cb5a99095de95ea1203ccd5d16210c19b7fc7c04890feb01f1f80b4d497b22623282041c2c623f1b64609568cc74af5b714d0fbc0a944728cc7568b6865cbedbe9fcba8b279630a1c178c38199c49dfc4f726374ca98674015e920516d7cd81698d0a59e780c9afddf8b3ef0a5973dc4f8755e73f4a3b511735d1a662765dadde604ac9d444ce6f567a1f0fd1778f97a155dea03ae3b98628fd83e3ddb9f2af67ba2b6cfb6df7a5201c2c0f018ec38e84d33ee6a20ea78fc1162741eb2b0322900b1ad7df34cc0db54f79610cf7d63d449fe51f17437bea8a003a450d42258401d3a78ef261b1e5a09475aa665b2e007b1c6fde0cfaad02ce4c4b61c687d06017944ff6d75d5fe95c7bbf4fa011318492c94d97f5bcc175087ac92ca9647a336bdd72a3f0801c756375a4d54cc297361626fcd154024fbde2ec421a2880a97a590fbe1ac0827e163012c4bfcee7b5a19fc5fc1eca63be59c831349eb634d49179bb90cfd9dd0b484cc39d7398e923337a26c9d4ab4973b542ea1f3ef529923538618937bee83a883408ada55d4f46784fb9f497892c266ccd77608f47b758c23f8215e6b24c8252706263a96e92b5fc8b0ffaebe6944cfcd259b6e430669ec4d99db551866279337c615e145f5bf82cb6894b26361a3dd1ec0170f241cfdac9a124e61c9dd295a7c2760b5a91f363754cc673eb1a169f78951f2d1dee5ba32d20b8268c5b155e2bed20ea00c901ae82d847f3bee521d87d480349ebb8827e7bd2b805355093393c46f2789b470f2fc1c37e58f639b48f4c8f4e65d012dcd33221b4f0bc10d4cd658a5b457eae647dbea8d9f2458a571a62d5610f6f9fe327fcb83f77751e72711401cbbf4f61aa0ed5f30b7e015972005cb4db850eb20e0317e09817e4dbc4dae457d47472035859942c534ade19ade796982e8551fbe5fb30458f40afcb744132f705d38b05f7e4a5df71f7206d6316ad19ca7ecdcfe356b25165802a7fd96aac69c07afedbf1465766b7f17ca72a440c944fefd6c08ecc3a8ecb54d96b9cad9d2aa4c94217ece5356cc5c837697bc631a22f37115050c21578114d51111690a1a4135cf92c3357cc5c0bfa0516c033b8cdd912e201d1beff87e7c81602dfaa4670ac84988b7cf488aefaf55a51a0031e61edd1dd577a394548af639ca36050f81ad0fe84d8227206f03348ab8c83babf28ce1267b3c2b78334e89e5985413b230d11295284bc26a3aa15627d49f3d1276d0a4325b933c035d713d6e13aeabf73c1ed839603a2a8fb4731e153fc78dcf3b912e27bea55d9d999c1aba806d55456c3e69ba3e79e6f8a521933a4167b348097888efea9a16aeb07729b22ab8990589d6cd020a2d7e0cd553bd7f24a738e7a72db9702899ef9e6ba9713e58b8009d5b910cf70c817a320bb0a5cc2eb0a313df57c994bfca71d590dbfa4751951176aa142f838b9b63d411e0520aa9aa7c33779ec141f95623bce7b4cdb35e7655f83e0a3e8dd1a3c159ad8ccc1fdbbd4cb138aca8611c658db93addf16cc783528bdf193ffc24c21a29a85c1cf50d0f99f4ea2686db711e38354ffd6e58d4e6929854e93cbacd1ff8acc9f7497386cbee6455b7639740aaab99efbd4d61cdc49d8566233cae13e4e24ada065b809017d0694005487dd1316e4be2c5956ef948f9bcdd6f48c04036616ba1305b06711bc96b75b83c756bda0ab5f0bc4e66a19730a3817467d89b3ffc77e81e50ec720160d2ba79486757cd063de14b81330ddccaa419dba1de6b273bd67577421adbee1e06d8f0733bde33ea4d7c1935bc853d4d266f4bfebaf916a6f010e43a77f40c896f97c4c5d946343f4c8acf72e951e24391496d87558d33c62d830d3eed04832b76be9d4629d7f78ca2d31440a2b8f4334c70e943956ea622f695995963557b8c811725ff14dba559b61f91a8cf039ba6c1ac663b63e69842b10d3190c22d1b32fa6801f78098652ff236edb1587bfe2357c48c75a83b31afc8b47cedf0d58ba7477adc3657576094bde0d16425654632768205fb4ab698f0a1522377d695f473d2155cc57f60bd137fe4e5c71f0c9a5b86ac76d5339ff68da6afcd365cb47e1c010029abe2fba531a10bd0e52cb72327ef0b8a09493e720f3d9223336b7c502c3e05ecf066704078891d3bc335ad091d1a67e7a176da35fdd0c4cc75e933932bf0ea4d9df506b56fa0e2cd6b233773c66d8835a4a0bd66dfc60e7104c0226e9f7e78f3b976072d9e4e212fe4dc9d89a851351d1bb12d2e3e8736bae9d6910a125277874cd0b9cf8efca408364a27754d2f38460d9073b5a07b044e2b15c88e0bd3afb05fed65c4c61031016a541d5c3d6d575a8225d722900a42d6d2630e231369e817f8b45233cef491c286e1c669fe755bfe8358a09d939cb6f9e7aaadf1b17ce964220dca452f0e8cf295db6bc11aad0bdc161118503399296071d1eb1f6d747b3ee2e0132270c8e9399c29548f197f319c46388561f76964b378c011d6cfba664d421576f119897241a5b3c9f9815293e618b530f867742c99055f663d60b4723a49953bdbb3b8edafb7611227dc8dfb609670613e0c224cba1e96347da7cb66adff46aa07c5bf232edb1b7642b19a2fb5c752605a6ddc8abfce4dc1bd2c670c4d6d110b9dd705dc6418c93e7289e0f78bb34174751308b0501a6c572678f12ac39adea5c771f2dff97653b3deebc71d8b6326e6b7841084140cdb3ce012cf89b68f96c1ab1ceef696fda11aaf5fb7675cdeeafe474a5acfb4ab82b812826bf1cf521fa7715f61e7e3b69bbe0c6d189fa62c73044eed5058d7ff4915e4512c2ab6ed639f42c3b37b87a82ae61e9e528b1356ab40f3f358e9261119997f0679fb126749f146cf4c7a2bdb34d90d79cdf4496379fa5fe6dc4849e8d88e0b29bc2d8cc9b8e4a40b95ac7658a2e00087f2a1f05bc479b94d433ee78c703aaf435c88cb1a9ac185fff4d911265d431f4e275cb14776062ab1f593a806c7e694dbc1d47862d6d01034d2c8a34d4c4a9358d5eb342e76e9da995a0f365dc7d9e27953d93aaa54596e319842d5d6563d842d65172018ac6af08dda7a3699575dc0a57a5fbaf9fca4c67eac0f4fc8656319533da81d0d00d19515dd9b53c35eb856e89e2d9f57b6f941a478f7b82b60057b54c766d5165a65f0bacb3b33e2c633cdc9270c92cc6a9f072a62c2b8082e6bd2b86a19ed3aa26f2a030c227efe76164dd17dc43b6100df3f98d437f966b9dd45058d881082c0376a790818dd2056a9fd86081d411d60011177351f204de8a3fcc59a7ce4f49c05d9a227e5f74e4e34067230df4d09724da64ded42d8c5a304207ff8bd119b1f219f09d250769246fe901d5ed1062b1f0a26a56468c7d7d249d9bc0f13407c2fd2e3336f23fff42650c20ef8bc158d4d82b9040159958a5ebb4e03474619a1b562cdaa68243d7bd672c4cd68682137e5fb85f42edcebe72d9fa8dc081d43119a1786f5231cd52f3eacbfe2149dd32fd0beb5fc53bb71f428400ecfba6167d4c43a369c0ad272184746dbd66623d37ff4136fa5d6bccebb37e5a965c5da2cf31d1204278310ba3fd7873f2fc4c1c82f3b41db7520a8aa4443d5a12591503b758ce9191ff89c55abd7b8147898415a458c9223f69946af9532591d98868b3b62f8059d0cd03fec6430218136496932cbce4c6cb0a96083b8eeb945440d52d5c24bafb77473c12773c80aaff33f02f8c8ebb8e12ab9bcceb55d3d42b38c6fb19e6c2f8fe149eaaddf89bbc536e2d35445ca1ea7ec2f243992692d3c6d6da876fd43cd4edaba8227b05a7bec889aa6ec4953c6e97e755d6b59f9d05af816c6cce8b8d11ce82e503cef22944c70cf416bdc6ef7cd69f1320d12f46fc5def1915d66b38220910d1d95a3cb4c0c76e96d770603fb7b340d6ac7c34452a5a764d0ce7f1c2a8360bfb1d9d43cec552250f2b8d0fa181c6730cc4076d0c121d9d94dca3bdb0f6cdaacd4b18a5dbb4efd6c98d8413b97d88ac1222132800461feb7cef7a3d87904893c4ec5ce1603208ea6277c62afc0d6262a3211003c628e9d661cfdbefcb273f4d8e6bca74f0af25d64664e393cda3fc2d2c5b9e7ec25d03f4eff85952d01e0a3e6663f1ef01aedf30f1ef6d1cb2f3ae721a2c1ef78934e6bd73e372e54ad731fd094f53ae17938d710171c2f4505f01c7f93d020c8f531a969a3ba935aff56effc3887030a6ffd91cd19675d90a589e9545e8e83c592a0816cf4b7cc253fae9bd41c9c81544661aab0ec7f6296572cd608cca51f55b4c47c48fad5df9fb5a6acbe07ddbda5448ea920570d463d62016c03a5bafc61a1c521657dbdd6afa863a924c0f1bee7b3ac168524b9116f103132aeb17823d2a2caf92b4516b83c62101a6d10828c00d9e27a46192acc13a7e4b16fb7849b8efffb8b0319898e3029d38701bf3530daff595ccdff097f1170416faf81896c7f00815f53c2be5f7246d4794895b4b15b6c3944819dfd3051b371f6d7d52d9f8ced84fd84095c33ea013c78aa5aa7176d6aa9bacabdafe9bab89cce4d7c183b9c0d2beeffb40c1380a1330a8fd5b56bf73fd1471025c6b136c6e87d7b3ef34899a99fb92b8b75051c70e0b95fcf87b4e034da72bb9eeb91ad26808dc7e266cf6a0908e66f584014a6b46c0c8210c5fa1291ecc433f0c68f05218a869b3218d6f7758dfd35e1144506b6ff8b60601645749e2ec4e1e3feb627fd2fee5ef4b26828355687e4ef9aa224bebfbf6187229eeea3c9fa2b3f3c0bfb02964f78f1db8ae5908c0ce34a7932e813d72fee4c920c68e7e5ee7acb2798697ae83051f13c4616d057129cba5afd3bff6d646d780e98cab3a829375068645aab4c1a51bc7da3a33bde237607e50c03c8aae448d33d49fc4f3d32c896a677b4deeb94e01945aa741a4ac6d9f8c1662ab7b539e525c827e703ca9197658ada615cec2666d13c6171b4c2842d5797139614b7eaae36563a711778cf0a85bc94476a78584bac0bd283536fe3dbea0e1c3127d78009ce908b83d26e738bbde3ad5053b7b3f7725a05903d796d497acf88e1373e8260b41e21067dd50581d7a72e635dd0bed2ebd00081bb07aae0ce815f908e13781ab1a704e060d40d5499b21e67d2ec0145df16cd3f15412108b0cdaa25727feb9f8dd33dfbc394146bcca98546f83205b615d474b193505a2ae65b70882caa6257104cd33dee3ca13038376be718cb518e56b1fbbe7d5cddac39d2b9a104bb65aa01b7ce9028f53d0aa402d93279de6e366a556c501a8c33f871db8d5841da7c002abf37dbbbe76f61d9b2d60f6594e2141969ce4eb309e374561df5952d3130c1510a1506ed39bf9ea0f06b66221537922b952a9f90fb758aaf41f8400ee508553f4070f80714b527bf649f1ff988f4176780872df98971a146ee9f412d218d24bc0a509b509fda65feb57a223215a20a96d3eddf36db6020e1cdf180d20b45979010bed61203b5c0278b045715e6c8d58035659d8e1aca714985f6e545cbba1482f9c1919367cfa1009046a7ea20eedfed4ff54f4b6e35fb46bfb659cd8a74045b6d62b41df4ae6e536a47f8f8ee9d90a5c9a8ddb3fe2b26a0233ac2b370fad0e316a828f6d1dc91e6c10f3488765b506f4a83300ff3335a1e58890a40a4d3dee2999bd36628e170813ea741e2e0b387157a902ea674d6ff8907ab17b94f8a9820a1439eb71e4375ee8816094e552a9d5d02d6c0c2aa9a7da9d7a9d36998a46564d4a9712fdd8c06f448647214fd4afa108a5dcfa9bd0a3d46718a2497a8abac78dad435188d438d5a269a667bff9a07f6b92e41a4d4aba5287c56f48aa627d7225cccd0b855f171e9c9bfcccc83a22ad6385000fb17071e16a1152a8bbb9e4d2b029a2c585e1d1a69dadb8b50b3ebcc79aecbf2f6afa511da88d0aee20f9a765b7345303fd04ff0a200f78d4cb5fc56a8c4a801ddc40de43ad88f68d7c9a2ba7958d5c3b7d2105b5be419b90bb15d2e2922ee14f77dc801ff3a5840b2123f814f5853cf068ce6c35e2e4cf7d4d097bec46fa5128d035dcef155351eba11f733a31cc63b75275c907185952fee39316d4354d5e5e77e54b5d7d22dea38ef55383e4b36ef4ccbf72a5d91fe49a216b3a26c7887744d15361c7a58488c74d3def8e88eabd2d39f41f9e9fb8e2e388ca6c70984c3a707f0896da3908fecb6e61cdc688d2ece52ccc166df6b4dc4f8c59143e01f8f665c38d80f182109f2464f964a88efc6ca1079ffd7058844f429e9fc7ebaf2f5999615a86aa2b5bf876b37d4ab0e5d7caf56cf84b525fb7aa7151f6fe05ea4fc28fbae83e608f1b7916fc65f68c37e57636cf6d769056bf7c3029073d196deacfbd42cf0eb147ffbf99823bee76ffb5fcf9a1580596e81c43139648fb928480efb68b678e18c0793a82f777992da7b9cdb285508ef27e5e8da02c24c00dd89290e0175a130393085857be919d0cba717705dddf692fa3e6ba5a4d2310e7d4a061de591f640e3a3db77c6a225080c27d77482d6d2a9ad355679 -MD = d0db3925fd16e5d96a41eaf6afd702d62f52855a84e3eef742edda22b0b1829e0f1f13669454bb06d72fe133a65eba6f - -Len = 92104 -Msg = 492bb3c8f1ec825b71fce8a753486d26f34fde793fd93ababce5d00ecae3a17928230bf7ba8ea9c88a94750b0e652f8ea96403e573d866b93de54163d0bc51b9760ecd28bcc64a0475f7dd1b02137f90d15fb5e724a3705c14263179d5d972e73bd342857dfd2fb73a0f6801b9bb23d475273da7d9a1204a488fea7760a4ccab805aaf33879c1e8adfc260e2bbc3e4019ca6e34e1a3a402ce107b386fa8426ab4c8b5f5d6209e0246efa0be98e958abf4fc3ee0470d696a9e878d3ce29e14992a74e992994ae3d2fee9eb33bbc97ddb89566a8f061ddec6a64c993767824fe06998ba4bfa7f2fc5068969e03cd33a5917677573b77b708165de23ba76cb30baf2b2ac948233ce731e3ca146747d0a9f5fadf440c3acdb256dbab13888ff73837641350ec8ef6c47a67225f8fb4d5b28a2a84b78c3185b4d2e70c624268584f434d2e81d272875cd3fd86c6a49bac88f80d4ff7e3e448d53188ed72fc7f3f167eec64a323565777e2abde90ce85bcf3e8ab284e38db7fdc1cc73689df5d12578d4b9b0006c3cedd527b120634f96dbb020df802b39f90923aaacff013893ad81b72bcdea4405455c9750a70ff7f27a7ed3aa55c7eb7e5bf343ca0efbf8b2062ce67b086255551a8efa0ae16569f5280523a19a4beabe42bb18291cd0bec2bbc4e345d40b08a2d9e6e04e73f62e2560ed8163a229e04f79d5a868bd42033c2b044e1ad546d6850ffeba99b344bcf9c1928d5f21e444985ded74f744a26e84f0458748709857622931198b33e38ef8a69e97f28dfd802f6b7cfe536784494398131f7d2a8203c0c2285d818a351c889c5c41dc4ae83b7b1edea51b7a6a3bee8ef7871787965437473f271b0abc0e402f761b6add36cf1204bd19ae11c6beec416d4eb60c47d12c34ffe6c65a0aacb5bc56752cd96bd37aa982cc89a21c3ac35bdee6c72d19032627e51d01ec83a03fef87ff90b3e9b12b79ba2e4ccfed381a3ae6dfc96e7c529b7c894a5c36d9516515850b44f153009af1ddcf45efcc4f476affaa3b45044812cf56ff33bd5e68cbeac838a8161a4a4fbe682033861be8e16893d6ab45236c128cc89c3704853ebabbebf848a6b1f6b01be3b164275e8d5eb04dd587e36c37213168b1c491004bd8254ada9507bc8e72a6daf3764826b535ee78376fb44121b549b1c07ae742289aa37f401bcd9c79fdeba876d86ce6f90d5fcd6cb11c34c445523e58b87bbd5d88b2f3d94b6cc451b866f6bc190a21b13b9097f5fa9fd98767d768eb0bc2e44318d03306b279d6ae4885202396a46976473d7253aac381f37345bbe7e3615981c187d748df5955d814e2cf5e0fc020c0b692e716500bd0812e29c1dfedbb8f8219463b2020afa477a3ec4ebbb2f1ea29005d50be78fd47c8cefff5437945e8dc9697e91d34c144f58c2e48dd4e9e1807cae969ac83fc4a32fc44d0b314a507f9bff96ba07a52d9ea2415283321395cf57cb37c610fad7a482c74de9f5e3d7f520bf73d4a6fc8b5be023d774dd9680b6a7c68139c8a753a80d61c9978a493917de0fdc88b93877af9bcf3b09de58ea5ef6063c98f82e81d659fa87bdf862be0e5f589a7e464339c259af46e93c431deecbf3308ea677a957edfb51024818b0022b03765d580419bba52ac0bcff3e608faff524c1dc69135251caed0e8151551ac87635cef4635fc204a8702c3030fa692974e2d9a1ee06f00ed1238aabf7f77fc01ba2782448520100911fdfd50334a3c1d8307ffeedcc59ab77bd1ecff1dc599b598404ef9b3b9d204e957df99e5666ff89d75bf94fabb4b0238171f4274ccfdf97a2195e4462c1ec459aafa1e9a8d96cf09f149dfaec29a63f392c22819109163fc560772c0f93eddff61dd7cc71258f734f52efd7d6e21432abf661e7f230c7b8b58044398a3baa84706ea22ffb71f07bb1bff9ceb3048264a078ba41b66c7b6a3a22cd541ae2ac9dd24a0bfa8ce618718b01c2c8c9ba783ddf5a347726e4b9bd1cee196609b07990e25b18156dac8ebba6c052ab622a7f253243d8718ac10919228b30559dcc9bc76946d368e6eadac3caa5b261c47c1e845fdbad182a2af3e616a21a0b1f5f9aa82eb644dc3ec885efbe57e9d037d9dec22fcbbb524d48008cbedadf6ed690fc9dfb517257bf6f16a94c7fffe2056946476abb0a083c43b773e2dc88680c884b0d96bf65c2af0715583ac5fd7d7453de7bd852a3234042a1034c501de0076e0e60c8a9250657b70b6351d0ea8bcec02ec740398d899f6d44a5c3dca4bd116bcefd59b7bb09ffa87f345949cef359d7bf916c18d024a1ed2abf0e2b27e970a7124e11902eb5ef02f9321ad7b19d5ec11842229675da90eadbbbf6e3ad4b6c4962bab8dd86f16eec01c55c239c7124a5c1432b5b8295b28bdeff43ad3fcb4f7a46a91545cba4c58e2055e6d59657f5ac43fb4f10023c51f9baf5bd30e4515f614783f17106b83d11dd4a8194a83717fd25d1555dfab7b35cfa032b15a4c5e627ecb114083f141c9dc10df508d9f9d3c2ef2f07e974ee20db23935703870f2af3be9946b37ca0aa5953040ada318571202a7c2b5d77c9e29ebf0c07a3961874ee44a44f1ac744316e1b9887b2b8c339415d1f8a600c3040ce55d6049dd8c60b3f063af6e427e8f704a1313637779c734d1082ec9b3a0b81936e591698560239108cc404baa57445416e38dd1275f6666bcb0c19b50942ee1491fc043c16b544865fa8424347d06350091345ebbabb5bc41725d85781bdcf7a462a983222c575cb0650752817e59957fa2c36684fd19a807b35f229ab646cec16489822821c1407092268101d992f7fcaea78343b226bc680a430d28e200c9387bfcdb33ca06961f188e2a460d56cef00b4d2f5869416beacdb58fb32d7f89723f7ff8e5a3bbb0244e9aa8ce8829ad024f40d543911e2928a40324ba072791f7258f65be3d454128dad896fbd86ff49be11f1f85b8019679f3c886bdfdad553fb4b79c1e0527ab8513b47f5e8cbe3835773468af4c8016875382002f7f5545c46365268589f761c1afdacc7703790a57682d4b10dd3e2ba939ac3b9f1ad4062db8247f953a290676f5a7f8d5db44dd8a4a66316ac88068881cb3938d4e9df8c4398211cda430fc1d9ba8aeeb72961446847ba60dccfb4f8c8344a26a8917b0305dea778f36a3d51df859393877d15104acda238a2903332ef3cbe2c768c5aefa9bea3b6a9ff604009246324d59ab165d2a0e34608b3cc5f7e4a5cf145c4c477b79fdb7d01eac1b5dffdc248a7677d6a892845311521c7a7fdc8ed1e1d2003c3b8e919760513a8d9ea7978a707ccc048f6cd90a2d1c06c31f51d395a06885efc34032349bc635cd4b1004ceafcb1c426a2f88b4045790226eeb1084e09e41c4ab157c19d2ec027cdbcfb07b98efecf2d130fffb47835d3ad6eec22a12d1c86d4b94cbd1a64134fec94d071bbc69b2a84d37cb4a572da25efff364ffc7b19e4c3d34ade6965451d5bc0e95299ab711d556aa572bc3c51411428f75607f9c17e3e88b9eb32393cd93fc8ac72fb4666efc55ef401a1dd836f4372970069b1fd9b6e5e02ad1ce9e2cbc3358399879d63eafe39cf28fb5d57f7a4637e15cbabb6847bdf8becd07c1e3b0c8ed58ee8bb51542882a0b072c5b4206085145dd4eed2828c93bd6ff6fad770455b0a1ac4a516766ac2ce62af1c84339f60c29f2d823bdbc9010000356cf7b394258a05c4659c98ed80c1045a6aae78887aeea57d6fd7d75bb1bd6535d9654c2172bc178f01c902d944e15e1bb81a37445d02356dbd90c06a2b5a679f49098315cd0a17ce8487fb5597963a980db0b8fa916418a5754cdc1df841ce1bc4cb9f98bbdbcf28f3bdcc89ff485e7c715842d39c7e16cc9ff5759d9fd862505393ead1c69805465853be9e065f936decfa1ff708b6f68a4172d112a889ebe7fd49aae975a782cfba3017bc3443a113877e958d5d76828965ab38a39cbb3087cbd5280850710e6c223e1f0a105c501849ccedbe2125806e1288f47801d5fad9c31fac54e05e70c5976420b1221368213bcc6fb1de2ab9e451f14cba62411185f0107ef8acd77281218a60d9f2ceb0d96367628f1beff59129ce879144663d32578ee51a3d42da48c89828a809f6f1e5cb83107f61dbfb1da207ee2431ac468802822be3190871c49577c049eef4f3f07b09bfaa37569531c484c99cb07bf331f8d5967aca92ff9b8f0d70e2292e7ea079e2b83725c88975982e60204a3b0dd2416d6f07d8474c75bf43809c430e5a9dcff4434fb399a09025ebfad985545c16e634fdb4c98e1ffb2b02379ec3fb4e908529a71a6a32a22b73a4e0efec2fa8a2ee118aa727d142d4dd30df11315d2421a1682ebfd1f957ed8b425b890432b92161eb5c0879777ba9ddb6be1c169ba2f72d981e677157877f74abb1cf57c6573947acbc0048e89322317d1ce8f81f91bb30a3c039d0b5f98836c92aea6c544992a93bf2b71b8b52e6e36c439c6250b814b3705c5e787976b1da821002cb4258d58e8046547aca7f9efb6a7a61d996e1abbde73afdf10dc6a267c0a93efdf94caaff6300ffed0ce4f17f61085fe759d22756f0a13fc1d7b102e56a3fc789e2edb803cc67e2fdba4788793836bd130154328673db4c7241ff795d6818c5f76402a8a2a3c422313a710af0d74ca4e5f62f7156582e4b8cb177b1d6a27c5fd0e65521e4d05fea12f52a20ed26923be6a12b8ecd87e3649591e24f58ffb5bd9ad2acccd23b806027533972770c4fab9d681031f4e941c1174808feeb6a0a08e08fd05173cd6facf8bd68a79674cd1b93b4a501d1649287993eb16498c8c26827858957d06c73f70d997d68524352b44eeeb3a76fe11ce1a4dba52966022604f91c9e86ef01d669ef50415cb462279d587c02cad34929f5bf87abf65e007e05ddbcd988da75de29254b7c2cc3b994ff39c85a130782ffeb72aa8d7386aa12925ccd000299aed46037f1f67f8830e0027738832a1276e6ec45ac1147e8e829d4fdb7dc9f32960035aea976fe09b055cd9c3644b6fc0b2820c1f5001a8ca30cf348e23504af14a9d110ddc651501f398930296760cd2b0cae6ded219678c10416c5b7d3dc170f185be8f4ac1f6567d55db979b2cf8ebdd9bed1fd3e61b62c5765fd9c7dcd737196fcbb56f1104e6e7172c18deeab47a9d87a768b1d234eca4d0977fafd7fca2169dc136a5dcd151e55f0cfcfe39efed75108e30187854685302abb3a199c2407d922779ab7fec25dc8fe6ca6584ebd2f8b90a0c5442ea84446ef52c29ac98a0b30f7704ec94b5b1513c41e7a16638b98d03b36411cc87cefd981c3fc47b00215b48285ec595aea2d7f6b70b4e68671fd66302cdbd7f8c86d2f08964eeaf9970dafec3edd30d6768d521be7ba8e5f754396980afd3c6896a890ab5422494c4edb675c23891665081dd4fb0df5d695a253a89b590e15c0ed87469284df2e4f316725fbbd58d2afa7c54f3469cd88d1fd15e460a07628a7d6f298e6aeed5fad479930f093b32e5d5b6d09ed83ab6aba90719210679c3ec657d1cdcf5ab4a40c985ad2642d00f0172cfd4b4fe4f546f96250f9d237ea1ec57b0c2e74119cc7152d90517f14a8e184235d5d821315e2357b9862cf96c7924b478c03fe5a0d8e6f0d25f668cf14c94d477587ad98710617e433152f0f9b6000c5379494be6fc3c240ff0948e6ab701aa12d11f9fc737c46a4075a1927cf518efcf6285fc42a2cb8cf08d246e2d49d92376e428dc6810b6bc3fe79b568c92d9af4b20887f4a692f7c126988b4af91a5d131e64927e057a2e4affb92c59f2bccfb6517d33d64bbc271e43a53fa681ad243d27bd2fad66923640f164a682b2c5d249bdcd8bf38274f1ef463f887fd41f8fbb6f968dda0c1b2cadbec04a6c72124eb5dc40b8d2b180fd3b17af915b5a374597e036d38d5fddb7994d16419e9869e9039820e2fb42a9f20a9e3d80c57bbfefd961e72a4ec79f800d86adb3a08e934b3ad7b330f79bb77864c3307e429f7d3487d9efbaa6ac2b2f1051cfc7fbba581d628343cb4d267239526ed2b25c2e3bbdab3297aa1c76476bab96c2a536867f07848316db8549a2dadb8769459a90bf314c532723398dbcdce53dcf76d959d2b0a6bf7487286e0e0608f63e5e842dd1397324e74c8359512bc62e3e626d9a17c1d31fa7f7bdfc7f63e0a39926a36d3b7d278d1e4e8443d0005652579079b317e1108bf654cc5bbd996b76c1c57eb9c4a470761650c4b1ff029e8f6229850b9ab967eba8c6ddf29051b15800629e77335756c7157bca0ca8daa5cea654190a68f1df270674792bc033bb2f9c258911513de26864f61ebd913073f86c3abe18483080275887276d14e690e5de37c9ede6ff1b414bea482a83ab11f3fc02fb9d031e53d4e6267021551338600ec0e675ba440a3b117fd0bd45f386a99ed5590161645f14f77adbad4b61bc8a74e7660f94b5b53c00dc3fdda1b1da009adb5fac2aaaadd0d4abf07abe79234958d5d3253df9262d5e2a1df15d8d16e2373b9507269743f1c6e037f07602758701b2b41e7eb965f77490f063422e4136be1e83781dd42b5d134139773aa5ba2bb8a592621d9d78808a37429a183d63e477abb268d6096dfe03f77d78d40afb1dc5d6f459e24c69b2e8479afea76185d3aa0ba9401add0fbae02a8b590ad84045706e626b976f4074d5e781f7b643aded9f65f066b1f81b7bf001ec84a5b78f8b0195640002ad03ad9b3f7eed0f8ae6199ee21044630398287da5275f6d51f2d7bf728380edafbc478078194878df353feeaa9040f8a68fa9cd3ec454294b7011f32e46531e1d7229cdbada70baeaa448d8e4f8c4378807e628f34ccaa3501121e5f036e15d9e2e3bc92c4ace9d523a1aa4b9d137e95208c6d8ec4629a106deefdde1d99274daf765bef7f0c8e8c0ff9e9a50a101d6ab9b3424523ad8ec15de632329bacf297ad58ff24254c765dbfcbc01d2f38ac63cc615534db0414c261a66feef5efe4626d0a1ae36ff34da4c385d23664c3981ad9352ae0431cb88e198deb85b4f899185f1833afb787510babb6746353678cea50ad37da044de6aed62b5979714d6d3403f1edeb847f4cfce8ec4b36638af77cc3280084872e2b8f380d1e4c8354fd3fec258e296f517de30b85ab222db4442cb13419625423f3b9af81ce6193a5a5b68831a8dbc0948078741138a91a5a0f84ab5ff705f3c5ebb8bd47ce7b0ac613126894d29520bee107b32d585da202b61f021a0df1de8a5006d1cdb2db513cb1edfddd7fc828470c2b6928ae926d44d44665e0e2987cf7dd1e9d6200151f500ea3b85a24f72fb38e5dd6919ff9c486f6a54742f96c6784ff7a70c33ababdc685de48b94694af8ad419bc06a0f6504f79c606ced70026b813b4ec5fc73ed4f6b3f7ff697943303379d959e6561a8904fa0354d2ffd62317d63860a62a13cd77157b7cf921655a53ec3760bf23c8e75dd3e791fdc870f51a937f9e2507cc3fbe26e311d6c38d7652a79e40ff9ea3f3a0b40d5eade5431536f814d55ab4da743264c98e80f42e1cc648887b362b1e267406cf0b71cacefc036072a6b5c5c1337a5b99239627c9d6152b809fe15da9f84e38c738d7ed9711f6592392d4bf12d60c77dc7174d2d31ac5dd00ff9faac9f1a5e660575ec22e0f866ea21a260541d45f55fe18ab89fc535ed9a44aafa710ab018c34f764ece64d4a0d78bd284cc0c6e9529859a8b1882856bdc4d1bfb6f08cf796af8988c2624397b211fc69da3226411a15d50aee18f233d5fd554e6f0bffee925a9e38f7249b25f8f8485941f86aecf9011b30a421597cdeb825ba43a5ac5d0ba0a603dfafac4b4eb6317528961d439bd49cb85823c6a8248fc3a1c95ffac96f2c2167f0560f9e2fb6385be29da5fb5f2aca108eb2b23c33decf9354bd73ca3957a0e3edca2d851882dd6bf461ad6adf5e23c7cc30b4afa93fa9ed9a309fc606bd94e60c8eae96a5968123f2948c1888f94a5c75303678e12cd33efe4bd75333b88e0ce0f5db59338bd42251b8da9ae886ae2d3e33c03e7820ebf5e571d2d85cf2ecb71f925c335ebd46d5962111487a80bfd86bbdea56dab644b10444eaebfed741830d06a9bb93b549bc246fb8d7bb720fdca2210d6885578deecf37b80475e02cef2da53c685f0e6d44a117399f27c50eb8662fa1da047f280daabca2987ea7ff5a16109cb03d23121d809a3c254c044cea2c1c5021d4a7939c2b56333e558949624abb4329aa8de895578b18f094ba3ae0588990d6726b5128c596f26cb72e8b863007a84b13c9415a7a4c58879e5169499fe9dc7e6a34f1221df1688a0fe246346aa8648b254fcccb7d608360c564586456dfab70288ef42678f7fe3ccc5ef9fb5f0fe0604b9bdb66d55a1202b65d78ff11bd766249f3ca847b1d3beb78ff27598190b470f3380dbb16bb9cf3cdc75b485515d5ab2aedf4ea98c39a2c924d4ecd76ed4913b8aed446c5e78c9a981c6ffea57b41d167e7f3c7669da166a4b3e0d5a37826ff085abf884770598d81d737706750337b6d7c5799490dea202ced8df09bc3c6696ed63ffe3fe89c333772324c2f3722efc81590ded496ccef973496acd442b00958abc626f3b2bd320597f0f07182b8c4f43e20068dcac23b7033ab68c1876c455245f281275144f09892e3fbb2e53d816e6095aec90c728a44552cc3081473a3f83f359b3f66bbf55d0d9bcc77b159bbb33752463afe56628033ab39fc5c3ebb96e21fe3a0459ac6cf6288f1448975ca5efce66b47f2d63ac039973c32c145e2caf911d8ee8069db6c3c2bf89dc01a33ce5be26c749c8a9960e18158200621b010ceac199ea991a9bff50540d817cf9e8dceb6e8454dec050ec5f9fc687d4ab9e4ed5ef42513bab837179578a7d30e4119bfd45d3ea962e4065151c760b93956d3df9b1716713d9d6e2e6cfe71944ee1feb9db49c51187dd041e2917ad2c661d4a0ff0e0e724a2bfc1a3fc40c9de09f7a9473c1c7d28d3467477008ba2496983d408e0f02bb072a5de12b3fe1512e7e8a5e26773cb51ddc6c4064881d4b2bc10fe64fba338a735c61ff52464d7c5313b8115fdbe342effc49f5691a8d8eac64b258e9198a27b64b713b5de43b687ae66a74c5f7a4c12c1c652b25c5f234420a8e5f0534efd9f77ff35ef41e905bc980095001d26879fbc528ad40913286143a0bc24b114be95e7f5130befe359e6868fe6dba7415b3857dfa42638636cc4b7c914b62ba849f14d3f179648b12798026b09399e695b7f1cf43b136ade64e0e5888c0f337844341033d018dcd0f333943868a452fcecd68406bc3600d2a53865758eaa58e311d0c979b90e2cd1516ba46ea196757aa3d125ada408aaeeb25da00699121c975759e1875ed0b920a682cb7430aa767104e16a4f9f05b990f0a33db237d0ff037921f0e32e1af24d872b61ff823ac66e7499da62e9a7cd5804bb971ef7515095fbdb6ff3a34768c657c8104732d1f5c1976cee9e208946a242f93493342de1ed43e8b75f5ae0ad19bceb5f11befa7518d1dd2f47e004c61e500eaec58ac1036805dc7f7cb1610fb60af796b5833ed4e2b86d04f684b4cc1aa04e5e0c77b545a4a62920e243633139e69f5fc92bf995adbf9f1830ab13b925a85adafe77751911a94134068d419203c42522b315c527e85bd5d17cbf9c1dddfc969e01f68b0e3d83c7318ffb96a2a2283b8809dd2c0c1111b3b9312ed87a9201942fcd91518586ca2d91b51adcf3a38734e843fe98c2b675bb380495335fe05bc608a7c4732f9bf0e6ed3c678ef56665c3dbe7d695ec470c5ef65d7f473e476fcea1270c6a6cdb7c85ac7c7e174899484acb7c019dd9512a014ca2498e7645b1f091d1c5a1bdc3d17c47fbab103d8aa34c4f571c2b2a536364d3798063c859c6ee432eacb392f3a45d48409b0474d90b4ad02f62c85fcc5cdc0359b0818502231a4d941e0a9cd9498b45d1aa6e5ef2e4c8e66b91ffda3a5ae954b956424cbd3b0709a896213be35598992575b88c66c448fa72063c2a1c021f502eee30700983271fe2b1a1e0b03cf7eac2797d6db33e3da4f95bf7dfefc6d08e10e4d69f75a01ce8c8dcd73bbe844b832f1217735697394e67ffdd6c343dcf5705d6af4b7ff63b0cd1846bad6cbfe62ac1fc214dcf83ae8f246e374f77cb4e53744024e4870a13f47344c9a659346a2a2184255d9c681fcfd513a00a28f3effbf29dc1fb29602a2844aa6bb6f2a64a09d4469e133bd8ff88e0ac921cc63c26c8f75c110fd58d0020cc01dc6fc77a086250bfe61f2c4ae052ed85a807ee288532f9179c8329d51866500796315624279c0d5cb7c1fc2244b6323b3c4c0f3d7dd28e3ccf0594fcf5719708239c0d391a3f80a96dbc1a13af1b8549d96987ef93101d582307855909cb07afff107b2d62c54122825e048381fb2d1e09e106c347942ce622f9997dd7eb085ba32f2e75a3c5c554903849f66ffdb0344832fa3d1da74363596c3fdfd25a3f879a5885b62f9993cc01db68e0bb6ba5291eefd0c177e1e74c30cff6f3ab8103d05f2d1f4398e922d571a7dfd716fd7278e86838f508dc8f2d43a54d5da6080bb26c0d59b2621cf91d4a3e2d4de50bbe804f4c815c22efa1730c8ca1726447adaa3b79d3970dbd9d1005fecfb9b81edffbcdfd484b78a3d4b9e5d691d668d8602468030b460e33753a3f7a35af02bf5d27bf0b0c675c918f6e8a13acfe2622c9bd5c396f63e62718185120fda24765ccb0ccf63c144121480d43e4416e1ecf50d1927d8e5527f10c26d5939618189a9503623f55f6e8db7522bd98fd8ad5268c1da55fd6be3639b7d257328d84d8d64cbc0946f863a648cd2b41d24ff8cbd0e1de0f50d6f3a359a1c730ae428d1a916a373ccd820efbc186939af0a71c7556d8af2ae11d8a01e960620c376375506464017703814d6c0e57f803a4918a5410f71da280f905b4616a3f448e5ef21cb7c0a742b984a37957a7d5364eada70aa7c385e0c127eb3d4a25bb64139377c21406951a2ffaa5a665fc978d5f4a16eb73a4947021f8af2f0c29630557bf6b0301bc57780751c86591dcdb7366f54e991d30a5cb1409c5ec4ffbc282db216031f9486af6b028804963bf0da2f64db275fcfe567c27c9c4175e0356771e67ebe173414bf0bafd61d464199a767da1e714ab4412edcdc72e12eee69b5c81f16283f81d76f0a83ee1691b732e887d9040e7a0c857ba866078715afc1d9da66c68bc00538890d87b83a9e26226336697748165e1b14ce24417a52ada39d50c2762dc1489dd3bfc11dd09616d1e11d935f6547336ac1f51e09040e7078c7d23c0e586bd16f17c53b031fa00da729e45ea2ae3412da4cc55b486b717ea92007db7652e628171bcafd5470e5950c0532d3296b0683d37be8e3e4f8a2619c7098a7976359d5fba8740df60b8d35683baff8dce4e40ebd1803bec7f3caa1bb7f2ca857d5ec6085856b75d338bf76239404d7a360f73c00e9c1f5d7a410c46d146ce79feec9521c7c583dd13fa3dea5d8d9786729669404b7c78efe529d5419f9006b58f815332753e36bda6762f756cfd5e10e855a9f3249c094224798d929f48f3c6839fb8910d3b309d5fa24499f40a11c82bdfbe3f069520c2dc92ad904cec163b9faa1de3ec4711ea93e105ae6f5e531a91870eaa7dd250006217bde124f40e731822fb919eec4b3407c4fb594b448266de0e23cc06ee2779597b26fbb3eb1d0ba1bcea3091855cf81fb08df12467205b55b785fa1e4317ac272f8156764bf273b0ba623760ccc7a54056461c7730cd668d35bddb407b91075fc74567e8a10f39b9bdec1c890d0bca1e08bc41a02be9f708eb23e609f2341967b4fbd68764c3cc4139e05676d099e50d5a49075bd2f6ab4d5a6080c7316150d38b0cf8df11c0a9dbb1078bc6b20274a2cd84b3f6a083e1cef5fc5224c3b95c27bc01656c228660eda59a12d51bd60752d4e7fdfd2f024902604fc09f23ac89e8ca61929b31757ffbaa40823e9874fba202fb3bfbd9022f8c0be36292dbab787b28b606f8a91e658a1173607f927fe024ca27046f390433c06b4faeac56368663697749110401a01d8dab23f4a447533fad03ddc3b978c45400fd0b481dfe52460f1dcf50dc9fbe3a7160435a487bb3672e0a2e95e4d07f9b6f640ef2ad336a778c2200549d791e455f3b54fce98d7f4fcfb27d5255bbb41af92d30388ea61d9c631c9288b10e5ed2c984cf7921ed454e04955095569b006750a105863ca70a192675ec59c1cfee7722e5194b6c2b73d65f1b3ebb91eef2e4e878056831b6ae6238c674645a4e4b870dc4d8d032b8a99d41ccae418237fa28331a966b0865892c2c76c124c50a04a6ecbc74c4101554f75f1205d391f684b5b2f15eeb1b2418cb740f69179c73983b422473838ee1e4790993fbce5bbb31020aa4c584f492dbc4a208c2b96b2b74d890a55b9af98ef696d3baf6ae49f67d818c9d40a52f0250ac38fb74869b8238f37ab7a3770a7cf9d5400f6d0fe728c8d8db5376e82512f5e69b4fe50bc828431042c3d1a41c4c7cb8c109e55fbdd2b16c595fdeaa61456a085b8e9ab55b7e21a39b627cbeb97dddb5e922f60a2874a5b0992ace888e19fb85fc200c1fc0045341d70bfb036c71bb512ae2f5bbc19f444a0d4cecfee5e148e3ffbccfb7b05b666fa838d32e9fd8941f08e28ad113a2eb9d482ea07a136bc0b6d8bd4bf996d3c98161619b9cee02e683f57a1be699302a2ebc589f8690f9f153099a0761de1e0b2bb52ecaeab191210493423f68ccb77e72ec4320a0d92c695d24db989d008a99d2f5f8d77494f3d22544b35bd428b9570e5a86da55766387499d0a65e7a8b9f3fba64847e702bb887a9c45f7b527b65255898c2310d33fd98ce4aef5fe311ca81a6895a2ae7548a2590c829988542eeefcebdba16f8a31eebb8e21df3d243334b39f896e27873bbe6507f1c7ca38939b4913edcbce05ca254a1c1b78110c9e186bdd6c010e93054b13310bf8f74f74c5ee744b18b8d0691bacf0f4573664adc18784e601b03325b6d7fa39a3abf3531d319f7c0ecc64af4078bf35030996e2debb385ff6b8e22db047d6236e34eeaf0fd6e7e914554d0d2221d955f2074dedbe6b5a6246852a7d95d75731af4e7bf8fc23002acff003f33f3cd1efaabbe42eef0c8d7587a176a5f60affeced3535c180ca5aa9a83903f1f62e3b6a9393e416ff332402209a41374f5722cdbea5a6892c2179fe238cc7a9f57a684f532bd8465d63c0b0a7dc24921040824c89fc38c06cccc080c857e95baba5fb165fe03b3d8812e5d983e39b46d75b70f1d5c586f7b120d0ea0d46c3b797357648205d875d0db506155b4d1fd6030c8156388dfbaf97b21d9278c5f12e26ad3c6d2b0047256cee93cc84751cc021e835d218a211489f1529029141fc200881effdf654e53714243197a6083c85c252f10dfcce626315ce65c2cd674f4d8b37f36318d80c02a1da41ef1652d9a752e155526b5f597fba22664ba39265074d43d944e91606088485573b7c018ea55227e557cad1810efac5ad15aa5fc7ddbd4a140c0d7b7dc93ab9e4154d70c5f05e7b0386c1c15391462caca9582c0241599f3620fc94cdb532ec6b04e14d1a18c67f4257b6ab5b972acbd78f13938ec2b0d7b24c1cee906d1ba17e72fde2e59f28891443300c03911737d02f8302d7e241780ac604d54051435d70f7e9cec2f4034d1be1b44fe60fa9d509132d06681089e4c2274b0567f24894f4fc4b8d3ca7d52fabbbb9f37d734147f4d2681ad9edf8c25af835eb71d0a9cc7d08899abd3b1ca55629c7a3245c7be515d5cacc87db2c8547b17bf3f86cd5887b952a73cf1e4842adc453bb853bc8510ea5cb780c5883a20adb73bb66275a3d633ab4a4ecd1f67c1513e4c91a91a50021baf0c9d1e6acad36dec3ae35b0b67fe6619eaa80e695d61e8101385eee9067119dc11e7325f60b4e53c248f17958b457926ef135dcb4e53c942fa5cca3191a30b6b3026a66fe40a3a3261823e1ef7f4955ac157624c20e01d5c67dde7fbd8e11ae4d02125a23e1e9753598479ab9352e13cc83cc4f4bc4e0ce7c4d1ea4ec3726ed058a1550156382229755d704647a986546d8a2ccb0ae5bd6a78007e333aa02eb7326ede93149f033b1bd4caf6fb3fab2a160841daf2ef596deb3249b125b1831fc5506961619d6311b4b32fc4975e79472d7fac285db20778852ff3d06cee9492790f9e7123786a34a9c049b6034c183218b714bd3177f014aebe2598f89f8a97b67224cd44793f2b60c4bdd72751af73417822a258863bc8cea98712af0c8cb7e442a47daae80b7e4386362cebb766930e8a7edeb827111d4db6c0457a7cc3786b47c5873f0df5b6b9d05abf38c46619e9b4cf793ba29a9a93ae793a42395665b44930f5e92f265a2968d197f4c2d78d39bfbd7cc83efdc7085859f7ed896e0325108ccf9298c5f2fd1744bc09f7e1786574f2ee4645632c157e098664b533dc2763821b218efb069ca55b375dacaa60d79813d79ffdf35220e630ef9004cc77230cbae37e5af01f6edabd0fda285dd0f6f6cb40baafd6c09359773858c0625c7fd1db2e9144cbc4db7e134c67b5204d2a55bf307fa233fed49f866ba32f1c14a57b8e054293b57e4b5804f7eb991b61db7c9aafd62033954d80048f5b9b2326fbd27a6f7991d5d426313916501d7893713402c5a76ffe0c64c499ad674a9e1aeb9d48741e84544ed4d159b47d895c6b54459f7bdad8bbeb8332eeccaf85b679dba69f1c19b55974bd000dd65a25f172ed771bd857a393bb1194abf41b9393c935b32870526c0dcf4a86fd86cf385f2fa2921be40618ad0276b0782d93be5c95608d8a77b1f197e6e12ad0cbc40cce2bdc5d4aa8d07f324b194efb80ff4c3a62c4fc6e391f8b2041ecb52fae21e765ec04a14d2b9b1f491b6438dff4478654bac9c77cbf8283d069d1f0c135ce124cfc8026cf7651411bfcbe35ca9253b4d324d7b85b10c421cee5faa02f6ab3d5ace3bab4768fd82dcf758f0c65610b1ede295695b434cbad433dcd902055b977ad271813ea801a2b8e0f40865769580b9e4fae272e34816f56fab4873dfdc6427652040ad451fd838050376b48b220c53a2147367217ccaf30a3164c2e6ac37c30ece563dc086b7cccc2dd83e2454d92db248a8a27e596b4f8c05aa89aa4996e027b23e4a9af4b5f9bed9a95ca29c5bba9e2ddeaf6a7c6c7d7daea6329b42e6015892656e44d84741458d76bab667287cbe2a91f87644430f5782d4584a16c9a909d558034eb0003608bfacb2b053a406aac57f28124f83779228b1653733a639c401a2c4290a654a60e6d7ef20d072cadc94d288defca248c606c9d3d327f0561f8dc20b6445eaf0f6a964ca986c095bdc0f58c52cea23e55bb38a3ebe725c606500425370f105bc326dffcf8784dc1c119b6e579c868cefdba57f0059a13efb4cdf8036dfaa4a1e9caaf5886ec96f9e25df7faa9e6041cabe6324c325131c792f92182010c03c9a9de6d26fce98284481322948b2f5e7088c52f7f1a166798c95be76a9b4e131b2ceb832f0178fbac1ac39e7bc6ab5e12bce1b75066f09da8807bb382e2c6bdde9a79583b3ea0e9b781f5d3770362ed496ec23388bee8bb41e0e2eb937f7eea5c1b0e54125b6932eea4322950ea5df15fc6ee09efc904a9a91117f965197e80dbd534df7bffdbbf99ac0108cd22a3539aedefa34d304e4f283aa243c059cc69a4f372613fd2ff7800c0ebd8b8543cfc430b4d676a9ace9608830c336ce7728bff9b5042267edc456a097701d72731d3a1478ebf0eb08b648f15dc2f306a78d033f657eaf8a87a0f21ae2debf34489bffeca3c12001a8da307189aa1d68be41e8a2b0ec27dfae2bc6bd895fed3524caaa0bcdec7097fdc39b6b3cff024f1c05f4a62fe307d1c1b3691af38a341fa827bd044fd48f1888110e50f0284e344147abcc5ad9dbfb62d63da5a9d4003e4341ad68a20fc80dc830edb54bbc5da2ee6572879a5720c6f212d90024c3fe2b76a6efab7cf4b7d24ea1de2a9821bd35540ded6a96e152ceffe7bf9cece06a61c2a6184f3939db207be244036e0ee946129f70d7b8ef0e7dfcc345fe7aaff17ba7edabb65f25ae52e080a3e245ca6e7fbaa8a17178f6905e7944208746890fc3a6dc2e93676eadf40d0 -MD = 425ad2c8b6755836b4525a5d957e29fe7347d03b615293542485300eb39276c3e2a9c46458964d2b3a27f0d61debaea5 - -Len = 92896 -Msg = 29ee4093324142e57be60c9a664da2b6b2c76134413ae4571e19253bbe93e4af860b4d478ec9d5aca5ef653795aebabea8b90cae6afaed5ab1857593dbca9c79570ee790671c471723373e95c25443b41586685254ba3ad61da4e8c0baf9a885a3df579943a25fcdffa8dedb75a7053f0115be4986e091716b60c8eae38ad17a7266e588adc3e77741298f32360fc708754e55bb88d6bbd3a29f5b38dfe3df00cc8bd8862ae7a5bcefa197c28ef453b7781977cfe30280a5ca4bebd3356e9ac1ba367aba4476634513fa3fb204be6ff3135e6aad1ecea78fec4bbee36d91ca62434f114d82d8e7b9b41bcf2b21d5e4644d05777ec1a1fa380e871c8f10b6368e70bee6666c75f9c1dbec8f546ba179b32ef6e66a55e23f493be74fffa544a7eb486b412e8bb563058f55c6566c8bf888be1aff9861fb3f6978539e5cb4a3e521d33e69cd6601ec2cd83ebe58acf9278a06570a316d53c241cfb350cec53ab8d91920a86a86bf5bdfbe8fbd83b254d0620d964e5c0152907947efae7c6173e8bb23f7442d715979c54a300cfe0605b9b8dbc01442a66070b8e8ef008f0fb53c6ef8ad863fb1350e878309f3f23072ab3379bba40ae3e52ba6bb9c8e2e58697d9ba028b6c8cebde2cc7203b987b8056d7bee7146dd414989ecc7dc9f82c3f573e924521cef4e57bc3d1d04a8e42725c93942c842e347f4523215987cb3d8c2e6018b1100ddbb6d65818ef50632053985157eaadf437d4f4e1fabb96ee81f389e8add4fa9ba9c66a641cdbf1c98d8ab6ab6a9fe66266bc0455c9325bb4921bf622d22f360ad7aaa4525e048323f2ae240c5cbac1fb39ab0fe91d5c6abff65c0fc9263e56ddedca10ad4d17a904f8246cfe9ed9b5213918842657782883273a13260a80d18764ab3bff7a83c7def693fdecb15b5476dd8aed98083439809d4cccd3ff753a99d4c482a356b754347663537124ee146eaf88c8b8b00f025ad0fa795d95a9f677a6bc81537240f28800190a0679d0796b27888202ef7717546ac9c51d3d8d99b362e9b46a5daf175c2c2b8e2720c1080ece00c5f106faed0fb3412cbd879e98df81e298526960371343216c5daa2e24cc1b97f11da708e80f42e71c98e46b785e9c1da9c625f2d66ffd8101048676642588949fe3303fccc5a2220149d462bcb31a21751023d579a4a3c0f8d636484a9dadbd2eec42eddfb55988974ae822ea6f746466eae3869563ee77c02d4a025cb6e3481a935fb1a560c1913b06900a6606337d1b90d594be20360bd3842232fee3d1ec0f62d729b25a82c269275ca7d3f9ffc1efbc8a7e686c02f3cf756f68c5b6e20f79f549a48b0505a2ae07be8998cd01d97fb862a208a9edd5f06b820225a2ac38c6a537b093e2d2a87632260e48e2122a283f0ebe235c4f1902f0fa9db32998de820d21dc7186724a6e3133c448fb894a959aef115d15af33638039a9d2de20873897889688725d0ed28f584a3d5bdfb134667459fa48a6cb8ea3efa52912ebc956ceec6d6d18fb7c5f9713ee8a959dd4812c3ed6af77ae3800d65d1e1a7a430b792dcdcf73ece60971f2f74fb53b3c4b0856cf35c1152e0f569232832b76dec3fc4e8d4b5180a53c963d62dc41bf537b367075e5f3c3beb7fc51d062d09b07897c8bdb5f7a56a19c58b0e722a4944bfb97f3f375abe5d8d86ebfe73bae4965d25660187a42f1739f15f814a1824cbe32a96b98534e0df4d72a16c77c192472253685d52a6fc393bb7a9d5bd73f5af2b6e742050d7eae9b4acb00f1b2a59ea4f8894781fe454f7a87e2fb2d324041b1fede11aa12a24a5499ae09166dd82a76c2bb4fbf546817907adbac195139935480fa54f7f15d53994a5f89761c254a702a68e8dddb4cae8e0ae12a90a28fc252d3d8769f28047cd1d35c2cc12c219129860ebd7de16766cbce8ff133a4c741456dd510d0253c08a6db304d583c31710b7c192800054ce2c21c349a72e654b2a4c59c9e5b87689970b85875dbcae98c7e6314d314b571a519aa7b70ced5cc78e9617b8991bd2ea1d7f15130ac36ce262ad18e292c805a202acfc13eb7f1a3169bc81e5d1334d2a4452ca7084a2e43d0794de1a4a7e47ad68e12a23ebed86d1e247fd1a3409d093330b0b657461fdf3df24ebbd02760684aac099b0b53e87ee22bef51d6aa4446b133242bb8206a14b11e4a89361b62870f2d1b281f07a07d150a9d0b71c0d8ffb0b4fd63a559bb78cc55d7b63104896b7659ddb6045aaedc39591f6b0f24a9b8b44eb2faa962726ff2515cdf7b63339a12dab7d135cd5210a19fccfd093654e63e68db5d3ecb3d8ec56960715fc80f87872830163dc038aee0375c3dfa86592ca18bed07d0046b49b83688f868a36ba825baecd186e3c12b97b813aa4d8534e0a0205e86f7ae8a253d211cf12075d690911b34bfab989a0b1abaa9ce8cc366a69cdea657201a18a5d6b1b2d801cfeec53bc1ae2d066f11d20b97751732b16cd30a1f5af4e3d7a5401770e139a70202ba8826cf9641c7d6f4ccd70c10d9efc61a6a5af2ecbd77ae9871e70e826accb0e528e30fa7c84347f7e101e547ecdee0d15029f4ab077aa2f3787cb14ed77077d9806ee4ce1451e35fda908738d5ff7b9c3df4e6cc7c4100f59dba6ffb77add60c1132f575b08437913c1b78404fd1c4df96542fad667b67134418a114c5c549f16dc7983b275ac340680b1f1a94e67b2ffbc055ea607a43e11e2feb273c67522df8a5738ad33604c1f0d802045fbdfce1d0b1ffeff4de15c38e68a4af66047d164444ede15eb67aba691ab7b9fab8c8a9b7a1644a9e175b5f174b6419bd1d295ec33e8ddb244ca37e333bb68810777cfc03374976b6a683084b40bff2bc21e54c07eac9d4ce790da1d1c3751b1b6a783d65bc05e0e91c2b438cf10ec6dda34f8294f2287ab7bc17b9e73a79df861248f231d83035bfd8c2b57ed4e702bc21b676dcbd30196a96602ac6194b41eb0f7dcf09f44ed1756ce7c27354bf42b21db8bd41c4674d7198556900e85feeb4a275184098b840d468e8ff1d091de36a07d4aa86a03493472296192a102e327d8bcd52984e1300473d64cfce6a89814e7078e2fdc93e6765d570af94393cb9901bf522538cc59c385ad9b929e16888d9d843eb39b7db5658119390f1bc11e0a6e37afc14cd66713251c64f9206518696af9427ace491cc88776d61a52134442c72cd445e887c2bcfb298f7a951caf6ff87082cc9e8085681677ca630f12a509b3a7a9f93666d286aedf045d25c4b468ecf0e5f333a9570ed722fb327b44a927daae15245bfb0039e743abeaf7e4911df1825536b44cfa80718152cfbe33b963e54c031082ceb29c4d5f6c693404ad53ad2dbadc4af2d6878d9cb781ff673b867c865803d1685178893a302103ad70d5c8f9fa2e1c2253ead3791391666799584666fd467050469542dcdd5b8d65426aebeefe745364d973ea224c471cbb39a1ecf3da21880ef8bb214e5d5ff9b78bd9be15aef61640d0e87b9f4ceb49eb85291535d7db412bceb2cd9796757028b3ebe875f2fb8e3fa0122df6f9c5147fe3b86a35ddbec22e3241efbf72e51a4222681216b3cde2e8b1b9a9313d1da600bd1593fad210349f8b322fcfd8f61e8c4118e301d7b23bc36ba59758ff3a27f67a09378ca01abe07404b34ceaff1a58e76c2043d48f3c159379d9d712765bee7825cfef42d2489ecbb55a7c4e11ed6d12a301cd2ecd79b317b6a66869ce6935d3dd692396376bdd963172fb955c5dadcc628d4c9ada8f2d4a0d4989e4805cfdf133e986328578153a05b75b6f32ed837b073d42972acedc80fa3dcc2120a9af66c5ebb7b6611fde4dae721c2a3a1f96b52d9c3fa222db5972f9fd9f9e23c1b28b0fca18804ea5a137984dae64d6565ff13214945a77171c86790384ba0e47b0047e1f292ea2bc068e5fa4829d9c3437b5a150f11e8c14ae4213da0c0344ae10399d557a2001b566c871114932f03bb68917bbd66cd646872c46fba6187b676bb0ea077be2e0445a6c591e62c386df74d1f1cfb4c3ea4f2fab8ee2e357f7062af0f09fcf15c2cb49f084165fdda481cb26cc06fcc23c711056482a34405bfcc6702d98b4072dcccddb9ea3a0dfede551fe02ec4ed6416ec1a32f3c19702eddc6c51d8cfb5585cb5ea3e540d648d75c81de330a0b8ead9acc1890831355c40bc4562ce6d57f6f4964e0147850b6d569d33dd8cac339b587882d18a9b26fd01917a9f83102e34ec978f688b4a0988c9fdea360b8f6860da79e67342a673cb7786946fbf5e43fb8be237dde70566c41510c95675f15f22a9d674d5f5fb23b0ecc01a3949ff9d311b9ccec7255e2b0b84fd58a5927c1fc70bb8b5606e423e93a66a9467ea9c44c0e2f0da8e0bfc5f445ced1f8c2ad6b03849472f7c7422cd5beeaa8a606add418e2904e59962880a57e607a77104a71a5eaaaa6c92ce43d7f20ca8858c91699b8537007652f1a9342b6a7477bde9986520780af408454e643f488e0d5326e95a8c560d16208208e6aa305b17d9a1509a65f98e4d48a1eb7d2aea81a81df304878acc534b6bdb4c28bb7fe5102bf478c117775f01b8aac1289b39abe052be632969e2f9a09cc51e0046a139e91daab8e01d38a498c227796f7a7e343c5a50ad4810e0279a1908267834dc812a168ab7015f858698cde2ba5aaf0244449d718bec670e07c34b6c0b976b79e25c7e5d1e2bc5a52d8b40a12df0230a018184e8a51e56b3bea29ab97665d4bf8606bceb946737e2c0f8852d7a39bce1967a757fa2e5c51977bf6fb60eeb57f895b03afcc2bc9d826868034e483d63ce29b7d9fc2b4a9c8658a3302c7c30dd6a36e25f585032dfce4c6222cb3f050118e3c11928e754c34389d547e4673c4c5f922593c6e5d1e50e956e4a6e08987c08eb1f9bcb7f0b229833dd1aa378188e1dd1003e1029a2978a6a14e3fd4bfebee66a59c9ad9a77a2cc7e44133457cb89ec1afcc8fcc6acde89f4dd5541af40adfa87f80a95e1a129299191985eab5d2716959f9a5361f7a0555a500902dd65338b6b83c54dfb90a0f5954c13e81cd74ee26c741adca58cc734c5f665087d7537e23d82649b924cf079b1feeb9b5440e897c400b1613772396f5d55d21a3679a048267e4e484bdefffd0e2e883ff8a0dc7ec8cdc7a8c2b1e04d49f7b902b07758034efeeb1cd04db7c9d364529cb30012df9d62c57bec52a218b2648086947a465bdc8aa3dec9a1ff242928b1792a6772026e4711a05d5c6916bf22916f8a87529af8aade58dde3be5838030d9f08dde42e610515dfbed71c9199bb528439a86406cce70450b51adeab277cced7f36a50ac9e233802b7cca3cf67b72d8f4ae464e97dc87d8ff94e46661f1c5ce793179ec54e29e1cfef42e619529c895664443a8936d6b1dd5087ded047691f9792ebb6be999f7a100f41ccb682f4cda330cecf2f1d97090162ce8e33c8ed80b195ef80e2a60e6a8bbed13ff01e46633c568c09225a95ebc5d82a3ed5c930e5fb4729e5789efe1909a5fb270d4f1bb2e97d86d1ac1658c0ef5aa4d60073b9b73f4da3cbc7a8f5ef516cc66a563cfa22744dc310137966f1488f433efaee105f4352651c18ed7d542dba3bf1130e6b1ba3704baca0aa49e498200f5f0b61bd43d0fc75beb3951db0633760a48cecf605408b268f9bd28903a7b4101f7df448cdadf3dd9be0c75e6bbc8c3f6b08ff244811495d9f4c18acb53cf44f6796d13a64a4e0a599e7abc6ed0061e02fd16e7c4cdf4ff6c6faa53c612188d320a01d1b6f7b6bd3a20f6adf9ef75d49d62d62877a7148fceaefa0c1711c17a430e1037158fb3b719da22c31e76829844a6503cb3891da74f57132c14cf649cb81a2a9c686ecf98671e618422e1d6d9971c078d2ef05ad68cec983c65a77c84ff92a37a161164c1b0824579ddcdcd08e3588ea2408966adf5d3fba570366393882c3d68b5140dd3749a310c75a6efa6d7d038047e90cb9e28a1a00fdaf8c478f03b3ae0bbe3454e21cad6c490f9b943e307b63c5fc2f41783da47c3ec6b2985b6343e6a910b85824698893ac622a46073836ba26a8c7aba95e2357a5b09ed4a48cbba6edaf959106187dac78bde5b7d27c7daef0549b9e7dd5e0b8b7d519a472656318600493a88f12d4e033879290a6e49767ad6a74c3fd8a23c8fe9eeab0ced6826189757945c83dd5566727fa788c58ce0ce4511ac2306634ae0171db9fbfc762acf06b110fb782c8379b07e5188ac068c61e7155421f4f5a9348b7b2194e20491f1e4f21af66caf4aa588e1b18ab04aebce232edebd02ede9f5cd938c882c980e29a8772ccddfba2d82524631ff40de817b8fca9674dec08f9c43d355163ab4f1eec7dcc0f23fe1ae88a3186d56fc15efe2837525b9e6f20ca084d715ff9acfdfb9d97f6203fbca4030f1d4de32309579abb4bb072c9a16e39b170b3984db5d4a0343fbaa63c1c88513d517df118ce1d12f8a08b52d8693a6f460dc4a466af1a3639dcde4a1f050df99b33e1a657f6f68f689eaba3d2aecb944f8e6d2c4c8018e435d52bb3f2617c24b22c40abe76a2b3991aed80ec05a6acf545a74d8081216d3af946989bd171df908a561a7d0130337fd36d93aa9545f48ded9a14fa14b5c2a2f806076860f38a127040d431bd8c8b234a077d19584f2287473be3a1f1531123d01d7205731154397b20c27cfa0c0d1bc527a788dd26b979f9091408b57dfb3627f982f3765fc08de1826faf45535bd1fb6aad9972611bce698e40aecf9ac342562694c2f933418869d236593de6d9de532ce9cbe682dc0d1f37d3f4ae2e1be0f13131f45a3069a17a8ca0fb223b19a9430b069078007cae8092488adfcc578a7f85e4f837dbab617a3e4a15c0c48dcb61716e67c56e703b443a38d1e2ea28b757a1185f109989610f539c296817c8ad24fc9be24d31593bc07c1f5a460be1e0101f6689630e75f8906911b6a6a93cd7140919707ddd8a188be4569487a635ad4f6d3a17ad8f13c0b3eb453dfafd6cc1a52351a2e5d7a55a1d1f8901165d76775bf71d7a5eafc531d056a13fd388db055ed7feea03c41d88ea6a2130707626c6cc698b3204f51cc47c37a03cded00a0aa7935bb65607652d7a70b9932494e9142720fdcf2ed38d011e0adca56b776c5a25e202b86b360ea053bfacb9b13e1007e2aa0fb23aef88704c4cb11a17c3946c40408e40a1c49c99fc93851494e65dea85811b8bc79db18a7d79c7fb4268f4c99d3b58ef98277172dbb8ed244e0205648632bbac33527ab8282e7bd999bc1ffa834eed25ccf33fb3878c1f695b35b8de7b3b6aa43cc256a1e2b767258c51686798d7c583aeac59d47689c6643ae5dae0cb07a2f41251d7b023c0f47f78ad80a944728c79bbb7526e2f3e6ca56b870df40c23ff2c7285706b61b7be480d44db282cbb8c7872a8bbe918166c9d7bbda480a51cc9bdcbd1a34c33282f0fa8abfa7ca80f402071f4e8cdd7ae50ccd9ee413f2c5ead189ccb02cb0e7eb146e947410f4cda61d228207b94d462b3b4049d6658086613cd53d5f1705a480f7e3dab516881c94c3e13bff6c6a4d00fd38a3f8693dfcf985c8f8701d4bd007426143c9e10fd4879a4a327bcebaf82cfabe969144b08f79546ae62b6509d2499cf1b9fa98115c474a6850c607c7ad76dbd90aeb2162a8ab50c4edd718c7140eae99248e64141e9c7c407b273e19d5a84892e54c26d9ad5522ddf6bd5d0efd1d1f636ace6ca2814ed8dc9ce59c36d988e8f010fd7b9f084072bdea265d64f54098577402d942ed2405439c4948a81fdf64fb7346493c1f34e76daf584054643dc17c2a72d27dcae8ac7d619b6af7117463bbf66eb8365cf929f42f9c2d63b2dd41da746580d981607493d5232ca916118e3982bfef172656e15a50394c1b48e8c1793b250ae07855068cdf28b448957c8d7cfd7f1766e414b7a8fc79c6038c26e86265f8991a188e097066f42a5cf87e078c51f757ac00fb52e51aa2c3a3e75f5f9cdc27550ec9d5264754cdb76ba6dfa572646fd870e1d35b1992fd6a84c25acd2f86f96544f4f0051a90fc83ff07670e35202fc13aef64794c4cd2e42d83e0db244db8f244ffa84df002c8b59f83deeadd6b7e3b93927655872f69592694b9318218aa239754c5a6d2927b75d4820be3732fa66e0132d096d12509f0f85bad7651ce1921c4590fbac7285ced246cb79ffd53ed810e373be53316fbd12a42845299594b1353784e2ed7acb2421aa9aac686bf9c9d42097feab4e8882544af056f63a08922cc1849ad0a06c69f3ba1ac01135bfae92410644c5c84f614cf0cf972b68b1a76b8a0c9dd691ee02a11bd85f8ae0f518e3cb5b2b433d28dc552c028069b0248369f7a9666fbdc470b2363fc525ec3e7b3125e30c942ba976155335ad119ed598b070d78f1c929456bf9fcdbb72c5f06812f75a73490255a0f60cd577b3834969c7ac13726d9eb20721cf1e8d11ecbf4201a60df9c25f91ff8fcf6e6ad00c047927ffe9aac350c214713a8ec453feff9b75b89a0aa0a202e43b016d10f7a77b4949f2c6a2ce5729013668baebe94b35f6e7b56b2064680cf190595de48ad4224cb60b36f4def07b5fd9e01f8e227006c6e0131dc57e1034aa282dbd601a20ae15e4dfc71b85db1d72e42719059ffbc6adf7581e745e490e605af5080e15fb53176eb6d3814375a40cdda453fcc24d19fe960ad9c7a560eed6b145da691ee2c5d3bc46f8b0a83e93603eee4cde39f2554b2481fc09b3f67a5fb3a680eb85758acd45f6b34424b4602f807b6024577a2d065b83e1e53a88257dea8db81ffa020686a44c7f9639659ecd3ac23a69bb42f5d2835727d4798474a3be61cc70ed36bd724fceda3166d0a3bbd6693808c5fb341234923a422179ec83b7d95a88cf723432b0e43fa02d74139ddbc6e59c17e18c5807bb95c8a2d6f1706f4acec21152ff2a60233c5d0dce62c5c361cf9e11c453164539c6d27e3a280c3d3cb5a7634772dbe6123ce2784e15d615c0528953e22cdf95a359fa3401f4b9ba359bc335ce33b9bb17ddbb0d81a1415b792ae85ee97e06717eabaa34ccec0b5eabed800955b66647da8b512df79999fce295258338cb4d6132485d21098273a33617683e8c7f4424a0c24f6a1e733282934ddb716e98f6dd44cc9d59363c75103ac60675c0f2e5ca211ef04274a2bd8511918499d96ba54e4c84e57de19e923e4065d52fa1b5cdb0c1fe0e3788cc9d6cd42c8b7d27b7db4cb02dcfef7a0d5d75dd734edc9d3c6e6119ebd3c9c93554b2515b8a8bd811fb50f603b72e8e2d396f788aedfd120b3a637f64fb69c49175ee2fcafc5658eea7e3a4c325cb9c52b88387f93d01ae86d42098f5efa7f9457388b5e74b6d28b2438d42d8b64703324d4aa25ab6aad153ae30cd2b2af4d5e5c00a8a2d0220c61160a636b0c31171307a3d5e2bd52918d63b1ca25127e0f8e6fdfc2328bb11cf6081d716e7e6cb54c1c1c401f9333ce3a2fd3caf1470fcc0cd8fd60756d0c09344298859da8bc53c8ab687342f3b36d02e872949f1a098cc0df810ad33edbdb020ba4286254caf86efcaef6b5a67a75cfd4b5b19550155792cc9448b4c5c59a47ad69e024483eac26571752de7431ee883dc5a83db4da366ae65da380cb734fed6e0e384c4dbf77d803cb0e272480e01569c901fe0d0130307605a29f188d02db97bcb5402bf5626c49f1b2f7800e545ea1ea453f22314eccc4b3ce7a74bab9f96f9ae169aa8974cb71b1c6b54e84514a2c50fb6abc1397261890ad77a7a27e2f40d1432f9223b6dbc334d3cb5789e0c35422abe6a34e1326bac4c9ff78ee5865508863fbaa6a2e8586a261a063c608b15f89dd1b9f8bcab5f176aa7bb0465083e9e8ca33bb07e6b20423f69c3ae3d1fa96ac1a717872c5b907ced65117516c715119ff418da1e64883dd1c27a387438741b4e950f5aa0b1b42f5d7eb75b8b617d0428a8be8e134314cfb5aa9675a6740a8c8d320e0dca4c4eb1335af9222365eb08bf47b946fda53a7a3388a4e06440d12115f49ffaf999b494f76073638f32c371dc47758f2e098dbfe3f322030e2d7c9b615331bccf187a6d2245a28a2f56baf2082e9fe134ce63233f60aa5824a8413e07d46fbdab47248c4c60f310744015ebbb7384c792827f26ae678a5a483fe39b720eb6982ea43784ce5901910e9d88d17eacc0bcc7c4264cd95e5e73e952b826285882b6c9ce27e920844a864ebd6835ca30d02b64e1fd0818dba34f789f5380a34870a3fd236a2bfb793a5ac52e58ab16a63fbdda8a67eb1565d54776643a1d6b64ecea492292cfb7be5da8f26ece83ec836bce991bfb58376380f6734fc07ef92473f42e6a2636ddaa20db670d2e62c44ee0f831252bf1f77b12d6ffc0ab07c50d824c2d58a913e5e3207c83881cca367f3ba533147e2aee1327536c554e5a6796b47cb67c7fc958ffe906e84e0e2cab7ad8500f88667583a22b06597c2ed9594676e06a542ec9bf46c70505ed76fcabe853a336ff796440ce9a6a37a3c12702934621a96e3ab7815e56e15cd4ebdcb04e19f939d83b69bdeef1f9977aa9a60c03aebb0439380537ad25365da2d12f4102a7ec98a101184399be3ef95f4ce8ce2e0d070b238b254ac99e7ea8b5cb76d6ac99d7c3e87ed28a457b94cdd03f61d1690db01edbb8aa532a4f249eac4f45f9a24c455c2d193afa78b6b5855bd5a3ae5b2d20cfc05506b94593c2dff4b10f228a5bdfb1dd44b40ca9dbfbc070b410cd6ac7e38e5fd4cd15b228c3cd1da554d9db34f18577a5c0396f67e20fbd6f5ba71e7a72eb28ac5fc0e66ac1e685a099981b5415179aa102192fe702b3804bc6d3ecb15966b960517358c627cccb175fd5a155c50894cadc2471d5c86c67edf4dc6c18f171608524858fe77fe06c9e1a2b23a68bd92477c0d3bbc0bd9ad2da581902fdf59bdc8f5b70023b34b1c8895af108c2d3f9985c52bf84146cbf5f85832247ecb0567bd368eb463dd0c19d8d84dfd73727fa8edd0440616d304a7c63e870b171cc31dd15cf2fd26bfe802a0f4a400570125c667e47feba17a2dcb81a1a9cc60993ae6ebb10d62d41f88e1c82fdba1a0a0d8fcdb4a04314c05ee6710c7bfefc30c13caf37b076bd5c693bd37d21b68b6184051314bfc5f7e3aee855bf9f2fda73bf5d1d20308a0927cb29fd7248bde023006cd512d8ffe9ee3d62c4a7e6a7d74f089046e91378a71088d8e8f6f548aeab2d2782438e49516c64d65c5a04ef791f1776ab06cbcb0db34cb9247f99df4d7644b5b90b624ac4dacfc37b4a5c6f36806660b80dec09a39c615b3e70c8fa532101a7d7eed76ccab5c8aaaffd6fcfa60f9fef0c72d6bd1f18712fa58ee5224617ce7e6d726037b98a0a0c68e7b1593e191e8206ba2e4dc6d3f6b6e80e70df9ce71599f81a9f2447c3ee69449dc3c475395cca35685544313b6c7184841e8addfb618af66be6cacbfff031b1940979d1fce51826e1ee28f4db3cffe98420cc7fe15cd1e6dad993dc9aba063e4f14e1dab0420c49db4b74782002b2a5934a1cf925420f57dbda07e030a647594358a4f60fee171ca91faf3196382a4715dce4e033cb83b8038aaf7d3e3f8580f5573bca6863b92ddfbd41c7ca57c72ca06bccbb8953ef85d64de31a20003143f9830ebe662d62ebd3b6d49128ec29e4b7693ce1b275934fc8a65b3d9272eb20a48ea64865b5b4d5499ec0243e5fc30dbf77adf93b9b2f845f16605de2121395aabc8b0f03972f7895c79cf7774d22e64cf99878815f04b20e30ab01bb683b1160bf3568ac4c23544ce3e391601eaa2cd47194d6201bc3675a6793bf6adfd2326ae92debec4f40e6d3560c78855ef93fea722ba8a46bec02c83da2ed9d0369672ddced1f300af8bedda0a023638870ade37db5566ac9df12dc255122be5d712e1dfcfb690419cb3aa05627086715a0e573f6da65ffa02d160ab146e54b5879f5dfebc15ff4f638e8dfe909be1ca11a750060035defa9469ad863ccabc08ef46ce80bd77a7f2ab247e0cbd0bb00954ddb2d5ba8b4972fcc0fd9af8aecba6b60e1aaefc62f0f21c7e6678114659f7cab963f4c62f092be1de36306ea3e95685002ad09e6142165fa32b8bb3d6465c1c424cab4aa987edeccc4290c6307ee10422e62ecef905271c9bb78acc43dd00f28155426f822a7fc591070229def210da7e360fb2b4a1eefa6ff0c0831388aaf27c67005c4159ab13356fcebf34ada9b01c03bd72197f30a226c07401d0ae24c73d682e3a6e7e377ec1613bafba17742d02337e37b005b8bcc80eed6d01b63417cc4214309100ecb03cc49222f8983bfa3ab09b29029c4def5ec174f02f0aa38b2fdbfa673347924eae821c3f7799c4becc605c6f96acb6e3eec351b2e11138ca701d2806dbbbf10320821e2fbe80d822be2d0832f49ebc4183fbccda9f33bd7d97eee53612c4d07498ace31955b73fce1afee999a5d827b122512d91f2d8f84baa387b1f5fcaf94c21e8b226c5a4c169e8ba45cd30c4bfdad5adbbfe6068b3ddb3e230e84a353231c01ed27d95b1269b2e4b65f51dc94b65a3f7bf4a734bb4dab9d44dba5b6d44cc7f368c484d45350ef698913af54e95f99517819cb3eac4ebc5f619bc1bdaf7c4651828ac76c7b767478910c43fbd633fb1f6491da7abaab8de30de1711e412c17aadeed397a175512a062cba837d7edf017a5ff4d7f730e80c6ae2f2c6f45f6dc7db25e5383a3472a5f72b444af6ae808d8c0a4bcb371c23578c6f76c070a46d538b1709e1fabf72c344568c1a90baca5b1594470cd13713c87ecbca89c2aa6c27a60a681b49ddfa89d6f5b77eb36c6776fb4312212f495e66283e18a95039104912472a6d8f55b2019350f0fbc78afce32860d492b71aac3a721285a6841901c3b916766034f0413264ae5d1b34dd34ab8232b4e8d371a64a458d3b0ac511e89d81be747ba076502431592665622db4d7f303dbaaea17f3a087f9625c7aea6ddd54894e463caf86e0e3977461ba42276f6219716063d53c44229c21250d6c378d19bd29496e628c6d60b16f98a2e33379b6be9d92a871293cfcbfa1ece55fefb4b8a3300d9f5909d392ef3e9183da80ffd93787c920b36192ffa90a396a8b3c5b18838819385aa61b60980ad4c6edb708b2cf588c33658d4e12a4839504b8c78923a55cf59f2e0b4cb1f6faead1e5809d29cd3864494d54761cf634861bad3846c050d22a3e9ddf6e6f4f375a0e8982c526784ed8ca355f1407e846961733369ad7ce123f7c6eca8a81ece8ace3a36688911ac3701ee3562fbac2e14d6012698e516545bcc06b76a6cf153669baf9d3ee52f9beb4ae1fdfd01dcc2c325e127a29145e932a745a88cd41114918fa557200525d682de0b3a5fe184e50cd7afa11740901230fff04ab04bf2a48410b7debc57790e9621d654ec1938f75a61a94d57518951ef6c931855531a65b6d5539e545aad968dbceff832176d8c146a8a66f362a64ab643aa8bec77fceac2240530989d47f0d215947eb27a9715f348af986bf25b4f3e3ba33ff6291ea60eb3491fe98dbcb02bb28062fda14a275f82a55c316f3ce1efab198f02f4f42a24d99bd6c7ba9056c31a103f643a0b32c1bee82ce457afa533287a03835a21d98d2d79dfd382475760c2e08e96833ebab2440474e54a47fba11a4137f7d70c56a0156fa57d9366245d336dbb053b6931b9b876dec4957a77c2170b96f0da38041627e9b2265c616040e2145f20c12f3a3082abd4f2e7db8c1ea545aaeef2197457eb84a07e5bbd7d946560e57992d536cf493fc1f0afdfbb0f3b6bde42bd4529ddc6acdad60ffeeec013ffe8904f1fb9de729f506e6bfb872c4ffabbac7a2f87205feedbede79a366ca43dd2d5545325f67546faac9ab372ee598ecd7cd75d3eb7fda72df68113d6f26ca72ee921042dafe7c31b3bba9bf0ddfe748e544342931d46824ba04af062e9f3c8671c53c7135330904cac5a199373856878935c7436b8b0ecbf7bd3b44ccbc02e161f5b008998e63b097ed7b0ed37b4c706da71569c22d362e3e989d407105824b642b544e2d98f3fdc13d1f640a2d31cc39a208e25e414716359fbe424303258c226e108d1ad81fb3f1bd75e303d86c63952f87f8664fa94b87d984916d3d536b45c6cc0b87d75099ce7466d5e70367fd27547bf102e0c395da4ed877153c75b2723b70129d1bef78016ad880dd3789629a1bca165c7bffbcd707a33a6486f12753d6e4e8832e621831a7b42e0efb3a59948c5daf99a8c487250bcb2381a53193909e10d5629813410734e325a1d7e2acbdae1c04e4ef7bbf6c623a7a94219bbdd19cdd2362df68bb2a184cadbf53e921bf89ef5c63d98a2c5615d687c780996fbdd63118aa8dcb4d445bd61090f8b8813f25bf013eed5a96892b8991404c926ffc56f6fe6329a3c1fa066b943b4db593e88b72399eb353c5adac39e2270cee863724121bb43c58ddf61ff283e9db49215fc2f24dabb4dd816ba1d0c0a549147c16466fb8c64d526ae0b15223c128dcf14fd225858c7761916b113574e28a6e1940c6f31cc1e4f82f5fc175bdecbed7cd5ec4f5286a8545be54045046055763255eab8891cc8ab4f61c5942989125a07b349f49806c64f3d0ce82097d36385b6717fe155d0fc5ed85bf80a1fed9e3a1c37a6b08d3bb9ed18f839448639fb6bea814c681c9b3200ca5ef3f7a35ec82416fd8301c6a7ebb49c21841f53e6558f5b0fc0bb61de020771e549db586f18ae745f5f76c8dde41c2333892f857b3a7664778d69ba1bd4f97b897a23b391081fd0f7ac7e08303baa4a8898d39f6af2a7a35302e189d7334d43b6056f29673f1ea930ea9609614ad56eab33ca16381699941cb1b15582957976e56c2c3e53f61169a5aa4d40c39a342c15fa716e552ec2c35f2a57a1b0841461a22ed966d9f5ae9eb06c0242e9c23cff435d581c54a3c99d74cd52f2e38794b076cdf5477b963cb50b905394462b5654ddccecb4c90e04af082b21dd9e0870cfddba1e34bb504248f1b7cf996b6e16c92fd9adabf4d60a5473b442a6429f4f3c4173a2d31bcc55c71d52c4d6bbe304c8c3f429869a84514a620943f163a476623c9b21971f62fdbbe8f1e1d0da2296e034bcdec91ca15fed3d8a945383c08cfe499128e528ac9093ef05852c28b5538bfc843bd7eda5bcb970c8c221256c095cd2e61761da01b4fb8a1e4d2d3a13a13875facf579019ce2ba6443c0ecb1f620a731a7b81b62ae13f64aca87880b626824b8117bca6762ad0487d8050e7432d83949ec3c91f609bebe92105828f2559d5f7a7937b93334933d1e52dbbfc8fc254d1f39eaca84b5b9d921c02cfd7d991cfe4ded118e8e9bfc2cd0ba2949d5dd6fa95a95aa0d35386b0fa0e1ed4dd5b84bc9db74f1909f1e509a4617d7f2c25c1e16a30964a1301c3b27b77c8261213a948ac916bf088f45f84f2871cc03b8029a5ca29c00cf9ee893eb0d98d3818aa55e07c2db633e85985a131dd1f2c3de554b43fe5666dfa725da214b3dc8f4388310096cccc57aaaa0dfaecd3e307c5ddf9a93603f7e19725a779218734904525b14586ff0ce0425e4efe7e1c06e745c28ed136f6031c4280fd4061d433ef700b6d1bc745064231fecf387015f94f504b6ad8cd4c0652af0cd584502b48f166c1baffd23f27021c0415157d4248b457c1343c736670391f31a6b166ecf24a9bb1216e223e0db442f6a731c031639acedc715893e5ef44259817542099be5f818236e351d228bd595efbfa1353d87747f588d9d94ac1e854987de927c20bb4aa9d71fbcb8be6a1b19599fad13a25de3595012cadf596ba2ebb60fcb6f668ce996b591409dbe5f60e42f7a07454ca443a4370bd7c76ec2e068956eb88976421b08462d88732951ea1df9b878724342da8793e28df6f20a88e8ac64207357c3292710595ee3082a03ed40c0c8429021f12beefeb411ed2de292845acad511f95b1a9d7e889562d1f17c8afcbf5f3a27cfb8cfc714c36812368fa4b67f55adcaf80a7505cf303f2efcf162d3246e493ebe55bfa574b169a1cc0794e1079e32204a1e1e54fb5da8296e754dadc11ac64d042a45009d86fbc2eb21dd442a56a8e2977f22d5d4c3a3aa8d2fd5f25c08b83cea60e94058e8235ddd050646b02617f8285409ef210b3b99a348810bbee327f3b81f33cd6b80eb5ae8dc974e60b5884945c65909acdc75def6e7d95eaf511c59b68eac109ef55aa155ce19c603ac02bf35fd9c8d3bdf5b61ce356654f7fa9d582cd6db6fbbef781b6c02131561b28e41422059e297bbf40b755aaf565d88b5d7611e485388184eae74a10da3427033b8b257 -MD = d66832b9f5d269e35ec9dbe48fb70aef640ba53b60ca7bff88eb092a56a5a7181c63d25d567a25c07a9f0ada0caeb21d - -Len = 93688 -Msg = ef4d163db14a90bda8415c8318ef955188538c3e8063b30c92fdbab79720f74a3b5c0bf6bc87c365eeb23c4c835b4b4089e51bca344518bddefd0cc74c4e884733a9865efa684c49c2bb94eea4e5e9b439a8549860fd387e3b097bc47b4de61dde1dcf9df553f5102b44ab9003f33957a1857fd18cf5dbf5b2094dd6ad85d975449e2dda35b184633235ca5b29ef01cec864e39c4194c9cd4ae5cb24685e29f76e15ea3e40ebc2e9dd7639779d3f0ac4b72ec9220542c9ac0c853dd737409d4a636b4cf0a067774b36f0400be74d1cdf74c9798b6367a53bfed2eb169f93ff172b869c18dd8f6b304589273f907fffc7091f3bfee06b23212ab21c0a2abf1505cf5021e07dca6541112a353c1f3f7a257d1757a306b70c06980e1adb5f2ca8bd56b0256e0a7f2f26a2bcb32a1cf456a1d99814a35cb127944fcf2bb0c6427fe6c88deeea0c188f860025e9310f055be2248cbc266ac23e7157db98b1e86a64292ed1c57d09fc4e09344f1f7781dc519166da9553b9521745b81ca9084c0a1d2e8f63f24f8b93345845209d27fae00055a86ae853d0ca7cb97a79a5da7b8c739cf32bbd871945081b3b82aa67007930d7f124fc4e37903374a6d9d652fb562e1c62116e4d3c7a94f91e5c905f1d0fa8bf49f01b6b770e041f4426829556d21655e5fd4ccb7a9a9e9bf7959539d80a31b4b8b68bd217abb9625a47f2ce1366f2f083d7a0265e0defa9cd17021ab9d3935e475e95ac9fce18e4f2246e23bb7c8c944587b2896d3b4fcaa9c91f2c49d09666fdd0812198e1eb4e13a53dbcd57baaea31f5ca1a318d85a6929333970f6a0174e3f49758894bf847c6b2a9c2e9cb1599520a300131695be6905d888394099e2fffb21f7afa7408781233f85d80d4954aadac2b67f5389732ab0f64175e1633405bf360ae73c4e289ff1073b421fdf2a54cc4057406630231ec92107bf7f7894eff9da31d7da35021953162f054b0f351363b044feb50648c5accd4d8e7166802f19a30ee9f7918e8dd7e0d38a15561f773f771212c6985ebfea6f756b4da98043bd04f4a62ae0388dee0bbb59152043e0ce2941152152cf4de08c31ce8aae0fbe52948594daad9a6a03db68fab10a4cf08e3b448e4bb235204db7e530af00990f58c6242e8d562ed2c7f44ed77f709516fe11aed6ac530ab78057122a313dc6a75e0e62ebb986502898caef77e70fa6d49c60f296c9a1ca84070e4b23a7b1e326c0f1c444f59ac90bf4e3cd747e141cb9f79d92473a2aef066021e2a57909a8fe3004cad2b81fd3dd7ab35b25bb3a41278e2c0050645b02cf2a569b383b9172ae19bbe90d77921b1d88de3b3404fecebdde90ef5aeebe803ea400b7544615caa6ec8ba16dca8e095cadb8cff801be1fdd576091bf2fc201e58bb4d9725ed32b8926f8767c1750191b67d79c1a3814af16871fba05ae01e2443fe7742abc661fc56786eaa0e4a4e4ca35af21f2fe8f06e9ec22aab6effabbeb4f0d19d6054b11dc1cbb7084c8e8d6f995c3e41aeb89c1d8051df65b7c28e94b27ba3d1cbffeac4dc51aaa802a887a1a06aa750a75814a5150661f5bc8f914d458634057430d398aef08eb3b802048bc16c7374a33220b066cafa8405cf7a9175facd62e44d35423f91ad50f603ccd5034bebd429ad8ae37983f03a1beb120a4bbdb610a2c0d869971d4da84513a6266fed5799c13119e8581b8c3e8549215eceb8373636ef84b6bf7ab7e22c9a5b260b3bffeaf32694670b7816b9cb536f3507d398fc294401d0be9233273400b47ee11d2af048f5c4079884d6d27670c338fcf7208b022516619c4b089fe3ae76d6f97c22d347047171092513b20d07e60eb70a180b49fc8d0e618f8071c40a6cd5593e2dba79bc624d664517801882a16040f5c8a487302c811645e1c65c7d5d240b4d94cd64856142b5cb28652048bad69da1787c4229bc62c35574c53570106b178f9f3692c834f8009f8f89acc1f917d8f570be054f04586ea68197d6494e5183ee951a8beba4184ea99413445528ccf9d8f790550ace0c21225063c772df7e5951c0a4d558794aa8d17e2c706c0d9c0634571abcc2e026e3b0285291518b9ba19f66f9fa757b3515ff97fbb96e723009f0d685c1df034dbd38538cbb501a5061c2d04482ac72829d1b25a9a6c31d2f09f4bdf9edc9ff29b5a31738cdd55344a3a146abf36425d8480d715dc0d3d6420f28549dc6e89c63d6d7bd7e4f4aff206e240f56d7045de01fbdc3408d0767112274e29ad6a5a2a325bd8c87ca16e68bcb33756eb5f6e2422913637a97c597434ac0b118a566d890ac3dce7bc6a1d02ec0b6be1b16a17ca56ef8983266762d818ff4073eb99407d37240c982c95385b058953384816df3b1f752ab908083f272faf82d349c98f7147facc7c25d94ccbb98b81cd27ec20e0fcb0be4bd6f52aebf92b46b23d6d870fadc6b0e6609cc6ff48a08c12c95089667f2098be1bb4d280f60100833edbe3a2d9063e69456633405356b69bb4fa754607536e823eadb2a0b6af54e8b6bb11c56a37e9974cac1e496a1ca5ea733070da35b7843ac86637a5bba498354d818e01d1ea26e30ef4e474ed70ee617ca918cd8acb9e3a4174fe1a658f6f0b5ba5d4c2908b9aced4d7324d6de1d4a339aab98a671e01132230627944ae2ddd79be7292369aa9cd66a9644d5bee1d2252dbef8b5b1d5157e34f014ce9af791e1021e3eb2495d8610d02170f48041c5120b3375ae748037b1d17570fc501b56fc786a557fb1bab2c6077a6edb2b246d25ba70d739c2c9bff383fd02c67238725084333431a8a9671e950b0631c7741083c4dfe6fda498f46bd0f093d20a352e04aee1a4713712ee40043a029f5d18f757b1e769a321d51f4243b6ebcb1ffad2417edc6de765dd8f55dc7129ccf3f86ac707ef2ad24268889f61b7d257ba6fa62e7d8d573a3af29285a317426194fcb0fb5061ef330e3977abb45c101ee27cf2f4325a2a13be393ff7e3931605450c131c13a4816e8d30348ec30b6cc99f09fdba25acad19fa9bded4234f6d611010d952d920a82ac736066f162db000f9fe10a9dfeca9f5f5feb643ecb20e1cfcf04bc4293d2b0fc5313776362ba26af94373e9e780e74eb74c106dc524c3df1194b19b8b63d4c68e0b0dcdaa6b0bb0a6c06ea1c5d22ccd496b347a360d525258e453fe87fa69f72aaad199fa57b27a095e49f90248431ab2456a91c7d6841cd8c97816a66ab34aa2f8ca05af56616f28034b1a254cf3dcfac0fada01e521e69a296a0b6f1b7a65fddb423650cfde370d98bd2cb64503bb2ac62b7e6ba3f157a4ee6f046b7686f3433d7f57652cf27bc006e7563e9b3c61493e47a58e78bb1800fed02920e19e9a7c05ca8e76d465e3473311c144b566735f0f9476f0cd49d0b643d5a318c58c02b11b6b030c2fff16ac09839550fd499c75235b1a1b086128cca3c59adb8b16d4ea67aae0aea588bdf76f84f9eadaac829161e3b99793ccc84c08ea35ef9905b82dd0cf4ae59ec77f2e4c5e159bb458cdbeb17679ead452573d598a9dde5920558441216b388285055b8a5712eaf4162601fb5a859e35ba7ea87eeefa30313154f69fe96b2fb98af68510b8186000ac356427d8033b1ccee4945e5e736b8bfe5c8bd3707252ab9efbb5c6c94e8341e2a1ee1e381c47f3543209e3213019ce51164cc5fba72ac189bcf294d1ddde1f8212a7c6c2f74c21150f10f4815ac162f02a405dd5323e6112e044621aedf60352329808bebdd10ed924af79c419ecafa33f7084453c16f40310b318eaa555531ca6c8cd73955f226818f05b3394211d34fde22092ed3be322f3489e8a2d8279a6193ffb2aa87dc58994db8016f4e814690ea01a056c349538320adc42ae05dbb931067b2b1db35f064077d1b560c9fc0c17b25be6e289710c7402bb595067e31c962436be1d8958a5c3cc3657014d3de3c31eca7d76c3e168623621193a2ff799f1a1132bd088182fc6e29846fffb3fb7b7ee4e1151694b12a3b0f7c895e581f6ea86f9b95d37076bf0c2ddc8815c6a4f9e2ad1eb9a0319d3e07826af8811e8fc28dad2b1ed1e8e23ea73ef26aff627751ed83a547a1ab273c19495163c3c947354a5855ba7c6131d5bfdb4a8b254dcefdf02719219357ebaed0e2b44d8eded2315f0faffb4b60022ec691695b2fbf3868aaf5ded9edce5700deed28385ad5bd314c219e53b76bbfa45befc37d675d202c7e8e8af31974f5cc83a71196b03464df923ca55658fae6d0d044dd44748e32b3db4f91efcef2447c7fcef4fb17716576b1bf5965a883f43ec43f3b52dff8cc9951b7984246bccf9b23b366d809133ba12b382f141e9d8438c84d522af1f37a377254e27d494b03a30002dbbffda053e97f259ae423be03792cedb62f5324b8289db615032f036d2e952bc8157d9f5aaa2e162158705bfe5a92aedbf28c0302e76449a466609c7888639cb06af1669c8da86866d35cfdc15779ff37f704f4d6fe468e1539967cc25afbd4293301aca5ee8ebab007722a191a435d5ebf4690c0d7c501fbdf390ab720be70970016c81357318ba1473847520d9f47b4bdd95d4cfe5033acd9b0ece3443be09e54c95f41524139cf25180c089bee5cee7525c0e7ec7891ccbba699b36fe4a283a361b8dc5a3e637e23a9beb95fa0fb4067c4420e2ccebabff77277c3fe5944fb6e988b30f9799752b565f5c0c367b16f283d773c39a30d1b0fbd2d816a0a367a28d63cdb9a9323d17cc537cb6192fddf18e9d6fe9d96075286df11684d68056464935458c80bb76ecc5ffb35a4c35ef4cc51d7c1c32847fadf60da0512f3106ea46858250c53b0af368ec6ac27695364b51df03234ca3d688beaddd4555c05dd6acdbeccd1fbbe074dea107b4405599355a6b6ac7d1c56401ec593527ed344551a2bfebca3742e0b74ea6f4f9517fff54074a1bd066f2105fa99a10c1a296a5a550bae711b4d8f203e1849759531a52ee81037c06b533c2ec1cf6d6d919ed6418df5348683f85fea2bec25a9beb2f794cf01ef730668f62ee6ef7ef38fd416cf3771376988052ecda0fe8a489c3c55cb67b23f318210fd9aec625c4a6f49ba47e3f81da691e46a4f4f97fdce983e4e3734a9bd8848dba0d744d07bbeba602f4006025daa2c26a0f37a60e6c84d394f6cd860e0d3d5298e7882a253dcebd7e44c30287df0d13c413ed3e1dbb2259de7d0a5702fc0b19b14f318607b318de177c0d4b305270ba5f995ce834318bc0c96073e4010cb58a0e2eb889368391b3d6852766a799945e408acecddc3686ae5e87505692a5054cb66a655a391701e4c2455979741e41a871cc89159c32dccca4dae9d43e2fc108b1ed802298d53019e3a5eaad20473e3ff949d6e7fd8d55c1a34285878b12b265089d5108dc27e6f9428d2429327e55cde0e7fc6b86afb93563a56e9703b7a00cc26420358c74ea2ce6e64d16322a4cf72e9045cbbf01d0d2ededea2b2e8453a4e72934d13023055bd896ae9ba8b2ec67ec2bf72c30e9623d4800426b93e292d680d4d603509eff2e1e878fe11d80fdc522a05bb962d036217cc8be80ba3a264a934c4ef3754ca04cc29f380f19fb47b8d6d7b997dc1f1524922ba5922bf2d8a72b7be4ca2695af5ecbc8f04e228b91e912b759f1263cc7ee911341c86f746e954d48e0b0ece1f60b42e900c6c298a500dd2a82edc99114288167d84b0d26b0be039b89cc4e983bfc2eeab09e808a49a440187db34c84c47a6a0fb3438d7268c7545c2847d42247d897b248ffe4ca467d4167936c377f9e8b55f21ad778bf5c5b4973054806e8e248862b101077be6434eb00094013e96b0449fa542f54745520e8c968f86d50d3f4013c50fac0cf6a7143cb2a56662af38c4f0eab74acfb1bbe3b44997f90c3e48313cd4fe4486522db53b03dd7bbaafecc6e1665ce05bb76de4acddf04f7aadb9ec1c756f795e9521b229889ea97d0546caefbcb64e91c2e281b4d84af2b6b81ec1510ad5a31c1c3d9b86957b88406bc1317a3255fdf860a43b9aacea9b3709e1616919c36a4573dbc1e0def6909b40069b2f7bbe67061d4d829ce061a171ffac3cc326bb37412886c5b6a9924af40e61886dfd4222215528e749f732ae0e25c9c40dc61f82b596b92776a9d11fc1337c59b44ba3b800a4d0ea3075fff95208e487975c72e5096afd67bf442597a95ba1afa0cb3580fa98cffbeed10c4be4056707fe6e57c6c301cdf6eefd224b12e39bfaa2108a15958d90acb38cf9fe4ac7dbc5b18030b068f7a565845939928477a5cb369013fe580fad7d4d2e4b88ecbcbd314f26903a61b91e241ddcee1674647981ecee55a3b8ab80de0a297384405075eb25b5f8bd53c292c329fca23f695661bf237fe19e4dcdb54f89030478ec2fb043e3d2ccb195a09db3273d1885e9a9f8e378b92a567e02b562384f60cf56a6d6ebf7f19ecfdddfa984a41293826bfbc99f6b4ea264cfd70b8696632b0006526443d096e16062dc40b81f11b5ad66b83e336994ec31c9a7125d21e2d5a381cee2dc1c37370beb22fdbdf6bef17f605be15ff2205a45e21f74367952c3323f58cd151956f23acd403b16c97ed960ff733d6593759f29af9caba2fb17a634b59cad9f867ac5658fc0734315e5d00a8a8abcf4dc090d5588ab233325b5e1138b16eedbb2170324b90040d35a6867c4a80eda8e2a5f374213c7756797c1f66706341b4a4ab04df0cfac2e38059b1337ce7c30821cecaf87c77e0ca0bfa06897dd90bd7baedb08423a0095f1b5d264cc645f39710245d88f2a3b638f1bf5ba2e77994fd05cfbb4a19eca1290d9c2df0b00246feba8df34d0a28c14731b166db34ada3cf8e3a6f58754451e85efc0e47c38684e524f2d66f4c6ec9a0d5ba6e5aeedc02f55c1412d7bf12e24417671078863a75f3583c4c1540de96eae4c1bd479c6d77167747edee80bd1de73fc47cac8284e0d15d519e676fdeefce67ad99cbc7cacbdae8b948c63eadc776defb9a0a3dcd8f273b1b148e60d79ef465684b0ef65ac6ebb6546b86844aab9cfdf3b2bb417e489cfa81f5b29b326903e6d91a37b1852feee9fe9d57d7fc90ffa2960ce616fdd4d8a36a8bfaa95519a4f3e8506e81b3d08e8aa12761c12b3d47d8cbf0b442b4fb843ec01c8f11aa767e927d34ddec4c6f71a02451cbc93f7b1da47aa54d4f098448d16af1995b97473ace800da97cb8d53f336f63be78a01229108b74d8c56639cb6650523f1086567facd924fdb960caa14c6aa56154b6ca1223e7a57d2a32e0b6045a86a9b7de69f63671c1ff2aaa153ef1fd5fdde7ea6b80e574806608d542b0b470d700d8074946732e2bd757ff80c02d10d859b9a2bc1d5f1b4cb8e6b727627d7a8b6cfb69be186bf9acaec8c8d1cc058b59fe5047868e98c5539e4d4057736760eb14a96c8f1427bb8aac066bd10d83562af33642917e9858db3ec4d8998c7a0a3f21697886e1ae5a0ef898524828ae599361f3f9a59368be2dc0d3e7b655bf60cfbac4f5692808c080bb06e3fec88e7ddc700dd68a750fdd914d02d577753d4be208414b01903ed3281cd988ba932ca84c470e4007cd959f4e0dda0aa195fcb1c23368e216c2577d4d4498a846318fc32c0f7e9fe64303eaae27e2eeff5c057cb562c12270655ba4395acbaa684bbfb7c4efe35aed7e60a8f7c3a2e958735f9204bdd574d62253323287faf8e989c56a5c10c7dbe527b4c0720ba364738112ddf76d2b3e11a1460e81f3aef99092a8c63c9ab18995e5081a67256cc5192f2743d59a4be9ea893c206ec56e15270f70b2acb42accc761639e1e3986761225a5aee86bbede26833d504026c3b474a72615f386b90c4143cd34de7077dd260a940576090b8490365286413d343e4103d1d95a39e6b1cc324ec4f1f1c9641d87fd30c89cba42ef4b82aab733491b54ca79e529f5392330d6ef369de50372be43e716264b54820a69d6a4eb2f8ab475a52621a8e13bcb35d8b7722b74ae6ed2e75aa1d73e60abaa39545c255a806f6e3ce1751e26730fa3e0af60e3c551c2211a5eb8259e6625976206bbaddbb2b50636b1c9d5eb69584195dde90c0174d57385fc435693ee57998df4a7cadba8ef043c9f051359a60fd8a04bf3ef4fa00f90cf3b2bb34481ab78622509c582eb8331f5b2112198b19a30a80167d5d85bd840a1245684daa688fb88a1cae6f702db550af2d547cf12631156052e04c430984aa3bdad117ce656eca870d07563755d3822673acc2752d04352612ec53aa4b7777c1018a153c87e11699b05baedcd73a1e61a26fac7f84b8d431d515f62419d8fd525807e87d46632742850fdbe918459fd128217d78c3bb9d23f7e1c658eb35a5502cbee3f92771970229885fd49f7291157376c8197088da6d19d426b135f9fa5b1e33aa38b198d068ec79bd37e36d7c7f22c41eba019d268da951a9b590a286c3aaeaadc46b555de76c48768b6a82bc9ea48de3d2fd84fbf6350ec1ee71dbb53a31685124bb13a9fe17791e37cb5efbf47758aa0ccacce5473b5001c45fe2102f602156c237704f2d8c8016d55c5e950129a8e3c00fd15ce12ac9dbcfc1722203b59a013556d7b7e629f1e2dcb40e225529e32385234eed6481d0c2693cf855578056f2f69fd66ec87e4314c658fa3e60f6bbebc4bb71f141ef09683928d144bb7edcae7e88e8fe34f7f82f1ac18f13a51e87af271ef702f9b0d81fb82bb95a7fff9f8635987bc0cc3585945264497c921fdae004f44abd0c85d15b5eac0d114591143cc4452b60fea58fe705d7b5b3c8692a10e6a1f969eabc69cda52049038cb1df14a31564593cd65b899d926073b898f9c454ce6fb424f315c9142ef99bb60054b04a9fb30407268d1e820ab616d31dce7cc7c03a063b9879e0343e9b6461db1992333a941bfe34a8f86bc74327b8662cacc82dc4daaf3aeaa57dc5aad810c0a23ce58c83eb828f13b9b35e7410c90078d6de7dbccbe0490c8b696aa471334f6302e9fc0f0d247471c4e116e58c958b477d63266e449f4144048f8414ca59d5e0a6b90fa1fb64a337cc8da703d5ae552d130ebe75cf0cb2159348a8784de502bf7acb3dc930c389ca1311755b9663fc7e3a29ac5fd5d92a15da3d4e5b7675443401991cf137b1a6cd4b0518494956ffdf555c8688f38517b92bc5fc1ace7b1902ddbb13c69abf78a5d6d0f6796917cda4f71fc38da280e9741a8b2842c0770f9051a9b895b45d7de8491d96587ff6e48391dbf9da5d6d3ddb18e5597ff6f986512fdd820b2f1c350914437e62e8a4e2efa8198ffbaeaa7352c97d160edc631be9aadef673556c1c8cbadb25254d82373dbc60fc6df0b9387f8ebad49beb444ebe65268c8ae1ddc2e7cf5d112c191f5012414ac5adde19dbb5eb171b939e3d7d43e13cca9e3ed196aea431d8c3d5eccbf1d92f8237b15d0b9a612a61827f8f561e918a2749e6f82645dc01d2990e7b1950d697a8a834f31691835d3cd509ea37a318a7290a54b1e051f94595181d3ab6b3ec0baf5bb36cab3fc4380427c7beb075c91c565c028f53377e6596ddacac329f6c041cded73a280996335de7337d4f0b354215bb9ae10d7acdea6e3617600b87e91967bdfaec1b638be7b09fc7b661d7efc11da578676da07a6c71ddf7c6afe1e5a42655a8e303f217bd92be1efaa7605b01a4a61582f22d06344811b8709e41d44cbf525bbf6019cc3d8ace83aa7e48f99c613a0cb44994f40a679df3de652c576bb920ade1be6f1befef5da04664d66de9c9ddc88bc26cb63736cf14608315c1899a3cf9fa8d56793d66c7ef7ed9bd0a92451dc379fb08ef436c21a4b77672b54ee923da5a4b5476be57a9eb946b4161fe7956a7ff621de1c74e222f43cde7a5041c61c991770d96db58700f27982806a6cd24c08c8600402b736d1e85e7c91341aa7342209ed65c2cdfc6d4b8ceb55b23b714b7b1d5548d08625efd0e52bb729019d4ce983143391b53fad6b89d9df1eddd82f80fde8f1ab6a174353dad235577f102e958ccd8b03f6ba88fc773364d7d971c0be710149bdea74961a445953e51b68a0cf2d00b44017d4c6a35fe12d05b7a3c6de8088962e8ea5b0cc2ba759fb5e0d6b3f6d95f76fa0f42e0a48ca82ce00d5088733652126de10591297a68fc3cf68578c54749cb819848ad93ad8aa5d3b714f62918032cc631e5994913d3d62f6df2b5fea86eb440beba0b83ef2efd8f0de6317a2c11048a43777f92054aa035bdbb15f38b12b3bfe91384d5a009768a8840c4d6e1105c329c47cea4dd41fcc87c5af3545dea6c578de1c4398ebeb34e9cb12acfe5657657b2b310e1fa3e4e50103ee8819f6a208033a1340009933653e1b3cde597a4f5521d65b0e9eaa417751ff3601bddf682f260de4ec99f3b7222cdc5388876335bca32bc591d2d17eaa001f4e48388340606abf58f16be1be943d76205591fb51c18a943640c401e2a595cd000492c871c355b837f47e4c92e2f85168ea7e28ea8d5d7875c37b20b691987012ddd4984582716049a0db1a7935e5d5f6f256d44a47a43f4bc1ff174295916f4d7d05da02c24620559a8935bcb58d6b911321e6b718e85080e259cfceda093479892d76f1ae5a5e258d9083a389777900f5e8467a28af15dccf902fa28888265eac54535a6b38837f1ff9ee75da2b690c41b3dcdb9e84f52730ac1e06c694adc38c835b852465f82cf8cb5d7ccf32a17d9f889021a2ec5828acb68641bcb73172d1c275b9ff6a24f4c10eb7fe91138b1bb6714a965e71a6a8ecb54e9c93781a312417894024d06e9e22cae64447568dad2f75f280f79a486f98b15e5f735fd1c92d8c8060bc1f40f4c208d1961a8411fdb19c702898efa44557b29ed283f5bc0293284062efdd01bc4ad0603b32247ed1e5efacd667f923f2d1c1f63cecc144a3fef3b28ee49418bf61287b7db6be3cf273758ed28c3f2d3dafe54ee7d54cd17618f6be2bc4cbefc5b01a0aa2cfdbb3280237ff63304a2bef99278e19671ccc4186384d83b60bed96dfadf5f3a4024b3a3a3be5d27ba083d0368d9e1bcabb9bcdf3c145dce3db7af995e924b85ebb6cf2c58b2a6894cb9fa82f22663525b1a8e2059a907f73c3feb77ad78039248e7e16482fb46aa453e53f2bebceaea0845a4764ca14b48d4be198377eefbd1f04e96f6e2d6d23d2bebf5dd3f2bfd065be18c6b959bbc259fc8c6474e75a8e76a415c5dc8f3bda479694c9cf3e1fe199e64c25ac506bf3005d65e3d818aaf252f66ae03d5d08d62a62cc4cc6d7d82a67855d2de4b60e8daaf7d5dd0c1bc532db835187379dbb60a4abcfae61c6d0f3f522b3a60a938bd97e504519b8f8959638d2308472593cc0ddf804b74712f1846b45b658c5f0ca1fa5f21b6083b50165926c709d9798733efcd1d52e20c32124f277ce0bbed4b3a74765c17a155cf0e910d77a9b4e6348222abea9dd96e24a1cb23e63869d472eb88a2f9d2f17f44c68db9db5453ec1a3b38e48e98a4f7553b5d225dd920951239b99da19473186fc2b1a45886510ba6c3a51f6fbfef38724347ab1a4f7aafb7a999aee9b890a19e87af6585dc16c568bff9a5148012b1da5e4d46c207d294c1bf8b6f18dbe4bb5f89d975d9b23f89ee84a92e0385b9f41be0c05ddb9eb2e4dee00146d56ae9b6214db24dca9515f996b63602b34d3f6fa57f3388cd80b6004dcfbdde95e21a329247dc65ef113474ffd912ebaa232d85158e29302e3a3687bcb2f38ee0ddf0b1110cba46ada3359c9841e2116eb40ef4ca9213ec6447cedbaa4e54e03cbaf7a23c00de788cc773c0ee95063c678c5e0f632f86260615e98c7506546b0005b98661c8bb6402fa9982615701c52b0895654dcaf2759a41111acb6f7497d14a90ee20d8d3a1b6c8f171aefc57343fa53f7708d8db438745cff71bde37ff36f62849f795a9aa0e9f25ff15e99911fc0ed6b512edb328538080b1c4f700f99794ea1a64a3bff580f9918b34c329e71691d5bffa8e2c8c95adddcb753e822f79b340efe667891c9464eeb69a0d9c1be5dac6f83e1e79f8a41a31b49b091df963bdd73afb759777df7d77f1a42d6229003624ee4c335de5355226fdb50b46ffdc31276c22325dafc88fd7ece1971ea6ec506a12a3513aea9fe2281741a98f9b49999c23e9426e1cc63888d8d0ff241e10a620f5d1ec83716a46af81cf687a644273afd2bf1a2b577ee4056600ba04e703b3c4186689da021afc37ddbccc79e34d3bfd09122e27d8593ed814ef6c53aa3be5ddeadfada125387f5b8ba84a1080c07eee2790e2e627cb956b660b6a72c02fc8d8fd8bcc7b43294c850c0075d0c552a91dcea9fce8ce6c7449c9d348e4d165d93fc1196abaf483f04eef63b43d496a46e65edbc09224a277fdb0d58c4c5664a39cc5f70d02a1dee703962099b8557dc4e26894d284d3140cf1cb80b90bb7a2945a8cb327c4e370ad5da0e59ac4a213cf8c6c63b7334227afc07a7333957db6380375bc4f84320fcfb780214bf497a2b36eeac6c3200a53dcd43e1b908c31061b222190e8c30602baabc45201caaed11ce4644c9add842f10b796e864524a18aa3100df97f3d7dfeaa4dde670b96ff578975953a2ce582fe7e50578138a517451aaa3e6b1b9401dfc2d5d8d0d4353a632f24a7a8f64eeccdee71a391286bf9fce198b44da65a7435bcf93842beae259e88fa83f9543c09c423835aa05fa1cf16be81778869ba5c675e6308a7122a48705ba030178ed75f4ce42f8595236d22fb7a0d9002acda43df71bb50e619d02c4272bdb6e8ec4678cefb1d2a57bdf77812dde506a5b7e2b004bca816e718c9587a93fa1e56b5b2dcb02ef454d075685cc5aeb1e158d1fb2c3e09d364925a3c548287ff6f483342115c465c08e792e8537bb7182902434d3ef51ee441cf2652a9c01673b1a5ac1fa1380bff50845e9ee79dbec3e78d56ff6e91c482b686c332de9e07ffed57697014ae4482338f1fb39f918c5a23e04f39447ac355c99f7a067b82244a2a45b25ef024bb90baf11e4f03c0e984e3e379254919e306840293f309d633fd7057cf11bf0436cfeb90a3989c929ce9317e1be804d4ec3def9756230f01fdbfc77507b008b57ee7d055f5b9f1706f3214997cadfd14a5a111470abe156b4a393887a364549f5b8171285ed88bc02807951ce59abd42d7dbf2f8f9eba37ce212ca75eb542a2a9445d4f2241ef0eb900fbaef9ed7cbc44a939a9369d3429c8cf3862727a912bef3da039990b2aa5a6ff38dfbef8daf04c6701201a39e7933128472869f8a94c33ee90607eabc41748d5b162620e4f268131a6128ef73d1a93a6c99789b2039a13e19e3227a663ba0b1ed5c5978031b5af83a8ff2947ad166cd5400e6629288c0bb13a4d487d62248a554677d4013b2413f78a546dcdd01d292e3b1b93d090a897d7e51045b347dd32f363f78c13b4085ae7baa0b0dc1e95653c2b3d774ad45624b03f09a3ca9d5a9183ced3440a44c8d0eeca62b70501258d6980e2a4fa5c3b4ee4a8b7d735db132270d789708755ec32672a18d4db20342e40eca99151a0ce82ffa2997487799d52652e88b60d7fe8ec0b6a419ec0f447a45ccf00b1033a664d4bbd3cf021f15fddbb245f78ff2b556a25fb6b7948e5e6ac179886a86191b92a537900deb7fae0f10d698c2deed0a849516e04f8f57d87820bd989dc0f3f3d96c13683949bceb748b65e9d695f1867e618329c923933a0e29422a8c06eab4a0effa633c6501559415083e1afc25afadce4d990d996a0d93a5ad451fa026e851f7928afc877472d77567a1765ab21079a41d38043903d76f5da9f23ed5ce16534c83e462f73dcda6752919d2f9bf2e4baa9a0f944a87230916dc38d1ee0bc70eb6767956fc85eb67dbf6ae161f759389a96d25a6161d76cb9bee1fc0330482eafd1352c1df7456847078692b15fcc69d6a3d8223e3ee5a1cb388aff3ece2cf4fe8017689e9319563fc5451f7237b4fedb2b32ff1fa2256642552f15261cc36a541e9ed985fe5306e47356f63901ab7e34c7733faa3e0f30cbaf3ecc6daeb4054ce72c0d48cb7af0b18c1c957a60384e5ff3096242550b77a3a14a8359e6674c45845f627b7d09ba438a06abcab5b415d92866159ca9b2c176d5c2e89f6665b5da609977827577ca0707b5778e84d73b2ce239b80d8e9da4b1a7485a82a137b888267acae2575d86786fa9975a5fea44c7bac4c819861487f0b03b57c82945fabb2073cb3f952396142c439992a995b9361cc7c44522cfe1906b2c7eb45128c30ff904f6eeb1526f66e823fcebe4421ef472934b04e718483d429c2dfbdb48c7d31abedc743e7288ed0dbb1fbaa277dc8f66b7bafd35963233d0fae3f30a3e5fc10ff1fa648efc69132789908376cf786373b5a292a0c2263080c94f3e70622136335ecf3435688675a00fedcaa381791d041d8049cb149aaffca7be22a06c82cf4f45d967c43f678101ce9614eb666518924fd296f71605fe8ee6bf641cb61ae89e579783bdf992c1e74617e6a0b6b2f2c8cd180eb73f0ec8c236c16737c7501ebaf487fc851f8ec4baf6e1b4562ae917f235df15ae080b8b30f872a09428a8de2fbd2946ac29b1e5e76182128e1b8e04c8ea86502df992b245ac31b4b442ab9367120a06b5a0b2c207068765bb010855978bac22d99c2ada9ad29cf81abdcefaeb839891140cf7c5946650326f83ee66e879cf2213583a608b0bf2ff39e299713792539a59d6f78d09f18b0d1e1cb6d556355db26dc647e0a0a8f23e94697172d5bed966e9874864f248766a3923e81d5b5ed6786b6ee9d7763a194aacab0d8c407988ab65a65109c7dbc0be5341f89b5256d7d87eaa86c1765fb687f53fc42a0242efcc30bca7d8051bf88e0eef7efbe5adc0473a11b51b2b6a789b00902be885bb8d3dfd12c35c34896c6d9e94d1ab8fd42e69002cdb50ffeaddd85134ab246543cf950d711a02d0b4bac1b4ca9726bb5a80a27364801f7e6134e459a5c87a0b6c5555e4304268642e621ed40935f9e2b15587f64149b3215e3c33ac5c1a65f2a58cf533e8a2f95956d0f96ed94491b0791b8e2b5b7ed88352523aabd00754b57ff4f75ef2d2323aaea5d5f7a3398a8f024129651bb5dc1ebdf58dea9a15e2be6c1bd0e7f746af82c64f39010f9b40e8ed74ee45fa855a4e11b491eb22cc8c87ea7016415e76cdcc1e4b971d66d06148ab1541407043cfabfe0deb2002a1bebc8b704bfda0f919711719749f517f4848cba0c6e73597a8b2c37ffe1ba23be5a6bfbac69f67342f0c5137562947fe7253bfb5f3ac82e771fd12694f4099d1bde107be2a9909ce5b185d23b02dc2e48be407b33bf310c9a7e56b885331422993e5f3e8fc6d010e4a0f8b7d172f5ab7d1842437246d47a4d6f62f2bae60439a044ff4c9909df59a586c7c91ffa067ef0fbea590217d900f8bc9dde1c55006b98b699adeabae5ff922a9a110de13730072ee0c7cd7a6926012bb18391c8313ee95dd46a68210988115617958471b2482c7bcb95b9b7ac75d18543e90286be3cfc015989fd85747e8cd0e95f6af09c4ec6a854c9b015c974d091fe1958d8d0ed376acf1590304e686a61b677a9a720ca3d7e226d99dde8ac6619871a79068fd8035fdf130868becf13d127e327de6345f8c5de885b5833a3fce389f44f582285c9a9318d4f76ec3aefe8e3adcedd904761452f23e0cbd0e3f8b9aab0c115b27cef106c8a4ca20131666e93dd84ebcd56dfc5be450f81e7f4c4619255b6876646df5c3913e733253ce02ade79335142fcda0f32f6d0c1a15cc6a3eaeb18f4676aff553f2f08737fe4c5e56d8bc25819c0bae9343e0bd225a568495a7bcea5dc70b9c327e697a838b07d67e71a1945772ae81c6c26a8fd9c561119890bc0e2eee1746d98407c1b77297078f52f206386c3ca7081b5908a2ef828dd20a6d6f3c543971c3b469f1465d506e03fd1bff96e12c9ac1cf4a9c10212175bc651f81f88218c98b8ffe9da2a3ea8666c08de4e57a04e9ae4e9dce9412c455c24160eaf6000baa9b67440b7edecbcd424dc65ab68f3bf00829e124c12cf1aa7e2fc00eb746a8917ddab8ef1d666acf011563c58c99585a79d1b31309e81fe06a70bb61bede661a9d6aeb9d10f34de83d97d4b9da30e0957de6622de0dcd593f1b4c1887f2fdaa284985aa9fbddebc54245a7bc21ee4b2d7ec89ce9e8638931be7c60f77ac35cc5ddd364aa30becac2d9bf3b20e61a1e7f1718c1cb8314c1462b382813242192f0d3bcb80251fe718d4e552d9ca95cc126b1275f373379045dc26865801dd2e3c030b4b336c21576712ab7fd93fe1ee9a0e794e3d18c08c8c50e9dc7a2ca5fe5906f4bf4dc13ac201af958098b26e8ee7a24e1fe1eff3c95288a48cd1fbc110efdd9e2eb56c91b24e734a5f006e633461ef38eec740f9ce004afe9c43b55aec6751b2a053b550aeb6267324f8bae96970bce0c5d753fa23fc5f9f16baa4971b272a -MD = b2adaecdced52a7bdd889c2cd0e8162ccb2212d6ecbbcf209fcfe7785ade1f07ff904cf4711db0135b7e47cad876dac5 - -Len = 94480 -Msg = afb60944a830ad6565df306fc86ca403850d7c91d761e564729b5adfb8e272062ff8fd40331a505ae828ddd0730607486a42346088f723a9a6f180f3e611b5cc32f30443e5cfd2f2c79d463b3f7d13d1c455927a95bc1414aa1776d6ea01f6d99ef144d72616dd32ea869438949871a57d8ebf69647861ac665565102a7adc365d38e8835eb916243a2bee4fda20c9cc7b35e3b55ff2b17ac2f2752710440fea551016d0f57e27cf9dd37d0979dec24fa89225e4edf4ad84a738cda5032638fd70c3f644532eb83bfcc869edd9970535eaedae807544fdd4fb6d96126aeaff789498b269e09170714050d98463163a862b8da61161ab4872a8daf7f4af560b62abd66fc7056ef8784fb4f5547d22084b52bb341d18f1366494c719d5393305c39cc658e4288ef758133ce7e79082178b47bf802e02de70b4a97b233c704894a34fb0924ab3ba161a732fd4c505ff104ef2e1b3cb873a9e6acd403eb2bc5f610bacdc48810cb8fdc556d7e77442619b9c3b69f57d0fcc688cea5c92be853e13029b91a00f9d505361a67a457eb1705f7e0a9e6dca025d7424e71846e833ae53910418c27ecc4cc1f74a61196bb9f305fb47c9443dc8b56d39acbc83b82e77c9bfcfb9d7560373ee8d2ad489c1c1b4341cda32a15bc99cf9d4219070b7df611c94e4bc071da98c832e2e1abd0a337995e8ab21adae6edac0fc2edc366cac34f5182b69795d256027df3e7ddecd760bd067a2de90bd1d366bb9bbe7fc5ffeb7fb548d08569de1b783aa42431493f2328ca1a8b071103f7aa213b0faeb193eb3d74ff0e0c56644583e9622b586e30fb5719fa3e178303d6c0c13f55d2b21d2f130113e3aef3fb60d01abc61b5d45355e28687db7cfa47dd552c07258e3ff2436afa35d5efcb09f9c74f216bdc041ccf359041c7b9bf4697c1c2310333b3c9a4dfc0c3794134168ce3e72fbe2d8603c3dac7c6a7407a9682b1142b5355c5f9efdbe54b2245c7b776b08345bd4cd29ed04c7d74dec384ae1a8d9274aa76ef0970d9d84b85500e5353b793e20d9c6254810551daf29595f3ebc1ddab8d19878ed4643a3307127080a053a9a303aebdab328fc5677749070e62f8561e5fb037e077055b901bef86a5f93f250753f65d29716648b8d15050641c9b8c6bb6dd78a4f537ecf15859c959aab4a66d52f5c955da036c4d954e2a8b7525f11216e3b242cb664eb530d3b112516eae63a54f7a96b8f1a0742794cdfb0912148fe4857d50662af18a3a0fb64669c79d78bf45f982baab75eb3cb6d32944fa7753c4154244620085bed840718c704a042b058bcea03bbb6d011936d29cb54989fc2a25a9a52b617be190285b5ae18062e90c835255d88be65451a744cbd689dcf78b390bd93ec834810629ec1859e54a3158bf2d3a0db782637a5a924d3535e0c46bb1f18718cf401b8ec79c6b35f31aa26eb1c7b347a8c1acf7f343873dc825e14042f30555c14f2fae83f4ba0234649ab2edba6812da14af6ef3e1006cdb2cdcad4e78fa5268822bf9d17d9b4b23a8a8d9d56dbefbe5fbc923cef35f5ec956250746fbccbb0fb99ed542af757d3b675b280b6a2e6f3707a8caf6e2ea702d4248e2cf03f2dc313606d559f2df1506211031f2283ce96798ccd90e48383d6161c6d4392a13526787e28e89f03eaefe56668c1c3070f6d25f83c2778bdf3320450d3037c6949a3d3fb05555202aa79e87ccab0c1b5114119c8c0bb53635ddc45caa9b2d71fd300cce0ebe3dfb199b5125c0f3243163cd9000443959cfd2b9d8292d899ca4b3a060a34c4db6f98206d0c0d219071b0f9ff80b2acfe7c14c43d63ae47007e76e67d36ff77852940a5677d97e612740eae7941dce33c1b2f90848f28dd2e1a273f2df74aec293630926c0e0348ff74b5c510ec89cf97a0d6f73aaf08846dc7e7adddf61c0b0fbdf04d4467582ea1982fa48c29c25a59339161266a542303ad3d9857db7dbc7fe70940b72f9e7f3e0902b5b59f8e6bc8fee936116916a139f3b168614d75e7c0dc02d18d0edd251fefb95e53f7f5eb2e2665dec35455e857c2cb85c4f40d741bc3636a8dae1e078c71d9092dd9ffc0d1d68ec204d21adfa541145748794c4bd8c4b57281b4680dccb7ec1d0cebb5d3fa34ea489c8b6c6e6b991347b4843b543f097f512fcbc41f29ea7a02b8d81e0cf06803d95228537df0f150bbd2bce07897b7496e5f993925e932091ff9464253fd9b61deef51d7f47d72541c68ca459d2af99c33dbc6cf0755b623de97de2a9167f58abd3cad01bb5a43a6d33f5572ac3ef5fe076afb8eadb59f4fa65947ddac779d08e0fee5d8bbcf8ecf461f066d8e1cd3fa52d3e07f00511416e00829638e75bc63ad00a064da247855dfcf8540290cbc157ddf1ca9e6703efef26c2ec51da979218e0987ae01a02bc2051979f36755d8d9ee565815485c4591454dfc0a435afdcceae042bd198ccf9d1fc38b8c2f414ecd0e003bc90f5b505741733b3ae7d26feb284e789a08308b6f979662156816477945a46ecf21b687d74ea6945ef157f807b21bd14bb8d488bfd45aa795fc1dea66fc0c982f68b51399d5adae7d4832c0a7ef0ff7da0fc0ee153ed70115d29e601b99fe62efcb9f1c253c51339fd6abee5347f18f4ef73be4f93dd4199cd2e1d0208643731931bec904ed5ac8cc8209ab94228b44b0578f92f4391b9632e42d63fe29a375b4845843bd4e90170d34961ef0e8a3bb071602218d9a7221dff0cc403cece50dc9abb6b2d8c9bac869d49870f101029f5b1eddb94dc8a262acde04916236d3e55f8e203dddc5a283e94b58c81fd67096b5566881bb2c7300a0961e7bf96e33a57e15dd0c55aa0eef947f1e4f01cdb5481ca6eaa25f2caca4c401612888fecef52e283748c8dfc7b47259322c1f4f985f98f6ad44c13117f51e0517c0974d6c7b78af7419bcce957b8bc1db8801c5e280312ef78d6aa47a9cb98b866aaec3d5e26392dda6bbde3fece8a0628b30955b55f03711a8e1eb9e409a7cf84f56c8d0d0f8b9ba184c778fae90dc0f5c3329cb86dcf743bbae704b8acbbeb39716c426ee3e0c5396f8014b6a8b5f2a2492e7fabbfd57d4ef5a994821533b0069771f9fe33d74ef4945e43cc7e20ffb0ad639b09b5c3f0e6b6cd05faf3ad926ed00410357fdd7d859bd892a6e9cd6ca378686b4ce009837586c7c56d988826f4d39931af4871f54ede856dd06c19bded32a35cffdf24898dde204f649461d21aeaa7bac5fe232ac2d4db41c385a4680054ab0c9d03839792357d207a77c92853bdc62804316fa2842740cb0ac6dbef8f56f5e6aeedc512251534d519a30c9e31956b15f462c5d0f54e5c4620905ed8ecc20a77900e57ada905cdd9bcb6ca98373a0ce11102b45ab8a2946f8f727ba8ab2e6f3c0ad5c9bea08fceaafe2371cac6f43235e4a1b99420dc7f83a20dd0d33ce48aa059e489c9ae0badc53869a0aa735c6160e9c04411d054744f2292eced249ce34117ab16432411e1c505f9b59bdeeb111e8adef2484993291e6bd23e5af4a00faaceaa0ddfa52b1106e1645f233c28d7bb526e32cbef10e46df82c23b12fa67629d961bee3a3cfa2174539dbd54d8e0bc3daee940153666cda52015b643818ad5ae252d7f392682b72cbdada26759353c48ee0848cf90bf8d0040243f8906f1bca540db794039cf3b5cfd7c8ab36c11629e8e482d3526a3eeb88af5bf2eb1257d4b8e2fc2979c6b13cdbb125b813afe980635b1d58f21995894a5931c78abad8268b830438678dea9479e78ff19eb83464a8b4c2925a82a335e3a0340b01c1131c465e6e455f5ae64924eb55cc3a629d2303a20113ee4dce7dcf04e111d2cdaf4263e5a8e4b3a65ab7574d15cc79376a581e7357624fd3adcd7707d7909018f3258ea9327b1708ae8b9b8d5e66cdbf427043c943e1d1ac97b1661985fbac6b85220129998cfbea68226c1c8e1fca62bc083e144537263132a636ca5aa79a1debe475e75caed4d40e18438b237bd1ba2d9c47e4d9b6b019f528439ae448eba88dd95752ea45345e06d9bc49bcff863e1d891bab8004f1cf55c426fba14413a3e17d100cc0d49cd0f8e330e8c91f4a57027b03d8c6968db9eae65b6d202da4988d4c5a658ef160d53ac13bd8c65fb0ad82ce9b0d1bdfc6721b2b5b8fdf6a00eef7c3710d931032e372f047aa43353baa05106bb90e654e806cffa1a43d8dcb2fa77f0e657bb5858407fceeddbe345dc50fdcd05d0cbb885d66cfb87ac90d75c322eb8cfdb755db2f80439bd395d19997097083799546f6618f381a54107d6351d0756736b475965e6260d93c689171889897df8f369c3b454cb541c09232465456b947b12199698924e11168b508782223af5f1e7f2fa97125c3c950ccd081332c3388fd5d35a7485e20eef8f98b0fec41237ca7cd75d36db0e01b853eec9686a750b56be5dee21464cccc5da4bdbb5f6790d2abb0034ba36496a2ce56cb08b77ebd579d49f9ac65df21341754f50ce40d73db9aa56c74aac75409acb3105a4e18b5e9f1f81a58c533eab0b678e57722a94902054bf5d0fc4fa4ba90b2310dd2ebf6d71a8ec599aaf965bcab8ee38c93d18ce07be24403106405302af2c185ce8eecc9776c6fc19f964ec2671593afa00ccbf15f26eb6d7fab0204cbe336749967f41b891f9d730ba0f27c999b6a62efc162af3f783082929b07930411f43cdc1dc957c026b320878ffd15838edc48cb75fd949d54d7e501aa928563fdaf510f06c908dd00655c8be9cb57e57e5dc3dbb1092be94b35f745504f365c04bc439ab97f99003b08799114e9ae1fc883668908f1efa3d9cf5bc6327a306cd5afa707bc59a30a45311a3fb7d472932bd1a36bc4645a6d8f28651cb7c00e06cefdedfe65e3913bad63b0d039185fffe6ccfcfc99bce6a6b9c5b5b1569d19ca8f2b7ab76ca9fe14d214d00b2f21c0b6a7d9e5a3ff883ed0082bc01ca58e0e1864bceffb3729443661c8fa38e08d4f47dd9cfffa4c42ad89e8cf06b71b0f35810e36b0124bcdfe00baf491f213c75623f66aae882678cd24ea241c292d9d3a84da0d5d951114a6247c2c29bf3f4c6ffb90d763a6049718417acf52eb53b487a456b56b0c2da9b6e1f3d43408a999070f2b77d20c7d2a195019255d6633e1976012d34ae007d9baf9d08143570949b60f24a05c03e6ae3ae143ca9e3234a104388ccb8fa926412cac80b7da32d4baf75c2b057424d7900775992397c7ec7f38ae2322abd00f5c86aa82fc6b24728945769cfbbcf7c67c197d77d4ccafb1d8bf21845d21ed39a8435465a3689489211afef91788f549cebb796e32cf522b4a02431eff74692ba10d3a9751651b8f1f0255ddcd8a95c80497e9fae1f247bf4fac73516e35cc5bc32edd969ae311dacf760ba9a21451c7ba295f9c46e7f8f4660842da4dc89f40ab32bdf1c4652012def090eb29c8d1df6bda3ac0f612fe5109b0320802bf5a80b5a34c27826dcebdb9fc7620c91a7e6576351c1753f5c05bb74eb169218c76827f1b18a6496f6641ed143bd9048bb00085c473fe0522d78b0b0e517c2ea28bdc63e4940c7ddc8f35e4b25272608f2f16f702c2e37e0cbc5561a982cf8eb3f2e500ba5eb8b447b2003d614a8b61b7343f667a99762325e741479ad5c1c6135432d1e6c9397133773753ab84928c7677d0408658148900d0e5494cbb016953184c63f4740d39223751d3fba116455f628001c09f4d341001a7d349b2ececf5c7a8138defb270868ad61adc209520d47cb546b3cf8ea8f6020f721c4e02d57ddacc7d0d8cb7bbf2da3aa4b7737db3683ee67bda79675c055a82923efce1974dda201cedeb9b7fd9be061e282a5e519d11aa1daf1d55d1d063b7d02c4ff7b6f84e595fb97ccc30bdaebec3a8a5b59ff5ad56a8ac3be88ee9c605a85ea7b3c90f9fced1fac0c8731114cb51b385f202e46aa2a94c557df7b3ea028760a4a421f656f6f02c481ecb6698c224d34bb20efbc1e49c19eaa4a0b1582509bcb757764efc7856b8834d8e409329d9725774389e4bb2fd9f7bfb2e8498e38bcd602c2a7c08b96239f2c340119c68dc3b4997046e70845a4779cfd58014c49a3d2fc0a2fff4309f3b371e956c3d15a97882b8f6ced8df1e9c74b15a46545eb1768683945d57848a1690cde2b2dda6bdc4a3487441dd39c728ed4e0149e0087df405036316ab0baf56b04fac87f692a59a1bd4216a061af05753d48efd40583c401bbe93be576c7b961612774e206fed836cda72a9ebf906b2490347f2edd498e54b23aab6f4fd7b3f22c4c787e3a4f1fb06c9ec73e76a96c42d58b0ad50f3f05e03c11c82fc552acc76c501c7a8c86f8b8a20f36a80d61cf771237d9f123cff04e6156db4e5fa16d88291da8fe850929f678e2c0050c1f5e6d511f34a9a260194529f12cf3a62abbdc6b9a6434ab417a11f5ffab7dfc4ddfc9992b62251359466e9dca03472056616b3baf98428996b5b2224f3f3764521b36f343ad8efe244071c4caa872578d25dea0448b50a471a08005b8c65ccc96da5a654f5b0ceb28cff5a7d7629bd338d1dda341868786380524a9238613bc81e3ddfa37b5c663cdbaa24cda7bea1abd2b0f4b8ed10eb655aa451379c885bd7b0068b7e303e5ed7bcb21bdbc3988b686fc1da014b40ebc2e578c4da0d4d956ecf7a3a63c8d90129ac81a0263e59d2ff90baeaab977af212dd6a05e82f238103c9135ce289af059927a3421b9c6500b80226b726661186cb8ee2b4e066aca72d396c73790742d4acca91824a526cad48207fcff04bb72253966d2251383b60419ce00ea5d616e6dae1d6e120e4b33116783085979cde4d417073fec9387254e770189ee75aadb4ba19dddf4de7eb24b965e3789afdf9702ba991aab6dbc3ed953f6094bc2979d6b0ef30dd1fc076f09796033968c39b3368ae40a68896b2a2c1676290a2b6fdc555be5a7b1502e93d37751a188fa235ff9efafb82dcfdb10cf29499132977cbf92f23c539dc23b4631f8f82c68e0e4c3d251c4cc012756194bf237e8cbf0046fa939bfb89b3a75afac641e7a3d25c5084918e9eded79226d27db08d6de1d5014229a387fb6a026f7cb248b330fb30e56e6ace7c3f7ad8833eb4b83057106a8d5867b6d4ff3dc9445179e0700e67107d4327585f72aabd09420aa711a8f9353da5c4628d15cd607c2173b5a89cb47f7abb4dc8d318b5b42b74d5f9ac03dac9b4c2c622fadf877c99653634b75c51d2802f447c51824a526c5fad4c69d8539c6537f374a8acfa521e8537fa46cdddbe0027b1ff755fc72c3e5af70bd596e221d16db2d4310ea4956e0a0f52b181a6a68d3d0cde9901ba86240f59b469d004fe8becbace1e8504cb1a8c12fa91e84b0089c7cb764708a314bfd53bd2b1144a86f72d41cebba09947a653e93e5292396078605472f9d50f3c645523e325c4116f95b80e52a2d1e0bf942a08ba9df0004afb8f5e414c075d81b4078872426007fd0a0566f66ea969875656d7ebbe822e3465ad3f5d98102c7911550fec81987cd3a6bde236699792238f630d4e4ed9119159628e44787fea771ed5f0ce8dbe0e680e1a167f4e1d093881e6ef4ec96569064927b18267b716203ef2f194a1413b4ea2c26a4d66aa2d2ae04b1489b8a782e7b7654f93e0463df8f44478eb76d261dbf74f543d5ddf7c7f2d28037b972ffdda16b3bef56cbdd065d132fd1f78d230b49e097aab9e2d75a9bad64290df5f4841f99b9623877e6bfb585704cd21e1165ce9993434a204b73f3bfe48660bc5e0b3d2755baaab187f2dec2916610c5f91397c7717550405afa403088b77a6e4559433d985f7521c78721f11a86782ce2fcec90baa792e90dd7cb28d82223b4b158790509ba616eae66c63a9316d4fbd40a141ff543d9c46bf2dcce5d302336abef27a430313541447815c6857deadad824599aaab0ed797c33ba4a9e49419b3a069445952dbb4192a355bd7823826ff432012a625696af4883afc523d6468c6786090ec117b9179fd0d047f2706665321d55f6a39d9c0ed8c80167753dfbb03955ce273b55f86a73e8cc8a7dcc5d629acb9d27f8edc64033ecf9571be825b0b85c2bb98b5140e317d192b1a09f2e0e332521e4e6aeddea61d5dfbe9d3d8f33ec8368ec3a71582a92756ae2e451a21305132856f748aab76b6dfbc384a600e2deb3cce7cf1f0ae6ecba9b45cf4a8116187efca4b223f24c589a948f578a3f6595d2a0d3d2c21cbf2e8a6f04ebf293c2754ce3f79fa780543046f4499e51156319c92cd7cbc1575f5fcc2c44c0b29fbc23672677473d1b75fb58611ae2624a847381b81c4386836b87681b30d4f06faf2ab50d4b314b8a57c2b8242aa927a671aae18ccac278688eae4584edb215c9419320df9ce53b96a38d4e85a07e07f1d2c6d0f008ceffcd6edd4dafa6df8a761a658fe691ec7307016202cba4e66af24ed0382bfef1837cb31c67e381e4b63ee3a8e96853cd5da5184bbc40606bb8728ecf0086d5b26c3b06717b6aa64a00e8446418ae09105f37914f642af9945a393acb1049b59923d30fe6728a3e99d23ee4a20300dc3ee3871376e2d29ae9b60ff9cc50bcc52f0e0c7582328c715793066c6a92a5f4de505b47c91e8069f335bc73dba8262efb96ade04da4b8660eaa0983c2ade778780e7cd54f007c8e393f0751ff00d117862380fa50b0554645810fd2b43c0c919585b26411710d32443db93b414003a9561e4b68923fad38857fe00147275d66bc1dc49c15577c7d9a959ad8a750050cf5edd7d51b370665550c43b783562220753e7c27659c1296c5b172d13c181f67ebfaece7f482a9f53d90019c71b2a3e64850a0aa092614a64df709cd058098e2beac51462406de0fc573e259182127e1bebbf9d007dfcdd4b8d127750c71baa7f86ad09bb3adecdb761eae96818cf8385ee74f3e69ad844990a6937158d1cbdb209e2f8eaa5d1d82d7f72dfab2dc5c14b03c6a9f377a802c5cde1668f18a14a9bfaf37c61000b72c7167272eb5f79c9d3d231199772d0aa6a5e17803e082dd375c05b0eced7d0300cad763da92c700fa8c020ed433ae6adff21681e92ca36ead7f0862a74abc49276cadaaa54f33cf54264227f972e5e8fecbe7f8c2ddd30e34b12015a02ea5d1c9df53c437f62253d2914c25b03dbacc2cb8bba738fcfc06f478b5907fa120e20ca92f79398e7ed29d5787cfa09b155d9042fb54f18f059f145f2f9cebab15c51b54ab9153202e95dcff5aef7294dee453f00dc895a1d61ebcebf6018c556cc31c682dd32cb31ae4b8122f4bce30fda99c4b5acbcd3757ce16a672870ba60d22386b1f086d4f2a0759176dad5a785af494da4a25415b70f647170bf510a7e02a96e7e8f8bdfc4645e6967bdbc173dd0d6225469d981409dd7ac62a15425ece255f63f06bc5c356e78818c39da9296f3b30b4b4fc7a6b0accd53c35ad4ad5bd59ba689f292dab42356624acbdbba3f6c82310fd0a91665b0b80009686cf14960fd07d5df99cbdf277a9429e019ee85bfa65c08a8f8210e4e2a49ab3687a21428fc82a92a5ba004ef578fa0133fa00871a1e4cc253f86e8e996993f61bf306a821cbf7a6f3307c3ff7fcd53e1979f4616f753d0c1d998a3f77f672c666e1cbaf0d016d01aca639abc45c5abb7cc1cbd0439319d2b70d6be0c574bf8a12ed76419a91130b98c3407ca5c112e1237a8dbedca06b7be7fd195acc0a03ace7be114512a4712d7e309898e2538318d84d431283c3b86f76119d93d1e1c493adfda3a2bb6110cd279549e9c33937c961e1f4b480248a152cf0fe751f208da72c513542def177555c985c558f9cb65a87e0a88b1bec68d7d04344e7fdf0e3502c63ce0cc27b2e2be3e4d8c690a3863512ef67819c43db1c2cb177d0b27950f674da76e8b128beb9841fc5230c7731c0cab83a7d4a506a4d06e3a01a87e25b01cd5f35bef120ae6509f22b544c3f3f6577e328686f3c9dd02780c7acc4548dd9ff9a1476cb8a8699380413409824368be0183a28512efc0e5731f26eb1f66ce6d2321af9878ecfbcdbfe84d1384ea099cefe77a6384f106f5d9e2b4895f182910ed0502d6d561036b88787ee73e404f9093de7ca6ec7605c036e7922ba6c57407a1bbcfbc507d16e9848237f920feb12597e927d3abd743b0f4ae5e46690715cdfbc684bd6cc9bce42e8606dddf6dc4c866981a5e359d5754ad97576e2855a4e055a5c06e9cbf4bd8010469e9cc25f0f57a5bb2bb2c50a737cc433c076729a7db49e9f12462c67a31868defb179afcc395db48f8ef269b9c6db227ab697fb750b42f3859351879e9d3972f6c96a73cd008b231f3e2a71157e44c581d05d63b31ccb732c2feb7b4f5794641da6010a69f78d37d03d26df30eab3aceff909cae87c6db9234e8309f30d21c1d2bbefec396ade5341209a3c9288823913a53fc96b9684562993cacc202a5c2ca49f899191e6e915f07cd6f1c0d44afaab4961c7d317b9daad84352a6d4bcdf501a560832a0857f04c967f97224a7872057a124ea56c68a70d9424bd20cdd1cb8881f749682b8562e421f6a56d77853fb0abb3d669013b5be8484bece14d121097a9d04cb2ed0bee2593cea4d8d81ba43b42d8f784728c69bc150d4235260954bd716e15b0a95612af608a0e1af8865013f4041a8e3ce641078edb4583051218789d332ce80cee40d01c9b599a356fc3d92397b7ecccd372391a488f5146e6cc4771c20aaf645f29463c851fdd2b326fd956367836bede8def4bd7583687d1f0a8939d379d6c031c5024d9a96a4668b4b30052a3e26f61f498980a5899347e161a77172c2870849aac79fbbeb8239d42e4b66ef3766af836b3934408ffd945bd2b90d260e71e5e34b9a08da85d2f2a9afcecfdcf794e1bd4cea236d1d0e2c3464a75516e4fc1ea7ae64ce20eafd5ab1d4a1881905165475f4859355bc2ed6152059916bcc907d3cdd0b3ab4a46c3995a7add9cfe956d0526cf3cd20f3c55ca60cb8094c4e95c84be07994be3b8657fd30d80a262cba1dfcbb1a19f54b3b848e33aa05e2f373c87bbd94246835b27b8f760b624555ac021ce9e4befc4bf817769a18cc54429245757e4631d81c5a6ff6812f2a55ec93495aff38065f7b64dc054beba7cbc45b07e02b76053677e5f9d8592aab7d7ad7b85d04fd374363e89de44d09de6fff34d565ca0ce6abcfbbe2de07e62ae686df18ce001d9ad28cea20baa85cb9677d8678ac65ef1d5fab44f1af9249f2b798153054fb7f77347dd42e3064cb7fdcc6bab95c0309f27993e7f0f4023d4a1938e0ca98fe0b1691be0c8fee8a3d7af560365e1dad41ac210f0fa5545fa97934efa8ac4110a9be10d8fc0b9b229cf0dbd5642f996a7f9581a821da78b274c82f44d69ff83a41b9d9520a6adf32cf2ab5adabf67542abf3bee586550703887f33c0d06b6583bb4d15b4a07364c4be70ac6e72795c3dae0f034fa6dfaa58cce667e9ffd82ff3ffc3ec8725efcfdf510ae8a22381f4646e31766ce93f09bb2844f44acbaeff92f663855101a7cb8c703f90d025d6e5bed4a13fc7b83fcb3384e301689db47c698674099d9b60fed20358cd81e040d853c8a687e579a598c8c809b7cddbb34f7f98409ff05de510b9f29dc63cbc87752c33897650963a1a83ddff3e00ef741fdc150d70d4aefdaa492556a48921726350fb93338f75c6f66ba90dbd893fbc9589e324a4d0f66f748b84cb8ef077cb4bc70a09e72a8011d789157a5cf13556598deccd626d9e041586f844adfa2658d49a4636b9a91de263e3099045be370912f0164fd2310c8436426708282e96e2a7d09961d295b60242846e959d7baf9c68bb4bf41da6a9b77ec8bb6028152f306b71ead15976b23a1d712ad28fad04d805f572026b54dd64961fda94d5355a0cc98620cf77d279509cb3278f40de9e858ea673c2e3c21155254faeec56197d3c691625a35433730c66534b14db95e56baed6367cae78ab50d4611dafd4460289f229e09517200838245980a8865b41510b8ea278f3fe151e4b5c112776464fbb0dc739ede922a09a7dcbad9469b71a004dd5a1fddbddb5873148719a659fce9a61f918f2f1c0a3fc1ab3ba21ae31d8411db41b548e9cf5522e2e2551c8dce5ed97c665ed58827924a2188e947a51e3da2332f6c633c33c49ec151494c882fe7e5637082645f08adabe031338f8a0a39306571b99f3daf132100528ab8d1b80134753eae5e1933ee8167b30544da581366e2b7215f56a7ed6450648dd3e2fd3751122f17253f2fe155188cd2fa4e8e38905b7e38462fa4afd31215c7304445f6c5dac0614c49530281832d31223f232567002572c6113bd6e7c5d4db506e48bc0d3fa12155c053eea12822845f24ad7635a14b4571b3c3ff3cfc301eb6d96c1381a13fbbb42c98e23e87fb5103a78387869f6e44bb7fd3852d259615d60e3699ddbffab4f9f698a9a413262bb2305bf5f45afcd505ede10542c2955530851e9b7bdc708189a6e9819c6a1188dd478d3df974759b038682fc1853bc6148c6aaa4e6972fc605c5f22661fd6bdcf7659dbbf07c76fb16c22fe6187959ae915b6142a86086e6d0dc48f4af3d93aca303141c83c36f69d2395e3fcd841bb1acbbc9012bd924589d326478deab078c32b876cc2df9cd8ba8447475920470fefd50484d0b6166bfad90bb2f7ad655e058ee3c4759702fc51b8c2934108ad80af5c16592a189fc70845fe3850e400d3d782cdb1a80d6f4aa9e68e2d7c377df5a4877b78e98c3241fd4084415f3787c1802fce9b25e9ebaa0c37317fd257bf55147fba47d5b9d9c11ff12735ed4c040f49bc6deab2d27e04c0d335ef0b0d798a486b5b30b5489b2fb8816e7cc2ce7ea57a523306187031400ee122e7ee03b57b8874e69a52e081730e17e17ea663fe6b5b18a7581e6c0b463e897ece44e17a101cc2e4ed752a917669dc09a361b38b49333751468e6e14fe98f5d30cd54ed1314b7cdd90e4cdd51e13f86d54ba672d274cd6b9392f1d5551644aa80969f3c0c65ecb57ed68725554539296f77b27ecedec1e689ac822d525e9b3862cc87852b79dd6dc6bc8c1180170d20af66a9ad1835c37e5cf22249d647056f4dfb9848cec50c6f372ce61260bb3e153b75069e3d1e448b84205ccb3f4415b7a8a06bf784ebfc2256a40fb875c64e7f9a4f43c2bbfcb796a5938c221bfa4eba09375d31dc332f3f8bbe73644dacb0b822320b9af365bf4827e85adefabe12eef63cf658334f080f6ce8bbb636f2f76789e9a8b791cdade8818b23623a23f4bee62db20b38a4292a709f431ef02da50627c2b58915b9162048f8804c78b076a26f863a9b4ab705192d5e941ed7a12c0c9259bc9fdd9c8a57f4acfc0e24d82b51d8e2dab8e81c2e43f9b339367c120ee3401b285c780c7d281b34f117dd2f5525d8a03cc4af37f7436c19ace64be4c032b783835f736d50f9031cfa09f01ab696e56abb4efe8f12800b1e69bed59dd2736f2f48093e53b84362c191450c2eb23d658ed0c854a5e2924d1dfa1097a1d81ded7af0fa574425bfa0cf31698fdfca71ffa937c15000f9e2a8b4d89c009523aaa8f318934cb2fb9643a264e809a271ed0a363aba5f24cb09b46f7fa1aeec5792382429749d24dc8fd1c7a630f82b4b072ba274240085d87fd69a69d2011be67cf18aae1eb71e3b04c1bb6fe4e9beb848ca9a5e8eb2a894adb5e221ad95b842c38ba300e22903899daa0a4c643ce13c3a6d7a646b0401922ba8c33184eb261efe6ce9ec6f61795aa2d110a64f804769449acf10496325536245ba13f85009bd860bebab370ee420bcfd7b17f75235a20fb9050c9a5e885afa0333338882b7b112ef04d7b97fd87e5485b61c0c014088f47eb893de64af1b4b77cb2ab5f1c49bfd8ce1ec6742dac601e04e1cee3c0c808b22565096041e16eef9ee73f10bc4d0de6bef73d0d64f8a3db39fb53e60ee2b3c6a6acd51cb39c04d301979da5f2cf21e12a9e876c8bb4d7066475f4cfe59db90ad72648208a6b9fe80e8d6d25a516235179dc4d998b292328ec185ba82f4242061e9a0b76ac9667b82b905699bf6b3cbc1379379a4a9cb0c839ac3079d3197543e4d2c626036583cac1670008271693ac603dec79b258a56eb3f91a48b96a7b4892942036751f1ca639db147ac55f52a8c8f0153eaaa42ba3c2c6c21fc97d7c9d8ea9c1b0ec0e59d5f9b43af8818d9e39b35959ef19c76aedceddd005eb999fcb42d9529b4f7863de6bba198843eaa2e589416196e90a89d73f04eb0307080c5914eb7b0086a66149f6b45a35f3bc8337b270d53a01b5b1e67d04bb1f0510eccf6ea9e3e678e07c9f016ca404794c6cb496ae5ce4491009a4f0a5e963cdfa67b6b7d933550f6edc66f6a8a0ffbde283e69dc39e9ba962ba9800ae1dd7470ea495574412563297a8293c31f62da8c6f0543076446709f5eb4a16e9fe825c93ccf4b6b229efc9a4096d3bcf4d96203fdc86b590f650510fc543981c356cf2d3065b3ceb202abddd26bc5b494d430e966f0596da5b5f69f9700af0106a9df2147b5351b69e0ff48a289d04699f3b5b14d05839191c9b39fb1327848d441e459f52635ddc4ba557f336999ef5eb86edfe28070818e00daa5cd623be5b6bf6d1bcb414c826d0f4ce60793791b6d82dae9f9e9b699e50bba266e2850541882d80b2c9edfa59d504421818ff45740f37853e5b9bc67214af0a5f5fd5c00843cc39cbb8765b4001de99643c7923f738ac5922868f865dd3f1cb90759c597843d9e34daa3754a2fd89bd8c0d2e9106fa95149448ff11273587cb414a603759315f6881c6b94b46700d94d8b2a5f86bfdf99ddcc974cf98e47bf4ba09acc273b463afaf3583a9f50373088f5466c1eceae0dc423076287785d52d42d805628e75efa01f1e1dd7775ec200fb1afa52526952b90ea68b848ec39b5d22dff57f711b0a2318aa103b94280263622de8156421581c87523d4ba343d76ea3480381e54fbd20e401e33f140a3b1b0db4b870ecbbf9edf65d13e57fb090470b38b8d0b2b90f7fc94a1e4abeab760f44d8f3cdb0de3e14a3ee95baeab0cfd0a2d99ad4a000082810ae4ac35bb4bb274fc120937a332d79d62e4c32aceb9bf1b25333f676cdb0040054ee14b3cc104b7596c72a1062d105d744bfb68c0bfc9281ce0b9cfec710f9e36492a48e9c7f63ff8070fa3a122f9eed5977ac53b5fa9b5871a830fe972ff0ff08bedbb4cb0f5735a6a46bc2eb512d6295fa7ec9939ef47f6494183fe415d29e66fb21ed02c80f5f31eae56f973e9b7c1fd292b64def863ed057be8957cb8506a6d0de00e9b374c548cbd008bbfece84208652e28bf537dddd7788a49858f37ff1c67ab627d76caf14ce9456029ab0c1bf9f2515f4b9f0a3b27ee0574ec402536f645dd7653de064bc7b99211119287d25a4721630429ada78f42d6b21189cc84732f02b4aebb92d695a473093831dfe791da3aee8991bc8565fd6a9bb5ba828a2b899797febdd5243f4074d2ee0798ee4931fa5c4c45db5754945d6c1950eb9a77fc18bab45361b71d03f3e8a3923738e8d4ec36bcd46ebfc39e1bddeceb6c47f0ed12777ffabcf1c7659cc509503f59e9398cf86bbc0b114b81225b80f889051ed2f168b2323b86b6fbbbf28fd015e3d2d6593bc97b24ee54d40d5f75f6c6746a5451f8eb8881c8742cfdfb97805f492e41dd5b668030b9680d39644c74a8f86bd7a0c29c7c1449777fbf4ac0ef701c63f285e1b369d3050d93330474e0a5138bd35a40357b678c497a9c5a8c7bfcb00c7eef6940a67053ae1c96ba7fc94f5842de0aec5704f003629401b56ac459b6902d864c9eb49d17d1ffb0f0cd9d0c39396e2f3161a742314b528be5ec472b8297a4c7261e12bde401b32e320eea6038d80a33b9f5e0d2a86c3c87667182c6c67b7b3e605f4f572ac5ed7b08842fffc9a718b4d0743025db6dc8a0b19ae5cfd4b3f76895c2d8fd6e96f503eefddc1f7e0f302f3f7d23b04c987d5441e90ebb4fe9cfb230f93e2521ed60755fbc8d63c8a8d70f31712a067ea4d12ea1bc6bfd9a856ac7cc52ed42d731c62bd540a2413bec83d160e0b1ace3fb5a7c5bb56c2b470f3f05b27074eb111c8cb3da3ab95c4a42ad12485c58f80f047fd9da34ada8c7ffd2e8adc2539242062a99f90b41096663d94e52349e9c6268b7c3a7ea9f1abfdfcd0cf8d917bcfc77364a9c22c7cd32989ef21919e0ee8090a8c64f27cee5711763df3e251fefa2f826424e21bc3c11895489f76cce82ec04b96e2a7cab9d9e3f5ddbe826fa8ed801710d7978acca858e908287bdc5ddf74d6007d479b3a799c0018f716f263efe1bad28c8a7f7fd2140d988448d557454c3434fd77f8597e6420566845e316497af411096305c486728a5e7b84bfbda671ec982ae1e7fe3262dbffd7b849a944744c3617c921830b9ae6c4d4d7a2774b0a8696cb2d7311dbbfbc7b0d172c0326f74ba77e64dda4aab5ac3159eb876c7c408b95aa03a17ac2a24832d209950e372a77cd06dd400fabeb610dd0657586813b82fd8d097b212f34098ded368ab1c1365b1077dc52ad56638fbf02f075aca122f3353dea08ee699d86f2284716d40a437cd998081c64f2 -MD = 4a4765fe4c9b6e121007c34b373bc4fdc7720cf3a4631feba046dd2d69962da52750ecb74afc8a5833182536da727bf2 - -Len = 95272 -Msg = 822bc911fe579dca7450e1b3d9084cfaafc2a59720d57a2f4dac1539e412ac5ff0acd827f6c748d23d55b7856d311ba65cab20892440d44c79a9a4ff3918870845be79c690902b75754bf9524eb51cff422621285e489967e71b1365ef3c474327669438f439ad7bc53a8f63a31cb6cc0a3e90bef7743249420a4ab32e0654d63fae11c34b4a35abd42b600095ec50d75bf85591164c05ba307f30311dff1789349dd8b0bd4c2dce4b2556704caf54e6de5e58e9e4597b825980af27e5aef626ae3bd24771c6fcacd13158fdefec29c23a7782108922fd686718aedcad9b5a735791e5cf90400a0d0f564feda62c3733184bb94d2c30f135ff4c16999e4fac3ad4a6fa924142bfb9ac9c21899bf6e60120e3e6e7f509c0b1cb26cda6e0515241d083fad6ad558377510bb719f3d29ef3f946f2270d37d3a473adbc4b9a29b651f12ecbe4fb00be11a6acf9e5d948c7d24c7cc3559c4291d69fe9cbd0f5603e31dfb1570454ccd84d5286cf3473e1c966c08e43b9c9b0610ff6e3e37c187d54ab4314847de04039f4fea12250e9240c77fe83589abd0bad1620a2ea982b085f85c55d3c99c6e449ce5106d87f649af9cdad63ec42a0dadcb4c62eca6c588ac7880c96669e2f4071a2f4bcdb0a0cc9f62f7637e6f799a656b190906940c58af37cc1c6ead542dd173a8ecb1139083b6c6701062e02d0f682d525cfb15c9a904d298bf6b0862842a55cc83c64538178c43bf5d8acab6e52cae72ef3880700243c56132d9ff908f781d14a16bba29e066474fbb548399b4295b15205d88b1fcf28cd0173a1750b851560bb61fd6c886fb6dabaa6eaf67e4f4cf93a0c882e1e187954fcd09d445973c7d3c42614fa663b2034dbb27a28400055888d108039258898b4ac4d7cac194901f10c6ce79461f00c4c05e2e01808de1926f41aa8f45ea5ebb5baf124f674902a813c3b5e81a118e1e8e13d040eff70009a1730e8a6effadb1ecec57e6991cfa94cfb9b610b4d3a07d116cbce514d3e73ae9d5d2898000cd1b98fcf724f998ee81af295d8788ddfe6cf4d94272b19d0d8282fa65013ba65334ca619e9eeb3554eb2c830ab118b8ee6a92ea1f5e28baf98d17415485d448c6aa0baabc99008ad43de2675c31e6ccf6f2960f922bfcd621c7115b1f8bec709df7d748bfc7bbf1d2f64b46a06e75b2ae9158ca4940a0471cbd0b98248806b65f9aa7cc368f7012e7b0d19195db37e28bc3659ab350b5b650cb5099121ea57271ff1795bf74ef6668da1fe8ab0ccfd5050547015eb0af8c449eaace56943b4d7bb18145990c6c550cee80ac4e878012b0d3778eaa04e0319e9354b860ad4a9fd34e8f4c71aa99771a6aae6cfeb00b23f5ca61a323b20a5e9545f8e7deae55f22f229c1ac7f3d93537eae39b3a3ac3717a36afef6a4c805bef1301cd1f3bdfecd5da32511a6cbe27dbcbdac78f7c3b9384b4bcb3ec38e4d1f2a6f9e8a0ba6ad87dd1dc6fd779aab77ca9fe727ce8f5f2cbd112a1080b9a29566e6bbb11ce694d7da614c78daf417ca0e1c91c81256527a6084c276c3932ea70e5b1c4d0dc6dc45bc35608bb71f4efdf2fb5261aa61b9aa9b6c3c77746219dd88976966c68ead59eb62aa3cf6647798dc06d4fc7ef8bd44d8903f1b7b6f8bbf3d6249052f862e9ccfb0d1957f0bba233603bca0766286d17eb9746bc002abd69583643030f68895d0e67e9e3a5c402767bbb5567ae93bd9f5af826e2b63a1a9f9c463f2b125e2cd57ce585e109f312cd7f6652572d304e2a43a132da5d996c0cfebee509a5c65caca2e08dde71bb5b8ee7c741546690a76f522ccae14adb2a480c1ac54d3e3391693cf3523a919f25514148b2edef3751c4f2e57fb62281cdc750e460544028539187988393ce1138ab188527922b96d5d1a285c1c758ffdf0159a636bd60171b9c3f3a8268abb3edf2d9e70fdfb0219bfbfd68217372d7c69c72cac8f6f272720fb073ff279ef9cddf01f8ec24f18a1cca40072f68e49c2cef58ec978f8bdccf5277bf2a6f3c4540b62d253d108412e0c3270d4c1642af6a70686612e5a0b8bc1b1186b48df838ef2ec8168310cc6e806d1ed4f7ea019417d62dd1cba7b598a0b00a652e324757418f4f274ea45eff642ea3e8b372a5ecbd6715ba42345eff15b7ced4e7cacdf2b07e4ee200599038048e32c31f3ea41bb3d9ac79e719f14e9398db4081d5e0cde47223d1489f24cb0a1267fe9bbc80a393748eab5ad70129a2e9bc528cd2243b35e18a7f77e3710acd419ff5a96ac006f4ee08d8fdea22f2bc10ee65595e0cbd2d62cf471ed50989c6926732d8c7e6c8309cb76d40c1cb4c47b4ee0377b80ed6437c8eb2cdd242ca9e8b4a509a526969df0716e2d3fc6e98fe3c37b778aebf191075356cd569d13fbda2a5b97ea8cc6e68c3a3c42808815b181d67ebdc7071f80d035fbff60a297b9c7f25e7f62984485648faabad64a8155ddedb3b03cbdbe5a19d5a268041cfe0b35737668153357a301d67e3d4af476a18072e0f9f0f618466b9d15b049f1911aae156afa0c434968e9798175e36e3abdf1cbce40eb98736d4df41b80380a980eb94004de4eb160fba6de7b07a9a015d2b862452c368c18f747427b80d74f5b0fdf5c0abce366e585c06f349ea47351085e9d0d65d8bb4f0be1f0fe5730a82143a6d1453bd4491f2dbd9273e0ddcd35866ae6ed94d90c60d1a4646cad4bfe34d599087d042841581c27b102755b98087564a4ae614266927217078d2c2e37daeb3d677abfe738d6798533a70626ba13fcd43e18731ab32e16c341287ae33d5cae1c5703131a15e36d60802b3b471d9e44431ef37369da7ce42e7b073f72f60245bd41e2a8c8c0c5203f0055bbc5a7f07539ab070837c3c405e21bf024e14c13d8a88bdd27f920c4b9aa1bef2fa84253b63c4d1cdb8d564ea1678bacd03a26d991669fbd38b51f2a612939bf3ef9d50d2fd66cf993727b61df433103ed856b9a967ee3498205a43d3f45c28f91bf4767098e7067d9ef1a47e70077bc20c8059f0f78c14baef098477c851e25cf0282a96cecc22e550b1b46e225c4a1130ddb3025dda089637fe18e3f72b549a1ca6d1b7f79c816aece66a7f83b7f786e5bd594ff33e7cd4ab9685bb192efc5af20f0056bbcebe78d40e3b250c9120ad8bbdb15c70500dd0ba615f5f9703560a00bf3ae573e9368996a7bae1357e41ffa33d5f9a2d852814d4ed1a64191ede11d945e5f6c8529627b5314e5686e5d7f7cceab89ba364583b8ba82b4ae7f8111cdc21960d21b139dda03979d7895e5f10591460d37a641aaf5f111686ac157b8599d0df9b088bbe15f83ed1f6a54e43e3d868ccd41b1aebdacfb670a9ddfd99e682d20722e5287f6b2dafcb36733c22eceb46610feddf48584e16ae26e616d8aa37b3b127603e1a37a10aea097bbe7895d23bc2099b57bca26aa043706d07d45b18e4722ad2230b15f2eea302173bc1795dc774338beac533a5e1c538db470983c6e2aeafe38dce90b3b97a92ee3a7a01be67dc20482edea67069a7c2a93ae48e924ceb28fcc4d10233f9f54e59411eb9a49b8e52488a75555a865fb05f79f2062b719c28866eaf15243e9796f0d63c1b80e0ff3c058435dad4f67184767abe74f2ff561128f1d533e4d5d60f3d603ea1d3c6936027b27ca1700871a186c3a64579549d955cd4efd8f68e3509a785b2e72dbb0f41078bd643ac5ad4b9f8db46023f0fd7078abe3b8ee9963938c7ad1555ff4cb7612d76cf3bfa5c1f1055281a35b48f86fa3ae454c03eac56ff064cf268b8da20431219b3e4da9ac55714309f5a6a5241e0060dc817562f12deebfbc6a9fb11de594ddb40e8dd754bf0ce9b41eac1068c4b448101fec09d014b01200e94265246365931e2b2739a276fecbebe51690acaaeaee4aed12e8486e5be5036b1db39fc4c9cb415dc2d77ec46e7114148c2ed819c8dbf0b48c0642811ac12cb8d8a27651ea0e856c06b7d1ef84649971b5f1d55776966c3c056ca797132ce5971a3a9152f0e3521f9de381406a2be0c53ae189ac1da7244d23205df66eb096d28b84d80f03d3103f2c6378ff454e53d7c206dd62e59782af8e2c4ee654d5a52fd48734cf496527945e3d9c7440565871f669b9c0f5edec29ef9760b1ed227b779d4c8bdced21ffe6d87bd7e780ca59597e11060d7631cc85ee6a7d9e601f80718dd9c77c158f00fd4525109f3032bd580106aa928fec898932ac8cf4d6541ce74d38cef8ea3893a14b412fe57617ec3628518f9769a58bfe646575fc764ab89f85718a9893a31e9992d91b017aff4ebb9af99b632be43aab2b9e20fe6988ba63dc8ae1a338580baec3f4be3b65754bafff06b840fe31fe5a305e7541d6968cf9fa8dbd6303e0c0a8869bffda5ffe4bd90181cd740a153fd11bad5c0fe6fd94298881051e1ac2a74f82d5c6288f24b6024671c248761765d99393bdaec0443cbd2e6fa11da586266a60aafb6b1e6ef4f276de7f046bc0d83a401980678ef3eb7b935e78a8cdb5a7c3c72287ec34646d713ad0ebf0109600bccb468d827593082d60567406b9d69120604650f3f78f89473a50f0548e234627dc23cc479fabfd993c607c8193714c4ad31d3fc89276b13b1d6575770cef10421ab625fe34c33188d082795f800e4009c7af3cb22ba24b178b1863a2b380c7d62e0981ee5b630cc1c4c651e9aa36d524e50530faeb99c1a12e70a01dab60d4abbf24c6603d14f60ebf34ed6739707365d42601e9f9e579a2ab7515301b179d89760dde9c025d573569d33521554582923c1a99c57e0ddde1ad2faa232b2b8c38fbceafead1c797ff6bab115e243c6a74c7eaded6a19a5328daa7483d0526087ff56f2392d2d91e346dc46a68d1dd93d31b9dba668b13453ddae4d5c7ce9078280df621db2f1b559c1627268582b06577e03b14bb63001ae956ee3a09b1ef46f9ea6d900f0d15a2fe0fdb2ffe603e4927bfcdd31e52ea3af4f6ce604bd4cdd9bb35db5a7497506e24ffe86b1b920ea5ad5f5ae1d780580d26618b2ed55fb1993595496652f25322d48f57c42340a8e2cf6aea252e14d2fb47402d8bee7b24ee31b3be9cf349a624d7672f2160949569568586876b36e06c1e3abd61e050ad40753642e49ec2d2def52e786918b45ca1095a34efd5100bc874f84197f105d4f7cbc7dd269a855eb6f58d3a8694c885f1b291fe45b5c7da771121c4156ac2217bf90e984a30bbd216a12b7e5f1cf999c317d2ec715386d6e1bd5e4bc393b11d35c7b27a38a88cb765bfb14bdcf76e1f7e02c4055cf773856e4057e089b3f74f8bff5c8cd94a1f930b18c6aae56f519f89390f51ece9b6718761b38a4f13bf3fe667b3d5135d9df1707413a262cac7a14e845cd80a70782292e91b52fdfc2f76afc9605dcf2b2d56fc9b3f3b3b51faae34ad53a39fd6e11ff9a1363e7bb46f7b4ceb0a2cf6faf84c1754f37d594c124da37a9bb9916118f0224ead59b183a8d627955a4b6e13265a2968d771a203360703b5dd22ca5a461d77bb27a887b30210a691f7c121bede099aa0921effbd8f63bd24c0e73009922e5eaf4d35e68ba4b033a68b96f54348dfd2c2cd8d58c445e93790ed0fadb525ac41f1c707b452b73e359bbbd2d4e98d6639962fc4965e7f21dac00ba228a7261f874a3c26db5162431439317ea5f9d52637e661cd9fd465940e7ec3a98828be0d9882549b41d0ce46374895a250bb47a635780ab05d6e21c93c90bd2ab77e1500dc61b86dd01622cf08908e44bc770c6e9915d373b773d848cabfa0309cf1527fbbaf10a46e6d8766eed8c56ed3754b06cd856420942db59a22d314c01fcb9e139d330349051b259451eae2277cfc2df7379064bedee2dd46aa94c3e428522042eab63a627c6923e0998c8c789f56dac741fe7c567cdb7bd4ccca52a39fd001970a005dfabb9faad32f876b6725c97901529653ef5660b5cdef3c6c066c8b689765d91316aa05e1f379a228fff49e332ad121929154b8b3b87ab3b71378cc7ecc630904c031e3f1cbe0a76b45f51d2fcc2868e0445e2d9e1dd7f7dbd4a9da6abd6d57d9ff388001e0cd5cdb43108d966ebe30e6115c059e846dd08151e8ff55f2e98c3adca7253abca68b21002e388f99fb444bff3689da76a40651911e8167f44170ce5d661ac4e6d4fae584356443d4476bb817d4017b7ae460f29c31a9c74adbcb3e8d5da7c6e6c072ced80f5ad9a70a6cd5601eb5a81995a70d7a0bbf9e7c2165317175146845d1ba8403a2627a9aac1049e2fdec8ada1fa34934920b13137906501394a8d48a6e9cb00dd8c34e36951fbda557f04945eb1c4fd0b0d44f964d75437aa3ac2f3d01defaff97c77c022e61d8b216070ce25fdac6594c647a8d047bb1ae8b68a4e6f14909e0c9b42d87dd9d4310207afb3ae4a457d44d01bb8006e043b83224580ea6a586b855d3884b0b9da5c75f9140d4e344aa4b9df43af8bb6ca09f8228763c88ba188f236cb6d82127a7e0b9930038c28066c52385207d8be6706b62bb24f9ff4f686e1bc7deb68504f16218ca66efeb21334bc7fb9595de185d24b9278acc732e1d5c252b296ba1fc2a55637c9780c4efbbe471a0c0ca1cc80dd371b2d23d4c1de06229e2bf81dcd6fac182f2be73b7b1a39809bacaa3adbf288071a521d4f2e559870f32c7809d5c0baf5c7401512a31966f7792daa8f9c55731a148a21acd4e2fd3bf6469ee4e540226db4988a187353a72a370196269a242f0e9e27a96451f0b4e21bfcf5556878a2fe6bb7ceb358637a8769baf58631d90c431bdd4d1c32294011e8d1e3c1dbd49d1651005b89cec361ad65dc31250ffe9b6611fd651ad1d73f39c14812c0bbde71441914a8e242edfceacfc7d199910f7cc6151a8a06dd94f2c849e1eac88510d00608674f83516d9cee1c106f4a4185f10199b7346691ed1b5bf711d44fc3f639eab37aa7b376acd225bf4862bdbdfcc8a72445fc90bb3a19534d5a77ccf5090f50aeb15a192f362d004dd2447a52ce441529693b3ba6266d4ca14e4dd694c3d0d66ecddf1ae7941e2c3c409cf69c94f3da3d7388bddf1c87b6b75fbee32fb11efa58029f3f4c4115f7ff05d4b917cb6864b5075dade297191fe3f14379325b5a2b1f02130ca9b7b5022aa4744840ec1253449732724d2061e6abb5941f291d02e7084ef2f99c727bc933aef41aa471721440959fa17b4322b9931f093b8080b9ccc83b878ca11bcabbae87eca6bee618265da50db1f969bbe72e801b64e520ef3ac37a794c33ee3267ffc1c672fcd46507e028053a442e9e2dd2ab5301a37803bf7e6e10aee194333cabdf0a15eaa6f9476ca10e90e7ec59cc23d338b867f097d97d99162b26985dd837423ff604e8356377a2926c513d7f6096aa44ef9f152c07358dd2576f550299269dc0a9d812b9ca85af29131c9c6f79bf93002db56030c73aaeddaa4864d21dfe444487e0a0f70b1b294b2bb673aa75e32fe2e9376c4697f19ea09a3e423cc532d834369b3d6d93ac93611c9b7dd0f3b5d375a8b193be07febfc3bdbd77b32d48bc083c74229e02be80137c57f54361ac1020f2a0713785b694af6b427fd5c4b48248e0180af8b6c571dab15884a25e4a788d3d807f23afbdbfdc5969b5051a1aad6ee7d3511e4e65eb1f5239a65e27f57f131fde3812c48893c2de9fd1d19bcfafe2ba529f6f37f45e59e557d4d77d51964ae0161675828ba30b815130bbd867fc6cbe02307bf2053e22d15f8abebcd3509d44d4a4cc684b801ed82a6c344e683545895edec50b2d1d02acad427474ef2092a4765da7d45c9d654987decb6c34cd05a2e4d4cae1b07d71ddbd96892429a8c38587cb7855136d776c0622f1c07236357120ccfe2453d1d8fb2cf17d49073b987e8558be692472eda601b347d995035d9a9f21ef316bbcd08b67edb1620c6b99e60baffa8ef430009e271a2e1611b6d675bc6e1e978c80d0e4fae5d5fdadab4052671bad44f747889ac2c225047cc338a9052bfcc52ae052be52645b7a6f9d145a44265729c20bbe428145bd333aab1c8b05c61a58bb3dfe6e0af3a266c6938e541f7a888bd90f4a1bcf0f6710dfe0cac23ad6f7b0d20c0c7a911e4b51473126d64562a209a0c4949d28a9a33bd106fbb510d9057bf3dd257a614ec6b865f8766772994411bdbe263d1a8f01f2b28007fa3436c4089513d1d407ffa51aa75be57e1368df42847e87721139f40408ee77f7f19ac3e53a629a2df1cb56d68fde0c80a46be40a996830e2a93509be2894d434e55f8590582bd6cecb1c6c9a93e14415a20cf2d8611daaf53f0ab3afa635a5479c0f79a882e2105cd07d46d5381834b398e67c3a70016e206f157247162353966225208c2f27ef5ece6885f500e546d0f562e0bf4ab5e2fab5ffd612dcf077a7f43b1ac9c15fcc2b0168aa9862db0304441ce0c5659db1fa80244fa18f2f7a02beaba8cfee1c2f6805e8153df26bf1b4017ecceb354b53966a2d5f619122e32d1e118b2d19cf918c68716634240a8b66ba0335af5e213054d07575d1778d3b8dbee7126fb8fc8b1e95af0e396c494892ea348b7024c1d0cc6f87337fc6d0fbab0da6eee66025848519cb8dac5faaa1defead6edc4dafdd5373fd18daf370ac1b86cb614f83cd06566181551b62a13f9173b830521d3d8e909a21866181eeb545b6ef2a09b8759918f95b04f519cf6a50f5ff7060381d9cea5eaf1cb1f6cdbfc01a6c99836291b5237da30dc7e987caa3e1edbf8512a250e71df03c3ac67014012dee406b16b3d33c3b03e002565cd8f0b3fd7e4f317e731d748f756a75986a8f6dceaf1f495e8b99cdf82c42e4c10dce08c92d1d09045bd3eee748cf88891bc15698462e6ef436e2a2fa32f81956e1a24cbb5c7d2dc673c0e9a236e873d4b05d84c5a6071c177d9d5684a4a07880ed03ec5e7cee0457635ae12ab033cbfdb0aa54f13f37c52ab8206511e1ca66c19869842d1efe2119a31881eb65400586a53e5385723f0eb08f223b3c8ad478bb6c4990a1b31c189fab70388e967b94e206901d0d0f9b3d4b6b09656ef05d32b0e13a9e46c9d63f5bf4f8717ee4651ea24d35fdf247cae55dc44c5023c2d309548fa30996c39b19d10817c926df9ae749f19692dfbb5c9b6a2371a7f562c48118d0296f2c40f93c816d64bc20d86ba34b8c48681feaaed3e3110fb94e70a01e605b144b41c27f2c0f9d55a6f77f75b71985b1da4d4650036b157d20b94cf455ed792a0aa1b87b4cbe007126053547b756666985f26eeebe64a9506aa0784fbbf2c2a139b6a39c332f3f2db5f48a301864b6e5e789c4b97962250ff3ae8310b522b03064eb145053d5c201e32feeed5ed6ffad7b7dd86eb8e64132582dedc5c5ffda4df8c97b16433401941a21e3cdff2f9926be692a7ce153663e04c928fd82ec995081dc487c75eca63ae77509607dc12be82cb62b42a75c0ca985eac516606b85fe7c9e1cf15041f88cb793b0335f5e1078430f6b7e6f42bcfb581d32bee31f289e658968f386e6a100270888b51838ff4d9dbf5b7eadb9ffb9f7daf2359f59e9b6b918ad117e4d181ba23de3643cf430ee99408bd1e7243d4be1ae9448d9be41de03d669c9aad7c655a5be60df32126db1d25d7d06a0040e47b202993736aed98ac24d1f9a91394434ce0481749c160e5db5509f8b6cfbeb33c56161af3ace194370e74ee2c5c41a4f77aab5c2ef618b48ceb473dea25e4c76a8559e0f6a7e897e9c3f6860bd1aa0fc3f1b7e5880976ce99b038a8ee4bdaaa6e759aed62a5282b2a0a01c62ebaf80c180c15b94142a3bd686c8540aa89c9e4aeee804a21ecccd762ad3ab87e5f52235e946de03fe9c70963e6d50e0626d9fb94b8b3fe19c4fa24f9724b63e107e1ddfd5266636c460938f1e8d118eb6c3179879adc113477da985722dccf40fccdc15d0ba949aea192d4793821683fa1fae6ee5ea38c584c96bde485940584843d58e78ade9aef418a65659f6c06ec0e5bc833caaf766f8a531b09621c0c93e859280196ac5f166f18711ce55af8d8fb7da9bda7a9d7607a3c382c821bec57704bbb14f6bb9f0b73648206d29448edaf8710f4bc38b71364769eb7ae3aaeb76338998973b462b695971f8b2ec2fe1174a28640d3051f70902cd510ac21599a0b4b48c6d53fb0ff1dd9d113c08c202e90f69209b2b7165f458463a14477f5eaaea95235e40392ce52511e065198b82b4caabcb722f7a5c8cca6d2d040e58b8e957d3f3d67a90f0b7d2891cca991cdf0f0e78cb2eb6dd3936dbbaa076712216e08ed954528d8309ee685afcd901d6865c4d48b63d5c0a8a870eb71ad80a7c2724e21deb7ed39fc6fd5910272cee49072109a4030a8992cef1d5db129544b7382b142a1fa7f747b66927411212a8f4dff1b6033822b9f6851bc3af1e5aba73e8677786776a630b56c645564436ec6a7f42e4fedc2277b63b494a9ba484c622a66e9eab7932915b367955c84416030a739918ff55665d42502eed393ba01253f0a4fc119b9d2cc7c416bb3f881c97654b68c47d3a8aa53b72112e004a39098865af124155067fd18e02f7f486d7040b754679f101ec1a020fb48f7956cc262063f163c34c0b150902e28ebfd6c1f35d6f969c0332271626876d840cf7b5f2cc89f0831fd71786beb11a01c9ee59cfdbb8edbd2c41b8141987c09e439392f9dd2640d2af9cc84f93173dd3db342b0416efc05fc4c71bae7b7f4250b5c0ef95e2e746e4fae379ca06a3b2874c4ea23a9f5292f67528be4f9cdc572dcbe638716e4b973c9a61b8a089f51c9e95a45bddc5affa13b5ed3c722e3d93980e99e9f6efa1963c069e114dad89d08c6fcbb4683a565a29ff8b02a08ff17c11f65290a0e7a7e885b7def03be1b062d3033b48545dc427cbba98ad6532c6754dfb86a909d6bcf28c36caf1e5b72777f51869843cb098075b8f8ca94ac6fb138eb6ccbf8c4d6f48c20be872f5ae4d547517dcf48bc3306d6be6ed62abbd2ddb66909b20c2ac2d4fc99f9e1fc627909ce58a0c15cc163bce7f4911760275cd41682158992783759bf56a7244f1c3afb598d78d74782a08aef83ecf50098157ca05d1ab753553e6a1f804fb8ee302e9333188c77d0a6f258389304d9d0b806be9c239fa4176addef623f7a05a1455ebaa322640ac1d6610e084b63299a2c368351fb2db8a65e1ed1d1baaf733203d056f0d389f9e0b9f694a8d3904f249fadb1080e4b5bc7da09f6b41a766a67148e50635282abf6f8b8d2605413b137b77431098381f54486a547538657520a1da09144c8d787ca3ab0b177f675b99a1c92ec9c8357eee309faacf527db93e1c90c00db5c11f72628e41737e03dcd17770fc9093656ae6d0c100ee4258995b5bddc846f37b761d0695eede63bf3577470f4af97c3059da936f05366a7eac04da418074980512f91a6261ccd2e1fbe7aae48888f53ec246130a165c4d5847d7324c670b26068c83187428b34e24a6af1da133b390d94a95ba12b2a46d8e232ede5f0a7f0ff839478b3bc21627efbc3a19b5eb0dd1a84966032978c33d8894984909d934b842afb2ed39cc8a12bbb31519a30cfc3a14451388bec72d5fc032800cdd61e0d17e5651a8ee8673711111ccb7f918033cb5d44ab5332c3726dd6392943a22f7ce23d3a058daae56d5785ecd5f189ab74c056d58132716953538de2c79b09afe20ab9e2b778e92c8b269f0938982138cfa7b76e81d2b24bc0d5ad8da17d138485bae2c6f8f6ae23d9a5e8dbbc1d600f8ca8097675d8fc51001bc0a1808fc997ae183e4c90af00b29ffde7cb28284f18f3edd35523ef58635d4e4e862c7c32d0a44c57dd464ce7c12455243f4660f43c4b9b9d7253bdcd691d96dda36dea5617b17fb5e2e3756b38b1d628a0dc6e5961deddf037cfea634b891af7620b823e551bd9dec130d195ff8ea77a57b3f98670f2d9520b5e1f22f1e903232acdebf1702b815ce4f2096cff03f2a3ca93aa8152d0b74e56c70413448578ea647ccd775229a0b7b1f4c4f81e58dc2963432954edc0a06981d3403d2aa4a2d276e0d2d9e15d5d7592fdab4245d48f96898d1d072b09bc2df24a7ca98c90a965c9c1a01e070ee120eed466515dc03371a3372fa0f3f5322112f45f5d538fb42bc5e7df4eab86533f2c429c2e4c64ef431b0a06292cca2bcd4998926365eaebabd21a3872b50bdc5bb60ff5dffc08ec9358ce4ba9c0d1ceba0000bcc3ace9776d592152910ce6a4fbf3031b6e53f452e9c24ba5299652446f9df286830fd380f9c0c5d7b39a5fd2a74be5b3e23b6f48cdc148bdb09695b4748a3797ad75f22dd871ce6ce046bd8fe8267f68449bc3f6c8bd8f3a46a8e147522d979948c88ca791d204bb21f84a0244ec97df9b5a3685611ee6c5f3b4802490f0d9315defea16ac4d2e6c7d984c544505f6c3ef62111d214c1606c0a2b875b63ac709f3d254a1b1491627fd0f0cac73da64ba499a9ce58fb0e7a4b45ad25f4d7227c912591170292e8293a843d23355d1a96cb0ea1e0633b02048d8c5150cdc02c219c26c6bac9c633b58861de61073538c832c3ae1a895b58b9932c9cba4eb51609f0cf3a87d9052091f9f858f6c55c9d6a4c5722bf13e28ee40cd4f3a4e02c7c906f7d6110a8f62b390fc64166f84994f79847b450cb56f12e4ae40ac33aaccc4f48cfdee7c20fb0352a4a0c340872dbfaa703b771f82f4bf2edf82677b6ac81a12d25087facc85bf0e9f23de08e6ebeedf919b08532e1dbcc567ffb44dcb239307d1b823ad1968b06bf6d3afee2a3da4bff08342cf4054d3534e9ddad15445f77b911b0cbd910d9e12b09a7e1bda8aa8f294dc6bbc4000ca7d9c4623318d970e181b638851bcda51aad55f92b77e39c321868ccc41b6886aed5ae1d592fe7fa0837676e091213890dc6e0a34e99eb4bdf4cc7dad872b567b4b9056391f30667467aa3e5ca6489024508182acd9c3625e12709556b527d1c53e448d97fdaab5536ac0a143b8b948d6ad19b142b074ab6d2479be0ef430610f6f806d3757f4d20534bf89dfeefdca6c9b3b7e3e963af7b4d1f0df1e6cd06e23864be060539727526eafdd76719b7caec4f1d1e7b29caef9c2dce0ce448e60c72aaece5b191a1a02c0988551691bc866cd4292862d2238059e45a866a5f2a0c403af1d71d20515dcd18368b8fd06155a6137a9632e54fea00e34212eb68594e2ba59b6e7a6e17fa94a7770f255e2ca5326d6ffc6debb6691baaf326ea0cea5e8f7b18108bc34c031d27d84499a3a5119c4297af765ded9a249c1c36d8a563ba061c1661b3d89403c129c8c03f4931174e438033dea45c099646fbd749da3bfd0a1904e6750656692b2dc71698a77722c2e0983e29579813fb2c306cb003f97415f261f351e529cfa594519c3856ddc0849a7e02c8f01865cdcc487badcb22dbb428cc3cdcfd74a3eafe06d590cfeb7d2de170464006535b8897a28895982e806f2c920778a7dd6245eb4557248b06b509462d5d1102ef81a62eed27f9e392fe918e5207b77caa9750bc9ba58610e604b14913dbde5e3364c0e276be5d45e6c2d5ce9aa20bf482bf8602882517e9dff8a05ac236eaa0c5614362ddc03227a069a65dca5b08a7fc47705d897a6c7e7aed710b96e2d8532c23b82090e21b11465f8dcc6fb71fff6ddb8a2e1df9f6573d6f8ddc208429edce18999c2e887a9b4f10f68af93ac4735dc85de4c448380c9e0b613ced8f51e921bc52460517d31e312a7b2a055a889c42ba46120ad9c3f7232d95ae6c68e2ddcd8b9caec334a7127308761a029afee2c30ddd4650130cbf536295c11ba54f243802b346d7537920bb3781eb8f7079ef455fadf242a884cda536ebe579c90964e7be40aebff8cbc14034291efa7f9c0a401c129640fece9aaf06f2bc0548b408632acf36fb99116cc88ad614d21cd7dc49bfc5b2d98a3caec77f54955cb8a19710b4a97ff8b8dc9baaa8137da4dcbfcdd8d711c87adf718284fc8c01de7d849996f889fa65dcafc66d285ba9f143b66763ee9157b362efbe6e0b0392091bcf786c72cb369178ed859668293a35c64e218162bee101b919aaf92755c67b27d4cbe79ff7a52a122851ad04069ee0f8f994a7d014e4f44681e0acdded0f930646fcbefc99d68e3ce2a317687e5891304b294db31dd3e9afbae80f9b43edff5b988358f52c3b3c5d9f027c21faf7b520b567e988444e8039173987ebf4d1fe7c4c182c361953c308dfe831acf6eccb2ecad911cc22b52687495dac4c7a6c3f0cc403cf2c0bb0a0a307dcde860ca851deede54d0b33986b2ea3bce3494f0d2f71b2dea8335dc253d0b948e939b6dad7a5a12501a1e178bc73c8dfd34edd455e3f7b115e089a096af666c4c8345fc4cb178700b63cd6d6991b2b4ee2d9cfa539ea9f4447084b1644a892c922029226ba990210f1486e228f793d829886709d40f781dff9bedb497f4bbfde5d20e85104cea4ce493121ed1e0292037ab17aae11eae54cfc98e5438974507cf01bbcd4681ce1a104a39ca6c36bab59f00748480b392c33a622d374e1a6f71d715f9a3123083b31d9fc28effe08fbfe9ed4540bcb66b8fcace9305e1658164867690af7e41523e93fc771194c6f0659edc54859a0f82e307768867fa60c307628c4898919d83e3f8c81efc32d024cf453467fc24a71fe578c0d3049ff37d83f5c0e906532a5eccd66b80f6e2e67526665d474c616489bda5153e86db06f6ffc7783aa3cdd12a1eb44d65a8abf0299289bfbc1e592f0a9416de8f92b38177a45e1d0414067b31041bd695b995d6893a37c28d1a15f1e89254818fd3314c489944180f04060eb9a4926ed7d2a880dd47f7ce84e79c906cdee66806ee5c4fb10701cf2319d6740b26a17df49bedd66de0524b672ef6f6dea154f9bc8e3c73fa161bac08fb7d936fb3d06bb5bb6bc1802ecfa1ff962c098602279e7859da9e6aed1c16855303552c73a8a0dfdb2a276059f63814c845b3ab2ae6be04f73db94ab58c7564c971a08c8db0843da233f253884f786e6b49da974019c026116dade295f1306b04ce5ed529707f96b98d08a2e363cad4284168906d480ea74f73607ab6d5b163ad2276507171fab1c740539593b9940fa73444dfd9fc0f4e5856bc5a40bf5f136b76d0458b3a5b577555b973c0d93fe88f2a56ccabbc2be5d51ea8ca5a38a245e7d154fc9f540c506bd32486914c3424892b869e0c11ca326dd40b112cc7e2bfc93beabcd645736450c27b142f99da8e3c40bc9f238254ffc97fcf78dff4874ab8bc7acf5797fa5bcd2ba666c24898ed5170e015199731129027db479b47f9ae5c5dec7b4bd108fc89158cc471e2d8086fc4da4915d8ca336bd417c68749a1b35e252809da7c04102d88177564ee01a83f42928340ce852c028f6b3ccc81e521661d16c12b1f585f608c2ec3c4f47b9568f4f10bc100cbc4fc5fbff391772ebf1b4b9fea67426bb1cb2ab9f4b97cad9793e2dd28c1f605c2024dfb31ffb4e55626b9a9cdb56ea5ce1569a1516a0f017668133f23683999efbb60073f3ebf70ae2e6f1db33e296e7ee752cc220034def98e8f0044dd50f113d0a0cb657520398fdc73e4e22afe2e88e9eb23afa274aceaae5e06d349c373f6e81530eacd60a6c1d8cfe4a3a0724db5c23e8e3f7956d40f6f893b18d31b895facc81c186d06210bc98b073dc80f33cd1b53f61cad62bc307a16865ba4df9a17c3c078357d9a113758ad34facb5c49989b30418c6520cd177610cee3e3970de7d7052d8a27a5de0b2c3f5320d1e1f5ddebdf59d8c9196f8b0c7cfdf9b9cc4c958da0225f91aeef50ee484bf80127a066b268244802d40b53e464fae54e04bee98f983efce33daecd45d106ca84b5b3f999d18c2338d90738a5cfadefc9cacbad85f56ba846da824cdae16bde8213945f482478b392b1cd02f8c6fe5f53a3dba716c090ace20ed3935480627b22caad606669cf3e39e3c3798450d57c131956a0eb009450de600a6c5cb6d3ea8c6165c39ba67b0d55f75364f2751a8f32b3a561acbd61dc62598d9d9a8ca674e960235291e563680d76e48de93db5e0d7fa2eaf00ffde98987fc5eeb509c35f615051d3ed2d6f9689e7ddba12b18eb72b745a558fcff3cca65d1a29563613f31bb8560f5a8787e1f2d2a8b415d88e5c56ab9119023488bfb478f51424197c7a40209ace7ef9938f70bfac4399bb9b167f273cc5013785baeb5abc79c8bde73af71085d7018e7be92a37512e46609e2fce6ec11f33dfd205728ad91ee9273d7c69117ff48c4b273749c1ff3fc5d180ed6c0a8af0413458e87290b2cb30616488bdaaf0ebc73a80c1f4e61e3cbe1627998183fdffd23efdab13f5b14a447246a61c64408559626cce542d16eed8357d7a345f84168f06aa957c403c62cf62ca1eaec6d78aebcbd4a8911e501dbc3869daae2886fb209348efd6f9bdda7639d7379a581dc2247ea195d24132911226d2ff17656b772cedbd0148a89b7be300573b09a27bf5ad82b9de3f1f25118108a232969f9a525b1df313fbd63e0dbebf3170222d57ea2ddf06cb013f9267b1e5c0bb535d7d54572ad06d170a0e58ae7c4d1f0e801a6a4d9e6fa34029df594bc514e277277b45c51c3e57c3cd73235c41938ff4232d3db5c6dbb0236676b0f7b186ef2a85fcec50fc241827a6d5387015eb0afd9ff62b0c5f3438d37dbd335caffe29930068129ed169f96c1d9c5d91013dd6517bdffcfa72618478f61eac23ca64dadb1f287f57a3f742baba305b670b713c17 -MD = e5010c8264bebfb39e73e4b25e8882e7e158e3dfb56b7bad0520079666a4581c543184970a7d9cfbd3906679c076c235 - -Len = 96064 -Msg = fcdba9ab5284e97b6fc8906d2932cf7bdcbc87950ee50a4e530326d66fdb6028bb6f7d84ca1747204bd38d1b31e06cb21289cdb6cd402f3d70eda799598624869be0f8a7a3c594341b4693ed0e52fb524d88bf15124a88d0e413b4f4ba0a9f0163d722fd25b55a1fa5c8abcb06b204c35561649b252a9d6d761c58cfdc8e5902ddfb046c9a102048b202dc9d63250f6cf2bbc42e4d09f67ef0b19812053bd9efcff5a5dd48fd6f19099c2e4b6bd5a5b7ec3ee8b7d40f1c6918797ea57e39a732026c0e3978a5cef9743da9bd67ea4d0b0a93d71f00639698b71d11708faf4b313e094566732fc550b98d56db9e8c90d01562994c1a2eec719444595b7fc54d564a74544e7ec4dc87a1363c8e5ae1f56fd65237286997a75e79975f4f98a53608f05442d7e48c9c04f4dd63bce114044e120cb89a37c74ec52cbd2a3220748eaef65118ebebae8c307a2dd44e7d4b45d694382489cae66910765fc2ee605ddbb22514dd71dd533573facb962d73ae416f237d84df6c1b80a61f253069a086a77b4545995100a21d363e62b13f0e677f828683df83628e1cefefb67b8d281779711e8c55739dc4cedf0c982e6e959b877586f33d5df768c453aebbab403f39dafc778f18bffbe0d0d82d1514a14f75e2b2eb75a65572d1013a23dbc96c2e1351841af9ea1d641fa98769826bc0851a179f7db023531af05a0c17bfdcf83ecf6671cd70d3751ea9e35687873cb280b5aea6034dbb3f39ee5731520fecccb492a12b599cdcaf72a505ac51cb8e61856c302e47f3770115f280129c7202d0db878b1a86270cb3a83b98f08df769b4df67249e0f4b5d81f6255e15bd9024ecfad3aba71bb66c690895238c04b2d593d4cf126024fd78a826af78a37c125d0858a18938e2f402b9dad82ee77ea5dbe6aecc82db4eb0cd5cecb75625a2a0b20c3e17ae37a186d88c652f4269c3788295b385fd77540c66868f658101f7e12de0f45da10a2117f6c8f2c0e67a9ad2d3892c230a9c00bb4a0f58e280a1437ed56cc29cea1b2a4d6257c9b3a282cc5bd4a860cd32b2186281dd8f56db6b4e1eb299f0fc12d084d0261f3231fee922bc8fdb99acfc2165ac14da7ce91bc9e06acd4dc5a4a093f6494a0a75628317619d0c0b1de8f052af3e0aec66c1c722c00a2d718abd1ccb4960d4ffd96db87554a5521e36a896abbec36bfd970967ddb7a5daee886e0fdf45bccee5a77a2569c27d69fe2914779559e13ff455e784648de3ddaa04e00039b2063fa628b3535c72cd599141561a794a408fb9e983a51e0a6e3d8f493a774058e53029a13ec9b72d3c2ac1c59307bd578962349b065273f5eb02849ea5fc5cff02a8565d430fe0bb72e574fcf6c7cb4964c14db29813cb180535704a4918f56e04af15a3ebae41e41892942fa4e109e778b3ec7860718e3962dd3d964d52736e944d4eba5d2d4070d63708a7c8dde1fb6e40f93387f32421aa02d2cada333fc75a8be9ebc214472653deb8a98844ba4bed705c2c3422f69886ac172e1742bf41fd70ce7e42ecbdcf388e8c800c9dfba19e4cfdab90846a669ee4f4092d075ca32605e6bb043c0a332c506c737d700ec329dbc4f7c3a3e95299b151a5430a7eb77c5117e9318c951ad82b40c903465a7935269a5af407dc251f1c164882d48e43a85c4a52f065c84ce327f0cbc5a5478d6a33651a4c36a9a7da2c2b3b12ecf210512e683c6a4d0a90f64c64c1ec183dc5720c0f80f2babaa06fe978c61ada14e620d057f0c7cec4b0b9a385f39f24a4ebf2b97ed40e1b75d8895be630c2275b8dbd4901b62e705c72d33339a80753e4c595409c5ecadf4417ce8b5bc3345a2ecccfa14cd5c7ba3b9fed0469294c2c651c00ab4f654c908e24e680c0c595fbf76cfee02297bb34c9ffae1ffebf953790b7de028133bcb5bac87a42fe7f10921d36f40f6a4232666e59bf8bdeb00afdcb60d54b190e43d732cb32dafb39caa808ef56360c1f53d99376c750f344d5057fdd8d90ff3f097d5df5b54fa13beec41f62cf5bef7647149e1f6f7723c51bd715f7b0d81b0e352fa30daca9d7cca26fcc560588fd8f369ff91a5f07587907fcf376e32c55c2ef766cddbef184350e307792a0c41db147030a2f3e0879aabefb8322d09395a561d8202b942e92bf5c8f86df49183726a2c73b28b5836e9e6b5c2cc31f15c3fdb0df27c0d568e8afb1146205a88a34347073f3cc6b7e1f9d34a8552078bac7130713ea642aa76e50384873cc6425fa24d99099e2090474f141666802818b892f8cfbcfde3bf40ce916b221fc25ee723e04a59733361a55e1bb1ecc31e58ff199671f3ff8af56aac176dbd55c95ef84c91a3a54879bcaaab4ca59e9754acee898c107a3782fd630217e49f5b55a2f190f42d738a5df1b5bb3959d279659515475c23c6127627b86515686ebcf1cb61756a505ab57ab1650264575ee5bb91f1f799145e3cdf14d9599271a1d72848d68e76a4b1563a7c171550166a68d12402fe957aa8f3283544341198bf56639bbf20aba32de927a26a787f2fab7f40ebd6e103bf4cf1dc19979905363d972e4489f06bd416eaccd4dd80540b88958539dc23566aa0a58522320cffe2933602d3d55259a002e79473ced181228848189e8159fff54a7a9e0fa1e4741666af6bba1fead7af784c191fdcf0690d3113759a74e972f7a10d910275d3d45a1e6fd377c81e784afd94b52986417e44096416be155651ea5acb08cb1c3fc31620f3c48d6c61be1af96e03313969533f77d68669e1251f35ce3f5fca03acb2e324d7d97b8b591b87f2148dc784cc6a8812c74f2e66da3d7281d7207fda9f164970886cc29369032a8e44bf4cf6ef468650d2db8c24ea2f190c2ed56cff7b7fa1ba8208e32316177b145b0241ee3659e2b865a60399d976a1c3a2f911e0e651946951385da8e4dae22ae41136f9561705c01c5925442ca6954ee005ff2d543e89f37275a29359a008486c469c96b32067fe534f51a258317c144276854349890aef724b5270e90945d3502d0354d1f891c9a7031932e0a9beaa56e554b13ae38fb3bd13ddd0279933823c3eeb9236f21bc8841efc746a61e577a9bcee05acb090f6cf79b52f79b249ab8cf6b60d56bf5e6176ed7bf53a1c89129777a1af1382b71f35e778ed640700d5cedf02f4c5b2e22afc190823e41c01f1cca0201c13dc5a936ce779a88ae9e1877e725306e87f3f8b800c318f0cf2f89b95c0d9db021ff409f0f467df42dd7447183b16a24366df19af4178a50923c586af444f7a72e02bd95e88a3f01074317b28a3de557b1c494bd6535df45d41013965c4f168faaf6a87f23ece99982091ba2c370aaed411f69891bc41fb9dbd242a45ad5024ede038ac7861382a3e852d8a9f8f3c0d02ca6f967dd6d5293f1ab6efeb77ec4ce124fe9d4daa812067f45d530ef6d2fe6ba83cbbd74d881bb5cc31e0b3af463f58e05500ee652a2ac900b9a9d7187001935db68f4a9acb4186441da33addce7ad994b44dd74ba387c62cbaf5a46e93a4fe3d956754291f194534e2aded6e159dd7c494fa94a87df5e3fae9dcd363ae5720ea21fa7073142166f1197747fa9c06d8029f8da31629c3a6ddceb6009220a69fc614af1c231ae8702b3a85d6edc2444ea10c7d8f1f379f8357c217a864baf1cf53c60bd393c3dcd525be6026c238d4c0528450c52e17d81dfb6c782775adf73435be87235f8f8d1a832d7c94026046c1899f9dc1cd5b0bbb3b466e2a2fa9f562de76a777e0de67b4b60051bb48c908c6a8b6cb116761b8ff99b8501cfd1f9adfa086f36dc2410b4850cf8618efd3a94442524f40a6dc5e5f896ad47c887f460f3e57e1617e57c629c5e36019723096dee8fab0bbe61b7a6f9ca651c54c5985760a71f7ff6f7346ed97f496597a305fdb0f28960fafbf7b8446235e83a33ee7b8975dad9430340c18497b9f35628362dd276445988e38f052184a5134378fdb2b578388dc4b0a642e5cd0c159b58a5e69b4266602fc08674d8593e05373ccee52dd8c00142a770d8434acc322fdb590e557f77dcb63ae5ecb0088727de2967fd3abcfb9e848fa66de83680b1db5a5a8e4654fd35e6fab357f2b909dfffe5d2e0224c6fcc54114ee81ab8b1fc657db14fb6ea82d287a8f89ce7964a96641817782db2a6f478d5723022f8e67a95eb6538ef688d1d61ecbda3d4c4d4b5d36b3caba513287cb982192f481fa793354d7e3038f7a77d3b6c0954046e2fa215854b63d09a7bcedfc04cccd3557daf0b4a0521d8bf565aded3e497bebae1c7f2104b87f86c2950b23912ef0dc1ee36e18b01f218e7251d13c7565449d0748b31b145ff63b4ba6cfa9273803c8c84907db77a8b4098992ca0f06873eed970559c1240b35998b4897e767768a9ddc726a77778d498f93cf04df821dcf5fd5b8ff9db448b2440a10e078b278d9cdd3e5e297304b5673395d1e4848a77a663bfa011b45a6f0bd508655d798ad85cb471a1ca522516f76d2c382b3fa92d483423f0ac438847557f72f548e9a8313389e85851bde4df8ed08a8becce88e4259710e79233d8fb4b65662690838a8167842ce9875b47f875843633eddc2f8583b50ded8a2a527335b06c60fcee37ae41cfc4be34d55949f4b0b899f70fa4f9abb6a26a5dd0fd975b870c0b55d3b7a2098f383d20d21fba527c9924d10ff126e5c157c6d3cfe1500413cf8f63d9134307ef11d012fba334d911603b45851ef679feb569b4cc0684797c3c55eea9527b8315d6ded3f8ec9dcf97954819193150ae9643bbc872751c03e9dcc3beea7c31c4290fcf2c7002df7d35c1b21672341bcdb18925d7663501e88235429a459a4d1354440ae20beee02b146be104392e411e76100da8534e197071d13b4c62b3b6b8bdfef9c072b78a215c1b3dab1528a9e90e5fdc04dfc94ee5db38149ae8cf56fb8ec4038d4d65c3a634592ed2af293b76a1fffbb3b2ad878debf0374d80f61423ec1f901043017503c4ae1c43ae39df0c5676d07d7502acb2c6830a2dd131d87a01960812fd91878135a16fc4bb607df5554ec52ad0d0a49a9779f70184878a46f5b1d45b2320e166afbb8f1e7ea7fd77c70e41816a20598d84586493400113d0f0f85ab35cb36bfa5982e4199e1547dbd43fac4becf9b2d5b5aabba9aea6596019f403e250540d875c80d77cc4b34469a3686d50fd6497b953f6630c757e453e982c37afa80aaf53e03dce119788da685d11ee584668f08086c5c4843e91bfb196285fe40cde39a70c40329ec09cf22229c3962b6f0da573759e46d8b1e8b0023b71e14723d693cb08116cece6f775dd3004cd901f5b9fda490951d2758afe7aae8e27a196fda507fd38e2c3b2a249e2995ffb51fe5bc4fd298e4d38337f935f180797b90c5858a3133dfeeacca458798d598834b514fd233eb6a2d392d055f9a0659b592ef192e671a9272bdb0588e9347cdd02ec8e3395b008b86b3b842e926f2f9a47a4cf3c1a4004c44c87cdc37cb54f60824ad24c9ca60df8c8d5a30570acedfc4c15fa3f85a7d43f167a05f078395a7a7e78e7327e484bc8b10936c1dc802828302a7b816fcfa3ff5159b5f726e72693bc1ed5cb83bf4c91ef7f434c1e136688bb8a59ec22dff86cc5cfe3c0cee83a1406e3a501f53398bc4bded58d7e8c3283b5dd9c67e5005cee39829932b8631e63226f5eba1acbb5af8acff16c44131181e5cd4dd9ff5a56ed771ade372b815bead86b08e03cb02dd477f9a1d1b7d28dea1400722cb9146ed14540bbb6716a7810f27fac5aa10a8892d905eca420ee2d270a1e16475b572c026c9c3698d045fd3c3652511091004c50779adbcdc792799e8fd03e122d4a19e9b4d55ac3913a73d86e8dffea56ba03781a617435f4e4fab86bbef4757616bcece4932c20fb73614b60d7bed0376134718a01c1c2ef0c37dd658f3f5880e29d74c680b69758154ffdd5d997aa7b1d68a38f23ca5dff33b97647eb28a391d745ea2042ff11ee4bc556943b91606b152676f16f96ef6e8106e9d77cb53ef21d3bb4bb810f74073b4cbe67a4b5da4f72f652778c2d5e821da8a0dee7f011ebdb073c5fe6efaae90d6b9d14bc0a016f5b609feb2397948430270123d7e105c33932e8d318a699dceaab5b642c98bb12f9edc513dbdc77bbe1097670f28f00c4604322e1c03c2b2afa93601f9c67f18174242cb75d05f17159d8668be002eb3478c2514f86ba461964ab140db3808c05f38e3ca1511ae9ecbf1b393d4a42af5ca838dce61127d4f3517be0f51aea72e49eb15e985d2146763c5b564ed8583284192c2d6e0a8bbcfee88c2aa179ad8d669e17f8632c24f255f81f2786314b5ef4f326abaf18eee68352655bd777d2c3d51b4874cb642ad4d11aef13adfe231af35daebe71e4593ac9b68edc60bc5ffe773ccb3898ae3cd434cb53828ae6e84dca7f4dce7b16d3a01a3d901404f15f25962a27ae92b161dac432d4dce692a3e1c2828a4396556500bc0ef26a8abed720780de73c8016a1cecb78f98a89a95cbd218eee868a491642f8533c48bccad1d7650c904c2c8404988fc44bf23bd419c92fca00fd1f9bee4e1631f71560be5432a74fac455ca49321593f517dc4bbe4ed365f48111cf3f50c5ed2aa383f41691985ffc28fd91e554f70109393eb05c4117c754e2a4bf83465185edd1b21fc177446445b926b99530b1e61999d795bc21d4a329bb17253b23f8bfc1825ce96662b3345feb5d9bd933ea957ec013764e4f9e8c1b60c5aac778400d5e4be0db85e26942b3363ed331fce5a1c1329eac9348e9e4827a5cba98c1abf11c84ea70a084db11d83016da3ffa579d8967b5d31bac2b4f077e38df5f8eb10d74d3d65336b89d14474f822b439a94eb2fe6157457d7e71e02d2d6736c3dd3b4ff9f40ddc8fc03dc890b0d40fd7c420d3d1429fad85ab1f41d1ed2215f6da87a357d967ac7ddb3ed05f914b5ce0dd39639a86fe10da2f043aeb8a863998c93ef8ec553d4c3cc31a8468044e425ddbdf89de943c1685f468f4046c5b4bb191a67942d15563d45e190d336fa76955a85b6d27d621688de09596a3fb69f24a1c074be0b3789a4e968593483b1c7ad02bf538fcb374aefaddd249519f78d76951ab994e646e99b152a43d30d1761dd74cf412e693ff8fd4d2663595c04fa11918d989154dff07057ac03472977cf970f3a2226cde88b424a69a81f7c6b7f95f59d843bcd5f38d53f51fa096f7f8b7a608459116fdd8c5f243b656ff19788745fcf1f0cb6311d2a2ad09a82458b0fe7e7326866c56b769449002db36215af2d2ea6cb8ca61227ffa89c874a5226e77021c8d2af752ed482475c539234625e30e0991c24236ee3b6371a32da1bcf8ca39ecc1a53e59410b99da49974ff1a0010242a737bb4a3dafe64de1fb9e90169e2bc90c1ec9d47c5aaba7d41e408894f5b57ef83ebb05d7828a05cb052605929be19cb4bd212966dc63c4aff58075c9662fa3ca00cccf845d5882a974c083336a624e02accdc2c73ac81a2246971e07fd799a66a575100be856aac36ff572c0b3b6c53e105505671ce38f74360bed16629a4c14543f3035ca8e66601f4b3b021de6ebb014425c0e28ba0cefef6648bd3c9aa01c35b097caac089fc9ac4c44c151f9a7a0dd1b2e8309587ad9992f99c533827dc57152ad9235cb3b473d80f6c4f7f7e0559668e38f65c2bf7b5bef47f7f059cd5830addb540edf2420fa6eb9d5b6e9801865b2e3fae502c51d5e2dba191b27771d994787dade4c409c0c9ef6ba36d66e31727f958c301e7207ca715af35cf5635cd5aa1bea4e1a79059b98133c20c692e8e65a630cef21b080c6448f4f59ca795d0b5efd4d0652b5a1cee57a231cc1d484e9c8b444c91066d17a2cc1f3bdaea16764e997cbadfcdebace0c9137d1d01c4fa253f1fa67f57c430fb358a82ea9c3c408d54f2beb1edb96c395c240e8fa528f3a8280f770d7d91cad61bc3654c4c7ba1eaa8f376ac2947dd409740508485e8dd9ddca038dbf67a47bbd5565d9069592cfeebeb5cfeff1b929ee0e4fdac02891a5ed37e566b40d25a24f8cfd62781594422b436ec5aeda91ebcffae6066d99e3c9393067a2beb3e54a9fc7c59a203007a0e8882af206374c42319f92335497ca6b4a1b4fe9e5412d99366f862608cc3510aef4b0fefff033559e651b097f0b90b4a66166e532a045ba9bed08b138d264bb04efca92a1ed8e4d9db44832f5de7bcbd76b743cacb675d356a713e1b62bddc872e13e56f517a551b7f4e253bef6d4d865a041965c6c050df0076f5e8cbde8608032d5f10254bf8a728db117e33de205d667949c48ab3c8ff074e3d1c272ccabb74b570cd08d252059e87d236b9aef78b42a37f57a596482de5639e25e31d3d09e928c4e68ab203af16b0e225ef441598650f04afa5fc30d431437386ae143f8be703c60d194f600c47f2cbac43521d1d5418843cea6a159a518a67ced6c654a9d4e2ee91332ef9b598d9e93a644d7082864c7870015488d8fc94d55f0b981efc5922b92376b553338fb2d560b09ab25072374bf9893ffd2868ff66c7ab0df0ebea6fb0344296eefea32a1abfc6ce550fae559929c0a0d5014d267689339c6d00ef066e3425384f8f69bc2398055ccb38a133ca91661bb2ec0fa69f3433c805d3fda34da3ad1dd76e49d57a99faca9733e13e6ab0d805195126fc4b293a153dcd9ca2c92338bc1903d9f2aa26159c4bb9f4e1f418a4f17ac939a404f8a508875622a17b035687a6e870b01cdcf4465b1342cae1394b5549ccae1a572313266526461bddf48534f394d48a5d2f056d47d85165dc8339d528c40adbac28e2d379866d7e6c57531871914bede58cd7558481a72f2096fec57a57b6748e8ac2a4172f1f45a0ac3eb6b3566d573076c8a3b3a7ca9367d518bac0e0575178b9012ce068c20e0573b6943b6caf52e89d77ec37a3224f1cde06299f06641ef5444cb247cbfc34254e39357c3c986d58316373931c44aeba025596573243198ebcf3f8bfd124546a8c551ee85eaf031a02f9fe586bb82eb9f26595abec9afd9f739544db10e0eb5fbe98c5124b59b0a852c9d0ea29d36bb72ed48befadd227c218af4b1bf3a8656f7552ac9c7b2f028dd1418fdacf5cd21c08210da4ee6f24710cb06fe4f1e16f34213159c966a55524ef0fafbcd48afe631eb97f6e36e86036c04727d8b432452842b3312ba64335280c72a4e2d2043d26e32c75ae1fc4878df3b207699301a3c66a36e755b28f3ee1da1903ef304f3ac1f5f864d6f199f6d0f7af830a16d5e798f85ad0ba03ffbefca871415487d273eec78be18b54bf3aba4c8e1f5cc835ad1a9d9d81eb230b51c317f9e195312454e7b875604dc1dadfb472ec60b41f9740c59a5d6f4b983873ffa9416943d4bb6a5779336570c143323a0b28cbb295716f149f391d5dcc1db1ecdcb64cc2db0e20b86a546596cbaeeeb565f1c4dac26a74a21caf00b43711883502e700a4cca314750c46e542596461d123a5e09f1ed8fdd8833dbdd171ba6342ec42295c1200c237ef8968e5e30a47f7b4d3a372134357327343a928047edf90d9563b7b53ad965b849a65040116edb3a9f991e638403d3a6d8f573a57e559c96aa19b650a101d6a5c086e2f3c00ef7f6386107e06360c7ac24f5c8af4746e3700a2edbb9dced3eee641e8c9ec5ea9b58217c3ac05cb415e12220d9c52b289843bd886e197304653b3e56966aa96c910761d0ff2af46886efd95fed10b16381b9cc11b797efad12335417477ef3faa0ac00479e46b5e2e27b519b4db8615f67783eaffd5cd7520f7eb047e9032bfe8fef07c85e3d268bf13093ba42e4c38411281b4c8a90b35a22c55ad0c220dadf27777d3a8937cfcb7ab3a6a612bc603b49726ccfa4590c2d14b058981bfe870530ed6a87655b390b47af92450569bfead5fe382094e26833ace6b4893bc4bad872f8d6963bd2ebb11eca6081651368fb7e738727a25152d4b410768a6c9bfbc0b441ca4f52c46d27c8ac174078e1e4d40c7961cc15cf4f78f2d5a482f4abd325c0704d9af45848d30dfebf6c88fcbadf47bacff73783e98730de485b1c1bc96f5c2c685f67b6031fb46861ecdb8c7282f7dbd8904e96a76934d269fc2c146606511d2286f4072672879103a8b9b89527e387857fa32f1186c65a104d6cbd305266ec83f7e3733a334c22b0886ca8aa35d464ddac7e77b046b01e4436233fb1bc6541939b7c21c6ccccc26d743b853914921ae8ff26960b12b9c50d9f9bc171aa14c35b58073a52a4cf1a44546d77ca2be552ae61e5b3ab50a8f873701a6cf7853d1be217cbe566231dd23c104ba5e6e495b438b801f6166a465e7f91e967cbb6a6f130c1114b8bb17d915d901d3814a669e78deec388d6c65ba038ea50db75a318ec4e3c219348b6b8ffb0bd2b57ddda2a94b5e9739173ceaf65a76496f07db65ab4437243e6269a96c53c7dbc2bc8e6a062b993593873e80956d2e505cd6c5636f21749bf6cacc5df8b0ab919dc5d3393faa0d2bda6607e321ac356e39bcaea724ed3abdc4c62a05bf8205a8b912429cb037290e603c1f7f35a82a079811ddcd76f7e7fe3afd091d2b588465872a6300f2637b41d761fbb12be15a90fa8ef932dfe20ad1cbc7f010b6a4a67c8a86ab1290bf826aa27013257ed865bed38c7773ca2c21ccf9cf659cfbe6ca3255bf812df59bdced53fefc48c90dd9d5a582ef0cb046ab64476bdffe659f8e4b5b2d9bdfab88c94e6e671d9774e2056a030ab66a4cb2362c3735d5d18e4f511c2d6941842d26f60244310d9e2d0597005e9c6418da0f20893bb5dd92d076c1292efb18d7e4c6d1ad87f532c93be8fd2d2ab07e94f2be191fd7545ddec6964cf6d24b98378d18eaa4ac1c33a52bfcb644e9df7c7b213f7e349ca9ed01eb3e52f9d9d3362f607dbf8c232e66be97b140ec3e81d417d013ce7bfe1ee1a8b8cf81d6983a791c1965bec88fa47281e9b72b877b301c07a9cb985a6e3c023fb9da37e18fe9d7aa127176fe3406bd7bbc7ed4ab3272cad6f8d75a648f79952368ef03bf3359e845d6215671d2cdce286a68eacbf6c256e257b7830eb4603110306e73c42513117bfee5fbe7ce821af48e15cc7e3a9746d640fcb0dd8f785c82cad8f694d79df9b8d74fd5a4999c2a8c81f5f816707a210f3f175235733a8dd772cf0aa5bd62f78909bf525cb6a4733d009a0c392ad36c19cc87e5caf22f2b9ad2b12e8b590a917900c51054c8139ba26472676aec3b8e7253cef9e2aebedc49651fe09a4ced5de556e19e4120620a49380fa800173b1e957f7cfd30eb72166f947bbf76eb83c36a66a53a966228259df5c22cbd4e3a831fa9e26e2a4ad15089fb551985b7765884ca8093c90fce941d285a83d6e3b2526d6dcfdb334f651105141c9d6b533d83a10cf4285d8bedcc434a093c019a4b030b2565b2e06b95de8d5962a98c2131eb6b887076b868de44acc58ec3b1b46d2b758b7483b611fc2f6f35a7cc5cc40be620c7a5fd9e194883b6352ba95bd4812238ea5ccc28f5007a47536c74719e240a8d64e52b432f850ffc13905b847d2f9dd1dc8f0abd673b45921d11405f1202defdcabe8e5c1e4c4feaeb3d68b010e0e4bcdcabbde7fb0517cc1d46ae79e220c9ee73a2a54d67e6da0f26834f63222d9d665503643d13067771be6d2d56711651fbfa21fe9b9eed24e540227e12436e2e6af0567c3161b7db1f8b053b79315c1d92c8ccf8db15d7b6e9e26b7341d73b2e4718e584494991c921fd9f5756b55a634f6a0432608f3f16a967eedd76600d036749611af95d0cb825a0ac0f837fa9f98e485829d04d7bba805b2d0b34706c44680c398ed5feb12e96febbd263f2b316dc0e494dbee326192b26a68ae07ad177b5dbdf7e53a10792f2723f3e8ca11e61b506482c70e2b6c8e674dbeb1f01c503cd22d367e706889bc4a5b6b2721d3450a5dae5348abeb6306ea03d9a5487cf7f3a8bb5ba2481ac9f9a03a2bc98d9bd6a3ae690f480e99ce610435c27058f49407a70e7038094ec24cf0693db7548e224c0d3ebfae805e36077d8b7ffc68adb0e097cf7c27fc2efa1e048fa8dabed6b06e40d56a62476221601dac1a2fc0cfd2e640a5885969dffbd8a2557519159b087210d5184babcc1ad4ac419af3a78183816a399bb5988c4de09363ab5b9f04b3be45e7d153f6c4a6cbf1f1082f67eb4a19dc33bd23d05b76a09f60528aa63a38bca7b29e616e744fadb5656bcb4636af165f3af68b5a74007e8df5738d70651fd3fddf865e5d029ce2c044cbae8d8a3ae0bbf64fd57e0073e427c9154c45abf16a11159230099615d2da3731c2830e74dfb810cfea84275539338540af6f3735eba9fdc9c0bb5943e5cbe6a3ee72ebe47b1d307fb0b41030e57ad0fc9e352f73bd8e3e33f6ba72ad845af82c1aa048131db4fd651056e48b50c4535201debc34488881d8ba500adc155116d12e564e872b43208bf2b1caefe2d9b549c0b305fef45f6ec1f5c349560276e79c13dc25ca0f9340f93f0eebe303809feac3fc335c29daacf58d5c56a5b1921494af7af4642f6c06b6ddb56fef1b83b93cf2016dd34fc2e47c6c635a508c6c44c1eb78e3dbf5961acab6ee7d9b92a8aa473609dcedcedfbd5f78207ce0f9ce202cb01d1cb9c8d8233db1013d70d0b81b13755da7310ef9e0a59bdae5dc627e4fdce4b3c4850ffbca17b535d8f53d7ab3a99946f82778d8f456bcdbbccc2e457ad9708006c834c8b661acd476b341b81b10880af4587243a27bc3692a39c5eb492c3dcd08099e048f237d243e304538fa502cf1c54b6504921a97cd57aa8f3863dc32e1f2d0b57aff63106e59f6afc3f9726b459388bae16b3e224f6aa7f4f471f13606eda6e1f1ac2b4df9ef8de921c07c2f4c8598d7a3d6ec4b368cb85ce61a74338221118a303e821c0f277b591af6795f50c40226127a2efacce4662fd7076c109eb59b18005e7165f6294a6976436ee397774e0df5000b17579b38d58fe0e1b5a2d1ccf329b4fe10f71e8180fc5165a369c705f6150f8c8b20d8b7b6d64cdc0ad69f2b8373e734055a2ea90575c5658610dcae483b50b73c6fc4693a74f363f681444031a6a0182c67804962aa4a7776d3ddd16b2d6a96138c87d8ca307e8164edeb93638986b46d663de9fe6086a25bf9f3f7c7b40631f8be488cccd3953b3960baad82e5420fb19e8c12416221ee1bcb45a7c497cc8ed44e2f0caa25df9b5e23d915f7827b31de58964a9377c4639f91fc69caa063b78d8465e0caee05a8bb7e71532928da23dedc821c5c66170acf933fc5419574b40da8129096f6ae6a38b8aaf07f9f06ec9772790d04f8c1ea93183744913fa68b3a025da4740583eabe1bab7363aea894f362a3a7f3f56b0bd46a0b6d2266a246feda6fa5cee22c2f33ed9d643c1f6824d9f327719225bc7678cfe4c85cd210ed4077701b0b5650418177a74c71b8eda3306e2ef3474f5d326990eadea84a9686e822878c932997298e01f2b16c42e019e21bdfb67b3df5478df444366c97df1bdd23dc82ce23abee44d3a61e9484e88ed642634197b52dbece451b59118191b309c29884240b31988934ea185148ae0bf42be11c0180ad9e13c996cd00d055575347e31bfdabd430476ee6290b54da97241e82d023661cef43cade1ca04cd20ea3f9e4cdc1c93abd65c7c3d82a71133b4e626ee4642e22ba488e1acd58bdb1e0e121c425d82e0b47cb88a9ad166701fe5a40cce02ba26806095e736992ea99d5f507aaa8aaa2f0d761f8bf3138fe4de83000c44de28896db6e811177b59c33f6c8f3bfe09fed90730f612eebf6fe9f01b9ea80b2f0a954415f411b7f299b274a402d2b5420d69526bd091d64b92e9e52db452597bdcd4841c4e4ba0a55af1cd946fc158c9326a4f55339b522ea57f3e27f5bde84b1bb1de285b3159fa3a0baacc3aaa51162a568eab9391eafef4146b98e72d102343d792d8bf655c67a35aaca9d7d056af31b860cd7517f9332b43ee0eed32698ae190528bcf5a1074237943bbebe5a1fb050a96395c900541978835e89c606cf871868dd01f722eb646f1f080cb4cfb9000c77f8dce8cb7c0e54be3b4592992e27024a544346fff946a2f43871a989bf4a1698d292f80593781297800c81063df69f5594682861ba519bbbd3d4e3b3b9f837b5f9a13fd91fbf78b534c5d976845db72fa559e670b4ed211be21cab732f71377676ef066daa4a4fc15f58e3108cc211808fffc7537183fbbc6c3349f1aa1dde82506694e9bb835e6209ace7fddc8e76f15a4115337979f24779000557b264f3828fed3376dbd16f413bab2d64fc2aae290f0616375239ce64126b27cacdae401d3c6b293c909c4805fd3cfc6e75fc81d1b6381488862957ba3d5cf67485638bfc5ecabf62654db25755479e42ce6eb79155be554d9db354f204bbbb7d61eb9dc6fdf13d10df4a75df4db5590a8fe71710f68022af1d3e8fb36f70bf0de9ae3e2421c8eb7088fc5944ec6c76eb41cf6af7a066c2d69031cea68564474aa61535bed33710a7e7cb262f3a553c0f6b8d78ed5c587fe97df6da734e7d9e5f1f864c3b1a26f6e08420a3474058f59e958b099b313e9f116df47bc1d2a40b72dc6a4944ff7de341e8619935055ee7bf4730e5a927006b75e79378381ac2d5ac662af580892420f29af8d1a0914d5c9b0ae4d3be46862b3e733b9b812dbd4534442c1898c003f51c224b1031ed0f9a5a650f9d8297b827939954aa44137fa333feda7a33ac03a9e709c42190208ae923e119099f217fa69de2466e28d5ee37d01d9be2fa560a867ad6c9cb6432a8931e046be0baecc1f283d57aafd67af4483428d61a94c501d2fe11c4d5552c4fdf75596be97e0168516efb5635f60a781f86a7f5e8ab01d1d69a431c080d1569144d6582ee90675a0c86da43c72f8e6105ef235f15e41360da77f3392c31f5dd7bd1b218b59b26816af2fcaa2f290c994097237c69e9029826bca983096cd5935c26c796084547c3b5dbe9f1338d8f0718a52fb4ab62d6600192ed626663bc73ff772c62ad36d10a336827829c031c93d741cf6fa5f6989fb521483e0cc1b265abea6ae66c17cc3d2ec240c33132bd25c3958c151d4e4f3f8890417fc42cbf51a9a708890f904144ec10bc1ebcc379a526c6ed0edc120327c308618d544cec1f42d78eb25c483707b67b21fa035d59fb46ff7bc2aae9bc3fadb02ed084cb40b7bba284cb1de8b66dd32bf9bed0a963106c66bc9a4e7b836f90b132b11e4ec4015f2f733b1817c6608d47cbd4e94fa1cadf233afc92715f9fb232f596e8807ee675a7e36a167e70c82af820a316f61b12e95f7d513c7359b75d5cfee8ac06784c44315ac0dec5bb8bf3657f932146d8d1d0420b021528789fd757d510308bba1d15f662a53a93b09230b7700cd0e9e0edddf36e75e539c440684a02743db54a3f301e8281f09055c529157b76ed843b50589b2e14744d45805a5d0d7e9a2c329cddd043bcc965b40c25a829393ec2f2e08961d146890d0448f3ba7f9511997a1a64342bbe8dbad5506e9701bd8c480b87b76ee172ee2108817d86e02068a428a30c73c4ef0436be774a0b8c6b9ec1912b2ce9e602693059113eecb68968f4461e1fb596b8f582796b022c50a93ed389b62efb665dc3e200e27f128b37d932db72e321277f2a460e12dd21d7e03226fd0f06ccebebc4e104da8720e6928305f089a1e002ad692983562513a9794363f41efc83fc1433d26de3a03f50022d168c4aa019acab7bd3e21e20294cda393277cb57492240d96044e4109750efa10db79d2af5aee028ed3351188c4a6ddc3a8dfe6145e3d77f3190c4204f6ec1a591796a859c91b3371f7cd953632b99f4243e9f60a0ca41ebed596d188f32e0024adb99fa35dd8e7210c79d1ad775c5489792969d815ce6e63da7c6408125b580e1e413d1e918d89f691b85b410b25ba13c92cb6011232f37c983b7df4acea6e6fe9dbe52dfccf887d181796b3569c2c7bb4527f177a682a838f4283f15b51cfe480c83c5408058f2f1ff61856f236282bbb49097dc6d48ff320301a60863808e683b4b7133bd5fa871a0254be567a39ae4e5ef9b6801ea0561b72a5d4b5f385f0532fc9fe10a7570f869ae05c0bdedd6e0e22d4542e9ce826a188cac0731ae39c8f87f9771ef02132e64e2fb27ada8ff54b330dd93ad5e3ef82e0dda646248e35994bda10cf46e5abc98aa7443c03cddeb5ee2ab82d60100b1029631897970275f119d05daa2220a4a0defba3b7d11384bed2af738eb1e913d9b10f79ffe8dcb8374060a028084ee7fcc9713386d8fd81c67ef08dd741fba45016175cd7a06986cc7e2f9ad17fdcd04dc8bc862161f8507d51b2798f96b41713d73f33c744556c212181a02edf66e8045b420e0022706b33e959c91036aee68562cb91374b1cd2f5b90b52a8cd59a9c10f965dbb91124caaa45aff119848bd354760e7b02b2c459ac32124c7c0319004441dd7ac143a7f12213a8e0c421de5940383c9ca7b005e80ce6799143e9b353e976d2e6a42757d2ace7ce858ba9b1a3215a899dea135685849431216bee303e087f8a46ea23fb1553a96a09f684ca58ffc33ea7544480d81a2483237c795768a7444ec319a15d621c41c4938d1af121e25da2e16ca94b88d87eb7bffcf4f17ad1ad6585bb08435f1197244cd9d4f0a6d30fff74baab7e3ec68a151f75c6c61b8ba219b357c076b73994d25c61188e8ed9c19b87c6b2e3a1eb31e4686e579ef4df0bb0767631be109c1e15eaad4f9282fd5bc0431927405a4f596ec5700f41acd4d073f59fc3e213431e371e46e2c52946c6b4d03a705e10faebf95c025677ec72d9aa595adeac67357d7e21b337ef2cbce8bf55b1f7056cf5d0ce55ac94 -MD = df387001cbe2401386ad011b2bb2fdb48b156c3026e6548f7140838ab2383f88bdd44d4bc50fb52406cd9fe8ff7731f3 - -Len = 96856 -Msg = 7d55c926d1bab1666c1945d4decf3edb36c2b9b122f47f895758890b33e4c401a1e711533e9d9035ba001e9f80e21cfd99397329cdbad4960ca945ce0defd91e356dbe8fba907d1908257e14646fcbefcf7715242da4fc6ba68b8b2f4d08023eff8ed9c48ebb017a1f306d1bd19fd118a025aa8c88db7e72eda865163a59c8c9c9f369d90347a3c0c8c8f49c119ab8dfd3eb37482786e212a9a5da6b1d07b227594376b65f5cec53c995197f6a8707ae3270c64052ceb1b2a12df2163e3d49c077270943ea21639cea41e6ac258e47ec835d5e5c51db72bc9ee6b6ffe52113fded472868eebf9001f571630b89d9ff008f5908846bd4ad9768782d0e5adb9a44824ade0db15efbebb0cf9785e08db7541e0dcba0e9e1ebabc78c602ce49466fefdd9301a7c242dc3e5038a0070d5f84ff821af98132cb26083ca553fcd74fd94279b2877973cadef5ab5446583d74859e43cbc5431da8d1e63d916305ba2e96cc839cd0c4acc03d9d88cce9d5fbb32daab06fbbc8b16014d3062abe8d747b2f0a85a27c1ddfdb8e726302f8f4caa3b3a152973b969069855b20c1a4e898ade878ea73f7f97f653830e4a6f2294ccede2ea4a2c3112d2d99eb1806d49b894f79843c71c2cc2e05c14568297407e48cf38f2142f0ecfa34c90f565acc3ad8c858d9063c6b2a4e25b02c77fadd0514669a5f52c8336e8a17a944564dda3b19b0ecd3b2346f78525d9b429eabcb956f04492ba3d3093a5f3ea106b250ad10ae91cc00caea3e5afd05e94446ac9e5d56ce7650aed3f0b4dc2246e2d4f3a34009d36cecdade563690c7009dfa8de3b15e2da88ade4b7882a35b114548a76b6dde0e55f44c71558fa01997bc44b02a3607ba6616bcba0f18275186ca880c53ee7d9afdb3aa53aaeabd66052b9fc3e05fc5ed25a0c4a032e9ea9e1dcf0d62fb568b11faa78ef5c4cc4b44df78763994932b5e6d95708e726c6fa95cef637bc01a68fba34c34c831a8dc2e9d0f6271b584aa56b4815ae54c34290bba98049750bea9c0ae2e664b8004d29bb46cdf1cc188c58e80e0ee352ec5992dbd557b461bb7bff961aa7e002e64e104cc2d668b57240f6e5930a50ea8954287eba432188faa3e1e645d0686ab4d6a022aad735dd4eada6ea3fd19d23837b7c2bc00b38f3aea86a83cc27a3f7522e00c76799ff4c951c91807a2a7106c016b36a4f79a0a9c0d3c1f415753ab1a89e5ac362e46f0b2dd5df2eacdf7499296df8c3cf5302b2196c0fc18a81d4a09f6dd39c027f2d210020b77d3db64fe6a6c871bfa86205179fbb7b7392151acd1de595dcae34e096f54541f49578aaf5206e46e5426e52df3c072e9194f7b43f0b4cc80ad0c93073f38ba71b1ced2ccc7da8a0bd053f9012d79a50a3faf049fe52eb93afcf07c7bfe43c0e7a3bdc7e75a7bea7d05a9c68b958ba08312bc88113d80a1f5213b64a82af9ea09a580e48f884f882a5a74e82dba6b07ec48f47068587f1947b049e64c43cfa8502dd4c315bfe9d5ac5551e8580abc4dbe38e357d5c46e719b30a86bb8e7397e53a305ce1a8fcf756b6cdd11ab04e3d4717905991a1fc35d6808d38f7e73cbfe7cbbb0601e7654c9f027632e8747765e9e7fd7ce85b9324f46df57ac1d87fb8b33ce414391e23e55c30b70898d30e82eadb3d662a92f2fa9bffaa15c16824cb7215154c30571d0ab6c9fa1ad1d6fcdd717bb8df004e01fff2c014d19e9f13404cdfb5788f993b03d554a6313c8427bea750d7af1298a87d22379b750085345f68202c5efded6517e059231580e5786cb4e1009d0777cfba52eca8cb91236f6fef63e1c72359838fff61d88e4601d731bfb69c7387f45effab68a199f680adba082d3e7aa8e87db35cf32f6436e12d53f05814f73c163d945532f0a8daa4d486dc08aa41369f3bcb1c978f5ef78c601b704ecef2cbe555c177d2fbc0e398ce1c937b8de27288a61f6ad56046320a5ad16720342bdf698cce3ad12ca8b96381c4540f502606aaa4f76c360be28e6401bdfd57ad6c1eabcb02c5b6ea2a050dd7c6474a59d59a0d1e9a4a41f6fbb4a13f27587aa07b30b2fba741099c0c6f9fb76995b711b7d5bafd512d7f8a584bc9fb56a3117721be860203d553ac179e2008f666dbe09360b827643d762fc3fce51d9304a599267030ca5eaa1a81133b98b4b5e1402f33e20f861ba1b04e026ffb8c26a3bd6e52edb73902e7e983c8ed10a2ee2f6d645d04c801bd82b54dde4b163257a9e15e6dde233936b5451afe5d8ebae977eae9da6eea7f94070b961f393bf66e3e99d13eea7db1413cb8ae7c331de4ede2402472c77deae6593c8f8de074c0b2896e2f8ebacc886ca3c9a70b16c2084498f67fecb88a29fc9fd0a2efe9c8786cb3e7e025f518a8ff13016d73ae870e34c0946012e817241e024d360ffb4007e4e38d4ccb4469f842b3e6687ca473de0683a231aa002fc394aa3db2b3bfe2536242e6dc484fc8607cac0201eda08e610208a9597da7d7eea5be2780a4dcb8452ef87cf663bd3cc8f725dd9e9049e17d6f7831405386198d9a669407aafbcac58f2cd704e537ce18f947fda92b48731b97fac04ef444fc88bbcc0baf8cc41ebccf077d6c97648538cb39ec8887444d24c0b7e0eb278a88c7501514e014debe1034b0f8983eed6911b52432a56ce6757e33d6187fb500c632a16c370208f2b2ab074fd0eea5798289fe305566a2d6f5133880f072674dbdb2f6f7fd7d31a700738f0e8bd893b1d989f084df35f0bbd5c916ddf12c031a762d96deedba57a6b2521613b3bccf3c75fad14958791f3e1b8a1714a216510ef78cca4a901f4297d02fe286cf0422c45ec2eaa64699f706d13d814e8c961bd24ab8da636c15b92060f13c90681754ee9dcb83c433ff40bcfeca9db23515270d77980e500b0586ec6c826c59055d2d6439fbe4cba612c207ab18b36927fc3e688413ad3af5556fa1fbc9ba082e3e75ce3a3c54e2283a4590df110b9aeab1288b7b130148b06f3de816ae6ec56c22f3d3a9751d3140df90fea29cec6e049ead1d637f50a3c6b9b868c419cfba4571701c8d8e85e176696cfafca1a00dff2995c7453ee372bf9da7ca0df2260c4393b451ee6ed51a5241a12cf6096d9e63bca730283a02de2181d3b5f921bbe6eef18719d4ff54035dcdf73b97ba9c49b6beac00145af50f76cf05d2918fd66ecdf1b11c48284cc51e7636d0e89d743882976de11286032c45ee03c9dc22bfcc68fcf90351d103871da42592ef9a3f904eaeaf7928a6755d17469541e2c3bd29477b2876f8e2c272e3c08d2ab69a437ca36d3d7061a393cc733f85e2ac5b1aadf3d4061c4444d1aef730363f4583ca22083bde6fc263a59ee1419a5541d01c7ff3715b9e3ddd7862e15ee87aa23f1aaa0580591e55cff3fee9b49b42aa0c0cc8cfb8efa3eb96ffb72ab06b83d7b47b3d22a5772421cfc51214005150edf532af10138ad45758add459908601eccc3703e810002a2e4c6202e98d84281475d55d3de9f3d98809cce1f665039ce76d9523de2abcd7852c13f7f1c4fb7226733ef9dea1f3598692a2088a97a8fdd281dcc58d5b72d42d592019b20b80d52cd6b6ac7ba552fd5adc786f9c8e3eccb4ef55137b0cecc82eb9d18fb6cbd9f92d88839e9d5cd86c0bce953eb4b18cb0969f483232a3f05c91366d82856dcf873170edf6cb2e4c4ea14f439e5a6a5c527f79fc4d3a8a47385db73e19a5572a2741763edd8e83784d2549c8b71721745a7765bb8a1927b9039a238a7da0f3b2806382bc7a6dc3220f9ea36db0723c9d6f874bcb1159e40d6550649ad5fea82f3ba17cb1f6f056133c14457ab1f4249f39b513750b81280d088861b64a45dd68ff034c63789fa5137d8f1737e4234142620ba501a01a5a7f914a022604fffc267590db1b290316ea7a1800eb6f8afb4e8f91e9b7f7abe42cab9c2f312ab36c3145500f2030a3125fdab6ebe07aaebb8a6a4ec8df39bc2ddcfc88d020e4ea9551164bd1bcb607023b4572bd5c2e19e7bf9b4a28c08dd69d562c15cd3b5c2bdf4e908a0a35e3b84c4665535fa8b252e9b5ca8df3a31c809c64e44b0ecab7feb2ef5c14a0d4de3d5a48df61b90c2fe127349e200fd00e4292cccc337c1520eb76fd22f17de1d01e92095ea4b3cfcd4f0b04bf0a668f8aa4e7578bd4fd64bd7b9341892a87a4e0e45e508825363bb322fbecd653de28b82f03cdca377afeb63571803ac6a864371625e705eb28960ae561b68b0461e2c16a4ff63062dc2c34a27885ddcdc76bfc3c4e947efe7329f91da4288523d607cddd319a665f09365f4811171948cbff58df43209b67fd3ca9542c0b6dbb24dd031112801336eb645eb1a2fd963e9e6973866b53032db01742116126ead135ad8c8d5b71e0ed69fd5a659500fdb727f174b92ef45f587201ebddab43a56ff0be90d97235748e6a4b7aea50e8f6bb4ede8400f4cd56f12d44cc3f7228459c3d5a367ec1947920d894e7ca3d7d2853fb7acae425a491fec8260ebf1e9e736104c7a603ae5694ac9a21c88dc2863c86160b6fec2942b78a2bf0d9e5176dd7c52d4e09f0a3426f39983a46b949cdd95d87da9aa1696f719a3ee9543ac55d18d0a13787ce0721b2cfba2789d83918a8de362f74894bf26738e95ba8459136df8a46ca472442bb0576e82fb871fa3051130c52252e3895406b148cfc8ee1bfd3fc054f727abcd80e370a9bfb0df4dd7b04ef8ad418991ea53ca7c5799e1ec19d2dc70d2f59dc40781908b37c338fe6ceb8c820a9cdd4563db18a4e47fcb105e425724da7470cbae925cabf606b3315f437805ccdd75305b1d5a56f8d30005051edef5701ceb41009623807d23e48309289fd8668be7cf3a8ade07074c3756d8c8c277366763a0882d83bd3f832360053b729e6a108b9e7cb432498233c77223c0a01e9fec6076bf98fb96afad1654ddcc7ebc4a13f71abc29e5731c2236d3909706400f046830019909b1501a33ddfd8c42a6790ea0b0534c663817b01c1789dc53a01657e169187e2ca1c352f277dedb3d0189592f1bec9c42ed1745ddaa89d116a3484f729e4ee8d2dc7bdfd89f1c39ec41fd8be8a9e2a9fa268d5bf2091b45cdce1763822c3f49aab5dc195cc01038ceec482f63e6cff5fa690c7affbfa88af785062c96bf441102e286b8059765586364fbbc375f2ef0d218f72b6d3acc11126c971336a3f7ef79d6ee145971760938407aaab97f6a3affdaefd5b1070088bce93cbfd896e5357df784b6cedaecdbbc03578380c41c350213590271a0c052458f797af2f476739de8ed27dc5014306d2214cf23d9bf6f5756c55a15a485fe4ac3dfed2c39463a481f89e0186da6b7da2134f6090cbe4a8e19a715136eebed3b2ad27edaf1beea1b0fdd68097ffed271953a90a6e9b36704d090fbf17c4ccfa538e3a885aa5b13753e6a2806238700d1d28817840d19456a1ff557466942e60752a612b2cf9546e53fb2b8b4e4f9c3597dcff336c36a560c5c56bf789248f0d01c7c25f8de17e4e96849928c30a1ba970b54dc25c921298a1a37ad0ea3c950ae0ae85abe523d7e005c914e0293392718efc90ad76ad82061ee0aa88efa6e85ef827d3989c88082b8812c339e990ac93dbf8f37d244e9eb122c622a6022931113379d4ad1ad8b93708a6cebd69ea0f193ef39bb9cd3f0ea1969b0bb28a8c182c78eeaf72c8db910d6bce5ef41208630a9e33b3e9d84679de63a88c34ef9844b6aecc8d6f0c5839b49bd29b654cb4516fe5016195af2c88716f35ceb598155eb7bf5c952d4f1959347efaac9880b4804ffaa5cd46b9b8e261a48af9bdefcb0d3892e6f033fae49896fe8db91514d19ab2c56721835eb42fb6e9ee34d25b81fa3f0fb2c50973829ee102d5ec6572d344a12e8f82d506e6197825aba77e4401cdd71e073d3824bb141d71186b0f008228221d641ac3191846b042077b4812112d05a72f80477356a253359f5e9b28a6ee407a2f11d5ff105e66274bd8b82e7ac2d39270b5beca1def8a35b2ee9151063e002d388f9321970aa0bcbee557fe033548c713042690d6a4ca5999427ae26bbe6c1ec7bb86e574f268e9aacbaceb762e6c2f5f96052d4a681b899b84de459d198b3624bd35b471bdc59655b1405e9a5448b09e93e60941e486ad01d943e164f5655b97be28f75413c0ab08c099bd3650e33316234e8c83c012ad146b331e88fb037667e6e814e69e5f100b20417113c946a1116cc71ed7a3c87119623564d0d26c70dd5cfc75ef03acaea6f8c0e3f96877e0d599d8270635aee25be6d21b0522a82f4149ec8037edaf6b21709c7aafd580daaad00a0fd91fcfe6211d90abef95c09ddbd4419f85026f30c3b25f9dffb76875da39e33e15093066b232fa7d56d1bba1f2268239a2eaf4e6d6e390b6afb7389bacfeed1c859adb4b574b95f7027ea122cf6637b5574e4673a02eb82c887cf7336744b012f07bd77b5891eb82bb457b0abbbde97d6ad66ec16ab95e6752afad255436b3861d542ce0fd2b838748ce5040fc531ff8a32973b67bac0acfd5f76359bbf97ee1d5cce3618e41e56c72c028acda4f618eccf05d3c1d3045ccd8fd20b6e4b8998ce08b02e552fd9a9b01c30b369fd937a7abd2343a966d95c62568ec2616998ded063a94569285297abd8102c6911b2aab0a7801972f8a852582e1cf919ac4e06e0f819e9b96011a736d9f1444fa3ac102af89cc3d30af9a51b810d2ddb9621d76c2072a9ca69af6ecdbc84a982061851562ae9b13e1065eb28f9cfcf3b89bc96ce8753f410a77434fcda2aaaa4cb6fc4aed8f780189b458b0ce2e56bbe2966eba4972e67209c28c030cd53f62c561b00a17d36aef72e410b43f6de61d7e7c93c7ada72617eca05670600a0ea9d58b29bea7237ac5e2bc0f24a802b602d374c1fbdcbb0718fc3b2bfe90e92165c25cedcc6626ae6b2264dc6ad294ce502aa77fbe9d57915d7ebb921566197f80d5fb869e1c8510ca7a05ffec85cc34f1cb3d5578ba23cdcebd48141da84330e056917c9a90e7a8c831c701148852f2cbfe5dcb91f9c6c2540008387e1f0e3d6f8d45552a8cf57c4e91d16949a5cd10c80b2f6a7123e978d58e2686a09323ad13c1409bb5d6579745e04cbff2a2e594cf39dcb9810033f83ab0c886eccc2988b63ca9d5a337b4fe93675f8c79484388c7d28c4127574d496cae17c1c891c9d63f44a98c5b77b4bb226e3356455f8ff39a1c6688ccf1de7352d03abe9dababa096226847475e00d4d83defa8beaf70de2f609318d9978f7fd35e5905d4e376eea31e0d8eceb440549f1bbc074cff8f506ee53b79b40f0874d99f9e1fd3ffd2c64e7fc1e958401b405e52c2fd571994513ff58431c721f05a4bdc2f9304c769327f8fabe14dcb3aa2fd28281147c326e98ad699ca7997f03a105d34e9ce05e0391e94f4fd161d458163e617cc84c6ed2137d1a0cc3138af1b126ad6aa987fe2e313d7c3c619fee3e67ad3b6b476ea93002e2ec2bd59cbd605384b3c5dccfe153946a041c3bf36bcd829392e5386f6bd8f5835262758190c006a47908ad14a21429f37957c708c795f585ea6311ab415d59b2ef59196eafa1590a7f7b90f2baf0707e3e97995cac283ef8b47d49cea43dae06056847b05474b93b49b73ee69678e64ed624394b63e4dd70839c67261efa6101472876f349cab59b3a43fd6cbf0e1a09d2a61d71996c4f61da38f06e1c04211927022da3da13bcbef3aa62f1bf308a13b695bc4ba72f13512adb5be325eb5cd2279dd24e9fd05d1af832f611f1709510f46bac56378da7c2e81c2041b72072a0cb541b5005911543aaa62d4a005ee9661ea0441da5389b4bb443e3f65a44012974bd5f54a5c653ad9d5c7f06564bf5a787dc4a0e8a906c3ff21afd6d89b696c0c64214d8faf0b6dd42de71e38dd82849d267f4955235793433e9f333c008a20b327ae2396f90bd373d949c4df1841fc180dbfa6e968860bcec395bd597aa915d4bd03e028e36b56fe01754c23bc03aa315b0b1e6c219b12ead91adcf7b2d035b74da9ed0d1535ddbccff41ccc71d1763038ec19a5f59c92dda8b5f8dd4f0667a40026b00d36714ff6694d9ea2e1b2485ccbe9ff5d8d9372f057ee79d4fa5493e2fe0493efee2596f4f708386db2ae08fe3d8a395c90879a6b0e4dc8a45bc0a1ba6ecafd7de75b99fea2ae54f48ccd9e5eb5572d6aa781f196f75b4b1519557a747801567dc61a405c91c659001818f2c45cd9444f7a8861b8379f6beedd180458463005b8366b7355eed8af59fd96ec785a97e6d2b0a4d21bf9a190f94e1328adfddf74f6dd541a32de6cbec7e44f75c1d6197cbdf1dd2a0563ea23fc154dcfbdc8970aff63e01d3c8b0bed12754c73e9f8e86cd6e73c52bf9d018ac0d9cedfcecdde2f9a711464b81d3ca6015794d036ea8b20e638c83291d06e2f0d439f4229343f4b91affad8f1bc88515d332f72f1d18afeb48c8ab2c224ba78abfbc7de16263fc6aac4995f2e8e7654eeb0264361d86e700a8c88bb9cc06ccf61a84e9ddccb6809ae59f9e2b6be8e187c778029d024beddaedfcc3365cd0c9bf8f23d65c54a417a6415234ad2725805cf2f450e84e002ad692e5e046672234439839b2017cb528296a11e7dcad35d84ae817ed9c632c34703214414e7d83832e90070b51b78248a0aa4f265e60824fbe3153272de428715445f884d3026d3ccd314c40c19773ef889c7a8e96e3935d3349269c11439d97ef491329588857c7cbe65a00d59f02835dbb247f0a99019756aa12badb03f3eeada5e48d6391dbcaa719b0ba0220c6baac80cd764e03257474de98120f97b40c1bf6fd4f789151abcb55f0eadbef28ebe187d612c5b4a77b3a41372023816666c6b6bdde0c1961f1b5259b01c73cc19d892afeb3062fe022039c60739b6383851a6fb6c7928c7512f1030f9d58abf9562004780583d767ff6d2ab47aeb8073fd938c788aa08d13b60b78cf1c04af589c328f0258c33db769c38693a4989ae026ce876395ba7db62170e17a1c6fd967d63d250e4b48d556f7c33a9e8f370530a737fb187744f0e50bade7610cde9c9f9aac80fc4b8940bf3fd8a135a92b41fdd54c61f7bdd46928cb3ef5446be58b78600d1d6ce808d268987074e970f9e39057982691c7ed48e9e6809574c829088abcdb44d08f4c3cdba827003a75376c90a487e36733f432a0f43f42729ffda63f1793a1b7cfd7d290d568ed9934584f9722b812f8609d99065aa776de51f7d70df6c2be8328102620a6c297962cc0fefc78952fc5fc2e0e52b075cd189c9c3d9fd0e4f5e30699b9f392a098a1cd261d390caba4406549e54e6c169fa1ce5f2c3d3c86d23809e900823f9f5b5ca3ec0ce565581af81a55c0220406791a65a5358ea004fdf2a0729c74f42b6a272f87508a0946fe7da9f611a60ec1d3d30122ec0c91fbb3b348bae01456b14f81fe7c7a8f6ee4b911929f7c22f2d55a7c0f4cb23f88e7adea81466e18eded760d6f500d6e0cbdf58442a6422146bd57761e871a800b454728d899a8cb101c781a10967bce793f1e1658cf164970e665418d6697768f8109cecd1922d363eac04870b437f92af4ad78336e6ad407ed0e6efa6fcb9b8c47806ccd696eaa6fc4d9091e4dd4a6a85b2e0a7108b289823dbd6ed406f96797f5258357feeeb88a273cec57a7d43f67ef1a4d80227fa26664fcc1a8d0d353290673930b4e159649ae6652db66a92be02cecd1ef4044e72adf36f7f731dbf6b617f52c35db85cc34b6efed180ee604a7a120081ce684a0561906823dbe65bac59624bf963bc1b2b1dd341b7c14fd5234c85e70a789c1666ebee5e0faeb1327ee0d7cbd7ac32bf2778dcd5e95fd618d0e2ef2ac0dae8db1db1d5fa49d2c66c685ea77a6721656f3cc453636f44cb52d9a31871acdd93c1b31d0de4db316d30f33b9a02b0aa9c54f469fe924f5676aac7f6c863d467e7efaf965dc3ccb2eea6a5e07808ba301e96d6cfa50b937f1e492045c6a842612a8e99838f40253c90f709b309378e99345c6a5f127643a60d566ff7dbe9feb4a5c5fa4e6902edb99d4ba41d153433cf26ce397f0c7a65b389fa3974cfce0e46a0bd595eb4b22c105bc9008763aab1b83c16ca985abf038ddb5d08236afe7c01639d3e1b37f7eb29139aa457bc3f113ebe59a513c5ee241e4ba6636e732250cc358e31edbc7a31ec0ce518f7e89b5a48f3c2535615afd14d20fed3bcb4e1908e60b8bb3c09e2064190d3e5cdaf6794bd24765bcb12a91102a48cdf76f3e446312a426370e8d87210e58c9243d94bc78799a045d98385ec251d790f02f9d2799cdc55b2f11e047e415437a7bf2deefc8d9a669ae732ea6a9fd4ecebc98e5432b7bd182f28760d31bc25fdacab74f93bb76ff0e15fe5819456110efc337912786a17b4627bb79c9469a0052a6e76138aed5f67a2a865f271331c06c9a984b3539d3050d353a858ad300d78a970fbe5f317b3f3662a7ae4091e3cfdda9175e0cb3852150b1913ea86fab37daf19cb177d1db4bbb34debff6500ba1bb8541540e923c32b9133bef927addb3dc6d1ad5030e7a7e8147982ec8cbfde87ea5b2c7cb447cbb9ed0b712e9633cddf75006b38155ed7a10e1605538645f06af80d823b358ab4e7a807f631dd72d18c450ecb7833688b0f2b8c3ddb5c7838eb6bd1de2672d5c4df499114a904542f6cbc6396b893ee0a5af243f22d1542fe33ca110ae4751145c65810923e11c02ea66467939f3bd99da9eba4ecf1b98a89699d34cc1e46247dc75dec39990e9d1763c5838cd6350f8c249f15f2ce513822b66da2ed7cebf8b507e18cd16202d532ca651d4705897a1ff595ffce6ce4331142c0c235a56e7334b16c5a2240f64fc704ce9f8ed33d019e4155cb46747a659e3421fe6b42d67f44eb84bdf3dcf1f31e38886f27e85b8b503368df238e1bb511b515bd59fa2c032bddb31d0ddefba97f8f19f7daedea027ef055a52c61d00bb1ec2668c57677e632b180e339ed1c5931310b9d718af34d70a3a4832b96a04fc702db65785ebf12a18c73753db15deb7d45e6cbb2667d546e72dee3e6d494699b1ebc1d3a590d6ec098153ce1d4c547abf330e8672a90ffc0858a2c27c4b342756952f8d20f68e2d6fdeda0effb5d560365735c567d3436ad0530c6b40e05c09d0b245f0a29d8562de3840a2dd02cfeccc0368e480872e17e1a5919555992cc5a2bbbb8a84f65b20b7160e065fb3a28502f02e8047351e87ceb8c8dd44d634ff6f19d6c752818deb9cf0b8b5d248fbdd5d85ed15465da33eca1518af8937f2fb78654e4395df8c37f260d74def234a3a4e3d2b1fe8614aa1963307888d3ee56e6126887bc950d47a49eec02af0d30c40579e6f1cb7f07364a5ab2bf4db4b9aacabc5fbcc5796053725e329c9a1e8b063fc223f783f8bbbdc6ae5ec70fdfe715adadc3ed1eb1f8d02f8f66ac65cd4d539ce5102cee983928d686bcf895fc807ed50d1b818de4dea424581199d9c17f92620a36f8d3088860c20a55bba9b28dcc8b03f0e0dbba18b999e2bacbbea329abda5b1bc4fcf0b04cd264b07611a914e917b7c972d0ddb0f5d654e9aadc1a51854cfd49f62ff6bad34eb95693968a20bcc1522e9e33f2ad4222d7279efacf010a001b48f835c5addf7d34cd7800fdb62dd1fca7cfcea41887c793fa0fe26940213ddb9e30d6039157a8fa9f8f17a9e0248edcbd6a6798f8ac0bafed655a9117b24d65d508d9596e221736533ea337a589421bf7d8c7795598375485082bef8ca676e275e6086e4d2a120e72ef6b4e0e4433e0de81b6ed383592a94c601d2aaae3017a043429eb3556e1aa83093897213ea954f8cdfb9ca86a66d7c9d6f7eb765236540c5905772f8ecb330ef4d2bae85dee9fd0256030ad1ff90584d083d9fadb5c9914bd64bb42ba19d19c17015e6b8a49e8ebefab4e4f3c955c06b7879d3d67bc70a5c80e5e76c314abb4dc8d2bb1ae0157d394a5a097aa8004d6f4ccde47dc9f0246e2ca09d38f01eadeaa3dcbc2af5f160f7d16ce8c4f02247ced1a4521244b777f73616462072bb5a2eadae3a677ab4a2711c680361465e4810c387ad22509f6d8e39c162a13d93589022c1e65ec2d1ea3b77c5d9ee1ef6d6cb8f02462c920a7da9a41c8339c52921a5bfb2108f82cb80cd9020dcb9feae7c55808ebdaf6dab30c0118218688dff3de5d0f979782f240eade1e39c5349c7a1556497941967d42f67eebca2ac1c8805b7030261871c5dfc32e9989958a4e4ce2197b739f90527b217a806a272d55631bfd257695afeebc21313aa442884788b7096684fccca187145ea0aa86b6cec1a66ab7301523b4018b4fcb33d415d154198ed1526132b28e579013324e437ac58221aefca1b561d38af012dd541b32d892108685d5aaccb7737aa1a987bba2943988d281404d3c5ca57cd94bc981b33ea9f74bc6611c382aef8212b83a088e595309ea68fad38cc4645be6243b2f9cabe7abe9bd0c703f1053122d066e11863a560bc058d72f9a334ff50111b30c3549d2942811de8e27912891bb3c2bbed25fccf61afae04aaed0efb2f4ba3702c540f41bcf6adf5e38d4f567840179f7b9f13c31c1f61c0a0fc3cbfb86c6d2f896b8d5a6a87218c9bc0242fb50fe61a484182f267df3945807356b367ede89d7eed8fb9f79ce90b5f94298b7e7daeaad7cfb2c3c15994e1ddc4e58cda5a9668516c8f06c0b294f0c38bd7d02113e1dfae6c3bbdb5392543fd7351926c3d070eb56b13c7726295eb4c19a7c4495d200740d97646bfd83aea8401336aba0faaff1f5bb65269176c497dc021ae63c3d9e0138a0b054dc17623e5f0f38c203d02c803d0df5e316b9899bd11de14ece28fc8aae0626ffb8f47aeb7b52a6d5b5f9ee7e74d074157b9ab6aae71258e5133a24f8b8f04fd259c2fd95de03084b7f1efdd5e32b682389c052ab680a0713d21c1d319e86b136862af426ce4be78c27e7626bd2475b7708d465859a2c7741d575ef1fa8f2d69409d366859452c90075fb242a894bd478c07df822c6a12fd5e2eea3a91e594652a8675b9a783f390f33034bf84f605c8e796411693390b739c22f3fb647e687da2c8bdc4dc13abc2127a6e0bf6eae7a21fa31bb422b2298d33ddfce306cbe23925ce9ef86b96ddc9e1a8dea662c5cb6990c8bfb95f47f590d1aa655fed50ca2e402299f2da6fe20eed56071d5d293985f771adb4ad7ce824e232ede08caf68a37e4f3f12ad11510791dc67ef4a77aa9d90387624a1c389cfd1e1c703693a465f2ccedef6582db35a7bd6717abf53a7070777a987b0be42e84d41b1470773fba7f80c2a0c7017716e17bec47e202fa758c9d9a86c6ecfac04a0dd1d19ebfef1245c8180c3695123c8d21fd138118e341963b90331306a4dab790e6afa8b4dbf4ac6e983c9b87d42d15754185707d1d5bf41a03a84ba20805332703b6769b2ce81c38e937df1fe473df4061a49779cf4b10029ceb54084ec82698d0eff0bf0976fdf0b305e8a56b9655490478de56219a51bb030618809facf8acf461ff679b27b75ca0afa061901cdd5ad30a2e5a3ccf1e0cdf007e522338112b181489da0a82b245563cee9b7c8fe13976616dcf4872e1bed9e26dc501f4dadde31177617d1057727db4b99a5676c8af948585fb6c0c019998b3cf226268b98afe5fb2441c570cadbe20eba7475afa84d57f5c27d124e665c57b8bb16d1d17f9100621cb10e13abcc1876b0a77c2df80e356dc9a9f42f8ea074389ba4b9a5df3c20fab3e81364a682df1210b0d36df6b6312ec9efdee9ff00712b1852367f140bc813ae496dca279aa66f5f2323e620c00bc737913b1433e6cf0eb5a1e0d3da8a564b506785dacb7e2efcf060d63d02c605b5b740a124c9ddfe51f806413a7f325c103ec4f41cfea7a939790c72c91932bf78bd70a9a22d508fa35401c0199e8e69f0ede420e72d91d5b35d887220d090a99ebea3acf2dae8e3615e26e607a508d06bd24794eff4d714d912676cbac56a44763f5c33bd5f01aa2a7ae83b6b2f3c5fef8051d88dd0e1e7494c2bcb2d741a30bdb3fcd6683625344d4eb838ea9993490a7ca564574e4cdd524f3805cf494aced3b117fd79dcde22682e3966dc60a82c3b3bc4b0c2c97267a2a03ea536d156af46bb301168df96e509adce2dd730d58a0022025656deed06a8f38231ea88d8228536d7cabb9aea0c8051f9265186c5e2d7d410bd89fb274ad39db53450fc39f91dc87181f8bb42098a9f4cc8e1bed3b740c6626ee2aabb94c1233a15008816738ec48fcf869d295c870a2b8dee559977d98d69e2e76a1484e018a36c8fd8d82246cf951c1bdd2a75e417380dfde771c4e07da9a21eb5cc8bbed263a3555b0995d45e23effee7aff6403ad49196e1170f143ba424df2a3e29bc050d41d78b254ec5d4bec3c649345e1a0993e13feed3b6e32bebf3cf1403ef761502c0ace5b5ad89e7c82ff87e421deff7f8455f4d526cbbe2e397652f983d6b86e6b83bf735429efbc29d1bf37396208a74667ba8ed812ce51d7817b975941adf2b911b3c1e9e83755093974523875a358aad2b6e3fa4b4970c2e7d6e26a3f28233d3a120ec21c608d49bf0efec41fb8dcd81d529b347c19d32230c9a15bd8114b2089442286cd51ad12ebf50385692f79f9d0f57d2daf25c21ee2be9ed71450b08983b1c5de03f2fc8b469129255af078357306538eeb5585de871c9f84fccd9aa1b2c1bf72c72bc4dd574b3849fbe421b38fefe3fe3991638ba64b6d0a977153909dddd7e920e44b2fa689f79b52f1bb9cab17f626a0c1a64dc8b3d012ee22227dcc6bd7ec1705dbaabcb42fc36a00901750e653ae28cd944b74bc8f4407c94e90c8d58522b376ba752035a86948fae64d05c4c43dd99d76ae32ce7447ec4f20f31881a934fc1f30ba5a722a34f6c5066652190f7bbc1a939d8a5145c4a59ae0cb44d90dc9fae9879ef3d57dcc7b4b3889bf4dfd12d82a354105adcb623894d643d543788ab6ba054b72c568dadf72c3ded5c856a735b6a2c22a4acecaaf2449805229b11e377cf4e95faab5062a24f18e1bf3e2e5dca72347829016a3113183ad43f2812f85159a9f43eb2af7654808c11a346871d4e300f894e86a9667a5caf03006b062a96f4096a5f2905698c6519e58f4b2f6255481fee8b8934bb8676771a2cd0661aa702df60d26aecac986144e5f9c861ad8e1ee8106695a690c5fa25921af4bd49002abe603ef4efc026f99f9b792ad85f4718ea8776485996c75c2d033144662640c008e10b536934a6b27c5e640efe081eeaa9cc210dc82de9111fd6264c0b42d757517bbe02f38aa6207dd760c13d3883f8a856fd429cd6d9bd50935078172f32752a98dd80193283a8267ef60e3050f4c768a061a32211e7b571c34655143be09df6b0d06744bcfdcde8cd7a3251f21fdb6d31049c027fb19df5ce8e6f8cf97036486c3d05009a4306373b83da2c8c33a918915c89b860b5db4f4d8f33dbf85fd2822379f5c74b11e5b45199622a9ffeb51d49b018be75630200a8df2e9bb91df7465f2dc6135fd8f0c2983166d6adcf83cdb2c5b58f2e57869c78d4dc46ac291907a7bed27f39069bf487d254ab263499bc74f3ec94ebf1fd852626a967520fcc4875a3c76577396bdc98f2b82299ac6b5bf8d12a8a4ec0bb5d493b32783b30658b5182f1609adfc4bd54190dd788b58d4ec6c40bb9b75264874a98e3f3d8498932b3c30ceb04685b4941cbc23473ee53e76762ecbdc6156d85b2b65a54b9a9bbe124ea668f447183e2da7171c3db9563c8433459f0eb885afb0a19f2254fdf52191d6f9aa7fb79c33c96a0a90030694163e2aed01da839a139c94a47e00b69004d15d905df69efbd98feefb46412d8614cde38fb7e8c97d4d478bdc81f9cc52aff96ad54904041c79a8ba53079e34137e59e6918adf9216a5d80eaff2e447256932862f354ff2e75a3b577b9bc225259b09bc5d4268e64d6277a5859b6c30f07ca43806ea7f6f44c6714bd9ca5607a3b406ec59a72ace0ace4ed9c642378e9b2e7608c3313d841b037220d75c02e3741178feef80ce51352f8231dab0ed690dc8d17eccd03138545a655ddc186dc082fa867a8697fb78b6ce3e3629ad37c93091dc238a8f0293d713728b4fc740a6b4b758e985b25a4a75f3a86e1c01bdb7ebd3c07e6538589d8c76c3319a31229ef28f17d3569a92cf5ae6e8631973263a26d4a418c691dd5f5ccb7dd7241ebcae24ccebbe60174c0f4eee279d89cc1a5bc9deb177136437e02d59cb065556b6e132b4fb340bf1301337548da3d5d44321bd370e25b6770e28e969d34495a0b73c059070bcbfefe5e2ff6141fc63534694e827e5aa15920b407643bd1c4cc667c983a771dfe4da14848c5a6c339d11cebc33f85b8c9a7fd52fbe2fb213e28e6f8f95432723e27a6402c88a35cdead581a286f09a55ab0515fda775dab3bfc1779624aaba1322977e639938c554b169074dca59ca8cb2eb73b31b5c5c834c2726e7162551340af909afe9ab43505c9309c5e57912ba16fa9658012d600bef87258955fc14100367aeee9f2cd847521c2f13c1999b663ffa27f4403110d411aa1b84c7772c2e76ab1529a303acc3fbcc203e45008d1895b3cd90c2ad92651b59b1e156dec116c98be568dd78e64bbf6a854e58f80f5980ec31326eec0e46735a8fa7e978fa5166d0c7b135d3af6806c0054ce4c749af686ffbe52c35ad0083755cde678e0066b342620e935b2ea03894493fd0b664a5b502d2aee4cf961ab274c18eba68fbdd1aa85f86df598c7ebdaff82f040d88c0cf6e5e977e03f31c671d65c0c94e123f01cb65210115f087fdd9bb246714dc8a1e7a48a7e319e98f0c3af17c7c886d12d2741de8e1d7834561d93a27e313898a0bf038e6f959a2fa08910cc8bb5d35e1f4692ee267e76c3f4f791c3f5f51b648fc96d55da90a46e5c3eb5fae6e179231cf7342187c8cd4fd307f0a75c4178c4d5a36c813dc76fcd8a50f91357dfcab8ccb59fe900610e3086db4abd0f8ad33208e96b810 -MD = 339bdcbad66c73c3ac55d2fb66f3c3ef4fdc882b45493d04ff63d87ec93f402468ae062057e330cd196812fa7aff006e - -Len = 97648 -Msg = 52e533a4f310cdcae7424e42caf7520d2ad6f69e3c9132e0ce0d6a7b7dc33f542866ab52a5c54d68b2f401d02ea6b49489de775379c7d142eedf5a71495b8550c8c8be7145eeb58f21f9f9d07bdbc847a5ec26bdd8d32cb126aaa39db15dd17b1b5393883d51ac481c9b5dca185c362d67472b63c27fea355eb46c871e8fcade0751531ff4b7db9a8b2055466ff1a54eb739afcda091b4d67e47deb8f9bb1980750825bfd2e7e98d56d10bcde764bdb37e08da84d8d2319d6fa921b7a8a766694ec132ee3fab7f2965f6a4e6e87c2763a2fdd30fd40a0a9117225c0c951c58a278c4a137a3c94577a0d74b1ada008b660d60c3f6fa01e6bb5ffcb74026e19732dd599b1f660ae27ef0bb26f026b990c5a579d1c2b47e6e212f7d5bdac5c0cc2164c84830f036ff463bec5df0326fdf87548f26fa694b4acd70ef7062d97f9f78f458cff1aa1543d86bb019a267e920b401ece926802e21c708981d61cae7b73e775359eafa6e573b6650828f2df1fa5594d643cf63f09b15e1c18b5effc0bd7bd4ff0da4490be2771613bf3eed4d1571f4965c7c795961c1e2b1e2e1e2d25837f3a514a600b28d956143f9370dc61a100b745bb52a301bd3f2b24972dae4317bbc8c9578852c009c31265703f724b13ac0b76802de3f7151fb0ae89a4fc0ef4e17feb9a34241e2946d060229112f81f8fba9adecfd4c0945e402e8e0a92c3bb9ec41a8ae9db8dc86fd292131c5af3351a4904ffaef208eb695e271cd51f1bdc3239e8921005b9579c9d8dda47a6b6e4ea4b579b51d83a6adf5f2aae8add71c74a45d8485d2f0b675b85a5e09972cdbf6e16051a3ed3cf931ee7abcb926a501d457c6c3617b40e682b4f9cbe886ba225144d9ff4ec815304a67c1cfc8252513ec24216b3d6313cea9a5fb4ccaaeddea67b567ac3e17d4f3004910099e101dfbc3f4b5a7a1f23115f171a90b35775ddb411d5380f94042e95c7aaf95c250566061adcb9d1690616463014b2db449019ee662e6a209ad27bb65e3e699bc4e98ebcf39ab7523a56c63053d29ddcc8c92db5e6e653bf6c44b11246cfd3e1571aa44147e9d5851991bb9e10d8a4107a8d939b2271b7246ef75919ffe3bab542056123866e96e27d4340fff5ab881ec069b61e9774f7083956fe6e07fe90901c562fd44d8d6de2dbe7f0c650af9c6030ca3fb0b45485c341dffb6efd94f7fa4c797af3fbbadd1ebbfc6591d079638d523b8ae21784f5fe2f1eeaad2f2b536c68ebdcd31f9b76eea40cf9d2f37d7fee9b3a12231faaca11478036993b46355ee829c02237939deb1a76381a1840341c725270046b2a749521a089c3a05a005a50bfbf31b237e48c85e4aad7dd56428f8df12f065888880253fc3eacdcfb66e7291a44b24dfcdd5b8cb4cc8cb1140dc034b2a999864966d134ffefc56f9ebb7dd7c5db043956dac0858317a9122e08470d036a4e62e1a39a6b27f79dc6b88096e34efcb822da7f7406cc06dd9ef8c49c8d500b858ce5c0b66d10f0a680dd48bae212243e88fc3dbe96ec246aa608b5392c44e7ef42da40cda12755701c7196624abbdc07da409828ac800b00d5d27c95604e99ec4313a638ade7b07af819dc1593b8aec4a52c014abe13f5108cea6d39dfd99bfd0c3653afe9ee7c27a23aac5d3374f6c568232b8d4214ad1a69b519bed1725891ecc6fb6bfb882326b9586991c09d5ebaa1da5978ef0e8d9ecad7046d1ba57a6b9329e01549614fd89bf7967bc17e40f4c0962d960b6e011e4ea4bffce4ef5bba6df3b43459e65cbdd89cd5439cb44804630b1a5d3dbfb20953b29ec6e3bc873eeb98da31b3a3c456ddcc88a1d8cbce7a078d9236ec701af0788543538e998739aaade4a5dd16212439eb431efc115ec60cb247db9e3ba6543ba1203b4c12d66b299746093caa0db67b9d77038d417369010d8d83c95edeb50b7ac7e6b294ef23c6d990c458fbc48df137a707f2c8a6e372f3e5f804664e836696acde48ac5bf42109276fc877e00b596e4594c31363b5e0f9e370c5fe505feb79319a74d5876cb69aac73f1ab0acf1295f52284be3460c9a408b684639eaaf8871893dd8d0bfe060282797b018f399b3318399e2583749b76b811d65283e51c64a462d95f44188dd53bd8bb1807eb71ea315295e5eb51d4e6941b22379a9ed586777ffea8ea5cbc875b2a385aef55251fd306027bd68914880f4afe7f6d5892610453c416492b109d42d67956afe733487fbc5a53df9ac8bf9c29d1b656730188cd86b0140b14389b85760477e4421af899fe041a51077001cd202268f0ae71625571492e8aa882e6b581504b06d64aa4a443961bf54f88f304d69703c64b80821eac05c242488e134570e35ca22440d1310596f516e39217f5a5761331daad6c9bbf5c7bec84c8b5a7cd440920acac02c2ec7d12405429c4f2256613edec56865ef3e3b7c3ddb1226f1ee8fd1cefdabddc40bf100c219eae9cdedd8234f12a63db12020282b3e60e0dbe4884e15e6b76efbae35ad4dc8f19582a52eab179879982725de883c7b5bd0653f95d3888bca26fa3707f24d579b9a6904cb9ede60c7c079d4dd65169ced3db4861d26cff6cd4eea2ece986bccce42ab9417c44e707afbd0b5858661a8fd71f3418810912fa92ef21bf1684e3174d370dd7be50dd2789254513fb5c6a872b248f93d59763c440e3b87da279e8d7496df665dc8c38eabcd2c2f71b8eca33649db34a6c928278836ecfaf0a005e9b6d321b7263619aaf9f381d885587da1307ed57d2a284cf85ced2efa9b9a294c22d25d583ff7b6304c4e7ad2e15d1eab48985e59313d8db5a77d291143dcb2bea0dabcd20ed344278b2440a7ef8f79c766e19d5223d19068532c04c6502f4948183466abfd9268989ebefade15b63600729fbbef69ac00184743e8a12a5b96f07229826e73fbcc8a6c64d100bd99fd5b541be0b8699683ce6b09fc2b3a2840c096ff39a0d8d71805df5ded944e0174e2f59d32368c57c191a7c869ebe65ef0c06cfeb2cb93eef412def3752230b6469c3b6cdcf03ab66469e3c6566a97c44df7dd7016760e0806b7526c9133ca8019910fd2046fdc7d115e074dec2eb623006dcf9b8c2ab0edf9fe21116b4e862796ca5a15d339d8727279fba352c1a943b02a2bc93d6ee16473ef342a28fbcb72644e027e70d8985e2fc1a710b1abdaec0637da4050ca09371c9173fff3c2022a2b25f15503d48208f03ff4de3172afe6a99bc348eec6902c9eecc6d7f22c911795580de2b6b3003a5cf9c853f9a092f8435ecd2b3febdf0c9e0816fc4dc0e10148ee406cafff79ba1bf90db932bceaec7989e22f6ac05c9ec7ee49b42d065ab0ecef703d163f5551d647a956034f1f88f522e99e98ce70acbea54948ba8764ec2a64879b14fcfbc735e9867395e099955f34c9bef09b83fc2e35fc001bca687caa546ccfd1bdd5e4dfe98a5710f7bfda5ec46cd89bb1fe58bda74c237958cc2913c70721740a4a707d4e9f4c9b1dfb219bdcb933c0984786130220fbfbb7fabb0dc540d8256bc232b621ac985ed8b430be83981988d6c84ed94e5fceca7158fa4257ff3e0e69a5f33369988482b353d06ec2f1d01bf5e87ab793f3e50d0e50ad57842c99548b5c7b9b2e4d582f333ec953a0aca1a07d0ed054dac388ed14499ef755af32225a4d929779b25c8ce2dee31625b2d43ff4a41a592ab7fe920dab93c8d070519e5de100cf51afd8c2479be65f59e9b122e4111e6d8cb7912380dd5572ff583ef01c808ceabe2c13f8eade99d5453a806ed4bda53907ab87c8f649ac9eea4d40411f930091c8115657540dc521f08d884e4d107665a37b29abf6565ff49838a0b9ef80226b7846e9070c9232eb62cb12e8d6725b986810bff1086c381b1102a77f13b1bb21d5b4142f9ad3a8daa4da6664f74b1a7a5f5091c5b4f3fdbc5d919abc138c925ae7411ff8873aef96bda4cceb38037cb48f24e64d8353777e85cfc497787b71bfb7d651895a2dcec8b5108ca5220249ee017408b1fcf56e0a90a36c39c8e51ef74c5cf30b9b160f189505edb93cb049cfbb293d1aa83faa0786f4d9c98e3262abafb94da5d35c782d646d384f0e764300c729ceb00d9af21e6fac54704fc90583e6d7a7808967d2b02a2fb69121ba01292d5e039ab56f0ff754b225569514cf26fb9c49c3459fe448ef33aca5fce549f1f3af23012824ca393cee94a2e77a883df5f27a978f6c789ebc6165b32860e4002303780cec23e98c3048e97dce63f76fddc08424f036545998a128e42b929affc44448e48bd2349a37a86b0ed137e565baeead91ef6541228cdb3c5f8fe23296df59dcb08d9b750859f6637e785f1ac794633e07156107a19ff7ea4ddbba766c7b2a7c9978e572819e1a19f44b415e3c74097eade8926e7dd9dd7ad698812c2aa09f6fc7d617f4ab0ffcd599d346796c61c7b7acf2613e5f427534214d9e1d7756a0ff612e9bc32eb385df9497d6320063852f2bbb343eeee3a85f57827b11fca615728f09d8a7b3939b7e0e1f5a52a0822b3053c97437d3c35c459fc07fd06197e6117bee3668e2b527fc2ff438a2f3c7a2004ba68af2b5ea7a2c228d12214d32fb244a651dcd6223129f1e9ddae7a239d0e73cdadc343d61eb5d08749ccd687e3cf327f6f5a0dce542b004a2a6ec54e09e2f4eebd4c8132f952078fa859d5b8392c5382a26a7f701a176088c0678b2c5f41ea863d975de5c62bd9aa93656ce49e3e4a58818ab5c81163b53e2615264efbbfe73ca520246f1397b970815c368d9199697993473b26c88450c2c1f431166d915d6a6a938f5f501a3979f8babd23a1a2436e3e0c9a2cbe1de5cf3a713613338acfa8145df9070a47dc1f701d5b474d0d6a9f08573d4a5084c6bbd638afe5dbe0a07e28ebfc26b09513e97dd0ab49021f319488c3aef02e5d76015ba6f8dec55792452ec9f30ec1867360788127d95f7c5ad715be69ceb60c96480148cb9e9e43f7958c74885feb906d0d06bb5b58b39928ef55c3f826661689e88d9a7275b53a52f7c878367a6d4783479edbb057acfa3e35cf60c4a7ed0fe37b47289824a8af36e4694167fee51038b8a75eb146ba040d52c90179b3895d1568c45fa70bf70715d3f57c974dd18f0fd8c6d0e8b6596b08cef94261e9e98292499bbc299c0ef6725ee3666ee7b1287b1063cec1171983d2f2c69027ab7c250c9623da8a758ee1ceddb9ab397d1250fd0804a4d4f968f2de66c7773588bf98d6c7031753f8c56d9de8fec7a14e63ad28182fff9ecdc61c9db36264160232627354900f10b660de62091928110c33a16ed95c3b7914bf7593312de33398632674d7713e4b3edfc8bda69f691316e0b243b40fe51e6ec3925198807128cbc0395dc82d116df290b1035a07e711ff19744940c188d92c60f74b32109a600ce83f909f0a14f362323bc58bd94eb8354c4bd208079343ee1629029644cb73ec398dafd4bed5660e22ad86b489fc5059d7cd90624890e914618bfa4da390deda32c82e01a1cf4066e0aac98ca07c84cd6a6de6f80b1e234fc1b4a4c09366fb6772637d9e696f1d0d0a98005ca33bc01062a15821d577ace0b5179487baca741466e421036c215650ff19cdad08d69cb36f0c66882e59c087ca493c1b8047b3518ecebae920a276e33c84740647c96536ddf394837c1118a56fbe2de46a4b43bf58879db82d5f1924518cb5f0f680d41b3e1b54bc555a0fba13dacc8aff61afae62a36be8f8c397a4cc86e5e58b9943c10dd8499b307130466543aa67b60741bf2ba68804095c8cd50c07965c8d8f4ec8dbcec598941314cac27d4a1304c8c45222058481e5966345ae8349ee52bf5fa316436b4d06ac17c7b9ec1e1582128217d444e3fb040da577028e62f3a1b5e0e05bea9d10fe98c3bdba14b8d7a4711560b0e918d7eb3eedd9d68d8404c11f9cf0fb28fd9ce285a32d518b8cd1f260f8dd4676b591018686fe69053faa5738ce659292ef3958ef20870eb51cbce26e96ee13522cbefd811b455889d84ccaae0faeb09d048ed831e66b5035eac0faf69a03962ff0da25cb155f138fe07491fbdb4cb3cbbff5d6fa4f4aa46279b6a2955cce4d44a44b10b10f9c288c0aba539eabc03a837416ebb4d59599df3be68fc7699eb754b9ba54cf549d1612a97675f31b99b378e36a6cde13ecaf00c3d909094b0552b4a3804892aec25a983f417fb585499d00605900e284a0428b8416b4d77b82ae08e435929758bc64a14e93d742834075ae9d7b1e6ea260f2b40f27f9ce65a727b60e529949fcebd2a259f62326901ecbf7dd393beee79f3e3ec7757e3aa3e36e40845fe31705c1133fd3e0d9de36551e60b22bdfcfdecb83703f9788b8b0b7e03ce8d5f6aafdeca4be6edc71d5d063db7daebb70adf27670ecf9f6cfd516a50c0f9e2d5a626fbf15c26d4171aa18cb81a34570a4e5cd108529692baa0c402b603d36ee74e9b5c8d4d061c85fc75a0cbf75f8e3d323b92a1eaa1f9eadbac7cb7b4a2591dc8d7a9a606ceed992ba2ea7c36a4b7d81c46143cbe38fd8418d07f5bbbafcbff7da289456fc66edc0ff011d5bf4bfa637643fce0b6a2c611bef9b4ab0042eb16d5c3a4707036c8d51026bede7a9c8067a7fbf596ba297b1935efc2ae6ba3e1e93904a332f165220d970e989e50df716c1736a565b2134422e47a536de519d6000f2b2e90da9ca50a0a6e481d275bf5f82ebcb45586a94ab635620cee54edf2e4c001ec9413237956d30f7563e95932955454cb6e1e33b55c8f6e973ba2685c1cb54e86458442c57958b9c8797c2153caf1c892b962f9ad9d5a689c5cb5cf3d3055daa3ab1641b1f90333e866cafb7e1f6ddeb03d3b4259ffff16c257776dbca9076ceccfaf6767603b477f32b92fdc1d305fce028f58e10ce440b236ce89020e35ce09b838fd0c3567bb32e63304944ba212931148816e4c72b01401a46a36e746c6a16e9a4bcb01f158ab881fc3ce322cc1a8714c062846112d8fbee05981bda21d5cfabb99ca4b40e6922364b5b4583432b42a852f36822a7ecb776a9e0b16b19be463852f319bbc2d8ebcec1f6b47242e6045d943c088236c71332a81fb7dda07deb1df542979cdf4485d9e4c1e87627d54c9328cf0e166bf29fb084a7977882af5edb052da6edb05680d6283f39e58e737be7750ec14593f9ad6ec40af8e20cdcf1ee26f6b014e2695d5200b12166c34b12d90d8dca966b36dccbeacc3490bb6144c5cf404bb8e2077bbc02da477082b6c1d646ce928f4e549e566d6dd30b1ae6d7f0629cf2303bbb7ca2b31d14793960d96dd533b1a6a9bd72acc0626cc7a7c82c0c855f1c116befd07475fc010753b3fa0e2d7f907329ebfa2d884c5a4cfeafa168ac1951d2df3f07cfdfe9a5915e2a8445c3e4b75b3b6a8557397e34116be7d8a34b6e1c0b2203930365886abdd55f08931d15aee55aa3a4c8389a829b9c1b523ae7afd310b0e802bd8b3ad8d345bc0784ad84ef980441e8ef1a03be61ebb47e9e05512f8a2856c76cc58378782bbc0178f9b4f1f9c4afc23a625c500af74dee4b391489edd4da518fb8f4b21303e9770e86183e611857b14895f6dfdd2b3201d0d75c6aa262dd4194ca011e4a4aced8b3e7415d948bd446881985c67f142b59bd848b5a4e4eea182a6d2b25747cd6c6e771a2b7da7baff277816b9c573e74666fa533c147e58b35af36e56038168ba237d9cee5c9743535a5523ada0c06b7b875dde84835e33b3a91abc246ebb477fb2364285fd8122e8080005607f4095fb05e730b579eb474877030445225b3064218c5318e8cb1d67396004f9ea5b2f6fe88293f67c8d5c1bcd968ee1a7cbec107a6619d1a6dffd78f55f6aa16979ff7e39154d6f16ac39d3b2bba11f8371432dc5abdad6be2389c245e47d7f8502cfd1ff87a749ceb0a7192f5a872740b7fc600845df4fb8018bee30d887bcc55e650f42c2e9ac2c026e954b5b86226504e1534d1b70651de0c9a3bf21ce7fb2f589e10aad5bbfb90856ee0ea6e7387bbfb8ae9b15d43f73270d8af9a89bf1d22f05ef603045abfc2b27cd8023f29009524a18fb1b550745401d4be6553539b075a0e04b33ee977ed3a8d9aabbee5397245f3a731539e21892c18d8e11e681d12d215dd49e9facc569a2bb935425a8ae9dbfbc0eebc9fa7685c3f8fac2f4eebfc1510d0259a0125b53dd1a43d7ddb8d5253145d1864d77e681ea353151a8aa0197f899dd4d39f0c8fb219fc32d5faa94247e7dc6cc0d81f1eefdec3ba74add1f19dea86d60b26e92c736f21a3cf3a773026e0ef4a6503e1d34c5c421aa22aea1adcae3bb7b52b64321e3ba50eee0d7fb27c99d63fc60d9f5bb0a66ea44774610bd85f1ce8762ed6270f19f6e2a7061b3fc57d51cb78378feec937a9e5c93cdf4b0d87cae6a2a3e781c294b7bd7e96e23e7e05b26bd0244c22d2aa746dabc6ad3ee8829640ef2cf0c8d50637fdf9425d4512bda89f82564c8e79595e8a53b4537df60a2f75902c8a62a31928329b9af4da301f84e4f330098839ded8fa75887a7eb278f6f35a152cf5d937e8d9da03316432a5d7ca97642bb670a5740c75a58ac7aa497d58919950d8e3dcfa82390dab89b6eb21bf03450b8fda47a05ed8bdfcdf4a063303db0b8eb23f82ed9a3d3ccba11959f340bb65217ac33ffe501314592c1e39b8838afe3ee858c432a05af30a40f66cbcde2447161db7e8de9ec95b1834935e6e5645e40a01cc1b5a2316d2efffcaadff15d25d41df44ecd1794ff4c29f45eec50a804f488505f2c491054f052402982a564a3a5d35e6b6779e2b63e0b2b2556d0ecea2a2e8a2d522888ae9b2543ab5df3df04090b819d0217be04aeb15454cc6e1859081b30f4cc4682c15a016cf818e2b6912a4ec5ac46f7112fc4a4d9b1f5311597b6d6ac7c45ace7d7536c25d75a7ad1923023925fdd23c180aa6b20057a21c9ec5de7648d63609d36aef0d612cbc4184f4313507f6ca3b83f858e931702461da225d7c2efce6c8e269415e56f14c7740f89a567d49e7ddcb4809698b136a9f900352d2c692fd7a0f12d62bbb7dd8ccb1c2d613f2618bb1727c00a9999be51464db6710cc52eaabddea05fc0b1cd1907bc55cf403d856550df7072fd984146ead2cf2cc9c972eccc3416945c278d780e382a78d3e18b816f25b6572c766891cfd7a9e5cb3ea4a5b53cb68af8dfc5b1cad8d3e35ed9d2195b41ba3f8efbda39dba36b247aeb6bde603ea9c8faa31cca21e378984bee0334fe7ba5b58bef3f46f8803e713e9a709eb58116d6cc393acdfda3432000e8c6db3f1a9f3e8b1941c10db44a557f115bed9c4f263dd469c8c1455e5a02e78fc2150668cf64f64286b10288b657a519d3d3fdee00847cfd6eafe15de5c666aaa0ea3bab5eae3432b61ebf44ab00187a8059c0a7ce332bbbd39eb8e80df5e7030762c72c74a4adb17a102b3050d640fc0b86cdc2b5d3486da096b446f916d160a086903337cfc9877a903094ce6386671c630c87dfeb3dd97ca0bcc1d3b18c8a135d7f08d2b6f17b5da5b5b74c2f50825af6653e740371c810c2b99fc04e804907ef7cf26be28b57cb58a3e2f3c007166e49c12e9ba34c0104069129ea7615642545703a2bd901e16eb0e05deba014ebff6406a07d54364eff742da779b0b3a5146641293925b9e2ebb555705b57ddc9b64d1edc429d9775a91375619585c2d27c5ad905be4d1d21ed6fea636b6bcc783b0eef2a1107d73fabeb519e647caab4072a1e16e1da93681ae7887d456648bf35af63d212195e74ad04aaa8111dd3135bddfaa6cb53857d1a2415070ed0b8684d36611b6f5b95dc566766c5c2f0a5b7207b54fba3405a29962e7a49f12f86392aadd04f4d55e23e4f1b6f3ea07e8967ff0d135e922a7a34360ea08b140d19fb751b9ab4d790ae643f28ab5bd24ee5ed9f9a2117c0984d66a1cb6e159ff1d975d589a69232936214cf97046380e8220faa2a656e54123b87806dcb2ebb642e71f3fedc3389e66417a76f61a0d4d5a996c5c6c7ab7620ac5e7afda12090ed80b5768224de02121e356eb8a958f49ce1499a742f15504b08b43881d7314514370b071d66dac59ef635cd7ac6d408c531f2d13e85f5071ab751610455aa0261bb394ed88a70fb1256e16bbe9f5c39d90357122cb193c61621fd9e8b03d3f15d7507f2ba78e8ccf7a5fff18b1c37ae5fbe4204459c37b3c5ae809720c9f3378fcb3f9ccc198a5fd34b5806ea25af91dfc9794f912c29f6b1c7a1f3ca8f53ff7f26a7f315539ddd31b0b453e2a20a07e18ec49c184ab0b862d2295b923d3c6fb6ef09a09d0f6b6d963cdb7f7b7b913aee74ed93e3df16215f39e1767ebbf4afbb8c2b4a6c363a388c579433bd998c528de3badbf9d1a15830628eed99f1c3e81667d59a8bae53669a69a817b1e243764743f51d620a9a865db7fb67e8c7f34250e6d1370161fe1e49dae0d25e3ffdcfa3fd6400277049d26e9eef8d7526cbe4f073e6cbd63583881f12020dcd9804852977d02d4fedf565ec81310747f492f77e75dbfb121429cda679d66f04d69ebf611a004be268e7665fc78a7c661b91a283547971bee53915667726a10ddf14a5d44ebe03e9c868fe4dd8c294db81100e867788d5e290fb87e675b84af09dae61097cd0fd6af7be55401ca1f8ad1056620f48d0ce84fcb74caed95513b3f7b318880affe070dc3192bffbef50e4aeadc7a62e1805ae13b58b460dc5a460d46df5da621354005f0bde53dd734389455b65d4912a2267bc3c6d3777d0a4fe1e221d86ead40324689260822af67aa2bca96320d9ccccb8df961a07813ebc96bc1bbb140c0a92e3df1041d74a409d3afbdfea136fc7aba76509b94192d6932f96a0f50d2f7cac46accba8d7a5195356ea452133b9e2683f34de736a1161d2d194f8f3f8baf3f753b80cbe0ca34944007123310b20e7ab85355d6f0c68a820849e6dde5d17371b14e91aaafdad97193f78c041200d9c1b8350cdd6aefe7026519c45dec4ad10c191283f953229cc7a1ce7657afce6cb61406e78cfd93b848b3f76c91ab6e44691d15ec1a73481b00e9da65a0426143a25c475a4831487abf8571441bbba24a032dc71e9078a1b0b7ecd9de7062600b20e184f9a19e74aac15a05ef5e859d5e74dba4bffdebc61a571b1b554a88511fac443e2a2badaec5089223d2cca1a5fe38974d24b5353b9469053d4e814caaedcf04d18038e76d55ffde5973089852b5c8f10f0148fd68db583bae3ec6f7d411e3a3fd707bc426ea118f256474c229f1a06998ca4bacd44bbf1eecba8e4263189492009f46dc71ddd835060ba3b7a24e497148d41fbc0462083f87264984ee6e5c6f89513c88b4bdde5079fd180142384ea8bdd347a38fbace0dfc268b67cc8fa58cf63acf6186167e720f9d3407802c0a60563c560bdcb26b0aba2fb64393f8fa8ae5b071ef6c54431a2580aa62f2b61738b073bd5d51e589d64f967ca0cb36e5d9c656b69abe13c6a95a3bcd7c0042ffb24b1e0000a5c084d13b1f2127d8c5d20a26922ffc11c163a01c232feb3f7f1e3d849fa0ae3edff68c0b1e56114322599c74f7207c0dd9c4bef9cb441916a71d6afb7d21ae839059771e188e25a0d8e6f13ffa4a92e8e9442661b89c8e1c7757ab2e3b059a2a9e282302922bad6855f4b8e61ff0f9596c7ca6f26fbbc2b75c677e8b6dbef98a35dd00471fd14110362d4415ecd5e7c5dfd8911a55045f8dc2c765a169d0352903f29f6a15f1691ed5db333dc54c16c4bfd275481d18ace646e1f0eec3cbd59d950370ca191e8e0ad198f6cc4de5eecc8914d40a0c6b4387556190e21014634e4589f5059dbb386a95e11f5ffb15d843c7fa3deeb77eabb77aa0d629b34c66b1b1f0ccab2849f094bf3e1d57415e7bc0f90d0354a2b55e1d233a210441d6487e56c248192d6d3f3faa2a6140a54241da98c7d4da62c1d31eeb981220304490fa9098f7de31778cb1d3108bbabb53b2e723b512fe5c069333404519fbf309d8bd1bcf6c68b90b51a1e69b1d13e7f5477d365f5e2f13061700adbbb9062ea8784c44e01657489b3676412465eaafb998132d1106eb0c42f6fd90767fcd37a2f81ea8757618449993a57f4726bd97130d3f8484bdc0cc3f8b80a51fcebfa28be0aab2ea1c2a51a901b5fd6dbfeb22841f68e924e33ec77e7d4037e2366bf3c5ca76f0d8690be42c093e48229221d6af5705a77c07b3726214a2e5983730afd30e19eeaafd4b60a50294ebe05dc027d73cbc6bf49bdd719d1a2f2a9c51dc3b4633fa08ec39677ba69660553173649aae48e39319200b3981d65b6359069d2a91c4addc16bdce89a32d171090637db3970421b96434cb3ea2d1ae4c68d611f248488be4a4fb0f1f2d4f2fba77ae79e723e6ed3b604a9bf592a49e324630c936dc383a9f316197a09765109f71d4f7b9d779acb597b20bf2b3c7b1b17bb7214cb00c3078269206b28417705bf94765a01424f6a4753b89ba98a36f4673d9c8b8864ce41c0efcbac975deb55c88a6524e7c8131847327a3b1b3d05d6db9091e1ea162ebd755124269ef13563daa522bf9731713d23c16c88c97c6d293d5d59fc3a3e6be5693633bf8525de95bd8db71559a4ee41a1a79868fa70f855534bfdc6bf060b206347ff6093226d5538eb2b0d7549148d8a8c06c4f8412dc2e6038426c39498d52d2c90f211106a0a1467878e32496a87a51abd85091694d8bd2cf6038c109a6e8d8cee5b47175d1b19a8d282dacc7898bcf7c5917617b600a26f5c4763a397524c0f22857d5dcff20f5714d0b3f9c72895cb26d2876e1aa05b74bdd9907519e9325e3356fb0d48f6be1b566006f9dea0fa3fe82f83404922b1e221a15bada79b062129b8084d4e8fee9d9f1a1af44566b1fa148fb4b8c9ec6c6290870c73cad092ff0c92ee456b256685f7e6391185e482a5b2dc60fb2468549b1373eaf108f09ca1e5cbf31f2620ef7a66aca978258137e8c8fdd034e1fc3036b14d3e4cec63edafbb4d600007e95124f554b352ada4966a60da4c898912cada73fd50affb914dd097ff7d1297e6542cabc69fc7a6b769d4815b1b22a311e8305f6b6840bfe383ac80c9917d5d80bf3a91eab5fe972176cd34688728b76153df8080ce27bfbf59ec7e93e669e21f5cf5ada83d20084a86fe80e9d6c34e6ad390db22c98d838e95389945c2fdac2cf10609e97e54819a600f6dc6511aef9330eb7a3aa39a94b90037dac86e61450d4714ad93c1c38b79cea703e740562246319764b1a27579a66292480232be352c26c89f904e94ad4f966e4b34eb9e6feb9f3da16d0f47babf83f1ecdc553c02f056cae9c66df07084810e4c96991b5fe842843a583237e06b2afacc3e210236c09ec1931f66ff5b80572c0ef394f579a6e2153659526e72112158f211dc395806c756a38280e8f6abe0739a352253458d47979d57b813f81b2eb1663bcf08f1299a3023d604d4c96ee388f7428c5d4c0638b3773cad4ffaf01aae2ea642988891dcf81a053aea5d2f2a162d041a3d15777f11cdef774a01f8acf654387c10a5a6585591f66a5339577bc3456113182949e258a6585e2b949bae32e0dbc799d1cfd5f08f91dc36e54f9f374643c1190ee52a310b5fac1b3c41e609d876695b92771a701cbed8bcea7e5e1b38916a654eb11f4303eca74180521e2446f1ab7d7303f07e4065a50dcf4b7f17243357277117883796e799c6e8361c2a3134d528f9dc1fc2046e8c501c20ccd21110d085fd7e2eb4cc38c8d1fc55a9c4a2262f83ae6a6fe36fc1d5ae5a640bf507121ca77c4eda63aec77d8b45188c9aa0b101b71915a88a8a47c84e107e05270e2085b675ee52eb437cff1b4ae58f5333bc92ebc246915e5ce6ac59c6d882112f2251da71c85ef6944098aa9325789763302b483263f308ed87cbf604d94a5b7101c93af743c829a7f98e60a941101039f314f6f0d6962f45136b4e53e924acdda335ff8fc7572e86912a64139f1f64bcee951c8405427c6d70d5883a70d9ac79f1dd50c1bcd2ad39eeb4df59a96d3bf509f6e2775abf966c8851cd42d632044fd30856168b024dc6fa74f804c6c13eea2d7e71503bd4274a412645f184f45c67320039159aafb7379bb1d89b5de414a54076f197124bd40f859e17d2e0ea5bc7f40b204752a09394bbb5a6a6d89f662e2b268ad546ea47c43bff6c6a53dbaa79037233321b9f88e341c68bae9eb8dc8bd7d662903f7a28714b926b43468ef185457d9c605e723e2e152daf3a17f71dc62bcea45365c21e1c9c9f3de41fccd7f1a473805981e25e7c1f3239d2ab26d2e70e5576a3208cd2cf186e09d5485d04c7079e0aa3eeb790d6471c52fec20ba2f46ab5000ad89eec91a646f89f2709210f55445fc80bb97b4375352147c47036f726346b0ff5c1136b2e7132c92698d6cf78aeaa5042b0c8cb91c3cf34191b35f72a1bdf3bdfbdef639935dedbabd1ca11572411c1fa631e76830f834e29d448fd5eb28314fe5a2984cddb245d207da6dcdaedbca59a9b264d3361661b5d651710aa408024bb6069d3b3aa2dd8ec641139e953d4838c2088578901a0251b954938f60ffef37c96565a33ec21d4774eb42e6c9c81e437baeb9c6e3658f4cc2b877d2a652407aac5992036e728d7290336c64b11ea4f0331f725c849b60ed9f078e82e8b1aeaaeb5da2da2e5686b6a4a41066efa384c584c55f98182e3fda8acc580eac90924ee2ec08a612c0c17a2ed7af8be9f92639ed4ad207f290749a326154e4666193bd4f8f33e59043a6439b28ba32147211d3d92a6a3ac864978312811582bac71b9c7da1c5174b71ad897621c0f803c0d019d4be989eee1d214b97861a87fe13a262e9ee3cc988cd6fd24c5d445c4c47d9827ca1eda2f81caa5a5dfac462c4e9b08730aefb6afca935b49a25c4cd328996841d6ec9f56af58b15c259a38183bbde9fde7e917a0ba7c786cc25b2c97b08bfb5436fbdf4bb3a4c24612d4882defc75034fc78f753a4b6def7ee7aeef7a378d9c9b3f4a2f6d5d75fcb6e023e51b4e2c68013455fb0d06c1550ec6199da4b8b8806157ff03f5d19115300cc606ed036d249f2f7569f85c4a3e184b7352aeee992752443d20e92915e4691d8f86b8ceafcf76237e5080ce612108025cbced5bd7f7da7e94f4bbd68d10ce9d10d303027ccf22bad13d3adfbea47a75261ae482dd585681870de26c5ef0dd05da8a50414cba31500e8e8b02bb1edc0e702b28e611ef72d793caf15d142b20e24d0b250da8070e8d96c2f5d9df169948bb3c2f182e13abfb4bba6d2b451616acf8d3f5ba073c26bdfa891fc7a3125ebe77ec6b7b8a7b6e670f5aca495a483ae06e7346e8f2d0267bba3f4d4e9fa888ca26aa6292af7d36955f3a7d59cc481a070e779d1cf3596a51465422e13d3fa41657f4a8f0159f9120cbc81abf338c109b694f6cc8713e8ea93f761522044e3d0d8c69a31645590a73d58206fbf88adb080f794a7df505e01e0603b8837d5ac02a2467f567c7400f190d06e682b3dac5f751639a9007362b1a2a8b618800fbb9f6c08df48713db1b8ab2b51e05cde25dc3dfbce1b12045bc181d8bc492479796fdd12a44d6a390cc43971b31d7df382f081ae3c453c8cb1fa27f734654b9c4e399e6eb4ae8fee77dce0aa7b68b4042a63e935696fa792cb24390d05b21cfea3c75624f9b309e65bca48df9109299a85fd1c9a3fe17b9e130762231979c029dedfae3a59a300a921541a18dd48063cfb86c3e5a5e2df38f06a483f57015fa5694a4ebabec89bbd2f43fe5b466d7073f4c5851c82bcfbe9ca16936ca7941ff8aad0ddab0f6803acef5e9bb2b7bf91c6d8830b49c0b5f8380ad4ecaff1782bac0b38041634cc60fec76f9a24158791bd0f88fc734616feae166afb121df6a949f24c6a02143cd939213ca2b9490e98e0019c01a3fc2734d157a0679c1456c255c9d2b87799ff96e7648f5c7a3b99cdb81787c2e0ca2fc32c3540d855bce09d5af793957eaa5fc08ff82e706ed37358ccb710e6329878d3441910f846fedc63dfe457aa1d2fa27fba45e1859efae362a44a0116a14e488ba369da6c76c3913b6df8e69e5e1111faefb3724310963013c93920f936d4e813d08f64dfedf1484e8b9b071a4936f45ab6aaa754ce90a392c2eb3638f812a09453f177f7b47149c3c13584c6e58793c697924a5de0d1840817c70a7af0f1b736b5f9da5cd22cdcc3972e23493aec35671bd321094c401b9c51376668245777207d0d57b74f09497696eead4c504e2465c9d5f5fd1cc4af77f7a110a99e2d267b3397b4b034efd70345dde9763093a6e72a008de4584789c0916fd1e6665c0d6e5ffebaee88c8cf932c64a170e1a50415c4bdb36406b0f2a0a80871c782cb74228aaa311a537b794dd4e99be16b6a861822722d2530e7303fc3d4b8f3fc61a2be3b03e1db9ef01d5ac4d6a072d7cc7318c989c4d0ddd38bc46a3b6e13dc08e16bfb7191da700f03e1849178cb2cb2153c4368400d165e4d5725a55ace28a77751515c0bbfd1c0730b9d84eb937203b2ad16796983e26fbc227d7a45cdea25ad97c52c1531c9ebb4009615c172b1a99393cd2207db49ef224af922f7b8296ccb66df4978d861780fe7f7aec112f28b0015edcde1bd53c4c5fa22063836ee6319e5281bfc5da04fcce849b6b5183c91405b00e1c0cf09d7ee587e8cd0ef40f2df3d270b68688f58332d1395632f98a39d8e8ec66cbc7210e48c971d868c27016495647f86a0347c8bdbddb293fd0da95dd61de3ad2a9657f1bff52223b5ab78f11668e01cae99a11e1d30770f2aa38bc95a37a24bc27e955b191e017011d53fcee7ba97f339c6b03219924b9e5f62312943636a0d2b31b06bc19c243249ac3f4332e30ad3eac19210f78e9607445384c5b82aa4bc0db79269e0f7f13404385e981c69a38369942d00e0a9c113807d6ae4e212b6201219219d9db5d23deb828514cfd6c9cd5d476b49fc6d328abce9ccd0e9a50901e05e474e21602e14a6919d0073b1e3776fe03335726152349f9d93cff46b05271f8eebc6937f6c82dc6e8ca42f835b4a46696c0a6b0d89d8d2a3a52a2beb125a78b2f54b1c9bf64f351f3c482cd3980e8be900110efa4040fc03ec29b7ad996192d14c26e43b33435bae93349229028be569d69284afdd32c6c34f13c0390005 -MD = 1ea47ea434f0654e4c183c7bbc6880577bc2ddab5037393115d2bca4ac5b0fc9cad4ea2542fbea7186507135249150e8 - -Len = 98440 -Msg = 92d9f3841f99bf3ce5b946397f7a8ff2d4395abb3cfc61f4e54bdf8074414f79efe27621daafa31ca07836dd35725f5ffa892815e1f7b623d116cbce4c7290314f239232795a0ab57039611081e8f3be86e514570d9b50bfb637f79eddb7da1179434fa044c17b6f1da4d0b8aa04d47841f424690910b9315c556bd97036b38037ebb551830d7eb26e608abef9f089f6f35f62331d7d79e08b192e654d17a6e64fc3cd2e7e659be62c16970bb6d19a9f64cdd69e900a16330b2a472cbc8338ac8a729e1f7df25b731f6d008629d290da5be78790ace11a94a332c11505a2f338b0a1300dc7db45c20f0ecc169918f211a2557df2b7270d6a1dd6a1076f9b5ef389f78cdea549e239c4a003a550ce48abffbec0adfa07751c3fc0f1ec43970145dc1db97c5f64b84105ccae1a941a1b103bca59a7bda7dc14d298b9abcabd659773babfcd3d5351439c3ad35cae24f1a71e224fca482fc9b99d05ff2c4936114f1477a7bb863f35a54f917d55e61555da6f6eaafde2c8c5736ab0cd570b298dd788fc782d844fead1e779b1ec8315cc10f8557227d49a57aaff412a1457bf629597f03a0a7dacfa2d2c9c7909cf4be0b27f80b03267cc07c6255f1f4b741f17f308fcf63cba7ded23e59fdc9410e01826cd976c05e0865d2fa4b2b2e4ab733457a5c7b3aa83eb4919dc2de3768ffcfcd5aa41ac888af2e24e44e3edc744e0422b34fa793c201e9879d7ec949594c51527dd267aa3ac351d89cd9ad8dc8790c8d67e3c50dad83d61aa9f84f9da6666ea8530efdd3e8d7a9649067e7a0cbbab4ec04b36416cf4712d14fc9e1a2d4f0504556944de4176e7d6f7b838db3d2a585c51638f53dabce1831fb5e2fd7795cbe90051cc8394afa464f9ab7003581ac07bf18df08f0c78b6eb3394f7ac9e81df23efb030d62080dac8b9a7cdfb46d40b32089301fbeb7017edb85f862f8c5b693a894e18dfcb31b18b9d74f7caeda0600afe3b69a25dec2d1216df368c276b93b435f22aa57e0950340fd9977837c5e78a3b4ed1894b331fe1b5dcb0cd59f8831b5d6611302251e04b76a0550e0b8dca3a2793e0ba9e8e16e3fe1e9bfa094c61f6687073889d5288593a8fd893503e2ea22bd43f3c3c453a9e576ca0191fad56cebed9f9b6d95171e5c26fc90ff0213d4badd795170fa0b29c298f673482648a2ac7684ac1bc99c2777807cf8ad27e1fbc17658b53fee6a765dd5097521cb92492eae70fb13071a497c321930dde9dfc7dcf46c9f9f061407fd975d87cd4f34c8e921cef8e1c203fce0b83bc9ffcc5fb173f42f611cf57a67487c6d4b9925c2ca724d1936167efbaa3b9f6f34914404411cd21baa1821100cc4e0d30113e3ae96409cca232fb263e9f3342e0120e5400f3e3aabfb3f1d7770d9510978cc1d6ae4ea9d6c507bf0df248e22f2a02d24a5746e8a6aa4e04f133c1c698af330178a1eb6cb6a4ea9bebff292e857a21496a709044de267ba3a65b6f486d200de768eac6bb36e6e2770a8cc7800b777859fb745c5e17d941b63f18a0835793225bedb264fc1c33f73bb0c2ac3e8aca0eeb478a2fa01c6ba8250491dbdf1eb07b4650214f99313532d026c95fd2cb1aebe894db9371b485b8d83defa8c4891e1f8eda5e0ef83d919a1cb4c868a2931018362b8f0f39a6cf7ab732598f9a6286161dd092298308f23808a1e75018ad549cbf54cd2c61bbf0f5ab2bf819c96f8f69d97de428a059fe127c37509d9ae08d7f6956bd704fbb91319a6ff3cdb979e21fac287d94b9f95d3361bc28da92f363ca1e7b88656c6e59376e477334d24726407d1884f535b1b8a09d799a8c67af8084c5095693209bf10e0dfba0d47da304d5339622d17c47b7621ab6cb3d81dc89b546494e81d40c00be61d3a138205324e5b8ea7fb2f6830182bebbe67448422965898399b7ee872f5050169fe525202d78f35cc21f0b2f3f0873cf11ba24a8069d75ff5ebdd8d526cbc40ec165f2d2c896cc3414a1231118fa203b74967dd7c864f404c61cf8be8c37a401303ef1319c482bb99cbfa6f33562ad483990bb9818c3eedbf95bb809099dd83813fb88045295f8348301fc9b3d47013b853046b19ec149cd1e027f80470447fb9321211591861bedf0ef8dd1d9b2065f83ff86ea0166ee205e99b4e9eb74db92d83a232a02227d2c0c12c15fb1aaa3fb5884e40de9bac51ce0a9c10da0f57b4409cef60c4c710439fef1010c6c37c0562f47c6e000c6b60bcdb90db40c900f5a4f630283187b995bef14b39fb36146b92ed1952deb91aa334c5200a5d74c801cd183ae570e4925dc070441e12d311b6c7da9baba552387de86fb02aaaa32b4d2b8b5644fd5e28e026d48119a83ae28b745579b4fe4853752a23c7b892d4894c42b828c34164ebe164a688d915ce155e2ae64a2b640bea0d7c99dd30b0798083a53708cce78969b5fc5ed1b9061d08b34df5736b612d6acb723a772f8e02af97b5709cde5a4c10f27075e255d3a85b0f601b8be1602d64238d7e1c11862044dd060d5b74141d701b4384312c18e08ad713b10a49fb7c549a40ed426333330ee81965bb3a9f8e158507e254a84055f6beab6e64f19daabab41ef060a10fbb6c2d6202327e771e5fe41048a356e4894d1ac99c2274c12914f58a301d678639cb31627b57cc153eedacff0fd3b47ffafc6fe0d2c94ff087e1d30514df03312eca88bd29a1b004701d4446b03c4d6d2b634273aadfefc647afd132270c209b2ae887b4a596a6cf428d4e69c2638e467b3027047cccd09cd8dd7473ef4b2c2e8e83d2fb67ad3cc036ac2ffacedff3969ad18215d1269efebc09315cc612a255ea4aeef3f85bde91bd086d5c2e0819d7ead5e82a3063b75671a19c5f43d91fbbce9c3030d03908ce56009b0078826d84ebabcda4230a965e9a3519fe0124f0ca9c064b2477cb37b082431daa36c57b182dc1a7361181c86186424ebb567cc20ce2f79451676907f2d24e79abd157af2c21b60932947fd9f9d6478f09ec56fffd341ea04a17b8e5ffc6714377d09f961b5807683c244b2791fac37f7c1b3a2705ffb9f37111215e51cf59efa0cd23ac70412448b5397a5dc4742474846b9cd3d1a6781268dc48dd736d66f2b92f8a7eb57dab2f204c93c8fbd30922b565f562cae8c76193e175efef1136d123601a69754dea902ff61e15c287efee8192ea606c07267574b95f122f6b282f62177a191a6280f0169e7fb09313275c6b6ad2592fb223d29ddc6ac0becbe95217be1ffa2f3c0ce386de3f25f7f56de0e55653b9a04a3ded71c31f8807c3c8dd96bc82892e4acccef30de2d26bbf1200920dc51e486fd34a92f5e3e4a4e36546719b3842920f6f36edd6016268c0c25fc3d9ccd3a273926e63fd5e43109b3d113ae2a7b2f50a629fc9aef14269baed432d42d19628f5e9bd8731f54fd56bcec2452b5756b1bc258e28f158ff08fdf15f20e159b2467747dc5f4c3f476dc588de42cdddaa62a546769e659ef4a11a7d08312debd4a5784b3f6e9492e64448f9c99652912a824633ed6c4439dfdc90fed2e090fe69a069425b37b3a698e3569018c24228539b2f8c574535cffd15e1e553b1b317dde1dafbb44d21c0cbd58efa405924e9b217c1ae48abb2b7e8d79ddeef26fcbecdc43da5df0157a81b955286e4bd737bd2729d1835f243983fbc152a19a2e659a5d211ff3006dd92f4ad31d45a81a65511561258a3cb50c74e1df87577d7f88ef285f8565bc01c37e387ad41362835fc1b1ce1fe169962eba087a84f6e18bba5307a4149b6cfabfd64af357bec23cad73c416c6702ef027be383b4f670f7a862ec098d57d587f569f49e6ae2f106ad7d115e12320d3eb7de738c9f2934f7371e81ce4cff4c8b90e41fefadf4f943865416ed83cd79faeba9cd2ce7561e99e05e9e3300be603cf72242ed8f40596cce02d95a21b7edb626547ccefdeb82424c99add238f3d52ea07b1a428f4385d4ed0fc53e8c8fed02e074fefd63782492d4561d16665dffd32574e2791e8d232e7bb167052493dc33b271c032b88a6a0e002a789a195b64ccee9647ebbd7ba5dbe2be3b487a825ffb04d16d095d70c716687d5cb7b25a886e7455c724fc9d826fda7cbe730ed9dcbb602a51dbd2e9c04e75c51609c1f9ff5a4f49ccbf5c714d4c9b836d0f41e8c6e75cc31b44b943ea08a0a8510ad8a82df2e7d8e5154d756b14de48c387c45dc311436225be612da8f7718d7a2566f398dac6899cb15048603aeb635e77069745cbcc5e0db36ae5817d70eb1e03ed5ab47473e2403df538c1317b399a577933c379403d3fce472a081d2757a900ec4c255278599bf5bce5029ae65203a39ca1c09c577638598669a158fd49a7b6d4565fe73c85fc8317cbb8d9b53336d5f16fc1c76a9f940f9912f1a37b37969045e7c8b548cdee60865b38607053807917fc4b6d022fbf3b0fb45daf19a7f227b19f044f15b7ee08892215d1a0499d1760e5c20fb69d36765acc59be612146d797ea77173bca7805a0aee5bfbd7bc90b7caaca21e06e764bfad98a63da2a013a6948a5a0138c18c26d500c5d3060b0ffbbc9d836182a1b26605a4431fd38bddab638147c45634cd93fc41e6c91aec15ebea150ded64681803bcd3b9b42c3d9030f3757fe39e680b4a869805069ac9692f5efd86ea34a35f3edb0c5223351ef7dc4d4c4b8798c60ef37bec69b10e09d46e203e37807bbc4fbe683654957697d95878f0f3d8cdb49d35e4275bf3fe141e5036be68d5bf1ab02c6e3b0831780efd4b7c47bffdc49b82b8c83023f4f3520f7faa6761148b254a2ff202b620c2ec2c5e623bf61f05e483252fef09db752b6ea0842069636445e570fe73a689dc9a2e3931b3e26519f56924214c55d10a07055ecad0c9ead4e2489699761f954f7ecb83f196c9f88738fb5ca72f4efd3c4e9a5e8661cad362643c4accf36b6ca202cbe5aacef4ffd7130376c8803d889268f64bbfbab243973389349ed2d0355d8df5066542aba392f047198d276a9994bde1cb7ec3c964f9b7f7fb17fb97190986128f2ada360c3f3691eefc0c1d59cbb52386ca64595e12594d483f57073f2d57ea27ff7edc61664da79d20189eefbeb98326ab85a8596a7f55c21fcc6acf51674577ee16e6cb8f9d51cdfe313484f62fca50290eff7c8793d512be4306f3fd1eeb26fe8a9c71438e5926a0402940f981c0ae4de7a6eff3fb96df24a525d1bae4a4dd37c2467c098886520d2ec34a51152de81ef9e5db362160d25ad80d910f213744a2a72c136af39ff64de14bcb8555d9a6a42a0468d66bfb9367c6065c853d6d02461f965fed376dbd694308ea1ea88c8fe8634abd5d432ec953555a5aa3a00ec02c13cb871abcb84c683b44d0a3750d4bf18d01035310c21c276f4fb2f1b3e2255a6c14b479ea474e52b045a49c262583c88e6f613e398036eafb2f8df7dcb0dada10b90e932ae4692f8c558f92229cdf7350dc00a8282dbca4e140123e844286b4e902bcefe2554508b6bab90cd13a06fcb99207184494595d09cb6a4d145ed2eede36e7157c638be416bc49929bc6a16ab3d89f17f57cb31e5b17bcacf2cd6692d69fb68e5ed6e3cc94a568ace80a57c625f5f02ca3ac72eebf6e31e48856e9a7bb8352e1f276f4c718bb3de320ccd117f63221dfb6ed3fd61d16f17c3dc30436742be2969e0b67dd8a48f1beabd5b66510d75bb89607c2dd5d5823fc78db5e46e9df8f36cc5ce316d292abc6f1edafb95a2cc540acc2a20b677cefeca365a0df02e78148e332117bd8e294815bdb641abc7888fe5ee6876823ca7ed5252a7109a78adf544b559913857fd4794f697c901e05cb7a153a1bfd798af83f66f27acdc011d1e26b8d22e7bfb39236365da0236819b73d3a8703d1520385b0ce84623235c4817bada254fd6fc4f63e798077dc82fd74ce3395eaec947e4bb2c5aad241eeeb14a6785bd95f7efb291b7e9aaac255f929b56a2c7657294375ccb32a7201d3ceb5ec35815615d2a05355af73e0ddc754fe7b45144f19f79a298700cde97acdb58ad44adc762555fb9b7273d2c236c1581ca72e141e3ae8cb8f69145be0b4c2e7bbe62034de99ed532afc3181f7d42c4babc18cf68bc3e31dd1fc579cfeb89cad71aa1f51397884f2287b534628c0ee76d252c7803dbbcfda14c83258ec8d414fd4a9affb2dcb011ebc7540eafd00f121bae1477bdd2a964883540b56513b9b150b6a39f962994c200e7460351d9e1b948bf673ae12191faf43284b5fd6cb90463f75231482ea4d4047ff1bee31a156166c19b5e3858e52597fcc5b3b23440a2c9753d71432c7ecc58f9fd9dfe01289f085d374e0de94178d5dc9a1b2dfaef00d3c8bbbc11c3611f90dda02ced3f89c6bffab196ec430569205a5878bb2112a3255a539e2e842a422ea3bfe84b25b76cd022a0a55df6cf7b1a0eb749046769fe30b2ab8413ef08d894d4735c92444015eb5d6b05dd84fe2325620d08740e4396886a1a0a4c44ab4765f881064d1b92468413a734e57e1005d4ece02394b64df08ed9258d4255701304885f51f62c5c731cedbbcef032b3779b17c746e0dfd790c68854a99071f5d012fc64dc07f6dd2028343f109853470d0a6b38dee2eb7f0bc2103ddba13abae2f3cd48110cfbb2e2388f97c64840594a856fab580579a2a603d937901f002de039936f7d7fbb6c1dc0685c3c8a9a4894ae9d954ee30af1040e7be8634462cd3c56b7419ddaa667475257030fd9c1b39fe86d8d2fe60fd8aa4450b6c1cbf3277bddd174ee985d430350c4029ca04728a0c55809879908c81d37f029481011bb03314a6fdc53407db66e48018f98aaf66bb7f580c266765db16be2b642bb4ef686e3ba990375e075e4ed4b56450d5dcb4542ce997cf8e8f82b52a0f45e181b786b778a86e08abdda235056975988e005c1f83b9a23aac125cf8ea35a06d107af256f32cff00c5908e659e23b3985c244564ad5293306af753262725db9508409493d6bcabe651280925c86c861ae84f596bd23cd37970454e8908686022111154b546e1da84faaefdbcabcb56e4d9897f7b18fdcbdd65043467b68595dbd5f61a066d22f4a0652951736ec88bc0d8da9fdeaa1fe224f13def095804e48af9f6cecc730761033da1ed923aeb8d748d4ba2daae2a7f15bdf766b7176eb4f5281a585080188975281fb96136bdc4c89fe36eb84da40c7a713a81b91b4a6ce50869a0dabaded5bdcea99d278bc59986b7abecc0ae17f019b50e28568b20762241eb8eb24ce0aba5d94a812e608b72747ca90439fa0a93ba2f7c43d78f7939747ca80b1f5ca674f3ee074dbcde98b85c97e79f6d58065d278a8bba8451db1da361a9fd6a13b99970b7eae91a2c73d404af6da3a2f192b6276c4475a5f6d18a7697f54edc98a080e4dcfa3d9074a42c346d41fa21ec3606817ead5d82a9e0e8b7c794e4bb14e39317053f3165dbb42ab6796d8a32727ab5fe67d1586390929f2c988fa94fae0b39d0d9c2aee38b2a35517af93d1cabe72b66cfb54f8fd36e179eb3ed83e28f9fd9d9008a9a50ac8eb4cc18ebf929be04d08160632b4f9bfcb9d4bfb65cbade27ddf8239fdff5656911f0fc4da89fd4590d16c0e2d2eb10c5eb9865f21b20c42cacf6ea0a631adf42b385ce2631c7146f48ef973a2eab595016b04daaa85c6935ae9afcd2100742a10253357f7ce9a7cdead28e7426d69f25a3e51ee6ebb6f4ca4bae02ffcc03b50e6621da5f714db4fc5c884c96a1b609cdf8ff80accc768d73ebf8a39a8157601247b865cef83a648205d97aab8991c0cf7fc61d0633e35eb9f64288aa164c6c340de17dd5f9fadfe94c8cc0b8c5b0ebb39f029afb08468c23d4525837732801fd2062ca7a5cd34cb89b6bc5c73d5bb302bf7aa29333e7423aedf0bc4a803346f4e903f6c7090ed378593c32dfd9da404349f7dbd79c0ea684aae65ce925b764a1ce8ea6c4e8f29eb0edc8ae098174b9fea441edce2b03e08b71fbdf1f4afa838c38c98478e2c9d2e8c1d7e24c1d7246bc38208181c90d19d7abf6eef1d745c93e907e38ebddd99aa93c3176b0951c11036d5c3ff65c7679eec1a03069b4e0613e3c736a25c26c1c79c69d113dd1ba3f5eabbcce37cd84275a19c14e8ec9137114a671c12f7ac880e3c7e45bfcb994fb525a09d74c05804ca31d21ef68fe262249343fe510ec35ef6ca7cefef436f26b69e20b013bebb20f4f3487bc003c609b6450a77fd0fffd919ecf239f2d2e1bb72aab8af50e666199e8c5bc5c5d690b05ed616f37789d678d00a5abe9b08b58081d1d4e5acd60d611f63a8978876f6d876ccf60b40eadba0b1a922e818433f186cba11ed97ec05aa0fffab4b88734ce4a6a01429f9d163f3575ff7312b1102e58bb9dc41a2b6e336e8d6d05c364a278756f61dd9f2ac23e3198524342400856a7757b06c4db51a9a227fb464226a0b2310156f85dbf98fe270bf566b93805b39a82a1ad7f97530665560c3ddcd615c3a6aa485d806380c940574ea420a1ee8b5a697981f5665b90dea008b33a7bebf4fbf19fd2b11f62e5a303c7c51f84ab270eb26949cb50529136905771041d098d595ec42098fa269b7a97c6905de823cfdfe6dbcfac5d1e4f94ab613ce1c457d6e77a1d0fdcfcb533ea9cb5ce83d540cbf58c36d93e96a813217b8fdf7979bd16cecc1366262df5f51d99fb473853e962772ce2302902d824048747207543239735dd0fef1d96cf293b1600c3256b06dd8d4f479c16a997cc6657f2c97d2b719f453377706a3e2b166b9b2c0af2248084617ccde4ad94cb516f74f9a038388f772558b4b2b42df205d6b1e7e346873d9f183bdcd295ca5dfc4665c26e4f726567ffd42f7da46c0a3ea4df9918c99a2676dd14dc2c7753361514b2b7fa69e1dcb6f82d4f98e2025d09fcaeaa6f24672351d69035bbfa383ce400e43f0e2f8edaae3aed7bcd15f7d2ae06a582b1fff61d772b364f47c78059b03382c17049804895ed9b1de2e5545074ec4c89a6014dfa31058e9298853374c3d514a7e95ebf0fb438c09ca0fc20c1a5d32b2815d376a4c78c216775dd5a75630d2258411654155344e360cfff630c87e5cbc5c71d790181e77634a777fc43d903353c401b4644ba398cd137992519634ab3ca85865cfba63f1662f7fa21c86de0d4bbae129d83303e44579f706fd0802a6b9d15b6297980bb875a2a0fd1eb66cc883d52a662b9fe7b915ad12c481928ac7ca83f56e862558453830b5d15940eeed82af57d9cd06d19fe429376b9dca1f86d51cd0e9fa06ec10144618df4abab6f4cea5f3f53afc3401077aef6c9013437c6028585581a139b1a07f346771986766ce558958f3e48175161ea5380702991102231641ab88c3a25338a31a5c4e72cc184a827596546c748680e35e611c82dd1199752ee6220c5aa30eef5869515b9d22d169cb80c03777df5e44604cc5834944e80f8da0018643265e73b22745a4427496c9cb51bc850796e322be18a23cdde2bb3fde97abc41443c3dab824afcf5494170d1577add7ac33dc18f85316f213917fa0b20b85481681cb7ecadfd44f5bf7bebe0a6128a1ce3c85918f9ab85582c7a1bc789a3284f266d1fa7ab777a6c1161a474aac9175f6279c16e44dead9940bddfdb2b2180d107983b83859ee682c85a65336c88cb6ac7b7c33a6eb42f0cfb460eef0e1ba32f9203d429425cd05d6bcdf4c5f338f0669ae92524801452dae87e70aa3b7ada925017b140ea987f2882241ad347bfcc7a6479b0d381e55f2b8ccdccb5b9246d22c73c9c71863a3c0996c69f057107a7cfabce2cf079119e26719cecb79003a40681db5b641c294f282e1b4b0278f6cb8cfa506122717f57f41e519659c9fec667065ab7c0b74f00aed28be67364767fdad66717126f17d2bc1b5693436bfc1d6cdc23782e5c9397c30a7e37ff3e6e0ae1c97b15687ec156a7f111ab1c7ee7ef3e8d9c665515dd5b8e5f5c074f0dc5b5c85af424cba3652ddd27eca58d0ba68504a12f48dee9159538588d1e0ad965c8b8123a0ce3e8eb9d85454d4b3d182127e79e43e870e1248de87e7944d9aa358bd877b59559543befc8d39e63d5b0401d0f0e3f0cb403f08bc757894164891d455113ce86d5ef3e6bcd5a46b6fcd8ebaea3788d7d515962d7fd6d23dc527d05404a6eeba9fec2da58bd62ad0c5b9a0a23cb659403f0eb62b8b148b1de4c8fd5c2ec0e76c47dd4f800bf713b2d99fd85c4b15cbc6539bfd9780c6e9910f9c675145e7dd5a0f92e81a9fc1158e05f0944d97ae56d6dd3dfad5d35694537022ace7ec94372051bd65b9c9bc96cee55c72faa51880fe16753c8b054c11b1e0ec3c64755e6b3bb8bd67021c521df20223e2f7f5cce0a8a9c2110b893fc858cc69a46b929f00289f036a67fa2a2193c6f772a9fc33ec7301b536fbf18a4e948d1b6371a6ee9c638f3fce70059d3830ae3780953af61ac9b8cf1cc0b0b40b11bd91f7fb34b5766903b321aea133d8354274bb5e348bd229295010ee5955944cd83de08cce9c44c5971df2786f76682e0e2f81597b5dc92dfe18d1f95de760a2679fab8ad70b7df5b3c0cf51c2ed8e977bd8510b61f466248169ce6630d1f6bee637b799d07b9875e45c06ef4df1b1ee160fc908aad81fc96dd374b974addcfece86a32e6d651ac293303795533b58be672647c598817c691dd653678bf369ee9b1cecbce0607b685afddfe895230964e9cc6bb6cd7902a00bf2e8f4f91b440ad66af2b9ebf630e3a6157e6d66314a9e08529370bc3728eac2a9a3e64ebdf1e00ae153c9d28ee1a10f07817858ee72b65d595d77e74475c5ec7b22cfff33e9eaa3109e5156a2f43cf05497addfd3384a63613830c1196fbdc3e7d3f68d159297298920e4cacaef13e47d0f728d57f1b684ea923fec2e8d3ee360360e6aeb828218bb99f8b17f48d265f1777ac41545a76c562a09cb1c44c5e574d78c3b2e4017fb185811ad3887d4ff426e0b36739a8974443e02e03b2cef34a626d4504641e54b3fe9a4107f22b81af031c836fb66d927356ccfce33ac174b74b29b5cdc0e568382cd348dcbbfd8438b8116482531230f9a24c4e77e58daa450e925b3481c083e9181576796a5d1f364da9a0c899fd397f2f496be73a9a5d9db5927e622e166c6ec946150687b21c51c8ca7e680f9775ac06a99c5cc25154674710677e4f4eec6e474f6bad9b644132335e458a3e48ab292e5629fe0318594acdf35fb16cd2cb929b19c1942ddb5781954c3e58ac79a59daf365af4875832ee4e25ac230e09d181cc8b5ee3c57e25e5f77cb1f7e39029b192337667d67aa8fcd28d96fbbc5bc5e3e28c8cc3ebb7750760d6e5926bf7000dde34c77e76e4831c62136762ff307162e606915c28ee0d8fd842244fca14f2589b209362f1008bf5049f657f5ef09ba4dfe0b6d50389b62468a8b4568a51c63ad1e1233acf358830c219da7b61030c51d502435605f1386e16f0ded03215465d895ebf2f96ea4174a4690c7d90d28c12d0548009b48e5b17ec02eae54bc73866cb7faf69d0897f6ab17844ae74c3e38fd9bdb4149bc8e7c4f2c620bc5cd165009d2c3a0f04790abaf12cc935943fd86ff728299f3f08a31f2f25c87eed9a95d1094da949bb22aa0b6c6ee53b78af345a337a25d32ab458d0ab052952878a8f8116ca44417cec27052b27dee8a979bffa949cf1d7e336ce7f6e508c61b1091db9cc8b531ccf3f4851353dfd63ae0741f42276d5d4f2f4cdd381ec39d3f37f052134791e053c83d697929a8ad50fbf82f3e5f018f2e0581d74ebc378cfd5541060557aed224c209a7e4b24cd65550b499de6f3045833c8850bb4bb917de0f0061f3877079b867e59af67c50d3c0752609a2c65df2f76aecf40e5becb069bbcaf05e359b5997305ded2ee649481adfb8d93bf30f29e2e71c1ba84b370928e1ed3bb60063f44991ef08ee9e8a85dd0709930a83a85cee57924229c81c648427f39e8b768edc3822f568b5f3b92f8f7184c18ee6de0e7222ebf1f321216513e48aa35ee66063fb6a2d97258449a79aa5b6df499af4a106ef85c5a504da7d50adfee490fe7d4dfbbdd41ebdceb070971a1c66bb2ea0d71503fc17afd1ac3fb2faecdce21d59dcc1b4a569df41823cfd5521d263f056f33506bb7284261b0eb341b0f692d17aa2d5e4fdf31a7b334f45dd63bcc4be8b97ef6e4060c260ab7cea1907bc43a95432b0a56a64efea4839f9296e806db7b3279cb1276cdb1fe20ccff74da875037b0eea9c6719dffd358f9faf8eb7cf9a6244d565ecf14eb23330cd52ff45a77e5389dc20709c6b429fb2a1f650ed5ac51d5211f2ed888dd6238b7ab2991e3b8872460de813670258cb359894617bafd648e1eafeb5ad28ea476f40ac979cd1a05bc61849cbf4359e5c9aebe01cfd2f2c7976c8dfe1e9906cf36ec787973bea64748c53cc06ee9581d85524800fec69662383241cde9864eccc0c67fa1495e633510b78f5509072a1a2f6dafa96c3dee1db99954c286416d845caba7a7c15759b85c5d03c35948d8c60f267966e0e004e161c84d44bb716bde52c377f4a44e90b673df2272265168086da6309e2457df947ae7b4ba52be51c1e93577f0b9ee11189e6674ca38cde5c790155bb8fe4987204a20128e11d226176a2a2f03cadce3c7251a8034566254edc19a831e375e056b1a99ee27c152f2c71dc928969dc30eaa5022ce164ab8bf61485d2f37973f605f317ad0ed2ae9bdb94a3be90ffc499ba866a6e6d9da782d0b6d87e76be594a0e3d9ec4048133d90d539a7fad8ad1691abb1d051e6cf4aa7d378403422eb04cede5817c7a045f672033236e45778d3f89a77c696a4f0d534a1b0af9cc46f38f03af722ec5d89bd6c2b7c102ef62728d85c01b03d7a07c2dc5d5efda9b93ad811defe3538e7a53a8535605c601c80bc3adb97b7ced2dab8a7efca51e36a148b36b2b57a32a76114c509264303304d3825fe8103d21333609e3f3cd4d13dc4f9699e6316620387f3348f16ec9e9c5443a2ad06bbd1a4d862c836fcaefb9b14cbb18a52345064dd81dbb0777fb9c75e86b8d06f0751ef91652eba5106e9edcaa9175ec8fa85332d63c1529326dc1932a96f500410dc5b2811d6b485042499af3aa1020e9088d63d44ee5eb00790fa9a53cf130dfef9506310ca0dded233098b27595e6c1fe1b7d5ca6bbd174a5cd25c2ce102d2f931360c0712aba5959ea32617475b29cf193cbf9d3f551018c90941ddac059b280a76e9a1b4782178eed147b372df8fc7b7cfc2667210e2995e07110e3805afb30e76c384ba5b9ca0aafab8a3e2d3e43043d7a5cd0dd5d7f4a33594668ee857c3c59f61582b3b5c385a853f8e9f20713145bc3179178b355220f9918eb598db80b6598dc61002aa6686dca51db2ac7ef346e52e13981c45da5ebcd22eb5fb8311690d0d757097ce52b766b1f72261539ecebc6442996f4fb5e4e71ded97fb969e6621aa0f53e21026748b2dc4f726375963a89aaf206c9b0a3ae03b73627f5e5136ff2c39c2cbb80746b3df2e39e2744c8f119a0238fb7002e911f4691e6e2150600d5b9dc33a0d1fb44691dbf17f50a0d95f2ae2e60418c578e00f77d4b228c36cb5ffe36117589646ac097327e4147dc9fb13f7346fd97a6fb756448b32bbd3e25edfb3a14ae194844e109fe1f9070ae84b1cea2924fc4957fd8f794bd622a74b6fc4b38dbbf040f7926d0729a67370bdb80f63cd0cc85bb61a83bd1c86a4692f52768e2c53cdc226e1ea5206d39ed6d1abb309290d87d81776fab9072a8a3e146ebdea86f8c04399a44d288168d165aa8acf8544107fe8ff79bc1513aa1d50842b6170a49310ebd9415f33a04d5445d2be2c7e27fefab1f88b907849eea2c706f129c78d0d06e16d22e8186d6b6f9dd1b0929dd8bd3e5e89143f8aafdf64cb2328de97494cea4eddadb082f0a86a952dc7c88a613793153b7c92f45063aa826138488ae13a0459b24c7e1730ed8c57706a98ecc95243fe942b4e5e3163bb174b8a2f465cbe9b2b73661b7f35231f082103c86c19f895431e893e6f5cc8e0b066845b73c2bff8eba8625063073069d3c9f921b15810d00961ff29d0d87861763c8f94ba1c2764c2daaae36baffeb3deefb46b648e823d7be4f3d629ad5d86905414a1c371dd25d890a59c3e347344511b9c6e2cc43624be2fce0e21e45e972636794b35c9c9835452bb45859e796655d619f1b20113cdfdcaf999608362db626b285ab82cd3c85ea854a4e7f5f75f12a693be9d4d037f5e3eda3f8f95539b6a7a8796f6a3e33a201bd8830d42d478af16729b96b0ee830911dbc8561f181f66eb00c69435e123bf32afa89e8dfaf954ab1e514533ba2227ce63fb5c2b99af7f47f9b43debb5c9667642db43dc502a2befffa851dd50a1e0fad9a14ac0be93dc14dc2697cb47753b6df7e6a439be5259697d6763b7984b5b1fa782c7e76f12a7dd10e54ae07f6e66a1379068ab2cbb09a1015822c77a67c1c434667ca794750527fdb9ff2f46fe109a6ba0383b82ab6120f1413717df3c3972e81510081505207c0b695ec2826b61def9dfbbefa86b896db7eb49afad13ecb02b562c12da072063a2bf0ea01dfe80f74b159ad18743aa10b91e0195ce34020665f378cecbc62d652a81b8d1fdff966dc7097ce9057aec9261a107d328e7a2fcfeb29b43d1896d090b78035e0cb6cac6d7850a3d0b5a767a163e0271a574f41b5e5c3e79d2970bd7ad6c984e306a458ce24fecd8822971503fbb9a752c2221eaeeb90879b7392d5779251ea953652e465030c9bf5030049d46e178e9a43b51f21490a24a69b7fc12d56a3e775cedae7d88f049fc5fb758e7927844d4f705abb939aab3f4cf599f8f2a04a0c1334bedb8f4571595950694b98b48a53f0cc958c9c6d0e480d0673e56e1bceb8fc0c7127ffb2dd595dc64e19899184431cbce80aa21c8ddf5562803f06058c7e7eba8465a053930011b1b670e24b2c9b21c5e49e2b45a455b48e514e411a0ded39c38b0d27a44cfe33a714da294dcdbcae7bfdefbe650c5bb8de699ba5b5ed55abbbd796ec3165a4220afbcdd515f2282143a657d1e71041c0f73bbfba55857843080c8b746777827b71cdb45c30348e18b1707eec684ab86b5d4a12e59570a5ae3c9c6346c2fd199e602d364538ff2f0359eebd845526101675075dbde2396e3bce09a6d9d050ea095a7cbc267cdcab6f8173ac203a3cf960d305c8a9c84a428a40c6eea42c3d744ac54ece56983783bbdc91b35683e9c4c90bd80c4fb42dc2f81966734c12fd38e14515e57bf7aa4876dfdb7b8dced712cd63c09106324e5023dc6afd28412ab85b3e648a0d37af5a3eefb35d3c776f63cc8f81ff73cf468a9bee46e4cf1330732725bd2460b4b13962a0bbe0e91a2d2864e38e800ee780c2aee38cb2b725c8d9b39f726d3d1b4a76807757af2a239ae1251438fb3e1797a8fb30aeff56e53e8caf10469cf8c7e59216f809006620331e6b7623a987dbe59e0f7a102354de1bec780c8c6c0a371d0ca497529d23ac8040c6add12382b115223a1462b7076ceb898d08c63308055b56b7d9c6cdf904fce8c50fc3e1a51380d629941923053e27d47c89768a68af2af0af23d82b4cd61386c5307e6c659fc31a4c7da60fc4be5b6dc4f33feab291067b192a092da5ac6eab65a4534c5a92566f21359bd5dc69e0a5d4fa64dc6c5768467440dc5d79d468b724cff4e9eab7b56536505d0da2cd622d4af397c7fc6edaf35f0cb433500a8c3a6137d5cd9c5c6a7cfa527c2fbe655a5485734b35e953d90217e23337beab63c5c960787ff61cd016ebb07ba485ae33cc22edf1cec982ece36d75dbd32c3369b9bbde5f697e6590d398fede14af1488f491e81dcb038871279e1c10be1f2f18b6c705ed329bc32723709215f88134b45e50f641e32dd1203f485964210e1afb2d597bb433d4b20d97012ea5b8a29b6069ee7ce08fbf0954aaeac268d48f738b8e11a45705cfaebeaed9092fdd9994f7c7d8f08c292d7d98eaf3cb7120f9c534695e141820d335a4cb56d5f6ffccddf4d89ef5a757ffca678001f92f9f038ca04fbd5faa1d95e36a8d08f9ad67b2b2d21cbef0b494bc5c4b0a83bff6b703363991adcb7f347e147a547e08a5ddf1d03a1497865657d9cfaddaf7a459019f6e7aefadfbfa3df2555ec21467929af0a27740d70aef29de811a71ec2ae8f72e71deaa4c75bd72992282466abad65735a62431fc12f173411d2b8fcfd8090036fcff61f7ad3b8ae9187f61ff66f37b4747cb6855130fdc97f02b5511204bd55f7c37973e26f6df5883c0a530f07c7f8c23d74490af9cbe4996c4925e9823cefe5c21ca9e6771e86e00d070adebd3ecaab6d2673d2d1aa0dc9d71a816a423559a29487c86d32f5ea02c3964c4ad9c4af97d373099302c2cd770ad06c7d8bd11c970161d861e917a854265e223da28031ee38041534d23aab09ce14ef0aa737bf2bd152e2a9e4af4840fd08939f619bd71964809e9d8a3b30e8eb8e11f9dc91cac5cb04ec2d6be3532d123ba8565f3d297e1f90adb671ece27c29e5da327304c6cfb91c01d5c6db50832ba0684be18cb08631dc4967d1764c2d50c1529db3ba3ab0614526893cc0c7a911dedb6632b3f399610b7a98f000f36427cc8223e6dbaed08b25653116ba40098c9e099099d87b2078c6483118b3618777ab71aa528eaa970164c5b59df0440a6388fbaf5d24ce813fb4bc1a8fb71d000809271b41fcb76d8aab4ffd168b5a146043b8acc7be76267b7edd3b9d33af35a28cad5ff94d5cbaeda209f1ccb20b8f497848701fcefb75f7cbb47c8c4fa0900ddc0a5cc3a822e6f3f0fd7a068edee3e7ceb4e2ad7ee3d87a4447c6a235767710a246fce6359059643d337e0b475b7902ee03e9b8f4b8b6cb91a0ff290abc5475866a26ac1e2e7b0833b1e624040ab7627f3d6f8a580177b359c71167f9f78e022f7dc25b8884b5a678819b99ed7406ce2a6b5b69d34782fa44c2e2a527b18d804687b73c9d1b6d08b4ab84b22c20cf0f9793959e8d114168fc9b5c2abf71b9b67291ef97857a0cf4903588b7e69678ed6dc00470ade71bc4265a6640e7c07a6e5ca151b46829fb33b32991ef465f6b3055f792295b5178d86d05e72dc725386eacc2c5da6db1a18dc78e86a371020ea0f6422610c1d8c06a76a6c93a89285b7f09f93352bc9965c9716d4e1b9207cb05f9a8a86c04035c43ec44f3af52514b691b5083657e69b1b15bcdd39fcff70926053201864f5bb22b75e84dd44d2970f48bce9d58dbaaec0b2db6fc7750592fccc3e617a6c8672bea -MD = e7289fdf3a44e9636b76dcd8d94a0e91ca14e655067b498fec91789ee7d3f1d929b31cc8c0da83344e468e126ad415d6 - -Len = 99232 -Msg = 619e2aeddb1e23d8db1e5bc3a36fb514d1bf6f2429580197950b48e96a66e34aed2edeac16098d1a947abb4b10120577b6e58069f23ca2d677895fed86a0922f6d239f814e3e567f21951b14fc7b44479265c358fb9e050cb33c1a45e45215d5e867b694092746b18c59c345ef113d2e6e27801acce7f3e24f0ac01a0de635e666e16b0ed22b2555ddadfa076f3cb7d25113ffd6ed8034ff55dd9b9387c2ba07f07905172eb2ba161a780a82066479db431187b5e7cf900dcc9cf1d9dc506ce28c17ced6a724ce994da439dd3bf14cf24d0961df403ecfb1bd2f0b1393f6131f45a30c74c4ea29897d18d041964bf8bf75e3d67b8334b8952f7d316a351e7666200508190d6a938cb3bc16d5a0db45e9c5872cb2351914612a70aa06492f5e5d27260aeb0b0dd44af67855c2e007fb1945ddababe054abbdb7efc00e579193af61ec5915453bb36d4e34d32fdf38e1f6fcce9d8f0b4f454fdce3b9aae8abdd02d6403fbd445dfa9ac3d8da4523d7c029f24048853f71aac2a332de0483e704ff8f0b020c8ed96f7b5e4cb02b364a60592f1cf6b60322a1bc14c57741b0accf4d9333eb29ad19dbb826789d0aa0fb892fbc4bed49dfcaf4e53684cc8cf7630794eaa2423c298305f92445eb0ae7500352a0b475675bd169e71157240be172747e9d3e4f6f8881b7e55e99e05295b3956ce33ed83800a0c967ad27c9e6f542deb1b3f159e8547ab724de5ec60b318b09228ed35ce3559ddb1013da0146bb3b0dd534a1aacf14d6ce5fac7ae35c4440251ea75a4b91e33169874a5a1553bcc5c9932938884d51fcc43eced7806e553ab20839baeb6930c439775a8d4d347f49d993999d3c8a925661684e5be469ece0778749dd8594c6bf15864c5df0128d2d067c8cb80ead5f4b6d8633f05974929c3e44e1aa60392d88c35c27b148146cdb18f60a7145de4043af3f867d25b7cdd5cde70809c681eb890ba2f3709b63a6b9d7ab1cb02b47bea6f03c4ee9915b28f4ed17c7e2fd948a29b700b8843226c3310a40c95d060d60ddf824931ee588285f667c251d4e9992cf8d1d7fd4558649aa7b601a601f5baf4e8fa05e036965577f00bf2aa301b889e557a24f484babc28cf0b115a1be5732627d58b680651b3cbc8388de5a5e1bf9d2db3631c85ebcb53e32dbc4092b29718189f3a37d20d15f7fb67e4a2bade769fee2822c3cd4e1ab2a09872f7eadfaf4147d1a2de2e3b0492e624a75fe354762d1332e488cf6442bb73c5d5de98df244811f745d97f6e081334f9467bc3f616bb398e18da10c0abd4d950456331438e83238aa3a85a1888ff44503294b135d0c0cd74304615e5ee954da25224287f5688d8f63cc922cd1fcdb0c3fc295f964cd44b9fdb4b533663834d467ca0031504dfcee481ca7dee24f4e6bf13a81399e37c306b7a685d54a31564b73555459721de61b0031ad00e410b72cc19af61a32d1f18618e0ba8a335d2007f0cb25468263b3df34148adafec87d1556e9dee548233700c96c3a9b4942fbcf87345d41a9a4ca028ccb28b459fe08ef592f20e30ab6fb3e7252ef50b36a506ce099e3920f6a954caf606dd61c3ac0817174a4599e11a606ba98c0f09a5d85a7a2019f81db3c7b8546da438770040d9547c152922cbda121494894c525a104467575795636a3e474f84291117de557f1821d12d5dd405357c86955157dc0331103fc5958472638e26e9f3fba6a64065ecb91cc69d824236fdf04ea29c9427cd2f19e27d0374de09750f934cb600a82a4ca24689746f07b3335203b4932ad464fea63cb062da0425b45595a8b865d338b26decea74f2dc26973c530bce08bf85194542d4252a8c7f6f5c6984405e782db88c7e6e11a625fda40fbb1ccfa63fca0977836cccdecd72f0948d63c0430d55b97e8998cd017bc4e45cba6bfa8beb9049cd8ccebc7f4dbcf29e7fcbdacbe95d4fc48cdf298d5408d2a3cf7de142397454b7ad8e96849399ffcacf30d241b2b0f5eef6b599b22535e96578c71631afe2a4b68430cd7725b642b9ea17495cffdd166e65c0a01895d8a31234dc0c02b567d45aaf39d3df7a7e95dc5ef3c276075e5bc34864df18fc6daa4a8231251df0704e046d2e3c16187f53b2ac5ab0158fa1207e1d36a93bef71397eef4b13ebd7988c546c7288c37624f6dd40c0b4c3ff31feff62aa8109d5600b1feaae3b04e15d09bb1b9b2c501a0c09acbaaa22f9bcad51e7a725090b44c689bdf2bf1cf1841a60b9092cb9548a8106a1889b9d3f6e6fc397595aa3a8c4212fd996123c2a566d0bdea39b92492e40787c28f9760d7af5cebf07afe37ac9ec77d3532c0b27ded1758c796c4996abb6c96d1a686fdc78dbcd9f10994af9cc94fc6ba8812c6263c43853091361d559509424eb5ccd24de8e5ae832ab3c9e52c727e304a5f272abd1ceb2b1255d7dddaa43040a4b208f128a010abc5a5ad0e2ef84e9f60f0fc11d76933c3016bf089f3060baf5b80c73bb5b3a873c2b0849f36a8dd10b10d6e61f1f404fd46be8fe146f779a4c17e36b4f8e61de2091d7621ae4bd48a27fda5a4758307e3c996dd6e3c3f2225c0f47ee3570317008334aa1bfda9da16a90ac861cadfe37c733d02b73ea5b03d3f29c6503bd040d6163c49158b8a98bb207aff2158d041d02afa2545b2f2c8f1276637840d173d6bab7f7a97c0b6b5817296746b871ec9e8d7146e9e01ee144b5ef3f906339eb9c82b43662a04f4da7088a64cc7bf9022cb63d4064c94613c52cd18335e172e5af37cd13455bf0eaf914af2b2bd68eff581b48215d7d213e80e5c1d0e151f8ec8f688710da159cadbeba0c1ccd6ea03e913b466c2c522ccbf88f449b1b2b588acd9356a19953af10786735dc299ad94a78849c736a0ee5369c77be544bd40e2aea26d067fb9ca4bda6ba90cbd8f1a6ad6e85def99ef9d718fd3db39f1bf2865755b178b6895729ffda12c17e53e974c1f3cd724123b97eed9b5fa8dde3fd4d9aa0b1b42fbb298b71730e2c661308d042a8b9fafc90b4392ee74c22933c5ae06f4bb61736197a659d121b5605aed65589edd9dd8e7e70b247718195419d91db3fc72d066c1cc024ed37b8c2ff7fb8511243ab9e69457566e1baae958b80489aa6a38526244da165dc4464e7961e457f763abdb23f7e48d368331197b37cd5ab1e515ceb1124848504d8be587bf3041d10437ebd53915164556b59106bebdf99115122d99529e02ee155138a13a65ad69aee7d14581735a633d3f3941775acc12a33655632d65abfec5a02f0efa0d02850ac275bbf885c157e0d5f973882f3cfb378a2f56ca24aa490480b21826afa8eebfd0bf7ec6d3b4ebe682b9e519c1b2167814a3bc526369977bfaa905e6d4076c761998d812e599e5f84b61e0539a94290fde9adbecaa4fafd115fc1e640387c6d7a6e60f0444d90ebd3ad9aa5d414bfda3f0fafdc182c45bafda94abc5c490c6897e936cc677dd2ede56098b603e405add50ad68f8723061bd4f57f4349f8a3235a985377d060c0d02a7d9cd841ada0765089964ba03fc8aa27e2e40d71dddd38230a6b8547acd72d23632b7f05c80cee220a83b2fbb8e9e076f01d9d6c5f171191adc3771598a27f50afa90cd8c9c75fd9ec1337e254f659329b9055a202ed4a16f11fbfc2eaaf2142b1ba1423295c55d8ccb96d0c6a7a7efb43c0d8bb4fdc3c3372c4d1e7e959cd7a27b3278d7d386aaf1b0aa4c28ff2bc2187439900cc407277b1575fed3b2ede576048a9702be808ed657b81bd2bdbab55d48d092adec687443b4bbc6b46bace7af9cf3c63cbe7aaf42a807644c4b1c708c9f1cb821deae5395f1669baa27a384562db32d0c3b3eb53d8be1501f0f199aad63632bef01a16b7bb4c0a73c4f9865729e13f5fa9d9249d0e88c07d27378dbc67bee129fbc0965fce50f12f24954320bd75b468e4c3f1301a751b0eddd03dde1cf0596b979ade8206c9c04547e9f922ac0d34751b00dbadab07873f8b780450547efdfc69f569df031afa4eb56402dd541c321ca31c3e763eb49797c68b8be3bcbf6144e96cc2b731c901a3e3a01ac174272fb82382b41a3410cea015873ee8a43605dd7c5d73cb216868fd590a8b7f5ab29feff2b0b71a29808ee0def797dfa9776e3eb963f75b305da2b39c1fef579643052cb742c1e68da86ab2a95911493af80ce1170cb8080d3d515f136cb0faa55cf1e6e7956f1feedce4cdfb2855b5e73c646d2bb45052166bc768556d7ac90674e8a6ea450916bbb28f7b4ae1bf962cc8f72b4e073ab9ca8da757e88e9753480f4c0555ce4a8b72adcd532f11c97a7a0257a41451d1bfb7f763b6336cb129d890ae5aa08d8dbeb24310de0e34fdc36d9ce8701530dfd46d5d7efbcc7432ad36bd824f612f5d40d9070c747ed7e71165dd3c17b720af8839146ba12a31a65df0ca6a3c0e1033b2855e22ded756ffd4f167c4f370bdbb4bc9b0bc4eb32186dc856bc8a90ddcab7415dcc645ce5eb29eaea1059bd8449daf8db6e34d2db04e796306102ee6e11f1628f79971ca3ba9deec3d90996471c124039b7324c09a77e5281df3363fca29192d330ecb319a40063881d8549ba1c039b9d2de8e321cad803337c4476ef433eda11388babad71fa522125f55e47105611ef197c1e8c339db12d815db0afbda04031da9d8cc9e835c27539825d55c2b2aa17c31685b2ab76645736a898a4d860cf1c5e4adcd4d356bb6ea054cf4bf8c06ffd73dfa1fbf90b2599e24ab6375b268cb80cb92536f80845f3a4923c937b28678971fef9d0e703fbdbce6e92ce109981ee2b13ee561ff169ed8b642a9413919aa4049c16973b06ef05433ab5d3bd62b5a7057fc09e12b92e429ef323b687a3113476e17ebabebe08ff87d6a6ac2b2930c9e026227598099ddb2567ae61a107d3220df4bb9f38d04eb1e26bedc32295fb3d05309c437889bca068e854fd2765e85712fe55b071e7c9049e21137e6a4e1decbcc4b6717be09579ae9c9bf2e26459bacc26d25330a982de021f9f47cafd9ebd4d0af96569b6304f41ae0ea99aad2d328595bcf23fbe8029558e19850b4a8797ff2bec880ab593086744328817e86ca983729af464cfcbcbe095099ff5dcdf641b4f18422583c88e698791f820bc1f0610e6f5c168846caeeb5df8ff505cae0be99d03fc84c8d7c78f9eb2627fd14d31721954c112846ab8bd0e6e0ce471fc74b13e371ced2dc69d20b11d2cfad0fe11f1323f5c2c78cdd3a0cff12e79c4d287bb5a3c0c29599ff766ea5bc05a613a90d75a3efa7c079ee6dac80bcdd6fc372c4e18983200f66abca76ff384662b0a956ab8da03ccdae4d8b4224351c4c2344bb4a0d5f839a92dd62c686de2e8d77509f4759adfe298a793760521230bbed0cc331b7ac59e1cf22c3dfe5241a60c84d2bbb807f686eaeffe68982ea97397139714b11000f5f7c0a6215828086a733ed908aaa7b08278c501d204f14cc4f605949f891e1307e1a02c22a07aa1fab4ab06227205769de93084fb70f374c582afac1bcc2c659c8398a686fbcd731e76d342533aa6ae9ee6396f2c05ba8a3fe418c5d2a1c35e7c85b3fc9693abe6a061bf73e12714c24e16e7aaadebd0f4fac348c80a316a666e8ef6179a909b62471e76821563d6187522421ec649bd1cbec8489e0ca3a9e53b466bddda1a264fda5500583716741adbb152b1bf470768539b1f2d20200843ab5719379d57d21522ad66db8f67762e476c204cdf0f384280e3d55f8dd010e88666080d2d722a1ce7cfaff5647f65be82fab3d86fc6d7110e48731b9dda483d941e4148d091b3cdf063e38d0086c9315505133bb7976d3dc6740048966738a89d24cbcecfddf78e07100b8ba9a328ef8532495fffa8812e6d0c84d0c19e69926823ae89727d7dc8f27e2dd6a8fe0c60dd2b5c2a8f219b4bcebb089a66a86264bec1f3600099cde47a56545845c0fcec24985486ae2b44feb027928ecdacab8467a6a13ac35b7048674085f8c71181fb21203a5aa6ee02afdaf82d943dd3cd5c2b7bc00101e9ed5e81e3ca9e781822f59d6c158ebd9160c415d7de9400454f52d2e8599c036bcc8d90e82a329efe67426024ed093c3ce3a6296caf765c29b9d0239472f3110a963c5bf6ae9d82ead84a32efcab56b1915bdde5ea7229aa7943de72816ee72edd2d5abb65cc56c05fe75db75b579914d7d71fc55ce8101e96701e64b4a75703e08bf48d03e93a377602c225fb53df703a32b4afb2d79db14ba84e8a618705122c062faeb5cef716786d5d155d3e9e661105191f5cbf36e53162db5e187c75ec3832689afbcc21cfdf9daaefe1666a48f4b4d99eeb1d804cc016614a39f62df49d873bcc668f2ed6340a18203869a79b6dc852a8ce50ee3a70597cf9469291cdc48b15cd568692cbee394140b2b6eaffe4c630c77717f530daa26ac5dec055ca25a483187c20d21396b192ebf0eca8d8e224d06585c119e26777c74a631dce9c696a0038180c814f95f9a96c736975a8fe6ade2d7afae0b19f401ee163e98096e84219a6eaa814c29477e15caabbb5f2821ea669b713de10fa91de4561d1f05c3ad34bef4462012efac2d73717620e4825a6c5b4daaa6692f1f391c0ed65b25ec983f36bb5e8cae73140f78639eac30c4199b889463d1eba2ddbb60e56f32b011cdaccb6cf9af68de0a8cec482b498d17e6dfb719a3a6ae8f6b0d7683f28ef05cd5e145af20708758130c96ca26de41a34aa0ae84720dfc1f5295269166562bf337486c2bdab75508b9f73f8f9653958fcc46367cd8ee1b7919bd3ab7d472aafe7b4707892f6c181783b5af3f8390d104f53917a9de3154c748ec789c43c9b5a62a48e070277819adf9aeae83f57c3d294be119b48bbeef2e6889aae9bb459312cbb2bd89cbc1a0f0a44a0403f501212758a70445e87d34d800fe964545cd8e6ce6ed677c2230f50b0bf278668a06c425a4f19f03fb566bed98b20559e74aecd90361a6f034ad5f24b70cd454bd746f4cb528b397ce32db94b80dbecdaba2f683ab76418e0a2127642e02de7795316ac415b508a869f7cdf6e9778b4899bef492659402fdab7296f2fa3a5f741a26fdb44cfe66dfd28f893bb2583272b8862e2eba23afe51f8af2f7a21e1ef6543b7044e06d95e413e0578a9c187cf410e2eb7d318b11f06f4f839aaf14e5a34c590a9e5b695c5e34d47f0b2e1f3176a9bb75aa5234f0c4a2ab9304a8867a23096614e7455985f63b5248e8f0d6199f8cf712dba5861409c085685c15dba61f934bd64a24a7d6533241fc466aa3fb18c0800b39b3ea4468d2c44bcb7f7b313ff3f198ed82ba181e208be15025efa1884d3ca8eb03c64a88df5284796dcee32a303fa2f8e6fa12fe0e173f2ba823d1983c1530191d83ec13ef165b8d673c8489521c3b94d9cf8e9c03cd60027ba554f094f2eded8a8af3ae0bf8182ff52ddb036272ade9e2a1529f07958bfb27dff2375dba258dd142260339e00289a009b14166283e1e89d828b02257073e333772169f5721217a124fba83b662c0ef38ceea6926375b56dcd6775dfb1df427179e3463b029d20e64347bf16280ff6b22faa77054e0cad216249bbf6915458ce63c3ab0ad84c7149f9fed8acda46c9a2ffd20859a809084ecdcc5518a3758e80c15cf8f367c2a142a56b856dd162f06c89efcafe060d8f4c7c49c1a44ca56c6f1f19c07335720966f21855d7b1d713753a6e4f70ec9c8ab10a6c922801866abfd9848208c5ed323d5cafca890035ab43ade7f630c0188302d48f3712767b12198d17ce22ad96b42c417c43e020e1105e30b76fec250410b8872c3101f005faf2a65e056f3100f7ca4d28627bb87bfb2b8f870cd18001bc587eee006522b97de1b1d1b83d04ae858dec1e96ca1b68b431f6c16daf7583de59483f45ba6308134d3bfd672a9d11e5ed8ad96149ee29e41822e102c459fd0f316f8a4170556463bba13b82967ebd816fb5d342799541f34480705cbec1efb7875169a4356e60e7b38e36ab2f0e13e09af9b6cae795537a2d9bf9dc0d21de7fb18a57ee78128007bb6f593152efb7abe5d2de6af282b0e159d1e8112e1e3bb04696df7096d6445c39a12dc580880b1bd6bdc49358d1ecb14fcec59c9ffbaa01bcf35aeb304e204db4e02ed8565ba0e8f43703d45907897285ef0ccee16e8bec9b2c74bec2de9664c388d6da32fefb6bb4bb16ce9197f99d72bf383870db63c957ae975bdd0c3939cc27b05bb4d68d4c9ed677b28107dfaaccbbd269fcc6c43089064d42cd6b6b25653935cd4a76d8e429059150b5db8e12ca6165c3b3b52faa85aff1144250becff529e1bf625450cad9b50e098e97977e124c6cd6542b08a004184d40aa60a68212965e929af3a7792781484d99a07e352ae942224c9cd1a95aeb9c48841fa4f433fad6f762d92f7798e6daad659ac4e07aa490381b8f2d3f107688ac5df25c8eefc4154e48796b3eb4523fa960faee08982ad1782f767dd9bb557cec966d1fca9c8e8417ca58ed46f05fd1b21a256c05f9c8807326e745f1b214f379dc04712fc0b69de456fc2818e36c4b67ffcec171162a27a96066181fab2176d48d3cf336f2d8dd247ce79e3cf404072b903b80c283ac319b8a5756dbfcf7919d289b0878b961cc68aa8fd22ba8c39f8d5a101c82b8eb28c9f34f948f2e23be344c83435d7afde6117e79465d78077efdebd1173a2c5387a539c353d1b522672a57aa166dcde9a4cf57187d4af85c100d93e2e3415471d8cddc37171c387026ffd864041208c1a2e2c301e99c904e1d3d00ea1330d7c29694493f50f71e9978154d459ef2d2224b0c50aa0d9ad639d0fca14b29912cc23b990f3083daee0ac51b34c34978b06817ac7e957bfe40cbe5cd038a88eaa9fd526c9caf42301d40b8621d61862c0a2f9333ab48970f5650c64e962cd395f5d0556f802ffebf22d7ac9a75a4f78565d538326537f1768d84ecc1d7a67c3b86e7cf1258272ba0953c2c24cc01f00d59e591494ad81dac6cb4e3f7468bf533d3a02a0563295bbcfaeab1818f0d122c3cfd18b8bacd6e196a8d263f7141d12772a5f0b95faaf13cba6fc7413d2ac08aa5784931437c85560d6a3e0ad67c828eda45ad9e9c20aed86a47f7d464ffad7119e3ad236369d5eadbd895f9f470abc2711bcb25b72ec6f860efadcb84d01ba810cbaf0f9929e2303c54b88d39d29f6aeda4d40f1f29ec1554e363871b50bd78109ce96653113cded56b30253526eff0965d528b52a680c7bcafb3a7a705e5699fd3c6c83fc4483f0d88776274c21ffc01c1c15af0391787eec108ada6542605150cd195adb786e96b3908b55758a1d5c66e9ade663632ce81b3fcf997b011d326a4946f2b7f9b6664f96eae7b4f18264aa06986234245140be4eb1c09ce2b4c3b3789a54760d82e815613ae4f09d566052397f2b5c1d0e0f3f06da56af2c4d8c9422be8702fdfaa56bb8245513d7c0d9c54b0a4ac5968cdc052fef639b281216730e599341114824ba64504104e7e8566b04e0c655d6f22f78919bf04a1e29e8b90514811d9091ed6b2e65b0ab15f75fac2baaa7f627699000f38403a355ba8bcfcf97587dc40089e4db0cabf0a9157cf08a0ff58fcf1988051f52a78e17ee851b34892048f3ba7f8f36ec38bbea69369fe7b8b90717299eefdbaee1f3aaec6007fc92e26866ea57d306ae62f4211c14210b4cfb4847c25b26f040bbba57dda3faee5ba5c465b69a1712f92e8396559fdebe74c139a70b461226af3ccc66e9d75cd38c71443746cfc52376a650913d5d3fc7d815c27f2de71c44a36c0f1f37839473cd4ed026c37e4401ccd1445afcd8aaf01ffecb164fc6aa14c6546ccaf02f0c96c44550785530fc74a4b74538b99888fff2853cb59a6c265cbdfbcbae3b642b041c5dac76236b5544a6613c759d2342bdf8b0fda43660f6e5336a151441a859847b9fcc6856bab73879d61257cf033ef2da89f72b4a2a8477cea730442a86fee08a11999615a28a1ac61ead2777c0e6663f181092fe5336da36bc06861d8382def0bdf94789ad36b03442f72cbfe0a1e0d06431207b6276d514b07e2242294e4755abd5c5da6223c36c49d7b0cdedd62a3575431ee9dfab31108c7f5fc2ffc8e263e216562f49b91a153b34f9c96fef0a15532cd470523cb6d157f387c58d5979c06aa243b0eb617fd821f850dcec53491807d68a3644932c0019c1e0725c69d2144b63d487cf81b85d020afd2eee6aafe7982788663d175b44dbd1b3f2f361b7088d4050d97e838e4be65248e6fc9c032a0e091526c3300b46a40b476ddaa7ee43392001d17ecdc94bd5b8792c9f510f8871637b9e604603ae7c57e60a9aa53f6e57ed2d9459c93104d824d72a5df199aaca1c00f89bc10c236b9dd6f1bac27431ed8e1d4d96dd8d1ff67eab05c1e46a38201eed59fc0aee4d7ac5604bc265533305eb1922be73a74338ae3de850924ad97c508aeb0c8771d5b0b7cc403bf8a61da6ec683b58f24519a49cd5f994640035e59a1ed652a15c63165b62f7ace23396d97954c1ecc230484531bb6014c056f563e4f34257c0799eb2996a999d8bc347a57a23dc034b307920533646580f12c1fe164f56a14d8e2f8e5a2b4d965b1dd812d71eb324f40d543feb90d3e9bafd40bf197b3abaae64bdb284ee3c20ba0bf028788d6fd7278e80a9e20f2e4e27df1badd3bf172a4dc3f12401fb8dc2105337f045b837a44c7ca6661efc800fc080fad12d621577917373eeb79a6905c5be577127e63414c99f6d7f899ff0b5eca783310fae5b2be13bea189013f8704114f5b304618eae07bf7efb0a3fa7c7121e61d762e912cda7e4ffa873ad618bec1dbcbfc66f6cfa6ea480e28825cccd9cab3acb0c5c61e64a3759a847b1cdde2fa0519c5359f68167151c3ced9a884ff117b713f74f71fd32f9a11ff66763f270675f52956756ca58dcfa1220e403d679297fb90909699ac7f57e1667174c4e18388cea72e0b15eaabfc16b094b64e99cab3bc52cd4724670f299948209af7a90dc806bd40e32c3c6871a509019d411c263923d47f6b48798b799a12f85b5ff3f1be4dda237fe8312fcacc89d947ad5531b2d2b42b856e8a40d274556d286648cbc6049c4a44026f8e520db18067fbdb799b396056281eefdbceb89df394931e1899bb6219d1e32df0b1d91e9b50a5156a6cd87773c5c230b8c8c74b20227efa5483e2ca369c0312f374cf3f8ea441a99092305828e100e3645b30fb87547253fc2f0b331524faa4f2f54082dec549fe68c5c180d9fc437e7ae0761d7d9d25b19bf5a54b39ef326a9bbdfd971056368a6f520c801b8a12784903172f878ef199a0724161296d32ca4a5926caa7b99fe420d191e4421cf6577b3d84a0498c7e82a61f50234821844a8b417cbc2971de8209ced21bf22757926dfa5f2e182814f3196751e02aae9f61daf16fe9fa118aeaa6a44da5a03bbecfbdc3f71797e46d7176f4d7464556fcb6c5f360b2be1b1d9473ec74ffe0bca455c7150cfb2d33e0645b1250c43cdd24afb8c20fc4c9e11f05ee11d8a9183ca0cb3687d1476cb90672127a4ec855839fc33fd7cd9ec225f7b591cef93fcb3e3ca67877049acac657f1498731e143fcc677c7cf1a8f2b3c4039fb5e57028e33b05e097d1763cbfe4d887cb3aaad6cab5153fcf2773469a680f9874a62bfc5bfd48865f47a10d4c36f9e089a096b540198ee2bfc741d01f7227ac23dbcc5f624f18c1a97bd4099b826a899a4dec98eb2358cf14791b78890bd343882b593b4259fff93b151617f3f1b4e8c6eab46611f8fd6c96e40826225a9cc56d3fdc7741448496debc701f9eab5e67d51ff409fbc305230db110c23088099a98be5cfba83830005a18e80ae2d7f06c8e93b668f1aaf65b40873b34fcbca32ad151e2afbf5c899f77d289be089df261baef016b3ad55a7bf80f9264ce1ff0dee2a0757bcdd919dcfd9258245726edad21dadefa206db8edfdf11c3aeed97a1c92521d471cd7681db3ff5f24199a69b88bfd53fde99a991817d4e19fa311c94da810e2fbf27dfccb62c2a5a79421eceac0ff6b5cde8384640e60ea7936ef63daed81cd7f98f35f4fd283329312e100ab878a2bff47510139a93e3eb2ef9cd229294ee5bb5662190fcbe90fd2d9052c63aa439dcf6c2b98ffb116e53016409ea4231e339773f2b075159c434a31b3f97aefd4c8b2943ad21eef8fe8ddf3024db2a59abdfc39caaee87745d6e56413ed581fe5b49109a636fe28524e9fce0b69ba756a8dd0ee139bcfbb8cd189b94f9265021d6a5511964d0827071f60ee837a265c35abfddbf4fd94a7183b20778c700a5f25f1e4f5329da2b35564079c91065d22a31d6948965e9e04921c91e7f50dadffa45128fda4b03593e4247c205d97c78f5dedfe7c20455599a17cc451aff3b8ab43930870110e2a905d67a7c210b4cc6b0b23a2c1bb3b2130ee64a1fde5aa9129aabe6b98a43de772683570cad2e6d47d55c53f5d8fc76a8f20db1032bdb8a24180da3bbb82c7d601ac97bf7fcab3478ee1ddbc99c371987fe0eaf9395fa751bd6ef05f22d6345e04d2947c2a21a68d665a7201bd80c113c8d698445af4ff08641b06bf15c60ae64581358f13fe440ecd668df611ed404432a9edd9dda4462efd302743db7ad3d88a6281e0828a17338bad3583dd3375918502f1a00a96062a515458d3be1b169b9c1d8057bfeda66267d872906879e8638888ad8229f3c6662830a35704d15c9743593add114e79042b8f4c05fbe8222304e4286581e20f49496b0fb7f6c32c3446beb858c2d519829d79cccadea8aa37c2bd6a335b8c683b7eaea4dbdc1a0eda6ff501b218ac0d42863ff9c759e0080987bc7cd2ff1959a48da16babfefd8af184a61dd15cf8ddaead89dce5b4b8c5ff1e89652cb5b06aed3feb6b10a39529e14e79159fd5e4122ddcfe7b0a365968834ecb2d27c579247c5c35adf0150a72129514f002cd953326d946e01f28eb79fcde2addad769d0ebaac2637359a83eeed2122b6e48a36c8036d0a130dd29581d297507ca51244b10ff66713c57b2823d8b9496f2c55ed592b60f21aba7c80076c41e212f6df9593e4049f498a00229b3c273124c276e26f067aa5ff106ed49334a48ba88a26b93e9f9c77df6a7099de823183dd8e353f91fc83cccaf6efb8ad9187f144482ed83aaa8797df4f15b47210a0e7a077da294875420e81534954deebb3bcf11841180d6b8da65020359ce1503b047768acca1bd980142e11c2d1adabf195b4e2a5a4414c754d3bc51979b3a8cc836946f44a92900585d817a357a3370724978ea3a25eb30933a72509726e82190b7efafbd13502990a884d340d46f8bd10a105833bea0a0f019c2a4caf9c45ec45bf6c06868d98044b459bbc1c2156dd01da2d8d966fb8505e23bb2c59c4590bd93384609121b80def17e985acb9ba2da14bef09dc742594f342c0ef986f263e6ee32b501b79cb7e9f061fd5e4988a7795fb343e3482b9a3670322de9324144facd5471d4c1e3a1d021b25f5ec45308188f2e275c720dc44636ec741736b8b043d13c1104b976cb3c15de32ded4812142039e2f6bcd6f6418f8a98605fccf327c6a58271416cc80783d542c40f2a9af705d71d093c2c6f60925f7d8280d0b47ef29171885526b8e3f189280479722ef4e0d47af66fabaf6a15f55ff1fefe36d266e1759cb04ca20db2837e3354a838d15939e0047cda1e26bf5524f300dfe1eacd9d78f67966f04e6fcb2d9ac7541f57170d397c8c41255e3986b6d1aef91e90cdcb61dfd9fd096ed0671c81fbff4b4ec3586ca6c6692ad82a90fbd331d7538a0e75189df89855357c61322f1730247e042361ca53d9975d3b7cdd40b1feeaa139a28478fdbf3c6b1cc159ee447012ae837500305a19d2b51451436255f8499df65b8fba10fa26d7578d7804aa467da8e856312004b245a85c17147f464bda46eca720a95bd27b42d6cf76ba703acd32dacedce1792b56febbd63ae0ac820364c48e208f03cea374418e3d58bfd46a1501e6e9bce00c6f7edb979ccdae222ebe261875b2337707353fd3b426be9dbc1906a540f961def7f26161228d74b5c21db84e085b11530d4d78a5c36c961c2c059114c9e026285620f83db46a27c327492537c1d1c5ec1e83950c52716ed920a349396db85472f3d046323aaaefd2c40a13db885e78caa3a03e10497e6f5d01b9d71e12cb164538ccf3489c96f36c03282b4346485273026d1aba90dbc02f3810e2cba15f92278cdba887c2765c184b6a1476e1d87a71a5afd21110d08bd82b70134603bdf0a357c40df89592515f0599767c4356194cf2310d1dafa5f5de44a012991e2d593e0250c9a2fb31fbc7977dfb5e520a568a53ba74e756a128cbea6a86ccdcf6f582f347858edd9d82da6ade4923f83b5ab52f11af76ee0d4c26849418e52462ebf69371e8c2241c0d20e68408d31c334c54edff65d35d3188787ce76feeddb764224a959b48b6f7c4207337e177a63855f0f74c3e048d550548392b34eef13e878f817d45287d76d0627abe7b167d939d10b4c0e41364c1eb1e23280eee473f7dc49eef8f6860e0596e61e280b88b8c4b3c8c22fc07ccbc6182a2a5a6f5c7026d490bb42012467f86cd926b9565b76a88fde73c31e9ac908ffd1e6ca30b59ce80a72e94a22d1999800673216426e9777bd92dd428c0eb839e16ff43ae38e5eddd657156bac2c0776fa16ecb950209f94d5ac6b38c9473deb656adf36f8553a5ae0b3bc412d823617a26ea33d002003925081ba1036e2be9fe4491448df98b3f1822f3a452772a9ec91e4f1fbc2db47f2c6a92663555fbeb9f6811fdb19d7602453103bf22a7bd7885110458018b0e13890894c9cc51cb2ec14a96e88277fa385dc0d2dd2871c435d68573a64824f63c656a8a936d6a83f88a7389cba99200278757c8c60fdc271ee30403d039015543e819da8cc2a90c92256a506fcdf37119ec7f4d417df1ce7bd5151ca07b291170399cee7c73154c44b8b7559c97a43354b4bfc9171bb7a194d34126dcb7a4140b817b2c2b28b62c556ce3fe19aeac302106a0a410903689b0060e894d947b445ce73ffe618895940f6875b5b0bc134ec70aa946f484766c199606aebbbbb58bab946fcbe53bb96db8d5f5e12766e17790ea62188ba1803415aab1fbeed35ad03fb093fa80ea2b9d99daebe947561f92c2cb53809d8c5bc7ed6a96d9ad8573fb616233f5fa3df10efaa0e037d834d587a6d805e7f1f00f0fe9ff3db1c17906f359d2d8231bdb15a6234e5c32a2a7093e8436ffb65073a5f250912ee9f3561ea26f2909ecaa6d9e4f5b0de5426c58c59ea410c95382bd245a6c47f2eb09c4c0efeb8f4fb8719a95f0eb0505cf00ef10914d8cec284f77942e834a101dcb6df6c2142b31ef360b01711b5d43412413f3ffc8d2ef9b7f49fd56dec210e903f6c703332637f9c267eab9333e2701a16c74ce5e0b5a16d9da68b9c5d67bb6770a3c9a90a7e93fdd5759b27bcf3a753fa39ee7545fb60026d3dc417faed7ebf04f5b7073d7d0274e8354433b390306c5607632f5f589c12edb62d55673aff2366d2e6b24de731adf92e654baa30b1cfd4a069788f65ec1b99b015d904d8832110dbd74eae35a81562d14ce4136d820ad0a55ff5489ba678fbbc1c27663ec1349d70e740f0e0ec27cfbe8971819f4789e486b50a2d7271d77e2aaea50de62fda5722c51d988164719a569988775e78e98ab5174ba082c4b3bb8c5be66e57358ef871cf59179fa76f5d29fb9d67237c963db0e51e4435257a1e71926ffa1a58cedbde7467e0943b9d72b93e34c376e90c681aad168b01faa7214ae0b653a830168bd962eea5e787789574cfc32ed134d8a452edb8d781dac75e98d53ded79220272e31941ba32117d1ffd2edd0bbaf6777cea1569dc3d4c5740ebde8b3a05c4ff4b9be5f5afec70378cb2e9f6ecac94655c50b2cdeb8cb5e352b46b02cbe68f795064779ef97f1a2466267f95442e952ecd1744499808add82e7319590593e81d3bcd3c92297275c026d85e2ca4a98f3049be586154299ac21ea857e2998675376836b373b26f19976939144170a5c9164ca65da9c278131dadd4a523da46ad7460516ab816bd8c1687d920684abc094d507fd287457c9d6776889fb15a5cf740be7dc0d3d8f633ca1d39010595549641ffab458e6f9f902be324960f9c21f918cd4c545b8b91b73e93c944ade2f81690a4a92523a36991c79e492693023e1989272da3c371286cc0760a49c5a62ef0b5ea09ffeb835328e6e256cfe04f19df0e56922d805c22eb0c5e8cbee17151bb3e2a3e445a81f4bbf669ee007bb54db014d62a50269f09b88e97c0e285b718ec75ffc680d511b6d1728f7f56c9e73243392056ca3aac553ba3cc377326f9ecfb19d523340fc521ffe7ed7b415f577ffee7bf97ea11168e0b086660df49bc366d7644e4ec4f1ebe9dc2ee623eb0887f59ad1e7e4e6e601cad08f0cd8562609dca37c98c083780f531901cd4dd41ecc8d9f5c76a45871ba97841e5ee1415a97b87bacd79163d9e6e61dbf3437b9816e4f65e44fc8e1f9b9d133fd042f9b7d9682c9bdb3ca4e5b97295130c2eb837794c35531195768c826ff44f2a5ca4ed82dc3f478d6722b474ba51b1b207018496672d50a7d5ad4242aaa21c6e9bb40b3850164a2e591e2e529e0e44af6ce623f0de34e3923d80f56ed5931417a095b56c5c781068b305a7d5a641583eb0d48a0b19e2984b2d900a59694dc2afdbc8508169ab36b6e557d5705b9148fa736b1b6792cccb4d3668f5b4de48a4b1ddda812a0046298360b32bb53654b36d35187c78e14a1912d85a4bf3ccfa36a8073abbc8a8cf6568c5761f06cf2203f1764b11c18de0ee26941271888df8f50ce86764efdbbd76d1843f23f77e8fd741a7917fd3e137d712e9f00af5c9cb7c5b01ff11020176da581d6cef09ccd499b8597a1b1283a550425a918ccde8d8190cd44044a1c2a21c66f18db4b052b6c7dffc73782ffdbfe64f56655b6363a567bcf009743187c59978c120297d789cee23110c1b6eb7ee05947dea0b78d2b9f4c5b5892443d937ee17dcb2c1e3d70d792c27a279613ac63aac31ae2150be9c2cc1c56dd95b2f9f96ced4b3f265d67ef545b0d516aa0ecef2110210119d7fb29c3b701607ea0363000829b25f85ff67ef1a4d2277ab9c7ec84d7fbe70b1ae93af9d76104472fd08d65e4c2c4dc6ca5ec3244d0920d87c4c29cbfb17a33fb3c5f35227faf3786517762bcc80619acfda1dce40f786d326bd931714aa4d8a37bff4140624a97ce4156c1b2b6d1f9468505ba2b98c3e0e144990b94ce4b44392e81e3da12beaf2e2691486d930fc262c58093c27259afbcd86bf1d14659bde6dd4fe49898f1c7cf8a92c09667a7bd2a467b2e50a52422ecaeb5acd0b9b58cd211d00b21fbcd27d9f4c0f0d43b8132c4 -MD = 2fbac29e12a3d83304ac661cb664e1240aaf810a0e13775f7c4319c895168f4f82e3b904562e711bb8e0410e328a7507 - -Len = 100024 -Msg = ea4ab388cce26a27e016c76b4888b02fbe1d4b93350cc0adbd35407ba8b5461cebb71c40c78ca2dea8ff4b254de268b429eda90d09c9e047f86709045f9688a371d5b1b7c6658db746a3dbf7499556d6fdc336390748f9396d286319b3e4c47b444c79d31495b51b84ab82c986c802fe0146fb0077b292eae52157a2eac7820c2cc57c7df843a27328bf45834aa4f592fe1fff48a02e34c227faec874d664bbef1e8c39eb998da25fb862e0dde51b6fcbcf54afbcbe56629fd5a2bb024eaa6f95a5c551ca0bbe79bc5a9444f8af6cda20371e5ff40feb0872de91a06b77a1c2530ca3be1f5d4513b4ecf8f3195bcc3ee9b3bd73e47a29a448050c46f4d3f34aa3bd97bd3000d9e6f5da1189c49ca1f464bfa289e28f9adc8be372ed4306176f043321fdc088c589ebcc7e676ec496914dc56e1092a2a707caf45621ea6076a60107c2ee35779062f31e801a9c7602abf17f90966965e6cc61a236733f85999606960b1cf33fd318c85ac721b2238e8afc188a89db4bc270fc97945fd6e808a591886af8ae540601c80bd40b645f82e4ca5aec795cc6d2bc082ee04634fa4c5b4e39530fbb4691b47e9c0736077c981fe8a116c382698003f0e2aad4ce5ecd3d793363d0aeaa0eb758a60140301d36b2d3759a26d0a662cf635d648a276813b2cf010dc9fce0f560e29432a862b3d7341752f6e1cbfff394bbe9adb4c4b8b8519c1cc18a2a7dbe67a8f11bdd13d3022a20c3bda2d8e8aafa8731d7032ac313a08d011f6fbbe2f23228473d6cc7fd3feb8c424ed89bf2f14741a080e3ce09be160e38880935b31946ccf107b5f394f91ec6592af169a18f2177c02be5231f20289c3d8bd50c509c1c13a92b772b2cb63a4b62f29bd666ad0f961b4875ce55e25eb38aab51b46e0328a8b9e8fed3370fa4980a062676d50378291c571424506d3ee09a671dd24de702d8bdf0db80465e0448b9062faf5f0ae1ad3de84ec991393fa0073f87ca82a021402fa38bb6dd39dfb9fa532604772bd29f0a7c94229acee77e3ba52e21aed70a5b89a18dfb6e2b7d88487d97fabffec17b1c7472d3cfa6bcd7b2288f5c24e434a7465b60a26b9b84201df5f4168bfc44cdbe706931c2592649054a19fe776026a00031925068128a1e055cd8cc8d9cc3039ae0f5e0f54eba4eaf7a5c6d38c356c221d49199e618d5ce7902a4a11758c2b92c569745eaffff650b49d54ccb964baa35b4fcc368271dddf397e628cbd8da6add31cbf515f55c08b3390301b2518bb4a643228160c5b8b8ff7d2bc81d75607538131252f8c756b641b864208f7d8d7e1e1fa148626d4cec1732d4038eb70b84c77af90425de860a0158772da582d762e79b077cdf8630e3b5597d6f822611f605c9ee7d0fb35060ac89ca8db6f9e00fbd55b3b34ab90b3c64418660ba3b3a657d90712228ee4c469ddcccc5165b3dd0e9c03470367e3252ae8b9d8b797edb4f895f1f8803d7e0484fb20c68561f4762f77b0838253e5cd2fea8114452698b00c39648331308a2d24cb9e7ebf8cea31280e6bd7f8981d119df27902fd773b045b6c689a7f9090a711f450dd470d1c77c0083b2baf5d135a3ba7a78b26b35e17add70625b08518d9131f3ec9640d12b1be0e2967edcb5011d2b2159509018a51ca21450d0d36ab2df2f46f2b5fb45545ebc73c73fb0a5b9c2abacb09ef8a451a7af32e38deccd00a751aebec80296c9d0fdc7c372141bc650b68cfd01e761ada84f5c78f6b6e10d8663abaf20f95df1ff2f4f19ca699fcd23d642bd0dfec8ef9b1ce1afafb45f2008bfbe527541f37355bb8a488d439a24d8755e7f379142bdfc9272f62d879fee8ac06727297f0fb4613cf9ce4f149363db3e40920361778f594a70cad4831bcf993026cba1f2fb3b9e3e3e19946f3410a87b89b3f5c1dfda1d9f7bbc59495b59b0798d8e93505e8f891997c8e1b5d4a1bcc7aa437344d434c62be449004ce7037cf70c0e6219a206ae59b74aab8afd9da49d12df206d0d15ff5a5adf8df047533b4312b992b15e677a991d1d7641276aec8663d571ace2f405b5400e46f5e4df97e8422ea9b9fbf87a3229cfc68aeaaff0fe0dc4eb76ee6595c72453bfa057feff510acc1b85f35029cf7dc000caafc36e8e812bf26d87d11bfa782e7c921937fe07ed106cb7ecf515db899cd982ef5b91926e892b0357ccf4e9dc1cf24d91210097599a11c2316daab0cdb4a54641bf16a4165af9bad6cfdcff909db52558309369e0d7af3779006519bab5f8872f946a5e292ff2f67d4020b6663f39dbe6ed430a1347a98a2c73d150e10f47b80142190b07568b68c3c46ca8ad5ff4b3c5bd8bf25178752cb43e8c10d13f176b7f6e8f55419d376432c31d30d6ae7a5f6d37daad2bc8a6b1a8a6d1b3fbb3ec13e26059a758329b8b52d2bf0982793f3155d2bbb512d6c29b82636ec4d10c4a43e2cde47bcbd50c409c69ce7d316ec7dc0824ab84a7213d5cd9fa9fbde1a6967df91ddc6d0ce32e26880ec81653ed88a20c9426a649169b6807b30129be2165148dc68de5bbeb65afae28386f7a740645dba7c9948945516fa4432f72c6fb4aba295e9560295c373e674c9be305a0d519edd5e0d9e82be3b6381177338c929bd1444c7f76f5c437755be27f1b95e259a0bbb518d0d648e6ee2bb464e67f95fcfc7726a894a1b1dac6e4903e639bb7287cddbbee33d41acf79f79295063063c29e3a63ad43ad8395b5a9cc666597adb5f0cc50bd5d721001ec3432741d1f8aa138f699f9fe89d7fcb403fd939c1a2476cef02a22c830d722b76a1a8e85cd890d4f34201b4fc71d74649bba227183ba0f49f19e9afe80bea65df1c140eaaadd5b538b9c8d91d5d29129d978bf8064ecd4044924a28af265016273bd47b637f63fe86565cd7f3675d78635bfb7335e1b69805f62b5d7f638c8475874ef7305621f704a22575279a5bc0c4905a614aff43430accf61801cc86f7f287eb4ab93bf7e7db248c7d61fb0b32e7bd0f8af0ad5c8b7c9c121fdd6827b9c6c3133ba535cd183264f7b548945516f56a84b6cdf5e9b683efe73aba3f551118c32f949c4d8bd032ebcfe7856c22b3151f20ad89ded20d464bdd33405af9461010a51b488a1a5803407dd9c08b585270654b36cd70ffd8ee3b5cd118c0fca1d831df994ef460f8ccec6754a0fae13b2dc36d1b41b4585fa244ccdbea79446a95ae43d5599346f7b675f71fcdc0a3b675c2ee228cb1c6e98bf0951a5d8ebbe972103b990f70b49fe8659404f0e5880b70e8371456702fc0d0c61f561a06486595dd2eab189293368a43a5c9b172778145c0aeb849f77d2a9b4ed356c9e9d22826a084d41d01c905c6989437b76e57611dcfbcd80b509670111117e4114043784edea4dcc6c64054c2ebc816abe112f31f9fc93a448364da5c9654c69a12829e3421f88bbae8de6ba6c4a92e34d38f7f74b73ea79d96cdafa465f3c50d6777e202f0e7a9a26f8d919bab9f46fb4db64d439f81e7bd93bb3910075aa912470a8bddd4d9fd2564340fc9291228a7566fa5b5e0fcc24e8115bec903f33a50bb23e3ef543650eccebb2d57c56a9ae1f7a2cef2011600f569c387f7e1254070caaa3060f8676a9eb509336d080f6551373711218a36685c52acdcc02a5782197d87bb5848d213e421086935796a519e1e16b66a03c6c42b44ba044f65f3c9f4dba2ccfecde013661b9f17d4a0e12571b42805f6f52dda0a48d449ca1a60dda9ece3aa7a0ef931cbaab6847505ddab71025345ede8d3729f64e2f15ad20686dfb8339ff5938636bcd736f93e31c7a9470f80c07762205695a2cd4526134d8c3e4878f197e5edebe0a905be57ab05e89ae398bcbaed7c4d920a7b8d57689db670a39ce9878b9815e0280c1be9fb013013878182e1104f1e3ea3d51114565ecd1ad185cfee0ded7f635c33581caa21485a02255a125401924375c3188667f89ae7db1debf3f456f0124e63bc173fcffa165c6a8b753ffa7146882eecd422d3e27cc84a84bfc73a2f950582900342720cef9e3a5f345ba283f2e5fcd3270f577084a0f6e4790e01059389791c073b71478fcf7c1c7430628fec931716a7b7ed0ba56b08514a52123ab4e331a84cb336739bf7180b6044a05fdf9a65fd7ba1fb7a873268145a19d796a11a917cfa322858be1ef5741d22c5b97103d0cfcc55eb86d3fdfe75d0eeb7e1023680e0383eafbd9e4dfd9fd64f3a664ad53fd6c15c23f731d2b2bbd4561ae27e40e81b2e61336ce38c17d3b154662e13189958833d0d9548bb6c3090db6862be3fb07605221c2b36e12b5ad6bab0d874d4c89e39800f27c1bf141a29040a296a3bc039e509d3c33f56227a6e09822e1412b3f00cae937743e692c2ca5966ff293c00acf59fbefca5f2e27ca1c743f69cda4295244e004b7739ce709963e5aca34b58165e6b469d10bd54a8967e5af9b3325dd7a8e8be6c05bfb06cbea9eff7816fb0c147f6d3702ac0604576b531ff0224ecfcc10535a2948121fd62b4eda96bb1f0f3d9c6ce3b9802ef9d68f52fd031b7d74d962ccdb4cc85076cad0a458a081700f53c659dc7058be7f695c5bc33e7f3061250e5ee6c57d54c02c635616201acc80f975baadc1764329925ad40f1cce1629316b80090da79d604d6bda7f9fd753088122e5c417694b6ce3f3523d28988d117112e6be900778fbd04288117a57c21aad7681ac0cb235ddc0be6ce9ec6f13ce868ce973f6ed95d7479005683a1c881bb0b904e1fbe1a0d0db247a71d2a228c4c4420ec5acfa72a705ccc8e0698613a04d92f5f27f680b0a75ce117175e25a78ccdadd301c9e7ddfad6159168335032cd67ccb5a01c5d2df3303a87530a0277f02afcb2fe04a35e5a0f62c671199c535eddefb852d7ba6c3957dc5d9ad5bfe3bf8496f21729e295d82e3b97e8f24d83fe6421d005d09e55c1f94f03b46766d2430201fc15e0ad6abc5c286b97686cacf624e86580af11d0d23c19df6969fe2ec2cdc737bfd00bc54dc0b2ab4421ffb58f44cfdf8c1b1bc5b54bc45b818390de850c6f0adfa2048ed48360bdb8c511860eec5ba6f1bcc51cb34cd8ddc35c23cad4e882df3bfea0ad99ccbb0abbfda707be461622773b16bd1268dbcff89dbfdaf789871d9d8ae80ae4c44afa1571cb20e67787bbe54017901ac65798e8ed6cf63516062bcbf1e38dfd9295f68dc884b9cdaa36da0572ce7e158fd3a05bf53306d7b888738dd9991f2b602464ecaadbbabc05ace59d7a456d49ead84f195d1bf22596945cadeb13a6b85380adfac1d60bfbb0704676ff8446ff00ed0de9cc2da267d9b24ef1ce580bea95303a7fb28094d2d40a6358aa91f27ff89a4295ea70fee5a86ab1232a70370a4ebc724328de3e899903a60b23765811fb6756e360ecefe72c45ee09a964115fa5adbc0dc9faef6726e27656113b5ffd31ddb19cd6a95bb48cca6b6cf13b8033c38982a73ddb90b5a42f3a021de6f18ac183bb88f3b02c95f1829113aafd6eccd0db2bd72d890abc3a735cd7ee81f502d4e1dd6e600848d283f3c8c87db3c273f3281f66410d43c11134439d2d1352ab91807d17c5b999b369a779511164647054fac51c206e250f50fd571c81a5f2ce21e7054cc8cc057fcc260a7710183b0b1cd887c073b497ed2053001c933ebcb2ab9edbd314487680d3f6e5021fd7318c734bcc1ce1e780a2a9c0a6640ae698a1582e69744f35d3fca7a170bae8aa2d3a80dafdf61310ca7712cbb1bd8fa56ee1501e15f9229b043c6faf15671398185f6c0d8017b0375cb484fd89efca8426bbbaf649283483f08854a63bd048aad8415e6cbe4761621ea126dc96c2628aa977be3f6ccb2ef481287e1049be2ee756287f801f4dce9bf88521f241fe00c0dd5d8680e6a8b7f79e631474a9f96d577a5ef7d00cf39ee9d2aa9cc7f06a4b2cabb537411e8878932f823f5bc249ae022d2aede4ebff7a559456c0e10ccfecd8fbc6fc0b7e3218d01dcd264cfc7699f155d38945253a09e526d2b5cafef58accb6d9fb646d7040b64e8cf2cfbf47d52bdba2f57a236cf4a37066a20a2da4ce0fc2365cd75308984eab07ca6c73850bb8a8df560b4c5de2975b59af2700a45fa8092548e999c3c79f1c86d7ac80f8e2a1a3d2d78107d47cc8cdf506abe1bce7a272eee724a56976b18a5040164f6803edb3c29d63be9b6a3eaf80cc1e37b60b02e4d8600fe0c24c8ddbae2e33469d15a4c2f9d339d8785301ea432c06695875d2492cdc32b295f23af9e8c989ce5ec1cfb7bd9f8cbd34df1a64864cede16bcd1a8833821684ac0fc0ca4638a25075af74795729e2d497b7900791545a06b6bae089327b42bccd4c28380fa40632a8869ef20f9ac68768836bbaab6dd64003e52e3474ee3ec4c151792a8d343bdec0ee52092c1abd3d71eab3641dbfe8f718f60b714004930250c5bb870611cbba85919aa6f8d0515f789571ef30711893be948028dde4c8e04151f739c3623e30be147db1b9e50953462cad4229abee7cbd67934194b865c45e9c34270c501aa635220413b8816d82a3566d455397f31bdd184ea4ada5f3186d4f7a392903e986b06135b23dca065456bbbbe0f55aaed6e64fb93970d5f9433711d15761a23237f8791a778feb5b3229049efb561fa7169fb3dbe92470ffad848b4269fd567e21d513bb4af80af582e2d91f7ebf0c6744d1edbc9a139d8dbe1c64d457454654ac0ed71e14be505aad4ae14451784975c644a5643583852cdec6459009819b3c406d6c4dbb2ae4141c29c5175dc9ff5906c082dca3bd5063754cd67c68f97cbe45b87b502984eeab36472da088fa569c6a0d2c2bca0925bbeb74bea35af5126323b8ab2d441498a5626bbfe6bb5275c55cf24c5994ae2cbba807a60ac8bc84b24235a5eef621088c0a5f26f1df1a855c43398a6fe8f68feb14cc35bb9b97fb340bf7109b26f566e795e908c9da9badea87a88d74ad2773d3988d14bdb9ce9f6fe4c5953abcd6db3f6bd20e77961a16f68f08fe70cd8a02fc9a10ea180ca997ed3668dcd59f0d8f1bf4e1df02f9e2e708c520846b2f6764ed841e60d47b6f0c366aa98c73b9e2a90397e02472ed3a49a890bac86ebb06c12ebc7f1efaed6a25d0e64e4d1df19c517fbf9584cf5969645f589c718059ae4048acfbcb924ce00b45141fc9da2f85b118d1caa82224b85fb4868f28aaf1a909c2ba5a0fa27f1ae51d5be6a5b25be3ee5536453773386f6330805b95f36b3d4524506394346e60dcde22698cad5eff33bf56cfdac87cd69759afc85f63afb31cf7d5dfff4f01fa1812d37124d41e21a6dc992f392bd83424ba7b9e2f02a653b5c1b197fbfc202fc040d5c6152e84916f37682ffba334d331d84da4acd93664390d4b502e42b348fdf1903008c37896b7552995c83878f9e73d8ba37fef4830cf600dd54029a28df6ac6c77a59ce379a6c0462a4af38def6e709f644f4cc5fda0445eeddab9d546d4f9d16293c0ab8363ff25b626db59fdedf9efacc5f99314d440a65fa4fb34bbbe6027bb7b37baf9179a300107f9c56a8c61e54689fd9cbd92dd4ef445f6a834dd6ad648040af626e919cdd29353b980752ee7f94260c63f02a1bc7466b217f8589e46d2d7404951020566f272f41e85cdeb5f8c982bfbe44d1659a7ae386b505885df209be19ac189e6622a4de1dac2bf1db4c8356522f29bc48d54c68f8a8405a50afcf9f6d0bfa7422940cc23d77f704e4e75be1623b21332c14555bf5edc86892d2c9986d59384a323fc96c3fb040b05955bde46e66cdee85b4004d1cd9f04b6b279229990854790b82854c93098b6cbf1413bfe5268236ec50e7bccc117a6b6ffab3d37e9dd1992508aad3b5d849927caf07d4551ed0b4d657761b8218a950f7e8a9169c8e2213053ec4a236a11dea188314d24cb44be0ca5425e9ed541f84c95ddc73615dd88f22914d2883e84aac193ca53a2a6b66333ec391c85c484f8f2ae6e86a7b81675603acaee73c3282810538336c7cb89234aa1224075d89bbd8b300377c39ad51103eed846ebe0447d1531269e9b220525da2ec67576f8cd6e9f83654192a1628362ae0581f87d1fd458937935279374926afaed61910c6334b40f5c8d1cb604f405e01848a283025362e246a072071c91836d5eaccdfda536543bb0036ac2058c75eeda42f2d83522ba87538a8464474bacefe3ff33b1db9d0671284a83abab72393e1318ef65006ae8e8689966943be76de84202c9114d9053198d0b6f5b3fcfd93a8a71a212ab53756f4f751f7d408e4ec0445c99054338c199a7ed37b808cade4809f611c87d04e883cfc7b709a068d8dfb1b5ab7604bcda5a3e99e2ac508ccfd2564f466dbfa6c98baf37371fa19c92ae51b7054ad94526c41ab6781e5d3d343f3a2349eaba60a1f1b86ca6a68d530593ec08b16b0afb2c4002ed02f5790396f77d1a2028b35bf71cb20f0c88aab4b7f74950b7bfdf057434c0e6861bea097b62e7ddd50ef5be537465c772ac41e8324331381d309f8c86091a480f77f8756ee840147083c7b23d61983ddffa9916fedd6c67eda594b7eb28d9bca2f1ed70f4f14f67f771705f3e4b15195b5afc67a12fc2872f0504af2af7c5e949710f2197e5dd7c74bf39ecdd9aa202eeb4b003a59ffb3de93a389bcbe0a5780bdfa8b1de2cb2feee556a82a3b608a0a1f0fe119297de33252b78a4564a4210f123fe47512e96936e1b4b4817080e9c7bf62eb9ee7e3411eac00cf2549d655a0126590c795351e3fbf92367c1f67e9e84ae882543bcc57e41e13bac4d40d4fd45ce0328dd04aa979dd73c0629e91f4dc501547a18b9592330764efbc79d58a2c50443c206a76b575c9ddc4ed84ab85245d5d9e3f6dcb8a8c2678d064c1bb8f188b160027aa65aca41334c67557f12540d146086648fa9b4fc9c40f66322be9196bba311c36740995381d47828f2f5fc23a4318bea3af6efe8feaff2951a302bf70c54176954e46c9b6fbba9da0928f2916f941b104365038d732223686bd766b48abb3bf2d310e91fe64b24f22e75dd5f5bd15e5f13bf95f3e4e0b0667e7bebd31f1fa6e84e8abbe9ccca0ef8c8a26693522f7b5e12cb50233a32c217b9e4615fb2ca80d22c1b88010b8192743f7834373bf79a96a853d9245b60810285d9715d2a02f039d58bf96d89b8d5effabff052fd72e58d3e1ddbfe31b214af4b23c3d771101ea4b1a2b53730b702f1633f41ed82e582cd3af3fcbaa36fa4a6718afed46e3c339b28286567e6c53f00e1bfd00fb19b99de069be45f98e1587061d6cb5d09cd57a6a2e4b003952bb4a6dc0944c072db534608dd3cf5fa4e599481cfd1792a0db14e879f3f1524328b6abce34608adecd78faa83ac85b0ffce9a3b3db930b9426a1a3f21b9a47b1fe9d4ea167ef04a174e405353db15a23ce00bf6e72a8a9eb5a9933232c7b9823df86dcc6a937f32a4e0e26a1772b0b84db76d1996cd90c1ae973fc89a115b21d3e0bccba62ebe4bdbb4fc5995185bda797a4b0e124a490b745ca86a203e924028c94a5094f6b37e03f31687967620f009522a3c2348be62511f567e8ef666c785da9dc1fa9468b466c4b95ce13406e24566940b916ff5b08b08d06eaae3e09e323b3f87a1afe5d34a506b4040f9159875df10e32368f8db6b419ea03dab07ad7715b80b51f030c4f8bfb79b796d56fae1e4272ca2dbcfcc39ef487e0ef6e4dd9c908eb4d1fe5370b83822d55539d0f1d19e5f4ed76f806c3d3d566ee76d7d14e8d34be9eb8356bed2e336569c058c638c3443b187cd15a2bf5151da8eb7dc3ba407761465243f958de97a871678903a5bcf58be7d9d95550653c129cc7d093b1953989c088b18df327276ce8a3be65c869728db8086096f5b6c2cc369670afa8ce038e99c60e98309a5b394c2f696b355b33a71573078d706c31c102d1ce96248d5de63e94ab8695aabb8428450a6250f4c16e9cb44ea754f821878e045ae5a945b1372b6f28f796dac0d3e99f1209cfe8945a9a46a68317dcea96349895fc9b79a5d7ecd00759b89cf3bf2c9820bff68934e1baa49f8f3dad2553931910699fab947eff41b73b7f83cc9c4dbab70369691b9a6a48aa5a3acb3a7626005aab1a5e1562df4eb8fb5001c3f1e99135628d0ac0fb15cd474293c9c24469e8c54f9003914a09519d37dea972667c963c5bf5e0cd6a698d06f6dd2b3564db3ce0b5952ea08b09e4d47f7fed405073442c6e287d899ec21269d58b620c4e06674d7b9e51bbac6d92ef20c83fc6466a2595f799439ddebbf7d06d02f0cf6658026c001fff5b3480c65dca2c336cbecdb509a6dcd562c0b397db3be869f7546ca8bcf19e9a07aa0009a0da204abc301a6ce7fa47a580db459cfab0b0400c8e9094c0be9eb4397347d748ef58f82d30dcc7b1507e366094ee51bf69dee5877b808107d5a4c06936e4b9b6681ace484781600647e50a9a741a6089d5e8fce0b198e802b525612f5b531b89d30a2f95daa490574f208486ff5643fa7352e8b0b7662441fba4f8f4570f8733ce9bbe8e60b30314e49546ce9d3e7681c0912b6ff364d03617b80a50c09687349933ddaa704922df96d7c3d9e41f62a05c484786fc11765f77b317ad0e74961cf1871f629fb36a07d44c8e215a85b2d694dccf9e47f8814eba4aa391c7263e4d35f9f65f359e533e3b87f84d671dc1a508c3260e6d867b545dd320875127ea55f500f4e8d87678e32b0eb4a6a024299c269fed6fb347ef30b0d120f652f614b7ad308da80eb84587213525d58c55451c8cc7782adfb9373471e93787331d57f2dd0d43153ef043aabcbfde42820dceb699de68d83956fe000f7fb682880a2e97f2fb97a8efaaedbe6bf3408637da00eaec4931e056adae03f8092090a84903078d800deba734be42bd73ff190436a639d29c65ebce29c1b0ba1a283a3a666fd20b4f0845ec4a3fc80fb65c637da009241b5c7742f667c3b6c4271fe7b4ceef780a9d39402547eccef13efb0e0aa2a429f4edd89e75c43e56a4b48a118e0eec79fa0ef382e8ba4fb7f0725d6141bb21bc1dd52c56a2eb9c30ea46f9404c82f1485828e966bd1dd3238bf4f615a955fc7ae4b6c4f4242a67d5f362e00c76e79873b35f6d6408ef0192324b5783b80f8eb6e7e7450f602d2bb65e7cd0de73894c8c8a36f21362aa657471c9f443e4446320a60b1ef0fd5052429a093e2ee90477e34b2439fd40dc795ad9054eceb49114189d86d5514220660b24acaa864dd5b51884cb877a2a01b7a5b691d99caf720c3f3cdeea98d539e1809cbb886cf8699ebcb5818d2284969af5b8d427364b73d5e50297e1403cf95f4340da5a5b9f5c6f105bea9d7ef717bdbb5e60ba140ef2ebaa9d363befdfeb39b3df6db2ca991ad0e3e66b4af7e8117a76f5bbf4ce609bc8005b3e5ce0348bfb62b70a14428c215e87f3880815ddf06bb93d3a89bdf6baf586db14e6d9d1583ec07623e15bdf0c527cf1c577615f50fbe28380cb7b27fcfe9e8b5e4c254cdc5e6d8b3fbc6f083867437fa7fb62d2afc59377134c7e7abe4dc7ea7f1f6afd84e4ba64d208049e32077beba41682de59433c76668f40759b5d8376fbb30379ee6c47a17f56a51795bd76c44e5b49d909ef5e0fff06699f00b861cf58b99728854f95bf9c1ad8fabff3c4980b3c30692e3468a24134425d8ae8e3422a859eafc629151dbce708be2d3505e56f3bdf0532bcfcebd1ab63378669788dc5c972763d63564a562dcce87a0b8b2afeccae13b3d37b3b24de64c3afb491e0ced7baf26798c9d3fc619df002e1f4d71e71063b2e32742ebf4f9f785344e009ba42e0cab133f0392424e46b7452b38862cbafd20e3478250571abdc2da4b366fc9d8c65c6cf59e841da38c12ad847ad403ee38ed063e7bcabe6f2557b5ebc672a4a063a04b5777fea141387b2dd31b45b4d49a8114b5353f7020b7ad8dd3ba8a7caf6dde7a0c95e91450d2598fc024c08696ad44d553b999b656fb2c2aae19a19b2d6c80bfbd012bbff7e31499f29c2cc359f99f11c10ebed8397a3c5422ec9e4741e6ede312c1aeea5ff21414128b73b14805f88fa63c981ef0bb46d2d73a69c913658daeb2df58ddb087c0c7c7fa7c988859b818ab4c0dcfa446b06d770bea69cc70c8e7466213df112a827cbaef2fc2447d4874784507357ca4e4eda768096e949006587553c639aa64c1f993757476a2fa0e6bb42f6d96a15c481a1157ae22924bafc7e8b95934a4bce607f99133fbca5674c40712273b3af646bb5de3c1cbef2c2bfd479cb31627bb576e944d549ae51ce1491bf71c6c70fb459a33112ab2d2b8e2c23905be275ae77df60db0bf9b1bd1bdc095e536716bf2ad7d39ebd11f64793ddd66fa61b166cbc0670cc25d4693ff6ff220e55c915263e52d1a789e59cdf6a218778684fa73ec8988388c14e2762d61a762fe76154dd657727cc07aaa34b77a3914ae0f4ba8d43e223a15cdb9ebe4faa703386d4586d46a1308cc4b58c1452e09e47cebec2d0a49fdb96671111baba2b9ac9b276922e486da65a3fbac9e27245090f7fe252b1610e15e85e6332e0ac1a705308dc94c8f138d3b4d70eef0e5c6d6bf27313eca81fd96d17c16674b89bf37b5fe87ad2a5c79f534d39466e2087b621a156d7e31d176e3b953e7f59ab10532650dfe5ce4d321daf63c4d5c9917aabe49c8982f8991e592bf1043244409f95fbc66d81fa37c710429908517409abdb0f3489b97f946b1698abd113d711a04886310ff3e8fe0d23a76d823e0fd191b01c09e5ffeaa7a4231c3613988486a8f7301135901cf86ad46851b0ffff81d2c795ad1cbaec3b400b11105a24df28300e93f78d0af8cf668eefd6131bc5b2d58df66e9c6ee6d7d53b31db036d497edc0b2c5464b92edb96dfb86b2715e4bd207fd8fef3a05d05ca3fd8e6adc645d2e38963a85b1f01b562234ca17b72ff293a1997aea0e3c13d958590d3b7c476fd0cf5d463eec123d55f1636e97eb7578f88e7cd2e22adb5f7cda8d422cffc3f35becce9278e3407c3f414e1d3bf5790589366e3de0762adbce9161d4444b211255f9b3c63b7ec2009b79be7d0abd83bfcf023663eada70b056e69f6c8c49a9f3485dd28a8fa5dff0f1037b360c2bdbd151589eee0b3ef7059c3f0db10ae1a2bfbb80f3847d40e074ca464df14928c86197a16c83488a05032905754cc8fc569d37cae05f0c370db6acaafc56ca9a93982a4669ccaba6e3d184a19de4ce800bb643a360c14572aedb22974f0c966b859d91ad5d713b7ad99935794d2222570a3167733a532eda0b0eb17510bcb581e4995440101a00ee2e80c5f74faece679b372ba237bcd2556c75e3ac050d30c6f8b3fc66496e03eb2cb0bb826a2fda9a05f018981fa436cc18383fa4f7a80e200b141086d2154b5719519f81654d4cd69283b5bdbab5642858804dc6ad34577963e3180a71b8e01c3e8afa5e09b12e0588198a7acf95634f74759678f15a13b849499d59efffcb20e38453801e03870e30d9203528ec3b2bb43ea12389c24bc5056e26db1391134d5067324f6cea60d9d2ecfe578b63f5a35f04f6303e130788df793bf8a717c089cc5a1f33ba0fc04eb679ad49c1a1979ebfee1e05d8f54de91f9264187138dbbea085a394d11aaf5523a9b372924f2c061a25a00c1f1227d00ce32aa33b9d6bd3151145da7ab236d663a49a39c515b9c2b9d004acdb0f9c25ef911401cbed78b071268e6d7b7f5bb9bc91e908249a48bae418d34cd397b4d010c7ab9ae9d10b3dfceb05b69c2b28e6779829467587e0d6e3259456d05078b9b7ab75d75ff12a620089321ba75ba545dbe3e15a81838afefd1ecf319ae2efc82c65fc1ef4f4e007c3289d0562b9d9bf329799ae10374d1a7b2b0d45f9f622e6b61ec8d86f8332148eeecfdd97edcc3ac2dfdaa9ea4b3112a576d4fab53417f99ffe5f6e99452a71a9064f090c9f869fd5e12ab3d6663ecec324afb89543d8ea2d2c4b463ae3cf065c96a5f38a7610d7b1c514349d307d361d6023e762cc6da2a9d114ca1a0429bbefc75a01d81a71c99eb41d940753f533fb50baefe476dc085b14406100514179a9c0f59dc034b15ce6d6cf3cdc74aeaba41cfb38e3ea2f038a1e5972b5711e26d4aafe2e086cd97ad052b192e43eb18861ed6e2a27cf6e7d7f16e767020dc8acb6acfd1c7969ef0aa3504bffe75605b07aeb9c2e77ce9f5d832570a7adcd48f197ef7bcedbd4fef3a8fa26ecac67b20d373d0caa9d8fcc8bdc737e9a7e58a5dfc19a00aef6540b1f2776c9bffc17c185df0c46085fb9fceed22798a83f57e75d7bd612239192207567ecbce29f0e3902bc7fd3ae86f43870af6a4739b67117520ccb3b95763544ddb28588bb5df5226b14bf3a06daea87f8b96311b5ac4f3ca8bda0026c6be6803f4e68b4b4fe7485a830f303762240f16f3a3b8184ea995e46d67eef11394ddb8384bfc833493269a05844b76828a17ebb78191c0e35f685149f8c8beaa8115d929caf4da207d8d63dd4dadd43b2b337c5bc266cbc580ebafa5ff35d607fdb0e52de62ca68000dd466ebdcfd6f891e23754d89f8f4198a04e060daeedc8852f7ac9200c7edfc7a6c03e672a054758b4ab4756b481f42126caee86ac4c4891f1f88ffb0cc99c3c7a5fd0dc64d5a3da2b5687af4e5a6994df94c40ca69814be98ecf6e9b62d41c9b883aa8fd8ce9ab0a6b7aa54b56efe7e4b3a2b024657c96594d6727e91006d19e1ba3ff42e569856c74d33e992364f37ea2997f9d3e1c3117633a72c15f97a87968205abbe142946fd9598d05d56c87c4cf17f75f7ec8e6cad82f974bd6ef6ad4779a009007dca0bca1f6d9b8f36e695e41055e92acea7b1ab52dddb1fd76df564ef73aeadf9f71fad4916cda05d462f3004cfd5d51e9b9b1011e8e185c95cea8f72150f1f2f4ced27b128c9293053a2b15d21ce9f42d6834c4e9f0aa7cb200727afe8accc74180ec9d6082082669b9b08781035e1d1e504e06764c8fe4373e5bdd782fa4e7ef50ef426596654568a7275e40f9e3552438a5d0ade9ef1c8a4e0b2a7689a0d867038472080fd1796acb3ba3f647a022a7eae1297611f1ad15f82b69dfdee9241064523631377349d7ee925d8d36be0f0f2cab1ab90abd1e3e0663a09d77a652513a0295c854743d17d8d494ec0c65a1c4c7abaa5e1d7cf76f3e5ad9979c00eb944c3b98b6affbdd9251aa50fb11bc622e8388e14d9256c10f6ab91bb5951f764063a646e19031b2b121bc9aa28fecd9b527eac76eb172028650276fdfa92a7bbd47eaa7323e3e43da0fb179c9cc1c8ec27d7b65a9c1f9453bb94ddbfd21498372c0b0c39103491876e531f65811750abb4be0c2e70c120f986cd26af745a615c996a0a3e7257abaee69e61837a61fd40a5ac4e60ed8e6ea04336021b55d66b92990614e1aedfab0a86475e74fd341741572cdda086e9d5de7d49c0a20b1b4f7fa789ccc14a3f1820e9d896b86e00473465aa3a5bb165ef1aa18302c1e89b658a514f826bb8f87b987dec8adc5148f5804dcef4f1118512cb3c7c48f982c9463902d1e63f9f9e2dc7aeddab4f5b90babb6be59e1f1bb9f996ba9ff3c77e377a1248ab58bb5282d7351936888fc159ff5c6c98862424870bd3a858a3aa1f68798c9f566a7d7658e0773981a32c47074bc9bc525daee07eb2289250c9100adebd2e834d9bd46f82d1f48c497b93314b18b9d7ad752dc40394fbe4f2e4a7b4fccd7e710b5d8ec29334338df882533487fe734b047d0f43b81cc43cc986cf926512d3051a3fdb040c8fbabb0947fab53065ac82e1d5f1e3fec227e64f1ff6478a35e29bf4a367a8413d0090064ce827e6d6bc1bd00044296a2d8d9dee20ca38ee9f23c21538a323e3d49ba979f1aa211dda3872598c94886ca76ba0412999eb04c6fd0416502c1b66def263dee6bf2547d88822e8eb518588d848b9c2ab13d26f45f4ce529a40d34cc48b6baf9ca5a8e76a41b9f8ad09b54128bb36fd159683708491ad6467aff0082ded0d5673ec209ef7fb8423323b7c182139a45b09b072cb0b6a1dc658c7f61b639de57e1d0120b119fc3dd32b555e904a2a8e66e7e024d162d49be2ee076a191df46090e8732dd038ea2392e8f5e12c1c24519b40a41e25f367a464880ca063a5a72b0976b0bc7eed4bf1ed0b7b885e0fad9a72a48ac33b6599c3a5c7465d9d932c81723848310faf78054c0374d8a8ad2cc59773f2c88411f176311c22d6198edb2055bdb83024e814fa2a5170368e7d386f544f8a728280f548910740ce89d159641e677f4e313fa93d1285dc4691e8470433879065c94b2b9740192e9b41031de946e60bcfc70e8b3a9f01377d3586ef00dfccc326cad8eafeb8a22ab0e1acaf1c6989fc5958ed519f2a64004efbc176f1937f912a09a2d9fb8562e3c3ee367379f0e3bf5f695482c74f1ed52057309563092068d3f8417efa10bbd838c929018e7783c3666acca54f77a214b5da4cc0b1ab5fd8d9392d2096f52d868404fcefc657dab6f2ffbe2f942e8e4d63e78e6f89f47e5f9e2ede853ead286d3a144a74be2c68f8897ab18831ee43edbf217e18387f1c7b875bce137d934cfacf896a56d26fbf068e7e4f45b53163843bfa84516995aaab49428431b051fbbdb8d7050cbf9c3d6f966cdffe7a925d9f4ee5398189e2a96d487599869373c5349a8f82fcb23c64a225e8fc090e8ba2ad7c64264f15f0b94009576678835339edc9156cad66bad53cb1551bfbed77c31d4919a3008a1a3aa2007a739e0c7aba47d8fb3a9559a20fadcd43c85da3f14f8d4958685c72f9ae31d251695d9b74c6e15ec3755ae78c6463ee378994ae82987bd1c2cea95d09944dd37e803dbccbf038aee09554bcd483fd78a2c83789a64e4796cb4e7da4b48d74985480b4ecdac6cc6de523192614ded901181ccca1d6d19eecd4704ff694ea349575c369a83baafaf043972edfc7e5952bf9efbaa38eb2e06890dca6af254b0c6f44c0b27b692d62fa7e79fc365838a03deab987fb58629a7e72dc084ae0107a6a541135e2ddce82d1083407b6503888cb4d22cb15ae714bb2ecf6fb564feafd3b263d4a5b23fee908836dd7fc4a75cd68a393ea8f0b6f629a71d5d66def2b03363d9d8650b63ef425528ff364a160dc8a70856cb3e9ad8d99a3c14fde28613b0ffcca70701f1f32abf802d08bef8a3495568fc840e3cc1b34e571ce43962df31d063c7f15c9103301067f05deaf72743da81b93b2644b99f0d94fb81ab2d1c9d1cc7c28de4ea253c8e04cf9d94b9a09d7f7a14564f59c9851d1b3b3eff8fd2de2c1f204261a563368380523085e6163f8c7b963e5123f74dc7156382ff320adb489467779a69c5063502017f8527911149aec55bf44c4ddf53aafcb471bbcc7cb84e219658df5295edb365f05c241afafd392c150079d32309018d3e1ed51ea9c374d50663af12c9f2ba05ecd184b8e5f24450d53c54900231439e87ce260a4ab22e0c2f83800d8b8e4069dcadef74b76ef8bb0171858c621297b8f748569747cda64d7980fa4cc4076d1a26b80f5559ba7cf40367b4cf2df52662f6560ecd885c01204c21c6d65aa6689f34ba8963b31ef98341e6886249221824 -MD = 1b759ff129719524de78cdf9bf814d78aba88a51cdd2861ef2b1c7fc3b5e9c73059a5ec8180018d6d4e770b6db1327d5 - -Len = 100816 -Msg = ba47d5b9d9c11ff12735ed4c040f49bc6deab2d27e04c0d335ef0b0d798a486b5b30b5489b2fb8816e7cc2ce7ea57a523306187031400ee122e7ee03b57b8874e69a52e081730e17e17ea663fe6b5b18a7581e6c0b463e897ece44e17a101cc2e4ed752a917669dc09a361b38b49333751468e6e14fe98f5d30cd54ed1314b7cdd90e4cdd51e13f86d54ba672d274cd6b9392f1d5551644aa80969f3c0c65ecb57ed68725554539296f77b27ecedec1e689ac822d525e9b3862cc87852b79dd6dc6bc8c1180170d20af66a9ad1835c37e5cf22249d647056f4dfb9848cec50c6f372ce61260bb3e153b75069e3d1e448b84205ccb3f4415b7a8a06bf784ebfc2256a40fb875c64e7f9a4f43c2bbfcb796a5938c221bfa4eba09375d31dc332f3f8bbe73644dacb0b822320b9af365bf4827e85adefabe12eef63cf658334f080f6ce8bbb636f2f76789e9a8b791cdade8818b23623a23f4bee62db20b38a4292a709f431ef02da50627c2b58915b9162048f8804c78b076a26f863a9b4ab705192d5e941ed7a12c0c9259bc9fdd9c8a57f4acfc0e24d82b51d8e2dab8e81c2e43f9b339367c120ee3401b285c780c7d281b34f117dd2f5525d8a03cc4af37f7436c19ace64be4c032b783835f736d50f9031cfa09f01ab696e56abb4efe8f12800b1e69bed59dd2736f2f48093e53b84362c191450c2eb23d658ed0c854a5e2924d1dfa1097a1d81ded7af0fa574425bfa0cf31698fdfca71ffa937c15000f9e2a8b4d89c009523aaa8f318934cb2fb9643a264e809a271ed0a363aba5f24cb09b46f7fa1aeec5792382429749d24dc8fd1c7a630f82b4b072ba274240085d87fd69a69d2011be67cf18aae1eb71e3b04c1bb6fe4e9beb848ca9a5e8eb2a894adb5e221ad95b842c38ba300e22903899daa0a4c643ce13c3a6d7a646b0401922ba8c33184eb261efe6ce9ec6f61795aa2d110a64f804769449acf10496325536245ba13f85009bd860bebab370ee420bcfd7b17f75235a20fb9050c9a5e885afa0333338882b7b112ef04d7b97fd87e5485b61c0c014088f47eb893de64af1b4b77cb2ab5f1c49bfd8ce1ec6742dac601e04e1cee3c0c808b22565096041e16eef9ee73f10bc4d0de6bef73d0d64f8a3db39fb53e60ee2b3c6a6acd51cb39c04d301979da5f2cf21e12a9e876c8bb4d7066475f4cfe59db90ad72648208a6b9fe80e8d6d25a516235179dc4d998b292328ec185ba82f4242061e9a0b76ac9667b82b905699bf6b3cbc1379379a4a9cb0c839ac3079d3197543e4d2c626036583cac1670008271693ac603dec79b258a56eb3f91a48b96a7b4892942036751f1ca639db147ac55f52a8c8f0153eaaa42ba3c2c6c21fc97d7c9d8ea9c1b0ec0e59d5f9b43af8818d9e39b35959ef19c76aedceddd005eb999fcb42d9529b4f7863de6bba198843eaa2e589416196e90a89d73f04eb0307080c5914eb7b0086a66149f6b45a35f3bc8337b270d53a01b5b1e67d04bb1f0510eccf6ea9e3e678e07c9f016ca404794c6cb496ae5ce4491009a4f0a5e963cdfa67b6b7d933550f6edc66f6a8a0ffbde283e69dc39e9ba962ba9800ae1dd7470ea495574412563297a8293c31f62da8c6f0543076446709f5eb4a16e9fe825c93ccf4b6b229efc9a4096d3bcf4d96203fdc86b590f650510fc543981c356cf2d3065b3ceb202abddd26bc5b494d430e966f0596da5b5f69f9700af0106a9df2147b5351b69e0ff48a289d04699f3b5b14d05839191c9b39fb1327848d441e459f52635ddc4ba557f336999ef5eb86edfe28070818e00daa5cd623be5b6bf6d1bcb414c826d0f4ce60793791b6d82dae9f9e9b699e50bba266e2850541882d80b2c9edfa59d504421818ff45740f37853e5b9bc67214af0a5f5fd5c00843cc39cbb8765b4001de99643c7923f738ac5922868f865dd3f1cb90759c597843d9e34daa3754a2fd89bd8c0d2e9106fa95149448ff11273587cb414a603759315f6881c6b94b46700d94d8b2a5f86bfdf99ddcc974cf98e47bf4ba09acc273b463afaf3583a9f50373088f5466c1eceae0dc423076287785d52d42d805628e75efa01f1e1dd7775ec200fb1afa52526952b90ea68b848ec39b5d22dff57f711b0a2318aa103b94280263622de8156421581c87523d4ba343d76ea3480381e54fbd20e401e33f140a3b1b0db4b870ecbbf9edf65d13e57fb090470b38b8d0b2b90f7fc94a1e4abeab760f44d8f3cdb0de3e14a3ee95baeab0cfd0a2d99ad4a000082810ae4ac35bb4bb274fc120937a332d79d62e4c32aceb9bf1b25333f676cdb0040054ee14b3cc104b7596c72a1062d105d744bfb68c0bfc9281ce0b9cfec710f9e36492a48e9c7f63ff8070fa3a122f9eed5977ac53b5fa9b5871a830fe972ff0ff08bedbb4cb0f5735a6a46bc2eb512d6295fa7ec9939ef47f6494183fe415d29e66fb21ed02c80f5f31eae56f973e9b7c1fd292b64def863ed057be8957cb8506a6d0de00e9b374c548cbd008bbfece84208652e28bf537dddd7788a49858f37ff1c67ab627d76caf14ce9456029ab0c1bf9f2515f4b9f0a3b27ee0574ec402536f645dd7653de064bc7b99211119287d25a4721630429ada78f42d6b21189cc84732f02b4aebb92d695a473093831dfe791da3aee8991bc8565fd6a9bb5ba828a2b899797febdd5243f4074d2ee0798ee4931fa5c4c45db5754945d6c1950eb9a77fc18bab45361b71d03f3e8a3923738e8d4ec36bcd46ebfc39e1bddeceb6c47f0ed12777ffabcf1c7659cc509503f59e9398cf86bbc0b114b81225b80f889051ed2f168b2323b86b6fbbbf28fd015e3d2d6593bc97b24ee54d40d5f75f6c6746a5451f8eb8881c8742cfdfb97805f492e41dd5b668030b9680d39644c74a8f86bd7a0c29c7c1449777fbf4ac0ef701c63f285e1b369d3050d93330474e0a5138bd35a40357b678c497a9c5a8c7bfcb00c7eef6940a67053ae1c96ba7fc94f5842de0aec5704f003629401b56ac459b6902d864c9eb49d17d1ffb0f0cd9d0c39396e2f3161a742314b528be5ec472b8297a4c7261e12bde401b32e320eea6038d80a33b9f5e0d2a86c3c87667182c6c67b7b3e605f4f572ac5ed7b08842fffc9a718b4d0743025db6dc8a0b19ae5cfd4b3f76895c2d8fd6e96f503eefddc1f7e0f302f3f7d23b04c987d5441e90ebb4fe9cfb230f93e2521ed60755fbc8d63c8a8d70f31712a067ea4d12ea1bc6bfd9a856ac7cc52ed42d731c62bd540a2413bec83d160e0b1ace3fb5a7c5bb56c2b470f3f05b27074eb111c8cb3da3ab95c4a42ad12485c58f80f047fd9da34ada8c7ffd2e8adc2539242062a99f90b41096663d94e52349e9c6268b7c3a7ea9f1abfdfcd0cf8d917bcfc77364a9c22c7cd32989ef21919e0ee8090a8c64f27cee5711763df3e251fefa2f826424e21bc3c11895489f76cce82ec04b96e2a7cab9d9e3f5ddbe826fa8ed801710d7978acca858e908287bdc5ddf74d6007d479b3a799c0018f716f263efe1bad28c8a7f7fd2140d988448d557454c3434fd77f8597e6420566845e316497af411096305c486728a5e7b84bfbda671ec982ae1e7fe3262dbffd7b849a944744c3617c921830b9ae6c4d4d7a2774b0a8696cb2d7311dbbfbc7b0d172c0326f74ba77e64dda4aab5ac3159eb876c7c408b95aa03a17ac2a24832d209950e372a77cd06dd400fabeb610dd0657586813b82fd8d097b212f34098ded368ab1c1365b1077dc52ad56638fbf02f075aca122f3353dea08ee699d86f2284716d40a437cd998081c64f246bdb1b7328ec6251d66a7824c50caba0447ca49e43e5f5b78648e320aa51dc9bb744ab7d3c8bd555664ba23d85c9b6891d57e19b40c3bfcfd9a990d89f6c121eb3bf2c97c2b7779f274d6ea35334bbc6eb7746060874e35fba660f12e153643fe9a11b7d5c0ddd91c1f639d0bddc0fec07516e68fb7814e9a114da6a10c66771b190f47858ed7bdfaecc9050463e476b298cb72eaa5bd8e0161c6f389e337056a415542359d4e6cb46371eac6cc9d6c69a7face1958e83f592135a28fa093341499496f8cf6282f730cc114f920d527102a0dc0c3d8eba7c9d601795a4d614d41aa549833a04f4e5f70224a466873f0cda96b11902eaf0e7a0a924193f1899818fadf83d1a3a9119f16fd5655ab5f0fc8ad7c892a611bbe934450c1e195f25dc21350f90f0820bf5c86b8fecdf181cc2bbda8ef367916fe3d0da3c3ed4086e4677d10c295d69ba2bd49bd0b5642c16e1b62570d5f7f8a15a0ecf30d5efa2c742dbe88a60a150100ebe672449aa7073fc223f1a94a7a5e4ce369a869ddcbcc573f601f6d16ce3c220de541733e273b854888de8ca2727aeb2f0c2a9d12bc4fd3c3eb3cde620833504ccf915eedcb4589d519867e0d70c63aab5ee171a4d49b31e2e549c396cbced2d02bc9ce4d9a0d938f5f5246337a2a8080e636af3c1c99b9c3d8ade25a1ff5efc081538b069c7beba1e1a8aebe9b8e07d52c8f1d819a31b28f4bd003540d90f0445a965dc1d978d83127f17c53d8da15d3b955851c584c666dc71af02f9c871d863cfa0c265aeaa368ba96799c3bf6f3a114f1adb45ed01b86d3f37091d5c2beabb2e75fdc26bb956d21fd6d41cbcae969c5c95df2b2a71a01f7c34a23be2a1bde41c5208c45d1f469e49020ea903e3e5055475f7e5eb7ab07bbf2478c62a57c4573fc15ddc01608838cb6593e933b3c804bd27aff6aea15c0a8e82f74c61c2808cff407789e701be4a0d6e2e5dba729212fd1751ddc26a253450dca85f4786850dd16bd04e7c973b3a85a8188706c4e5a8aae1981be5598e91acadf65f39f844526c8012aa30859192da9ffcf5b70f354e3d02ed3175e40a9b08538bccb7bc40e31739992db15153eb62b2361a39d6037c29f7cbaf029e2bc8ea79b3385f36fd486804ee397d8ef49cb48b7e750d9dc2aaf83cadf509ec6493d99d17127eecfbeae55e8c5dd392f62f46881086b0eb05533e4e1ea3fa5337943c2a21fbc562af5305c2fe2b7201cb3baf34b6dfb2325e1d52a8a82c62673742a89d5e54912c9a094fcebdf2c75ff61a451dbbd080081f61ebd8b4feb09cc617958346ad80af4e8639ce367442020973beaf9a19b8d0cbb9506acfbb8368768b99685577026f3f524a6e0200809c77b05276fc1bab21059c26bb72b3595ebb371aa91531a4e0dee5f81aab27f183c358c6e04c47057d3f82d557289690f426729fe2007dd6a8bfb9d9509c6b236c6ee58287f53c2649ebe5f2da7bd5c8ad2af6af9fa1bc162b546644ac504a749afceefbea915bac1b9d6df591c6f16efe5b1ba03e636ce1ed3f43f08a513683a3dfcdb964ab35f566c6635439a46a027c195a484ad000d862d30b337729cfdf2b9a1a41a2ad4b90bff97ea51e8ea0119ae84ade4172385830b204a3ff4466c586be4d0b11021d1c9b99085edd00441acf6a65f8cec443efbb4ec8b88f3babf539aeee9c2c541ae76e47a8e7e183c69cae02241e2f40e41d871bdfe7a379ffecd8fe677b712dd58fcc67c8d6c89397f5ab320db4ff72695008abb2c7e879e2fad93f500f7bd9dd841a7bf0b1eeba48e43b8cab63cbc37425d470d9cfaad5f5cdbec430eea8e28352fd16a90fe06249b6f3746590f0ce751d5efdcd6586f898c3ee2f728f84f2777ad8ba6a273a162b0c577bc4c32afdec952cc4f63fe96c4c8c0bf3ad789c641a7a21c9bcbe58605d42dc255180b6dc5b2bb248fca56eaba1748c933a105bc1fccf8cd7092bc7bb6108f5e3844040e4415f840c393c6321081bf4a0b11d4fa69ee96e64e7f61491d6bd3948f58835902f9f0681447b838710e0b88e9ac5e45c61564af5c1b3ab8e1ede2ac7fddf217a8668de4aa6d93c283c715ccf6fc0c68de4a4a6fc3edb08fab9ea2ee325ab810dd64b6fbac8dbf99eeb3c55d598844295a943070aa7e2c982287fca2d0573d0c4afc53f64230a4855bda04853bd86f52e2fcfef83a541499efafd80f805ce9d397354d1d96ddaa4d7245b88ac475f6a91d899c509af9d15bb91e1f7e6bf2242c6b188ab8cd1c39bbdafbcab51be63ff7b443f2c0f4f5cca629ddb737b9a056e16eabf30f1275b9953c04234e69b3b4034e32e98f6dce6c41e7f38a8291efe7b849f8706a8b7192a43f69a99dd565bc97945f67072f0e18f69a687fa71b663f7aa407ea1060972cb08c3146e98883be792ed1556e623c3a8bea457ded818dc6ef26de474aba6fef81ca64e17caa952472c3909c0d2de139c981916e9ee8ece5de78877160c18244dea20b629c6223554afba5222cb9847d78045439007a0c0210420a4e9a9c579190bc2db092d8b6b9c98017d1132ead6e601e96c65c5f74874e2b6dc83f74773f60bfd2b5a635d5b8b7f7ee9009b3e574487560fdf9bfacda5edbbac6997068b7135402581fa109badb0b33465770b2f7fab1b9c621c13d6508fbf92feeb9b4607422c6814743d927fe62eddd468e9f5f3c7baa091a8dae8e163330ed8776e2a14ad225186444cd67e8a4243c1c353114d77b3aae2d4c87bf4e2a69e7acd07be45c0b2806bfcb6de2617ae04b218cf27e9358719da226515f7a89ab05a5ef06907376d631a0014201318c2af29fbc690537ba57bec14292d660f7ff2fb9fa0b0d57ba37824e0ed32a1f810919dcec1e128d4bf5f9d1c9d58bc91d6b4d311913c2d08053e11319a8c6f50186a821459a0b5bb052371ce29fe87ca2fa475576a519a6703337354a4a3e79b6a887b6ef645a6a94765ee8b67a544330b1056d364979a031de6afdca40f87445779fe3110465829d6a587e6ded37e46c9a70c184874a886c5c64b3c1125ead59fbd6f0d403966a73350b262e81fa2800bc6e9986e8f524c8b60b9f5749d7ee983d15245fe854ecbfdf612821bc03d7941fe83c64f3e03deef34909b26ccafdaa4445c9db3b06ce297141cb6f29bbb9cfccc7f34731749a851b0538fd03a1a338184c256f8516d958f29258404d8a955acaf10657281905363727755e97c3a8eac21480444cebd5f56a3e17bbb2d935dc2150bdbb623844a94d9608fdaf98d467498324811bed8aa7e22c5009df0e5ffedacb5f9c67372085683c3903d388ef58b583584f7784c01760444b515c93dc68fc493621bd8061738d0050988bfbc0640ffb63d6ea183eedef6e4fbcb2ce74c18fb48873ee79cf1ac6ca94e3605910345ed28e3dfb11cdd09492a6726829eeb29cf39eb9828c31231a824e0dd90aa76faaf221ad33d735685998969a060a14e229eec01cff2051359211c63d7f764dbefb42644d18d23e5e4568685d14dbacfa418d36c4ef9cf5f9345d449cd806cac95aaa9e46346baf5a60eb64e21b037fa1e9b847d8d96ae6160a4f10526e20e537ce1219bf0f085203b307d152a3ea55802b573c8046f1ec351ccf7186c92e67b160621be12f13ed0245a5f9d432f8f63e0e525de6bd99cefe70c6b1616f9619de1782edd31ef249fe1fae2291529529849a91f22fc6ca5618101a160aeac2c067fb5bd7be640f2ea0470895b08a29b7fad8fc4386e9ec4a2c04b5e9a9c21827f314d320ca87d06490c79d9a5a621c6947cf7c9811af6773e1527d71687d02152b6bd3121e119fb275a75378b763d6051488f738f89fa499e0045cf86da5e651b60744f3e38ae3e1f8ed1479ee14c0530809566c64420984d12239c4e0c12ea43ef00c0c407803b9c0a3c7e328fe401dcc5c827c7d1efffb5ab2fb1eea5a41d6682f15a55e65690276d054ff8ca7bf29078962b06abdefc826be8c4eb3f787afdecb450665d87c84c17da2154399a6406296dd4f54a73fb1db4dd39c622068f748cc86767c5aa4074ab19b6d745c5b2a858ddda36262597f2268b8501f5e4c754d3bbf3fcb724952b874264e487648af177549f2bd78a3faa21623b114379bf2961fd8a77ba8d32eb4ce2b02e771d397c15708858c7187e9045ffc086635bd36cb80b8f7b484ab63e6c893cf78d566a92a3a04a4f8d36b15ef4b2b9d40e01b09936649769d8f37b9f56944fe232868aefa2624972928b9470ce399b8c8bf1b3396da726e5f50e0f88aba27d612f4416fdb2450a546f7d845032e2ca1265a267b7de31b25214f0ee74cc124a16ac058b1733a701777c930d77b34cd9f8339a5aaf08a2ce40c152a4fe48824a55615173f6a736d35e62529c71cfe65fc07e5fe8896d68ef348299af8f9170d2cfc7ae5e069d42d47b8932bdc8f93dafed9e59bdd18cf279afc13c8aa3474c97c84772a5b18679995189b9edd7cfc16ee22c1e2711d7de021515c1a2d3da93edd17944f791e3399672cc6ea938a3fff1409023d0c4ee9a2cf6e8bfa48bbbe5699dd5aba02244016041c9b77c662667fb7b72f1375531a53ee7b28cfc556b9f7f7fd50d4bed197f6b511a3ae3dac787d2053d0cb75d318dcc4a2bc016ab7a40b3e9fff0574ce3f23c23364f5c20f7ee098066dcfd477ec269a09cef800868679b7ededb6eec2408373a968b51b337f9265f88f865ae69d18b7d8e61b4e6a6829aa0ca44df256a3000f9c375711c1837acf50bd58cec8339965388cd41e0c51035e27ac3449326f81e03357416c619380203780adfac7b793ea51498b361449ef1d648bd1bbfdaced2c9752ddf4bab58c9ed45feda48930ed8f4aa4a65f2959d52debcb8e0f5f622e3cefb0927175f3869350e28095b6a68f9c4b268e61f3879dd7e5f3d20f029a2b5864f7c7aa39555645d291cf95f72161597e55ab041cdd2f637a8c04818b5cccc81eb1e668afe2e5fd83f5406cf4aa4a0d09bc651049637319d11d8e2ea5aef9d3446556737fa219028a953ce15448350214e0254c24205241132ed7def69a9ac2fe9c7f93509ddb9e10f92cbdbf04077ec84b5181551cb22267484758262797dd76ddc990cadc14173daa76c8dfe5a9ca4c845377845f7d05f6f24666de5dd86cd1b09c319666aab6382f84ca59f3032ec91391f658f29932e8b43ccec64546b73a9d603f5c4387c32a10bc8bd836fdf1678175c679dcf0f16416915985e6c706d72d7d83c37c91863ad688d202b7805d4d5465ae9025688a92a1adcfc44944a0d0e75bc27418b24691084f697f7d72b8a417cb7845d6eb449bdcf9f82a74a6ce4e5462c7171fd14d562e7816f890bd4b934f0eea3ff56069a74fdb9c6071d3d879fafb59539ad5e1b2d16da215f9475e438696cd278dae3fdd83bc820d48b50678638c3fd090a84bcd7895d57dbffa39dc43cbe8a4a3bf0f66ff0573daff339f74177f42370931d3ceab5876d9eabc23850f15055f417a206a4b1c376ea034ed949c3a2a300d58c0def21e4fd08377666671dceaff6ec7bc10f06b967332a236017c27bf62a5055c24d64f260b901248a8f188602d338e29807558588ebe64c3e23facc876d820edc9de53c4311c75127317812f9197b7b0e3624d44694b62dc606b330f13af91bcf49393f1eb2c880bee6c2f1fd2a22b996140b123ace184c9a38a235ae2304011ce7b7574e1ca337d4277fbf8995cd02c2196ecbdff88b2d1d223e4728b6516347f206217bafd5eae96c04b818dce8fb14cec66da0849d43d15bfde1fb556f96c2e0ac3a01fcef1e713d0888357ff516f09cb8642722bd25596e57928080ad20203bffed8b743d470e12e1bc79ef7fcaf81b9b6bce33794617a1d1d572e898a3e27c97d872b67ef9127626a120bbf79b9db405e12037402a9ecf03272ccdb0768c2b0a675223f2a920ef5df2f465eb1d540e8e40a7cea057512e420428d0933c8fbfae36945d56ebabd6ee1e4f6dc8b4bd838b16df3a1830c14834f8f1619f5a6fb319b2d3c30a1535c55d7fbc342ee62cab82d0213a265b71b55272112163449eadc3587ae58ada315332b3a5797c4633ff0c09381f494be4fe111bf2705dafaef841b40435678f30e8f446a57e3f4965e69d3e6e89ff769d7af7333fdf0ce0132b0b420a431ec8a6ff18a536e2e664350aaccc5eeac75ffdb47b6433ddef8a6dce868ee79f1f0b261e165bc428102b23c3b15f63b22f8ca853243b88fd8403115b59f74699f6bb10ce83d6e7be3b02b4ba5144178096710fbf781599ae58ee9049dc1781d4147d0978d7a32c25d58f5a56f33704d69a91a651ed7f0070dca17d22a36c33de26b572a5984cebff6e2597121d949614ba830ec2faf437d58dc03a6e4671d7087bf8eefd3c40a19b6369fd8446d965db64b9ab8b3701ca5cfacf5a952ba4d5e3a2bbc0b83a0b078a53c0f015f591de8b37a9ff03281412779233503fc981db002972ba9f1818686ccddf014fa04a7ab491d88bc324c7aaa5f270adb6a6a530ee8eb21efa6d056e832ff8c3b9dd6fb4e801d9d453d3891d687a1be592596b81ff20fe70529f3e649df8b299cd137e378606026b3daad4c55fb7a97a7b486148c2aebc5140254fe4fdc6a105f1d8f25d1f2cf6b2e921375ccc398deea9fa02ffc98680244ba5968a2308289ad0a468a023d52b4ddebd3d2e6e5e5da4d6f4ed018436ce8bcd86cebebe3bddbae1fc4dab349d248e86f532c496b48d5f5abf7c18833e0bda5e4f44ed2fe025089e472dd8b1f357078a6fc4a9d5ca8150ddb02c8f370adca2666595afe88382e67e1b65a33c66574b51736f68bc1efe3bb87d9ae0203b95768e702d7188949be6f9ff91b5346489cc64a6af6baa104872738e33a5cf3eeac93ef598dc70a1c48caa5a4e692a8c82fd3c7fe13d404cf497b758836a9483310ce04c543b41199149f7b1d8498f3cc7706175c157ef33871dcc73068930a6fcd41b0aec387a9a86917aacebd0e2f3bba85c1eac46274274674b5439ac0428c29157a7cd3e7d731915ab91d589c65ff41784d12e8289284116bc72992d8f8716d72ea983c7ca51cd28f30741fe99cff5408433b487852371ae9854b19843206e07f8968c5ef1a5175de983ad89edc233b5c2cccadf8be28a915780ff66cfa33cc65de5538e83eb9c17077d74c622d533d9e902fdf53dd40061727def33757e0774b72c85c0e1a3a006d58b343de9877a3f3f5cba62fb76579181a21d68d52f52a5acb27f80ab5bd78fdc03685ba2477b685e508ca3555804940da3e6818f15a2dba73dbd583182b734639c8d99dda3bbb7ce74e120cbe7abfb6ee9f717d3ef8c892f24dbb22496a37734ad1082fc0acfd008405475cfa3923a3deaab96741b5430acee4718f52640caa7cb9db19e1b0c337429531cf12a7bd2e33c9077c017ae54c9107c1713aff3c1355e817034230544cac67980b0dabd480746324648630f87dc22071710a250ed85fc68794ed15f96547e144b8f32cb1c029dfd9c8d8bdc2c8ea964a36c9bdc91e22bcf275e945faab9d6cfd7fcd149d17dba7ec50000b8c5390d114697fafb61025301f4e3eaa9f4535718a08a24adead112225a305009d463c3997b135e31dd3f08bd7c6f52b305b9756b4fa7ab6bca953b84e6aef863fca77369ab7f24046920b36e28514aff4174c8543fd5d40813329d12d4cc684b807c730e722beb07873ff970834a620349fdb64ffbb54d073751cd58cf293e15124b78f449ba11bfc9e5218117bb065381bcc5dafd9664edc94b32c31035e875249ccbb7acaa4671b3c8f20c4013c6648b4a8d61d029ca202bb773fe4282d5d03a0901c5156ce7d1a753b16ea6f510bac91f5390fdcfcb42e10ee746f090a4bab4e8a1a90e828454470e0644b6cf83cabdc3eed4e0f916ca7bba234994dfc39947e421e0127b8a7e0560571afa138e18eba085aa24460b3b7e51be8299d0c0f0456418e6abc888c354e33a5deb519e29e55dde8d223736fa4b6dff6e8a040b544fe0ed4944ea0da8c81f1689f51a32720d544ffa853d18ab75578c89effa2149c9f31564786067b2d17c722bc1ddf985f62c607ea7d82ea38eb6ec412613a125361337e4a0cc45560373d3bfbc0d41ea222ea6861488f796f9f47540e6f0e98b36b9bb36787e2526d09dc1b25e38a9f3040388ad55dff1da39a8ddf58d1298f02e6f15c649f66599bb62b2b022d0a0452e238d60e63dac01e03c7cdb92e90dd89f9bee30afd5a513466b3d159475b36503173b2d303284926037e85f92e4d6c90cd88af2149c5247e40fa76f3d8851c72547087ede5f2a004c23971e07a66225f89da28712ab0b9c26d8a839989919d0073b7be25b040ad006780f836bae6e93d5639b6c14922f84715eb5e110286a341b8d1bd410c1858611bdb82c295d2a8745c2fc1db4e23c9575ea37123ea6c157e4945ee09a384897105d3774db434474ac243b185e0bb1438733c2399ea4cdaff4e9bb8471a8b28764eef409fbf13ad08b1feee88a7f3c1337a3edb3aa92ddc0cf05c82c11c351db91db843805d78c4f550e6e0ac4dd2b8909c2f03cdd01702ed560fb6404f8b50829bb5e9b8366a735bc885f0b87761e2970099021b061234e9aa3cbb8c5b94a919ef6e9a0ef3f1a28040638476cfa72590cf0340ecf4275a49116bf96de95911c5436bbf4c3c1539ade10606acfdac6ac230f62507415d5d56b525d8aba1e06ecfbc35be38b8df212ad3f8dc23a9789a764cf9193696bd2355bef1c00d2a33aa7f8453019b1056403f3dc170a37a149bf44a94843f9b4d95915458195d2d5aab1dc34dee3cec837f3447e728f418875784534fceebf7179b519de14b61515b5bf1a0acefe5f26cc6501bf46edd2cd9b46e8fb35f0253231edcc414bee23f40a04344f66b5ccd1bfeddde70a9275e129cf925479f4c5677047bef79daa79e11645ad7b6ca6a23980d21bbe1409a553bf66e3e93f791a91d37764799087a17d48e7f807173d79de9dd65d8d19dfeba5caa150120cd98f31d9d15f3fbae21529306fa67b1d06be21855f05dc7271b347b9f3697758a2add7d20a01b273665f655b413b5fd48ee9b2d5c0c734c46b96ca2bf19271b970f0f47a75ee9a6060eab23801292de43276f2edcff42e7629f09d8f106da985a0f3083199883ff88e41b04523e25db29df0725bc12f120e396b4261d44d8763df1e837609611ba22afec0012e0977c63de0a19e48da87f326615922b1c483ca77fe16d63a0bc603e36c61fa8400f4957ec21133bb8918db5d7d32704d65273007fc02c0afeab784342526afca6b6cb6ed1f41aabdad1d1d5b097ea8eba20a2afba307d3df7088a999b37e8f65ab48910542a361c3d93d3fabb08e5b20fd7511ef8d766e4d4f81ea8091ea17fa3300ba63f6b6f7427fd1c8dbecf1f591fa209b4015df2e7dea5bdd754af9e7dcb52da965861ce9ce13733f48293a06930a750d99c6b262e5a37ee904391e6da18447d4a68b25a7cb36aa099cffd71cc8b0eb1f593a90ca293d63a3b9f6d817cd32b7c2836061cfce4beece26db599687800b170acbeab29d0a8283e30ea784d4332609a8c061a05be5a9e39236220273ea5dab3b0530bac58d84002beb1d233b27eb00730595e7d87673e05baac0fef2724b324660f3514748c0aef11699718663af4d7eba8f04e880c55aefb3d6daa79a5c42c989b30476ced0f6ef0bbd0e3a88cb571859bd65e09726a9cabba423f7d5296340c9e042f8822d6e5254f847cc09c793fc6d91a9752c0053695ce96967b51b0a28bc1bab31053e7bd76ccbbcbf693cba8760bc4dfaa1faee6801f7297bbca9adfddac59ba4baacb5facdb7db7929930145cd8da205bb7ee143355dd2a84e6dd54ca06e92e824c09318f23d32adbd532eb41e96641abaf4c267719e03720cc00681a7773f6fd64299de64dc40c1a705896ede56f2ae3305185141382a6d5a68b8294a9fdfa0418b40a7b00594398922a7b2875fec34a618399d2eacb5fec99070c02419222df9031e014e599b89a613103ba411af42a6b6dca7946c34aaccffb6d2aea3756d5f528867aa38c536b08f4966af0cba5c9759481d0d173505f70ef0dd44af67e2f6f216675e33afd52adfc9d012b19be71a88224a030e2574ba36b54ca09d6823625a5e7cc4dac9c9679cf7e48990d27682cbe1db10e1848ba91f8aad3d0e04a2f403b714988e9198093f7a304e3aec8f628d0d2cb111e0cf2621d77b6471abe65e76c6cb23df95d5823fc7200b0058965c441adb6e1fb893c3d63233c158ec71f43bf40d013e54f6653645503a91853fb2a97143927b7a9df4a51162de2444ba47cbc566bb3b4d6f149b9b3d476f10c027f5d711e8b5b5325b36fb8515842333db9eb144bc46edc432d82f43cbe989ec0ee182b2bb4ee6f549d45726f1d92683222d5e337ef1c48a228487f032913ef7e9c52aa294b78e4b5325caa51d93cd1cbe1012cf8dcc402576292bef1616ce983b49256dff7029c909a3bc9bd354655501bf755563271f1a902e818cd0bab73195c61971761927e2dfd6a387cd8bade08fb40c8199a28ffe230d2f561d2d67486bc46d597313372d382725e566c9f533ca663eb09bbf3134916d9bd735bf7d613fec978280eea60cb51daa21296fe9b3447e828ee3ed91525d984d9cc511580084772e892a0c1305e932a6e7a00dea0380458e68fcae3eebfa45caf345a395aadc2ca8d9d90bfcad170eb295452474990053a8cb50817845f9de8a8731e6a4c499458d01186ec176f0fa43a6933427e83731684289f7fc04cecb02c5047b03e26e8a417b52951fd7f99dd0b814cd5275a767535b038238ad0ba3ca4947a13188ae437cb5222f56548351e0364450b2d5e35dd07157b09cb312f157607619cc2beb09855b018e138130cf08ad9c5e976d4d9d9621e0f3b69b872c20c71a452240a754f1b97b41b5c2846da08a97479eb0789eeae959dc14eadaccbcd9aeb3e27b55be587cf9eadbbcf0a65e59cfcc2743e6ea65340cca1605804b9204add66b10989e1001f7d9e3c5080178a7a02ccfac0b088b9e745e58900a3126f4822d4ab4c28cbed51faf7c6f2d17b5d0b31a063d6761c4954b095b0efb061215d6390fec75f2cb82bbcbf43ff2516c7172e4599c8e8eb694eb4b7bd6b542b9e5148a090c2578bc8766cfe9abda3723165a4c382de307c829cf95597bdb7fa4dec780e4b85377085f9b1bdb375741601be392308607357fd072876282d005598f59ce216572863577e3403766ebf8aa1ea956c1295dc054057e923570258c5e6365b22d88252eda6cb9cd8cbf2ad5777b161a687c6900db554e3630c86e6d1a0755ed87b4cdc95daaa92449a476604eddb45d9513bbaf7c3c5bf3e2fffd3012c7b4c0be6feefe45be0be50cbb61119692fe80e573c804cd17424bca9b646ddf310cec401dfb2619238c7034687d71e5576f34d81110a934927bbe660f368ee5dfb8c0ab4394e94e5795666f302df9c18780d9cb701815492a72cc33dfe60bbd3062de5e752ea05bd6a127fba6f521b1afddf05e1550d1814bc1e5b281e57ccbbf75a5d8274af3d83d5a45884155721c3cd118fe756d565372d39b70a9c75aa7e97ba7b6de5c5c39d80b3f9373d17387baf4a42b14902c663c426dec9c0e1dc85aef64691ed531f7533e868bd2fb9e7aa6d32272879bbc000478dd84fd2c4ea3704b5c7d4d681da71b8ebaffc3366b7b8cd7245322d29dd767f15ae821a455dfb60a0041fe6797bfbd663d6de91462e0d98b2a5b8ac74a42d3467674ce08dbc3b8c5e075b67608a7a54f8e34a9080d61195994da33fc39d8e2e2b0b946bc38f5e4e98d86e9f618f56fb53e027793d372d8ed047d92e3e51ff3408a34204105fcc6ff67d42d7a113f6931cd45f94a4d7c749ff9b44c10f47e910a6363df39cb2ecb71f00bd564b9ec4e4fac8d929de404990cd4fcb405b07b588aecc6f808e1328edbc68c96685b627b596c37d8012fa1929e26d55f24d1ac965c86dbff30f07e7db74be4d4d77e587cf98cd33e1698ba1dce7fccc200a078f6e9b22159346189247f00930544bb24dfba7eee3930b7d477384051712bd566d6dd0f259a95ccd8ffad8515cc326a5dfff6b2f75df1f5875b4608f1e108c90cd280ee6737d78ae47bcd39fb8e23247a6a38e97d10dcda2926924a2c9629f3c1669fe054c57c344225489fa2cf8971f0ab1b52fe0653fe506587746004f1fe2b0f64857ca7f6516898ca36aa04f7db674ef8afe882e9aa8384a0284ab20340b039793e4d63c85ade22ac9f7fc2d0b924a27b50cb2b2097492066d63b21e053e771687b559d84b8f96f7a2aa28db693df51fde614737b2d07b565fecfd8ebb03743acdd13999e0460ebbd78a0da1c03fdea0ac062d06bd445b00802674bb7de262ca0d4060c86c5ab13e0f9f91c6381e6c71c7024e6753589bcd791900ec7464a98fee0bb4ac1651e647f3f29d94f864065cd85d90a19c95a185f2cd8768c810b15119391f8f07b517a02b8a1a5129981627871fddfebf82d6f0924bf278a06ee2d736d288b7670dab0f5e70ee46f243039b7b511cc4e4a8a2d5029a2a642407a5ebecdfd66d5de20a5d34aa03bb7cec35805dfb353c358d6efeeac216747e626053e366f3f911bb9c5257423ff8ee1b149ed4230faed7bba031f0cc9df0d3087dd8c472c6a3ac20c8b56c3f8c44715908bc89d39462f5baa237bfbfa91f4e7f6242370837b35699f9501eaad1e92d2c79a42312ab9fb510dad8fda3214a14517959e3322e7036af94e9128af62d491fcf1c4be93caf3f47b2db5380ecb9500528e571f7932475e90249f3e7e259eeb772eda95e30d8bce7900a685ff4b42824d9ad88604e153ad0ab3867ca7fb4437ecadfe47c6d635476de2be5472083c435f37ad173488baeeaf77d163ab48871fb40b9a548dc982e7e03077141586d4dc0de14f43a67d0f9c24fe2aa3f691b9fb63a4593cc65be73866766b55484bbeb4e014398bd942b42dd192dc8e186b7f6382149570ff11e4a17721058888db6c566c6cf6503b8e3b1c5be271a29f4a29e085e8e98196601dcb88ccc03e559a30490947f0514b9417001a798481e9924beae57dcfff3aead51f11d635e74d1cdcf54d41c1df8818da4193b48fac85e877eb376fa34a4af6bd04a8d9e103cdd7b4f3bec6e58b7f60f7895e1fed7302b11079e22b2de345382814c4443c24566f4accc453d5b5a020e12fe0384875de90c81f7c2caa5ac803c8d7eab1a1b9852810d904751d1e98cd49adc08a0b3577ebe1447c00b331320df1c6828edc43c8b6a9a0d5a72606a7ba739b5581b0327d470e614833d2d711ab4559324826439f7f77dcde767b0e7b9d016135bbc1ed4d26922e973283ece5603618608a2a4988070db5854f96a672d965b7d794dad665ff3ee4bf8930c33bc1468c93a152c600d1cdf340bf036f3bf432d7c1a9457e6655472c47a483fa7342e91e524a3a3998544aeeb7214bb92571eb697a65bc55bcbd5d8db610d8033a69a04612c14b24cd2307305f32ca24cdd6e1e5685689ecd79be451915ab77defaa1eac5bc2f0080db285408f5029229397c8d411f838b455657e304feeacbb018896b9a3bbd363d8874797ee05c343254902ae1dc7634c94ce7da26859124b1e89aae671186fb8bc15b0bee1b03306e14f11dbd2508406442b85207106a2cea531edcb4a552f8736e2632e110bf2de662e98f5d6000581b2110722d093b88623f5b1c0a61e9d4fc771e15de2657d3a027bea84af72723f8cf386222d6cde321969a97efac13382fc488dd6dc595cca649b98f0b50454a0235784b6ee1e8e3303e2374eeee97cc123eafb116553fbd00b2226d28d52274413b17559790533096213edc8c903e37b0cbdaba623e1e51b44841692aec854abeca5fa7274dd8735b2533f753f8 -MD = f9dabb2616b848d02b9dc3c198aa4418b7eae1224c8ae06d17fcd4d767ee429f139a3b86aa4dc0ab76382d8b4c9135fc - -Len = 101608 -Msg = d94d5c206e65ceda51c7c4e2b2758677a7be7a73706d8c20ff40d24cb89b70a0757eba2dcdb59948964e3098a850bf6de4aac753756a6fe8562f26ea14e18a94d69f882b9af9c5d4c1603da8ceda2b0a6bfb2838ad109621989d3f77e60a3a0404990f415e9b1a25dce4353bac7c91f74397e54a9ec7cb74ce71661ab37e4998085294989f0260e4eec15e78cb9cbadc746846b0d2f8d488ff93e3fb05a47ff7e9b46257e8965fb800e10188b2a46f5f07549293d1097a0733eafe4363e6a3caafa6c0a7bebfdf4a192b6592e9fa762b0345131a216485967260ff1a56ab7fb8620ff5b0abe5a7414187d4bff90897e670220f6e4c6fbddfc5dc2da7655cd96a0bd94a993670804680dd943769349c3956d3cfb6da94ea8a3347d213185f7a87b2eb078be8c83201df15ee21c1e84bcbbe3f9b1b513ad33fc5873485f71d2ab85d2d74ad4755851965182aa58a8b6e45af50bbc53bc841a582859b268bfeb0a51687d828dd8041371bcc90ed4b85cb4e32ed76db1fa8fc647229511e5b6bd6f5e4e17d2332af2d02071a681e8c3d2b8f4efe15868641cc259d5c9d94efca6251d023a9c7cc4b122333eaf963d61d55af0b6ce0edf7fb79900c04c6b0d0841d60e035a53c35bdb841a7258ce2af8c1357711d1f39fa3eca4cc60a159c8502cfcb1effb9a9f56ce7056ab169c3a2f22b2f89fa1a9117728802d357d27d96ab4039926a2c3692bf67168378d82f34b866de5aeb191ed7ff7b593cd2457e8ce63753435c480d9620ff1efd61214eef448c0decd96307c14e6bfa0862b5c4ee1d7ec139be535389f679c2dd538b475aff656348aa41755ec5208c3ff16c7a44b7db2a7c799633f1a89bac2d385f43fd51b8897548fb9034cd61b8ea66b0c6171c1736157359d358a02e84f5f7e66961a34f267b99d97fcdcff8260fa8cad0edb3fa8e0b96e45b4545f9f13b7865e20d5bf0e36387226bb131ab7db9a102c151e64bda66c97ef441ffc69c09a327d589e3646834f9207b665d4365ed389fc1c81cd4c12ef370c6d3365b2d6660736b5ea1735cf6d619d876b98888b555ebf7dcbe5bec6cfe03f88352814b5b9790cb13ffe468b20856a969af418b18e02c8c1432a90328d17cb2d9bb009eee30c71f306381336f761f17c5a538191fc2aba8f8e186ad6854261e5edaa0cf2913608c3e3710663508bc4a140533d8d0e1b0711133b992366f4861991529861428a33cc4e25aa80ca67469dd36fb7035268212e6910c5b990a29a612d5626ab658d7574acc27a2fd38909da9a0588a56796bb1006145b09a0d12135283142417894604585d3ffb0fa6580dffab11ce39c3b177e50c2d383f604bd0e085075c3fa4366c77fd695c4bd814e267bff0e3e8ea9d8b1ffb8c9c92ec1c06444503b93792f0b72e146f6db7b70c436944bb726bd8771536952a849b97cddd0729d0e30639bc0c060a17d55e2988598ea23b22c873873fb041ce96614aa57cb09b3583b483e19386472a3d4517cf4b5d41389c09a5142f1769427deceeed0cc702fc414a57a97636336f4c766a2a425f8a7a873655680df2744cdf4469eeb4d5c6ebc4cf9c5ada9e37b0abf808e1661ae3c88c556bc902cacab56572a5ed9d614ecbb54b3c3de947b9b301d3db3cde18b5eb5370ce803626d344b67d8835eef30463bbc61e9acbb82341f70fca82d3e169ac838e68d5d08ef6c37b6dfc0dd0134f7d7f492ab9a879db2235b5bcfd6cfb65d1c4b8200ff88a9ef85b4ae8bc6b4a97dfa8db48e1a7134b1e62cd9bf3d2f01322c0f5de78d8a330adff1d338be61f4552df85605cf00dd9fd265d4ead2c48da691c4d8a56956015a80eeec7c26a1bbf9ecc4e5a70acefef862b6fbd73a389216c83c80df25a4ab5b231c38ba91ec46e8b163e1e660342f482160ad08d5f3d52f49b6f4d944de7789210a667872ba5bae1665d95861c8c50ba92376f4287ebd4c90c49338496c2c712529e43a6b8430c6763b4a51720586af345fd82db441c0fb37f5ea7095e6008f89fb3074cee28cae6b64a3763362bacf8d764f1a0bd576b7a9cb7926ccd4ba50da1ee9cc2f5db5e27062734b0878f7d90f174a4d91b2450e50a5bdaf60a0a0419fd56e850f4e42eeffc5482473b0b45823b3683ce850b26be725269ec3e258fe45ef4d43d13cca40940d80b7079286d975cb177c7249555cb7ba525999024ac356ace48d37c19263c79bbb572696c5b97fded660b1f4945d5ce5bf8442990c5d5c9ef2d5854561e4f4f066a973461784ac5f33ae39fb05ea3127cc93430f1418d245c6915c608f30b6cc01125028f2c775dcad997cc5009fff0117fb2cecd8823231ee652f7b90d3875f19265fa7de0e86c7a2d6fcdb4acaf102104062bae025f6d3e8a5712f0d49e15a1d59f45b3fa639b0c1cb2cb61b17c19b43f786e1b170babc43f6b3d36b004f2d9c11b0ab9e4b1928790aaede17e2eb4d21850c09d2fed84b6ecd7a0120933b4a040207218049af8f3709d5cba7d8d888477d548bbb2cfa11e79e4650c47f404ff3af7a557c4e57559a4d43f7714603ed144502ffd0877a903cdd7b1acd20d8afd95e9cafe8b5cb3c01397bf9dad717dc267099ceb99ad456ed2fbaf7b1246eda23a3c0a95c0c55730a72e04b6af86ee5ec948b80ecd3b1d666f9784007069d5f611388ca5cde90cb147e0354a826838ad5055aaed0de8d8f38cf25bc3523cec02022779b51990784cdbf67bdf8edf04b7e5779b10bf7b1f1d12555a4d2189d7cdf64ff84e0c8143084cb8fdff3ab3fa8571f8b3004dbd99ede708a9254616415fd3fa32f70e8616ee806ee431f0abc11eda1e19441d76ef6af45371d327abd0c1836e4e3887659904606057fe1890028a0a32f664996dc89d217edae02e122cfaecf37599dfe77354d4d67fec182a64d2e77b71e9276ccd8c57d00bd3c212fe12f8d3cfa37ed44ce6c5178385594190fd5b43b35a3139a6417c922d344a72ee128e5483ddcdf4cec0196c8c51439d2d134dd0e43f1e9dfac4790d678c30fba30195c0bad0320f9fecba1dc2d73f05e41da46c2a215660711b3786e262db75c6e7f75d9b0216ec67728e724c9fb3435d214a5db086414ab4509d48c53eb3a8fecd9b744ffde254cf587fb25331081d3f2a26eb9cf947236b6b929a39a8205bf4ba694cfd49fc0f7ea87427fe16a75c333d206017ffd0b23e7200c366298a5850b6492fce6ccee51e6a541776d5f6c8e0642002482244c0d36fce0c73485965b9c92363eaf0be9e54a409cbe2f65f28efa60e1b58e90b15d569e4bd898ef54bd7fcdf31785d3601ca607a8b6b014945070cd2f16edc8d79ea692a1ecf82c7d1535665e1a0399dd728a58f9f397f1ce8d19c55ccb38432b4ba7688766eac35c1d5df9dbb8c0e5be8157c304e73f83fd7f4607df64f68638dee98e60f8d94a8e204a070076163d8fc3aeb45e142f21cdb196033b6691186ce2ed72c2f55c389fb89a0c40c4ac17bdb3ffdb6a0cdf71abbe8a360532905053d213c421feec03ed50be883136dafae4ccbb76bd33d8ea1410831ea16b8ce46a370ce10277f133138337e9364f2b5d91986234dc2b94019332212bb473ef4b3c7c3967e8e3045c8eba96cde47025b62081a4842b56a93ea5add4fb92ee2fdb273c09a759e2bdd6db814ba4a04c52ab2e22c2e33f377117d7ee2eece12cd73ad6d12e4db9d956387651d6ec1e262a9316e67de09c509423867d8fae13d27dd0b7e5f7c9ad4995f7ebb6b922a2a01614776705faa7348ad84dc6878d9f517c4346e5068988b5c5ab982a72d6c25ccd85dc0f2b900455bdacaa63a72a083c5af90058cb2bf0a09dca28278487118e998d91693f5f2826b51708df5ef1d2f5a26870bbc62f598c66ba08287ea204e8029253efb1a67749f9be05942f83840feb18147877e247ebb911b4c7b1b610eba11a700d3304961203f80d2c894d900d8d9e6829610330512d57ba6fde31c9fbedac926c3407f9215c5bac030cbe8b511251e84901f0a72f0bf2959b54b394ab50bf2767250f14fa7b6f5ea21a54da8d01e91151eb491107fd88b2d4a5aa157c72d89ba896b87e0fe989819442bf0213e4aa7fde8d6b026e7a70ae965193a0e1bc7f8b8af96298c41f60d154164ba678333c903958d4ffb50b50f57ad8eedb6da61a6398ddbbf9c9955bba6bf5991c4c6615df1cde156d8e188003dcbc3a3992b84fb04cb4131582d3f0a9466105f7e2f5bcd8d3adbad05c2aa466466c042fd37b65fe310d06708263b62a6df930adee8a97fa082823cca1ca34a94278bb32b26823a9c049149f4abd22ba5d2ea7b2c16d3ddf14ddfec6f17f97394b52edf6b1f6df4f8508bc064e58acd5ae61b9bb0e4614d4a44f8a33bda36282ebab1ad054a01f5bf9cc7b29ffbeeb08ac43051b278dc39710ed74a778ee1d328db1a0440d0c5a6b98f4b09ee16833d0014308479facc082f5484ca6c5a83db4bc273ce65d9416dadd221ab995ed3da837d241e4e93b7224cbe05095f67a3a85f17c4f2bc8cfeb3650d5182e8fa65f0daa71306796a27ef90f364f19bdcc9a22c8113588d1283e1a7e7e1742213c1e8ce3b052442a9a3d7c39ca96967e27e3179a96ae82093585d3c08db6b91d0702827e10360f075b442ac60da580aa148bd1037d08abc360691ec19464e7b5af91aad4013a2cdf9e09814e801a8cd40b2aeb7d24e26ab2314e37ec22b0529d8e425270140d21f5ab241c3dc2540f8e8416c3722eaa433830abdbcaa9177e373bab05fcb8fd82fc3afa581e34f08d3c07f5f58d0aeec9d7e71866c7a808ef15301251b470a9c455a612c16a586e8a5f1f3efe184a2e6313bd0a657d901319a9f44eb241db807a9474f3f49cbd2c8b8a225859ce5cd7b36e3af8545701a482780086a42f4a1ffa2b30144e3fd3b9052fc9e874f9c3791f69d968bfee7d5bce01dd70a3c74ce6d79c600a5ade2ca28bc27e55fc351e811b7920e2049e53a730d9f3833dc46463a77a7d3c86c2386783e4a8273c0abe9e4c2e99eacef125056f62db44de812114ce17f0217eb6778691f8dfe2d0e5241f05fcbcf97b9171f4de3f0d2c0297f388d027516f8f157a6e1a919e0f474eff81fd56028496c9caf411b0f1af46736c2e421b296d5459b1ac92216b02fbb2a17586ecf312ad3480918e7b314526adfb738855d0a15b0dadc0ad3acf748abaaa482704172a3b5c434bc8f044940f9212073779ffa20fabcf28a04013ba60c18aa8724dd741ad9b738135b294027dea4047c3fa0ef5eebeb6633fd4007b1a61b2e4ed2ccbef808ca1e07924b8170df116b3b258771374a0c40ec058fe0d1415c3abfc235d8a60aa5ed7f7e919581c5105d98717d0613e1ca869c6516506ea482d5c23b414b8aa7efad62652403c45748e37b6aa9385a76ca422d66ffdef09836083f87189e0ea751669a902b539f5f6204cc59348e74d2b77b864e6f13bfe520da1eece15999d172210e47cf0e7ca305c973864590c9bd373a8f6590754353e75347b3c50592eefbe6a6d238bbc2edda38583905c7c1fff28630f58a8ee5a9347ba323eb2963c693bb4a788de2d903895c64ba9bbac55f9267514485e60bb1ae5b18867b4d7321e3aae282f70b29adb93a7d5030f23ba6bce5da9ba8031f31fefa8f229ff92ac792ba56389dbf1ab512dc8c45ecf58d9c1a09b3421b6f87f2cb60f1417db6f08049f38ee2a88514e23e497adff64d210954dac58107b2adbcbe9624293d0b2d13b05e73c83fe67ffbe2892d67778161b51260f6a09452f7577fa31222088149496e02eb328b69c3c9a9a58f24961ab468fba42fe6e9d9cf8ab58fa176069facea2ce8df67b396481438a487607c9f81e9b7ad599d2fcf9c1e0863bb6b5eedbfbe911638b0e0f576a33a8efc6150983201ef845a0b8dbac5dc2226474b39f3e88c4696dc553a0fb640556bd8713b8e2e784b2f1c782c24b489a8e02d5cbe3a901ef270b59ee86b6eb1314402d66508dd1672b8852e3394d0f0459955e71649203a3eaaaad2139108bf772062d8f58ea7a20d267f74cb9381d89f5aa73368a8fea9d24ea23be20aea32cf08e0c114a8f4e6c382f1911ca82f085e2a0b8adde094325563871f7e5d7ed2e00364d7e9df2ca83dd3c2ce4d5b42492b1269329d78499f70f240c70e122a675319d6649dbab7b12221dc7387342263ae19a974cff884b7ca02b57bbbb258b8cf521eae57c2fdc91b7526c8f1bc381e8e47b3989be8af410c9bce83adc46f8efdb724fe407d67b7d0d68814b47aea4273a46fe62ad13106ddc573260bd0d7b1854fd19b80755b45e84ceaa1f7f6a1960739c5a6a43b72cee6898cadfd5ef7e90e230bcf3e3242390cdf34b5e3b9c6e3ef0d9e1f31acda60ceee0160adf739fe4039bbe0a23a855ce3984e99a04abff1d628e09af7aed1863efdba87402204b7c59bca17d5178a76167e21955531f6886293755f21c8bf06debd9f6ae168c1dd42511ebcff51bb4f4c9993f02af7d1703b5543b6d5830ca955369951b650d6386261a117476e7fae2ef28df44823ba700a7634e73b6520374c708e83e762ac90cad5396fd6f83d5d6390f8e7d73d185277ff2f397df863786a7468499d26abad25b4d00ed4775f22947cba12fece53dc29f71bf6c0c43e3458490deb00253b5719074d3a68714cc669bcbdbde65dd3d7c966e2642f501732bdf767b137e6c5554ed5983cba706c11895ae730b772ff0afe556bcbef24573b42875ce26bf1af706e26995cf3fb27ca9d5d22b29895413f71ca9e752bc867178f00d6c8c3cf63701e0338e13b9be5bb4cce558cb14f003ccad063a909c5ad8e4b6abca96807471d08725d15b9d60eaa3fb468072b27a5cab06ca2aeb1a193671ecdf6ce8121c53ed47ef03e96370a601e1742692ea696b1cba843cd4ce7806cb2326b7f37a6449d2a2cd9a5f94341a59000cdfae1523cb9c48b2e4e021cdc63aca00504b21d2c00b08600920b841c403d75f0046db6ffaa431d4c79faca0e15b720aba4190ee43011934d4cf48101fbce8193cdfa57484bef6783955d78804a79b945a89401d6f5f35ba91ddbc2599ceb299e9eafbf7d657170bcec52af99ca9a73bc584d7f6916ffe7fa4be8d08dec3b77fabfb47508c07041e0c402f6c15cc356f6fc690f055ddc3e2a1f453203b367728d7832014f2495e0d56695d560ca9c6bdcdc133a129032681fe1177025b91622401151ecbc598857851a32d4dedaccb956407187f878ab6ec3d989135ac5f190fcd138bcb526f0aed628017ca455fc484d6fab7e20dded57fc4fc0a209a1a0c3a70210fca45576ebb2d72b541802d321a7b2eaa7f087a02bb48ae7a59c13cac32aea0031f0acc1180070d8e5a3abfa4b4e51568bd13d6df3d2d324a47ae417996ed131e501f47a3ca83b2fb5ae1618ce289416b12cc9fcb63e729f280bdc314c5a01ca9f3ff448609180594e9f0cd6b31fc253a167f1f47ce0af82b8b7c2bde4d5c1f4e81276d48ba5877e38df55dc011a2534e4ec7efd4da0d1f2dde660666ac958d747e240c5c5cb97c4f9d7b9d1c00003e2012137c1326622191e007cd1e51d0f9a44171cc416ebfa561bee005df9bba5848070e6e5321ae81f036ddfa95db92e666719d07987eef65a268bf129b3325343ea40511456a46c2c14955194db85fd623950248b1fbad4f9a01856ddf64d5547c6f841f4a5ecf666dae1993a6569c3b74125e2a3e738dc5a13fcf521caf4f2b79c027e2d27dacef8dcb78145064dca8c07fed068e55055a6069f969b380f73bbf5c5d068e4573b08a280cf5ac319580a1444b88323eb8904026903f64786207d57a9ff4de54986bfb5a54c23a6b5b658ef60609ba9efbe9d8ec203d8004141224d16d283319af8449c8cc048b6092ca020b890597d463d9832125dea69291ed55c7413b3d030d7c0df9ff371fbfd010730b61265a9d64e1e76c1dad38d24ffbc0e2b8884cbf56b5a0745ac457e7a7fb7a6c1ad6635893857e337423b711b2bffeaa3fa9f29cffe3b9be5b56c4666ecd80a4028042745456a00dc5dcc1ff7ebc7784530abf2a8d68a23e9d48f5bab9191e59d4ce889f4bb805519f22c9e9e873c4177f4512e673c7028b8d256c62fb60bbe3fe1ba627de3c06b54cb03f6fa4785cca20c39e6f4781531ba76688edca36e1d8eaf21bbc80553c9f6aefa30f272cba12f410a2237d2a0c6578a6ebb989fe18af27dc69bbd6960f86864b8526d523549845b6ce81892396ff7d40f564df38c8ed314510a4456107e11b5e667552dec4b0b2209427fff0ab5021ef466e2e898b0993d691145168be558682c74914c172f2b5e86375462381fe02ec4f33fc42d79acbeb6b6a8eff8b4a747318309f7df7e4bd68ecf7f03ee36f9cc28064ccf7270755fe203552a7f7465189e9ba5766cbfd553c713e82a5280b6c2c8a5f153901d5aea9200340e4aacf9a41ac54d10e57a309dd90a771f8c877dd74bdb1696af08c42570b42ee57ee4cdb34e08e90e7238c47c6dbd1529c5d3b7d25aada3e1f5ba1cda242729f546a5480de26c61b83d7ff9b82b32a89225eacd7c9c25807c8dbac8cf56610e88c875d2797df99d566bda3718ba7319a0d356259dba4a95af9d9032cdad6bc6e42cdfd3c0c7b8853027cee665c388519cf89f29fd5b24cac24ec5c09bd14c38519b68b3aa6ab0028e97e56e67ed7737cebb4b406328bc08fcc7e0dc036b0c4b193d9adbff0be9fab7e3a637e6e14ab27d45e4d198c81935a73169edcb23b4e98339fcb187556c57f43499a9aa4609acf2bdf24665e4433b09b3e85bbca04af9d6b7169e0aed40ff8db2472d7ac5ba0c764cfb06902443006a76e68d9e8bd9625be1710b4f7e6ddcca843729200667ba4f1a8979e12f206e14a1ebed398b660e5add945e1faefcd4f2d3f10762b0179dc54e230722aee26c4e5d7de25449fbe41ad307014225f4d14fc6fe2d096bd39f22115218194892e15fd226d4b96c9fcce5ec535a808c5dba2786e505dde1a2a7ac8a9c148fa637b790276d2b2e9d5bae014fffd3a18b4077c33a2ef5a5b78c9eade28c634d70d9d52985da507c843672b72693d26cc9a4ef6b0b62672b98996a6b40a76d184d80237213f6a96bc838014f9698c1aaef910c672108c2352ad2f42fcd779bbbe53589b2fa489fc212694111c9950723a40fb5fea3a86e8c153e2440b08353fce1ffef3361599b4b09d21b45e7120c9f9127d279b9cbd3f802e5e3e81253fea5e9e73d3b71af03cc567a7732179738e65ee04c208df8594099d0176d1b70057ca4f45b1351d4400ea0693e2182adf3bfb243093b44b7682e8106a918f261ce4abb2e31032b50bbd990a8565a50dba5f43556f21209906888638f8231c0aec3d6d59da85224a9dbf4ce3ea925a8aab64b9023efed020cc117e6748800ace04bea9b4aa64a6669072901331ecab2a18e8d6bb2e91357b2dba3b3bca5ccdf7ecd4cb53c14311917a93ed1909c90984895826d09c6cd310a1ef4716fc0df8110b3c5ca7bdb50643c28fce85c0dc17f2734f13f327063b89df3d1c996c17fb91e641d8210e1ef705fec2beb9f58a391c7d1a38935cd1d13f2c00363388ff5af31481c8702105665085d938561657ff6afd661f218c7426b92ee53e65d14898cd0c78a7e594fcc6ac0e3fb5cab1c9cd667a9f122e5451ce703e686fb0d37827884492e121e859aa70de62d188465445878b41bc2a42ef1b0cf0f674951e02a9ad436d1e9589c09457aceef62f528bda4695da97a5b6c0aed7dd0bd7930f7c71b48f63bab0f7b5f6c8c030ae2054d50e3c20e61f114e6afc796934f32b365a22268f134014b0ae443cded463fbcbc453d0c2e0dd0d6842866a1bfe61de11003d8bd9084931531e2f3c4f46a21225de4d9cd2573beaa2ebcf126bc4ae1c2e13165ce39f20874d89fa3f9814032401874e0905a5c6496ccb490aef143275ec076f02355480871e7647cf5fa8e171dd63f79da378f69a546586dc0c89997be9618a1454d4c3d134679a63fc91d7bc17d8bcd3523d677dc84f0ade4a813d8e94960a1bb87c74c62de26485f54b50435f7a1042886f733456fc47ba2f97b93e7c396180d6d80e06695b38bde051d5a802ac9453cc9bb47e7ed1cfd8324976fc1ea022ec466419f2854679643431f26aa004bb8f752ea5bcae73f5b0e8f30157ea8ec0967d9d031af048c9216758110bc606e86e48a4c16f74676becca30d2c26e49bd47e30f63f038b68a6e0050cbfbd317bd788d9a82175f0094e43c8f85dc28658b592d27b712dd343fb275a88dcb55dbad26da8c8234ccf4032fd67b75058756bd42a27276e34c267b876dcbd0eadcb73a01a5d72c585ca629382e613acf39b1c5ace97c2df20421b0652f373feab63ee6817626faf27c8b99858afd41a98dfb36f068a136bfa3aa60d45077154ba0d7253ed1d87883ab38b6a0928c2415129773a5b68e3bbc99151f4d68080b7dfb1498923f881f9c77221301dbba4ca2561b1e45499fa76953164e48ec668cf2437b931415927a9d4edc3131acf445c1d70a9947a85204566012704f341f14590870b74cfaa3f416c0cb93b8acb68a03f3ca77353951dd045e9e17d8f5ae2c12b8a87795652926894b74acff419d93d95aef3a9692fb8be39d1dc76ea7705eafe2674695eb9e8c756d6bff7e1205fdc27aed45d44bdbab84ba15e188a02206910441c6b6d470905b95160ddd848c125fb2594b86aa5ec658241b08af961fce56acdc5a80d64bccbc51075a661f9c9bf1bf979e16551136ee69a1af5bffe610712a7b847c578cac183fb467d049b3d538f14cc00bd27fa7a7f92e381623f177712bc3d711debfc8efafb1b884a96e6885d5cd43ff8916832561255556c8ee5dc72f29b4e9e2518db33f63befba538c078fbbdbc4a0f5243d7203b69a655294df38331c05cf8fe64f34d5efdbdd38f7782d1827b73cbdf745db4b4f77d3f2ec276e6606bf398f309307817f7439aeee813d5a01415550a9ef9ad4681540d8b55d1b73a2a3628ebc4eb4e133e1581e3bcdc96bb18a721602e5b684499c336bb728484138dad4f5532941dc524bc2eea402d8327fb91b77cacf374539333513ba31fcba108b172abdccb85c26d9fd88f2c97397b3f6d9dbc85426fe8202cd38851f3fc571dfb197c2de2048f5b49352edc9a182946b32aac51d8a976a328342e19b194aa5fe2ca22a08828708030cb65cab6adb6b3db04c89d26bf73aebdf9a964d9332f20f10b5bcf1e503a7efee1a0816d68a8097db2adc1ad10839546aa66cdcb463a13ae337414151a31aa0c3e8bab3ee781b9f3aaa869dc5b1b196abcf2bf185c6f9a92f9082a2cf4fa83d1287382ab98b847d55354e044edae8d82a7d9a330c4344817b2744ba65ef9aee645f4a223fac025ab434fdf7756b27437019824b53c3c8ed506652311e6c38dd40d8ba4389c4df5ee00d5b1d414db6ff0409abe0622ccf1335b473b0ffacca2f2e5a4f369eb961b0602a301fba66dd336eb7dd9b3f689f1bb2796edf1298980fb64dd0a38775d179bcf144a4e89fe4083789e024f45d802e4f1e0c655e18eaa3611906314ade77e07dcc5f55d4e112a5e6e97b2289f5bc74950915ebeb150713b626b989f1de9a0e2a2248da8512b132033e783d04169a140ba35118c27538883eddb053835c832a4b5ac8da031b07d917f09d1e6faa61363a548795ea22c52a7fa4b536093f7b5d68dea7fe57e55dc0a967b36dd1985a04a88581096b02f62003e48eda8a71c8cf0a15aded8857fa0f410a81d133c8cda3df9c051d4eff1293520604e80ed9b2a7b867a14f9e5828ef6743d1f39c22013e6703dc799a0063aaf270df089e5f830efb3c4dcea2d22d88a47a697b148e40fbc620cec457ec2f8e6d8ce7e140eb812b5afc77109bac52017f151210a4f4d002865da2a68dadbf664bc1e41cfe65f6275d0fe8bd91cedf82817d945a523cfa7c2e2122c9452a5b5b12769d60e0b528298cde687e8c201c35301ab703284e069147d314d2874b4b954c15db56edc4605a70cfbffb95895040175443b02e123c6858dd416c59f8d63b800566a62d78e5e1904bb4dbb3f4c5cbbb94ff0b6b71e42ae9a6713dc519457537ae06f7a8ba01e774bb10c6ef46c1ffa640b4bce75145fe83966bedd296e06df87883f16773fa94a5859b6650688d035fc22a6baa9ca80dad15f9258857ef484bcba43d7189190faa131d60de4271006e8029bfbd38557fef8be18df045ba31b80f3283cee6a6810bcb5e5fa1bcb41e5ce47960270f947bd160eccc1146894ec8acf66a8770e91151172509a2bfa084af54e1f7f007ad29dcfce28bf443a3c7020ab59ba31129e8035e3c06e8317b5bf23a2b2c210ae7b297c88b719f2551c5ef913abe2ab0b02da90769ff7bfc8ecaaafd1da6c0ff8c3e8a2aaf271cd2db7015aa4c7a2534c409cc7c759c640621fa6105800ed8cde2f43e8b1554733489effebbb2779b87aea4f3242884aa397c139eba1b0b6e5e32fd3a5486a1aa32a26b322e355e9490b625a6674960557be63cea84b8468c99c38106ebcab5cbb3700b37699dd7183723b56dada2d76eb6a99dcccb1d663966dfa72bbaa93adda139f897d6b28930643f7bd15ef992fbd10b5fccf713147eadcc973027ebd5e9e34659dadb3b1de3ff50a059e2173807b455aa727062f86256d37a9d9c5730f661df5786e2023a3af09f4b8ea2c4729747cea5479ed2b9ed4a3c78fb80b6f30c034c1a2552cd893b1f74a5f604c7e8b572c079d2ea2b00276f4fb8d13bd0c633b1d4c93e9365b2f07517d61b71ea41681d714d9bba347419ae5463a7356d4f7453c08c5a0d925c61d8cf058552f326b9302a4a2b77b6becaf092a006d55539d6d1588d00281b2f9531e55aba0dab3eae933398098a7a85421b529874854f2a6213e4f1b84ccad59469a1fe440cda32522ed45ebd5945728a18dc727bad25ca1f01ace30be165f366664b19abb548a9aae955c5d04ee22da9d07857a3b39dc31584f8897f4fb53414122bd27572bc4cc0adfdf4c9d0175da72a6e6f730080ba4c820f0b9efe823da45489522caa00c39b6016133046aeaa8d0d05e173fc955acde43a92f05694b92113acc157c4dab543ece64c8e1a6dbe626386d62b0fa6489f93c146fcc0b24e9039dd467f2a13cac137b6c56ab31d3e2e13397524a2792fca76ec4e4aa2a6a4fbad64092b4373ab1c2bcda64c7986d5f90566e7e51bd8b5577402d26265366469578933e377c1005caf7518bcd46f29cc215553f6e489824d774dfccd722b36e31f94ec302ec7708aaaf443432ca1e2ae4f4ee2e063543fb46613f212304cc170edcc5b98d04ba4ac06934e68e9e5a9a87798bc2a02039494289ddcb90663ae18a97aa9a5c51644cdaa9a61b4730126c1817c085c285c28f6a733e34a5e36a4e33be6fddf76f0f7f27e51a6ae33bd00015542efff3c29a4e1ca1d2f4e9f8f4cda8b5880cd49a065256aff42de8fe3df70db32989aa830af5e79a2e74d30344e0482185af7a7f0376d56ee60ccf0396d17fc932bb5d33af2749c0b33cd7bed516a066db2e5f9a615d32a642601bf894ffd9eafd2d8250e152b1ca03c58e784fd1200a1b020a58ba65dceaabc046299302aaaccb38c0676bf8bdfa92a75dcbffc0659fa7e2f156793152a084b5d4331b6a70933f658de38989dce6e25adc268f34ef7c1419aaf02830327c5fb95c81b897ba12cc4c5151d4968d137548602458df0c43d24eadd231f2eab2bf3335b1e52ae5cfe455a13ed7af4d14bdf8a021f70f6a7b84ca606940f9e9f805cbf6301b94921f3a09f4170d24ab4f3ef412bbd44678778e456911bfa5bec0d5dc1488d6553d751fe1c056dfa716477ac32e5e9b24c4ec61282e881896e781a1fc2718affd46861865ac8ae9a71c71f3de5996961ace3eafeb3728d63de2defca4a48c02ed5bb6b61e0f3f95953c732cae2ad06fb8f2e2cd270970930b3f2d385df34f69b5cb8b7b636ec17df1e4bfa7db28b8825fe17d4b342bfbb9af5ae10780b9df6ee74478caee51dd0d5da3abd7cdc99b789ff8629cbb0526d47ad4beccc55eb86ce2250347174ecebe3907ec4efe8415bcf9d63744242b8e5dfe3b0b0a945876fe370bbf5266bc332b047fe57ff5eea3b9fdd96fd40805aec0b9dc5a33664d778d6657018f553096be507a2bed3c7fb209fc9070cecf39e4973e5720f9c39446b4f0958e407b2265f29d8524095abded27a689fe96e22edc6bec29f3a024d370ff56559a3841382d625c3f6266a90fa19d6c244dcef95b029943d346d9126162b71805c9b94fb859881cf76b97c00b7bd5ce0df2c97d54d3b9f5c19f0714e4a886a634a165df4976ce405ba3ef3827d85b3c959228d692ec48429370bc94d3cee8914095a0a85201bf66bab00f79fb43a83859806fad9b98ceeac7406c1a95324769d83afc137886e600c2f46aeddc4a4761d862005ae585a83ecb92883ecf6f4d8059e5faa90372acaed2f5743c7168b32980ab7d76f72f7ebf1efbb349d8f24585544b1ef1a951adb18947cdce210b75ffe0b1497a46e2ccfc3fc05ff45857d9d945cecb55d0b053c9444fda2b81bf0a65873806ed6b6bfd76bca4f0a6b40c750cace5927e0ffb295692922bcd0a0fdafad2941848cb178aaf03fe07d9728ca180082406a2bdaea8da02a3352b205a72105159f004ec721f15a45028152a54d9e3d5fe9a9c60575cc3f2e778ee7b4b6a4681fe40aa4608053b1c3fb3e221f1a89894f9b0a3ae61bfb511f3796f613f2e2df2f56cc17e45f79fea014db92fef782ec3a9fb50de7a4c2dbe4bb92678c2280712d3f6b2ebb840a49c6958027aaad316f063ed3ca6fd7c8e7654babc38510292701e512724eb7af981cc6576b8b043d199cbd8cf6e57db67c8a2f0890688283079391e76903c210f58aee85e509c34ff3e467071bb35e33a33baed3599c41361ccb8a129d436cd467f857351d8db40e03c6836dc04042e863601131a38915eb6b921abc96777ca4f74e478d9c7d9d23532b58e56ef4f17cc4e1a14cf897c54afece870dda05bb27ab7407b5e9434735ebf92f98ac373298cea6a34cdf2e1bfadc691a2cf357f1068d53dfd68c457aedd11a50ae0271cfe48a976259e1b6dda40d491b4269d3e5e8a5d116180eedfdf30f74034ef80a8e07ff9d25998597d4ef9a58d276c2e36176f9d7f6a2f6a29aeeadf190a0176a38aa359e33375339c8848a7c86f188ee2b58944ec59dcccb1786b1783ecde6fa95743583d559d305810ae59f81da425c0c357b1ccc3019d23d6425f057fdee206c0e063553288e61c62ab3a8095a7994ccb5b82b5384631ed43010432157b545861fb09bf5cb0bb6608cfd7f6799b40033815161a2c03517a4917b58e504c5d2ac503c9c036ad26d18d7cb0ce3be7b07094151a8000d142574306d17ea2ca62da449b122c42f6cecb4b32337c4f25611159cbde7b7938ab00eb5ee687af5dec036b117148140609dfcca0fe8545cce86203b9f060d791e2038c70633db8af7f22c31775982c536e7bac19607d9256acff2c6feec4be859ddbb0ebe605611792a4d70d8db0fe77731b443c07c9c74b35253e4e383b807c14f5f341dd733b3ead26017428170cdaae5b3f6962fe57230780b3d55b29effe0dfebde2c81ba97d4512ecdbd33eca1576a7f821f08fc4669a9e17a5c6143f73ef329b6f24433e6be0f7f3b52d9cc880628e09064f0281ae64e9f430078f01861f5df647709e5c731741a08085c59ac40879ec86bcdb21330cd0b3f4ae0ed8ad34bd690c3b91963b4e8c9dde8a2d8358cef80d13e89e25bce90ee17417f82741c5fd6e1df3a17e1cfd35262f894944b73c85054e50a001a48fd0f73ee3ef7fec297a7ffd276276a0a9d7e3e421ad4147c7ad4f8663a5477277e38f9570593524f5d1093a4539126eeae151ace1ddfbb2f6dd566cbff269bf17a2f5486bda0954b18da455dbb9c3c026edf9da283fe6614091a451c43bdae3159bd2a834c64f23c2fcdbc069591d5ce46a470c836793eb4b76d3e5fed62d76c82aa24549c288fac0cb1a1a7c9b818db9c2b3a481c986a96dd94f99ee55d3e2c5fbee90394339422164e9b463e592eb0d93da4281fa31242e5581de013f60cf857c122981bcf2a27b56c53eddebc3ed666a2567226e160413581522e5f756959d27a76191b42794251d270a3902971d3a922f72e189b7a1a37d7428fb1217cd638b28e907bd5a8fb52499b713ce7ef310c842f62df1988555122930bf1436ef7f231110423d0dfda21997c5dca3fdf77f692a81862a3b37bed29edaa0723664466bfa87efa7b4868248aba722379692ecf1207578981221372b5f975db098d46fd24fb05ea1d082cc4e3feb52dddb7ddfecdf7283cfaffa5488e5e73553d0b841f27b1a1db004aae696eef30d1b2ee0ced8b1e9163576fb9d77cc5ac5e0607863592725ab36a34777cf136eaf84239440314249de6e19cd88647d629dcaea9d5a52be8395ba4ee0e63357aeb88d3be0ba82fb251adddae89bfb638f1b97b1bf8d9bbb945bbf6a1fb8802643c6baea5ec44a670b7a196cd55ea92940cdbb6827737098d87bba775c751209ce4871b176c3f3f05d6a8531fc36da391832ca609db29df0d05440191f92856c9ebc6613c1502c31ab6ab5bcf5bb1b1d85d9295d5ab1603e0c93c4a1e19746d935a0eca3b6ef3f9566093f703a51e8410a2f7c9116f663eafdb8dcb43b09d2ea438499c3cff7bab62db466fe42a1de3e25b428be3b0805822411dcc29450b5ea18d5e206951039fe52fae0b99711498f68f5b2373f4ce19e005d695f76025c83561359ee8ebf19e8865b2134a026c69f3462ad9eac6b749922f9e6dd689553306bdb65ee155ae70f38439ce21668e1f828896f570aba3afdfc55f9eee490366bca8c9a77d18a3ddcd942d854324e0824a5e89be2c2dfa1470d1006e6627952a002b56c3e3bb37adbe9e7580dbc4cc59f4cfeb7d47d32540ec5a692667ac74477a4d45f83dc6d1a770a8f9070fcfb96e27e4a27be9258afbfc69820d185e0885d1167e8fb0c2db9588bda16207cc0f878ca497fd38ac920d4805336da2c8b9acad8ee9cf6636bc3db1e255d8ec43356dca17b24e5fefa53d7736648c2c6ff083b8be6f0287aadc679121fdb2e6bc95e88a45dcb584772c543204fdb4dfdd13d397adf66e3aa6a3ddd08181391cc096bf7437fb79d0ca8d1b2078e62be3998c64f563675da8b37966170bc9b2b7d6a0bc2ff4f8e36a723257ea9907395f2bc1fe78e9ab15f958c6c90ec5bd68de871ba56484bc3b7af781d3377048287b1c1c69c846a8df541ef2cf5cb946a2ba5a6f43baf02ec92adfe456b003923e61f2036c8e824802e18c6540a9ef4aa773d7055eda3f35d4a0b4c2a7fd5ccbc53638e0d172a672c8ca2a87e49f6db2c0308643be6b79bba604fd838fc583dd0325731a5e1bb90e773480c182e43d673519f0922a16a7a7857f438ed6b07eae41532d19dc32c30358491779e42067504e589c5b6b83cfe1ba390d4d44685728c6ebed45125ecd3bb3317618d0fcf154531212044959fc508c59e327a0921632dc133c06ca48dd9dd01425070f1fe55d8b72dbf78c4133de45074d84b4d9c1b3c9f3a1c4ca98fe11f619adad69334a523f9d7e9afce27e722c6dd4cc46e26295d6b5a4e7dbf5357f6e689571a5dd291ab7be835761e5e4f488b0ff681f5800bf4b7ecdd7c5078ccf812a65bd8dc7899f3bfb739582f16e4da2fb57be07e1a4197079a5fc50770ae97487a6f8e79972c8137cd5bb28af2263c2746337c625558b8ccbb3bf44edb7b692a6df897cfaed7d866a31331bc60a1f2f43ab3b23ce1bfde99f7f8668109c1c22b098da149300a6dded106423df2e693391b7 -MD = 8748824393f51c3259221007ffa84d3304f2fef336716733a249106f78b164217fd0dd5202fd2ce0400d456ec121a3b4 - -Len = 102400 -Msg = 239daa03ac02c03bd74ace9a592656eedb68703f510cbbfa8775994ffcfa9cd7f4a13b7ac92aca908250a946a64bbb435399198c8afe08a5cdca29faec5af07d1ce1578f4969d424ad148822a2a8b90bb44a82dcfb8ac935a8a072b9ddf5d2b8c2e6670cd5c4c640811fd4f8f344398c290412f74bb7e6f03f81dc5678d42bd10e36d1b71445882c26f8f68e41272410d74e31a4238e481fbbf4cf9764fee110295bff58aff30230c32754ac355a60dde9b047ad2b15d5094382b346497bdebd3bdd57b94dd61d948035581c76e4d73b85b2bcd80a5676f800b1f029d15408206b4243a197f7bf9f86a969a5adcd6f74d4ddf9ee69591432190cee09a2904981e2142ad7345dd19afd0bee0e821e12cffdb864b6ef249500b71816ad64378827c8da7424cd103ccd0de451209cdea79328cc66fa45c1e3aa025fcedfc052ad5b441d88500a19e680dcbaf9a3a41516097f9f68801238e47821687f655de89f657e64d023927fb9fb95184e5f41cb477927bbd011ff8f82b23dbb9208e501488d9f37b3650e4a9c855e83b81b1c09212a4ba80775b4d0a39f7de16d90fda58f1bcf1e99dd258376685f859fa1ddd68e6611ec7674d80331880a617ac54fdd5c5635a2ea54803131eac2a56bb72b3b7673a11184d6132e13b50bc3206f83b09787fa4a0f92c75cb454ac6c8426ae3fbf9a249f98620f5b316ea990c655412729f6459f6e5fa10ce7ee476053b50fea5223c21c1ce1719173fb0c4fd6403049f8eb3f287083b64ab2ffbb0b3e2ef6441756a212771ce4d9c1a35b88b7f8f81eedae106d7dc5af1dfdd130f5ae570a56f67bed0811d80e3a03b0bfc3d14542aef086dff6feee348eb0aacda40cfaf427d8d9ca8752e097bc21685f898cefb602eabdd44c59c6eca4b3d3baa2bedd5cbfa3b96216a2fb28670314646150bdfb21c19919f6f8158067ee9420772ec9e8274163dd3d69f0694492fbf5d48578ba135f63d37c41a397df4a3427a9c2854366981f62840f88015ab4673b6993e89ae1aa622d679e38da15adfdf6c2e4db138492351974fc8b99b1529e5da8e2d544928ce04d3d769bf1100135b64afb91018a16ec2b9498c1d85255e98419da075f2eec235b89319583d82c258ec76f70b47f0b8ec06c4cf16744a390d845e44594beb17480d036ee38761815a7c3a740d56b5b61ff857ee5ed8f26db80b366598b48c51be39cef6ebaf1ab4c28c50dc90b57edae11669863133cc412a5ebca09ebd70f60ae74c3dcae51cf143a5608d2ff4aa9bc1e9700348152677c6e76761e5c70778b06e11a02bf9f6bb305fd0025584c77d54da12020ded9f66204dbd460881de5e3156a5da693e26672b0425d88bf653f3fc60b5eeed2da590c8ea24a9614e541b10397f291d222aa9964ad88c4dc9ee943b25d2468075b78c23554428aabd1733df8f0428b25671e7048c7e7a156fe5d293920d95422673bcc21782302f3e764cf1bfeb55c34baaa3f8517e3e6d68d843982dbe47bce038a71799655c79431faaf9448b4cba622364d4225e55d035444bbb616afa5b1394dfb663640a137b71e258c56a5a123a8aae3a87a53cc865a86f6fc5aa19973106cb00fe14c578480b9782bb1f1a65553ee49df9d96fc06a833337d2d2221bd91cfd99d1ee1b32294b1f198e001a2e12bebc70e1617b52c4431ba601a9a0337c25ebd3776677bbafbf0d8fc6b3c5d723887a55d6e3dbea0386ad3cea6710888ad02a606704678f3bd5c757edb099eae83ab2af52c6fe1098cc4c6ef5b10f8585aa1da3194e67276e3df0f47b7d22f3d13409ffed817e40f4629daeac0dd9b51cf24a2e16aaf31ea7560ef7e87fed6c8f02c4c9ffb9c905b708058e85d41b9191674463e7b0a7cf879c65e4cd4f55cf7235979011c66ad9511b18810bba5195837770e6f4e5d1c48f9fba2d9241e8971b3ad6e4cc3dd036532a3b28b616f84b73817429d6b11da81fce6034c02e324dfa81272a778695971da401e80d709c2dd233b29ef5b8f7c4b8b6fcbcdf3abf7e80b6fcf3ac4727964116f1418a6d99b74ffcb0c8ea53eca50ad7e408681dfc835e3abcb2e2e6029e4df18db7b5549d721d5ae33a1d1858e356afbac9c33e5606d38b0afab3f9b32994d23bcd06cbf3d8eaccee65168ce8ea5cace553a912687391265c3d87d8b5c2d6279ff3f74a596638c126dc6f1809346d6e08486240a04417ab24ede72986e452700ecf2f462aa477e620f27f40265c0951780a873faa12c777f9ae5a62b328ca2a1ca0e745e41e388a6169cf9beccbc105c93c9075c24a312b4ed14a0aa6ea7dd45e3be7c0123dfb5c6c84f891b90e24d9803116699564d523a9093e87feb41e0d27d2895b317e20aab6e652b8178d956b119a71a1affd33ff7cb8b06107100b132e17446dce794913b4f0968584e4a33911db4ab46e7dce1d4e52482c7c88c5a4b57cb18e4599f515fb561c709d8dcea1e575f9f84d51141b92885e50bb78ee3072655923336a85200e695d0fadf3885420ed1803e9319668fdad7b74307ae524c98393c31455a9d042bce0b942a050be38c31d5dbe79e583c44417ed98093b104f3a09e47505a3955cc34013f83ec85eb17a827c39a4520aaaeecc434eae6071680b141db1d532ed911ee3964b095fa41f85efd5d74b8c5bf5fff10bc0d4e5d6a8795ac5776eb857a42253b697aa772cd777adf133c9f4f65a1a3ebd9b174bae85073672121ca451ea60090b8a9cbf677db25554cbca1c783ba00dcf39dff26782274fba3e69976af86a8bfb705a88c276e86e871ba673401f33d6b729a98aa0247c0ef438f0020142a4450d055e73fc576c61fe8ff999ec6948320be70e74c6e057ecb6be2a64c35dafdcc6a632f14393c0c831a53de0dbce5f9843fe79316a4a5d61882a93402fadefbbaecf529156b08819b6f7dde8aca2ec81e5ec645108c6ef15cf0aa51484b7d65a2c0d47c4944224cef5047421cd8b6177681d7a4410faaf7221caea6281001630c4dc8d1b8aad197072377b2cccfc60f1512e059b1139f10ef707cdba931b01f81fb99d06b865e876c51d6d5a195a6d88277aa0b688197624d53de97d396d3be88320e2069c11146a5432c54a3139e99451afd636f42d818c32d9a82af28b16baa5af06aba4132fc3a6041d6da31f67ae761a109cd3caa58da67794544cd944c6edb075567f009d0b30fdc044fd8f5a4efb65da48a59574a186743889b6ec2895c1e1b8a77b5deeb99bac78609eee43fe580fadcaf8026180896c0f2baf4844bfc89f4b0f277f87574c8c803105c0b725226415b42995ee72f5cb72cab4522bad7855970e120a095caa1a8246d0bb266bd12f7c64e8b48e21722f2de764be4fd747b14724b971e7325ad2e9027e22143aeabe7c8d8402c2e474e37af21ec123d5bd1eb5d38c4ba380c5324ef46c89f30ad59d807ea9f52f6474a4f47b612f3a115f1a7dab08fbc0c08fe50ebd3a776554384912b8b900160a07c024f3ca4d05229411090bce06b16a0137c2ad466ecdbf794dbddc4fb8294d94e176fbc8af1771f2bed28639f107f5cfb6e5454ed4aea52f17ec59cc81ebb7a27584e3dac9e3980150849aeb4f36ec41eef125824d8a9db04428a1be01afd0b6e8b95c7f21fc0d369279ca3075c0c61e4c60ceaf3dd411a33efd44929c181158d79eb6244bb33a08e13c84d819381bab6bde91142a3da97e74c4d2f8c5a7020ebeaf9178abcba70ec9476b108dff457fa9a51d6f9709adb89229bd4f12cf1b2f0a667edac687fc9eb714ed9858a8dc11a26ee3f008dac6d7f39664041802d550474dced9208a736f374f7cce1da767f7c2965573f4236d53359577c629e4c908f1d001e24e35d3c6c631a920218d4198a6b61239ed6619c0b4a158f3ece75ebf96a7c884b43c765be075e34d28bd218aab388ad0693544971d34981bc58d0efaa20f833ed6e0d3851286cb9387d950346ca82fc5dbf3864ccbe9b5bc38386230b0a1b28f3ad583d8e8eeb291b344862c579f8188da3347584d1b2243d99bf1082ef8e6e4648d0fddb00848c65f911be8f86920a7c87710501d537e411e0a23c7896f90dcc879cffa147dfebfd14189d0cb9f7d914b2169baa91d1a327a1583156c8020e6fb2e5cb492ba34dcbcd868aa4dcd08d3b6e4cc0e9cf296a67230877824d54781610d2ea397479bbb76c830abfb5c42fdb013bfb2555e740b9b0db9466ed9553a9ea8ce3dbea083ca93836a7c50e7cc5dbb40ad4c7ecb22e058ef91268706ea70f883a3e9655f9d8897ac8e81ead9f5a23cfe2d3355c323b33068979f29d867d32320584d17cf3973f7b6155325ad6f39b9aea81d86d106f2b60b44f6b3d86dcf930153cf6289f82b380277769dfc99a2b5d4b6518e7f4d2d5e4a11e3b1815cd4cc991ee6c21a4a0ced445d52c031f56bb5f2c085e91856d19da796dc9f6dc571347a1239b2facfa76bee1f8e18d813033e9b6f010346c47e08963c57f9f828236f06f61eb1a5c9694852466f246962e7b4310a798985168103a88adc4dab0569e0d2033c4a95e7e117235a9c5f6075b7bb564b55c85dad993350fad00710edc31e5df1e8ea65abad3cd3c49c4657bbc1c87d7a0c6c3b2a14fc2214d9c2a431bd8c2d2acb1d7f750c4de63cc555a9b5b440093f23c197fc82e29e616fecef81b7cea21649504de4acbecd0bce29e0f3fdc69c0322851ea5717b1858f8f25d4e503a6f5cea2f7b7afcf41aba0d2fa7e70cd0a85e9f1319a55f1a32741b7f68080573e767341772988ba231d018d3390f7fd2b0b9eff8238caa647f3b2df0ba3f45efacbdad84bdcdc73db4e667b14eedb56147ad9ba0b6bbf1de5126c6d2ae64a02221d8cd13c79b3e2b0655704644024bf0df9238a96dc3a3ec5abf7cb1cf18929fd930f9212a816efec8a5c90ea2dda1f5db002d7e93246f12fe7d95fa86bb9bdd456ed8595100b82d5e7fe876f5e06604dc80009ce16e81e6aee9c9398fde3a5ef8dad108c5a9d83b5a1c451bb7bb0692569a5880a302aadbfe7c7ceb34e0ec99661d89dc12dd1dad2e33756962bde222dba78bc6827138676fae377c007421111faf593fa32b16f75d3ddfec8169a73ace4010eafa4ab92d75177f888cf8765a77f8c5a0011442ae59941b218e5eb44ec0ec8e4a64efbb729110bb8d34fe6ada218265a9b7192f46c5ee8d85040da7d336156a717ce0adeb665281f682e66d148ef4afa92faa4b3504a5cda36ce6d06ca0532c0c8cbe1f0c4735595111510b9e22980a5af558151da84241e9338aec7f921e49581ee86d39c631a8294acea4eb7f150c0b82a31b45235c80e2e25a5a907def5900cdf0371865eff4eba9aff76116d43b47620bdc60084d010d13e59923e63ec18304560b0c98c8d614b88541a36c5e0e9b1e02c6d2b9ac58e422bd26be4d95194b4c8a37aaf144b240f1df3236f22afc7311286931d9e2fef4a93181d4267ad6e6111d6b67e1ec1fdce02e37704ac39b7bd5dd41f1cb9949bb11f348fa036860dffc8004c7fd478554fde2c003d8a051f1f691df971137efa3f762da8466d67d956952a23fa5cf7955b5ad7a462e59c681ddf690964d37474bc400b527b35d53a2d1e5b2537dec623ba1eea4dbae484fb8067c0373c22ff71ef27d67488b65a984d0e9b397d836e6934d170e28eb0473e0fa82b6b4327a659a1d197f5b5177d5b7f0bf247167276cd901b6e4b26706c9b944bb18dbf0bf1949ae656bf4a81c7eb89bd693848d466b998a6ee70ca4d7c79d5f75b85f9f5688aa20f19b98f1bbeb133ce07f25cd1c7941217f739c26ffe409c55303b390e94a381f4eacbcc0eec1347e3d55e9a9020c6c719928e55fd7a57af0d3897c77dfc48fe3cd0dd4881d97a8ba7d964493af9b77f52c657cd1f7928d6c67b82ea6b28dfe38fd4d74c9d0b4fc9bf1dedb2f6dacf026a9b7c70ff821adb2802e2eb00a1d2f697fca120890cf8c7d6a9df1eed4c76170a19e587c21d9585ddd4a11263ee8700f952240c6e64df4e928324d347d61488da497a5993d2019b8af9a5a7bd9768c860de465874996a259bb5a21a2b01111b81322430982ac7e6da7ad8f23525db1872a7f04bc23503169a47433ac154d599a8dcc952f9ac4d2e725e203bf41f4ab6d7b50b2e81c011e7373fed7d3257c8c9f6505208dfe1fc3afdad67c9220d1c6b38107d49d8c0fc6119a78a29a69252751495a89a724f3cd4216f94e5e677b9ff3dc130e4f0bf2b4ce9860187448edc63a9b3b150d98076c286ad8fd768e6893a8dcf0a47f14408704ee53adf35d2cc5c5eb357723dfc10cdd56f40e7d1e2f4e4d142f5ba02d8fa94f1cb1d79a1e68c28db9c8147c54974bdb6bb8f5d49f162c4b022d8844b0269827940929caf53828fc77617189af1085ad09b6480f79d3ba3d3789aeef54abd008f4d819187a01859ca4a002de37c366ccc16a799046de749e14b254028385fd7dbf8d2a15255b54d8d1f26cec97065ba513440f097e9ce7e83a460c20b55b5cf044b6d1138fbc035b8fd70437457fc0d08fe17cdd99a580a618a33bbc72828afb34e3a2c6019a3d7f3ecc6d30bb8652d997b1478f207eeb422058675833921418f082239f337c5fbe4f510c8b61c07e2abb4203809b9f6456f1d41366811064b41810b7f18dd8e6b361f36689f0a4af4e6af21574636da86efdb4d479e37409670c1df47f89466ee8f7321fceb0a962af476011bd208003c4b4690f04c3338eac5d184d9bae3b54b98f7b7cbc5a4534d7a11a6cdd5b6d2322a67f3789b8e550ee8b8e47d8853e34bf8b5e11f5361e9252386fab476c9b62f35445e29b2cffecc807ee57b876b58b657b5883ebdc8c17a94dfe31adec816fa14e7ba49ba7e9dea352c711ae1b37d545ffe92712c62411478244b45353b595c6e58ed21da249931b1c86fa4beb3b8ecb697e900c8b5d2bb755b197ea2abe71deb9de1f93b485a69995dc65f45f47248048b7333b84bdd36338e350d4d9f280534c07c190472485a98f060949ffd142ef2df1a5225acc84e5bc4863a5f9f84dbf1c9a8c85e2acbcb548b248af3560467279dc4a4365efccb9506f64d00336369c9be4c4f71f94b867535fa8b6a88acbb4ccd5b7214ebe275885b6c8d57e42d7565a950f664663051a4f7cadd2c1a73f10975c604e6dbe113ddcbd1448d394ac86d919b055ffae2f589d87cc96094c0d3059feda2d5b4606f3c5e0bb8c9bb222a887f17c48c3bc93acbe0f9972f7ffd27e952b8940900c94f4b1d033134f01d635e7aab7b11b34de71217278fc06191b65c970f21a946837cb50fa1f9f662a43a988a3f7116ead7c60886eff93cc5e4480775da93dd0ff6be203cce5736991d78deb7bcefc467cd9d5334391cca305ea592f40130cfe28adc35ad70921c1cf2e5d70a083d42b299359b29ee41932c6794a41c6c41a447a7a09b6970f3d27389492c8a0ca3b953a156896ef4b0be4067dee5f6040d87c6b5d0fa78b7c27d264c6c8540b06951d24fc7c40a35b174f5c64bff89afde9ee81c35fce32c4748bda1168832ddd631b80a52f505988cddd1eca397dd56fa1134449747b1b6c959c1f20ee06a7933828d39bdc4680488205e41ae58fbe2aa093396be83ea3f92d8baa61d33f06dc86bd746d1d83a63ee66242e34e7ea3936ae6b78715997aee8ee2e250b2acaa2dd15209856da839c06d6aa19fcefb245e62766537a70bfeb14c3a7d7a06c02ffbaa8ef9714714b971899786bcf165cec029dac909f726add5d7eac24a3a2a06ba74bcdabd3469b3c6cd6168d7504ef18d137c395a904a06e0d47c674de73aad0eb26413c5a017a734ab60de5b66273b09c1e35cc5fd06a856b487b2f17882a15cf62d3b27249f124f961e3dd5ad8f19cab798a9b8b7ecf0abea656bd178827229b270b75e3c60737c2fe23dc280d6fc44671486cf3b6d8e64f8cdc86a61caadf979c72ed7521c494edb55249e9aaf810b52ef9a6601f8cff662097f38becba340aea8f83ef023023c2b0fa8e655691683fd724b19b61f33e4a8a0e6a909f5f093e38ea9d1b1054cd8814a21264ba44b42e9452f56925158b45f3c9547bdda14679af0ca5bff43778890cd33dae7e18dcc88f0ada9513fbcf9d83511a155089d304777c01a456e10d0bbd14770a4916c856edd4c8e5d2acf09b612d22269e1e9827b7c21b92dc5b755752ed2842c344601fd93827230b30d887b6e5d6766f697d299867595131ac96b5f1e6b81c95ac8d6d79bf5f1565906da9a9029dcc6c706b5441f225a8fbdc5a6cc388906167563586f5f0d88489d39948630bdef23c3d48eedaebe660e3f4a8c6ef5a16d9e04841b37654fa371e0143ae0b8803ae88d8fe408ddb034190fb67099de5b34ba98c9a3c24712ef8cd235321ca0173c9f84773928049e613abf9817ef7afcf806a2a266926d2da8d3e3fb0eac8ff960b3394912cdbbdf69edbf7dd6d2242d341ca28cf82a5fc68bf186044512c09d43be2c73e55c7bf9baac9fb631e4926255471907ccec8793e56038bf69d1fa89523ace664566cd83dfe1c10fbd892e12f81086a1596b8cfc61aa9caae18c86341893afbea77f18f44637d3b8de525fd589237bc81229c8966d3af24540850c24036330db8007e6d19a19486018b2b02074da590aaba9d2c8848c0a2d1b6de4dfaf24025b6393df9228008f83f13cc76a67cfbed77a6e3429342824a0b6a9b8dd884094acc6a54bbc8c8829930c52fe39ce5e0dcd02d9553ef899d26eb6cae0940b63584e2daeb3b7340a972bae87dd05151fd639d99dbe503e5ba3e590340499b4e6ddbe0d22b028cb1268ac6c6ddc62d87fa8dc630de82391e81983e7879d652155858ae9a3b9779e3a0ea3da5784c98517e5f343bc6b1f8fb993e80138037cbd39f02347a4482a49ec09805ce76eafa7531e3cd01bbfba945ab38091c7ef47050e9e25bba6e4c73aa2e9e0889fe28bbbcbc207acce4e6b2c45e8cbfdb9a96a853dffe09a1e07c50ce91042c1d388f43eec71e24e269fc7c405b448c98fda4daa629602778c39aa2d391d05bd44da6fad3f9e6b18c73c56f814968579acea6700f6e109e873e2ed182d70c7cf465f54932fb7f0b122ac8f34ed1fe082a3625d157561454167ac145a10bbf77c6a70596d574f118bcb58d71719b1086905da865468b76336d9fda65f8d5f234923c5d4a820d45c2d23c9c4fb04ea5bb146ab794a3b23e22d4d4029b51dbac9aa04c86ce026e82ef9be97ef7d492c68efe86dac6387672089241c04f72c8f59337fe06891d3eb08960e2bacfa5117ae795d89a63cb7c1ccff00f9ce72442d507a07a67e29a26d877694fd841ea70c9ae22897ed3256f435e36661ecc2ff155dc24e9304343cd00a1fe5960b46d5abbcbedc00f7e0ef5f09dac6dcf665b7f7cfb0973ea13dedc33ef6728db90f47559273ea6d3cd4db62a74994d361d7091534c973f1cb934fa7649ebe3d13c4869aaa85d635426ac5cf9cb472ddc5a35d2e0b718764e9f0dd0d397d4b2c82231dfb637911e1af2f18c658afc36478373e72d25d23f092c310551c168be4aa9767f86bd24ffab9ae5f0779901900102f27b427c0ec3d3c86742f8aff02fde39e1f021205c2f9184503036e09e62923d7a3425a6142937db782fd14ab32d0d3a38db8f4a82d6541afaf4ab481ad4809ed3bae0892c9abacd2d73e378fbdf5d1444e7d921dd1b7ac3aae3dcb7bf10558bc4b67b0f9e3ee6074cb737220e6d5830cdbd068fb7278de62aa5d316d33b986e17d0fc1fb13c42ef9da2d331350086f49b041e7b562215ed40e3984e9f80d2ae92af6da0afbd56eeeaddc18bb8c06ec975652acc0333983fb54531456b058ab3fefcd57cdee8ab6df90f091adfd498182488316c0682a0445072a8e57ff248e5225e3d9a87e6c8d293e1b1c4f2648c4771143b42a738b464db130515227095acc87eace2f1de358680fbc373389ad3c021b251362e7d5d071ccf4ebc9da7f770b6032a3c66f97bf28804460efa9cf4e9ff097930e2782195dd4f8dc438bef899b596c0902c5f217d73a5437d8092772cd2c2bd180d528b76e43ac9143bdd208f8ddf74c68c37af8e0885c1a812a5e5f0618425d6f5322012f9390b94ee2ef6ba068550c6cea9ae8f104dc877f8fcc49c75f8b853e2416ad2e6f45a2c99d60283e8315c783adfa5e754a461d279c19f9ad6c57e751ea7f01c7212bec48300cc50fa8a9fc518fe1cfe993392a1df19fb514c947f25f08b3a59643c3f44f5d2dd8a05392193af319b3caaa165cc702e62299f0dc44c9f15d1f28519e6943774bc9ad1e5eacc489eab094e97e23b75285b8a96d754d0746f3c4d9d52ba9d910ff1e6263703562b6dd3cd4cbd10d6352f6fdcfb9b379bb7be03d4748ec3454bcb05d8ccd7731ba0c79cf06dbaf786fa69248794007693b02dafeed1760a75accf7fd78a6c4201efd48dda79379f310a0105f32aaf18a2a6e1c7027db19616fd44e74a2a9e78f25fbb2ef338db11c0ae1d9789844f25afe305d37a41e8700e8751c69b72171ed539a507a4714f541c2ee664af6c89a6a1adbf5bbde3c39e478f1fa2312b7c3c91c6b9a153ee3a702bd283f3cea805a2624d37e8332be92aa760d606741d78d8104b20836a75456ed7e21ccc4f016a21d90b970144e3031b18419d77cc0fb1fc391301354fcf185507a5db78983f612bee2e042f58d1b87a81799c7fa1cacfaff46585406cc45a2da364e67e132a91c98900a8f9d7bfb14ec951fca55b177bfa2988d32b271bb3fe926765662789a30292c7abe72973969fda11e57162bc5de3c0c5157eea9ecdd1bef681b93b263edff1cc3581b6b50e769b017e6c1f811c75a26470c21c134dad0e5961fdb9c70b668f576c50e74fc1daf468f01df83060b5b5ad0e7e2443de9b6ad72fbd0835b1a152af7bdb220758d3cd90620d568fd3ade2e7173a6cf626a2baba107e9038d998231e88aad0a77b690ebffdc2a2681b64125cb37e5bf3cdcae6482ecab9972b52ebeabc465af5d1a5a03ee9c64281e0e22b5208d359047c1bd7cab128eb1c4ed7905c3e3626ba038e69554da1a0a2cb30161241c0ceefdb9e7387c1218e8deb2ffcbc37029ebdb82c524b51d922958355bce484ce227d915aa3c9843c0ab3a9631552ce3329c89988436a1ff83221b159040ff983be76475750d62501c7563179c5652c502ea14ea925f8dc86370dfd45d5ddca6a08a2a49e60f8caf82e3e2a7cf23f78e117117e98de3eb30999220e2019941c0869c95136bd749caaa5323d718626db6f4be0d15b5884ca0bbf288df2b77d1ae74ab2f5274d95c29e95fc126268637d8132d6f1fc7912491313e721c397e0e98e1126397afaa2645c67625056803e859f34bb83822b2f59aafc26739ca105b48528edc536aae2ac6d812da056b6fe1b51b95632f655242256e2af2b84bd33a155f5cf4063479ec0584d25a969f2ed69202970a35fdf3acba22d48f084d3b4d885e294520ab81fc8a5311114971c519493ecd181c5b0b67c1346ba6aa3cbce829d5503a432e5aaeddd97ba88e81c73c7336a417231b2e35f3393cc42e98dcac725b8e5dee3b68a5687e6e9ae65da9b28860c881ea9cc0899897d48205e01f0cea67202a82513052d2b86642e153f11df16386d2f38e66c559d6df4ab0b1087c0a8eb22a801e4659751dff3af01311c156b57ba4ae3e958b9f8c99a8cf7a0d9c4b18b0d897e11f0be825960d92f9905f20bd23519b4bb14ed21fa006b2a9a2c034bba8af1a582efca455c7255a960159d800fa744b245e81aa069efeeade7c9a5fde063897d20a9e32350f0cb776c913f5278d773e56f1c68fe7d2ec0876df8d14f655ef80ed1682fa39da3e29fa7c4ff07748f4d5622f7fec29d8787c01600afcab144e6607e72d94dab53432bf8f506296a957a0c44c2057433c0ec61c92b68f52cdcfd7c101107a9e2c79622466b7b40c4b2a30fbec6a49da6a296716ebf24593ff0e2696d8ae240abc9828d7b6f87d2e9ae7068794804c45ef52ef8ec050a7c5046402f7f2891996c1faf737e4952694151881e5c934c71c3815bff2d4543e8c9a8bdd72c323c3c8e92c6dc3741038c346394394eeea52c3d0dc68c18c7f62510dc01675eef0db27aea6fd18e9fc3c42aab3bc239a0377e346316aa95d24cb98faab5eafca82a8297ef51586baab9978bf226c004f229ee1049f45e8caf6d2eacdc8165eea6bb344c69157cb6ab0e8fbf00fc3b972ca405398808b2e5a7800cd1380ce21c2ee951031f624257eae9342e9d663cda96cf4917e8f9ad8800aed96588ff686e8bdb6023dae1b436af730d41910cc9b577d344123070575e021e1fd0920100cc03bbe914623ad93c42d3a25ea395ed1019d77e932a14b94df7f965791fbbb11ee0ae743d7f14b94fea327bef9daaadd3c2047e009c8eda3e256634caf6d5834c68de8a08f9175d58f1b8215a45f213e6bb82ccc34f85c31ad58e132ae1f67e3ee473b2dc97eccc409d8c1b09641626314c78f0420ba27ac750988a01a6c6abdc9b957521223b0eed37d7f162c1bdee9cbc0e72e7978d092fdbad21b80eef110fd76a5a4063ab2c4906c02ccf26907410556edb19bded7738c1f561b5e116b8bdde1de99f1fe52d3b547053b65936bf735dbdb33f436acdcc4897d161e7e6a9cffad4aaa7219119aa670fee812358d7af1d2680c3f2ad12d2babcfa24e704eb2e70b726c03056f98089c485974c9ec5aaddcfcc0c925e4e325d8b6267ab1b86c08bf0e45313dcd4a4ffb7a1609caf904ee5e01e82eb258ad47a2d9390f9d1836f92a46cc693ccb2fe1411c944db3440817c82ff8dc4a8cda058c915099acee922ccfe478378ce9b760ffa86abd0d4de2debdcf695e7921f7e41886e3856bbc0c18223fcf08a8998f437995ffd443871397b188b021a8988567b922887f4401133fd3e137790a6b060d617dca2ff08018d715b463c263511104f0eca5d3e04e3628275157f54cceca2329b8503c9eb971118d0b0abd340c1940524dd21fab03e355cf0896f9ca452a2934ee3866a8939adb79c50b8e84fa1cae5fee83df1eb2a94d1d8f7b131d6ed4943587d94a98bf24995eaaec92f0db79a37c17318eb5eb0672b55e7acdb09c27d89e0db964f99c7cdfbe053486e1f0ded4298071ab0b1d796b08ee2c861e5db27ac0e86f2245ac22131a6c69b6e30aba94fa92bab078ba80aa9ac6f6d8d143f30f50b0512f077ea2d7f658f2cf7e697b8a61c6733b99429a95dd61703253bf67eacffe05c7b9747da2d453761d1e9db008f1a431a8f75645c163561f2f20509fb1912a03a8d63e20e826d45a4c3e27f6b52cb48c84ed6610c1af1d5a3bc177f8d836acc13ed83c2b2c706415c967989e03656fda6c15e279fb331fb7c4b1c601e3432ec4e649eefaf4537b4f01255034684e3ea1aafb6beff261d5ce666bab49572908955ba5c72eb412925caff1ff487859c988ddf862e12bedf7f4ad79984da86ac2a8fb767525006031c51257e658a7ea78e681a757fc2c29cec0e6462d7d5b8af5764226497c5dbee21ed4c1b5d37ba2c5411282bbaf5797f2c9cd6bdb66e4fc1983cc5fe4a310712bd063b9de476805473f2d151e7952cadc65af451288d9509767f66db727ed3967704bbad022f17467271dd8f0c89245142b288c7351ad0b07895cea3179387a3d85094f3c04ac82bd9f8138c33b9a691290b58c6e5fd49dd27e7c5ff41586b6067508e1625afdb2b31ee3cf1630dfd9502cc2ef7411e48b909db1397f9b5c6f6ac6d70bf3a47986d01bb2065a56d7086555fd0025065146ca8da7f124692e28c2f0f049506f8461ad1c6879100c1468cab2b068e1bbbf71d8c4dd21831d7054b799f104191ab2f592a79391c7cf1c8ce8a989a43a80637f53b9ad453c16c785b11835d6ae3499953923bfdaf21e53e757d0e52cb01301d1b3f2b4d68fe3983e37f25b3b905b8cd3093759df2f886f0a809f5f8cb2e1ff1b720660502f0276d0b4cecdad6fee21317b58ddf8c08ba2590b8b552ee35bdfbf364b5c4c7a01c80fdff3f9968d6adb2307fec8c26596a265511b629d920f082f5957f515f150102de2088b9179503f4a479fa6c67f47f3c1e9c614437f7a2d0e53a2b757357bf3cd9372e038d44cb1f9b2b1f46f8e0dfad13e21c6daec0ba2becdc23f8ab6f3c7613cd993c6febed7c3c1ec4e3802574c15e6a506ae68520dc3202cea2ae6462f8b769302f68905053b0d94f0ca8cc24c224bc6604894dbc2bde34943a253e1809eb945da31e3ddeec1fe42a8718dcd9f69061c4033c21765f18fbdd8ab70645f2d7d5885f39f97e8eb0c8bb1c775d7aa7c7e0d42fa90836c20add11580dc3d3fca5b4172c62cd18838b0c6c956e58ef1bf4c1fd50780ae49ad964986dce7da96c7ab973d241bf9511d938a4b9a4d3209a3d8da62d512f6830b018db91a33caf8d816d04197ddadb81c2d5ca4fc2d9f56ecacb398fda80aaccb580408b3409cda6df5732c9be23d31b6d6a48206f6f56dec4031d3ebe0492b61024302528ebebfebf0066a9aea46526037f85f4549f2b3153beba02a3c30935ea8c142528ebf1de47ee0682f3647aecab9ce99218705cb09e8278a332c6f5926b415254db10c78e9fab7c1c356bf8b38e4adcc464ebd1a3cedabfe812144016baca547aea625656f0bf2e3f1dc2c9c4d310c650e01672520a4bf79aebb5d00600af805ffce9847e62b086b35270d367a3770fff33fb28047b5f888167b28fad647940cabaae3a4d1c08ea3f7d7d00e326061f9906a2d902499dda652c1263520faffb85cbb8610c474ec4ad46f2368283455fe600116e959b8d550ee2dd363c28d91856d90fdf040a0b7bc354d65f8ae3bc35aeca52d00399b86244321cefb4d87f010689bc9e7a8ec6774a503162446df40ab80b6de5946da567cec4d67602472a1d5d85c684b9fa072009e10b27f84a7447cd6c6897923cdcce753f13b36e9c61d42275357b087757decab06d96eea1c452b5954dcd4331e6fd014bdb8e4000ad8e1f00126aae2d3c1953655e976d9b6d95382d246ff1714a5e3a9137efbf9a95b31acf6438f44340396da7e712be60f6761dddf364e2279057e7b92ebe3493a1abdc8a33cf22e2eba6e01e0fef2a17e75f2e4cc4965e794152d26bc9e3e71259df2dd887168031c4c87473de16f7e9c9b731229eecaf8fe4b6c14e0f46204046b5d46169f555595308f14e5c6f6dfd22e6ef098a4e1c9201eb7d0a08cf2744ef969bcee054eb8120cc1e5692e3d67c7d5430a78ea4ecaa2159ce48bc674347dceb48c7f51b88d2b47dc4348758788d5f69bca4b5d668fecb687bb034f4be71961aa4f3af3275749684ab9043b79d59528d5aa904cdd8b787804ee9775fdee9a48d77fb1682fa8e4e479b10cfe98b07dd28d45e856f84fcdd090d9c8d91ecd88eaa898632f15e4865305c5f32d58ac089a2f06a3fa5b3f6566b81707f712f65dddba13d0c68ebcb62a6b5237462e4acdc6377763a58aecd790e720e54e6f1b9188789c8abd0e73fcd1070059e7adff260d330297f6ebea8ce5aa81d14da78fbc71507ce170f9bcc2fd853acb704c5bb9d5ae52c15d129afdeb8ea46c7340e5473efe4f7590f4f980e6527c1c7e7dc2e1a615c260467370c308e013176dcf9eca37ce7ed78b64bcef51fb3ebd70d6d745f4e5ec0551a32e44d45b68529b981eadf24da557ceed694696ec1d3ed5dbfb4f48bb3a20fd06062bb46cfeae6b5f077af4f83da6e9e3912f4ba172014bf1c17627e23733a730bab04f8140ab7b78cba9c65ac2255aebd721d6b7e7b511bcac5309176dbdfea79eaafc24f8aa3a89fdc2dce1bd53905a7d96ce9be8cae5912e5e62b7384041df245450e4615b26e6f04ebf3999c228d42716a9d9ffa32623c9f0cb3e413b4f4c0e44d43c251edf2455b5c3aed1f192dd5629eede96ee51c901d2b938f33f4572af04fc88be65b1c68090a0ce10525cda7d49142638fd0705684ca323c8ace2e7791d407697d05d522357dd23bf64f5501eec905d706fa46d5ff72f8b5c04961f0ee636724bef103b9073bf2c49c9eae2bd8d09c0b7a6c8756b3aa4dc17e6dd8dd3084508350298f76a8ced6449c1abe6dbb2e71c7942c1921cbfa99276c437c867ebf2a50dcb562a140bee483a1cb6e0fbf69ead5fc44e67e6dea44b031d23332019d5e51099b6382f691864851baa7580b0b71fc59bbd5b5c203b6247523e62ae1a5524f80e57960f3d1235c54ee4f92c89c6d03539acd0df1cc584be23c7eb745606f11e89b8e855f052288536f4f031da246b393e8b8cf22ce90ec1e27e11f55541d61eac3893761b6ed92f64690f333a763d4c1ad7d447f8fc7d1d1ecf9aa3b0bc5052e6751bf216beb42e47af9ac31322e2e85f204b12d9966c0a491aca21c0dcdc65b8ed065c8ac8462c613717540cc0e8885be35615774d3823e20e44d23e09f6c1941ed707e0220b8431ae29588fb6bab6c19f89b23a678df49a088f5750ea1bf1287902a6af3270e04963355304aae60e00b35a6b9b9bc9e6a1a80e03d1f3d87eb68a1d9b509012ab08f4cfd613e3d6d899dd4cb423506894b95b456a199da8b4fec09c686cc17d4f00d15d54261819a11d6bd52e6a0c06694190ca1c906df94e41cae3906c3cfd66c197624fc3ae2b11dbfd883cc8451feedaf7008deedb66a52ff79795d7692f7cbba5734b651c978585e0ea51d682119fc5dc8d208d7c6d5429d52d0b26dc9feb6f9a04b992f9cb967bd450200d5987f6c2dfc486e4b779d5cff22842d31dab4d4dc39b2cd5bc43af5e466e09e521ef7e327f4b239d13189472ccfdef8492fe1ce6e0ab1795daac4a8d95a881f671b4a0952985890f15c62ac2c4326383d2e4d4bb4fb8fc5beb51e28a60742aa9cf74088b6d1819c3460f0320864a4189641bff4b8f596da054c121e535756677a1aa1055b85768521a6fb82c71ca0bedbcf007181de0ce0bad96632e6310b7f88ec352b4a9d807241944b43715261529440d96917a03afe66c3e30b697caa1a4ed6c49f8a02e58b1a93a71e0fee30fd49fb0f848321685d90725152e3227b5f553e150c239aedfa360cd9bba8d755e6836a6d6bcc4bde25c04e78ae5d0ac677248df1181e4fe2e41d65a7c144f71837c9f4bac6fa04e37d7ebf1fc8de1cd38a442c206b82080a745508dad9eb35c015a401bd3c1636c08d532d10476e40e9bf3b816aae57adafcf685b3aaaa67997aa9bf93f7626c8be7ec60011d4155e523e93f69789a5251720dec88edd7cabe31e3645081c35a2237860a0eb17dc5e5430d3f26ea3755a8a8d3db5a01976b4ed99fd4be0d548ac37a2a77566b7ca2838bd84ddb8a5ce33523e0f8c36079b7afd4279748f4969ce442525e8495de8a5460c2d1e3d36b998b65cdbb4194ef3e65b413128dc219ff09029625f5eb03dbbc546561fc5ff3d71fd0f2a95119786e04ebfadd09105f3fa64d5e5436b59d153ff92884718a862a6707e8397e58a5d511fe476d2749c6bd4085136fd39ffac563a1949fefdd8302057d26e225fce7f1f17d713984e8f1266c4c6ddf3904bd7aabf0224ac3e37b0c5fa32739e450cf4347cc10c88e685ed99e05c628f37e55939d6769eb9a16ee97ea0c71b7360ebc57696c9ea0c06270653a33a4e38f8743ae9c69d418eef25e33492b9ed097814f9cfaf18348b741d647d5789295599a082a4d99e9491ef03a7cd192f72c9552e98260dd5726df90e0f0042707950e3133a5155a21f2b6bb13c337b513019bee2ab62f9292d195da310c2ac18c8909e726ad883d06bc429d7aa4c0048b1627cd8386dbb3cebf968836eaddfa89d7d92681821ab51ffc5f31cfa02f23c7d0d58b74a2e9b353774e25631a82249817f869b4e13154c63948f28333b97541a801728e68de13c96f292c6629abc23fbfe44b3139808ea209bc5a45de139b9122584d21672d47b92db4179076df65d936292597097ce53bd415f3881db1e93ed63665ee1c5bd17b298b7172b081820d11339356bf9adaec2ed238ba6118e0931a18473506ee4 -MD = d558f26d7e8e293a3911d606e7b7c822a92e28675a8e92389ca27ab0cbe71b2debbf0c360c8d33586c7a374550266db2 - diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/third_party/NIST/SHAVS/SHA384Monte.rsp temporalio-1.3.0/vendor/ring-0.16.20/third_party/NIST/SHAVS/SHA384Monte.rsp --- temporalio-1.3.0/vendor/ring-0.16.20/third_party/NIST/SHAVS/SHA384Monte.rsp 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/third_party/NIST/SHAVS/SHA384Monte.rsp 1970-01-01 00:00:00.000000000 +0000 @@ -1,309 +0,0 @@ -# CAVS 11.1 -# "SHA-384 Monte" information for "sha_values" -# SHA-384 tests are configured for BYTE oriented implementations -# Generated on Wed May 11 17:26:04 2011 - -[L = 48] - -Seed = edff07255c71b54a9beae52cdfa083569a08be89949cbba73ddc8acf429359ca5e5be7a673633ca0d9709848f522a9df - -COUNT = 0 -MD = e81b86c49a38feddfd185f71ca7da6732a053ed4a2640d52d27f53f9f76422650b0e93645301ac99f8295d6f820f1035 - -COUNT = 1 -MD = 1d6bd21713bffd50946a10c39a7742d740e8f271f0c8f643d4c95375094fd9bf29d89ee61a76053f22e44a4b058a64ed - -COUNT = 2 -MD = 425167b66ae965bd7d68515b54ebfa16f33d2bdb2147a4eac515a75224cd19cea564d692017d2a1c41c1a3f68bb5a209 - -COUNT = 3 -MD = 9e7477ffd4baad1fcca035f4687b35ed47a57832fb27d131eb8018fcb41edf4d5e25874466d2e2d61ae3accdfc7aa364 - -COUNT = 4 -MD = d7b4d4e779ca70c8d065630db1f9128ee43b4bde08a81bce13d48659b6ef47b6cfc802af6d8756f6cd43c709bb445bab - -COUNT = 5 -MD = a038eaa91772d458a7339612f6a9214e6550f78d5870d91fa7a3dc1c2321e511759c159a371475dda7ad1fd7f51ac82b - -COUNT = 6 -MD = 8552b4ea2da9f855fcc7230ac88ecb1c3cb4841cc28e0495bf1ab97d100d4e4c60a1c51949d26723415f560da2951bb0 - -COUNT = 7 -MD = 668338b2e661d9e25b799d7329e55629b62416ee4d42d2e55245ffe7092e7ae4a3da6903944d532c2a88e4632f9a4b36 - -COUNT = 8 -MD = c40cd19cb770b1fe81135fcb9223ffb9ef50340d13660658ba60656a88f4ea08ee3b572680e2b4abbaf4392486ea589a - -COUNT = 9 -MD = 540c154e82b57914abc0452990abf988e46a2f65b40f5e9ef80a38c7431293d5efa31c7c83df5345b079ad4e31b2c8b2 - -COUNT = 10 -MD = e112f9359983e7df9b266f53ec950ed2b951b6d832c8fc1ffed22b4be3eae3d015e0771e96d344672000d4959d2829ab - -COUNT = 11 -MD = 186e69c28033e11b152542c86a94f59a25ec4edb7ab5b735faff16bdbacc682b2ae79b5f5a68ece9fee5ea4530b8a8f4 - -COUNT = 12 -MD = a37c790e641f911ef2929bab0ccbb890627c7e38e1a2fbbd71cd4215de919763c2819c35a0e93984b7d85d0e8858573f - -COUNT = 13 -MD = f1b4bdcfe0cce284ca26e0b7e01f26de21bf4a7a409ee99fee1019cc8d23e775bc134ec7987a6575fa64160b5c7f849e - -COUNT = 14 -MD = 45aabfb784a29d6be30104ae9f3c5daa58e48a9c94f61fed94dccd2ec06b527ed564643573d588ce10d3847361a57961 - -COUNT = 15 -MD = be3a49139a48dafba418bb9e0e8e2bd195e0d239eec77c43d1f0cee844b65f65c30cddfc05b644f9a792459695883a2e - -COUNT = 16 -MD = 3b263277a0d11de4cb4616591d4623e0821da4f111dae33938329cb8cc47f46742c70c09463edb9ff4a0171c4604b243 - -COUNT = 17 -MD = 2be323079381bd13a02cca824c2f3cd18cbc89b0c3319afbf33c6f06f2abf2fa3af35ea9752ffe153d1775a95e7accbd - -COUNT = 18 -MD = 14c8c3ea3f5aea2e74a2f138863accf1b5f563d96194c0dcf08ca816e1ac9156c3f5d15aa5701d93c188c2c1f7237518 - -COUNT = 19 -MD = b9158943803c47678fefafa91c98966aa3dc1fd96f4e86cfdde7ca879dbf9fa9f54b1988a53376f7005df7fd87b1396b - -COUNT = 20 -MD = f4395f88c4dc24b6edca5868fcebd24991ced2e3826c04ec00e4630d7e1f70ee56124a90657a795f446f7db94d8b439e - -COUNT = 21 -MD = bb56b4ed4683fce0d6d412ef84b7985ccc5fe30306679a994c8221c1212ff7f1492512095b7ddd250411008ce9d54020 - -COUNT = 22 -MD = cacaeb081a62a4e384e0082f8b994dcd721f38b3c3e4b5836ddcaaab74bcf2700fdc8b6faf3f4df1ec175a0628728a4c - -COUNT = 23 -MD = 231796f44eba3c8c6ad064b0e350093fcae026c3c03d669c28e5f36befa5f35489bf595a0312c38b9b73b7bb4dad5b96 - -COUNT = 24 -MD = d54559e7eb20534025f8f265bdbdab0e7dd9e2459305288d3ca84190b6d2c6e8ae2cd6f3e51ccb54551d94e9e40b31ac - -COUNT = 25 -MD = d6231b809b70ed19478cdf7e05534e92ea01e74e970fe17e92ec9a67b1b7977c4c485cfa74787224fe326b1b8d1ede87 - -COUNT = 26 -MD = 8ca1d462cc1b16b734c0e4f1a6b7f7d9d0ba9ce8074addc7755243b05fe269afab6618f07fe73089d9379bcbdce6c728 - -COUNT = 27 -MD = 60fa725bbf21ee56545ab24e6f26ec5ec749c4971bf761923c23415cbcb0c02e6a474deb50144abad2b0f16ddbe850a9 - -COUNT = 28 -MD = 8b60fe287f5bc133ff842a246bf161a58b4b8ead5be073c702552d664653e384e28e70d28624aa1da951ed33dcdfc7fd - -COUNT = 29 -MD = d18a080af3ae7e6318dc69298bd7b13644b7ab00adac18b446c1e9a9366e68dade87687b9129aefae9a98b531309f1c7 - -COUNT = 30 -MD = faad832a7ce865cf3183e51e07f08aad6570795f8d0274fae52fc5cb637ce4b7cdb8f8092e2ac4a7c96beb70cb288b69 - -COUNT = 31 -MD = b7bea61748495351409fcf1bd45a94af34e7dd899933ed06d5759fe728f6933781c21f1986b99906c6910d976a0d9c4b - -COUNT = 32 -MD = b35027199cf6467302a88e5d0106d01953b41dfa172234b3e11d3ccad33bda9a836e44f43ae94451e2bea28f0dca7989 - -COUNT = 33 -MD = 8571acd0d5fdd20909e9cd74e125cb9cd65a2e74056eab3f85f6f13e31a5fc1580aa588997d31a0a3ba1a16dea5528d3 - -COUNT = 34 -MD = 3dcf49cb8d79d4ca3f6e06e8a58bb92a7a42d7915b9e710a29d37ece6c1c32eb89a897e9935354db3cbe384a1149964a - -COUNT = 35 -MD = 7b2258c5fbf26780f55054b4aa462a607eecbf7382af941efd75b9b4cadd5b97936a762b9c03e133d7cfb65de501e6df - -COUNT = 36 -MD = c54cfebd2381621fed5cf6b82b3dea25965ec99365ce415b184ded71b949eb8009d91c85c02b30b7465fdcf18be885ca - -COUNT = 37 -MD = 39bed6de0e885dfd51569f3c5dc967f7f551065e87b6e7108d15ef5ea407419f936f5ae2288aeecf98777249f384fdfa - -COUNT = 38 -MD = b1c341b1428e5df6f4bcec533f1b5ca57e02102f5647b82be0986e523fad24b7f27aa29336a3f333817e8a5336a4a3b4 - -COUNT = 39 -MD = 2e1e67546b9424a2f0bd8931082f9fb8951b9fe57a2b61683a5e197017ebcd96592dc47a75d2ae4ab8f436edd5e5bb4e - -COUNT = 40 -MD = 6c84a39bc94af5960715818bf9b4694548dd1f0af8f6344d56b0dc7f86b181d5249172c82572ec8748ff35b6c0a2abd5 - -COUNT = 41 -MD = 576705bec035d07e31ebb091f180cd68c3873ea306708c5259f50491463c68d912080ba9f11bcc983a4b849ca19df008 - -COUNT = 42 -MD = d45c7e9080b6223a2185c490363764f9fb0634f3865d57a15bea438fb243e98fccad4176bf24c4cb7247dd2c5728b761 - -COUNT = 43 -MD = b3021cedd2ba38b69348867729cfe2ab172e4f1643eb4971cde2db002413458a566ea884d651a9c010b1a6b869168497 - -COUNT = 44 -MD = 1cb9c05e35029fe6b114c85a457091b7d9aaf7c95f32447f3f20cd034bc54f87ae85c4013d18fe2a94de8ecf9c6b9f05 - -COUNT = 45 -MD = 1e8f037fb920b836b8f36a1ed4875cf7d61390f68d4843e420b2c1ca702a104524c1187c8eec7bb4b174a252e1ae1462 - -COUNT = 46 -MD = 07c790c3d4948347ad5fad9992d8a0f6603a2133d138f1ff5cbbdc04c39277fb67d45b2e2c8e6c51fdaa6c5883e3a69c - -COUNT = 47 -MD = 98ef381d9b6b4e26ebf2bc293743e1e07943a3663b17f1be52d12ef8d19621263efb8525506ef6b95f746567a43577c6 - -COUNT = 48 -MD = 8beefea2f858f8902928dae6060b10cf6d4a3cd1f91cf1ee5ddef0ee5fc25a8269367c114c1c5c5ab5287c48edc59274 - -COUNT = 49 -MD = 03a6509ad6eb7f009931e596f3dab586de3bd6549afab4f218eba4fe47daf37c6faa360afdd931c5a95544f1a028195b - -COUNT = 50 -MD = bdf7e8d538e7ef418c808bf2dec1242b716326f83bf0a53db81f4d63aba37a2412f6b2bf00957ad6faf8404e4e2067a8 - -COUNT = 51 -MD = 71ad43312ed6e403a5e174480fb14b3c2a3a60bba36611e1c99adf8013d243fe945b947b362b6dc51a3dd96235472f5e - -COUNT = 52 -MD = bec45a229217e5fe28d6d1675dc7440ccb5616c0f02eb5d4c814921fc82fdddb04592ce7af192fee6c61b1a08f6ab6aa - -COUNT = 53 -MD = 5d6bc2d2cd0d8f5e41656f73a473bef1eff212fe98b184386cdecade24c5c5e7b92cf76ea16f582b9951634881f85585 - -COUNT = 54 -MD = 96e3568d30a1f7810404f3be8d2d26e5606da6c3fc064d0ef62298ca327476d587a1e3ef0d6554f4ad529053b7a651fd - -COUNT = 55 -MD = e4df3b7028f5e68753c1f21a556d8468a5d80fb048f6b92d405e519ea9ce44c6c95fb362119c553f5921dc9616dd3937 - -COUNT = 56 -MD = 7881e36eef708df4d9c06e37bfa7af5ce7d41d31a2e4332d23922a518de3e2e6fd4b9f27ee64379afae7ca2570d24748 - -COUNT = 57 -MD = aa12548b63d3a58f6914744111292cfc1f1358f717f1b19fab1a4ecac6292f1ff4b4c67b8a260b048f00ddc83b42453a - -COUNT = 58 -MD = b421b6941b5d7748765a4090c224dbbd98e85dcff9a65a77db0c2a83b92f4cad961b5b8ff76b5513d4a7af45ec4d4550 - -COUNT = 59 -MD = 14e1b1733b16899c4046a604f8e1e777d55649c5357d7d9e3d7a1c395b6275aecf733a598de1d0bfd7eeaa9ecbd7d1e7 - -COUNT = 60 -MD = bd05a1f9fa5b77371005a8073f0f3bcc4cb4e08fde3335dd3688921cf9cb5e97cf1b3052ff74bed8a359d170d2bea48f - -COUNT = 61 -MD = a319d9b3eeee6da494940ffb08903bcd588b18733a64ed435eadc5d9add6ab4f0c35fc050958bed81303409f388a065e - -COUNT = 62 -MD = 6f19824ec874b55e88fe4b1387433dab85415148870bf4a0612aa9c1cbcd9627925616fcdb66d68760c50fb308f628b0 - -COUNT = 63 -MD = bacb435a1ff538d0ba3e3d0ab04b5e8868bc1f84e964409229d7eada4b846b813c0e30d8e962786aa83aac2dacf02d19 - -COUNT = 64 -MD = e8f013470eafd5af84f63d51d51af2ca884789d03d79f8c3089810254b95a6f54fb86c08202cae94681ad702ea29451a - -COUNT = 65 -MD = 374b07621c018cc3935374c2f2f098e661ca0656181f67f55fb80ac36e23da379c4f6c8a3683c2621f874afa1241b918 - -COUNT = 66 -MD = 5878f1ebcbe60aa62a7b149bd181167e5898d08a3627a08c589436f007bfb82c040b26ea9944c6f0c9c4079b9b0e1ecf - -COUNT = 67 -MD = 05961b57507c99d0cb7dc24ae34eddde94ac484129de621edac5b001ac5c0b974d09d24f75504f3be1a3cd635c44bf71 - -COUNT = 68 -MD = d961eb883eecbc083533fa5128695c8d28281fbac23308dd2f504eb079d2d311b973f1a52b45aa6275550e14477a8876 - -COUNT = 69 -MD = a4557f990f4ccce585ba33453090f66af576f0a501d26667031f48f19538b820b84f870579efb554e7550f9f53fea5ea - -COUNT = 70 -MD = 82194c49f24084249567f0e8963c5f72a23bc20a8f522a6108f12abf95b7437ad93673860a953264838a09bb3968d0a9 - -COUNT = 71 -MD = 371dc5573b145f2136eb854591ece253efebf8732d3898bea063fdc3889d07953ee646e533b214f8c2dd66f1355b03cf - -COUNT = 72 -MD = cfc4dcecc6103027232029dd9a19850a6f79b9004be7d70054d0af11c692affa44c537f7cd749f2b6317cafe1fa52fe4 - -COUNT = 73 -MD = 9920b835400795bd3ed8ae0bc12417d58be8c5ffd6eed151ed738c3031e624c74fb85488953ac81c75f395cab74f1679 - -COUNT = 74 -MD = 4a1b040fa38b5cee63f5d308b55502d2a017b349ead5172c288289f42ba9874d0d11c9ac43255580c428a99067495782 - -COUNT = 75 -MD = 93c1cb94d0689301728165299057edd78ef48a6dc7654931ae2bf7ea5bc733f3b724f4c3081bc93ed61e7d739c38e137 - -COUNT = 76 -MD = 8f2e6c868b224b3cd5ac80669da0ba1d7e799e85a124c9e81c6865ebab1c0481e4ed4957a8989902ec565169ac53b7b4 - -COUNT = 77 -MD = df045c9302fba73f9f27ceb0fb70e6ca3897f410e81a2b8392489e40aa17f15ac59cf8d6893ab10bacd8b59704eab22b - -COUNT = 78 -MD = 8ab095f49aa7ebfcb8b1410f42c38fb1755a0560e3638b8b82c7a852e8bce8f4b780015e051dda0d2cbd6d6cb08e30c0 - -COUNT = 79 -MD = d77fdff2f768188efa63a7e29d73b8ade14c1aeb12e77866a57ea12c81bf0b3e1421d1af57fccf91b2098ba02ffb4118 - -COUNT = 80 -MD = fac5ee7450b3fd1ae2152f5d020680137f553a2c210c57290d058f330d11407593d74c9d3d9ac88bf4af44e023345168 - -COUNT = 81 -MD = 39d0ee95db114925ed7ff1577a22eb3dedb8658ce31504bd0f9f8a8f11f90825587203f26c432d216918156ca931fc82 - -COUNT = 82 -MD = 17d22080e8a9f589a80a5ca8291b0479c41351008dffff79ff522779c35ba0b09acc2dedde936b07e260451d35ce86a9 - -COUNT = 83 -MD = 9d75befac42e6d4d544e70477f7581264b5f8dda988da0dc40ef32f85c31b709284aef5f4f0246d20a855eee9175948e - -COUNT = 84 -MD = 3985f0cbca4c25f624850580516184e3d75996d77f138839c7570b4539b90fae8e751d1cea642816abd7f9ebf9d86c8f - -COUNT = 85 -MD = 93cfd14ade34e50deeee23aa75a63a017b6974e23051117e7e6b56b4ddb88f917a5d88d3af2af27da8e63fe130502f8e - -COUNT = 86 -MD = 7ae513480491a9500fa9afb8f64b8914ffdbeece3b3103048e91f6510b64cdccc8273257e275e5b34ec14c4c4aff4405 - -COUNT = 87 -MD = 2585bab1cd98d4b51a1475fbfbe3bca43da2a7be842c5667c98d3b62a9f05918108be94198d96c67388f83c2abebe498 - -COUNT = 88 -MD = 32f67419616e11fea79e3baeee4524c58d09f0cfb42049cea70f9a4a74e0096df841a0cf5177e402dd5803f4b51c602c - -COUNT = 89 -MD = 9f4486d93c599e68e7463d07d5cc9d589ab3a7c3d4d3c2b2d1f81f65b5c85068331f4142215f337c3621d096eb36aa91 - -COUNT = 90 -MD = e3399ed2ac93c6a4a6c88c11bd89655aac3e573493483c81631fd67dba3bb237d46f9e8ddab3a9fd78236296d00dfd79 - -COUNT = 91 -MD = bd9d1de114afa5ffacfbeb488d4846d012aa6ef66ce09725ae7b15e680d719fc2447f308eeb8247ae8e91e34b5a21ea2 - -COUNT = 92 -MD = e1c3511ed2ed26f770bf5212c7ec245ab2ba49e1c09edae2abad6a3ee41c9e25445f5e5317cf7c9c3c3f702ecd6778a5 - -COUNT = 93 -MD = c363234d1a6272d081f351cd68ac90abea09d3eae3a4d64fae7fab251a252591cb34dc63fb10abcbc5460129464c868b - -COUNT = 94 -MD = 6e5f1531eb282a2911a64b72b043cfe43b527d4d557abb9a31a9a632cdf5b5e055317ecb72a517a025eb4286d6f00433 - -COUNT = 95 -MD = 19c85253b3c703fee80a70bb2ac2ef836bf8e14464d2a17f35bd5e4f2b0b3a059a27891410950a9ce07197f5b306ae3f - -COUNT = 96 -MD = eec713a44cb778811795609610f2f9bfc9bba479e415746efe0dc530b6de66d73cb85b8698a8c0c2ef9344a2043b7a31 - -COUNT = 97 -MD = b799577aab5e8898326ed88eb96de38a27e76280ce44c3f16e70a1f96543ee7020bc29913ea0b9a9b9d92ae201143e0b - -COUNT = 98 -MD = e4dcabf1e22134076a21ea7cf9be6e03b099be40efc2b3080b9ec358cb021623ad27d33129bc68fce3eaec6b25aa2329 - -COUNT = 99 -MD = ccde4359f23e64579c5c0380df837ee950928aa82937a2d2ed33d216e707c46d847efa5ca52dcbda551145e164fbd594 - diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/third_party/NIST/SHAVS/SHA384ShortMsg.rsp temporalio-1.3.0/vendor/ring-0.16.20/third_party/NIST/SHAVS/SHA384ShortMsg.rsp --- temporalio-1.3.0/vendor/ring-0.16.20/third_party/NIST/SHAVS/SHA384ShortMsg.rsp 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/third_party/NIST/SHAVS/SHA384ShortMsg.rsp 1970-01-01 00:00:00.000000000 +0000 @@ -1,523 +0,0 @@ -# CAVS 11.0 -# "SHA-384 ShortMsg" information -# SHA-384 tests are configured for BYTE oriented implementations -# Generated on Tue Mar 15 08:23:39 2011 - -[L = 48] - -Len = 0 -Msg = 00 -MD = 38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b - -Len = 8 -Msg = c5 -MD = b52b72da75d0666379e20f9b4a79c33a329a01f06a2fb7865c9062a28c1de860ba432edfd86b4cb1cb8a75b46076e3b1 - -Len = 16 -Msg = 6ece -MD = 53d4773da50d8be4145d8f3a7098ff3691a554a29ae6f652cc7121eb8bc96fd2210e06ae2fa2a36c4b3b3497341e70f0 - -Len = 24 -Msg = 1fa4d5 -MD = e4ca4663dff189541cd026dcc056626419028774666f5b379b99f4887c7237bdbd3bea46d5388be0efc2d4b7989ab2c4 - -Len = 32 -Msg = 50e3853d -MD = 936a3c3991716ba4c413bc03de20f5ce1c63703b3a5bdb6ab558c9ff70d537e46eb4a15d9f2c85e68d8678de5682695e - -Len = 40 -Msg = 4b5fab61e0 -MD = fb390aa5b70b068a54d6d5127df6a6227becc4d6f891fd3f6068b917a883c9b66f318fddb6384d10be8c7af0d3132f03 - -Len = 48 -Msg = dad95a4b4d37 -MD = 3a2b40f453925bc3ce17d640757ee0e899390b4a8d984d0297c1bae6b60b9f2603bf71c323fd171011372335e5702e40 - -Len = 56 -Msg = 121835fe3700b7 -MD = 7bd06a94acba7beb3c5a9b9e8769c3da6691c482d78b1e5c7619b36630eba4e596d11c410a4c87006f4716b6f17bb9a0 - -Len = 64 -Msg = de60275bdafce4b1 -MD = a3d861d866c1362423eb21c6bec8e44b74ce993c55baa2b6640567560ebecdaeda07183dbbbd95e0f522caee5ddbdaf0 - -Len = 72 -Msg = 8d45a55d5ce1f928e6 -MD = de76683575a050e2eb5ef95ee201f82416478a1d14bf3d96d1fd4efd52b1a28fed8dfee1830070001dc102a21f761d20 - -Len = 80 -Msg = 5c7dde9b3894d73cefe1 -MD = f31b22115fa7178e78223e06aae870547ab93c6eb3c3910b0ee16e6106db55935d6c0eb820132a2078ece1067efc81c3 - -Len = 88 -Msg = 967fa34c07e4945a77051a -MD = f8f24d81c4f8f23ecb42d76ed5d2b34c9cbc1f0a97234d1114804b5999759f3131c741d5768cc928163503c5f55f594b - -Len = 96 -Msg = 2209112ee779bf6d95711105 -MD = 09c54bf533a26c7447caa5783db2ec7ef5e55752da7f2a2c4e360982a94ec1ca2cb6a157d34eed28de978b4145e17ebc - -Len = 104 -Msg = 20442e1c3f3c88919c39978b78 -MD = 50bc95b036e0f54d833032a80d45c2ac38b3d29e9c7f72a2eb14781e9241d2a4b8e8dba6ee6f4c9e46a758d5712dbd39 - -Len = 112 -Msg = 4d43702be4f0530319555d7f1a33 -MD = 83c8f0bb762801eb26cc5115abebb657c18ff811de500b32b7a568a220a287e900b6c75224fe7429169fbd534cb588e1 - -Len = 120 -Msg = 5e2a79a544af85f150f7a9d209fd44 -MD = 8051ebc9cabb052cabe07e4023e2140808b77d25b07b96d2e3c22393f71b116c1a1e41bf62e57f73ff67871da7c93cf9 - -Len = 128 -Msg = e1bb967b5d379a4aa39050274d09bd93 -MD = 3b04f96965ad2fbabd4df25d5d8c95589d069c312ee48539090b2d7b495d2446c31eb2b8f8ffb3012bdce065323d9f48 - -Len = 136 -Msg = bb84a014cd17cc232c98ae8b0709917e9d -MD = 85227ae057f2082adf178cae996449100b6a3119e4c415a99e25be6ef20ba8c0eae818d60f71c5c83ff2d4c59aa75263 - -Len = 144 -Msg = c3411a0592f1f4fa698815238997db356418 -MD = 233ac44170d9f452a1a0231622030b15c104ff8ecaa3fccdb9e9e5031fd5b4220186a8edd032849c8b93dc183a5c8627 - -Len = 152 -Msg = e831b739e8eb9f787f63c0bb071ddcc9f44cab -MD = 91722d4b7aecc211bb8a5480c6855f3b71be4647e1dde0380c23afaa03f45c642606a24506e0317bf51506a483de28ac - -Len = 160 -Msg = b8a7bbccde46e85f1223237d9353b78c3b19727b -MD = 28ba69dc05e6e29de91924114d6c9fc7612f6d2a68b07fa001df059bcf98f7aa85389caeb966eaa299c79fe1fd1e40e3 - -Len = 168 -Msg = cf391b8aabec6f81288c8b7b92843be23d2e847574 -MD = 121e5ef697df491a53d7bae121416aa653d759a37db9d0b993031b18a0ef160ed98842a291e1ba2cea8b998bc5eee0b1 - -Len = 176 -Msg = 9d65d88bffed764c286f34894f991600d1a67d622382 -MD = 84b6e0d6a45329daf47a793418ed5dbde01336b4b9468bb69e5da61c42b691e6794e6ed0e8fb1b8e7d4cd3cbaadc520a - -Len = 184 -Msg = bab6ea46fb717f73f0628132a2b96be383774f1e5d8b6d -MD = e969aca1b50e928cad29a0d756457f6de8d7a4e589fd41e53a1e758c3b20f9b81b36bf098a49102fbf869651ca9a98b5 - -Len = 192 -Msg = 8853b00e869764adb527a07b073c85a24e6c208ba47eef4e -MD = 09ad44e85ac190e2d1c3ceb4efbea10ded34d0de961fe4ee268132c48e38660e6cf585bfffb8f7b00b0fad1514312b63 - -Len = 200 -Msg = 71fe1ba5d299495d2a56039c64032ec6263d437f55e3f5bedb -MD = b41a5d3b4af6d4b9c349e0788538e9a0311086894df7b72cf5aaf4091a7e039e4e89cc77a123474e6d1bac438e5e9f88 - -Len = 208 -Msg = 4ebe07d03c93e849b4bbfe9f2d2294bf6ccab457f76d3f99cb64 -MD = beba464d7065185587fad89bfcea9635bf0ab775c3eb8c147b5b2bd8601db6dba0590b50dd1068733f20dc68e004a090 - -Len = 216 -Msg = 918ac0a97ec1632908489e5242ba284bc811aa7197242cf7226fcd -MD = c4baf6397a4c6e26492b63a4aab7dffdd0051d8f51938ac24cfd8dae2f7afed1a4aa2430d7aeb0be2a72b21a6c50198c - -Len = 224 -Msg = 97477f7272d8a89e38e796c533e9f8a8ae4c92ccaa5d907ed26a1a15 -MD = d1ad524ebe908d7c5aff50e6cb780fd3a70e87c914a36b93c4e35f5b2cb03850b122b480ef8587d4a44f22467f4c480c - -Len = 232 -Msg = 718e0cfe1386cb1421b4799b15788b862bf03a8072bb30d02303888032 -MD = 6d8b8a5bc7ea365ea07f11d3b12e95872a9633684752495cc431636caf1b273a35321044af31c974d8575d38711f56c6 - -Len = 240 -Msg = d3b07f0fd5d4cd3188aead8dc8338de42056e2e8487eca51ec37ef2daf27 -MD = adcc2e954c91db3db2d71d0dee1f030e723bee1a23816fe003ac5dc862a0872ef51ff386c18be6ebcaa493f32d1195b9 - -Len = 248 -Msg = 695b9efe1809abd5d44eae957ddf9c2cd3c75fae2f522855712a07c639c0b9 -MD = 3bb95d164d94595a1187f77fc26c280ffbb08e74ec7947aa3e5b38bec7c6f8115c4d880788c2402dbb3e5b94afd130ee - -Len = 256 -Msg = be01e520e69f04174ccf95455b1c81445298264d9adc4958574a52843d95b8ba -MD = c5cf54b8e3105b1c7bf7a43754d915b0947f28b6dc94a019182929b5c848e11441c9e4e90c7449f4c3cd12954f0f5d99 - -Len = 264 -Msg = 98ef7301f957d73d4e821d5873e8a9b5970fbd219d5cf74ec2291b8381181391b4 -MD = b2564bbb159c3aeadbae0e4a4437f7c5111020e9ad0f4eb508147a961ac22a01e1a26df046b14ee5e8a49d9ed22b8cd1 - -Len = 272 -Msg = 873ba7f8b71517ec50297b21cf94cdb7a58abbb8829206f0d3f328ff8a6939ac1d1d -MD = 7405fdd557d2b5d4f65e9e85f508d3791495f1820d37cabfc8dbb74d7b41df8613d995c612d378dd88337e00951d0280 - -Len = 280 -Msg = e3bd4bc3a60cddd26c20aa86364bd44f4a07f3302825ad0ac127881de4eafbccf988cb -MD = 199d5423a0e26438f4cea0081a89e0b6c84ca93f7c3120c8104b51c6edc04e0f6a203bb77d59973a7411a0efbe93a09d - -Len = 288 -Msg = 8716e4b86deff9da2a8ed55baa43582a7586ec9cd38ac3a933156158cd8e5b7887585e91 -MD = 0d2306d9c0a8ce57bc7869b439376c07ce352a41d86ab6cf4a5654cccd5c724fe1b62b2c1101c986222f5264ab3fdd66 - -Len = 296 -Msg = f8a503aaa25ef2cea25e31930c3a90db468cd3a862f4a93aab5de2777e82dc905cb03ee23c -MD = 773ee958fe93dfd1b73af24d27ddce33144a9249d5a671682a56df30d0bbf92b9327130022075185d396de752959304f - -Len = 304 -Msg = 669025175ea917cdd7a71ff4ec0c45bf1246d2a6f031c00b71de701e17939bfe92128b21911e -MD = 9ff6be3f02c7c5d0206f4b944c0843cb68bea8f9b7c8cc0b729503db5005c7cd5cb14e3457d8f5eabf733fca9084f16b - -Len = 312 -Msg = b35fb2262edfa14938a0fba03eb2a25d377974b11f556491a781d0ba2b3c0ff3e42749925fef8b -MD = 835b05a4bf00c2594c3c8c13da6c273a0d9efdea0da72b71b19d326bf5ce968c2e577a7d99fc0f985afd23b46423129d - -Len = 320 -Msg = 9d86b45df8d7dae0cf6b0bc208666ee1163a39e6116d6d240c9dc1c3a3c1db1dd3b1c6680fe9a196 -MD = a84c469c24696f81d7df4ee8cd76aa584f8c9960eaa9908d3e3ebc5eea7d0b50afdded39deb94fd59323a21a6539e93f - -Len = 328 -Msg = 414f5619f6dfd45853bbabd224cc305d77350ad253358910a74f3a4381a9b86680b3c4068c089849c4 -MD = 848d481e3bbf5dd726f625cf6a444d995b36262c9f80d583b77accf1707e3f49bb3dc480a560694d769aa1ce65d69428 - -Len = 336 -Msg = e2658324821ae7b0faa0cdd63ee9efb9fcbe82092d04696feb3da92c82521dfdc98f6b41b3ef365d219a -MD = 3ea5d0799f1a4dcab9149a40ab74bec9c8d76d8e392c1e63e080ddec2ec535f80be9f00927be281ec97ac0c882bb0bbf - -Len = 344 -Msg = 7e80271bb5f2cc7ddae4158658e4e8d06e04a39385da0ecac1cb8e91d68a9bd21ddb7320e79d10e3110758 -MD = fa00bc0359a642dcb3559656094eb2fd4f63bc57f0d34abff26df5c54cc63dbeb4eac75905296e7fb69f871e134083f6 - -Len = 352 -Msg = 43d2828e86f7856b78c66cfa3d602387c290975afd021a8b76af0918069cac35dec45de3cc52edc4ba14432e -MD = 6c9e367e066032ce47ba2575565932002cc786f533c5551656abfe7391e7dcb5f9d9e047adace23d32f8acedfd0cafc5 - -Len = 360 -Msg = 3f49bb645cced7530b8b82e6cf07fbf670f7ef0ba0583d16debafc639bdfbfc99b8417249f7f5a05410aa3a71f -MD = 2b301a14647a67429cc3e7da02c4093a739640f7b47a305251d2855e75e09e60e262b279a073077d1fb6d0f04788f2b8 - -Len = 368 -Msg = 31aac06a59b74bf478617c1637fa6c5593df168b8d58b1e923bf3e3d80e55d7170b16454160ab29ee1f7412ebc05 -MD = ddd245c9b29ceac60506fb6bd6e8037889cb73d6ecc669fd129060a8a8f58971ac572d3ec9b44404f81381d0fd35a649 - -Len = 376 -Msg = c10b2852054d8034e07906c7fce3ce99402321a648bb881f13fb276afc224c6aecc64800cd767ed2429db94b95a9c3 -MD = a44640fb4ce6dfd4a10290a0aecdb453054a9b54f2583e97bb7dc2b005e5fa2b4fda17b1f75902f51c18c0caad35833c - -Len = 384 -Msg = b1eeef324b499f19eba322215fe3ce19c9f000b698d2b2dab7145015046cc86d049ee15ad59dcd1564f30112e06444cb -MD = 38742d18bfa6e918b888d68d1034e61f65dec0759172c2dbf08cf1e132b217eaf4ec29e15db7f4b07e08a70cc5662012 - -Len = 392 -Msg = 790dbba09965c9774dd60a32e010c50d6d518968a220141dc33e7410f2da6c08ad0419bd9864d5327d2c5c44914b2e83f9 -MD = 9174958bc8f4ed4731eced999bea2f63032f52bc8c46bcd903232f3fbc5046f0d6c203d43a078b822fc05101404f2635 - -Len = 400 -Msg = f7b577f1396b23c27eb637e53d3d92460270b001cc612fd3b4d68bcdd09c2d50571ea4350636324cc2428a087e7bd8785f82 -MD = 80afe111e44ad9aff9e39c4cf9e6b4c520072b4550e62b1740160a04f8d530612dc098917a556b44977d0e73df518bee - -Len = 408 -Msg = 7370d9b453936955b9c9d336f4b283237986232de007bf412fb426ff5b4093c80c428c19a12e0b187484dc6d5f4746537fb1ed -MD = 6cd29159820d34e5706dd867e6363758d312660d4daca8d2abf677f234746e97a0a6224eb054066a0b74e18c70965368 - -Len = 416 -Msg = e8620170f0f39328bdf8888148cfd17730f314ea68d8fea02d16d98a3cca61484139d3ee92b748091dc841dda08483f1184025ce -MD = 29c408a6a5045f397b56dfb5292c7c16028c63f068e699b86a891ff8501208ec9398dbaf463c00f39af7b2cbe45bac15 - -Len = 424 -Msg = 75d4216bad77943bfe82be216157843b0da0fd16eeee847153a00b43e707b2ffe2c898168081f0bdb3af58f214cf67b920c385aca1 -MD = 0170357385a20865a8d30c2df39406903ff88c7f70fa1a7a5aaa86711d64046c432a1b139668ae5abed637d1dc4107b7 - -Len = 432 -Msg = 2fa90c2210e3096caed122b74eb9559977120e5d9a97eeb3f99bcba6c19cf8cf791ac6c8a0a94ae49246611dace7f24eb05673a36b3e -MD = 6c2ced3fae94dbd92f4170b63f1ff6fcd8194f60937b22b4f3c95fc9e104b77148f9bc6c16a890de86d9ef1554c96fa0 - -Len = 440 -Msg = a8de55170c6dc0d80de32f508bf49b7046aeea4b975a511b5ea3dc853bfa4b1e0138202d6785f6b3017914a86f824288d586dc0e8bc924 -MD = 2bc3b10c148200f7919b57afe1d7db773ffd235e04fec6897dd94f13ad9c437ef50900a40937f82a39daf2aa2b3dfd68 - -Len = 448 -Msg = accd9d05fb7ef3043470836137554af117440b3ccca7a280285494f90dfaea60dcbf40b230271932cd3875b1d3dca60d38865ff874180efa -MD = b9e02df93e9254180d6a15288d77088b5a5ce517644109b4e2532be315f08dee43491608a1127dcdf69397406e23d231 - -Len = 456 -Msg = 32b835c180cc4006c11a61c65b03c099510e1d4f0a94b63d54bd6bd5a8ab207ab0f4639206564edc3fa6af03280a67744f68106dc51ee35723 -MD = df97a1c5dda6f9dde749f213e429db84f0dcd481d43bf58e6142968d629ecf05b262830a7dac87f67f4383975f3e821d - -Len = 464 -Msg = 9409f9efadbf190b253367629f8f368c9d5ac262e94ab86f3559f9a1fe1a9b44b64e313121b34d43001c430bedc62fc586ea398acd8f17c7cfa2 -MD = e1a69388ee6b6d234108ec29402cd0afd74957d990c7bdb544cf11e8eb2ccd170b6b5a74431be70364d7a31b926ff53c - -Len = 472 -Msg = 289586baf8daced50db14c936529a0a6438eb5da8d3d469172b6a06f4ff3a956d4f9219563ac285cb8e70074cfcc152c02593a97733c36f4a9e97f -MD = 509e996c1e11611c243021b8b78f2ad90c5a9263bbf35910db7c8ec102aa7c518066fff8ce88562fec2cd6dfe04056ae - -Len = 480 -Msg = 156530cd6ed3baf1fd7232c7ff204f3c7d4d106016afa3bdff3786e84843ec556115626fdc84b2e874f1074e4f7d53e08079ee9fd01f80a8be7f20c0 -MD = 7b8a598029ca0ed475a72c0644ac81c63d72fd51305dada07b0ab4a29e47422f59e12643179269ca3d7d10446b372b2c - -Len = 488 -Msg = 30655a6b5a5965db992e7248d24141055e988d726abb8e729dc5c21ffcbaedbc0b1b5fea35b8751f6ec6625517312fff2234014176269b60959723787c -MD = cfaf443e95deeb3cc1910771a2c0692a54b18b3633dc5414e71ae08877f0804818f67f7196c52e26b762dd12bb7a86ca - -Len = 496 -Msg = 345c3c022e20144e135604078762ef5c8a8f038cf1b1d6a91709b59dd068396a9e971ab628f74886e765384a23607c1a1e6e973f8fbb0ff55104c46f5db3 -MD = bfb1d5ee3a0b629058ecc521c706c2f9241c48cda3dcfdba660a2601d832a7a872a2bb840f3b98d21c37e28f9041a5b2 - -Len = 504 -Msg = 0b94a0f43a92408963a59ded01a9338283a6ff1bfbacd9051a0104445c7f041e8037afde3b5a87d22d5a4796144cbc944091d6cc47b5ffd1f997ab1496ca31 -MD = 07a045c9590e9901d0598e604c4649554a823de996fa438cc81a634344eeb98e5f3c0c234ba30e2285a4d7ab568f2610 - -Len = 512 -Msg = 93035d3a13ae1b06dd033e764aca0124961da79c366c6c756bc4bcc11850a3a8d120854f34290fff7c8d6d83531dbdd1e81cc4ed4246e00bd4113ef451334daa -MD = 8d46cc84b6c2deb206aa5c861798798751a26ee74b1daf3a557c41aebd65adc027559f7cd92b255b374c83bd55568b45 - -Len = 520 -Msg = bfb94dfbe0d9a509b78d164a722050054dad91c9a8e260545d037eb450321aac48ed4459fdd8a41572bd6c9c84d18b6ec339247482cc3ee52a1bbd6bd4ae918216 -MD = 13af0be02986ea3176e8c65534ec9f32c23b53c93a73b15c26b9ecbd8a1181ae184a372e9f5e0596cd6606849aeae8e0 - -Len = 528 -Msg = 1c8924a16fa7c602aff5ee961798bd44fe53798bf44c3d6b0d13ef837de07377651c1e94ed236eb79349f86ac31ba151a7e711c5407e65beb63824f6ec39754b58f3 -MD = 5be6482851ddafde582f2804071a702ae39bacb688741b7c37bbae99821ce4d3f47d5b097fd8eefa0ef9248a34f5d3ce - -Len = 536 -Msg = 184215145da49db417e8bdd573d6282de073e674c3dea86b6c78591d4947f5655a9d9eb0e5f4ed046b1d8642da9aefa80448a299504160a1b000c9b4d3c62ab69b3d96 -MD = 8995cd7fc0956e124075440686beece17a6256b282e7988a0c998f790e3995c974383179893477bcc32d1f114129b496 - -Len = 544 -Msg = ca7a63adf41f4da33142910c967706b5c8a093350eb3e6d3aabe69a46a2872f47a39bbe77cdc1160daa450225b0e8e36f506978ce3ac9ae5f75721ef30da46b28f07242c -MD = b89cc12b11e3afa58908580c47b25407abbf584f8e8d4b5631e9f450464c7e53cfd7e9f9d3cf35e587a6f02957ce4c28 - -Len = 552 -Msg = 1da41a0af202b079521deb6109e312c2ade48544d2b498c07e91a102dd4650ce354f3f201b3ecab8e85e21d667959b43d08f4e90fa18dca2ccca8f6ff5e9a902dc8bf5c5da -MD = 5c297e20c307aab7f325939fd4e2883b034fd547f1dd17fb6b97ade8b148e06ebbf3ff60cbf469e4933d5f48f0166cb7 - -Len = 560 -Msg = dece42c8849be40c78b8de6da96c2a8d7e940545b9f3f39aa1ca03ec60a85471aa84d8e29f095874f331b90a4c157da9eb048d2c8fd235399672707366c766f10bb833f02183 -MD = bb509e33e9ffcc4c01233146226ee9364cdac5658132460a76edf617a035b197c86434ee889438581458102618769382 - -Len = 568 -Msg = 952008ebdedd480449bb96a025576c5f617bbb8307958a010767e0d736ffe5a196ea4467d8a5d3ba1f5476ff07b6410ae659dcef520a2c14e3902f8b399a289f41f5fdadb502dd -MD = 9b63d9145bc714a8253dcdb8341b2f5714eb58b9d4b22ce45aae07f51297a3dc9c5b691a8a3cd438dc5bd18be400af21 - -Len = 576 -Msg = 100132c315bfc9c4fb93023f5d3500d7208a68acb4d2c63096232c361a161c4c67c0a74bc3e4d72c11664b1d970321d405401924b3a0f6ce2b1a2899e7caa9a55ce725fc37f55d6a -MD = b6ca04467ed3e623dba36f2e0248cefbe134cf555fdc14731175eaaf08e244ab0b15fca2f173a0ec98feaf359fb84a11 - -Len = 584 -Msg = 99cba4019f5478789e674e08fe5d6ceadd698b0757ca39c605457c22c3d3b8ffb797d2be8f12960f099a5606b908d47207b2636a779948282de3661bb08b1b37ee576590800a492730 -MD = e5378c7c251ae96f0359a30b3134fd77d61d0db68c42a1a2aac293195a596df42f677e6cb98abec90d6722baac63fc86 - -Len = 592 -Msg = bb327a0bcb2574df47080e8c0d8a45ee1c0424ae0414dc0a9b8717d9f27d8ac987c7c9ecbc946073884d1fb96dbdb583aa758186b16fa429dbf15b8d5bb48cca71469e7ce0ad8e7fa14d -MD = 0f75e65ff8494ae28d9a0a2e65959653275fc34b2fa27b9e10faafff07c45addef3b8f25953d5a2e54e31ebe6d429d26 - -Len = 600 -Msg = 7fd9eeb5ff368040d299fd17a943b21d65deb2eccf6128d18a33eb174693538935374c32c333a867821dba08636f20022c2ce01826c7b7e41640ad186f90ed0ac647d47086744867e5c54b -MD = 007251a2a577add048b1edc79d96c7df8fd5b5fa0d7264f122e4cb54c50bc316a8bc5f4f9dfd4469e29e9b030f563a6d - -Len = 608 -Msg = 7ca9e369e82186984d5fc729e111a7e5d8ec19c5d74e13b5ab22e4993b05c88ebba6ba72237389a6e0722e12c96c5d6a54515ab00ad80efb38665a76e831abab0fa5cf020807078441585de5 -MD = 3ee8c4184de9ceaecd0d3aea16271835f3d45c873358c93a515539c38e819414ea63b08d0a109346793d5e0f703125eb - -Len = 616 -Msg = 5b4d945d55dea22e37821ec396476a4bfb617d2f392ad93afe67bcfda9cd9b725bc4ccdf516a83fd71dbff5a22b005fc61c58e471240bd2193ce13539730e63232f70f80308be48dab7266a1dd -MD = df82d242e4cdc2eb40bf3db6a56e1aa0a66e553f1914bedc65c8cc6ad9564b6e85df59f4c443cbe4e0aee05986f7d690 - -Len = 624 -Msg = e865f4a42bbbd0b73fe275b8ab90d3a9fb74ec5070192d38f60efef9564498b9adb716f31d50cf77c20ae4b2e85515307bb8d95fbeb9ad964001ac550dbc60cf213fd8a522edfaf54e5b1b93b2b2 -MD = 091fa9ae2184e2268ef9ef23c7c809efad244536e00aa9e8b3a6c228d90e31da051b40f268a13bd6f62e69c91ae8cd2d - -Len = 632 -Msg = 1d408c7b68e168f41bb46f9b2e9c8b04f968e4080252546814cc1cb2917dd5690886a9600a09c2673aec0329a4daf655508b06fc1646ef3bb3a472191d964db214a96a96fa89576ce4c4f6dbf1d176 -MD = 7e23472c03431925f3b4559d886e8d5d837b3d39b8efe1b7a91e61a13810c4dbc2439634d7c6ababfc66e9b18e6541db - -Len = 640 -Msg = 54ae030a4e27a05c1ea4a12e69c67544af9b4044cf157dc8cebbe8b2d49f9bc0779077603c90c5c55b891d3ac33b87b65e79e1b19695813718191b3bd8b7e42d5583f7cf1e60f84495b8f869f3719969 -MD = cb65f823585773cb8802b6339182f13752a82864c898b445be5a11a969657ac2dc4a3bbeb87ac0abb232a2b124171096 - -Len = 648 -Msg = f73cd386f73d0c6ade05771b33117117c602e52693f05b47e90032eacc39295f9793258fe6512eeab291baa0be222e143295a28e8697e42fa27ec02b44217f32a1edae2f4f35213562ca37b6d6cc5ef72d -MD = f665c4d17a83d65a7ff16bfce279b58558250d76af68b8eb943753e411a57ceb31c1a131e54bcb7672584416e3d5719e - -Len = 656 -Msg = 1d259612e6867e7d788c71d03c5136864ad6d84f24eaf913a34e69333116f812395288d4dcee6665e6d7dabd005ffc6327e3ca305cab78569d1107a115e619fc90110436317925066726774d1da3639c31a6 -MD = 5dcf512e2b93d6ecdf7c3304534554ea79d22392e59bbe90df21e978c9fa3b34ff82e6dcfe8fe2236aa4af4e662e2a9d - -Len = 664 -Msg = da8734414c45fc1d5a75a3cbacadb1bfb523d6fc391f882d0db0eef21f9ffd78b6a1e14cfad09e71b65cf7b05d7e8f2f4bae4e454e16068d65465639c729cfa92738563d37edc9676b7be604ffbc68ec3b6b72 -MD = 8b328a31adf67dc7aeb864a359628410d5814a2f0cc683303f61432ce32177e1f538feead7e5000343916c7042f8b3cd - -Len = 672 -Msg = b228c75903d80fbc6d1cf629ff1d14a92ec4bf0e121fd97bd306ed265efe7a5d5c5d8fc764af98ed6f5978f88d7cd8bcd71cbef6a58261d201de3cb15b3161287e6a104cc2cf882d839f1da0d3f68b426cf08ab9 -MD = fc92ba4eac9a1bf120a7b6c2cc30335b9615b1a98e55d14854ff872966e71040737401c6bc08db5842ceace14cb7e7ea - -Len = 680 -Msg = c90d473a6fd30be9a98bf442a9ad65a697d4629c33cd517dbbed02710fa8ee991360bc8e557b0a0bf0b869e6b0c3a9457607580edec3859f2060c9c0340289d53a5d755918ca54876599045a86a9bcb8163795ea8c -MD = 807582b2520e990cfb74367343268b9148b2519b9e7cd9182edb3db9ae7afebedfe8ca118130e2ef9d31af9081da8222 - -Len = 688 -Msg = 6df8c5c28d1728975a0b766cd7de63bbe7f48c3db3e6fd5a4b8df6e3905cef0351f3d973b4f2a7eed80b0de5b85c877353fb9e930ad2679149ad4cbe69910e68d5500b096c5abdbf27d684fcfcf1a57f02769283d5a0 -MD = 7bda57d21a4434aada6758e282e612a4c0f41b242f9c790804d5bee25b81a821dc6f2a0ba56f1b3704802c9a6e153d85 - -Len = 696 -Msg = 2cfc76f88cb6fb90927b69526ad5f03d6bd335f4f75b52b6a3c21e8f989ab0d03acb1ebe07e68a87c1b5607acf17d976e10ac4a3d30a8561d49a5e7ec720edace9f5f632b4bd63e104f4894a79caad2e1c31c736453485 -MD = e16670ea837c259e418d3c0e1eaad4948c3457e15b1573056e24da25bff5c66b7e95d24c6bc1b8d6c2b812f64adc9553 - -Len = 704 -Msg = 3f05108c2f33d39b3aa9e73efbad4b011b4e9e9fba409b7611e7e03956b2f3e5e0aa86f68c4bfada5f9223a66d574b08f9dd797cdda8f3c32d8e01921711f4870dec676027ecc56fc2010b496e95cfbf071c820f21edf25b -MD = b272bab680f3ab27de72d94df384323f8555f1d17facd2588ac8648def2451f82f9b99c05ead8316fd181a2cfb97483a - -Len = 712 -Msg = 1ffbe1aff0a1e7fa3e68be31a74612a1519b59397e7007ef61fc015f316d55b57be528cebcc2f09a2f22e3c5e4a6ae9612776b17ae87cd763c1a9eabe6846c5bcb347ffc99f10e3b5e64b29a9bd71a5e9b3c01a802715de2a9 -MD = f08bda9d6762607519d53fecb0bffbfd3ff2924854833a759d631e910c42ca86741fc2e290af42e94b94898609b91390 - -Len = 720 -Msg = f755d6b5642378f2847893901d9aa91c54a4b7abb97c5c7184063e8f1e97aa2de4ad7ac927dd3cce770c906921e2d298f67cf9844e61bf104db803b265b86b821c5f4d901067d07b38764e3f6c95fd4f28e3cfe48d8a9694a8f3 -MD = f85e98ea054455242280854e97c4ed399b85ee7bc5c5fc3d62910a76f3a9600c3d904c832b70b58d7d998db8dc978135 - -Len = 728 -Msg = 773577f3a642c4f13b1cb1f4103e9f6b2da86268a52f449cbb174c8349e3c0dc636ce85c373115a337eee26f7b70ba1060a79a1c76fd186399e6a5255db80f83b0be4a34ba876f7908840553ead380f3195507729d067ac2ee8eb4 -MD = cc27869cd7e63695d19082446b068b77dde4e8604f8c0e9ce20a1b71aa9eff1460f32d5a54476275bdee8e7621491f46 - -Len = 736 -Msg = 651589927e17e1aef780690f3100a377f0179b18b31fd5b4418c84038573fc559b496a782beec3dcf6e9faf5aef676e10bbec34b1be5888fda49b91e02890d2524c5b369f8a54175f29dedf8156fff690cf186ec77104a798315033b -MD = da846042fb908eee5f5defd1055ff3e57103708278d379a8681f58bedc6ef89670b9f957c4e0edcaa42dfd8cd49df6ea - -Len = 744 -Msg = 678652600eee42580f73623412e9c011cc02dec4d4cc1b79b27b6f9939695bf2185b2012ab0630f317d2e2de95dd69890e430783e99d7ed121c7c8da9ae70780b5aabf9022d1435cf5ed6da6fc6692c050c2b5f22b24fb1cf9135f9cb2 -MD = 8a6ae41c9bccc16eac4860bd5fa91205a86fbfd09692578f7f36b3c135d96f9e9001c192dbeda975f7375bd43a23ba68 - -Len = 752 -Msg = 416d3fb7b401fa5e78cd96d479d8860df147eef03adf13fce1c61131fb89cc2ebc63289745bd7db9bef14571a55318496572dbe52b9b349ef59f406cecd68909f364325380bb75f3aa62503c84f47a55aa6b9c9b199ebe414409ff3964cd -MD = c5f20542e0c0ac1eb433de6229fe5baccfd4502e2c2275439385efda6374a1d0fc50cd9bba4233d470ad91a3356ea315 - -Len = 760 -Msg = 6f09e876c0b83c9934ffb777f006338c5142a31375e9b21cfea9a7de12998c4ea6708ff1fdf5a8ee6bb67c675ffd8209a10064e2d758a8734eb48f07f7cf3d43b09f1bfdc5d07a52b77079f23cec28bf863bed97c859276df7f7129fce71eb -MD = b3c968f3025f87dbd5cd3d364bf673e62827c35889532431becd87cfbe2cc75b7ef45696d19cd3452d0e7c2b69d09544 - -Len = 768 -Msg = 0dc2b226b3431c69a76addc018fcbda22bd72c8ff01ed6549596798bd950f361c489a09c95cee2dcfd6401208ae6368d6630026b417cc4718ccb8b42e8872937de66895fd09142c42f066bf0ef3ab2b03803a8185fb65fc7148c376ddd4bf58a -MD = aa645a4f8f602411260ace24d381f3f5dff0000c246343eb528e3dd027cd743815737906ac5c74ea83c2755e56b99509 - -Len = 776 -Msg = 8dc71c84c8772753c86ab6afd80e8d1df9b0d7e8d69ebe67fa883a82412c26738c3399cab95573b4d3c4367c85c81852d5a6564c0fc7caaafe16c05e62aa06cc9fa542ceb35c88fb6ab82c29d5dcd530f807d3f1c3bcb3974421101d1aa6ac112d -MD = 12239813097124e6248e7dbec985a6a25f622b1d07295cfcfbaff33b847df7fd94265e439fa535f3becbdb576922ac41 - -Len = 784 -Msg = 3df3edd9fc93be9960b5a632e2847b30b10187c8f83de5b45fcb2e3ed475569a8b2ed0784348f9dacce7b323c6b65071abd8b32d1022b1e12787bd4989d3c5ac329d576ccd7608dd336716532e9b4c7f825826fb2e343623ef85c6270619bf5e3b27 -MD = f36590f5211a9cf84eeb0a3b2e5dc1164e813191cda7cb883f3f4a074605ce6780cf2f1a105658706fbd2829db8a2a58 - -Len = 792 -Msg = ced0ec6500cb891e6433d104ba5b1c1ebca397f3a5eeeaa0f0561729621ea50d4ae7ff1d0827178dccd84e4ca06d9891a90adbb7a9f4994ac947cf6296e71d2f49b826d64b123a7bf86f339fa4679caddbdf19cfed7d0206aa5f527a6b0cc00f52aa2b -MD = c2c2d7d65d0b9108648e3233d15fc4e4cb62ed8fee9cdd18ab44b8486e2100fbe45ddcf74f46c15eb77fb1c893c12202 - -Len = 800 -Msg = afa4a2c4fbaffe838dd149c78ea7851ea9396304b41806a093a90aae59c0c5bdb170cc9a7d22b90cbce52cc1b105108942df20c29ef3a913223b915e7ebc98ef135adefaa0f0a6441ea05920e868ce9d1ff6c8fe4dbec06a4849e5e55ad0627f9e09dfcb -MD = cf6ef91d8567414f5c7f0b1f4ad09a976afc7c8327a382fca90f5a136b19be33100a664390a377f8d8a3015fb882125b - -Len = 808 -Msg = 00f65a485bfd381113d6e79bf9e0d5e518c891988c073ba198ac3a20f25c2c81619723e88a3c0ed3075075fbbafb6a7b61d3bc336a5e6d6f08d166c4861e6a3bdc2e49b2806b567e7e821a55cb674a6cd699f7dc61a7054a8ff3dec73eb667f59644346be2 -MD = 809c6b5d41da7cd10df90b02b193ac7d40cf2e46c139e9dbd208a988da2b25002cdbad1db2ecc1322da20b7d054e5fe6 - -Len = 816 -Msg = b9ce382e1e82a873cc444248a3008c2cf64d18759057abe8f91c9d87f5dc83aa4eca0c51d30829b9a1d2712da1fac31f52942d77c9f20c2bf6d3751028d7d4f0d336d3dc92b27ec368caa4444b3180c1e37e98b58f25e647a9a6361f0b04cf78d17955766168 -MD = 18cd10b3ea907b3770e8eb91c974666e2da2525afe7020b872b3ec6689e5e1cd0059dd4fd49ce44d75dc4c8430c322d6 - -Len = 824 -Msg = 6778d82f3a98eecdfac55ddeebc52476a070094fbd65831801fdd60f837d80d23b90d472c5f4e5ca6273a50f40154ea8fb94013f6310ad18800433a1d379c84bdf799a99e8c7b676fbcd29cc2ed66552297de7a6e565179bb42b70d48299e0925a1d72ca2c792a -MD = 71f08d9333df5cb885fd23d6cbb1db84f9b55908d069df50fa4795cc713a18439bcab8daca078356f5c75a619f2f8782 - -Len = 832 -Msg = ba3a54a77d7c2b8ccec6d53136cd48827c87acdd1cd86ad1f56e862642ea2e1dcb4093f85d60f7bd77160738462e6c3fd3dd9d3a7c5cf7e2a1d60f489f84471902179f21f656ce0fff089278ea14441e04e7af71891622565f44c428044728fcc686212a32a5d809 -MD = 3cc154f0542d8e3cacf9d79f231416816178a7ef2275fb257a48a2f763ffa2e15a33c27b970a416a057925aa0412d268 - -Len = 840 -Msg = 7eec4f4f491b4eeaeb1cdbdb95e9511c2872372bf64a1f61cda1cd8032729c8beafd1edabf78036d80023c814ad8606106cb4e7f33f214c3e69c0f230e885474fd594f7f2444aa581e0c70ebf13073d89063eb81a43c5f608b2fc99fa1bcf5e2bfe62a6802e70c52ce -MD = 2f8c5682a07438043e55f0b7759fe7eea5d9bdfc8b0f89800ebcf777bc05a941ea7f3cac45d4659de0f505d814590b6b - -Len = 848 -Msg = f3715b9e3ddd7862e15ee87aa23f1aaa0580591e55cff3fee9b49b42aa0c0cc8cfb8efa3eb96ffb72ab06b83d7b47b3d22a5772421cfc51214005150edf532af10138ad45758add459908601eccc3703e810002a2e4c6202e98d84281475d55d3de9f3d98809cce1f665 -MD = 04e7d55b0eb4bc3d3a21cfd2941dbb4dc44706588967186b40da54902aeea97b262c97f75e37ebe3cd60a804e7b9feca - -Len = 856 -Msg = dfd7d792e162bf7a889109550a0fc4c415232af0c0d72dcbc2595299e1a1c2aeae549f7970e994c15e0ab02f113d740d38c32a4d8ec079cd099d37d954ab7ef2800902cdf7c7a19fb14b3c98aaf4c6ad93fe9a9bc7a61229828e55ad4d6270d1bdbca9975d450f9be91e56 -MD = 08e5ef57d0c2aa23edfc75cfae39e6bc1a43b5db08b2e27bc9823114edf760367db9cf3cd9c3779755f6d39e219b7079 - -Len = 864 -Msg = ffbc7c47f52e69f5c667f4ed578b46ff4592048f789081f3fb39321d0aa4627a6d4f261905649410a53a301c231fa787ae55c04f615a8f84196cecf2844d23007b44edd892649fc8ed10a2e855bf23fe8afd0b9edbb33296f5a7cf89f94634d9d1a2b8cac3b7f4e546f2329b -MD = be10c7baf94608408a0accfbc8ce95e159d08d8ca75dd6c273f935947a7ec3463e10a58d3ceaa0b2198b0887a3a24a29 - -Len = 872 -Msg = a39f202d866e8e96765fbb53b6772537dec043322f4a7475247036d7495c987850cef2a46218d3fab36e3bcd595c0aca5e98b9db14fa484ca8c9772dfa3839f7ac3066727a50b0d5c933d82f82f1220720e8063f08bc283f199c8a4f85c70043df4fe55e751d0d71df36fa43d8 -MD = 3b2664ccb555a1b1f3ec996860146ea75ef7f3bd62028a19c26f63339399f4275a07f3c064d34766ebe8e4dd532f6629 - -Len = 880 -Msg = b2c8261853e2218dfa135cb5387810352b8962e94e9fdc8695b41e7dba6ad122d14fdd0d2360dcc039ccce8b37fa0ead6ccc85bc26261d47cbaa78b925c6e380fef1856fed31dc616fe16b2039b1ac85cdee4ce04c0497998b41321868db08e35f358606585e0bb8c3da9a3be7a6 -MD = 45b286f49fd05c45c921b7bfdbe2cb024441c372e07394dcccae0de834cd541f13a79dbb3e5078896e88438542bd2f12 - -Len = 888 -Msg = a04f390a9cc2effad05db80d9076a8d4b6cc8bba97b27b423670b290b8e69c2b187230011c1481ac88d090f39154659494db5e410851c6e8b2b8a93717cae76037e0881978124fe7e1a0929d8891491f4e99646cc94062dc82411fa66130eda46560e75b98048236439465125e737b -MD = e7089d72945cef851e689b4409cfb63d135f0b5cdfb0dac6c3a292dd70371ab4b79da1997d7992906ac7213502662920 - -Len = 896 -Msg = f419494c3c6d0727b3395a483a2167182a7252f4fd099c2d4b71b053f94bb8b3adf3b51e8460cfec084ce9415c95798fbae4975c208c544645b54c44d2b97f2ecfce5c805be61f5ba1d35dcc07afdd51a87baa990506668cf710e18be9b0ebf943f366fa29c69f7a6616de72a3353b66 -MD = aead8688c58c6ba4e9cadb4756b465dce0fb06f1cfaa478197f2ea89414e47e9572034adfed160703c79b82b3fd7ab78 - -Len = 904 -Msg = aaf7584d53006cbf2d2040e51b7feebd2bbf1e9f6d817cd8062a6a9680e7f10464eefeb50b07cb46b14b9b3fcb2caa3b9ab664490115d5919456613bf172b58c5388fd52646a5783535b88212717ef605314b70b8a085024d4ab1fcbe2be74609e4cbdec0730fabd3cd77151d647a3767b -MD = e6e79d8c61d0ea9fc70dd4dec1fa432849c3396e717b170badbd87a4c7974efc590ab8c1183a6232beff14534f004b02 - -Len = 912 -Msg = a467f77369730201f2812204fd63ad0d2757be580d937dfeb221a06b21ed3213531d936152a0c1f09f0ad5fed19fd11e80ad982c61203e86b2508279d91d99fa483e2e97a3d6a6ad2548a8da404dddb58344f4bdc1c9ea907088885e4f532d9c4c73cdfda43c3a9e4ce5a2809096593cfac1 -MD = 5a7508c2cc096bf65a4d4d337aea22008edb9a3bae869f94e09fb526a52c3368e9b28576fb950f078b7e43b5562120e6 - -Len = 920 -Msg = 01abc90e9180fc9bb8ea67a405073ed6848bf33048076566476c55836bcb19d3e55e9400c5cc657bc7a95f1d703c390f5a8687e7cd7fe9138ea3837bfcadad6258a3eb8d65121fa8319bfde532aec0e694961bddd2b673f284124be5781100f40381b6ff99db92ea9cc82a4372e53924dac398 -MD = 96b209d7cb2c2033b38350744767fa5c253e1bfdb99fe8418bff83804df02248140fe3b77b0bfd4a79b51f70405a434b - -Len = 928 -Msg = b555d99056362bfc2bac2a1bbb71ba112d644e50b82b015e5a1ce3d9cd5e90b8b74b08d32119baa62abae251fc0015e400051ada4ecafce3681e5de727c20d47f5cadc663d46ac682022ca396a4b7ed1c413e0b72bd7eec4a0dfdc2a2185abb5d99afd50940528ca75ad89daeb9a1b61e15747f0 -MD = abd39f79d72c6cd2e8e130f3603032fe3cef4177c3563930096df1f10b87e79cd4e2059cf1b9f8252184bb26f659a5da - -Len = 936 -Msg = 14fb01ae9d6015ecb3e56d6ecdfa4bc0533186adf8457f5e4a5c57c687895f3db395d06ae7ffbd67ec41452009550dfc1878eec0df2eeab09e8665f7e59f9148a86b2bc695b36521a55b2302f2e869aac83f14d6feafc9e587322c3c44f052ea1c0578884f84f56307bc6dde31ba48118a0f62b6fd -MD = fc9b9a95a8ce1c157720cb63101a7594df24f4cc74baf735b0ccf6abb925478ad507cd048d30cde1c788806f43ed3a81 - -Len = 944 -Msg = 11ae0cbfee7bb3df90ce585f09b9cf8ff5bea69a68eeb6c22553f8ed118c9a61e7b752cc2c94f38766e63e1b891dfa05b23347b617d42fde3ec17eea6e76d3cb640bf8fa46586fb9dd5c4d9bfee04c4649571b781709f848ad7081afb6e2c746f071a551251050fd5df72ee65248ecdc24f2cbe74ed5 -MD = 3214b5feec925059149fa852e3ae285a6eb377df926504e2f824572a3aebd2050a20144e7bede7e7fe238ee83e69f72c - -Len = 952 -Msg = a5c4a47a04f4714269d5d922ba4694060aa2df49193720c819fac93bb8787ec55a107ac9a6602f0045fd2cc8e66744bf863ced91eeabe60e7d2c1d80276ecf3bbe91f1757096cf589214f3569c2c48bd74be7f8befddb28395814780a47c180a58b0d0276a7e9873d682f473e27de7275c925ede23b6cc -MD = 6bd9e1303579d815f58e8c6c9855850133251778a632f7b312c4b3163b29b5ef6cb9511a08a31a237d9a7604afbfa056 - -Len = 960 -Msg = 75264774af69ec7ee3125e205bd6d1cb8fdb22f7ea6dbe72d1f2c0f7e2205902796d75e379c79b11498615c21c9f52b8761a885eecc69d132b2b48c63bc074c3055ee5cc13f51d6c987e8188b030b837e8f754d40122b451f15b28cd2bdd576920e1de5806593a36d8e1e89b9ef3caefee5acd80b3e9c9d1 -MD = ffa9e4e856d06227c1ccb959be558309cc10633173f4b66ceb382923b52b9150acfb08a7393500477a6ee4425a827e76 - -Len = 968 -Msg = 791a36d748695e62db5003a8ad367df1f051c1ac6a21d711823e8e069b546e3fa06ceeaae06de70a1de249e1dffd0d940edc6acac00c4c15504c02d4b0933658005423455f00023b01cdc5b681b6083379c24595518a47c654f5e1a10947df10c05a3d716b2a973faf98e1ee3b675816598bb8d4c2a3b06eb7 -MD = f8d33369680524ed6c6a716d4c502de3eac891f340f40e82e37501be1a90fb61d26e5daafe92bc6ef5ec0ae431168842 - -Len = 976 -Msg = 74cd86bbed14d895301d8a54b2956b1c5cd1451eebab620b978d4ecef2cbdf7a14367381f5ee79281a773337740fb9f5853f4253c4b19f684341081d8f561b2ad773224151099588da90e04dddd565f67596c536d64c5b87e9480ad43601397507ad1b61ca0e349fb88f19feb48f770676fd562ee8259f50d0c9 -MD = 73ee8d29c30821dcdfa4441639f037fb6ba3a9ca596dc43428043785756608f6207d80b7f78e573174fb9dfd42f0b8cd - -Len = 984 -Msg = 46612e1a4d016c41700a3b5ccb38323353bd8da5b9942c9c9212df40b4bee06be362a15dad62c8b2924d789168b2d325fe35bd5100e1e29f1ac0fa7a60a94c9eee5a70cccbc75ac214b1946a5679cb523b378d5c690751b7a7a3b80d413712feae7024ce71d6295a3d5d16515c3622a052eb862ebdab81ca7fe3a0 -MD = cac13a3784225be03d526f9abc1eb50a762e72c0e01172a15d578801089e5c9f26e53cc00ff755909453e2964d7df838 - -Len = 992 -Msg = 1a857c1f105d068ceab0b1e12494890ec196362a48b0200a0d75d712b18fb14bec6bb5b68a33b7e0b4fdc5b77142c29c6d9151b9f884f59551f476e5256986a653d4a468f28141ed954721f2cd02054df0438738194545ed70234173ac4988b7d62812de4f2feada14f68e3b41bc9948d4139f4fb4da5939f26c0261 -MD = b75d92b5cd3772846f7b68064a3567ae43e5010099f2b649f35087e7592aeec176646fc8c2629288944261cd35b5fcba - -Len = 1000 -Msg = 9d36818d0c5a008be7904d1917aa3eccb5ef4f38cecb8c4e63c4b2e9b4b091a3bf25b4ed0332445f894c2a4c258b749afa17fad03cdd41713a869f899ba9a085e73fa9474a58db7a950d3a2386b60f79495d8bf73e72acaffdbf65e1989ff9cc206ba8c46a368d8512bac7c7c191d713aca949d45df297b1b6594a1a33 -MD = a88da844579f3e3725d00daa8e1e287da4bfbb2d931ebe8d3b16021154be503341d6371d382ada744f86f5bbb56cdcfa - -Len = 1008 -Msg = 4ae50ed626ee60dc5ea556e3ce0d3c18b9e6225b5620814e8b9621acf8f939dd370ad9c7620d85e6d67a229f37f517d1b580acae8df0b5c9d29d756f6d5ebd3b63b554e556469b5b4f8e7113bad1559fb254ca827fcd00425d18b0be7f2b48c2544c48d90982ec624f490be65e893fa93ac9467f35a0a8e1b56d9a403748 -MD = f8cd943f429333c7c8d30a8576827f92c92ae18e0dbcae770601b79687bccf8c23e9e589dfeb45c3b9bcafdd545e45e7 - -Len = 1016 -Msg = dbed7612448d46cbe0a384d1c93233f02ffd1c984ba765299518656d3723b766c1658d4b1e7047cdc729459e366ef9349efc40cbd990f2a9a24db7a5045e1dea12dce8f9d9f2aaed933f93031e7b8959ac5e7bf6bbbdf30b48f7eb783f8fe292371a2f245c5c94b4acae160767a20ce7c0ea7723d97691d8eedda9efd1fe2d -MD = fb531a1ed181c732311e56f4b56ed91dcacc0dd6bf1eb4a44be6f87dd7cb1ef9dfb0310f4a79eaaa3f32bf3914d8624e - -Len = 1024 -Msg = 3bf52cc5ee86b9a0190f390a5c0366a560b557000dbe5115fd9ee11630a62769011575f15881198f227876e8fe685a6939bc8b89fd48a34ec5e71e131462b2886794dffa68ccc6d564733e67ffef25e627c6f4b5460796e3bce67bf58ca6e8e555bc916a8531697ac948b90dc8616f25101db90b50c3d3dbc9e21e42ff387187 -MD = 12b6cb35eda92ee37356ddee77781a17b3d90e563824a984faffc6fdd1693bd7626039635563cfc3b9a2b00f9c65eefd - diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/third_party/NIST/SHAVS/SHA512LongMsg.rsp temporalio-1.3.0/vendor/ring-0.16.20/third_party/NIST/SHAVS/SHA512LongMsg.rsp --- temporalio-1.3.0/vendor/ring-0.16.20/third_party/NIST/SHAVS/SHA512LongMsg.rsp 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/third_party/NIST/SHAVS/SHA512LongMsg.rsp 1970-01-01 00:00:00.000000000 +0000 @@ -1,519 +0,0 @@ -# CAVS 11.0 -# "SHA-512 LongMsg" information -# SHA-512 tests are configured for BYTE oriented implementations -# Generated on Tue Mar 15 08:23:50 2011 - -[L = 64] - -Len = 1816 -Msg = 4f05600950664d5190a2ebc29c9edb89c20079a4d3e6bc3b27d75e34e2fa3d02768502bd69790078598d5fcf3d6779bfed1284bbe5ad72fb456015181d9587d6e864c940564eaafb4f2fead4346ea09b6877d9340f6b82eb1515880872213da3ad88feba9f4f13817a71d6f90a1a17c43a15c038d988b5b29edffe2d6a062813cedbe852cde302b3e33b696846d2a8e36bd680efcc6cd3f9e9a4c1ae8cac10cc5244d131677140399176ed46700019a004a163806f7fa467fc4e17b4617bbd7641aaff7ff56396ba8c08a8be100b33a20b5daf134a2aefa5e1c3496770dcf6baa4f7bb -MD = a9db490c708cc72548d78635aa7da79bb253f945d710e5cb677a474efc7c65a2aab45bc7ca1113c8ce0f3c32e1399de9c459535e8816521ab714b2a6cd200525 - -Len = 2608 -Msg = d5e378ae9fc2648f4a13bbec4b0935afb4f822f5fe0d5063053d2fbd547b33b4a32e7a009ee2afafe83d2ebd603568e4a38189b5d24d59e8953260f15f654ed4f42f9a39299d68c3eb78b09e83779d5718b433f1765d35350eac46493d194e84d1ce1f81c95b59725cab8ab73d369ab01e7967cf73a3acf1789227ee75fdfb6e40f353ff0484486542be053115db2896bab86c774f8985c4dbcc4c078f7b1c3a4c867cdc6580fe44a598673494cc0fb1f6598b1295768a584041fdbd14fa7b90fa6fe33f71b743b68e23f8e7407217aad9440cc8cad28152aedb82388be2de165496d051b292de6303460273a43508296b6237c07804335d2e81229f7c9a0e7761e38a3aaf7799f40fe9cb00457ea9d5b59953232676681fc71b261a6f8cd359293f5b21f0cf3a11b7f49cb5adb3c357bed2aa185d8fe8408192d6d3ed1ff465b590892efe03 -MD = a70c75b9b1f0ac2ed2c2797763ac9a6601d95f46889b00fc3ddae4d0ac6923750a108d79eb764e77ac07b7cb5c01cb4b3747dcf69ba3b35c51fb995da2632e70 - -Len = 3400 -Msg = 4f7a5618870945b89f194e31b1aa802c5350326dc691df58708e34b48ce666b021d7c92330a69f1832412d8ac224156c9679dfedb383d9f9e13c21035d3d0002cfdf79b97ba0223cbbc833b0ad4cdd5229f2ddbbf6b650623d6cc9623da8a17d41db8e61cfbe772b23f4872adceb81e5f403535ff5f2ed996a67535994edf12a5f1230a494c946ed500e5280b5c8a82ddff369611afe58a85272e870cbd59a1012ce8509338a368b2c5dbb3ba2adfb33d30c494acca43896dbd8b030482841374055b81812c6f00c9e2bebe2096021feb69418a272aa356cefdfd22074ae91a8d2f1ef599a481c788dbe0afd54aac39672d401ef76d9f83175d177c9b72e2f6ab1e7525533d761d8e3603f14ea538904ed142abb3ff929ed55f4c6b17a72c685c3820b93463a67338756b2b033231a4f119cbb8d35d270a97791e8622340fc02f2093f9b393ad79161eb8c5897e21f7fc4b3ddeec02b736cc3ef04641c6179e825c319f6769f59fa5966f5957e573f9df0a2b76548cedd3e2158433dcb9de63f44f9be2b63319477570e14ee504b23b07cb2737a358154277912cd779abbeb1036f459c26ab7310f43 -MD = 713d5c26de17e1440a36aab93f7cd8111cd62fd8bea5099b2b6bf93e470e1eaeab8b925c646e9e67ce01b03b33d2b500b9400e59f0ecdfb00dd7ddcd230cc837 - -Len = 4192 -Msg = 5e0e84419c02ddda289aa126bdb40a060464aa58b88bad2708ab5f1e3df9ee439cb470e28eb627c6fe4904af033b6b01bf3536ba8748fca643c993d6185fd34e455a9dfe4b461cf451c04bcfc689b87748d9870bc5f6b91be004af18961fe90821a7147e1cdb44cae9aa7e6d50c579d068f9a535bbbc6deda506b9cbfd62b8daf744dc4b499d26b18dada371e7183773e73d991eb1c39f845b74bcd9964fc72a91d8fd4b1ab34a120771c4c2d4aa78ca8d4c6ab0ee32d748caf9bd29a90f9e61b50c8068d74638531d9fe84a5fa2c73c22cf20d1bc329ea1b93bc6a37ec9c5e82c886c89c77d79de98df18f0cf29a9316d6dc46b61eb7af7f1e2de2f5ca6c525bef3c996338194193fd85b9c6e66a81137cf5d652684f6b23b970eb58dce248232f6a0766379116edc33b93682824b45489cf3a75326973a5d025d1d57686d665238f8139f8e794435973aa754a41a33687d8f1930f8e7f71fcad34f039c2539e462d9542fe8520214ade7d52cf59e445f1a37a305236d524b977834d894d662b11b4b215aae27123f1dc7a9529d5ee0f41af62d19ceb1b1a71355b22075074b810c57626a097ddb7e8ee20b0dc3e370f126d19fb5223c7dfde471b2216a415b1cdc04ffa520dec59ba941e4a68fb35a1ce5d2e12147951f13b2d41d25980bfa49345be1541cd1385c15eb1a652a58083d0000dba56444fdb12687d9722aed90d2bc62eebe24df9c8b7ae897 -MD = d4a3b38f18b048e61686c2159c666469ce9a9400632fd40ac1d6ed33162b921b95ac26238af9fa00a4314a6046e1733fd4fadc6033f3ac33d2b8c202afa5f02f - -Len = 4984 -Msg = f516561edc530bf7aa1a63307d62812fb560dd5da66297298ffb0c4fd060a85a5712fb675cbd0e2d4e60f73a0dafab7f59b6140f8bbe63248274a863e1489f617814cd65fffecc700a9fe47a3965dbffaf350dbac655bfb1018ab071437df19b3e63f79f2dddefc8c61d51796a4bb8b6a027f1e5c1ef51d6f5834c025dc7441092499f9e4f241c3d6a2467bd092aebac12d2e719e354c49d44a8a69d99ee41c95d0ceee8cb99fdd8defa4dd07cca1be9ee8018dd944bbe0ed741e3ca5eb98fcd85f50b070b053aa00ae72c3a2df3f1761d77abb93c9ee73096962e1115f1d624f44c1e83752f7b9ed7352c81826d145a86ffc9354313e90b69eeadfb245ec0d7905951e273e167d82b2a742fe5ff2e9d10629ada127369a73993880ff4c8f3ed4363caae6ce1a658f0102dcbbd73e448a5e6452f0f85120deccbe8d5edf7176ef3b4b16ec8f8e1260c2d7ede728fe0612cd5f3bda31389446cdff5d677b3d5638a922fabeeeec04869ca90ef6c1ccaf38c75cb0a36e379549f17d699fbc3d5d3ef466cec488beac8ed2e8b8612e14903af0ff6a031bf88466fbab4a7dff0bec60a188fb93d9708ad82a3962ccea8069b7cea9b07fa6d5e21c312b6868d023844c34fc09a35d9c1000f6fd9670737a9c2db50e3c5fbb5a4ed826505c06bc1ed5602352918981abec87bdb7dc22657d981b487f6649b6102b296fcc8dde3f48203af10efbacf22a60db02faac291d03edfefd8fb6c41371f79e61f28635c65a254b2293d0940b922d895b387f1b16a81e4758b1a635701a4495a154ddc3edaf34ff3c8398c54a7da3012af3dd6eeed4a982ce87dd34485382bda285ecff01c1dfe5b350bcb73b3751d0f6af3f9b12040 -MD = 1288010a5092c66dc87771687ca6227139ce5dcb48a79dbcacb22bd365f661fb1229493c662881b86bf1eca2071095bde47c96b992ee16d3e3277662cdbf960c - -Len = 5776 -Msg = bc4b7d3a380be067ed7a2a02f6137cf2aaa6f5332aa0dd34368d237e45db0a97d4e11f26fe206e574dc8f581d07e59076d5cd87c79397f0a862b9d147c4b771aecb83ddda0df3dc477f9577f70d4b1ea04d7ac34b9411640f4b1a14b0eeb93d0abd9c0a847d0b57612153742fea0ec64161f57a4113e0a9f2726166d2343c780ba4b8ecf1b7c3f34c7257c13a367713d4b3dc314aabac2efc892e6c0e2dc79f4c016919a436a41c83e2f103a86b3aa3d4d38d6cbab3ca8f87efef88d743d13f26643af51e82225f81e3edaffd10bfe2bc1187a133d4d2381f271341b01eefb4354d9d23b312d518d0f57c2aaa9f8d5d152e6963288749b54cbf382b4b0789baf31e0e1a147122f4fbb84b082380198f5a6a91171b3397837b28cca9ea96259fda561c4cb51592505c7cc8cd0a6aead606569d518e72423f34f45f42215349ff75a626301788b9d79de383edc1b877dda382ec96f4bbe02504925e8881c77d463f5eea68be42ffe71a6ceafeebe15702bc701d5be088e7e1549348f18e5b25f0a210a75b0bccdb0b6c798c54eb7dfef1ab9e9e14c451c000cf67bcf1a996daab484c0b8ba29ed1b10ea9e69442f6d6070b6efd5622bf1eefbf90191d55f311c28c61757ef5218a746b7e784174e482cf5681a9948e294b1abf9cfbe9260841d3090183a9860d5bc22d57bfc103bf7bc7174721646918db2e49feb3c99c3f115928ac949fc7aadc26aed62bb771f0277ac85ff32a46065586d935ff532b1fd6c175b346d65c92721e7a6a4a79421f2c46d41cad6a978a30a107c33cfa552328b87ab618c1974cb4161a94aaaae6a4e0d7e50daeb9e01cf3293026db439cd17d8aa24568f61a4218aa09d5cab0e219eb9a55b3757cb227237bfce178b374b34bc486c1d5f8581b2656b2be091fd6f6b30ab0aea04780413815c88383ce7f312a0282bbee2cd3205388bfbe046c17c3bd95804fad8edcf3a7832d8d9ae91ee38ea130a3f0281e0a26cc9b463b1a26f991e73f26f -MD = 34b4cf4ed7281ecb07f381e9fc3805072238e21ea0d1d2c5ec0ad3b23ea700247b8e9535de9fac6783f955166c4ca9a90f4caa47056fa9f313be75daf27ec8d2 - -Len = 6568 -Msg = edba7d6312144e90ec9eaace7576045a46e553dcb8ee5a9849272de841c8f1ea9502e3760b929c539f9593aa259ee3ba31064ece3483826ce7fc9cd0ed9ceb99b426f6c19c88c0d25bb24a57a0a85a91f6d67b6ceba545b1724bde7d87e7c1f211cdbe2c0c1e4277e79dd9bf2bbdf1485effe19f277a2ad0b3bbfcd956d0fc5f76a044a0a57eaba90dfd47c8110531453126884d2e2db92f6ff5fdcba4802346a9468f03adcd83cf937a9d5c98a7a1f137f6795f4ae47a3771a1e93ab71fbe117368a73f6d36505342bde2620acccab43714bbbec0c7f6508066c910d9d455279cae953a2ddf9c9ce26e1ec2ad9b32f7fb2b5650db00b4e363eca4344fc771f0ecbf60de35f0ee123b355a64ca3d632049e153ffe2b43c56e3dc828e642199d42b441011cc92cf1d14b89d30a8d9e599eadeb9b21c0e1713c8de6b065f0a563b20e4aebd3becc62537a2ef0e91983ec8a6cb9051d233cc80da99688487a92f8d944841c9cb285b926a9958e6cba2f8174450e1c34d4ee307e0b680f02627ac324f18d11dc16b16cc7645e1a09f1e9aed8e14b3f2d285e50fa4dcbc3282ab559319fb67a168e0803b235091245534adb14ac00ec5ac0059ffecb42232e35eb316ba99093d07ac2048385f715a350eb8cd41fbfa2421e8c74181e6bdd993684d24f99bc2d9e5fa7e597f1d872a87d143a83b6e80f77b65b73c2b19920dd9f0ab269fa9975d4bf023d8be2fdd7d92a8d7aa00c1a726009eb258b1f5abb7fc1e5682746a92b181b6962bbe407b399fb9fb3b579b789af9bc3ffddd240fc0451bd5a24087babdcf755fbc47f66748f62c37c309a4f939ade6e793754bc60efc0fb0eccba7176a7d5507f121f9ab90df2a13aadf8534ec664531824215d98b692270cadd73b29ed27d153413f24ffba2db18589ee6319c6a01a5330c274f1dd37a9ca33d939242171611ece68959708666cd36116ef72f0341cb0c9b2c30ae8442bcdeb4aebf3f954784806265d3d6d4f3baaaffc68e8f762d2c76b6ca8425c2a059e50a6c427b9139f55a4f2fc417d5ac681d2f96fea20eef4fda27a9546ad6bcfa1f077722e05613ece1758e351aceb75ef86a854f5212acbc9eb472a76508bf27f4727467552bfef17d9c2b2dc70a3c24a1783b8a85c9 -MD = ffcb3b313e576ea5b0a87449749b82c1523947ad019c633401a185fbcb4fd475dfe42289c5413f440d083f73b65abcf2386e0eff39acfafa398a3d6b778fde23 - -Len = 7360 -Msg = 89eb3056770a6157f06921bc153834447c4b6d862d10d185f1c3f984cde5b81cc9eafe8bf532fc4fae3a89f41e14c52a0214fc1ab0cdcdfa583b8bdf8a42e3d3f857bf287e7e6b0c5f74f65dd22ddcbebd81e1eac022404875d105c0f6d1b8cea09c3bd417d6f5b58a7f319f396cc02834f8e69d65f77496d0eb31ce1a7b7e3248203a38ca22e472b8c3ff635bb9bb91efe2d1dba734af0df2f3d5b2fd267f2a794b84fc9e4a7e6d70a82b5141fd132177a86b4e8fc13ad5624fba14a7bb01dbba85e0c79c360ccb3a967b10f21e11ff53b07c9c24865d15a869a89a21234d7093361841caced5b79ef5b9497606fd540b64cc6d6f6b5ff64da767ef7244ab0f8cc6f21332fb2357252daba3d69b1f47282b226a76598a9fd873beb9a20862e12e9e37e5dca33cd356a61ac719c7be01316c483a43362438d13476a1ba56bc0d0024af5eceaf6954bac8cd5c477124a9ae910486deec76ebc151574ec115ffbb8bc121271208f202d7fc8e0b6981976827011ff64d61c8de2f342969bf2f741555dd56e8b0941f0438a8237c85de6066252461319a7f6239a344b499bd8b6340e8e11748ae3d388362365556a672c7ca2f6291e0cd2c8b25a5e9c087c1111467cc332aef16ea84a6df0cec41d12413bdce2379aaec528ccabe8b14dad6a9ceb0873d5786f0834c963594b0e710dc8e6689cfdf3801d8ad4f7592793b013bdb43a36668b542efd87aef3469ed6a827eeee8ce8c3113a636dc5367b7524caf8149a81523231618707b9256defee8ff2c7c7388483e2ba46f9bdf7096c6beed09ea1cb4527973e55cc1a861d8c09039e039b366da0750baa0b2a116de405fdebb4d89aabb5e623ee373b9bd1fdb6c19e24c2fce0c338ad0104921c156673868de9b765f277be90b4fb94bd17bf8848779de6f29a46be1ce0889e8dac7e45074bcfb6c3b5d781334e6bce807b4bfde6cee17fce06b565e9cd0997dc7f95eb0eb9b96f2a627fce5a2f1a417c691d784ae891e5d59299d0822b0a268f2b47e5eb3c49490084baf693bb7996177dbe97e37921c1afea6e7e849f0cc32c1c0ec64b67f1ccec9923aa6e882c24c805a9cd2ed5138bc36a9dd04f7d73e629ee44fcada13563551c445a4929847624ad6998aba0e9bca68fc276615ae2180f0e94f9609ca6b4c08a9776c1f42512b3d1787ae85106cccfe656c168cbd9c141f9895d22aea839b5708790579c8082ec1e40f4436a0d44b5fad541a424cd8a793b7c98525bcc5aba4abf277867293f33f07d956b406fbcef39c897c21a3fd -MD = 6b8be942ecd6e8509b88c0ebed80e0e2193eccf212430429e7d3d097285726e85e0d1d22d046cfbf37f80f922e36bb1c3b9e9d43cbbc477dc80eefc783adc20b - -Len = 8152 -Msg = afdccc84f257cb768b7ad735edbd1990b6114bad876928ab1279208574bd513ac6beb32bee9192c4bba0425e32ad0e64221371b5ff4f894aecc0c8191aabed3951823246cc66c7074aea804e621acb2017bce416acd54c03ba6f77d77f9ac4c479b1b39f33de538860e0f9cd260c370cbc920c983702591ea10f94894c92c02265d29dfccc021c8f230b15a3268c3c703a1f520348df98e3cb2789f5289cc89d3f6d58263fd90b64bef23d9709a1c193b8eb1c1e8672f19a603fbde4bcbec57b2c0a4ce5336b084e571ed7737754afbe5f7cd3b29ac54d8a87df981db0029d055632e10051c1fc9617154dfd1aacec39575ce0872be092fc6990826aab703983e56c7f4140e2cd85256105fe97b1614cc713a965e2c9aa382ed9e391550f813d01418e6ea8d66561aa89693d996bf63fd7279814678a7b86fd43235b57e75d7ad038765033a6aa72cd16df84c6e39459b122145b612bef2efe55aa905900b6847dd99faf87598602b78fd199c62021e37a8c840479b2ed775b97e1f8026372a12eac71534cf7e0578f7ca645422a86255deb52d556295cab39912e5afb177b1a0c3a55032b899fba7e66c650e20aac6780c9e597a1972610c3ccfa80eb24b7373e0ab189cb16ad73acd499824dc77af10bada511010532ee1ecfae307b93103feca4eeabd6a6f1ca404e87a32c69d70a2720fa0d1f7a688f7522b033536b6d7c40917532f1425307625cf87a26f9adfcfca94c51a2feb03aee4e6a511ab4b5346058ade5c6f0bb713c8754d0e47de30db1d003a73399f236b1da42517976d2b07481fd8efdba1151f356036d0d0061866e1d87d57a5416cce74ea2fd17baab38a595cff33ea83defb2526d194a870faf5d1941a31e360444b833f11b9d8728131a1b8ade30c128939f01fa9c431cd5cfa34b97dbc848a5e64b0f9774b2e6318bfd9b95157b0db885e2ed13bd9fc69b2f6b3bf2431f91dff9c96dfcd0ffdeaee6739d5a60c894d60ca49e1e45078e4918db72bba5cc199bc759d288f72b77876da6aa4089bf5f6b720d9b85fd227ac7d01b7758c776e8c29624c8a3b0dfb9a568be49af5607755dfd446caeaa9995fd9f54d23371c6073aaf52d6b5c4c3adee1fe2030f9149de96f67299031713e4d3cfae0cb26d637ded5a0a8526fc7e5a4bd93b5fc9002ca3fca5beaaea0b397132a750ac3f82f752c1df745b5e1eb9c9a4e0f1e5436c59cb79515128cd4db343006e633a4177278ea085b9e2c5f21b00e27a2b1de69c775ef443529b13a62862276d0e3f20159d3a719501a2c3424d09ebf011901a5a2f6554c4ea8924de40d78dec7a424324015e1c577322c1d4f6eca98acdc5486c29e6831a417c68bda4a91c32cecb146cfa00881338ea2571bfaf038f8444d69b0cec688d7efb470bfce0ba893362fab4312a9f11778259 -MD = 014fd2fa6b05c4fca1a5c0753f15c940b5f976b41a40bf6bb14afe839d83a4676173940717bb7e746a2ac77f573e6744cf0002b78b5b7f664e22434e22d0ccd0 - -Len = 8944 -Msg = 7a26b7f55809d58528540601c87db4bb8e908c3d2d82823addc315c4b612d4be5d952195e329352beaf764140a48a205739a4789d3f20ff67a7565a0bc32e14c96430fe895147279f402c85404289091d175cabd0302fecf02a37f5d5ebdf1106d570956367394568d9ebb2980c68547f24c9d3f865a56acbf77ec6465580df22af997478deda4acfff3c4fb44c9890f1d45497924a11f74f717331c98ad3bda14534223632ba86290286b321adaa4d1998855d1a4806111f3abdcecc16485b0748a915280d4ab6089653836c8a1df75af3e49b1d09e256afb5c703ea625f35c92c90d3cac91b28e32d4b47016c541e3a78fae806ea472675651767911978cc7b6363c49af0ac7d4d29a6646ceefd304c9a20aa6473951f04eb47604c86258d728f9a8e250e6f11ab2e2d621b6c69cbe5ca0e88b2306c9ed29aaf849932f5f752f3bd96d58ce39481bd28d6a98f3a4faaab0cd97cab2e246305d85af3ca6aa8a152456549069a546539212873a1df3a1f9fb433203e6a4e4abf5a49e896e40fc20dba7fdbd6040fca24bede264ed929992a9d1c4974a18ade299de7e443029b5998954d2aa5a0f525225a7e1e00a88ccbde100b54f85458a1c72bab833936e9bc855e5391e001c31aa47c7ee751edd20c2cb566df1403463a3a8c0b21f401698f468e39ce0fa6e7ff1dad570eace997fe8905d544522eb21bd6278d5cfde299366e9d662b9ef0d2670055acf08c4c5d078589dd215d474aab3c86b890d16b073670144f37187020c6ff1dd7297a869fbba4a9d5027fdd7e8cd0420379f90b1223dd8b7b7d06b541b35c5e6c35f218be7f68fe53444461ac2523b1f454ef337873095b6169e430b390caafd2927d8357e744efde83457471f8c98f11de2e7478a8a61ca78a2b630503ac8ab0cb9756ea77bb06ed2bfd765e9c1401d252316eb1391637945a56dc947084677d4db9f3f4a55ddbe5cad6f7d073a5e2bc7d9252a0a8fc44ee56f10e106be4deaea56feae5048fc78edc5c696613f18a46acbbf0d57caabcec0c8467d75a4048ab4f13bc69f9d3621ecd085b8df17960f75c28a9ae38b41833e78b7a77c0294e29b76fe8c209cb243c39753eb690c01f452862edb9419adf4c8460c66031f247708abee0abb8c9965d9dfd938e76481db68df54d853be18a9c4fbedc3f244ddd3615ab44759b712109673bea641683d4d1f95a49809c0aa2b9c5f01c431b9e77d0f49f84be06346cb621aab3e5f605ed1df6fc5239c688a01b63af174a8c669fd7b41611f3ad95c1ea59b480729940bf010366081f6fee1b37c5464d840b38bdc0c0997ca4d617d91c7bf3c09884b6d311ab21cbbfdcad6ca547503fadfc777a1296b43540342d1ad304e304c62cfac1c66aba2d79b1392cda86476e16e4b52d43c2d0dc642c67ff94910cbd9a166ef395ae999e0b7233d44dfea6495d68747fdac189c27f433b0fe78ccb6b72b595e115f33aadb3840feb761cf761ffdc37ba5e1f4997f00d28b42264c98eeeaf0232bde537dd208b3fdaf96db5386cd4719534389abd64eeb394fbc561a87c472630f3d0fb9 -MD = 5f1da3c03d633d35d6f28c1987ad25ae9e26b6afdebb2aed02f1719b706d20e5632b2005933db62129032fa3fd2304469928f6810af1742c27731a5beffb15bf - -Len = 9736 -Msg = 8ceddebd38f00406743a6756565ce762d3464435d50bd61b8de57fbe0b79df8f0c5cc66713d5ef6ebbe5eb3d4b845b3f8b2e625dd69e5ada71dac67b1b6f88ece5fe555f44f7657665a56f63c06bd44ef04d1bf6c2b19d9c8c67811dc0e8eb5ec0db71ecf4decfe41b82db11de97bb55abab554ac0cd0728869798ea216b6fac45fc03584b1093818485178fcd92761d6350f99ff9790048086ff42b67807ca01b68f4e970171b1549b50b25b4e46f6ec145f03e953df0c2baf97b27b9af7a00eb272ae88c7bcd68111ba01bbb130c0f6d91206fbba13f5f433c16284081d1955c428f9dc6c2134185bdbcb80ca9b7ca0e3c737a932e55e74c40ae74237dea2717c00a4f4776546a4ca54845cc2ed7654c4fd0a6466b9b227c0e29548b2c2b7ec3a98247361ef7a90fdb2d0a2628d3a9d1d11e3cfce177d87cad7110a014fd610906e1cebc4366c77665514f4021155e42ca4784dc1652d0f3256cf089bfc99991de0e2a016c088c284d9e5c42a0044c4a4232c60f9495d38a7f043c6fb5f5ef0239f1a32c2145bfce9bfb78552e083a8f42c74abde3a6a9e9c2203b797ceb28051f728366eb852a0f554feda15289f2b9d1ee570c89ef1ab7f6a736d09e110f41997910d6503093948584014d94ef3a71f88f372710d6ee9c2383759ba3d16b5faeee94a5daaec3053281fd817ca3db5fbe92303400c5ec42529b40031192030667b955fa11688209652e2967930b9d2a2bdf8b5cdf23dd4e8bd7df3072bba0dfcac29cfe7cc497482573cc246090477a475f90c63758896bd41f99494db60a91e2f2b0d8a32bcc6b7a382fe36b9aa3f91bf8869b8fccb83f375bb8772bea09c5b42fdbb10e06e71a6c659bca3d92774dae93b70270e73272bb7382e193bf65234a6263b146bbb1fc04e256015dde8c1e081969246111bead684f40b00d9de552ab7491ffd2b4f2ba4997a8b153e8aa153270e528eab2269847d8390b21ec53fbdf4badc43a5772fb446ddb02a81798d933827337933230da5ff4b71b581475c5efd1ff27070ef868fb4a361be3d2201313355a79e5f9a51bb98c0007397d1359e2ecce51c0404ea9781800258c83086bdb73e415676f4c055b895df84d90f75ec086646aed543a65c3bd82472c91198892235734a2fcef3e4fd116161ab3e87d9186079916b48544e22304aa4a641b13402dfcfd1c09546e9d4e73882a4fad5e5ed40006c4c7f7f0df30cd756e64d6b3ed781b995ffc443e4be6bc7705cd0fa82e5897da7ef5570ec1ce27d120f91211a2eefc2ff33f87556383380a3193d6040afa133dcda66f4991e458e6e98b96d56776e6e85e38e55dec0c306a380bca19f9a2be56384205465659a9db50822ba642f823ec2a5126fbef69ecbea29cb2900338de4e4731e2b0181762d9de46992c3d5df962def111d97382b42ff5ad581030a4bc4c82dcce2de005cb07193fa8105f8bb172037f709f803fd0e5bba8824289cea07972a99065b50b2c8e8bd51ffab06b9246206509f51e8887077bf4f9cd159ed1fd9e01f2029f11cc95bc71c89139e5e603bd0aa481564523bebef9855bddfd99ff8e4dbaa9a6fff4453379697e01e2f3d463d60bee2f5eea310b1fed91e7d13ea7cbf3b104d3bdecc67857cb69104803df983105e2b2bb2589eacefb193d04091edc5d9fbb2d34fc3f1371b6f86f015c4ce7835905e6441bede36e759b -MD = 1c7665a61930433fcc7660b36049c016a7c646dd1e8412721314f969d3661554b97b18fd35945109cfbfc783bdc424b204ab19afaac855c284daf7f2cb333a65 - -Len = 10528 -Msg = eb22f73a99b3b00d6c9b15c8be5cf11a5435d561e398bbc1d3dee973423a18604cebd6ef8ab6291bd89475c85ca89f57c4737378ce4b433f0e09d17bec037043ec3a65d132d4939445cc588013e8b2a935eba610750ce2bc8da8a10d3234cf4e51756d8999f3389f39ab8597eb047037310435d1dec4de60d9211fd41eb57ea90506b6bec7fc5e653e99c6b6ece4222a3f26ea651359805279de1475b76ec57d90530819c5d84e0ddbfee1851f700fa9e8b98b711cb510bbf545479b0547ebf278c62b429a6d50c099429fab8b9181ddb225e1a0ffbed6c2d6c082ec11293a2f47c5e6e04ea5aba6fecdc8d1382dbeed27d3b497c65e1990a3b68b10e2faf85d84ba039bea67a9e69407249e2f2d0f02cf29cc01797c234ce48f2bb080a46ea3b80c481d749a90a9e3597abb777abc443190f0841e003a1f22b22a74f40de42a6a237e0bf728a916722994cf18fa0ddad571eac8bfd1a731e3895003451fa11922676d1078f83c56c9e038831b974aed4332807663d9b2a9b27b65067bc0ef996940dcd201f2919070e72f7f8738baa4043d7b3613ffa2b014f030249fda14d2c51694f999feefedf0a4416a64c5a6289ff8a2afd62bc16d93507a06b85459ebc1515e2e4904a095cf8135edbb2556a09ccdbf8ab4455509b6040b53ce16060de259001918eceaaf98e5d5af934212358423986eb536a7ab0572abb4ea08635fb29642610e9e1663d038e759f403220fdd61f704e2e4ff7c090322d11212b80ab871eeae33036bdb01e13492e650cd5532f1a2f44238a5a4491f3751511c4c357c50caaa9001333cb24a840372115d30083a61e5dd1ae04a4e2fb4ddac0e6809879ca0fb2c81b4b16cda9f539f2e18c7e9a4fe80bc73f9969e995f1c2dd054ae60be36490f6c385fb6f94c2b769047435c973f6ce62938b1c3c700b7db4a584b8f1c543d42a80571180f5533fd1d31cbea7bee516326e5c3451f6155be65bc089d20c47ecc1f630d1a8480123ebe208819b8d1d93c5048f3aa0b499fdf07c70e11314db5b5b79c5c45c19671415c5aa174b6b1aa7891a96a7cf27f3c4519c28573b6b68a065af785202c5ef70cdd283f80de556c1fd04f50423cccd5f884f5954c19c8a4c6efbbb0342ea24da92bd28ac79687c83af583cc8550f812012ea86422c14bacfd5e31070730281a202ca0a9d0470d65d0e78d06cc98cb9a6701231d80160749b38fa1af2398b90777cadac5235ab0ede990b5279f7b0d1632e4ade6eb80c324f16952d310cf1dbcb8ebc705493538058dd743578661852d6bbe90e7ed6749e5bed68e99543e1ce0eb79b092c9426d57c5a47ebd0ab2fc881979124a0d335f3323be9b29794c7e1b165bdd932be8178b98dfaf82b2d73acf44fc7c34d44cceb62707c2ac07600a1743799631f88efd490f711ecd073607a9f42f16cfc81b5d17d29a4b4a84e4897979bb2394b79ee838314013c790382bbe32fa27437306d6fe2c5f7e2a7a3fc4ecc109cbe3f07fa0000635d698d5456db70545f9b85d76ff123e3ea37570d98016224bd8472b99ed4a9638ae675ec6963c76f8d2550cd4a2fc0f200152ef1a889fa46990e7f15497beea32e55cb4216ef48cfbfb420a868564a7ebe1ea7e6aa3304f4b3cecc91865030909c1a15ec0bd884f36bca8dff671f00f898b65a53198712cda237d3c4d20c2fba78b5be4094b9fc7925caf118a2d4b4ee047eaecd7300942fc8fc3d15b90a2c9f28ab5cf66e0e2fdf5257e2aac831b6cda5da1dcc433a1999ac6e510aa7d4c7ad408d5a53e43f9f8495d3eb2c33909725e14b3fc6069e03a9d110c81a2af6716344be3f1f93d8bc0744d162f3718bc -MD = 97c433de3cd8f18b75e494bafc3c813e112b2261f1261ea6fab9dce0aaee5e5359f0e763f02154cac1589bb70c2cbe9cd22f976559032923c4e2beaf3f88f196 - -Len = 11320 -Msg = bd361ca6c8d3531d4dc2415db16ff93d3e81d3c2b451113800a1c2814b8be7ae36b7d5cc64d1da003a3a23d7e2feddd796079b5a1b90f89c8bdc7d125827c5fd8eddde40580af36ec6112828cda2c6a690e69893ddfc951efba9be4ea34b4a954c0f01a9ac64e68f7bb018f87a41fad1b4869216037f2fe7d7724fdd33e0bf9ef8b704af66c9fa8ae07dbbf1efc4c2818a4f518a95000f1ea79ef66810cc6c3f1b3cb0fb902078887de1d9b9361466de9baa9c9899667eecf4957c9743f999a13c06cd353151a8b0db4539f857172e0f6efd3ce8199bc27944bea911d34d8eece37d23055243d22b810fa45758b7623d8bb1fa211c8623ec2283447fc8b2924798097911fae03e20f7a9e27d43db498f7b2f9cebab0feb6d134b17882b0fefdae4129904310f34b8c679bb141f6b2c2ec5deeaf0cd1e6026a17fe8d5034bebce4e004984ffb8fb1b75e9f7c1f54e5341f125aed58a9bcc3c5385800d5850cf4b5f3b52396dc3dc708c5f5d2ecc6e06f1886eae45ea6e75dab1c6a7d93205e3789d2b7ccd82191fdf9445b603acb28d661120b3e6f680a42644aa24e19a526e7e92388ee547a00c921402cae79e022fc714a28560b5b7a048939ac1cc971fba85c6cb522cc241eaae94fe6183a846363c195eec5c30fcb36927fc444332540db4c04a8e47fde5035e9ca1437fd566e8efa9bbb0826d3823b1863976ed72dab033081f0be100729dc8b55337822a4b8e054b219879765139473aba1f735f97eb2b26b091a0d1d20114667c0734b1db6fa988f86eea53313d54cbe6077c017405c4a267e82c7aeb776b3884793f71ffd501e7a9f87c0abe77ffbf24f5b16159482505abd72e03a746f5b2d3564872a00635f09affd8a5e22e71a0deb3b9862ffa77d7e3274e72ecb8d95cd165fabda44b6e2b344aa52b83acd1f57b073e78dc64e19e79a033d1a41340bee770fa59f5ecd421dfa38ca58b37484763bae5404ace8ce4d40a8627b6a051617b3df34e79318e5904d0351ae118fe1dfd9458e55f7f9f305c2dee7d0aa735ccf7968ba51a62c55b099a47926d971affb35c3f6f05c1430b79d114da88701387c1416a65bec6a0b058c96b1617fbc575ecdc41e723daa0fc93bd9f461842141b430639964fa648df572548acc78e260811da0754a113dd8b12ba38caa267600fe3afa040b44ae4707075875f6596663f881f39be66b423405e90876c0e251eeb0b02466cd5fa9dec0a83cf34d95caca3ba737e2d5c0599a4df07333644c5763822c9d4229afe9bda8c15c9350b2821bb0f9d7eaa6a4e683efee6e5302c8e917c90caf168eb9d05c260f41c69e442ec0ff067e23c78d6b79621f74461afca9742bcce4648b021032cede871d84af13727c39752ec6fe6af35b200f9d1b3bfb00f109c7bc9d1d0bfa19bb9708b267e278cf1f675c135c678a217caab8821b7026df3fe37f336f35ea8d22ec0896131e6c5e34cf4c3b3be3965ba1d038fe2f8b8e3cdba22cfc8d10bcafa100adae1529c5a006176fad1161a0701c1a9eddccaf8fa0799e5646db4ec8e7b27f587902970d3affca46f7815440f567d44aaf977ea38076328bb0ee2297cbe3b2a9755fe8bb95ae726298e04df05201a7ccf2046b82836e092da94a4eb1c291450121718159468e8a330fc2b1272c661fb62397e874ffcd7cccbe5425af725791001c0c035ea41c8c48dabd206ddb217666e2b688237c2127e96eb049d941b34126b373e13454d4e30478241e3ce4b0768f8e04cce67ee574f418c32dd7b710bfd5864dad82cf3448f6668bfd0cdf9f8a70a3f729667ea6fe7d6b213413591c77ad02fdcac289e708bf34796f56324b1cbab302100c01c22ef5c44f0f249e13030dc808bb6c0b39ccaf4060c7b1734fb7de49ba234f9ee370fdc2a11173fcb0dc8833f301f7c9b8ef4748d6a8a72919e65bc683e5b9ac778ee5d4cbed9a0b528e9ce54130ee4be0fb278c4f849fba4622a3b803a -MD = 44a012fccd62e69ae9a2e9e46427fa491b88f66522cdc1f4ab5c5157196b15dba3905b99c460bf690711797ea556fcf4b2550539151f80eeb522fbc00450c723 - -Len = 12112 -Msg = cb7e0a2878bbccbb7dbdd8a2e2791ea2aeee73c909b5d9a19eda01aa43ea0e07dc4d9c787cd60188ce99d208b4fdaabb2d1226537c24349c87908ef87dd6810bbbf0f3b7f1e2a44b8093b4f727db6684dfdd23410397c241b4b706c37cb068f2310e17cf1d063e6b5b528559843cda638cf8717ce63609f6eff872f589a14c24064f11a6496b5650277f4d1513478fc1fb0a18eb6d2a9324fefbd975ecd1b409025de826bc397462acc115131c250c07f5bc2175e09be834aa67432bed672809eddda436c0972009b2c1e43be7fdd99b42b6930486b08e8cbbe4b8ffd48c308c8e7a4ebd9bade3ad0026c275bcf87fe7aa9f767fa8920f96f91c41d9e86755faaedaeda596a444b65f99b7a9e23e8551f51fd3cd8e69f3b92cb4e5a172211ebb15a589d5f9a4cc8c97c2ccbfa2f67343eae0b1d8805cc05c1b57ad3fbae114378b842b350cd401977048089f4448d22452871887c69300e98fab9f9b08d0bdd6d81ed9ad175d6d3fb2d47431105d285cf5bf10c2a7373ac75058c69ea416a401c31d9d25616798ed240d165e4d5d00539b2ea2716c70f75e2607272ed5da4e1e16267f85331909078f9cf80c4570df700c7cd57d5e65be16d960cc34e544459797e486b5d59b48f7bb2822243ebc4f1d0f52b2ccc23f1757300abc991a7d10d20ffcba9d8f16dd23705a9a8f816cd7c26e583f47e3258a89f4aeff43bdad373945192326a9b251f576da6a3356a600c5ef3586d60840a014edf39e1c15fb423203e1ca366a962ad3944f9afa0492508f5b918f6278b8e060e382a00b6c90ba270ffcb6b61bebf327946130cbd55a5188791660d17cb4d3d59e020df70894277f3213ef8f04d831583cb9368d0f238b18136a030d5c5cffdce51cedca322e0fa234ce7ea76d866ece55ffb32afb1885a8ef3580fc60d9eedb8278496b3286fcf8ddd46ae89e1c31f1a6dbb089e15ec79ed720dd88d053283c3bbd28c250c575e9f5cebb39dec30329f9f334920920d96490d22498f3f13365d99393b7d41303dd43637a8177a36bde14f2472dba844460e5f45d1312dc99c024a4913205972c3c903caeaaafe3f178c07ef1423eb28ffc9d2e8ee3753ce2b3e3952a1b2d7a7b6ea4005f9bcfac1d5fc53f3bb9dbd3429f7f27c1ef643894a8e011665a92e375db4758953c1e2578fbebdf2c7ada0fe5b05588fd1f27f83906e1be4ed77cfba4eb41ec5975e67789b5fa03cd6e838d0199e5f84b5b05a55835af44e97b35ea8f075963b22e6dc9d8f3b955247b1d761dc1f820b28b48677a9d124c402c04d7be955966a94ffd44ee1ef17d3c8af2f1c29055a83a97366526a6d17e59d330eabaff079c45c0dc0f529f6a231a844827776ec637eb6718c8e4b8b6813e59024d0aab2bae8e6952548cdceceec84f6840c4c31175cee435b73c3b87fef7a4c22536038f438c33a938253f3f864dd59a6331f7ff0ceaf4d75bb7970d9c8a9eb89dc76dfa04480427e5a42f2a94b1fc25b8477258a1478044dcdc341004012e2bda44533398c9c61683911477c0fcae53688d9de4dfee71c561347a58dd633b6507351c03a9175fbc397555ecb137d26a9b8cde6a6be6ada21246d2acd0b9afac4a223032dc3bb96230d75c52106a50b378ca9eb4f0371e23189aa2d5850a7149cb94f788db3cba4f903f9070849b107628d1468814eaab909bb8539ca35e6984b313d9cd4e224ccd80355910b6d4f9fbd3293caf7f063b30c2294ec7d3be7fa42a253ec8dcf6562228421ff84d1cf5899f58eaf1da93b84cb674fa1ebc309bf357548e422ebfbf97b1ed4af1f27cec69b7e8b615cd9a092c9f21be6b07bfa5b763273103ec85717443bf42c34dfac4e441610ae5ff211618a4b804745b70853976268fd3bd505301053f703605a1664066494d271933c758edc23302614d23c1b6da107a49294d8620f53a12c376bac54d2ae7a4c2d50433a3c7b2ddc05d67964eca1dbf3917474abc69091e2e83a8bd1f8b4024a311b5f3ee4debcd21a83a02647f1c6b35232996ff244623efcf196e03f5c06f64eec2def5de459a2c37824b217f7746e454dbb214ad57e9ad62f32122efcf4cac75133de101280b881129baac549418efb246e6218ca63811 -MD = b4641572cf72bed4513dfc2771dfeafc1aa6dbf7f6b740998c905f2f48ae471d00eb0e284291290360c9763500a584bab1a1603a8017accd15c3db7fac25b572 - -Len = 12904 -Msg = 43331ce3faa34f02b379076a0fe38dca551dfd63148804b90afbe98e455dca1088742952f0f8a7f9d7ec0e38f92e95fed54c606d5799478fb380d84494199f7f76faa5b250503687772ee7d1bf24d8c2e314375e2741052f3ba91d3b63957233d56e98ed62d2861459e79a1fa9efdd7f451d891dcda7c8036a1dbf59faf9cb946d770aea6ea71e0946c02d08feb72c9ec4105e9291f517720885c688a06e320a05be0491bcf686cc0660aa7608a34e852895bea5ba507be4dc883baf9e1c30fd67ea8dca94e847c7617118500ddcca9e3953b23e92e27bc1afcf25b63c2a4cd559a4ae7d3da5e8611f98807e568a2850bff341455fd39f7249018c84c2c00ffaa4946e920054f101077fe9e72bd3f102811c74a26a4b6f5d72c77803780800d51061d5f1251dea11e3ce5b75d3e2ac1e4877523dfb7174ebf2c9f21aa627a7cc64b4eb83f4295cf8792ddf0f98dde10bdcace3fe596d358490ae01b193488c486a34b92eb4a0cf1e91427b9dc0ed193105622fcece683a91151faeb1889138b2e88a46dbafaac9ebf5b839089439daf88b413f93a08a0c784ac30000cd2a3270a75d9a732b6dd4c76c3521365ceaafc835f31a3718fa32a3f443ff87aa3c02ec6f56bedc7114771abd613a1060271d09cc1dc8a07ee13478de46b32e67ef318c071db900c9c53b4cb1e68c7ee719ae23196a52b81a669b61cf7525de4b6a46ba395993c57aa8a6c510691f693be7e97ee17fbf6533b2eec58e785c7d9fd6c9ddcbb25515cee742eda295fcb7a2ba5682ef07179113ecb50ce4f660f4ab5a425c86d206d70ba7972d2e0f2a5265ba7e980aa86223003d799d99973a2cb71f3aa1325eaef37a132beb7e82b120cc0ee826f90aa90343cdc0e27504f10c0b4d3913970155506350899058949a0b1edf1c9685d6f41924c3154240e58d7bef0bc51a7c6104d80e89368585edecfaa554a34e76b4494dea47fd25c1e11763aa81681eab26c372c2e4bb31cd36afd4a79604b8944bb287df8302f3c1a196ab85d8a987eaf99806c989a1fbf717eb836dccc73aa64436af499cab1508cd123bc83810be02828d7d69a1704dcd37a9ee3f1f753e7646ddad71bd80f15e0c93fbbbc82629bb68a9bdeb54ae8e153ff1fd64b7952bcafab0699f0c0af08b0622d3a5b17231dc53f4af97c9e52598d6c99826bbaf696b08b6cb1bb1d07a5664c6abd01a7d3e2fed773bb4299c7c1ea53ba7cb544c602117f8bc2cd55bf888ce886b822ccdb97adb394a8c9b5cfa6f544e129ca9f378b3cf7c221ba031d0e9eb6efb040fec0886c842c26548ac07528a0ac1e1e32c19ebda4ce73139dc6c416483439eea62951b5a9b8d8858140b90ef789de2297fab8fdd70f1b3c9e43258e0cc2b97e5b5c700394b913df21c6ef12c9f8ce6a475966883ee2aec77cf8cf608539c392a6f05ff0e5ab8cb3e4d993de98877377b95423e71d078236c27e1e2841f7ccade17b9de81d1e87c652ef23ccd39471bd76717d9521ec59fcf7399e5fb38b5932c364a6639b70b968f48e2b681bce2dbe0747e00ccdef8a9c93c1cc716a72ddc3a53205fdf140862e321d272ad1932bfbd43dd7d871af9898209d1507c73ceed30f6a3911af1c7288a432839f8561e0e975d9d162cd9b08721622247d5a47e0d37a83bc493553030ac364ed30a7d8d1295482794632405ebcfcf7676cb43278577ef50bff2482bc16f80aa088c956911e08ee2bed302e0fcb3d936a30456b09e17564a4bded2a024feaba6a026a799549fb6355e257b2903f607c89728e8019d3f629130fffc77a27f3fa8627fba0523fb498a3a0197c848bfe2951ae0fe02cd199d8d36fecd98811bc21a1740d695c61cce481c0d5fa51337f105f4d4a29b75ca8ea624834eeb09f9be63871003318429cdd6caf4daa8ac85bc81ecabdbb4dc7dbd45c43585598442baeb7a984ac1a64bcf9e0c5c10ba5ad3cb6fcb0db2354b58b3d0dcbd7cc8381d3f1ab880b22d74a95b07acee0ac16746a73859a42d060a83f7b135c23b216eb3d458086f445d366cf9797051cfa61908d7455e15570f6127114e97edc84d6e2b010d340d073934bb315c222d6752b941e3fda20b3539986c8a11cae62d3380ae4ea1020303aab6bf8c19882cdbac8e1854c7ec2cd16af679e961955472baec64447c3bf94096039f91166bf4329be2b6b00d0620328bc477b6a5c1e09dccf9746a06a796c7e76484c9bc922d7409fb438236b69060854b8d7a471631b850f10748a80d839f8321 -MD = a1a60fb89d420fc84c2caab24079d75ddca9a4676eb8677b3d64038fba8711203a459bc26259112c64138d4cd1ebba406720cf29cd1e4ac35e35be50464ef1df - -Len = 13696 -Msg = 1cecb230f8c80f87e65e6a5cf1de4301b2cf1ac7c4ae81c478d875d3c9aaeedb92e6b555fe58760840ba161785d6463e27ea595924505226ce5e424bc48cd19b20d41a95f25fbc2dee5d2dd0613552a26ade4d0a668c9770ac904e457b79d044308088f8bc23087f560f588d6d438eb4e1739fe272aa752b793442c8d6bb136029b0a88745ed8385e1983f58914a23fcf570f7e930f216de9c13c5ddbd99c376732d2249730454c7f7bf8938b59039020e9ffc2889aca2117ff5808b185a080f76bf9d472fb2a5cd014ddf36c15ef64f95c657a6631f404c89a21adacf4709b2992dc187623d9b20650be8589dfc856af0aeb06ba894191822e13cd2caa8efe747413713f2ee60478dbe4da832b20cdb891fad803e5355fcb27b8e7cf1c5e137e5c1a7f3c90d1ccadf31b52e66c8b42bc7e1f9ec0fa41b81a139b7df2de50828dc76b82dcde2f632c52bc9f12285a4e111bb3ab701cf932d58e1600364518c44942813cbe8b41705a67331f94f330585d17619eafe1be78b3d3b30f17f529413759f60d401cda7ceead2944ed318fe9f6eda3d8cedd23c20b911d0b0672e481ce8a24651ff73cd12f8109af9987cb8b850af4fa5b53abd763529e748022dd1e753fb6d49ccefb15b3af5ec0184a95a57dfbdf63e409b8f14174c1ec23a9957fc1f707ec44f897c301748326e81e60d0583ccdb5d753fdd82c8421d25f6b801e4b5ca21cb7088561af7d31348767af949a4a3a50d3c6dcd49b1d38b791ed4f8267bd0fd64173666a0425c38984aae45abaa0bfd537d6c87f039c711c79933644adb4cbb9a2cd9d54a61ac4966e7ca1ab3fdcc8b39208534ffc7e55616511d6cd83c04027297bacaa0ba8bedb834169fea05aef6c60e00fcfec5f6036e2ddc385906c27bf640216e2bb6c1cc9819d9fdd72a79e7022d2506769ac2bfd715b7f155a04cce2d1055e972bd158f0d7e5d5b03d5f405f6663b7befae11335af1f5bf52746aa21feda062fd3850de1f4be8e2f46ce8f9a9a28c82ef69ab06fea9dfc9dae9e69fd5c04801558d3a60d768c3b934591d6a23c75e44003358e1cc26bd387467876e567296f001269bbe3cbe360a4b025b016dbefae9a974df6cca4ed733a95614b7aae9d25489693ba0573388fabfd16a668e70a8987394094e020a74e3ff1f5621da0f445876c0e2ac2eb003b31a2c11408ec4b079e4fb9e307c43dd7000281555edcb34214f92578dcc1eed5de37d193776a159b5861166b93fdf5b0134da18fbeb04e9da9c4763e936638f1fa32b4bf44df1ec74e13f289253c834be229d29badda4aca9e647ce6976693122e19e6d1f1b9bb1dd7bebae62c0e4b0d052da0e3aca92c5b6b3f960b492161b8e253e4760e987f019de7fbed28e1d195f4cf79024bab67c2a8ec7e0739554948af873a35dbe9df14f9261218ac659b592995e7720b5f8182dfc18184d840ae53ee0a547c1a2c5fba81dfb9f317082ce92c0758bd5c440e3e68755ceeb692057d3673cfc329de7584c09b3ff6f927faa8749a694ecee76237eb6e4cbf44b7d307115a08a58b8eb4e62def30bee36389198bd58590c3c82211d112ed711330bb83f7139b9ddfab92613222289536395cdeda2f2a3deb44c25e9219bb9ea28b13966037051666c3928865fa74249227ea5af83de3a0a61bd770d6d943b263257f90e53ab199e14549be41cecfe767adb6006e583e63748bb5eaf7e7f236d59e5415dea53da2afcf0c954e25884827394471952496f0d732f24f8dac53a69a644597e4fd15cb52cf6f8ff38539e161591a21151989c36e9020f0f0bcf48c0205a89970a8b67e5aa4f710ca64512da69bbb9156bd83657b21a681c9904151ad01019d1a4ebc36280e17ca4b496a97576f8d34e2671051bd76176490acb6820bc4f5053a45837d5b69660efebaf2b90443139e40dccd1275fbe83bce88e0b79eefd7846923a8de652556714d2f660d2dc4f34fea54f62265218d59dbab4c4ce6e03d7d1f7f88b3c5e05d73cf2d410e445380ac4786380beb859b51509a55cc7424ab51d59fcfa80e190f98ed1b2026d87d6035f0d71f2979a686b4c5cc89b0b74b95c5143ada159e4dd1533f9f6ff16ab0f69f7ecdf815aff2d3f693b8748430c3713963a734a706ed47352f20acf87b8cd82b39e16f5aff09079942e492d1610ae2114c8b6bb6c875d5a1442543a67b6f798bcaa7f163d747960f7be77102d8a05cff274debdf7376014a1733e085eae75f13a9881abad93d03db77277ba2f81246559c65318b687c5e7200d2e0016a72fd554f1837ea6557d58ffd3b2f3c5fef32b70477e94537e741cb9968eeb34a90c8e323bef55d1c368f9f568908297085968607ec5f9762556fa9698c59163bcf763fd012cf9d6e47a68c1b97a314ca7416650f4 -MD = 3ed79e61d5843b36b6228023670b333208cf9bf556b1d6fc54e95808dfac2402ae06fb749e45883f21211ff41b28cced38d706390a398afa8f5eee760da041f2 - -Len = 14488 -Msg = 1297bed1f0bd49803921a12a636f92fe2d7a7a7484884e3ba8f0dd738be8591d7a9813d0fe7386ad05c697953d911b99c1979ab1f7b152b1b8677f7ab2c1da6d0b5b602647b854666cd88750640dd7d9a20af67a093d6d27095fe0850b4993580f092d3a9335bc93b77ffac5a08acfa71afc163581d5a486e1ff86fe5c258bc4ccc90376aa91c51c2fe2775bb8b009ec6f95834c282001b4896ffb4b6e00ca9b8bc46841547578e9192a867a76298f8eeafcc425c6c78b9a49d8c7d6098059c39421e7035889dbe3c07eaf8aa09a6977d35a612a23714a2068627005f44d3f262f0905257f74f9f06b077bf3ffae9d8d72d6e3c106c7472f30348042f91084aaa4a44c0d91dfd7f961ed711e5b0b35ba0e99d154387089ade7777ff4de7131393a19432456717fe7eb571a717c5938e4f1cab34a82151884d652f3826c174dba3b9172d295d3f8a0516dfc552941aff56192120baa5efd9a45ee66566babe014ed33628018ac4a0edb59a1332c6aa1d4a71974ff78f23fd97c725fd7a3d4f33199289a94a5a57e18d14091714b7e16690b86648eb67ae627c207676ddc3b8cf88697a27805669aa57a4d52794f22179cd40167202a9dfb6e61d50580dd88b651fea903920096a99f1fa56eb1ff00aa554cb4071d9d0485959f03c1786f6276244786444c5dddb0ed08736d8325c0da7cb9c5cbedd8578c84c5ba23be5a71d659aa55ed0de6e5b9777dddd556870aacf9645c3bf8a03d19231a21b4b8665eddd96f3f873c6153cb25c60b3091ef842ab495a2e0a6c05e325ae861fbcf5ad1938ade6b994397d2efdf2a26059e23d95b9694be4160fe63e21175a1806b007101553f01ab8950082c8df256dde4ebaf4785a8d9e78c24f42e300b0accf51ee72e22d92b4576539d8a1767c23fcb11aff76a1a1b5894f8b8209ff0c466d37dda23daf50ff0726a3a1165ce93b3bb5b80722e32ab1ede4358bf466cf6d66fe5f3e663dbd533e55b87ca5f72f0c11c93cac0b738b2c1d4cc7b130dc9c8a5301eda81a7d3a69737ef2bbcee9a02f2567f37eaef7457c7dc5dca25dd4d635a7def36fb8d25aaa3d0eecfeff88df1cdd1e86df7bd2ec3ba60bcedfc9c42ef7dc021b05dfc1808df19201a6c6694e4dbf69514ef08ad1d21c7b28ba034ee9397607cefaedef5e9d3784db53a21f703a22b50d5dbba3a8e8579074c1a8b9a782fc5c89cf61a047408563c476110fe77acd9df58c2ba1d3e6dde83da718b8dc6cd57cd5e3e988dd2051cb679ea1af16881690b44acf09e54615eeedaad1b11a4f97e53de8d40d82a523083f3dc2917fda7419c41a14405f9e9610ff7d7226c3a3ca221c3ebfa2da578fc6b5c3f24b95fa8cb5af9aa9e99548e4fafd7f68ae7b11d2b00b660aed36bfee6365c1cf21fb60c6e0d11cee6a38ed7909622123aca312581b85ff54413a36c58ab9d7a7d912959917c3416046bce4d8c8c81341a5de1da0c1165b1a435754bb993c461ac57e0199e700888e0393d76ab599b6212e8eac634d3719db6810a2171b67cd967b804d3fcb1352f635503dd56c41aa60ab2747162c52abf633e8a79e8dc6beb96fdbd101307641073064707f397a308ea04a662fcb0392191b61dd885cd399e226f32574b3a3d35f996317eec98e18f9a26a8216c5c45cb292fe9c8b2508ffbf1538c300c1167a5de4beac9a79079430260a3361891f7c314f219d0d72f1508ecf4f223be558b68086e9a708e46162c0bfabf2a6a17f7133847d3795a3072cffb998db9c9ce5087614668fb07845e539b3b2383c8b5ecc37f753f49a41c4e580789857995445f09d01d7df37c10f9bf9b6cf8cc9c357ed9d0c687ca1dba53a9f60d01ec8a7f5ff63c3901e054b39078f4d5658a4d5d565f1280d0842dd427ccb26d29981146f9568fe31b48f735cb878cbe934743f61c5c2fec45fe3d3072c921f126079063d532b063f3b5cd5e51f34d6fa98ae6c778d90e520bc0b398dda62de120c1719c9a918701b2ae3ef6cbc41e2fd0dc9e9a10dd97fa4d52f9d10f6dbd843e4c1abaf07cfc0580bcb2c4e003e64830c4d3358f70b22b313d75a6b126b823a932f58581faf7b68465919139b78f00f0caed619b9a472fdf0891de6bd7080689fb68c4f213605ee73443257de800a0397654e6dc643e4c803bb440e48a9475052ddd41eecf1f43d0ae3048559e216f3251708cfcd57fcb3c5e4596c54644b84552bbc21b371cad685dc0c269e2dab704e2aa1ba0f6f3f43afaaea6b514001672f16a10215240e6d7c85c5a60bb13bed6b1685a72cd800ea39656395dfbb0d9b49352f3a929713544776adae332b4ced14713121a650f639ebba51665033c4732bfdb325bc298e1d7f35408994ea52d1c2b140b40c3893954f0030774348ca915fd6d97de279e33bac380ac2b17ce23e1e5d10d8bf1d4d9edbdd8d23297894684d570e8db606973126f5890409518fa45feb4e0a3f6da8b90aa8c4049331968a8d04ceef973e3e90a80427b81d169f872fd244b31da8196654087195e102555a9756971e16af3dcc77d -MD = 838f976308b3e38471c3b4d8e5422312e4f56429b381f91b39bd27aa471e91a6e3ad8e313c64e6987792416c44a2a0e06afdae11a946af8b12c62f57af73cad9 - -Len = 15280 -Msg = d2860f7959d1d18e4ba3a08b56c5b7139aa164880349012fd7bb268e8b641d19dbe2960e1a0e9c9ec63ac84d5fb7b59b799bb3e411c0c0851d10b4406600bbe29a5b08229d41c8cd216f552076c1ad75a3f42223b5b1539f57c75ae7a3b947203878ce7d8d713c6485caafcc43e987ea3f37180c9923a1c5ae69824aea94a91cddc14ee790a7e0aa19d43f196d392b4076e9fd68651e943e4a7d9332e19bca1eafbff1284eea9ce906146bcf9db981bf6f9438ffc1ab1354528bf56733d5906dd9f91f077142586773139cb57a7072b153bf339953d0074dee1c0fb1864ae45381f8414e9eb7fc6e89573b94ad66e45c49f355fec697567248b74bd88303af16d042bdc37f5270446f6aae34dda3c00a7ab706f5c008e90b85e410a3d107d7ffed61fd2fbc1a9c314ed45f5db330ef010d93ae48e92aa860d02bc7db185e465600dd6759fd18697f4e1bb4d7d61458892b0fb5bdeb057bb84f15d6480211e263333c650be952bd7496c91769f057e2ecfcb4841d6ba14b5d2a29a6b23527956dac085e0b28d2825a4f65efdda6027770a709812f1407fe958aef9fe159a845be93c8ba2263a09e77a078a4f9a21bfe5f559715bd8b3e7ea997f0299d179ddc9c1105e01842c2fb14b2899e868cad5eff2de4a88d7b4eb1e178b3adad170d41504e463ab56c427f78ad20444b0bbd8199587aa3698a40818456c191da00005c2271132fc18a2714edb8c60012c8554e74fde16c17601bd5dc58a03fec7a7e1559a2f42703437aa1b9fb0139a16b7cadda459f6d5fa6e7942fa7da1dab2f90543f0b728a4440420d259f5c58c19b3b8611583e0d0b04aca8c66af795dec43d011ad114c14c28874279cc5cc33a0099c1625d46b3e12173f8e9ca7d0e4fe48e04331f6332e3a45227fda98be3d4439e47157c3dc9aba6436cdfeff6f0c4358945d21be646d15caaa4f95f7020570c52fe72dfadb62f3a25ecf200e9a2065f38ad3fed2565ddf797a1b41593e38a02becfc1ab1de2368620606825df8edd0ba322c1bea8f8d11e210677f47d9236cee9a2490b16b587323cb08a885f1b10e1d18da1b6f865737851bb8a24b5972318db6053251f97ece581c5a04ef1b16988cad728fc9c168cae2ea935ccc35819879def2721c0f02b47f885f2a21db8aea996e69bb91c71e367c0b6c015303fe0c336390d2881280d01a8d9c7aa6c98a8eb3ea4451401e0424c10cb722683b23f75ae254d62eba75abb9aa9698e65ba1ff7c9f86d36d1ca6f0425d19428441b00450e9a2ef685d5da1cd4de1e779184db743fc95a461797333808ae6e42fce1e9da5d82f90cd71b54cd605e2f8d765fa30ba801556d58ae5690bf4c489d326cc3dda3c4f7ce6adf92764613e4f79eb440640d87a6d31e79a0b354916a606e2455f5e8486d62c58a5abe8ce484de91e97b267543959ff05fd94ace671bb4387169cb35f6a6f07185754d3cb85969d5681af9e91d6afa57c8c8fc36b5a5c119bbc50691b6e9a1f437abcc5d79a9c1f497e58770fd6c0bda1c367293634eae986a324f05707d9cd807c3e3f80ebd0d76e0a67512cbe4fb01c4eb54ed585fa43ee6784e980cab0aa45f8739145fdd76e1aa236ed76f1af15426af494d7e1fca91975faa5272bb13e1a6bd77b9545024bf5c2518c8d156165cab4af9babcd8491be6af0c3b8af5de16432e44efd5603e9760741becdae091a0bb830d3cfad04864392f1b5c3da094cba0a249bfca53ecf21dd8204c70ff8ba8bf232ddb2051f0f2f9a880bc71065c8924e12e301b725857fb19cfee7cfd2cfd1df300a017a1684f8fe3e2630f6d5fd637b29a4bb005a74e62fecfdce7209b263fb82f92c508d90361a5ea5a001ec53d41de35177154045fba51c91e97b101ab8b3d61b913d06b94d9b940a82a61b543aa2ea89c47a695136bd864ba76f785156b493f1ee93f458c5ee68b55777e5772db679be2184582f1dd5c49ba6b3c50eb46a371c8309f907357f3736acebcd4513a54b5f2ce77f48279a41f255dc689b584149ebfce3673cf2ea9a2ee1664546830bc9fd34f85134ca57a8f0436df59fc8c646e0cad4d172a4ad0bde939befe402666018d85b706d9caa4415eddcde846c85b8bb6b32ba40b13306f641e12fb60821b81295654f6b151ebdc3b3ad85d1e9fc09ac5ca1a41fbf1905d65ada87350ada3caaeaca60a5aa01709a4354ae109795d4642d96016814cb932f7cec78d9910c682246ef36b5e21f06f9fb6699b91bef83434c8464c258c74941f69b971c2124c5293848440453b3db737a57fb43dd75a0fa37f140b6f19872ce766c448531afce104d5a1b29555c88871ead253952a4b7d98e5127ae85cbaa156ad313ad5929fd87e4b91e9d8d9578b576daaa12220932619e488c217bbd79b7427486ecfe1fdde0acd9e0c952eb367f01751c66b22f9b43163bd0a849fa4c44aba500dc96fde9caf440e4355bca4c544ce0ee9f99646cce54bfa7bb871ebc1df4f933e4ba40ab975962ab89febf24d5c7b283252e542183f82873d3a97723d3ccf572adee848de64ac3a90fb2364a63f07e8ca0078b54046f1ac77927b02de6720e5f809a362b3856e86f6f1ccc379f55896d98bb667ec0280b1524983624c6a2c85d1553d1edfdfc455100a4ed76d87587a86790620c37c18ddf5e6195c304dd97edd491e450b7a -MD = a163a7136bcc92589303cb15e26bc6ba7abd91b8ed194e2ade3d47f381191dc402e336c4c1aa8c0f9a2ef4149b1e3c2452d195d36aa3b96451e5059f5985ca19 - -Len = 16072 -Msg = c7fb2a67c42197c11457c8fc39a2f974f2577b44bc8e5a5b97d43ed30d208f7e7109dcc165357ea59e15782beccfa2e0747c07b240948b02fba6d1faf54d5b216e5ff32c10674a18bd56e0758b7523050d9edb85d5acc5cb36307e114f66a39144673752cf9f4541f882c683207bc40a4425c06680be52ded2d90fc02152aff57e8770d8a9c5b549d701f3fcb2c9cd17a27a7efd4bb2786457084aae75fbc776a1296569a7c2e357e23b2f894a478656ae03ddf13d7080854b27f9845248333c37b4dfabcf7c1794a29941d2efdd37edf029a5eb5ee1b268389de2e9c1213a6ec890a6462bdc99279e81f37ea9732704f0549d92b7eb5536a5d2ce86c86e2634da2482e3c3cab0395e5c0b3680f19fc437ed8e8f4f77b3161b2e840372173db7f7da3b2a9d2fa5f26b9352a17d3fe7544c5a40892f6e12312119ce07c405c81fa61998c2c3f1c0794c8c9068a74547ddb7057b295db6bbaf3ffb723ac81e0e94704a62543dfa49f789b18d3207ec078701540717e339f6b7fd3c3945854b593ddbd3618711308893ab6910a8a31a6e79b1b1abfac9dd0a71e444ebd00375ef42711d5d04497dc576391be37285b8c5dc4f83307a158c41067b7b50824b8219ccba901e72edc847c7bb31cc37b5af54d763325f40d12de19e4a4a2f04645c1f033d946b7a03f957afba12949f39e563937626fef404a83360da1752fd56e9490e82920ec495f73d56bd2603541b443a380fc6d53eb7e57f75b24b7f162a13df1511f0cdf7aaac41e34cd5e0fb63b321edb77caec4f1cb0d055b4f7ff7e7c02842731871bb4bffab7fef87f53f17195fdaf5b04f31ba4424375b8a1a4795da6dbb2f70c2ba7fd8c2512fa408c541603d2851c8812b1a380d333c6317af3d48f6a8cd6287994e1fcf829394e238e86f03ff532d0c5a1a8d1122854440d6e5f20b32d5558a03c0bc1a39a4bf4b3e152ef9868447b868c12c762cbf945b6598c0f481d0b1919ede98eb9fe88e0a7fcf8566e66b7e4dfa18fd847871ba31035b9af8bc46dd6512af998adce967e9a51e5c9446913b92bb25e8852f23208a593868610bbd43ce083ba83e172fb3ae550a9bc9cf7ce45050f2d6bf785e2d2e0e36127597bf4a93288bae517840db22399c2a4ea9b6e34f6487ad7b7ca849e4cb5d807d88d35a7e19a6910928a6450df9dbf16bfbc79e579dea5701628cdc7538b69bc00682db5584943baf4fe95b373dd0d967ed357f30a325ba99538f4eaafc484988385235e1105e928a148f8467ac81c88ca98aeca11f40c08b773b0849c01c731b46cdd1ea660b80e4a0222767eef8a720544d4f74b941501ef517701a2b3802c2597b15382da3ec031b2aaefdac3d5f6c19070f6f1832519cf6abefe7e6a6dcc599e36a920e2fbd30ac2d80f28e56d6b81e3f945be51aad4ba180ee76986eeb6c2d8d39c1b1b6ddb37bb5050d3b4df64c8b7d46ffc7024b741f1dd390ea9615ff3d01e88ebd4033d4b149a5185c2aa66f894a8d2567f1135e970a07fd842844c5f3c8e1bedbd6a7db7672c8d998f3cd6a402cd1936cefed5332d0f3850d2b5f0775698a1cb27e210ff1b6d61a98b25585d7ad7a127f05c19918f6fef02ea84e0deb6c4d6feb4289ba4ba037a1036e25087655f06a4839777970048f058ea6f91f7e5a917e2d2ac722abb553368230253b47ab9b636e95f73b6283108dd62d488555b9bd12213dc48f3a7f93a3bdff3d666f37e4c59a21292718fae851ad4623869a143bf36e83664b20855daf5be355d01981315773e4f685b7f17f16bcf7726c72f072e9bd04969d844f1a2105e455c26b12ebe2a2e6449c6af03da7aa4a1d7d07d7cabcb6c93dcc8e6633c2620b25848d717b2ece2ffdb557808acb20470c028150ab3300d9412168510e5a1b5fae5ea8264703a0c80718a628ce49c6f5274208e47d18443c8ce4379815b1d7e8d698e4bab929c0b84c0d807171ea435c5787c219a83129fb045d26c4af8e3faf867968b43867d507b2dc0de2db7640848217da7a9447581d93d35a5c43bafabba74a5d9c2b8787bd23cc740374b56476913b768caa2178aa2090fee83bfeb1151f54eafbfc4f80e38626de5ca56e58396d3bbfd9508932ab92da38f0fe200cc3d8dc385712886581c2337276d46bc3d5fc5fdce8ef452e27d3fa30fdf4e8b2cfb82d6f3bd5fae19dc13859d86b724e5328eff541f01e1326ca38109685204c40a98eb62cad6c9a416a80ba0ad04ca1bad832346db9dc8ab05fdbfd44198e811f924635b402a73874a552be956dc16312f471bff3b4473ace7a2d218e18fcfa735a9e155a3c74643f5af58c00a8983c6363f4be5b4826cc870374a4fcea305f44ebde7ea6c399c6a871b24ed3eb9bd6b60f035a2edc43e7e4e2f9ae16f7f2579b2c4e972100de05bad3d129979d90d612dfe6baf2da6434eb00046565a80c8a7f05358952590dc97a669a47d32540e780bbe40832a9525aa643dcf4706344a1f85edd7bc237ecbcf21354d00fed73af078b476973b1d5021d94cb81bf9164440e1f8c96f703458429c349ecd35cf0d6af3755073f5ab4d457dc1735db9b321aca318b027b23dec9275cbfc1a8da810580a8570a1d0cb9775c0109374be777cc337a22e6d6017f34f5c7ff7a15cfece483c4949a962faa9434ede9b097dffa0151e3986a8e03f26c9aed513da3a3fa1abf7456dd312b50d2e886ffc748ea85622d5437b82d93fe1a1eb5fc32d8bf73503ca1e3fe766873da7eb692a5e56fde97ceb645f53b186ae68a064a833f891f2d03318523ed4fdb530163ec71f6d8ce473def0b4c3efaff77e5ca81555d -MD = 0a6bd4a3be10c690ba358fd4abe6bb3b05c6e74762ddb16c96122156c6104102a0f4da5d119eae98c369b4a39bc75f86f76b829c7efa5d35b8c43dbce18a9c45 - -Len = 16864 -Msg = 11efc562e14f7a08dec506d17a527d537fe51ea046c528cb292ef0a83a3f2fd43614a0f5b42fcb43a21c1b48f25437e391638f93994635f2c717ef802fec8aa22efc71eba1037e9954e80f63be9d5d72eb4809adb9a0f83947996140ab4324f2e3ef5eca0e953a13dd720aaa44f5960575dcb3740e9b18a791fd6e71160da6cb3c378f1c65aba8b8230233a6ed248aa61769b67201fe3e458e8b3d9ad712b736211b2d680d0e6f900fe0b2de21f1e25cb9353a2ff893111a248af743581a003a7ae260376e8638a38953b0da49264630438966325c203a2e3c44c3f500ed29df2fd54f10f0daabfa7aa45523cb895d289dad6203966e6089bfffca363752d92d293c237bfbd46f9cc81cc84011e3d04fafe9572a0c452c34930433916513b82d4e5f0300f73a2d915d0132b981fb46aa62856d2f286c4636a29b278bf2f66fe6878518284cd58ce21f9bba17859b68439cc8cb9b51ad5597d20bceae47c4a660bdf78a7a626d3596f83489e18489de2146fc9af6eece015f0d9e4f81ca4404a4d6fe807fa2cacfb5cf12c69fe68e4f4c496701c66998f4973a9ad38ce44032b9bce022bd72b303488b7e9ada127264cd8b51299529d3d34741488158fd7ed8a755e599be3bf1795516c02d1872fdc4abf60439ea964749750af0826c7ec89d778b570d0a664dd8e75720a6e46df717ee71c75a4e18bbfc2b7cdafd50cde42930447ca527598cc90336e62dc36b27079fe3e1b44817f99470814d1b8d549a25da6a9e8a9f7e79f3b39b59ec3fd4563ac4369b6e60fbc7ba4d009304aa7ab4397ee403e4fa3cdbfffe6ec208df114c5868513db11e2cee16c8e2f2df2fa6f80c239af3dabefa7994ed9769ac2b88d10a901c0fa40b13364fec0db3d4a5423047d174b89475221c5b86ff96feaca2adf8467f5870ae16660dbe6a1d0d93b52291905a993ba61b8cfbd38c9126e9c7a7c99162623c8f9e48fa48e17aaf816797936934ddf7da4d911ddc27a14d6b6089257aad73313714a2bc915b10e5f7c056f563eacdef9820f369a8b9109bb8d319b60748d4772dde3dfba1be29d57e28295e8764b14c68fc79863f2824375a8a2021421bcd35f966e16081f40ba79d07d676dc8bd135d249ed1da95e264ad9eb6511330fa5932412559238e3fe84ddc526e66a4574d35f6f15d5ee415dfbbb60b22ce10aa6ba354c633ace754c94c5cae156397be34e96d6b95717bb13738a50cd1a54f516d2b47bd1004c903bfedd7ecf6d521667cd00e6a34b2cb38ed9cd237f8494b93e022a06688bb91e15ebad4ab7d4bcfc467823089a57331018560d409012aa3c66731e57f0841d062082be9463337f17c87889a2652636bcf712d111c86b9d68d64d18d531928030a5ec97c59931a44d37f5ba1ecd5e3c9e7334a1fdef387524d5b7a0e8f35eeb84eb50c04622763188d9163de29aa84e9ed6e5056ccc203a57acd93ff8fd9065ea3cd7c27ec6ab31aff804995894ab73a4664c86c628ccf5eba4dc7c6d18cff74adea824d44c78a9aadae759e68210b3986d92ab74cbe3aec703e8e0b00cc3a88c1aed6eb27e84a361c7e602f62e7e166231defddc7d0e6bd31124f227a115809838cb297f227826bc09291eef5e9ea5ebfb59036706f536f718b93a3b9e6d8756806cdca201fb3ba3e7d93439db186719122a457d2d3f161b5ecf4054cd72c6af3af80f85e3b6e9fea81ecd3c6d9365d5c07b4b87bb9514272c8c8ddbf4cd4489ad964a8f905038b5951f705fdbb7a5084b719eeb799e3603ca1ba836dc2609ce226f1628cf7230b0f605a50def2d3198fc36c5132c03869880a219cf4d231e64e1abfab869c4dad713f7f5ab6f9d116f1bf248659f6b0ccc964a690d0f6f8a3532717fa727ed3d13331ee6a224ae4b73f0ccb04b997fcf88533a1f57e9b055275de92b5ecf96614a9fa2025ad609e98ec2ed832ce1e7d7b5019bc317a48f8824a93d894329664f65a0aad13b4d56f2a7db7d4c70404a2c39e694ddb408b32a1360921ebfff060e4d7c5edaae503c6fa581a3907e7e50d7fe4a4ef696ddc543dbc813743b171da6e87be7a519a9636772fd87d9c063a2dfea77f09525eb6cdc6629e5121d3a542020e76dbae51e74e2f59752ae9db6e84ce7b4a343c9fa51fb9bcd3380ce305383dc0617a27b7817e916962c987d41c926dc488f87ead11bab62fb2347b7c1c1d704220ee4417ef382bd443c1ec8caee76b07cdbe9f03973f1a3faddee3fb547257f817a08a1fab1b8d2e7abc8e71aff444d98b0f143fa01d746138afdcdd38c74376b829602b2f8903dc8a01e40f9a3969ae435284bdc6c64348e52fccbe439cc132a4e17cc707114e62f44a93c2f82767fa7931570a75da053b35c74a0b0f535fb05071366fac44bb663bff0438345ebe42bf1411b227b948cc9d1edb4ff69b8d743d5103a18983d93ae387bbebe94fdb1b67832b2166f47c81ad8ed6f993c5c8f2ddf98af9495f36656d7d313a816b5ce914f729f4be0c1edec9afe3946172a0c0b4e322d35647418a4c67fac09741a2404a0894889770be4883fa77acda228342549671cc2adc88fe02a07efa95635995690fd1798dc2c9636ee719af78460f0c2f9bde50417f8b5522ef44650620c16d14958723fb62cea3ecfe2018c66da292b86beeec34b0b7142f7cd18c543aa84bbf321c347ad14c7e70b841754ef9dc5a917f2a0c6f109aaf7b01acdd19f14c95db5e171796aeb177acadf4516c8b1ae82d4e063d7b0fb4aba7f64cd3c1f54cfffb81fe49b95b9c13f3379f19c981ecafee610a0bc30e838d38c317fce6a707ce924638475d687ad7e6fdc85ac08ec0367750abd3e1ad85c8a000c4d4e2973ba622036b9d1d35cc37fa590670fc0243f03a857242516d39e26037a9e86036270b3d41eeb753740eb89fe1b018d67ce681ca87e3b39cbe2e6f1bc05db3ca147862569a5822aa83b0de6a207 -MD = ca2928c7468e8e421b00fb128b1c114a983745f9b20521e8c8954a68178ccefc2e81d0f0c49255157e9b86cf09e59e187ad938ffd35664f9a3ddb471b85ee250 - -Len = 17656 -Msg = edf5557e15473b747a819398c9ac1459ffdb4c97d0072c124a16c723b63d57aabf888147d6b7dacdd44ca9f3e1e2ef4d95c0a47b5eae44a122088a1725107b612c88a761e381accb7c6efbda997cdf416c26bb651c0393c96be3cdc9971b398c7d1d5034044cb957b90e12b3b722ec1dca3417bbd4ae21736fd219a3d3069813fb6e032803c00a5ad55474e7047b1fc9f81242e64c57f68874fbf50ca378a1deeba448a5a786a6ba1669abdf48307f2e3ee9c44f4da51beec386e96ccd195bd598e6a713b7469561c5753f024be81432e3e1235d9e40978fa49c7d2c1a92cee1495da9dafca7e035299fb6b7d44ce7be3121e97709d172515e653ab2528b02e84531d5623e528e208c109a68ad04ffbb6ed29d075400b41e3b08a7673dab00d3d589b31344efa70934f0727c9cb7650fe31bc874487466dd81ad4db3a29bcf8b418dcc56d82534d76a66c75b6a0d1fa4d825f126add69076797eb2ff4b0377f7d167a791c09c3b74769a206ddfb037609517a0854bcd38d06ba060b1fe8901fecd3ccd2ec5fdc7c7a0b50519c245b42d611a5ef9e90268d59f3edf3384d8748a7c37c493aff0ddb830dffecadd779ff28656b1ea511c276c5c7eb5eba596d882277d162a461c872f6d3f94e5f6ebff974af224c049c47e7dec886c43286c35cd16394a59522acc14a1fe4ed3d64cdc03f6173ce39aa273f195858ca1d70194559191e98a9ac1b54f1243b5fc45403f20d1ec83bb0c5d11aea09d9b6f78fefc01e0ad7a24e78a48c908374fc80a6f2fd5259a80b1669e5d9d55f72314d40a76b94ab6858f012d8f68cd02a7a0ef83b40a3848bb2b720c61a6fbbcabf8b3ce096518d49332b0519215a8cb42eaba21d6a7541fbd92f65024b2db13bc83ddf1bdee932e2b77bc9e58b9e0baaa0f34f39e95bf470d4fbb11aea73e25dd1d191c9a3a00edd5c5ecbee93abef9667825a113bac1e733c889f8086f6a1a962e30f7a932aa38198509564d828aadfe8c55d33dffa427b86727ad39f0a8196f1eeb29f1bed838801ddb118c778c01fab28b30254cae3023935fd749143f4af155105b7ac7d11591f62a94af030b1be3549160d28a292afcb3f71e41c179d6a33c67344d33def6d578be8abe0d512341d92d0c4c9f5b3dcc31b82c28e19ce50d39ba5d71ec4703d20b5f99bf7ca4429aa928dc9c758d8f19746aa6065bf19eb8b5cf7deed854661218d469bc3a4d9f782c4977c9f3064b6ee4d537e317c02a2b196f3dcde14d441d05e6a3bc2e936462ca5a86db00109750e9c085c8fd51b1eecb624515ee79c8793c5defc840c0b6e1eb21b0db86f19b49ebf538bcf5eb5a8a35703ccee62117b02301f4e7581bbf7cf7689ed06cf281e0523af9c8e7d74d86bd61cb01b38d5c4a24995b215eeba7bb56f5f7c29a5b6e9e865870f3bb5eb36acdfc99b53c05bdcda6efcb7e3a799626709064baf7748c09ef17444559c6b4bfcc0a4ff269d162c311c9ed07d50db346ad038dbe6d8403abf63e1dc6a957770c225394c0223874b3ccf069c315ee26a2761519d9e3d5fb0c0197a57f945b25d9369f11284f831b26412ce6bbe36618c2318db11042ad9bb27ae881770018e5af72b66d31d8fb7ea3d7440cf528bbb12f4834fc6d70550b27c7fa5cb6d7d7e0143d6051e4a5e5c6b2f602857bca36187021d2a3f7561574f35295dc45ffe03d93ff6465479f8c1adb062cf655b31f760d262f4db6dc34fe9c8180a92b627b25b1218b5065ac37a3a76f8b0a89c9bef28fbd12a3b3ebfcd0acbe856c70e6f0c0f8099dbb43b52d899d9ae76721f65ab57d50444cf569b313ab706acd1d758635ef20624deba3b7f346ed08b524203de65f468ef18440a2ee1ffef87339f687ad1ecea1af645c1d0928d1b59d9b31adaebe07b63a6956118a92d2f707cc50394f0e7c2488b6caa7f5cdafb8c68d10f33520fb84ceab95480e8b532f30df6de5444690b181ead49ddcbdedd7da02a557a2108ac25652e38ea393e968977834d2b34e741142066146e97ef5db7e03d8201d131c3679672a2d7131fc69e4a28d4ac5af8e0c72155beb419a2d8b5c969198d0b319a9e0f1516b9fedf4fbbe626093a2f04869b91ca9d40f99ffb11cc6b805e177e9e433f84091564f3ae6cdc295f6719909f2c12533497901d213669835b078e7f4ac1985dfe6bde034f2bac915bb5b33386d2f37e192a75c0d7be016f0e1be8ca2cc3a9e16b4fd274be62d7fc62a87453fa3ae5b9bf6c2311aaf3547d2e0daed5c0a3f4ecd413dace78ccded918b1d57855ce49849bef20960770b33c1f4f5938830d09aecd7a6f871aa431a5e2547f1725f79f6d3335e6b479d0be3a66637049004948c5bbc60924f09360f16412b9c6e76167d219a2fdf37e7dc5e6a7ec7cada4f342b02389202eb714fd29f27f1dfe16763361b3e8ced981f26acf384ce6dd0d8577fc99564d1acaa366de31fc24333fb0728aa669e1ed20b93d62bc07373d869a6919919ff86f97b92e7c971c64fccfaab5bb4598df94d74c9e3f97adf665cc8c968580e8ba93cad0c493864248b152cf6d822608007722170db44f939cdc3be670cf0ba2fc3dc084b9a1a41057f745991a6ddc39fcea7dc31c7f686aa31751328864766145b4154f8e2565090b4524823cdccca13d8556bb4aef6695a19da8fb6dd475962f9d359ba2ad4d9eeb118c25556d6bd04ade597a0982cea700d5afab619d7dd4025fadf3a797c2446fe2c8fcf48e5e399d3bd289d8d805115955d1bd343de38d6681ead1fd73679c124f87738abe085fbd447e65596dae5703a4bbbb36246b34d49a78c124cea1f87aae2423888aeeb5238ea996dba22efaa838ca2fe7ef696cd51fd44bbe1805fbf1854b779e6395dc5850d08900240b7eaf988985da0d6297d06889dc19de08191f7b59fa0cd68237c451afc64741c855922a76577ceceb486f2b05fcd89f2cd26cd6dc258452384a0ff783d911b9fa11f8952d0f612c67e109dde5186ab9f8aa625e4e8475752c9593c8f93c0fcaf5263b3efa37f74a6d0428e783c950dcd02398481d9150ade3bce83c7c6992135e24d2ae8a4bdfb56f2444de8e8a1b7657b0574ae5c6b67 -MD = ba3ad050bcbd2febe8989cd0ade135303de9d9a419daaa647f0c89e2d8c78e1a701a4f9ea3ade33ec68b28d4a6e7ff15d637a1a803d2de1ff35b0d4298519cbc - -Len = 18448 -Msg = 8714eb9ecf8bdb13e919de40f963d7118fc580eacfe9acddcf99cf2140d1bfbf5119bc8fd011af63924eaf821664c9586544016b3cc994916d8d8061830146e7a5bdef9cbd144d94d9ec83fad1ccc8ba2a37677d3a390ada8d3f39ca882c1e5d4ca88bacddbb3e0f849c639071c35a9fa545bb070f619720f55601469678cd8b0e8398a9792f093b5b05552c4070096f9f1704f0046ac2cb6e7be1bdf610ddd7b2f61f7ad998367f28d064b684fc5c92e0554a22617c1443c056df15f11ad6ab02a82607451d4d45b1a49516868fdb7030a695846ebe14f1b38e0637cdbf3e6ec442b83805e6d7f4bf2af2348e4f0f7157b2eefe73594a3b0fcc5b0bd2269f88c16bdaf5601c5cf31a0982f8e3677ffe1c225c78b7753e8a9bb7e8794a788061c1cc9626a0e762ac8aea4d4bcffdb47d489ee8da8338794720f8b46a7bdc6a618c0df3b30b6e7386d7755c13983a3458a3cd990c1fcd82d86636c7c4ae7be4f0e9d5fa84eada16e9c851b63a874589f5f55877f7d35ae1a7351a2a712c7c7676a1ccb1818452d43d272763a6e4473abe06e68a81e7081f1a554ce4573a08a85b7c9b229323ff33ebba9e6c41f767d0199e20db93a2fec39b8d73fd602347030742ea55a00d09bd594a5fd8f107ced27084ae71164d655591a7377e732d600ee2bb6050918b97faf09e11afa05ea3c82a813754f030645d6469426e77a27c5155afa61d4fe5d17118805dfa35420f3baf5d638d0b9324647b9c39d556c8c255c6e564c4c163e0aa3ab6ebc098fc3ab267e0dc234dbeccf14008c7bbf7e85ba19e26414bce4dec2dbc096209b1d44bb5bad1471ea0f8858d1a74922942496ebe463ae5bc60ea1c8308416bdd68116acc10fa4f87eb8b77bf71a942261f35243224e9f91e5e8399338426ad45a5fdc180d1219a6516bdc90fae7080bb76f2a587a2fb257aaf608bc59a7fd14850de7558650fd0c008d7a405378ff4ef2fc91844273710d73dc919c1b1167eef51fdb1dd348c9aa0ab202f2a75ce45ca3202a5f21a66633def066bb030b15d4190a29b95a760a00ee6e29305d0f71b5467e57618e550c5b5ad5eaa1a81191546f5155b0a24528911a163f71fb1d02096b7bab03eefbddf455f1bfe850b164f06699d1ac4142bfdb2c4ed84fe7e23fa9708c87eeda07559f8ed838e7b3670b38ad283004ae0b3a6f838c6612ca1b6515f445806ab603fdad340df83836aeee8d91a103423eeb229ebe336b8318051cef751b2700397e50ae03e7604260f5997fb2789dfdaa8f03193ae87ae9385be1866191ee57aad2d9226d0923aea8d7967f9e33928f4753464f981ff6ddc16c4d8b482e48d9a0ae01aaddf794d5a4d1601da346738fbbc486a2445e81d939d2ab6ea764b8fea17c6497e517464fbb5f80ca6045a3677e7f2ec1ce088e54181b9590fdc9c13f23aa6c8a010cba7572ee631653a5b4bee5dfb92ea3c28ee6d2a396a2b9b20433bdc493e1b02c63ff521aa1820beb29fea862b0395400f609f007290479d1c454c667854f811ad545df40a68df78a759f2ca49e825d38762606b2b7469c9db41ad3ef9b23e24c70d1811cfcaa85082a28f911fe8a3dfd61c36d32ebe9c07a460e7ce94fff5225d93addec1e5852e8aa1474373ac164b45b7aca04115e53fbec9817d13e425f5b70ea4c5a7627dfa087fa5480edb86ff1c5b473a2d214e5972a603b23c08d7841da5862c4ae8989c44632e08b81efbe2a32f9109b98bde3e081cf6d7d91413b7d780d97d7320dffc86766cec381d7ede225c1176affb9dd4c855e153b0afdf762cc8281fe8b1590216dfe65a587f16dae0094fe7d5189404f9794c8e8a8245a966a5f87a72450f973bc724bbdeedccbf265fd4c5f58bcab7e5afbff02e344c38cb3ed3f6d88107a13f56af78930ea7733c862779d5fb47d3d220c3e1666efc0ba4bc40fbe40f4b0968b30ef73f8bafdf6aa5d0693e11144109f4dfc9f8d85e0b3846c8f15c97e3b8ff07c9a2aa0becebf8e558fff77538ead2529c10ad19791ed105f14009c0d5954b7969e09b3767802d6d46a2cacebbb57462811e4dda562db5214650b3332b8796327518dcb72784526622b97dc5a689394e165ba0c2fb212dc14c8a2198ed78265a75b4333234e1aff775aed9010050673be3306d7a72e0810d8d541d96214f4518f11b6950977d8c49c5e8a62bd1f1475371037ea9c354f92e90176dd5d1f4399472b546ba574231839dcfacea225421be473d99f8f463dd4cdd3cdafe044e4af77fea91187c16e5ce82cbb2e7fa613da4ed47870f0ff7748efd292cb9c347c269a12214110fe3f252fe4482c96100e22cec8710951bf7071d77482bad15c6e7115fc5954e16909e3698a2e2395f195a7ecb67fb33214bde21d3009f8302b40318413bdd779c0532a3d94d9bdffd94ebc3124e129028db41c19ab84fe292f75ca5cfecb433a62af5c047ae75624259de234aa41b55388f782553da0473ce783ae19241e12a3ee731b66c2b376b37507bc5fad0df29594fca7686cd86debd1fe7f411a02e056b242cacd02daba1e26209d2aa3c26b5940381dcbbf99dca67d5aa05d472616c36c930cbf91d97ad4d75d271e24fb8a0f093e37e7bc611dfd580ca3c64204306a5be833a7161c43680721ccb2b715c9376e739854d9ca9c60e0990c248109c7cc3eb6d22c063fae5814230080c0adc362de7ca18bae32e271a5944bf08ac3475953838ab6c8900625acb564f0e82fe301d7ce060490369a902572e5a2d5bd29a258e2afcff3da05413f7d5c8b7428b2a4e8cc18582641ff5cdea95bc3e8440937ad38d3e01e6a063b2adf79c92b04acbc900b6aeed6e1bb383fcc30dc39144079cf1a798f8ebc93841d502f3243505bc95c10703138a248a2d74fe7445e9a79f94cec1336eb6e37bc7563ff4f73a82a4bab6fcad7b1e0122d2398f194bf4300269542237eaaeb6d44d1af6c892258a2c41c6ddd4ad947b247a35be255d1aa9d8236914cbf53b09e9da086f967d5fe5fc31dbf19f32525a382d4fd2c003c3d8cbcbf7dd1716c5a6657608f18741515bbb92dc813791c26605f46f1511c657878167e5c644d5b453ee2902c5c36562b4116cb0d5c4524a6634d67dcd412d3e7ca2021b177aba71d92cfcde347171f9b7a8c841356dfe54246cdc624377c1e080d7a18118e04e6200c9f68484baed802e25ad76e95a1c4766560d04bfdc08a65ac84eff119f18f08f6a20ddfdc5625edf33 -MD = a86c70c2063f12bddf997c91d1ebb57f5c55ca67614f397c1c52a87b0621fc4378c2eeb07732e5eb0fbb4b3c1fdde87e9ed71b50f83eeb02cba03bafedc84764 - -Len = 19240 -Msg = d99f82296f56251e365764e1acf4d20728f89f546cebc6217d918700b3b418a30c2398fac5fb449c2c25ed68b020aa6c3a01ca06c0b80c48179413a1080a14baa7b2d29fe092cc1f539fb4756281242887978d2feb3b70593547d0eca0d7e78c5151185fe7a3256f53cca250ea9ea902b8c2d01818fc581a82b0a729a3a6f8e1b30a528403b7b654d5b59d4071ffa2c3758a7b0a6d842d55a3d9809f39fcb18174e468545b55e99681608e8e1f2d753365f8764b125a58d043ca4497886379343de84218180525fcfed75e831baf8c1a3113a92330063f54088ad959bb62b8c1b61cc817614fd34ff522f3658e0d4d4081e4fcdcef114ca89a20292df882d7f1868ae39b5fbc59570d47377c9fd0226dfb7158bd7602e696a2971b5b67493c8c563a79ea39d320dcef501112777f72684ac4a30dee6174e4c8f4962a3241505acd32734d181c90a64244686d3da2a4fa14e5c7157eb7605bb34184e47ef27b22947cba0c2420117caf2c26d61ac222eb02daaa1d4f8a11c30c86cccf76e326ae5220356f84660c28de0f329536665303bbad366c8965efe47ac956333f9cb7c4b024cbbe6177e77076f574f2b8169f09e866514c53cd6285a6140a5a04a5982d56926640e2d90c1d20e7d435c85a6ec7300be503d54cd270376ed08beb872fb1eb71ed3e3016e1f783eb3aa590bb28033ca6d9da3869a76bd6e0900d1cc9e61718ca470072b6d0c5480c8e8b35c03586b33e1519a4ad493f2b703229c0f3242984a45eced13f4051164fb82fe2f2fe183edc8108409e21b4dd289e27ff8d50add70719f0753b996196bea0d9bdd7e980858705ef35c695919510bc4f0020d46cbbfc60ad853142be6f602fd1eef95f882f478915aaad0ea0fa2f75e8ec33172ed6891b4f2aaaa5304a3d4b5e9ee0c9f6e524f5c3c8d9f5a7b58daf3cea4f81bad0b9321c8b2d297ecf5eddcaf5128d934e273141b7d4b06f6d32539123fb7ada52918e5dd1423672a5cace5b1a191527135725d79e26a9c0cb274a30bfbf6a54041b1559237134d27589045a367dc77adbbdbacda555466177737a61e523b9f18d5eb05aaa438b67e6a4690f70c40d534f5fd66af6ebf11c181ecd6cbdb0cf79966248a68d3fa4f9a122e4c1f1784e7c164762f7b67011b756312a9870ed15b4c630c386f5eee5504d0b5cb9e020f1bbd97d47bc106a0dfbdbb3782e2663f16ac6cf0b420ad6b7339368bb40664560d940076b012a634fb04caca1760698cc623d470622f381836b1b40e89cab6e029ef2efb80e2ce23e9e54248cb839160f65d4a19e6ed977afc18c9bcb15d6233fd1983d152a3f70428c9924213ce765203b33e4ba6de33ea5fa8f814cf510ed7f3cd9f7699f8b94c344c3b34849360b69ac011841683a60cbe1cbfb538280522aa55e279eb337d6298c7bdae92951925080e6451da705658b3de910c8064fdca8d5cfd49baf6bbedd2d69a0ec225e823f7e8c7435726dd34cd590c993c7a4136294d30748db51d545ef340d397d86619d6f98ad71119a347572692c9c0ea87ebea912c78d7e0ea2ca998429b982f0b9d21bb5f6b9cbb30f70dc1b44cc2282a525de351c52e1cdadd4f503fd5278c511464a8959f5eae1eda4db4f16094d5b1000f9e40e7f4db47fccc95790eda92cf261c4bcdd0db44b557937adac3cd55b48b5c3c6a6fc08eb9f18de28ea735b4ee38b50f78ae9721acf57b7dc0d4e03a9d4ae0484ebb15a9b9522fc1f14cad7526c2cb8e269726b75e3a6258541251f6e3c5184c5e6878decea51eae315dc656115acc224818ee9851ace474f51ab71d109080a329d64e805250c721df58f4ca367733765db263271fb37e5e344c640fbc23a60731a32b20fcebd5a75bdcdd63fe9e9de4f7d238f620f4ac9e82260d614ef4e4c2f65d734316ecb6b92747d495e24768188716b4880dc6dba07f360794318ae970e843db6948c9e6d1d2287ee279e83e6b8bfe8a5f2ec097fe8c0ae72b0c6c109ba814a7f5fb09e28bdcfd20dc3e176d6886d80eee1c787e1329032098480ef69d863e8d9bb6233641b8448ee5975b9199f851d6a74f34da88e6cd485e7cfa0811333fe0ad02bc5e8df49d0d812e0b277a70ea662d4fac59ca35b7c30003a3c1710f8735bc592bc7db024521516accbb84511031e286456841a651250f8492bf47aba3114c32080eb361fb7eb8c606ba323951ce699b7672a9a927e2ef684d6e0f7821f7df15b79fa1a41e5a39c85f902e9a2d9024f7d6254cceba8122374a3a22f5725de78cd0f710492c58470a2df9b3f4022b9713daecb57777843a7a0fb04cc412b7e7ffeab1a9b1b3fd82d3f8436cb78df552880b357e53fd70ba99047cc734819a62f75b3bb88e33ce5fee5509d3851f81c9bcdd9bf1b49abb051cdedc3ce75d79eb0ba911d73f2a2f5091aab972cd45557f3ac88cda39fde7bc8de57b185cf4eae2955ab0802515b4e7669fdeb4f08de4d57a52847254956b4364beb5e405e641ec2cf6b44e0074d386e57ae624bf57c48f04121f6484dfda3c39d1391a62b0235a5ae3898b31c62fd196e26c4c5a3158ee507dba2b5b5b990955b36145f3d113cf77d79cd249980e49e35ced9681b92685f80bf13148974c2d70dbbad149d777be3c198abda85913425340c68d964dc1e863233100ccf1582af3c0c256d511e3a8e04fcfa7ee87c36d8f4493bc386d9f881a7a06345918418456f90431163ecc123cd0d82b7cb2932ddfcee18cc8a733e79676fd268d6a9ccc22eafd1a9dacb57c8a5330b2e35806f5cd461c89c77913795f806261da76ce54e01d195dcbfa246a513d65c8a2e69377e050c13dc551b2cfee4cf260b0bb5ad10715e59531958d4e49f5e3e74beccd06a1656c0342cf865dbb3309cdb0a6c6a3105bee3b5f0d74aaad1337994ee9183498fa6994b05122a55eb934e34ac7965d8465afbab4d06f02232bdd591c5a09843f96664cae750c394165f06bffac4e62eba986bdd37cd0d7149651a144be1577fdbfdea58db9a77bfbbfc8a24fb35355bebe1faf2b614eac29e910fc4893d0826bdd3f39ee8d890ff63d2a20ab7b59986619e6f93d2c3d03bbaaa7d4a869af25f2750474416f2547b95491819372a5cd8a235936794c3050424192c4d4be25e53a2dcadf16dd10c5cd9c9b3fa827ec47838102e1703fad1466445e476defb942ab5dfee4df65bffc9b7ba3a55a0971a8eab95084a27517e2903956d6d49cfdc0be9c1d201b87977ebb88476d19a5fa544812ee8a909b053d488738ed994447e1ec5ea21b5bb14bae9638f2f1777bcafc0444297dbb00097707b461162c544c18dd1c2a310081211ec41432ccf3f987e2a7b38de89242793246575bcb1e6b6ef7d95b220bba65dc41c -MD = db7e2ece42b5186f84e6c1407593a9b9e2971aba7122b8167b21b31ea5f0bd21ff754e4fefba71c9327eeb19625702b64426acce7fd88467adc3d2b38a861abd - -Len = 20032 -Msg = 1dc9e32ac4176f64bd78a6edd651ebeea3ba85dfcd8298a8ad72540619d66d317e3acbbc2f7282bcfddd042c08ea9690d5da00d9a0c88989f3e72217770ce2950b6cb29013a64a3812045cc07cfd0e08c5ffae7abe6ca13221e39d616ac019f3e9e6016f16bcad1f24751472d9953d9e9cb0f789d075caea60ec2dab9bfcf99343301e21e0bb95bb5ab99608c7b70a9a827643d07decebfad88c3abfb2c76cbc3fd3736e1aabe952dd57484af06d5d439ed8fa156ed8ecaab04a2c63562a5ab70556661e6c94912dd5d79402f9be1ee2195e84214a41b44211ae6c602f2ba9cdbe4161f87d7f749469c2e1f68db335bf1a904abcba302d0a2241607ee6d54243921dcbc5f6737ccec19e96ef52528b22caf7b2ad66ab3e4a0c8a7184232d0d64a8700c4d7e79902506f61db5f0a50653511a25bef5bdcf49f612073c8d3df27729c58c58be9898df604fdd1010b48f99d6810cb5106bc950095f8b6ccd0cdac33ca1b2ae5ed87d45f6333ec85a850f3e81b5cd5b5ebf12a76cfb63dd8ba2ab910a8ee8160541259ff129a8a475236c887b3dd27888c09396486ef9576e084f29bb13965a5bdc793578ba836e0a9390c0eca181d435763465c53eb4a21e45acd376b922400ab0614eb46c37ecc0de612dfc6a44360eeade5b0af5fb854461acd76306f591b7c5c634cdca2ce7400dc919d11f8268ba2377c1401a38c98865367cab8477140c248e2dea59cb263128afca9648a230e229e8df8e36d2369158310c76bb1093b1d4a38233a37a733c35fa89716e0e572e051afd1dd03194084287cdeb3229d44eddeb7bd12fa294093e949e8a182da545bef4631570bdab942b1f08337128a18a48505fec85ac523f4a64510ace67e1d05c5d599d9fde43de1ce104750077c00d1cb978ab2efe75866252ea191824d576e83f26dde3fc238d1cb50bda687cf980610d0c37b102c5888d46b0de7fcc47e0698113fec77f144a3483638a30a1168b203664b8961f0aead328ec828ac700b6e70b6828d0cfdebd6b3355ace04dddd5601bc85566bc0b573ce0e72cc27ec89f6bc56d828854498dc9ad296900e7180729a47f36a8439175d157e605ad576643fb97693576761d6356d927e819d98dc883b9d384e41b64ec99733435d5bba44ba269a668229e21e61ba09752b28a05c177420a67a2ac4c659c1d18e3c213485f65236a4415321ebf1fe8c0ce5462479a0c276d066b5e1188e33ed938fac51b264eadfef1d69cdc956a9beb8586c91dfa4b50448ac6997afc75bcc05b073be54964efaa96ed422311059f609ed0274d893aa6d71a3cc5506a5b81157471db6e6fafd1b55ce38ebbdbf7de6742bae4a0f0e40f6ddf544a5b799b7320adbe0f7d41383c696a3fe66b9a483e4899cd68ded74e745001969063d23f7c282c783edc6706160ce989b4fcf601a94aca901ccfe582bec6a78a00301c4e83771926cf51882149e7004a5f37992906b6fe8c663ac387d318f9b9008900d16f539d512ca54c92bb42d8084fe128c83dd45c47afe919659d8e20aaf93826cf2a05e080bca05d605665984eecc54ee735ec0d4b60a28e24036f44e5540335509bd4093be7096093009769a19eaab18cd8463820df2ecacdec058cf377b3d65daa0a400b15aa0034a321738bcd57f9c20d2a064c965576684296215bcc10b0fc3feeaf76ae49e34a264bdd93e195cf8ebcdf9f59ebde3afbec6b2ba5b9e16c3842c77b061aafb1dd715dd042422cdbfacdae2acf4893bd90d2ccd15aa8f0b1169bdecf43c2a413f66c9f731e58e4c40d29dfcf34143aa82edc003b01000328a0337bd1b40cefb09bff59efb18c8532cfb6bab812b79ca2def251922229e378ddf0e5a9e1615a32d712d26b8344d6cf495d860af0998154a7fc05fe458b584ad5bb6680522aab3eaf8d53101ae9a04082078df05722b16591e265a6f38e2946917d447e90cdab7f2d58240500e4ab30829a1590cebaf37ea48cb9b3b39a2013181cc8ca22b4229a585b8d73bd9bbf4552006712ddc91047e9e2494c0e17035a72823a8d9045d83a387fd682d778a427f91fcb9f0cb7d16767cd5c9a8b6d9bc2a895e2ee63ea9405d6aa4659d8e2217f7fe1885fe4ecfb8726333cc5b204b0f4c13f0716220a20a339c52621484100f5ed2ce879ecd0594e2ffe2ff40b440a97c566f32c550c42bd69b9be01adfc07304aea3115accbb26589147e4f1f967054bdf4ec59845ac3fb6f6c5622917dffd99e02ac5dad46cd733c5f71ff7560abd3b0d03bc5385b6a0452c836ac7b2baf97f25ca17776a7732151c54f2c950b84bba6e22897f87701811ab4a6c6f46ee1134de0588b90586c17cf3062fd0800c0b5a712faf84d164e19d017ed9883ae5bf5b77618c281bf80fcbe87f09b55a62a68bc48fb0fbea01b757bdb544bb053e6e438062b43d346777927b2422e0464897dec6c7105d37d2e3c23e7230703c54a88d978d7370d5418351198a0dd9ea4a49b4066a50114164f17d023a2f3056d4f8aa1b465c6b8502cd9842351d0aacd446bbe1edf2c0ad148ae8b7718383db1bd9299a21d175ba47b0c883a9f30b0473194707d67ad3c17e0a85bcbcffd33fa5b47c72b46537eb7cd7726c5d025387933bf5e6984ad3251deae49070d6b70b1f252353529a1aaf1eac165ad2dd6cbcd12948fcb7f5475e50b675c131baa7b3c4a5aeba90f2a65ba9a934ed8fe6cf0aa95ba0b8ca0c98c3d2f7c9cd741e1dc052b08ef703e163a7aa495e72f8b0e307886dada922f35ffbf1294113cc6391c725d044b70ff8cae99d16e3a9a1be512a0ab9b05c774bf57d57b58c428f4d9c2eda7f5079399b44b7fe9c74f02f8191e88cca69212b7901be6336fbc8411e956ddd38429c056b79895b4472c4d68d1dc99b3a28c5a3fcfd35903830139669361aaa758bbdf7cbd1d41f997db65b435d53b2738f88955a50898b1399c2e3bfd6abbec1ac4d754ed63ec825e6430246e90d7ef10e086413a400a053b944ad84ff97a69714d922670f1ff1545cd98ffa495d3d4d14b394bb50617c931f17784b2964ee8065df73a6e4fe07bf420848ffe6d999e24428abb3fdf27c3c2bc9c884eca9f2f80fceed70e06f97c1265db1aa59f8f15b0cc61d8ff55a2bc97fca02c4a1cd60888325f46789db1df47a287e9c1b31f001ef1a6eb1eeff17d58b96db8ce155939c60832d0d59c6f6e3de16f447932b02915b9413cc3367acbacfbea74043b918ae1854fbb4d8c9def99297b72f5a3a9563e2d1a1317b0a6713bcbffa81219e6c582b29f4f07f4a22b068393bd5e8e745041541ab842e7dd35ae30949b2034c1b0509508d62c5ce6ea2af59f6bdc7b78dfc53727726b6388e1ad33919657168815f4397396e34cd1f3ad8a87c596f31dca72dc2a8bbaaa0d3bdfdbdee1de46a5ba15a3c9d8554dcb1038473313b57dcbdbf14d0c495846d60ced3064c4de4c7e675cddf0e4a9e63c0773368c9d60a2ead8ea92b3f56dbf491b7e3a09877fb17de670eed20208a08ca1055e78aa -MD = 99820341517e3140475fc1a9e57a7f8b8bb85293ff7ccee237542e729531fe9daeeed96c3f41d87faaae3a7c6ecf308842b2e08aeb17e77a64484f41c60cd93d - -Len = 20824 -Msg = f72b6620e71f7b50486d868eaa2cd34bcfef394b7447944f6f8a75f1fad317cf4f4a95eb75a65b5259f0dafc208981f4bc6ee8b8bdbb4ee36a6e4509116eace39bccdeac634829ca491782b102e37605b21464febc4eea11d83a9dcd678afd030437a8295c0dcd003f6ae475f7439cc5d86715e518085021e177e403a52ff276b2155a2b06fe2f3c64726910a7b0da7e57f164357af1685bacac817472657386cced5e7a092238c6dfb67949bb321876563ab7b589121b066261dee8773568797a481bde0e82cee5d9be7de9dbd13ef7fec8772eee724f6c2a1f62275ca6b998e6adf91fbd24dae37a13dbb9ae96354776250d695019edd32d6c75f8c8c14e2b35a46004bd124506e93cfd7edd88e3aee7d9df2b5810de8493d37f24638d0f7a92b5b857b754f5974fc149030faf3176796a573fae5e08c783d9e874d612e5cc236969de52f0d4ddd32b290fed1407e55362dc6cf90b55e4250819adc958b66b1047db6237f0c9229e0104691fbe4e459e49d579e120ac22a2e7789ae3686c9d82d877aa0d5bbbacd7cb42da4cb5ecdc81a5ac2f10a4f4ca22fe6e02cd49edaba1a2a3807d3a94c5a7124a2a1c02cbf32500c8562b9f1724ccd664ac2f0323dd942fc8aa2f943bb3365c862139acd1d1b2e191b6dd1afc78c9f6c061af9ff47a84074ff1ca7198beab345d8648bbe8c04fd16f16cb1b8b0e41e6ebe9f8244acc98b09e1df7da93302f1f3723f438f7062457ca3fa0adac2d5b2f4e0cb09a0c19f9b41ff65dd5144fe9a77cbee22ae6ec5afb0afa02d5471f3f585092800922aace9b3943a56d036502539520bd999dba1945970d9a9d442a16e958420f7a73c740eb53ce76a748b8a1abe8112b8e03b888beda400f0c8b97086bd0e506f4e9b7772ed75d798dcb90ef38de59d40f022ed0ed395d092a05ae3c651f430c806bc49aeb2cb9552675371481e0bf62278163185a1d2a320098b6db5fad24ca25e234d1abbaaab37a2cf4370f540c7adb69a0898eef712f952df90ce1e250e7eb345046f5e9f83b92d90e8068a308c635a02d4b1015f8abf2adbdf874268e0cda4a601e51216a947565ce1816367bee3c0f528568f9884c1dfe4bc69fe1a8e1fb0cac8447cac9672bb67c27a1742d9af89e57601f01e8ba200aeb9feb7b640d55627b9e604cdd5bbdb660d48fc4e67172368303bc97e29e03b7e4abdf5c8b39f0351794230f6e19324bc1486a906d1bb1bd1f96c7223ca0ccef801103ece50cd56bc68f197c4448925fe9abb93f8b41bd1d7343c90abf67859905fadf94392f0beed1b7c8f92691e6d91e240539088b9f3cc73049b6339c359dbc8dfcba51499aa48033baefde9c35a1a9dbd5e5aca05e046385cf9060e6e5e3edf3e1c8f3038b771a2c77c73210879fd2f9b1ad3e29025b8e6be3ff0dee9c52e0531624e805e54ee9c985e7eb96e4bbe0a621f888cd942b920a0e6b045c62d4dcd62438f7f6b01033336eb9d1d555dd1d09ae2f50351b5bb589d73c0bd73f502ba4926aea7ff5a74191baa3ab76e1edcf4bdfb85f089fd34010c7dbeb073caf13e4e8248847bbfa5b0cef0f432091d33f933dfc7def297b7bc964ae6c9560d7ddbfafcd98f70af1c8cc97645f7c6c77b50a4f637192bf3badda391e5529b4b1d05c6ecce336ea74d2f8390ac8317ac178d89d5605986cfb1f6bcb94706a3e2536e4ad8b31ad646bbfb85e6946e8c39ad224af3bffaa35a31aa5a4768301081c557ef47149037fbed8368de9a04950e809160e7b286f241be4af4b2d57951a7c7753cce6f5e1445665974ef2a0fb289566d8417f4890404bc5b24822b4cf7a2fe28abc52fbefb919ae0629ec0ca75387318fd0ae27b4911b07d624bc6157321bde4c4d1e24d4e8f0faa9a73fadf4daa8b266446f8c842074f142666228d44a2ab5c105b03839d9c393a84f534b8bc4de3183232c41a7f43cca1f967ecfefc843ad106f71ffc5937bbf2caa90ae131913f50ef84c0cc6155ddb943c771f4fb64d106210c941211efec75d3e5f9d35e12e47304837b6898cbd6ccae1b5e09c1b3224de7221c5f48236f3629626e19925176f109d5407976046c4e90ca0da8000d932ad1cdf54e7c70a8a64374e42e6edb6b5d87e0dc69999de2d1846a0d4a16c2a81f6966db6a2f661d68aab4088c53ff360ad74c9bd36406fed7f161d98a7670d5be26931b3cc17251dfd79637bdd25b6bab906f1b2175ce04d47047fec3bfa6a06991c95120d303da8e4291ee3d7a6e70924bceb6ee4f5199598982e99052b29cb4237ff9d0f4b91bf6843db875aca6e96161e20b94414020d995b9267ac0432f20542d91a776f09a9b15001300f9a33a9b6b5f85adfbf83fd73d4131dd98d6dc30bc68a52f0a58db0e6d8f8a69d1d1e8a2c08dc1b5e0184ac4d8c1a8533cdc3867c4b7a0d20f4051a2f6127b1ae5c1880a19f32c269dfed6350090d6563cc1a8280571113af645930b575f819e75d07d43d036318a763a66aa4d5568610925c003d74b72b46fd713aa09bd2a5f22ad5cf27bbd8e5c194970970785bb0e3286f48de29d41f8dc83580185c1d1f77cb68b6884ff8f15e7aa988dc7886aa83953da289fed0b52bcc8e49443e424d1d46aad487482a03271ec22e125f3e3e9ae1ac56677c13b6c91162df4ccba7f78da581704d2dd8e5c487cb4437b4ea32cd15a6ab9f2a05e90ea09b88598bb5e76ff0d7d10186695ddcbdad127600f44fc63712ea59910f18a3801f8d9305d4e46a2d9340ccdc453417c94ee0f5cac35d2d52d75cbf3797092fb9d83621c16db526669d05d6b5d4321fb298f6dc9abf24a96bdf46f6a607855b54acca2b47e6234ca2dd68469c7d1e9980729b54f8506be38c11f32966c554cf588593db20a9f684ea3bb14416abc1303cc319856ddefc83bc55aa7efd3b3e32cd4ad757d31cf675459f27faadc3e48aed75b69680d19d300493b21df5cf0b2cbce3dfc7e8a9eac8bbf1138ee82e4d4f9b6fbbafba9117926ab3542fd6eb82672c37f354e7b79c245419bd284f54c5284e9970faa2863252f99ed8dc26f66d8825305a2659add23219ff6df16b9d13bd0fdb1c9cc019b518b63a864b6f58923aafb55e64c6f5559a118b6b10c37201b5e51d08c09cb06a8bab70a5a53878b923d3af4536b4f6ed0344a6feaee03955b8d9477d8cbfb51754df297f110ac0aceb980458c5ad186115bb3670f3485cd870f241c128b08e851b5a4b5ab86c97323b079ddf3938c37b797d2407068541528238f31cbdf7a57c8725bf7fc2e66512bb266222bade5f01d792590c101f528b99b346d8731d60c440476e365600931512ff3b686e2554bcd603bcc6389cf54a5b6c203c71a92924efc83fc79c438703e89a11fb80980b741fd7347fa7869459706a6b8fe02367653cb11979bd36aaa4e7fdca2116bceaf15a16ab7d8464967e81b50d1ae713814fce09e695e16264bfb5325023591b5afa2ec9080af8bf63823656f025af02e1aa4ed88d632f4d1e1efa418949703cc45943f7336c2b1e632c3654faf76078ee3e6326f62bd0813e875f305fda83a78ed442a813eb4409fe462ab715da21fb10d3b6fc0935ec862ec38b09b920bce52234d3e492d16c089c96b98828141a15af30ee61aec8aae2549a28d47e61417de6409db49764caa4a5 -MD = c1d54f9d273a339cd1750ffe36b10b1b9a60c9be1f2f36d238674e894d19b9929ef7be13043028a862c528e79026504c4a8b04a375a66d9d84efc1ee24325539 - -Len = 21616 -Msg = 38469d81ccf58dfcbb44898bc73f80316fb511e466e19e4c4349a2c87ae744b28b872ce47970957a7e46a3dafd2ff7f2b83582c143ec9619b95443a3ad00e0236378e8fd40dd08f980cb7543278383b63a4a74592e0c8d2aa145701b4822a55b29e37ad60a830dff299ba7cd2d844b035dbb8fb5108aab0864e5d0393393bbe1438e8977bdabcd16e17de080f777786489527cdccfae173a6bfc0c04579b493d1b41bee6439d6fc5103bc8656ea7315e26d5e3d655c0fa481d52cb859a8477f817c6c12d82a11c951e9b0883785b9f7b9c0d6bac88087bbbe1aeb6c2e5946f99a1e4395464fffc0c736648e3fedaea4253c2bd6552cec31a21da74c5211556a82062ce61d0fe36b477632f8be96d393bb4bc81099a59f9ed449cae96344d57adfc09295eade7f315935c66851f5cb4ef25c25ea148f246bdb2bd0c3b088597319ca1f252e5025ab52d1795d98aef85e50f9efc3443e1d210d20535be830441bc6af2d0465f97941eaf5e638d116ed1a5db1604ca756ec4710e3bd2268f147bd4cdc36c4103eec8d87ff778ab9b20c3b8eff31e6bc5e14565cd298a7c13fb6d032ddd6e4bb94f1f6907aa7d3a124e80a5b5fcf1201b817c76789506c7f60241d0f3097d6c6901c15bad411a435d4033f493fb26f05f97922b7548ee0f22711cc3850d41adfb4dd536db82f6cd643e022ef3b664e4796bae0c2d0ae95d7e9028654cb16415577b8380f837bae00f9015da3cf754035245f9a208a29fb8f2a68d3db0bf8bad66d3f5c36c260d84467d9580d6849e55d06d9b746fdab92866fd73d41afd607c0e9c50869e1898c2f14eaaa92925e9e2dc2abb0bc878dfb5c2db01b0f0358b8a3820bf52f8d403a1f84c7bdc9da4ddb35fc681ed7c45b868ee895f5b9b2db4dfcda568aee124f52a43bc31a19ac823cf3f8716a4f409ed48d34fb65d84ae8284b3747322c1ce1664bae9f3808858633e66b6a2b8978c255d57742e3c127f9d80d4d50936019b0f57461aea02cf1d4409ba9a4cafcc9509b06342ee82ac6aaedb160f52730753880bcd963eaed7df6f37257d3d13fdee4148e0ff1fb6bc355d9d636c75603cbe288938a6160c08658cd08ea59d6b915d742eb4f4e861a9a951cfa2329a8608a398d870929aa5cb7942dddc5b9340f0ab4a68c969720adb8e3379bbaaeb6bd4cc80005ca2f40086e13964f9e7471982a06d0005a6e439baacaaa1951c8d9906ff860ae31e49a6a3661a70cc91e27eae0382fd52f26777aeca5f511ad0ab98080555fdef4dc41d88d08d063da18cf7df9e34689797234a1fb2f990310d6bee40a693e167788aef9fe73930345e6c0d7a372848bcdb3f3d752a2167c21df52518a9e9be32e7c6a34e73c7f59912ab47e89709a5a807e4d518fb7fdcb64672c5f6d8fe9d3ae29ec2ff3bde5e5403702e91867d884562399c70edbafaf3d10a5444f97b8566b13ad3190827714e79e448ddcb2cf87a366719e6c77bc66206e45c69d5077f9e9bc35e04a24a386dbe2f203530c0fd2fc995d4e053694aeb2c2964cd344b92cae961ec27d1eebb9a19783bff7bde9f4c65ec56c7572d8d778c00f5d8deeec6d3e43b04ec5dbb01bed1e723a47530e7ba509426049c6e97ec6f9296f29a99239fd17a2eba0d5b12bf2fa65f8de65edc5fd2b4ccfdead571341b07cf8331f4b217fb45f2faaa73f6877bda7721961086243574d11c080a2235d98628f36ca67a23a9c5d912fcaeb5fcfdaef3c74cedeef1bffdbcc8c0b4b2d9f0372aaa115883ac22226a6bcbb15808fc485ce9d29d1bafba771568d87b2a06aa435c11e8b1d698af832e6ddf27e792c2d03aeeeec915446c0a6566190991a64dd2468ebb5a7ad19810ab8000b66881956f133e6919e59a1edc32294b03efa0220b718a50fa773d25f36b0df506e5bfbe4c71410a3492981718071936144cdc7117646e703ad6c69e51f67a87c065338491db5f9bc32425a1e4699ea1e2b142821ea7a0e3c29e534a55d2317e8cf1c53163da00e26da42b0268e220561525ba9c47c38a7139d7cb72248998a211905d0cecf58ca9db199183cef9071b56b12c08ba3f92e2488a185ee9a319baf84ae35c54b46bb6b48b3f6c3b37bbb94d5c800fa0a322fd96be2156caa61b90e8273f6ac39f05d1a1031c05d922a4f8a12e9ef72178a18bcc7bcea2ef1c06ea8a305a7e603fc2c44a871295d0442b9ffa2f6e086445775491c90789818c4191866c1adf531b0b56562208664825b6780268d98c92920b208eb1b454a87f364d83e468d7c5bb464e6ed9e7be684baf495ee0c5c9d2e8c7b76a3abd4c8b7c4ce5299e2dacdea8dd7539b695e658407cdbb99f1c084dcd12e1ce6d0ab6530beb2322a44fa7c569369360c0fb26418c87f6b9aec4912acc5465625084dd27b47bcd13feb810a386bb708aff01c54bb536610614a7ac926af60ccdee1108300064aca7b24e2f9f88d2d3607c900d9d45f3e649d9aba1ad315e9eb84c9a7e96760f8884cafb4be2f6e585893e8e4460c4254b2a06bab7a2a8f5e3ca740888809fe229524da5ae93585b4fae4de5b3bbb8335950a2bb389a5723a2ac6d416e16014656ba44369edb379cf777b27ba2d7ab87d864b5956abcc751a5053f2f788226a4d963b69564e21910458b743a59db2488900d483296317fe5b27ef3b9eee9966278f7abaa48cf891f03939b081ff0ac9e49f461790320074992bf8fc61776d7eafc1b2c5d91ca0c31f73630cf3e3eca31cac10b52fbb2e8e30d6f1e403c4e73a22c793f9689fd2caeea1d3a76fcec06a9dc1b4ba5c40fa91dea36a50ea59cf2f4d2b9ef3d768e70fea5f0c1e5a223e86f47aa2b5aa75ed25ef3be2e189a86da47b483413aa1a56089ed56ce04770af9e9d317b25aecc8ec0deeacc0466334b5029c7d3f75526b85b78df767bbc5cac080470ae88bdb747e94a4ab648047cf0a8f5052f0d7d10766f14b7c97f2d28ac59c6d2ad6d6bc8a105add6121ae8f7f625598a85c4665a28c9df18d6391e87391a60b208323d6342ac76076ffb8846b44bc3e288cab57647d2545d1d5804dadab04ea93f85b72985543f79306866bbc382c087987efef74c3ef10f1f4a7495f9b20d22c3b64d8de183668603f008f99c60dc04355f875fbe6651994c8ee26b1ea618b935628502ffc087c84b10f372b77c72c30ffb031206ced2a635a3e2acc1f2edc6f508e22b38821fba86499aa9ad2c215e68cfe6b0cdff10906b17d9fd8c2f18e69327d959144eaad736187310d6067420d04c96ae6c6d87f24d595cbfc5c11692803dff2f2b8c95a8eafc214aca71c7d4e70fb77d7aa0a5465cf6cf76174f63555cb9b81fd6d27c9a056319ba0314a8c51d77bda0712ef5073a6ec6a2f9208ba9793998adbea6dc3525fbb0e11865a38bd4131db9d86ef3bf362fc6e8d3eafc09762c155b3b701104cd14ab4262cb2493ab605c2c28e72dc900c8349a301530efc40fb2aae5d4d7835b4c5d608adbc87723fdfd69db3e0fcf0ab6b449a625c6d6f352f50f463b7c3b51113bcdf91dfba0ae3a760577ca163bb479ba79aea32a5984a4510ac51a9b876ef1eaed25e82a9adab45a817721dd99ae9fbbaca1f3d7e1e8625b2feb08a201d56cdf4099e0f1d019da1f6061bbc26349773c5538be5c0aaf2b77e1306c2c3554e08d5add8eddeaec4a4924c02e711335beb0f5db69332e394e4bb13deb969c4e0b79ae69584b45d2534c310ac04643c3d4be10f27ad9d727692b326bdd6da1213c38cdb5c3c67b6ca3ad37aa37de5fa447b8391669dc9fea0aaac722d83dde8f012f0 -MD = bc393bc550a3705fcd5828ea43b536f6b2de8426bb7d0857dbccde4cf0ca37bc8a3c27a93096b4ebf7861843da5e4c31a43fd7155ce8c986ecbb039739ceeb04 - -Len = 22408 -Msg = 02b74a2ca22173be04ee6afd204d76a121cabfc10b68108ea1f0dc4186887f52a287c7ebc788b39c95be7a509b87cf80be4364a6df66adf5b8cce647074d5757ef92d7309b268fe524d00083b5214844ed49a005842f2afa32c0eaa1cc8611f4b17d82e364238f017acf037eb743665574847cc643ea0f07d673ee371d5c3693aff3d0ec6ba73b595f618c29e917b31b1b9effd264bfe5836d8efdf142f74d9bb29aca33f8d91c539b2ea26c92c2b6ffac3c320f2fd732d6bfb81cb7827ede74821a77a153e1b958f5df4d2ffb6ff767ed091b66ec5a8167949a5571271a7285e71ce01cc3e89ad1361c955a6d44ffbca8aac4bfe27057a0b4dbaf0777f29038a9480b8d91164824268c83d52e695567a3ca35035a3f3ee8e7243361bb2fc0f48f4502dd06924abb8dd81e88860781cea70f75189cf2bda7f41de7673af88a2262bccdf2688528fc33a86f5bbf460c5b7b218be8f0af5d46a46dd5023e767728ea5472b6ff166b51e0a27c37204d7d75e9a9825a9e9ea42bbfbd05180dd00e6fefb6fb10156e9a215b714f02f0455c83b74f5f55ede91cbf0db47d92f02fd75f39896fe7f0b43dd36dbbf0a6785532efaeba2cc327b54d6a55fb47592fbb5b608f76d725d911ddd1de29650900a685209693f18b922dbe9561396b54129b21dbbb253ab118ad01827662b815cf60e07e3781b4957676f7a6f717ef6ae1f8b236833da073f5af314efc0ff1b02faac871582d7fc91dbb8007e03ddd85e3f994dbb0671253b83ff59d3ad716c466acc761c33e590fce22e21ee4523c8c61c751300a4a9639a887d6d7f6633138bd8f64b63e5d4b4fd0d3a455caff1566a389719f588f370d0eac5b64f95a49f47c7b28d892325b716cf74e135ceb6ffdf1687a8f64ddfab732d90dad0b6567e0eb9799308764935deab668bf60be5238938cf668f4dde91f5c347218f32c92e4520c4124e49cfbfb92377bc39f22c7ffd01c6c91d1360b2ed4e5140e7b56d2e8f801a81d73819a34aba30e86e1bdd43af2416574c39168cae1157bf8698c2fd4269f5484fabc78ee7f21aa70ed3784d13f226878919609dccdec2d3c8675b290240ecfbf42f49d1254dad6e98d39dcad00e8fd0505ecf54dde91b4449aba62043a75a13813d2128973f61a59876be6b47cbaac83e53c34035d2d98766d024819b0fc505534fede39249cfe28a474a9cffdc1fe5afa2dcfe892e75f3cc6f66ab5cdcd66806f1f090caff40bbeacfd2de7c9247af30c68cde3c4e893fd6f3dd2c1da0d6b208add9ce95b27c88467ad7be2290ca9b4e39436db3c57bb202e8088261fe7e59c4ee29eb7715dbee09d2d9aaa65a11106465a13ba435d600fcc6792cae4815e5e83d3176039bd733b15249225c50a3c52fe626b671f2209311199fa9771035dcdf15b0fcbfb7071fe983b6c3d9170b2fed45346ca18cd3eeec4bfc8740d966b515f208fe0ff9e408fee1a2fd910faf9748dd6accb788788aeaf80024802620f5297ca9e878c6d6658df68e3e08bd19b1af492a65285776dd99885b2fd968ed1385f0245a8ec086dbf33cd903c4a1c205ad0303b4789c677d74876df7a1242396c80708b2b6595dd2eb1f33fd495040e9be8577492ca9b2e1187fa92a7bea8d054c2bb78f8403d3c0c227ff890b4b1ef4405b0571b911f19ed1cb9d26ce1e51d59ec8b14f8c52714c14e1cc158ee4a4abfefe2efcb2579c0d4d15ca7b1c424a8e3c88a68113b7cecb5fd70a4148df8a8736e964188d0d2ab2f6c8b195eb08bfa5b1c5e7b2cec634d50f723a8acd7e290c84a74573bd8526364b6ed315beb429a27b1af55321e05befa03ded50815318a264a2338cd86206fdd772bf690bd7210b14f26ff091a89c71beb4934118e0c1ef5384cec242265570077ec71e67043e560bd6a809b2818f01b750bccad8c9cd59dda967c2af448a4377dd9a8434bdca09bc524e0ce8fdac2626acca6c555083686f8aaefc543f2dde9539aa5919566c9cc2dfc288c99f6c4589136c8423279ca195c2f4ddf598b8a7dbfd670b69708e95abe995fbc8c957f65b4ef3c0a6b1717bccdce9e5f7c3a335d8a350f9c99eb87ad40a48d46b1de79f2999f0a074809a7d8122feb2df52761f07c618c29e2362b2d7bc4ba1150fa3c6509ef381f117802d6f4f93b310c7b9b9e5cffee47bc125d4237a2ef07b1105028cc86d03c0d8bae1c3bd59753085e6acff4ba3edd6da7a6543be6340f1b493ba1aa0ed945856b3514af6a067b33f755eb0a3783d23e1c8dcb50378f11d8cd873a6b2c5c22c13f1f2517619091d36fe45a6721c510779a9b0f3e3d0af62ec3bb5ad68a60bb0930f2b63d613d7d31ed9f85d31e0d7e60485688cda1aca466536068b5d0edf8a5663831e7131627959a0fd215d66204414f489ec40b7d04c7a7fdcecea60bc1dc0878fdde1e2277469ebbaaf7f3cc8a61d6f9baed2286fe9be41af3e9b2c3fef83f3b82ea2c6a568e202b763f1a53f80906f0420e8fce7b2835403fd09f1c973f320828d2e2f4aab348e89cb6f500368107b5a0f0fa5d61b8c0f51a4a131f74fa0a675760eaca5dfe3f7986242cda2d1100d03a5b093c9a91adc4ec1eb6d37d70eee0775aecf455b72d669a5167e9c30119ca7a1767720cfb25321d1532409beb07fcf0898f787c263a3842044d36e1987c29c7ebba07a14050c915f72c6eb4b17c422ab57c60b8938c76e50786c8701f4e7888a0ab043fa755103d8c4f66b10b763b8ea65bb4f3454ea8ea20bba856deba3c27fee170d0775c8ffb9b402f7b411d6d8223d37a1485a657bb1894dc7d1de5ff0bcd05533bf98fcfb8eeaad1f89b98626ff68cbc039bbc0abfb6b86ecb24fa489cd5beb668751457dd4b3355126110a2bee52f81a8cfb9495ec4d0652a3a1fa042deb5a03f3213afd07b83c2b0daacb3d5b964d2eb68c59c000883ca81a97c8e65af9119a87ab560fb464320ba4f951f1e39d2b6b4b0078c0d4c7aa4b7b73b9a6d11fb298b9321f1c5731b771708f26eff2f2235ebeda8a0ed565cfbb6ad814cc2cc9bd9d0c680ea95ccb2d0b14dec26e261fb577868cf6109eed2d865d3792dcca818305f5bfad4d517b1326f66abd12e9906254369a555c7de8442ac7048c4f46d1b36209ab636ec1dbfa6399a56f64b9deba63438520690ed194173cd1999a0e24bf4fccbdd9842a68533f733161ea13551e2341cfdfccde23adda233123539d05171d93596823f7aabe1917712d0982be0e2295fcfbde4868e1f22e85b1f28ffd4b6a1210a7d4b60d8b8f0af7394984641adfd47efd33fa1be0ed9341ddfd4377dc93ad76110ce21b4c1fa2260f2094d1c4b961d85c644fb71b2b06180fea440f4b48e9fc2c43085e803981a0273530918c5de28bb1c5d5b50148fb6ab0302e1e07f83c15520d9541c86b3dd809ede42de22bbb2b75ff18a023b5f7ac77655e4e930038444ac3156f75331b403fc12bf166a1701a1166751302f06f6fbe0040fb8d1f532b4f0a1532271fce7b313584a67a6d95ea2ca297682f96e7270c8792bf5694011cf758f1245e8fabeb76e16a979dde911e2029ec19fa07d354db61bff4801ce6abdc2645c07c115813892b5a5f5172f6288462efc302c1d89bb32525557a08684a65f89f9100333775d099e06835c9299bc1e41eddca635b4e2c586f3cd4e50a9b1d564b109b63ee94f5a3894cab5fdfda8133f5e4c15adffe9f61fa25013141f06ab5f4c9ae31d1f350dea17732955d771ac911528816db2f94e852a88f8ba2fce69e1916a91b86138aa1e5625c1836f42729dda17f35c15395421531f042b213198514922c8f7f780ba3b1a89846f0d41eccc77c1716470d29059e5ba404d3d56bf193c6990c22834c5a92b477a01f996a286b2cf066c0aeb8a96a704b209cb6666a032e8f2013e7d51cf5106ab227a6a1c3455e9b75d2cadcb4162 -MD = 6b543633eaad9b4acbdd18958c2f76d255fc32439ebf5b7125e6826da4c2165e4fb7295d2804e627a072d2382ab10d43bdf0c0e5e7ed45f3543c7cef42761f1d - -Len = 23200 -Msg = 126a5b0739f20f4e7a2ca8f18d41bbfcdc4324af38125682ca7def664caa904e79b8ebeec1a21dc242673f53f46837b62311d45523bb1bf23fd1dbe8f23288b45ad745b5e9b643305ee64a97f303950bd8d4e31fe12bcbdf7c0d5011e513b5ba9d1093e418f4289fb5f1f246f4dc7c03e4d57995da2a0f51687975678d15c0672aabfa04b526751731cf5ee75eb995a72d5cbc4076808f51ed5d7374530051c4e9f0a49c2a12d1a1b9cab802996388fe9cb1d7a71ef4f2e6f20071c09d9b0fd7c227b934de81e5433628251f0da2fc10191bf0533850e01960ab98d1d4afa3aa9e976054393a59078e32cfc7223d9ae68de330ca2e5a03f11da610316104b4456389c285a307d4f5aa30de8140fe0987de52be9666db007612390068aa62ebaefb45074e84aefe14726a7ad6cfabf1fbf6aec33e4a9a82b027ac90fc1991f0ef4c13563844f8806cce27c94d370dfc4bbb3f664b40612fa84546ea7715586a10403bd7ca4bad0205a7b1f66ee0ecd07e174fd044b2f6af655250336105810217be04b48c02952be8e34e27c13210159cf12428b10722abef3712964053d25f0eadb81206cf77a41c6c4785cf964074ae3007971ba7adcb4fddd4399e66142afcf79d1cc11b1d14a928e4371f724694bbbe404509fa5fb68c2bde4402a60e0aea83fbf7444f4d2498016c65392fe81fcb82175903680015ae0877e0f57b8aa8df391cce17d1d07cf0de2939a636efbae764d4fb9159578fbe5ee935fe4d4eabe30147c7c30b6ec3b9a661d9edee220f154cbe553c352dcdc2147a6aa58424bcfec3c30acf63eea2fb435d6d96be4bc65f221e8c8b644a76c51273a77288d2833967d9c0c3431ac0bf9c651e2a103087cdce3ccb074e7633cc401c16eec220a79bd5d1112812b8c60c99c013304b9bf966396038365b79ace186bcdca098d8d12df6f3248438915beb22b87630d652c43249d2fba2f41a880bcc9c241073c0a8f6b08622621d6d28631f936cb21b1d9139e7d93dd37f227053fa0514c7bca2d5feecd432472914d47c789a1f3f81c60884fcbf2650665a0bbff83dd44cd944ff4d93237dbdc44d083e1615b75e7013d01a6ecadda10f87025aae8c8d27346ecfec8bbc2b4b56e16cb2df4c5b9850ce920327438b4ee474fc29043c67e133eaece2bee7637a4799a7dfbc8634748abdf5480d7257df4be8a236e3948901407f003712ec4dd0ff3b62ce950d6a7a84a9a2f00a9e6addaeaa9c8831db1c0fc2f4b0f3711212d7e68f448553272432a75940030510ebd074839127d85a47942112a61fc2a2da17645ff60edc1d8a255b97788ae511033e053b291cbe593317c4a18ac3ede4cc17e2711f711a37c6da0929f28b94e7dab1c99a0d6ecd1f0720156903e5d920115fc68e68b4f4bcfdd917d85511f9da97b02868e525ebf6ec377b31ba8f709ed0777a7e79e151f65aabef6c4921fc3463c48a6c584a02240ae55ec357c899a532e86409f9ff1b2b02d7f7ad78c5853b6573576f0fe3f9f288b126e581993c7f5f38eef7911739a420e5996387047c39c648f739b2fbb8a88f243c60e00842727ef27f0fe83093a9da5e3c5521e7c974adc8d292e897278e46c406fb1d2091c7b89b7e1aa752118158c9474cec745535437d504259c12eecd61ced80e0e612c634bd55e175859b76c3ae241090b506c3afeeda10ae80b50966b15ab5d064adb61bdf6b29fbd219ce43953a69b6b2c5681aa3d6c58fdda42e1f0db36496a14be1948a28bde04073d2ff07f11f06727b6aac25ae29a3dee3a329b76153daa5d28dc845f464cdd891ca208bb1f927fd0e128cfbc804938e5ab0ab37cd4b43792c03de9837e56aa15bfecdaae2c0c25b68a8e3ad8e1e06f2f29dcd165e1379243f8bff0b59095ea3bab52febec3c7e956f74d8c4663fa51491b1b9db7b7525aef56c5327c29852e694396ed6383504b10dbd94c7ba2e18fb2035940e8e37ef2034f00173db5aed73d3d0b1f32c73fbba29cd3f3ef1b406af88718937fe227e81e65d32780a16d8515dc320cb31bd0cb5aaea00b173991839afadbddf33fe7bd9f2fc0dbcb896ba881c5ae5e5b0dddfac7a5dffa9a8a5f5a07f315b8d95938d304015bbc94ea03c21f6dc25c90f991ba6806e65aef89f45ecdf4489ca8ca85d8fb8f0632732fd0623d5930b00b8ba68aca4645a46cb51b225b6306f1d800792fd42d42e5cce75bf96a0c5bc11110870c5ce8905fb8981e254ee3b370ed976d583c60b44f289cf0f823fbb6384844ad8f9e6238f549af87d816eae0625ffbece282cdbcc71cad5a0f099bd26e2774a4b50d47b1fd9667e2cb21ed107eb5aa724f45c8dee5ffb4d17e798122db254ce6fd380d9de1356db97f1e6eb5fe752f880ef3e68d44683001f702304a17c829fec89d384f489d0d66545ae4639a2507b8922bbb6a3adcab65e9222d9aac969856b7bb3c688c33d383eb75e28bba2baf6e894b9bd861d38367c557eda6f1f714794af09e5c24a06c9cc4ddeda0d71fa32444d21c7a31d354a22c11d4f190902af0e2fbe2acba59151b41116a4589776f74656dc1a223529b8f8dfe880cf0c84838203b8ddcb5c4898a10befcdc49a980c96b6d1fe2ced7c49a5b6c7b4bab25f8c9731e146e9f8926539424f9f7804c73bdb75e7bde9ce96c5d24ea3350282fb92f6c320ad4e00d68224be20609d5c6a4abd9c089e805fdff426b06249ce04c15d46c05c5922fc7eb50b8748595a2beb02e6321be81928c09e4ae3ee3946c117b430317f938c75f1c796a6b1d2d8f8b12bfb3f07e4deb29f8ae5ef2d4d944066605c1d70a3b4f297806c2241123e4b248da7ccb6daf584e581a0dd09ccdd09172a718c17d1c3fbd8a73603e263b5acacef90df0f118627fb4b23b469004ca590d718875c65e1181c069b517b0b65a4b11b5e83fad3ba2147b0157c342f069b3b32f81427a635d2cb634415f35375ba9bd7babd5f66b8fc33781e3e54a236737f02ba3e60dde8b04d87d85734830e77d2ec4c972613a93f266ae701b0a102b6c30e050aef52213b0a3a001d25e35762be22bb183822b573884f18cd307392eb711f8282bc4d09f96b436471aebb7903c840af487bdb031fc0ef59aabc620f9af0fdd8adb016c874d66cab5ab7529be25610d230d886bccb381250a13cb4a14ca870b093b1f48534b47b7ee128f1e688d258c9d7376a07005780a8b998b26f870140b23da83169bf6e39840ce9e0827ca2e13f4681d00d44850007fbb8a4a2d6633485b27e139b9f6a6e66e5e36796463073da839c00f6222a5c166d85d261be3616d2fa19e3435c12e2cb74fcce4a6fe2d642987242e91fae5a7c19e583d5c9e2ac401e63e88b7ccd5c5cc01d5cc77e22d1208ceade0ec57ac3e107c101267ecfbf7825436c998902a6c1d12f5a35fb572d1c68eb1b8e9bf45eef3e02927b6565162117a0b5950b1b86a1af1810bc6ee8b2dd335f43912985f54cc68e7ffc070d7be4fd640ca8887fc5a463c2c682603f280cf52d9c3ef8954ea0a74f10d3eb2db469de76b9fa8a962b73f413c4b259c35750b73d6fbe8f8d3394e92c8c259a2f8a57c2be04b298c87fb66af55172dfdc07528077033976d36acf950c3d1d9a79c557b12435f83b7d8b14cd4fb7ea7cf2ffba58c3a2d636d1bbfab3d969e075752d10b49093f6f91d153626083c44b76d082f470992bd56eef0bd497a5999b289892bd2ea67d15d10e6c47c0a29a518b6ea5956311c175e91cfbf61d7556eda1fa34f141af9b4ecbec665d83cc63728336de18c23880cd72422a902d8a487749e4125800891c530907cc141865a226e4d586ff2c71ec3480eaf223565900d086e2c54219d772cb0ecd281bfd02f8e736c75aa8e05266539b73fd301665f281ff72c85fcbff212f43b8e4d5a028ba2bdf98a3b6ac6e719328799646ec35aff40a009601b574c9f85e679cc1b05b786d65a60c98ef0aa08bce6877c8464c9bbf3d38a8c854ecbfaea535ba709bffb6346f9bffd006db7595e3ccfc34c31f483c0f878b2428ab84cabecfc862d199e61933d6f7fca235635a1f13ae3cd13228030759b795bf55bbc51 -MD = dc0465690127cf6bb6a066a8f400e64582e2540fb2794332533d37873f08dfe7408b2cba3b539138486fb75aeaf081229c525963c0d86efbd4c744f75496cef7 - -Len = 23992 -Msg = 5b5180ac2e0afd84fbe10116aae8ec95aba3c147450c1f9d2bda74a451036d9cfd80b1e52150ce23e8bf739a8fe8e1da76799ca177b666fd76c16db13918c4da7a5f10d23b6084555a500fe26553d364af43da12a4ad0494591d4467689c0c82fa76063a25410563791a3bb8d532ac7d7f8ae26274fae3abfd78608e83972fdca44efce487fb3b956ca760e2878c536b0ed41e5991a4e9898a5929ee35121430a16e589907970c325c7fe7292269b07683acf5bea0b300782749074e2313a3c6195e8321501c6284702836554fd2abe80797cf5b4c300fbefccf6277f8a5c4e533a7e644089224d1d12cb72eb5cd2c07c11f14f63a22fea43273a2325acd5fd717d0e8cad8013a62a613d17bfd651b1ddacb2d581591b572f1bd2f45f2955ce2ee61f07a67728b7f1863eb06ce9f60707923804983861b70603672786704a34fe0e3681d5eec016f4fa66f95d185e348c7b076912c071ae6a865d19561221d6614ddb77b6478837c7263c4f1ad1e8defecf978f7ba1f991bf0d2b5628af8b06eb3d7455c221dfaeca92352e20b7244ac0f87ec44d2d38158610687a9878d45b1e4597a883fe34c081e6d8130938af1c658e03b401e2db8e52388ad3003eac575d0ecbec664d26218f6c9b9a2ec6d7d86f08eceb34634270a5de091c0a41516039e1779e039f324645cbf6201bf23ce34ff190c65f2f0b60f38979920121822a37763139c654d7a3376d8e415b3b5ce18ac075c1ec96a4e3bdb342f1af6fbcf9c8357f4c391e84dcf6c9ba7a6712a637920e228a573a9d5d76e3fba74f8c40738e97b841d64cd837e6791147ca08a77a18331d7c399b5352b1b41a2f7bf7db1bdd2572c71870306898f40915ee9def1d6fc7dd140e397547f08c14e6bf42db57465745289a192bc380b328716f42db961b34d7de4f8561c1b5d4728983eddfba5cb59602b5b838fd204ef5f6a687fb78ad129457681fa7346435b974546946a982b8ebc205ddd66a1a1fd7f23eedcd3987e9990c0258c434ae286033cb45aec94ae9cd02f4ea828eb0be651092d4df5d5e126c7888d13736d614fd4432f3768e37c0a0222d7edbff969323be3ced90587235750976097ebf8e83f73235f34c7cbbc60bcc09fb31213e467a77b7889ebf76bb594b547219333a1dc46a4ed58ef95972765d04f020980a40ffc97d4648f6de2c7fba9eab75365b2b1b68d81acc98834e6641b8ee28c8ad0b1a2008972d930b015ee3df06413d743432ca8c2363deebc252369055c837790d6017e40bbb28afc27d337022dbbd27d1c0ebb5900340d566c09815b77d6900e0581d8a14800c1ee861360c71c339c87c3c58fed12942f2b447e2d393c6e1d6fc68ad85320ad1eb0b91780e838637d8ac0baec2772479a6234ea3347b13166dea18444ff4b9fe96748465f0c8933bfae9c5499af2a339624c5b65c2ce008b2811fd7e54cd2c06a3ebc07c4dc188ca91adefa602c42426d997d487091d1db4b80c7eb83e3bcf6e95b9bc479ffec5482f70e160747c05b65e8e709371d8b9377042228e66b112bade670e4441e0d75936cb40f57a7ae65c83a8861797916167f35b6f7d58dd946ff08c0cfeee184d524a2594d18f4134adcb6eab9fd4c7a4eab3a0ebe19f11d2f27e815ec3fef585e7cc1843812d8f8f1ea8594778c3fbf22423cafe67a3ee5ce6db0f6a5fef191f6e5f0be380cf9644239ce0e05eefaee798e6223d8c01d370b1885ec61f58e3887a5578eb5d0ff5f2513bae1c9eb240f3dd5d5f1fbb3351dce72917e89ea6f54f8051f7c172493f282be71942d4a65285560bca1b61b2f9effc1fc3483a63ced314d7010c6d15d2341831aaf97d56743a97740bb73bfb2c2864eee96b8f19c0c1ac571d32a9f04fc4aaaddba7152cf67216189c8996867924b618e2d909237b79bb54b4cab553185857be33e228a489da568be5090def515364204807453b6f99c642504b2bd8bc5db3e54c3124578ec1dd207d9bfe9065430387917cafac1d7051b2881a59dbbc4323a58cfa94b075c71e88ded90513f551f8c157bfb50ff5bbe227c4deebe688a74b815ec4f639ef589f278136add4a22ed87ff33701d198cafc148f0f3e83b208700b6a16c57e5c04d38f0d4b557cfc3806e60c79029b672c140b4f01ee2db8d555a617668ed83c4a6011cb6da85753ec28c5fc0c23b7f16dae6ead7d676f2d9c40e3ff4abee21097a9724433f2fe59d992825a5701d1c7fe3fc0f2c826a250dbe6377a29d216698b34031034d1fc7e8ef89d9fe019534b5c5ca4e788c871e2f2aa23109a750fb7837456b7d6c1cc225abf8a454dd6c6fc16698cd425b95854aef1497af2f4187b1f0eef93905ed7e5eb5bdae2d6c6a77aab0aeb412575c0163f7fece1e9fbdb34cc48203bf7e5ba49af5201e141556f1788a532c70e8a33b8429ab01de5d8c27509d4bb398412edce253691c8e43f98834dbd15de57634dbb46d625675d3768ac5628f2f4bb42ecd3db7dfd2255b1ce2e58d6e6ef869d588fcab6af56d674384b4fb979f60412220b309cb6660c685a79387738732294fea62cb0c074e83babf244fab2c5f4fd47c4c317500c7ecfd8046b128d21a1e6aaaf1b690b49e8ea5e01d4812fed1450a8a111725c9e3354b1507f3d47438b1ed70ae523e23e7f0ca92a7cd163c3e8d8df209a323e83b0a390ddd35c0981448a2e3a3885d7db010f17bcbc7fd0e2c8e255b3cbeb68658d18d10d15f3564374d4facd74137e98258e443901c109d25b0996db34e28cbc0f410c8ea5979002826bd7352631290e42f6a93ffb59711b05bb3d1753cbfdefdd98ada300bd4956f3db4df1dd7379a5efd4a131e7ada9256f7392f8a71c4e897eac3f1ab5e904b95f8fc983f86ee2e782b4d6af75320469decf42efbd47e10148d82b36438f44921c15c47c0577f74bb1f3b409229b35810a3ac77cf4c377ffe2c91c8628347b89bff9d94a9313195ae42dc3ff5e2d9ee348229b20ec3355cdc2eb6d9ad25d2bf8b19872601fe4db9dafcf70d2a68db3193f23286c120c2d037fbba8e4e08dd877a79e2a6d0a51b07c5b6565239a10148b45c919bef4b240396fb648e4c12af38f08676bb1e0ee3a8f9d6bfb72877925b1f260c9aa02ba31c81967e82af2d92f973a80b0ef421edc4fec6fbe301d1d8945dba6c2bdcaa89448034ce118040ccf28d47684659c680825aecd280cc961919f57e78f5acaf1ca21c3d1ee4c632a64cc5cb560c56e5e60a97b20b338fb09e126fdcfaa11723a65fdc1934a289ed682fa39d9d08f26665853c7f70a65406afa8543bb8d626ec6da24930d8f4d1585ac2b02305e13531461bd2bac781228093022a027c3de0f3ba94e9ead482a75bc42e73c65640272ed1f3e0cdd96b0206944a7c9b0c7e4d20d45c47b0eff312deed9a75ee57ccd1464d36ee1f6e0dfa80f8a5cf6d3040755c0524e8e8f0f01bc91e2f3c04d12e3a5f040b85184e0f15d6083dade0b22b618d931156fca020c9049f15526e8c0d6a623c9b2c20401858f10c3a9d5c59e8189cc74d1852c72c2478b8733f9650126a383e0d6b9f0dd0cdb74cc42849ec1fa272e900b6542dbb340bb17189e2e5e541c7528acafd7de17b110f01d40f347708f54151b868997602a6d139babc122df7f9bf3ad2a258f06ae79f1c2c16f999510f1669a7f8d404953261f0598ba09295b5cf440af766a8a322423bb5c7022d85a7b2700b6ba70ff595a9c1efb758be22e2c8d1fa626fae2da84187f98819daada55b8d6a29d73c2bb9f1d203a8ff56a66af3082b4c3aad1063e4277fc20448cff05ae84e9a2f353e84814b1dc560052a349812241e904b553a7243cfde8c20f672f7aa3e2676a236e0a055c6784271b428ff166d3e3930031435057242790a271279fbc335732a1cb4981884296c424f2e6f3d8f16fd0522db7393ef5893ad6cb82a02642fef76f7e8afbbe23ea721002e32af110ca472bb767515ce87a2b2cc4c50e8a97cb22ecf632e666520bbb6d1108e937b8af51ed4cd83b498366dc050b734d41a8484f9ac0f5d43973770a8c9bccc1156f7b9b278c8e497d4cfbd80fedf1eef40af2d7f97d38377ffeb8e9ff01b335329bbb8d5ac4fe2e80ab95a9ae0ad5561a26674699797e92d25a5dc454f130d7e7c3eba307a4ac3ccc25c0cb5fe092351c80f235fb543d88b92cb233fed8da0bdd8e7876be9a1d06d85209b795edccee73b140008f8c0 -MD = 950233b2ee76ce1943d2c6bac53bb945b5e9793a41270cfd8607028df5c09be1eb311ece3fc5f58be0c5e233f42ddfa1b63c61326244a57c40a7e4df6a7e7f18 - -Len = 24784 -Msg = 2b8e5b85086abad60ac3cb887d0b4f2e3a06045a1c75bd60b4f2b75c3e1b2b76d3f22064e0848331d6c9793d23ccf486620b8525ce21711cfda2064ecb472fcf944b475ea6142b30f51693f011f5a20356e9bb10626797c0cdfe94c2147f5013d560777c4262d95cd072c0a72fcd802f7f684f22c18f57d48bcc0abf000ab6c900fa59c59cb6b63bcda5a86c659eb7914550e964d1e1dae1a1d50f4e793288797ce194419c58ea575576f4469bae6eb1116830dc7ba4486f76e14c76673defabb1ddd1f82b8f9c38d1ae4c3eb947ce184979cd94a822c90472b8693fb07412e807b6b8f32fa5f464a715575aa7afff4d574b67943ea1832afd210db13d1f1ab7e633f03991e01b654173bea44d2e28d8a1a6a7e2276aa1687fe5e0d5f6862ea1b61e22d23a8939c305902824940e71429152358849c5494660cc8cb2c3f0772ddf3df5c711e775045d343ee1629503128d16b88e8ef9a44d089eb6508da71ce3c959121ffd44f8b2b026a8e3a10d06d0ffbcd9fadc50d904e02308b83af1464bdc3920e2e8e6ea54652f0d3237bca1054e0a3fd61d1010f44e232af1b4171dee81a7c818b9167273e61716d70eebfd38e2c9922a388273a3bb65c403e160c8531e69b2ca581cb8969aa66ad90ce142f123c07cfc15ee279b90b27df7ab1670021d488500ac40e545e9a3b2401be897b879b9a3569c9c576433d2fdd4f97f3c84e40ceac09fca21093bd89514224624164c7aaf3fb5d329840e8deda2b2e55560dd7d881418019368f80bbc5e0844129204cd49c048ddc58587abf56ac08ee21e6e620803002f64ec8805ce26b72a89b5097819df3d0054ef08f3bc330ac30c47018511953d9abb1d548e74721640b005c343c6a67c85fe48f82eeb0578cbfb62fdac4cd3b88ac182c26e564c0dcdb00c9bf8f91dedb4ea1abf2429e8f2f0d6f7caa060c459499ea33b6c1bbb841bb152f75d594b79d441ecc59d1fe56078c68ed029f671091e790828516bc86370da5e403c8f38062f2a4771617503aaacf2b0760eb6e0ae507a3aefe5f079921553b8df5b42ec7d0bceb22d37d24bb9d483e42619471b3128cbc0faf04fd8fa5245e83a821b70c7b155b561e9dec37338a0b34810522a7bee9122af3a33ed816ed876bb7bc1cbca69e6d8733d4275c11f72a442bc7e1373eaf7e9788a42bf10b333ebc90dde05707aa9a4ccfca6698cd3203f7de574e00063229cbcaa245690677fcfcbff1727a02ec7a0d4eeb1a6ba9ad30c6153dc990ca33dc3e26082bae7d3e3a82b1a163742cb6855f3da0c3434bdb39457cd5d447ef06ee6547504f4ff3f8800502683403d9ab34992895f1be383e75ec51d9feb3e93dd8e79b1510abef3955ea2eb05477be3d10617c45163ae3698f214094b9533d4b442b9db12070e36334b89304556e3eeea14ec518a157c1cedd9ad5a094b47fa188b7cbdeef0d6528a4e6dbfeb745d0225f977f8b339377f0f9af6d78014614f33f02a1d8ecffe8dc1efb65e9eaad168aa3f228374d5c6a525bd594a59f869192df92bc499ab6d3001b6ccd606ff2769a26d54b874f311d758cb3d793bff48a12e2ee87ab88d0d82712c18eecc7b474b350c74615c9a005cd04b0a2ecf32e42f5d18c706937cc5cd3ad8007098261a568aa3ec44d3d37b7eb4c5272fbd98260ae23e3132d1807d578342ed22110986d4caba232a82a56a832cc1fe44ac39f67ce6288fc41ba11d6a75f348cee02b740b1cda81da1018b5b462c8f637441e3dcb915f478518e88e4c3872773aad94cd44a9896e1e263444597b6177cf2e4ee1400a6ac33d715cb645f347e42f1f4d77c7985252bc6c02ffbaa215e9d312d1cc237ad169b4cd067e9fcefbf574de5d5cdc12ba957d8989cf1efd6bb50c97b0e4bc081da3b1d5eccea0f21514d393cc63cb3f4b9f2926d19acfb4eb414266f21352ddd5d8fe31188f92871da812e6a373db468cd988eae34a13f01df63c279f402f20816f618892a7bbb49c19fa7ee976565005a9617ec6c533d98a3cc481c05399faaad2a382600064a219ce5304a65382843f787e8982f57696b97ca01c5c33d993d7688cc88c81d4791c31e51fe2f2a80bc1afa5b420c02650321c99a17bca37129099e3021e1155602da97778a63b0f0c13b49fa7a710892e7e8677b825fffa9f5dcd72d81c9a2d7fd59ed3b6f91601b0bef134091fcce9592420020863ba6c64c76cfff09003a5ff9b78bf82e46bc41f49cc2b8391dc8cf8ac54023a3ce3d38655de53f58134050808a004846e22a1803caf4ebc0428bb349f893ef5b9637830908c368df81495c1a37c6a639f23e0fb2001635d8097bd3584267fe2e120a388fedc6f60fc8d9d53f475b8c87f56c9ba7c2a330d0d13dc22e3958da9bc039cb62937c817958664e683f4b85a17a3a4e2d8928675b4845e23453d30f152f4aae39906075acbe833a0d95f30c26ef3b89ebca1243c7cd08c6230863062acdc1637d4aff5d0a79952ac7d1fe9a78c2c4e14b1bfd40b6ee0ae042fd854a5d1a129d9649c5a2230820930f79dabb27a38ae6c3e545f8a909c0c34c79b6562c92d28f2d133fef86f8ba055d0403d8b3ffd20cfecc88e60ececed1882372c409d665ea9a1dea8f86a9d5e428f6f69d9e365ec65428327368ab99bd8e7156ee8543612275e0422cd2b9e8c20bc94f5446f575955c8edf2b370e95c9d7e9bf602f6848b938f0c321dba787216df16aa76eabab0c8066eb980a866798fd0328b358c371216bd60a1911d11584d815d50145c783ae5856f42443a163ad56442f4291c39efd86f6736d05e5386ec29d1afc9ce783cd5cc5656a82ce3e698c234fa87b1716a002d89bb838524431c60da8e3a46a201bf638dbd5488b4c7ff736e65f750c7cbb7802ef651986ed905ade0b712cfded0ccd37a3fef56702333fe5afd2003235924eebeb1e3a1188ece984bf0f76e14f023a387a4219c01435beb5f89abd16d5d7001a1b2e0a70aaba0a98302922d2caaee5b1bb394644e6fa0c3e4d33fc38d1fc24140c2f1b32c77a269f0b58a130e4652849d35edb53fee2a0d53a185df6ce7433501a8becc663cfd5ffad08728a30c79a577f3d798bc0a205113bc252ff0fd1a654d2eeefaa040d8140a1d3375d1438b4610b2f813ad09aa188cecc6bb02a871598d1a2945c2cd5c0e866233018135afefd03df831fa34f2e826f810898b326d9a273519b6b429b0d7d86832d59c280e291f5b80f78cd31d4c49aaada471e138af854764545e9cfef766f7d6f70865d07b65d3386f492e56c95dc842119efefa200d18b228a8706bf49ad7c771af341c6e0a6ec7a01a8cc3e9ca1b7ad9f8d0da76296fac387beb2158dbcfae4b77dc1a8976f4d692e7378c33f86bfa0569a101384015f98ebd5748aa90a8338b4aa7f454122d0c4e9975da2f50806d9dd8b797eeb9d3423258fa0773232afd3b0fdbcf5744e012db168fd566382179a72c5cc320fe6f2f2a321d873afb1db562aec1d61b75d78f4148cda45f1918c62d4fd5ad5776b167803507f087804902090ea12e270ed82c89167670a25c2bfd36286d7e1a8963933c480269e31a768d3719c3020375ac91ba67d460b86723c6cb9f6b5ef29f4b5a6452541ad4316bfef4b66e7838141b65dc252d9d28a4c7c8f39c167466203365023d462ce42df1fc48cdecb84d52ec50f837ca4e7a79e1acb607b8e9fe74e15c1df020c79b76d02f3c4783ebca96e9fc1485f39c375037191cc897e442041de5be532a128074d040d70a7c39384ad80e3bf7efafe69093b82ec8fb8ebb36b1abec4eac361b90b8d722ff1fc91dd58231727508ae0fa1bb31f3ed2e0ff0736354afc9ed5bf430529b230eb3c4049faf0bc3e784c13beb772b7320778e6924fd890fac36a794be6435e4208251721026443535ac12f0d6914fb74a1d33afaf45f115dfcf4582a0b74c6d1bd299f190b185d047c8c6b9cacf44c6516928497e0435c84a005b46401389c4e9ecc4088716769d0520081b2ffbb2a91fa392bff701fc31d6111269044094f37018f9405d1ebea358fbfea06ddb43669a139c9a8406ef5669499172560514029a9d601f7a9105eb26a3d0cfec389d07ac006b618cd9b641ecf101e99d2bb2f74dc5222f4637f57b595ea73014d968933cb42a9c7743f8fa48518956407b15dc73d667f82ad8345dd775ab4c4e884d133175ffd4ac0c5d8763b15242a9bae5b8f31956018c3b6a998a3003aa000bf38e758c128f95fc8ff2275983353fb3cc94b5d618d2d529403558d6d8d3942b040cef418c5899db33437b9045b56a2d7077a155d4f36e6a5d3b2bb1514d70b0259687db95b42070f48046a0c04c92ef79699fddb3edbdc6 -MD = 9b73214f933db062db8f1b46c60c266962c8071bdedf569c0e870c54730a0f97e200d199260a2988a651524a2abf9ecd8dbc831762f0a784f830462539ac24a1 - -Len = 25576 -Msg = bbfe3d99ada802420cbe6471c21633c5bf6e801d3da50263492bb8a87fb6d0761536c8611b0cd3e000767e5b594e9385def53decb58a6ecff45f7e2f61ad15287c864a82bf0c0c8424e1c108e8de2ed58e08972828bf2794d239920c7f2ff83ff8d60d24211177d57ee577a0f72dcc5bd88fd4f91caef55beba13b6861a54260910e576dca84da7c196be64a0ea335c2c3723d861bbe9fcc4880c26b9075bb355017718841cbfe20fa5c582fb6a830b058991af8ac57ef8ef0bc6f3c93092b663cd7a39b0e50ab6a2b9e137776a486ce9eecb37658e1ab4aeb3f8a04f2c75a9b5d3734cfba79a801b31b6049d7ffffc39d544f29a5c49ca742ef5bea3619107bbc1f6e4bccb0bf8f9ab986cd602163375db738391d698a4efcb62a17e66614ae60789738cc5cb6b9e862cf2d99737ad4e7ffb4cd48363de6217b3eb38a152fdd5228f8bd42e45629a6fd818e0a5b0c3f42120c0dad947c18ba26e0e5aa9029b09819d903b7b26787dc72e51b3c42e02376da8822d4ec108ccd9e58d5cf3ecace3c318231b32db17a90a943f9b691bf268c3d6f3445a4c2e965cdeeac8087d9e0455a3a70bcbdfbabcc89e35300ae71f08b250b6a892658d7879aea9246d3208dbc7b4ae85cca0fc297fc0c4fa303be2a7b79a2ed27d89a003ded93aea88a657ea87cfac01abcb366faea071526f66e7c64217de5a72452098eae32292e14715a114492217efcb03ffb391dce11f1488d4f04e4799271469d83c50f2a60da0cca00bd5a3211f0cef6a5d293a2ed5b1506430c1ed16e263f62221b72dac742fd767bce9a1c5a01d433fd9db4b8409c9d8e49207516c6ad05007596a361eab50e058d5f9906e2978c9d0d82c739951ca8ce68282f701f6d6020841fe9e6519c05203b59a0192f1bbcdddc6a134c7142fe6ea80d950603ce186a559f8e91855dab6e8fa2f77ccbf32d9b723be11a5e78661511b5ef01f938f485f3fcd88b0d62c8989023e6583e89a77ed8df79cbe326aa6bac0985888a13be1a632010fc7111244546c4b5d50e44f22e153c238689b2901a80f19ec43cc73cd0aef17d0c3ad4861eba6eab1ac58bd554313c2773d685e1c7955684dd9abc3750dd5969e1ef12b8caf3071150eac8199835c6ccbb5407641cf41e7dfa295b7641f83f1aa6183280f2f9782f9e066286a128c15c868ba0e3c1a433d243730ac34c058ad9813e9ea73ed5aa4d2da0c1e41812171dfb02b9245ead7bcbe1ff32e4190e24ee9ae8bdf5558e84b325404dfba4fbaf584341b8f19a18e0affc553ca24f1af4a11a9ef731e02ceda9ad6f6e93eeec715485d007101dec49c8bbfe8ec59632e23a29e8b42586b8cf76edb38c739dec455bea380c4990319d5c47819215985dd600ee4f5c97f03911630e970f645a0413b39a0031669bf0c6b4c866af5afaa3b83c925a5750c6b79bb838a05f2ecd3bc3a5bcb0dd2de530ab1865364c5b670c70373c920e18af3b55bd9258e4999d993d7979d0776817f934cf4678d3e185a1e736157de7b653cb27b94546066d73266977f8e969ddd853492394b4abb4fc69038445a54bf45b72f9f678f22e71f6eb30e762821a55d147d25a77723c9c756cad68f392a3986f35b3ba54e5c26ecfef7810de24f297aadcb7bd163bee6198b3ce2948ca556b361e3d4e01a62c2ca53a2b3b9556596d0a1be0949a9629ca0c454c106bd7cb3559347ffaa6bdd27321d52fb0aea0b79d990a36272a0c55a07a2b116584416bbe7f7f61056cb31e0bebc76eb7528a74f000b49fbdef24daab896b0370bd8e9fcd5108ccb97a0f76bbaa18ce98a99df82ee71e04a0116620b3e20f0c783c48ce2c77d6a65cf959444c06d1399ada60ac1ff5524e16b75a90802c1e13c729f65fa198f1d937101aef87a9f996060e5cf68ad3576368098990d910a1ffa3ad21bcf55c624b92e8d8df313898cd246c173f3929352dde307a8988369fba55f0504cf06d30e6b5a81e7c155eb7c53c1d1bf0f29ef493bf54b5e45345202b24190b7759706390e779712efac15c689648f06f7eda9d7c559cc30703e62d3a5a50dba5fa10043371835b5da709929d7a161c26a58638d2e6312b5c60c0cccf3ebf463e99f31ab69bed6371e5df5e4c2faf297b2e4acb7cbb3b7549317c08d2178bd6aaffc1ad01ade012d27cebca5dfe3a9fd8e3cd60621ce12a3840c1e62b2edf1352f423c6fcef83eee834d4ddb92fdf04a48ab8fe6c504bd190533870c3cbe1849c3fc06b8fa9ff811cd5429f460ac8e247ecb2ae82a1a2f2b93388ad8035b9b1f1aa42a7a2227b53d426df19edd61ac029d164778c550e151ba85aa54bb69022bafb4e7f1da320ea79f0505297dd0027b201756172b5b6c31e7956610d948e605dfb8ffde87415d074fb40522a65a09e4a438e741c09c3832a7023e8ac18daf24472aa28ebdd838d2b0f552290b722ad596057b972995cdea7536a42128a9d60d5284a080f2692a708f437c9af1bafdc472177375dacaa5bfdebd2782532fe337ae415a63a9669a872718f4f71d86fb47c4b97f6c38cd58294000491cf5726f29a70b30955763118d15005bdbc3889bc60a95eff8e7f04dbd45aa795f6433c259c92cd39490e117d8c57401a7a81257c5b027559a4ce5fef26c0648d843c6954ea130b3ffca632610d4fe96e92fc6d7dd61d830cefc10f45f0fbe380608bd508ebba14225886bc4bbbffa7c2ecf1874637c33121559f3c659bd4cb767278a7c8075191ea44f6d6c4fe31231d70a89b60e8bc279fc0b20dd89010c577a24a081da69e29a0a73da8533eab05870668d2514fd00c8e1740ab25367a788cd84b1f8e306b854b6ba45b80e336f408967b53a3d6c789f742923ed4f4d98dbcfcc115a30d7e4cf3777317d3559a98a9082747dde46845e128f0ed6e34f4ab10f6f511e4a69f27a0b3f203d5fd9f9a7144b5d688e07ce954b3a1e07a5d947b8eae2f3cda6198be5b0768480d410da269326d272b34cb1c58caef4080d781a4400db7bd0ca730b82b5b1f0d038aab5797bb96634e471d87f6552035080983cf2ef9d4bd02e12ebe19975d7b4041426205c579b17a813ad1353d7de69b5d62a45f5bcf6445755b772ca36bba4bcc9a6abb395f3a354aeaa31e684e7cc03ae5cadb1cf0d95ccd7f8c6c6791f1ac957b18bf008e260a0af4a5b7bfdb1e0008d6eaaa227f45cf4f62a4e1cc1649ec02ad141b004f9c7e29217e0a2a6bf5e230fbabd557c4cf2765cb6894b844e9927df705d723e9c41b0f39d71f924829ee181cb662a207a0eb76837f8c1461f9266d2394f950a6c768250457fcddb8e1ac2903b25cea8fdfa3e95393d1c9b6a3313af7688b6fcccdedd149a7abf50445a5cb7748c819a5b5d82801496cbe8b0d3a4b3c2a9467a4fd337cd26e34c0747e60673f20b016914a109a554b64da285fc90ab9811d227680c18f65559d284fb4656324e11bc99bc5d6a71941c107d4c266de38162d878a7e1f70cb04f014df0e3d29ee34121a0b4fafb713d28c2cd85e9a2f7f90cc7e271ed689cc22356b6ab56f1f65c09cf1280f25320ca7cc307c5aec66589802ef96886d412f57721739d183af502ec1363b2ebf81cd6889fd08dee5e989d6d8c220e56cffbe4db1ff94890240792589d18cd3060a1bbccb7ac4140b21daf155df0b5d5c2d3fa9f90bc2057339a64efdaa63278036c14b9b8ff822e9761592822f9f17c4327b1653230d6e5e04a05124aa0852b76d85be0024eb30045100606598263c2c763a3ac52fbbec4b082fd507b7c27b331831bd0321e667e61865040903e6f31c6143bd5a1715a6c3ad1a82acbadbca7a9d8befab6e31ee16350a25735928651d5b604817c363c54d5b2b011d9c996816665cfd00f414ee1c0eb76cad8034b9b6cc5783061ced70727a28fa6243457d8fd96b8e0a99d78f810d3680be625218701cf1152e08fad0b972da14819926306b60824bd246c1f8cc984e0baee6caaad2b3f6a79770d40daaac09f8848586aa346267dc5fe41b528519c6b285f3e39664f92ee04a3dc14ecd8e7d4e72eeab137147e3e8b9592dc434f7671f4c73e705ae5761694e550abbab81fdbd54bede92ab76be17e98f3f77629af9fa0b4d1c1e393356e9aba2f77dcbee53ed31dc674f6959c013f66c9993966a44eac869cb0a8cf6d6096a0bcfbcb53b458711308e733357b181e8da833f59cf0f988daf3bf02f09a9719277dc9ff2d29c33fda29b2691d8580cc8c044a3323124ac6107b6f9abd297c82bd0644f09191f98fb1ad58f0c447e5a9d0525e8a9f849cd4d59824d87bb68b63efdb0f4827a985f168086d72b04eb136f936e36468c47a3578de8134b2be3e5d1e608b5e65bcd2f53bcf425777e67e0465167b49255e5d78a8b3074808ad1faef73b3babc2688b1bcb667a2771bba692b27578b14bced11eb3ba297ad3ffaa09d8cfb2c8c428f8d58572976b343ab5525fd88e2542725f8848586a55ab4267de5192633df17aa6a2f8581c8b3 -MD = 096a0d12871ba1ec81261a8e8b5ab587aba950b91580286aab0759586e04630b8a9e6a05a2422768cdf77645d2d144a7f7a3b8480968a809e7fd3f832fbd2424 - -Len = 26368 -Msg = a5422e53975e43168726677930f6d3e13281bdbd13c67c168340ed67e45d15b0093208c63e6d09ed898bf2a8304bd7d07b62e6e4bb7091a08b33f0d156fa60671a5d71cc6b2cff74baa59eb6d7ea3cdab5b201736e3e7aef868ff76c74d631cd5e2c300d25836cd4a1dc33482ebb4a2667d8d71131187e2afcbbcbe045d7d00a5f050f33745a9a34c79978093ba64bdd193e30670ee6e779732134d6d1e68445a551d4e36099cfbdb242369e08948526544bd41c0c90fb057528f9f621ec97a6b67948c7f2285497ec4135b29d6b412a9e678ad933fe03f68938e4e73ccf4f561ce3338731ef71e9fdfc3deb0015c71082fa1b468c19467438b9bb522a79f57d5ff95dcb26d76ddb6bdd16f13b785f01856c500a1ec70ea6081347def4d0d04205228d3ad7c69297c04a876d567e51253126efcef2f1a1b483af5034a1be2ace98c58d7c4ea5264283ad5a07570ee4a30d8ec0390e8048c731f39efb392a4949a04c233a935d72073d6d5566480f62a4a10d8df47c5a4b079948f8dcc5fb76daa31e181cacd4be0c75f24133306b114f760c1ca64469f29b4317277f4c1bf9a92ba333c9a3f45279b3a4e51518093acd13f136f86c9385abb7c6f48bd6711adfbf433eea80a4757780eb0bb507d124450025a392fec24b617ebf24a96ce521a4e866ff2649cb702e622f79ba05ab19e0c6112b1b01dd8de31f688280145f551f2c74402608538bc5e3d8f8cd1b7f5fc6ec1c963c7ecc9359222bd5b9d8c7007916d5c791c4230e648b4e50964f353f1efaadab9c7c77a5ec106fe4fbc00568d92bf15c1086234135e1f949bcabb50110792e33e403c60bc36f9b78efd302d568f531c94b553b6c5d6d42abe837e7edc6f006f7bb1ca10c08ca19593c19a4914efbfbd5e93953d607b78f3dc1fab44b65e79dbccacdf0f2e0a6504f8b9ad4e3b2c5b847933a53c8594849c8f0fc026218e65b4db8209b03758da822845f7b12bcdcd1e8f061238a7ba7d9141c45bb7b0576a8712e1d8a88ef068999ce6f7f6796c7ac80a9b5ac64965ca5e9eedec5de541eecefd4cba5c8769a5b7e12d2ca2a650eb3d7653ed49ed2f0170f0ece0ad32e678f905132d50d30cf8697f79142a3543a4db4cd05847f56ea964d231d70a2bbd8f91c4e5a009d483072ad26b3d11988d2e1e08811a5504bd2896dd5d3e19222f9925b724c0fc1e442888746405ed62c5ed9243f6b1d5ad8315a35cef944ec8c52c314660febc12d8f2eef0041d02066669c469a19d6e2268d706eb39780f9206cf211d1ab7ae54a9ecdabfcbd11405e73920e4025b6335d7133e02fb37ffe07ce89185c29a67563f7ce84e1bc087e3e0c2346da96a794a4620b52e85728466800eef2af9056b8a223974258469d212bbab7b40f75904c23ea608d868a63186c8b8b6771e872f72da992ad0864b8734f04b62288c958a403909a5ab25518bb3af6c63e4a39e17a2c11268c9a1d41bad2728856ed9ae9e46cdc217f14be2f78fcc90941e48c8d89c8e4baa9b57a203fdc8c9518e5f12a5485575ec453d09197d78dbb36e4e85d6c28a8b8ca02813e4a93db463218d5033b7788b7f317902460f5c943e6f556396a76e887b8283c812222e6016a2f4e5ce369f895d20a08d11a7e050b19bddd09cdd7298f3bd0b3d211af352f8ad2641d92842d612bd23f810f9ac97a96e485b5db75f5381aa2ed1a5d63513958a8202f91f0b181c4173d1a856f9ef827135626dd78d3ea1f45f23f4f65c1859d5a897828d40c5f65820b85c5280bed92f259421a084c0d1062ca2b2fde0d7d208fa7e19e58c461d8bab0ab17eb99c1a02895f2dc4be709b6a07ec445f5be88abf083523da663f1e4683473c2e0cedd195e121f696c2c46d9a814f4d8d35b0d042524b44be371765034a0c4103135a7c53bd9af0b91a32d412197a1329f6c76f4d593ed113a7458e5c5fb88470353886c68f18c07e3d524b5b40cb599827a2a43a8d6e7d7d1f6fe6bc44da6b081b2e9d58c629ca8894994ff097d1756a40c91b948f788e5d07ed2aad89e0693d0d930c95035c935ab87e6e5c7f1afb12caa131e5afdba8260953b69aaf790381b50c7105c71f9f573188030977165f142dc183989f164f7a9c1a172e25f2ce688a01472571e16310783cca820042160102b08d37ada6e8dd28d6c8b27dfc2e73f5081b7e94507328f5030140bb2cb44bb1e4bb4d8c0bf89037e057d217e3a8169e874a6bbedb43d3408163dff834be66e3e49a449ac4136661ed20f79447cfd2ef05708751e059d1d32e5eca580898e4f116b6b75a4dbdb20f43c0bd73970a3b5f191a5bfe0e298745605e7a5b06e84862117d006b375bf5c88ac37e266ffba27738a453f3c33785efcdef6a61ce00f3cf6b69da1def82b4063885d43d20f8cabfcaab0a039e08305add8e350cac8789916b198f02f4a67f40c3943a285895f6a1659ad88e0d10291f05b754cc40f08c40b6e8a9bad54bba10b28b2a588567c8c48ff06a038ef3c2a4ecf7342129b04e65d573a4a60fe6f6fe9bc71f7e25c2b381a04818f49207bf64e9ca6d9ba56b72692d372a45131ca852d5c4a3e9b85b39615d0e7fd1b4d0520782ad6bac62768ad3449f85187d3150c5f720323bcb85ecfc0cbff94b75f24ce54e1ca8d3df55ea2cb2395fa0acd992b0865654d4cdd720ba45e93f9243c1d296b2a4cf928aae22eddc81147e3089b0baf9d386553db387147ef69d76ace3b58446b22a68e2d3c79f4a034df196b66d3dc824412da9cf82a33e84bd492fbc583670d153d7766b4aa9713c66bb4dd41ac177c50fde707fa5df0afff98a2ad02d45d79ed66ec3d92ea4f898e92bd4873bee9f326cd8504853304ae4dcca5cb3b71ad1672c8f39a1d60a26a55fd3b934530d94f8c2bb97be2d4f94bff18a03db982df4b6c0c97659e351a1ee35336a6ff2b70f84bbf8d545a6757f0db239debc1307c82a2d9dd865d903f0d003db769e9d634562b3008773315a404ab96a3bd9ea20b22ddd8cfe5a29a98a07463c4c44a5aafd1f32732cdb5056aef3518bb9b96021493e5b1746bb57aad3d066c689f6cde69d26d4b143c2a6030184252ec6df3751f3c820bd4fedd59064e8001a8e2958be9bf5f45b5add84d7fe999ec3e1bfb25b5877c8ef887645f2c39a8c98e750e89b70292bc1e0908f5dec9048db98df73a5ddb9ae3e7ef90b3a668476d21401fff5b01ce595536037fd52049dd66ab2edca0a0a5b2a91caa7efc412494692b0f155d26dac4641e0e14ec5731864c5eea31053f66a247f8f9e7b72e09e76f1f28f546d880a452a774dcacd4842d738c7164141ea25cc86ac7175e95bc0d3a02b0c49e7e86a128bb7bfe9c000a7de41e0d9b55a6248834595a3679e006afd2bef0adeb82b564ed416da345438a1ba6fd03fe513fb3cd94affc6b9076af75403930d6b74bd595a92190f22d06ceb2c10f9eb78f5216d3ef53f2de2cbf7f068b5db8678941aedc65432d14deaf9ce83e3e25eb974516434d2d87b8d4233e0bbb10cf89eacc07df288f8b30e0a8bd652471dfc5f2827bc5b6250221110ab32bd93cbe636154aa49faedf46fb957f9d27b90156a276f0d003323aa406adca70fecc8ce1f76415dc0e345aef9f32617d74c821005be76939dcb0fc93e6701e25ffc9c44e2b1fbe9ecec7f02f5157ce11b9e3115bc40fed74387d1a54290e22cc212a06bd79bea16771c83388ba8c01d4779846fb7346e9f9b6d5186756ee54de034bc8a23bb77ab067c3998e5335c9402e563641f2230b44d8878b6ff88730c626dd8e8f19908724412896a283eb70ef5ebb63e1c92abde00dd2c7c0766f532f0c2dcce67be0731d6e85cf57f523953c8926543d50d47e45c76561fb591d187313db084adb1dab16706988210f64a2a22e359bc731a6c900b5adfe8329071d3cee53c52ecfaebba9d72275903b2525cabe478f01d4282a8b291ad1fa6eb3bde6ec269804c22a0142036efc2810eb9b20c9fab29fc0cf1f5fc24aa0c392b9970badd1d55f4b06386995ada05b293e7f1ed1cdbad3800223f8e1abcf611d7f2505a3d411a0d2c9bd9b0e4cf69bdc845e4f562eec6f8a67b4e137bcd275977ad47f5eabe18be1fafd50cdeb537ca353952cd79ceb9648765e9314fc4e53794341d33ed7a9430100942564f76b803632c021d6961d1a62a49da909f8979d3b5ee9abe4d5fd98a8710e83540f9318ed987bd8c3a9155e3178de7d972042b566243853b12542ef50c2c8f52b826ed931fb04bc2f5448c46d79bd9b4d11d42e8239ba8554540da9928c5fe54bfe5333bbe117468a264bff4f1d977c8c3bc08b0815ec9b2ed0d269d6243fee45d1e4aad3d10002647d83718edb18bbe50c9c3d703f4b1fa12a25a2a430f57aa9bb97b122417b6a3ee8839d8548adb3d802cbc8432c628d6bce7be67528fd14d809e0e92fc8d5f889e5c105cadcb31ee5ccd3be0943af6eef4c4997d172c337615b64b544cdac37c603c03cd80de5379eb948713b3b9e2e9c12135931a4e47cc61e779819c65aa283b105953562a0985366aea4417acb56f2ce6d8d2e45ed3f86c1ae2407598dc3337c05b15b5171dba4335aa9c4679372a3cfbcb62fcc2a0a13e38ccba5dda20465c34513c280d55c21cdf1042 -MD = 4cb6d5a4382d4ab1edbff2c1fd938c982fd4270d33c42bafdb00496d860643e554a9039dc1d8ad1a6004f55874aecd7a73830123dedb3b42aa6547d6f4179ef1 - -Len = 27160 -Msg = 4a96d520d8d5a54eb73f8f558e328d1b3e5ba360161fb8444739a40a97a58a1b59bd684e9ca3ec66a3de8add9548cbe07627e89a569a97b5c837251e96f2c509b3402836717d4d72f48b9b60e7bd2d796df36d525b06e41da46650731501f75142673c60c02c7079948eea68ec585af00d075a108d2a4685c20f4e907a9bc9f9ec7acc54ef79fc836a2fa07c0ce3fb4d3daad85d54d066f40a7946fd2e88e30b9bc0029b68299a995eb6e525af24b796e4250fbf18beeb7264ee61439a90ec8e368204bc9107f1c1586ae0e93de537d5ecc026c041bd7e08b8b4c7e9257b8d8ba508fa3fd4daaa054095ba531eec22113cc345e83795c7bcee149f7736106d09d09a0dad98696c6dfe7d9ae8ba012153bc7696be620e6d98ee561176371835109f80648c447de0007b6aa9327aeedca254213eca2bf019a4a0c2476d8f5c8ca9fa01296742deadc69da60fb8c47afa06ec0b6894f80272e7eda066e4a6a11bdac96781c3f9547cc74d78f302016c24876c7d3aa5320d2169bb379963e4b289adf4f8962ad1a7f50c74277d999a8d012ebcbfdc8442d9cd32f4d00673b1567f2a63fd9023329ebf9cf8fcd704f5a53a02c51977b98e2e1f4b7eb3d59b7554a558febd97378403837fc33f26cb7c7c760b6dd333cd80d4bfbb43282f649875a23fae82d1ec2f9ce8bebb38957796d95e529d3437477f92548a29773c5582811fe7599269cd9b329760ca2e498faa8599de3e85acaff23286c01ae723f69b40c359e836855f318c376dd76b6d9b2249d0b8360fb98e437aff66fdc10dcf4c79379c44b64e2c577471eec935272365ebabe66f17876ad9336484b94e2169fbf622b8535aebbb76b0edea8ad59fb0db33d172cfe83ece1c25602038d3884b127d2db6ff6a8494f70952690193ffc9ecebeb6340c9053f74179944619b69fdf7d7009d2f2d43404047497316b66cf700d9a0c2a901044749d2b7f71ceded0814cc4275cbec4e46bb327911b18810c17fc79996f1d9646d031f634251103bf3cf239b46baefcd2ecf918b4aba4f13afd17b7ee702994d390ac4452be84d7d4692a6b519e67ee981e32e262719549d495ebdf6bec389e634c78904bdcaecd88ac41b35f536e1c9c561cff3aeb7dfd4188f57a9221cf058e5a03848fddd357646cc4bc6e3925f9785b03d99e97a37e3a3ca0f401bf518cad5fe97bbf50a6f7f0214fe0eeae24278463840c1e04ba6f07278af63b13647658a4a7003ac3ae41b4603fbb5120ed09692619f139a1372240e02fdb9edc8c6518eea89c82a53da709b010c6463ff5219f09324361fb8e4a6fecec2ebd691ddb56948aab3783e9aa98876f7c3e69b0f29e93695d37724449fca46c5a0747ad3b9a1ca9d6b9de46cec96ca8579a2cb51ec04b2bb91ab3dda36fbd1d081d06bf287c0da2999a12c97614b667e2f9f785e8dc96f5e19c1eded9418d6a936f14d80444edf15e58dfd653232b0aa8ce6888032c0d64612c41ac7e0a9bf1966e006c61bd1412af668411c84d011d1397ee5fc04724d3a25b9aeae4337f3e8b9a3800c32d36730753adf0582aff2badd6f751d2a663d04faaa90ebe549daded944a19ab1dbbbef090bbf685156b92e21c2222acc240f6a389ea8c6ed67dcc36bca53b7c172a42e5be4c98d1c4dd0f5ad7ed26a14352935889ede868319615e1a3e7dac8a1e8ab713cce5bb091d9dd728ab6f262820f52d91b11a75d1e8d1788ba707c2336ad550d8ccfb3c404d8a9c3a52e0a7306dd919fcdf44d9fc5b94d9690dd83ee4dbeec252ebf356ea65fd0b8c7a0d3255a53fc2703044fb2ffb12495a79da6bc7fb3bd42a31b5522fed60edc62bde12be4f8ef196ad0223904eb49006f1f4900151255008a62978366e1a0a906d3b8d95f32e6c165d679947dee07517800ef4bd6515fc9353380f2870932a90490cedff1987fb974959a47d33ffc2322b11e021c071a2743fc8612c79331571c63978264a0168c177c18d5ad37a3d01fce39c55e9a2085372c2b46b136292d9edaa77320d047a3df1889d0548b7af2cfa6d70826811f7d6f50f510dc5886b71c548314bebf8f8b3bf9419a71a20df5b2d97a4d0c62536a8cf958039170d66e056f9f0976b45abcae7cf4c67cf1c97359e4a7f668a458f6f083e881792594ccea8a6fa4115535b2b73207d6ef1129d62546c4a6d3cdbc8d4a9f1b3d0bdd4e4e5c438996f718acf7e6a6ef3e3086cba8b57e64e0c654eaa7eb996478c21e7f8cab195124a0853d16ad5a3f7ef9a91b658b0a1d06c8c06fd1640148d7244f84e2877a7b0f961142797bba6d1ba31e9597066841bb4396b89434755cdabb071b0a51f54baa404369aae245fc96b54dc6b7c8176760df4e515aed4404f5eedb8e4e9af8677757a22f25719b6272b8cd2b3230a61289f46dc6bfef2bd5ab48137b29d322430924a3ff739a09332215f33fa0e082c7a91b6b851dca6b437d5f654e469ad162e23fcf471fdc4de3376576708e483bfb40ccde190f0fa0d2fe8d47940f42a44b65119ab274a8a7f7251fcd6a54e84021e3711bff0e1f5b08816a10d90e7b096134328cbe2c9fc5e37dbd5e999f411ddff3b0cba38589f868a86e7789ae948f48b23b1bc6a222164ca3b6a06ab7d3538a13f463b32fc01757f612d2127a3f94668163ce587fc0177729a4397a592f5fb4a6c46a8a4762266adcefc72febdcb74f04652b001ffa5807920e9024dda5b0e43ea946b576d0b425df6dbd2e9dec6666cdb7a849fd4146825f4e3b16cfe6e59d4e0b8ea138ac2efd80052a9aeaef30423fd3dc92a235615bf3fb90ac9a536c444763a8f9f7551576315e96016d759375fd222e86b9374718e28f4772e78bc38ddd6a3c1c5d5bf60495d295de9fe00e56685b14727cd7563dcd81b5e611e079be5257be74b5215f4d0ff9909efcef1f7823c724f297961d2ef77b6292b401fd7a58e486bfa955afa4224c2ccefec3356f81fee68383e41a8112c4d3f54860dd2653794b49a46965ae5f32a0fb303cee81358acfb1bc41ccc871f6908a497d8766d48e62af30dd2fc02955b3801b9cb971a0c346e9bb4fa269c7991ece31c88a904eac735cc9015c8e031ddb1a2b6314a54660f2b80b6e39e97624e53d8bc26557344be3def7a67a6c9f036e05ea308e90a8bc4989271e01cbf0127a54c20b961038053aa2271d07e03faf02ffc28595b85a6db1f988ef8885e7fa44a07f049b5f9c30ee42e1d5938d776920546ec2b8a0adddd275cb434caba034dabd1d3df39a0387853db2809bc8d8ca5c90298865de4585117a48c9aca1bb6ab2e727181d53f041860f037e9f26d66b0e5f9d372bc5940bf5939be3571cbc0453cb1733a711d52767137f5ffc2bf293bc0f346f88fb3bdaf54e3f10aa51148a33e57810ff583481bf076075515ca00cfc2b8991fbe38f6aa7069cd234f34764e9a2c420a49b90e8e437618f3d1d711f3530f73f0323114371595fc87587d73cdbaf85f325507cd57d4ffcedfe02e842fdbc17c71d1e53edfab2d233ea63467a804837f8f02b5adff09d9d1232817820bc2975dac849e9d299afaed5123a17a68e2954b2a360ad50d4ccbcac793da33107056bea934a2599d4bc4ffc7b50bd294bbf56b0ada4f6e09049e61d108bebec54ec9466fc73b99c3245304a846bc9ab4f66c8637d7cd9f7c981a3d4b6e0c4bb2c2b79e0627ae85248e6ea2fcbdfaf851fdc244ba13c991ed7207073caf0d046035e76e763a464747f2df81cc020e14f237bf4f9a788e6be4f92d66adb2060f5610225dc7ea4a04b4b66c4a1ffd40171f0c2a4cdfed6356e9955403a55f42941cb93013021d01e7f444dea5fe96d72960e4cde692598f7a85ae43852c9e08bc3b9ad9392fbdb4158e02fc3970b51d713e276ec3baa65bfe3facc3954a579fae3a19e57754b1acb90a5a90af7d425818403dd68b5fbb0f0ba0f89cdb08725093a1a01b747be12ef9f1b360ae2d25d145ef8fcde78980f3c82ff896fe6dd76393f99644d9ab3585fdca7436df8946d021d1831b7f41dd4e5e741578a7826f20d5c963284ded95f8ee1d07d8ea988d9cd4708287fa8eba6af4f7b70c7d4e20ce82996e8f7948e9cef473d30e7663e37f8554f5da0079ff8db341471829d9d3b7c1f2214104c41950365240a22bf02ebf5d0342dc3b099400c3d92b65522b7121bb5ae30597690dc6dd45b65ab34958a58307d3555046610b4b47cdbba14de055985b1da5da40ae7810d19d00b37647791fe80e0dea384ff5731494e2be460a9b7f7d35e77450e2adf8805d5ad67de5835b2c5dccafe8440865c7e7a1501ed53a984794940ea192aebdd95e31c168180a5d5d2759475d298a46e830c1ffdd2b7c0c41a2744f3ca7c48664094c1f3fca584d02d37d5b9fe7c441ffd60b758cf3a703f3c74ee02807357baac4759608e2b354a4cb0093b764fe7b95414457331504a4e66ceb686d9c49c632f872cecd48649aca76aa96ac8a801f31d83750d878db18a1f71490144c4a8c840e0c7195e4b346fc3c420d864091535c05ab0685067487acd28f0024017ef8296c0b24699ee780c385929f4e6d7a3f9d30672141a616189063245fa5a22f2fa87c3791505e4a72a5b960f50bfb840d7cbf344a15400bf3d4149d56a017a35c89a55860520c22412c4075b6c5d1f4e2811bda2907bd9941004cc18c1b4822a5554e35397790b818e083998b84d715e935ac21652203092a9d7257aa211df63293e197c2c8d2541d48e8931c51f52e471fdad1a66bfba3d532f02857b77e662c -MD = 4018097493d3386e4adafea20ca962c9925bd5dd9c61c1a29198b064fdc313b599e9615bec715f9d3a2db986e64cbac04cb253e8ec977ea45ca8f1c9f802d965 - -Len = 27952 -Msg = 825b192f69fb73b2716fb35e69d9c09006a8a2422ac7e4e065143c58bd146e71aae56d5d6574c39162f034d41b7e9e96102e24840c2d8b59a93de4f716636cb618dfb0fc4f61f50ebb7ad6257f512fc5e4973a4aa0bdf8c45964d304651581f7d4322b33b02ccfd083f7e3791abb3bc289cd2cbc6fddf2c87b714fa82f9275dce4c4262b0f3c1a80c24ea1f77625893807b6420400f6400d194ba10bfe41100c527fe90bf4f99dc5816759c81af5e2cd673cc447db71ab3c3adc1154598c1930264abbfce7cb2248c72a52138e950e29b046f9b089b4fbfde70be6acc9da5aef660ce626711a6fb09c7fd6015b6bd5f5eabb2a649129f8f727c06a3ad59499f21cafb0b0194e4ea6084e2bba08e1ffd91d859f8e7b3769d302e3e32705209fe04f1a62c368cf84d2147f9a651d5d537c528ba054d0451838805d9a9ae1e7346208354386e506dcdbc7fa6b2b22499a8791b575de17bdcbcfaa14d7bcf2511f204ee89d2218591d6a2aa7e633a00c9ca1e0eb6555d8064b4087f1e2b4bfc72ac1291bb6be89310e26436e53a61f0e21734915b9e19c8860321fdc02abd0af1beea1b6d883c1f779b81c38f9ab25b7f1a5d31bbaa9e9abd14d7bbe80c9ae72bb4ebfa14999471124c7bdeb216b3c6fd3de86e5add64ad7683aa27da435e079d28a8ac55127a3e9d7fc2c71130deb9e91c66b5cdd8f4474eba19c03b618ee2b28490b083a555ee55cff73b017babbacf106896691fd61ea23297236fe9961ef843448534a4dff6f7a779a92759a3201bc46e9ec104828a1d87b2b00c4e1c02fb0f24b8fcb340eeef80ca7fe74d4da05b92d91d7a3972102d23fcf484f179352722c1ca2033513ca9f67a4db5d913b21b2648b0d9212d573d81c67f6e86463c0938ac1763b75976a3730981378f8dbbb6d93df7825e3cb5db4bafaf1d7f0b6e0dbb344f1ba1f2238880e8c8d0d32443db46193ffa42f8b292cc2902364e2171c1150acfdca593a9b59aa87316466fe0d4d76b18956219e3d09dc3173d7630bdbff080281b14b69fb73ac91e7c5bd8f95007b400084de8b0312afe6c9779a1c866b844d64b81f36c19fbbb297775f813b9718494b7691dae111e4b60d8db0d1831e6c959027fa2953a37ff329c3735c69d8f4d35274601441cc22aa2761ccb23be067e3ec4606cb1a47a25b85f121a6868db8e6fdc673c08a0d12c9003b174816781d3e605c6ba37e55c9f3944993e9fa7c0b8a34b3f366249a5c1b7e63b91a7db037aed4b3513ae8939ec23c12eeac2c6e96c8df84088f773ba7a88a20d9b1d64e5d3b3091df16becbc9d066965d78862a01a7e682d9c2ebba9b790dbc9f938a1b36ee5c3f3dc169c3f225fb1b06d46f7af33031f28f87e8dee195ed7d344a02df6bce410594c35244c0cae1ea11484f24146aa81f5166d66e210414acc05ea562a3e3c52a0ca2e015dbc6024ba75c8ff10d5d345048e81d3302cf68906a55da6b8736d1f8cce87a00ec214485f09995a98611bbcc9c9425f52dfdd3735bb90bc4bfce4eb5fd1c8acb9be391e21386ca14268f26dc74f2567b4a963c9bbb119f33f2b422aac6c7773f8f15d0a838ac96f996de5ec8f88b198f00a38a51b1e6fe81c8ee371f5070a92471bfe920899162227e064ad852e6d4f7f72aa7dd65bf9076eb86735cc29f8842e8e7c3922bbf94558410d154a78cf17cd8367a870024bcd90083c0a845dd7c609d97484649be965b5303dd832203d6e64bcceb97aa9ded74b2ee054d01b0ed4837d65f830914cefc91e755aee8d5edfdf7f6e2548ab3880da6ce2a911da343c05fadf093934ba6ffe7c4201d24899c8985bb4708c9edf66d872b16bdc23be691bd22e4bc10eb842efca32818fca84d519c2402f98ed49f5cfb0eb31817023e83f8402147a87ad24f798b54e798b9671ee537fc6f02eeeba1aa7ee8ec457fb45db90c907c8282f72b05858cd1214452b808fe1bb44dc643063e839d7f733aaee9a79019a2c78a5b8a4998b81fbfd275e7ac81480f96e10d515c25ba1bcabc95ed6bd3a5029e1b6634ecccc11a99ea3a7379c76cc705c9b24bae6d2806728cd232acdd1ae530bc80f097298d07d814082319d86d25c4059bbcdc62cd889232cb8013b76291a5f51187f2b80531a3d848c031bc3571f81d2f6c8e0c92eb5237ea9e4868634f244e81c2a48011df23bf60126c7baaf3cc99d5226b745f75db229656f2f80766d550386756899a588050b9e16f1eb6f26602f7a81ba11d70557b366eb9703420e1829f3eafdc86e5e114bbf5e5ad40b8eee0fcc4479bb222e8cb34af47d7d4c3706c1c115880bfce6e91ce16742e2f8b8db94c3f976b08d4ba98f7e14135ce98a99718a6f87d2b5b51515b0bc4ab6db46a174fe0b21806cdf66de7cc52920ae7b58afcc638dcb4d4afdcc89d7e2be17aaf816d7141aa9357c2cf6c3720f770f8bccd2e39c0a44180b3b87f944ab7732781800eb8eb2a99b84648eeec536be812e5e918c737ddb9a8826fe6b8cf560b020a9b9a7f599fff39ac5fd5b194f75a7e5865203846900694478967d0b6109152725a798c3211ad22199d894f8ba2ae853ec9b05394c40f8c288c69a6a6eded60e14513a71f898abbb788728edf74cc6dbf9e2fe1ca81bcd84d02540048f608747ee5d09ac80d804baeaaf93538759c7e026b05aa8fcff5bfdf728fa74432c8d571c1192cd4a8761c268b840e40ae070230b899768cb7a28a0665846341aa16cde3615424ec5f557446b17ddf9c26f33f700e550d6840ab82e9629afbe764dba2fc4eeb4bb73c039c36a64a71f7e54a7eebf3a037cc73f8ecb1f13939e06afd9de30f4469de4669dc1ff2558cf7f4f207c8f2e2bb60567213859ac9e3d1c46606c12cc94608856f7b291b04f7445ad52230908462cbf4ff3e8ee6b2c26578fc25bd2ee0a9de02fec37babc17c871fd9174b57ecf4b65288b4f45c5d9e4290a941009cf35b07c4fcfa3e2af3e1684ce82d40ce8339c87af6bede85303f101353a4b1fe69252cd35369991e01ef8ee8e9ae387db1f8aa732fa474e7946c780ae494f9ddaacdf538e958b511556ea2fbc3e05aeddffb03451daee00cf2ef217c435a00bf1e1b09faa80fb98a56264b8e600ccfa573087cf9a724477cb08eb571583eed2f2dd9112176d5ce126cdf32a7a779be2dd7e8bd95b44dd4bd3812d9f20b87e8b23fcdb4b63df41c30ff60ff518071500e71636d242e72ac59f0423705447f1bd2bcc09bc0e4b2ca6c77725991d33aadcfab4034abfcdbfad842e877b5eb6cac160c7b6e475358014e3ddde871881dfcf8ec49bc3406d0e4c095ca4107e897c30697c3d454722de85fb76955f8886266129b44aac63499929b50b23b052348892bc56375ed297ba8264edd482eb95112a422faa96a6e7d2df0dd6610b685c7250cff21fa1d6088682b6a03681c04322836e8335f279cc5dd48a3ae6622f45bc032abc70be9ff9e51f774a15ec9514cd25055b67405a6bac92a0a54e652594d8223331b4f5bee038b11d280d13e89e8367bd14d910c74a11a1e7a1e374d9de59269fde66f7a15ff3d01ee686a81924e7c3ec4be5e45eec5f7ac5bd6011ba66b198c73ef124e5cdc8f502f21d19c56c6cd2296d282b7fd6d895d1542eec55e273e12fb00e1e0ace0aa85fc72ad96bc9851aeaf51a66a87e0f8b8102ba452ac612a85ffdf8437eb55b628bf24a778ab0b2f6a7803716775676b46b558cbca7760046ce655a25b0381dac2dfff66490d6890de57b08cb5b04a0a8d6a930c36a96df550182ae355daad3fdac4cb9311c9f79b93b51f9e5c1fd1fe1798a20f9d29d025b8fd26f12c5a200df8d650d5d9c7007910fb195065a9446f6ca84e7b07dfd1bb2cfd1171e86a246ba47d56d5a8efcb51dd8f664ad738ea8412005ff87cb3b8e03480b20e92f1ff816721a43a8629a04c83dbce33bab30c66930a9d30058dccbb59eed26e31d9fa78c82a03ad7b5dc692894519b31701f23d772dd0c8a955567522af3939cd095d7850003bd69073864a77370e74f50ce43044d0bf6b71f39e35182baf186f6970a8850b145ccc53289cd618761b5cbb2a67845d33bf634fec24c1cafcb21de17b31f1b356e838e5f4b12c50195354f60b0bbe3bf46c8a52886aa8f5e7b1e159c53b1c61c821da1231b10447bfc2e6a5d0447bd2ca1bebe2b92e52123abac3b997ed8d7b33b0bcc029c4e364301019b1c239428a7d7490e8c998498bbb78cae9396fcc6b5f3ce6d82210531133e6f60026139bcbd41e804dfed114c63390fed1f3ea6197146e5e4365c0dbb692ec837b47f90efd98c2c3f7a1013b2d69ad675a0d86d5691aee2ee73afa04b913c9ca0a6c142488910762d0f94f462627750e6ace6aae4738635eaee8e654837f25d396dc8c64d4879664bf50e4be1b3390faea7fbf779b3875f47fb9ae557c9daaa405e08857494216d1abece82b7356a733c368acb5cce0cdfa41f3778f0c37fe4741c03083508930b17e168213965862c2dbd15af242f91377dedf6c899c13c9c430c4ad724f268c0d1f16da00ec0168ae1c02f0b5654aef743dc5b2cb92fbb421bc3427acb0dfd1ec76341979dd1962ff6d4297879d9d07f846ed74dd58b46668cc57c5b7d97da7576bb86707d167f7beb5db77ef52b8060be19ed848540988a14776b01d34c8b855e6e9eb3030b4d0f2de13b775ec6492b5f6220693f0c1c2d217d910662787a9eecf11ce7f62c894a3cf3380a1d36953ff6dbf274693a3bb0523c80c181c84252a0e763779cf6becd97082f9fc6f8ff3f02ebe63e9a4791c41538bccbd7a85d2128b604fa8df65809da94a4b0d299e17912267e1058d098c8f8f6979dca95358ad2f193e93fb7df7f662d19d5c675d69e82f01ca21b51cb4f6bfac3bfe11b66004e0e82bc2897dfaed8361187292 -MD = c5ad53c45a03b0e1c8dc5a70031ed1ea16bd09be869d4505ea811ac6ea8fe988d264df3b698e08113cad1908b8710494e31f6b94275544eaa8dca047147f48ac - -Len = 28744 -Msg = dd946aa6a6bab6c970090084b034ff456f2fa9bcf040f78c9359e847f9a5c8996961b2c372ed544bd223f2f297e7ade784ff063ab6269e93885b3f24b37f20dcba1f65de858fe6314b3831b9b632d2664216d2abe70d7d32f72d68ce4906b3b197778cdf25c7f4e2a3f0c6bf553ef52a711915f6c91f1dcfa9776b2b0361087ec9112ead9bbd07c6a2f5b8eebc339e9bd9b3d703a58405d467e04e2528b9a8ac199453322f9aa64510ec0f2d32385621418a21bac264bda7f7101ba3023519a44ca9035528865ac7b480d4630075a3247346fa036ae6ceb221b0da8cd7fee5cd2df747fed0a8aab457570e7a6f13100c35906bc6e332bf5baf6891caf03b938e832726156d291e74c119c559c53a224150107beb7671180c67df4a449515ac5115e0a98348303e6fba6f01e84a11632b8c6d325a6bcb622c13be0ce20eb4b77daccbd72ea9e6930e0a01cb0f48c15a32b04f98fb0a67232379ace08ca23f3c7a108fb8ffd773a4b778762ab605718fbf8660b6b69a6ee6586252cc2a9adec4af09d554de1cfef9d3ce7627c5ca4a8b38d4459374650730359557dba43ebbd6865f45b4b4beaf1bcbd2abc924df74d50763a9371bb15b8b21dc6512e2d6fbfa66d986df6706af91054dba18bc8c16f592fb32ab95c7927e84fd217bcdaac9b8b74141dde13c26e3eb064e1c73195974436388f6c8efd392c7c1351d4b024b99e25d1db708a83c9ae4c70dde32cd64d9816554209e71464d50f049004525a9244df6c374c692173d57569f65e2f260acb3c73e32fe94143a8852042da45c0ce261d3da1c0241e254ae7cadb969ce74764352ed33cfa165ded7ae0fab4eef9c5986be0bb8a4fec3685001dfe3b1a9c9bd98ce0a2bfbe060c3a6ce11822d268013257dfe4e9311e200a5addceaa0cd860c1a033c2369992e705b78b3bb2848e198a4d95ae9b9c268a415484dd62081d4e831b92c210114f66d60759d5d269fe66e6d9ac88efd597ddc0899d9b0180cdbdb45b78230ab98e1431b8d76701171b81fe688ef47471d4831e669297f6fb7c26cbec6e5554f6f1779f687e7fdd0077e33796a781b7f57f22a1780e44b0fcab22404aefd9ad5dfbf97572d970a4ba961308d0a0a138e4fa25003a6b31cdf8dd2897f37730625310225a8452fa26a9f89a0892e4e355a4d812913a33efbc7474b259828efa128ad07ac509856ca15301d0ad79feb8bcc99b73fad3e2cefaf424480b54b1874c49af7b4b7eeb58c34a545f7de258a1dcc7a6b1a3b4026017fc4e62040669786e242f9c3450ff3efaf462bee0687d3f1433ac6402372d3381f16588f9f4213e06beb366362c2b9fb6e5bf477b78f6d11171fef3bcf99dc9c7880c3553ca7358845ded51b76d0afb9592ccb1a5903018532720e93a580e83570494ff87d5da5885a63ff73e9027c305901d66054ac36537a7a4dce0feea00cf0bb2302cc2b0ae890c1dcf4231ec96954213dd01152b585d981d27673aaab28e11c68fb90da0daed14293258dec3d6a33d529f3f6bd262336cdc5123b7db39129b54569303255e4042c4d8f8d36813ddf65c24f6cb42f3378a74f2bce2f5d50b2cee3d616fb8b9111c831b88cc23cea3f192f6edc017bbf895798489488536c62af6ac9a9fd56bedf5e682af35917773a3899d8ac6ab0ce5025c7f1f5503ded239f01cb51005f725836196d28c3baeeba0c271346b87769b55904af594ec2dcdce8d06376cb4db563976d0795c8cc56a6db02a910b37797a03a7908284b8b4075d000198027c98fe8cb8c82a030f6b8e5ee512274225960f9114b86ca0f4021d5a0b975d8dc7b09d0189d66b3c2df1b618d3d04d8cec4cca826a5b1a8628887e69f2200e4b20a2a01c7c83935472f870100eed9a68061e496c1ad10280c0b7b8f1764410d711ffb641f37858e889005ad8e8b2845fed8afa92a8b2bb3d47204b84ea6c0bbe06182e16a0fd1254aa89b4d803c7a1d10d035caa8688ab283652b498d110657c879c961ee7ba664581f54ca1e2b569680f17fe2856cb68be18bf72b1ccd9a47f10ed8caf5a18bb2799e350ab07d441815e494d707be36a8b68d7044430104f523c9b506c5a9087774cd48f67e5dcc0b96517d937787926fca129e7d4ad6cdc726526afba6bca51c12539476d0f177d7ccdf40fc1dee534ae5c38abf78737c27c150ff93e202eb071bd92173ed61cce47f37e7fc401c00a0ce483bf01700997cbe6b7ab4c0a261a15706f8d31ed6549b7601797a293821d84e48b9f96da7ad2ee34ce54887c490528d832080ab7895627be4ff5d216b3e5c2d6c0dc3c38e3fa5f99b47368092fe8387f7a160dc6e19a25488808f6edde093335b3e3560ddd748c7ffa966f331359a0b0b845df8e168c4ca9604f758b58ee527bd54368ebdfd81172112c027ccbd01e267d05e49f8082ea5b6947d291cd1bad33c58b093563ab8afa98a2c66891c1ed4b28d4a15dc834aad8f36092739307afd7e518ab8cf1553583e1a92f690dc5ba894c30ba5b4617faacaf4839c35338d6e2b47ac455017bbda88c8da200a841f28b77b8841a92834630ed6d3ce37625ceeec42fe8203c658fd319eec2c1f9dd11ac0bda931e362d3a104e3e20668464d45694b67b60ead9289dea4b062f6aedb475a8f56bc8996c32c5423968bef66c93a4969d22b9951d24539e10f0ab83fa4772bfb772bc34d6ccca59ed8a7f54a399634a52427cd3c7efaea5def6b8cd99471db08f4c6bb0e36499f5d91a0a27b0321d40646f3d1f5007099203ace9b0313ff13beb5d59661896aeb67a7bf1d8091a3ce9420d7ce04be6fed33d67b0d4589e77b26a3a07fcecdf831c4044c8fe149e4cd579a1aecf222bf8e9dadba09275ef2ba47a46f9cde6abc187d8e8f1f2795ab77589d06524592272566a5d3b732fae8792aa1891518c87b49992fcff6d9dcc2749e0fe1298878715a97a80d40edc6915fd5833713054f006c20ce563b7f85ef6d31daf498403b63d4369db2cce028b5155230c1be2b6812281b526a17a2fafb0a1ae487c8f743c63c4e6b088294891b42a9926f3d1479782591a554b2c9a2aef26017e2e134f86139e4fc588b90528c8fe09088b948ecfb0c8aae5c337ce5cfce0b594c0a80c2fe740237e90f5ce9d0a3011156594d2763850e55c9c3432b284524940f6b62096394af04053581b8af2813ff1f46ad9478372682e589a7dc7f00b1af712d62355942f44bf2258625f1c31f412ca7f09901cbd91df6ae2f609da6bd92bb7808aea826d8f4f908f39a5d1e2cbfc5a59ca0c8e8300e455964204ae04d253473dddc18e763e86206517ebce1426132683b109337313d1ab3cc824d566b5026476828712e9d0d75462739d6b4690fba1754512b60e693bde4f1ef70af1efbd71b31f87aa28f4c7af1fd33733daab1a6da70cb580a57f675135bd079946f0e9018c1b5fcec408eb82e5cd35b270c2f3edb16e6e1dd8b4f8b68908b31ac647199669fc8c0b3b8b97826ca8355189871ca3fce0a90838a87470c1a8a60a0080c3a2c53978ba000b60200d1ab2bb8555f9231219f2ba15c84f1278133ce1760c7bb93668c285b1f6e9ee5f9b1a3b14be2ded7950d7be20a30d1e04bf042ba768b63c25f0e5d8b1dc894fdc9fe86a882e0f559b4bc48eb9a722f6002288631513e7ce1c684f4d803ab2b6fc9fa9b48034220e006145a67173152cf2d426023f9ca4c1a2458b3ecd801ac64810dac36d5f1a794127e78fc8657835455a8993877151c9300f1636ca4b15f037aa07f1d00d4d29c60606c52f1cb0a1701c1f919d2093374e2b7cc036fa38c753b19dea38dd2e8207823fc125f752f41b9f5476e128ddbe65212b55742bf7be14ce28f7083d5334ae330f1e4d93d3afa06ac4dde40885a11d96ae71024ed747036615a2deac4f94028ee126f660b72696e4ed11262e4f91cfe272bd71e15be4a80000982ca86832acfc4295c0ec720b77b439cb28388002f4ab14754371fa296b22662162c051931601cfc52d9598c0bb5f47665a85cb7744471032e77f3687d553a2f921728037d645d55fad0a9fe8ea3c726d3db48651074cd290de6795826f0a6369d94d7883563eefafcfaa0be68cd2576a52334542e622e7f9b8d9ab9b90bd140e0aafaf181e339b3ff602413c0bb772c838908caf497fdcf7d733cd5602e231403617a868a6ea54aab081e47bef623111413ac108a9aa0df5ea048f241e2047cadc13d8f788b9a85aafc77a08c0593ed01cb086e19f38177e41da75984aedc3e86d32c5473c3802ea14415674f702d88f1b9052bc92b0661b7f13f52521b1323379e2f1da29cc00b3be6e2e332c05ba98de48991c1c999648024fa24d3b011f3682a2f312da0c0e51eecc55e5a7c841a7d547de62a55a147e7bfbf192ef53f76c08012d93d57e983f25da51ef22c0fa16811ca732b5786d393c975778c720373e8a7c25dfa48a3af60426c6c20586607f7245680ed58afd02d4a068714b0c6b488a725058bfb572f0fa201900c89f013d1940b5598e086065c4b5991ef36f1ff4789251818f86bcca9854cd2e046158f9e69d0395375723cc9d256dd448cea1dcd54a9e0cbc8494ed3f4357ac1183d4108ab8c7646a1db3c1ceae5b23c3b1bd6c31098a3caf2577d37f5a4cfd986d0f3b56329529aeb29ccfc98ee5affcaeaf1d1c6dcaa3dfeff217d93811a5018366b4d998e1677dbc5b511e6591bb4c1c1389e7d5c3d4d74a8014dd3b4a34e56d8727953a30904fa15be04db0e3e83a90771d33d00a421ddb9e64dbf25b2fac91ccfe19b50756acf82b17d7ff60a95082465170eb026e3c19c98285ebd8f7cf86b4c2c787da0d0e3755523dbf7c9126980dc13f9540cb8a6b8df84b86282fd6b2eaf02f312d35fbc54719ff6fac12251839e6f05d49fca1675830ad6fdd2a5abcbc10d12f7563fe488ce98d9e83ceb4a9572d23b182441983b4b61bf77c89b3fac4af2df157197e37a34b78aa78098db1e21e4a109e645b57200317bb6ac08af37125c62526c8f3f916aa41321d54f8d86744e428d2cfcf3826a2413a4c61384d6e0 -MD = 858deb41f50d96cec9a0850ed70b0d96207e6d5d8b3641fd09af5084d65a7c7b71fbb6fe04876ac728750a543ee31e94e388d42ca5aa2197fb006379dc67b423 - -Len = 29536 -Msg = 2522cf92da7d8f153dca86dd249aca300b85697afe796441ba51fb5b0fa92b5f88f176594ec1e2c24a6c44af8ad8be48e68d877ce30beaf3d76192444efb0469adbc6d70154d9e728ab455c95528be7ea62339017eba5e1dcc2a3e2ad7b3ec85dba93d3df7c8cb0f46c840954d31d1ba95710871982bc7a7e2d38a757078ec9b5ce06d2abcda7280c7d08d79399cffe4f99c7b34f9092d785e84fb8ee2f20b93768a859d2b2c9aad52f5c5dfe21050e41bcf1bb269fa997a8b671bdbf4ca515572cf0d000d664b7e325e6f2e1136cda243306e54b0a61194b0a171c570a8c6c998d68eba2a308ddbad3513ce8cb67d07b9e7fe8095b7a0ae145d85b51c3373d82fc890334a3069ac0d9f39271b3769f9c41d539fe2d24bb100c1e011c2145f6881cc99d33511e6d998c66aa188619761adfaf31a5da11c83bcf5094228f39262d40b3302b2790d4a97d22da49add1128bda56857cfcc1a0d902288b1177615af71ade5288b11e5e851eb0b981853df3439473ac0fffb4d37c470e6c55648ef35a0d937ad8680769910378be5cb6a076f6c07efbcb7d5beea9f06aae5af0f28dea8b7b2f96c6ec8461ae135f37bcb93c09d0e11b2bd02740c6a0d5c7be874c991d370dd740485e4d8b90f912aef1e8a0e1383280cda2b77866eac85eeca1ed936672c4187186ad13532ea28f3f10af543178fba31d6f8d041f00caca61db660b4ad1264986ec89747d09981b44737db46f15a5189791086243b54590ba9e367f5ed4bd011d0453ff4da4424d6ba4e44ffe90b747c8b1ca11696ad1485354ef4e06ffe0d580489cf2697159ac212f7395647cbac72d3c32a01483f667c8b9e125d7a54a1d7d23d52c450326adf17d9c03352c17fd31aae28cc9a31d658717cc654577516f40409cdb64ec31c94919de47e531677072884a35fd4aced81b0901aad4f88f41960944ae4d6f1394b47eaaa1f92f11c76c5eea4a23ed7315f10811550a8b6c1adb087d03633e3486b02691cfe577bf589b994317d1fdb2c5a58f8bf26aa260718ba896894abc3d15c8ac24104eadb8aa6cb1d55d8c1df66db529c21159f014dc1474319e688b65c85a79c2117923a6337c532159b6a0c6648c4164206cd6e1c121e5deb1410e67250219fc52099c009a26d7a7bae638ab40b770d2be27d96fb72097ee6068c7b9a24bf743408459403518c9e8ef9f480d88a332ae28ff8a07249ce4e13a4439d5d694ac376b5dfdfd9aae945566464165a2fbf1571f783b50900367779d77f7242888b339411aec814174e18dcd8fd76c361e575df0069fd49fd099e20858625d1e7476d9503fc783bfe81be273b05c59b876bf23594f09fb9a90f6e1197a2dc92ef491981720f17d6c94be03f77c52e680b1a357a9a62c4e26c0f8c53f618bf0e0858de614831cc6ddf74262d7285d7b454bae6b6fa05934aafd3a3ee8833f8cc9b3b643c6ca7bf89a8c437f8168de806ca13adf29c22357bd82159eb373aac540ebb541ac6bc19b18c03bca849248ae7d5ec30356800d1fd51c25651ea74062fcba056033eb7026ef3f85c46f593e4dedd0f1a8746e99056807e4328892a2be438b21100bcdfa147456cc0d9012320734a4211f01e239a10cf1cc879fba546fbbfb82e18287e1fc4ea2790695519632e844ebd79d8f716b2a5668c4b2a2a7dfdc77c54546adaa36d4bf173ffd9c0d898f3fbc8295cad2cc5692238a6fd04f871b7c42cba6a3b56cbce9211a1755fa4380010d709928d06d0851973925c79e0dff9595e5511eb6065dcd1135a113df2961157951f62dfc95b6013e6182fd35dcff403912a4531e8c3de77212f95a3e83b9096a775b5eaa0ef62d8393f5e5896ca10896d43ef54166e3a4ce22ae9d9aeaee396b81371f7b113f32f1310d251b457b5b59ca7f89d13ed5a18ff52f5276d77741f6eff804e244f7be11c917105deff4b4dc35e465407c8a4a31fafa2d54d1fa9f97143c837222b62b7fdcc24be3d493a1a8d71c3c11a8882b5eb4ad62a752deceb6ae733fad33010765ec9d4c2f9bdebe49fe7552b72b45b150b2a7a6f0e29a4be01f1a8de5ee5eee9e68f675b39e3c473a4c8e6dc3ad4968c265777ed3f9c383add6b0e2cebd262d73e26c7ce25442e8e421c5d1a98719de2e4dab3e9310d1227a75c4f2da480d5070e96da66e76792ff21eca22eb412d7dfefba18ae0b04994d06cd5226af76b042fde78a6aa4d4568cea3f9d60b73fac4aecff8d83f6093574a3c5ff62343c5950b322bd218714e4fe451e36f7c98084ed86b2f9af1aa54e63254c3e285c5b3af9d94f5dd4b5aea21cd990553d115ec78e63da467b9e5f4ce3356af7bf4e5ab905177451cc592afab04f9de278b860ddf62b7f5b2fabc098bc7b28127033c1403b149b814e991153804e4dc5f1e50f2fed87a92013684f98b69e8d77833319366479cbd5a59dea14567fa9e6f0c1f1233b1f617d6efe94b59847a20f4075e90348ed0d35188e3da7f88ab82dbc749022a79aae5a8a9417572c1d6ec0ee22b90eaf196889ee9493732e1683839f257495faa0999fad5361e738c9f973d76112c161a4e4b970d672e0c2cb10cedffd23e2fcdb29342063f9cb85f24b11415b7a83253789ade67d65567a5369f8c523277375f066012beb676ddb416d8075387bbdc57a604e98b0f13d205396e799bf08ae2d8a58ef15133434025e66aabb1f9dd507147082cd98a0fd7a769d85a3fb4cfdec4f08e42805e787c1f03e755a386734b4aec132ce5df9fe516188b82afd7dc779e77dc9aae608d0e19ffdcb9cac614294ef5c47e42684a96cbf5f6a78ed22739dfbbf87e4e11f762b15ac93c7a313676e8048a7551bca6495362882d3f4c46b2033d7041e1bb5e164f753b52444060c0b088d3c69665298926eede8843aea16ca36cc2aa0bf517857f0f818fbb8c197343034ec6a2ca4ae2c11b584d3e61cdc62ada6e0b1f37ca5cba6a5a69427cc72afa044a19e98490c2bc4893e0720e325b23f6e0d9adfbdd087c1614636b8b00344ffc5424fcfc81c573170fe6a12c55980952b9ba4ad9c5f54ea35e02b93f4b4bdf6c0b7c3fca945780072ac42e14ce09556e5711482a1bbfac9275db9e120ece12c3be8424575ee55d99730d8b80023b92ba4773589554c410542a329cabd12774a41bd16d2b381b762e87274bd6888b3bc71954ee73f7af1468b9bc375529048f7d71e86cceb6566466c5a5e180c784db053b3a6c7e8aed1360c2dce0b67cd1cdc07f3d95ba6022a2b2bd1ddf2745c4db053b9864fd64eaa7bcc4294b38431baa0d82458a66ac0cbba2ebd3a73299a7c63788f36a793c444bdd3c05b963224ecec53994bd6c207109a7c08bec2b29ca272ca1efef8a77667a52a916cdbf80e78687e3afa12333fc2731d98ae0897c88784514c266a98cedbdad89b0fab5f5727bb63f0ac8347d0a9ef1a57556c6188f2421602f524f0326705e5c88b2eee67c18e0aa1aa5185228db47a2bfa179743ad532029b44f360cd5ce5afe2a8b2da70e8879363da3759d366a45fee430c1607e6177a7ac12f3c3ebdc3e2732eba47dd652ba98aba1a0aa6cba84b75ce067492e1124662296aebf72d8992aec75dc52e093d5ad3c758daff64c3e3eaa4f1265850d2e4c6102ef68316973efa0525c8ff5f4d05f3a44c4169dc77b7b16a4491c4afd9d43b07f3f26f238d55e96a9ac9add1db595eb39ce4529d34356e80895d647887a32563524617bedc65f15a355dd60b58c37997932a662199fb767a27dfb4257cc009c4b2881952f4fda6668debe45655b2c8a2f789f0f419686dc9b89f304129b97caead3ee08a677b7d21fcfa756d42c5e0681299afaf331ab8f1a41275560efde2839ac109cfb46de9ff1b1ff59aa06b45797ccfee9d6770ec8482efdfce9d1bdfd613b5019d6c43715050a2e1791f216c49ae933a5927097cf4cd7dec356481c9389081446defaab7e84659c582ff66c94b209a1f6d0242feb4fc433704f5de330da9cc5ecbcef20209547b1e42c1d9e1006b3b0a3389cbc66797e62cc7b17fa1d7c7eccd318ab7f45613ad582316c9580bf6fc87671df2786f18cd59f837e4aa296368fc39837b1330fc570fce6ed372c04c5513524f55994e076f2b10e9ab906504d7884e79a9d32c871ea18f2a76d5bfe3eb3a9f8e739d76dc523c9c5743093d34aeeddabdc2a8cb4c4ab9ffea22056d561569a96bcae99c100cfb15013988f47b558988d064287fa481b58b1e73666b0b6a2d0a57ca22003af5d2f567fd743d417207b341fcc6dc385a20db47d99d1b7c60012ce2ffcb65c5b370c7fc1d7f7a0f6ad4f492faf843602a984ae6c2fdf1418d629b9dea4a1f48bc40f75e07ef3d6dd67db733fd5157c47968648bde2daec358dde0d918129f2c76c02dde4b67e9c51b6e95b552567bcdcd3db2a7798086aa38ef7724e7d987f9797ab62d666e11adc023fa87c87c41f4ac64bfba23bb3b3ec403c921f7f34c284add4aabd76657a05b3a603b9e372cd18d99e6347b221f2970a77120b7047e41516435da1cd4fe15431e6141621baedce739b0c6ce59a4d2d566e9d1a36170cd33bc1248a55ea7952e5c7829a2ae4a7f4fb0c9b1cbc68ec358bead955baed63448215a781f57d6a863511f64de4382513dbb7bb5c1fd2f83710b36ec3e41011f254098d8d954fdc798a8b173838fe8cb27a641236f61f99bc4f91056d9dca3d651a637eb71da9f6b14dff8e620e7d075a40dd48b12998f64baf4c4659cb610f233aec240676d3e0b8e43302d44ffebb9295e906d5a085386c98abd891571eb0b61e6c24828615c316b9ef1c94e1c9d3e2e14ff4ab442e86a77278641d2a4948a62cab293336b7c75132fd84acae2675d28cd8b93afbda0985a67991032b2afe79ce70d9226f0013f3b924e1239d5dcaebfe4cfd8baed2e98d9a77084d4108fbb96b84dc56173ad084b52bdb0295b5f9b4a0736aa4465f4d48b7397003562d67ed6ab0dbd717ab258a8edb1b5080772ab6d814a68fa9c75d3c6589722b51df699e35ba7eae589b3b8fabfc491545ec87770ff95954c15243f30d2db6cf19672953336a6ce2c154391a76560d5acc593581aee82cf9744a24f515eee3f6980dd094cc8a4e7b391d48b456b00d26fd095f5c1baac688acf52bc8e794a1a9b51886ea68e0cb82aa3d90e3b3d3f481c0432b8ec007d108509d7df6e9 -MD = 52e4c7a5283c2c147f07e595e81832f5f31f29ec02b4fd68ea956d54a1f6c6bc953fc268df43ce47405362d3773f8f89fa024d92b54a1203f6d390bb88a73227 - -Len = 30328 -Msg = 8e4d3a26b9a8d496f6946eefae61662fb81fda07d71154e7845ead5cee0a2b9b4025ed5e224289ee822bf38194d3a1c7178cecc0db7abad080485a158019aff870c29102823670f24f413a0cd37a7fb3b973d43ad93275f800e52e9aefd17bbda68ceebde26cd1c7e43f0d36743c4a1c263a581edc20cd868c9df0934319d6136aebcb3449ccf498c98b32a77e034829e44b4114e92c0ca2acd86aa785d80a224547f112bf3e208b878f7108f9b6c3037d0c56c30a3e7876e9fe627fbcf85d11be0829fd4caa9ec8a5b29401ee3d01d179e761d4463e5b27ca77a1c3f06018095e96399df9f8b778ab5b613964804bbc5e4328eea614fbe0d8abef1a29f88231ab59e99ccd10b0c321f4a2596366e8ecb68775ba30a9a1c79903132c70a8e5b22fba039fd1dad4d090e41d08f3d92288081d0ee0eee3940497e5d7a2cc5887b3721f4d510b3f6ac880939bef1dc13fb9dd6cbb07e8ab1ec05aba012446f0b25dfbf191578525b9d27769e3b6e80488a6bcdc46d725ea852368eb5a59e558acd85299955c47760a17ffcebf045d8b45782dd575faad8612544bdeaaeab179bd4bff7d22065718a5bf9f2af581823ebe56b8bf121588690d7c8bfdb97eb2392fde8a07fffdbff5d2f1e0e54ed661053a69e602e3d3bf79bec2aeaf4ebef18148bb7c9ef6ea87f3d9d5486792ab02c903d83e06b1d958a06c4f3e5b3352753a52075da9cd75b5fc0194611889a76b705fcc493443d25ec4614ac36b2ee1464a93edb3924d4553f79456b361fa73a6e4976d8df26364d6cfe3dcc34608136d9b549308c03e0368cbd842c4a8afb7bb0bf2e294a9d737caa83b2dc8548992f113dc21e39b6856fd6216811f566e1ab0cfba54e6c268f44137b16459fd7803da9c75c0cd8b92e719a3953a49d400448f1735ea09a3de4344648caaffa99e11311d65984df8865ec4769f96cb892dde60caadcd87b601cbda17162640c0c462fd7df5d0eb4a0a6206c37abd2edcbc9029d26824e86299350b389501a7aab09e46a66d902fe9e79be8726fd6fa377701f416af18b20e6d28dfaf5262b9cf2b6e147f1502a23ee5b2716cc60ab50124dac87ec9d16f24464d5f6495720098fc7a70f0344bcbafcb4faa97c780e9a18cc2aef20076a60bec4c9240a658036bed6961e1149632a5631999dcba611d817762ac5a9a30e02b27cc8129cc3d4ab1c4e3f03afb09608973b94824e6d4da08ad62cd9ee026a4ecbf75320850495ed34a9224e332ccdcc1c4d6bf559402a79ef56916a71a817ab67bf1afc67aa3c637471b05c501082eb71e1905580c120cab181f915b9068eaf124e5004992740a4783299bc6afe5dfd1482a2116962d9197df2d45a389047d0582fc2b7be0e3b36ac562efcf868a76790cb01e767a7bbfcb0f3b3a684f7cba5a5ddc3a43ac194807d66e08c9cc207b163054015fff231dad73f0799028f92a587d2d34883d3e51887ff6ee9acace770f7dbdd4bb6e4e34a6d2f509045da35368aa982234dc79565486a2aa2cc8bdf1cebb939f710f238a1ff3f1f2ad35a1bff0abc40b2ed1f2e0d3b31943650e1471bab28068692acba97e9f8d3d72fa1cf65a495bf75e64d2766dd004c12fe3fc7f3b292a398b076d192c9e71f13af23b7e0c4c02efacdd41a18aa30a2d71919da4b9ea3919bfee326092b84416ef6727e1707c63f9008366e892f6d48e135e1e679cbb5611ed26420817b5afb5789f07a7eca02620429f6ad3ed8f09ecfc93a8514d652927fdf8c499225c59d4bde30456ea82f3695a7974ea0336524f167762e932b05965d7ace0991d76eb7ea67a4678d1e870de3059adb63db557c0485475b7b4638fd3638ac0926fcb0cb81baef494099b4886ad873dbe01d3bf467a7008433b4872788ad9890b8023658c04c53733fa632169b74a4b8ab85733ea941544163025ab5c32e3668db8469d01490836dc0c07a49037ecffa3cb0a5ab37f8951b7f9c3e18744ee7d9f7ffc5d1fd2bf1a17a751780216b38290a0b4dda9211456ae00eabd02a943f6c93d0c4def87320a6c330745c73ae8fcd9a11d63d463007b84ac61e6d4472afa935a3f147851a82f6418f2b5e88dd29407350c953d2d93eac064f2050508eab1863e5d5bc3166bb086beda6e6cf6bb73a1c34a1beb6817c8ea9263c29ed3cd4229512ec9d6c0c1b65b8d87185b5ce9c12fb5a09ce6fad2408a9d7dc4a58f19d504fc7907bb35f3696aeec05cbea9a5a53a72d3c037cd0d7729ed08b425261794a0a508bc7a5f48f03b474ee29cc437474962ae30e5c80f984eeacc39237f0fa584b6a19119240a745601fa51fd95e7d0e4edf894f8d222c982fc91fca982493038950d2ea26e7f1c44858a51e904fd68937b789379d58c324c8b1ea5be170c5e45ac143a1c24f1118c3ac68c69f9c036df74f7d66fb896fd34ff3cdb6b26a25632617d5e902ea67ab68778a7845c79634f403d05e263884fc2c0b346b7975141871e12410574e7804ad6664d431571166c4712c7dabdaa537f364b8faa526247cd4a998c83ddfb4bd18e5924ac0ced78bcf23ec460b0432ef2c9cb5e4c401d8f8b4cdbe613532c02d31619d4ca2a38b1c9a788a57b249d0ba4e2fd5aa647c942498ea0f8bbbec0ced6d86e06a25599e81bcfba1234fffe101be7a72cbf50af879077af69850400d6643b20623e76574638d39ab2922aaf65e142927c9f441887e66fd2e2790e344304a7f68fa576bbf2aa19f12e9d8df8337e5986f14f094a6ad6decf0b9ec4a43c3f84ba36df3b0d14f90b862d5d1020a278964b33d6898e57e52c6f8bfc0e97ea9b3b32fef5af95d6ab102358db9c71d95960a8eb3caa2b769dc27a0b9bd55774a2322790eeb99a5e4a8f8e571e173101a81e66c18a566bf08506b83284ff2a03dcd26093d24066d45ef290d12e6ba941ee3a4d5cc77494ed2561f1a9be7659bfd083a7b0a92e3f616da0f16f147e21c2b21b2565fbecef94063cec1751202bcf06aec28f7c6a6e2d010179d8d73ae1ab7c29b6832ea6c40eaffd722546e7ea5c06b97ad752dc3a5fa17df0b47f853025d5ccc85f69895b83a80e4b7ba4b2dc8d590e9730346ced1fd67c1dad15495858436c22a0b37ffb1a7ad53fc073684b8b8613e1442902ce972666c9699f6d9f6b50718def1570edfbacbc169cbbf37d7d153220b8398624ec1ca3bc9028d94e878443d1f496427a4fc62997b9853abb8c8ed21b376ce038493d9bbecbb575acd3664ab6563edee83e51868bbcd8254ce07a5a9b67cbf852d413b797c2502903787eef04be152c7fefd43aba50bd9c7aa0613468f05db6b9b5255d0e1c00dd999d549882d32414898bd7adec1b3b878bf5c9c74a7b2b03b715fbf6ed81ce79b86b71aff93e727f4c39e247e9c55acec8063c7b09b03bc5921c1eebfa9bc0e5a60a5c9a31a6075311227e7078f7225a79fc41b86c3697e693f115a2fe0fe109aba19dc3f2b4ec7a206d329063599c11e6fe61e63cb6474c02bd6885c08836cd1158bd90041028dac143870f7092cfdc5635226d41d751e127a7a0fb0aacc91a1e58436b2e61c35d3ccc0455684bc4a413c80fb64342bf8b49d8446ba223a1d61cc9b7bb394fc6ead82f31ca122b814f63e0ad270a9e9934b277dc3f5196c6eb51d3a2e7ee843868df9596d738db10c68fa586295d94e5c3a8adf0dedfad413f069c8a5912a521c19725bce2a00279f2de3e212506ccad2074a209b0140f19bc824ffa78705d8adc49082a551349c2ba9ad40681cbedf8335e7dae1db86556490f1277accf517aa13c6568965958f505098ebea775a0cfe4ad67688d925601cdf30d8b5df62cf9f8ba65ff0f3ad619bd7595d0fdcc8c391bab87be686b8b2032776abdf3ae940fc9093076267e6b37c92410c4ed975a3ec09e0638160babbe5fe34e95d6bf31c5fc72ed5545ecc056115f2823dda0b1e6bbcf0b5eff3a5fe03c7fe39c6ff1ad22793dc525d34e7d7e7d6d057337ad3a3af486bfb98cc04f90b1925159240cad2e28b2df6c386a4ab7f598ce3f62879c41530b49d0236422d5a666c0555ed7dcf2f21964b5db08cd0a6126ac0cc6f68003c1a5d22b2eef81b803415716861bdf75bdb97b8526f2b17ea960c664cbc18e89249d8253132a133fb06c3e2602a061c073db4d6680ef9c1cb58e45ced9b26dda663b80cf3cda8174952f9e0d3c2e08d9fac701df51c637eb6df850d3588fc6fe6dc7f5270fca725f9bd19f519a8d7cca3cc5c079024029f3bae510f9b02140fe238908e4f6c18f07a89c687c8684669b1f1db2baf9251a3c829faccb493084e16ec9e28d58868074a5d6221667dd6e528d16fe2c9f3db4cfaf6c4dce8c8439af38ceaaaa9ce2ecae7bc8f4a5a55e3bf96df9cd575c4f9cb327951b8cdfe4087168e189c42c9d7bbe10ba07b3a8d07697a60e46c299257df0d4613d8cab19992ee64aa7626f7fd6ab4ef482c7d7fac635229d92f5bc85fd8f9c1adc5659ec93ee9a512b0ccd50a57d1cbd8e6a9ca6d4dac8eed8782f38c49769061f734f229fb96c3e3e4aaed78f3c615f53225e9a488e804941d458067b10226f2f6af7866498445807a57add3df10720f87a869fc95932f5f590a1b6ca02af9b33c3b8df8b920ae8afa4992a57a4f549a6f77a7dff44c63b1b3471125876f8d35407f9f4bbb0a6365dd07486845b13218423a3fc93562563db482fe0ce73e45ebabd248e9df9008a3aaf71b96c2049f2bb8569e42d9835b55e5545e9d3025d868c6da075d875002c6ecbf98ab8fa7f0272a535fc7410df78cce31af5102a4b91f39fd571152c8f6320ac75c210f29d9bd20c6d0d11c80cf64d7816cc2df394c816dc2b4afc27937978d84b291b0e8b0303417bdfabc8a275079ea135d16521731eab0ac7346df5b49fd9e587825831822cccc53aeb168b3e25dc23f9a489dada3295dab266069e5dbd37a9a4ecd878627536b5e679bcad99cdba04e05066a7447b2103d139fb75bbf9780148029546e90706b1aafcc2f2cd28c1acb27a0471fb20d7eded565361187c26543a6c9785610ac423501d2e40245d788437cc6c1e454a3f00cd64164cba6ec80943d1e61b10a5f9729e830a81e49468f237eea5986b21e2a53b0c4c1deaf6e78a2bda8bf23f012c065dd65e9c56f7175f7988b7c5b4cc4742fdf6febcf03c0a3eba2e8df03546e54754c03079c2ab0f34c641ab8f6a74f641dcc934101469b98db776f4ff3c9bac9d4de78a0070dbd8d7e6c188ddd3407808a02ef4039ea57ddfec59c8069a280a700ef37319a7adf8b2a1b156963959540111cc487cd517dc9c1f8012ec98168628618df4acb149f92bbfb91ea4e2 -MD = bd8fbb9bc746521cba8628670493cd851f43b6f0263f49d3b6259519fbbcd93cac1c7d215425a26a73a3c0f28aa18833a4811e3ecabeeac0917f2e18f7718c8a - -Len = 31120 -Msg = 73dfee3b9a968877082b72fdec5a890239a55eab0ef441cf757f9eff51ed8dc392bda427abe60f7646bae3463610b0b4ada256f1afb419fec6f7f7b3f8ac3806f60c488a96e8c236838dcd6833eaab291af58fb31e4aaf314a159bc5c633cdcf0794816d43e4c73e286ad66ccd30a3e9e964b2f843fe2cf069a3333ca5c972a72d1df8d79a2146169b1aa659eb29bf7a80b867c90617b8c38b6766217cb84f15d06e54d083e968474665e637751e286649b8552d4fdf7a33182bdd7b32468ea158503e60e682545890123e0e52570535aa2e252c069c9bc778b53f52b1bc54d32d8b5e90ab3533d1e0eb55e76c1c7f6d0de07ece1397420814cd35afe062cc34b7e75b67ba4a2d3ba0b6d4c9aab5be98d998091c5e18987c523d6799a77f1b4b5f2cdeedfb09691d373c62bdf469e93d761c6e1dcf67c5ad9bcc7c18ee5c6ca08b218e2b57ba10ff0d45a8ca328229e54c3454d94fcbf02358411d349d42e5bca48f1428b4a449698a994ef84c46a517c3aa6359c48e4264ef65f1f69d77ae26133e17edfc103de416fffb4f2bfe865b434544a418f6e2faca00a165d443f0663ff64080154614f7194057d8b5f1f33934cc9fc2314cf86d4fdad4892bf0d3058f7f37ebe98ef52bfb240b9ad369153afe081bbcf9d7ae43e8ba336b8ac57e8a6da0a3365e3008072473bf9d6eac13e509c1619956e12a06fc696512da091a7d40232c675e737713fcf51aea6c0316c3bdbe196132b0943df2b013860105ce676fce7b88d0a167d7ec72c588b7b6465a83c9ea1d748d15713455e5d0e901c3cf646a38a09b0002dc5ab1687f350dca35c1a87cd404c0d529292082f77844203d86be0bb8a9d970a9af7baad8d050cbd9e024788eca91fbed39db930398180e393d949ad7e173d9c65498339a6ec670d049058653ad48af45cc4cbffd30c3b54cf1b290052b1864bcafd0accdf9b8e2a163134d2c982c1bba4a3dafec288e3cfd0ae1934a6f0e39122aebbd7a586e48d495167620708664d31c740bd868c1ccd5f0e94baf959e81502cb00da87330cbf149d5a8381e9eb519a8b97acad7a48c5b0c92623b861064ff1ce8455f32469381e6198c7b8abc341357d6a4c85f7fa517c4a47df728ac09a6645b0ca77df7c70cd4aacaf19c280949919132dde7993e9181e647e964ba99cd6bd10b893c8d90187a5009a23d295d43bfb4cc0e583b8052ac21651b23813bfc9912ea0c574e152f42d3f1975309588a4705196598ad93e1ab1d82954b4a18bc56e55039b6837fd893fa2bd7c70e21a5934dc2e990379ec6e8a2445dc55d57940a14e5164273f59cd58e5f6a8281e11c09536ea22821c98ac978537d7a02220d1d6552aee168a001715834596baabf7813e1c69949b23eb4b86658fd51819eadf8a13f067ca8a791cd1d53ab69d0e43f18bd72d5d93322cc1c36fbe33121f5ff01905328fc7c33d452a86468663c77fc80b0195ec1eca05a5daee339042b4f88a1f9371b472c6c5168c00e984937a134b282633dea25dde7e397b907b1e7d3d240a593e747007990782cf944fa078a7118fbfa793b2604fa15b82453209daa64475d0e95e2408319e8b5ce7460f4593a19e3831a9b363b1c5ddbcd273995fbc61ce7502b0233b1752223352e654837181d01a929f49faad422c65b8ae416ef81290b02b48e222c2b8c3ed57cf0494b928c1e11ad2da77baacd427785096aae1cd593cc356e551bc390cd5765ea41be30cf0266ae2e97d326c417c91e90d75f1f874555b88a14a7c5959a62f23976b77a4c754e35dfb7ddd1700df85f61a62b12a9eb4644caa7f8ba036b9f29c6315ff96c3f7148284ebe3239ecad50641f397ea24b46e21655352a4109b61479b9dd34972779f2f1a6a1d2887b8ff88289b2ebda2efe995668879bb93c4ebb3a585ab336f70b382205ac37c383475fa12ebddfb95b157172261597d2cb0f24f254feffaf75d224a3b407eb54cc7c8daa5483e4a79c347252d808a5f480a35987f6f09f6c6a73bd5cfbdb76a11ed78b86442b810cb703a5dec5874e8721af62e386591bd39d990b3521505e144100601b46de3f50752911ff37bb18f377de45ec4c60fc4ed8ea1717708d2d13fc9e1453a1c4a4db9e4fbe9b74cb8da14ad50c8c8f2ec944e10ee8e82ebb6a081959b0159f043a15fa1cb59bc5e035f7623fbfaa99ea0a1d81ae8692a4019e5a5edb3a4886c789675039fde87222975e86c2642eb0bd48408072fafb1a88507194c9bdd69f3418376a4d9e68c3b83b3f800605ff1dcf0917a6014b0dd77708b583ce3ea632746fee0e01a10500cba90016b4a9072847d809bb0481ae25f74f8ef290c7a087ae16f505fd0da670826a0b1174592d184e3a7e8622a5c84a30ab64aab75face50b96b217e8ea335c0605c638ed1c59370bb9ded004be428f49a79f74ec0fb296b3758f0b6b41930c7e029b55c8fa73cba7dc926151d4043c6bc8a716d7de9ae0cd3ef3ab2d19b0c813eaf12eacfb641d492b0001b2f0f699bd98e4581fd44c0c817646bdd77a71d8ed432f8d422812751a2f9178cf1800ee689ebf046cf9b161f9a7ef0a106cbe833398bf383288661b426fad8d4f570a8293629ee06856af295a58585a81f87f130e6e08f723234856e874bd0adbb2fc9e676deab6b9f22faacf12e875d1259ccea54f7294be02a16f34c427b51a33be8a0c460c4c07d51a2e7d5c0722a9fcfefd21c265d5aa2c57ae4fe95556b5e1388ea9756a6afb0856fb8fbe1d2bb1838be7a95049848fa9545b616badb753c453f266836eda3c92cd592bc0925690c42cd6667f866717827ebe91d0999f9de5f5fd6cf77f63737b65927aebcf6cefc7ca107fda8447e8bebf1f08a280d53a4b07f8e35904cc48cc08eda3c63a3475924bde1de6acebaa65fec5ee68ca22d3fe722bf33267de628c9db1ceda3c78cb2f9988682d641d068023f96aabde4e10071cdec2080f616ac30c2725ad3efe98a69a56873615a3a3161503a4f22621986def597b66641d07793d97cdc9a68f85fd3890a38928462b2fbe2bc5c509631438d2e344d1ced9e2b71748f1b6ddf33a3e597de3af03ce43d305b9f5acefdb2b71acc645d3b55fa3848484b7fa4cf25e71e766702f1003950bd2f45b304052861f6748a8f38175f1e96c91471f5a54999cc9937191b6adc9de0d2520d86590cd4aeab292ba9ae474edb5b8caad6ee095c9e74c0f5e5c9387559f946b2dc45da7fa1d4c2dae6973d5984841682af25ff7ff29d9721d6c7e76776e8965b6c681bc38e85da15954ecbcf20d7448204d9a6a477781c1564d363e4c634c36fbd3c3b50b332f1643c415d004ec999316e75694a8b98e2591678388dc6624058454ec3a7ce608b3f222b8bad5cef77095285e1d2ad746c557222dfc30605bfadaafc4f292e931a0f0d49b226d99d708247879aed5b9f2ca2fe6fb414f37373f844e13865524f206c54487aed53781834b3f6eefb248d95ba21bb60041d501f90a97a19dcd80920df7d84309148e3d0892e50687c86a45a1372926e00f200053f5f436e003e35bdc10fa99d9328853bf82d2091f1f087cc37678138ac0027e73cbcc99f7fe37939c98114fc7380c0ad1a26e3f5ec00bc7eae77045a55c62c18117879389c662837415852e7a2d01ac667a226fedb2596e3e137a83daec2712a65e8cec3e644e738d11bdfe9b19517fa593546373fddcb9e681fc97d1763bb9092a456cc0dfe1aa0e132387d105e3ccb7746ee199aa7af00bb96047310585fed40219dab43f057220a41e90c5f89fdac4a5d6b207c01d5ad4440c5ca29eed292c6f7000c58da111eb4b16e31efa6df3f3aff69e6447ac406aa96a9ece4b5b813bf8b3a499d09cd0969073468513355d6c19346c58480feaf470e0d45a13b74f2925488fd810e0f74afb9e82a24cdf61586bfae68dc92ea09b22d8c8f1ffe9db1e7e98892b5554ce2e15fd5f1cac5347df2eafd2a8d5f1aa8746b9403915da6d418c0b5a3aa8e09d6b65f9a49c3b7a5728e9baf95471404fdf64eb05da5f704dbad60ac9ac106cab2873fb1bc9023ad95c24852337a703d9cc04d6df7de594c3b2e4fb9f2996e0418ec8698a4c087c14a2687717f97e228e75afe295caae2f16513f47a45b4124a7c5ebacbacc562951233bf89f43ff85b703ec77f168c2278fbe6e57a0e7192125f4642d73f2f227d806287081bd30149b9d44fdb90029667622f9925b7826bd0343bc537c66e660f174b447860e1bb8846c3edcb639ebd213a4695f9cb471e188db7a859fcf3abae49569e676dec857b897627cb0bc1155ad6d45282d430176fde4262da2d5f41ff890ceb319d73dda804738456f30a3d68da41554d4cede62aa8549b24e211e76768e6b17379f842a24a449a0ba3ea73cfc72624b5afd118fd7e76a7c6b5bbfa7a6b6c97b97dea52decd51cf35a8e277140ffb2748777a1e3cc3211f3c12be099d0316f45023da6cd200339a718c72a5ca172903922e59648d08dc67f173788363c26e5df406391f107552925ba91b9e569f38101f5eef9a52d201288372abf6532beb4af19fa6d81eaf473d40896dbf4deac0f35c63bd1e129147c76e7aa8d0ef921631f55a7436411079f1bcc7b98714ac2c13b5e7326e60d918db1f05ffb19da767a95bb141a84c4b73664ccebf844f3601f7c853f009b21becba11af3106f1de5827b14e9fac84b2cbf16d18c045622acb260024768e8acc4c0ae2c0bd5f60a98023828cdec18ed8dc298a306c38d1ece01509f3265b5f8cbf441f0525097e8b48234bf69f65cf402c7540a023ed231ef95b222a900ea4bfaeec02c6d8b3b01648ad7a165237ca6b557b1ce287b0ea137f4ef54534070ee793695a9078ec89bcea389956878614ccbf917b61f8427b7cda870fdd92d2d297154262fc65f28ff1a54b2651afff12d6f36ee8c906107bbda399ce5e2cf0a430ad0dd86520841757126bad725bf1593c7959f16221894f5852ddad3172fef866b3321755491fd44fba009b42ec0b6c4fb9e901d7eb3b8acf70e94911f54c538bd0559c5740042b6df4a07c3e00bba0934d92a684b39592a576331e5a44672a227ccef3e595ffa1146ac1dcee0a70baa9acfd5c132b361b5ceb519984b0ee00cd2124aa8acb50c9e574fb19bd99c8fef5407faeedb28b796848bb372beb3f5bde55ed2cb140b60a53bba2df471f330208b09ffb8eda04315a06d693aa53d9bff8939ef6f3a68de6e1975f79f50b3d484665e4ee71124ed794be3a2baa7b5b918e62a095bc5d46e401a0979641fe465640e8d4d43eeba9d0cac76c7b86d22375123b988585e58f86566fd190d868eca08aa1e66932d6d3b14ecad3efd9f8cfcf2696ed42eadfa642324d941602cbaebb8639a00a17542afda32117051e4fbf243dfd255a559c49ac37c265827ba70b0bc618882336f43e1a6a729c57be478008cae6c74840bbe828c976ac628d7b6015bcb705612 -MD = c1644263ab1ff816fb1774369156e8e7001e1a164abc73f1bb4caede515eb2cf5708b21612f1ac475e00483f0552869603a7120c0d3e5a4d15380bb6d9aa9e82 - -Len = 31912 -Msg = 349b0171e52c9de8e064c642953b9cee4936a32ec7461a1a52ed88e9dfa2976c817725db25f999d47f5773a144c728ba9a262c8acdde5076430d4e1cb2e4a2d8904d9c8dcbd0b4a2bbb71d4a55709d09a1349b746ee67a38443e255d9a26ebcc49648e0f417a96597acaebc62efea3e346a7197112243f663cc63535ff321a4f940622eaedbfe801a6da069c3939e45171c9cd0b2162480a15eea52b49ced66a597980a5396652a3262d9654dce9055a0ae0e0c903663c2bb6fe9ec8e0c3c7248006d1c88c397b45e20bc27781d5b107f935793320f8c4d2073e47922cd89685f1f53ddc4dfe0cf2c2beb28c8fc68e5f2610c1d2e0e28806f0f5c91396d7eb95958eeb68e67eacafae8d8f1b6e84446a79b8e02daceb2fcf596d4bd384866d5d521904f4be8104868ebf81ac85d77c30db77fdcdeada62352aecf6595fafc5e411ddaf083dcfbc7e4a9dafc83e87deba329340380478c8414bbbf12d90189b32bb23152dcb2f7b9fca6f42f6005b110f6855d2f8608d0afaa42265d77d8a965036335dead06ae9f2f77d61bf341cbe376305db9568e1cf691e687adf90cc5e456c55b0c8b448af7eb70e35aa40928c3b0deb8295823bc0949fd757ce30a89c1943d1364edf91754cf36be63f8d8524224c4ff0821864848510b5252cc4e4f8d5a5ee1604ba0de26294dd9b0683bd2df40a784de39125c4445a4b0b7fb649198079f57972ab849fca80aa7c888a0150b92eafc041554428d763e132516d9fa822a72e86211bbd548ca11ab24c0b1b357aa03c7123cc89574815bfc22951ae4cc416e166987381a8aedd7765da6cd1833f486789115ebefa9f572ce290ca3dae6cb056405f1998433a1e07bcbb17ece20e0e78309373a9b8e21072ba0d401675255cd53dff77cace374b14e0767234fcf1dab68d3273143a1b2ad773281bff4af402a585fff3dff1ae4ce4f993e77076ef946ac975c6c528518ca43569c3c1d5e38b0f3fe7f79e53a609bf2e9bdd6afb1024dc0be5d484298d1e202759a124bdf9dd5b9440ead09d2769efa715bce8315d72547c08051be5d6c895727f1befab3ee1d1ab90343d763a57bb8d89ebb3c0dd661a4469c250053472493d639aec46bb7fb8ad623dad87e5b86a087fd4935199e9758a8d71ed31af0485b18e87e13777a05ac13b6ce8783275453f80de4f8c97e1af76fe7cb810506691f6874897257a2afd10a52bb5f02976945b1371b118e1380e3243497a4b1e81b533d647d6b9cd07eac127e2de97d1a39f83c1f57f9e7fd4dbe3e442fa89213b399104ea659b771d69fd4af7291632e4ade011d282c5779f5db469cd0273627d6437989b0e728056c1ec94d35f155422079a8b718236d37fdecb5b5458b1e830804d1ac197e6f1983cb58fde483b4043f6d8b73847989b5ea450423ec5eabc3ad3fd13c3c9a1d1cd2081c380ab31fd31c0c21e909894d523f86ca4f311c6e485a66d0a0b6c4828dcb677b722519f93d2ad8147e23ed28bb622460bdb04ef6af740c587004886ffad46c0f32a032b0b10073dba9402f9c4ff6a08fe5e660a557aeb2e120a24005d281883ff0287806cd2141d0010aab189e518d706e4fec2aef5edd03491ca614a3573e96410a544beff1e4aa0bcfea4e15373deaad595bc7c4f8fd274fd004fcebca11aa9be272009816bec2202c878d42ec4427299f3a3c772195c5bb78f72f2a5e83d5673d3bb563f432a0f49ced56a5f532ee698e01d9845d39870253f74bdd8917af39673beac21f02ceef8d964acce68c88f3a24d2f6b004ac3bb0d7fa383de3fa0991cdd0140fb91b4779b1cca1634b38f4e8866ce99bf6c044c021af69bd28e51fcbaa9a95f1e51fa3331eb6510743a79d08d09079eeeffd14bee3385a3ea663beacd1c337afbd5f888ee8cac5a09a3d1304c8e8af91388a3210e64013a9a79a6d9c0cf40232890481f2d6af04179621dd42371c926d19902620f26d9ae771b5b40321d5ff60913513c7b20e1655807c832ce4d42a68d9377955cf67f9df4cda1b49d90d35221c1bc875428e0441a0758e2899b7806bc2a6b21644d7387882322bd6fc45ad6173dd27644fd8d5c23d3585a01c6d9b5f1a0659cd1a655d9c5ae46b1352246d03dfa5b8fda09391c2a0e3f0fb369f842a2a7ef6e119b872321b186466a2537ff1a69804a6ff68412812a858a1aff541b63a3712ba09797e210ef89c38b679ea1410e092c832ffecdcd9ac43fa4f16dce9925934c0b24f8a537ba99df2543fb75367a5eacc02ff9ac53d163c6edeab5cad790be55bdce39dafaa56effa454ded95f10e9518371153cd880ec865235bcae93975acf34eddbf1de22518ba514a94c4f8441a1699dc20db00be7147e7cf2d8518c011f0d1e4f8856c3ea2983fdfb5c7c26f012def0908d8ef4cbe7cf2ae8d685f149cba2da051cf90ca15fed9b3578697b5d3c4033f14aa9be0376c0ca1f37c5598d6b92abad1e496f1f753e56f82e9c14117459b274b3a4da3657ffd5065a8447546558fda81aac6dad2ff2cba3ed8873955178068b5704cbccf1e8c62eed472d275f726a7670a68ae2d6a763d943b30c616a27aab5a34e254feaf838093e828d8e905b5ca8decc39491fc8b9f8bfa050fe04e5198436f5593789ca8515ecdaeaf2ce905eafb3920b5851d32892cfd4e3d3e83ccd67707eea0c74bc47e56694c7ec609deb0b8d7c739913535a37e2c5377b5a9b40efee6f5a472269eae83a54a6d3dcf08c4ccb000473dac5a9489705be6cf28d1e7e1f2b2c60293008aee6aefa61ba24acd3fab130712ea6a0555afafb11368eb0a27156c2ffefcb0b99e9e854ee7e96d7419af47a297572c9debd3980209d2ca1ed8366d06eec877e49b2a52902a0e3a6063a6e640555b6a0552c25cfe3acc35ccfd3dfb745b5f1db3eef79f926b78763925773608d25feae4926643cf2dbff6bc9c115fa1cc296acd9eecb37c328feca9650a802398c975e3b4a5979d6a14d395c09ce1b4c98e26dbb3f0d87708bb63562d470bb92f03d3aabe699e8f7a3195006ec5c8d6daf6188436ed54ab7364a2e8841621f11d73cce0bb99a2cee48004a4b0745e2e88c909712eca703ffdf27208735f08f3ec83282db01de9813067e72a8d91e9e55a6fc14aa36f745b2ecd9b5e000a09e8239aae3ba7ddbbd1e75007390e05b222d95008b69ec4a8298d5de59136ff6cf84b1f27afa7c062e690a22d7a39b6010e8bd4a65d25b053cea20b184a1a26794aeb7c5c34b9b025e7b3c51f94188d1ed1fa6462e8431ebf75f53dfb30b66778078b181270e4954bfdd921a630b3725092ae6605fffdf332440f5c57ec11abb056b45b140b30551d4f891e89f6104ee0792e4457495d18f56377d1f42533d86a60ecad29aea5d9e3064b24928d390716af0264206f6a7550fbb5039a8425d8ee4cbe7618014c09e549a79b879e36873a5cb23028182cf28a34525911b0ee918443af1eaaab2ccd6a4126eb31d00db494a7c60e37edac78ed35d53d205296ed746d490da7554d0ebc154f7c58ccc8786cb9c7681496f1edbf27c616911226d305f113acd7a6b8b221eeaab6c43a6fba09ba3da588ba033b4931ae4b2a97a52a80f89561014774a3e2f4c0023cc00862b4d1ae2d5b01eb48d37c1346b48a1bdc2da95895efdf89c7464e18c689099d57b526a4685515b0fea530806ef69290d0542de3b16717000897253b6b73bb358354e2a6be3d9b5a4306747a2bba580dee3dabbe1b3297e04d1ba0af5ac27fd9cdd92d3d97dd3ef20140708be5c684991e304c723d1806317d1ce8fefa3efc901d8b2eef5bfba47f1f994d3a04e3bd3d487438867ee00cfc82e024afb2afdb625bb30e4772607509855a330ff0d9ab00545296824554524843b07d4becdcc3576f99f4ca44d45a991bca49931270f7ea2a128eeffc3a801da8d31b590f8e5d7842850902391ffa35c933b84dd0704903b3fc4a540a5b3e8399932561838d51ccbabf7576ba08ffe877dba7c693a04854d557ef39d77f3283fe36c4ecafa1465bc08e5fae2d580eb70d0b3f84c4c99de4796da826cb6d0724bf051f81fd92e42e3d3cef33fcd7d2ac730ba811c9b3f0bb88849ba44eef636fc5485fa8d427d44c170f4f8c8d4df0ce912309f50c26e8e2e8e5f03ac8cbef6af647abe99c29bebd3850a4414a8213254f9b8ab6f3ea2d6083d8d071a1ca521f3b492ccdbe61498a864619db9a3ee1ba96ba55dee8c6683d3fa463d041b434967d9809dba0941ebaeb3bd3e1e44802944cca8ff5528441820693d0df10513fd6a27a6b9cab8de5554e75fddb92691fbb5b11638199ea5f36bfeb4026776919e793387a9647134564963dbd510b69e038a9d8f70c24c16b6152f5da2edcc36ad139195d53ddede6eeaddb3bccb710ec122066731d5dd00c0ba6f9c77ea828db9c7b673d5bd3e471fb7a97a1d4fe25ec51a705003dabe1eb3da53f2e9e446013514068413493c08e94e5b914ef487287fe25fbc6f276baafff360e38171633bbf8726692688349e4bfd688bea7fdbd66208491ecc72724015741b00c7088697b97f8a7577f0d461c86354dc78385cf30bfab0f9a4124e7894faf6bd43101c9fa38ba74b9ff9881ddf1ea51570b48708ee382bdfaead6cbeeee6688b5e3e91ce1e2a014e0728bc0d007ded994c8af672895f1e23149a598d93c4f4ed90da72ad79e92d1f35f50cc9dd0f730a941207ea5dce0c86ae6fa15f14252076837a5bb857378f11b4f4e6deb541e9dbcfe047baec137b5cb4a3b0bdf0758f989e94a9793693abd7fc9ed6a629c3c67f688c427ea4bdef27cfcd2434a93476e65acfe85a888c07d4855958dabaf37d77e66c64a0282bdc7a6842582dbef09ac2407294f6cd9f2799d7bae9c6e95f9357d2074ac9d6ebd7b716b9e933a2284fbed8333bb8963b9f8a7c4a060525768c91a3f35146418c4580438a33d0e34a2a5e8a68592a42efb448db7d4a100fc6eda7e4a704cfe87bba488739e47ff2e49f13ffb859b6843a2a378ddb027208cf2b1d0c98f1a15c38ba824a5f67ab717632617079ca07aa9945e90bc9db95910db973945f9474ed51aac0155139edbf7d78d9b5432678568bbbcfcde0421538e13d2e145169b53c452f8460b5d7b16d78d6ef069b0ba2f89fd07e5cb4b25b71181aaef514eddcc981ad31c4f3cd80dbe6d1141ce7c5f201344857209dc8e2d9e0d698bf109d7605a5987abaa187e6bb45fbdb40c001e010e7780cc221d235c3f9f55dfaeaf4fb811f95a1aa35936d6c14bbb71aaa3c17a837e3e1a9e78aeedfb1fb8100fa80e7cc5e19592c367c6f6ee1954a130cc0e32794108850354f587db75d8499d5cdc537ef97f3a90aaf67542b1cd6c26e5cfd2f8a72535db18c2d3e58afeb0de3480e54529623b948b90f8c6fb71f91555ca01089adf51ad2edb792344716d5c96c4db215984bc57705a2a80e087718584c868b2027c0202fd08209d8c7ba99feb6edd1b712fe660c21eb07a4656fbfcda90affdc5456f61ed13705a4b628c2d9c47923a59a9e137eaa235bc1727c004bfec7df2cc82c15266c21362676f3d900f17a386fa3ad4644eaf5f4c3942e8249ba27a97ff7b1f5dd0dfaebdcaeae550ae -MD = 27aa551dfa2fb1c0f4504f9bdfa68e50b4693d9327612a3fe8984c00d05d9cf6d3a0a8d0223ee5957504ea56a228e98acc6954fe35c7a577ba6be19abddc5dd0 - -Len = 32704 -Msg = c8e2e36403ad4ff9f60010cb877a57139ac1463a8522059cc377128dec4ed899e447841053be14c356aab00875c53e04d4ee3129adcba1fdfdb2a11d7ecacd82d66d22040ed1131c45e8d8eea6840a8797bf6d63339a0d32fbe48cdbc85ebac2051c66471a2e748f2b80308603ffe2244bfda3f000d76ec324d57acfb351c7dfd81cf7e0611d60a1713b5fd7747eef6458707ad9fbcaef39df4c140025ed1e63b9347fdacae6ffdc7de10ee9e24858ce27e09b250bbab51b961302760778e4d60f2ea33a3cd078c7b83ae4c533a646eb1e15addc1af1ebf1b0f0eb39423b44be41d00d0aa124f4ea8a0d8a7251e0e141a6d659070fb5b74495ac7752bc7e64a5b9e36552e02b9ace5c24a7f8223e505a28ed47acd14f419aac0f4fc85f896c12de2e5218e12a93fa9445e4609007bcbe0a201ed64a07b27e5fe01ba312a3858e187b7d668c6c06f69c39e9b182854cf3b638868a6124327515e982ebbc15d7a0cf908e43c9381c4bdac85df3dffe298392fd29d2fef0e80937f02da9472889d06b362cb880d5fc80b8b9e92f91bb7af60836acb509b1fdc12bbec4e59a21c3a65435ffcb998cd01d9cd6346c7f0468d27eadba3c6bb099255a1beea59d4bafabf355b086fca5bdabf0e5e7b291211ba15e28f96d0a35e2be2cce53f338ed7266ae5ee7f19168edb11bafa909af59baea0f701152cf8703130aa19cd6534e375fee174b13411c88b785fc237ac1f56e36f94dabf3a2f022ad5a5a7157d6b7241f1c4985f4f20bb5459694fc0caf3d5e0c84866f566cb6681285c2797ca970612d9ebc3d9c8d7b9de4b63eddc86179b3f418e504851322fcccf4a15d4fb5c11711de381a14fbb5681b4dc46eb4c0f194761d301388817c06630ebfc5d8e0f26e544285c46322013d73c3ec56dbb2ed2a1bfb3043659c0cb05d3ae3571e134a8d7d346ae491eca64473807f3e4220b49c6a1aad3d264e192044e2d7be2937129d141bb122a740eea7a3ec44cdf3f38f13ece36fa8d37eed7e9f6d61a0013293c5a25f2025ac051f8b8b7005acf511c6b727bc3d2d7214cef3f7434aa6afee122eae678096a825821ab47288825064a1afa50ee0740df705a7d3cc59773a51daffc09d981ca3875f7ca55c96f80cd36724ee422124ab11dac1bb6f58bcaa45326160683260a613fed9e694f7b63245623d88bec6e55549946937970d1c07b1617c17301409b8b1a65800847363caa4d823fdec976112877dc9d0a942405a7cb0776c5e07c0e249a1217a92d2a7dad712fdd5335e3deab3db060d0ebdcfab90677be858d32d2bc3355ddc28db2c6cc658f496fae124e5b6f74b772e477200d4ceaf118740f79b07ab34afad57978759f230caabe9bc0c7619be9471a7d163302c3c725316c73afe4bcd79890f93347827d8f8ad3ead66dc8987ef40a793db8ccb4990251c44118e5c51c523c8c67a0b4015a968a8a0fbd08ecf0d010d6070d0f1fff5631b1727a028e718e54dd861fa850e6444ef3dd43b71be781ea2e22be5e7862877dce7841df5b8fc366572f12d3eecb1a9da2bf8037b7bb7fd2ebe13b1f505b1c7245d31eb0cecf87ed73c338cb3d618ff33136f12f12f5208799f311d62a419bdbe2135f4b5aa95266cdd2e002cf522aec09c424e1e01d1a54a2b8b11788de6bf71da981e371a5994ecfeea6ff070561e4a6f78a1491abd3e6a0a2c767de5a33704306353dc65ce311f4670c348703db7983319f2b9a19e3aa2e51932bad7d58c40cd9d7aeab37c65cc5ec7e27c1d5de274912e28b7bffa01b8645b2f77880626ed564e7baa2bea99bdedf7b6d49e4105a431be2d8b9c5bfb742efb53fc23bd6dd3767e3e64f6a033b89c0925971c6e8af1bad1e87d5f4890a0ec018890ce83c9b9d336aa603b269d861304190fbe6ed723d56f41d5314a28024573b57cb1dfa268157da9e523053deff9f07982adc7560229a120da39e82b64e25bc209f65960a9e55c233cd6c47dbaf6d62d3910046d555f6e6dd5a0aa018c6ac0967cc2796b42ebdafeae7bebc4b1b4bd1c7c10aa86e61edf100e8d18124286ab1b2040c82bfbceff23813b02799ad8ad3093d543087b0ffbf2cd29bbc650de23383c95cd099e36d37afd3d92063e0dae50c586575bddd9caf95a9b1a867d1930d517ec106bf1cd5feb6caa22d265f9c9645b4c6ce7d425540efc0cbdb890e0dadbfa6b1ababe38aa5f14a93b45d64405559d4e0c13289ba21afda42dc652da2a302d3a725fcb22bcbc3f6364c75b976b09d3b5be49a0e2bb03a38af1168bb027bdf882a0c0e0319eec33ff25c0ba9a016945a80bf105a3a7b337e791120209da6aa36b2d47c70d57d538a60698bcf4d15d3b5079711f856f1000e29620818e4920751ca05b475fef61988090b7294de3cefcd49232b6311a0448a487aacee77ec5b7be816327cf6f7799b44a86c94f3da2d15dde9c924eb0765555ec17b2bb8142b27859c93004defe856bbd6b64a0e9c30213e4187a853a4d711b4ecff5b25880ab73aff42aa744e0a2cc6fcfc1e8ef17d71d2c0c387ebe73e221333a5f750d66edd60b4cdd5faa043900ea1ba9d0558897a43ee192e047cff08d26c0b8aca8dbbfcaf53910d51752912eb6b5e4ff25fd8ccfa3005154da49e588acc9c7ff2fc96877f6238db193b2f47f59073a1f675dfcc7e2cf3d8181c907394fbd5514ac17310495721a9a260ca81b5d7773d5219230b383b81d104337a0c996042a9626ad629a5b8e8038d948f6294a6f56cb5d8370bc0e22baa8297bf65f09060e2ba6734360cfe08634b34e26d1a656aca92218040a0c75ddf2397e5124312bc97b33511b7f79cef636bc06803dfb943d16793933c405184c957d26fb4095dc222fd52f341ee1c197e5fd594c92d091d1bb68ce46137f75d03afd5c3bdabe7fe3ef94f5d466902230ea7d2dd1fbaeb43040fabf851e04f33089c009581a327ed262798b447f0d578aec456c589e1c67214c34f4380e1bfa3629ce139b297b3fb8318bd9cc90e0ca6d945bfc29a3a2126e872056a70a4df2a8c32f644c2f212c5c04d3c7b3c192e1a08ac9c78c33c81bdd9bc5cb1a3b20434ffeece2b353aaab8881573e433caa06ed7597b3c97617eb372d2b3cd8c81e56f3830b7717bea02602532124c226b0a01afecbaa279316ea43e85b922adacf915cf9970ac2988a049320396379aa2c17f0cc6f93efb24e80cb715cb35899ba5d51099582fa08f1ad0391a5e1b0eda7d237888a556afd451695733689aa2c67239b5b0fc908365c891a4d6f88af1aa93bb7d925dadd9a85126b94f2fb67bc5e4902960cc6344b5300a0fd9f3ebd57b8b93768470993b196de137c97f0d97028394e639561c56f5e7a5c483bed23cc5eb481dcf8cad36bfee055d42d5246714c594769b18205c9065f17d74d7c2aa322945bde4005e4ef4782fb44bd08f7e65213b55168113a82d2179951dcd317018cc28e1628a20f66f82bcb734dfa34f8c3ce5fc2c2f6adc14b0aaa5ff1da351025a4e22bb78a9cf89a428f0ae81045cf25f10e65c819a6aff7a012a99379cbf874a31ec6f6a3d3ccb4310db09332719203e68ae281636c74604298d6ca9820e102280c8eebd6fb0bce5f0e0e5848016ae2149be0f6ba49370e56068e9e1f7df25599722ca00c5edc713459cc3e3a3d7e4ce309072d0883208846227b18f62a53f75f19471d2b42682318b8914df06df7c8bb9b00303363595678b5433f056f2d70e3c988681cf0d76f73f1058e52d9fcdf041a73072431070056868e1c3594a8468c49968bc8b050daadcdd10849c9b617264f07b8c435550e465f05b56ce0eb03c1631b8e16cafbee2e149dc4bb844cfb89ff654dfab76909b2064f14939c1f2eecddbc77ed8501325f8e10c89253e71096f535cdadfe6b790144154193116b5074802350372a8a2ea602d31eb47eafe0b3f81e41c75384e49be1ff425284f8f0c114f821db01bd6b6c3a8ece0b4dcbf249cfc8b02ffedbd4e8a5b421ba40ed963b61e2f0c152c3701afce8de7d0764cec143dc22cd479ad05058dde6b28c73cb4a2e8ac7d165c4c516118958f4f6a1fd811c02a08975e6613bc1219721afb215564598adf381e7f3ca411a435760ab06f322e1304bd2ea0d11a9293ef1f2d1ffc76cb3ab0ff054819c5343a88e8ea9717e1c22ddfba4cb5f3ad89de2099df90e056c83c70df834f7f611ab8e80c8c4c789d46cac8134b4dc1e16248c51f851cc780db10bd5e2afde3f41fbfd1756248e7e1068a7c5cacb0e252b6643b14a02c08816e57f4ff6ecbddfacdafe3a7ff051c499bed5b0ae387cb8de0c0f11dd33729e51c62a647b141c3e1af197d18c5195c337153e282724ae3df8bef859f70d6b2084fd14fabb4e83c453e8d2c5c56ee4e3b115eb167eb72d1e42230771e1b83278783245fafcc37bd91e66b7fc7270c58cd167e363fc1880c181e44341e35b4f0cf50cc64d879a8be544134d5fdb7ec1265db32ef5e6702f9080a8b5b2441e4b46c3339ed9a4fc3c508e989cd648c15f191ea0d5b687e6c3f1061863aa4e2aad8da950d5889a111582c19dac4a006027cddcd7df8d26a3c34edadc571247a7fd48700b7441b3009ee3a8c986a14c84a1ab5f0054610aceb70ec59b99d378bdc4e1e00b81eb35f25fdc0ac531c5745556196ec23d1c7c9027998ffd2fd3299288bfc1f90770690ee1d3ae38b59cc0facd80d3c5a1a5c4119c5700ac23fca251d44adb7c0bb7977dab315dcb1b10779c8e4954b288e42a789eb0df4d7d352a202deaf63d97a80766455fdf266a08e36222daba31fac1f6eeb30cf68b43650a271d07d9e3b22b00f238c3fcf0aa6b4a75109dcce900246f9a65d30b0b7f768b902b094d176528cc490bc77cd2e323f5fce0f85483a1f5dea53b6de778384ff380e0581a81b787b19246d226731e172c201b5518a6e61c8b36bd42527877d88a21c25c08c8b030f8f6724bc37c632f3709481be2fbd581be7674ba14b343f99a9b5b7ede95580ce89c169c1b94b8535ddeefb2782a790dbf8ce73ef4d3a49a69163324668fb801cbacba2cf664276be7c89882a2dad7a6d5a19f34bb7da2a340b9d0b8665fd7f8e750e6631c93b75f1deeccf32ab3f9354add2206315b46fc67acbca0a7acbdda86ae23a955ca70174779126dd75fe6a36467fa1a1e15978e26187f46f11f738deeeef86668b15b7cad90f3587083a6d66c68aeda4a539d3fc5259f100c6000fb6739ee021eef7f74975cf61cbeca42b8a907c7ad7dbc61f88bfaa668bf166c0a3bb78ce53f2de5e84c04a32189d9c130656dccfa7ef8eaa2c2c01cb5d3e9c0a4b08f5a78931293c115b182cf985b2b25e6c1452b16b04123b09e875e118303b010eae021e14793e53a8b1c8fb5f68881762cbba70d8c6c659dbd71cd3e893d16a1efa749f373ed3e03b9f8c7a652e12b5bd6b5d62b33754ed344616925a676beacc736598f3fa7b3b7649ee134183d0bdde6bb20374e63c8995ce09a8d80b790789915b77e53cb2ba0b3974327f0a509468555edfb843fba362d75c83dbf07744f8ecdcd8756609004cf6a574781200ddcda0ca53d7e100bf3dea85bfe0c6f5277cee50274f16fc92cdf9f835c74b6ffe90e67b0c6e3dea5189801bb980ff6123980e5bd0ccbffbe600cbf312d706fc7b348ef765e5cb26fed820951d36fa49cddcc5568168d1857e87e51c8831e544d83b12a60cc919351b9c5478377d481d8abdbbe6a5bdec27c0b5cddb026266c7aa071a2 -MD = e8e09fc57bd3b8e18b2726418836852cf1544eb2cf28c18f5b98436382d0b621953d2faa60d155dd28c2cb76c00ee93d3de56289b399c22a4fd82f00dd35ef27 - -Len = 33496 -Msg = 9c06316ac709e94470a68650e1d6aeee089aefbf133df90a3eda0a5ee91fa979ee509769318f03f1795afd2e7e552d7a434ac591a56eb4f334e61d894389078a3be856a0358bfa47c77e66761d0d43824ccb663fe4d90068c46415413370307a2cd45457f886350e0319a871e88459ccce25bc11f7064632965edccfe15b8c11681e7bd6a5081e0ed434ad640544d5226f61ae4e077dec1951db597b76d2831798ceb16462971c0ee3d65c9a9cd5214ad78623403bc75ce59ee4748c1a5d7d5363eae04a57bd97d8d7079d5ad6bda30caf9c052dbc6bfc5e2480154cf485e28e727cefd1ae01f73259cf58ebda86c5329fac3b5eb1f1364c8cb724012dd11a906c8bc63e8ceba5e511377596d1b7ee824ebcad1b43e271767d9189f4ecca8d21fa204ddc1b0407b9a646dda3e3d985c665d743ac9ac414a5a0172c6d5af6a309c4426cf283d38675c105765a3773f4c48b02e558dd2289a19d50f6b39fdfc50f71f90bc7ece18be3097a2902f60da24569477b68358137321b45cd10e20d59fda94d12a47db47cc927afdfe54730f710a7aded24c96b8620c2fc9bca4b07c999164769d15ed6c2f0c2ac7e4953625befec3c23d4c267de323b7f462a04557bac5eeef896b8cfc6208377ef77422e36a8e0fd05c047fea7312ed6b778327fd9fd294ba83bb325ef20111a1bb73b19f0042cf77c3081b649e64207d7fc000d495620645f077662a4ba169de95166adf1cb78336e6b971a2c16201c8dfe9488357dea4306432a0d4fb43706408cec71a2c56bb7c5bab2afb98c701cc0c51678043b30f08638f6af57d71e5f0ab1f5ed69b9ae8d6765faff560fd9105a9aaf631e589a71c52b03cf24eb73b02e08a8aaaf71e9bd3eb496916c6603ff42c586d3eb9ccfd0ad6778f51eb8ddff94d92e2fddb3c34d30eeafed645a97f1608ec54fd3cf781525337eaaad050556246caf045948e447275d6c9ca4b33def9c3c91603eb83c4614d63d74399c93bcc60852b28df8f5b20a47f62596399cffde19158c9420c46d6499dcde2a432e3a62f73fc0df8a9e97c1f57410a1b35d2c0e6b765e3dcfb891fcc4846de8c37ed6e07f9fb6b9c886fd33af0fe62ceb277b147bdf5ba18dbfbbc49f5cabdbe42c9a28e99a1d827856ec4abdef2da1a7a3f6d891760d282281f2a4718d1f6b6de08e227d577ca263b56ded663b7067b079a443f563fb3b55a73e84843e51012841b9b782ff5b81514c8604f31c34e6ce508d3beecfad40efd9a74c1e98ca03dbf823cd42b942870ac34178acb90386c8d0baa9c5e2aca1b9be36e488c311db4fadd44d03aeba1c55c1a62fd93b64af68a23276c3c37fc478fff2340ae6aeef4c07d5200e054aa8fbeebc12c2c9e0c9746efd882d9bae13f743e425eb292aa99aae2d2cabe77b93c5f38b09af8cfe3cb5db24c94e91c2f4fd33129d75b50c70004be45b217cd44578781bfde7ab4670f392ae206dce42d151778685eeb2dcab47860394baebdd26df2475d4b34f40cef63ba374d179b611bcb648c69f4823c4370690bebc5d1e9fc1a0a0785ba075bc857d0cafc3bba61c06985e46d09d6722987496c370f92016e593a4cf27c56ca36a00f0b88bbc9b5af7c7d2efc9dc332d32771a8a1ee86af414a68ac35ee7adec6b6d577771a31d3356e8aca8d12b0c4dcdb826fb0e5184a21681593b4a2dc1fd516c49d4bd99b20feda6f25831b27cea30dec1fe875df786b3cb191e31c02f40e3a4cfb7b6c5e45682a6aee9329b0a6c2492f47bd3344a0ab32dd2565cc77f1bebbef008a5503a70de93e7421a0b3f3b717cc65a38fd0595dd4e8dca136b3af82f61b5afd2613cc5c913a64b312ca1bfdf433f83ffe1b18efad752629ed4e73e79362494852173bd0bcef2ecc126ba61359067df6f07d55fd26f270644290e558fe548a006b766c16b6ed30d102112873d0a4754d297f96f2dbf169e4e9337a5391526b99c4c9e37b298519667442f9bbd5ae6cb6ebba526d36e26120439eb96416ec8c89108a189a8f6756f0eb79b037e274c2d8d9962ec8c255f4aae44b1906e9a35b62b12f91d153046814da3de29481a82607559b7291f8cca2f94db12fb873e7569b3932d5dc1eeccb26c307e73e3db8f4e6e242d45554a6ea7fe27953f550591cb70b2c6b074d710ebb285054b16117bddc2224ba8f608549b334fc2c4a09490c3ac984b7df593191569cbfb18aa644ff7b77a99bbca6d82f47c7c21f22f967a38ad6c442e0dcbf016d729e641687e128397559fe49822029821d63b32ccb15714bd573a2a84279bd844c850301504cc69a8dae68c2acedc716a8497ea3d8d303e2281b4d9224e2441facfc04c7ca185913332f51c461a16669eafbd844bd30c9e24113aa3aee9923b4067bffd64fb46e37f8454fab5aeba5e077e3666be2bf41c0d3054f0f29feead5db8d4ab94ba1647d6f98c903e31cf43eb1a89fa5e3cefa023058b28b4193f7e9ae987bed587fea57eb92445ab4c5efc93aa3ea6f3af0512b0b966b3bdfe8d983f23609eef0a05e5c0eba480c3a66e714757ded4442b3e5afa736ef9d5f7e1e2948de8b4aaea33efe4b794ab4de8078a4f49f0eb1a59a3604a5c2963c3ac4244e050a666cecf90ab32467d2d12b9312ff2a7fc533de13b0de79c215751c4b8a66d93221d22632501f2c0e76edac2f54879998a73756a0f471b5ade3e45e84bf0817fe5426f4bf9da6b4d58d66caa5abd2c4923b58a9c25f72cbee68168bf040a653c763b7d32141ce6135acd921a697653dc4e804321870663f1c38682f2eadd61f15d7214be7fb1ab3d74bb12ba295b367d943d699e3d5a081bfdb75b28054fbcc6234dfc97417f02f12f08b531a2551d527c52c4be4ddd63631a7bba0a5e49c0e44f36fc6662703357111c4328dc4a4f838e281c26c175bbf2a439693ffcb4b3736994ded3eb6b8599a45f8446e024153952273981a00c5af0235b2e70e876de9afacf6885e35742dc703a4034b5c9b79c51b7e375f38986841d48d24528798982894f6325521eb04bfc133e9963237dd31241e1aac1d488d61c681d65c6a3fc539e7b965a41a7170bd053471ef318ae071d2bfcca12d5a80fa723d679c9de7e34c1bdcbcdb6dac1477463236b6c92945ffbdffc7aef742d5747e1c7283a11584d7b7cc826bc9ff52571a99a27d678750433c3a9645e9961d5820ab61b2024d3c75321560c58defacd4d8f73fa39b29a1d4d41ca306a2c8ab2e3066cfa83fe35cad2123d27947f1968937c788e9e274bd3d2c029861815f115ef3db16c6c89c67d7eb84520776a9a1ec8d86f880cc1d04e49a88c0c723cde2730184c19e1acd009e27b369f0988c516760a21938c6770b53a60bc6d7f8998102dfd07aaed4f999683c4d74b53bfe179247c5655250174302d52814f47e569f76e55a8c7955a6a4bebf9f1cd5cf8386e5b95d676df7824e9abe5a25bd33697047c89f817e3b68b50a1844ccc2d1c101ea2bd689fc2b2c8053b81e9382a666b61deffbf43de4944ce2dcbb0f1cc11b2b1815cd678d798a8af668e1c8e545b2d331c21c5f28efcdded1838e5e443c1664e80dae6a825120c0db37404075aff25a5bf56d1cdfcb89dd4e831b24c9a12741d28a061d8b4093b47aa9c694943389bdc4e05ad7c2f63ceac2820e1d2d7ee234700140eaf8d637e86d36c13fc17f0d60351981fa62fe6b69c5d6c381d043cbcf4919fb7d6b70a1df2b74dc9c9df0e1f405076f0f3052a9dcd117d80d628e4874b61aa22f43ae460b2dda85558a27abebbd407e80db816cd66cbbb80a44ccdcc75fa9b18b21fdb8eefcde37d50681cfb9e64b3ce9950918d90148e023077e1d39ae4db61b86dd6f1d010680a5939dc1d0e89e26c42d6852473735ecc21b107e3e0a5d3c5ad2cbccf7e2d9dc31d1ea26e35cafc88ad51d9db367093a82002274672c7ea0c3965777120acec72411e56343baf69eb85c975fa0293955cd5732a4276d287fd051fee1fdf16bcdd7042e0b848c0915d704741c9fe65ccb0e70bf620154c1462b9620921e3f274cd509128428286dda516d1258f536da16effd3742876bff801fd36b0be53c87e0a8913161a1488b38d2172099628337a5cc4d18ca1c2b29ba277a4cb3f5721415cc4d09387244e7cdb362fd524a640c044df0f27d520ae650fd2b342ec1983258ba9d185d2db61a158ff127182f41bdcecf7952b0ab93abe0fb46cfd0dbe79925edf1dd644604888cc2422c5f83c4c341cb5698289b4de0e69c6d5e5ea7188f09f0fbc6c23dc8b9bff4d67b9cda35c329ec195129a3a22bde6aff9e0cb583aa714e0b731b776b341b821ea364b53d23d39c221c584738f334e17ddd7f79b161f86fb150b4a5747e1c148b222b87436bcb46013819186acd869a88bb3b763a4c1bc07dee422a6cfe5e06bc7675d2d1119d8447530079c0115fe080a5a53d86df380ad1aa3888cd4b4de3232eb82a7eabb6d164eb92fdc1750d7df62b61321f81e9895d230c431ddb68244fa986f0a490a3b7da704516f75f2bad69cae3e67cdabcd660e731ebc7253964a27546b7db66e092287f9b57ca4647094be291ed17500e7c8d454de551bf3e0ebc209bf28ba4fa0adf680a22c2a0dc1c2d311f9887787ae652ebb4b2661fe2ad0d29eb434dc15c9c5fd8162a791547408e04d18b35ba7eae22390ae54cbdc3aa05ffb90c9a5284a12a2e43b1460a3530defc5c37baac762eabbbb4f0ae2f5d80472089b0e9cf1eb3eef91769b2061247a07614208eb51df23ff24766e2cb2cea411ad1f2c49d676eeec705a6658f5b0f63109dc81a6ac2935f6b36ba83379e32747d2624b3440b1cca06a319a90c9bf2a74a5da0e644008c9a95175e17fb3de36195fad91e698668013654162514419bed81d84d9ab7544871ee4de4196c98878913c4829e6445bb24d4ad4e421ce85596559220706b3a4165f55ecef0221a996b6517b39bcae5909570230488bcfcca32441fcc3fa62f11f748de8144b25093790868eeaf13c272d38749db714afb6461cbe5a3311eaf34963731ad7f73c6f0428c4c8630c588fc7f887655946d70be755b6837fd2b3723d36eec96190cda4a485f173cd9569577fa025cf55a8ad9331d813c0d0c52536a2f5e83ed99e4271c0aff7d54f14d748fc363522d3c29a16c9acbb594e73a90621a648c268a7029c00afbc361212092ae7c59ea7fd1d075b5ad998962063a5ac6253f69b363575ed0b8c2ae03d1769c5e7524aa6f9405a2b8a6890be6f1d83ee0c03d9116acf032e8a4e281af9a95ee0a5e72066efb3fd4e01608d1b622aa995c7bfdb6e2dfe142524fe9d2b6e525045c88b083108ff568c68c976f3221181693d8ee3f8a648109b82a3735cc399a7baf947ea4d6babcfad67ac338fd65a71311378daf9fe385f594c4591f52106cc08e022ae03423fce78a510ab37a78ee3b7f485a6b75c53692429ecdf3eaf2225f724243d9bb244bdb6cbfdc833bd343ec186be307be92397c7c1a1457e96741b4e6e557d5de541032f807b71ca3fd4ea18712a608ccc2f4f08bd6babfffd8517d765be579103be08ab6d938e4555f74f845ed11f342efffab1c553f9070ddb7f58b266b37e334334f23a4c08ec2924d5ccf5bc53b9371c0188806017dfed00bc9afc557a6d9e59efcb8eafc507e0e3e4baddf2e5640e0dca56979aedcfc77c3765ec9492a66c87a10011c2aedea5bce414bf7bbe7ddc5abfe2b109641ec0d557802a2ae571c456b2576c8fabb99e383da34260c44cc88c47f677b66216029583b55d1f5a16ce4d8a99471ea5dff3de572f0fa8e118fb2ac95891a8d0fdb54325ca2d7cd8dcb4f4918e49758299cd369a80cd5bfc2b9dbcafd1a6e7971c0068a4884448490d9bd330fd1b9e2c2f54c96f5d2582fd -MD = 6c66192d7e119cfb52e822217591996077095c73a7b957a0610ee815f9000fcdc7756c08cc6227798ec73b651666009378c879e47a2402e8861fd1cb80ec0369 - -Len = 34288 -Msg = fe722fd9a593c85e68961b93864efe0424da67de94d6d5b9d6ceebb65ff85eca1a221259ade98007fd2c5bcbf4c073458265d951e1f944dc1eecb3f6d5f454293c02a5096274d90db98c7d9dd3215b6c69949f08a10638b090c88165fe1321436afa30124e9c9b19a59ec932a9d97e24e14f002c5b6479dd374b9d2b65be8cc2aef2fa9cf9ca8dd2c74b86b20150a413f37e45e5987bcf0c185b4e6f8f5b5f4b10d24cceea6478e12979fe4560ed95e1a60ab75adfb302e53de1de590654608997826ed0a9d424edd3117711501a183703d99bb4b874d90fadc69312510f58214beaa8cbbe80599fcbfc3a41583ff7bd10d43c1aab261d3370f0b6c2f8f60ebe34f342e7b2d2df9f1b208ffb01c2f81ad7e3e1b5413196f88f498e90836f4c065b83834b0b307d94cb67bd67d10ce4f660efd1ad01fd0c0711b865a57be4d8a1c783b4205404fd26e1b80eaf528582fbb1de552974f24707fe24812968bc7b3880dc1d8d12b525fe67fac8f80c959ccfd49ab55120790ea15e772b43d05ffd738f7406bbcfabbec46417346d86a5f81ad109394e8ff82b7d3a98ab1b3d3526f9fb35b7d1124e8f20e1f69a33481b6085ae15294849d96442996f49da36a6be73cc0677f8640662b8e57f4275da6199b775a5cc66d482829884e44da8441a8c880bce90584c3bfd37789a7359c5dd6e592ea06bd1ba5d4d2902dffeacedf959e1bf77481852552943a22f770790f9a613dff04eb183d08c9a1b48a60fbcabed25f0e8e861febcae846c2694a8c31c088c927cbd2db5450996d7078bf8369810fda609b75ad9d854a4dd671364e6ad5e6d4e2c006dda238ac33f04f590e5288a11eac2ff2c6a12e348fedb3c6282166e5d1ce85e9a79d2d8c95a282eff50c42208c3fb06fe39d0221ad56856cb1ebe0105039821dc1bbabb5131597d6cffd2a28b3a9c16f9cf7bdac26df7abc6430dde0d0b248f5a4743fa03ca8029ff7bbcd041568d7544b37cd3e8cb71817c786bcf1c3c74f13d85d55f862f867be24be874d31fb66b096d39d533f9bc211545409ada9f718eac5dd8b0836851bb3af7c058e89d00426d861ca84bfec2d3b832f408f13b01b0d058b4b6a17bcb313208aa4329d951409a858c13d9e269de8dc8efe106180d9dd1fdd1398972db24ef0510fc3dda93afb8f2f1e085ad9b8cbd8e9aedc43f7e9ed6d59701e25468de9c76594ccea8acd5ee56b2d5f6683f23700d5bf3d0b73afb07676fd5552a5ca55fe3edfb814c86fb653839bbd51b3deccdcb9bbdd5882bfc8d3bbf7e8afb9ec260d534d100cd07684520ed59c9cc7d2ffd52c31179bb38e990d9f0c528cf167dc8d49696f3331966b59636797b85e634282a39b86457480937ca6b70d8afac1dbf667b110187a33bdd237ce1924d624274d9677a3f6445a5ab95974741a148ec6c154b0bd3d08c30e64e275ab72dd9a20ce9b31eb2eb160514c2db140cb0d230f8686e4c1116be8df8a09fac922b319d16e2876e64f2a37199d9a19de0e132328be74c9c6261209a3aa04d9fca525379bb4a4a30fe84d431626350ab663e503a4b1b4dc36eba9a9fd5d697fb08a7277e22ab642d27a6918c98e84f0645ce148f638bda88de2814e3f1cae687f33495f6748c3d2d8862c2cc63ee08762699677bf9c059b45ab476afb405a30c34008627d8763df8c9bf4f37eaffe2c3b1a82f443640340f8965a84b490e34527213e05a77f0cc5591c6201656a245b48d0256334195d161144393ffd66d032156768dd87882520d887d1db0ce60991363afc29043469a72a2561d1384ab7641883073e604b437e857ee2f4f7bbf47a6dab85da363dcf50adca72fce7a4ff779af497ccf430fe3aea6213c398549b5369b240db3cade4cf06a3db279e1e1ed9373ca8fd95c1abe271c1c2db713864c8a4dfbbc0a9fd406edf3208c5ce0e9c0557eba934e785d311b62e9eb114dfd746c994651ee0b478bc91f59a7bfa0f0d78875217274be61a25120905d8f5c3696a2270cb4a836be434c98efe9ea487d9cf40307139457ad7a92fd176a7968b918f59e55cd8047c1963d03ea3c2401197660ce755ef56aca22a6a188fc16980f642da72984bd66d8ec660b5387b7f34bcd957e723be1203e0055b5eafaaf15bfe012e991c1a9bd8cad8d5631b2e9459b0a5cbc07929ea1937e67e1464b8c0751f66b0d946c8a7164417b8c8ca4032091937b303b4b75145003a3cca3d9f5954d0d02ba3b6da9ade910f8566c474cabb6d1ba81164eaea1fef6d21f098b32e73c8c9d998dac4e97a183cc5cda820e0f912ce357a083917224c1bc8181498a26a6dd05519211c1571600be45dd3d8f73ab0dbc5ce2d366ac4acb299b11fb477a1167028b52854916d0f097b97e6019008ada0f36e324747af97ce115c489af0a07925cefd6ee2ffc56bc1f62c4d4f2ddb8fda28dab600402b73cab969fdc0bff0fc6da242536bc302fca1ee5b77f6234bddc3d0a436d5e6c0f7351c6acdaa280b26b45d3474335dbe6845ced5f4ab32a1fe1aa54b235cae18689994ef26cbeb676e965a345ffe5240051a020c51d2be96872b014009e9089a6e64cd6797ba5c9e6a9023d265013340798b426f0e114991ff916f23692f78bf6f332054aeda0e08711e448f220063283c35ea8e87cb461cddda5955bf8480ffe1612846cacf723e38ad26db1560747fa39674eb6d8546af98625a677b7cc3f47b8b5fae79ef2bb817d96546cda5e9bf66297bf61dc3bdc2b5c5ecc93b9c8415842e410c4add9d0e950f6a42b945355fea6b5a4f16fb3deecc717b0b5e5873db91a656e0ac0f389a46dbb06f46c2e9e9b6d8ba46f7b0298c22f1afae823505cf3aa00bbc1be890f393aad21d14a369d531fdf68e2e7713338fc2d51315b6ac58d597fa0f191e38a3021939ec916b47bb1247a97529b48d7d396195d9a751ea20f8ea8c4a320492112883624e4b8f05f3ae424dac77ecfab1d65a5c72a5ab41802b345d0df5303fc65d95f5c2b18327278c8a4d94a7a4ed89dd29b37e9f07451ed2f1c6bab125844b47bd4eda51ec2dbf236c43be2760c85db43c154e020a575586af63e1145922184d65e815bb3e7c330974aa9985b52db6021e1c716d391abcbcc9af018d4f7ba5f52c4bd53bdeb52bb54ffca730f6802b3d5c13793ef7e1ccfbdd22ac8a7d038cc57d04b972514af1ad3ab477b7b96215cc52a4d605db5f0eba564942aa764c2544d48d32fd4ab03d57e16c7b8872461e45be3b184067e4ea8ec19d545bafd817d9cf5fc21b1f77575bc07f3331c59e9d2feb60a07d1205e8dfab99622c9e19dd2ac9f6f77a3422e81f44873f3207ee2ae156901f2a5e54a22370c7ec7bd593dd8e60dd43994d25681909fee007ddb73010ac53d4c6c1337ef0cd9363e7cad8919b009d26d6bf114fdf7d50c6319b8c5514492671d0df34f7ddfea658ff025aa1c7359111d10e5907e91b27623de5dff292b98266e70cdba531905b4c0ff09c86998c63a506af6f38bc6fdd448b2114a0e279e23467de9a0f923f3cbdb93a00a898518f50f636e65adfe80cddb7f1ece8aa06e05ad1c8e28f8637c51e793339903a417e961e2930d6ba1010ae22ccab224fece75ab35067ad74367efede70a9d5f5c8bbf4ed0af144d17493368a15e1f65a9871b49b097bf1e2a7e4cf4776d3d26143b1ede1308a1dbc820ef72c6213cd30a619e8e758a1f56808711042ba4a1df36f0af1a94e6dd9e1d4de60a835d32f88723a7836c27c106ac4be525ebf6f21229721a093b93f01d7c9ac137c058285c8997dd2e7eb5ceb6189271609fad5847558906b3f15601e04ecd2802655c47857983e999917e6dee2b245cbc2f0ffa0722fd1b219c763870fcafc2715aafb6fdbdb072cc8ec8c7374dc84f42836501d9f895025a253cbe54ec08388f87999e4cbfe621cd5edc0418e648f2f983f694463f1a636675f0bb1488a03161d46427f8e5ec9ea6e7024b1a5e6aece9180cdcd55f55e54e73da5639373e56f12a56788b998c905f1381c4c31ef7e61a28ed010ec00b31190641b84a60ac4f466fb9ba8d428c9ffec9a3989e8cb687959ce22a79ca07efcf186f09cf6db0c3688dd3148447b5748df1aeef30117178615d337f9fe610c67990aa7051c5135b606aedaffa12cfb71372ebf00316ee6086522829077aed5e1e553b1557d09cbe35f04eb3760aa2109936a2c49e01f6e80d62095039f06760c6516a2169f61594ef0540478197f52526241b92893b51b8fd771d1bbeae4674796b7ebc0f9f448797930993a22192a1c2249d834d2dc7775e78adb31d1e5241408bc10dd233f33d3381f2c061103f2a751e71bf713e20cd384c0140dea652702299793d391ae85eceb743f646cdc56848fae06d7dd5236494dd61e98ab010a8287eef73cdbcec936d1d445cdabeec0542a030b6f95c9ae1791215d6a8a3529259206bd81482c6841a9b3d1ba44c7ba66cf9a9c16e3a4beff0d36430c0e7e1d6bd68349498d240d8dc19755a2cdf3cf5cceb95b764d7fe340008981f5ae4851b5c3e94cee1152037bc7f3542fbe0f59a6d5f3abf619b7d58b199f7caff0205093f8bd1af75b42f4bc0b5c5fb98b56f3d543ee202efee8f040b6fca5a36a92b496d35345ede1535b9f2a36dac8bc872858b6ed3a79538fbe0177058f68841bd83ee260503a4a2fa2c5a32757e5d80c61a19d955d7dce18a93dc85ebc77c32845ecb448cc84dc2454aff482498954432a50665b2ba4a5104c66297c9f59ae448830b7911d363dcdfbbe9cec322bb7e7fce5afc307769f03120b28c3ba76abfd19ab6acdb4c6e5a912820ad9a465895753c1e851937c127d84ad34e8905752ce64ad5c5335cf4a32139adcbf12af3f1dc985ae8b321d85cc3ebcdc3fb384291513b6eab612b7f1f5795971210f614fa7c89140d475e38f8b8aca9d5d9685957d8168c48ade09636fde5e6693ed343181db856dc1c15696480356e6b6abc43e7448334835ea3c250d9d0a2b7c5e909b386cc273d7c6ff107e32d246cf75d87a75c297044be9e89d5b5ffd4e6eb5fed33806e9018ad945a48a83cd4c2c873ad01eab1477313f6762d571984ddf95d7800d3469755f8ab2c91990b855425253e5cb4c2c2f9a6d60ec087c7b884360d308247fb47dca5dced497c423f0a569bc1208405e7bcbf64dbf70fb17ac3ec959f21a336a595fc5127d71a890acca2febeb42022c0a5a6c86438b67ed182611d4d46b19ebb68452f61a53b86ef825376bd8250c0559ca22b31ec43d7c6a9dfcec15737dc903ec7a1241aa6e4f514af2a47f1de87ac8afcb5cb7c7f635f20accf83befe972cfdcbcdf79e2549256aff43e3699021cf55fd8db94e32cba6cf10491be1ce78988f99db62997e5e856d8ae81a523033c6e7eadc83cc23b6a39f5564122a6f27dbda79f4ed737aca20039a427315846897260ec9b25d1ccd5d76c147ee00a84bfdc8b3402195e135fb157579761855654cfcb07dcd68e3b8dc3e9e1b3aca428c07408ee685657b49208c64b4abc46ad5ed50171f5c57421e28dd32077bf206940029530ea24c10ab964eaf1b9b818d5e80098cd8e791fea74a3dc6343bdfb908f06d4be2feb3670665459ed7cdb884a80f1157d0f77ee2fc4944a1ca01f92693dff3bb872300490096577910c9cf185ca14fc02e1386b5c52ddc0df056a814dbd6a3ee28999d7e412f6e87ed183011223fab0f1bc4113ea9feec50cec1544a88dc652bebe6f0ce723b711197414137a1f00d8bbe91874651c55bb38dca659143fa21b9f89463013bbf485f36cc6c5282bc5d7d40025095658a137e55f943b1b437bfe1782b5cde43c5dbb9f14218296cab832dc89fd4f38c53fbf94dd75672829b27eb9331452e33541267f02aac8508c668e37ff17c286e2afb6c9eeb079c552e421f703085b9b275d5b05c0c922efe14f2e78c7faefbb416fb1e6fbdbcf6d7f9f6c438af8447692f0cde5d7031ecf59d0a8018d1d3360620e358e9d6de49ae032c241237aaa0008a9f371adff187966a99f84b7054 -MD = 2711cb980cb4fd62df85446940d9c5d0e382912c96e80ecfdcdaf7195f377130d01f1530b429e3658c371e7a91e3a738814ca8c7b1139d9847756f24e9d247fe - -Len = 35080 -Msg = 61ddef57b77c6c122d6128de0b45475d3af8acf74e521a74c46d99ca87111c33b9706083b11417b9401546d4398fece83053e47081dd0ce69587a79160fc009f2eee5173a00ce240f12e75d77ed3e2bd86ceff812e3cc24cc8b9aaba54d45ae847c088cf8c4c15d0c9147d8fe3f97205c4d0c4d15c5784cfe56d69ec6c8272398d4ccd3e7ebbf8904f3026a66feae4e873c0fc0913169a97750aadd0afee90b887fbea687c43d3a90be838c12b8c808d1a086fd05b614bcb00f83e0e2500fc8dbd35a5f691cbed4285a57a8b1dc88e1d410fe5cf3d20e1940c9ee44dd6a1fde1b763c890c23c8f8446d0b5a94f8755bf703d26aec03ba21923666735cbb7dddcfeeb19dd197c0197d5cfb1c6c9af1e9c30faf914ed9ad783ccb78e6f0b2be2a5193761869d748ba2ba0c3688912931db08ae28a9ca26c7f990f922a39ee6556590ad6732560c75cd7eed0c97b1ded6a681c1791662c5bca4f595ec788dcf7e43ecb7f58a4d2d0642a8dcfa9c31b55522219cb503ba60fcab85f1b197dfcda468b3bcd13689bd8726c040ca3f1795f57973a5a417dce0d037c8763ca89cca10fb7024c4dd12a540a44e8142276d68ffd3fc450dfbcf2b8070458c5452ccad0b25a8569627f1ce79e1db072bfd3b15bb5746e4b9579b2b547d849cc03d785edb0ee5bc0fbe2d1f7a08ee394c688784712ed8eb71d249c694870d0c4912a8c4c8ddaebdf747ce7f8a3f10816f115b9d697f3ac0fb14dfe687b56946b77962c91cbb8cc1156dddd8f3aec8465a9fbe48ea73f5cd1fc6687276301fb0d219b0541dcf063032d56111fb7f9ef1d6bbb96d3e329079a790e952a91fb7b4619b994e1542a473162a6212ebd71ae8ab0d52f4abe3932b59196c6e68abb9b92ea6269d4a3beef08912e9c30be1c594a13c93c57aaf864dff0af8aefbfcae27ffe35d2a05e36d105335fc0ca2c2265d80f184c8f3bdf2465f0a96faa9391e659dfa48dd8d61a83b3b3da6d5faa5c6ac0fd32ce65d365f7e42c24d3abc8b8fddd092ef9e2cde27da0bcfec0659b02be7178b93050241535d6fd925567a198bf65f535856288273538996d887080bdf7860c0c10e2807584bb0f826362c0c991814e78debca7413107e3771404fdf6ac5b21bbfea18aff5b0cbc759c2198b42abb5f396475add8f77b15dbf1975545238d544947f1a62b3f489edc5e38bbf0c170b22795020e470f2ecaecbfbc491213790e248b77548187fb213727fc8cf81c5de1940f063b23de8f5d29ccc82bf5e2cad9de4797388aeb90ee0697f19e4291bf683f30e6d6e7ec195723a76f805927ef21f6eac5a4bfd0b64fdb1ccc6268b821a0698928441bce49436aedf6e8c4495280df13a73b88cdb7e11524c17bc2f63144a3963f1537dbbbac5fff12b7bfcd91712720a06f8e39222c555e954cf9d24aaf8dd6bfccb4cadcfc8359279fb43b286d4fb045b328a9919c1c18ac4865e2fa5b88d91ecd2ae229ae659ac9e349f883efb9310b98f0a562bac9e17b00af9eacc3150bd0b8f2d82e4c87226e34d9bc3083043166a37e9331f2ff5776082f6bfe90c2ed79f2b5036751588e8906fbccbaa1b12feb451b297bff1cd941c17de15c2f02fc8f1cd9fa41576a4daedc18c08ec6308b0e005eaead19b2e552cf1375321865c76499ea3358c93cce4426c92e398b02d15357d1b931ed420a2d7378ce3cc76bccaefc6e351a1130beed69756c274ac8a13fddeccfc6e45ac636712622c8b6757ac2a6ce8611e9f66e0f26b610e4afd26937e53868c8995d98022a943962802360543b838cbc9dee7a2de103a30e04b097e0201d0ab366db0e25125b68969ee60bb82d35df96a79951ce2ad698efe3f3cbacf1332c13f75376f3bad446d18d3ddb82fe5df51cb177837466a77926e80c6312daf34366a5478102a6a73aafb5bb6e29215443db36199d95170eba3f7b7afc966fe5f7380b37bae6483cea8db2cf223f38c1624e9feffeb4ce74d28608c006cc1273ade4839462f3221dad07fee99629972dc6e3697b2567ff7268b72a6c00185524ee08c8fe37ddc6c2188b14ab487cdee1f8262d4bb0032c6fc33f5aef770fba921e2125c5a7eaa8b2a3937e74a79d72866ca355c21d3ad7f5a88b14bada16b513d4aa349b11ce4a77d4cda6f6322ff4939ad77d8ecb63748c5f26d26eb7b1c752a8107fef23dd1e7a327628707698d792093efef25901a49c7d9f3e7b8e8583b6ef0062225cbba74233497d93f36c8dfa4e4664ad34b9cace7a509351dd065cb93fe685d50ade77585da410d1271f9a44c09a491fece0696aebe78b821198c4e2112f4597dcba013528027cb890368efa168716bae01a031a28d0719ccac15ec9e9673bbb30d2d76119012baabd25de92a6a9580ecccb1a54d788000267148cc94f1ae2efb5bd5c54a71ca8280c720ba6f77d779bf17831a37e8a91438506d178a8b6a585c9de229858b17cc10caf889f8f800fe30ca5cb7e6464cfe0932cbf409cc72e1debb9ac94b46c14064c42f7e4e53d8b646cd85a4e4f82f66a1fdab8c981c8d72899d46ce230a8f85839b0bc3f8f2274a0908460ab9681bf2099b5507bfe382b3662c2d5f963f4a447539d57d7e3bb5618164e611ebfcd74d48f2118c06891a4b7c4e99a52b4dba244384d4d769984aa4b7c7afe0041e2d1d66ec2743f6761de3d3ecd0c76a9ca7cef46652f73f70adbbb21be7a08c35e30b6c70de551612532274ef1beedb94d9e990c695058b2ba74d7a46d77809a9c2be616580eaeec683b1663dc242079e171e208be62ad23000021832c79105e192df4db5532907f87737b1c00dea75202b15aa9f8d8d9ee9808493c5fe1207471b153947a03be812f55d5e5e440fad84db7539e9d25876bdee78f3e9c624984224092c03ae48197ac6cb7401aed83830f0e6d251fdb0e3141489418565ef3f3a77622ed1c777239ab228fb90946e9d8e32127fbf55bf6c57b85d8480249a8497dac9479931f08dd8801cfcf33ef86404689e471b23ad99eca39cc4c44b4eefc216e6804335dcdf9efa517d12f49f16fc5c35334dafa2f23c9def093822320921f360e0b71b63a253e66c89d5fe8b3addd47d493e41c500af6efe5cc4f16f591d38e06fde2bac5d5e0d182524a3e3580f991e93d4213e4aaedd70c450ff2c671faf0d369eade0982937fb5be72dd0f8fa73c119f89736589fb3ed4ac49592bc8d1e903ce0e826dc1b2bbd3206e279a306290ee293ead5b3ebb81ff508fbc9dfd04e108a8d25a7af9cb307b3690b07e09b85acf68b6342e2fbb4abcd0579f858510736268bac8a9c149581e4f8efa138214d445dca4aa66d366f3cdaa15747b07710aa1ac4c5f828eb9ad2cf9cd87032004a7d1f36e728dd03b07825c5dcdf6ea933136e1eb819dd8a8aa27c3b0c9b56a0440045b981f1b9cc4107b55a51e81a5136192883cc1442572d9bf1bed44b2c690374d73a612889f8e8929246fe893dd6e26552da4a12dfbb4b63380e78a83dc44e82dba0d0f6d6ef6ec1c5732beb5ea0ff9ff30b7a3a3d1faba2591140d91017eed25bd5148326189b3b55c720360517556f14fda4b5e3e916015ab174072dcbac0b5ec075f604dd36a94a2c2491baa3ab7bbc9a10aa5983542745d55b591d494ed5ed493d77f5a509b2ad89812406accb6ef3c9064228532dbe21653ef867f89cda0f58b23083d9daff85c57d18709a7beec172cda5d7c3696bf748650b933f60bfccd51e4635df7237daca619581d584a32f7daefaee39cfd8ce6818bb2a88602f2ca8c7e493209903b47f75c2bfc5ae3744d3f169f61f28adaeac9f30b33a65d038baf6302604160b1ccc00c8b4d2c04f095ade1c76dc3c91a0fc4191b6bc374af7f1f25275f4b3f619994ccfe865849684fbbc38f6d8d32daa404806bb789e46723605730956366db4ce9ffee2e4c0b1bf9fd5e8fe7bb529d760fab94bd5626caf7275bb68936817f454427d2ab93d4bc22c6f52172da92c2c45a0cfed3b4a63b88b8b511c14119de1117d75484ac30a938cd39ec85679deb3d581732a1220d4956b8f5ead40f9a683ee970ec4011a963ca549f59a5eebe973f9e7cb89c3aa664cf8c909a17ee7dbe3d3da6f27450998c561187f14adc8f2749a18ff92b4b1c2e71c807b8238a5e308a98cc1f97d59b834a68a63beabd7a4bf9e5d38cd4efc8f6dbdfedbd7d5f968fa56f62bc013d29d935ee5ca20c1e2a45beffe9ec3f95576e7c5895229bdac0fc2c460d6066e3cf0e97072dbc355af9d50734358fb1e821f5c1b6a08ff57868267d911e952f65f583fc479bf2ed10835a714748ffd234c31d4a7e924e10d4e69f17f538d2d13037e9c42429de99bb31467b8d86a52727b5558514dcf5746ce6b699d6cea1e2def0908d2149e7d1d78e39849b8128171d732ee01e030ea6bcc31d61ba527adaceca28c5c39ea71bd214a42ae5cae128a2771a19fe87021e2116340e0466d62f8c2f12ec8f7a84de574f06ecf0c678e2435b97613aeb6851465a8afd697e3c679399df8fe97009afc3b7e249410657ca6c7b377457a2b9d698fa82ce4e0b26098184ff2e6601bde6a3c9b6ae5afcf647aa606ab1e94f6f14a590cbef26801b8bb29ae23699c21a49640f04aaa33cdce079a5b1a844341091d897c6ee978f9574c3263936d913a71ea0e25cbcbe28943b56b5acd60d0316e4be89f43af58c2c4b1fc154adb898ccfcd70e1f53005284aece0aacb9b83f0a73d3e1e452d508387544f6d519cca4245a72cccd1c2e3d56c14c2f41c1ba4a63c5a53a07c4ba864299bf313af969c825ce10b8f6667c6b63095d9dfc9ca7b7ab509eecef1f2a78e31f0afae6cb349749ae1d5d2bd08f4f31ed8ed14d98f50959bb4d950ab08962927ba4ce691da18428a10523cdc8eb6b5be43c63a54516a1f76c2dacdb276bd5c9460936524f35011b1d64976cddf5424993f2bfa43fa123fcc9bbaee0f256450ff4c49d030e53a0c999c842898e516673635e6fcad71901d27a7405ac9fcd32df0e539d2ba9a1e58c9c8c9f9438644a71d8bbde79a9e2ce20e4d36b9e8e2511aef932a11ccf94420c9c4e191d8ac250bd7ab796412692eb60af862b575c1283f85bee3356deaf38a22f694995e3e02bcebfbe21a1ebaddc0a20d8ef476809ec539ce2de7a65574be5bc8a9b9de2423e1e1e5bfb2c57982295ef5801ef607fcd4942bd0cf7e2210e5fca1ea985f46d0a342cfdad3108e6518c61801dcfa3e8a931d3e9494fd3a0c278de81ddfe98c512a9523f92605e1ceb663ded8d68c0d8f2b5c6d41de2b83b3ab97070b3584deed9d6248e552af5b052bbcb0cfb3b35c55c4d9219e5711e64c9aa2657c433924ee2432a6660013e2519e59f4ac1b781322841dc374a5b64b1e1b346a38b10f469ae98ba543d83b5ffc37c31438b8e11a3f96afb98b70229b7257d77e06260f2c3a11f8ad46812ebb4c2081763b2ff959f420176dab615ebc90761209af4a40be15c7fe2635a4f4dc8a7e1b847d2bc5b8884bde459c1f7198c09f6d73fcc6aae575312778d9e896acfd7c1aa4c5524f20453e8bab255363164afa7124b2425587a077fa0bfaf61b12ef3f0540dc4c9e777122a60610a53d1d75b0a5859c654a8ddfc2ff4860758bf5a6f264bf8bc2baa7551eb7be23bc06978be992fc81d890e07a3abf95d20eee3f6bbbc089985cac96395b473b2741c66bd2ccbef228432f66b906c15b19694dd786c29f06cbc17b2e6400dde4e3db85819382b3d05a4c3009e44f8d03fd2dafa53f308c9eee9a2f552036022321334cc11532f9fcdf9e9ab0423cacf346031d91de2d0cb9c78ed1f5b3253d5fa7f12213a20516e07fdf75431cf6a595bc929e83aae0a9bf204667f566f416013ebc105f802394e202b8c9a9baa4005027833a63ec72ea18bf69fc3d81cc156fae3c1d8df8b3fb6c2fd09fcc646f468b4e7df919ed0b572c6ca095b54cd4c312bf1a518552ded1e5cfd0fe93627ffeb0fa29e48df2d17963f1933c450f35a75239feb42fd6cba0b5aa5fefe6fbfbb026f32e02a846efd72615e9f8d511164a98e38f4f73cca3ef43882679ad790be55501365c50308bfadb9f4bd24d9ba0324a8676293a7b8d47f931cca4d022d923a5ece6f86ef7ce68ec5860d095f5fae9d2ea5b4a6a2cb22f3e6cfa78383f8af57e7be8e0ebe4dfab -MD = 73e3a0b552605e08c1ca390e9b8d498fa2679a4f2f29bd80ca7e40a86e20a5ed4a9b8707db0aeb79e251c8c0f4259ecd25dbb9c82de838ae953e712d36991546 - -Len = 35872 -Msg = d5233637f4320cf1579673430ac26259595f2e48d742aba0a59c9440f0712d6fbc4c2628e030c3b452d13a7fa5045d24d07578ca31987db3d2e25e12ea38bb1da7a8bd642a574261d4ba3a50c009504190f1ce6b6d8abac3498845cd67b567b21e9fc394da8dd01e63b83a5f62b886d8213df6d392ffacf793f8111a70d07856a999ff5ff6bcb6138933045393f9461209bfb8aba8e1997837988aa00c713830d1fe3a6e88cb3d6acd935ed55bb4d716d2e1de9bb817ca6dbdd278084380ed691d363c6897a2aa48b741118dc3d1820d030a2e4ac88987ffae0da2f91de5e02816a9cdf62c2948d7d0a3e522d2398f1f25a17261e31f185690b0d11ca388599642bfb5c04e485e3f9f22a13d91d24673bf1070870ec1c499ee25cd19dc529fdb2be1bb6d05e733a8ad270f850685ee3259bef1655357d4f14dd35e97d129fc1e5975a9a559ee10398018f5a33b3bd1837c13bca3b9c9908537224c3e88f7b68753e5451253453d1aa25e1c3e38da358fae779be848ff407e337a5eb70ba21640a197585afad402749b624cff034b637e7a5254dc09e12c03ca435daa6213646ecbf5a9255784a76ff18b4c8da677a377650cb02803589c3d82e512be9333e83c5965021c703b73322e40e69229453da2f90d77743f4ad753e6c8429ca8e9ead0d45129e64fe2afe6d9ebe0b3929c7828bdbe7167c3a1266e7b55b8eca81cb152c420e72cfc62a4b27bf3039aeb669d31398565aa9943d1b6cbf23b559cb686ebaf3a04967da197bf9bc017ef3c8af4e4f6cb1de5c91a20525d08927f8b9eb1c21f0748cbdc89d334c1bae4598bf0c56a7bf95fbf590c5a6bb90086137dbc7a019bef7b7421019f3a76493181e28058eb5075f4e05303c9286840dfb97bf828cdac5a643852f042f940d5c80f4822f48efea9a4f1bee6b3b2f13265188b3a0551d8b0ccc079400598aac66faac6bee37b0cfb369aa39d6130dc3ddfd9b86a57b2aa597bb49dd830403984effa623c6bdb02d57482090f1bcbb2c817a30770671ba7bd39bbc7a00b18777710a82684d5d6699e2452f82629abf93dd31f82347db25944ce7dfe80dd49eb07995c1a7e6993c8be0fb179c9d2f73c03dcf5309fe19f475701a34a60f0fa1d9d54bd45136e3ba79dfd4892e05fd80082facc1997da0bf95c9bd5b3288a54969f0774af292ef58ea3b6bf4d541875cf22f44c4605b11ef8bd65ba42c0f47fdd777b2960a9efea063801bdb20b45f7304b941ebed2afffcbe024fbfe1076a27a8b7883617cfa4196c4a7eac8ee2e85ac65a0ea89e419d7fa2fa33ff00157e5f645c62ab9889723c7af71ef97e51b48cad8e157b0253acd0e10a92f1e79e171d80c2cc770b70db82061247427d95367120c1f0e3a7c590a8eedfd7392615a6ea84773028ff0a62729428b2081b01f0b0c6a22b72fd0bdb5022d68b254a20b04ef6063821c1aa8996abb6d9cac54c75c4158b1f9980baff7f238b2946a223c5933bec4f0221f5c356c32918fb0ab9381383f967c7c1477f8e776a3c3decb3598ffc95ef3a6e60a24b610c0a2969fcaa3798897e9e3d35ddf694f02e4b8843de7d8e9f934b257fa8dd0bec27d6517b6e98d997de8d530a9d5fe2b99a2fe349d6e48865c5a4d5a739943a25fc725fa9d7cfbdc0f205b13a20130722ea2bac59e57d608500e80d7bf7096265f29de32c8834bb7173a7c64918c868c8a8ff31e86c70bd79df852b6243951b1894a99a67f2706945bdd410bbe9d88e1750fb2279de86d5b0bbfcbdfeb1dfdaaa6d35e3e0a90b3daa5b2b0f0715dbfd9b7cafec82de286fd610cf33b5b43217b7e6b33e2b0e5daf1bb61d4fcf2f3b2dd176adfe97cddde236986d3b0bed3458bd9bb227aba4f03416591b2158888ea535e945d72d300fb37e9d672275af7f1427f6a32ee70f5b7326dea54247d44eda554f2814b7a73679faaa3d88979d5ae0838216b261a007d2c9a16c112174e4539c12c525db95faac574960ebc61950345cb88d60b0097de97b3ba01c59fcf79796dead88ed8ec4a0f0f571baa5a60796101467a836ae361db81811d275cee12cc20d31cc71e41d1e7428d0739ae5e97c4a20460779f0b8e60cc101c1f98d49799a18f25f1d587c7b4d6e0db53a3b6e5d776698ed0e838ed8e5b12069499a8904ab9c7fcf243e5b2dd94fa9edf8391eb00441e0e748d9207cef82de370a99386463023a7b4b0841ccc418058c5941632a8d6cae84dd64063866909bc9a0ebd00f5ce4a301d668b8ce8a81d11ed1f6e4138f21622420a6b8920774f98fa104d86bf5ae59e17ac238b999077d23f6bc0a01661aac63a733a0202eaa78078f96ca00c9e9bfa89c974a047c036a2a3c235d8acea2ddb1f57d655968ab87bfc0f41d74460154b5a06a5535a01038a016af5706157486ad8ff660a421f2b916e9cf5b2cf69fa9974abdf2c3a1b869141ac27f09c6fa27a4db313aa7070a7cab6e6afba1581f3edbe0049b450d666bf4bd0f3e0c7f9e41366bb05bc8746d52fbc3698757f6fa84e204c0c7202fa4b1c071e82c949beb53d0b5e63c8ef695dc769d3d86d73fdc0c482d94feeb94edfb15ddefc338a86be0124e555560fa1e69ba307962a5af1e457cced3bb1de9bc785365789a4f218a666999805ef51b618b15318fa329d14bb10e6d1f842d7a9aea078d24fa6e93e167552bf981a1c6f9d13624f2d0fa22eeef6b9cdad290e403a0b0d9779c0d7beb63537a23960d9951ac9b6f45749d30724112b2882efe92813cddbee2d7b24612dae31890e48eef03ad9394f9f669766066a252ca01bd228e2eecc1f935d38ef24e826bb3f5ac448a24dd1a72ef055153b08901f2f35300a4f77c771d5f07b3042ec0081f51ec365fd2c68462c6f77da6cf4524a56c66b94016fb32e18bc56ec30c1a523581d530ff17fe572c069647e413455f53e55eb8fa1de7a9c87482fea956fffe98fdedd0d264d3074126884c961d27f680f6a17c2d6cd0303471c6ff31afff41ac3e9c728469e31944bf33f8275d5baeaf08d59f7494236ad83c07fcf67786e001bc77b28f67bd0199393fd732446edc4094718f4a248fbe161bdc54623e254e1c0ff5fd5e0eaf54d11ce2662172c003f831fbd8288e43ae60999ab1ff6458e06d919ddf6acf68876ee2f2218f68fdaa1869eae69a320db05a4df98248aaa03b78f9e5c5502a471dd513b595d68786532394a54719c03c6865a14f41b84189d3c0a1544b888fe98ca637c34f815ed883cc5ae17621b95e4b152c226cd8f9843dc7106fce8e90be5844c7919b3a6f92b05524f6003c7df1bcdb57098025131dde0ecf9eeadcbd3415533ba7154c3a136d607b7951d49e85424aaa7b18272eb5490a57781ced75f928340c8a5a413ef92f70c6d207848b978fc5aeed9149bce8e34c1071d15b4b6c2579d2a1b6b3fea25b08af967dc6d586d9eedcd788274e374146b322a480ae0b7196f683d71ee9ad849a9e4d41160cf1d528accf692a431ee78c97f103083e65b11e10b727dc908940990b4cddec8266e605974bc0dd4c0e5a703763895c5cf9487189a2159783b3f3a68f4bc0d4e634a0f834c30baab993fea429f083f78a34cc23f9db4cba23bc22258290864999098a830ddbb63d2c3e689ae83e9f5456b6a0b7c9c929cef11060989dd19ac52b4407387adc6cef046c0cc6ea94481d42ed6aaf720239409c4f239229757ac20d829b8b146b7c4ae2bb7faab997fa9ccf478e7dab0cf7a955c6df94ce02a2eac033dbfd630f70db479b25d8cdc0436d5c538094ad5fe183ee261902f3ffaf89d3d63cf1cf1ef71a938983b3af939ef99aafe5a71161834a95db547f23c2fd49c8e8332ae1306b8357153dddc78889ebdaab22077fb859781d55166be5f318851ff862eb21ea3a9012bca8b9be25809ecce3ca4840cad096c531d35ba3168dc6397520c5198300eb56ee58d9fbe10f9cc1d842ebed2f95112dd01fb0f393d9a7b5fd014b20b14adf9428c2a0f941a36059f720650d4cf391d7ee502e4ff1688405de88dfefeb74e73b0a7ab13eddd88405cef73609a9887323bb190620c5c705b9b83c15cfa81bbcebf1e58d54fc1b7255de1be17adbd04fb1e4deeb0e77818732187f6f586dabbb078d9797a452e8a5ba932309c94a478202ea164f818d04831f5de75f02a2a15c2e1c1562d548ccb8b48c80f18d7b7ab497395395f28ceca3d216e86766ed992ab05bc37140643405c438da3b2ff5d641df612b70f9ed9653ead2170afdb4ffa13e9b36357e2bbb277a167369393fd6d44befe24300258e0dc9fdd7dc2f8f415a4978f231f705de8836a400ee21b018c67d343c9e9ddb504c0018cf3d84d31aa041636bf94398fac29a6ff74c820d08a2e3ec7ee63b6579992da151b18636c83db6e927fddc4bac4115e8cb06d29d22e400674dbc615a667f933603dabc10e66d2a88aaa239947f9e29acf0af8be6f42463330d739820a359e1355a1b8f0801c90ca058a8d419c134460b0ca91670f8ce7cee52be486ebcc2982dc8e6876296dbedfed65444323dae1ba173762ad1ad6ccde7a20f0a8b1f54189dd4ee3dd702004ec29846f2743165eafec9a9017f8e69c6bd7fc8571c4768e2e402750acbfff09fba12f3776638e6647173b462e1184007ee407ca688d17ba7bed62d76c7dd076133daec4b7ed0b9f8b8062aa78ce7aa01d898be81572a26a78cc46a2a4115cf23de5483d724855b1820f57e47f958f2353aece0700dcdd482cc61dd6dce56b26808146ca30dc344535ad611dcbcf8a32253b194db23492fc9fc12d9e9d60c5bae4f9f09577117003aa40ca7de2e534749d18b4e5b2e0872ed9a6c0206dea315571358ec3d24fd092ebb1d82b4e3d5592c22de7f5884a8585e35e1c84d7eb789f301d687fc6fe1d9b00e9d4509741b5339c62faa6bdd853a9c4d089f360cb6242289ac6efdd861fc5efcf061343581b0034a0341fd8f4bb4384e3519592f3b7e36192ef3b9e4f9eb9c24ab59ddce950a091cddf89610583fb2c81bb91f4c93f2de4ef2c8c91c1621e81442a15ea5e1dbcbbd3410be0737478c2910e0f0eb6c2c5b897c50a3f45329d32a4aea4f31e48fcbb98a2cedea5566351fa933969230756e57402dc2f41d8dedf5287728191990798064cf9e305f163dea692358c76d786746c2a2be91f1a888f35fda61b1fda865a0486b575fa0c21737c522bff19fafd6c69871ef645c1434b375a694a30d1200a79972a1eec714417641d444b723864d5525fdedd1d95b91a3fe4e2942c477eaf4fc87f6543e675d34639a7f7eb5963b80ffb92260d5d8f0436e53a847b0548516d61ddd268345cae0aef7e8bea24a11c87a3635a7fe3701102a3989f85d025f8bbaa6beec123a0b09987ee90d962c709a49f7900daed024a8c67256fb373bdad21ea5240b77aeae1d949218d1fdb7c874d36fba08644edb6bc78087b6bb4b977876bb951b303e14ab37d3f0a2457699f6ab111c3ebb0da5d7b206a4b165dc15fd573c9a71b842ef20f6a6f8f509e3658e458e5f071f87148afa573681d347c6cf34ba9cc58c678e1d659daa50b778abba1739caf80e6597e41504a59e60293a6c93b8348d3916820ee92a8d3bdac0dce8a4a618880403b071a6918a6db8ead15408a7ca1f3aca6b6415d00a2ce03689b87255a04d9cfbeec203804d863a273c23e82be611fe1d9abb6020a99a645432a814bafaaf35b8b343d043776e5048db4ac69710fc1f6a90834c8f040ad3a45815e05890236ac49e75817d908cb7da2f37388bc3440b4c0d4a5f9d71f4ca917aa089b10950b89a10e59b711167cd55a887927c85704e3c317f0dbe9bfe95b61ad65556bead8bb3bb0272d072960d45f7aa88ebd00754b5dd9fdb74ea7ee19ca905f7ac38a060bbed5acc1e4c8df4256d1e704c2b8fbb33423b4d42e5fc1a9fa5ddd543ffbfe3ed385cfbad07c61e6ea961dd2ff05fee5f0fcfd7cb070ccd39a1cc62908c7271f21c97862f2cc4e89c1d034419d72e6a73a6dc0f5fc61756152d304424575e87551a88fff73400ef383871397c4841bc2ba7de5883bba2619c98c7ee71f8eab070a2bfdda7a6009ecd9c3a21c9bc505fe1734547d950446c5a84e1c60be99d79ef559a83b30b5a83c6b8dc91a4bbc0c22f99af51c31c53d2b9622c6f4491ed402b93a7969bdc651aae0ec70d7fbf199f80ab8b0ac388872143c0e64ece8a609fbffd658ae481b6d00e0e97f9cd4ed1246ef956e77d1d24f47411dde90c5b8e0516f362e50f93d6504158bdeb1fe37e1d5533915c3252d3b8e4f541c2805dcc0cbb061e198f9b39f7f24 -MD = f054933142774856dac63b63f175544298a3d36874bc37650a2682201f8336b621cbf9d95c87a9838181c1b5c015dd0c08723beb82830326382b5db51ea9283c - -Len = 36664 -Msg = a2871817b7ec41d5116195f97ecf6e4c35dfde5f0d5e8a17ede6bc6984bbb3633af33e6c66da89ccc194366f1b04afe54cedbbae6e5750b54935a91a0f4497344a361cd7121036d283d1f9bc6e54e0f14f7765d77f7dcf66abb14ce7854c3ffbb999dbe02357f1f03f5f066ae187a97526c50462aa98b032fba3ce584e9b53c07164a30f0177622ddd878601da64b17bb91fbfd8566f9a21215356f5d2f97a8959df9bed143830914591a107c3b4a10af0cdbec0eacb363c06090d477a2e5c605952ec01c562032460c57e06033f202bb3162aa2d0742c8a900d1ad5ac01a24c5904bdd37abc85ef146a468502cdd7e5ea442b066f322313a8a6a627d13cf456413e37ec9c0f5cf94aca200d28266e407d9de8752fcdc4e0371ed9c652a5f984f94882d39423304aeb2b3525dd118c44546a8a77780cb6f823bbda3995055ae06a6ac510c9c0aaebddd6ad558958d9fa57f23892b2b8a16456c6d2080423bf727aec292ca2ae71e30a13af2594c1ff696f7f1b5045992f2ab686e8bc06c9ce411215d5ae89b42e3a582a631e6615a39982575b389a7706542d4545dc02bd32551b2ef11ee59c89f9b162f2c7671b709379c31fd2171acee9a24910f062c891b67b7fa7051d2c2927fc0484a8009d0b5e3d0b8fa7254a30f2fcdc72818db2946d1c501dea9b2db7cc2158404a97611f02b577d43e2dced37625449316eb43e280e4e97b55c666daf107a64f3496315288c84f161f956f617d04c99a37e44324fabd91eace06a13b9c9836d9ee63d34cf760da7cd3c6f57f1081b5b06ce07901e08e9292dec3a482d8bb4f0501680fb65764612fe12928d735844efc3e47ae223c3f329a0c653856aa583bfbf40baf38b1bb2c57d125cf11f6f5dea73481aa2e15b7ba2ae154255f1c5840e44fb679790c4f831a2c21b4d55bbcabd8d7f635ce74e0726ce4f9334635a1a7e89bd037227007aea379879dc96bc2feb8ad0f17aa60a1a1869dba2ab3fd1cb82e5fc1afdae5cbf41840be53982eed1e6f40321769e1e290a09400d14d7db1badf23f0aa4a74839fa20a2e9ee8ac26552418c8ffb3ff8b88e35234f1bdbc49f72270c7ef1a2417f5685d3f4562ee56e9ffbb3a9532c385cf765ebc52aac2cab520ccad48f1fe703f93c45912adfb632329b3eea28b34b6ad824002bcbd981e3d00c20a7b770874c44ac4e4cb71db374bca884eed695b076c2f816cf79e452bd7ebd74751554c0cceb6e748395897b8a909c0c140723e6053a4a864caf4d1dbca0995ca9233d221a3feb4ed240836d0840fe5ae614ee7aaa90a3d51ff684514608183fc06b8a0998c4cb33c5429c06626047e7f19a65ecbb788c89b5ca1a8c0df7c2945748dc05ed1c56d9b90643e61d50f149b3022a9adc547d2a9aa4802c69021100ea65a3a56ba936973a161b7abda582e6a6e69d2361a6fe2e5b0045c0ebb99bfbd62c6146b8fde2f2d50c7332b7d0854549b24e150002781b6387ebd80a80bbebc7179588497cd482f633ebac905470fc17efadce2bd973684085d2d049ea096719b1c0e881b893be3a270556dbc3ce519e094cdd49ae889b8ea4ab482e780ce46a7573c61633a90b0d7020bffe81060c48999bb0edf4202b8a3ed5be2c9d2eea15fd1ecf6b706d0fdc89fe567d2ea082a41b2af77d4cc2aedfeed290c8dbf7fec8933252f5f1882343eede98dc2f364b4d087b0f9c1af88bfc2f327e87a6e088eee24f0f4a2962ebc0194215aff53fcc8fdbfc67bed12a597b6a65b5fda0711ef564d542dcaa95dfdd93d95b4d33158d09103f9e6a11e07dba4afcf57f3b42277895559c21d78955f8e904c8584b5013255fa522025fb38f552b58bb90f9bc48e4ee6079be42c614ae7344eb35b097e580e4dd812c1d0c04b8861956e74e47e9c6ea567a166ec4626aed2a327a05257a887a394a4bdc52547105bf75d6ab8d909b23c80baede1ce5ba91154ca9bbb158c87a58cbf6004f14fb14ab96d3b3f5c3ddf535acfbf328051a19a678394693f6bd5fbca49f3b2abcd32d6e1882da08fa1c091fec92508e4705d14e739d2875dac3a4c562cbefadc285ca879958a04fa9b1c9f738e678b8321a728d9d69e3bf7b97e40364e09020bc8f768887b98922694ba24c108cde2e4ca457e474140ad96f9698074991cf2c015cbbe1724a0739af563c9f11d9f3690d500bd38620007c1d4c2b418f33ef384779f502d77e9cede24df360ab724ae0da8a08db521256e01b253842846b92ddd563cc9d25cbdcc7b8bf61214bda573e5aded98c566f90cddfbe296ae79d3c7561a6bcf0ebb6295f890700618176aac9f4aaf837019c209dd173895b174d5e9742bf20aea7c2150dd9d14b91cadbb82c4e9adf9be22c98d896f1d273a1f07bdc1f199246d884225b319abd42b67e01ddbf1b0a0b86956bf6a6959f45062b068c4d52ac2a0c50d3d006cfdfe4a2d20a46cca802065d7b1c7076eb3a5fb251915053d6b8f891ccac04ffdd2e083e7c54000dbe522ce5221cee8e7f4e243508bea0d9226303275c0d62536f221dd7d15181e8ea74ef9c3effc963ae45231cb4c0f633d2150a3b938a50c7e256a61d759554e4a8d4bf013647898d14b9ecc7ea4ad8fa42595e3ce7a588b3d326315ddd81e187860c2bb28c66b7612f16e1d51ddec1a31f9a7f99ece152bdce2b30378dc9c057ee85a60ec5dfcb9679e682a2d3ef38b4b672ff0107c0472c1fd03338eabf69cc5edbce9467354e8371937fdf80eeb6a5935d5cd0bcb4fea554bfaab088e5565b5378f5d1d4e9a8be92b819e9c96fb40c52c409a79051b1b00934175cfcde1e9b68d7cc55b37f72be79cef13ff1e4c93f614195f4170938c2b9f7f99cab0c1af31b92b28e776934f983428660bed06ee54b507224b54dcc53c355d1de07f1e408c81438ea953957f64bad59fa64d50d647d6b3ed7ffb214e9d1e830bfb811f2231ae6d0089162543b3f89dc4ba8452d53741c4c7c5ac88b0b422986a02ffeddf860850846f066d24edb429df2edb35728cbce3b905ae3972eb084543dc41affff5569525436c92a97ab720f7ea9a2136ae10b8c9274a5d1ca99a319d738f8e08e562e3e8ed90bf5bc3c92b15d6093da70605ea0113c81c36559e0480ae31b284bef2e3d755ba1ac02eb1f240da70b24ffa622269b1709d4959dd68f5756e42fae7cf3cf96432cb6224391c80de16a7b6f3f10708ea8909dc1c1f0302b09067f3cac19756003ffbc90e2752ddca4445625a7842e6a45d8778062b7db247dd48f6ce8f9cf7122bd27b52443b608642b4dd95c07a0bc83240a47fcb7f0a239e0e8b5b03f2e3833c77025a588010fa581baf0e9158803f515ce8efc5b1142a1ae03ad9e3422239bb13e68c2bc8f60fcea25e2bb2844cef0202ccbee2bad7459be78cb0f833bd1ef0cdad5284bc18abeb737456eda577c28d5ad954ea435b5d674a08490a6ebb1922cee1132d0380b7f8b379f608630a9f398d961aa5f3a958c732370ae19a24119a3d0936ec46361c3d8df372cc680c6d4fc38c76db73c82003c79f5c446001f0a143ae258a2d40c002276c3401598516172341d1536ac09b6330caa8fc68599d7d085747cf5fa88d8fa96ba36fe17d81d9d63f94d6819ab32f964054d259340076b38c048285766a2b3c7927dda6fd96dd040e252c605d4fae2087ca8bdc9a01d66dd6c46d46b03e20081d2815500c3d6ad334ee1dae115629f72970f2989488e35dbbef564b60f3b434df0edd88b35eca6e3b557113beb2e842aeb0ce36297de7acc5ed063c8d7030e84742fef6f9e143fbabc4ef396d4a332a9cf1e65d62c828817c2745c0409ddc4ede2a4041e6ae1ea30aa260c5260652d77d9a03b64551ef056703da7f8062ff8b2b2f6a1182aea38de2578c62efce8c70d815ede8dd01835f0eea8f2255a7e2cab6b94610d6c719e2ba4b3bb6d28a2b1e36c96c9c2fbe2eb8f9452a51c754ce3108319ae4e9e2cac91be63569d62275081e1e487a45713638b17a74b3df5109e8a8fd2f35c3e8fc6b8c904124037eb357187c48292603e406bdf335f1a486db181e87cdac6dbff8ef95b1298f62872c32ac4b3652da5a804ba51635b21fdc8ee9f3363bf0ee51067ebeb1b351fa232ac263f3d89c6a60522ef24d3b9f56396982ae7143aa4e846d4090f8a812d43bf32ec4dcf6b0ddfba1d82bff11605387b30cd7a2ab829642775c92eecf7cf6b8d09f586f5a353b15b771d8937d9c1eacb5aef7303c1fcd726afb4dfbf2356a80093da512cbd48c95da20817348fbbd92b7919583be2afbfc8f444788d7e5387de62f352e1035d963530daf063a273a1f00dc3903f94a28c72e600afb47356695af9e902cf2ff29676a61e9b41ac59c3ddab86b18b5285dbd8f761ebe0accfeb2abb13c7239db85896644b8e5b280ecd38b4db42ab96ca2c5f9af0937e85407bb2391c36aad70f4b191dda301c8fd31c85cc29ba1cebdfdc7b63355d0a9728a985f65ad7b15677ec73155327025e773069540a9e5bcc378ac0c2989f014d08e31a756800c3b672bb38fd3ed9b91e4bb747eee645e4b271a5a44b92efef3161b6e438cc687e519045df3805de8d39c10fa5ff556744291ebbaa50dcb640cec39377a2e0653dc2410ada48409c0b5b97a807f7c07906ba8f4b4794ae88927f8f1749665c9d8e832588cec06798cfde001ee27acfe188c153c31069b0ed50ee54a0ddd58967ed0e8e2e0112e36b274bbae2c9fadc3766e80cb179626c3b088594dea9830f5ad5ef0b8935c25c79ce2f288232fa6de10d98faa506f1392825cfc01f30e146ecd58f2e28b1513b4b00f2d97b91fbfd85095ede0c2d98b00b353786e11892d8a46879566b284208658c213e4d7b622379d694075571eb697ab35729c2a4fa2d080b3824eeef172c4fbc54c76663df4865e1e3172f585bbded3ca959427a99cc9e4a461a229a334f600de81564cfc604afd7c67de8655c25d91d9865df1df43fbd821d9684ae38ca5d1d65a8a733b8b0de14b8bc1f1d7f59d4e2cf0ff6e39bef0c5f492aa39f9a258d5747e1cc142a056725344241e537a257389798388ff363014e3356fde2d9f97748296132058c5ae185c3b0ef510797d66b9c9f02678d2412bb76ac021c6abea16c6497877c7229c3b2d17875e581b2e9184894e30edbbad7437d8a4ea0eedda230a4052add5e1a8438f8197417187bf5bb161a58da618fc552d2823214b8eee031422a9accb275a984a214786a4e6b82b0af8fe27eb12b4385f0145aec6b5af1fac98865bf11f3ba2269e9e153960a26b55f760e504d15f84970c1379c78ba3dd9c4af0a28eeed2caeba1a4d6781c04825b05d4af387c84a19bf1946a963854a6abdfef69ebbfa77660d162b2a94366d8e4cb616dd13cacf73357d06a7ae34ae3a0008b9851b8430f4ed7df8f13fc50d5b8f10f0715385eee29e6d05fbdb50bfa4454cd1806012dfe7d5a2457ff704be19e1ee6664d9922ee44479b33a5d521555f84bccf52c3edaab50337f0b5c7de645ffaef70c086805f4b2239cc7b6b145ab93760a67f260c7abe7a22447d2892c6c32e310eb82801a9071eb31486a16a731916c285d45111d85f66ed399fbbee6f9262b4297ba62c3440e410f1109dad0748c8e955986d842b626f9eb962aa7ac7943d81a752298a68bd1c584d5f87647d0ff6ddfc14a1eeda8d3e3fab101abe3791689f7285d9a1ae486d940fbc88183f3448a7649016d64fa97bd7f6ef354325508b16705cddfc6ca77fcb1f6fc850b47f654e7353f3c4f17dce6f84482390fa9a4def8b1f5e200ba3fb0565c06e9444baf6da13a7614028d3dd0e3c620c2d1f375631a9158397f404894ac8f7a26c57aba2542bd288d35c7153bc068717a3faef4fe4b48775e88e92d0a3335b8e61551c12c3a31d8f04f520d681cafd6c79f58ae01193bd5b9b401579178b3557faa7d3ee2f63d09f5c5ba80e66700d343777cfb0bf2eff5e3874542bafb9cd28c0b398dda15233df62f7d1a572e1ff9766e78768f66d95a64891188f72a56b273ae235871f5a8e789e2f6340ae031bbc8daf7aafbe38c65a53ff294d6837577cf09c7095b4622891986c258a20bfa9cc3436702e2077dca3df254f0c9958d8506a4a13af65534a53d917e028d2fef0eee3e4318d23121da8766d52740eee38cb3152e47c3c133ce6e8965cc5cca6394b23218473d0f1d2929f3ef92ecee2bd14cc1eaca5408b46714d53610714a0cc0a7b5533882dfd4288e3000de2e11db054c31432d179a3b01c91b4b796b4d5f15574e80475451cb7b3c81c5737508659b29f9e40a9f044c1113b23251bb42cf0519443c0e21d37773ad8f89cd62204ff57e6239cd5ac54c275d307753e1a8c102866cc2f76bf37cb469bfda7675f81eb6a230b0ffcb5bcfb73e1c86da6f0df9a026fec18da3202fbff98933f910fe46614dbbd61c61465b430eeced6fc -MD = 221ca8cb81dae78612b8a7c2ced624bcf7dcba005250e194818805acbc64a41ffee4403672405ce5e7e81751736ef1e7addcfad82509ac4f0f5ec6100eea39f8 - -Len = 37456 -Msg = 1f55a263d748b98577929cddaa865c072e37d444cd9739c28fe0f21d2e33a925ca7fa2e2dea54bd573da1581934c832a010880dd271bf6b050f79c4b171910a71fe9251605e27e8493f25cfc3724b46eb37c85af152268c1eac46955af35158e885ad4083546791941a418567c551759ac5b88c280f6b67cc50cfe42dccee1616c9957bf541a651ce4b6f1984c29d675546d341f4edd0969499a061a882e9ba8336f55434ba66915e3f191c98ee6164a14792ecd69208911df3527e59a9b6cec44a4769d0332ae8da81d9df12ad5025e524921d4b7075dfbeda409acfa5e7cb3090063d463065c0c9a02c018073ebf3c77a3b33d22d9aeafddb0557790bff288e94bc4f0526a9a182167a0470f697869ec508c0f91e0a3b61521b34c4405f6f04c4c40fabaa5903ba516e586299d536e18185552eb626597ffbfca35fe7ab2759acc80f9820067fc8ed538db3d2478d462c2b60e1aa81bda01514339a6644b9e3c932cf592c347e3456d4150344410233418564c05faee0885a1c560240cecf39869ebf6d236577930a6a7ecf44643e1f5e0de14949f06a8f275f9b360babbfd171665052aa0c045b84712b7667238980ce3f56cafe18a42b096873942b6e04321614329824ba9d0451a2cba720f18cfe3e9445e3e06a35f27cc16fbb347844e1f132d6bc27d3ba040e59afc01670a0fe1ba73f129577886bfde4eff99b6cfa477f4cad1d27f9e3f0f710785f9c037df6e1d292d581c323fe096d94fde4ce8cf93ccc3669a99f9351c86195e4463c7c7f2db0e1bb49df812f2ba5cf3684ef857d963bf2f02127408ceeb788ec898e14fd5bccbc22321f3885d1382f1210726c2b3816736f33439428c6acd1d6fa6ad008088082b8ef24a288969f053efbe9b9a88ed638253456d6ac0c9c0141fd7546159076c5cde56267ade845121bcba7e66c0705a1b0c8e3b09d1d1f87ac271fefbc901a05ff996af07c52b4b616f44f8afc3d2f50a0457c9a6274a1e573fbdd254393d4c3cc9fa0c56a428861df0a431fcf8dbdb5625e83fc92afcd9b47e03f9f60f8417f935c966f0e441ab5c272250d5c952b4075588c6fb42afd298678b9b69b59ea9a0244de45bee3f6227fc067ec29d012a267e8086c2d72ab10be29cde339153ab3880ccaf2129e952855797e24cddaee3b98719a6a951361d15d77fedde0d6bc5ca308feec9fc09247e201ea5faef2287cb58984e35189bbebf2e7deef28fad9e5d1cdecadcd165801a3fe3ee553c25bf61d948a8f094213d10cfdc0af581e2dff92c016be10fc70c629c2ee6e42c7f3385f270d9612d8f4211a2e468714ad22fa6483ff8601df5735d1f47b42f28f78a3e8b570c104caf74c890df31ed5245376d58e19ae265b75b13b17582be96566c958c46678657477c3f7f138cf201039f55442f78ee4ed76d8d3802751adf648390dd85124ab820017e58c9a207bfd30e67f471bb0c401b50d29d34b7ca6ce9743a665c36e4d502ac8b04499ab4f47f2caa50ef8ac4a34daceac9547056a4adea981013fbdd18b525706adb9d8108cda22641f10e9fe0332bdea3a9c747ee778bb4c1f188bce800133571c7d3f7638618e3adbe6e245d9673b5127de523b411ff95623f0609acac1fe00354639d6d7235ea7e9fd3dc833d2c770016f2755d41ef43dc469c4dce81f07b07cc76fb8f58a2429adc654dbaf2ff2d54bd15c251d003c7154b730eb5472f0d6475339a2f0107f3ebbd4b016b7b93def6ba7694f786e228f799b2d7c9c6839f0498c301b7360a065789ae80fca19292cd553e72b92a356e6977822d72c69538ce7c4db88dbd5682c88ab550d72ca151c3d695e5fe86a3a1522c0b9a180e0ce0aa6bfa481b5e916f250689fb62e46a24bf84a2742f60d5ca9c0174a52367919f80abf238c7e364d55646510907919512aaa98ea7b28172f12e3ee6d7fb99cc7e38855c10fb1276bd429236002dfaca246a8b8006f0b1231cf02b88b6086c6484bb4160591eb5702ed332606a3be8b061e872a11a51b79055ca0f83ccb3a802baef27289a9892f931f06df6ce9b23efd10ca8196a3e5d60a3a434fea162144d26bd7fd95bd072bacd818c21b5b473307cbf740f7e1d693c0f66e022bb7e79eed20d909e25301c5a0a6fd708a6eea01b6be71dabdf57a4cb9ff85c17a4709f8cc6c8a39d7e1f5a82f0a096d429b17157a56dec171455d6b65d42f004e49f4ed009d400fef105f2da88fd11acc665af8d323a2978a57ec7a4512de31101724e61a21befea034bad09d96e90b9067222641b351cf91b393e3e829f7f68855366e99c84b8893e5753b8ebdc5a227041928567450cbffdf0052cf8810a2ef8a9600dfcf6a2022992ac8ec72db8108d38c7971e5443f5d30ae215bbbccd8ee0db0277cc5bf67e4c647f34744bf2abe3c08843494907c126ef9ea1d43610aec75315cf149afd2430369651fa1c501afc429f31ee0ba14b7c0601794ad91bb6347860bcda9bfc1d5c6eb78e628a19866024d208188459bc60b9d245258c35cfb0b2ade728463e905876ab93b37c971695d0ea70cc9b763c576fdbac6d36a721c269c2f805830aa6adb43a07f5d910f325acaf13143842f2eb91e2572bc1bad3f20568967a3aa786e2922b93318bcd449822e896f7430307a385b0ee6714b30dc8ee67698d535e5a7f7648de6e79163274985fa47ea502a307b40d182717ddf9cd8d871a48b677470dca5791b48b33e54378dae3af4487eca086c07d75b27fbc88489051b34b3a7713f521530ba96b848c2922fb9409d90df56493c658cde081818849b5d5fbee12195f6ecd7cbb0738d813ff9535dc422c8fb44c9bd950496e41b67befb6acdd3fa77006a60ea94f28ae9e385998a60872f4dfb4a3fe2302ab4f38eea75e474d274690b087ca5b8b7d963297eec74d7406ae4e9387d12f536133786a84d6b587f27d273618b6ba035e1837e2fdcabbce104568b1ef5a5a84b876dcb72e25dcd3c7d59d5e00ddacfff4bd15e22da7d65eba3f94d581a08ddcd79fce9c4e53a678ced55af1e8441ac6660c345f2768886b2a263cc9e8abb1a4e736b5e38c69fac03105c6b677f5eda1dd8efd219215b83f8881c753ca83ac250fc4f9528f6ebff115ed4a7756f70bd881c9d6ef17b44e20fdd99d3cd03168a478d001b2006adf54a4164cfa2c525eb3794728925e4f3157b1b5264ba1bccb6c49e237ca8665413106073608a20ecd79ee905cd30eed4b2ccb9dc94ae62cbfc4ab820264ca68cdd063486e6960343f74072ad878cf9783e67319f1ff46892bf3c639ca46737a6b78e2625ee50dcc9eeaed9f06494b54c1cfd3b203346adcf642c18ef8392aa40373abdc6c4451dcd124c7774d10272ced2d10ef68aff92d0af9c50af20597ed7d07e73e024dd66ec06abe3814930e27f049555988399c824e60f9332172615dc17dbe1187c941895304fa6cc59ba64eb06bc876cb99fbe5aabe8694ed4831fcb81d57db63813d367239a29ac7f097a816db91d19a99bd5d065d93b2bf4eaed3482edb27fd3a707c0552df4b825a8a3d0ae0d9ef5bff8af24a834917fd4d81e95afa717abfbf8263f497d8065ea1271675c3c85a78940cad5f79d04a110e5146d7c7425e10d71cf32750b653c38c153a3dcd85995720e8952b874fd36156c7f3a5de765a5849e63586c5a0ba19e5fdb14c433934626bc9b397f4ee3b57f08bf7ae8734f700de8730fa3ebfc4c872868488700bb3ff3c550d8b0ad70859a3445ad809a4bb6e5ea8ec69023af838fc59badb9b249f985c34aef00f2fc5d1369a250daeef300b91f072bd5a3adfd14a1d5b2c0bab8094940f9bac4c21f72672375f34bc3dde3f3e08c9dc8ee7fffc267b706209c9dc5baa8edda909d228c01fc010357cb54c732f97f9b0e668e31f561b0067dda63d5566587dcd8e6ddf0705e040f83680020d2a460b1fa9e610a4a3a41322cf692aea921683022218a563eb3df86432c58877f8bd0613218810f1d5bfb17b273b2c82f46ff52f0efb013c9a7f3f63b7ad671761a3f27394776970b413e35a2c43ca85560cdd3c9b407bfadb4f1edd0e6026572ca0d8274bdaa6870749b0a727aa8c5b7e9442100e0c9b0574559cb880054d9e235ebf168eda4ca09808214a6097fa6c34b02d95b28aeac52d38c1dd53c564530c82af2aa59fe5222df93d2c1f339d204208a5b2cedfefa3d0a09534cfc7f4e0b0b7b04ad750f9758fc30c33aca5fce06f43b24fa9363205233721a53e3484acd7a3cb5e6d160e01860f96484e169f12820a5c558cb53c54f0a26c19e6339d1f48ee074faf18ae2dda85e4544fae0f204404acaabf8494f9fd8c7e7611edc6a1cd416d03e57f606352ccfd3df594d3707ddaa9378accc25a129b60a60589879a2c4403635772ad0bb78de9ed89f1736cf4335ce435b54fe1f977198f0a3068722e9ed3574d1a1b8bd16fb14a52ec787a73b8cb9a0766c2f579c9b11b6a0af2919bf7e5c80e9e344c681b5c3e9aae6904c011003f4908a3fd593931316b3eac603bf93f9ce32780b64438f2b0a75fce71a4e503bc44c27b63626ea0b857f51f45d64aebbd14dd86322c6f7c87c3253029e7dcdafa3dbdd18e5c11069a7456d1a93392f111e9e7ce26ea6800ad342b1594519f8fe07f202de60fc96cbe0b8a4cf51b7a5782a96ee0fb44ca89094297081aaad62a55511417d3423fd90c63b8188f56a927f79e99451a033e1c8337928e23b929b143fac118bdbf1b556cc609bbe1acc969570e9184e9ef6bc30359433117473e2e91c34eb70c4c04e8c67aa5bf51e57f238c427d25d2cffa8571f2d3785e1cc0a827f4e47d28b2a29b02c8b3ac49c8755f7d8286b03c6c926bb54869eb60005528edd5aaf17ab89e7508f85b08301e53241216d4ae8f8fdc7bb8a32e1385bba5b5cbadc99b6828a07ec052c75d6eafc07b33458ea732fe7fbf604d4a7736145957a9c668035bc94fbf131e1c326b43656ac858dd218f82243f968de4a0d9d519166f66b0b2bc62543fe7a385108ea2eafcb997e8a60de2730243aa2414d8c48cfb05d6c92ff1bc5607262a287e4193f636ee4ad8bd14e813104ded335d99aa5b0d535eda02649ffe1db6fb2d04ece0312250b9d4ef0c5aad719e9e3903864e2e5541450bb47bd2f48b815ebd2af54f45c7c52c05c25d01e82e1c055d8c057aabd9b8d586cca01fdf596d9b0079c5a9d72d36ea92c070a56d4db169c88280f47da39e5470d23a4c688d64f91d78c4b5925d8c3ca471ab0ee3d94414a26c5e854abbdd0bf44eb12236314dc13cb05a3d1b5ead6a635c7703f3d7bc4c12d307f5bb275b4237c96c69f24c0f3c87a7f0071d3883bcf6093d4d4551035a403ee30c77f1024164cbd5e943e794af24e7ecdd3ef4f579860063b4804e008655355a922721b84fa1da5369d209c3653bf8b8852699eaeb3aca53004dd79b177940d44e72bd67b516804eb346ba84a5f560bac77e2f4c583bee73f953f3bc57d3e8b90901cff6bced442e8d4802bfb679a95c6deebf0209b0f42d673baa4b8c8cb4718b7b5e4da94bae5cc080ea5ce1f05a053d1d4ff446c265e811ac0430ffcb2d649c897354c75a473e149579446e82fc1c01b4ea0a5799c70bc04f0a53f8b9d9fa04d315f35d42963d5030b85da556160b7f5a952c835ca5003cccc39dbe7e429c8a004c12b22b24c23ef8ad90cd95303980b85a421334842e4dca38f49b41f0b0f8b820990f3c7733a49662c63066d30ecb7640344f48eefdbbf16f42d52a6aa014a59a70bc9d19f94bb1dfe514f285f22a3b4fea7fc16ad54dea726db56338d2a76dc17f0177927dfbf22ad6c261d14d63af904cebc6811ecc5d495e8311e2b078b89eaf26f268267b004d8282da3c873f7b0a43db80b94001f1fafe875ff0a0512f37e67235255b958550d09c8550088647c6b596169da3b14f8f340973eb0cf879960d2e6950860f2639a7578b943900baca8c65b1b2b0a71f0fe750755b5b363fc30da3b5720eb28d12f1fc149080747d20ae907982cdaa088301a58ec6f5d329c4cc1642125b4662e395d347cd46ac38d0055f95946381b2f26950e5b64297dea334d237b8d5934cb27b244dd2f46e92e077192e70dbf5c6640799a4b2aa4a07682c1ebdede460f4898b374e27f083335aee086b9f9bceece2c3c7f04395b34b199b41fc37f077026fad537155a4b3c445517275a80dd4cb728524f4ef6b9b53c06b841b21619e1d6dc9c2dee376c5edaa88a0731398ce0c1f35f6d54194cac764832f43309f9eed89c7cabe59d08355907ada8e69a38656eebb86bebe78084e0ecb8a9bee123f1bcd8fb4394019b3a5ff1168ee3098c252e9ff1cd5f07f1d90c52bdc4ce222484f4109c8761fb91e84003491baf3de4ba817ea00425e12d036918b6f7d94388330ec1e4d9e7e188c9b99cb9e1b37dde9ff8062792e9097eae87ad389578dbab667d6b48dd8e59ec592d4bfd73886fd63ff2d50d0c10f78344d89eb73025412aa9c07b4ce4dddb39010b9f6843a67a68351259d4e22621b730ec5bb75a571a6277688075924edbfb6bd4f59ed4863400f9d702f387a11ea72d2372cd6686de0f5 -MD = 9ecb44114c5cec8af0b3a10498d7cc4e0e60fcc3b5bed7d5f7df23ca7269ea002235f97062a6ddf3d8a42e37e48122a8f869007da8855da0bc62468b53b8fddf - -Len = 38248 -Msg = 5f07a4bf880f45f5e251d19d4652878a89a18edca467372c124083097a49e5a88e7b48d733375433e221ed9b4e32fde4470974cede828d37ca8a528f0a32628ccc02f21f8e8f12a6834f316338ade42d7759e3656ce2542c06864dd3a0499493e144a97fe04006b68c83a5dd4ceac3cde238e48895ae17728fdc7bbe84b6022694ea75df7371b8ccc76450f2d112222c504f7d1fa20f5b712d33e436fda234abae9c5e278d4bb14efa9b3a88114c89b28946b813db2caa91a73391245435b38cf8016d3f77f678a6eed06b8852c181c754c49d4a882e8b3ac7858971d296062f37c2a90f7999953a6baaecdbdd9891d37a7133adf13c87d453d1d403bceeb5fe36861b80da5c917439d1c467fafa423ec4f682245e7f25c714be7bc45d64495fbcf6c978e468f3bb1feefb16f00f1b70f7fb9298161eed7bd2f5859bfc2149bc90babde0dde54376e6a99acf09fea4d1de276cef62426759551efa6fe04c3d7c7b79ffa10efb0a0f56a9a7798bf065ca402317138a131cc764e0e32a520ead0745db95a1bfd0ceed37972dfebf0ce7c1e4969bead6b8932ec9e347b39a8f22c5b68a89ca388f1a78511a3145ed7bb11f9329015e8d5a54f74ad02ef200f6241e952be303c05e73186cdbbd365d644b4d15845056f920e888b04fa0cfcc6c397aac69a933a06563354f81d8b956f03eb1324e90b96033d64bc207a6324518eb41c1e9e54421ce7137c3b58bb6224711b5b230c9710bbaa6a64aa14703b423c1db9d569e1d89be2686901fdd1507904cc05cd1046542dee1030ec48c2a61b443b00856dda6205f088a7e66d6be4ef47839f9da497d4dc70ec9d8197b8f94f4fa28ca91a9c730d9a1ac54337e9a3e9a1c8a51f29ea1739cb5606e481f1b950a6dacaab10a68ff547952dc2dde8f21aac01a2cc20db9fd865e3098f87db4ab1f25a2715b0871d6f716e6dcfdfd863d4eec5152f19dad33ac92a120d19f43205ba874e739accafdea02ce1d4ae368dcac29978b2856655d37d81bcd7d8cb13ae58088d4f3fd5cbc56c57467bd991b44ecfe549e0f41cac34eb90666a14ce442e634480031030d5b63e53e82fe2689bd37f4f0544d65c2ad1abccab4e8e8c67f854d1b339ac7c62138ec9635b4929891b592d3758bcb3662c269cf7ff7673e3beb526834d6507058fe62e34987e632068d6066c970790f2b6f487d8e79d133bc3fcb99cc8ea7f146dccd8c8721293e66e8e60f17a579335049e23dab142e8f4caa4115c36ad23333fbb7fbb42763a4f7edad3729d1d38c1977be759c70873931543b44e111db1c6982a7979b449c4c02c53c47c59d8d01cd22648f2a36e319b364418eed2cc9962f9a26c8031edd1ece971ba5b4b1b179b6715df11d0e4b171c03db5bb162a588cc6bbbf6b35d2d02a58cd3bbbdb446de1a8d30053d9fc61bb2589213f35c76d9891cee8974aa95e0cdccebf0aa4f5517429d653152925c0dbf8ced1e7cc14473aed647e90ead1ca08f7eebab4229e50c76ca85df238e15d589c675e4143a183d83c04f7f490dca2a33ca5b564cebfea5fe3c1776793cfa5b592fb0ce826ff91f4f038db1ed72a76601d9c458913ca8ca211aa35e1c44128876ef28429007ef015cc689e8c186bc3c41d3ae19d9c5ec63288cb1fed44d66422a2d65a904ab02cbf032cc8d8eee10953ae09f01eb2dd1585bbccac069fffc72bb11ed6ca7023b65546fdd061c55ab5735262178911d609102cf750ba204de0172c44af141b5a1b8d0a444bd3361966c7ad0bbe6913da0f665f03b48480114d5976e04a29a6b3caaabf98a189bbad8ba5104f6b3b4349970cc45a3dd23a1a4d87236a1e679cd15242f9736811b09792b02ea5847c2ab53e57ef63533fb8998f04a45ab24a882330fa2a6d05f7df682a6d4ac6b0a8349d73fc42c79b29864f70769c3aac6ed339f514d4de11a8728fa12116fb765bfb72c64e60ff8c2c2d8ca0415d7243311885fd478b5f01a0248e959ff5ec3be3d9c5a3e2cc639cc408d18cf97a9a3d3dc287d7e6b0685c6b5fd5862e69e177ec6a16ab3dd7ac436db2de9503762ae0e15bc00396d6728886af04d15105a3b0e226e63ad4352226a5b5d466f3c2ace4c86ebf1ecc70062c7e7c9d35ac4b8b8d419aa4d13a477dace88c73514f02889f5f55e577fc2fabaecf52fef1949e0143a72fd30cd491074cc2913c12799856a712bbd3ad9a47db95d5ccaab3ae8fbdaa7f71115c27a4679cb08e9ef908068f628f0afa3e4b5b0e583e4430ea5e9318f836e8b03dc7f417033ebefc937edfab7830bdc98873fbcc9c65542204394a9bd35a01603029f28e16b9bd05604276334e846ed24aa88c9ea8f766eeafa308ceb2755581c1c232354dde0329ee078caf5c0678a4c35d9fed244107073b30701a2c055f95613535c52f081beaab126578374375a1a117a83084febefc4575f31696867a2b9cd77f8620c481b81617a34656a7e069524b3811416cf94e3cc8144c88755fb4e33d7220d99fbf12bd6bc86230c0435c557cc207f038407dafcb5614785e5ab1c2dbb00daff63eab1fa347846c19090b3930c87cf7cd1efb1cd43b06fcbe05b2ba46aba51a748ac1ab32a2f55f0ecbf66bebddf8feb80f56e29725ac7bf0db2847e2d79faf772df6eebe5d6d803de69e6c1254f44b757c01bf78b87d8ca36592ea54c655e58a82cb689ae9357612f363c858c0078481ff9bf1fd65e285521f731ff0fa50433b43bf975cd8e5b72a7d06ff13c19b2069f4763889b0841c697359676bd6274ee5cb33f978af16b9e0ddc87ec7cc37b59a1530e1c22adab8660bb64f1a0c337f3693c90d72ce1104d2b058d6093265aa9ebc4c8c2b273ecfe4430a357fef1d4a8a280f51dfd88d1e7c7f08834ca69d75e4743996295858e950b3c5c922013d377d1247551430e36d4aa48805069b57ae07b788ae5110919b27c8896894e52bdc7bcd3195b479bc77c9cb37e9cb831cc974f0aa2316f2813bf61bc5924d0d619ff2c33e82351550d4864d98800fe0654ec8da2ea2ff70906238080ad4bedc66f89e9ecea91a9678f9ecc64a964855b9a45fbe768c7f0d57946a17a9be6ee4a48ccbba7278e96f7d5e79af9e6b09359270b638226e2a4b3f5908e552add1b8c2a306a0ca800612e688c974249cc712782a78b1a2c6659cc01690eb76318bcb1a01dbdc274d15333cff38be7d9a067ef337f3b58803d58472539e8494c8019e42ffb7e7293e7b22f92863e909e14bcd6c3fd3de42c4de94de968e5b2f0fb7a4b613273c30e2cc6493aac77e4a111ba06b988586538805306d65ecd9a5472260ebd2a655eec86d9aa4ecc008be97da7a79d875383aabce099738368ab82ce6656cb4c1bea35df317956509f2e7e42cce0f864f7e78cebd62f48407d8b81f5824b14fe5f10f11e17dfdb9f1d75694671da51860c39e5f47eefdefbd6e259d1c2141fa9f778292bd30464214107b173debd30555a20bebf2002bc1d395913496dda74b6acc9e5eead0f793ed58d5eaf5ab01d39a8451e34048f6b0f6f97b544cdc49c8b46ab2b4fed28a25e9fae79e42edba19abf500d3b71bf713840454aac28fb1e928dc80536da7968e9691309f9a36743e068e894bcb1ba58ff730bd768c7a6823249c57a8bbd275247f96316d6ff7c8c7369b5b99f0aa7a7ced2906660f2ee51d2414d9236de5de9e01747a9638a4103bc8a6186ccc5aee70c237dfe7cf1fb12dc3e06561f8541b31d8d67c8888edf30219591032b29f99f202f79a8a40bf44db70898cd2efafb3a64226a7e2d517e9b0b50ef37a580ad5774be2d6bc089018bcb67ac004c84b4061e9df9d03a1c44cde385232a2010f5986f98414fb8b34c528023eaf55f6d949db4c7bbc897375c4d0ffad5e48523f7e879845c5c74d1fa2d3e03f9b650fbc2898c68596d2ceaeca3f978ac6ebdffdbd2fa4b269bdc2b36a16dd0824b0877675210487ac7e17d1d5807c650cfafeccadb5ab54913d909263875522cba6e29aa7ea72ec7df9f3716f3a3ae6a0f4234ec8d028a6acc51b2f279be51a00d6958b497b8e3e7bc4c6200fc34f6a237601e686f589234cf2e6fc3ecb095854ce34dac25ad308366d24402fb22679f4df0f16609c5954c235688c11ab4e5847dc351bbaeeddb43e617254579d4c90a5cd9f610e4b25a5dd0b345138a300b45aaf1aa09bce0acce43054ff0feb4e48a6905758c8785aa0ddf2bede2c48ecd6fda54a0bdd6ee6dcd8583092c10297fc87e5bb5027aa84d0457a8ca555134f4aa16d67d00857fe4e7b5789a21399b646ba2c3009b46810beb40112295b88c48a0655e87f94ffbdac5dace4bf60072591cde259c7e727aac6aa34e3ec981fc90f6cfd508d1bfca180ffc6c64d4ed1727833969d2d586f9f7288746661a35ee96575c2146af5a54636c233a2de289f09647bb78eac50b68b5cef4e3e2b05bc92069152b8abcaa0286845820ed495b666d116c382c78882eae03f20cf9b27bf5f7d401db1b1f363a4700a206ee30ece276885592e01685b3aa708aa9f4481edae341281a4301866570880ad476c0c2ca77557d6e4dc68a5f71bdc3a31b9ccbe0ab5893ce488a23ecc7c39772ce206787391fecb5bcb1209aca91a6e0b6d30a6f19c049e073e19435155a51c83e7a6382848fab4d75ffcecc7f9439490d1863eff32252390c2f61aa21f440bf0df33c221f4dc120c0d71d5d566f86c668915fc80225b7bf5b9b13b2b53a6d3d85b57cced4003615e56194b518ca95400e6685620e727f5ca74e31b497d4df2bece8aaf0695013132bc7bb3c8d4c6c9d48c05d25dfb0b2f73a70431a90699e728bb34fefa7e75f04dc2e1a5b7c9e15c75ec7707a3c8859785a28d14b68a1b3f8aa3ff233566a22cf3ec03a78ae6898a498a245c7eea27bc6509e64afe72625a791b41b243e84645c9aa5a2fdec51fb1e3d7a6575bea520cb64fb83aed59dfc668739532a26db2e933705da50fc01481c977656ed713a506edd67b7b0f9b1411cd5f620add817875c5f076bdba6218785ecbfa296d20814970509871d1c08fbb3c4140d151ae1789f58d3dc04b459be43857cd0d7a8b8732e220a7b5d064a32129abb9fcab5e108446b92b535ec50f73daad6691abaf1761c7d911bd87f20ee219f12603471be3f33e06c7fd518af395ba3f5f4c6d15c24475ec7f0f74f3238c81d42d7bb15202554ff88c04cfe1d8d85b700f943b5a085980cd481203d2717ef5a728cc86bb1c38f0f0f03016743f9a32f1f01f82e66a1f7d1df56bc13a7947e9fcb08c1391620cd5a28cd5e1ac8889d537c934f0456814df310f834975cb65d3475d21048fa44f426fca8cae1563f5b6b3c37affe172c80bb90eeee92eb85756197721b600338eebcb31bad829228c6bf8a7580e652aa7a7187c054cbff09ac6e5a714c48d903a16474af70c6264ac4978cd62b82ae04215d1df7cd0c3e4beba2e5560aca25adf76667ea7975baad3e3a6ae1169bd4415fc7781ac01b50521b4761a9bcac8f3fd709b5573157f55a1df14d1faaf86b691bf6c3b197c1de2622a3f5f3ccb7bec02896867b0033805847045d164f631c853d332445b9c690d0eafecabaa1b35b38d45501e04fd302afa6bbc1506ea28f9bacc6c35d8ef20d5759a20789a3680db0c28e4f0d84fd2468215da2556d7e6bb652f7c9817e0dfec359d6d5e53a9e7d2eda89978a097a8e8a9f3427abb6bf59db160e5e39f1de0a1dd1e15c58ce1c53bd048d02e04412e71d0a8679dcaf2d0014e052a90e4f2eda6ca80cc369c7ab366228e4b8969f8cd82a499cbf70c28f0968980cd38700c515b8c89f33a18d13ce272ed4e03480b208b744be22ed56af1be02784032d6c6b640918e2d386881cc413fea6a342514a20cfe334caddd253df8273026286fce86f68801ccca2218dc02e81a22849791dc7770e45dec7a044fc5865ce181c1603dddce897457dbe3069819d0f98d160f3a6b9ad3a8634274a1b6ae52f4c772485576e3899679dc9cb68133b371a606e94649ca85becabcf2ce4bedc6f271d8c378425586b598ca82764ed4460d7800bc7aa28e7f035b400b4fe5e30d4d098b8de0d09315544d2c50c06159ed3f6b89f55206652418cd722a81252cba76f700e459922a99e50f58642f69533d8a09092076d5dd296179d9dd1c7a0932f2e2bf833d179a990a47f5590db75e9b6fd914ca33a164d36fe8ddaf7c65272b63353dc6f5c151a7169f899bf5ebbaab7344236f12e97ac6a6a303fe2b7704f82a66f24c2e4fee28ac6e6b99726715d216e2cb6bbf2ead87a830c3559400011dcb00837f40e3deb23e4d31fe0dc9eea3dd2d535c72d17b8ae70ab25260c0ca20c79a57dcd84d91b84eb463262274b385389c71cde8824334d5a95750fc19be95a28ce5e15eeda5cf402c85ae5b07f31abba8ad1c8ab1b33a168508fdd08b6ce0ee50c4293f34995bd51e0ff301e42bc8c8ea4be4d3d039ff0c366d9588864396fdae591103c2dae250116890c1a9cc1402d9f4935e7e55e83925fbd47eaad12c62ce3b354718e8e753af261414c96290dbe03dc4750c85aa2fec1a173d599415b068e112739741ff423fded975b37da3c6956de4c20b47a952f16efa5f231af768e6d11513ce848ece5be96d6f088bd145822b70d01b2a6a34ce50ea3e97c425fec081c9923f1f1a3a7bdc4c5b28fbadfb0eece4f99c8c6157db766356182e35d49e79bc8969802629283e02d4a56bae3 -MD = bda8abf3e35a759b9444370ca91c0b845a93de37d4bf5b814bad94c6733fae356a3d90c779a4cc9decd5722a07373b8edbc42159562a5eb764962b9541ce784c - -Len = 39040 -Msg = 9c8b9ac56e6653fed43fe530cee77044ab3ceab021f0cb539d8c0aa0d8b449ffabac4d70241bb072d90fda237c422da8b09c80cf1bf8cff3bd2b302180420978100c81d6ecd934b1be802b42e8a70be95f3e8ccdbc4d2dc390f02771f89f9fb372b31f3def2647822a9bc0d5379e72ce5f2cf7f02b764f88bfe2d5d8695371757aaa10ee558d51aec567812494afca21596ea78191fb9b0df10923a0fbe4e989d0f83a314593bafe38ec577625637ba8f40a86c715657b19cf6ef90fd5dc6eb61ba5874ee7c2eb372b3228151241ed2cd90a7b0ce03b56730118406f20c367c303bade8c64a14a244542de4784d28974af756d96190594e42e0fde06031f3e79323e2634e4b8408c2f235f55a39cb54a1f5446afe94c9c34fe5cbd1da77a5aa04d39498e8e90363691dd95879629da74d1aeed9d7896d82b1b06c3fb345b2300ffb42ee28bb092eb11796624860161bb6c8b4aa8ed6eaf902a15daead14b0160edb5bd7803a0bd735afebc769aaab0e799f4451a7159892dd692e930a6d15c89c247de971de9209612747ec3fbae31c0ffefc6392be1cec8c484d816dc759c44246f79890112221ce2e39454d0954b0d4787b54f448de72a9ff38fe49bbf2957bc377694d8a32acc7154e57142e5659818c1faa2e3e53a1b0de8f5e20a386c8a31a6bd01ca25a26f68ce5b617928e9271ba77d7a31723063b669f4585267cba72bc43718fe1ff1cd6e5add6e9ce53e83f740272156bb32c94481738d9ad4af74549aca209d197fae2cff54ded3a5cc745594dede7949a6165c355bca0b0881bb512f5f63ce9bb4da49c5a6fa48effbc2ddac8bf8c2a2f512a88f9257cd8aa742cd8cdf27ba2ef8186eb4bc0a204b3334368f17b85a508885d096017c07e28bd26eb730b58859b33243d57e568641dc930945686669dbc6377c529081e2999332dcba3c5561a54dee6f2fd425a05a5ea7fdd7684a16c916f053cc28ad8536292cc09de94e6d992e159bcaa7c1961d2138bb4cfdab8aa4e277fd0baf491841b486c26621ead3bdbe6f6eafdd7091138e0eeaac11d3edf3919523170f9dc5439c09891fcb6fbc9966c391e5607bb9c20bf033008b08663f8b126df92ef1b2c3487dbecfcf264fb68cdbab74162a35b401a83e4f53931d0f37b682b8f68d074922aa087f1557b59b9a7d6565e9c42e71d9fcb2a151bc3bebff480b5c4db8ed5d91571036844a15d0f67267bfc093cb7ff9b538fe6dcae85b4a92afee1dbc8c88fd4e7efc064698de0a81588a82dd3568cb9b776f8f074be8815a17754ddf0b51ce55f9d98295664c3c74e1cf19eb93b4b57518fb9fb98d190a69eaf9c56a92416d3529d6e17da6a2f612a9956c050ee9210dc2ab8529d5774e87d1836da54bde40b6b7fa094781699f2259e46372ce9176291e86299f4c89b57b74192dd75cb3b09f4b4ee33a1e289e6d98c4e67cfa331c92d39473621ad7a80f7ac6ed49ed4526ba8cd857a0a6675dbb0f3edd69ba587b108add4cbc66e98d098c8f9544271e08cd23a24ebf40ae43d3655930823887fb6aeb6a9af35848cd32517e0d0e31c5bfa1b7b4aee11586b87f431ec80f9948046a9d4247501a7bd152729a3def34c2b4fef114614c4c76248551938b580823fed6496d391bd10a003196eb0d31589e4eab79cc4d480e07f0ae36c262a4aba1517796f45a9ca87ec196667a661bc4e0f472f6e45c1f83bf82c29bb3353daa4965152dde901bc55d7e4b894e2ef4a110101911627517d2294389276ded692ea4a278b533c5df50329e16a86f4f0516b6096971507f7a24ca9bcb83f870715f387167d7fbe031728289c06be6af964c5b472abeb5648ea02cf34f565ca89d649038ab3b3fc95952d7a61179ba38ee6b863224a29a0b9c6fd6b1de49a17c346631600c8807689f1ab85fd07bf3d0579ac0321ec3065cebb8503f4004d0d3808ca552526759a54aefae1bc7189a61170190afe2c9013fc5a423033d2ef197c7ff7375457f3f68a4fb4043bcf9b6d277c97e11365d949c705bd6679c6f0aaf52e62330ad79c099f366f63d78c64f0bbf1a12c0e327c55b3504f1d127712503696a3ded51fce42080585872c3266ef4371bd524b1ce9e645cc7fcaba4d9497b53b34a13fab1b4e593f8ef4a64c1197527f54ea567fb279f2dcd805cdc527fff5ae8d20a703f37d0746e422e25405b76d6cf06accf5567f5f03e054c9782ce77c4315b397b5076ca6ae3d984cc4b39df8dd2839faf85664cec4211e39d113ecbdab76f0ae38977b9be7f3db52289bd9894264fe8d0322c8e6aff2e89b5a8d7e3e4a295e46f944487b969f52aefa3ee8933f2f2edfa05c2a1b2a0e3a6a9efa2a72a1a562fe919e51aa0ca894afb40d49bb25ef218f4a52f6f0c4bb8a23f8da600f346385417bf605cbec9827c0d0978b45894d9d088bc7bdec02936e5402bebd4894ec5b9c12fbf335a8f672aefa6e1bd6eb92e7c7cefafd81561e4d773707a0d325b85c7b1110a89bb43c0bb67be179f3cf87a8699e8d144541b4be1a2055a913795ffe6ae0c47452a0e16973ef923400a774455a74fec09c681f1699391934ae023bb7f7fc8804fef18ef263c010c8a205e14516ecb0511b0b860d90fbd2e1e742d41f8edeebc8f5288d6cf287bda64c5d672e2b50526435deb2097de3132f73ddd1abbc02604ed9b8650fdcb1296b54307e77046a556871440b70dc894a7bc8159cd2ec0175f51113ce715ee6c4767e018fa63e7529ec51cdfafa1958e965589c9e2bbb46ad5a3fdd022805731f561e531342361b404e5bef190bd0cc906a99d56e1c966c66ecba76a89a6cf0aa88b9a7c1c187c7493d0429ee0c8f7eaffa2042853bf9cd433b15733a5ef1d9f69cd461e3aabff3a506cf00d292a1c9c89270866c0071f3c2b3d5552fdc40b973f0f32421642b4ad45a20f67f24a4385ad21ef38ae08b7a55e58e8f01a8b5f9a3339a70e39476176795be9d3c492364d727602c7a72a2bb7d5e85a3582aee2524c33ebaa2a20cf3df47dc47a2669bc9de10f893b32d5451b97d6f148bf935c6492e5463f7137c6a9bff1e984a0379c1d00d4ccbcd871cb79ac0bf65259a4957b0d3802f597f20e62e1a0a018ba659f74d9ad12701f6686781d6eb07ad647543dc61266f323bb6e116271315efd598d4a7483a582921d3ec1f1e669e9c0e66352c45db9629df9af5e4b4be37ff07c2e49d73ccb18b6fcbbfc305d67c69ee888630fff44698d1399f0a318ffa31c3649170cc2cd5b156cc4d0e3baf43af9b58c18b0e24f317c73f47072bfcdf107f0a85c1bfbf37236d623e511e5566d58b53618aeec21e2f2808885c02895923b1011c10ad18485a1a09ee4c2c5d5864350500c110704a375a21dd8963b9fae40004dede32bcabedf34fe75fe44bbae42eea09be21a3e9c8f417a10fbe0326c9c26248aaef00b4377f80a3fce494e0cdef7f06e280c18f6c7c568d6f8ff98f4d9ec5d3d710a903cf1568ceb39bdd8c99ed3062cebc7dad9a597afd29480176f7eb9c2b03660a1d2d6b54a2048869f0c0beaaa7e3332cc6cb21d17abd74bf80514f4198b04da852cac7c0e87028decfeaba4a60c093536d875c0680ac94883dd22072b75e4608674fe159ec86fba06c6096ac17d74b85f4477e869967360ff203059c017dcdaeacf51e7c28a97f6378eaaa2c27a7da390d93efee3f8dc79b6f5c752a019f730fa672f5a44758327c57b18b672aa2bde11bf54689ed70c7cee856e5a92223a4bfe641fd6eb323a36f9b7da0c99b686522a1d419062dc0c52f0f7add95fdaaf113eeeaac37e69c40c1b6a780eff4596e5231b8bdcf7afe3e104740c37cfeb5d6b012b5689c6c12a8f73bb7a226b00648043e3bcb624f79913712414dcaafa4c419146ae908be373a948d369b2a68ef70cd39a5b85b25c37cf812e4c31b8b2857c346537419477a741e4dacd257999576f1b6bf1b16a88c4fc7abb3c9cc1b80f0233b17b02ab24cf3f8df72ce3a9c68d93637c05a211204884a5f26d868cb7f2bdd651013c9692f18a8c52105401bfa05ef3f51fbf72cfcc4e4afc6658e2553794646d51581e6a180c291400e0482c98ba12ffc872543b5642b100af788b3ae56e272ff4bc0b5449acab6585ef45b47e8e0ac286237e0cf1482127d1504f0f043565bd71d225f78e525c6c26e9c10059c22165e438b9eba248e4995346f67c9dd0673f500134fceee682526b3684b8313da010671acd80732a407dbdc44728b62775de1ab0ff0a7251663edc3e56830ee9cfed993182726bd67efb98310bbc5a22d6c156494fca207950590269ff09f9adf52101e5a0699235e53d6bf50adf8ea9d4128c33ece4024787cb642046f3f9715bd7279fee0ff12dbf68be780c3a5ca4b5f644d69eff20a355bb8ac9f5e9171d4a3594c535098fa752a71a21d975cbfbc297079a2dc380760051fdced2925a9a0863cfc13d02758ce820055a3837e396431d5ce760da2ca6d1b74495a697cacedd8a60f9cea0a9c2c7fb098bf328ad5d80b0cc2500e92c1d1012e788389f6fa213d2d0d7b08b35333761ae1ad0f13039c076debcd59b86c1058d6f0d525352fef162a6c1aa6c20c5827a7b70983a75104d9a1a14a795447cf84d638eba5b7acbbe636a2186eb7362ef6df8f512aa82cc6d4208953e826e35307d4b72395eefefc3fca55e0aaf35f1c563ad1108ea6153699731a862080ad4f643b0219705ba544856dee0ff616e5a4d83232d40a21a8f89c01cb3dacf224092c718039cf7e2e094989d0f2ca82785cff6e1af8479b36614e551206f80bd634c320e8010dc6f7df1eb6a535b2d675a92e36f019a1736c254305955e9c3e4246bac1700ba5e6a12a577ce14529836c1e07356894a25aa8a8fc7bbbc103f9e6b395cbdeb6323da87f96350bada909ca2ffcd1db15e4b18a60ed2ffbbab9df320fc6b87a9d3d3c7c435d879adbbbda2e5381b4ce09c3087fd197aaebc8484eb2cfd01fda2d21739b0a1fdcf55bdc84f72d3826c7dce7dff79f7e64f26619d8f758444a83e2897393585fbdc1ba859ac31182c04f2bad98901f2406a610b90e6e4d95f0fe69cface3a28f928654317bf0a4f419ca629ed2b7e50ad87d54a04f8614378bb00f8e801a8d320399c57ab92e6bfe8bc01e261efd65a572feae5a2ced50bb832f6020bd965ce989929acbc2dabb14aed6bafdcddf25866e908a6116f267a46fe2e83085e5a6188d0720af396436d8fb64c5606fcba92023e9753f9e33ed64ba612428a986fd41864e139f8d7943bdea00ca08854164f51b5ffb504330367eeb3080937908d6e72dfdd0072f888635f3213550aedefd97ed6a894d8665f7758ac7a9eb74d9a78bbc9cd290aff062c3cf4ca3d33d02b76af29fab81d84394cb019cfcab3d77f3a1ea81b7a67f6f5e09a6e971fac04b46f0d375ee87c96782f1f836f55d33725fcc1062ebc32e43fc5a429e3c51c91700cbf873aee9ca30668cd71c207be747306cc6a6eb612d2cb237fac17f52c804994eda1f79027b3ca3fe16b30a81d96509f685d4332b0c78144567f997884d82651c10efe97c2cfacfc83f921ff97a6a611bd6615f6b3cb496f4f2bd316cba1ee896155b6ca17fd94e6dda4fdd5d5aa5ca2f20d4cccc4e60beb92372b96aae38b85f5fe86f3ce476a4614f32cf27ead5a9b2fda507a8b21af01482b0bc2c8a7e48da692d8d88fb51664536f161e3bb488449e568ac8af831df99990da60cef4e1e89b981343014e8188c09e2321b4c9cee464086080d9153e1bacec003963d36ae0fe989efacc1a91fa830abcc290f314c4ac783b68b0def8aeaacae515304b67bbf41ae3c599212f01c53b47ca783b422d9c2f844adde634fcbaaff1bcdc64c0c2a7a7496e106c44e7aeb82e0213a740655cb4a1ec0735db4b05258cf510265e3d3fc638bbd802b6f26509d72f0a42f6b4158ffc16d7d4d3e4b3b31e89749a2774e30018769aeb6f6b13b6ac1c04114c64ef49fb92f4ca060febe20f41afc704aebcdc5265fd30559adf471390aa1e2bbc11690827081f5a14d538c7e36ab6dd35f2e24c51aad852c6f2457652a4707903a4778a9cb8dbb93a9a3fae374c6d9b4fac9a6f0148eb4d3873383c2b990f2082cffce9baae070aca627f2c07fef62445128d233f80722d398ba6cde331040681bb7f8c4992ab350c547faa192759625f4e42d1d1fa73dc0f62199142155615478f88dd110bcd214899c78e36709c3ce48541df805df941021f18f010ed0d331e749f43d9c277b8c658df422681c9991ee213b7145109445ceb2c521460324a4c924d266b5fb0e1cdba502cb101e763538a3fbf5580adcd63eddb1f1717cb411a1019ee8d898184a7e7a0b69f99ff81cca84d610b8fecc4614eb0bfe1bae300d0178c0408e8f08a9a065a47b7f018dbd162c604fd29cf119c35309a3af07f6fb6ce2ccea32508d9ef400346c2af3a59a9e0310ff4f45c9d5dcbe518ea61a976145e84b528e8ce5aeebc251d897d6de39e4b16ecb8989d4eeb3756a2b8b668fd31ee19225dd84cf5dea34733d103ba61f6cbfd0211be9a0d90a20b9e6d97c5ec56a7757b0c9e8993091cf2f065e828bbfa876fb9c70e5ac392348d76d1abc62bcbb11f29fbe28d1ab550adbc0cd5c0d9f2a8f379a12fe5563a146390ac9b76a2d8339f95f34b61742b6600ff8d7289a3265512aa68ca43b0d06b1556c60eda3ac5557e26bb810c87b3877321b1668b02ddb753b4e4867db79c602c2ee7adfcd9d94143431d2d963d94db8f8a405acedc61f63e00dd0c9955e51c2f82d620e3685d1c7656dff7087c1889dba302f55b1bf8395bf41b03a271f5c7a6b95c0e97d099119fc6ca86692e85bae0d2bee039a5eba833f965 -MD = 64fe3513e438e5e0a977586a1780d30795367d6bd622386b4fa8cc9a91a88bfdd5666a5a39ae2a9f7f2ec67943edfddb42e96e5ab81aa0cdca312f9d60f8c9dc - -Len = 39832 -Msg = eb2d8518ba3168e2431f40ac2addf0227b1603f13d82e12b4b6849ec5f61fb3e705eb53a3eec61702bb78d894c4d1b2bc0253a1d40e095acf8ceca4d95b41d83a0cd6e030a0e681708aefc4021e60d1f84f66d95a068092aef9860ab12743a17238196bd471fe49e820d7418d02f2fc6718f85a284a3a66cd7cef550fe28b9c3a28216ae1ca53dce42dbdf5a81b1e7e72dfa688a1417d43c597670828059044dc5d9d71eb22ada6ff020244f5ef29e4c603f00957a4efc601d9ab88ac08e827d338dc0573035254934e52b3c8c7cbdbbb364330ddbd084a1ca41b7b0e74f9b1d95a6b8a0bf4f8523b431dc6c36d7aafdcd73eb386223d6c70874543b1d25b7f3922da94087fe62c61b0c1f268289cfda58730f6034d1589a813a777589963ec9d3297a80afcd25fb0f7edcb1981c9319f96d87cb7c6274e2da9b08a4542c9865ffa213a8604134883890fb56a1185d845a683bc1605c9166be9ff011a56f2e8fbfa05c00c1e4f8354049645dc50397e1236c138c084916efd34f1504a5e66611bb2c3dcffb3dd9ccccb2ff0e2b67a8f9fc82f7739db06d45c1b260c47c19a9b29a4d9e5f35d4401387d1b5b0fccbf8948bb0cfbd471afd3031d0b99b51906039050c67f6983293d416b06c8d5fb8ef7a7b0083b32d0e2e78cbb209cf4cd4f16fa36f80dd4cde3bd524570deb7db5f572727afb9d781468e4365f36a9976cc61c1d81d15c7860a1df57cc81137e4a724518251fc34fb4133d1bdf2a7157e045081a4742ba44412cb95719ae4d89ffcebb1709d86cdb77974b213bcb6fb7b9d8fa43cbbc41d908432dcd467ee1c65d719c142e0ce144e45dd6f17a03ebdd7ee6bb401425375f3d50016159d8165eebc3b0ba9da46bb184cba632a4b92cf1b7d714b82a67e5fd69bafeba5ca33579312dbfae5d89504add4a828dc2d57b1cec12ca53166893dc13e9ec8156c9863eb815909b76a1d839794334aadb3e2085a601a8badf128924c345935d503151d607e4ec27f1d64da3e01c8230f7de63566c0b75958d4b0efc0136baf751c3de69a7039bfad50ff5b3983f35c81e9c8bb4c798f88b29fd6b8c56242bf66167741e1ed865bd2a341a8e2b1215195960e2c93e10fa45b90fe9fd4977ac0388055d1df6cd1218f82c025f21ffe9ccaf12aebd59dc436b4869ce77639706c6cf85df8fb64969b248e1f54c006c7b88299b38b8a0629ba4dbf362212aec01e63dcf439ce7b43334213a3d7d52c391f6cee1c8e19c0bca987c95ef2428df640cdbccd16b107538458c1f211b9e6bf4bda6cda660d43f97f03237bba8e5d6f9dfb062d025b9f6408e9078e84e6dcc6c86b947195ed067cc5406c10fd4e83a8608c47a8af16b9e13b7352ddb3d464ec0f910386a0319e92f6bfe1b33d0b974d42e1ffd45f8acd5786783274211b159babdb286e276362f89de252d6fc5e0eaabfacad14a6107033946834c65f13655207ba71bc7e0af9fa15480e00bdbe506d214cce0e15501901cfd3c858b065eaabbdaf8dd61680da34176191a4e39512f13232d1051fc24e5ea34b6bbfd78b0c05383acb6fa37d7a22fecf7c48208accc34cff54be47df7686a92fad4046eb500b01dcb8dd8749504345d22c7ed6f7c47fec22d78e001028266c00fbae610f3d099515e494448d0301872a309d7974b0739a1dd7f8eafce9ba466fd53eb87f499d7c76bd486db0e90a3d281748aa7a074ad170b4836b0e21cee2bcd895dfb40c43326fd15e654da8b9d25c4ef4dc804f621cac1ba202bc66b0ab7864282935db7721719f4acdbb989cd1575616722fef55f6206bf934903f2c0b33068a478d5dc5f41c9591f9a35f2fc489ab421dc16d92d88e33ed9322018dac7d4e209d2309ac14d142c88b6d52ff2663ecfc31fd40a54e45e20380da5441e9a7998f9c8f4585fe203552f5a21a67718669a9512c1f19c1d824bf9021be056d52772be82ab8002a99cbd5caca2c053061cfddede64f4ccdb54a8633b0953481fe6589f29dc797249e94a57d4dfe54dd767e0e8aa457caec8de1fc0ddf705bd21bf32e3e510ab776bf2e567fb617e2f33502bf99fedf2088a279956136d5e7c83b9e8d3ddce7ed9b7be77d649aef1bfc4ddc65ae5e3bca3c937fc6f03f4c64fecdd62b73a9e5a5fd455e6eae550a8c62f189953a3af44472e173251d513a5fc043289d72308a7d36bbf1cecf8cf090b1f098d2b01daf0bb60ce2144b253634c74c0437ac195cdfb2304ff23a9b17e583ab7882c28eb2ac90864b392c23b6807e48f79e93ccc349fa52d79d921806e73282a739c406a5937cee2ce812c531cf5fba8146dbb3644899942715487c34125926a37c470e0e4ce594f5c5b1923e8dd6212fa4c66596680a549cede04035e362080baece1d4355652b34466b0343289c1d515ce66bf004b744c7abdc0c72f6e7973e65cbbceb39760166eeb1a0d63bfbffa4b3de3f07cb3ac525c39e2971b95464ba25b2556c6592c81c2317e36e448048786df04734080f6645c9c93fb8a722e10d53247f5d6635efb288205381cec3987adfef2cfb67af989622cfa7ce4cedacb692a4a324b7e9d8d8824d69a727206ffa8e0d58f44685ec9563340a19271f184458956968e72913eca601be450a412f95fcdd4385414cc2c20f78cf3fa231c41519792a80507e316d67ef99f1d48067cba0f17544d44ecbba9c107f985ac030c759e27f019043b1d94c69a5240278991a1edc76a97c1667dd7d8d83b9bd34dec99e43df63233405ced8026852309443ffcae0c039a53e17b93862941a561a3eaa5b2fa43b95a9bdac7f3c4c02db6de8eb39b0da6bdc105bbc6111f94091fac0c8150895e1442f49f0c689d8cc6f50086aefcf3db6bd57b4756c2e4bb31d2115c160610cfadb3f1b4a227d970568f5230d519e52b0955eb272de1a03e834579e24a1cb81feb753d2073789ff5454d7b9311390c1c000afc6131b67aa6693f8da506d9a8d5354f7eeb65a317a1fcf524b748a59038b8bc57ff4c889b794a87f5ad33870979f50a5d1e62ef6bffe14ff4a563a698079933a40865a12b428ee65802b76c0293926e81c051a6c0945d2594644b824c100c368a85634751869c245ead7cd0bcac744393d9190e41ead93dabfce681d5db778fb17d30c335cfde09b0b568fd5e4b03513a72a46f1388bb60e2761eed5bf04304c2f8b35d00a4bb5cf622653a11f9a7601f91d91361f66c56e1d9da0c05d8d95e65ffd45cda8e9be7d7fc5acefd3dc837e941a04151bd55e74f2d0228fc1a9f6441987b0aea14e670fc4c2e02499fce9f4187e1400b64dddbd57b7d87683effe0ffce90ad59be05c00d1acb1e1ea72160cf6d8459b8736bf91aca357170cc609846a6fb8e4e145e9fb16c186aa3de29423afa72d48072690ac72211303c4d2a56bf2aa4f5f29f5ad5904cfd2d01cb4e0d2b3691f98aea3ed6838bf90bf549c4e0126174296de6612953c162b15ff7f988492aca0fff635225f70ed549c34698fee6535174e671dc64a2d32f3ce6e8907c3ddd066006630dbfcab28d33cdce0d7ae309241c85c9314e248b4c17bd287db1ae572b32c874d76ca5800a113c688b1bb28ad66a7475caaf82f0a28a0e3f26ef45a122ce6d1d18f3307e322b379d7aa8fbde4da6d8fd0d4f640b17dcfeb3f5feaac2d47c1ce7381d12b6eec8e7f343ea650e7318dcea64f670e29457b70e50a584c22884fd589fb2f430273174f44ca999212f08a5c3366b5180024161d7a1ad7baa052d39fab57a7df3c3af0528feac3f1f68bd5e10eb77adea47e323974fdf388155c0f855e33c5607ac88c216c1bdfe1108802d5aebe22d2a4d8526d5c201634fff8561ef8fc22674c804d446fea27efef6993a279d747846fa6f921962dba41debc49d5223d29642016d63401b2468ee1a50ae026bf4374938e88eec9737a1f201c5d30605354e7a3d09968d820b64e95cecb170bc2c1138ee3942d4c9db05d629cf2c919fb3f524662296b4991f19f8a4b76afbf9e2af1d04abd75b609076d14b2cd07d5713334663fe8b3dca283022daf7022a88dfb8ff61847509c41e9cec4f22e652971fb2ea1ce59cb17ced5070e6f5a185d2ebd5e7ef0c43655d4d212e1dfa9796c69d17177921f196163722e8b0f96d953fcdaedc958d6af794e5aaa09dfc0ad34b560dd662f9b37702ce4e95214b91e1384feae63b4d1247cfade248b86f689090123a2ebfb40ad9a77a7b7c1f3233f22337310dc99561de776e6e30549dd856fc984627789b1d466d0351a793f87c4e694e2d5a28ad8243f5f0f9605acc83acf7b2dac975f61545bc307a1d66e3937f735c84d43edd9bfeaffb29deb345901ae9269e1d9f0d195ffcca9be67e3ca00da829de84f46dd5980f57a6b4455028283abd392adc27521a95995f0bc54acd7e6f7ce47033a457987ccb19eafa34735f533f54f8158de801f0656b932257405c321f3da2e1cc4a865e212a86b93b98469a7496903388029973f66a867ca9212e58d89222e72bd5eb1c1f809269abc0667824a8f91c5ec86c871402ecbd89997d49708bf62e09214d208ec415f4cd12455616313bba5763019586dbcecc3fd0d06cafcf289db05537d1359d1841e9b76d9a13da5ff3bdfbe003159e339113edaf2b5c07c01b679a2e97deb4a23847d666aee34b6cb1d6b7923a89f324f44d18a2ed41dac4927518bcda4fb0bbc12e98b6f84e2b6adbecc09ea3aa81a8dd347b321b24f13ee923f66802513b6bc4e825e7e21c226259453e8ca53ff1c734113be61bcef33508b95dba77acfabb29bba481d214da5b132958e5a712ea89e12c8347560789b2d77f743ba22897b2d8f03d0a32fff85df0e2362f13e915f7cccd79dc34965bbc3dbc6472e98dba59bace1a0c69a52770dbb701f5508d1a18de3c452d1e45105b25ba54e8b5a20ab6b59f600edfce0d9db9efe1bcc6c6a0f5fdc010c27ada519774bf6d236f3030d4b2a93a99fc4252eb73d3fd0edd5b4f9412a30224b11ec5791314d6ad7dffd3b89a36ce3428c89f63f1ab7e72fd16d1ff062b42da2cd91508ea01b80e49d79c6c538c4467cb2a9c0b1bbf8b718ebdcb3ebfa1f96c52d3e84de1cd3bcc398033f7c7f3c5ba4d2ef0edd9564d92f819e857274d4e638ad3e74ee1c28671b7c13f61dcb579b6169d431114b9ec5da3f2cd5425766a453ea3ba15d026c2852a6469b27c1987e28e3e3f7db2318f5af810253ca065749dd50908aa9842168efa2f58f38e6617c61edb8a3b9d045e125d3a9618826395f0b7ce79131f5eab168eebb42cfae553eb2c3acc53bb7a820c3b3ac8efb2b6f5c84bbab65a4fc2a9a450602763a8de61d82224aecbf6dd23d0fbd665c918a6bbacfb9467870eb537c1a75557a2809869156661d7ad357368e703d712af9c7d10252f2634a046807df3fb93ecf0695d942b62b9f10160867ad8bd0479a726811bba4d36c3afde6ca4c5b5e38f564e7309a17cf4a1cd5e5c812b8f2742bc9efc05f3be8dbfbbbebfd4bc3b0be8da1423f1ff1ed9911b193da469e30615f3ec34f558eaf3cecdcec13462f6d39e87a4b574ceaf3269f278730b19206b9856f8721472392f98ecf6bced3e4e055a62e671b99597c5d05b6345dfc3ae1c76ecaafd89c8140bc6201ef626d8ac67c375c29fe9dc3d5b6f5cc2fa48eff5e155bdeb1f7de2e14d00712eb808b976c382c721862b2c0bbbee007ddb6d265d84ded2a11e184909beede80e4abb6816df3e60e96fa80b68aff44c7d3077ef4ecbb832b6438184f526368ca6f4666df283a04904a28804bcfd294aa8418dd330808be510d6e11b0c4d8366defe325174794f895867f29c706e3701e755d8596b6901f4991f5f97b5fa7b7c9faf469b0288f428cf060e5deacac37923b58009674fc0663765247f5af7c6d8cf51cbd30677372f50c605ce93d978bb42aaac6b8cf97043d4f2585b620a0d82582ae882e70fbfa5c2f1ff77d362fbce2e7a84084331ba94570c21b435fcf8802083c62f0d1835920fcd23e1132ff7bacd6d3167f2bd4660a8fcaa103b942edc11a38c62e05a40fe1ea39a93b906128809cddb100366bbafaf0a19fadc9c589e12d463a3c89c89f2d7ba8c152fb0f43fc8e0a98cdcf4c189547d97f780da1dcc0a5c737b2da8b875225c20f0dbf546e7f4f0c462e72f02f77f9f4b918f182670e384e37177447490e7cf7eab279cb0897443541a8adf230018b65e4f711c1a918494dc0e0e39654a0e5ccfce7a6fd92b3021803d2fcbcfad070bf7b98eaea238d5d485d85a4e34ab7f4b3be23b346ad810d470523dbcac0534e63f584e98666cbe8b0759c44d89bb23e4e96ed4b40a95fca34de11c7a6210878e5eb31aa10d3527038919b2fc0b83e06f02faacb7626cdcd53f7233cd9ad6e94d7b535890409bf882349f8d25630a9f33ad0e2b051a6498b36d8eec7dfc604069bebe722ea6a719512f73be8e395849791333b965d985188500bcae512fb5762b507ece43e86072b8a31dab003476c4895bf0bea047d845931f85e212dcdd71db591bd697adcfecfeb825be42fc6bfaabaecea27e0d640524f370ee88aae11bc1001bf0f19efa6d6d95145e1e3a3fd1273454cdc7d3324181a4053b7b42c85a256e08861a62ebde4b6372f25a96fb3344140aa8434048e2f359cc31b34b9a184ecb69ffdba2aa28e149c5e4bfb7a6074b777899bafdb0cec03a4e38f76e5f3c853ec7c3fa063d317770979b1546483584842709f3b272ef307012b9115320ae12efa93a3f35aee355006f7f24eaeaa437649e61b706942b8d23a01ac7a1e5563d0797cc74d80525c220d6f8b34c923eac3e6507cea1206c1d7a81c5e200b41c4eae19e15f9648de08f8536e8c134bea2b3b0565002c1d992a9e3c202a1a97e88c0bb8e1ca1881f86db16e4975e81a90fb8305e1154f949afab75995669495a24047fb347b06b75a3a73aff137730919653dede5d4b18c57d5ec618b6019b632b2896b423a07f3ecb6659fcf9a5b1f6bb19246d806fb0db7 -MD = a3481b7a56b6ac361213e5a69c0e99594c332567a0cd5181992dac5ac6ff236766768e75968685cd44ae68ba7a03c1d1471bdae070deb899cbfc1690d4a69b47 - -Len = 40624 -Msg = 4bff0a260be42b8bc0585e920f78107e83b7c26130e8c4d7979940f4caa37b7bd1ff58514bdb1e3158ed7aa0b708c8242ced8eb1256349649c8a6d743f6ca765cfd5657ec665987e3ce3b88b0bd4096b324c1ef677059bcb51ae3f43048521a30e283996c2a823da33e0203953055ebb5c7e791a6ff541767baebe4a6117719f56a1dd7f88cf46ad048cb993d7c24c7c7328a703555cc3cbe531f2719e4a20bf6ee8582360008a5f78918b81de345d1640f5b19b7161aa3456e0e4a10245b56d20a4b2689163755857949eecb28218f1888a9ec80a2d7d1895639bc0d631b810327df438652291006940fbba99d50575169276746ae7c4df6b611fb76235b10f6d1d257a226266c0753aa9d5dc55ad0bb1b34186d7b808f0a082796fee7a29d499294d16114e7afe452db023c3299719209508e69ac8cfb5fc6fb0cfc228a8c67e4c74f37a0b58239fbf198e957a4b092ce1d37cfb3ea49547d0ccbe2666b44de32ca3fba5c485984c98ebfd9c6f52419d3fa83041420cf8484cd626615cd7d19271e215d99f8ac414612e571e31332b3b5691eab6fe9146c88cd5eebc3398ba51c4372960c4f00ebec2ea8664e7762dcdcf9592a097bae88f38d1fe7f137f71e9cdac20805c3fe014622871b6baa4b11d51bc1048380f4465f7d23ef223155c223348e0828ffda1dceaf0005bd2441ef1850f4cf60719c31271e1965c8ce1e4c39e1352ae84b4b8df01481b9d56dedc1213952ef22c5fcd5d4f05ee07756c7196b8165e4b64eb8fe5503aaac26ffb5348a2579f83d06acb0f39472e39073c6c612658eda3562b8db67fcd95134422eb5ada5b85f21bc023f0d6ad3e3b6adb3bed93e1e5fc83fb1a193509c4d8fedb0c1265abca8834eb3fc8cf420655c5d14802a5ba309f13e39ed71af72059c4ae1e36e84f548a4473855fcb0b6ece40a4fa6704eab4d42d6b81b8d79e8fddbf24898f0e4d0d4372de5f7d73125ff005deb8e659795be2f91c2c841407faae16c4b5e57cafdbfae7b634e96f5ebf013906ec454c700b13a07d050378384a12f2160a00dd7da8f6ca826c6c66f7784a07a5fd4d84d6aead4a1775fdac3b65527ba3f1a7d7bd5b8044cb6fce01e67013954253c6aab32bf91e70e539581835b6d8f2d0a41279dce07d18a4d7e73291a40b65567865106a3f4512bb8023d5a185328c10bd37b8135e9cf1754ec0e3c14492976e2b5ef453c7e785619ab57c9009b0f71abbee83e842cade49fd3602ea3c525e03a63d67ced82a4f3d4fb714ec887bbd5565dee143d32e6889aaef95f3d572457db2a971c3bb39fab967d1a69c4bba652885b0da0c5af1169b1e93a7c4541ad144174a1b1ab93a0e3ba9aa39889a9678fde10c762b1f3a71e821cb3d4504748cc09dc96cbb1856112ddeebd598bd377d3b4398be886a3200d87b3f615e2ca5fd590bce6d8e20b48df6ce3b82b4fbc4fc4971ffb90b83004bd4f3961af713d8ac782b00247c1b7d09fe414349c49d667e9133e76f9db1ceda42527871f802332283c3089b6b4fd80eadffab31b0eb448a7a53f9e9243ec1368b608f6c4941dee6e49c8dda4405ee236bcf1a43602d87a86c97dc2e897003e618e58016d2180280017e38e7f085e6d0a07b3886bcab5660cfc93846b590bc7250a9f6747ccfc7794431b1cc5617e99db4c9ae02adadda3b0cafb73a8fe513639a7397902dad5458147c9f915d031f130f8224bf197a3ac08912ff11feb9313f600d0b71cefbd2a5d828ab3cef90afb9196e41c6ea5b9f78afb9b8d3ec523e91093dfb1f480268e9fafd7cd7f308c2173b54ae1e069831e9e66e8b8940f961defdcc0fa381073faae1c3bb6950b17fb6dbfd13cf5779179d97f71f3ae2f6c2b0a382ee0463557e73f5420ffbf0d40f1d633216e2c3457a1c281d1eeeb9918a8e6526414ad5334ec99e422194bab899d439b9625e344681ec03a82dadaf12e101aa82af7dbee8d736448a983c96a74664c75a9d4b91c255978e60f680abc0ee90db5ce1a608bd40414fe31dfb6ce73e5473df70b1c2021da5330d216e96e5dac35e7d7ecd9afab273271558da24c1a82ca70e8299ae4e029c5976568056c7cc229cad2ff85ce7545234e8f0e0a77dac75cab17c0a3fee2c0667643cbdd4aeed36fdb39c3136cb4f68df248e16db6374b6448e050d5c29c26ac79f7b2df8e46586ea596c7f10f0ca3d8e90d982a9bb25777c6ec6a9ed48ed51e0efbcd8abb05b9ac96548ebd29cee57aaf57a2ef9ccea41dc1866e6db93d4421a1ca7c7d359f7fb03a0d77b6418e3409c1b1822b4dfe99acb568ecc0c52a0c5ddede3015928633001d2c239aeacd080cbca5c65c03c4a0db1eee66469cd7862912b198e2665c4c12ac3b02d999fdd9d9ecaedfe072b361ff7a915b5da4c85a29e9ef07721584537e53a4a5e0b3b34217fe275f870f4d55a034fc4c74816ee0c6d0e11c331480b199c0138d4edc6fa94d5dc9958e2de4e453ea89aa39974dc296443237a407f41efb6de219728895a7c077e03284732ca68107b4050b7ae777fec04cfa535430d429b9aadb0a2cc7a637f915b708639704ce2925dd6880ce6986e1bbd4af7dd9798b2fd852645d782d0a4dc4836873869781ab39a3ef6d552fc504e94747095087c65ce5101f8f19b4cde297384327adc7422a79f8fe853e231fc66fc2887b288731bd7b849a263ed5e953e84616f46f2c9603613d145ccbfc1d82b9f70247e3e073dde63072d769f8e31e422d626e3d2fe3e279f0df78910344e6422532f3f53bf31acfa43806fd9641ae3f5e93f9aa69b2244ea4ae5d2fe10c4db30da913eef23600924038399c569b903a6a4a2b3932976539d90f7efb1dfa4566f0b30c338bc32bc89511e3b8824740cdd0f3776c32fa11d5fe715275028559e87f0f5155911108fd234399c4d1db4c54131e72a5e350b6ad95827c304743f7b2191c87e78ab6048a7b5bc053adde2f77b1298198bc31c02b2ea150bf44acab4e5f49244be108bb0afda8fbe77eb646a33ba338973623cac93a6c74749325e137a2339b052cafa8f93ad9b0f2dcfa4e61032a1c33e99d332249226bf2ab4635e8926a70a5c6114adfb36c64084120833ba81c80f13f1495a0cb918bbc059415eb903c29a065b40d18d7cf998a33bfa18daaf92b41af106edf420868232a860dbb3c474a77642e8c5f4871d60b3d2e15f18c5e6fc7d2172b283d1595da92a299d1e71a47bd49d734fd65f18e1db6025ce1bcaab2d6109f67362d377944d65026ba3103a5c49f54938dc0dd460446c2d2e8cc6cb90f032f8f6382eca6f45e3540eeaab1d93fdd1d247ad983728157e634612c12d6d5223e204aeea3935ba2c884f9a49376817b97546f2082b80771e2ee056c4b90caf641a656c10ab30d3c604f45bf36f22bf359dfb526597af92d5f6c2ffd657b42e7e0ae119a80aa6b93b32c5d7b0ad0b1fceaf3076b862fe8d2a24b5b600efaff7f818405db83de09313798cb388d9695c0b14ab050976b591a61e8123496943335aae49e24a2c268ad4400f9a83dc85a1753435a85eba1cc5cf4deeedb9adb90a2d33c54d65bfc0c608f11732aa9ca71492779507c1167a523019c4bd58a459a3f70f7d4912def56e36f36c23040217dded4695c93972195f4eebca3a2f346a2743a9367c58710eabe7aed61699f61c250b07fb96ceb63f15b329c90d454636bd966bbb8e3f6053a4a28a1db37261ff147624901889cb359ce63d8adda2c3038e7abcd328cf930c82efef08a1962909d1b5031cf47197431b6f8dd2534f911ac2760445f211f2816c564561890d387f85500e67d58f03b0bad7836c17539ac38013acda930c66fa8b60f4ee12e074ac57cfab3861e9f7c6a3a4851fd0b6c445f0d71a5ab4c8d5be06946478e516c7d770bb4458408a5ccbfb61fdb22681f9ea3b4cb78dfc4e2916067bfdc6a9b71847f79c40901b771808ed9352eec3bb20f889faeb3a14a5484ab39b28a207cc4e4515f807a69ab915c59ec4ec9b4c6c21b801681f2ba3d51ca2347f4bd2a75c5319f25901626459394a397b33816c9ce472cc1eb92652e78b65b2acd01f306f0e0bb546968e225f6edee4418f67c954506e11a423f4c9e27fdd54ac1d514b0d676387482ef07bd19bcac79d68160b9b4ff3f983c35dafcedf5043059c309f3f46688fe6315218b9a8570c172657db7ac94aac420328acb49307a642b383d50c9363f6a8077aa01e7ccad83731f0e1f8a4bc51694a1f6a9b824aa6e8cc14947d369ce3161830bc09016e5686f1a9c41dc98f1180ff088e8b96616b814ea98599185b7fb9cc3e14811e8aab8bcf4c2cf1200b13108cacc38cb6931c95a10b4f681fe8f1188c6b4f8ebb6502ce319fc37d917a80a058d3afa7ca29e2aa2d029bf2348a62bbbe7e1638c14881d8806c2ec805227fb9cb44fae3bb6be44a59561140408bfa2bcc401088167b5030257918da624d39e24dc94d496fa14bfc8fce58592931e0ef1c79e685a346985e868e27bc9241d5a3462850dfcf133e4937331945d9c53d8f18f03f3850f181eb0d7503757b467c841e2aaaafc309e6b7b74dfb0d368e3894266fc4a706c3325e21f5550d07a6560e3d9703c134ca6ad078e4a7b82ad6fa85b0bc1ddcab05d43f29d5c58d1da78ac80c37051b089ff31ce2c0c44e9ce3abea1da0f1df28008e178fdefafca493413bf1d256c729d0a9225ea8fbd873ff714cd5e3e8b666f9896dbad89d6286b0a2ed552f9ecd7da5b36a5266f45c99707731404dab6b4c3becc9128b55c8aa47d668a1178633ee653a7c27c056e5f57ee324c6a6e206c10de0b3ffbecb35f89f04343b52b503635a65e1467fca786f73deaacfb5358dafb68db4e93ba7b1580255d78da8d545c3ca5d20156bf71fef958f4dc3434a0afd7f1a5338c89044b2b6f1dbfde18bfff8fe49c1fe4b86e15d2e1f940a18cc8493b0b019542e2ef7ee04ffc8f5c4813be93e524c68e81ec7a184b5070cfc61045991768da6342ad1f434a724dc1a5f007ed2a04abb0b68d7a4df7a2f31b7b1913769953794a42cdaac8e13791aabcc579f015a435e7a0b1b4c899693e21065331582349f8745db1bff5a684e173f71463414a9bdbbfeb09b82c930bc85d125f2db227c4ee8dee09bd3dfd12c3a9ef6d82553b442395eff5e2fe6703084c098d7719295cb1d38e2631266749aed8f02125a06a45940649f6c39297f7945a667e9bf1aa69e901b8a79a237792098dc3dfebc75a08b38d639cd8ada851f324a3a31ad01d750a74e80e76d9a0946a14b51a331e8d15e897d748a0841a9a8b176b7b524915268cc9b6bb559d74c9571a5e309a2a65e5c9c21f9a99da5149e2cf0897f0a103c6e66c8f4e95035699470b19e39f8f8700dd78a6f353050ee880a81569749c7c0eadd9ec28d39fd88cc0639273a19262ff8a37f7f33a8885eefb3f1c703c7fe036598e57ea8fb78d3c39c032914ef78c2a569c9d1adef968c5a8f0883cd6efd30670165cf4380eb700398d94ad06135529c8f300caaecc2a151068e33fd240b6d767fe55e65afa187146481327556a706667f7cd9338753c55c804a7e99d371e21c7a2fd21670e1417c66c38a0bb814078a9f75df4fa8931f0465050dab6278b9e05a09d45eabf2c5c50869fa9b6ec57c9059e3c70637c8d8d01d87873ab965174a883c0c46481d3c76b139292b60028e01148d38601c3b17491098954fc08326e36a9021d530aace18c8fdc0c676136563373cdb663f3405f5a600dff15f190e3269ccbc1449e1a232b77b6671983f28412cb8581f89faca5e48860c287e6ef7c0eeba84097c09e14ce57cc436aecf00205ac95694e0d78d0c5cf4c4fc05cb08135f2022beb26cb2efbac7821ca00b148a29377dcb2e1176864c10b176dc7869b525c73d3bd1503ea19e26472b563b8d0601c976ce59f1af547ea3799debbd432ea9777e86c2feadedf95fbb6cb8a7921d4a48e9a54abf5dfe5c74c47a1be2be0452f78ca96ebe2658333b87e6af974c556c7d7d56eac3ab0c4c4d3b13522e01c1871111acbcd8d16cb48253a22152e239cf2ddbeb2045bf07b8f4857279ea35ecb28bb2959393d7b0e5fcc6a6f8217d4edc23ab6bd38cc17707324b9f795f810e3a2e196edd3860ac2c7089fc1a4c451ef92694dfede1dae2a1cf35a038d20eae87c2ee3f810f93e9f2a844ac711b61308ffd3e4e558c31d2ee93ea7fa08e0354010fd80e676099eea06a9ebce3d5fa0c077152c0f3d5f0ce5646134498da898910dc80e577739a439c7f3f365ac4373bc74a783eaf033c5f41af57f507fdc8d31cf38ecb998fbd7150afd021bd2e4144395057ce7160400b17975f9cd740e7bd8d1aa9c9b5fe2aff22c1f986f45c3fafc44a987b2132215d40c6d340efeb0fcccb1a79e5b3060a757c7f616ce6965a05cf02e24aa7c20ada24045aea3746678a3ebba7297bf0855cc5afb1db7d24baccc43ede45eb58210c2b199ca19798187e4ec4db9df504c23b651a90dca04d868f0ac73473d63c8e7abecc426df72b493064ffbc480a89ea9ac488a775375ae7d309658bdc4eb57aac43e6f4563f452329e632f332a0c924014ac19eb02b93042229df8b893c0c0d2b24305965572fcef03e262863a00a99f95f8c1c9562400603d2ffdd81898a6e7ec76f1aa12731710dd2a302e4f39570096bb2c92bc5a914ff6c8b29cc1b74c62d966ede13989234090c7129bc7fb2d2bad6fc4e7a3c16579d5f4c1673dc153cc1f7f44ec1909c406b535746f32ea8e793082f538ab0cef665130a4d7db3b4f9c154c812b5f895bdbb0e1e0192e7c1d61c69167f64071a1adff18d76f2879824b514b3d1f7b9c6d382a78e019f9143c8dd62787b0f2b42eb945f9c38db420ae6259f7d338db977a846856fef251677e45f591cee93028e900bc6013b3fcb52679a5deee281e2f06792108972295da55329b7cb81f9764532cc8f8228260ab8ce9cb6cd83db1b7836ebb0a433b54e153cc3e54ddc486eb1f86020e8a798e78444b112e4c1a14b583ddbcd87d9d0d10ec8b6496aa688d1180b4ee3fa5f9e4afdf063d9f941dd5cd9a6e9cffb0d83ceda1f894dea88c189c3921e3e82f93f1b6cfb3973d5ae963541969e1ec877d52dbf68c4589429fc7dfab6599b461c8442198c -MD = 08b3276cdb68adb64cfdfb6d54002354108ff18c3f901c1fedc48b5a44c81bbce19e2a231a319191fb5b9652bc43c20d80ef6d438f7227e72ed57c7fbd9c79d1 - -Len = 41416 -Msg = 0a268b623e349fa821ad14e9bdfdf61217aaff016c8a024fba348a6d82b4bef3cc8387346db6f5168575df214bafcad50d0c0c41722332d103ee9e68e97a75aef8e3b8aced80b096f45b90e76ee456b3f0e6f2398fb9aab95bbabd8529f84659963064ef48fc98cf77476e65ac046055c91ff7134ab433aeca802decc995fb9cac51d4280590746a1521c2c09077b1639fa164f42b7d9558592837c651b85a1e442e507dada60e0ed7d1d4239fa511847b538106bb7a98600f9a233b4acb2d8865af1f16c7a52c64c33fecb463f74760641d95718114036ef5be39723b353a8118bc8b1cdbf59713e454529b63d31da062e7ea5d06b3a029117cc194ac5e4ab2643ddab772fe17c43ff64d0127a259ec7d99c6f1d0c0353a6dbd02c825ae24c3511a550e1327741fde0e270e38cdc4ebbe1c725569a18b48116745372f8d925be73b444a46da75cbc88526e91dba26462c5636b259c06afc0364d20851635a222f88ef92937fe371054193bb5ed347a5d030593026849afe4d9af164149845c230ea9d0f837c86b89e2cb6ab847feeaeb09225f65a54e2f5f7f3ea73ff941be0f24798e99d3a26499a2dd6e21625e50cd665e02d7c9a0b8a0756045c9abfa4277e89264769218bcb012b3c879c2ff2654a8fd3fc15bdde6487aa88486d82a73cdb969051709a7ce7db1031c39e04de6212fa468cac25202c7ed9be5e0143eeca11581e31390bc34531c3fbbea50c70aa388c8004c93a9c89f5caeec7dd6b3f7729b5170c4ddd268c0a2ce29f38af72e6c42fcb8df5631924f36560aa896363eb2a97c50d32796e656f33308fe055aabdbcca6d4fb60b5ea480925c308e9222cf1ce56e597245637767c02bb52466e2d82a45af71979734b2a4392981735f43cb08875b1b95abcc6bfabb1d3a8c4ae0de1588d91c1d7063f6684210c4c0349086f564d479211272e8300c4c45a0696d78867a3377d2feb317d3955922fe78cfa9eb66209ba0e21e97129b01ffe92c504e840505ab3da9ecbeee1b4cc2b492c9dbf27489aa9982961fa750838feef95307171096dfe6dad592c0ba30cd6aec46c5137655ce955ca22af8141c1e37393c4b47842f3c56f7373c515b4f6aa8ed0e0f5555cd2e1bd70c5d0bcd12d44d55d4c41d4718ea146ada63a9e7efc2f7fde860c1f739f3b35b9b62ea65aed8b7b3e318a0429910a89986b0d14459fcde849d605d45e144e55016e19dc23853fdbd31efd95dfad69bee03cad05cd541e6eaf6b833270c4a3a1f46812acef86ca8da85f2ce81826574cf185bae15aab99598b8104b86042d392ef3eb9b6f354c3f71a8c889947ae5bba68f087359228b76f4ae0fab480f146be6e4c7f88f391a4aec631a127f2a7ef9da2e7b280f83e00e679f5e5d57762756afe3bc47154aff52b27c906f2bda56b4d3be5cd51f16dfe75a52a56999819084f2b67292e9b123de2bbbd1aa7fd29877f90652807023b18833908bd5f877747d152692e0f3b6ad76bfea86cb62596ac7b4d00633ecf27d795c21b8ab5ba2fec782fbc43a1ba0c6a2d6cf56d8beb9f42e6ce220f57aca6c433bcdd5f3a94853ec9ffdafa749b995ebd834eadb7a385f33890547cf02f5a66d3a5c8ab3ccb29e74d6f4fc2f654743d82ddfe9db7e1fd35f730123c76db9527fbf957ef5ab2805e58ea752da5793f7f23d98fce1b2b67738929e5de8a15f980134415ac02ef1b0c92edf5ab107e5dabf7129cbf4fe4474484fa49d37872ea17c0028c51d3d57c8a72064bcbb5d8514c92f59fd1c4a13f21710da8abe077095788b126812c0a07508cbfe1f0042bacc98e0ef3b617e69182b3e09cd840a6b9c7b3dc7eaaa9f15de7397752b899ccd2ab2edb42ccc828f0e0e42f90e917669dc0f7e0ef5eac2fe2c70ec90895d550657a1bc7079643ecdfd488272f4ee35b080bbb6b12edc12a386873218e18453ad7bedb7eac9329a6a0d5f683c27a22d88ae084d763f87754b1541d1d6da07800abd1c45ecc53c7fb065dd5b1e50b5483b8e7cab26d0f3d4400125318f1dedc26546b8cd3c158cd3e52e4ac2e217306c104aa13889882918c871bcbb0e523e03053e49b9a3602a80528f2c074e231a834e07ff5d661030272c8d8cd51a20032a33cc5570e94e1c6c3fb10d912b1d7b743ef01c80860f10ebb47f1fe87a2f431f3718665ad6886c81f3bb74c840ac5b27282a820bb22ed24ba76cfd5df72806ca594b03df32b622a5b8d6ea145779c38454e0b964b0157d2e4f7fac9a59b35413e18db567c48044c2d42af6dd362bba73093847f5486b197ef2ddb609687736e21605025a558cdcbf90de208ba66b49dc905ab62444d9af22d9b1a311eb1db31f41dc7520ad85f184341bf0866fe177a7316f8e5b6b0645024c21f919ac4cd4b2aa39932194118cf90808ef3759344cbc349f5501849be6069255428b71ada0839945e6c6d2d8b40654cea4042c0dd003e111957d583f9716f57605ce03e81f7a5628f5752e8371935f949756af130c6580eed539af9b621abbaccb4a2aa459802809489772bacb8872835196abef07c8585d9e9c50564efa2d1e1b67ad89577b591068956424cbcdd5c3592ae948c916b287770e0519639e93f57d8d564020552f67dcd5cd6a784ad07b377c2ec75b35d694e8f7948caaee35587924eb71bcf4f3332cc17434dbe8abd374f24514c40f0cab79c0c6562ad35a70989435c43442ec9fe1c02329fa8dadf497f6f5d60c8a9cf4b3cf6320ec334c656145fcdf8f2564d08239a0f1df221f0628ef05b53c90cd981d8d3391f6f8515e5da0086dd587a1f19796b43592904930b0453e5b5b08e9bf4062fd525208b283120b20140e4fec28a83e279d19bd739bb65f686d71d93690a2b78b0a084db7fd0aef0e7c43658d9d3e99c1d07e93e56fc2a74b9687edfd34cdf2a3621eada7f4cdb5984e7cb1cc7ae00f4a77c9f9e6d35c84ae7ca32b85d3497d0e029e12cc8fe1c38732bf1af1e41708893900d6c0ef0d5e5ac7d07b18939cbe94918f636cf7d083a2cf168b43056aec47bf2d14b9ec5c9e182013c5fc9f501ffcb8fa88d054225bb3ce88e90b0561234cb0579a1af2d2aaae2f76f17a1ded06101ee66840cd5db580d61d1d920c841560b587502b28f5ebe49b00e8da36f9dd966c5bed038a0bf8d390de0f1d415c2b4b76c41e33b750c9840cb9906411fe0b574962fe63b4b38c72a4d2a7f7cc70cbd49a16ec7cc768ad542caad260d783f81b5e0183a673ded925b902ce67d6485ec5ca85a24c7fc7fd1ea0da9715af110caa52426515ee1347b677746ab4876d4de4ad1a28ec07f423a81351c5ccc22fafcbce2d8af84eda3eeb883264270666fffaecdc66a4887785bb2b1845cd376549487ac9db97babb268e9144a5087cbbdbce2ed445bb2ad98d1e90360060373b42e7fd1e40395b3f67653db0149f10f54b2a1c08ab7b14a1a19bebb3ddcdea3a02710034a22859ed693931809833eb9bb5d45d82812a6f572bf8e498c35b77e9f1ad2a14e7aadb4e94d118bc1b0d343583959a4ab011628392fe22ec9c5307d0786524c5f90809e851f7986a8476144c1c357b661f7816ae3e754eb74ffdc178fd5f954fbe8a0c4606715994bbb4b367e87ca7e0b5a6b25f97250f02c4a1ce68ea6426bb20770ced1d080441a70f380e4f32c7c05ce55f1f05d50ed4e3875528a53c7f1006193067fc84417a32d1cbc9b91e820cfb7b4575f04ff33594f77f4198af475657b6a13a0dadb746434096218e0981ce79b18be9c059652dbf38743a29852695fd9787f1b64b0fadc3a6be9d36bb6c0dc0cf5a03ddbc0cc54c935b9bc285c6d6df0409116125f1b798496ec61afcead2b71dd94caf40910423505cedca79cc20e5444f247504036dab72cc22a094a32446e3314b9fac9cf32cb7a1b7a927e37cf7a182b25ab0f0d6e468003b314a400b5568898813cad498500f4f81c657b1f1fd61ca4177f15efa2b75339936e7698fccf50a8c7460e2fd75a291d48bd3de87dfcd4e5b368ff6e269df8dc21534c5b993d2dbde2b376d2a84b68d365f621346852d3787fe515f9584ef354038f6fd90934726079e171e2566946b32aacbf837d8c9ac4e3800411b66ed549b05f8b81cb29c108d37c79df80184544dd5d73461bee8d6364a64467df5211159e6019f66d918c3fa5d1191ab3fcd7011464e70cd20d4ddc99d4514c21bd2950442d85a75f10467d577bba34407b9e60566f85381e7d3e88f996b53f2bf4a072380469052e0a823a7ef8e7acd408edfb19d9c8687f92e1f0fa69eac16c9cf903f0a13e903904c20f72c52bf4dd495829e5404b0e7402dabd12da5c63520aa58df47070f92e738864d96cf19cdaa16f853f1f67aa7a317b45d94494b57ae23868b9fe9a706cfb37c3195cc3154aa596858de3b8bd10936613c4552e0845a8143cc7a835c682f072a2c9113aeeabca5fb36819b8d6c5cd0dbf5a6882fc50c0eb628409bd3bfee7ab9c5f26a3997c844d87444dd2581832e4a1021b2e021ac10082959fab713f6555185209a7a64b67c299a8ecbfd176698d5151d9a9ba123d060572e68ae6d2ee019f3846b18586e961331c62bbd36ed55a48d0206074c5796e73925ad60d47e623a9784a4bc7cd9d9c0c056c60de600afe00037bfcc2a31aac457a7907750ce25dcf9890f0dd6dd8f58cfa564933087ecb1f4268d9343995320391dda98e9066f25a2fc72b47163fe02e61bcdfa1b6a553ef3363704a078da2368ed536da80f894019439658525470e78e20c8e8b09132b084cf87c648b487f46b81c39e94cfbb53e6c843a283962b2f4e1c1e06f6e4cb2e305943824337a2bcca3ff2d3b52f4c8792f140390b137801af7797fbf54c67e17d3c34df9ae773a20e91a8b314178603a42857c7f2b19e853899fb6fb5af50f1f5e1228654ae42cfbedeace6b870aff0a4d44ef1405ae7e571eb120c3ff7cc8520aed51e7973566b628dc715aa2010751a5cee61fef59946e2d3a4779a0a24c5850c1450121ef89d8208c1e8f011f1bb8f2affbf346afdd314ba785bced2a0daac64a8c42596708da7b6620694299ae98ba549b2e8a15bb18e09575ee43587ec1d1c5a21bdc5066458ff71189d525228943593e32481fb0bd8260928e31d2322619ef00fdf92024a1e4bb8c5147362a03442a7faeff424077b7b5662d371baa5ff50323895e5ab668002fdb600741278f2344b9e52e21fcdfe6e06b4bc19959d7f9cea41e6a64ae1068c0992693caad95674487753313586e969e0c5a7fcfc316ae9ded5dbbd27e23852a40258b572eae968662efdcaab5ac5d3ad3e9b043689469ed79a7a138a929fba95aed3c6b2d432796c6b5595cc70181435c6a1188dce9e259d38cd8ebb19c22da63de557b1beba0f24d5657adff16d944006c0204728f7e5f858dc17019e29149d589351b8d10793541534622b0449ba96a60005adbedb46b0a2ad97a6495dd543a6e79a0f34a36bc5d3ca33f9d236f0fe4d69ad07b9d1b08cbd4bf4f043e5da60d0e81bfe1016013fb630d79183bb9e42a304019d40628b5652bb1828b44989bc7d9ebccd8de6bc8a666d343b3e612a2852d8e9b67c143fd40806e995c4124c1e561266c3d29d036d8c89343f2baefd79ffed4e9c957234cf8835518199c78a50024bff2908c240b1d08dbee4732c7ffc544c1695b201d30e795037325ef0aa182a51704756deda1ed980b9743e63187bf9fc2beafb4b825b845d82f13916163f762da265e578397c506a0f35b3da31bc960573e399d7aa7c51661c0652c0358d8de67ccbdd18c593dc53a770fb193089d270d8c7b42db43a8772ecb9d2766fc91884e5c16547e62b2644696c3da87fa8554441e073d6065dce8ada52e1c02cbdbe10c78ea58b040bd5443d73a21084e1c8899574ff590aadd0b5ce18a627d42f2891097bc66f87fc925c0bcb52d8a9fed348becc803e27f232fbb0544a32cfe8fe0f93d0f078d7c60593bbbd748855c51d88a3301d0ec4f39f64684ff46a86b0e7934dd54a305c31d5f1359131a8ef004f512ce7fe504b79bdf9df4ecd555f4e8b231fd1fd1e7e05ab7e618fb0c1e17510ab413b4c8c234c34c1fb9cfd7dc38c93caf10e30caa6092e4328ff1a5a92ed099fca722f4ab434adc4a580ab6a1b30a78dabd20cbd3a060747702896fc6a2fe234afd5ce1366f9d00bc64100a2cd036e763566b97ea4c4dd9223534d2ed1054273d8ac526ea162449d442823af43cd918c77125e954a0b592d27c866782f35d1622e3fe2e4cd38b283097d3c19e356b7d7591d248b96a3231f66cf0a62ec88380c97d5a7fc5243c1c3fb88756617658960c4d132e7ee53e270c6b0617570c61f76fcb8c93e984b1a670490f42046c4af2e9e74b131bce43e2931b2923824b72daa462e6f32081864760bdfe1ced739d049d14fc8f2671fe1518e1ec6346e220baf5b80c161087148f9f7bb65f9348d94ba43aaa0b057c970f0c53c24efb7d1618d25f6e85201206ef7b26da828c488a588decd60f6f4ad960fbd54d5f3688ad64c8bd70c8d5ceb7d78233cd1e3eff1a8bb88ff3149a692f9b460ae00c8e71612f5746d549b7f9b1e85327208b31d92485c2b893b33d53f41ea9592cef49e3dbe90cafee903d4f8f824c756771eb6312b72aeb3a53be97d17b644476701f3c6822374d3f34dc1c9b460ca2f43ae2297f905f9c598ea4a1423225516f277507b05b85a349902b0d8f93e234697ebca8c5b1ef4073bc660cc0c35b14797dc1c22f056646803a908eb70c8bbe3995c14d7f8c387c1b759946d7af73e2280babf84ea067ab95aca31cbc005784d718969427aff9a3a332b4cbe1771e5eed298a1699ccf846dc6ed934092fd43ce48fa329386d715bbd8c2f18888aa8ff5b8ff2a99adb96acd6e9b96118eb905ac4638d593c755e08ccda8ec9378aa227d5876c2dbc6cc14217b5ba2085b40a43092cabc0ae280e3f53b65a3a78d7a88cfda85d1f88f116ab114b61feba29a0aa255384dc08260073e4a7f808c6f21a73367b4bfb9af8f55c4623375830ad01d4ab60bf27c4dfe32ae2180ea09c7a769f0278cf4e3cf4ebba48d5a0c983ce9c76fdeca1208eb614d8ee9f049e83d15b4504194d84196578697bcb34cf2dfedee5bf4fd142a05914126c95504ef78727299dd54d39aadb19ce617c79e589ce57c54212c62ab4397f4beea3985e721c68a1425554eb5bb64e7d9c71d68931bd858a38de063524c7a509e74233397df1ae4093f1eaf5b69794db7f43d136c03ce6a905fa07fe9c9423c0e8e9c76c95b75 -MD = e0c80702526891b3335d5a0b3180d47025a76469a296e823fa7d7228b9872897799dbc0a1252c7b7e89043eff1bf3092ffe7b67870327324cf95742fdf0e4122 - -Len = 42208 -Msg = 50973fbb1fd9ac1d3df52e52adb8f12423d179595dd593d8b6868c0ef954a0907324b5024c514a3717f0aa99a75965cc24e3008e5feeece26327b56d4d077c205d9da7174c8ed7c1e05a1a42bfe06315812537f60851a8ff14fa871112a5d675358a7cc3c8983c03c3b9e8139c57d2495f1f84580105b178f2886bc1f13795d824749cce68786245e6977bd5e7c59caee95a507ef112ed952458c74791c4a39152e26f00d33530cf717b3b4f4733a88c445d042e8181469dd2f204699c54e7e8e65c5d21b2d78de88dee904b65a8de2d9bb006315959a3da26df8bf0b7f04925086acef8ac6763da6277e28fe82c26d814dcc04f20a2eb9246a6c3a38c9eb18fe2952a4e6aeb99eb179e99e579c768d4d768984f7f64080e5acf134cc368076f9964d9eb936e1764d4eb1d13c0828c6a0ddcf8fb1da8e1968be3e5b10456330d58604397d0f5c58dc3e7d7e164647ae2dec14719a3755e710069a09cf66f1eb1450fd01ac98a8bad09192d190e761b84719ded72b8d467e9e3e9abd341bbaea388fbe93b2534510dd109888165bf5597effb52ce05cce44459eb701e8e42cc2a4aacf4c38dfcfff6414051e3124711657f60def53165bdcb8cf85647850d6190b3a95b7ba8e87dae8145ee05bc1638344a56f9aee5a7dbc6a497c514cd23531bea7a84281f03b37dbaa0c9af0c35b04d78640bc2c99b247dc851254f0f8c8c1418a7d995995289ad14da48aba9ab63f830137cfa8448813721addfbef251f2c364b8c089bfdfe885b67ad5c03d80377d9ae9b41cbfb7da3ed733592a1f796f6ff736a3cb39b1b64cc908d7b56dbc1623df701bf021ee18d8116bfc5a3d0cea61f8a9e924aed0dd4b740db653e368e7332730194053f7214ef7de3018f5134ae29097fa5cc64543cae010d962478c92f599b017d2fcdadfe8b3135e2aef947938e78a3e3b2a17d2103499aaaa402efeb15e787b6fc59d39ed6a92ec59d29a5eab24091d89824e7067993090f2775815af9d10afdf564a16a747e4446d462ae185709dff0d75f30715375ef3049411be367f0119ea56e8605c6f90cc2ef54eea0cf2cc4c90ac0c7e6335aa3ba63e62e1902cd123586e80fe550d1eee64840d618ad3216cdacfa4bd99bc9dd1a11d516703cb0b34f04519d8da471711d69e702e453a21c7b385c0acfff3bd1bbcdae936d88534b37b84bbd63245029c4de97d3a865056c5e3766a33dd039582c11d2f375781d60ac2d26ee0a73067f9910d3e6b943c47cf314ba93a7a13aa6f768d2d52c7e878a08ad83bde7f30ce8f6ab3bbaab9277c4b66ac86a91f4c8648a5d3ea7072e1a3dd9e3d29b8036cc0c6a083fbe03b397ea34a40076814d6b07614976e779e95de29c5aa41567b0dc406fa2406f36399d43da5b0375fa1d8b0628c80c251942bb1ecc6c78aa02f3a63b7413fe4cd797006833fa31b770e7a0f73d436ede49ccca48e6a3b0c7f661c24413d7b9e54c5e59ddbe0c2bd96a2e65410b662f71afda0407779afcfd96adb8f0db6813a728e2120af4fb524a5a64107a3f8ace9d901ce0c10bbcadc98819e2c8174f8c30e1e4c17665523588d62b6b09363bbca0bee7f91bff7353aa2f48d84063e893e0fbb8d0a68bab562341e6ad848bf38a2970dda55edf797f1e10bd21e05dedcb55fae0c821d461249842288062ad4ca7965a608e20381990a3b0d9282e41a982fe53ff207edc0e21564b536c3a1691a585d0130c0675ee38c9a44f8390dbb65b589b5671f40f2cfcebb219c961548cf4667657b7583561c7fe5f629cae689ed4e335a92547ea27f7d73ace407ee37924c6b1c118bbe30eceb046c50bdd94bd502cb749c2d0f999a2a739f339e94ff0b71516c198a7fb6fdd9deee939b4ccbc8d9394cac325b9fc9dba342b4e46f68e1bd019ebbf830aef4505dc31aeba9cf6cdc652aebeccb7cb49aebdc8c60e739bd3863f9215f38e17c5968350e3557206912385581e2c5f7026e33b7e69b653c46eb60c77046ff173bfbe78a9702be8668849817959cb2d95b606319e81b4f3725ddde4ed336ed17d93ec30bdcd846c811386eb64fa3fbea6976634bba6a0ff30116c6d870b66aabff2ae200064257b00b38a37bd87e06f2d1ba1b9585100b38839f01ab6f4ede9955c82db13cc55904ff8c1dae58b53db93e34743e7193adcd537f760ff986b1aa821f8c65a7ebb48d943ac697f6d1070656eb5490a57d5c7c18be0c4e36e74ba62f37e8666f3bd013734c857edb59cba3c1e7a5d14a557f0b7a65adaf4df81455031927fabb3d165e43c941aa2fd5f35628304d4a87a48043237b40796641757fa7cc336ab37aec35adbae46419cee6e833cf364385f1c6ecb808acf5ab4bd4ebc258f2fe8179bb61592655f4c1cb0c2189cb46036bc4b9cee415db6b429d9a62fdc64efd4ac2ecabee157ca25054cdc8d32c67d462a5c1b04da8b42253c030ac001d2eb139dee5d8159041b6eef191a7b8fa80fc921d465c9bcc1f64073afc9172657960735410b3759d8c77c22bc084e13e78c422b3b09877860477859568d9fba7195323acd403b747452ef589c228f50039743bf0672d89e04ba4f658db4b44eaf5d26f6f988f82935423ae94ff5b9d46aa54045bd3e378e1dd33820cbdb0f536f5247f24c6207f8ba19e16d2e0e4811ab3aca67c5d81ec91a06c503875d0b69301937c53c57e553615e755cdcb8d48833cc348db6bd18ff97d9789646d732d0a01658e85fd71ad9c9645920d291c9b8a2de21301679906205cfb54190c6105a2dde3dc40d6c12fc60d02f618635a21356e512f75b7a2fc0f26e1daddba61e4647d558f0fb83582bb6364a878df0f838ee858c3bfc5b417ccc191433bdf3d7356ca03ce770b974f837eb4d0b50703689d813ff768f797ff611753b6b8e3bb5982aa34c20237ad3d274839985542fd7969224df4f7b7125dd50f6f5bde2fa43ef006329337a440f5aea83d26e2f7c75efab4cbe2f46ceed931902c5b3429bfcca7c743689eba171e208506a2e49027be581d01e9e77df31a7c84d4de423ad6a9afd3b069c0e2fc6186c9dd35e174e6418c47372f5954e9c9bed2ad0b91caaf7d1014c1c02482b566e75b0a07630bcc909d18b5dfd258988d0062000ba84214f1d271bd9253040bd44b23d53ff1bda053937ac21fd8f1c80f491c14060f08cbacfed1ee0ad3cec654ba09860514f22c317654a817f58740f7a1e833234f869c579c1e9a4d2e4aae8d3df56483521236d34f8dadf1b082c9ec10aea38aef23519ab23f0a86ebde8a28dbcfb8de368587e1250f1ad2914b2b969f56ad647746b01c4a1c86db93f424cc9d7fca4145b3e70201c137e421482e9e55c899d9705983866b9d5574adf3422289ede2d209051ddeea8b4b4fe7e299ac3becaf1061c3907f1eaac17ac143add1aa0248b909e1f31ee855a03b6c81366757aa3732d2eca0b06a2b1015584c2d8205a4431fcdb02f6a03077ccf368ecb78b3eb78664b3c7ac157088b6cf9758adda4bc1d2cdedb9a69448a2833cf6f21865795bbd5551be859ed297aa82c288b898e331c07c3c8fcc4b2c4ec90bf8e003a499248a677f1b020357625f079cdf92fcbef89d904e11d23569e0f0e8c52303c93c867023a269bc036d8d36d69ca9c7664daacc92a8dc42c3600dbd4c02278333d216011252271def835ce4783883c0760dbcc00bc33bb8a5cd3960be268a1c84d847afac04dfa2584775ca54f6fa189c7d932a5423dc8e3d0fd89da7b8b74a2cdd8fee69310fd3ae184c6af56e892a5a1be27e14412b4e09868fc6a12f3b66ac40734fc27d144c81746548f1f59d903f771f1dc4b1a4628befa36e22f0832c73bf8646503f995752fa34d6a332b3c4ad0dad8bddebd48644a9d816b5b31af623993d648aff1b9e93085fb6b18c7842335e126ad8663803b4238232d1cd9f4e2c6c0d2ceb42078cd22d3a4b7589379352d6e21d3ca74b856b0b3654ffd65caf0ea679f1f99ed99c90e7591797bf9e229c06913583258b65c9bf68ffa833ef934ae708662e6c2e684fb520ad7076088a6f6ba4263467743f60ce8e95538cc495519c3cfc0240625a7f15456f986303455d849f71d8f3a26cc0a73bb89a37782fc3449c260da201fd9f862bf087fd0acdd6dfe79ad940729859d7e4cbd4ca86bd006e8a66b907a9cc319648b2c7baab8e8bec2123cdd4712c9cdf2e51abcc5cd7a9789c508ce7b640d5b43038c0125221bd17b08f2f363aa42a3b5cec87a3870a1ef1565601d8b3e5ec7e56f5199a9b120b013a4f65dc1b99626b04fee0e671cee1772cf9a0412f35e633317a2cb9e2c9f63702e71a3cb076d5fcbb0b401bc9908168a4bdf0c784cb6391542a8206d5c3ff07cee8a4ee85b7054ef3843da9dae99f4432057bb260e0e51743a8b1f7c09a9611d2b6ae57f7e460f0230c321742546b98798299c82040db13645725134fa85be3d2f38f0fa399898ede05c5fa8c4b96e3df97e34f5f55c6345ac853cfdf97a0dc3401df8c0520ef59990341aa1549a1b4d8c7d0de8a8a36f87b7ee6a40cc305897a7418439914f30ed8876ddc79c90c69e994faec1e689dbe6add263633c50a6a1accb1ccdc00451d00f482d826644791a681b9fea77b6b149d85cadd0118200c996e448e4a5d45e2c6fd2943a785e3ba8400a69c923d3f9977eb1d2ed136d6df7afb391e60a6861e8ee3d99579b8515306b4493c8b288b9bae8fc5a240abaf5133d617e3bb56761ecd5b1c54197610d9b2ff0a54deb7cfb995e63cbdcbd10a0058915984b6e7a67206c559e60349b2ecfd53627c29758c61c270eaf7cf51877b5dbf8657fff497a6cfa52ae1d3adb7db5a43fa28e7ec3232b8d268d6e7a7a810b7b326f3d2f7ba2b8c9d07dde70c80435e6339e19686618aed6d3ee1914ddc6f0b0ea3eeec5b9e7ec1ff6910c9f0bca38e13aa1cb1de8b08d4b3c59e58be94f4ac34858fb8aaa52f045ec74108f4cd7a4df7a350c64f3f0b0348a563aa6472303fc7547ca46f7eaac83dbae5008323463261ee144072ce200d9e46d802e9f4a01a39993c5c047b80820ebc536d265e85bfe4c2edbcc3d8d638173271fec98cd2e00dbc253c243c2ed66434329b48efb76b12ca2397ccef9c2765f0b7fa5dbb3705b645edb129312419b0cb0907855769a86e8c7c6df862f06fecfa209241004b1fb5cefc779deb0ee086d92d5e46160b1c4a525ebbc0e361562eb722330dec9d829eafb7ebfcca2daf58f735fc15bc1a2b48e420edc0d16d9eadd053690ed09cd2d360c68ac06f2efa999da96d6eaa1559ec8a899082cd839ddcae3ab0de6cc784f69a9ed0834a8136eb450e2edb709b2ca7edff20613831c85dd92e86f711ac1d7ab5b759afeca308a085cabcc6900a17fd66d839e691f6c283b9c577e35fc900c23a8682b0a622d46bc86593ca98f0a06f8dcb29ad7b5100f0f895f01db79cd37fa1b2e830377f2eaf95654051fbdd5a70db4e9c1044bf0827fdf67c20a9a60a057392f6a8f1267bee65505ef7292eaaa3d7b8fda99ecf4c8b328d9876b66318f638cd4a8563a740aac0ad2c24b163157afbb0bae3d9d042bd4eb1c19a6e5284c469b830401f7011572fd2445515293f68cfbc705996808f10ab19840621f2e1e27eea5483851f62861b764412d4df6cefbc42aa65454e8637c01b5c3471d294f2e0ea33aa2513b8ba1bff87f860f4428259d9c5b17698cc95363db6cfee603258582e3a3e8feb886599d4ac405a1634c320e85ea8ab0dc6bb65f72012f82a2e951d2cf4ab2615661b1dac0db520a3d82499f4e1c5430c190ce7ee24b82faf0e2bd87cef9a780fb63d2fdc48b1452b81292d95db91ef22182c34793129d55d35aee2847766f6590d5e48ebd9bf382be4336431b898ffce687bc43ee1e2b9b35970f3da48ab318feff0e1613d499a1365f5d66f0535058f6e8e1f85936d2d4fde2464e4cfd1b9f2b29791c2dfeabb707ac2ec845e1080e3bed5bf03d243a091383bbe4a7974e04019b4d2875e1d4cd1b73d2f380f960249bdd52b303ae0c425fc298861d20f54f679cb1c25244bae959fb716f0b6400a40002edc7119df085c8e702bd165fb7864476cd732cf00516a98e31c24cea8f9551a255b6d1b88ddc39392310fa1d3db3826fcac26cae5e59f3723d76ad52b6007606b208a9c98c4e9701230731222edd08d0d03878446dbc1ff0bb1394661cec56762b43039694e3cb882a2a2336330dbee1065bb97ad9461650d41f6bec6a61db39e8f146e94ea4bd135f023921f44a8ce995b6971a4affbedaaf2499ad4768ec991299da88629855edea16d9aa189c5a32a5ce7bea6af000d675a986715c0771dcd1c4273b77c87c5df4ee6c9b480b10025d2dcbb4de20c58b4d379a005048534b4cf995cc353a18aaa5135bba2ba096a2e55af13e5197f34260553d21cc33782eacc08c0146f8121d240c0dd06a62d45a66dd5351695e7343d58bd79e78cfc9cd18a174a44f0a53fe9a61e9a4ac5ab371083f5bb4ce7c2ed6d561d03dfb242e6fb925b57bfb76c2952e9b59009a8e1931f2076f3129f90b43886090c7fe3a905eb7d3b74fef4646290941c3aadb08efe04dbdf98e22def1d1150f7f03281ad5e03934e2e7d682c90352db916b18d01ec740e960946032cac9a5f606bb22cbe73e67ce9f0d5630326c32f22a0bf9ec8d2ef4140c0b8cfd7d735f9e8bb59355acc06a2c5487175a69aad10df6522566235c90c565bb4d48f2176c8e78ba24c10ead6ad36b1ec207550556b45d084546ca9b3d85d36b4c1a11fdf34e33927d16f44f8e4d4a9aff40e0c7e96fc7f40092693123dbbee5317bc26d1d672605455c45ecff205bc3750cf136b4c79cdfff54e767694f8eefa373edae1260b7db249bebcde5d70461cd73719cdc434491ea932e853869ab524a0b7a09f9c150dbc4dccd3a67f7af3baf7d463f8c6c28d2685825d3b7b27dd6cf4a51c6fa1358cfca26d37aad0ac31ac1335968eac8ae6a21aab4990fb16d42da395a2d3fdd377de182e5d7e098a8c6ae9c925e1ee13f20be91c31e67eee16012de7e85eda754adaff7eb972827c5071cc0d96b513f44bde7153aabe8f242f62043a3182ffa1929dc8dcd03ac4184a5b4a817d5ab68230a433f0188b944f9cdab70b22c2b5cedb8114c7363956d4c671d5b32e553e646cc7b1601fd046d6cad5c6b940a09583821f63dc6ff0a348616ffe114e3724113ce36a22052eef3055ddb3e2ffaf273632d3267ac1e341c987a0443a3172ffff4d71dec47cea1602ba7cff16d430e37d4a46ed30e0a3bafeb5bd288c9c8b3aa50aed8fb5fba453b4551e18a352f842bf44e5187d5094675e78111b86d4025c98e1c0ed84e5e010dbd24b8136e047dd72bf2848de7647df5f4b46adc77c5aee518e96789fe02fe5dfae8fd93020b20c4e25aaeed2e6309b77bbb -MD = 8ecdb553cfbe2451feb4b6440056099dd6511faef2ac7ba92b646c061be2857c5bd09710aa56658d4e3f566850b680b23f2e01344902fe0c83e8d3c8714c8fac - -Len = 43000 -Msg = 5e7d99cebeb23c5cf1c7340b5b5e2c2d1af148a597125a485bf7588a25350e5639cc103dfa64f3d3bbd6bc56d3ee9991ef70cf00ad58f43566665e7a4adadbb8b37da298b3e08ae7efe87a3fb18a21e438d4e7ec532d23a32edd8e2d6bd0f86d7496392610af6b603506560e1ebb2ced9c2577afb1184f595b63d0eaae9dcb3d2522bc303a58fc063437380a41082275c46c6692f0a1e02096010cf83bcbbef06e2613fe5963a7a19583087c43f96b4458b19edd38503ec087be2aa03be2374df6ac26d89459d3f8fff2aeac4b166f22fffa06d8b0aed101d5a2122ad668a01d66bbdd0613c1e7d41b8d13e282e897d7615186cb814202ab28b5adde33e76028655c20cfff234dfd915b1d660ff6492a27bd06fdd29437852a00e1037be6df369c96d77d80076c3b0864b57f1bc8eee5f9476eb7cc2dd958818a97e3d5ee850fb371ea56bdf6ac5629b1c477cee7efce7ef5a641979451ecd55bb8c46a86ba7a51f541a3df7875159b4930944fdab2ae5fd197e35a510609cf7c2aef6236e6411e2bc4ab0d132f410635e31fc729a14c44e327e53eed5f7716f4d7ace486712ac41a5cb8705142a2147bc35f5d5d2372d3323f8e6aefc6fd53cba54318ffc3fee8caef1030b917006b25ba9e3afd9fe6b7c6c82706dfa2652e0a7efb27284484354466fc74d31423b33aaf2285917f7196a7a8f83c465a754eb8491d39895d86508faac46428a2d395c3893567a22adb19dec94932ab58f65cddeef175ab74cae4b3a2b0293f2ad7b8c7321d08b708ece7711162109603afff8254bf0415f31a97b93508eba012f8c64e91228f58816ca96b6a8aff8fc36ae0ad65cf0e4f403c11a84d13d1d4c3fe64618e8e250dfd2206d1bb0b271f00eda7690868bae2c5f8fb88d11a0462a6b13c0611a7f15fe4d7a7adec2bafcd2201fbbb25d43055e818fd62a865acd222d8f64702b71cd59e533306e433bf22916e84ada55999301362be3dbc3cefad9e3d3a2c4904cdf8935e53e58d6b81a5b6fceb466e401dfcada0e721f4e7f87a84a6aebccfd72d4e2cc0af51ce1a1bdef773d88e69d1e3401e981f1638adedc13bdcfdff7a776461cf40ee528f89b555bd9af28e7e531484cd130f2570d8f70b2ba7cdfd332e99b9e5a8b8f0b8017893713ae24d9610d75124d85f5584ae3ddebccec7bfe342f4dcd7beb73432c88b1f791b4fd3974e552d8ab1b6af5d78e8c5561b924c70fc9e540b4b9025e32617813f05e2296b56b5a36764bc39e17d1f456154d6acc4a4bfa9eb16eeccb465444229c04356f870203824ba1afdf9070be845423de8c5827e61dee9772f8dcc39e9a113196228e3be76277b78038e5cd3356aad6d075ddd04064b8ad35857a21ffe0ec80d56e1f9b6e4d96f7d5186c5a1b4395d0e1173ff791f9cc2ab4ff8301d09d8a5c6390df8310aa25dd2f1cb8a9aee1819c90fee2e04353859a71a5abe5c936673ed1393295671eb0f1feb43f3e86a70aa4608b8b3cdcf87176ec36393042322f929ed5bd44ea01a4b0b45d848b3b0aad92c04b8d6fd75f1c4a952fdf93c42730123ce4d41401f99da3e0971d022492c6c230bd6debcb0de27ffcd0f362c77c15182be51b75577ce84613ff5d45ebc602bd526fa153106b609193e8193fd4a75b3efc54f80b52f23101ced4e9c8f91ade0e75c0cc18501e1329eac3b58d743f5ec12ec2fe287cffe48161d6370db517a5104b6f42bdf29c76a372024cde1ebaac7923ad926f4e0c9f2f8d61c986d833147d23a9a9b6805d1798ca1263a44c9fc0b18b8359323e9ebd76921615b6baf398af9f2e758481d6526443728e62766547f4b6c2c733c72ccbf12051a03fe5efae222e6c1aca6f9ed3a08ea131ab34818edd460a40c6903d4729a8a2fd64d16dc17f51d12ddaa22cf7e7fc3cd1e10f9b21b5a9c86a8d0256bb7abb8881d816247f0199fc0347e1f75b752c93f3a650188d18626bb8d995ff957ea980e1fc1c7a3373774b4f9477845b0280551b6dae604d900082a03ed3ae61b0131a72636cf58b2f6a5d77430b6a930aa7decd999328cfa6f4aba54f43d9ac8988b3c780701ce2aff3810ed5e6008fe803bf6ecc76c8afb7bf255c6d5f07e2956afb65e5de56d66f93846abfcfec9e3514759378f1d65a5cd0ae2a3b9dbf805e4a4fb2060049e308daa63f7301856a7c5a7fb0217cc85c00d994831c7877123e972f50637e5c74e63984e19223716128565c69587015214e3a871b9287b524c0e228a580b1152892209ef59fce271eb3989a03708453468f53e4482033f0148fbbba45d030ea5a972062efee3a2cffc89197332c21e9385ee63a9d6815ce8df57452a5e48662a76fd96f35201fe980b1b1f26ccdc17d734741f88fbca596dd9cbc904a301a047b868c1269b7e7e34e19aa2a14e7eb5683b2f7bc93a05befafdfe4d1a74574566365e8faf2282aa0c46acabcc00d282ae62c97e55db5a14f61499dc541972dceeb98509762f340b8602f9418f29fd051273e7311226f2e1c9e6437b9ad979ed47098536640abc280bdc2a6cd2122ac6fa34349ae963f5b0da3ba534d4fe9501d8ee071f5ffa4389049de7347d047f4ecf6f55c3c2d98b0693db660eeaceed9f0b30b3ca5048f1b7d70dd7a278452424faeaf5b486d1da6d5b8e2f12c492aa4f47963041203ded39eef4a3bdab1d42d0e16eba741b930d6c9a1ba8464a91f399f5e9278cb51f6097af1af38efed601dbeec24c0a6b674a8cb94b78b46515f1067bf13fb1f936715a84476d1b5ab788cc88b054815d95b9531ee64864fb64cb1d427621bad3cc4909d442bc6ea507002b16fe7aded864844b32b4bf5cf5c7aa66b24074ae2a270f2c06d4868fc90f90810275652bc61ed0fc5d7c86a63c86b66a3316e196e890ec4c84c57484ac176154b3ddbe700e09c8ed0808444ab7e916b02ec21079f44f08f0b5dd2d5738669b2f91fe2cb3986d91a6991ea24e4d38f3c1090aa85f36ac8aa001e35a1053466597049f58fe4c9456af7a8748bce8ba74232eb7525196ef9ae4d0a1a2b5e7fde716748ae95812c53d91110bdd9b6fb8c2600391b555fc5f62458addae50dbd44a33498588cad2476ed3c8710af4c97a0400f25f7a765045074a976025e81713b677eb59dd5a746312fd068376cee048638962eb48b97ae9b47c60f2b08683025268c3ce8f12e06151973207c9319b6a0785bbfbc82862938f614b5af73107e9479037ab47fafe89522ab6c6ad26e227177b6458a1caf18bc083c162a1f18b0fbc77b0baac19b7223e3df988c8b39dc9bcf4c7ca7ca70d18706a2bd057cef7bddaa397c16777f1763c596314c2e3b4961d774b1801c89f84c79cef6dc0d1333bc99e52891f1c95cb75055c3444bb10d7638c580cd7349015eca37701850127d1b0f04bda7d118c6a11c94caef64597d3b5bb566ca7f3c614080729544d67bcc7b71fe87b295dbc9b372d9b4b7f8832d43c8dad01180e2bc9424e6f2dc109d86408b59336ca080fa60fbab1d3888cca201f89c693d38ca67bc302b05688f164f1c83ab3d1081b6cd2c2f7f70eb85a4500873807ea7f751e73b2aa53954b2749b62234af158d9dba68786dd3c4b8f98dbc9c20d9cdc5d27dfa38cfc2b3b2b16dfb3c2df1cafe96e3b058a2aebc2f71889c85cba5054daaaa567df864786499ba083eace0b8060ecef28b20f1bfc6cb20e86bc1d15bbe058dcfa8ada1ab0ae71724513ae4a64b0e6376396f0295250e3ce77588c794c1eb0eafe277e1164ba16b999d5e655e759d8a8388154b06f342c3e2ccaaed7bfd65153c52dc8c7fd0d1a0ad49a0cba62dc42b63a39c32dad86f9f2197afadd71b7a8ac021660aaf417e9da97d887f471b8a2e5cb08c21d87e9eb7ecff1d6e6fc2335581769dc46e45b14ad5639fe709e6f77bb7d86b7fc98ad7f38b2c7e970c9b965ec87a08208384718f78206c6cb33613fbbc42c3b475a7203b45455992764dae8edc542f87b8a7c654dbdf77760fb5e794b2171b28a47b8377647337c6758180cb072d9a62d356b88147c6496ee3097a2fe37efc431eae078f2edd9f9bd1df16fe8f2dd2179d3850fe02fd69baf8dad4b595a0ed6daae9b46becac1979510e7710bd7b5e10def695b354ad5fc416d1fe0c11a4760e12d493f4e5072dc8bfb7abe7d940c6b35e37908987feb4f30495ff1e9fb31f8e1c16ab10631764f0e181bb6d2ba3936ae4a44766e217efae8ccfdfd186f57155915705a8ac0345597f15ae88facd4c9c3ae5c434ac21985f7427a70f1091f3cb3841a7a509f4596c631a8c2290e679b026a10fd92e43386d85445ebf83b02e58db7a9bedc212268f54395d223315a21071802e3fb0a6564087cf0cc92879a86540aae96a1f84362b191a2a702c825023e32c2b4c79717a40426fb9144715eb58307a9702687311a97b64faf4c3560a51434a0dead3cd2cd57ecd6e8a28ab7f9b7391af9fe4063d6f42c0d6963fb959025b85dd0004e2f567029133121264ea94d1993828dc6644e736d5c53eead2c49ef182a27555d75c5e97620e944f68b6ad12373b8598baae781e4ccfd40acad38dceec64330ed5ea2205e809f925de6a4dfd15bf9e602b0189c4ccfc40e8c80e38ba692c217703251b14cc2b27ddee8fdb5cdbcc5b7ce1c784eefe556accf5fe057ca10127d88a97b18bb67c07bec2acc1f5316aa4330387d06589e13afd792a5dde3eeb2d7891c84d344d0581127f496690bda261cfbacad5f117a999c57b1aa9a6e5f21ba0413f55d53acd7e1f50ef32f72a7b7a962d17fb594db36d6a23574f9d401fd998c284333725dce42f5b248df11efed7d185f6aa67d509a0359a68b98bf77950a83b1f4d22b43b9d88c873df45413260c7e9ef4ae157b3186e08d54d38b2086618d4990d5e92f18f72c06190bc3d1ffec2828b43907ab7bf5d9527756b18d5042fb778dab26506a4376b78081eb7cd97087751fd3ce71f7b4a67e598eed1e7133609471be7d683c21ef03fb0335a4514e2f1cae1ad46f3367ca9971d8786477975f58b3ac58c6fd36e773eeec2cb8e5e98187c55aa3e39d73c81c66effdffb2034a0ce9e1430d2be702afe2b95b5b05b7213f1c2fd77fb46d217f9f21d830deebb3597af9c69b56b6c2f06d072beb4f5b80bb1916c9a406b8694b811ab1b84cd51da6fd525e01fc2a9aede43228ea113b1274228c04f112e9f208b336f4e69a440b7dd78763c18ab71d00fee6dce7f9da6902ef1c03d757767e2fbc033c5c35acef669005826a80e0abc20381a26567adf6dfd52360d742e24038f20bd279ad944bc9bd59346d8d3bd9b9988f33d2f94a4e735b5e866163b1faad0bcd51df708ea34fc5fef43afe2d2950348bebc11d23d266081a0f16486a00044fa454fe1cf0783130734c6352391d1e5df444a051cf151051e245665f7ef2d7543d4646016e4d468332976737f4278c7b54d90125a0a91adf43c3c21775358eb0049057cc5ca4d844c97fc70dc2cb13132a1364074ce0ddf6bb24ba1ec16aa2c976dd93ec5ff16eebb46ff352498a5acbe07e3975386ee23eb4d2cec407e4ac2720889adfccb582ee7fe28c83dce7cbfc1483f20dd795b01dcd4870a59d46035f7e2bcd153783bcd37871f3311165df3a32cf3e2fbf17d02a6100304215f160b90c21bb3b24de65215a88b7e86b870cfcc7ba7e596347badb1c949e17e6992cea4714d5a02918245e82b14af86fbdfdba4fd0232948b7e8b65c601a95a38fc059ab8fbce298d362f17d663d0f829cf9f947aadd0df3eae222bd1d2659c157d39dc5dcd1811892b970c7220e8c3886aa402b950c75d9532fd69b0641c2c483df1d1286a3fa0cc88052ec6f300d161d87157839220f8d833a1882c60d6f21963b5e1e37b4bc0a07601e59c821f09fb418efca01be2964ed898f10d6e9bd5d0170d7454a745584b1d1499ba784d53a0cc8457d8941521404a690b1b3574c0b48382f24597345016a4c5b2e97b929796a1dad2f3a5c280f6b09c3d1e5e68980ecc9bc47cf3209049349d98f133f7bd26e918d4b8f5f09bb833b9f1dd908046261de150c16212ff2cf423b49a4a83ae98ccc7c4f02da75acefb498e2174c3b2449cdbffde8c1087070ddf6cac653f5034716e0c63f4efa57f2fd47cb2b239c4b0711139991a250f21a65929ee2f318c42019513d9f3d16415f8e02258f1ea65b1c50b67bcb45680c3e81a54294d634b09a3c4411ad2547fd67df7eadbd9df7b91c052ef0d01adc035fba953256add73d28084feed3881de0be7a03b02131fef96896d3b55aa31b8bf068e90aa2ca5ede5bf5cb21ccd5e6afb5d647d9647b2aa0949e4b15b56ea50a9315271803bc5a28a8ad5c56d3af609f008c919601ca193322740bbe9aee1713aa67c606e404579090675a0a9274ea4300f5975253bf391584c07c0c55a1d01bb8a94c43ee32b59a95dc7a9983b7024049b9cfab04cb08ec4dfc428b801a6e974082205b6cb812cb3b75049011f636fb4d41910c8f6e071bf09fc5a8a4b8512ad45af8b9fa14fd96f3b9ae8ad7b2f6f88e1582034e18c228ff239c003e2c163ae6cc2bdc00c9b4825122cef65f6dd0ac8ebe190bdb6bc887cc102c1eb6b62c3bea3e405e3b56f611d638ec4ef38732abb193dca2b1d768dd09fe0c50991711c27129ccace43d20c9e5749d113eafcb6aa94f33446bdc418d1b35a3426f9f5552fe372754a5fcd31f216e47d9bb47d96dd838b38d53fad12c926f8770a4ef6561f3bee6c1fb166b85fc7e72f4d3d00b29c0f8d3da24a3a61fe1f42f47d367d073f45991815e0a7892e93da51f32e8cf22f6082ab738771eeb9c7c11447599050d626fae1f495988ca7a1464a532e2a3edd9df2e9119e5ca14145fc3f2f613a192e099a30837740aa111ab38236e6e17ef0ef636144360362e0c27bdefff3804a8d14ff6b8b2fa7c9b625a76163fdb99aae7d5f7ad3f76c1adc66c7577dba6ccb3c6fb3fcd464d5d2dcebac4fa41cba7a60706d9c888ba1af7e586714725b058483433e4926bfd3aecc9349b4bfebed064def162f2997aa0b0ec1e37ba581535da9b826bc49e8a843ce4607f87d115927bf23e09b7fc68d14d4c8c4f6e0d25f3ff8f5f5bb04865c7b292c6c83a63706c3fc33554952bd54b4179691ece9f63010b62332b02141f83d276c02bd0204fdc34d48fd9f6a2707d22152d2c58996ceba2c69660266c382700e2f510f58214510fa8a5f068eaaac56382510e8885a4223a2f018199cb105fe279ce0df7235e6904b2003e788ee4d27a537d1bfaee993355fdfd05d8bb686cebadc379616e9e92d883371a81e9cf12fb0afa0b1c3ecc9d6ad5f1736fa780fc80f16de9d0de555cef8ea32b3195ca155a0b602268e0aedf0d298730cb29fa7d46d735e5a1fd0325be46ecd6e40d56481bf738186d8ec066a17b16f477cd457da1e1b3d37135389bb94e6ca435db0429b530fa43a69391c2cc4d3904f1ebf26c26835069bb31561d8507bb2993694438ca5b1f3a8099a381e2125608c60071c7494e93eeec5bfc29960550bd7952a703afd82f73980b7602876d066670c5441d9e9616f97 -MD = 49e91bdb49492471e1474a3934cb235d877451e4eb447fafe3a01f6948e06fe71575eeece2e41d9634110be5369199458c4f2f68ca380079845138ca5c4913e8 - -Len = 43792 -Msg = 0e7c0e3ac2f13b490fde401b38c3a8dd47dcd240b700477c71c94b95faf5b2dcea0cf5baa04385a934a15f83ad60e1ff7496dc780915eaf1f58f025700fe4905a3422b8ec00cabb691fcf7c1df0640f1741ac84ad2043d98259145b377f35a022366d83e8c1454780e36305e357d6cba2db0bf3b7a96e778e9163d32c79d8cd950c023526a2329f8949931e1198c0e6289a0e9d5699391992a68115b58c4889414983553c400d23d096b23d2f2fdcef26f316d9f08c3e204cecdeab69230f63b563536c90174f64f57f52dba27965371c6ac7421bded83c0bf8ef0ccdea87cd4fee04d3a89473d37647f781f222046e7785925e4f1db1bd5e3f24a24a2f5c569f3e1a230c44151fc1a512c8c4a624e5c6c80a96f0d53534c2443214747df77011f805e321a29d7a65fb27086072614d98a69274a771ed32c69c79cbb362e3ba56905a9c9f3c97a3e1dec6c97c1324065ba5cc8fe9904427d99c8e40ad6aab85cb9b7aa7bb7e7e0cb3b454946e04f7909e4a0b412dacc48489e8c20bb8e1b972ef7df8ad3ce4cb155a1062f1bcc4567ccf07e120ea1408e945f5c7957c8487f230bc57056a0c096e53776459feedcb3b6c63e0a7b5826bc69c47f1765ebfa1944deb1858e950b3681e5dfb459acdc05cf4f28c6e066477acfb53f216d5ff90d9856ebf10216f43b349387a3d26f0c042071836bc5336b6ecf1ae2c0f88b0d02275cbadb3a89444a0329b73b90a03559b0159924b227594370dbb11b8dd9fea0fad9686bbf58c30ef88fb7a41da51fac8724b01730aadb9fbbe1f45bb4b0939018b33bcb18e9392c1aadcf0501e892a4ae84116cc624b72bb612f3a7f578957a89d47c20cda66e4f716b4786c2cf56e92c1f044cfdfdb68e6b57f528d99acd055622729567f62a1d06b26651eac4322409dbd0df5c9da070e2994405e77c00da8687674f6d40343ee068768b012ef0fd4ea2bf4c6b6c3d7b22be2667a887f9a121eaa17967ee555b0777bd5f8d75561b025b17bcb2d3555533afe476a2237f0130326939dd67551c84c584f318002d272dee2156ba38afa61d55c5595fb959a2ba4907b75813fc285e3c126f29393cc8d74225430a041417e897133967af502dc716c31d605a11289dc3b1fc49874da709416baa2aa04c4f9d5c143d406f2c4a6081e5907ba45ec34a41a7c2fe52266bcbd23ab4a3721ff7448e128e745fb5a08b72b43a3359a9a26ca03de8d30390bd23dddc88fce455b7e31453538be9b2d852d179430fe1bb6c0bc7bb964d0053451b4b9750bd5db53684d620b50b74ed99bd867dd397a45cca2f9e69f6f6b237aaba02b4316f45081d2ebcc0dc7e672c8cd37a0510540b5364e10d8e2d5581049508eb7a5599031613eaae7def6b2c38599c935c25cd7c6ae128fc7466f2d681ad0eee33e4c301a7c1bf949d175b2ad9a720bac9388a6067ea0d5361c75617779bd3f4250575a683cfb556697bd5c9d61e68d893721420132697fa9e7808aeaf065fe39ae1385a71e4d4dc29446171f9677bd303faf222363eced973a29001ee97bba5d8a093853ba8250e2599878a082a619561f9acd098d9bad9276d777afff6ee2027690f8fa7c5afd5a4a3d07ccc0e2304f596cb9100a064e00400447fa9ca003ed16432e17ee07a17f089c3b00dbcc80a06fad6cc383ad3d750847f7ab3bbfae51dbb87e187a48fbe4f74e98c93dc588edd4c55eb06510fa75420b1d2e673e3ff529393f88cb6f5b00a8cc8792515dc77c3b5d155338a213658fd61ef0a97c373b917e08e53c1b4d768f8eae08d0f5aaffe5dd172878f106ea4421739e7d2a3299a6cf50ca66bd519b3e1d7279173dd1dd66bddaac908e4367f185b1844c98a093dbd5ad84b5c5f60316e15b8fae96aa995077d65c39ca67533a7b6f4ea2780fbe930985c0a3d5a932cc82ef98f180b3b815b3a0b3bf45d150616af35a2928de7e7ed36ffadb6cf9aea16aa541aa9c7bbe48c9b04fab811fd418ecf4332b2bab5801dbc28fa6ec55db4810f306143a71104c529b8c88fca152b369c8662310e4df9e8b241bb0e44c3d131e7f42e8fb1262a2c6a906c2191450e37a067fcb492979d75a1b1b63d54b68b4db90a4735efe09de9e8f2b0176d7530b8634cc6e64c7cb3ed11e0b4a4fe1e28fe0ed974dc6928a7252b475a19678ddbe26c9e8a6c46e2827788367ceb49e1f16b6dc97f2c26e78e08b9f833ce867555dd43c60ef188b3533c901bd8b93ee82ebd5e422ecf2e039bb91c6b03dfd216e6d0702a1b1b18d56e64b0f78eb6e31b271b69ac4b6a89661661dc0a92f35356d8e37b34789200321b167132678b426223ae176f9ca840f647277f3ca7b3121e7140ed4befff48b0a27a59342be063a66c9deff3ea2e599d75348f680cc71657fb0c4ed6460af6394ab9f265a25c4ccd48117aa1fca7df41eaaf94f887d667e7bc72243f465a14b45dfbc42e93a807c100323edf9cb9d7ccecc11453e1880eb8fd98f9edb798a908216755f5c86c9c68db27c516900c4b25c49299e1e28712b005a65448616bbe1fdf263023074f11ac231997afa1494234ba49aa0a51787bb91ec5beb80b7c5ae0de5fda2119f970741e2f3a109718c5e1150fd036f70652ba8e1dbea57f738533683bdc56c613c1a7169238a33a20db141f0b91cd9dd79e9a9ed5dc7783f74700c3e2bf29d5450a2f516919cf520a8cb51e667837099367439615a096e0b0a92f387b0b04103655f318dd63fba67de0ac5b470adc04e3b59cbe07936b5e47b2a90f2f464e3d8fa9dbb216a091ff22e0e11ed7d125556f918d5dd03c5cc4646b549025fa6e25f70fcf693b57f825a1933daf3d5478c6de02febd9b23d2dcaeda190386aece90178db783751198e0a102a655a21b3e1dd811d7248ed1366cce09e1af79ebd546972e7b49eb55d9f8ca3305592eafe02307c500dbd1cdee3d6b0092dd2738eb0e1ef70403c6ab2334c63043030897c4a01026622a8d9f64172ec615d5b71d78b154f238f92d9bde5d3a01469b595b545c9e3ce358ead0fec1bf6253df5222e4f8e226007249ae723bd1acf8694884f71e57106caf0fe72605c5df334320d098a8709b45b8416b4796313b40b5fe9914afe3a9e675256c43a9e9429c4848aefa8ca55aed113e5bc53602b505c6a32215d8eb0f37f353e8bc76d2957837f345736b2a6ae1c6680455e3ed2331e55ea7615f174b4971c2e2fb3428e0ae58481b6c0ca6d30a1ee6f05d64998cab5a57b1600c0e64023799e267ab952926f370ba4b38c29e4f63e1a74782b0f85b6db7c77aa979624c8c017068a2bf7ac85092aa79b726d297db80af7905d7702966a67217fcff4e0eba221566e34eda7cb7d7715f517977ccd0ec925db5b8fafd8c4b399fcf492f30072358c934eb522a6f679964ce6496d5884cd85959fba1bf28cfa47ae8fe0d99bc2dc2fa5e3ee8bac169aaeff58e359a4cc907d7bb486a5782593b100fc7f0332067da5f29eea614f5052a6a8fa05f03638ba93ea1455fade21287ca0e4ce1e57dfa28615ca494205365a33c644119f817b945f6d49d87aa90220f0eac34e797190d3468c107b9c722ae9ccd3c1a6d61ae7c64671cf6ea34d3b05b45b0280b313ec987dd1ec01defac0b9e85dfd2622671fb8df940f99134f5e4f4d8e3cf549c3256a8263c76c88137a230cc1512002fa85f48140a4d83933ce7612d0dd2cabe3ddb1fade3d2c3660c9bda0aa58250649bcf1d20409ac837f1e12aaef6d87580a98075d9da7b1584731f24a758c959ae91749585ab8a690a5bf9d8c2658a5ecabc6f3111eb1ac6c5b356970bf69024f3d47537ab13c36df3c458f2d023908c85c0cddbbfdc57df101667ba9e477eb71daafb8cfa40eddcd972260042f9910797fbc5fb4a76d9664ce27a15c9123c1c125c2e1bdbf9b1bfa6ae8a8b7fac35d8eab67c1a1a8149666360b931f221715bbc31356cb407b71d41c0ac1aef07250665381dbf97c54ee43cd84a95833ac67a01733907ee33a6fe92f0b535fad10999efcbce73290a91eabf9255c9e226e383cb686175f243266a8186cd6408d1889a72b5b7bd3817ba7fd4d5035679ad6f7d015ad63d27ffe16af6c91b3081d04b10d53f02252cb570ac63eb7bc3ae9613718b8fbfe7f4317c05d902c820cd96fa0300b1d4336dac5b78541ae698ebab7666515045fbc39fa244127afbbd54eb3c7bda53587063c424eb8fab6c5e97b241643ae49002fb12f92d8976dd8d7f97b9814d6cb36376c4730dfde6349c19741b743095c784035229cb2741961ab4611a1c414610950f76efe7841267dadbb9ad9c1ba913074527db23d2224dec5c1307559c27958c94a041800d782ca144489ee6e1699b152859b73f73602b89e073273347586ad26f0b11e08161ac77bceb975a6b1d883514af6426f344577ba64a23be2a21b8ef067f0610c6130fe7ab6840ffa10d01f071f38be03816f94a185fa2fe2dc9a769c3c4c817c6d77c76798840dd6b802fcca8ebd3762c1e3b7c9d7c4dfc399a5eca0da100fd67f41bae8f1340fcb2c039531f60e5efb6a3439b9c67ccbf34da06994bdf56cb93b4151653d1e7655c13480d3f196853bdef392f7fe9c64f08d2c65fe7467188315d92362e8ade1f53c2848170e005aa2b4846beadcae4b59bcac7a3489efa3c2938b9978905cc327d1414371b7b64fde7f792d28ed2cdf8d70a30edd6af98ef638db3c0ca0b5aa7c45321b7a6b32c53d94344f28ac92920a2d92ac6f941f4aac6a4a8395b6430850fc5d28a7b5005b5e97684a70976a236e681ddb4191bb5743cc4bf8ba2d8f5d445b45037001a992affd77c7773a2de408a4870419e068456ad36203d092f519c5066c2469fd98dba03ad51ed3015854976770cf5f0ca0957ff43f4d7f630eee61724513fbf548c6ddd412e8ea89740569255d857772feb7f1b3163e2d3a471b9823525abc7543c4c75db39e444f0b771c62cfdef9cfdd3d6e94894e50753851e79e3651221a1455eb3c29a766ae791a1fa42a245c5fb686551d2b068fa05d01ce4743afa340350ac80407acc834676ef16e1f0e25cf253333c15def31482fabbab31cbed6842053cc29b016ff8d31061024f0f4dc7aa3b48905a470fbd91ac03b762417225250b18631c56e62f570402a6d4260e70ebc9ad37e912435dfc8efdee4fc312d3750b48490ba2b99299fdd7eaba5daebd7da569170a68185c8947b0393f7a53dafaacd25eb00c718863a1eab747ddb4182776841a05711522018025817c8dc0a37c97c08852bd95787b9842f3c5cea8e8b2e407272154c2172be062ac4c25de94c3731ab13bdcadccaa8be7887a581394e799f925a83aa7a4d11071a3f86a371696e9e6c0b19241ebb822e25cafa17b868b3a62fee04a4d2fb9b75a4fc7835292bfa12e9dfd07da3d6d043a59abd46b2569724b9912ad3b22ac7e23970399b76e0442f9306762ff2a91daf766b81768d948e6bbde858af9e3720dd662f2d3ef142e75506136cc391aeb4b226a1c92fc0aef41bab5830a10dcd30b7a9ade5a81ea05e13a18b46c0f754400c14f206fae202729500652550773972018260d55f55a502fbf3d276b09a364a0dffc0cd30683b84686b93b92661285f5b7eec8edd4cad906e7b8d8f0af0c13d4815928e88d9c6a4263b686eab62067325fda564aa4a4660fbb710f248a191944b14ebbd6cad105c2efe57b847d05037f18d20193f04fc0f14250142e21303d9776c30fc5468b5071332f628946282182ebbe0ff13d33af55843e2e37fcbb4876d9a06adc873314f4367a822096f38be6df86c98b15b8fae38a21a667a4200388e0cd1543172f19f601b02472f7cd0851fd12778aff466b425be3c4e5a0c93376953258237ee9271d9ab790a6f01e5f6c4c4a61158445c81bff6ad0da781ca3e700b87aa442c706110b790ee50a4f59ded417ce552a1dda157fa0126db5831a842845c5eded337d7b5cdce657cbc6be4f9d5f08717c3669d9e26bd2c7de655ff515c27f270794560393ca5f23bdec5669b00c5592fff93d0e30b5570f7b293be1cf18f17916525750ba2ac2726829e8d11404fee03dcc1d5d7265ea6e153976f05f2d630ca4d5490bd8e3576b53e63e32d1314a82bd18d26eaf63d30c33fcd8cbcceb1d073884f3dbf6df663706891e32f07983a1074625e8ef975a105dda291a1e3966935bc91f691b0537fd097c517978c6ef64a4bcdb743ae9c7a31b3b30845dfe88d8930b935d4f3d12e6e5259fb071ffd8f41be4bfb9994161ecf687b6b29224c9fd6bb3185e9a6f3e1a21eecf7fe30c8478f4259860138771147526834cc592722b68277614058304c0453eab8dd7d53c19b8e62d10b1a33f4221815ff9fc30ca8914d075289762ac00d97cf983544147ffee9147727a7d139f80fe126141e61b40f616dd4259f27e0366128208633aef511e8dae2d76fd35531c06632d9b9cab7796627509511cc1f174670ec50ba87a38d0422aeaad0cec857d021b05133ac4577d1a062689c9bff289e36562547131db8d1883512890825d29580290afa8ac0832a8584009dfbe2c2fee4e86467e5c63dc778009ee723d04aa72e07779ceabb13d723300d74807caedf092d9eab743f746c7ebbb079b66a288b67d6179950b7a27e25f0efdeae2f24b51f90547042dc052708a0e7cf2445e498ea1f7b6e3128c775ea31183af96cdd2794baf654e64e588da26ab545e2161776113e138a20a0fb550c9b26f7d6d8209d150814d7b2e8f706d863997c943d399969cc607b8392a6a1f9798cb3ead3979bfd0230675d4e6939274614d1af3db3897044f2c0fe8061d33d66b9fd99f1ca8ac923d98229d1178afb6cb7f3979a1dbcb1323ae8d5ecb56f44dd5f1368b5020015f760c6cd339a72e151e350d1d4e0a9a90eb951ce5a09dcac67ccb3db9006924ff76693abc85a97559037580270a4e6c454ee9a3c3ad7b1d070834d67052097f3ae6b773a21e05ee4a214979defc2da9f8f5b309411b7755da2235e9fa6e8a78d86eff01cb2b43ffaf21b8e18c4d31b97287fb38a7121ada0572d45e9d7d7479a0b548cb80d5ec1252aaca9e7724e2057badc7173db9ea14509f1b1da2a74de95b649ab90844878ef9658899e7aac7f3db0f218e4a39716c8552120e51139f30d122fdb3ad9f9cdb6df9f9ba260768ec5954108518ba37486a32c01af1eaf1b6ca987aa1b50fb361760f26ea7b624d59be249de4ed63c311c9e82d27cc53cce20e6e186b69bb5587db4f150f2de3ffa0d229ce93125c9d30681b611e2877b71e644be0fa11cc09b76660d01285b4052b5d08ad7bcfce4d0b0f7465e84e7e3ad296d7d834f5695859ddeb5fdccbfae760276c42826be15b0c889a406b868fdd646abb0a025cbbc9d30997c85447e02ea9f7fb949130bc509a9a37fa9117d2293da99f7e4d90e9e48eb20d1561408b616d975dab916488b41c0cf09c414b70a5c51b2a3bfbd71c31f2a0f54eed00260813cd3b8f68506c0dfca76f2c636891da64870549f57a7c39689af679dfcdd7ab05623d49003c91e5a1335cb5deb75c4e83b6d8b024c03083566ab8a01ff0c6d3aa1e0adf3f701ec373785e3c9c80fa8b88714a786ff3619725d6e4ca94b11d076ac84b5c0f333c30da3d1ecb840b9319dd7e03aabd5936fe3ea72200285701d0ad2aa7c557cf13b33e4c44697e9f4e7ee8a5ac4ef83cd83f07a41949c22c -MD = b1b2dab94b3db9eeb1d579e65f06f07004b98f214026e4d53b36917808cce2f338b6d195287cbf2430f3867bc1fd5c1a38a4cb3ec741521da718e2ca33c9359f - -Len = 44584 -Msg = e0f3c6150121c7b86b2efd3cae3b9a5ca975a25ba3e09fec97549750cec53bbeb3c76107e450b47a85c0aa05d920b79e13a7c1e16983d3fb6bd615c693fefc351d19bef318c80947be34f43b014f36fd665d958516b2a27833bda44d6845d2aec4f3c521c8112ce7be91c2244d517d414b9d088fd2f6742d96112b2b752325ef505c5ed81ab187222edffb0ae6adf63269710146c4d5b1e03ddb91a9e31f5dc26a5d7162363280c0b6278933f3eb079769e069f415d9c15acf23c00fdac2e2edbafce605451c8188fd7053e89d941a3af2f226dfec8a0d63f5ef9fa581921c38e743a50a6ff5f143acc241700c2f96e1adb0214f726ffbc3574916b20119746d9a3a96b9db4738b96a253b156744e3554121428ecf10f4419c380d8082df50527ae8a259b299beb2e0a2291dd75b695e574e72e32af561a66cc56c552b6b19b13055af341b74eaf6b640f3d183fd8fc3973d9795aba7a8ba71f61b7a244538506389a6903f5f264c9308827994b1bf4ea8f89aed7cad334550d5033796f513f7bc8d70b646e2da7e1f00bc5d310061c533876433c28f680fb46a0ad3a9031470e268f3ee57856c5203328ac48371dbf1dff0dcafa8d6b1df43bc199884f8a2827f22197f9ad14591e7a6d5f8b18c969a553de9a85309757fa5d319cc505c24f438c4c9b3384dcd037263833fe4d9fa883d767568eeb01bb583b7f0b834b5048fb754ebd059826c6f4d717de244e170823ea167359f530d4a857188a4598da91ba4dd661f24f68b9e20d8ac28f82b5e5200c8a7588e7bb2065207c7d8e66b7b60a66424e8c233905992a0f75b293f2dbe2cf21c19e5af72b09384979b04d8e22566f30c735bc1e5664bd245c1fea6468f6a28b0bfc978b512efeddf37db5b46348c9106071626f08df47680a4a0e70f8c61714a94645de3f20f4c87f2927c0f53bf47faed1bec1b9835928f4a368af27fbad5d2dedee664199aa8761552c3a54ba71cd06e939acd4db5305afce918562e1c5c31e65f9ba14f390a96e742b971e3ed1870d0a6b96d761d57c901e118a363300f4df40e05005b9479ceb28be5d9e53943c35b7bd065d91410c4a3451240e49ef50f4f13abea0752fd06bc54cf461732a6af593b671c3f436233283d8e97790d165f419715c8191c9e264fc600214381481d100d07fa6f5155fed9f3150fec257b2610c2cc005a996517b109ffd02fce31f6c91a366733e7f10dfe8c2e10048f2b4a05bb57fc927259bf2a4454bda4c06a20cc897fcb51ad3f48df33620288f32eb568ab3e22894e8307049f884e69fffa856183678e924a4698c30e384e41f88d4d81b90adc06d6e9d7854322ed4834e90cd0307818be670ee3f445385af7474ffc970e4291d3b29518f758aa010707409c60b739d29daba013b801ea8f71887ca9f4d16ea8b6898fb0a005a9f26f1f061f5b413222f6bf030e586ad75579621d3cde2b178b7803dd89c973a6274825437c07f5ec71934a3fbe1ba78615d57d399c9e44c4a1e1c9898ab9ca290a5ac0ff9badfcee283af55d094be17f354e82d8b37c43fd52b8839b9aba31ba026c994364947dc0adb46864d92e3f4b1fac190268bf504a06c7d919a312d0e277485716bf06a1eb6ac94a5c150eea7139b7e9c0a3b1953425d4710d8c0ad028d1b4a381944990f6c540444ea5310979ed379b194c98374217a8f67e3dea59157979258bcba6716928e3fd4171e0c5eca2f3d6164cbd61fd450b0e759dfa9230d55f843c4c656ccdfa781e3d60624651bfb443be896839eb15c461f99682a4014e2d699cffceaba9a3c84e4a5c01b330ae428a19ece1e796f09d98120fc9b7104dad7bb4cc2953858b9b36714d033412d665522f5d6f94863f5c5bc8f118f1e638a5638b9cbd8fe91ab97db919b1f37d9fe54309c55b684168ca512422b77d0a78dec82955d3855eb8e9cc2ba95315fc718906ae0aee8a51d5af232d8bee810476205397e1b35d6bcdf4cbcde531c514b41a4326166d233eecd379ec1405265d9932acdc26a54099c1a321a9b592294fd061a17acf235a8e17fdf967a643939c48de7a000ef1566ffcbc77c702c069342e23c9b11f5758cbbdf74ea827f1f149edea650c80dec675e607742db201ae4b342b63d3ed50447c45871eb7815767ecef1f170763b5b933e74ec1e5af9e201d4b4016e92057472a1976129a9abd1e0eb64535f9a1bf5632685705f7dfdfe631db298af9a2b4895ca08bd15b5c6b3d36aa246aeb2141c6f9cfebe9692c0b290f4daf680e5aaf319a42900402ada8eded33835be3cb86301086d215457d6c1040079a582d3090686d674b529577be56bab92cb3ec87d5bd00f3d43093b948c44b73b201600c9e555b7786641ea1f39f25a4e5180b3d75945080b9e259cae86cb8f8be0caed62221eeda07e1a41390f1b65c77334ad5afdf889448d5a197943110fd8820207664f3aef9977230b5dc73f649aaabb037cbc331964aae7208933bdaecd6e6bcd5acf4223afdbfc96f214e6cd34528454c116ad2f08818d5052fb19e2c71068cd9424bd206036f7729a5a9a163125412fac8fcf309c7b9d076aebbe5252127986b6d2246c66f2a42cbb2ad1b5fd7d41e2a3aa01c49d2396e435983353fadf1e674779e07e00a9a333d8e8164315d5372c5ad7fd6187041b455782e19e2df0e81daa6e99cbe9c655167814f043f6c7714b16ac1a8de6879ac9253e716767d236e87432b8dc6ed33a531d53c81f3cce80ed8b98d1b0383885de331d4b66350dbb661958b6362c4ad3584d07265b4444f6820e10bb6ef8917cf305c1d801120db6252e632a5f9ea7a0b46bc1937e99d5428732c65010b42cd0b621aebfce9b5ce7a417c48dbf228432f61df5880fc9f9e58b8e0c084bd7553185fb466b351d65a0415a1f48db744b0a7bb8258c75412d6ffd74647c86eec50fe1172b52cb24d270ab89a5e44af06687d3eec419459bea326b7a61f54876d6dc65f9b01ef75e0de9311b2af87423814b9d1673a70736baed4424873b06ec1527730797185005827a808300fdfd8a05b615b396be10ae09f115f7369658db0a6196e522e75bd7ca950855ba5d3d908e67fc6abfd7186e61de5f67129fa4b0111b5006f5f4712160d93707d9aebad365d1af90518a84f45d059f088dcf70f7e3d51ce182d8469ecfa79b1dc15afbdf2663bdc8fe30dcdc561743301aae543edcff8c094c0b329c8190b31c03fa86f06ace957918728692d783fa824ba4a4e1772afbe2d3f5cba701250d673405d2c38d52c52522c818947bcc0373835b198c4cc80b029d20884ac8c50893c3f565d528a0cb51bf8a197d9d601c987429f89bb85727ed1a33def4630143362641c681a72926834160ff9ac6d0a44570a9e89c6468d106dd7866304a5a3ba2ed936b75936c553e5ac5319882ae192f1b53500abb7da4e45996848b0930608e8c32cb0d67dae5f76e3f65d35b590999d6aed56337f6021a00f6d0610a44303d84d87bd5bf053722ee27f2f7ab51f43a2514cf32646286fc8611c05ed7e6495459cce45ae37be7556d276f620d394764a93dc3f4cb6382203b8fdad0ec970a579db89b098f9f75136da6319f0b6f91cdb5825a36d759a209a3c99673d2e701aba304165e1de04ec1623cf02af06551c9ec7ae85502b5653d514779940546bde51c37cce5190ef303ed44218286db15edb09ff4ebe8172a1fb6920ade0e569d886bdc552b0b4c004f51642c3229114cada45a0677f1ef8f456621a09e58673f0a046a159c5f57d4f8511596b641a8648e2a41a365bacef332c28ef1717e18f0ee9859a4b59f830fb34ec0e78b7b110c03c4ef3251ad06046c6e2263d3e9ec81aa7a337913468e0ef4bd0e952e3feb81a316ab69b833452146cb948e5216523fc23c800911eeb961311e47362b0a8883e0721e8005f80cd8765d5dc7689dcaa9da51a7eb4df29594fd051330ee6588814069a13bb765cda86fb5d6a583eae64e374c438623ecc318bce3eb2bf4cb5bf8578febe36906e7ffa74797bf2088159b7daecb704057926af55d476deab683577a37472d87561c6c9195396aeaffe92021dbb8100fada41a3ab3a09d1cb18f2d3d125b609ecdbb7dc321043f3facc16aa865820c0e697894f1899f302746eff8248381231bf84591b07db0a2ab293ed995deb1caa9058079ce619bad76e11636b50d60eb8b406b46edfda74b99ffd20b5ea9efb28c2c4c1705be1e8ba80ab2675332733079406d0be0435080989b0b6e8749747a14283c1b5c11a041274e1518a37520884262fb6f1bc154e823854b71845fe877dd93e0f515eeb9747105dea91a680169834266df150a2cf8c74922c2fa3fc44234f9db12e7b7d28c11dc7fc71c6d8e3ab8496fda40803129004121c14d7b905fd6c47b1325ff83fe762c68c14e083f926e0256ff42b61a0f4b17b8faf295c5272f8e5164754836523a903a4613ba8e06f0e7bcac803e3ff2243758de8e00db3eaba1ee954a04620dcb8264b4021701ef0d6411607d6b2b98082aa1fa746f6b1cd7b9b31408c6afb7b58d68a99d8033d10021f5b9bedf5567835bf4cd4a13cd3840303f6f560177b6651bb6854a988c53658bca26b90d55c71265f1d573a0aa2751aff415a64742a066b7eed5adc273ccca2c1f25f067a55d31b3098185986a50988371957e0aa8fc36ec72191b90a2c39a6d5545f990bc805dddac70046d864a8145286d41be03206213d0de288561ce52da1cf538fb03e713406b2f5482967bb88f990b95e3f9c354d89b83590369538fecd6b2331933e7ee75c60e0a8a137a8aad340eef1ef54baba532a731ad01e9ae30030b8c7d95094c083d9aaaf675bd943899d5c1c17e2fb30426c826e4c3f73a2e227f899adfc1b85242539a2a45bb41ac2afe927e0cf6277fe854cd4d3802b041c57ccee35cb7bffe64d77cc7fc0a3f9277f7e5971a25556307db8948d6a2ad156c91c1099441df672584b7421100da65f1404fbf3e33e97805dadf5a184d8d13783d14502f067326f4e9ce1b1d65aea137761558d1b8400952c154037569ecb688fd1d69855c27a8637545c5897f18debae7faf68d18f5a18f2d7be7969e28991f5060b82fd97975f1c5a2d3edd3c578ec34451ab8dc76cb0b7dbb48d440dd159bb572be9704c52a104969c8a2fa210a5bd9a827fd794000684096d9b70886c68ebab80f4344b71f4f8f0f165168b7fd7a5688c0c385edcc1604930cc73ba22678cec50ccd3fabc02ff5073f6195f6dcd8296b579378dc98a54834447d70abafea701e498d5c3fd70219e6b66c087a22f5c0b46ef5d898f09679ff23523e2fed443d28481c00dfae966c221dc9369e6a43cb1869530baf6e5a18582bee0a9b492684777af1e3f7c13d7a4dd811b6e01d4296fbf943a89c6c70a1d3c0995c6a5df1e48074976c34b967b2de77cdffeba682b2d3713035cc656ab50673fcaa399646ebd7a7751002f1b5b4386f66782da084ad3383b119cbf3b8b044d8708a758c95f8e1963365ef04a7dcf04173c602a5b8f4a0833eeb27a1db222340ad53aa9b5faa32c32ad4555caebbaa706e5026f0a0178ef242204bca5299365f0bcc455d046e4fb0f3e1d2844adeab8eceace74bca846373633fc507bf73d286042ad25c34b3acd20724e2f5fc9497ef0d42e001a8d9c2690ab01fd46240ac582f15ede36118bec8dd04033c449be433b2a89daccb763065b127a8aaeb9e1837f503d4bd0a1c19e7fe15cfb1a34304df47447cb792e811dbeeed1c05dbda9ab7fe7b3333a02c22c1e2b08510a9389e6443bcf9bc9fbe0b4e2c96d67f8384c85a93f295d1c3c78de9138adfb3c6db05453058b1266256612ef2ab6472a33b15926df05921c58c9fb0190b4c257ca8ddf485de2f7f5b4fd810c9a142798b4c06f1e4fb09ae55d9fcd95b9836e04b308d14cc83c1421b18c4761a0efd0edc6610eb818933d1d53e19a763d84c7ea2e097086d0012f8f23fbad17c4af0bcf6e7c801cc115436d4277abcba41e94b24678061ffc9a11ea1232fb568ebc9ee7b6f90b73d29d737c334848bd74b89f03003dd93ed46d82d887187945877f51dca5c0f8e5d49596f32d3eb87437bcae866640310ce1e34a0188976f0d365eee5643ba8f994e6474793940451774918ae27f6a58b1aa65300f209624d523c23bff99cd17b8c872d5b75e3735ceb49ffbc053a19554b859fda754fee1c6d714027caee2da69ca278154a409d1c37e4ec9c8ebce2f1d912879732eb5ee08d9ba09788be21ed5ddeb3ff9139f611b5a06bba14eda6f35bf3b6c1bb5a493c2b11e199936b32c238826d94eb4e12d01d02f9af484ab9dc4caf99e47f1b3181de8a6f987b93f4c7c544015fa8eb77c9b69312e68962b01f138c9d79eebcbc44005bc73eb1c6cc508c8a1bca6a90a9811ac743fa68b40e2e59315dec8aad2e05390c74d6d6524e1ee6cb196f90ec0c78c226195556bd48ac862447c6e36b2b480122f50b49e4ee657c8d96a9cc4c35234515ef71e3fce3fc12ebe7938985188ed125b4469ced21d6a657f0236d3f98130c3d42fa90e164af87eea9dcdd799a4c218b5f133fe98ce50ca0d2470444c9ba9002c039de094f396da32afd6fb704f28aca41ebb358741307fe999f21ea3eac68ecc3ca3bd3081c3cafd79fa0dc0d347579095a97b89bd330d7d286369e5b4b0f71ea262aed23ea6d7b4c1e214707646a0e11ca4d8858c81fb2f9b6c2efc428ec388fc83ba62706888bd50351868814d10007c545564f441d169b9b474cfdc89787414adeac860306681ee9c22903c862d537d62f90c3e9c189249e44346c9c9a049b08945ec5627f86862bf38d0ee178243e676cd66b1b9571114a3a3495375c26f99bed3b69975c6db76456510e02894398137d75a97c11650e29a9dc0c0b5674e97f59c0f73415840f0d7ae385be2ed9b144e21d136dbddb67a70389359b3164e71d6a9dd2ab33700991c1d30a56c14d26862b3b1d83035aba6ce7dab669457d7f108010a07f5ea8439bdb9e006ef9147451c93e4c3e7a5972c5c72ee2f83b251dd34ac7c522cf93398618a30c893ed617224cb503f29b6e3d5c12145fba6b024fe01b31d5383ed747db19909327faf87b92163df961eeef569a692981425d8b81c181dd352204cb1b254ed518bdc5f23e0bc61780eedd836b0b2ccd0c029b375ff20f288962ba151fdf38ef21cd1859cb09ccf02f1bff90e728ed7d348dac7c46ec23a2368cd71bc273685d22d87aa5af169b46785bbdbe676e1bb8bf45f9f0b32a6fe8c102d4659f8c4d9db052655c56bcd198e130a0524855480df0be1c0b3137346abd675a792374692f3eed50f45e56e055fe2d3ff32678f2fb6d787b425d9d2186801ca1dceae63b9042ebc5f4229f480c23c3f5276e439d0fa9e7a02c84c6a7eabdb562f7623c455f50e04cd24fd08939f6776855ac3fa6992a9e1320334e47f5caa4165f05f116eaed6d5e1532a5244deac9f2044ce7c046640e5cc4058e72363b7b347a52af10d17ce56243778799d6753e2ab9ecb64a85eaaae59e6811c73a84ad35efd4b0c38183eb01d38ae26a622a468afcf835d5e623163615d772a7613abc931618c0bfa996d0a55bf960066f8e759b43fbe0d2d5a1b2c6a0c02bb358d21be4837b3965882a48d5232f6b0e5cf63dd4056441c1d2eb132fe5dea74b6fcf5da2ce889545cbb2b619efb97dd2b91611add7cdc3336c63b9da4b7f6ff034a704464ddd6ee0d2c4aadc18041304124293b121950fa810a0195e582f004245dd725787d620b73be4999412bbb502e7203666795661805e34a4147279e2a1f1f75a4f12ff45497576f4fa863cfe7fa6137c4 -MD = b4e49d08be92b07880b5f9496ef0974a09f44d57ae3dd5ba0dde1b498f09eb219bbf3019dfb28e5a4d79d12c299462cefa246cf4a13fbdc81f719972065d3ac1 - -Len = 45376 -Msg = 3778e7b9d4fd81acf9d9515009f176dfab5c7a4273741fc8c02d5b1ee0a6a17c7bfe621c2e69d4f07683f294d0e4c4821ef4e0854d003170358ef70fc0ee0f5e4f1275f959a007d455448b2cdb4bf4bd066ee1361ceb67ea71db10c888bf238d7c5c26389ec9a2be60c62600724f8efa2a71853d295d499f3cbbaf3180406671ca837fc1450c2d185daecaf8dc181ba053a6d582bc7d60f75dd6da32f09a5f720030887c9692314915a780fc63cd231749b4d8ed1d73335b9ed59cb31ff497f9e80a4852d98336b950574ff44d962cc6d445976793684a31c560fa9c5677946c48bac7295507c2d0d6663fc8e39cc017bcfe18d667842ee29b1efed5dd4be035e9e70deb53445ff66e7d58606d076671c8896524e2ee66d7e8b8af46fc9703ba933a237e1b659493e244a3a433ffa73cc28e863749cf7a7774d515d8fb8383650d5a10ccf590e90ff862277d7cab09e170b481f9e74ef329061e39712139ea9d21f1dcbb29eee7d27980ecd1923316c69aa4605003945857683b22fab7debfc995a49035fea615442c45fb8abbc056540a062b26e4c8316860d3d85c059d8b53321d3221bde0fccedb5a5b8e407a50f38781e862d31307c4b78e647d539cd5a2c004cd66afc622d64c6614c769888c0cd8bda1ec189d60d33516cd47e903251e070066ee197d11c648122f1b7d129205c6635dacfb8dc7fca1101ba10efb032fceba07a0463051049706b374c642eb48191b258ac40bc1aac42757720cacf83ddfdab7647d0568fa01e9a8b98a3e1e3b998c006eba41d842670188a4293d8bb000077f220524e00e4e6317d2122eb3480d5ff6402655932d5046b61eaed645f0fae965c227b641aa451e07a6a63b32d63f3b0fe8506f7ad3489fe9c8e3a1ad659529742d2be31135b0bf801f8d8d244cf5c9544e80b8169c16b42a8a0fc34b78986fb14959d2da1755f18a24114b1114f8b1cc5afe57eef1842c804c7b67a78fcd6226fff8ac23b7fc5a2e9e789d7f95109a7ff511758b3858aff4f670b34a14faabda385298757f6fa273730bacf837042c7605033a73db5be78d7034cfbb6de8f2d5daadbf57d67572628c12a003629e10b8731acd3040557953a20fe482045fde20ce52495124d57201d1d5a1297ea4ee4d289f574ad10e104e754b1a283f2717c2fd895debd258495a2a9bd5f0f3df6d3e0bd9ff47f44d5287cf2f9834880746c34e9a23ae46c69f7580ae67e32a1736920312eeb113dce7059a02872e46c8132ca8ccc421e9e71e58b9547d878914f151fa904b0f958178d0bc0d0e9ee0322504f56868cd23826c0dbfd64066799d4584d79d3feae205adf11f98560dc00d25531cb636385d61319c787cd707637cda32827ff2c9622f2d6fa9ea87034d21ba2105fe57ecfd4a160bce8d6af2ad775963e27e8b347dc9a152444dc806ef368d779888f3716d06c264a85323b0c1576a1fe1e433b39b99b0a3d70741a00e13455cbd9b314d135ddfafed1428c805e3b46f66f711cf2469036949611b5812818bd95c81390a591612f28719a1c2e3e5e05a5a014e0f80ff41ac84a37eb6644807f55d80342fa6fb05375daab727c22395e9a34811fc172313746f1591436a3060b8a8e14a4561d26085570e917d09677c232a15831c519f21caf2ff7d868d013f2a25eca2d3f464cae55d8f594f22773d10d7afcbfa973a12b5f5a8690835824b54bde86561c679ec5d57733422741b7fb89360131b4fbb8f3e60597e4fcb7c2d3d561fba783fd96ef82d034c80671dea24446e8009e3eb3f6c1b5ae4e5b5b78cedd9d7ca9fc74bf7bbc887c9f06344275bd3223c4bb992cb470ff3c2525dfb116d2f59bc5ec6982fb00e47d3fbd057de6529c46f693b78dad7226c401c291064c43eedb93da488c0dee88a9027161fb64b2c9c40ebcf6415253d0c88cd83bd2cfaf0dae9c5c9e34f4d3e9a2bff9d645814c6f1d85adf1f2338491cbfecd2cb11182c6a737d9e718706f9bdca08ceed6cc8de0d5f3ed272ae182ce410027e03bd25d9e380ed89fa0d10ff3c96cc0f8499705c36fc1d10225bced0aca196ef2ad529e18e379ef3458c733a5fb6d2c9ef871227b5d78101fad4611bbc9a308c0b042d2bb3c117451baa38916d52a265f7dfb929d219f10dc1c1d9f75b2459bf6df0379f9a45e0e5440f66ebb094c54964496a49d4eaf69c3ec93f4bd36797f0174152258aec823d886405326ea2c2dffe6c2f6f057117163a959aff6a8a7585d2a083a5cdde84b3af511e4df0a4218e8df10f83abd7dce37dcdf2fa69b578e766b5d407a9426eb1807db7247ec36bbdd87f136e0f43cd6bcf184f2618122a7e9b274c336740c99ec491db9f5f2627d6a8bf411679de7316f81eba6abec612b2399ef3124e021ce243348fa6ddf7dd40c559a36430d0554dbf883aaea4fcb8ec07c4d28aa8adefe5c50fdd213e5b1563f7f441407e40fb76eefed8da13daa592ce3ef084bb6ccb0e12caccf8cb7c58a706382193a956eefb4b279bd75188600e56b756e9d16536c7f10c6413cc822d74b9cf4d43fa3cb5429fac8b8ba62f71c667d50a9f30c0ba782c7dae5a89951d32d95ecd3ab917d8b5b134b0df5cf76124c940169020a6df8789c6b1b649dbaf492e90a75e2e12e0ba4b6813bbba07b78e43a181a2eb3f2c5dd18f760d567f6b21800ae599a15254bb33f0bb080788fb6e9fa054bfd8b22962cb7f0349f6a7d92297778fd25902bc1f3273b0ac8ca1b62ba3e496ce2e285efe413f6250727c82b53b7dabf19f48a14e109afb91917b6f2d18164fb736c8549af9779b0c1225ed4033c443ddbb4c89b0950ca39d5d3daedcc5dd886238bb929cbdceb4631dcaa22d48f55e80f537ffad8971b0ba3a10fba074e248b77b28a06e53ecb73fdd952ae242b805c1943188adb3732bcf6e1cdfe1ebcd979e49380776837aab8798ac0cc9e9b43f88e261ae18dcb81bc44288e107f3457dffe8124e1e172099239737d048049214bd25f0f856cce88881fe7d8a7a54f203c2a1e0fdcdd58588fa225fffc95df98c49a606eecf4bac7aedea2260a2d67d30cfbcc79dea875280f6804b20b3ba92b012adc919eb21acfaf24ea0ede8418e0d0e81f1b5dff32e8afefb25bb6ee405870182640013158f0f77711eb9b25ccca0673886cd13e2c2acfbd9125862a3f919fe6cfd2cadf1fdc2659cc54a69f0e0f3c328ad6dee1bb6f0d3633c80f7be176ff2b4bd23237ba01aa217bd2a76c5710e089a8f1ed868b15e6fe1cbba95ff0690c3a3cb6fdb7c1d1f172a2de13fa328f720d65467398f5bfdb79be78fa42c6e845b7f50973fbb1fd9ac1d3df52e52adb8f12423d179595dd593d8b6868c0ef954a0907324b5024c514a3717f0aa99a75965cc24e3008e5feeece26327b56d4d077c205d9da7174c8ed7c1e05a1a42bfe06315812537f60851a8ff14fa871112a5d675358a7cc3c8983c03c3b9e8139c57d2495f1f84580105b178f2886bc1f13795d824749cce68786245e6977bd5e7c59caee95a507ef112ed952458c74791c4a39152e26f00d33530cf717b3b4f4733a88c445d042e8181469dd2f204699c54e7e8e65c5d21b2d78de88dee904b65a8de2d9bb006315959a3da26df8bf0b7f04925086acef8ac6763da6277e28fe82c26d814dcc04f20a2eb9246a6c3a38c9eb18fe2952a4e6aeb99eb179e99e579c768d4d768984f7f64080e5acf134cc368076f9964d9eb936e1764d4eb1d13c0828c6a0ddcf8fb1da8e1968be3e5b10456330d58604397d0f5c58dc3e7d7e164647ae2dec14719a3755e710069a09cf66f1eb1450fd01ac98a8bad09192d190e761b84719ded72b8d467e9e3e9abd341bbaea388fbe93b2534510dd109888165bf5597effb52ce05cce44459eb701e8e42cc2a4aacf4c38dfcfff6414051e3124711657f60def53165bdcb8cf85647850d6190b3a95b7ba8e87dae8145ee05bc1638344a56f9aee5a7dbc6a497c514cd23531bea7a84281f03b37dbaa0c9af0c35b04d78640bc2c99b247dc851254f0f8c8c1418a7d995995289ad14da48aba9ab63f830137cfa8448813721addfbef251f2c364b8c089bfdfe885b67ad5c03d80377d9ae9b41cbfb7da3ed733592a1f796f6ff736a3cb39b1b64cc908d7b56dbc1623df701bf021ee18d8116bfc5a3d0cea61f8a9e924aed0dd4b740db653e368e7332730194053f7214ef7de3018f5134ae29097fa5cc64543cae010d962478c92f599b017d2fcdadfe8b3135e2aef947938e78a3e3b2a17d2103499aaaa402efeb15e787b6fc59d39ed6a92ec59d29a5eab24091d89824e7067993090f2775815af9d10afdf564a16a747e4446d462ae185709dff0d75f30715375ef3049411be367f0119ea56e8605c6f90cc2ef54eea0cf2cc4c90ac0c7e6335aa3ba63e62e1902cd123586e80fe550d1eee64840d618ad3216cdacfa4bd99bc9dd1a11d516703cb0b34f04519d8da471711d69e702e453a21c7b385c0acfff3bd1bbcdae936d88534b37b84bbd63245029c4de97d3a865056c5e3766a33dd039582c11d2f375781d60ac2d26ee0a73067f9910d3e6b943c47cf314ba93a7a13aa6f768d2d52c7e878a08ad83bde7f30ce8f6ab3bbaab9277c4b66ac86a91f4c8648a5d3ea7072e1a3dd9e3d29b8036cc0c6a083fbe03b397ea34a40076814d6b07614976e779e95de29c5aa41567b0dc406fa2406f36399d43da5b0375fa1d8b0628c80c251942bb1ecc6c78aa02f3a63b7413fe4cd797006833fa31b770e7a0f73d436ede49ccca48e6a3b0c7f661c24413d7b9e54c5e59ddbe0c2bd96a2e65410b662f71afda0407779afcfd96adb8f0db6813a728e2120af4fb524a5a64107a3f8ace9d901ce0c10bbcadc98819e2c8174f8c30e1e4c17665523588d62b6b09363bbca0bee7f91bff7353aa2f48d84063e893e0fbb8d0a68bab562341e6ad848bf38a2970dda55edf797f1e10bd21e05dedcb55fae0c821d461249842288062ad4ca7965a608e20381990a3b0d9282e41a982fe53ff207edc0e21564b536c3a1691a585d0130c0675ee38c9a44f8390dbb65b589b5671f40f2cfcebb219c961548cf4667657b7583561c7fe5f629cae689ed4e335a92547ea27f7d73ace407ee37924c6b1c118bbe30eceb046c50bdd94bd502cb749c2d0f999a2a739f339e94ff0b71516c198a7fb6fdd9deee939b4ccbc8d9394cac325b9fc9dba342b4e46f68e1bd019ebbf830aef4505dc31aeba9cf6cdc652aebeccb7cb49aebdc8c60e739bd3863f9215f38e17c5968350e3557206912385581e2c5f7026e33b7e69b653c46eb60c77046ff173bfbe78a9702be8668849817959cb2d95b606319e81b4f3725ddde4ed336ed17d93ec30bdcd846c811386eb64fa3fbea6976634bba6a0ff30116c6d870b66aabff2ae200064257b00b38a37bd87e06f2d1ba1b9585100b38839f01ab6f4ede9955c82db13cc55904ff8c1dae58b53db93e34743e7193adcd537f760ff986b1aa821f8c65a7ebb48d943ac697f6d1070656eb5490a57d5c7c18be0c4e36e74ba62f37e8666f3bd013734c857edb59cba3c1e7a5d14a557f0b7a65adaf4df81455031927fabb3d165e43c941aa2fd5f35628304d4a87a48043237b40796641757fa7cc336ab37aec35adbae46419cee6e833cf364385f1c6ecb808acf5ab4bd4ebc258f2fe8179bb61592655f4c1cb0c2189cb46036bc4b9cee415db6b429d9a62fdc64efd4ac2ecabee157ca25054cdc8d32c67d462a5c1b04da8b42253c030ac001d2eb139dee5d8159041b6eef191a7b8fa80fc921d465c9bcc1f64073afc9172657960735410b3759d8c77c22bc084e13e78c422b3b09877860477859568d9fba7195323acd403b747452ef589c228f50039743bf0672d89e04ba4f658db4b44eaf5d26f6f988f82935423ae94ff5b9d46aa54045bd3e378e1dd33820cbdb0f536f5247f24c6207f8ba19e16d2e0e4811ab3aca67c5d81ec91a06c503875d0b69301937c53c57e553615e755cdcb8d48833cc348db6bd18ff97d9789646d732d0a01658e85fd71ad9c9645920d291c9b8a2de21301679906205cfb54190c6105a2dde3dc40d6c12fc60d02f618635a21356e512f75b7a2fc0f26e1daddba61e4647d558f0fb83582bb6364a878df0f838ee858c3bfc5b417ccc191433bdf3d7356ca03ce770b974f837eb4d0b50703689d813ff768f797ff611753b6b8e3bb5982aa34c20237ad3d274839985542fd7969224df4f7b7125dd50f6f5bde2fa43ef006329337a440f5aea83d26e2f7c75efab4cbe2f46ceed931902c5b3429bfcca7c743689eba171e208506a2e49027be581d01e9e77df31a7c84d4de423ad6a9afd3b069c0e2fc6186c9dd35e174e6418c47372f5954e9c9bed2ad0b91caaf7d1014c1c02482b566e75b0a07630bcc909d18b5dfd258988d0062000ba84214f1d271bd9253040bd44b23d53ff1bda053937ac21fd8f1c80f491c14060f08cbacfed1ee0ad3cec654ba09860514f22c317654a817f58740f7a1e833234f869c579c1e9a4d2e4aae8d3df56483521236d34f8dadf1b082c9ec10aea38aef23519ab23f0a86ebde8a28dbcfb8de368587e1250f1ad2914b2b969f56ad647746b01c4a1c86db93f424cc9d7fca4145b3e70201c137e421482e9e55c899d9705983866b9d5574adf3422289ede2d209051ddeea8b4b4fe7e299ac3becaf1061c3907f1eaac17ac143add1aa0248b909e1f31ee855a03b6c81366757aa3732d2eca0b06a2b1015584c2d8205a4431fcdb02f6a03077ccf368ecb78b3eb78664b3c7ac157088b6cf9758adda4bc1d2cdedb9a69448a2833cf6f21865795bbd5551be859ed297aa82c288b898e331c07c3c8fcc4b2c4ec90bf8e003a499248a677f1b020357625f079cdf92fcbef89d904e11d23569e0f0e8c52303c93c867023a269bc036d8d36d69ca9c7664daacc92a8dc42c3600dbd4c02278333d216011252271def835ce4783883c0760dbcc00bc33bb8a5cd3960be268a1c84d847afac04dfa2584775ca54f6fa189c7d932a5423dc8e3d0fd89da7b8b74a2cdd8fee69310fd3ae184c6af56e892a5a1be27e14412b4e09868fc6a12f3b66ac40734fc27d144c81746548f1f59d903f771f1dc4b1a4628befa36e22f0832c73bf8646503f995752fa34d6a332b3c4ad0dad8bddebd48644a9d816b5b31af623993d648aff1b9e93085fb6b18c7842335e126ad8663803b4238232d1cd9f4e2c6c0d2ceb42078cd22d3a4b7589379352d6e21d3ca74b856b0b3654ffd65caf0ea679f1f99ed99c90e7591797bf9e229c06913583258b65c9bf68ffa833ef934ae708662e6c2e684fb520ad7076088a6f6ba4263467743f60ce8e95538cc495519c3cfc0240625a7f15456f986303455d849f71d8f3a26cc0a73bb89a37782fc3449c260da201fd9f862bf087fd0acdd6dfe79ad940729859d7e4cbd4ca86bd006e8a66b907a9cc319648b2c7baab8e8bec2123cdd4712c9cdf2e51abcc5cd7a9789c508ce7b640d5b43038c0125221bd17b08f2f363aa42a3b5cec87a3870a1ef1565601d8b3e5ec7e56f5199a9b120b013a4f65dc1b99626b04fee0e671cee1772cf9a0412f35e633317a2cb9e2c9f63702e71a3cb076d5fcbb0b401bc9908168a4bdf0c784cb6391542a8206d5c3ff07cee8a4ee85b7054ef3843da9dae99f4432057bb260e0e51743a8b1f7c09a9611d2b6ae57f7e460f0230c321742546b98798299c82040db13645725134fa85be3d2f38f0fa399898ede05c5fa8c4b96e3df97e34f5f55c6345ac853cfdf97a0dc3401df8c0520ef59990341aa1549a1b4d8c7d0de8a8a36f87b7ee6a40cc305897a7418439914f30ed8876ddc79c90c69e994faec1e689dbe6add263633c50a6a1accb1ccdc00451d00f482d826644791a681b9fea77b6b149d85cadd0118200c996e448e4a5d45e2c6fd2943a785e3ba8400a69c9 -MD = 19cf6c6dc28eb06cd9fc0a58c87c8af1aa605ae7fda192ec6ea3c12ec3b6dd529d22c45ee32a00597ef615af5a8e790d3902818d1bc3d33341e648b349c5377e - -Len = 46168 -Msg = 2214992c8008d66a2735292420127ca9527995bb4857f6e234a8010734a3603dd531a4e2d6a42ce72ea6496c4f6f9f90ad3ccf877afc53edb44ca95962a5b3361bd45ecec7ab82a8aaf709149eb254049f79da1d8d40120e2e44942173417b0ffce50d19dd859e54a310b145924161ad3118ffa6098afdefa9780a85edde7f73804dfaeaa09b489421d98926b5858e356a01864a7444da382dd055ad5ae38808b0f26d6a97534a102d3ad8e08ee6a541531cb73058d57291c334bcc241ba5e7693bdadc14a166b6fce1be89aa5cd6c7cf252d9813ca58da0718c86ec2bcac96631960416414d725a0d64ff7d83a0ad8b51893664a91cf31041c0fc529f7b91809366b891055e2878f0fd66b1afc82e1978aa140226a26b873bb8661d25357d6bc013125c1db3557282ce655db1aeb8cc6d9ebc833b9fbead665c0c74456056d0c0875a9c11b2c1efc8bf43a912b9124c3a4b760e707bb42cca9535808864e4569ca8d87c6ac53398ccb94abe59500642e79b8acb4e9e15a96f492a6975aaefa65b60d422af53741595a2c0c40edd5a567a753fe35c70a9cf5e61345695983f67059695b668c44d0d2b64eee2bac7d72ffdc0de7e225a38439ec6996f6e979b42a33264611d7f832897e51c41e47645767766afc329c289b0375ea1de8a10cddf3c1b894a57eee10fe00f920914526cd2f14efadbf81165bc321396c871699be5d83b4c9b9d782e6a0ec89761d2c313ec726007ee18b0940f96ccbe58a90ccefd7f79f479788531e02afa7471a731046b02841d230f05de526b7163b3bc5f2ece3abdcb0e6f7db31a3a8c72621a0405f8a9a286a2677a0b2db9e9cb0432cc820110ef17820ac97cc04966d75cb4a4df3b70a28894a776e247891e3e7191b9943d0af821fdd1cf54795c70eb86fb795adb5e6c6c2158612c49e2f7062263902a2b2fbe31a64df803ed7d92f80979ec3d817ce97a7001a2b1dacd5c6a402fb80d72872a8fa505ac50c5b3b4440db66352d4d1fff9aa2aa339a35135b1f37e9905bb1a248223815405a907be18b939475f7d659733f65ccb8c4c766a2462d79bd9aef19553484a56e8407f98bc358a012d23409a6e7d1d82717c44e40bb6c22653f213634b3be71cc233262a78aa31f7846f6beef366f830b2dbc489ae16c7a239308878b025e00c5a29015d9440b6932b09ed7d0ada723d1512fd4254ab6f77540f59baca2dbe907acb1a17571ea23cec98ce2dfa01151263c9f7f8469d410d6c388d13e37c080fe8c178410b6d7d598dc416e80d02681563a7bb91cd13c6cd49522c6a413946f16db223c4f654cd54d737ce958906f3afdf5550f72f35841db2063fa62d8d019dd147248660fc1c949296fe1cb7343f489d7bbe10b42c056670fcccb1efa0bf7ddc278271938cf181868cac65dfb5d34967c00ec6a620d1114cdbde72cf990bf856fa456cd62dd5837abfe25749b0371803cc47ff4b386e840b4c7ad115a06a76066a765e70074f0238d7a7dc3c4ef41f394871a5ed9d662978f6aab608df665fb51d1b31aa41e766867d04db02b791c5d3dc959fd27741675a827509f17b861c2bbb3fcccc0425172d59ff3de1129671972fbad542ed85a57897e4b2189f521330ede7171e77927ef512a3e822878c8d4feae82f8727bc4d9bdefd9ac57153ad8c5b1dfae7c3b501a550f5c50c40fa80c1b42795e84e6dc68bfecaa74019105206ace85d710f160907bdffbce96268b2b63680efac8a217810a053c2d0c0126b6888512802843effe1ffc8b6ff185e8bf518fa251c025fcbf26c9fd4bf8edf5e78995e43e34ab449fcbe58999888657348019e1f80dfaf27f809b6c353aa0195ff8419965c88005120a3b84ffada04d2759973c6204899f4ec20a079d53d0076c4f48a0ab466ab7d1455efbe6d37c410458981004366a69a945865dc8c6e626b918fb885350d3c37a27d05d03bc72c958079d0b632615d81b85a0ed6c266b1db2cfdabf025a53be690c3036baab1c4c9ee1069d13660471122cea34ebd4c742e5ee76b34cd5531f1a7cef079041e141556f75337958beab3995a2a2bc74934cbeff501377546a5c2af47d4e18f35a5df82d696d2970bd0cde4a9ad572685781ca7ce74e365a01fc070d5b78b941ffe9038543b88860881c9cc6133b92227c8884e1bcc1fe48a2753b221a25f5a03a79141194843a8a9840d192bc5390558ac77ab8311d23b2c46e33cd39c452b0a294965cec8ea4717600393ae6abf153fad5187af4ce6b3af03d8d792ae254d5b0b1f6b1bc065a97aa01101932a339c05527faa468542923be79b4b06dfe70920d57d1da73a9c16f9c9a12d810d7de0d12467dcf1c2ce20f7799260d83773a77e10ca411b3d77d8bc651add211c862accaa72e5580d72a70c4126ddb0beb16f9f436da01ed2de36ecfbe4da1b5e34c11d6c088c226d166da2c7bf8c357d8aa9abf6d0025900b977b11467ec16dc70efeef2929af8eba2bbdf94c633107be49cc9b15a2f73cff0e432370adaba9c23fa64c576d8818dfed9ee2fa19be9c0a99122fd73ee15476bc598ec386eb0a8332ba96c1e0b665d130ff520ba8c6655bfd0de618308e77112620abc566ea0088acae56ff0fe4e63c7a51df078ce324110a12466f2469054ce02b12dcda331c20e1f3f575678e2a603e28d264228f38c824c1c92296eb9f885eeb5c905d50ce0a971e0aab740ca2eb0106e4a8263523fff18f0708e480966206f3d1866ccd969420af0f37b1fad03b475e7e49f47f6616e4fc5858a9e29a588cb71a1594f3f66c03096b709dd332ef959217d019c88fab637c65b8636c0bda34a7aec4428e6de0d2cfa80cb4205b66506439c102aaf13c1181879e8d977b75b368081901d77d9104645d52815cba3e2c376ca34b914b2763ce667194ff69a97d5aae9a6f79a60b1c59f3f88202cfd57d7e28ed5105ee2bdea56ae8260e46e3f7121abec7df679d8f32f455329d1cdab8bae705bf836a87e6990d58ad4ea3c3a500d4fcc79342f6d161e6ff2f9621bc82703f82e39440ea102bd649872af0b72ba955dadb1fb8758779345cb5886ed95f308afb69b2f1b0ffd05e31603dce3cef9e15ef7eff48b815eb750470ee54dfa36e61c5be6a0d7aea28fdb6b4f18cc36541ada11f9c742d112b217cee22842df3ac4c886e13e4b673884d4ff1e0ccf9212685765971bb42eddab22c99df7d42c45cb399d55b27e23090b543a385ff3ca7cf25f5a9398ea8105cafa9e07f90cc9a022f90a0aa378c85b4de58465ba41c7dae17958b4e7ebb3d33926b7e8d7f19f93f39033c8ba423f77720e456cc5bf6f745c2ec7c1b0bfaa8f1d2e7a08398c9465638482579fe371a5a158e5162777ab918c0410839a6f5081a19b512fc5e391609c5f5d7ef963452d0249cc2b8971647a998599c24e028cf1eaf4a32426017fcac6a82e0670cba256be6b627392b48078aa39cb457480452623c1d8b002eb44ec08e85cb8ad227269fd4610b5eb48e9d1e7a70ed6b3f26569728b589b02abca0e8ba64f5a58709caee6603cbb3b3585cd7957cb3bb35fd302ffd88aadcd47f778776a6fb419be086da243504b2b833eb688d1683d1dcf7739f333d8ad0ccab571f3bd249096139eee5877b22e633bfad23b9e4fa4994a39557621a9656639eb422725d6b47a7746783182cc2c8a65a36bbb45e638ced901a0af2c669b849e81343c2cede96bf2e85555ee040c480720c7304e97c16583b760c7db75180d005e8d5a5ad1f7118d6ccbeb43c498472b592ec142c906055143dee6b63fa4aa686c95a836eaa6164fba231c0773962cd836ea96a7e3d057498d6232462c0603dd92964f48a1be1f41baa50fc478cfa2179f42d8084fe703767e34d612a508bf67b8d677185c06d7695598ed013d0b4fef7c7dafea7413b0ddfc9bf8a31070860ec69e462f8447e3d17146dd472911db68b5e442d7ba1c0688f0e1c17fd60702dba536e7148249ee81f7f5081da4abef8a32bfba5689c9af7e434c58306095d9d53be6804fbcd49e7fd0ee950b169f335edc563ef049e350c7db25e53e15e2b30571f63a699cb09bd5e279ad99e7b64eeb99f0f72b6232946ca2b3922f5cb5397130ad3ce989a48e8b17dd785080b8e93952d60d923d7e20747f40858d9fd812235e55af57eb7a1fa756641db7476dab51f051a7aa408f9fe75912e6df4511e723e434ba3c29f8f5338654c557a59d3d3a59a7edfdd42db7cd1a72deaeb6296077ab92861eade7b93691f697b6030f46fc77200812621f102fa9a8958159e824299ab93a88de0e12b95e92bc5ec78c6fa030062071502e5314eefc32e09815dc4198f0ffff2437a9c3d5705bd75bdc602d6e9f5ca307222885d1b6dd53da7a2fc58f7efd0de728255cded79da725c7c0ab1835e52ff0c336893a1dc06388ddc6bf66ac5b398faa308c6111aa588f153723160ee39d72d82628117a00970807483605c2420b84856f5c4664a972ff8d6f9c50727d76f42b9f6a3e15c878c3c05e335408d90c2f818cd37519c27bdff80d1eadabdb40e0824a58a9363e8d21cfb0bd3ac549c3f6662ffad7771ffd961ebcb1180026869da6cff93b258a5e8bfee5dca243b9b942fbffd752c8e57f8cc7225e76b886cd935fd556da29d5736713a69871c852747c09a575cf523f8a29bbe72cb01c229f2a7404756f8c47551ed79afa909d3b7e0a58c8d9375f53a5d5c1b424ae742383caaf0660e394078b19126a09e70a9d5f56b0110d70354958f8a3314c5808b002dbd6801f1c8a3e9dbf8cbdce5e56a09dc6d92818641c4a2bfa2705ae961ff2a3c5b21db804b61314770c3c4fdecb6bc2c49ab402f95e7ea74316d852510211eef00b8235825faf76ab5c8f964daf2756b7bd5ed319420c533b37543e6ffa346bc5a95a9d7dce394ec2425dab954bfbdf0708cd94ab0f1cb74b541f7cda4d83a3aa534bf9df4cda2124874e949ce710e71b44a94d970ed85cd933e1147843271d08d3fd508f1fba7938f30b5b4ccb8ef55d399c04c58766c94f9d430c3326486148ef1aaa758f00dd684d3c088b3e9c9234ae4cc31dc1ee86135aec6ef23c0df8d070471079e6d5d61c5f89a143896244086c61918606991c8f3286429dcf9f690a1d2e88836a60ebbaef98305bf50996423c8477eb9c8e1229edb68e1b25263c5cc0771d7b65caa4abc614bcbbc8b90d48e45d7b31ccf6f04b52265c5686c9fa301fcad4491d3a8957aca34e4b4a9933832c93a841def93f5c2b7eb3353cb02aed04cdb7d5dbd9232668ededf3c5d28f5bdecf03031abe86c43e659ca08e0454fb352bcd07e6cef981c49ba19b7f8ba939c0b8965fc86e4dea54841d7fc3ed00c27a8a1ec8884293ce8655722bc1ed0a839cf7683e2f301d38348341ba2492b7aa9d93b3fe075d7a7677c2698bd32039a338338186982d7c15a8090d3af91c001b64ed9393ac4635e25f8b8da3fd4bbeff5c15ea214b8df5e976be8be58ab2647d9940c66dbf264c790658e75b87972201d244aaf590770d1d674cc2a41e7d6a3802365576882448a233d07d9cb82bec0f6169c9ecaf134e174358ba60fea59ab4687547944e69b0c7b09b594cda30a493d02c50edef8a3f40d28d7cff73517c5992a5a4b15b1d0c4f4362835533cdd3f4e83446df9a046800db900f6bc3a999904a6f75b4f566e5a2b5cd019d0c2b009a712ab3acf6a852c0280c7b8a36d678bf567bc185656fc128cd83dd0eac71b3ed33b59f3b4c9f84e67fa7c9461600a1507f70900cf35e2b49552d1f8f5dc87455f57e1374e31186dca9090085a94e9da98df6ea31e65ca86d1372cd076558cc3a812d163f0525e1086edb283139e9f33448b7d8dc8890c2fcd1fbf1600d4842049d69b184f8031cd495c54a310cf92b57785861f51f23005e556f92819dc15f1b12daeb2b05d4bfa7e86e6c6d6aa5ce7ce4848e64f43ceafb6777b9525deaa9e7a729cc1c74c053e82d7f99cd9d15630a55e166114f04093bd1bb6dbb94ecaad126fe5c408dee5f012d9fd639ec7272699317f1e477a3e4875ae2b6a48ceeea3f5500a47d98876b59b0772d999ee4830066cf37c6b6400445c9959cf58b19f09afed8abbcdcb2ff587eafa5d5fc921f3996b1419d5203efdfe77b2896da94444be72e79e6a298a4665eee46d54ea5cd7bea64165394152fbb7c3d616fc1886eb8d9a917e13260e1eb19dc1982dc44162f2b91becec49e4c4350825069871df64b9bf18c97d4333f4f772225c2ed9881bb21df42f82ac5ccdd2af3fb6a767a656bf7afe0eed03945fa4068737ecac9968894f7a9b70eb339f3d3376c5bd4c8437fb38b1cd06d997b553c55099fbcfeddfe4c80fbf5b7901aec14f7ab25ea2e16f1982c4724f47c69c63392f10b095fdf85102340996e83f830b3dbbeae00d568286e3b69d2ad0998b6ecc733acf9152386aa88818b7bb45a27788aafe05ee5c08cfd5f8bc1e0698f8e309bd568d6483167e056c6b3264cc8392dad86a24b85a7850c41b3dbd5c3d6b4c7b6e129e61f92927b3515f9b773cace98eb49db11dda47b6588ec07d440f69279c15ed673c3cd6d43cf78457550e94e83ed0275f6163fd6cedd3b2d2408768e0e645557c35c6a62ffc9f67fa90cac21b45bb857435800fe10e8aa360e42de124d46cd941e11f2d879ce978f9bce9caff3dc74693fca705cf3504008da17b785ff10ce74ce0aec377784645d93bf3f600a183d93349516563ebe058cd0ae874fec6961e21a70e0e6c29364d1d907209dbfb81bbd68e07a55bbd902aa3730d9d8dcfa8cc3496b564f22a4a0d4b4cdc4ccdc6416cf24d425c2304a3e4b59c43287976b5900a422d7d95e5f1e4c6e39b55727c337b1b0999e0366b8c1557c931cc6e463d08173beeaec406be8234d757aa4697e854c54566d8225cc94b2e9c41efd8d8af82efe6618f08e71063f9aa69b1d693c088658341ba5342ebe48e880c1925889d9ef8c43e84d11187e8a9cf7a028f1a6c948035a2fd65d854701c0ef8bee0e087bad667de26c91095aea9d8e122fc764cf7b9ff0317c667938c3bb38067977aee74ed53b8eb3d6eba249e3937999b41d23057220aafe18b498781f84ba9b5a2424bc1fa5758ba7675c8eb72f5bce8079cbd0c51021c63bdb6f0735fa2ebd80123add8ce41e5dcd2592a161894236f322d1c2dfe81e3b9799c65845c3ea45b21e329b6620118f11cc4b6a29cbb539d5bd3cc50ad129c5f393a4539706769db6f313ddf380d78b390490d0571a3d3fedf515c08cf3cbcc197411e072ec5b2b5437e58a7d2df7b70d7768be32a161b0046f639aae758bb8cfe215e7209d20595693b08c4a4ff97d57cbdb190385a9f4e2d62e3db87ff2f2de85b950e7404d8e82ae7dcaa20d6644dda8f1ca12f19d734fd07f90f23b87e00e07040310fd6a31a231532ccf8fc57368b7b3b9a70bc69513055d7ba3cfd2eb260dffe8e2fd00ac7cc33b9a18fe9e74c09f28ce0afbabc3f51fd0e615635b7bf042b0e8a7689666d90d3cfcc4827aaead0958f282ead463bfc3e0b98e20abf9324b21e9a566b5c780b65e3a1c42df89f79d4c0b5900cadf379b96dc572d49cbb5d35ad4261de4373b67a93d6867586d65020b02d564149d264ff938b8b3bd5b4180619270b8ab1ed0c826ebf0186ac2c1e19dc03f3f3a07538711b3f8da90109efa400acb5d92e40880dc2dfb7e9ff0d1e10b2cdfb8c58388eae73661c9495193eaff23813522f1ab38d4ecd2c07e5f5eab5c2dfcf83c7b8b2082aa39a97088e9f8a4c7d967e2ae8197140ebe088f782fe698addf26275625d2ebf5c9a18d1c68cb39dd1a1b5b815146a67c057b5ba10e3bc893d16b0f7c1ea8280159da2975d80cc54c8d7b13d3e5ec911fef436943c152f3c718ef7a553e4943b4317ccbfb016251fe7aac940d0332dedec68841c711d22130fcd9f3494d5e43f898aefc16ab76e4da29d9669574c094a0d0716c93c6645ab8c751ffc0128e31b4d898432e9df086c8e1280fd5003dbb4f57277111a8afa746bf812822568214d0376328aba0773fb0ebc119336e525cd2a1d2d8a87e5c0fc32e8ff5d7e1e1f433fe3733f57cb3187a8fcd0c1988a67e11f6982abf12129b155aa3ee477b54dac774 -MD = cd200254e5a8cf6e0923e70fc2cf3ce26ccfe07366a1c5e14944959078dfb803cd0d0289132a45bcad2bc290605f33e90184d306f35f0522e3d1a315da594bbd - -Len = 46960 -Msg = a19f65ffdafd6ad5ee43570f7e168f94a8b4a7b7402ac80b5dc7557818d0ce8e9075f51a32042ff7375d2c276da6ca223b40376edff95670fb8365825025dc46c9b09839bbb5388b6bf5c82ed1199d2d9ba37f3f75250e9c88b05e0f4090e54c53369785ff764f3893f3714b30d7cd5ad1c7c7508916b5340c388946717ab04b36f13a2585b03aa6b53e70a614482553e49257c9a33316e390022e506a4c06e97bc8c841d5ccc27edcc00d6804d46cc0dcee76d34ce6f84f1af69554b36cafce29a28b037830af680d608fb989e36948c2c26e960a972220b5fc057bd54473a34869c991f546c90b520640c02adde5949df6853968ac5dff66fcc8ed573a1a10e104cb13d475d810b29a66a66f2aa84c757104e4eb8e719437de24d1c1b86bbcfa5bd9b29e24a31e36054a92e0327a17521d33c11da526862f8a624f9c252f509e563a95dabdf3dee42d34ad065d239d3de159f58559447d56e9c9916fe92e73d2dd38e610a790f8c6fb6b1f68146a873da5bfabab139223b5e1a3bcc26c30cea0d819cac84a4213e457390f8ebd197d5b51ae091839d91d535b36fb1e15fd090f2f266b8b0ed1d7442ae4a501c2f6269ece6c375335e1163940cc74094e5ccb27caa7f1e05b04eef05ab50b4889ca2b0e02415ee46d72b46d76ab4f0d7f17bcf191e4845099a4fdf0d1f466eb7c5c33b3d677a6544b549ff9e71bb5b20ef485746d244a623079af4a75e9e1730176e7963255362a354e80e47966ce7f64bcceb944b16e9e884ba90830dca16782deefbeff2237ee952aff3716d3c1fce9363ec600d1168c09e29632e914d14f665df2332327d029d2aec3f9a5a9b7b1052c7ea587cd6bb51c061cce88da97b415bb99fe88ac2a6254a375320e31d7272164365ec3ed94a0277ee3e6f4761b1cf7c08b2614f86c2183d0bceb39b34ae5a3a80df79a78b9d59413948117308612743470b3b155bfeec7ff412b0e763773f5beab7af6b804ddc98dd7a8d84f001bf4def2ae46094b5288f6acfa75c4c75a7d6eb9eebef39b3f30b453621f1db0c1df87b71ebb5d37d42e7ea46056e32121a582df5cda72a6832f4fb1b7d4e0bf8b9df7670bf899acfd215fd166991c6f50d4c0c4cb317d4e32302898afe0e1550196f6ab7de405d153c961dc1326b7d67071f21143ad5bbad39a05b153296898ac324c2b7d69e9cf608f4c6d70e5fc8008e6de6dcd355614eed5afa4aa98bdb313dac08e126e8ccdacd9e72b83be3395a09a4d816fb2b4810b49ee18bc1527ccbff41c7c45dc37f4bd10fbbf569aa33cc0f506f5330abe2bb35e89b69289ef0c36ea269f1d99326c1d9d50d0f15f959ef15fd3702126bc3a6d7c4a2533da5e9a0222a79ca28ec55c54e6ae075af751e3ba407a9a40eef6d6c20bf70da7f2ba9faa06661edca338ece855dd0c9b481f32a400c41c984ab32539735918f7b74b42b7fc2dcbd4c1d2466351a486bc3c47b33607799e31233d525a1c38ec2a135bacb06ec24b91cedc8f4d41cd1ec3ba1090f8be61c7145fda83ad6e5c3148ed30041dc3ee471bb39ef22c8f1e7bbaa9c4ee728b434048e8d3e1bbd28c905a2c1373876379677b5960958aa26046a8f3a9f82dd7e9b0d5a470930bae92b067ba4c2175b62b52b8a76aa0eee25a26967f07d3b00b19c0c47df8c1256b343b777e23356f24ccb1da84033ce1b7d6c48b3528aa838d9c181c5ab59592723bd69360e0d7fd15232beada7591ea899ac78ffd53a32fc73a5fe522ed35d92a6e2bc148ca31a8f1f969ee9006c691c070d8aabfcfe63b1fba3e27bfe9c982fa97e20b1e2a68f7201612f18eff035ec41e9fe563e59c2fffe65ceb18f17a164c7ca379ca48a7730a42cff8bca872dafe6cc347d1dded94ce846238154c6f1c87e71512356c14a21745480d0248388cd424edd9f2ff00f0f45df7179e44d21c129ee0de45ded70eb0e62437482880fcaf0cc4a2ac92feced939c48f9b1fc89e5769ade5e3e5193f3bee0c7f769170b3f8eef1aae8e00eb3e5e070a8f4267b2bbd122430f8cb02bc2226a7eb74c9303815901bf98f2f59298019a46a92a1134aac5fecc66ad6b90dcb539e862a18e91370baeb9887c807b712ad08de5bd8b7848c1aaeaf234f67baa040985580c8c3cd6f36088ebaf33fe60365430b38129060c60911f4097e334b07b43e625f20e5ed7ccb1ce30ef8293cbb07fefa1199c666c0f5be9c06aa46496a7638b4ad6778fbfe40cc9f6d1eee43a25be0b1cfb3801ee3a55caf011cc73c304f2d5354e6a3805d5ec2cbbeaeb683202b923a58a9e61197e39436e11ddfaac107c5483ae58f0300eda66fe9f0a8839e3dbb9d96c322c645750e3790f3b61d8566a99a49ab630c51b51f91d52cedcb825a04e0704859c5532471bdf5e6731ce434815167824823b77dd63b6caaace3364a150dcd82b6972bb865cdf8403f304638f4767eb066d19a0f737495b10e5420d5952b97b75ec333f99471814741df133bab0f757ee49d62319d45388b3ba4aac32d43b5307cd1d5afa3b07845a2b4b3054e273434eb1078acfcb43e7e5a5e3bdb845c0f35364a78a13d93c58089348e5e84c3a31aa2b0424739cc8dd394073ae6437e8d0db4b58398082051411fe90c0ef5edaa78320829ccfc920ed2102911ad11b117021f9a605cac6102cf8b5a96dc4aac3195c29d9601ec10a9c2f74b27f597fe955a9f8176b5d25ec174f60f92912b0920ba7bf9efb0b24d47ed70f6e4897c6cef5e5bf32d6b221e777688916af53f0a5f2f85a39d9ff651ce99a4b1b03069040d567c77ed4543a90a1e686784d02fbad63c072309975f25280fba04f3b106cdd78a29961e0cde0764b4bf194aeaa21e6e2929029a5f95d03b97db7715d5facf36418bd728889a416b80b430220b41400d3d15c7b7c1415af1782f937e64ee1210c5cac27481205d09c9703376fab4279cc1f0faca830bcc30fcdddf9726899f4f5c0ddf68bf176625d91baaad80a2db04fde5233a6e9a2de2690ee4c6e2747dd94f7cb76d092861a6f6dc1d2f65b4652b3919cb6f4a9785ee08e928746256b498e641d1ec29fb587669db15647191ccfbbdb779d1dfa9dc3c2197350a6cd84d726881b54be537527c7a411ab46be1185bd0e5b6c8f4793bb4fc3f93eec9a24f511f67ecf4068458a07036b2871d4e5132bccb09bc53aea93ee00ac88a415bc21c5118fd4d548c71ca95e167454d7e806ac793fa15c2f12fc217205e459babaebb47bf70c096f4a5e22f6bc056c419adea3a62113b0aead428e7a8dd86a13c1c154982ceb39667fcd087fb45224ac8de9a5d63d796f340a05899cacbb719b313149e899e901a8b7f7ce5ba7f12a7331d6277bbd38e449c9b3a74b0b23fccbb9c9f90fd68beeb0835cf90d0f58ca201712ad2958e8cc7a5ceb7c27f198682fabe9e6506b5a5d18727afd2642ff904dae3dab4178ef6420440b5c96289f4021881fa66cb0bad93b05b05f19eb6c29568795a66695d367e60f91dd37f89f116beed99db75f53efb2adbba36a7114d1d503d9230b483b2436202d826fea1e584940b640c2bf8c0cf9eafb4e9a7c804643d376b592086d458b262cd0a0859381541e24340169e9bd8b3dddd52c5644e31d56ecb2bd4f00387f721e3c9c53a52916e7a1fc15e6e37de126f1cb92a6c924ec0ea9cecf948a696d94804aa5ccb9bc0c2dcded52af0fda9626c5865fe683a81a7b3c4e5b617274e02de17f4f5947c6ae60f6ac5a2ad53004cdd7b9f68e1ad9332d22d5e34e4ed7717eb03f0ba1e5b56811ba9d9f02ca2ac78c96caf905e534c084ebd9e9a3760d9c378b2e6d1f0a14d3c09855839f553768d3813dd9f679473d22f5eef1198e83bac8b0b1d6293b717bfe0e58ca891cc2334335871bd84d8d2377df797c190ed677a2ff6df968d037cb1a8b0bb6287777e14c023b2113e872fe0416fdfd1a6d723d6695b729468ef44ba6ad02e925fbb4ed6ea5ce9c41c09537483b00f6a630e386843221f85abe236832d2c2d5ea2ff5a21b6eb5efda7c6069c49a16fb34efa6ed7c4342e91df441bb4f9acffeed7ad6b9e2eb859e565270f009d2a47d5ef048ccbf477e7df8b7cbbf5d638ee6b862c49f459ac22a4e09238478633def7ce925ceedcd4929837f4deeccdb840fd38e4bccc3fad0061a070471a0da47d42740ea4e5833376e36c134c44e5143ecb733d8ccee9a43d452b2a052038656cde68de2d5bf27ddce9b041cca3273430fec29f80a15e7a1f770b263a02115ff3f2326cbff62f980cd28ee628b299015ebdaa7262eea615ef1fc8ceae67a0785aa65b1e225e446e4ec58b6a261845610f31b51ef85cca5ff467e88928f8ec99e8236a5e1d3c38e6eaea31368f7d333d8d826a0b0b94d13f7875f5be725dfdabe691e793793814e7276a07b02a8b6a7e1ed751a1623dc39cc17177d7523ddb949c185a24fef9df5b4f6d9541c1e8f20a0b58f349c700a9601884f43b91408f3e52de4c7b7428a129a81a64511a3cd3cb9c2fd76900858a72c5d6f652f70f208f500e45ffa36c63397b9afb49ff3015a81881866bd6736eba108e04844b529671ddcecb18536e2c730f15e28f366bc188c97986b511735d2041d4a73957b0f9cb4346682e4bd604bfaeb2a28d8796df55f53c61b1792c608c9fd265d9e1d25284c8a0a3a9544bf3059e99c2aabc5975f6e5f59ec5d5477ee673adc9ccb260a886b50104f23675022d28f3ca4d9b5b8d53e1cac65bef6bc0160590587a920104b85293146fb9fd381f94e843e0ee452e5430e360da8d412c049da19c4c485d6d02e67e5a89a48b9ec32a9fb4ca7bbe61e11c69f4aa7870cd9983081ca89e1deb4cbbea5fa8c1c63a013241a5730b6f2de2eb840b3378a1a8bbfeee60f75ae9867e17fea935d65716c2f3f59e4365009a3fe65b2cdc557cc753587bf1a24568478143e2c296ace53aecb6e428a25318b0e05517df0fd6a8314ad7d6560f2743353b87bf32350b19ac69c335caf89b5f78ad80dfac34c4ceee86c42817a8c82259952abd7f79bb9b761f62110dad067ff98faedc1cb1e79507f16798bdd4efabb977760333c98312a0f8dba078295c1d3b6c2936b6ef07a68372074fcffa66895fcab1bad58f2c2730db750993d465e4472e37140256eca86af0ed74d584f36253742409ee327f8130af7975e617e87924bb219e894f5d44c455623057d95fdf9b5f1719051a41c9a75e2f0bfa58af87dafd2ffed24024229a88acabde6171a74171d111a2af3da69ecfdff4560080b472daa859669207e9f371130cf184f3634d949c1a4e583ac11cead157827824a8f33cd6dacbaecf42d8f8e17c19aaabbac5afbe5c8f80ffc129974d5d0727630c650affa68bfa44d450055c22dd3b6355b3aa80fef08c554fcdbe9a2e6c740488d12c6ce82ee02d486380ce27c59fe1db1e6d2a29f6e50413114701f139c9d1c33e8965c63ac7534519517db2593eeef50fdf04042bf3d4b4fc1acacff78d9066b40b316839177f747b60b2ec2281514b8dea56b8161e8ddb97203def2d270a183b991af7b237777c9095b4fca7ced484a075676c3fcff62fe93fa17a63010782dc1b669b2e91030761d9cd0b708e3d48506980492f6cd859fa60409721824f4c9e7a5e7b348cedbaf4124341062a5541a6ace9776d5ffb00d26c606ff012a91d8a9c4ac04c90fc3f532a5fc5f008e415a927ea1d810e27cd7a494a295719de9da66a7291fe05f73e860769c0b692b26c62c2cb63f4e32467f9e146eedfffb775fccc1d17d354a75e9393a959e12f86efd766d3724d44b978571a9be60e2df94d94ab957a52e3d44884b466b9f846294512f94b72149bb0a59cde93386f096fcc74ed20e1041b45a46154ea07834164171b647b8bd24fcf98d114740d87fce09ba67c07746f64c419305a7b6c0b87fd0df890abe30dc8dff9fea4878ce06f1362323e925d1d27174ffbae62101780bcceb36423a5506ea76f297514de01c8d1c81e1d08c196ca07efc938e71a2f946b0354c72af720a9f1a35c71632a7271e2757400b3cb60b75ca1a3e051b3db2bd053e1a30a0107e1833d9e7fbb99bcd00e123cced9a00554de0c908eea02a4adb56764df09ec8c7e26e4f8876653664f1d477c71c36b0d0b55d9982af8301182e0e6e46370e038e8a2407072aa7ff854d6bb3ed0b952fe4388afc39cc464ab1219796a1787049187bffa1126d045fa49021789d3027d626340371acc96c7f8c62ac8fde3958121c445bae08c1fcef59569026662e815c0d54519a4a2b6818204da7aa5afe47f7005fb27e78ce14271a0d325db65b142a1005ffc69076bb9d135f0386a63ba2504b3aaea2d0f5cc9f4d20827f3c4a62b8c4c568872e1fe976bc235a955e7609b67371aabbafbda890893cfb2b3670ff90921f166c61ab744da1171766d231e0a21f71311973aa1ad344bf26b253734d3a0e7f93e6d98dee8a68c6b46bbff3b9ab85d5dc4cbb2f95b016237fc501a5ce2da0637b77045bbaa559aedc245640172b6d0bf6d5e4d2cbbf540670d3cf9d14e3ee6707ad60796b371a2bd921538b6bba3b703b459f181f79a4d4a45f2bdd93e55f06f2fa7c8b62b820ea45d3365a39c057cef40c3883f3478f2a74d794cbddaa58afb7dec6f64390e456acba5d1103e66864cbaa4f9af9d159547ccd990c54cb81ddb0cace4e8059fafd785756644c84d3de1c9042c1957fba0f36b1b7038b91612d885ef0f8ab8bcb4b333ab0a896343097816ec09c58db27971d246d3604c45cfba90bdd8927aeebcc57d4da72537cf52d7486378fa65c08a89a862a3832acfbe49d41f274772bb2fd6096524616b7980c70872610107af39059678c7ea7e3c464cfa1ce4f2c9ae75ae82fa698528c9fb10fe20ac229c07f0ac438e27dd6e12ce8da9bdf7dba64cf6158e155ed995482c7ad17541a54c4e164558afaba322dbc0d28a09484a321f1bd3d5bdeba5db7d79cd2a7908d23e0e12997ce03b86c31e83e44508bf8795ae4aaf00faf83021f04bd0b035eaf19bce4e70582bbfcc79647f8b81c245d9f681ec73b7d46dc3902a0b4c0cb0cd498a17319193971fbe6b341c8ee640c08a7d216ae5a15432a650b21f0ae5f29b23347023c6d62c43a4c216c2b71d891ae054152ace67812f218810f1cfe4043ac7c1618cd5c9f313c6a592d9cccea53924a0e596f5b1644d7c60cde766b1ed947d5872d58713f3786b3d31c996a19d079d8c1a1524260372fe01706b96f3b58f8d212c64a45d3558ddb27afadd3c786a953d3b0e216e6887f09381e4265265153e4516a2f44ebf9d622bf6d5694a3e4c52ded0ebb5329b759a3d89badf78040ddaecb9f73e8f9b2d43d02bc00171f7941d956113a81aa22244280f54890a9a5ea73d9bcc4cc7d1f2c8caa3246f59ac2a3e8a77eec2cd8778367c9b1cecb330f2ee614687e49f67d23841e66a79ab65f6fde799e4cbf4525eb760b579cf19ccb0f6804292cfbf67b7dd5c7af8e80f28dfa2d1505d8a3609bb11fce6d3fbe4798009c01553d5ced888fd44e938832cffd0747223c1c83cb6798a79b59339bd3c4a6d4c4934bd75c32de121bb9014abf1aebcf29a784dad607f6bffab1f4f4c1ff66b4a669b515b2f8dd11a766a61330662c3793deae13210b5fcb54ee00538296d4be3f2f2572924921457a42d346d47d4ce2e95804c73cd0384c4293e25296295553e77a09886ab23f401cc415301bbec283929a055179f514d54c1a275c9d357d1847c0ddc1bca28b740770e86966b9318c381b3c6c78e879d8ca072bfbd839c06dc8aa1eb8f8b8aa63b2cfc97d45dafe5f42622652aa38dbd944d18c9b07a4a3d6f28c48c8bf62f091b73734c659b29d8f39f54fbe9e54bf59550fa5c48c14abe64dede89b712002807d4db6fee2dea39e974b04fab5daa8cb732823f2d5f85d1e43457a8bae7e54a28d89cc61a19d950fd2ea02b191190cc217a163c085ce2be17b397b23d7dc7b9a6061e1a8e69dd6458548a55da0be6fbfcb0201981c148cc24e2066ee7dd8cbba8e7c932f525e0be216ed896975395626f5c079f3f95a14434490da6610e1e99560106d8f553c9a78105f1b6f8ef8449a3073396ebe0d46e6e7112205218639bd9df3bd236fd8065a0a03d7da4e99af7bf380cc62cabc992fbe17fa5630445085906d2e9612aec40a5c724b34449c1b6ec78faf6abfd68f80221bafd3cd9ab2afd0031e51ee3f782b8020e1f7f15e0cc524e65f010de99e8acba2df0849f7c47ee53c28e142f887103da63 -MD = 52ef6d43536b1fbf828b21b669fd459acd71e0ed8c67b97e9a7a79f145cb3a5210143d692ee36db3a09ddbd18bb26f8c50f473919e38e07614b8a0cff6e11012 - -Len = 47752 -Msg = 4b91efb861462b30b26bb5e8c8b08ab8a959f396069c5915b54a5a2c62b21d3981c3e2458670dd8a5959443204a7a762af378077cffc0b909a9e574cbe679dd55260d21d0db77867b664b90adb0cb671c6261d67ad5cf9912934cf3ce9efe65aa8b2e6c65ce3a5d0b1d63df5b5a962eed56cf2ed0885ce234a53e9854c129ed06aff47caddbc0bcb32f5f77dfa4450e0c45228914840304be545cdae4e986e3f80901cb1f7095363210b102913a62b4f7b20e7dbd553c813e250a43f5648fdb0d1ad8e011194249d665eaf8166979944e11e565418863d8229bd96c1ceebf42a479dc54495232783e936fd0e5cdf42c5e0949e8377a337a0a3d4cabb1d49fab6c9aae801ea7f031c93dd22575e45d0dd5fc9e6f05b70607636dc69b5ab2ab85b401a1fc1787061704a9a45e5d292e891470657242db75d0bcb1f9a37e056d5219236940ba7bee988f7b48e3e218e34eb7e9319a6533ed9684be386ca2494fa10a8466c67df30426b837426ecb4015cf2edb853fe37ce7a939c7154f5dfaecf316a92d25d888f1521d4223577f2b308ae7cbd2eb53f2ee896a8112d41796afb8bc061ec760aa309b3d406e265426cdf2814e9d152d528cc79550a39355a91272693fde239cd34c728696756400ef389679b85645d6082ce428da69f59eaebfa0bc9acdd2f3a0af6887d8fb98fbd11af73fbd9115f480595fb372b8835923f1d414cb705deb7ec3fdcf7c432dbb78ef9551a2dfedff479caab3be21b52b85737d0026681d0ada44a2bbf4fe9ab63320e14e2c95365cea6145b81138137c6f9f1c1d5007a8d85f8be7dbd7807872bc497b839f439793d531c12f006e16c22eef31baccf179ba5b144dad986b4f7760e3b4a09f8d8a4a94a8ad87202647a36fde4e66e1981847797834bfbc31784add6a3d1391b576d7a5105b5ee5132e868f06d2b0527dfd0617124d70b7559b536e57655b1a6de5d193135b24d39723e228e35f158415a05cd09ce87f1e5a1137a035ddf59e197faecb2c3d675034d05cb9ee5404fae1aad22252a62955b1825e1f700751913a8cf5c9b572a4ff6eac4cae92420d2b8464fc88edf70df1ee673d48b0622d9853961d2b698b4c35c720389379b9ac9a50674270c96b9b8783285b98518eb8180733ab4c92f7eba7b0c4a6f4ff1b51cbe84a3a766f74606af24e4f9aedddaf94a7de16b9dc3901a9de122e4fbcf7ab44be564b066a91eb30ce617fdcefef6292b80de60fafdf0cd0818125001ddef7794543faad25549a5d79da62cad2247f96da4bafaa785a8b904daa31c2ac21e4ee0f7bdfd73a2d0c658741aed12f2d6525710fca06e02c0c8db4f5bae3e270f2179f665111139bafcd791f9aac715aa1a30ed2cbc151d3ee1d39ec56f05b3c9d9a57ac04e74c10f319b1cceca9234cb3b4162d2b5657d2ceb36f066c7470f545cadab541d63e3d74ced3e1eb53cf7429bd29877f326ca91d04a6cc81fcbe2b894d9b0ace4a7471b35151e73d28d0516242ab7a2de20ae7677583b72dd5ad5fd6870b24d0c0894e3d45be6548b4c074fbc93e6dcde1acfe2c8a784ec6bbc902cbfbcd8c1fe4e73351106bb4a4743a4f64d534dac5bded5ddab8170bf2fb9ba4d83034b8f21418b1bd460c7dc6f388512beb3159abd326970082c27729318fb669b8e323fdca9859c05af329269f452abf7fb662e6cdf33a1c7f1d08dfda3fd81efa5b659994d08c08c3c24f49e3fb2cae07367f1d0adda7ad0189398d72065a5678fff66bff6bd90514fc48b76e04d756163416a516307030be9991c8858dedbeb9634eeb66c4b133c303ade5aa1ccb762121b2258cb614361ac0aa178130e2a63007d77e5775c523626af75b048d795cbc91e9f4bab9142b8a80ead0f199d9ab716038bb6df9553257a4bd9e19e151984d0726b94cc3e08fa26cbcab5313433cf20eeb1906ba020f3753591566b2f4a756f3e0e99f6119e0d6e6c7fd2257bfe93666672dbe525c1865c96257677cc3087eeaa0ec4f0b10bdbc81754cebb1902ec2f92540013cb3cc87a951ea88995d4a094e0f57c84c8574a7cf5d211bcb747c0c59ae165bd3b9b9f165b03566b323da9aa054a2878fb8b44d12d8003effcd6f96ea7a173ad1de6f5770f5ce7e34a738b7844963295f4adb010e7e70d1e91b67d73e11b92aa1823b1e6dab2c3ba857f2c46c36001a35bc875824d8d950f1def361c6fd72b7bd45cbbabe48b52b88d68765caa30fd6ad7e17d6c84fc058b498a0ab0795da4e9fa98fb0e5472fba407365001228e8eb11102af19b7bcc35abd8ee379293667bc32e0595752ec29479ef2a17f53031c42b132f3d00c5339442003a8bda5e9dabc233bbdcd0883416af8a3531c64160fe35e7a31d8ab4bcd111af241c515fe67b076b10fb99cbeacd3bd514d217d50cf5dc0e0517abd2ce988556295d9a2fd7562d24a37633625d24b960477d6c838c478806f3cfe6a7cf473765b8e40746f6b98e00f1d13ff411b992bc5b9826a5657fb462cd8acd9c5569828e51344b2dcb31b4807a9111e99f087239bfb6e8e32eeb0b9210ecb338e76bf11090d2b84cab4b3b13ac4a4bcb6b7db268f25e35a55f35d8255c7a59f60beb2d9ce623e13c3d627c3b15416011eda5edea81f27f646cccb49d0e98046c29538293dfbc5874e8141277342ad145bbfd8f0eed1828b8de3c2b59b5da5503c6318a95cc00808f41dc7858877b21ef5d0110769243e41b39e0a6ebd0c5ce456911b0035994ebc3b128284f9da6c467273d0c922fea23f3f676a1d3edded2a998509d6d06fe1ceaec93acdcd5225b55c12dfde2049f5aeb9a5ab6a27b79f4b8ca8aad533280764d2a8b7080cc923923a1404ef6beb80b5a9bf95fc7f84bb6fb862c5a368ae09a73118c0dcbf26b00695e108a40cce8b7d981ff07c4e2b89bda31c24e877e72fbe52821ff1ed511239f4e1b2a40ad85d2e0e2c84919c94515ed73c8d4d66bdc0d1bd4c9af09e319152df7ccc986df340ef914e19e472a75b7adc2cc9793f17060afbe0fa81dab0777ade1a1c273e067ae8abed761cd74cee383852a0160adc478f93a4064baab50ad87a236cfa84f85442e37164e2d46b54c07518d9c9cdf6cc880d0288f7152994953aff82b847b31625c143abde70ecd33b1ae53e3c924cdd1ef261462c24f25bd8a716260a8f1e08b8cec913b7b3b7b4d1b020951760c6c178c8280a93def9a8ca47d0229865217224916c6416a5b43fa9be33a701404cc2c01ac19ad44b26c292a5963d09d0a49b90939465a24fccbbeccc853ca338c6261b6d93be967362f35a46ce3e06d98fcc255aaadf04b8e572c1637e1ca5531c36b34b0640815f938147b4e2ee3687ca4d0b70149ae3e8e8aa510a860eae96373ab03b82e73e16a2b58376381542e23e66695d3c5ee8e8beacc34905db660bfd7a3ac66f7a75a078d736143a7bd1f2d15f67a788f3bbbf4dc040a8634b77b9573d777235c2cd06fb2f87164ee78cc06c7f2fd8622003757f2df0b0082686a82dcd92ca3c87ef4f15049f05de221a53f80fe67731ae68133b3dfae85d343ee16870b153ed908383ada0a66951f525b35b57b70d5d6694a0683687d8c83d446bee6ffd97aea730abab49c3c80f2552e97f9fc8214e0d2c24f061be09b208434ea9129d1de8929ecdf6481eac807d4bfc4a2f413b6b6edba8ba06c802845ee19380a0b96d041a76f478e5e09c0cc4b8f4a64e4be41e504732ae6dcc4ba407c6415a637b1068076025186731211bc140da7a460ea2cf7a18cdb4ddf36d7ccb9b6021a1098d7e21036abe1838c2153d8cb5ae5db100e4b5f77eb4a065ef727208f9bca38b6cad3008ca523e1e076200448d29dc5c83c6c98c4f96fc4959f0c3b41213b12a365cfb164ebd220a786ad20f6ad50b39b5dd7e7e47423ac7345d8748b60e120d72f54bd6fce50c259e957b955599316d1d919c756ea1a1090721866bea95105ea8dfe8f0deb34397004cc27f555d9723434bea1bcd997b345aa488c6b890f14260829a0bfc0f118726f5717573098681b07131156b130e73b64d550127e7fee3234629cf5ce2bc1d99fa4e1eb68644afeb6d390e51f8a4eca186b4c33f827f6978935ce608128d83e0c1222326ba19d67ca5caac852e83c7a5b76fb40949bcfce8d1fcf50889ccde83b4b42bcb8e4f1eec83ac97119ff32d4a464c7d8c25fcc2fa68d1a7622dc1590b39cedfaeea2daec26da678fc313e46179c14c6d1fc89e636c0a3a120e8b419ffba36e7d6b7faaf86cd82f74fceab3994218e36deb8a98e24413a8e4aa1ec49e79eb5ea4bdbff48c10a06bb115d812f493d8476bd3fa5e34d545e14e640b20f4c4d1391164084a2fa8cfb6d4ac6094fbf59bc2e767bc50c385fd6dbfeac4e93b42f18833eccd0e4b9bb28b403f18bc27ddb00050f5250316dcc6b8c99cf08feaaac8c68cb692d3786ff573943c64eaf0b2d16a392ae907c7501e5cfc0902778b32c36eac6fee1c3eac04ea4122d9c3ff2b5c6b10676cb13d7680c4b7ad7f5285917dfaf367335af6c66d69c780ebb99b9dddad774924a1e1b67a7a9cf8cb83723d54f5f23b071249559b7c97e51f4e7e80c18bce3e955c6ca688090c798b9cd99ce4ea3959cdd49eb01b9d42bde8f4e08a94a095b6533326bd25da96be14010446aa4239521c147f8c7a465889dd4f8a01e3665e5ed2e8c860d079cc250952bab1218862a26644544113f239b760b0d38d2a579876a8cf9a3814610d4cdff44572c74745d940f6c554853b76e527bb4582d5eed4bc296a34b96e1aeaa41c784ce227e9735510ae4b5d5a8c809176d1689972b6839de94b205b4a21d4b9236129a5aff94ba469dd4ec1e06ff72af295b5278d29258a6ce4e5a434f05bfaa9217423ebe16f45b1064808d3504b300f7aa3c381c14b0028b9dd1abb1100f6f23ba4f3485c3ec79aabefb89fc7ed4f41f2bce3fd19649db15caf25490e442cb332448a61a43a986b407e5792516db72e80890f6b9bf2c17b2fb45a6b42960a5087cb5fb463f336b766ac4c77673d2619c660ac39b3860a0ab59530ae48872e4ebeb1f9bd15f9311380d22dab83ec0ab8170c50f41a8ed5c480ba3e6eaa87f7224990dee834ad05f4218861ab21eae37df4b484371b8dc35d039bda38c338f36fbad075c24a9f23cdbb479ef2ebca3ed00221bc5f41034128d0d2aaa93ceab18b84f954d7b2302924d0982c1f2bfa7b52b1bc7ff9257fddac5ad7162c623d900a2a9402951610648de3e29f8c8d0c277a75ed35712363f77c1411a32efda23d602e08f586e0a0946d77bf6fc7697fd1bbd14c7373e5403d0c9f2ae84d49b9182201f0b429ac7107480ea7236c4bb5f89b5652c06dc5a50cd24e7b4bf3f0d2aed448c3a4f9d4025ba20b0240c7ce5f1aad778882cb5ef2f561c4ab44af6d8f6fdb64fa6e83e1c4f0000f894e764bcba646a76661191bca753f740368fc1a5fd9bbd91d7734604972e69e84b3046e9c2a0b8864b1d3868c0acfef3c3f56a1c48b0a37a545a7e9f032ca1a8d04de813114707d1c1b8719c824a798be2e4b7e4de22ae31a503ab969ee2f061aba812e3b03fa07f4f4a0500f613b02f1cc472a6c7db27df52d898906d38a03b65a78e00a672cbb77e3bbd3b23f0ea08f8fe61090cc156abe33f0c367a17f85d85b42314fbc6d0a1d4f35ff612c9713efef84db6b4be82bee1a2ce30cc653ff0933698c4b725f666dbdab3d8c9878bf8b61bfd54c7b9f43fd468a7256b0cbe1b1895b6bae376862e1b58838a5210815ea9cf3b8c4e99f55742f95fbd60f2bd079b38459e87a1c8201bd695b3b54e9b9a5e7dcd064f48cb2eb5bdbea1b20183dba4890d17a98d046563bab2fcf82820d15d8b7c69d5adbeebb41c8c79691f5ac0bbefd5ce532482247b6ea20d25855a2e2f63105de5b018b7c87e90ec8e3688de69d2676b8c4d8986ec582d8d434f8fd65b6b518c89391fb9774b93a3272d565c359a89955df063b33ce21b255b6d08f4690d079bc8301d1a4ceb5d463fec0c63a8b004f4ccf656d2f673337c74c70daee2b0f935ab7d5801ccc6b67cdb5bf21a487a9f31e445ab0c9f723e3b9645e52c4dbbf00038091997814466ed056250aaa06124f4aac6aa88c1490509c9cfda973298b4a479baa703f2ce3442c4e96d3a35ce59e428619a6fe35f4d8f164d321719ae0dca76794c6ea7cae92321d892f3912708aa65ffc5e88e1ce17484a736d38b65c31a362f4e0029a24d37221707fd3bd5f7ee6986711c49e888611cc52ef40f259d3bc1c2f6e0ffbc2827d28e147fbb41ef573de0e7329c2b09fee58f62a12e5664d61f1c8c37b182429a362601a19ad2b78de8f36f530f4d2df2e7ee19036f60e0925923582cc85a633958c5158d5fef193972a950a72bb6bce62ac89d425aacd91875c1a1e8cbae52ac3f5499689202db03e4e8d45577cf7e81b707348577a0170f7eddb19342e5d89af3bcd55dbb72c692459a41867cfe3a6c959127f44fa56120795ece54b567bdac7de3119163a7a28f9da6e061c0acba4ecc50beb9692481f3702e4153ad9cc989e4b3952f110937a1f4f4f90fcd42c4d0652a40f94d833d2f6a3452b9b2ecc3d93013a85d4e004c71536cd4b72b26219a6709f7df842c5e7c705848ae4abf754669ea9443a1f4aba6c1f6b88260c29953dad429909585ac8489826d59ff7da57698229f0b924d1ae9477aef98f67df3a3c6731f3708f8eeecbd9a07e3588e1c11c5a212daa97362e2ece0bf2075bef93434cd21fa66ebee5f14885f73dd5aa2c0f65235db6fce4b38b810714263ef71ab2bcc760136c872839734bd32174aff2b351a4f336bc69c94b3f24c284a7724b3b457687500f643004d8768488dc4faf989e2aa0d26c41f9de66f9af7b1bedaf2d6563d7e4ddd297f3f67aadcc7315cd2fb928c8f262e9afc586da1da212c5a1099b23e43a3e5eba873bdc9164efaed6091123ee1f56ed65811d5abf721296eb60551b3ed8d765322f3720e1fa9857548554a082c1bea9b5a1a90fe76391ddc8c231ce4a390f82796c76cc11f603cbc354f2331981e0cb0aa7a85e280f1706d39fafb188e36d330abf5952a3dfc8689cd8683034c883bdfef399ba13dd28ae96692d799d6066f360a87d491a204caa6b80254c471e0deeed160bc82d463d318baf496ada28835015a84103d760072d99fcb7cbd2eaf5fa6faf6cfcc6d2cb4c2de27229d1a458b5844f53377e079e5eb2aeae536ac7c25cf0f03bbc832b693ae793361b168c4da0470e1248708f68ba40066757612cf9831bb906abe4988d9a534213d30b18d8bce8550cbb517ffcccbca4716c789302093a4a3c3f5da2bef6fb7f89d642029047b2c4b1049351c102a2f95af6f392825bf7247aeb70e253bd4a9c06893da1fafd60cd8db8a89d6bf87d85927b7493e0f7bce81134a0c00279cb28288060af7f3a6ce0214c13cb441ab6c9b68e7e2fb4690605bdaf7fd431a8e7b45e405d63a37b219cea336753ffe5e946159472be632c6cfdcec0609777c73ac1164d7666fe5c3964670315dfd5f67f8b5e21f4d873ce4c30c2fbf5723b413edeef0c6e31e64a1ec7164fa1c78ca903f9eebb66f66cab4e6f48c6a10cf2c36e4e5701875d01c14c45765d8d938a89f12255c55ba0c46fcdd9beb4e5b044ba43cfdcc16430b75e4c6015c15bdc3625d18501d4456001685530a35b4614879249b3fec08765ad7d8997632f7efa35e92fa2917cb6acaa417ee4750e44a261e80aab1b9363542aabae6becdc7976006065fb830321ef3567a565c26263d23a27e105d19e7a94d565054e217ccdf80c180f00451c09b02967534509ec262c96ee7754bf565fa0243638ce9f750ed8df6ca551563be097fcbd1302c9fffe29fe882838236f64fe9d9ba35db5499e90f0faa35f34c7490f25c56f1f71327e52d7919e00ac2e3d08b811ff8c118f0fc8c73e938a7f62a56e4b3cc20b9e18092fc897234eb8374a76fa1587da22a9d4e8e8a4f0738472886dd37fb647bf15312938157282d60f0f91ea32e6b8672e8069cbca34aae29b5466350ab66442be78d7ac78e63d940a1f11eed696b75d8194c3f71afa811831bbe0066a3ce1c77862a3ac5df8ef70dcdb4f9e9d1247844774afd1139ca6a3ca0183be1ac430bbd76115ae214518daebd6d36fd2d3f969e4b2561040a58c03e8d799c2a8e6d1ae5006b6285f353a50bb9425e934763d8cedd08f0b2eaf91c702a0baca711f550d76c60db18463d460c085bf812e53944bc75193484a05585babef6f2c1fc83b67b02174c02d3b67999f4e18ce2d068e5515b80b4e0f61503049362f7e019be52b90ab93dab6367459ac3fca36bd099c073d666f82fb2e19e36ef76416d2e4f2e7acb6d367bbdf8b2f7bed3c414ad74df0b30f389da9d605f39 -MD = 398b4e5c2570d043e9a4a037b0a01be41ce56d58a26a6014ad7dc5bb435c86b4f8e1f8d9673b0e4a50e1e548352475af8b1081f3b618274a77182a49a1d9e877 - -Len = 48544 -Msg = e9f1f2cf0b8d563e2d20f39f9f464a808b136dba364a644683d0ce52b960cb94857f1adf43b37ff479f0689aa453cff138136203e2b4e29c107dc95cb32d2f0a43eaee2b047a05d389b53abc763a04958a62a79cdc72a16f6415451fbe09a6872b18b6dcd94aaf856459b22c9c65ae1589e984aeacee6968887e8bc6615cf7b344f2ba19478b46af12c218139e3a98183d904161db8e012f83a2e377258eeb389660410bd8a593fc9cdab49805238947af4025dcf0bc336b5d67945a90074abb294b95d913005b110987cde45887484ae6df794873dfc5c41fb7e8992c2fdce70699fcac8004699961b3ad1e1fce9ec8ea5685ccec5e80e4d0792559816f68613434bfaca81a843aac459a6fe35f5369c48e9191e4a32c70789594c5152db8d4bb02260012a8739cf325ddff2aa42fd67b6ee5bfe31591131ff27d0273d292e6a4ed78d14618ff683e3bbef57f04fab717ddc97d6f1c7673ce7a283b20c7bf3ff6dcff46cdd0f046936f847967e77bb3a1c584f31220a5388d14dc96a5730788b9b601882e3a0eddfca979b56cb57b73200d5f4a5389e40b62a8e33b8b3d3169f565c7bef1bc20d680d1e3ce15d7c29f9c9da2aabac0fc94571f83535a8f0789b3d099119fc0f0d827cf0befeab318de1d5d953ad02bb57a735f050698d04f91fbdfbea9bfad448cfa8b393e74b245d8ac357f231c33d665be51b17bcf67d228d37a80add9ebe59a00edb5e33a3c1036500daa8c274029ff41ddcedb86be58f74589254676e29ba942dec607c5ba42a012cd5c9e77bb74ed03eca64d463ca9a658f4f69b1dfa2d61c644b5d29b92a3bdf85dde81960a80da0c647ffa96498cdc14a33bd5569b656c9609cb6b462efb360da5785c0c97156c652fa20afe4dca41827f3c1ba92d096fba134dfb4ef412b2568d71575fc9fa4b153357a406b02b7ea96e40969f18e215384c86a9394eb0daddfe139c1907f920245ae5f037db773b9259916dbfc4b8031a9abd9e91a39c56a9dea450c1bbd8939b8a96171834761f432975c9919953e468e73901dd5b9fcdc2176d9ee04c604b81adb0413224f0d3c6c435d29e007a5e281a43fba6de81e8318fb6acfd2259f1deaa7c950b14acff231419af6d5ff719641b23b473930a4efd30c7a2a0a58b2cbb69423c2d6a734a60006889871f90be23d22153cce401a72ee0e7a9523dbea51fd24a5e20900d5c876f6c8772a90ef56e2785013938309dcd895fe99952b90412cddb216aec42de9f4b6bd2b86438654c0296e543f85dd6e0127889004c45f09c423eb095e8da78b17bae91e0b7d8b7c54b9d28718a51fa726377b10c932a11c619bc3129ea9cd1c4e77ded730cb493e1eae2f14c57d4b28864a78b478f3010973a9bcdac5c5192e077200ef8ca969fa9c7ad695bc7aea62cfd4f3c38a81e95188d23aba8a5c1620d13de1bf758448624ca46b72643a67d6516b6ef6747be474ffb9ef4a42db4ea54a3003df92086ee5adcf405353185df3c9725ca5dd2d6cf466a52cf295cf2d2bc0fce9b8589268054e3017811fa1376b768e4f5a1b32fd405c38865be9a42c14e3f905e23fbeae319c8b33a410718e7e1713b99bb5091ff92ef88ddeb4f6e5f111b8ead5bde9cbfb17453734dbf5cddbf9b72de3413c4f8f7d59a6038e33c550d8c10b1b69b02be25ce284abe89a6fe5bccd0eb93638f663c5c06162ebe754b4a785d91bb98e5867cbd7ce81acfc0f2bced9ee960a7bbf2676e13265448e1e8d1c9be76f33e0cbfbe2b9575ecf87062eae725ff2449104382f20bb932ea47d5a9657b88e4f54112f4ffbc18b96c7ff6eea0aa5665b0560294cf34f6510a70bada36dcee18264a26252139f90b92b555cf027815ae4455d6a6efd7063812253d6d2228d11737f0a55978544169d4d92895f4d665846dd568bf393b106f682c096913a9586792fb3498ee55185c99b516485d0b6e71939d5fe795aa3d7f764dc4d6f0a5ac929d337deb6a83a56b4a0fc8f1276057fc1e766426eb6ab5efa25217bca165f420c2602859d528111e4db0e598391d49ae76281f8523c49f475601a9240d3159976849ddeb158a83fd0b6016437b8a6b0d037b370b26002310f92423151e510381f6b743a813f12491ece603fcd5eee6a32e3755c1da666bd1f3812c98bb0c1965d6720298b7a71c61590c53ca2f93e1f85d2320ad283e9c12abe16db4ccabc4cc6f42c3c3eaf392f5b898afb671bf8592f90841d9f8cfe15c8b0b8d713a762b3d29ef2e32921caed67253bec683bbfafb6bae5f4d33626035fac935d7ebb577406c40eaec986b9a8bf00529044dcf67bb1add2310bf3f412860e10defc8b0cf5da0fea0f9e5287b9c99769778b842f4586d5d342986aeadba261cbcc0b9af5c1d2df1f762609b7c92d46db129aa5ecb5ccef53ca36ff7cc75b242eb52a7f945077ce1982ef00bc2f40bb41f1f0c69114fa46fe0836161c5e06d1b41ae78d7b3a4f3962a657fc2784aa5118862c7acf1b75691cad34635c183bf6e67db1691ce7afbd75610f406c41d0a4d94fbc16f911e4e24a29b05bce7e7110504e1676fbd13fd6ec4353620cef3a130ecf1e4fa190bf3ef0fe1863b6093c9a6c1c955b8a9f75f211bdf2f58bf57d481384c1794b207adbcbaafb1fd530f511a469ac7b6b9ac8bb90313c6f5bfce0a0a1f1441868499e4514b0c6e49e9e40f293a5ca4af16bce7fe26dbe341f5e2ac914a524c19b64900776901a56649996d9a4618d6ece7afddb7293e6e828a1a20df610e1f92709f69f6bc943e9d9db6d13711d544b5550bd3aeb7455001a6fecfbc0b4ea23cdc248896edcf21360ac4a5c6449bd652885a33a976f66f066f1721eff01cbd5e1f5fc31fa4ba3679ba4a50108672740aa72364710e5bb4d810ec7f42b97f583f64d88358885c66add5d03add80630626dbefcece287c07c1af064f7b0e805b28d118310a42bd971c82decbf5d97574ee4b45d9876c5f510775ebfa639625ae618ea633fd7ae5b20ceafd6b1f3ab1a6aa20aded66810e78f38925e9c2fa783a32c40af3f9d7dda0c635b482254b1d85a281af7231109166cd133c8360e281e5e39bcdd7c601ac47928a8c78cdb3c4f71e97d4d0b1c0ee01dd3db62f04f44798bb3a76492ba15a91b7110cb5e01babe56589a36fae3a2f336a2d1d5778dbd23c03ca8db0f25ff0657ff4bca1252adc38c080a5b8f0255ce3be0bf862823d2ab704729b74e1e275aa305824a566895ed677a460113e2a7bf91f00d0b8ebc358f3035b27fcc1d3f14a1367cd2769df39a9d21c5ee361f1965cd6342cc17a1463d64bacb9b259d96c2c70493e91f7d57598181127972221b4f62bce94e4f9d9534a238ed9fd739def388f26ff49d8131b8a93aa41934762deae65f6908c2eb93036d2291045d5c68156b72599b9d440336989103641985e1b6cced6a91ee35d0381a1a4e5f348fd2b6e326e9347b304c31c436a8e08dfba7318ac936603de6cd415d828e16d94eaf468462a755d3c09d58b09e1cf4fe221ee9b485850a3e88fa9d9bfdc8a1c8134e42c3c81c86238f4709e239d83806a3995dbea4bed66c86e8cb59de96b68d78403a35c9a12be70709d3dd8c531023faa6fc1da94c8b548b08491bc7609ba5d815ab3ed9eded8a92363507182623d291d84355f5c66f62efd995562acee78dcd4f04539b4b11aaeb5cabf36fb9d99f03add20c2cb519343ffd4ead8b3a10c1d24cd42860515eb46cfda726f596a7e5ba881684c0810f24f5b3c3666b2aadce51afa901db991b338199c5164c35154341078f7423c2b7d1abcda2253d19252ff5e7e1946f7aedb4d3a17455d62db834119cbb3ef8e2a9a6bc8b496e93adfd4329761c348e7f2c94ddb5334a15d8f734b6c81869a2796b30b27d57b6e121ccc456dac786db2e7e600a3590879ddf68c19b0a2578a2ef72fc38242b72b84cea1018a661ffb80159a2d3b30a72d0a9637758e370d08ccd3765981043468b57fbb2e9397a03b78034e9e4ae0fb050bfada25ae47925c29b4f095cb24d86dd0b682943347e375c33968197972ea4809a7dff2b7dacdce6c21054109aa8d81fbfc5efa107fcff1883f526770ed5e402b27aca452f8a6a6bea31d23e29c3aed5ed8b729d2464ef6f09e7250d6593e339a00ab0326aa052b46c1a005ff04c7fa23d2f5ea22a548cd23dd329b53bf726a7dbd42d6dcf7d2a62d03f6ad07e91bed6f728003a8a3a3bf4884f9129126e12dfde3dbe71be8f55f9af187e3a35420116d41c03c0b484812881b2e7b359675c442fcddfc8c84579eb614bb717b4cbdad42c61e5ff39c1f0e0a2b3b9fea1715767390b0ded6d3deaba8f3fb1e36d9da08198900320aa810fdf73b874656b2a98cb925bc55a2dd73cd9916adb17d03606b1813cf7ff573042576d47a37216e1a4e3b45682998abff4eb1063bf3f7d3351e67ebf40c5f05e1d0b07d7c3cf4544e0422771e215f446874174a0bac4d5042692f99d5a1ee679144ccbef51b776a2ef695444606a0b09888f46a87a326836f9498a6dc084aa0fac9f31f4d9d51baa26cbd3246a002f875d16fef15a22b72a5e6c99970081cb806a94d29ec8a2a4c93adc1cb87b72e23e999b1601f6f0427caa8ebfaf8680cb89c2a01633baaac26e702ca977113cb39db26e2450cd358aac7232552def1c1a7a3963856a0c57d5288b3001d6d7b824332c228274496cf01859ca028896be48d0533198884a245d85c088ae5e1b9fb47d8b3ae8c2f801236eb5e8304619e1c73a94acd83500aadbe4d4891773693dd50b4419aff3559c951e0b0f76ece51126077227bcf6ac55c0e42bd3c5cd5d2d163aeb61505bee89c584ed924ef384e6e5c57054cf23c9bfcd022adb41b243e7e8aae58462832f631551c22310e075bd76f313968762c54320ad761203c8d9e8dcc9c7156eff94b334f32d34754a341f5a2ed07f6e3a4b7a8c64821a94777bba53260476ce27baf484f78348d4875c771fc73b71ebf0b8d060b5d3577c54a5e6fc2e322b18a20ea185cd68c2c72e3b7f385ab910a94c99ef3e2fee4b13e6d4d92860b4c4d6e51c34c7e34254b5a56d822467edddfe946b21851137780384a51b786c10c671774048cbd7a45138937f1a746d2e2c847e9911d6384360b3d483186c9eea9270bf3737f229035ac86eccb298e91e9eb351c02a91d39697bd4cfb7a657786cb6d434d9ceb45e3d3dd9df2e5124a13a703b47cf64891b58f78647a9c038499d3cfaa1fd217ccca4ee0b76e1c712ec1d80e1d0bef8ae104ba8d918d07b754784e003a0a91e80c3b4e9a31bae326058da43b020980a940189b557abf480145c68cb799ba370ca29b35329355b3b14cfb8e02f9f244544d75b478866dd76206f9325e3f9b4bd62e8ea57252cb1893838007fe7b52c4ec5780986f3b252069e674b15ca22a4ae4ee6a11a206778c5d37afb4a5ecb76d01fcedb9920f81cd8982ed9c3b57e3bea980d20c7a2507896ee7fee671e47cc715bc018a9979e039315ab85582c75411a4843ae84314e78a5902e24feaf93f4d980350adde10ecfe01ec696fcb76f7de56472947957c94299c16fe4389715b6b19617f75e85ae4866ba6756d6dfd4b8f4f6811bd09b299c1b892a753c6037dca1a64d28530be836cef1760b0f2b0cbaee055888ae85d74fd3f147203391602c50b6bfe5e5fc2360bfcbdbfece247f4b7c9adf263d9e39236800af2d45b3f77067d155763cdec68fe2517e773c50953346bcfe3ca56db8df83bf48e4994d666e8dfcf7227f3c3b8bdf8a48bd8139b739f3739d110e7bbd4dcb34fb8c58e714ef6b418d32d79be91c5d7f1f1ac4674b272bc7a4ee9f4eae33e969b16fa90a69baa9a7ffee6b85380a0436edd42d61bbc398c1fb1b8070f45a846650d3b53ccd99ee36359e6481901c7db99834e6af6dd6e0688ae0da69f88a4531c101a408a852e2f7178ae918591b7010098214d9cb27abc53a85d5bf218ad3d4ed419df362ae2ef18efa23d0fbd084412906e2673b80a2def15198fcd624d857bbdbc88763757a2d80353934de006256df0876e227a76cbd988d4ca7811ef9c012164e4b146f6db1d78454c96b76b25612cff8d2f665b26a188218498941e019dc3b57c7db63b087792f9c1908f91b4aaca491bd10821ceb577525695655356a00920a84211bebb7507e38ab1e50453994cf682dddc6514a3fb19a8f50229fb9666390094f5dc54742b851071644d92bb298a7a9c5f9fa8fb77da044df6fc710f6f611decbf2e64139270eb6569d7f29ee4673ba30e2bec0a6205f0e6b0655769892b48cffa2f7ac1c11983f4823de393023f7e6864a46e7f6e3fe785cadf0f43481a19a5134a091d3bf162a539d9f66607558b82ff93a0b8e0ea6071a2d4090b20901902b7288f74579b100ded569b56685c1b593b7413556e97e450d4eee54fa73fcf7f42258e65c8791475391e5302a9b58671a4c036c36bbafb99dd7a248f407b956140db767ff30dd8a199abbde95ff45552d7f29b816ce60eb33920373890c6135f3fb4e8016bdbe4e98b892c78df8b10732195b21de68ba643545badd9fcc1b1cf9b4c53b8a765b1d38b212f4fbcfc40693e340b076d2e5ab0db96f8e1f8d10948effc3a041a3dd7e6152e46cc8cda5d9b6a2816cc654084821b6c98ff29867241aa5f0b6248c6bfa7b5eb037da377d080521c55eb7354bc4db0470e7fe354955056ff5851b792e18ee9f1d5e1b58731ce627b58c2fbfd7a6a26a0d9e2dabdeaeb7227a150fb14d6022ddd4e87277b09cc37bf9001738d476ddb148bd66444db79889266fe67df15a80e07dddc6db5b1003e638c258e96abdf6a1c84a9046bff8116ba29a8a25428f6e6fbf4601cd9d000e301ad8d81abf015402365095fa5bfa888f959ee1f167865554422a0a959ef54c21494c8113fecd5f9c39d45ca84a4466bea884d52889c79e55af91c97b857725806a263a1b4da67f377ae0cd98b35e14c083534d14cfdbaf3bae8326c77b0c0117286cea7bd4161c9aa07bd011bfd1f85dcd1330fb6249f2cde60909c0a73e48ac28287b7cbda49e8e54ae4d5d96247c5d2fcc68266999cdd5002a5aaf329462081561d4642dd96ddb3e802cc25fdf07875087dcdd0d54aa19a3ef01dc4396b7f39520dd7b4e3bf14905f95589438b00a4d94c74687601f063785ee68f03cdaf35506c7e0b4854939f5221b1f969afd17c7121180ecb2807792782f21099c0b395f04d9f5a43acb9a7cc01265cf9d3e1d7c110b0183551572357600ba62ef829dc1acb28b166c9cd271ca09df81d7f987d702024cedb05482bb0021a9beafb7bd278ef0158d93535e8e906ff17fb3c5e3627595c78e6cb4258dc6f0835f4530f3fb2c01397c5785bb2dc3c32ffbb919bc98ec4415e7d2cad7180afbbbd75874feb704644b65218a54d9d4920f88607b7ff4c68b9c8c9aff13f47cb1d7a9420a29e598a7dfca79f7d80d335af4c84251aa00a4eadfdf1dc768ad6ca15b67aa56f1f1593a7b3ed954a142609c941dc732d746f7c06461e3ba419d8b48ab74e9e20374d6aa8214b8073d240cc5521b779564224fcaaeb7855e4b6f39166c739941caea9156a8eeaea627fc6863b323cc0fed4d0d6833426b19c27cf6a902c630ecb4cd09ed344f15a7ee6633f63bd94cf8ef01c10786851d736351546f02ef39495d86b0ccd8a89592fcebd00b509e62e6c5fb0b470d1205018a86d2e6e1712aee21c21683fa7da6eddfe7cd019605b6602e833c955b5bca3ac487e29f22de7e51ade9bb910e40b21f03f49b877081bfeb7554e580e5d4c5858ddf13f64ba9bc0a5e780072a8945fad059ccbfb74a4d7ef26da8688311f9f8862e6d78ac0455c8ebff795b74deaf82e614acedc16e196e1df7ea019c19eb0a9d049bddb2543e8355ed2ebcd62a72409838914a7dbca8579fbcbb2b41bc4916052723755ff17e7b497b463238b7b5bc4f8c25dfd37c22c1e084c4ef5a433ba4255fac4999253c38306f6ac582cba17f74d90db3acf5af324816ac54cff6eb3d6774de5f4936a0407392417e9caf5e106de7f4ceee7075343f3c1c63881d7e68322d63c1586dd31d78ac74646fab13f7a47e803983359f4e2dbcbc236d001faeef53e077ac12fd57a985aa7fe106e8bd7f6659fb518c53097a5f339c67e7f49604ae00872f6d45746de48cd8db0a06e96866281c42bdb9eb8eed2ad65c1925a8da0668fbc7c5d4fe2b93c17646fd9503c64895a53d0ffb7ed12e48da36dfdb6cd923c3da5e64d27d4d58f2620828bc9401d2479d29cc3e4aacea36afdb813e6b69cdb72ddb9066773afcc7a20bd3a42381cde70cf03aadd685e89b5d3547752cf3cbecfb2692b8765a47e74035467538ad001cfb79a16daac5f120ed2a78a937dde60c4c27b2f1011500fb4370c8565bef358f70ac4ba94ed5cd6d66a45e011591e6bc29c63739a1d3f1aab4a3a26f15ae32e876717f874b1b4429d08a3fa64d7593a698eb6bb7dcfce09d9ab61de9ed53c0ce12b0842f27011dfc33c464bf67f3b472a47e94943df8967cfd907fec -MD = f52e19999a5773b270b3ac58b152965e6c5b37ebb082d1f7a6d723ca9cca7e2faf4bbcd94ec326f16d350592ca7c3210675ed12a03b559ba66f9e681dff9ae71 - -Len = 49336 -Msg = fe3ef26e61c39720a8176696e1dc07251db3261b7e0124a591f30df0debfcb8fbe2d991d6d57ba2360ac6a3bd93b1576b82fc7fc9495e4f20a6619a155c192d41f786d8197ce6facc47ff68919012fe1490a89b65d526a2a039a209d29ed1a16ca2658e408b220857c97f3c6cab5bf2c784c569300bf1f1523980b2d81cbcb1c673f418ce88a34742ffd473b13e02c20ecfe15d9a5656b7a1367c39985e40eb09dcc0fc25edf134285b7dc301d09de854e28aed176cab7237b0f2f295fbf499814d3acce923825b728cf98ed0fb83d2345d008c3987869d60199362534e5e69d755ffff8ad1dd19abd4c65b91276b1c17a000df736f7eb5c500cc2d42fdc4b876875f088d71682b5ef372ade4ec9a22994bfa4b476cda37d0e70ba7f752ee21e941f67c537ac9dce6397cfa2ea3c78213c16b5448084fb00e4cd056e3162112aa2644cf9f6668baec4743b4e0f549b721a0b29ed7da459af792c8de989014272394d876a3bcdb41db8d75829e49b73e4d5a9e6f895b3275076943938a592dcbf02e001602f6780e2e7c70d7d9298693e16f5d5adef3bccac820ef1a2ae9d47d9a527a025fabf58c7fb4c429040d3e34a84f9de53b4c3b08b46a19d70ccabea88c92a4d00c35aa292996edfac17d54acec8bcea330bd43bb5695526eb26432f9416f0f138b2c2c70c6b36cd173f2507938946df961df5d5f194327258e5ed7dc436817216f17e30fd19abf219df4b806170a0a7c212aee6086f416a0230313de1cee5bae2a516442d4bd537fc1fd01fff25d128001187d6c3a189f6303098d5b38924afe4f9126a63a8bd8406283b4b374fe14c9742090de8d312ff290da9ae020c473b6313fb0c69d86ac28122146bcf96d9f9d1cebbf43face56b36eeed3096025645a91b59910584e4d7b335e4e990a4c019f4dd25f192d509249ffbeac3371157b4fc3ab261005434ade587312c421e9e934996d06da7f58610ac5e2ad0ace15472a59790e421ef612b5e43869cadaf7b4f182243d147b56519a53c35bdbe1b5466eb5c7a8232fe7338688f68a198fd6035a9a906833abdad26d1c091f43567607818aef9a3f92873be499361a3cdb0542d4352a2ed48b4661e790fc8dbd96c7f9073b794af401668a44a79f80a1271601f2f459e75394399ebe55462dc71d3b996439fd30ecd6f5ad2b366b63e30e88bf3b6ab8285d4114d745db5e55ec7431672d18e3e2868dc522fcc8421a7efbcdd911eacd784e2c78aa1295adbc9a1659f0d65ab5e65db0556a5dcfbc3ae16955ee1af6f24da2b0c585a906ccb84c8e15b4d461eba2eed91711b2df324b96f1d17ccb31df1ee7789c087db133ef9045e531bbe10dae96529a87a0593ca32c0f90f3870ddc72a8ee5c9105376bb8f1c848d6013a947000c7405a8ad033f7fd2d44e0f2fd82cf538c97cdd3dbecaaedafd13028e1088d9aa1b8f8e6d6c0b0a6d54dd373835abb73cdddfd7e412f3be046eedeb776e25de07c54e148cf6b4395821c39ad31dc9d963c8fde48f9bbf276382210116eaa775ea1b4b2354c8c4765de4081e48b810c17533dbed8581b552bfdfb92eb2ad95081cc48da10b0bc3284245b5adde2d07d83ac583db0feb5ea5e02dbc5895de77fe66691c78fae637b6d0ebd12edfa536867927fc94750140898d15336905a6d6bf8eb2018e6982aa8acf7f648891472634fc004e02ffede567903e25484b2d38b35c4643cda006a30b07a877a53d3c5e4889f9820cf5d4d5a5af529addaf9a28429aceea1be69baba1400f106c2aab662ce9ba9e999ee196adb3f69b1078152bd40ef1ff62856949b4415c3ac5a2bdc746e4eaad934339b2e563d42ec9f0c8cbd181588989c39705acd336fa98eb9a08004131b4e12c07b1b789945ef05dd98fa1bcab9078e94e67f2be455acd4e69b1c1ca39bd6ba171198aebde306d0870ffac84911d173eb5f8ecca32614d13534bf045a7cf19ea9f74c55358ae2839b6a45aa4b2364e0cf53f03bea517fe827f5df77b26f3d34eba49d287addf0a38d20514e2b7e6059935c49f644585c9e3156f3d345c308116ea21184f83cbf94cedab40084832242f9e102982bbb2967d3f092a37f18e0b8b5683ff75837bdebe2f1c48dc0c24931458aa07e1aea74e9923b4264e8e1559f227f7efbf54f6a2d6bfe29227acc33a908a1aa349c76ad77fe9f7993fdbce5396840550f79e442bdcc68588b0cf1701ed5ce96482ae051b77ba5bebd37fc0e2be96368ae30b6e63186b8b90411e29d171f79eb1530a7f01c9be6784d223f3ecb18511054c417b31d2d77e14a04100906683c1f48584e170bc1ca3cd046e705ab8781f2af9e8737c5131e57b96dfa4281227db94e0c3325299fd972c31093e151b97e65fb4a95f2edea2492deba01e7fbe0c73f92c707a8ea888cc0a209b6504220bf00d432c462ec1523192672e757fb15a118b3132c20c31e6c9d09acdee0e15fcc59d6f18306442682512d22eb10f35383db2b7b211b47c3e16e46747e01d3b91eb75001525b8a90dad15f34bdb1690ce80d685976f6ed1b93cb04fb04318ddf3ecffbecd2e123d685203932bfa7e0b45615f648ae422777fc29a1ab020e6434a50a271e5525a47a29b447a76162eeec569b51c3379b8b7b7300c8ff17e71b5bd9dc5e0089a780fe2114070d5380e81751e4075393518d9890f6d771865a07b745dd2d4dc0c54dd513a5f3def66060c7e0a683745212a251ee5259ad0dd5bdc9817301509b3d7f917a10aa86eaafed608b59629fe43d7e29e3d9cc0bfef8a215154476b3894e7aa5bcba77bf70cde283aa630140da5055a319c39b18da21693c69b7f9e11b96d3a4542a07c35938e4a3c65a0c0194f9dd3fd8c6634e3ffe577207440753b2952effe8d5b74cd47f684377a4cf5cb4788962d948b13690ce0188667f2b95fec7c12ae34422a6a30ff1e536e9e7bcb97acebe73d0e14c6d3efbd21fdfd32240bd5ea7cbfbb68b2578f5fb7c7fc19c047f319530d5800a25cfbad19bdc9a8338d44c191b730f44dc38f908c10d099525d446a9b8ed19ea7adea319530bee3337ab0dd15a40897e47ce8f9f9ce81c12ae38624e448e1b87bd0a691bddc45aacdda03872f0cab191f8b80e2278b775af0e0a39059c2f114c6cd1515ba4bc4c7a9b6240707798142a5f741933dce1a2b4c5d82f61f84677c31aa2105b405a5006e15fba5c672f2da1fc812536420d2fee4610b9e6116adb56371b1a8d2904e1ec40070a9948066a83407da6cc408079963f426cf4501298a052aac473d7629e9557e6b5a982945758dbb8324840e21c56f1ebbd3f3cc45c2bfdbfc2a1d3f9c28c697d402fbf8f709d1ecf4c4cdba884ab0e8b2f094ff6824388e8899997111a5c25393e7e472e42ca9a21593c695a4f0d059f36f5022f97a194a38dcd996ef26efbb90517c2174a6bde6cedb9826de7f747a67984ebe628a0918f43a06359e74f5d6b48aeb8c103eb4bf07e26af59cbe4651f4b2b75a0a1db1ffa4fd48d786577dade5d9583b1ebe3736a8f2658b4776eee98307b27f59fab907306bc6030f962f460c85ebb708eced529951b06f486f1447fddd68b4b7ebc83880cda941a1fbb2ab12d7ce8734907f1bc247752905715f75487d01818cb6869b7d6a1819a44cafe4dd1726330c7494990c1ed942e844777a4e2fa46e40249d370d8c3c148052cdf7578d1e44f65fd5d55d1c064158af055ef53a79043bfdb21419793db99dd5b5ee6780db415c18e9d69f8b24aebd7cb12927e8a9cae609703b8a7a4291639d0ed0f43a88b2a5687aa4b8b15a127e7122e4cb7f5c49a70f7cb346d773233b7181a6e8014b1f39172d4892d7d1f405570197c948b907e7d9818437d8f9f78b1ab6772a1e4c1180edacc91344b1dcb9f5f548098be98e0f2d25b744c5fc95bc61544ba2d9b410e2b29f2f254221520215a7017290146685d4105354e5a386370c042b3879aba2c72dad83af1749df487dbec9ee9e6015b396eb605181175163e36d1dd448585197277fcc980c520af3f6e3a965fef825ff3a5ee722e1807ea7b0382c5e8ce4a4ba68bd12ca69645c6b48bea7bdf9021ed38a10eeaf4d05956d390c5dbe8e772398b80e5d2c76a65c193bf6cedfd5a786964caa80e00dce1f1c4792badc96375799df1ab6a67b419263973423b3da0ee7b049d3a29d6804a41ba2714aa0eb4fc726a48a2420bf5d86b2231fb0215260c88949345ecea8cfaad4125215f3d7e5fca5d006b0828b20c16fa8607c1283c4b2891475bb5b1356bbae5fdd24bba0227c802b3561b427b5ca00ee9e8f6cb6632c18713dc22cf2c25e1150b97ee28f2dd11d7dc03f9fdb4229cfbd82f2193464be9e293479298c3a1c65af8f2b4eec2f82e68e4e5229eff06742ddb4acff42f0f0830403ea3b2be77b13420634e9ff4f18412688a33baae60bc315dbc5082b2f4b2fca521d4815f10581d2c7a0990fb61a980c1639be554d9db92f9f461b3548560a43c81839937f421826797748668b1052099f1c98384ca58cf1aa361faa64997d370ee5f7edb9b94008c5c2dd4af783d7e5cb55b39b0caca324a19dfed0aa9dee6dcc8c696bc8f2623e5388400422fa8f6844ebf5c6b43968902f839ff043e9c6aea9137655d475e491cad159dc33fde259afe648006dd542fcfaf1ea5156066ec24d8408f204cb30c9d3a5101952143882b74f93935f079931aaeec73d0c7a4c7161e6068b817bacae150d4d05a9c8f9a9022dbec5b157d6f8e8831efa8dcfca838d425768730dc2073910f8e65da08d973888b0df8c4d5f175cb7d7d1008c4fbf789fe5d10109d99ee6b7f90599255c140268532817729d56ad92da0a8d3a42eecb05970e53f85839c50938aa83ddcfe808d68eea7b4df87f831c0fed5e600dd82d7d55669262a9a17d0e9d1d43524cdaf1d9496bdf67d958885e5fc298861745470d0723e6cd339eb7ce11a5020c3cb3657a6cf56c46a6ab625fb0d06635c8fdc1c0958b76c35ef81b527a8be892083b0ec0e0ce4974c93eb927ec60eef388c7429be8e76bcb927650a1c2181c6b163a91b38b3ea079a8d936bff9ba584bbf6d72a8e67eec6e37e1ffc3cf91c722d078995b568f96dbad46802ec126cdc2d5b5faee789a2232b501cfc18b41103c9dbcccc1290755243e4c407c2aec75e232688275878135a2759e69a2dc6f2043e4d0d2ecedf005dbc5b21eb21e5377323f4eb146f97c4c43dd80746eac621ebf0f7a54e48890cd89a941c1d784a4fb3a622e3068b8d38f9f566e992de26333368583fab2e430d6b552c1d2f343282b8304d1a6e3aace273d493280e866ba8732aeb36b5de81748e728faf80f45242d948e00bcc0b9b53ca51c92d0a720af413af2d150ed7b8f4aa893b3dc3171e329f566811a06cccff56039573270f88a8ad7b9a7506b87de047efbb62664afac482ff61c67bdca657bf506494d4dd692898f6bfb14def34d9ff4c8c97dade7c6b1c9a59b4ced9dbff6eced2fca45a21067ed7096434ea724438f62b58916017a8e4bdac4709f2c258dce54d25060444c4b76304086c38aab17d93141f3a6e610043eff617cdb5fdf6821a5fb88a7a48e5eb414c08546862a44599e3763657cd03d297b3817a71e34b07047701921aa1ec72e82e0e7de82e8f1970f5d805cac016194b612ea0d516e8d40a2faadd73f43af6ce3665594672e471ced7df3925fed970718b69c14e0d3261b1e60e9cf49473ef7a01b766f1b446e6fa15d630f7bda080b09eed6c4b3aca488236c7713b1709b561fc7f37787728d1891c679dce911dc27f1804026b3402e1019e4ffab6007ef11ca3273b49300cda0277fdd0092da3ae438358141c6d9ed396891289d3d5361b108239f2f2835558eca5236835d7c4ac946d5421ed5bd098e783b9bf32f9e1abd40641fef2c5a4e6ae1052d6e3141365e83282ac3c935a994b2a900b5202e42bddcbb9afc89b7dfbdd66169c8f86f232b58f5e23a8889f5d57ca5fee9f74d003943f1b85f2594310d102e9399994f3bb92b06118bfc0116d83ff53d999c417cbaddce221fea396be5f73452eafc29a68f652160bc0be53425646266ccf652dfc712198044beedb6caf33a4fc209458c356f0f77d79f7c764551b4218befca51e94a9c79d78bfa3a466c0a3129a8ea1434af98fde39f0f05bf70b315dd6eeff9a7ed1db6de38a61ee0ca6aa127c16266138f839be9f3e6091b2827ebca5c0b00896365df64ad3a8b21752347c53cf3ab5a769af8f08349a9e2e0d74a5a9f648d17143c9b6ed2fda88fd6fdca0a01e60b92cca3bd0037800d9b028cdb962042c9da696992068f399eb453bfd3fff883ad42f8679121f7d25ecef50e4685c7efdc59c8b66d33cc349418553309aa0a11baf264ae1d5cab89c4032125322f7db2ed1c9ae9d4fe7138b341451f15151dda592a774008b83beb66c3ee99479d28d224ac48cb6e6d668b22b9894c9e481a24b37399e4fb3e8f416d95c4312ed6b198aa903824e48b93750a088b824d49ea38f05432649ef58fd200020bb68fe2014ca750d4bcdd5de04093b4b188ca22735e3756aa8698e524e848912bf111caff364275835a02ed3632e4476528bcdb9fddb0ff6a13921634c96dca8ca75d95929da486acc8fb427b9526490e28cb7a55ff84dad8d23391a8be963596a31b4ba4cbf50bb9cc6f6499af80401351a0097d0adb6c5d8d245d690feb5bb2acf2f51c065c8d112f075c76c91bb6de6be38ffe47dc3f620a0c825e0495c346898a9ae19701931cb86a31fc2a1f32d63e3c15c2feb0da4d1294096ee5bcf5bc038c42ddc60da5423140eb111cb33d639151a2b0777ec5876d64f983f9877a7ae2a0f5f7daa84beb6033939fe5ff5eed2ecd3eb0f96f8979e3235a84891fd9eaee6dbc171df90e7f0fe92f8dce2c1ddcdb56f1aacdabad8a3c793458ddac9a72ee9c9e25d5297566040acac31f6202996194c4863c59b9213f1090e93d55467cacd4a40a4b5f0908083f692920c8968a8831be2c8ca235a8b68d751ef142646feebed5acc7c450cee23016a71987601817d2e88505adaa86679becdf409c7cb37d0239f49080d41e5c84d82551c6e8abd8214877f1a3a0231ae0fc14748b16b02147d8caf0ba1d613ce3b88b11aeb7ac91c6e9eb96ab9de79904ada5d336bbcea135bb172d9bb1004bf7bcc1a16754810b69d0ca3eee2b3aabb0077ba6c6f275c775e9c1904a1a615165eeaf491847940eb107fa2f93d184178c137c3462440d59af6ab261efe0ee16d8563e51ea194c62469565b1c3182da63fd891c73338fe208a47d0e8b4890e61f6fb5400045110ced182f10ea6869d20725ea3a56156b0e4af87056dbf9f28fb67e5da9f8e774a1bfad6888c63a53c4dccae981713268b6dc632383738aaa6add41cb976b2146111689a117523fd73f4f6cf5a657131f8827651518f4830ef3de5a9d7cd96afbd78c4d6740f0d14a8df97c9cfd7a4fe5ded67ea37bd17bb6b7341931eec62d0c618b59099a34a7444d458a5e1b5d41523744208d409ccd2821991e2751a3fffe4b9e4d2687801a5b09ce16a774628ffb3e0afb00fba8ffe9cf57c9ec3a155c57f22f8a3c9d85b2d53ffd92078d3c94373f855ecd01a8ac521d1abd0f2c7cba9ff1c9a0ca409809694c4e8d0cea4df69cd86ddc3ff6fe2b27973c580e9d5c934cc6f7213e1549768ddb5b781600191fa2850ee3e8502c24a0ca373b4901279ec4ee327c36801c8299598ee3b1632077dec203163481b5017432b5d76cfc8015bed3f622121583d6323363506d87e6a7a80bc4e3c3102b4a084d22acd8e3d8909124dca37f4a11b9df15732eb8e2fe2794eececd128fe176d385f83c2b5bb3a7d23d3080cca238d6066c290f1208b9603bd7ab3281658a107c89b0f5b2c883b3f8a9ac3a88927b933ea41f52176dbaf9f352c4d4be15979f59a4e77a2dbecb5d7ad6aa4141bf5c79ee59a0a81796654d61ecc5f427346c8bf183f629fab31d0cef60b535766d5e029bf96761c0f76ae2fe1209413b26ab5eea9387959829db3aacc447779540f2c5de1fde1f72151e532e4f191c8880c6909b4ff64d84a7a87f696deb883ccead2c1b197f51c9840206790060169dc730b98a35eca24e90e7337bea2c07cb5affade982c57925a8b87574d298afc95e8c423dd1a534649a2a0f7ab55346cf9a7ce3aff83b261517a43898420d48b9db3bc33cafea845507d36bdc5c2bf5b7f17735f4c65ac9263557c859bb4881ddb1c1a4fd2d17129e8e95c1274b007522f4a14d5e99aed2b7a6359d4fcad4ebb376b07005d5a55faf82c3a7d20e6b458f187d7223cea1e377ded03fd0dd3cd6c99e7aacdd362fdc1678ff986312d6f76ad15e4d0af1de7bb543ba28838eeae38e9d92c3e9cb111861f5ac1b50f4de0b34b3d6467a8faefc1e7955dfee4c598270f89b4db200f384f07d5b993220eae17b3477f6d914adf501e435ce678213442f43f6b2dc8441a2607480aa7d33881aace7b5c6cd1d55e71e18cc8c85eca2a907e4378bbfa17601207fadb7988920375822024ebd063152b18bac92cfd88211996dc040d1f52b21cef345592aae5da7fb880fe73f6bcac86ab13869bbd23c2e6255437aca0bbb74aa73ea079a2f9aed059e1138baba7ca8a82e0289d0662b4fe11f1381fe31b18a61860e3b6d79628714b8c8bbb57 -MD = 00c0541af4657e4296c95c076cc0b87504e771aecc78e2259b3dee92b0ef30f59025653b8119436a86aba5e7b2155ba2d112532d3542f5a9684a6277131ab387 - -Len = 50128 -Msg = 793d0bbd04099f5f4af6dcdd71e139a2c4378613ac137dcedba69b2fcbdc2e19673caef3081150f0a2c7d9944097b074ad67383d74eb5cf70b116c8b4c9c2783240e19128fcc2754c47d68d6acb3365999cd85d3351c74b7b94422765fe5c346197bf3228383491216e030ac9f7cf2dbf03216dfd6ecec954b0866f9ec0129e9ad4be42ccb7ee1b202b7da1d013b0d811b5e92683fa4ed1a2a25e01bdb3683f4474596364f0515bdefcc0d32b839afd38019a277588b9eccbe6337e414cdf6f05133ae4bf7600dba45e572f2adbbfe5a882bee1309eb28366f8a135c7f0dac6432dbd770abd6f2316bcbb065c80c259d9b5b1d443a0ab2dda6611e8c0540cdd85205b7af53b0ecaacb467093f2734a252272d812d332654bc9b1fd7b8cac80d4197bf60fd73722aecc1d5a85113796788339c686bca9690742425b31fd9beee1ef043d991fb0bdc4d61a15420ea13020287590a7ddb7e59977dcdeb741533f863c6734531366e47551034ad2d2f940a577f1dd7e1ea6018ad2472e143e1d9a4c686d82479ca0c048a5a1a03e4487f08dda74561168bce760b94af450de4027badbdecf7da0a579c53bbcc08d4b926662b8c5a36aa143bca696afd87408061058fd82c5fb08be3674791c51c7d164caab79ad6b91b381abe1d03c8187a4b57aae37200acbbd331fdec888fcf5bd4345f184f4568c84bfd99bcfba989199968f45ef8246f5a64c5e8a91c9691df778ffbb43620e65fe44715bfbf0c49bd1f177a48e6e227faa5118003aa73f4a664a1f911dbe3824085a99aabca8aeab330e5a537dad4573b38978c92dea2781f403cdfb7ad27fcf8947790f7aa8fecca7345fdb230759d8a83da36cd05ac8cc88ea3382c26488706b543b129db95b0315acaec3e74303b770b5c4718dbfcb320a4676ad5e3dfe0e95c9043b8da36d5a65bf7093332bed17f5390161cbe0d7bc6360c105b42587b2efeeff13b22eddd87fb2cdd46e85bf001e1182c3f186957079803a112de4cb63610a5121752253854cd0ec0dff1a207bd384701f6979ac5835ed095931417429d36725ed3c46766ab260f6c650b2b98efcdbf3fe9a81c57c7ff157652905270c2d4ba1007063ef8e9aa91287c8153244825f32e6ec6688e240d24cbe7bf88e1557ffede17a4165faedf469d9cf0a32a24b555662c7ef9c945ed90feb91e2514b39cb3218c0a881b491892343cd5a61b2400886f793e6aa9ac34ec974d28b18b7bcf6982eac60ebc670b0674e2acd697b49bfeb2fb81159fa5579a1e2a5bb8a5fc6ca46aaa5304a3771b15d804f2bef054fc1ad919e3852befea1c0bb74394f4d408d651412e247107bd32e64a23c9e593857f3a5ae253deea5104d8aa6ce108913881cf55d3c89587860027f8cc81b7eeec9e5f44e9fc190320c71d4a3427519250394d4ed07b9174f9e005b7696117c575fad05e76d86ae8cde5423d25d25076046f4392a0a7e56e8d6517fc66f265c5d617060e258354f9dce1dfe9de6c95bab9865ac7c0f811c2b4f1c73e61b0225e716598ea528767c4c23f5ee6ba7081bed430fb64bdc697100538ac03c624edfdcc78d169aa5f03c8127037aa5668b51108d19deff3bdf5d4f28c3ed320cb29226bc378028964c972420702ab1ecf904fbbfacad00f18be90017ee822ee0d547ac3d7d55b6c531951e576386f801fb3d9620efaab7c9141cfb6834079aa760065692871caef8483f55140517e26c3903c9fa0b5d8a8a23ff2863bc05dd29fad50c027e5d77f8399cb29f7d64d8f75a5e7c93274ee2fb5f986f50af045f2e4cbeb6d68aa1798dabb41d3ff4f54068075697356c0628e671f1b976348a887efec83c57d26e1c7e46907f3d92538388e7f40226020cc2110012ec1e7421c0e0b7fb86ca7f4fc895b337bee17e050a1fa33fa6ae10e81a44b501f29096506f1e1f607d7ab8c9e5989ab1c473e1933cf5e2406917be23964938c8b114c3a0fdfedffe07aea666db50a207773be28680d14dfd34a73644a0e7306f13f22397d2499fde0dad71ad12857440c181aa65407d8b80f0a89dd39fe545fcff71ddbf56c6060678c04026f3ffb864898c60b8e3bf45d183601e58fb0c20795cda1aa0f23fbd802e2f3b5ae485157cb7a52d08d16023f6d718de5c1b2469ed147501c00c7a6c5419428cd04ee1338f321439db7128ccf9d217086769f5c7610e8abba90e41ba88204158109ad9bba5e421abbc2ddee9e15ea7c2ff4c46e3dc32616fe35e5a4f262a73caa32e3655c6b414ac306c4c21b7620e34ae2ce06566684246f4668dd4352121071074bfa8fb8a3463c197381d82c59588fb728cf407987468668ca4f1beec933adfd23e5d4b4ecaf9f6146b854a7184e36e841038c8aa40fcc13a654dc873118999b2791bbfe81e95574cad00184d236f90cb34dbb086ee2a8bd79a915b9ee31cc57b3a8b5e4178606da7c536f341b954e8afc282c815c61c4ecb09647f55501ceb954755303f2082bf8e7dd0e33590baff9980d7173d0ff7917d7b6f3d80a1b1946868203dcb5d22d6679b76f011eec85bef3882a5e713e6dd57b75a9c071f02475c67948ece7968389be8cf23bd1ca6861ab02b7afc180fb9c087cca5d20f388cd90b5a2a2eba7d6f932c848322627d0883b1799f62679aad20b16d5fc9bc7aeb471b1a19d5698903b62f3c18260775679102141b0348b041e0fee6d2d56df1ed0e607b64a9cdb37a6bb8a0ebb255b52dab6da5f6c50279fe6636df06dc69c51996a226129430245e1c915803af9266e13bb8d43892df1c6b1b21ff04c7f91df747a8c32b7dd8043630800b690307af0ca8ac48ea5125c1116786efd37f6521108a3cf9b84b0e7a8b0f4e612398fcb9355a11aa14ea1d9276b32f577bebf5fbebc52470bfe81aaee421c3043b54b9abe4b9afa1bc440fb42465e2dd05f2f1d0116229d14b3b44c9c9cda699b82185aea22d4dd6ec494352a3e7682c787ea0cb08c713c4612cd4f3c27ec1cba3e6aaeaf51eb5f0abe00092799f89eadc764b115a5eaaf00ba311535899da3f038b6e8668f4ad9802f1909c30f70cc039c13acd8e8db6fe508845121287baa0e0f71aab8017fe76f76539995055bb559849b5252dbefe9539c3b65779b029944314f580c7ef7031952244b15f235c5200f50441be584b5ecc3dac4b137ceec333c9492ec4e5ca72e111f90be7c8b85e7aad6e4ac9c3650113dc71166b54d3d7b8fe5cdcff5fd6e0e51a9fd06fac97220d593c68d766142516894cdf069e9e75da9b78b301c65a24a8267f278037c145c1e2b7c26fab2072dc2d84ce6ec31847a289e3db51831fe5321be239a1d1fd709e2e248119f950926dae620d2a2c09f517aee57b77fcedcc8ce30e2e5ae2144bad26cecc5db96d2ad1f62ec1c240392741f3c8bbfc9b8b81bd644c2d33d2cf7df5b2fcccc4513fe510eb3015be666f842940d2c467c7c3abcd88e35eb509f4af7ebbf5a9d52a8e683377af2fa70875b4d67e4dbe40e75bf2c5351dea67f04b885127028a19ac225e4281f537058d116050937fd110651c00ac5540f9d1ed9eb175e06b97163fc36d43f048565e5d0c30a069b1235da8ce7a8acf95b27c69b3d1f2cc78fa564c383d40aef1b33ce02dcbcde72adfb218390b678b643eefcd5391d1d571d861394a7740a23778267e3edadff4342b941d24594c71f5c5b27f469919e29d5cbd70c1c34cb464caa59f0504df7a152f8d1f590c40698f6e4ee95490d2da45abf45765c86bccbfd340ab4cf2d460161524869ecd4c5b7b614a71451f05a7b1f08e58fd2fa5d28fbb7f0ad94bc68e7f02e2babc44772f02c72e81e0edb930295111da539f02ae1daaea2474b8beeb98204d237b18c9cd6ac88380eea3f65df5f607452dc18b49b1c70a61e7e1c261a897ef2aa2f14a1dfb8bd0d637e8c4165c08f700543d4789923a662af96dddd7f98f5035fb790308ff399dea83652c43a7af6a7590ba3f570a2c86e571051436d12ff6ae4c55fb74bcf973269ac135cc1f12e70ba8e0799c5fc5f3fc18507164799f6bfb5e303a4b7bf4d8f144a5e899095af62a6659ff3eda2c34d5b6f7fb4a39083786f9b0c973845157b348b94b93b0ae1f3a90cad927c38ad1da13a1bad05892e0b5e47dafd61f3975d56fa469a05b37eba3efde0d3d62065371f6f7b7df2064f0f2e940f45a94d4bcbd810f47a9511de1ce4b3ba56afec9410428a0f95dd7a7efa4cea1a1e92a49b3d446a1ef97db878a216c89a894e1fa23fa72458834c68263325c47bd6a2bc1e28285036850419d6c0519711fa551c282bb9a8e6d4a351ed6065bdb50c4dd63d23008dcbabecb8911e31c9a11849749e4af6822af896ca2cf87930463e189580a4495d5eec8c17001213bae8619fbb6d43ea6aa56d7b237d71dcc6bfca876c71228f5960a556a7dc2293f52874cc431d7d01acd6b1e51057530cdb82601eed97342f0c6194f0fd5de61ef301a053ce477cd8d34f5458f3331285f92e6d437b6b4fc4d0d209df8a3dd3315f04a2ca9f53b9dc887fc34b5ea936e4aa146099a855dbdd61529276d0d4506773a1ca9548caba8906d89d30a512468568e4d895f6ff7ec51833bd5b63ba041dfb49a6485d25056b08ea20ad8916b7f4a01033ace9b09f387025f8f1a56754e1309cb4684eeb110ee9352c165d1f01bf0a171052f311b3940389c3de2864d94dbdfb7359809573c14249ee0fb3a3ca50e179ed2c95bb52643cdfac757f2af7b01df671a0a4bc844e8e8904fe0f4d6836d0a938ae53f60225a6a8115bec3236b4bb0e2de22db8e8e33882ff65c26461fd5235613cb05a3954bb73a0f622031cc83fa306728e23184bcab83bdb9f815e00e0af157c3d607e7df5b2c9e8a3262066f675a9f6487378c4dfa958d3d93ca2ddf666b3d15da1380deff5fa87d213d81d89d676d1ef32a10ac1d6c4c321fed7011e0cdac08384fc9104adc1684144ba685445fb89d4d9177a2bb10e4dec307106c1f1e8ee51943283de5aad1e73312db40054b6a2abef529f77c8a3b8aa89f75b8cc66caf4a478062c77d1c0eea71c89cf88326a0d6edd8e730ae13b7df63d07bd8eae487d0275cca6a95acae198f119fb741ca08e84d10ede0a1dcb01d4692e430efdf0c85ac2e073234cd9072d17f18c7111f4f5295911ff2747d25c6aac5211f35baa1dd5e8ac5b8cafd4a98f187b4a291a4e8984feff9f07663ad7e18ddbf0e6d05ec39b6e96268c8ca20fe67c1efd413e9693be4740865282eaba619531a88f65f403d3dc089bcdea2d8159c9416c6486b45bfebd3c7cb1a4ca4d114abc0195215425a5bb6983f4d15c4710894e6038f890296de65b49cbd2c2d81a36e4c3a10d66713a9121a6ac4917a83443aca1659f1345334d06b44a16baa2a4e112b55a2f132ebae998cc9b5b46eded80c3f7948023f67777a387d3789af4d6d2aca0699141a64d4835bd690ed25f62c7fb2a6da5a98661ee9c8811ff4a16d8911c4c753bd91f19386240bf6ba143bca0bc0197158e3b1a395780a9b3b250d3a6c8812733c4e24940871f45789ce422936e45bbd8b85ecae03e36469cbbeaef9a1a072783e83703e90a20a23fab89bd2979be80f71136986bb7748ec34b2b53f378a51c332f656fb9540c7ec8b779b5e945348f79800dad632c00292f4b5c283c4c25ae4980b6b73acdaa8319a6fd315c3a6f8f66ec29315004a3c0e8a4c595fafd4d86cfc27000f4ddc4573c625d5908c13629c63fd34bb8a725fbf73caec3b7f3e64cccdfdc756eed20a239d1e15677405305a2605323257d4e8163fd5fd9fa96b7a849be423b3063880d16ddd15031218cca0137f1e21eeee6fb34ce1f004c4e8a404d47ea7dc2a9c13fdd6d746ebccaaa20ecacf5b02c62b41073963860348325bfe0621b61ad2596e1966813d9a2a575b16aa7a6b4d5418169273ff0203a9d51cb0af71f0f7841ce9b47b8f6b96b18b42283104e17a4f315ad58b09069e604d60cd4ee3cb0ab643014fa4465359d8d311e3fcf33001ee038850ed15f62c1207c2c452fbb6ccef586f5b6f4a875c26bb24ba7cc9d98cd70b299528aa734525a0bd066a3e46a6a5e96e584b006a2611a0051c2f0d607380c4a902bc3ae0621184aa23d30fed30606298d6b60c9e40302e3d999212574e71aca13a264be01b7c3024ad5bf53ce2b55069573ec37622f8b228b3248d1076304f8c9be551d4c9bc4fb703339298460b3f7a4a43c99456d1d870e974e23ea33309c5b877e13115581fdbb6184c91d2d88c262073936b44520d80bd0196342df08807005c8ea756e64d0d3668a7bc01a3c3079a3c958d840fcde29e393d93af0f26bb14119e8a26dd43b614a318695b037098e80d545d9e5196111daa3ccf7ed5824c5425b57c0da39080d156334c576e2154ca74646debddf296abc3086a45ea1745610747df63efafd7ed007cb78f5a31b581f02a30f4fb7fddd92244d67cb352309b44ea36d2081e35d830594d5b3e3e55df0f3a4952307a61263666a68bd7cf98835cf104d083581513445d7053a0b390123009198c138edb037de25d0bcdebe7b9be10ebd7e7ea103edaedc301281e0ecbf10b13fb2b398601774c5c74ec33989ef6be3e50bc4091ab52aea7cc1afa2c7cc0d4db37ddf6fc909109474fd93335b3854d8ee366f823f95a14a14d1fb463a53dead1caa233c94189ad80050b674997e86350088e7d41a93f9451ecacf96ec5a6b19a1c1e9c56849fada93cf94c4eac9e842428895c752ba1b21c332925886ec9cd96a4b98d3eea618e2530395ebf6226247ddbedf23900fef262a93ac55af0e5934a0d0972ecd36dc376b7322b06690dc8bf9b22eaf7b9c5d9e7c74855510ca8a746bd6509eae012f2301a8a1dce21c3e57bcedeb34bc684ecfe05e8520512717dff2e72aeb3910f7ec3e287c3711cd70f351f67c7afa7ba8027fd8147d192ee8be5e8a8ddc156a1edb497d19899cab5ba7de554b49dede5580806a9a3510e5e558d648e13beb178a384b2ee29a2abee5bb8c93be6910983b8e0c9c7f10df56f7f783a78fce6220254b6bc43d32640ff77682373fa137b144774bf72bd62e8904e18d31fd5e238cd55bd2c69418f2a57a21e9c935bbfb3257816402064fa484f55f1b6e94b2d56384b2a7bc4e157b885404e8d1087d06225bf680457943ea51b3b955e5bc9421ae1996132fd3f1a7c16f67a8d81fb0fd893a1cc649ea79a8f82537641edecaaf747c503ea68b742057b1925065e41c8b6fdb3c5f95c2ba857f322170a1601d26bd95284fa9de658b5204cc0901be8856dd269d72b26ace29f0c4bea0f7ac552f914c656ec0348e93bb4f5ffb3315bd06da03892826487d3d52c2571da7283a71f98951c574f5b5de997a914d835284446f5a46a97bc68f69ae13340f393e9395fc3432794c89a314f46cab2879dba3b8a3131d1c384bcb540ba19d9d35552a42a33551b5d15820ded40ff4b39e19e2097e1656a9e63efaa77153daef24d4c521f574f69f89cbf4e4424ab61779740bdf084b397a0c09e409e911322e8e252dd9fad9695ffe48e6cd4505377b9355e4e44a9b0eb43213512379c3ef82f9af2a13ba4df11eb838bf41e628c108722237be4bec1c82e1c4099d2c515712efda84773eb6d7043e0447ea2c9c9ae5a045ca151328ac0a9f84d31e07a4b307f70e02ac8dfe64381712466d1f470a3ca5246592ab350674f7bb794e14a24a889ab36d5baf0bdde3cecc8475c7125b320729d2dc1afd72e96ed1c1d65a3466be5e318d2badc78d2ce899c8a82de5d3f150bad89c686638918e2e745ee1434dd1cef12ac58e18bb3cefe0dcae58a9bca107413e7a9e5a9f93de3b5a8db2b548e86f590cd05ae8ae3a6b0b863050445c69b525cd1dc3c0f017e65e3a0cd4749f2bcbd2faf5191eaf4fe2818fd61ea0fc72e1ce4d2edf7f74472f00dd824f669ac369c5bedcd4a206a3deaabf47c9a4e3e413a48654fb817049408a0c982c7581d8d1981e2c935cfb5de6eedd2c59375be6d40f3f381dad2f45a1628df672889b918cb5e38e5c34d6a683b5b32cd743aaa0aa77428250ebf864dbf22843298631172182d5a93912dea53b6707f04aaf193b204455d9992312cd75a1a72859598b921869bb2631de5c83996ca21fba63f0dfbbde41e5023dc6aaf7d6d04c0be8f129fad05eac4c809867222c4c622f4677b305adcd4f92225c20eafb6d58471bab044d2187e493e0da7a6010cc61b242f6e0851ac3bf51b81c59d57744f313da004c9cc3fc750de66ae3da7eecc34a3eb48dc38be9dc48e84d7d40b21ec6790d3a296c1e8609c37b8fcb18df72310023fae34869094f7e9b39b3b314c278809c9fc2479aec45bb85935aa39c2752dbd7100a9b1de9bffbb72624b705fab2306f7840b49ff8d3ffedbcb7021bd3cfe3433e29440d52d5c8255df8d3ed8c1c926f0cca3c95705b979c530bbdc63e4f204fcc69cca30b39ecce26569034415dad82a58965e41d8489799f7d5d042f7b9be401f1ba46de926f99c8667542e11e8a9189a5baf4c7f7df6bea36693c70fb5be826ea965d91895a6d8d520a7f34062f850145c02e355ca15c7a5e69d8c7766845837be952edc5b434bb3fd75401bea644559101f8315ad533991ce53ffd94cbe160cd398cbaef85d59b57652712edf7b8cdb204bb819985d88d9866d9dafe8ba605071173c0aed63875c23b612d3c28c7b1d051e0eec2b8329efb730e255cb07ab952f66fc6abae4591a8e16b1b53435b481271cd407d772b166d9546a8554347c6d672e8968d15e43630e0aba4d94f5bdba1ebec3f71c9aa3b1553e929924af472ba0c46f6 -MD = da9436bdc81dc6aa3be907377519049371e61a409f850375d3a503060112f0eacf8539c1d98cb3a302f9c125c78ab6e3a3e695575fed3eed2214a0b9e3fc6b51 - -Len = 50920 -Msg = 96bb7a62306a40df8c1d0ef9f11301ea036d7d15e8cd713caa23dcf3dcc4905481bd36f5296692175d3a08203de55f4c689fc69f1cb9141e9f75543edd1b819d52498ef02a8ba93ca72bc14ac44b465518303005fce142a1f0f190803b993fc0d20a8c3b7b000fb7329b415dcc6b3d6ddac9c32fd06e822d673e979f3f655127c9a537be64ee4ceec63091439e6dccfc77128805e0875d2aca05718531a83f38ffc597622d7de64b2b92b8e2827a7b6ab8b2867073555a00e2ed27185989925d3b10b50d1dd46735286abe24bfbad31f6252c556d3000117779fc042fe31d1fd472e98a87d1c57148760acef9f545b8340994ea146afdad751c244e96ac7847fe9c8481c957c3c4f0e1b892d68709bfe19302837158a6ea937ffbcf7e374334dea86ce4fad1da05086445dc563381cf9b4be5b0288ba44f3f2fe2f53b26067ce110f312b0d270a7eb682319fd8d265dadaecf0e8e667e41e4b66a5e51fb2a76a280c7997fdc10341687e0ca30f66ff0b5362eed379b8d79307e0269571937c89f524af7ac413120162e0f6b94f1d70f2e7c75daa87d6a4b9f113bb4bf22a6d934200dabeab46bf266d4ff7c9e21e42f95ec4465559e9d3f7d0a86befe8a002f0d547024afa829218517318bb0e92fc877f00b0bb3718edb76b463f699c1cc30976a22f06f9ee1440d6f560771ca127031324a3c6688b79608b963da156c73944efb96adaefb3cc04c47dd8e554724ad7e2d7275d366bff5af83f6f805ec8eb0a0733baae26f842cde2b286eefd2eed6ab4c24568e7e0070c7aeaddecfb4861c485b9286ae4e6ff04f93d747860fc9924518c04d0c4111ae0d93f8ece766f24d832f2bbf672a58a0fd1c5aa6cc605d46d81de6d7b1527bf3ddce58a0f1764bbb0d6877b3a185c6b5832f32eb3757129ad0b60865222497f8b4d85d9952650aeb2391f701f1d342b45e46f0a33b6671d4cb8b9593d32a0e133f2c6844aeb5a86482263a38bcb545140aee046d6d00f3ab25092ee258f546d9b93519115aeabcad95afa1b6768e465b05aefe8830d9207489b924bf07f8cab2cfacd0bddb66a02ccaa8ee09c3d0ef0fdae43fa22b3180c7460627a884b70244eeee3f78c4cc0b78bd8c4fb1192f8798e7385839a0bc8d29f69a983d33b295f6a363b5f09b8d56f7dac4673adafca88cd705c8cd55dcbe0327c106cbb96dfe4e69b7c4a3c42d0b50af0bc505adbada5216f711cbaf149be93623f3f27a6b93c2ce54fc10d32da0e9a6acd9bff5fc959f2366b3b310e69f52ce3dd04feb1e0eea2dc5bcb64cf1a0495e3225b8383452ba98ff3f122fd530c64c692c12a007c82b24749702962b91e64246398d08f49a4ac40b1477507308ba2d5088092dbb481c3f0c0b84433dee56df2375acdcbff4a64114c44127228fb50d6e4481e89b0723c9d69ac9d8ab2df191846aa627f8da839cc6df1e28662e3d592d122b65499dd8717ec531daf5d96d05c398f77f21b439437bb54cb8d07cb99d175144282974a0b26f0b6aae90692fb88b812f46dd2a5db1cdf78b6cd3e3b045a7829aa5cd14230911ddb2d82d55900626a3ac138d955784180628c8f30bc7ef78366d62a704c5e221ccc8fc0f37549b3f80fc79b59dbd16e471c331b04d56f6e3ed5af349bf1fd9f9591b6ec886e3c420999ecde7ac0506ddbad95b9e30f3f88507d1bc17bb875d12f308c4dbbca43d946e11948638b5b05e61d99b1f5f1560d6266031b38292f8093b3f82db513c53e57ee37223dc45cfd0d74264a61031cc51b995088f9cc91746921e1d29ed02a3ae3c82cb42ff3ba1efabb26ce50cdfa78241de851e62a0474588331859d8ad9959278e24662a1dd3055fa8083e9d856ed24fab5be28caf14a08e0cf8edac83c170e053f20fe552dfbc5371cb255ab99edc4399e16e734bebc2240a3357e12ba88fc772d8a2a981246f37ce2a2bbce2c40ace18aa34af1d5934eac95c2b1f0bbaf07d793cb0ef1f4db87d0ba9d44ca75ae83fa63ab7a889c96332a8d7c9aeba755d52c582cd3e83b80283c8ce91826defff18d10779f817d8f7ac573ad628ae7420e7e66f5a1054ffe7ec640cf5e6acefaa0a0794fe065de44ca822f9b3056e13e5bd5a46e9fd1981c3279be973f1fad68353e867a65bb297fcc6ba98e2dd6fe11643afadef6d37fa4ec5aee89e2cce2115b6c1f42570bc5062887cad08192a682d0b4508fcd936a5c5373b8ed70f9d7bdb8342ceddede1aa185de78a85312425b474c8ec74d9ac20e10cb050a102ef334f49d95c421ba901a8b799c5dcbdf386273099dcf9e6ff080cb6abb29ebf49e3db8af420f492a8f38e35f1f381380f260f9f363efe79b5a7b2b59c49228d240a2ac731b167db37fc23598e781507dd61c8412c96e51a46ac6d89f068df051412977f00920e6dfc881282dde80ad5f4e60ba6fb7960314872b7b446b626bf70a9bc12ff277ab35d23d6525eb7c50acc1f2431116ad25721870bc51da58c04f01bf3436c061f63d06bd9488f5bf61ef979bc800ccfce147875e42cd3ab818de8f5f760f5927ec80cacb5c5fe68f09ad3723f145c3cb5d1a3bbdb6c075ca9a2e1c412fc2a711b785872d65b1a5356f700b5265e7e162c1739c55bf3272d66fc6112e085590667fd4a6ac58861af9bdbf7af0cdee100836da12ed062c1924be2ed4eea8d2fe706bf68d10dde62d221823ecc4d0633706e4d8054f32b552fcb0efcf49b940d875a472a6219bdac6faaa23c997174d3ea4f2f4dd41ecd605a56d906907e0a806be52d058a73b69cdc79b477a3149b40c2a88b7028cdc961a681c9909efc7116f939b990a69649c2ad21317655a0fa08be0d0a8ddf8a9fd798de59219cb1683fd3baa542630bf7ac563391cf3da111aa20eef4fd44cfc130b5cf104006175079700a58913c4f40b86c135dd8c78f62939fb103450527ce1b61c687726798aa32528b5c139edaa57563630e299fd67d639f059e0bad0d26e63177271f3dd006190fc0182007389671b0852b480320b288835f2da788fa5c2fb93357ccf547d49bec4b257d01d3b42bf80c2daabdc8b270f1204aaf4579ee664d9dc1f22a5a96298c8efc511b465f028e6a9dc80c68edbb6cfb7d994ef65e188318de354992eb4064fe1562b01b27a40822e4369b7bd4d66b332eec221a1bb4de2704ecdf8b147f1a3af9186c9c7e7ed9b7a96cd76c08405079e71e5b3fa7d9d36afeaf58add243f0a82fe8ad74f3f197bb45d14cc3e887c1322ea646e1a2e5f736f3f35165752dacd8226a0f2f08aab680521a581df62b41fe7e2a91aa6d67be2dbd3f366cad9a834d6902ee152d18bab9568ea5d4c19947315e11b7f497dd8cb18319840dcc29386a7c49e6d1e1ca18c8bbd4a282db50357d36d2264a92c607651de8d6d3514820d1c4b565efc71d5520fa52da9293feb12491026936eebfa2aac6339b57ed75c0f5eacc07c93da0f474baafba9e9be33eda0518fd241c08e31514903df5f130bd5946f428e8c5e37b164531df0153ac33000b8c6eacab505d1691855b57fd176a7e71d465e8e0535d98528f94654bb832390ce31a3b0d145531c5696fd871985cc7f3d33b242d8f107d4b2f8734e4a5b0d791a39c49b1c37ff918d2d801ef1208e8357715350de53837978823eacee3338e2254617359fc31cf1448406ed632f331cf468095f2044949d03007016b0f3eaf475c1622361d2f4630402579c769a04719b809b17a4aa8368d9d8d13396836cd794106e106a4acd10540f3ad2324949abd421d322746f9901847429acabcb06b20a9d03a2c315f020bc137837a0254af127b3772598791b918c3a4028f4b3ffad5dcfe8817319a5bac476d974c7144e6c1d9e50cb16b2543f7794de507b24a1f2170de75682403306f5a12531b0ff9f433d4a26b9f8008b34cfe9cacc470432a6bfc1c6c9f970e42dd6fa241561cf839f0f1fc19a464d07971ba1cd43603dfbf4de524e81df93fe57f0ea9ec9e46a43a81c86e81406801191e424af5ecfb54402fb2847273c90caabc9da5af541ba2785ebe565cf4281f14ab1d938c49b5655f89eab7962194f9052eb3021407ea6765f05a5fe740138efe90a2a2f1dcc0675ff5043acdb7db89874de56bb52a5157a5df02f7cab4c8d5397777e5e136bafed3f9758a73a70b3293728b2f0d4bdf179a836eaa61b2a68647b813e8b4c7e3806dffe523326fa288cc653ae886ecf21bc675e3d466da3b16bbeafd07f70108905070a99184724ff0a47e7b04ac7e28d8bc3f1922249bf50b0878a9d0228268a35e145951e46f520e9e36a22ff88fe1d2ee476500455872d7bff990ddc1cca23dd9236ae0ccb767371c1666b6f582bb9ecf175deb23c0230144d6489d4f3033c4445654dac7dade1ec0a62f362e072490e1377a6f4a43842c29b7377b355dabdb3205bd8c405a450a0e5e722a0c8dab5dc71030f94363249cf0e4f4041ec558e724b9fb91d0a63a9d67b7c60f0b76ce59e34a1815899f72e81d07f4d465d7f97c9efb9567f35f0d5d6f3a9151c552fc19c83d9640a758fda21098b058a535dc100343219b22e55bbe876f6a9ea4b2b321e87342170740334f6e0fccfd474f9f25e4191697d9c9a42542cec842341681e6b67391e533c5a234a7e5815ee685a132c3f5eada928c554613c120e8fdeef6fcc4c71c47a759c91630b2a3e9ed8880db355224ffe79e0d859cff0b0f5cbc70b895e627bafc8d2658aaef7b2ad6c8cc638ac63b64438f2b5820c0fd01eb0f8dceac496acb8dc0387078f49d8e3cb6d28066bac4a430c04d5251cf6d8d3338bc836a795bd5e5b37de22d7a71a079e331a64bb8273c39e1d1f89262d2edaff87b9b72ee51869ea765423ae9adfe38ce68399c46f998b95457bf8533d3cfbbaf496b3821023a133c9d0513ba9903d3e8f4deeadfa24649a84d1b8cbad68000dda4773ca9e48cede373bf6a75c93de5b365fab9fac7c1655e30912b5051caf9f42b33f2f15eeb793c97b58193b518e8ce1a118c10b09696d690c4e39cebfd21933c45fd9ff7c25f98679bfbacf3214799afb7c3ca134258b1fc0b4818fb92f22b6611aefe35ce0b8761d75b29f9f3ac968552137f66311560b0e8cb2d0718f63d272b99a4af5b079a150c12833fec62554974ddb90fff67737de1df71a51b9838fe08401bbaf5de410f8ea4414b8813464a94950f9719c95ab19b076f3c0772bf591c34dbef2aea0cafe3930c936339fa2735dbdb920cb596ea58d57e6268f030d6ebea5db266c56d74bf611dadfa40d16ded04a56734b6a876cfcc378eccab2de5fbd329bb35fad40c66912d01a9b27c7d0ec215ad4e372015545e23378f0e1704d071b85024f4e0c56d9583251e295bd32f7674daa5d16e147afdb9e33c937cc1ee589227904e043e5900e88eb3ffe00ed3a47b55c7f00312c83d741851c5df9bc9fa4f881450cee5ad45a5b507b0a99e7fde71c5412d8f9eb0afda5d7b3faff0d7d939183dc7a139cee6431e75e628f0a886f09f9dd453f6c8976518f54b7e7fbc67f75e58fd1bd952655951aafaeea3d220805b3aaf00d974b69cd17c83cb86dc48f2a1127b9f12cc3550c503895b26714da97ea3f816a5497ffa2d5d7307a4abdec3a6d6cdcb9490f8b20f2bfc0f072a70c4706659f5f8bb45f5733483c367cfabd2d6325df1cd4502058660dd7ac4520c69d6fe4f2f224ebb37497e507f3eac32b89591c6d23b6cf3c3c15ea81ecc8ca32228e84232d078420826b743ab97c605ed8b9172cd4d5d40555671d66bae3ec755dc90dda181cc7d00816be7c901a187da1eadfc4391aa6a62ac5702f1d7ecdbad68946beba4cfbeb8e008b7681ac34b16d543cde5a6d8f454495a9841e81b6271637f8781b7d6a989c91a3cf931afc21c35ff5223db7d50b2940910cc3d4efe4a439ebb043985a00bb31cd30cf4cb8f62b73d437ecdec11f632ff0701660c01a08f9e70d3b86144b7248d3413b2bb0572df89fc66fcc9ba97ac98e581f0b71f1cbddb4370a2de0a04a3e7ba9e29d2c6d52561f76cc67abd3f475326ae5be4990744f19d7b8770527ca7b8e11c98b735f21f51cf00d9938c35b9da651706291208bb6e0954e4bcd0a7a67d320fadece56233e5edb3a498ca136a8b0b3c8dd92c8997acf18d3907e6ee26b147f7c7c857ade97ace0595fed960efe1939f61991b12502af094f30617d8bed17d5574fe0f2dc69cfa774c2a4ca6a07a88a01fcd902b7b8470fca12be5ffc57a5cb933e26e7a51d90d7925cf964d22a274ff170b1e4d70361d34d1edd3cbd0f86093930a180bf19b518bc14338cced25c2fce5c607f0e4bc3fcdf3c053b577f8236510f97e6b4c70614f9d29c6ce76411d3a1a72ffae3f9363389548084510d61fae1c251400c8e4d70517e7a29a4490ce2723b667edf738220524e94403323eafff33117b74dd550d7cc0116ee8ee9160547ff4d3288226f6a42128a978628e6ea8e4431730106d8ef7341b8e12bacf6e42adb2b3f696ec5ba6189aab0d0841e66bbe3e69baf88ad604d27a82a06fb762622b74acc07c04bb7b8993bb49c9e571981f67f58e0c397d3629b2df2a43c5c73377bf002ec7eca0a4e2b87ca6fe05cabe86544d11b1f5ef0bb8690618fd97175721066099f120b5a2b28d41bd3b1f4c5f8187d2fe804c95e5fce1a9e4e387dd1da5cf408a8e2d35058766bcf4f79e60fbaf77299cfdaa2c6565d10d269c348327848e1279058ed94dcff940d6ca1fb3035eb6b385909afcfa919bd2468e0993e52bc7790ddda20cdbfa996fdb08ffbd171daaf330df9b9225fec68bdd4f9399d73a1fc681ad233a30a5ebbc8a5acae9977ae87b37412876680bd58c43575f1f8e0ddb9dacca7efc0c4054996d360db314e4d3be014bde3441573d66211bc87f7a25af60b7dc11cc9f586898ec1144c40fea113e17860936425f82abff236c341c2fefb26b4888269a5c9c3d9f72ec76f909056df2565606db8339c025f4b6f7f48b30f51fa64e846ddb53f9efd1815660b044e01a5321208d60c7454e16351583a607bb4d6bd1708a43444065c38fecc77e441707e3171dc886bf9dcffe63375a2ed8879d0fbd858032e1b399bf84949dd1878533bc84492d53874c3413cdb7d87417bc57086f1de01890d5e42bfc08744873bd3616155d1c65b2d302fcd1119f2469fc33fc62a41a62e609ed9f4292bb41bd2187a636a4262bd6c4c52019ff1eae33b98c4244d29fa055c20e9014de035bb84490e364c8cb144793e31414cac7700966f8706204006f64b0df94df44cd04f9a8fa342c358bbd99b2f54f3dff3a186f96e11d56d2bd1ea738c9240e5178cc05c11c3ee974e89651c474481216d715bacbde9fafa9563c71ec63b42eaea72f412f8f5a48f1522ce42ad8851dac3ee68f78597db8f24c57792e27cbbc96d88d4046bc2cc74568efe568aa8cdd19c219522eea4e2f680fee01709dd134b47d8487a93b0cc0eb8d6db9f052d5bd0a110cb741f9776f65216ecf763e7b238206a39bb97490d25e4014f67479e659d7ac5f03641f8fe564216827817210158a2448d10a015f781811741f478835201ce48edb17b50e4dff70589e44e14667373702ec1d69bf3e938219890be658ac4459fab2af6268f591aebeb812f464a503bf6021660636727b1253e8144ca75ae88d411ecd902678c52d18f98e34116b8a3dcf35667f5bc01932e1a0f303d7b873fef063e4d6cd43f48be5d70918d3073522ce8cb12da5b4087411484ab43041612f674677aed3e3ca4ba3d5362b00249f2eec8bb8a99aaac34681426dc667824a7f342b0870c0d490dcd17877e34f20228287d6ff6ba130c43aa023fec2d3f79a9ed58619d52a92f2b00d3550ca16a659ee4ee2f7fc5fd295b10c6150220c1ddbeed9ec2e3467bb5a75a5905347dd13bfc2903434d43d0cc25a049f047c866188efafc1a8270e9a529e391df20528f4ce900a4f287bcf3bb4864711ae3ac97f1c21c5ab3a1585cc658a4642bf5a70c600e6fb98556b6d0bf6d6427dafd55ba32025ba0d369873ddfdda4b830de05af3f13812a44e1bbce9f3ca75477bd4939a1f5c0b6c30284f2b95fec773701f3e2b09f3bdf77515255255c35de3a4c127a07445284cb93d7e51c8782878886f90d7d5aa7c166cd04cd177616af6bd238e72b971af23244097ccffd70d26b969f966ceeccb6597e579e3e3153ad527641e6d7941ee9423fa1219c68be3e28596ee64600b2a7978bd5316236f2c23661b7e1d1e6684f41a9273b497172b506f6ed65d23b627d691d06ec4b2cfed561bb213fe233000e78ad23329fbf961e4e95a57bda44e31e175c7138c0bc7ccd19ab0868d224ec0c2f701e6d66fb316049601c9124c63d74e96f9e7e8a8e7694a759f3c469603633ae1da05666cc4c653c7ddc0d7a677966267f15247149f31153ee6abb6f90e6693cda2f5466dbee1472146d59a2cf9edb18b35f943d96fc2c6492f5b5ab5b029822cf55cf30cf1f55324e55db64a7b4bd05340334b61c98cd246c1d1ae66a94a7a926992f8a51e710c3521efd8a97c4f33629896ea484cfdcd9a56952e864a37e160483dd3d094f2d6e494f26da46d465f3bb7aa9ce75a941cc6462c579f23805b4939c3f119e5e957b5b71bd1e5deffb84125c4cfd982fe445d28edb61bc5a24cafb6bbecdb91d2e32af0b2c1c831a9d3055bac1f99568ae8b1777fd676911c39f6479c33b0192e1da6ea5da9d615f3340ad196f8a135d85e85aa59155a165ca7cf54cb4211fc797bdbfc82f689fc5a5fc4103be78ba1453a2c39f01f10e5f21a9d66efa48bac43621cbfa9347e454dbac3aff168a3397fe027cedb3045606b06e3067fe787b8fa74fbac66e00d815bd98bf96df8926ee6f50aa171155216360132bbd27780932d38fb3b1285c240f3408f94e813e3a1f8fd478a581ae187c17dfeefadc120eb5a129de452923704b26430fb2646e183445d6 -MD = 3fb5d3d8d7154294799650b12df25c71f508c4b0bcd4da2ad6e57babc98439a1fe21d4ef57c7c0befedca85d517fb9c5d5a705ffd90b1a5b9f1717001c8ef547 - -Len = 51712 -Msg = f287b06cc38a839b7dcbb375f1a5bada9296b6c384fa1925f519a219b0648c3beffc054f7174e12bcdd890d106ee4ddb5fbb991c7149e8847aa89a44f8332c337714b070a70b7a49b16b1d5ccb6596fc0b88c6d7788926d56740b64305f4363030d899178bd5b7bfd18a42606992fb073b05253bc3413ae163eade5dfe2f11fac24fa88c455cfe54d440e72308fde5c299399f9277f98e7017adfadb0b6d2559d682c616fe28b8cf6392f4eece2fbdf7cd2c1a22bf3a894a2b91f2055634da151477d9ffdebf4ef9258a5109e6afe96c7fe67f35c18a9336469eae23040f98f52338ca8d0cab269ac32fe6bc7605d3ea5670b711a57414fd10dd167d4083c7c2accd8209b174aa7ae4899b4fa7bae138fad1a9fe947d74673355135b301acf44563ce8bbf4a0416031a15909a0557d2014113c46b62f1c3c540e8b04fc5b1843ca8fe3eafeb95215517e06348a5e0e684c395a30321172441e1168c1cdce0a87afce5ddff6474762ed288c168c5dfcd9494fea0330abdf47366590dacbfc0ed7aeff3de305d0870dada8d1f7cfdbae3bb45ed308da86cc0c4712ed971d6c8afd6f2c6b3c53de7ade3805bf217a608e56346bff8756299f5cf721653feca6e8bf995cce3207f8889f37473ddbb67203f1728055c7cc1cc2ffee99e21c5f338ee6d498500f4aa719165177326cab9b75d615a4bd1265e89bbdd5824b749f9ae63acae7d8194371950c2f9c881d80624ccbc6e01fae4814945e54e58890d363568220514f9a1be1644a79be26365e4ff1992d3b63e49f2813a912c980b82417488881de9bd8f97cee95d6e5f4ff6cebca08f1bd72fc8fad8267b8361d34ba3d23129397a51c06cc9cb8ee1adabfd3bd40dfbb6e323e422a4860ed34464bbc5d4fe9fe8355ad6958d4796a64c0c0ba4ebce832578cf2e027cd5c5acce346520034d56baa94d54ba8ffa2f2cc8e484a24a4e9ff7f685f902c7923a705dd6da6ad3a9d821548dad44586f92d592ca0aac961abc9eeafce7bc2b47c7be81a08ddecc90beacb5a052bb6cf47c413821004c55cf639ad4787c970e6317e7b835f224549e54cd4b39e798344535e0279df7d9efc91f7c31ad2a1bf770859c800ba9b4122f44f3939ede5354ce7a42ff7573fdea846aa380ff72b36cfcab4d77a607067bc009c01d63998534ec93ea1e5be720ccadbfa150d3d915d563f36aed79aca3f7fd1da3471ccba65b4c2d3602c5d3db1c9199161feeef8bc752e885701b0d152d42eb2dbf2ec72f3e59a0b75b27cc9540dc81424c9508adc926052dadeeaac2721e0ccfd40e2e886491990e761633e7dfeb02e6656ac6f44179e3b3d588f8447cfb0cfa245f645a5480707be2059c3b5049885308d49cf7c6aaeeb8a56e98038476364d2e86fb1d94a2b1b03d6a78082874ac1895671d10df5580bc9bf3ec984f0c43296119753a9b74e72bd6d969e6fef8c8b7a996a9d7e1e6643007dd786b2319ae2f5a8b4549df738b4f4cc6c4501a4278b0a3e7d5c574f9e3a3977fce04b74ac1bf8960fdb3d72b18ab0db719cc20ee368412df23621efca997b95f5ffd620c386a6c1f0111291819cfa82efcc399587ca274e11526266b007cfbf090adb9da7ca07129e1ea3ba6f91d9a92cfceea2dd5bc58921d9a51b192d3bdd8129e35220902371632978564511563871556a9babc022c76cf26f78ccb2cad7a58675a9f68003c7855a1acec9c6781706ff34eabaa446ee38c64ae493408195bd461909f041aefa4dda1088c455472f3321d4f5d2ad3ae8ce7dbdc7347c6a00119457dad87c2cf403d1e2eefd69cb6640e4d326ba83059b763e518a78108cfee996b88574d8869bef6719673ea80da5746fb8e43ccfaff178318c9327a4ef788c74c3708dfec3d959c23c5a4dba14d519eb0b961e3941d11b7ff94b09df9c5743570104ea95eb95880dd331f348e8dc757f55a62968c222a8501d1ae56a9a815667f8a9554607b7c56e6753f8fa92a4d0541c7b25053ace67cb826985ecf1e00dcb32c894b91d26580d7f28247719137491eb7ddab7b2bca019af9eaf0eaa5bafac37c7709538cc8913a3183f688513a85f4714102730d49b612c232c78ccd986318d10b1835d90a0a85b8b1074df8bb3e6baa88efdbffe9fcc825ec4d15f44d883be091f2a965ae4f330e960442e62de4dcba11de06422f68238b93ec26c83eec9521c8133ea129e1da99af77f7a8271bd036785782928e6aad69a64f2f97e102ccfb0a14562a1164d4f069dcecbd2b45de8628e6e15f8b86de46bfc0a111d86d4bf2c450904ed94aca8961ad92a3aee5604fbff6a307bb4f2eb93cfb1b94897e8a9fa3626dadf60623eb035479ea269cfdf98a21383972162737aa590fbe78c9016813c45ec5fc19699beb7c130f26bf1ffa33d12153549e40288464edee2adf68d291e0e405601713f2669eee7123de3ee82990eef3e72a1222579946a21423f965aa628e0aa661aba521077cbeb27ce349f7eb01798e5c05ab9070aa88c9396b97c9a3cd44539b992a87703e46370da5760b4a0972dea6a32acb9579f0ce8217ff7c3f1220dc1784d92653b3b63622ee12f028577e3c8c733665524588788086f34e9f0d4ec487d7576a1c6d7d443f35a733108bda4c9fee450a318d9e6bc741299d4e1f2c914f091bef44ec09c5c50489309d073573338ced06ddc2c12cc8dee8f4b6a828b6efa2ad12678ffa5f56e35f95286a0e44f9c774f791759f2007a8d7f18368e1c9ec3c717ffee9bd55675a80cd4d14d32655369369072666d9f6477cf01eb1d63ec72f0f847589c16c68c2a34575a812bbd842ceb7a955d6df37232e9cf323848a02f2edcc55d0b4f8fdb42d9a2c844b69e5846d8ff2745d942cd48334ab2e6b30124072b42a6ef68f78b78637ec49ebb52f74163e7d12798d59c411739142f8c5876054d86db504847c4543bb3f698231f88a5f6f93a0a94f408a3fb65ff1bbbed50b0ab59a336d9c6ad5fc7090539d44e33f8f8fe0af6b4e739f849971cb32908d88fab83a6aa02be6f2070489a8ab72622c4d1bfebf4e0f556c7689513febcf1362ab6cb8db3ab75311f9e375c91b4f17a90e801830a00678799c0278b045def930935fa005abc341ce5ba9ff458b4f566e5a78f7a43fd85f6f5b9172ccef54c17b58ed8a6a61e4358f92a4809e79d7c0c4a753079a4bd97c863bb2c9f636a4ee9b52b2d289fb7ea0ce358fa444459cc9447baab283729e5286b2e2d8ccca63e329172c12d4d7071612caa7d4d79ce2d2764dfc92e0329b73c967ae39a0f8f6419d2cd5c5eb9321f7e5b8a98cb8ee6e9ed2a4a523410a6542c6b071672360f07c7ffa3c563eae33e8bf85f15668987470d20640ee167860521733e8dbc480d7063a05bc5e3e86c14b28c91bac7749b8eafcf95c4de0fb312433485121f4e70e8163d5f2487bcb6ea199e885096560907fdbd463ed21013c3b938456b434f22b5085f16aaf66da807e8b6ab9e7a38b9fa1c74dd426673905fac07e761d1530a1f608de81ed80329b5485c646e1c2193ae377cc499423f11304327d1bc7163107047503d4ad787233a61191b8624197f6d745b610b0d7c7d7ca7226d44ca851ceee42f7df499007ddf5a7436af3929657dfb9b1e5f6f32be8cff8022c185c316e360b210e5c6761fec5bf61eb103572d27f5c3625f126abba874c757fa4925e695e2615fe507f1f1a98e253b542cadbfb38a5c94d19b2c5c182e8176b8bfb2754d93c5d0bc047ada5d198cf56059330369e1ed1e7eb57e89235435e6c38f72a9529a65cc316418c55224b0b59c34f0e29123fe672e066a2a120e6c0fe3606d6bee20c9bc0dcfd497ced81be1d165ec42727718d7a836f7272d86ad59e0daaca4674d7a0618efb5391a5c54e3c7942f0d5506c2d6b6ee2d68bce1802c81a6363a0648ff141a69c3937ed9e3214668c22982f884cc1ed615d6074a6df08f6c1317133ae04cdbe8068d417751051689ac804174e621a995b65756e7fd0dd3d34c21d64aa61822128710ad5d24f5fea0f5f8daa2713d1fd419d4f0e0b7eb1284e84296a1d8dfb98f4d0208b4e75bc855a67b94abac89483a44361e5e24f21727ef619d66fe086608604d9ba31f9e3a4fc5f0b9b71f6bec7041632889ca8ba9636a6531c2a1fdf225c9d7ae5356261d375d3e8fed534cd21d18455688331c8fe060389bdd4825258d8f8a89ec135b38b4734f5f76cf95c3eacfc3ef84e70f9247d9c123de7be8c6e9ba4c7395dfa5556f110a707a1bac877e70c43da46cca7a40dde810eec2ae9fe05307b676416c3a0f3e570c20c0fbe683023286114cb70f727595ac34a6df761b60a298b8c118b03d031e799045e8a89e8ef413f20f3c1886a8b03dd9aee31441ec056283e7117fa1674700f332dd94791bf22c703bc35f237f210c04632341fbfc185bfe3cbf6fe272bbe971104173bcb11419b35ab3aaf200d061de4b05c4f19ac3cd52478b48a92c607c31667c0d0f584221e2f374c29b35a6848ff0f267cacdeefea690dbd19d9e1f015cbcf62a1819648d258f6e6fc52689bc3eda53f02f9e813723a018d367cfe1bf199b169282fb62a5a6b5097818da6252138f8e28c71364c0f1feab17aec78cff9189460cf30724b18aedada73e591a8e37990dd73b377fe13732fa621b8f0909eb10ee62134492f9fcc0c2c2dcab97b8d28036c5320fbae21ec56f7f562e412550b8745a8cba95c522b4b0929dd9c3180bca73b955a5fe0acd3e713406ac1b9be80841bd0371135c2453dfdf26e985f60b012b7d4c0031a36c25674bd3127eb2da88bd522372f5072b25b77122e6c499faacc5d7be283df32503bb8a676754b34fc050e391c4240e5fb1a10f37d56a4aff54ab90532608431e5fd4ba67b384e66e396336f86f87b9e77f03830dc05e5142804470b4017cda7fc11aa37efef693607a5c15fe7c054feb1746934dae88f6ecb8f83e89c1800271b1f50c525192024c0ba5464bf2881a9502d3089fa8d08125852fc4796ffb011cb8cdbe8bb3407b5b75a49188d9f7600bc711a9aab51e39146d51c82d11d720a75d0a82d22de845b53fc3c05d39396a75ee674017dd5a67e2fac6134db2fba73a29141ecfc672a981f16999711b3880fcff3f938d286c53b6b4f76d80574fdeffa3545a2986c6efe814fde66d86dbeac883006cb59f3c45b9224a9d6e0abb0c1b5330008875cc5f112fe96df8830aef000211913749b38513cc286dc0d2277bb9c111d6969c6d4024ca94f7bb19add8cc02dccaba2fb75aeb3afaa31eb87b71ff7660a6f8028fdc4b6d664b5e50aded550dc8e1e657310e69f526082fc29f3715f9833659af1b79aca1c7338830f076c3aa3d9c65cb0ae7b78416649cfa7b1524d2e44e5facfa606fed1f75e1c25fbb3e62a3c5dc93282efa6f307f0c68f852548ae9b8b20012d9bddad6da120de204edbb6322f6b5752a5d3fde202813fc38cca8fc3bfbb34d2bbeef542ac3196298f83fe37c593bd825057b87119803700db5b4849ee2ce92a099b4022d9befc5c088768c9aad2c38651dab921803403d1a3636e9aa0e58c87e77b146aa4396f5c4c5e7c6469b917f33cb5769fe12d349a778b792272859d90e7f6f896b6316d8ecd61afa46ca7194d73708738a6cc37efca3bfe9ddd7daac98da753436a278587fe3978e63e4d45f998b451886b918c360ded45593c4e12964af4badd4a8c35cc716e7ec658ec3c8c1ec97c0b8a3daff1d51803e13977938b9277a5e0d1effcb0a95917a147244b7968485d3ead0121c79254a0c23f7a7c1e16a89ada8ac358f91881da238386214617b97b9e2e8c801bd82ba288c8c75ac229f00046ff96c8fa41813cb988822c76af955db69940296308f59f815ffeae1c5ee68ca28aeacb38b6cfc5cfd088eb8f925489f467ccac31c75aee588f80e49118047679c72fde38dae60bf2f63add05627f76e43472770c75b4258ac1eeaca507d284393ee6807f303c55bf63f87f5c928eab1269d22857a6a9bb7481a854dc80d90c6d5caf4070695b5981a4525109950aaceb828c1ea7dca436b2593e8bbc356095829adaacb0b8cb7de621c8e0a0fc6be2fc18d0e8818a2c2dd0b3219fa87831a61583f903c4d105495976ccac973b3ae3a09771145931a9e74c19f22f45cba4c492b29b1401347122581dfe2370d3e0359578cd10a355c619711810a8f8c232578671312c0a45c7cf7e81bdd3b249044f3747456c0488d92b0c181dab55ee82f56d7a4bda54975177194c8c3bc01d0f96f29d8a84d12d8ba269a46994d192ef24c4285b9d54abb6dfc4d8f9da4ed27ab373c60d09bdc63606164794f3f0620f5c06f5e0e3aef550501da1872da2ebde1b275b3d590ed560cc9e7c105736de3c01b27d6c5bb806b67e6040a4a460cb923489e7abf168fda47c6eac7c2d096a2dbc63295e43f44271c15930d2dd0d143f9617d5c9614081797c037328e40c883cf27584476b084afabf44fcb2460c385ec65dc026371a134871f94ab71ab4cae22a8618b80f5882b9cedffe936de2ca483bc81132e17a2599c4bcada74f76b4c5fb014110cf698c478666d126c3252cb47cf3438fded53b060aca1669e0d6a850ba63a7f219bfca1c5c95feccc447e20be04bf19dadbfb5e5aaae0f8f8d59480b0f49b7cc8ccfbec0e7d9e1f61fcf7cb72c4e95dccc9e48e12ae513788373066d501ffb10871decad8eaf254304307f5eb7879addc9f5466111ebacc581c855e03352ec5e972ee65ad78223343fff4c6af8638b01045940ede64e45e706adc91c1f8ef6173b770e5148ff863a11a07654858ee0f72a4ecaf01e69796d60b7d2797b20c2daf28af7296973a8d527a88fb3e5462710aa2a371030e9a1c94e5b0470dcb4bd0a4aef232baf8b1585f09bfaf17e45e7fde28037b6b43b797b2e2bd19acab75f35a2f8050081a256dcfadf3aa5d6fa8e1f91f52f6c1ecb4af36e9ebc6fbbb523dda94a2f208665e73aa506e13975d093e606dd9098e735a0d2ae184768361a9572bc6a04143422313f8d976134e15493e1dfce0dd583f715995b4ce50ca0643e855acc26440173df5c23054d20901308a36b2af99aab8c13a8049127d5a13e999612d5083874e75c0103d5077508886cab6798d6609461159f2889725bbee6112563391c8a14d911ce8e8b12bab1212a5a238c46cff512b5ef359a76e730173fa3ca5ce59157e59b35419c115a3079dc404d79ad21341d5f08ba488830cb3e9fa1c6a4f5e6b48972a5bb8c65ebfd0efcfe33d58c1ce7ed8b7c351838a0e6b8ab9fd6c5c002c12112c05ad092d88d3d06d48544560b670fc5da248e0acff931de0e7923d66df46905f5be0d2ab857908463a03abd8558008873172e71069926b16e2c439ba0c4bdc6b643969ff3e2a5e03c132d0503314c6df77b5e0dfd3d03c04f7ea99213b89bdf929a115533b4f9c4ce5c9fdf1d696fc0d7cfa1240c6b557512deda6c5f568fbb1b0fe1fcc054e88c8afb17ae3c86c73b9482ac65cc9a986a68db3a5cec1505d3a033acf942391eb2026d08f4d9100f38ae42b445a64148fab1d25e16428a9ad3d2a3b6dd31d7e8cfc530f8457b7b8442857e7d4631f5e3b07e72ba1adb1dbb1612beb41b07c7f35023c56a02bc4fe2d3ca944be9f83ef5263f3ae2cd4e44e324f10309354c6fbacddeb8e2dee4039776ee22c4935172f9c664794cbff496af7aee1f4aae7865aba33689d71cbb1d0ea650b86be4e6387e1b9edc7c6576998ca27a41ecf90410327adb96db5e8a12d4eca2c3a6511f05de803ed2d6503cb3e716263964a778160bbf2e8e5406d97b76b444b2f86a7451a7aed4db0f02bf7c6b506254463c5cdd83eabfdec5c831cd6097c724f6937eb275f1f1737aef976965ebbf31062a2aed3777ffe6c4f52b7f2ef19a88156ea68ea5f4053a9e893cf18342bd4e28e35abb92f17f54c6201f073e6c4f6ad94e846cd41f807f0e6218ab2fffcd0a230a74cf32e1ae974ddb84fc2b62562bb6c580c37cff13df3f0cc30ce86d6ef38901f19e73c31e3cb08a15d4527e3f79426624390cfd0fc9a4ebb48d392623a8cf6c69bfe2104ea3b2ae1a16500a7ba1e0a30723f0a404dcd47185a29eb47b886aac459a0a43a06ac8da3a38a0b18b5425fe721ae48e736742408ee38592e710ff340db368f7b3f04770dec1d0edfefe96fb2d944516dc2772eb58d67a4bf6e0d1b62aa26a8719e2c31470384d2a370f980b72069ec7bf6beaa47be2093a1b66a68544ddab8c22a0c037a70291f0d415cdb1e8185e3b9dc32e3e60acbef7d510c233b4cb88616ec8c34cebc72bdc569f8c8108100fcce7bb920b8f8ce80fa48dd9342302adc16ea950e6a6ec97372f0b78eb5aa430063db3ca8e810920ec1a2c3028e809780692e0dd7770e950abcdf7f773483b4b61f05a4c49cda7f617967a8b64ac4673bb8c0ded81c253e4b4d3d3ac9b594bce8ab00d7bcfddffe40cba073f89c8501d5aba6ee59823a2cfbca12cfcd6266c45caed4bfd832a675755f540c10ac49cf16e9ea27a2d0d5c6e5de6626cb618032dbd18a436063b74dc6dc8b5b46a39b38c61b946ffa2f7e76d02f42270bda6a6f2dbc294a9bba9beffceb4d47e2a900a4ace8aab0abc7bea48365adbad4f6ade41a16b9bed25cd9c1df33a3ba2be5027b91f936d1fbbf1cb6c729b0c770dcd0f86a8743864d74f92d365d949c6a8028263df53fba334021156423523625b65b12e4b9cd8a5428849acb1029d3e8a2fa0b7885ce539a71532922fa9bef3ca9d79c525162b22fa0017064f56948ea7101930a51ea847a7b3d5ac95693dafcdfcbfd7afa07e62505f816cab35ce3bb18c426ba009b351985641120e143e0af80bf9d245ac60e7f7ff1f6c5f30a8da2bdcc2d513be94ec1b852b4f040b2e79bb33be41a19a612863575771c5d7c2ce6899f0e98a9ddb7b83c8ead011ee8d80aa1c83a23e0b0da7f500b019998b9a9d0a3c73354f37e584638a0621b21ee9c4272ed070657ea4eb5f73cfc024dc9eda833cc0250c0d519b5d4113d06f1cb198c4d33b38c255e576f538fd02023b5dfb66334e553b9e8e34b3a67a4893787392f5a21a67df214dbf48c8ce6bb -MD = 1333d76d9642fff25a78e1df287d433bf30c61c2157870e19abec86524bc248c974a61a14546cd6edd382910b9f269a913b09f72f44534797662d3c4409e5701 - -Len = 52504 -Msg = 4b21e011a232ade7a8c92be77925e878ae0bea9723749528fe83cf89ecb9616dae6ca0e8d5754ec6c92abb21108c2f33cdc18c6887c430b72c5b193356494cddccc577bd4c2cd53188f352846edff0c2ac7869cb74bb16a77c0f0f194a7a9477ae15abb890bd0bcfeb0c39381a87f1d05319c7e971c10e9ef687f96450b400e25b4285032892b849fd5db8649cedfb03c88defea063ee144a1ab1f3bf05f59c7db364dc39c11a446c3ce16307d78d50315ba29f5bb9a57438564c8c7b3e367cd37d74b2375a4966f47489dc5448f4979428abd32193d3840aa983d3020a9f29d760fc7493ab2576c90b1934b799c1d0d55e4f2caa78f4ce61930c79dc017c2dea0c5085d73a3b0e4a6f341e9a5061a6658af11e5edf95bdad915ac3619969e39bee15788a8de667f92f4efc84f35082d52d562aa74e12cc7f22d3425b58f5056d74afcf162cd44e65b9ee510ff91af094c3d2d42c3b088536d62a98f1c689edcf3ea3fc228d711c109d76ae83d82d6a34dcfbad563cf3726519b519fd48b51741aa86720836494b7a589c778927047a25d73508adaa401e9a6c0767a675e31c5556cbe35fadc9671359b45e985c3c8af84113989b299ae4474b85e4b5d4b0578ab1e8a2915a8df97c4f52a639fe32272cb91bbfb721505dec46d51383cb8973425a714245c2e37d0577fbe0d66381d9239db1f08a380cf609dc699698e0fada2caeda44d58d766c4f8214b10642b80b8d7d8add7cc41d47108ab7d07dab71069a2d982cc900b331caec317942122158bac6eac9175c2dcba0c04443aa9188832b553f5ca8c336880824d6bc02486a2b4c086665d276aafe3b1b93729829adca50c44466fd5b5cb977aa78fbcf5c0f0da1b09216468a11493ffb39efdeda5d669ae92bee2f2fb250aa1b9cbb11c36c7a6c6dd26cdc3cfd572ffd8c1dd72a13c27a327a34c6b6b3d80fc6c67c72152eec0c8ecbdc1bd5cb829b811e7f29af6d786f4e93dd4c96fdda295a6aa258d7b2fcf291c2d68e0b1866032475964ec0c6f2fa8c2d6a3936ecb187350def4e818507bf157c0e9b33406be7660605af14cccc9c799b4e051d0d0899e53495bb8931a6e2984bc6dbe4e02ec8b4642fc2f1cb5fd5a5520b48cfcb49e1f9533838753554dd98b6a1b8a67409279df477330e5f37367e06247ca5c3ffefd00e693dcc0c9c30754121c9ee88a574915b9e77c104fd2f921c2c096573951407ba9b440423d76bdc6fc978237a6e302cede7f99038ec31500884775556941f1edc30e3a417b0e02cb6fb5bfbe5cdfacf4006411287bedc565fb06f1be987416407dc852254934df4ab59edce476f3506e65be6ce6ddf91038642291fb8e92ba5b1f0b105670905a2c14796110bac6f52455b430a47b8eff610bc6dd721344e226f1fefd3db8c97e57d56ed7acf201a3fe1a6ee7cc1e5598c938185e8cef3298893acaa040e88750b43fa7c51fe44b62e4fb1518c58ef5e55633409bb1e903e36c449681c8ca74da2b9c49b3d1594d3bbe3fd14cf79317eef143671d4acb5fccb7558b293e243623a5327f292a18af35742fc90acaf563ba83b2b56abd5bf05952b6d11f08bf7533084b6fb092eb1859ee1326daa67b8051f2c6510c74625b9425af8feb9063da133e2d41cf719830ae15330f44f3ef17bb28c8648bd5a74b851987ed163cd70cca2d201e0f2fe8a03ccfd6add11917cf000bff156d4af466331488142776e5b460bf6e2ef734a3100b0545280880bb512985b58d3c3a0f54a6fff82ca6a5537adeda5d980fe8912724a0c9a77290a5453e7d30f37f0dc1bee6c3205c1c30ea054b683785dfb4798e8e86a85295b29c5145daba70bf2ad24cfc4648cd108172feaf50421cf0fe25ed51a12a52fb4c67204886992c83fb0aa5ef72b8a70affb30c127ac786c92f5beb76d799cf2cc8cf584e68154e53e73172c72eb711921275d87dce0deaf2b0e43003123bf0af8c9ca2606878ffb7560e5a8c618e3331227f0af7345e71f4e8886503395ade0b0296a5856e086638b06a0647f586366e979a4989940042563e0e327b343cc1cb90840ac5620fac5d5e0d1d00d1e542d2da8e3d3ad63c87a01c403e75eb29c074a03078282cd3f8afc6bf48bdddf37ee451238f12e25a655be9e432f8466b0390996098b7b59d73b551482f8801fa132c6520e719a0a2060e0cc3b50d2d49b3a6e3dd1279e3b444f7676f7968254029327e4fec58f95c9241efa570bb880af83fe66f8d779f6295fd71fdcf66310ee67f057647d6d3cf307cf9520a0a3ff7f9e209ddb1b7d2ed8b50d5bbd8880dac759a605ea09b1844094892912c023a58df17b7f12743629e5077fd6e3dd8a262fc0bf9cf9db0ae03452c222b7eac6175d1675571972339bd0cfa4fe1a55ed678a45b3791e91c7f540bb111e9a70f9d95f8584c26a85d3d92e66235dbb92192359411816b2ae7717f835dc8915033d4017c7404d803fb5864073516232129bfe3f5b54126091a6ecbd7bbadeb2021ef028443e54f5004717d97fe5a82847e43c8eecfde8a2dbc5d822c5029c1c0e0d7de384c585236816f23bd4268c08a29082ca8e8c05f3fd525eaada6a5d9d77872ddc117c3ab5d793c9fa18baaa5dc31f4594a874f6de66eb04b7f4487fc0ef2aa49472c8f206ef4bf396c6087f8229ef196fd35f37ccb8de5efcdb238f20d556668f114257a11fbe038464a67830378e62ae9791453953dac1dbd7921837ba98e84e856eb80ed9487e656d0b20c28c8ba5e35db1abbed83ed1c7720a97701f709e3547a4bfcabca9c89c57ad15c3996577a0ae36d7c7b699035242f37954646c1cd5c08acb4f2a2076abad02a3bdde8a4c68f1a755ee6f67eb0ec2e35a6f39e9d8c288976726b26b0d15e5b2671bcc88989ed079a29d7329dd5f6a60a72af078567e18510fcbe5d8005d9a22dc57f3dee0d4b3345a4f526d6eb6b1f1ec1238a61a5af82e41a924f5d50522da800ce4fbb98d224dc98e9d9123c721fd95bf62e198fb90a59968f0530f8f185fdea5007d873a964c9cd5a53370e3430a308d1fc966d28a4d7375e86e246e031964bae6c2ee6fa7b720bf19d2eaad9d9e48f5cfabe8723d9c6c4a7da598244b9d9eb9087a338eaef411a56bee05888a304b93e327a24d32f8f06110a7ff448a630929c5e20b3a34a9cc130be346069146b4e20acb38d603098c5451d3be4117f02077dfc8e9d4d13edc927a61109a5b68116a96f4f0bf1644ac8eb1b7499caccb713d966d33f0fd39bfbe47d619c6411afd8828338e4ae520dd9aa0d145c9916b77e59a6d9e112110e1d0f4b0b61cdab5b5e52f05460c0824abe2afa0275a6e36910a4c286cb7e55aef75019f7a0090eef6ec2be8dc94f7c674014ea262c1abe379063c5c4447a28e3534dee0da13fc2d1d17af6c96582c9ce2710e568c81d2c88c83db47a952e1015f7b1d235ab984d6b4f21a0f27e82f0e53bc5f4b093d6b7c57edb999007c397acac22cd57083c3923af5fc2ef5a77791644dc1ee6d36ee6547be47bede06145103a48e85bfe520e63bbde66a84188edc809fc6cf2d10d419e8701637b682fa1a969cd2a29d6035292394393057dddd26253cee4bcd5d9510b69da5821e95633e001569ca9d8768f17f23952ee559fb34eeafa912d27fd9d04eb1662c7a9fe831bc98e44c44bd44c5cae66aa4b10f615f39627782b0e9faeefd35d8955f14d1ac38a1a2c60794412c83472a304f70982b91ffda39fd4e80a35ea59d6b4096e7f410ca55c66a8ef68c34e064501520181084c261972bfff3b3ff8b050ca39873afb17d5dabf21fcd6b5c2ca992b69059b48e647e28a180cc974c50a0080c9c1d45b7352b0512c94e4065965a668833e56e1b50b07d126393a3b1810ecbf0043d4c8e7c5e60610df1b1fdb8074a1e9d43d3c81178f2e33ac18febb691e6d2836c2aa3dd682c51704026610c20cbfe4eed5bf12168288858dea2474be9e7387c127683b2c8e75872c2244c0d475a8bab4a8d330aee8c9650539150cb772ba650d896caa701100a97e0122b25db746b34f3de1a287cad81b3c8c384bfba4290c41731d5149144dc5232966af06db7f19e71c4f314a2f9def596bf7f8333ca7c3866ae3fa609e442342227a7f77e83d32a3ce86a59f200029845eb9dd06401ed104f8266b5cb7cd0a0472c4ea57e66748acdaefc62da4e910e7eee7c01dba757fe2a44e6de767d0c491a3aeb84edee5a12ac8f15b9dc340eda7a2e76a1fb1941549f6c3c8a6b73597103d9eb006d79f854421f32e9685ed08ef0322a3b52e63db6077ee4443aee4cca9c6fe9b24d97c3e226b5f05c1f3d8a9e59800328738c91850ae35a96655c6aa86c8354153ec6713ed319ca9c614ea18b1e9eae13cd7b116402401beb6b2c17bcccaab6a3919454bcdf812e24cf1099c7c7e46767d13001b595fbb4cdcd0be85a655c8de7e67ff2fe94a2977fb901e7f6ee07dbaf1f59f70c2e9c91b7fb4a6123af0f464cbdf7d076aae49327dfb1207ae96f8754184765da44a95f348685f68b02397c6c887a71b77addad9773acb7d65281e6f14c96d292708859cdff3d3cf317619ca1c6965b239ce443594533329ba1f566f13ca6d1e72ad03ddeb5de891e572e2396f8da015d899ef0e79503152d6010a3fe6915c82aec1768015ae88f5f39e5ada6bf93e8d7b96442cd138ac41e059a1a53426249e02ca464b04ef9a428382ea77b6b729604a4ea95642148e3f01ac836aa58fabba9752da07602806c1bfa7f8d6f8cf47d66e48875674ebbe9261841756e2d6db1e95e09c7cd35fb4bacd94eec0da4782390f0c47f211c524822768c73093039a1123fdf371039e8c74d5d132fd0329c1cf54234ff3beaba8597ce1fbc2601cd2dc692f47af98ec753900e72e551d7dece26614092025a3325d877619d2ef2b6ac8900101ff3b525a4f755d4890cd49eab86d67db43eeb8aad871af8a29eb374a1bc0f8872794d620ff5dbbea75bd97a59990a52f22c1eff8106114b68ffa495a1d209e42ef4a83b091e08a7bce956e04cff7556c874452044e802e05cbc4688218d97a9a21065ef24d25516361fcd7efa1cbfffa3822e8b6d9f584e0a7f29caa521214f8836f71ce7b559809f79bd84e56342b41fd01b9f7fbe99eade92cedba14f4f5c2df2ec32d6297e8d7571a7c09375962a9a08aceadfa8405d55a19649aa6a7a462fbea5cf54b14c7344b20c8098c632b9ae7642ec21fed40c1c26208325052a93e9f4c45107ef4c0889955c6349d790f7c9c37e11cb24dd7d8e9afe26a5a1e8dc095fb8564435e583c0a637d73b1c495b785adf0a5fbcb538196a7f82b0b32d74ea4a024dbe27a19b666eff5af116c45b36b6c624341903b2693f2545badb70f5293e32b5ca2718a5f75a437ce0698a7d8151c3fe0cec4172ea639fee486d4be332b6ba1cecd6b339ffe274abad670448f4d669063e88d70019824fcacdfb26b5934e18e1ba98f9ddfcb233659c91da33ed9f25cb4d816cc07305a589dff789e2c76ecfa2a7f064f85a23e049529c74c4f8267abbbe685b6a838841a9e304fdf14b835eee396f8d1fb4c20bb543c95c828106d85605903b34c76494896b85fb779c464712e388caca7917263804cb09e334baef38b7bb74d5bb452ec6fe0cfadc360208cf3abea67f338dc05009f4056d6fbcffc2492ca0b3db8460d10f0c84a5a5511461a383b8a460b05a7bc7d6c797be77ba913e763755a4aceb461307114a66ae0a78b27a79e07d096549c305c8e89d8580140c2ab141a3492e84ae7f395106935b72fc0552aa050361188ff391d68960e0c936aca6fe63d39b1b35f7555fe18b77fec4b6eb678538ee868312bae7fe946d2f529e70f242c6c1784de20dbd9410f06ab0f19caf7a146e0240f59ca3899a85c4c452a7a3ecad223a5ad1baf0aaae55455557fef85010501a4e1ecf8fa6ddbb18207bc3a9adf14dcfe148f59f71ce072d065c7ac8a3c7354d1ef0bc12e2e88d97db7c5d7a233d94b785aa4610a5ea86706871a8a6e1a39e09180dfac3aa456dd279d6cd7bc8dca76f9c98150aa3ae63bdd03a0109963ffaecddd90418797eec46601dac452b68e676aa74fae3e7642f73f2080c674df6cc46e4f45087dcff796242a3725cb77ce26b43d350130db63a21327e3346556292c5a1c268a84131a5b4861aa838f9632b9bdd35cd3e731f2444160f0e3d58fdeee7b8c5c4e052dff1cbaee5b6506db612a6fb1ecabcb4096e6b013d05a2d533210b7e90fdc66e34de16219735398100481b11e0c1244cff88e4a88aa21d36acd9cf87966bd11feacb0282a1ad5adfbc2c46a64e48fbaa8bf47f607a7c1319c589925868a786c46c693f4687774ad6644fd84c99daa959194169cd7efc1adb17b102656a395e1824091ae1cb3b700173233e6965feb3d531f052541a9a9b170dd08e331d89dd77cc5b23e8ef5270ed6336f781251db1bb6071b778dfe02a4a2278943615117b6fafbff8c06664a3f6defb822879c019581f5607b031552ee0f009c312d378be5c58a7f80cc2eabfca20f16cc3b67e5147e90dd19ea1724f77f114792dcb281cea51b3b032774cfab3f3b915e77db10017381993a8c2bfd26ba02944fb7e982d8615639fb616040b60a1a32c0832009c2296f9cc42f7a67e5877a8b500605156bc3e28352c01c8583cc5500dba75d58c16803efa11c2be99cb021337d112dc3ef916821ee8dcd267c4c9303952bbb8664f7e599b79b670cb1fba094be1f8a13cc948f19b90f9eab07547d44d756611a15a0bca2f0f356568d319fb6fc79448d6b9400759990b59d8eaabbca8a72779c3b293013326e1f51981ac5a21d6882b93259623d78563a847817f49e94c527953d5bebf36752eb853a7dbb5f0b326c208aaa5e773daa56e62d63d0c6df98978c85fe924a76e8e179dc2329f5ac1f2b49dc509c2dd0d4304d1556f94c5132ef097adad02147782ab5e4d5b56dea79e7bc8e14c366191cf24098b81437d4dd589484b64a7fc24aedc1bc590aceac86c7020abc7b2bffcac1481e50cc904fdffab60b5cab6ccfa55326ca77ce20d990f4a2b6106e836d25c8ec0fe7c65ea981fcf6779299f056d3846b78f9aa6b5bdd9624fcda427648762cb4d345ada9cc0b86dd3121bc143f1aa7182da545b819b5d41143e09f0c79051828d232277a9fc5c2f29fd1bedf72c3e4b55045480efb62d6f0f2eb2e4ee81ab2d17476dcd80af6d6bd2a69445ad71564cb4b9f5a76e92bc54973c396437dfd223622d876cbf5e8eac63ab3f98b575a4fe1857c24f7cb57c9a52d3080f321f591df42229a5b48e127963875827cd8d8cd8066a34d99892f098a88fa9467ba4c27553e1af291eb2ab4b48a788a3543d9042f56de7e640cfbae83ece879a631480b1f7c892674c70bbaa89a84b7bc81a31f76bdf35f613a03df15c1c4d8b86f3266c56636de0cc2cb61fbcf61b11b797e44dd03ab9797fc8ec5ca6f5458a65b525fd062ebc162c5b4d03490d6215a12b49ced90cecf0f3be587295e61a277dcef1fc7da6e777db90c30db47acaf7f368c4e2dcd24aecfdd514fbaf7b25d33dc52cd323588a966841ca8785bab0294cc4d82262074dde1cb184206a01132e342c4929adb01ff23102c6194349bc3a0bb40625ef288034cee828a94c244c98ef68b968534a120be438483b63a4499acedad135fac26c9192dd94fecc614c93cdfef007ea830b53e076b3567d56e2dbf49dcc0b1b417d74f6f63b8971249dbf5e73af80a9f7565ac432b9f2e6de027e1b7148fda7423d4f69e6aee1c10aba6c2f5b2a8b38139d90fdf0aea936a632e1a1f9ea86452116917a13419032701d3aaf2a13600b644b86fc2513e1e34bfea7369c234d7b8ab3db960095fd5be1509b6c44dca79a65eabd5d647c25833bc04f37ec85bb90db7f9e4c333eb193fadf1ed54ff8da7b94f5a4702369fc8cf2124a344f84494b9fe44a0b2f9e357119232578afea61158de6cd02e64fcf771b8f189a49a18ef2448c7f615a270189c8c75fc4e943e40e9d58a75421a026b7f4714af86f5fe53b65d29edd477b9e2486362e589077dbad6fa5b4027a0d9ae6397341dd3521f47d704138ed7c0e7407ddea01921a08a0985168838c33ea8488370fada71f9a353ef072de006c521b7a3c6d8a000a78eb460f0b865ff3c97bf499a0eee4a32b1ff662c1eeb4acd90d122e3b1830c64b044cd5294d0c4e1d09d1cdc1761454571d4a43c8fb789215b1562fdd4c92f1e19403602c380f877786963ffbe3b49790c5911fe274dad0aac0bccdce87a501ff03002c9ee7d8444baac88ccaa854018aa17153c8fb49ccea83cc647969f57ad5e9d996fbdd05191bcedf20883471168729419bc6ef440b5792fb908863e2b118b0e63bcd78046a5a6b4097ef387a4b28d5a83476d167f09476c0ee55f62b6939e0bc878e5954acaa18a35f5a04fe13d23f1bda534204310397c2ba7ca10df7ac01c306a8e184746d5f5de3432a6b0535bdf2d9e6a1d731478e67a166e528e1018ca035b7b102462697f6c045295f93a5dae3dfab712f75b2b3261f9f42fab9bcf9ca9135485c96685b0472da822a43b52e55480c509b72d7be94a1903b01f640c1b8a5ac0801e9a530fd777db58999e620dd9f939099ad490929c3f44dbd0b3f8cd0ef867070a45f82485aa943cc0abb4ad362ebe1b8a9791b5bf315ebaa7d0bb3c9eb4f22578b19f77b78d7ad801aa714dd2e4fa466fbda7db1bb8fa558c027cf0a05709df4d246e91d6e9363345e2c07615e695922f8ff98b189bc0b2689263707ea9533f72e78df94b866f55729ccaae67fb3807b355b04d1ea457db21c899449e72794ccf4225377d2cce477220b68030ea8baee357f3a9959968d8a1ec46f46a7a220e4c7c5ed4d3a3fa102bb6ad71d87c358ea7dceb28e5439aafce4691084889f78ed2df5f57b7b29cb887a6d70bc779dfafe82ebf51766a966a921ea309a266a0d347b1514890235c486d375bd566a9301a8c9398acb0d60411d4bba47fdfdac4e5953b5b30c5bce1c7c4b262571bd3d1d67d549ec2fc4e8aaa7c66bbf067ad0bcda2c5a695c046d43d765f131a4fc169eba1b8f81ac09bd33f716710e6a2a71f9258975a02e888dcb26a8697a56b39a162e209cf3d658585d79d06cce8f88fa53c9df89efca54ca22f886f1580d5042142278d4ab154d4497be78b177fd12f48d45b329a0d5f58cebbb862b634f7ea9093578e9200f450c632373d -MD = 4bccd0e158f345b34d583f929c0a74d2b502d3a8f4112aeb8a3e0e253a817c52caa947a62a4bf857d1e37b3fc9a5dead09fc2266319733ca2371051a4e358e0e - -Len = 53296 -Msg = efd8212e7ba7985699cbf81402e3f0aef704d3758db890f04946e436ec34ce9c900b4490f45a24c515fd6d91fe9faf93e07ec098656eb1bf422100dc0ca50f1b4c2ed5e6d516d40855224b122b07acfd782d501279b26a0714b23a6bb0c683444aca3ef6c5e4906682c1fa603122d036e798ecaa708ba30ee681f8aa829d105eb366e6896dcb4029c463e243b9f901855447fa2af302441ee117a3622a359fb3ae8b356675d3cc97428f6b826b922831e7c3e458a91e357d2cfba45b5093198964c0935784041cf925cdfde7eef72e83ca9310fc3be75e73f1b5615d9bc16429fd8d68224267199694a50038eb30f9c3223fe8e05065a84a55ce4430b3c66adba07a1c905903a9b8b8a0dc3e094373391a50d2cb91a1f94882cdb49b41aa11e6751017696ee0b5a5b945f9c1f13a832cd74d3884a5a23bb7a03a1968ed754394a5d6c2752c0726a6be1dbf894a1c10e684be81d4367054ddd69eda5d5e30e72b5855837b387fe203efaf975dbdf204ad472b1583e9142e034d8061433de3e5f4b513c3453d50d3047583e706f2c346ca481d5c596895af702d6815e131942537e59aeb99e183e0f17821184d9097be85b01cbe1e5bfbc16e9dde5e01e34d8e3c10726140cc1ff0111f1293f840775425a7aea399694f4b43c56ba469fa150a4a5c218f02a72cedad93ddbfcfa969f0f4545d73933b983438ce964fe21ff581aaf431dba61ab3be0dfc0a039c74787a38e0b096d479de6695e0e8c734faf3d9a5fe2aaff6ccba4b798121c92548a9da3a732f7424ca29c8a222e87527321afb81a39272b8664c7c394aab7833ce06f8423363754bd68242a7bd1ebf83706fcf860af38cb58f6e39948030778ead96bc974bd3021046f0bcebd9120e0f5bfc3dfe5cd465b5f02a6ad44b3630fe8e610f83e108813cc27c1eb79c4dcb949cc82e2fc0be65803187f73fd2470a4b1970d74c1e885c97f12d505331565cdadadb88625f38f4ddf98ec81e3eea6d3cf5cafe3b29ddf9e97c0b3b07beb52ba9be3e35e060ca7a95f045c5b8b6a8c19bcb776a982b8ec2fa0a1ec51b6cf39ec9f0f81beeecfc5f70bfb6d75763076f2e428005ab4b241d92446fd7d662971f01171124d72b570b360ee9e4416d91ddbe03ecb5bbb2267478d2055a81c929151bdb9237e14462e6af84e4d5bffbce7412b5c36412871c2e755be83464c831e8dde6823b5660a559a3cab1931935459cf4010ef9f6f38fb35187214fc78838ff10dde91a7ca6a9cad988580597447ebe2a8fd45cb01e066bd400b791f230c5c47c6bcfbb9c3ff5a21a65df12815001407d061d75882f09bec56bb2e42ce9619ee8363d06fd52124a2e0950a41e80578cb50ff12cc54e2014ee731b2fbfdb93f51de63ae3e9088628dd1db2a2b7fd07089a515969b1a5d4d515bef95af12de332e424cf3aa689dba6ef490ef394ef991ef3755c149259ac6903f4544c0b08d9bb039803f37dfc982b2b346b81fd7d95358a220315b195313880be34ef5493fef942e9def6b689461e5a87d1333acf84b425015554567fe9ab54c4a22a16f7d9546bbf682b995a6ce944e949f1920eee058db95ab9c93f5e2846ada5e5975bf33544c4aa7b6e9492f3b103d9a34f62598f8af31a2d51fe18181f21460821e8d202979eabcc7c6241a4697d8c31b7f24fbae4579e9637e49ee4a7ca8c7cfac500252af573080ceaff6433fe678413e757ee628ceddec41877f2a64d7f276a1c0504c5720b156654579bd92e7482aa68fa93cd3b0feb3dc32eace45527f2bb12670932bc7addd2c9ceb121b6ba14c69ebe11ed0b0da7ed0c487928888dc533d1b09a387cc8469871ee0ed43e4123adb12ed18aa5eef81b1c4fc03c8eb8891c8167219e5afe3aff733e1bba6d1295a8c8cf396cb0bac80e1acbebe610b024bc4915052dfd23a050f7463e9aec3454ff0b2bb25ad579fe0f2f4261efb67e805c5241aead0e3f5fd4278fe03d62af46faa3c9a51ebc348266833e8a1f27298443c47384e6345b61d029a06a6c788c55e1b831787e0cf33c5b3d46ce3d0cb917bbc634ef9f187d8d8f250142edd6d268fb71ec95436ebc143686e395130c37230a800a57a262b0cb58443bd28823896691f78162358999f23e859b4767d0aa8f791b8024b5b9f90372add5810708b939eb7278491b0691bebc63f94c02ff1a4350bf1bbea1c5621d268a57b6302c6bc851095ab0be8cac60f847820cac428f26d793658d2d2ff202bc004adbcd38a7fb0be4ad01e7c4f3c03a5ac0f02c41122256c0e5fa239fb1987c393557a4d373ba602cfca35c556dc6cac33a5e4ca3aa1e146d236b49bca8c8ad5da0927ea6d9ed9a09ccfee6e9235befab78bfd21160035ac3a849692fde7b999313f42258e07cffa2a77a4c251b65f33a037c87323bb770eafbfd499f5b97860417e55a92904fd820147f58b35fcd1c9762fb33af43239e09a4edb2b52805bdd833cdecfcf24f6caa9c75d03bf77cb3eb1da69e2f802f2c492c836b194cae8636f014a13d0d620569c5c47d64e959ff5dbde48f5bfbc461d11a263e72cf792846d52241feea71e9851ad427d73f4b4a16c91cd0dbbbc886caf63df169ba4ded326a5f94e68f656125200e953c013cda3ec9b82756c825e35b49324da514141b1f3734619e0624b57161d8913a3513f9fc451f5d742bc1c0ad996c1acfe5b5fb37c50772cd57982d92649be179e5b8ed78c6b93adeeb8665e77153208e3618d5a29b418d1c88a711b0b1c04ea21812fedbd3ee853c105a1932564f268b0e25f188414b7b33a33ba8f2d1ada05dd70b764df5260835a32726b6d2c8f66d75c49610408b04b9af3b3b814bcc9f51298a9bf5b3c98972aad4d29a6c2656dd73dd0e621f6bef57b58f1285a78413271678b7fc953fd19b30496607add10f8311589fa7665206b4bc1f75256e3cc386a6bb108923f0a8573a6e29241b32e906561d92079ea80f79ccd3ac89275e7817e23ceec5e645d54ed22b651a40afab0f4b142fa94ed4d34ded93feda5a51fa82d1e39bd865a42229ff686010a4b11f45f626bdb6fe401ad92847b5408f7d116e7b995ee928765590ca0d642fcda10b51613986553653acc484d717e24f4a8583e9447e20b824372a3902b79e45e538da9436d0af7f7550b70a2b6de921201d6a22cd44a69c1490a0572fa18694e76e899506e4ec600ed05ac12bfe7c8e67a2cb2e1df8a35cb02899297c6c0f400d74066e8f0a336286f254b1c014c41d87dd4d161be23e815fc6beb9d25e60d3c114f827bb89ac0b467f4ee2d0f5e956e89399e1ae49a0928834b70e17c1a2d56a1407c671ab80e6b43eef5d44ea12c1f28f5797c077f11795382b3035dbfccc6f3ddc5599b6d77839f9e029053b67e70e982e4138b25899ed9bc32812f597423a571fdb1af3d84b3e76c84efa30114fa275c6e6fd43fd9ff82426fd98569bbe322a7861deaaace6297e50d50a11388118efc88ef97209b11e9dfcb7ad482fc9bf7d8deecc237ad163d920c51f250306d6cedc411386a457c7ccef5f3b117bea491a098acca56b95554fdf2620b59b6546daa90833c9f51a5b7ba5fb29faa8a938c7923dc679a7b966a83500f4092826cedad8ea418125814270c6965f4bde8ef54dd010a2e855c5fdabcc5c8569d1d2d89810f026f75b15e474fb35c54c4422e6746d0a48389e4184224941ba1dbef0cbdafa21c873c05caa4eece2434503ec74030e34a1b1a9b662d357b87b6c18080f693e85103c7ce0fac840a4c17d427407c45d94939d9facff869cc8b0a007a20c0d8324e69cb6293da89f84273d2a43087d02350742a7a9c305c07941ffb2472a8d710733d997bddcb7b3885dcde3e0ddf7a51ce6eaea3716176cd317d2427ed1b3b135dd3c46263dbd21ba4b7594d3f0faed5316db8fdd608348df1860ded06945ebb6ce0debecca829422da7d66a5a84e82e1815dbf240912fba42df3afc45a0cc693ec94b095eacdb2c7f02c80dd6cba0dce0dbaa292798c2e2a3fd1dde20cd0ebd32119bbab046723b176cb0a03a6073622a4385fb118b9887a34438fb2e759027e54e334b6821990e855a22ea0bdfda4e62d211f094f60b29bf691edbd546eb29d6d3b443ccba9a17573f9123b1964002290bb0920844b53956b03208ab9d9a336536913c747dffd5fba18de5c2204f1dcb54f4680204014717de150a17f607e54f0b5c8de5e854dae1146bb8b40a5201e8424fdb18c089d361372a48b0fccebfc2b668b0a7861386a5fcdd151db0e34efe58457392f6b95ec14ff45cfcfe49138ecc686d1fd3d679c8ef347355b08d658c0b57ca27030a49c6ad05bf52972190f1b1bdebe55df814c850145c0285bae5ffd009374b921734dfc2d0d86843c2a8aa1aebe56e80f2f802c3ef578aacf630f84adc4357104aa07b25e8309480c6daf64c74c231f9719426bf47de7492b9e6d3d04396fffa2f1d274aae606dca88a884daeb0ac603ee6992a6905956e390683104d17a9cdc3eeb72a5b5e05aad8281d44aa137914cb3f8e51e7b6097fbf4458e6cf896c422e4cbdbcb7128f1966ef7432049d13a407cb27c8b4b7cbe686fff4a5d3b53fc6adb1ed12072b2b91188997fd05750176ba336e771831630956e06037a1c3aac106c64d1592d0627ab89b8e8ff2c4cbf4ab1e6b475d4c5a52f78fa38281dc359b0232e8aba22abb3d0cd05fce16b1fa85a435251ec92f362830b3c570bb2869bd699dc3bd7d61be40ddcd14a4b86515906b20a4e6a60382f2caf4cfe896cecd8d03b1e8346c9cf3ecf23db5f81f07a47fca86f0853aefc31a8efcc8d15bf6ea7498135ef6b703e3a915c648b194c02fb9860f12e5ce1c83074170b81553ca46dbef6e2deda6bf15e00c10d7b95fb83fa66a6411eca9b24921aefba79bc36f6b28d1685eff81f811f7a0c469f7c8165bae3d2df58415d89ed09c439e4bf610e1c506a9f7168fd56058998a075317030c39c611c69458b6097cd2f0a40d33d32e1856da0319197f8969bf09b8b593a6d9afceb98d03bb75128d19abc2c9c1e0dc8b89a387f0671e1494daea840585284a781dcd52bb863d416b391cff67e960738466ab8d83c1d98a40b1d4732b35b0e7fc7bf41ba301351f7efaea63cff37b796db69b1cba6fd872d40d708e10eb6739a4b0d6f2a37486332f24bdf6ea275878ad411a3d7db84454bab666dc9aef74c7d6831cdea3265705e47e3fc19ecc20f7accfd1f7b4e645b859745d65b2880019fbbe6ee88b60d11e06d116cbd42cfa7fd2286852473f0227190ffe32410033b87c277316436a1c05fee5ea1c758d0f97871386561e0ca429624ef04a2d9d342bbf87d472b48c5f42338264bd673887c7335ad30c219452449cfadbb660a82cfa2ea53904c40ec35e0c702bb5947589973ec3f97b392135022fdb697cc06842ae304b48d35c376fe0f376e80ce28c3d9010179dab4cf975ea84b940a637279fce2c3face765508b504f5e43cb3bc4cc39111d6aa543653984015c083bac2b6ae28c4a0b48c5a1413787eee3f986665e1aaa9f057007ada9590f8c6a4406becc73b7340eff6672b71c05ef719eabba1abc416319147f19eef017100dc82f26ed0815c55c122e0b1587302894c3910829a640334c9a92f130d17fb19bcf0eabf4290ec59e8c07b384007063f56e2298b3600dd546092a7c9685b037b9628b970a5e0afb7b72d8b42c102d663caa45b1df731211b0692e034993136a11878e30563071309cce8954343ecffa107ce29dd566b5b132c385ce71830f114b48ffc00126ab2ca8a701dcc413bee719eee2a2bec1607b731e192534de0bf60fadc68d32c920b748062a94061663f500072b09c20d7a391c82d150bd2b71df03bdcce0129f399924f2ebc320cf24ec6dcfa61a08d16bb1d4f7959632f2a895d280f700c9325c99e3732cb23ac66a93074f3b1cb9959aac44864d41bcbc18e022fe30377e0af2812d91d5aa7d849eb3778ed359fce271f11436e197820f29879c4060cb59ad6417ac55cff11090261464945417fa3e574aeb103ae1ad764354e74d6d0583a5182405c600cf1c726c7e776aa89fda34b47d711a3e666476ce0dab2d412d247a786fe3ed518ec9b3d6b95817b539c549f1534f5ed670d099327b92e9c28b63b2ebc2ecd0aa753edace8caea3652ce30774942de4eb451866d7664288da6669d7d8e3c879f4cba46fbbc122179ec25bf5a608b2b2632e66652696631270085e70a99b20f015d922fa051e5b7a4a41569bef7687d22873df1f85d29e906bb76906c5b29c3bf7e7e104136c02d450f2fb82b8a8544c205cad1b5de39b09b5bcb22094f0e364803c09144f72be2e981d73316764c0263531f8e117920185355f62467e1d9e739a22c1b320fa388f0a0ae5306673736a4e39e7fa19a5780cd3e7a101eb00746e2cdf3168eeca17ff8e007a081b9d162052bda3edcde4aaa7779e96d743620e5f1ebc82bb22ac04860c495a40f0a9514e2b0554429a193c5d09ca6a52ee0b134d5801dc342265a72d6c2bac604b61cbfec0592082e70ad93771b444fa54c32c41c1f6665c57c0a7fb96ef99f1968b2d37f90132341e80273b97a44d56de52014243e349ba2984adf972dc487a38f01e02be44b0e0a643ce7364e1adeef27f3958c50facd70178602de93ce18399584766f76cc30fe71b77e7beb58b4afa137d8b30c3b839456669a1e1558e94218b4f6b8cbf924749d0ca9e8f660ff35cd774e46a47956a5f146f5d437175363850e0196586461334296ea0bd3d63708290c76a5ce36af2b54a1b67f8d6bef046709f796b0806f810f00cf53182ac49d2091d26eedf5f57b1d215c9e7cc924bb3b43692848ffb8045eb4ba6d47d1507b6091f1e09829e23b973048bf79d19cee7e14d6c99614c323be3d4b98d76c3319557755c93154cdd37f490b3128f7a014bc28b1093c722965a9f4e3943b4e14fd6bcc6e876e0940e921e624b1fecde6c451e99855809a5350be9622be08095e9e300bac8982b9c3d32b9225a05fa6c983ebc1ed3d26ffc96b487b8994b22078823ebfa06e33e8cf27f8d78e9ae024d0c9f65c303e7415042bf42f78a6ce261b3fe442eaa3d608db6e1610aff014ba850cee1301c81c6c8bf92e2c7072b07c8f3dcd5feba90dbc70fc0fe83a4e61fa6ed35f80c2687478d97972fd21770db66cf25641040c3f56188842d89e045c46f6a3a72002ae10cc65134f1bdc223a463cf41ba0f43bef783a695b4c4bc06832a4f4716b32e775d9c76d3ef33102cabe77b999fa1cc692957f35b5bde3f12a4ff25c3adce3d3182378ddbf2da0a7338195c93db6ee2acd202f63fec7c724f6f177216fff85cf7c2be1eb4c25ab7e19321f998351f8d6f3baf37a72d495ba62c9ac1a7d4da95b1675ab2c5275c205c0328da11765cd59aad843ffce8ea04ff22b097e0f41bef47b732d078e9884bcdd156886466ccc3156ea995a7e30a75439a7f7e28276473a1fb6f0034cf85421d46d28afbcd185ec8c647c10ee74fb558dc32fde7345d27a77a38ca62a2fc0d32a8c5683c73e8af9bff864c9bbb61cb2830ef9d86e4ad15427eb6b7682a94b2f63f56ab9120e2bc77608dbdb529e9c29adedee46bfffd45584d104eaf2ff63b5055aeda619bb18f4230859cc3f78f9f952d295cff4df4bdd2306f179f79c9af2730f47d13adfb30e6b895722feefa6c0367f58daa953b87996ffb9ba0cfb6176519511d111e69a54940e6c560d6d331cbd26dfed5a179ab9452db611bfb657af158ed41c2b6a2f8550fa020be77c1f4d5b6b637e637572faa2138f276c37de0b335ef718e3c4f31f06fea08b1986dbf095dfbc047207d1dc52339d41bf0a75293f87f35dd7a175604a6ec07a1037e994f0e62225e24927ccca10791704a8ad679e8c7161736a37178fdcfa4f67e9d8b8f1013e4950a3f55a6e3c9b1df98cf774d4eec9ba4399a8934bcbb6818d2729bb1ac378e539c2baf3d31a8bacfa41d3af772194ded4ba5a7202bd7d970c7a4d39d2af6a8ffa0fe9278d3cc36a8341d295f9c74b258336cd224924c816424dc3b3bd277bb03df62073f105cacd111764b6e1425544ebb9612283841e85db3c1da74ebe34ec621fd147a3281a5b403d1a80a2155bb38a9cc6f1466df94c43afcb82ebf61eab02d77c4117f62a8b8d1d6491c0d2c6d7cc6b5f2d0644e0fff8234dd52941a1629cd791ced40283d45452c358d1ed1f484dafaa2447ab5e178531252c9b3365a99c7ab26f4bcfaecc3257c74439d6dd8b6ad428859f03c9095743e1e7964dc3e68e4b4e90f3d013e9a3a6d0f28d2279f7c0636aaf50d0da6c0af5f494cef344bfeec3d6d270964ba334ca80d230428d33daf7d12011a4dab60ca1ddc299b6708c4a7edbb22694ce9f423d4761b7c97fb606ec0c8665f2725dc8e22def7b19dfe20dd6ddaeaa5e15146869a53fa839da04f0ca7d20a24c19e9ec31357a079fdb37b5564d265054a7c923ea2aba75f62497151d93ad7b1439d0d319b4f0b3bb0b13ed87bac7dd1b0f23e1493860a580d7e2e04ff08b44dd6ab919f60cf203fde80cf2e5a6f19503a39b4cd16ec0bb8c7c8eeefc0428842a24f92d70adec7ccada6981fa82320cb11db5a34d2e692c5b7ad19d8c5f23dd6ce11789f4285e82c48adff730dd07c8a5c609a10707b87c906b71788b61fba528279acc0b0cb6ba5d51d6ef1337f14d5444edb2897b4d20adb6e51c73ad2e7fee8109402fbb838807d7c4c62bf38d0f4f12f8445f0975bd15f592d5cf912ac21255d992ccb5438056754018e5c01982e8a8aff2f222f0b65b90014119ce7f10464e82308caa8517bbc2cf53db0e454cd38e8b3aed681c81012eb6faccb599ef0cb3a9b5c9ebb6c2ca38d903763e8ec1722d0088ab4977b1892a3a4f62d719b2b82da67f1ef95725e45fe3a431e15485571ca668a63780dc660af1db76b36d0fdb250f18f663f495ac9075b2b897451ce4c5e35788c2c6462a59740b72cb126b08325a0fdaac0db6858305bb54b0cedccdc15dd1ad6bc6a3488e477bd19e8838b1ce0db0564200ecf1a02a2aa0ce605954876c638ea2f0583321d2993dae5d1d5a6090c6d3c68ccd9360498d176088272b90a599c6f8d1f99cbcabdff16b0f6d748299afed99ffcccd5bfa5f42f7c4aab5757fc0d0ede9fbc7a739dca754fdcd92bc7ed80e4cd86f11eb932d9df4a478849e718526f2b6d3567a130bca1cc6922766b6dbb04fa51903a7ca5492f785f51b8421634397b714cbbdbde9c3f2e87fc529d8277e22f47f15090680cc6107c4dcbee5c7b15d793489eaa0f34fa7e1dade7e6947b26744f5b897be1ea4e1985c5ab7554efaa46bb7337952b4a77c3127e5ccd0b9077cf51180dc77aab6c9c -MD = 2d97d18d0b70ab231a0ecebed1a686c739914673521ed64ec6e27c1c78e2000981df932439a697743cded208f736164468a1a53cabe2b65b9a0ef10ad42f0372 - -Len = 54088 -Msg = f60e7c7c4f4f13eba990a76daf1e6152fe6ef25fdd03dfce28921c978e65ddeefdfda90d59fbb03374415eed3b5430942d04c71712503bfae984b19f22a430c50d0db04e935a744524859a1ff04ef1415ae10ac3a9b3927401adde1e938cc80b1088bac7633308289fa5838c36d64b626d4be4ec0cf58c425a56cc9b48e54ec8edb4ee01325013e4cfe840bb76b2e6fe4d8b7d19a2ded26edbc6a39eab7769048cda758369773e829a98fa3416ab6b1de4e9fcd2d3350c006b478aaf2309c2c8d54176d56e713109eafbd880808982c719ac899f07c4e2fef41fa9571865001bb0331a80ab069381a65b03261a14d205d41e4e09a651fa725d97291df251cc0605f6890b86fd0df3b6fea2ae4e1404defd85709718a5ff638ef7328a1a96ce90bcd3eafe69204666022ddea18350bf5b7d2a1ad2c68897da6e87eb25f6fcadc1bd1265e2bb35e7e2712fdf862091ac833a55724016c16adee78f7d76ef4a12a1f0fb243ee405976fed4ecce58f9f735e1d4ea06b711a2177e05610056e4aa4393dd64c9a4c58ff165ed0cd473742bbf40e5ccddb405964ad4225ca5bd9c20c908dea087e5bf6c6deaafe0c3280422c4ef6c82116e947da89f344d6ff997bf1aec6807e7379a695d0ba20ae31d2666f73bbdbc3a6d6ac2c12dcfb5a79173dfc9cd2e0d6000e3114f2767edec995772c6b47dadc136d500251e5927f52bacfd561975239ae8260ea4ec65fc284313e0a3f801093e318fa024cf7506c11e9fb2305ff1ecf043df9c0ec930d82e90f80b2f650c411a03e74d70df87e4a3e0e878e91f18bbf8aa7c43dd2c3ce47809508cc989e3d7dd14684279cd2644061903cc00c54e232c8288b0a0a40eb39d22c9dff2e51c400ff9af39bff6b4a7703d7e25e7e126c4f472914ce9cf0ac7f663c06f3be53a1c2b1a188da40ad7816ab4b4113f0126e3f8e1028328ebd5842c42e0c51538b1cea6fc30d8d677e3546e2542084683c332925478fdeea8e39a9756877c1f2e17da1c268485b7ac8cb2f2f5a495cf178023695341179b84a95dd00540feaa53d0b0e30f803ed837280f81ac5824190ae228d654176abfedbb505ed599b7573870f5a43db04ea89649dca2bfd94dc4fc6dc581dd5851ec628e14ac5dee50965a7d1ac837a14fb958669cceb6a47d435a878bc46570777171960d40f4db34f8186992d773bfac8aec02e27e17462d14a3d3ee36731c561fa967cca530dceefd10aaf04a78780f8dcfa32029684af7d976b75f508ca848275877b541a86fe905d1c5a5b9bc76c33271cbf869000f47d231b6719b18a0f8293d4a69cea200ada2ba5e457dc618723980e1bda5952fa7cf7365a78ebd92d0a596645c74e43bc77468b9322f1bf996e36b88e2879e0892019a2973a3d1fa5c2d123a000cb57da0cb3b8b0e462476abc0a026295761469119349668630c4405102f4fe6debc42d447b1282c4b863c1b61ad5dd4bda5561f86d110e844b30c660f4c1a93635f27dc4a78353eb7a7a6703701749722c0a3a7dade4d95e16ccff96b073e784314a92373ff2698130f3254c14b2ec31f59dbc475da90d3919feb29c3df0017f6832334349460ead6238c1390c8c0fb1bc75afff8448f340dd2fa919a3223f4e61132a90cf69879799b00371628ff91a09fadb4c2ba8d398e9c8aab6ebf0e81aa4563dc7d8421f685cc3b59d1ea2f493659408d759b3f56cc52f7e1b1c41460aba6135906db91d4834d99d6446ac464456abfd481650a0e2faceedef3eff9f472a9ed99295b6c85ea85a856fe497385666a783466a671e220f0cbeda5a113cf87c73f37658216ad340ae3366ff4a12f11df062795ee1b5558c50bb86765f6546394a49e3bee249ce843e6fefa0ad1c3c02ee628af9a4aea3fa04aa989dd16159e88aa582d0e2ad78fd7003b5cea89e609d0a4a2144995133df8f54bbd44f7a58119bcdfb9507e0f932adb55e9123df8576aae4e545a8e52ec659819525c1f66b3de589f5153a2978ab5e4f93f10628d11638f67f06bab4bb34caf8ce970f1ebcf2d0a3195964cf1df1e997fbf739c16f041a49968fb50403b34a830f32213a70bbc4e10e686b1b128bb8563faaa4f285c8baa5d3e6831e2eca41e800ffdf92b21d290d7c4b39557c013153061330033ceb7ed2de150a4a630217f04805326da8a267ed0d08b4c586dcbe58f938c33bbbf4d0975e2434cfcae134638f4d00157ad1e64a67a9c6b255a3c62bc02346e32b6b17bdfc19e7f78cf100097fdd33d051320eeb3235566614deb19502dca243b3d8ba0d5ffe0d08d1bae4aabebfb1e7554e489a17b54b27e916e65e6769bda37cc4234c2fda8d4bc0c3460df4fb64a2adacfa1dbd308f3efcd1cf4e99d4814badb7b94516b64f0882948ffbca97324882d58e3dceae09f3769ad32d3d25d5826f37e4bfba993b873eb5283ce79d0523fb4f6ac2ef38a18d7ff65ac2fe62a092eace0c81c38b390f1daf7798f514c47941a4f874cad43f563e6fccd68195ccc145039954da9531e94708e6d7990557937b5b9e1b078dcb94dc8c923171c54058a95ef300a7bd0b5ee34bdcc07d77a5b9d2fdc67e4e682d9081d5129b74fbe49e3d68834dd10dafb41afdc11c497298326e11d766456f4e9253d3b5dc323ea0dd2aa8af03018d053313a8fcb3a5ff1748761f399b97a914e17d0de3bb55965c5b97a7e0e9de44f625f7d3f74d37240b4112b053e5ea1e68c7250c0502820b0062adeb7fc8113a68d0ed0719b2aaeb5a666c4b8f0ce7d7338a7456817763a6743893fef2684177447e1ecbcaa9a45cedffa97854d735db5b739175c1e3a06ea0257268a39117047375b1a772fccd7eac54f4bf0b0f7c32cacaa4f12b0de16c6d7372aff80b3ae8dcfdcf237971cf597fac73a91a7c66e566d7d75029bfcda6c168ba5d5b9d542b6660a0c848d14ff54f514ebdeae699fb19e1501c22bf0c26864e73f933110ad6fbe44b1d45e3f85b0289ae83e315bd7cc93237dc7ed647f4a26bc40ce82d06ef82d3f9abd9716f92829dbb846dd17b716010b519a4cc2616ff08d61de2baf081e273d1f86c415fa2b5d59c47f1e17be1c5c4f25afe695096836cd1b4887f6f91050dfc8e671d6e9485787a55d50e64d4e0961527f3756e7b18e1dc5a44462c29d2e8a1f530cb446fd9d07c348320de5299cd4608ebb727cea5ad1f957dd5cf50314ee9b331138a3b9823cb6e61df9364d8b3af864ef824961119c3f09cf5ff0f0a85fc52d1bfe800acba8e8bd9122811858e752885000cdb466df0f0076e646d45d6015a779505c7fcddee115283486288a7c377f69788a62bf1cd1f2708a772cb8920518d5f8a9770d3138a34f8995dc946bffa0a8540fea8ed8304648b702682e683c17ae31e79f0e6247de63ac30c31b391392991dbeba5a8392727be669253354f31a6ea6a74645c4973d2116f77a63562bcbc8502750a6b1811d66a32bd26bdaf2a793b1690b47eacf35f4445a511155a0c29275ca5bf7e4849db577cafe4c7c9335ba0c9d5c9947285f59dec9e5b9ca0b0da409282ad29f0579c4deb71739bc5d4b4df2b4c89e6c6b1fce20d6a6a0f5d3035974b14bab439c48314270abd81cc95ecc1e5fcddbbce00dcdc4f1228b9b815a4f63064cf664a17f673d982a9c106ff6b0e9feead5db2f9fe535b9d7ce1dae58e23e879d5884cd85f34a9e21ea29a99998e0028e2129b25c80fd8134dceea2b5be71c5cb2626690251d3e31066db0ebdf08b1b46223b10aa3d76f7c85c9116c720a7413503cc1c6b0f74177486b727ea3465a9a17d81b32f874c8e10b1a77323d5497a8955e8402688959bccce106d94e0ea2e0e87802252daf8a49c7094304238d2e226b0fd8ccb59d2f097a1a948549293190bc4d8d69ac4e5dbda1de9e6b8c7ce08ab999e5adfff96a653a5d4508fb5fb0b17d9de588db19eb4481e0afeee0ea56e76742d22cae66b3d9f4f140eccb77c74c12b1310a24dad9e64f589f15889f38415c53c8d22aacb26c901faeb8233b1d6863d19a75ee57d2abf38e9568ea632da18213ee25db930e26f62fb7f56a715b0d58444853a0597c9c55caba706ffedd0ec0cc6daf2ae3700f0e69822a07e22843d954622ba4a87fc05e5435b47f37f190fec46cf87d637f30c11438df64562d13ce471086610c8420f4732fbc83d7112f244514863ddce490f57a009de89512841f667ceb3f4d33c20071d011e1a7e4f41b958ce3d317463793e103eafb667e9fb4f9cbe2a63233b06b943f3a036c13e6c9fcfd97a5d94e2e849269510592196b754828f3fe852df21b25a5bf4ff1450d17c48f281deda47caed559576ee28cf04b9ab9a7af0cc88efa6b29292ffd2372ed336920a21aef29fbf2fb869f1b7f361c39a6852190ad8eefb0f4ff0a57551c3493b4079b27d73e52307865fe089946d26b1816bdd883f9e13a2dc948c88213d22a976372dd06c29ad8f87cf4708327537937e0e9aef3d8ba53fd1050185260b1413bbe8e0421bdbd32a254ea1ae5e189ab2a6d0ed8a53261418c5a8c0f6f0ab71fc89f5764d338a2869f7446cf657d5a481a45951f400fbe4c013263747e19ce0e658f35c4c139311c17647157ae02b09a2eeee44b6d78b9be851d3d112a96dd543a1590ed96cb523b31add47a667872e78ff26524d3733add3fa582ac1888cc3a70b9d0a8f8f3ed2d15d6d60036e7887864d97f711b0b29f358519b0ef3f783082f035dbb90bbea38ec67deb0c558d995d62999fcec456e46f7a9eeff61ece9069e7ca0ee052a31a5dee95653bcd24f850d6c1d8bef2bf11e4536e4470a6de87ce6abff0bff48abbc12e3a5b1c25ed192302972e7cbc49bc56a7fe6ad988567b12e18e3d8281e3ec4b1dd33928003480267e900d8291852828d0d5afab0394fee9f4cb51f25b3d307e25f68be9dc99a1edc332f26b130ff9cd666a9f6fc93867b61cedba6a11053cbcef2acfcc2b8b02eb48f67980a138b5c6e143c69249af5a09b26bf36423ba4599c1d671697d9727a1a8510f7ddc9dc0a7d9f7a1bd05684a576ddc796b03eb0f9756901d2c333c849349e920bd15bdcee2a8dcad4a7d01cd1197a5d9094215df2815de2f9efce9be52a61559c8fd0714f9e68965b510fa36dac85e8ea96ea958ee7817253c2b3d1942557c272be30857701b74579771b03c15987d06d5da33f13d05d1aa7e5e9549f4d063f540784ffac7a033ff6c1fd221546077ce1925343ca637a40bfff780a4ec9f8350c12d3c73731d3eb9ad6bceab19b8d560edc0389fbc95f4e61b969dde8c2b50d608625c5604fafb32c5f6041dc81a1c5bbe4baf8ee2994aa56bbc3b4b75fc32d190c82e16efc1ffe7603f211e020cc31b252807aeaaca2be65ac8e7601c9acffff4bf303ab5fac353e6b7941039f9502b9cd5df6397a10f05835d30d0f27f8e9d9ec7f135da1ddbe4d3efdb98e2685a199fd5a5521ba66aaf6fd996029a22d5571962ff9cde93b026b258761c9df22741a8b7e7deb952d5306ade8579662d5aa8df20a9d43604d695fc81d21fbf0f7e4031fd257de32ec5251ecc8daa08e7750f6a718e7062e9b5cf3cecae16d81895a1e605ccb44ba2b119f6342d18d4e9caf745e61c0607aad41ede0938968bb623c31f726c2635472f7b7b95d24a6cccb2fcebfee0e976c0c8116a5820132c509f3058b382285294a6c639722bc332d8c38ce71c6bbf42e3f8536c69e3113c806e862c598d5f0603ad869a5977f7c9c67323a1df1adbfe5ceb415eaef0155ece2820f4d50c1ec22cba4928ac656c83fe585db6a78ce40bc42757aba7e5a3f582428d6ca68d0c3978336a6efb729613e8d9979016204bfd921322fdd5222183554447de5e6e9bbe6edf76d7b71e18dc2e8d6dc89b7398364f652fafc734329aafa3dcd45d4f31e388e4fafd7fc6495f37ca5cbab7f54d586463da4bfeaa3bae09f7b8e9239d832b4f0a733aa609cc1f8d46c0f0fc33dfd669b5af5cdbe2c12ffca6688761e7f40839a65c29da57058fa7594705c8bdc432e7c13b4cff7c47b2e046682978ad08fcc14f32458d4c7a420e986b63bdd19ee0372cfab6c9e553b95d4e3469d85b369b8e7b72182f58beb93b7a9a953c3dc480f04f7a04dbac69b5dc2459a311810146f9a1b80c30ea3767a6764114d440d977abaf15c1a53ffe3ae56f447fb49cfd918b5850bc529f78dfe8121b5d06894246c1c26a77a72e85baf195815a222d800dbc05f882d4d6f77478e475e853859370cb3fe48151d694b8992d9cbcfab13d1e14410c0a683f37e7c163ed413bb44188206e209945f6afa634ae03329eb699452c9007bd6d26be8c59f6ddf24fa3e0ef79d38b09f3dd3b166c7d31359eac09056d597816542bffe4bb33e475dfb2d6293016906ddc18cb8ba931c3406b0020e13f23d99fcdbd70836d918d368c8fb5d7db9ded3f7f27d578636215ed9461556b4a75a8d43a69b4eae9a634ded698e44de4dfedf94d88fd6f2364c5879b3e3b05f7c5623e1aaf417da7c887b93e4d062dd4630f15d7ca87c281d04ec90ff52643dfa99247fefc8ade209ed250343a7fea32bded3fae5b1924d72b0e0c3334cb975a88b57c47e0156efc9fb15e58efd5f57846f4b121b93608cbebafdbc55b8f82f0f9586595e855b29431a12e0cbb9ce22da4b224d27342e0b88890b23707d6a95b51d77e5973e04b7ffb3e39c04c3932cb3da2055107e44f25885d29f898554cc248df311321298c1852c51c24003f69c9a830ccfde58e96ab61619d9aab701ffe44bc28536eb61715eef24fa88613f9a14b1af669aa9679b2ba4aa79dafbb8547bc1ace8abb0a5ed116224ebe3c5b550abc9d2c04b5b04ac3e974b262239c0f3735579e29a49ad5d26ef183e5917a1e4e6343b85f95509c57857c588885962055471f01d0a9dc1ea25fdca9af23f4b7e4d5ab35eac7fbe10604ce0481744e6b2a47cdb3e039628bc97f300a8b725fb4769a301f36dc16ab27edf630ed4e09421edde00f08d1b2cfa043b8310afb1f966c178efeb430356d65a761881c916b37bb6fe27d9b11513ccf23c1b79e2cc8c04de3f43ee372dcba27d7bc54afdcf8de788461aa1766a265beb5e8f8b595cfe494662c6a650270f3e6e54331178f1688eea1da0f1e503adcf7609a9ef1b4a955c834740b896d96ad3b56b2a7d43658d9864eb807104c8f0501ca52f4d307f9a661d5879cf112c2689db2672366514442c7e1983c8dda13604639aea4ca1e2548e9afb3891ca068a8767efd2e5e6e5d572c10d719e7877c916d651a295755a0dfd849a47a6c851ddf6e12d1332cfbf8793b430129ddb30efacfa301fd0b4d10bda629c6cb713f368fdd147fdc4278ca3b7e0ea2d6b10b6f1ef59a028a4672e984ebd69706cb4d673c5c0a75844f6337105cba48cb01fef17067a0a87b99559fa811c691a6cb2e0457636b4ec59449c39a6ffc4f5150ec5a819e5d402b84639799a0704346015fb2837b9d681ac1aaf43c204b43141e71fee522368624982b85fc206a284efe60e6230d375dee47f54d68060da08deb2e42fd7bb2c6e1352bdf220a2abd4c22c003c8a0bf9ccaa7c733c089da0419175feb4d0358af0bfbd317cdd6287ea80efbbfe6de9cb13a618f4bb83426da6043a54c5661ae9aef4ccfa4320cf9e8ed23726f000f6517b7f5bbf9c19d8a8fddf08cea9c0f0b0725b860190126f588a600d295a6cb9f4ccde4dbc27f1e6bb0fc9e854aa084249029cf32eaadacd1ea5d178ac83d8bb1ccd6af7d4a334f40da46be0ce0e63951b265e1b6adba26e56a6ce8197b46d823247cc60ed5a098b06846dfb241efb738ea849079b698fdc6a56fe2fd23553989c02ab90f09299320e76763e3f22f8630a4f06beaa9dcb9ec07d0a8a464eb185c4c6b090c6940b718d432eb3056282eef7e23d4880bf7e3cc2e3999ad947afcf105b836755a888d0ebb33f615f25bf9abd2a95ae0317cf3ed64f546874677700ea88cb1d871538d8908e4e5035b5daf2c4efb7f71dece72d668ae2fb00f72e9fb91630bb43254210e59c06897058f97b75f84b2bb588ee91d95ded5b633fff35e5ce5c48701ecf0050a50c13f65745bf360ff853b3310bf0978d1a9187871049d675f4ccf84906313a700bf6b1fae54570fa6675fe3066d408e513a452178963f3d6a350c2ee102a0cc6a93b888801958c823e9c80cd28c4942c809cae36930ca6b80fdab65514732c6f8ee9624bc338f06f28cd204f7949a3290882822e56ca57e2e075bcc53b9504336308298951b50689cb12c60080ea9da5545db645f9286c1dbf26bc88ad17fadad0a1c48bd3943598d0725a26662fea680c3531c4a4ab4e3154f79ee49181782b7cba1b99725ee463def6c50a52a0f23ad712ddf381dd65e646ef4a220f5ce5ef105e16fa559a7db39ea4edf46dc61de35dfda119b54519043d16a989512fa9ee33929df8a6d06750b886bb2bdf28d42a47fd657f6b6bd352e375a1637c822cf08e6098d98a880a02d3a417f9cf4e7dd93d1b116ec9d8f999dd131bf6bbded5bdc9cfefe62b4bce919704eaa465c182b6e65e8e2cf713f5a1d6f9008c34c90e1c8be78a67b1a01bc4aeb01a75cb08498aebcec2011ea42d32742d366b0fcd3fd77cb151a444105964bdb091b426ab3c1cf373963766140b145fb9a7db7572ceb445342de40a22f0396f0a35a9a133c136a756f215f6eaf50e40a439268e3f247c8e7904712e5e480b69c8f09c6127429eaf7ebfe2f7ae55eabff7d69381bca9f6fe86c091d64cc9a256f2a9d4910f261db2f3e3e790e9926e83b965697771c5ec3e65478d2b75dcc6dc8e489a5774d57b59be486cea22146335f2cef197e7e124f61e83ad5460e73ea3a6b436dbdcb7804be6d4b82ce143907cabf9730aa56368cdb75a38799554d35441d7f046d234f4307371157fae87bf01ebce36f733b57e6b3ab678c49d894d9768980fc0dbb49eb26e06c90b1248b66cba3584871a3d2e79ae7eb35bfff0741322dfdd70819f4777de7b1df794ee3e642016a3e1e165429f1c9a326643ef0f717794a07f4b5db727cbb8596cbde11f912659dc2f109480848bf13d0ef2f0e8586fa0a115c156b66b3da4c5911389219cd3e677963031b2d1036d1b7a935ac57113e928586cf20ceb3d29a98f204f0c2d30a5bc40c8a69e2d8df516d4ae956f646a587d73d39a804ed22e4c8d6c99a7eb437ef355605a0d412f727441cb09aed87cd5e78c7fb4dc3c059cf7b47dd0bb7f165a63fc80b5c6b5f3ca7eeb731e49765249afccf6aae65fdd59f22cdd5d1090b11f555eb11f9330e1e67cfa2d3c0ae5f39a1e5ac2e2675c624e851c14a66ec71ab711a37a003a5a00aeb69682cbb7cd67b27a5f6ac626de9c63f8aca8159dcc5b08dff264c084dc580a73e5f93319d8b7770b0277bced8b94819206231164467cfc0773f6c7395ef1e3fd121adcf8acead31b6c702e820b518e9c4f0d018dde837ad050b87e2187d41f9a436d2e1cf108adf0c4dd83ae07db735eb2ec4fde3b7a6984ae324b030008a8 -MD = 0c25d4a35196e3771cff30a7452ab30e68d71726cf0ab02aa016432b1d643dd975e0702f458086d8ef7a35b91d9faa6d29e7458840e1acb02e208b3d79ece077 - -Len = 54880 -Msg = 4064b1cddf29c0c9adb380b2c15250741f89fbc47ec0986b4f39aee2fa459c206bb838b0cd9ab706951fcd13c3d91417642db2b75c04374f62c2c4894c7c722f8d66f13dfc8a703bd7c0bdc907daae7ca51fbfe8befbfcfe53f42299a4e00153af55249df362b40f797c9afc15bbe44aea476a802c0db1212ab60f398bd91035d76f19f73a884b2a853daad376e67f29398dfba72ea21c5fedefd59188cf697c109b18745a66fd3502ea3777b1c147c39cd9b9844d220761a689baca232ad2d15fc1683cda6292d8f96b87104eb603bd1a13ed4010f538cf5c6b070ce45214dcceca527642e6d1ba71a8e2c5d62c7dc2bb23df0200837750187d037e54b0f744649c1e4b1b598384728892bed08b7b7888f1d7f3a3348e8ce1a7f849faaa42b2292014e2eb2370dd05f6de24c43ac68788651d3b8471432cbfd12c945ea9bfcd263e7b643dac606e30d70d1f3aa32698c468f80128a060d8bae3e8880916343e62df9df8965b1bdffd1468d6bb2d625342e0b26d192bab37dbc5744d82576aace5e9c0c7809a68d774953772ce40445f0cb791a9de78edf22960180a51d629c0b8462df882d111fe9c42c21afc4492652ad3dedafff1edb0ac9a1ce8fff93822e2dc2cb42566dcfd7d0350f7cca1150ca21ee02b04fc751a6d5cc70e132a61796b950423efc2927c1fc12a31c6c095fd7e7ee1c276034bd8738f63a415d06a6d5c57ff6c6a4dfb228b6299ef7207dadfc6dd27c7dd6d3891c71936d48e521ca8bc0c63b81e6fde98c8d0e35959dfab5b8022fb63bfa204ed6fe489c4051a3fcf939b792e92910486def1509802b1d119b635a5bda60a779675d6a39c028f9b8deaec89f74e193692d6af2ad4f5e315c06ffe6dff190d5931e0d9ce850d19f787c8e7db3ada713a67b7f1b734bbdf3df8b4649b4ea1137169b9d450a7af201d683574b620bfffd8ab899e41e1db0b116b8c5276d5c58488e307ae72296f0cd3d6397b64d1842dda0754a00e03ddd15bbfffad47b90dc8664ad2517c33d646e279dde42b74b162062221de66c14a98e19c155e56250147d34423a4b6ef6b3412fb28975431ce0526a5f7409343a9c76cabd74deb3f2a699779018f6783b63f2a01237c263164800037dfaedcb282c8c4934c624e2f0f97799374fad9173fcff436d47ceb9cfa3a5d81e01088365e02b1fd7c86c61e3837433784cd52d48f4d363f457de99a199b042a024ee0f6c3ddfb91709f9d342eb3bb0f3af01be12d1fb9c77e686a51480bbfdb4d512c1b3cc169f62f9619987871aac39d4c7c67a1af45748526b4ec0ff2543ccaffb4cc4e16c5d5c15483739edbd7fbb5c7bc8e7464a2ee649e0f91f6b88cf48041bf328344d5d52fc023ec29570c5e8b4a257d2da597de23b7c56986c52fac7800967462b3629f80c1402ca04f0f9426befd5d54dcedecc85b1d9b4682050bb82282bc73cc33dabc41235a8b2aa9468f098d5571706cbf5d715e4fbf55d5ba4a90c92f3ff5122fec27159f7350a21ccc151d8e0dc9dc00e9e0d1af77a769603533b3f74d97c546175b5c23de29c2bde7c8f530af4f05567592bee0f8e187a682f28a3c251b15c645c4400d571dd1d2e70c5c62e06aaf6a086e6d0dca69f83438b4942550e7ca587e4c0b8563949602d5c89c4c2782a1e4aa5c255c73a984b15f631bdb5565aca3cbda03b58cf6daf6b8e4fb170cffa46b63442ff57d07f2c600e66586bcfc8250335772c359ab65559847c2eb174980a73c0ed30170ed0c1a2225ba4c0e131606bfa99ed7521bffc87edb38efd1c8fd413ca359a8d2c29856cd086458d2142e6e76b9d01a00ae70f77087a74cc1e4e2e16ce909112dee5f210977aad09066932f606f4fb3eacd7f89793355297006f92ed2c92b6508d92924df5ad3ddd1710df285b365cb99def6279ec78baf649408d1782b06cbecebbe06569928a61b9d645fee6e588a934b9b78e92c910627f8d87166f8e36c608ce570771cf154f9525f1da2867117627a37256148af55419831b7a3160a70ec24680a49cb760ef0f8c7d5a9e5f89b8dd591d50e042dc438dedb4b376fc3fe181b0d7bd48ffefd8af7642e0c71353d9dc27331f949527d96319dd42aea563e6dd99d6c204ed2484eb7fed1d2146f2619aba3e029fd68a5e2f840fb846e0a5972c6df8436f23b19c4a15d6503b5f07d89f7ea8ba609b567a59d8d674ee52977b04a9d6c1d617f95751b4893a83cfe6b760e10da795682e9668749c09036f9bfadce9dcbdd85e6e6e88e8903c790e2186758dd74a9cb1653ad1e3fb05049c35af3b8a84a7f44ba34a563e65c6b9be4abe43d19023e4fbbce03ca36dd9806ce700a728691098841a63500284799444b4d75258b2b41ccb782eef3f5ef6f5564287862ff478638c5651fcf176b5b736125a378fc98b9295396f801458fde1ecbaac7f2db14fb3c8c98eb367a71b8106c5cf59e34f1ae4ed732a95cee65eb494c1f7e89e1a2727cde68229f1a00b904b519f4fffbdd29238b80886cb818a1be2faf268eda96f2df05fd4b71c0c16435848526031904308fb6a51d9a6b510565bc81466b8f9b844f487eee14325bc38c21c81513550fce7da2ccf04cceb721263bbe6687c5572fb4ee1494f03977def1d309499578a608d2951b8aebaaf3fceaf38d0f4a4772fbf440e6c46d9cbdbb4de37049f34a70e877d8ba72e0c7ac9e972d17c71cdc95f0f8861d06f325d4648699269d9393167554b3d23092ed8b1017318319654b6817a808e0e2ea9a65e1863d53cddf1b3fb7516d8b4d68e437595047fa8a8d5d9277ec0d58e1bac4173833171e613daa94b757500c50cc7359812cb7a4a4fcdabc18addfac8acb6b9373776fb0e21707bd7c4ca27ec12564999192c8a8ee1b8a8d03d1c405658557819a398c31d8d4fb610e1aac0829da7d9e9069c32ff05034ae3f42058bfb514f87b361b7c8c9dc4e2876a7b6d30e558711869bf0603304a2c6d4e6e965d3951c50c8d6389d3f97c8bcbbdd0807fbfd49997b0f97643ea09a7ecba7babc76ba8682e08257d9c16d30c2e5a2e9cb753a8ddf78ad0062998ae57e2b6cbeb76a2955c6044c5ca4d8c650e5fde0a3470674198b845d7383cd2c4b6dfc1c3f7f394951c33b1c8e250a0aeecb0a7e7ca43513b644a80737ef61ed93f347a1833b6a8142228dda3685e2a1d31c1464bd0a8a7f2cb2eb9395cddd3487b913e2d314863bef8a026e9cebe5f3c781247aada08e21437e55e9d545ca6bed6768c7763214de21a4a3c108809d6892a140a8968fc85fc350eef23f81aff98ea54e38b6bc9cd2a01877b9c26c9169fb2673d6befec1a273cfbf941aa614463219ce1dd9dba77e348d863f11d6495ccbb5c2ec6e16ff531ca4cfb8b0df81baa06eef5e28b6bc4ca5abd93c3fe64eabcaf937d2eeff0cd88677264747527fbda24abae4eb7663a3ba1b779692c627bcc097d97086e0709b79efcd27282795b7fe5635956a4224eb3c856837539b5cf9753ab0ae7ee1b102bdb4cb429b874c107d396a5aec43888df490b505c99076c9b188c5751d2c5977196f287ee79a2b30e79b611cbba016efa7e565ea3ecafc933b291fabade6f06157c8edc55687ba7f042621c11d82577a202c80cdf87476c1dcc6c63a743afc283d6621fe2e7781669c80b2325b11d196260c0f9540b46cba5c07c308bb4e073394f2cc11b891094b76511c58bc740eac802d192c5eb267e683931dffc94a98ec2313f6e53cfed9975b42671a8ad49622f738a6799a98efad1813dc06e85738bab472a86402e579b313fa9c5f0b58ef6253d5bf643c8b8a77e52e09045e9d6d050db6ea75516f72056622c3118929a3d25cab6ad58bb5c2acb08dabe37443c236f788c20073c34bf71c62e2174a6e3adcd963b1b4d03e1eb442d7ca8a7271bcb33a903aeeae0b8cf0fc61035997503ae794a49ce9544e26f763b56ee1a051e5e59e7559254b6cbe58cfc82dbfb7f72d5a5317325d5c0b63dedacfa0d04508c434ebe0278e911068965d3e6931f48a9a9fdf647bf633a05ccf71cc673fabc1e109e878ad11ca1f12146e6cbe9794320a1d00327f9d20339933ee55cc1618a2c5ca5ee6f2973cc04439cafa34d9e016043c7d29473b6aeda3731a11d63dd5d3f7e116d1fe06311c876d388fd3df205f106420f2dab65af501f5bda98d9c2a7dffb4d5e2da48ef5b621882d3a4919c34b6fdaf3540f838743b239fc4f91c5ec866ad66c18d43bea45ea26e70aed89bbe7f6ff39982e74c91da64870b23a3bbdbb33290151fe1e81f0174c50bf99a6724f223b4c7a76ddd75651f3f25121a87df6ead1a869908b4f6d6f44e4f8ec1468f987fba67b771344764be8dbcce6a0bfb2085cdbe02a2694e628bd3e174338127f7eccc20bbda9a3060a83a7560798f5850227162629650522fa11a6cb3da5f1399d3b49ab9925558e0450efacf315b1d86ecce1dc2ccb127c49fed96549c2a7c069a387ebc80ade66cfdd0f32379b6734a4bab94292cd4f8a9eb12075e632889c4ab2174c98cec028c384a076538ea8225a7d1729f9e00eb67ef5168d916a3635d6c3623ea9e58d6c95e42df9c583d719e68095d2c0a7e2885127461ce9de13159474134269e3b87aad78123d0c0f8693ef619fdd95897d88bbb419944e02b1c3ea3084e8674db40b80bcf7a095862918bb9c9fcad709023015482b943c6c84c96e7551a100981277963f38c5008c5120f1ae3ffb13ab4307044fd68d33902e8e87dee40ce4374647745b702acb86713527f2db1eb9f4a2860f37b4ffd211f19bdcc9b67c80bfe203a1ae184265092bddb5171b76585993257c9c316c86468069c3c2637054a6583484b3ab9c5b88c3832f975bc27d6ea77df2e9f643deb25d80d35555a8de6f2b42b3e8a4a91d99dabdfdd02663778851f7f8ad5e1629e9eb6981ff27568c9eddc6b5d99de92990f3e6a67df5d9f55b251c0452e3641651ac9c662c3339fd99e228e0f2e1ed1e1281b5cfed64a6753b93528c7720be229e3381e66913938004caf1ebb13b2559a32673d09add5955ce1f4417869074bd03f2c299423323e2441aaa3cb0e4126aa734d93f22da5335774b693c1dad3864477cd6d5243c4b62fc33ca3a6e8734dfb34f3e8201e63482bb8a2a4088f179b6bd2427409b797aa081b8da8b469f2d173bc81c3fb48b6ddc2f6e1ffb64e7a902f9ab4c6224854219791c4395d5863bafc5520adeb7247f903759a2934e0a46f77154ae903bea324c46c0adf097e71117d45f82d5866bea4d67ff6abe90d3e402a8d2d6716e12bba77f6862020a4c2ddddd530cbaaeac2e6235a1d0e3c9cf009324884c8c27995eb987561870a90fe26064df00f49c7fbc8d24f36da975761d4768f78926e4d88bf0f32c2992f0bcef4dff562829ec51251cca66a9561043aa8dea9314f8426ad3fc475d2e0f8dcda505014abab0fabaf8af7a7e0c9016c228e52e0d6866bccac72a086b8e3cbcdc94141f4f612054379793c9ac1fde157c28cba7a90c08b072c6189ac9d2a11a443d09adb6940e953192884c634ba688dc2adfec086844c9fd5126830a93e332af20443122cbc21a4369fb5746287fed5c9f607fae15a165b518f265a03a697277be525e1680e17fe79e5b8ec72ec0bf87f71bb70c8ca510445e0a972d4eaa763897b268f45bf31288a0176768d71f7bf8d250369645d65625c0bdbc04393caa5c2cf2f66ea56d9ec10fed65adb9f2bef9b1ac82fdc9aba3d3c1aa38c792867b6cee829ac805b7610b4e1bfdf83fd0d535059f008590ab85d8d14e81d9e31e85f56cefaaa2e576f5d1db41b4eae1406b255e9643d0333c88af80294bcd936b466028a8ca81dd12e9bf37fd1ef836a7fd351d20d15019f508b24eb8eb152c033937923c5ee74511a92e048c90a2b89de7fed1dd2da7cd6ba29bbd7be443256cdb064a18fc35c5f9b098a19ebe7cdf98c7ed1d19ad29b5e6c2c62cf0cbda181ea836a0dd171fd8419ca99f91fce9240f298a4f64f4787c1d05cc3d96063c6c8f2d6346e733e7e47fc9bb6f14d06a2e877950f95d87f67874c808600a27fcab34d6f69cc5c730831ad4589075dd82479823cb9b41dc364364a625349ba59d4ca6316b22f7657c2c99290b945378c40797d564b5e065aa65831c8d0be90390d969d95b7a0a834d5971443efb3c36a2072cfab6c987b8e5474697ba8660d679d9e61b31f26da5068239b28d258eab9e9ebe003c56c64a597135a438149172aab6a183793caf4f5a4f690050b3c92c3c66d1826fde1a9e896bc6ce7047097cc5f832beaba93df69b19759a34167a4cedd7fdfdcbdff329f7af70731d8e27693e27000943d8981f4b68e60ca1de2092356a99decadcfe7126a4c93e7a5a79ac85cb901fdc3b4c3e0db640c4146b4a70a5a73ba1f7458b1888f4478d215c8edb2f4e795ecf51d8d734aa0c4d265e568ca11669e3dbba3764b10661ebace4c569bd381232a7bcbc8f728caf243227e33ada209b10e29b620a1163bed67783bbcc9210f1580fcc65ab2a06afd5d2485eff935e45c59679b95d3c94a4ea0bc9e0985051ad2b320172dedd7094de8140586f7f48005e81c5abf28501ba72e427c2417a729c28e90c528eff82e4aac9903dfef05641681f1f984ead43661dab1ddf5c730c44dd8f4d8320229625c715c89e2299018f5ed8e82ce5f7c24e56ab1c964ddc873db58f359356c922cebfe059e77ecbe250cf49afc84d1716c9aa6ec4959a096bfd4d7364f18765d145f1c3b4b8682b612c15dbe708e86da96e7580764bc59c32fa01d65c2c368afa22093a697f731a1677ef2a1e5d4c7e02a3646ad237551764ca7f227ba1d8ab35f962bef8ab242a7adaa79ec633ddbabb1ee39848c6ccdd89c521e244010238ed229abbe2ca0fdef6bacbb46f3b30c62b376f934aa8a1811a90768055b847d6b8442ddba86a7a9a229ee80589b1ea02eb6384e6682b57948fb2f9a72145fde70fb47878c9fb08fe770d78fc96564e036449b00c21ed637a618337a12728a8fc5c1a272dc7fa4f8e7c6cfb242596e14a3e407d6ef85d69b528a79d18e7dedd8935eb966512f692acab63eaf6b7e24849c1fe49a96bf9bed74d96b668d3d70000258f62b93b6e96eb7c58c4febdc6e774a7b9b125ed50f75368b7003b8bbfc513939c0884b1c0a0bd67d225a6b7b3537d4829207f0ce197abe2aef6eb7fe771161887e46216ab64b5065669892645f0a63bc3240f3b2a046343e5270310ecb89a1ce9a2dbca7d4744d05c1d1099ed6391fb0e38710898e1fc14d00d1cff4de0122927b05c5db4ccff4e69ccc7731800b2fe60ea2ef5cca4e8de1615938b79ac10b5c8996e30e06a46e8f5d52852647cabce6195a37323c1abf81ddd0145fe51085b52ca8bf49e93be3886e2bdb8412bced396e779014cccd7fb6dcfd0df5a938b823cc020093dfdb7a5a351f2053c82beb6673c1a40962aef706c6a9c97fcd7fcb30d16d4ff5d0cd5b8c1cf6fc9b535dddf592001819e6044cfc039cf008392ee764a3b15476a25aafa6897719659a9bec6e32fb974c4018a91dfb9e2b95d58c3346aa96b61e3ec89e31e66b1cb8852c405aba7bc7ab583234f31777223089e3d85e4fe41ef58c5f4fb49a9ab09dfc5a00419448503d16991505bdee7ce03d79fd34f86233047469ebb70dcc7b1be76b55a9272adb0b639775db56cde1aed998cb510fd99e52df2c99c2a7c9253a2ea8661cdbe9101b25727cfe4bdafba045866a3cfa1106e7b3f1825ed0585702ba595c21184c9677467351f502de6fc1698b017d23d214ccda00cd12f043b97c71c65e41461c1627ace21d48e5a0e8162df1b89df0e470083aa1a3676f50f2af3c369502cd213731410707805bea0ca97afeb823cb0ec1a3bd1c2ce4b548aba404f328ef1623a29feb293824cb82838136fc29971b19afa64ab88f112af28b61af43408d87eafe799492d7bc9f31f6a64b31338247cee418c8bff57637183bf0266f0566893df4c523880dd03ebf0d219fe6fc6ab9f205012177859c4280625952be9e0185e62c8d805402e910f46ff91c62afdad850bd6a3c29680ab5f3a9a21a7a34e6e1ab4dd8933edd8e7d98c536a9ef72570cafb15a011cc548f639b8d565e9ee9e075500af448dc748ed72b6e12dd36d6bbdd68cd9589ac5df6f1a36f91d55f5b05dacec197b8be79ec84beb009257ca9d538ef4ef29e99056865ecb17290470a44d77ba1e207e661876eb0b9ebfc3ae75369f91a55c524d35a5cc2036713f88033d8011c61baf6b3e5f1abfc09c5f437ccfd10d02d91d2505332edd5edd4d6553978d9a1a54661f99eca0af701172b13984ec0d0e88923f4c984aaa9755782e1fc267fc21b3eba9b0834482b506462035beb73cd252f9c4953be82deac1060cec26d6e0e32185320b8ecfe1986321b7f6e6fb3f551d99db6586d2115e094026442ba1ee69847de233730a731f104c9e066280c1a0d3bbad46e0cffcfc156ea5ae3992cdbac61be0af9cbae154f50ffeed9c0e68b95aa761bfb1a697cbcdd8b0b3b86f26decda755076faad23ffbb1ff31fa6ddcaa9ca52059622089d31ac570d91001a0de836968c456a1efe7087cc85ce664c67b7ffd129a59057a1ce27f0caba910e4c1cea9426db866e05405b682f6c7bdce32edf65e0cff1d14af0f4cadaeec64998f98ae0a8afcc24c8edba85485053e9bd9cdd92d37bc2ffc9387757b6c3fc46851c8c1e9a48c7ddb9e709a679308b0d67706eea6a2f905ddd034419d6c0bf9f90e462a0742cf5f368baed4e2a737da2615827df2d51c655d6ffcfa3c36b9ccf3cefa318bec2d30055d7c9dee4afc8634ba28ce38588f182477c9e67f53af02ff99cc1e9e2a0eb7ef1cc13fb302be7aa86ee029a1b4b8e6dbf0824f8f4a5766c478a4386785dabd9dd16700585ae67f293992d5557001962ae20f7b93a318bfeb726ac80f84f90ab784552906d7da5d5f24261b7b14d1f2b85658b3b4e759d41b900616bdb0d466e43b7301e40303dcf33685433b288fc02e53443e1a9d846efdd9606a9a8fd199cc00a9d21b65c9c48d789595be35a5c933e2bd66ec4d00553855600cceab596a18dadfe2d28595dcd4f03f582cc37ad5700aab71537f3551750cef43808cd5a270d2fd7b32eccded71a86cd6ad5876ac8dd3f4a876bc8b2a5c07f359d8b8ab097beeebe36321dbbf0ba80255677e0115314581537e8b6aa7944d5594ffb94567e23891628cac251a4bf6eb1e85bc83d904693aba92753a92c6e6fe3d1d1709844cb8d842d51615c6d99c0d792d9a64c0b0460724db0163b199dbd59b595861286275a6c967e6118a5ca252ad88a10c92dae4d1db80b74dcdb633c1f8dc06b41acc77e5416aa483307d0ea004bd58e4172c4c7e25aa1f60adc4f6ac9acea8692331c67bf005d9d27ee3eae1c4f44852174e85f84b81c2051b6c2c7dca56c7ea0b3a6b521f610c663d363efc3657f7bf59e89725942c27a2dd56de1cd09cea9e9a8e6d5015a6c5a7342010d9a20bef94a6a18bef4ad4d6a1bc291470f4c999ed97d6d45f1cfb8cfd2d476a60503bb837c621683db3a05868808ed4637e055d3fccb9a8667a88ead0ee535379870dd812811136f619b93461f12c28dcb577bcfcffe0f24c7876668841edd40c91a9d98b9f19fe04c246 -MD = 7b87a9fb861a84bafcc146831ed9a54fe3512dad25668512b17339175b0c9523596209336b0ed0cde5648faf6c101043ba3a653bde0ab8a8c3959b33aa9f8624 - -Len = 55672 -Msg = 05b9f9936306166d89bfb097617128be79c69670b36416243e12627bc41ca6c5e5f98fc7e52ca5bca168dc99c8f76595475dcae905383ad4d16a22e3997afd6fdc386c6761a089502a017889a45f40d42015d91286be874e485666fd969d4584d1bcb7fb412b68310ad2aef05c6f6082eb37eb739fc0a2998c1e5652244d270dabcf990cec95eb682b23a4555af06ea7900b2795b60436bd840a1b69ac514a1154b73a21caa6b9fb733c824005a9114cf6d9b6ff3554e9c31762ddca94725898b3bcc1c243267bf5cc647139c564f27707e9c039827663b22f6dc3fe4578f6abb0285777bfdcd85b1de599c902e7b933aa826ccc07324d92b374f68c282bce50334123c9a69179374e05217724fb0d85c7eee23f2a524f6c8abf9efca452889124514e3f600d0590460d31cc9368967747734b1a559c10479e96e1d720b7cc766b9eff625518256fef45f34fb8f6fd10105acfe6efda392bd641eaa406204006f1715fb8ee7a81db30f48d88f96dea580beb952a60d271201a07dfebbd568f499c1196cb91fac0dcf16327ffbf940458206dc66e0f4d612f5232e935ad215f4755c8cb23a7628a7a1adbea3d7334f417382a893b6612b15f66082f083e48590905dc2646997889be94a2fdc97b15619d39680717cceb08b93fd2daefd89524969296d0becd0562af4500892b41fff4f30d70678da99e0e43c3d7116fe3ce68f6e63ef113add0c056163fb6ec2bba55209a8ad22266f46c07db61fd12c7bccf32e71cb0cba0a349b9efa6ab93a30d2b2ccafd706069b5ca0d70b6c55fec27ff517f7736700d44a5e2b97c91a810c21f20831368ce1ba9cf5b681f93debbd7a05b9599ab895e7c7dd95a0a8fb3da9fd803af12e3f4e49724fbade48c189a935b5910c8369ffa1379a4bc98ce3d686dffdd3543085b2d4971f5254dda94f224d852da4dff3949d1404dc56d76cd24f33bb7fdee008a5c855d4fbaa2a5da2c53be4eda702fdfb37e7bdc5fd3aeec75fb3598ef5bf209db149013532a1473aee6b555f878ee1aa0e1d15771109e21c34b9488f3d1076110beb349d72e50e6e2a567701caf637078c3ebc8e36d6ff477ad018ff19a6719654a6ef730f681bb2f5a79a62e5bb76ba3ec70369d3249edf7e624b6d1fc39b94082682745cacd7bfccb960016c51193892409aa86a75395acc1a4047b40a6ca0b2c4ae0fef25fadb3c16484bc359a6f93335e2b8814b673fe052a82d7add5d32d11bb2b43b55dd9bb048b3c09f27a8727e016c18ac0991056795d36ce8dee5c0ef9640ffc5df0887c5cb430e346d863aff4da7475f425f21ae7e62a46261bed16acec9411303f405e9187673477dc8c9138514d2ff882a3b4156c6628c2820fadf1fdc26a77738cc96aabe9e2ceb08937712453a114d7ab8acb98f05da74b493b913ca2f079b3f125b1c9bed69379e2076afa8fb3904c9006d312d2cc1d9f242855533b898028f9da2c88eff90e62206bea7c074eb30bdc8ef481145c6ea627dc02ea951ed2f92b50a49182328790cacab852c558c639168cf58dbcf7e087dac063a8b998b84f0fefe08b8268452e688b9d23d1bb1101c7679fdfd484bd6bc53a3f36aedd7a522e20aa1ff485916282186197315ddc897687ba1f63ea4b7971b35d3b7cd760290f49c8f5e270b354a1d8cc57ef286ff9ab540ef57213d3da659486602c6cb2fd3bd403b45311f32e4c33a50b1302117aef36620708e69cb52943824dc586b7f538272304505098150c91b65ba3d50c34c8957f002d4bf033462a19a94f0cb83a90acf08fe015ec33685ac5eda988a64ec1d92e86e92a157c43af131dd3e6fdf3cac932fa0b4835b0e8f69b6c2c0328f05f6a3541456b54b7a83c375057fcce496fe8b0f0d9d1bcb414ce007e352eda442cb05cdb48f7f50cfe384eebe6367364067033175398c9667548bccbcbf1036faf146df9fbb440a4cb0b2095857c336b17c983178086a4ee92cd96fcf634ec9c70fc2e46648b7da79a1c75f73eb658872b5a689969819475f3c657b9bedfdef1f8d169678d64f33df0d515b818cc28dfc98daa451472e2232199c7a92cda1f96cefce4077e28eb8c579dc8811ca6ec9c79c910c28b42d71fa3b0ae75470df7b47ae368cc3ebdadbf56dc55fa502cebe5c37763b9d6d7b9920171d4c51860b07385f0bc5ed40d81fc76fb85cabe476fe330fd6bd1fb1bd0a3c446013fa5bc91fa768aaa664bffaf6b3d60209a6eddbebd47c4f0b304f5667b7396fc8ef807e172d518f88ca87a7e363574ee1166d7219c9034ba06f84cc14196c88e58192be9022b046f77f5683882e69fb6d8b01ee0a894b59073e00a2a1eb6467f460e0ef1d3feb5d7d03ab0237ad74a429654994308dab03ca2c316e93a5a7797ffe19a400dd993f83e7d3a874390db58f4582f92e5eb8b843aa95846bc0ac39d2c9ab520d74106996ac8eeae0899bcc19ac6ca14664db031e49bb889cc4e925b743f49d759c07684fb22b4dfef7b53452fa55112b48a850b479f1ef994af4c9780da3daebcdd4b7f9a94746120bd0aab5cfeabd4f62a74d90cc072df39b4591af77279ed2821ed53ef24167dc4e748bdc8d8c2a255b3e465da039c83e6e622ac8210e5dcc412c5c8a1dc827b038174411b3b7dc4f9af3d755a72842dc1cb0d14c9bb69c3b93a39a559c4a0a30414f800ff30c48109a5e6d233141325f2ed831c737bede92e21b2b4bee3593cf0273bc21abd7f23ae1e49440ef12fb2a2d4ed8a295859974c4d99bb79419390ee43a54e14ed96f00fa1cd929312c11ef906b127925b95153b48548331e637e527ef9e6e96c5f23155b6da86697eb2af1e0d39bb578b89ab229a4dd48fdb2e84c3b38ee8484f792da7e5d8e6393de8ae3a71eb0e1ff11ea129c9ea753b275eb5e917dd85d192142e2eb72f7baa584d6374b831e793933a3e7a5f9530dcd2b1c0c1a4f30dda96ac7a11b3480d65d6c815f56c72105a7bc6cb3ae4b5cb1ae50eec74e139480a64275a7962896411bf400de414154f1db1ab9094deb10f9f675c822a5715fe0a036f168e4a5b47571c9f946a39846d843bcfd5aed7f3c4106085ca0a8cf0f6817b6af677f5277fdff4ccf0af62263236231ce2b056e2b218d8700c3d0a33f918d502425deb53d5504faf69da176365dc7179fec3e4e6a05dd80590eb5944cf77181e4167b2490e5335304914e1a3d01d2bcd730f08675887672c9d3aff8d40454ca53cbed46ff58faf37d684464e39a25b0287bb4acda03f8ecd7d558674142a79817b89d92f51adc4ac5a53d0cc691308ff83ef3281412d54d07662766312d0a89946f147f0e9547d771ba8078628173bacafd549e903f8c11dd18a55c103dce1d5e51ea819862de08062ac72e23d56fbf15292166ead48dd9dd6f4adf6aff92a1d9f378314f0dff8b076869949727950b6b551217809c7b136ccc9056adecd8d59be656148ef13caeda15f04248d2842e32138f370dd1b44d1fd30e6855800117188cfc91d4b716020295f3cd9570ada60dc6f13bcf2ec9e57af52d7afe43bbe4d469e43fbcba0c13257adc8d298c81f152e1f09c610e3c8ae2b5660504c269dd63ff9574a3949f5097372307518091aeb61705ef5fea7c9c0b96509d05668b5f2bd098e725b13058fc5d5fd2c9e76d1c8bc8999b086e1a973a0a75b97cba90f8a06f56fdbf9a7f8aa94ffb65ef4b74e96869342616e3971b12a43dd0d7293b18763e683eeddacd6442a18e372e073993b08b5e26f7f5628619d62189a15cca5cf1c045011cecba744cd470cd22b52b8a18a18004281e1d66b422b92a77afcf34c797660ad93ac7492c6b4bae59dfeb5ae53e324423c8183b661c7d59a6acca1e4c2653b2bf5f644165d887413fd1c974cad3fd6d778df382c425d69ddade3b9813ef867f1bc5220b8d9ebc3c415576762de549f69fca3fdb42c16d4d60beb420a36586e69b0670f6084042e60ab542cd72f4906609174d836691aa0ef4c894567f2acd8fa98de19f6a4fc3d4f88beee95e8479424fffad39b3f90548f3767c980ba1d2b0b3e5e466282fa78fa743bb6835175cf1d0edef5c9f7a0791d962dd63dd6d3f10668909f8c662768c736738b89b2fc41b385c846a9d87496032f8374868df5b152df1b2b5c97ab941f9810758f5203724f2e5fcf232c3133a8ca0fac4329acf4576ba9f3bb5fad846b60b77c7d7ab3e957cf4c97203902d974317c855cf01f417dd3dffd8f0455c1115712a93b72342e353137a686490d0ecf2b7008b92b77202ce16753c2cfccd27b45c903b282adc94f1cc6053fa27a5d217f933c4221db19cc5be9fd3a083a3f0ff28492c8f246430f58a4bb318c724bd2f68f29e01c74b5c50a0c01e1f7c7913725ea5f66092922dcac77d046511d624a5809d77962697b7fb679699de4994f5aa8a37175107bf11de1e84d6438a229f26dac4ff63ce3f46327d83d5816db01df4158d1db4f67353cbf9e397588292830fc1d9840f20aa6d724d083f9d6b33030b9b185820e1278a00e429c608adce86dcf07ba3dcc051b44770945686c4963b4d755975095a741b1967b7f0d86e1f012ac10bed712fddb13e62c8a8d20c622d365ed0e2f2b4c19d71ff2e964c360c8855ce0abf50b196caa3ae15b503952f5f52920f3061a29877a704ee24d8b82f930a720897f008258733acfbf9901146582ed974dbca8681302523872b0246e0a7a5478605c395f27d4b09fbe50be35f9e277f9243b1e2e45d78d58a275d74d83ca2d8f3976fed95f3762f8605db9dc3a7e8fef816ac4a6a661e9557984ec47ed8af80e1bb497188a031a83aea83a32aebcff216b31e1f5bd092ed8ffc5ab83cf217e9c0ffe4b432fa09ee8af19895fdf058e36ea78be46123523883d215c2ab1f787e21c3c6483d776b6ce6b99ed8a55c203d70627a4bf2e4e910e3a7e46631b74db884a5628ff09ed2cddeb0eb0dc965927abc827d98898bd4011ffc6b25796004135a135e0e04d6dc7be3662187c2c34c25b375ea5cad8e9f83a92dfe82ea90382912abfd34d2b5e4e19547b6e929fb99c8e5bb552ad77398131fdb3300fdde56645ecdd4b6f2c288a954e43f94875527ced3d142758fc17a29d4828d222b90eb5f9ef788e6dd73343db2ba003c438662b1fe4646bf4efea252679281591c5e637543c76e570b5e74093f37cd22e6f5c72cd588b67a8d919d0759a9a438189d6b4ffdac198a04cad4b64afbeafafa39e179fa273639d410e6c32b265a21c8e44f3a2d13fef2427eb2af6664ee26f5b93e23cc902a6faaf30c005ca737b8a5b99bde42ada3225cb0aa6f22014b3951fa39d4dd5227ae8abe79694e9ab15f3783eda6dec78a8cac2738700e5f76a4977360e79cfba258fbe9bb48a17f5ba7e6e9912e61f039a3c938d95c7bee24eb5ecb4ff69beb2f0166fb4e38d5c39b053c4142df7cc6250a2c6bf98f0b2baa8fe058636c5aaf223a6479aeb45c15f409b0216f247fa7d1225e3735722ca68c04f4b127b349c610666cdb6945c4d50b27eb1062a7fb13c28ed73109b060dd4dece45c1985e9ae9e17f896ea67709f24e23584e9d46f987d921fefe2c4483e64aa37bfb53ecaf71fb18032be841fb2e5cb37f551345db466fea0aa4d28334874bf775297686e0e29d5ac456235f2ded2355ae8354245e61306f216c556b299d2bf2bcb1c7d337220f6d53551f7ca715ec326e40278a8bc065d9cabd7ca5691130bbd7fd0f7cbb1a99783892a43e6f8fff7146f4561f684c554f8eff10d9fccca37b4e73152874b283a3fc737a4d8f44a43cbf07a78c00eb4afaf39bdaaeebb5cc59aa7da3806bd31418266268520f1b23b85fe2e37958868a0183f79fcd3db3f27e71827f2ca76395fc3ec638f5f5fbc30fb1ebd28d7a065e8dc67c2adefab05e112eea72d3304b4e7acc07b0dd4bcecd693a8b3b716d510ec6439242882a93593b661c441d0f7487b7598d99b3197b89ed842ae7cd3951e2d382a2ae73d6442924a382bdb44bc588de6cbfba1e65ea3fc416319f48e7ec22dd0b12374806aa16f36c83a53dec2598158e07ddc7390337157806298a7d0c150b674ca5afc0af6ad14a87c363fb7e018446ccc8559caeb80933134d3c069804861db6c04f0e3a6be5c4f6e0cb7fb709551c77447197d30cc8cebfd50687783775b5ba4fd1f73463586239c42080b8f9ad986e19c3305a7979d171878f0a94f601b7bf1cdc84839851acb63708076919b7431a0ff2712b4845c4932d8096d48952ac2ded19bb1053f92bd6012b1ab2b098a4e3eea7622ec153308c8d803420378f1c6b8b30a6c3db776601e933c47b087b44327d890a4c2bcc9dc47038eb604ae18de3bec84d847af4e5a0b9c50aac6786a96d8541716bd0d791a39d4fc37c086f89fc4d89b63c76983119378cf62d16e15dfece769f74f69d9691de6ec45cba62971e021debd1188ad1d62c2d8fe65db5e84b20d19d50e64533f6f93df7e8a7e140b1a329f42da8f34d3d5f53ddbf832ad0be43fa72e5e8f8f13ab763630919150a1df958d7366efa2eb89aa4e9a1d2679fbdfe98261d43de56c5e08910a556257fcbcc4f9ed6b1c8fbaea3c8ba729095dcb21b53c2df411eecff3c5607a5a73a2721e4b951f4bb843c874368581c06db100460d54c1228e13b5192734ff2547c8988083cf678d2577aaa422ccc857c62c21b96c3cfa0414eca21ac87f072a5122d69028097493f693b8168bb1d9739517a5f85c85070d48e21d8503bf30fe2259b2a982e3b514ae10a737dbe533887d1c138f48ad96a29c8c8df47375fb052dc5c3593eeeb773ae86ce848dc7752ac0a1d0eacb171768725489c59223c3d3e60f7f0ba67aea359a5eb4892be90ccf123194976e6217c38cd27794da5939deed8f4c5d7428cbded410efc230ba68e9e453a5118d1f06482e7f0dded676bbaaa6ddc1bb0268dae3fe35d6ac36cc280fb970a8e5a19e616ae9b2830ff11cc7bba4735590fbcba5c97b461fb3a89ea8a5042106906660b7b031359d94c4abec8658d8ae9baac1ab03ddca1174f092994e46dd448e2626879cb740a429cbb4a89f5686032799db5927882a627cc9584860041df94b8b304f94ce9c4d2b70b77a6b0ff419c163894eb91cef69177d40548ece6b8b64e01e7e4d0970ef164e34e08df7bb48f5724bea1d0e91bbf186fb3c2f083e7146cf51a209da970076debd595c903427306093b9e7dfb9d17790d96dd5440f518dc36a497fb45727c98ca1636b8c071b0e99114c8e02b02036157b77f5f466929656d8d2f34949db9ae2919d4f2d9ccaec962500941a2d4ea97f41d915abdcbaece42ded28fbd782476afe455c077d8d66d24f748e7889a34e48dd0fc8dcda411e05c9e6753e88c26ba0581a36ac21f8e9f80126d1b04dd4810cad9a6409c7ab96364d5d6c93f5f2840d2f8a438e1283f251da85f253e2490e3523f79bb55d80e1f018b0739e77b90d1bf4f4272fd7b52c8a5c1084d5ff77325ce0a5c451e4378dbdcc9e1ea0b68c7357490635f3da12d50bd654fdb8fde599de54336281f455f619d964e26d1ac363498c3f148ca213a850f9d1c16f562aa1440f1f1aa82652b77ebfb363361d14496d3eed375cb83e02f43705747ba0acf52871c74146c2c44e66eff7f5ae45f5822cf1bf12e6950861501e7e9b6055f2e1f61cca7ae07201375cfaa12e382dcdca1315133bbcc0f9600f009b8abffe83043760a72bf7bcbfeeeb604d71662d237dca49981631b4877b8b8dead6ed02d3d856fddbd91f0b56e17ca16b63badc8d198cefac3707f839105026eb0469fb6beaef44e706a8d64ccbab4e798998a4712a0577ce1281f494caf76c2aa7d940c1986ac6473937a627e9d1c7f637922d662bbe827c3d42421107dbbe18159d9b6b8d54027ae54e037ee89a8e701239dfd29b0290452bbb59445387ad31f23933c0163579f0af4e7698245032658df2244cf48c11a7427fb2953a85aa16a22ed275ef89ad56dbdb682a49bd34452f5d934bc4b5971125e1d68a29504524ca00dfd365bb1d0c1f5760abb51c14ad6aceb545881981215a944d99ac71feeace31b49f1554398ece54e872f30743fcb4e802c0cb1270463509805a405547e71344090f6aef836d8d567836700952b1b21bf453ea5ad4fe69b407326194b0885dba35caf2e7ab16b0ce885cd89cb17ad6ed1265823d3fc84d265ab8ac9ab97cf206e34839c6e118fd4fa16c892bf0a697cde57c0f44112273c2e3636de1c30374bc6a1dac27f5f2b73c5bdc0e5180c37950d61e0e09e99b622c49b942048dda5a3d52a1d6653a2263270021d487f25ffff86cb1eae929a19cc4e620a56d4a50171c357b25192e26a59246d48849c5ea903721de428c71b3882f514024a6b9133fdb8b0024be527de300887a76116be1de9f9e09914e227fb8ce138e3c2b3a7248fdbbe751cf47a6aff45d7a3a6964d44f9429ba43b8ec34a313956158754f1ba6f5408748b66e2f60d02e5a51dc314047b76d66f6571f90dbb26f60061f777dee54c166561e3686aa3683a138c461a46b6bc1a615933d02c70cfa10c1744407938eb71b1661513ae099f5d56bcc668f3f33dede2e17d518f995ddea173e25471b158a0c162a1ebab87ced6d775ec04f17a20da5ac3f7821e7df736273b7abbb098bc2bfc1d32f847651d2efd7e60f82a938e6631c8486dc266c6300638b37d1c353e9bc95e6e436beab5ec2fa1c94c8486af1bd0b8181a619af154a63236a39fcf077792effdd3005fbe98d7a4cf06e99aaa809d5b118fe462a12a6ff1aa3520af3e47be9688b0ec0c5fbb5c501b304018a81d0179d9d63406fe3bca3cb839861e0c94b51cb7e31939c1dc266d55d17148d07b65d918f737ce2f0e1ddc08b9bb6299e4de4931736d2e0c839dc325f263724b212f4477f8d7025d2bd19a41bca6c30cc2a3e49f68d23267382919319a00de4097c9829de3fbe9af1b4f3c0b4b2f8b8db36bb7a8cb2f8ffa84323924d12fd4d866995b34bf8bcc4e65fe8a106d3e0046419f88f5a36b8beeee20e9a49fd89b3b150997e1956ef36191454ef52abb6c5cf3a5202df8706f6bff5bf2590de37c902c7ffd4e6c8ea611288e4e658a8e15fa51e647f9d22583983d4b1ced2239bfff346556234cd22d86b140530696a04446e4cac4013a720e9e32582e05e7c0acb2b4226a073e22cfe7b4c2258055d7406833ba61ec373f5aa566ebf24c62618ace341e01a34866d65cb97e8c7cd01c5389c71ce463d274add4606a2e679d05a37e3cc1e39f7586880f49db50a20d58c3d12659160d12fa5053a83fab01a0923de85573d7a2ca6b2e25eb4138991671d967dadabf93ffb78b4bc6d031c071f2a134069ca75451fb0fc928180e0af351dd746b06a79ca194a5e44287884c1a0b178bd8a4195f111f752187c9989caade171f5f4495d10179e845a5cb774ea3c7e61552f3f66812c0a65590ba9ff84502ce9140fe53d9264f9a977703c76e120c58f9fcf1051a5dc4eb8ecb54eac5cba34cf1959ba75e18fc04013e99405371c4b3605e07101af9158cf4c1ff43ac45abd768e7835a05e06a6eac84f4aaa6c7d64071019bdd13ee99d1aef9247055ba01b81ebd1d3478857f1fbfd07ccd0e1d2a47556c1736ab453a02e5fb293a67328d373a9fd3fc5f0f256163ab9971347aa8103327e1e18a05de66c05078698bb6379be5150c7c6187437ac09cb35dbfe638e234bb63a659366f46687f77c5684ce72e46a8317a27f4c1b3fd2b325a586ac20780af034fc0e0d4ea04109015a7ff853686dfa8bf595e865443e07e30a7 -MD = afbe632820e278b633260ee86ea0c2a88735afece12932ef44d5e762168bc28530a88bf49bd80ba36ceabafbeba7fea0ba783398109b10bf1373a3316e72ad68 - -Len = 56464 -Msg = 7a57070de9006a0eaba8e38cb24c0d088e08261a86dac157e8a9ba779d866fb800312d7df1dfe93b243a3195bfaa62c625d31a400c5ff092d6fd638f1ea911ad912f2aabffea2377b1d2af4efeb6eb2519c5d8482d530f41acdab0fbe43f9c27d357e4df3caa8189fa7745ff95f811ed13e6497a1040852a1149890216d078ee6eb34461cfa6693ba631dbefacf83ce5ba3f531ddeadba16ae50d6eedce20cca0b4b3278e16644535e0859676c3fd5d6b7d7df7bbe2316cc2bfa7f055fffc2835225976d9a737b9ac905a7affc544288b1b7d6dad92901162f4c6d90c7ae01e0ea4b5988215474d8902fad0f85bfedc351e51e835747e3ba625086d63c7832aa7cc562119f9199d55a8f54cf2f093c4f3f6ba1be5f0524816d0db321e5e3bba9af9998503bb35158d02b823621b999f3225145d219ec2c33f88bddb7ea7905a52cd1e58d1e41032b9a0d208d84576b78a29df409ae836398aad3eae174c278669a75300f6fc319145f3d171c7f6b1aa7685995a9465232772cecc4e7ab457cb3a28b611f57c2fadcc7c14d2b3b7e0e461c8c10fb08e2ff9a25de5111b68a7a56ec1d5f05fec50e4b7ca3ac02e017ae1d663f4d471dba33c73eb27ba7bd19d8151f3214098b54bd2823eb1be995bf64f6ec7933d5ad6337c71f6f28f0ea7b00b9e3d3677327f76f3d679f812782fd98975942acecdf6372626f1d42356337580ae207408af9378c50edc9c805d059b0c953a2a0d5db444b5fd7c5b0be50d54acfc1d687972a9b7c2a6070d7cba75b155482a2f5d9ca8d2c88fe6d5ad3dadd3dd22b4824e2e1aca793669d96c12e8c2f009049943ed4c77ca38d2028bc29d899d9c66600b347f07652a757ed2e8e73669522a0654c2079a2792be302c0644ec5ad3a37015284f14f31cda6c45cee9923dae3ad504dd72b08d281c0d029b3c52b1630c31006bf379bf67d9203917784cc98787a3e872066157636be7a3d3fc732db501316192048c36a6124921651becb978c0f154324b0312cf3e5e84530db42c6412ef9d1d0ae2d5521635933a3cf869fc572bfc90a94c4bd603e0388ae8ac39dac1ca377f7f1437f6558412f953d6778cbad2261fb9736f224d0b150e05a1d2938e6fa52bc976cafd40930545192d4e947c828531f43f091e8a4dbe3eed5b9328e93e8ac482a0faf16800fe8fc5537bce1c9b8e69d1f586253c06a8a0183fd80552b54cbc3329645d4c5c734c10ff7b740bab9649eb3d72f0e2e448d41eb52da36b725f85435683ab6de3e80c6477ca30da215134988d6bec0f65334d5952109d93e457b23bded5563d55e1433852e47ef8ab33cc725bbd8121e7dc7e509d0d6e5c89b9c59518d6084b20e373152756d8f797b263f12ef45acb0ac8d9bd0c906035e0fa31e7ab021c07b3532e834b9db9477551bdad8dbcd35b3c7cf1d717264da0689d799bebe62c03abd4d7fb5625aa78d2961c0fee6385630b6d5937435b713caf182f3a81fe92bf68dd01e5dd8b270c1df41180c774db62e61e7266279c655b22fea53bd3b7eaab88d03efb383ab961d5f030a8bf8d5feb5b04dfdc1a55a49c52c57e2877bebe587a52e173fcc0dc2a991efc002d099d5ce8b4e421c233b960bce13c88d45f7836bbd98c189199f9b6c5e4d5ff9675ee47fda341af85a31e58cfe652c5702692d6cbd8a131ad32aca6eac6412f825efd2d28545afdfb204de51a594366e1b0a8a938d4c35796376f6b7657dff88721348cf74ca2958937b2861a9e91059f6a243e71626502e2f4bc8506fe04e30b691ee7d8f0ab0ec65606cc4f4acdfa0fdf9ff703e608cc2a171e840b4d5287959326be4bf4f6a21907951836c25cecc97d66737ee4110bc20affd8f1aa4b5eac3be680ceadf82827c8f80a5fb9b02642b0222430f1205a413cfaf458b941c0b5cfd8cfef9031e949269a0328858a6f02346d99d871c9203e497a86beeee86648db680c1d50367e138d15a33faa2e0f8e668344b40a4e05ffad08d092afb1a7ebcb3eb5d642784f0d78d56af3bc2d805dc30da5720f51743bd420925290001e053ba76db90b79d49d8663bae3200b89e6d6874c811565e3495b4c2c9d2486212b894c94240fadc75a124b238c7a3a54c01d6a9a7fa0eddbceaef60fc0d1a669d55098b9a5c3967fb9c8f6256e2f5c996004422fbc266bd6224bc8cc7c2bd340890e064ebcbbc6663306ef40f6b3c4c04d27887cc53a626aeabe1ee30d97af6dbd3e3fe3e77cb0236c48b0f6c4ac1561edf3a7f2394163f29e8262d423b99d19f85d8fe9a47ae62fac2ac5c7368cc0d6d9054b2076dfd315a4155f102ce62efdb0d880f0823acb03a919a822eaba49c784b8cc980c6a523ca1f34e47a7b1c7817d5bbd78ff30f117b991d2aa5fc9329c779ac6c9687543effeb8dacb12b1194db4438fe379f1daf4742fcfcdf44dfdde3837a42529953aa830b26f1afc48769b0c2c92d08101fb225f4019fe469d1df53cfbff4bbe2ea8edee9c75c7d2fc7221db7340c0b2c5c429e17f2bcbc55b1589fc74229d94b601296eb3a94225519e5ab8b424247dc1e85391398fa70eec76f50d2cd8ab5bcff60357b4642a61dc4dae0a7bb78c409aba67e50bb02061e5a4ded5726bf561e0d9d4300b20e126e122b477167558b994dcbf537237b89cbb419fec0166fc557d3f446e2479f6d3249fd65520e82a376491d272e970efedf1bfc0c7465420851998bc888cd9ebf50b27bc4b377a61486eac39b9ee1636f41d81e9edbdbe229f2a78a505c0cb210b095caebfa6b6ae7b377e5d9f0c721e3d933a63c5d40f42f24441a67c5cb84693a3a156291b27623e337ad6a8a12f1638f73bc6e625b2323ceb963932bd4bcd1d6e882b2de1471d0007341d5d68a7af64be28abd52f5140cd84f8c5ff6ed01516ce939624b5903f7f174c9a23af665a4f5c635b095d672f2294bbd508fdffbf0e48363fa3e48d59f9e7f6e5a201f59757568e8d093c6e3deabf820f05c7153b626ff280221aa8fd0efdf5784efceff72b310c9a3b58d0fd6459ddac6c66db1ab1aa5af035b47d992ccdaaea80fc9ffa2980600b361f2a0e5df81165a3699bcd8a9bc218554e759ee1dba984ee8d8000e0a91b68800bf3b1062edfa3512bf1d44b98ea50e7452baebcac53fffe2c5aabcf2fa13a8fbba8a61b429aedec3a57cf733616428234fa292bb44cb426557a6b6398a3e9db8ac35dfbe7d5bddb2147ffa007e865ac9a8baead97e64a0d9559c04c58660efa15ce492683129bb46d3d154062d322cce23a9fb0abd30a0a68833ac8039a0241d943e839b8c3fffe6ac180d2fb590279a8917cd37475aca34b814b851ea27c6931aebb93dd7c631fc65fd2e6260c9d295a1ae69496608a6ebace72f1fe01c5d6db7943c375be5daefc727be877405b6283513d6265f63bd342e531ad464a86f1233e115725dc581279a3fc5853a6b59b90bf11cb87d92967504008057bef386ea56794bd5288dae0ca6ec4c46fa2445b2edee44e507bdb917f79769903624295de805e6470366e906b2d759b1fc570279a1b25497440eaf83cfc0de671464e1d3b02cefb23578bb7d88a7f7ae872d1678efe657b57dabff205422e5c49fda34b477976dfd07eaabd9ee052b25e4ce0b15a1325227fbbc31554e66898f20afac6805ed6810c1e54282ad99fffe5c6169ba7d3d4fd5036ace8c8433cfb0df0ad15722d7e9d3ab9006e08d0a7a21350fb6ce4db055a7e0dc5d2cbf32c10f24142aea96fdf62e0c14815b5501a477b7ff7cb9d7326d85d83c669dc70b669537f43f8728069a092e983b5ccf2586e62c5a42e2e46c9e5735af71466465c6285fd39898a29bda4c5745bb49c11f2757da4791b33b06f0053d5f07915ee8eab1e6d9be83ca63c0dfd043898cf49690b30aeff093a6a76b773974afe57c3dd919122d38b2690753aae1b92d8b3033c7e00579e7eaebf718957016f2aa870c9b462cf88e8b462e9b95d1cf2fb03c9ed6c8100efe21d3a0fe482c6b574948fc39227b6149782b81a189eaaf1862e27ec45176d6be9e26472576b39e662884b6ba944991f0dfdea76c6c727e7008e87b9a657df8aecaac9796084fd5a7b006e22683dcb00b2a28490428b267bd0c173e5feb6f9d570d2c3558e74538a349952786d97ee522c0d10f72a3f29089d5376f1bcb92ec3fd070cc73f9e0f1e15cf82de17d7458be09a1a0bdc77a215bcb10b6d7ed2f0ef0793e02f0286725e94ff89d3f570932666d60a5ed7a9143bc5669b99a398d2af2725f7fd65b21ff448c5d1fa84f849ba354d5c50ba6801d33de0c236c97f669cb219bec2d7a57a47979ef5a254d2cbafc26c9a91e3290d948cbbf9a55efb0f305f0b9f1fe6c523f108075f7bd394bb8f94b04f92e06069c83854bc65e2904ef27468335501b57f69208b99d79fb27bc222c4e5c440a2d916d7478518e2d3a85ba8abf612b6eb1f1867881f55f7b08ef002f6f7a66264cdd8d010de0eee39adf4526361c974da659743a96a77aa238791abd2efc9f42aaab6b92d41e84336c225081b00f9da08056e4b5c05acf56fe81f83f548af4469021909193b05a06f7796403f5e2444f850f5f51c6b66880a12f231ba9cb6f1a4667836413417842840a0814cc3c9543fead6c7672654c096aac22bbf56817a614a6cc751c77e4d15bfdc41cfec596623257948c8a0c83d7a1207d850008f4d34206f42a76faa899c47b2083542651956b365efbd75616d48eb3bde392540f8717ae82ede873cc8407aca5b19307cec5ef72522c21e80ce6788b693c72f46fabdcc7fe253b8a56796bb7da0f860f14d80832f885306d6df7a9d309f7698f1c28da78f13937e6505f39c44703f4e72bb8fb9ed96fcb8b41ee67b1267e3fcd1fe456eae293a430c120bafd75f6a4371b4b13e07c53bcea91b3fb4d4738bc587fc99b44599a4a0fb2a33388eb515fa6ec7b971d6997c933642eadd0f48da7d544bef0afdeb6f12c2ad0ef8d317aeddca72ece8029a5bb0ec347c462b5e5caef77aa9c53fa4f602e318f3535d0db1682544e012e43e35922b5e68a2a13a8eb4c1f77e85734cd60becfc84ca74fdaa240f9c279523fbb6d1842f34551953ed394440c1ce41599b9840d637d0c36e158bda0727b12a694bd9772563efec4104a70ee51802124193327f248108c0e5701a250465296ffd513484ef7bd5a26841888262e5b37e9b6955087604d4e5ea4659612264507d2e835d3ddbe098d45030483f38bf74decd8a9a6d3917b7bae2f4c42edfa9b8da834ebdf28946cbea9f6d7095e509a8cb6e835d2dec4e43a87627e4de9aa9d4f0721ff14355f2c16d8c359c46e658d1cce4c027bb0e2ceb46fa4c2600e1e93767a17371c0e0992bc5cd452592bb21824bc6ed84a52d18211f05ee223653fc529867e5d9cbb78e6d8bd8f8a739d2082cc09b57fe7cb7b487892f6a43df5f37a91b5be373f42967094815ec9b8cd95153e3c88bef923c66711dcd5d157c623fbd68e3f8eaaad49771632a8d6d0c2fa179fdd515e28629c290556633118e1b8911f996a2988047b458657d47a648438d11a7477281e91e4d47c88088b294d9882945fa5d27f4d13200d794c7d1c1c358bd48a62e180b886b19dfb2da83112ad165f67594f3792f951d31f77a79f91db8df8a67954f9dd690891363851d939dd97a539ef695ada1520ffd1bdbf96eb111eac5126482f0a772180c1934cc9c9124b915ecde88d2e4fd4b918868fa833be871812d184ca4697439125a461a8ca337c485d5d947a958fb72b7a3add7e70cc116671e0d1739ab1b8ece9d55a1f452870f5be0635c917bd0f7a814172bfaa2201bbf6bcf7d20caec6ba958dfed540d96fbe0a2f9222bcc125d1b5041614e9a8a2422acdbe8ea774b623b2331473c62ec3cbc842742b8d8341569de9902536463b20947bee4f70ecd04ec73165a0dc0fb34580a6a38f91ebab31c159aa9998e41380bd2f4ebf71fe5b645ceeb9058c648654bbc3e7f4d0e2aa8ba9bd2a19186a73882b4fa784b193a18cf9d2d749dd15851fff010803534e878cde7bd94cbdc0a3606845c1463891e8ef27458915d80af8cfd7c8cd6321198b5be7fd7fdb8fcfeb31fc7764ae0fe279b46daf9511832b278bc880ffbc4229fb214ca9e46d967d93236d4f58633d6c9c045478c4e4e861597c5c9166b8bf68220596e9cfabdbb3e25d4533640eca1998076308de370f92d7ca1a63cafd9fbc47304c240a3c655a21080b8d5257bfcfb7e422c8abb1fea7ea9c8a5ef333ea0fb1c9f6c15bca3c58994b48c4e8e523783fc4191ef3fbbf89d81a35eba903a948a9f91c2a8bfa69978f4f8340ef61fefb79ced1737dbc5a1ee96ea270b315e34f77e847c66276f3fd4e3b44692e725840ad2bd130129dd55067bd5957da10a00c63bdfefda7e6e2741d3814a76fc13a2f2302a1bb7a463a069832e306e69ce867b5a1ca3724f13fe3436e796278f6abb0227cca7e7d5e9128c6f2c7e79f62c448b4bb32dc9f4011310904fd0212b8b4abf3c1d3dfe28ee09d37288d60cc0a3b97a934be54e17b6048b72328ef05af5c08dff84448737d314f33fabedb373c563cdc33f608b249340f95f281911984abaf2c4aa620f6d38b250490e1bfa69f1c1f95e1635ed952966eea9a905116dfa98822de7fcf343af707f1137e74e2db95281c658cbf203f8d4d0042dd95c3675f7c0bdd5abdf5587bdd41ab1e62b399c940b8e8f9944db822941d13f1c6e9c5d4712d6ebc5201d5228f3d7f48f1e081c14db392334329645c2b8a35534d50a11050d2ba2ff61f5af1062db88489333a8438538ac1367cec43fb8fcf8b90c0a11c0240e83a11198ff228597d5a92726d1aeae1f92bd30ef7dfea730922f90170ff6ebf21660bb51b2cde08f7537466c18c4aa406fa84a62e39e1800c9fefdab4c17b998d394cbca7a711834ef697d7dfe13fe6dab5b00e3958c9fc008ad915166b1314533d3cf5da6ca713a9cb638d6e21b3ed9ce4be0cbf4488300d6c21783d041d7a9cfa432a5d828afe305b414f17548d03751018696806086459cb2eccd29480118ff7ca21d7f1a08c0d2d97e68283b56e8dc025ecdea52fe00f3268d87c24262255bc37a3f1c2d30765cace1b56b612760b7c4d5fc629e7eb55263766e4baf6f415d1f47853fc09b563b84fb43bf38e6518ccf888cb9b17ce5331033cb161d8d1f8bf6768a4a72ce02c818179db441081db398e319302a7d233da34238c1eb4ff260dfa3b8ccc23ceebaccb34dbb081147d4a7720c6667e3c1aa932e31dfb72c7c64314b8b571d6c7c6c297abe63fc76425881c1e0dcf8657322766440bfffb7100e91ca9c4a12d15e54a4ca7a2facbbafc79e3f21046a66aa3db360eff323545fe887cd4646110ff71cc51f0b7e8755d2aa7356676d2c6bc954e0b08a09d098be5a79b013bbb67cc92d1104ece12ae97d69a7b40e77cce962f064efc97475f8ae0cfe1faf1b61ac56fe0f0898f7e5cae28d81b490d4ba740998d65b08b39208b1487b6862f5a113231815968a13668eb49eb7f498d473702fc6bbaec257932d6ac57826c9db0355bff3cb3b5ad42bb96615b0d08127867248026b37a0d117fb3cec7ad75e2bf6c87029a67365aa83cf797ae2f4d42e720ed4c48ba21ea08ee6aa3609f69a6909fff6222dbb45172d255146e4ce1c59b48a7895936a86467664252a9c1109329b70c465d78f639a867fa0022cb8d449cc8985edf8fd82435d184032b79314f949af4d6d1a6c6bb50e22c8253161767f38908f4642c79d27a1679e06c309682d932ff3c08ceea7f742a34c2889447d5a77241726f7753163f1d660ef64f05d5fe65779d8a562b2c1b295ae949ade737c06a8a0189d72d968bce96b8513c47ef0d1da224dda8516a4ec6e51f1fc9bd34475b2ac938b4d0fd661150040361247a0d41caf68b2a24e314e91f8b90509375432c6af1077705f1d8cedb1a9625631b07b9353e1c466c3c757a4e5626aa2fa1bcc592a27b86921aeaed802392efce7c026d2b221663f0207962bba769405961ba0eea031e4a3f22a35687477d292b450645f6ca03e879352987aea7e078db5d46efb93d772bd6ae0cf138ade13a431e1c29dd5f6a3fcf238cd26e7e13bb7c3c675049770e921d692ba7da7e458adead4a012709d4cfba93aa2b45538a7203a72619e0da6ce5def80a5eb7e13281c49d9ab51defc800022d8c7b794ece0339458932c78e188ddf06b1ff15ff2f87bc94142d073ace3a6e9839a8539966d8e6bf9b8346ba9af3e93926733d00c4048f3abf512d116ee5c77db99c1b59da57d2bc61f4a4867b7ec33973a0770b79600539a30ad69d3169d583153d19b9b3eac4e5e56e2b1b429537afa0700b48d703e636c83e4b069e2f6053547595df78f885e22ed721a177a20b43b3ca40e06555fadc37d6d5733e9d30947e2bd6f3b1e9de5a4419cf3fa30c089cb6955ffbabbf09d0f7bbba0c971c0cef9c47251ee62494f5301a7d1e4d3bf663b0bbb0c032a7dabd10d342fb3315be0cb5b0ca87a013725cf9c47366fd979d3faa237b58817636498b08b7659aee0c92d1500d58661d3f37a7fdf83e3b88c4d9abb508eb2195e51c6f415f755211bf2af80e35b6c1aac22d43af55ce907635d8bb599ea0986aafdfc4668450e5e49f7b33d28ccb3822c4e7d3c1d33f83c9b6e5e2f7879f705f5c3a925e6c21dbd1732e898458bf53ee0d0d621bb8b99de910a82977091130dbb3d4e2135f0eba3e05ea030de2ba9a746546f5a54c63643e0bc897c16d1e61467d56bb6ca73f0c951b58a85372e3961d943a9647d96662316eee35befbed8a07826726518bdd583d7e1f803f5062ce5161924ce9a5ea1f2803c10a54faa733888ab02aaa5210279ef6e893b9c360ca7996f62073f916228c90ea1e6cb473e5305dd9cf5f45ff00204a5beaaa140513fbf90d18cd1d12f3c6de1079ef6f7a2667c2891d59acd36b2b441f8cf88c78304153803fdf59071a3cb5dc24c374e3819583681d7ecfb3f027aadd818d71e2a9b16bf69a92f51d1f58dcf626d20bd77b22661fd6b7f5c8187c453cd24f0b6a07b50b1833cc387b8b811d0587027b7e9e77345650ed673a6a92dde58628a439d1b4f98e11766c4ae61e3eb14f3d0eff71fab4b494066e306fd23a7fa5ff82768f16feff3c79d7b1b69908a4876a0a837c14b0e2a9ec50d2ada223b338bbee4aca42e214bdbbc1d9855943833771b831482dee8897855549ae6b6129454630dd08a26d749b2674e9dac6b7f9653a60325cae384d67bbc7bdfa96bd88d7879056d49d67c7dea1370a3e482bac1bac4aad40fd54d92074ec551789fc79f36656ddb39b97b78f1351643847694460b1bdcb7d840ad5ca9a0e3a8faee9a3a3cbc99c2f04c6eab4660b1e502b376a3d3003b49aaa24e96e147394ea6c4bafee9e32b8cf41bc085881ad610e5c5ec6b812628f1fd668bc13ca638aae2ae944ddc7d95c1bb841ba804c7f54fb43a6ffdc3d23849572a0f7c1a4284465528c0b762f06ae9cd21da836afc8209e46d6bdae9a8dbd83e59241808a09eb964bfcabc3bc01d6d9f717798192d2ec7fceb8aa3811ea5f7197074359644da7ca7d01cdcc5711fd5b90f9d56adde3e12744126c818b8095e7f0c6a5531a3d9f8850631998e9804ba8038966f77844271d0eadab91ee99856e58990e779421fc582ce9362f5894e74aba90d1324b3de5e996511071247b578d374626ccbb41e5c2795dcd998e96fac91bd5c1233f15431442c54228136e34cdf596965a75e4834f9f8585de71cdabab9022dcd13a166a257cd3eabea5bc44b5fa510629ab53fe8606290707eb83237a803dca44258682a4ab41b03cc0abaecdae3f1d4246d77df01613fb1ce3fe89bd53ef3484e9aeb21a36d83ba94e859b9d7a2784ac2cb62813380a0723408806fd7000c29a6cd6230e8760340d -MD = 6be720da8b47b9ff169100d51bc971bc9cf9968cfd305c6bc4b34f9fb233b3dfd4dd0eb59def8f329fb60a32be902dc8aa3aeeb8dd7c1896d0e0bc30ac1a007e - -Len = 57256 -Msg = 3a37e46306ac3e6aee3cf25d279bf920946f6c383af99a8af4f8576567ca97c339d53bcc7e252a9c7356a4466fb5d31916a2a322d039d4f17a314ea05b03b412594f3b796c7cbd1b54a00955879f7ee06e96d853d07a49e98ffccc8592b0b6f3026f8d71b9fa1e6ef7dfca9157a121fd0213b2d4230520f99b22791bf519c4ef9cfbd9bc4be4761dc6de8e03c802e4f93ce1d9acaf2282aa066cfe6a6c86078d8fbcc6630c85ecb12764feb1c00cf05b83c7f6e35e189783389f037ae03ea655437afd6de324a9b18438c2a528056dab3e8eb1821731860c99862f54378acacf21fd26e2b708d4a5442381e7e9368372d7feb18fc1b378cd92e82bff5bb29b848f0ce8cb727a9615cfede37de9e75836b5df9f1546e7944f898c9e8332fe40fbf671eb2ffbc2178a8d5e92711260178240f922198d150319e73b31e9a6b5e2bcbff2d8163a287e8ce63d33cb4be8e6dbe014e3a57e85ecb315bd8c389e21a8505058578817f4f4a1425471917bc8edcbfdf789c0017e78a679da56780188bb3e136a0f8e7a6da0530969f1cd8c4956d9ff6bbd73fe4acf797d5a38b1b933420e6ef2a92f4bdcab29a3455e8665b1468e4e3827c55d2f18b48804d9ecad6a6649cbb6cc7472893cab78b05ec5ee48e77052266ebe06767ce001a1e231c5754f7691802163d7bc7c62f07299910f58610974fc3b66e266228452f9fa86e99b241d2816500763bd92d57452b9f2b027dce11a8435c6d7493228e2d4caf501250ec6f8400065fcd3a78d6a1963f0b9fe7f7eae8405e5ce65d65419faf985f55b34fa69c8d9878b48e3103c8f41941225726a96c552cbb00434915f33303ead85bf40e3758574f9626de8507cfbe5a4e4de2d3c0fc581636c74661c46172912ebd621ce0ea9342c6a6e9c10a839eb5583eb4d062a060ed1e5bf5cb8fc554d0ad5a224925cf0d00ea70db5e3dba2af0e49c0545eddbc7ae0b93dfa9b1d93b37e8a4ad19727ff4f866373ba30dcde38b88086caabf18fce7a2e15c82e7178615753f7b0453681b97be4c7336174968f396e6435542f2911868e704ed7bfad617b78d14a05531c16d77432a9dd6b72ba7b5b831fc35c2f4bec1f7515ffd1d9bbd441ff263d44786f8159dca30c8919c364910a0f5f434c84942a4da40f6da57549f5aacc57d23ecb61dbeca9569534b1de57228e90ab26c566f61f836d5cb999c1def9c5b9c516335f448b4323596a8dd0f4f323be5b65154acd143b8365bc2e26421598cde5a7ae63dae0fadb9b645e21b1a456511cb27d28f55453b852573d5f6a25cdf9fa9a4455e71455e624c92cbbd65eafb1b6b504e8b7065373ea31cd549e52eda7cb96fd1db14eddacbc420085ab48b747f115b2725b52c31ef4f3e6ed26c47f3e2144e2a381b718962a77e167778bf579957a8fae29612c203944901249a20b26c44cfad09e77900a380fd749844ef1b0698ea484695b16e181cdd4ab501419c67c554e8a52b5cd71acb3ea1318ba345536f6f8dd626807c99335b9a0834432881107e4bae39955344f0a23ad7cf745cec45d939f5dae8940392548d92a57ddd34a0cc6499a4cb2b9e9bd8900f82cac85db697eb4a25823ae3945883e8d78a310f009fc1dbff66c6a427324f2d381f2e043c2c002798c5e7b5c3c81b8f4cd0ba5cba98c209abe09ae21d5fd6c571f9e49c31161732a72c00f6ab33b2da67e9dfba391803872cd13ec508a1b57ca2e382725fe6aeefc34d3d22b51bf87ecb4e17a406cdf4f914b128e953b879975d549e22f30e25a39f71f2d67bf14ac0e97608a6ae0b24c3d5f8cfbb990471ca03d58e2aa50d1a127e62b86e5a44286544ea194e8950017bf310b9b843065c6938eed8e5d0540aa0e267f466ea952fb05022cfe8335d1985fea16d6bdc4e88195ef905012f8355d38e2a3d6ca764bf56bda8a3203652eb764b236142ef3d934ef88ca8f8fd1bba2ec40209cc1b2355bccff429630cf1d5c18b0f1bd9d663fc7ea8222b49d37d76171687c021a0518157198dc94d11ba96fc10dd239d3c52221cc05212504d293821083426f9f19fd0aa2cee193b0f1d7d8a8f05ef098b78b2cdd384d4b8c4bf6ed11b9f74b1693eb24a7c9d8fb93f7b17f15821f4bb3e480cf6744318efd4a088bbc3125fd481eeb4ac7b0493343d83e4c4feb9cb0eef50cf2b05152571e76d242581453effd6004644babbca5883a8628a0525d880f92347d01863a0cb8785bfb2f890a88fd013e5b7be4bab829c692f94edfeb3cdf620259a20b701793f7ac9f87b9d1300faaa1159f80cad4f02369a9a2bccd32260e7d6cdb097cde779ccb14a9cc304ffd03367bffaa7561a3f9131ee40e8bd4ac3dad9ff4a8e7cb2c0fc244dde9af4d8db30475e38842c70bf299425c00ae8938989bdb340f374479f799156b38d793886313ec9242b96ff0b402fb52b7bdb894c74e06e567f7b328fd56719ae22f87b5ba6cc6550162bf1ae756330d5e40cb8671ce094dd7ac7fffc8033fb30f4092de6116ed74edc62050349ed1d61bbf29d73e24cdb488e010c701a767fee6901dc9ff1947372d6cfb5c43e1bdf516c33a4fd8573964a11ace474f4bd0c390a98e3f3d7ebee5eadcb604bb27dfb279d366b5e46f34a44be321495bf6644a35134e08c34c39c84b9fbb1144781f54697815d30d75a8bbaec27193ccb00adafb54c6ec388b9f26793c704a88dd65251039af6ff8707cf2f13f26ef4b81aabd0df65db34444da489b3b3f792c5d996b969e9c52506898913de2a82380722d3991817a24907ed176da258f64db01a36f232f4444bb66e4e0b9345ff7128a7997b07b8709c4416cf85e81c7d43bd06b79dd75100ce17048268ebcb435aad2771f916eeb28889593154ed75191f4d2d9d1eff766746c91acade3020da3ef500f185de10e4982832e16d2b09463af0fd6be7f3daf4201cef8bbe18fd30b8a0e2acc3b5d58365d1225431492f81214904889b6d0543f4a311499afea6f332214ae81546931b6bf4b60e43908e565ca5c197bbb37bb33efc1e88f779b47e360688580cf8d01905134c8416c97c3267a7b2fdab7fa4ee698865ce45e2bc5e5ec149511d551308dbad843a2d3c9fa1bcbf674eed1a2741fec8959e28e2150006d20c87b8e3e2675a23cba4e9625f20d66d4ce0132b694a893d1c5cf2f054ffb8b92040821db4b10b36a168ede3314c3f21d275901be184736668af468602c9fef7433feb7b0082593693daad37cc60718d9663f674367c57d518e9962b94eb441cd3ca67746c37eea4119ea9c87719f801173fb8ccce9e90f99bb0645981d0228a607488a24e5e161fb919562dc7e54d1cd36d597e1067d9546f782388501504d067c2c17d3d7179f9d8cf54c0453eeb3139715b00a2647b6612c566309626758f5839947d900e84d32f45083865a35d0ed7e0201d0b1111bf141cbefaba810f07c04d942c0c71b13bfb0ef2eeafaf1cd62d3e5afba0fa16bfe1e2704f43b11bda1e7322f0f967a984ea81a76b99ae9557a7e06e551a8bf4f91abb2c96b8432696e14ed364fd4cb85e6c419837aa4e60e3e67adc91be5356fb0d0b66798e93d99eb73518107e8d78190ec337cb57fb0a0b5762283a22cca726675790603d3f8f71feda835bf3c66355308b189f3930fb4e894ac3c6ee64501b88244cc35ab2d2b1268387d003740493700dbd4ba48cbf2dda7951c057c6fc3b0df5fe4b5d7a2ddcccd4b7f50412c6444bcf9829506ab019e98234af1541061557412740bc120b4560527633ac2f32e832453be0935788a33509fefbad8f082af29a5a5c0cf6e58b7f7145243225d51fb2131aea03dfa34a2b65132e66fd6cfc7e75f9e5b6b5672f78a5c74f5ca3272b499da7ae186f9a8f5b1803cff808befa4948a8864fc9eaa1fa846f0d7203a3cb776974b54783d8d342b75348d75d88b4e1a6c8a63ea0fa7353819ee718d3d540b9eb049827c8d8c650b794316b5834bce5f4dcde19c711244211e984c7a0265b8fb6d9bf2f8b34d9239d29124a854d62b4d7778667c8c92514d9d14ef4d5215c773156a2c567577c29cc8453eb615d56dcb31b478f127d066a3dd8ae270f50c3ff0f2ddb9fc9cb2fe1ea588ed478cef9dc0c2a9a1630c738a0b2823ae49b3f328594a1d2054f0a84da6af81b7c382cdc216737e683a0124c66dc406da4254728b966651e9c438feb71d30592792c017e4b48c5c55dfcf8b21b1fa5deec19f306f8e8ea29db63e5f44696e37c21c0b740b82556af1b83e4fa3c0124d73305dd6dc2b0a38c391c871fd73b24412ca2e8c406815d1c32e151954805400f0f6560bda54213ae3bd9fdce92343a79e02ef088a4e16b854aa1e903dda089eed7b527872f11cd086a28b4910626b89ee2d1890f21c9e482a921f5d65b6754ef22719c5abeb432433a853607b1670128bb46fcb7fbaf6a8cf4fe127d4fde439886272998e28de5b7237c1c831289b69fcfdbd6239106602cb4a2c9793959d873694279c219135a0cbb79b2a3a8134b7c972c9fc2807357ba4eac755a968e85f8525fe776e0e9019c790aa2d9f0783237b7a5d425585ad3de4967c081e5d0de9fc7dc0d27d8836eeed2ab67a67a4cfd6997c3fdcc773147012b81158fb5b534f2304355454e57048c5ed87b89a3f62f8abe2387186bab33bb7b74fef474c04b6822324a6fd0f864fd842e49041c082b0391310a99b40d2c75afbfe720a176648a240567080ecc02aad8f96aa630e7826cc778f2e0defb93c83ece68c4ca4c22d0ac59459e3666502cd3d66ad08138c83eb767da5e4aeafc1bbf2cee316db5f8d4218a4093064bffebeb5194238b605ef1f78a1b92964fd7e8875801f6fa4878fd3a34e296fcd14470a5e7a10fcdf2d91efe5c410e3fbec9c75ddc2e960e7805b44cc5c61a68bad04389f50c05b764a92e325ae521a5ac24307925de9f08c931a1dfd9458df85d25ed1e262f95e64a51983a02728d669c79ac8fc19c6277b08f4e79dc0b721a3cb7d5c8e79640c8f864f58bff73a201045ca3f83bd280d9c27102814a62575cddf88610b5da86de0345ce9e8e52fff3782faf49013b9abd737976bc90f4be1eb57a769c0d66e893ff967be84bbaf7cc6c7537089e11e081582b03526c2d070e57b04fb17ac5e69951b9860fc3f649ea55cfd3ad8f0022c3c4e841092895e27a393c49f77a61f14c8e31856b63af36dbd891fdae3080b2036e43b83752a9a100ee712dd488e5a92c2990f281c7307f1f496e2d914f0e1ebe98cfc17386e2e320cbf143ef32ab6ec6985a55f95b4463333ca6dbed2722d953f8eef52411dc2958662f249de43dc29a7ef008288c3583a636fe911845497271f313dbff9fffd426519d58772a07351631e4b195f69e60e6acb7d5b945fc6a870be0ee3c8db88408f2ce57e170b246d855bacad816e98b832265222695b63201c7d8948177b0a97eee349b8364a9783f4ee4bc5569a153fa1ca8ff16b1015980ab6d7754ca52c5069852abd3526739e9a1f51e946b506aba1fe5d4d0246851622b11ff2d1229672e75caf137e6761c35e36e6a1b98612051909e4c096c45ba54cb58a480cbaef0552ae014477d508fc287a317617d6e254f0344bd18f533e4a700c40fe6734e01291c447d88a371150e0345befc86d1da010c7bb0955bbd60f76fc689c485a109f8ce6aa551e5723c86fac8b9534136cf1600a5bee50c4ccfb46ce2baa19f228b72b5c52459afbe76abb2aeaeec4907750c844540ae935c816c9cab0b141c5cf5f566d662f68ec0440adf6a084deabe5c430bfcde586d87169e5372039289baea1f5620e9ceff223522d57d4dfec2d5f5680c1ef05917370fb835fa2c8363c6c84f083741397d4eca62497af8554df8c0da093e1f470cf6cd58c885fe8d36fb2102f18bd1cc85c064678fc5800808615f1797dcc3a8db40efde6fb7e2067fd284e9a69143fea501a3a13cff7d8d6eda10af1c6d85d4eeafe7d7b0028f85aaf75451abe9f056579cf88db57b693c0dbd961f1b82ce71d38e35d31de85f9144b42fe955e86f5a29fce3abadebbbba41764fd6299f160616766a3f2dfbcaafe99367ff492f298078abf5897aa2ed7ec6aece62ab24e4e813f2e59a549f6947e63fad220a20b74fd0148e859043870ff9c1625334b6c3be788e48632655a3dfd6f35ff00d6f813edce14f4ea34010d45758cc163ac73aefa0a2f33807b112fe486900c7b75e2fd3db7c9833182b03626bdf6c2a41c8a30228db86779d342f29970b3037bc9f0b85785109e16366d740a3bfb31dde5d948c7d8262a04b4160c86f545ebe7184bcea100904c8197624d59b84415f64d897e51b422840968b50711ddefcda6ab1ac785eff2955aeeb44b7bfc7976d69dc25a29e9547e7135466ba4ef58b0a2ca8629691bdd8189838ef6d9cf415c671cab65b53f631f2264f1bea6f4289cc2bdb77eb74dfa19f79e16d5d9f944d090146d265e7ef870053ce08a7fb5099aeecbd44dd64bf1648a877470e4412bd939cb2f258c6dba770207385696f7a1b00e3d051f2edd696a2b85d14f63709e804a8a1aeba8d5523e020b24ab558598e90b5b747b27cd0a34c3e255fbbc4e44ccac9956ff187e67cdeb92ca102326974acb6d46e929e27dc938e427fb59a3c6c545400ae94630a22aa7e2520d68a146dd37bba6f19ce36a3274d470d7a037cb73fec75f3298b3ab5f1c43e52a8dbf4ca9378dba1ce89978755dfa5718fbd2fcdfc0757c6178ce297434ffabf0f84852b6b42aaaf175cc509cdd9d0545d13b0110719489fe4d4bc46fd55dcbe61204ff0d94db9ff9ac439aaedb06a1e6893b810efa6ab0927ff0255ae9a46d9543bafcb5c1e8c1baf3c8fdb43e7e54838d9a25e2444017a47686f43c571dbb83f434f0b6219937beb32121b5f04b46a544209493365de6bc99d4d81e0710da3a8b3884199e352a8d5517afb9d8b59ed316947629b70b466252a47a07e1c4f542728f60e51f06c1ad3f724fc9de0685966bc075adb1905f1f09bc82ffcd8332210f012b228b5225a8dbfaa8ebea842275ab6a37260b35587a24e5970fb393b961cc558dd8cc627d0690776329e4799ef83e5b649cad4259fc0ce7613d7b3db38910553010c97ef24dc5b0278bb42b20a78d5ba5177fff8c2b298a8a930dc9482242c7b9d26aeeac07e46e9d1843e3d10bfe32a2a068b31792e396b719517f9fb3cc74d32497f9d2bb54796dd877e8d8abfaa7023e53a822b6a3d292d630a7e1c41524241038e88cf27d993ed339845e0fea836dfa2524d621cf07c3d2908835de859e549d35030433c796b81272fd8bc0348e8ddbc7705a5ad1fdf2155b6bc48884ac0cd376925f069a37849c089c8645429007e921d4d7e90f7cc6a87798b64a7a14f4bbe4ddc8f35e454a79e5a978267a51862c1b977557f34ce792ce5732accf9fb35c652c65837b89b1b2ef6c88ec4698b0ad9e035b2ae334fedb46f06037eb15f2bfe2c65e3d59c8624e102cdf1e0d2f2d73905eb2ed49feb38cc9aa6972373e58ea44f4dcaa60cd05552f33a44436dca686dbf1a1258c70adab3ecf75e519e28ee771fe0750f95f41d033c700e72b68c3ef6504515c145395438ca5ab19fac83bbe532c06b98a45bec606311b8e539b2bb518dfea19496e12599d75349543b90875d1c5026d7d48253f8fb91cc1163c87e0dac993e5938bcdf7588638e15a7d9c16d21322f238301e43b6a62c08dc157e79950c74475a706d24a522de86a9dca1a8405c8fd225c550db634272ec0decb98630eeb6c706e69be96c8f4e0b969ebc3402e97095aace640e7ed317f4118adf1293b881edffb5ff4d9516b1f88b8a97c10002eec1311501e5efa242a951b79922a6b1fc42ada5405809ff2fd6ef69da5722ef31e02160d0669ef71c91333a8fc05123504d797e0712ae92ef2c2a032dfe50f76079e278799b741acd3620dd68f37c54a496c907fb846d171a82a42036bf7263a315dc25a38c57527c208166cdc40f8d21a60609c5b52fd5d761c488a0a1707b243b772ef64030e851d5bc9e6539f216ef04994d0cadda154f4ff40211ad328708731b5d1cbfe82475df3b4dd95d0d373538e8987975571fa9d69c5831eaa0cf7a463078ba11654e10c6643bd03548381ccb5db5b4148f3b0e7e2250aa60a39ba03a1e487b3f91ae4910a12ff3cb8c60cb445f6a649269b1a6ceefb321172132a2d94d95044f538c494759f3ea26bff96a2b558131f8ccc8984e6b48411803dda9ab2527004c922f38f2f34d5c4ecb492309a9c0c54da2c90d86fed9af6a32e4dd370fc5153b38e03d9ad906f14c96991c65c2f0c599d2fc2cff112c1615958f65057139eb262ce780c672e652270a307dc708d9dce444a91e400a0b1c221325699db4492b14568c2afe26b427e70e586fb7e342b037e0180ad1533c699896f0138841be7d0e9e1763cb5d3a179589571abebbf4e9998e91193b5287a67f0536894d7f5f881beccf52b37f3ecb376576a563f8b83013365b730571b67bdf4740f374d5f6f54328fd2040f489ebd889fd382f02542dacc0bf3fb7178f8fc146567a85ad496b8e3ae9f4fa25e31e7ddd34fda94290876c1405a6daabdc8b2ce9c046096e2293050adbf76878130c30496219591e36e65b1a75cff59763162918c57e887f4715af811b511256e35ef8b5d1b7c7ff0cf482bb56e29042edd9bfbbae4a884a80989585f029802819bcde09c7fd7c4edc56e8ddf2093314417cf6bbc3d3933697c4bdffa4a73b547ecde82d8d13ff716cb795698f6a677529a6d6fe4c4130ab524331d87df5ca44da3a20096b22d8d284bd9248762db3cd6bff686d91bce8117bbaf9f6c438b55ef5aa8e86a85290d7ee10e660ef7ba084d030b3f0da6b41d1d8d41b43c09b850c96c6398a8ecaaeea7159999b417cb50220e1bf706e76c5513237a1a6bb43c1b5873629fe63b3ba72d440b4e0b6577ab023b995d39606fcfa508b9206fb5bf1c08ea166cb70343cd7e06c3e16943577f4a0613c039a436d34fc79f74dc9099d9774b0f9d7fd76bd805d863f27243d35376181bce6c254a068fca8d7626d754ea1000ae90c52a1c5d71335c0faae983be22cc01e6655611dfc19c23a2d2fc98b46fc573e51b6dcda43c922c7777a6d115bcac6696a9d946d5a1b6c2996572addee2e41008d734f862c49f55f86cfe5400c033ca5d9e01317e8ca50aa852cc2cb01606e38aacf2350fa59558d0ff7284f5b9ecadb9d6706a310ee16c8e2f7b9dde75886ee8f1380c016c2ea5bfa385dc6b26517129d7a9699394e66889500379b09df322824868d5fe64b5dd02fdbac2e781ecc52c161ea82cab3e6f4868f638ecdbc1af0517273b4d3be56f497273e0d159290a3f1632ce62de541139eec653d9cb9e54dfe1d594846e27cd018663beef1890c0e15c9814bc9ac1dedc35f6630df9c3b4813d068a1a57e786b9bdecb5674cbe89a15dc133b06d0238bde2f8ef0fc2ec6e778d3c849595bf1ce09d914cf061fcb50d9e10a3d4c18faf4d8a504045d372b34166ea0c8cb4190ff489d41e00f4e5d364a238eda034d4a309709f1f4687f1537d3e918a462f7fd0842727812f72147574ee9c5989337bd4805a37c4987cd2af7988b5a678547dff0dda2e1eb265d31b8ce7ada02659ef94309bace8a21ea127c4e9e8b989ef7dfc00374a6f504cdc263b31ff39ddf4aa6298a970e3f9d9f76cedb68d6c014d0a47f9b2fecb8fa38a35fe32039f36a036d03728365f165b2fef6293261664f9ad7358d1cdebb6e657cb448c5d38b6f90f6d8a8c4fb27e0eb51fb1e435412b71d1febc183a186c91df46bc956e9ed54bae8b014a2f769761418e5a4e5d84db42025a81eac60a17428b38a4d1aa5a28349eb939e67813f8ff3fabca25e159dae6d90748ede4195d54e621cbe5a2d316205a98a2e59c3329352a089fff7328d0dca0957f9626ce85657a926035ea9225bb5c79cacc2e2c9eaf7b154a5f857a23900385a45810a255e0a2fb2046e42fed423f0d200e8098dfdaad6237ba9ae669ad7c4845b8043d154309dc7a9d21f4b3715ca3212145e043235b70069515c60981656de23 -MD = 2e232557233b61c0aba3bf10b0cbbfb953974c8931e639b6efafbac76320ddd47100ab406ce17e216463658ec43bf0ec8acc2bc3d076ce08283477c5f6149ff2 - -Len = 58048 -Msg = 0728c948567a5850603cb2a1917ac5406ff16c6ad071441d4a85bbdaec5669aa2bcda45f1ff84e1cf0aff2178b770f9e99a6b458b1c84dcecc42bd29fa35ad3d54a523c732db56f39e07c122082a76e93b33b55d8f68bd8e6008e251c02fe04369f96f0af5ea17de528e4649705ca02a3ce09600d21a3a65ee2151d9a40baac15211afafd2ef3ae4f48aaa142bd5356986f580cae2a46c5c5fd333491093b5c1f7350c3f30b0660e6c44140ba15ddeac00ba9a4128cefd7a9967b02a6b8da64a40adae4177f74463a204adb73abc43fd92770def0a6292c88525ef031dc2286515c0bc3d0e8a7ceb7e129c9f5fb90b632473005cf126d64c0b54195c8efae1195eb85ebc5f31b5aee9b50a4b761edee79ef79c0e46e46e10143d55bd26fd796e03dbbe45d1b697b5c9361f44e9b1668fe84b088f6f62051c8629ccaf4d92996cec720160cce0cc0708dd02111e3b4865ebb76d67d66941764b5ea6b96b83e91c01c45295b876f9ac8cf2dc3a7f832f718d83f31ce1c0ca2849250a64e89610852b1bd76dfe41c9ad3fbdd4487253c1bab7f6c138fa31493a6ac520372c94b7af50bdb86f0409e111078613c26171a64852590043888266b2948811ba9f4485a359f31e243395ece0ce94c130b3a6872344f4d7c3f37cc89ab1b40575a97023682f053112f3af90227b30051ad0ba0c54770f6f42a2e718f9a89223f1b3de3806b83b18c3ad1d75e0f6a207092075dce2d1f2f047ff8bfdd8616a94b523576d86deddfcbfc7a844222732f0850b9fa0d53ce5815b712f203ec484804963a36aef8832048cab18a5eef628e814f9ffff359f2f4a05609d2833b9270e36d98ad6499e8359b4bf353f4e4bcb1640525ea20be11974cd349bbec0289c6603efd4599d071822bf6dc7bb490e64a3907e84305eeceb273b56f28aebf92cb1380c489cf2ad3988331c95c0e7273bb68ce5395237a7ed8ad82c6a33be141c175e97b04750772eb39a3368f7317e9878bdef45b09dfa66c62b1fca624161b7bffcfad202bf4d3eca7b1c08082efbc311aa056ff198cda002bc98dcbe7bc944d29a9c76734817b3f55f3e3d9ae78703a8dc8d80be3008e16714fd66f074320a77c0e56645f2bdd35ecd01cf556208a265d9f141be6e94721dbab7319f348652d7f73d691ec628e72a4dcd85e3a968e6712b97779a59579b4b362f0574c4ab6419c60c46a7ca3e3684670a28e9c48d18f459e9edf9fa3aa31a11cca9172b8b8867b6bac68708e80a92a4208012b9617f15ec4d6a845725d4b1d2f5e72f710c06e64eafb166880fa97c8b78550392ca65fd6b2db5e37a017439011485649f1825c01654cfee51995c6ba5786f6757b210d45ef097bd6bb4ccd927904c60bb962f1d960fe7c56a706b87788996e40e00c9c14efed8ba302824bacbd104c8d06d6a245749c393de7a1ef78e149122c19cd8ecc2bf4083d343c403753f7547e3871ffee06b2901b2a1bde46f7f29ca776d857e429b96c05ceff3ddad426683fecb95d2b9dbe2b6f0cb8f75a1332684395d189f56faa418d113fa70fc42a124282116c96b03b65ba0e2ddd3ae9950f70e53d876874430343c9721e3e9a7ecd36a71e80b7d4a6c98c8cdef251e186eccfe380f2c5ce103bca462b05efdd91038cba354bf7717ce1472740d9477174aab11f203e85e39e557125eef0bbe40d5fa53a0a20ee2d4a278a5bf7f484300aa3a506afcd313b49ead8d722610b64402c10a4e1a1f44e8b16b6a968c68093a5724c288441505bbf5671d869c956d4e6137f996041b28bbc396c8e17e1c522d190f6f3522d5bcb4b32dca839ac36ac4b8022760a72913b5a0a1c7889b8ea541b7a46057dd3bbf09a0a69d4f68c13510d0ca9c954c728f3e0f336f732ce38adefb8a9cd7be719620847b9dd34eb856987138611b3b1d23bed9f4c98b7846896cab692b9e0d9cc9632754d3f794d055c662f37ddcbc53589dc68edcb6c9dd2b5390eb169312e7e03851d745a48130bb016da4f8bf173cb4439ea6b0dd65d0f7fb72b6649d14786409c9affdc05e0110b058f3dbab93ffc11829e74ee9954876cd19721da65d77dd3d58820334736ada3dec872d8a79c507852ff6bdc0a16d2e2f4cc84a95330dd13cc6f95de90894a30ff109f64311b50df0777e054cd166a98ad55ff252df62ca6edbbb15c665a7f28e2f203ebea3f85bc2ca252f736d5c6f477ae11dc4a89d4f3b5e7133b2d2ca50226e750ee377b57964f093421fbc7606cc04f3d3d5d8e6e90b19c2bd979625443375b06d9ad515f03cb171463707ddf8833a3f1d6cb6671e46d257bd5cfae156290d7864cb044046b4d56744a396b8cdd2e66d02718945795452d73ae946260e6cfe75fa5e4d5d0633231c424bb1300b23ce258bcd9aab7f9d61eb3d26c21bf5641050373bf894b52064394b17a06d3cddbb0ebf6631bfba8ac63bcdfbb5e9927a0ab1234a4d0fdde5606564efaa96e76876d0a62595a9b1814b6ef25069b76d14b63fc77493f305e9df4997bb19d3952cc41448f21092ecebb62cb40d24ae0f9cdaa32a9f146bb694a98deb63334ecd917082aeb6e8a2f431d01f1c1a2ff6ff783f8554b4169c774e85d869cf412c17ff40c1df57660050b961ed315fd2b6c512ad8b4e9ce2b1d07f3dd217e78a98fbdefe7ae3bfd2d588ed313efcc45417ead0ec601f3dc0d0498f9724ff9458b802967054c3d47448253407bb8332ff40f51cc3aacf81f7226be75c7629bcf1b4b38f5ff886809382aef5ad0bd08f19596e5dfb12674fd1cebded546f9b489eb59731920d34aa79aaab9ae9d7ebc5eb8cdefa5c3fee8e94fcc80a46b85f21a7e334e5d33cd63a6ce9a48a84c7dababdffcc5daeda6c2889d612a6fbf97d2d54651511e82d7217b567222d4682a758d7dac0edb98aea04f881252a3cd9fb56ed64bf1f9a87132b9c4bacebf6b15a858046421245f86e0a292889fccf00e383b907bc75b1f2be5d68becb2c5efbf92b016bdb3419cb032263f1c4867c173d9c0177927df5187d9563e7065844098e31a27012bbfeacae34f004602f0dc60f880ddbcc9d2e9e57bbd3efe5d77182207fab7d7010bc437928168ae55e48b46331255cef3f232f55b801fdf011ad0fb8fd64bc7c991b376be61eabd97df78a407e912285ca9d717d72353ab06fbf585d931553bebfe3318c57508ec6f3e0efaf57985416a6640cd9d2b7cdac5771041729056abeeadbd8e561f35c3328cc8cb6a4841a283a40a971c0cedf6c3289bceea77d2a0583ccd57ded513ca9848209604d9b9d45f0f9f04b25c3987969d027ebf5c5ba1af07ecf5de4b057af6fcc0db23b2605f42f568871e7de1f5a620eee15fb2543859bb96f8b2c59d5cd517040b6546c7abe60201aebf0679d97870bb875a2e5edcfea455d11af94dd8b92374b7381b72329e91f4dbf26a639b93f8e2e11d04cdf7f47e940f753a897729ae9d6f1ab4d28bf331bcaf773e31c47f161f8f36ea3421d196ec04302df2c09d14e8839b877b208a6dc389bbe656dc9074abd2365323d31c89d86ffa37fc4d8a02d0a52927de98baa2940b1ef7555c8e81225a79b41f944bc3c3a321ed186686d5003441fa7f4d0a8cc8a43ed5bfccbfc81da89fa189edd5c1384e55b1d9b40a17d1c18493dfb5f068bbd58a25f895aab5e81d169ff538512ec0a1f41ab2be9a57dfdd5f68628c12e2f81f9f5c925fd5d73c585cf3d40c3468d77e8bac25de9e0184d8310cba17d8680802dcee0f73d7a864baf161b8e1f5ebf7148aeab59cab915b52b7e548e1b78455ffc15ed28a16a60be5625e16521c34aa04803af48139a3edcd3286918236b48c96eb238dfb295c9c483e4d7ec52ddf6aeefa214524dea596b86f652671ec74f648c8e0945f66488053d3b444c39148b404673229eff102f0949d056a294f323d85d8fa882f73d672b8c1272ac5fd1d001535e2355b176885f269ebff10b598ccee99e5cbd3d892cdb7851a7354a7a8e96204c5d9eec832c142448d37d0d6051ee39a46f1e4eb1a0bf0ae02c0f84798daab52319a2369fe2d14bb6db6e21703cdf548727ceb41b8b7f49a74961953495e318cd9f881a32733ea4d11eecd0f1134a4231cdf5f731b5c33e8f455303156ee9533037791da4a802367fe61ea04b9fd60c88a8ba9d5ae532ef7e6a0f5882df656e36299dc95e47c60aa9792c1be7a82cb976024630fde574665dfeba1be5b2ff6fc6bc1ba5c618312638203fc92bf6f351e221c138847b32ab154a7fd5a5ad5e60c73a1c3945e5ec9412237f318050d4ddb34e523b567014c48c96840d2a992b4823e9c70e44749e5c21ca13db4f7f7764d3d121c3db8bc1bbac2af14bdc3d0d30c11245ab298ef0844b5d234ffe4c83ee29f257577b96e2985c4def182363ad1f89fcbd985dfb8a167a23d916f77ca1849df91c809e571e618348a6fa67d1b21d63f1585e4983131995655bb7a0da782c172d97c4ac981e200b633d7b1050c53337373e8454ee3496846bd1ba632db1f07fd8f1ae0d1f89dcdbe6dc2386a88e67ed179692e50394942f7d64a8a73cf3d8bd4051c329b4089edb19ad7931a1b4c36dd98811668bdc1b7ee33b07d3d0e7ebbaade08d6921436df344d5057a03e04f9fc53e883e4fb33459e4806251b134315c69c693332de1510bae7f4fc795b9126c23dd7fd514c2e5a8ca583e88a783b28cbb2a5df09f8b520ba0d1e08120e814ba3a907e93a5b03853dbed25e07a7c7733ea34740940e879db62f33f116c145d73537d0ee0c926354260679ec1f1c687373f0e5fe4d8a1cd643c0ef4dd41e6f67db6ccb62447cce35da0ee3293d60aea8202dda6eb2f5d568c764a884f6706e6c2aba6ffc7e8494a8de5a867beefefa9fa7bccd2850cc51d3c57ce82cea51b35287a337031744672b875c0c8aa051ecb89f1006a193880295d28c36ac1c5cdeb996a9a91cab36a64c7995cdac0df3e5816aea4f6117c3783d53250c9928dc611fcc404eafb6c5e27a399a5276647f85988f8defed49e92318eba9e25a8c6abaf38d198042a69c9c332bdc2360503f4d5c918d60bca66383d6e0bd5096b3827cb37d67f66c17054415e4ddb8f06dcd9d4c056b6a45b9ed2ae5f6c1cfa43aae06fe01ee098264aa7a80e901abbcf9a505e55f9a352ef0c078d48249b8298e57ea21bf0e423c3bf69002acfa541ca05007c704bc79cee7a80e1107c7b28d2b2aa6dd093b28efe9642519952a4a95ee49235f9924a0ac0aee5b2a1bce47459d70cd6e75074614199dca44561407cf201ad92d8175424cd70dd09e22cfdef961c4be8496f4f25f38edc001544a040f022fa99f6220b737e8a10edbb13ef20ef4b0fa8dc386d617b3eed6ef142ee80bf10205439fa9a7e39c2276614bbe190cd2a022089f2f69d4371b5f5c1a54fc1c793c8cb8ae927cd67e2ca7cd56afcc59983ca5739e71261b2eedc9d6db3ed8d70729a05d235dbe971b0a038e7696849b91c0f55d25de736307f0b6edeb5f06b22773d0af727dd59bdf552a130004ca497bd7a233d9da0a325eaea71faf280e445685ae2e30756a5b57887bf9976d05c9930b2c863ef6331f9f820adaab4c37f410e98967c1d6d56c003e89b0a151efb293c604c2b9a58661571562ad741e4c47e31a02cacb04bf3455c1d3c6c235b09aea82cb87ce8a9cddf1d33f167e3093b659919af590a1704ae4ccdaba5e9b20c903dbd13401f7bebc0c4600944df5b6d5c0dac246d71fa12629ba0ee9faf498e36c3bc655e88f94a212d847a548001e1cc570195cf2e1ca4c911400f40bd48160a02d0b6be6b48716821484d810d231f1e3dbf096789a4424b765215725ad82d73c1a20f481093e8ff685489b1cdebb0b8888f891dc9ba74509181091ccf2159d9cada77e4be00384cca4f36ce097f1b0400181cd93888c3402b72f226654a25a4e31ff77abfb7e8b90fe15dbf0a07e8686c03ca831c33b6830cd0d877617b163dd51996f259e180acfeb3056c15aca04e95f79b03bee6d681fc41c4f90edeb60a67715c34d5a6888f606d36bd7595ca1d449d984166c7a9a3c36dbc93b3988c7463cf51287b2d89c9fdb7f89a70ecee3d3f9dc8265cfeb94f28fecb2d97d420e48fda7eb7929f0bc29d3754eb50d694164e9e3498e7b48eeef599f6b003b8fbc0b53beac7642394e2089851985b7d45103b48e2805011aee9f0e847023f6ca4719b9a9d4137e2ae910580f889da098893cd44dcc7e03ca3a6e293c50c9319a3600a9da00e5404e0375e9850a714a2e607cb3a2a53dc5ef58f924278b647e781f4c9effa1403b0b23cd98761d8536ee6d4fed1d20e8f9e2a0bca9c69e9a2fdc594a236b33d8b0ead083ff53305dd9810622eb2dedf4025cc8150499f8bed84f7aa5b1bd47036475803578ccf17fc46ec19228555ad361a635bedf2228571a3a09dbd4564954a833c96ebf13cf4f5a10362a4f14062baa67500693ffbc0738347d5905d6b9310e9df27c1cf828613d0dca37a9ea6e514f18cd88cd731233e4b74ba9c0af254d0a2cb20a3ccaab39dfbff456d358f1e8c222f4b1e63cc951924afb4a8f5ffbfd2d588e75790ba65da4cf5b1455e04f56a62e7c1e68ad5004b36812b7ec59dbc5dab9ce6a5c4bd8313e9454ecac00b52f5d83aa2adf5534b1da87187e423d133ba4c91835710b8f591fa7783c404af1d76adb2563b4b4e5ed7a30830a3b7a50c32dfef28331bb5a399a814bafad1f53e3508d7455835cf21c14ecc8e8328202f0b8d3c3c038ebb75761aa35a35d0e79d7a1230d8cc5bdc7c22d247094b1f4a858d7d02278d10d3536e7aaccb3da98c238df245755e6480574456010ac5432cf402d8c8509a4a0425cbedb774da03ecb6b5d19e86d8f9c09a6d0381f7b73dcd65b0c51721f1e456d3d39d4dbfd486103f3cd7c47100c1a62de6014f3aeab436c1e06d76015c85d145cfb2f513f2dbffa7682b3ea09f6539f8f777f33926516deedbf76d58a1d57e63065438d8fdaac1d482f694797c8c81e3e78df55e32bc7cd6e68c848f897e6416c2a99d77be9a5fb0d15f4f6661df87d7006dde10d89c6a5f4c54440cdc258b4449dcac56fa54e0229f8ff6cd140552ba883c36b6de994073537634386275fcd6e513edde7c804c1132ae11185ea7ea76c82583ba0d5c05f9451bdd7be213beb5db76e9770bc5ac67d4e328ae076d58f1084e4f832d8dc1d9686ac53e26aad9c7762f278a6ecb070bca56c4f7d7fea31590df217906d47dfb058c76e7f4e056f6fd632f7d6e3b65e55f306c5b9603d3c8a70182045fd7404763a878e0155d3c29b73d8abad3bdceddda99a9420b23f1f496dbf98c024112a5cce7518f51ca9348ede2bfa765f84bdb82b80214ff070480a6970e79b5b8fbfd86718b5e6fcf643ae87d56aeeb95e3c7a1b6ff393a5714541c5a493341e40437da6dadb43913b6e9ed34d8362f3b9f897dba281a84ba2a58434f33226e6f343b100340f8753f913c472fcca6f79385095eed061da5d84c74629b53af03fe94f1705dcb94ecfafd1b3c97ba680c45a0308e7720ab645a8590c0693140ca3c2a4142a0d6ef66ed036e16942ae336f8f5e4547ffe2d8ae8da94a6df563f89ce0014cdf7ea71abc0aa1d1b4da57f3c548e0ef72d2909df2955685c254912095f1e505a888e82821afb1194ebb2a4e8037297c0aa28a92bc6fdf42a64922312958adf317b4a8ab4a3fc30c895daba00aaa965f71e83733666da2158c4bad86c184ea79af9a6f10a04b7630174a4294df43c62e4b1c3d1c8b2f5d52d6c489bde917292dd2a2b1f49e5349385b0985a97863274ce896f2aa85255f9f285c4d331a8fc874135607d3ced7aa69e703eb3a60b9385ffd10fe59fed0276f036b7e72d04f66d0f42cd71aac5918691dc1f9d4129677cbdaf2c6c752b05326ca8a8419a4e672e907bfb645a158119a91ec2813288b741514b4d26f2b66517b1021f48402d58b1090671bf158452492d5bafc53fd18abc03cefa7bdd332a0c066da464e74ad0dec50bb7e8a3ba0dfc64be6fd331ace9d51a60bbd3004d5df8b211c0fd564cd79d0bb35649cc60ba1c976c8911cfc0db74e028199621aa05c5fe15fa7b56dc75d62225d548581e5f900f9085e9e3b668819b4f9b2c09f22a5a32a2db47afa2b371538abc4f0e9b06401150ecc2333598e494fccafe80ced49f96dfeac729459856e60a94c5b780b614e8d4450389e6748513582c724ee60c7c71f5af648b6e2d6e23cce4121b7478f4db451816ab71034c5f8b4bf13ae1d9d90d0bb2869fc4799f51f9349d022053c831cbee62617d4e22c2bcafe40d67449eb04a7c962bf084d2bab80dd0342b4f78338d4d4f75b25bed8214deb18f2254b3a3da94faf89956f0a432f512783e74ec29b4c045adba3497e8ba62c288b711002ee2821cce68f8df588f76cc9801cb0d5b67ccacd33ae1063cd6c37dc0d1836e988acf63750571891ef618645a1b5bc110cffbecaddd6824c692874cff16b3e32bfc0236b417c9d43d8f624387352cf19114d46d0448d3d7cd1438960c2ea8482d5da3ff544608aaff83dcd1e7f64786275ddf989f262a099b845dc2b0c26a86e7d83a251e3c37f2aafa0e764107b36618d2a5d3481d73a1760b7f3ab37a0283a1925010d79e5e94871b819b5e0f787bac9dad87c5d5b887a7d12565ddfd7729a3b66c274a178377de0fbca607b79fab2de37f1ddff800a376fdd7abf5f4d15f346a17d43e4db085f7fe470102a72fe0e1cfa4fb5e2b54dd2ab71e74c506190c9dd6d87f7ae8eca5190fab12178630011286a38b0a18bb1d0d29802813dc561a2724378ec79140bf8e6a6f4310fdabf606330434ab673d4b6578872fa81d90701779bc6aedf0b2bc9c381bfbb4b3a6a705fc505d08c0e24f7bcfbbf24c72cff6b800f07bb4ac4d828ca138a1ca512cfc59090e70eac9b3119754a3d7c6831c9451de5a29e46d16faa6cc4d9f1b7e42dd4983c6d4192db779012fc747e0f77e32293e83dd44dd170c31e2e25c6fe3f2321c9201f15d92f6700089afab6077feb88946f1fd9da257a1770a7f408d2743e31b5d452f7ea179dcdd8ae4690faaa30eb91e2ef3b764de9fbe6dadb33ff33ed88e0d1df6430147a7e159edebb539751d01efc2255accb5f04f32f31d4befe9f9bdc90eae755a68b7511f52971acb7ccba9e133fd4e81e37a7282dae67ac24e2fefbaa2bfdc56e5f678039cd70509c101f81b0be15a2c70276e85e976941575606d086091409bc54a9d2e5212409a4ba837c6d13b487565dd8d62a836618f647580dad08c69d1109d07c7fcaf912822a6af090e72de03c98615429f8ca9d925576e587b191fa1cfd6fff72218c1584fe5a50d49eee57fa4094f4c57e1339ac0ec7face89e29b309ddcde64db498d4d94b64f90a172490fe4e83a9579ec87b3b1efdfb9f8550aec69ab9bb04ebdd44c8c233f6da5565dfe03df98027293024a0d42e7029345c3a0ef50b9fd0255a4f2531592c3f106e1451bef8fa50ec333cf7f65c300d151500ead60ab938cad59ef77f1fc2c3b008d65ab9c93f594d986c466bcd66d38e42a86125ff32c44217d94696cde1ee9dfbcd0216b576cab6295b971dc9380409adda7cca3231fcf6e8a71a5dabb0473f0fa251bd02c82c8eacb1f1f39ace27ed1c3d42adebdf694c0fb07cbc005856ff0cfd4f96f85c053dea185dd58751c4a25879bbb6726392ad569d739b1600a343b985058ae15be02bab36e1abd7e964902937efce0ee6ff82831608e233d1b774dfe37a7f03ec42c0b7b3885dd3bd8e1f561fe7db099039315fc24279a0f319fb46bfb65ea838b564d53857d4c3f6cab7a9d8aac6a988c724b24a2949a58d513eb6bfc2101666c07fcf6d58f6efbba0c0e80b407837f731c14455c53889c7e8a7f78ea57c959fec796bf992ac9e3599a2dc5fb2d8fa040072dc8c1f2f96ca659dd0d267896f0bbfba72850ddf198c3cc54d7d07cd3cd8bb9e44973e1712be50870b341121ead1c3aaabb8d275a9e71191030c4741439aeaac421d2ad646cb32cf6e5baa2b501a80b1e03be858946ea16fc5b57a1b597316069fc6ec567a1791dcc2f03a8ee70d7d38d7b5576e224b73c55c20a943c48bc613223c8b7df6cdf816ce9aca34f8d342a559cf28a19da310fc91f4dca0cc09823b95240f350113ece55c026004ca9357622e3162d74ba1fe7d2ad9191cbb16d2e6be298165e411f7b132cf07 -MD = 3844eff6b7cc4eb3daab90181ccb8947842e8c702858e59089f96dd95600b866ae647f9cd9213d726b4fca636e6166a2088e2be0c27154c28732faf360e30e8a - -Len = 58840 -Msg = 7caec9d15fb000b65233a196a792aa486deec990e7d172e53d112e7770f8367093a1407a39a599822af874bc5a0d82e81b41c2d391769b2066fe2848c0bcd3e07085251b6dccdc8f807f3e3c402caeca41687d12897102e04312edf7b8c7d8567a221fbae26df264bd91a81c43375676492ca154b70ad0ac3b15268c3f636e5b1940d76182d0028a4af65a664a75a4759955d6a203892d0db6ce7a0d3fd6bd76b5a6f417343d35878d76fb223c2fbe4e9babc6035535408a1c0692849f69ec2fb61d1fe5e0fbb3e5f0d8335603adcc89b5f6177f955732abd68515f84764230e856d00d16e53a32bdae6ac0c8637f7af51fd711eab372af84a13ac721e0f8c9c885e3ee6c78d2de2b3660b4bad156647d6897de97f1d51fae178fff90eb14c6028b78229d1f17b91e221fb1c608e43d9ac62e2e7f951cf38037bb595ff948ee2cd4273a475c6b2c0d1df228587ebb3ed3b504920021acb3a19e6764ed7fe78abe0c5ba5e9c56fdf8e76828910a75e00cea1b5a9d80c26d89897fec2d7f383242c709fe5f2ce782bf8c83b645d171f2bd238abc655d8fdfacbd0fbd39df8ae52fecd6e8b00fc269a028fa74abc52a11894e6618807fca462b1b5d917bdf3bb9fbb5f420582b2fdb20239309cacce763f7d17715f7d0bacd8f0d3311f96895d52d8c2a4d5f6a7500c9e6171eaacfef138f15855cd136a9995ffa57e4bd60de624dd84117ceb2deff22d74d5a54b78b47d9825894169bddd5234a92b3cfb15f87e4010228acedb000b35fff66cf6a03285e81b766cfe69fa76464ac263541606d796f32250102342d05e7f3e923d29fdda5786c7a03ff3737a8b26de4f9fa293b94899cb9d5d9b2ac9fd5f28c59d6a78e36d03d77baceedae7a9b9d9623c2011abdb9078a315a72a50992c4f7785d62659af2f306fc3a09345f8703e3b98332327d673a401c6dbb41cc8731d188511987584456ced22dd2f0e1de6874c52402aa5bf9fe849ffad7a76f1b01c29299141ff8302d78438f910b870994f04e8dbaabe0d81bfec1e90c017ab5fb749c1d9b53031d42ab58468fadd96e4f005da6a15c926c59558a22a37476bfe98cb1c5f64b00735b10183b11fc6076614cf95701e6fc1d8031028de32aeaa091b5d6796c307799414e8b566223a389917b2a882070a354573c3213164b5ec0bb951521462af0f9bc0eb980c9482b10a836f82148231177a71b219a82fe5a8731d475a5cd60f4fa93f8ab9f8d947e716f246c0abf27cdf03879d70b716c675dba1bffed46fb0a0490b3689cf72e2616abee8d2bcda35f25d2fc5d4f29bd0caa1d12b9e1fc22bb7f79e8f8604f3eab65273b646cbcbf50803d4cba4cf318d2d62360ad6a36fe8ed3173e64d2ddee93c8aab4f7b6d2a526674012f6ec16a5404994ade36e3bb70b69325eb3d9e86468a6fb0150ef597a6c44a5f61a16dc8ede6b38a361d65474baa792efed5fbac8b167e3c977019769a77e329f2db28bf834a5d6e8318bc95d24f6fe9a1b4b9943f7722ab472d2d597617db0b637a76c0dcb5d38245b74e29cd0bf3f074385cefdc131986c4b4c5a2f21a9e6e241dfc7f52afc2400e578e75646681ddd70f4a01d970bf4960a567057706a9ecc5141e4d8d9eb6323d9811fb60f5b60c5a78259cb016808ddb5d75d37d5289e1c72b50add6191bd373e76d3e1b2fed066f216403188b09ae656b96af9d84baf79a923822c4955f9e11d3e4b02b7bb356958989c74b34c735cf4e3dfc2013b998b007395ee19a1e1cb7dc3cf3fa7f95675e2f1b6bf0ba25be5983d04bdd96024fb7e8d884b5adc3b9d66eca7c0091ffc339607d638171b1a2949af200fe72318712b5aa66a936dd0fee1a11aae6597ef4a7ec343075f1f77d20f217de3b3ea3c9410c036744cbe6897f4ca713144c8f763a20d47556b173b85f27b615fc61e590d34a87f900d36cb10aa50f5702c1adc2608ce284ac4692eecfba515aba7283783a0fbcae75f3dc0100819eb94a8f5653abaec2f0df17f18af3187e1f0de6e9e9f5a9f5fa1c93b103f180e9ec43dc15c48c051a4c77ac0c1769d0a0c56f45a56096c7e86e5d4988347e117552975e687f720e3cf9fe893f1e84514e00470532668dd7f87db06bde1cd6b1d57ebd7ccaef0e48cf7bec1626fad338ea323dac0d865b689a9acea10f27cbf06ed31ebdc9bdb1433664b9094046e6f619edabb0b32a7fe86368005fa7ef9e4bc5f233a7c155fb6c0626fda9178d3ff7319529a9bfdd7bd5d747ee1e44cefe225f5eb4b15e324d41a345229c09383edae5cb2ffd8009cfcf6accf05342504c22bf7aea610ced3752b241b048b1c2741f9ae23722a059fc239259af954d1e08bb5ac97d4d39e14a2da79f3f459dd66013b59cd7cf9d287170e290846aa182c45aa5dcb5cc81b8e620f7d0180939ce9375ea3d7a4ad31fd035dfe4173a0c290f8f45275c6560ceabdb2766e309f2257ea49d56a73aee7a98f0eed6c089c96b3ad7ad3bb9be43bcfbbacad618ce6375923e436ad7065bf32c2093eb28d085d3e6c2428c562dc6ee665e36a031dd0a297e91710c923388041a536393a8b4bdfd83bda98bca3a56ed7c240f57b6ac62db844caa9e51490f17d3e7d262d8acde42a24846cc8e7a70349daab95f2fb2e9e653ce54b2accd6dc8f97c74cb210f634dc2e0aed10b44af4e4b60d93905971be45da503cc0d270071eb8faf4f2a72e9695615460bd95f60b515d4c377c0bf8550125f4c4ceaec83ad3a7006614d6ddd4fdc64b10f60f130e38d752c9df992a2b4026b72d7ce9443f566ebfea41266bb4bd64d544e4ac09c6402d0591e08c6e07abe382bdf40a4edd4e1521c8a11d40ff7d44db43aff340fb12664fd7a86b2eb3e9663ebe5b994ddb63a20d475b45c47ce46c46567e6c2175568a17e25ebed1f5a3b7d176dc1ea9023e1f6ab0982660f59be6fcc579a012fbb3a245fb2b0ebf9681dc252e9c22c91a8793224b7f467a304abae7d8ca167c57d1b5c06a37e15f5e2adf202dc62d17ebe5071c60392f7cf798eeeed79656c84f59cb7277a9c21b1447c7acbd80c5fa3c01824037ed69cc102d8cf80908e95cacf3ec426aaa365a827f9db024f274dad6830c7618c47ad443b29befb74556a2354621188a61c7856e7b6813ab46c1208212ada64ae6ecfa5acf24ba29782500b4fb71dc20f7fc02a1e330bf9aa1343206566eb8167a47a81b2b2e41a7c7dfe0efb9e57674935d3ae35efe9b392d56792af95694c4a81145506fc16c795a0ba9b02984cfce5e7395fb94d98fcf12ae5db8a06e239c9ad439bf42e523e65a31c3bdf356cd7680c57cb32ec983a678c54776f5bd4be57517eb314da34e37efda96debe6359b320dc55d1d4d65f0486219d2ea04bf5e96463c56d3802d5b5408d8add32b45ccf663e891e2d090b32644cc8a649200aee8d3f2e3daa0ba0a576d20781f850bc107b758162e26970783bce31a79745703d18338e674bc59752b8317591b83f63bf8709a4659afe741d332d3ff832c1111e2ec74eb4c438a3032f333cd6198a3723b18059eefed1006b73f35963c39cd3d8f784d4ecbd6caaff035fc418c438228622640ac7b6e9fda824a7e9aef2dea0b59af189d7dd6a958f5b3d751e61510b2e023c1eb6694f511d6dd256a266905ffb3f97d53ccd394dfb5f56b8b297ded9647891fd84bf09e61277fb0807c8baf8f310fc21e535e1b98b3931f39a0ee57670acea0ff96221a2cf69aa67a5bf6252e532aad398bb6bc0870e57909f6f71c99ac7cfbbdcf79e6f9b6c68db43f4925719d029551e0ade4c36094ef5896287ba2af1c86cf7298934c0a8bbccab0e51eed610ff0d3fc84244e14fa08c208e313167515e87109de9d984442ea2a3b6a8ff661ab665c29e9f8fd00bd4bb2c9c76169b101875f0fec645306946c5f4949d730f17d6c37133fe174b6373ec74335f510c557f9e5ff229620b3e8d9d664f3b301a2fe591123066c39a7f0486c1fcf2cb0249196a242119175fec8a93c090871fcf896d366e3ce07b04880ff1db9f396ac714714209359e4c729ac50dccfe8b28754ef51a4d007327d2a61d948ac33c17a2dd0c8cd4d3c0e98e71c77450424e3455a506a5772327b04d00b5d9961002bbdacc74b14ea588d7f99917311503d829b8b7273fb34e04fcbabf5f27c630933cb80b301a3f53fdfcfb393daae3ea32f1e4ace050ca2913f4640aa3e7e3c8f78484bfc82e6f852741de79c249819f637222abb940855b5b80920a0a7fb58336798613c454a5e20f8ee8822d75b9c97396b9dc3b77aa8de4898be71b5804065905052dadf6ab12bccc637c069551106b43f368ed5e0166b7f598c85fda98fc680f4b350b7b47be36e1958fd613121e52631677575b548fdbae01d55c6d390b697e9e54644b428e86b7c7e12356c49830dd6b3002d769af589a0e389c7aaedb663c47b142ce6329b335409d78c62f290d993abc753b096f37a30716a767c01566308d762c6c7438c5424ae95acb1a77f27fcb4338edfc777fb0339a039e37617242bac8ab8d3b62c5c82bed53cd4f2ae67765ecd4570a6e38a8dbe93a85db66915a15d146998250baae2cd3ea3494ebf26951dfd0dffbfd6b75472ed48673cdcb60e5b985f80fa9acdc95c0a868b2621d3dd845b4ef96cb1ffebf8f5708c93d283c73a8f012aa16a439aede13d171366fdb404609eea4815c2b8b344d73a35fb1d707c5104f1d3fa8afbe55b5d8980ff02bd1095644edc62ae4f2463d2ecadb6d17e8386c182fcbc3250f4d16e3f197a916d5b72358394392113dedb0a3065865e5602a8cd3a763fa84e7edbc5c4273a1829277f994509f9b9ab5502d391e7e9f2ab5c3f9ea4eae57b28f5d31a9544ee05951725e5ffa834e679f983c58dcf725cc302a3ac3ec55e1984fc6fd34efce6f815acfdd21fe97b16146ec65680668ffb51988d7c849ffa01e6e50a663da9b55e4f5b7fb432582cf6ef17531d1657c33cbb804595f2c559d2d3622b6a0df5e9a686a52422b37edad77e75b27fcc1d9cbf854c747f25efedfabed65b552c4bf47f700c73942fc7f556571c5d04fe227ce2237f829e8a8a36e82dc4029e052656378013f68f03be1ce1ed7dbb2338f0f4533a7c088a9d0ec53984bdc9cb451f9f6d2b3e1589ebeba208c61c7571192383712ed47ea9d9e8095d782609535892209ef5fd690b24bb3549657ae474fb14caca751b4da2cdc083c25c8f59dcbc289a2b64c459896ab74702300bb0857b5f0adda1a2fddbe502b516c67c33bdec3d6cc0fc457f9b0a6a47f1da513248f65ce409392e27dbbc392db93a5f1f7d655b08ce20d343a6a03eb866b8ee123618b8e70bafff3418bfee5e282cba8591c40bfec177003e32b8cf38ff5034b8b34edd84237aa8ab196c6cb6f21200fea164cacf39735ed7d5a0761a1a34c79e66f5552c0f2dbd05644e6ec8858ee4f312d401fa948a4198f613de0c55db094bb7c89a7f1d4daecb7fe24f1380f7b8fb6c9e6bf171305afa1a7f616020b78c493c2517dddc3ee075d2a4a82842e11f80253043544e09fd93b94f9ab6095ed30f5a9777d8da86049ce321e46769df6b29c3163283998bbbde6901048e7e354016999c14e086c78d9947c69e6154472e40ccdcb41fc21a18329030195a0ddf85e77faf99856f57ee03772f209690bcfb6db8e0428976599548d559539926c2070a834e505802dba853d7a83587bdb535190dbd584114beb5899ee94ddc576135f83af4e3b8dfb74f130fee27b529a48ddb31e07fe73badeb6d537c62842e41a5291d4fbe28546f34b9765d819f632f481cdbe623dc49cbb97c996f3c3109f7d715809b6a371f880bcfb172dda7089a0666523aeea0cd8ca22fe74e255378e84e562b7452658f8636ce37ca968c78993b403b5b3ac54565380fb3a5c87c09877d637477112422ee482d7fc1468031917922fdc392ca3fe9ed8484e2901b2a79d6b5d1f020f37824b275fff35852d2072287200071101b8f3536e1a116a15a23fcd5ea9c0c740dcdf8204edd5654c88ed9f5389e604766c9919f404dc6af270a524c24c73df6424e9bc4d2ebcb06838d01f5bdf9ead0b02d951627651ab50fb17970f6fe202ac42b1fcc32ab20f8a1863cf106af7b3c762fb2341d739d2372add4ecf7cd6d61e1e7f6bec497f29b810eed8fc92b9bfb37447b8178f5c8aafe53e7289da1703c5a19b3153f4eaa8fc08b862a7c0ab78d52104386f068279c114832bc6f16d32a6b14c757d91bd315ee80a94985a9687374f7ccbcea3734774a0f5a00d29a00bcb37dc5ff48abe6fe5982c9657ca4293e1e7f597bed0f69dd16fd9fae6ea77353b1c91183f45b607990066916c767745d9d2b8c7c6f5d523de6a7a60d99cbb59fe46b4c8e62c6ca4820900ad60c8fd4529f60d816f78d680a5791ffb6fa7341e1d9f8c9671a5aaeca9994111b9269b3ad93d3bed3fc2c25c2e850ff32f73aa2d9f0e63ab691a3687159972e602fa1bccef8e8c35c03b60617f74936fa268e52d8c7a7f2f56f2d91ecef2db53c0ab43a475d0467e7a4b7a35a230f3974eefacc7eccd2949be955b59dd8ac4817da1dc6a72edb2f3f45bd6809f9f7794bd6ec9a3c8eea9212b6b84df494b7597c044adc6efcc18b9b6d13eeb7cab678e774f026827c547e024dc1c591a1c35be12fc805ef355c0fb4817771d433b0aac02f820be123a4bae3250ea6e59e44e1efa311bdd8670f1df33934cbffc36a917e8d3eb4f9035fcb2db2fb7c70d8d06de004b47e9b005f58dfeaf8479ad868cf7b1462ac0a99ea415aae14b0b3efea627acb2cc2a7afc122e31d2e6f26012fb73e3bba7bc655d89fe24ce6ee3f41f752087ce724aeb3d91ea54633cd31cc23eb3089928e9cd5af396d35ee8f738d8bdf2180801ee0cb1bae8f0cc4cc3ea7e9ce0a74876efe87e2c053efa80ee1111c4c4e7c640c0e33ed4518c74df6bd12e5f2249305977bfaf7b72ed08007188b2d4bf7d71f8687bcd294cb1c3bc73d9bacda075b9982958d6270569f22e27a4a3330a6172f18ed947ff02e621ad820a0a2f83b34bfdacbddc79e8391ed2b96dcc29cf1b2ff3d907929f9bb3f678406d07ccf28b4e4ea9f6a7b940e5f6b6ceeb1600333412c6f10c98513ea0aae6570997ee16862a54c709212f38f6e0a10f2767fe603382317ff03f5c1336a5bf6ce6a3db172b47d7af003122f5f3465a2328a96d7ea0e7fe2bbb710a43fc50cb2a0d14dc1c030d9f08e2bedca2648faab4f6c293b404a8f39c7615a1f67b11d13685d0394d95e5737bb8b2a365d12359679a9cb92be62fd97b29136a5339519b3b56c13ad369351cb089f4c066c36a2fe61b1d260bcee3776fda53ad83c079efdf89ce27d60766634e5d6c7bcec2ccf4d9812f247b442c972193bcb2ae98ef96ca25de477df8e10efe3d021bc554b16fe7d5b9f9a3d172ff385b38c0fa471d58a532dbe3f1c30de5672f9eea72038169b91ea2eeacfc1d785d3baf20925769fc18b9ac435af051b2323e282efe56a4aaf764d44bbe4e95ca3839071b9c503d4ccac039afdf07173b066f883091d582fa48af3658004e43bd706029f741b8000e64526a6fa891c6498ccca638510983215408b05d9b848d19aeb5fdfca8191a0b8d7427cade16c5a46b5c6a8d697910e6c4762aa1b778dca599426b74fafaf30bee30580aa91c7e144c27bd79ffae8f1240028c6d7ab3992ada0e5ca55ee4f3d62f8de575302d5861d73685423c2e6a6d6fb3be090fbc2a701821b6d8fd5e8233f794b6549cd0bb52b390ac31478307bffa91a9bd9c1bf93ffc846356fef008ebee4bb3ee148e0fb1893d188e4934d0d088a433d14a596c5f2e3e49648a22edc6bdbcc58dc1edbd440046b3a169ca2b68c2f5458c40fded975557524dc97d998c0cefd277cb772bd4c1b263b1d0cc824e508bc837a78fe3b119d86557e288740582eac3f559b4c22873891208a5c23c4bd96ea21aa697b67324c869ccfecbe7f9c8b7814f932bea0abfd4a7ec1135c12705a7bd7d669ecda61b2f48f244cf582f865ef3cda2640c404d9a0aa63cac79aa7e3dffa80e2b9212a915e912dd1b307063e500b7aee78e93c4e3237e4dafcc9be93852e2c7c76c7e74833473f038d88407569254de3ddacbcdb7dabb6cc622c4f1a19d75b9f9c3b32480115fa6acb6331bb890ed5bed56b00f1f17a7c37ae3eb3c7fc8a70b49007a6215681c270134454714e1ca4d7f6c093322c288775277d972dabac1e63f8999d64921f39abeb98132716f33db7b83a0e0c9c3a7b3d746563cba5d0a7164c7d82724242c276cacb085d721702d6a023bbf1b024c9d8fb92a422898ccd53f2201fdae590ff892779ae74fdfc86cd453a3772067bf5d04361c2b2b534d395903da02f0a9e432b8810701df9185c03fdda0b1e0db471cbe26f59fcc76d7c638d02ddcf1faf2006732bf7b921fed503508fa1564442d0244f27d4812eab0a366f3c033b936828825f289fc6d7249453d3c784ab38cba361d007ccb059520fa6bd25bb05143dcf27d292f2c7a70e0c6e0e1e3f9d59933e1d4babad3ad6071f0cdd7c8fac00b4867f43f77b4c002fcfca45f03c9d355e32aee87fe061333e9af1668ceba0e740e0f149c2a3c4711e30f141fa063b4a6113af5ce120c3ef7d25fcdef34984468751164a9106b1883de26b587826e8076043871f9bc8e369272277bd3c33b69cec6956cccf0ea3a423569110070933fac054de86fc53404ee1230a77c434c858d4ac5b56e9360b5343001aff3347afa305ca1e498f5a5aff2f9a2d9527c72a18f46c7c6f8c2769243171617c694cab9ea515becdc138a3f8571a49abd3556c3bb05c327d043d4d85631cfd2e3592c82c22ca489a3e98abd91c05e702538a0f6f9cee26160de218f54c75567b04b475fa034a341553d4e30fd2ff9e6f24bf73f31e84bfb0f5d06bf2721d05e9731c4576cb2819f5ad87da0b1069d818c3703a84b9c287d44862a71b6876740fed44a720eee65281a82c015948d71cb5bc36d3830329e70692336ade94142934ffd82b96e307866fe02bf98900c9e4bc8b9ddf7c6f2d75be5fad179a8968ae2f172133374c0e1e06c2221308cca4b8939dffaeef623fbc620d4a4dfdbd067b24cfca7e909e5c91ecda88fe67110a10e17ff6d24a90f3139827856e66a35008dc862e3e113e958a98a5db0c12526c861cbdfdda1c5fca23d73b090963d0e7efacd6e71257b12b50809092dc99154e70abb48f36e333376595b42faf83da20882c3e6f9bd2aa909c3b474ad069de2279251015792dcfcd416a2f73b13503bc7ab129322af07f57b63f265d9813217af80f4d4b015a79ee4fbb097fcf05f1fe300223d9505f940346f2aa65941363ca85c0b87a7007b63d090edeae495539783065cabfac7ead05c6fc6fdd44e939939af00e3e35a4291bd5dc2b79c0c12ebcf4726a7f8fbc1ef1aeb2d33f2b12f768bff3ab00d2be371d5eb95c8cb5d8663f04ae9f737ab66e3966cc7105c71f41bc5d721b6cc7c464b40c1cfe31a8e95470e970e6460dec0f4f979fc5bba96c8cf10bc1dbcc95453672667d9d131a929de50b7fbb61b9db96c6b9b34deb32995dc9438968cabbbf20cae66195ab7b52971df311ab50fef38911359d75ff030428878d2f4ec1bb90b840045f94555bb7d48e38dd229e5dc26ad1a3b4da719b6b71ce5139fa5c1578615458ce05cb2c20dab83548ad9446c6906a7c9fe7ed5c0dcdf0281007f449c4b08a5c4366577d2c1e2e70dac8ed5a8eae4e38c53abcc58991bf8a67d414d9142a5477462294bf3813438409f1040979191f60bb2f8a785d616ee0a7fb5833c54335424ce70d72e35eb9e75cb272c41475407ce842b0e507b1a0d336fa18fa767fcf35ce102c28ac54d4035989b41aff2743e5e320da8bf706d7cabb3ce18da64464da503a6b51019a347076e3328e87b3ac44222661edd9d5764fab504c7db345a8a869c2658c71934da74b5b889f4cbeec102befe17afea22eda6db0a44b4bd80d188144852b7ae4a2203d5f30bdcc9d85c276d9c3c3f40143e398faa366de9ff4a31d4d54ce8be2b473c36a957a75c3fbe38960a35948577803b38aa450c9f211e0c4294ed63322070a740a5155d6e6d0fbda30ea9b6a391da323dd31a9bc72c759ec74fde2ff371c5cd5caeec07e6a8763ffb7141ae80ab75a808ed5d2148697671ccccc654e8666f35f08b84acab391b4506faa483060c792400c0b6a70c204a0cb7d44edbf847966766058654a76827572c737a3d1bfe0d2f8d13cb34fa9918f7f12f1ecb0d5b61ec24e49a07c17cc2fdd5a26de5a9c7595017b047d0fa1b09bbe3a5dd2c0eebf94b94f067cee1bf13c0695123 -MD = 6064b25061c48d401846b922a6f28cf06001e0e9210a759b66b4cc6315b18a0bac5667e3edd91563ea3dc002c732d1b93857ffbee08e12939971704348edad9e - -Len = 59632 -Msg = 929548adf1febc8414d7aa90ac20dffd8090094f57e4bf541878c256301483943408e5f4c77b43f2bf00b5dc836a8f41b7e22ba71c36e97cb174734f1fb8464053426eb56dcb904fd9192e1dbbd2270f918e7dad142f5b085e7557f152cdf46a396a6b5aa997ab85ab4c9eba1cffae4e54bc88ca06781fe167a3f4a593fc96fa2ca9644a44879a7a7dbf8c1d6e9a2ce84996d266bbb93ded1425d5d1a8ed32d77527e2ed06426718979a80ad794aaac4b841e5eafc99bb16ad247fdf5a47d3eb5c0b6cabb6711a45400602d205b82ecae9e849bc8fc0a34379c77c3571b27e1d287e8bec1ebbb9ebc12b9bf4d98bc3e223b184463cd7fd5cc137523db5d83d5523a7c61804c94ef16230d27bbe6c6ef4b0c420efcd86cf48cd9b8c5dee5e177b93afa5973142e03f6b3d30d07c0339e8d64aa51e087423f1e51cafffe3ef1578c1bdb0d16dcf78bd247c3c59dbf72ba6de6b993db74a003e51e2458a5d313d32f5fa702f7f181d53d5137e7fa3f14c17104e86b3a0af6f175814d66624cc9992778d6c1731c4d7e9c52a7eaa9b98a521b31cf3e88c4c766444dae8fa006931808e9f2cf2497cae673deac5438c953dad11fc694442c9200d5b5d05b0b9b00be58358392990e7abb5857adab03e8f1da470176f2f8ccd72fbe6c5b4ef164831a79edf1a22ceaed5bbe503455b792f4bec19958d11300076142c3a7e20e0daabb0275d5747cb783562a5ad8faa051dd16f549d4b52f70b334177e3e9a9df0d7fe666f979ff4eeed1900c9f3f07a900b7136857325aa996b16b0de87ff3db8ab733a3dc07b121b8b32e6302ddd92e8003c29fecc9910e48f9783772c8669cf85b7e252d89c70a7de325f2fdf1885d46bf633f849860edca12523da94b6ae90071af351588a8d2e5675b01b9047cfcfaf2de9146282d10c304df67b490688c4a03ad1bbc8bbc419a49bad85e9d1cd344a51bdd5b00613ddcd809fdbb1fc64b7d18621f491a6b1e419129bf1345d2accadf016beba9653dbd95b646e881eeef41b9b589e5bd1d3385458ffd0083064d37a87a821da9a0d80d43d08b613d464040ed8ea0b7fd3a460b6fd6db4edf1e7f31086e6b198a79d575eb3e144edb38051fbcd5ade8612a207e16e5a125e1830a6008c36f08d35afe9c93e829d8e32b08892e72f89f7255898443a497ac129db66eaf62d4120daa192b46b61227de870f244c4ec905b62448c5fdfb040cf9d44b000633e25ebfd0efc90990166254b3e3981d4f6842b7fd27eb4cd2326c1f9190c1131ee3157136481fe65e7fb1cb194c8ea95e1c7dfd49ec9b381167f50a3a4e56e00c1d5eac43ecd4e408933dcd2011aef9642fde0e71607fcaa0eccf44394d6a75e3d962f65fa2910b769b2ee130fc9f1447e78e74db4b3f0967092155f455a3d88d5f48daf233fe6491deac90b1d30a02f18db5b7f17583fe4f0513c3d52ea913f0f739dd6468c2f63fa6de600b5f96cc48687a5d1aa5f2af3e2acf18429f252ef6e95d891e0786ca6939ecdba768ec7936c206f0bda534261dbe7adba572bf2f867cdb6586d8f1e6f8e0ff89ebb6b311a2e181f8443bf26bd50a3f95656d1e2087fadcf905a5ac54d2e33ff14010949d730e12fb1630d4844c5644cdea59eb08e3a987ce04345e1ce18ad39b0f3f37249391e1839b4b817b6ceab10b9cfdcdf081d2056be94eb0440b1de30fbe0c43aee9b217173b56a2581c0dafd8e3236ddf49bc7d581dbb4ad63ae399d6b73c61445db9dc405e17de21430866ba279172dd23b1181e0943d3d955251b77609a38ecd7ed57846c58dee0cb23fd3bd01085f3f7f7fe4414aef456442b917a23ed71b03f98b16ecddf499c9ba69ce346684e27add75652a5c35454ef3d246867fcb3987d001183e974c85e9bd96d39f16174832d9948d1264b9cdb3ea3fbc79390a7ab7a6da04d29e1032db30495c53ac3a00f5f85fe48fe0f73f419a440221171f4f11c298653f3eda111cb6e3f0f875579d22ce39d3f95d482a5688a18fe486743724c7bea1db05f4b12cb6091a041e0a8d47afa503e536570f8139bade5a03a3c37f3aaf434c900a8399b22b3ffd12cd41d33133dcea089e6f50220275e81b18647f7ffce1fa498618d24fcceb49d01a6b63d768c76e4078ca31d60aef25396caaa42c29d66abef1d164c360a480f27c6a6826b66bf87a8090a4da568277eafaf69ba3b8c9245cc85ddfc178e428e65dbf5e83af330f1340632783580886ac5de8b49b1c02ad9f840e91de8832a81858dab592a5a518a732a2487591c9a809ffe18d66e64b6d13cf74395f21089524d86d1bc84c4aabb2c1ee7635965e72607b81948b89ebe945e52f14e7a5ee568866b6ff89158c4ea298983f27d82f6c5c3b49589d896cb8a26f8fd2ecb95c92bf8e78bf7963f26813014011e0d9b4fc69c9994801676641b5e926e1f2cdcba036aa02fa0dea058e60a6768ce50da7b8f5a101e15b96312afccc74d08e45b4258a53e62dbb0a4e3837f29c0ea8f65018ac5c03c300b875cae3a40a1d03c3be892726a2d9053724ebe560211591264691ea452f5b9520aca806ea572617ca4341997cc96a710342101599c640521003cb2c16d5298d714e48d309dc9a2ecbdaf56dc0ba8092f0fe5b34e9cc0d5046000b0e2ba59b6e2cb333e4ad0ad7bd3afe0af0bcf689cf82d213bfead2eb102ae407fd0e014f9ba5a3ef982e726d47ba1508deac2e049b2b65d033175b581650f818753888b4aa9e78d27a28a3c952abc8559438a17f9a7d22172ae9c5d2d73ad4d30325ac592f59ba9317060f8a729280979dccf15921da7f6f03fcb2e9e75b02be237fdcab7e79d197db51261f0c00c64577d3ae3fd5d6063e5aaaa31bab240a405281aa2a3c716657538477f5936901c59f0728823af23f1b9b8e06d6a74833f01ce58563cdd2d1680c3a85bcad5debbe9fc200ceb5a1826d53116ea9701a4843ef160ec6c700bb3051cddfc2ce31bc96e68ec783ca8698d9fddf3b127a3c9fb2559d96f19cad7c46e0c8d6b65a972cc50fd7dd300df3bab808420c9049f1b2d1ccd6ce42d31bad2225b60ae5f6f094ef6837c251e48b90ae1ed443a1440c1a18c17c1558feedc6489d100cf007d08d6cac290767e2b083128e1080d41cde3dfdefd7fc9274964020b3612d5321a98ed338162cf08d053a8bf281449718dab7078484f49dd897a34105141c9dc8fe119998a9a37a47ec0f80c8a0ff68ec93fdbc4c0d8dc99f8488300eb32b2e6250ae564a3dfb73a7f77a879cfa11d7fcac7a8282cc38a43dcf37643cc909837213bd6fd95d956b219a1406cbe73c52cd56c600e55b75bc37ea69641bc0184b9ce9e76ca27311cf49566484f202df67d35558add045d580126876963832d7c5373584c34238f11e83bed4989bd77b85a30acaefdff5d88e61cbe790fe8be8bed5794e0a44f9a3e77525fcb825df714ab109654d60e5ef458a7744eaeb559b670c378bb8075fbaa8724e354a2c85811581b3d05d0fb08a24010d16ea9b0a807c2ff2c64315b5a5d01f7a26e51c540b8499ac948538d049c87a0fc6366a25385cc53d96320ca5d60ce14c4a0f71e581067d462a6c78bfaea139c1eb54f5202387607a741b489afbad4c37072fc99472198132ea694be9192ce4f5eeacb8a5c29a962bd855462f673fd4bce6dc8ffb5f3c59d58d022ee729e9f00e58c4110095f4bad44b76a1bdb9430f60718c3174c8fd7bc06acd9e245156df6da231badb2e2453163605d7d0524550a43fc56abb1fcb4b561c32264b100227a6635c029ffbb8033430795501d2b53d0a99fe7818f4246d3909c633a5e66a5d4b14c984c97f1e3fe0b347a5ccab21490628be0638c6a735dbbbf052df54fde4ce2ef0bde238c55d9e46f7468b5bf7f929548a717507a259a0cb571051ec4b52a22a781a64a95c00bf641eb3e855d7c1d6b5ca665847d43d3a9050e8a80cb12b598fa626db5130bdd683147a4e391f37a0c514317d078b551ba374384c46fdd366d7216fb0b0e1e9763c8f0637765ccf29fafe8f3db75635968d47aba91b5fef5c8970518f58fe1810e8c4e43e8e0efcb4dfcfcc34e7b3536da631af590a75d3ad2f0988c1b9c3ce29207c90bdf0a454d3dc2e74dd093132e3a6c8bfd694ce34db205351e2440170416c1ca8503ecb4c29888105a0ac4e58bad77349ac3ac7675915e4698b9805a2dc341b777fd8d257085d7e1b1a41693935d0d7f9446d0fffc978431c08166eda6c10ffaaa74f681a02d36c11c4591058f72b5d3b29bbf6728ebfe605f25f9b8b737b3f9e6112dae9bb72d1861953e23c614f898bd6a819442b654393c4c41a3a74db51ef27c3c96a64c444f493e24d682695d377e5a1f70911f0f26219f4797c02d9ed0985c2a1f0c1404cc9ce54b04099c6c16ba14a0e25f4fb68dd4c5127a48fcf6769e5900331336f4f82235bc96a5d3ad9e3c400cd1f26ed1d81e67aa3688e5437acd1cc5b905db9d3ba2d37e759b36a937cb856c2794a3e86ec72d18b1c80e0f43ed4d8199282a85fee66a998736efe74a2e8bc7cb8a1684b797be63d5509fe139c6943dbbc54c36a7b4a016b6bd23ef3d2efb25a51ff02c1b56c3938867c142c41f970007236838a0d51dfce977fd4a7a937d8e9d9a596902cbe3b1b4569bb94cc201d2658ca7114f118a5308ada27f6725b80b9b4278c2d4bfc7c4406657ce397578bbbd46314b1e2f8f24faa83d166eab55a3876176bff9fa17d414dc1a09f301a4c4f79a2d6d74f9d376a9adf498f6effb5f493d7ae8da447aea18030ff3e22e2ff4fbd0c300b835ff51fc07ef8c66b75345c91eadc6dd65980c34225b136fc3be54b1301d8b54acbabddbfc577a28cc0560f04e37e06b241a45508029f1008afcea01026096af26adc32ed654eaa3f6b8b5a4143fbeed4aa89a54669f16ff498ec0d48db7aa316b806adddb0d653ffc144eceb7ede9c99fe915281ce509d2c91fde101a484e4242dabbd154ab7264a8c33257806ae869eb86bdb4ea2452e3d2554a9ff13b0a4a7463bcf088559a7ac06a6925b7de4333f6269ae118847a982cd80e675ab966b1cac47723c13464e90db4fc22a47183918872b595ed2c085b9e5132529deaebdf09a5f4534570581a5746f2348e492fea681215b9b2458493f168bc4701f5203dfcad3a665e30fe7366cb5345bf91cfa55fadc236b0f677a7edc4b62dcf028d316a855146519cdf5d01e9273c7d6fec2c35ebc5f22c6868015a0e27ee503bbb241ad541d969de8241f2487701110b0de6b27625d771c2df0800ed1871c9c6317fd5441209ed1b6f85ff914a7cc38eba3b9df3eaccc62d6424a70a909e85cb77a8637acdbc247e2f93f16ca995da207b93c00d1db872d180bd160c975dcb7316098c207adc572c49d18f809b34a0e8d956e16ac585bed5ba3b169c3596e2e5950818de1f50cf5045a9a37628415b0f5becc9b2ea1af2629b076f627331134a7c0fce5bc600d110ac82f3f558a454bc8abe408e945f569faa87e9055816a6ca5485774076d4a89405c349a63445d318ec320ea6cc3c31b56f244b2eed2ee38ca4d2db3438b49b05d8d66b31c30c1f4b0bb1faa19999cdcb72465f84395f11b9f45dc2e01388f18bae22213d0ee2827c6fa4cd27045e700a3c56ebb044927a78cd90f4eb0f38f34d0d0f35721bad42d49e714fe21473639a54bab85916b064f2b5d238fe34ace97480056d7af457a87a22824877d1c0eea242dc8e28b89f184f368c58c18bcd1b278c6c93faa1c6fc96833d8091432e584a8f2335c53149deb6d8241adb1b81d08fbbac6d9d28e48652470cbfd673a3ebbcc2f674d78994fd4f220347f5ecb151d4942dc40893978dd4f856ccee6808ed1d63bf1406c86abf439c91a7b60746e71d9f585fe6eac95b441d8270822a46a798fae5defcf7b26abace3601c77326d892659308dd336136cb3ffa733ac243615210d0975e1e5447db415b1ecf383b6c5d6d47859578476791e5259dbd37e963762ce70ad743379ecf7c66c7775f6beda33fdd9fb8c06336bd976bb5b4911ff42ad794fe0d7045b7be07c1c267efa0a18f64bb1eeb149dea77de3485c6d9cc5d96983f3aa8ac65d9cf6bd2d746f0c1d246634bcad87bddcde940e8d39c16dae7e4f74e8751007f4e2a2f03d0bd6bb6c6f3c4f46b27fd0b253847ef68dd5030d7397c2aadb0727c5cf8dbbb74736667c5bc101dc880a20f3b8f7bb20c328fb678c0b03b746c0d424c61f8618a11ecbc19c9ce30aa8973d1571463978643dc54119e1ae9a42dd6ba668c0d5fdb3e029d09438694d9ed7739c1ef8707a0b73ef2e9fe439d049dd7ccf1a2a21c2fa3b2f2dc52c1b11d52b630c0496f6b2037be784906b1bd5d62176137ca3f004de703a3db1d05ef3e61399c9d4aa429cf6a63ce79deeeb377249e5f7e2d6d73ffb3fe984ecdddb603c10767a119adab75f935ddc1af82e51a8c75b00ff2b3dd0bafa9b97d89ce6e351a287711df1257da8b3c8b69a1f3bd0e41a33a32429aa63a820eefaf7a627f9c16a5b638c35c97c5c981c1b8dbcba11aec30e72e45a93654d535202dc82051005b850a5dee12d2005a0b68f78691fb0835259d4d2268f6214f2435409a904c2991d05dc787bc6f51e8e2666fc9ce329ec38946d5025f4c6999e5172e183bd9df618f96bfb7e2d881180fa565cd09aea53f64c90f0c17a1f35a80ac3f6ca85ee973c99d8da60d745894990b24b9cad7e450be0e4369175e883bfbdebdbb5f45106e865a797bc4ab9d048882f3b69a15259fa0fdb940e7e9f0e46094ee30e9f41cfaceb5cb5f90e51a0fe5f119ecffd02ed4117eb8ba10acf3fcb7b61cf0cdd5d5c0aa96ca79f88a955eb73fdf828370c8961a7989ff190d582c062b8d26934e026821e5bff28402d79906568da1ae5dbb8dc2d675368a76e91b57dd89f8c4c96d9a3c8af2f1bcb6a867da1d6b7007ffcf62117dc288ec4e6c71b1b35a8ee7addcfd026dab9f290ccf703c7cc01816bfccbd0f56b81cc5fdaad81d954711846218397b763223526d165d335bd6c063037945c54aa11ba0eb6bf6a16b97a92450e9f7af8ecea6bf4243d6c8a2f39177349fa33a3fc3ac02807773481d937d4edf16dfa79bc950f9f11f82023960b3d9bb067f761e68f8752495f8179483b68a7769986a86694887e4720ae909654d11fe767f82d0d626803f8f2d18b6af7b6080a8cb0038f7b7f181041585f84987a867b74e653c555fac392bb9526c5ef559629c1f7298bac4c0329c4cdfef568a255d909227492fcb7f7a3245cd9fd94cfc850d3dc78dfc987b5e0457fed7d27e1047cbf4d1e1aa91836a6b78923569a7d151c3cc0701035aaa6c02ddea96068bf28f2e1b6aeb10da4071a0fba818542e612f85753adb1933d6c65f86ac163ad7519c82b0fa4ea7cd3df89775172ee20b33851ce06903844b86d3e2fc4b3db68db8d68e5a8af4b8930265198fe8615d63d0bc51b49c608cc942fb55e4cff5c1d3aca51cc220c48a531722eef122970b61be3dea99d9dc7bd692a67ee94125a4d1b771f28fc7a667360595de42cdba362a876faf392a5e9799ff3c27b1a8b5a8b160a2d96a848295645328b12af2b124e9b2b96a3996cf2a3b102516e40c8c12982fa099fb61405d0489422e5397641dc4c885e14425157ae34eca142b75942db0add4fae965c9073e2f4a1f62c7bb6be3503add00e019d0ba3f91e82eecb4402161a4c4dd9803db3cceaa4a02879e556fd23f2615cec373e86de35c9478d49213d479be7e03d72123edc977d9e1f52290d7fe842cf8fcad946029360522dc6cad8cbcb275ad2d201e150f708fdca81b6de6debfed64aac4e69ec93f2bf1b5161713d366699fee2152cde4fccd809f882f87479eff1cb60107b12d3fabed45d87af128a203df006cea9db0e23bd6c3b1fd42a1eb0b2809ac1f21bbfe301e75fafeac2130eb774d490c0ddbeb80e5fadd00a0556cb88e8a0d5574dd43608d2ec3cace28d7c86ebc00e1a6cddf44b62d556028c9eaaf58206bd234fad7e341567d07dfa45e42cd34d890efef86314f45624463662c978eb510bee879836242d66edc65fd8e029b9f1a4171a7a7edba284ad4d794fc193630424019c40d859997de72ea9a2fb0e0e40f1eb25e0c20ffc0553a0ebc20dd5a784a804e423df34d8017f0f5e509f4a5ebfc4c3c7d7b7324f3cd9b9044618a017770a70f5bdd556678607f0f45e374f19c2cf6976abd8d33abf822e39687c83414fbdde577b352ed690047be2286dbccdfe642498f9a1833cf20f491185a41fa37354956fe8993e93a406f8de5bbcf3e9c7158dc53d9b92d478b3c2234a29a5bc86414ec5825bf62d3682001f448f850bb1661d81d441a28fb81201c51267e5fb0d1652fee4f7f601cc081a4b8f50009241d85c357a1e32cd34cc809d6af930fd5c465a626d17becfd8fbbfd998c8c72bfceeb2768b9bc42b7335d702d05817220843cd969725a0d5e1ff59400d347917570bc8bb8544b708f7d07dabdf0f190795b115020f9c5cc27b658f25394d6702c4d1f78af3a3bc04373edceee388b72c98f0c94b12f632f409d0c9efb95e417cdab3d75b532323abb5d38d428a4f61ff669572c86dcdd41911c3820619f178c41d33e0a3205d8e5df830f74d3fddb9fea3117a005c8da07027a0401ec7917d96e0d49bf8e7bd7c9982c9b37570be1fb8b2f777998ba038b7c0199c803ed8d063ea1861d315cd4eecca104a41d96b13ac3ab9d3ea67b00d4e5f71ffd10c1211998d61eab83707a5d642b71448b66f26479ecb17797d478ea27a5bd297abe7a1c63f539f1ed7f6e1d49100a9d0a424d82953bdcacd28a13d628539cd3a9ac41168946fe78d5505b366198f93903f46a9bfee04566c1687a9fd249e48305531d10f11196c7a4ace7b1960d63a0dc42f0b79e23162ccb35554d0bcebcc1f67ab711839e2967c35bba95cfb57358fff588de5c4b748758b84be9bd2b4c16e4ebb6212734dede98257deaf4da4eebd2d5d91920a289fed0ba0579cfa9bd09376cc348c51dddb68dd2d8b8ecc21fe1bfa98c6fd26e7d199c032b08298e372357c6868f459f4f7609297208a1b50cc02c3b48e95bf87860225b649bb322e1eaacc1a6fd8f035ca774f3f4e1fafd3d128351b68ea188a15ccb8a583c55afe4e89f24cc9b8c912bd035f8054cdfe1db5e2bb47d668d662094ff57b0f2f77b68a596b99f702290e579b6004e5038a80e2d8c2c467907d91e90278c14c681cf94a8fa46c8843a4ab12b5ed377f5ed9bfd060e80b9d0f82ac3d9a9ef2bbedbf390793494eedfbd05b86c95382743e702d171197a7d7246a236f6ef499ee5ed2f85a0aa6bba8a910a21c7c3f906430c25b1f615e03b67db87a06f5f611440a0cb9ba5c692d48ca0a115c150dcbdfc454bc61e6a7b9ab89d2128cd630136d9da0ef911efd3e3edd011bce4a5aaf4767bbd38708013436c76baf79762efacb78442c86c8cf48fb50ba43db7282a52ba94c42e75c070dd8b4d983455c4f41de287ad2f3c07be82ed38a0c1c2422680cf7aa6d0b39059111e09040890f0d83263c997570bc7f9619d3f4e6f8e5b6426bd13ab47b45997872b94469bce50639241344a6760346dd7cb08f670a2dcaeeb8d491dbb0084f3e6bdd5a6149a4b5de584af0d88c4b6e18a817ae0eb862bca77460242531d7732d7d9b46c9b79498dd5352127e2beb51f22c67f5309c3b28073f0286438959c1f018919df5af5b2bc085a74e19cd699ed48a3fe99f2e0d89a8794a2c992f05a810dd4ec487695efb226fe8f83df94ca14a41ee0f8cd6504de5a3958b988b4181fa2c315ef1ae16637d8265a55d281b15cdd420bb9c2dba01695e7327e426b40c2695c7d1c6c628013c6dcbd9e9e24b48c9b146823fbc91308dfa6185fe99c393209a90a17949fa50d9727a0a86a053c6e889edf809db7c57de17ff2a3a5d06b372bb2a527bb213eeff310ebb95fadb2c84ae75916d32d1e3c4379a8939d8e3e99777e3796096eb17f849d861aa5a37c6389f7bc2fc3b4860fac9d2277fa5e1a1f9415a6aaa5106886efd85913636f0407eed7f21195d365bcc4f24997e3c867932b7fdcacb88fc9cbdfc94debc19ab07b208ee1047213230c3480033a81558dbbe3c4bfe369713e18fa7748ece8abea89c824735282fb28c7a44f39a9fc8cf45f65ed3999e1402e33e8ea335c002a19f78ea28e41ec13dcb5bb68d42d7bf6044959023114478301e5522af78430a0a48e190f1c1bd9e3a89d22d2ba0c2619264065098e9ec4c31ef6e0407aaca194f5161273042670f4f2498195d58e267fc00b340c3a7d8087ef2e3933a61c7b8e735720d62eabdacd237f7fba0bfda3b03c736c121cf9a257db55060b621be5168619ec4182f13ef6a408c447469fc4330040b6241c5c53bb4a32eed095f207b596231ebbe842c5f8dcacf9476dbeb28f763ab94922ecba3ca48e9a8b29ea0af20b3e5d4d48e4965a3232c6bf68a0954f04281e -MD = 338a39c789636826a396214578166eb987b5f0b91ccdccf363ec13ad2262ce869fad36cd3eb7f89fea6b8135e2b2b24b9b0a2be7e57db1326c370dd7424e2a85 - -Len = 60424 -Msg = 0468d38487677dca2a631b79c1f0c0e6a11d0ec1064bb190b23f2c5bd775d8a937b729ac8aef34b9203a6efbc73db767efbc97f20c68c7023cf9f3232a7dbefc32f00781c60c6a6a10620ae3d8aa8e85a9586a852f70602be49a4686ec79095f3c39f26b026728c44106779abcdf4f26161810e0370884f2f24aadece410c2b99fba74d208a875b1fd4c3b893b8302347f25106decda3c3fad30b1bddbebf0f4a19d141e9e765a198a5ce0171d3ead962ca6f293168e8ffa5e75d96299b29bf78b075bb78d79dee2315feeab29ba5a3465c43fb97ccc860c4d40ae41e60ccbaaa522cf069c5a09f53a7debaf289c10f672a77e49e73b285bc2bab7c38aa189f53616fa7195c1e33aeddd618ae38fd8c49a7637aa1f837dd0050b7c504c1adcc0880b64613e55759992a8d7a41f39b986275af244ec4d8d535d5a8551f51fcdf3e128933f61bfc6fb7005d665a742bb245f7a387f164161cd14cf5b2c4d5763768a951171c4a7de46d01de5354253e6868bff90c3640600247094854b1c6ba631cb7b666130b3c664fa188c7cb7144395f21083789f457242bace8b142a029e0deb0218756c8e853b361d53a2cf2cd937ded698068fa5c00d39a8f6f13fc554f03451b11742de23b5cc54c30f5244b055957857d5fccff16f37484c49225ccfc4ec91b9ae784ca9b903e6632b0803d1d8601f484dae6a0d4ffad618849c6e176f5ce9b6a2d77f1e2e25fbbb5fb81243a687f3f4d76c1f1d94cb7bdf0975a335dbcc82325a27208afe78ba54112c180ea9521be2d900962728f25e2b4275a530ee8383b44030d6f610454cb5ab2abe3bc709c09abd307636f2b7a9839663191092cb15c5bbb94a694cd3d966937bacd1eaf309a5e9c5674fda6281706d09aadeaeea60ec338c23eb9a6c88f033e789d8f9591f8ac787137cc83a1079302dfea129298bb1106f0a84e25681daf135fd59dc8329d1bd3d1fc4a4887e264598bd61edd0bf9cbb2ba73d0cdaedac372fb25a7bb9500335b136305694f3ff15129026e12723369a88a11d0040f4ef6c9b4de6be43bca796a9fec6c7a6968d08631ff9ed76e006164da12ca7d0bd2af74279028d68944548ee1f90dd068f57875211e1f9041d9498444e73e7d271e542ecdcb8d0720165b348429681fc07e5f8a80ee7ed1a0369863351f9a98d37a9b4601e0f6fa72a903f7e0fdf9ccf26c0c42dc012b100ba0c49e351c7d64a38fcb568e8105250384d545a2d7314c8136f54a9cc6a2efe69054a1cf7e354519b69adcae2c161b452255aa2455ad32ff77a0fe4ddf74a5c38ddf0a5eb570dea8975044fb32c851da19fb91ffe9cbf4cf96a5ca599c2ee61501ba248d42be75d2aaa23bf0359a4d14c43d9990142c26642c6a5b6a8d20356d947cacb5a65ccf1a58f70e27c4ea7197c9922d8f554c3c6f91651ddb32f6f83faeacff7260fa3ef23ac5480c415773d592afda383d8a9b547e3c8e362e21c30dc8b1994e030549fcb8a386083b6fa850a7dd0c353d85e7954b371905cf2f0a5a7b2106a30d1c649c6b0824b62371a39b81a04010c5bc95a4711b6ab4a67d52982e71c40bcf9e3353ba69c0908a2bea08a8a0223566ad2a24882fefed34ab20695b3a5e02fb092ab53f5ec621ffece03a95431f1db0c61978190b24fa0a26e82099d13102ffebbf23624dc1e4c5431aa3c00f83540495e8317c238675877f3e6062ece9964ec46530bbbd20439abd1dd6c17c1b53029b1ac35a0f90ea4d1287ab3ec3e4378811c16fa4338dd8e0b95e46120f33a51b5435b01b35d0b2cb9f5853961cbd510c623832d437571f27d650642a3f58c4bf4fad7a382cd2897364251c015de19d7c144e1c943f1880e07298d37283173c7efbf6a4496af2b8e51f7246f8fddd5727c687af9cb14ea8ab4c9bf6a380eb76dac7b5a0c756cddb811fd476e5732d28cff7594e364465e0d892ee5005af41fe43514f022a96d06be7e3a02e6f543d8cb505578af95efae3f903e4624174b75d5927474afba196e47a0979cfff17aafd779ee6e86e777a0cad0e22cfcf67c7fe7c9812eda2ed7dcfc80fc5fe0d43e1e59822abd90e146fd535103ddb07fed06c3e42565cc8f111a84255291b226f6eef971efaff40bc48c851c87a2693a07d110ea4663ac642eee89977f7b9c6d0ce75e50278adbed5a17053858c34fb032aa77e4ce6ea3369621b0df6d65c733e7d13126b9976c106e647ead5c888968d757a0d9a4cfd98cb07ba30402965affef7419fc8d1ed0fb6a3d96847d3940ea5ca132d1b0ce75eee6c30a0e28587e5a8c98bfd98b672e36b468f5c4a11d9bbf2b50d6d5dab2a0e49fc38c06c6f15bcb2604cac59bb9af4ab6ad4475b27dc36eaa2c33eb0ac581f74441d2f3c4aa18da2581e3c9a55e7bbed6d62b9f97a1df7f43fcf21e284d41ae3b0684dd09cbde0ff1d7b2eb919cb91a7ea9514b38d1187b5d8aba731c930792edda49cc7f9cd4f3f2cede3547bc91e715f05f817d5596e95f9c34f4cedffc2ac284c9c90d65230d912d10afaf052cab0371fc474e748051b3fb07a8277947fe23ceaddb9b6df2e534beef60b2c1b2f1aff5d1a79378fe3bc06fdc970da81296767e9d0b12fd6a044547245036364b3e834386a834a73a30eec05bca69b5827b245d4060585db3f12a91568724ae1d1ce625c252194a59b7a5b52b4824e8c13496333fe256d5f4344d642e0e656f531240612dae2ba886594d17f5192489f74933c84199f4ad5556148854ecdfc113a9fac070c3500be79d4eae604653e04b4262e3ef8e1b2cffdee9c46f297cee85677a0a339a71b9a40b114215d69835e6a88d4ef1c8b19b1a5433e127ce233dd3d729071d3977fbe62bfc9bbbd1dacff0031bcfee4f9f42cd4159a826e1bcf5227e6f7ed7aa4819d5867880fb4003f790d9742f8f2cce69412cc5de116d2e5f9de6b53909f5ce5b98a3eebb7d2afaf5eeb400357b6625589e9dde4e937763c3699661fe5a20ef09580ac412e897a711331b26ab5a058b560b1c0cbf52094269b116dd967235956a3c44644ee58ff29387975157d612eaadb032b7f8f62ab3989bef8fc9fa3ba7c76dd834371b1bc3c211afe603959329a3b66647c228e39e994fa8e15e9a3b0d68124e9e94334202e7faeb4e753f933081454124e5903bebb5f6c93a1ff93caf95542f082fd40d974a69d3f1767d17e78f844ab729d53a8331b8da01d2c04675965b02dccea7826a3387f037cdf72936149c0966569fe84c58bc64a040966147b24e4f813a53ac64ea7cc9894454d0055ab5069a33984e2f712bef7e3124960d33559f5f3b81906bb66fe64da13c153ca7f5cabc89667314c32c01036d12ecaf5f9a78de98d93868e188d0edad59fec34487dc3220b15fe497e82497bb076c157f4265661b02ab44b1f10ecf305096827991c466c0221b853587dfa2e4ab1d27da78eb5f8aa5f1e56fcf285df2cce2618d3c0bbe3160aee1e530ba8cb1a707ceba629431ae691335624da7fdba73ec49caaf38a43a1420dfef0b3ebde7a332f06528e7444ff7181bd490121951edbb207613d37fa5e67a669a41f29e5146a77624f36c0135f6087e0bc3f11880e357d0da8f64b7387dc36030fa5f95b6396d493febacce270feb48500ccd620dfdc93f3e4c74b4bc8203b4f75d0b0bdd248c4ffe372e14eeeaca60eb932c5fc0e21857e9718addf89c424a389380698fad0d72a9007a3c522eacae24819977633b4cfe25272f9cb674890a3ac34615947ff799876d19ac1b849a1a43fe9912bcaf6e1e3896ea58bcb2dfdc4716e379b44052ace1a792ce11939b8c8f31b69895e7849e6be5437ad3fd4da8a5b4e1fbb7992692ffd56d09fc04b7ec51437771b48a9966063dc268c3fdda569dc4c80564317c35292033c4a37ef622d25c6405e141b25e51c5f08b545b8ece776f1efe84b15b7ca7b06b69cfaa611657a206bce6b4d96e94a6544b4ebf71f87bdc6d4edfc0cc4fc0ac9d5f482fffb12b40e4ff8a8a157e1607771178d08cbcf1343c5c3d07d696be3c520ed6b7d9d9955c8734946c6f762011df439b37e603209e1492662d8139e78a10de41e7f577dc1f75c5cd01ed3efaeb164b7f9c87b351437c5721dbd52184bb623750695d7449b03818fdf29abeecbfa48feca578b6cc4afc1338b9db34dcfacd81cde519b624375897ece67bdf3eb20f79aafdc0f2d9dc1c2f716e9a5b396ddb247e022f27b5de5ba861869a8737eee16f804a6751c021651195a31a7fe13c13882b69a9ae43cbcbb5257afe9f209ba1db383576bac8405e226cff64861d90fd159ec28e3218262f250169af1041e0d8249865f4143a6290cabd2b7f5a359122349eb4e79d7a181060bafbb6c0e2e60db26983e9495eae817252ce73e17166094bf2e7bbd6b2c9f5ce1bd91a994bd5c8ed72365e407c4dbb80f191490519383bc4630412c5076066d7ebabe382c4d4923d7d2759e1dc66c65e631c08ac742e3e05b9b3f552c305ebe3f1181962940bf10a50fde514c62228726f16b8c0cb719c78bc9b6a652ce20d5af6c9c52304a36fbcb56107c181a96b26df2862286628dc8333657ce68c1c53a4c266efac5cc494bb71fbc9d0562216e17af90dcc8d7c8790e8b830bd29de46291d969de5e495e76f4f7232298db5b20a0732c19488952406a13d90d24c4e6c51cf01d9b6e33ff041166f4ab56e8cc60b4f7a86689e9a3b4d279ca30d3c9450859f50aa07a3e937978d991a5a40ccda4b1a7a653019b355cd427c715743d9772b572b19c06abc45da7e99a9014da077322fd965d43f0af9edb9850396a7456badbd392cc981e0a173af160093db2e242858408f3c59c4af18566060b4b1ffb3719a23ed0a307cd3c8e8b925f6339e69955b57e951ae0cffb3dfb59097a930d7e1b590646cbeb96443f32a22149d19cee101c57ef9880872271d2b9c29d7ff5f63d82998d575bedb4b9710ffd360c7dc741233531d2de08fdcd86b8b508295d461c996912e9bb4c0479b13c21dc6cf1ab7564872a6e6bdde3ad81d65f6f419be42517e576079c29ca1c8dc75d91559101095ade27afbc7e8aae4e8330273b4a36e388af3525711f5c0e6131fef968f47e89609ab83b4253492c674fc5c488e0d4d46616ceb7dc8560cbd60c946919746a82205d6a759004b5b446ac8ecbbce834743abca15321044ed14697ac84e9995b6014969d0317fb36e27729f9a139d8ec4f61215b7bf1149cbb4d93a5c14bebd7cfb7c6fe585cbf63136338a4e9a22b52c283c56b86cf2ec0e665611ea2d2d4560d746edce9d0b9b0e3b5690f0968680e7a1d1950281dcb61ef088085bdf0fb5cc5f51ed73c1682b6cfc82ba6850f0775d297ad87c46f62d641a192695738c9627594276bc390a2db343600f9e108923f688df290e0369db46aeae748131cb6fd98ec491914c18294ad698977a1e780b1b85a78fa0ff5c482d72f2f80760f5c84ac67d45da44baa89b7dd15ae5c1e6b732ea7a131a83f8fa82308abc10493129e2c9159a7f671a310d02b361c542fbb0a57d02bb64d7647babae21c88235a81b095e359868fe5d4c082ce8b304e9de7dda07e4916743c95312b55d22476a8225274f85487d50ae81f4c2155888feb8a63b4fcb9d090f4f081d0ce6d44531e6d0a462acb1a7a733593a8de5593bc9b0b42e1f5de633821d24367d65e666d1fca3e86053dbcc49145b4055fdbd0392ef2e1d3d4274cee55c2fc4ce825e9094ed265b1021cfd57f7a106fe1088ccaa09d9c6f72234fc08033af2fc8e446adc0e1e1653cbf94ab918dfe2ffbacce773ce1868c86a880f39bcb2ede3334a5a49eff5d6faad43234c774afe969918cf2aee375dc41780e4d7e4c333bd719845d767021df2309b25a6958ab03f460ce233eccf1c76b3c01b871dd47ad7b3ceac0905cb51f6f061b04be6078e764c19af234c480b5cb9b611bbba6f19ce944dfb533eaa2955672751a0fb5a0fb815bfa47d7f2ac0e2a3e375da5d0b970e7da6c24a8426faba0f5c983a47eaba913d7f50a707ffc3a50cc8a68778327923ea697f5388da4c814381e29c5e41f58e1dc93234792f8a105ee632379e6c468b64f6a1028f3ca537ce37cf3ba0f866fb413dd7aa45429ab114cc976f222175b167eed5dc39b68b69e9eebc9ca2667585424daf7cfed16c13b8dc4492c5ea8d428da27c550ae0658420f74933f514b7a89b693830f8448494c5a5c846dc30039b20c202e16532ca132e11e395fbab93d1b710e04ae4145ad0d5a9a10fe79a6f37dbbe0825eb363f935baf2a473863909d1ff5564f24d9753433685d327a7226b519070a770f532c81243f6bac2e053467405708924d0c5a5b99526b62f76fd08f533d787944322769223346496ee905ccc2e655d8bf15809362083a1600dbe31334b1d0812c2ba6b7d02b48b35d877b4a11f3ec671d9d7e9817fa67d0095ed50d1804b14319c82109b8a7d15e8c791b4bb8303ae1cb0caac63599730583513cc987c67923bf902cbb36196ecf7e364c5e200bafcd59dbabaa4565ca4b016b70d50e47c697600c3058f2f0af6aa537a50dd3e6d98e4c82e7b0c1fffbf505f617bc1638f832bda4c27f59dde1d49405bbb75e62369915aae57625c886b7f39997eb29faac7a1ae2597ae521c471bd18d6f72a0e559247bc2b670b4fd8f86cce87eed40d41d22a5d7bf82f7cc5e692f9ad59c13ba4fe452f300fcd06813ad3fd5e338ef166df4e7e9063834f4497b810a54bae8aa341b08c89dcf58d0de3cbae9155c54779f609be3d39ab09ef099f0635396c7bdee0fc4caf5b1f33eda7b67aa7c2116ff9caeea4e906e14d13b0ba42f3cf656fc6608af7f706a49b9eeb26ca2804eddb64a26fbb0a47d07961218c4f576a3406e8450f17177c103490228f1598aad53a59210f794778f32f45d0a783e69652b1b312eb128707fc9f6ff261f5600041ed35cb3057f716c3df30427ea917d03c00c53e9172bc56c42c9cbf41d214c1ce64891584efbfadbcf9befb83f761a47a648d3ca4d02dc5017c94fda1442d4bd540d1747f98f7aa590f50704a275a8f785d79a1978351ff3f0ff73202c4102ae0f29d8c82fc459922a08325539178fdc07c28f1ec34cf41d7371200d8ca73db9c0a4bb231820ff6a42dc59f12ce337bed210992054d0c5954b293cea5dfceca40f87a79fdb2dd4f5837a6521a46209658ec9a2695349f9241e2fb0ffc6c67938a3d98685a17341fb92e93c2dc91a6b98e4f6913fe93df89295896594f08f4b3d25a23f1d9179ac431a31c85dc295c6217b9e4eeb3e362aa7574142f103deca7b3ceabaafd4c77e96c15beff9b85b83c6fdc9c0b479bbf72a0d5f2e5e263c5eba91badf8391e520bc2f6e9b48d2f208500f7fd1e4c255c7e55ee9132281306fc1cc1996e1f15cf87d0d72b39339e4bf865bc968c2438a029ef3e9d8863d4265599410c7101cb270a103701f2214b90e3289ae6d9521e5101e736665d282faa84a91a65a593972efefb86ec73d8cf75f1a4137c9a687eb592d8769a24e77e1a05c6ce337047021dc30d577932cc92819072a6b623d9b264692d7f97741457eb656cdcf4659eb49a12c01906b36f2d3a4c2ec5221a1851d3d170a1eccf5135950025b73709fcf71a5abe5c337a52f81681030f4ee1c6e58a782c8e089b00afbd826bfd69b20472250752917dfbfaab9cdbc9e5ab2f47e60ed9cbb4896bb52ebb48ba100b02278e30a5174954bcd88033b8cdd8b5372dcbc752d895ddb5e12b14ef9a7fa98ee8d3c3b096e436316f4e71a4a968fbbdeb1f4a9fdda2840e073d60c387ccb39ccacb54b63c02b10e414eed2bc706fd0802491f0d357afae8b9ce1580fc67b7d03fed7a3281255387d109fcbab14327c9f5e1ab179a7fc0ba5b55a99472e134bddaa29a9200bc7c42a11836dde29e0a685861756b573174177e8ca36a85b9a8aa0d834c612548b9d333f20211f58823678c5104650630636495bb899faf6182495b27e62c795a9a9e0c1014d34491e13c1438ee9121ed3d46336ac2905a69600045d91e6087527d279c0ab5be6a3bf27a82718a7c24d86010ca22e4e91141a063504f5b89b9c0fff4563a8b1fd0e6a59749a37e82a9725a78dc7c77065e7af1e6fcd304248b369188dd37eb9413429916fc3721410a5baad2eccfef74ac85a30fce0ccebd9623b049937b8d97aba03b7dfcb51933d1e4cfb37d95c4c085f25242266511a14508fadb1b8db7b6f4b01b40dd95ccd79abe479f01868d5675317e22a874539c3266cfa1d7e7106e98d296e41161c2b8bf4890fa1afaafb2f4d38535c6a32afac8bdbd324b002e2b02885cec3a918133da043a591c6aa2627f4915dff389fe49828e220107614768cc51dbcdabbd8ee55581a230986f1bf18f129e95d1815404ea58cc927f9312c450cf721cf74e5259cc317715116062ccaeb09e0bc331b2b98a9deb7b261e06ba2a41de3eafbc61eda8a4177b19f71d7058b372865b1390d3cdce2d0f8d6aa9c6c3697ec73790343d754a11e7149bb269179bdaba0b9f74e03e79ffd437f15256b696b22b21525fb5aca3d4cd83b6b83355ca34fb473de56b5721d27d984ab6f67e6a36feff8b3ad2d941fea2f9e0955badceffeeb08758d1a246534030ef4e2285447ba714935c316594fe1be991d04e9a2ab9f8ba0445cf9a67e0e094577e6755c5deb813134a4dec1d317cd5530f88856de1add62d4291c9f709b3350bce418a6efe967d837b84d76b576a4fac9985fa091572977ac5d49b844c5c9574b42d7d9049e6b65c6672a1dfde58baf714e3826cb3db7075561499901721284ad6a7b9da5f1d50169193f61b14bc99caf82d99394b6ce39559ce4e9af8c57fd69c2cc9cd9caecd3a93652e7db92a7ea0b9a0b8df4aab7353675e15157fae0ea07b4917ba811f9040d262c5a82a16dc10dff96bcf4ffbb247f560a78ffa4f5740fa794e51aae44bb1e519560af6063483e1942ca9b9e202eb9a62507b272dec30a039b80388a1521622054a169b7d0a82550d75cf26f2e7a6bccfba5754ce2fe802f6ff4098bb45e63f933c7b88efe084b0d1c1dff5a2f311d3254fb521a4b4df795d8ea959a6899a945f877a4cd339136b6dab2cc48697a583ff8b050c45fd9f99c9d0ae5a07bfaba6d6c5b365cb86b70b5d9c6611f257ea25bae6d773267ca0dac88fb008333aa20d7571b7523d5bd8170e1ffc4c9ab6486ee3fdad04daa48bc2d5f66ee2dd9d163ed815f6a0bd1afef51ba05ff2c43558960749e62fb727a8c87ebf2b884b4960916b1ce1bfaf66b44be2b811a323579351a1362362505880723f44865720e229cb9b11092d98a160721fe1b1bc2c8f71182e4cd52b4ac9bb567420ffdde2d9da44047ced791d6dbc1e1f97a0cc346f8a501b188c08eafdb1dbc9cf089af5a2ea7123cb0f00822e0f966e547f41ff5a37a00403a889d566fc78bcb9310cfddfd2f97575de728b64d37188929dcbd1e2117e55a8cb0c7e97f3b3a989f9a25fe33c337627ec4d8d94b045fafc9cb8508990419c72642f6af350233c8bd309905f8ec5a23ba8dffd402e6a31dcec95ffd34ca054faf4511f1b7a3dc2694d8133973306864ba4c87ef99674c9ce1df33431af010bad0c200f72da69f79cd9c7be4cd1ac9eb25085772380fc2f4aa13e92372fea1cf30c0ab09c094e3880f84b94c2d2fe580a4ca57a509656dedd06f69e5647d22577847fa6f97f30f1c0397b6b9bcf925eddf996fd031f1b64ffcfb9bd11af4fa1b4f60d570dc4e8dfd50dd5875a2ffeff97d7d873adb3b03e1d5be682fb9eb91e05e112456b42ac4f39f5e88c706c9ac6b277e872c2dccbd6c04c0b6466cea4f714c64cf6749111cc698232ff610e0c50c84a557ee4f2b4db830096f5f597a9c95c261beecc38afd3de233334beacba0a43df9e0c86ae0198d02a279c2a822e013680fd92c4a1ecf2226967e0eb912a7fbf9820802a6748bb32292beb7826b83b4e57609710453fa3b0b55f687a83e41d86149b8e32a6e0af137e124860fdced40e29e34011cb4e6513a7785fddcd6d5041c55d9b41f56fd11e997957676fd867f06904325b8c6fc2b5a0412ba8062cd48d3af51beacb5ced9e2bdf8d0e056b738fa531f250113a29314058404ba6a906a2e5d0a46fa11e412c75b34dd7470e63565efae491e22414f1081c524b2778632d469ea9731f5a784437733e25bd27d3cf06ddad9377b4228f580bc629210176a6edadbf878e67ff6fc1bdc2abc04e21643d48a1c76a70be66c0a51057fbeabd8a3b9c4b0f76ed4319a4e17fcc08f7f8b052ca65b012d06511c286c57a308aa461c0d8c08d7140efec619cc9f8efaba62de7d15de00959a30aee1f59e26767c7a81de1d48406095232882e35c50cdfd6578d0c1ed9c682e4dc93ed4233090893c79355eb859dbd2686794457b2b91af5a782c91d0fc2c2c6e1645f22ee7df3a56ac19379f4b0c2b972b54d84449cd370a899a6dce4a6cfb5c3c00350676eaf58ec39290473d7c09761ecc85fed209ff3d51213d31abad03dfe47786f5033923ae66a851f658b1d5cfe60335f3eecd6eba78c9e93f4979acbeb6b1ce41b7552d7c3c6463f5c435f5682b01ce69c3a2ec4ba79a5a414c575ec359b6f333b9c579c1eecdac8c -MD = cbee0413f1f169a6512ecaefcf5a0c665ddbc5f5365749da16dd98a04b9939584004295aae3867f2697c52a28be0e42db6d1d20954e386dbdeec744770fdd2ba - -Len = 61216 -Msg = 41e9d65632f74f449a6842d5e6c4a86ef83791307b92161f74938f841a660690e86beb41f03a088a72e5b8aead7d54edf5d7ef62068f432c984eeacc3449d2ce450aebac727322ef2b009397824cfabd3dd76b77290644fcb16b5f08ae478c82814d3e5d60a984bced413b590d3b8327f7bf6f368bfe01d7e673550233681cf4c3bd4c1c61e51638df3119bcf551d5734c186268d57f61075fed348069b56a6c34e07db31d2ec0ad2a579387e396d9e96368acd5ae924fd34561634bf8355e32fc413ae83d8c6a61f53b12847e1377d0653ab545bf3db082c0574c2b89f1e18d4265e9856907fc9d6966ff796fcf98727913e480b08a6d5df75856e7c4efd9c72ed6f45048a85ea9ae5fc02f5dd22215c87da34d28816eac13ebe94950393026ea1bc112837679cdebaebf6ef125ff0279ff5a76cf299bb73b996d17d6d7ccf39bbcba92c179335149dc62fdd3cf1581b5226fc14e8adcc598e94a1afdcf97756c41459aabba757cef7013a6aad84ed9a46c4bf74dac1a1f5263e91a6e2b77f68333ccf0e940289805f2392f1e4990546d6756e073983b0e908fb0dfd0f356bc081ab65d221432ebb5eb3b61d929c538399bf843695529d87af60830cc2d1b10247c6ba9fe3c7dbe25e283048080d4ce2f8f9ae9d7ebcac5391f5ad60ae3ae3afee3539c27c2ef587d5f78e0be57a55e78cba29b6363081ff5920c9a311cf782c0d6d6fe42ad7203e6ea82bc38b520303bd77a1fb8c4ca2cd5d88842e9e1dd308fde5c96fa06ed05880c096299a22d8ba13c883d7c16f73602783496dc394b8b96824d2df4d447a78a4c75988726b4b9d28136bf58617983a4fa7a60b02c26dcfa4a118bdb1f6a3114332f27aa4a9d00f52eeb6bf3ae375be2e7c1660dc2576be6be107855f03deb50489dd7ac15d0a932cb0e0bf6041908e4c670719c04c6808067b2bc0a4ea81c6413286f329035fbb2e10965086c07d1d31ff14904f95b63f0cc601ea441930e781c38b9e7c1b5409df74342d2ede9fdd77babb6eea9ff5b5f758068c8d1e607b5ec367b70b236be1b962469fb8fa7d517600680021d98b2f5eb7c6020078950420a887e786ba1bf524514a42c5a2aa1bc596a6ee75c0faed9b5bacf54ea653148fe988aa5f2df896d8c7bb90d5758a9edeb3f4a466e4d98345ba47c0c8260f1ef51cd679f51d76492f3c171458d1a34d3a0eddac65c39b82d66a031efd863da5e8a8edc0f90709aea034e947d05598b95ffdce7102dba55ed5d18b4a5f35732be3145b29db594729c438bea5cc5fbf75d907538cbe9bab89bc873ced7dc224236ce59b1f0ca2a33d03cde3a8bd7e9be50dc1e97a099202a603019472d99ae52efea32a1b1d61926b074b04eb1420c28986a40ca3744d4f1641b72e74e34e1aa110c384a87e24b9361756aec770f4b7f5dc2449a37f2bd55ce14e676e3b4a591c3bdd3741bf5a7c20ec772dd85458d09c66d90cf49abc5a0c6a0ddbb9322e1512d846be6151715faddf032e982ecbc10fcf28e311478d3187649bf7f07857d3078e968691c507d84f67a10d7170dbfda27d9a5874160d0070496f48ae6e56077cc7432c5d8a9c7a882ed7671ebaf7eaf6dab3c9b776ca2b3980fe4a4d94b746d50ae31c2f229dcaea9cfcb7da7dae1d9f9efbd335fa332655b3df79588bda05c2d1ecd2712d9a2de92aa77c4f296d09ff12d8f18a00d686474a796249a46cc8a8a4d6fbedfbf02806605e20e75ec33487eee1a12e3b22cfa0cd6271bb8ebe04090c17d4d02e5e4db4c697423d7e3f21dc7b8c6e9d09b676d4b50144089b6c5c66704619d225331386d5d95cac184f566f516fb640ecfff06589fc35cb6ae6164369e8176e810cfdff169adcddbd6246b2f8d214c4656de0d5c4a9e36e6db9d62251547a0fc24a818ff1524f2cce168739ea7a0691f39eaca7eda0b98c24662075ef31ae20597a32bbfea62023dada7c769ebe083427f0d84e7d67448f1f6969d06bf6105ac71a75f5a6fcfc4d543cbb0bae14a6256302e85bec6400f1cf3226a480286d298bb9efef82dd3023daaba74b61244cd045535132c33d7b5eb46efb74a43f00e717d6f4ec0aad7821cea5e5b8705378ef4f4097759a4a10205f6e4cb340a0784e1bd0298db70410d1b0c9daf55428c6bcd1894f96ca106be130be8f02fe033fb8e853f2371077b6be21661b64752a92d38c6bde08eb26eb0bc8ee56c634bdc3a20dc0e39a9f5eb64181391ba86bcf89cdc086c76e66041a1a986c288f7d56a0a40cb5720abc4fbc0650815013908df7f62e589019d32e75982fb678c1306453396580221a0fb124673ffd5d389bfc89f7166fdcadab1c8a0eef6bcc0e165d57dc98ef784b02397bfe7ffb87a9e681ac5b291ae19c6634c3e957da86b867a83b082721e9102c3f4f46c11a83d9f8b3db7cc70853689d2dcfa209b16d72dcdb593680e5f90bf6390aaa83c8d63b5b1993e680b6a684a86de9d3755eb4afce7d4ef2469a3c80e8cd3ac43884d35076196212e6846f83106bcef81b5100d1b4f498c5d8bd08218c425c1e6fdd1fbbe239c2ac591ff2e67dadcb8a7c26d68b38d7b32bc7dd0060496eeb039a401fd017f131fd68e7f52148aa8c05084eaa2ec2ad1a9e846899cfb879642e384c582f9fe63c90865acac5f9e86cf25047005edadb5b88aeee58c2521853f8da506d4cd27f4f004207084719fe0acce49e5d7df9e8e294a7ecb1da9eb246fde10aa39a6822e5c72c7b22172151d20f25b3361e986c3c2cffd2298b06dd9997fcc9bfaac987ad4f8605acc8986a5f3394340eb34ebbe4cc273d44561300d8717e1bf5e06f03e2141f54fcdde7ce0ed4d08f6bde858e68ecae8c86ce5bb29ff4f5800afdd13e30bf38d7b6c9a7e36d5d3b23b1e2c52a3529065e655639693cacf3845335887d25ab731c5f1e5150f75764af95828635d5ebcf11648044ab5b03e897534a0d672d634e815a3e6c7d393dcd717b105127c7bf595408cf05ef67844547af8dc872a4713ba53cbc61feaf8ad617d72ebe76871e3584c6a4e5abdec8aa03bc835236474fbaf67b1aca2bc6c92f113e2016b8a082f42222a46c774d2b875a0ebd331872695d03a9dc1dab1b7328dc14b70254808815bab14022c82f376db91abdd39fb258924b2d72d4e32a037406ff35f9e0b3880accd6fa7114f176adbf64e7cc427397eb3b8a61786a5f0460f0523f75c3c61d53c718560fe43053f7cb71dd759752a1c863554a70b746f0a046b2360e9414b2813809c537cc6879bc7bd6017804cbf0ca40f27076405e52826893bc1cd84be203ae0fda812406327c2ee5f63c114c1f61530685c19c21a4b7d47b3428e6b8265b87bf0884919628a773361e4a536f981e27e5ed1b312d619128ed20db6605ea09537bc1ba8b94c6cee75b0c1b3182c5612e3538bb95ce03aec44e247cdca1c79dafeab88b788e9772e9a92237423251dad468db5b30a01571353291b591182978eb703f8feef01513f8b50326ebfab7dbc8e55752983011890a1f0afe49c59a3b94a0d9206545ba2293131152b55851e46a5f3f3a42fa8246a187e2bf5d56844639e117f5620c013f4737ff5334b7ca95372af59ac76bd24a99f1db815237923959d57e676bcf84ba93880f90c0b58c6ecddd1ccc7c00abf561d137ecaee52e7572e26f0ef8ecbf3506a7e4a40fbe11c17cea0767f75559e787ca9a49f9fbc39af39c8c4480001b3eff0bf0f5785de54de2d657f5bfd676817a32752199c7fc1a7a7838c0979613290b28c71d710191549e2690fe3c008c63b7ad5b2c24e6326465ea06dbb61b4193a982c984a0358085fd6f14ca027ff60ede9fae9211d301194476691e51fc20ff68ae9ab37c864d528ef4861199816dd34d8e022be72ad299a4a1f200f1d53bdcb7009d327c60523ac16b574d67c13e6192fcd8322b3a3175f501141c1c22fcbc132d537a165029af4347fae603cbf22a3d60a34d44adb82eb3f861d84761de0e0b895002d0d25e3072fef363e3ee23adab5df5e5c9d1a134701c4dcdfa1e7a431ea9155532634a6edf14d35f8ec44d5c6b5932943162b727a7c13a55bab53c1bbb1105f9c18f88aaf60e1d217adac9c70bc70bc101bd5468c9abda07efd2adc86f35c458f4c39385466f23622e8e436dfb3bc404b16df37864109f7d3fd33a09b9abb30b528bf58e4eac988a107b24d1b83c0dc7d6e12ef6f5b3ecfdf1438b2018c76489415519168d3aff11d71df862d12c4b92d8b36134fcfa5532caaffbdc0b3d4b4b67cb98be60bea991d8e338b1c4a10fee3d5134e2f8586a841285267e1f51f9da3c3bdef6979c2a729c67504f012ebd427b47045166529f9a6f4f7586b3c9d2ae1542665f6058143c9816f98b2519f63829016a30c57d56ce478b639666f9884fa95bb9497976d978627e7f069f172d27bd1ce0e1943d329821b59b2db7656d276f046255317d0c8e720a6b41dd9ad4a9bdf5e2e46116c590844a66ad139203ddbcc8dbf336df00175d4748bd6f197f268228ead9aa9e524fe5d670a509f3dedb3905a0b3d821668b6ac181d9d217af36c0328301ef389b1edcd62396092f70985a673b17b3c8925340e5c1379519c742fe8f262d8d89f295dfc60a00afa94bada75a058f5849361776306157369479e383ab6e8d23e6eb3d45228e755bd5d273965aba8b2437a440514dfca9251c1990f623a6d140f3f78dc3784b54ac49a792ade5a4bba5f87f56887afdbdef2528c3cc64797a4315aa0fc133ab2eff793d7354877e615c2029d28263eef5f32449f47d0a40e8c8e0752bd4e13874e3e8f6ae30bc824cc523363cb5853af1efaddfcb9e71b7bd40c8eb6a550d7dc6f82d859bb8f16aae5f96170db84b8c3223367c81a727286829536f53e814e5858a9b4cd463d28236b9dd6ebe01433d273c3282ef0db72d6a0104937104a3fa4139d6cee0a7bc8356328d8fd606f8d841a946954c589e31435640da3a1117468a84447e391b2bc88d781b0cee5fd8e831e8c716220e48de74a7bcb627c3fb34b1d888fd5634bcdc5ce90a685f626fd7487958a818a5437f8e63cca9b263dc5f57c508aeb06acc394513d014b1c52a3025e96fad98a41abef118f54772872720fcd83824e043f669c67700b47dde949d3aa760a91a813af73d35caf1e0b458141160bbd25e56b7e8618110aa2c453b58f731f02d16c320c2c358b24b75720bc3261cf84992f97d2f96c08478356f8b0dfc1782ac35f078ac33e05fb6b926ae98bb5b71ed26c2d2b9e6c3d0a131d41016b9d69c98c08f8f0e0f7b07c61468ad1f31babd5f72394511d1f999b79a09472da0eda2957ef6e082a6675efc2faea3c139993ef31dd340c1d8e0241de675ac9d41db3904a9dd2984a953d9bb537f1f2933a57b5a721752446bf61456afbfccf03d1dc478d998a69e78ceec9638407ba1a03e06f8277bf6042bc9fef44e3e04c0c323e96496b0043aa5271c1f369945d50fe1465e9677a89b68da28795a770089a48bfc4a69c9aed3beeafcb8e6e00a4de32dcde057a0e674d38545584d013ca531c481bcbb3c231416b8f2f5c1cb4546ca72124fd37e3c2adc79ca13ae5305bdfb5c2e1e138dfd565cef83484fa1638a166c97dfa2761627e4161b2df6e3184e71b135f0fb458a24e21d4232f918f172676bd3224d0f10f69af8dd19af37d0b135725dd7eae9760a46c0a44846788b8a2dfe68aa2bcf9901518074693fd7cb80a70dea355ae03d711b582dfac0667e4beaa2bcf9d73e3ae2c84b759f3139655756e28f8bd3c04ce3b06243ccef6956322de73473c7b153153fc8552e2be33a8fb5aea26dee1020fca66d8a313bd7bfd7583a83ca85ef9e1348659788785bb7b453b0c73df24656067de865ba3e5807a60a2b1f408a4f585772d1b140bf09694fa197528e98e968aba7416ada5f60ba18a4176b885d373e7c4f6b36e95872cbbc3fc0f8c23a6fb556a3270e14176863b9c6bdfcf4775dacdc1eb09ce4ed3e6ba48edc1e9b6f4fd8820207c3fa1ef58103d25d483751192001913067c5e5b2a5830f37385c90004ed8345230eeae8e9e816793d1a38300348727690bfeca7615c24170daa8553794a3ca94b9847eaa18bce6e02ddb759956c751d90e12040f48fcb60789e1274c268f254dd23de7ce8c10e0c0b141b14b036c90fef2823ad49b9ced69aa997eb490f4e4fc2f8d72626517e5c40078be9bc6c165493dd1d76caa2d4815c153c417506f7a1e05f5b70c304c5658afd306121d706f566473524de11866aa6282bfdad179652219f92e327a28c30cf403103473f3ff94fb0943eeccf8c98612c89a75b08d36b6c02a306baf37ac3f916b758966c6968355e624c5ea58d13736781c7e6a255f2a8ceb661e5be3828eec8eae777252d4b029ac6d79b5831e4c62238e6b6adc5f2bf4cf57d0ecd6d67989df138503333a99dace8660bb3211241a4d98b33f1ca7098c486e19fe6c286dddff5d38a5f228aeedcf181167d05a5cb378a3fc5360d761b7e9115fed2df8fa7d41d418e6fa2f6dd7209b0247d84a64e217389d443360b30c13fa295596b89ddc69209c32b5df652b5577c9d7c471cb1abbef1c8e1ec38bfd7b70fca420f7d67fb7bb3905df89135ee046ce942f60fdc1d90ff09d8d704b00622e4075772722dbc01c75fcb1ed06e66370970973887b6bf143cfff0a077eb97a8aab35e3d7016504cce973e75b9e56219d99b43b58d29d86f2f12f0ef9959d270e8352017800c0183509f7ea557832dd266d00d16281db2cc61aba26b73e0fea326f765a9a8f715cfd3e15357af2e0e893878bf03617893515830ccbd0c696468ed60f49af2bdd557e1c48533cbcf4c67d5fc1f233f23c4269e0b378d6cdd4de8c3d897936647894401b0dbe0b24f3093c7c2f61fca068d74bba2ab829c22ff4b33c7143c0b7d79bdbc0d1f076c94023596340b9e0a093563355ff044a322c3b8c295343ce947eceb9844174f02880a77c8b928490815061a96a9cd7c89c3e057faabbf3c088e2cf51fbb8c617b128f7fe7b813c8cb1046c265e70bd257efa051626f7de371387f04d9db45e4df19db757b9b95c25be43e822b8372ed148d49ce824a36da2b2f2e404d0c0c81368734820ac976e0c17736836fe4ca76c88524f5e3a5b1c83e5980d003b7a7e08943e3ce1eaa7ec904b376ecb972db147bbf79ef0ce6b756b3a0bfdd8342dfa8df352f803ea675252c7e45e692956d70362290e48577102c91eb318e56177c81414562c0f325229e42c2ed9980b547310098b0fbd7be84f1e021200c039c4615b65bc3b8c38f4eda4c66b42c0d3a3200e209225c8925db4da82cd27e123b0509465f998d394cc1815552e3c8c18cf685e35b2f302312dceaf2f3900d0b5b8008f9392d6adac4433c626ec19423135b670b771d9f2eef506dc55ea1e1776380b8d8d1c77530609cb37da298b9bb38294f624534d03123ff812a554f21debdcdc1ea0faed6c286938dadd6ae5e116127e4f1adbeecb416b1cc28c0e0f6c6d02fcc38dc2cb6189ff272fbf24dacaef81ecfbf98011a3f302ef6c7879d87b9046e81c81e873dbb147f0c6ddebbcb1963d6b7d4ec46835bd93da80f93cefd3ec15187a4bf0892324b03000e8240e2da0c17453993d54e8f79a88a09cabb7fde6fa187d4a5f7de05ae45f9e3c626197a59a921f573f6a464783543bc15ab361f7626285eba9c48bda40f9df693b39980b453f21076f1ad613ead7c315de8498c3fa8134ce43ef9e19427944ecf318a7484de6093830d900e33d7dc6e88b8e1aa30efefa60d2718f9e85687f364e614df30131585819476f3c07d0c7d7f642603b2c265721c9dce8d07641eee381b5d4722b7b6ee5acc86994b65b3662b333f1e2eeb1dbaf9e943265919004635179037c195eed7f5fee9873e587a2f736f55830a30be858c539e4b463dd6034224d334757462473a71c645ff1e09e23e5e8fbbb05af1dcbd2208853697472e46884ec8a61bbd46116f465cf87f0786764a164d86315dc674a0a85b91f0fccd2b8c2b7abc53a5dc623e91538f431c24027911c1f67cab4b9913a755bf109cebd8788fd21fe4c2121527ceb22e31f1c3ca34a9a06605827314c42cfb28bfd08d3594a4593896beef127226023c132e6bb6c2067040928b47cdfb60d635c540bd2a2792966d313e7b4167c0c921af7b24ae6d4fbcebec6dceac006a6d4ce993829f7b8112277cedbf8b4ec59244cd7ef79a7bad09cfdbd1109a1a7348d7f472e57cd69853cf4070c2d66e5ce20f37e2eb623547e154265f167d92a3f03caf84eca981ffe3cb45728d0c10ae43e9b44d09eee346cbe297bee73fb021ece5df72a10ec4df4a85539926137ce23c3a0b685826cdd150e1f4978bc6bc16c4384fe30c94e6600e63328d97d5fa21566b05dae0f33a11f6b906910bfcfea9019fc680342131a9b9cfa9f7e838d29317e26a4ba93b742d48d295556ec7be032a810bf1219eebe3d330827f1f264b5f09080265bce8c14ecb95698abc11434bc745e7dddbf45d35e2ee83cc4686aeaeb44594cd20e06a9c096849d9fec1d6aa615522ec6b09cfc870717587643f43a79f02ea2edd0db63e89b4feea3bbfbf487f1884c7d8c789c304201f57823b527352a5ca2efc55ef5dd3e251647bf3464ca9f6d5162a15d24f27654be5a76123395598fd7584a25b20705807f0c645b3df6757dc8069daf4945fa7bfd9db99fe2231414bac7ddb44b0e780eb35259d4d2842a362ae9e0035b9374f44da26cb2a566d0a7b7befe8f034c0c1c4dc9fe35d50c1422f48d16edee734c3a29091dff0fc915a5789e3b1a8d58482598c3dff2b7e6d9d0bf5080c3645e06ca1a423be983c2598a57f601db3bbba2d73ee06d9ffdbcc1abe5d4dc287fcc2b209bee54e6a3fb22e2e046f165b0dea29daa90259218f68220f29a778173362fea185dd78ad2dc083bac11784e6f49cde56663968d8c1c91ec7011f16301349b632a21525ab2ed5ff115e604d9d9759b4afcdb4ec6e997574ae8cbb8418c4fe4484bc953baa687b0afa82525ac81fa813ac857ace2940f68e8c7385aa176d090e5f7c63a4f306390c3ed5f693afb31263173793f752ded4d2295d85717736f37e8b8a8946ce2e976da50153e0997c1e0cb68a084e309a95aa4df3c2bf7e4843facf8d0f0b82091e95f7ab712ad0a154765227e0ba0d9dc37dbfdd447e76cb81ecf52efbd959be55edfc7d59579a4b3c09b2b523252f0fe5b248c21394a5e636bbc314579a9975c5db7c1f125140a25f2ea0ddd976df1784b3b04b38eb54c2e9cf02e72b358b58f4c83e39a4fe09cd444be2470b9565dd27e7bf1fba69ca87229079517d92778c6c1d0b7218483ff573ca419ac169098a56b63ce7a1f8515c6966f2f85799a53cb540ab72751628417511857f01dc13469a88f14af57f2f6947b93384c0325c8e559be6e2c34f0edad18a769dd5d5ca3879c5a4f1bfe5add743f1069ec145e6aad694846a0bdd37e70f9bdb9d443d78897dd51e83071413cee67631ee60ba89b9c0954cb154a7ec91b8ae7e2656fa63602e2127a9d3f3a975b6b07c1ba7798ee399050760a6957400532a25e114f5d3e6130f870b2d6ab6f53d08b1ce9e6a3d4feb4c7d1e098f195b6877997585161243b40805501c61847603e496ae4c76dd263dd27694867d21cb7ffda28bb246679e99756a20a9c0591f8fadf564b983b88f18feba6a2447d577212307cba16b191f4bbc7e25da6f7e1869cc9497ed7a14b3033a1047ecd67d88d55392dc5c6e71f051470904b9573b8a19a73bf0f1443aba86ee42d3e410612524f50967eb38b736337cd3684e5ed79d27a8b416ccc772cb298016b716dec877956f351354b0331c7ac5a3f7a06d9c781c36c6b386ed030e7559559b8a29fca5b02ade89a1bd2cc7ad894359b76dd04480b8386c289d37acf1e1c72647d743d8fd8ecc71da49ec62542f79379b44bc28d998d3ebb8bf54cd2680330155d1e6380504c672053bb913f7210e3955dca84db13d5fd8413aa3989a9f62d4bc002cec4ff296342c7bdc021fc6ca06eb1bdcda8f0fa4dac8f86c36d7a41d46844b5f1d63c1026056f09d595386744768eb9ff8fc76699a57e0f7cf65f92affb699c5f2cadad39e8c84433d1cc9d6a3d1333bcf7fda78c0f5da8b8aca0451a85ad4a8940ba3d095d51e18d801f7b6c330dbf686a0a397f3abce718f902f5ce976e34e2aae86c3ee39a662528a78dd4e8cca1946e7398fdb80a4f2073ee1116914ae00dd3cea7250c0056ad33fb513edeeeaeb36dd0527217c44541a5d813ad13b1d05d53c37a76473217882a9141f485d22b67f096d296da797dfef74799dc8f418a73936d428d259e3d3874ffecb06e15ac048f3da5b660a83ddaf0b3003f746872c31b22bbd417a33c50bb9dcddd0827a53ba24b587b5acf19481ab0e33053952dde739a33059dffa943670141e4d496bb5fd2364730295ca4d8eda7bf79bd561028052a448c38f1e892ffb1056263d132e387851e8f4cef450fd23df1561239ce3278696cc279289ec1fe2364d02675b0893ace2ad335e59e5f70ba256fe2aecc7025ce2852cf121052daef0ca8acd2b893746818c684de054a41c2c821bf237f8395cee3b7bb3d01b82e6a59766796cfb4cce954b3ba470e42bdde6615f8467bcf50e23b5bce07d784512bc7a3d7304a4f9cd86b3536af3dfb5d636ba73e7625c5efbe9bd968110629fbb9f3cb7c1ddcd67cabb8c59a7508b69908557fe23121f9baaa919b19d7022b868b5a5 -MD = ec4ae4e3668035491074838888491390f18c964bbf2aa16f44f76a167ea90043cbdce5fe79fe09c2e78cdb1fbfb8c3eab143299bb7ef98f9787a4a9f94ca413e - -Len = 62008 -Msg = 090d8832d14f33207b3bf973d374be0e88082e7b46fe01251f2e7dc82f563d25806932fa2b2ae731c0fa0958e8ee26514925b54baa5957f158b35ce0c8e4895f7d71184a2c4e01501faf785fd71bb75bf5c2fd165b10d77d8e829e0f5eb94194cacd440b1ee309e45e024f6fe722f89554860fc69f4c093288434b3c3bfced2b2d24be2347108855469a9572622c71652d1af241bf357678109d6c4fa5d6168e6f1e8c7cf0fe050a9f20524f8e60ab344a25ae7102f2a5b8ec38082fe56f43245864b8fd60d5086d313b8eeeb4e72d6b71504c3cb2ac1e58e5bd27c643eefc55af9e4a8de1bc19e5c39452371be87f706b43d38c158a6ac2c3d4d1fb067bc9893e744816b9dbc1da1fd2a5120d8c2aad00a54b4875b5105c4e240fb678403328cb8cbc7f315b87b40b9e9067d0fbb588f71fbd58185498904e56e8dfdf62c19a1f91adb09164f4dc50a01a1ead5ca86b1a5830a447908bc58a11655f840cfc4802292490211d8fb8b67f4b1fecd78cbd2ff9ac1349917062cbfe8d1caf646a983bfc280929afe0b104e42b52d596e8e6ffa9398f687ecfd1d9c568ffa89295f394b3c102f0426f300476c39fb0be444e5211e000ea7f31797c0dfef0b6bf05c2d3f6f764bffcc59b7cde1aefc47a285df0d8a84c18be1cc27c7e58d82213406bc16cd315de08695b35c338285af01d7ba0a79a5c3a601b14a0c17d9d35b5d05826be5cfe958ce3d9f7ce2634ba48aa102b26bc189890b3d7b17e752934ce3defca949b072cb1bc7c89a7ebf92cab58845afc186879746e73785c49626a850d9a74949619ea9e7babb5f58f61f841ae3ff3d2b6352734d351ba0400321e03cac0ee69571a187ca8d041601b53653134a9be4f9c65e8f96ad7421ea280976ffbc8feb9e6f4fe72cb52f69296b6bca4722a851cd4e205ebbc6ed75138331ef2291c6d2d498de4a96d999c30087446c1f12b0ee06692c631507e4045c835fbb4db23026c8acf1248150dfbe57a7448b138122244585f72f4ae7046a35d6d76dc9945871fb1a0cf784c16da56f29e0d9bcf4989f0b430535b5faab113fcc3d793eceac2edc4ea6561991c032e7bdadca83f360b8b82ecaf8fea96493caf1f65005a7a7d7fcd941a2a84873c131a10fcff0f4370bdc87dcfb7d79bd5c77d69694c6d5d7e7cd38637fc95bf4eaed928b6cac7d77f3090cafbfcaf201f5b6f892b9eadfc8e8ddfa803fe552c01a6bf0a522ef0590189e1bb7a86f98feda18b68f31fa1bd745af8e2c8594b361ca3d49f18551133bf73c438967c3d4f0841dbec09f6d109fa8a261ccc340046694f21cd4f67b2cc7e943f29950604c838e267feb44dc549e6c5713e59b8fac2ae4fad7d418b5b8c09945d76c04ed462442c35873e4906e301b5e230b50cc314b44e819834ea95db271c23085f793885f6c9506ded141b41130080da285ae3a243f2a30471ace7219fd49bc5bab2b599145ebd9a0ad68cc9e44e5424fcc7e0d623e31dab40f8dac63a63cc96181fd506679685f4dcb6e2e53b4864f7777d44171bcaf773e8f6f532c072be63c3e81f34b716b165addda4fce195ba39e3a496ccf44f3746b3d0c0cef9a87a1501361b8ccc8949d4c3735a759fde5ed486635f5f7619e70be7abc300acae07921b3152746d955328689f8cba3bcb56aea9e3263769d10eaacdb28731a32b6dc459004b5564e2d94be189c3327d03acb1934c73bc951eb50aad0a93caa4c8b59202cc8e987719e224795a86452f2f68c48ec5cf56c2a9e315cfde6f31782de6e360bca4a36fe2779b773a5e5b17f690cee076c06db71aa0b27a54a4d0e70108a1b9f914e013e49f982250d2dcff012eb9d288d0693d18f4c9f894b90eb8ec24b356aa66b52dc86203c4c56a30adf8496cac2387b21c4be8438fc73652b59840017ff8238c8335c8c4a3c0aec0e981eacfb66e6cb01c5c83068815a406a4aa67737b0bd2ccdfd4dac4076a27f27d4718ca389207cc04f3cefb2ba589914ecd9ef1940afbdd074d9fe93aeb5c2f2ff0db4579b7e06c9eb7cf0abfa0705b7ba7ef63101d2727c3471f1c836ad5e0c9253b28c20380fab051901c8e2ddeccf2e061b1386edc12dd6b6346290f1b6b118d415b5ba16edc03681917de755d4c7d21fcc35422a5061b60724d7504b53ad0d1f4c68cb7327c5fa570e5f8a07443e212c981ac64076b47ce551baf6e2bb3cd985d529d6e55408cb09f6c24d5ac19ea5acfd4875a8ca9275f12961f780640d28b82e5d5ed5e925130ae96a93c8b365da117a22f2cbb2884b9b3a80c47cd48a5526d687d5dd5d977cea349d1fe9b020391a7d5ea031c5025843f38c00608330f9426c4dde5427cc731886fe24364e6a4d089530107388ad469bf2d81db4068d8f9b3df3dae2ee5060164ef25326d480706c506bc5f963c570f3a7198eefb51c82b1ea3e5df217bffe840b1e2f43e91f5dc61d46234bfd07720b8eb4d68c455a7cf6ff71ca1a1a6798c239d61b05f2a36f967a73dad39acfc414283e77120dc3c90acc22c1c38ce3b95159be98f59799207de6693f38e3aae1cde21b030994e5013dfee5b776d5b0eac1f93c3b9b2e8d1abcff9ad2d45e0555997adeeceb614ab030f62f2dbc8b5ba79476d3855f5deba8f4147d384e708b8a0720fea73ff9415064506386fd24507a397118e8ca7c3165b3c3a4c20fb19a0977930ec45fd3756c488c2775c1271bdd317670d8552feadb7c9b96228097bd5e9b3f63b6f376535e7e07ef5c911a2a3b0ce58ff697df94749eead5bc49a951f3c284a211736877c145522fcdf554182e3c4caaa5fb11bacbcb5fc801e35d14639e115e4668003f1f5f096d2c568b4221301a6589075cca3b6268f195b62961187e53dcd839f435d32b8c2bfa4d2654be98ed54f235174f6df484e6ea6a94d49ce3cac24961bad8773b68f0da419bac50c723ed741cd7b6be12321c625935cb6b8ef4831c97aab395ff0e302ecc71d5726b5c83a12724acb61bff16b00a72c20eb05fb3b4246a4399e70a8e8a563f5cbdc605dbebdc747dd0a25a4a3606d254f0f86ab8c29060050d93ec405f676aae7d879e4ad6b55db6b815c24b76d6eaf0bcd7b426aa7432646b86021a20887a474c20b444d43a26e3b716c57ef4e31331bcdeba71ee48480e3e2e0a506031e4a39411b67e76e386917805e27922c3f1748b6dec2f0075175ef00c53a7b0ec40600feb334c2139f32c556397bea2e1ec55a305c7b2738326d31b918c74751ff3f8fa1da93285b5d330d9c053a3d7d58a319e56eba0da1b0d072b6e033b3f55a5eafd1996c5f6efcd3b9faca4ed440751b4c7a1b67e86752077a9e256807225ac92836f7a7b07304798f17919ef7a0fb94bd9a6c6a01b5a178111af04d8bff89e9c279fc2d6392fb8f599c6112edc5747632eb67aba0b1248cffd248ca87b56e264542b0e4c0f56b7cdd30439200d66728741516130d8363ab0b6d35c7426b91e978381cb50fc1dba8e47c3e0676fb5d144bc181888f54e63eff94bf2c054a7b98240447889721d47b35285a56985edda17e97aff36f4c36aba1eeefe1187ab39d114e3946a13bdd5d9adb9f6bae246f37d73ea83df692da5cba24cccfc322c15e07bdfbd575377eb6d93d162b00789b3e1c5f744c694f5ab711dd5edc4e6b2e45cef9941f5b3e3feebbf7c67fd580ea1e16a11c0a13aa3f2670c2aef1007c81b82dab0c0b9b78a96d08b1b84f7764e3408dada75e3bcc0f109d7ac3f7227e4221ee7b6c807c0c439b8812f2842c4d0f0a492a1d2f28dc55dd61aea6d4fc98fae7d710bb68472295e102c37e043d63f4e511c18667230396f484065d72d6f33072b11301aa45e428a5406c64b9f2cd1c3aae1aebed74695cbfce29f2b7f8b66c2a432b462ebb78835008b4aa8a92b40f6fe9dc53a963352ea507c06c8da90a3677570193dcf4062f4b23435a5e673f53ee88afc7833890950ef672d4db331717c1b33cef9c37b7b2fd59c27b1fb797721d533d4e633aa1186264e83189dc04967020856356cbb296cd71d916b4cbe3f466142bf031b2913f0a19ca8b7eedfa3cec6684f6f2f9206225352f3205eb4c5f309124b5d5e887926cddbfeba4ad208f9d4de0b05809299f6c6b6dd7fa5efa3de293cea63724ac9af1786f58e2669f19ec9d42997043f4d409dc3a0d7b6e1415e6e2d1ca40ae27de01b183da205e9e623f1d51ba23eeaa8966503fdd7061c270a346d62ad6cd21e60551a37946df46f0ff96b61a57547247ea8f244ec1802ed5818785cce2cbc23b6321763e3d2fbe4d95d118c1f5bb7594fd60906956137dcce86c85ba4dee316485e6a530eb962f01679320b8e66cdbfb078c2b351762dadd40bf7ffcfd7f97e9d16bd757395ec192dfa7760610afcb0170dc9ebaedb46b91f1461a98dcc51b53b177b5bc0fcd9b8a64d4c1b35dcc6d30a1159100be53586f63caff98d10ae6298cd1e766562de6715de1a9c8b40aea0f0002ab107485ca00ff12d503c3941ff3ca42145df4c4c9cd3497d84cfcb26a26f66a95f1f593e9ca2be845e29cadef3ad292e4aad3db6d2850bef3471f0c14feec14f7ab2bc5dc575012f73c439b7e840e890154d9b9fa09191ea5c20460111e48c97747fc62cc2fd7599219a0a6f35ce5ee1063f0a897f9f77e93c393f6890e7351c0cc52b4e0d82685bf829b187747bf8bbce0ffee6c7f52a76855b415a357d6747842140141dca75e257d1c3731cf0426aad2eed4a2239262ca7d4f078780d8fa48b12a9216c3c1ab6d150b4d4a7b1d888541a5a2616d1f7562454c125e11e0aad7227baf8813db363e4f50a0e9d37079f3360ba0d0e662a8d7b4937f5093584dce9cf19fbf565fc54135d378376066c19cb70a161815c1c5d1d20d96848da7abd42873ace213b4211dce7d1f5ca968272acf894b6082a592faa8a09e2387358c92cdea1c19d342127b2234dc7f37dc7442837188d1b677d9f73d35e154096ab8af933c388e1d7160033ae1f6c8902b708edda81593389d60739ab5a5409caef6d48252486679a9d25c1d6db6603ebee3b6e4173acd9081f014c506330ec76910a9a31494cc6f52312fd3be646fc9fc9562a0a63fa847895082c812d3e71303ccd5fd6a63e688d4452365be481cb74c4e391a3e6b4be41f4a66abbfccf307e4f301983dffdc4b97d6e1da53a9909218d5e359c507deefaaa46874f768592b744dd47d73aed74104ac103a67d1f3e1c7f30965255b8bf192272f2da1ed42071ca1f7b3f6b9fff0818e598ee1066c2dc170534744af78713e9b64dda5a4d52442b91142ac687be2774664dda99123fd6d1468060c4bcdf718c8ae8debd53b09505bcb337f02749f4f9ad82fa7ba41d935a6f1aa6376b30b8775b6445ac89b3eac50cd8d56d111ad6f535e8cc3c8ee4980f0953c337a5236f36c240adcc41e4cc05fbe58181b7b9641399dfde50551d6b7b8fdc3639dd1ffc4739fe75813ecbaf252479daf29d9e22b133e89f5b7930740c7d047db2858ef6353cfe4b7fb2c10acf00f630243541797abe839db27db6584e5b7d18363118c36d45d08dfc507d75500bfb2f9b014bfecc744147f9d5277ebd95a6743952261a6bdf15cb9b8a496544bfe927cba40619230f922c96020c5de6d60140307b3f31cd832e62d1e2cd51399750c73a70086f1aeb06ba2ba6cd7c36772ddab02edccfeebc9b0243dc61cf9b1cb27c6c07eb5710811f8f0f15e36039037cc23ccf773b5bf5dc2845f9bf46e5da9ec5e4ddf767a08c3d09d4e206907b058e853adfa70aa1c972237cad2e4da63b76121964e5174746ffb8f19d7f8368f7c3923ef1e4c44c91fda23c69475a68c9c90f8e2f1cfc715bc82b09aae6cf7f44cc87cd98a8eea909cf2329d092d38a00181cb7bf077dbb3536ce619cb4bb4a96f9c44b267be0637b7704b955897f9678d3b83a774d21816dbc11bdd5620d4748ebd65c3dc64ff87175e55f8aa3851a9e9c606afa566e705fd89362f7870bf1e5134c55412093d4864c33a0c269aa92dbc2a3edbaabeae4961cd1f5758c5dc6f5f084eac3134284248a8e11af54467bcaf6f1272ac5fd6aaae95be9d20a6952e6141e615606e283c691432693ebef51e6a9e69bed2d3c8f08de7fb48f59c5125fee877d5c73ea5006f0f15432a91b91b94bf2d0545a1ebe3a5cdbea2012e791adf04e8358f2c075403a272eee1441d7ad5d845902c51a64b9f4eeff16ce473d6ac9d217de0c0b601cdd331b38a5f8705d7f399a7b06b63ef2272767e5e46a8210cbc0af5e1831acf74ac3ada4d6a61823f171191f9788998d7423b91fedd80c2a7678be5bbfc9b85a13575ab53ee12bab84d95982e00800e65c526727430648326a98c9495b4a2edfb75cb6ec4730275e89c0d027789af1976042068e9c7ba2a3187f54b983195cd2b74226ac87f997b770c6118fd9d8081af050fbc852beb806f0bae52ecfddeeed83a64e8859c3f930ea57922e8c35a0dbad2ddb76fe3604d893c9ff1b8a0e318abd0773026515c8755703d686084a5873f73709ed07780592622b17024a00e124b3d458ad126581df37496318c66cab5e5eeb2bccf70b26befc6ca165a87c6a66289b43eafa49b1e91b96ac794f32f5f554d89589555604d8c2fd32c7fdc729a95bdae93e7528d51d648a370a1b33d4f3798dfb949aef1c5a465b5fabe287cb78edf1ad2a1b997806b282775db2d5c4c32d59b281404cd9cdf7156c83df24bc5f5fadf44075f1f71f761e01e69e9f51dee0ea5ed1edd5c9ae75aa0de24c2478c7113e72e3ece8fed23fcb4b2736f6e8b144ae5508ec4058661287a839c20d8d3ab3419db718e4dbc97008d7b2348315e4c9243998c3e3329f8e4cb01cd9566644b645d92c625c3a6fa7552bf9ffba45e3deda70f42d54b4c52957d9edea85905f8ac9b9a651d5773f464ebc70f1031529063f9fbd610b6b5174377a3f7e2197f5a12bb3c77fe73ea2fd43fdb9c0f3f04ecfc21a57077dc2df0f6a15842ca0e9a1aa1a6c0244e7ed550cd38426e81353afac107553993257b85b7e304e4e8a11de05e426e9397e0fa0257bd46acee7dbd62b9935358ebfa697d8d25f008c438d25353788ded600021eb7bb72d7edc7e55cbecaee6f608c1bd80814f65d4e73d7f1c87316759324814b3400c400dd5a0c9dd633e583b70e440389a49a970d816ede302534200941f9a03afa5c781604be341252cef4eadc9ba4ae0fb04051f2de44fcdc7670a0eed7a83ce6a0a0206e7699f3a61f45847daf3615b4ec0bb45e82c08ef761e9e281b7ddaa74350b64ddc249eabc4ae80c47db223142824b9d1b18cb77047afe46b0f6bb04219e3c8c093dce77f3c67efae1cc138127377284befcd04592161055e320cafa5d2095ee4725922beb365cc8c1ee6495d15022f3b09b796b1ee7d298aec277dda580ba143e262f67110f240e7ebeafefef80df72a69121680954b7775a686c2e99131b8644cc10b9f3b547346eb94fefc02dfa8a076a62bcefe1318a9c6ef27d867c2cbcf163c0a501bd38c3186aef25f1dc26923983b7ea4111d34aeb62b53b1c108040daa9c9b8c9ab9b43024fe813030fc623d3798b609b6b0f20adc02f07c864989a56ea8655c9f4c12cc2d4e547622d6bc75bb867c06d5167a47a23ba33fa0ce821fcc2a11c713d6cf8c09641239dd989f538dcd78a25695f5ec6fa01604f6df18042be846d6dc9d12f920086481488a3260133551e521768b82aaf7f1d270c372daf2acad90e3ea0499da04f2574bf49e23b686b0d71e016390bd09dbb2f6c4ba2c8b3ceefd1004ccf7a01f63c2ce1d0a25de873c81367da69e0f9e7daa7028157f5d60b0254c359498d82060cbb94e9fecf4019eea4f347b35087e7fc5c638ad5dd0e29b117dc38106ecd09079f4cf85025ebc7d1a526c0bdc10708808e13caa4d4c8958c88cf7bdc842f79cd468e8e3ef8680821a286e7d1b8f3d407da77c34d8391c8f5262197066445d2be4fbe1e139d21555f1b782fa7aedad512b013f7184ff64e7b8e571c16858c9e6b29601a96aac429da7e9efaa829288601ad7cf8cdc06290901ff46d957e8047445229160097bd00245a5ffb4bae79618531272ab65b7329d3597e2e0bb5bd77fa585d9319fa7882ed2d2f841aa529f1edd9871f7a978494a5d958bfd1a1907acdba92142b3982fc6565a2378db3c6a1dc05314972fb234b87fe08a58fe8a5fa5ee74b1bbcdb59075da24c882d40ec0bb052aa2b37fcebc90a662271aee16a612e6d0d0c5766872e164182f861d2e69a0b30465752232a97ad702a96b7325a39acca4c88834199cb2ff1e9fad3f062d75d2cba3039f48c31d1ca85a72141f1fe6a7d8df2b922ed791b01e621fc1fcd4e26b66a5857e77d2227c3c8058596ce29e7f535ed61510eb268100be032b7a258e84bdb32448269d3000a76444ca74b4695cff8db34727a01879acfc8106e7e92228b8140784bfedf0aecf4e5ff09f5def47c3b3e7afdbbe0fa00b63c3d9abe8455c3f1258baa98a0a909d85d15256a4d94787199dd5950cb5ff033dee2c2eeaa02a3af33c724c3c25aef953c178ff53cf653308fb42bb53af9d7dd02d88d7b7db999100dd3510cbe90eccfe57eb043078a8b0c6297db75ba8836266a67310169db12c81638a5dfe00bafccfbd32cb047d18e49b500eefec46b79845817741d18e7bf3bef6fa9b9e0fba730e18d5be9685bdb8d1987ecdce314309b5e71cd0ae57fecffebc0c3273c1141703935d43b039a014af2854b7c8122e9b0000e92676a043a68be0488a45bbd2d2f65351c41841c8e17c291817a49181386df366abf0105062ab88360bdca8fc8b2e8339a897443d0581c25354285543c743e91bc7e6502fe9a7dd5f1e002e982af4499e57f5eb086a061c8cd61d077c30cb0991e31e08e825c7064a2978f5b09690cd0639fadd30f6525e4b054a4e355b4d7c4f6562df81fc522b7f960da64bb94a38fcb66ec2bd93afb1184979d375301069ddb7787d0458927687cb87e9727a69b205361844b828633d7c0a703e44975ef9c43f288b7820cd0de932ae652cc13762ab21c109289db729feb0f836aa787d538b673cb1e63c4c182d3149c38176fa7175df31b915daf39e27a3d963b0bbb6a1ba967a96559357c0dc3222aa7982fb07ebd830fd87c65fc37d4bdb6e5d485108da33ace3cd0f352c7d9cffc31dcb824a9674867d874b43c18a11c6ffba0796b272a8983f5797308698d7a9b6743ad765fd1cfae01c50e6bfd65b61bdcde0cdc70a5c0753f9148ef3b54be82a86b7417ea93656ce4fbe91e6e7927551a0bc3d6e2ab7c0c7bd6c989d5d6083c85c2b09be202c60f1277b8c5e471fca623b812fd05b218d42ab8896ac177e4437fd7c784cec64e1eeac701f4e7e682899a419eb152402346cca50d0486c0df11f7194d4519448a070e68592de12d7579ee56ab9640ec27eee22ac8d97e375532ac15965f4a13e671ddea32c388dd31e18065ee1e5a0c93370bb8517c4041e32fef4b5755e9ab0fc9d9bb0368177c347b00ddcaac262801b999ec1b4f557705643128f4ab6070528992595f8e45611980d04cb5e20dc4dfd12d24aad5365d486a224ce2d2571a5b3b9853bba87b424dad8f215432a9799a3825f064a05b5b08cc2315c66d35ff865a4c289c4921864d4b8e0a1a1051acdd3924edfd233cf6d2e4d41203de759660603e4665d2e0b395056d557c2dced4f56eaa6bc8f073c7435e85d02fa89e7575d7df4bccf83140b1459d91fedd59989f4316f84c7a7832c683d8beae4e3923333bbf87260b8bb42ea6af4e16918a5e17410b121c33b2cfc91f4d5c0441ae1625064fb7059f5884698312f857fce99c1a02e757acbecc04e76b5436c62595d4c7c21029e02640480e65591f3771ffe903e34c27726e1c689e127dcd786c68c597f9a17e4a22ab6569e7f231499325ab617c9a1001e44c61498f2a8e7f889f8f22076412a827226318656ecce2c30389bf39619fdf93a485963bfaf85ffcb297d285e8958eb62dd7a6883f40a7a401da79a42325600edd5bf0c36fa9ae5b4a66460f9f556232262970aad43b1c98b9342d376f4f47b85f4ae59fe900cf06bf70d8df0900c72db3df2347de2a9623921d467da68bdb2292e8e14c079c56919a4e27aea5f6222b5f7f1b09ad8dc8d7150c51f15959aec020ac80323beab98e53549ee906c417ad717fe45ae2d30925ba67dc1d08473733810c2efd066a8c4f833acb08abe8fc16a2580ba5ee98fb820ad6415b23b318df2c8e59f6e79a336792672897f5d364095aadfd85415e048e8ede2e564c4ba8358bb99dda60083379194034117521c3f812d826738b90b8adaed60f78d27f89d9470476f2001320d6807c7a0fba42b055536d32fb1dbf7c61f354414d66ad222cb6f551e838797002506266ed35b49dc3a4d39f768858e44de4df804e7972f5c28412db277979a5af11a88724680600a58fb1c8905beb74b40bee28f67b5f991d06d35f3a63b2361f3c95575fd1957d8d6c7e4ab2f8f5a256d0e6c7dffcd170aee7bd7a9b57a1a5f549ef53fa031168edd3afa268efe60188cc8fd9556e6710fa8f47a9b4f5d679a3b1ed098d6cd857494dac4c1cb16af6dc671fca01508efe7265f85921aeaf35bd1d34e4847f78cd22432ab468edc306c4293d367e33b79dc91446256be2ba4e93d44d8169cb613efb4c7187b7e5acb5c29b5e9af6988f734112b78afe428638ea8f9d4cb7d1302146d23712a44976987a260a6434ef65138cd9d2f6534e819903a7bac2f9114418977cd1f19889bf033d61b72ea3b8e6f30ee21ef3f5573ac381a51c60a81c4b896f94d8b11f16f4aa9ec6eb56bd85739649b402006f0d106ce71038c24f42850831b2c1cd9271a5d310de1d78fcc59981bfd812a82ac0b0d9a661a6445934aef9707f1 -MD = fa933b224e0912687b04a51ddbe1383a5c1ccfd2c0c15a3aa8b40844fe70f356afa3a3317175b664cd3e01854adfb1e2a6e20fb2a4720d53c4fa9ba555dd5e9d - -Len = 62800 -Msg = 97fa3fd1e776ca79582bd034ffebae7bc2141db6bd62b4ade507af3febfeee56649c411a2668e265f52c43775f4c0aece4575aeb5adc559f907fdfeb324ba459ec4a5c54d2534e98002412e67db19cfc66bb76c448a34dcccd81aff69b711371792d1ae7b3e114f8c03ac6e823c06b948f67f8ab4e60a41ae435a8c8ef154384516d023c91b83e6f7f97e6e417247f9da883680736bb63731cc451c9f5e23d7bbd319cb93480d3e48362fa442283e0fdf9394f3fc65b91bebe563262777d083f05a171c764e2dc3e16c48b6f0c86979ecaaf34bdc7e936e31212d4f93b91acb771e608cfe88560677ee520cd9dd4aa66630d9fe8000c5bc96021bef80bc432ca4928e9378913674603ec41c69d16243f0b7c18283b6d065af0ab78c5adbea162d48e9d680f31fac3ef0276c2d3f30a100c2428e53eb4427d09d78bcae92801665b41abcb42891fc6884e4829081466c1ac2c5687d288141af5cd7e6d89aa5bbd26699bc7e9c3e03718f93e6304203f3934bc2b76bf91861afab6d91853ebb6517d2cf6c3ce8745fee52ae1d88fc09e62ecfe2e1bcd789f6361ba253211941a09a8b54329b77b5504380ab7f1719c8a231b18e7dcc4e567de7200e923894c8fcdee2a0a606d4a182f58c14a14715b0b640a32de226b7fe77374b1ad5284bc1e8599b4d4d0b89a96688f7622aa59a5290d02759c568bef260bb1f4fa29c98cce19ef7a27e15f14d8982351c51cef24ed074908a8deecdc2c8c6ff2560f2263a87239a58efb2c5fe5a55d7bbdd0fc7d5e3827148a2456ef02e0f7d24c6c55e9b276be5c8e86e523c579851c9230475b8589e6c1cb8e91d0afed91bd61a92bc7f60ec8c8b1ea530a81fae35bcaa39a6468e2cd36f28664263b9d84db1f2c6ca57c239d107e8f3eba2012be61ef90bb40112c239c8773999aafd61a530d5ee02a4a9b865e7dde6edbaaa8605688617398884d311a12bdf6d31282994eb3a74eff6a60cbd7373daa1628a30f611e7d8a14d32f3fd91ccb447a6c884af39a7080cce458b4a53315bb13a1ed14aa384cc85bfcb894012c074a36c6d0756b491f3c38be6d89f0f9cf6a791d6db75a5e36f5160bd27ab9cbd8d2b0274262dd481e4beb028691df12d17df0a40b3f9919a3d8ec0664372980a6a28f97c6587220d3758eb88a159b0585bc223faff68eeffb3a86f756147ad3da847c1e44a15258a881c9e6635d4c5a52f1b4f54122626aa6e38be59059d44cda3d1fc5a483a47803394396f8b1189a9fe251cfa90c3c120c9ba4d9f94e5e740f981f93ce4791094e63a5cf31592a4cd6589fd3cffc456e962a79da7b3b41d2e15c2591aa344092f0c8969af69ca8f85e1b460b9c39a506aa57b1f0fd67a4efb950d8c52194d99b5130bffe2fc4bb279ff3ef7ff60d8362b2ebf523681bb051fd3ee13919ad86acd963c703c4178a5f01a84236c7be070b14afec7ca29f8d8217ece7f57bc96d4ef02858b19dde3e2bec01e638f5955b883a683f02943b620a6d2293ff302eb608fe481711a360fe10c8c8848d69daa4618ae195be2637576f69aa8d611f248a636b8cae2abce7f398fdc3c33e0cd50d1f6ee197b641da963b714b7c232ff511e69fb9c504d1b9444af3bb4c51c5cebb494d2fedf4cb6d44f5efcc084b4ae77219039a03a8cb1f1aae1277c6d17b0cd9678e943e80ae388c264af6dae35744d684fdf6111d90619d4dc3c1dac318d88d019bd83260d0839455ea919af23d5264b0f694966b0ac7f4ae6c5f3031837affa0dbc3729e1b96840a3765f081e65a4524573d3b9b1f99485a771a6f22a43a59cbb61ca64275b885ce9939829739a3a06886b9a8b4b91ec0d74aba3f9f635fc00b94ad7652c833bf2778d6fb3c1e779e05edd084bebf9f85af4f074aafa8335ee7dd3c88d8fb4d59a03c0501787d1c6782f24a78c21964be69ecc9355a5bfc5be7f99287dbf64f7bbe4d8c3c543edb2267ffee2bc6afb5948e8bc7aba86403df9351771964a1814f0b133356d74afcf73d7b8546d569da2fa593ca52a2ab9011744bb3e67ae42afa0ef7c4f40a87c70f8aced770f42f1ab6366c9ad24f19eb1911500d9725a793a74f5f05c1f3de8492d95fac522de9bf52ca7dffd4b8945b20f2c94ed46dd2057c57b4c0629c377aa8af98cc93877f0f2ae830c100e305294ea01c3e445b4dc6a1ad5fbb820d7bf27796e0ffdc0bd9536718eca7fdda559ecaa2b3a590f6001e3fd9c6bfc74d90342a159f0cd5bfdfd230e21a7a74a56a00bd80f44b6047d3577e645393d9636088e7b53ebc25ad7ad6aecf20020c4a2e974ec349f85a54afb885d56d01615ad236d6fc23d775dd90a5086667076ed388ada6f2197329277a887db47bcf0737cd852174b7256c550a88672f575141475f88ec95cb8573c81e108d8ae7c672043bbfeda5626db31fd1c7f3b358a72eaf9d714935c9f6e13d8198dedd18ae4bc9032a65168d79f143ccaad379d3d3dd1229b0e5597a8e1a908d679838764f398c0d0eae4f9e0fcfc7e279300a2e9bf578eb8de7894614c7c928c7e2206970e55741b5f3d8fff8f5b5fd7b31ecd3c81feacb50774d95528fee3cfee41f59dbf63187665a3a16fc0a1404f9ffa92822026eb140bf2ecf0e1b09b055c7bcae561523c7680bfc4de2b7edde3bc1c99770470f85a6e4b35c1112216c14b380d0aaea33e9042fa60b74a3477589a0d2877c95d22fca1165a5231d3f5883cff1289f1c6bd582eec0b778762ab02bc44e600c95c197f46cca100be46a5cea44991cfc54d3732a6fd3bbb7da9f776854c489e9eee3a66c1d6c06930eaa60903900158b3972ac43db667ef975acb28a79bd6cdb494042794dd3f08144074cbed7ac7c127450661759026805ef5c49d75ac070a94ee154652485349e2d8a08bc4627b75aac758aec122ee1a5f1b425982055fd1da4cdc576c90c3cb2723a7cd2adf9302b8aea010b2e72519f23be2c14f2047bfdf40c7bf565f06e85ba20914834a84d4cb6b6b1bcd45620bc2c814795f9565212e5a7602a1fb734deae422d6505be7887d7e184472c63b6c4b5055f615cd2eb2420a55b5c20ebf587f5aa397245c318a2957461f35f207c7f65535ac14401acfb4c0e53d48f13184638609eb71f3d94669a762f099516d8b5e57222fdd969fe5e12eb32db95b807e41f6a427cb9b6569b8befd8d1f5cb332ddc6a9d5d42944a161a43dfb75a61292951d20f093bb5c50913e74393a8c9f6b0f344b529a80af6ec0b1e42b00596e6dc77a0eca5cec34977d8675897d6988706d20751a832516ca58e844310bfe0a6c738dac09a9a674aaf8276ff24a5be50f720bb582309f3120c4a7eca1dafc5d1b03d8a752ec6293077ba1d208440c5b74b8568b4e2547852e8e813bf21fecfcf602eb7f2aa7a9164982863a3fdcd3526c9ab174c2d3c6693000f4c0a62d386099fb26a1f56e0284cda735070d87594043a37d0084ce9473c1d682f93295771e53471aae4791d75510443ec705d5f6cb966d499d08682a2b7079ac743bdb118cce9147f295c5c00dbe0424089d3b444ad15287c8c2530006b864e1900680a03278443f1d648c35253341653a4849ba5480fdb80246f1ae8c0622c2fb3708abb5ccea509d3837af21fc9672daab63d16f21b96ad80ad69e21e62db10451e58c7d58fe3ce0855aa68a967ded781b2c11f1303010c89264476ed5004c49cba9daff88fa4495e087b3d58d5225813c05048138dc3a42524d42d95f24e54a28c80fc2f959180bbe314f893dddcb84627121a5a82847e3ded408e7e1062c73ddb2a35e16b527d092d9e21c445b40004312e1c50a9eea0bacab1221174e72557f1c3e275d78e482e2f404152d651373424cdd75dcca71482034f6fb4e58676d714728b55a2ede7143123dfa5585c65be4916d1eab157e27fe041ffd02ae7c3a58d5fb9e8941964a17a6e8325937c9289e832945d21a71097a9b05ace0cb113a9a4b3f39674b7c6bf544ab53a4f5ac77f4948a820e43ea8b4a5c30614538d6fcba096c2c70c72165505dffe4c539e0c87b3819399c2c6b1bd1da38d0cc722def3cb2fade322ef5b4ad654e5c368ef67897005df3283e4349a5977771d2f1968096ba73c527fd99d880fd2f30756f5e26ec6fb1352ee423833a1684aae551915f5c925f77debd6e5f6f880ae80e559841cfe8bb860cd88c5703d9e9029ffcbee9f2dd267ca2d8e3a7cd987a096dcc3557c5fdf55c6e65ee3397440d0f5f6d6faefded613a20faba402f90e51b205da5e76331c72eb016a9b769077937a02e442ce2658836e57d22b70a13e483a2647a6f3c06d9837e857f40fd76a6020ea9acc224b804094ceadd8ae193f0d9808b235d950f84d1262cbf7ec9242bf4f78a2a2d59677d17e3ce4b2a5a938283273c1141229e51ce4366eabf50826386f72a4cccd4f65be92691fc13b995122722f1f4a84935d8a152dea1813833f54e8a14750f4be72903a1c050e5930b481bf0372df19d888210d0fe4462c49b49a22cd3438302bc4cedd1f3ea0e8b786d080b863dcb73f8d6835a4073e29a3ae9386be138c6bdd8600e2387380ce76f2941f169948480f94e7f3b3f807f3d955c57a3b8b528c1ddeafb3304cb4f5b51d5703e5bd2bb391c727b00662a97033d0ba670e44947b33f462b7ce704643bc32a094ed768ee00d4cafd563eb2d8af948fab6fde7592067f1a156dc883da2d257f83af66d78b7ca4b07c8933b9a2872e40bcdd11caa6300fdf4f8203ba2f941b4e65dc749f12012edb8f35efbf832e7cd7716518a8e2c483fe40564327c2f4f73f26529b301032b5949bd8bd34f8fa02ac6f747da0d6385e0f8e56e14d32e45b9a4bae453b1485eb8428de46aa829e5247eda79b32ff00007b901068ab0dd6bb185c4c0d008d7f3322ccd2f690ae7fee32926b1befdbb01ddadbff63c1a2408801cec85d30e9832ee8ee435777eb1328e4e43b5a37eacd08a5e8805d119eb6551f198fa03cc746315f03abe3d0b6fcb4e76994d09baacb43554c5faf2b51acb4a8d31e8094951cdceda379263b9090f4a28904398baa1f70715dc9e46f79a80937720178c8e19b942d5437890906847abec905ef98575df272b37b976e651cc5537cc4f35a1b26f9968c6396c9972ba984a0165d4230eb5bd1e3c13298a28f9b8569c58ac8c0637fa1c289da0db10b23acb4b21d09d56c0f374557308ec074ee35bfaf99857fb598d78d16cd45e2b75b8f6d65a96fa334aefb7e9a2ba13d712ffce4dfca1087b1c7c04296eaf2ba94c3b540ad7ce428f99d96e5f69e8077e8e3338fc2770a96dcaec48996bda49747feb6b50621f7e51f6da22218e3ad1e60aa8207143ad41b8a907cd872afdc07256efc60ec131b561a91a5a96d95778f5cd850e131700d94602f51a5c74bf998d1970eaadbdadefa7fac09e2614e8049521f38a4a6d0f78fe1cdeb78111c8dbab0f9561961e3b340a31f4763905947ead4c1a1d7e0b8526c841e92d5cc9c18eb68187b230ac828d7595e06b377604ed2597214e17ba08eb8cb73e03576452bb95b76d65e22f2b01cd6fa904892de059e54a31a67d4240d032c706c1d9a9226930f97002166edd99fb077aca95f2cfcbd4ad71ac196bd7dca3b969f04961daa06f8fb8123332415ce7a57944c48f7949dc080ae851fd7218c5d58e17115421683ac06c1da143ff527991cefa7eca87dee4a223e28ebfbc8a81639ebe984aa0ca79d6b5a9c769be839a12a2742c6da18fd5c4e523397a5a3cc0aac06d460bffcd1417ba400f6c26f830721d3b343e6e6695b67832b8f6f73668f31dad835ee57af3cca469e013e0b824f766d60006976a0dc0039775fb397e6286dc05b70dfad7ff3c9aada22794cb5feaa6cdf68cc3a3252aaedbd651c81e97ab27fe4adee7ef1eb1c592be71e93ac89304a9809a9b1ac63ba38545bf4d1eeeaa231ea59a54c739714ca29ab6880c4639a9f005f6c7d6d63c071d290f70844ecafaf02e09e86939c558659fc11949c325bc2ded69eedf3e75052bea07d85aa154d4f94ef24cdc04f51162355943f926a066e59fbbb83ee72ec238f0702ea8ce90d8c36d1e282884499e21c545ae2557f0cfa285b4cffab8af69cba2111974bdc62fd5f45623569f09282ab54e03d53d5d1eeb061cd81b983f206d6ab442c8563e00b74960e56c3f7cd6066f3cea0fc2317c498aba7eaa71280fa5af1f50ab813f74f2d60417754bebd13c59d70addcdb21043795766ae2ab060fbda1bec262613b30d020c6176ab9e4054dde60c46472a03613cbb3b2fab2038f75170be3f2d00e490343e6a7947dd4cd66233975316df7c2b39aea336dcc0c2227de66d007e4f3003d664db8507f01d4b5084540a231aa42ad9f846c9a5d72303c645a2710148beef4f445ba3d31eda3b0ea2eb755622a2e58460cef3eeaf8623955404999f32b7dc07a793da93b1ac2c0655039c97419fe4a3b0e0b99f8e110850dc3c803e57425066542a322fefbaa89f644485cfbdc3b09cae2725a0bdec3c61a5f12ec7fd88d5d415c9b38f212d364199583ae4df35d0d923483ed98440472e77ccac236db0f2b9b018669b8e2c5f54bae4c3c0ef1eccc0d6ee0c322a35af211a750138efe3307deebe523c80e0a9409093264935a52dbb91bf9894f9f2fea0559335f0ca49158897647f583d709e6ee30a6d69f8f37a311a63e9e537a0bb15f2ce513248092b4273b1f6d80e05c6447bf4a007822f3b8a3a83070f2d666fe7b7d05be5af4cfa14494ebea53bc7a82b1ff7c50b1982f92db9c7fbf8236da17e6d3e5ef348390964e3e2dfa50cddcc8c99bbe65c06143a845fd6cc8a60dcd942dcc35f435bf9e09b071662c2c970bacdafe90ae4910c89f6f45982ab2edca09bcb0568bd30b307227e924ee3b9a7fb582a293a8a01936beb3ff72645d3957cf103ac80490e90075f10fdabf025ab1693d1227d36a0d06acb0959bf3f982ef8ac4d61b0cf3fb866bc840082d055a393e86e7ddbd0b4ec0dff1a265581c5d099346fccff370952afa0a442da6d91b8fbbec7e15c41860edced3a07f1f3a2a2e9f131947569b5866773366cbbae2112d47ca6f7096f5e5f60fe31a4997d77cd6f4c5d611a4e8a7e189c03252d7b4cd8a98cd167e9438407209ac6a458078b78b3abb9ddf7ccd25f4985d31639bc5c33ff5510d804a53f2da52ac3b0337927cc3e770fae13ccd35483956ee6e659974a603f2df3637ed8f97514ee6f34bb93f19719257c7637d7824d349b3e3d3b464653b2ee5f0db497941ac20f8a62b5170e46f7c3f029f324142fca24c64448b04e61161dc40a31c4261c9af0a8c550fb4bd47bb3b133ea0230b1bfcf2505691f8b10d380cc63dba7d601065872667286d1c80cbc689c02bbff5c7c65048887d924eb51e01d1f9c88cd536d0e8f4c0401c8aa11a5bd6d2596a8b767ad0ad388274277f9045f465bae339937dba87fefb45803f43757ad3ada534be971e0f056510d3e31b63be100622f5ccb87650819e7a7591c3adf6429d02a9e6b772de7d79facc762bc58f772ece92393da6dee6ce2e037f176fc9adac0523a53889abef559489af5df60909b948a76f69c6939cfec2922dbb2575834f1f6a70a6ccf7f96c6084050e7f8b462a23add5c9400f2294faaa442b898a521ad3c6bf9eb7332a42f1540dd9cca6caf5d20e12d8bdb2064518d448e4e668a893a4c1087cd2edd06dc962203c67ebf6a0e6509d249a2cb673bf78b273d690e52e14f1e1bd9aa8aa415b46f292cbcb67cfd30deb196fcfb1a5512ff764c4a3965ea6d1b1fd88c40662297aeb9972b58cb72aae7333a91b965e6062ae145b113aa9dcd91fa937f08344a66671acf73ad40b5fbacc0fc0a0c3038fb94d1ee45a50942980714cf29e9f6d74a22b49c3dbdc30d4ab5c1a50ffd639118c3af11aff66b20f506d55732eb940f6a68efc631913dc4bf8b9cfd4793e63a8541e174970eb6800d15a5f24316f63befc03314f630942084b5bbcc5bd6a17b6b96d1e0a3f6d4aa08bcec67047305a200b3e84f35a2b26abebb84daf2ce7d9bf248e51c7eb5abe60d83127f1c09a78ec6c8763f95f07de9982661efb58460e441e187f2ce53257c44f37f0234e0c545688745acbf21dfe7387cb9d24cff349c81e91e283cd929b3d6939bb8f30148100f78bd5e5a3dbfaac648f44c5e47df0cd9e612876f4e9ed5ebebcf6802731637e324471c0f4d047b6b0f792593654b7c7262cad710ba6e28aa8481dc083e19020b1249b0865798a24e5bb22595605e3373e4b0e0c62680f53ce51bdaae6b37b9b0ca2de06666626799b306130940027b05f52b693a99bc83c996032b9c015aa3f9d55975577f4a1271a0ddb99a0e1e9a501ca33c131b0a1c7820a397790869090fba373703ac38ea00a9a0ddeed199d97be1801ffab45206710a61e5ed894c3319012ded0ff414386e56b548ad915d80afcc2bdb976d7c8adddca7dfa28aeb694033a5612660c644e32f85c2805651d713660a38914d70f0e41fdc4b3d162ef3acd70659eef6375686bd78130f295d26d03686fd915c1780ad5a67f26932fd188475b89e0fc04db67f87f702011169b40dc408f43ea357826115b29ccce84022f19523f832c6f1acf7156858fe175dcaf399f6e34129193d27d924100e3fdf571ac0af2eff0f0c7f16f034ddb04221b0aa3cb99341f746fa282c2518d840c200287dc40a1da38478039fc459bc9a9eae5935bacce713c4018b991d7ad2f1d1644255ca52358a43dfe7aa7f94cd27ba0c280d6055db877d9a79a574ffa35cf5cd91cf29cfeecc2ffce99acc5589f25e11404b12f8c45b570d1ada936ff38914813c734949f172321632f6156698027306c9773a7b4a953ca195bfe0926c7e17c96cc99288e5843376e946c18da35fdf33ea1a3fa7163f139f13dcc430b445e7ed495a6d53730819653713389352128ce0ccbb8944d060c44fbbbaa81073e66a35faad40734308ce2944e3e1404c22605597e2801a200136f9b6e0f2fb52678ae9a84a74b1fc8b390a3741265b3a9745d972178cf0ac2953e52bd60cb9f8d22e507aba72d3469a425238b26eaec37a22b685e315901fe0025b43255c120f2e3eb39984a1a1cb3cd14771c022ff90d2de32f9cd83c01f2e2ba226544cce3c84a15a2c3068e53079ce3307f2a81748a76396f65e3e49541cb603fbeb42b429db418d5c4731652059215c25d069be9401982aa31caef368b18cc6ea73a88d7e3b0594515063ea41e5b30bf1e3cdbb1ce9653529913b8500f693331d73e521e2add5b632d3653c3b246a8793b23dd88766b201b0454ec9c7f1b491b9736138fe37993d2758a123b71f2f1a34c61fdb7e8167d45fbf4d8562acd82ae9fb849a7ae4396f5a687e675ddceb0afca5dc8da8416df75e87a2827c2fe544d394b60efdb99e95f08a64cfd46584a012d9ddb6aeaeaab2d625b388bb80c5289fc55f5e2fc0aef61447bb25c5c2e4249fea891e37d0074cef21ea5fc7a95e1e7617e750ba0052dcec26ec2fd7f9f1deca5e478cecb06c0fd004aece49b29a6d8011b6ad4381738da0af5db6b3149515bcbf81ca7455c241a256669ee9a15f5fe43b343c754cf752596a7781001ab6139c949e9e79c7ef2b8c9d7c974e80973acb1dcac7f568c8733fe0a25a67143e1e936606d1a00fdd15b7635781215629475c40de146eddcc38799847079009147fc9bc202b933472464a2f5f24092cfdcec02bdaed86b4ede9301acc512201207e651e5673fa3e98086e8afc48af09fb171e662418e5f411cd8bef9b00c6054a6290140f737c3636a14bfb96b4baf50b699f7a265d34a5222db39e1adc231b7a757127b4f1c223345a080a9531d3f9150e6bee46861bcf0751cfafb3ace24e98fd31deabb6740d797bce3f6187a21b014ca94aee59417ba88108abcd3aaaa38c43f7c25d8a39fcef4cc423627ece65b76c811785a04fb1ed058619cf4c24243e8fec5a3234b9f97d15133d01dd00df1fb51cdb7321ec77be24708123abf7d89729372e937e9d0b0b1de215a46edf902271a2211fa5c1d70328ee6b301fccc77d5802c6e62e8d3b82ad5a34b5f71480a6e63b6ef3f376d8a4572a605e704bfad96572ab940d3090c80da3219a4146b7945e0d4c56d5b28289fa49e715651b789498b16406e32f12c685e464bd141e3ed51f4342b0111dde9b587689bdc7e5499439e779a37831c9645d45868438441c4f7103d96a7060f3c0bbd7cdbe5e5076c3903b72d293dfbe8bdcef0e59745f59ec9e7597eaba23cae169943b81f2050608e5d6d8fdfee1f8214b0a84a39117fe93edc30799b70d69e7abd65b6c4bab014a7fe0338b7fde7f0ff2bd71c95816112ca512aedf2ec7dab8c9c5b6e830eb7073a78009e4df7f5c3e19315c358e019d9e0f8d1625e9f9253e0b88d35e6b6d5a6aa5dee470e56b9695088ecd4efe83a7d37359c6d1ae4a505fb9483a34c2d8c717c1234b965b4a35fb06fb4c7c6f4239b219a1464d466265051a2c74d4fed5bf624377c7c107c6425a5da06227a8e65a23488b1fff79ea6b17775d08a4e70b4b337201df56b385c39953a696b77218130e493fd8510e8a6b7d18027e0e4423727297ea1bbe252fc3a03135719495806b5b65e6f9aacfe96c1f45445f78dfc43d07fa590361266d47573f747a27d9c56af3e1a80a7182b076e5464b324c7e97b2dae37720a77de759a6c48c39d6068f18bc08ac9410f08691b7623e7ff1ea43dcd49a6cf9f9f44400750aa5360ae3887e9f211b1feee114c67de345cfcfeb71c0db665f16bd512c45ac57e5fa2c3956a384731c31731d021c1f0f8aa84e48c968d89178005d5d492e33f4770ca2d0a18f5447d854076bf79c852f3295d6cbf2dbb461e13e3fe040c6f22981f4d670124bf5e5770f12949b4d978a681bcf3a9521551fbf58cda2bc12d13d2c3b2ee150de519520eafc6197373e6a52c4a15e5943a5123dd76d6a631cb97a9f6814ea04504f9ffb6e2d97936260151817b4ffe7488b8480428901ddeb90260303ef55d6aad64a31220e0136d7e6d4e39c71e5e638eebbb3 -MD = d4292e3e757b4819873b554278a8c484e99c019a18d1073459c56ac454c2d518298050a78e46e2af85b25e05fcff6ad5fed4c436577a90a3107f25b99f1cc999 - -Len = 63592 -Msg = 7d130ba831a68bc3532c78bc6b1a47c23e3772faaaf37974d2fb275e7b0a1677b60275c7c03b098e261b727a2ce7b01c70d8e59dcb725cad7811cbbd78c5d56e345fd34965ccd4b031a2e21496f988690c7c91d766c011b3fad4aaad0119084b4153ae96e901f513bcea51f471f9d7905a4afc114585a06ca06b4b97e0aeb6f623068d161381739d0e1b4781858ea579a26bb0b12e6a0fc2b1fe36e1db2de756229ff831adf55638715c4a239a61fb0c2c073521ea16689c77b7f4f5bb3ea3558847774f7d04a7cb2bd5e4427719e0313f4511c74133b3e138bc0c394788f3da9b2593d84d576d3d85af9c46e55f5dd0254dce0dfa66f67b3d35061749b4decea562d334e395b078c712fa98acdb79d12448f35adf593b51ce4b6bf687696d17ec25c0cb076778633925879e94343c1c855e0915b6b4894b3225c13dcb50a79eb997e0058375cee62311cac16513ae9990b697a8481ee951b3ed9356db11944b53dfbe4b1e66b9e9ccfd4c69e61fd8318c79257a5d40614b97c866a87f533c070427df039fe342547d1293ffe001c1cac3ce3cf3bdc2fc2127e0c49b81bea8b81294cd97cf93700f7e7829e91b60714d7bde637b2f4bbfbcab5d3497a8fbdf47c6500f6d761f4b03175696915fe5f1a3fdd0227a7c83b4026b673f04bbb2e99d68832def5c2edb1690d4605d743848b291cd01586c14e2dcae246b4a838acfa04054af8348692931301c11b721007e647efd897dc7a35132bebf43d1c82c983a95ec1e9303773c3d405330062fe59ca00e87415255db0aede15e4c0251404c52b173028656021c2008a446b26791a94d8794b13dde6114f3602a1043e86df4d0da10e1c406afd2c4d035da238ea9ad55324b62a729e0772e834a16fd535b969b59eb45b5de28650fe02e74c06fd8b19f57d5dbf9fffe3c8591e6e6995bb33d9d762db5c1a515ddeb7fb89df3d1c4bb133e59a49928636adfd428097dc81deebd78feba50221d433ff7fbdb247b15d6992e0046f16cb80926923606136240b3e3a985dbca1ee99ef38e1eb9b93674071971f2486793a52241143865c2f1c593f74feba0976121f6ee8d49bc1bca89587b4d56326564d1bb18a257aff13c5397e2b357911fb36c531a3ca66eb2fffbd0a70b548d52a8e5df9383ba6b0a0c93c58a1df237cadc72be5ee25a56e69d727786f216e0962788939a018b2174292d27d8d4e41901a3dc3ea2c890fc206b9856fe4cc1b399a963e11562ef59975bc8c5b42254bf2ad252dcce376ee9c6321274f85f808fc2f61ed0ecef109cdb6a0ca5074d6ab2af2f7b9fcb751ca442ba8bda5d7579fa7bd5606807f01671a81da3d1b79e5079f683008f7fcac3b5facba98e13d4d47e2c10d1b24ead2961663d3251ae5d2b9c699588b4d3808ba5582d149a04c4baa33b6d1ab5aa6d6ff37d92642bd2d226a46e2fbc17afde9bfbc2a77505168f53f011b5e37a017a13af55e4de690d4566186f1744bffc2b1c3fa20374d8337cc6ed16afd3073d1a3b1d56fb4b1346fd1680d316c7b4a0b035fa5f07b81a42d23c22b2259366449610c6e99f512f65435c6502f4eeff85b50fb3617cead32bdadc184eddcb9f0036b931749798c7515f604d647960a79181d1f21029b10cd6dccf5650a122b857415ee661acc9e2f4994bc3616dc5b4ae5ea43fd4d8b6cc2b1f3c64223740bb3301296e16a68c893538454c6197c72fc392b023154fa11b12ed4ccb2a67ceaf7bbc4050fd4d88c3fc867572ccc00c1fb8661c253b571901738c2612d2fb749d17bbcb147c68669831c904bc0ab03c8c752211ceaeb8c6873645f4c181b9d98cee46f343fdc1cd10bd4a1ab2832f007ee10eb6a4d63a51b44360db619e6ba684eaa4df64e71e66348651dddd9f0500fee67234311ca562918225057993d7828ef21fb9ffa248d90b752678c4c7f9e3136b95b2fde6c0a024dbdc9a91c7c616b0effda69c9607cd9d721011f061d551c659c0598e9d54b47737ccc131a2ff0af4c787d0c42b22ebf36658d1e7d75ff41e963b516eaa2945927c3ea3e28c4c056263055ffec963da143747df338f6071230b4ec1257307fc7b947a682bed73af01abbf7bd3d8904208cf23645bf39f73dda041d13962b6813c65c837952d3db1d987fc4acac072cdd8143487e869e6a0553e5bab34defd7bddd97038a7b472b3f2e006f76be9d1218bf0c471615bfba092cbe5749e4ea69364d7b995e9ebda5c559c23a83ebb75e6294a19494e30a71c9c302757fd1c7770db46ed73e3383c5509a59c86cc9f25c5bb097c383850b2bc7c56697adbaf39bb491052fd1e04624516e1b9b89cfbab6548173566a623e4273924f305bf6fb31bb71c305821b812d5853ac1663638cd70d85b8cfa20110506db810c2132c4af392c52d1af74ba15ad5d97feba23bf548b74bdc91c2e82dc006b57fef6bb16f3bcb09a7c28a0743374a6dfb6daeaf70760222533f659de32beef8d0fabe2cd494d4bdc78eb2c4c33d368fc32ee1347b097ec7b13ad288dcfe7720b88682f51779406000e21a0acdf71acd5ba1f271915d8daa7b16c24f77b24f9b9b1572b0b4538e8ee86f285fbfdf779529594add400caf3925559d384fe1d8e7fd19d5d617de2fa8f288561a1560cd85b0d772ddf37153f22479cbf9d1f79384531654dbce53943c93b03bf06b259d0d868ed2fa48262c640ce5e70a8a7e100f31ad5848547e6cb8509932492d98569b1ef203c8aab5991d534c76d0f5ffcec71d215892269909aacd85e1aad9239abcfea38dbf978a1a7c7bffe3e380c7307a7a14ee4fd13e0b924f18c28bfa61d9f18a15c9559b3e31000b82c6b8d79ed567dd1a81e7c0f7d2fd79c44d730ded84c755bb5f11322c6d56667787c746d13e3dca94abe09241104ab21aead680013bbce626b778d8ef3fde3130bfa57af8db5aa705d4c0b1941408ac7f334cfd475f20cfca5af30be11905e050c6d9d0802d4d16f0851eab7b7ec5bd73bf4cd24a7fb15728b22647cc997be86a45bae401a4937ee74540dc61b100699ad74cbb650ded30c4757928ec318eddcfb4ef21f7e1bc634c8ddde0e14b27255723c2f5319a12d11fed620bda61ed24f38cdd16dd652648b2d74c4564bdc8953b1d463c3aa4e0acbdb2878d11aae55298461b3f1c9f7fb39cba22768689532da93c5cdceaaec548003d40092c9d25eb00690007400107287c9ee6f0a12e655344095d73cc284f279a16222c85891d52ee7e520be23a8b1bd50e10505f1d5dba7dfcfe8d4991dccfedb5b453a72f4a2e94ee57b97d9c4a02387014f20ae6daa7c99f8675fd8bfca56d946d0b1bd01ae2a641a79c7ca6e270197d9b625f1b3abfb959abea62672d4cbc4ab2df5e1c2df38500b83159fad2e9ea7eea3da61b1c66bfc3c546e2c3fd2a3c412c3ce873f1e5d3b40ff4a008a9d43e0ca7c09a76ee416f5679182912dac270004fa04577f54df4d42572e940b5c386af4aa786bf2eb42a9a2dda9fe454a9fa1083a5ef88a6707ad98f189043b53c56cf496f05446c5383f75a0aa1b8e9453cea7eba51368411d84ca3723f71f6b320e53a7380a715840e068424e8f10738ab06875a14f22c869f9618fc416c18ac67a98441a367b8ea1b4042b5d03d3cd8e6fd3411a55bee63235e46333092899cad54bd75c806d4da5e2d0c49f1ee08ca53270b5d8cc4782c260db1a39775c81864af4c7c78f4e7f92935573db893e961821c83aa25dc2835fa1ce1c9e09662842fe1c7c230c260bb1ee19a1dbebf5d52f66623942b039d3522046d12a664d78461c4a5e389efdd94a1ca6b765ed0e2f3126c6187e6cb359e306cba1a4361958d9ca07d5cdeedcd1a544841b4237908e688c7d411f3939fd597be3f4d623d2af4530da49aca3cadb098f39373a7083d91abd0e1aedc1d2a7fea6183286d38167d0784b229b66d0dfc0254f721440eff890e4010dafa9863f18b0f1c37dee2e67c3c7e2c863dff5c5102d4e339a51ddd21227df802f9c5dadf0c0f60f831ddf97664828a3ccb5417542cfbce492485451e7ae2fdd334060d9ceffb07f60089edf0020a41b9d91bcd79d3523ecc5d05d5c59a2798b843d96acf995a679db567227db7adf99a01a6fd46b840ab3fb8fffdbae2b46f2ea3c080cbba96066bdaf64573d7c5f839bf96152f2e7faa1fb2d42b72f701c7a2ce5bce25a6367afcebd7a576f4eae4357d59a3a7c847a1e8f532ed6249a868b14dfbc171fec42bad625be0fb919543f9c5723754f8312927da9cc21d5d0098d68d31091526c79f19d9238686205d7e1312703eab30d4a658ed62380893b2fe8f168be3a3b0a95bbeaaaef48b439c190e0ec4280f24aabff8a833bdc8a037f047747d0f922ef1d7f8715eb99f5de99b36f4ee9215361bcc839571d1b1e4f814ac2174db54e4399a73a7c34416e1be8b4a7f7ffb41d7a052963fbd0278e47be2099813e58082d929acc87d32a671935fa508c8c2099bf0f88cf165ce62215bdefc52daac998d58fc005ddcf3a27ff08ed32b8994f0f56614e4651ca4221de06200fc299f046641881ac27305bf8f6e9f514212c28c66784e490542122d5cd22193ce914b55a02b5458b0cfe742026617ac06f5093081bfeb075c6696d84079844174921001bd6ef746835426ce8b6f7e4fc4b0a781b99591cbd4fab0d77b7f008678bcbb9d2094d760c49042d98cf349b915d64bf480a1c8f2f98eee9f603b3ccf35617c8c7c258b33ff14a9e78989f07474c6551d796d07194493ae9481368fa84530f15422a9694c8d51ea7d03ac091e5c015141064fc29b40a97f5b71097f9e229ba898b69917f719c8730e7dc1f9f35637df13b9d282157810ef58922c931d581200ae9a6d1dd00ef8e2106a7459bfddaa4d09f68ddc04559a6d10770840a25034a81a60adc173e75396275c3b9eb06d0939a85eea16e45386871792353ec99563fd708bc3c93f3d792dc7c5703f918eb50353557ff9321c75abe2762bb3ffb2307f258e479bbe7bca175638bac2bfbd3e58bf7ca7c979fad869e5856466b1111abbcddac19f6e1cd6d1671883beb76315983136fa2e38892f4fa56277bd8a4c9321ce13aa6ababb2fea8ef7638a052adb504d06ff8dda320abbb67fce2ee7bf2a4f9aab6a8440b125c11257d2bb157ee00f878f206eebafdb3c7d4fd041660350a3d8149a528ca95903b5bc39d884d9d4246511f557e93d11408e55468b6193a6bcfae1b27bfb0e4a10cd973168cfc6184d6a41f6cf6f845d665e12697386fa8cf977953b57184a7976ee6b31c252ce3cd90b81ad3bcaf0002c5129e17022a283e7d2a19d8a610857a48ccab39bba4cb255cd737133a80aba012bee1727e1261c169089716c61a275381d185f4b62dc09422479eb3d735eeb6332e1a2f12eefc5f435cf2fa396b3529033e66d57f8f6a23ca51783bfa94704e10aa6fd72888a021f36e550967cb5605b55b78657c9272d93c3ded340d67da6f917908f127a6f60d6186e6cdb90132ee7f6fe32b16fd80bf605324257774d3229ee50e057711a52e76eccdcd95d772ec49c4cfb0b59a3bdb1edb4696a084046e1f34a99c8091568918e733916413be07fba0637ac22f4c375f1c7a0ff05e155bfcaf003da9eeb12830c140a28f7ebd487e4cc713a3855adb095fe919cfccadf11d9e3c705cef5d12a7c01b877ce018b6b8102403c2640ecd06ecba3ba59474396a4984bd015d034f632dedc89501775a9233a2d0869410173c0b16feda7f143accf701adfe004ae84e50ddee41a8803af4ff680456dc07c1950425e9d65532fc29f2dbc7bca0dbe44f701480e79fde60c7ba9f269c059cd1f81e0e8401de79886b803993a3055d4b4dd6b906f1ac37d4f1ad6ebfbfd876514ca2fa57c4e18ee578ea439a1cf6792532cbf508c698349c5c20fe56271a3e487bd810eb85281c1b3a7823638d3dd77be595f00fce2a7cc2ee5a76733c969bbf6c0879c7ad79c9339771fe775fa01e544e7cd1a2712cb84e91a5ff9f651336bd077a5c73a59d3d34791fff5cfbe8f7b955cac14a17648f462c47c1600d58b64a3476e278d45c2126c7c84b9cc7dd09b1e2c5e78e289caab4a789e341992ec46edb43335da17d1d1269b50dbf2d46fd44ddb76cf60c9ab09feab38ec7725d0832e42a76aa76cad8ff462e6b4b94ec7a7a2ee6770a2b274a10dc0de97c00ad299d3773d4e8ba09fbf5487a8dca6498295cbd9b3153ee0a200e67df1de7abe6d0b8bd66749ed4032dfc56e39cc30410b1f1721dc158bb0dd9a172705190dccfa48a5c4a7f542e80171d58afc0bfde1cbc4236b650a1fbf61dd1e609ae00f9314e1bfd691c922f48615f372720455986ef55efac06b7178e96a7a9f25cbe6cd47573890974e13f22b2cbd993e5dddd15f43487480a21759dea2aa47382529b80c29be673aec8c6d7b267273b360fd29073e7e4d285677febc163bfd44845f0fddc9afeeff3d02c300a3d09663c64a1c01374f0929e129c3fc458e35cd71ed1126d78b7c46b7fdaf26255685e1f63b06d7de591cf7ea933629a13f6545765a8891a3dfb3c3d6036e861b52a690695685e5942b1d34cb4ae1dec9ce104f0a3dc288df2b19d92f8a9d9b06739d01980315d4e9137e431bc743662f98db4c85ed5b86e9fc13091d19c8cf7737bdb82ae743004dc0b4b5548ed75a334e1ac0a21fb00644a123d637275cadddfdad166a797a0242a1550dfe081a45855c433dc71b6ca18fd8e0c2f639e5b0ab53dfcf0f1047556843d3af80c98892862209366d86edc32bf1ce41e2d7d0727fd8ba24516217741f16b53c7559aeebc65dc12d1dd8bff5999a40f58577c96dcbdae0c909e586e8e7987e17542ef99bb65e0f9450975fb35910fd3046901cfd0ff8d82f70f1021e424792d295cff52ce6b1490e9e294986fb243794aeb767bacca104ba2f3b059ecfb297f0c2933e39d7e601ee6f2519eaf0129485366426217271fb1bad1a2de4e057f1f4633f113cfa6aced64c112d49c88a98a4762cd4cba1ca2fa67324d78b14a6454fe02a2a90debe0438ad54003df4eac854e657f013cb4816fd09d19efbdd3be675c1caf6efe56e46980b844f3205b18838ef9c04847f4a4581e9a6e0a1ba777a0890b7e2a4beea0a76ff2846c06b8d7ca32a5f8eb80e6f4fd78b1b49273ce7547ad5779a49bbcfc447f096a36396ccfa260f28fb0919157a5076b53506c51a2a4ef8607a697c6e18ad7875d18627fea554066ed6022fdb69af34fb309af37e4ff78228ff6e71635bfa0f4c4dc29fa0e2afc8b7ac3da33fa2263e63d88e488259f70b37b5d32b4e22c01d6094835e42568b9e99fa0623a09867fb65794b24d4ccdfebf32a320a6ce1923b793252f451658a206c2c0611acd0e71496af4c18d41d14ad01c905af6e3cd2d1eca3abe25c942dc6c4dec80dc2d015e27df71ba50ecf37d6da1ec88ac0792489416518b8d266e92a3a6ea678710a971d61cd3459e357bbf1f297e52ce24ae9ca0df303d841523ea313782bd23604ccfe08be2098004b0376c1c0f5e66216a50ca8da07d137eaa0ca0667e2bb90433a3cd9365affd41db0edfe267577be60e8d9a8869f341494b21789da5584fe4a613239b26de1ed4446bfde34ee3165be27a99395346165e4e513f43beedf0e8ec476c0deb3feaa5337750888caa3e682e404e06261f9aa5fbc37fbf9291a1f84f682f507d7a699cf05a5f37e855fbf539064158a925d6079aa0bf7be9ed6cfc159ef5cca436a3a2c23bb2592c8c55ea4cf5fb98a501d16a720f88de8aa858dc871045e9271ba19df342d2571ef6552faf35032ce35a93b8cc3961503f6b6d80ede7a70fd0d26a77c9994697873c02acaaede17e28d925d7f046d239cedeb4d08f4aa3a6650306168d6596832e06654a85451ef43f268eb1265d630200a834b5b462c216af567e6486d14b82ddfb84ef876641f8efe8d62cb6a69d119d72f615a6578bc77671d947fe02ecfb5ac36984f978d2f1ffc70632e74a07cf6de300daab50872282ff1fa93b2301586e071cf223a25a47386d25aa03712aa437a45cea0c753c8d9aa65871865a1200e16fa31f4d0d6061627f3b7b50428cf9c55c122f11ef3471880e8d8727cfa85b7ba208f5bfe16ca945a8518f17e6b734ddb4288f01e6f73712e0c6d366ac4ad10449535bc0450686a88e6dcd9f8533bf4854a8f426810b4501c4093c8b1681ca430b8a389a61b76054d99a1d32458600cee39945c6e9fa051c6160addd37d4ae0191b776935e06a01232dd6716513a61360a046a2a464cdd2d60d20ba537cbe50682e1fcf4647caca841409394cfd7484a70f04a9abf8737fa68673f2c3eeed71a8711b2059a9feddeadca8af4e8e31fd0be65cf5d7c357a4d222831b773c6ed05484e800d29facb7e1e83327ec3e84d919b6ce0bda6dd0eec361cc991feda8d8e6ca04e563912af4e3e74747a896d3a55b00b650065085b9f4b4cf00108b2207f9c0f0426f171ff18b2a4392f61fb4ee4a44c476fe03dc93009be8c4eb9d70f9e7fa48ac6799e25a2251b67e67419f10520376c524004c0651a7c86c138d0c1b4be66c87efa2187b53de2e7e7e94f8b82ccd3bdf1ace5a808238ec7a2ae259d88005ea7959c838f18a200a27ae92584214f2822934d69e9dfcffa3639425f0de4ee920d55864ba395fd7d7fe79c2444ab523e84824b17ebb3c3cabacd1d05778e2f0ce304e1012df2f662657529d333e77c1ec904cd78164baa063da7669f454f6cd412ebd42d94f834b63e6db9baba9f76cfdb62fb12d3712ab4a61046b6deef4df081528858406f6081f11773623f99e759a0e4fe7088ebebdedd4ee5d1aa36796a17802409991f21cc66bb80522c9e78c502d1fe179f82968bc9a96a7811ec994abebfd1c907cf209e85a10712e776d11ae87322917efed3c4546bfd337bd854965d55b71ff24905ff3611312bdae99960391093648f27499065dac88b50c35358db8bfd93c25377f7615226246bbf789fdff1791b38c5a1f7e540f007f8753e9722a9ccaddfb61e8feead0d8504bf18e0c15efb3be39f8301bae3a030dcb6bc5c19f74bf6b13aa3cec56a0ed70cb31e2ac79e414ef77e95b7cd0cfe8c624e75aea8bda3f5a1a6aebdced153a1eb613586d9fb74dcdc2a8220060232a5f3041295b742fb3215c4e662f229016b089103fbdfbbbc6bf96bf0444d0f6503f8a13b192ecf7c36765af4c717bc43becd0d3091c1274085b809882c8b79bf2cd7ee9743f5ac4d882d317ff426d03f20a19c6550678729b180cbf1dfa68967aafab0cf1af52198b1a01130ef08ae1d1cec054a41ba239e78ba7ad36588878605c7b28aa61476823739c1afc2a39e06371711866ba042c860ccded8c717bb43c3a8bb71f03bf235a45f0ba375e1e722fb8888c2d7022ecff31fbfa60c3d6cc76e04922cff53ded97f79b5b50ea9d398efa832a58bc92ddab91be5e53ce1e4398d420062dc42829551f1888c97e2a8919bdfd6d891db88113928183e60eb69c2a9cccdbb8df22692a12e4cd11776af3488963e02f122879dfbaf1f587f42448a4909c1e11c4912f8f798c92b974c30aa3d3330ccb18571a68716c3dda1d0bdb8f561a37990318deedb97c6431e4c731a422075dddbeb905366c7cc72ce7c1b75363c3d2ef291e19cd6930dc0b45ebfad20c3d5df763e2acd1f2802c10f2ea8e8920255a54950542b6ff4644b616a5e8a5e8617778b65883c3aa32c726bceaa3a931bb4899d582fc32f22948c2e5896db84d0054f2148f2c73f9f142deb456a92c1f02280f790ba8b9d86652a2210b0c51b08650f40cfaf96b784809996793019a3e767325ee03cac41869ece467bf372aa98005ff0e209d22ab9395e745344f6c1694a49da30ff4ea38b091fa07fa90ab9e79ee53a6946a31ea807258dbbed52a3df946a736849974cfe6cc63b0518b4d05d074c254caf301db8b196ea9a7455d2af0d3f327163b2c345906a1cf68a997862023aba738ca2ae51015892d62126d5437d701e3195c590ca3db44d3845e1385e585800c625205adbbd148d593cee3401aca53f9126f93cf33a4bd5b592b399b9d14dff2ec1d3a7beae71e4090dd4785362859e7960754e2a51d9bc53b83722db35c1bf91aae31f639c189ed0dc0128a066b842d289624ed648030afc01975b2d4c5e49d926774a304fb0c395f09dcc4f81e73482eae7c45ee873c897b3f8cc15dec9a4ec7eb7af8e8ee25c4092cfecca7bba7a73cb2d392cf9d1fe0c1785fefcb2add8b4faccd6e622566fb80abf11781cd81e8b745b35a743c4b2437563784b91b0ee17e1de479ed4b307e7a096c2c12bea27b42c9a3e378df5ee2315bdc268437aedff7d148b206aa129b49c7c880d72979ed53c12de44a10cb9963eb965bd90b4dd53149729d2accadf074598eac4b7888ad6ecea9c3645b01c84397fe8b04006c6fbef8fa91e64d330c8e413704ec364f39e844b007642891dd34f38d3ab1a17b1de5623946b586725dfc114a2145ed4e2174c5c936a6040c76cc50caf15e790a5e6907b7020512cc43524c4097c4f805d288c46dc7b667d1f37e62202566f18abfae7c0c8a717ca17b0554b2cef600f6fb98b3064111ee72f1cf9a357d67a58ca02a11a216772ea26399bd093d6572a1db39243b1954e27fe0445b633fcd0f80ae707b005c82a34f7b9407bc797fd7871fce9a64d6dbfe594d513842032389f738f61abfb32064f95168a754f9c1aa2727dd882c00339c8fa79ab35a5e07cf50ee3f7328c0dd0e4053ac2e6b34b764f281ea7ff90be847837d655f04b6c62a4e2cb106e3ec14e9a500b2ff67c0ed8289cc89d444705679e53d659dd983fb351f730f6879cb6491a7f731bcb314c0ad4d561037a6c42abe25760fe2516c136a656f8efa42b55880b9a59cc905a6cd2fcdbd221c888dc18eb4a5b8ef04d5ab54b060d44ed7504d516a7a48b6b80d8f948b7043f57223b766234b14f65c473f6e80f553d8b012cf6e3b03ea0842af7475f70dea54fc2c78dee1d498aad0372c3247aba21a65736b419bc0e5304e03183ea0e479bd7f1e825380e0b86ef92c1e2a74e233a650088d760d4fcec132aee77909a296817350605e70edf8d54fac61b1a9377cef1838c2762fff0b2d89196e9fa1b6b55381989f6a426ade504c2eb382552a0267268a96cc445d2ee7c9c91a2d099f5aa6222d9c0 -MD = 06b3fe00a2c681dbc14f6e81ae1e7addedeeaaf4c7485d28beed0b52d128cb9e7b295838dad384054a826cd316fe20b8ea1aa35de2b39ae612342dd1911212d9 - -Len = 64384 -Msg = 20e0a77319b72144235b24a9ec5c53c5d816e9fc8e285804b727303f029341486c0904ccbebb379b571ec8fe2be2f44c0c27b0b829ee486dd4cd46dd88e895552a1ce6d58f7d53203f03420f78808d2a76d5e079f2666298e9cb970a9ec985cfe280153993e5bdfb63735c83da1e658a9f8940e9f378edae7e88eb6f4e1e58de1d9d599ed2dcbc554bd7dc035aa4c5920da999ae330d33d61b6c09b39fcf57a961db7aad5548995680958b36fffaf56a4a9fb370ba0b7a3949dfbb7f9ac4ca5939a23f0d23139d25891731c5d1093d3bded156d8915c0bfe8f49c77b45e5f9152a5a716644230debeec39657d8b7e52d4fa94a8dbfe62e4e7612f64eaa1b2b06be6bd862c16234cf380381951ded3467278d56384c932a5185a210a1d14ca9547c3d3ca7a1b659faee3ebc26a7947312ede744814149492e4462dd1bc061bc26ec3865ddec09c39398db0db47e92eb552a1eda0fa5f2d10e3bb825658143aaa497c51badab42bbc3be443de4abd1e159659ae18b80750b18f30daf261cd8bbf8044a25bfe54989b2e9e014603537a04526c3209cdaba3f75f3ca4407970a3947bb314cbaa2067587a01759d024ae6f42f60161ebbca9b54cc355acb0fcc06abc45e05846ea61c76b6c51d6db811d95785bbc6a202d2ab4c6ec18afc853e2987c29c1110cc642c685d4f6512a536b5b0edf5c04e23625850bf57914f8a25709b2ef3a3eb43d91bbfe606e9365a282092d0a49f7d9de82714266e2a5e7f309058420b5a9e65836eefd982264337649e7fc63eb0bae2d29be94c8ba283d4ddfd61a439918491e19a7ab05788b3cd8a83ca472ab08092b02b428a16966a4b9c1c39de04e548597222e2f2ed9d229cf87524cbfefb591e1f69d277c5727c23d971335803c2543cb3acab29baeffa264ce6f1dd320dbef56ebbfb8deec333fe4490f09aacb522bc347c55cd55ddb4e9e65dc3f35a742cb92ca6404519051c4b3c0ff42e663a5e48632655463502ed68535e1d96deab2cb9e7cd2325cab4bf9b4e22b07bc6ce4171ce4f3c3cdedc0e12124c5130453f39a81e8516b88a5e785ee98da81b54ed86b8e44b6d09c9e58187b1bd2168149ccde43f52bd75be6ee1169cb55d858714989e339f8a457cac0239a034e0a6c330740ed8da69d5fd627442e61e5332d3dff1823adff6686d8bea986c282174e7b6a6786970ce61cdd5cc74444d0babd1bc1c15687153fb2321b524842b663ad88befc16faa3d919645341b35a5e978f71582c85af8057623f9ec8e769321914c2caa6a6a0b49fded1d55b848dd9ef2ca88d00b80c88d51e6711b06b213d5f0891580e3c70865ff38eaabdbec387ed1a2926e5f58877e26e123ab5dd51205d135d2edbe3526342e1019a0e69e6b2b6e35beb85460a93a5dba8e37d44e1243dbc8e15b6a02e91702f946df68edda0750ea5a685b27b2647ec91d2b0a8b88e248b8cd5477dec591065aeea1f3390995024711d9041c176ef2a36d0f711c0a93c09c036358175034a0bb6db2e63e7e76fac26194cfcc5ccc61bfda4fa88e0bcadbd900029b4afd748aa1606ce23cad1fb2e2b6261ea6f6ff4494f186014000e9f3065faca1f831d2fc93533a57d219e1c33eac07814a8a9a03c95f2d1be08e839e8a8eec1c9d91c2af17b2c5b78d497f942cafb398056c0f27a35fbf78de192a36fbfa2b5bb9a1d5ea950b8991ccb04bbe333da4b3862fd138d99fb77897154064d14de4ffbac68f6791c9e0772ef2d899e8d275744b5a82bfd27bafcbaa1768a080d6c3793f94518e947a74c8126598cfc41a804aa3609615049ff2c295a3f562a1413148a68fced82399b105259d1ec84b526fb74cc67de106693afdd82f9933b909a8ee9e0d49ccb5b42fdeb71ded0bf5268e3aa610ccac4e53f2ede02ea68c1e9ca4eb74b164d4d1363b95654c6603380386552dc3e4cf530c95135c35afe46866bfcfc900b2a8ecac8ec9becd1c66aa85c297624468c2aaef9bfe9ac937c51d14540c197f85818e9373fc01f4927ec309dd61d236cb3ebc7992102a4dc0b6b311fc00d48280273d67959cfd774ae3f82c31450c0f7e9c1e36f1e89957cd31a0ec227e88be24e25fb56e4cffb9c80ed04968d16e33155326a455f8566bcfbe9d1f71b5a486d64b8bf9585c97307c87e20dee677746020c8c4e18bfeffe4ac5de084446c67126db48900e6c427fdac783d62ca7b5ccd710b5a0b4bfc483c0d00a4314c25d019919fc35dafc8ffc85465c2ebdf2b81c07182928d4788290b475985c8d88e6bcaf703d47588dee3afe9cc1941cd8ecc8048b5d52e26a98a9b81f0ec0f93ad216cc8672410170cbbf99336a92c3dac25571d2c8cb591685332e44e3fd0228cd8492b541bf6075c6fef792ada74d78e758b18701deb2fcb6c1998fae7d1303379a7495121eefed6e7d9c43014e0423ba2656308f298a9ddbd98c47c4ddb63a8edcf4ae69ec1a4810bff9bd0bf3927bb962d237c7184a6a32ef6905dd8b563f51a09559bfa37a365c4a8279343472d17372b83550476cf27a87d2524ef29d922ea9d92f99d18a08af81d900009d2fd566fa7a91a1237cc701173ab59fcfd6d3544d22a87ef2c46f990a7fda077a23e8025e8bd53039044865321498566fac6380ff145cd593b3ab9758c96f9f67e999e4137e8883e46df7254cf282f95e88d3235420a54410c27d28d148595ef30b6b7aadc51422d24463bfec570dff18f692c9d0da2a31068b34dc289effcc87e3cd34a1f220837f121e9374a481de2b6032d2f9a35432f178631fb31ffb4eb31d4fa08478063c4741785e9a7d872d027023dd330eaba04e149862056da47be112535cc9e95da3c76d115fb25496523a80f647119e992f98ea454183eab3dabe5d88b7e6a89f508bff7a4550ac37f4302d2abf19b5b5275e53ea4cd31981c1877940507f4843c8e173037df9e6d4698fdf2193bff6883e0afc07d2679c96e6f8d02aa4d84ad38374624d8812b70448b6018b7388d37aca1b4d1e80b5d67ba17f0c98239622c706b137c8e23f7f40182f5eb8cce8cf15522bc1aec64249a8978689295b3d52a6c9348e062ad4b2004e68214a0e646bd07ca8f439119178962fabc05eca426cfb515abf75a076f1cd520d03afb6901c44801f4f3df137e5dcd05b6c98ef29e42d25b056a8119ab11fc96a706a63d062da32fb5d2df38a13d52011c87838783ac4bcb1de0dccc472701b2ce20a84c9d219dbc98899871c7527a56b7e6d4491d34a9cfbd0275068a856ddb0f2f097c0dc8c01166c012a739c4cc6c4f8f8822b60373ceab7853b0be54c87830dbd1b7a0499394e61e56c040bad1acac29a7f994403130b0e97eb329bb98f3face09e49ccd9eaee24c6ba6225c0f7c955d3ab500146c5c94fefff513e367b335adb9eb4a7b6ac720f2593f27d31045d3d3474042a7aabc1f5edd60c6f3bc20a923e7b4f27c7e486ab7297599475c702f32d981a22076b719b120db891420a21dd69d26dcf762978643e22ebedf79636e23f56068a755b549a1d14da36e1aa15b6ee22b4f159f1e3c3f8c54e0c4f1885b4da5c5db66d11e78d4f6a05d2832852994bfaa95febc44565330ce451e4c46bd59f0984482715b6ef29abbff6bf0b650f03a8cf4d941709a26d584351410045beedfc1eb26bdd2f3a4c286d15edd9d98295eb7b5ceb70cd261835efacec72cfeb5782918783eeccf9278e91a2a80a0c8e730141f07a57fc4ab4244db75f8256e55c5b613a07b11c963c3cc24f66128aad4ba8b7ca9933139ad1b1e1f312c577377ce5123c7fdaaabbfac1735eb099e0496030512df098af80f15d40f29ea2ad5c39ae392154a1d3b5039b29631ff689fd513682bcf90f2cb78394ef386ba065be03152a6b1ecd442bb74858fefcbf0433af39e0da1afd178908e75136f2453cf779b88a8c46b3587ab6579674df69cb76caa8d007eef8fc8001c2fb60db179f72fe06bdf754daad4c61374687407d6c514401f4e8ed7948370eb652588e8e09bb109e595ed1c9aefb4865fd88c860533dabe3a3df8ef4871870400a90752f085a51edd10535f6da11ec62300bcfc90ca652bc817e5bf1459ee6ee688b275127cb1253a9ad09f8ab2acdca6282df0e1525e8fb0227cd05e054d31010ab2dbac478028e6798c635bea05cfd29807ea5f936cf2daa7e6a98f3b4b5637792f0c28afb82ec8f5ae334711d2a78e9771727255385d2eed4ad210c490e3721b508fec7c0240c8585f97b6eeba6cc16e9311825f6ad7943ed1d44868c5e3993a3eeb62760565cee8c618104a66275566964ef77aa969f4e0a2369eee925b941c21abf0646aa5c2ef0c3dbeed7de031c5a2b23a6e9d1a361ce7807c209e554b0920540010d8088cb3588f269fa89d3dd3dec4b103eff2423ac53b49c492d8a64b6370f940f897157dd395b1288f6861da730cc50047f9008266ee6ca315ed8d29138643bd72594394a4d7c74fd94885208912de2f4c38593cf2214f85d09be8ea581f464fed57ff42f5ddd1dd2f4691ee465f6556a7b633af905c59326aea9fd759c269bd119732cdeb30359b38686d8cd57ac03e007b78246928f2718ce29a383ff717d18723c27eb0575d4e9db802425ceb59affd900ee3a50c820bde8cc1553147b551f703999d6cdaafc1053e3658043b977149fcdf346b9171c907effd755838ac06083d9d72464295bb1901f215f4f1e14b8ac7d15fe33d2871b01334e1dc5464b863dbb8446715760381091fc35595a10669faceab379b0dcb80014fe2e423452fb0e4d15df7deba62e45ea3a84eaf3e6a8d9cbd628c3089a120c037be982cb8329661cf031d22c8a0ea09680c08c8203f9fb585ca0d8605b93758d2bd21f7238bbd599c7f016b0a853c115439aa67af4d464e102bdf24e7dc6ed20a29a70cef00ced41f19cc40e7d8827e51765d15535c2b6d45cf2d9298d26d35c64851f4855a71db4018a62ac7636358460a49597433f51d0cfd1d598163db89ee6448364b604d74e7c6b6b012ec88a81a3e95bb7a9b4d634dfcd700095761d769c3b45aabdc0baafc69255a313c9976b75a6ac3cd5cdb49f015840f9775a62621adbce80c945282674a1ab08a1b3dc804a6effad53e46d6de904c0e9586537efd6c8869d652cb0610b1be3b86511ca8e9694de7fa093712fdb556866a520fe7e547416570dc1e3de0e539828da5df1d4eedab13a584550636cbcbff7ea1836ac1850f6244faf22fbd30b20d08e02e2f1b7832043c7849b9721cd2ff393b560e796f19eab976efe590d851655dcab0e73853094429adba3397ee941003e831dcf64d88843717be6642264011f62b0e4c8ec65a5bd2eb517d8e8a39b9446fbcda1e6783b926a407bab962a49939cbf06703184acfa1fab69e4038e88364999e12da04330fefe671eadfd4a8869072fc3e8093032afca1909e9440c9f4cb2e808c136dc010f8a5a5fd9bc4715f62e7dddcee7dadf34da9878671e90596e1f6094fafeb5144aaa84bfbd4792aac17f33946331f6fb3fbdb445dc17cc4f10fb8e26398c40e326db90aed743cf9f6175eb98639c172f16efd6f2b6b412d8bbb3eb2d0b4402062aa9e8ada625506c3c9f004a2e6abde350ed7b0f9578069ee4f4e229eeda9af5cc72074ca860c7a9e9770c3a52424da084333adce6d819fa231b1dad62945e2a92e0770c5c8a87d0ce8a89d94da758ef075d711b2958bf82dcb2f8180525ee2d0451b25d410733697255e3b79f0e723770c8c82adb7e89c19838fbfa24f3ad75976243cfe46b3cec6b45b445b4dc0c125701aa8c8bbdeb2eec39b3e460821e8cd28e95c4c52b16d21fe676143db488f8109492d0a89b66332f219a373655d3db2c2332ec41cb539316b493a3881c9b61340e1b67c09b8d66f77d299324e35ff93aeca5a718d075d7d64cb764227895e637ba9ee24242b342cbc8ec68aabf056f5537687588beeff8e4fb3bd69b5d1adfa236a7a0cc059a4f22814d28364d7696219ff5d83ffb448ea95cab9b614e9ce5fa1ec053cc6884f48232e662561326161682c86f9d29f5f1b9fd810302a19e71a5bf735ba1f015cb615a22a798b49657ba8c6a7c2eaf86ca9d4a56ae0e0a921b4bb53b290b10cf4c46639c586c8639e3641956be73106991a9bf870cc1fe0a3b428c725c666f03ffb7fbbe05401c9341d9c61776f8e130cf85e9bc9fecd0896a20a1d366225f764e2c6f022ec1fc44eb51ff27662e865edca84541e7ed3672107c81b8c6ed5678c02a4a03455089a148833100ec82945651975ec17521a456d69cc8ad0f16089dee18292bd97a693af1d4182e7aa38fb9c6c982b5b8489eca1537d31a9f4ada58309c68f66bbdff947fcaf11aa0ffdcfb94b57d8931c07a3e64a43dac07ea403a202da5fd7c89d1203aee685ff006009e43e19bd66207eb164d8864bbc972dea645224cab7c6c7280cba4fa68d8449f047ce47a07d9ad55f4284ae4d474730a4f1830e98aebe45818aa8513bfda3a0cd0782474a7f91f4f5a9d623a806979577701dfe9066b7ff65a401530ef6654de84fe38283150ec3bbc0574e24a38e44ac09a65e7b84b9dc1e824bbfe521d3388945786012e71829f8b08e9589c635268ae6a89521b3ccc7f34d11fc8926f44af811c94ac19cb711f6a004619e1692215b2caa0b4a99f9a52b2dd872c2acd1697cdc5ea656ddf360fbb93f1b2c3cb01e65063528bede475f0f492a89575b707e5fcec0dd9a51d5ff5022c929fbdf9406f29ad054442bbfdde7ca8ea912dddb72e70e765855a164d63d042af5d3a848bf481003f7a6286707fbd78d3ab9d71a2b5dc5087e4f74a9cd0987e8e57c3fd333af915679aa7c49c59299aea415f43393091affb64f73aacdfed28d63bd4b3d487145524219cf6d00f538794feed930913236e16a1f4671bc620ea1d660758ee8d5537ebabacbd99e6ddb76a40c31180c21403901859406847e62aaa62b64cffa22e3624a5716978940aa2e0936a2f4ee1f618ce34a056f0b9af7323ae7c00866a11f8758b658afa7b6ce28e736d4cb1e72c164773642b63bfef5c0fc5c333f149a2d744ea03a27e2196feca7d271a5846287482710f3e3faf183dd5351637eec5435b192dd630921afb403afd31e8b0839dcc15ba2c0fc32bcc90fa78ff8ccd51960c78e357d5d4cc2c6f469008583923de75679b24f0bcaa8f0e161df9b32ba2fd53da8702d294a98cd473b234e980ab8d18fea094b17aafb20d8e707f4b680dfbd9b4a551d770579f0858f0221cf58f0c1f4166f5a29bafd807ea2cfaa631071406adbaef54e64af5735cc67a432642ee00e65ab2448e2f8395afa01663e522d8531c3415cb74f812bdf5a1882c816b955644087527c0a3272f45863cf512e5bb57869d7fbb8ae36940ba1dd619957db497e0dc98ccd1af454d522bf8ea38d42f7c837377a5c6917b9420980eaae0ddae4e5353a7944fa860784c2db4a3c552b74a7942b80a8696cc30bfac7c40e22ff4d2021a2c2e89230b2899e7fac25705e54a0e879b5a6947dd9efdc7c97c17c92adb738c90fc2ca3a7e6d20755b65c423be389ceac35dd391247517650dd005db2b33e17607d88beb92b7ae8400043bc2daf916464fd50ff1cc25134bcc42a321f01b86735234bb8d17efb273430bbc82d16abf5504172ee6f88738f57c1f40ae24f78e8699de4466349e930bcb812eadcb13ffde872a1ab6d024ef2dc670c3c8ed50617884dc0cbf124bb914416e7b89ef7d3fab8316b9a97d839eb9523c14b876ac6710ba38fddfd87e8c564cda8a5f662fe5829ee4f509272caf62c78b1bc6e5960818e4fafe10afbf749895ce437658b15b2c809bb41cf5a888f0cd65c0396393ac56a928f698bf97d9a4c4518e18ec8c0771d243e02c107e932b0ed3eb5b172dbb94b2cccfc02f8d2340806c538b4a4753183ce5607fa03636db2fdc84722aeb9d98a6ed70d0282aba3571267a189b6aa6eb65871c5dcc59dbc7db8973c7c355ba2a2e94c110d1f4064a4087eb07077e67b0f634fc10bc6ee9b8b8e1a0a20bf47a14f2c8aac75375704995978fa0b50a003096f1e8df99fdc8766eecf34a2a4f461d9991133fd5355ef8175f4c2bce96d833eec8c8118b8edfc9a6b2550947ef840cccf7e4be80bb39216fe60bef79aa5781a6c084efb9aa9879083cac258a5a9eaa3203058d7b8f6a8a4534b535dfcfe5e165e104c14cd85a4d3b91e2e71c1afabf74bc5ef4ef3957fc40523045278cea1cd33431cf6ba18e0ee8b9dd9725b70213392bd83a04416a3e084766677a6acefa99c0f1603f8c9a84b6bd877dccb71c6d2a5659a9e1300a1a461b3de300f0f9435f8e2dbdf021e7774ea4c6e13aa4b296ee47ca87af8e9e56a2d79f00e0a6d4bfcca4ce2fa5e8ddaf5776840a97052b572e06141d95e190bbc38273074314c536890cbafc866ae4f37a3ba8410a63ef7692991db3bcb347115224a14050c3356f3ecedb6cbc2e650d5ffc1acebb4566bbc10acf914c8b2b20f6c610f3303a8d3392f017c96fbcc6c3adc1c2f9d333f8f0646111fe6cf2a4af586eaa680a01334a2d7c5859c69d71de0c90880a7ab50ddb22a4ca44446f1a881f2756e707a1917cb8798566ea58cc2626735448d7540d46a4dde4a9fd8af571f4f6fcb74fa10d91dbf0863603754162a0710efc139760f792134676bfcb9d337fe58521098911503de84311387d375c25929e6e55076eb6934fd8f2b1bb7b9667fbd76d5ee204828769a341b1f716da5bdfece6c62a9f4d4f988267fce1f5615540dbe375324eef607c910d976b45a5ea5fe0ac8e8b5c826ff62c1bc7c5745ef0bd79ca7704575f7127f2bc12612e857b1b6307d4af0b1f9b71be573bf06153e1799a6c8bdd869a6274af9749623841b6195b41c02016ea7a12206380e92209cf7c240fda474567da6bb0e665f5cba34263b2a07c65e3acb5e03b87bd38214863cf01fc8bc9fc908113ddf18da34f71c8014e6d2d06dc2cf3e3f50b1b66c4d74579177bc7ec11db00741effeaf32c74eff919effe8b6734dd243736c1fa75801c8250d3b636ed11ff965c59a46dcb746055f970157dee8a1baaea52d77c9b0990f3924e7f31f8fa25827d48e2999239c21dd8369a64d8f7547ef4a587759d3b4bd3c7324b659a5d1b3f6b12cc00ea8abe579d8ab6c68d4330a63f78f76ce5def22ad6c841593c0389d50cff8b293c30fc0d30b4902d7536592cb1124fe9daba3001a7588a9544b5154d4a59479ceef4234679fc5220f898741734bdb874e496aa5f222a4da11c396aae0c6627e26a9cdb0b5faa21287e302c70afbf5a966b3c0b4c2f85b3062a572e003970548216f0ce63cd0528cc6fc7263e09615cd6d772f9d0b6b3e44bd8d90a4bbbbdf6045cbaa256a8568c9433250d892cebe6bd91011cf49ffa07f88d85a598799534f1a3c0ffecd9e578083212875affa522d2ffb11ebfd2a34495b025a8ee5b4236d052cb8e2e48fa12b1d4563cb86ad6369d8a49a43a37f5c4abab7fba56490b2529d3a3f623dddd821682b8d6ab55c84aa69a93596bb73aafc1e55c84d72b3729858d10e0d381d5f1bfa202fa3ba8c187769855e25c38b82d60c683ad79e90f696ae8daf4471a2c87359efa52714b0a1494ea58ea15a3b9640fb6bede446cdb0e634cc8d98691286bffdc69865427eb1a88fa64179ce1837f561dd3bf419ae33ff521a43898cf12c6a5c6163eec22abc1db2f4111fbd95ea4bd638bf7775c6e25aacf34b886bb32bfb0c2cb214225943014f0b6813a7294fccdf0ae2fef9bc5e709be4102573ccf7fa73a4ed75d19ec90bba78c0f5f966cae0d2d040eaf3d31af9a5792bd133c322d1295680946e4fc0858bb8b62742c2de20680543dc12bf8a2e600f192c3a2a4f27a3be15f03700cc174947b23801b20c23e5268632c4e62ea742224296e566bf6659481809ea364e3969a24f98c4d8d733f0c0629f98db9afcc26f4291c3fcf605e0810151e674b9547354e8d9fa9bc209114f7372fcf43187772293bd5471a58eaff55c58ca30bff0ecdc087c117f4efbad40334d6fe4a4efc708b06a255920893e11939ef3fea4a73ca438efa7f7e0844b2f1c9f7011479e387e1338a528196e01624184f22319efe949f4a53c9a294b7188b9d99c0e9bfb51ef56996242d2a59063e0bb536272238939c64d3dea8bb996d9759c423134bf99f8d51cdb4dfed87192fba276216ffa82f018483a4d8a47419dea48012d9433771729237eade06f1b8beccb08e445cd7d1985169047a78cf842827d67582d0f8fc6cd5dcae749e2049b5ea55a2fa624bdf27748fe6d55e33163d89cd345719c2a843c2c5e9e7dd9a36dabb208780398ec37794fd33327f2737e4736e37a04720ddbe00f98180eae9e5f6e818231e0828e3505abad1d903334fe78dc066a5819703a638806087ee94c0d018455f1cf79fa97a6eceaa1211dfc60c7ecbaaadf0b182c311636c4410242d32f4b024c1307d7cbc7741a525d1b4041cef97e901bbf5c2dd34a98ffe792096e223605857d849c3df1e1ba9596c3971de872d0dea0ceb2cbc485ab0ff501062a94e5de4241a8ce8ac0a65a0f80af7751cef94fcae081c2627f67fb78dbe7df94f1db0b1711ccd52e8e3277148d274799cced4a095d90f19e8e61e8bf1ebeec39c3760a6850694695e53670492ed3ae327cdf6dfe9a74c6ec5bf421673feeb28584575aaaa016a95d5002f411d83d11d859400a3f0995c8b872af03f5a20fc904aeef8a72635d53e1492861033bbbf8d7ecafdd3f4d8c6daf6ce32eef078aa633bdbf08442c95fcce4b275591abd8e9dda17f2573b8b12c1d9540f0b7b2f7c09f3b4652946e590a70d0802041bb2c5b46025e9170ddbc9aaf963907f446cfbea3a20607e7ab3ef37573b38f97ec2ed39d999e9fab4f072fc1fa4bb309358ad6ed8c7e76a255804e58af41c208b148d960e1efbea77f1951f11be9a07b01b1cfe945205d891ff57176ddab8618ad12d32c45a26cf9d07bb7b985a35ece2dcd0003769bfad04ce7136c99613a5c2205675c6f5728f6f596b787b2092c872c350de89b31fd2c7edd9ab66cf35d27c2a8ec7db98e71335102d7e84b7bb81a8f924fe52d92c2f228517dd0c2e27d200166090caeb8e43375389f579c8b801cca6d4ca5a82eeac5cbeb433835af08b960d51385c956e07bc4b084523fa8f2e26f1e8a869576e32bfbf371792fc98e78637eb27593f8f480e1f31d64af64af2fe03e9024600b3a791b128f003bc28cd17bbb5c68990faec73f88c10b664f1349b045f3fba24c5f51bbb10259c41a72492c2377bb331b6dd34fea25c2eea8adc461bd0c78d6bad02a506 -MD = 8bcf4c7df9b79044ab522ecb2d9bb9dcf54b6e131404f1f2bb413b2790968c2b83c4d34c61edef8302e3129e67e3f95b249d160ae5e0c4d3488079263e5ed128 - -Len = 65176 -Msg = 1e0c4f0f251137b65a35ba9f8a2a9525f240a345ed7ea453cff13eed1044412ead912f23cb77fc839d6d129a895598878655f4a7c9e28e51a01dd7c49e638b5df81f330e2fe3ed0befb86fc638b24a1ebbc76cd387e0e93ee431fb3f7fc64776c85f61b6997e93b618beda0ade663252593e13b26ea23c8263d4af46fd97fde0e5f9c304507075eddf285a4ec49cd88c2764f22ac84d0f85e5affdc15efb3503179461e09ee01b160e9ef87a337ac532eede1024db0cebae326aec98eb1c784726d84133c9f60e9b6bc7bb77712880ae76577689f105566711ac84b3ec224d14d96f6de31adcd5e2bf4cab2bc6cf916687752a3f5060da184c1dcefaa9353dd2f9feeddad9b7f855d1d4d07f7c9781c4e9e036304046ff27a966d156697bcfe94e30c7fe4eb2005a6b08335bdaa7d72e6341a1420bdf4cfdf12f96ad761f8bc1a0aa0539c1f2745b5390dba827281b0ebf40745ff8524902eb1f23e91647f9c2b717af7279a2dcbf5213d04cac41d6cbc384b66e4ec87e9e61df82f0921ca2555b1dcb91bfe8c1ee303a1b31b11b8fcd38b66f575668743a1917bbac32c50de05364637ddbeca950b5acc33d7dddce7ce57da802585bb23cdd6ed4033d6ac2cd68957e2015d71f4da911d05a5ab01b40948268579bc8c00e738cd7dffd354a8262582561b4d1a84dd3134b6f8ebcff810b6db73e69d82716a31acb27b84c2c6909545f280201ceb8fc583b64622801a713e59d9f08b26ebe37c0b9c3b7d7f0e82432345d459018f6ec88a8211e1daa1a74922362c1801d6df525a89a42ff1f697d99ace9c6a60e6f6b4c9a8d0ac28042f61d506fdc67bd8aa7f2a096a0eb4053da32d0b2cd69398b414c1a926e400d88612e2daea191d57f13ceaa9e1bc5db0e04a5a7a1a20420b3352f2f1791bed9527c6cc0075826edb30262cc9bf9b27802c399399e8c9d4c4d119de205bc656a0910801363484d8d8e3b56107383dca097deb78f92d45d43c39b403a42375d4a16e5112ea8ba2f3e7888517e0f016bda351fa6b063c36b8f7b9cbd3fb74acd01dfc3c817c0f6f487d9affb1d57bb87af444c0ea4fb9ff0b7dfdbbff94c3ddd15ce724dd89144c3f11979fdf533f856a62c2e997440b013445522ec71ea57b7104ab9477905ecc403a0aeff0e8c020347558ded271c40fdbd4737ecae77e1807aba625f0003352145d716a871481fb41a2731b2c57695d5aa1ce368b8dc2363d988333c777269ff3f2478a125519892a80be1915735f8c4943cee0898026586b71bf587e53cce897af09e91328db5c478676731e443b1f2020f207355d0ef119bdb6fe75348ace47da44e21a1e6bd7212a4893c748708867cfd4152f72d082d0e306b05c87e4d3bd0a651f97943fac6ff2b105710e945a88a6e184c8703fa029782af884cc6f8b4fc606fc0c28bb2e6c663c32cbe51af82b5ca6e0a0b390bb7be390519e708f47788386f1f84a82efaefb36c6388a78f3984790b338eb784740bbd3360a22c8aadfc981bbdc881b62b0385d1a476d32df880e3b7701565ad6307770104841a027ee1e7394395fe91a08940bc968fbed1e52f703a69aa2bcda939cd39ae96bba411bd8d9258f4070983094bf3e1db4ec3281b895bc554f12d712928a105dff5b78f1bf2eea5ec8464f90b103e2e626c4aeacc94e32d1c9f16e160f103b267b1851f807e15d1855deb2c18f667252d01b053c9fb9b48081dce21658e255c36d854ea7699ce85c77be644b765346d43f33b8a9a2448bf23539d5ac069cfac55506d1884abe269bbc49d6871c56fafac2c34b8c779b5397229cdb4fae8cb49cb0318d0331c1a24682157c1cd7fde927192e304d860a95fff88a5569a75e0dda0d79d3a09543c5fd77a5e7753f94abf990f8f975643ebd9d1566c692877d50ddcb6437f90bb10c10eb8f8b18b9c7add2c8a8198c989444ef07d6b142d567383888753c750b960f317c16e97fed0389533ea0230b79a7c6665e3ea80307982e7ac321539d0b7f29cfa7f085333fe4a8fb4195887aade5bca377230d4b94acae04e9ed1fe981b8f65bdd90d0ab28c7972bafecbc429bda9226e1087395030121778b5cf3d304ffff66ab6c7e704e48de64a81a510bd9f2d1513a735d77e932434315e561f21b90af608007c0fb06c4e956e8a2c92ececb04c2c1e83d5cadbc6de8281b0ccf1c3780ea09e75ad3e8e84242d01aa73410cfa6fc45db95cbd71c1bd7107236b2bd410e53978fae737b1f63e90ce65da4167d325e04c1f93ddbbdc7a09d6f82554539b24db7652e5223c6d899ddaa6f0766503168ad3fda3b522e1bd4fd77721f6aae2728e80c7d08799b1ad5e0bb4dc676f51ebc9da9ab3ca0f962d4df2e7889840aa785b7e9fd0ee2f8a53db4ad9c79ceb864ca6493feca6e8c5730a109281c37dbedd4958230ce066c0231b805bd99e436ae027083476d01634378e17be35fec9e54a61f69bade4a61ac426938339f4ddc55057ffc178d002ac20e2f1b4cbd18ce667aa404fda835761df046d991026235f433b172e1a2f13f4d60d84bc6cc42e8adb2c1f86bc44e15d1bbef4e585bd7b0062dd36c28674b0d60217ba1d406017994fef798a7bafadd6215a12aec1404f6f554445c6e12743184c0979216e2cb0db6afc38a13e4c219498e3ae3eec370675c3782d8256d033835beaab0e1fb15f17d55a42142da4a65e295eafdb2d2a08da5582d43e0af8e8dfd8c2372d7a758d173711812b723ea5fe7cd5ffceaca2bd66b26924422826caf46a9905c6a802a3a1392adb2d32a2843a384f855f92278de0823504d5d6e34189ba78fd21d0e0077e83ac3a649859addb05d529d5073fe0126fee5b413cb6b5686f6607851b952376bc9f8516c9ea86a98d6ed37a32741ec21f9d13cc84278e57326c0b3cb1ab5e508c0ba48cf0dd796b75226b943c4dafb93a4a13bfd3be341fab91f18cb9aa1fd69df97e0e33bbeceb68f9d96c4c52fbbf69fb436254040f8881dda1be5b18d0ce9470fde3ba0b49ef0cfc054a8b0c6b9c54ba8bfc2c8087595d580319c17fd8011c790855ae55f7400932d87521026517a28ed3d786bb055ce60b00e710669f37db1b87aa37225ea608a4383735bc52f9fb800339883bef57c5fd7e6e73568d37795e632b7cf8e6e8b1580ed6efc39b0a0996036b5a8aaf13a13666f810d60acb9f4a8220a662f7d0ab58439b789ea61271dabbb52530ab5823bfa1cb0f6e7eb9f5e8cdd1dce5f9249facbdcef8d5ddd9de54145e11b34dedf39f162f99a651ca223f2c85470b54ad345a66b796f1a726f60bf4b0459dfc9cb8deac6ed607ebc6cf5788860f5b7033136c259e7b796bc3610745f1ea751f2b1a854dcfed18b475a339c71a5b5db67ee3e9e1cacff59376c850ed6a27c42063c39be0990661159f47ecd38a539a8c554dda8484b9ee8608d3efd6632511660c58284c154b6b740b6278921e21995b81f946f51461ebac4129ebe6230be459ee84357b8be2bd3a829de6ee1deae28ccb8e351cc2f0746de8734c07f402c561d0edc85442f3e0d0cca03dced1d9fe85f8b5b0e1d68e1131c7581a201c323de67c3becbf84a75a9cb1128519801374b0d315bd2c97624b60a4815e18e4c2d350b817a6a49725b508f99bc7b973c3cc74235767e54e95a962489520d994db10074d2900ebc496787b6be40a95f20f8f38af22b3f4434eb49f7b3d664a74a47b730318017d53222c5dd0955695441f4466401fab41beb6f28004213a53cc469cfda18cb1408cf05815f056b3a1b31c73659ef556b507f5ed6bade8a3dce3e8fb0bf12f191db729840d93cd2aa1852ea59d914dbc3665322dc93c3baacd02b32107b9a640fc1bf439ac81a5c27d037c6076e1cfe6ad229638037ac1550e71cf9557c29c2fc6017afd5a8184841d752f2f585522db038448987f2f23ae887863df65d4b7ec61b1e35b7f5d13766a236e97abb7efa31ed470d5a72308bd215f978897b79f81b77356d883dbf9a24a546222d7cddd47e8593875e21d1989c26d94175732fdf5af8ffbfecfc4de10a6523357446095ce485dc60297e7fe1a54eb82140c0e7951304cfb54c9df6cc7676308be5a37be402526420430475e78bd2189071d13ba9c24f47e62daf649cf73d009e0821c01a669fdd5011406e1ace757cf79f40969de72cdabb16acf1d30b4e1604422d50607fb2aa783abec30bdb8d57ff2f8b82d200220abc8e23491f211dd3273a42b746bc3f5df115dc0f3b31ae2bff891e8af69bc34a62fa8eb4c1e710eaaf36ee6f4daa9a6a534924cd196f4c8b715276097c18853c36f26bcf7bcbebaed4eeace2d5d95842372b256736f2dcd91d022e98c304ec32a0fc3713ad2df2a260b7eaac8fb6fd87e5625a78145af3a72b1eb4b36bff6cd0497e6d0bc6abca67bb394446cbd1feae1655307a22161578441e84e3e7568b97990f9a3268b3d7514cd9362c2a98d027229a53d7e0a2b6bef0782b94c5b8ccfb08163b01f3e4ae11ae1e3cd71caa26859298113be08f5c0db8c215607774a57d2f28cc0508acb30b578ec4d22254463bfed504f0a23a79c6f562eeb18d38b98066bdc9a6177a8ab0c1915aa7dc45c3dccfe7bba09642a48d3ef0f41267735db7575bb08f90dc99a484cc8ab29aed33ca7e3681c64d2640c30df2e20da693268469791d0c055164590996d19cfeb8fa97924813dc3763e2faeacf250dcb36887a25ac6bb605678f30d896abc16847acc694a2de4cc56a0fb74e0c298d35dc180b145c2917e18d5eee7a3285ca7807beca0dcd3db2a7c73b6ab0208c1686d249a9ae0ed1ac5a4177c456f0fc129e779524562dde883f09da97a9b2b9442ed781e86b3b01dda0124e64f7688b245c15e478164b2d480b8081c0a3293d60ae4a7549c4771646837e6742f3ff9f9a31711117c6bba66c8de9a56824fa852675b9884052399b5154f436d0a53cb5ceaf07af85dfe5d68046a3da10b7bd1cf025933f6e8cf91d98950251b0b3867a4c35581464da603a0db62d843cd3c791482e660f26ed4c0986d4273c457783399d54d0e4173ea14d8f6d05385ef1d05ea900a07bfbfb98db9692e15b1199b9902c9e00933f852f8d6fcbb96af9aa3de19d4ce10a602066206241bf22a772700a846165a6203661763962c8809f5586c69f53963ef6044a6454711f47699a6d054f5f8e917bdafda466c2a13db29c317a29c54e9e200fac03f791802dfa89f70cc7d8d9e994db4a74925bd1e6c5d6c488b702688c60bb01abc633904abcc9b4ad888de6232dcfde73269ed9205badc65ed1ab729e5a8ee1b84ad7be3232c21c542bbf11b28921303cae2c355ee689ad890410fb585003d2b5efee7858ff1b949d1c0d0b3c4967d61d93646506f8e2e073c8e3712ef3a24b213fe83d33742eb3e4c3f83104e11c36b270d7f6bd054215cb9a8362a6b7f2c186c5659b56248400d7cdf101c0e2a6e887b10748f58e3fa3dce3914e340f7dbc62eae71145a2b3f1c294981bd4b0a051f9ee62fa25063411445e6d927b8c9bc2224add1d6651271d41a25dedd4fd8109a5938b88d00fc7f48e4598edd191e549515fc83e5cc255c9d191a2d6360bd186072ae1539b0d43a41743a3bedac1d2d88c8438f27d78e8ae0ecd07837c7e1a4d9b1ef508da816fd67bc30e63eb9efce610629fb86cd7283035cf0c641cc6b3c6de0a471702fe84d2286e499ba88bbbf8a9756d1e9f8fccd7031222069b6846884c5747ecc8f72b4da98fe5b4860aa8969437319379e51f28d330d8d97cf53b1862a0881880eddb9f7bb2535d08be4b368d228d95a089c7ac42a5a15b35d019edbd507818cf551e5e1b7012d3b4f90c5ed0b1c1b397e03eb7cddb0c0a5a9b5b8eb8e1a87c08cf5be00543b4e6ff5d64762b7f8e6bc47aecf1c15b89755fb98851f1fe99a0c1af2cebd5a7b9d55c4dfc22e9e6343cbadc6ad0e9a1aa1ab9bd28fdd4f1bc258e9709d7e906824d506d3beb98806384ef6730eb9347de690d08a5e8ee559078c3f96b1acbfabead801dac16b3d88d02d6bdc7985ab896feae3e8789baa4a7290658c94b0afecf744ff1a55ac84931050542a76dac6e743a31c15676a66970a4ca37bcef028d2540346be01e427cc02a0f9848d204e3f6aa1c339b365e0e7d8a8408be5d6f20508fb1eec4e7becddad03a11347bf0c38edce207be2f3e2e3e28d86e363c9d42e1b16d1ccc2d99c6e196296ff2b1fc57bd3107b047e7b323332e1bbacd03098f5963aa688e766ff264fa61e6fc2a944b024511bfc0f67997ed08e280db27504018051e445458bdcae56b5828b92c3507ee978498a1b1edf6cc27a152f93ffe1fbe142d42e62aefcad36790a7d25d6b08d296d4dd62c08cca6128fc939fa36f68ac1f5be68c83928ccf8d9fd6a034b2d86ec186f09c98d28d4c8b38e5470820d572952ea1eff9226b3a3bca57db2888f113a61f74b7b15ba9eead0aaa87c4bec0920419f768d23be093f0c48dbbcf79ed51c302cc3c8084baa82cd665ca6f95c49afaa2698fc52ba77d5b02fafa9ff217b996d579a3bcea3a397920a9976f425bfdd75c7add489e1a46b90a21fff07e2aaba00c0f759cf8a2f3207de8675a50f12b28acadd9b2ffa390c94e8534879a70b86d1af03ac74c8f65a142a4c2a72e2eb36d1774fdbabceddbda44b740bbc394605c86ce6bb2324a117a135121dc465f17233162c1b67253988a811aad13860023fce3ec70e4568d871964801d70461cd6d96ee9be4cac6f47488831c2155e3e73dc96fce2e435a4271dbab41df989f262fe448c5bd3c7bb7892ce9f3837b8c9e06a34525a283c3881e58a6f9bdeae4a5c1036cd22e250a2ad07c8b567f1221cfa24209f1f26f6a5281f68151fa60fbf22adda2e9bfee3cf45061b06e9e826b221a90025da76e1947a09b83721d64abb472583232f9fdd9be12c1a2636733323d75737a8e48e7960f8530f584ae5dbb93a25e63d663bba92f1c86a75c638e3ecbbbd5b7af5d44aa53389e1fae36b3f439c1d67ffd869073f07896088118f95672f49d02e66eec1dbbbfcb49193ccd1e4bd7a7cccee8e501a82edb0dfb10dd44da29b3a35b0447b7ee24a1bbed48150174edbb937213201900443bfdf2d3a3ceac62ffe238a6bd40956f07bc51e2f2645a09f91b118fab84a0c4a0228de7b1bd90a56807a2ddb67f57a6e4966d93cc10a53649aed1e2ec0a2fb5f1c2f5d671d82dfcd959c3309a3dddd3228f6ae20ccefe799392dd964d7256201626522849e92c6e3721c327d142cefda8f0705818640ddcbf105b333486bc0cf696cb63a3b634036ba8ca4ac356d32d5e01a67b599a7966b670743f0b0c0a817b598811e609eec45d33ff22d941946a2c0935d6373aea1f5efa4f4439cde7888cb9b2b97aa802b8f50d8a3679cab8bcfa5245ee1b0a0a10a0f615c92691fc2711fc71e4c75b17e81c7d940e0cbbe82bb022fd4d6bd47e4065abed573a20f068f36bec1935ecd55ab8ca4533fbdacbc036c2857a915ef1b793620075dd416c53184e4ce02c21e618b23dc42cadf00a82747a06fdf371097e136375ab77be18ef69edb8c114c4ef2af31e3a8189c44c7a5391a85ffbd46e9ccef67581705d9b44ce8f5945559b9b9662b5cebbf9203aaeb95192270f51c919ab63288030e79e5a307e57f3576f8f66e649a96163ca7b288f00eddd99aec2fe91f1b52f1f23c83a7500d954820776a26923f2fb318bb8f0bee7e00900b400526ae94516a6dbc2eb875e07ee3f2df650d28cd212ca2b990c2d4e9434ac2b2c1d1d93ffbe2bd533754ce00a4cf4a7b77a09ca712d9672c586c37c30e505dbed6892370cae18dac4e1aecd0af30b3e6227f525f6d4fd28e5666abbdda5738bec3ab11d936ed3b21d36946f2e6deaba9f6080e7898f6714a0b20951c3fb5e05d19b628dbd87c625e57ce50c9f40fbe3152c915654e73cff9f748787096f2e0f43938dceb28057fbc4bb8bed85f7a4816d9311bc7c63e4b18ab3cea5d8894b72ea2b1a2999e1f0fb64fc6d5a07174f5b4f9de65f2c8cc8f20878c5f357d21df66f6af1e69a33f8ef6a46739a4d2a633a6153f9888ae84e8ac1ca54b9afd10d627a59fa4ddffdd79d81a285f780b848e64ebc327ebe01df405eb1633e070e8180b2fe1ea58dc7f4cd4f178bb7c8476527bce0798bf15fe4dd8735dacb8812e216c0634338cf1ab9497cad6d234c6124c554c8b7f54b88c32ae35fa1a8596499ed4b90524ccb7c8dd8b16c1383358dec87bd7bd205f306e6ec1b36a11da48d0ccdfc8b342aa978d841965d661faa5426369f01b4031261b3eed6c2c0728e13a57d7b5ecf1a9293034dd2874c3ed43c389aa4634337cf1f94f7bd0ce7ee4180cbc76f110d63ae5774c40ef3ae2adbcf8b7b72a869e853caf0ce781bffdae55be57181aad54f244b946ef1a77529e69587a1b1d80d60c5e92e3caef8ee7ea12d5d4458330e241df7cb1224ad87841d1594d40afc17e54e05b80907a99e229e7d9a089db3a22bc0e4827a4e0dce83a9d71bdb241b6ec016a5f5fd2d38f50e04d30485f73378ac36991f6c18cd316db263827fa93dfc3944514ddfc5acdd89fab703820fba78efa69e0cb129f7978c5f4233883e6aa897019228797a0e3ddda8b2ffc98c508a3b397caf112b92ea26d9fb94be8dab5a2474eeee91f165fc50374b602017fd96da16ba7253c3a7118448160fe83e07fa26c6ef07f0d5b9042bcf0b8e5058ca841267e0bc419b3df4eed31b0bd0f98771e61e1ddc5ecc133cb69779f221f6be3c2c5177f4a15b5c7baba293f03c6532a5aca5ffd3a37e7a8c38b81df25a9ae2a76ffe06843cab0c8e05de0625f52a107fc0821d558695f6dcfb5a7ff7c5eb3cab259615d3da31561542affa14c3f129e769deffcbd0b68f1445a3286a2892d73194402c49439841f8ab3cf9246d6286c6f0e12e9b498b4e1d5fbe9fb14c36b8220625d44e3e86d61f88ae8abdbd242e029db2312fb9bc3add91d16c36f980e964c16d944a94a41c72212c364779e02985b87a90ede8f15b3d2205185ff61771e10e3ff5a50d991bdabddf832a6a3d80358960d43f9ed1ba255c812a960da5587f34c37ec7710ddb3da6effbcf58e43afc588d848ca2045e7e856e2a4204cfa6287d23b71988aa65852283269c0b7c5fc16c29283bbd33502ee6f3a0caa43f64c32f8428011a15c0987ac38bfa4aaef86c0e5b48b6b706961fc7391598b59d9a3893115ae8eef9f460f6d8b252de220be4864b6d6458243a3770671113ff904e6ff1efd437cdfc0ac3ddea230a907fa3131c221ead6736436028a61aa349c18a4f91491e547fc609ab7920678c266dc5e01808e4f9aee3ba81381ebab05dd855c2ba45c1a9cc00f9ff10a3053e68967b33c12446b0f3d4a682e8f678a2017cb8b0b50b449c7c52e2a7eb9b858a209fccf4609fcc3affb00f4a8057dce2fe55b9ffcbc42f975663cd8a522f70d71433c10b3da0fe009a20fec348686fd61c0c639841980b0123dcc1928c874c8c0df86061a05065688bcc79d48852b8e72249bb6362ae5e42ab64c7a6e3cca413d396b3dcd1d788db9c5b8b65873c407ddab3cb48752fb3c2b6a4e6ae9d26fdd32eb6c265175cefc29376395f8e4f8d010af39a30c1428fe80c44269303bce134e60093e5bc07238339c48da8e5b229d97bb130018f107c1e74eb8f3b5db7d79ec21b31420601ab8856ee8e29d48e9c6ff59496a527c101ccb8412a8ff33e68798cb0a1663e720f37b29b44caa30b6c2a4044d302d17ca7589ef0fe770c7a1a2d0a66ec37ab82d8fa1474b87499502371236aef02d569f42bef9d13dcf293782205e61b9f97578d384620f10dff8648ae67aef38c7ab172ad72f272a4ebb007c144d73685481cb6580e48f77e1dd46448d4b7e6870a7ca946f19722b940f9517091e243d007f7dcc43594d3b03b63fea7322ed0ddcbf1205f32342b013997dd98b2af4c6a1c1086e383ab8c8aa15b9e3349bab97506395f5eff7096661db233a270e5583acf903c1dbf362af397e3cd54e104aa37027beead1ef36acf3671dcf4932c7028689f86dab3dcb6d564231172c1b3aa0b09e056b25766af23cafd5ff8e32e9b1c2e64ed82254637175144f5f5b270c2d961901ed774716e4c227e44152890e1fe6a08f87dde1cb5a1a66efe457ce3f98953b2ce833bbbae31861b14b229fd4ab665b23034a605395babc8b6cae7b35703276fee1d76ed77ba3dfc5639af1bdf2d648b1b0d44a9c92da77ba4ecbb89e42f25ee070febaed1cf914a92118292a749b2bb437182b170ffe4ae5014bf0ca9f69558a0c063a7c558c82d50a26a0baaf3966930c926c533b9a88a43a8bce5ad3ebed44298a5805a3d2bcc19542f2ef11457be687bf98c1c433c3704127abbf8f1e98b74ff7be099660250748f98a283923ee175f1c3af3285e8dc1bb8c13793f55ea4be5dab6f88bc95e0eabb6e10695793fadf914cd57d67f3a21104590185346548a81afed632252ba50240791fa9499e332cc55ba706d2a7b06d5c09c0d694469fbb9e3cbd9c8a0ec7448681784d52a6b2e6f4bacdd4ac4a2fb72a9a1c8fff48d07e522dcbd0d4846d38f64ec25c59f59f94852feeefdf254678d5d5bfb75cb4047a9c98a9d5e9d6bf67f6a7a6df45d123bfe283b26051801e36c57f4e5693d26235e547ffb3b34ce658ef56ccdd008366ee727ec32eeca3de7c626374758bea133996007472192d0a934a21db5e71528fa99de7c66196d5afcf1448d71a2e443e0e158cb01b02c352a16dd17c6b8088c679cb886602395fb9b943f51f5063280c3accb35cb65854e709c22e560a156c35e464274918bc8923c15733f51c12dda547213c20490229f153afff124618450174d08d17ab079b1670b8ca018823ac30bd7ef1a3dee88a97089e0e5724715c55b1788279c402ddb94cce82ea9b7fddd5224a988e7cf2be01aff621ceae09f95722c2cd1669959735df0223585d0cb8be00edfa882c080f58d01f011eebc6632f4f173898a5a810b1b1ba74f5d7b38410decfdf3af512c3c4f38176f0e391e406c0e089a47d239156485f3e66105d8bf645580f4bdff8236ca18447ec9f53c204fe8389e5fbee624b2e5a495610f01396bcf05164f2a2777961903eb926f24650906a000026f1cbb9eb115d6be0566518cbff6e2d37f80712bc0d21008058b813fefbb6a0061514c805ee424d8775c9a5faed2f4db5e31a603963b968b66b6074d1a0726ba440849f0658bfa50d378665d222596d7449fa8b60face9acf15859c90c0fe09075b646776b79e1b7b82e67fda06b7347d14edbab93a283dd33c71b2c3c22023374ffc47db72a556d8402f1b9a01104bd72a3c15cd8c8efacbca6adff210a1613d029468bff39dff2c58aa639b7c2b598a752fc52356c979bea6b94ba611486a205e74f2a9a14dbd80b29f7d64ddd1079fdb0df24301a261b4b8a61d662ddfe7e84ae40c22e47f39db -MD = c9c7d9b0413dd75496646779efd98d505921b9a547cbd5c460450b24fcb8119a769c27a9b63e300402cf04442e900cd496c0a05682f88c820d5a6d431005eff8 - -Len = 65968 -Msg = 8d41b809a8085d72a9906c95931a2e651adf0e7613b0aabf2ada269ed34cc51c83fcba731f863bcdb516d84f6a890b56b3cf1000c894f6ef561ff749747a0503d9d3a5604c2200b45b0c376e5007f85561c04f1227babeef52378fde9a5b69bdf98f22d81724d4b0063833fb2fde1deb8c7973b31869284884ea97642c381ad149f8d8e468d3de481b6472fcee54a39f9cc325ec83ea5c8156ffb7e412593fc733d5708b2778470403569c7c75b2b2faf9660dc4508683222f409665340601281df091d63c5b366c26d75a80ac4071830c2ad2436882c5b37673ddef7a87887b710fe4cb8fc4d409ecae54127b4509c23bd71c71b12949bd9561338acc23fb4896fb107509fb4962bea53139ca0ba23fef34955714c238c8f3d2413f12248218f47cbed99047bcff028299fe81d86283910ae3fc7994b95af88eaf1534d04771f35996010df25569220e366788f574158721ae68c9e8f5fd0c5c24151a706fdefb5c3ff469423e278411ad7fc7aafe7d3b419fa4ea06143897054846ac4b25e4744b62ba8a809cc19253a94b263e294413325db7c6363d930152c4b0d3ab8f0dc6efa65c5af39ac0b29bd0d58efb1cf179bb91a944c09897b208405b75d6d5e05910b4e1c0e55dab4eb2ca24e527000cd4a6e3834beb4ecb13f263507b1520e596763351a39c100acd614040150bfc1d8cb9fa4cc50187b88ad7d696ceb098a5e3e8ccb4ed61d966976eda3204ef39ad09bd7f0c99486ae4807e413554ef64a7a92f2713857ce04514a13f019c1ade43b27919cbaf0920d95eb04a36f71aad735113eb7553354e32acc418b5c3d61468f1b77192ef8bd01f8a359ca09e789a92415cc1e33fd44bb2c79d0c57636903a32d3d2f684118a33c6ed5dd7b3152548be3d2506431a0fe4fcdf6c4ed631cd27ccfd4fa568df6c1ba7058b6cf97f002e69e3d410011e290902695e782ab37aa7b3d447a63bb6e5121fa85cea5ba9acd2cd9643bbfc7e329fd3a421e1b2302b229e0555897b3c87cf77325ce048198dde4fe10e7aa3be8ef1f71c711c2b3c5130d20cf3cfa5d4c69c643005df5d43159967409ecc8563c0d7d34eb677e43c7f4b06679cd95a1424115d1de247f9baf69cba317f422fe26a9a0e975c958bb517e98181cb46f68f12b6d8787caaabe583709f302a4be1cedec0efa2ede5603abd84fa080999098a25055ccc2f87e2675e8dbcc91a6a699dafd51cdde4f83031d2c5d646d22011b9dd75508595604b94da7c6968ea2e25b3504f1cc4dc3e4a4ef9f48ceabfac9d72ae9f5a4128b43602a9a54b9bf3f784c462b745d42e383cc685b9a4401c7f0b691aebe06b640430452e90c9dec267253549864ea86576764d188da3039327f9f194d37970d1c0d8b0ebd76aadfffd757a97348dae2c69855724d91f919e27d790befe9bfdec8a8dfa63e1b495f71b0428be5a9951bd81f8593d346076a80f22eafbb5ae7f3eb1ce6629382e0332404fb43160e83fc3603de7c4281c2f3b3e7a54dda1475122e728a8ae534d924c1db6a182dff0c4c884c4775c1cb927e2462c62d739fd30439b1b1655bb79afaf03e7754520498d27502a7c578aadfd17a6e7997af816790b3e1453c1e958d7d58330a3dafa68f57a62ee8b590a811b65e10a6d2b6449b80450b2d5755551874a2c50b1d696c59a3c3d8f18d314d90f278523527af6fd69b963651fe2980a5a975f9623aabdf5e7e7306aa958220c4506f3b0edec28b7fa84f6a9979c29d9be27ad9f7dd9b8506b05ec2fb14aca91697ecd31a3f191f007017afed0f473462e8596cb24d61e9ba002d13cc54d670ec8e96233f91d9b3c0bb970e350ae0ce6283b9ba7cd42690e0388802059b29feafff1632661e2dd02750768e59b0b7f2027a42cc3bb81204e21e16958e32cddac8b01309782c3bfd9df95d38414af128ad979da9d9424ccc267b80d64f61e98c9d6936ae5b042bc28a7cf412d61fb9f8c8a072593cbafd7016166dcd316fa69d98f4272bf9ee26a756a2e227fe7935ebbc5e68e54e684c7818b986811aa62b9420188d88383154356933d07ca29e8d88f1992854f593626d962a73faf34ca1f99c9c10cb0217dcf32cf7651babd7ea57cf195aae1b8566d7f732db40a5aa2f55764959fe3ee6e66905b64a0bff6c74e1bfa5a5fca784813ca399675c1708fe2e15e71028d4e79c205d37265488a552ad2707b14581d9db260227be5530ae350fe13edd52ab62249f9d43a2ff2ccaad447005279191cc9b1c7ca48833dae3fd7d42156683ad9fa66e2ba26612d522ac2c0368afe8bfa4eaa779d76ffefcf07e02a03556c3c1e54b16711c19986af678ef46f7f053f3abef4e618919bf7d1ddf256367531acf7e3a1ed5786396d38e3814a37c93d91527d3999c822e7e47b2496ff3710591c0b09c0ec180ee16f832152481bd3f830d61bd10928a574141f7e366b91b162f7ac4996f9cfa5f1fc12a37a648849d58c3a1d63cab693c125334d6941b2f2bfde60258c8ceaf61ba16bdc5225f9755601f2f45a450e684f865b049818273ef01ecb102a1bf679aeedf35e72130be0ea30a5233d0e7cbd7fc5fb465b357b10745751abe82d7eab2c304d8c72a22c3702a6a53c849dadedf24298851b400af1ed16786b5f47eff52416def8ac59d6d25fc297a2b968fe8417aac74360ce736daabac3b0f7e1c70227102c15b7a0983d2212d0f853f70b0a806cec03c41720de3dd2a82f3a91903c95aac9860d2cfce22a2605afdcde300bacf78b38add0bfee26fcba289fcdd81f00451bac1545516ba86a8a3bcc7529e1fdd9396496819cf7f6775e5faffd0b13e78da70a789042245d5ef31eab52453803805b1a068044961cf12916e3a5a5d5cbd30023af744bc69971c4dae1fc1e785e9b84cb867333431ae89ef0c36e44bf1db39b8a1287eaaced5173f308e9122d5f792afb9ec1058960dc247fd7ad444a6dbdfda05a418b51d97c84f998afccc196a7d22ca80027c39f3a5e1698e941023c409af8df17ca5fee317c511996aacf84a60ec13aa716ac1681a0477fb8a770f9e9f806299104218c3ece8bf45438b1ba02256bdf2c5e8d77509f94f48204112728895ab243e54143e2f01cc15ef312973ada8f0e067bf23205a091afdbd35d547ae3691186da2995cc8585f91d666cbcce82ad3fdbdb74c73f57900a3c81d0025f8ab3cff04f550269f35a14260f2a9b2bb238fd03097fb76c29428c1abbf3b144e3bd3606d15e1a39ce0baaff69c6a2d0edd4be12929d730aaa1bbdfcde32c1d98307ec40fcaf3dca8a0d161fe2db745c99e30b90e3389a993e7e08596537e47bed067b252dc2ed7a9bf0edee26e3703d5af66df487eb8e967afc03c6ed6d79ba964b3b29e123c9e89839ab00824936e185814db40d20df90c41828bbd33e01f3f338d4c5b35c2392e359d5eda1a728f7be063365df630e06ce550fbeb3340dd69871b09f10d6bae821c3e71be177d6ce6917a7706b4c8a66de34f13609e9fdd10a68570c962dc076b82a6701ee25c0f42b18226a5d27d54f982a95b853ca7261ad9f40a49fcc04cd3adfde36144b6807589a2cca119f9f0f70c865bc0d4febf7168905ddaa3bd83a1e66a53ef0533c5696103f06251e1854ec70d9c7a304cb3fb9b80f3e51e7bb6bd75154730ed7ce80481cc1a5042e018e8fc67a51c163a07a2baed54d036a3ec0ea227478cc339f1303026d2d3b39cb3acf2bbfe0c4f6fc54c0cfe0604b3dd2e7eb5c8db6b5111e6d4b739a1536ebd5d82f33230b4a394f5e3dadc93ea5dd083f4f51f8c355dadd1d85e2c0e3839ec1f5245f4c27bd9519d4e6cae83e9fb25f359ac55e152b0b5b9236d27a2eaddd1000431283cc8bb4dc7750a9d5c68578486932091632a12d0a79f2c54e3d122130881fff727050f317a40fcd1a8d13793458b99fc98254ba6a233e3d95b55cf5a3faff78809999ea4bf978971ee8b64fd372961be0aac22e0b2c7d9de92dfae50ae7761046dec304f9d62fba5b7fea6686456bffe41256026df44578c0fd5859b5cc18492d8668dda1c8998978a92c47dd5f8fae4c4facd1f3290a50a5aa11de35176a95bd46f7cec44f4a96cefaf88e391f85b9a1b913174b2940b81fba93ed1967c1886e86fc62d1e8c754f6ebdb842a03f2a45ce5454cd6838d1197a57af0c32bd193c9dce3347b137466690241d440bb4af1065a9fed05a653ef960123a3d2d20f4a579f48bdf05de62d9dc4c7f8fd93e312169faf62892019b4a3541a50c908cf0e8064996a0236a12d1db9ea6cb12c7faa062ae057b18f530337f4eb92062eb562ecc361c2f12c19e76138059a1bf3650b6d62df372f22a45ddc8a03e22ab246e9e5221e437dacd4eef0e5b62b8e7737c8b4fdf88b42a872270979ffcb9731f80612073b75e84746a65549887ba9265c546542c8beac8f30f1375b3bb8ec3c4d49ebe955d4c17a039ff6b9d914cc8f6750f6e7cc6bbd25853eee9444249a2fbb27eb5ed9eaa9b3804e6ddd44718920dd3102337ffd0529d372a7bba5a9119ac61298be542201924134132a373c6f792266efec5ffd04faa03efb37dcb0e2fbf2ac6cbe41055974cae39f074dbfe006eb754848e8e64d267ff641af55d69ec1c557dfa51d1f220981df6a1ae4867b487cee83ffb7334e2bc72b2378bd74a58ab2a78a2964d9eb9f0a79fccb983a91bc6b252b67278e78791a60092a503587c55f0dc4a1a4c026c3c965cfafd516d3d13adbb715c6325c9cee177b4ada73c5f00f1d47b4596c640643057b2e27d5b2357054bf922fd98b15b6c3f24098c9e09957385bc7ff2913e50beb57cd0cd1ad4780329d52a0ee646208f7f6a237a2483fdbf1a95302a0b6ce887a1e02f0b535860ef7e8dde5eb7910591600f613979d41e1db98ec004ddd415d5416767fdadb8f51171aaa5b4b498f3bc099a2d904304e2d48b309849af7ebdeebd98e06cd1fb21b02bb3e6da8465d056a293ee482b1c302eb7021ec12870c91b3efc021f6629cb16d3300b96d00086a855830b29d823ef71658dbb33f1b422a4ec1936e0154bdb8992a97bb1406ffbfa48f1eefbf32109e6bf57d768b252aed1ee7ae2758667385290a79ef37bbc1994a365fe86231f65d5eaeadb29125057ea6da470a76088ccb9f4b1dc232aefc6bd8f67a3921123eb8611ce2d3cb9b804369021463e4bb37e05e7509d0bf40eecbe348045e6643883405a89376950929dfe8077ce02f1f23680900b4971822372dfb9374c4bc563154deda5607a7fe4098a64316ebbf74cdc70186a481e7b35406846152189dcae89f3f3aa0f35edb8322265d4903008ca591ea6f502da884d3ea105a12a685020c77b941eae644315ff0eabea9b2aca7293d26335e06c517254d21c63d0b0cac1b82df78ba4cd280458955dfbf771e54e73d476b1489e7dac6a42b3e37b28f19a425045785939458b2501a38d0bcd0266e16b08f1a336b503683af3aa94996eb24e2ea56e356f42b54e98a62a4106c9c0c6e0417e5afda0803602033f81cbe812c50d40f4a039c687bca38e5900e3e166087b48dfd3bbe72abce20c2aac8608c08d363e92025d790b556983a3b12df3609184469c7838310ae32236f47b9276c690f1c6d0c3a404480234ac8ebaaca6b44743623eb03b27269109a82458b6d92cb48500374bd60f46ac4a31a48428a36c1400c54ce28e7188afe08b42aabbd9f8e33c154e02bb410e39f43b6d77699190df02964e78f7b63826ef06d6d96a1f34045c2d9d511a43a7937af270fb3619269092fecdd93f9e3cdc7e42694d8953e7ff2e6fad9ebdbc19a0247d357959e3380ef825506d2ed39ebbd567826de01d1abcfa0405526a556d4a3a0444579896cd437c325f9c8bfa66aa3c9caaa33923d42208142ed6eab6aa7703b126ffbcdaee16664e82ce20be9a90fa0968575a101d1b9fc6ae910586d811c8aa62d78d59a26ffda0426bb3c4445758d744ef0c8afd8f08420fea826e00ffd1178049d2b8f1368a5126db0db76be69e2ec6d417397d648cb1d84b2b152829662108bc55a2e3535588b786f63d18251435776e43c7a483713b921bc6245b77cff08398dcbd81afa66e7bd535fe52fc0115de2558d97bd4ff07c4c11c429ed153ab794430b1d230c52bfc2e94a42153aff584621d1a083f803ef6a7f518fb1f3c7a702a1927debff9e6c2fad9d48d1264feef8b5b2f55ad3a07b134194d7949d086f2b15ec7ae458cc753a2cd389f216958a90adac36a04768b7bd04f8a203758f78641c93849a8c4f7398c38785e68062a3a45627c4d2e7cf1dfe36077f9d21bf5b5422023b7d2ea9efc22e23cd3d0829c28a6bb020811946262d515bb0b0063a7051c2c2f01a945e322cb922b043f27d8fd93acfea39706068e0f34ff5faa76350038b5052e171fef35ee12edfb9e3b034076ff1824a71904eaf785eafbb99dc82efc834c4603beeabdf5282bc0d607487ab67af795281785fef6d225e913208816d15dad52546bfb40479d8d59cdd3cd32bbe644fd0446b05375e15731a2479c40200cd059f46e4a484c38bad06de7baf0ed0aa66522efae70da7b29d94c5a2c344f595c63ca0f005c6cc35b2d9d8a383db4b0c6d46a59a6dd8e6843ebfba0627bc809fa79be9645050f04177644056f9f789e4b52c4cec123fa704c6e9662649cf1e751a1b84a40c99dc597b54ca086a0a19ddee8189427c9855bed6b05e85a1f34ba0ae5a0751a337ecc82f19ca3a5c89775279c4ef4ff5796f0cde9307a6d8df849cc4d5e5dfac81ae181331c56f69ec2eecd784e36715697f895f0ff60c46ca45d40e0db4a0912dace3c82b4019eaa8bd0798400a2a74def3cec895ae18947a2be0da6fd866f98245a5ae64cebc87458e2d2c74d80c6c406817bba2947e1a35934dca7ad5853e2614c8467cc5d9a8592ed81491b17f9434492e98d54d8f60a318755ecd407dd79fa6d610e1c9f3c64a2b92d1254b066531136df0ac3ddf003927e1f7c58dc37e455859ae225f9d799ee0e7f2bde93357bd53405385e9df717e4e3e35f231f86abdc5cd6ebcdb393ade0b41f9ba3088f44f855021f0e6231cc8f7c489e1b18f557f6b9be32fd149727df72b46a89579c35e2617fc7b972c9adfb12f7402a0ea96f0a65f9be9e650c8f5212e6a07ac783d6fb2023394816e53f916c974d374bcd7b8229309896ef196ea35a5f465da16dafac59977ca496ae0cb754d1ce29158703c5cb0bc6cff7e74a3913c464192e81495bd68298b33a4b9bd6904dcaeab5ff903b1331522fc89eae7c05c00098b3e82b725d8d965f4ae47457e9b24961735fa94ccb4b43a0a9651fd4f7f924c17bc9dd57b7607d8f0da320a027a9537696ccd760b900a209e16427a9b217d77ccd4de874aca2552bccae261b12d9f1116870a1dfa7f97651b9c44d63ffc322b1f09bd32f03fb261acf2d0e2f71eb2a1a2f738f315bdec76279ad196aa4a50b482ddd26f28615f9465e4961430e86077934fd29be9d569e236946142769649d2acc386a24fb95d596c129a5c1af538e17bf34f8ef3709027cd0b8c50018a8dd3d15d6262c2b26c3f23ff765101df9c9da1743832aefa0fb55f82ab55e771bd56a4fdfe274de6eca4222d826982021c0ab865052d88fc3919627c56aaa50638c9ac47b2663db15f26eb0f672c17f737a735284ee62dd19cd28a6b16e4a69280ab3bad07b61ecc4435f3279d0f30496ff18c406de2ea24bb6f1bd1549a88a13589e7a0968d6d723c6fbef89c9967533578424ffaaa6a50054dab319812a7dcb7d444c4c762a65d9822b314ce4129bf18b9dba96db31b0e1b0cbd2e7a03a09f9818c77c12bc65e8f7fd83eeda9cf3e79a14dcdf4f8368996d1ad60a42e3ff5456d5d459212108aecc6e86092a0362672a47aa740891ff9c6c066a67bb1a10a5648a1fce4b071b1995e45dc6452ad1a85990e8ea31753c81983e0ec92b3c710d51a3fe5e28f529a3d4fd5fd8a469de45a8af0cb45293abe3924017a11bb1bcf69eb1f48b136190e81a2820a2c046f4a987e08a64d473ca3cbaab3972152040ebbc4296d7c2d30d50d5e324a74158915e87e3e66e3f9c13e7a1edd8ceafeea9773ac459b69fdfdb7888bcf068800550df1917a5531c83158eb8767a2934a353038ac5b1ca02dea7c9a324087904d39f95cbfa4b95c3bf4b9c9ed381e44bb4ea2b2cb53364a455debec5a6d12b5859fa2d010a4db8fdb7229ba593a4b27db9bb48a1115328fcdc0cd260b3ef21e2feed1f68d6203f02e147066d154706131853068868958964e7aeaf04d9b6df5d38e4c763dc779a7be405577606ed41d4575dcf33398ef8850f30af0296ccd5ff9e7dbf729b984dd135fa2920b71c081a0d182d41f28418c5993f5d1a69958862a61482157216dbab3da1d61dc437cb5c902e8b3522294cbf3c27239cd0a5792ed645a9dd1e87d6528178f8cdacd50e24871d736d56f316da5e84bd1a5a811abcb58d8139ff4f907fa80bfbb0df78430a6851608aff56099f76d46403659d0f74ba58b2ac72f2cc7af7c77957eaa5fc66aa56fcfe89e687772b92c2e8806daa1f5b33b8b53805dced1727dc234cc2acd1c3ba834895193309d34c445a49879cf51eaafde4aced343e8cc9aeb37462e6c45ae8ade99f627ec0147d82a91f5f2aae8b3b1cab503d74f7af196b89001b0cc6c66dd7620746dd224582e8857079059417407f79b06b11a114939d046e4fb1419cb69a327b5ad0b90d19005ffb49a04e4967a0e04bfa9cb343c4bdc61d6566dd445f50eb4a02fbecd18c4498fe657d55a82d2b7f916078b6c329383eac108ff263c4b5ed21d3a14619792fd128410f22a9fd79980f312813f93da6ee88c5af19618313c86141735d6b4c4c98d760e83dc54515da43e13d637c7e844631f946cad417050da6d0f48b4d920540aa496b1f90b07aa6adf52b1dc3685ae6462fe97f11fd041d5106876816d704790f6f3a3082bc229dcbe173bb5497954f13ddf9bec1a18b87fe66ae6c7d87a4928546b83911c4a8201c4aa9b4a668bdd1598819f269b125ce1d55fc10d810703d9a648761c45675ce1d752fa23f785f2d55b2acc260884d602c68d2edcd2de1dabd4d0a63210e15f85e05980c9622d3a3b6e234a74cb37cdeba23d56bb32c93ea6c64c3b5ae47f34f4c80554c3114c5e4eb9b440984af3eaa24fb86032098e0ed364035d1d290a8336759f9f996aa905162424d61aef7fd531b74375c9c0f63739973f3202484bf354d16e88d4d70ed89c98bd368321a5359fc029bd09bdc95ee04546e591a7072d55c3bc38fbbe417ee7fbc5855b472bb2f554b05f7969cf2ed157629c52af09d94132cfd796890ba0ff3785ee28cbdaf53a5a2284a22ccf4c13b6d87fcec8189e2108f18c2d9f34e6ed32459774147aa676bac5530a6f9363ae48f3b88c5bfb24fc2c677f496884f7b8d64da8c68ad36db25ce2f53b98e119abf7fa6c14ce7b14da867cd9714cc37c6809e44aa795acf0f528c091bd11821611aa34c6ef8b6016c3fe77c22eb3b81c06b553a49e9dcfda4706a95016403e03e849eaeba4f872d1c07c9f6107052c8099c1e3e0330a02d1b0dee35ad08fdc8839bb6506bb7f78eed8e83edf84aae7502915d923ee440e7d3998b7d67265264c0beaea3dbd873c14142a9a632d0bb133bf99809858b3bb88e91c6dec8529e2f866bdc4b8317784ec7a2afb168b8e52d161351f64f8c0d097c9524dc69045d933521c39a09fb9191e15d1ab20259c91d31ad1fdb256d11755df229f891b20d3a6d8ef931d8fb4c351ea05f1a8839e37e1ef5563a8fb5056673575aa60af2298f9ff1e18568ad0492d03af14d62efa0ca2eaa9996e6ea35678d331b771d3b3efd3d09211741775755c67b85dd3ad1ad8bf12b5e72d3734df2ebf400ee40f3ba1dc5131c59ebf0b0d831e0614c7886463df6f62950ddf69b9310388f7e2eb2277bd8ce47efd09fada4d318381da484275ab0a96ea35edacab2aa7f3ba93f0d0361e899482b97daba45fa715eb32741bd5cbea3a2fcee9647ec1b1689e1ea5aea9a64f271bf9a384336488a69cfa94564ce61737adff5cf8fa9d2bceecab922297fee6878ee504ee4e02dc1dda58315da2a49a73a9f1cdd2e7671c0fed644095c7ce569a26a72752bfe1ac62ee74d2979faf7ad86ecbc4590dc68d12e66f367002bda74a2a6494164caaff5d2077ff6c0aacbf4d43b6c9f5346385bf22f4fc191073e27de147d4a4be05def6b7894044ad4672b96fda650e23e50cfee81c1bfab9990f1d94756e62dc995015fdd11e874e239a063b5e1f0ca3f52ab77f0e1a79c5d734118c19eaba700f5da23878209db6eb3f1bef6b80587c3be8d230f38100fbd45b410e59d113400e0d85b1a5cfefad4769e0d3280f58765e4d3743f3d9f624398b95655daad4163f69a6b081b1e3fbdf213d2ebe5475580762cf0035a9c308adcdf5d84efd67b84a78ed7c3450e2675a6e1a4a54d717ecdd2e80aee279ce6fd92849ae545333eed643435fe53455ba60595f6d1321a7f889b9339721d2812164a479309632a0828bd08e9fbde3a2bc9be9f4e023b98b45b20bd1011b3a43e5f7496da63d25163a1329b885e3e73335b026c1ebab272d9b012d4035f83b7d853a200e5870b1fde01356a7597fc86eed4a18afd5d3f4f4c21e266a7bdf5d95c7d430428d5860bd3a365d4563bb0cbdac0fc8a4e8c5a74781b0fe351af827f4746e81f28e1db9be11214878eabd3d8739a73d896aa6c890a15fbd8b5c6c210254af1c07a4e644692c7f1f2a38ade2335dbb7f47a4a1df36ebd56c538763d3272e40086715db8a2455f6e84293b4842be0f397c4dedb75a124b71375e404c6cccbc84dfc29261258522eada844faaad68af68cea607f113817b0b8d8bb788157f4f0f4ac2aec646eecd1754493a6dc9c226d66a071b33c658b66656654e78c326f6004615e5809cceb8449fec7e0a3e572ff2ecd5a9f7d9047812106f67870c304bf85020f8f88dc17f130be2ad285194055eb5b646d5c1f14aaf5a0eb53b4747db6807783bc690538c0326c02a10ca05516a531d442617bba89e71d79a1e0aca1ecfba8020535ae159957f09878c0e379eb6437f549150c01c50263e98a7dd2370a017dd69273417722a832347d2848737c31550ea7ff3ab1064b5b8335125008b797de468cab2526062c1a1ed8cc380d7013736687a86e91f6cced8ecb278ddc9cc7b3991b66c2eaebeb919db2341c0d701379460f960e6a3b8c02547344f17a6098e418662a808b7aee7dfa33e95a3c23384ff6675384047d93801b56f2e4acac13590b9682c7d05a3cc87e82725c62328adebeb867362765ea512c9bb8ce38283efabad2f3ff8233dd586ec857884744110ce62a588e9b9a985bcf6b1f17e77b23b06c43079069afda17152c2148b202d6c2b5e4b0f227c5a5884beeae27814eca616a1145e24d743aebbad757036d13e0e9740ff6cc958e1abeea4bed67ce4839f6fd63355df62a05bea4f081203e2137676cd2b383ab9cfee7f2ab643d96127a586b61606a2c7a44771ca02709eed1e426e2566e7f329859eaac359c12a053956dfc354d6fb60cfefe6a0fd22545cdee0c21c2af28f12933af60 -MD = 5169e69bf0e777581ca94e070b47454ad7f6af034dd3e2ed564d020f6557fd908f721e2b19e548fb0c41763fe0abdd89efdacce8e3546faf22f3fd089928b019 - -Len = 66760 -Msg = 07ab398f3a21e5a2fd2c0f8573ad22c683405d768b1d292e523caa503fbd948fc98640b22f2eff94691aae705ee58a5b57054612b4ac5bf6deeda0557c201aebea8715a9e63273b58d1f45b187a698407e1491c6d497bd70955aa275aaf09a9b50f6e1fcc9f4ec0a5185fcd154b8f47cdeb5671b53a4f6a360cad93631f5bba5e51bcb343f3e109d9e92fc572fe245176130f098999caf9828876c237af726138f3dfcd8afd687755a906dcb7fed331aeecc53c50e468f55d3d784c1ebbe82ed38a69b708385fa9a6fc577b6aba2688c6cd3b92a1b6c3fe44a03499aed117839c79cd18422131115c37a409e1dc68975c58b495026d4664d7652e235e9bab0012468c69df44873ed40f6f30e3c2441dee03d2cbe9947ad963e0e781a457fd14c3752a14261ecc92acd83b68b708335cea53089fcda8dbcc9897d32d26b298423e8a18bfcd1c6bad55167b19f21aa104dfcae8993536e3aed41e939e4c180708d1f9fab52ac9feff4b6eb0ed1b7627863cdfd540a6ab2cf0b4d98b4d8b14b3e92c4922acc5a3f0f92e357f2a99a731519006611e98920242a95d3cc37a154953abfc32ff2436ec3b4c0f387b033a591767d31e9b91782e15201e1a987fb611e8ef87ae34dd0f4b3643506f56de8c091822ca603007c9eae8b790c7253263b809557ff6d64679886a92ada6469228bc046f60d88491f3c31dee59a50208aaa6457c599f6bf7223e58c87b5fb2a4acfc3c9c1ad9f196a2615522dd46a788f7572dd2891a6e7575e771334e0e23ac654451477cf71fac42300f03902e9e29d66512e6a2fa463800ee54819a3422100e2ec2dfebb257395fa9bbff16cf4e71c43aa5271bb19bb53fed6331f4543655e41601e40b9e40d46748dc73e59b40d74d52452277d2c783af5f3db2c100c904a384aef2311d64e3d597e10061350df0de4683572bd06219cbae448294ac62a2b9152a6910a22c0e37118a333e0f1e250381d033cc2ce3ee0165082ff3c98b969121f4d71edf1eba0830087ab09bfa0a398ecc56cd5ad5870d1df92942eabc76c845aebaa026a56dd59e1c458d5e1a06fcd7d82ea3ecbf6b3b33a7fd26826db9baeaa892691b68900b96163208e806a1da077429e454fa011840951a031327e605ab82ecce2fc0c736c286bed7ac38713d6830d703262def20bf310e5d3f736224e2ce2843d65689c3adfe4a6e3d37ebb3a48ec484c2b39be11a1c58b949c8e4a53adad36e91924e5ea2ed6330fd7d77c936fe60edcd338dd5ebb7879bd4a0b3e31e398ca2f3fc8b546bc4a7c47f81bbda89f04aa2a8164b8bae82f9795283767b077aa2957ffdc7314324768d25ed1e842814d047e5e43b5edd0f4cd665f992d9811ec39a982e9891d37d6e1fa30816429bcc90420925f3dbe1cce037616b9f9b05864e36cf0775e2974fecf0597b39925f98093574440b9f674c6210f762031c1f51c10ea710c5a0091c7183cbaf0effee07b976d9c6c8f5d7fe20f77a7553f938f1ca6692b32e5693539a5e7c2bfce7b18c1f9a8c36d29bbe62cb5f6d0e089eecf6a8f324970672d085d5e4ed6a99e664a5aa251e1cbedd850acfcd6194a799a5d10b18df14e4814b43a2bb81f35c7851d4f79af1d0c457c6669ca5dab1a755ee016f6c14c55f0e6ded8f56fc4ebb1a13aa7650ca0ba986ed06b09d5aed8e70401824418810cc86b3040a2b9ee53c481486a50ae925c4d7735ba9f84490d3652675e85d8b8fc366b52791cdfc5f669eff0a021de1a7bce5f3e5f76b3a540ca11bab2a04a1baba3adec8b4928705b06b1da52c0e4609e82ee926174a9eaf90b08a4847db6cfa378faa57f13de180a0590ad8814088d4dd1ebdac883b03fc06101cbde0464ff6c1b1a255c6147e48ccc5412480792c9112320bd9c8a0ecc1e34c2d7c71d9bd18cf6d5152a1aadfd68c5c5b09c80c93b70e053e4e6700cba9aec157148b0a56d8d6ff31df228568a2656aa308b68f70cf4704df6ae1ff231bdf1c04167a5c8fcf7f03be4bb728bb44fe9cd391da56263253cd69cfa7e08580dab8bee2ee44da650e076138de093a36ae5f4745b2052698aaab67ed475955814834021a5557c9222a76c51705ab87effb2e8884cc11146ab23b44343ece3595adfa581d3e19ce9f4ade5476dc8406e96b8711ef971e6211010999350cb3882662884b7c06ef7d24f59a99d8b12749ab85e56de6816182242d72d1801faddfbc0c7a36a74e5d376ba157ffad3219c2bec0e616fa399f073c8e2387760621aedf022ca43f82f79fdbd4931064bdb0048bb30587ab2e3b6392a97825b75e936807ea3c3e95332318ee05b856afd29e71aac2a04a69bdbb29ff160d26a47787bdbf3b155068dd84251acb444cef1f49bc847652d9c68682bcaa4a4f24cdef82f27d7b3473faf08f66fa8bc36d92e22627b14499b0421746be5cbcaa8aa424f9b8bb013623ebfaa93105ddb2234bc9c855b9c3f1585cce6b816ee3cbd2c7c67073008386eabc8a5625b517ad187a34b4b8f66ad65c773a65b859661f9799226bb3d668a332dcfe3ab790eff0c79eb16fe40fafc51731d9b9c5c4aa1233a8f76fedb5371786dde4bb6921cd499b29de4e495e195a231d3afc2c093640516783e1a3256550713fcc5cacd015f40dbc19f47b7a2de1fa89cc917dbf81265b657665569f79ea6c632393052470acb9c5d2e6dcdc541928180d1e1d501130cc133d5f8a9beb41e2e878f314a753c009c7b799f00d325c16387b069d636d0c2e015754a19340036f403af13dd145ca9842268247853f276f7ba4cf70520af4ebb042d95e2e0e8b8c0ae821e32abd48cfb5be3465ccd0f77e5208ed28a46197af908e51f2b4ad56a3991ee9c72c20b72aa2dd24bd4c9e68cd4c15e448e30770c432985321dfb301608b3dcd3c4e2692238a01d7c0ad0de7f6ca6a59339672fcd4070f614e07a5f82d51c350c519156664ebcac2123695f1756d64908b272ab8599e41e0d9b4fcc7747d5df8f405a3a04948a67824a1dd11b3a5934eb22d951fcf58ee6677603ddbc06e5c4a4bac27dc5b11137e6a5739d54bf384c84b0258bf9fd7436689a1dfc1bbb54cb93e75387714e5902975cf3298a8e7a7b1a85ddc04659a0f75a2f25905a0e2bdba3ee94c1d0126bb2db9825de844f27a8f7c88957a9b01a0f835ca40142a671de1ef80d91a9a64e2dfb8192240ca948bb61a2b2baebaae8682c4a21b69b2c2ebb4a2c4760c6b10a5d3e3ec164e844e49ba13bdf50d4f014e99c2124192d476a5a70b3c997eddca828eef83a04e1c90332ffba98812b2aa6791d083591bfa02ea3d7b41b9ce7cf2f7851d6866ebfe0ad67c24765b5ba00a402f527dd861bde817ec958c6d97c31a734b1012c084a30eb22340ccf544718186b6da7a36007aa6cd38cc751b473ab194454a0b43c4a62c44b9b2e5dc69b1d099ccdb010884cacf68a6928449796e48c9083dca771861d41cb40d898747eb5807c5d69ab64b28b278ba8a328e9ab8508ff85dd8c0ec70a69886b3006c4b78884f565fbfc5d00f007be916284127b35957ba4caeb7dd5d1446b645e311f103f1dee2c8e8bdc00829f0b6c8ae07ace9d3cec26cb4d257819da5c728ba1ee4f825350fb48e14778eaf65b8046c4896c640438540a386e788a3444dedfdc973df82f011a54850731cf149416bcb9a71c33f64876ac37c09ccd5909f1816c84a24ab8ead1d8ff85f3da02a07614463ca7b21804d4dccf83ad8a5195f09ad91b4620f7f368fdd82885b3c765e877f4b0d6887454b5c08a1f746825ce2651a9c6f020f20526ea9757b1016bcdb40d4a6b6f5e12216380effdb610dc9edacf66ec6af5b30654c8c47c3d6cf7bf21fdd0d53adbf851244586833e2a7eec533b97f47a4542e03abee7fef29e722278700e5601a830ce4137d81ad35d149fdabec548e9b9a57920f58945983ce4e0028d8d578a6cc27e027d6c2a3c51a4a1b780774f7ef8e6bb4e9431b9f7f156e0047dd43e9ed0b44bae40ca1c42af39d932a8357103ab0d8c0bc468c2d662ce0ac9676b75057c101c8fa77b56ad1fd82f935f88163e7920d6a1adb5c8ff3a57469874db628717ded8ebdb064245488b8b21ccf6a6f90b29805676a033381ff67cb8cbab6fec4924690b03f347d1d359d525180989fa082f727348b16b4abab59472966303fbbcecb63748cbcc1b674bf5e76a49280a193b943f4a71d8fdb29b760efa8c857d153da7b6d2153be9ad67d4afeb3de9f0e654ce04a567e218afb00bd421ad5f3bff2024d2c859fb044db758c5c26d357616820808801cf2655bfd390b334ef8fa209b15d152207434ee436a701961756251cd2a9504166eaa5b89e9fd57f7b88520b962fc9af00e403811f3fa15a20f7d413e1cf158dfc0b05a5d04f0b63107a3a87ff49bc55431f2d52cd9a9e0b76d8f8cdcc664a6ff4e3ffe7f702d78834d1b60f7b1f6fed145106a9906c6a228f560dab0103813fc821feff917fcc476f2b6ef2882546bf1b263a2616098827e11b7d4c0e3b3c960c317d6d3dfa4c2915e3cfe1a4fff343be0b3228dd169a940285d2116251ff0b278f05b13b26f9c5cfa7534d6013d823738c89525407f3ff6a11b6abac0c2af7b0b7225c377a3775f2c283a637e577d6e2069a12f94246b28e6b757b29ae52f42e365ddea16897e235d1fb7c9b0954c670160eeb5b79d555f5ef98f089dcf988f68912a917669d62ff62054117e3e18aa447325be9035262271abbbc4b0ca11eb02beb5bf818baa0b5df4b942cf9c08c04f6bee53073306fa879382ecba1cc2dc19b3267c1e362040fc638d648df545308c0ff07b04de1c6e087b8d8aa50ed4ec153924d035b460553a3478809f92f6826129d43e6f8091065c2984a558e86fa35e1857c4af4b93d27e31249cedbb443f387f41a4305f8c4aec650d46bbf2ba885c18685f7244e140322036c35fb757ee78dbe0b630c336c31ef9d374b674de237800ffaa67e77125bdca59faddd056178903597b55f6b7f85bab7c3731b503fc189ac3ab767b6c0c87f7334b4f4c6943d3bf53fb883f36710c45b19714fe4f9ca6ac5d6c884af97af86e6cbd9d74baf8bed9773fb2e5dbb7978d199d4797ed8a88ff74f5839a41f978f9ad58af906ec1b2176c4eb931d051664c5d50b2c8034e285bb14c51b46c106f5e9e256de8b0231743da31876b3ac7df4924b93ed9ba71ec88bc7bd8e0a1484566e62bc0c3a6a855236bee02db44a26c4e17ded111397a3e4d3c8a0265082762d92d738e6b78d7d480c58f14c813697421dec954b9a9f18573da7fb58dca372e7f1d03c1264f38fc21901ba47cd2a45f8b2082b019315e28c33d64db9e0f0012205ce53f3d535436d0759b993da7dc9454850fcb79fa4a91020d405be1fe0974839221f2f8abb2e8531b16dd54ba977d44b77a8f212b3d27fbf41c1d9ec0dabd7168bdc09e80db7c732c945709346081235bcbe358edbd527598ff091d7cfb56b285c39379f95558f84d1eefa33dbc08b81c08ae6868547a37a1f107a55bf5a50e933a52cf3faae6aa28ba8d6cfc357acc9f3bda97c389070ab8fbff7f854e144d372be5e979618c51657319aa9a5240278f6b4e2e27e461b68523d9f421910a361b9d330fd003b4b4ac4e7ba63f9bc09192a1f274bbeef103af737d4a5843ef92e79826886c17c59ca3559ca8119963d250e4aeb3a82e1db9dff3d3c951ee2a294325a59e742527d1f58f62f73bd391b1733c6a31152d4e9fbcaac4bb351925c3d54a999710b6411b4804b6dde3d2b3f8a0b10e382b71ed7eefa036662b4d47284811e8bc6a517d4245bd81a0321c2f6d814c820e1184601e1fdd12145c11f81f42827b55a77e420d93c1a9894f3b6fd9be14aefbf0ee1147f56a410befeda0726ba43aaaf2c5f945da1818e062b7d903ff127b49f03566c1184eaa930d69a7e76d7f0d0271af08b2c4cbb4ed9516d7b5eb4ccf3e38e3c953329134f6de0e7647ed1bdda74cc3d81cf7e167f70ee2d0b52acc9424f17fa1c7e83cc97a89637359968190dfac89d14b1b621748f5a22ccc659ab041429256e3e455506937f107e70db810f3b98a5b07d957ae2673df52c244bc0dde54a35070cee7b0090f3e9ab7fdc8432b9a4ddf17d9c713dab020ac5f6e3c91424f3af6354df7d3a33ad495930cba13ce785bc344c2ba2eacd3eda16b8c2126b75ae0b2fc0a8fa07edf3b5e41e29567267a3a71563c38e7e304ce99ad4574b3839d1beb8badb6ffe427f95f8928612679c9744f15f14a26c96d4cfcee423c1fef41760aabdd75d81b3a98ff3586263a108c91c74886f7d3a433ee33f62a8154436e76752442d3136c3fa0a50ba3ed8a33ec1740b9a648d6bd813da48da64c39c74ba595be85d8991f5e97bbd528bdfe291190222ef743175c7dc0b87b5ea4b6c3018ad2414e8c507cc107a859bc9f7e3c2283d47021f27fc94fffd787f991b37eb7ad957444f821cb8d77d460089af2b24779c047cd5df44b20826a7b201b1841969744201023f453ed70a7b1b4b642d4aaf94d7aa38b5f2b18d2d71d7a4bcd54c6cf490d5a15b25d0779891667fb57ea708be3d34a84a9b25e768836b028bbff6edd0a03c9d74131031ae255c972173cc4b7ea186b50b8251bf6e38d69bac88ab74af1ca05708b170adb1a3783226b11cc06ca12adf876cf76db52ec4e0add3cc89d6429b7e87757444599843d143bb3b0ffec89b983caf798ab3c19061fe35eca5ecdea8748ec38d8dfc7049e4e7068992bb64536f99be4a8f109dd3a02c038e41693d31c97d403ee310d7e4fdaf079af10910dcd62d3dfcf32200092b95e123f4c1ead1fdd1601b0c4d1bcf8c0a52e1938e6aa26c7593035f8eb4ab54ea3340288d63f37229a77441f7c84400676ce002b1be5e82f151f01cad1834cc879e5565223530d6f48b0d2cb779fcfb64aa38b6f9a84bba3eff45c313a72fe30c76f63336daf48cb08f3834e29d54ed70bf3e38ec94f492acff66db48ee0748d751850b21c1c913fc2877e32f9ed6572a0072f10121037cc9d6e5ddb369556e76a294658986290d25eb5ecfe51b1bb8ef127987bdc8d309141a4532e98594b4790e96cab4949ec8cc4c5f53b98e7f933e69a46598e8fda82a3e078361df4fbb4cea2eb3598994e75dcffc0703558c66967aa603192dedda6ac6af37a2d2d0f360c9aea7eeb195d968faa762592cccb395c9d0e8c4f42e2064289ed8231cd2fd5321b920cab92c2f6c3103ee3160bb0aaadbc7af12d8391a84e878ed78f9d029a296b0a6941cd249d6177413029dc1cc5424fc9e894689196b9aafd00b162318cd7d27b1d138f2c945228a7973308b791039e26f9ecbb8bd8693b6385fde763b3259a0dae8ba382e27c6b979d9c582a16d9f0b7ad9d4226744881e7efddf34118fb09e7a610d0cd8fc98839cccd911d5caa8fa48b0fc60b743dc6b2c5b84d73c24269328d09ddb5a420c6b6ab2c7e376c60c1161cab0ee1df2f50eb8ff6bea0b9e00015e9e093e428686e36c222e6214de1cf35e6d7e451be0869bbd6fe0e7006bf17b944fcbaff238bc8e09a1890830717012873fc0e0318af574a203a058db0c5f54625c51ab19e701cddba744503a3e89e184b83559ef50c62bff8116a9cbfdce4e315a37a9f9fffb255aa9fcd4c283ef02cf4d281cb5e07d443e3eb07483ceb2ab89bfea3743120d16ff302f0049e003d8df8535a315988f3fd6b30a2362eda10ee3f3e5ed659bbc3531c0476d40d16ce62df6da779f1770916174904119d91dead89cb716e21b8ce2aad0c26637e67ebd42f87324a2bbc5cb56f9cf57f92f7dc1c020ea4e390ff3b1c2f84c95af8dddb0b720bc14d113f3403fc923d2813f65264316dc1ddae79525029d32760845fe82e2f601d29aae9db284594a3b62b7587ac9e518e06840c5aef2361081e29d65865efee0e87fea0984bd308f0cedf5dc41dd223d50319a19d20a596343bef2874da391d5c0f164db2942c57ec1a399451df54495c7f7621610c38da7260de3e84b29555ce68f9d9722cdaea5f4240037619ac2dec20a172efda63958c35ff00d0188bfe2d3baf2a203b652811eefc927bf463354c8ea47e8fb3af2f486159569f32a480412f412a04e85378cac5762aa79700cb4672872b88bfa3106f8df4293b286743d2edb6bf655c2e44516fb5b1432a0b56a07450632425c7a0c960d95fea235db0a81c16d38dbf7df36f95c11197d70d3e233b090da90ea3481d830fe2f54b0c2d8a656a4dc238c9edecdfa330ebc48dea9770b91160a1c06e359d9e98a4c7fe234270b9154def999990f462f8871913c4c4ba69579107a57cd7578f6b3ec0bbfb96e40b13760d7561227d064fb2ff273371c220c68467dad8cc59e9420d5dc91b4f6a682f84bae5ac6c21981fb69e529f6830e64880eae8ecdb4ab40457c7b2ed35a9d951c11d72e334891f4fd91d1b706fabc3c4cfb8561eced3f99b6525fed70f4a6561735fa36c435ca3c764a40b0f4fdbc023b7f8acd86c9bbfee7fa03343a7f41547e3a701b061432d6f9f5da8e2d069e44b81d373817c4b0ee5ec60db98c350f0eb591e131755e6c32fd16e7d52b9fd382574703280c78aee68f68c7d3e2c05fe351cec610ae9ec70ef43ff0fc8d43ec299daf8713f1501685fe34ca29daabc470e763873efe3fe39973e39e8aae7d58c90f992b8252d5783b2fccad11d041dd45cad2ad22f0cc3280f08438f61bb699ef01b67909ad935484a892b922604cfac090aec05332ce4443fe9468c5618a3fea3869e8006df43bd0dd29a6d20707bd7fbd5a394620b08950f2b6a68f0c52bb68f826011d20828ece41e3deb7311c85e1c567a082370d8246815d6aa968ca8ce9e59d5c9641c8dddb7b73c9387af5f4852d597e7e025fbf830eeb3dab233c34cb751243325e319976fe3c0eec412e79d879922bc00f01a1951ff2880ab83233ac1b476d47d257522f2ebf18293010965a2eb440ceb9add90b1905e25e944709fa6c8f236d5a948862a17f6da5a456da98b13246108ebeb643ae87d50d43e54844dd6c1e093383bcbfeaef87b82a6ba712a59ec42c1aaed9dd251ac8ad43875f09e250a5a219af6fa55fa1eef74ec99c36704c1387da18a446311135a51fc7beb81fff62de597201b194191bd97dfb1a92a5ecdcaa5966b60d471db48b3500f7edeaaade049f6613431cc786d5247ab2a5bad38809f5238f90db92cdc62fdd9af9d6f56fbb381634f85e3fc870feb2e4ee23a2ae2d49d9818f6312d9fc6cb8088a69619068dfecb73fdcd45943594e31ea74dca79ac3e33c3772107184781ad11e1671f8a3e3644a981d47a1c2c0a71a1922e40cc90ffb20578d0e1d04ee90751372a900f2ef174f8f93ec3a55b1582e08c24b563e6a6bde3e187e44d41c937508e26941bc5f703684d5449b92c7dbbe17b7851c717fcfb679a8e38198aeae416d0a451386b0f9a01655e34df0609c6ae49733b7f8cc915988b2d04bc8f14b7ace3ecf2ed8803e1cc29a4aca051834b4fdc5a9c13acd5b27e9dac70bcba0e5719b1469dc284997fd0826dd88276b1f1ca1e789b0cdee77b22b652a6a372a26e6520fa7b40c79a1d155603e00fdb5b6129f51461f18cc9188bbf68cbf81e96a1991a4fb3eeb9cd62a48facedcfe94b43744b75154a1d4130c1a1360a4428b39abb868e6d55c3fcf78413b1274908483eb107e4e0a0f9186bcd4204890ef7c101d64b00d3fb4bed83bdcc5ab505a119faea11a9ea79881673b68c1a70def3887def53ea0a6abb69af58a0eebf8b1a872026510c5a603102ed8466bfe83c84cfb71085973d2a7938235c79b76f64dd5a586eaf5558da5fa58440b73d19b112605740c94e92c1ef2286d13efbeb17505a49c913cb0e7177c8def169da2ac405010488075631b983ef80c0d7035b2cdd4e9c3f65b7a2ace231a39f63df43fec57b66ee27f8439a9f66bb302b17e82beb00f8d88d613c1308a97c528d948ee6ba96267d127cf0eaaa51dc29247eba9de136069d7311052f51f71113cf4030044d19ec3aae2a5f330c768eb3a982f80a29b96e95ff0f248726e509e9112c54e0e4ce5f2fe449b9fc2c9d77d7a369caf82a51d7c81aa2c2a4ed390cdd3ba12003e97b28639d2325ce74903f9cf87c59f14cc5e93faa14070c10bcc4f635e5bcf4c2e9efdebffecc304b168f0b9103cd7cf7df4d0198ab1a49f536d63ce740513bd9e05ba93323d6aa19f60f2a56464e229365ab16cdb024e3066fedb73afc0761942814cbe2da6ac447f966032f8c02698820aa87306a4c60a92eaf70146005ed5d88c34cb36bb0073be73c9e051f14dc3fd8f35ba823bb4a483dc46e5fb374679bc910358d1dd1fa5e883b01be45aa001e552e9a1f2198284a62d5b9013e7b57b5b3a28d5a39f52618a309364447ed5f8e5e024d7cae0c8317668a5ae4494346150e225c01074311d2024e457d6d0480f8bd177ba7103fe217108a58ee1bf4bc22a237aa6acfe445f26bb33453fe17ebc238162c878f58cdb22a7ebb09feb53f44378a807dd9004ae2a7df0dad4450295698a768067580cc507a0d8c1c38ae59e394c2e5226cbea6087e7cd87285d5c11aa471380b08de6859cae0d20e120891678288e241d246e3ceb72f9b8c0ace3b78261da37f929b2835e09e95c9d4eb6f39c9847ec251c1889b1ca260e21b6420d7e452b24859de954c84f0dd34c67e7cbf315dc18d32571ed6737d2e5cffbef69ea8b96c4fa6d03506807eb33730ea3f6282bcb38abd2f2ce985670ee20006483738fad97cc09893cc9bef1eba5956418a83485da239723a3b1a09065c64619b095cbc01b8f16034049cec27a58aeb08a0fdaac6bbf047d134fa0b21b274f9797cdea7ede97f4da2184c1cd5e00bd11e0ab889f6be28d7783cec1464cd78f669f88564a4f8b389646e73283054242f0b327c8ef6942a49b7bbb9ccd993b880f4e5189b2eced53c0270d9b740e71d2d557e1161cd233ec6161929dd87ed7bbda0ab60f394512d8d048445720e823df586583ea98355ab761ebe04ec76c30bd8f8b22515dd6b02a5f3148000a10ecdac2527cc0e2111bb80561312a4affeaef781632ea911039eac5787530b0171157dbb53843aae3eb40d467e1baa3984ad43c5244556390147c9b645833837955d8ecf442bd232c6df447768e6a91c3f50e34b5e30c45b4c46249ab6db314a60ed07e9618c81b690844e703a3c476116deff9b7ab89c82cee3e68a42229e42bc0c1192146eed4084eb52b95ae52c0ff0a1c13edea586b36e65370f511f26289004d450c598bedb8a5b79db32a9012eb7df4fbbf4bf29f814163eb04b9b7203c41b77aedad39d8c8a1eeb5d28506ec752e1d19a23ce2e58a83c24f5985e2adb3f9a2231bce7325d6c7acfc7a6a11ae0a9ef7064d2993cdc13201066a030f5b8ebc9ff63d39c245518b84da21365ae84a45053a06be9fc8a3b0a2b8ccbd97ba3afef33cb87ba1b7c771f8f75d764d1b82b4ea4d65586166c09419dee822065a37355e9f14108c1db6ff9bac85a662c86262f888ef838318a650f8d142bcf5bc11f44475e674fbb79e98cf924033367f57d3c2951bcc7f5ea38ba238730ac04049c0275996357b45fce22720f3c92290d18bdafa609fa0c96688b89cef7800974d0d79c2a9be8529304014d136d4d1ad7dffa4216479a1b96dfcae471ea121119a40de49a79ca3d1f7571b3b8fc2ae35abb3a0828de6fcdf083bf5ff96f2cc5fc00eb747063c41e0a07bccc8552f22c9f92 -MD = 68c34d5aec130f666c98d7088506e213c84ff3a7e86c21932039242a68b4b78e36b7b3948435d89d2a86a5194ba1b321832ae7b8ec286f86b6dbe3e39da2d2a1 - -Len = 67552 -Msg = a6bfb8320576574a1f41ebef4ca72e04b0cffeffbdef03f8f90893ff02d1d2b3cff01e113870aa89b970685773182d1073d2107b37b613a36e45052a005ba6e04e5f0d94bbbd472b6b9641ef4bb6e72951c68ef105c28f4540ae35593385da2eac734c6695437657bd1b3c5edc67a675d11341082dfdc205f5aaed33a438b5c47093a52dceec7e353867224c2e14b01f7b21f169b94ef30c17a0f3605a5a80cb2229de926f9fa9ee63e2ba634aa64f4dd75865bcb09c69812efa10895dd4846a4b9cc03c7f443daac7f5ce483703c8286e2167a81bd16d8dc01f0c56b68f06ca725413d406c28390ea0624a6fd1566d7c7e2bdd501d447585777af6e6c7251121fb99f010d03c3c9567f8623a5c270826a0430ec6a8d3f097a6ac17a8764ac6bda332b6c9aee457c93c6ba6735f42d53e0f088955fe49dc9b2600921104f5efd2c2a81bcb86b50d22745881bb892e670b00d8d77e6c1a8bf85c1500c0e1ab0ef9c06679a6c622df39c62bae73384e40162c2073b0a0ca9147df55ee289adea6ab32fa6aec0bb25067a871672b0b26c2f7f79bd88d0ade8ef2264fb4c8af05495f70d069fbb5e7e34471b66653604c9218e997807428cad79fb77eff217cb3599f2084e16653480a48d867067ce624101178a0060679240d99094017b3b26d79d2c8948bac723757fd32ffd217fb41ef4a2b31d3a47a5e8386925fb90fbe980ca2cf6ba34e814a3eca280d43b51e2a624b87e973debaeefbe0f90a3d861fc79487ab96d2bd1f0531481e0bf5c4cd422b9e05235125a969b92093fc2fc74470a3e9e382948889dce1ef8b7842c7972d9dba397c0619c4335dddf981fa33cb27ad420ddb533170559338f6eec55dfa515b088b601d1ba9f04c61a058476c2261334890fdb93850e3f7bcf6bbf7c86531c631715bd0bbb91527641ecb71c0d891b8361356110dba2c61d3f17c54c7765381ad81dbfb7a7006515dcb7813e25c5dbec2eb9105320a8384268dac56ab9c4aefd5436ce7c87d687ca73cdaa8413c09b957a02b0045c08db11d01d89815456c93612c9b10262fafdbd8f96fa95de64a3a6cc7809cb98aaf8b30146d7375105d0ea9a3c31f240541217b77a391a8e973a48ad83e24edb76d64f83bf7834b7b80a4475f916f429cc0d0074e12eba2c43a9a2a48b05382d54bf0edcee34218e57c0692a6628af264a359f4d33a21ebf4f39de39f8382f962cf918963dd2a6dfc93b8441ed2ecc3eb6d41dcad85dee4fa32f21f43244db1fe6cd9438131c6ab1f8c0bb43f5f2f27af830a1733927d1e527d6965ea1f1e6cf6a83aa4bd7d8160ccb9a36b7e53acae0f89154d1bcc86f87c37562feae06f5afa0638456f3cf51f82a0f1e2527cffc7b9f415e6bca0771405f53b05cbf4db3c570b547e1cec9c47efd699b1522792f50d387e6c9ccad7f15e3b9a6013e8cc51bc3c01e75d08e17a52ceed4103eff0b697daa14742882401037ef6c74918cd6b97fcd2f9961e5f176a0e7f29de32b3acd86f311f3484e5d38433d2b3d22158ca58e24a2d5e997faf73f9b1c4579c36184d4aa05ce92d97d95f0eb0be557ef8fe9d60da0b1d06ddb32f2547b8f68902b975117188e70eb4930244033f39ae1888d41d051b67e2c3c2fa2583703195a3d0de38170ba494b6910c885ccef52b41f97b6b4dc6b5c9fc4f535f17729f2e942ee743238da84c2843dc503fd62e630fb111c026958d08d1c8c9564638a5c04e042eb7096778b1842c001ffefd3c01dc5025d03220643bdecfca8fc25adc075bf123084b218c5154da066c4c9ca4743247360fc2dfc1ef8db4d5800e21a840288652bb6b5459a804ae5db99b4cfe36ac16b0d38b2c2c70691888bb7c55a1274e344c44dc7867223e49847c5d86bfc5943f24cfedae1a8afb7b52b6af3f4d09277b6e3930f64b5c4c1c094915c25fad953100595cce027bbf5da1f6297702826edc370ceb666cb2c8965a945698646b299ce2046b147aef1f2014fe4d75781f6ec735347e3151d23e58f6e29261546acbc338559b19fa41a5731a33bdb3042cc1dcf7446bff711717d47cb84bc5a638e65481d16f36f71fecb7303aecc83d56e28debb12729610ddf894a8a052dd05223b14cec4a03f7c65f7ce5784d2d9a1a4b4a911f5237a8330fe7fedc31127952ee79f81addf982f17824a870614b80e3869365c35fb29d032390f823621bf797b10f11f17d900f1db15ef7b7cbbab84f0f18f861b212d61ab4e4c4f41a92d1bd15f138e4bb6012b7b58c61c2eee376b96f1bc75efbd0e9c63e83e3d2bd1fae2f87c0cb8919d2343bdf2d65063d6e62bf014c313f9f952eb22adee323ec3ad35b70ee48330b6eda26a8c2700649b3f2cc7ffae4680fb83b5af456317c0a4ce7ed7bda3d9722ae7b04acdc2157a64cad7e25d85f8ceeb2861d359a5d5fa9fe524213352a19d2199d5245eae75eb5910920bd44e1029f2ca595691bd5234d97b8f5a15f9c3fac28c7ac1e6f30affa498c6080c1376da38f0040094b278b67d17264d0e9e26d1364705ea0e9aba006aeadca2afdb1229e422ca980b8c2ec7b14253c1c44bb46aa552e0657eaa6f34d68f3aa162afcc5d1ee913e89d545bb09d837e7ddf07540c363671fadd2b10e50d0e4acdcf968cc010cb47b6f311e9ba6b620d4a08dbee01117a2273d42685593aef73ee9e983a98df52cecbb4cbbf2a406769f0e7cd6b8f5fa65a970aa1b6d883bb1ccb77bdbe2eb60611ef898ac54b471bfa3723e8b1ff4843802d28a78bac10f9af2d000e00cabb6e76e91a57e364a50528e76431a999f3d8fefed53dec1c0a3193dce492e8b4161266830e3901bc85ae5cc754b23ba489ed3bd2ba6dc16f99ec30a0c9515f33f07a4a830e39079c0d9cfca09972506a310a9f707e3ef2eee4b0ee4158544b90712f88b2c15edd4c6559723adb79ce3114b892a2cab967e11408358638a29614c0b88ad8d0b06c14b66d245dc3d09f42597e7c2e46e4089050796d3811432604069db6bde2379a3c285e7cd1f87ea9e529e5c5dd99c9be42c18dfe1f8d40e5ab6a677628a0fc500be2b6e05d238bd661ac74d5776c706f408fcb500352a0b950159d31e3b10677ca0dfcbacbec000c0009b315c466df04d3e1bbcbac086b8c3a2ec74eb4bf5df5c2d0b971e1fae43508692aeb8c30206641dfe6d8e258aa45b2de6d37646f0ab43854746d68f63f38c2f362c096713b7bd2b3d3dd6cea64cc004d1853bb6b149a77c0b516278719fd76d0e2fdabd2362dd0820a441365a1096ca24f0a805b8391c63d05d4e8567b6c6c27320893fb1b63817714739f7169e43e069bc47de660806cf3ea0f710b6c6deb21db4b1693f2052fb778d4d8b7c545bda083e978b5b24eb209ee2f8b4df5e83ce6642cfb43c1fa206dbecd85dfbc1432998fe13a7081e5e0a8999cfec41dc5a89d55150cb2922c9cbf6fc870915739e51847158bbed52c3ef772be9219ecec756f376d0f886c82edd5122c5f749d9c1e4634eb3247b70b131f01fe0ff46a45eb83909ccd6f58e45ad82f611b309625254addccf9b42e6aa947cec23cfca0b95402eb0a0e0d5c3a2af04fcf6c6e4abd414dca21a6ad433146986273e2da952ef613cd1f9a0a836ca644f9de19d6c24abc77845002d9fd48333a447ac936518d1bdfc043380fd26316fdb5f6ec0f05b5dcef92c3d5e16498b854fc3db9b6ddbf098d4bdeb2c45305c2420b7fabc21be7eade7ce0e76c80071c0e13267a0540ab0846f758ced00d3bf13c84e11f960dc72d6bcb11ff235a7ea991109cd3c9823862324a1955dc08eeec13a7841034e23cefbf06bde7aef9e6a5057b068eabac505d78ce890e8f4d04fceefcd04643a2307601b54b65b465255992ddce7152c5da43410b10c392e36767f50c2e886c558a0c5a612542dda7250d5ebc5b4567d5bd5ab488173a8cd2fd75525e049f570432f7f291b245d3c6cc0994a315d191e5e3ebfacd043c2623b0702a7bbb54abb70f7ff0cd5a383bca04945a1764df79fb333d3a62419108dd669ea8e9bc6d10740bee7d9d85e1c0bcb4f7d8a2b035c622959a9dd03401d9080949f1326eb230450d8ac08a9b0a08a3c47b38cb619c215ff1484b9e475441ad80b730dd38edb031fe9de21b0479bb871b659f1adfdc32bc2f906b54e151ead2b3308b7384e43b40c46d0ad929f78270a300371893bda04038ba257a69c279828afe2a7bb960777b4843614a704b05674393284ce30714f3f20ea399496d99c2ed68367d3e290ce972660ff8423feb73e3659a3f388135de46d40a38e81af09cc4b5d7027d07a3932b203b6b0899dc9d6bbfb477fbf5ac081c5385e0ae932617f72e3491ddc2e47f59b70d29282282ecc4e99e7e9229207a5dd43918039fe43b6e1b76b2c62176b7e574aebc0ca28268d42b81dc67e53a3aef9f51684f05d21112c4c4eda0ee0243b89f46ac1ae1871984cd8517e0f3a252bcfcf358fa8e97a0c97047cbd4ef2f29b980fc7fbca63708bd16d1b9671affc9ab3348716c02dbf17c6827d3c8eda673cf5ef9bf59ba3a3c65508e4a6321f9a8a38b773a0e29480a14f58b8ee5af0e29e48365f358e639bd65c1e3503cd139f68e4da83c46ca84f5775d9b8293ff1051df3567a423f0dc94a6b1f95559f267bb53c205fd7daf37ba8fe881393ba354f5a7bd275921a0cac80f6af7e0244c2b00da2fb3071c9e0a5f42e0623b4364811c2663ce9abac0ac618733067a04a62bcc0bdfdde28960a4ee7a8b690e150a3fcf436e84f056162968f8534ea961c91227ce19a9142ebdaf6e1e33bb3c175d3815e62870e15d6ceae44913f6f8a47e86190b243f27727cd0e8161e834db32511f6f7d7bbf7378896dd62bb27ec338b2fabaa49c8a3bc67b1634a94e7c75029757a5fc48cba4d32d65b2b93080f77b8b7e493d06c0e7644fae7a2df0f3455320aaa04370cb1053452678ce2c2e8d8cfc3cdae0152f207dc537d0646241b2c08788dcf776364c855b1086df27cffbf96fe6ce423a3d6d7f7622b5e104e053c73682ba8ceb85bff5c9c47b6095fdd92d70dcb1b8086434e5dd2fb9286b479ed3b828d7882331f1012ba2a4f709309ba589bf23c5e24c0d4d549f58af07fffa7276dba25dcfe37653fb4bc206f3f0ba0e24ee73006a5d5d1286f202e96d61fd200d2ba99243e2b64ab3102114d8b6cab3cceb4ddc0300aad1eee8467bfe262d68e5896baa21e84771dda060b54a0b34230c4612dd4ede8d07f6b291bb4cb4f1c99a855729ec4c9055e57cff4caa668cf84d8f4078905f6a213911833beb86f0ae969ffa85f588276374f65b6f8c414b901b1775228a0bc8ca205589823d1480945449d442e0337316d6ad13726233e686ff8f1f8f9e5c3f4f372f1302b40648277e1362d53ec71a0cb511a619ceb6e4496546be044fd9243cf7eece5202a4bdb45e7d24d163db72a18ac481aa1432cb53d6eecf25110b2e2fed1509e48ba837e78ff798bbe1b92371b22644c7e5301232eed7c166745a93748142543ed1596d1d8d034cf95b0892f9d5c74de7c4474f62f7a2334d0c401ac75ef73bb55660c3e2c030a01e124247b660283b8e13e0e9609bdea34d2b641a84c0943f0c8d36b2b3e3f040aeb9feb813ebb96c2f568556b845dd8feb643f293960b9cc990843d02d42d29d0fb4867aaed2fb7e402ebd3de6703f67bc4929bd41b9c872ef4a2092ab774813c59471f5e3a07ed064eef10557c564b9143ccc4d5a3650b073b55580bafbd14364cc59b06efeb4110229b933989ffdf297d18f6fdf60e303caec4b10d83b0eba71dea6408d282b9eac617e4f357a5ba2cb89fb7b4db3efeb695189c98fdf40d7515dd01ceac75607c828c8be9aef1e5803d8892621c9d7e5b3878a114e332828a7ac7fabe446b3baf9e221085558b670f54fc0c6f7fd4b714de0d49e9fe1153cc94cfd842640d54696100fc2e161a48bf4423af44cd8bb1cad0ff1b7f163a8725ad1e22c1d203b293154fd74bb746907a57240247cd6975635775a03ff354267c0bdb60a357f45d160036274601b94827d3288de149170ac9b9975e8f5c0839b8f72f1b4fbb895ed86ade7686bc1878ae0156d97a073d78e23e8edfd81afec6c3b942d92fc669bcc39d6e4b73b00e26f729d76d7bd182c8983082ab83f6ddd884993b25aa403c7fbee00f2f75a4415ce993d2d14a6d8e01d1d59a48f6b54e74e3df428428f0acb0b07ae9a9f46259216e86708e51a30a2b7777ff409b22f8a4c8d28180119f5f5583b4234158b0ff7e6d4cd92bf73d9e4f715cd91bd904846f1bbb1da0ce15fd791ed6e67f0957db79cf2b3430a301f174a7cc4f5f172299dec4e2416cc51a2f21692859ec701f941d7a6ca926bfb9aca201118996bf45e0f7ac8f136d5f769d574cf1a50ff3cfd26f57566294b22b76e16772b047383500c4b90abb2a04f0ee22af7bf170fb313f794e338402e420f83ac136ecfbeabaa24dd49a622c1d52ca8b7a0c6698f10b814248493af8bd5fdab4f7a664393d9c6e99e68930f91062db9895ed2c0e3b2640d22be2aaffa5b2c358f10a418999a20bb0d51d4c1b47e9c653e8666a5a434a2532e144fc9e04df5b2d98aaaa736696229a8b9fdf1a28ae36c45cbe48056f3ed76950b7595e42af4b3bd2cdc8800c3e5a5fee56107c1d7bd1f2d73fef9629ccff7f6285e9c6c7ea3b8a88bcc337f3625c08e88c08cb8d163fe5422f8795d8ba457dfdf4d35efb58d223a3c0c22183ccd09d6087ee8ee04829a586d7378be3d1506a0b4e40ae47c0b90d091fedc425435c243d91eb4e7dd9373b897f28ffb4d9c94e73d9573f11ec9850a4216daa3f8eaba769f02792ce9110ae356f8279b29a57311dde4198c2a216f55a106a5b3b76632dcbecc9e23a385d0671ee6c8145dca31cf1a42541c3abdb0215320b5e7fc32dbf4bcffac62995c54b24450ea0d5665516d7752cc37bcf9082bcd1793a753db064d1dfe1c70371f18638bd915dca011428b7977da551d5dd7a3733dc7a83ab95244566a76c319488bf949c1d418d7588597953426faf8769f46ea05ba313d783078faa733e19c633fc202ad9d3848a5ab105f1a0aafcabddf749621e3f8c87231698f46ec424cf9a47c4b1ee9b1807323843b9c1dd9f0ae08cb0c04ed556841d58468bbf86ba7664a768778421b1b6b7f71cf3cd90026c1bba8b0113eed99618d682b9900c44843a25f4c5c1eeb85d92f576e6eb4b8c993589c26e94117c84bc9635c406df28c2c3c750e3d08993c56b3a3bdb4497a558d7013d4ffac6aa18b2a245f54b86d0f5a8976519d77aacb6e8cf511a00fbb572a92be4ec6c96c818a2029c948789a2e8909d19afff4a6af8b4bba2eb460024b0520ea08c13073f4d33bc20e9e171086224e055ec6f803452750614963e2c5bd87bb2577817a3777f0edabb3b82c4692a0c68021a50a4748dd4b99162120ac0b2cb20f2f99ff2d876db6354d4920d2d09ef3d067fc93e917178db0099e71fbc08eb5f5a55d37bcbf94160d2fa38d1bbc775684b6303d7f3c60a744881e8f5b8a0827775d4dcc6b6d2e8d81ff69c9a7d2c47f0b71025f60254318d53623a131a4339712dc0e25b02c779d32210e7efdaff0ddd34cd582426e3962c088608014bb9b854695f0cc318a19c5ac38f41593a0a6e37a9e1c4e8c73ae05c4f347848b4caa62811fb83855e27f873eabdd15f05131307fd9590ca4d22b82210b3b26fbc3eacf60cda6f293e2336297fe0c089a4e3a4551a31e5522063c688334cdffecadc71c54444f7371f5bfd816a41355f7d42c827e7fdea09a8c5b195a147277d486d9e9da08343386999f6859328596af9f827874c40c8764d10225140ecb1759db9da8608de7cb483a3c93ce3dc543180cc6a7c3144a622780bc0c5f982a66e3188ce89649cca31d7411dae40a74d3c7b87390e7e4fad938f7f34f8b5532dee6ca221ad9c065439cc3d9ae493cf6c1450f13b461baa0453fc3425f25aa56f7fb6cf7cfb99644353ca5ee9e5c59ddb4069d2192bf19dd5ea25f23cbcd1c194a877d6877941febe08396bb2b9bc59bf482cf27bc6e66f45de7481215d03efc3f21780e9317d1beede822d9c69624b43b50319071de36a7eb94fa87bddd77724e3fe954b2b3604fb5f0b6c50fc9ebb8c0e550e683bd1d4a8022030f24534a0e00594dd546e52020c133def767a57f0c5db8a9a442596f6ea424ee22f9c04b31fe0421fad02bb5b49818080b5ec773314a50a8544e51c186d004184daea2ef808fa6e25fdef5757db313de5b559e5cca1f23c970f81498259c461de9b389ab7c4dd82b5ed3d1040eaabdae71fc98903954d8a974e04077bd51716ba188d30387a11e49825f5cc5c9d78c14e9b444b1f183b5b4fa8733d4c097fc8defcf1d8c2531cfe964c1f75f51d1f58e2d0d3136a51461885c6d8d33e1e86df13ed6c7a9f778836760ac1f2519228096b677dc92a69f527024f3ab0973cb4c3219307fe150dddf60209e52bb8231c3bb0074b55a888d0f18eeca2be9f8a90dcd098c94c6d3ea1a500ee920874f881557a59439f2cd460def04517e4a031a293e8a1bb4cef315eaa3964d171cc3ae2c191057090fe782c57f201a10ae059724e3059e3e7e20f9b6f7511a94e0711c4e6bdb2d70e659abdc25ac84818a828897671654b0390ffe15b7b9d22876ea4b12cc6088202ab639988f14415f740c96e747370fb893f2ab7d615b14404491c30fb73b1785516fa4a127f1b0f8df062a9aefe20f96238b7a54809f518aee0a0cabb8d52c1edef8758c7ccf53fc3001cc38eda1d4f74c3cf33192010a56b7a5905d4dc9666b47d34490e9f7bab82b71e437bce1005a9279aeab222abf324606f6caf28226e910a27a751c2545db05f91b1dda4a121e8ae3f5179d76d0bc2db0984b239a1e16bdc88f9f7fb295d363e9c961b2277ad189ee7f1d707fff42b314fd746d7b9c72c3c80c86813a2b1fd9c68789f113bb02340b950357908b649aa6aecd4c91229bb72379b0bd26663ecc31ce2d0389433f0dcdef8f9f6315a0290824bc2d8550e00c6d4fa4aff1e7beafae15916612b3d67ba7d718d4622e74029be7d79cc2a7fe3807f6d8c6471ffe188df67d952a7d67021bf4157318265eabf4709626d38834ce7627d3ac708f9b8b63d9381d4b206f35bccf2c17ff9dde8984577e48228222344a2b1baf18a7057cc246576aff1d6d8aecb0c31f7315622fcdf5066d5a16450df6a9275aaa06da612bb6621ab0e4d0763e4151162cfd87f353d1a522c4c52bb00e0a7d3b9f2f78ccf2b1de890b17469c14197c8887e6bea8a88600f50d1f34def2c783de82716f44d9b1334258151e4120719be31e4184842e8a70509d750ecf3778d19fde8d2c3d234ce6e3327ef619c61245b25a9e682a684799c1e066f8156e96fd0c1dc34e2a71dd8fc824a53c9a9753f072b76de80fe855d3c59085af55ea9a5cbfcac4339147fb948da9387027f6bf22a0df3062a9212dc4d8082192e54e0b77176ff08b06082f7b803aa92f6666cc52c91c76868a9547d375c1fb21680b52e29f67e8930d54d1cb6c4367c8ba8a04175809a0c238c73c862b5842f942951905d46d1d09fb909b0a9e7e04dab8c2eed6da116f84184964537535c978f98db68742c9fe5e755dd39f9324f0e3d593e517dbee136acd7e57d1cfd4df3f1167c3bd67190ceeef1f2410d6e2bc72958faf60b9da3ce4acd89f77a7dff4aa1e95c93eadd4d959ed5704f4f631e7e57d18863810705c605b0aa3bba991ca48759a2f71a377e42dd487eec26d8ce3daf0b102045c4ae28c4c66fd2421a490a8bb077f0ce49cbdb9593449efa96e30b1850bbb6c19c48fc6f5901437cc73082953402056cd9da6aadffebf0346606f17de6b0ac5b577848edaf8816ce6a79178d2f6cbe5db056f60dd29b673a0edff5c316188a7dbce81628102bd4a2c9ccce5be7dca30996e5889d547b8d75561522d3281bd98e95406d07c612045faecfb1e7a57b3dd8522f2745cfb4e94d08517d9564e020f6a827567218662e6ddf2dc719b0701333aedddbed896d032bea3a10f11290e71cbe46d7514d4fda34248c18da52e4ad807097ac7dcbcf6475c679e2d07952b76a9e45fb8caef4911c4795ad10d1ff94286104a3dddd02939562b5fb18e24f164712cbc70c837eda8d0eef8da576e84f9449cdc7f5072d18f1869764b395af8f1be08045b714143eef4342c07f89c8662bf09a21ad91797cf3fcc62487da99a74fd10e7c76a8df44aaac384f8852c662541d12b7eec20d46018beb437ef935e849ad1a743288077426127741a6180bca799add939ee412fe85faaeca7f39acd9723c4f36d1fdb356cb3ca79ec325bf26012da4bda73daf2de612b6c071e42602324552c93d4d0b7302f4716fc6bf08ff549f0f3bef160d5a8c9bac2d3e40caecf292ce355cc0385231007dbb972f11dbdab7c51760b6530ddf5d3719cd96c11e18e9698318a0627bc229728a1ebd0045fb3f6f59e167aace471f008d062d33200e13cbba5733b0771b37f8e443b0fec21ffdb407596f3a262cabaf90d14f477b3ad89de203c34bcda6f2b9d2ee5232dcaebb3d2bb2172a9cf6c7eb2b164225b606ff870403965b05c9225a5b07e9c51a103fb1ccd3a7a3b90d3c5c65bd4ff659d95230263ff407a8ee8e868876bede04ad51b9f3a467cc03d9d1ab46aebee2ed1a9741539f27773d7cffe3602319a623edbbfda70d9ece04c35080d6d2d710f9339761900b76d44cdb3d19ebf64145fe394424f0f696d044317f821e0fe2a9058b1a39e76b28465d7210d131d880e21ef7b3d7d64795fb4a8c285a254e26d4998ae8715fa786f4f9ab40b33baf1ca50991d1bd62e8e4769e3d11b0f378ecba3e98c8b000a7d807a7ed946610655eb7496d667f9bc1cb6ac8aa032b91737c827b1d839ed35466a6f0a1d593b8e08e4066f53ac48abb91ff503dc57306291e55d981e1e4df9477fa5b2dcbe13c0af467e68f143535bc805cbf5d21315a801a5bdf2caa2a2d50542b70fa3ef9a3c9d85553a5bd79a6addeaa9d71dd0d9662b7bb1587a617c3714660b770f682f5078132349efe39e577f41070e3c2aec1b63e9e03f89d54abdd93c1b9f7ba253aab382512e29d1df8000ab7c21a98bde364f72b32e85689ed7e8377fdf8548a7b9d455674d962cce93268c71a7e27e105532a8b29c09a5d8f3a60aa0bd98a58c0c5f0eee2eb17efc0f45567017736c32d6d1fe570e631789bfb70816c0425370f0b8115e480822d832d1bbffe6d8f0a66991e6290c4e38318a8fd25a7dfedd172573ff203006d2f3cc700f899c8f85fb5bf6e2a10c078260f294dbe44d4a9cbf09173aec6d39e9df2a94d3a5af03a6a24c858647844b7088766a873cc4a23d091a16570b661dd1eaebb49acca4e1dd2ba9a243951b769d28846586cc6a921865e6f5d615912f45a77e53e77704868407f1e1ad02181562b1bb4a4d2ba586c955ee3a3a93a4fa9fa550f72c2d447e55b7c3c8152730a46bc4695d3cd30c1cca69ae67e6fde7ec6a650212eb67fb45accb8dda3e6ccb9012d13d22e84b14b0861185e38dbcf0911057103ba7bf8f5903a3be7c6b5b6f84e258a53fd20c45eea6de2351717945653c0bf9e5e38c7744f4e0e4433e6b82ff74cb20088c8f262387300516448b5cf537e42d8621675975eb038da32a25bc4c24b93c116a5c2bfbb1a789c6699badadbe8039a0d3c89c88707c1930a11252078ca357ff0dfbcde3b0b54fc67302ce1b1a609cda9d28b6e90fbb255055aa0abe170a1205f9d682580ed9c5bad35934b9e5f5d577c0204f04236120a69a654cdc4e6de8ea9074ffd516956a081d175806abb0522cff27bb8655de9997f1cc8efead4f4af1646f8cf77278cb32b2b5ce8dd64 -MD = 9dce12e49fae09e0b1a60f44199449fa31b9bb277857a84efb874b0c23118bf8453f8435f47b161c9747e719a642f805bf14c06b6202535e7abacd53e25ab84f - -Len = 68344 -Msg = b812e3064c1dac2b9d26def1775b3c204af669e1766f4d88c5efbab139094f8e09a59d7fe63c89e3824bf12f5301933d953b2ae68eb3d9d21574cd8f55921fe1cf17f7599e40f729ffead73710474c70d8d52f5f8891dbfe0068d7cc95eeb51f125239bcfc92bea51bebd632359431631dabc075ed7019b38fb11e8f8285d9f1da3dabcf8998a6fede3637484b4f08be6ba5244f43b75d9ac938eb01a2bf55ff30c095bbccbb77dd50b342a0d9e29a28cbaba51715d06d5bb6e585498005f0f01bc33ea74e63f8e97a4b3e6367b4af4a43a589f2e822119d5ea13691a1bd716da42eefbc95f9f2cb63e475b87e2d0fccde7b190a46151308ca5244fe8f51a11dd2e9f0222be32d2a13672dc8a5b58155a1169d87b6113a4501e1f8bad12748a9addd8900988b71af93bdafba64b4ce8d965c5d91c17e4dfc0b379aedefa92eb83df0027e62578602eacc43b74392be1ec436a04eedc415d4f13a72be713d1af38b0ba2c613b133ca207e30e7cbb719ad338cb0e9c54b5a76bad4c756e04dd5019e17b2fd320041af3ebac071838ca7e5ec47d388ce7ce38a6eece3ddc440288c7efa7a4e48ac795b4b67397ef377306bf64d525492bd7ab7166a0c7aa37ed839349e42dfdc1da0734f6fe435a4e17bea598875749877e5a5b8358b55076fb0b2c7e952d876ba81a253b909bf1d3351081edf83106813edfd5f37a897777b779f3fc5f1629fede38e5d2df043e6d37a6d4c39c6528bf75a671057aa687c0af4a7a51969a5dd1e8ddf78b3e0ea882bbec2eb808460888df48ad57ddbef9d84f07300cd00c8bbb3483ea93323dc8aa1e5af049b0662e73c830fb5918155625133ab58c8fff3be15dc53fa95ff40749fb6db9d729481316bce9db97ce5c153d985f6b5f4ae5070ac11c572c1bd3ecf8cfaefc1ed75e4ed849edde7244f5cf984aefc2038540458e0af3c19a0a40022d0799275f4f3b5a3eebb774972064edbbb7566a07c3a3afe1a7d62f818feabf5d3fb6dc36f5419db11ed12e74e54be81e4a4dc3ea8a918ebc044dc1612116ad1fc4828b246e13a1e55fc56c7a17fd47469010501a5e7c6a63ccc557c7727633cb5276a4a61e240f322afedf351d0ba3bb0558af1593c6db7f4dd73302d86bec06662db94a89f53e3e0cf7c73488f955e23671216adf235a7523fde3c1e76a4e575bf2497045f9975f724ae4d6c04906628014679895045fdbcb93fa730413d324b07ed5c5b6c3d31cf76288ba777d0da29e9ce21d69dc6419c153e7a4d2eb02f5001dde9970c659fd08d9535e02f80428de851167a22dffc591982bc5c842664ec779d489e883a4863319b51ff75c627bcc678615f27b9b55b8eb475458cc65a882fd5815a28e3b3ee29e2e9eb91ca0f1e4bea096bf37bf40a3b7baef08eb9988af32c9ab1338868db3e13048ecbb5851b3f4f1688d04e41ceea806e45d126a65c894a9d8df353f09038d6abcf6aaf0e1b6951919d045a250f616bbd2c9f360d64b9d891d5ae6ad277dfd2e596b8df348692968192d8c6273569e3a38d3e10540c4d7e7f71adf596f6fab0bacbfb6e7ec482c6ee4f94bbd0a8ca902950f7de03bb0be36e48381dc577531732577c84743d018ae0bb8060a6d04c1b565d12c5a3d8bdb066449609e661b0b0562083479f59d78a60c0e4de3316b72c339cd7efbbcd298c704c11e3811cda232d0f58e28681cb6d7545075cffe0d26ac6f58e84d30118209249efd01e109917bf0c427bb21ba7db283332039097667e19517eab73dc5114d62179fa46a5b43515008a3ba991317e8070adfb70a43b0f3496f08d24c69e0f44bdf7898043f52436d17949f54932fb85e5c06b276d19c61dae2c526d27c5b9e305b1a55552228c2a6955ce1dad71fd3f7ab37b3b5cc84bde7f7a21d7678fbbbbe1ee744c3a0417faae66f1aa23b82ab718cd5536d80f457ff32222e9eec4bdd43af821ed63636bad8af6db2315cd2af4a5571ea048b85d06f16b7f2b252c6637f615d2c03507304be44bb310ea79a6fe0a9901ff16893a7d609f5d25728e5febff8eb04e19b70fdda3aea2fa0a8446de30db24dda94b85eb2a04e7603eb44ff83babe21e753daf6ab167d068ddb6b19bfe65afc169c5e55936e24263f264df6794b390b8b25fbafaf5be64e2cbd7903d5b7ecb34bec103ce6c8399b6f467b73ff1f0e4a539e6d59657fb86f03cae8acd3170a0bd10058652b42e12e2ae857e8839a8046c7199aa44bf65601b98044851678155e4c75b17edf62ad56e8685dd4a56241895c142e10e154517ea47a171d4e5fa12314b895ea81ac00be2e6317b8e2fac49a993a722fc41e3d6e6b14dae5b9323012d0557028a0838dcc7354f015bac87be2f4e9214152c87c3953ed0a7f05943475f5b8fac9ca9da6fa3dba816bab5ffa1af59c95f61bc79068157f1039a1fa30f4fb6f703e5e3eded01400463b2325a17b11e14ace8da00c83262796b62cd8c7f867f59b06d9fbb7d66cc2b8f4b0be14abe043da3b36f66312fc931864e4b44bf8b1c7b5a3cc68a485ce7e4438d29dc625d730aebc961f16800f2defd698113f8e6f725aa5b3ea3766af9f8278172938617d3452d329aea962d474b77b857435220762147d1f14e2e196a30e22ecf4ddf738db410f70099e23e2e3f9d45b61bf4c00336dba6c5d398efa2521d9d285495f907203d1f7d4575bc1181171784e2074e052b0be2a479dd7609267fd466eecf31aa505bb2f837762f57da8c36abe1b253e4c9818e758925360776b1dd6f64b5a4de0e13b958b80e1d6812a4ab11601e5607d8e5b2204b97b605085ac02dfe71d90c200d3a870e6510acf1087da0a672dfd820de548c075c7e69a52383870328589a4ff0406c81a28f8b3f60b43efdd776be68157ea3059b169d15b43064bd05aaf26364d0ef5bee236dc35359d5ab75a4217a32374c8c7d070720b4ceae722d567a2413f4f8e27052ba468a724cf973f0691cdc886fe62ad7118ecc664c6bcbe49c5aa2b36f6051a7da90ad0a8b2ffae3ff17bb77f559c9112226a3ff26f005ddbfccbc163c1bb8a7356963267a9531034932780fc42e833aa1b1e2a1244803c84a430723485ccedc339954d0017341dbb037bb55c5ad7fdcf8f830542ebdee2da7872be4796abacd3de7290f081051f09dec2b53e01de67e8ec036212c95ee943d60d161b88fa502b91c8aec77b58acc761b7110fec8dfa9cbd49b0f06192a867496a1a1ee11b70411001e6d36aa14f6a48a359405f493e417fb0827a491cb8ab4f042ac0139175aab5b8e9d2d3716f690021ee8dfea29b7dafc2570ee45f82965375d8adb4fee8cf1f5818145a4b855a14ad41372f2caaa7ca099f2cd7cdaeaef339944629b63234996a0236438249a3e2c001da8539e4665af0db527809955bbac9fe080649fa61d05938a733c7f4dd16e4a0f6757cc12fef128c2e6975cf22f6a16691cf4ca9dd40b01be5bf8f4f6c1d959f099447d97ad2d9320f00a4b4ab434a7e41d910b90d67093c802b4a81e7635d6c82563d85bdb2df5d72f2190e4b3d4fa5b6d848a088bfcf0af52b8c64c584a689ff3fc06e8f1b7f7f0892350489210b6d5f315708d5b76c07b324b7409cfdfb87eeb572ec655944172e85ab6ffbbb1835b978be5a5aea8ad3489b7dadc43be6d6cf5bb797b718c7a65330ce790947f0bf4413010daec585de34142224d1cad3072f9720f91ac664ad152820e838741f3a8d94a1ab37d4f7890413571e4c275a997dfc217906dec5bbf2c045161fac1e67f47222ab8c955a74171d8f22a9dde7fe38ff4b9fe1ee45236abd9d8b157c58a827300697239329200b972caa615af5b5ef14f1f652617da3fb64bccfb051687b8462bff6833ade0d4014d24e193b2e411ee1d6e4ced4d99e135a055c86c7c862aa6ed1322208f39c631af26617dadc3036ca4d13cdb4d372411219a9ef4be2fde7c8ccd2969a047dc31e1f8b03d699f3c542e6ebc58e15d103016c40805a629deb151560474a8af20e92bc35639ae21c58f016d54cccfb3ae7bc7fa8b07fa1d322b84d63bab6f1c9a42d4afd9db43f1a50465f78c9fe0e005da7b65b16283b2e0d46d745775bc34512226e3c38af2b6e49aa434ed39dc8d1d367c2d017e0991f2935459df39599f4d7367889bad81188b3b054bfe028b61ff75107903c454616f4f80ad5b610c06961be0c5eaaeb9c1a1cecf644763b505b2818071409a2bcb60f23a9754549e113504d9c337f462562e3a4ba951c221203e40143f3f695777cc63ca3f517ad767311499a90ae744823b69c140a388985bac9c1308889aa10cbb8a78ceda3b7eb192356aa0ebef26ebce427851c61ee25e037cc7f7a493ce33364f8c6c77ff5d96604e92d06374d239f2adba0540eac7d04bc776311abea993439a4d40b12e3abfa4465a60f9de0e15ac92cd839b560f598d6769e17282f9d5ed5304730f30ded366070a793695a32706d9faf45ec981a2d043e82d354685a03962f92c1a6d117bac78ea42a1015916076b898012abe6531c433a3dea74169d31af7494584e9a5f808142e4c28bf78ab72ec24e3e630614794fa93a19737473dc23bdd353394326e90a59862199472d1f0bed876a5ba98bf04f7b4c4bab67cb42a41b109397d279f0fb785147950fa446ea51521ffa9763882bf99a0684b74d6c1bd8749ed110ff9b3ce76dbbe5189a35b437d8e3a897424acb6b4dd5662ba061713a26fe4dc561f4b6ee0105f32ab5f24fe74141cd73d13c18198c3db98d6d298c8a4e3b75b946034fd535ae250d9d87a5a9b4bed1f1b768f84a80c8e5a35bcd560f16dbb0b357cff0e3323de588fbfb9dc559e41dda9cd6544851fd52361354b613a468657d3c608261203a9a6477571e82593a17f52a8d15592664680d3cc693dc206afedd9cbeeb97272dab69b8a2122adc48280c079521c6278690f27f2cd7b3b367e29c1ff215cd6d9f825f67e460030997b8e5dbf662d77eea30ab848d69e085e979826e03e64b1d18860e2b26f05609ae304a4fb8bfd35019b201f2f131abbd772b5631f948585d1e1f3ead6faa6a0415f6010ae41f04c8997cbc7260175c839a60e20fdc223e553bb5b695c77689215574d2b5826cb00bf4f8a4abe3033a01d880ecb1b55b432ff6b03f8a363cf988f51187f8988d2044b18c804681dd8e5cbcf33dbf8bddb010d779a134c5e403627d34e67a306a9c9959a21aea438da0bfcb219de0678fcd226776a43c7b56efd77647b9e451eb6b3273a138402ffbb8508f73d3bc5059e18d2d100f4a617a050e67b1c6dd04f8d73887f1a3ef50101e378f4fa9fc4e233679b2afac057d388d30d8dad60e507926d31efa23a0abb2199d531ee54869d5120d7cbc4116d979ce64512ab01f3d56a12abf2380fb4acaf3aa64495047aa58be71159d97247d2311d35b091eb7d3779066f2d681a73441f2854936b2a2189282ce05bc76d86f209ea47ddfe67e1bc43bae3f7bef4d71fd5f578a4fd301bc6ca54cd280a6dab956bd004014d11e1c26e92b2f7892940ae88247b0fb7a0a9cce71120650eed163afb60f2b10a73cde83e4054936322506e9a27e42a17168c2a12c49289617667312d0f8c63b30836ac57263151d97a76de70823c8ab7ec136cb1f18c1b9ea40f36654e499fe3398c7d2dc6d1c9688c347ccfd5fca806abefe3692a858212c08ea958afa2dbf7a26fd946a4de507cf219d7fc75ad188fc0624c8cc207536a8656186ba6309e7cbd315f16328f9d9326876e8ae3b642bfe42b06b17a9a15f25005f212c46b5dfef4716d31129de757a41dbeffc2b0cd13619a806b96b62076a80ec4e28ccba0eae2b0821ba751e416f53d37cf75150e26e341681fb8d4393408e10f5f51d9fdbcf27f4c3a73741a7d8476677e9d6b8c66c3a01c42538c96c6fd2d4fedc60ecb01ce2e1a02095cd0e7ec49cc818e1cce5f9d472b67f937efabff33f5125be2af45b05d7a26cb74cde2a737e57cd9b15a8dcaa704151c7e9a5f89a5ad7185ee00e5537deb0d5c6457ea2fb130c4f2b1a75df63034ce2fb92d6e16e2c76fc699668d221ffb2a1ea4158ae0664d0e8ba63b5c8a733c07b5802f34318bd171b06d4699a6b4191194ac7d318397789de7079d1602009836406c066e63f15a3bb5e237974bcad33850f5f57a73e56217a74e32f6f748c7ee52c5495928c3d0025980a0029bc49812d60914c22bd097e04ef2939bd4bc59946f247ea0fa63c18a1dd126682141f635866e61b525d968ac408d456114ebabdce8120cb24371ad17655c114446c37c25049e52affc7072b01e86bed342475d0c60167a29be4df15ee27a2703a6b97845b3017e2f0a3644b05b67668ef76febb769aa5d63a5794cb4f7c3ae32bba4993c24302abef98b3d1169b7e2e08ec5b67267260cfca3841dbe27b13d6de0155d5cdac30eec24efea57dbf0aa7472d96bb1eb423f5122eec2cef4db4af1ce7c134c3902911326e4caf8249a23b76e2b79ea58673b0dce29fa8be19a5d8ad149797ee1a737e07a0a6d76c62ce525bb2c4fa0510da68eefc613696086fb75931dfe5946f989b098b130585311754c046c7b6847bdf8511233bbec14299b6e8e69f08feba20d200d89b2113df04a96b45c7ba6bef0b6f0dff332985eeab3b21dae1e77421918ab32e46135f931eb92458cdee0293e48eaa39545d2b342db0cdb6ac6a3dcc752aeb361dc3b176ebedb527e03a9090f44bb079a343fa3da87cb4210979a3e4531c7098271951b0f5abe55908865f0ec30ce6662ac33c31a4079ec4fefcec91b4c70afb6cfe8668c45c7b974dbab534d73a15a9f0c63738a7b9534696db61fa1f938107f55899c6de694088b8bedb2aba3e05eafd3235783bfa9a51d6fe4a481ce89c65c911d2f3cd38fcd5507a1919f47e7ed05af17c1ce7323d8ac84eefa2332e24bdf00f7917193376251ed6b6290b6448030ee9544a34c9029b73b19731edcde2b6733cd65948c1782128bbfc8189572a2c2104072aa827b22cdf108c1dd12d9bf9597e31e2e449c871780f314af6beeef39c28dce6cdb415e41554148d68b71a2eaabfd1da75352fbc16bc9eabd8035aff863f1aa32bd9f26c1c6378a938d126fc6fe6ff6881ec75aa08a88bcdb98d37f9e7300a8c48fc126bfc27009bcbe4860bafdb03b492d662e458bd3fd720c44c88c7e3f4c6ae873e8abe87f388a9590304728625e72f5bbe120ee104f2961063552f40207ce5e03c71696a9b9b5896658fc0cfad29e1e350dc30fe2046a2d94207262fd5d47371d4c705ba3ef962057453a29ee2a12ed6e1e8c8fbdcfacc87b247b5985cf6e2a0d0359b5e25cd4f0df7f91fdb0d78a19c39e1ddc080379c827bbde363fd0bbad7f762313e983da515b828406e76d5bf9d206d783554249b336510b878003b817d10f7d242de71ee877d890c3f65e112425e34a042a0ea500038e93cbfadadc1f9e49b83524192b1ca0fc48b3622c421f1badf5dcfabb04352bbef78214c8a01b53bf74e5607c877463680c53cf4a57413fe16b7c4be9ffd92b7cb738424f9ca18dcb23a36793ac763b965c33725ac9411f080b70921df0526f52435d27e23a38a91754fdadf112989621c8c11fb03085159c664861c97e3783aa3c7f1a230147320e8962a81742520f74d28b0bfcf583d0090c724f7ef20ee51f030cbd847a53c52b2160fa68c449041a0a0feb83b0d3caf85e6c9f91043f201b278466890df4bef7cd86f98810d4108bbfbe1306caeb52c4dcb5e6b22d4eb1191a84c99344909bfede2349d7a099c144941436d8dc31240917ecc954c5c414a37c7c4b55b6cde89ae3e44fe9fbe072cf07a0bb8c4d4bab3f905f9bfb7625b7449dd95022cce331766f4890319b6eb1a58af2159396a154d2c6acf318b6ea35772f3a9c9d0f96e2fbe0ae9f31079b1a42ae86d98160c8bd6d3b53532ef0880ba580fe7516f75f99a5e8a4e18ab8dbf930e2bd6bd8043841595ec120c0bb95a66a33c37e42fc83a20ed7b9fb8137c7faeab82470fa19668d31b19500508089a24fc7f81c83b7c9b8814e6c41c70ce57bfaaf4a5d7a18d9fd80c43d6660e7ea6ba0be2ad46b919829c7ad2a48ce909b18cb289d95ea8b091ec11738c7744a1e7f0776ca4a6d2255922c847294fa6b7f4df6c4acbe9dd88a7d7d2b05a7fd3fcc590e8254c30ad2a87e3a54e3aafd05f887e803e63c3689c4760f60228c8e314a96008168e2c73af74a7baedbff28f8ad531956e8a337274da512671de989b73f92a7c4653e14b3d8836ae2ea1610abf43c253e026802399c9700906643823a01fb4efbd81985e5b2b572a19c6446a863af7649e20f3a2927b8648c8a2f0a42381c707840199d391c5d4d6b517e3d667229a6db061d418e7575a8ac081074685892a6ca2bc2cd367be73590a7c8577eb6371191cd06bac21c7b678f4e7c7304d9da7c71f999986667efd5c20de74759965450dec54ff87c73160b96ebd768b032704c0047f2713156d39860023f6f7fa90ddf428d7d9d061ff21f636ec5d7e2f8e0afe58581fa3fcf4f180b1355425944d0374d64042b07898c1d7525bc4325a3a812a230bc95da479ebf13bfad628f2027d350077804f93640803ccf1f2ce0b9331eb6e806d6a9466f082a75cc328991914e0ad63dbd43acbbe23ac98317bcb01e1ea409f53f15421c8dbfc42654c13f8901de6ee9d67f535aadef837c76121ec5bcfa150c31b6d143ba3429302bde609b993b2ff0c324d0a95ddbab5fda795bc6541997b041066a511828139e3a39db257eb197f725ac9b247c8f9fc1b76afd9c8e831085ff7c73e1122c21b5025bd5d31cd2354150af2968846bef369f5f8ab4c6d70df1cf8194605280c21906bd07110dfd9673e684e1c20ff10822f4df79bb8785fe8833de325b33f6833ed9e5e56bccc42a0349c67add69cf791b4a5340fd6b0040cdbebad42e30ddd39ade6ed73fd3a66e741cfc5b273c57b08412638706cbe69316e2d00075f3a731b196a07329bd24e25ab29ee91c021a5cf1ef78a2743499640822962dbee6f32c1795333fa5d3b0140bbd16cb482597ccf9342b39a23fa912260075e265754231415c8fa340c1d8722b9f0c781841408eee82c3933d37964bd50f0795163904dfa34f2e2467022e9b1edad85628dfb521564dfa6591d6d17fb990c3dc2daccb95c20f9759951f02ed79e3130be64b6612d50838173c77fb0c3858231e284af6d231f043b95772f5e7b16a34ffcd2ec3e1cf43f53eb9a5639fc5a7bdd1928e273357a3bbba2aa8882859b2c6b869f45efcc983ca3285e9bb990611ecad0900cd37c79c77d29b1a2a1dc76f40bc3936b7e2384a2f992dbf53966e2947f6d82d693df63d009905527c36aef22b71b7503f20bff98dd91d80dc0662504845ac7e7bd45827de8415ebcf0164ddff8f60fb8546b5346d88d1f8a5678719762fd27e958981cf7a1a2940b31c8da5254bc272fab2ac6d571ee761503841074a0c069816dbf7a66bc1dbebc8d68dca455d58613ff32a16d311ca656d07248c5c60a575903a2e4f1c119a6770ddf9cfc83aaf40a596a2c359f8077f4c42a62af5d42b7192229a1c039fe12e3b813628365a139bcc0baae564380b098e895a55cecd25269d23cfbfcac33cba896ed766083231cd33c0a71f8a5851be942995bf4fb21f0ef1cc338cda022996faf551fbc659966f4d542bb414ef87e90dd1fca9e1297595607a6a15a9f3243e00c34a6bf9469dfc9944bd55cc53fa234be103c83ba9c54449ccd7ecc30cb93a2b470539097fd4ffa800b076f92c44f7eef52f7cb7a98aa62e220174adc554f5eaff36e58f6bb7e2fa16b98a33eed4c1577cf449ddbf32357e188b3fd293840bb06a33f3e3a0d340f0053d21f502463a35e6d6a21641587cba1eb9c0da1dd2e62c06a0e6bea5a3842a4acfb0c50d05acdac16b3819d679e682b3318a1ccaae1fae52f22078e095371965c5c91c658fa3d6ab165e20e4f30d3864670e13108202c7edac439ae844d44dc4d3dd73b260b9ba026c96f403604b7ba0eecf65860b4a091523c29d332ee628065e60537a1558e545d274dba85e3bad071d308c91866fd2981d200847bfd74898e9e4440319fbf903dc7a704a29584cf596f3e0d9afceb4b4ecee64ac7442100afaebce03eb3d65bb0f0a3a7f7e2bebfad06c1ab4c3e1401a17702ac7e8912ecb05e949e30577abe9eeb692aea9210a855e1b92b98f61d5262167d320895ee5578f6f502705453bfed012215e56c219338484d16e5eab14779f37e64ce305e44f1be069564720a698677f6f14f399a874082a5f29ae376e6cf562ecb36210abf02fef0de757847c151980c4490c1228d54d9ea4a21a914394a87b5eea93299d193fdda660b30b1d136ab8d9910cc62ac5c9344a3e1043448d3cd3a559029b47f8d04edb38f60f1a01ef7a075362202ec41f9da8742bc7e195372e58951cf02d3d65b504f67d1af36efc56e626c8aa955e953d57dac9899b7b0bcdf1156ec2cd4574a2cc2fd4b929c935d1fe71acefff03de95c0e87622e27d4f450750548d98af819a992b89642d9f007da8da6b4aec4250298c03be0e472a561603ec8aab2fea20fee49ff7968f5f00bc7da79055bd98ae8b11e30db64a10d4d35f306dc5e373b75246e3cbdacf97ab00f58fb88b03852e1ceadcf1a55bcf3fefa1c26a4863dac93728ad62ab5ec7540da8f940755e8673617f77e6760c93ebdd54292cbd219deb1012435882cd6cb014f06ad48f2f1af2fb583a6882dd2d8d2eeecb119e9d2b817f9c4c19fb8bf633c9745ac152e5c1413d0d9b04663dea8856ea2eb557470210d81f3e23702b02538d9d4fb34b1307d2c8f820269aaf6961e7deca8491afc03dac1370017b1b0f93f3e3c006d2475d1c01b0506b9ac218ae4425350bb847d45c7e21b83086ec8c797ee04258a2f34fa189cea23fe0e676c20e65e4b745afbcf1c0c24d3d2e1ff778910b4d1517974df7c39bac0ff7bd0241b9096023c437f892166dc583db15df15dcdd46b8cab3d68331afc478599659b1a6981dbdae70f5b1d19ca7a1187ea1d5b4ced5d016c977d8768381f58102db76899a93f18efb62d5a4c76a2150aafe4cbb6860e79658b06be4bf6b0408930614c479697bc0379e71e28693612e3b32cf43228e6bb3e20eb21eabf6205ac77820d9cce498fca6271b2d52aa0d0b9fedf1fe95a4d919e5f14f86e1a9d6e200900f4bfdbbf59ed78b35e7a4146173599e39402a4abc12d4e6a8bfe90c9448eefc549d8455fe213c39569403792afff8b229ba68e681494f8d321c3a84e4f9d2fb754119293f1e54c001d4e93ea5fbedc827cfda1ec527b623804e5ea9457f6d3c05c904cc2500b1adac0cdddb8f01a95ed7e2e64a0438996827a8bde042440e2c7ab7dfa53c52c350d9be49e632bbdbd4aea6260eaae679b97ccdd0d047d2465b3870125b019f0a67ff6bc5c53d54c5c8108c01b335dbd79614204fefd2c4a636e394454401401741a197ca2f0b9727b7920711fe4163238c723283958f759e4df086d0f6b7d04a7c44b4df5a29ed5201c7a9cf463a26ee1b0b970477ba7faf1ee3ea4df991ea44867d557dfd14b1d56515e6a201ac91a7c064a05afd004d4908322134a32bd875eeaffc1e7e589f3220013032d6f52de0fb01f0ff9bdd590cc86fbdfda9e2355f13511b4964620ff8e11e28ea3cc0761a49680b5aeace4d5aadf1233174618b70a305357725cd8e8a16d13330898ae4c42a0b41f5504f74c3477af3588906354afc30dd30590795663faee1ce63b1046f2b60576762dd79c7134190db5e5ced6ebd6864fd748caf3dda1ba6ec41df5f8bbc0b9e2998f4c6e69ff9ae426ae1fe2c35107f46eed9464164bc1542ba62509a5a6198a47921d6a25c178e264511f23411cd8e954e89f5416de49f4a23e6722b8506d97079e1437ac60fc2ef638963e6c1f4157119fb369e6449b76b14d84ebfda6fd30621bf77e06c66ef164c94cde4c438a662b7c984b8d63ff03e03b450b7b91107edf718fe63cd91652376e08 -MD = e95fda82d0384a00d1aaf90744ec582cdbbe31f5c6b2ea26b963ff633c7224340fc4423203a8972fe7d90c2a2342cdb8fbe73e0ab036a29b81d08d859978281f - -Len = 69136 -Msg = 3a2a624bcfb908a61b03e422b256dd9e4d9e0475273319f5a6f551133e9b565c9348902fdd5fa32a919939e23e5501d7b42ff8a76cd3e78124142cddca38be6a9b966c488c646578e9cafd913c3aaeb470045dc13625dfcba860bcca2c9133909c3d7effa46d57786bbdba9675b0ed1dc846be2d4dd10cbc7a0488432e4dbdb6dc654ebaec257f135e9bf75bb15dc5fa031da052797e733ae12619ae961464c4a43465e22d31e72f0c8b3d47b7e93e336ab08d9882d41e2e27eff5742d9031a33cd54ae02f3c97b5bbb613c251fd60b045280c672f7d14819286a6febb672b39ec6e851abaec958eb44301344541345adcaca627491e5d196b13b4b308415b6ffc289ffa96e9eba03f5b8f055c5cc1177665e140986202e0f9c0a5fadbc7c72eb32a1fe78adca1d5a326469e5ef70fd05c7b481be4ee0abd86b3033dfea0795c5b9d8d49606dbd142acbad6513b9276ed715601ef56d7d97581455e3377579e23aa87287de4349441a734dc3434b10d72d5bb3b293856358b80c24544feecda99874540bcd074c4fbc45ac21b554d2f5a676c84085dec5e7eec3f7f70eb27f98bf28be3cf460cf1c586a54e5327d76ae8c8e272e9421aa2c426056363b6a9796f6ed35821df7d9933609cd79826e03ec25ca59e588f61b0ffc0bc978a0bd1b8d84eb43450e73729c9d4b9d436dce8196bb53e5ce29041f7863eed92603541564b2496fed907ea21fd7584eadbb45f994945153503ef4be4fc02e0da62dd68c03c83041e26bbd72042a57681d337d72cef8eb2cd2916d007c5bf6ee61e6ec89520ec7428d67dae933df7071fd9e1bf42b3149f6bee818eee77c6c03bff53e1338cb37f9544c7d10953dcdf3b4c4ca879686943c7b0c9d8f796bb8d429247332a049a7efa0e14ded108e9375aa6d3034f43ef48371c5a3ec186f03e9053934ee6fce40aadaeff38b8d18ed804761f5022ea2905508dad20badd275cbbcfd28508ea329b4683e16eff525019bf367c2fa2cfa9139a815d4f621da3501b738f85fe5108b95b4965f232efbf74e16493f22d68e1eb8b93c4eb55ad06c135db24b245c5c8ed324bf762e22e2f82118cd138414a56059a318eb4e42fc418a1532caa5dcd159f822800218b7242c9d61bce628cf887fa4ce7150cbc0a5ddec49821dec4bb5158c15a3ace9d708ba4959dd6214ed80a221a30f2833bb1467c46068eb019351e91565ee1baa69d5caad69fa2d5258d3f15988b9198f1d920897c2addcea9aedfe1d792af76355d48652f7d9efeaf6c995d3e639cbe6cd65e8efd61999b14ad17c2bbb1fea1a834d14bf6d4351e2b1acb6172655e840b3d52e530673ca5e89448ac892949ad9db879c7c3100fa4470c27baeaed615a6b72c034cba8517f7418f507a6652afa744cc4712add894181b550d1fe883fc1ec1b08e615815268659fbf7cca022d28da9623c084793c46499ab94f23a2645b3b9abf81a49eca212b9cea743a6caab91ef92a4e669f83432d40c37b00e85986a876368fff5d231a449508769e112e1beffa4a7357ad18c89b3c21ee0cb6a9b4d13210799c48e7b43f1cbc0c5b9c41d19c1e06c7ce2e473721e14720ad99bf963452cfc6f1fea29f7998579df97a606ac1d8e1c4308fa92f3fd495bb6a0e058b406ce70096cace3c829c7db40e182457efcf5de1356da911738aa006d880361493c4d8bf0149d50bf89d90e6f011e8197445edb72334e17e3b87f8ab6f9cabb29d1f274ab808519e3a10339f45d426300df113beb071ccc616310201a5bff0e5cab0554c2172ce63d598d85585fb892c0b35625033b0d5a9822a4eb20166804ebb4ce52be40595ed39abe19226d47b7dfaa75c14435e96690de84135092ce43ddd294972665d629af4ae01edaf1b67a66abb538355e789b527df9bf3237f8733aefa14b82ed69f0d95339bb0952ce825c9d60b25e1e819ee5e949174f6eb03d0bf23b945b40db5b579b121936f85778c96abc5648dece1a5108bc442e9dbc4957c3ab9d37c6f311330cb25fe94b1903b5f9124d7a0425b59fc49c6e572ee53e264a398ca1e77bbb758d63b6aab3dbcc2932a9bf7cfa4f17d6032fbc5387f3c4806f2c8a1e0b390023056b460298677b2cfdcbd3d72614e9feafbf57a912ae856e1acebe389af789475e1336786283b7c742beb112f23bd320af9267e135de26f733655176fc7bfde87fa3af9579f82801e9cb82b5c58e7c42ebf013845a4a5224a23a6a60998d050f5063d8df458d77e2da3a6e4906d38d6f4b238319e8bbaffc4f95327fd9f749c3b99adae02f0c4c72fe539c551fd3adacb772e02847f9e58722bdd15a2580700ca292dc209d3b4eba3b5e35617756850317245239decc9dcd04fc6e7ae3ef23f2f3910726f8e426c17aa260f57624bd7b538200d517fc7fd7db9831657d0d097e94e0827aa9cd7c8fa468469a8404fc1c53d41383595032ac91da43a559a2cbb76dc776a416bff72d9ff80ed709bfeaef0062b2cc0d915f540c0accc2e17610a6678d0b2ca9813fa2559ae1356d1d30fb407306379987add83670f3427b508151687c689bc9ddfdf6ac96e73b18e67649fc50374c66fac53ff554e1af91f9c5c259dab679dd99d9328e33477173e263df1d426c93dcb24e9133fdbe908a3a850123f01c4c4f7e7a5de2ba2a5fe4d9a0c7898fcd956376f1d6d7b4b16eced96914ac06c39e8654897f9073b78ed492d5092a7f83d964105617c9c1e2d0c59e1805de64d3f6eae3ada17fa61785acd6a9abe65cb6e74546245cf16c7a3ed7533bdca05173dde3f28fc9999b71ccd26dc4b7a76c8d4870e103ab37fda1406cbe799fd917cbdad94bd602c59aeeecb01fcf3454f931834ba99d0e83bb7e5feca97b5873fc047534b42b51ebeab66cacb4722bd549ca204065978cbdef3a22bfdae90e554946365cf636c0f4d4f0d430f354a312a47fa8b6df9c2dcde1fc124d196aca6745b8a6bad99e56c6a0c5ada3a51ea4f25478a215dd52fa9bd9edb5fe30a693913a834cb4240c1b4a965c7d6d92773760a0de96c42861fa0f1f35963be54671bb6eceb0b3a1271868fddecff682086241cfd90c2d88723612fafb3a6a02f26ccd2ac25b20169854091f7228a53d792f7e2a908db7c42db48ab4672bf54d518dafb687d4614c06d713424112e48a71a6fff92ca0caa6397e6193a3f0428f0cdb4a5a44a3e00b1aaa70af72141b3398ceac84d4cecef43f9c7de0d411bb8fca5e845e2251031a7cd406ae2eb7b0fe97af6d12b19e2b77e614c8e22516c617341f460948653443d35dbf869d810cb416512beceb984af7d7f028e3bc88cdedf22579a5de67da4cc74e8181e6fc971dbcbdcc5ba944913cb9388729c1ef37daab7903780ee05cfe02ae36e532b0b90032fa3aa5132b690d35f2ccfd5dd16ca60721cecbfe5724212985c5fba824db2620105b1252d43b33f328dfa7b7b8d419b027c0e5d654997de7dc160b71e063582c0819ec8ec76d779ae1a86ff92bd7fb4b92c310bf5f23d9e1ba115db46cbb5c01e95b79ee8d699fd2260e9d48b3dd13836bbe92e1012affc2279e389a5149fa45bb08039bad957345fefc78cfd74e2afdb998b463c116b5302ba5e64b1677fca1860ad0bdaf5bbd99715749b31f920864843bbe6d2850c4d3cf0eadee43ac28bc5348287b1c2243768708581f1311755ed58ef829bd3ef4551ac1d6ab604f483f29aa55fd7b51ce8549f7ed393c333993b379a9bd08490c5b15a6a8abf6ca22d111189e6c5452266dbe0c502921611bad26e41b5191d9d690c6a66d168c847f1b127a4af0308c13d7ee30c8184a01e55136b7940ee157189937a76b14abe526c434b8a2b095675d6be2499f2e407d5d29ecda5d1b7f299b217092eccbda55e1757fbbeed50e4bcbd0a1401b928a3b4cdd4f36bea1f3b927ce77503666a13c76d6fc69768620a027af33fe856db0a5791567b1fec8c66e844856c8910b8802ae8eb2ab81ec55ce37afa16a25e63b21ae783d3467b77faf793815e147e3180f5146aa6a582e343dc479f26b4226b219b1aed8a83f97a6e6cf46ba859f15d8cc27a5ea8c4476455695b42eeb25549df44b6041f3cf8fc37a4e194f9be0c9519ff7547cfa8be9117f74095ed11799851a44367eff5fc85fd3be5adb0a532909f18bfa679d75b11f21272089055e1df0f364d799b2376a0159e7b067bc405a8a2ba940b45c4cf6f7a577a0b76e420769e773ec99f69e9c327491c4fa98ef875cb31ace6a1e56df22712c32f0f60d7f755e381c87b2de86798c833e9c86a7d605f3a64b91cddd9527ef0e7d3d8405af9ec07c106ace3d515e0986c5556eb16f0f511460325027408e86e42aa50174bd6b75076f4a310425695362012e38557b02372eb4548f7c06e09d78e03153a0d164e5a1e230c57a2923d2df9b2ecddb22640cbaf0ff722612a49e9048e863d214127812112271e98613eec43b5e138b8bbf3881bb3be16c8a62f0f509d21951adfc9721a32b1d9763c210db88c4f3addf9a234bbe11c49597a3fb6fccf75d67c5aba8984150b1cde9b69eea2b6a5588457e35e0a08803ea60ed27c63960185a84a5153d929b16d3407902bacb582265e6f2d6070aa986b30ecbdcc1f7143073117444d93f1332f18f93a2131195408cea7e6e8aa47b3538c8c28229af1b8ffa959f9f33efc0ee6ffe8ae8bda529994578aa652f1506f9c0b75c81c6087e1b3737af8c154bab3394b7e83b7f2e1c14d8b8ff23bf0652b89402204160ab44be71202b7545fadbe7aadf3402225576988cd30410011e685cfdd3962bbf3f755ff2779bc18ca558f3f7a1f7a76fc1400fabf14294bf064fcb414f47a5aa6d1ae6006588d8b2f42b40c423b8912b1a82607b393f18bf650fefa8a0ba18ebdd393ae41279227f8e5bb5588dff28210a427345d48502cae4b1ae7cee77ed4836dd45e6a5f607bb1cf039fd0855d418378a3050ea9cbca82b3bf20360078a8a210bee4d4787ef2d45f3b6f9bc40fdd749617fe6a20aac21e1b8a2871ff1597945cd1d631fb5429eb26b1395d04a0b27e9d0484d24593cfdae2da64e52bdc0dc4b2aba6e560768d60b6038196cfb66d0bfdd73ce9910d3033ca4e6a022f4297cda2baeb71306c99df7db0dcdbada769a7293e8b129b8d8fc302449c7b71dfb229bd6df867f38cdbb1ee279f8df6fa44dabf78f3efbd8b5b135b6b90a38c09e9435353623c227ddf7298067e4064256b0111350bd38f8d1e7f1611eb0ce667a9b51509bd5035b5f1ac0babcd755dcf58c4dee147507a194690c2d5e02a096f7fe972df7e56a5bbdec8a9a611af4c4eaa90690c1af915966fe2f226248d7d87d87aed6309b20af5d3530273ef50c829ccfe50241b3fdabaf6d024912ca9ab474fc3f53303f4ddfa9bd59693bafc59f72c6914b7ac9741cd77f2ca956cf12b34426f1aadd191873074cae69419246a2d655b37356391e3646fc564a17a1665c55cd6de52171aaf4e1a9d72e36e4b8132f46f383bc4a228065ac27353b86bf370fb95b0ce38e2bea9e9d7bc004ee427be45ff8829345a9829a564871acc745cddbb161250bb9c2dba6f0422891f80d605f696b78c572dac54ec4600650ab1fa51f7e2a3a803a9751616ad66dc74a414d072bf36d3919ded0eabc18fd117c764844e85c522c59d3d337d2dc978c2b05c7446f396ad782dc2bd407185dd680713cb3b7a076f65e9eea90f2ffafcae581587efbe57687f5fd5f766d072e8601390bd3b39dadc6901f1cd490e5bc68bede871d989e9a31b969f337b58d790b45f53c0ba4fcff84387ff46b7536c64eff44dc890e0cddbd17476f7ea953454c95ce58c5516474189ee5f7bd699bd664efdae02b25d8471357bf5cb50f019a3138ece668837e156b0a7aaf3234bbf292d8c91a69a5aae01cc1fb4143b03f80a278766e5c02f2e963c466a3339d4025c0003813ac5529b1be9c20a69054b300879b9579089667f8e913d05b266dcf74d6b050515dfefec1e232591304c20821c8ea708ed607854be641e060756c13e9bc30395ee268d11871c9cc1107c4e4ec4ead30352d1cf5e94094c0398662b18b5ac81ac2a55b49bf51aaa1270120f067ff2cfcf6759e5fdae155956ec317546298c01b030c9f0ebd6c1d01de5a9fd39cc4aefd5a17566a27afcb8a889353a2775f5f66ab81fbc91aa86914bd7a093593867d5ae87909bfd79440c40e5ddd43d195ef20426b3922dfefd8014cc926c0532bdf3c29048206f277fa6e888b7ee07824b6744e321fc01328b0f113b0be1ae49c1dcba32088e6813f42ae7e84fe2175f2fd88593d764cbe3b3a0b9b9598eb4ec27e2ee036e2078bd660ac79b025adcfe90b84eaf6056de80fbe786be17ddc99844c8e68ac591218239c920177ba2d8ef02a918ac496cc9a8e845f0bfd3594cec9cd12c1ecb5af310e3e859c418748bbeea0d7bf0fef10dc9fd3e9044f88bcf57b4be3755cbe85dc7f8dafd47652a75dcdb67d1440d9e2b42af53ddd413efc14810c280c663b3d235ed238307ee4f17c74b4ab0ebd1cea2c1830851e3a1efb35c3590a0c71f67e0e93564838c105cf20cbe28b37ef80cf4b4fcde650a2f1625f2979b1ffe4b5f1a4075e0575a87ce952ba8742163ecd3a19b8138afae07fd89b9bb6446c29413eeda0359a6e9913e61929edfb3313cad29f3b4c99a45e9006f00156ecdca7620cf147222dabfd906f7e005adc17d44040e4c1be3ad683ec946643a2d0d6c6df03b9e56ce7b53dbc2b8827170d49ebf82bf030b39619b75a290549e219e2ee82cc4c605cef13bf5fc33f866cb751beb73ccc7271d5f462a46dd6fb5eee8887110fb2a23a6e4ded41deab06a002b8b7481b7f6d401ef0ec900ae0425d7851f95573f4914e8bec2e2925d58dfd15053c726f110b6a9993bee7a52b0429dec4ad16a11917df6f77e9e13fc404c919c0b7fce08b323670683e70e9c02b08496a091c41291b364176882fd680544d35728faf18f4ccebc8f4d5f57ba69d43e1c9762efa2d849c2a7272dc8f1263d192a22c53bc54c0d2ccc1eb3c06e54421cd6b5d16742b3c5752f20fb014811b9d57d8f6b077b4f633a156e90f308606ec36d8249a582e2aafe07ec7720dd563f8ad9c558dee1b5656723b3534a190cdea439635834e3b36eefc9e02ec2117222cbc77b1b3cc91c88265f93973020b80651d2ff698fd5c485ad0db28e4f94e427fabf072ebb71e3400a2175c96fb0007a3eb2bd1a30e98483d81bca1233d82aa3aa39000fb57cb8219521d056333764aedd6102d6a28f81edd3acad57194bb42a4cbddc3ab569f9a129d939ea45375308a066871b7f482b383218b2d95a602f2074c6124c559a36436aa028e1f0205a3c4a2ba07501a40ed765e890f591c5ea2a94da4890f0bddc9cca2f23d9de92f8be1d38f56fd413ab5001a4ce4839ed83ad4f72d5b531157af1bace913e5b0face2ac06ec6881177f4677d5a15dcd377a2ce728403571619006cf17178c1fe6f55e792dfbfb734ff90f4ae3d082c6443c3dfe531e7e4c029a2079911d4f77b940860706aa9544fda73efd67d273bf844835178bc71c1b7917f34cb528f50d073cfdc8398ec250d1183a01ca0d9d03883cb6a55ae08b8a4597d3bafba1194a51493a5f2f0f0f313aaaa4ea93085b5cc078474a18f138f2f8786636ed3c28ba17d3a01e6fb1e850cb0ce43a4b595b05bd894b587e5fc0fff2581f630250bfc6db8ae39873fdca59e28d9c536b5708a8dffe5762d3a2a00bd3a553a1c3652b1b1cdd594fc469319711cb21d87ba7e0b0c835dfebb15052a10cfec785b91007014c2995c6e98acaa2e934193be4b27fa7d6ce6975afff554a1eb2df714bb7e023ea1e1d704bb8d207d966e6e04f1d3208bc36787327f624818960001703d332fd872944fe739a043052c21f88032ea46dc8fc7176a1db4cc1cd84ddc97a086be8a3b9c0a3e9a4cdb6f5d42775b99d43218d8f08f2a6153a955bafcd1b06ce179fb06e0513264f8af6231b934bcabf9ade8a6c9379cd4a8a76c43f628e427ab26d4da486beb210e8887b16e77ccf2c27ef4023a56e5fd198d097c21295a5b4b8ebcc0bca29058f52e86e44a88b2f5956fe3f32b3630640f25d36b661c3b8f2b795cbe243c4a92156906d333ae973cdb465d82841da392f335731aae48ae4cb2af5cdf68824056d601af841232a350fdcc0cb62d54660e2b869091dff6dc1948f7632871bc9b2ca0bd2b01d05cfdb861c995970f23a26021e0d3d7e26eec7e551a19a32532829cdb661f525374cefc7105a32d10d17f113b0ae4f3a0f8070341e127576d2b1e2fefc4367d85c23da59447dc8119a824a8e3ce6af000dc55317511354c32f1966c449f168c4d8e733a3158e89a13eebaad80f20ed3e961fd8f5775ea8b5aca13dc42bf6786921f9843b2017080e4ec68a9793f77a645d028a650d4ef1bceffbd0552ecd2743ebed3487e081c3c76ea5723387d4d71fb71fdfcc9f5eb0477d7bb71daedfe5d38b34cd2fd3593d5af30aea324743a3af38ca51b28a1874f3c9c36a8448b954968462c6897527e53790596b1a5ebe40b1569478bd6a06b0304945530f68e3c41b6bf9b93b42584bfbbb337d623acf3eb49500cd23cba3e28b90941935abe9d4b0a65c0dabc784e205d80b899067d10e377881c7ac1b7a9c742412159d6e260724c81c4c51711837e46b54283b727e3f9875a9e0bcc5e53e687851e08d4c42dbb645bcedc2db8cce16099fc1b9c721337610eba0bc778e590701c602abb2aaa303a3b07a86737d15292760fe91e2549a5edec9a0419cd06cae5500e46f3dd82d8b76997b02b5539d8c492a275a50a2c4a143b637d2a255f9ece6751e5e4a55bbbc12ca57ce2d9ad7cde37de489ae7652ebc4540ff6248971313aa508ef649dee241ce5995f58cd445c9abebe963859b59ce50571129fe57319c6134c99193b2542095dc82ca36573b6b36f0e06aac77d433a5d03be70e470151d4241e1d497f1944ca56cbcb9fdd66ad2215b61623a0a6d18cd40504410e8a1b4a49160234ef3a97b4eef95f8e0fcf77b584f2ceb4bfd7924c8bf8e85f55d5e00dca38a81ca8be009dcd93edcc957db239621cfc257c705d2f1c9bfb30c3e88a63d00d77c952ad66cb1b21df22167844f4dabc073f7e77197baf76a67b01cdff95831cd8029610b387ff2c9c553ac9172f115b57ca6ef7b0796e124f0ab68c29ea0aed31901ceece19a13b8c30aa7712313280548ef3f509717ff660a38b2beeac8e08eb3c8b4f9fc92ad6177a0e8a1c4463b46653b67b0cab0aaa3f0f28b4382136f66fcc8b3b0edfc285a5fa0d0b1faecc7ef5e05f90a16e38b75616342eee932b3e2408c6bb03a290d19e79500102b8976669fe953db00430a40b7f58a2f848946871bae1d6665bbd416abf7f74adaae9f42a75008921b31bf9c8143b173e899afcc0a887951f53705e7194416c07ccedb1a00d497cdcc4213ff49b8695a79d6583789b5efe16cfd2ae1cc03ef2fa65c824338d181eca7f69fdf6dde0251dce1c85005b0e1c341a0bbbd10a1f0d6ebfa5d64cbf1478d12b1cbb38a2f2cd8862e888c2b040f45f7b420df93c8cc64920aa4d5169e691da11610221b16397cea2f01625629c908039a02afd1c2c2474d1ff13ac543671ce7a615819d4dc8bd8d65db69138c9f7809d4c9c4373a82fd71acdb0c348ab2193ac444888d105b08e4656f16efc703145ef6eeb3508a7ef5a423caa000deda813f03157d671850ed839044d25743847b977309d3aa5d26de693738bca6aa50e348d500f6c7c05ad9ff98e541c69ca40c37cb83cb910d1b061539bda88287b5ce0cdcaf7b0ba2c96c9cc1d8ebca2cd244a482e501c124bc0b5cbdb20a40f1699fef6c7970bf3a3d040fbd9826de9eafb3821bb5fca73e9a6c8435ce485e71fcd76516e78e6ee1163eacde9b89804c9ce745087f32bfb5269840345ae93783d003026e821a7741f58b18c76b8a3bc11a4e61cb993a7722e11cf52bf07368a193b13bd5d1ab84d75b67c7ea70bf8d96a8676cf79c8a69f27a7937af275d6e45a85095df4ec7f41ba8532eda538fd237e7b0cb0f118904be331b7c10582db4fa9e7fa4fd51e661896cdbd1f97c71c62f28b9006460ecd3e0aba237021b6ad93ae68ccdc2938d399b397045da640bc5d71beea1aa32fc5404547bfce6d98b4781010684a18c3308db6eaefeefa2c44dda11d02342e05e1193ce2732512b059c678e7b6e1c946e4bc4acf661cba131eaa2aafc09b0f178790969227bb378602448df69eeb654957ee154d512d0f7bb18cb57d0d996fed206ffb60c3da05a319bbf84409ae1354f1ebbf6c986a20ee654bea8dcf747610157c15522fc8a48e04f360d9dd73fcf01a7af134241b16f3a2ae70e9f0754b07cc80897353cd3bcf2db46ebe048247a43a6553aedb881813d07ef09956e4175aaf4202c81733f2effac6cafa64231df9b9728ce1a6f84fd4578311a3eb090192258c265b6440f275d5f01b95e79ea676ff6a45d66eb5e2c1a0857c11952b323695249d33203e63e925fb0998743a09a3741425931905fa5f114cd8eb3e94d1ce69d3105835736dd451b03e0af2416f08813ad5229031bf38139fce37cd8a07e2086127d3892836bcc3d45ff34bf9ff2e8ca2fc8bbc8058d30f4806ff2a56fcfbda9689ab06a4e92ce232175c66abe29cff1543d4843ceeb86b0d274a3d40d7a0473adfe89331aca916910b4c2b9e3fda405b5207cfaba87091b7da21ee8fc15ab714d0931715a7bdc7b8e6cb821c3f71b93cd02b8717af82e70ec68b258de1b092ed05b27c9904ef5d704ee1536b0ae8d080654993c62a76d7d99490ca80602a408d2550a905e8c74081eb9786d4c7c7efeeba68db0142d5c7e2eb38c5b1655029bcd97286a17dced9b367f4039f9f977d507790470f1f2521ef748cfe6819abb642c922fbb4eb8b8ece6700b214b9dee26c44c9bf3ae8f14cc9d6935deda3c24de69c67f0885a87c89996c47c7b3e27850ac71c2bc8c6beb038ba55cb872c1d5871fb4a4d63f148f0dd9947471b55f7d0f4ab907302e016b503c8db2e7fdc453dac8dd1fa8ed8586c621b92fd3d27d82af1962e7f305f80c3f4a72c701ddac1665cfb06df51383fa6f0c2ab8429db51fbc831fd379a6a8542d1005077a94f19394cecf1e5f33983044f369cc6279aebac42230584872aab9a637a502d6b62d620430999f2be02aef046206da97f8c2ca327144e4c41c67d3372be3378ab3c7f8208fa06eff8bc48d19f28241778d89e493faee1790e678076c6730142b0049cc6646640c5ea8ed70f20f5cbf75ba7c9065196c5f137353ec92642c372c3e3b6561ff5505adca1e51292306930702034432777029e03573e955bd380f02c01549901503d98161cf941bc8007acff6c676687f7a166bcf608432ecd40a43385fef7d21f0f66df289c06688eac5250b2ead93abea933a839253964d90b7620983cd85909ceab81ed54c85c02600aab1b4602087522ec11491ce1c89eea4e3a6197a45fb783514292acf061832bbc57cf024bb8c414793d4d75a221c5e414ca0996c3acd1363f6b4029e43fb916509df5a61b145288c2756eb9e336f502b018b7c29e08feed5d431e550dbe4d28afc5b5bad9e2c885ae00d46f0ed0d74b0a6c94a19b3be6b2931455b7d3a6e76abf1738c7efebcd142728a61f8ab712c70a0ec8bd230c328cc9240cd79fbe2ee269daa655c4f70a3c15330d51bfb34f7e99457a9e9f448a84e7bd6c3ed7cfcb9a965827eac0ce27055e6a308e158c36799d5bd2ca75ab95a0d5259d73e5a1659a2cd7e1104b37cb77eb15385df4096ebfff96f9cb0f09fcea7ba4c6fe2ffca5e815a0ff4ecdfb9e9ba47c4c47c4f4a058a83f1729d326666ac2840f681fa8338e37fba72caee24a7871e695d3ed13734d7f9d536a2bca7c27900ba1381b6cb6947c2f023356b474163b9d3a89d72f90a56bfad6187ebce629cf83a4f68d12d700ca8637ea2e39c67ee8e764f1ea0f9e68569cc8ba33c54b7865323f2bdc603ddc0b466eda9c39e8b7620d3b948f7d469e27cc50d9b4ad541d3c619b5e701f903026b8d189097b82c98f56e6f92c3f3050c6d296fc683ca81f3a57e017b1167a0203248581dec83bbd590c8ea82b1e03861af6c3abb739f086495e35 -MD = a4245a5f76f6228113344929db4ea36401f1b48ecde3714ea7e9f90132f08658457e3b90d935c5e400da23671ab42ca836f0b070609d4dd94480b24531026eff - -Len = 69928 -Msg = dde88aca45102cd4960f969e5b94cceed52a3a4ff05f495975262f32817b0b5536453192b080c2563b9b812dc31fe1858c9263b5239b1e3e94679f50dd4af490a3aa0418241922bf6dc1e19bcc0529c589658a5cd1a2d1cdf323d951cf98a4b78addaa638721719793475ef1608ccb35356b5a4de3be888efb25853d3eab435255a7cc7bc3e1da6417f6a13666fef05ef86b788f42346b0a14344a1d14cdf8e96bd01269bea183b060965272c6a1bfc63b2f8f2ad44fa4c8a717d0f83843eb053420233462a99402d6ef19ae68be61f7647d4527835658501a97c0d69258452d185fa8e4954036e3e1c89cf1349cfd79dd1e428d3690b22bd77cc2bf0a532eea7f54488241af90dae9eb86431285bcd20cda2f64d546d7e0448e7dbc887bcdc3d1c8ac154d3fcc6f561e7daceabfc68c5b78b4b547c1f2f7cb949ad4f41a4b4076837ca5a1350f2a902a2935a493422e31c27887764629f9d358c0103676cfe9d74d5f3b25dc8494ffd734e528495841f57e24e24920a46dc3a0987636d782475aeefdddc17b50340cec43c55e29324c11755fcea8958cdb0535ca11dd878ce1682dff965d599e921d3301db2e7bf5d7ec6fd2547bef09cb00dffde611cd143f6ad30d6be1bf94379c7213318186cc6bee34257baa7442c61c65d9ffbbf042eac6a8ce6635f55aaaef7224cf3d93dd8f7f8bff4c1e6d6053c1910863c4393f69e674eb8e4143197380fbdabb4cea50cb073d08cdbd218afb57292f1a12f0334430ff0bebeef1f91bb5d5ddff94d34ea7ee13e90870dae94546f6f92d8f5d46040e11d78622462129f8c7d6a3ff96ffac9cd24a0520dea5b9f7c00ba321c79e30e771f766c68bba25b09a6dad747a8a617a45d2cbb377e5dfd04f1084b278665022e81293c309eb9844164927dac8174eee332a6213ead1403a6aaed829b6c4ed293ed016ff05dd091e0313181bc9d0fc6163fad2268293639edb8da86ecae08e633bdbf664cab700a52972891ec2dbf23c9ee923d68650d0626856fb69fce3bb38a6d83bd99fa20541500f81cbfe60b8e5ac9f5e093d3310f0dab1da0293f5fc104972ee45cbc6a15a3f91080ac488d7c655c58ba9f061aaaef8454c21d93dda53ea4f1692974a5b58bfa126c35b7ad6456103b09de80526068cbb59ae14e4dc695217bba74b57bca498e7e4de0c5f3dcc9700d7cd6a450d5f5cba09918d118bbb4973e56c2f144ba4920a49431f5f95c2c0650721c149e62032eb65b28ced6daf970b9dc98aaa90c174b35edbdca1658fa4d94981343a39b3d4f674f958a00cae0386eaa6a640136308892a8c8a4e359a0b05a4d50a408f7f0a823f4f3b51f021568cd5ebc9ff5df31435b53f738d8e4dbd9020058c826eec9e37cc9a7b299f6e58c765803c0ff5d7615e07dddd87f60f8123c5f90229616256bf25c4614fa3ffd1dca24d47976379b7ad294c1164f74921669c9ab45ced49fcbf52b335eb843a8976943b31bf3040deca2276574b19616300accee9449c0956e259513f27c889483b443044b1e3939d5cfa41f664e3c0109afd7eea09f50a2dcd4484c629f953d5d3b915c69204dcbd0bb99738d8ddcef0db989300d280b5482b1b3614199efff9e7fbd3008d1b820781685f63cf8ff3ca6c84f371c7c67071a2e44e6f2040f77c1f13503ac7b1ed40630f81c070829867f4c98885124ea46edaa9b4206666a226220876bc6b4d84335cb4e497e43d23901c703886d8a0ba087d71506f129868be99e22ccd9f78b1a7126172305348fe0b8c80edba4445180730450aa34c5fb10e2baa59b68bb9dc632d1d12d2e42c8fa0eb018e6b7bc428339d2cca063e41e5dc8167e7c059986b3056f1acc7bf704019e2fc03dfa8a551546c2e78de0dc86cf14221bd302e9dc7d635e329550d9c783d1877345ef171fa314553fc74e47caf1517e0c3513551581d71fe6fc5f6399ed3367d09327eaf8d93cea43e10e9e4140fa8ade16a933b86cdb247675fa1ce1ca4e3136aa278e77142b22826fa448804a99c8fffc273e4baada2c8f96a37e35978c8433ff507a20e0697e79d791ef0e8a99c8f05a2fbd25a86e7880e30df00bd168c1470745266cca726ea89d69fa526d84fb4db52538fd020298f8cf7c2aeb048d88fe56782be13ec0638d45aee2e28fe5e066a1aa4a3824311e65d0807749ad454ba8616be2f4b9edfd9644a341354e3708d98421694dab7469467abd7dbe383a79f3cc82f43dc855bd623f198dd144e2e524e11d0ec3e4371a194275a6af31d7a46edc6fd812e692036f7964313cf093f5c75d0fb3218b13a16cac6b7a9336a74b582594f71a912d601ca805c3decda4db3f3c8beefcfc748faf3ce172009323ef6e4c74d9cb648264083f80ce3d58afd60b23e42aacb4e4455f688a158de3c7f11f9582189bbd2b8fa0a467b8ef1e1f96a987daeeb740dd52fbb3c7ed81b51e00cab56f0c02279333747b2d0c5a8a6e9d98fcc2b3b32cea4912a32d528263909f1e107e5ca51053fff2284341162a374b67e72e1206d5759822bb1cfd169bca1c883b5252eb23e855b8303cef9879e43084cb8f7248d719b0ba602945a4aa1519778a6db74abebad525278c7057f60fed7e3e696cffae41233836e4b4b33b2c068aa222d25a6d65fed772b46bdb3b14c2b2a44e5a81c786702aa3b1d2d8bb59642007343c80ac54233da6474aa8958d50d09190d375cf5428003b13186ba737d2e62e046e53f81fe2c636b78536a1f428468af350420224ab6771ab0e128b41b32b8b05e05add23ce0fb877b40bfcc3b992f4c8698d1c828abecbcc1c33d401859ea2cb2afbc7fa4588802a5faee2867534639287ad8af84674be18db661de1da8e19c6b6bd452dd9bf3221d0861fb6fba96be42329b9f04f37dcf3b41fc58d2298348b0c15d1190b125300cf27e0dfad60522fc498460535669cef4ed7674dee3b977aa3abf8564a305739941af25b1b07caf7f46fab91798f628e04037fbeade6c72815d627602787a35ed7c5b0d3c4fe4abf3b16474f9c20e2326c4a7b49d2382825cb2aeac11386ebc2f2be98b42bb235f80132c57a0db9809ef012e69a0b9e5ed63c20cee3aebc85288d7c3686bfd23134cf2b92bb5eb7b20627e35e09aa87bfbc014e205259a703d2007506b611cca0f82d973b7dffba1b1a8c322e234f92ef6983199ba794d4dc51e43f85ec920029a484dc2c5c711f103e8585f3716b3e424169f9ad3de0a4934ab1323074e12b2fdc6d80e1b143853604bc652a7e7de87cf5fe84c18fedb4bd0ee00393096f9c2812601bf826f75af0ef99465fa4f83fe3d9e9316537ec73ce31091a29f49dd196b8d503dc280d2ed56194afff7f8a831b6f929624a09d602b3384fc71d10c6a106254ef1a3ee56f680d370876887580884983197c6451186898fc00e7193bd4199168241ed6209b0d4518f6713a7986beea4331c8fda7fb0ac3d6ee06579c9e16b8875966783f4049ab82e06c0fe72423b45b85b6d7129696669e1a6bf6af369c5a2ad59dbfa1eda1933d6cc3934ed75b4a247bb28b21597fd3b9fc6481042c2ef8cb4f00f6e901b9ae70e2145f211eca1e468a487444d23badc32aac810bed2316f12c5cb8850ad65ff5e6dabe0e7904a32a37e54d0d9f6e57422b807156f82d3734d3ed9f0687ac2a14e1834a57647f6b581b255fdbff7c62af55accc55ebb1cbfefc5004ddf69f9f6678aa8e9c7faee9589a65374090da42735f7e0c89263567c80c10747be615125302ccf56e0927bf944c315dcbf22c99369f60cc71363c7d1869ab7870c4c135632647092cbf5e309387165dee71d7b951ac1166aeaa4b7e78bb7d8b5d11188b3f39b5545900d6eefef1909228be50355cfbfc6581e0d70e5168232791698f561fd3a441835c066d0f121ca4fb264a9fc1058e63ab78539f4b0628c79e2c9a58bd8a706b2c4f811d7c4f3700d6581b4b266f43cb7bef6593cdfbfaf603d8cdf570a4c63bd449cb929f2f5c306ab246e9e57fb92783a4719e42e0264d42fc9eaed1d9022debe94a4f103918bdf8c351de96dd5ae243360c1152291717dc1680f7699da0dbf39c81a557d2e8f43109d0aba30eb5864b12999f645d59e05fa51961a0494ea08bd20657dea3398d840427d3a27a35ae0bd8ae8b01e36b511e36cc700e82582615384cc92d10a6e46230dbd91da667b3f5e6bf86a351d7c4c82a2e951ccf59d7001dc96bcbb1ad936c1e614e6d19d822a9db40f4d13f0bd5be1d94634396c03e0d1100c222fcba15023b6c86195ae3848804d76813f183ee908fa24d2b6f27b57cb0876edb5858d3b5063222cad036542121e752d41fec89cfdeecc53cbefce7df6ac1c44d5b066a050d76a6ca102d1bf580f5379a209221cca9b86de00cbc4fc5ae5455018b4f4262cf8e84cfa1543685c095a8ee9a0161277eb9a9bdeee2579ff993a3905faff76ebb0e4f23fa384e525f2d0949e2d6a260ac54fb3ecc0b99feeb1442625e84f3795e6a586f8145dddbbb4feb24a17e7ff8d10ee4eb2aa48132e16a93ffee7ab1233827431adcf93f827352c1174c6554607b6bf93b9129980c7aeb1ae1a60ddafcc6b991ae73ef1df705fa2d9a4a27ca2819e0aab8861758cc263a69801b9abb5688b5c6b2dc83e3a9e18a731621323bc02b017bea800a4df261cce28395cdecd0fc9044908d541b0ba4a84413781143b92d42df39f55ee22fbc173834caf3e9eca0ddbdeffcdc3eacadc8232aa5415c839f29672f7ca1bfd4939dbd4c21c92d1a03f27529a198c90d9b6e72c44f4ef0b00f2986437c6f217196e4e412109a40d9a4831cd611f6449ecc0fb568bc96aabeebc7cf1e8b13c19724716f2f3e03afbbf0e4176dd4813bd0de208d9093c4d510c398a4091f2c1aa5dac7a10bf081d42177a9f7595fc6095430454dd46b362a4614f097abaf34973e185c1c30ee9158baa7492f311a41579970e2889c9976f4df5e743c6ec1b9c1c06ba343267ebe97e81e56318daa6f8100fe8cc051a513df3d0ea7e4dadd2814cd4341b86527663c2a3b35b0b776cd203b67a887ac147943ffb3e03368880c2ab54d9bee657f2490018c8c0f5705c6af991ada41046e33bd97dcd1aaa028d25e28d92647bffc764dfe90adafd4ee08a9baa6767ee328cfc685e7d0ad1a56273998748566dd15d7c081d63f34c985ff89108911b3d0da99d94a6381dd2f86573774be1dde3561d5922bcba5109d6417d82b31406245da4e7075ee599d683ffef25e0473f05146dc2d6cff63d5d91ede117b4d670ccace4a2668e6cc704cf98ad4b4e60c4fc95b680cc5c01ff704fcdecf712c1a35c81d1965c3cb5ef85639977909e16b6f061615cab6ec2df699b4866cad5bce6fd65d38a8f72a75980c768139cd74f5b08fed41b1c0a212570fac6163a06ae80d7df5248a7372c4c1e846f491801f5fd6df67988c63a0618aff6afc5edab81ba1177b6964d942b12872115e3ac25efe247d1b76a520559014b166c3b8bcf1cdcd4b5673d298f8df1e226c1a7ff4a2552bd15f588677402286fe26340bd77672e4722ce05e2333832571cdd5fba787f97f74c9dabae8dead541e3fd9c2bad4af7934551b52085151c108ad0d184b7e5f81efd169bce5af750e9a0a2167c78ad81dfa659178d8f0cf932f802c606103fbc5ab1c82070e312e090a2bb7858e1781254ce4ff1cf58060fe8eedb05e88a752cd2ef1b023c2f24cf5e6fae8869ee93f31a44990c8ee8e9a858f5c358d12e6f90af3f7708d94613637a91e50f54a9e66c5890a13073489f0aaa94228569031630182944fcf030c9e50d90c6d4c41a5ac4363bcd24257f0e7d07546055591150533636eaa428f52c9c3ef2bba15f48d545ddcc87b24d95204b97bce5904960064231edd1c82a9e26d236412b3ccd3b403575cb36a09393bbba815419fee0f9214630d761329e339ecd1c047e6eb7fb84dd25c141b79e80c914eea46566c7e387a55b7a03a92aba7bd719c41bffc5918785163512bf1764319f05352f92a62622a7db601df4793da73655086cb79e04337570af1080a547dba4ef8ee04824cbd896d81119dc31c30932f758d85eeb5c6ff45ab7a3c2f132af6ad337e151e9d893b879145d29fb558915283cc7bb53a1224bfcd6334ca32c953bdab999759e583a57e7f053a37efa0f250f3da1977fdc36c37f9328e7623e755d2b9b6f7beb50b5b94a30611163ba83acd5e2cfba161592a20b77eb5bd66f3719f065cd2d77caec26c959f13d519dcdf0a1b4b7ecc1521e30c709e270a8c7c3b74ea01a51ebcdc7e88cf56aedf1acd63a9c3ac2f5289dc2b7dcd176ed804e017f6fd3bdb0ee622e46bc8b34eaebee84d1edfc589cf2fd667d72570f9c050ddab97b8620122990098781a4b7fce66cc0ffbe82e2aac87bf2cbaf241643e00b34ac9941aa3f435f40f402c75aea8a2c730a3455c6e8511d4ee9bebff1abb950f9a1f28dc3fee5d7bbd5687c887e8038833b79fc6e1b36ed631fc5b00a9c36e50fe0aef1d318b7016272da4ca67e7098dadab5ff400e1ef317b5ed80c8de02d160b1f4f6425660e41e1281bd1db301525e2f0fe7a688b23653f25db69238c31cd25cec22797e8988d5fe855955e5dc70f981b03a07509abe00203edad27322cf4f28c000de58d9f6707f0da8b6dca9f9921ac083cb2f7d930485b774ef57c6f1be5f9515daaef935d8db4131a95f0ff61040664759ed03be4969f10d51ac588a064796ebd646904df35a4a7c9438b66e5d3cca101b52d546b516132c603a7fa31128e80938e94747ab465011e02d47696056156578259b3332d3465a84c9e442c64cb6f7695fc62ae7e57a79f6076af001d56fcfd830fc8da7e7b21e25202e720dfa263ed270b4fe8f81f13b3c8dc6092803ffd5a339a15dfb9b7e00ab080638ce796065dae4bacc8a60dddf1c8904bfbd26eeff420932ab1837d3887e49149ef1128df4e8827f9bc2ca65edfdc1cb17a88763d51b68567de503d83f06abffab5f0dd5736613ac731e09b1ee47ffc41bd16e87e0971eb5dd4a46b6acabf67067feb25f6bbb5fe85c8664ea6a610997d2212282a71ef2f8d22f4a9458d6f10edbb74854644f2edc5fe22238e7b5a7eb447eed7bb219adc7647c559bc9ed65820e7319dbe48a482f831a8cc2efaaa3687ad1159a8aee17c99c19b0f2895a1a7308186b1d75d4758ad117eab109a8c4b77b03e309b607f8a781efa3c32083d88ad28f87429e957c954fbf842cbe17d1804ffa9fedbeca18091ce4753314d2676f73c1b571e83526f707fba15c9460936affa091712ba13f9573e1706cefad8ec9f3953dd2d91c3b5901b48a6915e9d21e92dc01ba84f334f691cfda96387e16405bf2668efbb2836244d0887ac91b5544109536f35128c0d27b94fcd878acc87db2c279cdd660c5bbd839e1b7375ee68382b579421ba8abd23b1a1e5b369f6a2800ecbeb6f08ccb0bc5d5dd49e71b4b83ef2312cf68dabd9dd7478847fabfc4e94e587d72d3a05bfb138ec65861b84ded5fc749c3c328bddc5a0581c34d74a066a3eefe2807023e33cb4ae20b2e9fb469da896546b1f97536c93b52f7b526c44a07968801121c3c5af5f37b8bd536489e6951b07fbcb6ab542ed1440cbc3df93b823865257e541c189770d700dee7d135130770976bc528dd90ae9d2aea2107e11dbcdbbbd314a817bba93e91d21916d5e193eeb6468fb47af8bca578c63ab6e6df0a33ec97c3a6fc6886fa663733e027d9dd7202d67c16d36de2a61fd8f1ceefd10ab5df54c8df72a7ef52a8989ff7d306ce44a6a2f5188ff708e647a8ac16a7f9a5a8bd918d1b1f7fcc8d7f7ac423806d4cabc8336080569e16ae16bfd457b361c156add77921abf805f412670a2cd61840f1910f2617d26bf546b7a4d259be114705d8adf4bbbf1a82cf8ae6d9d97f0e935c28c0b0a5a9658bf650df0ce46e0f20fe659b66af03ee2c660e8099f320572b35b5ce65f28395c1060af9ecc06b6532897d2937c61e7be900c7bbb24264fcf2c362bfacc5090180bd0c79d9b45e1b67ed48e0d0c8b9c9a2e6dd228d8ef004cf50551defe8e2b3ae657fe73b8aef37a674ed47977d7be14061773a909f6f77a922b66f9521b7b334448acc7908c5c3d66495e7f5ad0dcaa9b7bd8d243d875d6a82ae3e06393007fba256aefdf789c6e1066746531f168cc730d8a2b22fe0bff9b86511a9f8f4b9eac90a182e1ee249aea28cee179c3f308016f001a03e23a43e0c0270e825acd1e800cf8f7447795325802b67abec30bdbeaf2c335732f81521c6ade32a8aff55df8ecd9d3738f5ec2ee76d3775d7903b6845b5bf40d306198a2d90f3d8ed964fb6bc2bc9dfba001cb1217ae8df2507b3661eb32dc2e8f6b8618ad027581718c655d2129bd4953fec967479024f9d3f2ca0824d06443b6ffa8e25980813d02ec3a418a99c7f915c63c529920b2f08ddaefdbbabd030921ae8f9460e1d71df804d8ad519534676ff8a2787ef8de62e8c416810f616edb69f898b355aeedb0eb56cf2538949920bcf67a2d8b50fdcd7f2eec6c8565de36fa5e62a39a503b7237628c1d82204cc1975051f620f1a79cbb7bc002cf22f7a84d405bf9c17e56ee76a8ae0ad0b0e5a689869876f233525d184b4fe84f3131abfd6f033a4d71b69223a99371a6defa6c0e19dc04519e848b301dca81880922be650af6c9a0e2d0f9c8d5eae66702d16e9f8a8b42c1abb4a37d53ee62fc23315c2ed4854c6e3a4c71c0cdf2edb3b5214aa8492496e4e379326a8e2a112e17e401b52c5d26f7f06fb6c5f269dbff7e607cd2e636952dce38b4724cebf0a04fb15b92a2dcdde09de12522d3be55bcb6f57189d24fb1fec479b64ef0c2a5d5333fa631b892f5caab174971e24ecf7e0776b5479dde71ea8ec2943b1a4c853f7ad58e3cde0df2f8a098803dbeb9cdb5e85ad496c94159736599fad139c833618f198ffea3ac59fd06db85d0c98db4e6c2284be1c536dd1be16636abcfe424cdd88208017a0c9f6a5666c6f5931939932d4587c3121d61669acdf4256d2eddf6ff95a2dfe18d37a307b0aff68c0ab05d926924c54073bac5ea279fd861e6b35f6ccacd047adcb759a34fbd6e44c0bd8899d98f42d0b81dcc6809b62f6eca696998a802f9a64992d0a19a7bc73de9b5a69c3d33c633891eec9cfac3b4e43854c80ba3d149d4725eba9b37678bd7d43d5a21fabee9f93532a8e16144e352cf09ed4e44b45fb5d57f69e89d1d46b31eb8f5b3989d08826afd83edd3a6454adcfd3bd90128a5aae189812231e9625027bd1bd9ad3acc7f88e3f00ad884453d10a346247faad63434e172d0ac68792f9dbe3f0c9f3480311d6a8fd0c65b8d99d8a09ec906b74bd23e3bc16c5326f5b1df30d1b4e4f6ce57a715b5d8539868e1b359a82f4cda91056bdcff6dcc9162877ab9767b251e2143a45a0479d6d771c52f42e4dfa881206e5c698f4d8f243a00decc8fb7c5f7139593cbfe3de6753284ab00e752a047845d7e45e394017c06be99cea0034e3e0fce03dff5acf90e25d0c4f83210ca9a27534016bed9c9f533213a5439d6344f804d62faad4f850eb609fbbd37929e05a3f0504053675f2c59d91ed1cfb90ea81fa43fc0678e21038dc0bda46a6080f664b51d5753f5178dd536d5ebc41433d43852f8b5c6f14368f77599626d031a08f40205c032ebb9965fdafdf6d9804a5054ea3c4f3e1162cb9d990d5b91e2df99dc67a81f62c38bd23425d5775285c8a91fda68f15f571587eabb88149b983845887682c9860524ce1cb81b01d18d254ad3941d408d3ac24a595da811cc9bba78828f1452ff390ae653f22d1ad91ef6b22aa7b7b15a44ff7f83efcbd7a755eccf4541eb4040c7a4b774749a26dba3937b7f95c6c8490e3383d4f291dade5f35a65b1f6615fd4998be18bfd0ba4bc3a2136ceec909dbeef513d6f6689fc4202b9a3e78134877374d76ab246f49cbe7a8f65d034cda857fba9c047bde9aeb41350769fc716c6109495d9652c459be980ea0ea83b0cec828fa88e7f35250c62af89a681d1ed62d37f2ff74bb8e6ea64d49bf7fe0936b26834b66ebed6255e755dcbfa34a6a3a4e5bf0b8c0df1bfd158fe08e979a7314230713b29aca9d2ec14a67f3b614e1ed46edc936052e0b997ed869babc11ce7e403cf9f87f2b512fd68110b31afd2483a955c2d3ac38bba864af5bb077f703ee009d54a503803ceda9926d8a4c739071e83c943e307fcabe498d3cfc35bac207d690ba54c2599efccce6d4e5c508b45c760aa3c24c73b75fafea641a8fcd774044cf9164362815b192f6fd520f3d0e97e538880c3ab4efe10a5f8787e0bf922bdd92806fc97c3fc09e5b3d6ba5811db8b84ea77885a3f306eb550dc0d2f1b11f0391fde406b65b8e618c1b7f0265603361c58893d7d16f25b5537d51c11432be5936604d7867179f6ef22e28b05a549c7435a1ea8bbd92b21ad34cb75587c57e41086e28991ee2683935dbd539f08958520799e93bd92c506e6cf26deadcb7d34d806de1e34e5a7d32cfab20f9986cfb9dc3c71c42b48a75328904e20b83a861e126e625d165de42ee18228899e27dfab9e2cff03ac04b94f9a00ac0320d058eae747d50fe05ec4deda7c878754f4ada38fcfb01ae8cde34465a6a64e8e95dce07e179ffc39f1322a407036d263f421e9d7b0edcf88ab0d78b00aa5cba992fa47006928ecca1c13593be69f32743024c49d541cec34a61f34a4b512401ace9b6994c2d7a73be950b4f267296e2fae9c7e0945a73793c701c0692e53768851a58c63ac16f43360d1838e7a3c503b78735d450af4794e159c6426fdd2359c2402f994ae4d9d5a887e0e36a8409e41968faa762b6d790c98d66804abf544fe4e98f85051e26859693f9c13789d21e80edaacc7307801765998132abf266d55d751d0bf1b3e1ed80bfd764d72bca1d9ea3aad5ea27fd7345fcbafc0c1cc7649c813cb0896c9877e779ee50b1e03e6bb3299f36309e9c4edb35582f03a4e288428c82f544aeb6af4b40c2f7505dbb737ecdec7ffeb1e90495b20d5e0b1164babff5745cabe0d90e2ca2d9cb4aeadddf522f17159d28603f26112efb8ae8ba76956a855937a95c2eec2eb76f0a1df219cdbba399b4589e58dcc151aa1b915036334a3a7d606edc6c3a32d035067db49d4202067eacd8ffdc5a5109cc35b1c2944a13082bceb7b640775da8dfd87071d47f80e4271f100143ff3eabe451b08dfb2a537306db0a9666340dc5a1f89cd679b6b6913553944f2a6be8dc84f8242ee5549a0f710ddde927e0d1ab2ddf694ed78811a22c12dc35fa00fe0020b17301ed7945320cdfa81b201e37cdf5f55c378874309b7db56e523d5edcbb39f623b36dd8f38f2cd90fc8c93cbea28ce2ec4d06fb81e1acb3b1305ef60362533ebcb00124038b73826b6e9ddcc4cd4520afebdd9e84292ba64b3cf9370099ef03b49421bb139b53645179086ee8a2c126fd9076ddc5b69d05a2f476b262c67fdd91bc5a3ea2436ed74874b37398d7837e8bd75d29b52e534a4ed361f8988c8834dab5150f1e280883b6ee098b63b00e8fa12d1b12d104f0fca576357a10308aa2060aecad05adb2d223418506c7d0b4e2f40e1b19b7cef8855d398ba77867199d9a1a3ba8f739105b241bb08643ce2900eaf6e7bec7d0cc8cccb9bf012fa497900d8f9c83417e93772fe9167a45eced81fc83fb628fdeff6b7a635a27b45d9711d6c789bc92d2aebebd1611636cc154bebf11e0b58e3e13b9fcc2e78b85169aab9c5e8dc559c9d4ba323f5bc216fff13f993d122831728bf0aa54e19d304414c5b4b1132e14e8a7c245d13026e2ed658d11721a2b1800ca983995d2ed348a87e8c66bb46742a39a9f6e5849024f0e041fce3d634ea08d7218f10225ec104e868d37eadc01618f1f89f25100d4b9f67f70161b87f3796cf51b8726652a4204733b8fbb047cf00fb91a9837e22ec22b1a268f88e2c9f133e5f8527f1b184830e07c3458c83a8ca9f9d9c6998760e610668ba0f22e22b656a737e978b246a17840b7dc4091da85f2544fe3e24b2b944b0747e103a4ae2759cb62c2afc535cc3f3686de0eebdd8a5d5ad596aeb7df5b3f6ec3c629f0bcc2b1b4f16490be5656fa1451c02050a3e85f7013455b580cb961ff97d6d19cef16f3167c55a82838a03d7cb109014ade4e7d26718674a6242d574c2c799703b5a2a2426bfc727d4d568dd22d3f4e44dd2b4af088c0871cc63583d70a54e6bf90e423db38ef6c3814d84fb71ed943d930fd2d60c18a0f4663507c22a9cf4d3b115a1c437b9511d31fa40 -MD = 2529d5d0f4625ae701397a41b5184bbd45b840c3fee6652a467ff1a49c622604991157b16393136cd123a515e4a0412dd2bf2b3227dffb652e11a6304523c31d - -Len = 70720 -Msg = de4fbfd553cdf37019f25afa82dc6b9970f4bb1ebbc37f80d3084c88a70722cdc523a9e3c2afbad0dc0221bfdec9a2f944a23a10a0e6a65d3cc52aad01998b3897745dd3cefb85663d78f69f292abee8a8e0469705c6d565677e5722ae725da79e69640b3f595a1a837c5e022aa6c850e3d6691bb40b147f9b595c4e763ba001202b45f5dd7043d4f838e350aae6c7183ead2a04735e6993227ec298209c5c3066e188f76fe9477ce2d10cf27192c328018d11bb0b67de8a4216116a763c9a1bb8b4b67bbf6b6efa8a72614e4751c468749da7a644cd7a4a4449cf2b3ec462aa5dcc56e8939fc13638416bcdf4cbd3c0de06732ee53845bc703e864241dbbac59f50f0a6b42d47183466b1d73fa9f71889effebbb85248c80d1ebd19472aac54c4690d1deabc0989c50abcd5f1933958bb81ceb683c08a576510fd1718593f3f153e34b5fcf40d6f3455122dd2309f68bde46d850f2d134fbe3dcda47b0f7b6edaf8edd6b47f5db4ca6e3d49aa293430d73f6392243fec9a61cdb52839f469ca5bbec0e8d802013ecc7ec58f4125fd9850ba3644899e1c1e96e73d0b1ab11039dfb936533128fff785ac30695fcd0489727f700208f3abc5a4b3eeb6e6ee79a4b010d67f879661c53c21083ecbc950e983b3983667e6a275d55a4f8f6552aaf414ec28d4a2f72f923804d4764ec0e9a2cc8137476f1e08186f04e9ff5f86ad0f5475b5bb49f16f45c27e1d79b05bd89a950fd49de844e595bbd8426f9b328adfb8d2049a462c2bc622b76aaeb94124bb2685f7a09aff42d401ffe445e2fd474b872c9eda5f516afda0d6437f301ad5ebc60c29b84df826bd89a157ebfc8fee3a0baa09e45d0835d284043053df90f414beccf04dc8d799389ae421c7b19186968a75cf1f07f8932d1568ba938c49871d57ecd7c7d443a32d7df3cc43c9ab18464db477f227ca8cf69c2b68a500ed99eed694638e39e44d847bf4e0c50b84ab329c908ac7832628156174c3f203252f6f86ee1e0abf639e25da10e3b740c54742bf318f05e5b27072ac6c52e25d995388ae1f8fa32d689ff8e26e5f803015f45efdbe0e1313196bf5c53a9dded5f00c2195523ec24d9a56e6dd37db88a31dbb6e9f60905bd5012187f3082c4c34d2632284adb4cde5a2cdd51192e0376185a35aed3e9c44f5139b0e80fb889542e95e73c358782ebe270caec7a8f5f531f4b50a2f81ba3639f6e073b23d3822c7da08fc9a7c124ba0d2195a47a0a22add12f866ad5072996b52f89fd2f6c45a8b5066a651410b8e534bfec0d9a36f3e2b887457afd44dd651d1ec79274db5a455f182572fceea5e9e39c3c7c5d9e599e4fe31c37c34d253b419c3e8fb6b916aef6563f87d4c37224a456e5952698ba3d01b38945d998a795bd285d69478e3131f55117284e27b441f16095dca7ce9c5b68890b09a2bfbb010a53b2a3b9b3007ae6995ab89b93c2be5559bba733988655fed41017b11af619939eccc38fc02ad6448f68dd7f8053f64a92d5a96c9efed94f0546d47742ef2bf38a0a3d3c4e06f089b3cffb5c85be864bbc6247a53a6c31b3cd0de487bfecd4a475f99541b53b464096fe86a51c88eac326e0069003651bc77bd3bc44fa958021032950228e2e53e3b98323fbad39905b72dd6a9f826fd414a236c0417b7fdaf3b2080271415685fd8bfc47c2c057137f20c8e8362fe31705c0b5850fcae2318703240090674a68f89ea8669cee47e0a8a12113f66475413567ce9f026183106566fbef027880795f623604dc9fa2946284845252e88cef0df7f062bbc7c914195dfe2269fd8f43bc6713a7244cfd8b273b4137ddf4906d0a01b974ae763aa91d68a95f295ecd347a2ddfc1e68e9f4171460638ea413667a40588595ce54e4bec179bd9b314d0d82316d8e9a5dd2e63db2541ea1a36c55b8683eb6549ad7a78ffdb3436a9d820bb41c2bd82e4a1215ecf6972afe04df3b50c0d613cf72745bcd334010a7fe1334a50a1fc321572fe8ec873071edf0f1810bef27844e7fb468400a290b9a7f89ef1ca45035bdaeb3c9040f2adab68f2c8db19e39f218e81e37b02b751b8a456ba6e392c6174874261ffe338a4ca00817c80a74154376d63b2ee53d2c2ac17b41c0c07b89520bd40e51a09d5ab1f4843a9add1ac261b07191b6a6e9571f854794a57c07a2cc4ef4f5c9b3f5a2f0fb2a1e6cf43748320ee0aa38bdd7fce11fd1eabcdfdf186f59fc62eefee268f1fa234aa41574b0a0d74c0e1af0ae265ad742ce6fb0abf3227315de284b0db69c3c9646ac0979019255dc43c60816da71f4c2c525b9123bcce567f0df601e93d908ac9bea98ed43efceb9d3a2cdb9220ec0785947c0bdf957f819207b06bc0890a58cd0c889797fa18b0a4618063c0519818d113b8e5435aaf153f664058f1ba95c606daca6c4bc8fd4f8228e7d4a8c7b8029756aeb7ef5ad1b3ffb032540d60c754dfb00b57702a1f1abf16ef889bd1a05720e3c9ee34348bd02b6be2e7741a1387d012b7f3959bf294a3a1f40a1a2df5793631a712c26631ec7affee7db6351ec180795ccb3cad1c5fe86091d3b43b2c0b2fd6a2a01a7e687b46f2c19154402db4595a6648c5cbf0dee5c9456ffa67c86f862959209ccb940f17dae8ccdec9d4b2d34c60e6d187149434428b594d523f28c1c0471ed9fc591a761ee08aa640b85f86b5d94fe04d0c124c62d00a3d8914c96b31e8f5528f0c2fea4525554b332d1cdc3d3bce62bc2bdba6b0b00d3b5acdc40ad4ab3e76e231a1dcd443a74e1fc76d4c3904fce9230842cba2a7dcd765ee9b094f2a74e7947e22d642b81b2f750be37f3fc145d43035fa33cf33f38238ebd0eef7d313051426355f26ff0b5fc15ef1bdb80d53c4521964777cc0dbdc2249e8347531a36fffee2befe775026f83552aa04825812a074713ff51eb0045d07d53723dc29078a61aa8f10ad68acf3972f0cf56c66885ce337b43e52f1b4fb21aa510b7f284cfa5502f1b07802f0f623ce6936a4c746825532cdd8ce9675a55964f987a7ddac57c1310c6740e49908c176e8509443f31ab4a8b34dfc67f162974d5920b912d0aa8c8007bc6ed750325971b1caa2a2372ae7e28d25432ecd3ac3ab965d1e8d5ffba0370b3868a3bd7bd305ed2c38abbcbcd62884e60ab1b435c6c7dbc73e170250e49e3f61971087eb177bc4ffbd2727d769c2c01abbb94c5c86e94ee4817761b340fcccc263e6578a0e1b5dc999df238488f76848bd0e3db6ec59173f5077232b9c9bd9e035ecd4619e2ce115339856ca1b10a5f97878304be05e5f5d11ddf0c0e0c18f4573eba777b0f87768f51d68b10a559eb454bfcd244b414ec82e72727bf5b7167887ac77d42dc5484c463502413d0e7c01b9aabb48134b0b070dfe4e63c1c59501d7f4ed81fbdc7c488ea7cc839c8366680f03a3bf22c1bfa218492f812d323469cd8eb18504853ae5363c6d7e10fc8572be902c925eee9121b51abbdb21481d36cf416ae82e07aaa9a4bc8e3a7fc000a62e1affc8b119aa0d4e3a9a7c864d75f347d4c0b363acf51e41efd6c0d318008dc768c369028931ee4a727569428a67259c105ded8aba43cc759cee17f24cadadf244217e38874f4a1188f4ab3f47185636bde69e8b7abb3aa98d7d47c6a42e911574c10e3d5b2cab0b44be4b63ccb30d7da306ce4e3486f043882c593567acbe9ac14a21f84def98a0707c5198605ed3d9896386ba30cb76ad56a35429df4ebee7f365bf51a5c19a38d2d5c3c54c412fb238a5cdb9b5b3554dbf894089523d1766d2b9f130aac9383b3472abd2d986a9707975ac330c66148d8a86263d09a0547d25efbe7da530fa115cfa10a64c52c97b127b2a0e7e0b3bd481440d2c4ca0fa96b6ae2f20de1d68221216fb2bf0d0183bcb5e4f3351cb52896a68fd40636593184b9f4b029db90bd6206e73480c251d196ec6238acdcde2160e9dfe609516a76bad691a092a2b6a964da980e5e77c607bc15daffb3c3a72e2358919742bdcbcf7a4b5a41ecc9c0dc860702aebcafb6aca8ec8fa6fe4398b55a6d455656dde5c23f82bf22acd347dd6226a7a40fdcac26f9bb20ccc0ff3b4d72b27bb19a3450e5970720b13731a41265b4077cdc812f0d0b0c1eefc038f75d08a2a517915385b01d533f7c30777e122d2992a7a73fb7d57979da7e5083656a88c84216d0be0c981ef15bf20d072e630511e993045acf06b17ef3f716810e0c7f9dd33decc64e24286c16a141834d7ba9e77ced5874ed173f75fbf8769449a9699df8db2a1ed2eac62de008625e53c27824bd1528208a9d900942e0e55fb0d7b343039d3d2a334284a158a5d41ab9edfc542a8907b03ff04fa3794f0725cbfdf91783f27a7ad7c1c080e0e83b2b1834a2f055d76bd665b5cadeffa1409903a2b7960a59867348ef1627097dfc01d76d0883cf8eb8f5a4549e065676261be06c5b48f750d5c5ff31021e42a59b518fcd9978f7fd9380746335d41e3c2c40fa9170aafb76dcc5732df0d11d1d9d7c99fcd25a4fc270194e582ea2a761c78abad87436571a20043d3c8eda093477059e614fa2676bd322aab9e50c82958c6b99a7f265bad93404c5e328a38798bc6ef5916debbf68313f01ff056c4035ef661f6667c397228d49a5c85ad82898e21b4813b990b8361eb0fc9dec6c60c1650cd4ba40da6c949035455281c25cd36cbd0e5ecf2bf253f04ae31d167754d691c2220a1a14bb8de16a3cf85a0ca4d6c0b6a0e8fb37fe405a4f6e032007acd3da18bfec400d04acf55ae54030019101928aa828ea2f2c99b140f5d675a7c957c282e6c77f1dc8404089e6b0a06b91e236bb9cb4f88c1dbe99c2030da3d24ab0cf933f2223e177066779a9d0278537f741cbf713c2c9423d78351e2f1701a19d75cc3182bad2b15dbeacb70531f8e3cf283e3fabb5811a74e13ccfa16bd05e7c3990667fb07bd7b4ca8586e66c3135b87e74ef036d2e3713492b600b0ea8e1bbaf72366fa1378aba2fa6a1fa12c89e71a9228da1463b08973493a7c27c05cbfa3bf429e909b01acc328290a6d2199e592ca9841bdd321f5f1807df7e20718da653a8d9526650386997abcb7336beb5fd9d8c6ac99eaddbf987faaf94b876975eaad2ad5223b24420b374cae59d2265cd604dba310708def4e8de708c907f897196341e6eee30ce700a90078491ef3e57195ffae8a2cd88bfdf35caec4516c48daa3fb4ef025647d6216019c6917f90192d559566fe7679d8cfa3372a42b6e9015b47f9792cbd40d18c776a22385e1b8210a12222769e12ce3e791dcd25ea678b2dff6483b9b039d0a048813de2f5212067d519b1a7aef41ea05a075b4b2bb079a6c88ea525f9a3820155f7501def51829763f47b0e239e3899b88c4b3ee5646b3a35c0441dd40e342412253f65a72d1733c04b05268661aa8f0715238dc1e3be6cb9b1e6fde9ea858d1fa32246b7046ca19c75e66d61eee2f4d82a5a942bcf01c2e6cc144295c8e4a0d0e9cf3d9977d1853b0d856f20b6806fae3476fe9d76d3b12f8732888219d003d8718cb6b90804333e9a68885d38f153fbdc0f39918b82cc067bf83c195de62a98c2f14ea03573401975066561e6c456438969c1926dbd880e02abd9d615859994667361f9708d405e55e562f95057cb07b53d133abde269a8b3e3ee42d14cb54dc4b99cff59d0a87f959c2d6df64a36caf7efcad4cc7fd5591826f5ea018a2237760a6c5c51dbdcefbc91114a591a3e1fba08450b3a047fa1a7eb6d2636ec44e3f30c3c8ae91d7231434abb18f9262548840d1e48871ebd14dbb7c0a1e1e1b1d5b42599f58003fce6b24f8754471ca107de64b317240d12253c02acc782e8dd7f41ed1136c72dd172a2060286d36c25c031b5afe1a17e135541526e119a804c6314d91ec92f0994576b14b91b1e7317f4265661528fd03517743da11aa9367303b5603f271805ba27a5d2179b98e01c2614fd73c43fb1fc0e4d1ac23d3f89e5e39c18eecb22d0b745baf4aa82d32196d895e153c13171dc8c44706e13bde9098541799a4fcfc9104442c2ee6b4dc61c8e11c88dd415be5b23f2e4f118b4d2726b4de8ee0f8f7d59a5b5e35fbf693c11a921098e675cf5fc67c0def7c6a4e4a4f80a1d4694e25c07ec8ccc8ae9c5f21adc3c2ae21567a744ba46c4eea81e7e15ce1e5d307a58e38f7b4fe4dc84e4869c79dbb30548d640a8bded3d4237822d595fe34f381a53b264e477d2e12b35781b148828848c2950acc53cbe9eef6070c4200159ca1f73373cca8d0d151749351b3eb9f1cc59c165d572adbf514a39d6fab0e11362d437e05b6007fa0503805c214ae9b5693c3eee9748c8c605e28ece61851af29ee3025c657761301d6a8b3ba1ebafd9d79e025986aa16592912dfc5ad0f077ddac672f9df633135eaa6ca72217374d58409bc4518390eef37859d6b11c14f1bb2f90a471da5e071e952be9e3484d14f1b09bd1fb0582afecda5581d544e5a6293e528d2c4c2077a95f8d7fe3f922d8cf91895780399e31e37ec805ac908a1d90a355f1b594a1ec67d03c730c72e1245aab0c5bc7670dfb412d5b6b20472cde592442d8f4fa08eec0afddcd45fab07dfac6cde7b8d7f6956fafb6ba18b3f272ea8ac14ad1c67e031cc61b9375dab76d17a973023bd08288d3cc80fa7b1a0560ad9c7950343f2ab5e3db9bcf865b207b191da7b5389cd95bd74c623333c58c30082413f105ae358b7db708885fc3103068ea110797812296e2f6036e27fcb06b65e836362c5bc60d522208c7e85ab1126cd8580040c886c25b930cb33f0799982bb28b25918e06c4cae44393096a2bab8eae25a81cb82c66aceb2408632d6e3fc248bac91d8f1c374ec463f4aa39a68334361f08119b3c0a3cc6f4777bb758e892726a27b6a531ef448b0df2b3104920c836ef2708b7e03673ec23076fed7e1c03fa4349451a6d721601eb960c373c0cb0773c0dea563e73b9255ac0271709627da7ef36b334f74a2aeea5e79ef6a8cf56c1afc39dbe7e48763841ab8c7d2043684013f6e63cf8feea1ae3ed4f95b5ef20dcf0500b37c93e12ee7fcf8467ec462c8e5a92c8799717bd4d4cb1085b8af6788fa6bc1a0b47dcf50fbd35f81c94f3315969114035fd1c0a4e883ab292506cc5a37910b4801faa8863a2e3d1e541d2df68eb7b35b651953be6409133802ed76ee11353c0e07a3031b1d7e3f50a1b6c9f8586d89146bc0bb7dd1cbc756d4dc1dd0e198d26717ff759c3033d4ed34948d776e2313b2b6605e6fbc3c55ea3d4b179f536c6ce7c5786695fcff7c387f4eef104a88d1bad760b3007deb3d869ec30aa5d1007a0482965c74ee31b3b7043e753f780f5191615a5fdcb148fca06bdc5d80d4f57841f1e1ddd57e6b0a0d45fba671711701dac6a5cb50d0e601bc36ef86bce9cbf62475e35124481bfd9fc6fef932c04060fb99eb7c096732eb5e82851cb689f4622091035cddc5b4fce309c0f41fd00bfd783d83f862eec027fbd125961a3fff4acad5ca578e61d6867b80ea1d853aea45d53417a709c21e361895597934764d1e87b6b0e7a2b6e128cdbec2dc0f6b6bc8a7001f2e4aab9d943961893ca1b78e6bebb65f83b73f75625e25e3b60aebf1044243f2f4b1e5dec0d2a84d66fe8e03a17b472e923855f3b1a158e54224371a674b523b70ec1b425a78ec1e7e87647d5d9afb86b9a2b4fca53bca1ff6d7c7688036cd614935b678bfa0af64e9f8d53c0eef46205082b6f0ab81fc2c5aa2273bed79180ce44b41d26ece54b94faf5ac023ccb9640d54e66033286172d3ffd134eda6c486b88937fff6669e9406375fba3ad7c7ca2695cddbda738c8bf95d5fb42f2445775c6c2341d51dcf8da41d7e8ac284e3eb52c1d7b41017efe031472d6a10963d5746807e58993879febfce11a24948b01018759e99626a0e182249c4a74060fe9eed52b3a4916b207fafc5c3a13db79f00de0d7cec400e698c32e1affc2d191bb6d75f6da67c0a5588fa80fef82e4603061a060d3d475974c4e98b59f9352317478b02f6eea7ba7b9326ac4e277978aec8530bca0cd6ffd24accc35cff071363c98eea09ddb2e01526ca941bbfddc3e4a02f6b3dcb7d55e4964306239df16ea3a53970f1041c1fc4cc4ce4f21199bc3725e5c0c2f9a8f03e2fe2e03856b2993973413456f241bdecfc33fb6bcd5bc628d24c991437f843418032de25b99927a7ac0ca0a618d26ef02ef653e35382763c3d9a508bd6d9e3913fa95c5617339e70c8125258e82c9790ed3a8af344ac50e3b07573a486dc459fa6bcd754200062175fe8a609f0eecc21bf471d060147caa1e3549ef8a86deddf5de3fbaa448e272dcbf62813c36771350dc266a629d358193ece2ef2bc0d50d2edc525b3054b320694d16510c0453b4d5123145e1eed9d9c3b38a01d4238f31caec6e228d2b6374462f0c98b87f66edd31ef829860d4efbd612a9ef2db8f591f497fbd563d5d8b698edae1ee7af99067289e5def9047e2ff391a77fdd86ef75d264613d5c5bfc2e8a1063aa429dd546d9d95e2be1db4fbd42b9ed7a8d9566248cdb09221ec4b524411f9206715000f73199cddae798abecec11e1a7e4ee40e74b84594c5118eddfe8a2a5f81bd0035fa14e99b1b24579051922ecd08b98670637e8ba829e608ba8a5210349e826c7c652822a79ebe9a150f07277bb299bc1c9778e958eada377c7a02514c1825933766bbce8f9398d0a159a8be8316700387734fe503625e99984033540278e712eb615853bfb45389e9c3ff5a8faedceb35a95c15543ae3ad926f3daef45b777a2cd78648b45b6f2442c053620de620d19b8c35e0a7cf29f1ff79a9b89e1a2727604bbe140a135c3e40f17d8b7a56ec654dae55dd9ab961f533d200076c4fa6a92a30784c2d56ab4678b9b63d416ba004b082447299645c35d41ad911eb66568def283d679a9fcccb3e9ba5de1fbeec3e68aa8a36106a592254b67d7ea7e8b724238585ecee79414b1719b50451ab2170da798f9ebc35e9493a3795940e61693a6bfada42755d992496a67c3683bac05a8a81cd22e9519d19090099f89b4abd0f2cdab31edbd7450641e453fb22887949fd55eb492447e52025b40322eb1f4330eab798c89e50c56e8d35e4b8ba8e9cdda76832a7f97341ed34d459995a599c3e2a1413d61954aaabfd2d96f5b827bb642d3b6b95d58e43de9ac415c2858428856f628cddf97d656cf63df338a7fe45abd341deb944d35b82ec05b044e91968b53f458c36ab2576202cd98208067ccbe34e0e0478c3fd09688d3bc186e1a3dd3bfe1f9a769ad75d43e5a2bbda502ddec90202855aef55cdfe12b8b20f2b9e068840632024651d9b66d50c1926217bdebb73c1d9e6039829b2011f1a54137275388ab2c5b68662b0f76f881281d7014c3937ce6a90bd1ead32dcd162ec35bb99bb5180f3a37b412e8419a94063fd38b7d0b27acfe18863b8ff0a72143e0ef3f48f19402271b023748b67e21b53109c91f06879626ed201dd551e73a6c00b9606326682dab7c194237bdeb51bb5ada77b46ee2cda8f4673aaf38d48b328b83c5f33bddb94dc2c2dabe3e2b4ca2210d3d412a81780c942337248db7391ce91315001839ce9655c3a7e3218439f1f06cc2d022acc0db341bbf3c38d86fb38231f993a5c4930d9ee453b04e3f40312ebdaf683eabcd9c3e187800217f537dbfa719b2cac8313a03ef832dada38be942c9ab1266c5c6d719e20a7730f40d04063c1c686f8bd0a5edaae16127fa3fa196585fd58243d3152d411eaa4e7ec6d0c0b7abba7c5696d7c5df1554a28a87e2913273b97a6d1edce2fd5c9f6167a66756e16db2d971ae57f154c70e079d89329b1e8ec6368bccb7a0dd6b6052f5d4532e820b576e243eaddbd29e983f796d1c1ce558059ee5082bcfaaf4f50a71791cb2622cb123b76f62e92042f931665c257c4f7b7d9bc3f8c2d72c9e647023bc48494879c9e17168fd85085c39c4ae7ed724249c36136cc403202b12b76b52c6615afd99a68e9c520616509461e298fab97a2c6639f0299576126ff7f6e547beef4f4a3550147e540504c19177726bf853e72f7e8d184293a416bff627c54bcd788ff5f5d0595f9783b623fc865b70a22ed4f48f3a75ffe51492e5b754f3a41b8682c6802d47894208963e7c9387ef1ed1a7443f49eda7b44ef0a7e184569acfa090877f6fc5437e1a0bd9baa8dd2f94c4cae736c16a8427db96ce1cc0d877124f21fe999fbad473437dbe5dcc457a2d90a3a51daad3dc6742ee22120f60810b199df477c41085480a54b30e08a71610bc9c469c0d10f89b0b5e6a6879d702e3896c32c1e6ae9e26f7f9817563eb4c67d01b915af10820ecbf5070c9062340c124f67d1e0d7c673493d2f039e5fa6457558a4f005ea59c82e52bfadbbf2d84ce74a4a0364262279b6548c70396baa60ad25048355cceb3840557d146abdd153100dc61b28c482882f6c4d07a7f145aa8cfd544a2f46bae1aa83cbdb3d21c3d1350078a3af416b012ccacd147a7f0c758d4810bef2d65d56e554285ca3dd0429ced8ee17581b4087271699311163736436abc64c310a270a594d1f332f3e26df35ed72f0c3b0a78cc6d64de81d5cfef9118ee19c6a30bc7eaed51cd94fc3b06412b4c3ba62a0147454604793feba23a69677ff0a1f0882263e92adc9761c155addd54cfec577fbf0786b02ef260975ff3ded7b2fcff02c8380fc4e8e4295ea160fb56b186c96d263ab4d2c3423d95a559055e277ed65f0292e787b9225cf934820dbcaa1b88b4c50559d101d9898656c0647d16d07f891899fadc16fa037a543a9bed82539d3ae491fc15b05c4c51b852849a489a02665274cf29c81425c84ab02e5101d80fe9cb06250698768ede1437ec1f868365e0f74cefd79817cacd5e0d4d50ef4fe6a8c18b5d0c80cd5815b19724729633b2de5148e04f4bacfa70d779815213632b5e0f482a8f3209b1ded999b5fd4053f147a6912cf8ac7abe99ff1b51bf36bae5f5fe6617f774d3a221d26526264e8b28053f4e5a39822a1d301c1c45ff20fc1c54d40da9ac0fd332c6e524ff57868261ff64a8f37c9463201e77a3e57a99d2d863d9646a16cbb069b55afec9f7b2e1a31d5dc77e28abcece4958d9ba9969e4220a5794e19d6f124fd6791a0a6e984ff74771d283a58f122f9a06e64bc257d9013194c496aac5a3ed1189a14d2301756365e9f18b5a08d84bf9cbf1205e2d597ec0d91d12a393084a4fd4ba1780b4faf25f0d4e1db1dec82b4fed22c2d6b10ea09f6ec7dcf2a2ec6e76a08ef2ec7b88a91d250ec111d889d682b5a2b890ac9d6fb79be97cfdbaf56270364565cf1cc49288795cffe2c0c4547c6b998af6e5b1f3eea8ac7b2ea2cb2d23de06f9926058b486515e608d5c20ae23572fc16f26f0352ddc3760ec2417d779e0f9349b0fec1700f43c6b787546eb61c18ae46235023c5d81b3b39e068169598347a153f127c4dfab1fa90cd2dd131df0d57b39db901064dd47fdae11b0eaaa1018c522cdb2c209be2fa0b13d8e2f3f2d360f5be042ba2c381cc4830d4d6256cf932a716d3419687593dad07c0145aec0d527300cbf419bdc599385c2ffda4408e157a69756d2e31774dfcf58dd6054f1db4b2027b0ad9b1027ef1cf86f585c0329d42b14c0f461eef9351899cb851808700393f8bc07131bae62b07645e78607942a66ac1987cc404b66110772bee24cbbd8f1488c56ea461573a905288caa5e4ae0c1260a940b5691fa24697b129a06e551a2dfc7a20ad985ab6f6dc051b04e727ea24c3a210678f477b8898d8a297e15f70e8516f35a1c25906a76b63d8020358c73e45239a5ee9c67342d512c75fc74509e022152c2561eac03e7b258031cba939bb7f9e1d0ffb051021e6e0267c82ae6b81d8fc62ad19787a08a5bab1f892a1b828dd8236ff458be89248d14e7295e41c69f09587ad3b9a7ab255a3dbdb1acaa902e96066a15be3531065668de6939e72e51360f9aa5ab968a815617c6da69ca2d61dc92a9aa073e628e700832cee2625af8bff3738f96dca766f83f204d8802c1ef52d014fb5e61848284fccda1813ab05f4b0cebd8a2ff689ce8bfb55232dab4a19fc79450e927ffab394a952940f59a4d8363ebcaf68937eacd9f6b308fdb6e3d6c800ff0d0173cd138fc74b0451d7e890eff5cabbb027b1950e52c31c68c588b60016e243cbaa1bc291a517cb839c6dc96e824c418f09bf1189bdf9b0076d85524549a3455969733b2aa13d6c2d2d90ec0272d5d36dd013acec86cb7641f57615f817a68423587007eb6a4068b6f1fe736c35dbe3d5014bc1975bacd1b113e78ba8ef5072c1fd7e93345eb543a98002fa0c49e2e54d23c3fa2a9b3254cd4f362dd85f55b3adaf1b77a60d008f7d6e4ada533d7f7a3eae18a106c3e0620eee0e76f6d61aa95f03b32fa0e3b -MD = c8b144ba9b9a8ae0ff3cf8a6444cf9291cb72feb3d8402237d2598a57d0d8389b198f67b5203576fa8f878ef2728644f706421fbc3db966b967cad4990a49480 - -Len = 71512 -Msg = 8a46ea29d6c39408e4d4eba3705a1a0c9415b712317245b790a4fde549f6ce5c6460a2efbf58e3f0afea3de9ea0ba68ca52b9cedf909aeef8bcb3efc6c4e85fa3ebbd87a995b2932adacd0ad28b48c415a95c44296621375dc3104c7b6711a3f607e14322b736eb623402b58f0fcd212fa7cb777d1247b31cbfdd6adef08941511d2de7f3f49bb645cced7530b8b82e6cf07fbf670f7ef0ba0583d16debafc639bdfbfc99b8417249f7f5a05410aa3a71f5f1a253b8576eba269c06a4c30591144cc3e7808cd8bde337a3ed559213e3c33ab9c6efc7318b91a59e7120112b30655c2e4f44ecc1e7a61e80a2d1d775a8d53140738796cdd5d504f3a74c507132c15e837a53528d8e071f1477453b5ff82c6c2e5ea7b16cebf8c7442f960b7806ace67c1f4858ac1f8abbc7c11c4823503d6dcbdeeca19f2c816ef860999cb02a8c6660a470599e2ab5672316e388705f8c98a18ab2e1e525e35e98e0d39eba1ce470e98077efe42dfbc3aeff2776c7649e8f67d896fcdf46a338ae36b09be66c59786f59db960e97d233d3c0548d891de7b4574f054cde2d556f90c8dceed5873fef7a96f7b68e06ed4a3a30f74735d9fcaa28548a7c72485e75f91d9531f7fc1c6893ae78fbe2e981793a978c4e6e2751c3339f92e62c0642de3fbb95ffde4973563326cbc09dbe53435d8a9fdd92846bb20176bb247c05972aed194b92f8ede95ae1965c9f1f03c72b2b708eaf338fced92a807fa1d2b4bfce79bd22a5c857c2c91753c7f2074841a32cefe52dd197dfbb17233d08d0a2415b7e2da7a2cd25b4335d058a63b6fa774dca6f4fc3fd3b32da4ff58fa3f64cb03462c1671497c6121c2b12106edea8cc8d9c650b1bf6f84ca94d7df41da41280ebb04edd6588b78105fa1ff66dbeb1b5e51b67b3908f4da1ca8802e6d07aa23803fefc7730408875634275a8fb07d3c7d6bffde5cc06a9c690984af466da5a49ff9770c0ef2fa763c6acb9a4a12a5d76f4f28e0e290d9b2fade6bc993b53d93b512232570cd692d0a2915275daa6dd47a26b9e8921f4a031750bbe31e8677d808b17b78613b5e9308988e6a901fdc1be7183b603516c4790787fe67ad895d5be0ff086ea9e4df927ee0bdc9ad19fa95fe4c35af931c50fb14aabbbc0965f605872451700f72f711b3282aad7a42d02806eb2f3d74daf57284e17b4afac34abc4447dfe45c8aabf9f0995e7fc13f65bd491cb172a0f7bbc4a056c579484b62695e90383358d605307d5be0a548bbc23d0d0844b6de1caadab02e21b1baa445f51e28e6c6cbfe0c9fa2953889d85ced8e9bd66f71f8f1cb9cfc94175a1977fb46cc3771047daac82ea770ef9138caf09a3bafbb0bb41d25f2cbae30dc2d6b8d46b0e45f54368142c6d3138c2732aed34734bbafecdb49c0c567a4f39fbe2902db11583a20bd2b814d6fa697b28cb09c7fd021d37c351ca5fb169fe90c945862ef39bb89cfdb518dadc353999a0f775529550aaf24893fdb7e21c7988976a1b6696e34d5c9589b6fcc1740194683ac052d0c9dcc4aa1596a34d0438a7f2eac0531f9eba575fcb02e94b3959f20b0f6b5733d03b15843135b076a3c47578220572f2209813d8e39d2ebde7bb38f5dfe6ce23063e6b43815b5de39d955773ba6b44b30b6f188d8dd64bbe21adefb546c32642ce6f4c8470680a083433e4921e5256d6d197ebfa045ebeb0599a7cc5be70fe07bb462fa3a8fc53791a18a33fb86b17d1f5baf48af186f639020976b3b170c3f63f4b8b4d8578b8aab1cbf9f933061638fa30d8ccdfff90bcbd9343ebca530672dcf7f5de807da8118dc67f4af8c3c07051a1ff3c1a28fcbfdea09aea5398441206c3e5c3346ba042208099a18414a51c8e86de655a83c8b6f7b9b24c07a0eb586f47d1b81bd34fb0fc82ef996f8932a22347fcb4fba05336ab57406d311d8aca58ec40199134f4e28465d79f05920785926de0b787ff4ab34bf1bbda7a5ea0cc7639c7645f114e6b5a71e82f00bf825b6e8110f98a010db15c218b204df4abf329a8ce24bff89a9fe16f97c5cb72317819fa03e77c461ab57e6f44cb16702ab2e5c1dae74e4b8804ab977cffd04aa38027614ffdc94f004415236f278e41aba05d1d5408849a953e3b81fe39b9b946e8193f3bc91b7c4cc1a2f660e1fff98d3fd203f014fd5630b0f3c7a20fe23e9a3451ec8dc5cd6e5ed2ba40c076f5f86dd6072e0599131ee8e176d0eefed45b1be974018c706995c4dbcdab14530acebc274ee42b1150452c6437266b631a9f5a7bf206de457a730d614f9dc302a90d06982bdec6fa4f7979ada7407de92f6bd4605e84e9d16a9696e7d28163024b13cbad10666fd06b2c6f1269a7bd0d8d50f83b0bd44590d4610ff3d8fe6ade8b7379dabf239c103dce7b56d0d49f3cbedf5460ac9d68102272c709d57d40f3c4bcafa56a9ec25621d00cdf8f4f9ae33e7767759348c7bbef4c5a9e5a868bee915fbb91b52078fed1f1b210f78136bd76a9afee626eeb00954e4925da92b22b7bcd4c2421512696a873f99f9c12091801f6ac3f9c68588aaef8f134d83a4a36de95dfd131b961aa200751d00f6a888f6adedaeda3cd86c6b6ed114fc5d5caad5439d53d68c1b0a5d30c4956a3f31b701be2ca8d0b16fc21279af7db360d99db5739caad29027a163bf34e980c5458869f72d97244dd3f368b73336bab4a5e6d62062ec504d44477b56cd018ab06b62f502fa651f378b6835d16427598048eb00f3f8ff98eef9646f9d98c5d0282cad6f879bf806981f88416e4a39d8ec4816fa9365cdf299ce60053b9c1e99540ed29d2d163a249718ba5337ee527e222fce8eaab13ca6774ca306d9e1f22f5c9b37479d7511c05dfd6835d4575b9447847a82dde536fbaffa95391e702bd8695b45377fc067211156f9adec8d3d6286d0849fd607a23a69619f68b350afdda3d564347afd2390dcacd5842799de30059a53ad3d2267accf0727593f8968863191fd0536362d55e68564822f822846ec6a4f74b93b6f96067697d56b243c1a3b1776735c726db8566c0d6ea95002eb64c8e0bbf35ca143393655a4df2815e3ebf0394694bacb0154e63b11400c5369953d6e4c938ce5fa8ecdcb8e429dda2767a3ac4685152f770a7d53349abd0506a65061ed40d423022dc55f5b3c8c732fd7b8393ad88b81639eb8be9d5f6bff0bbf8a2167a23a43a43fa67bd277fcc74364b747ec3424a90d381fe415381e29c00a72168262c92e28ecf686bd98f5c0aa36293d2242e98fbd013b2d63cddf6b6cac90a9052886cad65b3fe8e24a7f45ae749685a5aae11bbb20930251c5b5ad58d06c40ba9b7b00f5b508080933a33f954684863d1314364ebeb0c9a5c8a9d7cd9c8f456764afb9cf21da50fcfb6894a8d57da8b1258bc6c00318ec2880c2d11138801ed52b2adbaac83c27824bd72d2f490853cb894db4571655d1a29208836ccdc735cc97f54fcfd2b6f562cbf6f272caaeef51e762e95c20efe2dba983d62883edf0145017fe8666d0236522cfcbb87ef5e40ce6d34c16486c859a6b3cb08c8179b974ff98cf17ac131753f86aa14b90689bc42fa7c4cfb75624a9803afbdff0f3f7b54c81a9c9cd063af4f7cd5a71268c7a416ae63bcd943426ce91859d6af7e3119fded976e5f132f40fc502e07369ebea4a3e99985a088ff3d246268075bfd271fa5ea81db33f1dae6e0a111999800c54a953c7c3bc3beef37c46248a4770487e8e73f6867be051ced76f00ef2a93771e245278a33b54d98e963a87a52a31cba023c6cc9985fc56be139bd94970ccb5b284e3b422217cd82ce6c958b8642ae53f80fe313e18bab2e4ea38a40eb1514d7690ad8427b4da7435369c9eaa3e841dc36ec42e5d7e42efaa23eb6728364ac7d41259ef9b3e9734114c5a61650067fb95b5c0cadefdbd9477885e2c7e47e0ac33d08efe6405daa128f0aca9d0f2fa081b1d990da9de532ab2df39faf82b3a82fa94f5b86b52cc41e2ec3a7fd35c66cbbe6ef8ffa6692b38c5f123da7e2c82d493243625986c949fa807abea5685d2cde66f84a9bee56e461786c5d2f890dd276548f84dd49d5c40e008a8f341b66794fce9e612d79c43dd1066c7ed4ea07505d8cae339052b49aef4b8d8a17c374daa66a4c542dad4d3841858d03069a472f55471a0f0145f85704adfe4fcf050ab978e68ca42b0d645c3972588a52fe4fc804104d77aea81380e4c45730c8349a9e1dafd9d193feac222f595995389a7392c074c2fe06dd9891060b12eda1e697112b42ae5cf7157722a9a70a8425f3754840e11512987aea1fff0ecbc6daaf928b183b84a6d2d677c62ef7e607b9ada730dbf1ae55d1f4aa86363bfc7cd0d41f947af7076fa5a6009525a87660520d9bf51803192851df3c5c221eff40331890a5ba0170e7ee28b4083445265e8db7c5fd7ba1c00a768f220a69247ed16fc198375bd78bd02ac304a7c16a8032db20a7b27d6a4d8ceea8fe2961e8e5a0e58388d1e705a298ca0974ec53651e8db8ccd3dca3a91c2ff8a11331b2d8be2f42c3050dc2184fa27a60775e70e15bdfa530bcb4750ab654430c23abc27072ecf6047f33a36bfd9d8a6cae76904bc2a93ee0d4d267fba6aa4c4e8200174cae6a7dbc69ebd18d36ea98826cbd3820dd6ac451becf02e8578282fcc0c727c9cb18487f57bef2f8860a1346449aeefd16a50407ccf2cc7d538d657b62798a745376f4b1baf57e3a657c893cb8b81b3d08d84c77a2062b17252b825ed99fa5e8c216f0f81657d9df4fd278ba5b6d436d2e852c25b041a54246dd681bb8920073b178dbb70c3eac33bf7c50538f530df9f23c11968a5dd18b3313654661f930c18c0d0382ef125bf43f0abeace6e1b18fee5d9b4e92b3265e648e2843785dad3ecc5406c0318b6f7d48edf20ad491f49b9d6a37b26bea2a38657e2fb76e07dc67ecde540396026d5b6796b911dafc4d8969f26576684b43a5b093c9f6b5b054b9881c89c17f0fcbfb05a562368c8912e5ee86b2ef3a8f0922d03fa5a5e1bf9cc0089f069e4f1c01f8cd9a9c0d5bb0eb3d85878ea1350de13c4f02413964be1b07f8c658de98afb5c109d6b4fabb1c3cfce9857710fa50726e876c0b25c11465fdd3330f26ee434de054fa4b833d139eb065010ad2fcef231603dd81ef895ae41e225587eba26f30d32965de3b544f76d4a27a984baf3279ef5ee7341b200a4be560ae51b1779c051611b9db8783185bf60c52ce0fa3e2fd36f319a02d17aad3e008ce0b0cb05241258866c1fc6c16c4710d3a0a835d5913a96ad54499f2a5329a95150251ff1a6b8e07ed200e51b336f24f90ec4b4e0d539310ba9fe62391de719013d625b66cfabc1abd8431e69629e62de7d1bbf88843a0af2a10a63cf93e01845af4ec78b2553c3b685d0b9d0823b942bf5979df425a4e70b4553ea123e7c6ec5afd3ab893219ae47e28ffe7a1ab080877f1f984e40df91fe9cc23f2da524e22844d84e877e634905f568358fb264ef9b219cf6bb5d53d072ae3fa946513e3e167746f9ae8f9a5d99c844a536d2bfa80fe5f4006505686b1084b37186c83448394f03f426ef27b2aa630997980329758ad310fe74bf862c7f2504e014946cc936d4f88716267010e1cca153ddcc0a1cb4f2d838101415d967991c3c193c5088b80e0dfaa6badf3fe60df2212cb6ca66364a34f55f8b7d3b72e9e1cdbc49464f65062b940035db06602ee649ad48d11bb8e30d7f8cac261a461c3ddd2642b8e4e5c3389e491fcb2ff83564128a0a8803e1c6491cbdff783e8b3a17b27eaf0d10e14d1d60acfe1980552c53c6e88455e55afad2151b0ddc6eea4c5695ed19ad9b01adc3224f5c2cc2201a9dabf23fa18bca878eb2cd5db8740a59e4ce9b07004decea112c5ac06cbc00082909cdc2d5bbda76673afb7775169569a8a5af016eee4b0ceec5f6b341389efddf2aa495573e32ce44f7cfe47c1d30858a62518f5f45c51c44374bbc13fca101a7559d4191dc79970c2f6f2b345085b3724cab3a3b1b0320fac880634ad2b21c69d1e04de95c58d9a92b03d404793cfd48ace2896a38ac23f8c1bd304e8079570de79641c988769d0233b468565efd6bf4ca21055464692a266a2cac88ce9db97bdfe7a698267ceaff8ea96e91c96f045fee8e346167e23f6c0af25e5e86c74b9c01fa02beff11c988860c6e1c803ad06f6051a0fa08be69b2ea3ace396e9e145694f8e0a3dbde41856102f0614b07d70d6793d18510a6b1e0532a858250cb1c92e208c5af828a5ade68b57dc7f47e22224d7c4e6c48411dde8bea0a9ff2f56b3931533b4abbbe1c7ce34d9cb64146b89458339f157538b894daa3e5fa1cc50a31ca01c9dc4f2290451af1d696fc08a14dd1e14cea623287ea8a7d9ff998e20064f539f8cd075dbd2254cab2d0eb6be63300addd51d6d894c9e29fbf062df655b8fa234e85a918acfbdb00b8cad7188e302cc0dbb498d2e6172932cd88a2a6111720e8556cfdfa63b9f5ba70ed87b6a12b9e41ce7a71c785bea85d52e7c09c3d68b0b095eacdacec42eb2063a1c5ee280b9f593c0b295f7aa4a749d58a4f80e193f2a29568dfd54f80055c184f576829ba7530afcf8843ccb36d1ddedb17f9037f2ee7dd4cfc1e925a8a93175d06cbaf1f68edae2e561b83d14402f541dfb0ad16aca6f500ec2fbfb7c4f0e9359abfbf22c2b9c2905a8ea8e87220a324714de63fb30866ea77afdd81f998153ddbee63abc9bb715d5d4541df409e6fec9377b7e28d35b6746547f59f72b623df91fda2a2c71c46fd27e8599ef6a5e2020ed626e8805470057d9e0ef977709c82839785ef0203c6d8801ef50ddc5c82cca9133e37d58e1904885d30774fee078d7a62127bc3997b56308f1f143aecdab32ed604b8d40a3bdb4f2b63014459ec6a3e06532c5105ece0fee4de9b577c6f2063c68253c4f15df197b1b07f9cd9d380972c50ebf670a1dcb3c53b8a7c35cb79128cbff1ef6a08ae2b961ed9a09545374d7c10a1f80223b417d93cc9f13f752701d0c3789b9ec37ad283b6f798b6c9f7279d9b34a0e2f9cef2c9ec40fec1f593f93997d211b416bd53207fc1cc63e828ee38f98e3639ab940c3c50d8ebe3d424c16f42e599d589df7714812083c529326af43395022ec26c2ddb7277ffcf9941231bcc9b7a29a5480608c4fa0704147e637a4f334beac5c01c4e590683aacc54e5e53edafed7f161c8a351399e473172a171584f5b953cf7a23c0d6ebf9ff5c4d0749f8c6b08f690848e2fc391b60977eb8253d07856af79874e9795fbd39df9ac71f7980ae33a3e04706682287b23f60b554aa0eb55a7ae932bfe657f714b5b41834ee6239147d40ef2ff5caabb0755c79144a6fcbbacfe8d7b4ac5929f88525653ad5efe39a5b86bbc013b61a13efee8de4acaf2b044d13fe8839c7e85db46b5881be8e204da54e375740693524f5736e663f4175bf98f6f18b2d4894dcc9f24cba16c191a700f3dc560a589f9c2ca784e970cb1e552a0e6b3df54fc1ce3c56cc446d2e9a2ef504356ceff8bbc20bd78c1eefa0975d76c6c6210041f1da920551a12029bc4dd81bbcdc5fee0c3f09afce571a66734115cc9cd4fcc3975a518a6760de476aac4096ed54e89d237bac8cd6227f9124a87d6c49ba394944f6016297f4061c4792b5024147088a74007afb3e119d954dec1432674154476d16080a4deb25fcb5c9bbea43233e4a8055db7750a4d2f7318480cb702abc428232fc0e03a6bc7d5799bbbb8d89f831daf4748dd84cde4b821a3973fea6ffcf26e553ca53c748228f8b3af26aebd4e4e654acab1f8a1de6b215a4e86d769d51bda585eba8cd4770c026b02b75b942d8250f0a5ba0dcf07d43ff698536fa035ed8ec28de9d1938dcbbf4c1c33882c090398c041c06c61463ba4fedc705a1c06aeb31a30f8b3baaeac56dd6562dc8ec8176442078bbc5e82e778fa84a341e52ea770e9b1b0dc50c1f6efa6460c00c15407dcff5de2a6cfa521e273f7b5cc049720eeb677d9f15dadf2b43025f89bcd931b2a7eac8ed2bb96310af09d6ea28027605409ea3b9dea5ce8cb026bef56bb6f9a73475d58e72a3d5f19f9de956c61c8b1cb6a729d86fdb51f5ca581b9d992cfcee2e3d6058e2582f3371622f4d1af61597b6277c954a1a0e1909fcd1ecb5a9afd9cd981606eb24d348bd0d1517a73d9a18b786185b0db05748e7ab9e6d41cba70ccb1c53030dc866b3eae53750eb51ad12435989a42b5cc217fbdacd89ddf166f98f4093c7ba815e077391028367b0b316d2084d0b136de308bf10ebdceab96412829b74df820e2db5ff771319acf94098fc18eeea56621e9d99d465d0f882230a5d8362b4e4bd6a41e72dc5ae1b89da0b1a01cbec84e7e949249be80067fa282378aee9e2631d782db32ba69b43f0e3ffc469806bff5dd78dd7eddee5e97fe8005c5476e28dbcebfbfbd7427ba6acf2e983a688f356427dee3c20b6ebdd91e723814a962fb50a4a1f19d705c9c43c9b5ac04f621d0a1420ecca0b0cacc4beba0f7fc7c4448983f71995a18d001d2e21c602da88438b61850bf9d34c832f74b516b0728dab6bc8976e17ad34a921e03aadd3ce87f16aa90ece443003197e527cfbcbc15edeec369faef870894f72f15a84bb91ddb1286912964197acca51c686011a3ab4497b5c643eb092174d70dfe5ed22cae60d351055167a70b6302a4f44d924553a95a9b8a9afe8685b3dac1a814981e05d60213d3aa14761bbc5685b5de692973e2df7c9c4750889c19a952f912c817890546d5e37d940d13a14ac7925abbd875b8cd60e4920896ce6decc8db9f889da2b5489e1d110ff459d88573720bb3d8bff3cd4f4ac34e3983794a2b3505003ab8adb07669b0acb45729b0913f3776b3bb5b8652b6214cf723036c84ee8a5a7533b62565afa093d4745e7327e0272ff0cfb7a17010f5275b16d4fadaf077bbd67c984f74d72aeddc173d753f3d23041865d1c5b240870aeac4b49b3622144de6f91bd7aac996e255aa905fe03e721db2e46f9b1e2e1f1b2e966af79f6ca8382c130665106d2c99c6941dd813cb5ea346b45acabfc30582aef2c0b71db67da4313223a0acab343bb73dad89dfcc2dbe5d3d5afb9ae58068f2417c83b8e8d9b87bbf3831886cf5efb00d071a4c2928957ee637d6b97ddaf583ec670279eb059c94200ebfac96b8de3a6cf53262ca97513119b80223745950e85949dd67a5497904bf6df31e13c52fdcc23d792a97c219fe3ea628e0b046a2a9f2eabc8bffec7751031d75e8c9640b1f77a899ab79f0166ebbc9eff91be9124f1e1145ebe138bd0553e5ec12a2dd9a8af3fe37ed566b7008f9e900759c89c96144882391347374a7198e01a2857703a59e07fef918794e5460ce025c1a6fee67ce15fc85dee6c3c0bce15ba2597b6ff8e18a93d6a563d8db593f9eb67fe4aae9238179cdc9d9d3d7a4a3a3190831050c2251a18ce77138244a067c8cb22e2570ab934173db93cb74399f801079e1ee68ca22ce24c4ea93b89ce943e59b958683ce15fd7ffe5ed420e29c9b8e94d3519442c6c2a52618141db8b19cca2263f6abf4cd54f7198016610a619b9b414f5719f1052617f441e0dd04262e422fde9c6f8585efe51442b8c216b7293f689c287e3ea6a28316ae2280ea0fa255aa50a157e9037550d7ece3c86f66ed83f103eb4b9373ddf073a7008cd1359f0b7bff2ceb88108f4149c6befd7d368e6ec4ccc90957328066f573a28b2161ce6d8a3466b4cb73e5bf541872e8a8efb509ca3fe93ff1ac32ed835c31044159d682bf36763918f61ed2df2926115958095be9a37475cba99c8e05a8d5809be56153034f8502d85fe282d3420301f63a336c0a4291334cf1665064a0b58696cf14e63cc5bb987477dbd816ab313fe95dda4416626902dc4b373c868cfa9e9ade994554e13f825206afdb91acd7539889a7ecf34c2369e380b75854b4cb500fd9987831eb3a48dcd406942c8d1dc66d86416b8b48e8f1c9598faeb65f51255e89b885bd2bd37379a88909d0952c1fce1b52c9c49de020f79b674695d7b4a4edb6a276dee8338a904bdf44630d2ce625127f0e88953281d311e626d7621b562527fe537e6c81158b86b14dce3d45a4d9317243be760799c682b5586649aec16ea6732284fde69dd11fa72afa6d9ddf5241d3704e8986f239b57ce428d4976f31f9a9edd8e48aa9cade68e5cee55f22f809499b1f16d8139273e2d0074afbe8d4e949bb626994c1de8d9d8631ecb1f233537dce1b6524843b848f26eaf505b2c13efb950ad32d6d75f2ed130dccbbd96be5171029bd93ce9ab02ceeb81bda575ec06682b86c7c36f7d7019649cba65e0888be6a31684d7819bf612e5b05a55f1537338a547aaaa3cc028016cd329a0a72041ae21cac790a1e78d5f0bafb8c504d6a09b5c646de3d5c3b139c8149be631121d483d0d23f0c13a4313bbd44b7b46d22910cf618418a104c622f4d573bf34ea794523621c8075f0b1c184c2a4f12df277396cc38fb144efc14d719a639428f5d015936e33c836a753f8d4ff37cf30a41565b31ed33637f12d29ccd7cdfd63d0cc49fb95ec3069caa41a5aee865de5638e2640b8011fd0c57438751225539c17c852ca5dc831a5d71cc655151335b2bd3c0b84439be6c5b93109f8de0c4f38175eb09e4a3a746159485d721760df2f1db985fc2606238d68de0ed69fd548ae7bf9e3d5cfb55132cd91602049e1c2c101911626f3d24e7e40f5c77cec32c885a2147d0f72eb5070a0927eee3138890f052d4c831182d03ecdf2c47a278757541658ecb9b83f1ac17ec5fa4a71b78a7fa518999f238a51458c6f765cf6556d706511a3532412e8abc49672b36ff14f794ddd7de99e6b3a08f8c65d73bd2f83810ae9416a3b197275fe9e68b7a07860a27bd669e0e6a7f31f9f91fa7d006821fc743a376d61b510d6a9585cd5a7af3681cbadfe1390c324efed5cddd744b1d1593daf05eb3c787c44313ecf8bda28697d99ceaaf0214f48006e7177f11e7f1a1dc3922d522fc5fd2542bc2148dc56421c82b2e1151c9ec4d79f8a3978e23254b0a29e2e40b0301c103a7b02ab12cb88e502e540e0e744340bfd01c2cd347e29b8572d89256249619ba4e5d40111fa864d86f03af215d20de40372847c89b4f1ab6dcabe7eba74660e0e7726195e55c2dcab4e4fb72ccacb165f56fef5567954f032f04ebb2d43820dc3b969225c8fd708dc69ffae9090f4094d19a2c62f2dbc2d5328aa794f395e0181272dda90eb3b6896ddbb46f5b701336955106d7854afc95aee622774b8429fb33ad490900a58626704032ea0cf7b3b4073b869c680a84a96cbf6445252e82ed68f0de2de6fc68cc99777b4462cea774f001b399e342e27b31be76e4c9bb735677e3a5fd08dfe4e3ae289763a61a77e0174b96b73e1a9f71c88b5f3e7f52849f292da562ad7783d378fb8f311f06ac5f46c035dcc0bb42f5f8cd27398f1b3e2e4677e7421feccc04bf966a9417b7cd5843089af1b24d536e882cd7bf403f286c96687187a46548df4ba43076d4586235d7cccddf5cf75b44415276b7dce6cbc1e0a94d17850a7dcae3cbe9be9f0ff35dcab4d48c06e2e1deebe40c08a937ad96eee183dc0a04f52e51b39e54c0040938e467b9e2f8366da64e8da29cf05b585186b919bc7a7b38745b0557207f612b2eed8e84c8791a870331f33e5af87a545c71d919a11f96cc02ca691a09244be2a7acd03b25d3b6b85d5dbeeb2a0bba271d77e88a723f7e3b426586f1faf6ecb50bead6e8e34c33871d9b97aef46f465bfe5f8f7517235b0d9af605e3d83e6c2cc26f4792e92db97da9b12691a06d447865f375e1771354c874438df88c45f3cf3403cc421fbe6f206a67129b174ddd04bcf943d67c5691f63716c739fe50a827ca6e0dff6d467efbc88703d43f5738896a3aa05d0d363b1e4b355bad16aab3bbea77b1d1bb0f0e932cd7a34501d37e8ed77e357c12f97ac91868f05dbd9a3d13fde861c0f15f4672fc2197f54608d69c6b8da93d74e8757e06792e4fd9676eb86c87c4d5f77f4e1fa22b8aecf43f693a8e2ea5a8194b55c57d2ebf8d535a6d319e1d8317b5b74f2284be2233f4c05ef0a82bd1c4ea6a4126e551481f14bb6306fa71458f144e71040ca107d12fd3de46214ad499cf8c622aa6a8740b03d277c0ea4db343fa8edb4ca09ee2ce8cc011c56154572fb1fbe05828fce85b07e6d2e6d477743d50bdb682aa7b5b33f2ce1ef4d010018f76fde239d3144f170a409b0022b83185ff24292e910119074b462e5bd7487bc008db905310ba4f45f329fb973bd89221ee0b5dd9bdf8c5527e706883dcc26cca4ddd133145b490efaae71a32879f3e1b04b9790a9628061d7394f5f349477db62f4a9358dccbbb1c16c21f596ed5de7b2b78a64a8458856f12fafc33849f568b956c37523bc778d521043294584119474a8e0c20ef52ea5043eaa6ccf7929e51668928a5cc706e21b2f37d6cadac98894844d2143fdcdcc8eeab1b4508e8fd108cea8edcf58e4608b2d92568d5de03480fe221aedcbf03e0fb868226 -MD = bcf7e3ac677b340318080a6212387096153ed60c24b1ac5c1744575e7f94fd0363d2e0ca6fa4d7445924963aafb47cec33632399c3533bbc144bbaffeeabe46f - -Len = 72304 -Msg = c84f05b80fe8318cc378c25a1c625cc08f5ea853abcd5893414a651ec7829b23fe45581ad3dd91b2839e150b03be16269f67e59ae10bfd88b4f843d0c92c8c853a6a609f6e8dfef03c1d9f5a5320ff3ed9321a3752d83309c4121bd4182fb08ec4e5a4afa7a1802e341ce8add32f20f184e8cf94c6dd03feb7c076917c341024e3dfacb347c11f54b5c4766d4c948025eab08d1805c2744fd62cdb6fbde3b230e18001111794e44b053cd30387f627c351b3da2bd62e8fe4697bd2d6a2e3a09b04ef2a33dcc3d6f96cad87d549fe1eb40219413502c95ba5b8d8e32ef5dde24b9555af7f61f5fd47343f184d5d546cde4509479e523ce07b0a6997df7c787e2adbd9195f6dd3621da31910d28a9f192b62ab76cf8b2f264ca9567551005d7e1f20a4ef3ac7050c640364f7cb97872e82a028552e78493602dbc806ed4833e911aaddb978383203029a4753a24db6b2ca48a86c24e0331783e9e7d0191ea3c8eac3ad0080880250e1b1ebaebe74d1adeda252441a8a95d1b91bda5d3e48552291b13c4abc7f1ffae78f788f87d48328d2f64f64763f156d8ab8ca35c58ff0ffeebcb12293e42e09fe7e157f65347129618cc754a1c75ef2e00adede14bb1d68e92e350d6d81da860dc4ea05c05d46bb82abe19d04ea1668a2573fe2959483636a4def95b21cc878fcaa20a90018a8e31d9dc5c60670e6d7b8e814c9afe1cbfb59630841cb7ea3e7b378dff38d2b40ab1aa89c570e20754809058619c96c9c359eb6a7991e6f11dc19764e6cd05eb51a61158ed986c36cc27ff5bd5c4dfb9f1b218ef52614b7ba5d18ec969b2f7baf38db2cc2d3d521724e0102e019a2577bb4cb351a6f161d48759721de081348d80e6e3461cd630230f3787217d93048d90882f23dfd8a6a60297f5e4f3ce58fd5a30377924f982e4db9ca8e8c235f9661202f0c8656d966ac83b6eb11be0b165100833b7ee2dc6c72a8e09e647f9708ba03bbcc1e046cd9d48a25104b16efa6f22bd4c94c0d978647c9a2eaca7540678db90c7a2d8faa8b8046b41526cdf706602ee069255931427323f8b9e48ec27b814b0c5eda7dfa4457c04c41c96a8d0044118d62314d12699fbecb55da51850c3fc0a1bf4e58c6cb01ffd3dd5c75185a46dac5fe9771a2c372a30104d547f2e26e20b5e7b1a775e9270b3331097700dd0d936f83804d4a1795d9840ffdf66fc4b7742f1c2af36f6671ed5285f6f7ac514243733a136a702faf683abe79e8657cc2c3f7a7e1c31b0a86ac1a214b7d867e8cf3b96b794f7ed169590d5872a53dd03615f5d0ff9fe39c0f50714c3191f52b94aa285ed984dac66bb3e4270fb35d89bc7211deac0f2ee6b3e24150d0bc61220270aa5a5c92eed55c7ea671799c2f6ffbe3331b0f9c65ae1b6971734f8532297d4d26a92a0020c8e5c33d7fd7e819499c6f43cd51cdeebdeeede9fed675d109ad4a85916a56da66ad899099521d85e1461f293d992b32dbd57791398f12a48a3b6ead5b451d83765dd8870612c5dafda2facdb3103d99cf780d516ba0e71473cfc2874ee2dc82c19cb80a103e67806657081776de8b8c637eba11dd31798a8e104cfbb46a1b410f133201fdfe8cdfe40e51f0d02a9d715d9083b9d86b526ca1a716f2d304622727694d54167cbb5f3e6fde3e071cfcb186557231a275f923753b2852f5d93a9cd34712eca3dd7c683e21b6eb64de2fb5a6768e618378f618d275880560102a08d95587afec4c5762aacde1dd2f95bee4859adf31c59cd2b27ffd40f15cd2bbd4023ab68638efd5b54b1a68feb06c32a5ea6a6e8aaf081458467a580033477366169fa759d1ee7dc9e9b152342f8911629f8d425288e54474ed95d6192b96dd27dd2b6111fd72d8064c39a769f314e6826aac6373995aea6d3df5c4238ee87e7f1f87ec9405a36cd53b5b6f844536366d146fdad32a908fabfe422908a264e0d7a35a50cc31a8c49c7fbfb36d6d168b8a657dae5c82afba96f8260eafb0338a95324d95a0c8aa65c4e00c7b0cb3de6c43247fe7f4ebdef496f2477a00ff7c04239408c4f714d0d9b626ebcd495eb362ff1b1c8e85ab45c413b64d75e3d968d7e79132e5bb5b43a7d91903b30cb8bff42710fdaaf60b0db2750ae10840841f8a4bf073fed3e62a579481fd343d072aaa21ccca432f535e4624b7ab39ff49c8a5b57b751927fdae7151258058c4941c0c56172a6218cb5f098885521208708bb08ff8dd3d9fe7f77e77ce352889a7bca32eb8c50d99bb3982093b7f9b434191344030567323ee2c066e44c3ab748832f61279444f9a6a133a10a3d9db990402b930eb86c29b58758f9d4fd4ea6e7ea78d68204f2d032116b7038309daf00006c5c7f11532ef6efba36eb70deb5dd243f199768db1bc286a834ca4b6a0327ec3e26d09accb0778e6c9484318b82bcd2da90e43a7e2adc7362651ce893645c664978afdf396cbbe5e8a93bd9d59beb48e3d2e4f44c8bf46a2267cc829a313200f6c8693919a24878a6cb8eb43d400d28d3660610d6cd8ecd80d345c40ef82d4edeac9942fdff81d92f91d95b333d76e531b0e43aad5e102fd62e05073237c292598bbc7746e31c69fb92b85957e2dcf07749fbbc20bc3d03caeea6d6c45e868dfffc5f6094eb5cbd9334a8290bbe93ed2ca7b92fd17649ebb78b97bd360adda45a54de795876e7467efe3534cf4f303dca30a900500aeb4a248b5424f79b5c47c14bd63c122420871755cc1723033664c8ab37c7fce88591aa64689899ae771afd47b3235261bd1214e1f94aa7891af4a04e11f168ad9d74b1bd41a29ca2b28046bf11c989be0159d0192949bd3f525009bf942703b8b745c2ec7bbd6126930a36385e9928a791d0d161f88ee49471194d664ab35e9857975688735387889d2b544a160cdfacd319a152d3a4ae26fbb2e3d8a230e9caf2ec0507c50f80774566294ac4beef3c6986c87237058a7556bf759d371a35df1da626e0fd3bec41004d1dd0e70a07d4b9caaf46bf3c09fe16916b1a85f9b3333c6864aa68831b946232ba62e9789a145837ce26c8b29d2fcfcb4ce6fb39e275d3b526dab35faedfffd9778768a51669a960bdb8eff3b498c6ef93692365640577fee5e84a3c16821d83eda4d10a1d5331d7f6639199f0b7a050c7377b0688609da83a59b9a2d3395fd48541bf021f4f860000cd59ffd20af0a160d88e97f015c9639cb56e2e65544b4dc6e49f378cdd1a6b453ca5afc9112c43e8a2ba841ba36fa37571f4295d6154522b13de14e68a739c6c6811245658a7dad74cab756b8814da6d15d83e2bfeff743a460824dcb605f5cea608f80a4017b8a52ccdc670323d8adc1776d7417bc1367d01a9d1b00e6619f49d09854575e08fead99e01ca406e375b0d7c8f4e663e1b5bbd4fc600f1f87b66a3af76985896a310c998a1ca210b52626e45c0934cca956eff465c5fef518c9d50472683669e94af734a410052b98e7a906f15c0adfb372f4e4a1f1d74f5e021398d2f972e8cf72f6d2f49fd63ed2e0c3a54e946f844630500a788ea2149f87ab5cdec342ed62d092db44721c30ac3afb293c5a6ca3acb88dd0b141652e248025ba606fad61ec8d52b75a30dfeb6e1dd9fb835608242b33329d16b42a8435160a191ea4bc2ab3d0bfcefe82275660b0e681eb2f4bef0cc9c8d86d8ff8fe1970e0e0e20b763100c25f88fa10fd59ca1ca9243c8e3dec97a1d6eb7f79d8841ab83279724ce35e1a8abd4e158168dcf388ab4c3d1ae70413e4e43d141bd0fe7e13854b960e0b9a4b525e86167e71c7241d7262b77c501dcab97b36f41deb548eab63be18f9f7cbd93fcc9ac6ae1f02a50388cc725b80200249223ee6262e6f92a8533abfb6aeda0d7b8ef0edba7a76be6175f4366080f604bb61bdb3dea335d232de2752ed38b02f2e2cf253498a09b75fbf40cb3357851838c01b23ef518f956f8aed9a459e33877f2e06bf0458a4d727f01af87b0db785e8c8c0fefe4065258ae2f45f67e74d5c971d96fa92eb3067de8fe986e0ab7395f200150cb679a0c8a96ba568fb1be5f89e8109cd9d4b93afaf25153e0c38a08e7ff08015bc0326c7f5af667fa843e3a1bbe0c7fdca81b7f7c03906e5a4bc28b9b6216ae0bbe6e16a9535a06a16652ea016c43855c3948287395323465340f25ec01a3c36592bb8f8b185bcf2ee8cb03dd8b4c49c308cdea643fcd628bfcae6c5c4635cdf3ed992bb732820dfd8bd50bf2939d399b872b29e06ba87529065ec35eb8534a313f859f901a536f97b02f67030dacd15044de6b5a9189c8d6f16ecf85d072a4a8091f4fb8384650880628a96161f1ad8bc256134549b7ea104e7ce544171a89b2caa4b09224e14d38ee6f57a029022aa87020d6331cd9556f6df7a92bf4c155fc04e466a058aad234e941d641db64d530dedd18965354974ed06d9f9011fd95ee382cd6856c097c06876eb9b8f18049af7ed95ef1b5b03c29365d1d32c725c603e50c8493a783a72839447697f3ead49ed0b41de79c829098d034b666bce052d79bf1f56db3bfe0147f41a1415b1b226964ebe9ca703251186e930fce4b93e8c3bd7bad761904b345ea04ae57bf879fa9bbef271ce945da2241d66dbbfbd6f472ca18114f40089d46da0c124d69b6c8ca363c6a716043b840fa9d74b2562fe24f5245d54ba1220a91ffa65195123f1a657462285a6da257ef09469963e2f54ec3e6934e1de4e787b19b8200c1117720e5f6eef52a79e855a6fe7060331acd966ae76f001863cf91206e2d94441ff568d62e3135740d9c2de33a995d92761f55cee5577fddb650c368c7e780a076405eb09ae78dc9a1244d3e5e2fe6147d71194a60eb31d045017ae5396e4a68bcce7f0fbd60428dcd173002c9b29e3ba9593d87da78aa82985844304310760f6c26464e063a1852f9eb72fb1dbfea6a723e5ee1b2ae6e8748db9bd4758c87f70cbe40e625e3639bb0278261caa65f4370a6d9e299eae230bef20e4c3120f4d2071cfb727ceab8da7841eae1410461391d195b24f0ccaa216331f7f2167c4102f3b8d27d7bbe8c91cad118f4116894cdf00c4f0347b21adbee22058085fd011c5b186261b2dd4354103b9914cc316e74620612281f39d8b2a838a3521031998085c227c9b2d59193f107f7cdd20d52cf0b8d60edd7d2586849ec5df145a88ed23c3caf0fec25ebc3d5cc9179b33ae6305508a7df11fa2e4f1bb391e886c05573c6fe44cecf5cc67646d002b2f068ad3ac70e53665e3faee9b634eb92642791f7ce6da560fcd8962dccd8d8040a14fc50ea14f03e0d116ecaa1d6c7a95e3ca8e0ab212d70c527ef5cc04d6de770ae781536a30aa0af0de264672fb277d57e2ea0f5af6968e8c93685c98450d7c4b384fa254f0f48c483ae395e9638988a7a77bb267ec5d3b84b102b61341d4f66c2c7723e6f7a90ee1136dc20a0c685cda038b1c605ef2bb41be0cfffd31fd8e73aa4000a8ae9137c44f0af35d5e8ca1f8dd6074cdb31eb7cba3ce62dc7f4eeb6a99f45e227b73b0f8d803516bc2bc000a1c43e33753a9d72b4990053a9290b658e3d968ddc719208594a003bb9ec22017aa7c9125a65bc268979a109ed28a96466f374360fb4930746d2831d55b64ab276e53a51f14fc218a7433ac91a706343b25581a337dcc88cc4ae50542626b4643501047ad05539b9acaa5019a79ca373fed8313dfb76acf95121da5891a9e9b7138faa158e129d99e80363641b0a0485aafff56eb0feaaed7af193932eac752bb0e5ad8a7104682a17e2f730eb44e0f9553150cdfef16cc9b0821eac63cac1329ba781723fa723fa8acd8e28aee9c33f7c10d5d44beb4d2e8057cdfcc771785c2259c84520775b8bdf278a83cc4545d89e22f70a0e48d67c78e7442cc02ce508e350e47bea01694e73858f0ac9f3c34529cc26e7ec969343f8b4f384e47991d95d31589ef2b1e7c2f66c1e063e81e615ad8107e63d510e058e456ebdbad4294e0e8fb726c1256179b64f9a0e805c08ba97f5fc9d97049141a82d183fa9c8f5c765a0629bdbb830e361a4859c360ea5b4877f8776702dd788e4b0827347c4a1e5f137fd76a9070080570f8337d5f66783eaa23af96f395b3bb28420010b63981a4f9aea3fbf7e4ae124f50559d6cfb8c93fe2899ecab376eaa01c93616b0252e4cf6dab6f95aa6a8649d97e8abee703c4f5d4e5ef3928b5061bfe3f0ced3d5cc5ff14c37ec207f9d03441613304d8e327baede2633105b02ea48d956c1871304e6d14d4f5ab13735f82a15ffb3f01d161fd92018338e6d2b4d86f3927635a57ee7802326cd7596194a39dbd3bc41e58f41c55c5d7b728a74906078c9754354e16de516e3ccd464f10157b2b8d3a7ad46eb5cda1c93267a85bdbdb226471be8d57de870afe0366864266ee0d6818a3fe32485e17e04100505db87e7ce73232904217177b18f036b1bbf65ae544d52610df528bbab549af39df3a560ec81c5df136068751264a335bed724645bc068dc6c642eaeca0e2b0bf40cff65a6fa68d1ad43b5b0f9e47e8ef473934a12603277a97c7d0304b72a16b32e7d3d246573c878d041718f99fc3e659d9aa8a2b819fc6c42fe0280d901dd816107328f4a508c1c11f2fffb0a860cba5c21c5324d86315cc099f267fb172507ae858a0f3166e5420eb1a466bf82c19bb910eaeba9dfe022fd371de0a6d4b9ec1cdf8ecba31d9b92ce67a6f8415a25afba4f5ff5538dcf6601bec91461a060d9b4fd86ec27dd75b359fa4ed81774009f6ac66c77d3f9c7cfd5183f2ab4e3e1767dc7ba99460e3c4eb754e42fc93a1a12ce5e5999b28a8f05802bc74b2705056a7f2671fb8718b80af15bb024e0123bb1f0fd6d8577a7f1b10ae1a89f436e945ec200f53a7264b1900df9f9e0e3662a24d78cf160aabab37b7c202c4d8f8756f94f3f8c7d8f58ef871615098b5a9db0128bf42d55d32a9e0addd2997e94b612e42dc97fec675d39981196264ccd1f9524151b69897b5f7a0735de3859d86492c6648816b181dc596b0866994bc554a1017cebed2729c10f198c2c5107e5fa9c48fd6298f1653b15a7026caab1caa49b51c84b005566b824e9eba42caf43def912ff414fd79ce436f40890a0a662774dbe0122ec3bb9ac831e592e107a787a71cb720c8188ad3d84fc21bac55117357dee305af703aa05f261dfb247900e35cb1b5eab772f20b0c66455d25fdb7046f4895dda6ad2c12b3a5a841817188d76d1accc0579f27ea3c6d7acc0b76bf5127a388e8a8dd3878623b05048c93a7ba74923c304cef94e804afb2f6c152a2f02d7a3cd52a72b837e740c4b2aa420622ffc2b4c8fc06d18ae1b78e5bfc040a57cd271211a02053e7cf7157ea7f2efc976b26a6e8e9576659501f7d79f02d4dfe9344a93cae4873ee67274f0a5f9d239e4328831ea963bbb9dc3200bf5210e66b2c5d8294a96d90d26aed0a90d03ef39e1462e9d890be5a52e2b9a8baa6617c13d4dc0ed82602433a273d2b2c8566e51d5b404bb543c9ba8b0ff0e5fa4191778f494ade75b899036c4882212bd3a78092845b1923370864e8b08238dcd8235143e61451ebb5b44a0f3b767d1d3f935ea42c1de2a0ff1ce1e270e821f0ce99a1c827e309a8c1c69f896c649f8f4dacc7b8bf0328cce059aa0edd9d21c48956e182ab11763b41526c7177e728e072465446c9a56bf5af5125d4330bc8d6bcfd8919dc3a2821d8ea494dda7879bf3202ace4b86f1cb990960dc92dce8795cdf000e437c78feadce0ae750093328a21641a0917dacb97588a9a543a6fde8030d0f1784a342df4e1f8148d86b1c3bfb4dd243a7472f90d5bc1841bc53a4e348a12d34c802a72de7c73140dd97eadfe60f063df3ac2158a0ebd23767ae847013e281ee775f50f15f0f4156c75346194ba20418df742a1ac05e020fab7e469a4c1934ccf983e433a03fda13fe68d8f3124ff55bd266f3dd1c5dce52ef8a9166db8e6d57b6360cf9919f23feea9e4774245e018f344b24a99c2f5e879d9b0edea8895515173f704d1a77459ff4bc3ba467174f3b6ceb6586281edb361c7964099c5214908268b736230e677e828c5e8cc4c208e7e40e5c7da8706de8d4ec3cef9d30d15060778abd94adb224fed4553323a6531c037cb495046e3b232dbc3e99946db5db1a3590e8559c4e18ce5dcba26d0c596031fc13d724606e728fb0110e6a4fe7bb166a72c14f2362e25cef66df883c423ed6582249f18e2d5a62925e56051f8f78beded750688a160b0e52cef45e7e353b5a5688f5513fa1650e28cc7a4f24d7987958689c8918931a4e4dace8d61a5ae126bfede32dbdf21afb3b04812fa8e5a5aea2cdad9b16019783a9a8c4d757dab7a05afb1a6e4e47019192ad738cf1e127c782ad8b84cc880a142e698f4b7fdd4531f158a2fa3bc8a339f770595048f4a42bc1b03f2e824efc6ba4985119d88a14414aac83bbcc9f875930f53a62f546a642277fd07f807ef5efd3dc1329ab0aab392fa0c59848f1365b06e31eaa40feb4747bc246610d3e7b0883dedc633f85927f66db7178f9e936a541e30d10714457298720a9bb73b6181e7b46b4afde22527db7068f4525ac11a1a99c107ccf4215c911420274f810539984bba3f5ce09729aecc925e615654eb505b72ed6a31d79bce2d05876e571b4e266e5b21d58637a3dcbcb3d43113a764b1fdb70063500086ac271b4a88203c45fe96de80fc458f3d01eb5de44605310cabdb1dcf4cd114c3c78cd1df216ee0a79d4fb4eb35a0f64baab2e11d14cd9a49aa8e07d89b378cc98ce8d9b3ceb5a0f98f136eaf162b155633bdfddd21bf4bb23a81158ab2e5e10e78a59366e476e592506c7c6b223654e3395704a2f16cbdccc85ec774388eba19275d8f77173527286dc55eadce654d892838860d085878fff0618e13a074606ff57b3e52bb72fe2253b895c59f3a57ae8cbcf289db04f5c24f43e9e76f498c798f89209855a2d2f69eb0b260f9281bd9d36efa97fde4ccca11705b7e197086dc41f1b6967a673e3b9b38250e80b1028198c8deb5c59a666df3716336237bf7fea96f90fbae12a857f5c97e0cba57943c49554f71e6784b2461c181ae01de4857423d2036454799e22aff1e09fa9e5960718e9d4ab510e393f8db4744592a007c98f4f4b4f4789b50a7139574e5f7baa48dff78aed5f6e823054924a78dc1b8e51a117f1610181529f6d164ebf0f6406f0b02422cad8c916823759a361437ca17423d3fd84cc8afe486a31ccda01c732685418a32c064a7b9effb288e811ecc99adb2a759feecc3f702f31d9877dcdb717937c15fa2f163bea744400f58c928d2b93c5639ab06ea07c85bf7daeca9e1c6434f8811c9c58ded05db81370fe97758f114bce5d5a99a6d53483c1373161e9b90133ee799536eab783b5c941ad22092e1e65bfcf3474dbe30424ac0afa3fa77dc0d664fb61d8e907afe42b50e25cd27181bb3dda8628c60ebd4b47106d5fdd173a88eb894a676227a7ec4085e46c57be04f4506597dcefbf269f992fd1ea13f137f28c0b960bde81337711c9fd7b207e6db80059b0b9df5c08c9aa507007d1727fbc4e6a8eebe47c1d2aa40273b1b61a85b1569c19e71d4f2b70825c90dfa002d98d3a8c7a30fc802caf031a8f35a0f8148559171a8d31fe573d2a397a9907090e0d565aa201aef527ae36f799306682e2dc12b2fbd3a4d354d7a9d1765e8fefe7e5acbc4d878344d7ce4383d9c9911fb65f875603e2fd34e9e8070acb56be1d29bd449bc5ea02d304b834a49629a83659b5c2e97be2c48be0154ccec3a81ff99f3c24dd5051b40b751411441a7733319487cb54abfb823fff088104a47d37ec100b566c37e41f54f489e04aabdcbb772d7da880db53bdb80f69ae94b7fc905f43d2e22ec2cdcd1747bfab9e9280c770ec3e63545315005ed7dfd965444eb1b80138ce0d383146ba375f7928178adf849b7304b75a67d09921130c61939a226112e524f0e33b10a78c1153d081238b1b00c391933a71b7d1b3ad4e6feb096cc03e82ecbe0910b5440e7c407e1a72549de5d714cf395c3c6e5654a87796c3163f4db72c61f3dbbdfb8549481a28a0c17210569453a050e8d8d2b02062daefa844062beec0e9c2ae33b81f738cf4d45b0249e91a07b7744177ef6ac11600b5aa39328739c332ed125370a7cabcc637a8b65a38add3c5f1d1b4752a907c4f3ea58599721652188570c575895492e6f132f40aea559f14ef20f52b97977c11b2219003958b55e1b251f08f6c19f79b29812520a81a53ea95b4a3da5addff8c39a4c23897a3b4d69b3c3c86f822d12e071bb2651905d7900b17274a1b6aeb0af9b883ff2263573f69b91121d6760ae7b48a01a1e61d134e7ad1e74381472ad11de43b22dbd527644350d729ae1d880e58567c9bb66bef6b0a684d8d347ba229cbb152676c000a8c528af667272035eb1a058a1d32f55431e266c0efdd0e3d5c2ba530977dece901beeed6a0ea86f7c6232192ed02c528e62b53a7332409e1b1674a3d7ab5a2ad09ae05e09f9f57b8e69b32fed4cde355d30cb56c1fb073786fa428e2d7bd293ced4a557a2bed9c5f94a9be359a3b55c140ae16767c2a54e9df0dc585773c8980f5bc680d0b7c5cd418754f9f07f525567438fd2d1139b41c49c7ab9023dbcb606829c60208f59fffba286ca4e3a35bfab9d3f3f9a8869cf9f5fd6269a142f6c390bcf5bfea006dc8c2ea9eacf5edfd9755a77f4207b813682ad5707ab9181293b39a7fae7944cf1777e26b1f0679151491db2970f778225131775f29350628b71aeeec367c6accd422395e65def2aa59b59879eb406ed09c520cb7e0dcb33e170ddec2bebd196de70b16fce645fec54e0905f81caa412531d5bcfe0675c85f9bd3928bb002fab9387aa2cf0b03456ddbd54b2d69fd9a29f802aebe02c9ec902bb633ce7314b5b8afb7055e3adf70aae86091a03b0020e5da210b7e3ea0c8dbaffce9146fbbf17235096631dca327845df300dafb7c7c60bd79fac721c103470feedbe40cbe56f0b0baedd15a15110422d6c0620f3a55a28b53a42013f646dc33d432c6b2e78d390a10c4c51afed7311f51f8c0e1ff54b42af731117c0539a303f61542c9fc3e5529541095862521143dacd07dd796219d84adc822c5b783a3689bade1b9c6114df7cdfcca055496b3622e71205bc663657fbd91dc54d4cde5480d222aea0dac285ac5adebfe51de1877200331d456c215056eb5c69224be6f8d929ba6c599baee3c824e80dbe5a24b65caad39aa0fe8b4fd0a5c69e76eff4b1d7340dbb031e1a7844d051103d88a52127498bf44b97a4a4ed7ad4bbc7c3781e2f83a53149fc95c1a6efa27def23d376866ec4b0c1c23e0e21ed1f677140f17c268b1965aa91b15e62d5749d4fb64024ee7d06569ff897ca026f0f282ff2f17a70dcc2ae8187fd8cfd241004dbaa6b9ab416c96c32b5429703930c543053e88782db49928b39cafc0a4e2d3b1f8ac6669bae96583692dec3a9dbcf924ede5731d11916b80441ba19eec624a687d1d106f9b6f5b0f7fbccfe69bba168b81cbdf7d018a265a91a3b652f3e9edda11a2c0a52c25fed035a8d95d7b53a2e28799d48244c7541d64ddf7c4fe9e45707ce37df3b434d92e5599128585ae2790c8f65b1324717c3183716bdc58a9d99085874f417dc47192a539834701f42cfd0c8b7a18e7b027feb6061b83483331a3f6373e77cdfc5062ef2d338c364c3a911bff3b7ad6abdcecc7440d9f1564d612959a537ded04fd08f9202a3a6ddfd8b4bcfba61f398b23637cd54b1908634f442b59953b250500ea8cb8713aeed48eceb927c2f0587784cb9f5eddda695924a07f1b0d9abc27e2726f9d0f750154e447d82a97d57a98888cf68ac9c9806dde905b89c180fc912a066c780cd2ee876387e2ad2db7e916b60e4afe19cd94c8047a854abbd62b6c601049f17138fc9492f69e578d7ceb1897b96265d5d0ee911ec8c607038592df0cf7cfaf459174a4f9fdd6d1be0ec9c6b1f6086503b9d7f1b5e1e6689f747913b723c65b90c49ede210250c2c853cb498f2b02a6ad709510502dad14998a272fe8fcf69c5bb9c26b916fd5d3b43538c9b6c219d1dadc70157714e3b4f9b1e65c28ea261bad582872d1aa2dac899b5a6db021158e93e7b228b2fe4fefc5d0fcc2fe5520808e89181c6a1d20f44f6c775e03b2be84df78a1738a53ba6e07ceb288f2a5aa720634d991e32e76530e92d8c43adbdc5cc678871b867becd9c69550d78c428d991e41b4f8c447f673cff4c5c6da0636be50cdaa4b2fdfadd70b0c1ed65594919edd98f17996cf6af9997a858c6d9a9550866053290be5c510dd1b64aed4047d294c21d83ee02e9890750c623f7bffc1bd6f19c9dda4f6fb2d44aa698691f81be171c5b06c2acb48de6a92a2078a9c82ab13e05690827b18d648a1768715d9316f566ac32efd10448b80f48e0b24dba0c37b9e406a2bdae5b2f2e8d3d8e710887a03f957aadf645340bf1a6e74d023e2acae39d092297d276a4968c8a39003e8ab7e5bb5085b2f3ca530ed8a6917dd110eb49b4e3104caa9a555079d0d961c18aad1762571f6dac861da5329137f6ff59396aa026e422b320c1fae994083c2e21e0434ee0d3acbbf1dc635959a924256e15b5033726d078947ae460564de5c0cb01d7c5a03ae6be980fa7c1425d8befca00b742b640cc577fd0bb529a030545f07 -MD = aa13b83b4db9a58a7684bad6b864abdad23bdd71b4e5bcab1a8750aa8e6b1ca70730a7b9ff684fa6b73a70ca75c55aee6afe1b6f573c8fb6ecf3962a30e0af0b - -Len = 73096 -Msg = 32670fb2a42da76362bfcca8bb8358c17a6595a05d7b51a9c8e935b6bb03525e02b2fd77ab19ddd9bd7842652750b846f7c8dd77cc4f6f858e83a9975c51d0abc65e09223da66d7fc7645f6cf8311dfe1d6f9639bae87cd737b39945d65866efe833dabd411e80dde94accc4146eaf6f542469ef0e8f9f242b42adc90f5d3db0cff9194f9ec73d7c89f33175654f952305adfda0b08c00f6d1f88c2af1ab7c79e3786de13eeacde311283488d11bf8a296d3fc548727c8d4939cdf7063894ccf8c787f7a08ce579ae7af8004421cff72715e0b137da81f47d8f84da34c3ed53c32c0f622e4bd042a7550bbf19f98d31dfc16d4e679562cd609d27fcc96133e473d197be1bafdfc1a21d58e57d0d89b2ba1c3ffd4647b18098cf31cf32850b079154bb6c072d766f25504a03fbc248022c72c34e6245d0a68ca23cd1eea3d5258221e4ec6f5936a3b78a79ab04dc4aa8cd51a1a23a2442b7c2b293a57c4214d6ecd5aecfc2979327cf28423b36aff40f035555993c67aa3cc18cf0aa59e46c8437cc63768f7d1e33d2a64e44ffb1e6bd74ea59a3e794699e0f7dbe61160f2ec5d982bd81447e2a8078a0e848ce96952c888d2852da1ef3541311675a1f26ee1468a51760802f5a760794cac721a281e4b4ba3c16727bea1762f48605f3c02ce86b900ba4b0e5208d35fe4040a77a3f6e8ffe1f7f4f4fb020758394e5327f5dba38c004be45541f4e5a59f335be82203280c54ceddefee837d13b0e884999132276d18d3debe0a9320b145e26d56ec6c92dbc4ef29ffde495fca77d6fa7b1cf89ac312f73e30f40c0bec9eb849a74a5aafd2f901e00e157f35e454bfbdb6df5882f5b4610e9548882ebe715ef6c584f5055abaad0b03d94b88c9104bd6302278696dc7b956d44f2e1290887b7c96e2641edcd19bb0c573d5dee073234cd32d80d69212a61cd54e273ec8a9b8e404abd082be0472da3e2b46c29344ef2786479952cc5fd16a80909a3ad09dbd35f62960b76a1cda8e5548c6b9494d566f30b9eb648374e247bd5cb08f0e2c317753a23d4746e17dd6f2147c4d6b54012dbbcc9d941f1a80bc74f990c4ec1dbdb3055f8ebabc1a00b9fdd591055f2298690ec5d76a081953cf8db06461d03a08f0f3a87c9632910e405fd42d698e7fc22911efc36fa739048af0c951ef2449bb3605c52f65120c4d71fe59760260322777ac91862a62423bf5858c81f54f137d8d23fdceaec3546556c3ab97573e05705ac7f24b23a2fb9f1735401cfbb960f7fe359982faad31fff79614b6f18ebe45db4a5b38e3d02dd9f8e62f4989caf8d09023e172d0386ac35a60dafc56b9264d001d1475f152a091a0819f3128eaa2b14cd51dc7b8ccc9588907469010280531d329652bd5921c6e18efd9fc5f812842383495a83ad114678c75a09aa74223995c54968218f66918671625d1b7f7502a5f26913edfaf149769903044a16e472ba287eea141e84e3895e0cad8b7b4e312c69458b02ece91912a423db488163b92adabb6b1d8cf9576ab34123be720a8a177673327b09753fcd7721112e3a1c57485a637d966130479b0f9431fcfa4698079856acbeb7021817608f2873b77ae7a3362b642721b64eaac19a6aef8a6ec56d4d845c369c2c4c811eb293b1700bd4bbec57e1384517c70a77b8310e990facc90470b38b2f60578af05fe55ffa3bc902eb9d675241c16b4aa07226d2ac85b8ab6b906514c72aa39593db8fd7bcb71f08b250590dbe4f85dbca5caec44b8d7374e187c37c1a07bb5167ba15d14dda614def0548b3012eb14e63dc5b5bec6367b5e4bb61199e74291eea7ff9a514221a32f040b8fac0cb7812fb759f1205c3f00f03afc085aaec578e9aa1bdfbb62ab46844872c3d53b244b9ffbcfc8f3e1bb6b0bcd96448e5fcd10106a3d52d8a50ba5e7a4d0503607fa1b3ef26f61bdbd7367b8eccbecbc6122016ad0ad1b33740b675f006f5d54d90098158280e509572c9afe7fe4296d1c8cf4ffc4b26351357134f4449513b917ff6b2b944c7b5c19b1ace56e292228f8d391d82f9552bc5206b6af598b9aec2bc03b8811194c406ac94675a1e200755dbe7ffcf79f0ffb31929297259919757b08b135df30803cb23b10b70057eadcb31767730615c3963cdd73b59106b8dd71a27539e8d93ed95ad0b1b274d009e662a4f04642429515d9aeff0f851ca1aa73552e9c125bae9dc850d26ee394841ad22ec37c956dae0172cedeb0ea21f967ebe884674700f91265831af437ec84016b7c871de6dd35e26e06b99da65eeb99402421a16e0e47c09930324b562031219658e5321cdb533e351c38dfa31b9ccadad1aa526fcebf2ecd21c17b2a78b205b98885c221af309f2fd8027fc7a0378121b7ca8232888ae4671c708d993b30323ed50ed5dca1f38cc404c085fc34e2477d9d273a9e84cf6ad1eae7888db3d2328b07297335f9c58e5c6619f72920c5a3564c69819d09b7497153cd74ed26c18b0ae67da514fecd2c5fc8b6df36ad0a1d148d396017606a08b11eca5aa1dd24c82139b37261f934ee35f03e440a20d63d1f263fdef2d20f2ff81588419020246e3aca72e30432215c46a65a2f8fc4548cdfdf220317a5cf46adfeac31a437e907bc5f63ffe6f1bdfffab4b2a7ace0a991bd828ad76e21d1d63aa2e132c4699a1b0fc12dceed7e2f5ebae1edb449bb00d41fd52163df903e6606c9cd4dd8ff60309bb879580220a001ecf4b45e4f9e7fde6ea28cae53383d7f793a1889c94162d0c70cefa60e213871fab6aeaea4d14e3613af76c0b063f7a8fbbf6bef7d77c982fd8436bff7c71e354aef84ab319c966474c485a2e0579369f41e6e85dde9bccfa5e9f7aba75b7bd54666dd5ede477ff1fbab615bc95c3a4acc20c855d1df643d2503d973042476da54e562cd941930640f2bb3f355bc14d4eb8d216742a0e856e69a851ef86c38cbde32bb02395bd245170b23736bbd488eba2d23c1167571a25076a2b46a79e9304b168f05b6568c1d7d1458e2f2a9ff019fc8746d37a627a8cc5ed93e4195af92035986dcf44f8773a80efb48d4c660b30325bc738b7b31f0c01cd2c26706b5776ec34991da91eacf00c1b3aef85d942e4f0da4d9fc3bb8029576344bc314216af41c802c4f63deb9edf4291b46b5c2fae948d3a97130e367b435a8de3d091cf0fd2bd3b33d0c8bbad7710597a618139d3b9ef3ebd1a0dba68321d585bd2bcd93f1b9e8308bd5185926feee2a00ccafa1abd7a9a506d4c7476c0164472bc45dda388e6aaa2106ae1f42648cdd3c1abd8ea3ba9fe1f714d0d2d69efc2d6f1af34d3a72ff2ae7e77493946a88b7424a65ea8a107da68ca81ed029c1463d7275b8755f2d4fb7c5bf933d82da8ac0faa4d13fc8a1eafdadd7d8c9cc30e9811a1fd4d910860359a3d832a5757b39014d702614c5358fec42ea274329b48e01505f6e02b347c31869787a54d6143e8121f58ff2e894147e332932c8a714ddc4fd7cae76b23636fdffe893d10b6e4049607c32609b8520b868dc22dfae1a7dd207bfbdbf731c050f4d70a4a47e51e85ff04d37e646d25ba4ca4b1e11a68c17335870c36560c0d8573b57d5569584decdbbb0c70c4f416f493fbe4fe4f73352f0d6d7e7eedfec55dbb2e7506ebad1c99ba7ed0a5b1f9b01afb07cdce20ad7d70f6b3b52e45a6627a598663a7454fe52cf9e4b275a1ea7bcdf06ceee9345404d9bfee62cce38f7f4bdd71dbef0cbd4207387134692b42f45e027fcad7e11355d99761e9c35e16765295554016b861bdc8e498e91894af947bafd4e402bd77faf13bd2ccaa0bd7e21f3fc532e6def9b2d29ce012ec946cf68766f0bd022fde6ea10ba58df973404d123b2616b7c6d1bbc4bfdb745da1277501b647d84eced32b79955e903a2aec01cbf61c7e022686530fcbef7ff4214b9a8b1c6ea85100d2bbdb576295d4a937babd1f0ceb7e6483f3244f908838bb65f18417c9bfa16c799a56c055e16164bfd256047bb155076726a2c9633fa3c5f2f47d16ed80c87824316c6ead1558f3e0e33754ed924e958c67fbb7ec08cde76f3de6c84e9e3e9a5f2b9cc0dca433bd4767d17ed6f0c3857021afa97f760f865718417a615a6c79a6e3685579008a476fcaa4e0cc4f5c6dcf0e2efca1f9f129372e2dcbca57ea6c87f34faae6dcb528a6a6222932106194d5680a4008270b568bda0c2aee1921097ed5b31fca7b4cc7a864f9c6ace67bb13fd9b211f66fc674c1c65d164110b8c6f7f54342787ed9aac1917c37913413497addc6c10146bb3a755d912c67d10a3b8fec70b18559b448aea62a0a938bc0a402dea8fbcd4e41ee131a58cbd6dcadbda335bbcb859e9527ac3d939e084ffc775476f920aee8f32627871482f2860bf3de3b951eedbfd4de66a2398074033f2a0c1107be1a9957693f2e44c06f7fbd44ad989d1a122ffbd35a8e9c507b57f14286477542b4e1e72da66a7a22822c3a467dc7245bb771828cf45d3c6c6280cb475f84c25cf2551afa09e62527ff1dfb6fdb31cb423226f181c0988a52ee4015aef4536f4b57657b44e60bc62f1ab789275273026c16b2e1484bcb16a2630878ffe12decbc58958094a755ddc689ab5c1350056a47d997aa56f25f51b9553c6d90a29ecb1e7a57b37fea5eec7cb04bfcaa70635343ff67e51450dfdc26596e5c37b5007af0314e8c5d0b7172c0232bd35320076e1efc85fa36e3c71667d410dd2b950d7cb011cc83b2a757f12f46cd88b3db8c0b075584820527af810c59c65902cf1050fc906432273a5cf818bfa385232f4bcabb9ee5f52598f3ac725ee16843cfa3983431a80011310ae82ae230415787d12d9a4d2ccc0ec42e0938581473652351a2e589fa860727ec51b45306559771b69421c4bb8f2715c927ccd9b212fd4685118eedfe2c7f8b7bc56396982a8979569ef0aa24b7152a6f78be585ccf62c5c8649ee2057bf0d823a3b7016848940b5bbe75720acc4f5e5b8c7b5876f13c0d960ca41ab2ecf19a8e7d1d37f9285da410732e90a0473c4e47c3926e8320ffaa787a2cdc8908084f26c204aecd523cd02f4d9aaab7a07256aece71ef23e71418da4d97cbea559b6257130bea474eb81c02be3814a3707823eb0db86ebbbc1fc545f7835d794e2170c9d0a15f098655f435458552e62fb42296f1d471cd18895c45f85df5986a3106e99b53918691acd52164110a0246bcdf3d1b347cda64c73a54d0b648da22507120c3910640e9134b719a599e8a5e08b6480a770466598febfd00fabbb11ef65c19f9f841bb052fd38068cd84e0ce2e4432101a9ce34f19eda919b9c2bfa899343faee7c8776e68e9e85feb51a82f7405a5fc7d9ae3be1bbbd37b61f24867cf760c42edfee89d451b03d0418932ea9076fdf03ea2fa4efbd316b691cf0dd4ffbe0a667979910a4ac38d7a5e902397fa14b4cbcc39794a40cfed5bb7bd5268a068a47a28bd034df09fcfaea10afca0176b64cfb4c2e358610ec1cb4241c8ab67f2750e7a3db1d0ccfc64fd975e20ab8ee7887c76d3eaf1f32c2e95c000c305ad07f683cc701f2b3665c7e7d01e3202b7258a7280e0d2af7d84ae3bcf5ef40fe605a38abdf8bdc5c36862edb9af935e3681f512617e4cd946c4ab3dbec0be42a9780673bd3c10290a70e07fd296e71663a952fca700bc080548b00c1ceaa4267ddb99ef48beb8dd621bbb3ea9788fb3e4e82e91b02ca2c43fad573778112823c9acc85dff051a4b70c54d7aaca90fcf20eae2721b3693963c4f0b404ef8bcd323682c303e83b70bad0a21e46accd9b0be1e190e56c2f0e6a1ca36a70fe5f4bd019a301695cf01867d56d2dc5248901102ee2cc6e1666d4e069b73dc498d4239eacf7e61735b9c546837caf2f190a55895f7a84c59754b24b12f5d707a4347e2455451b1759de9fe043994a8c759ac0ffdb7160f0d941d1358122dd410ac583eb7d574771b2a7cdbc7b8aa6e51f7f6af90a8f07f9c27758251d09fa7ab2d05b7a8df3132b275b786295186c41ff017aff549b22e73c3d70a44e71d4bb849c2d59ebe2274f9f44c75bf70b44a9fd6a1999215f58c32eda41397c21130b6873221101eb2ae404a8e32e0b2bd52401006e50d9a152947f97f26c0fe26073469b622936d8c5f33dd0f3633740c8baf30da2abe42ab76219bcacc56f7c63fa065d1429f1709f8332042083e511c473bbd7dc33aac23036e39196cd05b7c3a8900160999c7a619ccb8c92157c67725841a7456e94306517c55dd90b375b2885cccf6f029ebfb246f0af70a1640a7a706ec405e6083efd0da76a9c076e2f3c9aa20f69ec5f073b8a89b6e2af04c283c4287843236fb2a12071fe084a13fca4eefb0876dd4719a36f7ee912c8c657355a580927ab3255f8590b62455b8c8a0b89bd03bc5fbebf93feb790257311903a3ce7c0da08b7efabbf5ede7ac243a11774d24866f92cbfb33e1cf346394e363772bbe584c26848615a50b9cf089e0970b6201f9a34f9e2aa37965a9ba1e311d702bec04c5fac27c333ca3d6db40789bf5791d080968df021f10b0c4c3339e9bff6d6985b69ea567851b5b07c4ee5ebac600ca242a950b1bf7565528277b8869a55edb7d9688c9b29bdf75b235fa0f5ded878df05f5abed2dca8a7465f6c8b00e28ea63ede2f9bf7e7d7a868b6ea070fec7bfcdf401046b12f864ba1c37d22ec376b5e5bf61998a1e9b2479dc034c23b336c8b43455c4f41708d96bd0c23cc963473685786cd4c3b21edf7b3da60ed8a62b7bdef0795450e401d3d1a820704993a4558a408c1234e10f92d5d6e04d557fb1c0924ef61a4720eb3932cdd8d476fd93fa3e3e47bba3547525d0d0387263e5cd7f17765280a073cef3d76672d217491f0de79b2837d9b3587fb25337e3ca8089a0b69118ed2587b3e8089c77d1f61f4d76ce7eb4ee9ea5c18ac386630952f9ec0bb7c7cdc99c01a1020d976e39d925271d3b107549b9d2b62d4d92474cc3f8fea9623ffb7bce8ca1282d7edf718906b4ea7579f2aef4e34250969f6815e424c860fe22296d83ceba42b17952e3ce68fcc6c6e0b38615806adbe7d450ca7e265119d597e006836ff439e1b250f66ff40897746d413ae55038b7885986d559a5a2bd2dc7a7ae951857f3054e60123651df47c84a23302cfcb3cac157929c3d4ac1324fda06cd8371ec5965780b9fe92789bc0a9ce1d2b22be3fddaf6fd89f2bdb86283f785cb1321ba534956d80551200fe0828e04873e86d1391a5d4d023fa58f331146ad110ed1c9caf8104fad36e27899784513b69ab58464cbb50d71eeab4c8f40f005053b2822a4bbcff8fd6015ccd133ec96c98c5f04673325c23dc576f95d591d161064cfcccbdabb5c5e9662146ffca91527dd2c5a2b9ad6f6ce8daf9d85a4f4669b4f6dcf259dfb0239a271575b1ba4193855c68d974aef308c0dfd41ee699e7f0cc5ab349c4bb872f44ae99d7dd8072964bbd2a5928a99f9df0f09ec82f043e9cc8e3102172e1935f95772eebd7af7ce13d9fbab06a1fcd82f597aa62880092a4472a6417d8c47d2ae90b653034b9e8fad75e6a6dad83f55e4b5f977c8631bccdb39b2fab8ae69d17dbf5ad3379124f49a583e9ef6778bf866e92e684bdf9f57f8aafe34afdca8bbcdaa09774195b185424aa99c42c6074a1dbdc080973dbe51058f32f74a5e2c17051a6946099f6bcb0e12cfa6a60cdcd272fb58c895c59f4469aef64b717b1c6d8fd7224877f77d4d647a5ac70a933118cb699d462dbe6bb78ccff0390c7ca046d2a9dd8574e40d93ad48ef0456a12fa591d1380448724933d6bccbc803a9e22836584206e6af442652453867727ffd002df9d00acc27623faf3c2d013e4a079e23abf8d2b7a1498db939ddf74675c5b105a90e5ea326dd637f16bfeaa6a73a2d016ca8f1cd0045504cec86bcbacaac4183ab9a0ab3b7e327ae13288e2108a15f3861f96c12145ff87225dabfb7c8dc370ec61b16e6219c14a4fb10f298b464bb3053944a6c27c00c92ae810723b57d1b0dc1398822ae2fb1c9962120f4f4acc952092093c57f8f14164d249ce8dab676ea659d6a51a4c58686ab011f1b10a112044d464f0465f59965cb6b87ec7fb0cf0c7aefc35a4c851c410458f7f7506a1dafe5ae8711211a22e7effdcf19ec93aedbc8d69c25ee98fa6367cfb16ffb3072bc9aff43d4fb25370483837c5568869bbf16fbfc9ad225a9559d0d536a5b1a9a9134e189353b3e60244da4978a3cb11f202d06eba13f55af7e6ebbe8d2b6511c987bfe631c288f26af1709279fb13dc166d69e72227f509645a181758e55fc803837fbd8710b3d100da759347c0d520af9d76b9705d83de5140006048680444fd82f83f01c2c73a7a6c53dc70998178142f81764329344255251f39ca27f5110e22c3cb405d35771e33b5de62e9cb5aea70347e191f78fdd665def46ca994a4bbdf6ce2b144811f82ad0609cd35f541991bea5150b4e4395baeca309e6175789d155e25e32d2cac4e44befeee02a1a4b69f3d90886de8bd6b5c6b7edde41a2508611205345bbaa5b7a75b1e63d4532cb95688bc2ebf18d26bfb2d2fa9a5f502b44f12f143649d84752164f8bd2f8c2217fe6624c23cd711040799c3902b98c9f73beb8a9eec57d10d6f670e5878bf3d68d3406ad15ba6019a0e3bfb1ff977c367b4062185477c03c6ddcbdfd4545ec71291c20eda80282cb48b8e06a77404877c43fd66b4fa6ca557e91dddaf270d67aba645815c6ecfead9ec0aa6d54fd19eab683bbaac99bc2e373de79847852d879a8d5552b56bffc470bc3c2c17c161718bad3badba99fd16cb3893904bd331bf75a37c03a3fc4a622f888d36ed9d3698836f97b08d7f81f7aa65ac461ab5dc67c3a5240476b4322c5cbd8837d517b38c294bba5383aeed394b41bc3a32917028eafed7e5cc18398b8ee7b7af5ce58ab4f3ae2e074bccb16434592ddd31ea8f7b721d2218029ce3184c73961de37b0ebb69236d6c344d50f0dc188bbf87459cc7ef8c7d2bc8b6a14b0c0dae04174cc1f7f027e2c2dbb56e77d90c6051a1272aa6b9d953917cfa06bc43f259e256cf47033f4848dba0794c5181a116241e03bb8077604fd99deb85b49aee3449209700659cf0e9f7311d8d268c8347a76c6fb1fd9ecdbc74a9efa0ec674dc799032870879fbe50a5fc16935f400f5f6c0acfc066a68e43e33f8aeacc3f9d8e628cf829e1ce0d17786009117442b1e7e287a84964050e50b5bd41b5cc8a59f3361c9a9f2c9e6998ef1b496a0e1b275b9b518dcf6e50da7d5ca1b8a475ee0f80744064429087507f6a7c6c1f752fbc3506f6e4c50e108f24589b343950c12ad0ad76f9b6e61f5e158b01f5a451f70cfea5e651bc9baa88d039f868e6d5ba384e524ecf6e75dcef05b15a5a9b1d17863308be3938bfa5442b6147bb3f7d2fb464033669cbc8368fca8dd42f564ef7a45cafdd1fabe2876d706f179f95df982bbc20ac3d6165b2bcde610dd888601e03e5fbc189989cd75159d3d6aaac458a1aa14b3edec1d6e802abeb75ea83e8f111697d19eb81570b9c42000350c5678bedcde36ca26f843cddcd8d9ac9eb42275951c434d9f8a99aaac3a42c2683be0431ac79944cbd0637bacdb7eb1b211417483931a0c950fd1b094910cf9059b18962a77e64225cc54f35f70ae542b7d7576a7a75fc2e3cc9e3346cd65c22d9da921d49725ab7a15a09cc03e727d531f45e3cafe1959d2ea8b9b8897560526691a4ae2cf5c6913d2cedd96eed11470203923b44050b8a8911d502397e6aa3928f37b1ac69563382c6720a827d402cba7d99e2d160cc7ade8debadf741d99ae02bd1b4625d781314bf2ccbf92822dacddaebdfd28566e2b18554183d603bacd1efe922c932bab4556f749a3d6e37e5aea3fe6eb1d359568480a4ed967a1f5dda5414795b997c9bd75fffe1c9cffdd1ff51482c19db224ada18647a7ccfe3328be0ba4483e26c3e1d29155f28cdf334126b6fa4552d403424b5096b6b0225af492e6100fccdd81f99235b5ec4d8a6609a6acb440e1a31b6f6df0a1ceb916548a4959f3b008c6ec4de07386d4880860bf9d7e1a79f527527c30efd2b68fe107320aedb6f49ce8ea25e2d43170e46207ab33b593ba346991b0bbd49038db8b5d34fd28bfa3304b64c8c0df1c890a9f45158ed886c94670c1553727421a451d3dd74b9577856bf8437fa31db0e6a1c70144d96f5d6fd444c8b1cb715225749e8e641cb94661f6f66d92b314555152e323813a037f7486ee900ca038272111163a23971e9501784dcc49174e7490c5f99214d91b54a00375ffb0dd0729d6c38e285ce54bca2b9a0647ebf853736ca1143845df3f44bbf4e1ffe4ab63c00c330c40572dc84fa80428c5c27da9bcad8f39fc5c74f7b78c003b77ef32d6548a099b6a5b981e8a405dbb3014cfdab51b3672c6a0bfcc15dcd08a4e1a99e74d19ec408eb24ed4e5ba4ec86f2a156ec87d3fc67e5ae945c6730bd66ead091f1381840594a27672c6e07e556a4c78eb5c9d513e0dd219eb32195a27bef0a9040e8a7af1647439809778966d09c220dbd84115e059507844c2966586262aa220a7fb760ce770be87bf4b3d1534d334c5a63232b64b1c2edadcb1d3fa8ea51bfb449e1f5f03dd2e0fa6211c57d3c8dc322d3851c8cb7d6235ea334d8cdea73d1b4f391ef1a105b09eb4c2da3acee942a9d51a1a1cc2bd3ddb52e57a43fe792f0a2e951acbaa2e6dbe51f520c60d7e8bb206a234bc1622e6567e8c0327d7631a504b7abcf304a18cf6e583960478cfe2d5289648b0b1f5852ed4f38f404fac26730cb0ac7399a636ced835e3fbf8246d9ba3bffdfe797d44e9bee1c7974f9e7afddbfe91534f8493cf92d1b0b473c4548be0e5fcb058044911a21d5233c07f3f761f2d14991085ca807c1fa435d2f8c02e45d0edce35d0bc2dea70da1c88989c643f05dc4fc3ef046afce96888fe08d90a3b47765ef72ac6c6fda2045b9131ba51a54e927c500b68137bf5a3b5de3cc6a92b14426a885a8f63437b7af7c192c1c4b8d0dd299e211f05620cfec259dbb0937bfdf7f9cfa83e8c24c3e4f80202d846e053665d977950c817f621b9592fbe4e95cb3e14b45cfbca0841e9673bcb275e859ed420225a24e2047bb3a1c57e1964df46bec21fbdf0a357be324b5433d7940f7ad07a270ec3dd8f635d838411e85dc335200bf81442a1790267ac34831070e7af02748fdb54412275c666803054bfa7610bf727a91c4cd7d52f92c502f97b73051115400aff94247a9652a0238514f593288f95c4a42bd7ff3206eefabb3c1c44a66623e2ee60fd3b7750cc31a2e314911fda28ad02c6e247190f97b17d3b4a33686d20ad462c147d0f66eca3d3b56c2397e0c9ab5fa561768cb6a8706801669b003420b13281d30b069fe9c14211651338aa6108e351ba5432020a7fa415d64415c30938d8e6a1ac0500a9d3147f6728ab3fd60ab55157a9b4fba32658ff04f65020c58860e3e627b49315217487da2998a812fafe2d9e3db9a95cadad48567959553ae9f3000b45ba5f15f388b226dfa6ebfb20e56ef9d8ea151e5bca773694d76a52a5b9c676cec06c92907887b3127e127bc3939bcf41ef46cf7ad7140b117265f303d9bc908a6dc372416d8fea89c824792c2f3c87416f445850fea83db6d350074a7b6bc1406a6b9f4e8f50310e2b2adca4e2d98ba01318a22665ba344ca23275c3c95972ba5e6cffff0554f1674f2b8e71d4fb422682c9944334d2579a861425b6e81009bef2cf7c9bf823935ddd2f76db2c29149a645f15f19478106a28fdff6a0318f015ce9bfd6c8f437db87d3f7c2c13ec69c663e30f76ad35c78230f5eb2940f78d8799d869b8f33e1940d66188aab0cba970255c691ba690e2ab4505d139c7374adbfb8eaac84b9ccebd919f829f2c4e3c6152d20b28a712caad0f3399e3c15f8edb9ec6a7e4c0e303f655015251aefd8b61934ddde5da41e75038892b6f56f8c04d278848547a9d22b4cb8ee1095f61fc3890d6c69965a8a15c650f6f25ad894afa41da755fa05192bf9b4e150e6601f8adf074b18e70cc619840cc4e4def9a93aa92c6164e5a88bbdf6c49d7aaec65e8895b30830a24378dcd71c8ae2e43b40324c2531369d2c905dce6881023191632947b112556a8708fc3a00b7911d25e02327a8954f82d9cd87db212a6c2149b4096f51f7fba25ffcd42749e953ec420f89a6271c24396899c8b78ef83cf067c78577462797dc36db1129588ecfd40824d25211243923319b9cfdf288d921642449e9ee3fce9a940a1faacd164966e0d699b6075c02c2cd3970e90c4ae526d740b351ba9ee44000307c46182e7507748b5c4c6a0225aaa409e1333cbcd59329a34e294bc39d7ef3b4a365ba15c7583bb9768fc9d4f64d5e637a56f46d1ed8e3d296eb125c3ea9f72d2194339aa4bb9ef784ea9743192d44fc88bec3ca457a9e451a119eb76c5382f0734c04fbb1b426bc13f762baf2bd003bb8e53b52ddfaa171442751638afe1fb51517bed762c46b7d8030accb079f08876764cb954ccba5eda1b6caff3f2c25d18361b1ac3c8ec5c27620f5e1ec25d68630b7e51016800420bf2a7bc8ed404ddc4ac49df8a355ce114242aeae04f3e2be81492841cf9a54a0f90cd48f19ecf03bd7bad43b3bcbfce09100577de68bc576f5b2f5b8dc8d0ff4fbd875804974a586b6bee4e27a53dac6def480d0055ff765fa6fedc3c1daae731407df6af099e633744b508cc38fd02a8899bb42e5d2e0f20bea71112405b8c1ee35629da3af2ac87cda97a8bbd285822a6a47550c971ab1a6bd102f5780a767f6cbbfa6d736fbcc4cf73ab4d7be537420e0e574ee1f2d1b5 -MD = 6730a70ed95c48d1fa1c04dd32c192337ab47f4df3c6a1e9d101c0983cceded1a10ab25fe0437de24a6f9e3848f892c2327fc7fa6a0fb1854d81bf05d9733573 - -Len = 73888 -Msg = 645d27970ccce096d082fccfc1183955bad2611af0dd7c58c9d54430f28bd992ac04b65c66c5e4c6914d6dfdb0e4140eae93430675744557bc2cb57e20b537e377616601611b0dc61ff0993da9cfce6afa8dba76af2ce70cd05dd502ee43a73c6e7a1dcd2458c260247367d7d463cf3146c9acb1c590ca3cae728b0482be93633859c409d8036d5a45dcbe125a27802b394d0300e02557b2fe72becb04ae62217e0644fea4a5757d2c35883763a3471f7c23a5ab2875f435676658a09d997c3ee88783f1b1c542918186ac8e16608dd7b7537cfac4070a8c915540cb740949821de66b2d26eb3c5eebd5125f9ce5bb1991e36e34dd63028025475e94b38531b5c62be3f92ca0cbab132ca2f21dba37aeb2dd65a39a1242d9cb459a427f969c9e8a5cd29ceb6a5742a192448ec0686b5ec348488d249b345f2a55dc1f03c2f2061283225f8ad448e93c10e07dad76bdf06c2dff3ba2863fd9eb820c7164949bb506a7ba8a326306698cac5e050d6c972e549371f53d5cca11b5d11281cd91ff730dd182650aa1f98a3a70a66f08d360de248288031da33fcd314cd69764438608cf0862373b158913ee64a003c53280c983032bac69e605d607fa41fb5131993bf554424aec471fce4f8f35086d115fb71a1c42394aaa84f4dee339f4bde39ed527bd0ae446c0218106f94bc827f8657091d7b6f2e77924ee5e10a7cbd0e2ff9f0c4ca24e7107f9f5bbaacb891c70fabb8f3c6d1f69da4d8e308874c9b1b5225e4d08f2d094a40df215ab9e9473008661bc525008f756679afc53863389e471dd91fae3b1d720c740bc03aa315531712bc12147f5ba74dadb697ac7547ff852e381285b3b63028ea659bad9a7ea8a23de46b13b2dd9bc0e1920041e73bc782f37c59c43b460d2c9ed94d9124059930445f20b12f97db66c1cc9f972d767ec6fa2045e8465f619e2dd14663c42cbd47d276e36b6a1ceeb5aab0b62adc9a9dc7aece67404964b5d403e826c41f667d6f44b613a0d6df3e241908e46b691aad1b8dd15e8ad8f8a294bd885f008a45620d27a742001a415238a91fbad75779153913c36c26697d9026b73c6fc7994bf3a807c4fef79905b379b77fa9fd2c387e86dd3f40816f7607208d6ec977c0dcbad641999af5c77eea5de093225b5bcb31ab468f4c4a7f849008acaa0caf959a200e819fb6894a2f5f5b9114c4606ab3e70cec4e1fd00e0b93559178a9cd8be6bbb73431c23085999b09655ef0badd84f7223af61bc09f7da97dd85511501854f676c60a5e8a0e4025ddc9fc47a928b0fa91bf11c08aa87d4b07fdb9e3d5df5758b3d383dbd448a5784f3b5739e9e0ca59c1f51bce9cbd6cf08a5e3181dd25805af4d938dacdc94c1ad435fa37cb7a23ad49598e667542df225b96368bc49f4295b04393cbc504a67613467fc1ec697f6d7e78e448b2dd4659121243522ab130718caf2f3f588f472272e94288bb431002f7bfb7e5c3f1351d447ee2858defbc76d07855a606dda098899adcccb67b98163bba73ce27032de749189e965ccf492e323bb1804e544550bdd7b93e7c976a0fc0e5a2526a97833fb69bc1f515b489001865cd6ead9797d3862c622e6c1b28681dbdbe12fd32f79f136507225753de84f99303b1832c2aa97905524d036b35a7a8cf31906d49dd7dc5f0e8ce8011dc355c2fef098d66704b1d0f23fad12c34570886a75b1960a76464ebb12a2e72e489c6a909c72afb0b20d88631b863c286fea37089c3affc07db66a22af5b0fb9a0abfaace8aca4e4dd33227161629c2aff70019437a8f90615b51b0a091c6105f20ad81b7c509c4dacac04e4b94a1a131e8a4ed8ed046b2366cac93ac8ecc55c67426ea4ff65813148ff9884ca459e29f3c1869a67553c60977ddc7b95d4230427da23111af43ad9d8b444193d5b10b6a79c11a34ca35605d156bc9518db6346595a5e297404af8d8554726ab994580061a457bb45f7a05a3bded250f8096d6a254a89b3b69dc89577668940e7f95e504a5fc1a9fa5802a6fe9c8474dd6629b8b4330b7887c76d38d572f1636f910bed8a57b53712ce643341183bc871fb7f782e9d4c40908b86bfc700119bf865452148149c2b3661ae472ddb601559cf58f1bb0eb4d278f0fb72779953b02a7bf532ac1cdf4e0d1ac82bea6c592340ea9a6c8110abf8e8ffb4990ac41e69afdd0469dff9e46840009b279f5390bacc552f31ab2a997888bf997cab0adb8f2c93580e09331541761b0d8274196ba2a517fd885fe5e61bff38936380f2f0ea4ca3db695150d9a058740786924554a27438eeb9c5c7faa9f6728895b104c642b41773c1e0da974f8d127279215fb284e1c1e90b075a3dea1476625b67c8c55f0ff60a60de59b914befe34a448f0ed0e93b9d5c84a2618a6024b07fdcac755090349878c7253a6b8933e374f307f6d0933289c36b9b2f1a467f961c30188df073817d28ec452c603b3dc61c20194993c6817259d798631adec8956f43593c9225868d3aefddd81bcc7df9c44e2b7db71db8c5847b52a41893902d0da8d717d2208457233457d3fad7650cf1efb719a6e34921d7b93278700f56cb6bb32a961cff2b49767c3b8689c6936e29975493ffc1a2e5c803b036dd9c8cff0e04bc3dff0bec02a90a01964524899bcfb78c830e3356afd9fd6495ade5c34659101485e4f146e13f703259b97ba82478c2b74d6eb2e4de8208c7eb6d556a2ff167cbf46b29ac83ae41566763267f76a96b7d899dcaddf064b842ce8876122a5b6e3b0fee2fbd5879efe635bedf8030d5f4479e27d59293d67e7da5abc23bb3fba5ea3f0a7dd9de36fe5a4b38e15ab1830f9e11797db3276bedc11733c4475b66a172183c8e929349df2b2e7de65f97451fe97a2f2da039a968c589bce6d58f00e33b11f0fc68064714f145da591f4070a7c23e956ffa28f381f373a3c466dd6eedddc2c421caa593321527fab40a4baa39b0e568bf2193fecbc36b84c76bb50523b29122a95b0fd2b93f5b4b71b12766382de4f585a7090fa8bde7ec7a64a478175203a8fd79936a1ca846393ca4521945a1e3e87e0ad6ca9b5b6f2747d23a1c4b4490a398a6deedcf187f605f445a47c4a538ade2bdaba4262477d1da44d4863202debef57350c252e86d4d6411be8637b079b26e4fe620db9178888c2d022a6e053467be6f878c4a90a65ce5bced49314c1d926b2224b52e3b0797e80b519d41d4381a3debe1a018c9a11b4e7664f533e0aaca83e4d5f59089ab9c786031437fe860630e78fda23fcbf405290ec43ea21697c722f8785694e5bb12b7bc2fa15aca33be9ab74a07423005a6efb6797a1e466b14e2ed8a5cce07dc87207fbb5b74e228a98cf74543a29e5c7d1d3df33c0b089b302e349a8c8e4886563d3b52c650d8c5a03fe98debe36f6ef43be5dff8fac5bea56f5e174a68302f2c887f84767116812f3dee7264870bc3b8b64e7e3550163bf140da9f2aee475d667cbccee04813e1c301769142002be11736f88c75cd6299802d2a70a2730687908453a09858597df825226918d1284dac1844593ea5436deeaede5a55b8e644375a049803247f9c3b1372783d8c997ff3e4d282f48a211fa92056ba99027f09c7582023b53ecef30846d73d44a4e7ee6b2723883beea4252c2c33f000f2294eccf946b23309ffe8ec59d126a29cac1f9e59b7d779351525044cf6b9020a8d89b4c7d8f1e1186b0453a6e0d2fbd64e99f9e6f00f41101c85bdfd0f7430ae14511b4e573153dc98cbdac896b0950457d3fa796c8e07e222cda5a6ee9ff17f462b6cf7621f1fd911a5fe29534e228940543c6b9dd2523db07377e524bae8d0ab7f364d6a0989906e391a63b70a18e7a0a12c48048a94855e0d913242437b54acd2e3dadf8f4594f6ebcbe23282eca1f13146892105635b83f28e18b7d82d7dd2bd020a432ec84954349f3f4647124aaa8b17c983d12312bac8caf305d773bea5a42d662546764ffeb9e0d562a52e4435151c639d8c785d6b06d46bbccfe289ae0eb2790694f3fb6ed25d4f384b95114975c101ee85c7ae2d2336fd3d3ffe8154732dad6768b5ee1d1451070798eb442013a20ee75b956779b46f0207862c1821681b9db850309a92065887811b955f81853be5288c661bc920f914cc50ffc09d63f8a489d9f883661ef05b155227c5c6210b4f2276be5da3ff41cfcc2eee0d40ed316c4c74722af1c4a4fc34cb1719669d7c9755d9028f92a5e57da76e8b70846a725f80ae3203cdade2e57ff4f7bcfb511c4842f1d733fdcb60c8ee9e3c7d007227f8c6e5bca0721136a1574e2e42fcc276ec6a7fa0ed7dc6201c023c85a52d7aceb27fb9768357c51caa4b553f2dd387f8fe4cc0f41e7b2ccff172d80b6b641ad3271ba7f42f1700017adca8bee028183ef85a6445498e75acd3b0ef22325ca8d1c14b2fca061878819d7b97120c52d9a55523e828e11027635d5ce05ebc7fcb571b5ebf4c9ad485198cb8ceccf4fc62b8af29baf397b8b87fd8d76a355c35e8bf9ff6e5106fe3bc35c304be644c7d4a0570ec5b59bfd0af5ee0a0cb3a84178787c9742f99f7ce9472caffc46c856dd60824ec57afcc00827d0f59b1c2d6bd3e5c1286fd6dc4ed943d2f0a9f4a1246bd3d359a2e8a6eb0d876bf528c82c67f6389158fece049d9321149a59d71758056114d864e6e0a79f7c86b3bd9eec5d69dbb4cff6cb6190a047bb5515d9741b34720b72145bf11c486eebd66186b776b534f2365fb43950871f8fcbe4e1fe947e6e81d0b93122718fc560071d68d3d961ad13354271d504d00f57a1ced8ffec6ebd3f9a5b4fbbcffceaaeeef82c89b0f5acde73a6e97dd50481dd82dba4bd4a89c70a77029d045d18439d32fabb2120fa9b1c99930679ebaadce714142e81d759f5ad0fb70344446a39f47c2bfbe353f7e1954e11af106d4a883eff805e92ba65adee0b8169c5ab7b357d7394d5177174e6113b29cc8b836dedaaec271d3a1c3558971369b7cdbbd19dfec03c3104a1f9125808e24632579a73f2831251bf25525f6ece76d5a59bf6da400a2bf8f30c0fcd315c45034d0e5982e06b48e36afc43283ce5b0ab957572550bfa6a102cda3d7f66df58ec24d332823a4dd1bc83ca901dc8ff1f22e46ecb7526380063f7320c90bd3a25e9ffccaedbc9d0b6c252b6c2a5dcc5cc20dcb08ba15b6bf5d89c3c0368ff15b4e3252154f5559dfedf1ee960273edfbe8ec3633943703b52566222aa6ff4170bc0dffbac38a65bb1fa318bf20db7f4fd55e2ae5ec22e521ec79309890e63e9346a75823f0d83b3d8fbd1c300be0fac925b81ba81865d556112751b29ab153337c72fdd94dab54d7ac947b913a20eb1848ae8af2af7c5ef231f518011b0d39c1ac15435340805d09f4edb96b2217ca8dbc95eb4e27d2dc66dd66e60c98363cce73f2eb1a50038e54f71d48266a3203ca0ff2cf12f805f82461f16e2da8e8d6ca628037a71291933931a7ca4b690c313da169b8f9c6821ccb7e28f2ecb371b245d661cb71fea6f63723119252a502dd591f5f1b6ae9d3c4cc707226d24e8d39b16e0c19138ad011cf59ff42c4a4b262bcd84768def8778a97e7617c76e087f7ad87e3a3043d99807234a55e29fea76bd97ab743de68e9c8be417b6632fffe568ac28cebbc8d6fccb041b836fb093e432f65231ed1b1b729c02d2466af234ce0e98c6c65a500bf511a0fac8fa05af3a32f361f6c61794c081df9011033c110113a7406a3762e24b8100d06aab27a73e6795c00bf061634fe583375d5797fd4821de7e027786c2c5c22b83b2ab9de1b976e458b89281eee76ef7b1738e8a6069dd4769d64544132d7d29fde822efc7720ae80f45d5009f4fc442e49bcf9ea32df1e9e72ec7253e495903245438a6c033c9aacef9e065dd51906cba1d42592c5c05cce15125b0a9e2ffc0e23e134933c25b317e1edc380fb37a7e1a40104664bec0f94088886ebdbf16681eedde608ae8698505faf0029f3e297feb4d61eab31acb77ea1b18e5e2aa4704c0aabf742c6d9baf4dd54549f4ba4677178c5ccf823acd4ec952fc9f81693a9aafbdde0c811998b63cf9029876ef786f85452a7c37e46f87c4745d2400c59635d56e64b0f1b409a2bcad50748da5686d1dc0f2793ce15929c2cb62fac98604da190579e8e405957cb4385767a1a3be7cc744dd4ff7f9323cad9d34ab42742b9363c9443dc2d5e54b0be33ef81ab221a16b1b1385d2f3a3c96c33fabfd556b4679b03ee36f3eca017abf62eb0609a39e6f18bbba3339953d6e7d5ddbce9f6465faafb9e5cdf126fe87bb94e15db23af5241ddfe3184b1eb6e06cb052ce51a8a8176f97d35ef0ffac76373c7b1f4142bed445903b82c041296b15c9996338b27d7e845b34b89aae8bb4b6ec00c113754c0e046f3c0935a7158d0d1c1833a11c669e826672617ace2cd1bf062ac9c52d3d2feeef5cf217bafbb4b72a77a62730f3d5fe6c24cffde8f04bb42d41bfb2e4f2c8797326f3e2e75c70a877003137ba95d33cbeb47ab05986814ac3fe1989371d4618ad127523c6b85f55847a6b5ef3dd14e1e0a9f81eca4010c75cb84d949e1d4760ffb7fc56e38fcf52d52ecb098729f962649daeb5a5cd88ce79f8e28174634ac6dd800ff8a8535f04db95c6d3ef1d1f52dce824f1667f47d48e487ecc649faedee8f316958f936cf01a57f52a9626f5279c11e17e96f5dc5e1c1f58c1e913020d8499b69a23d097b913edbc8a06b7f94534b37aa9b191c4efa5f6272e7c7dd2d742dc4682ef8b6db45abfa38edb70ba503945470f40f38fedbe65505e9920afb0a6436cfc5d343d66415640856ec1a6cd1c3fdd1bcf9b9bfcb7d57adec9bbe74e21579042f76ba5638a39fa2a4b3b5d10500bb35ba7ea878144cefd2b789017f4369137134882242077e356c9fb3e3bce6751404b7470c11fc7ca5dc1305db0477888e7c9cb284811acdaed00e95ac15bd4792a67bfced71cc350134c8b755ecc499728f2e9be7fdb9b99034ba0018c4d2a1bd84ce445382cb9e8c409e46761d73c44511b3eb539d2c6a65026c9d30b26da91c0478c7472b43e0cd695d5b4780cb33916af44cd149ba07b4a1ea14fbc5d687378f402ed0547a224c17cc9dcefd160bdd01b66467e9acb80679fc0c81e65464968eef21f7e5b98d92b3b4b5157d9a77b240c4db20664aa7e2f26c2dcbfe3168c2674d47c3c7484926a3dd4a24e6a19d978ee55a01a6dcf9d0740120e0f3b3ba428422493ce06f7d90510f05012271a51453e0891492aad95867828dc9af23839e4b36ce6a1976525923128eb61752b8b1f87e0f6012fc6d0333b81b8c18c9ea5f26517f565ba4ef0883ad8c4baf8efef7e38795ed0f19dd58406b733318ec180c7c3a04078c437c25d8aaa7c6d06c9e6d7dc3c2c46f4a52e0f7623dc596d5342db4ba0485959923398acf88316433c09c2ef93fec1cd7f421be67204b79cd674a389928d95fef0acb01e5d793522c8e0a5ff3b36dfc08eaa5fe40c4ccab1ad9ec6f9f170ad18c5963a4b33bf5829f2d417677c750f9245df420b6d2501304b19ac1937920d2ba3989dd035d5edcd3c8c9dd4e239cfa7574948a91f2e099d518dd963ff8244cbfd2c6149be5d648128528fa406e59e641580fa699cb8225d3353c56693a1d26e44ba1af447a66aea28ce83714508fa7d130eddb9606409f48313f69dae7134871cca317c6c414f6cc0690fb947347246d25b4904f4a22ef7a336e385aa80e9aae7f52b4e96dea08d81ba9ad867c89455d5fee2f8d402ffeb2645229b1251703e28a39ee751af0cc0ef2bab7b3165bf2e805221f18906fb237eb72a5a605356e5715dd2e31752d2bb6b44b80e3e7c713573fd9c8b8e1eaf453f1561502f071c05349c8dae626a90b1788e570dd97d490f2379a9235dba9ad4c9e87df8d90d2e21f4d815c5cd56c567a970fef6bcf8a510112ede55627b3c36b198c6d0f8a60bc034a901a5b297ff2270951655337f23fccfb5a29e46d1020f88bed255089233646687e7eabcae9c96605333a5e7613409b186ac6a854c9aa3b1b33711733243932ced1ee1361b2c17fb33ed65435f63db591a4246785e54b7bf2e5b82e306aab0da514d45d96e3c4b93cf9a2fd1ba11f638f91abeca86cea02378b615b29fd762014cc974f1082b95ec8ec0421d11ecced3ab7c4fe64676e1613aed667c6e680b344839fb2789a87b47ea06587fe752e9bb9a0d56461ddc100aed57e1aae2cb30e5dc0544d75301804879c2ef84bac2cb435d448e748d6ca082f88c13b8ad7f578860c1eeab04e53950b68c53c5fcdad82d5d9834fc15a7175bf4f079401f0303be7ee654fd0fb20b1318d941be4df9b4bc239f06473729e9185b3b8ebbc7d4b9da9ee91457e40679e2192015d7febdd58237cf5ed072539a2aa3b3c0962892ee7f4940a94622410a504ff76c9daf85bf12128fcb4247c2af15570fcb69c19c160ef69380423af040e025d5a289d0efd5ee4c76c7f737d59c6afd85eb91237ec52c3f4845d6ae92921423315427035abe693e0ad179c32af69e0fdcbdc6bea970397bd5466dedb6826ed090fdff9764dd256fc274446a312210f67ace5503baabc944d11e8288caa642a68afc7e3d8cb6a57a242cd19d76b37649c679d68300dc5e22b24acef04d52422d65fc1d4640df6bb5a667cbfd6a3f3082666cc5cd4a866a8dff377dc4cd2aefcdd87977421fbbeadadfb17dda8a09d238d0f3ad32c63e70ff2e814976b8a4ae1058d0f6d177e0a532169671e564c7ddc57ccae7642278f3eeb6a49c769e440f9d5daf2644e7c21d540183427e68edb5c0e04f2ed1ddaa85d52e0e0144fc7d76bd5d60704cfde4c5c927046a3634dfecb391eccdfc5667896b0b49f28241d58608de918f2a18dd3109eda6438d2732f50618405f443b1480f8c4d4fa8f0cd0bff867cebd9cc70fe18ecbc588e3de7b6130d9d65d59ea55ff06e13b83fbbbf387147f54a5f596e149c047fe84eab91db3dc5d1b32ade290762de6ea1938edb27dd58befb2c4f715fc66f8cdd202559e6f61288b99a0c24868d65c6d34c7009206c423dc6e9b66025bcb44afeabb2271e657a2a3dce2e8025988a8317136a316a468cdc753e9622afa65b2015985ae3ccb3871f086e4f242cabd60d3390833b4e92be02ced2f8a145adec78e88e25753807c1d0e22174f8e3f0d0cdef6ac30f147961169b4ee3c42ff9f0b941361cc5aa8aafa3928fa7e4918c0029154932950422fc82a2596073b4b1ef4ae63846bc6a64d901e261efd080aaee8a6bd7d9b665b517adac9c76961dfd6f959f3bac40bfbcc753983f55a4f6702359bbb9bf58815c3aff80bf2d16b206fa0136e7543af3ba02ff7dd0df483c0626fccb9aec649e3deee0e8698dd9bbf417f671e648934c88116f59bd97a49a957fdd632069c30580bab8aa429fc880ef4fdc1add9031134b7c09f4ad85a15745b7624df33d5bfe4e27ef8ff36acb491e281cf77732fe8f2ecc371549b025bd3d55f550bc7016d0cfbced5f24f6cb5da92c1cd15a38e10a5688608639201912a6e1fd33230bdbc52a011be27c4cae05b9e3456f2ea9c1caee38eb0d24dd669fa7e3e2bfcf159123887edfdfa4735e8976d4ff9b9c8e88181c644273b3f0f2ac69e40bbc6996223310bca2204473c1310787b31b4bee1d3c0895cc7f8d60a781146ce2f29897753deb42cd6b0355c1449484c7b8e5d1687edc52f1fb5a356c65cf01ce28051e72894098c6898920450c4754a53a0f405126bd2419adc47728a2c22d37285836015e3847f7427fdc34cf467eb3697341c07bd592ac5f712fc57e167785b838e40a06fbd6c65d8d9278d6b98a5b0db9df9dc64c2412d709652a42f36721a14d3275c7b0cd9da45a49f869c90004ed891fd04f4a62b4de351f3f35808671aa40272aea7fb5e3dd8f099cd09d6915d2890b415ef6d5f83b9d67eca1e65bde9db9cb12b6911400d1d3da4c525f4df88464aad93b780447b8e84419cc4c6fd1415f2713750e755c48cfc5f038343214cbc0047e2ef9770a1bbebfaeffdb48b05ddb42166d1e5d5f0a2bd170cb46a2d16f4622197ea1b7a72dc9de9382bb70e4bad42504e8e75671de8e07b450bd2497379d0b9374974b88b6aeabb19d136fd620f3d6c32c94e7fa8da06da512c141ceec6dc7d25804bb137e182eee980bcbed56e05f3d814b9962e00a0e2958787fde56605fc0720f90b24cad6e33bacd0e902642c7583134f2119c74ef29690d69303d1cda4409e151cce91573694d7ebf2956c217fe83797c6f8c851a8e8ea6842a6949404566a186c81ef945769749671faf075616be3fbfe577e6963e0f6c5a35a2909aadd278b810b101ed44e1548ddaf9ba8c882bb142d9243f6b23348672baaf99ef63938e6e0b6ad472b972c7b9c2fc82c23c12f48db45c37a224451c541f590b474ff10a3021131bdcbf94cb743f7f08ff19bb3328dfe7764128895889ce688eaa59361486ba727d333d8d8844b94cf34b096d949cc08da553194960982da4cc2169a8d6f93e51a3801aa625b49829ecaef4713f6fc1166cdddecd5c09a6d46ab367917510157634cb4027ca4944df9b31c0105d2c494972e95f5d75659fc213693b371c54a8a9d91a9658a18d2536a7db568f1658bfef607e8441d23282346d49cde3f14b5db43a770480cf07a3f5b9b59e39917d8dd0dda535c09dfbb6f3205e05dc1c7f9d5efee972e97f3f27e678c58055f7221ab492655a23fb45a3c7d5adcc6cc678d16ece79c8d9d7be17cf8d15e52a6fd0ce6326c6dbb3169ab177344008d917bc5fad512dee99ff0bdd799fadb301220e11a442d0a0b5168148cde41ea36c36d5b1e3300fcd7120aedfac5793d42238644b418e8c91742383d08f8e4f836d4c4b2dd712274ba86230872f5dd12ed5d85ae400b10197376327b186d9dc922480a43d53a07b5188ec183ccc586fab622a7944aa5437984501f5537a6eccb6d8fb6a481d8216c857e7ee6549f07332105748d4071e377de723751f33f427d9d3e424b6fe5ffd965e7a3b6c6fcee7aa298750fadeb8082f65f2307b7814f5e25b645beebedf3aa5e5ce85b8069ad2fdf3e1171ff8c9b2950795add012763fb9b9a3965a25abd3db340a57b1d6fb3d12b78e27ac1efa3e9615347487cac10d4635c85d61fb6bd322925736bfa69a2fd1bcb6080716f3b31cd6f90e06669d657116fc386b07c63f6149ddac4a401fb0224c7f409aa85b190e930a02b7aeb45122a666b0e0126521809fc340ba6a31c8edad1459cc9edb7953948fd8016cabd8412b2f4c29e4f08066dd327b77ed78801a289bdb04bf1adad521b1194b662d02b6ee7e95ac450e65fd4a51e3e9919edf91053d4cacd2c1447b82974cff65e0d869377c12d2fd67d72c304902791d48ee3b8c21362ba077bf2dfe6bf984316c61424e504b03d3a4dedbd541608d5b20b4fe057020e9f1e554d3de52a842927aa62a7a24c8a8916d82f28262838f11ce39c3b751934e8cb20a566b76e2a150b2ad07041d1227fd69cc5a7fd4f5e508fa8573ebed16c23b87ea9ceaff2e0932bb80c33465b0eae041c3f914be3ef9084ba1f4e96b31adc40cfa8ea61515e2023e274452242a57019d70b88948e431d9699430f9f46c77f0e84414e6de1e9486e2a874a68109d82a23d97f259c71f742fd660d63b0508887c4d017f185d18787500d3978a5d3d4217e083732df6db20caf1f756ec664485147a47d1030b623cc2f5e7d0fb813b3af5405c6f63c5ec9ff26c84f635f3020161aca308b0856d11f28a127b4e14edc9c4ed616bad9cea6e30b69838aa23d769de44a16aa3438f746e3e01faf480eb9b013850ec5de44b0800508f82bb812b3af4e2a19b5dce4ff0a07224d4816dab1b34c1a956174494f9ebdaf988ec8384014007420f32ae34f333c7099c7733b2c6ca09b95d4c364eb04da654afbfb358394a13012ad44bc51892cd1eb7386b892a4b812f567f21dec7b0533f6b97993e6f6d964d92b52f76bd47d4d2b9578d94c233b869d6229fcbbcbe61f841169d9d004521a5cb57d1d07dbd7ec41757026c0b1d200740d928abebc2434dd4bf390a984b1598393ecb58c67e3b7155b97285716258764af524e5e156877e7af413fd83fa12a360cc947624048b58f8f15667919db23559294d003a059f28b84786ec7fdc8935d69395bf12eafee985811688f849cdc2dfc7e991623a0acb214c3a6dd86ce9fe0f3667aa0f9c06b1600b3b7ff1d12bbd5363830fd67e4ad42a5486d82a15c53a7ef782bd9682233f3cd25da33ade3c73588eb1d2234cefe25802f4e1e181ab99ba897f704447e4e15088c5991fbb7093539bfe9eb5206a641eda1ce19b1afd8a265e96587557bc566f813bd83d13787be93db1bc28833ad8033c677dc35c4b8a56d99fdcb63c29fcce7df8d70f50a4bb6dc683b0e9ffd1cc89cc5d0cd6b00628d09cd473836fae4311b1b51c030d95d075d8dd237600efa036ec661551d0cdd4081aecc3795cc9d7cdded92da4a4cc3975e7367a5900b4f18f2f3b3dd118f31a81d63132e4ae0d195757dd6280b0a8750274182bffa9f23ef70724dcb103267ac2514a4861bdd88642bf4a8113bbcb118ff20abef65707f70306bb788e29d8633e0eb08a8d16ccad0477a8dfda10947d930386b9d98266a8379077a7d4f779627970dc6fa3434a0c310360f54069a537a00b0492f5c6aed10956d1d111f68a06f92a566e60bde1125cf51b57f3216dce3b8b1ce0e79e40fffcac728ab191aaaf319d971d3201126dccdf307e4ed26ebfc9f6280a2b73bd838613a24b50732bf9b74d16e293976e6d14f428eecff7287adffecea53de1750a3a1f09896af5be44feab6e54f1fb459eca069d1ff2fa1b8de1e76918ab5228029d4110cb6d93b23f7c4b05eaf9a748716078e5986465c86774629ffad05016fb040c4087d4f7a837b4be662b0715e7935cbdaace70d4afa60bd2dbb26965f25212f321553d8c10dc3c4 -MD = c49a67a96dccfe9597d5c1070077f46024b331f4b64d8713709f9ab3248ec7b95319da1ac43e0d67e2f3ac558943a5fd9ed2a67decbe6c873efe01f59db57cb8 - -Len = 74680 -Msg = 223674f89f44f89f54660b3e32ddb843409eef7086a885d329947cf9d76e855f65c3c329b7fbd216e1e908b48ba1fad09a8a42310db48086246b9f9cc80c5ad42717fed59f86717edd5d731e468324e895d0c6a1c667c59c3446f4e8fe1b1ac8ae59ad631d8cddbd91ead5e6292a3d727b9903287b6a5bff9f4d04464044cd2244b2593dfab51fbd45b6b473fd3f4d55920c802ff2644a95adaa561c572f7cca2f4a89cafdab3e6441ec9b2d89695d7b2352c51cf4fe9b48a88273d30c832fa7b748c572f013429cccb20f7c975173cb75925a5949e055fed600e1d425e8eca326d5959d9998344c2f309ac8ed9e9a2dd2f5c84cb9b180a181492a866a08bda5c21882b3c2e01b5cb390c37954f9d78980a3965f0c192518ef88d550a588a996d53a131c3193ffb39df712f7940a34c7c8c34cf909c24a4b68e36b9c9c13b85ca562d141af5ae83b388f10ab7578b8d0f27d72817a51fa22368273d1184ff3e07bb9428803dddfdbcb8044fbbfec6b8a46fb916125713a85a08e7556e1e4610a9e67f05af7c3eb7b9df23750390d56de0c623000d2c8145ced2ffa95bf7b0bc35893632051b41503f70c6f13ad8480b48bddd8c64bfe8f8f668c89f57abcf7f1ef652140da5a645c21f676aae1f8f2f50c91101b57bcb30653ceaaded94e2f7dac06b4245a5ae06c63d9d47f9d12b287d7a96067bdaa89aafc1ce5b8a6dabb50d79ea432995f911c05dd0ff8ab7aca54344b5012466f1861a89fc3eca707a151b85477d45e0f80554e29b17fd2d741436ba06984bab36914a07fcbe0a57eeb679651b7717212b4fd88e6427bd9d1203bc3cf3226e12082ac2de386fd67e6a17cbbbdeb709e1135fdf93b485489116e268500345e825c6d0f95f37aabb7e8c9776dbf9c3ba8b40c3ee9514d71aa3f33ebfa5df595670f322720d931535b2c6d3ff57f513958a240a7a24fd83c04037872670bff3456e2d7da18ba335b1c5994be9b2692d27884d91f6b5e721c5e0344a31735daa1187c6612c3c1062dc21747dba6dce86ece01e0908ba6a17981ea9f6651010c467587e6b66b13342f15108d7e60c8d97524c25ce14b4ef0bc365e91a35c971f8a34a860ae56db45cbdde96e8f0f13ef4f406e55faf37fe44b4307234281209bd41f89dbe2cc3fbf68e14df2f7fce4b265eaaed3c3cb60078f708f5c2b08c4068efcd25f3a17672c6deae2229c6f64a91dec2adf241a1ae0f0879b454639aaea1f942bf59e7e7c1344c0500567afbb5ce00d8980052ad4f7d74ed6e47c5bfbceefaf3aa3f648a6fd542b40a340061053171474bf4e41b7d5aa8fe543b3b8de3b6615aa732abe0c7105f35a0510ba8b1728ca92a2e7a8eb01d210736ad4967cb8ec8d216d2228d7f7bfdf4532bd14562f7df78c34b8a79703b89a265fc83efdcde9e04798c6ce2e17eab8aa32315c96237c63097aa985e364c3f4a62c75f88802c5d6c6fcfff73a5aee46300e52da767c8fd5b27ea38cf8ab5ae89cd9c50c45e0e83743a1b3ec2347345180cd0ad61cc11d162f478c02fe60e73cb06c9fc15deebacb6990cbf6106722a141774097b07a8eef27dd4e301c0cd1b989efea60f8b4a45addd0305b294021fd1c15dc665b2f49254249cf5e7b368027d06990313dbb0cab4a69c863985c9a2fb9aec58b4469b8832992f9d443665c4e2ce3787c558a5b8756647d588243f3fdbf4ae54e95af42d084c0b2d99b24cdf546648a8968aafab6a9c83680127b9630d7f123f6738a4fd3fadce4b6abf93be6c5f4ae9f9da14f00ec9ddb256d8ee990a8ac67cd0881475534ec76b49c6c0ee7529bcc081cf9c42dc7eb538dbe0456e4db8299197c1c931edafb50199606aec19562cc0a0e39c004e1bb88002b6343f6177ca223f7e399f6930e5a2dc04d833c355096ee9beaab4ee31461c8dc351a8c05a16833a05fc2a5072f7c3a43cbf61fdb6e13fcea93ecd374ffc62cfa01426f4cf9d4919f1776f2df659e8647086d342ec3297b24bced5b3d839f73ad502367958cce841d931ea7c3b9a85af38b5141d757c1b570ee15aee6a8d4e61ca9253b88633f55425c208a5a3182fe6fdc0b0f7d32c4f0f7afcc9316764ecd7094b0b5cc850d4d35f9e6644dd814bae4830166c95d1875e08a7ad475f6f370d0992c9b0afa22b21ff2d6fc43b347d67a089d0d63dfa78c54048737ac2fac16654101b6e9cb64cc27d05a1ce5cc019958f446cef2c0577c7ba75c8563296208571397ce12ffbde5761ad98adb2a2b4da7cf636f1e08128f7cfa5f8541edfb8fcd9857ab2c9e14433358bb0fccd5ae388e1f5eb991c0bf0b8085f901ef8261f1ef56a714e0b1502f8713677361d670a2366e9e74f0f04639aed192bf15f07a76e6d7f0d2d63e5bf19ad1477e41345bd5c6438b68e69e8f612f6593895a403068daa39baeb5501cd1931dc2f814f7561867278d5c19d481cb2ac962256679690df2400e6d26ec7b179a7c40a8842848b241a10c1a319906bec886695be2a30faf5738b3dad01c600ad978295737cd1bec7b397068d7f6058431230ff576c709943113f1bc5ce7b3f37598e6cdd5f1b60e3e77210fb3f167638c28bbb9c9ec3f04a7572fda71565c1a9964ddd207990160b1e488d76c9512a4011ed771841a9949e18ed7fdb86f44c76b65772e75cfe429fd070b87aae7ef8eba8ccae34e59ffaa083f50edd83c514213221ca8c69a47b3496813e917f1e66bdcfafcd8d0b2596e44f302727ac56cd2ba24350aa2031244be9009c359bae08192f0d517b22c8fdebc31555446117ec188f1281ab3102d25840653de184ac31a02f7bd6a9bd089429981b15ae3286d55a4135fa19ecb809ec2525b02fdaa797c54961c9733a530e2026b7e4efa1223d7371240660e3cf4f6a0fd87f6afe1e8efb1565a6723b36a05207824f632d7868e68743533a96a6f77478e4184d7f7fabd41bedfa2130220f41b2f0b1a348080c460c3a5ce175dda67df8df0721df5952c2b561310aa9b3bf81a199b84a815f8bf4686f800011d1e0f8f83fb8928e2a38698a65f789185a15745bc3dfb349cd5c9434695910fb321b780f7cc91a1c60b11af3729a470c83c59c5a25746831f01287f8ae649e826cda7da71ca522fa9b5169990da5aee6df248c253532e3ba5632421da52f0357e0926c4795d947b9489dc7d39db63b37aad6a6356977b0537e30752be414d9dc3bc7d6698ed1e2d8e6fad84bb938768fa5409d1328df588dc691739bf1b29c9fed0f5e955e2b9eca04fcfd59d698db5f2cf6b34729b636d9cdd9eff64494c60372cd47539a52d60d1118b9a67c73f416c06d8b39b2b8f5b7f27e2cb36317e0b74b86231cb9c4232299d29f8a21463b56fe19a7637a43ffb8e302cc6bc3c8772bf5ce9469330bf0ab0dbf119d5b7c2b80448f8a6cd6e3cf5d0dec3177ed22e3c1f00afdc19c96e8f6fb42b25881a24f33223396be6f14ef04e1af1e8045c3c129d8cfd19e6d0156a6d0e1e4343a4510d015aa6ec09943c940ecdfc5ed7407a9b3fe81b2881ab7d43b2d3139c8fbd10af79d58752bec2d08a1add2da37ee8ad800ffd512f72c46ec047e95258f3cd2a81a37c24c48ee0d07a7a34ccdf81baa06815b1e7574282b08c333a239ef83c682a8638c46bff57050b34b8213969201afc58ed24c7784c0a4d7eacce96247390532aefb06f9b8f37e6525373dabc81e2e4e09a52a89c8c45ac31299a6a02d86aa3988a31f7eaf02eb3dbec0cea0545c1c7b59eb72136a929505398d13f17d4c0c3d7f28d2b73e3b119d86a3290c9d37f4de0e39b5bcf0b7ee2ece0b940edd0585aef0d0c34bece8ac050b72ef49295e41f684f487dee1a0c0905eb9a920b32fb11e9c5f83a531a7f514bba483fe7f2b7e555cc05b01c3e9b6ea4a0be60f9637190cc019764bb305974d25bc7995152c246af41191ce0dff2b8d4e76cd040cc827ea0a933db7d76dfd0eb82f529571dcbeb7f95cde8c265da909aa8eb0a67d4f6846ea412c72156db0ea117181881bc9b7ccdb2693d4a381b9e00cb8437f6e294493ddc7c4f2f3713d5f902798d5795faa09f7f354201c07d890d397f7f756025761538bb9b308151cefd2b60b16211b0ffffe478206e65c8fac9d824096db571b2fea016d4ac9b5ba1b47b14ac29988442f4c97cfe1a90c3983d91bafe664940a601fcd42229eff9f526d8dfa534933f11861687058ba7370c704d8b85e6845af925343eac31e4f5725c2b07c40c68a913beb3e25c4b14ecfd6af2ddc777ce875473319c9b4be216c15d5dd53338818af1a389d52de23daa143469f9eca08f8e5ff1d936160051238a315491174044aa533e7ea79dd68c39f9d59b271bea2f38c1a9155346d69ae574e1fa839bad1bd1df957ba2d6b1676053556faf7cdb164d23a3ce3c53572324287436f3e4066dc640b3690c00fa38e8cabdccd838fdac952ce6ea3a640b55a74ef2ef281dd3a2521c9d2e2e423a669a07149ceb77d85ad7857a5393a17998388d640f6b6c9d223d1c5db450c5f8593cb262c63060f286ddd567ef8f3329559d8dd17d04f9ea544fe7f9e1bab1bc799673b032ef1cd59a6dc5b5a87842a3f29ff741213bed45a24f267c9fb32d0f2e72f005c870d209fc50fd6d6494f570d90673bce3577033730780ebd5846177e096d46970faab14164e24970d2d7517709aa84baba2a93e303d9e506b76767ef7cbc5e412d7cf804e2ee2398a89ea2021233ff56162c1ed3fba27b248cf94acdbd96b7f964d65d50ebae15dc3f07b145368dfc3ede0e0c80946c41a56d7e288f4887041e4a59699bdb8c60aa0ac50796d3231bb37642c58f6a81d8f7cd8899aaba07933e4278956c2f13c49090492dad949dde82836d0246faad919a218b16a66e8315b7f1a6793872de921e63f69bcfe758a4fa69df2b5da12a0c0b0e080818e293dc39bc857d97333759a1fa6fca9447ee0fa9ae3bb91a0a91c8d8f7821668c2b4873217782afeecd89bc9c817428132b89f0ed4e52422a37f3872528baa1c6b6f871fa700f9d60c1cd904618f8c2d3452a398527df50df84cdb75b3874bba692f5c70cfb272b31d8e81d03b2b1fdec946ede4cb58c41265753231aef763b9386e87d415ff2e2cada836bbc98c764c7e0fae629427f9f697a2cd54897e9a9f55c799980e69749918f45835a13617ccaf179590314e0f10fb301d5ce76f48e33da4f25b0d63fe9efbfd76cc369a7cf5e8f913fc474d8c080cb7a2995d4c070b7c91328bb7811484d31e02ee1e2c2e4ec81eaa153aa8f93238a3edb84fb74dae8f06cab881436f011ae09d29ac8da43da902d8698fe2cf262b7f6f3823239512e1903b5fff2d569a5fefa5fd8611675918402f77bb8d765a41c497779c0375ff10a7f4e085917396fe95add82f79f017a2510fbe41fba75527fe07150ee958b998c8a7e8b9324ead937d15580d09d6ffc3a009abb7cfaa9d2a962e8ef047c5d8e67c94e70e6230449af09ceba3437487e8d79dce817c28a8d6278e53e4a135e3963e6c59f9b3c0d291aa750176d95126ae424ca5338389feb71ca6f24078315004889ec01f9998fe04056e382c2e0582708a96be527847055a0ff8e8c85f30b4cdd59c97c4a5f11d6e9bc90e07a409f1dc1afc8842bcf8531b5c04a5b0a8cc686ebff67f9d4b91c73dd815e1adedc71b4d6dee7198e4167e879b4ac7adf75d0143a22cb61e1cd371fe34e561836dd555411e0d28d96019de3b484bbd14cd7b160926bff9ab7c3ea42c5cb7ec2ca6ad465385a91c68c38af892ed7804898daefd0bb820a8e9ec4bd44499fe000e1ac754f14f72aaeb80d2641ae5601c80da514ce7c0ef423e0f8398d387284bbc4cbc07a6d5ca72c61a98875fea94837f161a8c19fb8c543c486e58559ee70d9bcee3d4f0b340f27d033608ce4775d7f8d353111ea2786d59196499576b9ae440f3d7534b5256b894ed433ee29684686294a392526033fc19052ee23557b46e205e1ef9235d7c23921b48b0295250d360dc847671bf6f6ef09e05b99bfdd3e9de80233d251f41c1f91faef32ef56ba7580d6e43e90a6b5474368185d7c86a05cfec7ca5ad2218223e8cfe8e601a3532dcb9c96124ebb83b08813aed95420740791593b947f08fa2d6c5afd8491b2e2453743e84c1ede69151e08a4730f50c085e7e00ee622518f2567c4b675682e6ea50af35f52c6b76d5b4e70829574c08ec04883ccba81a446f31f349b214ebd00358cd3858d0eed9a6b6073d1a64d18e59ffe6afc7766a7297fddd335f00a079fdd070ce165c029f52d9c38180e60ffce0a50be268597053fb1e8c80b4b66b55385c1c5fb43a21288894ae8df34761e4fe985a7d24cdc6490728a3ca598286f241503275c8d7e515a68b1aaaf82561d7324e64c8934ff6d25a809578c4019dc1b75155a8bad1a8d73b01aa70e5fcaa33fa4bbd6d2a5c6c7053dae4047ac01a53f8d3f8510093e6fdc4bcd0787339858bd4f4c6c3607fb1a3817c1205e43a8729945c9d1740bb49e9c1f12f19f6789e6f40ee0373cc26410c7208a1e5a6cd5ea2f86fa653e1943c3bb16318de06165f2eccac05f6c3eca4fb93e5063c29152b50b361c6af69db28642177104d18af427ae69350b4ee3f47f165b5d171e19e57c353f750725feca8e38091c7efa4afd2a41d585636b1aac49e75ef760f76c57e7b3874e6552a45384a5d67822e40a4aa6adf4f8904a49b855332f6769d3f26f9d8ff8eeab05f7150f9165ce191630a141fbb0d8ba73dae14a02b6f5583d13f747d1799f02c65fd7d8059e658b1826cba332ef6b086f33efd05cdbe856ba37b58c7ff1a7921e4463870869879f735290755a9bfba3c5beaa914a868a8ad4c67315a34a4f82940e7fc3a3ae7a7dae1eb75f7c9bceb3fde1da32d39f211d1228f789446bdffbb125f434dd55874e51f10a089ed72c5fa006465e000ef636fcc509916b3c9f24fbf18983be46f63ae5324f19cb375fcf3594b7bbd8bb51fe1b0573d51fa5d626fcdb08584e6a0f68f14b4f3908a3ae2c44f3f5f1638e799df651fcfc688ece283c49375a96a71a01fda3d2115f03609e558ac8a9a970b83a160f6baf4edfcd5342a4e0329de65e2c91a2a049d73fbe4cf1c3f88bb34754fd01a98995da801cce9655c9886b10241236b08088783f105f9f054c3e88fd960f41851e57135903c2c0c2bb03090bb4da73353b764bec9efee8b98d6b3078c6985e0df29c0253c95748557d4b7ec156add19999bc572caf52534583b9b4a22cbfdea7cc0dad54b8b4b775d909d21852b3d7446202a5e88c836812f6d11b6110ad4bbd75511e451602958995e50efaef130d9f5eef3b097eb8af88ae5a6d9fb98a2cb6b6115d0f2c6868fb7a86394e76f6fb10552c2375cb19b10f72fdb243707d0afa55f57098420fba3250955bfc2f832a000e616516bbcff5100c62f3357dae6cf11aa461caa01f1296dfb97deb62e321d8523507d2980203f14230385d2846da03cfc7388c8dbff98fee9ba505573d68fee9501393a8d9641cdd0f87a3b96ddc983a05fbc55317f68547e2de3156ba88dc9b5b9040357d9ff7a5a9eaef774afb182507b45f385091e0b0372d57a68208d830fe87c185163cec61a36829ab06beeb56756a4185925208f2429c6090bc705c6fe0fffee0cbc462dba809399dc8ae7995f626538104c266d5aa32325c9149cf21aa00de90c4bec1d95ed60795b9512aac32ef7d76cf68602018f7b6522819990e03934cdc2ab270246dd67bdb01326761d2cda7aa1acc5f9d33f4d4b9aa6b22fe94be2d0b2528d9847e127eb6c7d6967e7ec8b9660e77cc12a43075db3ec4d1b9058b6a66dca963c03990f67033c721c9dde99bf2d3f00d4812b37ffe0dae1006fd02eb3578bc76a2455acd4f6f8c6e0b9837369690bf8c072686dc6b3eb047af242a98c020ea7af04b78e99ca0ade70b56ba709a6e6daf1688b0726afa53dc7a230b594efdbad773f2f0349ef1b2f293c07b32459481e03fdf392b42691d3830a2ad172837b4f6f3e3cc949f8824f9697e8165e12a838648d32aed3db298c3994819b897f5603d38c514f3e58d8b635637d5efb45afc08fa0e8aa2a1fe4ce57cbe5626e15f47150941ce38b9296d9822937dba074a73d01d356131b774c007a2ac6c474e9ef0e72fff044b63835400953c83ac2122704579f3b882c73d7c8fd4b8640528dae31973a6bd142bc5c70377d7eeaf4c0b7bcfd5ed967d198008e7d88d4547b53aa9159bde027a59144f098f0fc7aace2d1dd6fbce030af466ed7576d117f43fe7c9416f51da68349b737aa6891584f0afddc2b13c0711a217b2a3782de2f60c09cb07b9a54dc3057fbbbe84f0e027fab944fcc0dfab7a69badfd8a448af3464c738ce3f82637414ebaf3df1ea317a3475d9eaf061f62d9277fc7bc4cb8596914997fdca912563a905d85fb51f0f65e50924f50867f112647792f69e5d6d04dab870fe22799a780cf5bd8d973982d0579dad85d29ca21229e228b0fba76e66863c4c380fe3ca9c84e4e62d61dd92a3d05afd0314a5131327e04711a25090a4defcb1135977beb55bfadca9d9b548c699679bd5972d4cfea89776815d01dba72a212af7c7dc7dacd75e2667c869ab22faed0f6523da53bcf2323d68f2625855b2d23c4c23bb0f6a41394cd1f5a1c39d3a14e21a805432344dd7242e2a1a0e97bd38717a33bb7dd6e1b2d74d2a049920a3039b5b7544f14d03afb43bcdd20656947a50e9c085ced7fef24e452d3a34947be3c292cb5296f15be174f8a331467880c2610291c00a57e1203920c7ec9ddf0bdbdf264a252b079c95edcb73e0d8e6c7352d2b70153a3dd3652146c0c2daeb9b147b7fba66b7760ff5a51d0786c389b1fd3bcd232c65711ae98c1fe063f59e73b61d05e3bc4328fc26265725cc10488842135173ac93dafed30513ef78f5e2dae84e208dd0d604ab53f8df965ac60a922b3e1d283ecc62c94b118ab4a8e39e1ad295387f4a78f263a2a11f22d7edb919e1439b0a8919f0c17b3aecf89cc6ba799d7ab582d131da6d3bab7d90ec8e3c638caa32e036816d308907a183fba61d407185ff5e0d0aa411479e63aa40b07bb852fc4974ec0dbf5c9d00111d6e8cb1b6753f7edba70a3997ee0038367c5b5e625ec04a8c54c4cf8ee0aea48e9d7e5d25d22f9ac0473a7f47575b64fd4797cda8d67e9cf115ae850d7998c39d2f8709d3afdebcd794a05f69ab364fc74a6db0d1e3bfa76bd8d3c9239147d414cdac9d0935d24ae63746c144111a615c2ce4ef26ac09d3c2453c8416504141b91ef7020f8c95aeb6d7348e21b28e0283960572ef5ae788bd03f09c2fdd107055cb6f1e2ddbaf4e0f1d71ac48b61a9a0630d7217414de2e25bbf7fbb6613bcbaf7b1cdaab4aa694b9b1050501444691aba162e5fc03782dc2145a87f3034bb891d7071fd00304e77b3af88094849b4f3b92aea4d04e3ced5cb7202a2decc7a1c18637d3e62b50ae1e615204489fa03c7daac448391fb2d7bb4b51cbae4337ed0831b4df33ed13536bcd1c7b67bddec03b92abb77d9b6351a679f652bc3124042e80872c006fd43d27265ecc3705db443bf16bdbe4ecd6c4e7e915a6a0de154efb1ab7a194d91bd41d161edf01a0212e46700d9ab83a93994442b9b1a271923337a84c25395471801443669c0cb638e824b797de3fac2336862de75a0913231ba9d14fa235085ca9d3553deba26ea6d89d6d148ec36b0d057551a9891feb516e1a3ec7ffd11c66b723f5acb409f0f568793a89928a9ed96cd85706262a22a3945297bc2455b81712cccbb9df8a65acff7fc800d2dc6e10d578e6071a73dfa2f5198337f90906f622967e6f546df5540478bc8035030339a71ea7b24b424bd4f937aa3e65342b8b5049b7d3fbfac774e12dc112a54684dc4a904111a2df8ec30973b5dc5320525e02ac1defbc790494fd637dbd0aec1a8226975d2c0791cff78b964c16a813a1f8a18859ca8031d33dc0e598894a3eecb2a3faa30963a136f7e96816f64d5640e096a5126c2d6b5df5927abb7e4e8423f42983bab29c57ec4b89b1bc832a31589e48cbf1dead6fc947dbe98ea5fe06e6d020f84b2f9cfb197bd539e5c527eb11bb1ec29d27e68540b803fbb805420b5ecff022fd8649d5e40f33c83ac52dce92be8251bf4fc2f5ead27278e2a603ddb27801c979c18d2d76900d25638a2220042fdb42ff5f2806ee1c9128b39127c20b53bbb567e84f4af786ca19071cf02a8e97905b045eff01751ec6d2d4cd980391e987ad6d0177758e77d26cce847d34597c0b657754312ea6617a40ec623ce76bc1cb7a3616ecf663ed8de662c9b3868d69b327ff49a5d5aa6c1638a459fdb8c264f0e4682e98159f6f634e68f3786751e3f06b4546433ea8c70083a4b9c2bcbd585fb3ac52621a6a86bc6e8b0bb621cd742af7f152f3b1c9fba2e9938a723d85277fafa989324cebb8000c711854fa2aa3c994aa769d75358f633119d5f7814158b7a008dbf0f44b9097f1c2223a3b90f8350a18b929d3130baa25dfa138d11a74714d7050845ab193e9e52732502b26fcd721e4237f138bf8e18b8df61d743802147f8af1d7c6464b5eb0474e7e14153615a1b6bc887dc7dd6f2ccbdc8eb4c28a08fefec5cf80323f5f19cc81ac3c842f5851358d2a58ec42bcd03f5c73d7e195b49273d455cf9cf752e95bd0c2ec9c6d09fa0a9d4eee25af303e947db426bcaa8203912752fdacfca1e89f45a86c857a8e64ddf4dd8598ad334070483ae97c51d91801c5ac508cd5b2de3de7460466de5157559bbd666dc32d9c7cc3eb684812219a6bb64d11610aef93e0be84fc671fb89b1a99d8d9cd7a861b5ff8b0ea4976c35276031b875624bfcf2ed34b9bb2c72df7d5f61425e059a685c1ef72b9a6042505cbb300fc90aa8959cf2d812b6c5e17352ebb5b94cde8f5a24caf171b8845b07e12cee3b63a24b7fa6cd410f2c06ade1bccef946cbdafdc3aa640885917bfcc84f25dabfe7a1ab07aadd1de39d475e972589aa7f6d737c11477aaaeba7afce2de1367421c7815dca1392bd547d006a20179c47b7a44070df968f57088da8458551ef48f585e9da336b9eadc66dda67092d876fa402ba729b1202ab5095edd98b1bb0d7afa51386d03d417dadc23dbbbeb1cb80b8fb5a07b04485167872f9108ba91b8eb497b70a2ce33b9b9f2c930ecd5ee9096b109796dba88706d487428123749ffca8e04ccaa607dd860f0f72a6918f60884ec51ba669a8791af9556281df28aeaff1214d4ed815b7cb71ed7539b7cdb27bb89b2ecce6deebb15b5fd1b90b1fd80731ad111d4f875aea6c38e32eac946f524cf56960cfb64f787f29088d53d4ac90cf1660ac58f72751529474fbfc6de7ba70865408a0c924ced9238f8535e18cdb3def947290cfbdaec962833803c4cc02d7a0672af6820c22fde1cf272db0f955128b3516938b7e41353596597f437cc9c6f62b5e3d6b561351e65fe9a7ed828cc18bbafebdb4f9b72a8036d6ab348a8de2da1908e20f932e79a3aa4330d1b8e0ef63ae919bd6a07f2dc4ed46344275bd9fcea8c180c963c2e99c46da5517fd0fd0a57885aa5b13179396121e86e7bed7726652fea633187f0652ae05912adf5839b3b13155dcb20f00565dc63f8ec679ef23c046aec751c17449586b5184d0587f20d12b4ab62dc4089818e3bab24d038a7949001710702897f2de5222a0609f058f60e9e581b6e4f0ddebed84fc8302c8e985d17b89241305d198709128007a8131e8e3b2ca0dd07d9a3f4a2ac839062ef6df2158bbce2f22882f4d096640a966bac1af3ee99314f34f9b80189faf7c2123ed761b02decb9268fb2e17f5a17a2aac83a2e68ad730e6808935dafd86d343e319565ef8e676ca1694ba2940938b4169c77546085aa2ebbf70c1ee7c3faa0bc6eb38812875cf3df37477d9f1a74b4f94d58cd9fc9de9676efacacf763a7eed51eb931dfbfd23629222cd96634d48a99066601ed20172ee017f96fa7627b06ce692fca20dfd11cc652841db3005e1f3fed275911325ede43987dd0c1657fd0f2769eba9b8e618f00eed6b34c261c59322a253bd5a8ba8ee599c0350b17b935886e8e6919758b771d1fab02f94d1621bce6e810ff2a3426104349074f1d331bd778853f613c56ba660c8a72841d53602349f641585fd38e0abea0af5322f56c28bd0da43d8acb4123defb6bb340dbfcb07ad934a8f09faf1b314d93e0cc050ec365ad007307f0f49cbc8655505bb6dfaba21953b784a06f8dc4d81dbdc36debf097eebbcc5ccfbb18cfb4982119edef5ce83c054cc4dfb7a6a1cab4b4b035e9f77b563d1031707fe13e0c9cef1f86160a75ccb131586370b0edabbf8b3b63f21f3a6fee072dd9263d3217ca81188c3aff7051c12ce73480f1d301a80b0b01edb2fcc13778f9149a75d35b88a1aa04458102519c06195bd1b27956d6fcc916c1f6e8d27e2d3d29c1d048623f157df81ed95356aa8798df493a0731b1261cab5834272d2ceca01e8598bab458a63a6fad4f8ae7537609c8d2d3a61ba150adc799b3e057aa7ecafdcd1350d7391c8972da2ad08dff9c171f53c37e9b0e4424726cbd3cd95fab64ce808b33554c3f11088db44cce16c268ebb353b63960c828b4b998633cb23a169788468ab6f8d77b39ae33273500aea434dccb767dffa56196688d7c080df58762cc8d7e80a4ab6e0d25f0884725297402b573e8f054a3781f62e4b0c3d7a2603634a7373dba84938dda33988eeefa805e26923119c58915588de526f7770a481ca8dedc74a12a92c0b6447e91c1eb6f4f17727c80bb21df47d2d8072b57f5e81a107896aec16512af9f6a63d807c2e9de7059efae9f317ff61a047ae8de2be83b54be8c7282fdbb607eee6fec294898121990b22ad7829c6d4bb2a8b57473ef845df8e7484cb937dd3c18c9548d4521f3fb5fee7ccddcdfb34e2ab81a8196a5ff116eceb887622b2ebf309a989d812f89fc0dcb2de706f0cf0cb4d39f6d5db3b359676a4b9bc04259f17e0941c0c368dd05e470c48fca76cc6c9821cda18dc1a81e2de288f09b2268b94a3fd65dd474f6ff2a06c92cee1aaf551dc92b83f176e746065ff8eebb7362fedb64dfde7dfcdcd028b4c5253b8382b18cf4427c507b77 -MD = abdeca34f0dfd5d9097f0ea9e44263d17d93c6e02372c2e8896e8bd8c32957ea39055a956e4f803ea2a341166a87edb91cf0adb758fd39eae9438d0b2cb2cd39 - -Len = 75472 -Msg = 03405c03ce1a5d8fb4030f73596050e5abba9945141cd6a6f4bd74894edfbbebc2f75e83bb0e5045e967da2af262eb3364a0afacef6862aed14a67e79102949df09fd1f11de4e16128ee7f91b917ad4b021b49c4f279e121ab1cc839373b699d767edcd65b62b7ed58de273117473f346b718f178617f9076c7cc008a853e2f13ddca8b8df517bf06380f99075b948f689eaaa2c14095269fbb277db4b12a6a32c035c221078d473301c1e383936719a42d0c28b0218954e4006143a8a3f5ebb2a3a219956a16b7da7fabdb1cd8662278069febdb90c6abf23c0bfadcca4b13f21c81fa71992e716b061ff819771c2a52aff8749a2ad78c38c27a2bd7a074839f8f67dd3c114f246339b0c3201bf391d28d885b724c268626384e2f1fa31cab0970c64a5b6ef311618ee0b4c71377196623c1f90a615e1a4901faad2b5eae0ade652fba661eb4e8d47a3245551a20f18bf757d5a926c8c92fb4020e713f93237cc0f6b5d28d0f1b4a90181d708c8beab2acac8a04f9011338d2f6cb87d286756348ddb537465c19124524759fe712458888228e7454917902c33b7cd593d28120312740eae73672fa1dca1649b65e926c2e6c4b9dc5e46afc19629af10011c7422e75d183cc28a9309e9b57f476bb61ec03ec59d7c99489a359ee9e50b3cec837954bff9881ad3c742bfab326a4d33466ad2521c8dc0c2596e9420f7b1b63f48f0a0c237f843ead236a6ac056cd107a8a8e994bd779c5ff256c0f56e6936bec970158d5cf60476bccbe8e081b5c0da4c63ccb308a2f5c46fd46991d09d861110dff949f0e927208debcc6e2dade1563881c4d68577939cd7cfd81ba8b46cdf2527951d7939728f4e7d997e91bdfe2176ec1725bd5c3d8d333156bc7b16b1d00e2e3132814dae6b0769983a364bdde30e8a0dc937babd3f8ae1299cd32a1d8dd5de15b08f8fa35ebe9711c8a3c147450645f0ea7bfad95ce4c799e2375a77be821d88be2c66180e7def4b50608504ee680406af12825a894acbf0b7300e890b1bd5d384de3ad6234b5890fbf601dc883caf994183bc0770c2d5744245ac191aaaed3f2b3074a64631bd26f0ec9b97b8882defc8560eaab957cd6facfe9df096364d12dba77a4e1f35035658cabdfc285668506b14e2090c0e9b271ce349d625c8dd94bbcdb596556213685b19ced580ad470652449fee0ff127e5bb7d18926f67850ff4298d4891bdd5a4206036e86796b258a66ead1f6d0759f0b05373ee1d1b2dc9ad436b2a7a503152d0275cfe8617918d8f1a7464cc581a9224edc0b0d7ecbd0b0fa4b506b92210b992f7aade853bccee34d15c87d5ed50113fd468a144e31d1d42d3d5a2f53b58228f5687520b074cc3be1acd4e2fcde5b6288fd4890d0735476d5831c6d7a4f3d5efcf5b20c085f754547e2f838200bfc908a66b30da61edd1b9bc333c0664c71ad9e78f114ebcb6e81f84eaec788fc89206a2945d52f72e024d8641cb2b83be39752889ed5ab472c847b46652b781e6584b0ab9da1dd3de24523ec53aee0abf79ec19b27c8f76113df3960b7ce7de0365ff66416de4fde77def6d2652f600b1246642728592097d8d4bb34234b1af06ff483f94df4f7b2f564d9accdbec6d7e800a2c32d20e759c0078927140bdfbd76f511b1af70557a0f6934d1f9d77590dd6015e5829a9c358e0a2bb0269b2ca5efd40853b7faf9921a7ea0e875f40cd466d73604e530bfa9773f0b75b77382483f03e025f3df44799af7a666cebefd0118f87bb7a18dd2243038b0de632f9122e92721ceefb7d6bf2576adc36072b6b568265f6463fc74443d69b4509629a9b4729055a507ff10c13e7e3f94d7c9ca5fd8f3699199270667f3447e82ecec6c8b6fe1e44ed91f933e4a70c431911eb86eefe222d5ad78193df67b77dbc3f23a06359e6632dfb3de74dde0e440390c0161217503973d7a1d04bb6148c1b7d592b3681853e7984643036d6108471bfc25e4f22e945cb5a7927ab68869db250117118c0225e37f3171687d53b8acc689a658e6614d9ca28b19fe7c63439eb80f37bef5ce549d111fda22824b6de7d51f033b82cfa7ed808f040e71847e72dd4a650a59ef789ada6bfdb010baa08ea436bd1b3bcc2bb5dc3de1394a6e630e115d3f820ce80a6357a04cafbd13f907d05b346695e9519c121241fd4b73a9b6d0b217c4a34a726cf547575fcc09cff9d61719ac05a9b1f6cea6a6d90946bb03a7e39e309189593e5fdb9e6ed1eeaddb11d4dd6a2f7fb55c7e65703b186a0f7b036c23547c17274de3e7925b73450b02302ee01f67ede4338dd94eb1dd301f937fa657aeb78655222dd5d38404af7025ad8fd23a4376b722896c92dbec3b73d3894cabbdd8596b419a20c2972a8075abe672145936acb6900da9dcf7aa0ea4b19ca980005302e222b572f003495a741b776036dad5f25b02671b8db3bb0c1ac4465774f4bc15524c0c26dc36d5bff3eadcf4aa6d95ea2d00423c358e83d65e71f2d11b2977f324340ad6f7c074038d908389ff5ffae6a5000b8664f698dfe8414e90b30d1b3ee0613dedd32e98d7a9a307aaa640898a4b884f748c7a6e8b30c8a6310d1e1a5b0f6a11d5eeefb89ec0a8e5d12fada647991f7a912c88698ac06e961c69eaf9da19952349ab7257eb7b088a880bf5e5a1061c1966b5bf4e412fa98acd59e23e3e97a8fe93a954fb2021487259bbc7cc192b34a86fc86d5130d70010ce6da26beaf1ebe06e690616ef6bff49a0cf81de3260cf9416d53126ec4f18b48a1589e781b0f495145b143fabb3835d07a7b2706f5f6388e65ca933d60049e2aad22755757d4969300ffde9e7807b48f8e4e847326f86f378cf240c80832a278b34091a488f50f93be8218a256b5d79ef0781a72e29b04028bd30156e502fffb5ab8dca6d9fa1a1b2843da4d7cc908c74701d34a516560b80a75bf301ffc1e7b4b943ca7706c21f1e6490de912cbaed03bf295459ae0eb21b0e1609fdda865c02ddc9bed75d38bde9f9d97bc4244308276524aa9e6940d04261ecee9478f3d91a996e0c111b5c0aafb45620f32bbf8a59d29d9bf5c082f2a1434ef5686380fb767ccf36b6b9c281da44b54290ab86d015b802acf25c4b75c202cad30c22b41fb0e85bc33ad0f2bff3fb65754f3c3f75d555e252168500f60f50defbd22f13d2346ca2261fc973117778f52d61565fe8336cbb2fc4e359dfe39df9c47cf1169f7b9a2103c83bba22ef1dd2cf89725ea39a4cfb9aafffacb0095aa9e14f1132f410d156b0d6703e60c58a8cf02a18c244847732271a227002cb077dc6caf80f6c7ea2b1c1cd3f7657952f9223c5d211278c9bed59a5f44a34c334d3e9931df2552f9ed0bb1ed20873d87d70dedf16c1d90cfb9ba6c5fda1e26c535ace2a0b826aae1622014dd05b51fa14a785f85f5ad5a046aba31ca70d8830f360e8e249460974b92448ccc2e55e9455a4bd842452b9c0ddbbb2fc88f392ab8584ce6e4f93be1df865d63e224d1611d106ea14fe3fd1f9514a6b07fbea9e569a34f3209721f4f444554df466e8f50d173ca02d5578dab421b64fa1a85907aca20fdbaba8474ab23d712492194f97d098b4542fc2a4208bcfadc55bf6c56b282d63fc520b9a2bb23457ee99a1f75b26c61c8abebe383fdacb9f50b97fc63553acefe9c62981148ed967f06da966db5a2fc3c83cb0aba53ba5e9963c9bc202b990e2088aaa92a1928d2ffe90881484f54658713c3274ed28df3afa47d35f3fb48a08ecf1d7553f87d02e5db4d696e482aa293a3fcc3a742ce7f1e17dded458fee8b31b9e583f5ab942d1922d1d44768cbbd467b9e652d6b240bd0040e6e7fad34d8f0902a5b79fb145b8206bb4d3b77e0bd8ae2d0964815389eacb33b40071ec28eb29a138645b0a6940ad13359b23c10ab4622badd6007b2409a6b8ae947aa3fb56121c98bc392f1e198c963821480048e628185c2dd0a39f9827523f3a5185456e46b74f25a689e491538714fc90b636ec54859cd27e675d24c192fe68b32a87823c03a4471fc54d56764854839a5d65459be5d87a6630fd2e19fd64860bee423066a46087214bc8c7796c8f6cc160546052dba77c248af02274f3fa38c85af5f75b0bec6c4797d762d1561e0eb25974fb1db9726e45ffc680771937e774fb23558d9cb07cff3409b712b798ffc9c357445111d1a726e9f0e694cf96289e494ac972e9451fb4aad042c1e3889694186bfaa1774ddd63e3ffc36299ad62a0bfecd1af7422fb0456bb84437c55898dd3337c635c3f77697853954509e62c28e989fc97cfc2656ad23bfa3be4983f337e3e482b332eebc4119cdad092c8eb933092a8d04ebc0554a7c222ffbeb93e0193fcfc7d8eb4c0f03a2c0289c6ce377c3fa764cd8368415e41fe8d235d40fc949eeff7bee1398d6a6c91aac5087e86405128cf04107faff43b31973b62b7f1590997c873bd55b7bf335e4236fa526e8c3fa735f8583ab792ee1befac4196c2cb6e84fd408571c65af8e26743fed236cc3593383ecd41eec6f51dd4ea8c65d7683827f499cc163fca57ee68709886956ced8d542c022dbc1ccaa8159aa59da5bbf1014cd413cb9a89cab2e44149e8010ac1f5f8647946b5e0e95af0211fb6b433139174a3df0a4d15bbd0593aa56ee0025d5dc36cb53552dfdb9713127d39996a2a68fa7d904aedfab5d745c11d83d9001a2513a9286219460bfcece320aebbcdaff84cc5da05f3a54338187924df4270730c87ae45658fd004ecfc27bc7ea1da1ebffa111ee3e4a1ee637fc75dd9c2c002448dd0beb81cfa60f7af34a331c21bf12060d3c13d378d11f9ba302afbc09b529da4d4e6c247218a9d94ae7760b31fb1da4fb283aa62a3485b76481ecdc25ebe585b2f402ca4e1fc5f4af99b73fb31eb4de501b8940c910c1922839bb85e86d0051f246d4facb820bd10ba91e3f11f07ebef55e2828be2d7a34d573453dba022346f68c0b3c510b227a445fd493b139244bd23940e6705359a65577b18f0371f66da60ece184880b3f7440301c3fdc14d8dcff3f903464a05ef8e8d28002b8320cdea13461718aa654ef1ddcc575b50a28dd5d67a06aad927176afdd21a9a004a6eabe59ac02951e18935355ed835adcb52ca28ec7703ca6727d00ed664b9b01b59cfcaf39be33dcfb0f752dfcef2a16fe4983276dfb8e36c26a7095d66ee5a3c95400b7931af35d5c91f7d76bffaf4364c253c41c433eddf1cd9368ea9a2c8542ae4ef5309f3029ede94fe4b35b56eca915b8e75b1dbaf67114ddd92b43ec00c21a5c0aaac186cd0f6401d87b78bd6d0bb206f392b18f3ad0eeb46900f280b0c816ac4a5a0873b141a0a2252cee4f6f3d35e29b5bc527f591a9bb9b143ca71fb521a456d6fa7371151da54d3002894d9e0fc0212ebf11c123e457d1dd78bb9819d9f8929a0df2870a398fc33d8bf792aeae24378405d928081d1dbfb53d2ad4769e0d902bc99d5d8182c6299db116d8ffaf8330e44ffa94ceb271b73400913f5bec57c204a3c07f2b97fce2e938638af16261cfd7e3d291e843085af2597b433a436bcaad23086668d77881a8787a1344954446c7780d99d55d260d48ae458a7241bdfc9dddc1adb9cfdd7843f7a71c3986af484b531827265f6f60df758c6fc455c2ea4f2aa8bf9effa059444c970070d50746dc2b6ec45bc858d80f55bc8d810e2f1649901a0698d5458741dda66a5afee0c4e2679dfbd63656e550b5524e48b9370305a4922d37ef5194952171b48862c044f67e023826180e1b5c2aea3c7c058f231beebdadecbc38f3e6ce757969bf3a39a0f557f3dbebc2dc8a1ce0d29b71ac18e4c4d8d337ba80478f2b1e137f5293354a63fbd9683039cb5301d2ab477bf23708dd8067a968bbe226cdf82d49cb8faa8b206a334b73c74a5f704c20e083061ff07f40c5a2553066262d80215998641bcbd11fac0624ffebf7fe99cdf7256c262440a667b2fea24605d0429a1f37d4fb84eca89e18c23822c4f3581d0bd1890c2cc80dd86bc376046e5cbbe21b2846ec5ee981a403ea24813ef513988f25d114625c03923d522023980958b3cdf82e40b23e3738480b3979de8a38cb0190f8f17d93042f980935163b8ca569b8161fab178145d56583eb9f1c19542f03815505c703abfb1c77296ec14d2e8e5a008f8df7291a05ed02cf439028e22ef59579d3e70457af2b2a71afc1c1509c3445f26bf9bc30443ef63919a34f6f55683bdbde563b83965481b22b959fc80dd764ecb767a1251aebdccd73ede3483ccbf2ffa78d0fdc5b291b4f94e52ed17da3dbd312f97e74e46434f104d88b294fa14959a20407be680955be6e18f519463a2949e107ba8c4b488d582eebad7f0888ad7e6043a9a63775df9309b9991c01facbb5b41adbf7c9f9444774afd0b5e1d29dd264d46c20640f07420a3f71363b7631ab0ebb5923bb070863589d8b6a861fa8fa222ec5b958356b6fe22314145d2cf9ae4361c8bcc8f238104d2d44094fe04d6a1acb5cdd9e798a5123fd0822d19f92141496910f6e3b51f2e4d7712eb994f986d1228819a15bd2ba3235b3de533e8980d4d248b80542f46fa244c9274dde4bf4c7dcedda0b5cd2ffaf55adc33caa4e89169d663338c98e0af7cd829f96fca3187152d4ab26ed19860de56c6e08336f715c60600d730f8d49680a53f40fa09d86501cf319ae8cf501b06d663b408a5afe18b3cca34eb580af7553a3d1324aa9a306a3cf81eccd23e7394621b7601f9f73ce100291162bf6a1a261f893895b4612e77fa0907c2df4ab2b08256f0153bb670f0db85374035dc4619dd8d77f62f14a95193ca1c71005c1e84bf7ce8ed72d6c3df54466f2bc248c456fbb09aef249be71f8fa527823c5c0135a0f52731a63e7ed7f4d47fcb6f96dd06015967279ade310a7401ee9c9c32a1eeae297588dfd6e8ff41972fca43aed65177f2a84799c4ce3acc453b6826c747d56f81999a26864b80c5f849cd4778fa5ee6e223f6293708d61edbd48ee4013a126d635d108236ed81085d937f81dd9056d691a1dd531f2507f32a81b5dec9c4ce30388792fcce182b912fd785fbc3df60cd67e9a41e626ef4d29a0c851b082b313e69e0c79b3612a6e8d7db8abd1430a555ccc5f293e92bc643933ba8a3a4b862215c30586757231995bb6834cdb6cb4df528fb6fb89ca4a4ce7dd8c37e87b38a617b3fec681795ac2045452b3593f87f36e354c4976320b7fcc0a981b59764d0842dd42ca75fae8912dc3c18fd91ff639e6598993827e92654c477874ebe125d14d9b9c02b18b8d5f3e713a32b9a2722b7168f95a1ce451a5ff2098054e2075899e9b44ffc28f9bb49d09373c995bae4095f0061dc427dbba3b02912cced89ea99c48e812379ba619efe8431de69fed01aa6b5a5f169d830aa679de5c0c6e13b9ed20f00a7f142ef79d9ae8473003c0f75547408e62da0a2fc802ea2375557722f7bfe71907adb8e63c9d8158f41bbc89fd20632c5751b381f61a4f13a8232b8d527247fe7fbcb66e336cc8c3a14c524218733cc9628931b9d74c779d035bc34163e4ad0b35b5b9e818850907c61a04b84dac27e5f304e72fe205fe301563b0f7d28360cfc84d35ec5272dc95e10956450357def2a749566c8cc33d6d5cdf8708f4db1dcca5d7bd0387c2be0e70aec980bff2ac8fedcaf1f85e20cfb55823b80d61682e826ce9a1961ed117d2035ed0e3f9f92b0e450e6c4bcc9b2fa885e4c66d9e973d717bf7a64c8e3a9470f7ae0ef737f7d50e2b8807ef6e9ed7a7747724b202f4a51a61861d7f6c7b9e7bec20c623006b35003fcc674baaa85232826f6573451d000dac1989a72ff0a0435f3ba90fd9cfb574c0500cf9074419fa5e420b19cb5cd89bba367d6c4f564477bf632a062a91e0dc7b976b600afea93f6673882e0c5099751a415b3750f8e5897b4bcbbe795e51b7b016f5293c348aa219986f189e84bd0a5adec580cb752de9414a00915c9152970c635cad018238a306152271e855cdcbea732ee1154768277fd25b173ab79deafee0e47401643db2aa6e34c27060564a478309c0d4dc3eb4a5994dc8aa4d8e33f6243f169267046185282872cd20c10600a2e8b870c01c1150f35b1e01df9df280b1befd5ae7172014c7700b6513987f94374e207f8f8aede075059ff7ca57b73d0e06a0c180f09ed7c0ae04ceb5672770d49ca15796f58af292dfb6f2aa45f2798d88994ca12b0e5ca834f77082978e34ff76b3af730678f5d14c0b690be324c4d4d75f72e4211ef1e2974be107c4244f1c4ecfdda0184878b4cd05e15bb9debd68555bdaa66d416604578a96b1577a2daf976e78bab579d9b1e52ef2062470a1bc9526ca848a15f781f82c081bcc005f4dd307f70f687db75d26eef1b7cd9b40460948e8fae1ed44effbb8cbb3bc57626ba434df2a9bd4901b04ee86dd1faee799442aac761f67ccb2d4b947f592dfc58d6d6d9798ea0ee28ff17617e2953c262ab8549b829cf5fd5f0596036dda1a0727b12ac6e6bd9d2d009f4e3b64c8b37a7ee84f2cacd528655920d794990c8695def1f4d37090ffde2140bf57d024b5530a5682d651726f8345990661e3a4b5fff7a24443e30eb784769841f3b123b25e5185882f1cdf3bd588e0aaf1fa3d18a4166491aeaa7144ae55088e9584502aeaf8e7d7ad6b863deab78a2ddb39203f30bf9b856a238337ba6103fdc3c6349f97451fe9c7ca01c621461817741d089a1467d9680d0a9f01471f3d07f4f34b70c1ea704714b4dc6517a8fcf0533260a9cd8380e20dbc3f21b2d3f635afa7ff5f193d9b780ac860ab4c74bb310f0592eedab7345bf2b4ee29bc43d22f6a30eaab0bd2e3e5105149092e2dd551fe0349e9ba67566e4281267991d3533dab4a77f4f82f0c26cbfc0fff3b38ddeba6b7e02aeb08897183ad72a1f206fbe8e93131cd8cc656a5a4350ffdf22a37669f9fe012fb3f200e2c964d334b532ec9baa1a285282d75fa2f88c3a5f176644b5f27d442596fccbca3d8209e1c4c8e4885f834cc68c8cc8cc453e557a7a1f7125bec3739841ee1d58fef9742d3577cfdd1c182f3bd2cdce60942cfb3933172442c59835909b1021157491bd20f088d523489f7ab93be199e74c1fd2a22a93869270c432168ea9fc8807118cc2de431de14ae1d449b11250e9d4df82c048debf9f250e13310203d93a2043881ce5efd09f8ca6e6f11ca61cec9634b498733ff6f14d4080eadd64deb125ed5a35eed515e675b557bb62e6247af9e6103494fd540e512020480815337780d8aa15e23e153c6dd8d0af6c1a911a65bc3d9b9461008097779c536b5e011497cc1fc5a770f82cdcd5f9d4228a8a554280e4d559b322cf890c9b13ee86700ed491614c27b4e53b2a7579326c7d38b1f9f8acebcd3be4818ea9c6917ad7a7ef9eee19b2485104f3c080f9d1333dc2b8f0ed3ee4d7406c200d14c5d4f597cf3e5cacef00f4917edb04be20ba5d1051f2902641c85e0ce23470163fe4490f0f8478938a3d12ba7b7b5ff797f4d43f0de6416d5e9f4ce56f431e77ddca5c879048596b93718a15225c3af205877e111d1c6c883d7288143bd77fff468d1847791267fcb1a444ea9c05fb78137c45d0aa1c77408548fae06d77fb7622356396f36b0a0e8ddf278111fe0c5169da10c2db6fcc5dde2a8a932dacfaa31bcb27be26d9aa68ce291d21a8d0d345aea9c631d99cd1a7f21f2074a5fce44fd7554b0539e6afd31d8b0e138902ba1c8af15163cb2bf0e6662fa4cafaf22142fedeb7b4551a8117220ce0a0dd1c279da7bb98a1daa490e1e562fede57131944396b5312a1fc88fc84b47c0ecca78491aa0e83322e90186115c116f8e2e9351d3006076946142d4aec8bcaa57d2a38c03ef3fa60ee77f22e9e53d45fc3fbdb948ab6bbff6bead6c8019ab2af192dabf20971e57143df85102921215d23d17473ef84571e3907ed3f6ce81d72c73845efb3902cae545239cf5e31e3382af469800976c30cd8f2d877d47df137b0d46e7ee558b85f4a577632e48d0439ffeb20847d97e7116f330138e2621846fb888e6947d26fcc4c77a402643d6aa8cb3e0346f6ecab772653ce4a3e9e78e7d1dd0d7680053a3c83382b078547ffcdb57679901a7ff88426d9a9748f39fb625a5a536e39fa02f916257409f0b5a9efe61ae9289157b482974df97f7d3c88febd87c81819b7ad492ec3e5d04c8f525885b2bdd7047cc9b7a1382534b2ae060523ecd53ec9462475f39ce72342dbe14ebbc65c651bf71d6c6a209758d3975fbdb312e0a6f0af50c48c37e3cc7aa33e1ab0df2e9a7dcf9ae81d90b6b68b007a6f9680531937f81880221c3f919bee51048b849b3ed30c2775e00dea157ff03f62f3be945f462b63efdcd4653b4ec50253753e0b18c4b7ab59db219b3c5a6f96e0f3550d40c44f1b5be3e6bb923a2f39519594e6f1f9d610dd385331f4c285672fbecc2484596d270a5edaab5d0834de44140e949119743d491c2b14055f3b9a987bab43f2ae8c6f4576399b665fdcd97519347dc0cd961ae5b132ad37db981763537bd1546bb4db535389f573e830122ccd8f0a46bd468ff81fef6252dba4c6d86dc2367038ed537e1c55204d4a3771b157a6a1ea908b84cc8eeb9c1d0a68903ff20bd90ebb40bf0cfa2284bc2ef9df4be001ac75ef6ee1a725acc4610deb5bdf09db24f89fb40746147a89873c7f4243902991b081f58ed20cbc40e68f361101dbbc7ef58a52137493e497781bd084e18ea5ba60ef2a73956ca37a74364f98ed8f354fcc2521cbde9ee9165574f48b6d03fd8d50e01579376de7d8d3aa40daeb4ecf0046172918cb5e0f6ee7eef4412f16ba7447fdbd86023612c4ca9411bd434010f72b0872e085fae107f632d78c6ff063d60cee2a833cf0aca5239cc82b3c8c829d43a2050d529be44a4ae7a55674b8801a685a64592ec23be3a4696f0b1f5bad5a558ae9857b69a29daab6678687979aaa23e974ee20d549e616a40d4434d418972b6b2632478ba269df472404f0b538ed0544612c5a505d1540f4abc0c3204bba8bebc5fa002a6c17b241e4b8f739e24bd61333fa235c00daec0250661466ce2d3eb2cdc7ec6d890de84daf8ae44c202c5dfdf23fc521b89ce076041e6fcf2a560c694680557d80b54c128e62fe157bf863aba7e586c610c4e5f7cfd01b83e69fbcb8380d8181d976a53988288ebd7a17b0c55ad3af748db8c32dba6461a98a6f1846ac56b9a21db7ba69a6c4dc6ba6f20cf211f18752b9e142c1ccc389699e2de6bca9424408d3e2544bef1e304885ef3fdad62758891ba72a5b0ed3dbecab43efc138bb6cda835e3b866b1ed27ca1771026b05d68403b7342a2867d9e5a3918fbfe60a97741b59337c322ad092e82f3487ea87b01a0a2ab533f3eaa1cdbce14d21b29f2ae64f2e910aa1db11f86aec9af89c46969d1d7b925d93e409b95f49f3bbf9b7f596cc1c88de263135aadaf630df00e0fe8fa620380198c2964b33221ff92bf38c080ab987814fcbc03cb0d272a5a8e56c843ccf32ca7324bbf5b1002e63e9c052ac937c197e7f19361074e7fce704b244fd59ceff02a3890f3b617aab8683acfe16eedabb304497fbe8afcd2c0da4d63c7d85a61964ba4de4aebce823dbaa27c2b9855be93120c6a607c9e87c93f9cf976738fb0e4b1801f0a22bef03ddcdbf6516ff86301ba423b9004bd08b14841d0a5cfc244a304d43a7c856d5d7f76ed239a1a5d00c3a4f4da964ae0bc409c43ce9b147b859aeea617e8396532cc2fe1ed50c20cffa2772a2eba778f0b3de4aadda26942db9315009e96692ed5ecafbe3bb98e8ec666dcea2144b3535d72c77ee400f6a0ae5421e9b7cd3b4eb0a79f8cf41fa76abfd77a3e9a7b25b21aa5eec8cafee41c66a7bb6a4ad7d74f29c5a75402c8342850bcfa2d82a9f636aa9f009079e45b3f6b528b893ffa66b9aa0d6e1d4cfd5e51e3df03bfbf144d677628a6dcd8fa828f251d38507e7f10129a489defba054d6cdf063efd3a0453cce40888b6cf878296fdd26bc7efaefce4613edbd2342a2801acfa52eedbc330ed5d064d2546d583dc5937cbf57bce53b667b7d1cfa2b21898b283e89b8b980b524aeb9d32252aace8a21601e208293c11137b27edece644ba5868a80a30ca0c84117f22e354cf25424135b4967f05e07ccf518435fb0ed5ee08733945b3a25d0a1c8a8142bc0c17729c5c8d1ac9ab677f030390adb572f2bd2a6a4454fd68236cd1d465574328aa001d553375cc63f8a21557f45f0359c4ae2416703df56489339a247429d26d05752be750af7274bb6e6e165853ce0d72495f3f660a82ddb4e6de4456c0522151592dd989d1a228d96a76086390fcd4251643adcec38e1dcf0d04fab424a98db5328df488e144c57a1f95f4be1e76f7059e39274f6e006a0030760f365ec1f95a8ab200f5ea3f94c51334a3110525bd3968a7779115c00d6fd89b4b837480ad67e804c577f17ddde3d0b9de034df070eafcf6633dbfb54e468cdb754471d0f005d5eb0ab700e5e8fcde8e6b3cffbe563fe38fb4fb75c974aad59e57205a980c5cd8cf995d1e5ffc37c31912652379b961a4d831723ee3c9c53a4cb7c039c047937918381054d362bc09c49d26bf08df77c73ba44b22eb93bf434d5ecb152fead3402eb078a92963b437f6d226dd5311aad51fd32d29ca1bc0780a14eaf7cf3c43b67ac83e25494547d6167b0e8442962255ec88c15c66a9ef62e9a0c5e687870c62624a0ad01c509c6d8e5e85bdbdb806cf0989afc2a884748853cc03ea3f1155cc4ffc83b388cedc84c544348facbd7ecbe09e9e6378f67872b15e4d0bdf24477daaa852d576052ea423f4c202f7eeb4d2d8913648bf4523a9691f4a5250060afcd9141f3ecf3ebb531038d81e8693cd6b5929207863ba9cb4e5d7a3c678ffc5d1460991f779c1aa1cf4d61eec41f4f41fcb2d04fb4e9d0c1b8b4eff704059a085574e50075ed6248437973b7311584f75976689da66369a67c54b0756905ac49f76ad057665c551154143d8bbdc0906f5239c581c95cc6f1ffa986382514c59a70aec584d75d558567ba29ccd8c4d4227d89619c9c2a9b2cb91fbbafc697586267bd4f093785062cf4b7b30b0076d2b941e1e73ead5138cf4f43db4cac21e74a3302d7650557c96091a983b6c37b0e8c35efa0e86b55325218a26faf6438e4ba693bf918cf4a21d8b51bf660a0260a23cfef393a54cb1a4dabb7d3488d30f32b70b51ea503d091edd56b9599152c3808868d1aa4f8174 -MD = 956d5ca8fb9c84cdc882eb0bf3f5ff0a61238f982286673bb9185a45858ea13827dee168b4abf313a0b82aa5e98d2a01510dfc9e2228c657425f2941ff0c6d63 - -Len = 76264 -Msg = 204047aeeeffcd141d9ac8fe0c003df086e2e352a20d2a66e7f77d7db497c46bdf7a2e389d142d18a254c29d897bfa2c752db9aef9c8b68735f6c7cc427e5fb0d16054400e20e651cb62feb6dab7b3b6bab712bd77501f51cb5d1748897af8383b1743300acc01a5dfec04afc85d6f769da779e6e34a6dabf055f559503499ea68ca836e59c085fe281c5df21b153754662573940661a97cee06ea67615449ae9f9f9a64c3a37a43ec1890e59b8612385c5b8a2ca93bdaae0b977dda8281116c27be1278101de95c740825f20f59080ac86f4517928008289030371a7c63f70c4950731407d8d9300815a480413521b2f2892cbd8ad93bd2c5fb9f8f17a306774d7d439f727952a9ef6796f6f7c3661822d2c88658ee7c94f11d3da21ae943937b6c0c8117ab5cae732583befaabde24a071a0dbc666d2565dc199b94fdcb8491a465521be140028da77f13f129491bfb38f3d229ae94600520d3c3e7c256c827432a7e9315c45fd6d866ae1062688cfa55425c59d21df7a1629ad976a6c6724cf598940372c3416747a750ca00aca3dbce7e22a97b3a5acf13e742ee158b21874e3838e972cd35b377b9b28a6e85ff24171fcbb504aa07f2d741a69a9915447abf71d3c1a032cb4fdaf629de16750d57b19f9de8f8cd9d911f226b289c05598bcbde0b08859470a104155d41930a4cdb40863fd1e2157a4e4e120704a8dbef2ee5e5353a9d82a43b657f93316eb63c43265c17fc3b222c6ef68900ab49f963f8a02ff8d4426df49381ad8239f3f96a13f599ccc47e743297ab0ffea8f9fe566d8d06ac723eb6e02deb1790d7ed4444c210c7b4c7167c1b3cce1f577a334b34f20f11e670cd0dd58ef446457795375ac20a5e6670bdba44e2f22f819b80709e2aa8da3d7c87c3632b5fd226b596431ab864d6585dbeaf5e1e99b923895bfee07bdcb7f7d1f99817776023aafe5ae8130992b810eab3dbb5343754a3c03056ba6a3d33cc3d8ccc4117b7b348de7da6c24a368c16a417bfe8e85d8a88eca8187a7a2ce6110bdbf09e70c91996c258ffb6dea2bae01654dc679f7eb3594b2da4af203e477cb941a57e1706befb3697635f4b79dce3be15b1cfce1d778b783b9bc6f0e3c055e2684b7e7f133c1cc793722a151e5ac817c4c07ff8ac3fa5f04c5e6070aff93303ba62fe1d50e941e1d79ca5d022dcd39fdc9906a3bd841f5fea7cfa04154aaa99b28cab76526f2111fe4360e109abbcd2d79be253c3ed7df39067f23f964d1310db18d52e9a3620d46216d9dc456fda3d4059919d51c44877d8bff797b5690305ae98298a9ad6d7a59d877f366891b25ba14292c4e9a0e5392de56880f536f0e4a7ab072ec6a99c021b05df63e5a9db9a64f7747eee2bfad3fa68c3afc83f733a5091fc8fc0571476652269093f20cc9615d8a53fe19defc4d8baa768c0daf083341d8831fa47a78ef66daa8af79f0bcb4e86a36c66af4a88537b723051a1ff3bcc7e2899e703eb986938226d816cffa649520da8efb8819ac4fbb2bb0d1d05d074645c4c1904473f18124f157f133eb3c0eb3259ef422b68d7ebf75d55b49afdd640a1bcf2c140ff9d9cbf37433a3f703fb2b013d7e4be9ef6ac9e9bcdf124f06c93875126e37f366437c137604a88680039155b5c1891a99bbe46fac86b4a74a1ed7bcd07c348900664139a78bc9007ccfec094ce467af541a15efef78b61d710bf0d7527e93388feb214d4df18ecdbf0744044b0f6a11e82f6651cbdca01b423789aee09ddd67da792538b15d7f551152a130fa6c1ca81da1de7d89dafb08864bad29c1009980aab953e01bf825003a580c74a02004dcbb18855c709c4e4c05ee61303fd14feac753b52ed2ea073701c28cb88656aa16893e64d4ca47214f87c9afaba035870df9ee530a205aad6030382ae4f53497bc50b882cedd06fd78d4849e822d56ca510832335d4b70a0e58d61ede133e25238d831e833f3ff6831b3c6369d2e5c9f1ebbc95f0d9c56672ce1e6dd95888963f0e94f9ce9525aece2ee3780e4eb6f8fdcdb58df045b318a9ff36e02e93e51534e4bbaa8da424011f14b808340abb521f3308ab928d02c92a48da265c59c61a9b8c51b13ec0dd95ec793494897b859ddcb8204f763436c06a5752a0d12e9e2ed98211ae609fa4c5bcc8d39d5d358814bcc9971a19cfb1c6e0974ad02b66efba855255e281850c2906803f934dad456f45f3d77bdbb4162533852d44d9b73d561579a90e10158628604bb316d9674ff5fea35be55a75d663b9ad746f5a73f97a00647571aac5a55c4067f8886ed7fa414d74aef704a9751b197cbab02c41c6aedcaf65cda019dc2d2d815a689c93f6f9c8c44b2178b364b3a97f5ad7dd95076d10b6d4729e86bd239e045347d11fa867e73ebae5152847b60021ef26dce24e2d33175bf0f490aac8088d9da6badf91142f2068c2687c70aaa400e22da8be0d77ca4d66c950cc37a2f37973f5a84843971735ff39e134820a0b98de6ccf7cc7c52cc58f7c219de61cf54490c5280e225925dbc8cc2dc4fe3cbd563e64cfc30fadf12c3089f58a38be749b5e85c885dff2d18e6ff99cb247eb2fd57c961815378abdcde4632b15a20ff7da47c7e853becca0ca5f32bc80e17de973337146f7e1f3c93725a850d4a479f58dd70c25dc516f2a1c01181bc56d7d50dbdda6cacf9171ca047eba052bc2950422a6b30f943a52c3f0100a28d45e521c5be5771210c87d36925a2896af8ee99a35115cf41fdc1014e2e689625216a4929fd592bb6ff97e758d4274a3b46bd03e31b17a71d3a90f83610f3666a328dd69f4486a3541971e2d41b21ebafeebe156a5019c076443d995f6f471946c2774f915986e0e1a33a4c44c43972ad371b57a1b8c2233261ee6c31130cb7a0174f3c660502ea46e51dab129516e91c6bf951ee1abbd73bdaccfa15c3eb495f7a3e268610a2ca6c274089a5576157e6d0838cba40abe477f7feca71498bd66d336c9459420d873ab1cb6d65d1c1c5f2aede8f6ef03b53d0ffac64ae6b9666b18a000e4763ec2997cae7e0bacddf3a284f35e270f3132b2d3c005135f2b10213c7221cb83ae6b96dbcbc690c1162be70faae0e2a11da7475f420186da586b07b31fc471490a43da3cd7190c367f359b2f6719a0211393692703441bd4ebd7ad111b316c32dcdc021462edd47953a14d68ca70e62bdd77a6bf865558fb3fe68fdaf72122dd90a47cf6f1dd90163def6c40478f3b1db5d47e8d3dadb4a9ef081e8535fc1ba5c03dc958f630b579b880865a60bcf573472a6f14bbd5b55d53bcd7845a2add37d5f865bef2bfbb203df519fb9892dbc90bf9e6ea6335d1a20885496cc645ede05c74e09d89b327b658cd95b87199248b7eb37472d666a00497f1f2b32cd5b45bde23a8790db37188736a88256e48863709f7965287e096f16c7351dbd042c6e6a5955bd5f1492f33186c7fa6f12967584836daedfa2c3cf51099e56b63259c3d7d3a4938f6ecc722d233dad1aca45e6bc3e1a0b99fb1f89c0ec63bc657e6aaacbf931f267106cff42b712819f341b1ede798964a0b1a5032c198b391111e88d0d7303c02e23fa0137e74e604579a285b2dbc0a23aebdda65c371eb403125bd366e822e72dceffe0d55dfa3155c16283020dc9abb0d150da1aef251484aa49e49e00974dac3a0203e4c11edc1733e28194b6ac694a8d85082ce9a643da013c287d6469dcf28e8bd42cbac048d3f8aae5317f6fc34f4404965bccac284d3ebb07cbbca07a49f322ba74f1ea5fd1374219a1101ca0092156ee6f403cab278a4fe94faf4511f791501d860ea30858193383ac10baeabe49027630ef60b4ae0c7e36d2e65e88458f9c6528b8f42bb2c6038d1a285288b7e79098667e1f2b2cedd3561c09f6c77b168ffb2397e3b125653d9eb2ffeb623c2189bbd89882f8e754d3b1f5bf12b6e14daf453e547b80fa1f661d3d3e8d60941f74464fe38f04286a08af25b0bc3dbf5d87ac4397c181791b0874848c406a090ad9a3930750353656f9b97385fb445c6d9c99f807bf9ce982aa0a4c920d68e10a40396cadcd745b412e35a8e6d8b301a67872274d7cba947bd54760f7fb4265463270a27d0daadd53308d8c7a5972f630a2a0961100c1c02f1093876413e0dde736b0fc1e18bd05b38627e7ea89698332a28c0efa549bb6c5e35688815c2a9114d5614339f6971b8ab86d81dd6d81f0d4019d56b07f2ebe66d6f82cf5de09c8f696eb3f75b01e67ff4fc522fc0fa08440463a38dc89641f3a72e13b69a163ccb501b7b87b4c3c303bd29991ef76af889bf9cd7a267b2323683e7a7d84ae22e3789e2b76f2d5d8c066c950975daa974410a2bde5355c551019c329b9ef0c2c5667f6b0408350d95da7bc52fcefb43e00c4ca7241b234e12f748757b951c36b6dac90afe0d6c72950263407884c9b8e04e2f85456440bafc8a2146d4353dcc56f6cf48e1c9241afe10cb9d7021c676e9790b5cbeb94eaa723caf2d1209d5e24a6d2abb7bd5fc7535781d12a340920c503f6883fca49d8b18715a7ed18d6516f58033c908be760fdfcac0668e4b9cf7d8e3ef918b90cdeb53eabbd28f2a6bd8ece2a2f834dcf149516b6dff9dbd47c7d818d90be8185039b8eb3bce978b7ab68506d0df6cdc2eb03eec6e445e1032dad240ed699ea5b4f4bc0552a9a70ae22e725f45d53d166ee2fcc059eb5beeeecf5bee65211bb37caad1bbb91a2a3362bf297e8a70122632402f79b94af393cc03d99408d8fbec07daae90a7869d9f5cd71ec71746888629662b9af4e9c1b95b26dfb420d79b99f6f28706d6857d993104d6db64af0ca0b4a38586955e52ca3c86d2d145c39757ba810fa0ae8d46db9fc6c62e0b401b2054a6d1df230f0340b0c2577df0235bafd314bcd0980485b0f9ab71316370306f99ee750726727fb78867e20cb85d74fcd11c03193b81b6c3cf116c7815d5e8f8e4c90391083f148903d5e72ff6f86fe92505670d019b568e90972c849ad7a156d5e4f20f50bb5e5fb39afb3a447a98df4f7f7d1e72a7e17bdebb15c95afc0603ddb0b4c4987dd986282572ce196aac59d0d8a9b0073df41619ebdcc8dec9637a7ccae063380d02a6d214025dfe3f06e329af617457d3ead7c2a7c605beb656353381f96db7df663c31d50e5c5b6e3505ea7258ddccf0424b798d85f243496ade82746446a06b70a0d7e71b6bc97eb32c73afe44edf29a6ebaefb81313508fda0fa20b5808a37be9f24c8adeec0f70de155e6986a16c66532c3703c24dc6bab56faf5619dcddaac61b9082a67ca5da1af1184e991fc7d29bb579a3b5fd1e7e05b1590fd00f3bac6a2f52435695e291af037295c6908a450dfebc7f3449e142917ca51ec5c846e99dd798b4365e4dfd65f27327551c3e2772af087f8659967022799d6b403084ca26bb6cbd8e006e87036623ea8eea6adf9270658bf556c56f804f48df896f7fb5cf82d546a5a2cd9553098bc7b92396d735e7dc8bc768f7a773a7ae60e7acbf135ed5dc37c46df3911b80b2a61dee4b7623bf746745b6b280c329d8d7a410ca4d9c5b8778338967e12476a17003740f24239e3607b7698162377ccd2d06c22ac951bde0f23a1db1ef36915e0bb3dd6d49ff2d285465a8e9b59949954856ea67f145a2ef8b21515a211979f3617550ea4d7d135434969c74e1af373912dbb2072c3fb3bb2c2f4ee9e194d7675991f5109966f8c290946da94e42efc072df4094e109984cbead3ce6967053c3da4ef5669381867951a54210641918324fa8bc967a69f8aa27e343d9a775940ecef67874a49863815d1243328cfe5b98937f4f935e287bde5119894b7e6b43501ccfa5c3347137e29e239a962cb760f925ac2115f50ecaef229739c4821a0792ac22a5daacd6aba4fb1f6cc5ae0dce5ded7759a3a7e28de584a479ca1b4a89db6636a041728d66d05b50e44578c84eccd3281fc6dc6e6bc85e8a71e7b1c271333255bd81f05e116ea8fc27a0f4b0874fbf069d04fc780da1978f4ba2ac4b66a2f8c524218d135484c96c605d888c22ed995af8e86fc91b7719fc2c8375ad1031a0cffea9b072d61ca6e8b5059e26c6af496c5bf79d293c53cb193e1372b018e712bb73a2c345403d27b74e1f9d441c9bb784ecbbef5f183c952da9d90c1b26cd36d1aa932d5239f034235433edafcbbcccead3bbcb35583a5f82955eabb8e1e9f459cc0456626a3cb572efcaf62f7c176ee5397f9a71a455115e2928b84df245359a007da63c7b2992ed466b1f8cd7b686bf4690c5dca396940a8dc199a300e9dfdd6f8785aa13bfb3dc829ed28d83a0fdbe2175b23efe04ceceeab1b882b4dbdc6a40a95b72da070087caeb77fb29ddb92bf3b6cb5f5da8a8f1687e7cb2b62512899c6c905d7a08623547db749e7076a44ee3dc770666880abd2eb24cfaadcf6b82ab578c3398cabf3021f5323e0172a56e1a6e1dfdc4aedd7865d4922342dfce9c94f2b7bcdf5601be7fc119a383d9a3d4bff4270a1d22076b346db5f61c5f222080c57abff4b30e2889c892949fb388c9fbf6fcf61aea72dec4041d38e456515696593b0682e9d0b6699103dbfd093b93f6fd0488621004183c2132b441cd4286ff3563572f012daf44a5d53e44e2a47ad790a78a9e9ca763c54d5b31dccbddf8e2e15b7ba3020f5d458a71861d47abc8c7384dc275944205870e03765c580af468e68a3a87f45d0691ca3d7b2f3f38c3ed7c5efa9002bd47a9ef8f4c6a7cb1c1b9cb575b83e0fff353eda3e423d233b572e442f896ed00715475687bae40baa8fc182ca83ecddc6cb1790a8aa00884e47df86185305ef2cbaf2af6cbcfab0df15a5670e761c3deb8d3f8da364fea139937412468065c7d9de395a10476c693e4fa0c8ae193caec21e2f17aaed77fc81bc746f16bbfef882e173ed2ed4a9832c805c2e45e7debeeed06ed54bae2d08cb4568f3154031ffcc774aeef4ff429d3e7a200e526c72dcd656673cf2415e345aa0ca54dec7cf5bfb0226c62f21b815f87fa4ff50018996fd12b0b53b31ac2dd46100fabfbd078ba314800919e68a9bcf134367cb51835bd797c3d482e99753ad08b55b549a7b1d5920ef3e61b82a8d46d793ee20e700b9fa48292175e39024690a400d29daaa6f91a9dccc73013868d42f1ed90d0c823fe9c6591260ba373e7cd849769c080610c121d139ea7c04bd1bac3ceecc6c783c0a74cc3defc7fd007d152a2e47bd2eaf7c2b651d2463300871b18665fb71635cf0e5faea7fb741f8de237aaaa944847a3728e0ccbd614ad97ae173f526a5d411119c8dceace2a6a61495b3623d38982f76ad0cff11e0a58e8bbe9e02ba843ad700facd50d3e4ab86b4ee5ceb7023ea3daf1a21face8be0b648ab5d154397083d33a361f7a137c129338fefacee70eb036512c8664fad8cdf262a49b33e58dcb21e08b449715677fc151cd43d04ca2b3f2d0978b811dffa77a8ddec53274428b444ad6ccce0cb407dddf7b3025f7a1b3f6b70bb76b19db9fe5518ad7b7ad36cd23c03d3d86bf0ab2cf2b2f4a35b0b4b92a4eaf908ab615c019f7d0592c591298a689e82126f712897f7d1217694183cc76dcaca047bc550fffc6d9d4f8407df5b5ef00ff187c7493d51d4c212771b5f4c2ab2a6f08f242967f08cdd0832a20ea3838ad60c316d7d8ba5204f0d807f339f60150833621855c8203d4d335dfa28217ad16cb8f8de3611465620ae5cce4a4fa2746663a11c669ee0114677626adc23a9664c8e4a84135cd9e8ff9b488313cb66535a07a8aacc6ad48b813aec9e6b48a3bbedf2a30995ccb45b345af02810a120245b76054df7aa520e660458ef75fede34d99c9ee92dff8a2f5743d047d14f7489d355336088dc0d3c6d4a33e88cb4cd8397d29a7d5c53afd7e10c554cd644b7d66a2bafacf08e4a882f930a140019060a914b3260a167b9d76a1b1bb1802f8eac784ff66dbf2fbe63f57557ec8089fc4c5e4cd32d8dba2cb04ad680106f4e4d7e9658943d553ecd62874789ec7e8634cb777e092e71b97cf50be52ee4044f98bf3ccc05864339fc062da03cae6aac33fa455550fe0de42f1835bd74a6efa1d500e420c6f319bfcec18115cc8cd55a6e7b70492716b2c8b79c50d5fdc381c3a6c624ed54ee392eba1709fed6023f1f68a150e01802f0e5aae3d5a526d44b43728167883be23215428920e1c5c91879a71e9fb0903d58b97d914cd18c53dc9fccc53487e87994f1fc9a7e65383be1d7ae4595111c404ac2a4271eb19acc96471a040472f71ec2434ccd7adf99c53be7e2a8d9a83896578fb317d3ebeea908c7eec06fcfc44c5a87b7949ed7570f76f8e8dae5dc61ba0f7f2ee604d6d463b490bf7ccef4ec7cbe4dd18262d31c7533a9253e42342425c31f8c041a08f8a72a3000abba98ec3a7df40f095f694680e2672c556735fc5412ff3f148c08d7cdca3456dfbb1220100a18e4abfcf061dd13b162b2dd5856ef8f8cdc79f34cde52250c268b38f74467f33ad6ecc40efac448266cd90d11c0329946c8b6b84b98cecb360430bccea5dcc9c87a4e3d1b8de0e024bf2a8f08c4d7c0cba84d739b83be1d205452cefee0d8ee402342c0bc77bd8c4abe49db93d1497679dfc08da31b8a9b79ab73e80e71d6d140865d075854b49ce70e996b5982025adff3929ef8ecced6a08e168083d5613338081f7985a150a2a804abb6a0338cce6c7846000363f55f1350bd30e5780254951cec8faafa3c2e0c54f3562e726341bdd25d59691d988560b7da71a9f634e5f65956c25eabb1af6253f2c25adb006542964b23807622fa1717e0bb47cc6347ba31d0ba17526ba768a64c739bb9fea9792891c6f00a1f1d84e58276556727fa8f3b0cbf4b6ac4967db042f287bba87ee03db3dc2e45f77058c5124b49630d8eb3d94d7a8171470d200688c7a53cb866061a33db91b64682f12b22a2aa2c6e74e69125545fe28d6bee0d805b5ad988ef5952a44dc0d786d5fc8c3604de3fc53d860726e51d5ae2433659bc263f0eb48b687b579b423632e9c96cbefa8c19cc49108fc4956036f013a76fbec0b848a5caa1f8f04c8c3ec52ee6414ffc0a56ce4824af80fdbf03316d9fb3eab36d13d71da46ff0ea056dd825d1ae4b71ff53658b20fade76904c20a1addad266b3fce2f4ce24cbfc545fc65f2a0843f4c1bc0cb293d64fa87a7e38605029086323603400adcbf3ebef712a4b4de3cc0cf7dd3e3f0bd656fbd416032a1532ff2131ea6491c1da0b413d3e6e6acbd5362318536480e78f86f933affb5f6b8d193975f7df5888c37484d4342d4e023134cf999b3a38b55652292fa89b80c1ac091456151e95810cb23f3adec155af9c2a7af23109c703bf3af41e9c5e2ec5f4213a68ce9d09493a56c8d7bad522228a99adb8a16dac414eb3f28707ddc9d71a04140490f5042fc0e4ca4144d333e97104e06368d068fc795f9d0f5774d273622449efe89116c334cebbfe0945fb82d3eeab78f3dc7da3c3906c0e27cde93980f44451520bc191fa77066474a7f98d47d9777fdedc6ac5b1f8d809d5437e87eb168bff49cf952aa690321b1363ae473137dcde867ab0d0c8fb79990c7ff2ecf4ed99205c56f1ebbd8ce79862139a6f149c341b8711d0537d0ac92219dde6d752fbf49ae63c7853b3ef6f52ed324e53867925bd5d4c49dc42b93f3ba9d7eae579c4169593da98f10e1a61e1214a2aa2fb511a4a75849dc9be89445c29184f85ddc877c6d1cbb45230a047a98ac5bfcbe7b69a397c454cba44fd90fa13f9b546f39ba0a52c8a8ae5c0038932962f8e3cd00c1e00be28c70c8a787d9be6f69c975f902996f0916d2a30d6bf12eff2167448d42e46c789ad5ed3ac92c83eb965f576586b32ea7aebae177c51a0d4c7d910b6a1336234f2502fc4ec58e577acb1efdc56fdff669176dfc876d98300eb5680bdf5e5f962fd6fdde2ca38aa2e3b00f5061e4a63018f9f3de858cf3fd1070f42a3448e52fdf55d0791c8ca5cdefec3936800e8e427cfe556db949b1de19573e51b0fb5255294983b765a8693e6628a5986c1521955dcc9a936acd5c3af0124d699c9f2d6fd35b1c7f511e5d5e100b595f6b20e791830bca37e23f7b785e482a58405bffe7a632a5b826170995b43e5f71c657679eb664ee4167c897022ba1db08e4584f246a77254c2dbaf64c1c68bfb8c5e32925bd7e0d984290373f1fc76a5fd0bea58ee7d1a522ae30abe90e327f1bafecb58c61032f26bbbee397015fde474bb4898de4e92c22f1a0b0d65343a981ce99943d6a985cd2197b24729b1440a79f6284892b66c2343d338e79b34544d468134d9ea0e79d84a6ee8038b38b976612f11dea82f16f40dc10cc3cf5dd59fbc6826819ca98f924a8408151126feb6eed89dd18b2323c2e1461f286e3b5efde300d6d15b253799b6898af26806645a678514b7c83d030e62e4b89be43750e65eddce5fa1ebf24cf2e1f911dc518acf6fa72ef7cbc74545171f8184edec5be784718582fd78402a942fcaf9fa82f2846bd14518127c5ae552790279d7c4b08ff84e94c1ea54b1b11eb589115f250c17e075dfaf48a6c49db963a3e13e5b2f3e2ed764b2e4fbc78f0725bc0e56b2580872178713bae102acc081fe618e0a08809cae8dcc79f7e202c1f2cc379db566c47538b3ec05b5a5b0ec367a61436bece5c636688515b3a1baf3af422370a8b8da7e4bfeae958f1e38b1039076fafb3cdc4ff19d5344c97725f0bda6689c06bec8f1e3bfc206f7fca2936bd909113278d27e8294dd93a3e2c26da0716d6c49e90e84728fccc66a918d27f1dc9e32ac4176f64bd78a6edd651ebeea3ba85dfcd8298a8ad72540619d66d317e3acbbc2f7282bcfddd042c08ea9690d5da00d9a0c88989f3e72217770ce2950b6cb29013a64a3812045cc07cfd0e08c5ffae7abe6ca13221e39d616ac019f3e9e6016f16bcad1f24751472d9953d9e9cb0f789d075caea60ec2dab9bfcf99343301e21e0bb95bb5ab99608c7b70a9a827643d07decebfad88c3abfb2c76cbc3fd3736e1aabe952dd57484af06d5d439ed8fa156ed8ecaab04a2c63562a5ab70556661e6c94912dd5d79402f9be1ee2195e84214a41b44211ae6c602f2ba9cdbe4161f87d7f749469c2e1f68db335bf1a904abcba302d0a2241607ee6d54243921dcbc5f6737ccec19e96ef52528b22caf7b2ad66ab3e4a0c8a7184232d0d64a8700c4d7e79902506f61db5f0a50653511a25bef5bdcf49f612073c8d3df27729c58c58be9898df604fdd1010b48f99d6810cb5106bc950095f8b6ccd0cdac33ca1b2ae5ed87d45f6333ec85a850f3e81b5cd5b5ebf12a76cfb63dd8ba2ab910a8ee8160541259ff129a8a475236c887b3dd27888c09396486ef9576e084f29bb13965a5bdc793578ba836e0a9390c0eca181d435763465c53eb4a21e45acd376b922400ab0614eb46c37ecc0de612dfc6a44360eeade5b0af5fb854461acd76306f591b7c5c634cdca2ce7400dc919d11f8268ba2377c1401a38c98865367cab8477140c248e2dea59cb263128afca9648a230e229e8df8e36d2369158310c76bb1093b1d4a38233a37a733c35fa89716e0e572e051afd1dd03194084287cdeb3229d44eddeb7bd12fa294093e949e8a182da545bef4631570bdab942b1f08337128a18a48505fec85ac523f4a64510ace67e1d05c5d599d9fde43de1ce104750077c00d1cb978ab2efe75866252ea191824d576e83f26dde3fc238d1cb50bda687cf980610d0c37b102c5888d46b0de7fcc47e0698113fec77f144a3483638a30a1168b203664b8961f0aead328ec828ac700b6e70b6828d0cfdebd6b3355ace04dddd5601bc85566bc0b573ce0e72cc27ec89f6bc56d828854498dc9ad296900e7180729a47f36a8439175d157e605ad576643fb97693576761d6356d927e819d98dc883b9d384e41b64ec99733435d5bba44ba269a668229e21e61ba09752b28a05c177420a67a2ac4c659c1d18e3c213485f65236a4415321ebf1fe8c0ce5462479a0c276d066b5e1188e33ed938fac51b264eadfef1d69cdc956a9beb8586c91dfa4b50448ac6997afc75bcc05b073be54964efaa96ed422311059f609ed0274d893aa6d71a3cc5506a5b81157471db6e6fafd1b55ce38ebbdbf7de6742bae4a0f0e40f6ddf544a5b799b7320adbe0f7d41383c696a3fe66b9a483e4899cd68ded74e745001969063d23f7c282c783edc6706160ce989b4fcf601a94aca901ccfe582bec6a78a00301c4e83771926cf51882149e7004a5f37992906b6fe8c663ac387d318f9b9008900d16f539d512ca54c92bb42d8084fe128c83dd45c47afe919659d8e20aaf93826cf2a05e080bca05d605665984eecc54ee735ec0d4b60a28e24036f44e5540335509bd4093be7096093009769a19eaab18cd8463820df2ecacdec058cf377b3d65daa0a400b15aa0034a321738bcd57f9c20d2a064c965576684296215bcc10b0fc3feeaf76ae49e34a264bdd93e195cf8ebcdf9f59ebde3afbec6b2ba5b9e16c3842c77b061aafb1dd715dd042422cdbfacdae2acf4893bd90d2ccd15aa8f0b1169bdecf43c2a413f66c9f731e58e4c40d29dfcf34143aa82edc003b01000328a0337bd1b40cefb09bff59efb18c8532cfb6bab812b79ca2def251922229e378ddf0e5a9e1615a32d712d26b8344d6cf495d860af0998154a7fc05fe458b584ad5bb6680522aab3eaf8d53101ae9a04082078df05722b16591e265a6f38e2946917d447e90cdab7f2d58240500e4ab30829a1590cebaf37ea48cb9b3b39a2013181cc8ca22b4229a585b8d73bd9bbf4552006712ddc91047e9e2494c0e17035a72823a8d9045d83a387fd682d778a427f91fcb9f0cb7d16767cd5c9a8b6d9bc2a895e2ee63ea9405d6aa4659d8e2217f7fe1885fe4ecfb8726333cc5b204b0f4c13f0716220a20a339c52621484100f5ed2ce879ecd0594e2ffe2ff40b440a97c566f32c550c42bd69b9be01adfc07304aea3115accbb26589147e4f1f967054bdf4ec59845ac3fb6f6c5622917dffd99e02ac5dad46cd733c5f71ff7560abd3b0d03bc5385b6a0452c836ac7b2baf97f25ca17776a7732151c54f2c950b84bba6e22897f87701811ab4a6c6f46ee1134de0588b90586c17cf3062fd0800c0b5a712faf84d164e19d017ed9883ae5bf5b77618c281bf80fcbe87f09b55a62a68bc48fb0fbea01b757bdb544bb053e6e438062b43d346777927b2422e0464897dec6c7105d37d2e3c23e7230703c54a88d978d7370d5418351198a0dd9ea4a49b4066a50114164f17d023a2f3056d4f8aa1b465c6b8502cd9842351d0aacd446bbe1edf2c0ad148ae8b7718383db1bd9299a21d175ba47b0c883a9f30b0473194707d67ad3c17e0a85bcbcffd33fa5b -MD = 46cf632194dc6c65bea19ef791b91ebd5a6d21f55a42893c09c77dd449af60cd2a8c70fcd2905cea2081c1043fd0d0b973cd86ccc936b735effa0ed01ef8c4d9 - -Len = 77056 -Msg = fcbacddf3448c7464297ae53166793e2ed962de0d0947c5e5e17abe3cc103b072add5e3de8c0a1f19890ced3f5ae1172253b590c3b8801a400ceb056f3207ee88e9d58a1cbeaa55ee7e029e266812a6e5731d291d923d542de11542c2f300049b16382b2e6ae1bb6b6ee872970c828fe0ce06019b34b3f5e81465e0e89280a531995a51940f54a208e24b04f1b6b514ccab0cb49cfe986216fd797a307f0e42d509d897ee1a57bc5f6e96bfd6f53ee7d1c09dacb37e6f3b2322ac794b470d601dee1f687d2a8f6cc76a582db756646bc87535747f328ce3952a9b688959128f449cbb4df1ae4035e96c1bb90348da32f95f6086409995fe055ba2b28b43921301bc18a2cc143eaa3dfa3dfc5b4b14bfecd5ab5cb8320edcdc5c7ef1c18510adddb2d4217d0acf2c2d8b4b621feb88752b7e7282468a4c2282937cb0bc9c22b221276a2474e0664e40a5c074d198c9f53dc062816c10f241a0a72849dd072cc2847047365433b8830fb049cf00d13db28c31d7c4995485ccbefe0e57b344b3517023f7c18b832a6cf35123bb3e33783faf596ed66ec37b16260e9b54dfd34ae16cc8f8709b3d306e840f0ad3ea2dedef0f8d74315cfc46d07e5f5bbba33147e4d2b5c5adf3f06f0a4a204b93852f23533564a46fd44d7d6e4076cc06bdfd5eee5a90ebf4361b3ab2be5b8294afc5ad0ea9655bdc75658361e4db68c08095e4606ce0d7bdd23c280a49073c41ba7fef73e4162721a0a2fd3e0403be738b797ced721c159548c1bb7372c9c51545bc6f257ded82b9f6a44f650666399a3f368cd812a932051a4a7980e409d999c209a085cf51fb1fe7d7fe6964a9769f2c4b98d2b71e9977b744c6a4e54dd649cff6283750f9fccde4bc9eddb713d21cd337254fe7f2c887b03f37722f1c479fbff06a9ccb3bf43e7dd08514765bf87db467b6b22dbc5b9f85a8505b09ebaa262296ec38669eae0c23a265b01ad8364c507bc1abe0d1af29b7fe85d20e327a579838318ceb98569176a095332d1f37f327e1ea8fb9e95fd0c7c06c79b48734be7182bf2ca2cf9a78d769b81015975a2cbb2875f00159da1f259c58a4956065c55ed4f97a249ae62cd65c22c97ce739338abe085f6fa99a5f51c0ff0519449a06a0cd8507f980c627f3f689e1bb8541b2071126304d6f3d2becfcb3fdb8aa2dfcf7cac6589a27c6e4a0d741db69d80022c0d0441532f12f0f579e1c011c17ae02b45b51ee7ee6450d6d6cef290075f1003869d670a905ec7422338bb19c03a6c2770d9c3c2052dcecca25e65d07d590d4de4c71c527e3f1e4bd4ba781b0f484b6b03029b416d40b1d4790cbd9f88d6c0b42f69a953831dbebb944e3e40370e459e0917ef8db003c09564c04424af3ef2de706a5634266070386bdc57afbff22168870007cd55e0c5b86a6240887af96b73afb46b1ef070fa6a624d09912f5ea97387a52b2ae53e86e494dafaf2716ff31cf22e303867b624fb80879d0e10b9a36410eea3cce785cdc2e910ba8b1d08528143c0edab1598b890ce735b4de96bd8e62bc3b6dae31c60fa71ecc87a052d4f49a952e99e827f7cd452f98a7742dc109fdf0cae7c626d073334576be8b144b41c2dcc6d3a34d43a6c160273b3a374133734b1d1dcebdf8c153b37ecfdaab747a4d516c1a6b5fdb80322745f2a959ba857329a681f06dab64a8d7693e077ecd186ab192d0b8d64bf3f7c3994049fb999a7e2afba703bc64c7732faa8baa04d196db7bbf991426f16c82e375b684a36acce4bd911f5130c174733ad73b2ae40e9ff00e56c5f5e8887474058fb7e1d7aaa7575feb3d61512df5f97753cf1282f07e48e80cf9e6916d864b882be6fa0ed5a436907e93cca416b6a663c4a9f96813cc569726a75e981d2c6a09fea635bf786e12eddfb4fb801850ea8e9e6e3809e504a9aa5850d68303d16ff96c881d701f4f6cc66313669bbf3f3666458e56fee0b1a28ff688e6d8de1fbde4fa0f29b716d2b4c8cd31a65d57ec2a895e8ceebd935de1b6a5b1f81ff851e44b2bade2fb1b928b536282232b9ee237464dec67ac7953d7bcda5e82beef32639a75d6c1c27a0940f4c79775acd0bbdd4b981f4a620f4e0510f8f12f3c2f1bcc616d2c4e93dea1763b50e40657b9d39cf7c1a81f64c1a6ea41a61c561e44888f1e7620f1e5a5e5ab85b2fa6d92a6b3e6d95f194f2b3cf907dd56328febac031c402527544e5c605162524d140413e75b7ec4e5623bddbeee328dc6451ad2060474fed1de248e8c085fb34e8212ade86b46979ef10d3052fdefb16a0e22632bc81b77a3080ea8c310ec5a913054c13186df5b986425b16fc763657053a8bbcee7a2040d5a6337c03b86bc97c730fa5d3e87658433fbfd7fcb4c2e8bbe045879d3a748835dd8b7fdc8cd6dd48f3db5b612fd69c4f91650dd89f8511e95cbd5b72ca999a77ac5a5c6590ec2ca20d18fe674afbced2bfb78337406819b8375aff153179bec59c08dc45ce9600b04a2e56903fcf35f3521b00c29d534a4ff8833d2d77fa3c4434fdc7244ebd9f9a31862b8118381bdbd1fb4b21c02fead727a2db62a5065b1efca2e5ac174752894b8645e5dd20c6b2c4be2dfbb1e242774d1ea25ec184657b7c5dfd83301e61a51e976c62946e7f9fb4cc6ef876569a58f15f5ac6d65ba0823d97d951a4281415342267a0470a8eca288dd6c119713aa19bcdcb45e975555cc6b93fbf784fb302158dff48fddb3b5ca8692cfea21d697bd3d0bc8104b9cb309f29f874b67985934741fc02bfcbce7dbcc83a561741700e22d0f7222e0f4c275151cc196690d3f154a7267594c18e54ed12c67282c597810f3542d1705f1e69639882568e7be543c426444a84a6c50ac2af99faea9026fc23676636d1918a1d5d65e4d2382203b21d2520299760b9c6c4077b95588c65a9e4ce2bf8598ed86cc822b8366b6d7566e90e80b8d6d8b2b1798234ebd3a09caedcd258bf103c507d2a36c72930448286af482da248f6faf36b898ba563b4123393dcb735ff843a790e09d9548e8f743af83bef8df5a3d8b32282496b10b1106190520e002d4edd87f903b65f8d3691ac4b4f8d22e6c5931925d736e4e37dde5f5b9e26c8a28382d0758c25f13521220130ecd1082245744ffcee1ab9e301c4567c26c7366709717b090cefb28f396e642f7a81e7b10cc37a2f31bd9219250a6e7b54b8f183caf2b13eebdc4ca264bffbd16166699c01c8c54606e7158bd2f7cee18fc3a2fead4d9a9a91b464768b5bee9d094834ea0bca56cad75fed43eed49f363eaef1e199c95da7663fa514978b661cdbeff0a3141355430beec04962e90800cb42853378af23edd345b4836e978bd43d2246d003e9eb370a5c37a3177e32c99d4707fc314713f33e8d3ccbfac7844f98abdd78c09540303c71f95bf4db45181c851e44acd9564110e0e3f521637a1555505fa3325e7bb509f4af79e0486876b0c47314d1ad135fb2065108cdb294acdada7159438ec44fd9af0003c50cc36ac1cbae73880b73d68ac72f0ce5fdfb9e9110bda3da6c4584146895038a707f7cb763766ab93a9e2c02eb250a518cd673e0bceb88df3f23df22e8158017bcc434fa5473004c83bbec8139da08f9a74eb131a4a3113b5089e56bf729835438b91bf2664e3d292ef29b6e7af711c5968be2eb918c45d4e79d20585c7913292b87b80860af2938836dc33376232a9da0b48d764c4e2c934b87174fe1ac387edf5593a20c3dcd62c951eb37f5075d690ff13b3a9a92ce60c67052b94c6afa3b9a4c352a30a1308d4ac99ce2bf4bb111296c739f460034249e805aff665d6248a594250695835aa24cfa5d9c9b962f7d374abd0d163f65c51cdeb687f72b778d4854eba00389548a180fb6cd5390dd9580b6a1ecd4f8692d88b3eebbc77c42f2cab5105e425e252bf62e2fddade2c5424ed6a8a446d249422a268b029df9c96075de1baa19a8d56f2d8051357234ef6ae7d2599d35760cee496014c3434916bd8ff794eb51106d3d072ca33b6a2d61f694d33d3f688bba182f8811687f1531f3612a0488b23df47cca5aae585c7625cf9d01daf3a9ba5ca822c70a581a0520e8339df2eb04d87216bf34f8f411b743db4a83bb1fbeabf8856b4588fbdcc0ed864d78e67b0f88f0f22edf0b785297c104e382652d70059999522912b98cefa0b3f6e468a09bf674f85f866f4ae5bea931af256283877044cb1e9c31faf4393f59770901c26fc90910994faad492d5034af795388bcb96030319c56c26da47d45f180e384954aab4222662467d2384d53603f972ab041cdd2989cd4ba507c066ad211b969e12417f164ce8cbac5e7229df1b7a954df9addb26b7db56df434dfe2bda5aa227713571d45409bfcb0d48062c87402bd873ef03e0eb18163d5596a3c18bf1e44d392f924586ecac41f6ad75058e72bcb43a8a5f406dab122507425d577b08e47831d6eb4f29ba1976e24a7c527a38ce481627f72e84bdd2001ffa34d5f3c82b1122d383db879a8fd298c726fb91bbebfecf6ed1937976df37666531233b58407ed4cd63d2e6b595bde2cb78e91c239a3d2c06f75594fdc030a42c5b299be1ab290f6d911a8f33b39f86fe7c026298646ef698715e1d7bfd55a1f6bbd05b8bf5789b5b179dca3b71e04d09392fad41cff7f5cb45945c171f0d246c57fec27da5d53f3efd41def558e8ff94b75943466541f1487de199faadbff736399c19e043a7c4be49f0158aef1f6446ff666dd0aeb4b2b6212c1b4b2fd5e0fb6993a8db5756f3840591b522beee43c81840730731b8ffbe375d2b332eb6a863edc9b7976a4a9238380c07e44ebb66c10acd9d1276b6a208c95b11da31ca1718cf288e3c03ea6982eb4953f926ef93dadef733190514613bde101567c079f4bf179775f1aba04208252fe189cff393bb9ba47c46673c05ff7f637f03632b0903cbfdb3dee9d4e375eea8f8bbcf2e2e0b49bec1bf239456feb33c96d5a3481c89f544912c45ec156f4e9ce1b7b0072b73f12c4aacc1861bdd8283a3060738f6fc9c5357034751a09e4ef1e5a6f9e8549a99d65f36c9791e47f420eebd18635f02c9124d8a786b4cacf5904ab033386f294ca44885c4d525e212fcbf235c321e438369baea5fa2e13e4c6158fce55e45c70f7e4cc03a01f956e3fd5e605d0bfd69d240e84a855f26ff594c59b397c49e1dec4cb50fb167624c6f0c129ba357c219be7f1dd37008e494263a93fcd2d142d2eaf6c99bb36e276cbf1225fcb47f36fd500ea2adaa07e3a8bb114f001cedf88f1164d18cc77e125ddaf5ddac1ae921bd8fd5bfffbbc2ebe11ebbd5e6008089fc6a7f140a76ffe9c8c89f83d35dff4b0184bdbbf129a3c4e7591e6dd703f2bec0fc2ddc3c4659755492f65e9803287b7035ace0ad7e10356374245ffbafac5d84d0576f4ac1f57eaa3fe4b82496cb7bb2ac8b7458417308fd75b4f2798b142eefece6165d6f39cc71d750d79f9e521170f143c01dfb33035c66b5707a1f93fbaa5ac0199dd78e265263210430a12406520aba0c2233b8ef294e111f25f4928a5c22cfc031815d55f5ea4187ff29a921ff01daa08f716a930b36af48a39177a4ae4af95341f50c22017497a835bd492c20de8ac38d3eb1b9ab2577321b7eab1148dc2819f7bc05521f0a0baffae66ced5ca7b1be4420f527b0235127b6449799d1df435b795daeb0f6b285e3752a7a2e5c6639d9dba19ea6c339256d9c6aa204f25c3261ef6071032f76ed8ecf14dbb5c722095c7a4914fe8c6ddb4df4783319525add73824eb512715e2bf62f29f74a46e4098f4b9fbff7b2c95b0fe6f7b4a19ae12cd959ade1a665712863bef337b781b321ba732b0859de558dfb9c6e8c6571fa07da9e085f87b2b7ca1fa4f901c31f9739241d7555ebb7185a593b65232a80ab56c076e4967d0138fa7108c3be35c99839166f060f76e61aa870ee64e1bb6efe01d10bcbee50fafda1a012dad7d626bf09d891659fc212636189dbf42edfe4fbf0568544cfc7440da5f5ecc5b26edf1392b2ac1a6b97e4fc6bec2a9c725d8aa90b960cd8a1ac8870f0b8bb0cb9c59b9cbaece8aeddbd04ecb0e104e515fe07103bdbc60dccc56d2f6831aa3853a203636acd6ca85cfb193b16b091567f8a0438666bde6eb8db9c51f7a7ded0e7cebe6f8b9e61904f1bcbf187a0f87718c9282a758f7a80ceb5bcde8464825cdf1275c903a8eeef20e3c417eafa62d049821ced518fc3cd741d76dff6aebc64a234d077bc303c4b361ca9b52607f6ea787f8789e0b3e0dc13d9725b37ceb47198fc76839c81732ff98e25d1250cdd4c0f8612070c43f93514b2575a2e0c940a293410f48de2ba20d100de75ce543e7e7460656ebc863861dd70cee4c3af81b8bda245d3769a39a8263b7ca80926420911d527c6d8c5c3e7d8db7e02de01a502bc10be273ef2194e6008a873bec910744cac00174748c24f6cba10bb674828708e4423f8cf32829ae72d0adcd586d2478faf9a6af3575e2200d72b1846cd328a9b061b4f10a29b15247249ee37a5ad0b41a49ac6c33abee6fef8781f64d8e9d94c204e33e9898d467da10daeca6ecb47c954ab349f380c26cde69edaa7b078e4075865ac42317fb65b80002677285483918773bb6f9b6d67d5694651f89f0533357808c203e09aeb27d9c85d271d704700049a631ba90b337e48188b40ebb94f3f46de7e15df066f47720d5bc093451c7e95c9348cab0e11304dbb9065ddbbbf8b8b90e75e76eaca251378292bd3fe897300a837a8e89e8a533ed86851bd340b830ec505c7ec6e822786b0ce5125c117470ede7358aae1254fe4161cead34bbc8e9926e1388bbc21b7925e5219d0b64c638714f08537026a8c071eb21a66295913f25b829a99f92f3cfe2abe6a1e07b32d33f1b715d927e1736f9735c7c0f56a7ce20bf1d35f50321e93bb192e55d9d10eda1ecff2d579136ae32aaadb27d8783031de34cd25e7b4c419ba6b4cbe57306f43424002761f87da2d7f1b3de4fa0a97a77e556e33e63c9858cebcaca1a657b63706132f0341c52c133d8fd53f82a8190c905ba0d076530117a0153646f1ce4d7e124f5fc30956c65e0d0f8b7f98da1e27bf4f4a45bf7f6720d87dd2f45e1e9ae00dfc7cff9dc112d696a247ee66290ec1b03854dbe84b32391dfd68f515ce07259f236d00258e76428150f1d2111c51a20e1ea5d7193ccb2b179ce08f3f66fa1471cb1a0bca465c6b75217174c43c4f927f0a27847cdc98bd6f62220b046edd762bfc6b6bb3702b1a1b1eaf1ca50f7159ab02c12936b202b9cd5716b18b6f171375be48660a944b151b4e9412dc1f1dbe3c115b0d724672e5d884a5c8fdf110b3f51a9946f43a24241cba069d92f4bc8bd73cde7956214e0b39f0b59a817a301e561746519beb1e11c668ee06ef14b786268d30b50acafff198a32f6d4094df1b3ebe37d0272ea1a3c26235961a097478d10b3a09b7c9ee609ba6fc8a62c685745616550ac08c15a1b8b0c1923c5b5d2880bee4bd85a7821fed0002390e988aef452786498c8ce2d44f587c457c90d960daaf17189beb22f834b92bc16c935655b3f9b3d3b6b6700430644df603324fe687e5b963221d38b119da5e6ca53e516d4a95c5f2649227f803db1becf8c929833068b3e741c62b13436a8380e122e401af02a2ebbfa9707a6fc6d07084dbceff7d41eee9216d63e65b71814647c575d78d483409ee82b1501c2c53cacff2a622157751b4e99a48f208f8420600b16eb98a70619319a55343b3158c42009519b4a112c38fc2d542fef305ad08336e356d4e8013d06a9bbf1bdc8a6320404d8f7cc81b2ec1d4a7b9d4c3a3aa93098234bb8283310907eb5ca03e91c0abb6a07043339979934697153a21d721f0aa77d16dce7ea387181d919a82358b2c8b1824d189948c4d412ebef9b5abfa683dd57649d97b518fc6bac8d04f7bacebe63d13ee73154f37ecf21cd926261d41eb228a194c81236c3849680b4e6d0b30f096a6629922aa98706d97a11d5073c3dbe875a3ce9901649852d91327129143d0ab43f4a2c685baf427981b4132e23836ae9eb008cad3c10b5d82b08172246baf04546e3706c8e3a1a7850d3bd353e623fd6f07a21c81c9bbf3cdaa0496adf2b52a3f96ffec5b5c9f75c840b23caf16cb5c4f724397f3c5d09b21c85985151e09a46e35a37f266d1519c77c4f73dc115553a6b7934411fc72dee6d328474238d4fa4712cac7115d2b1bec88ba82c41cea6add9f3c2ac4b8c743859418e51e873db534f71dcd05760b049e2e9a704d82b22a5af2e351f23ffa5264d0d26690556d5c9baa4398e8feda5c443497466189d41a867833c284db3193ec52fed27fe88c77e6f4e530a43ec3a948635a0be77b79c3c9f8d18463d1948f85e14332d58ac18e7c9dab9e1f7eec7511838bc7c79ec8ab8c3c689f756c4dcd9844498d7980342ac56d3ce943067d47075cd283e93bea5c350a9e1ca4f381d58b44b9eb53150ed2292c4119f61d9fa892b5d5463599065e2e2b1b02d7ad5b30c8a93b544b90770f10a16137220c791f1a583f1893024537dd678859f6e30065b53b76d149389668e295454aae1c3534070bb601ebbccf71ac858d2ae8de9bfcbcc113693557946507d0955a8292f86fc197e20a2510cb93024fd17c97e3527e4405b925f733988ee81af87086b9ed59b0c46d3a29466126468bfd57ea3d4d72b4cd110b7714cb6ceb3b1692a2d839793d59fc9adfa6bbb1e202b8c3c932b56076e2c3269e44558679fa98cbbe360757ce203a302f78febc3d7cabc91c0cb2d0f10c767b520a5d64fb202620c21c7d7ccddfcc06020355d0bfc17e70cb116b4b8d12d2147cad0b8fd775679b96d2c36fa05f5d243e90e674d098d8c1bf8a0958b2be81f80576888e77c1044322a002b8b1689390cd67d930d8ca61c2debeb380c8d6282fd3adfce941cca4204fce62e066c2165495d0578c3f20c27d11f7924a372372c2d09a8f299f5ef03b03a30a6e29348f78801388116d5fa3fa417bce3e686d04b8e28467d5f83e909b276823ea6187a60275779346cb52ab4054948ee4c17c8919f3b5af75b3352b48a466d4dd758302fc5b45a0b3bfc083573487fac5ab17a7edea738d923a0b694b60e246cecff04c6d1cc6d9e1b270d347c79f3c688f08063daf0729b3f488f4ab4527a045d6962b5e9f3f64570d2b4218f7237955d3154f102ab9ac60497371703a7c0bcaf23d48d6ccfb699d36b978d3aa5adc15e1072a6f43d03e21a1968ba32628afe68bac4add8b41113c97e21e80ca8d8a2f1fa53e61e296067f64b7e84bf374b32009acda7bc45883bb966edc253e05ae2bf7b934eeef512d01fa9f307088a84001d505a0b95f89e8a29d2459ccee076e92d009b31e524ada30cc160c1acd0c7d10557f439e441c687a13cd3e7cc2def2eb115f64faf3c9369240e42452aae793d5f2e16c335c592aca6031323ea2d163be2481ef89ba1569b1bfd01f1f0783a9d814f5c27f8d87571aeb18de197627e9947037fbd490789a15b2a3a58acc26e8a22481ee8ac0f016f31e4ae9152629abf35d4b30e15b38f2447f25609ae11978ba884e975cdeda90db608efc3a9a1fd266538338ba059e98c8901ef5572ea480a8aa2466fecd8eed5c1aaebf91bb518572baa9b86774f2b4294b560fc99c0e28f5f1cb0377775454feb270d9216f06eda1fa835bee927c70ed1a9554f911a19a28c40a15cfc273ed48919df3f29f87327a7bdac6594583f29e64a26cee76a3fbc98daa440e9835e1c21ffdb40d341d7b85a675a4b0775162c3904600b0b45d7660b3743a3de0e058f4c457c579140ef04be11e9bf90f2ce9e50849b848b11730769e2d9c6482bd7967e974cd3e29a2bb53959b533ef55daf8b33733bbd57195492b5a0158965146da2f41d7565592301252bb57686112cdb3d798b32178daa083d62944bb6732d5c2d4f1865f58ed7ed4a0934a9da4be09584425b445f3a1374fe0dd0e6f2934f6d91602d44f6af08a44999e096418bc307e6f6a91a9c489dc25d1c1d8f46adc4c8559126bb71a4fc51aa4281e5c3b91b56edfd3e5bd69e8d17e2f843eeb8aad2960149ca716c55fb1af66bde3e68bd31ad21c0e2b015242e9e16090aaa5370c2ff1eefe00ff2aa4f27b47ec047397f4d3209a55cc162c2c77c80b73a6b1ce8dc2a33ed313c088b3fa16ce2efab3de7b70d2d157635c4609fdca96b9adb1dfa6740c8aa85a1b8e012b0a7ff33107cdeb6671579f6b544e6ffe4178bf3a05d8fad68658ea3e50991117beb3d541fff4a93684a37a5e8e93c2fbc54810d62e48df4cb930155b10486842bc304197fcd15973753b94b77bb4b778de8b3b0cabbde8590d96b61adafa7b3e7b4bc4bd8ee2507fdb865b009c2f91f7f598ba47fe968a8e0c034908014dde5d848cdb2d46b642ee102a59b47072f6eb9316fb02a7615a4e3cfc4aad33b0e6326069f16194bb8530cb8e0d6d891d6ad64f7c99e736bcbc3c08e84774d2a2376f8769a3f4f960bbda5627d276668d425a734003401cf744ba085dabf97eb0564762127f51f5544b5d588e6579695131bab6f7c3b7daaf785aa3d2f4958869a75ca8eacff318f4b83c4b3822e121f79da9730a57a8e043cb9073decde3901ccf3194593262c4c086f996ab973820ef0a99400e3bbdde62b2fde0d7746e26682248ecf4232b89463c17d36f3f08d6b5fcfca659ec41257ac2e58363a49fabda4524eb323eb7e7044c0979e986bdc3dad9560e93e5ed460a7ff9d3f9bae2a0c19c384799c1826e793b5102a10ad178cc4437f142b51cb0804ebd4b0043f195dcbbf56aa1783580238e80f62c47ee5608b214e6dcd65a057ab382612dcc26fb7a190eccdfbf2bbc81ba1bdcf1aa5eec2ea76f67c8d62fb55842ebaeb8b00d623837d6f6ab02ef741242841f87becdbb9c98c9ec9d10f830b7817b9c679c1f4a759cd070a9effb5753cc4c4655019544e10a96fdd0235e1806d394a280ecd714e0bc9db342d2c9d6d49bf6e9ffff50088a716913f899cbdbc4cde969bb2ebf61d82b91470c57f5630345f662df248886f771b2b77cc0cbdc8fe4cc4a6cde52b1ea4e5d946cebe89c6e6edd5978fda930b66ff650e354d8cab6acbfdd2c781b7585a94533fb0b2dd3846b0e2664072ca655d0c688b2b26d06d77a569a5088843d38d0faae2d323fb8d3bf2b6216cdad58445885c76156132170f202fa9f8c17698239f05b79fd98acdaff978507ad85b7004bc69585dc459b019867866fff6f9ae068a8c477d9b3300890f517cd435043284f0b5b76a18ee407c1d6b6386ed731d1c186919d3329e2fb17a692ce1b87ad1ab6c6b1ea42498d0222e3128f36f8dee4f93c1b60a6772620e82e7e8092b62556377b11273b20066f200f13db044ef288541bfa48b00579f8a71f438b45467c7935aaf1d3f88cd0dd4ddd42b233440d3a86c886dbdc5f7f00c8db7a54afd2f2e235e8fc6706fa8cab00b0279b60728f89f5a47980780f75c7d2059b633ec6292fac876956e2f39a76ed3a2afd084519d525322aed3f702ebc37001f4d8eaa9fb02e38e13a29027abf77ddc55d87560cda9a1413688f3bea6c7c6d8e59fbeac7222f6ffc7725a1bde3151daf438a0008d8c8bcdb88d3cd39471690613f13212fe4248f13a4754bc490597c11357cdd7e7e358eebd4c9aeabeaaa3b206370c83a84a228bf28a48b3f35b96bc3b9dc68de29651cbcc2cd5ab2a58ba0444d715a97723ccf579a1fca7e51c97f0f37252cb868dbe8d6d95b4bde264f725573b152973b38e5857f63841252ee288c33e3839dcb1e75b28ef01c9eeb7a23dc7c9d4aea4e3b0dc12efc629bd7bbfaa3369417eebe8135e86a38276543803731aeb19de139c79a834f66d06b4ea767fcc5b3542bc1b8bbe0e17006d1ece61f0da08ad61c7c433e54572f48013624e2e157ddc2f553398a249b44255546306dc8e8759e0c84424bacbcb2440e1cd90df9735fdebc0168032bde212d7fcde385ebfd2e3031f0594505068c5ee261285bcd8ec621e05ae8b98f40a369b2026409ef4501371d3eecdce5bb39f32eb1972ea620bd1712ae103f976927748c72566c5b569b3d3ece6165d751379b237caa294bdf8138b39992e80c9e49d86fac2f1fb8b8589d073d7b62524f01c19120d5ce06f1df01639bd5652776670ffc0e52b67fc0c5f116fa8f64df3b3510d84cae7f602e12fb73335c19a0882b85821765a329266fb3de8411efe67c2de3696e98cfffeab9a182ee9b77e029f3c3c255ec783d5fc25fde68a765f0a868b3e4f529323e9e5f7e132c18226ef24c551d583ba834c34a7f9726b4599636722cab8ed44894df60fba48a569bb567b1b3f38ce7a5a7f7748d893ccd5d3face6985d7a3e65ab146aa49767db365c00b06af5627512ff62ecf4352956c3658212a14b65ac3bd9e3d9039c631a94bb43c4e493877852a3abf05e1b5ae53ea04c92b225dfb21db9b43883040a99396ba76bab4e5a45f75d294b25bc7ffd216862f3555d26f49dc30c05bd6ebcdb96d5a2113996598273546139e588d7030e267ba0f551f9c83e7e51cd1d5cf8662f91da5219fc13925951fa6908111eab7772ed183cb4c6c172443bfb2d2f4bad7628a6bac6f0071a1bbe4b4517e5a53adfd63de575f5fc64cbcd111c678635261cf2ad97cb02a27e2cf1da5aaf670955b9b8f4854b862916bd7177bd56c233746688358580b484331fa52e060915c96097a3977427f5cb7bc9c9e63a6593c4fce571f510a2861acd6630ccf3ef82540ffc2e9d3e95b561f8734ed3202e5b78443c1862a58ae7d4c1934d2d90bd3d379849a27c410f557b114c78d51b1b89bbdebd13e4d0b46a40a41922d668ec96f2be12a7cb281f46755aa7c04267b7bf0e210acd120eb97dfce98a7a4de9083ff3d5f9b6f0502018ef3937bdc1b28d6bedaf87dc70dbf4a3580649bbfaad9a98e97441589255cc4d57315ed9c977f700e8feb6aa67a5106af09ee96063031e22121d8bf507a57e443bd79facd0249f2e7e8339bf8d16774544f7ebf02d960d6c2c365c24e6dba0ae1ba07c9f6c34e0352cd17394479ca3b2c3b5c3e3a0d2d2e786531460b644fddb65006839f44564c5626de6c13da42043fb5cf3c363562924cef85720ec8dc06ca68c04f51ec2975fbdbd15bec5c967796a620e17fb7c5a94449a96edf022a2c25eb7b5692238e2549d5382f5767903b38f498549cfd1f1c6b5be563067801f8d0bf80bfed514f0449fa5b0fdc63f6f92d897dbe156d3792c60e81790b942812d2ce17b3e7de32bb0233812404b891587e4b17467371d7b45f48c4d777bd692133fe875a0a3300f27c69f39656ce29013224b0153d70c52a3df2f8a6d25a8acdfb391adbddb68050c082fa8c5b0e869b51fb8e52fbd2ca9b68f5630da2d554c03366165fe8d07c7ed568dc2e99de6fcfe4b7fa2636feaeb0e9374d3571958f9fe36dc40db4e9ba24c301e1a59aa7ad45f1423cb9745e3910c7a20045c602031511366c0ec86a04e993375319e6d209a483839c32405933630a1dc366 -MD = b5a4f6d83ff891451101726f1ad4d1caf87a5d9adb3ab3b90196fdbd440e75cfb8c2e70040f56a60f70da600fc144708597cec73d1ebf7b01f0fbc001a01c31b - -Len = 77848 -Msg = 8532190ee23ddd58861065fe170e971ed3ccc88cc7738a5f4166c5b089250a9ecc72239559b2efd110956d1d16f916e1ce0c705b05b1e02d6d26bf184de3b10776c5324f796b723517e163b1f97b1071a2043021a118fbea0bcf3c38289ca8c16d746ec3aa320f8c853a7040275c2ed735fc31650270849e03aa6399831796d497c6fe7955cd6edf41e9bc540864171a713c9aaf908122513dff5dc2c41d2449de050bf9e005363533356e74045b73423c0b9488b3137e0ca016523b5576fa272977bcccb5a20f974368ae298308ec5880b34776d3ed3fd61636698d9ceabf765f663a793a6ca30c59c9a6f9ed342862247ada0358d80eb887a8ca3f03411b3e6a18ac88d92b979c5d9f7b6faaa7cf6b10a976b7aa9c93b9d9b59ed9f042b88831d63b81f9a6964f3733581022298a782c874219310175e1f5a30de4cdb63b5b9ce70fed01a6462ecfcd6366be820193605e67b156cf5d38c3ba3ee701654fc093954f545bf34f400db4c4f8e479dbc394740c077fcdf2c72b445a6af4179abefe26243c6e555a8eda32a44efdd8c011b0135aa416c4dd95168788f50e94c45dc5e3b52fa2940f1e1c8d2bf172655a839c81790f817cc5aa6accf111b7a376a5d1142bb45f7715fabd0e8068a9e94e24400690d02abd530f115bbc45570e589f0801ad540dc7152aa3fdcc3b0c2b47f984ecc770774f2fcbf17c121a569b115253f16495144cb6b4b8a236f302f5eb0c51794776d2f900e6f4771b171c134ac79b2e7702ddcea1a2e244e717f20de2648df7386aa2846e690193fec4113daa04c6fe0f20ce157dfc0b2d062f463cd50922acc2d54eb9235bff1ae4a99ee3da13bdaa547950e8f3c81aa3bcc3654a6c04f6e10b3d405dc4c4d852f44f29cb81fc69796d94cc11ab10f7ef315cb7ff4e5cf3dd3e2ddf3bfcad7384573d1cbe48c5b1b583f9a8564cdb8a598c81a423241900ea812a931a701db8f734fbdd84d7787ca4bd314e807f32bb28f6bb947d9544044efcbec4c1cb1c8ff5b412d6e5d51cb49044c32457eb1c72a69691efd64ae3e952d970daf9b3b2e0c4ff096da9eaba40bf3f3794a239a19719958b1df6ea01963e3dc83d8ad0e893ad3c680c97bf59087ad716042b10c912ca1a3186a51ea3f35a524f563cccc590f894b81a79fc01f40834e6deb8199dcb014e0c93ab8ed3e8ed408c8bd74c51bfed2e7fff1549baecb37d328912fb24aa0658a3aacfe1985d412f084522fb9509d4334822334c8dd8c1db7f6d015f669820617e35dac0fb3a9c4649ede67e9854f4ca98ed9db081a07b7557f24ced6c7b9891269a95d2026747add9e9eb80638a961cf9c71a1b9f2c29744180bd4c3d3db60f2243c5c0b7cc8a8d40a3f9a7fc910250f2187136ee6413ffc67f1a25e1c4c204fa9635312252ac0e0481d89b6d53808f0c496ba87631803f6c572c1f61fa049737fdacce4adff757afed4f05beb65801cdc0d0193f79ba5bbe70bbe3c4c5c4f160dff13f375cb191c94e288df5a4d1cdbfe668335226077c41338f18120f4939fda3cd2bf1b223e3d80c29da1c04341c6a23fa9bb61eb0ca7f066f6754bfdc9897b3083a81c79576668f1b953abdc91555e050fc734bfc6cff52247891bdc536b5766a15ee854f71fa3ec56558b9d8e1088330fc9293358b498077f2d1f14c3adf54bb6440d398fd1d83f1f37ddfa9a70b7663431ae0a14ee6f62d7e1c43b9cd9db5c2ce7f98ba4255c565e7b1178490e71fb17a13198ade5d1e11c37b9b5316780148fcb4befb672d6deae8fc49b0c423e8e14985263662365fea6af5e1633ef7a01596e72ca4952ae1489e675d766a4738bd5779efee03fa207f1a93fd316ca3fbf1431ecafcf3d68a47b2f93c1eaadb760b4df65bf9e930cb997c5cd705c90278a4ab63804daab8d0afccbbccf0ad680c94d20554a13b60c700375857277d9e80f577bd36dde1581c4793b3f6339b7661208fadc22c22127c7cf48f66deafff7cad4f35d4f6c13fd4d8b0eba3319c8bdd772cf68be3c5cf52d55b0aea7487abd294dad142de72f4622aca6bb930d631e86050e8980e4d1eb1d213d0cc2f2e2cec72c19b68dd1bff2c058a39227974efeaa4a38cd1f5e188013dc5e9f558cc0a300fab9b2f3de4e99c31985fc4549c4d4b0bcfe91edfaa94aadc185e4c3688cb083341d87d44f63918759be5890877d4735d79076816cfca1478b536b8138bf9dba52b5a3c3c79770a9b3cd157df2c0bcb624bef95e079b2a7d843792335fd1b102e1029526b942cd969222d181fe37bb9e2eda88f86d0d5ccc66b2f74e505ba1196994ea91a70dfeda8f501b311c6aaa6a4073a3c4ffbbae908d561936bcb5d45a56dd027903518ae1f5f5310fdfa22fb7140ae868523e968672817670f788c142235b7b6170a5f8498062d172baa6b1e11400b546e6febafab0d57da1934d0e6d7980b3df5173dd7d99296b0e2fc0b794cb0598d540847289c2b2bd3d026af238a3fd5a37385390facac97c36c188c72ea38a11b7d158539012b9a3b7e77b33304d11dd2d97cdc94d7fc36380f277673b27feae532bf2e4ca4b4acf8694e647f0df7e9b16f23acce22297df714514fe36d2e3cd3ba2ec9c84b6f6af3d9d4496d6d5943287ca3332657dc74e8c3bda12ae3ec9fcd5f89de15bf03db141831ea66eb9e321f4a24f9023cbc22f46394f3b0dc621cbb67f9f59bc81908446d8ccfd3506ebf7e1fcd85cb9b728f013efdcedc2038ba851ba597c12d59f7691f0d811a6473f02d44c65fea3aa5c3f89a21b91876158214c3b64bf1b86ab26c77de87a5ef52cf1501380fc5e1fec7c2c0283ccca8a17a4ea7539a932ff54136bd2469dab9b6641c9d4b1dc65a24a245f839df5e7c85ac1c0ea50b0d5ba1aaae390ab0238945b62b622612546cc15c6b897c2b37bb69206742d326c80417f7bb32b5e3e729a7cd2b96f276d6de7afe1bbd1aa7bf2df4dd158906732cf2ff3047f2508a8d5f85b10282d6cfb679f98e3dda3bdc5e99cfeb0f2c667ba2ec005b39bf012d7ff4876b9a6efba75b05e617b82906507dc8a2523e721ac590bcc28279e2f05524b05401d9a288852d4ae89e76f2a48d8283141a89a54bd95f28eeaceea34789e45a957ea965a6f2940fa82d5e7d3d1bd790cd4cd70b204078f92ce282492b5227bcf1e7f1017d75f81ececb5811f880e2b776f012eec28141f6232b1c1ec637559c114699bc3496c13d01814cf7fd460dc2b70c2194582424e97c8fa46840c0d6c39ca288dff4dd5735e956227875f4bf7737aaec460bb28898de160370c17513f93b04a8b1e4d323cd2f52c2da88135fa09fd15b4b03b2d5cdf2c91f7e70df72059673e07c2dff8bcf7b7d15655d2a5703968a56ed67ac724e60afe1d975855cb154f71886f6e9f80174e001631dc10e69c5dcc5725f28c9e3cfd031cbf9ef3ac31e983819681ad32dc3826f1aef61ec99d3cf902315af4156e735f89a24a672049b5f297bab198219106b48d3fc90595d696b9f48aec8426e51e51c8f1d316e3c7453d1f4e66e6f8e02a472d66bd9bd7b2fb9da2955fc34f2b5e887f20d189433507d19ce41a200534134d76b65c180bcccc02a0d30d280abba471f0b1be44eb0d8e3e94fe53c9f3276235eda12d20ae8e988753e67d28c610909ce21701c037db48f2ac1fac4b3f1497aee6a9993c4c72d1aa5022384c1db4a367b7e33481a608b89c26aa7c3a45961407165238c1420417da0a28c7187e324d70e688df1fd2205d79b9315c0d932677dce11d74663bdccb95065c920473f3ff36e28a69e138bcb839c836c43bc440239edb7de481a6477d79b95031967b844928506a5d7c4628595ac84d3d4b456db7db69e5f1a9fdeeade6b7861e55116dbbc3a49b2247871db13b5dc72fc29329950111083455cf3ccd6a7580c0b6b21ab7a753bf70e977e73079ed47242839ee5bbe6537250b76ac6c8377b2b131fa15dd31e22991c8952f8784fb4fb2f2b6367c51db053c31a0d7fbb032ae786d45d98d01e47c3d7b7b5106fafc4344a8749c6769e6f4e27eca2a0b7f2ac68ebf11e05785bf29bc5876e63f3a84c461b0017abd651d88d0395f2d0c4ee4bd5cae0ac4cd3be6b497062479a0c2193592aff97bdee1e3335df7dc5b8ebdf4d56ac08cf14e92ff9f660b1065dc203e29300ea8fa5c5eec771430ce3ff33abfb1517d14f05c397e5ca1bda74531e34811f242ac80a63a7dd67b8aa134ea53b9d3796a3f3c868dc78ec2b475925279db8231e280a95d133bd3fc5bf1e4d47777be7aee68405e0e8f785185e7d7be626cfc8774b1cee1678af22f3b3cda32347dc4be902cb6334a1adbc6889a7fb61b80d35b6fac8bc3a60fb38c9eee6f941940a8bce608d8b6bf1e1baa52fa150a239bb93639fd4a746d2e8a8cfd831f6a7444bd0e56695258dbfdaa656b73120b193210906a1095941b5bf9b8dd978435f41e842b77daad8a3f2e1a9048b201494ac87c028682f7733f3c9388c5a818771712908cb0d934cb3743eeb361235d3556e35df505c0eac25734ba853c1156be3be554ba97f192ac82c399374b43a06fcbf728f07e56d9d1d1d90126a78fc97bf0fb632da39041ae7021aca47d9f5548f8988f8d46b16f526d9df9f5ae5feb20d4b92e6e5a51cc31ade28b735e9306618b3bd413f56cf5a458f7f76aa72e364d35c328e522a28ce68a8ac83c84cb1e39e255a93d00e61758427b9c1e28672571b29de53aa2ff2e2da48ee55886b41742ac7a61510fb94edea89d5a58b887430ec9add5d741e40a876a73656fcaca7c1c381ebf086852f6a7f9e1b4c2ce2b29a4f9779d3385edbc846abccadac78ad71713b6f4bbb15fc964c4cd2de4dfbf13b4a08f8dd7f578be9523df7842038192c3cdd7c4f3511c116587c4482763bfcbbe8d5a3a5cf7117b3a0460100e152b49c2d4f58237ee34795ac17b761300a9ac32ee7c250b31449d03bac304b763046674b794bf11ef156b94e0374a302d092fb26249d09b0a8e7e52859cd8d673897359f439fde9ba5b62a482ac36f75f5ad0ad7757bf65095ba9d70331fed3dd46eaf2f969a147f662e91a272ebed10e1b39949c2a63f1a438a9d1c2470947f6b947c055886bb519b879662c536475bfd6c4f85f4640d961b1f90341306aab564d2452973a9fa9aae89e0920aeaa2deaf9fd592f1fe884d83401cbee72b566729eeb2a1cd4cfae106fc1839295029226016d278a3bcd7c6e4b7e9c48a24c01e21b06a7750b6e3ae0ba8e56009b001ae7997ef40f1e52389a74aa04de33c1161b4e216b3e331dc8a2555f00e9452550a60ebd4f1c2c3931f32c2e962daba71b94a4a5d5b6d030dfbbccae14bb17d4bbf7fda2893009c500fefe66b0a57e507ad4bb2e879d8759f8b38d05f1f487b0b543d2b932f92b981e14480cf4d4207fcc51fe05f140bcfbac2012f12934292be5101a8bfcb60624f1e9b56bc33836677892f9c6835ee5985277fafa3ae850b8c3f3517517252dee24d5b32dbc5034aa182e1b0aee3695b29421b17ba79fa2e9ca44041f429507761f6ecdad40aa8fda2379ee2d726641cce9b3b31fefa8942170b8aee4efa4273f4a2b6164e0a5bc6a130cffc8c06c7e59abb49c3183b1b9124f97be507ec101bc5d721b0f2ce05ecc6f6dac4748c7afeb829ab96af449661ecf87bf0c807a2b7f920956e675d8cb83b10290338bf65af4e6dcb726c1be4fb978ff2d53954e08fbb027a1a55c0da72250622807fa8714085100f1ff7caeba74c47485d01dab3ea3107387a66fdd562af612f05f24d84f88499e164f75995ac33a6e550c8a2011283b63757401e67cffea8b75839b887207490a80a15cec8547536317638b2b44dda97df788b2a77033d632242fbf163007c7dcbdaf8336ee53a7f9597f714b2e45e3399a7f02aec44921bd78be0fefee0c5e9b499488f6ea8a908777aadd0e51f3611cbaa1625b0db255640fb92e94208765cca12afebb0e5eb5940e803ec33458bbadf4aa723aa101f9fc45ab6ba16bfb85c750cd34e1ce427fa59a9a07286a084b43b4f482dc22aa87bcb6ff777614fb3731d4e5cc09aec867428852e69c5764a894981a349e073e774bd03fa2a0dfe8e282aa1f34a1246304d174452dad81004c06fa86082ec31051103de6ada0115720304cd40f26c3b4c108dadb6cca6b6dbe2178b27ddcead2ada03c8ed9025db868d149aeac290110342f289024719aff776a8f39e646f2f7c5826892b53619af34dc0d09ac266107c6dada0de5418457f048aa8701eb5fe2612d4e8ce2b9d98e0cc7136f7f9d782e01828baf0f98cbe9b152472431389644e9176af7b20c11f76909095aa6fc9ad56ccca9fe3405b637530e019c04cd4a71d5b72a4dc3bb575dc2383b55a2c25db0710fb165d316e7c32dd25648ed07c10bafa3290998361e23b0db45eb039d4521a6c23e906d3ad51fda45c1c55a76be74df61c3a5a01aeb0bbd48958539dbd5ab868aade882e0029fc0eeb09bfda877400d59a6cc6bb822583026c6aed60c73d098df9be884a504e57a23bf37270bafef92113ec85bbc78bbc1ec45e238bdc4134627650b130830637e8b4a21671eacf6061ef83400963288db1f9fa9f24e3b062708a5ea8e7839ac469bede54e6012d5e1e95f99fab40451f4273070936c3d0ba3d9dae1877365225acc26ed4d6e6611bdf6f1649ab44299a59994c08c666ea6553180aa7e98675833a261b3d4981b3be2ce4a2e710591e257fd59345deb3458a3a6138fd445a4d059954ad3747ba6a6f8d5c6420e3666ae83a8ea26885922b5278e200c3909920d453b2ec6cd979d0588b3f259d2b52560c152d4218c4ebe2e597022ca1d52d3717f0aa9f8106a62b9eadf6ad05f0072ab995183bfda2a6b36a1f28823e1cfddaf7f6a39021d729c46c7ce7c4013b6c2e1644b855c027ace60996becc436cf1509cef0585f252eae3e87f7b32391369aa4ca97558095be3c3ec862bd057cef1e32d6237479c81d2d03a3e1abe5480e6e5824cb80b7f4734923876d7572349e5d9d2d8a39ec86cc7d28b412d32fb8acb28e1b6e737cbf2879a18ef2a284fe5b57bb5d8b0511e1ab23203111a54d53a00bb916e6ca49564c524b2788c0d82aa4a11fbeac62a45937c39c9354bed8b976ee6b9fcad1a84a6d4782e9965cc64a18ae3cf964defe6df0b2c063526c4c4a9fbf182e9146140bf9edeb5da1d2e9ed15e385765ad69a8074956e19a15a32979902313bc074072b70a9e6fc41cfbd843ae5abbde4f6034121dfe83ea7f50610e16c595fdf081c297ffff83decafbb9fd638f248a999c31086e6b13b0cc941571731f2f3536ead766674a19b090f5ea096320baeff4e448f126e6ba716337eda891790aeb41445a2c29c85bc3d4b3136f9855a497c90121d62cb7a0b7ae0190bd561b4da77956f2f12dbe6f9efffbdb35e9750b0a7ebc63be6826ec0914baa7b7ac4c21f146ea48be5b777dca7a96ea653dca16ce7ddbb6b2c27bc7f0fd29d99f7a56ae5210c6039a9b3aaecdac4ce9067e9aee6d2c26c4b922fd58f3d117cf7ca87f1b513fb3cc8ed54e2931fce48021932eba6ff56732db70f5c89af94c31561d1091773b794ba1f1fc177dd42856bd64cea35a3f64ab2094ab3e6ddb90a636c350374a6ce027dbd78ca03a9bde14e2d9c1d1b871e6d5917667e3f5e0abd623818936543bb009446f46ebefb8cf6198da516b10f5b55835ff71deb970646a253f01b51d0eb098e5a271212495c3e6e84fc499eb3299dd1515105841f4840a44e502dd2b4ea97dc55657696299824bd9206385d0905a0c37a18e7916d2d45d895cd2d50864645fec743eec2f2cd337743576544777bf8ca58c3168bf74190cfb8ab9c63cb6a6e763e56fd216b67f52c0764531d84f920667bc424ec4401ebea25801d84dae3abd318f32429c9f4f45c5cc17420c809921831b0852aea0aa1c87aef032c5b3e7885e5ccf644b5008b88b1d36af6a729d860390cd9d04fb84ceb175d0fd2c2c74f0f3338d61aa2f75521b53e8a17b8e65dcee02d7564eb9757b2893e7600883aa9ff7fbb56141a55dbc7c547640c53abbcc4d5b70a6154145cbf5f27e84e31f513a729e8f8b991b879eb60a28b3d2df65fe2782deb5dffdbc681f78dc914468316c6d03630839f7bc9ed25b45232ae62c19845f69aa3754a1f7ae0f4baeb4c611daee127900a9a2c467d73117b753b5d8c66dda5baea2aebe23ab9e1103baa1ba2f00b3189a7285679fcd73e498d7b631ace8dbfae8aa73d9911d0d77b9de61f511a8ce8afe1b076defbc09f5ed3e50fe74004a9081d60cbbec0c44c5f8a86e8829f04b15552c8f9dfeadda92df0eea09c5ba0f63a0aedf2cda812a43e7a1313b1edf1202c72e87c075a7d00296d1ee18482012bb6ebb55f40382a939af5010d8987d0c997ba8569efbb3d28f390ec3f4a4393ce21384d7da111aa8ee773d742541d31f219a2264ff39d8c97ff04ed165820d731fb692cba7a94e10ab68f1c6ecbee834e44b2419abd61e9b1be51880338aa5a0b97f6b9a237528c7b8aaf36cf3bac53428b737dd697b8d31ab3df438256308acf99799ad161dafb65d64cbd003db70053605e21803d02e7377236a6104b63e7d2726a46b4849ebc5e2bf0258e3c9f391565eae323f7c0849c6bd0363982a50fd8b53123b81a0e5dd8ee21f6e5d2d56becfea2293e628239ce23346a6a96845126c476d8788caa4e4aaf5aa7937af9f76ebd0c6a3c07b885211aebc93ff1725a6142a3cb6267030c47e222ce13af6d8a0f03922cb941e3e559c56eb9061e0f9a0c9230830233a9263528f2c0d2eab0824274cbf712cb84d8bcb525d06996bc8e8d45a585c47cfd1ab6e643267db7538ead83224ff4ef2bedee5cb9a5e6d5f9a667df8b4a459d8f58219cac65608fd6fd94b12d9dbc374983534e828fea66577020b25a46f23fc07d29de971427febb5dbc715676f52e5e377fed291500c2468a4c808b1266be40e8240e8ba9306e612d796635521c5eea88e8cb05dba66457434faca622ffa37127a4bef2ab266968fb6fe232b5be336ee6126ab12a67e6fa49aea9240f3989e1ca20628470567a4335e487e72847366bdd813eb3a7b1a4bffbee089d2da0cc132e2b8b99cf5d0b807b8bb9bb1033e251ddb9d975ca103808d8823d7a04d20475f22aacaaeeb6b7911aca1a370420c1c17520ad7018001b756e1fda332b29ad9a84a2584074dfe905b2340bd37a8a4f2b225a3d5b080db9863afb4151172431e17426f0e2e8452a4ed03e2128f9dd050f73db0b6f1095bcabbdc9157c4f6e3bfb3f2d091abf92f5ecd36cdc9ff8956deec8079a54c8347f6664edc8ed3a542638442923507135c6605a2490b10d5ff439bd745c84a5668c36defdde5c7e627b3931bfc21c939a3639d31a00048e793280c2a5e4772ea86dad7a5dc8226235c56e763557e79d5cafe9bca18cf3228da3446620a4b4da769e2ac5a208d7bc3a7f58804e6739f4e9ade0954fba153009c10516592fc61f6d884f4f5f22f4b2ed1387fe4f729c40cdbabeeb98f9d35d8a063351d3e81393d9c68b85e9a8f20cba2c6d3edcfc86f77550f53e01dec5f16afd6fa7155035ae57d35007d60d78104e1488c05b87729f7cfb03fb1ecb559249111a94821a94e574394d23a8b2cf7405865b316f85e79f41336ba144621ac680ebb4a8ce89c9cfab62c387d65b809e8cdc64f07d8a6e7d6e74acdf17158df4ced7ce324f303cc359ea6392e34a33f62091368c0a077fb0514947e30b6817a36f8fe7ef88a076672c2a9dd3541152117d4f3072998f83ee962bbd7b95dc40590f5e622f0f4d0f318ebde2d7ad435386ff50e322a085237ea9868e074ae4a09c1addfd8f47b85fb8fe1ec30e5352b0bd3360df4ab37ac6f718042a04af13b0e31e88fa7ec654e043e6c7def5fab2022a95d9852946e2f6ce4e0f21f216dbf9a486e9e97c0fb54988f543670ce7f3c065a335656cdf503b8ad811f65e36bfc376e06b5b05885bf3ee960c1bd1cfaa63e4f80f0073e144fdb322b727b76331d6c0b7a7cfb9c4bb77fb45ac6de2f618752ef0c0d6dd0133b5bdda59268c40d48c187909a7f759463e15908ecd9f1ff06cba19e56916939f1c215b92934b341a6bf4a11b844c9aaebee3e32dcb8481b4c30cf00737af2cf9697412ddce82d165eedbcc47d5382d3782ecca23e831efc8009e0f80b30541d5563cbca558a19d598d4467392b3865832286b1fb9405aebcbdf3c4fc6bc756b54ad1a583c255ec77efa4ee49e6cbf8140648470f5f9e43055384bcd4e253f01bbfd969f38bee63135e93ee04a871395ca6a7d5e9bb5a413459f743948739926b3dba766f25f985ee8297c2f3e0b6cdefac3c0b1537d82dcc399225c5faf6a2464d0b577120f5c95bd4072992100b1a2f6f6b331c45866d2f9b0baff39e09c41f56328983fd71a1ddcb886e69b6fca2ae68bc0a5974e383e0d6ba5e87e0e16c68e1d689221bdba3f6e1922dd565f9ebef30a4ed77367e06827524be0d741c0fb5985dd2d61cc25439be9ad48f7d817a545fcc48d01ac469870ee14aeec8282277b23f030a70941718ab28fed29e21c2903e98c90e92452160fc6691c64d844931f7f07659a7ef71064fb2f949286969055570da8d2d7ed292d63b0f0e74cee886b228c92e332306a504df707dacb6b2364d0af9c64cefd1bf24b53f31fe5684c8793e5802a2dd2c5772f4e0daaba842a58dbda3648106b328508b8edb1ab9a279c5a7cf71678c66a01299c6daa59c9ed5901f63c26a520b70f2249a648a66d63d200b7bf4f1af5a115c34af081b222b38dc86b77a59603f1b71f6ce58adfc747500c009f7e1b46b2db86be5ed7cd78c61fbba2af6eeafb2aa6898b741f5d921a3f06be604b84a0e47cf9617f56b0b16c355f01ac29a9f2a803e70d19b028b425c67658ca5d5ced8020a59b1aa465b7eef83ef1357ddccfb5f7c25a9de54917b00ee538a55dab14ceee10d5f969f470948fdfdb14128a7a97aaa1dac765c7a1023fdbc5b9f279fd160fc475e24e63c6a522ca250f91bbda96430cf561d9aa3c6580de67cec5cf90a0ab49e59efabca06bdb8839efa277d9fceb8b1331e8fbcf1ff97886ab7db4b5b3e9258bf51707e52ce0a07d7becc75e0fc9a79c013bc14179d3308a19c3315499f1e2d1ae4a4a7f31599a5b7d18b2521906e7f89779047cbb368edce03f4d5598ec071e933d8f55c26fff3abbcd419b60c9d48fbb4bcc672d491be2c89810a0f9021dd96a98dd4f26495581ffb47b222d3bf4c9375922ea17355e059977821d045aab6cfc023d55a711279a0f7568cfc783d20fd24a0dedc021e0ad1a83acb5001d393e1124b54f8becfaecb3b7108b78cbf3c753c79658713627431465954e377250b771a650251b0458dfb5227c3c8638e15b8377c413729cbd2d4fc445d1ef82773fe32f13c09f81c8dbdc5fb3cb3af423312a039f070b7a2ad59349c5277174363e306708065f8bd348ef16bd21dc2741b310122f1a84f8f4a1a89c1c360571151c20f836e0a248ff8eb7eea324b4f8c347fc4d7d352440a5fb556452e8f2a19d417b87a536b2e3d715fc906cbe09903257b75b90413477c44a63497024822b551609bf5ef1d582e04685a420d62517164a0ae67024fcc8daf69bf57dd1fb38c501924568f7544ea4871cd1c8544eb4f588ba9326c8c4596e67c20d81d9a6ef766bddc4cb32776eaa4187bf6a1fcd8f5979920cb913d4520804a33c8523cb79efbdb3e29089850a7add8f171121ead1c98559f931ef73dc313705288f97b2fdb85ddc47bee3c84c9dc1fc81c241eca2ce14d6019743eb1f6f68af79aa1da2a45ab5209c5d2a865a9a5796a487671d29ef8ed2cdf2f782424dfd6ad8db9de5965c2b47897645085cf9062529677bc38fb45b15054af2816d505ffeed2cffc1fa462918b50f1c967b433570b76b6627fba5e36750a71e30ca02f6335fa42b7ff8a1165cc9339777deff4e40f7990e91964b8e90561262d67eea2ad1d64b0a66baf45adb6ce79ef5afb5b85d91fb5c48882dc557c092a6bcb490649ffc2a82c065c75d5d4735195613eddb8f2c993896f8d3ee863630d22b927d0a6676487cd324a386aa0224f0e334301f9e70798bc10ec673e35ff3cf69403886eeefaee1e91d0e3f8944bc0be43a05ec5107a53b12f48dba37e4e383bee7493eff0d6297487892f0c4b50652a14df5aa71962532d1cfb02d496c08d774af399c61786e88385eb7ff21fe09ae619387c1c6c8ff5646cab832e3a06bb3d2bf8f06dbd9d99a03f704d569c7ce056e37439918423d91b90a2c33cb2813001f40d3e637d8acb7f06a01da63b75b410e5fb19a2fafe7ca71ba9497caab08a4a4598ea33b1ceec646e03676d977ba488a345a2dd3b503e9b70079c6a8d25389a93347a5b04ea7af4e802c1291aff3042addc5b8cbfc9bd5d30461282d44fb9575f586545d15e05a50736a1455060c5b35827aa5e02db6780defd72521a908b252c8d3180c1aa0af93e078e6eb240f37f54d025adaf05db9ace960254bab83c786d4b7598305ef9661f0dfee1bb2037fb064e44181ec9780fa19869074f073bc5a40b97f8b7dd5f700ca2696af58f11bafefa8c09cca6cb53da8d0ce6420e079163562f2ec2a5bbab998d5456dbde0f23a17d741f531e441bebec647e3e4d2e502da381a6eb588c7d47f75621f8ad8ee9803f82b52ca080ac581f163b9e452ea6658c560d9c6650699a98d578b66e2f613dd93e67c3ddff99a1cd88badc7676f89d6912af404f85f503ea58b7afa04f3f1ca30da3b3171f684b5042589351a5db47d22e188184bbb40654566b3ee48cb7bf4586f564fc7eacc75fb9b13d8729a2f7502ee5da96600b247f65000e9b667f983920d973ee8bbbb8347531455770f42e5b9b73b604f18ee0c3fb1279355afb39f671cc4a6dc5397086fb7535731a435f5cda6eae510e93cdba9f1f1952d8bf06e5e04a631ac98a82bfc2d9a84a9424fcfc82231dfb15de4dcbb78269746e4fa1bff2d05855f743815751faf84e6cfd9983292daf7385b2d39fdaf8e40a9a017ccd2ffa94afdce8ded62f45b00f0341b7b9160abd4afca6117f7fcf0395da990aa60e359298f8df0dc4c1466a0d05a5d9e6ff36d1f1d94c6a132c816296ae5addc303fdfc91c9ba90abae7980b8d28e72953b3e77f8ba0a4fc357cc6b9d93eb58aca7c01d4acdf009e34d5b9ea2f850045c608e39d00d64553887ec991b19bf2deb70388ef48413dc0424690e4bf5bf21a4f5a2720841ef0ccb438e758fae3aafe7e3b3bc4f6a9a79a6da2e6a2439103cf76117db11f60ec8f4010e7b7bc002612a78be4fbc0ff87513c5183cbc60f7c8cc395abf8da8482c5b470935500d9ae43bb5d493cae2b251038bb2f084dbda57bbf4f799cbc72fa9699bfb1dbcd5689b84118342ec716c9fde748b201e283c5c1f1a5b146ce139c2975650af02c5f019bc1236b7913a6bb40d361d35d8c492589e100199d174dafa7d3ca663d24dc5c11c3e8b6c69ac44202846c5bc554f70ef918c97b4a9f097d3738568d69bdb5e344d0cedfbd6559a86b81d313e04075c6391d669df46e304c022e71461dffd3de5c6f3dac057b4b33a252fcc0575bab9572784147448da865303c835a01f31c9580299de747e4842cd07f512dd1aa81c5ccb2c043e1035b10e8ebf492bca0794fd9 -MD = e855da51d23beb4647c4ff3607c3ac88e94a705866fef02842b76be3cea65b43b545d673dbef9972f35d2658ecd60bd82373a5502376d1a407f83a369bfa6947 - -Len = 78640 -Msg = 3299530a2446fb395b9380a85417e9d1f13acd7f1f4a1485b6cb01afa10e71f93e055dff0755a6b573ad1258175691a4110cc648a60dc2972a6f138020b6fdc0a3a607560556ba37b586a5446632a4796d6862676b561de42da7a901d010b83c292558f76472bd29eac7415489d3a9b7cff4aac4b64eacd4871bcd1af84129d5972a59ca6cd039f2da17ee70c76028c5fd5ba547cf1cf7d0ff7286b3df74d8f4b75c10b86799b5fa4d1fb5806902aa0dbf435bd9fdea863e5e54ddb4cecf4eff4f6487a79bf4baa90b879d6cb7e0b6f6df55d5608adde2876c6bd8050d7a126028e9c680510acf67dbf6af1cf923d4e823381ac5bc1f9214f15c828ee49eac7d0a94d32cd1027c9c8714f27877f28c4b559432f1dcd81e4cb5d2e0389b63a5c0bd0db892630549b0d58a6e69797667883b1326cb312f0f967f73fce979f0849008fb7d994f3bbf0b8e002bd546d6ec059e5bfd3a054deb5c19e7dd8ac76ed154b407282bdccb65157a1d32a6273ba42b4514bf289e5a3d0549d78b04ce04157689d8c32f54dec337608a8ac264cd1562fae7757c457d8af9d8eb0f3dd3dbd65d4f17558cfd9b62d709ef3b1345b3c913837b261e42de5c9f8eca701f211a9f71ce6be72c202bc95f3ef24e7f111648a4a97adaf5dda63a61321db691ffeaf51ace7d80f604b58035c53ecaf0121d187f348999eb5efdada68e8be97ab47362c016f428d2f36210c36679b74d8ef1c30aec526ce70c0a3cd768bd12c489dc6dcb6f79e7a8335a006feb4c1d7eceb9d1af997d5ad231f66f5a895a3956c64e9fa3a1b4c6600dc4d8a31a5e056a1a9ec8d502b26c9213e8ce98b90b6418b3f07eb0744ccce3c9c821c6bd5876fbbac832e3f098a910fa09e2f9bf789df297eb945bb0ea0217af9062409ae17918f55e96432bd71934308132e66548ebccbc66690a1c356ee5074123787aa215a914897d5c7b18c4e7fc7746c57124578e688a832681d61a351806edd8244252975f706e96a803b30fa513a7ffacb3e720e47f6c18a7740ef02b0546c7626a38c81e3cf159793fed95747fdcfdde9ea56a786cac4756b851fc8866b9adfac2d02599148e0db7757a62b1e06d26cf8c99556b79c91a5649ea437752cbf3b5f121961821ce1a2a4c635da461e3e14626cac707d04dfb6ed1e4ac40f106ff5ba03304e28a38e99a6daf6d9427c5980d1440a99296c05168f5441e2a6af13ab4760f55407855e0cf7f667ccb5d9bb2eafd03e455f6a8830a5f14837ee6140c871cbc737a13ab68902b91718f29ee97a6891c5e98168ffb1db75cc2858cf8de9e394244d882c4eaa719363329b344ae09619201a31efc2068a422c384852416bf76aab2a1ee28ccdaf060ace1242861da2d6db4bd37785ab5cf706ec6f8201eb37bfba41f7e5d78f25814c3fea41f17e394b55e2f898a11cae04dab920e755c42ef3d01985bed54b7fb5c60ca5ab339ea3f73e9423bbaad707ec2622feeaa3a337b79b355ac60caf07e3f6b8b6f6b2db8d6af3c3b7590966f51d57be6c2471e50c6b6a19e9a3c40678cc6cd8a0bcf5c15006f3f656195358f0290deffafd5725f79fcb3bb4d0b20e2cbf76c0f54682ec865bdda072450f09839fb73c2dfdb9d293b53d1f3ec54d12ae3dc316175bd0c9baea0f568e94930519d1d23767ae10776b5c4e38fa0a0bb077d7d04ca94575c54832178d1d6095e83d7fed465a76f180e8e56d1d79076464041e0ce90dabc87bc8b464b8a1317e0f68fa66fd58f0e38b86f128313e55eda9fd60f75fc6e76f69b6f1957dbc9fb20726c1edd0f5a45cf3e00fee28bc6e0dfeae512e356780d10b9d7a2820c203e84bf166d045b2f9d4566e825d4875c85bdea15effee622073cdd69e8b5643f6776a4369bce00369d02f9d08c424eced4dc670fb0b0f392eee4d1d0f3d92c4ffe5deb74b1224899cd6ebe5f3d15294556a5297a5de0c7f0496f5bb2cbd4ad778ca15a77b6e7797db5f27f3e3f3360e9917ef7fffc76a865a14544b879902ce098a9bae8b207dc0cdef402149a863be10fd09a469759df197dce538904f3f4b1aadfd26ead69b96ecfde108a56f501565804dbf63573b433657152ce74e74c134aaa6cb2b0f558cb101671487c67fc6ff28080b7dfab6edbe199072ed1537b2e01724e5bc293004a2a06edf514c6725567ae51339ce9573b7aab3c52241eca2956a04112ec2bfb13a4144c3924f9ac2f3ff5180f7415b578b710b7e17532812dd29a0d7f35a58f4f06aa55beb6e8f22600bc9bf66f18d1bd21304184ca76e861fbc97a49a5e90526d92fd129d17b8c62346da38e96d8f3303e73a1e32dd246ee5c95501944e0a5bfa30b89257e9ac10a626ff87ff03e63f99942a1a5a52ee5fb7a6756961b70b643efa54258c42dda47132a627285326841b70307723a720bb1dfa55569318282d94267c76aab1c1f40ce06a90f5e9d4b3022209cf4f587013812b916398eff4faa26b8df043b4fd81e1b6b94fd826555ed61ff28d0dd530fb79b095eaf3bcd66de220051ce7dae4d0882c1ede5f974cba1fc0a73b1fbbf7c5603fff8733fd60f9cbfa8e66f7822c6278c707a6eccb0f8737ba7443d55b3923fd001ab2ca200910c8316669034918aa2c0e004410203238c6740641cf61897978d793e826d353657f8b399d8bae5e2a2a7795205a3549313483c9cf7e3d4d489bfce7a1fa75c44a5a6e746f01104164fc7a42e63b88a9131a403b27625d1913af06827a8585d041d141b377f41d86ed0abc75e03488f650e05fd6e40c5f516d5a7af0dc88820bee8cab5322e5347314ed84cab8c5b4a57d1f2929afecb2aaa806d0bf325408cba2d501f00a54e3ba9f0d899dda7f9a3afa3f42afc573d579663c9e4a267878b3f152fbf698b3a9b1cdf3118bcfb2b82b4ab922d5ef4256423a843a2e337660596c8eeff3488204fd3426e2f0f31f8cfaf125403867c8a38967463ad7c3de4e0086d15462b46073e16421448a0f06972e8ffc2143c9875bd3af2b26d35200905db2d2cfb146af7522d07adca35e18554a79b65c84af0edda5647b74bd888dd5c572fbc88b89ff8725fb8c11d97ab545b340dc488772bfa77319efaad2b1f69cdc69c4c54df8b1386f57ed6a98ef7de70d67e67ba8af2a47d141d04fcf88ab4416e9b65c750d64f77378076d5e26d2c7cd716d7c84cecf4d247ec5ca10574c69e99558e49d529b52b6de7280b5ab445657dfc9b1885c2f15f12348a021a83a8ce8df14f42342c4b8bdfda75b3bf75311511593b14fc1ba40cbd1d1789015f61b79298301a36861b7fd582e333d957f972da5440227ba013c28fce8a9d81b1f943f272ba39a3df2df09606fcf47003a466221631acc8f94867d1706ba561217959f3a6740843e187c46b8f485e4c203ad82fc79619accd4be4cc2a430b6a56e8e0df5de7edde3233e59c454eda3457c4af4b8df8d1efc42222c525993664f94ec2fcbe99513b7a3939714f96cef25048d5bc93dd3c5987d7080788f58e17b1b4e693f2149d23629faa31d6a8a34cb2d131caffd0c2b2be727dd97cdf7b4a272134eb20e0375e916f1f26010dc20b2664abbffa56cbc111f96b8229e065c7039d944e718389b4b1b17f96f94c91f7530b2be1abf9bf4f2676b94bb67fb454ec30ee020d87f9ed676bb4cae5ed7ad7e2cd997a3b400624a8f04f7c4c45d0ba8ae32a501b74f1d05da7a50aee78e4747ab3ddd0d1b308083d70155d12b922c086bd3080c3d0d8263b6c3a9e3c763797c4c3e02b96db2dc38dfdf3353163103088c6e8da2f2516b7a8c35bcdf66fda06670788d5b23fde1c419fd14ed0cb03d137073ba684fa134b4db2f0e045e9378a0c87be154c6881dd015e97ee187a646a3c870f2bedd836aad244e11f506eb5ea5b4a6b328cdc80cc74432d5e31f799c43e4f4eb29046e99bde7e16d24085bcf0fb5875759b2541b243557be642ca0ca7e665de8395cc94e8196a78413cb7b46295b9c626a1cb2e56169d69cd737c23dadcd3a9e625f29d572d0fedb46d8a0509d076448dc554ad829321e05dee944827c7a1952368416db1bf755e72fa8818ad5595d9f1304a28fc65ebc6dcd89ae25450d58c8185406cbd7aa5b4c40c395316cb216c9c0a34068d320305935c16592a1e797549a478024503a6d5f2cb241f0bdb1fe4d47a9baffda36f83ca9f911471da9437c4ef6f980f0580ab445ed1e5552d992be2a8068b145f392ac9cc937df12b2fbc378caf94e5263c1d01eec80bbc6896280ebdfd029a0f69e0d709a2fb71ba51ebeda3c0608d0ee11273a292fb08351fc39fe1087c565a058f3d7e48f6bb2e02ac2d5d2862cf667774e0a3b61b013b3be4df3bb06111e9171e44550cd695304ae73ee1710475d6072a9118bcd56f23f27314f47c199363a67531b37604c8683284695822ad4505971cce2a2d9019944c588733f50ca471bb7c4fc20fe61c7dc16cf6eac4c4099c3232df018fb3c837527b8021a1a20cbb5d1be5aa5ee5581800852dbedeb38742dd540bc46da844b40bc546e60a4492e8943a3a93ec6a46e0f5b855fdf8e188a0a26a9b9c4cd655b2801c23a9b85800a068c197a43fdbac7eaaeeb8ce9bb6d35e885cd7b0b6a5c3d9b76a5d9232481c8de2984405e1a15399270d9c5a4d9a322397120729327d55d2ba953dcb007aaf5509a789df5a2503da72fe4ac999f56b97d874732e49c6d44591860b79aa5880a0e6d7ae5a30ce83e895aa0a42042f4763526b63e881e809d942260fc7b84859177f0efa9ded039d6d98f824ed18b08e2f0edd1e7e654bb937d75c91dbb3b40061de35b6d1182e170e81cfdff35ce108a212b4ed197a58af07570fd8dd23033e270b352b1d3ab6ba755a19847c58287c6568d618e14a75b2f0cb292df68e9ddb110cf49eaada034e4a2bbd5baf95eeb420182de7fd5c0b899a3a91d84d7eea9fc6eb5c5a9f807d9b34faa3acb59a9c767a289fa1963883fdaeac2f210c7a5252efb054a625b58c68dcd1b3bfb6ef988b1ba21690d36743d6d42aeb4f580b3dbb3361c3c964ff987feab7d5dbd91d4cbbac8d79fadd70b5dcb3baadac5cb713a33b08930c83e909a605b5f14a46ab1ecdd5f2b028dbdb40d6f4675d7e3d093cd2afacabb7abf847a6d5d1ef522621788b3dd8a262f6314b8e3e36e30e268620103656f31203b6ba470315b73ca108c1bb8d4739f056f840ca3a3127a43db82725780d5364b4aaca5037893150dee761266c485c1922bb8653905f1288aa26bad81ed9b3f7e55ce08b183446d50646c09483e1f32683ff85f1e7c88a0196583ff2d0c2fb11bf5562be4f1edc1540ad46cd7a1ce75fa04ea56be775785829d7203c35d113fb6a1cbab2844fdc56b5a55b98f8011e0ca22f4e8b396dc5d68a2ac37bf60de3fd0d394e2f5ed02fe18cb567bea5978175b02be81785b857c0e2d9927aba7f545ed03588fd85a8bbfeee66d2082ae6f8e2f3c9dbd8725f1861586df3002a2d4c68dc97cfe3a2df6af4033f043b2ff66c9a92918f96a969ef00156d50d4ee21b46159e78aaa5d7e230df2c865225bd0c3e6b60b6d19d2dec3e4406110bfad6375926fae231a5d8bcd8fe4895e84577be70e87c0db2894c77e5602d19b890ff97543447201fb4b1152c3000b5528caffbe5a2c37428d972b079e834659fabeed9ebc03be8c15ce1599f16fd5b3d75d653211cef80b0e84124604ea48b2d95f47d744d2172c308fa18a61586fe159b8b42a7d948c9c74038423d0605d0ef09d0d0724d907491335bc0d5ae462457682f48de4a77a5f86bb8a86490c0fd5051d4918a542154b87696f0a263b3549f6642d458f2e4aba0e552b57b817e56fe18a02f10d32ca9a54d3c1690b847054a0056839c6528517d278707e65a867444c8a417aa4d3ac9e421aba1252e89ccd3d0ead51d13bb2dd9ccd5fe398e81ebc0ec50d9bb44d45c018e762ee428e401e95260275f710597432fc036f99fe9140eee56e3c83c81d66a0e1c2e3259ee4ae70f6718d81fa02445cac6108af134936b58f6c455a6bbafaa0b1e1da414210e596250181b72036b5e4858397244fcc082b6d109e815ea6e2e1fec7bce0a04d2bcf5cba39e1ab7c2f913170053ed9a41c1827613040ca69882b717d6f48e022e8e243a59e47c25d1a2a55303846da58dc446567e1dfd7895246b20addc12b18849881c996318e60de789ccc1a837971af77ce2b9aa5ac90aaf96876ec95a9b667b9bf2f0ae6360de343ab4b923fdf76fc780ab444dc7206f70d3bca860a8184fa0da4dde3afe3ec91522db587c033ef2d10c20bc5ca5071a04bd50d926adc0aa35bd9dd07d4bd86516fc812e3509e65a9079e3607b76f5b0f78db47f8fbe1d1cb6d0537609deb628960246b8d35485fd825453ff0edf64bab5ff880a006b960db09d1f1d5519608a3eeeac76db758652231602d6ab30ecadcc7d2c172d28b3f39f8e5154d3ae50105e1c22f6b20f7ffeff596095c50df5f0a77111156a980f74f01e8aab29e01d4190153aa6fb64cb6a73790daad0d90929d385e7934d1c00f84ee83b9ebc611094516464061c38011b2c0f5a847324aebfdd26100f493720f3f865d49e0fa3e29f3e742f9298dba9978586e7c110734f3930dc1ae7e37be7fea901f627982b0bb8a3df0deaf5d23d462c6a35df3d37731c5b1268bba05cde8ecd5700c9ea58e4772e0f8f6dc7ae34cd6d43b53d5e03a2dfc853aa09045c7d2ad1df95037ac00551298014a962e21893d48df669f74a670a152a2f4e93ed4c3952f61352cdf306ed42db3e0c6bf051100eb369f39d8e3811ae0098fab391a450cd551c4658643191f66b8c25576b86e8585e9058c5418e8d1f7157ac07ec4df7ad57104cae964df5c0cb5f8299b622836de9fa07e2f6d2e2c5f6ebc0e55f81a47f868fd4450b947f1e755882c762ac57abd0179f8b30bda95dfbd5d7f06de7cdb06dfb7b9026ad947bf3d7c444e39cfb8ecb697e3261a747341aa66fad8a08f9ec77d3b1348a01dc65c18db5b6db7ce5a31670325d1c1852e4bdcde661563dbf903eb90386a839cd6868cae5819cb48c755bcc3a8fc29942ec6fccdad0352e75281d0be12b03adde00441fc239b9dc767205ce152ef7a29da79b13cb6ea923b120ad5ce8761ee684a9fe1cda43b56d2a259f0640df1dbcc9c2ea43169144e5fa266a2c781c7c6c67e1f112ac3401ef2e0ca1f55c04b7406dbab7db7aec8acdc685ddeb1e728eb7ee24c7b1968f41cad893992bb53466e5e00b9e3d36d4dd438ceb63194a1cd8418e0edc7a57b9d798e056ff19ead28f15d71207e8f8eeceffe3b3b457996feba1ddfcc9dd3e4845c1abc34e307b839248997a8f7f2f9ed25b317b2bf67b003b51447afa3ad8bf1eedb174f10fc5bc3306dda19f60497989de1c9e44a67d6239c857f5f843a582b57587c8a21887e0c3d8ea33a22ce4e34800fbb998c80f0a797f8f1a4e682347cbe1954abbeb0095d727658d42457070bf5c654992dbae7d7d0f60445728e052a4ba7087b8e7ee5fef7ac63afa3a8ab63258dfcabd61da1fb6c06200ccf65b57e2889fec23af9f837f5b82a9348c7208538ec1b992fb2075b96b1adbfa50f2ac07a47a04869292b5094231748bbbe50b9556b1929df80013f747e13279e954e386c6a55d4c4176790fb739095a3952147a4935f248f8f78ee2ef5bb0c60fe072e23798430f3ca92415333ff44a9527d764eeb5351e6e852b1ed9e0b3693523fe9cafc97229d4a95a9c3e8cb1b74ff4b8f7bfc5e7a8d9279d0d9026c6ce09addb2877bf5736aa05910741c5ce3ada373da524ce9652b95d39319a84778efddc9d1827f06eb04d3c5c08d561a63fb47dc9ffc655adb69fa4a41d61802206723eb8ee58f325110ebc000371f6d6507f27026a1cf1aa4efc8c52437db072df0742b30d534e16f39f134179afebdaf78ac16b66710928864072b826578bc6634d971017cf57b0b24ec084edd7b720bf77db69979b2294f70c066a487778b95d859a547025a68ee7ce424ed291ef43f2c6e3915fd3d46c0bcfa5dd2c661db8087fdaf4b8feb10e0e7e2703ca570ab13be8685731c3753a5f0bdf8544abd13f0e7cc77554931dca80decd4827af8005156ce83fbfd2ab7c4b4111f713a139dada0cee5ad5bb33210980d3809cf3e59bf9b4c1bf4c99ddae5aeffba72beece07f5b0be29aebf97bde2d4a8417cdcb1f27360a36a8a71924d2898eb19f00ce442ec08c5465228c20db76ada0f59b26bb4fce10ba5dc025fd52ebc7ec40254431817658255727f387cf1b3d74eb63d793ff0c64915c3b49cd2c7db0549d58d30f4226773bb623b61a82c402e8404a6711019810a1ed410dfc29e654cffebf05463777f280ca3d5e40bb1805e53e7a5d9c1c191cd457fafaf211ceb846aa82613e2912d0dadd9e726044bf4d512b1b419b17378e10e48d9717acdfe6a2eaca6f60df9e1933356d7ae4e362e21650549c78bb9b703fda236cd4c1bfe5c906bfb81223c4d5721bd3ff3361a9cd1af54ef59ad0edc94882e3028f1a16bda54688c3bdbb2c0d7fd7f888b5853b15476231d4691ed4a21324f6e0b17d8d771df14e18ca707dc942b1039dd219c1c283de24c14d6cf9028808838fa3b3cb19185138409f0a5f0fa3f11cc6f2e3e2ddb8b24f45ae8304f18f75b395cc8479ae80ac6fc2a6517ce98ade6d8c7dad476dcd27dbe7f42c9c7810b5ae7c93b73f3b3c4b1a26460d795edfc11b76db3d977aaa83f030872d699df30e9bcb6216c4ca347662f5e60501768ae2510d745b7b0d370eb5a7d04e156a20c9a20ba067b16250756fb6f002ba3a738935d7b1d19b2c5c1253d4355945e77f2dedc3b473ad0c788f68f1cbcc4cb182feef5ef8669ee201d5f23f1f14a31bf984a17b080261cf940d752fdf2b60e4a088a82ab2e12d340ea0b871f749d70e7414e9bc03dc75b38c37c0f694e79ed9b37188c1480bef2c6bbbd0f123be89c8d927eb0c0dc890c048556ed152c7ad9aa4ffb6ad20ac8dd1006e60470d3c60521103cff68e8f5affb0afaa458194362f5c7b5b76a48cae2bb50191fc1b8a04b303f0beffeef97d77ad8d9adc8916e09ec22d9ea23b72fb4373bb8a97b7721ef39638e0b196ce9e302536661dd21554f1bd5ca8bb4c271b2020e674a048ba561bb4225c93ecd6683302f33790c45939303751a0494174b7caa6c8769f362b533144f55a2d59d980872a0c35bec8a938611755afd2811f774aeba9b91de88dbe402dfa0408469e913487c9872e44cff98e45aefde074f002a7d9d364a2c8a83e4d597980ab19ee4143ff715668a29123bea8a4b1fa82b101e9578da0b43d437c62afb9f69e3c9138bb7c4ec9f548b85efa2a81f4a913281b194c1e95ddaf281f8617048f6a154f1fa4e5a6095ca00c5449b28bed738f1ef93ea2cf6aa4861dd0c279a072960ef09e0722c23d251054aab3290cc5e35e5c436040e848912beb371dbdd6c9aa8d3b5ceb1aea8ed9025a0b40754aa37ee8a7a0870eb1562d045afb9fcceeb92ffcf90258b76624ffdde41df97f8eb0ce96cab8bcf471bdff7a31c5508c306cacc2f23756e07d261f09bb88e52f1f135ace8b3406da72a490f63a3c39e6e40aa947eea4ee7d78bcc2eea7f50c6e47f5aaf9b4bc6ea8fa3466de3b0961c251baaef3b5f127779f106ff46f0c77224c7e47800bf7fb4652940b9bfdd3d009c0a5442e0ec50ab43a47ae83dd742d3477d5b8c9598eb59cc2ee079648438fa179f3f260c3c89d1d918c0703b7d6368d1023853e6528a4939167e036e301a574c4cb41f19aa3ea9aec0503dcc6d99b135f8f3746f96ed111092920e298b41a69e955b8495cfef91492da2976d22663b0ab425548db0843ff705c4e042d04f7672fbbdfd0d180d071cc340139a364964b3e6467aed49d02460f27f3036b9b4358e0223eefc0d2799be23b148e003c3dcc5e1cf5dfacd517cc2eb396471a1e062342b45e0cf29cfc781c16e9dbb2565f1a549288432b5a897b1528bf38023848b09e99c69130855ff2c1ee09898259041f68efa74219d1603a0badf73eea8f12e73bf9fee44035acf01beafa0135ee34c2e15bdb443de5a5f0596ac4c19ccb6bb063fb8f6fea55eb59703346aa96bcf8eb09fdabb1603c5f874888b129de955cf35cc70098f88d221709f074eb6c6c578226fe9ff14a7e96e61e2f43de7995ec986f86d9c930845b112e4a0d2e7ea55a7081853f6cc35452f52386044835722387e460a3695ce39d2f276998da9510089b62bb148b93669c9ca1b67bcfd9d409a8037ce4e04251f1593b749d57795469ec10c8a5b4815b7bc3dee630dc2f65a7e313032795ab775d77b393a50cf21a854bd5d37a5057dbf852233facd5fdca04215e1cf1f25efcec71d7f03763c80a65a1f7041cc8db901a31b8e976240cae28482af0cc5e258aa32fefb0dbc3c2cb10d4bf841282d61fe949e50b162f24b71c42c0a73f41c6c68c9a43fe1994aa068ece757be4e80f336d80f2ce15600c8de7f56868d3040a5aae981b007a3f4662e87561111b615072afbf2659fa1e8ed9914b6a5b0e0db9ee1112bede852a5f8825b3cb6c3e545f84b6efcbd54dd07043232b0da97bc59b29bef175c1c3bebc1f4d6ffab7d52b05128af6276997e07b72a47c9a7a9f9477b4bc1b88d1ba6327d069913718694d0ac434be823e5eb5770f1c2859f504e31736137a3f35f48266437f00cab781223641bb2d267b2db72cc19416924331184158ccf5e116f981421f9aa6fbbda5125132272d5a49894e6231122e8d8bae9dbec2ee73b89b4fca830dbf6a12525d85223e81a565d0fce2e007a15891f604d8561b81de0aed80c3f1b4f834569d32e3720ed07c90370ddb6fea467ce8acba33d00c8e1d203314d653bd4cec10c7ab9409491c9c23a745a1d7820b82d8d45814f63c1b184296916a73cfc47b88f75100af986dec66472a9ce078f752aa9766e58e5433b7b83e81e6179366c70656aa902ca3cc54a0404635517412d5a61c6d0d61fbdbe2c9526bb408b03cb9d20c40aa471140bc1bb921d2f41d65f1138cf5f437da1d81befad83b0ecf4e3933409bb8c98bd20c1ddb41dd8f1cf78f3b0e8402d898007cdf604fe3f098a230731b41207bb8892cefcd30bceb18d19864cba49f0bde8cbb74a9581478b24284d8c4bc4c22416d05d9b876d9d0baf9f2d7eadc339954ca26c5007b366cc6361fab6394a289cd867d22c4999a06aa7987dc94b4264ba1c1a61a8b41b1957b84e733224f8c7705dd7d14182369548f593dbaf1b5e0e76e7a21ba7231eebb7a36c6ba277770b39079eef5dd9cad83129ffebb2866ca3562fb80eeded453a66b54a3869a93b8061862b60e3a8acd5bda55b12562504aff264eacfef7b0491df4e465e0a42ccb3842a1bfa7587733a490823e41c6f9c90b617b8c32e44f39eac0f0f6106dc91111b83def085fea4626db2f8c577debb022bc8807d1ce3989d3757f3d5e1cf2f259223e3078766c6ea9646385afaeae650cdf7f0725dcf4a3a1bc9a2212d930d6d727ad6941c58413f4d226109082c8529171677374370aed1c3c488d73ce092554709182a975ba9dd0ce80154421c3dd791b4932070603d10b9e9166ca20074798a5f262f9ae967505007a7d11b227708b842c2e267265b537897d955ffab2a56b6dd8f37897a1015b0f1b2e405d7a729054184e19a3ba0369a615037a8291a595704c1c705962aa9aa46c11184c464b5135167a27c08922679d609663e02cb0dd5755c5271b61d88966730ee3a4126293cd2c9a99f15b7af9156637613d0b2f0ccafcd6e60627f4f1fe3a0ee790672121c46597b760b773e9b630cfbec1b788ea704838f5423b649a13c9f76e36ccefc2c3c657c9322575fe29c544c093b7253ff241d19cf625924c4e26b3bebec9343d7259c317922de8ff162e80b0dc936cd3f7ef8a234b6ee4cf575b281f51e6595b7825c3e9a65834b5247169d6c3d4c76e285b4cd1689dc4ead57040db17acc4e47e324086962dc1e8fc98e97971019dd72d8cfdf0753a9967706be13937a2dea02b8920378b35f85f46aae7e20da255d7ad8a86c69ccecb0cd156f580d9510f5628314d44adf63fe4a9b04a5ac03f5936515ed09c03e0c2a2a03863f9273fc0d01c32adf523faff3dcdb1fc27b26110bcc00fc2b9d2f8e5f0841a13ec46f657d4b0952a9116c9a1335bb5e4910a8fe230a2a54367329e9ec02603eda061fe3e2b8c61ab62ade98b8efbc5eae2f152375ca1293dec4b5b55d82efbd95f9edddb9d579e17ae11e4271654e7f6608e31770663a2979144b67001430bbf6f251d98f1b95458be6942dc930f25f0550ab40af79018399e453858030d3987191f45dcf15c8c55dade8911ccd387c0078c6359f7d1930b5b786775a6368f19a5b4de0e63e54ef64a9843308a49144fbf3dc7cacece1cf40f03ce2fb263155d5b0b6f9810ffa02355bef7a09519d483c44467c6432ebadf040ef2efee3ed23c834d80e1c0508cc444782ec9b5eacf4560cacbb61f9976b180c25d1b236fce9c64a19a513a8019c15ff06f13b2640e7ed9f77c002ab95753cc46961d199e11674730445048384f02ee4b42e65330981478f2010e2c3365ad30c3255b9872a48374220646b020377039b42faa61f675f185e4e246edb2a8a7f361933f68938eda339e689b3bdfd8f18851bfc7a55daefb48f4a81234dc292a5f47662f50aad752ccccf3b7b11e3b6e224a79a5e40e4a1c084bdad9cb59ef1cba9e29951a5f88d586d52e03da8466d050c8e6ace9b1513b0f10000278d202674d8d61d88c59a74aabe1a1e57eba63fd5af38c457bedcc3fa36ca3f704ef6bf1603d98606f413f988117d5c664673adf88f2f5d6616ac2120d874a1f375731a43bd655958abe55a951a0510f5534f15d21eea9c964d13b9b95887de2d8b35c66257f21dfa779f36462a49d2619c8925e6f0e2e844cca3fc28298c4a8b1aaf521686083a68c1920b1fe4a427578cd24ccb87b0e71e1fcd76f1edea8d988e502bc4aa203520247e5786bbac7623ae8b08e455cd1f6ea100a8aaf83b0dd260b8e1f146d294bd1ab49a1f21db45726c33d8c5edafd7d31ade1fb7eae651d53c59e320de87ef9c1ec5415db9b92bb0506d3ae4b1d1c6d7c7c62aad3884dffd6bb3cdd7f3c89c59ab30eba6e5be8f69f597adc534cb52e94259780f639f2ec79946f08b090d21523a78079f3863e70bc623bfebf8f5128414f88632ee8dc4d02f9409be90de2522571b13bb1431d9024cc1dfcd71077c34aa23c3cc4bd91883a91b57e72db40e569b8a9e6f1bb0bc09e3d29bee3f4af6779c8bbf400e19b07e905d99993217434b4257163fb159268f45d662c2b66827c94660d712a7c8230d7fcb1d4940807a9d160109b177a3aeeecd6dc2ff78c766a64273b9d8ab5cc6dcb1f4718bcb780ab86108e758d128abb4f4d93ad8e8e1599b1b04b5f68b503258f16a24b555667a19dddf4d8a4040a37e46d948f3995e77143ac489e0ba4aebfe988ca57a50f45f5dc7149aea57942ca75dbe6be40c9735be1c13744bca956a5a21dc822f508a10e0c7195ded898bbddc8429121eb5141bd55972238c3ec823e827ea3968c690354f588e050858afcd6a7489e9f8155d90065d710626896baf25053639ab45bf32f5e5c33ecf4768d1fd89514224cffc48dda290aaaf3cf8729d6431115b306fa071095959a6d85f71e23d2fb91927589cb7b3417f8abbe6f4bdaf7b3f1d2919f44d4dc0f4237dfc13d52a75bd39cdfb02112a13f34d98cfcc02517541559246b4e70d9a8cc9bab73e32bbb3dd2b266c1f965178a46c560b6f17f4af96990e9e58eac336820e112 -MD = d0eb914e0164d7b272e0b8bd16c18bb311fa528db3e31c84025f259641921649c222ba1be6a205439cc07bf44b8faa02c73caf3af31776cddef89e8e05c11a5f - -Len = 79432 -Msg = 78c5626c5f3fa6cfecba132e1896998c6e8927ea7742c20e754cd4835336c6e1ddf1d04f2d79104565b7da97a4a750af32b63219fe6ef7464b541c89a611bc661bd1610ca8e91a20f2bccdbc37dfcfb8847bb22828f35e2568c763d174b98e959a2ebbadbad6e9e7fa8f94a7ba873f2fcba1501ddb1b2035346d5361a77465f6c2cf86394a8aa822e5f9d66016e7c79c6ef1b302012c65fe180e9243258b6912fc7e6bb93f4b7d5a1ac23bed31479088d73083de816f54077a71c87fd846c170ae0111348362901503b26d58f5efc17b6d296aba432c16d8c35f9e1ba6ec9699422122b2fd170ade079111a9492683fb98a30e9d2fabd2f95ca0bb2179c70f131ea6433c95b1133a8e26d2e61436fe92c065178f2d33b1f3abfcc998381d5568ac581ed8337ad2b3003a5519406559c74d382e99250ddb4c1a3b6d89cb378f1f52ff5b91bfb870d0c6954549b4fcbd22a7e4fbc1ff82778f102451fb195de6c17a62a26c21b4151946ff487f5842512c37312511a3d8ae41f5801df60cd682d58b4a997342b6e717e94006c214813e6c63e75591f957a7ec301779838bec8ae3ed7febad08051151171f291ad0ffab6b94cd3248ea498b172bb10ba87fe5267407c93e225cebb9503966568f7406c1af33ac653e5cf4814b4d167e6fce0a800f43f03bdb27ae089ab5db372ae8dca7c2a64c957b38a2b20ffe0d78e061a3bd3c08bb89df4f9725b9f54774f214c9862c57756b08679945eba660a10220f80883bff3d036beee38355f71b5f0e1178673acef8eecd0216367add5a3ddf350876dce60bae95afb6b945d23a12a350cce210f81a82f5a84340c7c352379c3f562819ecaedff0d05e4605623e0aafaf287bde7f55edaef08df617947ccdf762dc24797f91180bd56cb20b23a1b78160fd8d09c115af376f78def0dd54316f641cf4821b5cf755434495dd830fa9a73aceae1969e4485d697653ca0a533262979b00ba5c5cfe5b9e8869e32cd241af710e5783c63c395f93190d29b814218f91c8e1989f2b8d8d4baa96b27d942ff8c85f01ef82a802dc60c3539642f18f34d7490f8370432568df1da4c1f1bfb521951335931b9235425727df765775ebf0cc7df3215c3e768ccd743ca825cf81a85bdd7b450d95313fea990960523bc84205ea24f8df67c1579b2096cb964e05fba1104b4bb52b87139fa959eabf9d94b708102d506679c667ccb57bb2afb5c2a9f95e1e3dbecfb76bfadb495c1c35e1be477274ee8dced61bd6a533e3ee914821c9197c8186fc42a760a1705ae47f2fd648a38419a1e171025d7257d5df5af6f194c4debdba2ba964759e375da4e3ef8d8005d3786f5c37b9a59f600f0e9d6f97e0f2cd58a4e86c11ae1436ead9fea142822c0b7132899a90539ee505d8b302933225c0d8f3bd0b3d8eb5d778f049d593d388649a98140a24fc034f40ea4660621cd041b50313f7567bf5918e843ffd0fd8ada75b0c6616e5e33f17469fb1f982e584d8837f87b0eb1a560d92025b980515fe2c490c0a3161cdd4c59d85a04e8430a5edbaa572d869de59a439f7273722101c6bdb237afa170056e29c287bcfd492c609c1318fde612c62eddcdf2d4ac56b6afe97cf32c1741f27e6f8f4bf0e026067a54d9019235fa91442f136c8538d6c7c5ce57bbc38079eda5b0a66e4897c4e0d58a64db957b3c8f06c2d7aa2e1e8b7c2ff6ac581ce5ff3e0b7671b86b2c090298c61c6dadc0c0059a1d827276645c1c16e9e193de4dbb2dd74857f102a6dfb3ec906981830d6e3e28c97d8d051430f1a12d6032b1c1950232afc0e0b40e2d3df971b3ddbe692e81d94c2fc38435f141f94c8ffd3f4875044332144e2a6bdbe6e6f0624a07dde815d430ffdb9bd0865545ced8be2dea437c3359bc030cc5d0f7dc96de900670844342fc579ff1ecd775ae39a23b26afe7b229ac1ec70125f6b702e98f77622aea534b399ed52f91cce85c17543dd0a049ee4eb4a362b19234708173dec7c413028d166e3b46fcc74df876ef588cd3c45278c9f8b39bc514726880bc3147d334b538cc2398ba019742eb244a15f0d824e897c300b73be5b398e9284af1c03894e99e94e11cf9e608930a90aff33187c6f4956455150bb8788f39a0a787fb9a3b8705972e2fca5223289ddfa65a1687b45fb8d37e37d0e76a3da0115b59bda23278b6fd9539f6edefe9ec3cb7b26981f60f493903835519918b68a3ecd1d1f880a2f9ed9ba2466074bf3ecd6b63f01c92ee8fbd6d6361f7f661d77de456fe432def168fcad37f53ba90ddba49d5740192e3d488433ebb29a0a837c8cb4f0b2b4246540ca9326c6dca460f2cda71bcd7fdd55ec10d7c2c569746ceab2726c15ac68efc8cc028d457abc71d4ba49d9247dcae779154847c26e425e54f8242e875c1b15636981e7eb965fd4f3e31c2bcf9365565209ec073438e2bc3dc630b48273c96aa33b87a333901ceec2e0949039413b270957697d8529d42b27953e9a8153d2540aba8a5bb8286243e42b2982fc17cade219617175fe1a51f84ed944d1eacf465fc5f108de3afce68ba3b6190827772e01d3e9b610ec0c40de847d848c4cf7e151a91a0a640a6bfc1c789d33556f0f1d17ec95cf72c77bf7ac43c7119fe4bfde5c80ab121499dc4d39eaed4de04049626a8bed226335705daab24054d2592e25c9722d8ab79056c3292130d16f432fe542d97a18abdef15c20fa6fb3ef534c9fe0a627d91596e2453644ed26cb1fc88fe9fec31a116c09db5542dc97bc7c2232e8452167f65487bca67badb4bc7d1c46a621518e5e84bdc392b310690379b7c72b76a39c22714d0ec2f0f7e30a0534f3c06aaadd5ad017fa1f75928f8af51447ef6236e060963c24d2c8531b7c5e177f80025870cdf81e6944afea731a963f987d30619b7a6b5de61e2e49c4db31cdd02e11e3ae7fa4daf8498aa17b7a0442a41d09ad353697b73ced486246ef255fd012bed1fe387b5490752d3e1174e825511615a1165dc3520f893e250980e3d4657332accabf25931711c0499cceeaee89b27bc5a6b796374538391b76561234799b95fb79dd4b9f77656d4b8451b1a7333764a14e0bb96dc84361caf3385b88f3d00e47735a958196b95acb30c5e65737eef7be7423d3fc7ef2ddbce9f066d7bb5bc5171ffeaa405e55af510af230077d1f5da382c58ded518cd679c144da29b984e3f3e79033e4b5809565799f38beec12bdd8deba8f47285b7387e1fd6086d592906332dad77685843490e596a6846e0e40e6f2c98012eaa5dd70b3e39ff7f7cff3f069a23ffdb5a7b359b69d2161ea5d0e5424bc095781b33bbc9dbd408307813521f2b112812d323a49557d515e49454eaade5ad11dd4cdb6f10955ea33edf17d7f36cff90bd56df3e628fedf82710f2971876a816ccb3a76995e71460e9167f4919dc39ca1959f04bb98e773d64b02c63086b5c04c4e44a23b04dafb1cdb2ac2df9057a24e5511954d0e02b460bf684e6f450337c6453162606358b265b4840ef17551b417fd0ccf26f0154b2ab687e8b62b1b8de1984ae08fe3b213f202bb0050b57a790675d6d9cda7e9df3c16a9bd8ea0c76ba630d74150ecb2c5caaf18c283b99a9a22a5b7dcca9c46199cc914f47e0ccd791bf320b02be61e71f5a1e37912e879be7375f900a636f3a154b510b60fd8f65e4aca6c53a939bfbe7cc2645086a9de8e02cee36ce8dcba1e6cc4e72bc76a0ac33b9d0552514d5d5566f8e36d656693b1d696bc4918f86139eadddf7a312bd14ff55531d6ac8ac0ddbb2da7f83a865ed0f7b7cdbebef1b199d8e742ccd28313ab80d839074059afff8348f91a8a7108936e175ef4632f72e63dcc564834db977ee410650c9820f363c73121fadf8e59a142a0b6138e1a6cca22736417de99267129e4fc0e394854b08fd067c2c04718a37b381f42c81a66eb8ec4b3605827882c583b4834ad3a9a8fe10d1297b6030f4022c9dfa998972af189a78d4c2beb855679ff8fa77b5d8da7c7d06ca3482b04213e3a3f7186f97e851c043803de4fe49792171a8e2b18f5a14801bb0efe25c0eed77387c21aa82b4f4dc3fdacf9b96f99ad6b311245d599246c884800605a0b4ef65cffc3dd0cf9f626cc246f0493ec01d1e31b5b52fb42d93c4d5ba0f732ace9a1ddef9d568daf23af07f5758844247a07672290daf2b867bf383c164a166d68e3de9e770e94177def5db8e60d34dfaa56df8cd96321c378fe32328be16c1473c147557a8b87f7adeeb4b4ea19cbe539c633a25f77f22bb1ff218627459d6ab145005cce57d0185ab4f632a73671fdd05f4bac4a9dccb7bcccef8111fd1237cb76f1fb9afad5422d4a097a48eb8ef1172a0ff2c25e1731416d826872913243685c037a06fa003ccdb7d7d4f3c08a87b52e68bbee403c5fe7e8c486718a645531001c203ce1b8d0e4034688d13ecd8853733c51f6cda10957479b22376f1237ce692536613664c4173740dd09ecbfbb980275fa038daff93992f183ebc8a3afe69f0704a0826ee11059ac1cc353c9ea2de2f9ff3d07cef634cfadf2b61e7f8621aba8d21f4c3def7774718e29f951dbb91bb2a8cbc367c7f008b7b7c0f70e842994f2e8061c39b6f38d79786068c157e5b6863cd549e0351644f71a30deb770a362cc8d7e7acafd2daeab2593287f2659ba5f058522a3084e8c55632e58e5133a1e1d0bafef588ecddeefdce8bff510bc2f244901d516083fe7b9d9e4effd3694cfcfa8c0024b2f7a262de487b789ddb61ebd5171eaa3fc925d0bc5782a689f597dc9add93c0ba9dc8c4d869998a554f18e1165fee9b1aeeef6336f12918e173230f362242400c49c1b380a46e8b03f12870accd05ba7e4fcbb191fdbadd765c7f1350ec642934762d8d4b8b5311264c4118fd00ec8ef6764b3a51dfa05ac53bfc777faea1e2afcd5cd0ad70ffa328bad3589b7e0b6f0ffcde6c0b0982273a7c2bba16fb6412fa99e01c3b17bcc7a7e75fadeca6faf1273df5d5022dd8a962a7ad49bb352320817657ce58c222e5104c5697751e33abd8d431f3eb9f0c77ba48c1a4d0ee7791f0ed14759b12ca81fe445883c9464e05913a13473befa618cdda395a0ca9d9fda568a690868c0c24de79c6115da18274ecea0a5d67822de2f9c654e7a2e9b2ba3b639ead9f9060541d572fceb6d2a9a0586e9794e3191c8ceab7a4cc5810aa5e1f786d3b3ab27f86476715fa493c0bee40324b8c52f6ea6d0d08b97670c1195fbe1182b80c74b241e913f942a95031d540cf86b22bce2019dd440384a17d9845b3c98fa2795990fd8f084a363bb1a3ebe6b0d994d1e15609d7e403654e98afa68d0ad48905d3a43f859e992394c2da988e60c4a2d9d2e4b389834996fcc4b7d8a65001ea3675648e895156b939266e71c469d86ac83564ad6e8c36a8206449729c2388348fa14a40e6cb23658d3eb7fe0526756b116b4e6df3896b074e09ecfadb0fe8067609ce1d4a565f97258e4f93ed413c125a071a6bb4e54732fa281ad7ff7fa1ce8df1786a10ad8bec8697ade9d9248d0ee67b413d2f2a6bb9a9414ba055fd35fb3c0ad1cdc61b38c424dd4b46456af8af5b4a6b38cee34919dfe807da8b03251b04b852aef739d6cc84e1c06fde6f0f722ce6e115209a5fc2027ec7fd0b1befbc8c7c83841083f6442b27759cf0ab21f5eff36b28a0aa2050b588146e62b2064e17e9dcf3ae8417f98c20f37428c9d0b8f8d23209ebad2b346d9675c50e6ff94e4b62d7642da4ac2b3c60c27be335ac29ec15fe2f4e1de0ebaf2c54978aa0494bab89fb5c1a70237790696b2abc6914c74e31280f6476d1e4debc393c43fd76b49cc1c141f1713e5d3c9d35e710ee9b2f73b63820ab328ece80b8bc49e6c1f217b39cc1cc4f222d4a959eeb678d30bfb11107b719aeeb67f749b42636dfa84bf3749d6541900da0de4fc0d3f29dc9f2fa9ac82d50dc1c1dfd7e313f999b2b04c644263448409e0976afb5983eaf34c57a7559f34cbf1ee15fb2b240d8a5948d0ec6d9a756ed4df7a259ef90924deba79f254fa183c49e728c6bb9d27a7baf754b612a46e402a7dbffc2c1559406692a074f1bc08c890542022daa7d05a9c63deaa79a8b760d3626dd6efd7fca4537cd114730d8dd78ddc06f6d26a8e0bc63479b0e9cfd93897378c9d2d6579ba6d1f16ba24142ed10928e12ae90dec2001132ab0ac415b2e3ea425382fe758e97c24764e4afa731ecce0b9a568b86f0215a8fb920825c5ac8f503e8f3d8622984732fab92ee6e4269eab96519795a119ca9af33e46a3a01953e4e28a9e695e3197f2a8e118010a5147318115bdc909cde8911a9dade573dd520716119cba941b340c8aaf4f736c088e1b81d9237f2f87363779958710c6605462e40c7d9e4cbee627a80b1d6392b13d119f8512dd9cad7d31170f1a4f2209219d53638a3f0f8275eb08dec8f905b61abae202d00bd7a9852afdf4b0c80d42805f6bfe0bc564cfa802b40e995f4c7deebf5236a53268e116c8312a8fa311733b5035c54858d40d4811b485d8baef7080c7f70adb7ad8bff8b3bd9bff09b6021819b8a1881ee6a41dc30e29cd3577f59a7bda66b90aaea9f294a82d4a228358e062fd78154222fcefbdcce4c0f56b7602830233860b7209ce13fbcab71500dd5ad20a3435ea107d86aaf69df825535a818677578ba4ad4652d7bd598d0bb5f95012e9bb313f3990aa30923cbeebb809df2d42bc10fee6c84789f6c2152b2b1588caa2f75168249b22f7aaa85a6f20ebe41f6a485c40a5f774d0afed979ee997cca13bcedc8d5908b7a845cb14da16685804f7e5b993723ba355efc25a8b77e9e23fbe2a1cd8613d31eb6c8c33541fe80286f27a6d1fd6fc9ac0be29a81b5e71924d32f2576fc3a4586726d30104c5d3ab4b62efc10b58a222b8240ac7752599a673a00ed67a07a3f3c57b88c4138f911bfb4f2cfd80819503e52a4d00c354c8e4580f65e122b6a4ccac7394c5a9058a1a3fc11869a5d73d05f0d7da9b2a746516a587e1bf8e570ea9c517dd4cecb02670bfc19d4da3e403f0813499e0d40cda02011169bae8724953b86e4ca10717cee42256a2f0a1304d8b3f477217e9a48e7115b3e618558fbd922c80c90b20c3e8401089109bc841849fd31a4e8790c4e92a89773e22ff37d22dca563dd3603ade4a3361cd9640a111f4e4b51379f2f553f704655a200ef1f0ee39f78e42ee0616cb30e6c22930d85a521b1eab3537be349e2e84225aaa467f9b216ba69ef3aefa8ab220d79cc06cc981205ffc0386a8f4e8b0dc7e17f9bde7fd2cbb6b2f96bbf0515f18f5361ae7c5489a80f02b073afb9d327557a126de90dc00eec73f00b462e6dfd5024063d1b57132876ef4e4fcb2855b58933e5731e200450ca1145821b712db5fe702c6b003c28f7e5da842767f67d48c1c37b53f4630a41ee0f7c78b579dfbbf8dc4690e16045a6ca78d4c31cb0d4419d8d4678f2236c42b6e307579aa4fe6fcdbce747256fe3a5a33eb27b4ff3d5408b15c95a9dfd84f3b3207897318f0451eb86710652b7ad84fe90cfe8781c0ac608e196916e6dfea5714c42b010947bf2e0ed9656efd3edb53b137f733bb5ef3295651095d9e123f85fcae85ace51dfd32c46a9a153414ec6e73b33a3f13ded26bf34d9d066e3bf6cfd20ebcfb143aa635c263d7e238c2b3a917c9f033f30af02f4c554e9ac020b73d7e2cfb77fe66633cf00c465e7210d70b85c14198c2a8f67c49b043a0fb8b29d6e95068a60b69dc5136ac0c1048c8019da6e354f4e8818b5bd2a8a6a08642f4a2f9c22b12a40ab87b7c8c548023b0d866607652d2cd5d58d3cf839c22cb0dc1a997c96d432f12a0c3aaf544376c92056e9cc462b7d90404ec288a4faf31b638f4acaf56c0164a3b2fa82d04bc89342fbd4313ad2d743d38aec605e7ce2003008a1eba0d11bf7732ca5e7cbd97e45eff5c3bac5bbb06d19c228f3c8b0800bec273d733bbbe94642c99b42c9751e3da1c526ed793eaf789d74f6c7664e43aad25b8bd62874ffbd8d2a69384b971f06f30a7c2dc7d40af2b923e45fd9aea3499d260ba8e9a4d5e9accf8e1cb4c7f72e4e06321024247967f74f5031754a257497073b5001b402473c197884a7704d102d68f72920a87144f267e8c0dba950b87a8fa950133aeb52b598c6e4963877491ba339dd4fc8792614fe1ca27f64ab91922fb44d70a21798a3dde7d0f3790c5593355891041cf767e9824a4ac2d49c7c88581a9cac720d85815959be61ca72b21eaff208e00e72a6ea95101e68a1b9f5c7991ac2493343a5c88bab2143a550eb387384995625814f9296fcb1b3247a79da835352b95e3075f3f53a9e2b821d6d5b109ec6f8fa89ee7c187e99450554953b7742c29f6b8a729e26b6898bf94ec501078f262ae622fff18a043990aceec4551577964dd3882821807d77e7634b6eb4d9041b7e80b2e0ad7c2c1718839f73c1ce4052573ed00328931dedc068c9d701056c2b6642d05d1a5f54b66f31ed400c025b6b3df5e8a00def065f996210aa500d45da64b4f1b192b42c9be7305ea59e62275584a1386b5bf4d541e4f7d6354c611fbd1c4fad8ad10b023c22f77a10f36e22b5adc955e19d34e9393592711430a15827df8b5a454fd4841ba50fb61e9576dbe02bc6b78f4c3fe0aa0dba77d3b73e9dcf30e08e7d59a110beefd1a92b0f2cb1898131d3e0e3662a28dfd860e03a994ef7b2f7b09f98e136aa55f5b9c2cae051f640834162fd58441a1e94b2b65551ea55c83977288825644299e46e8253421bdadc4376a1e486bd025c47e3e271f90e4e031e38b4a1de383c0e163dc632b2ad9bd6faea1a4361f3861b9a7ae12aef1964d62e8ba0608c10db3503be1ad3c255ada3021238948a95f9ded4fe3eeab49a2ec3d2c6886eaf8cc4a155560cd0f1c2a4d2f19589525102f218bfd4583bda0f005eb39fe906c91a6cc5539bf894b16305e951ea88f755c8f34b93a3c988dff68e09397e2ed369385833b7068aa981c54548ab67b41e29566209f8d30f7c26df2c45ecc7e65ef0650b5ec81c1f8a0357e79356b397112c49e2b677e896605f376fb746239bf3ff2efab93f4343a08699613bfc44ae8adf11e9e3695afaefe98dccbfce17ac5d06049ad5652273a7bc0846b4f49166e5c22cec1375b0a9754640c7d1ecfab3d475748025d2204be9f4330c90e8306cbc76196db8f5702e8b05fee5804b633f04fe0d3f4d1ec328f1cf9837424f980c695b55e366912006bb9926ba6d31d7aa68e02d2c9da3919759beb63b6b833ed286e270e18eb126ae6180469adb68de826acc52eca9f8f2137c41fb9d5f2bab6b9fcbd8eca3de1aa2274bdd1b7d38de53a5231cd3f4979b29f3e9f6e1afb154141e481c694880726e776c68c0a52a5d9a8284f9870ff7c3473b27368cdfbccf888d17b9fbdf40a48fcc62681ee5c5d2c39d52677a4ea220f7cc7a191361968425569b2ff8fa874772b0be597ad193e46b502be532532f2ab822633d09d7e708672542ed050cdcc1a3aed0cb88eb0cf8fe456201239fe74714d76300c49526c2ea53bf7f8498a9b9bf216a2cbd84998708e7a539e297631c7a460a12f83bce5a1b7c61661c20868611b2bafb7d40e224f7a155fdd3dc4b016508c8d2093e46247709c92f1026ebbd47dd73c66ca25f49571d04db9bc0d79c71aa1fcc7c1f36b889766739253e51c5cdfc04fbf01b697ab3b532419f07c1540c748f70c551188ccf6cbc12bfb9514610b8ef3aac3ea91f7a045ece41f360beb222884d79665427b537485a343a52a4bc7ea2d0f56e86ce3684eae049266e32ff2eaae10cd1820fd7708c7e4733ee782dc7c07d603d9afd65a17716091322673fe357a9f4251abba2a308dd5d387d26e12eb88e812e5e3383f483de063c25b210fb2f26c3d39691b3394e15eaba9737830dfb82bcb338f70df891a6c523f0aa0ed081d6006f8e4865cdbca6742cb52060002a08876ec3be8028011eca4d1bc5860e00361e4b5a4646bae51d8e116f88248f947e75a37700770d82948a29ff7b130e2ad5821992f1e29b47c99d0b2ec52d16fb631c03db435f0376b6894d2461324b5222e03cb0f1a5e96559357c6b6e0630af34cf02692da4c46dd35c2912ee606026ac9d373ccc2d2fbe4acbe7adf92c672082232198f5e4aac8995730539929c708e13d8bbec7d4c8c30cd4cf7eed2c150fc9ace3e352ab3117771f156ee7fafa895f35cc9f9b296f141df4a656b071d4cd89b0bbe0ba44e1faeb282abd51506518750a5c57bcb76d11fc800ecde98a20da30f33c19935e57c363e6f2c77bd6b146d14fcd8f82fb5d4d372b6b2d0ef183c65dd8c6e68453ed017ff00035bdda4994e26a92afa461ba364c3b4e2c973478027ed5feeff3d23c459dc7c550adf7a87326ef4e208786fe6daa541a24f8cf782f027f369e6835aff05bc2d4d0a29b58721d42528ab2d7b443dffa71aeca2efeac8739206a681ab2a23895910e5251d402440832669cd056696b82c74271df85fb7b982edc69ee0edb92a49c92239795b429a5701cdc0d6f4ecba19d58866da89c6e10c47ce41bfefd187459e4acf937f84cae9e45c6eb69548ecb66798e35d11fcd3783c47d412d9728894b7e44e3155f0b881f5a0406cf1b1364a52defd489f62770ef3b8be9f52a515803d781e1c84914d675c209cc2b12f801fbee31c65dafeb51695a9672f0371164f588fa71cb56c6fe24264eb7e7dcab27bd22da97a6bda76d749a2378994de734a2fb050f9908b073ccff59669fc8bb5a7b6460a50f9fea09a382c9677acf414b9eb63837abcf5febb2a5a034bd7796feb93b6a9af2d701da789ceecbff3bce1e4b330a868e2b23aa87c1b9cecb69dc98e9103ed5faf3ad3466511a12a133dc312b0a0258ba9cba54becc1c8133ffdabdad7b73d272664acbff47c1d80b17fa08d0a3a63abba4726eba3d3ee8a1da3fe158e5903d03bf48f595d97c889788b629be886ca90bc2ea4d1c8d97817f697a888dd72a62395f4635dc9ea0b0c0d68ef85720dc30158880946845bcd8373df937bed898ee5dd6b12135ffe4cd31b1e3193d256b4c8365e3c90ffe255953b85a535e52623e1ba6283c3485af4a448b60e0c2dea06abfdb725f760f57817f791c800eed2ccded5e09eb5ab866c483c37703aae4f2273569cacc5d01d9ecf4e09e3223013f4a3d5ed4b31b10b1b87a0a93e637a0f6ee8e814b94076e12f87e9f7dee4d27400f96391727e827068281c1560d0bcb254d15c2734b27bc993056f62a18efd7a59a827d5fbe5453dbdf55782bdc99abe3bf759dd0561065d321289531368d8af6778c8c0ceae23fb81b4faf83f953cbd8b23883f149640267575dfd11eba8c9a9231ef5bd42143311b2eac7fcd7ecb36ab1b9054499850abc2f818e4a9cb40c3439a43adf385ce67f52b16204fca6fb205a71b258db15f748261dc949de41db3e07c6dbe1424eb257673e0e2aec24fb80091ceb8c627950a1e79d5eae04d4bf1d39f14962044c3f406cdb1ced0ae94d004a05317de4319f4fc08a9ed5b4ef10582cbe13efd2e7d5b0d0231ea9ed66582799b524abb4d14ba86d600a6f62f377857c87bbd952a42e3f3db09400081eb57c84b7257478dade523aa831b9a3746d1b85d8c1bce7f3a12211de1d8dff94ed657785c48684a0dfc3a4dd9562daf46980f54b96092778c73fd9360b82184b5888fe9b82508ce5b873588ab5f98df5f56c373ac95c858618bf0042feab06b48f3d8682df40e5fc00f7b21a13cc40fb7913c830dc2586be0e46337f67672f631a19bbb63bf6246641b74e062f7988779d4e24b83ed29f83205bcf55c62516c951a3eab038deccb6e33888f9798fb8ecba41d95b72025477e76650609b834179fe42b00b567943507df1ff4e725d76ed58b55275162339fedc0c432a680023d7489c882205442ce56a8a1d9fba8136dc010f2caf8bc3b4aa76a4341dbc0a5273f917ff9ed5cdedc841576047a2897d4b4bc5c465434268ed3fc48fa4f82041d2682b72cc38750a8b8af063d0dae4bebd815fb630ed5dab499fe3d26abcd076651e6d7e44bde807a1bfcba4e5c4117f955a538e9cea4400322f9898d96aa964ce94449e92d68569ad586f8fe0ee9e34853f4799f3bab40c5967594f7b91f991516257403102dbb4f0dd52914ccae971ef988274efef1c3401df8c62cbb37f80aff10c0fa9c3695e2eb6fb6593d991bc46febabbebf7eafbedd0c87f346f79b73cd8d95957a8ace9b98de05950ab15782dea56bb7255bee8501383f16ff696b98a7245b9d52314cc23caa808fdaff339f6e3cd101d88f66ddaf05565b90944ec0b65e7adbcb34f99ffe598e1156899865463a4463812201100ff9348ba1802d3522c25a148e9abb7a077596e126596c1a8f272ba7c81da5654b9e416ed936f13d12d96413436b7c9a7f8602c8f17799077089f09354873c23887ce6cbe1bd8021ae29fe9f91b023488d12398e5fe9057412eafaf0ce68ad93f119896b601dc429203c917f207098cc59a3a3fb19b99aa89cd1b185ddc8e0fdabff9417ff5fa49c8d9a867c99b3c36e0cc0a8d7c7ef3eed37c77d1c2ab0bda9e1b66d95668a07c420c9435ea4818c76cef2b0e91191db890b53c67b5c272cdeb9c47ead3ca6d7e7fe5332ede8e3db2bc6bf23fa9da958c53ffdf46b1c3615e55bb32d292abcfb4e52c0baf00ee098d61db269d2163e9de9fc4d6fb412e46006f00be4d0d7d25b4142964231bd81abbffa50ea392259923d69cca01ee539f589a0520a69ecf3df07f65f34769ecdfc2e86230ff769011f09af01ed713e3dbcb6921206bd10246fea97a2f78859cc736be9b23ed3943e2c94f574bf74c4f99ed5efd24294ec6ff3304de8f32f9586f9bd4a85e0974b18a12764ae7ff02074812dde1b25b527db53223fb89032fa04746ed1255e093598660a243693aef9b64f07887417ea6a707708969a365b314dcec4a8191ef2fbc563855c946573f8c8eeab156580f95d37472a79164d70e269ed08f4e98a1945a881e034515b0ac5b14861ac76c9aba737accf11b53d3ab561bb81e01e0948ba47a662d5f4df3a07794371753058c8f1798c4186fe6e81503c1e79913f024502acbb54670558ca6629c922991a9618e203d1c6ff7a490d5e02003632d4dfd9c6dfa9fe110d2e838cc8c1be40bdeb6223df61a7a4af34a585bb4801e96507ccaee656a8fc93c82d1e5e128b919fc0705b15262c9e2798136d70de22de7be2e661cbac9a501f9090c7f4a6d2b54a7b0833ab069c156ade1dbf29aae13b9dd8ef8896921b3439ed732d9064dad44686f353abeb4130fe6c8c23ec9386255451aeca4def75d06a479ff83d34ed141947f9621cbc61186dac2740c38458c627b5ecd0faadee4d3907ddd100fe51a04d28e109076145f53f04b8bfb562a0469e6c7141a4b3cfd32f93f360e3aa4f9e6a8f75ef73c135eefade0547ca16a7cd41de05c654e96089d254a94ced212f37f6e67bbd68c6782b28a1d8810b88b282997470071137e898adb2c93d264939927b94bc1aef5758d550b5f7157fa00c8d2d9479abe385b128451619dd970bb5d8800100af0e5c1b14fb822aaa2f47fc1785a7ea5bd2bb016024e663d14750ea308e950f23cfbe0a0fb0703be82163c9482a1689bee7c12168d18c6dc43efe21c32cb8b01f3a636deff7e7f0795fddbc47a3481f7d297f5969d46e005c85fea2b8e2d2ad4b56348cdb584f1302f19e1d3d78a4733fa1def08bb6f6e3412339b538384bcc4e2b19aefc5c106a2edd8d345132944fad55c430f5fe8ae01c2096a26bb78bd6d1c1fb1d7a8a92bea22d9148ac587e796e4f1a5fd03494bd9585fcb078e6fa927b21c01f7c6b3dd609e994a27572ccba2b97c9c643e07b4353595528884d01caf55252fd2a857a7c09177d8bd509e5da8c33b8ad778ba73affa48852c2750644e65c97ffad63af764ac13449f4a431 -MD = 5c59f5748218446099dac3a2beebb570848a6ba3190f7c5ab97af95dbf50ba080a53d382aa213e9e6d8a27c249ff61cb424900a0043696d7477ce2bbfdd2605b - -Len = 80224 -Msg = 6e6a88abbb52a709b47365ad6aa8016fa9a03a9bd8345aea21f773b1d20fe9590344300f7a57d7bccb95c638c3abc4bb07bc3c94f9b1401ddbd1ceee379152517ead6df6ef77f5e8ba6f3dc06615961970fb1543351e973c117603dbc9cccf4f26ccc6c8e35b0874ca2b52ad198c7f712a854f125323682e0c119ae24f69673b45cac3ed1eab184840ee8d67a5b888ab7e8171681d67badd11c81c6a930f23fd21ceecce680e2e4c67e37756d243b8afb41704ac599395306bc310da5b67097d0201cad1892c5068862f97e367d2186514718f48d04e010f602bfe9c701924a4328be45f48ae8984e4fd75742e10aeb5e6b49aa34a4107623a286e179acc7958f893c2e16e3cde88ca739a73eda28488710bae258f14ae113fe1e9b3a02812829b41edbdc37d595c80b98d466d33a2c4fe9c5236666eff05b87ff6d84cd7f60b64beec5d0f1a01e84ef8d65776690e53d58f0e3e98f70024ec291eee647e2dd99b3247271abade157c58fe0cd0ecd21b3e0d6aa5ee58bb572508e85db1c8c0d688c58785ac06f9c951008ccf4265f606813eefd32d393887a944dc8efb5ab6e8729d33de8ca659ed16190807957c80fbe549243120417e9ac20482e70adf17f9a3e5d3998341066a14cafb1b91d87ae1b35691258e19957ab57063d1a5fdebf061c3f020597f0926903cec75fe22eba2348fbf183e69850dcdb206b5965c3bb5f55f11dad60a690bd596637ca401dc25ad1a3573f9d8563d51eff3f9a3a50e30a7e2be2fc1872e002a01e8984b1e5452691f7b9c870e11f08852b30795806d49be747f87e4a161ecd6a50431ba205b11afc71afdb0b4be10bb00cd4533945fe8843cdd4a05fe09b922a93eafbab0f94ac63999fc3c7263843324c91d478aecf53f635fe0ed462e4e56361f7b137637e5f79e8003f2ef0a3435e430f697091c5838108eb26422d893ba732efb8d191cca8a1e58799bd4ba080c688937edbaf8f9b76cf026323a10709589f398ef42b1e2c7e0a8c6ffc87ce8ffd95c4a0f4587c0039f0fa51e35ddcd319ff6ba0398fd13f50df851e67457bc555f3296c551d29666d07398f1bb4892d4dec0ca8fc408465eccd184187f536c57219183d986df612628a265737658a7c76ed82e5c6dda644846b9c65c9278e04d480479118eb80b8cce26766c0b15f45276c650323c7c53fca33a807c55cf017ffb10e0370e657ae0ea8731a4258762bc1e1397d9d9f5fdc20adc183e6f5fb534633f2011b1ec986aa64b00e36ab7d74f90466a18eb4d48e1a326f76b8930e5b5a818a1681c574b7128fc4af082ac3c51f1e733b81a8c1ea397a085cb4a4b7a4bf123cc03faae7d3f98217694166e7a0b6c7e598210bb664e0ed22a255bb75a3c66e907acf1f7151a1f43ee97ce0677c52694443b72e2082b2f454f42637c6fd031f1bb29a93cfb4be5e919c1517b1dc74ab05baeeb07eb8223805aeb0ba39f5177c35143cc84171a119b5fd948d55358fe5b08a22134f99b120bb5e6fb33d40563e82fc2ffd851cecbe228a95a1d00c16a1cb3debc7019bd236fc6fbda34f5361ae7bf6eec3f91b13d44dcf7305a0e4bb87bc22b65c433327e33f7f451afea2ac748680f3bc1bf098c4be38c7194643b0d009e51c43630404cdfaf9807aa9b299094916c9466c31fe37fa630c6d3eadc9434af1880d1f630b5fc55aea530f07d9d52a44e9d37853b68678baad7208875729e5d48419a6e4ae01153ffd246d16d170a087d013beda5438bfbc44b82264dd2c711a8b19b80d5f6a6105337f62640264525c1667ae4a49d735f44cb02acadda35310176db151b1e43f4717b47d73ff18963e275fd50819ea81df3fea702ddb272271b38621362817167234742ccb2a1612aa7d5cb1b856db19f998d791125830659bea03964f346b7d12f43edede15d52e2d92eec2bf533164bfe1f80bfcd757731b25567ee16969e9a5e165223134ee6f3402a696a1c17608be95dc5f51caf4f15be00f49b1299ad2a78697954919ca4c5a46f49be414216c624ee4f9c5b5a156fac49e95131766cea45e36869a46e14c0cda59411abdbc063757c269ad39d52a642d74dfab95663408d2d294b92ecbf4d8375534aa30be6cca5ac53d9c9a18d224953287df3601b9517eec4e0a3402cd28d878d5171fa11687c28dd3f888d4e4b886482c227bd1b52accf3f12218fe3b9b4824a0e5dcfc89fc198ccb6578a1e89c9b364b19d94ebdd1478a4c852046d68c00e9269afb394d93ea329257dc08344d2e8d5329c0e14a01790fbea80c4514979d46e4aaecdfc7eb9f2fb73435607e46caade2d6d531d017cc04a5ff1fa17c2a67ce599a34688f6fb2d4a8af17532d15fa1868a598a8e6a0daf9b11edcc483d11ae003ed645c0aaccfb1e51cf448b737376d531a6dcf0429005f5e7be626b218011c6218ff32d00f30480b024ec9a3370d1d30a9c70c9f1ce6c61c9abe508d6bc4d3f2a167756613af1778f3a94e7771d5989fe856fa4df8f8ae59ffb7da8c48d0b7342b2fac336676a0cd65765fba843b7fef3a70006749b078c51f751d253baf36b4fada4fde54316466dc4875d2faa933ad24c4c7918b98c5bc8e78a0eeb0dac2e3a4d9c8bd8969e2d3dc92195721a934684ba7a8433b3c15cea134fe4f44cdfc4ecdb0bf57528a9c92cad5b2cdb5b6229f039b3b02d4f4d96a0c2c9ddd64033364c9e18c426c0e02323ba5ea9d134a6ebfd131f836e56d911d33d2080f9b1518b41e0ec7f5228eb420b365294bb6f0895958ee5875e8f0cd669cd7b55c567e0cbb5e7aeae6026712eca6a5f7603d22f2e9ff42e4465c48fec4cb802e5a32989fe8ffd87daba831af04a9eabd51026c4be028b2141ecbb095b6246dfb7f9c0f42db7689f8ac706908f711a613c4a326e4ea89ce706593d232c95c1375430f5c86014701d46ef7978132925a73019c0d6e4786ea71b16128566cb6f3542b18ead9d905f2a969aa27d855908a53be596a38b5a4b8a098902d611ee9afe0be3534dee127bed03304b45ece90c85e4167d7e483679b8571cd5be36e588bd362d0e4d5a830e8f14193a7850c0766cb3143d0f25f441588d3652e7db9881984cf98558e9c95e3752be38bfb9c8918431489efd297deb92333e43f60befcfb7d4ae8114a4cdb40e43850cc230e8a4f5e51868f15cb7bf90d29e6e96cbd2b94356b3ca299277573c71d78028bc08f6e758ed6292c78b0577f1bd9b6d252986645b722840bcb091e8641d5a996610d0811030568971e104721903942320dc7f416a526301285ea83aa2bd63bf35e97aeb97470a7d63a205a6d1d82061c4d3ec030bbb4213e06ae55bb521633f31793c4e759c4617a3b4503ea1a406cf1af715d1c6158f1fecbd907325af22c462a95ed23095d4ff3b012d6011cf0f14292e41d424c910cc523ef1a978d167f4d162279e529c7bdc3270e435aac103d8fa61b934ac3d8ec31cd44f2638eefb77858ae1db6318025691e8bce4f3e3aac59379c618e7dad0ab5269f412ec6da7f6860ad2b0e97132165f53fe95759bcb81fe5caea85b08a02dfae426941db83119ddcb42466e0ed3c4a498f372b65230b443f4b90e9230c4f11e2c2ed45236618791b47bc47959ad08699fe0a040719f076827316f14b8059ec52b54fb134f01e9aaacc45393b98788b550104a9b5ee12177df5cf6670a2bdcf8c8df31e96bd7e6319d641b42962aef9093ca964d83beac770384c8158cfe55beeb199d5af2ad272d6ea44311595fe3025055ace047fd4d717bef10a6a846ae1f7c4868f04c4953a607ccf48568ec0c146ffab5dc1168ae6c2fe5f4a0c5ca922364b5b933e27313a4502455282c9914cdd801d9c74bc5777007b09c8d4a53a7d389a8b9aa1af50f3031f38f810d30a03673b23f2b5cdd5086eb9731f4a1a99536d46890dd5d96ee519283c91874775b552954108fac78dfb4c3e1db5e319405542d3f6554141d59105b1a2c76c738ea34e031737ca35ecf0477d7c15262dc9f367d736098a553f7737401e0226f39f8db818f9179a956c67eefc10c589c480ae3aa4dab307a007185c5800ca4d5432b50f5b7920e26296c2913e7e3f847a1ef639e156ba4f9ec6e4b36ded885601d2b9d22f19dc3829f6b0dcc906fbbcbaff5bf3f13cb7d8cde97cfb0656d4c7791a1caf285da21258068320005d828913ac5fe778ff1429a9f9418195bf381846535dd4cba72af77940ea1988f45c8ff0a06282dd0057b8bf80c2e5b0991adee628ee017d98df5e1a302617d74de217ee66146491f30b0c6aea71a5cb770571d5055da3d2a527cc974ef7a95fccdbd77987e5fb2c4996ab58c0ee306adb80779f731d4a5f5eacb98d07bf5ca71372450e6047b52076a30bf59e9913f3290456a1ecbd537827d6bb77f4ed9031947dc73999ca2102fc88b4cdcdf2df18f209a588fcae5db1832e28c49112e283e226f4679edddd486dd02c4de99bd030d918dab10d70c790131ba81f66cfc2026f365334da0338652d11d9027bf4c5df20ba7cb6a9a53f983a37afd4d064cd519e044a0df5cad0fdccc64167ff8dfe786b56e2065bac143e7b0ab681788252e611196f7f5ca52556cf560bfaeec808913b86c13c8e05f40757fd4291c99901345afe29f58912a414a7498f37b44362bdf3c290a5db334d674397daa24e2946c0ce2b100d05a3dbbbd72941bb0a80ab533682c6eeadc48ee2e052f52f70b3921ffd18a8224cd94ac0e17dd9d13bf020f5764fda83802a371e90c70895cbb871b66a5f58d1e9136fa868afae36d3229219359241e0fce4e45ee75cbb71d9a874089857a89844f2b8f6bf4735385a884d42f6f293a36e850548569c54400514079af9aa2de1fae7c51057cd15725ca1d0e72cd956377f7b184f510e899ce88baaf210cf4f4b757302a9e4b9b561340fbb8a69cf00098a379bf8891bb1c4ee6fec82802f93414f14f017c8859b818b126bb1103c07b6296b1ec8415c6364a1413ae0aa43704fd25e2bde85c94e4fcc6a7fdfb2b8f3b9d7561f332c3924f88ba01470f1b38cd3b9bef482aefd24487268568ae3be4a811eb8fbcdac4a6d0d27fd17d818f84f897fa81898a689e3f8179c8e3715c482a859e452ec43f8a1fee0b8a36a627a1ebd6eb9d6850ef7d3db16979558bb64229c3368a33375dc7a6a407345cc80c1910c3154dcdc3aef9a6e09c9ea845705a0d915c67b27d46e4ccbe1bd8d62d6674ce252198a02cca99e3d6ba42c3e7b3183eb8b8e294dc2169f802ee7d8c1d5c388cc3b687c9d36ee55a5b6c6a8eb9a6052500f106bf9d16df943a292b66e216efb4667d203100c06674375a20f10272a82830afd81c074fcd072c73ea4cc3bd20add61d6dbefbe8a399312b6bd40c3e89b0129c629364f1bbb9a175c326077954dfdb3f76590b0f25321387541f1d3331266c5eab0dfa27311260d7bddcf77112b23d8b42eb7a5d72a5a318e1ba7e7927f0079dbb701317b87a3340e156dbcee28ec3a8d95a8ef9145caa831c8d7737f378ab029ba6f5e9d759e058367dfbb74cdb373f4390900c93bdef730d814f951e241f345295e8c6171730c8c4379e55d9015ff78873c7bd75323c8ebb7c50bc2f5e2ddce82736d6ff1ceb38936d0dd010680379b1ed7d354422577c2e67c0d4ae8d9ba26642254017d0d94fac08914f7a78ed6dc6e5f89b87f509e66e2be8042418322dd3d0ff2de79cc1b616ee70fa9d9ae479cd428218c7121a7484ae10751869ba2637b80ac4f8e66d15d909f2fa0334af48d0ee61d48be352cd77da804f12e7fb349ae28f2ed117a313fe3f617734b01780d6d0ddf65bcf799a4f967fb99afabd000536d592fa982c588b7a0398b774e4cae8d040a7bf3e568214c956db390ac7327f9c2619fcd0d08d8ba1228613eadecd0dd6d00e4098b22ecf5d4ede767fe27111fcc8ea5e26565a039c0469d378cc324dcad754654655458839adeadac2d665c23e042fa8048866fd53f1687c8878a0b0949ba0b7ae07704545bb26ec396bb79a4a220d63d12c5a80ae33ab9881a8c03f1d651bbd3990571069c2bb344d680fa1086aae16f40bdd9595115baecb253a014b7cecff4fb7a1f08d08d13a669714e061243a49d7ed9843f0d2a047ceb7b5ff072a3d055945f7ee99d68e87edbe6f5e3b97d884e19a3292a7bfa1eaf125d93f3ab53358bd03001075741da248a6c823800cb1507ad9548aa220871f9f394fcbca66f87fe5b665600a2aa413e117c53816cbed340a73a634c93d796f3db9bfaba185b4023729cde63e404c631fd911a4e71cb3b9f931cf97055da060346ed0e5a55a8e6a1d23e1a9fafd3c1969b3526fd9472b65b0d978bb3cc9247cec202b83c02caf3dfe6b49b127ab9dbd296e31a2d6937fc3953348a957ca2c4bcd97788cd9453f0642caac06ab9096d7c6d25544c54ad4581109e8683fa6e054409a5e09d7eb654a5008b2b170f450f0a8a7675d8db255ae8d21ff00daa5691fabf38501a467499392ed04b95c21f28f37b50ef61813274c6f44367a1211ef347768967c270114686f404a26595ea53ddbc4f3154db775ba203a35ddce30991c0dc239834800ee524fcb2b004ef29181fc9bbdc514e5658109cba331f64c905ed3c8151cefaefed89a5450502226dde30203150b55e41f2891bf297f71abfc823344d35204516d82b9a4611ebf42b2eb55c4a3f1f8fdcc371fdd6ece2995041094fc1a2a6f3262d8128305700c8e37225da60e7ee67894361dee1b260554d0915eba93ae189906630eb9e450f151950f8271ffba059d9eaef2bad78fed2f898df844e6e5e8cd81aa150da7c556d5f33b2dec1dae3eb3132706094b12c96d578acc62bad7c518fa359048f6d723607a2cc4e011617a041a27c1a31eb68157611241deb78d98c0998de532788f403b516cb11582db9fd6dc388b50f984fe35d0acbf7f860e4a0e88397e93d6f496aea2835a531925967281e1ccd78482264fcbe1ae0ccf62c14aecc1c133b80f0b0092f729627e46482030abec0166bae2ec7b37774e3992e7bcf0ae18dac4e6887b4b52840958469c28111c539648341b550838800d6da5a3acb987ea4fa584f665f51bd5114f2e79d14dbe695ed1f7b7d3996c321013a3dc6172d49f5b01ee3b07b7db83430c05c9640c199720aa0ba0ac565af521d2957c24411e9fc6812e41a9ba19f66537d3732975b343a67a78bc28688a320652826a3d4eeb5158cc4aee93265d963f78a15f68b116d7b6ea46f591f7844f883c728ef4c2c61fd88b4d2c0c2230cb9b75767569e7cab919a27e312d2ad1b66f386dd090c5347010653ce25dd618fd3fd95a9d734055539749285a462af8cd83ed7c185b7ebfadc60321f8cf6b9f94f44a55bfd0e4410bf7874a57221f81fe8c04a64e9b16ee3cc30c0355a8094df8827070c3c6fa164b0306ee100930f5b05124f45a99b54986cf29ebe330d7a991b1f5b2919eab5a7a816b1b6d4585da4a9bf66c249d8159f3b102e089b1fe3bc8497e2411a01e97ff3a61da561d47bb3632221995efa5a5ec333eea2f71a68b0311b6cc2c137c5444f68e32b3d89e1ddbde4f0093d647b6d71b8511bdb9f522abd242b4c841ec1ab07c9a2b6cbfb18aa167252b079c90121d32815e1cd116872954cde4ce709770ab962ecd691aa989f0944ea1da87a7432740d8d832012f42e35ffd6227e9a4de9d0af2219331ada3302e6f6af2e0b4d15c0d3288e89169dc43bb7a38b9f43ceceea18d2ed04be65ec9fd338f39eee1422360387427c8ebdcb02fed6e6ed887230723a8fc09b17c4524c93f1796fb5420e60391a6d5f0deca9285fe0a2ddfac0a4e58ea9427ac96dda75a3e0af04d35f20cbce626db4f692f50835416dd4fd42a2c08fcfd10825cb0bb78d670312dad41fd54dffa222db59154f29899687126090afa853fae7bf745c9eaaf5240e3e4942093232c91d4e97b0599719cb58dcb314ef72e63e7e18f24377972b705b70173df405bc40f8b2e72cb428826acebea2a62c79f70a5fa4bd66eedc7a868f12c66a1252ec88699ac000eb3843f35d2ac7aac327f6ecf1054e2d70e552c51d88ff6cf084542dd478aac36b50fef388c39ab960076664d69d2d0d9a3c54ba8b54faacfb24739fcddf1feab10ce3f9d5fb84586f82e5f074dec29db76be0d55d0970b0aebddb6cba3087fd68c6b364c9451cee6e34c61e406ca73474de97b40718da0e87aafc031e0f8b61df18edd2e722ed01d897b74cfdb953984f1ee9c52e059f1d229645f19dee82ce906de3a294374d293b261a1ad137500fa2a7479716424862ebea59b68e30167a3940458264d4e5db026a6ef67f7915211bf2318864716e86502197d07386af1b163a73c0edae2f8dcacf367e5cf12b6317aa5837acf569ee0bd690cde254c527d3b70f0c730582b7f0ef00f0fe31fb5c2219fc233450d3006b73c51d5f1cf106de4077b3b97d97e011244f1cd7ae1d62c7dbcdb9bf162273eb73b52d5e61ab5eb2513e550598d7aca81971508dd80a1d756a1d8991a7e09f2870e19c44a56c95ec83d36f0bd9ba642229381a655239e2c74f9c01409886189ed5cae8c66aad22e932c77020a2b8ad2bfde3f9128f256919e6a9cf607a9b46bb2cd1713823f5ac24f88b06e8967afe01e2057af9e16506f9e9c73265a098cff9e0a5e43e63de884c4fbe71c82759cd60802cfea01b7142f3a394d8c4acf70af78bb8b02d9cb05dbb92b26f43c7dd91a452bb12997fc2b373be633102124e9e30a88a43aa411372ff7c074dd01a8ef169d450554aa0e1cf1684d2b9a252f7e011a17b3d2903809e94763dac2171d6530d8f5d15280156fc38b164012a019b7727113bfb2e368006f6fbc5e88c705c3d2bde51f0d6138ad176ae97760d8091c9ed722d1c2e5c8a62a37720b185988926316bdf66c979f5d54cf6cda6c162836ed13ecf0eae0818282692ee65a15cd594ba9245f57697307e2804a701ea19d8cc8ef1a24121aba1ce0cb97f93643fda0f13fc360b61edc33294529415fc391a69531547522dc9cfdaa27564b952a3ff0bf9f420471ff016a91e8b25615c22c0dbda241ec026e4fac4a4312e45d13bccf1c93485071540b33822f8cb62ae79548a90a8a909a18fab126e774cd78469cc870e17d4e9c65211764e45f69847af5dfc031d76ad222c695a8dd230dcc0b066024528b05db796c9d9fcdd5780dc3735b69decf8093d3dadf36ecc8ac43aa22219eae177d17d9144d9bb394eaab0938430edb1adcc3755f173adb0bb3c46a199247bdccbf36ce40afc05d44c748966c1f16ee61864c4e7cc61b7393293695133b87464fd2229e184c77958e18cbb03578e9e04c8414a75a73417c0916837137a5c7134bbec191c5ab26211ae41ca0bed4ef7882e005c720a614be14829247ae576dea668cfdf16f5437ca8f3323ae2dbe9080aca206f8f7e7fc005d764b5ea0d9e3944843bc043dd01058950dc821abbb34be71d0fe8007bf610c8cf9960034b48fd99aebe81458a61b93d67bf3435f5543fc7a74d7a877b5aba848145b73926fdb80048d6867e85ebe43f7848c5a721325006e9578b87052429d39ce8200e3922e532d2f24451481632fa3317baf0b7d4292f63cc9f8191c8eb2082ff3ef4fa6ef18bedc04f8049671208089a88a531c027cba70b2af9b9df8b15d3f9788fd3288985e99f0c7e12550de3694fb327277ce8561391b271d5de660df07541316be609bb670d0f9d3b667316e5a5df18f170c74949feca6c8e3c189378e13d7c1d2dfe96e688cd701d220e1d0e4b40dd2822612faab0d75c3b7f2f20ddcbd1d27f76d492d890ca99400e2b50339eacf644282273c6466dc3761df6408fa382d6fb472849bdc39b7b3c91676b061e57f6ddf8a7b01d3e0224c69f2a6d0ef6e4fc29256626168f94887b422ec7e658f6514dfa4d5f2fe6191295892820ec345cb481881ab273635a538496fdf164ccec982cc3afeb6efd26ff7b626be6a7fa7e828ce5c27944cd617ed1065171f1e8cf2df2db3bff6ae1c05dd0918238b2a7bef8b3c4d9e51b4c2e4ce926c5b42e3b029528b77de5a41259b04dbcf791acca92898ebbdd70676e3540456ed7527a422b6036dee2389b2d77994b3b388be6e18db7862159b5a981fb1b7e44e2b7569cae11b5b80582c0919e6b41a2c172016b2505229bbb2f52460410ec5f946d43890f2c2dd9543ea4cd22c8c97a2f0e7cf5ecf4fc919e480218d4e3280548eee1b5c301f7c95ae6c85ec9145b27dd9bc9e049f97c995f9a3988e1e4b9dc9ca681916e45bbfe85f5abb4e5e07f3259b478d8d0951b199b805904bf980a5bfc4ed3aa6569d2ff61e5bf7e0daf9e303fe2fa3df55a60a8cea4f11ab29f91f9e422387f4ce0e5227b517408a4f44097dc91de8e3cbbd5ad657282499f5df93cd0db207e894d6b3e4ea379e34030fedfcc6b86581b2bf2cdfc739cffaa45a89b6ed43c36bef1cd793876319c63f8318e9bba921a254d3050e022a1cb77f918ac0a97ec1632908489e5242ba284bc811aa7197242cf7226fcdcfa213b8cead1d530b0a0bba88c48d6b147d88436f0560a9b02b7709e4d3f184f849bbe5d9d5cbd7d990a95655752e6494bb8bfdf3638e4c3f0d211f630f149943c81c26e7321bb4dcb7a121d746b3ef9ca5cc3f1e0922fde8e42a58bbfe5e7579c73e6441ec9553dc28fd01585da576f2e352f23a1fa42371589b9a36c7598062ed2a85302ac11aa18ac5e01ee28c605f1c26fc8dcf9d25a3137bcf1a938d22c5e3e773fa142872f286ffa572feee15abf84e47603f946d46bad2deb08981c46b517d14e7d351c498c4b5389cd855fd9e21d4b9fa97116222f8a9af40d2bdcc1dddf552418fc4765cebee81e49a4880003cbf3ca5009c6cfe72072a1295c9a4a13256144e6f0af204a3b3679269500698f418b7a7a2bef3a4d3f4376dfb2eb2bff6a841589caa9e58960bd5ed70f4f72feee61149a4fe5fdac178be9b2c736041d2f3c3a53e2ce4226afeb03ed4bcbb8dd53134d32ee51969e49ca7e24f2015ed6d40817d7c192b28c794e1cdc030ba7a4f02078d6afa8719e667da8b8cbd388d7096632a7ef8da3356d650e25ad95cbe046072be7ec512b16ce23fdd0cd333e782fe51f36d515b0bbecbe5c5ca3e0a209e535db092ce22fb2113bf22f7e96dc44c7f331f71ad1578a87b89bd39e72a6ac2e3b0a9cf9e20bdaa0440a075884eeb7521f1f7b1927042bcef2214cf5d26621a1953f25cbc72c0b2bdaba1ac373e26a6ec74c3568bd430a12e9910b32764d14efc2fd362b082ccdf44e96bc77ea53b87e9a2cb871da90c0040d7fa0ecd4e7e06942a930903b7a9d9a3e146ece5ebf3bf1f64566dd2579c802ec31a07d84a33e9ea2d7c783c781e49e27a7c44f57816f797a3ad2f3146a9caff44b7c7cfc2b69f0521d4d8e32ff4d7079e54f635b56cd6574519f7c2dffa85bb441a753a1dd0d1eeece4508043f32a1c34152a2e08bc056933e0ea0e88595a6baa8c3aa2c34927ab78f4099c1ce3eb2823080a66dad02bd4564a329caa8cf1165e533e8d1ce94846ab4c2bbe228cc1345575bb67946ef1a195a1f7f4ae5cf1c447b7a8869078ddc66f33dd6fbdb65547b1a468b99c5fffd7d72b609ffa91037d4f02a01287bd8d34abf3473655284f691fdc37e25c6bfc7e06329624f8f3ce4a5d7a50bb6981019747d2929b52ab56a28766506c3a59919f09fcc10b0f49fb325a69de089e8ce0f72a19e6261c0712fbd18adcdfa0f36541c8d107dda65d313e2c1572818ea6d35d3e0f6a601b042c7be69003c1f5ff216c2bfb932127f51975bcc735afa19782cf6afe47d0b7694c2bacc0ec9ca1466c281ac18b5ff9da5adff2c64e1940269458962ca4ff590019110c62c0f70c90ef7e7d6a182084d49d84b65ce648d11db2fdaae2aa73678f3c37eebda65b9ea551753c3f61ea30ab8a6df1cf25c2be4283c88f6881b64bdf5ca53b1ac74fbf4c3b163f888f486526c8a1896832116d5eb0c02b0650506bb82262d9c14b5bd74f55686e8dc9bf8b0e0028686f36bc4838e0ed67043fc731e23676b2fa59074e744673b29538d90a2bd90b742c584cb59abc582ca978a504243fe9ad0d19dc8c84b73ff1e9031d4a45fc5197e6c1481e4aeb08603f20714b47e6c3b141b461f9464fd515d25413b4241002b8e79838ea111605ec0c62b47014d20da8e0521ffd84b73c04965044ae8fbe27bf7506a581b7e558b95964f5da50abcf79301a9c0104967ca87d2137a150aec693d933164b04ff08ae6d4ebcf1c61b0f0c7a35626b8f959ee7d1ef74f62d87ea1e5b4613b0c00d1db29249921d3dc8d74905cbf9a5ed5ca8abd8e18413eff2984742682418b2b6a0af0e7dfdc67c5a2e181b03e715e692a5dbdc20ee625e96daf6d8c0d2eba3a3988c2a1187544c7a1d610205b62542df9a5f23d33a49411cb7136377a4915b7c0d312e2db82f75d0aa0c03faed3cc8ed911ff523f132612b38872cb42372a2e8088662fb17bfbf03e001660a15c1416191029c389a84876c63387ba0d5f6408f8f720da02c6df2bcc428735cb51e76e6a3f25f39bda77986420f98634486fc1aade079477f9fd5a26069721955ba2c22ced7854fe3030022ddf4ca24f8889f3167b5ec1699be315ebbadaa687efd2ebd1a9757a19300e3e83ad05a0b7866f17bc7daaf350133ce97ddda6472b64f43608f1b1d585506ec7f638990414c86baa1d4370acd3f6574f6cfdae85e881832b3364b1f9bb17de1906009b4eefc52c24a96b44406dcbbeb2298937e5579c0c45d160fa49330cd8bc237360e391030d11f163aa7075f9ffac440ef6e7f13afc1073750f667595eb2bef2fae64b118aaec85baf79f950786b84d0d5ff03dd4ef158a2f45b40b4981e2c993c834c87c722ec6dfd030338ad04094f2c7a0a5f031bf95ee51c46cae496b232e42e63f84ff533550a8d4e9da88efcc5de27bb22370991730980a022a8e3fbc7d92fb8ee8aef471ac05f020ad0d0043ad24e3fad5381c9ea4ad177454dcdad5f05ce74f0e0d7cdc405c046048d94cab7f037bd88bd4c49ca8f55f2b93c1c71034f53bf87b977705cc3fa421547a0f643202a5e3cdf32b81bbf563a08dc98eeba9f05c0397d95d6e9e1531fc466bd2fe74a6e4a5020fabee6c41a76b99409cd8cdd2da09194faa7734714059952b31daa564ca84ce76e043285eacf55ce36b581f1138614666e8c03dd841b1d744a69942c0ca0b99e543207ea0d6d63f1e84fa2c4ff9b4c5bb92c9f8bed8ad7324abbadb5f65c1eac75f06ddbcd776b65e743f63c3907c0dca2315239957950f57abafed75101037999e46d407016f691fb38854208f1f84ff24021cfc5110e26a30f8e7b67baf06d87b90e013f718bdfecd658bfb6817d1e71041635c57a9b2b8d62658a7ead6ef00915590782b1b2b681c6769989e1d6afe7223853dddb7f6e005a8ceadf02046ae5a1543881fdf37e83b0e7baca368b6c1c458f11555c4055c49f0a85d2e23b43e404097d837ed7a0bb3bb408c0ab25bcd81324587427684aa0dae7419e759ae3cee680bfd25be582ee10e46db5652b06e234fe0e84617fb45eb32c088de2a9b26bf1c0e4b4bda68de7d77fd0ef8f25b40351251dcb350bfbc4d1e0c1e552f01983cbd1d572cca0296d378e18b74f9b2d0312a26b92c996869bdd0b54efecf87edd1cbb7b53af5dbf47d8182f55cd16d9aa1e7ce22045a7bfaa7eb5a8f3d9484a428d86bda18f65b53e6325fc11331e20bf1ebb69bfd2c70dbb5de7a7394068e67ac53b82a2933e751a80be6733a6396a0cb968e7b5987cd89421a938084ae1b84d6de2b4a0e47265a3d6e9580250f11f57988a464bbe5189fe730143aa1e3a2a832d813ae1a989efa00eb0b7c759cda76962296dc96ccb86c1fbf9b165e6fba3e3ac22fcae0b097adbcf1b6ccbe9556a0ac04d4477cc7438a560986882c7ad8b3693cce24e327c6d1ac23160532612d1015affb39c03d307724be65148ebd749448988d40b456932268ffa79aa3b8b4218d746a2823c705cef63ec54017a0147d5375dba2b6d5930c7dd7ea0174e482615e02bf96f9dd49de551b15af39bb3ecb145537cf7d1d3cfc454c6bee188d2e6c11cb5a0ac4e8634 -MD = a3cfce930b5e8de54554e9c31cb3e4b754b24e6cfeb6b89ada2ca51b907a057d3814d11980367109c1f55b35d7b187e3be90cbb90867bb59b78cf6c04eb2587f - -Len = 81016 -Msg = 5d146aa439e41599b3a48574dd33f12144f8f8541773e1c28c182791805e350d5e136e9c41f270f45d779a8b9bf2cc4f83db6d985f65b35b9d551ea076154636cd04d7a55a11da640788364c9a2b764d9585cc605a7b56bc9324a14dd1db6c627392aea6ca69da517b7f619f24077882429f1d9352de544f362cb780dbd72df91963fa86da21f8237f03236c7fae5b5551d1661b8db5357b4e166821da321463851fc32fd261bc42dcbc859bf447a7308cc2b1df54297fa7a289bc181713a608806f1188fa53af175a538e15cbfbe27ab91b05c7ee62bc3dfb2ebc4ddaa36d51d1fbed79991c5808c07047c04cf1969aa1836bbba58773a421ad6fa96b09f0a4426a5eeaf9e73f7ed8bab685bf524afa0ca3e9a3bfc12d44dcadde12116eb76a99646dc360daede268dae54d6b458701c2238a6785377185f4d60f7115fa4b0c9f9321ec171de99a3977dcfe99f3d4178aaa53f03f12c7cf30d20cafbfd433f01c9c824e66d9bb10133aa2819183b9a42de04e243579b78a5946ddb25725f780d82a98cf9436ecaabdcb3ebf9b1ebe10746e82ecae95ca1e37dd8864251420239ae36c58eb5b03d201d1bb9fffec6cc424fcf731f48d87f3923d17ac71ca35402b6f05d2b17188efa5f51e0804144a260831b6d94d8a7771320e9171826fbe4154776b232f9f046872de71e4f3bfe19fe7b6c6cd02b42001dff9ff9da12a438ddba3a735ad0efea73034bc1a1414b79888322ff65a320c0960a5681716234d8c889ac0ee73e5fe13a7a10592af3c5677b44efa3b9f2dc3f37ebcd4c7298363a62505be38c84d8c149ecb56340c5e46a533b22e8317cccb2501e34c9522720e43788baafaf66e3112df5ab6e873a30d8bcd05d3b80c38ae09b1c4d6694817d5cb4bd58b1c436f747530f72e962b3335904af0f2c1c498f40555077d2be49b40a6648a6985f879dea65a4ac4267d35461b711a918688152383b75446c33e25d73c8b534c1f5cb3f60b25fa8280b1d1c6960b2cbbef9fd7c5ea9d513b199ede23f68ad83dd1b946440d58b0708c0f313f68e0cd75e4530561a2d0a963164ceeab3a28c0438355595014bd139533de7a38f9b8a6c94deac880131802c6a08f7cf7712cb4671d7a15a3891accf95b68d73ab15b5ebe12ad47a9a53c056da0b1b090045f5bb0886ea2c4d23882a4edf36eccf8919e5c1be4ab64c006595ffff8b3fd59895e26aa79273b59dfde9fd2c8677636210eac50d71b39cc3ca6a4a3adadc6da7264d16ce5cc9185d687f1f02febc0d3d455b59acdc0b131a796457617c574eee116bab6f8bb4dbde726a2316f223337721c80df10c153570fcf495f80248efc9f1ce871fc19f76bd863bb7cd23356cac30a1309e647a8a63cf9b8452ef29c6e751d6383371117f672e542b89e46b1f58ec878fe987a3787f5bd9b126a5627ab28c134d6f2c836c67d5542cf1c85cd1e9dfdb7a86d81886003c3f9ad7c78b61b83b162517469db43c15ac0a8941631afb652d6edaf85239a2fb2dafeac81d1264d95f5db071a8fd5069dc62b4e21650ea26fdfb7a4ad919e3f3246ed429900344d14f65ef103d9e413c65b4091cff2a529fbd9ed962259d3fbed466285e7ccad4cd76cc17b4e41d8b17c88cfa7475fda129fcd77cb0b03a02d88e145be94bcf912865feced204f19a86754c0d6b234172702c23d8c91176f9bae207e36c7598067c8d7c68fa48c0fc030c7fb6738fac32ecdc02620dc1ea70e0509f532a929ab1345dd39a8ff7f22c07fe969a2003845f0a7d01cd113a0af4e35a793fd62b6e0dda6782d825cb1bb72fbc3f0ce3376073539f807e55f23f123e7ff3ede1988888f93b18863e1a8409c4d5c7934f83d70c42a42cda5e731d455c31bdf1cf7250cefb38f3394b6ee1b071dbced1d7813e86723b65759d451c0ab70025f002317d2c6af1a165d040bb27b12ec32cfdb83d7e4cc5b8d494d0c1def97bca4d2c5e644db2e5a1905f3856fc0d4f332934812a504cc3957bc7be854e7df5298da0718c9f8d95825d6aae6b99d0cd9d3b0e74abb8fcc589efc856fcb5cf1cb225f0f37c8e3581b201652b5f7db62a7ff70e1b27f4d73c1484f9429eb15742f29ab05cbab6552abf40e127b93427d649d195ed25a066a7b3ffed09d1cdc11869704125ad9467011870613bff49a061895f48533b581588e69506053c77770d953b35e6eba4e5954c3467c0982aba4cbcf497f5cf687e603b08f6dd352af382f45ff108eb645b57c8e1576e2a53d0086326074d587e0bce1fb011ea6274c11915532504335f22e92d2bd29d0c517c150a8808b27ce54813031f09c53ac16a5066b9348139f1e6a9c7684bc5d4a02903219f2ecd935abddf83ca20e624bd599966f691d895c9111a562b358119cc615336bffc07322ac7a4203609d5b6b50984949fdfa2ad413ccb27e912473232bf75b87ed2f7eff20fd156e7171c773504828e1970580706c43cdb268490b48f9dfb25504608133cf117a651fb12ecd9d513a1f7e661296631dfde67eee6171f77441bd8e7c0426815c78d0b08616e0ff5c88ecfc4668afc2024b021d3cfe08ee5f0fa8d1aa8f40fe8617976d1709143e11182e57cd0b244f9cbdee8b5b6973a64724fc1613abe90d385fa39e8d8ed12117f4cfd822825bd3905e9210722a1ce7d589a3a5dedf89781a59da8b0f2e7f711724b5c76e55be158933d6f6a9ca6979b14583c634b48805d30c257bc66f86f6b8aeca6cd80db4df2d46a38329d0c423826086c13db14e7d0c816db8d9dc4f78a39cf40e8931a4f7249edf011ac494aef0e393dd205e43a76cbe988871fa40bf7ff61df7a849f826174374b6a42f40e3a5d591640643d04d9ccd8f34b653c292f5c22c6d5edd1734ae3e48ebed973287463e6a9c16e95b3543b63b03cf6e3ebbad0a09b9d37669e9909645e72087d1657e2705ce79d74e280a7f833fe5d31a004ed59c232e9b560d665352f463848544f2974a4156950fee99324e2e1f0bc02a812ccdf298d54667d77e5658de18b6eb4d96213fd6ac084f97d6861aa69d9601ed16847038aba1c08c1d3b5cbbcacc23352c720e21a39f13ac741249a111064c3b9ba9e337a5cfe02c3be8481f222fb4526225f75e023e018113da0439f076d512c32494bc4b388f60dd456434a948664e3f2242b6524ce3bebbc69296c050621b97ddcbf0264595d00d3af722e67d01cecb51375019317f0b74be3ddf0cfbbcfd1ebcd0fabd5cb923d2af4b1162374c7d0f9b1e55e2549d0e47aa4b3d59dfab6160aaea0398e7c402358ca628a3df100012e63eec321f07723b7205d73164f6ef668d6233404c7f143cb9518f33db1502dd1ce03e93f984dd59feb3d61bf2674e374f80b13cf5af02f11e946f9a95232976234c728c4adbf8a8369d61a0f1c427dbd68ca614481f735ca4b6f05e73021de7e5cab1a67bd56a30030aa146c9d6215b0cce3951af96108431013909df79873848a22367f23adbf94b44bd98e265e5bed78e937a91db8171aebb732340520f6f361bef5918d2f50cf891de1ba5391a0c2113db1755b76d2b042dc532fe535c96967e3e0455645d70f03a2c597819694ed1a63ab165f27cbb199f58c0814517b44f1337ef12babe2d1d86ced9c4ce7a8bcf8fd8cf28545728d759535430efe7d24b2203a2b59abe4c65bfed23f221f4cb0316dcf906a5a67a25a2df77751b75f771f3c9a5a8cd05d4b22bb0c068d7801655836fb767ac10b9eac424afb78f692ba9ceb281511b3ccdeb14403790bbc575ad1db892b3323eee100549875f146a76dbfae6bd1a4b0b3ff8c0c410d1946ceff32de01152ffd8217eae7784d37220e1efc08ce16a271933c17865d492291c8d0ffb0ebdaddb85581c06d5307c713473ce68cc75a8750fb02d834b0a3d437e56e9cf6b1c2a8eed9dd2578c12c2d94e355e3acf023efe94bf262b9d3a39aa395269f11fb832dfb9f788e7c3b20e71152d887dbd10938a516794b684ecee26f68978a851192e97916f2600a399c6023265357bbe250fe1eeb05d6d27a9c47f5d04fc3e29c5847e1c0b94e8544e54544ce54b7af8cb1aca12a26a98aff8237c15cadef9d0469e5c03d5bae7fd591e2f0cb3b4c396891c0e6546a37f436273e7c7e307226e24e2f9edd58147c6438e5b1ad9569ebee77d7591a3f0690c6e1c861a585e002ae5ba1d8312cf4ed8930a9f1d5f1b52996ea5c73bc13aa031a48622b730cadd2d138d8f6d948e465bd1fcc5be4be9294ea5fdcc0da9676adb8c1982457335ff9f35c2185263a4757686cb93a4a7aa690515eb4caf62611032af3e706d2986afa7d4c380db88fb245239dfd2777b455be844d80ec9f40ed95d945bb2d75ba5356d77f78faf0a799a1772a049e1cda2471cbc2ddb0268580f85c3da112a1179d91aa6c60c77f10821ecb976c288a7a975cc05507b02c526f8d1c521550f51ece3d6ea98c1da458ffff997c9031410422c1ea5abb672135fde6a219a462d25e59ac8c9d574810ff57d679301d62e1155b63a26a454fa5bed07775fabab2d944d4819cde5ee135724e35e3686017eb0ca594910a51c41a4b7bc2108be4eb6a60a33f07e31f7392303790506c04cabf7895e73e915d7f0f6a54490a33af5716405a376631f579b7d7a86858d18815eee7a0ddf3b5c4dae599fe9ebb8876905d526e2d30418d5e06c71540653f4663e9c86adb68de24624d68df15bcf0d721b0256372ee9853ab0f9d029afdfbdc5f40993881f680e8afa7457a5077133d75bf17be9af9bcc4eb52a7f4ea8b9dc64273d8ae443534ae0d73ce64d182563626cac7e4180a157d99409670b1a69b70b8041540a4ad6fe1263342031b57405d9f73b4887c6838ca3f89e6ea72d77b884a61cd7425b7990e64766ee9807e57f05a3a4c003accad57387f07d6c086c469643d6fdd39ec569252bda39cc35003aae19f1cdfc57fd9913e9077da0d4d0c808fc78ad073c41f197b697e713684d9e9c012a59bcf2a43f49c7eb548cb829a8a37b08cf245d76900391a5e1b6c855149602554b89a34731dec9a5ec78dd014d2f68914a7328eaaf32640c10fc7c9f0266c47c8bac926fd69a963b2bac6adf1f746a18083cc627b4edd6d45b2fadb3d1d2f0a6006de9a39644d7b8fb6f884c86392aa7f0c75fb509fa8f06a995821aeaa32edc9413cd6cd9a63321430b5fcfea485045ea5b1a1a142138aae478245bb3a025252ee8685107865380ebc616f0b36783fbde411fe03f2c79c6f31ebafe96937e89b632e2da88addedcdae9d637495f6bd0b4c2978ef1e1f964bed06d8cfa42e010153a638fc5e37d3efabbc62d15f7b1cc5424aaad910a618b2dd5658c4777f4c3314812f924efd8ad32860f597df9fdf7a7af7fc4896d58442877c986e4f862a9f3a3179f0e9b96316a90d843ea2bf65a93ad3f5b40d3879697fcc1023b8dd1ca43959b09ecad60d28a234a74c55745fc016411fb1e03958962ad7789b300e92f0a64c6c024eedd997b858d73744392e5da1d1e2a8bc72b2571d210a2b41853df2e59bf4b2026b68d23fec8c861b8841e04208d73efe5f173acb3b7d6a69cb7e299bcaf32461d92b76bd823fcf27dc3ae69b5875bb2268e7afc9792acf255bc4131d5bdfe009a1a1d3b59c796915cf89df024346c3c52ab4247c8c9acfe0b0b03e0eb1236b567f6c97ccbdc1ea51bcbf480b4bb2df631efd4778c855e33854c308d48d562cc4acdc31474891d9683e3ba03af4526468a0337722cee4bf98d26d120322f0baf0c4711ed9df71acb5ce9f7605bf9e095278e7322ef2bfab9e941ed80f248b8c5750dbdee8d4e9dae6e84b37f0100e24cce39916d1f65f3d962468c97d047f1764cc7cffe8eb52ea6805df748e881b4d148ac983d02c3bfc3c0ddb64c13543e2a5b1d4d07e654561b5c1bcaa35aa5df8e5d8e9079e26ee5ddcbad74870599284968b541f0de549c75c86735789d94eae9d4888209058ded914b5fcd30ec3b363b3c3ab2a1bedd891d8de93faffa755d4c774175d5b4496046079aca301165f1699f52a901ce16a4797348f030b970c11e0c6271c436cac563c807726dbc3ddf3958a52dfa562875f2412d50e322af9dc75c927ec0d537a452564ecdd035eb8a1431dc46739d3b84f1c13f68b07d5779af2f7aa5b1d7b8867a7916e341c3987a63f09ffc55ec755adcb9273f801193dd3e4dc1ed7d8577f143f907bda9af6c358c5e9558868b017e1cf28cdd39278952dc7d105f0d279970159dca62ee428e45f9436761efc205781a34174bc507615ff1880f0149054988582e07dafac127321067bd2078d9aad13d4670900af9448de53765dd1966adc37475652eb3775e823b913d9b0a171710ecf23eb4f2455a632050bbfb6694eda8d2378d6503ab5cbfe18b92dc8bc575bd91fe29c06432ca690a9bb86116d532bfd83f2787d1a44870691b62ebe52beb609333dbbb4709bd270be205191372a491ef54da9d04ab4b1e3d0a56cefe91a2825a59f9ad85135a268ceb492b43b36aa57f3d4ead86088d50c41f158fc03fc1aa4e382e9f0595caedf37f2d9d90dfad83f1c32cc23e03358e66244836117c7161d7971f97afda3404aa665979e14094b4abae1ce114e46c618bdf96c9db92da2e5d4077a06b29c1f4176874c71d1c48bf17c6c514f0f2594f9b1aa85205c7239948f9dcbf21c99844a44d268d2ebcf02c9cd2d062ba7625e2fe9b25d87764752a008bf7feb903e37cb8dc19d5fb68b584a19ce4d45ab8f7a21d2bb66419b0f76aedbe6f641b1fc725badef2a66c67bf4e90eaaa70b900f8165e9103fdd3f5d2e07759ecf930656ec6141c5c0969033512d085ca40bd964fc62a97b3ab8d792d15072618c6de1c00e72d5bfd04da823f59c935eb4c4fc1263aea036e762f86318f03eb98d20e8ea4106d667da2a72d07a9e3c1b59a58cba2fb049ede67a16205d8d5711726a90183ca3c0485e8b94cb28d86f3d235befaed90e230a985cb55d378e3803bc895bec59c02fcbde0f6276b8a1a91e7226b972f81ea8177d995a9c0f597e0acc2bc0d910f2717cc914705582a07649f6a45e98f578658f169e8a4f6d95858131c04350faa131d5b039430a1f4b5349f16363a36991d7ebe3faa909dab8db118dc578069f52fd6113fc6ee6f708dc9922e25d04ccf16bc8763c5b3dcf4a0b3620c9c34c478e109974cc388ea27f5ea1eb8f9f5f881dbd8f4db1f56dc3bf8269ab3bb9a4bbc92809432754639a05661ebbe9cee6238d39aacb1a2c0c508fdd267da9bfa2348ab01b1fac36f856319f4a247f506b37b66cc58ed353bbee4177f7288269c77a4925596ab944df5f9a46ceb5cec8413d3fc349f95bf0def55aef463c543c76d59b144ea4dd226b2e961906d0469afa9c7fd9c2ab32a7f81e52afae199dac52dee6f9555e96443e3bbb62ad14754d19edfd1caa14e5dd99c1cf359940dd4dce0eb3312818532ecb1f80d00be2d953019a3e186aa6f4063678171d925281755aed96781132c24684427cddcddbf1514439c939af01dbb650b9c0d413cf38c78be3e72abb6e32201c3d05e84d604bac7445150cc1960b626b0f52d5b80741b8c39a5bc5810b414fd567c28c050046d90434a81e6ce4019ef7c153bed9ab5addb4693ad4fc9a6e2a527b1935af4c817b668108caeb6c6cc089a839dc031be28ab0e92ad5a8ac174415bfa071869579e82dd2adbed7af9b7b930c7bd9cee957645b929243ffb0eb2191ddcecc457baec3cc720d46ac1e2c34a676a014979447df16ee17ac7c394857493e1aa2468f7e72c517be1ef3487d60266f3d38e79d327f6554017ba8a5cd39ce590a90142187999a0c269427bf2d92a56ea9a3497485a9e97d063e0fa6c86d73c7151228d2489cddf7dd42c3d2bb50a5ed7bd047aad002f5c19c701b9ce846ec00d0b51f224fe0e34358975223850eaa743a6c3ca0900f2cba2a9e46f8ab7a998eb3d54181fc2a5c770f2e5d423941258b6bc3c3165422f0df37252c5a605cfed9451f4a91dbcdac1b97644f8f468c99ab6673655c8ae2e49948b13622c582ae68eadf94a27d4f44a957d5939b1b35995cd0f78de3a2c36a80e5aeff0239700ac63bb2ba543f23d898e6fed3c645f0870821ccb75c4a49052e749ae1494aa9a669ae152627cfefba72bb5c8ac14531f545df6f7c26cfe856eaabf17788678403dbc893529d7e077ccf4b5b22fca77e568e706c46c3c225b25dc24f3c401eb3959501a9da05e81f91e72d8736d8db3a4d5a7b2fa1c3cf85a9e07df0aa00eeacfe1defc527218c7c8c82c86d21065efa2c2266360797369cc02b25a24b2b35e48fdef961c450d9b2ef0ab2899bd5a132958ea82bf2ce95bf77866fc09a5fa2dedd70a52c3c246e671bf75248e1e75077fbe7d75dfdca6b72529aa2d801feb400694b7970e90ca8eda5c14e47adbbdb3ec1d67a68832b3669c3c065553c88d7fdb5f7ecec657a17db1ef10ce249c3b00ba9d2e7b82d5174fa4da02dc484ae8d2b35ee85db3c1d4993ea2ef4c5608f5d42f655c5e946fda59872b272b284a0422d8b97cad9d746accc89b3bc5d6c7f519959e78b688a5056e8b56fca8ba73ea559099c2264c186bfc99027ba16d8243b5326f0beb24219e75fa840abcc86aa155242643308856e013f7003847e3e1e5924f019c65318bb0551adcd7cf18da3108dc87863418d6d0f82bbdf921008be596337cb38b768a40f83487ed4a7469a358ffe51498c53f43937d6046968c294aab2807d9c7bdc758458facd493a2bffe2cd76773c6573941cc3411a70e4e621db874ca9480cceaff24757412146a854a6baa362d24966ed38b9afaa5f10fdf65a460ee6f1f6c9a3e7d2c07313496638fffc179ca1c498300b8f540c7a897472a59349bef0a657f1c38fd8cb95aec00d6cf6459d0153a23d13b8e0e9699ae4375be38f89eaa7f42a13e302b30f0360526c3dafec9772ff44cfcad8a992d1c7b4dbbb42e0367828bd5750d0e205d3a1988c36d8f3ca9f19e7be49adc58cca896ba38ef64a6aa3501c1c6dc5a1009c1e503b76334b21548ca66d99c2d5bdf1c3dc41d32c310d9614d6c19e43a895c92119f870517b222fb2014c4fca52bcc3e177452c573c85ece17de576ed412be7744641c9b5dc438d4478d8e036b4ffdd7cdd1c0f09b569f44062066c250339736265b5c6d3170bf99e8d91df6a84fd8ae06e34dfb6443068bc2393028d7744f98608b30c2b93f1f13aa015b2083b4c78d6bb3e22df516f96af4319ce8915e4e659afd80e41db8c10a360c2fc82504313aa34868cf7757e2ab44119149a578fc657bb7351986640b4633028035b5ca7e7e57abc529118f281459e0f9943b4ac25facc335aa1cc9668e4aeb38b05c8b15212fe2e383ec45336edca6bb127d5d061dd5296adf06713bab23d03e8142d160ebd2f7a8252f016b80746bbf08913831659defbbff6de4f06665b87af08e23c6a4e9f1fe56034b3814ca38edc19f64ac00ac1f0f5478a8ef85b8acd445690aaf131bd9cc6090ac02f085142d84d067deb6abc0502450479ed0c6b334c7fa0d830111b6fa89fdab31dd4e0867984bcb2e4e42db65b81c49671134d582bf6ab4ab3673906f1a73d12da3cd1b834639170692187736580534b10ead1aa675e0878d7ae870155a19a45e0aa95569d6c2d4cd48d69cab4b3392e390d78b8831850f9295185dd39318ae2dda8bbe01900d89ea392352acdbcdea675f5a2f113b80d3224eac5f910b977700da1a5f34bb43bec72da8a2214efbc5a443df0f27dafa5ba66e4c7e370cbf8540d3ff3fe8a18bfccbec0d93f2ede7aa02040e31b3581b3084be9fc3aedcb762568ee16606880ec95e3df92e0700b621e9698e9f9efb0ad926034e35dcc3a896a8d069dd77b9f4b0e8e9147a48cf93b2c13c0861ce0cf0def20800dcaa0bbaa7a0643fab217c6436d1b9077f9ea1a4e6f243237d2dd2f4c852945ec100fa141fa5110ad8ee1986e582727a45efc01144e44788fda2973f1ead6e10ebc7dadf861e9e726dc5d7834461df14d525720355000fdee814a1f8686b5fbd62e5f1426275d421718dff83dbd7c77e362600a29fac65ce476d3a482ff32f0d2f4488663d117bbcec30d9ad334df16070dcb215ac510f002194a857f9afa6aa59cae6739e5a5beee795ad2ad32926608c2dcf850458d61b7e71334c51068b39e86155900eb83b5c68a4c32243d42e299103a1192d2782c867ec2550bc60a865e5f01be51493e4b17a4562bc0cb7d16187456efab128dbaee2edc48ac425c3d3575f819b38531f932260d420b539d7b176db7f4f18c2a876fa5c5a23f0bea52e4696cfda0260b2ab6add5f77c6c107c067ac1c41e85cb3c7b4212d42c891161cbb7c4dc9fb2365a059a44ce9c8b92a3761a28cf8ab60c24a1a248510d507de45bcfb4391aa02021af79ee39d428808bd6da4199be8359ea6334eacb59e89c45354faf85997664fc34db16bbcbc9669fb929b095228430f840785e958ac7d91eb8862b54a4bb8164062c62e6dbe4b1598d86da547f2f2dd8c9fb28321854c0db76219c28c4d5e1d3c3fc672d9d10fd33d4703359fceaacf6502bec339b35f005fe908674625c22d5dea9780277c4a6d92e845018544d3aeb8388ff1c8be1d328b2517eca15c4a0d4b6d23a0804864a93ec21b501fddd5422c4a0f55f52ced6be21f2f98c4796087afd050190cbcc550eadd6e6c952018536a3f2436e98739720cde36b4d7046b6131190835f260d52a3d42249b109605a9191fb8decc566810b26a16880486d3647852323a5bbcfdfee0f82726b8c5020be2f3b293c522e20d7cccb55c7186ff582d82b6716e59a3967a075d55b43778436dc2fa9efc720e31110bfd78468c5905f7b27c2254be31b8b478b06f2d74d017619478479ace56431a2fd423ac2048327fe96b9534730d2d365207be4a027050677114d5c7be210d3e4124a7cbcb34a96d2f6d113701a1bca79d4988346bc2b62662b692aacbd8552648d44aca148530688c69e085ef532fb062601612372c10476e46c46c7ce1e4794ccc55d184a4901809484845c58d4df8a833b00dec1828719eacb4345aa582e056f4100aa1f79126adf092a00cb6dd2877aa9d4d14edc44df9d0aa2bec8cf6036c34c29bf6e7fa3a814a05bd4b35a8e7d7ad27f93613ad82879aed79baff0a899974b4ac08dd95fb8b3eebc50a7476ded1249439dbf2abb950f3c7454c64841be29c2f66613f2812d5b58adfd1da0eb46cf72d378af2859a5dc17eb72b242d60519479f088767c2667952c3429cf3a12b10f3a18cb7b05ccb5ee5bf9dea8cd01ed44da7305eb59e047c817eb99bbc0a0a652030726f5f1f86060a630ed572ca5be949c17610586e87f34932daa07690555a9cf2a24c812c56701a787e19811f5cd6d0603232bcde517c3ea22e219fdeac6fce8a94c5c30dcd1b7a62440d5469821b55f60d3c7f480155c62f1cc5a44f6003494ad271913e4a66cea2f95759137c256f055f940c46083e645c3ed3206d20b371c5e3b688286ee07bcd165e0bb7ab936010b1efe052d684bd9bfcf0a0a25efefc8e313af466ab27064313a7d8c080d3fd9aac9697f91cd72670ef9481998b443df6534572737fa8f2a799bb6cb8ac657c25983e9f932b94336d7f356fbd3631aab0b28c9ed96cc4c55ce11f242a7ed680240d3e63db834a69043469a787d045e72fe766c602e328f2f5a239ab7088959e28841c811cc4783bb7a797e573e9df67d65a6a748a83340fe455914f355a212aa5955f73e16f8c200a3146862c038ca146940e46cabd7470bb73bc9be35417ba2da98db8c3d514ba7e69fc25fa8dcc27e32cd8a95e0278c9ed75221df506c7c123491dcc2ea5a06f86ca3f317a192c605e7d5018bee2af7ffcd2585204f2efd418ec963aac41adc3b5da863525161beefb0deb0167fe97175c23c5b47da8ce67811c6d60a7499b3b7e1347ad860519285b67201fe386ae049de200c1d98901fffe5129faba1df75b51ed1a070776a2a0f21185b0ac3b72ec44858016a3241901e31352455f4f5087d3f063de43eb56ed519592604c8d8412b296ca1f64fa7221d1db5cfcf14e256576a5bb9fa5c39471ec5bbcbb2eed303c9a8e5538898cbbb43d31c07e3abae458bc8597c7b7afe9b344dc8b0dcdeb25ae5ee4a81eab5b444d978f133575e62bf608087ee2e3f0d545dda083e4c407d30c6222392e24d6aa62737bdbdf4d704ab1fba6e78dd546d58e29402ddc9bb3a6cb56df9ee3908f6c77536070c82be9ff011a094804e6026910ba23ef61af7f3f6faf752fdb7905f910b9d5788c9ba38787b5783704a0c41e51f2c44ef089dafb6dde7b926238aadeb309535999074d92aa80ac3ae9900c53e685c9d325b557794a665b3d446a1e9bc2e462aa7a19489eedfdfdaa403e3ba832c58d025dbc652789c9bca6ce97b1aee4bd7bd1ac2c151ac67fe52b8505d299cb44865324f99484a08af8557d2c04868d070775abca3374c8990b354471819704855e4c0817561f232c96cfdca197b12053bdfcf57e346b78dbd83dfb2b992e92fa7d6363703a658621208c6982ebcd4315d7de25a2983d3bbac4cc157eb9ceeb365c3fe3aeb1e64e0b1e01b06a612969d01d9f98f1cf8895a869561fe5440681ab7317f52d4d1fff3cf7d62da298640924d7c7ebc65acc2b472e729719c853dadc6aa214666c80fe5946505dd611fba5669edd7aaaca7640f99c980776c7456b4bab54ce04a0a7dfc27226ad7f3e5ec317eb46e2198f258b423c3ced76c139b77bbdb68e6289f3281b13cfb908ae0bf6db45aa9e9d19487eb375d7c5a436cf43defa2dd21a79015bb59391ecfcc1919513266f2c90095d8fcfd20f0c899874a508195145970e40df448a33d5e6197e4242160b08acdfe322e9e9393e9186a83f6973973562ba30472a501bf03f262062fa8d04af4dfd67fca423fcd84661f89785a1863df7fd6e17f99dc0c87278369baf03f2acfdf25a61810aa07632bae421ef1b94dbe14848c614cbb8cb1a701f30c2135b7e374f38f60315ea74c101d982f84a497b993b5ec60e526a74b1be48e6f623859f8474922eacde31708bc7672f53d62ab99a471ebc68da5c51b2a352129dbd278d5ff2e47fd0bbfbd5fd9c1b7b6427aef25eec170d96bc14eeb7dfb9383b58a7c4345abe6e3137c03180c0451bbbb74cd271aac64e3a801aa81bb3ecec518e8ce0ac1c7e7e20ea150fdff49274cd1d9ac65cf3bad2a6bee41a58d06b9372b75d4f21a8a324324b70bd45a9721b0ab2ff3a9b67534f7dd0e7b219b5c3c2117b8f7c3f9fcaf4e7c459e66c4f7273173010cb97762e19125ecc1bc8c473fca033a9f440526474a3fd3707be66f21154ed45e5db90a9d426d0d793d09d0aa7b1881353ee70fe08194eae9db680af7a56632515f24764e50dafb0d6db9fe657c7e171f7946bf6339a411714df1cd9229e3a24d8661addd04963de31445d959155c84c7bdcb3fb9bb96d0709a29c2d8e9edadba9918b733a6c95b65fa54696c8eda4e93d21e96c84f93af4e8abaf0b22caad90061f09d367e9addf9e68fb7872e22ffed7fe6cc7a3cc33773e5495f083c45b187a69266d0d3324c09a19dca933e591e3c8dcbeab6cc4def48738118c35fe4bab82fa61ae8efb930fcf428aa7606aa34e8c577f763455a5f33fc0722c9deb07ef9c6d3c26618560f3aa4d5601ace3bc859ec8ffb6bf011109d4786850401d084b331c164319731732b7c4ef365de3462f6cdbeffb5159b89ef1da44a5b0f6c544f39190b33b473e337433b6b417dbe8b292faa0929fc1f528f460978b552ae7733a683bc53b644e8c6c043d195f501c95ad9fb24afecc6f4e78a5e17fc10bc74c940a68179e7cb0940bc0f2c498c24a7ef945a552f2fb8f65db14b301792bed378cf2b618d8d31ce0dff4784448b4faa51286fa6910b1ce05b8277c9ee20dd1da71ab96578f19dbf955192e1703aac5ce85de11ebdc91a3b48c68bed690140d9c0eaf993205b3865407a984cb4e060441cfb58c59cb0dc8e8c452ea1707f118f2a0793f56e122a47774102ccf8c696ea56c97ea4140a87618fc709efebe075c74d392e934a609aeda070786a243574d7fc90f8c20e1d463db814c4dec26d960a914872739d8bb0e025cda12d217322927818712873333fa871f30676dd6e9cdf5efb099f4ddc96a76c21261dd5c8c9a330298fdc29929a2c222e77c0242bafcf1c1b981f449b71cadf33ae42297e91938e8bfae81a828051 -MD = d1089feae2a08019d9b7b121bc3fdb2e64d90647735608bf4e34be89f453d1fefa35e9144cd3a4f389d3b911b330af775ced000746dd0b526a1ffef1648e88bd - -Len = 81808 -Msg = e5a4fde05da8f5310909de90db06ce4f2ea08da7a6f49aaa5ec76f7a426306b9b9a29c408848b514f3956095241bbcf9d1cebbf91a5a26cab0b9e24f3c04718dff89bb5fb51f0f6bc0b665548232e6320b7aae3ff4cbd0d28a539a9230fb1be3fe84e3a5aed50a1eb9937434bdf352e022ccecdffdf19fab34bd21a9e4ef0da4ffb89b7a3a13ae152655159d9c050aec5fedff43fd719b3bf620fffe20894db64a506b46208104394f23d0f7e911163f0a056fd1bcf6cc6b18a4baf7ae71e5032772db7129c613707b262eab6abe7cc06b3bc2f301263b24e170dcfe554edc72de4774631d8ae4a3f386b61fe8b54656c9b8821095a9ef4c9baded7adcc83beab6f6bd85c4777dbb006af1bc2a9d7ceb6ea4368f4128f0cc8c8273d30c880955f8a73f3de533e89ee8fa65eafa1f2466a02667dacb4b478dfc18f870ad364e9aed8480f44a662d36f3609c121ee348aea8669c58fbb9fb76359603bb877a13a1dab20a13b9b952696bc11e9a5f90efadce8d5d719b1b146e7e251d1b61fa5f520a5c6500fbd36121964871ec85ce224a59c3338d71189b5f1eedccf804613a95c4a81725d85e6145be1a1f6e5847e86d932fa414475997305e159bbb3955ac524fbeaae917ff5bbd2962b08aa0a049fec2fa3a6ee38510c986c60fcac67ebe71f4c7a6b3826056711f46aaa724844de62f4b7d040d450e12de27b28e738677dafbeb91eddf295a49eaee972cad99fd0b224bf43c8f419af3ad610b6f0a12e075ac51f5fef702702dd183fe8303876056e222277f3020bb543d9ba2d651cdff2b4e22594e92919e051b2d6813eef77eafb9f79e36b78b7a1dd4fe0029125cdee22b8546457881eeb911135c44369160ffedf2e2c7ed29dd36bbb2acd1136a858389a3434b70786831fb5e627ea2fc0d2cc73d7a9c9aa3ef873ade2e371d9dfaf7b1a4d8c8431e135521350229fbe18d208ffdee1b86a0b5f898aa0fc2f79d4724ebaf8d24b91df70ecac1c5ad09e7e9c18d5dc7ae78c939721f3fd6d96b1374f47fecebc79a1a1c423f2a327394b728f909838cbc39c682db15c50be63fa7874eb4847919aec08bdac997d2e164f852af4a97c5ad923e981dc36337503c008a19d39fbf83bdb44bbfae302b60405370cb99c2fae848d9841e7142e17f2ac7843f2464466b8ea164d7361fc759f27089343e2bb4d726404dc8678a91dbd1a37ea7effc953aea2ddf0cab892e3240f6a5d481fc7ae1f31bfb01ec62cfccf83d7f397c8f35599900c3455399e655f38ecc92a95ad56e761197b349f224ba693c8fdd1244ac2e63c3186a78747928d3df0756006f4ce678cb27c5c763170dea49b67bfb438423101ee66260456f15a7925d08cc6367b2c1f1b61facdd312d440cfdfb7db5449f67b8361753324e82394ed791565eae38192a49a94087f8823f2c6b45e1c2750a313a0f709b63a0d94fbc7cd7e687aae1481eea4bcd8af675a25209426f919ecb364b7a557f01ec81b28354c3c406e2151576a0ed990eb36c3725ded86e4b474c3e947eae4634bbe22a4c673d3704de3d4ada7477ed3ab6d0c44ef2f02817f9f411bd2363392394647ebfbe2e88a927bfadf16cd11136870a12744d73e31e3a2b766d715da0f7ff6f7883607c001c4405076493e34d2bae80e940f847e8879559374c7182c3d7846bde415511e586bd751fdaee96e941b39c105afa567f7b8fe61a032abbe9ecacc079a0a6d37f0e1b79bffc87d02c9f1fc551695b86ef22b23be83aa4f15b5efed611495aac18dde578ad72657a606e7a62721523c182a385be6898e80a625403166ee37983f61aa3dab2e3907dcbd54add3c085bee7e2790d864c6fdf044f641e657170c3f62eede0696f811bfb5fd199d77e70bf52cd55cf1a26ceb89496d42af958d19caa4811c662158ef2a680d6e0aeb5d39bed4d67072ec31bbbfbbe18edaf1ecab0b04fae8611bab32a52b2ed28c5f10ef30be5154c108bd7478e079abcd30ddc7eaca81c75f4b9be3174588cc8b9da83435316f9148beb91e9e025e23f21d07774f3d4043c87ace086aff42e46f6bce11b47758ae6ed8cdc21867b87eb07f13c222a65ce30570ecac85a185a2a0922a8c96d633339a1ca067ce57ae426e1da8b14b4d002f7cf59ed45073788f87da63b0c19728a93654db15a81c68f996c06f4ab37a52b096d18c8ab3bc44328a0a21821e016197a94625d48efd0f2a8f300f9740757aedbbcb5dd596c6101312ec0e0c955e03855bbb27ad6841cb5ec13531a0db85a16f54adb9bee1d705bb8846d0550ff439fbb47a89a71e31c31c94977d6c6df4efbcc73d4a4b7c384bb152e10f65720d29821c4df2cb981520ec701d9a03dc088b5e7e44b5864f31097dda857445a8effba1fbfa0a20bf350956bd91316d120a9edddf89a577430967a886f9a6fc97e2d8e1b94a7aae79d8a7e3e3b9e9b2f5414fbf54d6c0253e0a8eb9c0074e922930e8c9be05ea7daf47221a4a5d6bdb6ff7c78e44f1ae98297aa638ef751410441f52e172f301964acba1845a475ff067722dd117a318d8eda2d6ae7a0c9f7dd2f93fb13edb680030aa4ca77c3e6bf7c4fcaa1134b4a6ee70ca47a2cb9498e1ba04d6c28887c7c34b2c4c0d16093afa70db66d505ecffe19c3a219c49d5a644e489409bb9bdc5e8819bc93e92717200525788a5f113ccb958398b245c9772af38cfa4c43a460a75bc3deac1563ebc1252ba390960f0b47e8b10adc36ca1a4299e202bc672ea3f75e35cd81dcc38bf37584aa08aba4c60391f08b000e1bce3bbfec2fc28c8700cedde3ebbdd5a2624774c51e6af68ef77f2fb67bc6424b0d76c40fe4172a6a218e7952bba866ad292da16153201d0a1a2af0775f8769b4529444c1c1f2d73460c6af06dfda26302b2699fdfad075b2a897a2b7c8dbeaf42814b0a64c0e096258f7fd74badb8ad7f2c2bcdf67e497151d35a4fc2a3c4c871868a631e4c1379074a2d320cf251b011a72989a4cf4f7bdf29585b9060114f98e1083d91ea4e83b4e47ce9f9f3f4d37fcb69bc2fc5a2df9d327a372eef2caa803acd8206c31a1cf30674e45ad929819341f54ce08ac9075097cacce4769d43f137e218c5fffeac8d581e0b77cb791f13b1d523ff464c59c3ff5000fa1eed81b3834ee916c5839b4b81814797f26a16c8c20f27d420b43fbd1313bcb70ea3cb8dc419db413d2f52f32aa57e037686ce7a1dad42a6418720057b1be9656f478b48a34cd88d918d374dfa9399047e55aff16ab65bbfd1506464de706d4a686128acc7eec744e622b3239a5281e0325e22f450335965f79472a2e41b32ae227a0a81d9078fac67782f3bb1ea1cdfbb298d4d772b26e1dbddb48736231edbc419998f80a01a0d3916115ee864544b413e59c288a6a97ba6b291da7c901b1877c73d9e65bf4fb18784c254e7c7106aeb26ef1c2badca7a809c71655d6a10ac630b5e752f6f16df774babe5551b3886e268b522074671289022bcee82bae4e0af6d64dd87b557de31f233d9db69b3e54e8c159ec57c86cbffccdb3e938881fc8475b79e159bfaf7de01c1f720b86bcf561a76560c54f1acf422341d37dace4809acbf808028e872a600bf08cd10478e229b401485d89a1398ad305316bab30b6799e44b71640797b07894d489792f69db97da9ed80f6a4713f437a7d92f188fc5c58fc68f5840ad25f1a823fdfc0ba7a994aebcac0147928c7fb2e22841e51a4cb626ba830b7cfe2cf163bdd0a0c391b31c2338a9b71a3a2bd707ccaaf902f523f613eff485a1d0ee022d6aab6e406f22b6a1d97838cc881a83a02d085e5868740dbc2d8bcf986c93ab6ef1366c68891deb9066c18c43c47e0be3cdea79cdba64818b3cf0f04a1a42758e1b18a42426cd4159a82bbc693682f83a74f6504a351ddce6e3caf09e2223e6f5b0fa1e5d8f5a4262675fcf25264bd10ce9d7eeb81fc7a537ebc1d87bcb5f880b7883e1f90deb76146a05cd5edb041ec1f53358fdc18965e51d7eafcb5e1ee3393a5cf5e2e6a864d77bc4bffe9ed368c160b39803638ca3583fa97d7523877de5c02c62fe62ba94146044acecb7e03573f2feb4b04df8e7f819ea4b6162c3e079d09c3037cb498e31e22e9c106e54104172bdb7eec6f4ba2d75e7207763f9945b33546873677cdb98c92a97520a577e92aa97a6a417a8a25f194b049f6d521ff5b1fb129c807c02afdddfa69ad51009cf60358bba893d29f6cebcffc1caf60bad113934995c718be0e6f6d0d015a8385e5d3e6d1762dbd75a5ce21ac5c00ce0ed1db8d8524382ff92ab161edc134793a8695b55a5eaa933f38b675c9398bd241c9b1d05af7fd7e42cf5e896a61713a3154b344a4b6bd0c52a23f0ce139a3061a15413c4985799c5188c1443176937ef0ecd7054f12b781565eb28762e0d8e1ee610401cf512f027bd38412a1550d900f9b5b77b7f73c7ac0dacb45eca3bfee452964c15aef9039483c117558916225c3fccb3c8de8be8118b2e3f8ed06aa93a4db0e0b7ab54fb93d2ee40cb5c01398d49da0a42f4bb01cc45396f0c29e3b6a83f24a40bd56bffad12886194745a461b7ea764f2aa4b3b66a595ece2bbee4eb690bb3f1812853868ab5725b9bb68738c45fa6adee982bd6612095f1870d299eda93d5ae64bebce4f062331411875e66a089dc31097aab054f45f70b42fd9bed4f0729c7e69e6e8e789b4303472c7c73c2e5618909d093bb9b25dc6c0df49e6f4ce22aee752bcaeba9dd2c89ab3a73f8b1fee1164e4e7871bb6cc0a436a6b38d3ac143729f0b5494fab44a17cc25d76de422d5596538ebb056773e346b787ddfbf011e04d291be12e19d364e1873193bd01da8d2ed14500fc2d1cfad0aee5fcf404e1515ae7349de05047b9d2ea6bbeb0c3bf603248537e8a708df6e937ccbe444e4c3158114aa6ecb9684756d3522140f1a277ac9f015c36988f81993a864b75381a28508fa324dabbfdb7752a2fe1f4f14c79a3be97c3880dea40e99f59ca0f2812e04949873e33bdd0b037d74a29552c850f208d5dda093866dde04e8e639888fdfe4b26401c7d29a7dba5c2eb1fea0a14e12af39aca407fcb0087306c409abfa32d5e1115e743664be0c6d45aeb3bf4c396c9db98bab64be050e42b3d869c35cc138bef4dc70adc8466a3f3deb6d05058d7052a9dd3f1056e760228476027524058d9a931e35cf319154208c1a832879c4be7c9f23c7b133d19e610d4f4c27ec6a551270964c013d497adfc49e8e802579b76a0df1edcdf15e29ac92a6af52128a2f9511d71bfa47b91ecb5bf9f7a28516ebb97aba19acfbe79253d91eb48a32cf6db0fb433e00ed7ae051d6bf47160516dbc97a0ec3f4dff858f52539f446c9b49ff4a17d2abb9b093021b9410531421408386042853c0a2afe0f2b7ad70e43c456be88f75a80eceebea96831aabab878e184e207c5c906d9e2104043d5474d99029d362446073f85cc678813bfe8d4cff81d53c11e42429fa5a708379798238d241f1d8685a51f88e9da8d49bd621383cc805a00f72e69e6d911e7c87667822b4b92c3b091e11942b770ec461bad112edf5c4939d8f3d939dd0f6368fa3bc5fdd9b6bd14e351995d85d929bb63305a4ba0efc5ee3c191d1321edffbbab9b8b7f7ef96e46026d3c23f551c9fc1c823b4491d944a0a934b21d584c4112f2fd2f2a7bb94ba6779a5e5086a941aab01940b4529749d3a8ad1492e088ac1178d74d797094f9b8ab7f9c4dba1e2529b66c071543b849f9a308c11e4b51a539a5c05306fe0aed1f16736295e04ee90ba800fad1e5aac9a530ce443a0905c0fdf23edc3d64999a3c511c4da3c9aa01b2fd6ea894c8ed4d48ca642a509a3383d0f6a9359754af8582e3d0b9f1b6be13d23f0b7cb86dfe4966e870c01c8f5972451ba61b9f4eeb33953747342a480973cbe57df3c7356c4282136ac1d848e5f0dce99beadfa3ab38e5d3d64897ee0ac612792cba4bcfa5cd2cc3b88c1e6777a40ae9212fb2f38de9f7321463e519306f48729e2cb09d494dc981f0ab795b7ce05182ac66c3def1db3bea78127c7a28f3d05a58b7801ea558dac6998c63a5645a434eb40c8c967591366577d0d86142d83ca8d30754c46852f31a19cb57d5dc6642b5ce9d77ea9780892b9a2b736f1ca10fe69388893f00e084e507d4d05d3388f2505296001bc64d86a5659ef80424d2ac7c20b7a7eeed6612cfda3567bc0856b496f692dfda803cb17b5087b0c0e9e1a501e1112b44ac781f2307698862c9441c0210f0418763f2bc15e1924815da528bf08b21ade0cc8b2c9715edacf204d58b2a385aefa2dfe3e8fdaf2b287374a9b3d055658a33ac03ad949c3e6fea398fa467e31f34cd52a4eaab0fdedc8a575bdf19f6596acde9962493f0d82babe5d6da4397d9ab677aaa13a68a09de9ae0ed4045d479aa0ff3a7242dca477ab7884faf55cd06ddf19667f668b4589955bfd299dc7642c28a68bb2eba6f08c7ad9f5e96170913270c6463256a0537a72b32a04e5662416ecda74696d275a8bcfe999820ffc2ab210833201332f323828be7dac04c1f01f93a3dde1efe7483a51b1560d288802b5685a123325c0498b6084df6b21612e0ec609ae609a6d2363a93815d1d39c81032052ce1153dc023bc20e368764cc48ac2c15cf2f954154cc7f86bf1739c10f63df734ee3e60ac40ff5636c49f68ca4c16ece289609eb413e7aa43a27817e149e4dc67bf105d3f8d0a28b67f9ff29ac15333da2dc1ef3548042997049d45cf87c13523b82d9be0446708f11dfa629c66f2468234bfbe2f45c806d47c55ae223c5d92077df8a5351390876504314165c98e8599429c9408898dc29a9e23a98fe41463618513f1a477111480e6c7177d5592818debfaf937afdfdd47de99d06efb8039e041e209c4eb5340d32a3e4d599788cabe755d66531538c76ab22aab55ff1b860258e5660cfcf19cea43095b710bdbb1c9933663d156230181ad58a2cb7b50c8261eb09ee308567934c5bada5a2f25e73dba086a48ef192c0b44a64f35dcca70ea27b60cfdba0c662126c5427b7dd1cb694e65e2104ca597960c96193bbfe320bcf88848a36e8e045deaab1c6b7489eefae4b173cdfb32e480699a99337135582d0589da7ab245a43985eed090af98c251018d97d8775b9378f03637b3bd2b77a8d33d2afa11edf6428d02f7918b88d61a294cb6d65d8a14de14fb8d42e0401fbed634b29809c15b17648a09c494f49aa4c091693dfa38f92e5c5cf247871da0edb2f319daf67a4316a0e68fd06846908f6bde1775ea02a0f83acd1f681e1ebb93cdeac93984735eded69ae21b521958388f955a24b951bcba44ee5cfb01cdc06f9b9e394a20370ebe5a39a92c0ec7424ea059a9b0c4b09ce2ef134396fe954fdfa08ff273565fc353c0256d78daeaff20529d7ea0b8a9d210bdee5bb2612fba5271327d5b93382d3d8cf0778862eedf5bfad3518ae197fcb215d21de3b5d7a06682184259636a9cba351d8fd1136d73601d8dbac5fc256d45ab5102817937928a67b3e9f35361a2783d2efef988c15bcb4f4f12e854bca459c30d923227c9f14c76a7ccbfcfb7cef629874d682f94e90be47a127877d8525d114a557c4df95d1b5346632544c782927ec903837452ab8091a111ecf202c7ce0aa9b4b668503675621255ba6f2b6dfba166a9f1f38533e7bb4699bc4fc6a53b13ae4876e378fdf947be1ce58b6dd18035e2c92a29a6e29fe5fd226ced8e4b12c0ca79346bbe4405688c114d45e95dde90cfb9a2832268279617448557e459e39670df854d9a8928392eeb480b288355767023e19c92050d3037688c1b43322c0953e3d025b84dd05df9036c67c5c2832b86606dd27079bf68d006f7b435646a9dc61eab7071f2ac3b7ce230d82b9be6347527adc14816cc9473c84e9f35811dc859e87daa72280a564d002bc8d4800d25cec237e5836ca3478504f748bde8c41d71e9dd50134e8932dbf5b3d65b0f5673f5c882cbad0bd1f6a645884d593bdc11c09b30fdefe697559c3b7f7d29aa50b37cb314c04f44d7263a12882971cae429a8752f005270b3331039c529cae19a48e61a748fc4c8315ac2e46d49a2467ad9bbe01e04058d6b6fda895b68a93581b8a4571866b8066f18d343ae4a651eeeb65d948475539d3e405d9278b66f26a5974a017701838feec4ddb8d19834b4de340feaf8d0d7109a690bfdc39f67258459499226ccd1b54ef364ac6daf8bb8c7c7656bf1a30a981e5e7813b2803bc29c6315919e450d16fe38eaa6d91ce49b1a04e08ff57868841875349ccc15477e5c69407843f6a0358ae9e220aa5cd9cc6360f3cf8aad6b753751a3c186ab34c952c06ccece5e359153aaedb267ebd5dd225021c307ceaddbe988484a68ce6e340e0cdd0d73e837ab06d06fd48846633de576fcd313688a38bd7db49fe90b6e3eec9313ad0b2120f3031edaff91f90c7f1b39e7a833e79b1c11965b2a9dcebf5a7d17c325ca957bf9e6dad19c0b702c11321d649acfe85ae68486ce82eda4dc074dff4e2058b1b3301098c6425b485c84c89606236dc7343894b361315f1a3ed5cdce37052c0261261ecd3b8b07ee184a5d384eea9420d172b0a0b59e788b72368ae8f04cbb04005c700c93cea7dde9e25e88a158b9719d3566d35e52b094f0b9f3e41c7f9c331b4392cb8195a1943bed5aebafe6643601e125cfbdd69db344c097440e06362c0c6c258e67689bbda8bbb0e5cd2c1aeaaa168bfa46a2a662e8fae38d67892f3b7e4676c9c7cfdc969aee1f0b7b82540bf035f7e79b3f412057c977349b70ce0dcb53251225340adb9ce4f3d14d9196166ed0081c2e1524780bacb0be2c45b8ff8e22aedc022dacd92940cdbbb5d2579690752b0c71bc96d68f252eae9c8066ad2125729be115193bca820b4f46bd1f08ef85df4cf8ae3ec85cb35f6a6ea96d734eec2ee634a2f66feb193af072ba62e9e6929332355272c9fee7b1960539240e41d7222f9f2fbad21586db33bc62b9b6001bf570ca61d967e022c3a612a820cab486faec6343ed2ee44b7aada64e99f9e692646d0a24e90e9b05141ef98efa35117c27b13367f3c2a1d797b2a2c66a31e4866eab7734183aaa0f01553c5606d9e31727027204653a08db90e74472c0da94788290b417ed8877914a0d5d85dd25a3f87744c1b1c7f173a814bffddc347070e92ed12338ef549e4c2c9bcfa6e3a4ce80a71c84f872856ccd81a1515b1b700448f1d1672f844b888047852521c0d3dd5024ee4e311b626ecc763fc1780c75c9184a15d25442b9b0ee195dd09eeb3f5ae77f3e8ff42914f42540efd0cb7dee29f7b612f75fb14bb1d6209a6466d943c1a72481ccda12199758a03601cdf635b137b44d68aa466e15e8dbaf5321f18dac1f934c772b6cfcc2e6e2a6d6e7fc090988d34998bc789d3786c9112f58ea8964c17a233190901af140a6b6c2b1f5c46d4b819bfa1ede55a14077644b642aa3963d177a6e823200bd065afa47a489f486f04d991f39de23dda6452d49dc2888bad319c69078b95a80987dc5e8480f15d12795d57aa5fe846718d0b0ad396a854d33ef9c49fc9c74e6879dce27052ba4c65208d59edbb5f3b828a8b2e8046745c7c0076fed8661dc594429578674362de0f0051dee53aafe5b461b888cb5a526b5180fc61d9e901d436eaf16891dd51dbb9219230b963400cb01c7c60dd5bac48fac57133cbdada45f67ad7f915a7f00b0a8c369592be7a781ec3befdded1e9bc1ed7bfbdd5c20fde7bf92e741c29a535ab48275698d4c6f0a45c66a8f542718f65bfcc4720270a686e6fe021cdecd923435d4bbaf22c8a3dedf15ba94a38ac8979848219d49432aa76e4d4485177f59b7bd48c0bc94f2f279f898748063a0271ff2ec77a188eef6e3c61f231cf525f66fbb4d18f44c31e76632dd1cd51d1db11a2c685b4149fa97a68ed22247006814c6a0501908c12bef2e0e4217f52839f2f0853a30df14ec897a1914c685c1ac21470d00654c8c37663bfb65fa732dbb694d9dd09ced723b48d8f545846ba168988b61cc724215fb090a7ab738d185e8808be6d9f3eeda7d624db3e2e06b283406ee4f12c47bf6dd34241cc46792d967d535e094da75c6194242d57b7f06ee84e8fa2571d07c97547413520beb3990afe3c63bcfb4f4bda57542ca8d94b13cd1bb3965782aa680073552aafc4828342718c728b917fe398887d81387d61ccba0fa16bf84379c395c146c882413013c7400b3680f77f4c258d67d40f8c78bf389223c74349bc03bc98dbb8a01b037320d18154a21597ad09d0dacc36ecd914ce0cff533e7abb4ffd60dda2113c44c8d58eb677f9d30f2ecab79e11b487ccf405e5feb6f3bfbdd0e182152dde8a3a3d6fde72458e1a2ef9f2ac7a4c914398876485e8986a010cadef6448020eef2ff775287c6668d03e3309163825d60a87f4735485a3aa26ee0fb06f41c9a95269216fd69d838fdf8507955d9e438ac3df64babb9d7dbb17ac1eaa0bc729b89a31e1e54f9d440c2d4c9b20e8754fb556e9fec220f7cea5bd8d0167a1a1ca42b1cf5f60fb4450e6a4da17312184f05faaedeb12ec5c3f70ffdbe16f9798554f7e8bc568425950252b79a4516f95cf91a933523288947725c4dce548577472e8e9ad38838ca6ebd2a96f6a063a6e93533a025cab5a671fccf6da367c47fdc813da7ce23b41f1caf4080590dbebd8e5ab45a43004cc9ddf6b7c1bfb93d1fa00da3941eb17c90394932f833e55e89b6da3b35ff8c545fd5e0c3ee85d135c35c145ee457b9f8ca4f2b706319efe9a7fd2426a7cd9772d5045b6248884864f74b45be2cdb85cf39b8c697556d55d694cbd905342fda1eb5e3b721645977314808124fb24cdd564b209b0643c0efabec9d59656fb8ccbe9efe947fc65bf631221cfa82291e09248af1295bb296f5effbfc35b5cedad7d8ecbf73dbe3123ddb11e46f0405b1a1c085b4e1f6266201096f72ee74b62894042b90c5c44f1ec6959418f033bcba2fa0a7e6656413b4a98e936bf430da0489b6d83d0ad76ed418f725052e9fd29a1b4b8e0014241ef157f62471e7688ef111777efed373d6c4bd8641436ab6cbd3ed37948c8ec48cca84c67f1f288a6990c3ac9c608027fb831cb9855e45072cea2deb480625b3f182c8762fbe3824de5638fc9cfcc1726171cf174db04e0f6a5f45dd34e79970f1cc8b9ba2e9b6b671a3b9be0d4de7d18d234d0616d3d64df8b5dd93d7bb2a99e20a569d752bf4bdb81bfe8769be93c3f30a0f2c8d537e217c605d95acfb798d66cea1f212ffa2b916214fdf4ee935d817b89df0fd99b65859e13e59211306c9e47c063008cf11271056562c09384e7c8f9161da04211f2115daf854d0bc42eddfb4fbedc324f0863b1d8a0445265e2fbf47036e1d74093a3490342f3831ce57dcebeb71deaba154faf953ee7f5de5702b2beb23c62d14f23ac34a3ec42e099650936d72b7ada421d48c5c41042964dc57c291718a96b2f79cc6d31a010b7527df3dea46eaa5996b5c190ba290336cc2b99d9efdc76b7398ef2d47278b44919add6dfa84f44dc1aff651da999fe65dc1e53f5c1f28f5d77486591f0daf83ff5ddf8606b340e0ed4e47b9519c8fccc8686f0a616c1bc04f1906fcd332fa241eff5a38a7486d294ce4a4a1f901ec413d149b91375b1c754ae4f56b0c1e07bf60edd1d854bae5619101b1be4980320e1c650f665662a76f7b66b636124534b075a7eae7878126343a03d360cb8dfd6de6b83efc37194939211cede09e4f2da1bdbbea08b831cc0ba889ae3be791aafb3cacaeb561f57e4d0c85e0fcf8724efdb9a8639e8f5333727d0186a22611c7308eb0e3445f7db3256e1053ddc975054ef9ebfc3b456be8e327ea11261fa4dea84d43510b9828944cf67a9b2579ce0cffeef4f841a2c278e829c1c25a3cc16dbd08f29c8da46c7e4e15f34b4691c3b29b09620c54001d5ffc03170e90f5ddd109424d0a3cfcdfed834d38d8c3aa1c92aaf9a18cd4e5c30a9934687a7ce380b4f779914ebc19f97e971ca9c82f1b2f299a00321e66dc6a053a4e248a607e2096121f8dce6d742f8df404d49ddb7d81e3f2eda2256c5c68dc79b0d9b30e3e43e0e3b490fde3a408b8248637ce7b399b5e5ff2602667de45fcb1fcf688b8ac7111d6d9297191121b79a32141de60e801f51bbefab5ebda87e28d83197002313ec585edd5be0856be3eea5681423ef12c44c0b3d0486af9b53a66f3a11d7d74e3685b731437abea879474a6849e67fd90d9d9719f5257844440c8cf3bc58cd02566d1f973731e35fe06dc91ba577e55c600e068a6685432bba24d66281cb2eb6b6d83f151f4b1d198028c98a0e1d4a23266500993fec36d91eb4f691497721f3bd8ebfb6e311935dc140f2bb6d21d6b7c86b2f4d68a379d5d6859388faa5cf40d356467f6ccb6eb30b7ceeb8abcbb09face838aecaf235a74c5f564e7d9d5f2560f97c7aa0c1d5a3c6a56289ae6301633ca4c6c44b2092d8e609e7eabba7fa2acc400aae683af1b65a83f9346031f08cdf667f98d477b7ef0e4ded679b0bc8d880f09823ad80e9732fde59c3a87da6a1fcf70b314e3dcd742bf111ca0410f0b6e2d4cde255d9e663ad7e2a3d6d8e4b2afd2013979fbbfbf0a4befa1de0ff9b4d5bb352f2498e100c3d2b15ab99ad06af49a73fd3b1396aeae37c50681620f0235454ce5b72e68ef845acc1141322ffb9485436ec6aff41ea4ff3bdb18ebb18c23380ea26b72b89af2fcad880c3355fcf62f1a1eab454a97850eae70230183ab261ff4e5affa328b7614dfff8912e4e7aff4427d67682ca1d4e2b7662e47f7f794799a1ff3498949a45fde0826554f341871771b798cfcb60b17c13da92370fa14c168c1e3d50f4e041a1232927f077ac623026950184d5cae2a66670228911b2d73db6bd0214710fbf0370f2bf4a0143f857ef789be80fe24771162e7cbdad3252d7c8e76b2b33b126e96de715aaba8fb25674694d45a23049a4cc1c881b0dab24ac69a160df614dde1cc50f1258ca17f6f45c6fffe1b53c50092f412fea56a4b58442f5c976246c4f641e729c9b58632df850939906718fc566e8a55774b3a66d27faea8e39a395e18821199cbd8cfcc02bf7dc04fafeb00e849e50e9ff4a38b45d3a8897700750fc52750bfb048f691555fa5226058327952bfa4bced443e2f2edaad8cc6377250888c2509fb98932963e00fde871287dc122a39dec3bc72c8fa0f1e116591c9d6df3b2f17223a1e0aaadb2e632841739f933424e2d7bfe9ff33eb8ac5b9c1d3f935bebf55b8c00fab86bb814ed8875e3a7247f6778de0fc2868fa63f8572a394e2881564413ace082a41b98fffc36d0332be01eeb4aa221db15a64a47a24d623c341d9470e76329367f45d60527e242202c971eecb286139da6999e324f9dd749c4fdfa5a9885422d74f4d8ecd00c5c77f0d766ca4a0f29d6b82ee02693be10fd67bce86fab85d3de21931215793767b1152b972275afdd1ca6e0b0b3330097dda8b4ef2e94e756cf019b022da7d5fc5205fe2073c9dab5e61f5970569227e450f4709f25e91c338691873983d07aa2d14fd9834cbb323cb96de3bf9f35767efdc79a48d41ca7028b5de228b68797c3b55f48300bce28ea0d3f39eeeb918ed03abe7cacc7a42a3c53c336403421b00784b0c4c73f77314667ffa69eca2ac380ae35a21b5f13e859567dfe109b5345b6b5e0c9b9565aedca401bc43fc985d6f8ceb9a51538f093e229ca942a4a90eb89df7be176fecda0fe2c301d5248371bb0f2d6f03ab3aeaf5f4445b2fdd04ef3d947ce869087540d4a92c90c66e4931431d10a1dfc7db28d391c8bb4fbbaf2012da57533968e929547fa433bfe2d3e5303dfcf78cae5b0cff838e924b4692e960f7eec72e982edbb7ef93b0688709d5a9f8593bb368a0dea15200a7ca8695914f71ab0cf09f2e9f247e61d06865d348d7d49033fbfe94e6e38485c47584a16206d2f5e92885cfbcc3b6775b68841a88e15b07a80d771e6beba384aff4479ca2aea133277e53fb7cbd1e3b190fedc4dbf015276190db25b7e1376731eed7709a6e67cf8e991099253a3e16d206a7bb8a2c8958282d329310eec695120c3d03926fab30e622c49100619f714df4bae5dcbc3f03c38c854fbf3ada761af5803fd2d8f5bef7c077cb555bc8b253822f2c1bc9bf8efb54db410becfa721151a80aa1d2cee1891c322e6c504143ac580d778d7a9263982d3d513e2caff1becabe4e4985bc0163ddfca48c67938a201d5cad7cf83fe862c1b2679f247f5bea06c8f2101849864eacde15fec845f1777924b82e6a4e8721b5426b75f9f5185dadd1de3fb4fdd81231df670b9cdfde78166e7fecf947a79cb4f54509d6 -MD = d440079d982249c51971bc2035b6dd4594766485424563d0e4d6822b26d385c9b415702dd7aaa6a1b4c180938c4d30b0ba63d09c57cb2312d49ddcb8b32602af - -Len = 82600 -Msg = 4ccdc1f4dd8a783bfc8e8aec74c836189d7ebbd2d3ef6dee28370809567244caf824aa66f9d9a56a4c08dcb5dd3dbfc3c8776032cacf857ef45bfb10a7522d77bc71f5f5039db13defc99a7b8f1a5195c049bbb0a24a0ff7482b2d97b43e320e027a49a6e31fc43c4d996b4671a71315eebc735744a634df8b6d47a9657e7b1831084f8381a704f0ce40f71f6b2c2ecbb898312c982b1bc025eaf04ba259311db0e3ae93c57c9ce0db85e70d65f0ca3f87a49c398623ed217e6ad18753197ca3e9d30fde98e8b295da31e319473c0dfac4a95d85f7d4d18bfeb592646004833443a01a6de0316f95350c924af9582283d56f1b18d187f0850d92daebb1636f572611764787a0fa6a52de9da8648c2f6224be7ffbfe85719713ca51222e7d6795faf0cc74737d7c9b9b6fab3b6e205d20175e313564137d497825a013c09c94742803c3fd8e101cb17687650c005bd3441816d8ceed7c3c24a46b6fc64d061e7e161304e9bea003334ded73220386ba568eb01ccf8006d5afff646541be042c3b2de73640ed7758a9876a7c855de939dee1f2a73f04fb7172f2d82b8efcdee632d549020b02db449c8cc6283ef8cc796578a51e2663a137f6e38e69b5eedc75eb77ff1051e515ef93c4c92154ba77a172bd912c8c844150c23b4fc6bc7b4601ee79d2071a7e6d8016973a0ccf8d31da8e177d777a4f22e35f63e3eaad8d63b1c4458a906eb52a1fad6de394b858444c40ee32a7f7ac8e1953c1127e8f0b7caef441ef52567296f6e1ae8a5f1603f61e10ab79650c83cb1a28bfa42a6bdcd92006d7c8f6d99df72a39c2f815f175907986b41859c0bc220d65c4609548eac22e826edf23001e96e63e11f55f519859842b72d72a1b3fdb1a93370f682e1c7f00f16dfa82d2ddbb50760449e53f539b68864d808025f43e6b3982794a265a57bfdb3ee2ba57c2ae906b01bb4ec28e9c4c20aed905e7c49325df0c66e4368c9493c6485f7497b6b6cfa5711442e331a6597ffbac5f689521730e3d9ede699a7ca33cf339589b9f1c35abbd1c6ba925ffb62d9ebf36b051317b4c7de8dfc46d5818c4a7370d6a6729e9044b9b6e1c50ef8db2fdda33c8de0b6524340e8f51eb6f19e7cc223c0cf422143b8559f6449bc0039482c7fdb726f75a1bcad69717fd0bcf2bcac28c8a3052ddd5d21da92aeeb8425d934d3d850f3d82bba7099f1e8c72621b0adfa6eb01006d5c99b12fd5322172949a339b3b8324048b346f4e6f7eedf93cf24131375173eb5844db314d4d41bac2fe42bee069f50813d7cf4d11bdc4bc18ebafd67607f4804f3a64579b2961436e27424f7ca8f9b8dcf9f2430c2f3fd4365ef33db10bcb54cbe31448c6adc835207dfbf5182a753a6d03a1d969bea6691eb1d30df045408e53a7b2add6c0c0b761683459bad6b4b64e5ba2b72f5140a2594e18ef399d9b5770ee082dd44c8ff1b750b7236d94fd55086bbd8466cf56a86e9b8a8a96fb23d6a820dc71c7387e0cad9d4afa364c973e229abce9162230a3e502f0870e47213486a5f720b76cd530c8b7b6861fe6cb9b244f658d483116ba47e9138da969dd988fe521e3accfdc849206c2702f4be19197f4821904e450151ababc4570499f2b4d492162af4bdb3192f338606e61214a02f0d934502325dde9dcb1566acfaf144737c144c7c7195e50e4defde511d2eeedab338736d6df3a39b7bb6aa0e4547c0518c732fd2cdf3455427ef09b443ea4e08d57b9bde5c45394b3a126186ed88b1055fcd3586075db2876dee098e0ab9564fe0f73ed381d5181382d34dc568168ef5428d0e04c237a51e6c776e5ce62e90066215dcfb8315b89ae253cf485983c2a7f13d09dd8313a59fc005a89f7abc73d2d561e6a4b4a9a327d52e566e2642e4a3d847c98ede642c71f53338c42cd57a2bb765fc7daae36070d7cd83c542f67d6f5457cd8718bbb23b686aaf79612c3b77849c7ec4ea6568dc76abd7ec53f0f56111c77654e68ccf62b6266d1ddc03004cd96ffe38d7a224e11e63b321cde4d52f8d215486ac59ec6e5af1022fe20c8122027aeb48172c3d154b6fa6241524953122fff88afea581e4c354ff3e17ab368dac27d6510d6619ef9a3a3151be32ce0c7fadd2d031e2383c8bbcc4b6e16198e6430140024ed233e6675de5494db1e827ffd564050ab277fc10b2e328d3b210d24391a8ca400323805f45226938046c0a2fe13c77dd78b999feb1eb02633f36c84a438127857b6143de8a893011ccd2298c6bccd72eb785aca2444ce2144b833eb3b1599883ad65b751887a3c4f5da30c91df857172e1548ab7e479366b798ebc1c45a29bcf1ba94174d985fc55396739eca6f6f54ea8beda8c0d008ddd4ba1b6d08aecafcc38b478a4f83ceec8029727d97ca1c116501d12ab486336fe2474b59cfba8530fa71fc36e6eff822c3bab5cf4ab16736e9a07a9a20121e022b6603ece1256140dc933c83da84e64d6371c5fdaccb56abbc8f725ecd1bd17ff540cc8e05986714b21a8ed9f2eb9f56a977296d85c1f45826f741e0834a52cf89fd2da705bb9e94c32d7ba0f7cc2b26ddf469899d3a462571006d860947abd82fc4af9fa7350ea959f58a40b2ce93a4470f0eb8bbdf56fbe3d180ba29b9e4842ebdd8dfb4afbf39ba9a4321e89adeb72ef19f61a9582bc0c69302e3a94803bad01133cdf3d0ba2d2f432eab64d81449dcc2a4ee2d4ccd5e606d7968529d12625be845d22e41066e0018d447ed2f3e4197a9a6c6106445bbfa886fb3ec601863186998572ba9abe37542bc5b4a476386a8ce2c5119479ac1db0c6b2b3f391ea74fbdb3c2b3b1b273d6e96e5144c98b02575abef7129dd4564d20f63812ce2b15480b1e7c8e0122086a34738fa35dbe9ceb75e420c110fc6496ec97422fca47954a7c62ee844003897a4c527f2faa053cae462734f04618d2ff99d6b15cd37a0f9e38067f5d165ddd4e599387af5967cae6f60e9b65e73388d04f3bee6291cd6b8d669296e02d39ee2e82bf11ed11ed2fdcac22bde99c526e51354f5f09ae47915d2f8e9dd72a9ea362ef5d84af7b9e51d891e903430d7f6cca74996d18cff16a56ba83fb08b895e431c9f548be3f821921cdedd33de1c16a8233a180599ed1dcc230f9183b7d2599e5380fc5e204a16f0187b6969dc02150c29bf00192c3f2d0e7b8765c3a2156aac4633463e272043cbee8cab52c54a506d2d40d568ce6592f0f7b842fcc4d30001773eb8a8832b266a117b396b2425774fa0580e90fae10df80a0aaf9b8a9bc81258fbda29aecb3d7f23cf9a3f7353f838257d221e3c31eca82507122c7dc011638e03113e1471075f9812243c2d36419b1f18a65cfce8bd65fb35f12c18f07a8968ecf4525ecd02afe0cb8dddcc4ce1fd0fb301f9c775fed5df0fe316e69d71d88c01fa02e83fbdd480543db0eb1857e279f4db61265a3f6c630d6e89513785f569eaa8dc3b39a76209549a41e42921cfe036892f9415fd9e09a6d9d0034f2544851f772ae24b3dccee454a0d41efce39d4f091b19b2997ef4574db975754ee6a6018eb8b57f51f99a19eb37faeecbba4bacb8b93a615bcd498efea5bd7e93fcb7d5f8c8a16c79b4cb5c97d1565907885242fed423f5acae296806c8a0f6c97dc4f6bc08399235f5abd7ded6b208b937f83862d49d179509da0def89e585f953158c62e2479a8ca480af4baed4a2e9ae86b66d21706f1cc6a5a4415256d42a65f2be73bd912b87aa930f63c184d09dd543e6a52364a44ccdd255828ab98b649ba3b47601e1ee2ced2c1db0788c3adf9479ee9442405f2a06a94a3c98d752afdd6f97f315fd8b85569301b939b387b6d36ef6c2e7ce47c05972a8f6e678cf1413a08f7263ada99acd0fe4066dc0602b7a6c27b678d40515af749a39db63ad9a257cc37c52bbf0713be9ee207d7c6c4471b9a8f85f1b4031eef8468cdf62924afb4c5c984aed0a14866a468ecfaf540ba09da210026ba11d0046d4775a3b272a7e57814fb30d9c8b98d715d8cd20bf88f0623d87cb8cd0e0cba66d82b4b7134594e75b28f6e151dc577b8287de9956c2474ea0e32145748239603936569efea0264212ab7932ce11ad9db62269e0c1c18fabf4af6b5f350c31bb5f1aa6b892451db1cd60a5c7be328184d831d8bfa78daebf607013a3bd859a0007b70dcd743b5f7cb4d0e26ac745ba79113c92fbb02f8ed30db080d6b1f55e785b93f4a44f8ad6ebf08299e1915442c489ccff5f85ae152e23f61ac3bc6464688038c106c93b6846a9fe30f5c56600ad676887b2ce122d1ac9cb493184db941ba12edebb8a54ffd406cd116e0b84dc7cd49992bb3263bddd27b675e7b161d6d8e4fbb18b3be082de3076a2140ab5be78f7e688435aaaacc0663f06aeecff12e67129a43e84e4d9ac4f814daf6b018eeaf9d7d112eeefe40baeee644eddbc308e71401d9b0c6aec868a777906d570341a01f4d5f095384c06264cf78f2ba018180cc6866b7c79a3b409df8de2f10b995038c6fda5f78fccf9f7e028397eb3b3cc694546767b1ae67df541f30b67d9a3d4c5d4aff8bdfb4c2b48325d1380fee7f1b144c584b2549d2b76251249dee23bedd1a654b38f85b4e542cbffe6d7889dd10b4c6b5dc92fb004b3145264ff2f4ae584c5559c1433ec6f0d32777a2b59beb2a0e4a0c867b30751d5961b2371c7b60205b8187cf50fdd11d0ef2c97257a30dd9894cc8f34e98a590331d54fdcb3698d7d07071ada216d13b48b85056cf2dd9a1ae45778dad82266666fe8b0eaf949cd133b8940697085bce08dec8ba9c9ab314e5da94cfe88b5be26d7bd0e41a3400cf0db05b44d040e557c7dc8f3840884e95d862ad24b022caa6af1ba3189b835903b6fe53f2ce5ee26b2e48003a4b64f0b6fe743d4664d70725a4648e16b410fa31d8090a9af1c0f77a8497e84b2dbf4dfab095a18fa71685e1f5dd0e58e45b88bbe956eba7daf57908634293d55805aad3a73d968ad77fbb6e1beb8069ccc17904536e73a3fa9b0b8752de9f836ab6bbd44ad268a276613c1c7f2690c3adf14fcdbeb63f09c0f01399dbd267bfd670e56f040ab46114697c8fa804cbf12849715a73d4aa53deb3259256b488f51b92bc266b3ce6613206e13a2f0c8e6ccc58825d2b30421c9442a6135c0b7fcdaabab47cf8ef9b0d4fb82eae5cb444b10aacf7283d6f92ce923d399f743dc8a4144742e535a93eefddfba95ee982ab4843a5545e32c928e458f1448917c1d012e8c6fbf199e04e635d4fe5be3dfe1ead37d00e51a3f350e8490d5b72bf3e328488c84414ae2b36125e33686ed29d1b5a37bb99c4f974b764e2efe2fee3197c8384b9cfe0daf0a2675134a5c33fc62dc9d3d69b0aaba3d8c4d7278f601bd9fa9a5d19d3c8b8b70ffcc6d2326dee3fc2968caf66a54327119266329548d1f659338277144eb014db2d2f7a72b15630762ac2a4a12758751e4840afa93bae04f4e9954fe5e56960a0830bbbfb50106eb5013664bf0343f44b70d6dd3faaf87c7a16f602ed1f4d40dc98ec1540ac95310bb4385e34bbae4b15869969dd0959c34566354e7e7ec42bfbd930f4c7397d2df6be48ff96d2ffd0290418d3e5e93a7fe331c3713e6676888abe8af9138900cbe279f8d749cba139e273d58a0ecd2318c01431199178ccfd15d35a909a1de8816b81c863e2183adede50401a9c17ac148877feb61c284fe009921039ef6a9ce50e702823e44b35357923f904327b2e0998f79cc532f767d7f2854c7377e1867d27af9895c4c728e44f5950b5564a215e7dfd8bc57a58bd5b4d277fdbb8254da0639aba48083e7e41cd7af7cc7c173e89b4145c3556eeb8d095e32ab144a85af53eebdda922f3bdf470034ea81864de11b7a68ea35d0bd2de4962cdb291ed16f205fda347a9995072d38cd5e6afb5789d055e838df142a3eaf400e94e24663a1d755a8b820091ee3374722df6c68ba6722996eb63b815947d1257fdf270961cddf98cf706dc6fefbcbf4da756e149d047a0da16a326172d0b20d28c3e0b1f47ca0f0f864471a5cd753089e28594829e63e7b2a5eaafa9f61bac0b048f58443348225cb9b984b6000354c1501134c8697d8a9b09a8c9606835105c1764ecb7780edfeef1d46a234fddb85e8078568db9fae5fdc24c17bcfbddfa50056d4cdb7e549450df23a67fd56ab7ebe4397e450842a67560630f12398cc6917ef6dd42cedfec0cc235de2e6940ffe40bb32070fd0b288c548c0422a9b8016ae490226fd1f7438d5b6965b143e6ecc16793c1a3d0ab089d1f05bb40b4e64776c6d7c0c53031374cfb6cc19b2dc2fb1e7859f6505bb8b332308e891ef39de53fa62c1ce5622443e6328e965e6f6bc755be541308d6aab4e63974e1ffde55771ff30bbb42d036d5c3916d487d8157ce01ba30cc3fd9f78a239a677a75ed9389a24e05006012ff897f88775c7b2c0d7b9cfc7e6657ee35af64b3c4a70399de79611796a0bf92c4bb74884b46c998035ca1f57b96038bcb9134461afc4b7bace2d6d03f00c3e84d084d31479c0b7dcfed9b15d6cfa52b5fdc2ca1d8ee900b75327e187ca51f7beedc63e3fac09345c9aaf30e0e77cf4538ec98579cf283b1ce04b140be0224d630c44340d35903888721442e9122e4820d4f01f7c5bc99072dc62af9a1ac768fa94c75b87fc9deae9ecd08f7fd55773a338013d2f1814283faf34593960876f0bed175bb4ea78720671aac0aa1840a06420c28a98ef512b0ec089bbf29aac8b1f7efcdd9de568f9676a6b7d72c332f5ecf5fdabc1c8c7c16479297cccb07ce3bdb13e8948d6b6a7953ddb6de0be739ac220784bb28cbf10cb41dc45d08a40a06deda406bfa6aba31754c239fbf14bb86e07fc1072218143ca8069be04103fe9b79bf7fd0a3b8d167515e889cc440477791450a208715580ea9f998e722bc3e72421ff152f7fa42738ea150359a0e5fe6aae3eaa7f6383efb104345e22c112c13be884f738593affe73a1052aceb3576c93c8cd0dcde52baa91802d51abb75a084584e4a2cb095c50a6ca21ccd0f3d061f2803bb29cc0c065a43ca9c640234ac88d924b7146efea22aea930ac2f245d7f2d96b146e14f7fe4bee565a087d970cced4d0e6f77abdbece1babc3957e9411cdb78c82b19e5bc7047f6cb80c13e6e9dfaf187eddbc1a407e67b1f04e9974db352a2daefc52828c0d60d55e7aae686a41d4c528cf1c5d50c2366f38f32d2b5db49a183f5618b373eff759f3593566b87ea99f8bd382cd1823f0ab448e2102c0d16f13dec8d835a431aebf20b28f28fa1e986d50f4d6b3bd28fd2ebb265d412c1511e733587a51485becd18c8ca6f659a708f91e3700576a5ac6c046c4c930c806e95ce510e64f87f51855dfef6118fda361099ea6e801453fb1288d6f4d17bd2e5d399df8047788889c14c3e4a8d50d990a66774877f976612730372fd13d3215d6480217bd10749bdfd6de716377b2126dd8522593862648919eed0c3deb5041bd4fbd75f76472b74962d8a17a441395f126d74625f27d7a553b560f79693f3c7817751a9bb9ab6342825a79d68559aafe1aadb21683a281ddcf1b3f6dff268e7168d30f9258472732fc0c035d81abd9fc7a7d714c82bee58f22e3a502f52dbd0e097f5bc2896d8b81999546f88232ab530fee8cb137f82cd5fb57471e927e53b9c420061594451897219e4a90ce15a76ca1a90a2ce979e016241e2faa1f3ed8d95f5e1972c0f855dd5cce180bae7d56adf855f3a4e16888b963e1658fe498d2d5a3e39bc056aecbb912ceb7536a923e7fdb9b500368eead288148efb329b2cb17585494e99e8e00940a452f4e4a7be94b13232830c433d6ca46fad70036b44a06465c0cd4e0c17ed70ddc89e69661df77699483133d5e8b0779a0255d52c7d80a34a10c69646fcde8e33bcc02956ba66da29769941d985547e4e1dfb1c713fc8beccb9b9071be73315409008990c2c89389d3e39baa08baf24d660fe6dbbf3ef13483c23151d9fa1828ee2d65cf8dcd53e5f1f8102ed744707dd7bce3d7f326a5d57188344ae6ea0726945c7d9af53b147d98b1dbef2c7b2a3cdbef9003d93d0d973cf581a50ec96517a095b939229c3d1a7114e43630e686511aafd5a6960a92418c1101aa78219ac3bdde01f33b773884232c144a0a0ded863d049a0955159c9d0be59aa04d790ef291413d1269556c8357fe5175e378c8a1ecf6c7753ce794715f7835d1b45a296cc4c555dcd3bd41dfb59484fde3b07d6bce8e44307307e08630d2bb83d64b53f8ff72319aa2371f5fe4f5962b313c76ac8cd3f98223fdeaa427fc12ffdad4f460ea51ba93fd4b6ecd8d296d47f6a4192ccdcecfb574521992ebfd248de97d746a2c69d6110d8296ef5739f3995971d0b23a85ac108d8dd41a25ddd7742bcf3bdf6dc36e5af963ff8deb2c0e68832a02087b027ada973685027da515fec751b18657656bb7ea771271f00aa8fe9c5716f4374d1f5cb9d693139a5cc571e68c3e299059b370084435620fdba8a1cb80763f166c85de1cf46615250acf16af064b8ec0a730cd7a54d127f0a8f69a382e89b1c26992a7e71866d0c5b71a354b493e7e9055c816692f4f893a787a310ce8b711e04b300143cafb0c236c9016e1dd81c1a76d6592fc5b155096541cad6f3768291b1b463258938d90e73118009a487a1faff6ee8a5c628d44ab43c45888a204bf18e0bb834dfa8425b80c9a3d9e1493604df94b46b0cc1e2c224d5a7880b1f39c82a2793c4b8848933e07ff1314c8334b2b7d640e211f2fd2a27ac6567eec9e88ff6a67a579c341a222292dcb24edc1aaf18a212ad7e52afcd4d3f03aabdc6b4a373f6d060035d7190c7a0dacf80aa74347286ae1f9a576735f5fc06b2f08c3acd42973a6076673c2a3038700b5a74cded360277db0e87bffed271f3331f80f747b3061ceb7dd7b6390cb840d864d1845403940442335a1672331f3d8d935b56bd65d1fc6382259c57bdaea1d9182733f34bc9d7f7b145075ab8726a350461f598db796d6b1bd73b00a39a376fed1c59357f02675df0df0ef2d319edcbeb3b3064846ac464a3733ece8ef9560f6bf760a53ddc47078a9e99e503545cb4b05db39ae134a5d2d160040bb04aa25a1d6ee6ccd8b5db66d6fa34abd9d01b81dc3febc672559647fe541752c81c80c269d96817003da90e7e887bb1c71bcea5f7583551c85bfa36b296053e26dd95cad9cd410e14c24460e9afbb814b75daa37a4d4cd75396662166cc4a286d0c45e605c11e3cb6e2120090f680b4d79cc40cdd758eb194b34e9ab35d52abfb3715a6564b6c0d472bb6601cf377a70bef1f44a967779b1c2137f500dfbb3361dc897e43c2970a45fd95f1d60cece258fb40dd669993de4a7ea6e2d7b9e049216b15f066dd4bbe43d6354864c97ce13f3fdd598d926015b01a0fc6c0726e67ca614f8f27e1e683c14408d631bf844e3f2b492b96d868bbdd81f723239fb219cd6d9abd1f76e4153ed5a52dd535bf63c94c18d60ae22a3b3354e18aa9a857d99ade8c0cb612e0cd2cf98eb1c7e27aec7e20c0eb6226013e51f1535f9b12dc21c33297f0743c59260c3e29f4723c4322ce37d5de353a9a2fa9e5c124a0659b7cc718530ae259b9ba6d020b887cb9a4a129ffdc10ec966179bba0bf8c3227225526ee21ae78f18ef4cfe3a7c03fd11c0211f7284600afd3b6f7c0b2d8c8ce1d455332a86db0aa455f9551934e441915b026ac6ec00a0d8d61feb42f9cecc0d8c7ec643bcb21da79655dea327511f82e25d88df4216135db0520f99a6b16b5d15753117049351897a09a0c19f73204c1ed982a7cdcce9f690b1f1f87b5cf03b36e17c8ca6a62db2c9bda35ce271cb57d71f5f04d748ac0a3fe39848bff8e30eb96aad8ce915398a4b18f05a3974a90bd4d727e0a6b2e30086910c6fbbaccd3d64b9cefe1705fd7ac8c38ea5eca440d1dfa8e322833317422b635657b7a135320076e6c976a002e80766852343281b0fbe3a9ab2b6f3cf37f6007de6fafea3545449fed74f0ecf3dd1a8debe8629bf2e3a36547887199347b1118906ceec9f0b2ad81d0fe977ece2ee31a05cfcceb6971b44195b3ecdebda223d839e7993b2bf48ce4b598e02e23d26aad3e7ee4087b1290bf24622396058132d7296441a63d877d1909d84d738b841bb8046a4a6bae32c34e61e7c82792a4a895ed677aa3bbe7f89f5c3141f76ba060bae616629d797eb66fecc94d3bfb68ff850455a6ac1da28a081b4860225aa3e4365207cf167342f4a4138b252b965ac224ecd35837d923abb3d5622a7ccf2b10aad6b2d25f222c088b74a1e27ef9f67b063554f1cf74f7c852f923037f3f927098f2ac3eefec866c768eb1f7be9cd8a4a94c6f15eb87ab7a36151f7d9222768e8124584731590e9af5d01ff763055db97eb0663714779b3c0db79c0b6e2e43b4e3fa4b9ddbee110e99d75043f4ba123406ffeed7c2cb63882a3f3d3f5ba986ae31c30a9538223a41d303077ffc21729ec2896d7a7f0970e91c3a878c033abbb50b4cf9efee7bf6ef21f19a0dd1e21b7441fb7681c1a86fc96437ff73cd386f73d0c6ade05771b33117117c602e52693f05b47e90032eacc39295f9793258fe6512eeab291baa0be222e143295a28e8697e42fa27ec02b44217f32a1edae2f4f35213562ca37b6d6cc5ef72dbfdac058e1c358dbbb4db12df74ddf5d71f8cefb91ed3536d776c642b70aa8fda81726d178ffa9dce260e34e62994e13488ad5b30c9bd076e1ff36cb8c3a0eea77e027b901a009ec19822b710b6d670b99ecaa3d4e31f0690f5b7039f3f4133e55be2bd727af6255883af05c99d0128c8da7b76100ba7c588a11da5493429e3f69389af48f339b5d59109bd8b5cb37e04c4263e9ca3b5c8b79a9dee3152b9837dcd6ddd8e4349c4db18c92ad0764be4dfd45159b53be784a05abe3b020b8e76cd5205a4bccbb4d6dbb373ea336a58f1cc9383741444ab8dd56a051815def74277d9f7a15efce96049c980782eb969295d7a430a144e8048b93108f1f74da27affbdaa5fdf7785f5c7f385611cd3eb0ff50116884fc9f449ee58107520c81e84e785944cd89be90bb8a9d911985a5cfa45b0547b11377605c737d20e1cdeaa04a1ca5bd4b50aa116ae5512262bad3d8ca210a35f23278400e668b4296611f35ec0e457a40f143cab1b9dc6fb415d1b4bac9a79a0d01abccfbe534d5376d28917c77c1e1731791a3d72ec4e2d73ea649bc7c65decb2717ed6d19fe418d9c0b9a427ea25cae689d85266b93e192dc5a811762ca69f44dc489aa2973ef6093d23a854c6f52b78c6e56e499d0d6af97f64315a260a3501abb89fb3e1b4578fd85588f08b02b572c0c005adf0428f4198076fc65aff5a63703d6a8807dac9c802adca6dbee4e56f08069d066b63f2a07030415d23ec5c04ba456f916218d96c4cbad13edaf257c7fd17b8d556e83190c84d4a812957c64ffa7f336298f4e2c726fb51e657e179182071cdbd5b55c88ce0dcefd4c3c835bfb1394a6e0505927321fdb0e6ce08c5ca02b36000e113240f5a5da5ba9bc406de6f0219264eb144eabe2072d295feca68244b045270d6d0a2a55e00c519b1d6169478142dce8e96b86c021c1c582a037cf5a72f2492e75ac1524c8566b6481012b1f9efe71d03f446ac1121367d10ed73076644f9bfeb2ee5d1a7a821f9cd413d5805f0e4b297da300eec06b38d59f4e4d9e6ea446048d9aaa3fdfd797cd7d600e72acb9917e0d4ef04e14116015bb63cddd783871c86c76a69cdd9ff87ee6b07ffe6d496c54560de1e9f64c061acbe059386a5445d3b84cf7385d206d3876cbcf2b8a040335c0aa7cc84f65526a358b98b92c40eaacdae2451b48a41b829578a702ec337fa8b3eb68f205a46d8f632c3367a64487db3800394e84712de4ab81af89791d0736979a4d6f02517f11bb8dd14ac1a844e93c707ad8fbcfc9e620ac8eca1a0cc465d47dd5482cb4af76a7751b6b63b34a5d4df9b1c1930818115dc2edcdb846ddc0d25da6846d1526488eabb8d175aec1bfd2628612366341ecc88a739839147bccfa01682bacbb0c0ed8f85184e0e1d1983574a0d2cb276c00cacec93587bec613b233c446d1ef8851ec248e8d8a94a06eddf7a8093a9dc3d3cc5496ac888ce51c63b961dcc3f9c29834f716f35d0f59cc32b345bf6b0d6bef34e5830326c6016f765ce9f56c21e36b173992be409922379c6f20fd45be8fdc6b49384447b3419551e40199b3af1352fdb1a9f71a7c233983f5e1cab2fa5520da485c77d59cce155e1953d180ea79d64e2804a5d5fe86594f0b2f2f9a07e545e8aa97a2b7c9cf7704c387a4bb1b3e7e73664bd058687020687ab233e32e68d3fc3693cfd5826d44aaa9451b4d8a89d3d23325808b020b14370913de76b7065080b5f505170fd003ba94343d1c7f835cd4573abe56137fbf2282fa383beae646dbf0684d65b71f3c9b4cfc12114254a1e1993391a1e5f4a992ab0e4a1a0f313c75ac92aea7c48377b59946a2141a232a62c2b80254be9158f04ef81bfc6d0ebbb6b41b30c57c233d7043baf60e511880bd9a701857e77e56a23160b3c74da64a06cfacdba72828153411ff15e52d5d2a5ce904db92a8e42b121dec1b65f72171cdc4edb8360fb98869ccbe0783f717b0a5771b53ee48eb5da6d9475abcb3a6b8735c85ce587bff1d773c9ed5cef6719b020c5e895111ba76c82f1778b6c95da8605f1d25f6b2215cc6294886b0749171da6f7584a5497afedfe5057e3a806fc8fc955cc6f9fd48cdbe5b632210b79fbd9569074cd039527b53c4b8732f2204a0b0c5ebb847a49cf9c89998b2d508c4049ac2bceabc296b778b94d95f7ff543b9e2b97103caef44674aad8f3ce9af27d053423e654f60ec79f11d0f4b1142559afc3797b06826699fae5defcb33f4f2a827b032c57328fe0aec26033ecd5062cb640805c60b90322a5a7260649b1f4a157ed643130fc7c9b1e4795c409b6991d584f4624d9a76c88fb8b48c110977599ec17a17560a8674f641dcc35963d30a3fc2c2564efd2052562eea18d9654547cb566556964ead28616c18e0920dd7f691883c8bcf1cd6f90826deafc597d13c24a65fa9dbc2840c7bcbf55af281bd7d543d28a6dbdfe0e52c0756f7db88635f321930b82e4e5349cbc73ada81a8cdc60f484f52772e853d4a391b98251e43d87c189f2a96da6106d9c9b10748684ffa4a137935adf10f2aea24f53bab42b9d08a0975a71c4ef76c2e37208a4eaa8a408e056df78410c4d39530ab8874dd0c6fe5557ad9c7925da3517a500a9c57c7c16186f5410573ed61d2c5072688d585dc146576659f8fdbd2cafb093038554ea44efed7bb3602d1fb2a4bcfbeef146c409fa031f6ac2bb921222112a42c8e6712dad5dc0c21a6baca242accf7b18009c20f6d7232f74f3eb9e053350d80e85a338f74ccdcce45eef548cac67ad703a38beb3603c187e4b3c28cfb38133a4d6e2ef4416fd543c8b6a51e9385ee698483c2bb62aa4c64d06063af80e45f64a4ec2c91a58d9d8a185a022feed0fc6deaf2900859307b97fd8dc5d04a019905d51c54ef09eddcab1b22330241704ced1f361d58825df52751821077c1576926c746cf95d3583bacbb56611ff52e85f00a97903647f8631cb6866b2c4dad75ce64b2c40b6d966197df3db30f73d04f7f935f11270fcb6c7f13e3fe7856cd680593a85cda3d6ff8736f205259221e54a1a2d4cab5439cb9574fdff2e2447de8d33c6fbf89adaba5495247658569e2395e1f40e0674934f1ac54c36ff37f869d41475014a02311122072fa151cb2e2a9bef2e97ec58a5bbd8609d79c316fb031569d9383a8096ae700b6818aa564e74aca0418ca586ed8c5ee5662a2267cc2491b24803628c67ecbf20623eba8e6b9c4893b14eca75e75b0eb23aea95a0f869096c55e52a8c21567fc4a2a60ada220c00480270d3bc0f827865801d8548ec2abd1697702b065f763296adc133dffe4e641bc97559afd2ad1c6dea4579c633f45d4f6116cc917eb667e4f8229df65ccdd4ad5adeb4e7ed357b39bdf4fbaf4c504a55675b87a40bb1805df63cd1c3ca24e27b5b1f8dfaabb605578f9e836ab1c904e6feb0f4c482d23c503c9257bed2ce0de42eba3d3e8a995b55d3c4999ef0b92d72bba99c6970a2cc6a4fa5984de333c7966a215b4a2679dda33ee9b6b275bb246702c7d709519de11a83f92bf787e09ff072075093fbb22cce0580532bdd497a52887e4d2ab24deadf9e0f8b523d7f0790fabec5b276ec9944ec2b078183eeafb3a14f5753ff1d7a27d25b2ed480499ee658ca231c1483c396373c3c4a06152518e1bd9e0bb4a6ff91e56e9ef4dceab66f10bbe13771023c309b5679fbd0578ae0ce4b79b85f54eb9c2bac4449cfdcfea9b6f6989b090253b27cec490d7f1031a9cb6b82f07ba1dea539a6c739b59ac804b02ca1cd58eeba8a507011f56ee9c9e26db0423a7638494b83e0804b4a9eb33e90a0a534cd31d126aa847d4a2c4eb4092 -MD = 97dd0fa2b0afe26af1ee630a4b1b0f7c075753a79e1f7303c0577d869d23f117c4a8611e845cc4065f6a85b9a2e0a684883236d6fa65cd772363f1a26ee85bdc - -Len = 83392 -Msg = 40021d58f36b960cb8bffa0798ec4acf50cdc63ab2ff6bdf49f0bbca3c38bc74742d43f201b1726cba4f80d12487b8c99665c5eb9a592c3195421aa8abcc606cddfcbcd474095aeaa36e9a1e683d143bb3b6da99ca18fc95ecb7523e344f7551c1980f68141a556eb943d1562ab7650cf0e78dac0be5e4f39477eaf3a16a040a6928c414a98d6be046f7ace1339cb3269521668c2568eb33d6a96a2eb9c4147f1dd56442fa09a42890b1b4274b950770ea8beea2e048193dfa755a594306ad9825c77659d037092ee09a6f91394a68d2364eac54042d76f9480443db08d7d73dc82582c1f3bfa1db7dda6785c762de34c391280b58c10b4f087ead1cd0e09b564f1710e12b487515b198246cbb86717ed77deb30a5a9df28810b1e8462c800cb02c7a923407a8bc5c2fc2cafde5d2a98bb3a7c29b390fa6afcd1207b88380f84295ad4eef9ffedd4f92f09b4f890106bb7ef63604a1c65ffc1fb3a6908d8cf690cfb1aab1f7ca3289e5943e5d1c62bdd12c4293b32f527cd18aff5b6ab4f4863f3d002c07a9cb3abf9a160a930a884d716e2552432c448be4915d7ca3946825825011496d20427435130ea67dfdd224209716f821431d1b99b576a0d7a648632ebb7d895ef5f06daf02e6989a40e0e04349800bd9ee3c9a5589a36e836525bd78d1ad725995359571cc2637648e34e07df808f3d9983386cc609c2c134b70931535198af978827a21e1462969303ec315251a469ccb827f52dc996013d3c99268485a399b2a878a33e4ded514c17ef6cd432c7ab012b9c28d7053a11198912a06add814db2585542c3958d0f3dc6609fae4b816afe84a2ed0be3375790457c864b82b9315f42c467f713c8382cb946b229c5590f8c6a3e2c108b133d6918dfc0709bd3af800ed0fa20f02934e298a98c8bc8d80073857acd2f26592a6eac44352151582edf647ee38753356b270a92171c7b84a67b7e5db8b0dc8e8665a6b2cfa6cccf1642ead80a74657646c2b7073a2607e8696cfdefd6dbd43cb817b132754633c0ce724be5572e4e732b7d4813ddef9489b20da9390df737ea2a4c73cb0f4aaeb3c0372dadb3ff35b4831e65bbe8c049f1e7272b42464e2c2143cc948586fa673153583939042d42c2b76eb50944e14ea772822a136a26dc686b5ebd68c09e83c1ef9f169034019f242d35e104d79acc33b9e64fb25fc86f470acc967da67e2decfcd26cba29c371624f3b90b48a33eb1e261b42290f7c0c4688dcc6cb20e28b39e2bae5c0cdbbe30584476b2246f3d2ee1fe8aa80608adbee4e57f65a1711c5300a1f27a906311a9433231a55f124aa2e0e1730bd3c3905c6c204cd3371540459dac9da7dbe6c4197c6954455740c9a635a6e7bea8ad2b2574dadf45d18f3703dbb7fa745dcb57e96a466912bb8f3cb176bb6340e329d0927581812e0f2363063160b36084854f91a355eabdea42364d1a9b602321be233c0490ed0c5e9646d5351332eceea91dcaae14437761fe38e1a7c388e5d2fe958aa8957d613e4c74e96d6c0379faab34ccf10e2e0fc137a71794c027f9755f99e6b81bbcbd2caa5fcb30b79fb84700473102afe4b776731347681de7ee8755c308d9802570b85479e325a281f8424ca79f5976123ef03500099839233597858349835f323c5fcf55d9c2a934ea8ae4e8606bfd30e6dcf1ffc6bbae645f14436d312c258d70817f76178e2832ef7f6d8c0cc0b1bb4f7b3e551738fa45db9c23e3485a6f71bdcbe94d14eecc06779e4b052cee103bf9897ec2639689222b7dab780784998954ad915d5a7af12a236611d6294aa51d455637aa446ae7a3df575ebde741305f05950c2970993418737536819a7cfce9d38ffd8f221ca22557b792077006c05d2120be33cff0014bd83a4da9e8eb642c248534e3a522252134fd09f72a4bc5fe47bf3c0ef0e5e55ed223ab91ad1c975eb8d4723a16220d41f7b60b0f8e86bdccd9feea1d6c015cabe1dff4db4f96f2ebf10c4a151d82b6f2007139a3155e1443583e5cd199c8d3cd97bd9e0958d0f37e6d8b00e723caaeabef9cfa74472865fc631c18de12a2f72e544b2b8e415135609edf5b32b17070ea25b7e1d5ac7c3f426b0682956f361368b80711eca1ae254d05879d8a5f0a9a3743407459addfecdfd08c4e99f7e8c4e7338fe5a6f23e4f8e22026c5084ff871db8d52672d3ba0b0f442bc14e5531983447441b4fab8810ce84de2c17bbc5c3f806d47cb3a6a1266b26437f44ffb6e9da63a22749361215689e8971526c03dd60bdcceb8eaf0bbb7e0791fcf06fdf564439489e164a72ca06ef82c0a32e203ff23e3cf786557026a26865bee31e115a0c0895e4492110ab03e8589e6c7ab168070883251d22651492b95d399f9303518c82189e54828234ea29896f10ca2df219cd5df8c59e60f1a98ad6f188671bf950165f20cac72e04442373b752a4fc4ac4cd2be70241ea3a614d717b2ff2c1adf135c8101e679a759c56d60b8493a2ee72a86b847585677b5481ab3b08ceaaebea70f1f0b1fc5e154d43fed038fec869cdef9b3572017f20fdc7e2b5a5731e3fa6584b2747fdcf7fe16b7ca9e27ec3291103398eaa2e77c7b770b67f8858c215af4c523822d484f1f34dcdfd137c29c8f673d504606517dc2c1ca4fd24180d0a7fdda5b7e5291537fd5b614e4e8f72a5d8b1ec2b375da5dac64c2cc30b19758a927c941b0153d6ae5a24e521e611246c525ded57b170c850105fbc459fd5821281b9cbc5f9fd6fb1a42ab7fc9cb9b578ddd8673e5136e5b894f7e21964e4b93ec805bb6d417e470e75ed5852b4d1ac57e5a1c83389188480ce752c92fccf917bcff0c1658a6ed30129ed54a8c1018f76045abecbdbbe3b551787fa66c9ee9136240b9c431747ba363a9b2b8363b1d57fb453898bcb7060821a80e9e94eda3f1a4ea69a7a7a81531a42874b670f7af4c1603cd6e7cad79ab441f069bf1e0b0174ba525a9046b44429bc2242b816c583e7b26715647c6c50482866f84c9a097ef1f1bf4b18ee48e3e1120c901b2c19f95f0572d386329717da38552416554e0dfe7f1dea88f3c7e8dcfea6b1f4b1f0cba3e3e08fc1900057c6ec3b6b90d2514516dd2eb744d9a99979ac7126d94ad28132d820a8bb1700a6bace9a3d6093bbaac776424fe112769c53d5fc7d3d4947a0984cc3bcb73a307b1259e217fa0bd5a58ce4f902e220a757d7e5b913955fb8b050dc3a4a5a7c184b6a18b399c1bd37dbd3a3c37edca6c4528276379875d0be16d8e104c0194f109e2e858f216c2a7aa4382d322214f75622ffe1e86a535eb06aad05a3bc8835c1f9dc1ac55d3dd5e695270bb58b3fa4c53f8cc35c07b25c582259b4a7ae0bc2a4d4ff62f68bcb4234252ca9de18c131aa0ed584f2ff274bedb45b688103387821c604d8a35b98f1cbeab5920c692e206d2756c15dcf06c009b71ebbb05a82c8c13388f65c4b3b57164c5e5ed0eafae3970f7ce2fce5e53b34913008b6226f272ba3f84671b906f4bbc0836abc1cac1db02dd47440d2572fe6e92bea22e97235999def339443a05d24fdd1303e8cb6113108e9ffca22b110a9156eda571e2056b397ba5834797bf2da4aa459d8a99d70923729e01945a78ff3ac7553f33efe1d0218063ec2a91e48544d89520af1e6be6c2f10cf8eb99ee04f24dbd167da6feb0d953f31cf70fbe01b5d0c8355f4164d27673b08cb0cfbc413f50efd256efa632ea5e1dbcb6f893ca81f9a983a3ea0cf4c6605363eae62bdfac38b11cc7b21f7edb07ab746d36ac072fbaffb38201a9753a20bd25a1c58106be6dcc9cd7d7b2bd34b863eb26b051e1487d916c056f847c5a1bb67bdd5406ddff5708f98e46a7177ed80fcae84eca8053a92857331ae532afba060da77b048df65e2cdbf4e746b33fcf75b8bcf85e0bd8a68c1b14eb13bfc06374820622c13d2beb02ec12a2d6ba02045e5ea89656aa60db8561b0ca584a157fca8203318616276450d1ef60a1534ce19163b710fa8772b2dbd110a0fafb3777ceb7a5909b407133df359307eda7a7cdd871ee4e92c7969255123b5342fbadb149c6f42848e291be77be078103de9a30f92d5739669554e3bdcd39cd7872ff97025af8dfd525106fdf1452b42b1fae73bd41f9b7be17350ed9a913f4e488b690c319ba9e893075ade1e07c8aad9269fcec55dcb1e175c079724fd0b2ce63590352ab414eae2c48df43ca8eead06056344e10091018d87e8d4f6678ee7d2e705a78b995d58a40126fce798fbbddb1fa83aa1b87baab68f5b23a9714903a0f84fcfdebbf1d659559c44a9687e71cacdf52ca1d5e99e24caf51f98aaa7f4d2e1c51a9e8c60c8952a8467fc87f55d57a8c0774bf979404ad34d055e645a5feb4c0c14459b28c3da0845d35b87ded5042890c71a939925bb20a991654eae995c9f8b495e58c84c8a77771330e8c97d42d5fc789824c7d2d84bb12047ba33359944d9265355bdb738e08ea4271b13bab6395a283f3d93cc34acfa5e604776b933e46c37cf0277b867ec0302a89f6c11b0bb30329a3e6b7652dccb986966f7a8bee6cafa2bff84b499e25abb3ff62116d4e4154413b7ed65b553cb5aada914689cd45bf9f4ad7330317c1c4a47bfd14e953c8fc9462a681ece9a6031b77e7b8d5035b593a38cb1bfe101ce1c7a4d0b0d643d063eac168a06111930aa11679b8b6b736e73c32ddeb80b2bc6ce223e2ce7e45dff10bffcb1b02f78a32035f4d2f76125ccf6edf148bd2242bcbbe9f3c5727827f0ebec5d7da17c013e30bf96d035b3b577b95e878e43c8ff16823c1e4311a213722ccbb95c5e897b6857f8de11eae5aaf517cf411dc051b94a9d931e4469f4b8f95fe880cc5bda2fc8028c2af66b699eabbeaace85c77ef9ef8a796447cfd2810cf1ad545c0dd096c3dce41e1c5bd1e921fa6b7044dd83497bc56990abd7edf4139e849469f91f58f2239b27f2209112ee779bf6d957111055caee140f06899ab39328d194b218eeb9830bb8f64e39b477a2b692c1e8aaf72427717edfd047dd438be48c6abd5fb0a087d071b7593e46440845f48ce6b3665d579e21acb9ab4469f552353a6f46574d8e63c2a3c61130da14c49c98f5bcd677d7cebce44726589d4bfc6ca26c8f3af723403c5a19550cb054aceb848a49cffa247d9114fd3b92341c4d8321297ce453c2f03f38c76c524d447971ce18cccb5aca355ebd407d89e4c2c029451aa1dbea09ee5bce54d97a2760b4cfd415c851104580765bc54e9825fbeebf7cd4909a0044a50289462f1cd545e9463525bee9c102e9686ed031455e1433b636dbcba75d2fced4082fdf92cd4081757fbd330dd39edab57505b83a13a849ce1194a57c4717a640b9566d7475fd07ee0240a725ce75ceddecda65bedd146b477b93c0816498c5c91b6e4b4a65e7f7107b549dda2834405254d2ac7c210542b3036daf7f2c2fc7ddbcec1b8d237dd97d397d89936736d9a34b631eda75e75aa11766c49e0449170f0c3430a5254b2994cb0ffcda0219f5511f201f5242370d924623a29683712ddd97fb3d3ae1bc61e7ae906a269f3a2dec6e7e208c1c80e5f70e28cbd1303486b9ce8593a6ff6e1cf662b343f18533ddc5b7f1e4e07b317e5fddfa92d6810fbc343e87c681c4cca54175cd3cc35a83af7d6a0fcee7d4d5312d43fdaa2f0c7f28dd56665843d844a5495652973495a5fd84134c310acfe898ffcec6744318ef7705b495db75a082978e92f7f5adbd17527a322bcde1a2f83037dcc983ab5ced014dc7baa29fc3f2f671aa11ca97374438b05522f7d5146071760c9b4ad04f0462260e39401aa9123c930a24a8999ad93ad6eac6318d9adde73acca05c4a45a2142f0696568ed66cf48341c4f22d6e42b35e618a2d538cad0be69b6d1a81f76291b92f563854c26f98a2df6749bb17fd4ca767e32dcf807a4a09f776180fdab2656506fd8814f396a372318011cb3e7561424c65c56a0cb24c357f4fd75c460df9a32bf0a837e08eaf81e6a3ecf628479bdfad8686bb97d16cc9915edaffeff1d903fce42b462f9417527d372da49be056a009c9e42ca8743666bc2785532efa8e07f82c73b82753655453ee765edfec1c53dfb46045b507337d7e3e78fe9984831fac4e34166e592408190e399d8aa7676b9dba7d8f5406de7e4608287aa62c52bb97ddcee97af1de0e2b2af9d912cec257c260ae71fbffb1f9a219162fdb5e677c393fb699c3d9fda708c939aa0eaeb798fc2b7596135e387020f5c4b6af974bd20f088dbfdf5e0d93306d6b88e4e3b1af999f655430aeec623102b687a9638a4d97acb6b4341a7833409c21ee1bea3b1c2910f034ea6e485060d45e1b4f4f7d5f51b0b42f588be807a7b9df524a4ede6f394498c09728d6bb1eff3dfa17b7cf87cba92879b31eb790d46b064dc67df609289ee18fcd4b1212e9c7d8ac7948eb4773ea663bea6f716f6504394936f42c8aa5744ceb035174e85fe2b09b0a5f4b1ed9190fee54eaafe3c839eadd024ddc540e894d7acfe889bbcfc4485e4187798e69a987f9891cbdae7c508d61cee7a005e23255b7895ccafdd7d1225e953df116a41050f5fd724510000cb37fe35df200bf041819d64ab34ef6bdb1249c0f4c3826e21d5c3887b0c8d1b2df9fe61d5ce50372e71a2d1edcffbade8738cc57d57350932fa4b0c99b299fe7744a4da24b234e035540f46592a082b817138cc44748cfa81a580cc46ec2991f03f79089473bfd49e526d2ab8ed1ecdee34d73c0fc38d2956ffe82e496247bce2130454edbaf9f9b19243e5d2c0457b76e3f07da7ec427ff9300d9b6cbbfa6793e7cd24f62eeb38b63d19df6f49861d62a60cf7d496b3e2b15f777c75a04b7a4ce45de178789c7af47a787f5733e89bfaa7b2125d69e73bc7b4ac372db840dd55323bf43c3f14a5b472e62f512474dd860b6a360c0fe673835836365cace478f6f8efc3072c5ca23e4ced5727c431cb4efdbdcba72db8702d739ddfca233c33775f02b8a4e77b5ada31155d9fbd274e9aa33139f76e661c0d2c679c3ec652f71f8efb3ad91779b4d049e5aa82b45e4cb12550e8c477f65e6bac1ed4823d2daa38ad62b070645f9767bbe5a69754dfaedcaca240d6f3731d8e1b49ee5c2fd53608e6c0842f7834ede8b09db9a842b15d6360aeaaf488e243bfa0715495445381d85f9c1ddff8009d9b4f964c7b29dc408e68fc8ce8de4db746631d6df525ae75ef407ee3488fcb8fc8c157c5daaf693ea4ec144f789ebb616b8dd5a1437aeef997b2ee3e31e39eabb72d688e8b7c5f41ef167f5c6d7035297646225849ea1cf416dd7596639c80d9b0bc520d5639c630b50cc41a8efbc2f7aeb58afacd1e3e50b5e89a53a7637a01fa969cac058ea6f23ff66bf0a5e86ab35c0397ef98be5ff4bcfbe6ddc3e0930bdee2ced25e220871d5fdfc4878de3545c857d1a0727184c87340e09d7fbad3dfa4c971e62b9ef394bf490089d1862c953adabf7322dfb7b421dc10f9a599426594720c5232a970434401ff1a7688568cfab4e9d172b1ffa010fafe5afb27e986f505277d3cec8666ad4d7f652f8bbc104f0cd723288f657486c033294b09cf2811ac4acf100f3de642560ad1c637640a830a12cf0d20ef18cc5636cc5beafc342e8dfeb078b99da94b4427c601365863dcd8213fe90da7742ae58fadf370799395d0ca883a92af98103f5facaa2da001a39b8cd984fd9571e795c732dd434d2b8e9e37bf1f437a9bd96e38ec87c742ce1f7edc07a599c0f54d8d65c5e00c80e6601fccbdef74069bedf93cec61aa48b19aa69830168930e9a2f6f1cdc3731bab557a11eb72cc5c7e9509f315ff7eb9915a3e48bb9d74ed362ff7f3b24f1f2561b3d88eaf6ff4832e19c6e4cf2bec9e58a86c7412030300c23cb9f4db4cb9a6f2c360cc72b0948391c1579783ab9bfeedcc58a59c0fdd707711647cb282e8a745cd3b529dfb536591d4e494974835e1380e2c62c18baa453cf51f119eb8552e421990a89619d930159c976475ca5f5021b60d34e93d1487f832123d07b8a846d1ee8857c7d2cfec045f968e83f9c351900b25a27cefc13f950e6687554888f4da964be696eddda24866099a2b9d09ef6d569c34e2675975fad24377f1319d42455700dd6d34aa59c8f91910d47dd92fa0df9a72846e852f0fc5d096413a9037fa7acfc5b36ddf196c60ed79e562d91b11ee46e5c8cbed77bc31366bae2d09dbe246e124d06123ea1ce2af5dc814b4baa9cbc81417483854e95c9c7fa1d1af37e3055e852cd81fd5c0c88442e45b10144ebe4987daab0ecf7e8f2b5880ed2b52e6fd6e6d2f9a7be1405b96b2a1ff9632e90ef1c777bd19ee63120b80b44a2435d4783766416ede1784e00d3467c7ed1b6304e75b5846febb812d637fa6b043e693bce4f7ca1df07d75a211519e7cbdd7a2e854cbe30e683ebe285bdbbde6306f0d119ba932705a1ef9e8c88faee6b06f90025fa082dcfd7e034a1d1e60b692d728c18402e12cc4fff9f95d7900cd6cea149931619c79658339ddcecff9e61227ce13c98c3f1cd52a5e1ef694faf9995015f6f19698ae495546279977ef3f5766e64e8fcfb50736a60e9fbc6a0532e0aa7d62c8c8e04151fd1471a49daa890a9c58bb0152a9b48f7bf3c4d6828a3fe9ff3323de7edbfa2482890217c9928cd2d20ca2449d84ec87b2f4d56c64efe95b571f815a40f1a36bec8f241b840f0f580fe94b8338af77c651f819a8999ef8deba29c664968a02cd430d1dd85489dc435bd9fde4ac901df563e9d9b0a8fd341c31393826090ee1f390ea3675c468b93cbec4018f7f91a6bcedae5dac197664bac33721c520e50684db10b71a59146feb4190a0ad3c19d9c2f92fedc5756f5263790bc76c647839292a66e8f19df5c6f7eb261f66688f7fb08e54d1224252c4bd599d73415b2d448a87d4101f17738509c56ec9e18d5d602db50550ed0b8683706ed56c6c8f6dee4ef94279cf4ff776c8d550e54732ea44e2752ab34b55735725bd9cfc1688a1fe1e89986927cee75fdd25b5babfe09ef376d6ab4366aa81078450d86967cc2f3da13dbe294f1bad09efbd8391721ee13492e070456691185d342e73fc86e58173801f9d0170beaf3ca7a3a4b288741bd1de9c61047393a01fde5f53fd9c5bfd6762371b38b24057bfade1fe65286ab490011167c7b337811629ec62b4d0b40de3f08b21183c280c5ca87f7bf27a89143aa44768d55105230abedc86684b7a18add22698e737fe35d9408302a0a758a4976e474d777385efc34437a9633434868eaf0d66eeca4b3cff1ef77ab9d760ca6e0818fff542404b086405b2ebb46bbe4e2f4a75751e958896eae2cd833127ef8819c26597e5bda0a2c64f8949f3a62ab5fbe3abc45a6781664b4de247de377cae4a4e66a58484575a111d16c5186d318bbbe3f222a7468f36ea3fa14c0618d7a643c3ec66491ed6f6ed7541a64c483b97164f31d92dbc1ad06fc0f2dccf506a38ab29de235a12873e0461f236b6c0b0a2b531502f13508afa81d8bd3d64699c2e2b892324dfe8d1fcfbe811bb7f5cf9744090366d828b477dc890eab8ebebd44f6aeaa5b101291bf67d12867ecea57cd55e75cddaa1f3b921eeef61958d5c7c6211544b12e75ccff530e839c7cc22a28db7e7fcc0991249ad98fe0b1c7146fb30c7cffd8ebb0954c1bc7112dea05bd363f4eeab6591705deb70c4ce95c030b9813564a36ea2b81222cab6fa0a74d87821bd92c212b2935fa11e499347a1a31e1c021a26fbc6f271e002bdd7946d22f78db9dc2a0f2405b5984a95437b3d2692cbd7fa6c7a4f3ed9c20b9093c4b5c0ba7091d3c9a40e4ec9989bb1c479bb417d545c0a5e366525b2928e3714e2743a2791ed80881998f40169b9a40089447c47803854e4762e2e641632b84436d119a8ba73e94fb5ec81c7d24d76ddf30060581714e0e781d5e15717a01d0908f5e3a4b1ce1807c22f7d829cff2f45fe167418e197b44da080c6f35c7f6e4d9f0823833fa41596868c6e998f76d81ff3af40f0a66ada001b5866a1af78b1f744315eac2c9ee6e64a29de76735b79531af24d462d345ae63a8448c7d633f0ef3f981e89406395de552e5480105518c8bb0822833f9e3ae9452cf4cf9a57321dd866ea81439c2a65f1c4591f2e0dbf681e184810a45084f0837af31fc38c806957c34bfcfcf0ab65641374bb942a751a8b4b455324f140e23d94cc21197ce1bb03d6c862340822c5f7422dbc0b5543c649c9a3b6862974a9bba2073b64cd5dfb25c8e91cb38b966df2790c8b5b362f54a1b9e9a094a22a2c45cd2dd76b27fc1105c03690412210449de29a8e4c7444addb43a07914016953233cc55cf733c7e5ebe73827a67597343fa25e2ea5b887b73f914fa8cff13a069c195732d098c55f1f657649a92b332522e4e0d330a9025b14c87e978d18a32df9896bc1befffe68e861785f14ececfd8ccea9e6b3f0bc82a413b6ad161eafb083b68a7089107be69003c7cfad62cba5c68840cdf734bd1235987d5231ac63777fc83ba9f87243c35d75ea033d33d705183b2df2c41e0ef5107f5eeea86ac96b38e707d4d4ce5ee598dc69618b071905c90ff9bbe256b6117df1dee941ffe872f5397557e5cbd5368863cd536187978e232b2b921883bd50c31687acc514c875fde90d9bf312af9c772f9d40855a5b866cb84bde2f4d2c982c15e09dfb50725d991d5708c64af401ab6b6190c0296dd7eddde207f05e0ad3fe167125ad5ced1011fedc07251cad4c6d3da2aada9cd367eec37775205b5fe88243c3ada1df4178adb323feda30e16505cde6f89b5a9720b791928f8aef33bf00c25d9ba082777cb564b456ab2d9834bb44b8e1cb0cc1e88f70bbbff5c08f40c0bbc75872ed9603703b187861bcdaa0d7ca9dcd315957a9c0887b6d28767a5309578a4ddfc7a6f7275dd6cac484b093a0861f2496ea634a900059ffecbafde025bd2de1afb8b03f22f576b69b2e21f55fa1c54fc266ecb34801dede09341fcf5a17387ba96abac3a92981a3b06136ac5d4317b47d76fbcc2fb29072478be808f18a34859782cf6b04217ef9c9c6f6a1df929ebc8fc2977d8f3cfa236e6760733140a8663fabf41f7a06f51faf0469bc30b9e1cfbff1c8aeaec6a15a457290f964611c86698b33c754006e7f2ac497e697de6956d6ac9647d6790f7d95517f80d014184ddfca934bdb36728001ae89055b2abcb79d9a0a304d7dcbf626af35f1bf82252368111d9354d1888afe694602c5c4645cd9642b515bf95d2bc032bb3577d3ca70cb08d7870af83905e79ed6c61dd4e9ab55b102924a154e862b821832412e909cd156cb1044d40c5985f44238ab84d10ed82a95dc60fb246d2e4854d264bbfe0f42a30114498d89efa014913fb6faa6ec2977ee15e7d06a4a932c78fc2aa49c31e6997f7c624a382d00a5cbc5885eefad113f152725bfa58420d58b98d90ef26b84de4f31d733a27c6c50f9b167d935b8582a10f863ed5f839eec958dba238923e61a791af0724e45adbd21eb9c93ff77c6e2e972e8851fafd4189fc5150be8c2d2f6031ef52cc4ee8b934e5a6eb3d551220ca87cfead6e708c02af2732ee97b11119f7272d8c8de1ce7b85e827613fae365353fdeb8dd32e8c52d09b58f31f576b2d5c1ce1b730843e1cd07c0ec7c6f6c85cf4dff84fd6519daf0709d042071ba7d73be459d83541a31f36fe6a0af192a1d292096d18ff4187c15e59e304d7678fc19b69dd15257fc42bc057845549e8895b36639213d7661231dc73d66118a2e9938492b59687a56ae9746da4ce5561489fe7d5ae65e52906a78940f48051337ef4ff472884e31d5d005c29119d9d65a548ad470b39b1f02aca6ea6848a0a84168d12707f07c24e6519807315eba95d69fb90a1efb5c4244743928ecda6cbfc7906c8f60346aaa04adce634f6e002af5c6299cba301a52e25b9fee118fd1d036e0626bff96a267bd3f09852fda32fc54625cfad6f46dc748cd5b885adb78701be3536b4ac9abb47cafe9eb7725db806efec3b309aacf260443fca64d4fb925e313dffbd63fff36cf5adfe499d3526d91f5ee33a6e5a6e59149e3b65d5f1c4838fc389c365c155521ca6c2f2c554ffa89d23d1b43179d8c6c69b146ff7c2a8d6a072ddacfb0769620991f29934e1ceda32e40d872c30b91120dd5c6c8496c3c02cef02626df9b80283159426300518d7a6499d99a7a898a1eb0d1b43c2949faafae500cb03c1c99b51dab28002e86706c1f98bd4ea08fddeeed25adcfae5c3fad3fae0d1058424963c895391f2b142d14a9ddf1f3c797030f3d5201f73b0b71a7fd6a95bba6d52590cca80404789329f0bdc9f61e7237affc0bd75f4771e0470c62263506ba1da4e894440754b97bed9ca5fd584312da2b31f3361434c5731667086169a604b44dc7aa09b1844046ee550cd886f63c071b4d5dfedf43b82c66244a9cb20e191196aa98599127bf7ca2c65cfc10ac4036e6bad6820ef8cc84bce0b348aca369be062dc9c434938995b16d00d873d9e1f213e6e77031c875049118dce5980a692212bdc8da0a6c311a80c5b2ee2f0373b1296dfb39c63744348939220422a7a9e652d71ffb81163883974ccdbda0bd980cadccac5f5ad9ac8cebce2d24cb0fbe632d0629a9473612697b7ecbb7876ca16d076f55416e0420865f4448b7ffa6e93137c79073bb20512493e8377c31a5224acce280905e6b42a94a382f3e4f11ecc8d997ceeb5b89775d77059b6c4ddbbd2e74a2d8ccca53857e43162b3827b52ba2a8f34f60b6b5f76cab4352181a84b4a0854cb84730716b7db06ad736281518571c669c844b5a53ea974e15f04644cb19753c99900f39571038a2ada8aec6454eaa7e30c687db0f4fc17231955f704321caff0747d50feaee426a39104a2d34f1e98696980abc9c14c05c4f77a4bbcf220cf08bdf10899950440de40d88de6a09402c587932638cd1fa58ca07d46bb1c2b1dd91b6502ae4fed42a58e0c94e56cd44ebd0fa9d8453f006142bd65d24bd6c3002a37e02685032792be23aa9e17de67e21aa9caa8384074a0b0f53bd6b24872e0c4b96a5c66da389af1a8b995c51bd428a3fcff7e58f705cb9cf10639399cbf2670480b8c98fcaac008c54260374ea38622b14f42ee8d3a48cf59cee528f73238f48ccc9e6490056ec9214ce7b59d5d665d6fc3dc42299b8011d49cc1c783547f182fb47a12becf0bfe65df128730892f1edf62359cf4b1db290a77b55d68ac63a6d6cc09eab092ff6d3803c9f430af492ba93433441603c2e1a467a934cec34d642b1b31338bd5b1df43c1f445c5581c4c7441bf81b61a9bff4a748592dc1fa31cd6a9db377a218b1b2e207bc3160b104be892c29dfc7ccf4ca3a731c0ba4ace947f7ef03ca3fdf4eba02946b34c508defae2e22de11b3c7905807960691cc3795cda3568b2ef1541541e33d608eaffbff6e1dc98d1d47ea93109c9aab892b45e6681ff76c44851462ba56491105b1c244cf689df147be9f1c746f26f9c9f15f51f9fab9260d429a9ab38a500dd9dd4a867a168854b8a250f52c8723367aa5ef9c283c8603b0af4f85d3883b9d31bbfb8c172f71fc987a64e4dfed77abc3d05c909cee454955559beac357f30935d43e204dbc3f320ecf43b235a70ca0cdf90ef5fe18de4126bae7932bff5f990faf7908c4c3dc3e42285527d8bfc85dbfa86d93f5c0383348689946b1896695e4d5160d254f2f685d0d010a6d3c9529c266e1312af03d67e6e71bcc00fcf244dfcc7bf7186520f88706b2259f275a4efeb9d29944afd42426bdd3edbe60eaef251e128e440f9735e79ccd3e1387ff129a2ca891ec06e5b430742b7094bd35dee152419a52547c69a656bb1e74646bbebf44cbe2cafb595d2d94891f291cbd5939f172e2e93db7daebbde48d68c78899948ba3548599166845a357c0268469a855820c2fb2d031d0df57b05297b73ded428899aec6e5051d9f2bfc1c32fe21125e8d77495517d095aaaf8837ab3c7200f0c313ba34e90ec364b3e0fbf691cde07c9b1af8791a7d70734ad202495e0f1cc7c57a3e78ac1aa3bbc46b251945565bd6335f04c6e021a862b2f77c1b26fd87ef15370339360f06cde505614422a2c895ddad34e671a286a16e606dc99b22898f3bb0d12090d732c29e16781f319a72e0216d517ed5ea525506749dfbc5676ccfc04f6fd5c15870c1770633517926a0e08805233914df54a9029ad358adb476d82b7ba7ffd17c07f2f93d5883022f99bd99de72bc376bd3c3eb3cd9885af2f1d2049b3f46c929417eab24af5cd59ba69edd6006b2467519cb49c17534d40723e5d4190054b049648d15210285f9540fabdaf3a7c147e46ceaa291700424dd5537215cb2ce8ec3b946c09d17a576401c0e1a001c9144a215478014919f515bcef376cc1d5f6b7f88d23301b765554915ec25ed2ecb44965b0c6ab2a2ae6368d83f58d108ad50651959f6b3aa6d9d5641708124a51750a8885ee9d369d863eeb94351d33d60445db302921db864564ee9bfb80b491c6fc0e36784dfb0c658d4ba29e83a8221504f9ff58ea5a9f3891b5504520ce183a9c6b34fc33e3d1f4a022316a66ea0987b23265b72b544c13da4cd65d58e37f306a2413e2e58d88c425f3c3411d75f6ccdc1 -MD = cc785d5ed3094ac12e2069c46e3b81fe9830ac5f7d752880ac683a7c80433c8d9b2c9bf59c8e717af3b730aecf76dba6de4d4e6d4cf9fb60f550c6eb77baf5e2 - -Len = 84184 -Msg = 2d01188eaeb6996f1e6aa60468b7894337e18139f6fe5c4ffb5a48cdff19e79cd21ea1504c2c3e66874bb4c94b6e3d9bca52ad338ea90362af783efb49be72922d561a83d71eb037a1597ba23652a91048439d2286748a13c8a741408db447e8a8712b3036d4166ad35ca4960eacf2291a7af90ec6a71aebaeaff9a5b3448f26aa367b5e51969987871bd6aebcc4436fa6bf6800358ada71ca581031a4b672d59a6eb31510ac6117245fbaf128e2c26955dc92febd65f32d826a2bed4652177ce2e17a5d5b5d95a212f0f8673a4e979f8f972013457f8ca73facf5df8260a7a3e957793f1af35eaeb8963718db4feb99bdbaba44b621ce686ae71311412749d2179858c235b4e3c580191f0df12fe6e0450b079bf693e1f769e3308b69f02692d46bbeef94e94d6ed140594d6534affb9153b01fee1decdca668f253e303656a889a53cc20d9c33213d48de020a76f7207595cd8860717a0873e017398a830e39bebc064bfce6e97af9e62cf09d04dce11e7b4cfa7988cca762c06f36f27ac837627adbc5a0e75270b63812107f6729516c3600b371970e2dafca9d94fc703d57f16c1dedae2016a90ee92de046205527eb607941fd2ee701b74912f22d15d5e1f7fa5d125923ae7a6063c0ee75d2f8ab0885173480b2bfda15d67fdcf8de1a8be2b019d25664726b67227ba982d18c71601e8af990c5210d37ed2493e43b83ac5e37c4bc0a651af26fbfceafe1ae79017e97150f91c89321ba17b1d573b099c9a6dbee1e0997f0b606963a4036ec56e1b07975f5285f8eae08c098002bcfd57a791706a6c88fac1ca8403f28e6fd9e88a24ffe38b8dc9c08b08257b2710bcf253193aeb4cbbe959ce1385db88674c86cd0854e48c7d213c82dd7714ae7d6df505cbc36e687a755bd3e09068d79c45d04a7b3c6b3d9d2be72ed3a6557f4c39e82771b4faa80dc65041b1cd9f6457ed4f6a455f7e86340c48f7b25b4682c5475420d1b498f4bb03c07f4fe48a17df6b8a952d67284f8cefe846413deea02fc0c158b46c4f34ce5531f7827c31d87ee80934fdf96e80ebfa4d8149f555bfd4cbb537e18327508ce32d10113d9a907a8c55ad7bc05a019a550112922a83c8fa91ba2522a228303ed63b32c6d1cf251c7ef56a7061f3bae1298c5fe48581a4ea39578a3d715bbc2b55e4c567ddd881ace771d1a3874193079e74d207ae5639ecec15cefb97c7dd9d89ae31bd0cbb8a72ee524cded84d7556db43d1c24c0a7147d27a5924bd7479da9923df9003822ab5bc1f42e7fc1e46140980c6df07a63345121093808a6b792baecb35a86d3548bf78601b879cbcf08a4fb418248930662cd55fe5d6a7b3c6d8f02d9cccf0daccd64b9e3e8660305900d6662f5a77b3f44542eeb5f0bb54462986d17dc6347b9d435d5f15acef816bbdc51e73497c34c4d882456c946f57e366993f3e5ce21fa54ed52e07c1f2b70c0b45654cb83ebdbe2dbcec738b6bc384d650004957a2cfcb3edc907c8c10db26307ec122706555ca8b196c309d56a011c2d49b047e1b92f75d990fdcd6f2f4a07597bd5d3a9a05d03cc14b0d91d9f771724c98d99bf67011f1353290673f0a6222b9de65dc85d4b886db1471319bcf8e2ee1802f74da710243d781fe07a026547f0baea21ecdca6ab28f4cc44345304f3ebbd96dd3709eb09ba8858f7ebd4e5ed4b6b47dca1aefcf07077d6d907e229ce9012efd7e60fe0441d0c5ab933d8d6868e1785ca6164ccdcf682ed6e0efae5d79dc04463d5199e67c76cabb10c9e85a84b583a87c67e84d50dde866fb3fdb7a3473e5b0daec783f95c21a25bb08691c705a5cca12b5cb38d48b3285a817b2dc63ef58a31bd8a2f5d4dd3f535ca3179674f78b2830a9fe74a19d949bb11f39694d77e687cabd1ff281efc1abbd41fab1d8b4992ca0ea88ebff399610dcfe7a0a3c3415c4ad45f81ce41f2697a58b1b53e3ba0d3d292171833888c14df25d7da8764d70c28d16345d4596f87edb288165de316fc292f6c22693b19cb8bae3482944eb7cea31d8db9ceb7cbec828c134d011414825a41082bb57dcb0bafe39e577ee36c3a26334f6c11ff801dc54fe3d7ac4101ecd2718b92acd3383bc84065c78bc55cc53e9d18cb3293248242786a34d3fc97c22e3b56f5b3ddb9f2415f3b316f6711f668c59a55c51531b0769026e30c992e78c9f90ad35eeff8c5b79a8f437e3b14541147149a3df8302ede119a70aac93e97325517aa22ac5d0ca78cc27c5cc3ec54e49c381701ae9863e587455c52ef6093f3b9fdf8a3755f5d8da0752a7f93f27f4f3f754ab4bae2e6396bb804898e0d058aa22e3d35ed883ec66037fc5b2ddf49ad9b5cb3dbaf983c26395307b327bc42739838e66e7760070e565b5073f40b3aac4a4ed0caff30cc487aa6e4643ef6f12b26ae82b1a56f6cb20d8fd55e78fec8b7c6cc20172c451d1c9a3419115645982db7efa0a3fa1ec65dc025e97f4f327a5c9b652044a93da52f228b244ee0108e07e68cbec9d7e6ba6e48be0b5ac93ed60732aa6fe818830adcae0c84717ee069261d063b77d16faf6ff1c8b975898c524416fc5d55dcdda4c19748b82d854db024d5ccb55279121bdf45d68263f293859fc2eb77327876095a78b03de785b0d9609b70aace31668638cf57e48ab6fcd676c0e85be26e14bf23cce3941412a26b85f8728a6f9cd58508f8dd5e6e2910cb659b836a0a40121ca9fe5349579eaaecf15752e2ab0df78ecc5cc76e92db87dae8bd3d200e70f6d859977fcc069c22b43f428231f527450a0f55b6837d40ca9b8c90862c53834b48af22c9aac59db277bc4490f6f25b369d2e9e1b3ba1fb4173addffecd9df97804372ae153f905c29e14d7ffb0172c54aec6707605856d94f9e8d5f7b2324625817e0a27563586ebadc5673eebd80d27b54387576fbc0a2da4aa2d0148b4fbac56e06b3c3fff73961d4a9ccf08b9901857424d2fd8aa6383fa8e4fcc1f9a7c94eb1aa8706fab6e4a6310c330953037aefb2f2c6feed50c2061e1a88895575b77b4695c6463edd98115c485042fd076641786cfb7f0c0669b8160e1f758701acd4968f198bb2b47c2bbb25caa271eded042d58168bcf1055dcf786678b7893cfe2096028de3e83b97bb76a4a3198fd36bf387fc2271eb5adfa294b08d50e73482c08cf9a46ca917689b9e177f8587f6afa03a9a55de13f9a9a1425ab5b32e9403af9a517cc3e27dcde2750fafe9abab03ef59d673400f4434520dbf824cd3cdf9545aa4977828d13016a807a4c47f731117625b1b5631dd182b5379638c5b54cc455a6d54f7f0b427aeb39a0e8457e14feee072be6f2016bda3bff2e9f049cb04f9061665c1be991d2114214dc7e97828ac50c7cd196ea3ad41afc6761703932bf5da2a2a73f6e299043657d30d88aa33f64fc4c7e351e65f8baf6ea87f3d3fb9b26333137d4e3323ceb6883ea3d9e9ea4319f45f3b8e615ce83b55e1974b3326b52dabc14c090d35f7014cf14941c9c4195bd0d3a088a72dfde006c1dda2200b84960eb47edbd35803a3109b5c54cc49ff91d4c5b0b52a3b231a0bc9d0f668d08728d65d741b28027b187d9d6b7763f45c388ab5cab86d1cfe55ef5a0fac700e63728d3cca6b6dbdc3ddde57e54e234bb5dc6d147cf6d23bf6300bf2f838f81d7fffbdc2f03136e2846fdd8b583d8cc8a2d9f68235f50c209124ec45192043a6533cc29073f0f629234ad58832c9f2f399ddb15f94277d5355912a90e0f7050173964615c44f3dfa36fb60df137808450134182d0622a85cca212196ee219ee757a8b2d36f9070ce15fe0a1068dc3f358f99a57b0a6b1fa555417ba7af4483a085e08359e469212d66cf2b9cb14b0a6d8b6ae3ba2f6535b58d6e934392b445c574ea5209b13de190affb60046b58ec258b245d7ac3a5ad05d925030b470577debb0289736483148047ef21b8159a772605527d3d95a0c83edef1456f1acc7c54aed5a4176ced4c74c536fb584e641dc79071bd62e3fb2998f55fc4dfac5dd5bfe6e03c7638b0fbf6ae4f5745546a5282a30eb88b5cf933dcc2cd2bed7a5e1688f9aebd005682958e69b4c00fe5f1b7ffc385d9375f3f9952bdd5c508e321b1383d8d905654d6cb949df3b02871bea0976873a9c76942ac934ce63ac2956d2856492970d8a231e0b1b178b22f6605ced2085494ec1986f026f68ae79aff750e5b92feb927cd08875e2ad04075518b754829b544e5de910686513076029ffdb5c0b179e39443ef22028086e5aab2a4465252f2147526d55229d3834099e55bc12e1b178ace953a333749091c2017e4b4990ab7adfa90e86599f3dfe1b16e13b2ec367409373f9e5d74fad35e85efc14274b7525be69b2ea34f48c2d3f9a8b9fd939a0c095eb17fe3440c72173ca8ce628dff7ea8d9a43cadc238b891c303b323accc5be5b58953771cf461e0c4e160b74d39793f444a86e78b4a4d95be3d93a7a033c038dc25ad8b78492f45bf082c932afbfe69a70c91e31303ee7a3b84d00c0676e57d23150292de8136b07bab8698afcd6ad28268e222f1ec0799db97fcc357fc381d2ae5e72fc82324ab9b4a032a54044ae456cdfc199069458f0ed58e600d3a44b36406cfa4bda555b18e5236eab0670b29a4ca4459770214c455cbe954beb777ba6f0630a4379e664cd552763c4d3c480cfcdc5f453e5cf1d440f9a223b50a5dac9c529ea0ce64b2e7f0c955b1631a7e28bf72a17f2ec0692940dd5d5fa89973048c7a7e2cda9ee81d713569ccca7819e76d3bcf59f0e2e74de5e55f6b01eb445cafec53aae4b35257d71506e0cbebb7d396861d880d2af8bc90b04cd849763e0f8736c39d8538ae1182e6d1bfefcbb477cbf0206bdc0f29ffe1bc9a29f7d0ecb7a2d82287349547e505394eacceceac4e6de88c87f605d7824968bbc29581cccf734f04fa6b6fac5cfe6ad229b13b0bb20cfd966ee3b59dde485346449aef5ac18919ff69a21e67b3af29f0c96fb76f6d29adf2831d84f98e6efabe227090132844b766577127f6b3c7c54f0e22ba23ba345805671bfa56fd1dcd87eecf0a728e36a5ce364112d5c7b8eb316aa2b9e533bdaa637d579c52b4e54a380c0ec5254dff73bba89a758159f2fa4c51484d00643603814868d15940460f42fca8467801ef8fa300f5b685f51680f4648bda21b63e01e35ab83ff719c07b3d433404f724878818e1eb6c5023940dce26f5e7b5c426140e26de4e98cbd52c8b722a872f3067cb81cdd3fd8c6febff4deb1efc28f89eb8663f4373dab10471b20c04538ca000e8721757e077348ed3d8535f9e17ddf86d8ff670462973cf19557359e0ac1dd35d6e70efbbbd0c1d3a01e24043feeed3b1e00eed4c018ea551ca3a83b4e9e45fa8db4ce3f5da60f7805f0a59644aa5b1140acb32dbff5c27d994e41a56e2ae26394d1e0d153bddae45544e1395878d011264cdb9ac7f86b70f59e2a63d02d597bd3866a3907ddcb2076620074e321f442b82791a040e78e3616dc88fdde6f5547321a9500dfce8933529229cf4d6e70acdf87fbc9928bd2d8e64f86fcfeb77cd19ad788ad4557bd25d01c84d3fe24ec5781b2419c25ace05d4c4149e79ace7620f1036cc8a0420fffd7473a075f0e0f4c87f18ca162125fcd2ff8fc46197dec3c21e768d9585526c8515d73f4d6f38292da8c0461af84f83079bdc5a2e38a862e10cba569d559ab8825a45620cc9aed3160cbd06375cb538f11d8cc8160bdebfda8f64aff7e1545473b650c15aaccf63203f6192f1daf17f1df913a6ef8e0c4b1cfb28024bd539d0e7be7bc5bd651489caa54064e0df8ed5fcb3037ee13b9b8536f456f5ff9d95be4cd748f78baf189773d2ec047af6e7ce0bdfcea8b191270e96ff83e389b7026d21952adf6bc7462cba3cc6ea26ad96d7c9d3e7ccc72b1937eb713163709e0a6df47ca3d5d46a17aa1c67639e8a500673b533f1539865eca172fde1ee5acf184133f246833bf417a008d7449a0caac1326c744db5bbde3bdbebfa17fc9ec6b6876e9a855028f1c09f1e00dc55240a51844e298f9b98007137a4fa3606c3215f9112d9e2d511dfad07ba78bd5876fb3209e8a8295dc35917554c72dea54e4b8e0ebf44d17a9d3a376a6ca34a3c5bf9ed03aa849d84a464a8a520f87440b6c1cc50c24fe3c9118dea47a32515497982dd2222536e98d19fafb7f0ff9981930094e7da7f9c39154750200c5291382622ace5ee791f02d18696fe0b0cb0b049a4726456386d531f02e373f6c060610855b6bf4d8a217b0a95e8f7fd844c756109df36c42ed9afa52d2ec3f102e55c8698852eedfb084a036a2036370adf496fcd55efb2b753973e329c80997ea2932767b2b53e3055f8426fe7294614eb94dc5b50ef90567db250bfa74a4eb82aad715fb9d2ccee7d1e5e137841b916f3f02d306ac6eba0ba796330f9718f23eff3eaccf5080879f024acf18e2ffea58ae3d8e8fdf6331a9c650c12eda6e966651f0a5c0ed57f674193b5868344853512d875e1a50de52895fdb1f20e5adbd41c77366961cba03b03e40e4ee21feb3a1e466ab6da6ea05f39bbdb3ac5fdd51188a51591984af96999be2db73522af491fc64dd528a8c322ea280e79cf1073933c111e410ce41977955a8a5bf6fd4fd699d095c8ea4cec1839bab22b742325dda953c7145a175ee96971baa9a1f02b671eedc90ec9bb79a3aaec7cbc4fb66a5552e59677ea655833987c152cc0abe07f01865e233184fa69b055b4c8cc3abf9ebb3f02e8485e83ea94d25061cd90fd830422cb82ac29fcbedc5ef0cd7430a41e64c8a2e1fe536083012cc2c5434fe117795ba7b9b42aef27a190c736c228a658c23aece166e48c714fe402e3ac2919a0e3996944c3f8504882739e91509344d265de47933c925659e380872972cd25b3d55486905622ae76017fed698a00ee2fb25b4943c9ed5c816e9ac623219c93d4b1259649053a7854a12e3a2be8e230a55a1a788fa9461dac438b464d5327d26829750ecb4b904c48d4071b54f7c78ae7af944bd3554d081ef4ea9e2461ff6ff280db568383c478e73c82f78131117b7b356139bb5862aa7e15213434e873cb1869b1142e5857aca42d2a551d2f6070b48e09d8b41d17833e06d78efb5135823e46aeae1833ca46043885ca953d2509481be69f3a3ddc10d35c7624e436a513c8aa1cbadda09ce37be10dbe95f4efb38a619003ca1530d1d288758c8c0342fe6bf69390eb192ff39fb92aa77be120ee1fe18e8cf04db644b00d6e3c5f31bfa08cceabe6cd1823f4d413752bd38c59476d2e4ab12931ccf7f07db8aada5c5bb89f94be12f037f965bda265a21940f92df6aa4d06f18bf55a183bfd5e89eda7a538eb52bbf0d310d4c0c884a0d9c9a12040e81e04d596bff99bda94cdea6033d4dd34f2285b742ab062085abe8160b1bcd06a3621420c9d44ffdc278f785e80e5f104250e7cb5779725e44041acb0db6229931de2b3381dcab8b31e09c0230f4718cb53d4e0f1b7d780deedd0b8346eaeb1153ddfc5a3a1f96ae1f0c33e783f86b90d16f234d33c10176aabe23065ebf10b433e6ee5f9ca6f6afb48526fa8b203564bd70cc4b4a4df3e2a130ca1bfe3d79cbf68169095178b5d617d2db04ed76b850a2c8b3d206273897fbba688cce6d0e9dc736d51ffe9db96b717bbccc5402da9ca8fd3ea90f59b6dedfe5651f7556b874cc8e9b6a4e1eecb6e9092f1c66cb848ff699d79a0eeb57fe7538299d9c005d962d1021b2e60234ffa8039ebacbd99f72b524e56babe30141e63b1ccdea74e64c1345d0be71517b8dd6f1706f2c34118d0c24d0e58d4b9eed5a76a67908b93cdea6b310589513a8a99a5b0d0331e5c4282423ffd05d2a154bf87230679dd745940de44a46fa51a39b1ccadd3e81f39e8b25a8dcf4c2894ea3e9b6206052d7ebb67160e451491354ab85c648e8c56689fe363cce18656f313d55cae02ccfc0158bf9ad48412a5fa321fdd5b6c8a4466cc87f663d06ede4a6606337d693bb9aab5cce55dcde443f7844ab818fa7c79c2e3229ae918403f195553b846c5dbe6e947117e00af040babb5db8513b4dd56fb9845c9c335b4f9ce665063909518143ba12fdd4393ec5d854b44bcd228277c8f4063fb9895378ef81d5ecdf1439ac210487a8bbd0917ca22b918d7eac0e55aec7fffb8cfc3327f24ef014fdf7dbe7105a173f1c39b10d1f283ca6eb42b816291ab9b79df5c503ac36fda71b19ffd819a40cea80db661f5834fcbd9d4a496341d57a9c75dacfb5251f43ccc1e26f2a43caacd36e1e785a53351bfa1a2e8ae3ffe18bd29b141ae465f30bac78baf28397b5401f6e6aae681a15df86ec54403f6a243480970c6e3975989d6ec7094f8c1b4b0ff90827d1eeb5ba91899a26361e8b87bccff229925c5cf8413c37374fecd9756387c5bda9972a0e782aad0a332968f26de633d250f422f93f3b4facba4bd91c82f12c95fe0883f7de92ac6afe080b4e8deee2716ea9d085de9597d158532226b560c61598ecc85f09e91fad60627c81650e886db5256c836872970cf0aabb7d44fc19a63fe9ff2d42568f3b21dfc1753d6fac2eed0d01da23f9d8c64cf8af0777ecafb1baa73249d101837c0928e4105d38d61cde0c94745853e16832e603ae9659109cd2cf689afe1383d8dfe5ed3c0c928e9f4fc82f384ea73a586b1bc158e86ac2d04f09aa0a11b417b76dbde2e093a55d1f0ae9d90e4f1e6c00bf40f1efb6484fb6f9fcff80510bc8817959cde43a98ca04d5189bdea1e0fec7f5fd995a481a3fb597516fe508411d9ecc61b52f49935eb679fd7c908d147814d7f9c381e6091834f3b0021f7c7d9f762e7ca3ab08c09f9dbe3f840d5be363512bdd764cd83d649dd3bfc117f5e8d47167529e3fbf4517216b86bb3b537445e5ba50bba365ddaa570029b3b5bdaa46f83e8caed3b54a4eab4a7c2a03bdf0a9384cfb996ed71173ca4294e0e21bea7d717cd2db5033f8cba121c7d84de07e14b2a98618957403465e60a9518456d00046e9cb2e9c8176166db90fcd02054710bb9898400085d8ab7b240f0d84b78657dd4d20aea0e7edb775dafd1208747224bbe2d91a9851bb2a89546e1ccb86310aa070796444ad8536234b38ae497528d91a4ff3ad4322d24cf0b97087400bfca1f51a7c56711a651cded669a9ac5091b540a78b01ea3e4598181bbb55ca8d0da54612d48e0d77b6f10d41380c184cd44295b24c1f76ee3d976a42f78e53568c9efa212714010c9f3b1a554cde77b21a088238db0ecd7ae2cf4cf5cd3bc2aca212790f1eee362149846cda4e27b0ca8a8e6d00e3d6d92a5bca27fee463ffd8778b2ba4602693fedc536b98e5efabdc4d5cbfd30a808046d1106423e60ef121329078a796c4ffeb7f317f57ba3f50308afae179f813ac156b27692d784482d1fbaac8e267ce642f5aa510de751e870e6af139ba569744e05299a0e3440e992ffc5f831b7c4ea913963786f6bd9538bd15c7315ecc1530efadee6f0ff2731e825a3a111b7c4bb6df5b6f49673aab4b86b207302c0193588aa5ac40772a7cfa1340c0daaa10ce73dbd0d6c1f99568a8b169369ded9e1ca4f9625d7ae49330132ad47b478fe0dec84e1ef3577376d4378664dee2694ab5fc830b88851fd597520e3ef2be9493839d826c4e719f84f8e14cc8866668ae684872c8b6c9ed99b99f09a7ada87fd1c5dabde370794368db8c4dc0b791b2723c700cc36eae19879fe36137356e1944ad6748abe0d528ca8521cf71f8cb0e3d3a5c9a21389c694650045f1511762a92422c6beb26ef1650ff891b06d17c46b768f4630d9cfba77fd4ec4b6ac92a7a638d116dcccb2dd5a550aa79a5ca0c2089d021b1ad233399d934816d5de6f1d06094ff987556f92c6f806e30776ce4655b7ac9ca2954ac08fd77ad0c17ef32f63061dc320e4fbae45798bc8aa33e6addd46cd5f7aab8cebb92a55772bf6c57b27cfc9284c13fd7c5049f7bcd51c9074f9db02e8058d5027c41c767e57ee5c7cdec6b07d6b4adba971f9d9542ab9323845e4ebaad5a36ae11b2e3c4ae7ce3ea0f27b825700f21ca224f9bf131d6262745be4c63c6d9603c438c045815e0ed283fd6ebd299fb236f2e3d9f77e2fd0a795865b41012fcdd12da772f0a61d38ce927a00af89aa03c118290b40f9c46c58385fc8ea9daec339a9e1d6ec2dc7c47958d2e1f7ebb25f318e7f1dfa1a9d9e1ac962be01566d0ed3a5723c868cc04a6943a27314c44b2d1ed25082a154fdfe65b5199b43efed1905ccc3446e57a92314ef634494a7d715df6047c9c53d7805afa80ef110bea17a667c6f6ee1f2e4f712c88fd6e60ae881f9c4cf63d4489e3c7f0e9d4006471c9b7c30d11caff3062ed94ba29a8761e1f9f47c41d16ceac31b4a555f18731dd0f49d7692ee26dc7f42def5261ff74165f6660359a2eda8a91aa818beeb15a7412e60da2f53c523c2dbaa6194c7c42de6ffb4d67148e51692c30ec557283c87ffa15cc7f0de294d7341b1fd79326c8be78e67822343c19922ace4e7925076145ef5f7dc91fdc1de032d8c454dd06effea2b0472ea2421c4db20c0fc0b0440e10184a8648d230d39f4e7afc57d3229de514e0245205a840e1ec7397f2bb42b8269d6050c4cfe8a05cb1882eaa1d84bbbcf7fe765705746f98018a4ed7ed0a45d0a7294305bd0c6b5e828ac413623432cb7292a5064bb090b819d99d36efa39f565e2cc7d245a21ceeea09255b4a38e85aae2519257f638b8a5be9ead96815ac00e9f145f50fb49a54118cb94a7f9ac7b1d33e397c49964856f0419e860169561670002334c249cfd81e9be8a7a662b61808666fd54f50ae64006a220662a683df1de2cb58066aa2c23abe1a3c6a969cd6752423f63c99a7fbb2eadd2132d41da4161ea329851efb598c7eb7cf704063344300bba8b6791b642e4b369e1afc0bad833c156ee46dc2e63d6227296367f27a9a82a0b365f9f0e89d149747c12435428dc488f1ce5fdfb174f3d212e91431f0a1333adff3200fcd27ce67e2d05783ab5c3f6478e9fd3b025ab72151aa4e08dd819af1f405f7605bf3000d38ee9add2f173510ccdd4ebc2117387ab0501d5f8b61402eb94684cbdc2a32f311c4f72b18e62cf6b5535a4b55d2fe46f580891e406aab57f75bd13996f3ed8035f97555acf2ae7dfaf32ad1e8b38feee9e49b2d45c465d676efe690d277b71c6b361c433463420d6564c53420e375d854245a74e296f611fea8c9bad8dd1b2f7c23f5def761710ebc4f335e468a386efee8cfdc5e08e472572e849df04e9e213167070c3f13c1e8c85b7d35a1cf5e17aed7004b0344b95f482a1f2362f2ca5b50ab5bb652a1bc045131aaa37bdb713a2e99f7aa176ffc429b44a03375f02643a196f7c57934eac81f78c28f1ad6f94144d7bce2e3b43682162311b473713a42eed1e51ffcf4d29df9d9cee0c7e77c93b93955d9af39ee8782707990a29c8fc1fd032dae2308fceca8fcd580ca3684985466cc79c326acb9a6d2e1ae4b9aac2697d5d5583698f01bf588df566bec98b8df0729a966a4f9804cf250f6b59219da84efe7077cce3794a526f54af231415b20c37250e1db5b443a77ce502aad5f468cf86aa23ed058bd837d1d44a62c05e9e143b1587cf25c6d390a64a4f01305d177996711c4c6db005636612cd1066fcae82eeda87f118463115318da50eb93e20c79e53c56d949c4e5f8c9eab9e60466fd2d2f2832625a8e8af9f4da925d92e31441ec0b3c302870f96c5c67a6f54e26eae87ec0dd0a66576ca5008cfe93893b58988566bdf5036e5a392289e25bd4707606e258c73430247efe43d9dcb200529d27b635234d5f25d0082339b43f1ead683063d83906415e89adc5a773e57f90ae958960b462c6fd2381686063c9b546890d0a287ba8206e55598ee00c528f5d528b06cfb95cbf5e1a4bf8e4382320a1a146de31d54355baaaaba76aef21b72150b1346a7963d3b07f0fdbaf7b72e7287882e7d98fff69ac504b172f647b804471ae1b1a3e9d885b18741aa774e19342d56a2e09f003e3ab0ee0e615b388712e7d2bc3c54e3569c7ae23bcb66a95ab5681a5baaa41784b1eae121c06236f12473ccf3554f251fb5d08c3c9c3a7b9b7ce45dc94a2cb852a6ff68bc2e9fd59ebf8754378b0721ac883f0fd4ab571733f11e7b7c2dbd3530605aff0e0a58a6d85a7f22e94bf16b757a22c79467611ebcc872fdd4e3ba40a6a48a1ec7c240fd467be7939926b2650302385dec5edcf4be598e7f73fac85d1dba09325a04dd7b519a3d30c799be90fdc6cc3d5cf02f2b813acd5ac9e15bdd0e3754e435308293924c0c84e5137a81ae2e7ae056d9dc45cdd2bc3a5725d9530092f9bef9e3d4c870f7b1fa72226ab99cafb0d17a6a68b5fcb7d778ac36e5519d53640d187d489c9623ea2c1f5523ab51d0faab2830590e9650ab9029a2f45b2d0f3059019b62824a6701741d1a29d95618d4b7f0aa31b20343b53b5fe88ac2481ccb4d459c971c2627847d2bffe1b6321dcb9254566732fbf760b4cf761d496712a134751f6abcb1ec0fa1ac64efe44e264bc4d3c37e23c8e24ab6f8da203312676ec8f0826206762aff7c1ee7a8c622e8d1b9ff6ffae702aaef9c5c934821d2a160554863f16bcb7ad08703f6b0ee58cbfa0c27ba420f21a7abef7b2fd99810574263fd42ad6f5a422f3cfc207cbf58562115fd31080ebe6f2c1ac50e68f853df619f7f9d0a838b27681857e370db8a0de371d07291682177dcc8dacd7ae535c06a525fd18d3ad67127a3b7be41a59659bdaa51dd929e03482a542cdb93c10ea0b9171e9e9a17e4e5ca698c2f43cfe5c02c29e2006032cc56b1572bc7282e76d6da682c42d58d0ecbdcd455a51b8d00e79b6b1159aea8f539fe4c57fecc8fe6f93ac0196cb41cecb9eb6e94be1d9f602698086067c27316586dae5200d567d77e76b9567aba49d72652a2d9e8ee698c03be6c4fa9402398388bf77a6bf738d0ed0aae740b5c968697cf1b95a3e26e0d155b114facac2cf350d5a261ae96856bab6339f28d1f7553949d33487dbe2f4bc21a91d0d06b11d047d749783737eff0601cc6428e7788c693698462e4c63fc090595883b3015487740d575e944fab0771a3ede47df923681a907985679ee21416b3efc8c30377b17be456655462793976750b68da18e7b090ce9d2074ace8aebba6d2209ee5fdc6a608c12cd604ccded51cc940215b4828ac6069c49a749618f5ae8a2b953d593fa8c71235c7ab0890141781faf244b748c3f269c2578a9cbb5b37723a545e0c94fabbe3e077d9ced5c9d1e009bb49d7895df117da2a534f2e62de44dd3adc9a6ef26390dd84f582185ce84dfceaef0b72f0e8ee5c91633fea930f6c94d74d9516463ab38d6d92c4e043d736251fb8d59e134677da1b4ed178724743f1b8055f336ccdb670903609c6251b2342b81bc8533b962ec3265ac630771275643bb88b3ebc893417ab63b3226710bfb642ac463ae0548da8412b60db17fd7b7cf0cb9ba0dbe996e30d80639d807446005ddef1cd980e0f1a0a4553b0db64b0ac65a2f2f2418b69733520ad8017a260a158283d83d93f4d68d01ce16a47f4df6318f333bb63db2648c0d8c38283279a29c00c9be60a44a3453136cc5fd40a32317920d064d95557c42f0d780d59705cfa34109f7cc1dacb1fbc07670a062163a804b05b7708867885de232d99011913a302c8baa0964e0f58bf23341164e6ee375a26377a87eaf2fe6cde46be208e78a4ea996009de3aea90e90ec5ee66b73c5fc7f6e6d7bdff61ae498365d52e4cd6802a073211200e0758982eaef9820ed8920ca6fc2731304f05f2b70d8690d0c7c56f96b34f0253c0006b0721db5d7a3d6e66bae9d1882a15a606eda03adeb6c6d519cc462bdb98cf38c02cf0fc4f75e55584a7327f1959500ed49bb07a8e6b4e4fb72c6d2032496f5246047ef4de8e6ae7d50068786b2a78911a45d0be267ae885d61bbad49cd23afd5b224e2d81103885d63aee65f43a19ed1670638e2d420027e52e91a181efac9a7e0ac12eedc7d8b016cb56c05ae49e6377affb63097d3f9672e9942f77ee5eaa2d228a716b01b6070546140ff5d680a4ac590ac54168f161edb144c6e55aabacf70dfc9d9f5a6afb201fb8bd5b6c5b112300042d6bb1b01ad439f61050c12e335a31b9ebe14e71fd05dca7410232a8498a499a23fed41611b4c85a94509e50adc5122514d73a359d14f1824370a5d2ae307a1f11713c7de71e00c4bb5b5ebdacd633e080e7ba505bdbe2bc3d2d5274cfb43615ae4977621b6e67e70de78ebf80fc2b4eb8a94b4ca9d944d7869eb5092e93e210330e016d2f246213f46bbaf0faa54cf244827975078b8c36b85b4a0a3b4e2291482566f992ee83ee177e4fdc5a703d6d8d09a17405612d8c5ad98df286415c0b66361481c71b41c7df95d9ec20db61032ab57fc423f8ad3ae6affd4c802c12f105a696b06c392053c528c5aafe455c65760c40efd3c08fb4d4351482c95cdbf4cefd69efd2c6a3f460cdbf83435c74172774b141a54749acbc0f603fc2521b58faa10aaa9b52413c2aeb142f807f6c6a97953d84090b6f64f6957cddfbba55c04147f57b465a8c9d8c175fea462c9a024ed432018f6b65702c7da6e7d5d41fbd0b48c6cc345dea9b2cc91f5df4e28150c5b85b54a915d070c61e8ad7f16ddd91e129db3815baefb75576cef52d4fb6f894b805f7d66914d94bfea538deb613f14b71cf293b101064ceb6eb4a5fb2af4c2469ce5597f3b70c26a46284ee6b575da2a6ff2a4 -MD = 9e99388d377aac36afac4a8566b9d168c6f0faad772b3495379d680a83d5b482a617c89d9744f12694fd47d1c9dfffe91ad04bc3940faceb2eec299ac386c4d7 - -Len = 84976 -Msg = 12b89aa3e9a7ac15e01d78631b3ceae0720e36f7737307c0aa5ed9d12041a35721c6ba6542c0f28ba36106ab72ad3a08b02e3ea038ea56bcfd92b8c593fc3559f1d31c9e758e5cd6289ee83444ec60eef382ed945a886da0d673d04e8579c1ae094889f788f7311ef73de7a799e1a4bcc2710b7ce1379395bd69e815ffa08f7df18bc91785e5bb8a99a4cbac79744d97a6635fffd6de11c33bdccac10859e7ef3206a4a8733f4043953d5ceaed8da5a926c0b2c640652f51d7343cfba98c102c5320e24f5bed0971736f620afc14f21acaf1cc7827b335671ad9076be921535bdc404ab644d65e3abca1a4b3aff17d121a5c75be93b26b2f8b34f3b8d000f8a455d0a68536e486c9f73deb8e0d0c8eb89f6a75408d4919ceb2abc78b661247304737bc643afecb44acaaff431e4d6c34e08393a51c60866f17a74d8bb43d87273add54f9560c73d46450a879ea9d61af6510989649e0fb3843914b61c16a02b1b42a38ef94f7c7a0a597aed87ae2b351b7774dba1bafc051bdcf8ab49582fef43f862fecfca50fd1fae7d80ad506ab415d2277ba9ab61de30dcbd22d396bc41b6259009895ff938ee8a8efb403ef91a8df77e13dcedd5a16bcebea74b40f9c4ca60b749d67ed9a00f942bc810d87adadc6e052ecc00dbe1151999c300e54cdaf910453a07a586e4eb41d0416fab4467999c4916f772c92fd543cae095024a16eadac654cd72655a1a1a1921ed260a633e08b676dfb231e014d3be9a981665eae826c71468541982149372d3f9d721304249c9c8e55dbaa46c50015b5a9024d9a96aa41398c8f7ff533459c2164d2d614eb61f87b8c3b7ef444f2fad8d0dfb65774cf9bcbf5fa5146e735a86d2f68378ac04143dca82ae23250795fb8ffe7e110a14448a4c769583bee6d19cb041c7d8e28a44458b2921d2873fd0efd3e0115eba670106d0ac3dafdcf57b7e2edd6f24aadf2c498b15a78ff34e6cd5093159c100cbabacec6f220b31259495bf17edce3d6948b44ad6a3bdf1b9d6559080cbca85b8c106e04dd728640dd99dd18fc84842bf06103aeaaaeefb1889ebfa4ccbedb194dd8f6cc6c179ee04a6d116b383253356f0e7dbd0218587d103f2a6f3eead0d064db0d248759227a088e9ff11a2e787b79595be15ac341089d1244724a87b0073be15c16167e3b977fc42eb38bbf1c86770b45239af5d3d898ddb2b4d9dfa24739b28ba901cf10be17d666b7712e67dccfece289aaf7367767691f3dd138cf17c61541e53094ca77388ef107b6c48007ebc4db1e7211916d747e31161cdb5fff4ad326d38c15904a4ab274ab40c6908f315bd7e7da8a0c4026e39046a01079872db4e37afb998bc0b50b9aa9f97fbefa0b797feecbacd17ae462e5d5471e4538d88020e3666ae260e161080bc73633d2e0e57b3a2bbd05a218c1d8ccf74fec99b1ff8414b6cebeb2367c69d99432169e186872d3e406d34129c910329ae9963321f9b817d10e473f1d23631947bc90e71bca0dc2dccf61de7f42360f17356a8c913564f4a172a48efc209ed5c81cc93450d3f30efd60d70182f4f16c567b912e677c2fb10d41fe283c39c314ff9ae80d214accbf2d005e339aa7ea503f0333a10d96c158fcc57c9346377adfd47e16faf5f942de56f81efa2f22c9c3ba14766be94bc3f05844475981e16a3d2f0f7a8435a6fb715f913ee1a92e35cdaff785166563dd820807860154013c36f8963d32471a9f833010e66d7093d67706f5862ae7a5b615f4566214295d98d2175b868d941dd719b1c04028ec1955c8a754a22dd9daf7b10479031967bf241a74a67e1c84774b3dcae8719985875ac97a5c00a9a2ca475e20b7909875ed8b15f7bf4c6780efa2f663cfa448a4a78c806857c925aa3d4f253059321abdaf73cb89ed1af6ee4e844d64beffbeaf3f94f7578b242a59fbb70d1ca71026a6cf8545107a0d52375c9b48b5fdaa821018193630413a3f17cb261fcce953449813688a75ac4f02c4e18cf23ed4ce1c2dfac443dcc132ec4c774462286722fcfb45c4a2a1cc088efca50250e88b931570ad3d28425335b960c5bade1969a6d7382b43967b215f7f466fa36c996920f440f82bed493f6b2fbb7e309b8536065cb58e8b6deaf57d5b0c09174d3ab79e4104a43798dbccfbd5c56a4da256176b14db35442fd88e8aadb53907fbb4be348526790833df440e33e750bafa7254fd8512ea17e52c35adfaa9c81b7fedc30b460d3f47c53cedcbd287f91fabc335e339c373ab96ce320ecc4f7efae0cf114a0f21be9b57dc105b390f2e22be2f0146b85499aa4aa5cdd6aa11224d2641ef1a65cabeadf0a6f4e5f0e5b56e3aa0024d882f24b9099b4e2d1d567ebb592aa4a3d27006249882e392807356a927fd7e2133badc82dc97fc3aac8758ed8274790cdd7b5fa95758238a701fdb7c8d2ebee9415f89adca822126df0a798aa906b67e0f5391e43610fdf448530a8e751a0ace3885f2e2dc4203183e48a93bd4c8a320ee60647c3c93b9f89176ad88e6abaaf8a293e0c819c0ea3952a9afa80da2871b040ba01a72c79fc0d2f08a11e9c8e58e06f31b0789e420b1a29655785b7cac96d9ba0c65de95f77193286ad2855904b9ed0c6b483497eca7b6756154c73e58baf3d671068ae508365d881472c2474fa0de46983323bf954317af9ce357d0d4afdcc897a47ea01b35b677529aa8780e6c6109696f5d4564af4cadcece151a689c1cf746e8c1ac7896295deaf240d58944febda7a5ea12a110ddd6bfbc09055ba939ca46795af367823ba3a521914608513eca1a7cd30d9491539136563a77f700bdab5e01545c302176af4bd0a3b4d2baa8998a9d1f1d84573548fd44b05982c630015825b4ce1a9a61eaa4a67f0530a8c590bfafd62cbb8d0b62da2d739445261833fa8f84336e1684bc774c2c236a431b18805b01217f595e4796b98c0e8846ffab0de7cc7275bc688e8e69b2f4c8b2349a9749a6e319e3b45ef99102b1934e6cd058d4927374b594c6afa61a62911e987cca20d05cd1549811ca5ddd64ad67e80aa5ffe01eb62890cea3ab6b540faecd28e2888473eed48fc7d3c4250e1fb9fac1ba10bd5b823ee50c321fadb1888b5d04a72bcc10ba8a23e9da6fe399326b2a5d60ae32121f1e1aea23abe96345dcd07ae0aeaf1b7b9fdbdda8061fec2ba500465f81452bd6f2b7ce40f626518ecaacf057bc367d7a3b3f0c0530dfef559105e57f32008eefdf45224fa96c63ab7d7bd0d2fb671cff84d8deb8952d8af754c0a088696b23b20f4b4d196bc381e31cc4811a134ce151a52dbc8bde10a55819b9e041cd8dd366aa51b766e534937fd0106bf7adedb4bac4c70c44b39128c106790e73076e8455d7dfc8febec681c7c0e6f63071507e800a2c37acbbb6fb7a438790e6bf161fc5bf7ee8a89f82330315ce8a8f067f25ec9ee6a68b9f8907cbf96bd0629c8e8dff8ab57f2e306e927bf6508fda15829346a87dc0a9071232fc50ae34af46ddb44b5f0df556189584778cf56dda455faed65277eccd995865546fd72694660b7ef0660db2e900fcf23efe448c573f2060e3c25e94c10063891c7f6e0ddba421d238c93d1eae8fadc51975c65519aacd90b720b91f4be23b849da7fc514aa7269769ad25a26f6eafe35019012ee72f6c26989511f534e8e9401c100859aa1822b7cc3c4ea4f2440a362b117f808a760709cf49ed7e43b974a3e4e11a8fc29e1d19a99e3f8e00bac6a5f186c8b4cb26a523a463d52142fee4973c43ba5a5ce220a548fb80c66178ec17ec9f623070e74f5b5e0b5149f75e41036b5e71223e8b3243f07a9ab6dd2584766285d75e41630c99476bea5b2c8294ceba59c65031425cdbeb4314c43c6994a99c5fafa5083fe4c5a5a827c0a711e5e2715d424afdafa5557f7f765a45ee2698e256706c8b26dfc8c1ed91e031b43a26d8916b796a791599f55649dfc159412b7c92a41d93be0688e360ae2391139d82361ecc454049b49095ef13bb7955ee4ab13ad21fe8af60ee532909f291d515ded52bea1746c68b20a6735f55328834ddca7783da52a2f5e2587127b3f7a2aa22fbe14f554599a1327209b217b79a1bcc0f703eb6993fce4d3b6092d08c246537f16882690669feaf3fda9668cf34abffc84e8b1b842df215451dd1af18004d03ffe70bb94edfab7d560e92b041feed5e3d38f271dd156924bbd16cba63e16b6f6c8673afe8a3af86ffcc2f58d69fe8d2b657fc206a9e3c60e8a3eb57346dc563826f40b19b5c12b0813cf3c656c0a4417ad23090f47172b313bcd7f0544c66c887c7fd292eb2dde52687686389082a95d2d21729423513048343b8ec8c275384c4b92f7e6a4f170c34d51697362081b4067f37541e93283a816114b3a2a69581816a601817d8c80df44d84cb27afb1885e001b774e33b83f553e75ad5e7035a50605175ffdf8f8d0ae183a65225ec3f7217e48fc9bbccbfa470162428a2e3bda9ab0ddbbe355b03caa5dc0cff0d5beeb99204849cdd769539fd364daec87ad07869339949297f73b2f459f6f59bbaa4b0c0fa1c8ac2b9b32a4db02dd4e24951413d8b352d367d6b586f85eaf24b890ffc372dedfff61687f9f42c4b376acfae886a4d35d6c6d5490f89d85f61b7677ee067284f89020d922d82f32c42cc8e56d2a22221d255079b5cb5d9cab049a67021d371d7a2511f50497cbd5783a205d8a467727fbc8b84d0c475f2c38a8cf68224fe831cd87dbc40b243d3438675b6a2721ce6a5d1b4fd97db6ccbc04cfbb8336e5ae46597e274e20c6aed76a7a22142d044d74ace8ba24f15ecbd5774006bf2727b0e685d29d9c2cc74647783c1c6482371ccc51f5a4364e8985fef9c55925db5d1798bb4ae4b5156d2c0bc875f2610f0264fab20ab3187e7d21bff2245cbb3bcf0ae563afa5a1c50189abc4ec4b14bcad4d8739f18fd16782c8a0ca26b68b2fc5b253e3c9876922ca84b0d26bd083727ffefa4d71e169f3e2a22ae9930f9da086366ca4603314161246a15cb829b817c1a0db555151e909e3d6e4b83311f7745bbfb80e3c50aa881ff706c99cfdbb94bc5ab3bb5a865890cf8d579dce62a3958c75be8a2487345f3bbd6881dff492d2b55509e65429be72ecee09012baaa9e9617f067ee280b885acc34dec49b747b8f7b8653e07e124968322844d13920f5a210618533ce241e1ba2f4072a2eee22dc9ac4f2b3a5791e4db5050e74ec1dfcf16317d72fb56d45baf2ac67bb141691b72595015b7330d443ea1f339a4e1212f8629bc41e7837bdbd1db696f3f56e6693be6ef64441ca09ef23df7a9dd97db64ba155d2ac7123d496a6bb0b614d860ff6c7cb580aaba53da404be4a1c08d1755fa1ee89464aa238dc00123b8f86de0c54d4229d2b0b62de070f34088166bdcea8e6ce6e787f433901bc64bddb3bd6da32561d3c020b83698ca5f95c6a7d8330bbd26df8af6977738c5e2af8e0c710f813e003bb3c16777eb96b46ac33b7d22a0d07559e77a3cf76e057cd831cd31ce47de48ea145a6cf7bf1b1d48e69a02b4910f80de65da8bba1b22bc4c30bca4b3dd4e616749b46ebffea2c0b6998b0eeec6c270f56ce02bc82565cb95f1a273c52bd6723abc9716d58e73c53c44d849da28316c276452c5297616d13bde46460d19bda3ecd3ca0c4359d655624d475d7f9da49dfab5f900e6f47df5c45d72c391904d1e04f817f711451398b11da1efe50e622af8c89d850589e160bad8ec955b76cc080a924480453c71b5b01cadaa1564b43ca90306fb911c8c3aa4b67d6273b5838c86091a4ee92539d4e8b235331685e2fb94cffb0b8f94c4aa0b5fedd3df33bacf01c4610a04e7b41fdf48ff35f05b348e4195455d09dbd2d8763b048fa9dab9fc032de15b9f6c27bc1f44d556accdf11e38bbac9806d8feed6db28a3fd990c73912ab61eac19bddd330107d3e51c263d202abf8658f738f11782c468a753f2daeb8a6ab5e725c1d8d9812bf96e724d0d326cbf16bab94cf6b2011011987ce34857c868560ba972e11e1b4650677da81482c855f5362230424ecc98393162521e3e6b4b898a2345988925d353507ccbe5a9d4009c4bc08776365bc94a12b2c3ff27f960cad311ce61a3474f9cca2e2cf31ff63b867c22b70511152fcebcdcbd5dace95484870351dee4e6377724d04fbf4dd5834e47b7536167af4821804ea2ac35c1a36106568452d689178d0121a8bccbc8645e2f0cc13d92808f0d0d87187d4af8b9cae1a9ea8fe0b66c38ef80cc7e02655b309271a4dc2a2f80cbd52483435515143c997bd8c8abd4a225307c2f759a22d45022a452dfb702a9f857957790fcad5f30ae2ae3af909a55bc74824635eb976c4750136fba91a0870d056879e8aa07e7318055afa7274df3793c21b5318f198f909b2d6fff728f84947efbeeacd5db38d9d08a8141d88607e5f7e8d0eaed5fba967470c810b2364f0914ee5a60188de073ef17fcf23cc91f8d28264dd49ea089f37c7bfc80d93b32e577be51b4daa66aaa5cac974acc8d86c95d8860811ba25a2203bd91d26fe4dcb417ca48eda4ab33e7a9b6d4bdf059ea45088ddd72dccbb79caaa41c87dee9a8ff65b0c4acff02d8b646a539ce50a4c66aa984f91c6a833edde1cdf113cea02421f20049655253c580c4163afe65f487b4b12c68003d7f3c6049a9b3f887bedab63d173b9946f486f1a2785cb098dfcabdcfd29ea0de065cce32a5d9c8c27c3936b7843fcb359b9963525a13a761bcebd056260180b4bf0c624d70d6e6d79ecc2df1c5ba7db68f79605419f425691287b6d48525226a1fb7e6ea693fe56f6d00066c6a30233266a373385672cd17871abbdb7e9e08668f0ba6aa1d7946d28d715a87d0354e41a7a4067f9e1400e5711169cb80c09522b3643c0cfc278da966ac84e4963e715cc907b48a4f6c536b67084b351a316b36f35e117383af1c6c8efe20032ab01efc512ae7f8e8c05701df6bdaa8c974fd0be555b17e528485947d02c6541c3eb9a8c6aa2b4bf8c46e5150b882871cefcd29ffe7b69dd75c6ba9a736b267d93ed3da9fe1f8e40dfd1bc2517aed5073165e09b9807b52807b01249426aeaef044e00a538edb5186bee1ed682f85a56a8d223398bc8a2cfc85188dda3f05a9dfc580c077fd3d24f1ae433afb42b5f661c8ac2013f86d9d99ff045dd00c41e91645189573a9a8deed3fd223815128b4073d6e67b1d09024e73d470d1c0afddd325829f1ed30a8dfb7d7f14f90e7487eb97feb7308b18c4372e4632414b793f69253374e2b1eb7b8102b3307b0518fa6f6e4a5ca7f27dc79bb78eb3b609eaee5d4eac332e3c05fe8549e19f4563c78dd5e201fe68bbfeb482f6f41ab862c98fb787340287dc20bf113a5188df9149e824da6dc4fc4c6433f4d3c090cdbee0cd7db7140977f903652cbd4a14d2f566b2643dd4d7ea0f76ebfa36393c7f85f54db9c8957285fb7799dfba166ba5f9e6949df57f5eba6afe859b07a847551fd1ba72a1fd623a4a44033119fbb4e0049035d8e9b682f5c7c2a8e02e55d8d7f43cbab12a94031c4e324a2ac242180c7d2d3e1d01c16b228d8cfdcf9388188e6cfef57d4ba47db5700817d29e32beb0ce85567225e740c924222c731f892e01f0de15deec73f88d169011329315ce545e6026e13d712a72f44cdcd1b89f43b9e6a5bfdcf54a9b2aaa90e1518a3172809586557131a750a665d4b5f347147f3cb81b9d804e718e1692d12e376cd0d0bddbbf8c2ae9d1dbecdf8161e0b52e0914cc0857d1e030fad9381ba1ed1f38109298d273154e37f2cdca1a85a0e8360ac88c3495d791cf07f90236e27a8db15b883488b1394621bed08e68cc3cca73a9e15f67fe9b4a95dc005ae998e69c85d92617a9ef9fbad6667d9333dbbb422f0fe6ac683a24f4cca276a7fd6b3a36fab1f4aafdd44d939f135c41425d2537b0635fdd00f27b75ba80e1503b057d425a0c7a534b094db7c4edf6015ff8829340ced559f7cea6b7a79fcbbf680bb7a8eb11417b5d35a7108d1bd2395054db3d2578cf881575afa0dd26bb5b4f28f050f6e9d08bf901618541c67853de1a371da788d5d221909d1aa33e3a8cb7023122c2bbafe9e81585fd2a1571b5d1f29f1b10276f9fe5c6790c400fcfba6741810699b067fff1181a628e3144c9f1831a1fa67c265727c04a5dfdc0024d288ee9e4c1f07f34deb3299bb64179f50676b011b3b08162b02518f7227a5badc29170a483a27fef768db990ea6e99a3d77269d97dea0928489eecc1f7646343fdf11e2e27eeef9a804fd22972e02b3a2d204e5f4d534412b6d3cda3c3a7a175a156fb6af5fd589cc5a07c4e95beb722d028668c6a13bc86c46bc385d06a9dac756a104035f7425d0d29c0e79c30c5c28831ba461e51f9ed380fd64f64d6e05142d264992e0433451f91a5dccf60de841de35076af3581b0db660fe9c813f1cad039ff5b294ab5bcc5813415767389cf56e8320566e8de357519753c44485881e745ea706ef44f2ac5a1747ad9944f0cfce568d98b9298e6cecf102e1f9d9edc4f9e2cbe45288af7e8986df440e9b7a1d785f8dc665a352aad31e9a8a33b4a45cfedcd2ff60eec8bf60f2769f29a49f7af6decf43e693f68dce60793164ae42331dad6aac8d0ff4eb7adabc338d08d764c484b0b5de73e0a219773d5c1f1f5de3b0c4e1605934ba9f31b00e85ab30c8676bc1e0809fbb87745ec3358ec5904deb62c3d5df382570271002ec2a06a4d90f4716cd38bcd3717108c5102dfaa998a69e1ac66dac2abc2fa053e37511ed8fa8f113d542b8642524920d4bde10b3c4c1ed4a119047ecf5256d23731b7f6362e0f419a73304e6290ba4fc5703ba4768b9bad275eb8dc4c184d0e2197181bee923cab8918e44c1d3929c22b03369eceb0a913431d3d04a87ea6610451bdb48890ddf7152b8da9feb55f210e5d1821cd2110aeff3edc1f6eeb2b75e946eeea8d8fbccd4394748c8a6c241377682954f947982762a9dd5523c7a2efd760f3e584f79fd31d3be11e4bc73f406c0bb360dd8a0926744788cd5179d47ad78613ccf52f4fb4aa081b87c82c7a51f82efc6dfe532a523efe24b07f6b89bcf0a097c768a19416f2e46cee89049bee20b94da2e608c454c7b7fb253604895d2a97c70066b435a2feb51a7b17b86bbeee95ee271c139fd3185b5355fdac9b068d51eb9c76d0fcffd5656e58f9aeb26a69a8272528da837837d075685ccb895f22b74bc6215dafd57fdab0aab750389999db40c493c738eb2e00a985dbc9190ff0b12fa4eec317ce05fe289cda05c4f48717802be34085d305d137d4030f14bfff28de5e656bfc906eb71e53e93420233a423183a3af34d9c22d667e5b0341165802a11d0ebb26c3c2efd9fa6c4712cdba4599f3587b0ba46ffb7fab6c0e6abd0229c009721c5c100a8da2b7eba5639a100900a48c0cd3dd1323ca82bc99555b0583834918f7681f4d79c1b2efb6db344375b0bdc6ca532bb78c8f2cd50acb996afa310688b21097939b7e15ffe241405b70f0678f1d5537622016d13fca941f387514674bb71d20e4db2005a4915f6961e407ca6e6d9fa81cc6a6978042789477db7295e86c56644921f1ac652bfb545cb83e0deb22fb27ed6689a922d93fa0301694b7e73b8508c9553732ca18deac54d4dd598ea42f5cdee9052dadf6b0ec6a0dc2f6d18b70b76d5f3bbf5bc0d01752202cd5e05b03eef635634ca70395202da8447a2dc3e0173c274579a18c983d5c8472aa68b041863e33eb2d9a67b4e481cf616a834d9dd03e959d8b23e200c87de8f9ffae09afcbbccbe4f90d8ad5de6f6a62ee5c906f8b7b928a1b692bce5dba3407fd3bcf17667ae698d789d4c2b9fe618f303ef41ef0fc045552fcd0cba61d50e5cb966b3ffe806a4df095ad421b379c3055b4e171a6c8d547576337bf4bad24db934743ef3cd4414c6bb97d1cad20048d8843bf3256e7eba65326ca72f47298307ad7c1f1c88051dd717dac1916c47feeef75f627a76230ba6dcef0ab4875952eaacd4c0c498c84472a6aa201fe28f69ab2d1ee1942408acdcee21034efbd011b4bb14b0767fec0d4bd07c79c0f5652dafadf10cfce89e3259dea94d39252c640840c28abcbe0efca53dc84b1ef5579f6ef28c213f445220b036fe351d93dcae57e654ac01d39f87213723f0a462d5536b8336dab5c7d2fc728f865756b85f7526144190e0412c3142650616dbde7cde17e887a60ad39f2a1330d8209f13233ce5431fd5c297238f8b3ff53a3fb89c84168b04ffa8f7f53e14c36a2d3124d68a27fb55e7334613f65e3057c74a91e309c9f325641ac593ace9dfc2d9d77dd7d170b57a41ccce8c0a5deec43a76fabec3b4a96f6fda9ce8fb14be68b2dc7ea5a7320a0371d990da3fecb3b1206f43ae466926596f531e63ad2817d244bab7de7fee517803e45dad0b9d27b5057e1d200659f26a0f2eaaa2379654761c1cb9c0c028344e54975572f1d1d336463dd7c287f98617bbc7c2132ee1fcea856ce52b1c522afcf04d38ba974d1ebb8f2913f44fda59f8f1b90545078d89a62d15da4be90e8e1a739077e2404192cb3cca5233c27f06644d7ce496361b831f8fb1f9c1bab0061d3aeb93889171b7cbdb8c030f8459e4102b7dd0a54efe61dd09cbd41b05e90b7bd2c90c2c1f3ff663e7f8a6f609fdab53184669f0c6b8be6547cde9b65f1c16ccb7a3423b3e0ee6f9ee9ade75d7dca4c3906100e721dce12eb622bb323abba0767624e634628102146becea0d526968d820584616d4cd82bfc174b90d0d6a410f8aa868b64128c039cc698a3b2e36700744969a0e741d0b9f164e73a56b8a60fe61b83a1f4e58a9d09c9b0f7dafc652e789968d1c745df42310fa7ba9b99e98d987deeb0ddea3478f68ec1a437b9b79ef4bf29fef59e2d5024e0321789c3941278986ebd0969b01bc9de71b3af6186d85281532e5894e16a32a13159077dd024ed33acd25fa9260eec81682b2c3ef965f8a88e6ada712419c3184b89fc0ec54d5f184ff6c7f4bfdac53f4f14959639cc50fc84b9627b1de33f0e29ae52bf9a14360d00322990a206bee0ce77d2b26d95c044da23d9fcf5530e4c73d0f0d87801dbdb678d6dc6f91a3d2b8c5bcadabe49b24a3bb0253ad3ee9897d0f7bea1869db44a2b0f7cdee99face932c86756546f8dd44d692f7ee03e46bae82ca461ed6f2a21f5c03c209c1c72e267c6906d568fb9abb855df0f43ca7e7b64768a62d400a62a6ca996d43a19f7ded45e2d68ec329e97257c1e37251aa9a4ecde58ea64d68e2b39d17241ea1ea3a52197278f40dfa45f3ce7d23caeb730fb276bf642c47b4bed0340b9b0d5b4defef57a642a771e33cda49de46705287949be254cb21e77463873ff5169236210b3f80dcd81bc77b3a706a63d0053f5ee55581443819750e6d3311524b4fbb1a18ad35a4adc35738cb6090bc34fbfa7f6e99e41c1f959909288e48a19d98528f94c2e69c4820a9926c256d3609b72c5f8cb38b3af608cbeb41d3467171feb4f80c1b04021bc6471e9939406fb2e94d75ec4cd72f6ff5763b35bcbb308d052ae9fb002e94bd26b843ef06cad7c4e4c658f9c05877c1ee306f70a4e76d332e4cebce2cc6c280c46598ba286cfca44c2f8f31b8af92b05582fe8f268b8608ec9364120b5cfa2b11e7939728974cf581f17f20901d0eafbdd67eedabf82972b296e9430651ca00b1a6ab1251ea472d18b4bf42d1515a0499a34718cfbdb60532bff1fda855b096063b65a86ec689bf92d1b61506ccf3738b821d9cec5cca34cf77048e8bd92c7f920e49b5c9cc732162e0fa13aae06960e5fb38e69c55c485fb6497920b4cbc11e7a7dde6ed5ca2071b5af1cb384c2a513b674f825a29337d49013194c130ddf1799088a8540784b52eb843b83960c4c91e6eb7fc9047958f3ac5490328161092ba40d076984d99c00f81564718beb73ce16a08c1f951793033397459ba7cd27a3c315bce24af5fbc503ea00470b6802136f1c85edfa74d14e4c61a24e2c5c21c720a713b83ad551e7348c78cbc08ae1a819e6d4fcde98f81a203c0e15ba13dfdfe04b73b2fb8084afb48232c64f59f9d53b86df14e78cf2b0d7aff1b6f6fc4a332e89449a36fe7e65ab5498ff63dd30e2fe8510fcbd57a5589843b4fa8a1e480b30eaef3692582551418b1140a21f6f16896ace7e0901fb5a8b7ebda91e81c2ae0ef5da4fb89563bb9cae044fb4269fbb05bd80607393dbfdd9eb758b592ea165f1336eac4fbd1feae745dbf542faa6179907906ba2142c8aaa0f4467e42ccb78012a131700d9412748d9fdfaf4a46e726ece65673f8cd8492574930766832a2f6564325673efb0bae7f1d226712bdd16ab9d671cf104c68273a1c831883ca5d1466931324f0a56ebed15c2416297dd4a79f9fe526182de7dbb1e4daef25e23a8cbbf7a733d2f1a0282cd35126ef15555006c92d037110881267488464bf18efa1df073e1e468e446cda293623e402c80677d8b5f1ab62cd8dc2ae3c03cfecd1063848643edbc9c00f71b44f9798c4c13d7b551c7b27b32c804c8c4e66c8bc832c6011a63ff342b7827c1b09fc8dd9c56779a4cd0a867029ac7d6957e84a367a86ef19607c3d677f6861a401cd33c049070b6e541a48285964cddbd512b4b92b982db64f8e0ac69c23cb05a3741b06c0be99182e44dd5a103bc65a4270a8d31ae2a48ebfeffbee923700b68b9bb42bc0d0bb18d7f4c673f2b3ef4b2c8c8702ccf90bf93e0c812e0634bb1d06be8f9dcdffda06cdb48414854fb144ffb0efc6b64d9c8c468e2b234c8f42cfc1271ddb5c9e8e689c0ea69a2c71a4ce389843ad6b530ebe65cf6a6cf9b93045279fdf62d12f4094af6dae937ccc424d63bd131560abbb16185abf4972352bf3c67354d2d0448931944bfc9edaa212590d79eead1aaa2a19eabaaa676aa57e720a3c0e99ee50d0c5d73420faeab58d67a25926b30de0e4403969bc45376ca0368f648d266fe6afa7d4b0ac5611592c0faef56be5cee2720f90d245415d0d49c7b2872116f9788e7e394c0f2ee31f66979fb91eb3c2214bfe9daf060a6009d39c101e8ad9ff88f5af6160b9f3c47ad5b6012ecf8b7c1fea939c3a5efed4e4c62a24952aee068a6dc1e9994d3359fde1e15fc0fefb7150c645391ec0ad20209a086c7571d1931f5f4c3e40296c080b2380281a1d72364677a9d0c6cb83d63fe79d544a0013299a52a4dc0fef0c53451338d694bb9e2f7367381fbce0116ba5077f788d56212e9de0625f530ea2d01e297207bb49cde16a2d56527b9ed454f2a22555b9d48a368c711b14b3f8bde308dea22808488fe09d32ab359d685b36ab2015585a0bccc6089d25a8ad4dcc1087cb6fb4165862a17f0f9d257cdd04653109c60cd87c575174bd1887996e3bed3d4821283fd9c4a8921cb2ae945d6e7516d7bdffcfa6c86d63697a4e12eaabed7c0d7d111f4d547a7902723d9e6a07faef12738daa0b8e8e572ab148a4339a75e663c9fb2f33607b9629525ee5935f4b0c327d52f22b1818c2695423c7e9663aeee39e42da2c97307c29d98ef469e30a00c031cc3275f3a137bde94bf87cbd80f8156094ba89573d9d6c8e4a554e119c6f344775e58cbfcc1980d74da05e0f0cb471c74d4aea2f076c69d71d82c089969a1714dc75dfcade0a5aa4957a0db912967128e905bf9d027bba5a84f761a97d23d1205c7ddfa36b6cc3e7bfc01c6a57009c1bf4658a1fd34dd66efd4d920fa4af0af092681ce808c33507292d0a813e957af70c04ca25de5536aaf2dfd21ac17e2d1c0acf07f72a9026895e0b48ac3dc766607c4e005da81463951238b2594813aff9220d215f357620e4eb056739d90916eee1bbcd15b52dd593b7e2b359ad221c2e74cd199eddc7bcb05c85e6b894fce4d8b8d870ec79e4154d7068457a650bea127f693124781742620f1737b6f5f558d48e1e9c408ae99b28c833f95a0453a24bae7c088e98e75a808f33da937094fb58ce18cfc05ca0ef9c1bc03f770f7bcd309e70103bb4ba8d7259666ffc995e44ebe5315bea63ac8b3e07a7984ffaf6d377abefe8ca4ff333edfa293850d4b3bdf48002f10d345ee675085494433b474d776335e2a8ff43e629fde6e42ec737df091b080fc7434a89e79a51a3ff550fa3b660fc9e66170f2cdcb139f3e4c54d10a012ab089714f20dfc3a2947e2ec927ecb01ae9c703bc7606cd09ce81173760b4003868bfb2de7bb296436008c4682271be1c63d55d20f3950b88a21433645276f6a050a72029e49f5a5126e5a1751452f6dde21857e39103ef58c3fe8a23ced84b2b0f48a178812f77958d1eab382418c2240c99da4f77d6df40da4702bcfc6367a14eab1e127ae955d43ebaccf87b4a89bb895fccaace99450a8ff88576059eb3cab4d68040f8565cd9e1c1ebff4070b2680272173dbdd1887c8917fa9b1111956eead3ad4a23fcf56b1d3cef939c13a7f41fdba1506d08105f71af48714745765497aa8f78226586519a32c2fdb7bacf2787a1542b06c5457aeec55941d0c1bf4564610d111e19795401ab4b85b8ed92c8e3cc1615af918f97a9631452d40dd609f8020e5f3e9e343cfaaf7272c83458a1da65d15890f3567c499061ee7ab22568fd947ca8ab7e21d12c471f0e0e18897815726c3ad27302f27755285bea37122a18203e358c41a6da407a3a9fb3208d163bfecf049d99fbc1dbb951e24d240716f3ad3c4e0a6d2d21dd51ab6eded5cd43f50ee2fd18eea9b11cc4c5cbcb026bf536435e3b4d8c1d6cacd25ac3b8bdafc6ebac8d6f6cf9758ae37e6a5e8b58a68f89ea8c437c25de84550730e669629c69c4dfb8a0c042c513d7f029e3b6ae20ac92abaeafbfc1d8317ff8131e184cfdf229b04bd93d520215a121eba1738d4014fc8dacc740e7733ad2acecb4ed01382ac1252e620bb09559e81996 -MD = 0d61f8f4238bb647fd02199f8555a38d2eb4ac07cf948d499eabd9e77c89ca753963e95e036c6673b6c88e010f34c32c57d6f103de1b32291705486b29f93975 - -Len = 85768 -Msg = 8eb0ce96cab8bcf471bdff7a31c5508c306cacc2f23756e07d261f09bb88e52f1f135ace8b3406da72a490f63a3c39e6e40aa947eea4ee7d78bcc2eea7f50c6e47f5aaf9b4bc6ea8fa3466de3b0961c251baaef3b5f127779f106ff46f0c77224c7e47800bf7fb4652940b9bfdd3d009c0a5442e0ec50ab43a47ae83dd742d3477d5b8c9598eb59cc2ee079648438fa179f3f260c3c89d1d918c0703b7d6368d1023853e6528a4939167e036e301a574c4cb41f19aa3ea9aec0503dcc6d99b135f8f3746f96ed111092920e298b41a69e955b8495cfef91492da2976d22663b0ab425548db0843ff705c4e042d04f7672fbbdfd0d180d071cc340139a364964b3e6467aed49d02460f27f3036b9b4358e0223eefc0d2799be23b148e003c3dcc5e1cf5dfacd517cc2eb396471a1e062342b45e0cf29cfc781c16e9dbb2565f1a549288432b5a897b1528bf38023848b09e99c69130855ff2c1ee09898259041f68efa74219d1603a0badf73eea8f12e73bf9fee44035acf01beafa0135ee34c2e15bdb443de5a5f0596ac4c19ccb6bb063fb8f6fea55eb59703346aa96bcf8eb09fdabb1603c5f874888b129de955cf35cc70098f88d221709f074eb6c6c578226fe9ff14a7e96e61e2f43de7995ec986f86d9c930845b112e4a0d2e7ea55a7081853f6cc35452f52386044835722387e460a3695ce39d2f276998da9510089b62bb148b93669c9ca1b67bcfd9d409a8037ce4e04251f1593b749d57795469ec10c8a5b4815b7bc3dee630dc2f65a7e313032795ab775d77b393a50cf21a854bd5d37a5057dbf852233facd5fdca04215e1cf1f25efcec71d7f03763c80a65a1f7041cc8db901a31b8e976240cae28482af0cc5e258aa32fefb0dbc3c2cb10d4bf841282d61fe949e50b162f24b71c42c0a73f41c6c68c9a43fe1994aa068ece757be4e80f336d80f2ce15600c8de7f56868d3040a5aae981b007a3f4662e87561111b615072afbf2659fa1e8ed9914b6a5b0e0db9ee1112bede852a5f8825b3cb6c3e545f84b6efcbd54dd07043232b0da97bc59b29bef175c1c3bebc1f4d6ffab7d52b05128af6276997e07b72a47c9a7a9f9477b4bc1b88d1ba6327d069913718694d0ac434be823e5eb5770f1c2859f504e31736137a3f35f48266437f00cab781223641bb2d267b2db72cc19416924331184158ccf5e116f981421f9aa6fbbda5125132272d5a49894e6231122e8d8bae9dbec2ee73b89b4fca830dbf6a12525d85223e81a565d0fce2e007a15891f604d8561b81de0aed80c3f1b4f834569d32e3720ed07c90370ddb6fea467ce8acba33d00c8e1d203314d653bd4cec10c7ab9409491c9c23a745a1d7820b82d8d45814f63c1b184296916a73cfc47b88f75100af986dec66472a9ce078f752aa9766e58e5433b7b83e81e6179366c70656aa902ca3cc54a0404635517412d5a61c6d0d61fbdbe2c9526bb408b03cb9d20c40aa471140bc1bb921d2f41d65f1138cf5f437da1d81befad83b0ecf4e3933409bb8c98bd20c1ddb41dd8f1cf78f3b0e8402d898007cdf604fe3f098a230731b41207bb8892cefcd30bceb18d19864cba49f0bde8cbb74a9581478b24284d8c4bc4c22416d05d9b876d9d0baf9f2d7eadc339954ca26c5007b366cc6361fab6394a289cd867d22c4999a06aa7987dc94b4264ba1c1a61a8b41b1957b84e733224f8c7705dd7d14182369548f593dbaf1b5e0e76e7a21ba7231eebb7a36c6ba277770b39079eef5dd9cad83129ffebb2866ca3562fb80eeded453a66b54a3869a93b8061862b60e3a8acd5bda55b12562504aff264eacfef7b0491df4e465e0a42ccb3842a1bfa7587733a490823e41c6f9c90b617b8c32e44f39eac0f0f6106dc91111b83def085fea4626db2f8c577debb022bc8807d1ce3989d3757f3d5e1cf2f259223e3078766c6ea9646385afaeae650cdf7f0725dcf4a3a1bc9a2212d930d6d727ad6941c58413f4d226109082c8529171677374370aed1c3c488d73ce092554709182a975ba9dd0ce80154421c3dd791b4932070603d10b9e9166ca20074798a5f262f9ae967505007a7d11b227708b842c2e267265b537897d955ffab2a56b6dd8f37897a1015b0f1b2e405d7a729054184e19a3ba0369a615037a8291a595704c1c705962aa9aa46c11184c464b5135167a27c08922679d609663e02cb0dd5755c5271b61d88966730ee3a4126293cd2c9a99f15b7af9156637613d0b2f0ccafcd6e60627f4f1fe3a0ee790672121c46597b760b773e9b630cfbec1b788ea704838f5423b649a13c9f76e36ccefc2c3c657c9322575fe29c544c093b7253ff241d19cf625924c4e26b3bebec9343d7259c317922de8ff162e80b0dc936cd3f7ef8a234b6ee4cf575b281f51e6595b7825c3e9a65834b5247169d6c3d4c76e285b4cd1689dc4ead57040db17acc4e47e324086962dc1e8fc98e97971019dd72d8cfdf0753a9967706be13937a2dea02b8920378b35f85f46aae7e20da255d7ad8a86c69ccecb0cd156f580d9510f5628314d44adf63fe4a9b04a5ac03f5936515ed09c03e0c2a2a03863f9273fc0d01c32adf523faff3dcdb1fc27b26110bcc00fc2b9d2f8e5f0841a13ec46f657d4b0952a9116c9a1335bb5e4910a8fe230a2a54367329e9ec02603eda061fe3e2b8c61ab62ade98b8efbc5eae2f152375ca1293dec4b5b55d82efbd95f9edddb9d579e17ae11e4271654e7f6608e31770663a2979144b67001430bbf6f251d98f1b95458be6942dc930f25f0550ab40af79018399e453858030d3987191f45dcf15c8c55dade8911ccd387c0078c6359f7d1930b5b786775a6368f19a5b4de0e63e54ef64a9843308a49144fbf3dc7cacece1cf40f03ce2fb263155d5b0b6f9810ffa02355bef7a09519d483c44467c6432ebadf040ef2efee3ed23c834d80e1c0508cc444782ec9b5eacf4560cacbb61f9976b180c25d1b236fce9c64a19a513a8019c15ff06f13b2640e7ed9f77c002ab95753cc46961d199e11674730445048384f02ee4b42e65330981478f2010e2c3365ad30c3255b9872a48374220646b020377039b42faa61f675f185e4e246edb2a8a7f361933f68938eda339e689b3bdfd8f18851bfc7a55daefb48f4a81234dc292a5f47662f50aad752ccccf3b7b11e3b6e224a79a5e40e4a1c084bdad9cb59ef1cba9e29951a5f88d586d52e03da8466d050c8e6ace9b1513b0f10000278d202674d8d61d88c59a74aabe1a1e57eba63fd5af38c457bedcc3fa36ca3f704ef6bf1603d98606f413f988117d5c664673adf88f2f5d6616ac2120d874a1f375731a43bd655958abe55a951a0510f5534f15d21eea9c964d13b9b95887de2d8b35c66257f21dfa779f36462a49d2619c8925e6f0e2e844cca3fc28298c4a8b1aaf521686083a68c1920b1fe4a427578cd24ccb87b0e71e1fcd76f1edea8d988e502bc4aa203520247e5786bbac7623ae8b08e455cd1f6ea100a8aaf83b0dd260b8e1f146d294bd1ab49a1f21db45726c33d8c5edafd7d31ade1fb7eae651d53c59e320de87ef9c1ec5415db9b92bb0506d3ae4b1d1c6d7c7c62aad3884dffd6bb3cdd7f3c89c59ab30eba6e5be8f69f597adc534cb52e94259780f639f2ec79946f08b090d21523a78079f3863e70bc623bfebf8f5128414f88632ee8dc4d02f9409be90de2522571b13bb1431d9024cc1dfcd71077c34aa23c3cc4bd91883a91b57e72db40e569b8a9e6f1bb0bc09e3d29bee3f4af6779c8bbf400e19b07e905d99993217434b4257163fb159268f45d662c2b66827c94660d712a7c8230d7fcb1d4940807a9d160109b177a3aeeecd6dc2ff78c766a64273b9d8ab5cc6dcb1f4718bcb780ab86108e758d128abb4f4d93ad8e8e1599b1b04b5f68b503258f16a24b555667a19dddf4d8a4040a37e46d948f3995e77143ac489e0ba4aebfe988ca57a50f45f5dc7149aea57942ca75dbe6be40c9735be1c13744bca956a5a21dc822f508a10e0c7195ded898bbddc8429121eb5141bd55972238c3ec823e827ea3968c690354f588e050858afcd6a7489e9f8155d90065d710626896baf25053639ab45bf32f5e5c33ecf4768d1fd89514224cffc48dda290aaaf3cf8729d6431115b306fa071095959a6d85f71e23d2fb91927589cb7b3417f8abbe6f4bdaf7b3f1d2919f44d4dc0f4237dfc13d52a75bd39cdfb02112a13f34d98cfcc02517541559246b4e70d9a8cc9bab73e32bbb3dd2b266c1f965178a46c560b6f17f4af96990e9e58eac336820e112967778b7a8751c3245ba3e3f0116b7632444af38acd5be05956a52925726513bb163ff42a5a4216ac4cb63c1ab8df7bdce227f8a74412da3034b28a07ec7324e4c0e89053b470a36c4969c449191cc953cf4b5e85a9523e9b89af802e4e9ce75efe0dda872471fbfcf82b370b90b8013f7201af964b9e9ff3bbd886391756bd62341c5d2528aa82d6cf76eef2de45961861076669c95c70e141ea0698e5452996f99072be4f9eda8245d9766f502a0a4712a91d60a12043ecc230abce26ccbe75c506c5c2f7c36577d1df480174f9c0741d832f2b516eab6ea368d0595a71de871cebc0d3bfcca62019d4ee39db297af7d812362a58abf9ff6bef0ecb0ec92c3367cbfe5115ff2f238466c378e12d7c7ad8c2acde257cc207823fc183a2270a133c03c8db88ff62fa9801825f359a575596310dc75635962f9cc79323b3300a9f103fdad38721e40dcb41854d36e49e10a6d9c366598ae8d01232fe1bc068a04f7aec8ec9af2b14d5948356e36390b3547129883badd12c8168fe5cec38356d9cd2766f2e5f6f980a9a6371825a2339699baca6d7c19cf3bc27865a15b92ab51fcd89f6821653cff5334e6fca691082e87cdfc9ab4362b0f8c467501891bd3940b273af65729c3f2df5c0ac2c4eed32599b3f4b26a1b6f6cfc62de96570614c9827e01438e29d682d5856a1284a1dca357d57b5ea4b0e2799b326709cc3bb718ea44baf8ce4dbdd6be16cf92f0926bcf4a9958466cddce5ff01fda02f0a303aac9e12ebc1f7dbf18227901ed0faac8d1f9685511c98a79458492fe28cc2442a7aabd25388aa1256d8715c8c9e9cf3bd2ecab3867c49f2c54ddf19a2467a7ba371240671416a138ff7752eccf87ea0bfaacc8caf263042fb485a5779dca15b5808bd2bbf7cc653df6799834a6f0e48170c029d357b0a2ca8c04175d3cfb5479ad9cdbea89b2d67f7a164f69f62ca3e55db0341b41b35f4504e0ae13a9044e4ee4cec3bd73d3da45b1d4df536944117fe8055369567324e746a3d1638bece97e4da7f2f95d345ad6c63eb1baa53f15963a46ed863ef8dafa77d4ea138bbc0f5012b1d069eedf3f7bdfd92b66522596737afb693ba24a67c4c2fc60ec507ba70b5874c6d4cfdb6f7c252fb61f19ff7e5fd1ad314e2a72b58e4da29bb6833199f84a773a01a830d421bfc7bbaca2d4b4a067e3ac877d77aa9f404e0339cbe7cd5f0d4295b920e755b2d529a0d694ac207e632542b044613041c489003cd1a42a88cc5d40c4df06d97691decf65978faa43edfb5b8f26382eba01d9fa893c709abaad51a1ea8e984ab6196dae2155863a352fee5feecc058b531ec959e6b553053ed8a422f3d5a28fba955ea7d17398b89e4e85b693ddd0315443de851ce456515d76e12aa65b2e90ca2e3a203f9cce0cc47549c946029f07059aa2e6f37080675caf8d20ccc943352e0b878331762e1ef0cac0fed1e37cf5ad489ce43202da2f86aa326e2dc6ea662d56d03770a9c3d6697574befb276ee3967854e8a3416a912290577b91fb2a0b10349aa4c4de921d799fed728b777eb9065053580cd63a76778885afc00f0b0c20cf6f32f4bda5d96670b1804a7ab25f46f8209e366852c4cebb437281ab9551a24fd649caed03f4790f4a5200d914be9e994320e9a0b8656f51192c9e77d1c2e1dc58510c17b454faa5404e743bacbc555b4548ec26763fa2718f45dd1ac648249c7cb283e2c1e3315919de70498042b565ad7d09a1943caf432e25073d7cc9b2bacad4f7f7318765545f69baab9b3904e0032606b91843ddf07d35e487fc2ed45cca2030fd0c2ae0bd99571b0802878bf3d0adac170c3b76a005db3ba14d60d2ab05fcf59d5ab3e8bd500f5b08bf1692c79a79c363770ec07a4c80d5327746f4ce02d10f7f240ac67c0bfb4254d8cc6183ecf2134462a304a7dc8d7be383c782ed4908474a7217c2215282989458933f504b806363d4e2894f3d68f35c78cdc332630763a64ac223d5ad0c246f44527656418b7d68d5b39998f57b05445e3f00c3d7382b3db6f333bfa501af8ea6f14cbc557b27fa6dfe7aad8e2d7b443e0481c82d0269b4bd923808c1ca019985570aab10b82ac1a5ab75b490e51c031f068e6aeecce3b667877bd78acde237ea6ef74af8aa4e6784a2d2d6810daf2a092c6fd0a10062e9bdba445587731a10dc1d5dc297ba5a9113ccd93aeb0cfd60045e6b24ce05aef5c613dba9402470cd634c823a754e18e9590fd209554ace4e1984cb8bfd438f838b7b87fd3d49ae1687e3afdb18d04e175e54046a482fe99b4f87d82fb722cd3b12d8917607489a9251cb2ccd0aa6c5c32a84b8864b2318f0af4dd738830a2fc46514413e258bfdeac8ea4137d33a4594c6853684e68e21f53fbf13ceea637fc78c15df7d1f789ec6f5293641f9f296323941c68da1d8cd5109c5d317739583eb8dc5b35a7e7947ccde70521506387f468b9eb0c90569e4ad15485e3ea60804d9720a05fec8f5bea78da8dfd88273c978c4863b5f99a92eb0692efd690b24c93843ce1c918854ccfd0ab723b5f30a3c6fede0b078e50173030f61f8c12b529cb106f8413a43fd39775b8767d2e367a0d40e94573b72d77a4d0fc7976d8df843ecc570bc21835acdbc8afff257d9f1bd4e2d8978d1c7940c376f4a2295b9808790871ed56fcfd250759f060e6d5e105b8654a95b616da1f16939d1e0633850304555ead44cb0cd8949a086013cf92c41238adb4814ea64f18a75431afd91d206b536bc00dfadb341e1976614eb32ad38ced8078612c847d342298a188b4c6cd186327ca2514eed40e48b8e8fa291fc082f44155e828eb1613b5f8d2236f2885860511202c91be14efb85e5ba8b9f7f79edd9ee188cc50a611a1e3480250a8d64ec9c6668709df833ce8c55dccbe39f52b19c78fc5af4b99c8a6f6779821ce3bdd11a601c6e5b9ab604a8c63f8de5c45d22979c5111a328da31580e5672b0f22bb8d3e965eadd30a145e11e29f72e5760e9d14361dc5bbee3b7e411601f4f217649d0e78d0cac20ba3b4046e33145be24ad525372e1a2e37ec51858dcb180da652b1844dafe4fd4ca8ccc26b564b263711723b6cd4803ff7503fecc1550cc85c107b3e695e54eb298e08ea6e6b8feac0fcf4b52ba3a037a8e189d535222ba885284aab705ec3224eee08cafc054b003c57cd21180df2cbd92adfdd6da52d24ce04b049d743882919233d027896150cf5cc6c1d9695e052e4869273ef6069c393303c98228f4c6614d8262f88a0667789d571f94bbdf16367af52271ee67a1b81255024d6a4687fbe77548080b6c7c664dd4f429bf8ce83eeef8f6590a9c682f47e9b6e682564bc928b38c4154ba170037e84880bd8b02ac6d1bacdd92cd79079866ed35b84d9d32d8e53689ac19c0b022392481fd04ece9bf064be4cd245da9ce75af215453029ebeb24cca5db100ded56f8f14c6202f5eac60db5804c69b7bb1bd05949d8f0475a3c3d8ebada95ef01933922162065272fcd165207fdebbe708e7f676dc2a2a204fbfe1d4e52a634fb62d349017e0dd8c7603ef24869246549d9a8bad5a4cfc058a4f706d4c5b956374047d492ed35916e49b844c610ac32a367fcb225c1b038d1c1b8c9e2c657f941b607534ee094d770c442980576fbad09c3dbebd2dc2c620ccca3d4fcb6fa64b72eb253aa1aa4117b6a4e8a8b1e9b3b0977d6c671467ce2763058b6873a294ee424a94418dddbd5eac63c8acb89f3731eee7de065833a108aa737fd16a26d0e75328ca32fccb4ab4b52ad274b1bacdbb6b221b83424dc92d66bd2072f822e29c6d2bd0f6349c6f8198a10ce8e761feb6d4d72bc71addcefc628a773367be537758fbad737e77b52d1e6f80f1a1bd518af2ad17b9280d36df65838afdfd24a9dedb4169932184a3200f3c367526f64ea08d4de640b3038b3d365063b604796f3bc0a50d3d67edc1c233b2345dbf337d5e6d5ea04605e7547e9e980a48c2e82af5cdcea05996d7977c51778492b49c672d59894eb264e21a096503859980966474cb652acef76caeb433332efb4d5b93761a76f66c191c6448533bde9385aea4208111b486d2d48dd39f8f387fd295899f78cca35b6bbcbaa22fe51d1d1b567361b97b44686f37bc425e32ac088a75d2123b345a69a4eaa47fc3ac481e88b6589f394be55c15bcc46838c6917dbe20f5352b55257d0bd0ab47d535698015f8db42ca289c4a0d8b2cacf4f0f0c5b6c17a7210d80b7fe79356632e2b872a0a4184b234ba731aa0cd7c785c5ad0caba7eea30b1641558815e2e399634ab04afbcdc573faa71b413aa3d3336ac3973127fccd6d7a249ee2157ba32d5f8dcf64b8e6a9ab3a09e01b149f6444b8d34a805eda8ce4a39b12a0ea682b6b22122e828e2b6e1574303e7c1d32f1563a6c751dcf0077fd2d255f492740e2ef65485c28cde4995f43ca74f8a6f700d469ffd57e0af6f5137153b35f3e9e700693b0e6cc0aaaa1f5232932255464294bb1fdba056536bac40a96dd37a2c9496d37ec4ce0c6f61e539cecd466a802c128bce6b15890380f8b737f3b86f669d57fcc5b0d1b755f75171b85fa51144b7ef7e56b49ec0e8389d6266d3ca1abe8baaacb7d85b0b83f3cac197502692ba69945c5cbe24422a1a0309df17f3c25de4f9aafc46554e22ddb7f314a9b0340bcd67ed8b928d58f0ae93764ac71ab16a33abbf3d02a8c9593e82cdd6712d415f68d1f98837c34a627db3704ee9272d0efd28b322123ac4519d921886b084ffddc43b47feb5ac60aa0eccbe9387017f71ccd74e5280f58731824f9bcb6f9db7ae680ba0931532e2ede94729c2a892efba2722577654c059227521204eb560b0f9dcabccef5e3c1756978a798355c1c412977098359482844cff706db68ab534e7a98193bb98b1480a9fff767d957648a0a32ad7384a254ed6a7a44cacf68489a056f7bd9fcb7bbd34890de7597099c18dd3b6dd267d9000e9f62582d802b5f84b6b7311420081befade1b96beee137800af7d72a836abe1ac735cdae1b530c911705f584d3fab93842593495518cab522c0e75d667c5e3b48a6af1b7018dd4419ee225a678ee183fbe6dcc9c6f5a7c01a8d5d6807579154e417870c2c31a4b18c6d24df39f70bd787aa5edeb88d92e0119e455934cf2c76a94f4d77be0a6e579173cdaf6b8111d84ff7814fd3e9745e2f7c08f994ed17e7bfd56722cdab217f518a8591a434dbcb7c58ade6c01033829bae0f10d0b83bef4d313fd5021aa771f339b44f8c1952fb35524a69270ab9947ebcc1668f397ed87bec3b5a0561e675a009c2afcc375cafa36fc0a1afe0ecdcff2f85c27a76c9e8738dc5787d88c8d38080177a0c97e22eee3677560199b6a2478ec5ee387905695a9c44f6129534d2ba281b77f33fcdc13d2fd850c53dfe2d7d61e8b0724a18a15ba1209d6d9211bb778937702a3903b0b8e34956a2d5acc6ca3156d1d0efecd99b25c035368649d6de29d12b598d6e4389d933324068a7b556847619f972675845b08e86147ac36b189253722741f5c2d599ffaa48fed94248e5b24f96da73687fc8f157b07567c24c4c230b3c5f7f74c7ac1387629f29b5c9d9713d4e30f74f71f75171b27f1d23a3ddabbe41eef6a28499d99035547f5500ea1ca9ca7bda5645c4179dc1a0cdd545cf5155def7419437e8b78f6a24c36b169f195cb2c306c520b7a9a185e15f2159aa7f96ba8148920622174aa818dd3f3280d11ead1162e42c597045a849bb4f07f49c4b7e94f3e419ce608b9837b6197d16acb6636cd6fa9131d453cfe1caa77937103ad1382ad19974fa18e28934411fe813ee7ddc4a5177c83e91a4b07270d4fa422c5c76d5a2ae9d4db92d1640fe3f7f6c8ca369a62f05a414c9cfbe9cf443c69ce8c755dca07fd0c13821e7c39a056120597c1cd2dd634fbfc1f8133179ec228538b9de27103595be5c6703a35b9a18981db1fcb7a3ba51a842c6b81748f79665e2da189e3df774aceca772ca8a262c3ba0e9113bc832303613e1b438a98daaa5afd30b2a6eeef6f3b1883d1e6ed02370a9cd644796f276d0fef20f7ae3d6e7ab674cbfb1ea42a2fb73b36b8951c187a10205fcc45323aae0c9a1d1c740f9d4e0d2ec3d1cfa1a002cf9d004f27921df357138e29848ec55cd3d950306061efaacb75c8c54e69e99ef0d8611402f17b494bf0e1cadbd76feff2277ad1f7e6fdf78e044b440f6f8f4aa757d985dbbcb8d26b431b4e9fae82dde40eed5f9f0110daa134abec7724d9ac7fa5ea4306566f2521746b136466b6bd25ea3857ea42f0cac1919b1d3a1c811ac64d13aa175106b83b2f81c7beb273e43463dc495e1ef62e4ba57954bcc8ee3c37b7d649832f0811e4becfca02f433199be659b26f17999bcbdad72163bca9772070b29fde62fbb8cabcd598c5be8c93c8fc3101a1af6399aecc2511e36a2b623cf2292b8d7f4a2359a413c29b63d909481fe2e57a58ec8e80d3f394a053ec73d9c6ba5b24d68bc81dff0ac5e8a6b0d0a5bbffac6da68d00de9cb3382efc75228368e6cd192b394d94484b1131d99c804e7ad7e4f00add871480f46ae3d65e04b6532effeedfcafa38fa25330b9f04aebeb71c1db6084697cf2b27ab7383ff810f1ff3522a56b974889f49b9ea4981a2830b2cb5043160a96ae5dd783257e22dea19f4623032ad331fa22904326b8c0217e19a598ef8b432745b866fb4f49e61e3eb72aeb4f5eebc5aad43a088978c5409c4e5699ad0a9c97806a2e07fdc9cd3690f2e960d132676b60b1a2d51301b0ec54f8e63dc4bb9e4e251c379076265e8f5ff58c6cd0ccd08de661cf930e7b098c6cbf5e6a7ec7d0b5fc758a7c03872291736b1bf69654ae92028dc928c00e598aad4dc50a2156ba32cf1e2eb5ec149fa494fa9ce569f387e27ddd997e72e0264ddf472304f68fe52e64be2b2179f75f31894a192392d0e5e51ef8467c6b1cfb3dca588040459bd81284fe8aaaf255ea9e1b04999758154f03af87d809f5e85dc23526e5a656a21b44f78652379e59c65512d0252905e74ea4f631580f566cd644ea59591e70cb372e85fd8bafc6287dbc3655c4c1e0706930bd9fcd75d7d2ed2baf9ae590dc3eb336f60c3efcb2ed973d4e3c7e4730d8280fca783f23c03f2bdf4d9190e4e32417c6115a7205aace9a3f242c5ba33e4713a9e565b70059dd16c88ce56202cba5ec459f902fb2f6f3102a7ece64be52e4b366d80e3bf6e9d4384f333e63d2dce8b91b68557debdd85806525caa07eb3d78faf6a1ad6ecba4c19da0c469c3d601606af34526598a8ac735ae1c718ccab492fea62328dcb126c3fd3dda214299d565c6bcb2eeea1a08f7070796dd29180621c8189fd6a793a5c34a06ffdd380dcd141b6f59221ee0a57ff0fb766d8b37b49dddaa72474df7a4580ab8afde22865ae40f879260468312ba89f6157321ce427fa5f844eb3e5194fa95af54a480b8016de9a2091a2f55c34f48840ebe6b20323fc76e724307461a139177a8d0d0f7531a502b27c007ed29a6a331cc8fe5f1f666a89994df2729864b849df6e3a1e8b261c99f78e28ecdc849306bd9681098217ccff637201c907bfac57ed94d61f0c1ecbc7b6702125c21af56aeafe789a725fab400b3b665ff6db9fab6ca8e9f93e403bf5b9c9f313cc861ac86da7eaf938668db4594f281eaddf18ac24517c966ab5f389c642a79d42ed8a860c3bdf0e1c53fdc317574fec73f4a0c2dd3895ddd7a47beda68343aa6b7acb0e905f60c1654e80d50bfae4b39242be555e053fb6cf365c872133d224905267c6c0bd73fa5d81a052fee1ee5a50f0facd705f7f0998931dc1fefa59f2f9a0e61866fd23a14a12e4a2b9b475c9f627dc93dbee5fbe7be246020782e2fcee8ace6b48c7759e7529d42d011a82e8cb0eed0d675be6bec04c60b10270742ab738a92630c173d926eff95ba1bb1b9f19ceb4a4db4e1cefaff8f238b86f18649bd3feb3e496243ba58bda955f404bd6268eb9c0016e0a3a900e84fef125d592e38356792cec90aa39260041055117753c7785ca9f64b787aab89e6b743ab39cd86f38e0d26cc00f2be8f1c959958964a1b19f287ed72cbf461cc9e70b57ba6abfc02c509cbdbb53c3f8379324b5a88b9d638f4466706fc8ac628cda7c24f3e4e39dba315487895c497f5a092d587cd27ab5de851fd78a8c24b370ac904865f38b2f6bebc074331405a4e0913e270e227ed0135270b384f2f637fcc50f6c187dfe9ec6e6a92ac0623f9053951dca6561f3dcb61522ad66e16915b88ec137156b8511548bd651382d3e6a3a7c93e889791f005035fd6c3743c6762c6d6e5263a668b09b401192a45f4b5b1eae682983504b65681ac999ffff5581e1cbdd640a15efa4256e20950bdfae8b869364375ad0be33862c4edbc7fd5e5f5e11d716139f62157a7ecc017595af21fa934fb716e0c29132d354db962529372ba52410852e082a20d6dd7eea6996460216f054c0679da7f577a240745ffe32d1f18cf968a92a0ca1e01bb67343aa21278410b45f4f989e568001b369932478d75bd779c5f710e385034e4e170b34dbf045777ffb7ffb9ede5639dc7ea9e430c54dcc3aa30202d652a63df1dfa97c9be6c1ed5e9ddf0ece13611262ba898682242e34e10ab1480d9233b145d105ca8a8f603af84b5719577f0954ee261b52977a66d71902ec29b1cc1172f2f80866d0768b25f70fcf6361aab7c627c8488f97525d7d88949beeea89a848a15998979420a87800f12f35131bd131b6aaf687aa317aeed6c7a7e0df5060fbfafe9ea7fe1721f9bef85fd7955ac15d42d40e80f6a127f1aca4f644b9a9a152a4ee03dc37e25c71d62c479110efed12744c79c3a629cc50b23171659f1cd3164831ad7f6709c3a7f395d0abac63bf18f41c1d98e052cfd18f78008aba325e0f8dd086d7b514bc65bb3ce06c903c9d36694ce446cca2993deb818cfa3272aa051cd2752e4a8cb171d628601de505f1367be2b51794a3925b7052fbfe2e651fc09c3f61ca4ef90994ed613906d24322ded3e877515ddd22f5c4f537ded6912607b61f34f4e8e12c96a8f0516f808098f71965143d52d7b2d18f7226e2538025a4127bd5f440ce823faedc92a01643bb48f56273239819a8b97acfb252cdba865d575a2c127f477357a82de3e0bd15f39b0de67c4b5a2b6e722c16c2756bc5affb2dc52196cdd567a53dec2b799d7da8b60cf917fcbe966ac74e4f3d94562b0a463ec39cc751fec6f2162054b1dd03426298a32c80ece1067f88800df7b674fd052f5c85ef344df806dad145d1a62f296759eda31d0d94a96181b319e6b226f202ab98c4549d4765a93207e6201f8ac58df9de641c4937ba37e2ef49a972cb50035880413eb57675a3c6cb1fe8719b7f9c1d7f58c5c753a3c7523d85871fea7fd1de1be5f7a46191bb3d24d86fc3eabd5b6fd6655fb06fcbda7aa4b5cae10ce734e67296c691901fbb401bf9ff3e00e89397ee74342b149a37022cc1b8dfb8f0f3188b3df2a48c896976b76ade0964690c3dcc6e8a61c978a891dd919a427602d81b70c3c407dc358d880013544e9ea68e087a39aa7a16cdf3cfc00eb731ce85a998290e84df088df11dfeddab323709e1a0ffbfdc9d8301e166dc1e59d549e12f36bc087a5799f75cdebaae29dfb6f9ccae63e667f2997c3afb39aac6566e7e329e3398ed9416dd95723b70187da3de19daae9895a2dfa7c639e09b47dbc6c47a7795a527c107a665838909be33871f8ecbe9bcacd5dee84cc5d8d7248cd81cce6aeb196e04f4ba94b6ad63642ae926f42a1c3af5b21ca8964a2948a5922cecf71f3cdb0b856681eab5ae64518a515a129e4dfab86223506a6edcd512154a9dbe3d90d3466de5632f2894f6cf7a4723b2d086e33d0d7b4691d9f865b23cbb98e96df0e966e4f7c82ab66800242254e99a67cedfcbd9aaf4d33485e2ce30064440566205b5112618a408316999abff14930c2ed6abf13ac0f7278c33ae19b3088da1f10f791df9bb65c6f71b763dd10c6567acae267bb314c75913409a1e4a4e96f5a2effb30f8193597c2fd03ff513ad81f535082a09b57097325f1da67547d24fb7f8d8370ac9adc239bf7881a0704b4dd28a407877cf1861cc72eb51d59fcff5a8fd158089ca7211389f14cb67bd3c0483592ff59dd4a06fd03df7568df35efbbdaa4c41e51a6cd0f95d398f93610c5098103b03d47ca51bee0ec606f708fbcc669ec0ddb5101a8bec685b40ebf218bc714dd635c41d92e06673dbf5b93722d2243937c66261e7ac924f0e81b9e70da2bf70a61dd53df667d9ebad953d1460c78707f59e857670bd7b7fa7c495c637add3170efe90544c1cc8f4cf880b0741f6ff99aec886d422391888cb7bf80643284caf958a8e070079b42d9620aba622fb0e5ca7c6fef19899f9e8fe2a692daccc8cb8ce2416bcb0091bd4a6018777903e23cf953c4655306a801e945251a2d0e533b10d7dd2ebe74570a883ad26e2165ae070eb7b058586254ba842865a1c4c1ca226f7da3b2af2a95317a386127c31bbc4df1f15b4f90654dd046d38dae09add888901dbc7e07ebf23807a2ed2ac5eeb3168a49ecd263d6384b198dc6ca639923765bfe4f1b2f7f162919bf9d0091a63c6ac1068b69397fc034e4a0387c3a4e53f3b86a850f8daeaa0b97d89a308d0bfe527e72629d7a268b928f520a4cf79511088fa786e48b4056e768350c4223e4a2d5a9d396f58e94416d01ec65c2003405bcc8fe792190fcc1c4761e1abebafbcffc2a72 -MD = 5ed9a434feb7ce1332733e6378c7ec0d4b079cdc80eaf5a9a7204d871ae6bdc685c95a9aaefb7246f4e882428b9b545e9a93aedd4aaabe1dd14461fb1694b896 - -Len = 86560 -Msg = ce01369d08d37dcda2c899c9fc0d11ccf94a0051b2816a1d6c3ad07fc8dd02d73a5f3555bc205503c4149d06732264210fc93a7ab30933a1458183cea9d54b6a3452b3d164d53957cee84989572f0db5a70386acdb5cdcc67af4f227aba93e41a523d89a66b8d0cfa88cc5da11fdb390aa3e0d6d92410c94f4db461236238263731bcb372c92c3763a483a810754ffbbfec3f64840826b14997ea617b209c0d88880b5301c2ab9516d64d006a3fb993d8dda6ac24de5a24d52243bbf87249fa9ca9abd0ea04a5b6a2727aef24cbc281e3dca91652233594708162d911d3cc8dd23b30c581fb851c851dbfdcd695d5466f8dd92b82533370ba19da316dd19e27c7a11c996013d4273d4c6e41d64a7c71ea5599643bfafe5a007ffc5d42d82968fb6fd1d51ada1d77496308c6ca462264e2c87c48f586d0b0e2084bc5576408c1cc1bf300f8dacb7d281631c4191561cfc75af45235937505ed676b021211c6b2e829f295b08268a957ca6bd25934a4f326719408728d35c970f1bc8be94dbdccae1e530ba86d6fac66e40979f120867f7ec0cde442f09d8c1b5bd2db6394886fac6d86fb66f85ad6b417ad13776560d54ebd247e1d5a36ce5afa20791772a12c519c10bd62cfb4b8fdc9c947527fde94f4db1a2e68167bf0ae5127dd5b5482734c2e82fa223007d3727ee07e28ec5a2f3f8f217dc9d1f7a383f57b70c5d6b6e4daa9501a3bd5ceb6d0ab753051175e045d5dcd04a90914477a5b8debdd65b8e1ab710a96062d63c386d419f6619d74d4fccb9f2b8c286c6d0ff7c1a7188e030a3d2a050627b3818a138d2148e0fb18f18c6cfa8ae9bc5a84a35ec92afdbc2fcefe48f1e2f6e4829ae53b3da0459cc4ea8a96818b5831891ee2f506fff37c89906d3233a51a5cf1469a62c185061f033085fca6a54e24529c3d6f0d8e904bcb0f089a5cd50869484da1a84f6fb8de4e53fce3dc714201519d11013f6f6aa64e8b5ec5cfeb27b611f0895059d8c47720d55e00b577ca5500920c602f1ad9188ea5ee692f601ebfc8dfb00f5358bf66053537b7a4114d9bea0b9e106f09721f25ef35e8ddcc43e2e77bb449de58101775e4089d4ae64252687a347651b3ac369ea7a3b97d984dbbf85514745d6f5d27fd724f15fc5f5ef5266e6e2679b20ddb439fd67f615c82c775ec4f335306fd04065079b64af4ea008e48b985698d1d99cf183c9f2b718981eab1c2fb41a776382b1f26f2a93f7a111a998537839d41de9bb1549d5e8fc877b1361e20bbc96f30c63ec55fb9a7959355e18fa17a7b013633ebacfe5cffd61573f9cf6833f53e8a722fe351deb5b2f3bab1075790af021d1237a436c95a28f7ad6d55262cb37ab1b962ff7d9b0258ded378aace68919b1fd115d8db0617477ac8112def087c9a230688783770e60da11ab8d87a84cb52aadb16c96fa5cfa82b5e85d82779c9136ad400ec13f2f937d70ae22ee067c4bf4aaabae4491adbc185cb2bd263d3217cf5cc5cd9a793b46e0d2e950c947416477bca62c80bf7e42a26a883bb28b6fe4d603a0cbf46c59016aff031f00b4c2871aaa4aec33caf41586a811dd0ea97e7fb16b7910b961b24d83bea5977b95283c483e40f843fb39bc2edbf6ad23df8570ca5cf6a5cfa06eb193d877c122329a0c663e30589a9a75bf00cedeb3d775ad40889ec2912071b4b6021620a4ded2417ddd73c1121eefcfa7664872f613b21d7652f883dc921cace2393e494895be451915a59c30b94170fac7105a7ec0e0fe9a9233e28f0fe880c09e1899b6303fcd68769c69b952da80438bef3d53c4457734af1786b17e1f55d59a6eb9f5989b01f1691fcfb6d000260719adc37e0929b1cd116c184ac60756ab9606500db31a0a3c54f8762e1dfc8ad0db12950675d6d3ec20fa3f63d1e8a8c9f8a907076b0610d1a0ed07292016d52538e55bf3f293061a4489a402860c76b7291f86eaa7a53a39b6c72ab0c1952f8f98f0bc4d67a772dee5e0ee32cdbae6fe923074be4f41b1fbfc4d86c9e8c3bf9563f9611dbb5b3ec06bc8c6f88e3920259aa47a8c4a209d9fdc49c47f7de6aebf02c9f26bd8f793483e09d45eb1d24db4a8423f5b828a25adbd818bd768472395db28163da5c398ffc66bbf6b1fcd953326d36c33dec971ae07bf84db912e47a057de759d0a06766c6bb63027be721f2b7b1fa81c4624aa2a21c95792e1e24267deb2b892ef0a541896b1ce9b770814240fee9c1fa2e2f8a77567ab043ead3b72d96d87243c155b89ad2542ce33d99ba44a08ef43da4c82af6a63283a91d55a4aaed7895cd970b2491ada33c8d82bdd3594354a91d7aa71c96884773bc3a3c976c7b86741af6383e043984a924f47025e553c550f7f44ec7ed791400fba5fad7e8ad8c9dca435f3d492272f33817531a8f5e6b7c7bb611c5420532abf605131eb61ff5533a1302caf6d4e89b355fd9299dcfb19c1744a29d5a992de529cc17a44b3f4b6518f9a56f83ed6001bb2264ebb7243220490483a89db1504d055f6b311e880923b54bc98386c883d7282398d9620857b98f9a177f71ea64342753902db686b92fbdade1bf65f2ae8c0ac7e76b04c8bcb85959d09a7db0b43afe3d28f289a7d5d97074807ba7f84a90e183d3293601bbbd34e861821780dad1f87098383e87d9c1ac541830d34602663aebee8c7c2fef38b0aa2cbee5f74299a49250671b935f689fb12b775e6840ac75648c1d2dcfc1ab5b33b4b95f6085e2911703f7c766b14ee9104cc7cfdb9fb42f825e53e14dcd8573097c09ea791f5d3c730572b85e89d506e5deaaae1c7a1dd7c9b7b93d468d77b69fe5192d9d695a153ae76064f743ab87c653886fa76a69fcaf3ac578366bc2846ba26f7f3a0e7999d32c2963cd6932da266df98b18eaf91ca759f14889f3267af1268585fb793c68e046662b5d84fb7c8a607686cd667b965687d514ddbdf3f8c4d3f3a84e3402d0c6b88f32040165ed66ed67f9417732181166d9739e16bb8c5b4d227caec96d800b151cfe6d7922bb506776492197ed107c5986db47b7fda428f4aa699993fce531ce880706569254bb6109fcca42ecfe0be255b266fc3aeec26ce4059b3e017ebf5758e25b2435581c6cab9ac802b25f2493de9f786de3ba9c0877b720224bcb283227f6c85c9c1407dcc3999741edb27ad08a09088798962a69de24d4eb0c48f1015ddafa8a2736e253fa7fb4aaff76634ad07573d3ba1002137fa505f2f3769e2762f55e17773f4044a8c39c88583962455a7b56dcd8a69777d4de4fd471d2a426efec6f9f0c7bb62166ebdb74986a1c6270613dfd64c87f0986272efa07fb97825d169b8b479aa89cad8eedea2096e624caed75cfff040d6b0c160fee364feccc230a8e56c91a8c08f4f34073913e540eb276bacf07d7e6fecf317f2b8d5e1866da3ea4abf159f4e8d5df7f8b5aceea72df7359750fb2805757f0093c6d94aed50b398ad560f767ceb899f7ac0dc71e13aa89fe5c77326de73ed82a8b678214a90e718d7d8861592d25b9455ffac563439c20f5dffec60420dc604fb2fba4ee558c8d390ee8364d8695c3f511c2385e952cbefc89d6ebd7b6b90f052daa8b906cedd319f400d4a95d9130636bf4ae747af4da6ee4c0128d0b6d6ad765f494bf51aae9bce752cb213490952cb8f27629875cf9c97b2ae8688161da32f65a6eaf965c377e336e88198e2c48cd935c5df22cfda398b777cc0ecb2ef3a4494c57f5cd7a52ea72a4aa06dcbce1a285829472fe3f5e5914474be44b3d3da7f96b0f36497db29e2fa59f7da2daf6680a15d8005d9a80873c19c68d84052eba6106f2c5aceedcf5c4d1e6e2630edd6a9b86874ecda7b0af795fea6ef82f3d582ad081486a36487dccc9fee9bfb12d46a4452092e0ef753e668a261d2a13e00db1285922f3fc6bb2c1fe65d7fb7a6c78dee2329129ca34b07e48e7fcac4bbd579eaed8d9ec99ed212edfba51b8b2f17d85de4bbdfac075b24afccea1d13f3ba23db49ef1c6a713457dee4acb7a0372b14399da7de68ace90371648813b76d18a38da09fef4ac948c39bab5c9b1e456d092c54d557f6195f6dd35c43f6d8b158bfaafa855f902d781dcc589b0e2ce2447edc132d917ed6232a7cbe020c9d48e040d76089b665262c2f19f15359f294183cf1e196d6296c9f021692ad9f2fb91aedbed8933af03bcabf28806bc599e6520c14c7fb6c1e6239bd46de2bf5b68c6c90076d8b355af4bb96a40ccb98495d58b4edcb419c86405b22b6ac6656594a40ef5a2459edcad9677c339e5b1a298393fc23f851ae898f6cfb0e03450c407afdd45d07e5ab697336387d3d039562df6bae5f5313ea4ed6d40ef5ecb05e94a40b05bb1d17b65e4991942bf1ab4f1bf9499048e66f98fe9dfa24146d8f937d50d24a1a6ed858d2e3de56e5c23b917d5a936c87b84effc06d48041391caf42207ba6d23030ed7edca864752b99ba3b089b308c3d19668bdcc2578995d4ac9ac502b347de3a37cd685f22f1bddb3cddb0e0f2ca53a311b1d45f9464edbf55a42b48d69d0167d8fb69c89d6e8376b57277211a2d4fa0560075d2d37dc12b4ee0dba48d2c6a58658b498b20360cdac88bb3c1f31f919fc7fa39e2713e80a70ce35eac4380597a41ef900d7802ba95caac0f4a3a0bca0fdbf1a8f50a21dcc0f43e1cc696235f4c12bad5c5f13f2d365035d2304b8c496ef6a94b810ab205f7b9339e9a01affc5c4c5f635b2855d51addcbb50aa41ba03bcc638a2d0f89ccb9a0666c8cf260b119535ff11389d132d1e7c0103fd0345ef4b1c2fd4f64f371956e690f1604f00e01cc3ee7b5925bd6f9f2d58c465c50e6384b3a1d6ec7999509579deedb95d863a41b6ecf87de3021d1735e81c4a51bd664fd5b531183e6b784109794344184728ec5820120ca18b4170ddd892146df90194c8936ce465559a41dc897b6748e8b105efb3506e25ffe2916d51af2be26a3b3bd5640fb7b8febc7d3a351e8cb414de74c4cc3a0b370709622d7af9f777b91c2c4450a3f8fd0fe9dd6da5b31a2571b6211f94594ba14bbdcb647cfae1f68eac505d7eaf11fd2f2649bc02c27963a741f4473334972a7206b45c7e3a4f2590f48d6817bb6980077da96e74d310365f87d686d054559925ec055ba940aace68fbccac424f684e3ff5e5cc226f49664191ad22933fefb70b78a6aa24945bb7bec9f67228f4762e7e96e51e351d8bbaf4666364a57fcb4ccdb17f9118bec8a93967f102f031fbe96c6992acd4663ffb210ede942e9c532012a07957ad465b6b81dca7a4c38f5f47b275d2bd28d1cbf16f9208fa551cedfa834b7a460ab57bc73f30fea0c9950a10f8c38e9a59e6986487f9c7de438903a3c7bc6ba458938f831b6ce03d29cb650ce559af8c8e2d0e1c104b0587206afce487fb35babe660168bc9734c40cb9d60322411bd9ef2f95e0b390a93e134840836b0ebed065b8383ecbb9e27d99e8c6bc5783bcc9a573967a18d19b4b44aa37481afff02e75109ccdefdbd1b0f9df9e002b2578a6d88177b0e616c3f6dc1849fd3dd6b21b15f795dcd103eba55326c497463139b6afe2a24bc5650987031ade687b99ebe16df48b35183c17a4d046a24951aee643531d7d135fc85545e0395e537d5285c6a68fe69e6d8b3df498c69edef4a56793ecba72cf59468f799cfc3184eb086713e8500ee078fa46ded22e221dd61da4eea142e8495ee79f6b5eecbfc36cc4790f5ac06cc3e09018aaa70795cfa01e849e9a3c474714b46d634f8f70daa88da3042566660e4e559ca03ed75fbcf9b1f2ea0030f69223b4e1a99770ad8f486bcd3870ca658b6952ba07c029e8ac8adcd319fba65ff234f0e4845d14dcacf466dff46475d200da8e5b2954829767fba91074b227e92eef6e5c3ec90567f75387c18029ee13364811654c236cd6b4f32091434e3afc10fb38331d05cab4390ed55c24e6bd92f55ce4c2b9546e0d5d1a483ecef668005e01564f6a36eb2d39cc589628c46bb504be0e58b81011a2281929ff5cd3385de1a8ce9a6c87f038c1361958d3ea7fe62d159711907fdbfede98cbbd360d327c6199aafa6d1e623f97f41f8b6f80818c360988d38bc85689473e375ea5cbdec3a67bf259b323c9a984ad731542b0fa0ee844e888ef140aab2ab474ccef35c59b77f7ac9e87bfabde50091be095a071d60b6bbf17058a7ecd50a28aed5c746e6d9db5e2b131199246c3b221d2af786e4b6729166815533a5582ae82ab36b0619fe15c9b7af95b0549a54d8cd5da6179d5c323f4636796c6ad868363edc310279b0994e0e027aa8d4fbd8565d05c831bdce90461f0427cab3b24c7359a4dbd47c7dd07b8ce0231b1c0d4ffb3aa7e05dbc89f7265f7f02d70692623009c1adf498d275b2b29d315f904b2667e4d880f4202ae150960b7d09d9e523ecdda729db654ad3841dae281ed831f60cfa0c2cbd7f0de975413e08dba4172c1a33c9f1f1583384703c9779b16a5e395ad8b735f22fbf69d4ff8b28d50bc4c538baae88eee84902f78deda8bfbd3c5af20f6e5f3ab8bc0d200f877f8e676a99d8c0c9412cabe7d99a802527a24738f5330c95eb0fb0902db71f975f605d75046ae4aecd22f99c72d9c1b29901aef072be6ec27bd99db8563aae4f6ad34470bf7f94d38f7a87d35925b12a5f464adf6df494888430d6b1110b1a24048fb2ea05876fbc0a8bad29171edd00fcf8a17231761c3c86ae0206e8a901a9bede2f4d8102c3dcb0eef00a1715b3caf481593587a374631599961637a4f3351c572017bc824fca250ce6f2e3bac3dcc888c8b5bb0d2ba0939c098b988f4d7a9f732be5127641e8e98df88ff76e8bdafb67766f5623b059931dd2c385b89edeaabab9121d6f68cd50babb1decb18a3a1fb5f8cee387811296a7985a89c155c5d0b63e3b57ce12fbfd3b95391e243d7e87fca650ed993c4010c1b0bd1f2a10e4a3ce41dd3c22eee961891d7e1627140cc6943591dee9308683e4c267b0634eaf969b6a54450e4b0a001bca396f4aac897e14fd0e21e81c4a828933e6d80d6d8b1b85fe5d0cd0b5f27b7c121783ff7568f117832261264e007f378bb70078fc0bb5169433ee2ace2716228b84eec5fd3fe1f45e7b1714443cec783054c43688a5f5d5c295836ce21c6287acfe2a2eb252a333e574be42ad744cb3d84c9dd681fe504befee472790470343ed0fa0aa2355c76eceabc131c83b3282da0ae7d9865956d192aab3db573b6acfc225fcb8cebdb0fd609cba5252f6105dcc2c5cafe45b7c1f41575408b56dfb93d2dd98eb12ff127851a42434ac3978bd050d46da4a79227d8270a2202953482875930fb1aeae4e67f87e79495289de293b4a40d92746fc84cc8318c2318fd30650e2bb9ce02fd734eb683410d44bb31ad54fd53cf9296ccd860b426f5c782ea5cb49371d56184f77911ddf1ba0039a0a49aa7e763eb4f5a04575997808b0ad9f6b330ca38edc19989febf4da5455e5902ed69705666e29a5915e988cc4ade24ba73ca6dfe90fb8205e7effcd5f974814eb40c97b0ea96b55e022ba0e2ee47f5305d29012f317cd9753336a75205c143115959037a61b5d39c86e988c95d8b71e1d7142fd4b88ac7624a5cf625528ec5d243155cbcb2851b990ae9e78981f2c2544a559ff30c6e745394299055c7222f19da0b4c7cc54fb6dff4f4662b40c610111fb2f897177007d079651eea4bc7aa6f860279c4825accf6aed2adb5844d82a1bcf4e3c5c0d7a96161d747edc8c35e5aafc18b9bd1f084649e4b633234d1418b8be30787efed818fb448b465255f7264bd112b0a9a5706b32e2730a738987457f2460de48cf8b8e1da800d5a4ae30e1518ba0117c5d87b6ac52dbe1e78ea448e5be69ce5804175e03b47f9d51f975cf42884b4cd3abb0b12ca26b29edb11d9b72d8c5d90b110e1123f6520dc8bc281895637ed31e148dd32a7dbb7304b545a5ad0fef7ef08ad24014fa12b7a79aea85c089a534da2c71a52c31173dbb0faf000ac05130a6d5f6535d1c4c2b4cea1f7f6a7768f28667fe9fb86938ea7f04cc230296859e7c96fcc352f968c9473e496de9c9348ca13b973b35828b19cf492f972aff1709002258289cfdf322150bfae9c4eb9273c93bddf05a19784c3a414bc4ea666010d02c9afb91b675b634d7967b924b0d385ccd35676c9a9ae23e819344d7690b364afa37a4d79f6b063535ce8bc883ff5ada84300903826d8c4a9eb88f687372f9ff3fb0cce5353d92848ae5a2de13035bd0e5404da57d6a9afcdd0e1d141231dc6b5188dc410477dba16b8e49596493abce54f8bdc8c80caeb3e1167670d1b23dfdd4324b5189a4422a3c2af7a1153adb2177cbc1f40eee280e2f5413f51e8ecf452c4f92bd314d867d914e367b91535a78b23c02adce69a77a3c698e276521e0cfee335ada97cde919ef5a7e1f6597ba4298cbe85c6319ad768ca93d6e5216230c8e800c4029c01a9dcaf237230e527b0d9ffdfb9689789a8184b5ba5051d5f67981a81f6463ae7b67a8880a1cf82e0d483c34b4d29df0ff39d8f17d63d0ebeb956c2e1cedd1f38c060c9e6f63bf84e170f2129c970d3d5bfdedff0f2f7bb262eea2847d12f139dd076b97cfadd0f1a816561a1b6a7398314c3820e809aed40cf3d94dc89a4debdeca4a26b341b8fec1a6ecbdd9b35dac1fa34c298088e6cb4a3354ec87da547421fd2cada2d5e3f6beb10a60200827e357a19e5b7133a0029b2bb9d32359817d16ee87af26b0fe840fb343c3b6df6ec8a9b5a34922808714705b8cb423ae71615e3cefadb7894521352c3d3ae6bf9ee6666e0f752cf5f86b7a3121e2213f80cb3856c92bcdc57458bf9a3b48381f34a72e191761e90a7082194b3dff74835c1565caa8abd1dbe8950f7be27e3384cc9551656f81ff449c02ce18155ec6205fda471712908c533e50b54fa73f6176c33b70d18c77c82ab73819166ca26e8cf8745cba7b9c25c1d23641941e2e3a6bb5042cdbd295ec336ecc8ac4984d062fd28e27236801668e409024d7abad36da2e89c5e2e67ed3d52f2a83b11cc1058f6a8236f04c72a73ef608ef88d44edf587c26dc854c8507a684cc945a8ea0e5322cfafc9fbd52604a8efaf2261c85ac5d3a75e131696b002dec3d4d2f526f4dbe9642f8802f433a476800ed4e08e4165ef5f16485b17345b1e1f71ebe0c8e776b3314ab5006a79d9c1d95216f1ddcb5e41b23e6f0d95050f8e284796511711aee8fca957df801f2ef2c324ee7cff1f3733687e8e13564aa698a5ffdd305c9a0af08ef376867e4d286f062c666a3a67782c487daf55a32ca6a36040c865e0aa1233afd11addac2d51a16a1185a1d7c8aa941be4d9bbc3d399161fb35ed9e8674f1a26eb4ccc51e430f0b77c530a1d6c54d2a95a152d0066065bab00a772bffc480bbde8133bb79d4dc5b414d98d567bfe50ba886a93a00e76d9ccceab19ac8f856f3a717812247e31862a821e13c81c30751616e0d5ecf270f849c573b7f6498faf662d8239e1af639de26d2a82bd7873a984ab7fdb2c3b7c20ec8e0632e651ed3109c5399836596b70a17e06c47bb74e54ceef508da81022b97bd16c74c4d0275febe0a5186aa4d269325db9bf4a004adeba8c5ad4a79aeb2bbf35ae63d8edc6a0d327cf9fc7b71fee5cb14b5d747bedb01127a59673005edf8063d3e969d1515b8b41be1693bbda69e622c5844052c2309a6b3abd526b043b8603e3edc0a350fad9d87a6617d78c41995a2e1ef5aa4ec71ffd202f8d0363a898bce756268c4ce486910c759b34bcde3dfe8e12dcae1bdd66885fd66bef058f8036e50ee1b4cc815a167b2d67f9f2a89ab9ee483d83b0db39b2009836587256041ae8fc394258391c0fcf75c24fb607773055a8605495275e230a5f34653067ed10f508785e787496231134f65e91639d0ecb1a8c47532b9d848512af3fc92802bf161ae432b59a8efb4854494d0a24d5f958860a84714ec07d7a99ed0dc5030dd0521ac7e39613cd3f7cbc0445aab2e59905d4233477f78db5f0dc37f8aa5fd4eab2f0679ca4471b96b5546e6df7759598d9ec1c7fed90ced5efc2d42802a321b63c850d83659f3fa8fc04d1ee7bd6af9bddb6408c5c8049847f350ec45439badcfabf00c06381031e58b473efbe3bf94d171bd6844c2fc76ba91d2bf529886703f4878a7c26562da0d24c9e99470d3d539101258e43050f32746074e208f8f2d331c6f1df348786d571b498149eb54158535276d3cb6aeb80e9e731b479f121f6b9627e10177ad6663dd5a9874b99ce0263f4117b6bc621fd0e9aaa9204dbbe11944579385799e5fa3e951b1ad623abf9cbd13eadac817a52ed6126a5321e8fcfcb552a7e7a4b7a3a7ddd34f7c8baa2e693cf45911403be278e25ef148a225dd5647cd80b0af75fce01963e43a9c57971c1d86d502db4b523f7cc4b089550efce6aa0cd068f075a5dd2a67f29ffaef9415fd300127ffd26ef324083a9d90e0f60e2ab4f988fe2348ff9f740cf54dceaff74a744fe9044db334767de1ee0c58333d684a7e994f0b50e7d6fc85d2fb71452093e823debf29a963c2ba69032de14f04d131d202599a47f66f861fc19a73ee3257f01f615702cc01b73212655bf8a3f5040f866cb45ca8dbd7951d49914325ad0520b529725595aec269909d3d2adc7e6f382e20c5cf0de89d9e10c3766b65e129fe679fa78e80cb52e5460347e4531171401bd7346dc1ad20259cc7b059397f44edb92c6d3a37d80729b54fe2a1924eb8bbe1e856b57eaa0db013eee5a91ae7d4832c6819d505654dab50dbb40f2496b40012ecc3428f6fc4c208717cb774bb673333cb53db83e3a4eecb2f22798489e1c1214cf0719e5ed3d00d27ec10f15a5b8261de91da3de38b6866c2c47d3c88d0538f9164df05f7c96e745aca51fb554005290a6a4d9de59facc62f0086b713ee4bc052a6f760eb03f1e0828dd70d2cb3100be733a21e5a20306bdc6d227edbba2e65f92d373979121ed447ad3ca15113478ced847449b1db77ca4360dd0e10c25fe30d6e3afa527229b212bedf4262df202e95d330ba9d1ff7540c9212ef837574c9f7f06f1de7b2b72c6c295b8ac2a52e6378b673bb7c6c43bb8067609d8461f18d514a302ea9425b85cc732dc500d3b6bdfe9499f6c05ec1435767429294064a9fa1d24ab727af6b60ac32b29b9e097da0a0042fe71956049df9f8456942e10483522f0b21e3688b4f93dea678fab4d7bdf56bb1f6d7e0921dd0b0c57c0170a3daeac6fdf95cfc1fa50bdd65e7c74459687751acb09c9cee6584276f557033ad08e4209fc804d8bcf38cb57d52645677329e5c8caed7d96de77ca28f8fefb8849fd6d26cf86b9cd7dd9f0d59635259b5aee2c2ee4c0a24b53632d8c285f05dcef22b42e22501a6f4a5ab3b867521dc992fed4b3e12b41d48b43f3084c222c1e0b269f89bb8578587fe49d69112533d9648065be88d56019cf40a2062eef7536e530b69f62cedb72639e354e5c5571b3189c65b9a2670a026682c4ed946cea0cc56982d9e1d34ca440b103d00f8bdf3ff67c5e0bf78844779a30e02547449289f3f98a9dff3bd2d65c448f57f46e84664545d71c4fe11860b1737f160f1d7593b607565483af76f00180624cd1a7680e4f22595472198da5f4722828b3a09c1358bb6f6736d63fdb758d03156fdd93205a396b1b28d9ab2eab5663c3fd740ef21f3e5c3ce059357d0092fa1c96b90e85afb295d938c97be31e46b84fb341d31654b8a53d49df60bfecb7d0c80de2e02396b65ff66b9004ad946bb0349eb1f4693e50d3d13811c9897f260c809e0111e4566d52da89d74f7257ecd2da866a78d2272f6d5f769777c4030436ae0fbeaaaf39fef5ed5a45621cadf2a7a933146738557dfb51cc187256be7cd6b929c0b16b8591d098a5834791dfa5b60a6c58ca851161060eff3cc329f9b37509b4b0310283506c41343806bb342c8763fadea8a0a30315fedaac7124fbd49a0678352f5b7b615052cd0da580f6b0a21da64d0971538cb0892410842e0e05ce183df8b55eb5ec043139aa2eca6b5890a1364df5e069245f17a40f0531786e98a7caa1caf3781a114840b6a880dd4dd856728875d52cf2ab102352fb148239801be8d777020e12fefda9da1c8a92b602a324a39038e51f1bdc69816ebf748b0edc5f42c373bdfd53ba3ebd91d0d3bc96f212494ff1ddd238e33e436619968fcb52f78bb62ece0399e6c5080f39e7871daa0520b8e85934888e6a40ec0c2f6a3ee5775a581c894b57e807629faf183e1f32c5d0d606a46d9543b42107808947f0fea956b22335fe152acc74471aac0a22f41a02ae3105a4e76be68ec05bea4c67035328cb2c1b435c13dbe51160ec12b057cc5e4a52c302046fc62e1e869ba12d5e3e78ab208443b20bfe5e056a207f50c3a28bb15227ae76b51daa29e9e46fca7532ed5be5b626a27afb872a2090788ba06632eb1779d0c5a7b2a9e96c0cdec4b2f72fe265fa13b1c89b07886a8326e757defa018b019277ac4fd467f85d15a57c54e748869732695ea687273143b0ee4ed38cfa95061a162bbad3aa731d3df43a12bd9632d7ac51a2e4ae105b163f28ee0c8fde1cd2902a8ebc4dbac7957d3a56f958d35000a9f1fd1d254ad245fb1c9f53acb50aab1d393c1deba0da0dfefe37d16107c85b50d2d81893dd7c170b52ca6e8b8846dae9cd9da5546396cde7c845627f3a8230ca7b999ea1d243d69852d526d35eb8a61b6d191c300be11c6121e8745b7565c73f74aa77f7300ec8c9a52a432c404859dba2184929a1a544948f88ce9cbf5b67d646716b3cffc437c7d22f8d4035de3a53f202f5e52bc98ba79c8d39eb214c59b778584218474f69b9614eccb4456290a8e83fe80cb4353ac3d05f7df0a21ee60b92c5c3351196a7c8daeec73378bca4050937ea4741d1980fb26662524aba54fa1d22b7386481381cc6764763d7d4be90df53c33edc85efb4ca0bb0ba2108ebaba0d6e6cc49f866dcad5014ec69922571f1f93a988c3985d9a0b42ecf30f0f547a3491897c7e3773115e3f67737df23d1c79219fd5ad5a4a7bdcba53a7e5bb8f5aee31541e62ab4428897b5ac47a1fed8ea8726174c419246a8b6dda2132f7dde4a0ca473aeb665388dd41832a3c2ffade13e2a8b6d6597dde9df9eb0f8568c29fe2c8fd5286dd23aad02e8b253286e793421ec04c229fd9409acb00c34b62dff53ab9c0e5b3842716e89edd35dbd93636c97362855760a948f87da5dcf39a888d0f194c75000ff045bd2ef3ecb67b5941007ce9f2d32080503d7e54bd2c644ebfd663ea70dab4f1cf943b69aa5101e33a8db7d1252473d0fee039a8044444b51627364579c227be1d2450990f19f1469bc7a0b29cd9bf2d8d675bea12d9d03e1887ecc7e054eca7a6d41b2c8b9fce05ed54c408ba5186e8b46941c5996b8b5c4f6f13fc54e168610529d77e9040fca397ab9e4e1e2a5fb4ec3c87b4d867da821343285d48161f5ca0ac3219cdbc019233429bed28d29df49d779a22805d42621cbab6652a51961d11c19788845f717438a049707ac8e63a6090f5a901ba575ec42c2aae7c325104c100943564a9c0ac204b237274abbcf8ae1f26b2dd1d8dea921e1183ce26d4b646ff94cadf2973bc72a9b66db6c986b1fe88b9da92e55a981f16f7af90ad95941bf53593646d0f27b8528eccb1c0d7e8da540b8a93a041e9b38d496c64351840a8b7e33984d2f77059cbf909e610252fca17a83d8fece85208177344996bd12e858e2a27c0f9d118ef7ca1bfd445f2d9362a2c7db8199253751c21e2d0a054c02b0e76d8a9500093e1faf568fcb0c587a721e4c5dcc4f4709321c1b18a8117a811af55e69e642a73c9bd806fd00f11bda5958da04e5d633bdabedf2b377c9e48c1f743bc20a4933b1f3abf6eeebf7bddb9db63978d618317c459e6ca57f16d14c45cccd3c0afff5c4b092ed0b930488a4c8a23062a7fb896e86955196c8de8be81765dc80ed4a359e59f4b2fc0001c25e6283896a5e6982baf83b69305b0b58891aa83035bb143a6676380e683ad7b430f1c10a370549658923f87b183f838157d8fb90047d444d4590c8c9f74a6ca643ffc47c72a3827a028e3551f97c304d79d8c7c5953ac2b6632e0bab5237aae0be13f3a6c241fe094ec158b1791bf80618a275988ffa76bde7d8697c210978a9cab6b852d0e6a45a9444cb644023c5f25bbf6bce9bc548aafa164a030bc8bd4b8f6e7a46449a5cb5fda0f432f79c7e5b6bb6133260a420c4c3711609b97d630c34c6a24bc5650e61b15c3de2468e0b876f0fd48b879ee6546b703556d3305135e2439629fb50a2a7d7000d3ed40254bf905315a0b7bc82a2199c10b200e76f0dc06fbfa88f6201cf9714cb0c4aff404af609403a9905dcf6f67b0de5e8aca5def7d1859029a411211a21e1154f8eb972c8b9bc21d481dc982a9795b63486dbeeaef151a8701cbbe488afb6218cb6a77d2febf11d11386bcfdc7811ee8c7ef9870e5889b90dd4e8620944b2f8a97ff0b4522847f6f8336fe534a4e755979ae7ef3f8d978ba7d47ee1c36a3d614df17d5f5af726733079d1205ba581b3fee48d6e6818e1e6e72267aae1a8bf25201536c66ee1f65e62127ac9790345d06864d44eb182d19275c889058986a00cccf20330b76d1f7d35075127b5449d747e21a2d54352cd56f8cece39e48d48def690cde75c230999525f3d8438f2f066e823e14d46103ffc193a1c901944206348f87a31868b1c79602228262a94a56f4d7277fce1458e4a7f165d5050348e636a31f4575d2ec1e70858f956b2b3265756174e2b3d782209d26a78c2b3e3fba5044321a008935ea9f20a985cf8d6dae6aa194c2182316300bc3c552e67dbd0f2bd37eb56b0425d88c540ec80258529e3f2805b28d7f8b9f9e396dcdc97a473123d1439bf7cc4244c2a00df0a61497b18d554628664568cbaef7ff51369c44ecd2de2f22595a01dbdc8545841d3a8384bfc9e488452d2440d8900881d05c5c7eb35aa00ce225eaea24843406fa42cc8450e66f76ac9f549b8591f7d40942f4833fc734a034c8741c551d57ddafb5d94ceb4b25680f045038306e6bcc53e88386e2b45b80b3ba23dec8c13f8ca01c202ae968c4d0df04cdb38395d2df42a5aff646928323016370ae0a0049989dee37bac5bfbc45bf192379d998bb914812c05dd5f25a0b806ce106936b1495eb948 -MD = d34e6a8ecef67262a956051b3418db500aec04c537088a86059baa48cbcd6f6504a7354880dbc1910f9ffb0cba8b77ff75ca9da6856a7ef522ff21d39658170b - -Len = 87352 -Msg = 1ebc2320c183fd3ab71a10bb418bc9ae56c6ea17f4a0811eb51b1b70a2e835e34b2af359187d15e6da372635a5eef627e23a4bbea0bbd43a2b5e5e81e0dd4ac43f853f60423c1c02edc2310f2737ae43c8de5b98f3208a69a6d44bd78fbdde6c22546efee8c8fcd61a4499126e70d848313a836c96d68df44e0348395891d8211b20e8fbb22a9baa8744c50623a05c7f44d7290430e5c3234a75be71e360202c5270141f4769e3c65c4a1fb3edd022302a3cb7266a56163dc3b21645d7329ed5f0cc5c31508dba71c2de0ee0750711a30af1939bec306d8ce040b67edd0f3a631dbc27fb749f0af5e189fa57634d131f0d7f272a5d7baf56caa908e49c00dc2000c9de435ca6ba98e0d24bde5eaa0fee5b6dd99d6640c6e4a875723ebd0c6c52c27ae7d2afaab2a3e7426a3e0e27ee561b4313bbae86997ea32a5e56e73cd2428a58ab7016b4da5e205fbd3f1ccb96a0768a3c4bde55106be35233f2c397f63881ea92e439ca1a10b1b4ada8309ff01393c9bb169db513f58f7459dbf825c07bcfb805f8bff75a02c2c6a343f1a9e4f99b88fae494af8a62cf1938d92fee19559b4a6a725140827d7c1f05d608f35b98b54f607c6a4a5dfbcdc838b310fbe70c0d292a1b96af7ac706463c2a1c853b3a0aa755a8c88f7508ae09c133425314e94fdcaebb374b2a2889c3b107d6656e25c117412e5684b8d19d643b1f6efe863486eb5d1adb1c7aea2d1fcb34de9ddaa103288dd7bb330f9dc0620e403b052735dddf9eff2b2b535419e1f17bdb3569f8f8609f6ba0a462b63f8aa25e526fdd347a3edb34ce7f9bad76918da276330270c74ae0b2acde9a6243655f415a44927885937b7f6d203c3e6bb7067256a18c53996bb87488e99deaf479aeb0fc8c2d4a2763e6a9b0171c4f21dcc4b32386f1e7954d9078dbcd55967951f574e05096f28738837a3e6b2527c0872f2d87eb1875e477ce874e92a9adfb729d55ad98b5b8cf99bcb9c0243d106f41afa728d7e944ad71dc6989418079a1660f1b0c6a72e3240ff830dd4b4e505691acebae524c9e19c420e633e2c44094b4b28ea4d0b5bdb021a0a53ee73f309eff8ebfc26529c950f704c5f47b5c4bfbe4ed761ed1668c9b571ae18b00f8f86f13bdec0c16680e7992eed0761630e2ff7e2a9a21756d990d39cfac6b9f61f0f056a13a336ff1b5bc1d48cd5eba284cc80bd0c356c5b22c2d5027cd86ca62604a4fa270e078ac064221798557702cd37d1347b964c81d8d23238b0e858ce38fa4872958ba3882493326e9c0073f24bd461cf644f5879703183a613510eaccc627849cb86ab759c5b7b20046162ff8534cb0472cae0806d7341e120bceee054dfbd0655997fd1bc3f44f26de2d4890ddb756a138395554529e560758689f766c47f3ea03ea13ae8b1584c352f493d4a3af976c323e7667b97f6aa7e48505086b3373957d0a00fc6540d93f681217adec5bf911e064712957fee35976ce29a191e9dacd91a1cceb999ed702e930dc0102e306f60a54508073444887d8eb122a278eaff9055480656e5605749cf5ebba2b7046847ab61b5654782198d083c88c754d7b83a2cd22512d90ecfe4b0a4bbeb02a4023f731d89243c3f7f4273e54adc34cc5d230b4bd961f761206bc1604f7d9387c3c486d911c884d5003a5c6bd7759b3154e77b0561e892d01f6b8c21f4bedc2823536134ddc6b3db72c11c00bd17eabf35f3e6af7d0b6e0413407b6a3a436f2db7889cb15ba34bbb1da34d747a27c5ce86d4f8aa794edb5582a719998e9faee0e6b093cf09e2af1c872d7b178d499ed7be070b76f5275d4d03ebe13070282dea3787d0fe6709605835dc0f6a64e1e8635206a9955f2976631dab5cef7d616eb2206afebff18c01f6a03b84fd9f853519d9505d9645d9b930165206f704ffd3d147c6579447ef06806cc86641aba7f733ba8081fa179c982ca47c5a17a5481fb01446861bc8a6e07de21f4dc707ceb1797bf3d12162f685c13e76c0a1ecee84d6fc5804a6f2581257b68c85fe426e0633a446a5bca68c24865afdf5263a37b5ce86774dc663573ea630bcb977da0a47fab9d58a2c50a1d6f4706e52252bc8250f3920ec0a8a38a7d2070c52943d27f947234cf8e10fec2f941544522f101455119ae149e3d580f073a017ec03ea5bbca186f97c7b22df90ddb02c8f94a5a0b85e0234f1d2e3b49af3724bd0277ff9f4824b877f6b37e0ad39e76364f65b01e17d35a87e68233829ea1434c97f5ca72371e7638c31cd83c74111957ce48e9c42d77b984a1412a00fbffc5f128c0ec7dbe8e10a2d5f425d818bd53f21cfdef46f056a90df574070defda12755de14f0806fdf07dd5434c26e6288dd1e18ca8ec87f793ec8a22b2efa2b9929fdd5fd95a37f37d916a11356e07dc2dbac6fbfefd1ae2dde7095312ee3b24ad39514274bd78f61fa63d67c8f8a3619d767254d8c3d3a0f1c71a0f1154e3a3cb0960930777f1903e83f54ced0be13d43cd8f9f1d84d8b83553645f9667c1bf54d9b35979d1cb4842f13bc98cf1e9fa8986c2e2b78951b21355904a8a71feffb06ff19cb4132ea694b8b7e58df0e41fd66bb5278d1a6717f29345d9d3b8c1ec4793c3649f8541339aa010a8d851fa3591421075877e416d39d72c135a85330c810fd1ba226f2d76bd71ef1a555c52c324d47ad58dff093f52e7ed00071f7beac7aac2a5251819f865f2fb44ed581551f6e99c4d87e3e412a48b2fa8c3d0c30b7f2b3f2e90c92e3ffbecdd2d868f6a686f491ee85d73fc70978d9a1474de30f9135bef5c4bca94d5e5273cdd09477a8ff7bba7abf8f779e093b4d74b0392ec3be9027b373f6372428d6bc15d5fc96c4ef608dfa03eb783eb00c78e5559341f596be88ac752dcf00c598014b46e5d692dd4f870ce18fa4017468f663b5c0cf0dbffd4c5156d7c38bdb32ddcea204a99b5f953ff3d6e0adbefcdd40804f661884a0f8fd328798c6fdc023bc1085cda236dcee137f6292d7af8fe5d1cb80e7d0f2e02e25e085c54c0f2ae736d15095330ddb96abd002fac46bc3ff449608ca6ac0d40920bbe001c51861f9a851911fee78e23b53c636acf66c2f95f370257258771316a84514b2c4a20bc7bb41d5b237107758b5a28c1dd029295678fa95942c9e13d3171c927cbd449efdda027cf0af5d015b4bf561b2044b579d4f95a79449ae6ccae792f7b4317872087f14255fa9c726df814f562de52b20f6e1c1f9f75210746aa458a2fda3a65b5425073d53d8e74e31f010e7d605411befda1ffb31b87cc13ed7de22ad9656817d665c43719f25ee1f02da754ee735bed482f039e7ff3bd9b3fc83f5688c21aae0bd73c63d7f0b9ce3441cbcfcfd61706186f3146e98e634668ceaa9a2e7602e2a94ee342beb20c12b3e47fd64da7cd7035099394a080457d2f382ade14aca81c7774c2ba185ddf1535bfcd51ae0b059367a43170eef0eba65eaec80a838a95c23eeee0b42b1cbb3e827abc283b2c48d776e811c31906de2bbbd78b07c138503ec6674619411526f761bc54433c321da4297f3d736aeca5720f5c7bbb16df61f6d785facfa070aaa89c2d9e8af9450d62490ebd6a29c7c8e521e4a00fcca7515439f006c09056cfb7f976a1e6b98b9f799e40978e9ec2d0eabb1803eb2ab7a7beb35171d25bef1c8d413f663dc62f5b51f0bad5c9110244eba3a0ab387738eb9e0f5044ef486219923b2ff3796657c95207277f02c9b2ac4fa223a0dcfc51a65b139486fe9ed84e2eb1ef5280e22c72e5ab2d9b210ff8917e804aebc1012b5f5d88c63fe7a67844ca69278b3c82d5dd70a374330d2bfc79e005bc93cdcded9e0c358d7892a86b82cc2d7ea4938d7a925db8a54eb065e7efddf921a0eaaac0ebd0e49238e7ebd8909ec39ca76f4d451a12b268f5f104e178dd23231bffdecccf115b7d87ceb9e8f7a6f32a9bb7085cfcf959642fb852119e484c680bf4b238d13763f56d2f58c23e4e87d0895307e7c078744204ed95a0e8863c9878b16e2d7aaac4a2f3f21190edfd4535782a920feff9cda97c7916b6deffbb5c6a1d5ad250d2462d20ff2c778d1af7027026f0fb10e32a42a0421d79091b915cea22be50dd18b13efd3ef1a1a50f63de7a2e6bd5ab9e54b57731f214f043853fffa7e1cea9e2cc7c9097a836bd4352729c2b49c2489213a9092edcad1cdd61adb2950c753a996090e3f3985d5d1e8b66e003d3ec70272ec75f22246d1353eb500ad2876d1aa63521fe380a3f0e08d8614e9f517baac56fb680f3137b5f0beccd0f479addd16f13d8e75046045769ff0bede70b977fd49c1e748bef00876f2bcfc9dc8dede55ec25da82194d3c1a9c90dc5c3486676bc7ea944d0002314e572fc417aa7c7e0da095749953cd4d330fe0fde1c521317e5ddfdf7ac900d8dd787fc7e0731904a4ab26fd0938531156766b841d86fc4eab781c29506e5e57aac3378886c7373a918834c4702b90f0fb4c8b1f5e1e8a2789b31a127c548d464cc3e186892b59687ab4597b5cc1e994a80eea1021d05d448f7b741b4d30102d29f708325603f216b6bbff723d8fcf44d349e3171760d82e234d94c441758964c8d9162c7bd583ddec0bb15980e9d4ba036a10949d34ad6cfbb6067e07995b85afe685c57934a126712ff981c5648c4ccf0bfd0921b02f696f3133c8ee1ff92855abe1adbc95bc78ec95529b798448758c8bf2f54387e0abf43bc735837df4954095b435e47d484db4d837072bcdabdcc286bcd9811063bd31521b446637d0850730780e5f5fd73d707511454aa528eb1778953658ee1b059d00ca65f4e21f5ff008a797abb1db9095d89be664bf4218d1de268c4975993d9db43f1abde1338eb19abd524817d81f9b8f115af85079feb823eb5bc14b409dba08e3e32fc9afa9c24333dec2f66f1308153c23741d52f500e65e155ed3b3ce886b735fd910063998beb58d8ad1e31351e756c0668a4fa46291e95970b365487f5847d13838b9a6ab498cff3e3ed6a90f91fbc25e0bd28543b32798b54ed784155bfbf7cbc84c89709054942b91dc4ca781b599b9368e003ac6a3438b1a7d19d0f2ea241223314a8f0f96fcf18f5666a0530ed7067ed4ad9e48c6fa70aae8723899acf699fdfa726d33be9a1e6bc79f807251dac46938f604b60d1de4848c15b2ccaedfc1ad1a89919945ec00dbb24fde6c3935817a3d72049b003e751bea7ce6088a5037a5240872acc7635733a900009d2f77cc26549a04742acca0f5863038e9a9f84a9a8977a6eabda070280e489da1af01e2e210e68abdf758d695d1a821cc9828a8e1bd4f94df9323ea0d74920c0622748451f4d00df4f063a4617f7d474ddf61a11f5208d2f7d25e33785e74e23744401eea62ff1495a06d890cc1f80fc9ea53e1a7ca2bc7c005cfcaed3e59a6b16ee521100dcc153c81e702ec5bd0e1ed434fd91fa83119c4a7f94ed096c8d0111cd4197737bfb6460f509084af70741464e605eb5ea11f72335b0dc6fa3ad4b2c8ad966483524e3eb34ab06a2f5f2ccbd996d6af60046f553265a634db385b231cd1f67c731c63a32825e1017e0572901bd2e9b04ec37ffa1fb996aeac39a9fe63d1d82379868d0fa882b0eefe0bebfda63abda29d76c7bd65c76d98ffc76781583daa0e291930d0eed19e8731cb0f61033eb10abe96ed3baf0f7988486a0a684475ea70e45ce59355a3186ebbdb4366ad4f623d349c46d1560278f1188a092fc30b28104dba11c36777ad09fea53e7b1efd4fde920f6b3af530ba77e2affa344e6dd140c7c94bedaebfcafd6cc1471ad2b8e8435958d0b5072adc6129644402612e74a6d5030a7e95fbf09da8b7f3d26312aa2fed110dfbf6514d516f1f7d3685cd909717efc402b7accc8f14e1cb1e4a8b33e8efc0796c5d348bdd266a0c3d36bba3b5e2f81ef67e52ad2643d7436ae392e3f2b3dfa982a6552648e1ac8782fe892c77d8a451d6747e1117b820e354e8ca58f1ebc724db6c239b49238f65a447a699516b8d233f149fa6b7d4272148a481f15afa2f71d3092059425e6b3d1d9ca488d71e0b097ce937ccab4a8293d2b15a5b925170f70627fbeeb914c8645b87f3697d52b65b3c6cc6f1566d9ba16f99d3e63ca4244ae122f6da31c94f71ea7423c9b8cc17beea09cdb34dc00ad09bb85f2fbe44c1d3f094a1aa30fe38ec46fbb6181dcc97aaf26adc90e5e438b7c3b78c969bc5c228b0f79cbd3b264d49fd891ad310e6be8601ea4408d33cadbd93f1ccc959a9bdcfbec648a1b4c3c5017a96d289369d14f68512c4998a5be258790190268c531d2f567b25e6327968b95acf6db903720362f87ebeb17fa47f2eef61874c887458ce2490b509389980b7fa7d5cd0ebe83261d87892ef37b8cc87638c1289e26ff932b5a196693bb6a5a3f63b106f64820a69a1baf1a1270b6328720bb28d3eb886e366281aa4b0535003ba8338f311b1f3e0e0905b85d21ecb58974af7c4d1e08a56d29ee24a4ae2183dd3d036fa67fa976e11a320fbcd557dbe4fd442af607a6c1377606db8400556d8cecc8ae3cbee6d77b16df2718d61f2b0083233cb5ee8b49fb1371d7d541fa45af7b2a55dd1ffde844c5b309576a6b2d46cef3b9711adfc523c6d8207dba3794b0b3d36b70e91631a5ef57bc63da636a1ca55daa14d4c9be1658e3bf66b335e1f65c68f8dc655b3b045b7248226e3169ebd10916856471bb3c9139bb76731bb4e93e94050bdbf28dcad2adb67e6dfab21c1b9e05ac120044fd38831c97441295f120fd98e49203b0601cb00d5e21e9ce1548c58071269ee1c11768eab06c420d76cc4bbc4fd4b72a2c012255a9d023444023258dbce7721bf0f4912ea834d2a3e008277634e735859849ab9749c3d39c04736737759ea579f298a5f069e4ebe0979d39d07b14a6480bbbf4da25421f5fc8ff328384935e842fcb4d36dac4b44b035328d10da332fced20a52625942f14f6902f7bd10ec6c21054310ae31c566c8df19c81d0dc0028a540668331032c43f5ee0526455705bdfbfdf8736c33f8cb9b413fe9ad0739549de3ddfa31d53e752de15d8cc6b542fd598c4b7a5d52c3f19709b6108c6b04093cd1b5920d538c300631dfb63d72a60893cad1259ec1df65e712acff56518acdead19454adc53fffe8a532ab93d458680f7f337e18c873aff524c7bcf101f32b0fad2346fa737e673b07ff73ae2480a53773188db1afa7582707af5147c366a8132b0972daa472f2671ded1778a94845726d295952bda4e7e7820dc53fdf0bce5f14eee036a24327d4b0a59ed8add6d227370eeae43b92e49c5e8921c09c0b24592f7c97f7b3188eea87ce10b57652d4c0976e484d7199d7ad63ca6cb4448e326a46599f032019b0126c1176f94de5d1a456f17c77a7df49845979ae021dbb81fa1f2d0044317014b22516d78b7ab7533b3c408d48258fc288083df09270bb987284a1c2a12d4243347b843b5345efe1ed100383aa32cfc82138bf394c84b6ff383b5cee015ebac3fe3604aa39f6b504229ce1668418c7e5b7b0a79118a3d33fb60c078c4e0afd1e7a1e3d2d25d4334242a6833fbd1da1a0b2399c00de133adf53c14aa26f7a36db0efad8cbff288e26b5f791153f8a82817b9b468f861d14677620cc3a4cf68b8324947c8daf3af135e357b2f1f1a79411789e4e45f809896089f3365bcdc5249d23b2d2791d5282f9358d8edabbbbffd712095c2b1c1fc051f3002f0eda312ab1731d819a32b869f91163ced88510eb5cb1a61747daa7e2c21c10605a5b80c5487c9d32f5d4b3cfbde09f1af337ec7f26be3b28a31be8163b6cea714738fb1ce9a5fa8d94ec8ddcce0b0a1934ba98e3bf9f913647c52b85454b5809dd59ea581c58fb397e638cb7b3f86c74a2f45c40afbe70ea39c2b856672120d025a695a069fd69dfbb1ff989f4118dd346ce7fbe7c82a0ec83f8d7b22a560b702608431d59fa0c26540a1c791abd34dc26304b84b052e8e32d51d0c11552e18ee8653ef773b8acb7500b3cb0ac632b3a4c0306bbd29811783db4eaaab07d6ad574a7cc553f9f1139b709a255326d3893c02df98a6bbbe452bd086e9683406dead1b4365f4618025591ee97913442249088986c1a0223261ab437a4ac1701b4780776c43f0f8949b3e7a1618c3b4ab6d8ae2aa6921f38a2772b28d415f32905251fd3bd1a235bacfac00a486dceedb8143acdf11b4b611f1229c346f89f21299920b56b1b08f7f4d32511965d7693f0eb326893dd0c096492b6f0427ea450e87d1203146748c3e9e51d9e9183baa42806a0e3d5ffed953aa0da970fcf891d0979fea501296b2952d9b09983082288260c8b26ffaa736e69e49ea0f612d6f25634eb827a87f790f856e6eab21336a7b3a6fc18590528fcb90509f33f7014369557e184c6a97660a405c87967cd7f6a967cfaa32b3993a7f2ac24793210ca508f89e8922fb86f001c8d5d2ee95d843799358daebc6d3cd8db80f618161b80aa0c730994fbdc6bda2898aef282eccd778279bd2255caacf53d2a87b935b8beabd4bd4b73733cf15592cbc1ab78a2e3931af293e53e786a68e051df45d5100dbbae0eb715df0189d921d0a04314a64df1294616e0bf9efe978c9e07a23f4af442630e53638752bbce9c4f53a09e2193fb771d4ffb2064f1ec09b806babb8ffca8bc662945b258109dccefe0ac5e3a3e18cb20441fa8f3cacd1e49e4739007ab567ebe41a4aa3b0fac7959514d9b1ad5afeef6ff32a07311a495f6a9b708d98cb274bda166b52241646a35ae6d9fe8e02aa948881d500c4fd834695e6d692e2425650c53751c352c2d692afdf3b0cde8f0c2bee5c900e40ad1c44a0b7dfc2dfd1818535fb7279e5a703ce048c717f1746901ff201df826cdf70c40b6ce09ff9ef15639cb161d825393ac0096d11c7b0cfd30b441007ff81db2d6f4694ad8cb8f1ae766a179480c9d008132f0f90694381415844e5cdf82846ae80e2bd8b0ba59f99383e9c7ee61c21d831d5d271f6381167a1851185eed89870b350560dbf483f82238a9ea58ac4a547a6ae543ad116e6b2517511c4561b5710711fdcb9fa0957d5b2cebc9ce13bb0c2dc09035f9c5887bde2a5750dc058e90a44b1eff45e617f20708b64c97be9fac65c867e54ba855af6ff96a9c6a029e4daa8b6de514ef92beee73135bfdd67d9eea2a713bebe25f6d9f2b92e839806d0ee078f46556e38e49d81608de4683de49848db620209a2e1e3569d71c8fa6813c0fbbba6851ea91fb8d98a0bdbbec4915fb993f7a33f8482bfa5a4220b59c6440fffcc7d44f2a253cd4a3e0e0a43a466a16f713336c2537fab6a7dadcf38b9e8078e2249396ced17477dcd23049945db09e4f3a31134983f530f7a838909bb5664215d88b6efc1e0b3ced7d93f123174f5c48bd5e708bb28332f3b21dd6f33359243eeba621dc9269ec7ee9f2e60ffbaf158ba3a0cb144e0b824302710bbca0c0e80566caf698b7f64f361f366e7f923994c0f4e16b0cdff7e98ea01e781d8205541150e13455151b2cbe2645d29b6253a08eb908999aebae2f7c920a653f638f310bb1d2243e323e4cbd06095a8df566009df9fd9de6fc981cb6e21f1949cac6469a91850e7898c978dcc8694d7ad3db7d96bca8bf19991d78e49843de6440125d67f9e23a2ecf2276c3734cf58d8218df210af1475b4ba50aaeba60fab84cdb3c19f0d1ef865db30e190f9c98eb8c87eee5ecc07cd398989bba525db66c7689ac597f3a76a8cce20a87a5407fbf798f718b69fda7aa0b5ef3b367225aa9468475cfad0517bda41931b43b20f22fcf9732ba8a901007295fda3f02972e9645355f22821a1aed6bbf4a49dc2438631809f71b5661ff137c0418062aa47a5cfa0232fb0661c75fab3b1eed8d349b84db4c8956d558bcf68bb374b1e7318522ed54b50142c3663cebf77549583861baa1c8b0120f5e8ed7ded5b8e841269811a794b1dd3d263eabb45a16044418d32cf1e533f70d59bfdefed3aa52416bfb51af28ef36ff7498d58dcccbc759bc3903530bdcaed633953572131398eee8f6098d7a34b59193bce2feb55a3aa00cdb664fa271df72d25901c2ffba625186d161caf04b02fa6df2f98f7e8c0420f1007e6e12bb32ea20526d77fe6957702bd382edf4fbc442e88242c98d29cee251f27337c3824d4503ca9e1877e61f55c045947eed0ba372eeb3e6334bf93fec16f76c331e8edb8b6507bf2dd4fa63082e6fbe064344499166cf0d5620c30048265891e889a682c42d52f63e7c6dcb8f5b99290c5d6e5ba7371cdeb87551b8fe6b5d0be06d94eaf943f36bd4d707fef4310bfd18a55184bd4be382e3b0691014cb4d02a3331ebc328f3248764d90a53f970c61b282b46ad9896b215f3bd4b09430729db7410da075f857b2ad46cf677674e67d635c60b506d9fee1b27c5a3f85811205a601283dcc69a9d3002a8deda3b2df7ab29c1e0e4923e2ed66ddc266f0a67662f8d9393c3ec771d3f76192decd38408028a8b41dac4f606b03c4d6ccdc86e6db33330644d3fbf8da1a53a6e3fdee51b64be9ea893646c0840f9b5c1a510ba998e17659fe94ed830ff26991a43abc5945a6c78afaefee4a5f14c91df7581c09c2890af81288855d9a06091ac88c8aa255beab5a1ae030462599b6e10cf7a14c81b457ab27b8accda4de9c0bf8fb40720d1dfb248e10f5fbfd27ca70003883bbfce9c53ce52a481a55038b2adb90c612954a21ae018723b210456d917c23a89e5cb0bc71f6e8428dd4fc3d401a5204ca16cd83c1194ea3b3857b070e28bff93dc891a414fffa836e4a5119145c4ae3e1b82f8b247e6c5e46855100adab145edf6915e5ebab66f205de8b89704a7e49a1a2f79fa1d9e93bb33850c037ae2ac0ce67c3e7bf9f367699b931f31a8bf81f50fdad29fed2ce2141c5ffaf73d80a0550e92412578672f97302cbc1dbc8c04e37f0d990041022fa3955e6362bd2bb17ae17becf7d062062dce2e25a7ba9dcbd9ea4043c7b3cedade30f8ebb254345dc301a1c84f7c74a991a81fd26c2d55653cc40b5952bfd3822871c7ea82ad4b13e1d1ac39b8e72f7857506a48d78f536fa0bed7503dbfc0a416da33e63022d0624bf3e3d7a0aaf301037995ff764b08299a1d3cbee55e16bf2ddcd575675f54c755caf108b3325fc21a664b7cc4faf4417d7193fbe5f53631d1ec250e74bd48b1b3d95c734d17d63a10c8c3374019a835ef5e859dbc2fafbaa79a9b1804b74ccfdaa17e7dfab5f6d76af3c5c58421848554367a2ad467f3a8136aa03883f7a1603ea5dfaf38a712389d89ab8dedad19ae409bfa19db28a298a9defcd67ed917215479088d8365e8cc2ceced16f906e81f38e17de11d0c2ceaef59d97841d5fe71b07d817f577ccb009db012f742d97056a1b98e27266d033d388dfea49998c7dfd735c31b415649847455b58537af32f31f86934293d5b60e29cdb4c1d28c13ca3d3455d7cd7cd4b625503d6763c2b06316db45d9c1d0c5bc47ab9486891a62df66fba24b686afd144532231433ee69250c29ee335cd8b2e5f6aa263939de257dc8ee40cc8eab433d387dfef2447cddc773e51505b177fe19db3be2704141ec33e7aeb9f1bcb8278f938639a801e88eb8f2af52b75c1917a659f341b24be01770579f66517f1c1a89db0d5b9be8cbec87eceb1fded9468039e742dc75b62347d17d42de524241acca7355ed5485917792e72ae4d2a58ad83327bd0b412ca5edd5ed3b9a7ab2b34ebfe102675854d3d08855e14a394d5070308fc4669afbc289dc1bdc23312cfb90d8c895421dd2fd57c6dd90a8793d21f8a083fb66e9c0139c727dc6f12c3d84e3a38e71162b8c98adecd2db8828f199c201a8b494c3f613b627a76e9cb240e9d7bea7484be7ee101358ca0471bf07027cd262a268a02a3d377a1d458e69f384ed78a76d6bf9740e589947bdfdb1ea0689a146277b04c91ab0d843ee3eb9b20095701362eed6caedce3cc06a7498271068ecc7c614784f16b2c0bfbb263808c750235fcb5cf63f38e4a1c88c8ed82aaaab237bf0ed6148cbbdc1e55eed6b5453ae00f1092ede5d6a5c66c4b6a4f8715fb0c3b75a6e5632a4126a592bfcaa41301f977b9eecf5b20c65fa495b3f8fa78a2a7c1e450fcd993a81188fb4cc9b4bd72565640f1fe2b999b1eadafce6f419c4688b25635a4de8e96a6afd8be5a4d0d34fe92edc201bf09cc0a6de1e13cc64990b9f4117d64dae4b4ec02713c06d7c9f0f915088a607d38012bcd7215e8ef462741715e4fc5355da9eb6a0def53baba4d50c5d970a4cfeee18ab5ac91fa265db5280f84d34e57c11dabcdf6ffcb5fa8f40a8ca89d541cf2142e0ed57efad254df76b8cd3387a9d8ba35157293f62c5b8c2f51bc39f8cb0d4320be3603705af44f34537f94f8916a259028cad35b8a9abec8fc5e6b1846071666af1749e52805ad6ac8e3212a783e09c4f046e882e22e32db74d65b3df4a8340ac7c077e1a34fa01eff41ffa4c71d0cda532dfaf39ae08f73a36c32ee3db74613f078b6ea3399d15adfe159eee4cfd6d93bc930371c767d95706818b489fef38a11882e8a40ade825520a5591391c10c98f60b3d5ceb8a64bc31134164043e4761238064832518c8840051b142ccc62b2373bab551a70af9c84b0af9cca4fc0dfdad067ac724e65898f1bd4ff27a6739d1aa23f40676443919b8db0ce90ea30ce5398783f666c1c332891a8db9173ec9122dc971c1c5d0830f1f06035f8dbdc4964d862887772598bf3b2be2ed2fb74973633dc74a323a6836c21e7586bec6b5bf5d74c100d2ac39bd8c53f835206b4b63eed36cd637ec692f5676cbf52e38609efde5f5d915a036ac011525f785c54f62353ccb1c4361063750c17f31389d45d3835c2f969cbc10091df204caec4fb5fcbadc7a72e122b01d256117b18a6fe5eb9249e6cff45a4663577d1d15c0851fa1f434e3809dcc071f68e82dfc702ab145af31b3cba9054a392218c77e8ee00ce075c8aeabd5a76bcc7fb92a88a64848804e960f301737abf922579c4bb3fade36c42a348b255f6eb2fe7675dc89630c19d4f96183eb7bec31ccac1423dc20242343bc0d75194e70615982c86e85e58c70e6de434d824c7b6175a8c79d641a7f24990092100e1f213605707ac5485a4a3408b73ce37823ea06d1b01f0ef8244fb9189a7ad2802bf1cfa6c205673d3bb5c1af16b6ec399ca890556492fee4f8066f66dc20332c0f528ca1fa00cad0f46fa83e7f39de431147ac7528bbe3d6e033a5f8681ac84e33c40b8b8af566a03ec8665b433e10211c37a9b59f02642a7767fb31a0d2f88333e6bac7e74bd12755607a7a154c58502809269b1a0ee67c4813edc728e14a578a0b18eba18c80d2e2c8531f67eced5ccf3c919a3c29e138bcb7ec1d62be442790d1a46b5c200c4f61509ebfbd8865a37c32793777fbeadc6fd474a8d0c26c9ff2bafbdb49beb9d94b999bdf78b747c0b99b4bf75fed79f3bbea15fe15a62a1d2a277d902cb1301d2c1408f34be20a40f1c7986e5687050b3b795e8183d2032ba1b7a83e679005976d50349f89a13380cf57dce0ee41228f5902acd7bdce9e47f3ec1a4a7ce380b499cecd38c47d4a2cacbc881399b448fcbf069f65260441fe8b253228ef1458113bf021538eceb4811476385aeb48eedfb7f584ce5f0ba4bbe2039e7e30aaf219ce54df743b2e194a91155c4b55878aa4ee602b57bb5d2d0c92f79d9ee43fc55abb7d662f7c03dec59d0a62496af8b2e8ccd6c1a5ed71416d1881de2f6c2b6840adda43c9a3f87baea2c5f8f98e04ee27ddba064d47d08869ed22ce945af64157ffebf6f7556486525cf87ec04144a2ce8b9a57926cf3786f7b6afd521338f72d3c230e1d02e0655cf5e262322720575970f83439cf6287fa6dcad90d376be02ced3fe7cf3ee4cf2b384451b3a230926508442a97d1a63da71eb2e01a29f792d37d6312625bf9fa498e7eabe944edea5dcc0eb92136271fd218c3b10d8d6495bd876d2c9afc989d3452f20f3781c0a5c036c86e8a4f7d9527e66daa5bc45b4f47759e84cd93391e78305eca22db517b18c3019927901233f4f2216a895114460dd277b97eb2640481a1158b3fc408d0e41b3ae78daa7d82e5e67f401ac658108d28994922dc91c5ed2fa6b0f2de5f2dae89e4c820e117f8671de7e994967f2521d263925e745af9273682d9c08ced07d4a98fc985f68a0af512ebb56b33f1fa788a8753860c1814ac405a743d420ae5f2f4ac5a213d4c311c600b32134169070d9b44db3e16618ef8e76e0eddb0615e85f5baf88737c711497fc6fe31214ce13d9f5cb7eb25bfeea9966e08063a68c80a174c232c78931208ec9f682966060fa5010f6811bc9bba1ad7bb0e6b5289b8fbe3d078857228c9d711050e80823ce8b06b0d6a564d8d57e925d570519b5ca7d7f5d85736a7009f3097886fbb084a130c27b74d0d4afd6e80fb5ddc7d675a2b2a97d44d94a9b308a1eaa9fa5d5ac60504e19d7ebb4774647ee2b4b12368faa9607444da43dca89ca784da3ccc1c29352703307df4c57ab02f566a8d07f2b6a91605ba7ba8c259d1cde0a9b5abaefc2a0f1710d92e4788f83ed0ffce8fa736b0c7b695a057fd5f3e619898e36095b76a1987af0eec40279319dcd5042ef8d346d21176f6b5d021391f2718448f62d36bd2ff7b8da341cf274cf49abc6a6a14e1e1a0dedd670d386862e6b8578c88e8b5c7c8f6e3d7bee81b4492b155c66d83f852ef2dc2dfe71d32c981e9aaec9a5fce649eb1901e2a1ae59d41a96ec7959910c256f4558500482eaf733cad23f9b11c35cb2c10db15d01cb38be375e254dcb1ac62b2f3eaeb31c2a12511ecc7397525c7d8d6e49304903733dc0ff9ab3dc7616dacfa2c95fa62853b2219c84adc248177624299da68e3bb7abc8f7886b2d196a2902a6e0ad062ecd9f4a4ee335437a5d0e1ef9f15d533100497d251194693c7d7b6d446bdefbb6ffa1753ccf524370970c24e72d9bc16eb7e088931b77b768b798b783533bac4953804a6d314deab32b39ddfa39a90079423890498f5d40238048896c7e0c426e300370e9f26e5fca835df23afdcf37da0b193e4d568c2cf840528b05d599e4aefef490b8f8fdcb3d05400aaf62548f1a784b3aa9564da26c5f7f64584029bb90261951e32d4255951ba9ce624e822fc0f3952b6579e7ca094597bd6da806ef9c0e3a5c70788526592c61e55aaa9f3f54e3c1ba87a6a4cd565b623d4af376a75a1f21586ac00d65119f31f99f5ff4e95fb0958e19c5cad3db07a78df90bc20b53c195eed6ef233b46dedfaf3a54c95368c1da5022bda20321b2305482d632440e5d5dc6beec0fd07e5033b13270 -MD = 9354325be0d8127722ab167c4ba9b8c04d6fb4b76ceff8e6f32c55300c70705a3c2bf20cd85706d3f67fef2f2815282456cb9042ca8a6a6b9cf57e9737ec2592 - -Len = 88144 -Msg = f1ec3715e90feae7f5a926567eccc1b02bd2c3b158fd754ac45abaa089eba25852043d12c8f6ad334deb7fe8ed113c6891fb3a797644b835de752a0e0628d210576e9066e06ffb200450b033705aebc15158549bc3401b058c1646b90a0e4a2e6af1d9191bc1fc3582a0613ff0eef645d1b2b721263bc3413507b6a97ee3333af254c0346036d7fa30a339155316867c7ad00b12867bdb71400e21e64bf0b4bc5760ecbe9614b5f77420e1bc831ac3edb47cf977cd49891d17f43079577df63d00dd06bfa7a4bdb5b7e1013c6642d420e87c2857e2edf5ce21808a698cd221455793b5407a2e18bb62ac409ee6d5e19d7c9942baadaf490bc67cd7bed1365c5ac349a247f7faed91db4a46e9ea1d14edda9beca916d7aa5d6eaec1800df3cf06acc975df064f65c08c83bc2559609397684ad02a05ac424b81e0eeb82a4fa3d07ad9d50d8f77a8cfdb1e4a5b1de78623906e96486277395d67d8066e0f93004096426adb7ab8dd4632e597921dfa1619b9cee6081580b71b895fb2a8a4060ddf66cbdd50af5b2caef89e4cd241e16a024a336674060fe30e4d3c9a70d1f2f334533ed67417a7be8d9512102371e3ac66ad65c1931e6ce5bd1c3965cd7e9dd9c8c662fc5098e6bb6e71098c8e954901cb492c9d6d43dfe6b05f1cbbc89350e82125fef8eb1b5e4bd6f44b681a955c93bb8650a30b5eaf0e707cae4667f85348c9d9db714e8959944f869f4bd059618abdcc987a7458258484ddb7abb496ee20484bc1107fc81dc1608fceddb6caa30e5a83cdcab017897174e8ff95b753699824e2777d88c2f2f89277a1c7d7ce69451813b73dc88523fcc9074daa77180bdae705c75f705d22616ba6ddb1384efa5a82e51e79c3893a4e0aa16a92fcce1e0b181e775f4083f42675844d42e3339f731d5fca26a90a178ebf1d1ff64e5be85640945024ff1baf6c387ab823df63a0b973ea83ed83f203e571e5327e76a9b2e1e6cf1a57b50d9c5e3beee5fc34c845530bef10765828447ba7606bd17b9ec3d492379d9f6b41032106499d74eb49d6696dd43a6830942277e9f6949865246558cd34a0a5289e2ce021f4a8330acd9a252203c96b131ee701bf0f737a3c22de951d2eed10f40e5ec11555cee29c3edaadb1e285290aaed943b213d220097f77b20d8d4a89d779e2ec68d6d729a683de29a2db35471c2c4262496a7731d42578d722b980b8dac5018aa5de8aaf3284eec27e54a370528068890d7d2a56a3fb292ee61a574404db00c351d4b01d4729529fcbb7954ab29294de84b2b53780e9d1dce01896d65ea32abef622111aee5a51ea146bd47d474a0d893872df7b72d7ba0c981c0715ee05c6a41b2f754f2eff34c8ded828b216911db3b1266fcb82ad2ae4978c70aabeea1b9c4963a4630f004463b3665891294d0a8475342eceb6536a8c64d29a3cd63872cf072665ff9945c6e31a7d2ec187681d230e06e42d18b2c22d87544d743cd91365dde082cbd5b605709c8570eb38c89eb90402588fb0b079ef897c50fafab3468553f9c16eca3c4830c0e6e7b64557d56ddd92549d8436d9f9f1b16d7518b05357f2d9eb9180bdd64e0e085bcbb5fb0968231d9eff9f2d2874475a6a8d9cb7810441e9c8db0022f8f00e5494d1909e84d15d0bff5c067baf8714e110eb90af1ab4c98f1ff55154f63f49305971de278cd114c33f5cc30ab65bdead2737fb82648e1034b9867b3a186246057353a87e6a90cfaf26a8dcc0851730267718e617a8bba0415f3787bba6818d3cab1ef68b663516367ce85c8763e48fb4c73758562d63011cd7b07cc1e7c6a73bc77ace36c7e971c008c348469aea85bfe13c59273dacb92fe998623324571b6c8f113a67d7d369b593e2aae5705099af8bcef1721ec152e15f9842f8a55c7136cd884106dc1c857ee5ed894b2e3f54ec8e95291f19c85499005723fab2fe3200478aebfb1feb4e81c68bee621bde3cdeb23b081676ea45c1937e0d209364e534c6bd412ee8694b27fe64e0118156dbeebe6597407d4eafc0e1b408528fb8123912c94a877fbd04d854216740a6ceb9827cbddd83761d19feb2a21d78ef1f4177f3570fef2b1101fd926a8bd7d36f5c04b2ebe2c8a87e0ce3cdef537bfcc3fb56310f964c358acbfc7ee655bf50614eda2997aef85c9a0fd7fc44b341fbccc73e9398e988e552e93fe13eccde65cb176ea9684af9da98aa42054943b337622e97e39b10898391e32c821af91d5ad53d26fa06bdb56aa1658cb1a50db9f7abb7c9e7bf1139576e422d2b20e26476a94a6ce31a0f1254ddc91dc801193c82d2ea3c68adf67ea9128ca9a2fb919c036cc6a72d4c48fadf735d5d12046d2221fd4f582d0cc742c0a54c08b0510eab4749373ea0437154548ca9b5575713551c556f8600858a6ce54e07b11dcb5f7b8b66279b04a89208fb4f368b5ea113bbbb01d12ca7c049e46035470eb1108ef316eb1d252122b1fd1ce58b48f08b733e4629fdb4eb640b927983938634c9a3fa3201a244bf5ad81dff753155d5bd3dc504f77c849419d95e786074816d9da47a25d03d60a5f70e4fec28ae18d5de79373e91d5066a89ba30a4f3716725359b5a387f76e19ca25c7b2a268cfbb7962d7e3c1f90a0355ab6f0466512a124388f82b336d5306c03c88902965265458f638146ca36bcbc34d586a6dddf95324f89d9de1fe3b3ddc15d62bca089be456e2228a4b94ec1c8c020da0c8461ac17229049005f27d3b68520eca06eb86d80de735b9d16601721a59ed4c0821f4e9a58acba632129f8c1f61b10f52567dcbe855c027a06f4268f8c575d09fea1e48599e5124d8b728bc4bd55b705f01f72c70be80584b39355da1d545b312070d49e8f443a07c589f28881d6c716f5669762191c4c0045c40ec9ff9cb87e121388aee0d01ad9f8f697d5eba72a715cc7b3595702c039e410b925db375a39f912667c34929a0a4c42e073a3cfc65e4ec72e726ca14776b6febcb6582e2ba900f6d8d23490a3e4e8f4372950568524f3f071760101cafee61680441f8811184c46457687d41badf59403c09a454d0d72c9e22cbd2b321a9ae06d97d74df6cc088a1531d666ecae9aabac012ba3085ff3daea5e49266512fbe5ec762986c10e5a4bafcbc94cfc2f00c09ab1a8789d63a0acf2d24cfa4d2e30ac63abbd3a5a266a0f7d0c079035784e5b349bbcccf4619fc660516fb0d1b661bd3bfc3a71a95c6161e6bc393a7dd0ad04e4860da8f5a118b09da35a4fd8f1b8a1dd32493395f867c652a20650be81454412394313886a34f31290b4df4c285adfaf1591890841a3c8298717dcdfd13da2247d071695061a1626e0256914a372ff1b6cbb7aea803eeed43313e5c809bea7831a01b804bbf4a1405a57f318aa268a88016e0f21fe60c0b96ea3746170efd997d8d801bdd2e71dcac8ef8840859e075e9a534f96002fc741006f909250f9c3c87f34f9a8921d112bf0982d747b03fe0400114231d1d68ad4b01e4143ef03ea7fd6bfa9ae45be05cb9af8ec9cd57df7e4fb51f0dbb87b92db47598f5c9736d822a61e18b531f1811290b7cca0dc337b6552bb627afc4765bc8ec783c58eba141bb7fc4ea6a0df0e68997ed668d54e11efcff69ff7e6618de14a1124661cb626d0d1ff546ad8b033357cf510dc0bf542ea38abaf3bbef192b046de7b278b5297abbccf31e7228b79e102c384e5c55195be56819b2dcc21fa9349d78ef121b8ed123f15ed07c59867d4f3903a694a8a92d4f1216ab457174ff11aa467aa280db36f247991b10b01857617063851e3c7c192d13224baa9fb183282ec0e3ce67c6e2931a224cd3aeb5b3035cb8886d830ab61bd5dd22608f6debd4957898da42aa8a82f39ae429b807268178732ef71efd7aa7e4a7ae0bd3028fc378fe287a942e854e5e538fa76e8518783e33c73f629cdd3dca027cf0fd07e56133921113feab7951d4fc8dc134b80f64286b0fcae0916469f08dedd48fe6833a7004c12ac4a9cd39d1f69d0b9d0881c1c1a9571e2b439698f29a9f1afe46ffbb9896d74398c1f762efc20beb19ff060d844f4b9da55bea674ac8ff38ba71a17127f8b1e2ed5c8e6988ef78e44e1402c40aed4bede122e64153899cc2572f2ed7a88aff8d350208ba37ef528b7be01e71a003d673613100a3b76cd62c56b7ee6b94ce0ea6f22aece17742275555dbaf82fe1389c2981ec02ae0d359eb2ba466a967526dc4c76fa15bb17875b65e7f3c947facb4500844bb336a6d9683688d2e2daa889b6b0728dc958102bc32e8334c12af3014b0443b3859be9bfa997fdabb44d8f1260e43eee53b6061796f95a06489f73df947ae7afe0a47df1471e40584ab7d2c8c23003a5199da251ba0e94f0c66f226f09ad97c42c1b0b772c137a610be019b4c5dbe93b85d58ce319b5587ba362aab892e47c7cd1c63a573ebed24f5e900bdc4f2f1737fe256bd49a36ce2d4840b0c21866be5e376db39b676671a8ad8e504a4972b621eb57e82d24d81f911bd1df96817c84f2c7da1e4b8e557ef75fa391069ceded82b631aaf5a1e5732c85dddc3bb76ef6c1e7d4226d9bd122c1dc9776162ee8e5e1c67c5a34f8a3f188ef2b52b9a0843e520022670b752385908b32a684e9abc5c683ff9ff3115bc22cbf84e7192606812d7b8d962c0693ceebd63bca58b47db6b955842239d4540da05fb04362303beadbbedd57d93568265b247c899876a8e043a4d18a0e29d8fb6d35770f9ca56c9ee333da5119eaecb467debb8c4e19726aebd8b0807af82db41aaba1f3cf6fe1c8cd414b2df40d65a1976ac17a8184247d3a59e6ac86299c5f2f27f5960475e28e224ffa9272871c14733156fc3a9f0540b7903eb539a46d2534133ca1439fb71869c7ad299c3e5936849b41ba80525fdceae37f449c51e82db2d63ebb92d5a78f2a102d9a791b642e51114c5b5b8578785bbb7000b51855a031d8c38dfbfffb1bee92428c1106842562f93d88d3209a3d9381db928ee2fba5378193bf8505fce33bb5b3a76de8024340bcdde8f10b0b53199b86a12f9523654e3975f838cfef109ce14a9494a726af72c3f424bc2f13e1757339d69e1b1507fd6833e01d461fc9967ecdfb8e2d389280754ae33d72fc0f306fbed9e55a19b4cd7693203b50d337b3f4058364608013f339a6ce7abd0c07d1f9dc510c3c779444cb5e609bd652827aabbad51d2a465b5279d28c7df98deee0785ae619a876ceeccf5b4743c1e5d1730cb499c172d191259c94c64e0cc5efe554014116855f8b4deb547e3df7d44c277dba7659206adef50ab524f3e0fd2f69f4990a0abd7af2ed850fad9162671d1d679614ec1b596a482afd4d765b7cd9f4c2eae8fe370f2c5607567b45e9e669dd330e1c824de65ca96633eade678c130c25bb84f9db666010d7ef906373985bf047eb36239d59dd9d2521a234eb73053b85d5860391c7b7a15fa295f2eac618dd0df409d8f3f914aed08d1e7fce7ad9084b01952441795993053932fb35b8cb2cebf33ea8370f2a63cd4006c7fae9b4fbdd055965d3c56d6e337a0e853cb69a664bae7c9c51e34644850201155608c09da4a97ccd2ff31bb8502fd298e708ad1294ef6cbb2abd91da609ab770ca1e257508b7a3653e4b8dfbc41e253c1ef52db82e7cb60da8e533acc7d2d1e03e750b0c72f57834e614e8bef610b07ac9c642e1811d019ab4a253432070f76d9a5399e8482da3421098578a50cc1b59d0c41314f59cf56b373e1925d43dd020c601f793f325cc97a51d00e6391c0de21b34c9d9f2c03b8717ffaedc4c010500abc74e95dca69a3c8bec0b5a19c62e1c92618bb8e0507bf63e2e3af0ef843d152fecc6746a77b538ac4da16e5993270f1e92823a27155cc19212e4e7248d21683bba86ba0462c693ee87eaab5f4ba0c3a50ed6e62fd787effdf5d54b55e65900b877b7ee142d75553be40d9894b64041101eae44605da488661d35a3e9558ce68c6c809901a169877aaa32be609bb090480a32dd23715a95b4d32b7848a36220a1e10a4233864b31932283a32cc498b8341a8c38ded9511cd15fdf51da9885b8dd1e7c7112a4c2596d9425d15ef79ec2bb96e1defb5e3228a4097ab606fb9ab52a6affaf06c27709f24843d060fd6db5c7c55c55e0c8a5be1519242f37964c206f0fbb8277aa114809850326989eab993ff02227f7df51e80cd60445d22f40009453d775cd22391f9a958d5d70a101760a5f5edba66bdfad718a437f408f215d807f7c0d70f397948ebe0afd4ed01655125a36fa5733f6162c7b0866e97e95401ddad1d4c8e5d2b2cb49a28c9cf1933d3e29d20b71003f2926f17c8035c344b052aeff513ebf937e3a7e7c94c1cd1f3776135b965c9a62f04536c7588d28d8b507412d0c384b8102c3a4c19c252c634aa261f9247fc90673729110735773f65724dd848e1f4f45454f04982d30d6067eab5cd33c4455d3b996497f5bfc6d489f92c82c5e5c94864fc4e72ace4a92b1db77491266120573ca97a73e97e5de7694374a4c0455e2ed290c939f07db290c6aef73dd2a52a28bae5ff372af798e283efcad0c09740022da0d511e604b64be32fb215d116af4c66dd475462b1f4405a6c93795f420b8cc6ab168cf620209703b849abaa2c3c3c910e074e09441cab5d387320f4dc0d093e2de22db9469e0c98e70271b66c5d73f9f6a3a687246e6e1cd1ce4a29dbe1121497ec56a7ee6b37232a910a8e3d8f8ce20590d074b9661319d7296746a81431ba7789aa3a9e248122f159d8ba365ed1e9d9736e4a999024c4a708fb03f712e2c04b4e9af9cc668528e9e16e92ed27fd81d0bfc2913b793dbdcfd197ca1f699fa691afab6dff8dbda562bc2ed0a8976a4a99da9fb1258da855c037a001a784e2ddd9214dffbe269518fa3eabcc1f09a29483584842de4a1f3d169fb66315f136e6904805277eada6042f0d681db71b21002bbd4ececc3aecc4317e4d36f13b16514588738db7af5ae76f9ce62de738800df17e25bd75dc9b9bbf47d715afcf0b9e6766fb9b0f983e433a61a87545ee2a2e832f6f8771abc623fea0d687c839712e74680fc7dcf4ca981df0119c499899e24f257eb53634e6edae0dee05d0e701a20b1042aca6318a6698ccc40b78e459b9c404f5df39e468691bf360083074176989d416a201faf82f295c423b4a4dd4156052476e0356d516e6d5ef078d4d3d157f480e5056ad9e625e22eeb43431b3a5c271f5da18e8b7878d39ed9c4dfeed1669c09c204ac5d7a085c55bfecd3c52bb690883bbe1368a2b7d93de3ed8e591ecc7f242aa24e04e5a6e980c838bca4bf6a26a737c02acb78346885357d4bde619183194569b696d00472f62eae67809c82d3c37a2e3d7da1f666bcf8fc7d4342be922f3ae04ddbe22ce00018d73a216a057d262b90b347c605bd2b53f08b51685a93b0328f7b9ac42519e6ae399e4ed2fc0e16736ff4ef8f6a531a6fe3dfd07c6d6de254ffa99d1df707f01a5efcd17b6e6ddc7a51683da32c12d1735ce08825000a0ec9b73daa96ab916681ceba700f6382c067c177fbab53e09788e4f6410c19517bb83fa18ad7479e8f0e0f42f433e43509624489ef4ee8a7b6d60289c2d9c32a734a203b0587d618b4e6abfa2491f76e01956406e235f24e74843e01d433037d3ca7e175e24e5de61d342a4ccad1a715ee26a8569d0879bd1abb20c73fc2e3321ff60ab6ebd6e6f0121e129fac9bf912193d98e1e56e86dcefa23141cb2f6a3264602465e6c4781edbcced5a9495f74dca03bd0f850f1f933d62f8d83f22a063530cb6ec9cc31c58bf6742e7486aa8af499f9e4943944fca4a22fdf465428eae342248b2d579d98607179aad90c0141edd3ac4f5e9a51b69600bc9fe03383bfb4ecc621f588eb790fc037c1436404483cffcb57d3de98d58c545e35ce2abb033ea308d9befabbe5ee354708400913fc7670cfb470809ac7fc1f7d378ca44f33c5076508e6078f7d80731fe65b85b0dd0ed931ebd11ac80c69e4922b983ab0e00c8c73460749c69e7afc3af1f2448b788a9b8a445227b1216a2645786d48708669a4bc079f3c01c7122320a1a0dfe44d6e3a41749011e69551770fa498681ea550d297c42a58b195fa9a598bf3a25bca1e27efe30773c8d6d439494696140bbb76a8af02152a6679a8c44df74756628d3ef6fe2624c7d87446ff9ac4e2d6d8373f995a57fc1b80e09133869a284698f53529f4a47488b5ec4e2c7ca60b2af4b71027322c5bb6a179386a9beb230d5f9095335be47330b1ad4e6257607b8af1a99cd4bef59086489222cbe640a41526edd3a5ac6cad4a8c45bc13b39ab0614f8d3a24695a5704d6c9d4ea0e5147f8af7b74e35eb38f4086343bc329ab46587ed07c88c9b0fbbcdc9eb3477c937b2229b7fd8efb4f95bd3ff731f32228a9db0021d88448901b08ea7f6266a96daa1c5631d20afaa75d1b2a1d33262579576363efd2a96e8e218350ea56ca1d667151955796e9e53141e4c4f4b3debc33db8c2aa8ff6ab3e1abb6d06e04d451045d6c67c7c0ae43a3f094b13c387f5eeeb2afb4cbc33ab161161dc988f127ecddcac75dd0c3ba8e45c5c54f52359a75f05958a2e6a2bbef52ed22acb9b047394945fce82124b12dbd5dd12fc53fb299ef5c1165882240a65dbd500a8ea684dedd5b6787277804ba610552a303bb5a433217648d0ed67baed8034063565893360077a1cb521237bcd778b4799c4cf40a7f37cc8a0913cf41683b5e37cf4ae4e7692736154fa7bc9d870490f40d4902480d19a3dd058eae0664d213f85801ec6b6de69f056e9d25e5065552a2c54417949259a4f6629bba867463fc456ef22c2a9532470c3d56e62bdbd7841652d2a66875642a76cebf571a1d6d918f92b026ad55a6b8aa3a898fca5e07afcf4459314c4cc5bede988e1669b66b5e3761a06e7c45908e6ff49985492362302e086c4aa87efacc9e6e7c7acdd5c9dced3a67661febac12bdea0b6930b273bfc31d704515927ffe16af0ef6eef2256801ab699ff09e35f0149953ae1991b8991f01f9d31c1dc1ae07d8ba0d25a1eaba25331b8ea6f3eaa1247106b65c27ad66a2448d5714776c66c27a02400a5ba63dc84011b4ab8316903e0f9934811acea2ed539f53a735dcb2d7117c121585d45d5b70d0a466a26667f1c38f8b10b198d860bda44b3cef9f1cd62d8c05dfb6e1b36f33dcd060f84672c04b5e2c93a29871acf130c05dfb300f103cc69db1757aba64179abb32eb335b29f599bb825459f9128cc93572ef1bf435ad903c4337fbecea8a9ee75501b98baf60a6aa554d39f941fed23d2441cf76b72e8d83fd84e1b5630b5dc73fc2457ec0fb196b8503d4dcabb5e029da89d701150e22e758d2c8ce5e185bed6ba363ceff437681ba0e971dc040778e2e2daf2dcfead4e8eda81d723c402dbc512b90d6cad8228f3cc41d57102d1cfc67b3d4574833380b147b5c5bae0127d698d15930a407c1e6b5dab4032bea24d73fa2d3082e75a0b065d301e4f3d9eeaeab2b29672b70c91a8da9179c63f643c11e7127dae320c39b6a35baa8de48f6b6f0af8de4b1919cbd5cb5a49d78dfde2c7cb53f29f6d3050e9a29c3019dccb48201c50323e6f8d1218b86e780ab15788be2d5a58fea0ae99c6e05c7a9e2d3cc92670205bf3c04faf992a35ce09b258751e958e7672d16e5c76e7044ec2e0c936a98ed122111447ea81a917137c98eaf30e8b5716a40a57e1213ffa752dfc59d6d0ffcc4d41745d0af8bb7c0e0a6cf448b6981dfe3b52536fed6ea8b78889d6f2c44a78a42ae6795925eacc885c355dbd3f4348f7e0b24a4f05fe74db7b9027d2adf73cf17575831d31bd6f491afb0f9ad11540c93b3022ca8f77c8abad1734beb28e82fac926639f44bccd19ebc6f12793956e3cf3d7c426b45f0bedc729e5fefb98b188cf03012784704ec0779febacae4b3818b1ac18ab9b40a56a70cb22d9b19d30632e1345fc1c605b05678de5704abf07241cb906a36da1feea5107d399fc2369538f5e186832155ab16399c7bc8d7a4429dd057754510b7e3512e4e08403b4c3209aed60b1ef15b58c12ca79d8a20355ef9b98510770058d125a6b31e3efd7a691f6c707207aead25e1d28e40cafe2a43eff7b7e05f117934ad1a2aefde7157a704cf4f3fdfc1b1bef2bbbeea0dda097deb1b5e493fdc9f8a52093401c14f4a883437d0e909c31f607e58c80db53c49896584e6dfcbca424ebef46cd869efe969384693e2083b3cd6df3a283063ad60e309c4f0086552f7fe4e5c13e84acbbad67b6c06df7d82907eafc05dd69b95e617227bf847bf1f27258ab0e7c5e66b255c9828b825bc41c0c46a8be784cf9e5f8259ea6e321b776630ee9356e5cf56bf77f90d165956f134449a1d43af721f23d11ac0c04c1d042bbcf463cfbc6816ef952879afeed009617ba8c4f0db15a0e97fdf7facfa263dfe3636a2d0de33144c50a10ee35aa9f2ded631438d8c4ccc06eb227772c0e99d34192fe0f8bfc2e74c16fd2d6f21676612e0adf9683769e902bf9e58c034b9aa83f24aaeb5c59a086574876591d77aab942789571f510f9063498d9403ca28de544e015c86a42ae02ee5fa3809e1666be9175dfd118d904abf257aa9bbf5b9a13b78fe8ae9cff8071ed7a02525d3bd0f684c965bfd31be806cd0000a574beebb902f9caa6dad73f5bbe623ad7422e10eb813bce420e1ccca02e5985674413a55f8ce664b60c141346c8dff41736364f25f194c263b126d9ff7b2cdfe815a1f38ebd1e5ee91afc23bc73b9d81b1f9cb52b3d9ceb29a57f36ad1e3fb630d1b1fbccfd685f44edd8984427b78deae7a96984cb1bee9cd06f0d327d5ab3485e8be5a4b48e0fd16bef99674ca2bc8c74a294bb05d976c41b40831402477d37a677da9b4a5617977d8b4fab4a420c0ab0d25d55529d29aa6e38c2dd13cdbd058fbd023b27891f9e0cf2e29b8a5f266b8180eddc1931af55b2a1f2141ab31bbb03a4840bb4efceeffe6d79bc72c1b1b7d1f36bd8c45bb1cdcdc13a427ec23e60e9758893574fcd913d443c986b2f56f6877400cfbae4d71ba9e1c3eea7c2cffc2879385c7972c38cafbf54b6de73bd318b4bd44b6394c8462d48b5a0fd7b7598aaf5baed832159e93e26e99e31538d70c5c00ed327322d56404037e1e8b4d93a563436cedb2237afd1c022d9ce986fb91d1bd7f06e88ad54cc0f7137d037a3ed147dd588eb3d04e64fd628ee1b0a0a167ba35628a05cf147b8fe8c2d1dca7ab6cc17bea21a3c6996a2b023658270078ec7a1b4062577a037ec55b0483736069f664b1ba4cfe50dc8b1963ac769930d29e95d180f65a1632c4f5c04128642f0afcb6111177402998464d0959a3a3cc5f0c91fabcdc9a1e22fcb5bb11273b8e0eee1a1ca827059b4d0a3a55d695c31d6ea4f2f94c7b741c4474799ded0645e7d6591526e6d2bb307b6565fbab9373bea2064d4fc859847b27dac5fb4d5c2fe701bc4be24600dd7393d6544d3143321a698ee580b90d57c53d8e0f55ba8f65e6018602b15e47e8ff36db89dd101b8adb45cd601e86fd4a85060cca3fad16647f6654ee26980e6a1dd4f38b1db092ea5bc740518bcaaff93501d58b1bad97c80da09772b47bdadd69eeacbca1ab2fdd265e662e4aecabd04fc186d66c2479fd3b30cc24dd7223bf6df475a2eb6878dfc58bcd4afe75675c5fc58f10b3ba336062a7716924337f8c9476cce26d60d47ea3dfe45bf8fd6919cf7e5cee84c76abe2e6515d40b0844d167f630dfaa2ce9166bbb29c5ecdd2785295c8ea451e46652f90a27ea04892a0a72e3401f24351d4367ae2c1d2c9d392af7f082f6ad89eccb5cf7361fa33e85a42fde59056e11e792323959b63ac60477a5dad839ea303483b4ccbee96990ee4b09480a46da3bee6f55ed4145b9e02ff7dd6c0d02ba7ff418baeb20dbba18da4b99a0c2480b2b88574d2a61300c640227e9347fd570b191f6b9e30a6b373ec0424b892f8d73694bd682813819c4da218463c4df26bf8da4aa4c44ea1c438b36bbb951908ba56dbf598072344755ab0499d78d797ae95c82bfec713e637186b4144daa93c713a1497cd18df45d316f31e4aefefd46a0b6d284050885d543a9bed882e4a7c430bc70acf034e6c00a9f2fd174a9c91e58151aa3406b3ef62c7cbd94f3a05b07af17cb6666f78a2433a354fca31e7b66920fa1aa0929e82abe6836c61a5e1c05c13bc035a0466cde3f1457d2c4bd62b3c0ff2de4d9b51ff75c04c0e8518e794329a0e59726b1fd629f7a9ed054174d8a677c16003cad24f097dad27853b1e1443adfb20774caba65d74e9091dbac6a5f180ed0689c72b58af442f1f27b58e29d9750ac0324e1324c78f8e383b5fd67b6351003aa9396404ae3d585f342f3fb93a1ac3a1681a5e37ae711fe129d8ab404613826329c8833a5091b34d73503aadafc3ae2be45894c95c42246eadcc4ddee0edf9e8d21d92e2db68c552aec186ee809854c76dafbec11729264690e4c53b7a08ef336ce098e398e918d7ab292b63f5c23cdbcac7e306284eacd199c71a415b8cebabbfb99e27cf3d3342333132f35669eed1c4490b82d7da3e77921d54d6cda076b8924eab95c88b9efc0e81a288eab4f30f23dd3e1c6bf564a041907ce4166c17c2af4ac715cafce26e04c08309faccd2ffaf2a85bc2ec6a7b470c698527f195631dc53fa8f1eb886ffdd96dd5dced913072fd9e74a66768e1be567b30850cfbb6ee2114deb0de6121660adb96eae023f916d916daf5c2ca23d691cd2eed1b5cfdf892ec711ddaf0e1d57aa1e23e26fdd042ffb1ed158116983c38dffec4af419ed984f71ead63a037b88381564b14975c83ebf0299a14d6d53bd6141ea02b32100d91e515c42b07998bbfda51965b88f45628421ef810736161d40a1d0421b7081124372506738f6dcbaa1d62a44e3b4e362f284bc3e684a35acd4258652548dd60c66d9af8ffb04af4ccdb08097f36b0a08b232e62197331632c2d7f47a8500698f2e905f00202a7938293c01a50f3d221a6c335772bc792377b5bf0302d752a163439e4a02d0f1a2475c8196b860b19361c790f57901a2c34253e49931710ae54f4e0b56df33df92410f8728160e4fc5a56c50aa7e8c385d5c444e9f507bb09f1cf7df6ddd707eb1eee9579d08409f20ae037b5dc885c35b8e3105fea71fcd3692e5237646b056681593f8dfd61e2a0d43331af6a015c9249ec2129c7e83e81279c1df59601aed1d80b472d4c8d177f22ea4335c4e64d420549e7c631dcf899b993219fe74d7cd39f5f5ce6626810e3835ffd1791a996bb77a6e4b3acb2c3839bae1db4dc90e7e253dfe137c3755784821ecf9344bdc1751d6d98708d2c27e54a3752c2ea9e88648207649fd44763c88b912b5752b575e56328839b778b8e2541d9715895a8d6f09650579d3950ce262c71a0c24002fcb2e5422692e0636eda1f0ef9c462524c1d2d654aae5723ef33d11ab072a138fe34104501d55c36625a3e424cc4d52d5020a390be41b2334f681616eac6dac9d30f80cba5f14f96e14c2c0dfaa8629cabc1857d22f5def1773957d0b05d6138139b933073653ee7642674ec740d9f2287666f84f9493200ff2e32d291a4d8f6486ed40e0abfaeca736f85485952ff41ab95be32d1aa5fc43fcd23b70f1bb696ea0fdfcecc4f1392878df9bc0b16e78c60c5fe212ca7bccdc18ca6d8a9406eac60e4f2fd48b201d229082eb219d80c654f7dabba7aafed701cf338d1c0b185795584da03f0870e2bd074b0c50604b26ed02343793c51467dba87661d15cd7fb02075e19d642c7ce2063a1c5f402b9e0b9b6d61e7e20a6c2922bf9b24e912d1d36a2e96041410f2b742febdfb58cb13bdf9a263812c59d314de025473eb2010458b1583f270d2e3fe0f093233d051a8087378d4df4bbdffc345062ea47c53af991bc127b30af0e538d3000563175def8db137424cf0a566b7002196111d4c244094c7fdf052e95aea3769a433ce4e4e800b8418649bbe8c6297eb07545e6802de7e807324e92ad9a494bc9b1045b149b21ae5e3b0ad47f54864d91ee8b045cfc5419123bb2e33d5da736f56731e15658647b310bbb60025eb0f622948a353ef8776608c3da2a2c40e6bf862e6c7f9266f1a924be0464592ccf01cd2feb810e6a795751926e6f648b2e6ee4ce5d3cb00ef1c09d1b8cea6c060af7f98655f0b49a8174557015b8cc86a6cc770fab2098988c4606ebfcf92334895f0d62718b19d0b8467d25770f4c797760a8b9fe33334ce9c5c6f6fb9a66fd75c1738be759235445542f783d7bccabc8b2dd93007e677131c4450432d41dabf6a592c95e62bb6d5126d4330f053465c24b7f6657081d518bccebdd49af30843394d2e47fafca650445d51c94b36cef8db2f7faabd93e3220642048e73387d155169ba3f1473682853898fc758f5d91506fac17a5fab05d18144c0fb4690ad983b155cf5c33e90dfd87879a5aa1ed93340b0585ec725d1a9a64d7f85a58a2e6e6ef68306a79c94d93bb09c0e9f0053c600d6c0b29492bb1cedd29cc7e08353ea6573d8ec123c08c705b8534cd848ed5fcfd487304880469dd06aa52cb82ac2aea713ab10938b510bbef65bfac656ea6326400832436cf8bef67c354e6cdf0f2dac6c861ebc18f239d0010292f9c8ff728c9fe04325b745f2b89da987af1e8de9fdd50650ec5380b3e15ee3afd2fd71006b4a9bdd500da2dbaf359e82df77b36613e38861c4c9710c5b667babf293038f5ad6978b62beb3dc42da60aa7e693414772e98cba5f947c5b6be3701c8f81b91d3da6fb7de78ed670c02bc691c617487a00cc3f9204179527bdca25bd6bb2d9a5ebc80fd139ab42e6334ee693a0ee93227048664c4508a5523384a149c4aae1b540377c5a2b2bc74f0e7930547b026a654bc4cb902a4ff2035679ac69a3531977c35c0ac1c4f4aed3da136e7d5f3a156e18aa3404bad5c563ac120ec50f94c811fc9d81ae0cef3f991e8466b5547edb635f616a53fd80659abfb58e04105537ab7363a8c80c04c1ca6233e1a563b6066da9513523fb391ccf17cbf6ceae7eaf6eb11748b8cb1c7e8d2f8aa6f593cadcb37ce25c1dbde9302a3abd0ccdf2f876813d1f2925511dbc0b0bf07f4ceda3a65e637ca9e84a76ead4b2f199a6e3a9d40d9fe513b8a7f1c46b81cd32527727ab95e387e22caaca92f507d164048a7a133a60cfce19d47eded6168a88b03b3f3581866bd093e6cb70b4bfc4378ded537a2f074721efe0ae5174548d490e41d48a49d3903bc30563cb3a6431d8e9161d50151cb4d6e3d467676cc23f3d138fccf317525feb640f79edaf7d8210c10dbede13277eb39cb79366e7e8082b682f11b8108c3ea71f0df41c3a931ea7bdd8206c52b10c81c39119970c4f51ddb52989215e0896389c06bea1032d6d6584812941fa41c807ff6be142047e8019a1831e76294ed0678202bec433d3d712bf10c3a73260190ff94cd3aff6fdffa8 -MD = fc85c2a27bac262772a53f8eaa19b3df653c10474adc10497637f246b32909b8b4c97bb19fb209bbbd217ec440e2953ddece86dd54f3000b00b37ff34a61d2e5 - -Len = 88936 -Msg = 8595ad7ef34cc6b60238f58a9a72827a4b199a47e29a8c583a2e385d55a4c332ab609006c2a46cbcff0e0991bc62ae009b8a2ce319db14da669a27f074bf0e7c4df84c46abf170ebc2d38f83610bf180394c0bd97cd7ad69abfa7d92a9d6a4251366c786d4bd390bf38f6fa6b0f3b4c4d0671d743515c0ccb15521881c72edf5a4b1eb0e658f2fe43a4b9143d2a45d9206e44cfb691db3cc21b3fb1df61a51b4a9e19e2587f0ba3d3d0edda1eea656b383ca7fb54378f031a31cf3985f573829c9ffca14616742e0a7e03b0a2d7f05eff0219eebe8adddc3de99f1407eb00a1dad1256241d7c2f931ec993c4b7b9d40df5f290e68344e4497b31dd5f7cad2f58fd222a9ae0b7e91f4ad2cd18b3db2ad739443feb3ac66c8d21ed9f3b80d610a260382ec1d5a1d84cd502d14e496e6e13651f924535badc5579d31f1cb3b413c37e5a4ae021c165e1646287aea3f90a8a208b713a9da89e6a2bee464c3dcea1820093663eef9ff6a8a2f8d780e60465041391c4149a181994de43fa1245ac23a88ee86a2465c4f56734ceaa0b3d18e749e63873195393b59a3adc24b5f3d7fffdcf633edaabb7c8e7c5ece698cebcf82040896792f1a0da46e9c0ad7e70d69f496c0bcaa8ea00d9f0fb58756fc1780052c98a86c69bc8f05e90f77bb5e43169540ce8f7d64a288e4a7e1c3dd83fd467a82a45b9ff7a925fabda8a78a27771c7e65803ababf2b651bcf740281b705995e70bc2e983b68690f56c808a8c4f1d20c6f863cf700b32890f0eca1d7f7b8ef3da1308fc9c762ce904f1e19bbd97bddbbd93104c6ebc259d0b6ac4034d88fbe748eb1fdc8fe20dd39f0fb5927b75da6293d11308ea2e16f778b435c4cec129daf83b0f6fa724b0b7906e05570f11fb1c105c73ed2f888dfe1e932647474c9f35b3aae09f2b619dfb9db7d8d2c194a871fbd938e284f3121ac5b09e740351e55e41e09b5262c45d098f9237ebd82669c91ef36bce30972eb334b2a53349f984bf6a864872957277472da6298a9eeec78c3f50139b7c9b68313442436c606b03bef644ede60d96731f419cb6975915492227983830b02849fd8d08810791d0eac5acc194960f56daf8911be6fa52c278f49e74e2751465587d07ab66ec2450c23b55a6446ae6da3339e7ccc29bd11eda686c8c1a52ef7b1d1a69d4fb0461121288b99a064ad94b064c095751621d51f9e75887e7af8b91203c7d2a47358f3f6213a046e11e2fd1dc98bf639c3880825dda2b0d52742ed0ea4c09565268f8fe3b46d251ddce31933b85d398a90340da8ca7adc86289216002b0d6ff2486e27823881664024227baae7b0ba082ada68010b8a65d1fd6ac68f0d2accec67596d5a44236275963596dbae231202f1cfa9c7173de77914416103d19536b3f1f5c3c46daf841e9170ed5e9220bc3b63a845835421dbcc1b9a98270ec927d976a7bd590b9255bba478f1ac2a3622e21ed8bdae68c2ad4b61eabe311b532acd6403dc90a47851cd5dc2563cdcefd0c781f594a0bb8ce68785c655ea8dbfca20588e8403cecdf2d41bc16d89309a603c1b734d12d30d12010591f18bec6b5042c2ac561af11fc3506d1aaa39bbd23bb069d6597d35bfba385ff213cdadd287d510d1c55ea1ca5dd2d012be96d533dde4eb934c385a1139adf35b2f0858a1cb37e1b35447577a0cdbd36dfd59231bc11a2f3e87dcc6ae3ac27e21b5c4635584eba3b5755d988b5acbe57108c91c168fe0933cbef2e1e318264f0a5aaa544a5f70e55ccb09db9ae23394c0439f26a094d8b61233e3525c6c39e4695ff2a20cb568052da7e497152d934fd03023e9366a63065399569e86a18ddcc36865e3192121b18cae766176877ba52570ffca648af0127551a51cde4292a6acf64c8dfc2d3e490e4127b15b9a4d0334789b40a7713058fbff5753dfe9d8c08a7c4f1932243e5a26f2810d20d0980881a98ef27bb784486be4f5da17e1d0c8e07cc5fb37b082537b550adb62b4dd13919633365dc87c7f29b50925f2d50b1e437a49ca995caac35fcb3db29dd19cc2e8c130b2ca1e795bd9f1f9be1d3df83f37f7530db383283868d782193e915774fbbcffce4d340b6cd0fe5008d38718aa12767a1b32ce7b110b0c8085c18e8dc85edc090f53a3c330c36c94acd23afcfd776a1799738923ebdaccb17ec323b03b66b0e4ec79e8113605bf400085e40597eb54c3ff126db3373cba8d6acffb5f2cb7ee0bec2c7b75eb3c58daaa5afce307c2d8f7c28bc69971c5388cd0247ffb3ad6c5e694f7d871decbdbdd00edffe5dbb2393b7a4c3e5729f8d928557d1c04e427db2d6d4879957f38bacfbaab67ae721e27f78cd02f6cce4c1ef851466a1c974fb018dbbae9414b07781b2e1fbead698b17c480b4345aed337c6559fce4a2e2a2c76176aba205c0bc9657e1b78f53307d7b2adc64c7a1f5436407e62d162854c5a36fb4b73e638ecc87fe6c0f34405559d483166e63c284f078587c33692d4c1cb6cc1c4a08eaf3bbdf87238357f546c4b675c53d933d0acf3bcf82cc7812573c73ef23f0bc0cae0f0f7aaec064d28332936b5f5ed081f53400e5a044ad77f4998d415237a2390c3a9a517422d568a927edec4b5ea631d2c36a233b3883eeb2b8557b2d8b65f09cc302940a374438171948611f997ebd3201fa10ea1495c6f01d5ef52c6871d3de4ccacad78a1bc16b8b157252abd4948154132703655d916b3d1c37c55b40535f1c756e7277d68504f1e7987b1242584f4e67ee3da735ee52ac1fcb8ed07bef8dc674e751ad0f0371f2313bff4942590a654aceef56d93e64cedc18ef646f18e8ef5bddfb762fbd30e074d565dd5f47312d3e51aef091f20029c3b87d83a4500eeb8caae68fa322d051450d353ae38351fad51ed3010ab9b3517922afbab6355e3fa9e6994623d4ced9044be3de99adfb72817f12049de60cba7edffc761f29557016098a260c338acc451a0854cc178c18e60ae277e6176ae92748fa5239bc8311739c4fcbd6cfa2cf89dff92a05608242553abae75dbe5c4205161fbba06f7598251740940e29953745366ccac0098ca3619701bf7f5b6f79ba9fe32efda2ab68acf3031b3ca1d0b7f995a9b3a682e9a08d985d8cc57f02d49a7ecb388bf673279dc80dcdccf8f3b629765671035d57ce5bc734bbca89b507470b5e54d5fb8b4959fed728597f6cb66770e98f710925813eac1de8f90c047622fe02f085f24252841fe5b74ca5aa2d05edd96b7a16f16db8af7f80cb965fa5b0af6fb7f6ab36b78e93c007211c3aaeb765bca188f739f85c49d00fdc89551a9297eb07b266e6fcec02dc746143acafee70f9ae283a6d959c23c602868553493b500b5c43b5c1971ee5b19ba7ac6ea50d9826fdc2411ad9fa95b7f553faf8b60d6057422528652ab9a4e5f94eb70f22a733ab2d01bbb039ea483c54ef5aa3e59b314545d13f200c2ec8cff9d113fcbd4ddc1c9840fadc49fd83b9ada334e35c675b5bd3c25aa0cff0d9f639d913b5b96409f1ec0a9edd6ea700b66c0a1a459ef4370178931b65faa250ff15c166c8bb8c45a174e918523c7927b91c9e6b3901b46cecb0ade1ce00b5b6213a146db4481907c1ef56e7c927e671483bdaa84c393a6563f88d5e67669d8223035c98f6c3bcd8d9a7ce8db0a56165da564971ddba08a91dccabd1c0b0ec4d6afe14890ec2ca213f3aca8a97598c7df5d855388be881a050a9a3fc486404607fa6b6be7ad9c3898904d56eeba8da42014ea86cd5693803c32be03e8ce48863c789bd99b96d5b6a3db279ab3c17ad2aa3359d9f2890be1bebaffb08fcd6eadfd913b3bb48e1e45bd3b011aff72aa7c05209bf301413668110c25eec26af9e3d3ad11383b7fbe0d6c18a481dab564c8b745787e01655e3abf8ef867888d334f4434e7793750fe353bdbd9754c72efde4a09b71ffbddc98250aa40c0e91e621ada8e83a5b0e926e6afea669e5e9194e746d32280f691bf664ac7c4a4ed06cf6b1d24ad65ae327e4752ae13a617fa9b0b310d7f49fa698a0e374c4db99d2bc26b945c2f613a134d81ab8faa3280954c71951e9722104d71a39ea3a3a700768242c79fd0405b74ddbb42f6f1ed9f4bee42f96e32b13e25bb4d08338e171ecf59173e5657ab1a3d741ea049b27c7e02cba5e66518a18ed9b133fc64d6b1001f8d1282e78d497d565bd24cf1b38a25a329c3e36b109808519b7e029e421cad4c675d1abc3ac38fa7dafece57bdbd9a1751c478e8e33eb375c155a2499b012d402f1d8e3b26c0551838caafe297bde7448bcf2d44593d972e6ae165cda90789e12d7d67ce18e9d992bf5f76f90b3314141f0c8be73a3abc62df4ad29334d7c819a9a32cdcd9e622fbb5e5ab06dfc7276e54a419394ee02bfa69b772010418f2cfeab765cd325e383d6383d770dc202a3973bf5fa35dd4ebdf4e50cb80e07310eb39e29a08e8f9243e1162819fcae7245fc484e68b2ec104f7d63f677992902954de4b54f7c660ede807aa31fb71c31ec78f1c355a8a4d7f2c4ba9ce52e01645f4211c1a01933b9b218c826fec985d1f591cafd57939206365f3b9867593ae6cb2497a758e163137d3e912c4da095c2ffdb2644c4e03e3b88a1894194873ffa776a08fec0618ebc7e56783b72d8a69569b9b632443b03e868200650f3547b2fd286c8307d26111563f4cfdd14de42c9d1b1dd5e4bf07d8d637f352eea2d96e77b1f67e4e58b94ae9c9e0a798a2df4c0b6581e2152ad15aaf903b8340f9efdc1cf786a74a01e83e8a6b6daa96954272a9620fb13eebd66b1a751f218ca152a3f4e364268235b596400d392e538cd7457ef80e6be76cdeb41ecee6545b02ca6c075dd7247e5deafa14978d5a56f0646e9210c8379914b1ddc383d94334841edf5e4e28c9c7df4d110cf1b156272ab294ed93833eda4b168d117d40179f8f18a3009ca03ce425a7843303ed4b4ea08960986788a73579d76c11a263f7248b7e61f53185a65d95bffa8eb6896153bcb07a9a761f9b2f06ba23cadb890c4ce019c046f31f2ebb995f1c27f0ccbfbfe5f189fba68f42525b885a4411fb7e9ef6b169faccb8fd85984d92059a008e1a821235c3e122c325de08b8882a0274a3360e0319a3963a43fa5203309d6bf5eafddc28fb0e1e4730f804e69d10e416e106f737ac5f020e7e263618b1df551db9bd1707ab15ccf5fc11428c8ba9e98de2cf35adb9ea44a1bc86c1788f4a082d0e2a8b7dd9de74f610928c515bdf5b012efa910c4b2ba41a8881bbcbd2c5cb4e72acff308f505e71f4e1a8dd149880994bedd0fd670a6aa1677febbb8337e5a86cab3dc8d455d18f31685ed9bebea27ec312bd27176fdd60e3e81aeea88a9f62848f0beeb1d417784e8e78ed623807d81ed01f336242467c8325100c4ca541a542c0324a2cb67653d3babcc007eef7cee28ebdc8516bed20cf9c95be747013982fa77a8350e137484956f4fbb5c8bc8899b6608fead31a7250b671ac2ad35c64d2aaaa41223ea18137c9e64574ae9d2fcaafd02f3760159a8ddb6b7d75b66630b3328c2eacb5fe23257b5b474d88e1ebfee1d55140fb25c10f744dd95e0177255ba8e6f0f52f94599bd41aa9473ed1e3bcb4379d0c8d940f5ce7dd6aeb9cd86b5172812f0592ad49223ced126bb8b5408c90bdbaa3fca8abfe9ee4d5266fd1291dfa2594e5c88f1b411b9a2ac0dfd529f6dd31510d32aabe7dff29c51763a98748a699c69cb782f881d9ea9a4e9978c7830359095215e16f5f7476e0c55eaaae59e0a76e3249d00869dea50a1dcfe742ba6afd8b7b8f97e72e6491ce38491ac6d80f1534b064bf7281929321366a6bc1247ae77f9087124d71374338780d42f64e9aacbf1df2995f515e7b88a0504a6c479cde8b97e49ccab15454c68e906a6742eb34b881daa4f662a827e7636bcc6cad36a95a9a907b8675258c1f81bcda413c6975c6e40429603bd95de588a13be9deb21192a072f7a84511b3ec5978d9abc47c37924f586fc4645ae62a15dcdd0a6176dedcb2725a59a98090d41eabb0cd638c41c4c9bec04b66928a5f1503fcf8bdecd8dfd778eac02adaec80d93fa8d0a0015c035b1e621cc8e8102c8dfededb7d7ac644176cf1064f888f97921b07dc044450f70c609e6112c6423887b5cbda268a72b27a36b552a1f041c24f27151816bbe549e46cbc3fcd93e62c0a100d1d4283a2d209bf7fcda77bcaa91a4b1cad5ecfe2a1eb2a04e080b6c5af1ff7ebcd58cd1f4ccbed969ee991f1f3fa6f62c364e811a62a83be6cb399a76acd52ac12f1d0b1c7c9a944efef9b7f49f87b3080b16f3801a85d310aeea354041c09991394f31feb09dccfe542ff3d521a57ce0fccca205a6da2a6e3ba3c93261404faf9c9a13361956c80aa6927f0b76aec84963d6391578238651f9ecc2d78be2b17eb193fb3d175439f66ec79631ff0209a3e8da153a3ee09b6e523bbeba1216737120a3668e2af477440545f5d33b3dc572e43eb2de4b9fbe15dcf72934a459ea39626ee1a3d4d6246612740a59bbb09058fe7abe8c3ecf82db12d57ed1a33b9a49ef5cf918a567b5ff1f08404fe108dea8801484ce78ee7e406c2d3c3baf2a18052fe429470d379051734924204bb524e421a2a21f9a7af4c87184fdbd18a3c7fdbc9aded97cb4681fb7dd42756c33e7be4b9b92fa0403aad59b631fe080474eb61de7962a846c91bc652b17a9c303bb897675d3e855f6f51a724e2f40767300a0bc60fbc4b4dea1aa03c91057d0a304c83ab7e154f0f367f97ebcb8575bb58260208d5c227e691c8b0c2dc8ea25a0480cf0d847da755777e51925379fb09d3856e2c353ee51ca66b1f6cfbdeb328a19ca415d73e353b1a97fea1e19740588b6f76ba96f62cf4114c14c254bd577aeee8294cdf20a0c80812c6a0dfa8edb0672e423b60b4a578bab3b84d50f3365ad3ab873904eb91042737d018b474a9194f09fb37fa3ef8af8ae733945747f9cf382fe565af66aff8604d4591c8c31d9c2b47c934ce5ccca16732ac1fd28248e105ba6c56465aa3ab9c9e4c91835df040e331d3bc43d8c9573ada4b77276cca9922954396338f1425c1700ea24d0acb0e600f4256c17998d8ec283a23c0cd28fe780894addccdab6fb80cb34b8e91560c88293d8bb006e12c63649eab036d0a19ed5a8421abdc10906aba6215aebb384444c6ede179484b5c89d6a2985a1416f06ad53d7c0683ea90bec2438615501abe7d2f7ae282077f6f45c66b712c89f78ed8bfe745578be1789b6b7f282b18a38119ad0b16340a256d7e7b24bee19553f81d61a90505bd9e4febfe3e8359da7c950286c804f71be45f1e3ef308e100d3382303ac4378dfc91d95c3a71d05604c021e02da343400644c0c5700d593921e54d0ed188718b90aeb8102e3809970bcd0576b692e51824e3c300e74b06112dd570e66145a4d1507c0970319347bd3740893079c7bb8694a3772aa771eb24ab746c4b7c8427fb96ba4bf0d72bf15511bb2bc209ca2cf7dff46ba7530a9ef00552bda295dc9166edc9fe16a16abcdb159d4b9fc912b00861670f0b5c8d87efd5e0d3702fb777afc02bae5602c800dbdd87872e3a29fb24b36befcb36733c8097bf5c58ac9d3132b87fcb338ddc43c3b3da5cf1ff7844c950836c6b7334335eb54ea6b0bf0654ac3106e333a5001c1f43364b8f7b965382c34e33709578f2e6d90f411cb98b5858b48164eadaebe06b060bc15b210c7ddd861ca35f0f9a01955d71b9f13e74c2d4cd4feeadb1e8472366cb5ce992334a36137f5a9b642fc5f6cd368fe2b08b1abce5f2ef00ac9da6d500057cbf41b33f28e606b7ca1592d697a2ae2145b216c65d98fac4983d6485fc4c4abf50b1f4d3228813494fa66bb9e478492caeb5b06c5350c82db8e6e56b05b5fb832255808cbf74559db08932c659a8a7e0922dd0632a97fb89072b98dc9dd7a866b8beeef26c351e13815060a283de3b0b74ad0f414ff90544f79de741012bc1e89860887a95450d49267e7dc4ef63830bda95b59d2fde660ffe90694eec2ce87725cce5abd72e83ad3475f2b3f8e31040487a7bbd66c2ae38a0b5873ccb457c9105569efcbe4c11ce2fd967e62cd7536732edba5871303e6d727fd9b10b100ed49bb01ce39738481a7d1b35d217aadcef1e5209c4dbc1a70ce851c94248171fa07d4bd8070e7d9720a0bde50e35f80d268f39e2a902d1689576cdee46eec51f831eac68cd90867f6f3f241e01142974cbfa17cd6b82fa1395a266b1558ba48f0af43447adb9dd7154acf019411ec9943de37e3282d8a6089bff9eaaf48b200e969275ed3dd70d0d7f7ea49f54c252fc0adfdfaa95806fd806e2e8338a89d1eeb46e03c1d4947fb45e28b3f8a2ab401ca133aeae09f6b2027500c603adf434dfe31b507e386eb0066f4fa0bdb1463b669fb38da566b8070844bdda63c556c332b0fede7aafc248643137ed67070f8f7a54a3df391250e96a248e780c772e07879c9d103fc13b935e22861c8d2a73c6b87e9925c1b33dd3986307414629e66c5f147a984603374b74d1ce9088822f7bb16c07f3e7cffb5023ae9ca8a9541c8c29971bd915fc41bb18cd55fbf1a48f18e5bb74bc13aef5e99c55d310be8c3cc167b2f5453802e77cea53d0b141180f18d5cb7400cdf6d9fa52f72f3bfe48c3b699f6ab7f24bd950b3a23b3430f334c16023a6a448f3e042cf801257cd1004dc650b082f95482e6e0b8ab6233a4bcb27aeb86ec09cfcb00dbec124a45df49479b0c9f302640093987c6698215b9eadec1f21f5dc318444c91afa90239919a2d8f2e1117888fa7198ae3dc874bb7641d85c6825402f12063e8d313e1ca70698c2d4594cdb29be31344b172e64815af1b20d95e433bd2f5d33bd7016d6af43dcfffd3b8b716ed53935f8fdb23bd6d32544daae1cfe0361b17152beff9bda59d857178fb68480c6f3625ff53c3fe168435469bdb4ea2a336bc1f524e4b14fcff292c75bb45a8719c585280ab4bacba1b4ab65c9943d5a2af1e94ea8aa61372d9477b7a96f3baa571964fb4102f2bb06e01174dba43fbad0acb104553af3bafc25d08f80ce71110756c97ea40e30da202f4d3efacc3a73ac04e3c0307cafffc30d63f6e9b943e5b1e47a5c3ac0bb4f760a296c2ef474ac466245294358dd2f0ab3f995ea18f84edd2b3f3b0b01dd4390d76ba67f04368e272ca1e895b7c4715a8159148ed3d9731493e2c420b7dcdef7ffdc93f6e4c841d6ccbda42e7fadee39de4d1adad32e7ddd84299e80cc014732eb44dc9a7c72ecdba86106179ae0ce32329b4fd8fe3f93c166de71332694a7c9026b2974b47cb8bf2a57b557eea538cae60c5d8f3d53de47a1c7e742afdd2545ab18218a752dcc09b8665af66544548b6068e90779b386f79dada6b44d23ea2d50156ce6a5cf5141bc559dfde6044bfc09779e4998a8b259c2575691eab01e095828b3902ea86ef09ded2573582f45a54900215c84788af6798fa0e26dcae7622b1a9e8ef6014c9dc3f69b60a50b690f89cd1d48236b3755281b2caebeba70be31b2d4eae72112d09638a6ccb4e1e0c12fa438165fcbe1fe39c4a1fdc5c8dfa8d2bafeace852e9117e7aefc06df8d243a54e1acd1edeaf7a1252a7d76a3b5da576f8c3dae0daf9e9e3861e43b89a661e51936c754aeeca501d8de845955d113f8536cc7eb90269df2d22da5e7d0dc4d99d3ad617ca415a08c03d094e2e7424fd673ac09f5a12627cc417cb18a49a15fcf00dffb9861f862b6529b5fb1dc9bd6784cc4846ab520b46102c9a7915898110b1d2906666d27640731a92534aa4050644b60c7a94098dc77a2bef89b9222f9c4a52302352a153cf52d8485e9d4c246110bfb343fd810f8768da715176ad4828225588fa32d34560692b8024ff0b41014eaee6a9ce00ba0d4303c9d83571f33ca1a340f2eeb1737c22dbe2ae5627846c684c4cb5efcfb5e1746c9f26dfb759612f03ff136e8306aae4af15038ce9162cc4618e6e4836298b61de9a445ac7a11e343e6d669b9125731870c22b87991fc9ccb553ddc27c3e937420623990e9f4fc181c33f25b22f95e24e6902f317fc6c9e60f440843eb1b8214fca00d67657a824365f9c0977faaf371d9281670e334b67c3808f9b4c9e9e0a838fcc9c9825a381ee166d638f15fba671131e82e0c9117f5f948b8fe5fcf339a9d1d749d89bda60f58233e24be403c6e5554ad52430475b918ac4b07f5f60551f3ac16cbc2ca557f91d800452e7600ef6f396ec4d0b557305ddbbcb9d386dd350250b83a75aaccd7552c22818b298e502587336cfbcd45c2927e13fb40a644ae91b260d4ea84937d6cc7aec21b806ffb40e602320c74c7d77d3c56b4867ec1246a791980698133db9e52abef28a42a568800e5fe4ad166d7e8be8fceeb37dcff534ee82639c93357b37522f0f8bd47cbc47ae3b8fe0da92a99acc530b8f91da715d9d7afa3831b5b72d71aadd3f24fc1beff0448704f193858ad01c234eb0d8578c1ed01efd8744ea4219b0d036bc9a03c355196e8c03c69ef694a6ca93633ff43af320565efc49811faaefbcf513dcf07c4d18aae889d262489a8165d01177e404aafa34cf196a1810b595c7ecc33b8e7558d0d09cec1d5c1b523a89975426b353b6bc4ee056fd0bcfca619590334c2a3908b0543ba32e08c94c40aa5ba3b2ceb296e4e9154d98f89749d1aa81fc755051cd55ca27677ad4ecf9225c9f78a2b2abdc12b7e055b46b21b4547b34775d9d3a273f86f2718a6ce0d95df4d55b8ceb99f6b41fd417e5bfd9aa688c1a4c5b6d6c96bc3f1f89d31d6f7d62178fb4c7f6276747a5530c8373399c8c61b5e3f55d63ac7a3720f8fb82c355cd49411cea5ebeae5bcd0f9c3421cbfb4e70a9c6b1c9b9c8f82389476a2996e30dee7c1c7a71da5c5f1b4c5f7e47fb571d5d486d274ec98c9478cb0d857e54a5829ba31beefc04c1c004abbeb8625230776c145fbc692d67fdab68a3f3fd873de9b54893be49c8af3d1da04278ed7af7fb41b016e7856fdb823fe4c32c23a8ec91efff2c6ee7804514cacc733665b04e07628e1b4f4feb57d09ac1b3a48d24622990194e8751e653e59072d987479c832a3320e54a052a8d5770722de396940f0f3a39628e15453c2e0355edd22fba47d257fb0d6e61c7cc8525886a6fdc7273b162d200f9be376e6c97c818ad7a73fcae357eec32d22d95e83e7721afcb4a10ce9e75c24099378b1fc25be27fa474220c504f0a2dc2d68a0f2fc0cc39ef8566a541870ef942bfe2c61773e3df5a15488b3cddffb5d05d09587df7c284c5af05d3f0a84f8a475b35de1bc29532f7e1e0995f9e3571772ba452bd7ebd16ca414ed9203c1c8a2373c4e623aa7f210a547ab53d1233c723cceb9c42e8147689c6c23354c4ee6f43a4407cd3bdea100e07876d69dc835d62ab3f83b2a6511a60ba006112d54da0446718e0b05f9e867f5597304a5f9c7ab06120a7914c0b790b8589e0cedfb2d39236bed03e01e4fadad91a9c630df7c599692f86534b9c28c6d3bf40fd66a66fa98db2c9c16765f3ad0c9210587a1db48a3dcc9e6d179b904f0f10f032eca0db16e6951c0ee289f7726a8e1a7f3696ce1f49785e63427245f0a23f8ce3e42aac56dbc6656af5c98ca76d7f395ba5cb88a536c354ca6ec8c058379b55a4efbc69e5d7d7245a23cd09c8afd5eb824a446ac8603e0006df0775e239a508da61de8a406537e770fedd15628c32bf77b699eb056038ee9d15a70d2b22fd0518dcf993f30e791d33e9a235e19d1613905d249fc8b1547f11c52fcc9f7df3e8d4d3960d7a2e1b34176694c1e25ce08680c08cefaede014ff9402a5abbb53a1292c84c5d425e8eca90082d6fc1363296bd633b511430dfcfc8390f2e0c632010c73d8509e81a445f3240e4962ad37cb2aab7987a8574308ce2f246bd0e0256720695c8a9d7ebec5082a352bb7b9f3f68dd505cb29ef2b3f5ee1e799e3d1d4d94c5839fa39e3de75ce5a1e0663003eb27c9bfd09fbd46ca994e000038260e66278869629db7aab5b2efcf261ce4ac108df448aca86ceaf4e58769832135704078c3c9c9de909ce811057d8c5605f23ff9e19d39432a59c3793e9d7ac007cd5d271c273e0cd59eeef5db4f9b981060da0a16201f26720da6b2b82e4fbaf9802ca0d60427aed32b4acfb5b7dc5990927f2d0673b698d0812f20a89e8a68a7232f7495e31f1b35cc8c0d4948b71102e18fd146faa830c25ebd516460a36f7d40e620e036acf869ed133cfa74b464e3e89c953c375c74c3f0e1b3900733260843d124299129bcdc1780dd3dbe6cbbb00215f77acc6bdb61e22cc5a014a222c4b680fce6654def28e6457ca7a8489bf3e89c66670c2eeb089d0f1618fb88fc3f137629bb3561f5cca3d199bca4c06c3be68060a5793e1a34ac09035f3e5008d3e511290c740e67340ad592e1467cc2d49672849ab611ef82799b4c075f8fdf2fa5f2794ec3bbc9fb75a216b9ffd6367a72e320db2532e15e90462e95c1a0e5aec08aa91686f2748f6ec783ab53551d7a0642f3db692986458a8a498f272bc2dddf5a26e8403b1d6c60c67839c3720e7fcb124c1fd45e44b3b2e81b57d298ed395ce1713881fe2b1ef62f42e9d2c57fe82bf1b81cf959b345b3d022946660db4dc3a1268bced414139952a23003c7f83fb331b6476aa4486817e2dda9552bf387ae19954679256ef6c4e0e4a0d8e1fe030b82d5439ab67a973980cb1b2152ec8366cb7c2d339a9214f34aa8b0c4bbf7ce6f458395fc18d05fa34a796e4d6e2cad98371974608c340abf005cf449ae8bfe88fa4f931133d02ddfa047274bd62a82bcdd1bc09272bb5482927fcfea42011fd32197df7caff08e6912d2baaf336c8f4f3de1964bf69e7ee8819fc8290f2daec85c0adf90d5b7fdba22aabcea0e694fc9ca0969ef8063d65b4e2b51887e3827e2fa0717e05dacf85d401d828ebfa720b71201c01f9892174568a1108b17d717bd9c1b2d0d90360acd0bc9c00fdfbcce81a6591d3eb7afae5161af799354710ab2a2c5635b25e9a183e63de9dfe71095c3e77df5df5622f7e9b994e143cc9c5d5cbe847f6b874e690c4fc864815e2912f855fece740c72a088e0f00c1ed8cf9c363fd6b5a12ccaadd0d917b496ad8cc299924a2b9f434524a9684f4e87117153b9b74acabe9ef4fc7bf29a7e826da22111fcee71a382e0f0e5c0112d1eff27f061b54f12f64633e1683cdf16d7171fbb1c266a554343fc91a888d42c490a6a1ec8aa52130acb2de920084411f7223bfcf28f3c3ad11eee837c1316c087cbae2b4907026f4e8639603df567f47527bd634f97d296ef7c3d42daff478e6dab6a928d6bce7c441ffd030c74b932d38fea8a8de0dbfde0d47f6c4fbde4ea6d223600e04914ce7df0df3e2616c66194d369df37ea96d477c01b4c44df7d7908e886e2fc2f73da7e91567e155c0de53b9aa1edc835c1bef6b7a77f44c48f9eb336d3b53b6f7a24a88a093f54a4fe422a3e2912c922bb11f0338a81da1d89d01ec5a2f418b986319e335e1e6e82261d0336760ab5620171f6cc5ad07f4afac18dfd8b2c3e7e3695c235cb87bd8403ba393c0f12174423537cda9f07aecd60c79346e2c9f73de9a5b6f9d807dc2b15ce4e875ae569799f3af4e6ad73e3154a76c14a5059ed693df5df081a2b54d7eaada5d0ffe12652e3ace1992cc1a6c316338a704a588b80a21accd8f84e822ae0fcf1715481c8608f0de53a936d845762a2714137425c34a468e2f508fe1e9497209410ff63da32fff2527357d3e632ae37f845adb3d9d5b374c3e4a2b674958bad101856f3d64ac4decbbc008156f5576891e624097ee45dd2d2107c141eae2d16f7f001be47086c47a37d1412410ffca8d0bb20cfc5f101f7b010fb73875ef9e2be50862f970c54b19c4f18f35ef31c9d372d2a83497c5e47c05e877149288094d5823ac460b72c90f8aa65a0eb3f35aa27c4b7a073f6c167a561c679de8b3fa1c02db6191ea9428a5b07b0b78054b654450a4ec3dff0b9cbb1b33f19a207a59e10bb7e9a3b4334f235ef5083b8d43d3ff1865659d7eac5e887db37cd5e1e50ee59b3fac44125726d1be9eba1ff2e28a1cf9174df065564428a4266f14d4fb026dd8fc133bac0995f6f5fd89ecdd3073e21d410bfe5b1236e5b7133420a1c41bc4ed758452295084dc2e9ade69f536769bac6b098f09e71c05df0332c1ef4842310032684f3235dbc98ffe1f5fe3fb7c8dcd1dae6b17ddded1437dd1be669060fb3abc28fb6ebf820640b0b6974e876b02a9e062592cfc64910c0979e1afa35b6bc29a2a1e86f661db6a3809d6dfe32d40683b8d23f04d968d612f92f072891dc9c154d88021e2618f351f82e73e16a88f31b7978f0dd75d0c6b7884b4564b8c5d5e7399e8e88c686cc8ec87911228c6392cdae96628a29f58516bb8f504f0926ec27ed42082fb5fb84c27829b03226d85832fe96fecb746b73c91947b2480164514fdf3ee99372fbce859dacebb0b87ba5b3b0074fe1d38725470810d5d04ff2b7d795d1bd249bec0c509f7f2dfebfb21df88963b09dc5fd0c092e8755782376625797a6fd738f60c0abf41cf1acbb102349d148eb3fda11ba97f2f79bb05a53e3385b2b1500cbee7e003202c11b291a58502e033a487e89936bdc0e2319231fdcf256dabe4cefd9b6f5efcd26fa88351f84064f285821b9490d601776033c3e923e213233c859d6ede573d8adab56f4fb5de0795fef72252de525c02f1ef434c54430ce2003985a956774b1afae23de8e56430e2b6ede51c49b738498bcf996c8dd1c0b0d7f29d93fe448e4a7936d561b05a49a3566c4b39f98ffc16d7d9ae92f412985469b9cd76ff486fe4fcba1f053d49b99e857c3ef31561122f7d176805b190fa985f95fd98800b54ae2e74041bb5b9e89cec26a690c6b6e15c2491b00fedd34f42618f1543aa14a672b46e6aea3f303e64337169593315d167744e6ff6d061001b16aefdbda5ebcef639b03bbb043823c00166709685064a1617568b0381c473eb27fa9e4e9818320363405dd62c58ff76fe0ba38fe311b433b2b1ee7e2984127a3b7bde40ab233c60da28ba83de193a4fd36aea8b76bf7784f0687eafef27448ffb3aa6d9089553d74770380a42013c13288b2ed46597fbd2768125ddfc3770f40f3edf63d4f6de2e521ec1b2819a6d8aa47455b0d922a9e4ef07c952773c006f1e8f6f243acc472ea23c3cc5c36c367bf02f4968fae6e78401ff545489bc5bc9d036406560a1f59fe0d190892ffdfdb0b4c4f043ef6d1e785473ad2c5a41e9cacf3a386d6efc5049b3e6a747eed82bef9739348be13fb789916abc2211521239c0a341868d66c0f3c4826846278229014198fc86f7e2187f60ed697dd7783edf4e7a42f6e566ad67bbadbbd003845eae5be92f7e5ae0ab2268039c87d339d5851fc622069d847f6b3f6f882baa6731bd8d32b7b931c1d73a52b43d862e203ff1db8fcbfedd489ec8f8d1b7a043b30cf87e7d7b80a50b038ec50834c30fb2e4ec2bdd2426cf3b73468fda3177f7ee5625d7d1631ade4899e76a0869869f792d3db7b915c598e464acac93dcf8eda2760d3f3757d103ff000de9bbc51705fc80ae262a862563cbdac4f602a16b4e -MD = 43767f4cee6749090fe23cb07e7db664d6c7c512f8afa70304f2f14b8a7204779e7223aaa2c8ff3e82f8cd72529e43d5df545e886f647a766ae4172baa56407d - -Len = 89728 -Msg = 7caae2640e734539d394d20a3b0f8c9c827eb6f726b4e9229ea1632e4976a275a50a3224c17cc3f7f51b7e44d082993b5207296c5b57388a645a186e6d5df65e366fb290b20befeab9f8660cfd6e7f903f7a2290c3a3ca6901cedcbf9d5f38c299a10dafca68f19988f53169aa196524b29e486c44e2c74addc5582ac1c58d273568e989efdbf28ccbd88764bfcc747d113a4407c75a57b2600734b6c1d81f17728cef270aab1a4ce86a120324cfd425c517bd6a3555a02bf25b176c85dd1619b8d4c6900421906049737750c26aaca437fd5c9b7419cd3cfb8aa952f61f9ab66f0916ccc3857d5054bb61537fe52480ceb3c9a46eee046ee35d9373fae5d174fff389e4311f08a57309761344876643f103ab8c091e6d4712997dd47a76e6ded15ac5df35365ae60d265e98fa9a97740ab3ab5c2ff03251f0090e7f5f1bff794b0672c5b6139a9b89dbc2ea8764e29c808c701bc7ab7814e674ef7b8f1c45cfd6bf399f9efff14d51ee4a12d52e6d42bb56a3d1b9986a175aa1c8d0f4c1df67db4cc274d4408783cc279d17ca3f60ee23d9eb87edff2de2b55940877552f5c9c076b44c401e83c56250640150e1e42920dcf1444a28ecfd6064ffa6f916b17eef05b72fcae30d9b7b2f46d84e5a21791a295c10ba5acdf1c18aae386a56390dcec175265ad54f8e7f8eeca5abf33e697986d5f325def8444293f542af5ab5fec7719338d83e6e25d633fd7051f4637ea5bc04f671fd96814a467bceb06a4eda40dfbc6e2c6495e9e9e6223f27a5ba420693902087fccf2d406ce9e355ce2b27a3d196ce3e90ea601e71031c154d683c04d2227a4f26cad28ecde68a86cd76705710c963f6099514de9b470e033698f40843610ab1c2b0f79b311bca2bb0543ac464fe323d19bf8d922b971ed9a670f378acf6da9617a825cf602fab2cc0ef0f5294dd45f9069051a0ea9a527fe618c0bed688f2e46edbe39221cb3571426f76696a0da314192fea72a0f9b4de3eb9e34089c058850f71b94c3e9771e281fcf871ac3754749ac5e06e145b4cdcf57be5688c46165f42912f657d3a6668c4bc1cd223026103d179b9fe1069206255854d9da9c1345c4f63ce45a75d1ce952da6af49717d1a70574ff895acb3b59a400a346a6d9b8637d101d5584a79c4e747c6a40d01dac4a80dd3977bb28a2a72b1370cd4c37ac5b16c0a5fbdbc1ed8072cba51c95bdfad388ddf02ffb285f3632e73a996383172e609aeca07552176694eea2f1af9fc42a669cab1be27478ec01a38c12b36402c3a4c77cad1b0323e7220de928e76a12376241f2a238b4f8b3df70eba003837402296fdd88937c18ed6352032703c6eae2c3f54d2cc48fe4721676e1ab1d8875d339b8959ba564fe5fa0e37758cb5d5613d3df45214fae4611ecdcf59bc71a0d1e1acd2e4d1b64de2421e8cd2209d45db2d82861eaa1b92577aacbb0d8cae145cb15d43005bc23bf262e8a8eec83d607a71bf72aed82578a8e976a98caee8724c272f6212d4f4aa94c0ff0412002095ddae4752793ba307c3dfde237dafab1b3ec795a8b2c9d80a47e0b446e254e1566337bc9e04410ed036c225a156eb809f92f7229f56a6e6eb9a46bab9d632fa32b9b271ddd694e3627034ffbb8f0ee37fe74a48ae84f89bbefa7784f57426d5bb2f83196a7683ab2f1ebccedaac665e3caa458a6eb43b8104f6d7758232acfe40534e15ec5ab9d0a680ae157735ae5b466a5d6a486aec115dfdfb3ee8a831fe72c357f9dbf983ee69549d66199123652d96166ad41f86d71a9e5733713b5230b2de5537a1e99e7ec7e90f235a6581f662bbe50e9a58984cdb568fe5e4628a4f9122aa51e68155ec72dc87ff82293699864a6db7f39c9ced0094e9d89ab446958e3eebcb128746c1daad7c3d5932adc8f8d00509885211323af8198e1cb723cd1a618e15ae31dd997fba707f2838740f4aeb4f75b12f71a6dafe7378d2d18e30c65905c41237a6ddc2a1f927779115d6ecda918f167b4ac570f6ac2b559a027b0273e758f6ff2f0953f26ae8dfe30fba6f4c9fb810dc19189d9f18083d870d065f50a746c50ed296940a6a15c994ce1432afbe8348a8491aa1563ba1d31f2a6d5d6dca0ff4dd3e1013786b40bd2cdd8ee7827263268677362c9aab8abec8c71a6d29c4271ee0de0042bae2fc2311ca84fe435fea22ed1015bffadc25692a8f880f132a2e9bb01ee1b25055aab3f9f190d790eb8ac652a013abe542045aaad040c3c8608903d18d3ee2c757ceb83bff2d13c989c7a94d93caa0f8719a2bc035df1ba80bc8efbba562448e6dfad85e4fd4237bcf13143487a51f82ef6925012cbd87309050a7d504165813ec917ce770009716301fcfbde83d78431003fef41166970072d2c4c405a5be0668351e5dec4cdf273120142031ee5b8787cd120fa054bb8647a1eeff46aac6c46558452831137c3d66d68a31f15239eecb5706ca5612753063505eed238002ec686d89eccafefeb725a5aa39a2e383d73f2425aa8f2a44ad7a50cd2448e002ccf60745023659c723120ffccdd32cd9df67a72726c806ba4bd145822b1325370472981f0effce661f9097ea54ee889c75e96263c59d32369a2c8146681eda202182a2607983d77bfb45bffb6561a15c2918e8741d8b275a26d0a66271b8795e828ab8c1c86edf494495fac885e8e189679aabc084fe70956062276ebe9c8d32c61f4dab720d708e8a05daba2cc0d3b4cfd32ed192738868d55586d3d527805d6a94c3960d0c259c4a19d248c095f26eb046d44fdc96e954f41f473a2be5ed2eceafdd1a0fe758f2f346640cf7e4c807b78a4e63b9b51dda5b43dafa49543e3780b4dc9fe10b95332410226f2929cf105401ffe5b07a80796967c4aca40efdf81f4854a036f564dd4b0b7007dac16238f4426b2e6743dba2bcdfa6c9c252a6f108dec7b358314241d69cef3f93684bb246c012a634ad69f6b42fc3ba3adbc3b2cbecc851fb4bb8015548e29ed97ac64c9a0f78f5af03c5d5eddcde266406ceadd6f6b8f466b120bc55a41cae13756c488c8510953d0379d0c87b4876e4703252b8813c2340ee26a34612dfd5d7e4c8368cc58bfd7518e077e26f85341284a931ff10a467007f3486a529cebead4554a729451da6ddb0b42bba3e26d694d06ddc092984282bc0d4b7016d4bc0fa138c1ac0887819ed674f7cbe7bafd6e1c02aa175307def397f81b4d931e97554dbe8f201141ddf1aa92cdb7d9c82dd6ff05a32a1d9d4449fe7b6109b3c1a44340af5cd695c616eec02d6d866053232b5dd67003d6a4990f5b60c5ad5d070d61e2d3d2d47d5f531d7e0d7e4066a507f49e3eb8aa686208ca156dee407936f7379cf19724b254bc074df9a9eed20402ba29052325b920b604946b85caee978c4ed4d353ce1bed7b3396ba96968cb93c0468f35b7eb325ce4440213154a672f42df33fafd89f72b529bf18ec437b0bdc5ac2cf05bd3dbb761381599be4880f575c62fe524c282a957232db54fa89440a449f63cce83e28d6f8bfd96b857cb5dc6488d8e6319d5e409555cb75c59dabf04b67755509a0b5187b626a483c6aadabcccc941090e556e11a92b0f8ab9f87b3f683ce4b274aaa6124d2d4da133a40ed1c98fc7a70ea5a9e8a505184b578217ece5936544b244fdc7c77dfca11d4b3cadd53d6ccd993b29f6cf677c2e90ec1775a5275187c16ebae0aba53c03e2151699664ebadd4c8a50d48eeea59514aaec622d65241c208c8025601f763a30761f3cf3503c667717c10a79f72f2f5143294ae4e967425e22cfee9b5945c476f2a8f102de6bf9d7780cf0f71d735db5593098720095bae8c60ca4a3ff2523342f566e2b45b3f7bc0f6730bcce0c90df31a4c34b6739e64eeac8f0105d9ee6d660aa0cc322bee0b3529232018575793d80f863d779ce550f15775977111d8ffc5b164570f1e7654be6008d8bd028673eabade2bca4cd7787baba393ea61b7f04632da09b4fc7c5e44e24aba23a9ffb713627d84194a1ce675ee427dd7933449d0d42b6d878dab32adf8104eb3166a673a518ad3cb5f5da2c86979dea26df6114de17f08f199a8d7e3ea821dd3106e8947cd2e9d485342b25a64713db2b8a650a49ffd645be71e55cc00caaeec5eb327211f916cf7ee7220152751226f3beb0fbd57ce082b40b3b552820d8967c9e248b28fdac742f796f4e0f9421541c06e558050197ccb6c0ffe5cb77637aa19a3f5e164323790385534a2246c9f900dd62ad5d40749a133db38d1e82a3f1f169d3596e8c0434a7758ea45eef647c4eccc96a429c0f6175dbf6b9b5d54292d877910b961ad73d67d461db0a009964522f8a2d5986b0b93b162a0a15e1a7e3b36de8e3318204f9d12c8d6cb81cc137c7a0155506931107ff86ddfcb33a4c5b3e975b8ea55426007fd861c7edb6846cfbb90b8fde4398e42fa872e01231b86fc69e695c7603a2d7d0827f7b1f404b7a7ac4cd1c451ac0d447f59972b77a74a7e7ed82db280313e65f9546f4c16c9ef6d17deaa8ef7b113ed4f8b2131786f97a1eff38994fe4f1c2899b48d3787df7587c2ed4b411f712aa531c4d4fb6b9cf8cd86e0b05322bb4e2fb0f0585b8f6dd15f7522bac71113d9d4efacb9729b55f26a0947aad9349e5ce106afd99e789b8c5bfa25010615c0a9e24fecd77c4fc30fe041cf800c7c1fcfa5629a16e988932de5189d28e873a020371a2c3702ce0ed697f62139d642672ee58e581925097a3c649632355472dac83b1713dfed615dcff8f0e5dd1ecd9d01085092ea38417b41403d8d32315b972957104ad92350d88369f6c275cc66ead17671f08f0c79bbc5e0d556266976fec9f1cb792d8ee3a97953d26008c755762496b9191287f86550ae26341ae30b3832731247e11562f5391f4a689ef9e26885d2efb67a93089f6811f7d01587626cec43ab5cff9f14e74c3327823f4955e97991dd6ed017ef91977111d21f3dc3c37dcb5e618e1642a439f93055f49ff5208a3c49ea1bfaf66564373de140ed75656f71f5fe9761345788d72f8ac4e30b363f39fcd26326654057c941a5817fc1794a9f36da21683226c237eac8b8fddf5220f1becdb182844cf990e5c8e9dbef2794bceb9e341384396e802bb8d7d6b99db6cc56830cf69ab1d1f4f3ef81ea4799d730daf1d84a71b9141ab8022954e13f88338e9d7c6af197685e31c4509210f49a62cc7c16f542ce3d6d594db6609e5f1f8c2cc309c6cf25443469ef5ebc946366bc88e7f5fc409f70e1d84187e33a250140f99cbcf27d83efdf6118b351190cc2a5d8d97e47b05535defc87a3c3fbbab8b8bdd19cd743daf1c8e2e65837e817368582fab8bedd1714cc8cc712ea2a46cc5b4009b15b6852d056b301545849ad4ac54ff3ab4a0e0e961351a8dd3e0ef0c39049ed0467361216f09e12af9a83f687cb076c5fd18a62421b13d30ba9f1e127c1a2259ce4f3434a0069c171e7e0197400720cdd3c9a3aa04c99f0a41219417f55115882b8e80cf5edddb5a326a63e9acc577c2c7486be390fada6b160cf3754b45f2ebccd5d969e1fc2974d3f1e8f7f9880645460961894ca159d387d5beb2d46545154099a08cdfee00e75199031adcab36a5ee7126d3ae79a7e445005869272b7665156e68b0bf2fec3259e444facccb93951f341e8b1cc04f1dac115300ba35218bc9b8b47de63e65d64b5810f02045a77356b6cae83e31b9d04b8d210213eeb0c9cc0cf63d1b95e853b46919939dc5dcd1236dbea3792a72bc91d864f5bac4bedf9acfb08695c2fe3b03aba16d9ba8ce2f13ed6c256436f4232d8771442553a61dc49565d30b4211ece7745ae6808ad5fd96aa55e675d3c8b45d2ed885ca17f104c7e2a8bad2afbdf9ae67a88702d89ebd3a28fe7f248d6ae0cf132d334f9e4a45133bdb9682487cd1e6fa0cd7891e82fe6cedd85806b05528f1e8d1c4fc32fc2f3505910ea0b8b9161fb00a4099c92d21ad7d85f9830911fd542458b376829143bbe44b8ba48d0d26b70e336aab64e7d77a3c59ec2fe41bfe643a34a73519a423063c6d860411e3945b88fabe347e5d8061bef69863eded7ca0bef7e8be54af4da28299865603c6ef6b94d2a3cb7208ace279de96d56301289807152078b00d142f5b321500cf418865d64db3e6ec53cd7b01646feafff152c8c70ec70ad86816fb3ae9ba9ac0cdffe8a1ee770d59c952a9ca3a7c2b1138bbb1636744eb2a2ad6948602ef9aa4d6d652ac1765a526f3eced58c343fc4341a3c05091327021dfd399e1200c66d7f67c32496af854e04decb411917ff51296ab94332f08505be18e69c0b3c9b5d6a782060e5bb7832241e2aca92758abebb2439b7f835ef234fa778299508fde2d54685c6f6c2bb6497a6f2573e796675b2f0c549a507eec49651f82ff68c76648a79f93e10ebd74e251d2bcf66481ddcd67564e1809009505dbf6d9577f28d4b4fba85b07c5e5356962cde1c520d375dee5c1e67d0f8c82f6a98df43605fcbffedb130048344b7e6b17a12254aee3a5fc44cfbc3de67b3c985855720f9fdb6e82c0502226bc58c653fb0cfd29613b04a1eee04def2045386782edb1689f4d86fd35e03f27c08593b08751d0b7da52085c5ea409e53f72fcf0a3a760c5a6cb9faac663c5d0036a6cfd47205b848cc137a81e7b8ec4b69cf0a02522debb28cdff37dc2b4493d76fc8b6b4e8ec140af1090198d72b12082bca1291d0a99da7cd4c00f1d73a07cf1e1d695b2c10eaa779f2f578678d31b697dfa474414ff1a6520cb2a1d824805cee0181946a488d14b48bf0177d23c84479a7f246e5305b96f497a956ae82b20367ebac0b14215fc5494a8e00b86d2a3439c968744d09401c1d9371aadad2f15514522529ca09e72ba0a53bce89e7fbf860aa9396d9292388458697f8eda3e2b46bcb997aec80c7ca433265db6212922376c1f0392a1e9a7df4c778db4763fac3e6be75690c145623a958a8a1e18ba127f4b60ab5b067f96fb3fcb0cc88919de60db1559e993336ca6bae80dc78a19d8862dd4f96fc83e4dffb8ccc4711cb60ad593a9666247bde20d2aa6ac5b7f2ebc739de3b777ef0c131440e27d5835fd77c41b0d46a3e3ca0b9a6b2e307f00e1056e20f5ab1a84d332625e75fe25dfd66f56fca7c1537244307207e660dd131afda140729e018e7af0109aed107f1f2938b3bde19e1af91299c08638061dc3c1ea3284c259d415e996477cb37b0effde1b02e622a7a2821c8eaa6e8be8e715be1549744da13a22086b2e8d2d077b86de606c00d1a290144a57584946d0e113f9c60f997b41dbbbbfb9ee54c47b6ebc0f4f189258588fb8843bf39ed384b6c45b45ab7ab5ff60ebf6c6ae59e0a18eaa5a302e241e914575b283a3f699cc0c30cad946a061a571b795dc9725ea3f8457a74ad83e8b145a53bc788fd800728c602fcb0891e9f9b5298441d13f481ef7ccdfe63c6907ab775a8a5fe0cc703cdd5b736318d7b3c4d548ab3d832f6406900fe84c822cfa1c44930483bd5a51f4a7297ce99ffa29cd781cf21ad57ea5bff72aacc4d310cc306805132b4f0b0b6094d334a5c480b1de47ae421ef0b37210d3241296579ce5af8cb89d9ebe6606494a6082dfb0f3b5bdea058193fc5635c2cd0601093558ae6157b58b2531f4ab7671d84dde8ada9c33082999bf20f0559d8cd7636696cc8d0e7203c608d03b60b1b2447feb7bbece08492370eb85083a69b99f1ff5a181eb7d84aa358fc4c58ec0b5abff4eab26b30457faf05e53264ceefb671dfe7ffe317736b3bf02351a9e6c2115b54f419ab3efd7b60062b1d2f3f4fb3645c957cbc5c430254ea84ac0f67d9e8a893666a236907460873dc795974260147f9e5271112c1908c9ca2c4100bbd613634a41c7a4b0d4ff6f38bef6a0a1d309b3c498777b77996517b0032523ee6eb72bd4fb9065179f9b9f9bbe7e76d9fc1ec98450656d6c5a4322a2f6f2c6dd117fc91cbb86e18d7e3dffaeeeb381b2825aa926a2c44ed401aad1e82d3253516571256aaa2f80da18eb77b9771f29f40ec63bf2b71a867739a20cc9d16c311212982806f016abc517afef03814ad7664768682fb7f27d1da834bb8e0a29c8e8c1f9b837b4c0c81820914fd533bbf1d1d64a1627cad19a8ef667c780fff0809b1a9ebe471eb74199de987f77b5fae1fd62742e2016414791cc4416e4d949c1f2c48e237c57827c11f6cc6731308f0db294ec9963c6c9ecf0d2d19105bfbcf3b668d1cd1f87a9e3471335f04bcc03dfb814bc3d3800f2ef71af18202adad27eafad70a677d5b4dc05dbdc000cb0dcbdd689ec04e6ec42b9dd0b21ac9a5212caa53c7295ce6a2cd111f6c880bd05a511d69b82d5b7b443b2fb90f21b9e4e053f60bcdf816a6e9929340d0159a6f2e3427ef38897f17d7d4295e495577ef63146a7d6bf549408814c36c890710fa020b897390534dd7277d271af12468273204544321bf594606ea2dfce7cb24036e3dbe8150293c3b8b9c8599a6fd2f2ed5aa6fd77fa4cb29fe793f7c8cd0380ddb5133b2d869ceb7acb8e124cb6e2158b65cf9b4d654136ed7587455d8c4b19bd1dc8562c99379cde368a676eef5d3476cb2ae65e63bc67719ee69236c07451fda36202b8434c200c81261fa8202d97d6141da54ffca58f54ed18a6fa716571c6cf4907798dc3bd2d34c901a1533986d2c612a2cb38e4f4bde7854952a706c03f2ae52d197e84bc69d7dad7028f6949926b70a3782061ded5169543e66b3f88913b9f3c3d1f7865e7f3c36772dda5273f8a9f71febb0597c401b15b5dc4f80fe38addfb8f7685ffd00feb7a9a44d56a01ac07d40612b666b1303f5b60bb199f5ea00833b78e94d44bb4bad722cce158ff581093382b5d92c42ca90996578a7e290489ac5d6c8e2a81699848b17db13a621622783b10e364277c552da8a033f46e3ec62e281a594a9ab6ed93ef602e57516ea549b8c92e24ffa8ad913d9efd4b52d72981c09fdf7cbd232181867c3ef9f5e901cf565c281a773917fcfe5acec9ff56196cce03060712399cda1bd9ca66760e9ed2bed3b88db4b6fd3592db90b89d43feb9fa4eb835c27fc7665980bbe7fb66e41a9735c5c7e1a7c605a329295e53273f2eeb89dc4cf57e08ece578f7c4ac783c6e8a8b390e2494da34d64d83044a8946944abc5a95d2bcc8366ac96845b2cc0c973fdcfbaba506a18ad54e84f1aaf17ab2beed1a5882c3700a8e7cf5b235eabd5e5d30f3e68d8583cf4834166f9ae74352f02603dd2d1b6631f99885525c5bb8898d9009060497e8cad60820c442f4093a876eff6bf94a14735425026e50a664e07602255531c6384428d18939cb9f34332ccef64b11dae097472c534e3953282dc1912f193d99db05e6973b165d712c05874ccec69b53346779b3603a3eea6e3615420f9b509839d5b7621da31ff15a783ff37022c03b77a993c5117a87f49dc41b1fad23904cba7c433b17283aa72454fdc8c4a7a71c11263c674e553df91c9f7a2ff1f8283cc7c1332911ecd61bf36068d5b29f797d6aa61da3ff15887f558fdb7ac4643ef1c66d2f35f33819d63065292123505de7eaf1de800c008f10af5ce6090cadfbf12148de66a5542e5f412be7b4fd037ce1f9ce26075d5f7b3392cd42e3b31c86c63e1ae9c410883b3e907a4b972a01fdf3ff069d3eda79737166ac98109ff908f787abf7571a1c69fc831afdd1908f09a56461ec2f6c98a05094bf8f99ba8ca80d62c3b128ac57df2084d2a46a19f8c88090a7bbe2f9022a5a82cfd085ea1c8f8f3929bf3eaf82c632fa6ce86bac82610beba0b15d6a00381799a302dc19f3e40573a6c8a109e545ba4dae73db3077fdcede1477aaa8daf20e4105cea72e57d0f87802745aa4c88541e461eac28f1dc352cfcab5d19ad881c7e3bbdced11917befb0056d706673ad4e294df828b0bddc1e278b12d827420dcae58ed3b6aae90c72837658eb392de66a833943167b9e6fbb4f1f36c9395fbda0b1465c0ae1a6ab09591fe0d40440581c5aee7393d80aa5afad4ecaabb778bad0adab1ef29e12823d9ac6ab32aff22aec173531a8af47a684abe0768788d52ce24384c275c973b695ae34610d218c856220d4255ce89e99c1b09ce16496be3a5eda9bef9c4a12729afd31ab6d44559007de93f6b76b57a6ef234bb44ac87b0ccdd9b64e6e0937dcd2f085315bff977462b93c4cc120baf7956eb596420653cbb7aa9e86f3ee2a1cc7edf79ade3a9858fc1a95d183f00fb13bf8a2305238909fa2b41b4033e2325b015d508effdda2655b67682b04c19dff6a29da2a854678af185ff52437cb98c107a958b7c5d1fbc2090a7b024c7dad07a869242be0195424a013f3d90693a5756037d7ba38fceb998e6996ff640a87f180204adb6d976b25c338de08a8209ea0977195426047bc0f70ee83c9535273e677b612e333a907db07367e58265cce6931be59f5469ab44e39ff0909213bb90e179345eb3a386e6ef7769b72872d7cf9b885ed7bf1de1d7e7006ef67d7afa090e720ab9a8b2ae905185efdfdd37def77b430177d69f93dc69e6afe8a7c9571946fc30b992d69c0c8f4576ba21233700cab26a0a3b7d55d4f4a93fe1b18d4754438e52e8f28db3be012caaf094d3747e027cf5094e259c441fce9b7c1b456f1c6c9efdd25856aa275fa1d8fd98c71bc1aaf93eef9f26cbcc33dd4f02556023042aa47de034bfd3cae35bad4bbd5c917e3ccda4479f0f88bfd93bc73ef09c079e16457f9d0827b52b44a07465632279f62040c18bde3e47a18890906c6d27813ca7e86f83532ce2cafc16eac53aa739dc0e291336cd318d13ca4237252bb124727803ba1d964dd12c62355cf5945955924ebd15d2fc87bd8906e727e3ccb775d1df3e0be6520904c21f62678110c751bb7a9355daecbf7d73d6e5ff42c0a8d9dd65edc15806ccf21e9c5486d2206fb2ba0a323fd90e373156a2c509ac9813d4e7a49976fd35282db46152377363c10d0086104037e19d8db4031ae3abc3770ba303c799305d991c05f701f5df2b49a54176c41381f740c71e704e29aac340c2721c0ea4bbf09e4195d5da4e9007882fdf44b40641cfcf81f862d52834281fade755c525da9eb642d67651ae10890b114c8866b4f1cb9842d463568bc26252327539919926a86f746a60ee90eb1020ee0baa629c0c8b499e24ea38b0fff286e49e3fea7b2abe386aa42e37938a4d880abf332e181c8f41d87c7ff22427693c28e4f1364851308faa262693326891af1bb9bb2fd58c381fa64d8d2971e326d093cbc60b9d24bff39762e2a7da207ce485ad9aee40e616416c1aaa2516bdcbe2a9c546e0c63fad02d6ecfadc072c6fe6dced5affe6b4ba45be664fab8f11b8f0df63fc4c6fec981bcd26d7a655f6fb1475fb83cb3362949af1a2f5f347798e79a92a5ea506c601cd0e92f1ad231aaf0c057aade6b39a25cfca7335b2dc7faceb9b7ad69107566a850fc3e1471b01ec2bffcd21c8e3a5fe329d397750ba7ea4c52af7fc870e0842e2453c2f0a9a4742f2d98597e840208e91ee7843636e0106a4dc0448fd77761b53436e237e1d4533ff071668cb5594473c32a2124173a132f92332447ad00a64568edc670830964fbf1cf22cf8a06bb8b00e697c9147c9ca4095046775944fae6a8bf9723f60b4f6a18fcb5ce69d31638bd610dad967052cf9b5ed3a7450b06a1dcf67dd8a2a2bb944e3f4611bb86fd83e2e5ac5606dcdeba2ea7f25fd81d717decd89f18ef96508279dffd21e9e8177257b89b4eca89e76dab71cc287a41e483c0ae266a45aeb73b8225038559c10d100422031d4c3f16eefb058989934107ba40bf39570cb398c7525980c575d98662d16d0c49f2c5134704ab500b8be3812a55550166ac6e9a2fd0c39b6aa4f72b72a7dfdd5c26e58580b0aa4934cbf0fbdbe5b6a61f8da4667ae3aa7dfb4de5a4476cc29fde4f65149fe64c9d8fb92f1cd6d92b4f0a1720a4b075584e00da6998e90a5c7955d40e69ae8ed774a1be6a8d221afc24b0b3a9fbda6d133502b24cb06167f6944b1fa82cb48f94f5f44367f5c78f714e98c70613ffb2245a883d5593b66dd7184797fb05bad3cb490faeeffdce1fd2f54abd0095272ed3e61ae34ee9f002492cd2a4ce9ac741c4977a68ca4d3eb466404ffb5f295ac86701400cfd5c181092f873aeeb96e3c1c608bedac08c1f3576582eebeb76a1682ad283202c92347efba5b21d189f163b1ac4626b996279894a656ff36b2503f662826a87a1334f34cc5b175a1e5d699709f2ee821c79559a2a8e9b7da9dd895b58387ea925e86e1a4d412bcbc57ae3bdd9bbea891376ba4f5efb39f06b473a7d541d45ef7f599b18c68075d9d49b8d96d246dfe74404b1902dd5d1b47a0b1e459d5949bf792ddd167e3f7dec156a6d083ebc550477c94145e144eb319ed03d9b7d131282d90c3dfcbea7cc6d4e8f8efc6344d248766d7256c06f10cf9e3ea0683a7426a168a0c1b2cee0e9c248b2f55b8b07e01b08994cac137fc7f644fe4e921da30f82ee8e7320f6115c55cb7aac0bfc2c06e5f4f5d82d219b990e56b84f036ec8558f33815b2f7e63ae8d9f8fbaf6fedccd0e03281dc234ec0d7f9d13aca1750d7e2ffe1f80c5adfd66d18b9a2702db3fbbfefddb2354929aabb1e1b86c567a9814c91810eacbcc070c8b5843fb19d97c5a1daab5f3c984ccfb0cea4f9709c4919fc74afda12a23ab2922ce313f2242bc32d4d15f940b52aa86f97f7f36a29c21a5905a8eaec8fa0f44feb50dfb055c26c9893c800e00445dd3de6af04f084a70b08c106a188f995be587d57e35aa70e3a9a5b1c16a92a20d6a24714bed2516a54723363ae76647b89425f62df7f9c51a5a91f9caafa8b3e1d4345d3815e047e8f3bd92a523344e4eda40dfc148daa5f462b4dc42e529c0029874f55ed12127633ac2ee54d5e3f4443e4059e3313556994b7521d115ff11983e4e036628d0fc3ba79a10ee055a82c2498d2c3bb8f221309d3e92204611eeca4f294df723d60f9bbfadc01cb9813ff2818f2070e8f94ee1de76f5d780479fc0526d9dbac819a8a90c64c886fb4075fa70aefc2bc63225d69884139ecb896ba3cf81b95721820f8d1525efd3d27f6a029e538a135c85ee3452d2b41b30bf9c9b4ecf697536f98b706259fcac4726683392e490d1b1dbf02695c79ff9b6d178cf58be77bc0d67657a7c69b8b8601db5b4d4cbd70ccd1a74d2e8cb9ede66a7486874b6a9d6b0b2e6d2eabbeba0274c99aeec6e276db92cc260d3467773462a538d2b1fc96827c453a134b95c0ba49c5e496337489c7cf722f9dea0f35f6140e36704629d1d7883f70ee3cad5a2def34aacbf8d01401e65dcc59242da4abcd23e1e87e5ee9aadd919427e551c0ddd3ba7008bd71b01a85d37eb7692f4de61c9add93c11838acead00648dc4fbf3a95abb6c4c7f5f8921c67c9313f909c0570b78c0ac4e2693e1e6f59d987e37fc4b3acf198cec927d918af4e7efe0e09ba682e7fc5e059d5df06e401528eb9bd1cac12a2fd2867f880090e40c94ad4215571442b5da9cb191022c29f3c473ee1a2ed916d5a7b5ed5077c0972d8acaf7d670abd012a97d2ad72008f860f57ef77e7f69d93392e1a37dfd025470579dc787fc2eda3c520ed0d651eaf48342747fa6c658bc721b726ab89b3e62fd85907ad00085a85b5db96b379dba668533bd4e3a0b9007bacad00aa9585c0afd9c09d7588698829653e5c2a10c60968d50c12ce154f8023228634bf73c4494982272a7c8954fb015bbf99ebda7c5ccc422e9e143ab78f503bc94f54a4fdf48f5a132b2c7369279011d5fc73375cf5051309b340917f827540ec9cf4c9a136d3da0b1c0fe70492782017e05aa7e67695d0240efdba160e14ea76ba2a324c94d97a85799154b5c00bff0be20cbcb7661102141d8604f986b190ee336f7f5ea2e2c408c04b3cfb34de17287df3d63e27e911404b8412b890ddccb9853f1165c5924f0b8cb800536550f0d410ba84f95090963f356263d190fc067f1c1388e0916a64043b426f4ce62724b546cb69575499f97757cb58c31b8ec6958477565d7addab995884aa461ba32b329ca0d3f6c887c37f1f09920ba51885934af50a4b065e9e2160e971ed8a676cd26ed5554610cc7cbd17b78019a22bec0ecbf70527b87fb432f10b2691c6e6622b49d37dd3b1fa9dc7ce5fb38bb73b425ea407e77205b37654654468d145a2b393ca15ae1e4074af15af6c9cb038c921095f9211c8629c6cfc5a4f993a7b2ed9a24c26868430cd192d3768bc55cb4810955b402479739d00912c67382bfbdd3ced5c8067b407867474f2ce82bad35a9999237c9033ad27c9c97825d6243c4065cb87bde20c391339936e18907de553147b44b1d55573ef20fbaa25f3c1a0faecc34a29861b4a15e0ff05d1560d65d419c23b8a647d7c35beae5ec20172ee6f1a7b007dc46fbee0f32e568353f7f95031f48460de0a0aadfb67f2a49fb6691fa74967050d681c16f887eca91abc0449d5889bdfa289b3ba5faf02281f0aa57efbb4da69f192c61a69b214ad0ac81b337cf4fe41428b0bdd63e9f9d71ffe282f9053d716f17e518dbf337b29a4aaa2bfa0d038404e7c87a990bf662c12ff6583fd8ce9869d9952c361629c8998e24f20d990b65716dc9b817e75c3b1889cf22eabf68e5346622e6e08e5d55727fd55099fbd14f04c39dc0775d39ee1e135327213f731e78c6768e01e33d20d026a68fc6bcbb0a65f02adae2f2f6447cd76bb10de2570cdf02776cc09b30f359897ff6bb63335d3bfc5a4d8030f905dadd0006d52f7c770f210fc746409d94b5b249cca178a0122ff01363789eabf9df2bf86fa3ae4b27b02b25e9bb59eecc8da9ea5a9f836aefe8d33f62f3c474e734cb3d349ce82ae36b29a018466f8a6389744ce8de0df8bd0fadc593182bbd9981c5b59dea648274e8226a9d0f09d921501d55bd869db4434b878d3e105aecd56d1f4af2b5aabca3ce1e6ac03faf43ce8bacef23bebc054b45687fab02d96b64a0e3e37a24433e36c52588c8feea3031e1270160aef1539ba45883211731a00ec319677e60b672f57740acff73400813fb9873bd7fc407fd115f81ea77e9f59a7ec7c046918bbfaa8976beabc73b333c80062d8259bd87363486614c4989d0d278f7d51add4b8c1ba6d0a61521631974197a16f763653c11b4d40b90b69a9b7c5ab08e426f7d431174544c85aa3f23836efb1864c6438e553a5267fde5a3bd61cbfbd3056da94b549b0c99428a57b73026911a10a9e0e6c96d065eddfe2c9e4974df8cad00580cacc4007396e8333f44ea44054435c2aa37f6fad6762bbda6fcfc64a1804f10eee19737c4c7ec5c2188611dbf48927344657c36b81292df3d410d92fac7835c59babbb9721ec059c7c134233164e77b1a1ba8c0edf75b19cbe14c7280c9c3c1b501d98e66e389b297ba0a5f43e05c60962322a25c6daff4b8a5630b19d038c96a7c98bf895e72f0fb3a8cd7de031bac1e4491e4ecbeb6f76c52fa65ae2209fbe0f4a152c2d7a09a5a086295e81649e61c459d8c873097aa50b3b88928085fdf7f309b52f8953e381bed33a14b611197f7efefa4140d7b95ca8f467e6dca62feb0fa2fc415e17252a8b1a701ed2c9946170a2f337a9b894143ad4b4c67b039dfd91805b200036471681c67bfb8bf097be45e0542a323ea3524d670fcfc020d0b6453c423a1433e1cc3f51be392618abfc6b217d876ecc5f9d3d25d9516070508b7731420e0e825dc21066b73655c4498 -MD = 9f0c0f9cc172a2780b8f378a51155eb7ecebd238579767af5cb643b5903e5ab7dce0202de501f061d467e4a8485e1ff211f9277bade2d389c9577d5495930f24 - -Len = 90520 -Msg = afa4a2c4fbaffe838dd149c78ea7851ea9396304b41806a093a90aae59c0c5bdb170cc9a7d22b90cbce52cc1b105108942df20c29ef3a913223b915e7ebc98ef135adefaa0f0a6441ea05920e868ce9d1ff6c8fe4dbec06a4849e5e55ad0627f9e09dfcbad414a937aabd7ca7bf845c20a2764a00a9fd40ccd7b0f2d3525a9d41a26d7f7ec3c2f629aadaea9b2dcff61c91afa8f1dbe6c617978161c59e2f8564f58cf65a50adc17444fe7a4d43d84e0257695b5ce4410d114e9029c0d30d46d0548cdfd20d2d91c413989a22b425aa9e6e43af9655948c46575dc949837c781039edca7a4bdafd759129c8dfd140b22d40bf34329249da235c5abeb431e58fa1201014b7bf3e5b25383294c93da1fb5b694c77b63ce96d34c80778b560e1040fa1946d1eb9b0313f93336c735bd1cc95626bf8a5b7ebcbf724f485b192e75bb838fb2213dde916411cbcee62be58cc57a6ae156595d95cf6fda2743d3a711d4740b4d24b9e3180c64f2f691bc79f613eb0737c8a593ab690ac81b2bcea06cf1973420c0a6d32073ba51b8b031a1e31a71a6c9c8864786f70cc22dfb50420c7cb2b332de4ed52f01db8f1b2bd287da42d3ef9d3f46a2acdf3e6f649ba2b47bdb8e2f8c67f712cf1e8e5527eae75063f3db89bd132bcba78b6578c8f40c1f4178f3513441eab187329c4be5d5b82706954f1d312e7eeaff614c8461ecd5abe4b9a9c134566fdbdfa5ce185cd58d324c90f852ff7686293acbba3c386c477fee087726948ccdb860dfea6595d0ad99bc4d9ed131d58daee22f7647545da8c4e7cc26295acd4e6f9149b8d996af6185df320942cf32d9a17ef7494fbda541a1556c7e7190003829fb49021d695bf11e3ba8004bdf74b32b978afbf97c2e5a3fc25247a73d0dd40d24488ed816bba58b5a184d976b856374b45054ef98de3bc6b5e549726adb6a4496af25b3a3b6c4f5c4e8b6cc7a4c31a35db11cd9199f2b5db78d4c7b1e5442f5d9e48f561a369883ff82049315b165e01b151a5e0858742c4fb21769615fa349735194688222675e954cff93439c465574e417276cf15c5c05bc73e53be4d768ee5cfc92e4617aad0eb06e750cf51d27f286dbdc4d512c1561142897b5cc2479d26f8e7b47dd1999f0141ae078a432811d642e24b3622b7eec20fe26d6fdd3a4a5f113cbb37d8c4ac5e2cc7d9092cd897ce4d8a7a70ba3c02d49bd3ba7602b13f14a542c31291ae714814af45ba53667976fa00e3034da02acf72c7d2edd76eb3de11644c7c90c9866595cece1c6b444f66e4f0157c5196df2931495755dfa57122024bb8046aa8742d2cc0d2bde91482247ad2723a7a82986833d2a84c6017df76e453a61863cd93054610040d3139aa26482299cc0cf5df0316fe56102d1857433406974720ab9b847e26d298f8363fe2b96aecaf9d632b903726e16f7b29811d8deefc0f25c4d631318fbecf829cabf06b15fb63b04cf68630d6cab8feede57c3e7754def79bdb820cb5393f84cf86c5c9ae4676ca35c85b80a8726b0cc7ecd5d23a2244faa3240d7c21d257635148d941ae4e575f903996a2f68914493a0fc0e591f4cfc37d4819ec700ab592d47aa18f908393f4fea2be145b7f3328c6e6a3f5393cddc68ca05dea0a42c8b7ab94c4ffff76ab1ec39c384131b5562ff0da156d7a7b0d9843d540016b2b0f36491faa1f35980b21a19e9bd633dbebc33a829bdae03fcdad554f46af1d2407935f83d769fd8842c1fb226f4fbc53628726588daa04eb9c6a1386f86f9abe20533159c36c91a7d06442b018fa45ac68e026c48177430ef8731104dbbf6e6a07fa8119f493ac77328d1ac03f726a474d62ce6f0dbf453a704cd051470af2a82cfda13ce18ba886e7a0e5fb294494d4ae838fb098de65ce925bd3f4e0fed208fde1244b209110577e3426a99ced5fa50ac6ed21a9713f6bbd248e582ff7870cf9297cbd28506e5954eb7f53d0e91558d0b1694ab6043c727f3b71f39a818c14ad4b3d1b6f562d0d1a0b32928ba460609eb776845503d7734705217fa7295bb098dac7ee7bfed7032c27f2de13cbcb5cc36da776fcfcbafea3161f24dc5b60713a3cbf9ec4d6f6ac09c632af0fabb09dfd287e9b145b317521f2cdbba09444d7000586b4d05b0698316a648de5e0baa49a9c6e5931abe567320fbf8caa60834298a9bfb93517713841992ae31ce734112a1df939eb6b415561d15710404c765452bdbd245988e10ca8b6d8574b4bd7643a4191c59825dfb01ffc36ff18b4c88ccca6217eb41bb095d5680f42c77aff0e299bea84ce481b17eac4d1a17a45e44c74e76f30eb6c7a646601324e37f1258fa67145e0045e7ded50efb9900b5c4413da1608e355e7a8e8c936e3d2034ad5590f86467fc0e582b0c0c14153428472836aa680fe8a19b6a37d5d8666cfe4a90ae33f5ebc8a59c3f2d8de2b53963afa1ba51d59fafe7f4e150109bc74e45afb05b001111ed747bc43f7baba299d0c453d27ef16513984b9cdd2bfd894e71a55ea047fe01f2e1bd5f4bbdb803dcd54de78519028a9b1c6942e90e47d4f4eaf44284f005e45f5629ba583b510188dc1404dc0a5135d0dc167c79a1c0cfc91864030fe46ee2bd3a887d6eddbec4274cdf53dd39268f383e19f297ccb2a35464bd4a4909812293f5a250958b4673408d777c928fc9c05dab3c4b4a7763771d34c6be3b4886cd69ef3fd9d62d32365c07a42603f281efc78c45309b8a1c74adf14808ec8ac40ac88f27c338abca3702222df9374b9744fc47fd4890ed25c28b040ccf64b58402363f21b4c4ed569bba46dc9f368353e886462c3c3488c6883fd3d7bcacb20edc3d67f75481db1e8d0ddb77bd0880fd03edef9ab38c4347ef52c87477cb6aaac1656d6f4d775e6a338149c7feb62cddbcb7ac0e56a207ef1e4b4aa9a7c9c4a0d935ba5244ae5c81b5a0f89407466e3b3c6ee452cd7dba083db2c040f4afa7374b35b667e42fbeac3cf250a683c32d5eab99fe2cbf2546d8761094ff0884fdb840edc978d2016d33f0febac41832538f30c16465d4a391a8efec2daf8850ad6bdfe65c4bb92c505ef84c9cb86e9dc716f36d7dc5b5fe85bfd0cef3181f1b9f9851a7d5aa3fb94e747c645f482e0b713b1d25b1130a3e0967423e4e0173eebb87bdb89e5b0caf51bfa6cf6c3d00853946d67268197a6c04e66dc5a6332cd0e9804ca21d26c91640859c142a5e8b12077e45da0a9dae8e608578ea6377f3ca11ca26ecbcd51ef6020f86bb007578bac32c93e7ff684eaf048c8b36ed9370e31bae721ee22eb25881a58d4c58486e855598e721b04201d4d843d030ad4f4a23ef7459c1f6fb2e43a48fd95099a1167ca50a6a0f83f26f07c4f16c60097529927564025c620239c05314914f2a4618a69cca4439e142414fb0e08a4e6acbb73996c595778d0c7cd6767dddcf75ff1b0c201f9c2733f81fb584565083391b991f38e13c9adfe09f8df612e65ae196c7b41a539a62dfddb03f289ce686dc2b7a4c44fe1d4ec04849edb91bd477d6d1c6a873ac68714fb99df784fa75dfbdc300c9a365601a980a22ffa8e0cfafbc7abdf011732bdce9548de581b7251742add39d3b5e2e87cfefd3caaba9fe88fc575792deef0e2c17752910051d1db5d5b09cd0f630af1ccdbf0456abbd898cfc313a98c16a36e840e61980f9728641dd93036bbb250a61fb425cac8e65994325cf0e09a12ace98cb6d043d46ff8743c21faf75718368debf3f84d33ee95634dffb7cee6878fcc422d39350d20c4944eb1c49f60293f01c828024d3a191e7e7937b2b4efd9ce8f5acdf6dc087e1f4ccc25278f7559dcba2adcbe3b5a1a474e4a718c53148debcb2d15b3a954cc5af61ae88e57e52e920f8a6e96980256c27b4859aefa031869d84f90da4d70802a28d17883896e1be18a7d7a25f3c142f26de93c953a1a0dbb5f28cbf518fa5def6d765181844ea66db36a6bd6df2583699ea3b6d993f7d262c84f237e9c50aa2d3c701012d925527902d7d043aa9d8c9a960e44d697fb0af2ac2943e157f1f9560e6510a20870a4a5f15c33d6f697c307dc9f532696b21bed635d89b7dc7cc01c6bbbefd992bf2167174e031b33a2cb23fadd8e4440ab99b58642718c8a4f92c2ccfb1a13f87f3d5eed53ca8af25d0981492f42ba0645e8ed9d7ea7b9e1f8e5fbba890bdbba2f6cdfebd3f6a0b31502b2602b1cf2682f9de8117878da93e73e29bd0c41ab485e448c7b6513e6e6794b09d8477977d6b73d477ab68168e0b91fdf3cfb680d336a38c7447daed80cd8572a1a1ae4c4d27b2b8e41bf3def88ecef8eb2bcdb6c0bf1de12bf94240ea6e09b858dfbeb640bfa0d2eff092ac8dce131aad6e7086222738911452f1fc544f09c9edc9109dfc3a2469c1b1ac49f5d349ad5e1f09b6a277dee359dc4fec657a6eee86e40ac929a025c681e6a87ed9a556f729c7ff0fe7b6f61e1f1fc5d7c6f61e6f4cba150270fa8d325818f011e14d244134edba599aec688b91a2b9841fcb039466d29a0f794f43f36eceebcab4d299d2a719a25c62221c72d4ed94bc170204a5fcb4ffb9eba72f51ea900173fb3c9ff4abd41fdfe85ff91b1388bf4756a108e938e9aec86e0a3996f4e69ad25d931ded68a499acd3abe9cd74fca0ed85b3f9a940f80d04ac814908b6591eb183e0fa0605147889cc0ed4d11fcfa1764c3dbe2d3c6986344a1347f15570f5d6142b2087aaa9243f7b91a0703d8c29a952493fbd55c57f22f3c91b97fcb48809b97a76b881ed0596873b36eff6b89f4f40de64a1b29262944da9ad43d1ab3d141ad7e4e0af67835599157e9971dd6d30bd0515207d5b965300bee53cfcdf7dbede4952495f9f0746582560b5d782fa1472c53a83dba58327b50daccca6d8b1ceaed9a839b71ef72f6d75c58a4f30aec30626bb13f6fa91d714a0e839f71c3f0d318dcef9df6bbdd97f0d9361026ef10422308015f6e1282dc47e83cc16359143106fadd1000ebf0c37f3b48218c42ba16eec71d403e3b0ef6eaf63cd2cab0d37f2872b084290678f3d310e35b8bac46091617797438791e6b93c728460041db380db31e8cc781c2c38cf8bc20ad9240a349778a5e15533da4e2c9638dbca287d6276a8b7c74e45a9d0d3127037a8b467fe975d4703d5ff93d487b933c484965e3f5d76be5a9b4ccfae478a8967b0da3e98680fc5d2905bd8f455c2bb44bbce1ebf9a8545aee598667a32dd53c177ff58a9127567750db072569f991983f63a858b33bb94eab79136db9df2176e878c7eda9e767514d4672aa16d2695a8bd415b4b3302f237969f067a8fb11c9668e776d313fc36d96ee6c67dc55176dc984b67a69f41a9bd0c2aa0ff1002ac5fa07a083b79eef3ea62970e94b102064610c072458160ffa3a09aca1128cd0df4b9acfebbd933f46f38e1cc8b38218b0fac0944d0e0463d12db574d58e0fa887b3be41ffa3ab58191792bc60d62964e5ef58ca5eec5ddaa3143c9f17e3f71651dac8c32a1a45be277acdfc5c03849975c72b25d47370c902962597d284e1bec01960b00571f0d5e4b5964914cc122ae30abe333843ebb3521c06dbb0014de655080c951c5b4b33e320822f25a060ada042888f14de2d2e242e36f71ae99a31731f32eec926a36cb564281b0920de764fd72075d492c3adfb455c568dae5534bcd76a29b674a7c4adf8ee9929be0a3944510ca402123d9749e9ed9682b01d4494b918d24ec5a6e06f575c2621e8724b2048a37617dd098e92844113949f41059d4cc5750c8a4f446be7e74e6c20854066169b88a03395f857cd1d7a2ddc6edc390b068e7a430f751653167e7306d19d88533b4815e681792bfcd926c8f7f55cea6c428b127045d701016032c0fbe5d6f9873930f3465a6561cbea95f06282fc33f900076fa2a10ebe8b6b17f08010714c1aebcfc2e36f61ab92e8643ebc963ea829d56fdc4aaf60a1498d7a6c340ff0f286e9910f3e5ee25bea490e0e568d88b9872930f2e8af915bc44df6ae7822da8f63a91132c7a75c154a92ffe9d0f78eea8982074e0d400530a432f931cd07927539b0ccc80fb7534a3c4cb64bac52a5bdb9563f48190f20d241c31e90c31cbd3661872049872d5c7d27dccdbe593d61959f3c656b9c4b98b32574b345dad0bf558392c831be67dc2095c9b2bc67f64714939b064327a3c155d7de73bb74c21d55086a011b260546d72ea9e1c0494bdabd3f089e491b963f3cc156cc7c317f5bb7788377605e7440f32ae3e7548d7c70f219fb89f818a166ca9a742a028156feff5c65979bb8335f27430e30039526be458cea75da8f33dc919bbd18e8f4e78b8f1c86fe47c3c0d5c5ef9f683800c9274a306bde6aeffc05346da8059a0cbf6609317df7df21bb5961890ddc7c40d220528cd62013cb3874f588bb9c80293d32d053a130dc32715e8cb7d0294ae5e05e00faefe78fa197b087757e4a45eaef5686cb9715b976915999f49cbb2e606214d812ef9118f3882c5c9c567b55b254658f31d633117e79ef3bb7ba2e8130d6093a6d7bc95a41885cd795dabc3a2ffac47bfed5055eaab963c489beeffdd7ca8fca530adcbe0c26d69ada71896da44117bfbb1a090b9bde7bd6d3217c0ee5ae3cea6c1357dec3d20e18e2c17f5acfd5c3dcdf2baaa2c2377be53c785f0ebaff852d313bd716f91887d43730eaac03175d55d36086beae7308721e29f5a7f83cfd052adab7012c78c85f404667bbde8448bd408f19b9c11f85f000bcfc550df50904b1768427de61340cb6888314c2ab0a75aeddd01e9a7b99018cb7df806ca63d9e7da5daf57f607f7ed26da941400a370166f34667ab35a6090a90fbc4a4df0f54d7df17f48004ff285c6c66bbe71052f31155f92f63cc318912eeed9c46fdf2aa7888b79fa0ad379b9d1b380f186bc2dd367c44d064bdcff42e082171b3818c11a849567121f7bd4b1ce09995646b1af22eecc5f52e78d5fcc4a333ef7b08301d0f8760f3b442f4a96452f7f94b9cc004931df8f8118be7e56f16a1502e00934f16c96391b83d72490be8ffa54e7f6676eb966a63ce657a6095f8d65e1cf90a0a4685daf5ae35babc6c290d13ed9152bba0cc76d2a5a401d0d1b06f63f85018f12753338a16da32461d89acef996129554b46ca9f47b612b89ad3b90c20b4547631a809b982797da888915b72e26d6ed6439bb254152a21aa59e96fb12684211bee0aca1e61b2014645c69558492487b14211ea8bae5ec308b747dfed8a4e2344b4e1f12335124191dd9ff70a4e14f868af6fcf9073e25b760ba5a63bcc80cfa34ec41b629cf8c32da883dd0351bd558ee3fbde1cf6537f54ff594f065dba8a99e427b546e9f41a7c3f28c3ce049c1376985c828ba6008337daf936e7ce59d8ab3d933b6aac92ac0029e557d4d71fb6c234f8796723982b8156fbfa4a8efd5e59b38d2a286532ec5bc14fe5b239e6a3e432561f29cf88cce3dbe805c92ff37027ee7c1e1a94737fd1cddf19e0bd5f8f7f18fbe06e3a30dbb1d233e5ce220ab28836f673bbdac2cb14780940eac208cde57160698ec44efc8df26616d3f5719a0d2572b77678bf42968855173af860e3a9a41a27162e2193da84f515751ae69b39427775f51eb79ada5758f94bb106754e599f859eb867362a32776e2c12c83a6f168b2b923d4a28526d7b53a79c47d745ea571182f37e57ef53539d637d950c410a1434e844f57f814332d2d90ac39e12ded7575d8fd57dbc90100fa5abeb6541a5a94e61d62804f97125e35a9d083e57bf96d398be0b1bf45143417d3e29e9d361b0c49961806d3d6fab01a6c3644c67052bf2cf2e9db7391f53ef5494ef1e88d6d133e9676cfc9fa768ba380e862cd337fd516b51fbd3fd62c845c6508957d47d7118ec586c47c2a0b579a8eeec742ed0816bf7c8b406a3c427014cf1a74a48be26e01cd4fcd338f437cc53d4e596dc576e9efee334a3eeabe69e42e8b75a58114935f53d9d33551a562ec36120295e44fb86db321c4010928d6962b647fc752f8e670022dbccb97b972d92142a904711eea02745d97fcc00921f06dac7c542613d0fc7f52723d89081253a5e436009568e776d9eda97738e8b1bb9d6b539224efbaca7550dbd35119ab216a0290d278b7169189dbe4ba984deebe62aaecca75130aa38a30e1d51474a60c19a3a1c24192e11a2d2f2f0c09c040c365702f4340072a4f66f96b8afda269dc5ad050171982afdb6cef71b7b3ca0f904dc50447ae548096b2b3603b312a5e59d490851b270ee99aef259401bdf2c3efc3b1531ce78176401666aa30db94ec4a30eb281494bef5205dd87f3350c1c4a56f3d040b12167214391b30b121697a7915e9224b871a3c355f111a9493be7b7df870ff5c589bdedbc4dada062b3072ac2c93590829ab26a09dd74d6eaf714e3e07532c57e099215d5ea9907622713bac1df0b693a1f81c2bbe320007cb62a6af43ec7344d398a362b0923a4a2eb53d418f0821331889849c6b2a1ba9101aec9a5545bd6a581eccb2629cc0cb7682e0322ae48331b6e7c7bc4bc8869aa62086c5e466f01298b504141bcf0a3e23638c49978bc2d5a2994e5307132a22b4fcdef89955f684bae4b352833401ee5cdda94c7e05c867052780294614ed8b62375afd1c1cb508e734413243d28b224a7a9f04865b7b2f061ac405b1d1b81bda58649b14c317e6472b167d03b2912115c1d6395894c575cef984b1ef54741c41e763992950036501539afa6adafc34e43ab7b39cb88d80844c27f3a9a507d4c26cbfc004cd60ce3e3436732154b2a3df6ea839f9d0bb99519c159487ca5b8c8270dfd84d411869255450aed0289db630e4129517e336085d6fb55c30cd568bac7b2da9abb5127edf3d52751e5ca4b5fc245e8d9ff9e815cf5071124db5e21b661310fac73036559377a28eb3faaee76eb7f2ea391ab808d0c4b080858be682d8c2f09449ba6c366a88aac13809a595ab2438738c4f8e288755db6c815649092c0f3640d85b9c688cfad0d855927007def396f2419f52be1d8a589fe91ef5f8878248c41c1cae3420557e99b19cf7852dad762dff13ec12b9eb90e164ecd19713a48fe8bf048ae24e1f1bcef52f2257c0d93fee6fb2456c8401ebf99ac7c52df8fc7376661c19ba40e20f3dc853d9c4c0ff59fb39844314a653d2b134b7b9045e135d34bb6b41031b25c1afd311041555a82c1c0491cf51466aabcfdac495626c6fb3ec66f9eb070a719bebbe708b93a65b201b78e2d26d8cccdf1c33f741904a9ade640fce000c334d04bb30795683dca09dbf3e7e32aea103d760e857a6d6211c47655df3665bbe4164e5d1334d301eff0bcffe6dd95dad97fa63a0ecaa7b197b55b6f86f073cd4d524324aa659e19501d2145fb8adc1d70eafec04bf36c959416f21894ac9f69d92aa6a43da60dd692d5a560a66982448f260c5bcd733060af5ff6cb88c96d340ff5f5563d84b6dc10b0b5ca77f81cc28ca74b46f3d877b53206c602c3e5519e5a5abba53a703d9c5244ef0dd0c4f029e1f5382c5f71c705d491ec58e68ee11b60af763bb4f6f699fff89d85413ec0ed27865f7680fd82d4ff87d6385104803d8b8a91641d97665742526ddb59f3f38ed5d11dafd8ca5f952b6f101ba404d3776372b9c904c02146f1c8bc7a8b530c81756c2f52f776a1e8e09e269d4ffe4f4b60de3bd4eb0fabfb56e225ed45fa70577ecdd0ea3d70fe22a7cb8617c56f584c0c43b40240d45ae71a2516ae2a48c3936a6cbee04b47b8e4f94dbb25a4b692dbde499efb96ccd29c94182b2798dc7aa7b0df45df817986924dbb32415e92638d5f36790b6d47978e5d21cff422041a06fa7c02227074dbdd2d8a97e563515ed2f7b0cecc24e31e2eedd8719e567e0653aff98073b8c82d08013238ac4391e93f403f0cb86e1ddb00ceb2ac8096a8d40039ae2d2d9ae1fec57158a0e08fc2a734b147bf5a995662b66836fd456303178f202074cab760d577f6547d3c9861fd65d351531d472b298252dbd0476c1b25631be703d59eb32591f8bc0a1b0e0e70252ee2648af81aa4270717d210e25fa22e556846d8b15773c5f105f3f6511684051c71603e1c9367070d815f3c964ef243952aaa3e8fdc446687b8b778f218cd782494d2813523f694de9ee424c877ba3533b4ca918aa02c16254ab0fd61939110efb347fec25ab762e2d70d6429685e95b99d145c42417f3752429d0e40059341d6531d2154964df3b2a03775197f43c7af2a1409474ed25c7716c825eded389d610ade735c650ec9e6a10ec2194b2e5d7d024612fa16b9e83c6dcedefbb8f5862831187f5a559e57c75fdfe5b94a62b9cbac2723eb378a8cfa8e1d83da075e9e946c37afded661100d13475a7a0b858ee39e33968b3fe89d3a1e30df0946d8392e22d88f4a65eb94f081b19acbfd0b3f7d4ef8056a8e48ab9384a52b1a05f6f85deb57983d92b2594a21cb113f9d683df134e0daf9a12f3a6f67e7028cb33f6ebc2c514518db49df5259e078356b211ce7e68a81c926f0cc461e72ffc1dd15eec17c42207cae1699a1b09e1a5df4da5eb9ea51b4596e51c3b03ee56d59e21efaf641a6b4c989ad0ac0bc408219b8d865efa6e2dd1b15b6d3364f9af5d570cf35d312eb7c900c71b537e39449e935bfe501a29a569e8ba45d30a7200394f78b01d076ace25095093b6fbcf5cc4cda053e987404cb445e8ed437fbf12148e4f6f186c357809bc1d7dfe0aee1a3d5342ce50c819ea5bcfceadac4b4aad941d777875ebf77c1d1f17245233fe44ae2d2bb7ae651e47058e54cc36f479986103da135d0919a3083d24cfdbff67a3c26141562ae7b52a5b8b63940804b69d24485e88f85001b5731b2dc5c1f592ff1ff96ef2edd5485c04cde14b4b03688285f5ed1e6d47187a05c31b4f2b9ee5206dfc98d51eb73ea6a95cb83a2677f6102b116e1fe576c6b9673cd4b54180c9cd5573a945e616ffcef241cea9c2eaca0fbfa4c8d18766743c408e423f2d25a7d07e65888b6d78f39c86830de046e34b47e8b7e57d7c9e88c939c24c351415e5ef92da1defda6882da0e2a5b26dbebe1804f50ac6aeba66c29faded9de21d6edf336db50b8556b144e313fa2c5a989f4819c7a05e2fd0786242aedd38379f225a3146e0930080b11c198c9c903d745ec13763ad82bda48408171f4216c47f1f7c9d49e309d19cfe1fcebd0b8298ea732fe859a0d8ea9f1010a79fdabe1b159ca2b1e70ad48b03fecc4d15d577ef5382c0a72a18d53938b3085e70f592adfb4059398ee6879f6e49ae4f2768e4c357f43fee5573ec2bf9d37bb6633138efa8912c7ed1f4a7812455422f72645d97504dfa485c5092355af7d749c70c1562a61588fc30b398c2deb80488872646fde5069c2fbf2d6bd7f496a7731ce4bcb96c33fb5c3bb1efe6f5c881c4c64d35498ea4721eee78ed963f4668ece55993267372fff9436e216ff22d267ec037ad0ca5ae38907aa17bf2937d97f1b0e93d6c4459037de846b1c06c5c8f00f57412d9c29a4c2ee455bb7fa9b2b13bf0022fed676ca234baea358abcbd0815e6911b137def1934abf4109fea7c41263332cf1c551458c81bb711217be54e08140d0a6c30134c5c421b0fc5ce30d44aeb09af8b85f6a3928b3bc917125bbd61fe46852671bd420037292d93dd76c71497e555bd7269ff4e99f6e1ee2896d2be05ebffe4cb3396cb0bacee8c80c4a60dba544624b304d836c866e019271d2a76eb5bff19a51cb7172024c71260910da0d2e4e553c05ddaf5870a482a86552126ef14f75787df2f7f251f4bc7e5624a787205d7bd12bb5405565f8e94ded55338b1b56d00ec016c5d7afae11f97cf08ff083581d332c3ffe0d6e527da89243d36b3abe4b85a19fa4ca2462b7bf02da5af06026838a90e2b125929a87e2db84bab6566e2e05a9f55c73b9f8f7f7704ccf31beb1f5fddd052048dab84f225180b015784ec1b55e80b579755819c94fadb758a5e0bbb49d12141c4c941d917a9f7d2fa6464cbe4aa87785616a655e2565da101d9b1cd857705549f3173957e14ae8aeea3e1648f5d6693e831722de7ddc00ff2fca61919487ab78d427ea9b0be7bb374c1e687ae670544de5459a71dc79f1cde256d306dbbfde51f9ad7a8582e0bc75d3ce8a7ca5e000598fdd133dcca674233f25b760b480b57b69922f3ecd9bb40d8736c477ba8c350b87c8d66dd4cb53a94c2058c6a732f99f2cbc52ee74826aaa703f5e93aedebb0bd7ec2b277d4e5406132ffd613d3d72644b152abcfffba8f297cf9ff7073c5900873359934d9840e29c3bed59fd09e873cd8401d1f770348d03cfd0cc5010d9929d84aadbce11dee7ed2a71d570fe2373baf01d55e448d724bc2839390ec1016a23c664248821f8bb10e6d1fd1c85ea0d1a43c76f4ceb595fcbc02267cbb79a3020e3d099023154060d5555fa8b0407e9f6644747b9c182e53781d37d0e5a6b8c9dc2365fc4a7bc71ea6145f445e540ae553be506b2321a5f085293a460123e24a14bdea156edf5a3b1f1e812d08e5e0440b0e9d4c0a6e874471aac044847d9a334660f854169ca456aec877db6692995beab9ad86985b5cdfbc364c44e6105af5efb13330c8502ff1b3c6a5d7fdc6806d714423b383749112c34040dfac88af028f230d43fa86478cec8d9d9b151e50293d32724b2246ce9e255d306d5e430109933af906239ba598a781c19d62f662ffbd091bc61b4e6fd260e1bd8661ebfb4baa7d88efea2ca4958347a4675deb43516f4ca2bcc507ef4ff4722aa35dcfe869134f2f79a4a5df13fe43d8817c697bded2519987b5efe7776e832a5cb87b62e29c347f2bf993af94770ab06434fd66f864cc52bf7482c2d92d991f0af88af54873d1da8f4f72b0878c00de981e13bf2eb52170ec774d0bf5b0287b56945b19fb588bd41c1ccf6c6dbbdaa5859e48cef241d5766734cb4d4d94c5e19822884b7ba8e6fe4ae8064dd774dcc7c54c0920d3797cd5e84369f15159d5c468198ef459e357ab9447b3df25459b97df9dd15f52ea7c01b819c582916dfcb64eefdbcf1696728e90a2649b07bcaba82d1a3dd4e10347ac8f2e5a8bae4f8f19a52beb162240bbf9c89e74fbcf38617b3637bb1c1e628418b5f79576d88d2171134459741d70988f9472719c1c477183937cb5af6b76a5e8c51c02dec095384f11cf935358849cb29ce4f6d65f784053cd5fca1948be219f45022f2df6f658261924255e741b2d054a6c51450939425e3c6774c446b78b9ebe2076dedc3ef57891f88bdfe092edea055f3d62ba091c15791a323ad5d14889891d767bf0cd84c924a333623e9a53e38653f7a9e276221c0bee7f0786c9ecc24e4faa8fd520aa9a49cab88fee7fd39425e13ca502eef8d45d5ad794c9dfeceb763d8f84e9d6cb6e69c597b360e1f15e7c6d68ceac0204d0e5f5c87d2fa1cd67797d91f5af6e6bb81d2a3d77463f31a4e27f08913e2dda844e45be2b18ae02b8f0766e4ca6460ff9dc6f2635ff06192a008c989749e0ee80fea145292553317253ce51046f0c2cb6001afe8a0bc52c304f2c954b5fb9b5396fbee9f1d64fbe062bcc06b75a1f467f50a402edecfacf6a36c58b17d026c32029e5190f9be22cf6d115dbd007fdf1b82690ffdc2325974a4fede6974b969cc7a5ca5efcf6b8e2c6fc226ce8e92692f30a7821df4ec3f823030c344432a7b6b27bb53824674293f8f588166c8e37bea264b03551b05486b6f8b6f0a925d88553145c11207e0d94ff65ad84c5679fe958dddf96fdf865b7588964a83085879d3bf825866b9b788a6cb509249df5cd8788ce5cc31ea765feaa4d9bd774e25372df9f9804805021d8a37c317250b95f3db4cece364e1dd3e10eadd2ead0ccca9ab0832a27e93c88044623acfa8842b3506f479a8d06fc3df30832906eee953b69514b524d10a11991c733d2299ef268840ad15823c3a312a919646ae028dc44832440b700913e55059925478c2f78fd3d39f47d971ea2e077d4cba8cb1a12646cbc1bbecee554d8d45e90839e9426dfe05f197163828c35e3acd0f0ac3cd8297a8b34d0247795038269de0cdd778c8f01fcc8d9f579cf7171140cc8fffb8df2511414919de26f73945d9659c5442a8936857b2dd96edd21a4acd7a822e0b45d74e93389879054978eac31d0f284816ce2abb8d38bfc35c4f2d9ea04d186dbd95a6d2a2e9e1bd4edd5d83928c1a311989ab1fa71998c89e9f02d8c65785874d4763260d73def70e51e5424c7cf3a5baac35ac86e6eba29ff010a675083d0100d5cbb6039e385b92bacb28d2487b4e00200e89b4097ef9672ca02e33c80782db2827ab0bd2b690e102585cab567ad1f3cb7ee0b9e81976ff39fa988bffadb2e826be2cae77213f030fd1076210b8d99b96cfd61bed86c06e01660d0215f53a2eb8da6272f5410f01cb81507cddfc0c01694795647e8c80bc6a2cb52272a8c2b5c7c175e2b5dea9e21caf60832410122c2d30451b05f25ef25e93b7727f8ef18639bc8c831dc0b4aeeca25eff4fba9424c8d00dc9e9810117c4e43b7aa26e70a8f813cfdf96aed96d22a37376c5c33af2247016f59201123383686bc34411e623ea0e677d8972c028a6fac772eef3ab9d28578827683a384f85646dd4ce40fc00f9f57ce55cd210e760ef817a3211902dbbcf8ae8d3f31c71b1236935a6c15a460c0f35a0799772b038caca17f9e790abc71e44be3bf666a4efec886f365ca7fd0aa5bb3546898d8d16d2c9cfab3b541e338ddf340809bded2706f109e5db8c2dddff362c2d6f0a85e250a72db0d6838ee76483cfa2f5c95641bace8b1a04b0df6c65cd0e941290a0848c8bb67080c603caeb5719718133e62650447e3fa1bc1b9f1fa861e53bc8e7e4ce9ef45400c586c66a8499de77a3a5bc107d69bb7857e75e74f0b087b05961ea5e076ec220271ec22831d74f9dc09cec41a1d4f6522a4d91aecd80e23aed177f83efac23a695d4a76e875c2dbd33d29f2dd74758f6dc542013665b5ea0290f89877e37e05bb6af5b84aeafe19da34fbb1a484b492e1604f3ece4c863acb753f1b0db965f0733b7c7b2cd58d106b91c29511c6731c08066f3806e5059243feba0472f510a72b3f4d3400de067bf1d40d21a7a247875c18106192d79a8d168dd7d93a1f14863df6f687595ce0a9276c39dbc8a098615825e15fd49ceb87bdb336fde5afd80a45f2f6c9a8eaa21456dae7181769ec3686a030975e9d4f2e940f5606e82fd1cfbda3cc9f71ffd16a1a90838af636b9835227ac8c93515bce53e29378d40798331f89f65d4714d506ed3d9d98f7bf96b4651cb3c4156187f357dd9dc81bcfa1d0e625f2a79ab253774922a3c69e6cfa561a0fc4b257465a4a2a60c36921f075259c084fe2df60a337a8f024985cc75af4fb717dfbcb68591f461cb2f0a91298adcb917cb3a7a86ac4a7169e82a5474efd83d23df4f45ffb0f3551dae2f39e72d5df61e78e65e200aaae16701a2a653cfc3db293326495b68672b0a9c4b40c9a3a51fa4ed7acb61b56387057c33eb9ab6da3830c389e92220178a9adfa4cd57547cdbae123de8cf163d0a4a41264bd20ce3fd4077c04ddb42cc1bd66082091aa9a9d246cf79def493ff133f38c3ed8238a7d16137129e0e354e86c5072f1c9908f6ad730c74d458957349ea4a51fa32a4ee5d9cebc904436165726fbdf22d5cda29143eb178f381855f55555d1a996ab78048f87b2ba6032ed987dd681264ec880baeada6cb62f9c98cde885a64f3b3d9243b7ecf81add504716e16f1d8ead0786424cbd3b54a48cbc28d892a78309472a4de35cf1240424bf6cf22418ce79014fc1d9d2080d3f4f1c80a62b39e7796eac6d825642888d16b31510a3f7682b5c39a422d76722487a568fc1bdf1df03faa53d2567409ad0acce79dd5 -MD = 099417d1f998a3717c085abec333e1e3d577184352aabc843e23ec8cbd4b7cdfc5dc7e42ade402189f2b310e3ffd7e6fd2d722d1a7a7cfd3ed9ab6293160c972 - -Len = 91312 -Msg = 770620f0d9010dd17f72d665324dabeebc82d1709fddf2b7072ab89bfe9e9a83df72f5280dd15e9ce4f4378af08c80bf5d60f0e9af37449fb4f8d8a2b6107463f41468c554a7db23529f60953c63ca6fa197420b07fc96c9dc91d453afff1826a033a24e154d2b70afb9790e7d9b32076f71ee5d0df48f3b683ed53751322dd4ca19ca4bba89f78be58bac7e1afc5f8eae341c682ae6d8ff414703d405735c765a0c0944aa24e77ada5d1f6c7d4efa0c4829f6b2c69b191d4df485b531884d12375587c24de6a2477877fa600d59aa8a2498a1c54adcf99b768d845f3f3aa7b34b3c6b4c0b96d1faa52066e232e5180e2ac948291c6f2083a359275c9551125e7d08de6b4cfe1b994ba18b7b54b9eba342031164a61c37ddbca197329d95381db50307a678e4292e514290b2db9ecc4e549024004fade6afa8adfb6cbdcebef7db730f85f711a2c09f4b9d10305c631948b6aa857ee8d40351c57c8f5fc34ff5d8a11d90314d2f581d04dc1cb9bb570b06becb799d97aae09e314225ea3d911d92d55a508f5f78fdb3b5735edf83512c77f0ae6613800f4f773874b6c6042c79f257ed4c771124b749a58a5e0a7bf88581937cd3486cac56c4243ac85ae0c911e06eff0c5229dc8ec71d4aa5a36cf51d0df15c49a42229006d3bbde5109910eb4563b8198970478b1565daba101eeffd0450774f8f6c2d525bc625944ff6a811077e3ffa82ae0eb51bc56325bb598f2b4cf9f56d71106056740c9a5e80c03a8b1007bd37a7abd815c2850d6f0ae57db1cf34fd2bb2d76b13a15743c909bf6d5f464659595f2e4eb1f0ecff1f678960977348b712ba89f691cbed485f53bbea9793833ce7110118938e4362bd390ee0e3227f4ca9f1eea8d9d817d2a8c67c583bde058d6927eaddc385d25dd1e83da69fc31fe478c0cd2af2b21d092bcac960510f15756808b24547bbe119e4dcdc5ad23e71a6088df023e43f471470c86caae30dfb1c6b1c21fa291ab8be7d7cb3a4857bbdbbe0c11d3cb869dd1bff262bddf8c2ffa9facbfea171899f7325328c2abf614b4b89c51d1d75162648614ecfa1991569459d7d13e525efdd6063662d9788da627d8900b86d23306bc11da620a0cdee8017dd9a266b4f36bbaebf7e5f91e8ce4b796ad9b5d5cb9ef4aebb98e57f9c358d48418a00def6458185c1e3eac0e8234f68b3badefc73480938c38be8e90ed2d8ff52b569e42304770cf2fd96ce8fc2b472ed0af98b2616f287bee7ef842caea96596842825dd5be46cd9342b60e693c2be9f30cf29e9f0f6c23413c3f8fdaf48a2975d074b2c3212ccfff17021f37ec3755196287fc6be5f11ab792cee89befcdddda9ccfb18714755ea9a2eb6c06cfdbe8ca3cc34c468739dad80f10ed9c40f3eeed140dfaa00cc2f24992dca5543b9c2d6bf82f1ebd67b8ec190dcfff4a7c7ee543b2b9fe9c7e98135543503b8ed3fa8ba52135e44f1be0c7011b36ae2516d15975155e3deafe573a3350e09f350d799bdc44822d69f863e406b3ff6aca848da3d7a85528f9e0a2ff8a27f850e56c9bd697ee7e6aac9194cbb07484c5996a266d01d8594067d9edabb05521f0fe65c3b45e6b851c658c05f694b9613f102c1e1d8a41b524b35ea9f75c54d7e00e7da3cd965850c3432c39fd1a0f0f47dd3ee72db76103464ac36a4ad4a394be84389e7ae6414befc416a337b6f1f9704f3714163fb2be15bccca11ebfcdd2dd0e1b2654b492e10246bfd43ef1eeca38e499277f79b3602387ced0fb84303cdbfa99cdd387d9baab69ac3f9b6171cc124bd993c20bef73e01a3e8c69a8771d2bd839178fe692333b9b5057b57c07a98cc37cdb764cc383ec02b035d1b30f0e5d357d75e24748e5436a40bf15a83cdd1909f78114e2dbfa97cfb86fcc3a648ae070db7b63205a3b4344f1d8448c7dc1378dde071634954283efbb9cd195141d4638d79a8b1862bfcbb9e835ba7f370078bda4d002d89c1630d13e4f5a59aa300efbf655e285eefd3d47984a002715154d17c09e63353cd01f12b4e9fefe735d9b28cc3fd1ff5b4e285c86a78dea847a352ac5b4afd103fabf22b40f180a1c008b4dadab01eb345d0d8737b0dc5001a9c17538a541429e00819fb0213df310c34fd93f39dae006946d56200873ee191e62757df2eff0478c16d84dc2e94fde106969d56ec5644e7ec837d400ed2b3762a8aa2a2fd460bcf7df6ac166a286f072686e24bc69fe78869eaad85c807de8f0f491a1bec72a5ace5bd5cf7ee22ee453bd5481a531051146612d815e068caa53e6ba991200a39d8a0c97dc8e30ae165ed8bb90aba31ea538a04e7397c7ae07f5ef8364ec496311c5723f5d27069b22de6b11c64248a1b0c7ec7c339c5c786e718f9a898fe9ef43eb2d1ae5abec5c866cb4f5871b8a44a09e963525de2d625a31475e9b8f6abea0658dd8eabf5a98bd8476b57769f06e11074e17eedfb2f267cf974e0f6d6447b3ef24e7f0c3c9a634a000f00be003846eac7482e303a5bef3a70fe7599c3f20fac272d68c4bb22b8859e423b9004c3e35f89a04a6fc5e1eaa5201c90ebe73c0e1aa081301c9bc8f252ca0df033d22e1e3662f1b9f2c4497e84b2d519326aaae04e0552c15c041479772c7607f094016139fc446501601c12a1cd32f8b774c4ed10fda902cc1d8fb6bc6b88690f6fc5132efca035e4c0e010c21a3916c22b139e2a308ddbb30fc00feb2f48fcd88d019bde0d0e11e20e20dfb040f4599aba1e59624706345b0130edca22c0a992163d6311d595e1456f61e733e86baa89476d8782ea1cf50a1c65b923eaf759873201d28efc3d8d530d2d9012baa5f2d5fb899150c0d8070988e9d9bc2ff5f2fd07d6501f2b0efe55100b42175daa17c7fdf9dd95724150a06c44b75d9ac35d3dc043458a0a111a92a08465087a8203a77645d518a75fb916f0fcb9d0d268838f83d11998404dca54e31f61aeb8369cbd8df6e0a3083b2ab53e9b49dc80ec4b3a7806351176caf7e104649ed1c0cccc506b9365fc3ddc8cc37ba9ce484c589c88c96dffbd5391878329db8539394f79aa37a4ceeced4bc589d2acb0ddddb360bf9b8be06480a9647f7b0d7cadccc48d111ab2823bc08ebf4f692e5663dc057e2819ea41cda41a74202181ecf72135efce3c44e9b160af605d68b62aa2f056de0b681188c168eda1ad43bf3edddfa98729c4e26b1672b592faf8cd9361c2af68b0b3881f087429d16d0b50d828af293d69da147031a1a93c6f41f9f96afa17045e20d86c6a6fd6eea99fbb24a038bcf9d8a86360cb929246056ac5c4833f979a5fd788d9af01fddfaa2788880c236aa3bc5356a3acf07897019bb65d75393612f90120cc9ed3a58cb5cc406e35173b235e0676a19c616419aefe562a0791fc5475c628af008dd6dd15b56a3de4bd386106e749c3638d5cb353b82c9403eff1481b4d29e99dd798ba100c8e5ddfbd6846fc1e596fc81e6b4d37f4c0042ffa1ed732bfabe23d57f40bf0f63436eebed4b887d42e0e95b996d0a3d89be0555b8ae704433402a8b8f1b8fb9de530db6882a0f0314e099008e722df8c44913bba3d61d7024eb1a5a098a97a2928b36d647ce7805c43c682b3652c33394380aabd402ef4248057feb8f0c7b4c286276b5aca737c7e95af326218d6e7072114690f9a34a3d0525c79a701f8f38e86f49ef1722e2fbeca2b6abc0909421d65b44256535d2b2e4d28df15d3257db8b082ced27effe0456ca1f0693fab8da497cafb3b7490d667f823f7ac6f379c668c39c2a5f5cdd63a037b8d12c2a511c340bd5d6504b5eaa3dcb68b11dc1495c1a3824411e0825ac61520095f9be013a3e7f5307d0bb3b0097f4761ef22a6b3f07cc31abe4605b4112cf82cf7d143de6b14da3c2a927470c26b4043ec4ad33d1b9f650d552f3e2c42cf6bbe836cb5b9444fd448159fdf72f52807f7b05a857a6c95d1e57ea4150a8287e186aa7520eb56214b1ee53ddcfdcb3c0645e45da3b309e56e6ae0ab7295f8dac24d15f36bbdc811a7844371535a6c31a3f7305815311a17a364244f3d16cd5276db6bee7e77c3a85043d7452cd2ff8f48d33b55c339c8b4da9af1955ed5287765f8556f41616e6cae2348c04fabaddc5ca3ae5b95163a437ad5f087bd1a32d0f86c7b7c9cc2f2e729eb3feaa52d9da2472d3073730e9a4cebddc92c432d12e595fe842077e476a12a6563cc14a2f868703a6aa4456b0d57947a238cd655f13ea6781960ba0d232117575d6d8550e5b7419104f6f373bdeddf74a6b05fdcf76491a0e1464d8621ef5a8ad4d6e1808d1621fca571656fd2953392fb9fc7084bdec03f85d91897979359c6710d0e7b170d7841f51e83a674d8f89dca61f4221634991cac210387ad957ed2dc1cf686ac24af299e043662c93d975ebaffd0717fef8601ff27f7a08d7e3078bc0a7fec74e42c7c452b64e9fc4c769a7480423faf96edb425f2da285cd6d67eb9e093f396d45802959cf685338dfe1ca0ec31d2ceb138fec78a96684523daad7ca519e53b7d9b82335ed57b968997abe54c877403c8cea78df811a86eefa3cdad61f9088a655ec6ca79e7164fc7aa0eeba72b6a766417771e433530ffc199a6f41d1ba5ac16079400f6169d83cf9d0e5b0505ff500c7b362373e847212224fff7e06703c81800b57ddc49575d2ada73dd6efd7ab94962ab43911436fb99aca261b2c56c07f1aff1ea33688d025fc70518ebfb22d8a2349f27a4a046b7ae9955d89b1d26912b7e0fef045a889df6ce8bb583e741d69f59da77b474bc7ae953e104a4577a8d4dd4d93356098d547856cf5b3fa91ddac83a24daca78e36fd3420e8fd45bb023e018155f315ce74f6cc697b32529fe0da63d45f8ec9402bbf3cfa31e3411107d6bb48c1a9d3bdcb75a88ac6540502e97c0cb047a25b06089d1606a5cca61e2c0760f060da38eb6b4ca03d6189504f49f9e4d2a087ab446fff65f29eea0346d178a914be04a3dbb6d459fdc742e2e974dc9297f49f588fc45e932a97fbe70faa82ea2223a9b31340b52c4882312b760cac8c9cbe69d14ca843243b2b52affd19beaaa54c39c5068b57adaa0ca4985973e2393d6867a41f8e45af80c38eec73a194611aa245783a1944449ed14dc8284d163f168d295f5cd8ce8bb7eb112b27d4acb3fe905d4b325d0387a37a6d2946ea90f4a4872f51992a564f3d1c89ca7e155009ddc0d1ac63e90ded3462b33a59ff1af053f0da29690565707cd24968daf626d914ae531a631fcbfbde149079c5dcfcc8c154ba5520cc848613a6e074e309b9b84fa352139493e62a1d2a85761f16bed4692d605375122bf68e04df8d1a92611dfb5a4f269cd7b4fe5dff12adca3ee9a9b7d53ca2ca68d4484876a70fe652b570843daad1c04de0ff3d1cc89f5ba805bf3a06dfd185231601df66c77bdabd3f6696c805a3c378c29316fe07b948048b9b6c1caa5e59e359a9bf6fc15f6c2457568f83effb0afb0250983d608a13b6f3b4ca912ca7ad2c27b674fc25391f3aa5c6faebba660b1708ce2d3553804341c6a1e20ee74bf36ff8ae7c9653876862a34e557a0563488f4e523290614a5b378cc92ee06ac9c11154f842b8ecd8ec3ec8432bb9418147b65b8364b91a36cffabeb11da0179f9ad2b52a63fe419bff119d4bda240f3e8d1eb8e82019dee4262dc4f04ad87e4be506a1cb6cb1024f25ad8adf0d44bef98d3aded6f15d2fb0d22347ed12f42f4d343fa341a98b9f61044529532185e140cc9d460654ddad4b788da02e228d7b120ce02223c6e8898fff8af16ec38216b2dfb876ccc735a8126dcf6639d60f1238e38aa6f83152511a9be16b884fa3bfbe1b0ef9b0c4dfd084466b2276c9f365303cb1ca256543769f4ddaf02632755cc113134748da46873f76d34d8b6ac4e4868cd7d431ff466a8ca9fa37cf18716e7a6c77d7fb83f46ca293ba4fde250e20aa687f8da45be5cd7124a1aae96e1275386b8f245f3e83d13c1162b1f5a539aa2a341b2f03077befeb4273b21bbfe2f189b4cbd4da765f558a747f1c5857d1d174943d60c47ea3723977e2f5cc6a7d73fcbcd031f3d7f18a0c3161d77cb9514717fd48ab7f4de6d50a5971ee721a2c7cf0081ef441bfe4bf4fdcad7be946526b92c3df6789f1a088cc5b92f4b32b7a6d021b2a643abaa385b3dad492048b3fcf63ac744d7ae67b1e0df2e8a0f63b01d4b16a653a4544b87dd6b0598274f483d3090b7995c8a8d1052dc3c58bb1b54d346c7a51cf07da8e0826f1bef5b12ec926f165820909b54cceda22cc1d8c16a71cc1cf929ae908ae95331377443f766a3bcb4f1fefa49848db61a46ecedbfbb9ee2fde9a366f4b94d5799a14f676780171e52c95e23fde4fdb72cd102827c0f039252bcb2a111fdb29690a0a94fcb00979ed82966911d3dc2f7c1172a1f602d47e303bb7de54f1ec119fc7daa8489afca432e593ece1357847ebf5e8d4dd3df13def82e2dbd16e321e7c781798d0b5559153da10f6245faec5510ef52933deb0f89195de9aece157a08d7f13ff2b7baeb1ceb4901d31deea1839a12a27a061ae2ee4f8fda42df7c76851618233cf7a5296121983bab01fa4c10470ea58996343515800d2800b1e0bb656a3d4ef232e0baebc8d7e6715be89505fd2d82485601af049520fa70ac09f1b0bda7e79ccf3148c2c64f29ae927e2369a6b5623fac49f9c5770e781b39bfc16ff69f17c2386178ef05452de90e859f4429ef6cf701d3ba600c1fcc88bec9d3a9fd6d06edd438f4796b0419aa37c4b09e6e23c9f7be689bdb3e9d1b3fa5f0ce66ba59dba40b7d6468e2d3167a7505ff805d99a0c749d04440f4ce90c954fc5aae15abbf7045fa6fc551f94cdf300e34f1de981af00cd35c9716fc50ad35b5208af6aad9d8ea75be979fbfe263d0a8f6fad9695ff96d388ce68b6d8673aee2c801459f526462b7f9e6b66d018ebd9beda23655966ad6c97b373d6958a4294dfa1cead2519c1688c7ba7d4bd0e75fafc2f1dda2e8ccae4cd191133aeec70dbc5de2cd8bff096cafd01cdca078f61fac1defb6987ca55d8a38fdf5277164c2f8995bd6128332cdf6bd13bbb620436359a5a5aa817b804b4b5681cb770904b0c9578feeae069fa22336a802d3f157947f031a9fa30ce2e057d3287d73dd2e3ff63f87fba9b0d951ffe2e2994013b91be6df567e485855847558f7f463166ad749f84ae649a86744526ac96945adf15e56df6230b686609f6f8df8168fdb40e0882be098d717d1e1e475655829e788c797ae459c35bf8c990b1932cc3e5539c27c7f52f89a24a0927cacbf4f36ea05bd70f207a90f2b5fda12a5adffb9acdce5ed9da7eddcf85bbee4b7de37b2def0a7ab54b1418af163ca4bd872954907b1b1a32ce761e3ba8acce23dcaf6e6ebd2ef0e7b4a4bf03a20d1805b8878348e418f65d51a3bf993b6263fe68c761a3731fc6210daae872d1d5877d5f78ec26b13e5fc40496364ab6633c25c2b9d96ed98366eba6a5498f3e2c5f9efc8c13dc3b01c31147cc06c29225b3544af55a1338c05fc2200246ab3f782ce5102f7ebc19e9dcaf9b93c5b3672065e492185843197d1d2efa7064796e5f5bea2ad1a168a67cf8f990abe77f9df9c0711881588114002b9ca64e275c43388918ad211044992194a99762f0a9bf085f644ececf2f80f00795b41a03d6469a20eb377c4fd24a8e5c1a405755a432e2af48b55f40d108d34da494529e79e0faaffc2a71b4b43309abd60c079b01a1ff1c88ecc1420814104a43d7863bb9cae0a2a6267fe35cfb29f0675ae2353484d433cf458347273b4d99edee3370183cd295739c15502f0b75e648cd85c8df440891665023c4c0d6c1c92d58d8d007ef56f50efbc08fbcdc63e9f4d440aa4467e291f8bd115f677f33346c97f4e01b2ad44dc2d60ff688f67a77e5ffc16e167918d1f0bcda5b8dad1888263bf604c4a7d10c29bb623915d2201cb6b08698c7f011bde90fed5da5e8c81104b57ad296ced3bcbe0c55abd6080b54c186eeaedb5543d23c06d8ea32aae88b7284e1ce041862dbfa4968d35c00829ca0f38804b32145ab74321b65d67bf043ea2ad94b8f0cf4f66912fa542a443c60cf76e15f01ec8d963c222364e3c455d6e627bfffaa15107874d9a882a34b7f4dc79169022a0f924ede579f7bed2cafa0f10c044ef7e92beec80df20359aee1c003d3ad82ae02ea21d532de0f750d545e954854bdcac1cdd5bd30453adfb70a441eae1d75007efbbbdb546d840dfefa5c3d4d1fc0c5677ca9ded130bd882c3f667281474db3dc5d793b2cdc9e0a79e82663bac3fc6a229ef7a78132f005471783aa1da9715a9365e69f3c99a20cf6d459b2f1efc51b8bcb3b9190da76b9c029482fa3b284474ccb8051f42334880e1542858301bf6c1b87d247a085b6180fcb106de3f10b1c50f4e2fdf407ca0e18418d560e984fde5a3b781430c332c28e9368ff3ef35a4c58686b1dbcc5d6f1bddf96cec521fae4b07c8991c221713bd508de5e15280649cb9c952baedbeff557460b3a771d5501c6b1834ab50ef5d67ba1dd05170d93b713080d925ac8796b8d2b37436508c2d7f580f1a9ba0a3534dae4e18eb52296f6c74110fc30fa07d6c7e5b7544f72d8b9d551512921a1b3d98b4888456ff5649b70ce6bc3d21f1fc9800c17f776ca1b39eea92e538c53f636f5433dd3b7f4a11778065a83ae7625a64e14c5977b9ceeda99fee5b37a9f80cfb17b7eb41dbeb0fd759f89a636bdce1f9a863cdede69e81e6fd913c34ce2c8164847d76111a238bfd1e065b60b445d77fdd70a181f9f8b67e8be350da3dc40bd124eb465244d9cc1157f7b4d8ca87851d09da9edafcc3d599d14d5fcefda9f06a7d6a22ad62f51b3c8c326a73b68833fcb3098ca1f6e9265e583530bb16c178591963d4ca7b5ec0a5462148da7f3229446365337df051f1f6a7048c4791f6edc3803c225097fe03760c2b15b52d6bae1ca1565a17f1e37e8947233b1a752f95d3385fd5e8bebc2bd467b898abc91d0bacf644cb160187143ebef805ddca54baaecb32b539f98082e9de309a65592f891de9974c232825fd3d96edb238984ca27fc11f89ec4f324eddf9fce38be8896e9703b7a6e66fa57faf566909d2e801956ca08c1ba8c9bbd8d840823bc47b130241ca0ca106ddefe3bc87d4d354c15add9df2e331166e0168013c2b6ab81cb58f44c8ff042c7bec718bb095d8652c3fc13b3e8b94dd46ed4680745f3710d2575bc885f699ff508270455916e0ae3098886e0dec0ca65967b97e70876c74a6e1aff4885a2628649a2a110bbeb3d7d54d7b5de66e6019b0580a23b909cf8b9e3bd3f05994744ebf1de5184cf518872347e23151795add52a68296d64f29fec54d0fe5800a4b1a6af1ea81a723d966236c0511d675c09b473b67004fbf41742000abfb852672346c008175a1b0bc1ddca52b26feca5bfa98fd0188adc3e196b93aee59f14fb343cd30f11cc4058a5456db9d9850e0f3a34cd69a5777c2cf0c97e422284cecd4ef956b849d97880ab29af4a48e5520503d6bad78943524d47dc2e78d8f1c679ee2cd988021a2a206e0afda863093f03971fe69e4687050b892432977b7eb27d9c17d9f2ecf6ebb44869d738ba794b977e70bf426fbaeb043f221942ac740944d37ab68d6d0823c8e4b6da9fd1be0e4d3469d3586747aab3d45640fede8a416c1ea61dac04b668baad7266222b3fdd71237b9144cfb59a96d35158107429e15ff82a6df3369a31260d3d088449875fcff616979bfbad5129c683ad4c1fcb6f9cda8835e7952c0387ae77402a9f2d0ba616db44c28d6754f9286deef633f742af404fe40d82d4564beba19b899e89478ff02a375cf7ac1c6173806ba353261113c3d226b9922bb00f6f5c7925ea24ba0a2c93cddfccc42e0f326bc1d7efe04146cfbf4c8035ba973e83f86783f497c991269896af7f47f05edf7070088cae59c4ee87e3f60fd97255d415f528305b0cb178b9205071b019ecf53f04b99bf8d12a8aac7b9f6330d7e1ca3590873fd6e9e79d75e9776694e115fe47de6fa0583dc43e9d71c0f2394e6ef0c7d82575a3e7afff4f5068a05f0c8664fb8b9f3c34f64e74eb752f1f5b3c59c24d2a97743a8c7738b5f3c8c186f29ab3fa9adcb217a105b806e41e4d2f383ec9460631ae135ed9b43a41fc3c9519ef85a57a8cc488b4a692804d332e2db88a7042f99895c6c543fc5cd997941208e1348ca933c600a79d7ee82ee214cf33c951b48340ddbd66429b9e291f4a76361c5b20a57649080046e79ef7cfb39c3087d82b21aec86f98620c5e9ee7e24a37ed64020da8c017455f672536406d0d45229e175356e865f20eb94ec9a5de0674f0e991306fcdb6ed33780b68e8b3aad835fdf9a6bdd03909c53ccf27cd902373b3566ebc2fb45f6e6f94c21e2d19ed604e82427a67f2413602016047c3cb39baa124eb0f5d26795f6037e9b482225d83c8c5927cd9e126fd61a192982cc1a1c046efa6b89ca6ad26b1ebd2da8c4f63a9212269fc880f52f64087e6976d36041b211112465297636ae12b1deea003b84704432997f6df4d874b4eccc4097ac931ac33ce17137b24825a703b6f61e193f3de8261cdaaf37f46de40c5bc9612799a54c23ac953e479039a45bbdb466baf260c7a931c18de70ab761861df778f8dbbb736d8cb9845d9652d360fc0d20462543a964df1c4e2ca3baf3011bb32649e1c501c38ac5521ae3d9fabb7ae793e4604d56fe2ed33b2d46dd61255be6b13f3429bfccaca1f0a9fe34e2143f2c08bd2ce6952026ce9c137b8b759be77662045b517231fc36a6306fcd531154c2c7f910762f72d0f5b905cb29f50bc74d81c0dea3e599826abcd8bf0b155dc09318bf9565ed9b3331d92cbc20aa1c0151569a4689dfad452679c87555ef9e8b854337411c9544576845b0d8d85c779f6c28bb196a27154d5327291915aa7dbe828f8b9f01ef14458346b8a7b9d3c4a885414be2ae8678a2d70c2233b20ea1607146e0347dc5b4046b226cb02cd6aa2583e77126bcc47e4d9c70dc4c94e3b37939ae618af9ddcb9c0621f57b972fd11d5063556ffea9d055889d7eeb23f15a12c40f3328db0002163e8d7b9063a4e298d3fd2044dbfc16c285da3199c7003f31f9b381968cf60179faac2578f9fe859ff4fcfa2ebb87f79c7a6e1ddde8d709e1c0e1715d75876fcd22c81cbabf0461389baa0ab406101cec4ea2693fee3f612701e02b04fd7bf51b9d2788de1f801f6eb04d795e25602dbaebbe3e474100ef0da4f9d8138b993a6a5511906c803866461b2e6eb47e3fd10c380ac37e49e25a9a9274a01289aae7c231d05ced4af6dfcac495123f7a75b0ec1dcd216b6ead4bd6b199aa8a5e76a32b19ab15e9e480320194c98d8681c9736182517f97192869caeaaf1f0372c517aef5e9e3e6b89e06f371140611fc04c2734fdc0688b01c5d7d260026032d5fea52add3ed6e2d1a03a944bca56951ee442b6cb7ddc89d51cef74bd2e814f70cc5202ab15c08abbbd22af60a9415ea4fa290c22a2edf468f6541426e8dbd3893501e52cb573d9a481b7e6d46f89d2def84ab377c1e53159eca62f41c3c8758bd32560e680793638a85ae93b8fc8a84969082b4f7d7ae7045a46248241df8bf5214d047d194946c49b9c14fa8c563560b712022e18177c14d9b4a25cd599ad51a9d93e34f25c81e4c5fbf885d7eb00b17cd8a678343376f7f5821756018f503dc76a7cc28e2b6e15d1eb128204dfa0b824dca6d254675e2a183ef1f25818faf624614e8a4f4e61e429e9e16395ac7bd1498e61a0fb2b9827bc4bd0b64bdf24372b6e2210d83e03bc4888e3af0cea28b9457e95888ae8cb7d7c1922165f3a625d56e1a5da9b62da2ab84897c8cd110dccc31d80ed96274e97b2576496f4c31bf5315c486c2b654b9bf3998c4578a9b1982cfbd244bf7fb803096716bccf01d77b353e6839eabddeac850c2fa9722caa87fd89f812495a9e4bebc8c6fc206f2b7bfd28a3c85bc519c8d70100695c125f28bf5870fac63057ded41ce3d9ab736e63d37b799c1113636d74288d0998d355f6dce7cb52d8a97b485ca40bd9c2a736bf62d768299d317226e6e3541ebb18158ef0a865bed32e7ef4d02e8d80f8830b0b25acedf542a79c71a9b1c3fd2539243d751ade935817e970e8ed0743df8f61c3866c7983b3de68da37147b3989cee89ee4dfa484da2e3159019007a6ca34c1752fa69959635e5dcd09abd8683b31f93fca4745e7dbb9ecf9b497ed3e5b0ba09c6bebdbfad39ff1c6abb869edcc0adc8c9fe24140df5382ff7c65465f048c85a5d59cafcc772bab5397fabe5eaed1e8f1c0410534477389c6b398a1ad493ff73df7498352d08a110058b3342f760fc52bf5d42016c6a267ec14a26d9dbb8e6ba14b6305328223993968a269c4941ce7878b2c207cbf58b3cbfa032894be00698c4c8993cfee80ca7b4228cdd29b91d6910ab964ea941ed402ee4b5146d32e576b651dbdaf783a1b526fb6eecdff0708c4fefc8bd5075d7f1d5bdb86189d70dbab3faff135d1b8023b5bed3b1b30d4f4bfc27603b07baceb77ed44258e7f606ce836b0cd176d7325a2913c414ed38420de1fa64b215385cfaefd05be1ceb85618ee4b0afb8ce03ec34aa148fdd49bd23bc411de09c3160822f15b0be488458702bc420279e55e2cc5df116754b15b863b6e13d528597d5a974c1a5b495bc421f2b4fafb33c97885c7b20a2901cca3e776a7a952f71f94dbc2c8b752f8905daa529f18fd108256cf33893597ec6d997c54367b5c5d5c8412092ddaf9da6e3aac89454710fb572195702d3ab8fedc65cd3ee530fb455a7488d5422a56d53f80aeff6e2d3dd98f015ce666c0951d6030629a7a7137945f8dc38fd05074d2495a391ce2728b93731daefdfb6f34324322c4d1bee51933b4f64d9d9ff358bad6eed44868bf03114b9e121db6f19f26cb627a4c7935a80aa1d8ae6977bc0c732c6407ebcabcab3b5fab11ae5debdedf41190c727308ed016d5b6c59205397e793e55a6dce108df9f66d3218b908f747ed6e03aa7307ee0162a611d7615f01fc559956363d63b134590cfdc392edf445168ae55e43dab5f0c6e2254a0489529cb9a782aede5f1dd2d1affa18b045dcc005943df5a9284ab8e2362e1acf7893ae0637663e7baadbbda47eb27ddab6b8a203b590d76e99b33ffecbb6ae8bd4cc1a85738b4cdaecf3db1aa2ac5bdae88fd25615686b5ad6fa6f62c94470004703c87e817842c4ce6b167d43701b7685693846db4c1b3487272e555761c7f57742a03889b58601f74d551388872377324fbc1d30c54fc6544066209d931b330c9089fdb4cb825911a180269a78dda4994746213b5a6dd6e34ffe0cc465d583aff66e1329419c94c16d7efca1cbafc7625cbe9c2593de2ddf5bde5ff45c5bab087a34c3119f3e79b1bb39ddc40903a635930cd415f80a93ee6dee6154021673be27c455946ecfd2899298132bb9400bb8f61812341259cfb88c165c0dde6ea57a020611d935b765f0fb83e5ff63cebc968cca9da96834abe6c03e964678cc07e315e23f097c5dfb8ffce29a688f1581755d0bbf9d8201ed20114e5828599663a26741264bcc2b5b0ea09d7b8dc67d24fe72c1be38e9295e0d882eeadb08367f5e00090fc8ab884f14ec9dd0978f6e6bd8d2d6e3a12415c6562cc694860d1223c0e92442a8a4dc9d49eac8e1ad735020ab85307601bb2ceda306fe9e52f194196f297807123c900e57a107f5f8f98b092194b9bf7f37d59a9b1cbf4f663b222814c8efa62efd0a6ae3194355a0a987efe0065705441f7a97e678eff1eb73261757cf7066256eb379985b624acc0bac9990e3f49278fb82aa2d2278ca082207afdf45e2911f17f3021b6e4e1aa4a863d1da3477ac4154559c18204023e6cf2db855322f6d438133cf175aed0d5107125d6600c89ccab05b344e7c3143ac0200fa609e3e43ba33d9a63228296dfbb02306db4fcfaa399afc3c783e32748343e83ca992f75aacb54f5014dfe880c92cfc94e129741db797a07a3d6c2afc931b4d48d81542fc4090fb9566871490e40207cf22979f3f6b31afb846100324031197e49430076f9e4b473cd02994e374baaa7f43a038567eef91bc3a31a434fcae2ed985ea2efcef6e9a0ff9cb50c1a0dd4f6bef4d27ab1759ae4ec2d8f574a5787aee544b9feb5b825bd48a78307490f25d5ccca554865ff86e38860cde2b27f9e4eda95b4384090ef4542a351c436d813c1a82b0a72e7e533a412dd547a3a9b9d29c2b23000f229acc57820cfc755f12536dba7609ed9bf37830603b1822543fadc583aabfd3cdae4ba53a04b8538d2e0c1d1c006009de5e92cec64739f14f13de2e59f8691933d3d905f9253825205ccef14f5596cb701eeee308009258c3bdcba05416e4297b90de40677865333f2502b2fc7d917b79bbf637cd6f0c9ed8c5dee21c0b1a4bce6ec21e2d0425c413100e28ca813b6120bb1091be9a8d0db5b47ebe5adff1c754f4ed67f3d26121c4a55b1b62687ac58ea8a6ba828bfeeb831212fab69b53e434aac8e360e80293796c51536b3a38eeeb091f7bc24a48816965045fd74627eb9718b95a1d50ee605aee58978eff5c255e67e39a26dd51179037bbb566e85524a4c72993d2120fd090b2d9b173c0ceb20f495adf554e03f5200f9fc40a8ac4d7843e815726344b2d43403a67c18576dd2737ec14f8a54562407618536c325e4c5e05276ec1c08cbd9a21e58220543ceeceb901ffb6e8fea818f38e2c33eb0acb5ba585a04cbdb9cabedc40ca3a37082c2b58016a3821180dd10e691508bab09ba3a501b56f34ba9ad7f9b506b435c2e0679b541b26577ada934f11d793a939055d8d0574d12c77750c01ab0039565252a90b62da27930c56853fef3a7bbf8b51b2e6f8a61badd7a5857b8a7e6fa3a0ca1a2e9371e3dcb6cbd065690569048fc7c9364213f4c0c5716befb949fe239490e28f50a6033a607f9b49e80204812daecb084b83056b2620e6e5a2298fdf17eb28b3ff432fb5f2bb0f74d5f7f53d4e50dfe17abef6b8e3fb1de6ace5cadd0f2514240a0e0e5654c7546d96ade340d8f32e4b398b6eafe44a39793f4756276684d069d7d049246feb91bc95ec7793b5e0dfcdf0b4155711556127c315dcc50251810ad0508727296fefea387b593dcb5f1bf005ff94b85263be77a01803bdcdd3528f5b5871686b9a957ee924304604b70a3ae13593da90bd78f13f187419ad546981e2aeafee1eb6ab000fada4b74632d335ec1eb9c6b1acb61d06ddd6e18c1aee68cc1be8c228095bf911df5f977b169f698e81af839f76a0845e2ed21b516e0aca8167c4ea73dccbf0598206ee8aac955d30271d1940635fadb0d410d1e498e431695aed70e576236d4e5e44c55b3cde9938d9a9917ebd1b206298370a2de0a624ecbc085b68218cf8583abe23d60ea1a5105dfef240cafb66de40efcf138e752c7254c0b4e3232e1adfe01f10e369070a1e7bc2446dd428068a94e22781e97cd063ebba823dc5305a4b160d946a97384fccfd9e8fef21ca88d05eb61a5c3ae0982749a1cd604fba4105a530b853de5bfc81a939dcadf90875176413b08dc9cc0c26361b9e3309f6567355328386879899a4493c328fa60a54c66fa2f2fcde66b5c87ad0fc9e3a0a21feedb8feebd918af9fa34e9a7d6ff9ad47470ae791c1d61a76dc6aef892c1e2a0e376d2f6b1e03c5d980181b5f9bfd0901b4f49735b945c396268e7fdc255bfa0cf9f620ec9c8164baa741bd1d733dee5c7e080bce10db39921ee6b57f6ee8185efcfed9579db813aae27288a03fe2e7c06ced4a450cbf03d08d1a985b4fee0c6e082b609567d35a11f75385ce47137995484c5c83f61aa9ba3ad230560f955fa3e525bf8d42f8c157af8bbb90d2f92e43d8cc4a6f1613b4b6efb58659f80498645a95fe267850d1e4d2c333cf29bb8d32e5161bf0b3d3ab2e726ba14d50643f1b3023234a5002112128a2f37195831ecb36d1d7f0168116898c9d8a1860dcdc2f2f7638e011360a7478 -MD = d3891d0e889883471e15525f8d4ddc25b68339c0c17e3a725c8f858e7784267ce0767b12ccefe62728983c53c6c847d0c38adc3f52249b6ac082c01722d86125 - -Len = 92104 -Msg = ddd32f165dc63f633c17c2bfbe0dacd72ed6495dc5d53afdce3dbb9308df279b4c40bde86fefa49a6a152d4ab84e598700b79b86f449de157965cad108af4399542033422d578a8ca43083557098280d90a0186a32d0885dd4bd8844a9dd87613e9b1a8b5da7f92332904a4aac94235126b74a7147123fbd266e7c54b211fbdb52d8f92bc886fa465b5c0d9035ea513c0a24b804fab80b1db99f2e6aedf2a6f0d700588a369d93dd68bd518fd341bab48310ea89146af465d37927ec20299086173abf106f94ced1a1daa0af4d4167a2daa3696a5ecf037dbd24ee44145ec18658afb7253a12b3084edc81586d935fef5804bc0d9d903f4dbfc70bd8913842d9e386c73160bf496bb7ea7df2f9dfaa81425c6bdc9c54b1be208a07125f5f1a6500e8789caa4498e2242d1be5bacc5142e3d2ff3d22c45fb62a966959457c5114f6fd51cedd49a856dccce39978035b19828fff9af688531e2313b9140c37f0cd0fecda2fc47582ad28f05d77fb2cd0ed66baf35ae14795df542980ad7c37fd7791de9b2826712dd150c112e50aeeb9a8d87c63e5aba92bdf05fe448b5d2583fcc5fa1d1fcae4b1a89c66894c6ff11d3120fdd8a31c581f087ebd901677a88743f369e77d7977171c53084a15f0de04708664dafcfbf97941068ce9b692691334635281abfbd26614bfcedea6565d764d52daef5812373f71e693d9d3750f2eb75cde740f189ca67726e1cc6968157cb0cb86a11f27b77b8267fce7d5e943e1b428354713987edf2fd1689cc4f0af1d813a9177b90324345bcfec9c24b6ad33130d7e821e421f1a23088cd721b4d262a8e722f98e6e2473e4668d7e28a4f42cbc54e2ae97df285f3b137504e77e27510d1a62b006305f3f057607174a7ac1d498448852e83740b45f394aab7e1456f5991b78238a107fa0a64582eff002bb348d2798f67812102377c334544e3e065332318ddb80d7299eaf1c258c84028b5384433c22af383fb36bf95a88bfc6df75c1a6c95e524d0742084318786c43d83966e29a5ff571766c2323e5ce39738b622fc05336663ac1939a02843b128d4bef194ada34b2845d578889fcaf240caf2262c854ea2666ff994ba1915bdca88c7c87c3252a4e3a9b7b8073c8b2e85af6be4405f303f999685d04676662345b42e89697a3c8315bd9e1f428705fed25053dbcc15908469aa4e6ae9e2cd8816f153c300c7b96c4afbe8fcdf11d3e9b3487a7b142ad8177325c3d2f8c0a432aadaf7f3c6cd61c6dfdf38ff116f7d85b5122040dd218f7f32938687179292d99dab5b9a2fddbe3950f1fe94adf25b493427e5db7b7c2f12247df715aafb01d35c1d2f24a08b372a5abeba3bf93d05aadd044b99739d2f76c53fa5fd475c89c6629ac331cd48551039affc7377c1f530fc31c2195a271913917303bc612993194d9eb8300ab7a0919a3025c9ce03b2623e3ad9c9938c648f1592a0c17cf4a64279a38ebded3ba214e909d6bd5084b5b4ff8a0328b45faa3fce28fdab1f404bd87343b729e956c21092877fbca3c787bfdc99ceb530f342bc27a08ae7bc9eec51d6f9b202839b891b432391463c4ea0d941f4ad0d9df9d66ace83d8f5d9531034f1300fd6407c7fab6778abe88e7c8997cc252e806fc5dde20f6d5853fa2f4ff86e714123a47c1e477bf130221ee3aa71c7a5b3cc0b09b1b876a7998093660422bb47c669340ced55fd17be716216ac0de0f0dd2f0417fa34a0dd0d1a39a9d53a442e301553b1457d6776b764fc87d6b294812b47ff83200cfa78337f616d2ba5b59efec6a80bef144778bb6b42b9e3166ee0fea531ddcba800039d2e8f12700b6c1482eb857f22c119a82af2e92f399fbc9af7a56f8a457c4df9bab6275c5ac1f4197cf2908d88ea5a8f969a344a42b51a1976e6ed0b361020e50c94de8d446fda384d8a4da9aa1686997edfd8ada6fd03e72cd85ef3160a45301358f937b57b8adb65010175dedc3a5054222acbdeee068e6a0829b45da117756f512bee366b828d63f57054cf91c23ea70fcf2742feae69bee4d1d1759b142f613bcb134fb64db8bae60ec8c4ddcacef8071a328ba54813bbfcebdd064ec7b8a9677b3959e26907ea3131648716c08bc796b09001888016b1cedc298842aecb9872a0d2ed8650d572958caa6ee32fff863d16a25d0ec2ed50b9276963fd35b2cedbd0828308a1bbd45174fce4a98584b468b0fbe6aeacf2197a51ff3204f918bd017eaab2ffb82580138eee91005dd5f2b8040f46fe9aef7c50e06d6ac06567d3922fbde5b210ad164a3ef1fc5e154d9199a45ef665191fd9fb573686d6171aa2ec585ea3f647bd076419a97f393866419c065d6d78941de2c82add1eac6acbbbae8cef7602d9cfc40f8367a21853ba632dae9d14afb8640745efe38ab9ecd58e2731f2c48e236fec9b10defd81e3b476cd1190a480e27cc802facc539529d28b04fc0b17eed117d1a55651f9fc64df0cf8b3da6582aee2957df00a21b48e4d42b62f9af8ab4f52239ca8732fee53b4964f19dd003b7a1ff015442f4d9ea6a035b95124ef5a1aa9530fabb4f7de3cbf932eb81aed01d09f88778bae6fc9ff65e49d152b5451af77d07cb499ea529c6a94162306847c5eebaf031b09d0bce528dfcfc030d0589a683c4277848fd1df3009a3cf327f01518ed44696b448ee144377cff6b7dba557d4e71f591750e281ca74463121354764e3a8c0734010d3f9504d2c3d22eeee64587151ddc4c5eb3074547bdd553fa515a49cff353fc11500d9e052f824728a4c5d5b986a1f677247d83ac3483106a0c02c11515105f217c73aa1d2ac2f1f1f7c7e1641a289be1e446097aaf66712d110f4a6655b24fc62b91d3239ed954d04711521ec0b861225c2a7eb915c49fcac6488ecb9b83f687c52dbe1e7210974dfc6dd1ef609b73c4f3f18a7250e6c1c99577324bcfc97cecb21016168eafe3f07ea106e0e317f74f1062d6ac471400b3e562e1efd9cd097d5a028114dafe5f42357598f82f7516491d470a6fe296840f1dd241bea1d7c3c326caa71e3e4434ca8ab330402dfdf73c8166cec309b37465a78ffac00f2fd5457c32323fa2cb8910e32175bec5f6c3afa487c8b1a4b4f83eea61b5fd0c1c658bc500c77ceed9879da989107ce0aaa12bee74a3409be13a204e101a7e7ee79c1e6afd10df0ab755f845b1a882645fba37c7f40579d6825f963b63d04a4fd9a185d1f1b56fdead1da91d61e6d63b5e355b97ce97623edf92251924806965389d4864a45e34520204399b6372824bef3b1fc6cb0006b940f9575019d1e4aa4cb7f08addb2374f00342f267ef38e7e59f40cbcb3e86a30ecbcb3480b6cc2045f1804aa66597fbbedd51325791100bae687a9e14ef9988c2c04c16ac1f80b5db7e70c2e05fc1480120e6e021d75e2e9dc1d7e9e63d997b348f90a1c051ec79c9d4d917d8343ff84b708c72432c73bf284dd1459bc306f8f88c215c79d86ffa959721affa7d547b124eba6f380ae14bd26f0f27b1fa7290733886ad452d7bb6c337d2f1c3b5bf4eda0de93d7ced374320a7da16d55e5cb02937292a9ecb901cd7396583c057c0f2274091738e5de633977ada7962693606aeea914b033d6dbb460e71ec7cfe19f37e995b97e8e76eabab7a88e5d5959ed268d547850efd35009439508255f31ac1445aa02118f430f9d1095dd2cb8de7c1eb89c47f0e75b68b464cb9fbe7d153fa1d06f795ab0efdccacb9c1d6a09cb143ab7a908fae4142c9d0baf69fbf3355ec6d40da6bfbb1f59292fe7d57e15c7be62d1a243d5aea6a3ac8069f0428838146b97ac11a9767d8da3869b8dd2a47b817e4faf81e90dbad6ca0a22bcfc03c7667862724381abb1801e16e3cecd7e8f657679fa489ec9f8cbddf30253922d895ed57d8ac3ad20633a8329e51ed76aaa723297a8235ca9078cce81303f6ace27036a301a19979e3ac4bb05c908583174b19af1e4978b76902186fdd508eeae485d1fc34bcea5ecde25adf2b811b89b972997cfd42e93f83a90ecaf183485949575dd7d446941d4f865403adac36070b8e20f78a06fdcf7aee3e7de224d9649b5528aa82e72d21c308d5e2456a5b67882e5ec3571e2ce3b932261d31adb8b9651fc108a3071c08d2da3eef7543f237b9a39144e6f10d28b925341d72964cb41117c556b73ef72ef98b2d7fcfe1a1040abe6710bc1804eb153806f307772be129cd943951e74520a18bf037b7abde3905bf5e9b390baac737db0d2262b8cccd39b1bc14f5a86c7a556d459bbf0b00633526d66900347529ab8ec54036e3b5d4ab54bb6e04faf398af9f8c106897cdff13956cfe843aeaaeeae3bdc0d6705d94093700c912476107faa3423a26ca8d892b8b90c0477771a3604a5538e3f75a87edd92aaaa0263b54d118f67d8c3bc57dd769d042cc82b0c3c65329fcc1d1032c93ab9787310ff8ebcd51176f0b341c69b1c0aa1a85e51e7c677eba9102a60e0ec52ee5e3377d104939fc2363266be8c945108cabf6071139de2d759a18dec18adce3844345e62809c16ab90e604bb1190bea067baf614f8894ffe98c96f3c43d656a012bcee38689de3d36c53b4c0bd570bd961e14ac1fe5166694ccef8d9ca2d912db0144edd255fad42b3c29f56f8b0dfbc9e7c81008dbfce1f5ef94f4a137b28e70684a8d920aa1d014b7bed042a65e24f07d3c6590d993028b7929d178887c2d6fd5321b2c045db171ec6c553bb3cbd9c842e3f55e6a8338d3de109c9901b08037bcbe3f26cfa8e8c13eb4fca13fe18abfed4147b80b48055da2dbce792fda275693216208e8fde691131b5f19a739a825b0e6e534385be8875c0def9f8f63734b0d1e1c58dcd75b502e21c50b962ec2b8524756698e2962ff6e0968729ce6f4936f06d68d17cf878cd44ae70d694b6ae625e503be594b05144d60c1a8d4df4bbe5d7e291c26412ba5aa093d85bd29f11dc03285b9364b3f649ea69398c3b6b92a4cd67c9c84c6984913df310aee24f5eda5d244c0b174826ec63d56d8e5f7fd75a1b24964bfea5dd5a65f5a1398c6f9d43b26d98b47816ea158b773dfb82d691f10a4283b3406fce9d5ec112629aa7d4014b2ac6f54ec649aca878313b6c18c850e0e91568db6f5e427180eb93d29e0dfb70845f3860ff4c9a03ffd1b6e5ee845fe540d6d2974c9531e65ab533fefd4f1969a3eae4776afac5e435a6d5b500ce0663704d593bae7b520576f6aae46ba3437daeef615bae5b16924237fea3f5ad2da0a00266913f198d15fd395f4d910f61f5cdf716d4747775574d0c9a79752abce5f97e5f5fa476cb601603bc00169e5b192a896daa6457cb797eae12fd2a4c9b7aa348ae6e889af22ceade28c7a4551931ea2dcda42502fe41fea4ccf8b91bb3a7c5e8b986918eecc2a1510b68e03e8485386b9e8c6080f8f7f5763231cd9feab488e7ea6e67599f6a62e5ceac7460825d3acc4928bcda9fe38badab720ce129e813cca8f0b303f56c5520d75b08c3fc0018d73441e217dd4de6d09e811ee8598d8f1f5ad21d95d50fa38d8f3d4370dbb7fb15c89e793f997c31677527acbc60e923696add4c16269c74b15e19ce6e05ca0b0c6d092a5bbbb992fb972c5e662844f8303fd9e98ed25bef16adb950c564816f468c489d712a4c31136c58dbed97e835ff418e9b06c0943d43e2e3727edf23504b8b24798cd07d37375c73cc59971c035bd8c40b84d88f85c06760dca05dfad5a1d46567b19494ccefcf44d8b30f278ace6c42e1130293f016a2f83533c84c27d2cdd30eea5ed817c42d94a802e652f1df65d1c4b826eaa6ccfd72264007626d66e035173e1692413dde2be34e06e561172b395c7d2cdace6ade9856cd0284d0e3745529b6a50a71e34ad1329f562801fc26425269fcac9178af306ee5a1fa78d3f0f9ed58f188d03cda4e3dfebe62fa18bfb34e847fa8167fd703158dcc0b8cbdbeea0a2ee35486d2f469ab7226dd73f35c56f7d79b158607bed9f4cf6b00342a45f0294063b5ba2d02eb250476df951367f1f669393d0896cc7ab2b266219aa1edd2f2945af595d36a9d52bb96b18702464df2434266c5b669adf83ea5b6e3aa1e5a0c34ae5a3e4e9644db9f6f9b72486332946b9cd9e4eefd3b6e7c10073acd404e2028492ddd26ecab67b8e7e47e6b246884eb31de8ec6f0edbb73905cc593bb77d57611b59ce1d6999f0fe7d6d2f5f3b669cbe7bcebc7aa89882c0bfcac83f89dd428f03ca109bad52aab58b7976e37e5ec11a8bd227894d77cad6a3018265d88c546cd0814250228b29420d0f45c57bdb4c75b275c6214a140009640310253ff4ed68f621ebe155adcd329691249bd066af4e843c00b93ad7b2d76741ea143cc1ae22092e75b5b33526f59ca19bcd088b5a1365977fd7ac4d63af113088b93b5cf7167e096843c7bbc709a3a303ef80b3ed52fb1a8c02faef931f1671646ad83168c4c9453c220f9c1dfd3037f569d56ac98ba927cda1c338b195db6715cf7fe963ab7f5489b6f760ac3ec6b2f8c2732a8f2bf461bd5a71b35fb1c494055dbedf883904c9a9991ba3f24ccbb6868ff67daec2713ac393a2d9ede1868acb7bf19e36fbfe17444ef8d070a5d3a51738bbde98dd842578c3c326eca385bdd0c0d4b00072dfcfc23efb70a7e8632133434fc7edebb1a465815f34fc86469fadb2c49f752c0e55abefafff1872fe9d53362eb40e5b8e59e242c35e7de84db2bad84db6f5861e3b79d792e642e40a8c0f97e53d8acb8e98a79ebc3de1781f99a097dcb1022f9403b49d20c0a7aa2b7fc0deefced3ba17030deb964dd78410b6c777fe083b76e420d496f618c733b5eb0f71cae28985dc0b8dbfedf8c0bad59cc7ff2e17020aa325625b6f59121f4e505406e3131cdd2214bf823fd92d7ad2be0aa3e977e6393583d661190c28db693226f4e4cafe2eadd11be8e8698e42ac8d07fcbca568a13fbeb93e7f9c7be67b22f0c23c94add8b3b31b4a842453b0a79c5870241a09c116487349ff947bcf08856a0556eabc89f82d363d9f842e33786e74849c603a274dc3ad1a358eb903a5ebdb24c047aaa0dfb21518a7236e497375d4c091f27a326a92cf35ade5a412c7b8cca6f525e8cbdee40082176ca4714d3501bab15b5a70e1384212c523cd7ad29ec702822007597a25b1008cda61395a4e73b957055b714646be4817e3b5ba7ae052ddf3a086d836198efa53f715001f04b3631f8aed920e208c3c128fdd40153fe88fa631d7d69711f2f6293d3064200a394e67569171ad7844654192a4aa360ff0ae265e7ab311b1957a693763e3f1c18db1bae2d79ea8906f5a3196bc5751d3239ff081001c3a7aef0d805ff00e08cd2953a6ca3067941b75914f0684e5ed1bda0b9143d87075d058162b219520d97f849aa7773c6ad46bef91065c8ec49c6c8c479501844e6854792ab626a3eae86b280d39744c16fe2445d004133a81b427c2fa585494046669bac1bdc9acbaba12ac11d94be00a85b710e4a4c5389bd8e0068a77b788311492a561aea5201ec308594f0358a8a3efa6c93584ecd9717f27df7e5fa4c162d761c1810523ae95a7bee81b44350671b075e74900f4cda11b51b65c9ca6d008435987a65ddf98adbca8b11d187b7a025ca6e3a5c56765b94210138b9b28449fccec605815338ed586484cbafc6683c468ac56c23edf321867c58fb1f7c39fa7f88cf40cd7c9e18ba920238b6cb0b4365918a924c9a6c34d10f473362ee3319f4addbb3af20d415e79c2dde4f5d47be6925e6354126899d5b22f76aead11bb1428311e7900681ecc9ca2c47e043c4b43c8f01dc6959f1630efd90271fec98c753539a63d9f74ea3476328fbd3462b2dc517020f2cfa4d8ed0e739f3690953650e649eaff0bbe24448b148808e2e2431ec041256f2d344278b2a1a5530eef3925b0044543f1ae7d6b6fab5607bc356c999a0583a23aa7f34260c5cd5dc642157226db4d92cdc02627887962300cc6afcb431fd422748a5c089d627fbd53385bb4bf417c621c8ddef76a0144f871307d3250028f767755fd09ccfa2508323c6c6bfdd95a485a72085988d576e775ed654d45502df49f8556e4741f65b4ffc8d80647055fac041732cc695860738767f89aa78b384369b2ea172724aa49f8581f223f580503a5e7cede801c9a33223a97a8db0626e9724937205abc7b4dc874b23e5b33d2f5ac6e6cfe6194ac9cd2cfc2e66463723d25c2be7e83495126fcb921b90f3b51d8a4057dba8252e01715b22ad1e825b2d510b9f0b0355db46be16ffe30dfd0fa432967718166da0d48676c0ff9bacf6147af996e33e56c2d933333a824519744cb88ef08e1939c6c87446812dc70c2f5eb7edb979827e715235e8ea001f8f0c9c85f1674597d0c867a3930a3d89ea2f956fb1b0d4b51710392bffb76682a6fe1c01868746797bcf397b25063ac88d1e40090b22fcc167c9177f3e4bbb58a773549417f598a88203c565c31b296e3e23e8efc4b7fa8cb7c273986e4b0788da92cda76a5c430b2d8b93c737f1146245661488a418d5004e23d5de576252fa87840ea049625089c38f2b0a4731028cea104c3c72ed95047615c5b9c036a596f6709fe97aafc60c8e391697bc83fcd475491973f8dd437f75c0cc91726f07446f7f09e8c5ecad7bd4afdbd55d8e09222d380195fc91e55b944b71ce36b681ec39d9d307f4c10dbdde19022bf4fb315e5b068e0a47b1867f1bde3dd8d2b31a769da585adcdd5efbcf4a0130347717c7047da483ba1e42bd352a3b7180e0ddacae30ca8411ad15a5f5e6c97c42099f34039ddb68ed1d2de3f80bf67f4b46cc9d05335c32da15c578e63a416d5451b9db77937606ca124a6abef5dd5d58a7af07134485ed82b1fed314c7016a07e9e83bb4e0fce3ed7828cffe5a38a245adc5693d06f01aa7fc2243161f9218c95caab35028d896a3c939623abb90d47ea3d031f6dd0350b67ec0474ea67be0150491f0edbdb185a9800ceff89c8e6a8024300fe54938163a94596e32fe2766779c0e72c221e0374b3703c7cc6f89ead6c965416cde16e1a0e76e1667891cf27d6da09791e81d322548ce780ac70bcc0efdf07511fe283985e27ede60c9c53a7303d8fdc19290fcb45fcd7f48159c84852c6229694bd484661ffc349342c8a504e91803c59413fd64c6714c18eda4aad5ef2accc729b458adea76a793869fb8afa7fe58327efebad3276a7cd1b1ccb56db0caddd02a303cd9fc7ea5c607a2ebefaaec598cb5b9cb7bed097027047d3ad91bb2eb08cfe09786a064cdcf387ab5217c828638dafd95cba1dec47d482e81947a8352d58d3dff1080c97e03bbafbb0197217ccb5102b04ec07ae8391f59402c77bcd3cad4b0ea24182d34f7e39a53ec85698bb8aa819171e34e6a0edc95ed0d7dbfbc5d58e1df1dc100913052c3166ec1cb618559f2bfd164c9c853126ceec4070c9b016c39448a35d401318bc278f4c6c76cb5e1de91f9df8d61aa4336dbcc9e33ee5b912fc0e5c128037ff101020b1ece2bced49dce37ae09e479019c2a93cdc624d05a4dbabd0d6d16701527483e34701d44a4b8bb277abfbf43bff561c60023ece44a1bc87c7523c8b67a7d91faa23dbf9bd4c7ef55a01f609ee0eaf7bfcfed951bc31240a092ec88b7a39c95cce2979148d743e12ec8c956ef16e572fd9773cbfb77a9d9c5d117e4f7f30cba21600e20e03ea5273f5f1e20c8c46d6a1bf166dfe7ba7aea58ca364c0c1b468594b501ecd67d7427e3ddbe5c907beb238758376f850dee08d5f8d85c487eb26e935c3363b0162979d8bf0a58ea900755bc5655e938047b9bc9b77e644180090bb9cff313f18b4d837a8d82a44bc31a67475652eb9520cc39a0b089129bd192b3548ac17c0f5f48db35d3c7cd1867cceea4e2aed510d52869076e98d59be5f81c00173f1a8e14b3f7b70c4a41f50077425185da343fa448904a3c2e2be63f919c58efcc6de22e175f6a917a91461fa208d9ba559776107545f5b3a993ff40f7baab8ee9e4a00ddb78cd2de939a037e5b8a9eab16d48ac66f0a66f9b8c3b8cb30d947f181d4c5678da5b1c06a987cbbab84eb16e244bca7636b8ca84a34f853bfb803af7864b7a980a9106637f515d89be3488fc5af40d2b6ec95ef5479fccfb0b1b3cd8ae220c81700b577029b16fdb00f7ebec8fb5f70f3f44875e07a0c688c2a21f6c03646efdb13689cd171c7547470554af2115ea99fea6ee3f51f7045d98d13d0204872445248f37dae5f6f026e6e94dc4cd988a44438cfe09c506f9022415203b500ebef06081dc1a04d58322672051bdc3b248a69453315dcf5526eecaea6388447fb197fbcad11b023c80a25e26eb0ac20798297796229bdf66209c13cd6179703e8ea43ca6c14e4c908b2f2289842c46ed0b5553c23c5473be4892853ac47f51efb89dc9c22734628605315aa4b7a2a0f714b2bf6409183ac2316aa5bee71a67e7c1fd29896d5de26171517d24e00e8e9a46ba10f7f34783266d6cebc653cb30db3d3ab2892e3b2ac771f7f076b7b06e6b13d40efa9572eb3f4f41cded95123b1e7cef1b3dc45cda3c69ad5b068938aeddfea8fff86a1ae1816961c2a1257fe5462372ba13da234f14dada2370ef17ee5789a17a5ddbbff4a14e55706d7f74cdd6a37e2597da2f18054816c03253de9b8c2745e4a774c2930360854dbf1d9163448f69d4564ee0a36233dbe7c751ed44d06a1ee571dfd35b1c4279b1229a46441449be4ccba2e8afd010a1d0ac53d468c8b494f3295762ab7056cb51145003ceca54f3f56460976bc38101315df42475d9b920745a75e102942fd29420d97a81db539374bd128d85b0e76270589d4dfa87ca7a0f71d5ef0eec3027f0c4b0eafbcba8253142333b7c1cc65e2428c9b175577aea2afbe1dd1f0d0a440d6c51059b1fd511c1704d11cd8b904ca34b041f64cd4d093d75144bb16b10af30a4443afe4c6cf19bd3caa0e871f7c6944bc6b8576db34fdd69f7ab648ad5e200f904fb83d5d23d26e926795b644f447d87ac3cbb9d40367147068cb6e0dc54f4d71dd7da50977cf93d0b0b94d7195ea5ab0f1d0fe06645af98bb501711a69092caf95040213f09992bc2c8335ee87dc30279d9c2eba805dedba0a61371972d514111e573ec3b8b7d51f84fa5403f1a5c4a76e382f387ef858c30ff1a955083c6d61217e3f61f7b1c2c0602793f8fbcb7cf80cabebc887b3a26f6bbbaf1551c59f65457fef35d410c3696610da14cfd8c2e120fd48b2c3173386c7c732a078f812e633643487785a3fe041bf12a19254fd2b5236303d59ab73d0ca1b183fa35d2eab9235f89e0b1a9eee973c21e56fc5949e495f8ab272f7cb151dc14b3afb7d5c7e0bf822c3b4d5475b118df1298cb5f102ae803e593584a11c67c1b1d9a7df022546b79a3e9b15a4ef56bc69b411ab7b1f289f337acbd95eae51213464cf0b8a69ea794857e9611c720fd170d027309abd60c6535d5b7f6b9383ebbb229d8a5a129f471456c64217abe3d2f0c3f6cbb6a3fdfc854a0efc2e93a4272d5c37e3dce80f28e682593ffd637bc9d0d6a504379aa84ab1880cda11755cdb745ac59e76b3e024a624cbe037627ebdf8515c63866a09b6bf607ca07b03551177647044923aba433c8443ad2b7095b74f7c457109dbc74b981a86d7d40334d01ec25f5c9746468e90eaea2f425568bebf9e85b529b48b0e22fe5406833ea42151bbbc6eed9f2b0c8a9ee8ede4d89eda300147b74ebffc0946530bb5f27c4b0af898ac02fc0d12c513e7646f7ac3df1388ebb100e1c2c343ed63d66d8885d196fba259a12b58a3c2110f863e6adcd572b0a5eb17488687c4fd74dbb4ad20dfca421eebd2e447850a6e5c78e11eec26fe90771e84edd3f19560cf4215c9171db0b6578a1e8fa361a510175fe0fcba7ac010a872d03671a9bdfcbc34154430324f3d945c0c9234de9ce18766c46e107abe19820e828d275644bb82d93e8734c7afc01c8c2456c2a5f6c7f6b214dbb4cd02914b1b2259bea033836b5817f8ea83d9283840ee43155dbbacaa6e58ab6f1c94624cc03902ff31913ebdd928001c0fd45b30a1f3c2f4aff477ecc01945090f7a72cd264ef0afae66d3c186fa089012a8434cd6ba392943a81004d0dd134a4dbeab1674e98a99c2ba2abf8514760f355ec7d407cb117ac0df5f3ac72f7cfa7f68f36ed3923a8413962bfffefeb36120fdce0f5eafb3b0cfa14bd6cd94e8e04c7e341f6bd268374901bec81a41284e7a8d424600ed859317f7be1f0996bfc55d0a556f63307a7b0d04cb6400643c9eeb170ac1180df1ea41e8a05ea4bc6a7159133ea7e435d91807a63a19daef56181da10ec8cc985e7ff47dd7dcc68e4face9a2d70e1567edd6deeff330cd6be086b53636a344153418d9bd4cde9595d73eb5be08ee1f511e7d3ae7def0035f41ae5edb6a99a90cda7e97b0e7af3c586aee646fb98d2978d5d4c597e4a3a453e158be9a92f32305ba79d75e9196e16071859fbdd2355c6678a42406eb8fd7cf284e7d7a96fad9893bd041d030daad3352cc0db13b2ce0a271b5023cdcfec55c7e5744845ef3f41fc54d7c0dadc4c75b77885752dcbadcb426cf0542a03696814b3abbbed2299b50c0b6311df19c5760468424a99d29782501bad51f1d8071c7f7c08932dbe3f7a394d40709e3aa87c829871dbc67bfde7b683d1bdb3d237eb5eab156e85f6830a0aa6fa7d86a357d1d8758ea9520c63341c5227f7fe769e7d38cd5cce647016dcf684fb892708761e6c8c0323cb284a2fc7f2fa8120398d1a946f391367cf6d6b9373be340dce65cac53879db703425036fe2d3f9c78f966c07ed54de0e58f95e580fcd0e8969b96f69275d510fd476876aae3eb2630d4ce9f9d41a9ea6914cfdba95a269585ed364cec517f4f87dd1045eb1b55b6127131ce0c004c5ef2ccaf241c1d8e4c93266436c9e5467a884a702a299b25570617b6d632dae04367005a473f0daf17a78d4a3d91f7cf9bead7b2adcc2c020ef40f853e76960aa2aff8fbcc7cf232fda9690de8ad50c5b994ccfb563c9694e5c4a2c78e42fe7482b4fcb83c3a93be078203d8c083b8cedd6e7176aee1a184e35e15a44ffdd8c6eb5d54b91ee0b9fc3b18a3d14c7cf7920e600d483c24157a10abb343080eeda7e6924727fad82c93a35490201400d4bb5452ea9c886bb91d7591c3cd41df05c0793b1e2a5989b42c471e14eea07818eeb72c4e981b1f561619f98c6982d7e8b9af4122e9c15b196f2d5f7563794a8bd540d682647ca9b40c05cc5740545e5d398d8a988dbdb622035ffdfca626e0f518f638ce29336f9ba83ff06c7a3edc2de81dffcb3dd2029991e5e2f1e02fa11e5fe23b790fc9dbd392d14f133ec9b92070668802228aa744c0c5f49c381df4ce510ac5cd3dc5542371c2d094b47b5efe76700e84646c0deb39091d44d77643cc9678bf10dcaf4155ee1b5a3605df318fa544779a2a009d58a4b94433e4c5f5e1d734128b13100c2fb0e3d743597a9b9ba2e9ad8c9ccfbd52a8db51af888f72d5bc44a4860b6f1c7a60222e01d7d605e9186796a2e460d6a0ed792b01eb5e2170ecb25f49eb54d9fda5e147b9a87ad542adc71c24273b510b1c9abc7134b96c7910862a1bdc47ab8228270ab2f3ee756e0910265990e9945bdd47eb468c29babacfc6ec4606d1facf90fc5f36e1bb4b35d54a9b8a44f10958d787a0ca1a3574f9d27c8f1090792eae86682e8b9a68c15fb97d65ff6edb17c9b362c343076500ffc0affac2a3c8afe4b2745ffa457d3db35cb26b003430257818e03dfa7a41c794426815a36645e63cbb27dacb0b8229fa67f195d5be779d2baf0af4379c52317f00aec8fd0278397d4a8a87461300ecfc8140cbc53538e6ab20e7d142941fa78aa189fb169ee9116e06a34eb3867fee8153a9f519c1fc68c0127fbc628b308f7bce0196386321d7d9987c18598b8597518533fb1a89498b312ddb9ee0a90e521b2e1f81a979a7f184a71dcb814b9c4f33bee6c50db6aab7c81a025d04154059326aeaa5b10703c937dc8c5173ed4b7ef1a6cb3c3d6fa4544b81fce316f84e0b88296be89a35bec5bcdfd390779a1b8c51e6e946f1ddc1ca8309d2165e79c1cfe414a833aa2d5f4fda57fa72d57a92e11c2649cc70288881385b8be024c1200f10d2ab6f2b146ece58ec07ded4b43ae5190df1b7037781e2321f2f28aff7f332d20c7c82631573aaff4704bbbd719b011244ebedf2f2355338fcc7d64844c3a0f36a21569b55f74a9710f8f3d8d83b9bcd733f5885c32b3d149a5ad137d016c03b93a4d11aff8218e8eeec6d6d12a41d1441f3df040feb098ca2f003c4c277fc71300cdd2a399a7bb98ae711c4465eedad561169b601fe1d69bc915337436bbb5fe86261112bc9dbd38cf1c7259def75605ba0e0e4beebe3728f46a9d77a7c66cb64ad4418ff96a1ff9b1277d73fe11bf7f8a92bd6713ac171c416eded9031637e4cf57087da8933035f53092353bc4938d43332d44074212c020a07c1ac121b404743cca6e62bfaa782bb6551010666ed9846dd2653206a6df229e09bf7a8f6d8fd9e40bc4b035eb5a95374a97349dadcebea1413d3c604fa3c7b5ec3997a5d10170eb413319ac8f37e221c72ce0c0cce7628bfe4e8ef579b87086a80b911b6ae3d9b10f1bf769e2ba93046f63dd8668ae107c6e2b922cb1a7bd9ed1c7ff36a7b164e3c9f1d214923d285db7be6344fdad39011526fe7c83ec1f5cddd14aae23f4b2e2165742332a4a02ac14af1a82f84f4ca887f31c6b6ce0164f40ca0be85c28343a58aec02c075bb26e2ab87bc6f51edbd14b02848fd93e22f48f04ab5bacb6796b158ac485a60cc8124e5d0f9750966719b2c7cf405550d5db3d33b19eb249f2e2e15dd7c6a2b7b437142f3e6aa7406ef063c545236db2af61cfb9b717f93d214020aa627579f6f75b008180c7659763e3e28d8ebf9efe0036ab19146dee1a84e177f30d08984511fc98069f142825e662a383246b457d78a873d451f70d6cbe653bca2ff68a2c847a3f20b1f74b56470b1b487ecd1dcb8965ae7e0849c39e0e3a008253d5cc07df728a6291e76bb3363bde30263b6462b2ccbf78afdcdd4924ee5ade110cda817363fe3e974ae5c7147350ec835cd5dd756c2b46a13686d862e0af1fd0323203f0dd0f373ab865fc724007d04e97ce9651b2768a94dd6cd678bf61da29bc6f19d82c41cf04b648edc030878dc082db17c84e2596e347fbcdb6e9378f7621ee3d8a001a788dab2af59eb34477819477ec597dccfe24ecb018adec84c25df94bd996c70dc62e2d78be5e56c3101a43218e85efb142d2623661ee37ddf539a8e4987f0f902a7ea3bea29f8987f9f3255478ce1286f7641edb13c859a7baa1c754d4b3385627e7b4694cc2ca17a794a1ad359274c27e52992ab8ecd086652ecb2928c3dfa45101c605077896d67b874e883f9384d85a4657b1cbcc2ade87292abe0f31742f18555f1e7d218e59183382820111c15d1d87d0fcc6e6c724b3297cafe28c843af04ae612284e0f13f031f40724cdb8a53acf9b5824bd43fd5bb8276b6d258e7c6b5b018c736e97ab860b099414f7e96524662d708fb01fdd035db16ce99d01480c1e27f9e8f3c6645c1749b55c50d2018ce40dc2427fb9282c82b140f2737b42350ccfc7138e09f2e4ef1ae76548e0feb6d192c9f77cbe8349af8d7412195aef889f7f806d8dd0bbb31b13b6ba40b4d144a772f409278e62dd6cdc72c32f2ea4795eadc26183c94348f3ca8fd5e8bc1da8fe14dd1210a73b7a22f4c97005750589c2d0e99a00421e093185ff42a17538761e0ee18cb8a791826a8ce4c33cbc872c549f827173d990862cfc618afb6eb62eafb7adf39ffdf998cbfb51174573ade38c5009826f0e6f427e94730967071b252ba59ec12718d82f9fd69af6b028ee51e2990b37424efec08ec4906864dcdc0c1a5f307ffe96a1b97e852eebfd4accd9ffe0f41aae19c382d6234602856e8d45e45b0faa86d60ab8e0ad99518d57cdee2cbe50a6f2fd51fbfd26f072492a8355121f98cb408567c06eb646e200ee762101879d66c1782eae6c564c3210af62dc3c13484ccbf35d426115d3f7c86d39f506e356d48a08be2c9c27a5bc7c4bb02dcaecbab979ce3fc16062ad1d7452adecb538097acd3d84c91511999c0caddfdc36f24c9bea6493c -MD = 661b576d9751845a0dbcb2bfca1d1cc2b556e22a0d671e35dbc349eb51baee0ded828f5288a01d700509fca206e4a39815dd85af1b7d706da78abb8e99701129 - -Len = 92896 -Msg = cc5a4209a6a60dcf12621e17150b4576b918732e0ee8d9ba6ff94ea6065af1a4936310dd68a34985b81aefb212a8b06e29c6740ad67487b66072fb4ffab348788d0f36ecb838fd1316efaad3bf78c4a8114b30f7b00c529fcbbd75d2a1336d2344c67adf9d4d70a1b14a15212261cb4df90f6f9ba298809d384184d604c0a7cc40f1a65e20caeb581391fa45464c0b84697af89eb7005ad73066ef032943409b07f680104897b65fc32e1fe63022cd76eaf495a9f42c28763a9480021aa57eb9233fd19e1d9d19df49874cadeac9594a03e50c64630532a1df33fd7bdfccaa4e1c3260afa7c25c002e064b417b2bf7293db526760b71bf81a6ab2f157ea20b817839f7ecefefc6e9f911e34ceb2fef3b1fccab88f459193e1765de79010eeb7bc1bb5cfdfc0da0c33212db7342bc88a73192634127a686ffbac7d24f6ff790647e205889d60232b56170fc6089bc0c96fb70164aab3e4fec183ad23ed147436338cfb33886b8c4e80f930ebbc816c12f06cc8b4a880bbc2eb827a8ee2ee54ca0763235b413159e84c3e3d92b05b2f09bd90f8beac7f414ed22f41a088eb9f344c0b0a6a2850308b006c824594a78e001fca2ded26fe0a150df0bf134faab80779eb1cdade56949945faab9ed9e50db8af8eb4ca988b9a98076d2f41978a33a60999d737b3a2eaa5956f15e8e0a22275e54549d171b6675a56fb3ed6013896b2838dd60b48c3c73277305dce494d60da4984498c62ecf4de65314a2b0d04559f604d75c01e37aec253f4efa984754d5854d23065bccdc786ba95fddb2b9bf4cf384f42f0a48d05c7c413582522884c728fa58af81fa75405df9fb640ed5e08e47409ca076c2260d5301203ab9414e2bb6274d5bdec282ebe4cc50ff6b2c8e6619c03879ed5a6445d30878ec76999b48565c69d21a2bebc227a8c67871c7b21b918d2e801917734d24dda65e31385167312214dbde3d980d4f18c596c9ad35f6d92ee87e9f01396d6d09105991275ad06e00b640d201711483a1b5201be6fd3f162bcc3a2a209fecd71220a43e6d9ccb367fb7c79d7e5f1eeccdfedf0e7bf43e730d447e607d8d1489823d09e11201a0b1258039e7bd4875b123089b4b73013a165ab710e91fec2babe0ce4e221f7096067d775d5ac4165ffc2b3c1b7ad60b7d279d8db96e0ea27a67b53d3ca89bd0f65e0c05fd9c9daf25f26e002942adfc4dcf5b2d4197539949e388f19b1c8e0b08e05c92df5550fd0fbd73bd8b4bffbbf3351e01700bf5b7e047e1523325000814b5f487cc2ee3e66485c2dc0a3ed430b7836d700e73fce686bc48c8cb6cfaaf62045c4a8cce60546e71e4c36ec33443e0ded1e2e276710d846a46bb2d9883e83af61d45e7dfce2e73aa60dc7f8128dcb870d1bfb5bd5b14227862931f52a49be3b3bedfa506365cbc58be8e0521b7e38561f5704fefc2e2a80e25b86a4264b0a662c77f8ded9fc591a18740c74aea4090d9c55b78b5ae615e561693d60fcb0fcb2bc08f693c115339b0425c8ea5c8db21ffcae9f8b728788c75bd8a2a62e1a19a373276ff9b95edfeab774922da599c7ffb8b82969c370f7996a20630e2af4c5aaea59c17b0317b26bbaf6f4b90a56cf4f6908f1b0de40f6edf4e70ae383cf955b89f697b26efe6fa077036d16fb531c618627650b1365eb378482e6d0b9091d17baa45f2a3d714c2b845067b2190d53e8888a1fa3135e5908a18aa3504b4fa17224d9843cff0eec6f5b347124b3e3ea46f8a76e434e98c4d3d474acdcbaf1e6fd311ca3754425c4de744615f98c85640f4f15fd5635b3c31b85c78ff0789e320b67c4396d7d547a1b57fbc27ad3503594044c3946692db8524df9b91604b3374f5186b2803b2950888ecc035358d2f397a0b0aeae4965291a8581a4c80fcf5b1b56dabb47de030cb8814d650d6d8c126cbcf9b9f85708a9d6d505ff80ca4112021016904f067fe32dc7e643f381fa1695b16e07bf2276af19b4fd15daf4b6e095e5f0ede0250e984adb2d4cb046ab74a516b4046d3c3d9d559dbd8420ffaf6b4970c030b5ba2d80b22398cbce2bfeb10d55323c7cf4dc190cf7edc71d4b99068f291af53a465b20d649af6da792825051158f1c78fcc096b26bf45b0a78e246f9777797d85a161d39a5d78ec72ac4d6f2a01130ebb4899ae86267cc830839b0faf46cb53a55fcca5ed0b7cbc74534b974bd6ef64fac959a1163ce781169fdb9162840c9bada7dbca852b6910282607c59a60ee91f458318bff88efa201eacd3dd7bba31e447f768c8945a7b1362c69413f26785c52fc09b66893fcf59b6d595a3772faa413f1853122e29e67456e5a5263b1f68ebcbec9687ae37740892f6832a93278f5c204f0027789b6f9fdf2c0412e87ceefd9a459ea5d02c64c7638e00b568285d8f8c09f47b1c2573108c28557c7326a4752b9a184387853e10891ab2e66ea89165d2e7b48f715e9d50be68fd9573a305ece02897d33cb85c6e741afe300f2ec779a556a4c720bd4aeb164c81205258afcf689fa1f7885c3c5bc50d6714c2317c3573e559d492b80849f461649fa7ddfe87255dab02c2d77a42fc70622730470c23bef2581a5fd551f809463c55dc997ebe96e13797a4c082ce7ad293c9d1e603cef72c041ae0abc46fa5496cf57921acd04dd8bc28869de258d0a2608f1f750f81bcf10258bd91bc3b59097af105fcf566aa92cd37e0c6157c8e7e5ce9819a6bf660cfc7465f3db5c5a4f4eadafb8204dc3dadcf385bef98a414b4ed6ba0ccc5978336b7863de65da919aa3115d25747cb979856bc5050e85a03e49677d56288efa4b4777ae24200401787e22412f34a9f28c0e84656c08118cc8beca0c812426945d77ba6d4c73a453f1c729845dc69d161e5f838d784ff6adf295488d1526e8ed70e389c9dfc8802f0d666e4d389320ce3460b367b34bfcacc3b6272998989dae8c732cea6486623bd54339c54703fac2d8f95b18a464ea314409af0794e10d7eb90feaf7631410225046d213127ff2991112c2cbd3038ae37b772a5090690006009f0c1965dc528a86588061216dd1fbe89331a6c98ea26b72e6de2b15983eee680bda77f145f21c805f8dd4fd365f926364f0d10d6ffb70313f14c1aad68eddfa3b9c3a8fb7b67f45443f962d4364038d6d4775270c5d9bbe6b1439d78bba7bbd179a89c79a685bddf0dfcf39fba8f96b977ebaa0cf9094235126bc241f8871b9881c8d2257ce5a514ab4a6aac5f21a07c8dcc7ff1f5b0268d892721afac167f674696d2754b122a8390844060b0c0e68e9aac5cc63878e93ea9f8240842d047dc5ca525ffad85beaa721d1d834bc7e96e331db9005dcdfae6e97151e2693f15561876450b10dae207b4874a5a8cb129a9cb632d16c229ec04bc0523d46bcd68632e8ca84e216c2519dc555f7ce01717bfe84f11a002172d26b6362244e7159191e34ad83f3bc4185f4e09d5510254441f0e241f029a104ebb5c76c5ba47825150fb534d34ec7d0c46ae17448d50132f459174add4f69fb131136996bb299e082ecb188fe59ff1917e60f0157865be49d236c3368da42005267f611dbde9e33689d71d08c7e2cc48551b46d0a89fc01443529251a32f4bbb19f50fb33924dc5d0093d3503241579179116dfe947ac32ef77964779bf47d337a28c7ffc35703fc11a5ddfedb283dfd48f7d807d28321fa8d1fac20fea03f1ed56f2c7bd2fcd4844b718f5d1923e9ec43333784d95586f762b9fbd6419efbcd9a4caf8fee72d8960c8b7a0382b0e5fef667feee1f4e4cb626dcb61feb5d4dd05745b3d48c757a91d368207a9e5bbca5e0ea80ac2ae9fda727fc7d667277afb79afeebc2136155183e7c153ac280c861814f7f6772c5145b049db4327d6a9bf3c3bcb9d149c2d299bc4bcabc95cca3c2561b4d788d5c2b324b44ed0c42929d055023a09a66268d86cb5bb3889e9bd938edc27d87e10b9cdd5a66aa7c88ac1d8cfeb832861ee8e07fea305217338ad345a6c971ee047003bcb0875edbb603b7cafdded21cca9675d5a74e38f10af62c691fb4ed436e15da40ec3b8cd23125d66ffc2c11d6ffbba8387129daae6b7a3f23c709220094699b0a7bd7b6d8a0af03ec7814843d34d51208d637b997fb93a6061b2ac2adfdd7c089de006f577afbbab0d02c7bc7f05f2dd7551c485631bedb70babe41b4310cd54f813a08e73698856db2d89affb8d666246c3c2951847859f3f42811bba46563bc03d926005a01de738ead545d04b755608a0bbf228a3cac2075fcd51cee8dd66fe482592b5bc43052d21f2a585a9e662c4d2f8c31b9983c56aea0ee6065c2b7dba1b9e4c0b25c258c0ba29f9a20d832d8140c131778f7a5371cc8d02ea0b0827fa9e48b890446289fb9dc266b0e1126047d25e64c6ef751222eb92cb035d3b0cc8b96afbcb7feb40e6b20516368c5ca21e7016838f203daa8730646cd8bb8ed52b544b40443f242488e23931bc76299c0f0232b75b8a9ac4a8834d0bf28bc72a2c5734ad84edd6dee913a8deca0741f52170fa27b19553088bcd93d1d736afb2d1aa6d6a12efc916112e9846e9a76b565da2b6fc19a9321d3af47fe511250e1624363ea076afc573091c5291a0be7167c981ae5d1b2efdacbde2596f28bfacfe2de1ef773993929dd8c31ee678b419cf70f32a73408c7d5c1a7d6999a26b5010f394c716e205f73d860d436df8f12c3757e171650f2b7ad65baff6890993c4f77e380fa6f96cbefb1ce10b50a8dd71468834cc5c1174bcc1885f4a67e49ece59d6b3104e0730ad7ea126bcb410e1b2a50ad28380cccd0ac6a775ab5cbcf437df04ef0f3793b88d6f1dc69fc3b963b5fbe5a5def8ca9f2d8dc2d8629018fdc6300fd25788256e257598a8fca52acd43f1219424ed9353eebde072b72a802045f5ff462f6a45b93f391bb41b82eb85242fc7869f86ad4f13fe0a2af1527cc87ad5dc32de057c01a162add2438185f5205cdf6595eca2fd64fa47e85a32955a2f79af7dad8051af149957eabeca7f83ff206f184f46fac4ab569f9438ef523f2a888011e4044d29608620e4d28661998825818715bd3b0baebd1a17d4b43cdf34ab55d5cbb8f6d84dd010a8c8ddb49e84101c9a2f79ef3c36d5c15776a7d9a2148a38b1a9c5d724a3202f1fe8f6fefabc8c4939e4a19dbe0b469b3d66f0b4f194cc308dc8527576291d862f79faca14f53f0f4c7d5ecef9f5b9b0b1ebb852327a1945516e885a34a8701cc1c5109d56fad176bb42d70955bcd6099c4e273dcf8f1b80e6e48f0dc8e9c0f9be1261012792eb866e7b35d63a2744ade4d864fc2e9b77e832728e1698b1b6260ca9157def8435484d709fbd1000aca473ce9817b966d8861e5fadfe0ecbfaaa95d2539a179956c341693e473f0db5f72f7bea16d6b7e46092f5164b90fe338d3fd443de0599f7ff30ad39fb2f1708ad02268382ef574381777aee88881109d8f4f90ed3224cbf050485b96248e54cced3168ae36b0f9eeeb337603a5dcd26929b87dc01d67957dca339e602f3412a63899428bfb2a59db0307491eb77fa2fc31cc7d4ef8aea668cf711e76696f14a730ee885a02ce1e7d0d479ac223e60cf735f011f25a465951ee654e5139bbe5306495ac80d418d2556898dd7681ac6acab4b7de42b8eb38c995a4c07936870ee2422321a8f596ffe4836f93a4473f56e72ca824c8aae9cf2053a3f766c67cfc2d681b7a2addc511bb0c306ff3eb1b6bed1c4597fc96ee76f6b6e765929fea278234e3289ef32f9239517f94bde3ccf44cf1f4ba470355eadd2dd39d94f97b3b71471ebf6ddc32fbf001c1d49ad7c08a774c49ee4076ac7514271d01e6899c828b0d32a1200f7bd97f8b9b91e32da2b8fc89b9a661777eb06c311824ffc6caa72ff5a3704df376a5285d614f5f5bcfea6d48c895327c392725ea598959178213e09ef59f502e9fd99af5c77f47f8b4b919f80b1d2c0b6833d1a165a17b124f534d77bda0df2773f137f312a4357b0d8fb315d5c0c69b88810004a10fee3daedfb70e400733647f869fc3e750b05916d8a930dd028aa316793162a0271b002d23cdc14145056c3ef422f6ba0741298d4e6cc76554f0b89e96d669e78999e026c9e24f15dcbdb51ee471ea1f2a5052cd4b8e48235a91528d646f88fb99d374383ca4f65250d4c5bbb20d3c6b4c766b434a8e418b65d4f77f6c8d2e30ea6032ddf676557b23e31481f7456c32f01be9abd5dd31f229442dc1199fe84bfdc8929471e6fae4e841380e2ebad81a87c94453780b981bf7574c0ee6184581466519d859773543f0a786bcc2ee2e76a5f701d6ab89f25d6296f8c56c96a49546de3f25f797c30cdf6eb71a5e5fddcbcd3da8a1dae8cf3aed7bba61178ba3ec918c8919e6d8f2a4271f1fa34b8044ae5005bf41a0a88d391a8de78e7187c1eb99087e00a1ab62ae4a2146e424d01182e0d7ac327739badc5c46268a04eb6d36dfca8496a29f818fdb2db35974ffb2edf23c05f0d91ce699352cfe003c472442d85b33387415edcd3c8ceb7fb64fb744069b431930d28ef437aab47d922b759415331062a0bee5fae0d765c363408d29808de9f838fb1271d668005ea0f8efaf08daa29192eb287d8a95a8d0f682a303127c612a4be72fa693bd582fe34fd0f835ca4061d53b23d98c303b050a8697651eff5f3bd43724e6e243325dd390f8042e7a904fd22f56a3583f72fbf9bce8c4188f2a897c5ba0d754721584ec5c9357557408b834283f4f812c07025ea605a4919459bfaed501dc6cc27831b80351764d3f203755c64c52998e6dd493d28c8b0ca7732ad633e68a9dccd0c0a145a0c578445d49c17a1c3103cefdcf53a2cbfc0c50fd77ace8cd4669f9c5ce42640fd9591c367c01c40d8f42765d7ef8c7625bf2f95f127d7404b443c1bdb7061f0d36723f422a9124ceb1f81cf3500d90ee4f63391e87d2564b48cdbd3f1786a717415625f6e1ea2cae3d771b65ef0cafae2adf68c234461fff687a64a07c2eccbcae7758cb4e874c4aa651fa1ba870644092ca30e0c44321afb7ac30a83188d07bc2485035acf2f412711b418b18d36f43fba609d0a4441bcaab05a9bcf40f52c3116b94dca9b7c4a422258a3abc901106ea055c3850e35edeb7094835102cd4213033af16a1402e6e3e232cb100410a27d27ac07e568b7b5a601984c7328bd5249342f77a4026a1df2976b1748060ab154948af1931b6f1dc3ac8f7d9c786c62bbf1c168df2c5bf7578a2a10bb979846db32190af5ef042c2bb9a19f33bc837d5182184a825b7e7dfa03983cd17f6268fa4881d974ab1febc470f539a2baa9a8f32e5ba8f7577bb6c449dd25f3850f1f991deae7791967607718b4d3503b87ed893eb307a5e8f9ab9ba6205387734773a0fa7bba6aff85952dfb05f6a506c553fbfa47f1f4d6a0626960894df70fb46df7275cdcb0262092cc5f112809e50ae231aa40ed4ce819e514c0429ba922fc1486ecb6d5b456e15d3d8d00f4e49efea31396c58415e70c3c850e70c50773c7713691b12bdd566f0069cdf9df9efa4a9d8a06ff3cb79c206da5923e5377ccbe8aed5d746892f07483376724739fc196d97c4115a09accfe825b94d2ce63f38869949928133dea95ec8ea2aa3750bb895dd390303527424e828e5b54be32b1ce16148ef4b5450d7c4558c7b3b317afcc33753b7885c4c5b7762830eda94cce3897538101d51221d1967c1e66705d6707634c8a1417da1ce165105bc41919126df63bbd76fb0cee3be5e2efecf58ba9e1f33ec42d73d21075572e2403950145163bb3897cb09b3b633c72826dca073e02ed3533ea2212691b556ad2cfa66c2eda6ca22c3b7a27d2f1a2141e10783bee1358181d74ab04ef7a65acaf53d2c2966293f2efdae418798c20b00dfd868d80bc3dcfcbf2960f693b92dc01b4a46b4556b78a1a8273d6f9dcbc2e955d7c67bea4a341858d6c9aa105e1e2111da1cf035de152f55ab1c91a8a8076ff58e3306e749258936db30f5d815ca627b45356981f1832c78b2559a33e74709315425059d313fb3cb9f6d566570a118ba14169cb456412da3c57ef5e9f9f0598bd212f476a2c12c99aba54842ef309840df36e6577cdda7496d0f11156091b5877083500e1e786823789f47eae20775b20f2cf2f5c5c72dec117c9850bba9b196c80ca4bdf4c3dafb9ea1d1e8098445901c5f2ee9d18c260e4b4dd8265bb6e24c31056f10c6220984766372a4c6356c3d9f4416de10ab341273097d00c137ac1a54141bb113117850a84aa6bb98a97e4cf082273d1382bcbb3125e36a9caa9373a9af36e96c10bbd29ccdea97014ee030c88ffc715ac1344b0e2997de4e9e2d0a9a3d4d5421be289cdc63cac19094267b7fc3f32546e54f54629b26d64760cd21be44db7be4686311efb2a3b5b727d59f9ec4a7c3684d4269b6d10ced27c1186b7e6c4dbb14addfd43f21120de568621fae1886d65f87d1fda391b68d500d834a630a20ac430d13465335a214bbd4507e16361cc86d2362729123b03160c49240f4a500c9fff4920ab476b074aafa253d7f83d634418e687b082d8663ca74c9d1bbd34a9e9bf2c073eb5ae998235854c032a84f844d4778899105a5af0dac9e9f210b8a94b786432450589a19c56d63b8e809e54310dd070094529a7daaca84ebbcb43d36c33d8e9e9c066e53f1b7d689f82f33fb1ccd9872aa7ad15a125d1159f773cf0f5f87074526dac2f148a621b5fb9eb816c187a1724c04f6bee4d2d85c59b0dc88dcd141aa794c345c3ae6e9cf5acefe10cf99b661f187573682da2e855bf1d23ddbcac2411bd13eff38c87328ae46528367724bd423589f3b8cc1984796bd4c98ccc20dab77104f74c2e962746e7b71e949bfd64b5a1f1b485327ba357289a8243055884c237fe24789b84c1503f4b8bce6c0fa3a1e4177e7868ae8b177dd715aa703d6a5998693d1cdb3749d1738b378cf240c22e84611939759c84e2f3f34b6814b5d4a51bad0be3f79906f00cdeea75367908830b394c6f612bd8e01156ec26faa909cd48325672f69142d691ab6b313fa3bfc90106e0c23545cd385f69c08b280252faa760e574e00643aa8a5c836916a42d27ec2f9edcf8d1ad1365928e40a8a6f754c1a0828fbde253958058fac5c1669ac6561e4b62b2b7be98ac3a20ec827f40021d58f36b960cb8bffa0798ec4acf50cdc63ab2ff6bdf49f0bbca3c38bc74742d43f201b1726cba4f80d12487b8c99665c5eb9a592c3195421aa8abcc606cddfcbcd474095aeaa36e9a1e683d143bb3b6da99ca18fc95ecb7523e344f7551c1980f68141a556eb943d1562ab7650cf0e78dac0be5e4f39477eaf3a16a040a6928c414a98d6be046f7ace1339cb3269521668c2568eb33d6a96a2eb9c4147f1dd56442fa09a42890b1b4274b950770ea8beea2e048193dfa755a594306ad9825c77659d037092ee09a6f91394a68d2364eac54042d76f9480443db08d7d73dc82582c1f3bfa1db7dda6785c762de34c391280b58c10b4f087ead1cd0e09b564f1710e12b487515b198246cbb86717ed77deb30a5a9df28810b1e8462c800cb02c7a923407a8bc5c2fc2cafde5d2a98bb3a7c29b390fa6afcd1207b88380f84295ad4eef9ffedd4f92f09b4f890106bb7ef63604a1c65ffc1fb3a6908d8cf690cfb1aab1f7ca3289e5943e5d1c62bdd12c4293b32f527cd18aff5b6ab4f4863f3d002c07a9cb3abf9a160a930a884d716e2552432c448be4915d7ca3946825825011496d20427435130ea67dfdd224209716f821431d1b99b576a0d7a648632ebb7d895ef5f06daf02e6989a40e0e04349800bd9ee3c9a5589a36e836525bd78d1ad725995359571cc2637648e34e07df808f3d9983386cc609c2c134b70931535198af978827a21e1462969303ec315251a469ccb827f52dc996013d3c99268485a399b2a878a33e4ded514c17ef6cd432c7ab012b9c28d7053a11198912a06add814db2585542c3958d0f3dc6609fae4b816afe84a2ed0be3375790457c864b82b9315f42c467f713c8382cb946b229c5590f8c6a3e2c108b133d6918dfc0709bd3af800ed0fa20f02934e298a98c8bc8d80073857acd2f26592a6eac44352151582edf647ee38753356b270a92171c7b84a67b7e5db8b0dc8e8665a6b2cfa6cccf1642ead80a74657646c2b7073a2607e8696cfdefd6dbd43cb817b132754633c0ce724be5572e4e732b7d4813ddef9489b20da9390df737ea2a4c73cb0f4aaeb3c0372dadb3ff35b4831e65bbe8c049f1e7272b42464e2c2143cc948586fa673153583939042d42c2b76eb50944e14ea772822a136a26dc686b5ebd68c09e83c1ef9f169034019f242d35e104d79acc33b9e64fb25fc86f470acc967da67e2decfcd26cba29c371624f3b90b48a33eb1e261b42290f7c0c4688dcc6cb20e28b39e2bae5c0cdbbe30584476b2246f3d2ee1fe8aa80608adbee4e57f65a1711c5300a1f27a906311a9433231a55f124aa2e0e1730bd3c3905c6c204cd3371540459dac9da7dbe6c4197c6954455740c9a635a6e7bea8ad2b2574dadf45d18f3703dbb7fa745dcb57e96a466912bb8f3cb176bb6340e329d0927581812e0f2363063160b36084854f91a355eabdea42364d1a9b602321be233c0490ed0c5e9646d5351332eceea91dcaae14437761fe38e1a7c388e5d2fe958aa8957d613e4c74e96d6c0379faab34ccf10e2e0fc137a71794c027f9755f99e6b81bbcbd2caa5fcb30b79fb84700473102afe4b776731347681de7ee8755c308d9802570b85479e325a281f8424ca79f5976123ef03500099839233597858349835f323c5fcf55d9c2a934ea8ae4e8606bfd30e6dcf1ffc6bbae645f14436d312c258d70817f76178e2832ef7f6d8c0cc0b1bb4f7b3e551738fa45db9c23e3485a6f71bdcbe94d14eecc06779e4b052cee103bf9897ec2639689222b7dab780784998954ad915d5a7af12a236611d6294aa51d455637aa446ae7a3df575ebde741305f05950c2970993418737536819a7cfce9d38ffd8f221ca22557b792077006c05d2120be33cff0014bd83a4da9e8eb642c248534e3a522252134fd09f72a4bc5fe47bf3c0ef0e5e55ed223ab91ad1c975eb8d4723a16220d41f7b60b0f8e86bdccd9feea1d6c015cabe1dff4db4f96f2ebf10c4a151d82b6f2007139a3155e1443583e5cd199c8d3cd97bd9e0958d0f37e6d8b00e723caaeabef9cfa74472865fc631c18de12a2f72e544b2b8e415135609edf5b32b17070ea25b7e1d5ac7c3f426b0682956f361368b80711eca1ae254d05879d8a5f0a9a3743407459addfecdfd08c4e99f7e8c4e7338fe5a6f23e4f8e22026c5084ff871db8d52672d3ba0b0f442bc14e5531983447441b4fab8810ce84de2c17bbc5c3f806d47cb3a6a1266b26437f44ffb6e9da63a22749361215689e8971526c03dd60bdcceb8eaf0bbb7e0791fcf06fdf564439489e164a72ca06ef82c0a32e203ff23e3cf786557026a26865bee31e115a0c0895e4492110ab03e8589e6c7ab168070883251d22651492b95d399f9303518c82189e54828234ea29896f10ca2df219cd5df8c59e60f1a98ad6f188671bf950165f20cac72e04442373b752a4fc4ac4cd2be70241ea3a614d717b2ff2c1adf135c8101e679a759c56d60b8493a2ee72a86b847585677b5481ab3b08ceaaebea70f1f0b1fc5e154d43fed038fec869cdef9b3572017f20fdc7e2b5a5731e3fa6584b2747fdcf7fe16b7ca9e27ec3291103398eaa2e77c7b770b67f8858c215af4c523822d484f1f34dcdfd137c29c8f673d504606517dc2c1ca4fd24180d0a7fdda5b7e5291537fd5b614e4e8f72a5d8b1ec2b375da5dac64c2cc30b19758a927c941b0153d6ae5a24e521e611246c525ded57b170c850105fbc459fd5821281b9cbc5f9fd6fb1a42ab7fc9cb9b578ddd8673e5136e5b894f7e21964e4b93ec805bb6d417e470e75ed5852b4d1ac57e5a1c83389188480ce752c92fccf917bcff0c1658a6ed30129ed54a8c1018f76045abecbdbbe3b551787fa66c9ee9136240b9c431747ba363a9b2b8363b1d57fb453898bcb7060821a80e9e94eda3f1a4ea69a7a7a81531a42874b670f7af4c1603cd6e7cad79ab441f069bf1e0b0174ba525a9046b44429bc2242b816c583e7b26715647c6c50482866f84c9a097ef1f1bf4b18ee48e3e1120c901b2c19f95f0572d386329717da38552416554e0dfe7f1dea88f3c7e8dcfea6b1f4b1f0cba3e3e08fc1900057c6ec3b6b90d2514516dd2eb744d9a99979ac7126d94ad28132d820a8bb1700a6bace9a3d6093bbaac776424fe112769c53d5fc7d3d4947a0984cc3bcb73a307b1259e217fa0bd5a58ce4f902e220a757d7e5b913955fb8b050dc3a4a5a7c184b6a18b399c1bd37dbd3a3c37edca6c4528276379875d0be16d8e104c0194f109e2e858f216c2a7aa4382d322214f75622ffe1e86a535eb06aad05a3bc8835c1f9dc1ac55d3dd5e695270bb58b3fa4c53f8cc35c07b25c582259b4a7ae0bc2a4d4ff62f68bcb4234252ca9de18c131aa0ed584f2ff274bedb45b688103387821c604d8a35b98f1cbeab5920c692e206d2756c15dcf06c009b71ebbb05a82c8c13388f65c4b3b57164c5e5ed0eafae3970f7ce2fce5e53b34913008b6226f272ba3f84671b906f4bbc0836abc1cac1db02dd47440d2572fe6e92bea22e97235999def339443a05d24fdd1303e8cb6113108e9ffca22b110a9156eda571e2056b397ba5834797bf2da4aa459d8a99d70923729e01945a78ff3ac7553f33efe1d0218063ec2a91e48544d89520af1e6be6c2f10cf8eb99ee04f24dbd167da6feb0d953f31cf70fbe01b5d0c8355f4164d27673b08cb0cfbc413f50efd256efa632ea5e1dbcb6f893ca81f9a983a3ea0cf4c6605363eae62bdfac38b11cc7b21f7edb07ab746d36ac072fbaffb38201a9753a20bd25a1c58106be6dcc9cd7d7b2bd34b863eb26b051e1487d916c056f847c5a1bb67bdd5406ddff5708f98e46a7177ed80fcae84eca8053a92857331ae532afba060da77b048df65e2cdbf4e746b33fcf75b8bcf85e0bd8a68c1b14eb13bfc06374820622c13d2beb02ec12a2d6ba02045e5ea89656aa60db8561b0ca584a157fca8203318616276450d1ef60a1534ce19163b710fa8772b2dbd110a0fafb3777ceb7a5909b407133df359307eda7a7cdd871ee4e92c7969255123b5342fbadb149c6f42848e291be77be078103de9a30f92d5739669554e3bdcd39cd7872ff97025af8dfd525106fdf1452b42b1fae73bd41f9b7be17350ed9a913f4e488b690c319ba9e893075ade1e07c8aad9269fcec55dcb1e175c079724fd0b2ce63590352ab414eae2c48df43ca8eead06056344e10091018d87e8d4f6678ee7d2e705a78b995d58a40126fce798fbbddb1fa83aa1b87baab68f5b23a9714903a0f84fcfdebbf1d659559c44a9687e71cacdf52ca1d5e99e24caf51f98aaa7f4d2e1c51a9e8c60c8952a8467fc87f55d57a8c0774bf979404ad34d055e645a5feb4c0c14459b28c3da0845d35b87ded5042890c71a939925bb20a991654eae995c9f8b495e58c84c8a77771330e8c97d42d5fc789824c7d2d84bb12047ba33359944d9265355bdb738e08ea4271b13bab6395a283f3d93cc34acfa5e604776b933e46c37cf0277b867ec0302a89f6c11b0bb30329a3e6b7652dccb986966f7a8bee6cafa2bff84b499e25abb3ff62116d4e4154413b7ed65b553cb5aada914689cd45bf9f4ad7330317c1c4a47bfd14e953c8fc9462a681ece9a6031b77e7b8d5035b593a38cb1bfe101ce1c7a4d0b0d643d063eac168a06111930aa11679b8b6b736e73c32ddeb80b2bc6ce223e2ce7e45dff10bffcb1b02f78a32035f4d2f76125ccf6edf148bd2242bcbbe9f3c5727827f0ebec5d7da17c013e30bf96d035b3b577b95e878e43c8ff16823c1e4311a213722ccbb95c5e897b6857f8de11eae5aaf517cf411dc051b94a9d931e4469f4b8f95fe880cc5bda2fc8028c2af66b699eabbeaace85c77ef9ef8a796447cfd2810cf1ad545c0dd096c3dce41e1c5bd1e921fa6b7044dd83497bc56990abd7edf4139e849469f91f58f2239b27f2209112ee779bf6d957111055caee140f06899ab39328d194b218eeb9830bb8f64e39b477a2b692c1e8aaf72427717edfd047dd438be48c6abd5fb0a087d071b7593e46440845f48ce6b3665d579e21acb9ab4469f552353a6f46574d8e63c2a3c61130da14c49c98f5bcd677d7cebce44726589d4bfc6ca26c8f3af723403c5a19550cb054aceb848a49cffa247d9114fd3b92341c4d8321297ce453c2f03f38c76c524d447971ce18cccb5aca355ebd407d89e4c2c029451aa1dbea09ee5bce54d97a2760b4cfd415c851104580765bc54e9825fbeebf7cd4909a0044a50289462f1cd545e9463525bee9c102e9686ed031455e1433b636dbcba75d2fced4082fdf92cd4081757fbd330dd39edab57505b83a13a849ce1194a57c4717a640b9566d7475fd07ee0240a725ce75ceddecda65bedd146b477b93c0816498c5c91b6e4b4a65e7f7107b549dda2834405254d2ac7c210542b3036daf7f2c2fc7ddbcec1b8d237dd97d397d89936736d9a34b631eda75e75aa11766c49e0449170f0c3430a5254b2994cb0ffcda0219f5511f201f5242370d924623a29683712ddd97fb3d3ae1bc61e7ae906a269f3a2dec6e7e208c1c80e5f70e28cbd1303486b9ce8593a6ff6e1cf662b343f18533ddc5b7f1e4e07b317e5fddfa92d6810fbc343e87c681c4cca54175cd3cc35a83af7d6a0fcee7d4d5312d43fdaa2f0c7f28dd56665843d844a5495652973495a5fd84134c310acfe898ffcec6744318ef7705b495db75a082978e92f7f5adbd17527a322bcde1a2f83037dcc983ab5ced014dc7baa29fc3f2f671aa11ca97374438b05522f7d5146071760c9b4ad04f0462260e39401aa9123c930a24a8999ad93ad6eac6318d9adde73acca05c4a45a2142f0696568ed66cf48341c4f22d6e42b35e618a2d538cad0be69b6d1a81f76291b92f563854c26f98a2df6749bb17fd4ca767e32dcf807a4a09f776180fdab2656506fd8814f396a372318011cb3e7561424c65c56a0cb24c357f4fd75c460df9a32bf0a837e08eaf81e6a3ecf628479bdfad8686bb97d16cc9915edaffeff1d903fce42b462f9417527d372da49be056a009c9e42ca8743666bc2785532efa8e07f82c73b82753655453ee765edfec1c53dfb46045b507337d7e3e78fe9984831fac4e34166e592408190e399d8aa7676b9dba7d8f5406de7e4608287aa62c52bb97ddcee97af1de0e2b2af9d912cec257c260ae71fbffb1f9a219162fdb5e677c393fb699c3d9fda708c939aa0eaeb798fc2b7596135e387020f5c4b6af974bd20f088dbfdf5e0d93306d6b88e4e3b1af999f655430aeec623102b687a9638a4d97acb6b4341a7833409c21ee1bea3b1c2910f034ea6e485060d45e1b4f4f7d5f51b0b42f588be807a7b9df524a4ede6f394498c09728d6bb1eff3dfa17b7cf87cba92879b31eb790d46b064dc67df609289ee18fcd4b1212e9c7d8ac7948eb4773ea663bea6f716f6504394936f42c8aa5744ceb035174e85fe2b09b0a5f4b1ed9190fee54eaafe3c839eadd024ddc540e894d7acfe889bbcfc4485e4187798e69a987f9891cbdae7c508d61cee7a005e23255b7895ccafdd7d1225e953df116a41050f5fd724510000cb37fe35df200bf041819d64ab34ef6bdb1249c0f4c3826e21d5c3887b0c8d1b2df9fe61d5ce50372e71a2d1edcffbade8738cc57d57350932fa4b0c99b299fe7744a4da24b234e035540f46592a082b817138cc44748cfa81a580cc46ec2991f03f79089473bfd49e526d2ab8ed1ecdee34d73c0fc38d2956ffe82e496247bce2130454edbaf9f9b19243e5d2c0457b76e3f07da7ec427ff9300d9b6cbbfa6793e7cd24f62eeb38b63d19df6f49861d62a60cf7d496b3e2b15f777c75a04b7a4ce45de178789c7af47a787f5733e89bfaa7b2125d69e73bc7b4ac372db840dd55323bf43c3f14a5b472e62f512474dd860b6a360c0fe673835836365cace478f6f8efc3072c5ca23e4ced5727c431cb4efdbdcba72db8702d739ddfca233c33775f02b8a4e77b5ada31155d9fbd274e9aa33139f76e661c0d2c679c3ec652f71f8efb3ad91779b4d049e5aa82b45e4cb12550e8c477f65e6bac1ed4823d2daa38ad62b070645f9767bbe5a69754dfaedcaca240d6f3731d8e1b49ee5c2fd53608e6c0842f7834ede8b09db9a842b15d6360aeaaf488 -MD = 115f8631397ca4c7e373734bb7173658c109e88a9c236d29399005aa3a6cae0ea5552690c8ff8e0c27a19a6a435f801798c05b0b4b1a6583abcb4348773c43f4 - -Len = 93688 -Msg = 4538be7ef6502e3fba34393bb2c84119779aac77c4c539e66f1594369e6b28f5376334329835218689d913566e6fbe52c2dd7b41c0ba9a01636bfac9918bd8b29391e576c9ac9b779cf2d003b3ba8cd66a4618e080a657490fd859b3c2342ebf4208f8d2f17f4419dbc79bcaea7253ad591dabdc6a5018c75ca6d97a972ed1232b1096ce7874c6742e9f9a34795fbde075aa5ebbe8828481301ba1a87a406be635f3e7f3c754c6907ec4f5c8c9497076a8345707610243817581dac4d234a1114af712c844e6ef76b17cd50e42f81477d805be473d99fecf111eab5707d01daa516640d658f4e62db110628f4c3452ecef63bc04e30f5d71ee3b3de881dd87bc318698a36b4456bd64c8c3d250c4d2dcd49779c5bd2c0771f21fb8ffa722864cd4a043b9e6a0e52fb4eb2160b4713b4f6fe91c1232b8a5d607144325e369c36421fb68a02fce3b8a88c3a3bfe203354da8a0cd73aa7adea9146006e09c78e60b00e130deb09601d6c796727940426adf6706b6718d3b5bf1004c2abb3b18964a5998c3fdd0c2df1b5badb51638f57f0c9461fc9344c3c3b6b520d73b26117b2814694885f6187c622b50951c31e61fdd17faca6235dabf011a2434eac62b3ead1a9ce7fc8c6281b21fc63a1593dbf058d8194665c948f7d917a06a4f832e87e15179caecf96695141f59cb88c59d9a87c006982468d4124694dba0f2c6e1fdcda24816dca5ed618f134f70fe31f4c672b508e9277b48b950791eff5cf50d4978f550f655f8be8d2be3f153fe3ea71c20a06861f7686a9300aeb1af147a7a13ea33da90de5aa3c0f078879910548043996a6f271b9903495d1cdcd7a2bbf0022c422e0cff3362a2e7b8596dbcdb45e4e5f962641b74da826fa9e7a08f2237be450c949340ebc4dc178caef58b3bbfa60d378c3f8063b9e73f3e1931621516f03d78544d2aea911689dcd05904ddb632180b34e1d0cd661fd4c4bbb3a3fe57401d6db561449891f7439105c2b027f22f0e5ca171961aaad33721154ddb44c055ecd500f7165e8b284f91965815823a46f7141c1857b14dab6e3f6f28914f1ad8b2977e3929a24951b5c6cb42bd57571fdc1aedfe9dfc174e8304116b4d872c70779b744d04cd91197b17eba9300c1261c4565c4aef62d0657d5a423f9754c0c644c92d5b30482c28ab6b40b4f40b31b4b8b0b125d64b3f9765284cccf81e9c812009f08c337ae2274cac108c93ba7cc2bf1033b6d91f2d8d42567539f74d894a1443040797ca7abe67c1a4589583bd30e15e2b26804762ef1ccb06af1d494fc9275fb2f5e3a2be940392444180cdbaa92682e19c5329a664fc714655f07ab6a56145427ea06974522807376fdeff3cd397649d41db2ec194e92f7f54fa498687caddfcc95586659fde08c70936830b563beda73c9fbe7a28ebedf7d3c31c86166b1027ff8a6359242e7d3a3711c0efdb1b0346b627429ac80a93f8fbd15c7ffb4bc40d47c86718891f4ed923f61eb00a3d8fc4d7fc20ea1b4f0ac8f3ae723add72e2f4ca95fa6975ba63ecf26d05158aab7a67c6a5c22fcac138afe4e2c47c65e95325b07c84159006a4bbcffedde8046daa78acaa8e347c6806f7f6f3bc103bb7fde820026de5830bfa8de0320eef1f89093eb094eec0da4d5ce6506bc1bd06e4ca8542b11e9ef6d14bac4d9000f384097e03fbea499a8c7723c61bd23a4a6e79a1433f10fd0b9061815e3fa11cbbdaf4f00db434078b39ee41dd7eae91801d7d696b3fa773f3fac282ecdeebc811ca5349a604fb8f5b89bba074a2892d27b8f80c4569ffe91ddcfc389e51f86dbbfc2d701413c54bd226e526d2afea7607eaf37119e69fc552dc1889bbc1507482178a4d9f081da2b7b574bd41cc5ad4e75874802fde0f705aa51d5f8d5579432ec473c8910c88fcd4e1714c072160af90ad8621ce78d853fddd13a15a36fd4487aaeec9304690c1ef4fe3bb6dd7846fcb8f2e3c40dc81d5032d02376b8b64de54720638c6dfbc5ad1aad2f2bb164e7c5ea776b9cb33925d333cf308087d34785fc3c0fd99fe942d429847d83905473f119c6580b8a5945556b3edfe7834f77c6e462600f1cca1a30ac148572fcdf61eae16037a4f590e243439f90005d734514aa23f2a18716a25f0cfe056e495e382fbbf598dd778883295771ef7f58e745fbb80136155147819bd6714bea18697d4c23c6ea29a298ae7411464c991833e0e8988ab8eefdd51e83933ee75aec8997ac9384ba2de959dabffb9d35f21db1ac67b610e9a2ff57ffb2cdb7564538271ded959f673ece348e6990e74a1edc190ef5ab4446b5d848ab95e07b173d8dda866b94779ff0c3c1400d5ba4e773c5b29f1ee2856ebc1b1f889975eab8b8400c57c33abdc2c85c888617c6669ca58d16c34ff664b00a2a553d59e886a92a01350870d2d25e4a1ae2c7156b9ce80874ce22155152b944a8822043c2ef6727440d2ef10745e0ea61788992a5c848312f4111eb7deff8eff81ee7e39f8581148add21b04298e92dd2a253fc2f693b941f08394ef69ced60ab83eaa5d8d97596482d875b1f3be588e108acde430040c5b69c0ecc35da054b3569af26f96bb300fe86c64de7bf54701f03fa959b2de63aa864e8cfc637df041838abd39bacd809307175055693b497df3cd3de82329a57470b7de62226e92fe66977481a2d430360660a1dc6498454c41bbef5b2ceebc024e8348bc437a223028487d10f5d828410dd0c03c141524b40191297974348f9c493834d46daa8820f02641ae5ce250fc46ed133d22b9ccfe5cd85209a4030689896009704905ac16e7b828227ff890aed74203a6368d26717917d1d46363091335822f597e93765935869b360525d0a0e854f941f7971a5781d610a25a5d808075270e57b55ccf33011800b0976ef81ba2ad5bd40ee191f69b9d763a30f8531973d60e3196699dea73f7c059dcddf0652cd4922822737198f0f56b668e3d6b26541797b1c8c1cac7b5aa44f97d79a0c6af510705dc53a483a76557ec1c32aeef4372119df46c3c12ecb9f358214af08853ad2132e48b10ffe976a39581e105bb6670e4bec173dd1343ad343d7159c9f23f6f4779e1239f56deaeb529665258d4e59878dcd8dd9312e00c717214ad114b9c1fe3a07c2138cead98f670728c9080e97335bfe0b24856eb6111bdb34eb2dc91455c705c8fc2b17fb9ce324e9793089a87842e82fae3288d317ce7f64592ed476a1ab1297427457b9ba636a17b4bb41f5fcbf266be4cd0ed0619b884999bc5e615852b8dd94ed3cac5e44514409fcba18073d333066b96356752f70652b3ae95cf05a52ec51fa293bff2274fef76974774e59992d828c18add8e6e2379c4ee7c1f02e9b44082fcff1236a4f990ba5e3ac2880c2a3e6b9b16ef36e38415b5cec48de4bdc8535f2736451a83ba295269a1f2c3f4a43f1c6a0125b01fd12e6e9695a113ea12049e6c5fe0048e3cc42600a58c0018a7e32377730765eab1cdd78e16e4f738395d2713a26b5e8b24681e6a6e19a641dc33680a931ebd0bccf8d8fe70ddf86ee666e264286f8f431d1e22f123211d37ea36d36b89f1214ccbba592dca157f56c026b8a71974ff7ecded1adbec2accc27bf54de17e08f773561842644d12f2b670a58f239d001604dcddee71f2be1daa3476bcb59aeca849141c7beb215ebb579deb5121da9d3c9cf3f686fb5d6477b6bfc30a3004249d96aecdec0a6d814001f001e4e9fbd2d910ba41cac155a542b0c4e41d97e5383d22cb337e095901eb7b10ee32c326275526d8c5a30a0107e75eeadfdf3564b1efb41457172f0f68238fa7ba21f7842518a7f68af7208914cc88dabe3651aa161d163140a0c5b43d4f035a6e9bcc3c538a5abb99b04916545af83c890c32deef2e0ec9f602137309d9a0d310878b763a1409d0f9b4ced04ef975b746482129c58a65848223617253282ebaabcc7d5c601c7adcb2edf7de8a12c6f3ffd266b31e99e30cebedf7d9a3a475b64454e7134f0c7688cd410b68900bb499bb9249a385c24f0639471cd181b53c70e50614c68f4ac57c519a5498e94e0751837012217f70721d75181a8276c34d9095ca4b9ba6402f5f46df18941c4187c25e540857960815f7a64a371309366ebd5d88d3ba1e547cd9b5f8a084b14efb955426746b51f3fe3cd4c4bcacc376689f4328f54c7ff07394a5cc349130dc2d716dce9e853899f695076ef1772beb03df5293f9794f7bde351e451be32252e3ffb234ceced462c4aa48301d99c9fe06258faf2768185d8367284a9fa10f1ae6e72a404c6dacb732229ef2893d25153b180465c64261fd2ad0ccc406f37d9bfed0dddb5f8b49fe06a5129c7e89c89a6861b89e202eb3c59d1811999902f63df262d4eb515031a109ddab1642a539f356a8b3407b55951ca3e800b2a0f601688c46165968e3ee06036f71481dba008acd94fe3420df8f6a03e89ff763f727849224ab0eed6d0897bc066c1b59f0a6c595cda06357f3291886bff850292beef9cda39cf1271505bafb48a5753d6eb20e75fca1b468b9ec8cf41513a63cbde130056cf0e960046fd98add2340105daccc36c90a0e9a5a5f2f1594f6dfe2d3858f0227afe0de61cd5b2f6eee621be41c66a0dbe25b36fe0b69b0e2abe56496647f8b7be2bdeb55a8a8b3a30fc5a62c8b467bdb318284cc76a38fa73a9e0a2d05696a109068cd088728dd238d4ff85d81d38f70ff6bcced2a43788ca9f41bc0f0b3658fc1c8cca1f243779770ea5b9e8475a44355fe5689afb3343802cee179aec745a07dc73249716147a6c17d15171e9481fb3a2369c78b598b554d13a27ec60bd1eacd4c45278dea17f987ef6ff1d698ef41b7c24fcf489f448890ada7f7c0e9d316b8404f64cd46ad37ca2ab15434eab6bdd3c34eca6dec297bd583380d25c811cb47899627baddd10992152367c1f09e16960eafe083a700d6237d9ce77b0f55b281106399da174d17e8980d5304136ff5088bba38113a924083831daf4d2865736ebdfde1b85de808d39bb63f86bbf0013223b6fb9f0ca762fb7d018a207a09b51679ae29d91569855c066754cd51eae31bbced50b68507e4965391a27e6d0b20822abc96c7a999358ac168ba633b2542cb3fa560dd0d796d59ee151fee69325db9b97052097f40c165b50198d0e369c74b9527529c0cc6a54e34d529f9d64514c30f1285270126d0f5c87a169aaf7e1aa2a4bb4f7beab6367c0e18e6251c0deca912ea56a995120b43e31a5e4b092be2d856a87f030f11c5eb642881fda3528e72ac3fee18a5cd1956ef2a956a5839c7f6923809bbe49ffda41f4b2006d4dba226c45b75fc9820a436d2f2e680047173033fb1162bcf2883ae25caecca1572cfce428412dbd6d051ec76ba771475988b07475ccddc3973021160ed0cd0cfddbd700d03ed3fc7a8ca7fc1ca70ae1279ba0b918157558b4920d6b7fba8a06be515170f202fafd36fb7f79d69fad745dba6150568db1e2b728504113eeac34f527fc82f2200b462ecbf5df1e13d157685f7308b5882c083b6daa358fcf8c0e5eca28d555387d5dce88bb8a57860f30b4056610b9b74c2f9ddc7bc737efa1f947b276d69f9ed9aa92bc310a0778bf66dd46bb26d77d8acf7aef3554a0c1969c3c6b571545d598b317d0e6dcc26e8a80409dd2a9935d607e4f20779c5ed7c25dc96f59ffcc7f431dca614d810cc9c9038a754d1781c985a2871aa2dcc6b4ddb46b38f014a7ee613136d7e5854b2d23672757ab0f076432d2bf3857b47ccb11369e52a9f26cc56b93c9cf4f68021b023183cf4ceea8902095440406a1e59d256adf46e7f79f76cacc1f91db97d5f5ede94c46d344f9ffb740d1f8202395ad82b7aa705ab29485273084da2a931b405ef4cd58be805fe56f8be5af34c8017eb1b38c7942b20072d967b5f2ace856acddfaa37f6f4f6ee3c1dcdb73c4fdcd731ad4f1cc605447c289e80f95e3161c8dd3514b1575f08b9d56aa3ff051433e4d569276e40437fef681281e1e6d9ae155e79f40d563225a64867a8f9f5a16f84fdd72885adedb8a7187ae5e069ce529a7734b1119a7434fcbe9c446fb5007600d280bb29b309d7ed5e5f14be9019379f51edb386cc2d1d045e92e027ed3932a07beb4621faa1c3096247764302c1436b132c62339366c80651d0e2eb445289ab20a033362bbc66434dbd733767ce6048e67926e298261d49bedeb4816255656beb28e830ee63a7e2474673616949757cf25d675983750417ce45bcb1f049ad26020acfd7ea9d6e30776cde8aae396a505e5f8d61fb5b65b6a88c6445963749258dce4ef2c872a37306b61c7adea6270c530800c2a8e1286f763b1303fb2620b0b5fdcf4b2fea2ff41cac95f9a29893f8f8de2844330e358a5ddb30b5c81e1c0ea11eb9a8c80ef8fbdfd7b1cfa218985c766b6eaf44eb744f87f32521a42824897bb974d23be5e7d07abed9c3852d1d7ff43738ca827ecd061c0b5910384a2167685668912f77e4ba13ea739ff3e00baa9bc8ef5e96d129f643ab34492c8ef9f1927efdac4dcdd802d3e1e9299638482593a8fc3327ec6e68255c1e9627fc956f21b89bed3ceea9f1e12da12a133dbd38035fc511ded586a4eaa57fbdd19bdd293d8daa1aa4e241cd6655056915f7522b1373b4c0639657f2b90fbf87d373b9660c8492fc2fb286de89e27bb0426ff045ed6e30075d37cb9aba2146bcd58c1270b925bb5b8365626e735b6dc542ac7dcfb6d8a0b075bec9e317637d247eefce8d6af88dff4803bcc34b484271beb6e21199376e8152353817f55dca8677a3d706488671af27957b263a32627c5e960853bc1501439da3027c7f9896ac67b013237a56cd35c72289df68a035aec953d6dd47f9c1bdfd110e5ada9b4a5cf71f6c2b28f00a57d2b2cd36fc1a23cfa8f533f6636c16b91b8644fb31ee4c5fcff7c9687cdd91deed4e2f731e2894a6a28509e838f568fd9e0a8ca6aa1a067d964011209ca4c991c2fc97ddf853f0fc60093ff9ed1c1f532fa5cea26da6de7df5022e9cb0cd193af9c6edbdaf229f99898cbd72aa69a3817660f238a31a3e2993460724e1e1eb9f3ab4195b6e1e0945c6136b9b99655d4f1a42e0b074ff8d47191384ff5667a68a2ccd04ff5bcd96c8bfa831bbdf97b387c454815207db33a02e728d7739e7b1c1771994f19eb9afe91b52f71ba7870eef1b9dbb65853998fc7b6a0ad2afe9760cc4a0b278606aba71831aa50417bed751c8257733159e2423a703e359e2f65c35bb6b47dec96721299e0623bc57c3747372f49e02e0943fdc5b450154fa95cb020381396900384ad61521598b901e4f1dc213161b0ea251f03f394a0b1e4f2b3d45ea72622e659f438f702fbbea58ce195f89c9c6c651c228fae6a7c577abe5ac28afd8117a768637b5fd8e938cf85b2ef35e9d4b3027fa4a355500cc2d315f1855d755bd0df469792fcf5c5a9f865d23239a7cf175ae611e978c3e6667690248736ad0af0e67afd2a4ee83594a8b3cc199464d01bd6e5f6ec99547dc4ddc36062b713030a655c00abc63e9d8b68e5fd0fd6af8c32fee5d00727805760911641825f25f86fd4804e92035781e0a173018f60c647ff4b6c19d3b3b5f7bc090f24708f844f93ac7e337786c16756fae16602d367b7d334ef50dcce83c359de24a5b7c88c7d3865bc5bb6b11ad230ddc79724aef2404153f5f18cc8686eac58ed21c2bacd05a088a123ea22a24710b28c114f440475ec20f6986e41e24e3631cf452ba6b47d8e9df3288c5c263a7921b570fd32fcdd161497a1ebbb7fe689d1517c4d4ce149350df8d617bde520dc93ba12a90c79ca61b72f9a9fa59fcc09b00a23b1fdb20d466148b916c88d9ebd913082fd30d9d25171450f0480c06358665ff7f439c51e2520595df41c7e088e928f5e4430bb8957eb6e6b84ed9040d86cc9558e91990073d3a1114a2a44f2d2204ce1389c8d64077e123ccb3c7de91c2becc8eb959c6894f3c69f836250e22ac2efc824d4cdd6c2b1c6ff320df7c0963c20ce85a64d9b1af920353a65505afae2ee8fa36a0b762c1ef32f43d28c6bd9061bd2f7542b3c786c449ed99391d1c508df942eccb4a6a62e2d498b1aaa5f47222472bb1fc3a13fb5ba18eb8db3cb0bcd2962418d580cb367ebda7256dfff8318d13a4b79858dc37de75fdab424bb41785296662c73fcf644a56e9407abe0ff42a87622e21f46c62d52c03197633708c2e19d171a871bc15cf0525abd8c882e3820c2cbf9cf509a3c82e68ab80da2c4056ce2dee80fddb709333250d8f0799281c0bcc121345fc2240e3f408672a305e84b0428057cb749e2049af0fa8619be880ea08ce8dcb8d08c5b36ed8330ac30c4127d7d036c3cfc6fead8c592ac0d24e3713a99b136f037ddd06a0c5ec612f72149bb68524cd3311b3c984921d0b847fc8ec7723ac19a8a8124450759b19baba8574a5482ad1eaa7c9045e62892afaa6bbdf390b60b1c2b2ebd547904819ad091c1a6dc14fb73aafc8c5e47377047ce99952b9fe371f9ac2f0214dbff949508a62f5d6979b676c513676dc6aee835170e9afbda23a4b7801aa912aaab891ea62de6da77316c9c7b79d7e0ff2f78ec364335d0e9f701ea397a08ba5f88cd9c5bc19ebaafcc9c69506844545b1990d18ed00c4749ee27e65ab5a7887517e0927be99d5a5dbbb441c697433454fdce99932d64cb6479654046561c1985f94095990e89561b7f42ca606f4b0d975c8088e5c405d9e419689c9ee3ccca0c7d8c1a35b8e91a6397d6779058c24c7cb66533f92c35ff235ea03fc6e73036734521a4c4711333b095ddcdd8fc4f7d8f8bdb2f3fde9ba7bca98ace50c8fcdb44c09fa9e7bfbe2eace9c721ccc2591d4a5d50ef4c539d601a9aa6bccf1179151b7054bdf20d305793043137de3365a8379b74d88113b1c4c792727f84593b9041e4ef3585d2206b1d959a647fc7fbbad1d6a59f80978f223e318cab22f8cac9629eddc515b6f4c5a6ee612c341891a1938f6188cd777c14f8f843b42d789d2cf7fe9ec1141423f3c9af34139d8dbe0907364748ba0c0f299247362f066129376c94a0de23823471e03861af0e9fe76da76bb543f8fdcebc64bee270404af5755ae18260a689bccca51aa85329d7842bfe8039feec95216a1abfb72c5d8e98632d75c1ed2f83136062d646a451bd3ae0771453fe179aadaf1eda52b7c0b4788d6eb1edf82116eed9b3fbeb1728c962179ba881b60c56d9e7db8f13a71c452c50993645062dad959512ebf4301184a03de6bd41bb2d522cc0eb5e987ec2c90a692773859ba7cfae3efa26f063ae676bbfe2c312721d251cb6c8b94fb356b8b913b3ea1e2d11e59f13f45d7e3651fa2b3a1a3a827f3e483035fe3fa7c93a8cbefca91a8d3f0e97fed07bcfec2c9ea57528f7b400371323edcaf6524f3500cd629081753145f05f33d10b2ed8caf701b008f5a02a3e3e50dbe23b81949b2be36a5bd79ac8e66993d4b22cdaa275fd979256be9f4f0912475118585e16402e673cdb15ebb274dcde67d05b53f7d214cf629e9cf20d0c218003d9b73852e87ae1308ab6f87c85bca753d8013b3753df11c75d2b48e2cc0e935aa2e2b0c8e8b3ca0bd7554185ad9b872f25c8f0ff6faf1726fed4245edd1be9cc005547e6b54b8a256d5b476c30fbf650361d05aeaa2748080041f4df93ebfbee8ea97e4af2b4b9f3a9437aaed4505d7da577f9c387ba1cf10ddf3ae3a4f162288a39c4541581d21d17a86bbbec3b550de0643dec8cea1e688426770974be8510af90aa9092355af834e49b120d0f5567736c52782e29c4d4ef9229cf77c60d1d4b48a18efd41bd2b8da2794fab6ed730daead7f4e01b98dcccacd3a4428a32c509cc39bdbb29910d8e4c96d33bbc72e0837a2ee1471202d697f10506598dce9e4785e39b506f4f44b35d743b528a80fd1994c7dbc7bfab58cde92e842143191fa1202fb651857037995f81f6745ba9fce9c54332e676fae9fb1fc09c3e3caabf93058e7d330e8c7cbcbd4083159256568076219527da69f09bef5bcd04fd0bf499b0708e896cfc7a7a11406fbae11ea07a41d351005c81032ce2608519e6b56521bb8638a91358b76dd6021ad8aa5b414392e915146fc8982a837f52e19c2f77b781302a26b429ca1485f623036094df58f3c35fb896b936116cf8b4f08fe2a2e79bfec196a1d818eaabad06afa663d146ef027f8163cb537de96d39cb34677d3e76529d5d7efc2a7cb1974441de40ad89ef2712e3598786cc936d4fe61c367d08aacc2c0fadfe853722254a6e9aa3ea8e6e91b872ea763689f54965b5c9d818e2a3dbec11a167af969807a79a4e160ee0f7e2bea4890fe93289b229deafb4d758fbf25bf80bb000376d9eea397b0f911e258ab3ecc7cd1562bb07faa540554ee80dbffa475f702d862d6b60e0a4090792420a26d02926517723eb56ce2e51d5fc73955573ff209e0f41edca044b8ad8ea07d195e32fb413fc3ebcdc9dbc031312a802ec026d39c83f65a68438f41d9b71d1817f9a4deed37e75fceab89c116cd725993c774c344292e3160de31039a5f6298a426a064f266a643c0f9320d5699676b8b546fe9883a664cce5973257beb38a6c8cd6db5d733c73fac9b1fcf79ffd05f1e4f616ef01e6452b99c9dd001c467ea8cd654f8240814fa9978982d056676dc54a09079043df1ec2a8ef72bb652b70bf7299d56624c531d8f7ae44f8436228b362f45334d00d4c22819c95f21fdf0b212af90f618664d4f96884d5e7dd69a13cbe4c7c352cdd77bbb245a93ca2ed986e44e7401cec0ca39b78a198279b0a61e1ca860529b0dc0bfeb98f3f03a4b3b3075ef939e0cc19283f96991e2ff2b10512f615608b1295838c15bdc9ef8bede57cd7b33f65bd16cd4650bfda797af9f560ef9f20c1b87678c44565dc48ced8aa4f5d89d30425821d40159a5f8c9a41ad5c1567c876191b5637d71be8a7f4207bef4f019754abe7a2cd73bd0fe1e734a754e623ca00cae09667295461958231c4fd2a9eeedf96c3c84ef9ac8e11d82f7dfbf037980a3452c3c2da83e999ffa93fc97ed66bfdac832834f5cd3c84f3ae8bb1c237d4eaec0e78eb693ee32dd2e326f4ca3c714723b23d2016b3adb3a03e7b06ba98e33b6860004133f9e0a9827c250f9b35a134b2ed6190dad45446846ba66b67df55742ff3f454e93964c5b4d0a46a40467e5ec0714ff790c3b2861692a860487fae1da936efa6f761d1eab08d4fa578036b1dd30a52c4f6f66b2abd6ffb85eafe4fa06aa53ca7cd27da812c0e614190e0ea0a70f514997bd0c07d0f301a3cbddfdc94facb85e7f8efc1317dd093bf39639dad10ee0fe57e07652582af8f053f98b773c01635d7f92e38743c70517eb01fd86e39319f299bfecb9c9e2ab46feebd72b56111c7085c67a2b1ce6a2510c35a3cc6508c5ce6442b564ad82e34ed59b290e2345ad3f981208282ca3a8915b1b72d5e0d4ac39c1511b7c8b7468b0dff1c9482d03dd71c05ed7a6fb64de7ee29bb4c9dc5f96dcb6d46429ec1f021324d6fe00fcb473af05922dcc0f920dc1a89eafd0df114b5e4eb3d99257eb791fad30115e16c138a0709653c2f296fd02b50aad10735292698ed6c2e05440947d81e94a8b0590f4ed085291b12cd676e812c9f4b41f8a35a28026673a6b861cd5a8e7f1af518b6e3dd6ae2ec143bc401bc6c1cce26c21fab32b890fc92525dace2b144ef180197039e0937419c1af2244d9dc7fc2e07faa4497e804b5098593111156a97a1ca1c08930e7a9e22e16e60b5400547e050c0dfccd2c8c25a00f124662974972ad8d27d4ce941643105b52173e17923b6331ea84d43bf04170291e1427be7700b9446dc2c0800365f1e52f119f08822480540a83b4ff7833033c7e2367b37b4cca2e5afc1095b76f581c44a07fbb6c5ee6df36a2765f6b20e1b1fb1c2a5e9d7f67b3b62ac6b97c8ace685b6de71898141d3834892142133390ee5da778a725c1193b48f4e8d698deda313a1fde074d6cabc9ccdfbd92b6919a5d6c6b5a765a39662ed90080d3549204dfaa5f6d70d48e1af8c84d53369d658765ef11d7b38510d9f431f99598f8cfd4da73d59b3b75a3f22fef7ae91610d5dd6db040f846ee6df7f51885300dccbcd38b5d28705078d3b9d5080f8a1a560926df75a1c417dd794a9a564c581a188288583001f4972545f951dcb33b2ab92ae92207dc430e9a5c5949b2f715a723487baab30730f9c422390d330f062e7f60af9e2e987d146c3dac6bf62e6f9c363735eaafe32b5c9c910270d4caf20ef1d2ffbbb17d7b0f9d44cc69e8986fe199773d7eed3cedaaf6bbdbe2898d07b257a961e15a3444e9739b40a951de1c5e942f1bd032bb7fc91ac84ccb18004e02f90c5d78ef65e08837679095f8a87ffc6f8758464908e8a350dfdd944acacee71e247ce839b858d630d34594a79d9ea171a87b4af9ca301ee02817a3e79490471019459900d3b3b9a804e60d24658336e3ba0c4309a9602411cc8161b7059a0c151241f40c61f91be525fb6a38a936a40de49499424f7f9c2df3a43681c6f61c7637f65f240832e3305c0c12ab11bdd1374f9ab36c61956d7ac4068b0f7eac617bb1ee43127067f9d1d1a26d454422a7a923a6fb4f8aab81416831c627d6c2c16ba8b1099c42a04510ae44e3ceeb6d0daa8740d8b270c7bfc907ad51927642269043c5178b26e3ae35187bdc0dada4ea84a3f1b25ebbf40f5cc700921805337730abb4d7a6c33a1f8739cec0cb33d1287da040f21c14375940d3b4f3802c9e9c940806afb7c2ac7d4f39c5f7d024fbaedea6b6feb2239a85be5151da94928a7c0481410984ca41b1d640e8e9e4292b64efdcd93fe88f247c1e6a5db11ae0ff01c73eef4cd78402a36175c0ffcfea6832f76b341d8800dd24a84562dfdbbd0612276897e07698f63b3b00d49f580eba00407b4c015820ce66a40be7cc9fd2a5976a27c22d29ad2662ab0aac32493e29b61033ab512294fe2b59e375e02ec6e679d9a2f79bba6b98fef8bbd1216821be3cb0bbd877ac07755910f693834f42d19ebc02be92ef7c56f86b3acad37e60807a683c5bd9bf1f3cd9116bc91dccee6def5b6e9f7a928568394cb01faf52a278597fdebde122845a94a46b9f166b71c254fd0f23bb6931d4a8e344591fae90acbf3fc885f59fdfd771111e9ed6f574d8b6ec0dd1bd3d25a42c771fff8958d12695ee233b7ffcd8bc579fab4dc5319eb8fb6e8f32e8d50ce0af51689957190eeec4d51667e602161030973b344ce998690dccbdcca5fb8c8e18ba48b0f0b9ef0a333cca92927942dbe341f5dcd1e309f3d24ec02a5a754db84ff8e7cbbc001b84c96a6643eb29032658e502ccbee89a5f343bc0d1710cf8653b536c7223b63b6470a9130359d902f877cb898c79c0f3b41adde44b5088359ec615ff2d8da2f6b00f3ff9594453e759283bb3a56c33bbfa6b7a551e61b1ab6ad784ca85628df5728d753fcd145d5951537ca89efd099a39115b3bd50a4f03d157eaf2010a3fe0b1d4930ee731c000e9e0d78fff96093a7af3c8bdf5b529e5db2c8da22aee805e76cbe18d3003448528b79490519efd40c4f9080308c908f7913fb60086741817c85aa7e52ff3b09017c0fbd51b7dab57200b653696aeb4e4fa78ac349f05ceb4af692c3d6c67cec8bce45383e59adb259511257e25cbf5521ebfb967fd0a6bdd33e0b9be70c864d62109e6c5385f57522bf391023f8a93ea06fd23c126e9b8395da7968fc27f3b614e18fac19a33e687ea99f1eb6b525553b9183369a40c7a7134a70bdaebf21b1249fad89f967e4f6cdbec8d60328c04353ffa3188ffd97c2cc0c660c4718bcb911c95c888b1a95ba805d2ac8a1a9e683aa1896545bdba85130aeddc77deb11585cfd311a4751ad2e471349891adf14908e6af16c968165cce1905c81bb9cbbf97689bfd1a693a7cc725fb979c73ed6f4716538e3b8754ca04f6f46cd78b43926ef1d4d213157120fa2b0df2d3f3faa2a03a5d13c4a3de975da7a410d4db8056b37168d9b6022888248b54f15fb581a9ba59b4ee8c431b8b8336fbfc3a31ead30df13e5a2cb7c57aee4bb7db6841e84d3f7b4267baef736d1baae3773015e9d025783e9d9cbcb2bfff751dfa15209956d4a8eec577304e07d00c43cbde10e517a20e50e92f9a551f011070948fd9fa8c23e9a052ea8c141f4763023e6da9466e2dbb5c880cd81861992597f2fef475b6d44540543c8d2d7e2bb70a190569749e6e884ac05dfe624f71bb7a5c89f9719e8fc5b71494bb02ec221142a4cdd7d86f0c7c02da47959aaf31da01195871560afb70ebda1b9df931d4789226ee7bd8a8b0a06d1df4242a4a818a147394e48bc3c04ec5eef8bb7b14ebf4e2e990dddd1301fa71d38c3379e807d49bb065d87a9187672d97549df15e0c8d1a33d9865076a895f742364aef516ebf7e19f2d78a3bf8c40c1e57ccc1d7e14c234df4fd979a4c76e8b41bf2f44c5c54a5f66468238bba6c48cb28cf55471238e37f07ca1c4796a72a6f63b2f0a27a9af88fe214ad477667cbe6f02e1376475943103b7645442d2fa7bc35134b1b6f99602b95619038d3be7bb7d672652c27b82b4ab7887c5bbb1645e2b99c6d7fe359c314a5d935267a7842860322b2305a5c8473a4882852e564ee2b19d5bf9680e30b90390402d9129d079a9fc6614b894e34d429feb0f2552289dd7a46a728eb3e1ee8796960184436b23cd1e6dc455c9425b56f737e03b358fe4107788efccf72e6648e90b8acb8492ab4c10b8ae67a383d5e9d6ff94da60c359fe5f2dddbd288494ba001705e15e1594a98bcd3f58c416616dc788997d748153f3f3cfa8d9c8731e7d645f2f4030326467e821f3c39b88726541896abee1388683bdf4fdad677857e59e3a4362cb979ef9ae4d6812aa488d62cd6884f927676630162428a28602d595163f0ee350a3a8e156a608d060d506e8d3ac84c6b77c579ba4d3d64394b10c0e54e3de2c9ff516b169c262876fcc9369ecdbc6a22215eef8e29a731b23f18fa3d2af2db8e9ea7cec6038e192277da768816cd705f792910a47ce8b93a452c51828279a12cf122ff4d26012ab1896b75729e6328c9890e2325d168c47a64340bdcdb39fc4c00ab45d28de821cc37657c85ebe7580958f66f38ad8e1a1aa4197172bf9ab496d12bea7dc1a9c71a8baed3e887bfc9c7eec73d069ac482c10dc1cb6db50490b16f88347749aee4448c2fc2c4fa5543aa546bd5b71f72c617a81561f446df5a46dfac6ce8ad5d40f142d09141ca108e5a91c87f72c5feacc67cfd7a30f893d8fc2a7dd9f87620a2cab67a878681577180adc8835f12d1fd73916260495688d37c59e5c5cd2b5ed476ef13edbca694b5c4b15228a7905380c8f02a5966e527126d74cb7692547e9c9ef5840b0ac22e22cda44db872c7ecff6da03faeaf2fd65f788116356d7aeac3ead1b629995c8d80448ea379e73e05400aa987a74dbbfe80458ab04a86240911018a908f91fc1997d0773bb42f7d040d4614ec8b6811083e7b9680fd06da434d8c28f985192b3a2f1a68fdb0710c532cc9e855a427ba5a61c2ae6e961524004132b4db52596f580fc968d1b7d67458653c2da938b33d5eb1c4d9625cda8ba8b39c351d3f7a53db0086809f0f863c7d8247ecd29034227bf6261f44987e96a36c72b3a794a45c2bcaf9b74f01a8ec2949912cb7f4d1f218f79388fc9328ce5a345b376199fe14b035c915c9d5650cc384c3f540abb2349f7db11d739201b933d2ffc73395b102d2099fa2f5d3e425b5f9844f55ff0070775028e58fe031e19710076e05d2e4aefa0d2267bc434ebe66717d43de36e32e0838a1e839c4dfceefb41b31bf96c0a18e0afb6b046cca603eb356d8c39982f7bafdc42f5a853406a187e21a492a6d62f8c8d1b6b7978192a589b617ec700652f56638c1d86c5713175105308bd612799e0f4d51bb0c9adc03b94506420396c8213ca6a79dc1707db7da2b7b6de1d86feaa71743fa133ec6c00cacb0ab995be0a647b5e78fcca9caebe9fd04d895e6cb4257d6945af495d9444a931a107c7d22ec4f0e8b98d428841a4823d2b238651510e8324dc5f6c69cf83ba14e5af223165c1c589a9f231532abbd44ede5137cd6bb23d5752262fa9842a67f536f4475455c753c1d8bff995d0811085e576e5494abcd6414598058538b55d53139ba9c365524621b46b1dc8c980c192cf29114da48b18a33519809573c0e4af09f9bc071b0ef719cb7800547c3751c5f9cc3e52dfa96edd8f4f2342cbb9a86998831087fd39f12a9c6b63c17f116bc003f4def172943350e29d6025872c13234dec29de728fcec485b9aab828ab59f16c277591f3d810bdad88b9b65c74af6c78897a73115cda8845e737712f61b6da90d894cce9e181746e95a26db24ff795c6ef84de604dced62b78acb4f9e10cfc208cbefaab4d000 -MD = c8a7f49e8f5e69ab5c99cccdcdea01c60765714043896cd560afe968ef583ab4cfa6e16b8600e930633ea7c6304c288b4f960937e36490d96459b1be8149b3f1 - -Len = 94480 -Msg = 21bcd76de4058121fa75603ad1cffbb2c901551398fb6fe8edc10f7253bfc09d585e1a32efd4434e1440b613aef6439db9175738a4667ed0f85626a93b68a65014b37fd1b0c4e12a63a9710093494991d2f740ea4a466c595e1ee6268e0fcd7e9be68eb0ec7e629c31d91867466f14745ac698905043426d6540d652145f3e10371dcf386eaace8bc4f833b29011ac309aafe5947f0607f357e57f9594fd00ef2d80cbd1fdef2ee1662d4a4839d71aabdad8b15d9f37c3d37a346758d8941b01c83909e460f589855ca0e691096865cf62698353787e7ff517561801a6ca98304f6d11d76065e75ff17a8ef5c86d9582798be4ded181424175721afac7477e6309476c14c5e750576ce3cbdc3d8db3ae68655b6674eb149fdeb1f3a903b4d5823feca1015722cd55140224ae3171c63a782170532762fdf7983b2d7821b9a6743a873808ddbf6541330021d36cc1d60eeee4ab0db38e0631ec374fceebfdf8233f3eba90216521030f044ab4b624ec1215d995fce019363522cde2122729d3769939ae00e9bd0783f03728b7d7420e2e3425b58975a896eb82276dae9ee43f558ea19cc2fe6f22aa20c1424596c4474a92f3931a3ce62c3b546a780918d745a8689e0c3d2822775ee6c920c7bc529c4e7869b819fb78020edfc18c8b5daaec576d5787d92e7e108889774ba3119317222eafabec7b09204a6c52309c34043d4be6f594feda2df41152f44a435d30bfaefceef4fd843f8cd94345eca4668d3e6a1a9fbc14f2d42bdf8968a50d68d09cdb2a4e1cb2dec250a1acc3480bbceef99d537e86833f1ebedc76fbe56bfa1cb78ffff6aa75503b748ceff4cd39fbcf76cdd7ba7ab489b0b4ee60d391c4dabc17b3c40f26ada352fe8153ff0297eed7bce0f07a200d983515ff911b317fd157c430c2c019c19faef867210c6f8b5cafd3c0e3e601f73353e9f64ff94e06a795c7ec3e320a1b0cf86928a2459d7e0cffc353fb28a4db24b239bbe3956fc0242027d1838c8122b2d75aab1bd013d9c76e94837f65911f31fb0c3695181c150f9decc6d8f7063e59f4d2d8d7d5590255a44f36b6c8512d23d66b4facaadd6d32b71fb2849b22d7c8f6d9971d7df8637e4afc56e9766b6bc1ea5dee72723b305314c77fd09f5c55c88677d034ef77620a08a1ca619a6743d5e0eafb2d99bdc63b5cec14042c3d21214cb56b65545e69c085487a635ace1c255f1a5e2646ec98b238965968694ca19bef9a50f8d436df696af84e3ade275d7b10f6ffa5a24e0c8050ce36437f113efd182f683596862ccd5eba2e2d4ffa709d9b85c6f1d56d8b6c4b9b93df951460116e7b9963c3d6b7b40a950283d5d0bc53a7d09c5406d17e3fd1065882d4de709d9a86cccc82afeae61591b285972fa967dcdd67145e004bc18c166d7564f6d46a4358eab6fc972c2a28b6267bbea29f9fe4b6117a04845cba21d3ba006ce4f64012fad96a5918e64aeb0d47ad71ae06c5646380ce20e517f23b45286a14313de7af738330c0ba7e0c059dfb62d9dd469f07ea9e58dca9e63180759dfd86641026c1cbce4f59045d391f6e2be31eb6c7f67255515f5e5a303e986a02ffe705d9c6f00aa4114d7eeb99e089c07967c1f29150ac832dce7f5ce22c2c40b9629cff90e639ecbcc4b090f3f1f5a06adc872d3a47f51b0855a1d4e5e4c43d731cb2ea4948608e99e523b510f9bab5fea78fe1b7ff3a01391b47ff0f6739e37540ce01bcc18571f0d95ec0b9a1e1e57fed6177d122821d0847f945275e931906f479aeb0f7b27f09c8e91bb491711a33d986555055d657bc01400ef770dbc66f603a59ec92ee9f2bd94d2cc970723b649085e5fc423d979f73a2c2454618d4f9ae9968393b42b9a034115dc2e7ed30583de68e9d91bfc5f7c2a9c9da87522ae9031e445f9ab4b6ae02bd15669de8e1570632b7faea64c90d19dd8c7edc91b08a8a525526564f7c9e6bdabb7c3b6e36ab13f0cadcf3358b299ec571f8edde4e2368bc03561718f4b896efb9cd6884179b8da82e0b5739f39379e9e1126140ecfbc8e5b7b687190643ac847621cd346c6e9ce34b4fbc78ea92d3d14592e1c0725bd053d70f4c599b89d4215a3f11851d6d67278970cbfb566fd40603411465c88ba890cd290ee099d0374fcdf1dd8012e017ff50352bc92173a30f85e7a337d7d37924ffcc76b7ea61fc9537fdd92b330fd3f0086784ea31e36974314c353e857b6b95d7c02be574844c7c002cac906941c48419ce8067700a4dbe71377383bbcaa56dbbccd67221804f8b9046ffb79abf1242eb32c547c42f7874ac72040d6209503315ba1f67d79f2c4a501379a6afd2e4b2e65bfb921799111e49c392e4608193704c50adcb80270c41a65bc36791c0625d7311cb5150914144b2f3c2119f7797abc85729a6036116f9fbe5840226d1b6caf81bdd8b575f306f4eca3e9b0536836cf1963a00489573f9b87a657d584f0581df42d848144b0526850fae8a7c05803c2fd789e2370b4ac943e20ee20e807a0b8e4e64906f9de9f2bf8cb9e7eb2bb6a1eae0be53b80ac4f206e5263930ae3aef6f072a6c509c035a640708b939f14c258a7a805cb3db09fb674a5688a51f70b5e834d2e39f917ce6dc494308509f6b50776d770410c7406cd0db45d9571b42e6639f04fe44c47b1e901a11dc177d3aa919814c53b71492cea85e9b332decd809470e67c4277d298be6411a3e76d2e2b8d97ea751900a26a7579c029f0fd95ba6fc4aa33d3004adb44788073555e88a051d2b2f0784f32582455d2023e529f346ea1b617148a030211cb580ca9c055b194e518d7c7915b6e4da699dca9725c77079484969559bda5bcb912c0433727d7bd5b869b858ba02577e8722990e1500ac119b022c403bd2e9bee4b4eb037717b3182869c40a2830629981579a3041c5821ada35c2f2c941535b76bf87f25b514a816938a776a7698e931de3d4e6f03f7bfcce8934528c4e220c0ef6e1e96854c777427c698381d561d4246f4f196b961e1f3fa78947ce22dd38760100d1e448b2617dde131bfc9b65c45da214affbf1f3ebf536c9bbd5e40c467487ec90185594a9e005ac2562e422cb92252a92e67883c9b7dffc95ebbd38a0d130ae104ca1f3b6349a3c88f9d71f52899f99a87455551f4e4a2bbd56d5e8ad54a64d37c8575af04044cc2e0a9de4bf0bb96adbefadf256831e5e1a5e53a4d5c78ed1efd39d4ebfceac62fedc5df97ce01ba4119dabe0d71c039b964d60f480f093431fb69b598ba47909e0b940e7efd06c4f34c874a909e1a3ec1869236116995baaafba7b02bc8b54c6bce76e3582a354742bb633d4539ca35889fcc572ff888e0e862462d1ba4be5a37aaf0e6b9c207d19deaf0eea1f13aee7cf4c6db0a486d5778e3f7a4feeacd3a703594811a4118c4935fd2d72d40f6aa2d3a244a16b5ad8eeae52eb03be76c7da3d2d46b0043c2c0918e7b9f4d9587f907d4572cfbdce3e7acea4dd769370684511732dcf236903636fb4daf998b696bab67f1ec203a8af24d67e772ed6645fef677228f76962b95e22adb70878f1572664967000a3b1d5f3af28e1b5ed1853e128735caf3eeef702191a79a9e1d069de70d3911307b155ef3fea44934254ed213abef47f0ad465583d4347643b1d75eac37ea9839570da206f0cc84e3be2d5b9879b16ef35ddaa67746f4ac2ef9e225044dfdfd6b7b50a8f28d594704289b2b0f652eb8827d16e38a7e7aa4a631c191ada3d5c96d4498d43508fd181be102c0f6e2a9ad149785bd1bff48e85005e01506fe2484a53f50c44d080a6071740ecddd96c4b530199173ca2dc1ef92e2e83f8ea14ca7b9e7f2f9b91f03c8cb4e19a221e612894b8fe4a813ae784305652471c321c0ab01caf9d4f7a29ba97ffbbdee7254e561ed76d9da66d5fe5b2de93f4c331423171354fff68727249b15f955e33d67e0079c4afb7b5258a6c0530b932f6cecd67475125fcef631211603c38c50e19384c2be98c42b549b23eb3b28cabbcf107d3b8d8fb3deb3452392fff6db980d6c362beadcbe3afc11d8644ced4041d82369e4e32976964cd7aeaa30efae292f5686bba773644aa75136a3eeb58e8216aa3ef91c8c1296216d24b46d2a7ea4b5e6f8fa5b1930dae4dde122b70e1fdd18f96ef08004325eef7a1859fb33e76b4f920f509c2abe6c431c5a792c737eb34da56c63b43e4040f5831bf361a8531d3afc2c66d124675f2090f51fc57225b52332d9bb2fa6b6fce21c822946d46c0b2669f295a092c6542bd0537f0886af534836196f68ba10d313aafd6401547ce5907fd47570f245cbc35ef82f6c2d660e1b03be18e604e87438b2e02c27b5101ce7b2548ec8cf70267591559966d2f4561a403a102df3a8409fc8ccea3062b011ba85f53a1e86d014b12bee559f13d4bbd450101db722cad8d7613636a1d9f774878f390ff8b4efe7046334ec6b7c81bfc7d7d27a080edaad6df09e99f2a730b5bd228288ddd62a4dfdebdbb6625985c2633be3bd9714622ec21b787cb9470645e9d4743d34771989fc3a254bfa474b7444f0d660eacfcbdd822656675c35e2b58c398085a2f4285b8db2a435b9d26d45db8b2cfc89bda24a1cc5bae251f0507522b63a0a9fe9e1133109fadc276745a7958f5a08ea5a7ff4f05e08663102ca153bdf033491d4de4174947bd7a9927f2a0161dfee9322af5ebb73d16b8fe9da0636186e8c0f217a76c6e6c980d6c0743dbda741360aa2caf7bc9bb87ab511ead8aff6fe798e7c4023a6654690359dbf6318c40077b7675d50a23a001c5717870d17ff15958631b9c8a1b4756e2c66db2ab15ca02c2fccd0e9dad34ab8cc673903fc9556689cee51e63748f87341d8320505b5a2bbea5fc023e4fc1ae8ab9d6b6ddc6e335b28fea2fce59732580c5e6e7284738aaf6d9c95af4f18d3247b06b89b25ce2ef5b10f278d2b23a584f265eb03bc1aba8f201febec87be15e4a14f8b2c6749cbb0db8c5a177672d4728a8b22392b2fc4d3b8361d5c0d5055a1b4e46d821f757c24eef2a51c561941b93b3ace7340074c058c9bb48e7e7414f42c41da4cccb5c2ba91deb30c586b7fb18af12a52995592ad139d3be429add6547e044becedaf31fa3aacee77ebfdd104004ad047a57f3b22f3d73e0dbd420c3b30985cd2f0a63c6c6ff9c1ef8f54f82921a45ad2e308c81f93c6156b97e54920ea6a679f745f64799821c7c3c0e5678975aa2474d076abeb79e66c7e481bff9de21706c2f72f2cba49c18aa51f4381ad52a8b7be0c3d692f2ca4adc65c3a921ade1ab4bdf79a07970b556503f8d3d91d6f3c9f1ed4e1825302ad53c432e5c31024e1fc10d42487a8436a0150fc3af05221e25507f8f789efc25cf8f86a91f5266d09374c3b432f56885bca1c87cd49d3f1164419b6e3e25db23ff7f371b39ac60cfd10c08b9a513a50c729d72a2f682b736516b4bd3b1e4578c2eb25c6ef36678b39f32e538ebfcc2328cb1161c5bdc12f4b37796a61a00f7c924d0008995a936e4c68e601a4ad7475ed084bbd24bd2d6b2510c85cfc1a44340a9822854679c23cb0ec784450bccbdfa08bf69ac108c8ddaf4d31e37eef6c45a8570deb7b068c6ce3e8556a27505ab6dfa092892f133bed364736bc4e91e017f7f41299aba34a7562072e019d2a7991f6f0b016c35eff2056995745ff9458318619d12e5cb294fcc7a34299368dd0f782e6dfb2225e7b0d8cbe140f16893d08bf12e9f802c6f4596157339f681cd96e001d61f9c094480b451fed7607c2f7242f899da53252d111eb9d8192c639fb5bfaeee74c3292dea01c59541967e42f1a33d89cb47fd8b3cca2d0ad01b567cf57dfe5e027dcccb7727ed4d8679b5f3d3188aa47942feb24d043bb266ada48cdd82b9ced1b33b46ae8e91cfaff36b6ba208a592ec2d6ecacc33a978e4c893f6f536a7e5ea4ebfc5189e7bc3c4ebe6d1e5db57fc2cf196fa42be400351566de3c5028f4c54349e703bc072cfcb48704e25f8688a4274be6b360fc8fcb53e787ad64c3bab174f2070a15a3d9ecef44f0ae9c9a0e335a02e45308d090a1868fde4af7d71a93c858fedd2d6a5d6d4d6cb2cb9b5c7b00d5c2dafb8a0cbd683bc4348d8fefaeec9c0310e559a7220e6d62edd1d24a498d28f04d157b0d508fd2294cfda369e23c9e750fcb1106c230bdcbe449e7e00448d23fcd49425f0478f8236a03c8c24f041e232df719e5a884bd0c58ac32ca35b46ff5be0f868e43b40c472e5866a56fc3b991fde1aae06f6ae9a89d615945586030b691c0adf798d18d090c34137faf0bef4612136a736163d2353511b1fde6dce2f70b152f376e51f8ed864f45ad973d3db3fd14cf1b390ff516a225d3505b7ae53b6c7580ca5ea5ee792f0273dbb2e81360016e5f4450bfd0d1873633f930dac5f8484a593cc45dcc1058e624768c8d0eded178817b32f3d40a369b6a35116ce3b2213c0eeb49ea1067a672ee0a7eac8e84efdbdc5c7a5c9d0542eddcb047b1ed0d89a3187259bb69c39a31270413c720f6bef0d634715a9a773ea601d77e3a404ee4281c5e7e7226d8a69975fff65d54b8b16fe5afc26e3ab48c4c80371f767c0ab32370fc128ed5fb5e14316a70ef982f79a1a12ae8181c61ae59be4b95f6fed5993dbcf7c07205c0135a1fb01dee79df8a2e9f325ce8adf3375642818c2c4713e8cf56ce02bc24bb88a3677d77ea685d456f26628b407ddd99ba83656c86f36a2460e4eb53ddb13200b8cf3ef953e20d3dfbdd181dbffaa557ff1783b1a7722cfe8adddc3e4749e81dd2ad512ccb8583f65d29df6ec7a2def4ac6558e60e41f0c9b5b81d2c993d3252b988608cb1b145e0fba33508f814eee24b0351941be14a0879fa2a993439a531b5f6f99396f3c7a06fcf9566b1af59c343680a2660ee8d4d301a811eb89db52d506f78dbfbdb7d9722059d229500a3fa3e09ff277dc85f0a809fbd2796f7e6b821585ab040c6fc37aaeba8a702875209836f8d11b2ed23c2d4003b4e4fc6ce64a1483bcb1644b82462f8448e9ac1e873cc1f407fa0eb7ff8b2d287fd5388b0b548c58886dcd335dff2b1ed23ce3eebbb708fb5bbd831c83e959d3faf32cc421c9056cd7e1500f9bcd28f2f010d5cb06309376960c95e90e704a6aeee7df0072d0052771b4f4c785d7b0676c0d8b9eaecfebcb808e4d06e9478a5723585925449216f11e8fc24463464ae50ddc0c50fcbe9764e1ecb25c5c98a10061efa31ce037bf32a51ac06c7d417fd49a2560c738221fa781cecdd1ae8815cf7054c4ce8ee68952cffcf8281af1d59ddc8f90edaa260cfe28daa44e2941702a172ec42296c7fab964de7261837ed6a69bc3a3a99aefe5d09dbb42bc13eb397b1f25acff3f039ccf2c6735fd010f0a589e69a1e24fa83285a917ac01b5adf92951e2834fd2c2f7fdee4049e6daccf81baf28938212777c851497ec0757b0379c730d51f9972b91a97410b60256de285894a880702b844937a6e208b4411c7b3c4d4e1fe5d667f43d8480843bbf6d227516927094e2f8240526a10bf2ba184e71a94bf4fbd79da81fe738bc775ba06fdcfd8e6bd67efb92565e7bfaa80bcc36a34dafd823e1f633b965df66a074a096f311437a1e49b41d931419dfbe7d61bd3a0220d3453e9a1f71c51d889d50951f241a5aa454894c4c221122c11b56ff6b9e9046ee4934b0f4b1d19c2c5637a693d6df7af26087eba76c1d3fa9a9decdc737bfcb30170c6138e04f0159b373fb7870294c6a2a8bb7b7d9ff189e4f5ff4596e5754a2970ed4756508f7189c4bbd595cc078179bdddb03d28154a8f51f9ca9a91f8c4ab2813232aac42470f90614bb016ca5fe99c47d14bd699bcf8367eb4051e018324eafa2f8164a3069b2ed2728c7f57b290d8ac6700380971ce27f0ca5cf62a36254de4d4e1164c40baf481f271622a49fe075dda10d8eee96f8af2560896dd3e0ad575abc03d8885fd95f234156bcc568f8ceea2f425b4846ae3f5ffae9c950b63f62f2ca546f236c16795cfcef8b898d3fdc17a009ae4e32ed76e1fa563dc3ecf4463d016df13e3a4fdff2e34a5795159ce98a7ecc51a7649b9ed4e83893d488b34d62e8b42680d26dda0c7bcde89408f63b6b50f20afce4a1fd5f4df6912a9463bd8a0892d6923b56b0d24ee1062c6e371be39fe3a2f5b8e8dbabaffa006e17eedfdce770c81b7df4a96de3ef78055046d11af206e139ea5782df99aba7471a3bfb810fb4c5c4a12d0f05c25d07c8b50ba537d1c58e7182d539249071505ea43259a008c89535aeeb28c174947b1da66edf62c4877344864c47a21eb4c15abdbb406258120015ac153eca80fd9cab2a57c6c554b5565b00a3f580cadcc3e56dbefaef89fcce0ca49397486eff311b49aea38508b5005df7c28be71c511ea4bd23cd6e23ecc6c49d4d7b62c70104140b5bbecd69f039f3749151fe9d7c9a41b4d20207ac4cb1e29f2a3440116ddb3f79465fc3fecec8c57ef78eeed4c3ff645bb4e0e4ae835711b215090bd7aa7f449a58ce8f4fb8777a1ddf8cde4a8f14b4b8afb12ab0f980f7dff341eb9e20b8ca7777525ae4140cbb592e91f78549a2dad6acbb043b16f43c2dad2507f0374d79168c354c464b502f3bcde6600f57717dba944898d6427a89a52bfd88545708fb8180bd8cfcc60b7fcaa4d342702349466e4d9e0e09e5dc864d55119553e8aff5c03933438eec05520f9b9fc52e13f2ddf9c1058f5c67e0da2f13a85774520b12d9a1df9885240551109b9410d39133e963d6c74358304f2d534e0bf63ffde4f7d69f08b467d8d524d78af84ce704d613b4762b5184a8f029bfec83993c52024fbe1af7bebf6f3b726c5214a0f0d4a102f58878e168388d747dd75668f4b72cc09afcf5df125100e3d5d9303578685d5e2ef4f71d8d46ecb695f5cc8cee952cf2712c483feae5ec201c099433062ad2d165a2f02b7a3cd6980d302f2db255c88f4b923805ce95c6d149c887c12381c701a47aaa33b78013c1ef6fc572c95dc93c31160f5a47c9589e6200520755d50596f2636f5ecd7c6bdb439ad884ba17f6a329a01365dce7682d71983e2e278f5539584885d34396a68b0f98ae8b0de9196c3e188e4f1558bf297d78915e1e157d92dc0e35bba1388b7b5d538fae4b3df83f7566c63f7a8425388f8893bec4d04548899ec73e70c9e45334b2c515fb7a5dc2d872045e94d36102aeb08e77a028770464e0838337b177ba9d9d97e9a5080ea06e248fd3eaae3d30e2d8c8b03a86d96d77bcb1b37e570d599efc4c52d14fd37f3f65b1c7047b7f6a33e88a921b50352cc91b98f5ce256dd842b72d7708b77608541bb0626ba3f057aac81c45caf051e862e38172ad8261de8eb78281d1a8bde2b430d5cba68f58a04e60c6f0cfccf54a4bfeb452a6d6af138ce29397b58a72b5678a682b3da67fed2898d0bcb34eebf98b5279bc3e8a20214321a7e23bc55b2b7613b1a9b94f2ce53e5981d0fddcfa9e2ac918d8ff047cadbb5d078aebc141eae8b1f76ea1f429309a89235535e0e9e1314ad8cf70ad8b62fd7cfcb64de6eb9ac54e84a27dfc3c774412fc72e4c18169a7bc03c919ed14e51068cc8eea9d23e416d19e6bd6cf2e6242da555091e78adf9409dfed832de1e1fc07bf3b494caf70e2228ef432d5c6989ecb7516c4baccea0018b56435d3b8fcca431fe5f25d58e531299c631c76cec260cca6ed05a20e33f4d1cc56b74962de810232b36e36e6eb0bce0fe1191a0c878ec42efddd071a62771c6eea92f5a730292e42ce4441212c79f93195b3294a90329d566dd351b61e92e1e1484d414e9acbae955efce4d14d829248a8710b4e84533e666670e8ab0f4c086e99709421c36d6a738a1f89bdf92f819d41db28e00cfa8fa60f3a34c0dead795d058455e6541a4a267a3497aed687ae78897ae8cad02e785d91bb9ebf33bd1df6b310ee66f4d736f557c3766c8c920120a8d5b4d377f7e1d5137b8c6eb585da81cc9cc6694cae162749548dbfc45863dfc575f2c2aa5db254be0167970d0c994577b045b704a6d2057770466f26e2bafb08e00c601069d323b9d59800e35a438bddd5d317c3c752d70a9e08435937f0bd9aa0687552222c8a2d7f8572de78be9b2592d852311a7fe529673c04065feb6da33d70c91791a6d0428798b4a66df4bd7870bc30f7a63f76fd52487ad46395534a3d8a2308bc273f1f763890e441cb39fef6e779bd747bd3aee7956d6c4ad4b7b82a204cccad981dedd4cccc40fd2d56deacc2f52a8a1c4563ae8ba5751c92e0158b990d0c6ce2b3d327be3161a8015d411ab36ce7f20812443092e998e1b61788e95d2c70ffeb49faf97587f04a2f964ec923a59cb429827af413037da228a439cbd4719f709d278ad1599694ec9e492e407b69f0d665df2d8274b9cb67d0cf51b966a642c7df94aa38d225f69438be080721808b62a66f84631fd42a3696e0f83b7b91000a98da82b548febd4de43d05a77fb2165fd37ca81e7a1c4419621e55da7bfc8243b23f3bd023e7921c8a0d4da7fbc739d6d44cc13bef58be171cd2911dcead7079140cfd11cba91d0b1377078fff869bce9127f643e5524338ac44d38ddc6c71b5a688ef01a90c052165c35ce8f2b8e54ff1576fbdc4d07985fabc44b00d032dfe50fd3a2723d7f366693973383c25be62df235531f39b0805ee820c11ca384d5cfab1050ba2d48ee30720750a4595cf0d40d2d027dc7b99c171dd523579d579d78ced79368fc97f9f28c289e374d0c05afdad0728e637d4bf69173ea684a05878eef9be2f507f6da2b265d84d339d3851fefc23bb79996009c076faeb51629346091dfb7e4fbe01f58f5289cfeac6dff92b074b69fd67e6a75c43ab8c4ae2d149c3a159acf24de39fa5d1c5f2ff115e5a6c15a8b9da6a0d9f27c57c11d5eabb8a05ccff40a3f6baa8de29b43cdb475d7caa6f6233796a7efb074693035c40f910b8e815c2c97f2e1920a47d37e6308368cb5ea05f402fe0c3e60c18ea46ad32e4c23bc5bbcbb1e9f95588496b88937925b9288ac69880dcfdab60344cfbf90e0c0d0e35b213549050641e3f5f2a39e7bb5a1549efea261ab33e8a0eb3e3ec37927fa88d2f0830ce2735ae889b32eb7333986f05629cea41ec87d2d0a6664e527d0253f6ba120c4885b0804ba70a6fc8945a7ce5a81892f9b16d809faeece60ad67d5598dc99b2a972bddbb10c188d8ce687861248c4e6ec09dbdba652dd7d04a4d7f79a1c05e897f64409e251c60f683109d3b4ca0ab0c0fcb62c0a1aa1dbebeffa812403bf77ba1a2d5005fe7bbb037ec7abf2b751b61d92e7bbf68ea0c865c0cd3b60182d27bce560f9429b9e5b06d4a958f49600c1acd456d09037420c1a1e386c74e3b8bf4260c54bc2b199b5183c9721e3ef819914c9ebb3009cf06eb411235e88ecc809f7914590adc7d392e2bd794de74b3b06fe798fab6f4510b8d8a17657c5bcc6cb8082c60e2b66b4b90b5f3725273096d012ed280205bb0cb030d719a052da18ce883b310f6215a4f43c2abaf1cc29fabef72c9ffee9854a1f64baf58158ce28dab5c26fd97d5c0b091d27e8f9fdbbcf9a563edde8442b34cc1c52f041ff215db7af2167b4a2c351c1555daa84e3707d2ad62cc9083d363081ffa8f32a6e5a1e2c1f6000eafad3dee48dd5e9dba5cf6c3720fd4aa5fd2da804b5c3e782ce01d502ad8524c2ac131b3a6c958b476d600588dbb94a08ab98031ee7acb292469ee901009aba83e00c6e8a9ba7790e60acaee7b069b07a7000a9973d693ea2ffbac2f1c1a6a976c044409ec1129c78a83ad01a4714644174eb02375e0471fa21dcc89a97b2dbe37145fa3c87dfdbcf6d92d4ea47c24da5dee476c6f38435e1d38d63c42bc537121e97022d95151d59d63d201f597b55f0d6706d0ba3f271a13d54fb3625e7a54aedc0c23992bc4c600cc21e812448636886194fcf17550d8088b9f8b92c200dd4064aa02727dd4f2a37a935d751306057146684daf6b5f0c7dc44c215e87957f892bd06c1fb7f0eff7d7bcceb873c3203a8df74f4e91b04bd607ec11202f96cfeb99f5bcdb7aa712909bf4d836f73c2b56b0d87e5988d30ac3dee5d7722a9322ea27a0714026660ef01fd1f68b0ddf8b484772674aa165cda9a1dff0eef8f92d076d5725e85bcc3988ebeaa62f382bc4a1ca6b76bc8bb7090a0910d9d12b5742b5c390473e7b3826dd7885639e06bf7bd5b20a4909986551677d4f1ed3223c1887d2d251ad15485b605e68bb41e9f8f56686f53acc67ef1b4466e11c6f8e05f2f01393d1deba6b4bb3f5db19c56266e5d6c1a2e86f6ab2db235e5d7f00cf438680fe5b442dcb1f8c3ae7730b92f097a1a8eaa9be8d216f2576ec3aa321567337bcfbaf2524d7d371779bb70d3524f9dd4f7a6049801c626ed168ff155bc4137af6a3f5f14e5135b00cab1dab26600bed5ce96d05f2cc3b2ba58d21622a88b2e4e08fd63524d7a4ac4c6e2d41d1425c5633c036705fb167f075a13805e814dff9ed07a67d22cbaeeab97d5c7de04c499c76974315215c6741b44da97d4f18d92e8eb40d15d2bdc2dff65121cbbdde824497c71960e23db78403fb0c34b9e55cf7381d70bbbf2e6f1065722397d48964d309e82fe00cc5e75bc731b6c8a30ac9e89b9c57bb428e3210a968c88ececd8fcc6f630d1f1b95652d807a5fa5a509be770bb948b1075d8a55149d86fcf72b51951ad0277a992cbf7dc23d6d583a6289271b0cba29683cf6523998f58ef81368d1aea8158f0fec64c10f13565cdd95e87d4c0f3270ff7cf48caae38aa15c2613e69d633dc8ea54d38bb964a13009242aee1129384447ce1388daf5bcd07dc40158699a26c4a306ba6273d9d45e378deefe0cf3320fab80c1db3c581298e78dbfab85a566eed47257b9a0cb7643f343933181e5c63fc5358dd85173126713e38d64841d64c3f9185a05d2b1fd9dc6d5b60d22894b511f6cd614bcef32c7ad5618f7e77aa6c08b792fdb8c35d0b82cc4d605614667e004974914d114fa36fe65e0fa2245a381060547af2fcfa61f9f81619ec0b572692f35455d209cef31918353cfc6f6e161f35d40055fd7d45089abe75dc35f1158f9d759624ddf7844014f000d4816f70fcde197527ef6e1e795a4e5b6db9bbb4bfeee03a89b652beac8297427182e5ad70022bc3b1f9565312dfcdb2e8c03d69e98f9c2b4abc680a240830ea1c995635434913d03b44bb4e9cd243649571009dd727b14fae16c0ce7151c5df1dee4c703d5dd8860df82876dedab858bcf58bb94f5f2890ffede3735b035d0bbcaa4ec625e382cb6e3c2233a2a03576a57366231adf08d583685762aac7015541f5e59fc5861a89a83833edaeccc1a698141a45004e590584b0a6022644b8a5f3f69763e3eca7a70115e20ccb0565d0dc002e86c854240a48ec57ba97238ae31bd6ef7a48bd310dc2fbb7f8c1f328dcba5e2a4d3c9a70cb1845f3f4c40b7ff701bc724cbca2c1a332113b1a583f12b27a56970422c845303be3011776a5a0caedd1aa4107425d519b80f5d858912b3b6412fc124386ab21fbed098b7599f442273d1ec2f04710ff436f6e9b88907c5dbfb7e1df677aab869e8c94b7898e8348f62756354056df9573072cccb1e50c01d570ced3554f4c476de729057a2c56c5a4b7db04bf1ad4fb7370b9d19b38e310ec634c56d7ab974db02750dc0f1c749f771734953538f6198bd19d140e300a704db8e2d0b337927eaf7391a41106e5c0b86ce9526a5b4dd703525efbd275880b409819a9b29a47c3b1f475c64991b20eaee183a22629e21e221d86f0aeb065c70c2b78499c7cbe0500d183a87c66e273a39b89ec304abcd432579d5a6c89aa8efb9887183987fe2ae23344b3752d7dd6ddc5839a5167e3e3792b29a1d2a75e475308ce7f51610f1ba0423e4ffb8d8c1ea585f9135128603140bfb42ca9b389da5da2d6e4abb2f9c18125fbe5d52e1635430374bff8343aa8ce3bc565b854332e618f26b01023c403cf0503dbccb92302ff697c060d34792f6dc8e5b3c933652da7f6464c485b79c8d009dc9ba8d6bc6d21dc97505acf26ad638e9a7ea2f727be7600bf1e1b0320face5a108b312ce75ef0864f05a5ae480cf9b46f2f0c497fc918d4189051c3bf800f1f27152e64aebdb58f2b8db778e7337762e92ccfd17737d39cd909b1426042dc81a7a069251972b91fb35058d60b0a25c292deb33616eef07d8bf104290a287ca81a93a8182f66415c70b74f70bd794af9f1ad802164d7b6a1b5af121fc61a39bb0758b4e5f87f9871e92866ed046830328e02fd396ada6f30dfada3cd9b0059e3f75655337ca60584a60c63f6e9bf1d93f243f3272fe0615191527fdb91c2254771f552aac4c4cfbe30cc0f3273665a44a4da2b92bbcfd62d54066df0b048e510fd9d75f3d7bf3f460ece324aaa452f6e2c2d6a23179114ecaf3137b4017ae16523b684b6bd819d45c87c94e59645e33913a67b824a0c63b52b3ba3d18b41606f6ca8489a7ff031e2e73dfcac404cc0cce0ab25565c2a0db04e8d7aec5683ac555fdc894824f64246f2783446af430c501ba62f4756d15907a38d83b06b2a0b4085b80f68b47a19987197025deb1310ec4dfe62ff3feb8edfafa488c2d11cc65864a5a1a13863ff01ed012f96fda214c9fd1b86231f5ff563fc3a4fcd904324c4860c099bb69b3aa9ed1e839becda600eb365635eff15d6b811b8a277b1856fad73530dff390912b7f956c514c0a23be4f744c055e6f57909768447683bcced3ab1e47675c695d1539911bfa882e1ef73522066b3dce7257cb408064936ffe894ca250ba46727bda756b737003981c2e24b611e1ee9d3233952aba9c2ab06a6e24680963523a720d8b7b0f6c4ed69fd5a6b6fae3e16a1bc69d8d4f67aa1c9704dab5cddcf03fd40114564c49ba681e70238b2debd6a393534ceedb71a202f8dfd8320aa1b0d126678863c682d6db1ca033c937840ee83d9c1bd5db249302247195536c3c14bccd935049eac2349e1ec84ff784272a868ef392d8cb0b0da8ae4caaa05f068c514e37147f3562543f997ae08ca06f8a2cebec3a4e278f7254dad3709f5fbb882d3ca54d5a42fda62e111a9dff28a7de49f8f88acc7d4c51a54ea89fa6eaa5b8aefd7053817ffebae82a29c0c5697a774c1aab0cca38ac2bf87e3e705d8c7f6e55252adf8b68eff2fc294af1760f41e5c1e57628dde63971ecedf7ab39b18349ce283739be8a3bfee8a2d0c89776b8ba49cdec675e027ec3f1228698b1f66bab589b180ab1408d3f2c3b7d8ea02c296522586050e119e68283904dd16cd78333b2d26fbb0a483e24353783ec06bc2e670a09947e0da8fb4e32dbcfeda0b184533b8280d30ffdd94ea24b9649519332405f45db371a1c47878d497f361420c98a71100deb58dde93ee1cc172f074ddf71a0b1b724ccf035bed18dfe533db1dd59e20f695c6b64d845725da915ae48708b6cc1aabf6cd15054ce0dafbd63c13a421cd515bece2f3122e264ae95ad1fbffe11fa487f802c21f9d13d25ed4cfb6ac37005b57ad7999e37a065aa178a3ff83a3ecff2edbd5d151e69b0d35b5fbce96e8a15ab294e3059f43af52e13cc25c3c051b74c727b00c42315fd4a9ff2722093c989793268800ef91087ad32f97dad30e954b7b62fa399b85476ee23cbd7bae3ccd5a23edd1517b6df9199cd88840f0c740cc71161a2103eb3b2507f324a12def29eb897024c2eade6a7967bffe583a36053fd2ca7a8c2369233f41adc45c2d5e9291ee37ea19e4ed43e05a6d62e85a65cdebc5078142a30ae705b7f10574568ff1957acb8c1f13a16c979d691ab9f75c7e197354970a2ad370bf92474fb0528c2f3f54b3709c1c02cee6593b9093ba220111033924ad60cea4b5f9370ad9c65d32d7a5770058aa184f14b66c2a3d4bbe3f1b9e3e90f4ee026c2e154a9eb75d08e4a594a0a31a63ecd86bdb835281513b1f7f6cec44a47c77b1740d077312bd972cf14ab5c0abef855231f1086f25759e888494caa688b13659cd0af7f1b28e11f102ef3ec1d4f7eba3af1f84e8f25ef164733f611f6736464d8234a0815f797f1d21aac30d5b2327b52d8e7e27b0b43c9a9494371808b2af76dab28c89e025e89796a3cd0c081a406ef3657e93272185122fbcd6f734ce7abb1fad4373fe3c5447a903e326a5853eb848cd0c941e4bd6b48cdec625b332ae03974c4ba58163cc15a2f28ec3f80b2a7a76eeb1925fda3668f3238d0b4d8553388cb82e89314456e9c897554bcb550b9cc3eff4f5b077ae16abb3b510ca70724144187485d587fdab641bc026e40ae90578f95e26daca44a6fdb5c69bf19a11060895a30337d4c643bea557bc0bd3cc9fdc33768ba57a0200315146168bac3b6f1f57456a1dd1bb991e5ea3760a58bd5139c6c48dd830f00c8fb1bfe8604df564d385e1225029e396cc6e2bbaa840c303d5d9d0943d9315b35efab879382649cd6a480093988246200ffc77f1ac34e79dfa9523099a4c79dbe857ba31dbde3e922dc72925bc85ed2031301084dfdb3008ee224452b802246d73ee4c78111edc9b642be44086d9df7f78337dd909dea62af9a7bbd95f5e1f5248e7f6b6a18e2cd0579b -MD = 7268dc371d074f606ba817ad4a8868e55f391724640f2f2bc85308b2b27aa312cedb9427424dd909abe8ba28b6ec7e693894f867712b86754bdbffdd5eb4654e - -Len = 95272 -Msg = 71dd3fd4d9b0e6c8835a2c63ac37d7e4e1a987fc67f83b39d95d18c5135966504f4bdc4b8e421d573a1082fd09a01a9f2489efae89e28b1ead59bb17667f93ee0966b253cf6ec8cc7e5c556245acb399e72956a61cba53dd347f1f69fd1c993fe7554b5566dced0e98662bf92804a9bc72b1434be727995eb3f8cb219ed9812d30412fb719339707d0578f2c795004ef0c4a3f05b4d2678975eb47a9125e529f2e51e4e3b11bcb9e6d5706620237cc19fe1cd13c4963c446c1811c672152147c27aef43ff63e93bbb98d1a0489620a24914e81586f81b97ddee1d1c5925ed0ae647fe735af41f646fa225278d779c6f70a08d7c1eed44c161535ee292f298d1c2ded432ba6cffd28793e3627b423067ab4745ce08e0587f9aea2fcfdbe5c53aeca20928ba18eae477e074f79e708d495d6b7971b17bc720ef15282a8089e2a4c823f5bbc6926138c50a824d73ad13730b7fc10db50a0143e256d0892d5981bde9e732726c64034df39473ea773263833a0695089025a756f941a1623edf12d4c66e37d317f8417297f0d23525baedd86d926de8bf5929d8a848235c31752697e22b8e5455e99c6506b215d41ba123012aa5c424bf1ef95783ecdecda1d63d55d1a19e7ca2928493e45ab74db58fa39bd5b33052fbe19641f0a22c4d0c5cb7ccf962f0c28a9d8a6d955d5ee87fc0cff7033d2aea123b912692fa9440dd83363bddd21dbc7a652e70be2c555af70f38a147b62c508ea77a83df78cf4f91d4294103818dd10e83d14bb36a330ba7a55e28f7c0ad3ccd9fa2d82a8f05cfd5ea116aeef3c9869364233d197980810e3db10cb7bf35f54b9eba9228bff057f61f7f1814ab4963b59094e344ecc6419722c1baec344f10a51f12404e8e176e9efed2d7090a95fef1a396ccea366cc3cf1f10b229b2611556bb5a71007be37a1d02bd3620b4279eb3f7a9686dd8ec8e426d1e80e4ac1489dcdde392e2fbdd111cc58eb4101a86e999076d344466ee176db75bb59193c1d4b4015e346aa06cb9fab1c7bf4bb02c660d7d22bf0242b9e5bd6848ced50c019c58c02ac40bec2adb534218d63817907a7da39a673c0f088fbe0a761b13774c274794c9c04b41900ba300c28769b35bbd862514db362e325bec086448d1581a3c0cf9cbb7bd4324a1668885515505d695a37c22799522c000d40c83c69340e41125599128b65361630a13b1b28e91a9a9521353c0dd7f49e4e2615512dda4426d0d4eca81db14ce972a6cd8297ae93d5f1e85295f83a6389eb3b178cc2504bd964153c851afe9d4d433ee7924ae7f1a2d653c03940c4a0484a4773f40ede4ae234dd32b2689551c90b30315429dc5b89ac2c2830cfbad463d512d492facb69caaaf77636f1be8fe6334552cf1dd5fa13db3931838b672662f263e06c6e61d2172c2aaf199bc07f2a2145f30b0c19f5c7cb4384395e12bfce0b033f8d53e6aa54243d856450e54a1f3ef8bb11e0f1752ee411c85a2f02c62f87bb9afa8fa31c06f9f9a21ef773184df22553e87fa5a2ce8f6da6efe580640bce5199bc0ce04db71326ab4f78b3103ba6966298d37da332321dc6ff6ad4c1ec488de3dcb0e568eeda8c4bffbbed5b71c011912ac2c0a1df37eacf92a54604595d39216265f99334b6f22837a7692077aa5f88a536b8c35f049c6ab07e1e56db751bfa541265f6100f21eafe266e88d6ca48ee1116ab323803fb3e62dda3def9f8fd17bc9f72bb0a4de23a5d2045bb158a936b774ae215f59acef4afaa1ec53b4ea51fa1f36507aad8fbc05b7b37e0bc510aa9deb9a5951b33df33a0cdd73229dfdbbb0cf889057918342300208a205386734d4e4d3cda3435f4a43c2f164e4c136993049525dafe76570b54f786a263939702cfedee0bc808d6ee8bb623402b53164e91b280b1c1582a2260e8758f73df3e6e6a8104515d144dba954b45314e05a995bb38e3b04b27770d2bdc9d0e0cd22f3926f2c6d37dc021b063d7c6493e93eb0f8b0d96ff234c0477bdb94848b5d4340c0c267cbaaf761977fc40ecaf8263a465081ae1c7d12d99061f69bc64f64d138f22066e2d7c9efeb86870008ca2df9b3e3b470c30de34006258d2418b57a59569727ae4556a9e981ab04d4907276d9a432a7d5e61d1c8003470de21e561448242046b255903dfaf46dbc111499877671cdfa22083325060247074a2999b93a2c4debf7a62cfc90be3f1b39e7a7d64cb70629f9bbd8a36e9d95f7b0ed08ef8bd950a602b9855c5739afb0a3ac05f9c8ee7b95d143860e163fc45ddabb1c0dc9a5d903480221d39b113ffb02b46c487782aeec3d61b3cb996342b81c265bba802c57625c029af8e8bf5088cb932378d51e109b8288fa626492a184f9a1307c2bd74c61a35d4942dcae91b862ead3d16e0b4102651bc27904686142f7de42a94931488fa254c537c36964286d0de608aee490df49ac9465f53ef2709b100ae844c4ac2afd9b874e596a58474e9ee2751434b070a4bdf8cfb390d5ac57f8e1bfcafc07e2099417fcfb3bdea38bf041ad3a7600750ac2580cdbf89b44b2fb6f763851ec335ad0ffda256877abb9a49c278e23014ae04c4aa3baf0b3d8309a2cc21960b9ad65c4976c545aa3ee3c4e5a6a9bb64360c9de392aed03afe565577219eaa3009ebef1870a249cf3e9984ff4fccfca47552bdabc18fe9bffeaa5a607f4189351b5caea375a0299e81c621bf434b6b97da68ad44be44c341466961836d74fac1d511e1130c27afbe0f50e44e0c8cd1e66c36b5d511372669dc79b208739fc77c41f3d08fbe9fa1d8f02115d432f9f53934a41c8643ced9dfcac495181928b61066e8c3401170c8932d1ffc783bf8a136389b2c81db73a64a183052dbe87890224cd9014d8f03ec98cc34e063b1f39b8882012beb618d5353cca7307867f71c5dfcafd3dfc0bed58ed8470bbd1b51acd51ac062ef5d84a9a1f01078171f0d24667d50811e2b0a4a1e563fc3ad027a9cc606be19b258bf70dd8b5273e296236ee8d7a65331585014f05006515bedd6330250e5985fdaa870aea65766ff569fc48913989041cff6fbabcd83fdf064cd3932001b261c69a670bd48069c96e7ebecf1380d82751966c7f8d69e0e94efc775fd1c4a0c118f213ab179475cd0cf6daec94eef6ff6bd06407e723fce6e172cb00cae599368d38194334102edd4988fd4b95e25a0eb43402ee6a94e83a76364b206bd300046bd2f47eba91f98cbc9b824686e975d7d347b58d783b376665cd7439452b79ed5d6911b80b887a5ddeb4f687f892deed4161e87fa0956efd488ed2b5e74d6b43da510d79b77205c3185be66a5b4cf9a17749383f742203519710f310b2b7589a6b31545e3ecd304f01f6ce783f965aa6fd341147537f7925c9fa31f437f7c663786062b012189e74142c1b2c15fd76603bd90021ceec54cc59913bbb079d39318a84c529c1e284b4d74259106ee0d16fcb9e814957170ac7ee7c5cef820625872a150825de999793c40004afaafef028150b11388c8e1faac11231fc37d12fd6df77982eb8cc5b9352bbaa646a96672bb0853c89cf9017e7a9f9378ba96c9c930342e1cf00f935360bfbb6d92e558add16c36f87a0eb7800e1a7f9f84757005e4dfd9161178ea8ee6836c678569affcec01c36eca0eea47900a4e5dca22f0fab081e139f8d1b4b3efff335bc83f51a7345160f13302841c29f5687a34a32fedbda1ae4d4d22d80aa2bc7913036f28f6d0e376485df16c47006535be6902172932c7a81ab7713edb2841a755ddff1a30e93f6e3cf1e38a103fe11df112478ff5387c3767dfc8ce6ea91623eafef9119fa6eeae9597e1c6be0bf288dad6787e98f746c3fe6d2e700a4cc4579a0f64f4893077a01bf6f1089b8f1ede425e9fce5b96b0b4a508ac0cf939d2a92cb849ab37ae62ab95b71e38edf0f087f152c366863e3f722558488a8199c8836aa0af1df1493836cd816d3efd59edebaf59ed2e61167d6546060cd2eb942f4c1a709e34ff297fab89fde80213f09f72441b240e3347f1f5cfba00cc7f518e6c05cf1fd7a875c27192d3966d77dd8d85774170ee46f8238b8a1b2b6184f96d4bf36638ee355686f0b0aa7f6570493f8a1173d9b6e0529c8d3dd2957744b35451acddf362eef35590aa2aacd3475c3eebdb58684e4a7de365b18746f705a8cce6f7db58191b75b6b94afc24a0453d110e9a99249ecca08079aee147ca10ff5c729d086efc040332d356c8efb2af15405d19dd168fade3fc33fc889fd6ade18d5d670d3df3f1c65046973516f3d00b543e1fcd4407376fdefa622556052376e60f1a92cde729e5987ad5eca04aef48d41b7311b8efb06cae35a960753ebce5eff0813e27bef58992d8d895959e53f3485bde507a306102f54e99e00268be57306963ba52629ddac7c667d7fed945353866283290b0925739acfa4e086d72f332e087ad56b969ffbead4c5ae2e20d362da4196104598b9605b794518c3420e27cbeb6c03cada021fff64dc749a1f31daf7d7882de1293e5ded72f9298a5104b966cb89b0b258c67130733c63bfe3f1344590f4024c2f36c4e7492b833a88957095055e5cb0873fa814ac5fec1e1383f76a0a440e053f455dcf6866c6625d52e5cd4554784409e01d125cd18e23227caccba002d19acdcc511c5d35638043af7175f7f683fb455a58c0211bba7d954dbce0febadd8b5f3e67349411db12d01dbc3589cf1044ce00e39485b9016be079b05072d68245683e08ceb976ad9897101e7297489d9f08663605f713f3aca8831f80b8d080577d2dbe4119fe4b9fed4910b39cfd9c88890cd89af1b6f18e31ec63081d432830029fe01251f34587570b5b7f07588d8fc46733da023c8baf2138233d3ca90a7d9d0716d8de001bed78f9374b62e3f1134f07e039a50f427e0ad8c8b6737ca78eb0f5db0b3aaf4f40a7753c9f3c1a67c19d615640569986793350dbfa7e388fe1c2eea50fd45b501f8701e3f0ff76420914061e749375f83f5f22c58fa96714255743fd7d578ebed87c41c5d7298220685758914ce82ee82ed2e12ddc7172d4b7f2b85cda20c3ec1a1b974ab856c8734debeb673fc11f06c622fe6d6782f65228099e3b8cbca58842d994fb1ae3a3cb48263108d3cae0b493e3fd1cc74a6c1cd42068222ba77de3e13aad4f856cce88e5bacbee9f41fe72268a4fb462344e856abbc8992d6de7bf73b352c07e6e834c850e0e90f8e2d2dfec8a68bccedd083c4a502219187c6d5b88d817e66c457c86c4849b88870a085e6468faae63a143920171f72a635f69488f1d8f39e5ae04b812d2d54db044096e1caa57f1d72d6b371e85ca359483761704f80b3360f4d6610e6d5e490b0d509f73c3233f8fddf98bf0201dd322851e4778fc2e5b64a65c0205b899130de268530847ced0043f791134c5647ba3e0cc4a599e6b1a675ef02b974918342f5fcb3958accd6bbade54674aea20a78f030a9025534408ff7b4d3e31934e14e5d1f3b2d376916b3a1735eea102f4df4a7843d97abf4baf9387cdca732bbd3dc7d57c401719dd4708867827d5a4339b7ccd1256b846d476aa00ec40ca76e8375bf6cf61721ae3878cb8a59367427f648c5df0c86c6e80d6c9734341b609516a08a257b7930e56b55d0a48c1c4723ab2ffc7698f15bad378685b4d4db4578b7e6474bf82f848a958f017dc237b97e80f5d75e71b32904eb41d2574b543f5f8cce5ca6183f07e5ddacc5dca490b3829e21c05e40d41a355123e6e5428e3491bde032fe80b39f3d6c36838bd92e1e752d3b1e40ad5d158793b6292660920e5773a4311bdb9236dc6ab5a5500a1ae0a054cc59ca5f550144d68204e24e67b3f9d6a3c1c5cfe5b308feaf92f4df5ae34b3c5bd9c5ffc4c8b2450edde0b3150dbf0d644bc304b3fe0a50aeb23ffff80dbe0d7005f834b3511905e21de938a502f0416f35de2404ff2a89396df813fb4840ee93472da72884c341862dc5851e7cd6994de9ded4e19eafd1d92be9c26c7b1a074d062a002e49f71f83733c418862b73e85cd8bbe50c3e34f1454d8b5528e958125abb8e6ca88fcc75f591514eb9cdc579f4bac8a5c560c2c75508e94b568f784a49c9f0106291b62a5461aa850118d0d24ca0be00a3f738f8187d3069ef388375042a7fae9149c18daa211a2beab12889bb26e66646660a1c2626eb3131692c3b40598797b32c71088d4c3ad3e51b2ef8c6a9ec771b31a8abf4729441fb95b50554e3925c569e3733646f86fd7ebb66a7f5c63a9390feb71009fca61c7c42c05bd8353a7cea23a686d5f789091626623fdef84b5c560197e0ed31ab115204d0a730eaea69fc61218b4870ab9749c0a3f8d8bcb921c90eddb7049e1dd10b30688ff5512cb3ebbb4ab932678928982eae9b898fee84685afadae6be78cc0669fa7eac247beb56b684892a488c2d7fc4e47057ee6614c29a71f51a0f3672e225f8ebabb14260cbc76173a6a03f266f37d81fca64ba335621d56e04fcf1661cd9066faaa43ac4998254112deb0c93f4dc0c02576f556091a587de3e24140615078562ff69af776e6beeea36959f069f45f2c0957ab23d138a1bae2c0128d37945f87e307e2b09a8e89457374c40eeccea2ec2fb237b294a4403566510aa7ea808f209d45e27ebe77ce6f0c65baccd1c5d0291fed5faa5a467d18f6fdf03382fb4f4ae618640ae98bd594f6a503d21fc0330a6272ecb32b069f881b2c8edc08efe62d45e82efb23b1e5dab79d67c7dea611b87fa7a57710ccf0af5c46aa4783439df0421d0afa74d1486cd9b4ae531761b35afef6549b1080b6b541b30d1ffbdfbcbc651fbeafe5d44470e4519f1fd1d8611968c6bfca340a3ac252db7f0a79ab8bb8375612c17da0220f5ede04d314f3631d447eafaa8352c4fc1827c7b0038f510d3f2bd0d9451e2a70d1c2a317e89a008d1a88ece305409c8e1afdafbba47358e20504be9e4336a3bcc465449156b58191734b3e1ec2bd099ee0c6fdd0613fe660124aa6b981d1d71ac02fb1ec652c2e53d52f6d03c3af5455f3eb7a9944db44aeed664ed107d50cb34c88b1ce1ee74ff8cb9c40390f00c6dadad2eebe542fbaf61ebe7e8fdb2c8baef0d80be087cf2cabdafa8169ae96a5561de521e799238f5d2ebc009b07bc9c34348788c9abca0d928cb1f63aa95b39f0458bdabb1ca00d0da4c79b9c936f866da1fdf0318fc139d5682968550735ccd1d92be3e2e48c7a2e0846163a852b9380bea20bc23d9df99df6cb9e61d00ea420612f0205f9d11fe7e3a33a1ee7da099613dfa022bc449512bffd62070ccd0a0666fe00cc64554461bc45cff0c06331d6291a79f914a0555b4a287aefc45a46ab6f00a4de2c0231c41b949d5719ae536987bc5cf04e9880a11fb5afc0009da036049db8e459be2d3788f86bfcf9a3b776b62e12ae7013600bc70ac922c67e60cfad3d0285f47381e28cd90287682aa4263cd763dc85fb3bc2c99190bf20e5cda0f3484c6a040876eeae9f2b9f6f2b64a1a31e162292375aedadb1cc3c15ba30ce5d265c3a9165528377b2acec148e3d0e726df527a1af05b5fcd14444ade5d184743ffa9ea4725dc86e7b4d18613b7895322bc694b94b84423d5bc17df14ef8e8befcf03e4317e1e61b60d8c85e1a5c606abf5210e3f31ebbf8b60b8fe8dded22c5c305c1793c240506ca13a612143394a2936144268f1c48b64aea239b7bf75b11fd00d04bc96f4bb822c85a850f435c630ebbd88a07c613fd7f26e1100e60bb2813aa12c3a60ae3b8cebd8cbff4d6de339827731743644158bd8670517f6e69946bcb30e8bb3df38e38bbe3c9ac32429d996ebdd62b3efd4c6cd37966b76a8edd6f2bd1c2f050a4c3c68907aa1e9fb126795860cea89c6d63f4d5a3559d9c518986919e5a2e8a1ddee2f1a16a31675358a1ad0107a0c5b924bd549728184bdb2217c63eb75b358767f3b95912cfd14fba77354b8afd020a172f18fce712c053308c935ae1619709e661aad6a8df24cdd464b8e35ea59b88c5b3e87b987244e2394cbe9ae126f8cce4938cc13748a9f72fd1fd748b82d85ab5af8ebc45201db0c7bf0fa5be94a2f7e9f327c1c4f4a8f35224cda41a7a00a96f8dd066f50393e4614d50248092dcb37be8427f59ca68e9c5c7f01b12775d9c7cb37721b105f0a7905e47be3007ed2824daa7a2fdb2330211202e827b60355c638b4b97800d7a20da5abd1cd5dd1e7d6b311cd3b9944f65bd994f815e1dd110ac7b136d6a047b78caa97be677fbb7dbd8566aba9458053c51981abfc29579e1e0ed994e77d039d6e5b346c31e490069f4af59fe96e79dac568758e5afb275f78648a3e0b05afd63b5e1e95bd3af405046a5b048c7275fdf53cdd19a2d5b0c7926f4facb1c8a0e46c1992a579d15c1b757a1393f300193fdd0d24d874578878f495966b8c349b6a89144d35f8563c9c7ad09ba8cd85d802d55fe9454fef22e6376dfae4fae7d3bb1ae4baa1a9281a1a7d246fcd6c7246f986bb96da861af491a35ee9c37e40fe6889f147831cc5791814ec1c7c6063ca866996ba22b749820df0eeef6196de8ff56ec09044b3bcee07aa7e1e2049c8f73be687cf9864195fbd88a47859c52eece421e911811e8ccd8bc670d1737910418c85f543b61d08f212d306111699a0b9a75bc137a2bda3abf6f15af2c07ee82deae065b3063276cdb0788a462274d26ad174ef9f3401901deba3a2eea1ebaf30f95e5fa9f355016718e1b793f7f74274d4f5caa4bf8ae077dc65df21921fd3ef1a78597517f53732be97046711916f5c3456f8e4afda036e4bb066381bbbf4bcd0c6d9c0fe8366d50411074c19c3b7a57220e0db8f4f7755ac0bee9e9920902eaec256f9f1803eb2abd816cf4b1eb9d500ec28f5c88bcab28fd0bec1b4ee24b926e367ac9b8c2d4ff864d95d5ff2f46f830127cff5ff6c2979b78d4dd98530e0bba27235770791218c3fb562b2f0e5d95b1863c6921ada1edc28a09f81863339ef980d40fe7328cbd9d1419bde891cb70b8a6376277e9307299cbf334751aa29353caf4bbc6f42a363c1f4554d3bf76d16efbd6b209b3577049c2fa5857804332ef8beb21b4c8d4cac7a442b897a047fffb0c7f207e12fe2df9f7872e689efec2f64e200a5ab472c2662c77b1dd3c264486619b767e0f0df2d2f3007c4d7bbc8d8f98fd3d5fc3ec66433e4e074d9cfce63783937ab3b16c07fc3dcf0bb11f63d9e3f3e9846dfa2afe83622e818ec7af2e37f9cdf5c20004b49e5d5aa33a93ddef1ae64ca5296315d251207fe949c52964ae4bb3ae5604bb41e1dc0b0b90de10175bfa8f693d05932ad301aa05259f50d0c402ac6f15c67af5ec41490d5c08e699ceb5189851e88d4d318c159ecb5c0eba9fa51ffea74d2a1ae8147b6f461a46bc9ca250fa0c15ec84944a297be2044a696abc7624b5a1b1f6fcde0bfaf51b17c9ed469f561793961724c14e6613a0ec264bd018a9e7cbf9d15125607612134308e82b6e76196a754e087bed250636db396a686d55e4d2e8f50e74e2ab440bb1c1b6d82320bba3707069006c8162d101eaf00cddf055be68a95c50f9613409493c7ed5281da5456ec76ed63542d07645810544d041e198603463430d5f8a18f3c069abe3357e5859994087ae30f72f8f45d099ae113167b7df4ad4866eed3d97979fe1be2fefe5182f069b41128003c77f7a92df28ec3357f23a8ccc5605821d0747ff1fd59ff293d1e99855b212fbd6772ab8cb4ebb0427b55af147df7bee6d598a8d70ed378ab2c7110851d6561da2750991db4b46e30f6fd38d60d0f78970d58f1418405eb25d58a5729f47f37314c13fa775e634d7f76acce87df3205c0cc27f1c7f96bd747ccdcd5fa6cd920514a2f38203e82ee9c7ec6e88080e9f6e2a6a812b0db7fbd7f76eb356ce2fdbd98b624ea8eb1adb20673ee0f767ea1bc8b313becb2a6ac1e3b6837cdf7f3775f95f4777a39741e484c0a84bbd044f3d708d065d833e78b7a1a154538221ab096d7a9a96fb6d28f01db871d7604505ad70a28b87dbb1aa8418a1295ec81c543e3bc2a2d536d796a8f438e3ab6a94d312d0d8e9645cebc6d1519c49c538d9fabd6d21a95ade3b52b3102944f06358821596196a1b8d559445527bfdb15bbe652e0b7ef54d7a0325bb7971ddcdd1f8da5dcc4c54d5f755de8925278d4ab7345c371bc0cfd79396d76538faf66b3edea3937959f0b920546a44d28741b7d6a4a983a7d17f20b05c305b54aad7f23171a55ea62786f092bb011f5f826021407412b8b6984d4f59bdf845d56bc7893319a8675aa05ea1d5f06bc2d60234af7b0e607f51fd818c1721f6cac4241058cb3e73559dabbff56f5d70d43eee038a11d85b7f7fe8620170f0f39328bdf8888148cfd17730f314ea68d8fea02d16d98a3cca61484139d3ee92b748091dc841dda08483f1184025ce7b6ae703a9b5c56ca076ccb4f04e2d19700a906f2ec7aa68ac5a121249ef50a1fdef376f492876416e2869ccdee93578f0b41363d73feca9d51927e3ac47bfed563098edf5b613900da6e097f15213937b7c7aec00762e288388696a29929739edf2b08395a8c4e2e5b8d81d12d0f0f27a2b6d1391b5996e1f7081b1a916030e2c00273c1246b3be5e28f9672aadf41e538993df734455020f9916c0121d29f37a21a61d52d805ace0bdec7c1f2f469e705e95588c6b896cbdcbd19d4eed31703f1cd5303ea6e534d33e5965db9f0ffa37721a86c5725e358fce5a5243ce440de4ba5b7cbef879df9f74e728444576bb128dcb7207a0fbe4ef6958e7db0a8a53cfc3e109bb15e934ac273fcf4468a46868765023383f880144667362fce82ac969ff0ee01b465ebc631e0961c251c089a0f650a141952f15f68b54cd90af4cf81a358b08c8d300fd2a23ece7a549f3a624d574f50beb16a76da1a32f7ea81a664b2fff89a804f6816afc9068d79665485bdb63267d88653f106f0791ae1bb99d62b3136ca52069d08c729eec3f803df6adcfc53c7eb6456549bf29fa084f5425c98a6fb8a6718070f64dbe7cc551a439827b4440f8bbdea28057b172748e1184e67cba75923d64eb1255971e514fc19842a58639d2e0577d1b004602da1e184423509cab53cd3cc94752d2dccbc4bd9b5516332ff46dd87f838290b0224892ece7d0bf63d0693190fc0b16be1bf6bfca2496f42a46aa8b2e20a539863454a70599c2c8a5f1596bca9b490ccb2a2ef0ae15ed7133afde96155a31e68cf88a7e16a3ef62779ee411fe8bd45c0bdeb377ce91e251511a5321b99aed41c9573240a76c1f33e3bf534bb53474ad8620cf7db2013e3c8d6c4f55a446a2f245379314415c19e3f03cee4376fef1a745d9c82ae3cbc9dcee8e1b595dc818a10882f6236bdba71ba6fdfd1ec95112f34fefe7a5e8594bd67c68ff566c8617f51b1ea395ad518f830eebc8073695a039ac4c741749118cd53fe242745aea679685f5e2918f269ac22fec97244632642065d6b7a78f5d537f40e52edaad5acf2d4eedfb3f9ac2908112e9b19d809023518177f77e41a46a7c865709b1f04019627ff035c8558e3967bdcb5f9b6d17a87408167ec3e74d977519221c20a8030bdc1ee5da5448f05d1d3a78e9469330ba30039a929f0ac2a312022caf505f0b6e4436b3300afc51c34a91da97c57c41202d79ed7c3a316a56fa485f0a699cc00941cc448013f81a3497c8d8b041b0b4a31472f684bbe4ad77d6f3a17492e88aa67cea7f1197c4b178abe9597ee1b5ef0b8df69df14babf3d04d0cdc37f3cad10b9c974c2dbde9805730fb4747ce155c203f0eca0d110fa4270899f799b5cafd014adc931aadeeed99cb0789542f5861a9d3c1651e36972845aea5dae3007076502ec03c21905b6205261407ed2d046870f018566de1cce8f2e8356d5cfb45a4c0ef4b308a8eb94664e92aa95af0a3d83b3f1985423b344af55e53984ecfd0f0193685559dce8f017ebc5157e29fbc19d368cedbe56c59b718b70643ffa399c022aa7794a27965fb1b4592f9ce62d89300123f3e9d9bc398219c5756b8a0297da4f428d6e0b6c49b032ff47766637eae89e57397b3f0f853d9b44cb9c1ee079068bba001a0ae324bfd2080b9f2c736d2388b72cf6f94825208a8f05462b4bb5f33a8e8fe2a883973d3c03da7bab98967d3a944cc19afe9fb761f480fe31bce54d06307b6c66d61794bb9332a065ffdd523eaf278f968b3b8eac25ed38b4ac7d605930510bc8531c62eb06a281de11c84f0f382ba57e86af02e393986a4692e4c9ce0ebf353f731c24350eb8a48686edc026fff797a57950a082be11274a28c205bf4c049d4ece9d5543ebd39cf1c7a4620046e9fabdcbd7041405f5d441b68b90b748cf9878be2682725e81cfa24c828145ad913329f6989a121ba515bfc4a7f740b57ebb4fda3e186ab751a10a8e0eba41a47bd57c921bdef76fad5036ebada5d5f2a07a369b4aa37786b1d5bd24bf899ecc18562826e74f5e628d0829941328f180c359cf89e290235d20c21c890b6ba774e539af1d616791a4a2c21a466efd3df065de6d2e8c8b18ab2ceabb2378cd164f60f483fe30b44ba6bd028b7b279ef5c1f67ca1e1aee0a1e144d41b9c8e4a45ac1a1b4931dbc1e6d90a4dffcac39ab365f3b9005bd02d79aff702b05cc25fd02b8f126160b8fcedbc3908d98dc95d115cec180ae586edea57c1fb0bdcbb6a204e2e8e6f035ed1ead0b7c7cb6caf627a375e2e1417399e8e8924219094b015b07486c3b48233fd48b7150f27cffc577855b84fde896ebbc0b49c2ae12d66df2b3f0666f465eebb91cfbf438120268876688901ac94acc24b5a985b700f3622db2e4bfc8146d5b9509b35096a15b491fec05ef810c16a4e68ebb747cfb2b48d6a92c5d8fd7d8f530f9a14d535193ce09bfd9877ada83dbcb3f8677452a0488b343ce2a0bba28235195ccd1b94931610c880c424c5b18d99b70127759b508888d26d40d86e2e44cc2853cc50eb2bd69efefa70741b65d071ec8685a01c5bfb12bfa45ed467a94d74970f9129bb3bf4e7b9bb1bd9f14dacb1bf08f0a8582b06b57682ab494a8c02eafff0c9ea875c0777835324eaf9c188e5c908f6d2d13631fd7178a49b894f1b8bbd97c537d20484eae6433a1b9779eb9a74f716d40a0603374b16d94fa68aedd37a6511861dbdd3ae4d1ba9e05ccf4b2c5d53cf108533011f6dbdc7da2498005e91093d49ece09a3e424d22ddac4a3e37ecbf8e0cb525a1f253fddecf761ee989bbd4b717a2253f174048036828732b299d9ae24d2c566c7c9857bc942d880fe135581d63eff438d5d19cea1433c2989e0a665a465d5dc70a955bbfccbd6bea01a813beb318c62dd660cc356660b11cf19db2548cca945818e55a76dda8231e477e983989df2374a5985673e321d70ec0d1ff6f84e6b296440304605b7046033f43460c5c8584b3dfd2bc33ff19ad148841be19c34400e80878ca0aaaa85d3f6570adb5afbe7241c19a7de42e9aab94b4677ed1cc7527e3d2b12be45fa2d13936915fa3f7ec74c5076a0c1306473b25d1ada23604cc90003f369a7bff023a774f2fac75d991f4b42dcbf72efa82043e6c9ec89510ecd1d3aa83963fed49017ffba644a9a9417a75912acfb69fdd7f54e1c562ad554845b4a122cfbecee9bec9e88f98adfb6d9eafce20e6384adc04efdd8c00bd56519459cf9e87670856dadb825618f15498a9b95128eb32aff05d85bc8d1363a8ab260962515dc71e22de2b45a4561229355438b6bd3f2423acb1bd1b332b2ea0b7836a15e5c36d94e0414fced4d09f0dd606946b58628b4a73d9ec5608b87cf30924e266b658b8f0f1acaf7a6208e656ed3952eb84e5e688e80e9a09883bed04128308b15d7e37b6d968c0d4f67f86b90d750ab3bd49b4537bf84cb23c25dd48564653a245a4685b2a0e2a6aec94fe98994202508bfe735e920f8acc9f16fc5456c74996098bd952462552a8def9cc6a2319004e5b84a20edcbcbad52b8f98ac968e51290364f930d016c01b280e7ec23d625b09b67cdec8ce9883585be050b5981410b7edf0567b3a8b094e525364254ad6991f27377820ba2b4ab2bac9a303dde0eeef039e5f95f7da749f08693b07cdbe30fb18551cab51dd9790c29c1e1bca9d722afecfa3158a8db899a4a051ee58b1b93a24461acd1837e06f0de81061f07210f83a149f8e852d4bdaa1a9574d5e39a838b59b111a6fb2cba9f72e287af22761d3300dc3455a3184be99d499a950be749356b49df7dae6afde08eec4cb1225db489b0bacfe8c2319d1f7c2b796d2c8a4b68232f009ec4c0377ddaa83d702f5f3c4b5aebafe9d8a719135e43f7a46e0cf3eb296d5a5164b6d03cfd1d43336f031d42a578bea00c00298fec97fd84f8f4a888240bd7deb6d530e6a05344410dd1bf363a68e25487c63459ce327453f3cad105bc0f5e8ce3a4c0436a5329e32f518befc0c3054f7080a23aab19425a8617d82b9a83d6a513ace61a0424db61fe0ce734e0910ed7f0b7dafa2b5651e1da6124c2666e296f6d730b3415ce4103a1893cce42dbe5352ff24661f7ef873016331d92c7d93e331a83985a465a42114050f3868da972b154b94d37b7efce8e63122b6266cbfd384264f3523fcfc8d205ea722269019d9288945743125b0d45e988b6fceb4c4ec80b9c86e4a735ba8f16de236a80ed4e22f20ccc4eb13d2c9bcf1c2626fd641929a0b5b8da2795ff909bb46d2877746da7bba815203c9c12d93e57e3a9441c46a42737f0fb66f6811dbdf5b722f99ee26a0af198815a81a9465dbf554d6a7bbd81c9a8980e0d60277ea3286b21ac7495b3086ebe39b3f3d82c55dee5d9148a6708ad9217dcc3dbd9fa77d5f0ed38fd6ecadca7ef0ff0fa87d14d3cf917ec502a81fc7cd52d31707fda5e84ae4e464256f6b02494cdb99e9e7e6e5ffbcd9ad5ef33ddef3ac8fe26026782be0d0c7e493380a96e1339b5e8067be0d151c4c6219f677972ae77d30648e60b0a75ee871cefb0f10cd61c8ddfa510ca1a65c4173d2065f78d990058163aa221f14ebe0ac370ceb086433de98c648554c09d9535305c7580c8632c3460c0e2eafa0042ae44a0220d65c4666ff52b21a84d63fec90239df3cac74c310ecc3ed91adf3431ca965f4312fc05dca24e32eeb491ec87bbba1ea52c0348d93c0290c3c928f88fbfaa98b446f9feba02172f2483a35bbf2647bdfeb8c0c5266e6dc8714323ddbf43d53306daac8d89af2c2b6e5aa129fd705af062e9962d93066c2a640146302af7c4b2bd46aa5ec5fa1bac1ea201c3cd1a424a7446e9feb9a46c5b1e8c06bc6d3be79c4a2369def9836415d8025bb5a894bc40a54942c504c90ccef36bfbbef080cc543ff9718a8ecb741d0cf4057c0a601767787916fd0ed4cbea95098bd45f86d17ef12147ee0042ea163fef95837d1cf223505efd232258085275ed3d79049e957110435385f87a2495e35d82787b2bbb08df535bc409e3608b189f97397a3886df1fc82aced1e1c20099e662a78f0d009c77fec95c0fd752f8ff891f823af5341d72384435271a310ab5e2acad13413132bcd9bc47bed46e208d523cefc1451bb0ba1c26555273f018ea0ac6f5c258eb70004cab33914af096545375dea7b8ac4d49dc47bc0e8f8d9f88a7582df6c48de904f02c9c21abb8cef72560cb58c07427c3f13eb595ed78132440c6923b0496e21d4c96edda86f53eb84074524eecf1f49b1361fe92fe3e184f7f98ef09a9a51fcbbaa0a5466d547a4a3d370004aea418418b57d370325e135cbc5570ed2426d692d2a05edfbf44e61f541f311476192749f196f0d83a36a8fe7f72e44ff49acaf52d3c87110d45169a5d9371f8e3bf8636be95c31566762d874177a5bc9b8f418512cb9a74c7e3905d923a4f2c6805d97a7adac6c2579b35999aea31cda962fea52bd415958f9ec7dbaa8a3519839a85979eec68698df435a7f43114cd7eb446e7f0fc94ddb4d54196fef9a06ac6dc1f10932144756a3fc234d5e2bb66bbf1becfea9b74c7e8358212080f2d7a92490a78004fd7708cdc4fb2c875b213c1b9cacf713741ee9a2dfdcf7e4148d3866fcc306e9e9dd5563852c44470954f206aff593d6698bc3b2d39319a266f0003cef8cc26b4042e66f26fcbc259b1836893c11f979fd5bb4bc1b8eb14252c7aaad514bdd116b6e62f88fb4bdaa7a35b0ab2b465384975566c69f15e54d3fdcddc208497f63d0297207a89b6e5c0e73077464ddc680a1437edb4770dd4a95f54282fdcbceead83bbea359fbf8c6bf9ae3eccf1d7cf482eba700fbe6c2c1bbdb80f5181cf52deb6bedd48a1a826df671ee1c55509d68a215873fa3c0bc3a1b56402342831ab57282a8a2234235db19c1cd0bdcbc5064698bc69f2747f23e1c2d2a1561476608d34996160cb9399792522bc14dabbe713f140d296fc08d54262ae5d25eb100b0788560372dc7b529c7ecae4791630f168c7704e36376b405a1131a6222091035c701ad0e6eb6d11a2257fea48e2d6adcb87d52d7ecb090d8f5b170ce9497c01d2a8426a1b8ccb7f0095ac4e02e50f74a2bee9f0df0b549558bcc901d9ba236f208d573faf1538c36e6bfa8045816e0e84d92958b58ce0604c92c215721749a3bc9bd3b2103917b71204c5117f4c54a3e8730da5b0d43ef6e1898cc850d531581d404261cd4cfa92b1fca6821e9a65fd53f921685f65c2e1ae1d939ad4788cf4b9372def54e5441eb4b00942b21014734de7ef20ffa61e8908ab7 -MD = 61dce069399909fa7f4ae87e5e9e814c1521d6555eae792393a7422e43135321cdef56adf36216eedabe1c6f0cd039fab855d837923391c2dcc9d31f1a2ff6ec - -Len = 96064 -Msg = c38f4de032c8500e46f9bd0ac75742db703f1ae1f628316746d789770ed2dcf2801683e0530c96040aba55b37836c6e78461a0902ad1682ac20fda9485038a204daccbe79c15d05fe084112ff5f4f041ecc59d190bb33766140534d7cb060230b2b9ee9d17c9464650bfba234677081230d5d927a1b4e543c51f5ee8e7c48c4b37a5b5abcb113fe2e3d3183a71a95681d9f81b60f5bdbce85cc7226ee424709965d9e5b9c0d6055a2028f31a807122b76e952c6c0eb7027e61644612c70df541c3bb496efffeded79026136b7ab6b3dc7716d5f4f488002c5d5d937b9a69646cdab4a8738f721381b93640d6686252177ce2dca0b01afe1bd71cd151651f0541302dc96f781beb7f25be4102515c479006610917495344725708c83e2e1720e94f8c750bc3e0b0fa5c28df993d8cda709cfb2602c71d195a65893fe8ff39fd8bbf3a74ef77a8a819e4dae24035da53dfc718f908335fc7fb8a0700f7df6de45006a08ec29c5d1d05473e12a13f2ef9040e204cd29401947c4dead114d79b1c60ae258b2d3be655e50dba366466701508f97be507f2eac906379b7be7edabeee23f3032d75a2b99e2bcb81831af88ef1210918c505504adc0cf80c6172b85a2fe3f2b4c6904143024de9f7eae245ecf4bdccb0b55c6368ad39d02794d991180de387da18a3e8964d2fad73186ccdbfddbe48f29bd4c68a66629895e303e38cfa7b18ef9e312727b1599c8f95fafe5c0e9b046ad31f0824ba2fc7e3b6922e0d98433c61c1b87b7be1442da9de2d665629dc9596058b96dbfaf9d47d99f4df2e49b458dd2dba54075f87d75e7b648442920b62e0adbaf0f4ab4944e007bc85739146f4be2cb75f5e8e8d2019d830d685e9aff2f7361da5136d96afa77a49af5201839681592febf5e0dcae688f32ebb48322dc36293431bc948a6b208c3cbb6e0cf2c4c33d94984218eec8c70acb2243111c751a019f1564d26d0e079806481c360cf5f04475c2e7794c15b1d56a18a5f5f5543f69aece8089e70eb93826b3d0ff3aa0a4f8541a3a947d0bc569a04d71b43600029be3dbb43d50f3b1e72ebd40db246b3de3a00cdfecea115e420e2f2ade56ff0042eebb645f63438e2f7e92d05c32ac4770f9f92c052bccf908f43c35d6e0a7b4e92fec05827684aa7ba6f303f4edea3e3ac28dc35faaa53208f2f327306b909ce917fc3c29032d9346384c5027cebbaeab8a292a7eff2085ccaaf2736d405024dd475a6cc5b1a4d529931d49874d86f53dc169c5c581c550ee5ca8aef0175ce9303e851beada80ec9047d45475f2d2ce8bf8be29d5eb0a4fc8b8943e7b492d568c5e0abe0b16584614d7000586573586f0a094bb129375cef62f23a6316e28094c2669e798cd817e11c12ee13ad315ab16499c1e2e039e4af121058ae4fef35dea38112d3698a3013186cf5bf60ef9c7676412c76ac3ca60444e8830f86415d10103aed346e0135bdea85fea5a5368585e70b72b6b4ca09b6a084a4cde45e61f0b09818e5c3c790a83a65f20ea58c7da860ff7cea216a758ccdeba43190d0a7472ca37b2e9164a79caf15b740887ceca58924325a1aa5525074256983b21f99dc2b63fe56005ee461f19c3784758b3a4509827c4dc80109c83c3bdd0b74d19e7956e18aa7373faebea90258219443d0508921430d520800bdce34e710fc701de4552405675f8e6c7c7f5004610e2b148eb00a6de0e142a0f6d1186edc728480e6cf3459df9fd488631a8d228a0bcb6fc72744e40f9d36513deeef5cb5ff932e476d1a6c572098693b23c19ae5b2ac4ac295d78ee1ad6c7c58cdc298e4cb278fcfd6dd2817096277cc41f454ba2c550b48a3cc55a03a6c871015980ab0fdc70b46b285736683bb1ade1d2f3751a14e1c21f92a20926bbfdc2d6e7a9a63bdfc0a73ab1b378eb629ba385e792df13820e3153ef9d60169ece177826f3044354cf41f67a55bd5c936bfa3addb1ee31952caec1a4161335b7b00b6f67fb49a8a4231128e2ec784e56a91e7b25cf0706d6c376d370ba8716af4a0b175b20eaee7632914c9bb63e2314c98cc14048cde5cf794613a5e9302bee02831a51126c8723945edc0561739d6643d1a7cdbda750d7a4890ce430a307ec702fe2ea3e42f534beb641a06cbcffb3ae69891eac27fa97dbbc299c1f541d32f95e0b971312db32184437fd467eec957fd0ffc382d42578855bf43e03c7ee4a2499fee81f308ba44795099c6d3dc6842e84764cd010740247e4e75a8c82fdaa7860274dd14098f3b30540de7f7e1ff83110872b228168bd89e39d7227f9cdcc7b4d2f48d7a785b8e1316863cbb47b6a3de1aceee88b7612d1d4610554a0c13883bd715970f9d45c68960aacf0854b629b9441f890b32eaaa633ec94a12c9a67584d98005b9bf766af9f821a7c452279d094f0d8c98ce4dd7d8e8a907bd19be13f5a0dcdf62281502cda794ccd9873188350442fe16d5b33ce50e5996344583ecf7f3d22bf11e4b166c35ab472d3cfa70a72863e76f8d4362f07680ff60941c87f39c0af34eea402f3e6a0d1faab8ade0c6861b508a3f26d063e9c7482850b26c4f612b3e61d41bd4ab0e635c3745705dfae50f404f32830ea42fd67b73bf6c24750bde151223058e1be85407bb296b71ab0ceabfa6b083a51d10549f2b2b7336cb62ca7f492125e4f6c1892620adc8a341c452d577ff4e1c3454e9bd37daee2abb2d9884ee14a45ea461a9c44d19ac7b24d5ef8baa680bfb53c23edc7f150689ab36ef2ce945a9848d905de62ab54182bd076be82733e3cbe124fb04eb23e3d90543788022fc5ddf1a164d969fc8af3f72226bf4d6a8fd124640c83d634eaca5301dda878181e7f6b1ba20db949c1e3baced9ab8a00f825be9de4b90cfdc8a72948cbe49ef1b7051bc457fbef177b5fcd4319d3b6baf992b34c82f041716a4ca9957cccf52132079a18011459ea29c0c50b61f8621d16b0c8ec51aa223442334a748ab2094b11ef5ca307f7a8365fcf38a44c69fa8bd1f855f9cb571dbae2e39262504449b3d934d9d2070658907fd37e8a33a90eabbde1f1016a779289bee5f7eb77e4451ffa60a84178d0d96d2c662d49a2461cd13d06007fb98c2f0558a3117c6c2279c3f80b3e6dc7e7a930c80fcb5f32c183b0c1cd2ad1332551d222b345a1a77f5664448d02a38eab469fe528bf374f9bf1befebfd6a251a39954bf9f2ad7a46b7965727eabaf379c4fef06599f6e6345d54046468a7fbfb7642171bf279afd77414c04588fdd5d4b13c2ae0ad251084fbd093b09bca5b7b150ad0babc2782d134c8c7c9325ba6a3830af3ec50eabc92a076e4f61e3d0e421dd7bcfdd91db8ddff9ab4dc703c2d8d424f95b108acb006542e3f5f7a66dcf99690250dd0c51ca2de72cea5cb08333bf7f5565660d4b5871fe0eb1336af8c48881d5111298675c9d8385e4dca278055aae37f04ddc893bd0a743139da7fe8d6fc6689326dc78af9f6d4acfbf602dc82610157e209f112511cd359f9ee3db64cf952149823f224db3f2e00d8d5ff0f6a263728196bb7faeb5ee3ab7cfb53bf5188cb3c6ad36e0b16bb2ea20cf187e0b6006d38d08b831232d68d6eea8928cb8eb0b947d105a3075372bdd9bed203180ef88bd130f2bb23cf8ebaec6b1e24a2ab79027ef442f9e03a6dc1ef16fed97f191479396127c9f5698e506b2544af0b4feb8f29fc11d85d72b3232a3dff73dd805e1fb88ab21350a9dc3934438231cf220f489010fba848a44cccd35b5d37faeade6698d31c03fc37825b8feb6012b6ceec15fa5987d1677741a331979e8f9e009b341f65ecffc0ba88a0c34667ba88f88adfb1fe3dbb8394998f8e1a4ce2906a9d739768aa7166dbf4ee1a7b1e920d4af28cfb28a5ce63a25c7a300cee9799cfec094603dfc0b441d02fdab20e000d6c2b0621ff4873d14a924b60940d1881d891e0755f12547394244a4c15bd6d4f063d336aaaad10933444ea66da30cc102c93de6ba4cb956a7ef627b8c9b5429cbf31fd20525c0f72077a3e8a07df1b0d74faed72f992eb63a550ae66f97ee5bc3f0e4b891eded6366c3a311443a36d4257cef4d086f0be24b139c79dcb9ec0772fdc04ef37bacfa70a8eaa4bb5022a757e18dace746c76774bba5aa7679f399537a41298c478608c8a7d92798686ba6f90e089b4eb8f7b221bd94fcaf609baddfe6d5ccdeea1f3af930fcfe4ddb786f8362ce8ca12df35edc8a08e4fa062aa182d3fcad5ddbcefd6ce4d4ad4e31cf4d81806df5712e60da2fb17ff7e8c34710e6b2244fab851bccae23eeb93c03d6dd6dd7556a5132c69075b458b9ee3067787611fb282a8e8c25378eb9b689ba25abb2d8235fa3c38b2e6913218f9cc61234bb73dfcb6d40a6838385a409a9cd4214fb233649fb592510544e68fd570ccdf2114850bde653e1843c995c372ed5a2c5a1192ccdca7c2ac2c1d6ad97bf7cf13d320fdc542820d3a3ad4a40d38b3bce1a4f5a753f83a502d25c3c5dc3388f2252784af132954fe34e6008d05341983aaf40479e23d95c53bb7e0ff82444bbe7ee6e8a3dedd02996f0ff65a92ad4436ee14e61062f1e1a93da91921b2f869ba86d8f3e00ca4b566537d5e139eed5f5d14ca4474b95d45829dc4183154950a6fa5c44e6e86c795ee49f7dfbe103a908086dfc6aed1c9eadac2d0853a4f6455634473a155358dc9b8b7472165d0ddff28ab1b13c4907df738149507418dad7320c9ae939d00407a4c0633cd0fc51ed6dceb45d4c1e0c09525fbda4750f5b88c2e9e3bcc4fce26cf339f848bc5d9443a25ae27b0aaa8dcec28df69ed6e6fccc71329e2f5738989f1f4e801028ef399558a5c875089d01723c92808a0a4e3324c59d46db60f18af07174b74db72fb634f935d2e5b653fba63903e8008f93933448706a2b62d63e13a252fa3bd79daeb50c81ae47a47df0cd3068a98ce755915d726264b9ed45266b2a5fc5851ac76797fb2f970553697579cb2721a9a202c202cbd9e2e150dcd88961f19593f12b85404d8639c933a4fe1e51c5fcc1303989e6cd4d514c4dfbc8d0e1bf06e2eb388c608c2c12edd5beff4d7cdba78e22586d5bef433c4525207be4422e861c698cf15b3f979efdaa260d69a4ce9e4af8edf0e4ba32008686e96635dbb69f9b0c8738a2c04f5a7331688cf552156d9214789913a6c04a6ae3c51c4846fdbfd944b5e6d9c6b9b1e8fc0502930d5671ee0576ea6b4d44767cbc32128dfc5a736192a76062ab7d51b97a6a02a54ef867d95c67595e1655113680becd99645336ce86ca59cff6f0a68f3d2611ce9f71abce89d85a5e8a68b722c1d9c1dd277e866a919d279421ba1cb4a4c794516768ba480e38820f21f5b4bc000173dbbe42eee033ae5e31c44040d441ad2ee04f340fd06a0654c26592a68cbbc478078136eca9ed6c523b5719af68a46535edbf6a38f21dc0472addb618ff65a1230328c0ec323f55c81342acb4dc4d8e3dfc2071b217aa04dd9ae2d6689e9e1629310d878a13a9f9144c1f7ffdc9ad66cb7e1af107db8f328cb52d8a31e4b591ef33b7e122c8add4cb686619e69b24ad52f6175ea6984de7d8ec1637e15c5cb2e96da06462cbcb6751da8ef10bdb73b068f6ae212ae8668346b22566138fe3e7ac516f97b687733f5c2522abea04fb2e61f237dee14659935aa9d3ab34d9fbae9c717de18a9645bb2edaa980ed922b65f27b5cee762ca7968935c96dc1d4f4765e6043d87b72b3695e6d8c36932d94f58ee485d66625c11b56e84f24470b7eed668059f2f5a73cc86f4053338711c85babd02b3d1dac468058240d6530e7eb62296448a785ae4266e60596ee15f92616bdc0e579193a9863e18b6cb71be4da832b8e689ca7e274b3373fbfecec4e4ea549392d10f55b4744a780e580649cccaee1616218d8fe443bf72146b6568ba295d2ab7aab2e78d390fea71067a78a2263ef7fadc2956c217f8a8cb3b1012ba246fe8a469e113dbdd77b6075c351178c40ba5ba4107986acec85c49f8368c8fe570168296069f46696923f7e29fdcf5aa3b667fd88d20847016d5b5293e9cdf744afc78b9885478e4cc7a6a2020a3c2e2b883712a24b5b706c95c3857920b53d7e3e2af5bcffa16568a04879f212c86746844b7be341eab96cb39fa0999a0921825104e034359cbc88a0677e60840ea6635f07a1c2624092b03b422c7bb25453ff6cd7e3a4c383c40b4cb617d3fa796c206d1e1cd608f79ca5915d91a6060135240636787526114c9f09a6eed2c293190c22d15584c27a27db5a34688f01ba55bea183072bd9af96826bac5bd398e63d6534d3d4551b32d4bffa7929bd31ca261dc350283f5ac94273e749075cd9dd69ea079821dd6fdc13d1f69e4db722cb36dfe010443625f8c0d2010f49e4f1f2fef91f80c6745cb0759fe3165cf3312808638c65f396c7a8922b5d61bbf29dd19d20e1402ab05e6a7a982473cff7f98b0b472ca3aee7cc7356fe30d2d60c29c3a4dff138c727e16483594f293f3bf84ebff9457bee8f80c35fb93ff510982273a6b4c3ed442182292031d7c8f34599fdb7086b312b14a1234cfaef2b043d145c231deddffa63bd42f1e032b5a49b7b1260e302660d1d8a1d8f11a2f729517bd7aa99b3838234ff2c48b30481cba3f8274e27afacdce0c81c96bc1febe88bc5809da6c96a543bc45fc538a1afc105bd96ef24d7583324d79b04589a6bca328de18cc39416e8dea957c7ffbeb23d2727fbb488fe1aa84025235855c71966ec4174e88eb7fbc8942aaef176a01b988eb3d04ec2a84694d95d4ff3521a57171f6ca54156899b7c02a4bfb21bea6e5ba30d9f1e404a7e9146dc7b75cc08b783527c1d17b9ad786b90b4248a7e11fcff1a81b293a07915261f2f30403206bd041c0c26ec3688052fc4e557fb0bab7a0b4bbcd55f61a8ccbbd8c208f312b8da41d2796d3f4b9de4212594d484531b5808cd1b51c1e24de7caea31500eec8381a52c605a71677377f8296f14a6d2e609600529d27bc0fd08ebe9f9bfe42dfb65a6704d6923289d430d46b0b2e3099020b98a64b1ed7c2aa2975e87a3136594d8de448d33e4ed7fd7e9142619b965ae106dc3687a77825b4745ae67a42d11c46db52fcc2507549f9914082bd3aa85a45b055681b6da6203698f50262d91c11e96b37876c73acc712906993e5b36d7f78318aa5cd16699b77bdcea2fc9d1d207d661e51994dfd398ea395dda1adedb2c1b00356674bc97ec0096e300e37de324cf38cc210866f87b6f44ac8bbd131dc675549e1afb3cfb159a75c12614e672d9c3b0b429bc70a99d2a813bcf9c640e3b34ae3b06ef7821c8abd20b2bd8bbefbb666223900b8d7572aea7521253423b1edb459296bbeeba89b744376ea96ed82e29b5a0f0800ddaa05e0fa5f05c5e02c5dbe34b670b1103bd3f34cc8af16fcac6702392c7b472578adb229de621f813e4a8dfbbe4378fbbe7b63c30fd5b4f15f8fc449f82137b5ab68898a0603ea0dcefe4c36a9adbab41adbeb30b22517d685a00912dcc27697297f8da640b2cf8dc3bf216ede761f41353bb41c1b64e7b205e3f81b3e25acd3dc3ae504f235750807d63429c76651acf9e3e50fb15dce8ec7a0baec8713826faae0ba2d86558686818baef2cb45f5fd4d1aa78fdcd77271b31f760d20549f757dbb33a762daa7101925b74e52dab63a182a222604997b63b1a755076fb0adec3c1179fcf08c82acb7ee76c7c4ee396d44597d5b916c926da9817f60deef51ddcf2bb3b39633bf65432c14e48a49299db8f0e1b6eb185f9583f61ba3d4d8354f1d510a55be960640a528b92d0ab32cd35c3675c07b6589e5274c5255b934014a10caa669cf7efd47c62a8b2badf4ea1618756200a71bb9657dcb4b00f4cb5dd78fe0ae7731b34f818c79b565dbd30d6ed4f3cfffd801961c6ebd2f2bef65effc83d94a084bfda2f6e05f5d64fd1a3ae378fae54377e0c912e068255f11ca62c3d2fea4a387249fafab22acae798f1b7eecd0cb56ea80f94fbc165623c2c15c346597e1d04cefedb3d30bc9cdb9fb584618bdaac09ba9cfdceb0de9ff6a14855624ec2c170327340a4262dc4923259944e50baa07f023f2c05495077b71898731f744ab0112941ebdde6f0fa821d7857e3900f2b553b50c03def8d82040e907cdc7e98615e2fe51d3917988741ad7c4fefee6ab512b29c2ae737c83753dfbb0337a21e6dbdb2d755441ca6f3476eeffcc1a03fc64e045bec7fa6b3103d189276afa35f3dc65e93349d8a8ed719ce4deee77a00e75dad2a8595a0b09506459177a2d6dd49fe9f933b93d5c2ab2f681086efb04090c809727697da534e65f35266cfd10b2adcd261cac582e4d7feb8d2653907914b23c5ee4014a80d94d28e3fc475168b48c7b38962a11657e60e3cfdfa61d4557ed75ed8728a9e6210b292b421310bb03c659f74b3c504be7de4610dc6e89b1fb48940db7e7821d34aac9d7a0d82452c6e3d12ae0e9fd26ad807d18c4b3be052848ff861c45bd6e39b26fadbd9f747526694a9b003a003ffbcfeeaf407ea38905771f205f4a432158a98577426fe86b4be22c10513541def752029df8d62085bb5c5ca328fefa7ebb1972fbd651687e5cd5de527be4a94bc99121a993c31d40717f1fd61e6acbcd87899e02224cdcf481cbca29274f1ecd9a14b49dba4d82035069ce82ea959e55e7827153ce682c16e44b575cfd7d89ad9264213f147d371680a1d36f34875c5f018b53b881ad412caaddedb5a476d334d808d2584a5a25c128af9465a349eb33fd2cacf7e324017efe09f4fac542e2a795882daf03ec324c711c7b2cdfe2351904ede4d99dd455530658d4f407eaa051f06d9c0ee83c47fe826fee8b915a21593e57632657c625f5ea51f66b1375f479123d863ba0514d208430574c61ba963ad2f191a6b8005aaad37dc02790ebc566228353ffd4342afa9ee81d35f6097e05e843d720698cdabbe9629bef2754fd6149c46a222cebc8d4f91ea80ff94fc003aad69b5e12728f70538af08c80b983b2af8a356c4f800df6bc5a60a1119444793e3146265ab860103a7d25c742213fa17b5c1ba5e6fae3a71024adb5e7e1f2b2ccdd4141e96834e5c5c1a46615951976d6c38494986231311d05f711223db2f57d60f3776889f5351de0d331a31cf978e746d8020ebfdfda0a84a67e6bb16c897844c38f7f248a4969621cf291bec7f0d76d80b7f019d4eb002a22c46a4408b7e6101b53d540db69d2cde66f8a836b26cdc0e27be579faab267dd3abc6fe6ec7ef4d628913e5d0dc80ab98713474cd62f2c8671695e63864a50722fb28e78601ba82fffae01b51ec9a839cc03798d6ec6d0c774fa968765ca450757b370839ac70375c6ee5eb46df48de59243cf86c0b67147befc9079cdd4cde35f49c686d1238f5e0adca5c97feb4433765eb9a78090869d9bf9ccc932dc43bcb2ffe0f0b793b42f37e36772c91033a9e4aeb88e32c7792fb84cbbe419435ef9df10606fc2aa1a9fdaad143ede0604bf69de5ca93bddd174709fde58f5cc78015055c54266d91af66fa44c8c332f1ffa7248066720361812715db4a65cba1789a32a701738a33de9733370e94d1dedd19a8656667482c57026f0df4ac2bec5f933f8f16cac8b0bdf620511e4a03506eb5f03bd159d2652140e03aeb4ac2cfbb6af5be9a127030d4ec883bffcb116f38e1c6abb032eb356848300a3829d97316861cd99535cadaace2329db9014362c506f05d0ad9d9c4b2842727e22fb700f74f7c8b101a1ed7cc3ee71d55d2e0529d8d37f8e736e4398a5b8c36f146a69de72ddc7911a9b44fbc696f66da28326646dc6325503156bd753529e26e55ec726d88054ea3cad36905cc921e50ea7fc74a5d3c8b4bb27577fd7ac4d06044d2a811c8c0b0cb65c54d2ece18eebf00109c317789d3e3a18b90a99326abcffba0675b55d3489362d024bfd6c87d30512d0e819114a41de6de2f01e61719c4619ed6d49806bd02a93d16414e6b74aac71d45c415a3a70369b67d8edc5fc24560141e03f723b72023544a3b9dc97a36492a68816aff839c135da2d7dec5505ddf496670dbf0e0f6b65ce9352baa38dbc09a9f41f8f0e1f0ca1ac56552126811c786d7a4ad37dd8b4b9f1ab760d655a112b6148b273e690877340ebea10eb46bfe139926d3be59e8cb63064aa4147a9028c6ece75fb0c2eb03f4a66c3481dc726d38d37eb74efa131cf1d4755f2e4fb1ea1252dd080f95a154a2b5f77233882efc3dae35bfae68162891adc1f9ea7b0b40e16cf68a238933548662e5c2ec5fa8946951d255a84cf9d58ab9b5da11a7a6137d62b94db447a8e9e7d6c08e7309e71b05e4dde0024ec20d261fd96a6b7a8b492c5dafba8a7608fd0f390f3d912ff37b5991dfc885157bb7ab08b512bf9dc1cc37855e376cbf5c7744b25b370e79d59aad7e5f74f94a2bbb629bd238d7b75082e601502d24caab3fcf692be3b28e946249d3e54e2694db019301b7467971415580fa0d05783efd3df88707ab441738b974b9f9bdd39c92708661eca26e739b2c4f971b2531c45a59063477f68ebbca8978582429ca0a58f282e4fab67d6466ee990104f71703cb7b4397042d562351b99bd7edfad185356ed1b268e870edab85a75f50e1f1a4578bf5d935b665f6d531265edd99b1b532cdb9f2bea20eb571d8c1da854d894e0771652193fa83dd5fd961177a6c324356f583cd854b1e65c0cf2e9a2da2a5aae215db98a5617780f59993284fdc1bd7aacf766a444a69a4a05238c6cf480e5ff05f9e66f3540b86a25905b9e15236183443dcf28309b71b1a492586f4a78c163938f8b2053905986b0100f3ba3449affe3afb8ccaefcf71359c3e042327e677c6862fa464792e5d5a79cafd61eb1d43109a1d61a2647b4ffa34cb65e430e6299e338c66977d4e7e76a9ab005ee07a7d704d889892d0815d6ff714d4bf2a52d5c925571d26ac2da2c779ed243a7a27052839845a239caa429ece60773d7df3225046d8f49a6d927256d2d7907c20ee8240485bcfdb2ebea78fa1f976e59191b93a7c5711792a47952a9ab06dac3c959dbe61531e45ef8533495925fa40cef4418fb11b9c4e4a12b44bbbc1e25235e5fdac6bb670e647c78fd4dc2d2bd49de36357cc6dbe9e35bc77c21b5218f773a64a1150caec489f4b62381459302c6427c79bb5959ef3520d8596a4aa37225ea02ef6f7d8bbf25dda557de8f032cd8c88146354db66d40bcc87cf3c13665c5e9a4f624827046ceb3c10ac3f3c58417ecef3b591863bcac7c32476cdd3cd2cdb5e555d2b01f03faf393acd0383cb0fa1c10b9b54e0475cefb805923e33951a3db2e9f088aca7f213987be61b0eb2bf5c29051c852fb212e974d22b777be6aeec5fb3214771500d7d237d016f2536d919cd88400cbca4741ebf324a60f3e771502d5afa5098131857a0e525e70f7fe63f763d10d1cf440bf660cdf5e1e3c1ead1e387838b69199c08d85e5b6b16b46e36eccb93bcb0ba5eda214c37e2929ba2d84be1c3e12c8a21f8938eaae380fdf765f7dcd2b6a62ff530c857154b499e1fcb2b11c238288e2d8f991d1a3796830b365f15d3a5facb59611e95990450f2eb144cbe887aa64b4a35b1b4b34fa06e3110eb20a073f5b511d6ebafcaf5efbe8e1976911e8deeecff52a5fb7e13e6e6f25b65a54106dc16a5f6f74cb0076e2a8e4470318b5b4897d44e3b99826caf12d480934bbc48fa159e2809155420146075fc0448d7cafc7552913c37c740451a61e53dbb1b1f96db83d6ebb2bd292a85caa8f87b0bc451ad00836f7c5679ee2721f32d9d6675f78fdc6763caf30bf8c416b215742d309067678d9e1136fdf3619b122a98a331665a32433a05ffacc643e08123db48f502cd0d158f9d6fb69cef57abfb54dc3b2b640bd2380de8f6dc2ab07dea5761fdec047c850bc90a8a30f9dd24697a187b8ed4f27b2487b6d081a20e0e3191822f99373c43da3d0e63f9a9b6e73cb260d9d7d26ca9c71e7221ffd3839cc231b273508cd3b9c4a083283d25695a3ca3bb3d4d8803c1ea7823d39ce4968f63defab1582bcb4d919a72c145957ee730f6318f391c3e2c533dd1cda1fdd04fdd4060d1fa3dac6908d5e21559227df5e252cab7e3b6a552cb1684f75648b844f800efbc7eeafc74f3f6db0ec0f4efeb18608f9d937fc19b19ab453902ead6d77bc6ac582c5945d618a86593c4325c339bc88729919e197007a31b7bee0eb26e3039a18e4bb30ef63f91898dab044a343331ba44243c36375ba60fa563dad573dd02d547251fe03e32594ee2be934356a74331d496819e5ade5e289fa776c64c4bc9506900c64215b8a9bd7b4507ce01c1a7f3c22d94db3f58706e51020b0d6342351bdd25d0bce39829dc408888749d470508f7329e75509187e9a4bec1331e8aee3d8cdc64d6119b80b519ce3cbb920204795aecc6f2f35049a27e22bfbfe7ea9dbe5d6daa1905895650ef614e2e49ba4d4dd2a535dc925f5ea0c9752e39252beaa7371fcb0c282a55b3a887e4522837888c49a312ba94846feb6b0035293f157cff043bef38e24523e82e8927b198405c3fa63086156188248c4e0bfd189f70fcceab093d239ca468f767af3ed2029f716dd192b9746132248a58ddae8eac04111c14d1de57bc0dcde63d40513dcc1a701eb111d25ffc4c18ed73c06f11ce9964f227dbfa5cac49f9bf97868a7b607a015a30f7fa5e9a9ca7be86fa682b6df69c57cc6eb8b8d220968a5cc70f132486cb2a358a58faa3ec7a0478d4c263f1e46254ebd440f59859494d764c088d82087795a91415ba7f0238c73396a541c32b5ef06c53bb9a65bebc12cc5d9e72e1c6aca472db582796a68a0f9e88384e4993373337345130a01597e04641f848a88a135e79284ac750a218e5a1f2a411ece4962534bf293eb32781c0cc42409a411a54cba642122516bd8950241b101314e522cf4c3b6c4c05bc23b846a69bed133e16f3e273dac64ebe86590f4ca5da2a5f843865f241e3fe9c25d39cb633cb86c001df1301c734626eb6074acd8bf0941a6368682ad18a068e2e16b7ba30bb0267be96223503f6b895c262bee6e9ddbcde68683e2c43c9855be68b7dfaba46effaf520f857b694bafb517251dfe72708733b3fcd40c028e3cbf739d7bdf7f2b5424d867baf0796ce670c40ecffaf58e2a083f5ffad703088a60628ad4d124abc076fcf95841f855ea29ad3788f66f7b12ee893bbbd7a68ddb4be61e8f031d36d1003032d2026e9d175a533dbd7378ddde61420e8b6075848bdc4eb6eef7d172e27b02b2bc943488fa5d269ff1f48a1ce8daca470e13e893288c3ce29921d9d68121e4d76c89e2c00fdcb7ccaafc1bbebee5b283a86488204de6113002039ed849af674f865601c8c44387426cecb649ed0c7b22eed4ccb248746c1dae3fb90e887e0a598e7b1a19b41c05afac68e224ffa984d345d73edfc4b1be0a121890dfea183ea3e98b84295bd0c352edd3180643577fe3420e56ff2f288793c230bec2db0884ad2be9e87e280c40da95cdc0346490ccf167cc9d9704334929331aab6dc7b96ce3da28af8ea528fea558bb9355dfefec7c2ba47b4dd07c8368e928df275cb567c658ca51e15fb15d519b1ed9d111cf5ee21218987a106eb6a1590de285f68705e33c31780cc42ffd5dd17a3c3cb6a9b4d19fbb4da240846381071c2e0021a8b7c8f9107a675f1f5f389060130f1b195eb938ef336cdd581a7677e63a3c6a94fdc623c9d197ace9e3606c42f6bedb98ed178246c21063443bf02ffe9f813dc6688920d036041a2a3a63a9956fc254a2c05ae03472537ef3489c93c7c68517c7588094c5e033434ab4b0ecf9e6c032c17911f73adcac6ccfd0ca57c427ae85127e2ad41d98bb94e5f2e6aad2e42ed26f87cb1bec6971c9446517c0966b6402321a06834997f3ab66756377a2f064d0277cf4e2bb914a10eb65e38290ea4c1ba0eca216cc9671e356acb5b7fc8418a863b91dd01afc9bd04f63dbf2563cdd4de9466c0328fcccd931196c004227a0c7bedca4689cf3fd93caef6fb458cb8df565b7e2cce1334af9803be4c5064393ba83483710b42fd5b80858fd2d0b1ed4ceb0c194f887e2a2c0ce84be9adb7067fd7b9c346ce2f8bad9623122e10fcf581654f4010a7f833acb66a467e61436a40ce2492ad1cbf7235463186f64b9357e88ccbfa5775a8d9975f2fb6f3b52fece6561cf88e3b19395d5a57f412ca9e9be727294f0c38b7a355cfdfa330f1a415d93749fed17467688c983c6369d5464ae800104718394d194ece23151c5dc96b813954ab5e0fce8829ca89dbe5b3b2eb52dd29eb61c090c4ea24a315a141c7784724e5081d5478209eb6e5656dae0c068d871c42d015ab2b929806aaa6e4c5c491bfa31bf68b8db85225f907ea0c792301c690544d7fc4d7acf4f4dd148fecd5c8d337eed2fb34d8adde6dcb421623cb16612e2ac147044ea2fe17b5d18a64355528488997ed960917abe8b95e14328534229dcb12b6921ada7f143ac61d546c9e867ff22fa9dbd2f85212d8264ecedac3cf853f2a1297c2be3e9674db90e4000db5843380772abcb89c9430820b1d512b31908fefa33acfb405436cf92a3e7b097cfe54749fab4ebf5116c95b954a72d41064c24bb3a4c8269ac32906348765f9a5965bf268881076393fac97327bc52634a9e02588fc357bc6bfb3ebf6ea4447f6f352e11ce68a431bb8e0202bd9d38a6408f2646b6b9f1b51df1391b88da25a38be402b01f0458fc1286ddcc88b23666a28fff2a4198d6e03ca50dfc298069a329e2eb75fcbc8c3f1385cb550b93d230cb30fb67b2d87dca42972bc5b34f96fae3c236d80a29b457490b4920d8daa2a134e2b9838cf15cdfba38212cd890241723f2735ab9b477f12d77d5a452df1e246a359802229c0a9d1e186c85ebea978485042f727de53d792b6bff741c19ab26f5aa35682600fd8ee8a89c657fb767cf6177d9b3d9447b7bed4835049722e04541b1102a09f8bc21a4790f4006af2b6443bdf0935e5ac865cdad04da467343fbf8daa6dc40cbacf1dc0a53aa030a48cfc65712a57f808ac356fafd69cca34ca7658767d36cf2668be9ccf8080781467e43c3ae4eaf6e691113c27d377c0b60f41257d1b3d1157f3c68417aee968cbb0c66942203806cb9db8e8402c7e734375ea9cc83023fad4dafe1f83ac212850cd689391c787514138f11c02caf90b626437645ea22eb125832b161e6270e12b28926330bf20ffcfca8580769330af9c44f226475ba75fd2581810edb820bbe5270e8026f24b37febb3dbba3706a88787ee1898c41d62b63bf8cb6fa9778dd0534a3947b4650215473df769249f1be7e78cd36343e023e61224eb04ce5bf7013b6184437a576e65b5a335849070b78369b7dd4473974bf54e827a5eb8c3e9b9815363a63f606ae9bd8030ad29001de294fbb0cce1975d7c279df3de0723d871bb8c51e072148a09b56153335ce1b1adefd4d86cfc84bae353d3e213281035b24098d97290d84e5e33a327c78a8a051dd0bfce9552d3e6b349c0cf9e99fda403b6f554ed3a402a4fbee228da505daaeafe390dd6530983748fe106c0eb6085ee952e7eb0ccd09066cd8ad0dc3cf0f56dbebd10c09b99f39f7cb1323a7add6dcb51a0915dd70e333bc629ba5dbed8874e98d871b48b09d9acc6bddc6bf6c8ce3283084744c76d65276f3b3fcf4478d2e623079b52bfdd8814c4636fc5bdb729ac8fa1fb164c52b8c1ff2bebb16c565accd3b7080b889991701c4e66d85e2d02a20e1a4742a462a0841c98589494f5a17b2183424f93a2783724eb4c24469edbab54ed964a8e11aef63dfcd0f96cdb297992e8d4af6f9ccee274a69a3a158127311a7882ae57f45680e9c61f40427b6530be5439ab6afce80a922cdb7a297877dbb55776ee906f19cc96808e19c45ae748fa51dbb414276607f3ca8a7520e94ff3bc16fd7bd6067b21cab897e650fe221aed6e4569f9c0cb73102c21ab6a681211a52370d6873efd38fcdad72676e9983efe06012d9a3d8ac48dae3b9d845950ddf6f99b9f229d027ab363c66aa481dc2da2c5998f54121684b2ed22cbfd419e812825b83646854d5f74ffe013787b405f720978ffe5d3113c265581a733c55dd3bf24612c51ac106fc7ebaec1511a774cf25e1a0f9de4ed435e73d2cfd639111e327220f1d2660e1402c3ace4cd03e39e9a40173f0aec1d32d1c4909643315af9189b7217474798f4dc24450e5aac079cd03bdafeab4d239326c4359b09328ddce80ccf1d3ec5437aba6a11ae789775f04acdefcf0d8c82eca3ff5c6e96a14c321742b2641763802e04219d35a54a91015052c040902edd97ffd25f618a21f8b12cd9a69c7fa6f1876fd732346f39fb788786e6c3d1a8763d80e9c914522925a29f3e2626c603fa0f53e79b4b44da17ae66b6edf9408dff35dda224076d2b55bef4ecbb83890f1c2e36ff12bab4cf681b648f20317b43db297ca7fabb59acfb3eb461c143372cca8caf7a43334d7e8f58076c380cd07e8c80d447a7909622a8da6449f1d66ef1a77313e5a7256d6bdfecd5da9ffbfe72a5c47b1dc527b120c0fa6ae1a7cd8ed215aa1acda901932bec323656b28f33d4996ce7a6de01192be6175ee56d891552b77a1a9ee3685d1336d0df6d3a273f28e9f2905f5c8d5ca88ac9b6a1bda9a107ef6b99d5c0ca39c64231078a71647ec419fe0bc3cb5cfa3b1189e8c302afa05620071f0edb97a7b980eb653b02b7515aabd7c06094d060383cc08bb5f6fb91b21bd520a69e61257195686efb68a07541122844a263882d444f1605e6e51e03c0254e353983a74162d2208b581da0490bdf680f2591f4bfc3dae2fdf267a764f4cedac34425ea7a21d9a -MD = aa3a8e590bd53d04fc0b064006660148bde3ac9c9e44b82db2616538cfd8e175d0855aa9fa4bd60ace4a01d04c8c2baea401e61eaafd966a27d11e037bc56f57 - -Len = 96856 -Msg = 7021f18b8f398a5999fcdcd128aeea78fa2308e697d59b7a3433214cd83b7163bd4a4329f933f21b5d8f81c59e55ddeeb2ab61107dfb9f0bad485e19e3c3df05139965982d10f355fdd25866508869d558ab8eff5197804665e25007cdebaccc3ab65ec273f7156d3f6c689a85701895b2ce959d5bd3c49524a700fce0dd5f1ff948368d1210dfccec06b94a8635719689b980d0e2d5f55fb13f75e162be806819f7f5e35484d9dacc47545f9cfefc41a417578230c59a0bd553b79f9cb9970e636da4ab7f7b8bffa6d840bf0df342fccd8e209a8bcc3c03588bcf1cd6f32d799c4f4bcddc1c7ea443608554213eca30cac6e5003c1262ae028ec4425897c9108f48f030b390392f6c882c0422041c466469ad9c8bbe94749a059ef869cbf43d03fe9dbe4cff440ae7f83cb95670c1a4631c8156bff85bbdea97662552b73568bf19595eee90289b7c57bd5a07a740b48f89681622ea3df1b8ed23b35c8514f78c422df8e36b6c4cf54eb8cf7bd421ddb0586ac4fab9c478cdaedd89cc5a195332211f7571b9988419843300fa1ded868d318f48909078bbf1839c8fed61cde4795d3abbe1a235aaafa239d5ceaa2b19efbae08a2c95e020eb1469ad06bfb712299e83b37b4dca28804fcf363ea463fd9e9e647216f0841085084bcb5e9f6046098e044586e3df655434ff0b91331e9a628323e995caecf485084bd13e274ee6e2d3c45a4c8bfcc9f2f8d03c107ee258031226d5f24ba132b4bb70a7ee7f0b5c7c15cbd8136eaabc24444bb103ae3a9f48f27420769a2a34dacac236b6d01f0e9ffd22a924b370a6b0c07652b2eaabd7facb15b066e00f60bfdc4964de4210661332d0b3c783d7ef5f135b08645bbf68e147126f0d44d9202a9a0e1aadfc68ca9f5ddde0430666fff9e602b96229fdbac50c7243b2ef0fdbe5ab18416c27aea40d265216e263a53f46e0714ef57bed356ec23d169c0839f8b6b96fbf64ea6b5b2334363feac31c150eaab2b063791842a4127ccf14b8dfe166691c7eda6e2657aa309142a44d54ea18ebcdc5f44d05472ea4365662278afdbd65266419da670069c16b07582ad4272d4cc877f21c3caed51f7393ce7cc1b48255955b6857b7be2a90cd764e8124321575adada31146dd612b3b6ea0e00d6e7fe0724a0e0d9cf9b345be77cd7bcd75980d844f5151aa3e9a7197cf1f7af5937aafc4185423a019cd8747f21e4056567dbd53444207f03747998e9e9473018b3c6a93af82c24b8640fe6fcf8af7473f8e2c2476be59a132324b29c347f2b9bf8db8e7f6e01124a8d4533ef657c929979102fecc0f6f4496212e6f268020a6953441c9d5b539b3e8512ebc4fcddd82c64fe9ea2e7c7261cbddea68af87244f76fbae40344b6180ac7e36f2c3365cdd349087ee844c8a81392e281c47a3273ccba8a755fbe8b2145d2414e738d86dbf491c8415b6c8de2b48db9094d41e51f6fa04d30f12d554f6640b70a397fd39b26dba8964ad3897e760aec9d73f3ec9046dd7db76625a6eae27fbf02fc9ebe73d08343ee54fe4dc3de96d7ced714cb8ee8ae96692d1be28c510bc3f92b5eaa0e982504a9f8513d6b64be150df518f453dbb011d6c484babc2861503d442448c3c43d7569a380eadd9eed2eeb4c651997867e9a80bb0471f2df0d0e5fe5a3fd2c0b39009df4e1e882e3a08fd74bad8db27f567ae77effbac8fb8b38c17e4259bfd3a450c75b1898f3e984a2627146e34d3cf44d7b9efaf786e4587a127c73c0e7a41bc06644797ec906e6111d6bc59cc035c47cdd896abae55ff13cb37edcd54bf2ebea0b5fa92c4ad2516658999e1ca3f043a35dcce3674c94e21b34d3d1f94546b13826fb0c0421b262fca469550570f2fe3bace7e99f2549a7700749f7cf7c25e83539a536b8b64d874ea1797ec9afc450c02b58e1d527d4bde5bb1fb2aa59071d6bb3fcad9ca0fa2af6a0388ffbc8dae7bb599e507b9ccc91e6c0e3972c5460bd36464fd5225a5eea6f5124ecfe44bd3f97c826da251ca7dffda92429c7f6c9344f314d420c4ad2322314dd2a53bbc1a4dff790d3542fecd494e45fcf0fd8b73ef1354378ad0afa8ebc6bbfcc8e96aec41e585ad07b4f122c36f3050b6642a129c6a2e0ed77134e7c95d65b58215ddb29bd6af3561ce29e537e65a2635dfd2d815a0a94150cec347849e51e319e79bd2247cfe8e8bb8307c6b5acc67b6930a2d215ecdb83d10e430e330896fd6882eb6a47c7a9ecd9b8e5127748cf981ab5a79874ca35ce65e1f0ab0bc154201201ec4e3812b4e6f9fc9ca35dca4c6de4d4a241011321392e1fd3eb1e9fb43e2d6f166a8311a87b8eb6b515c391bb515a26396845583c68ac10532af604559c0d33103bc344e2ff2a8fc4d6333faad6dd12c38abc29c5e1725c04f71c8fb6ee53f6502e833cf2f63fd0226137348982f022e704cfe87c17f35b4fdc1ca2369974116cdf2d6a6705313074334a10d5da45fefa731b14cd90a1b6ba5650ec7311f01cbcba2c4dad90c11920e8e6552e4110df9462084f18c02fc6dad263beeb0c5a80c64c2a67351d5202ceee8651e15c137d4b3e21e80c4ad03407fccf9a1cdd05e620018237ac2f5685b4b0b4c79d8fb0306583f29006855556e811ff2e7708a4a53076ee4f613b510aa8ec0c06b150699199cfe4a7a60401d7f1de7cbc881399569e18a90ef2c5d419e1dcd69fdb42b2295e6e92bf594b681f9baeb2f4ce926662cf734d06df53522c161faf1369db2c600a0c67479ec01a966bff4c47c8e99e623af364c795684dc9ac211fd1fb8e3ace4315ecd0f5068be4d96ca325f59d93dd67257ab1a379496b1a9d838beee05fdc80179dcbda832e837a63522fd323092cda95e965980ab798f7c19471d2562e03578df4c8ddca84eab57fd3c5f02e40d91ba14b43c1912adbba49ad54446407eb2fe57c387d412193111e9278caf3ed8a90f41aeceea1159bd8a2488393ae8ffc7fbaae9b278b870513cc28c8c2386189d0ead2b14dbefa51e957e0806e7a28afcd7a06816b1e17c94405012684404f8f6211fd418d5f6ba652c72feb337b647dafa01e5bb65d66581865b6227fc009e3baf6051e1be6cc01ab9c61246116b5fe8cc950baa7de052a174ab23d132c132f420394977809adec6a343ebc95c0afaaeb6247feae2456b7a7307fe6fce90dda9db6f64e301c83df052b1324302db3fb51e75ec837a4dda96ec399b08b7b5c6e34acd4b2c2b3e05202ed88ebdea2657846d51f87e2f42c47d4507a1a4d7781729d41aa65ae4435dde9f7fa83efc336aa40c804be2e86a54b5e83ab94b1520f504e11d1c7616206db30d7027ce20499f9b61ca8eb78d0fafc83b9a8a0659f78afbd99f5686a81e5e26e071b4753eb21ef3d6f769050577003ea8eebddc8b43fe962568fc95828358c0804bf73c3eb41033d2ce83d53aea6d9d9500f9d6944d795d2b40b5a88c97820755c6972a08989de4bd18852e13b21e6f6c96e7fb5a5d22d954ef29c9aea40585c8a93d4885a6ec8dfe9d161978163c3b94792e53c6bb2191083c01ffd0f009c23fbe909d9b2526b6ff25df9d515def8a757177e6c0ae9f0db0f1e553dac4b54523cb3931335f72e8277888c286d05ee377456abd317fc4d6b2d47ccbb4683196dd99df0c369af9a9de5db89000b7b2ce02bfaedfff77b77378ae6f724624a63dd3f02b378a1fe2848c9e1710a55a12d37ea5ec5414dca16c6846654d79403cc26f97c5b9193656fe99014e495e00a77b53c0cb2556f6a94aec66076633031aae1858549ac9267da16e4f054314f2994de9d8f459af0ff8946bd4fdc45db7698935f980e284397ef4714fe307ad790fd2a9b50ef8066db5d24d59ee6fe0a250d93043f39a31b5827f0bcb919c13db3190f91ec20b4259098df9bd8370a20cf82870fe52cab8e3b0cba489b70a2c60281142dcb8984d1b1c4bd9c863ce8d3f88fd5df24878010b315fa553fc5ae2521cddedb897aa0efb159754423691888229e15fe67baef3752cc374ef08931bf7347a607708466d411cf6d2f2a6c27a1c035bdea493737868ca807b2584bdc199997205e4b27652345bf2bba159674d563df342f239d0772e331d21bf18e1bb7e734d43c63e41a51df7127817f78be8780031f39915cbd90d8e22cd836b06f1eee99181e453b04e441bde6f1c293333ca739e5a61ce6f844e0318e93b26344b3323c829079ac936f1eddf097897691693bfc1dd110cc16138bc86dcadf073b1944a79a2f7ba96436c959caef2e834791d0b22e57379cb5815def40ea272cc0b58862d547c5c1f5efc3c9ec754c49d44ae804adb4dbb94522b94eae7e1544641c8fe6ba75e286b70eb0a6bba64d5aa5f8f46c025687a2435c404f1cf343dea3b2cdbbb0364c5825f7f268df1ebc065b208840c2d8c5f84eb2656902e61d5bfe2cc44a5d058dc6c1501b98cd2b030d6266062b7598011bb5a99b3506c31c5cd1cef62b27600143178b8eaeec77dcb04a1e10948130e39d16c6743b8f16cb51cd2de5d695d2416da72eee23d371839f70cd1a147c2fc7fcf07d62d5025da4cb5ede25c53ed8e8a6feae9c8008a4a23b75079513dcd138abc15309aa07142339f534187f68f0516f6c7f3c5c027db314d532142b19e1b03a07dbbb1313b6e12e2ee4307dca9506579f352010478930ac0ff119c2b9cdc918327c09b8aec249087a432048da5381dff554ea354e43a57183b9086332f1edd6efb867f33ed2d55945f54a590e985e791d531d438d397bf5deee72852bfa88f68e15786b5a5510a1406f3136cdfff6a365b41bb39ad73eb98025fab0fb4434e7ac179d7977b57570c815576aced6d4ff6cfc881dedb9682d15e3e37f377b7c2ab83359c61d909e386b8c2f5d57d993dd9190c4db0c3c82d0eeaccf3856ecc94030fd3fa9c262d57899384b871f649dde822564836ced194598e53084d02496c8a4d9b1bcfc98c5a1efae2e807c046d72ad0ed99f864785eb932199ed39bf8f14926d527822cee954cd523ad204358d2a80c1b6a7eee863437be67dba0a29fcc4780c8453db61baf1b0c902e43e6467668bf26e051d2c4bdd91a85ea3b7d07a58c45bd9e89cfda5193877194f814da6c74cf5725f87af7a2a92fbbf12c96f822215bfc5aeddff423bd2e0e06c832da5cd426f661fb4cea8aafe35119fc543aee0daccda0f24e32cca0eaaead39a90fed8eaa4bbbe3b2641ef21f8e89321e94af581e78981e855af544a19ab1d5e141c8ac459d5c36132c067accbc6a565ecf0e0b9b446cfcea3445b23c1b392442389535de366c7fd70be94fd021e3f07bb3b22d0a7b4111e68a65f1a4776dad35bbfb325c5c124365c96f7a15051d89dd0844c6526342e7e222fc09bff676f82094a2aaa958760c272e410281b23fa8ec966bdf5d44940544c5b30377e27c8d6c8933a5ac72c161840107effe6f72d61025d07e126862f3753b32e6b381a6f58263562c4df11bcbe40c68497383de9ab17c1aae5916d23ade4c20ba5b1d1db7c8e9b245741fabd1af150d19c737aa7c3764f2741a950c61e6c0268856fc095ba8e5f0fb09429afb4ee59e67e4d3ff040aa500da3d2e39f0f45eeb578e669169891db753f4a30fd12744c239b19f04bb9207ebe7ab29816f72ef182feaa5dd6ad35bb0571d8a33dca3fa219916e2e22837525ca34ace0b67c73b5418520016e6ed65830e6d3e2ea32ace648efbe6c0d4624dfa17036400605b0a481baebe64634103d780ca0927ae2589332048f1c74579c16e4abf3587e096249b3fe628ee6b36ff54b61d314686faf33558e54c1e05e6765f446487c971e051f68de386dd853420a3b74fffb5b213d4133dbb3fef9c0f34760edba3ee9aa158010b8b20583aa32d6c8b46bb99bad6f475d8b0115f905ec35baf0dd11de4410263c3c73d8810ecef563becad1d27ad1b012fad0c986b39eab52fe1597ed52817c5bd80269591752e0ace281d6680ff10624d9b76c2b40a722c973e823af7be5fce009c24a645a7b1304ce1529f4d349c3e37609804f4382469ee0e9579d26ca12794057de3b3ea426fbe0195ee17b4873ef7e6ba87b22bc6143c38da62ec98a77781a1797563a7a76f2b6f2e7b64e6990993132473764b20d58aa4991ecfac3767cf5a6284dd44a9d99b13656fbf34994816d11defc900fc52df3a1ad4030e1a9f87167e37aa2b105516d581f2ad0551a28507ee2331b2203643e2a4ad0e2818c6b1bf17b751c2a48aa59dcc2bb8c287c0ea9de03838c95527be8481d17a60f884533c732c5a732d214f538c4367d104494c7a395666ad63cd5908f767cf2084837775dabd4ea572c11ddf0a62429b90e6b48841a442c612d21b564f9893cf826824529692b3bf3c1315298eaed288f23f29ae424b547d2adb0d56d18b50d4bbde63bbeed4142b53bf421a60529e01f4fbb3d482732438729335f1c4698d99f78b3b9829abf6507f6ca998c7742f6c5cc25ae24a423b60b39f9d0d7259d385fd17b4d1903ee39688c2548c0d3d0b32f33e27c1e2e3205eb5aa4d932184a900972bd64e6bb66265356b4adf78d4bcbc81152157927c5b98405a4b6c1a1197728b6faaf8023afc254f0c93775161ca71ceef518da23675781c57a17ea5292543a28a37b59cf3373e9e50383edf0ebbb8a175bd4c5938f565104a57b309f4dcdca425856e82099e19eadc401b6c0119fbc44e6f7a01ab63c7e6db73f2909943a359e79d0cfda3b61cfb5bb3f53e626ba1fd236f00e0b6480564b1ff228041e3018979867553e909b0997399b69e5a3a12159cc3c73e822a895375022d2213425ffb824893cc041e3e8bccfb45d4110db5d46075b6653694ba7ace85fabe38ea2378abec4cb21c7d2c9a0fe08a28ae6cf401188db49cfb0b00a3658f719cd763b7c89c798a4b58afe38ee4516de259df36666b11ab2af919c394e1287a03193381b3fcf734e1e13bcc2ff255d6493cefe4c9020b825857456b16ec58fd3d26e4eb01736f32badfa94e44e2f4ada67c2364f38482216e3e1760f12b28e29025fe5b79abe86c1e7982d0975b36da4144041fac9a7f70b4d5180bed489f11453e073be4496ac957d74cbcee06244562ba197dbbec09567145cfd2d2ebc673a39b89f20af8fd34ac229279128bc5d75106eae7ea2128beefb5c51e67bba3eef4610be8b35eaa926482d96fcb9122765551ffc3ffe2e48d744e80587561416b7ebb1685a72378ccc81eab06e0c0410bb8c3e17ac3d646ac49378ae6c484a5d38bcf3131adf070ca201f8fa61bc22c7fc0831775fea65503b6996b321ccdd90c61c5e4548f6d9874b4ac0eb7423cebb8b6ba291b78f91a7a029ca9a245e4e40048c6b7561341fab2cbeeafa11ed984a0e28fa0d3f8789bfa7767cea00670ce958afa339f02149e6dae0dfacc773e011e8b2b020748cbe2695b236293291a9fb56e88df9723908a8ba63077a115166919fab5da1e2e99f7b1f7f7ebe3748960473b9843a7405bc8f6f97faf86bf07c57b7856ad80738ae0b8930cf3f7b06519333a54e8351f1d6094ef2329e43fb91c2b4b360594df47a768778a0139a558d061b3e255ab897f584fd2446d245bd67611bb7c69c4397854a7ea989e101a088fb9ed6a126f4628ba0ee80904acdc03dc15125162784bc5ed5f355e50e4d81d5d223215a8eb1ec28eb97b9b75e689ea541f96dc7716dbd47c77a105a21ea8404387c80a9e85d9f2da37d12248382c33e91791463007b25008d774b51924501947cdf8727ca73e62a87232c5060c8b86a0e549b615b398df9a67f6953f5f984f74dd0a75cbb817baff51e8ac36c9708983710755af825429390f71ce9b374a8bcf9f463a12202aa1e8bc3a0060d7a1e799a3124a85ddb0d7edb72b87b5152c7462fbf4ead94640c0699b6fe90c9ee646ea64b4be1f2a7291be476de9165f08b334da5baca99420bf8dd6d08ec386094f7f9a33d906d263feb5a77f1c457fa4ef4d22c4a9087194455956a5180cf7d0a95f2fd8c2c13e4bc7d9bfa947cadbc8d1b6bd7709814562fad70136ae705905fc9209eba2d8d5f294337733932edd3e007691bcf3997953880ec0ca7976146ef22112b4a0d4fe1f0cc9b86427f8ebcd259588db8fda732f94067caaa1a690d43113307ae53c239cd7a568862cb06f3ce81c891b06cb9cbec9c81b1f4d8835fe61704d879998ab2f9ecf71dfc9dfd054f0127bc680f45cc7cc5b876fa5a56cb62b415021e271fea1094db9b8270c76dde67f482224de1c1448c7a6e2d2849bc2378d2191eb4d84b9bf292a586dbfc99f716bd7781b10426be31562c2fcad2ceb2c5ca81fdab7a541696bab09c48031613adf100f8d123895454ca1554aa985f9b2b6cd12d834c9ffae19231154d816ede9e2db31a16d645a17744de5e5ff10b473a478b40c4e58bd373d7cb9444ee009257d20247fa8308101964db8f53733e4142d914b9f8cba41abde9d49bd6bf77e96b7c731504b03d4aab88916a1da5850405a0020b8765753b3056e09e6b5c313e598b8a03cdf4419bbe5e949116fe6c19d32ad7b809597bdf7b9d740e8b6ad92ba28dcb96aeb5d19db2255986e7e45ffd3bd80a31f70e3461e02c038eaf61bc1bc7019c403f7b59cb379b54ae08fdcd28b0362e2bc90a1b5d1e8113715fc766a947758082e8bb46aebf1f1a88e2b15026d0d397e7f7b3bd3b774b28690502753ea4582ce1430c24a2a92f1faa1d9575620e2efc091bb176879ad8b6d847a944565e37d5edc6d470518659e8840220b974d8a6af01ad89f3cbe9c853319022707ad583300afcbab635e71de99948d978d9b0e9456415839162f478622767147636bac8afcb5d1562ca4bf9a76c5a26400b375533a2fc54fbf73b87780c44f5b1f47e86c991507b1289155bb68fae9dab83cc791e30ca6480033f741962a22cd04e813c020f8f5221fce3d27b55beb617cdf0c359aff848c9f170acaacd17404daf7356ed9852412d8037fc8a5112f6216444d27a730e68364c6fbfc0ae1cc68691b575d0ce51bea1cd7218482443d434c12924f52c8549519e9d2bef781b36178fd7f77013f6210b3f22d45921b9e6ee7f1e195e3ef562a842795f7bdd9b057d144b8a300bc82ee65fdaaf21fbfd949af8b44e1a1cc75aa6f294e91a2124bb23a9907c9508402eafaa0a1736f58763e6b85c21bd588387da0970473ef540cda7ca476d23abe6a6e398219b0ca0dfeb4e58a632bc74a280bdf18c085ebc67c385f0c0ca4069343e1eb4c1a907a06f813e34030f9bf3bcbbcf65489afe0912232aa7ad128fc2a13abd8a5adfec66cecc22e4f306d0583acf9abf467d914dc86312795ce4663ac6534c836d8dff567622b8e606c70e0495028c8a062ebd0d0319e9c060ae78540bee383a7a51c501ee3b5ca1beae89ab541b313ff83cd5c95aadfd2748df1a80fa822d09f1c9d1fbaf6c8ac27b4bf79f1060055bad1680052795e9188604e1540aa5979c6444aaa6224ccfa2dd2dbc6222779557854a204302781a0ea8ae414fc4dee44c5250b383ff4297dd44a26c8732c84dde21564af563bb2c941139dec6b174afa44c7c91279ee48fdc52686c90a9e8bb3a01b974bec3d58d235045fe7b492d563ea336a81379a8f42a76ee50f0f05f5a0596f211e1cb6da847064144b0046f7466070d8cba181671323282ae3abe72a6cb517ec710c2da2a7973ba36176ba196c4e86f938e02a3939e15e3d8d05ce92df5e1dde8be42a17035592f4713f76a19e5a7eb7121c1d6b7d88170655474195c1f988e1b6cd35a15f4f70efc38202f9a22f5ff99f7ce367a5c05c6c8396c99bd93161dc38efd7a88530dd7c9e68e787407331a6292903937933345a5e1ded0cf0abafb65a7197943b9ee1834c19acb542cffca8f64b0559c387a7b52f013550ce127a59647bfece4a4185ec13bcd9ea6eeac9e64e0972204964bd663e6d29cf3b0ccbac9e3793bc7ac3d09f3c79f68d8e6d9f487b8bd14fd4737f55d38752f1ff41a9974fcbdec792c9cb840e798c0868ff87b6c4faaa502c5bf46a3677371fe15b1c02c15f67575cfe7c84d3e422c2c5498818707e868a19c5248eae6660bfabff2cd53a1cb7d59e07ed85d1e241236cf2aa56c83eeb65635918a7857c563b23d7e2f8032955a7218f26705299709327a3f55914636449d1bed79e01e0a0f9128b455464afc937ad3c2d2e9c34377abc0472079c14769e2d9d695c6bbbc6633fc35dcfa4d69cec0ab60ca6f7d91e40f4bc2849a77aabcc3d9dd7c80b3451df742633520dc5552dffa6cbbfadb1ae4d977420087ebc8a3bca6728c92874c8d7775ccec6e5a57c6455b4706305e36e0a6dd3602a6a049b549ba264490ba2b3b2110e3711759d99f8d48705794697e7dd3d82f298b177677d7af7942ffde79bd80ae4741d05d6355144c891e8b9f79f2fd128dd3b9b3f751f2d0ebf63446b06b12a858fd0dd78d7d76d1e1d9aa6282069ef6e2afa72844da37d8eedcc28557fa5399a8f1444aa08f21732b0765555f2f160fce0bc7c6d786f32202654f3cd8b1cfeca7dd084944f0a09ac52640da49b31ec79076b03237ded146b73e2ebfdb47e42be60ece35f34870c330b4c173da58f5a8ea8ee4dcee484ea18db5f5a0b8133cd1d404faa333fd1e86fe416bb49987574e2ca2da294369b7ece67b1861f7aa3679026e32037f9506509e4ab41f0fa4a001e75104ca0fa9c96361ec1b8622836d8bf188f8f94e96c4aa914f1f1595576c7e9b17f9218b8eefbf7087737fb1255e751213b3d71988e61f67ad113ad306191ec8762bb25f9f975ba2dbb4d13c1665eef46cf73f78c1c70992033ee13147326cefea110ee4325cc27967640d2bbd303409134794e4f8040390e00cbb488144d381f24d99c21dac7e54a8e595f8a029fed0950979d6920997f4b1ef2b814acd0d2f1d35e5618802f9d51ede0e3b55df99db60c150c60664313df77ab4640a375437c97e645b27fccf6b4791d85c54adbf9a1513ac5beb9059cd2f23e8695610534c856ba90763f66997a1c576e41330ba8d10550ed0a80a8c32c76f2a19a4e474cdefa2361ec29c52dabbdd8c5b17f52534e119dafcd25f52ff6ed11bfd8d20534c56967dd9da3b05b5044e6b39e9678a2215e6a318e0fb188383ee107d5560593858dce2e1016f1cb6f98ca608fe0453c51d3fe9bd5a6a778f851aba21b401012274ca27ccdeb4e2413a3ccf30cc581cae657a3162b529ea5400eb6b832faee59b19029ee5d88900f414c33959dadf3f3e9d49fca167b5db7175d4c70a0ea670f2e40adad47577f33037b496dcb00646061313bde2089ad578626b3f2ef7a43dca34474e013bee239601854a41d269cb95656bf7ad1e4562d93513467a611496a1a84c6b04a2782c8610c9d611c8763a5d12b73c8b0f420e049c617f74e16425e9ae7ed4573f928890c3d6ccd4e8b81ccd8979eed4522d319ad6da4c96ef3f7632c5730c6169c9a236b9409103d9bbdd776858a1418d4367fc92e23068e0f2d1fd7bcd65cbc78a13f86f9bb51711de06eb0da7d63b27312bba4f2dbd537d2af3aa3fc282eecf504856355cbb8717bb238907fc0029a682f74469f155fefa4445d98006e652e7b8d9c0c8e816ec51bfbde1d5c9b1a581a5553b81f19cb41edb330bfb0f0280a72022d898e259bf56783075f5955d375f04cff01582f42b215c55a1ff4f5a009422cdfe03bff6689c5125c5f5f38547854db2129349feccc844284c0b5c7f4b253d35b1b7f57f80a9f6f8524548ac6e9adcc61399ab0f016a3f255abd9ac4d8d0dbf4942417479005c6329b62294505162e5663871ab7718d89c76e74aedd323d9b74f5b699f10f164b6f01eaf9e1b36ddefd92ea3d8a85b8c0a8e7ceed1adfb1d841870de20e5671f308463e5f04f2385b16123177fac6628024673afa2049e42ee4a888a3f21e9f5988a8daad1139dc2f5a720b5e8aac1124d46d374a6ff92b1bd8eac5444ec004eb8ada5e88b8f2efc81532c655bcbf5b4b335a42427c761d1b98be324766d32925693b28664ec5d9b1e0c500f1f378975fbbbefa96b839209aaea35e21ecd0a293be4bc6ca552b207947a939b7d1505bcef81bbeabb5caec35752aa7684330d7b2f49cc8295e8b6a9ab46fdf1bd8df2f3552f10cf5e7a3c66896c4bc9f0c8c5f0fa69e8b07ed7f0e72b1896fa27c9d781f66df6409e04c45a08e01fc1aab4b9f163ee1bdea646e92adb97679c02ee3cce9ae17625c123cf069c552e47f91e71e4337d6af4565e27db846c77c09827a9420836976610fee4d40d738144272e763332c1dfdad6473460ee3fce4f2f9aa7450a1262ecd3be8b2b22e31f9e7a0e4f44285f81786e289823e1b7752f106fbd3f661edd9d528a4c73a44d103f3be38481dd0258b66629d98a257c734a83cf7498e5011262d48bb0155c585d0db1d89e5119506d7d057481ff8137d086cfe253b84f630924a3e83e770fad0df22612241ba3f1c7b3952e18e9bf9095cd3ecfe2076ceec9c905ca7f0288f428d5e0bc9e49448e6e425c8224b0a52ec90616bfa9ee04485a3a4359f91e8ed4b79d28fc9442c4cf6b10a3962fbbfcba7419a0d931d3de19c460a4bc3634e8f5c13446fa8f6eeb5bc507b192c0748bdb9eed2446011fc30a0f22721cbeaa5f004e8182e0173580db840ed09f60421c3a506cea2da13b7bc24467f3a017eabb9d676c24d3b2ff4df6b10c46e5958d757e927d39b79a8dceea6b197171cb5ac47312dd73fdea34185553eb5c8beabe5f506a085b0b737f842a8a1f32b66264412b59bcb886463caa9f72925ab9e43ba258e2f69653b4786429ab617f98626ffc6c44f13c964e7fcb7d16e988990d6d063d012d33b4e6e03790d5c79f3f55e2bbdfda6544538b66429748d82d50ecbc53a8cf967958901ec5061139dcd2c227472c23fe1be88457d9940f479309099150405519b2673a9cd634669f7c7a32a568fa27a5087bc1bb561d741e00eaed52c6ae9a9f24086cc132c2dce1c85e2cc4e5f1ef435235cbfb82d97e45bd1b1f697e99a60e1964aff5a0577be708a738ec88ba82be423d297d257135a412c5273c3daa8250d7a38aa0ea9b4c99847cde8517fde80020bc63ab078ca12446108e35ce89354ba6ec862ad63856e08306a7f75b612aef34d902ecefd3cbaba323dbbaf8ddc7e9d06729fc2dd3a1a24f6c1aab1c8f4f75c5bd8da7a7edba226f279635824e41109c3efe7cb61736c92ed7c007222f5f791c8f8c46f5847672f343480d3586aaaa51968a133ba91c3b696f1f7434e863e282788830a23d088177a078aad92a0a9e389a572982345be2475bc15b1c62619a3da008cd76c277394365ae7436e56ad4996fec27555efca412c42e22a0466488952e948538bbcb819ebb72d3135cd134bc40d1737acf066b10d1ec33893c7194d44ab4c0b2cf0d40d2ca4d2f393a47a6e8338f77b930811e8bab85f49eeb92a6401ef1e6aaa7446025b9c6f07125d4126670ad9adc2976a5c97981cfa9fccea623cfd25fe9eb78c8e0b1667e81c581607f20b343a961ece81364662b70162e7cc388e0933742b1604ad9b34131c45578786b29dcea81ebceb094be6fbde2b811696fa1eb5b54f810ad5a37a24bc759429c7898cc65307b41ea3010055608764b5cac9fcd1fca54c04f5b7a07957993a73270887be317a5290761e554032f7013e66862a2494cce587a0503d9d97f0d8d817a7f512bde706c504ec4c48effad524dcb70d3a2816dc074805a81dd84cfded2bf07b6072ce5f30d2035bdbd2235eedafc53c6f21239e185f307656a2edf806d67a7123da90aa686fec0a75a3d10d1d52493e501a63aa1f78692ef4725475d9a99e8cd96fee96d0211eeea2bfb47e1866ab69796e679e9106384863e120f5ba17d504fdad38a31cb8046eef901e00834f746437b7afda21aaf6591159d3d64c93c6900d1cff3d82774511c8bfae62c29f2cb537609ceb25b95bb7a956ddb5f5cfebb49429b2e4c5f1595daab8c5e37ab84cb2e503bf5031c3b10a8862bf033a0eacc90f7df4373ba8a9c911f5f521003d5d03cd1ba797ba4c9eb83b07e85cade29273eb642383782fceeaab01cc99f790c61e5c02b62043d68d573da0fa10b5de251bc486c177ffd92118b266bcccc54520791e639b9852d4055e0ce864cde673ed3717506e83275758f9e49f3627fdece48a80c8a85e5bd78f332528a8e2b426536c404b8b13a30ccf04ae15d93a05da9af92f8c6ce0e353837d12fc370da377e021fbf297c7e77c0baf6b55067171a0ac1b773969ce7ddaaaa262ddaf9d48eb2bde96c0250e69179770c8e75e7cc5d1a088044a2f858fcf3d397137732ff8f28f189d4ea365ac81eaef334741aa86e000b533591e949dc3e3a8dab41214482092569bf8a34c262d8e8136ff4099194e552990c0b78a2c3b16871bbe1d08cae7ce2f0f58a5506a8ceacd4079dba7018f166bb92baac4bfa74e4a90cfe47bd5caaaf863d919e0fe229829ec319372e424bce1f8f438d2dc9b0369f66418dc0d4ba1493604719c35810f2d96c0d88b15a1c122fcb51232e778de7b99052a97e5ed5997f2755cd0b51ac85edca24b3e3a88bbb520d8a77374e327e6154d8a6de4223c7b35763c2d01724c242a504c2ab74c150ef1e96903194c883fe787c89c7c7cb2595bb1801f8f0a13240c555bcf005e65970c71e760292767ff7c5e55c2336f63c8e1a1d916c254b5b50f2c0aa9ca4215e3cceca32949065f9b603bb27d9d7cb92073b197a15fd49c7d8f3ec9396999ae8bbfb41cbcdd6bc79a2faa8f0d1f273b166e7b5c5dac2c4fe4291837fc62c7a7e55182c4997aba487237152c1f3cf152114e69979a2bae386f4942a7714a5e9a972eb32b5d95945aca13261a127b6da687a006c9e572fcfe958c48b81684b0ef07a3efc167b26c66f84037e9955eeea10fffdd73de067afafd4e84ea8aa6712dbd5d73174645b505935ad51af65c06ca10aa4815c25abac5ed2ca1bf1c2411cf2eb7e7ad77e3f0af11af881ed3f7488a105be13060e42ee80b9309866982155be25fd7f48b01c1dbf9cabb75bcb52689a5713344083769c9cf1e3700e154fe5c6e91be7cee238b04b23909a00f2a13113686b8d146c8ddf3be2ab49f11f12f392a09f5b72fcddec1e186dd3e49aab0e95a08ec589b1d0dee4f44fcc189fb4a7abb352823be751f9bfe10b090facb625a7674485a73a87c21f8f99a08a7e7b2a9888fc053189dcfeb6e832e58a110b9ed125547577effab2741b4f6d4fa2b0a4e189658b5ccbc8238c94a90e5caff2a29b42873c00b970d76c003add70f59a3c0f1d54bdc5955b92c84c3a2d8d70b2598e26a5834b7e33588ea62296f45e831ba9ab924373d0df70f27aabea263b95ea313976f15e28895e6375cf40e3c4b169379de8c46e629ae89285c5ec2df7e17d0ce4c12f439dbb1172d6088446116d4d425a1be8bf35d51f31d550dcad8edf3ca88d50e402c71098432f960a242cffef514af6586d30d74056d21461abe7d74d8c9ee9b9a18cd21c5ee9427985fdaf78ecd540bc803aea718ae4d92431ea11d8407d55562ad647c44c6dd279716cc5109b63c0bb013d54da547366cd467fd4064d945c62a48cb9b994220eb4f16188dee75c3ffef7205ea53ce78403f38e6afe3a49c58618966e22be6fc0cf0cc4410b5728852d6acb50f7caa8fb6e3fff19e98f065a698ddcaf2852beae75cb7d39be742f5aef622572fb871e93b732ba2aefd532e1b40b45c3f3d976a14c3474b520c4da86ece8180bd6fab11386d4a8e5379334230e9bbbf4aadbfe61fc52920059d18fd0cd038c65b3acca45822eaf91ea5176e82043268876dec0b62e2abd619023b7023abc67c6b823cfef5447b8772f985ff7910d6cc87e6c23688ac6de1fee40bbe2da1a92770de92adaa427ace02fee571a0a0176fceb0c8f3eb72dde839ab201395625f5c0db8641ce19d7711212dec61733262c6ce4476c025e67a3d5bc01f3ce55e578e84a807e935b5ef156ffed14b7b384765f92a3237a267d175d7eb3f86b80630439816148f013c412f31ea5aac233233d1f1caa1a6fb8762162065277d67fa67ff9a9b006aee912be33988dee005a0c67f2abe4baa8bb5aa82e7c66dad8f9b6d371e9f62295844fdc5c952d4939d146de2167d86befd831960709758839979ce6e96aba036d8d8354b73c0e24343fd988f3770e960ab704d236d509e9c1005fa2a9538411feabb60e8cb6b7e5ba4dce4fb2040ea1c2ffda440207a96538dc07edf8cdddb41087f1f1232bb0f693a32c1aa43561f6df58bcd4b5c7de6465d59db120004b546ac83be7c3c282bd87e8fbd013338efb296cb16a963f2e4e119127d567135859d5179dd8b5a3b4a45ec4435b45251d1a68e0c1eeec94248b04b8b041162f8c2b191c1eaa42f7ce11dfe10da2833496ba635ff44800f1458306f33ddd747b6e32fe7ec646b0e6596ed3e4608d14888242e38f53601a7c1b9fdfead891cb2086d74ce69d944797dc22027845044248691cb018e51e815d2d455644884561455c80cafbac7c5133df953443c3ef539dd1af92a3b36b7fbd03de35a956e1801379974166fae714e1ea2f31ede23690ae446351d8c32d5ac426d342c3484d6eb2648279ce8fbbd9ca8658c01faac241a449a0b45e1f4e5b991d8a463769717349a5ab3adc74e2e8153a78ab812479aea669ce84decfb4ca65706d08b0be35d900c5784c38b04289eb8ff7b8ba57441edd2a5589ffd949ef4fa8e352d45182e6004b5376894bc504740c3db0734c0cdb70179e8b6a47f311804c53ea4b293ee471bfa381774e52a0d739b25a5309b72b88b50f52c6219c7a1fe42799be4e53197baacf36acc0d0a73d9ebf8003982e574d8e11a5bc6d2b7055f8c627d5c9a7ce4492415acda9295fcdc4cae82a015aa6e6290d4ef435883c4a11985c37a1244af70260b885124411b0323d5b714a22627c0e691315809b2625b605008ddeb1d7ba7f9417790209040d707ea1807d6dd136c68fbdc8574c750f7075da7e8935bbb593453e548160820d07f782fea1 -MD = 64fd89d0b09927194001a751b742427940c96104d7bc37489852000bebfed61055d2ac26076d5abb8c34fcee0d0fb3e0cb99ee1c7dc35d3bd35350c9fd1b5b52 - -Len = 97648 -Msg = 00c317f6b591269b94cc28ba064e5f1ef661bc877bd3a359b74dee92ffe034fe3be14bae90f70ba63d7255d6c3de544c49d803a73e21f0cf40f13fe33d8ef173d81c67f00eb7216019bfcc5694737c22e1c23645c85db12860115d0d3354a5459d1e71a375faf032ef5c9423c1355e0985c55b495fb06fcbdf5551f6295bd7dc538c74b10ee7ff8289f0b523924b826aff897c9a4c42b0228564228866ca0fa0c211750121a7d6b9ad2438404fde70ab15b7a022d73aff941ae7d8a934cad6f9b1537e7bf661fd4024a024613f15b13690f7d0c847c1e18965857c43d983b24fe9fa9607d43efd7db60b816eab19cc7137f01374e6fee0692fe7153d9e1c2e0a33afc68d05665cda2a0e584edb1149c6d44b710efa1a839d40b4ab7fcbbecf92551a15f5cf00a5be4a50b0eb1726b19c2daff27fcc3c528b609547f1a8901f4f17e28b277b345d91dc7a912ca7808a5a0cc59fada48dd69c5732ef7b7dbba5aa43af300c502c0ebaa93303f9d2465f6a37357f81ca359638ec32ae059166e9099f2b0d8a980d3fa379240f3ae2a1b53376a69ae3855b1bc8e93e89772dba74d5f5fc298a990279b314f4bcd71db8161d93c1f9bc1e27ebb214fd8ab999dfcd770bca8cf59d304352414c13b9ccb40990542da3f2ddc290603518b8b31dfc7c55a93e3fb1eac225e8cad41ac636bc17f48392a06f0a54923816361b4e01390ad999ff49a8c8dea7dd7533dbe7a5f9c6b1e69af919ed0477a47e00bc708cbffe6aa2b6b2c081ad529a0b125e055f92a12f46ebb5dacefbc90b341da20207b6e06f8b0b83e35c56ad855318a906adb02dd76a2ddc99f4610fd50136d5edba4639521da5c3f8a001410717eec6d4d77bf40f1c09773ea85dd269adf35e17ed958f7a202d7ae796d894891d3bbd55251a7d4022268db03217993100fb446ae8ce6d4f5c4ab098860030712ea89473dfb650d3452e26d9dab8ec94c2f78fcdf217583998a56ef2b7a49d2812dd55144c76f62e4dc64aa0e86853faba8e48275598daa09ee6bbdf73ea611791810822b583f6bb029802eda34e57cbb1697662577b7aec34b4a04700fa06a5733cb3846204d8e12c4c55a854937f706f30216541e5c18523b72410a7fd14397fb860229b222507928a4cba435e544fbc8a51185b0035d432984f23b01b113d7e9a16e4a8056497fdf9ee09b8d85dd1601f0f63ecf4603f2bff2968637b8718398ddeb2d0d41df83541437efb29225e2298622e3ee9ca2fd493bbc70846fd327537bf745db8d892020b530153782b5fcb9d53619706f90df7fd0c29e6a3fcf3fd40c11295d81ecd2cff277b0aed013a23d5e9e44073773f5ae5247446bb0bc39851ec74c15d76117ac4c6d266b22b59f2e92c9f8159cc2fc6f10c9270b6b20a0d124983286e69c6b50338f0b0ec31220080247ba1e07e4302cccb69acbb7930252adf2514347e54a56386bb2fc69cff1543da5eea2f17e5d81c69e342f2e99da842b643cbd63d23128db71d2d66f257f8da5532a26f1f7c0e8aefe7798489b95e01d7c6967d2e9bc428d3fdf0f4be9272ec9ddd12c71c706dbd645c9b99e1ed0e104994bd51da2582dde342c19985174b21bb4982609828bd5ed02cee587a9f821614978879c8271654edd6e87cd1504b23b65c39611a0ec6143c3ebbeadb3980bc41b53f1e800b4634fca0adc729a43997960081f32b894f88af7a49778c21d1aad7d829678b37db251588589f167bdf28641ca03e5201226131c8e22616c13d87dee78f7d70159dd14276302e1f3e037c2797df6917de0548ca10cc1f007f8bfb5fcab987b70b53dd8a527e9ccc536e3be75b869d0289c1e5833a508bd2c585b06069efaee983c7f4f6048a11a523e80eac4fdd019c681edf632eb69215faf14becac791a8de4bfbc8c759cb43316399d7f5b2cbe6ce4e3df72d5465b50859877087b9ef22b9604dd568bfcadfd95288f6767bafbfa66da8cb915480f0bd042dabebea85f4b015e005c2ff2258b067e8c6d5bd0e1cf54c98f3fd703d5cf42b61c155ddd88768d94cda54ac54466d2033e981fb6987217798f0d04c0d62243bee61640869633a270eb39c2be3115627f4af09cb4476b18b2352982c7398f3b20e0c74feab00ba8b80320812515201dba5b7db8121643be3b299d3b60279b92a5b1327353ff850735bc626d4217106a7b17485c172e8170de127115d3c8d0b115015f9207aa2927afbf08705c606cb38c2658710cb7ad986198abfa6743b5fe387a54954fda7f70eeb31a71bc17bc5fb331b5dd39d8509d8d6455d165c1d2e2d6c21b6573b7104bb9419e57ab6589d6b9e0688ae6baf1e72a1e76821569b0c6b681bce8bb68631ed9119e0c6f72597f66da785e5b8518de006e17f4bf64d610a1603d086f16005217ca21775065b7c481c8ed43df604dead6fa3f11abd9cc2a5f06a8acd6e87050391430809866280cd451d020bc731973766df6c021f11b7ab81d04bc39073a7f0799d20f8d9f36c0251e28dc38e703e1a66d44e968d44a6a744a5a1fe09ae6464bfe0f0c793568463dd6fd619ce4949c2fa23274c9a9e1605a37b1bf13cafd0fcbeeef5fa2534607e42257963091520cd9b6c74a8c9869c6338c11831abf0641500f7bf1511f596be1aa3f633b17c7996b4e0c51f9cb6903c7f083533ca08943a209baa8cdc128dbfe15bcb0079e7bacaf1507725767697fde0c0d17c3950e7f8985b56d60623cbd010cd765da4df5ab6bb0c296f097f1a24088bab7f5c81e5ccd2b7229502a1b7ab336976bfd4cbd0068ca45a30a818ad4b40b8f1c1b5e404235a2fbc2e6404f7bdc3c04a8b8c45b116e099683ee4dbb7d043d962c7c82fd998b9358226acd602744c5260552dd57484515bf1ce4240d05f6c8d6d0625adcca95a58f2f24f8d4e5b27a066a15be3a0cb497c858332e07d4535157f1130e653b1c81aad35bea351ff002abc047908cc48437b71d25923152e2832275d8c72055e7ceb0f459ca0a3cc4071ded317ad3da7d9c9655007913e86d033e46f9ad9680c035aa7c64c1dca4f72e65db1ba599b5676f6ce70d0a36fcba7cb34abee74e256d5e9f52c5f732be51218a704c3865bd0a5742bb946e21f893948a6b6f9ed0aab7f0975ec49394f4998894960e5cc05a2efd1fb9ddcc5c42bef3ca8f53f9a57966949b88a8be8aad990a8c34a73931f49a080bc92f4d704403427ba0b32154f842f1b1b8bb9f9d521750793260f640f317210fd3d419e4642c29a585d73d659112b0e4d6435f5449dc02637781bc75bf6df031bf1257400cff4f5126077661aba07839ca892538fbb0c752ed52b259c0641c7b75322f0da3465d876b8bf4cfadb2f2ba7cd51ad0d05a474f7b1b01735fc34ef5dd7bcad191c7fa4d3caade370111c56ed56f65a431a42b610923d04b02542da6e03750173d4bcfad81ae5c210e859a5dbb9e303c84541b9180b3486a13dd629664ace964119984ae22dd98163cd6199017aba0213233bee6c6139157f82794cd5224bb42747bc0580780b79df3cbe90ed2dedfdaa409bd68c48bd29a1bfa6c5493e5f138ceb72bb419dee43f9b2db3dfd27f15ef419ebf1f626333bce21e92320d37b1cf88166ec93e4145839cc41e0c01d669e870b96d1489e2dd44b75aad6faa64238d086031a05fef02f15f58d39c462b044e9b246f4e1f51f8ba0177651451b371fdb75d1b3f653144114ab1799788c50ea929a56cd50df8aba7273e6427ea6bc0a4fdd4d5b0364f336cc696b906b1edae7f82050db23c1f1f9293744fb35cd53b0c438f07fbbc91f6893cd13bf0a8eb0c5a0e0bf9ec930e7c03ace4d1bd913907bcef545826dd3fb6f01228a65d550751c13481d88bf90ce982da55904f70df4f3c6bec703b83a09a2ab264a355a089a53d5f2d549858638e98858e3470e10e39151d1ff84195fdcbbe824dd9e171b82f55f4d91319975994cc15586629cc0fedce6fb49841fb9e7034ecaaf108b0dd18915c4bbd199e3723a7f27bce81192b94efc875f7429dcbb215564592d345408779ff4cfb9d554562b085bf1380b1a756008f28be4c63ccb9e82ae465481829a59645a375afa4ca7a6f34ecdd2e7ace5a8a2e96946735e8ac35cf50117212e09a6f971ad2567310936c68c9d6945de7c9150c87229cfb69b385ad513f5619ac8d8c5b77ba9baa5dd3308a1fa4b94239ca2791c310f29d95f85e2cae97fe16d7a676fb83d78431fa654200b6efa5120d864a2511057203b5a04bb431c071f2a70fb4dd06ce1cf02f6f2a34566061b3ab2505303aa9231510d6d1ada063b79365edce6bc84a68cf431a718cc79ef40f5bcee01a07a50dbcf0c07a7fc427d9e3586b4d0b90f172b7808d9e72d052660d65a9644b3da138de9b86cd9265b5dec9caaeb827276b418e2cf1394d3b24c09410df182ca744ad645a51524f4bb4ce2c01e197265661dd3e906dca85cebb098ea69885230c3773377549921c3dcdb1f6462a7370e37b4fadf42ada8252c049e26dfb31993322923d3495146204a8900ee1b1d26d96609ec59f4ff0ab8eda8878ae31a6f7e5ab1360df5e608a68ec725c1a9f3f8539b9d26cdb05956a4cb2cf38b0616ca3ea7dfd87bdcbfffa314260c8391c3f20922df48cee74502652f0250abdb409070a3e589a1705781c2751613a854f5ca66b650a0c21c3a948693b93d61b5207890d972c803533535712c27d9a47611d7f8a081fd4bc1b2836593b20841362ee93ba2f82235f7e1912b93cbcd0c87a0a13b7bf38cc07a35659ea99d4fced0d448cdaaf616add0e51b7e56827c44dc0accabc325fdc4a84ba19e4fdb726f17a93dc35bed23df60a83ad5eedc55f215e8a0d60089beccce5dddf0e0ed2ea67d262ea9305dc84f49a385cec759f878b7a2d426aeaf5e4d6ef451131752c31963c3a20bc2b87271de8f62c57a5bb25d23d1bd3a37f73acb0c97c1915dacde1c7e1a2e577d9db0fba194885662723223fcede26d370202ca29d0a5d82e3bee442e822a18eb7e1221258b3cfe3a3df641a55fea5c264014df4907547403b06204f7a42bdc76ca0496fcbc17294c0f5d5abfc01b6370420f5edcc473d1688ad7f36bf8b9feba1206d179af9d641276f5c39e971c3fbf8840dd67907a9ce73bce83ede84b0c2fd6a7453eee363b48054e00e44d533d7e7357ef7be3ef22ea33a42b000b658132985486bef0882b472ad4b7036b66e90793c2e98c47380ffc12f77d44ca700a8cc79cfa7c4ef9908a58184a8e79bdcf157a00701b32ebb0874a46ef2ebe10e478f4ff34f96211279c2d873fd7e0ce5c12969f07ab2f80b13659f0f5204ececb91a0e9aaa8c2453cf71bb00b92391f1c7969fd04ae957d8e63b2b423cc04e00c514beae01cf82c6d25930132200b368cc474b91ba81d58a4b9f4deff74791b4352668169c86c2d149234294823af9b298e4751a12a2fa8907390ffeccc03c6fd0f713bac3da6ddefe76f66b1ffcec37f31423539a734d3de5b078570353d8985d30c782bef30a54b7fb5680426c125fa57f5f24991d560facad90e3e42aec99a5788c56d4f8219b3d5a69bb32b2f69375ce307559c79d6523d76088b66a00d970786b1e4f113b1b583a370539f71d392da99f2e209aaba814d7ef2fc33e9dc085d76bc27568df3bcf43c9449d6311bb93b7b23737be0741455446c151cc4ab6ae3e952a8f2295666c1e2662a71d597f70a17378e65a39967ef76b24a93c8f23b155ef3fe46ae501f57356459f4e7def8b0eeada7497ca118968684213b7f46f57c384e7be66587533e962d7cd1d0571aea71e432b9c41192d4e4501d66502026831590b633e752aee2951fe78b37a6f9f14179c519226153151084b3c6d4045ac4678941c1bc488eedb2ba4ea37645027fcddce2fa0026f5e1abb078bf7369eebabe8683125cef8faa6f9b069d2497c0e0879c00def5b8e7c51651d0c2d6d76ec07b171ea831ae0dc32c20a3eacb35b1cdff25933a6bcda539e0f7407356c367803dc958f5e31a95a288e9ab1ec295519295083e8eeaabbaaa7c0f6c437bb4457476fbe67dd99bc3d30654809bb34d2cc909b2575efaf994a17808a8a5ce30a517a75d3bb29dc7f4cf150fc90405b3afebadc2622d052dcfc945718a3cb6bee2d44f3bcd369815c5114569e8ca426f5774f1b7037ba1cec86c64e8955addb5ab54ff361f7c611ba12408016460e1d6bfff85eeafcd49332b0576cc3e92abcb5af407caa6f681301591ed54c06a7c9045e5daf7cb947411444ecbaafa7699567e4c2977f82760f98ec565d281496b1295b25150eb53aaefb08303e35d693eed81c7b4bc87a188ee9938f2093b7045d40c0f8998839d66050c6c8023ebfcf4f701f13a06d9d78175b18712773381956b3538041d28d42e179445f0eb0ab464197b4339e5634bb325642a679b2dffc23e8dd6217d5f9a7b9e04b9b6875e0204bb5a5834e6b860c6742d8d31e36f4d64c4925492377c52d6eeba2241a73a784f632b8aab795dd913f88a3a31fe9bfce5a3cf5db6ca138fb8a0413a32c94479ac976b651e1ba7f72418e6bbb83b1880dd42b13c0fa3c9b3a959264c0a4be0a8b4ce9661fd5c3b5d8f6bdf7c6527896bb427d48a1d52e361115fd5e228cdb367f07f392bd9a99c7ebe47d116a942532ff2c9a5c26066151a994acc972ebd2149d83fd00d23822fdd295377f4f52a0a4011bea17f694bb342a99096d57ca8bec0e476d7907b8489fb691510a1e94d134ea97d541ba872627bbad7b117a30ee06fadbadc50421f2f4be5e357a7f60a02ae226c3a119e7897184576a7f8225e3a988c823ac707b08451386499719c0f5cd10521c00bcbdcb5bae1f3e7d18b2521ee09539f6f3cf71dadc91f72995bbb8669da248264a10d62d618d60d4e4dd23ae2bca566a362417fb4205a6f79a59d13db09eafdb6ce9912fc42a364c8db03e9e91f0e1d2e182e1f06d6cbdcad1a3289a72cfb9e7ca4fe4a8007d29acbc338b39398e44f49cf1b700844da66ae2a0a5c50bbccf110b4ab7e23c0ea2be186df3c64c2ce6980d7a8175af31c89f74593105a2ee5722d8e2f223a16607484a665c8cf1522f88df242795189f8b312fd4b2a45febbbe3d8207eb4570cc113f926b0d45189878bb8f892a9e41f57e7bd1b12e86b3d6119b40b41dd858839e7ceb6d5e69358566841fca8f83e39948ac336371aee6bb38f13ac24e55463d68b711db50ae14804e8213a52cc4c76aae2ec2b0b810ffe170c9e090f16eb24ffc98963368860e0f9d300ba796b365d02b7dd047467f77df757fd2cebb673531e67be9142a73aa89ef18883031e257702d141c95c12ce70ba39d71d9e0e13799a2ebaadc0b1972859095f9cda2d414a13f8be80aacbbb60c87ad4e21266f41ddbe622c297ec9ee993e52d10e4e0b1609ef3fc3346dae6d489e29d852d063dc74957a1d5b1a17872b54b9be40b7f9e41098ba4e9178778546538da0ed93517ff4c48ddf0f5174c4b2504502235512f73bd885eab071a9968c4463283fd3caa4e4c837e1a4b9843fd4dd8f5d24c9f8d8023b2d180fdda70990ed24eee81631d3bb1ce2d5c9b6a850f948e32fa37b1dff0a2d0a670e211266eaba5d6564cf2984fe3f292bdcdd6390961f0aea4decf4e49a1ac85839c05e270038771c4483145104ab75445ca2488741ec412d7294102158a0c14c214fecd257e40c73f5c684a084ee41bfc789c99d632d3059c004e22dbc4b9fe3432460f17859781cf70decfbf584391ebc08695ba05e530fa4b40d624b77be9e1df24cfce7e55477c6ddcfdbcce9a5c198a29a3a5ffc23bf9f25d4877cb197ed201df35d1d342c04f39aafb871ab2248ebfceec218831cda1ddee9d5c685d640e81c06ba8ea26954fbd90f2a8a253925345bd97b508fb8efbf53a005bf60d439d480f96db2dc96e85e1d60aa7d0444d6f063ecdeae7e8280e208b97fdddf2c5883d14e1f202f3f1f78ec36a0d0b4ffeeae999b6468dc040e247278ac985d490d647167276d36bc9afaaa03b62ba3a4dcdd5157953624b818053570248577b4c8f505f71ef07fa9cb51eb5a42c47cee11fb4fb3f99cf5190ef2a632700b9aea2bc3f3507e30668130fd34acef519d363e86d932f9f3a991837b693207b14373964fce15cdc387dd5c7b0a7e14498117a30e82572ed0cecbf61dd2f1641d1dcbb8f6eaa976105008be59c1404a22c50cf000df92f0bae122d74897e30d85666cd457fdae0fbd5bbdc6f81d85f963d570a5fc4578f8286d30b78a1c997ca0d9c198f16b861301074716f463c1ba833efd256f586bad8fef701760d58729f5c4847741b8b3f8b1ef4f1ecd388606076e0cfec88cfd7987d45b674b573eaddad30fffd779ca591670305ef100455476ef2aa29657a0e476a86d37d8162270e671de8311033b9cc5468557fe5f723e484ec0b1574cf896f2f82ff96596c50b9f2d8aa18cf97a3c34bed88a43aabf1bf1e9899b99e156d973301e3c925db8d67b626eeba9c128cfeb5584666f766e861a6bcfd1cc996e548decb271dcdf5089f1bd25c2060ea9c06fb7239ce047130518221df46de98160998a7729b3903e6e989a29b510168fa62830307e34914f0171c8fe540c6642b62c95f6c49514c52cd6860545569d4cf9ab7d358aeae96513cdaceba1167424adbd9b9be31fe1a72d420d22e357e764237fea9d5351c417a4726a504c1ab799cfd317e105b26b36e8519c1d2f82a957cc0bf4f2582795b93c067dd6c597953484f377609cdb2606f69bbf4e7a6547ba4bd648bf19daf2dc630043e99e0b816765a546852918b699d066f351648e46ee3b65426e18ca4ff391e6790345e520b50a4f01d93af97161fe79b4a07e4c1b76134f7e89c5942191412f79be4dc2e7afbb7745e732dc0af1e91a9fc6185d59e45beb598cb0c6fc280941c27526034aba21b46f19a15ed7bc18eff13cc30076ab8ddf60015ab1543a52d3efb25f54ce56b56d09eb16f06c331640757f2ef3f65e11822e623401be4aa64c5e006a05e727ef2792f6041f2cf959e279078c965d5e9f7a1139cd269edb7c21a9e9d6b52980477a86a4e959be716c1c98509c76203f702db4f296ae7a6f6cea3fd915d10a0256bc7192472e853dc5754ff4bef1c3734c23961720f7d578d10c9c58b7e81d208583d0289e1c15a0ee830c6e64b7cb9c7be21131ec91347a410f4bd32d78b75d6c572ee26e80e46d4fac4a283e36ad0d97efc2bd6a091bf64578dae2f6f17d3b63bcea4a392b75d57177a5bcabdcfc5928b3372419ddf07f46cfa60294f0e32d141b9eea7e4a5e8bfc6b9b862e391e0196c2cb008c7e5677dd7a59bc97d56db4f5f9b92dae8be2e3490ea82f45d9a6997a951add2278c272721f427b703d916571ddc59e5a5eb79ddfb73812731d0a833cb093048c3ba8e19d151cb9ae97d2a1104e40b7023150fe291bd7da4691de51659bb0312a558e57c6f23501a352c61a69b1b70226b22396cda303e120d686767dbd1ecd7d54f747783d27fe0f1cd013e6aea4fa484fc3fa35d348b1a2399774fdab2b43f5985833396c61e9424485300fab7729d768969aea2322e64b5975df6ddc623f43be45ad82f66f5ded7859f15d2eb9fb64ab3ffb53190ed97ca4c61836c75009b8353418dd71cce64116b2da57bef9f97076048e293b8915b6b9fcb1f0f2715df37b97f7a15506fd1dae444d77b2a3ae7b57a8d5b4f10e25a9f78e2f14f44286561005dc87168a1cb3ad82dd35c03374f5de81648ed02a7396ebfef22b33402d8080f239f73cd2cfa3a2d31c2a5e4607605922bd2f5f5aaa3e05c3ad9c45f6bde35ce1926a4e7d808e1cc96ccdf347b05b8601421f051b13efe380b3f082e2a1fef2586868b1e6d9a389da418915a51a37b3a185c667d85b2cf39aa7c090709453efcb4e6b1dbb25b4588a5cf43c0aaf9580881abdde3eea85b485eb74f53cef52a3be96f9c8470f01276df187ecd4eae56b29537dfeab3c8ab4e7118607b42d9bcca6e49d6836f04a74d9b1cc8e9046b7d209d28f3fa9eb9c63129c8c6e52d99fb918b9be73e773d0af72102ac7c95d8d63be0a6a27b7524b4dbcfef09fb57ddf079878d551f5043455ab9f3afeeca9c68e9a8d872d501b07e32aab4af24874ca168ac49aa8cc1bf6060ab175ba869603c133be6ed710a062b20044042c7878e184740f46def945961f03e9537103acb58a2e2f99bb558cdc38c23bb4a4e1d4c5dff8cb927af8fb852f1bc96cb8f0786c67ce539030ab2ae4f5d504c4d20122e7676d8be5f347b853a4d6b41a08e96388e8b8ccdadd9e151d67dd31bd5a52ddb6d966c2b9de61f6722eb94bf3d73b08ab6b51fdd2188ae5d60d3f451694538fc4a468f296a2d450711b37e372aa71d2448e4e593e881de7bf647fb169268f938136d8ae04c71b30c0f8d73d2f093a5ad4bff2715892a3c529ec12f91d6763a38d2f5a577cd1a321f2561b9b8169e10cec8ee2d8b8ced8f8b6229daebc0d7c1a38ec5281675908ae859179910242f252ec6993f1e7a319ecd4a67424bd5f3562250c55be7cb3b830eb5975b02a3b0ad764de8a5f5d95d32c15d64afda9f33c35d1fdd860f5784e53a41c947b81a88714d66c3a63a34db130ea3066bc0a5fdcffb03f5f0b9a1d177130496a557111f365c17128c121012095d2436bd246fba41a504f5e20b328b024206e4bc0a10ddc74a6abd9da7f76adc56e9ddec2e86d3e2022bc5a42d911b4e6e4f9dd5f7a02aebc067ac2221704b53a0f9e1410871ae7abb7f4e7e4846e72340e8a73846486e696615c762a8041d38e45c2c04d7b8b5d1770876b884da594960d8ec2d2091110ae37cf7a762394851c91ba47dc6e44faedfcf269908d4d887752752fcad027b96e0a422377a9a3467f83d33f3fa7ce3da9adb476afdbccba727ddc3ec142314d50496315b16ac4a4118cac0b09e08db1e5135bf748a1b9c6f200326467e7c458ef8590d5b5ff9f0a9d2cb32fad8109e40ace378fcd877b2a805a162531296748b63f59c7f7c088f65ce47731ad01d940852ef584d0f5b751a81bd6158f9f80b92ee73c80f9561903eb3466a58b0b62540ec6049ae564c4d8c3a610aa05a2a706c41da7852d48d59fc2ad0fffb9d64b9ae213f3266d5d4a2c7d89445725eb50de1033294915f135467daee1a4dc1aeb81c9a93fabeb57adc94045ffa152c2048b8dc8303145e7be8466ca7a394441c8a50ff648bfe1ec663b966c811d2eef38bbb76d6af23fa4e7c63870482194e369712f7bbcc6e3741a0fea5da73f1c9b73db076327f065a127a84d40ba0240585482c2a9fa5552972f92d699a06bae7f3c56087a05b04a8524972fac6e3fc949003644118fefd1be2d70c5c12b374702f8d934f272b67099351f5a23d34eb21df3184e42ebfac3617a365244963698cf3fc1076cfd775a75ffad474777c37d5fb3b52baead1aba29bc3fe6947fcdf61c87aa1a5a04877aa3dacd9177ca129d76b87976c531a4286f6a19fd415671f1a356f0c84a364b43ab6cfca34548d0950b77f1aa17183b80aaea3120cba8d71ddc3431abadf14767d51cb707208261f67688aa5024df457584d331eba3e551cd2f85f93f05c41039e9608937a9e56b245050ffe37ee5665955bb88a86aaa66a235f293fcd23d1a5c30deffbf321030c111678eee75d8f2bec5e9a1f17056aa1f57d0ae6fa3baea1153fe66f86961773f4242c3dbaa089f183e040a51657880a73dc6b4f1eacbe42bbb356b9db07793016b693b35ac12aff826814e42aa8e8edc203b243e27febcfddf1a89f997b118b9e5415186cc75c9c127f7da3fc0172920d7a498aeebb1b8fa58242ea69fbc7cbb4861a339bbb06115babe3ac34690e407aca96ece96838cb39ed8e62f28e833a82d50acd8ca410a78477aec579e9a441317a03317b8f29ccc1baf2cedd3c2d1e2dc84daeea8a61a3b56847b773881cdb5b12f6204d37d6d76672d8f7d10dadc0e0e84b9e5b76e35018081449cb4e5e57201ad982076827374f9ca7a6770aeb68c1bb6d65876e7df5d2de7e45294352fda71b131f512a0432a6c0c7a1773ad05ef8cb19ca187d17d90e72ee713470e114199d0cbfd18655129066a0b078a642e9aea0b897b3a89a45f24dca9795dcf1e69d262c2a3283021d37179a9d22542a520bc0b39202f9ec81a6f67b7df48f6bb95c40db271a2af39cc35a1d2f1e4e71e236b57084ad77f6d553f56aecf79238d67e728180328211d65cb8912d149cfdde580759345c2aa08921d3feab49ec3e852a4486fb2193421528b85e60ab44b891983cd56cb61bd3e437179e8490a5670d883f52618f656f9f52e2ec908c5089421fde4bf26351752fbe49b43d75c69ab8c1ea4d79260181be00bea3845fc757381475258f0cd46fb3ddf2a79f9f56bfccfdcee00d8b6e5eb75bd5ec06cbb20cbca087ca0b59adaab5bd99df72b75dbd92637171e369b4f0d58aae2ddc78188f16eb9ea22ef1e30d8085c6c47e64e47e521c5d6ac566dc1d5fb5d1cfcf0f01c88e1c4115c07d7e7f5b5e01be8a4ff1e9544f1a31792aeccf9c06c73ba738769f6c5cf98b88a487ea8d70d335601f8fe6df252e30c75eefedd5a317d82c9a7dfcf7d24c6c4f0f05355fe2c391c67dc35d3cc623cd79aaea5f53b4490d26de21c778a7c420dd65004819dd5a3a85119736b459817255b5e70d5b62e6445cab67e83702e90ffa4f810b03881e98658212598d07ce862528eddf38d475e497aa59477c0c42a26e758e66640c99132d793caf0ff79471afaa05bd30347e559f83fecd8fec573f007e324186905314a79d1e1e84525a9abce4368f8da789fe3cdd5e60b7cbb0507a137284af3dd3019997bf8f323fa96b137e883d95571f49366082e93ed1d63ba2db5817283ba144cc0e28eb62e7084b7e1f03af916cc79d54b571516a25506a417febe239b1454308ab5f185d71ffa2c36fb0cdc80e0a625f84337e84f0a6431ea633cd29c7476814166e00680616d9ab18968084636f012074d15ad359613003f939c142a7301abaf65c89ceced656febfbdae0b967ee05c2e52cca1890897b61f04a4ca7688c0c0f3329dd5f0c682840f2e40a7cdbf68de5abebb34a823e200c19c600a5fd5c4efb6f723c7956fc504adf01f9d30bb016d9f1e11d6dd3a78a9870adb4a88a18d0fe7b303eae4578848440b3138e9f914d0a579b5cc50d6c1791855ffd2197383e82e6f2587060831167a8860bf1d0107d015d78f612a7e25381d85b2e93bd40e41313271e5220a2a37f76e9379f75c4435974087dc93bb0cad3da3ded8154b96e49b04cf4e61e3d97364c5b2af9c9131c7d2bd8584b214dea121b66ae8d160839712ed2708eb1da8916996a4aa3728384d6f5571a3b01103dc71c63e5e949b3d233ef6615ce73ffe5bade853afeeaac0911511337fb43ae426d4dc428589852c50c92665927dd24297d9c3a609e99e30596df7b360e718e747f2fe5ea4d5a5b9e558861bf2d75dde0e942f85fe518cf26e1f12da907132750674377a02a3834aac961c6bc41a6839888735d8d84efc6d98d2678e567910f72c028c7ee819a8496b28f23e4f717cbbcd5adc87dd0777099e2e00b8f9273bd3814307529e5f9b1cebb9107adc0220cca4b42d7b56a5842e4adde441c2a43a73cde0afde6c9ee42df4ef7c09b3f5dcd4d63d2e9a8a4fac4462841b0ff918953dd8808c0b9afe0ce24e7240d11c73383b2c9ee9cdc32e76b3afceae0ce6abd59b6acca7bf6fa69aa5c0eb64bc5fa4bd696b7f66fd476a6ae4f960a41ed08381f44a6c07e334bf16dd1302eeb1c3aff2c75e87ac10602a103d08e5052f01cb21af4107b460327009f10f5ee89791bc5fbbcc5fc3f05396f127a303d926bfa93e361745b71caee2fa4b7ca8595812f58dae7cafb3836bd8940b946229eb53455ff094d01701f33c715222874adb8b800309371e84b3ef15814fa1abfc6605c80c457f4ddcf648a7f66ec9a4c20847854932c5543f662678415d93865b7f1c5acd9da2670fe2f44b120738a6c9c78d2de893eefaec8659265b9b319a4d1ee2222b60c3c4b7af404f4c8538366700a49f67927ab891fad14a57734590da2b9d49adf6ab0cdc4474dc2d5191fca59bd5044e99303538aad30abe4c950f0a8e96f6dcc822e88689d8193cd10b9f8a806884260fd91ae87eaa8e178debc0e62f15523e3cf000be66b32f016e6dc81f98a546765c3d0eaa5e9dffeaa00d4b75f661855dbbdcfb8bc34f450490811e6bc9d373c6e724ba8532f385c0ecc357c0ccc4b6c1aeaf81f688f284cea00d4a76fc3c329f1a56c581e2f5471fd9d78ccd97840ef07b313c069de514e604daf3481a26ac875c9ad8a656eb6e92cf0f94a641eab4748c2ad1c3ea701cd426b0c2ea09da090816ba9bfd771d219e36351453b03ed0d54762eb3558dac4216d575f63b3a070aaae7cb58d2bd289cd760fb7dacec88c9916a13065cd6d3654409671bbfebf09f48da9cf5e5b53cea6f766224581cf0e4a60ae485a326f97f50936a0fad481fd6e1b099079f0e917b12201009cb39d7e6f8c52dc1c7029128c2f0096291c2c74a0c063a1e5d0da8c775daaf7e54b780591045594b46de3cca21ab9f850be099513e580a9aae56e577f1127af2a31a9cb372f7f172913e5f0be312c7175a160894ef02951d115ef9d51a741d2724d78f7e975970e834976a469de20a7a2af7978d94b2441614aa3897685c005c6872cb1303e6720cbf6df102a895c42decf9b893d5c3920626bd44075156cf22dc70f2392f2b5f60804695e8998a9eb32e910e4018d3297dd60c8edd6be0d41aff5677299f94a37425a59b30e74cf4aa4e61eb2ad45d64dd811c7b622e76a9a54f97dc9cdbcee8c81e0fa3a428596063fac0e1bcaebeceb5e661bc3e0fa4ca325bb994eb5a1689dce7e9318ac33c6c708242846dfe93d1874470b3d985e7b0729230329d9118211301c6b78d5e726370936b35c74a6917d249cde4cd37bbf6c681a0283c1750291b0a2cb8043077ffc49cbf984118aafc1754ddd1717b9e07beb86df84f633b1c455f8fb5880fd99bed0c940e73ffd618d704250c7ef80a5dbb951e353ffb5575327074329142f3c26a71ad1ac85676d891b637f83e038d734da6153196461bce52eb5eb1b850730dbd5a4f4fc6c309c5c8099b17474493e3057a07afdaea1a72373eb3a555deb3c866251f0ff7bc0b6afa7ca2fc2321ba27537f49f2864dce2b4fd92790023452acf57070fdc3a80832996df4294a216cbab824709c10e793342d490f143607cc05dbbb097bc31d6cb7357c130124da3817b418001f134e2637201cfe7479bf8c7d99633d1c6e92b5534f2564166ba288b8d7b87cfe05f7e3aee8b35a6335c2106eaf0780523e9e8ea156d88bfb5710fb2883844bbb516b57f5e7aac75302c5f4739d2677bfab97352bed23ef02afbbebe14809f0d99e2effc69d71b9b66911a506e43e87a74e23655d629601eeadf9f77da5c800cb34a9477b8a96961fc15baea304ce34bb9eb97ba0678d58f20a518a482d3cf012cd60cb9f3f8800f1b40a7dd27f44037f05c004bf5c9878bf2d6930fb4ee74342b0ec08ac1cc47edea9949f1fc43e78442bed8ce4b235d5c88f9777e17b457edd97b16b1ca2ea64292a809ee5741c07ad697870cb28f3f490b962cba532d60745da477f8b72585583af54d9bdff7b463d57275cdd0131599a3361a8b11617810e0114c2530bacc750b097ec13d6ca98566d40ad94dbac7957760a9b8f959850b8a4bfb01dcf463e22d6b052819a8882ab247aef7d2893e85b09c410bb21c70ab82d9ee5464db33e7c7a3489819b43a98e052c9f1078a60b175724a4ae5b22239f1438be66f7722cb013ab1d9e897a617197ec38d93c41660ef6b2c3e392482fcfe123c7ea6d119d804b7a7b22c59b3f1855104941f3f49db460e4faf5779773ed2cd68e6b1f00154f8a291ed8e034b6c4b55f4cd5204df6ba1e31b65e6b9eb4594fc76e437dcc0880584d950b59c55d29412fb02d51ac2562873f9278fecc55b6d28d041e09e40bc51e3e6a44a2cb869870f82f94f89d8e405454fbefa1bedc685d8ddc4563d6738074a20b0f4bc5e7a4dd4ef7b695a0b5f5de286f3ce4e4ace039405373ec11f434d3eef3e5c522e4c0de9ac50cb94410d5bd0078cb38bc6bd10e4b06043334f264b49bb1429f91029f0d71f401c3f64382499395153dc48d9d35146090b9adf2a2bf2ecfb04b6ec571e25b21304645b26e3c4830c5348b96c75622ff83efeb69412c1eabb9593aa1fbe5bcc902d090e1fbeda4f835ed7ffbc1da0d4f68567beaf2a3f1e1c839733c9f801d4813c39656ddd62047f1a920312f4919bca88dedec29bf3eee677ca6d9df6a034acdcf9485769e409c82f80adb522bfed3eee6afe148d66c3e0183541e3ddbf53d9b3539f248ae9c82646aae6efceb233185f1406ee271e06d40fdf97e2d8e799d2694e521d67f8a8610716940620f0d32185e3df9891a51d8803d158e30c9f6e5ea7f2498a2999114019cea0434103372105df6f5af48372c49d116a2ea46f3a4415486db3f7546b8d25daf3ee5973c5e08a109f7c783e6b5285a9b70bc6df654d5a57a4dffab21f0ed240744f8fc6e725ba7f5845446072f962a026c29b7857411e28d7575a3a938cc90a0aad0c8604b93d3380ff8171ee80dcff9e9a4ac179e80bc1ef643e7530ceb1409f52f83a8365bc3400f056f747b09ccd09dcfb433109c72cd24ccee95e9e33e81a847a6bceefdf8bc160ec7ce4514a124ed1d884e86efa716a57342086c2f70c628cbaa04c1f4d3faa996a872f2b8ed755be060e07dd4d969dcf95a20e03a4b361b2e16165bfaf58a2e2f9a18f050e2306eeb069f41f67a555fa1cf56029e2e6fe3d17378195acdf9382c1506ca875fe49a8fc1b19fcf2a57922eea3e2fc5bac217783a8086beddb64c2e91f2fdd6970063312aedd3b939ff18d3634fe44b40db2a64e3e62071954fdea9a933e6a928225d81baaa7a6f49aa5831a2e1bc898119a139f81f831d9524642fb3602179a3b8edf3f95e103bd9e7d4ec21ba051adc1bf069ff830b3d5de2711358fe3ae26a42990a5f9f21b96b461355782f7a79b240ac6762b7354b4ff88a16f264af5e1c3df32765d42b625e2397f01ec87920b42639d4ba22adb1fbe5138d2849db670a2960fd94a399c1532ed75e7 -MD = b8f33fc394687880f8d658c24c4ef826cc1fa0387545762efdb7a546eef9128307f5ae8ee7b8ba5817b0e492aeca16149953b4557beb72117647968e8f12874e - -Len = 98440 -Msg = f34105a04a4a02a1a07e020a6a4f4176e9c92bf40018ccac434988c650550c87625b84bd232d0e5ec20e6f6c46ba061b22a7fe36098bc7bf031ec6d6c1214bdb2d9fc4d7467331182b0ad81c756a3ab1ca734559b065cbf39ea3339859b76fc47e952eb65a24521902faa4e3a067c67e0cb66a269cafc2923c6137d6c11e5e887ac62821084959a770673b896fba93cb0ef7d462757193e204de3b56a05e026f4bb91be2f8e82d0b9dd805d6896a88dff8beebd8e5b1262c1fa4a5e19f8041c319f670bfd10cb88db0d56a92977f8c04f394174f927963b7b53bdf3f668a05ca0b068d813cbae174d2e6d2844002898027ffc08e24d032cded294f389c8735ce4a70dcf0e0fc900a2a94a5752dfa669cbb894e5e44bf7bb4eff85f94e97cb915fdbcc3d366d9ad95e1664b2d066f0ba0d7ba29879a4c26b5e42f761af77379e74d73acf3755a215e1ee52c74726a60d4a519b9d1cd821b18f457fb936b735c8e621cfe19b685d2ad0a97b01219f14c7f4a2e67048666422546f758c8f0854c51633f210bd064a9cacd0640cea40fbaebf18199e76c0283240397f47e2cb0317779657d926cff8efc8eba4271bbc98f5ec09bb843285dc75c52c03780c7fcf149cb157a75325c6a8c753a20c30529b421df032de0617ff4165cf889956a71750f82d7807ec98523c2ab0e408c2b36117c77415f86c071f49a48ca5284bd18a511c533f773da82a3e658be0c94d4f88eb6b0deb5fdec3aad303fbbfa1667f86996bdb2471d0c59d040a3d2eaa3a9781419b161990c8ee209206955e9131119aae891dbd84408149418b5d3448052bd89eba352727d4e72efb1ed1f884362844e4d6a3612b076bbd6b5b64981f476cfd775ad3aa716d3f1462cf4a13d6d03403f0e704c5e28fc547e60cdba09c7bdb7e4fff89fa2a0c667f8d9a564715b9b556372caa4227545e9736122b044c1d17c9ad1ac0ccae2cedcec0029ef8dd3d3cca4c3a1c7c75ff7819f00deb29aa95726df32f00687a694590ae9a7caf79e53ace9471c3bb6aebb25e98529497349fabe9d6cec1741b2c0e53adc487e1984c2fd1948648a562a38dc39372afb3767604bbbc5c9c660cff989642034925a4cc8c81e0ca03b0e9b17ae775f0a534ecc31d52186af9b4cc5e74c70fe928e21c00e14dfdcf9d748c8ffa38b45f0d620401665b7f6c51f6e5c333646be8afbd8a63ce944ff97e56b7a99c45e31050e158bb601655f34d92c5c854fcfa84660e6c7fa4f35bfa1eddf798d18d66b71829674bbb413072352ef8c84a0f103eb45b3ebee4f9a6240780b8d82a7dc3a5bba09c4ca83a937bb1020b5d9309519a432a7d9c3f05b319b0d597e207a59e8eb3fd8438e780f37249d259f2c07a43097b02a5b1f3b6174db343013109833bb4b9869b9ac9a2d4f85816812242e0491ec46a437ab3692732775f815fa0954fca04d26eecff1ebc706424fd669ac9f84cc7d7d360eebd775a8591a4d85d6a2f215e776aa9d8632e6d16a44b2a4895b505fdc1d20f06219c48567fc805a0607e7cfedc0b4be60e8f60b81ae707dce223fccebecbdfba23ea6e728077921a16a21f9e76ed5db87f73ddf0df5d69b82db973c3253d5d5b32f64f622a3ff81b0b2e9b95de7d59c044504739880ada7ad6ea1d63ab82f269dd545d9df39d9223ac98737d8937ca8debc92efa9b9bc4857c2a5c38a849497681793b9e72fd0ad4796439de0da91a81d43317cc907cd2789c1eb2aaa20cccf1ddc94bdc0efaccae0016510fb24de43cac127427ed2a6eb4b52ba3423f29f77c40e920ef4df35200bf234bab3d92922ec20bd685383103da35d5c087c64d5376394d3d30b693258d251f9c38f613bec8b473b16cd80d3c59bcb17d03ddd35b60456a0358bf46d193d06fd531724dc4aaf1ee9767632b72a3a8234b1efc5889dae3c405cfee7ac0c53fa8590d48bd3e4618d0eadd5018415886bfad5198396936a2efd6febacb8d91c13dca54dfcea61a87cf4e67256012d8e6eb364438127413f141d97dbaa5927a03a49b80ae0e76a8dd3e147d697f71b5374a585f526034f35d6e9fb5549569ee85813f294a093a6177a1ef8882e2f86df631a61b8daf164545ca9c4e1f179e7fb53837a72a2b6be4e59f32210816e173b2558201305bb28a58ea519070a88aae115e1792c5018593a59a7edf7fa7f766ea0a7e98f0f27452f55242350fc4c8ea38475164b118020e4608480c4ff294a80be51e4b261fe60fa97700943308d3c488a867a564cb8ba5357d004fffa333b7a659d3b076107240f3ecff4690c135cd80e5dccd56b86d18f27d4a0315266f3637fd21313780c3675308a0c48f9a5955cf7433551d5b30aa1b6d87de16f8a1743f33997600ed3413457e8786a600d8fda2f7edd51f2070f90ee24c297b9675223a91aec758c26eb5599336157a711f35d9d56eb5d2a498864b6ff98db98c4490a89bd3dda58cbdcdfe0b1ee95387a69ea291587fde5431c26f5b32736746aa7007b69b018dc8abdda13ac48ae790f988bbb01dbba8bbb74dd9586962fb522120d67676db67f2d364f1a6a962ad49a29473b640c1b847a38917dc10e4fc3b2323a35009d3ca87aee45dd34018fb0e1c327918445a938480f4a95abb61c06e2b18ecd796832c13b8ec44351b16774ae0f31a6aaacea10eca111c58eb720e77c3412171df5213136bdd4360bcd398ac7b56f601d6968723097edf5b038e3cc4666ccfc336d916034247e9ea87e8e59f45ce9a827a5abc7da99e70d5b62ec1e0aecc66202f708b6fc6bc96171ebed49ffaca6670e883978b34e06f5d55dc3468e710833d3bc109b5839be68ae3ddec2ae4fae831b399ceb835f52966650f0aa9b9b9855eee430770e36639ba79be92ccbea09e696e15c8a1273d3d65863fbb4f81280b29b96f1b2e70bc2e2a32e97ef1c28c076c7a7ffbc2733929ef1c06dcb6f7fc83022fad9b4ab60e326ec1d6f736aaed91df5b40fe88c4796d77b8cce56c68a76b9ca3972e522dccc4dc891fa217c275fc16a2f14780756e7673cf2a4bfc6da9434dd7b44ae1328874180b2be5f1c39574c6c4194d361088e387d18796d37182988a1e7d57548ec1ce85ba74596108ccba544121961620792308526d4c8e1eb3e9f5fa6b0a387cf912ca399172f21c9c2b43ac92a8ad1f8fb399e453e388bfcda605edf5aa19979f0f49eafba9017984561958f50b67786d23a0e9d3e25fff305b3e8bb5cd6469341279612b823baa05b949f8b114d1d571e1a1e555cf70377c78043623fa955c58aafd1e9994fd28a0c359ee6f8b78913e7c316952016603029afb8fb8b8490b6d573985de37b26fd602cdbc78a5c8463351c3e8713ebdec732298fafc6cebd0f295b329620117fa260619e5751a5d5ef110ddd50bcdc44e4ebd410a57aeea5778f4fe9bbd778a52113bd2fbdd4f8465e827e3d1ba3525c2e5a9983062e4e10970d3703f5911860218226d5229bbe9d589157a40e51b6ec4e89612ff96b55c617aefbc96bd559784ab385d9ae2f60a38745805b514d6ebdeb80125da7b86b8e9e778483462ba3b446b0c3838817442090a6e2aa0d1fe497ae469555379df831d472b879ad1b5eddba81c61bd9dbd4dc1ebc63d86a507e413fe2d35fd2a2647862a680f2c92ef2bb512c78e9c804779ed790ec2f8f67a685455fb3c3a0501828f01bc538c1ebc716b1bbc0357e19942f632966f5a5ecc32969c21cc8c82e7a0c25da6d91bedb45b68235854623a295586b8fb773d3683cf65215f8b773c5f3ebaaea6146e884d5636da3b165de27e1df97cbc9f142627bb4a8602ed8c89bec8c26538a9e6670dde4190c2bdad731e08c8ee482b71962e72b15a9a673f03acbb8421ecfe36127c7023078dbed3747fa29f9e2cc0c81f0e8223ffa48d0122af937a652175b002ff98557f0a9e626f2977c7fce8e3aa295e663ce5afc3757f1dfd1f9f74c506c12dd35387a7d0ccbb91f4fc9afb087a3d849b46bd2aaefe719e44ee4165508cc58d9d97b213fa84f24fa687e8d193cad427adebe683a41e92a6f750eb51acc4987573bc8ead702d9bb908f4770b3a0e75adfa96e26947585aaea0f20df83e30b29be21c5df2d6292074a8ecc6165fd7aa8e1dc2414a0d3e523bce4c199789739c576541d072a10a28f8e2cb46717998db4e841873947a22e1c4dbc9aede12efce4e79c766ab45330dbc530a88bb1be49075d9e409d6f2c8b1e055f52e2a6f17b0d79c07911b475647458634fd41cb2d628a6bcf64801b722b04c959280af28dfc8948acd0313bc67e1ad8d524a3ebd5b9f2d635243e68c1b5a8a2502d0e41b4f9da0c01a48b77161aa2e7658f5002900f5595afb9504f39fa427d849d92e11f415052b0ae98adb795842e50ade4a3cefb1916b9a464533d6178b7610a47354f5b72b9343ed7344d87250a3100c05404d5b3f5cd75f9096e73a1ec7fe379d2a7b0c7ac06d5c59f2a680c2791187177b457bcaf659e6cc62fa954992bc9c92dcae9b5b79313f262e0a0bff2cb5586a36fc9a9a01c9e6e3e039b172a1f1db3cb1b5ec3487379dc1402c9a6f87a586e5b89d3f1745ce64bc58ca1503ba46fa81f3b9876eb3267e127035b57a5189196f4b4ef3a98a116a3f12d54962a663034be8e1f572c3a6ea01064de48851081af235373db8973aff545583d6f92deffd81da56bda77f61ea76499bb00150cb9055bf82a5ac35f02ce36bfb432e1693f10b0f3f6774b1fc85598248a04d167a83803154b3ed2cdbf8d49a66186b2bf6e6d1d0c57b431f22c492fa7b3dd46bbcfb5ad3d8f0e344a46b0f2becde1732c1e4ba6410827b9279ad09f65d0dff173901cdec33e3f644f38d7d66b41c99f49bf4b015470483d2a94ba7c1169a34e19a9cc1c690158ff66f670492e75a5b392d1c9b299387c5a75ba352a2cd6cdc9387d51ca7150c1420c1008df8ac21c4c81e6661e91b95a8d937bff3e0ab0960f3a7b3c7d8ea52ef8b916001e12cf73c6b17daeb9d08b5942fe4a673c4d7fb26caa33eaaa1386f86ff869046938f672be8c07f218d8170f1730b60b89679ca98df227ead4927e9434448974657fcf6f908c05deb00af4c286b53f6ac9ebbfc1dfccd7cb91ade4a8d21807de7749b2e0f93c07c3240b9d39fe0656f3623c31b1ce74c3fb45a8619cb5fd64b13349596d35167e5dc93c88dbf99e8d33d6fb9afff6946cf885246df67c6f108b1dd12b6ae0a5e9fd3420401f060852aabc8c63e2d4a64351b4a4723c81e7abca9b8391709854cb2fd9494b79bfbe47d677712520e524d78578ab06d562f186fe30d33404a8bda2744d3a1372633acd359c3c4720a49a9a02259aa4679c1742a462428b9dbe4b0058f45520afbd0853569f6042789f622b666015d34999b35f4bc443f0b22587554c534d0b7809a19aa7f57fcf7f3225ec00ac8f0c11e8604d62db6a0bd89afd11cd0e642c61f590d3a832dd16db09505c9f6f78c75704a89d77fc3745776b06e6697a4d1bf3fd40ced5dc1ae0e2817c0d612d558d7f7af6bff9bb1e3625324f13902b5a52b47d4bcccf55bb964c47037f146ac7d6f1c7d535669c8146587d3059ef963e592a121c5de33421af6ea6711217ac222c5457be8e5d15230e87a85509c64f4ba7ab483d02c00c0fa4c03c6f66f96617062dc72d3b3bc955e7394027a3b2bb14b6de8c285bc421b81ef785390e182cf8fcd472abbc810dac78f3d112c8337e2c1f2a5a58b98e39cd666afd784822654a68ef06b492db76992c3dd7c0e7d6ecf439253f58bc8c98b223912197d576a3add2e3dfd25e9978ae898dc09c730b9bffad35a7a2c52de308cf108e3216a37c75d3498a7f6049a85f195a28100a501fc0d4023fc174008d23d15f8fb18c273454e2868326487a7a1d44297ab60e22ccca55e1443f39a31bb5c2d4c2a0b6708fad89314671979a528ba27245190f12378eab796166966403112c16b38a262dc2f21fb060bbae27e60cacdaf3937dacf4703d2123f21ae1d7d875abded84bad92b54eba5e9f2cb19922dbba22cfea317831937ee84c279b0e7e27faa115a77e63897e859c8663b5e050a7963f28d56e272536f94aef5d0e1b64cb99a6bcba2ea9c127c8a6fc13a35038a905c538bfa1a5eda016a8561ba9834ec8ff5c48041cfa0ef2ea0a7a9d086d2d587f317a098a68dd575dad0af3fbda7eb8923e4205f7c8c53860338c60639bb12e6920575376e486d544a5986673858702f8c935401d9a8680d1ceac2e336066a36a0e7b2df5ad6ca2424e68f3bf18fa40a9999c431ce3b564a5185426f65fb04fd8583ff9852811370cf4071c2d094aea1b0bd17f6438f45c60bd0f1b3afe209c6a8a1026b3e8f71bdb32fd504beaeb77c3bc8f65920ea5c07b39474b6fa02a016730b665f06490b95387a630aa126e724a08308604d95c397af99768130a4f2774d88d17d92f70a7fc6ebc2db6344652049b3f615b2d8a3fe69a79d1a371026709edfeccccae19504c5489b7fea505af89c23678038fa24c24786918bf98e658acfd95e54974ed5aa9d5a95ff2092ed35039a04a8c5456d6db3fdfbdc5c66d74b463ecf1ddf88f1fcb6e95962eb52475ee5df759542ffa78714d683134adfa33d6cd6e9308cd5127f79bd8eb035d78ffba9bb614f9871f996d2d7d03aaa42f2e8a9685194847e60bd4c9dddf2e56aee95b9f670dfade38c2455c98b5863d7ebd366beb251b1ca023d9852ee2fe3538cb37c584b4c6b9d87b804735b765fe6b786099eb270f9032187c6a5686f17da90dd5aa99a9eb9e613db499fe99b85b77d89fcd1f9f8466fe4243c5bf4ba6947239bbbb004dd7e0858138b13ddcfbd926665a51f30f17f58749b643f3919c1e16c7607363212a4497deb3398de1aefbe9aa16e4fff638c04f874a518e09307f194f5a603cc4512f2abe8a7f69485038440c5be2b0d5755bc993866ad903123bfc2a101df797cb04a099450f5a817e22c8059fc7903d4c1c77f6e11c7f2fafd931f007e92e1c1669bc076965dc2d972fe83e6920288e3ba6fd19e0d2eadf67db5d39c86e3ad1b1c2bf716e2f589d19c4171f4e78e458b28fab850c2aa6a2d8c6c05fd829b8593ba44d7fd9a86a609493f720963e5e2d4f1b15b0d9803d1a81002dda9d882102f282c88b228d8c0895f3eacaf6ece06c6fedce35cf700896ef2bd842af260f7f94e2b31bdf2b38057c8874a6d7012596a37c377c6476b3b871be6220836fde1f9158bfaa762df8e7d6a6272cbd17985c784ad40d2f00a8efc72c4dec90e21773663920cf7de2391032f164d52f9cb2fe5cee465085aa62bd4dea1e1f7e19361b8228a8f35d04932effded028951d001cdfbae0ff0ed06b91749c35319161c468738b9aaea9f17184bbe2db9f93f50a386f554661312f4e1cd9a735bb81784cfac8f68869db356eb1f591f9c282c12bd18a21d91f82f364bffb9f9215b4b93a32e0dde4bd674cd5571b60bd0a081dff68cec53b927ae959eb58d9dce8a1a106b159c65201d4a46fc4bbd3980e9a47ff6e9ba3c0529f5d983f500a78aceecc5ce6923432dfb9d8788b456f0d289ffba6637f3229e856ecaa1c9f95e7cad2978753389c19bf7d55aa2b5697aee0af858ee7f814babc37f2fa138610ccdb139f2077bb827929a5a85f254de1dfdf4f92035c84b00556c92d22a4a1ef7a46285fb2d4797bd396a94d01f9b9d2227cd69dbe41a3988c4070e79e50819672a47735b8fa10ecab9f1ec05d2928ed1931fb051a27d332d1f1c5bed79793aa687e86cd9d49005983ab7c8eab2409a716a71364a18fa21358f33e1f68fa66afbe2cdd93ea41d646de343914968ada74cd34c628eee98ebe93bd5075bcf958fad637f2052a94e1392dc1db0e89be19ea8f7379ee4cb607a914c8937e6e05092053485abdd882dfb4f4ecd8b8ff4e568cefeba52165758b475e9d8d95d6bdf5c4b7a67e0a7ecc202eb61db8c081ac0eb060f5de4ea3b8a82dc3b4953891748d4c760ae29777b1411b03cd01a1ab77a119752a9bd291ffecd1069640e328d95e1c00be1ed17dd2b11e408349c8c701cc1cbf025459baabb7b579cb1722075ce6d80a688934dbb0fe8d0ec8d7c27eface3e8115ae40785c975fafcb9e81a76f95f4d572b85e2bdc980bc116521b3dc355e37dcce03365830a440b003d6ea38209f7046532a9e8a5fbff09e43f3f8debc1c007a0b08f1caf8ef73e117a556644a14319d87ea48cbdc8fb3bcb05abd9e4b048b13995dfe832a3dd9b67ebe27a280a8d781502daa2745d74f9333beccc4e9fe1fcefe68252cce78bc58bf872499c942ac1c355b8a47a47f0a4a5487ebf79ff205d3c493306dea8762ee626a17f22dcaf696bedcb1d2006e2d0a9b1de3df74c8864b7245e5ed885214a1f0cec654b429fe177319e771628efffa91e97b257068e85e91e50e55afc11999f01bfb6867450cc6dd78f3ccd1c6ca43bd517d719bbb7333a8dd714c68bcbbfdeab87cd64d0767cb83629f8a55fed40ca7beaf6afea771f33f94d77bba2b40f5660f11456e57594fed40b154f61e677ed899dbb9a01528c5df720789adf6f1abed87845dd31e287aa478f2d1bd0fc9c1d748c70689eee1d20edfcb1f4905164406889cc783421d732f742aaab1b742fc2c353cf8c218e4415743e9e59740f7eb3a7a202b86ad8063169a2186dbff1c5760c60137527d793b3f062a829e90dbc610c6d930e5459971e2549e0e41cf9dfbfa65e06c4104e8e85090569f66db0cfd10d28f7fa7f4afc61a096beaed100f1082799f3f9894786f114a35e3f80bd0b9c20709c0d4a10c8946204ec1e7a8b8bd816a07575e1773f90a9a8ef75b067022afcd119a7534f6e3ef03103b3581e12b7e9fe05d9b741fadc4e92b8297b6335f5e8d6db59194b6fc9c197901e182d1820182f2f85793c5b4c6a0d22db501639957ade6ba30ab94fbd5ca50bbf392d2e9927a04d19b5cac3598254ca0bcd146f7239744515a60d708227e5f11719b2a88baefe08f6eb71e59c3e26182b40d26a249b14f21189bc94d0c9d6ca96584228800494cdbd98c6148ce3dd87ca69d49c15165cfd37144b0ef1a8f402ed6350211edf1115de3c3be2941a07b359969f87dc41a8b0e6e44d519d5bda346cd95124a084df7bc94447d24a572105695587afe29374c7b168180f1c38d5c99518e9a5cd9c6c5a1f4f7e663811b6086a254196b0826dac271e4f99f6e6835d06a07e16fe8c545b30cc4410b5d03336ec9451becea4efd8a8755874c5eb7f49320e930a9beb03d9be394d547c19251b51111c9ab55177d7b61bd732019e062897c1acf35e2f07600814deb3d3630810483a16bcdd4e9213e06020642294d475b85830639dceeb88befd9cb1543458c0325dd497dec2cb27b7e0e85db16646bb1440c1dde3511cae4341ebdf871393b5901adaae12748f9d9d2c73b12668f9531bf9e5b4b74c076b25806090e477454af1ffad8210ca6bb0109176f10a3358f86001f09a92165829d6478f67e4d5e9fac85aa196623acc39b2be568fc54bd1f560f796f1fc467b74f5f5bcd710b5fe6f93da7b6d8f5c3d84e41186fff02910e4af292d5d6e62edd6d5199d70e0ae0ef3d4fd7f79e0953c1c2519acc4134182309b35483f50e22bca24319597ed1478321c12423e1e7c547a06652c7e972ba283c5aa5c0a5c5ab1b933bc39ee8e8fe6a4d9d7584c8187f32908528a82045dfe38aed6fd60e9231c4eb447fed75d86b6c68ebb1607c23eb4a39b804b60d33ef1e9c76990b57fd1c7d5063358d4c28f8511ab1c200249070564406ce3ad9c6529f19fc0ba8a98ed40f6ba2cdc797600ce00df98face9e8752058786e7cab86712faa88adf42bcec142e3082fe37b090ee2e6ca00abf3b2646e1e14cdc4acfab295f721673906444bdd609d442922aa6820502dfd476976a4093ee4d15a03aa7e9ba7cf21bd6179dbaa8c6af2e0b4cb815ff1286ec673bd9db95ff06385da1e3e07629ac3ca65f3d76f0c76225258f4c16a71c63b713b0db745293e6c8f56df58a2d28b35a6393ca9f58bcabdc537ae9008790c4d90e6f15a7746d9d2bea17436349da95f9907dcb704af6ca98279805600b1048a6b9feeee155bc67f5be3653e856bfd29edf4596b642066d0d145f37b1bc0b5db498c8edbe8130e59ad433bda5ce58d7ce82a3d2cdc87c018f9c38e67214f272874d55889b813ba4afeea7d7182b2633ed4d10f61358c806b441dd983da05635a32a3d4614d06d2399400b36ac07b8759f710587437d6b0b0f8785c350d8b7057cc1e8bc96e925c0db9ac652fdce8ffb39a109fccaa0e57cf5effa0e6848856098a6d042ae55f62b0b2161c279ea0d53604f96cd156db7eafbed72cff05a51e57b3b9c7ed7816eb09ca675fbad04c11c97ff248eb03e62c3a602b88e6598acf2891295d78f05f000048c7b7503893b9535123b98278d769578b213d0548de71666ae64d3514e1a87d735dab51a01ed7bec3b549fe7e553dee89e1d2c399490df887171f8aae45eb689552c325ce9572f11dd080c7dd08b1e8a094cf871675a9c630e55ce18432d1a9f4cd87358a9e93d4a79be5455d99cc2b1962bdbb850750b8ac788ba160516329d8f780e79ee4414fa93f00e1c5b097a03c7222c6afaa07b645f73432084aa8ce8bf835a4d00d844a6ae45901dff4182f50ed89105c04d8a8418ae0fc44c4a88154f72ed5eac264ad33b0790f710e59c19ffa770153bdca76e95b1567de686c2b7a1cf4e0b2aaea604ccee77144a5623c6fc276015e7ee508858f5edb9cddfbb246910e2ff16e1d4bfd642b912062398a096d0d7843ef32465d5140c048cb5e00007b04286eb506578e9bced5cdede891b522c5cecbb7b819b8c7457ea8dc9bfbf0055f35f328ab6a469a57a712ed773bba09246bbe7e8067e019f47d85b6bc8d5d54a6bd466f166d6e8a4e6eb80bec6e624bb4b7e4ee901a1b70d525a601c89d9193612830314f494e923b9188ee5114f310fd1b05adf218b2f471dfd566c812d2e819dd79165ce42edba77a473ead14b67f86fde863ae4bedcc4f11d88cc3d6697b5446e9c84728568c1a90c0a50956f3c1d7c656b9ca991321f825781dc1d09e759dca48ec18fc0dce1a3bbac96cc2f2fd78df175650ec6e1af2817dbecbe8b8fe79d15d2dd5479dc931e3fc52de40fa5cf2aef3e4472b44e0c78faf19e706013d72c3f13088f34ca4e6f04fe968b85406cb9db208b83ede9afeb5d6d62012bf5b0f09cca038e76388c1ca7b36101249228e131b6caa0c8471205db99d7bf43b80d809b623ee0b299c4bda48e0e0361fd9c078f7b8257f7d8db4ee21140295bdd2562c7761b147e8090b867e90e00c1e52eb330e94327e131542d0d6e6bcdb8c7c10dad6048983e6f68a37e4ed177d90b696ae28a6d7f28c31536aa0b9b1aff2a48f7c9db17ea76d8c4e5643a08d6fbb2c4a500d991ec1310b6e264736eafa357359789212999bc3f2e14963504acbe9dd8e8184130fd44ac81b6b92046ea29e10f8387ecfe1473051cb7a0ca6577a60f0eaa957bcb1131f93e2a24acb459175a3f42228905f94fed1924f0649bb63688ee6304c3e0c66f7924c31373578ad0256d3a05afc19687399c03218e37e6d4bdf0b7f2c3e28b61cede08121e80ee08c4f1f19dabb19add9d2dc8a0c19a9824f0ae0fcbe670ee9d4cd26fad08c0f105db65ff57176674976a36fbfa8954289be38ee10cc5ec5e9685aa7040cca8427bbb41c9be7d5092693350039b5ff5469de90bb231cce559c20bbea089c4a740cef71dd75047f092a77b0175ffafee40cf83bd19e785dc7ec4319786c49b3e7a741142aea901d6e3f6c3b3d9b413bfc595360b8e7a6b322c01b9bd79adbade5e0f8c58b625256414cb8fef854505ea3383928f6686e796effee6a91f81ae2779f5eae894513d38938a422d3f3f00ee291f0bb15889a57b39305ad2ef0cdf7a4ccb9f4abfc9b3b4eed78cf53dee9f3c04cc1409daef0f4fa63a88d34e9be97754f52c27aedb23799527c2c027e03b64552f4df14443af94a571e322d4bb368f010713e7d81206f714ff862673b06ff7989d1c204b13e0dac57b1c3a07d75121ff85e903c20ac8adecc33980a7eb97565daa00ef45dc5d9274ba76816e9cc3e0aed60e13f332031e8b176f774ade5c1102da8ee6db09605c31b494b16f67f94b8d8c0590f20420b98e609a72c32528b826b3288f6127b3888b0df91280c58bb31a2c71f3351dbc1f55434cfba73c87ac47a860417eb3a1a7ff0b165d4931d5c7d31ba5c332cb2fa07e13f98a7da0f36dd44ec8b58a39c54afc406eda3f3971ea56fe437981b915fd77671297acdee68d5b0ac4542a2698e211428511c958eaab0438cd9e8853e976cfc13abbbb62fb8b5a50d595c50696fdbc95dbac8dfcaa7a694f969aed2824bcf596d45f3fc98cd840d58ef2e1663a0e7c9ee502d3a12be8f4c74106f6925230677c720a907f2504acfd631415a21c94dfe233ad50f2f97745245f6b5b4efc61b3c6963653f04e80fd3cc451c856991134f43a148c4ead95c8eb442071aa8dd15929a37af0c983edc018553480004a043a398ac0cc3092c50e8091dee03170ffd60a4c410d674f9b84148844b32ba9fe4e46884ab72543a57488baef1d70505da8ecd310f0561c2ac7b5cffaf825236fff9fc50ad3b95a87996831e98ff3a67b4035ea735012741bf970aedfb5a960c9bca9c3998859221beba39946be17edc94a99e4d08328e1df97d9a76b8214ccac03f8f67f6b7144b2f9cf539f3e6990c8167d74c12015eff621554c16d3e3d1776401f014e3be3ced325ff34b77652a083254fcbdbd45e8e03487ff7a21b319cc6b5922f2978c753b33b9eae3ffa7240a2cb50f3e9145773e3fc653fe01ff001b786311b0ed68882d5c71ccf14d8c293e74220ebc62a12550a1a4cc2adb241ed529b44ea85bded0243b2bfbebd7a0742597007dcfa7c54dd818b7da8943ced089edc13c71695c07c05e2d0a4c2460cf4003e4fee0b74e8b34f3540181a25bdfba332e5d84ac6c797214196a8aca69852e5943e488379957e7c02dd3ac9d6766e69830445a8b8cbfca1b65bf3020172040f5b1e13eaf222e611d99b3728b5e308f9b9b637b9d493528c2865ac4cbf63b186793576c649589515a1c337bf2bcb725aba44d60380e942eb81fefc1347330153d8cc9aa1e5ff3090449d6117a1f5549470f64910259374c5a86c0bdd03aa9e7d5e2aa7022edf628ba971deb77d2a54b0c113b9682c5a8f2285f700355a8f2d0cf599c4728cbfd00cb887d62728321db597e54d91fb063c0b00e904a0b4ac5909845f19786768251e592670f00bd555abd9b22e15fc5f228601883ea879c7c77bf3c5cf9c27a307c67498d4998ddba59a6fc3837c962cea9e701ed7d412a9226a2a130e6634361f0ef1232baa150bb48b4060754c30373b5835f1f6ace51a10df1091fd5ff7e914fdb8109dac0d2e2b8536d02c0f3446bebe3849c4b95be239e08f87c50ed6868e9bb2a75126dc0cb191385dcf4c09221ad762706982ddc847788e3c8dfb3ad337f1c52f70a0ea6defb62f4d868c1793f8ab99ad0c90d195dfacf6f97eaf8c9ab406daf221a29f198cfc01e97b56c6610043c647d569a011ab86ad06c0b132a1b0e3da368db563d7316b9779d3327e53d9a6d287ed97b304530d9cab7a8996b1d18eab44db609e71860cd945b9a8a7322cdca3b57ca271367f49ab30d5c01e91bf113764342cb8ad32e6af945341a9c6a0ee2319a910416fd643c3dcf8dd340b237464ddc0a01954de0102b0c984ecd7dee338fa9d6b8d760002caf80b683fe5a5bd1cf9a644292e3166b8df44fad92d8dc3cca2803abc14a68eaacc38eaa7e8ecf646fe0fa05102d41cbb6aec29d68f5697c6577906361170f049a0a5ead3dca126ca35223df79a6e2bf199e89b4cc7e1660e62b0566235052f91bc7af02d896b5690e608a285bca89c44b361d8a49bd5388c0b4eb2aa470e536867e0841cb6f38d7f59e85761312a769b027e6644d4db1528997ba275113265b8ebff2f082de1d381d5ebe5f5c09bc1ddcc68cf963a9a06ca565eaf2c591a6c688efe7859b4dc307da439d3a733a486f45a469b0094bb125a88206035e86d70609905e878148cad5c0cf9a9e151ecccc7f44150ecace542c078e83ef986d47a88543e05cb159a51045654f00ae11c9b3ee18178c148c19de46edfd0e0faf790c806cf5abb7eae255ec9712f89acdbfb416b2d9ae731f62baeb12d9e530e7dbd08f8e06cb1196f2f52af79eec87ad2f5b8d86d3fc62f2df4078bf930b8880f0630739ac513ac8679c94e93b52e12a8908b716beec6090e01d5426b0f7831547528bd24ec4a009a0ba9f0e80d233e06d5a37e4c2f4f894059021fadc2fcd1f511d81ea769bfdd54ebdcdb9f7d0fc494cae6473b8ac9756c04746ae4d1ab3099e228e04bc5d90a5c234857e18e5b6df9793d135e889c96390b156b3bc5ec15e9f1014a3787ff5159bbd7aed6c66d01deea902cddb030b45075cb6ad824294a8c4549a394379b78f4b97026a5b0ae48ea24c8d8e18bed97584a80aee379c9952be6ea34895d1448d427fa0977d1860ac62fcb60929f3c06fa921b80854934bf6eddca453f82d289a10c5f9d73b35e0e1913830c177783cade568428e51ed190fc31d31dde2d3d030571862bc2dd9c1d8cd8d72399982babab9ea3ee2d7f0acf7eeaeb068de7bd7da65d57fa8bd7aaffc787aeef3f8c9d710a70601982f546469b11fc467437bac12cd8ba54f72aee7c7128f2b632da40e4a2d6a3f30e07eebbfcaded26bca59c9540eb977f2e5dd25b32c18ac1990a7bcc1cd754c2f93d68f749c6a6ee8db9cbc28a9cd6c457f8bc66b45c5e589da4b8f01f7b5bcf6b1f1dc229650fe60efcaf10b1f55f6b9a8316639c0056c266315e1954cba0628b3675e34490105668f5b0465efe1abc2087471b95b65a491b39d50f62ce0bc38109d92443529185c22d372e38bef0ff118cb75645855233e442849af38d85397620af4bceb07abc452aaa8ee83dc77b9518cedc547526c9ead6d582ac0ef40d920460218cb4b3431976732f15838979d2b5f4746b8ebe53557c2f8e375b4288fc3c556e266524626599f8d968991c41f3ea91e832d902194dbdfa883c7c55efdd50f5fa43cbb6615119a35388866a1b1e3f0dfe505ddb62f91f9f366277178d5cc9a78c8cef4f870780db671f52594f7c3dd07f6e222f78812c846052566ea9a22ed5eea9d8d81dac5507dbd206d324346b42323331e8a10e6c12d0b421448ad607e6e6418e3a6b6b2191784ba8bfe36e52cce14891ec26c866b14d2fde807921dd423dfc1a5bb96a6be006324304d55478d452544a254fd6a2ca9e6b970abeab3651bb8483254fd1bb5c4d2edc8c3f0b67c44e0065796360a8c38c1153caa19b9d7a277ed17f74c9996d14e87d3e6cbea7029df4e9d2ac900106dfc91ba86a1997284a950d50727a8e7b25082d02a393bef807d7de17708c34f95f3af68c604faec0ed6f3e828f0b21ee4635f5c02bb2360c54514d30f87cc906d30dec5ecc6369abd6b46cfc14a4db2e4017db604d4497a84b0c3d048c89489405e90506f67d5051ce0d9fa6496f43a3db57eacb51716733b6adb67d73db3a0abb774a6c26c6ec1a9c22e0687591e1b6de9d27e77f6030155bdfc082f79927d2be5fc278a465c46f0a9a362ae1353dcd13909c9d1e3a79b5024864fc5eeb9553d6487513b78361b6de1daad4d681e05240d950d67826cb7d7590a9d1f1fa0ef5cada6c23a9484959e155434e9a9d51ab2e204b78d34dadd47b6098eaf8ee192064beae91c0db06bedbe7098075b21842a50c966c78d7a722db60372fbbef3f3c6a9c43464565204f947e0453b1e8be7d6d45389bafeb41d05e379088812306b1a51b34297f0d1d72d3c03dad9566cac64d7439ecc0b10444cc8dabde94b5f9e8dde48821b8fc87916255bb786855c4840e41a246f25277e7ed0c8e173acb9d47da9f47183659e51307e6869a73dc341e78537a938ef62321885a431dbc8e7c3763f37af5434dc0608b1ba7fdfe24a3fe5353c9badcc48e5b671fd2d662251d21428828a025009fe0b59b25875055998b67e897a324e542fb5004412c73b8086b3d07590024990afb4f0f0822b3969c2d7cbbed36ae81c76b0cb09a063971c67f1d1815ff8a4189191f1e59b56d0f364c5973d25bc1bfa31163cde54bfa76dec3a96265849d1fa5a2ef711f27c7e9ee50c7b94ffaa7c760571c0028e5ffefd8a1ab8e5078a75ce5fe85af6262094c4ca28e356bfba6c285a401f36dbb90053d80e943dfc1ee1fd295a9812a4d7b5fd9a8768e2e4607d89b5fd84ebbb5f4df93c72d2a1948bb91f2cf258f80d0654b1ccb476da0c3123029f26ab81bbb75a765e03deb06f555d9d015c0806bd30e379e73c879ca5b0ef3b7c47fda93b559823832e12daeb10621f1cd41fdf43ebf4ce509c25bb3f44548ce3ddf5c2e8be99a9625e3981a62148edf6171ad22f9c0b27bf3fdba6377fd58f5c551e5f1266d1706210ad551f1c84a21371839fded5990e89b413fe3cd7f4ab4c49e1de66c2d21118e1d8c5b476a7d3fb9fe488d00d20eb26756923adc134793a28eae144670de3dd4e564414a424ec14dea83db1b725663c1035a708e00771bc7e93d839c8079155b2a060ae497e6305da591ee27828d8210113f8eca9001d39c77753c57a3181e8cb31abefcb36d1450f81cce0a4ade98bc49eb9b77090e438700fb465d22e4e2cd4a47667adc0af38ea8c984ae126f2c2d70039f7fb4c5f4f14b7aa9984504e887b53508455be5577f804217f92268c6ca5132a3c9d94f6d4321986eef53a0b823bd8daf477827c78b472f8fd5c1f2effdb31ead3dc0d336e34afd9c4996e2db072af760677af8cc1ac437f52939352d2e5d6fc8c3b07ad83b8e523b9054f0d89dc41a258dab7fed94c00350ddd0580bc318cef943f36cdab1b53f54abd6f2374c539f05a151e5b261033ba8d8cf830e25ace34aa5cfd0c4af866bed826411817b9e2d098cb551a3e9558605047ee0c0bce155c2d18dce1f9cca7f11fd45743d946e6d37341fec49947e8c70482494a8f07fcc69b0749072e04922c504c345f3fe8b079982d6de2bcb45f6f08c0aca4e2a4df24828ce3b45e3cbfd137f24a92b21bda2375e244ed1f4746c8eb879a83bd0146c6622e1fa210c18b80256b1ca6e65cce617b14f64c479d19551b5b756f64c9ce5cc87f7f38cc5f7fa9a71b2d043327f7d4361a04a8bc0251a41690cfd0704ad03803d564e1076326be4b86fe333f09f0cc3585f25ae3337a266bdc2c5 -MD = 095cd23a91a9b7991155c63852ea124e6bf16af401ff3845011a428cfafdcfc2dabb8b6cabeb9ed9b7027126fd7d2cbf603268eacfab776c8ae48586fae3c093 - -Len = 99232 -Msg = c4ff5c87f2dcce57509b470b16e2e41b6b8d23e0d950f554fe9e151a84ca97be536dc43d040725c899e9dec56c523e1766d8939f71094302305318aded21dc17d34726465da073950ef578b46321b7f0067351b544541b51c12af3fa6a7c5513ac5629abe3efdf471689bee1e1997930b228042a3979a5c819ec4e09e4222a3946627673803b9265186b5853cf00ac5ed4bd540737bf0befa061d0e0415c84110933b4a61bceb4777e64ed12169f7703d3fbeb532870724ebf5022896b728b245e908c4d9cee6c05af3c25279cbe03a617aa6e16f3d2046edc82ec0c48ac66f9ab42a66feae4e29813bbaa994ba578cf08928858802ee9d661c0d56fc2513e195912a914eff83fb712a921700a9bfd070e7adf22b7cb490eb4d085bcc0ab3a0ad1c53e449271abeb14cd35b5c0e9bad4912c1b7b80f34b9f3f7aa5fb290083567a260c08bb994dbb81f08c6f57d8d8c1f96ee56cc3ec17106888dd32e7994084bbfcbc6752b64eafc1dacea6b6ae7f53ae09e5fc68ffd6e999c0d46be1be9a1dfe0ef56a4011d54f3c53a462c5b3d61418c5c2335774b0b339ec33adffb7b9a8aa2560186bf20b245b23b6ac6c31068b9f6924197893ccf4b0d2a10129cbc4ad2709a479bca018b58411ab8b936e3640acbfb5b7b3a35337653bc76d4743e3b5dc826a951b65238a20e72b0822b38fbca58d1a14f1ee6c01c2ee4cfc4167404733585a757187542c986be02a01483986f49cfe3818ba40dc2eb5dab3ff7f00eb93521b20a44fd42252666ff919755b26ffb4072c1250f74f1156169c6ad34e29643a569e9e05cbf4b89f837d50821e25309cddf7c5f8b8e3d49aaabe68ab508a0fd6b2f845f1612b31e0c2bf8fb6a90aee1e29a11bfaab1edd493e21e24e2e95faefd835835bbc4e24efd4c6bf5b255da0009333fb9df98b952b79cec10511d38e4c6f5d3f8a07e5fb95629ac6b7b9a7b00bc2b44c2acaaf640704cceb1821ca33b7207961c768791d9a14448e128e6e85075f2cf8e94514b3a786234acf850452f6938fd05a0791f2c691cbfdb6cb3d87bc11a4e6229341e8d1a8dcc571660951d26faa768b0db5e2e18237fdea99991ef28122fe1ddbbe6d4e12fe4348eb5f9a135dcf3aa2a26d55b28e9175f5200cb27057b128214614a8e66b91ae9a3d909381040804e6ed42b3025ee04c20871dabff3a564c78fcca03605c9eedb08324a6e30d5cbca017bb6499992c6cb3f7557167d21b52682468e4868c2be8d2e6a13a031fd44b184761d03fe87dbcf6973a6c70c807223ae776b51ea44387488e91b6a7e3769796a6ba60bcf3dc2430905605e1c422a5366c7dddf14bebb259a27b8498004c89625c507ad761508cab0931a2846d75c1a3dc05c4c72a2d514e4ae80b9e1f5e09c390ab8859dbe2dcad2b51ad1f6c075fcb5e94d268e8104c6fb05fb380e8b200036b51f00b0899fc7f1d408c7b68e168f41bb46f9b2e9c8b04f968e4080252546814cc1cb2917dd5690886a9600a09c2673aec0329a4daf655508b06fc1646ef3bb3a472191d964db214a96a96fa89576ce4c4f6dbf1d176aadb518125cb94b7c3725f5c0755ed4da4683339e4df690d4a41c5b077be8af14ac241be4bca46964a77874043e089be852dac7d1362afce4b78769ac5b20b507e2ee42336bb647316eaa388966872869e8a9a9deb2a6581b5b2601a8f765e7c8e47c019ad44f43570f43c9bc892b18f37a8870334e0920ed11609999bb18b5cc2345f097a1000c6a0bdd9e1a1084dbf98affa16b62b3f5ce7cdfb80b20c98d7611e495963c58f0dee6c02c2e9724e0008c67c3e39b473553ffebe359c2f8fd7b52c0473310caaf2a22940a66777bd39d11594e3842236e020d2d82221c1774304871abdac8c585d031e19f5e4c0a15239c5ca6d601e90e5d471d3ad096b5902975613a19beea1365a70171728f5023289fea64595508a4da10237401bd43cfeb6c27585c7d98d65ef4ac275fbbde8c308e7b1d1eb5f2bfed0ad8a4220a4281ea9f3cad3f9f625d30ad2a17525c05cec00a9727a2af47ce1a89c561be185264ab71099f2f7ed7066f3303c806da76595b76b71a819b683de73f42232231d3c6a29416b4a89657607f18d1bff9c1a0ca6765637c4814e4ade77e077f1b114756747b0c7437906409f4e11c7587ac0580885924b342a63d9c7fe86dcbf5213d627598235458e79d51450e3c7f5cf4251a12c463562dc9e36834e0ed904cdc26993a7e23db88f663e50402ca33c6347ff5ab39b7eb45fa76bf8afa1f629ebc8359379f66804457481396613e497fe786b1c61b8ad947a2580106b67bc9474ce421016e63d91784ca8b909c1116d677d9ccd80c54a69f7c07bb1c987b2ae307b99f0c7db45c8ef96bab7725db22567fd9a5656ecde9b9c2166c5102961dfe678411dd4fd060f74f9c01aea104f29c6a16ea02c53f09232f0483389774f90606c427d85730acfcd1dc1ccb70271e04c101f92492208b580d42ae37c9606276400a5fa2166d971c3abc5b4215a9fb2c0f2b513f782ae6e507613bd30b10e0ebbdc717bf2fdf95b1e4bd5ba72416207ecf1390d7c9b6b25687e0ba9efeeedab2da7aee73e61f4f7a6a4f7c6f0de414796b3b2672194c64091931b8fff752d68810964284eb952ac235f35c0e55ac4da87e028092e954828935d4957a96f55ac81ac9c256a2e99e15c23979097dc73298721a3dbebc8774536869fe93504eedef3355ec6dae853001a99241f4f8dd79a5e1e2cc49f53deff42b3252deb5b7f68a04fb0f3e50e07702569e45354947796d37ecaaf945e02bf7e8ee20c139d90b150a09c94d4c83e99453adf15f01adb86afe9868110126debb3bfde6cf4f1aa21cad02991ef407fe342b41e4e69478cd0ba0967235c96a6eda9ee2137d7805420d8885fd27e9b52b6e380a8e4084211debc83757dc013352b28c2b4530472161640704740c9043f7af14685c11534f2167d02b87783b1a30ff8e39eaac3ee786bcb2fe8c118a1cf9735adbecbd844b8e2c42c39faef9776ffe0fae7225c1c0387416e4b3eb29a8975745e5aec989beaa95ba9ffec4aee3965aaaf98a516253ed36ad476a0e018f67c7901610b9f6010d208221237dddd71a81ca9b71a3b31b1b50e0a73cdea439c150b3ddc0f33bcb3c7943f7bc1f08da830ff914f681167e596f4b74aaf184205a6f1bad2e29dd75aefc7a74174cb2665651a0e6579e1f061dfe584012db13eb999f4214b6b25d88db268036c36b5cf31af37c90334f2f4adf6a918a22eff5e3e54dc1a4f9212e8d47841fa05f1f8b093761c6930818e9a5245081d349c48cb1e41714ce73fae2eb8a91835128cdaf213229297f548fb0ad732ca38c05ed5ace1c67a601a5a3fd3c0adb65b9eefa4bd391b61fb5971826dc427b6134d5cee2a0d4dc1fdf1cb0efe75ede315ae029d388ec9513c64e56beba28b9556e37edb6d2c3d0ccc727a63d85dcf660b4cad0f8c99952a031e8afeabf8c62fa98aace39cc5fe2475a750868902bc09e47fd840e0e2e5b3f7904983d64e404cb24bce4fdf61f8d19f9833be38ec1d9249506b795df222b5c1c10b41932d60b41c2dcc67608793daf24c0c540da158cae1c54e022b50b5f908b9b6810b1b902e8d398e7344bf370918cbc49031abd77955e96923718404447581338b65a23884ad76fcbbb6924c24b61d41bacc9200674cc1a42458177961b0206ba7ca4abe7c26ecff87dc863af4774b6d1a05dc3d5b6f57e84c07907b16609e451d629a8bdf9da37d1ede256941005b2ff80513f51f66b21be5a677712d2d04a834541a0774bda45fc9e5f741d3fc586e9bf4be8f79d8da27355f55c56cc1597e35c9529a052bf68ed019832b711147144cf96675326dd8f28558b1de9cc1a5ae68e8cbad5892a1f17ba1518de5e73208533c920e12ceb3661cb9132485d8f02015da0ca63798ae6f11a5e9d0f5272032f8e6cac2e0a3736a44ab03ffeeac43bc84c69def68e524f2dc4fd45d6a791a7a831f97f9669321e543560ad7a0e5a56afdd507eeb3220b6122c5999b0b8427c83b0e7f1b6a47c3c162e1af14642c1f12c72fd10de2f76ba32c2fc0f1a2f14f0469dc0c90b56764e5e9747b1e0029b89c2bfb83b3bb0b4da242b6d1c9f5679a1655b0c6c10f9a09392039f55e3c8378f07162a6470807b845ac82558ace8f11e647b334143f88bca54e55a53ae2e267f6e18bc1338f92b574b1bad49bf311bb5d870ddef20fda8411bdf3131bb8f08e97c29e5cde19554b179a86d4662c94a1615ce54cc445386a65b339c86a8852f4b95ec5ffb06df88217af0fdf5243c0c9db106307f0aa497489794f4b8d18b3a145fb2633115522625a387d7cc7fe3f3db4e9b196e006b6ac65575e24ee30b99e24e2e97f69977bf4c97df8342d27b605d230f481fa21261ae2948edcf39a0cf23c5b376c20fcac3f4cc6a78ded84d0271f2c5751a8c242c5e67a06fa061d55a577ad38819e4c5d4bcc5ab2116dde33ad8227ff8d51b3b2b55a4fef068e803cc0bc2213464c4f35212f82424816fc879ee26717bd5cba1df2275c7088f38c684af200f14390ccddc85f867fb950a875032935c56933a02c8533e9b2099c09824b0390f901d38dfd4842ae90ec84a8a4e33ed9311a3d2c8675683edd11f3bf31ccd61a54077e583caac2419d6918c5be46099b8557e228d3caada218265f751ed353e629ddf7f642f5c689d0b976c7683572c3e6a98a5abd8ce95f8bd248f5f16b623ba10ca82fb83135cc4f6304764cb661987e979d8ceac406bb5f9c16055199eb63e41bf7ca4667f95342ef2c9a12d4be6375a98384027aebffbc0c326ee667d6a419924e91939ef966d2e555fa6294716cf367a50baeb48072c9ab02f759dc0b4768fa144a48de1d4d26cee65fe20062fb1f5a69e8967cad5eaf00ef6a52007393fad9b1be0c2f4d4f683249913d1f7a58210938e561d95a099594628e78dcf4d2f7ba8db5889a71b5bd97e55819f99fcb22fc7bc8b7d46fbca4edc12a7477774a872210f7642671c84f87227c1f97ba9b4abc985a4273d4bf04957507eddae545d09ba24b47dc35cd468968c4f600b411c0d0f963a7c0725adc14e7ed8c0b2409fdacab7ad9c2a60fca261ff9463c7375adc004ab91c32fd554f07ea3f9141ede34de934dc3e3aad501e4afe3b954e10f381523f9a683f47796b3a1f3dbfcb90e9db7c289ad442a66164e814af54fe5268a56bd168e08aa8ac7e4baa3dbccdfe062c1a0f93eef0f0b2fe9fbf6a2356603ca0b39cbf25a3754120c307ca08b779ba88496641feb3f0c753f86af690f4eef21bd01de7a82851e9db26b46d34169889a870a91f840a4b10fd78b3cf2e48430b7f37c17cd877a2f905ed3c91bf79def5d52654970f7254225397066e4bcf00eb3351240947100d11499d0cc21b4fa181c6d10542f16a906e1ee9ff5e79f7ad33d0b2b1f7648fe4a51e9ca198c806a4afd61717adea81a46697d7eb1a5960ac57ffe2f7e1c155be36ed929760563d5ce28b4f28325b25f4ae56e7761c3a8882e9e9586232de001e493ee55ac346621edc6f1fa36ab3e605a7e4af0cfecdedc54c55999d652afd795eab2b683c09037ecff9df05c195305be5b9753c1c63eee801ad0ce61338cc53d98acb4c252eaff16fa423ebd16fa36bda6e00700f9d3a6f9c5848e8b777eb326c864b833917a61b2e0674b214b3adba084aa74542ea2ed09effd421bc78e8996a063289c264a4607d8957f505f1bdcb01f7f02840db5a9f6c0c150dacac22fd648306ec6b862945e0b534211fba521329fe6195a3d13c4095f5a229029248e2ee953f079f0c835ffa129fc2ec7e192712c68219c67c4248af5501e048bbc8ce5ab55187c76860f32c19f156d6ad618b4ec8c821332d1b3c1a929ae0099901245b5bd4d99f1a40c3f933ef5978d8c99420adaa487474157f5a46f394afbab09943013f6960928136d408d0574d70cfe64acdaf0c04d1cfa700da927ab5812571b43e07d3c671c0b06f015abcbf15d3062fb15cc85ed6a83780d60dfeb58cfe62217aa4953b387de50ca5c5065828716841e12a19fcf34da56cc1bcbd2a4e89cf1d3fcc2a394727394f7ec5d0b339397123d59d8d79a82e75271625228e46863cfa05b50f3b3e4b2199f4d3883ac889d538273d7f3f65a92b325bddcb4bf542206a6515b0db8e58329e8054b95946e0f9013e708bb8dc6c3c30fb5d13fdeb6c1dc0c654bb74a7dce0afd9efd0b944ed411183dd2f904cd62c858d19a91e995279afb2088ba11b57b0504a0b5ac532fd61ebafe9c730677570b279a9d7287fa3e879a087adeb79472622691dd3f7a19fcff20b1d0f239cd8ad4a59743aa60eceded12a78aeae1239c698afbdc8db0142efb74ded53e45d6e36bf950f4001d731c128a851ea83969df6259651a5e9e29545bdb0d131fd39b4b174d4d193e6697b33f2b28a0de676e2494ba58ff79eb5f57687fc7f25d8b22a821c617182ae2619bbc1d1a7655133a5448d65bf3a840bf1d678893dabf1475e4d18e355b8d3ad8bad187e30ad5e4d655c6d4f65eb1454f8fa31efa330f179ce56fcd2f482e1605f9c69109c22682491156ddb1a85da1199563678365133b9d9543aa8e49d71cee40e26516080f969b6e4019153974fd2518ee8eb6d8942982da954ed8c54ef79d786f28924359c8d456cbafa979be0079fe8db91bf45988539eace198245c4d1a87b30503daccbffdb040c8f5d103531f3188113b222c0116c8d18a53cdc9c76b57f722f33730241e64e78b82a70a9d1f9727bd9dc8d33cd5404c71932a5d0c9acf82a7e9c14d9e3d590821d7649c877f1ab2e5c95017e097ee65bfdfa2e0c5afd69ebd6ee0ebd66479ebb17d7181b949a170b34820c09565ba649cc09d1999b056918c09fcd1739aabd864fa3481da8513aa4da1a29605468c902fbd83d131a736a43b427dc81ee8d71662d8176392395aa8db5c3c61d6424c32a15ebdd0349b5e1ff2a1cc987f54e5eed29e81f18b6f5db2860258e8b061e292192bb1de4b95b54adbaf4f093de9bea8dcd5daf16a2e0410751a5df43cac36f8c0adc8c31e9c256c1bf36fe201ac488caa04892cda7f3709d22cb34d212a30acbe6b6a4654b896cfddf594ed72a76ce161b3f86a8168dee6c2c0c2bb08e3b9f53aed003195f1eeb9473e27f039e113f12c6b8e7307f4e1f06f5ff10699e0b71d5cbcf04a8b50167381558eb4fd62230231b2b30e1528286c0190aaf57b28146a4e5fa45adcdcf645b4c233016733865d9813cf05530e9ca5a0dc555157c3b625355e8228309e7676080e7c9f1f5b224a8a134a1e68ad23e272ca58e2d4ba87953c42f47e309c7f50a4c0d355cce2e1102f3c8d22fd0da66aa2e21c709b146d048892612283e0f719b1609fec16d1a9f9ae15fed8b9370e8656ac09c353d952b844d631ddd272c81a5677482da72f644b2f26060a4532417eb7b188a2a5121dfa9697cb77c558d89bbc8c36dd2404f94fdcf80e7e4806299aec78ffd739c6b612a65b99b8039c11e40a27d0c73858504ddb127cfd6bbcad221d89d728b6fd05489dad02683546593c69d080b28934518d54fcb94f565bb45d746d795ec5bff1e4a3126e4e025c9aed0110ae65bf9fe456703f2e3cb0eb289416ab4b410d15642ddf14453313e8bb3df96ec0a983a2f1f25662428c2175f00f2ecbb7983706466c7a3af0df0ff1a4757a731f467d4460a730ed5c0653fff416e256242dea9b7dea9c0cd51a9f803ddcaba53304548d19be2369e674eb941cf15ad3fac6cfdbf2ec6b135dac6b9c6ebcb58f64abb085047e595d479c943950e7bfcaa02c8dce8dbd12d6f05c1a4d1f5bbfb61b023b350a31fa51e746f4f8784139c38027cd7c37a4b7def7f3559b3803f2a4bed29aa4111d2dcd2e3cb3d87c48ef47017e37eed6e883b1d83ac38fa1fa76e0b7e378da028c1b5a84457ae244410add8bfb722b53d29dd9fdf60d30428872f26cfd7be0c6c4ec7f5128f11cb877b10e8664273b97aa2ddeccf2da8703f70e6347e84bbd430ec7c5fdaebf90c1310d615a82fd2789b85d46aff5d39acd8d74b9ae6b917963b1d4b3f09f8c4645b6465e701d9df61043539b0dc6a0738694c97f0b50f51d0df73dd192c302442d4f838d2efdaeb0169537644e2ee81a1852383ac55d1eb0292627a74ce1c7946244ec77fde9d95e82f4322ad9f553956910e674445bb53a9e87bcbe84c3833ecbddaba346aac6063ca96c7418e38bee6315feb4f01161c45662249da32fdf484f62e5996f081cb32bfb0cca72bf352dedaba6833149cb5438ff87cc12ee82bcd81ac5e2e2cb846a39343ab44f53fc58ee1806686fc99bf52ca50cd438c816a14d4e700505bba5354d9b20bb1765857950a548eb125a78ac1a9ddb3c7c8440009546118a42a0281b4f77e36633be7b97fa9a919482c40a83ea301d8c48ecaae09a4acefa0041b4252811ae3e092684bbd43f0cec27cffa8184a3fa4d03c6fc4943a2cfdca667f259beb1a7ca026548ecc6dbde7a6a43f0aed141990614dbdd4478953db89eda89c1fa9ef69286427132b8b832c6b1e79313b751233fe5f3f6d7216c40174f622265c422c41efe86a495921c2e5965848cb71f1abf80ddd6ef0d2770ff7f21c7654b058339f7d0f98b1e3c50fabaefe282a3f2e59652644b6feb70e6a37b7cd0f97da30a7ca46663ced49e9cbf71b5c91edd16fad03ce21b1e7be5195390c847870388ffb6ad278c15c0a147a5072101086f75a194c7bf0ea6c46e5038486df2b6e39aaa0e9b7a3c07e82b9bd3039a51e760f6220a7964ecaccef4d27a2ad3992f27c352adf4c93a4c5625de72ed878364b980c45bdd377ddba25de840be63069ad7ea41ba437b4f8d127859a94e525d2681fdd1af78a189d84793dab28d83009ef9f7bd5e0df84372220a54a1ad62a8d6c0548f2dd40bd74ec57cf0fa1e9c4ee397d10fc1dca7dea290c51781921f2b1b7f6d47fe78db30e32502723df917b912b8627f0a37f2e7c66490e97285f1b09ec5304049ec7b5c3f6e0ca7a6a75a09d365915462a7402885a452149c0f40fd069a85c437b951230ba881d85aafcf06cda546d8f0b3fa67885af5de26b774dcfc065419f066c74defdb4b4d8499dd77a9806951dde3866d768d60903906f512281285889b7b43a19210514e4aeeeb260efee30850bf4d02f8467b71fc832c6a31c5005961802fe89d4f7b23d43563d9a5289a4572d0b7edb68c2ecb98b67fabc028add469fef2eab79eb1134bf6ac59160577506a9d2df8576761e43427579c7c417441dc7df46f8907db67d7ba2e6e089d627061ae15e984dffc06f95f1d070e1a3ee7e1839d3fbb91e1689f0751df23f944ee7f8cd889e4fde7770fe537b21dbbf10fa19a5521f444ab5bcc687d7610200312ebbedfa020c80b7f9d410f65522a7701434984dfdc29228b85621af9771a8924cecc91f6df494e68cbfc0bea5571b605f019923f1c472c3ff37f9031fff0bc6c4f3f5552ca869978c39d9508cd989863d090e70a5ca7b2be3e4647e651a98632979e957e8889d5f9aaac148662a504620a38eb07434f9d518d3fa8e0154dcebdcd71b840c25ae831abb1f02dbda2e14bc79907007a49d34008f319e6f2e57c561a41266120ffbc69eb3590c5869619662e39a1bba99d3ed3d9e903c290787745a69446a9498237e895c05e16648a93fb68a223027751c55225a9cf3a980ea9d298f582dfe6ea43f8cfd8c1e7008537529c5cf39b8c6f4f0417bce317b2aff94519e941cd9e40c7dfc1072101028fedb3f3ed7b4e91fec632d4a9a92085644fe550faec391a8baae695d4e72d11b09d6595df21e52e07112487f8871fba3493fb66afe9ec02d3d65570c77931d5f12fb1a9ba4f260a9118225632e7daf828adcf8290a1aefd2132747c6940d5f8598bdf57046cdbcea4c37469de301be84786a9cd267c46b37ca68ae141a4e31ff19a37c947e0ca2148fa61e984caa8329904d16ff8e37ecdec1ae1c7d80e21f4c04200240a12bcac86a532fead1d497d26108e8f8f3c1cf37976bf55b4e4591fce6c8493d66c781765ac30cfe091c871f7932a5571f0e9cc2ca26db35f8f51482301093c3255c809eef7a085a58eecb71373ebea2868ad010c87330a6178d216c8e7d847a635722a286ecd47847c7cf7829a1a763c0b3039210b58824006a331c40839ddba753f231bfafe3e06c341d84deefe203340391d7417264286a08e421f4a7326f77bf79ccf817a92b2cb03037b59e111977192550c94e373bab059f1e197d049e4b0623c4dec8a6a10fc892014c20971ef050188f268d83c659dcde513d6966e0a7c47ac9c2476eea9bf9dd62110bf67c4644f5e2c7d4dc60ecfb2c7bdef0ebfef487094c4108648047a05cda82d4b1b9df64481c4b98a383daed03ee5c980611d7aa39ace97029daa978aaeb400f5b60222a796c106d6bb7ba2eef3954e347f1c7ca969c1a33118217cf4214a7105607b5342482c4b7b774e13d68dd465713f72b44aa7a51b5cdef3930bcd7468c24091eedb3c0c70bf9341694eb5abf681c9a98c4dfd82e6cb1aa742975b39cd767fcb5c3b1d695ceb38d90c1f1320eaaa46496a7c1261eec6f2c6f35f72a2886744b2052a914cf9468da064114e3e2735ded8b89d8f491a958ed70d2cbbb582ddb8cc516f40bc2e1abb1ddaeb0f0a966ab8e0dd791b43527f1762f8c6de7ca12203a4a9d4d4c1e3ade9d8d477fd8e1f90fde841d85f567ecdb5f01bf582ffce7d4cbf731ff2630049405abb7bc1d1abf0d4794c82028a87c88f08e0814f45f235bba7181944ab6e34e82af8c002db20d3661a663eade753b5ce32ae31ef56f3937ae3018a72a013b608d0f10e69b5687fdb53f7d50876cbdf99f6eece073abbdfaefb953a244ad819c8d5102c9e66693d5aac6710ba3ed78d19dd062042f9306182773bf001b2a5a351c0bce448f60d540bae1eb56c476006766e5fef459c3c601ce05d76b1df639ecb195cfc0f6e3a0e17e0858cc59a4c93d7326103bb2bc626a4be6292ddd9f8505e695a3d9dd5dab1a6ca025f6e3e857c64af74244aacb5f94397b20d2da94e0230361d6f9733d486dff5fef40e3bf109476f01199a29f32220f5b5ae48564cfb6c0b0d5aa89010d5ebe8e2144e9a7a82a5fa6eab54a967e8655fd33fd7e8d985386d92c576f576e6f22b1487d662072ea9d625a22035f995375e74868168dfe6bce6147aa969ee001b47fe154d9b7f56788d8cc6a5d49170c079004defdd456722fdfb3feaf5606c8ec306865c4ecc423da70dde8c8e17c02838df5ac84ff3508f3bafdde1a0b473742796a1aa82d53a1eaa0fb47c6b73ce97237975b5c7d0e92d26981c3572d25bf5fc152fe03f82864320fa0e1e748ee234c336685e4bc67924481fc38e73a26c38c9ebf8a58dbb6dd59035b51ab04e43279f7ffa6ae6bc4a9c29aa9c96ac0df066167fc4a2756838fc832a7117289c3b993fbaf2829d9ba2bc4fa36df224f92da66c3b5b7efe7130df804009bde26110b22c51194d7a49caac4470ff4de3506c21518685e231be9aa70fdf47b6e8830b99edaa377484af0a95907b1a4df2f8f5fe50c809761438c17bb86ff1a742ec74770a2f149ec3b5a99fb92a859a58db1066ee6ab0e1b2c5ec840458d03bf68293730c4677744044f1f149e70add1ddf0581b5d242cc104e62ea7a03ac180e2fafb67a59299d024228b4c8196fbe4aee1b762c6987de38bc6cd4a3d64de691d91267dccff3c21199970fbc277de4e6ef9c6edb9746c031f5526a053a7a4e886a02afbb109b8b762f862baf7bfcf8f9c9ce904bc5491903e35cd62a98fdf7fac9c8b69d84e99f38ee3d2f287cb4a18c66fa0503595692b76dd23d9a569c8befdeaca30d93a7a75fbc0344b0926d88a5ad67f48bbd36d3537afbcadbde20af7091f59e90a59b4af4832292ce25ee554f865f866c57b183e2f420a27796500d83caedd1b0228e31fe2ae0400a9d00af8fd928e32d918e4a69c289f0f6e8f64d3371da62f472490485998677ec636b3e6f8e0b3256d297d2f2cc7edade3bd817856e0579e4fd916a92b85b5efdddf7abf68e509c708192c084fa4788b9f6c01183a9b63f092b310b2b6fa91ec4746b9e2cbf3f48020848bf28342b230e8374e6340b35dbea65ef905ba6b6dec99091be1a0a205e94ce8175e56273d36649bc3ca07ac976101195a12745ccc7959a2fb4c7573a08ae3b048ac36c68bf48b062bcd0dfbb380199e9e599343101aff80e273c8fd66cd9b79ba7ca3a4f103c202c0dcb2353484763b405b85b2db39f14f6c07f983cb29caa0c7403b473edca01e4d7992cd9cf6ad9bda88ca20a05ee55af279a5cb403807c209875c31b7f7bbb50c443e495f4f061ce771ef20e202322000394c286870c959fbc284d8eeed6b6397ad032cfe06365ad1a7531832cc6e5b2fd76b1f965c85e5187253b1561645b66a148fdceba4a4c23389949af5060058dbc471356c63c3dfea27376f800ab10a1e2b42fdbab2e7ef8799320dbb578ea59e90fcfe5d1f19b6db41ae57ff4353eb0e51baf3edb9663f4876aa04e8396fcde2bd7cdeeaf6ee16766236ff2658a4e5c5185653f710a63df0726b052e142a3e42ba6f5b9873b75b46095fe987a30a66dcefa39269612e680a4d0372df705473290842f8e82e1c11c497879ba5cb1b0ab0683133a713754a0046f1f28ee665091037963b4c8e72b67c9d5c7a03395d3de9e27dbc42b001507cf0b4f8beeee26c92c8e797480d51d5c8ab3d292266276cd41ef790cebf6917daeadaf9e1e2331a2b2ca5916d234fec4311a81d85da2034195e1d55ada9f30ca485b27a9a78fd9e43e36ebe2e78a36676912bcb901dce1024208d8f620865bb5471f9ff3b1ba875677d8181fe7622d0dd8a46b7e3a9978d8f1696827e43078085001ffc5632ba1c106bac617fa414a7e26d777702f60308b4a0e6e374e27f1890e082f67e56a91ed92e4de1046b1f781fcb4c6d409b971e2f4fed36c87f22c01263c172160ffbda2c45c4953f6399ce0024141f5ef2ca3a698417d0fb719933743a5a03bfc738fa8442ced2830629f61df88d01a0a422e9fdde0566705248cf50b4cb0fce04c6dc6b95cb4d61cb269cd3b915c8a82827a956ce245be9a9c8101263830ad3515c1c6cbf285a7e4b362ebc062cb8e7e75ef50ec4f315a9e09d9243d7109962253f26e23f847e1adedf2851405076e26a1f697062f048438f1fc26f80021ffd09068876975e4cda2e78261df82f672a390f534628ba58490de52cffeec623066538bd8457243b3e8297849cadf82e21dca56eda76afca2cf5743e7f83db3700d25c32b5df64cdbaa3b3e027c269205bbd57f8b7dd5f1261de537358dfcfb09ed8d78465c09e78c0ea63a579e5f0d24a63bdad68ed36c57a10e9682663024412d1312f2e8b3fc103cf1d60fd890dd870684cd957f6c557f845dc8962ae11561f63ff9f7a9fd73ad5da479f1d1c3e9760236c292fba894e4ed5735398217b6b06f9a951d49ee34ac99478ac732ff1939c2db2093a89011ce0586453316dbef78c1ab4f2c6d8f285517637357a24d55176ffa4f612e2bb587f471614b8d34a8ff13fa8debbfe635ef007f9b6acab4855a311cb7c436826656e1a0ef4b902bc98f8e10b823e7fe44c47b246ac7523c91482fc8c083689b0d82f49c59f9c6c73a6e5974399c8ddc3e1ab1d94838e1ed612a9286d2686b80935457ec051dd810e3e49eae761e588a093aca269d831fd0de4781de5539e839de142f185d816d0ead3b8247d971f00f8f6ced93d171b6eceee92559b1bf86ccd80aa7a9c7ec2eca7eb92fc6c95cfe73b6f742a94cca4b497a56a67e4ec2ee43687de426ad25c24b40a8cdb3aea92abe6825f2ef775689f06bd72bd6940ac7a575b7111776f5d399d94e8397ef1e1bf98c3c25eeb8dc15e8a7b4dce8ec5ebafbe9fe54048a2406bd33f47af9f6847a2c0a85022c78269a391835e23cbc876f4cab9bd576517a05be34e1da612aa2ee5dca48b23320fabeeca5a2655a6d4e8da0a3d6bdf533bf78a4c65fca57f3422096b3cd5d8b1621290835428ccb6879bd00b9f6340798ba0678d0b47264b92ab7deaf5b29bac4638495b25e801614d0a672d5456136e83458413929fb0fe4235c3ea63b414a9087779c033e69c3d81df101df096d098bf51607eb068de1dcf5b7bc7eb6cbc3e457a923102a6e5a1e2645b2bf8b8008e9c5e7d2cd934f610a686f632012f0ab2799c335c16ab7644db44b8f5d13c0bc6a6c73abc7186a17d4442d387497d78cc1166cd7fe456d69cc8faa9fa1e858ac77b16399c1dc068ba3509845628fa9ed1a964d13af05b8ef057f0bea74546e61765d5fa5a3284946e0555991d3408d579ae10ef0bcf0bf805f4c1679bc9d2b61d1380ed655445ecff11b1724adf3ac51a9be56770d4faba342bd7253630cb636ee0a1934c0786bae406a7b07daf12d63aff6cdae8a69a3e1169cc8804fe93867379b27c7ca0c996c330a2d41407f391514511c9f1c88d0c044afbf096a7cd87d12b3e1985c470f9034c2d4dac9e8f8f04097eb52a9f25aca32bf00f59a0cbfffe919efae5f72f6a2aa5c18db5c72917b9b90e1cd1af068874993324cc9e314752396f811b9d5752afd9ea34be0672d3e8e04a71a58ca227ef1f5fe17de47006828f2a4ca54b8b5b194511a323f0df3c27fbae5414ac8b13793ab0c5dc181ab5f60f59de01663ddbed93d289860ad0c8ed77b4248d7323d3a957e03265ad93ce23366885be91d16da332973862b8e9f2bff0f6639e94fed1061368c7a9196db79090f1044b430888c0adea30388fad51f5d3efa1b6768ea405d9b4e624e02b2ad4ab6dba25fe25a5cc72561185f37d6f45bd0a6f738c55c52f374f2e57963e6055e24917dd17cb5d2d0c455cc988ec931608c11d446ae6ace8a8b1f0cfa02a20aad21dbddf445c0778e8326271b47d65fd33be4ba786b3c3d89a67edeb9270c42a07561cbaf87a4d2692c7c31d0aa27051ea5c6b2b643fb275a8eb6639e1a4c379de7ca4eea88886cca8501f3a0ffe1aba89260c2e880cf12640b70a392228b710d40be6f8d9295cb17585b74718d2fdad9ca5af5f668df880fe554a77b88f1775948e73581ebf279ba6b32bc2d9d371819145b50c9445410c3e309764395a5d0e7c7eaa8acdbc9fe19862fd4ba7721f0d03a0bdd475b5533e8ce3818d08ed007218572d0f7ac3fe09e73f9c3026316e7660213a359f70b77e66e88960cbe99a16e4925b64aa47ea9aff93991eba93e8743351baae85e9e67268ba2f7dd6c292835ddab618e0daee0b6df97475f90c057d09bcafbdad935880eed2d432ddfa724e007add9a92df60e1aeebaec4561c4df73fbc99d19b0f864075bd282e3603c1bd690d327854d7fba43ee4b88846574a8951ebf988b2b10827a9f39bde73710977f40c45209b4716c99a7f12406e1f6399fcd55f51a92a56acd7f09fc21ac4a1f43de29621cacf3ad84e055c6b220721af7ce33bbad2cdea56ac4eb457907133c8a34a960a87b2d036c631f79706911d407e900f22b42e4bab73686a2d78f9274bc08ed53946a48f9b9f6f6422803faee36e865a27e1cdf311e9c831a238df05241239c43c8c16c14d362822bc23757f0eb9109d48d02f69305bf89b54549545b814d5f382bc8c0de226e6c3b274d4d6390ae9590403c5166d668417c250be719e54dde3ba7c76dde0fe45c7a3d8d06ce8c05b0dc7f111935f85d5276ab1bd013d3edc05323059a9c008af9f1ed3eaab9475f03c232cb7685d36766acc0c038d1b4f3ae8988cb70a15e2aeca720aa60ac2983354941b08fe0cf4d22244a4447dcf1284fe4bc611774928adca4bc1751309a3bef7994098dcd54d930e832ed24bbf0544c6ca80fb69d027372f1aacea5cc024dd95b141d97d5cad138006104f8f61b3f4c29341d76a518ac5695d3178309c9829af6a736d67e99fee172bed0ea16d9b0f82449d27e133bff2f981e39136e57a2db53369a72532928d448309b23a29171f864cd77f76fd232a603727e7f8314754378aa9292d9e316b98aa1abcb22ad48f3f1aa540842470e62ddb92cecd069c27b6fe9665e9a2d92373ef84a091e94fe91d4c6b1da12015b0c2eda8c84debc532a40dd5eff1d7062f66e1dbe051fae5b7b140bd6946a68e14bffbde66f3476eef9f16cc29dea154f9f21f74fe8ac632659b95f0a5fcfe467c8574a82d55a005c908c80d95f8a8221da607047da4e1b29d2ccac9763cbddb72a3e69a7ddd9c065961800ec6e8421a04e326fec028c3e2a8f53d9c3c7e5bb971abc029faf3820d0b49ed443f2605994a49fdd8889ee34f23859ced7b4a6e6d040dafdb074ff87679125e42612a791c483afa06196fc654974e3731a5194c72a439f422354b75df0d6b518ddf6e033f9946ba1bf523f3af6ebfbb0d6c739c46ccc14b94076e709342a5658afc793a6fb7fdac8ece53e19c346a86d513d1d4660823f4b4e0317f5fb36118ce6ad485292eb04fe2f76816b762df392d5dcc6b6cc0e2ade9722cf880da1ed9cc8cf889f8680f229cf2d9199d847e207a8cbbe7a7917dd5b61fc982a3114f3709e56daf59ee7ab321533f509b13d80b412338dfc2f465eabf5b9f94331372af0af69c7bca3c8370249b03525c9b6d2815d3cb9a2b543b7b49b807b3bd3b19a054531d65c5eca9f80b3cbda54e75be257cf0dccd6d5b5f0609a79a47be02b4b95a6d68f3d9496ea939aad6bfdd5d4b71cb2cf4eff55440f963ccdff691f4c46891b7f7ac710d42025487e708a59c859ba4ca9c584fe991e3ec7a4116e5abd92caec542063992b4a1d036572623ce0d117e6c4bbcf985c243f842564f35725373f617e0877f6436f62148af8ed45c3261dc748b747eb352a83bb797f5edf2d3ecfc225ba6df0c597dec3168a933e1960b2395c4254beca37f1b4c7ea18ba7dae645670bfab4f59ca785731b0bced8c88c08228e35edbc65371b6382e8ab0bc8fe566889e9bdba611181a02f3d01cc2a42eebd522cd08cf86eb0af4d21b8992e9393a95dfa35b5573a652b2da379163bfe4bc8b870a0e8dd947f9225e320ca9c54a1abe0b2d990df90b4868ee591518deca3d719b7bb5aa536dc9eb5a3903a62aff4e2ba9a05b77aa2d444db59f6f890bc8b6b0e589c4cbfd46c2764f97343421401d0541646a3b8ef58d89b96f695d4dc66e6fed9c059addb82eecc5b467f9b1f5d1745be18e00ad4b6d438232c93cadacaed73c1d3ebffeac537442f8669de206b09f807f8e6e10182aa4965158d03162be10597238e2650b7b3750cbf8c9bc5c03af37a6342ebe420dd37f32debee3d0e641cc05bbaa1cbbec5c7695e42548dd11cb09be46e8bfb35ef8c53f23b1cbdf6e931e3d8fbf2aa6ee0c3dbef3588d72241c7d2f8d431c51653deedfee4ff0759d2dd6817bca97 -MD = 24735a57531628f9491400828455cb7c7756b74dc997b40728961c275d3245128fec89dfc189ba7cde92e849311e662604eec6d8e5e85346b43b1b35e859ec33 - -Len = 100024 -Msg = f040505326c87eba5d23b28cdb0c0f71778ec0f75cbcdee20ba394c49f7d81cd55285de34bd6e0f58805df8d3db2b9a54ac9f1bc04e11c293626feae6696f05059718466d9ea6cf1b523982b0a589f63c15b60075940e903e65998495a657fb104040d04566eeb53eb65258ec9688a52e32a5501e2420d182424a9bd0550f8985ec940e44cc926c633b3cddd0249421ab81f18d2274f4f11f76f7b32efc021ac70a8652f4263e2f094f5da413d638f644822f0a1b0d07896682254cf9e1ec496418ac30cc1a4ea79161392e1031e39d89c1c2796062b504e7e257dbc9cd0a7fed955a3a450f4050ac1f53ee6dbe2071dbbf303dbb0ca9fe241603e227140938a41f34d1f77bbfa4b9e8425774e17c2dcad91cd9536132df9b9bcde29a3d44fe5804a09a4be6192e3b4a691bde32532bc7bdcccef2170c23cef1fa7f8bcf6a5b59e441f5bae4e957b0b44c8df22741f662cbe4a0ff7482553ea73dfb8440d5ba3a4c8d66dceeacbbaac471306936c5181c81e8d1d43031fe5b29ecf90c1813a5699bd7802a69efb499e95ba5abf768fb658e3de428a08789a508abfa9bdb90a77850d4b41bfd0efcfe91805022df8a3ade2f785a556c1f81ccb1df62abf1f93ad719f9853a0ea6df596b63c27655c530d7141ca702e9566102b41be3c501a9ca1645ba660d1523e63ac59a6f0f008687e0aa9f5c89bec8c2179dd5d07f712effa6629bf8fdb722ac033e88c865566aaaab7174dd7242f30f5bcd81cb23c6f52617ff1290845b0f8b4344b36101cdce0367f731bc551c41b34fc1c4366a79a8e7eb89b2df4977672e9b56aecb7ced4d4cd6ba5a7baaa14158741901a4ac1f96bf8180f137b5a2b5e04c12df6a3f2b54c15819639ddb887e696941ce98711f5b078a73623c4153685b05d7c9bfb10e711b6cb2c195602865508fca8f7441ff727a56ef6a5f85001af93933f25e8b0d2eb5951508f4e10772b85821c8daa746596287438e03e94f3a3556a5eda915bdea1a61aebe2ed6bc330b72d60f3e197a8c6a8c2e51dbf67742b9febc1031f9873fd442ee35b5a9ad32c43055d711010297fce5ee3a4a254ec0d191c50e7b9f0f9c5dc952242be250ee7d412f94f5f684f8842521cbd10e0c3126a07f4d088ead8c215578edf4095db28105d1dd4f72681ababa676b0319562023ab49304b30e78bc987d11790971a4b99fedb24900d229aeb160dbc42cfa2fa5332916cc63e4417b0c0f92594041d0602aca9ef6a1f5ae5afd8a32422a9793c3fb706670c0f59cc61a13f8c80e8ec7e659fdcb2303167877372b637252f5f7233a916938f1c8ef666a932d0c9bdef013d38d1f184ebdefcd074c559ccd9bc18e9992096c1fe5a324a396186d0ebcb5ae4182841ca9727b2313f4f208c2115bccbf7d2d5371d521c66d25a1358fad7d814ae5e1793cbe8443062b21fe5ae02ba55659bd36101fd0147247b0aa483bb15297bd1d75302872f386f9cac5bd8f9be1032fa05d234b17d857042d165eedb7eacf122259ad39adfc3b67d5a612a611477006c010d3e260d8c76400bffc4bf8119becd76dda779d26cf7c2be981aef7a045e60497486b12dd687012ee48dedc8ea35424f8e06caa38e741b2d6342eb4b429d85439a96e94afe22f49ea6a2dcc2b8e51f144e7a03dfc2ebc53b450aeb04bc5e298401e735016deaa8efd8bc12eae05ec2697169abc3849f7f7cd00b6532dc10fb8f2d103adda04e7ca6dd3206be0af2cac3a95e291b5e3fa84676acf0521c4649d98e7a513c2fbf0e38369d4ec89351969758d00223ba2cbe4cbb6802ef176eb2d798be2ea986ccdc387766518713ebb468f267cd9922e74fd410d52366381ab51dfe3419b22fe8450c12159565f731b2bd287df1d8130fdb91097cc85408aacf210174a8c295a1f7478933a101d7b400184d9b155d1506cfe827b76834f3cf7f6555085267427a515f6f38fad710032aeee4378eb4a35cbb6dde2d8995a3c9347f6b67bd1cd0e1f1d816ae19524a7fa1c58eebe46b48821c86af37b2d273588cb3b70b3f6fab794736220b72ffe1a9f3109010aced7f0771c71d7e6a980cddf6c6ca7b5fbc4c90cffe13c99e5c60129d74ba5e5eb7b16d49a3ab5a1732bac9f10d0820a4af3ed90a945e70f1e4603a1f56402d60567a1402a0cb635f5f07bd0a1b02a39494fca2659d848a24344c90e739d3f6584643ac4b43102299599e27a0654c6ca629f09d9f7e088d9ba89fb78383e851ad03a896620efc005bdec88a627047f46fcad51ae6ba6ce3decdd40e72e8ffb7e51b13530568f1852d4b3165cec087d347e3f4baf9d724355410740643cd8ca187090e72a3e58339642b433a23da7e71c521e9ee3768c0ea922d1a4f64a60197093a1465bc194395c6eb88882022be586df12f352dc3b59c1f50114a64170110f24aafbcbc5895229c286bd0323daa1fb8de3f205b8c849262360377b0750da7c8974ad823381a487a5e8792d88fd4002c4584203f37b085f15b6b67d85489b3f2cc70589f4c25afd7fa464091adbed24ec3a8c54739cbef432cb38b4a3a07ce1736babe7ee949a14b983279ebfbecee86d5177012273926de16666294a9fa6e9c82746a40b418c52b94d6af560ec0bd6b065ac11e748ad538c51e8e3608e41df92c47ec932105a42e8cad414e6aecd761b3ed28ca962372e9a5265eaceb5744c380bfd5c4b482969aec10e05374c3c5117a3927b520a5784733286477d5c68b724c168683d32245174fcc0d03d0e7fee0d5e94e5c98835df7fb8f20154cb45a8bdb16af2f2167081a041917bde3cbfd563357fd2f624fac625ae51203a4932a76ba2a904513c38819c592910041d238f83f1fc4ac126cec2d0da4dad1920573d965bcda542eba2dace0c319696fad4a3d35ab25612d5d85ae5068caed896ddf1a6a57fdead6cd613a02151167c1bf999bd374afdd17a4116cdf8b62e5ff4ec4c034867b67a08fdb4796230979ec8bbfaa7526b48e65d307ef07974329682abd5160c2c3592043f45c0957721e449424dfb71be3d39c6ce1bb6506ec46587431445b97663dbabc34fdf83cdbc36e5b51a205deae7b3fd437488474bebb44ddc91f916ef493e44b25a3df4db717ce63cea7ede984b3a49b611cc24b3b06b1a9cd59bec3deea31633ec42b049479e9201437dbb7073b7f44f7becb050197237ae679103085af36a6f8f567ebe47843229b085be1966134438394eb3c731b1ec38cf4523f99614888ecae127e278160ddfb6fead3c2c348296d35cf5c3fd108063961d14b7a9f0b8b7254b745ee23d6d49df505180ce04f594d27c3dea87783d5643839deb9b6e421229fc2ada8ddf988fb2e3728e536ae757bd1854e4d6cf693a5ede883d75756dc85d5d14fd82e5d7dab720d80dc34d9e0a1c97035af2ff4d366f969b543eef83014ad4f970c8387252776d4aa6269763d3786110f4e4ee3173ff139fd9fec3cae476caa0db67beb11e79339101852f7eda57de4359b3865c1895bc5b73bdd98b9a6ba8d2e46861dc6745db75c5e7fd37484476663267ad184ebafb99cb84190d4ab1d45736d2083a5464cbbe9b55e9d645c4913f26094dab3df5371f895a6b9a1dceb8f777ad9b140e5d6d342ad6dba2f8619798de9f4d5e0cced9b65448b7783b4cba7a500101b2bcb8289f1b72bbe48aa2f03701349579e4cd4726d455e5f0cbb344a768d7245c87fe63c6153171e5230f04e438cd0d44ec7bea37b289dd4af689bd476836eb5a97b68872c11ce5eae9313b692b749d074d5f2ab196ec87cee3588d22f7273ef31368fe6bc63a003e078ffe8d81302d092e02705b2787cbc4bba71b00beb10571239d2d79ce94a828a3b2b317e30aa593b8ea22fe0e619273a5ffd1a964dc281af1db7d647e30c6efe620c4d0f808eded12a1aa62f382c224cae716e492b09037a2ad56f3801843dcf76397806935ed5f66af6e4f7cf3451f51e7527bf036230f619820f07c540537fe0396efdd968e31d99ad88d54bb01ac6387ee342575caec5426432119eaf648258627e4fd35b6aa95ec4ee321e2e013285050d8da756e14a3de274e00e4fd569276b42871194e13c22c3a1b8c71c99bc7c9e12fb63ff5d077483441d94901ab6d5aa484e04a3fb487e303fb3c6fa38d697b090062da4968f8edd3c14b22ec8ddfbb5fbdf2d16fd50d98114cdae4583135ec3115854e50244d546a95fe76a54510204d9e50b5c8be7cd3ccd50dd9cfcf54a6bf34c8a4f44c9f0663869b4d141a2711d6eea2fe31b7fb1d9c607e54f0afed311d26d3e31b271589245ccab021564c1662748fb49107b2fce9b3d460a3192913b1b24d13affed86717df32a5b43fa9b859f9c0e0d2f7cafa1b98b802d05430d6e5a2df3d97190f27a2d67c37b51f637e2345dd8adbcf6b9f9ad4d2445fa9290120bd3068bbc0e3522f0b4f6b0c3ca5f128208db894d7bc72ce32c92d38603c1dc9cae99c033b7c6f2544544ba1df9597d0527874e556e6fb207946c544c193b14a92b1e157d10106ec4a33de5c4f5bfb84a247c5b69610c2f670f015691353450add31409fcc9aa0ece5932c26d620a2aadaa2b4efdd6350b9e1702490a0a762717210c0c37271c48cdc1c3ee5ba0c16acc030477874072cd2926dfba2aeb58fe71bf76aab0cabfa37f9771b834446def01d9a8839a323dea74b90a08586a554d49e8e4440e173ca52024ccbe6bcf782e0b8877f1bb1e0efa2d6811d2370a039a0c47c59683befbd46c04257f86a468ae25ba03304e865e62afae77a62b3cec7b3556aae0c60475a7bfb02c69f955c7f60cc8dacdd8edb4ba67e6abd2c9956857619ff4d1599a429597b3420c58760e9c1d4f5f28fec69a7802bb3f0686860fb4fd8e43d692e2eb349077f6e51867b4e6d3b810e014a38801fc96a1afe6916b2a759c086f2670c7fb1698bb72bdbd538ccc9d8071af06f61eb203744d5e49e31e7653c31968c6716fa6701033bce952e4646a2e5c42537cf4cf7c075d721200075c400443fe466fe8dca895a69a6e4b9437989b0e632b854aa17b0b5eb67c5a8bb3eb3cad4b832c1d059cac59dade9602b2b3371675f19776d49ad0cf900b4b01f9afdc83d50f2e62dde6d4bbf29cdab6624483031f483c1fd535f83ea3216a00ba2884862f4cff60b1f19f5b763b7225c2c71f32b391db8c3fd7021a4461301e61cf9512becf178d2e677ca6da3d04e750b56c43d7610e6251185ef1084d25a18d1fbec807f7ff4e9f92fd2c9313fb61a889eaa4ff283d38c5549f316337c330989342049f7a1f3ba20e815b4542de2b16df1ae49f69f05619361379f9c3814210c4cf56e9a81fcac254a9c1455c25ba480f9d613ca8b060a9178c391082f86c821ec73d7b1449727cfff6ed37c25a8598a5b2c96b6705ef118349dd6bd89106692bca36c83154c93e5ac93d7117f513a52c2b8b80276937cef3dcf54046d3b6325638c165a1aa45930fc140a5cf7dfada2d48162f5c42f15e03c61f524038e27a38a36bb7c7b26df7894f852a5b6d91c40398f7dd883ba23b1d9599f6774911ad3d8aa4432615b8e841f479933e4c7eef59aeaeff3daba0e2bbbc13c13e8cca47ff6ef9ac4f4c9ce1e4309c64fa8318b899f9ba28ef2b93d168ba0b37186c82e6d8b0da37a5bfa080ca847c1412aa05bc4efa97cf1f33e1a3af0ffecc9770c1e66400d499cbf76a217f7097251939cc66e331c676404d20c5e93e5cf63e320de32bdf6737147c30607d855c1c70bab344e12fc4a2e4dfc7b4c1b5a4486f18dd499a9d009421c6b9aa4f23596eab9570d2d35520c98f744cfca3167337bc9da6a63aca4f25765f6c8b6eeb0d903c627b9d3432597ea2a3271a17d12848b948f07576f7918f84beaf70473ce725a59a3a008e57ed26c0d4fc799a6651ffb7a35123f9a57626df6d18e572a9849379b542a94c364a565c9223a795568ec16a253f5e1d546b8fd8d32f777bb1546e2b4c1c03e84dff81f8533330b3122d42335711705c64f02f23896992ccd4e52a2cb73c8cfd1f7b3e06a0b1815e39bbd695a17e075187928922184dc3e084953c108f0ac1051b5bff1a031526012db91313aceb8f871cd13266d8428741610338594c2d2c6ad20029a4e2d4ab467eb36c3fc1d07557a51a9f5471ee5979cabd8379770a4bc8c4165229d8867d88ad29667ca8d3555da0fd349d5db7b6f45202c1e388388b9971ed0d3b4c9109622989765c9a5aac0390f7a683f4253c4b6791584a082e88476c12cf3bc78afb4d746230423edcf5e4158849baedcd35e9abe7daff7f52be6d0325fcbdc1eabfb53e2218e00ed0af698f1db2a4a2f640597f54be86465b9a74d7753a33d426c333b777849872ec452e6e5655d3ac56f80552867770f59fa8f969aeec3066c5a243a0a127ee1376638d4390c7ca7265a987d5eb8a42159566553a31a726024dd95f6a5d6743590567109f7b6ceb8d88e15b7a028b7c2ed35f32b98bef973f35d50174fac75acc2fec52e274d9c966574bfaaf59ef7199effffc783c2a06660421b46117cc76e54c5fbebcfb82e6855735dff6503ae4ff31c52cf6b0daf61f4f4bf2bf22eb3a2ce12dde7f9dfcc572ef2b95ef83d228b75f4b4ea59896e8e35db046dfaab8171b94f31cbacaabe8b7a5b996db7359bf6aaefedc0541d2513ad5fb1b431d979029be3c03ef1014b2bc015c6d7a9d363b81c76c4fa64b11b18e4e990aaa0a1e37eff3652e9cfccbd5f89880842d600c1f853ef0240912e99c661df67f54eeb060c6ab0af744ef35a515c1c265747a2fcded6c46f39e47ae744acabff3d43a02bd566b99e86765e6b26c139eabd03a25d942d5bd38e647e4dbb4db3202b88a69a007ab9e8c750f6370940471a1c12e92c3fe01ef6e71a221353cc61916624e79bb62f1855e1e3a1082062ae7f1e7d5eb10a7773a0ea0c4f8033b21c1c971f4a761f0b3ead7937482493aed6e1694be8331b7bc4984244ebdd84874b876682b672629893b83a55d4d48bad2808a58471fc9a7478a795cadf726dd1589b7a5415d8a85e803ec9442b6030e50abb7b31e052b0e8f7958ca41487171aaa207c9d4ef018e46b06d10c3710a9e0e5c492591d7e8561a92acedc7164aae9a9de13654902dbb2bdd9f8b6de2c1f2622e994040fc74066f62d047add514dc7bd9de8b5ee561850df7fe6490afbb93d27f3263aa07709804668d5844295283b4e24a3942534f84737c044cda2c6a0af5ea9f204b7d50a3501a1ea04877964cdc43ceb0bd6e3a31d2f64ba4b8ed5fb042dd5a0693c2868108fa1ea019445290587ad6821e9ac405d2e32efc9b670f3c2fe3dd87218b94e9658307e8451419e6cff3fc3de46d7f78c9bf38c5202dfb07338aa412631d0e251c5154e94a6b4ec8995b9a44ad5acf234e06f38eb5a69599e43e5838d70b44cc83c1a01397be83ae4afe5b26e7f7256dc646e9c9ea65816cc87b347afbdafb58326053f7bb823b106b78996512a734e0d8fb86072cef211846cdf35950107450bec9fb26345ae7976136ef8fbbff5ff4ec9142b70ba806f4e5a2ff446220523e7f4b000f80ad1b9bc2d5c7e75274194277a4ca59e52495bb2b96d2dca0af1789fa800d143efd39a616b1bd3c6489f33200a2677067f97fb39f15f872a9f136bbc6f56ce4addfe43ec37729df60c5605c2e26b49b027b0776a6aceab6dcbb225c5b07c9e17ba98dce5f82a850e5ab0319468e3c2a233ddf8ce8c81409b7518cd42d538eab270ea8fd5150b321519f3df1f05558be68c66a6ebc042efbd858b8cbb45535a21e53c8243f8dd4d13336839e9218a4c841893a84c6cd760d9e2548ab96895956e03d6ddb708687d118f57647c254bac82c1ac2776fa093afa76bbeec3a6c544a1b0ffc9b9ad746b1515088b60775e53ea6ef84af3d0a025252807e16267ad0ec0d6006ed24fc8be2aadc2d41b818beac407c03a495864cb64e0828a1d13139cd55c21f389562d1f553fcf6737aa9c1916734c1e03f81dd1be8672127c12c095e72aaa80672b6b36a0b3756d3c595787ea9ce41fa61a92e23c0320a007cc7ca2ff28e33ff3344aaa12f1fd0eb0f886dd4769d065bc258ca4e43dd45d47aa0e6b243e1456b5da9224b3e2af711deeefc236c25717cd81d3bfc01dd670c31240975e5484ed35850a4b8c6cd2bf0aa35bdfbd8fc35d5f952fdcd88b6d02036dd8cfb5527c2dfc9e7bc8a478b01f007f91dce7b85a60fccb68a33270e23b90249fba3220443d918bad4204ef8fba86ea5b60b92665482b8a45bbd8b27d42f19d5d01dca624467cb66862b2b7b8b8244c7f133dbf2b3d753b8fcdd23b8640ae42da4bbccd6470468574d0b8ba7340620dc69e7a6cf66660440e8026f1455c507add41d87b4be2766298331ede077ac995f8a978160ceb760e8a7ddebe02bf5eac308b3a9922c594b49d33ea0dbe8fe04cdddb40a3b6f53f01cb6b02890490604299d0ea10314028e34c79262edea72f9b3cddd9fd3cac428598f3983a94f8dfa3e1b8eec6c07cbb576badd929b0e93fe8df564b0ae6370703bbbdaab8fa1f6237d0ed50a517a1d477c2770ce67c7e979c8cef9fb4fcbe16e1fa703fed7e2c71662d1418947ed6fcad1b7dc64c8a8ec0200c50dce1c56bf8891eb460c068489498c2d84c7a3c43ba613c6a0f45214040db27200a7b8a643461ef331419ff9a543555def6419a1196f9eee4efb98abca134a408326993d152d3349263e08c4b38a5afd11dd0e06818def9936f8e0e2b6a954daf5a9328dbda46b77c55fd5782c9509857ca0f566fc978252196adf3b52465e8be8de191aa55223e97f359a8688d9fd71804e6434f302f3a336dfe8181560b3edcd03b15654bce928b44dac7250ef836bed33df12fd66cff74fa6902b888f117b22d89fe3442b47b015069fbe0d4c47bee3ffca63841953d8947d7bc81437e3be7abb39240c43bc0a120ef8ec1656c6f52510bab92fb14bc1d5c2ef8050d1a712452a11ab158cb2b12bb52c6f14b56da92105248648c4f44d63f58fe6b712d82112b3cddaf87cc82fd297cec980eec845685bac4d67ab09d5cfa3b16dcf41f37553d6a2561d7a68e09735347dd34953445b62969124f9d8e5895c1888020595699911438efd2c217dfa0c121e947b8b407ad887d3d9280e17216d19b7e7c41a7842d235f820086e526b8adc0e4cfbfca4572c04982ccc05c51875299ff9040f4bf1b7de242e85bbf87c4fe6df552113fa70bb7150784c5c89eef2ec82ae5bf03f1630c095612aa6eaacb9e70445a16dad4825729f442f7ec00574c712802249dc30bb61ce606d9bb36d57411fa6e366575df87cc728fbe9220c694db206fd88add1d65621c4d526bd4eb68983f17d9a631282e47a9f18280a544ee503bb54492e6a000241e6e7b492b13624c3adb6767b16736e2c0f2ab7f38da4216a15bcf7d879d6faa14f1be1ce4574a771445486e9ca386e5df1aa157818e787679e9e012671b9a3c275f82aba6bf085ff4dae4839be5069830f0ccd0276a78b8ebe8e11a2f2269227e3e2ebf1a52854c0324a47056349e43d8fc95b2d3762a2421df395e86bbc4a343192c20e718a78869aaeefc7498362d02c662c42cb97702405650a315ec93099b75e396b619575a4df42bee9e19b69fd4d79ccfdb3b459973d58eb483bfbe9ab0dcbbe92f5e7e09d78bc40f7bc006e176b6ac9b87047e32e0e55b58793c2d9faad51ce0f9ee02de31f61f27b4940f3b11ebf8f0d91d0815af0d1f569f6ac85fb1e96e45bdd1cd2180bda6fef09db7f5cdffea96798dcd8a09d642779c517824eb9e19de2210c51aef69c05bd8e4e756d179e9540e5cb3d916c72c8319f92334837f8574d1b2d410a381d407137088a746e15cf44092a449fd684542bd6bb2d89f111bce71bfe14dc78d4ccb4a4a803153c0ad3cb9388723e741f67b31ae0e5868de41b6ab40d31781158f6d2578b939219c43f51e5643b0fbdba5f81cca1dfc056d60f2273c94b7f9a205b54b04190ad80086e71af2c23562bdbc7f27c8c90c9e46e14b8cbb0b7559bb166d65f58aeb9f71ded95316ebfd436fa1d9faaff9cf5df22a8983c52098c6e92a5b1a54f3239e79b39471c9a64fc77abece3c87958e68f8a574b363bb6a6ab3a94913283bfbfe9f6de11d14db721565792595588491e7e0b9d3c59cc4316da1fbfdf8794cbbe76b7486fffd72af57b83ca8af2bb0200333cd7060792336f73b883f70500dab8066314bbe8f544eb2fc6e1d2f070083e3774b112d00c1c12e0ab9d923b46612f2170afa02cf679750b8764dc0f55c01b1379a7fd33b84193d95f491baad3f3a6407685975c794d15974be0008fcace492f82282fb3255884a64a231dd438069ffbcb432bd7ec446f5b8adfdaf24d872b0444be14dec1d547e002c7f337f12e8ebc0544b82fcdd3c4a0dab0e5e75c9f433a27d667071c2c600f0f8446568dbff4f9bb26c6d4ac8fc83fa20f9bdf865b1439b20d70dc92e26f9bc70471a06c4f553d3345f256f6ecec608748773b495f306b69cfdcbfd47bc90edfb52fb62b51421f244eb5373b6f93bbd108029b14200a77b59a05313f7cfee0a002bb08397a2de8049d79f5f87c70ca45aac86f852224c72c0884c1624a93a9be99be07250e8b503abecb03acb7e5e42bbd33390af9e1e24377c5f0bb8909d291d6a3335ca2ecc05d1f22f0c69675c219cbcd7813fbf4418274634fc9acd3f3b046053d6ebbc4b0d25b1c3dd49ca2bc863301bd4eccce6d6f9ac72f0b2a847590645e55c9dd95ba40ef015b653eff6bf7af7a7909c0c2ee71377c2f0e868dd0b8be094d0c7ce2450f479cd9e6f1de38f47d922bd39c842d2df6fcb0324572bdafbfa053951e4cd9c3f12929e859e1abf349e3464aa494a1fc35b36314ebb564dbe5be39f22607e0d58840cbd7db8c4d7a70d868cd7d46f572904aa824edd89ed3ccbd40b248d612da596e4033fb4095f0aefc03da8b4d8017833d0ff0c05ea40de1280833eb29b838f12c278b3da10e0c40c8a7f052fafa518ae50af717ba1d00af79112581657977fbe4d25c27102e23d2c8a5bd68f19cb713dd19b6386d7252944acbd5b02bbf2db642e1152c306ebdd176bd8031a40fcebaafbc9cb6fb4c5a4bf7b8e2dbeef1b0cca0d444c1645850c94d3ff74194cbfeebc7743927f5f3ae131a68cb7921c9a7bb990c799b3e737326d6bd712d3659de23aed119efb010c4a61d5bfe1c66af88ff862a11fe21389b768da68c392b11d2fed0439d92ec1c14619af3094a100bcaf5129dac8eaf104034ec8ba709c5bc73d9d65c52a5fc8e33c1fdce6b66c076e458a8e7b7b15aa2f7ee6dfd6023b89237411b8bc78d53dfa963c05e93070a697b86c388b20a9669391fac4c35fb464ba3d13a427add9498cbb38d242ebf206be70bfd0129eef4cb6a250228971521313fe69d10db0b3142313dbeaf8ce3d4e6bd54bfd19df2f85221bb29f311e5cbeb620dce87669abc54606edf613c098a7264fd768a6cab1385f62e6e3c150198f2c0c34916bc009857efc359d9cab4a3978462db8c447bc8ef3e1b49744eed2acfc293973f29d147b515d7c889a769c2be8221396783e99af68fee663bfe0d03daedeb33716e815d049918a5e1509d6a6ff4b52aacc9791c2462342ee3c0e586bcb956984dc8954abee0027c8164c40d14329b29bc73aeaf013b792e1c260b55ddab524034e681935c7131b6ea32721d53e24fa127110ec6059229ce35abe2d3d63a6ac5c736eac955c302df7c782c3d978a5f4b6d3ffe13b9fcb299d0b100a30eecfc936538154f435c1270c87456c0678126630f4f00fa86e1c00b7dd3e9260049a4339f78a5b7adb2ccf54ed586584c6d51927ddccbfd04d7cebd8d8300ef52c6ee10e6672074ed5dbee7800a3f67aea54d54494793adac453b0a805cec517efb36c5da81fa199ab344b1fc80e66106cf9612f23e1c5ef5b0a18d16b0101ecd4d2adcdc67b7082e6a1b0f24e82ff70d52b878f91eaab379b07ebf812af089f63316907c76dbe320d88e39899e507bfad510d0ce77e32d90bb3f1c803c1245624396bb3b3dcd1d1a853adbab121c7287ad5bc4f2c84a4fe3476f1e645209a39a0527a7893b2f3863f69d6009f1c87d1c61e5c0068e447cd9cb9b5fde0b2b5725ee55dfe6ed669795b3226116ac08fe21894b5c7a486646fcde203b3dd61bc26e658ddee4c307ed3831665961af32684f99f8e4ae752420b4f5ba4b04314f680c115c2f035a879bc407d5a36b89f95def0a7b13439302bcaa88a609d1ab3aca57682d4ab3226a15b19cfce9a4bab251a8514e42ba20865d462d9fe226b2527c08d09dac84a9240d99674896adbff1b5d404ef0d72bc2395004af48e63d54acf78f119eee86d49c5d3fd5534d7183c2d2aabd9de2db46ef6617730492982786720301e6c6ecd4fd109d58f4eb131f619e4acab2f1bb7ccf40228ffbcd8486fb5a71437bf8877bad1a376633edccbb3feca8dbf9afd14c2103ad6af5400a5955d7613e252b5caff3a29568d9fba13fa5e24d5a38c1279f2cda416cba933188da105c5aab07755916d040c4aebc9c93dba8c0ad38d2c55b39eb65fd116d02fcd32ee9ffd736d9625fcdbfe47ad9c49f2967893ec188b16a905ea185c376839b875891956f5d90b016c19a2e05f9214cd74731739b8bf5b2795c7d6c9957be4e40b7db843c27a32d83d45a0c17c5bc802c6f3fb68d84991d3c0d821a58b8bbfe44734f35063919bfed2c86e577e59c2471083b6e601ba392209837f8cb408191ddb3750e953efa509ef4a620ee00c921ef39ae02dcf71df86e25246cb99818f1509fd678b0dc4ec7dc52432744be4c5deb2b1fdcc9c10e396fded2dfe9688804e861f9dc21bb1e0cf06ee46141c92cc2b0051663ef207f3c68e9c8ba2457d9b4ec1e66a0ae84710722711136acc6713785f01bff16bd77e9a46e8e63320d14e7a301a62e20df50a0b983520e4f6024a3b114b718053ffe286a96ad44db334187562f40ec3e73c2bfffcb3051f03d4cf07d987116854f1ce10188acc3e771667b4ed3bc44d2e9cf4c3a7232675805f10531a5d2625e95dafcb26d134a1d6e8dabd013a39da2e87f2fb39fe1b94f611bca1562616258b83f61c56d6b4046d3bdff27177c5e7819db50b27bc3ad9df9d32770f8a67f3a6154f982af3b0d2a47ff5f9a08cff11a24ea977e2e62ac097420048c8e2921ce3720aa305c0b1891735ab3700e25bd50b0b5ed61df461f5c7a0b49af4d73b1dae3ab5d199b64cb43fed6e3f250042ae4654238a1b7f56c5eb59bde225d0b95270cfdfb8395cc8d07917bd768f7f7a09ced9b6287ddf9fdd7cad8ab2de579377d5b1f6ab772cdc7a7d452781a2a838742edc8515b79da388f64ca99170d46fea4781894fd59efdfe96e62ac4f1232479c10cfef65b51e874e297a8e2afff951630af05f9c72b93e9608b35c50d78b4873fbba22ecb74f51dbc1ef73ace01a9a83b9afb5dee6b34c76494e7166a016f38e5991d43aa7f4fdffd53131e6db3140cd2f5e7d09dd657150da3ad1d7955caeb7d05aec95ae96f5820d49ae2015c7ab0611059f667e5816ed627f66ebe0e4e2b4081f5246f4bca02c103ed4a2b96342f90aaa023df213a1168a2616eca636f84eabe7ee95a0ee66c487188ab3ed8e6f6dc05790d6611e7c91fa36cb2012db564d5ebba8c9dab5af1419e0b79cd9cf9a29db133078f2020d2659b76cd1495a6679cba2682ccc97e3e26f9d45a6a7ae29f604e7ca6dcd46be9f50b2e145763b8f9a9aa416049b1e6af730571b167cb3859ce3d947fb1b72f6c3862d12c4bf07387773c99a9a72d2ad1b05162137836716e31ff48d6b040f1c59a433e7984c45cbd9fc1adc36773a121596e33f50e1514493603d8505afa49a2a51c94808467daf88e09ec420d2de02af8ac55da8c1fa787350be171045b9d7fe36f91d5bd5384c4cc55d3b9fac46e6af8ac5638849e8184c957e2cd6edd63b9cfaca4eda20fc0aed546027fc2dfb24de3dea3938a1a58ee6d785aa9dd0842ece4645c3cd5054513234ae72807c8426044c3cc800f2b94009bfdc7bae154a185ac270647c8cc589e40d4f0270c26952e95ec3f62864aa987df48a8551e5b1610915551a2efdd91acb894cc117263312541c88acf71e02fc091f97b2cd684071a3e8fccb2ccb176caf4eac95bcd169cd0f2d92d3b64948d677e80ce86cc57fb1f0e26b60bf1d07e758047768a6ea93eae03be951ae0c058d8df6f0117425f687b8acacc22d1b32f48e54b6211e9a39d390eb96102490c08914f24b142eaf2e5cc2edc7d7beef1ff918e670a86c09e4efe7e7a0f663fc0132d38325d9e28cae99d74ec289bcbe5660bf61ade5d85e1ba6acd70fedb27951f094528748d8e3fea4bf77a7bf6db3608f4b6d75c0aac26760a962ecdc582f362b1d07784957dda7e7420f7e611bf3c4f084b3d121295c4f85a4313eaa9e453a4b374901c4a8a230c827bf4d560ca90ae931dbc8f09e555b7d66ec0d41cce4e5b8aac029a1145921b1382e1e8888fbbbe41c8d631551d413b1b73a61882a33beda3e15f8c8e12b03093b04f8ded9115e480b70a9788a0200875ec34367ff5b4d1abbf07621573f5c38f9ebe44046147b7dc72ca2019106a9682530bac695831adee8f8ac95c0beb7a63a89e896162c9beb186a5699ad0996bdd229cf8d32d4ae8f8ed6a10a62cf99bbc6860fc8928045fac5d2ce26283350ec2e5589a41f76909675325d69879b8cdf648b5ebf02390112980b119148ab5e5f015df0f4a490485965b2e99b7549177ade40df61ae7e579b57be27c3569a487c13e80c63084a5f4226014c877402c3f4fa4c9997dd78d0fdcb9219a3992797ad2b9fe6da95cd5cb87fc58e14ceee16b58158944ad84ff3a0bc30ee185b7bd259132a85429141c7223aa7b82cc9349a253a0bd960e82a48ecf23fae0ce2bd81e79130f18145ce29ea1d4ed1b6affdd7acef0e6fc35331584a3468616678162dc16e593381f99a0877f163e199c67054b366085e59618eaa204b53100e63ae5d4e714f5228f5d0ef317d8df1bf57b699a068a2af0c5c66c7d700a7c3ebebac99f664b75660809663808b75070fa9f62eddbd8469c28ae435d8190c80e75a3969210d3c4810e314eecce1c22e7106599cd02d559465352d7e8a5e2c51e9f67c563736842f206774177d481d6bcdb4076ae380bd39dca36c295499ac3dda099ee7a0a537137751db66fb882ec80bfc27207d7d665e0f1cc7bfa090374ca0d9c6a5c523fefcffec7364af699c4c1426e14605eef50ee6ea66c7d50c738724af1d160c7781f39f7f6498ffb310ffce7a5f65e599154e495472c95ad508f54ed2cbc4de6b67ff3f51d68b542d31ea2240c60484466c2820a1134e99b39f9f078cf737a4c55829c7abf0c317a1a814f8bf41ac4abfa2a3531a70ddf96ee08b3523c9f5c44efe7820d5dacaaed51c863940f5e49fcb60c7ca07b2fee2cd72c3c1e06a88a8cefef43017bd2883913646cb0b0d34eb314e9d6eb00039bc9afe4f940b0278b60d03a5e0b9c163fc9f9e5e9868af2496ba132c255c8317f09b2b3595ecb84b58d2b39419020d0583c6fbd5879f043d082e577dd854631fe499a27fabcab58bf5e6b6c8c13cca967fcdf5b47ff73306aa55c49670e1c7da015b0a35c0ef21bff412b549c1ad1f9c587d35026ab96408e2f60081d349d7ceafab0c5dbba12370bf1c5820029d35a1759e63c72f2ec1c919dbb346ebd4bd85574f50018329e325bdcc46546b56332c40f8270cb69b6fd3b8ca86eb9ecc9e875f107d2802cf8a6656ec28ede31f42c6205227d8e74b99ae258c207ad677a55a31b63bdb1fda40bcf242a5f4543f8af57d750e33aa8565e0cae92bfa7a1ff78833093421c2942cadf9986670a5ff3244c02a8225e790fbf30ea84c74720abf99cfd10d02d34377c3d3b41269bea763384f372bb786b5846f58932defa68023136cd571863b304886e95e52e7877f445b9364b3f06f3c28da12707673fecb4b8071de06b6e0a3c87da160cef3e8cefe34f47bbfd98a6d0ebea308cf096232606748b47499abe31f3064812d94c9deb84bdb42fa78c08f5fa27323deb7bafc8a51581f6437843a74279b8818d312f59b29ae8309d7f7ec420fea894e87ee72f0c509e77e9954eeefebac3e36b6ab5ccf55d60497fe18cae08c7001c581e6dcbb4bc3d369c60148ba03016b30487c5b7b57bc8e4af30c7261a16d54ebac8a82126beeaccec67590faf700d7ad8e6d39c7b8c7e8cac0b92cecd6494a6a10c3ab1eaef23a54a2960eda50134956926740dcff5edcc06d0940a9b46cabe7b577a0079b3845a4614e0a8095a18ad35b50b6e2b4eb30d400e3f5c1c23e3f0da48faaf4bb2695650b84cb144e1263cbf112e40060d5adad832e945c8828ce81e4f40f0d9425f140a9209abf03cd99e65d93125f8a841bf4fdd465a18f901fee7d8c177cb09e23dd4209bfa83d3cf7cda6bd8827ba60425077bcb0b95edffbfa78410c6697f7f1e3de2982f983c64428d4768d7f78d1e96af8cebdcc7e7e2a4ddcfa34f6cf9a24fb85672ad75ed3479ef0a86a8f4d3fdae988f2d30175d37490b19fd951e2ed84cc40ab016c55cbc9d8003a6880c012db762f103c80cd48a16bff1741a2585ad8ff16dd4de0f017927e0f14cd7a5ab2b5b9f6103e720d447885cf4cb40fb747ea3b10e6575bb71d6a37221ee1a4a1873059e4da22ffbe2fc28728257cc0891e802935ac6704334619ab4340ee271ffa13ff0257304e67704718138ae0de554663708d18c503ebfa668379623a2b5c712852576daf889071cfe197632791a4275bb92012b88167a21b67cd6c0ed7df5535fbeb05e9d4c299228abc989a00fd292facf78389a630a4fefe4546b253300f03a1c608245b835007ba8a128154e8b4a9f019518199cd6ad8f1ecd86ec8d7055aedf15ca9445efe48190ab724b4ed308f2e8e66e683c65a70e7c70b8a5e5ca1018773ebc0b8d80bab504370ca499505aa0d5fa8008ba4de9089e0c54d3c484ac216549bb0df7be0f9073d26bc3b679bc236930119daee5dfe7f3eef018b236763429c56c3e0cee3f9e501bf43b1ec5b9f50325877972c3f8370e972ec727362adb554033fe4597d75939625a5d3aaab0804459463ebe7ebe705ea34561ac2a26814848a6d12a51633b9043e2aca2bf4c6fad29f25fea5cbf2e5481f89aa978f5c0a32d395933917fdfe54f41cbef79fa2d9e46005f7f1466cb80b1acc4b7b91503d68c5ff8e9de6990a8d2dc1d69412614a80bf4bfe50c41c283c0c6625f5100e552d4af22c5aedcf86b7d3633b8cb7cef4b0a43e3d4cadcbdbe1dfa05f8d745cfb8a49b895f793691adbcd481567f5b0807bf727d96c6a4179057ac222cb2503d785ab97f0fc3f2d6d0003b88bab33ce95eaa04efd386146abadc51495388ccb902956d865f25be5282e5dfdc5e2dbf1dc0388fbcf39fba219e3a8dde15b0f7bce7b33c21e604e57f26dc35eec9354e1fcd0957677f6a01c6aae0b672dbc17dd3b852a9f40ce804c74c61d22284706669e59b0061ef8b97e4617d6f8a2e40db77d4e24b5f6c4598b56405392a08559486aa5c2f5ecc5ac8e -MD = c51b6cbae292fa009679f7a0fde52d8eee0f40b6a2f333989a493097ead9ef6e9d95bd20dd54caec38002f428b828526ed5a92863b15524a134f6ed85219236b - -Len = 100816 -Msg = 095fae3bd3408b6360cb9972cef30a9e0943535c427c3b269d80327c2a6ee529170f0fc72471928556d1c628f0be11509f7cb8fdf5a7f45118184998bc0d13854e8362be72e7079cb0eeef2b6ac2b079125e620d9a3bb0b52b2c2e851986ee1c17854e29a7eb132ed5eabc84254410a0cab1fa94188196d83c828c4b2b249d75d8db7b0faac5dec52d8dd43a088f584d2f3d279b59c1cf44b5e409f3d82e4818fa4e927863bd8fe8209fe055faeab108a9c9922844438281fc184d830aeb198ee6a63b6dba1b4f2016e787dee59c435aa01fe246c14ed8157be60106a8a4365e03ab1df4972645f3772e72dcb0ee35ca7c05c0fab82bf98a9818cd819aa2c710b825e118e2279aebab3c48574328b0e1a544d44e11230c68bd7458fec82af52d6fdb2ede836675901ad9b2588692db2583a4c549b47c3a3551c44b841a87e73c8f96ad50622bff692dcd58e56173df207eec3cf38a7eaa7bbcce4d1c78ffc7c5801e067568be5ffe4adfe109bc15e35affe6e055797385c1655b07cdcadcba50a93be0557b66bed7dbd9f6c97fbe105a6c585a766aa1f290b632219ff864ea6674b5e3f9846d447d46813e2f92b78ea82f0b515f46511a6f161d429aeae07f8e4853b8686c191877f5a06242dd4884ccaec76e16f3cc24e6ede212c78897a1518dde07aa19b3634d4efd090a48b81a4e535359a55b57397da44a3b2dbbd37636ac1f77c875824c88bb62dc90bc517ab78579b913643d81bda11d62d469da29c50bdbb1c967d0fcafa29582db1f59c98fabff3669f8c4232d4d2332c57bf6e08613dd5db5d6e39b4a6d5fa4f35b19325c2fae79aefe36485610235007da6cc3022cec2295ac0550e18388eae156d9dba8784e2aea5ed917be53e767a26c87fcc0bfcfa870d07b43fd4cd8fbacfae1ecfaeea7f12600f6b9ef7c351d9f1b8eb048324f984e2a909d253017805c2d788edbf9807469ccd45571f5d61a05cec80a23ef349a37a28b86e2970c20fad9e7e8d201a35ebbaabd14ca249207dc6d7e2fd85c46553420b325bbe980848de57724676ed6552482f71e8473308c2ddff94aefe34c724c8c52a3388e3b541d396d6722a8e201ad3ccb9a26497a50ff0e7e81f1eb109888ceae27e1ef0537b3bd14dc8c178f0c5dc081b0390d36fc5ae158fc65db5870eece0fda3f72a6d55559b3a82c24a41b3df6618a44292d374640cde4d31deda28975bfe4d980e5d70ef591f68a35ebd953c6b34dcf0427aacc132761c31897d55ea9056c37828be5e379f7ec2fb42aeba919be246306ecfdf342ac9abe341db17753289ae2de60a6decd2db2a2072afc47d5cb35879743d7c4b6a5b84bd949e0db5c719761fe2cc306d97b716b98b3b233e422a8c31ff5e0455559e2f36fe10792aa288b3c48b7e36386295113cd8db5772c0ba69f06cbc1800812413d5eaed1a527959efc26c9affeba7e7921107fae1b97ce57a4b48a227db816fdb10f78e31bb9fff628ff29cfde5ec3121dc85245250cb2e25992fdaa434baf3dd7e807e8fc4ab0be483aa0ea0b5b4143905cce219f72006f4606eb02daab22293852228650c1ee1ce541f6a88e973d350136bbeb90b30128f4791bd24abebaeb5bb6936520060238867bf3b36efc020ff8bde14a01b6fa33ea5456c19b6ebea8c87a202e7301343bb3505eb0b371d7fafd5908e7f96336b8b0fd6477d6a1758b08089289529acb4df428014a66dd031e9972f76980a2fce0cfde0d9d034128b9a2c6b01dc4b91195d26ba2278e2acfa2537077799e5b93d2ce5d19db2835205d1e1e4493d1464c3cd4810aef333f83afb4bc50bf5c7644b735e44fd84f65a29d057714928129c56983d3014b5d04676c43bc4ae2c1db57b78dda783d7fb9f9a1de38eac3dd4ac44565c74fe31561c20288d92c8bd67314f95da75cb1c1196c9231cb8cceec9190f804c6bb5e623ede980b7bc061a224c2a62db2c3dd1c6d42988797c25ab7e773a9e8390e644d830157550bcc0d2dd7abe586657568989dc4da6604560f4432b3819786109fdd187467edef19367f7515dfee2739fb3d913a81597a0e979d5c99a79b1789b41ae57fef5b916f85a1e449bcef61d93e1432ecb4e561b497ca4b6d437c52414e0cd36917285896a29a0e8fa311791bd82466219c94210ebad1e9777fc0a10013bcc87c09dbab553472d92ebcdbd8c87275162261ed22e5a5bc1cfe81f16b8dab31adfeeafcf475e3312f7030d5e6a8b3102b382a78cd000393ce4c719617b1bf736b38e5139abf59e0f79b27870b8244fc8ba91fbe88297a5ce6a778380f34f78be8721fa905f83b8719f8c87ab01fcc4120bd6a46bc26b2214c58be5ebadefa800ef4c3459ceb342c7ccf3c353b48f4e8d0be3098d2c055e9e8a76a908076715ac405f770c95fead90a68ab4016c364f885f29c3d30bf08bda2dba457c9c60322f1eee3b1f41b0595aa0a3c24a758c37926a3d3bc40eb75a4623e9639fd9459df7ff8b19083e82e6944ff176858d1ba749b17009d690c44a6101665c084a91a9955688695df8e0d5bc18d659490f5f0efcc96496912e91dcb94ac3c74c7cdef585b898d4970d5497607fd4e31b68b0ef5a16ad6a7a54ba61cd64841dc2cc7802579a2eb339e858abfff97f9c6345cbb8b02dad0df89fa8aa0be329c801c61740797facbdcd2657a4091a28fdb7130a0bbd72d5f9a26be6f5f35b176e8006174079dda53ca723ebf00a66837f8d5ce648c08acaa5ee45ffe62210ef79d3e90272c738aab87e8d80107242f1aa6c800b0077d9fdab62ba4deb06c92462640b6367e0252fc9b9afbe95ef5405f6cb28c2c321e4e16276356b751fc828c0b6c9b4805307a6e8cf26f1e0cffe32fd3fb3b7f17d400873bf43d334ebb29f0d52c0606cae64928e456fb49192c5fb2620bd552be85fe55794621f8ae8fce9b0be7c117d40d08532a3069128e62fe0fa14b224c2d1a91a769c1caae7962b8b4350492252b8b0016e7e77f20728b066f1821ea166e7cffa594ce00feb81b3064dbed42d5d84a769aa2e3061ccd8ec0f950f6f4578991907981d38a9072a27ed3860999d1e230b506e38cc5ada75374d6d03309b884438e48b83a310bafdfea28bdc05ec151270483334a867c09c26a2d203ef1e169793f3dc269bd1777babc8c097a5b4c2e16aa3918850f31fac3e927c9817479401bed7d26caf65dd31b3b26f19f561b80e4f04f1ca52973833e3aec526259290f10de336cc3a385caeab01ffd9718d64f7b1eeec7129ceaab1ba6a3434b6a98e0425a851dbe8e37650f639eb5cb6924a3c27c3da034303f7a42737525a36d6eba98ab9bc0227d1aab729ccca2a110ad85a151652f74ad1af89be9897ed22b55a6fa189edd5739d6a4fba3d04b82d71afc00e78dfc38da222e0f5208d9406cf3aa50e8b6fdc58a145893bfd338d7841311c784de90e980002384f419bb55f8f0d182640aa7d4377cd0203afdf206e03fcbde718072f0675cdfe319e5ae7996f52079d4c363ec0ab5138b5a750079b347322ef69a2ab357dc6b150793391410aaa11b8008b975c96829bd6864ea96c5d24e9d5a54419c182bce01064ce58e2cb65b51af0232d73d3c1b9dabf139c7dd892814e7d73e1271ef108e6038384fb3c25604aad9557a2edaf0126d457473c514c77ce34ba97c2cd13aa65b7ebcbf6c759b1abab4aac664e9b006f4872301431a33bb97d80b440f7853304147f9462178317d25bbba24a61263608ae0cfdb204375bb4ba4ead1e38d631358ba764d9872201333180cfabdfd12087578ff682339946247dad18b6fb77339e900bb3a9a0c71c62ef029b17251c5e5fd763b1016a1989ad2a045da7d9f89893b405077efee2b7c5c6e97b28bb682e16c030b3bbf268a4a351ed026d3ecb0eb98a3be6a5fbf561f07b7e064d0d653e30846f851e86e715ab97ef9d73a47ed4746518c7db227fb9675f68b2e0b563fd41b6889ba572155b1a3e548557a584a858e714217afd020c9ee51217a02e14e9aeb9047dfd5e83e393e7d46095bc6ce8eb82b689f205fd0a0bcf029af7e1d891ec1e7b826296b35d9d16e7a59a53a81480ca9877fcb7f100326fc2b3447b2f748e49566f81d514179a3e06dae1f5b6c9cd210261e78d6eada739db0732549a1019ec1d9be77426b01fdfaa57193d29672518bcee4f10c650decfa3fd3e08a8d2f359397de00e8ba5a27e4ac08c74608b3d23f0639fdca8984d93c60bc3f1cc5bbf2342ac280e8366a69c70add8360c8459d57568563b85f28828a9b960ca8518e1dcc1ad0bfede71a0bcb455691c8e012faf94630ec7deedf2e0d79ca0dd5378ffe82ed72849dd6535417e7ddb8255701314e5fa260c13f9226ed81be0b4c81a5dc7f2d0f98a00afb8ed478d9bf1f36f9897d2844872e582ab3513cdbcdb437ba01eb610ec49f8bfbff297eb26f5f84e44bae2a7c286a438d1b6130891db65fb5b3ed12d9ce42623cef3f83cf908d49a9c00bebb30d1d08a5a647e731c1fa037d3badc7d77e3096a5a83d0e9aea518e302db9f552fcf0ad589e28e93982272afce15408709e122f1d714ca87a44515a61dde3d0bfbe8a3c90492fbc0b28e5dd19ec0a5e0cf48f368e9194d7d76738b52417af02641b95bc34f181ea0d7bde23bca6f64f134a50b2df513c261a1caca761224515a8dab6362cdc49fba943b704cd554165ed66fcabf8f96d1aa92955390047ce91f2c597b16052ad7546471b883542122803103c29c1d14e3ded56dd72e9ce72fcaca2e035b89dd5e24b50b0b8dab5921fbb12b835222008164e6de95b04ff58e03d3a39cb1c04eac922261e9ba5f5e9d27e3317d60330c22d353424fa3a21a9c40d55487974ce14b332910e397e4c3ec9b53a02154c47a50b08753359717e8c3184bbb849a8447a27e359289b4e00b98dc6f020f8e5aed93730f6c180925c2aae0a332f43a0ae45ad9d4513c8fb5a84a51b1d1a8ab6ad8539168074758604abc30786556e44549ccdc81e78c86fa2c4991a8997d0a78bd19a21daf44233be36f8e37cd4d27d7da810ccacfea49020a4f22dfb40d4a192e6e1b8ceeaef83d2f3d606dd5177317291fd12b74e63481c4a37bb3cbd9d8a08ec964522fe825d870be4d8717766497c7e1d00070f0d7edddef02c15b5334c360a422f9fd705a826a6aac200eba6aee197f6ff63eaab1aac89a5e74bd09fcd64696cde0d1e7f4ef7ebb12a51583f46e906127895874403d172df56a9b7e8f7da319cba347af936420380792d643afbdef0f9d1638de02394c325e0f61216b0df895a2bdb947a484f16a0185cb79eb40680317496a587613ca100edf98832e2bc992f99cc130a6c654b976da6fa7359abdb44c7f67642a51336f7e57bc24274ba8aa26ccda0b18acecaefe2d3d5c1d1132cba344aa918d75faa92314468514e1f843c0ca7e3788ad0bc2fdeaaef9106869919215ce512e0692559371c21645833ae83e122836654b449e0c9f4f1eadf4e4aebf8f2d337a679ced560cb95857a40310154052984d1c298890a7982d544b268b720d51a8f12d7cd8d14186dbb9c8c353ecb1a7cd9e741d2b20b014b591df91b0601cd63220cca4b09bccd510fa660e1c1af27256d7f7b1ee43354f47e526c8a5f03a156f97d9b70d2beb0e88780045d1269f5cb4882b6a5a5ea39244ccc53de4a8e1b9a1b4b93636f848adb2e12c0d2b95f4c1773d63b8e80987a83cc71f63e4f0a01d89060f84d687422d10945dc683efbf3b1f5655202faa5ddba052a9cd3f7df1cb761a2125546f8427322ff9f462aa4b440d61542299d7a2b71ffe08ec5c97534e095fb2ba49077b0698029539505c1556c1ed0552af07d2b4fc379153b4e3511fa34528961ce59355a2bac3e7c55bc9fdfd67dd12e7b17a7fd58df775d0c857aae478e75b5890599ef2c6ea824a4fc5a3e0604ff5cc7b06523c6f8fc548dce38a4d49937c847e5a4cf8a59dbb479e94e34b44d27dd5bb12f6816aeee4859791483e65a17c193601ea24d541e555deb4267ea3f91d8bf80cb744fe79360f6ecd3f482b95dc8f2dece127e46b82fd76a007fafc484767c8701f0798d35c5ee91409eb29e5007eec77dc52319f2696fce4e250cc34adf192d9b849d871a9fc9cf222a7df139a30e84f36347b4142cad7ff5010725293a1ed95fd7c2bd8a150d0d403fec9a60c7da7bf895efff669f1ae6bdbaabd06aaf14f51792f017cf4f44b5638605820d99db15540325e22feb3d696df8fdad546882e8895c2f7d3076f52e53a6d28f884198bace54f045b9379e71cf6507a4318af01a7ede88d7f4b2a9e0d8485baa18e89ad3303059104aacc667a9a7d09e4740e6f3bdc0020d642ae733ba14a7bc07b667c64041662b2b723cb1c4666081e0b0eddb10a9a607c807378fc0b1beab9bd289fdc72c217ea4b088b9e84bc03742028c3a3d417bae6870215cb4c8a8611d6588de8c9c92f2fc8e33e5dcfdf7a6b55f4c780d3189e88b8e2e025c006dc4d496ead35937c06d7d35c49f6a250db883efb4fd4821d89e7a89e5e9800216be0a8e3943f4a5b3d86dcdc34e586b0b53f2d94c31b6b871b97e88cf79ea76ab360574fc96268f731c157db9596f76f8614c469c7d1e9f5b1fddb3721b610232130f71bc33b79d091fbd6e2d2a77efdcc9d75d2d474a7e9ebadf335835ac51b53f6ead00846f767ccbadc8a728387dbf73dc4786f800fc4370ce30093194093ba16a4f50f016c3d4072cb2afbb7ac9aa47a22b2ff909c1502bf0d10c75e1d3cd214d8034df732b19ba8354ce4b047ba42d7332b1b12d76d0d28f3fe86b5b5672a75d6735b94f5754cefbd78b409f3ab60d9583938733c3c84df1a22879c93b321be42ddae772ee8d2ada636f0313aee7cf51485de5e54f42845e215109f529156528f9accfa499cab6681f01fa28803f5befa6983209c3455f20e4ed82a5c9246e72f432daad00155aef34c98ea558c699b7c7cbd568c6dac67e14834ca2c3661c0945f47054ca75feb5ca4f2754dd8572f1d37e38ca0108a1bfd99ccfb4bee45837167afa62a0f38a03071c2efbb883cce4f139c2f71bd7d82c5abf72a262a40b428c4ddea02995e62116b7096391c891d94a85dbb6bd4f530dc074a03658b01b73d1f486d30e65fb571da822540e5da71806e9ebd08f79faaa3244be36481072120df758c6f66bafed4578e096da49f8e94cee5a0e385cb64ad9b5356bd9caf66767dfbe408aaeeb2ab5aeaaf09b946a94441a913661006d36dd516d9db4e891b908321f087236985896d2ea2bfa47e76018f8f610b16e08b765a0ce9481712a52187be3e7550b9cbd0f6c070f9e695697ed0df266d1ad70139929c117e76ea878be3f71a5db36e1a14905696430029e7feee3eefe68c58b92a274acf08ee6f5742208330aadbe4d4e6b2478f2571ba960400150a11fbf437ea809f8e51fe1f88e6d5d90dd73abca0b9e529c81bcba5e840eef81179ea27f1dd2710ebf4268990dc7c7f0e8d4053f1f0a163dd806eaa5327e36ea288c7627b9493354459e81c03b57cdbbf179d593d3d6f8c3c0deb066b1b85df29c9244229835d73441dc37555e46f75ac10a23b06f2b809601ec16894ae5ec003a57135a02bde51579a38f40bfbbcd33202ef57d3b30371e63d723f7452d6b7ecb84ebb64109e65fb79c9369a6dfd8afd68d55e27e0ea4c3ae48df96eab763d317c0d41e9c426279c16f4ab95ada9f36aad04ac782ec50eea9e6534f80ac5c67e6b4d77a5a90dfcd5fc3bc1625d3aa31659fdc148df3c1051d5a860b5133dca20007fbb2c41ae7c25b40f2694df28206cfa114b1e84a8172d24b80b0a3756dec2d6249af220901c07c8ff39b1b61ae1fb07ff987db1b189b90624a27bf9a96ad346dc757bc84b62f8958c792d745b6e2d0e1947cad8b0cea1f47eb59edc9e04ddecf7f93d9b48c784b427738c9c923b9f76deb79a8c4e7c546a16b2d752ad134f331794cc2c10d018af60a7439127c0becce096712ee3096ce18d38a9ee6f3ca3b3abc68c0d2c1330d1c882d6e4b494078aaf32c343070c480552a5ab125ce787d9350d1190f2f769e5bfa4db19a13c063aab3b256b32eb722007884f60ee8a483e33d6d15a1df33035b67bb4a2760f275754fdfc09ff2d77cc1c6f0b5cacbb813d38b26feb059d005c5d75f811bbb4075b4d29db91b458c583e1b863680ff1af60b43e21a6326b76c4152219d9ea9112d0e41d38a4fad3e7c227f2ec0590a34f4326d8bb3e3cd4e0076e1e9e8d7b4ce632ca6697c64b455b113fad09d7d766cd4f00f080f58d6ff890d8b9fa8ef63dde0b50846d582e239bfb995541313cb2c60ef334176e9ca31cead592b260e3ea76c527054ddd0be526ebe57a26b448fdb5ed4e01e32be2f4b98ff5175aa5ace94ceabe57ade77d00986c749a2ed374ce0974a1f878a0090b7afab7e667cfe9a0dd0676fa01e9fa0c4ce7f713de01589a5d3f7f764c5d772dcdb58e5e4e3202b78382e16aee66eb7ec0f8bd9598e05cf91d983709d2c6a5f22e4ae90d829e9073ecfaae38d7e0f9cea119689df3d30a50c7397921a07e2def19157862b9480b8c85d81dd232ea8d7249c4687b836bd937e67db66c49e6678b1abf8cfc36d0dc67daa5b0d593e62f1047843ddcac1d5214f7ef6f381381fb3cafa3c748afbbab7c47de17918f56471f16c3693ff25a0d8e88091413a1e351aa546c87c6788ad1507a0ba2b469dd7df5342c7af3eac453faf355359d899cf32a85747ef415a0e67add98f2bcc7ce2c491c09d3b6e9ceddf0d65e54241ef15853cf55fd502ba06361ef1087f93daaea615af613e793ebf3e6bd7ee045f68309acae7b83791f0bd09c1b0cc318201621046d6bac146dae4e62f5417a8184e48f9b8f6fb1cd6445a6800dd8449803827878cff51cbbdb8835fc3a4083556e7842b6fead08db9fe05db4242d7cd77c625954ff0cd64c61fc52f8d8f68b3007d0db7588bde912265e8ebf0a56ec74ef483c1f772d8944959d2e0f7dddf2bfe560b25daa0ce30f9c2281f70cff03eed0a6a93ec4d17642eacd1fa675517a438baa5fe5cf34772265df0002b88063b3c500194974934db5d61ea0347c0b52695f303c8484af260917e6615899758c5220d714b5e2ed702bfbf4785fee664b900484e0e056e7701236db2e6f3c68de48a8be141aac3a7df3a100d07f48fca665e00ae55fb277d5ec271fdfbcfdb4ea059107afce4d14d7db79a671291838f3498644a27923cac7d57d46fdd869f420278e56306722070e11fa77b2d3d895c2c96bc4b0b3277ae68cbdc2f1381da1211cf52c5e7be78b915587d71e0606bd9544050d88a439e282704d26625275465d6469ec8252ea1d0204c6472b362efadb67e671a2b2d7ac5c0ecfe3b9cdfd4e457c613934a2c625c0ae1a6a62fabde805a394a397658d32a3d6aa7d7fe1324379e35f74fde1f8506db018a34dba3fffc4657425cf32d7102a5651661d62a0a05b37d9323676fd0759c9357443fb31cc784c295ab2b121bf301c79402a98c4ff69c842f386f830c51557f5600e441fb891c608b4fa5709ba5587767e201a0bbb3633413b67dc501440cadcf8e51b765eb141b6e70e9b0b7c2b25dd72865d015e4107386c41a9c76f4cb0509160e7b229476da8435803838ef18612efd5e842731a92bd18acc703409996e4ec1a4f7fa2e4a8517c7f172e5d6906bb2887322b74038433d311eaa042c7fd3e4b69a91b55e96036d4ec4c4881f2563adf22c138ebcc4a310e195b0ac058319141e78b31ace643ecef18298e772dc31656211bf744b563392c1bbebf43bb0292621c7c4f326bb1d84d8b255cc75bfbd2301ab8e3095f5db0dfa17c3a6770beb62e60e2c060da488d62cdc63fdd3d5ef2ef681e98c43a983c7b331a188609e471096d5521c2c25670b15882a423226b0d06a1b364efd7a13091592eb649f70267758a5a0fc2b49a26cba3f12653bbbe64f8502de3f6a71731b48c10b00db896ee055047d70b11522414488832c959b7bf46ebd4a2733958b4573466724bdf20993b57d513e6693cdd2daece561e8ce55074ed4e1ce00ef43cfbfaa699aecb2ddd89f95852ff4ca8c66a5f2a0cade5d5ed04cd00afb788584005374772911d1d4f73bd67f0b00c24846cd221c301d4f7c9691382f7843613422582cfb98d458d537b2c7a89a3584e7bb7904c15a4dac99a34594b70b0a8b3d7bf55b5cb0dc4ec7e22cf068a33817530bd121f812177d9c3d8e6d0a7d7509855453880239d2bb943ed0da28f0b483727efe00271e23c96dad974990952be5f6f4993b55fb5da72394c70c4e474fd12e5e2829b8471898f43b86b3b11dd52777a5f0fcbdbd261b5c2b390e4471b1086df1762511559ef2192e8430d5db1ad5efad8054a249d51e274d4d69703683301981117b9c105fe0c4d0b84a6499a3f9485570ca6c6511b96c402ba43c5d6d52195421b3bf400069dd674b88c61d179a69e5e9e783da82f3134dfc470fb0167455b2cd56e4ac2c964c3c6472632f1fc13aa512314f6fd1d404bce8db50f527a1b5e53deb721d896ef9972c91a3996375a3dc143239eea66428d516e769f547de21349afad15bbff9ccbfcb6cef228abe8cd41672a71da8ac65e0aff3c1781f3581e60c0b682e773faefe688cad913da4ddd3417802c680b3a424da87c04657adbd44baa7a15e5949859a2b7747af23307e22bcccb3afd681ceeac02cce26964ebd96cd55e3b20c1e3bdc3db72344e5695709b0f620a1511fc97a886953e184216a246c9e97f339c6b60cc6d4ab182a5851cf457eb36399947f1c5bc7b73fca2daa35c00923e9874ae072ed5445f29b0352bea2edd3bf57e8d61861cd6208107b6612f11ef05c9fb19f56dbc15b9bdf74431cf0cbe77b3324b8b5c103bd04fd118704266566142803ddffb8a254dc9fb30d32569e5960d44f0c3ca4f12efb3af9f3518767edd8cb4881b6ab80987b83c69648fdf09036e371baf531201eb46f3b94413dabee72308973c3dce28f4032b7c8a60d48f4c50793a9289117f6f843dd501e70b9cfa8fece9b6e7450a1f5558e8a93ad2fedd4e9bbc31deb5e1c8f5ee9112e471afa43dd1de1ff9b5236609351c359052ce32d30f4ef1c687efa416966bebbeb55d50b77802dbd7871b64b950a5d3e3ec73e968543156c30fef6d60c5d3f0b84f2cac771fe67f13434897c03c03f8b808866d890b21e566a667a15eed57c66397a4041769f77e3f62417bb847c5187f2f8c4bbf848f0223f3fedc7b8d65c1632749f3f2c6c45dbe7c7c8d2c0457b7cbd9ebe06660d7418d60fb7b41169ca6298684e8a3b6cb9212fa805876023a5b00802bd83810a927f586140a4a294ab9193deb7ea4ca8bcfcf54c34a40c1eb76cfcad2af8f24633a1ecbaef5f1361e8ec4a5f4126072634b6613dbfef6b3f99f8c1266b2e60c93dc4bba42eac0bd869bbe672540813f00b959d020c31268d349c7ef5eaed749c9a31eca66555320016468ea05856190e27e2ce238531e4106ea05ca30dfcd6c63030a849fa2031e1d7d46b70b5d9c08672e41f2890b94ed1304b82b73e252d4fe908171356d6b08395aea56ad459b162d2e5b69a978f0cd763e718b9e42e2140ab03608ee13f56ef361d63161b9e93aa312bbb01017cc52bedba483266e05ca06067ac420322cc2ca467cdfdf36f0f6476ff57e3364821d3b80d38a92e038377ef7d22b62548ba42c5d40ca6c595cd9a89a9b1ca9ebbcad9aa2710a6a35f41ce408deb72ad7ac63a83ae4899f7d974535271f33da19d6544ad52f9b12dbb3bac3bdf2efe057e9b1bc53ba85ff301ac98b89f42c5a7b59d1da8d41b5334e11c19c8ba14e3931cdfed72c5557f1fd51f70a67ac9e918cc176b82f69d1320978a1dcf68c5a8c11e3bb874927781e51f73e3014bad315caa7e362500a77a5aa62dc1382f68d5f64a5685b2ea35eeaca550f9b25a1925db177887783a630f48d6af0ceb5825f2996ad95b1417b74ddb305fbba1ef334efddbad6563ebf75a53eeb507d02a258814446b4382602626dc884730b65223332bbdc7d8ce5d8be3e3b8eab8d0ef901ecea1b544e40caa021675b160daca125ccb876be8a1d6483361faf329d1ed8e3d2f485e6622646a67f1bf4554f3a1285247ff439ec49f55d1337d7b62bc6e456c9f030fb125b08fe0d52daa13ea1d8c9c05eef7012000db45c30928697ab8e0338698702ed33840f22a8989a5a88767c26f1b2f199b4002187866a248f213851a4cd028e41543a627589989131427e04deb5092ef1ea9f1d1b95b92070bc95daa5973e0dcd41ae806c7265364154420c4e353c88a9281d1f8f0b1a0acaf218f6a16493f1cf6063017e0f78ea095274eafbeed7af3dd11c91584307341c56243e3e919eeae644da3e309d6e3d07b199397e4e65030e9a102b1dda0b4cd34d5a39b3bad949907376bf1ab89fafbaf601702bd06f14b9c79a45363c90a59e6c2d41c75cbdae6c60eb0c92fd97a291844017bb115064be0e0d6847e731eecc27101eefd3c689c881899f4fb8e0c62a00f798728da36399c20c0cb9665988eb02950973dc8e5c3379f4ff9797057af2e07a9b08a1e2a1cb87f8bb013681f479833e9a19b36fa64bae9fa6010460417ab76b77d3fa989fc1b465fbb5d445b2062d7f59481504e86f93ec0b227dabaa3fda2cb76af43fce2afbc6375dcc1f520f75d9cf656dc8a31dce8cc7628f2225a0dd40e2442b42bd45b2bc065f8a695503d0d055182a3556d4b2e44347a57e344c353a70e61c3bddd07d99d141abde2b61d2f592c6d6d58432e57517585d1a6690769bfbd723a5b029b0f2308a8cc855c7f0abf107f023aba6dac1abfb12813d2c25c7eb7dfdfac4d00157acb0c9c254a4ce760842029a4dbf075c89d6623d186da750b860e7b59c51c33c9e5acf56b876a0e6410b8ac3ead9ffa82940c8b898d39fc8fb169d50972d8b138dcf29fff1bc3c7f23caf51af386382712e0b28e2f0c53931c156b7655d1dd6f13a4561880e3e5a32916de1a0842256bcf2cbc285b668731a3d3fe7148dd1ec19860c04af68c20e4d965a23b89ac6bf8d68b52119e709f471ad8b2ebf0add39db49b1511b32392d6bd4dee1a081350309192f0c478c90025f9aa2540edd2a065d0a9b0d74748afdb3d162e1ff41596a5a8ca24db7abe4e60c8bec21a80d9f9ac751320364349dc74e174cec7ee3183ea84977aa104fefe89f08d15d36a2233f42a7defa917c5ad2642e06cac56d5cc51ad914ecfb7d984f4199b9cf5fa5a03bf69207b9a353a9681c9cf6437bea0c49d9c3e3db1f3fc76519c70c40cc1dfdd70a9c150943c272cf9eeb861f485f10100c8f4a3e259c6470501932782512225ba64d70b219cf9d5013a21d25d6d65062dcc6b3deb49d58b90d18933f118df70ff42c807ccc851233a34a221eca56b38971ef858475488988794a975d3894633a19c1ae2f05e9b9c0756affd3cfe823ccf29228f60fa7e025bc39a79943325126409460926b057a3fb28a1b098b938872883804fd2bc245d7fd6d29bcda6ca6198f2eff6ea7e03ef78133de8ba65fc8c45a688160719fa1e7646d878ea44c4b5c2e16f48b6082eb310bebb020c954cc0a91aa07e98848da9d1ac127d74ad9283746d4a6b13ff46b35773df98f9c7b7c8c5486fe5e19c5da4147f1735f731b25f1fff17ca8eb3da44beeae21a1c6dbc091cc85ce88cb1c871b1285d1eec81b2bd480f4e0370d6580bb98c8901ef07c8163202edf2f4757cb73a406ab4bf1e02026f26539284d75e6cc9c12afcec167a5487909991b357e8d9025fc683f9572ee307ccdee415274bdc72314e478e2a31689ff9f65133b97b5bbbced70925cda7b3a47b2694bc56aeff4545798e6fa38ba6dd977a9e004ac2a3c91632b0cf01fb18c7b9f110d4d5f639b586234deb22f7b3e301ace4a36c4d65bcde50174f649766d3f194e51935c010456bd1e29b28f40422b0e3d197ae8a06098fc5a941961b427bbaa88dd3f68b17777f1c08fa160f0c3f3dd5d15771f7092192e9e32ff6e520018d9277af88c5b3be38581d727ab7507af0e9506d6712e3a79063517507838417e2e93f066cfe799c101c8cbed77b657882a4fb33ee6c2a0df09870bb5884e311432350732393dd939eeff319bcc9bfaa6b8f2e55887150c74c1fcd6d5a47c1a036c738704d2464375d38dd2d9b20c3a3040e664cc5b0dc660b5fd3f5ad7aa427265b63783a3e81e9a38da764d32f15d4f4b92f8416a9315ca6df00fe926c0f28aa367e058b30cb4d3a54ee4a25332ac2a6060695fbd9043da723f0e2d9ba67273b0ec4a2b0a9b4b46a351e67e1eb86fea07b77ecf5bea96ba4b5004cb3d440a5414af3da3b17b2c1bb94b428a9969eeb6c8ff00394c8b578f808db96e1482025555168168af969f7b70a4c16dce2e70b72ca1b8449959cd849a5df5bc2949a1a0fd8bdd230cd2eb8e4fc42bcfc5f03f14ba036b99493e42be20277f5d837f315a94751b7cd1195a7bde13485a8595a1f6fb8ee4e06421fc689a5520fa2a0ef8aea03c011a0552326ba5fae0b41606df8575aaeac0f3e944a8904ea03b27dc3fc2ab4758a6b065bc852ddfba85802c40e8b2c044e1fd8062a68b7ac7c781d34dbe3c00e7c7da3940f2fd2b9f76cbee0e483a36bbec8acd9e8c13415c4740da6ccbdcce78268cb806d99d47572e00338fcc93761789a3b8407fae0b29626dd8e2111119d16acec955639699aa5627e50d9d47e6205f4e298fa9e640f4c10fb7f8b7664abb3ca65477b76f8b609646ebcee2def09d179508d4324248860b2e5ef6e560c7fe441e42b2ffb0844095672d1bc4defb5858803d58424a8ba7e9d2b524c589f962293d794f60e2ec13fc91933b6bd16e17cb16b160ff87721e0304a4c97c6848af940be295048c2aa172cd0578fe3eb3a3185f4a37948063b500cb132f35851dac2c9165ce1336a8b2a0226b18a6ae31c4e663f12427bdc7328930ea9c1669de229ad6eb40b468cd0e2e98ad648aa85041dd2b8f6ee1c7075e453a1159479bf5da85e25a3510ab017cc337b3a4d3b478e4a6be0a5ee9258901ddf170aef1a3c89996be9cf34f86acc607086520a85a1173e9244c3c685fb7e3f85df0e23c0ac12a757197c2988236b2a412ac1f322383b74d663b5085fef8cb3f87773f4f574654c90335ec132508093f5d6eeb989637787b8bc1e16989b3835976ee0b5312c1de3a7d5cb8eafa889283f295ca033c937e1b9bc5383b8852d1f0323e8f6fc4999172e6f66d42861f1715d807059b9b0090d49f2e9e24843c7ea9c44d13ccf436351646ea544653355ea017aee3873de7784e9de6594c04d9522e3305df912a0092d1a620b51be83331cab870aef0aaaefc32a0d4b1da90911427874d3ae7ee5f6f480d80d8eccd7f563bc237acfd68bfe528ade0f0f6b0cc8e3bc90c6ef6c9bb952683f204df8b83959c3dea27d70180fad7cef25ccaedf28613002cc1e5427ccd11105e821ca9a6b895327165a5fd5b05e80af23f7bce6bc55734947cdde20addb1bdac9bccaf4f85cda8b4af90e2b7cc026ac8df34dc9f13ae6d2ce6052fcd8db091c4941725e8c6eda79a4cc03afb19cef45d851b9df737c0b4dc4986b32ea7b3958eb82494d8419c370d865c8c91b2f4b29778589bd9fb36108ceb87f693f165cff34e1c8487bf8361f5a38d61e05f1bac5f02145eae25b88a2416317f65356b49d99d267b5d074a2c38ec7a4050eaebe99e69776cdf7eed298c10acd60d39700b2aee6b03c2e398a1bfa94cb149190e713af6a84fd2ce7ef5ad211f83f1c61a1bcc8913a31e1915c672222a3c33b6294c1df1d08ff1dd12f66d93b20e7ba31183a9b645e4d9726aa5399e3d6a7687e7832da216b2a3725235b5ac8f00129afe4ba7bd294c5bb63f46fd67acc27a55ed1c5450a3424f57e6b96eb6dbe11d718979b0e5e8650cad3bafa4c3a0cda8e7e62278459ec75f52758a7ef7c13706f15917ab78aab7551e07ea18fb41116607789a83c730c73a2ca7b1cfb8678c34e2172c7fbc96c89cd34bff3f56b6181d7b4b8e5c1f81cc48ad26354740f5670f0c6ac116fad5234a92aef4031e286a360c0805eb95b85df19c971ed0d99451ff36fbdd57798e4dc824d8d34b99be8d178257081870fe039dc2a57551c96cd16c2a72882a83eacf7d5172a4fe11a10b2aa5df9ecbfa7a44b4e8f641b159a46fbeae76ca775e1132d0e0246d06ccf86cd63d49cfec7955ab9ed4328adad164b35d8bafac26532afe2b9b95384a13ec3682113ca36336b6bdc34f0258b379d626b289c63520aa5eb9f5486e0cb22da5f398ea61231879c6048c200eb424981f4f236f636e4babd4ed95b056f226644a2a7f906056f48aac075f11fda515786ab619072d5d909eb521759bf6f08efe04649fcbe045ddb0914ea5e877346e5fdde4fd17cd0cd8ca28defcd1f611d244fa28606389f6bc349d62c76e26681796a0603568ea83097856ab9219fd5adb7e55fe2a1f05737a5ef7ca2b6baf49f965dcb22bc22dc90cf066109f3cb3d58ff43c6e65c8f9c4fd76c80e3ba7bddffa13b96345ec3ee5ca7a81958b03c189d7edd801792610ef2fc437b75ee9f63303ea5efaedb0c4e22a5ecfc3bf33cf7e9cb3503ece01f0fef7906d4cfbfa024cfd30f4ff8ad468c513e37721a19784bdc48ccdaecc2141f83c2192557ca38a32ce2ea2fb8321d1986f52a2389af6894d38c177d7dc4eace6e8c0cd5a48aa36ee602c9175425fa76325f3778e13178536e1997543644fd8cfe2b546e4c7d7ad879972e8f52e56942c1d0e1fad72c32181a65ef07aceed6fbb1248267a61f498056347d003afcd3efd3febc11d20c205356e560f0280f016b360c195a57ec79e71a5f571282d8e4ddd73d2866486dcd85a23cbfb65e42077bdb467baec861a68d247c2f2eb105f6ad5a10a960c0bd943f9ac03db2b60443ae4f683bed7e1b39d3030f77cd5c1093debb1dc189d1680ed18f147d8da5e26072d0e5dc8eef75ae6934adb366da6546d298b90349d119a7fc2dade1afc458c84a2e43d01ba31d9eb047cb8493b2807a397176e149663efa0fc4f12c8187d3f5c4a616b91c2f5f7538aaed4dcc7afec863c3ebddd0f7447f9d038290bb76e07352d6b2e9f8eac7bc72ec879189aa4c9bf20e6c7ba91ac6a31457d6c0a6080abb854ebd053a7bf2eeef7b3ed253b6d67f54bf8d2d1a37320f1630623ee9b1bf58cc6ca97d69494d871ed55782a32748ed1c65d274acd3130e133bb96def0a7ab598beecc50dd9541f71897644f082005fa98fb0e4e974e63a8bc850c03e88c96c9ac41b6e80b2930298161f7be44d89619c9bcce058a3281ef074acf840a327e8230aa9fc7a5b76eaf2f9c7b9c6e0607d66287b1962d45525d1af4258adf012b2c1f10cd1533a9c4302a2e36140e1121d86943fd2908f09d9bff69573dee626470825d89f93e66f7547b01714bad61acc8e9dafbe8a4992c50be93acc4bfbbf2f660781b9b4d56d2c429fc736cd25e704de733f3f988aac5255d586e48da759e65c149cb24e8e11c283c06869d067035106d362d843c8931c2e6a2e3f0c8f92e65adb8e1bc976f9c27bd09f006d0ffc2b982cbf0b249a038ce605855e510ae6aa02dada48ae3681b6ab3ecfad1b873e0ef2fda86aa3655a1f2d4620a4e3afb1cbb48105db7533461992697ec234634575a7b4b35958b1236d549a84b54ce4a0a6107c9556a703b365b1ef10e2703aaefa36e06469bd13ebd -MD = 2ab21ec8d42db385b3ee428eaf71aa18a9c7e2a66a462125ed710500e71049bc448d6dad35b66edaec37ff39997a052e98dd6ae78c141fcd4a23f4469a57fab0 - -Len = 101608 -Msg = cd36720371f56dace87c59a7fa7eec63aa03de4517bcf09ea4932dda578770fa7fb726449abc5538753cdec795bcffc0d6b61b8b52ecbe1984fbdc1bae33597277a6cee7d97f8b1d3a96d8c3d941810e6c6c916708ec5d614010c4ed9179b6d1fe2cf356f7e615417fb0d1058eb27a37b44cc6420063d55c20f96fb9c9018efe5a711cf8bc98fd8e8cb250f47cbaf222f67f448503fa2ff46cdf65e51f72e9e1d39cd135ef3e4beba8c5def86afff2b77a2d9396d95972106be92cdb5875cf62b3d69b755a7f053f1d110279222981de877c39df4a27a69766404e013fb1496940460020c304357431bd44df6ae1a87f6797c0c61e0cd373a50b53c19bcf5edec4158a9ef375e2712df12c930bcf6e8260a4b0b51cb2028b7073c182337617a9856ac158b279151e59d743fbcd9adbcfbbcc8f130dbe3bc70fa022abd04f7ab2cc6e2cb4c7b8d563fc94108077eaf74fc036e748b9db840fc9b9fda63a0192e2e048531bfcdb2a285f531b8ad369cbe8b60b3fbce8afe74be8e7dbda3935641f0b21bef6178a1c55cb3aed82a7bd5e83e77220d762e26b63b25143af9593fa529321f6abe16cb4d286710dcebc8eb80999941101ee1d183f7020bd8d15c25b64c16f82a4222af987d82103d8da85e26015989aa25608f7c8697bd1dc836b8f3bdd34ea47a26bf45d0b725807c849e372a3a74322604a0fe4e78b0804a5359fc12f97b7fe28d8ab3a668b93c25083c3258ae995e9d58b697c3077e96d43c992dcfec170307e19280830953c7338db8b631485175f7c750b798d68fd8027ce707694da9d446ad573adb2b7dc8149f8421387a452ec1faeffc14686caa318ed41763709c6a4b5b49213341afa544b83f01d2c6dccf984de4d3ea3f8da3fddce0ec4307674b727608f20fde51e5406239d684b090fec74aefbd6ece7b5bd3f18de48c74a2ee5877e71be5741d0e9428152de2c9fa32fb7c51373687ae1830674baea43ad7d969fb941d48856997bc645176616580e2815cd9cfc60dae8fbfa89a992eec6e83235b60649d94b00725b16f2e8535cda41566b9f591c2e528ce200b3280ebef7211220c80792498e36c99ced4d29d28ee141492372e49fa59d8880e094ecbc32ccfe9d90f5fb77c92fd8800f7be1e2b36fa00f302f00556b98b2b239bed0e92299c0d565fb5cfe3bc54f6a605bc2b6d0553965ce78b7772be4293dc58e016d4ef122724f01fc056c61f801e9d516736dfad4f10635532e6ee9b5cb8dedc96f3e3dea1956ef24b5e36999eeb1d2234413c63b5edf4e1aa1bb0f1d0197c16e177be3e17483ad1c362847fbd9c038334f4821355262ab55f99abe2b89edf4398e8c4dcf2bdd242cafc361e6681ff18cbc9773897596344b5d935ea50b976c72fcf9e17ce66c3a9c483d212246d5e376b48524007183d246f62f57542e9b1361894b09af4c39d8b32b1cee7619eaf83b5f9c9c62eb316b8cebf511009b03cf4e5b092c32054be7ba7deb2fab8a671622e46344778ea9e866656ef571fad78a809dbbb1cbbaab4df9692f4e89405327726b628206fff2321c8c20696ef21d2b4075ea0243135ff4b81472b2d8e4b612741e22bfd9e9142ff68795d6c12bdf9ad60b1d8661b771c23fa93bc3601d99bf70232a64b6f218c93c7f55a5304e24bf8a88dca5ef4fe8a1d54e13e9e9940316ada202d766c205e7359be63c8403f582a314afc7b382cd78c42b818c3af0fcff75c43382b102e3712a04d20584f159cb6bd61f5477f9272e526a0d141cda8c620eb044cc5e5aba4e63e1a166fac1588228f7b3b4015bfeadc8303fe957fabc27c18fbd1c37719368285bd9c9ac1afa8f239ef45019515bdc6ea8a073b3f79336d68927dc02f075a6c19a049564a548daa4f4688e898345a38bf7b71bf87a197795c50973887e69f075c5a932e80a494bf32199d71898c4ea68480c47ed2a57d3466ceb4991c4762e8e05510800f005cb574c0f948d39e0994ec128605bb0543030a555c6e56aa4485281837f76ff85401a9e502bb10da299838a92cf0ab319789c99d0524b17fb270a62c7ff11e0d094823ee6064cbd11d04fccd2fbc2dcac91d270e3558c7384b1fdcfa5f0983beeadd854598b26f03527fcaf714b4bd317651a511737702746cf75f1a6bad4b7e875630a2f24064f1786d15af6296c3f62dabc64f360bfdb496ab8ef51c58dfdc5d26d86f238b581bed615f6e9fcefc893daffd3ff38413696680ff22f798ab58dae3cf0292efc2f32fd11aad32b9a17b44c2dc3c328bee134b3c222c63f958649f019715d70a1017ce50d9f3b2036d4cc178c5ec896fd842b3119a6a17d741800804c3115656c9ea37450fca9428aa7e42565cc95ebc7c684cc5ca7459cf014ba461d57d97527afaf9424eaa5f96036035dff35b290e44f466ad24c3c05d1227f29d40b310898dba92ccf91b8ad7e2c31a7a4c0a8eb1cc879f5c4be0d1fdfe95814b877a68689cb98249a1869c6ad2f76eb9a95fe6637d926547a244051e2124cec12c0bf58c0278464cda841acb5e7db112add3c68fc29546f3ca75d05a144649a2a1105e4059676d3b068c7c85efe67029cc0eb5834610b2e526feda2e528a7064890ff9322c0745b8b818380701923a4386592a0a728537903a3789076661d18b46535cddd4e89e3a51afd3db2e315e046f5b9a71d273538996c84361ca5ceb9b5b92ffb00e8ba54475cbe68ed01479f0d97e8d55e06b8535af19bfe9f8dc3cf95b4768351351194b96f4d67e91ec1c7d674a892316ce5b28f5b444fc6c703439a7d91cf99de958c437a32a46ee08941e9b380466001c23e7fd108915afb96fe0d3d08459f8a4e242da5f68544efa9f68e7ef959b16e5add747c6d2d24d085e7361b644f2de24545be1a207432f429cd0dfa9934ed5bb278b483fd89e9efd7e55c402b54098e81d53ffe38d802970fadad51eb3ddc6fd4f8880f400e740094e2c8d3e8bcfc350abdf87cc6197a7f6580b7ab74dd4553c7433848bd248caac4c5c3fd20eece7fe9e631b9539f6355332d732fbe7cf1af93430c55fc34f895707693e65d544716253732e066d184c07f9c29065083a92a41de4c5f85a4816aa0dc80b526552f9fc69742178819a76953b52157b258336cd7fe3f8de1deefd15ae1d49304594dc5d5f0ab8640de92f7b660a24b6d65571e608a2e0897480a71a86cd5a77ec86a2d5929b35716890e13b185f60a0811dfe8e16a61f72f4c99f39166cd1a1c0b4e825a2aa3af9280e3654a0c63bb0bc3917164862083315166fe1eb502136688c16ae1dbc3b93d2cd9948bdd3287fee53762f0c6b3d426bf373b5542bdbbe5a88b8df4245a9a9ef5b8497ce0ab956ade97628e12611196fdd55240f5453920d373959eedb27d3e44472b24fe150ed7167a1a45527463077508eae7b6e4b69f724327e41e1188a37f4fe38b1dba19cbf5a7311d6e32f1038e97ab506ee05aebebc1eed09fc0e357109818b926e0dfd0e3e8501e4ee4e411b04c3f8503824c8ba8b68f695807b7e25dea73b702d0876d48031f51dad163ba43ed4b8e5f12b5070fe9b5b7312d2ccad00d9c8c97d23a2b8cc145bdfb439784af437a7168d8bce88a2406c3137c6999cfc83a40cf2d209017ea6b6a9780a7f95d167138081b8ab5802d2a94e43a97d6c4e5f5dc912b60265146386197d1bca1b32edbeb262546f659cdca328eb0dd0a162a7766c4122375a39c55a9e47efe031a525e90aa3c19347ccc8ea6f72664bc2d6065e9522b900473b6694a64cf94a7fb4ca2317ba92bf553f21df709e35374714f6a6a22bed05b2a5a1d4d010ca715bce250d583b4a3c44507202daa31d3bb4abe2cf31c130a02315119b9a27c5ed6c7dd1085a9a4aa26bad23e51c4560c172076538b28716782ee6304962f68e27182048948d5c367a51a1c206a3e9b25135b40883b2e220f61cb5787ed8f185a6e57216426ef5703c8cead6d800048473463e2730a166c292a2ff749c5acd4ef56adfa4827e0a9a5173c4dce9cf2a59904a024bb00c898dd628209f3266de4c9afeb59de548e01761bcdc4ebc4fcfa440a7bd008252ded55932b562c18ba8f0f047b04ceb4e2a79e5be9d96b03068e6fce5aac04822bb5b64494a69da47b1feadac4c3bf4fc4e24460f956f75ef8aa43d9a682551eab362bfe24c1edd198da81bb2e605a2e1dfb90b0630136dfba96e8b2c818a30196bad948436ec5a8fa09fd2e21a14658d33aabd591a2d18d349a85e126369734d287ebaa5977cd2f87f385bc05502bd5d0e7bd57e9036f704ffe42ef2aa6d8be49e587accea2ac7028e242eb4233b3aefa4aedbcd5ebb991f10948633b2f0fa7e11ed6d70bb80b73c61c5b46401384ea3bab648ebc2156f70304bfc5c098e4f88479ffb27680913e47eaf95268b746917a514a54066eefaa6e37cf9e23aafeb8193d2ac678c4e7db9594449920e9a2ac9f85c6971a9a2cb318ea9e74cb2d06ef88b381997a4ab452966263a2d16f3f42918f00de626db419eb6557d220e9a3a5b92329b5e2dba1a9349c7ff5e412c75b3ab721b145af30e4ceef203d8aa57ee393d44da2193f56ea5589bf1bbf9adfff814551982b27471da8d2213f712b3fb0001013e6883e7a1de3724c9bcccf31374e80b71c7c9ea2cb6354845f3d418d15e81da30b96a0b548c59f4dfd7279650a89b17cc4a1dce9f6e6be6e2656b0101931442699aa2cb175e358ebca185f23811b20c71900a9c3a61958091a253f71c4c4cdc4162eab13ab25e54e89284a12a3ea15c1a202cdd8e4e4697dc510b8581e8900a40c89e686f3738d9dc20902da78dfd892e70f0fd1b72f3bf2af80e16c306825ef0223a2b054b59a01fd234f2408e2b0617090385628e2148f5ede8456014a83cc8164aa39d6d352a1c3def9985cdce756c6eb100e3ee53d7c5c9067be9915636410b4c5ca81b5fea69ba2c7dd7bb3c39b708a5fa20120fee23100534a01b30ddf377bba0b5e44e5370ed7829c6d518d55f6d3edb9797c9ee963940fa5400ac9647e2152a37466517da3e5f27c3b9c8cafe13082fcafdf67b87cb665755e04df1b6e0e553bcb04889fe234df26ec7e0acfb708e513aa339f7804cd1b636488962d8eaa8b7a6c07d3c6532c114188de4ddd03c3dfa5725e8f508141fa16597d38c2665ebb095e557a1a7f364f7618a39e024ac8385a104a7f697d79ca3745cd0b017f90af8fa9d8c5c2edb8636da2b745651681b8dc8bddb6ea7fdf536d315f581360aa2db55676fce7251c13cd31018a30ee5526d0eb017efc10da5c61241b66209112fe236c1966b0b0c8283eca69b5885bac4ce1399d1dc7b7d2afba26e97f4f9b32ea80f3a84c4615266a6a77d70d97e4eff0b57c98dc72fc2f12213fb1e9c80570b874f40bf6d0dc9ca0f63f33db851184dbf4bcdc0326675a4e3e785bedb4573632a9752aac778e94948d2b65677a6ad4d5470150da0a81b92bb8d8cfd33b1aeb1ec481edb663b2750cd54156f99d7847a65654dca947d1b5703867f6e384d5f645701d3c5bbbd0a7d1768becd916c24615c8bc68b704dfb7e7652eb665b810c16f5353ffe5a87092ab1911104f0ed037eb4542dc4d6a342556e834f8a0fe54b363152a1e9a511b9e6166daaba2ad2b83f077ed20b3a15768866882a5dd7f2734eb5fab81c3df5833bd04eea31b1a5a93ec03c51d31d0d0e93f8e1ea3646214accdd9dc10a779b0b9859c55e2027ee5cea794d2b90f1f280f480212dc7dd0a083d22ac7b49048aa9882d5174e9f00559be8d01ddd94b7e6416b6b663670f15522c2fa7453c473ce387c583dd139c93164795fad7209c092e96e71209b84ecbaef65f3e9d68c23a4013bcccf521900019020ea8a5eb661b56e1abd4af202ea575383bb30263080b55c86dad3b888ce4e87a619bd8be3c3d63837f7eb233212b5b7e3fa5129f8b188af262a53edcc5b9eb0d3934ddfd80e7daf8dc70c155c8d5b814e5952c92cdfa563e46356d82dce7c756e014244dc69323be3d3b4b2c882d11b8c7f3ded133195e1862de561f54f6d3d410aa5a139fc7e4403c6ebe1be1aa0eb6516197df6d0df90d43207706a08fb7112577ddd35f0e832b346b98a857d4f5ba1c3ef601de30bd79817c4edd61ead77aa8fd2e2196df96dbcfb279566d266d10730c680d093a220988724c07fbc0bb8d15bac972d9a375de68f3ceba9416eb76005a6c457082bd29d2830d2ae089e9c4e6314e4b8a02c6af8a7017296f4ee7474e99814f9692e546fa2ef09aa2aed8ceb4e11b104a760fdbcee7c1374106e700b85a25800de3310d69e6a4ebd4b81ee6ec5ace657d65a7cf809b7b78dc07613ed81cf78b291c36d9ac4a78a2d93e02ba06fec6cfa55a25175a3ba44272a8fc5e184245d58a765d382bbb0a3432994ac49f5d929354dc0e2fb628ba48b7640eeb136abed394ba2aa582c8d83473625d831fe7b064fe63c9952ee34bd01cd12f623416b119fa3015be2be441081e119161f33dbeb92479fdd41f0bd79d0578c45004a6cb2d0d70a4ce91adf343853fad0dd3b00c14499711591102cbe423b36430ffcb7b6151045e634e765d5b6b34f6d31c0f26eae0338ab0af58b769da298591afc5307b6763b918dcedfdd412aa155e467badc18ae7e067448e1882ab33bede7f5488bfb3073b6ba77543322e077efbeda5ff1c9c1ca8e97b037dc3197a669408d9f2c2c6775bb8489ccbfa1fc59a586c1e9970b65a5ab3bd6945afa756133eb6c5fd09042ca0ab3ad506905a7cfde06c361b524c296c5276100eacc76f5b5b03b906170eaf9090f8ae619980862030489ce335dff254424fa8474f1c2e95559a23ac614868a225fc999b7a048997a49bb38f8fe45da90fa4926e0af80c57dac4866e7c43f06bc6d116e2b668efdac9d00a7ee4fbb3e1171f5f0164fd8129473d61cacc83df43eff0b6f5d32031501c70024fc988ad83050a7eafe18f3560274f362fd67a7dc12de5ea3364cce69e29164b60a20d9305361061b8154f91c2e784842c2eba5469fd2b3129cfb1981b5c1d4660130d1cfe46abb8b854912e982467dc3e39a61bb4da3b2c5788809e6e320f73bc7109a3c49346d42f341644765a839ed48bd00c2841802c3b33bc81fd576763d45085bffec87c549b4821abd3f6424c9da9bade4acfa4c14335c7eb4f28bf87463603ca1332b6ba7ae545ad47943e75e7f7e8ea82d1137c1e233522da12626e90a5f66a988e70664cb014c12790d2ab520accb9670256cd1a7086d134c11a8a3204e019f52843e89f2d01a02a88a94d4a66e8d36dbfe924c6922f7ee5a1225aa8e75340cf8cbbd1c0b08e9296e81cec5f70cfc11d763523b12ca174433f246073d1c2877e4812828fdf2e41134bc8090fdce3faecd1e54a58948f59f3f78b2c1148b05687d712ab2b2d630416001513b9efc7f9523f53f92b6e4ba86e56e11e0fa09f2672b6269c411fcf8415c19e9d0c4dde34f43b1bc0a81e68e82909a0d6dd9e017fd561b8d6502ab629a8eccf15656ba9463931a7216d295981aa5c64c6e98569db166653f9e6d2c96d360e111d63cdbb9597df70abd913a01d68db876ee1fb4ac0cc30827763ac8bd743922f0575e887bba67122b08a61df03eb03934f256426b95d6ccecf552c4ff05805537e1a409020dbb317efdf9868edb76102e84254703d4057936239b6b830f9f438d7cf6a575dae01daaa773bd033448070bab740d9c51b9d6af09fe04721afdb49b313ca6fcaa3e9e580bfa0976d18ce473702bda5c955bacfdae63d6f3ac027009075e52c1033d7b303377b40f3bac7010d932f76e2751c3c81ab32a2f4f163e7e0744f2e970457ed926d304f8f90e7387f171acf88f05e3b956d4484e8aa1e7a238d6cd9f76be6dfcecf44256931cb583bdd0402356ddd47769b07877e50b341ea2fd2d099f1011408ec4b554923cfdaa4738fd1603435dab5b2e02d2e9bcea9a4d9f584f72a3324e132aa7177dd814a4968f29fa1e9e48fd35352d881d1dd4bd42a5979a77e098cd830d5ecadc57c31ab2bf0df62f565b14feaf43c10a94b93088f83212372d0a66e65723933821d0b4a4aef133bfd35f99be838aa4368a609b277e71de39f351c145ef3e9a179e031973461cd8557c1b337d994b5a2b6892a428219c27059b3585a7bdf708043626f2276dd80e7abb598b44d9cd0a719417f692c8fa14248b7e5b15a996058451ffe6c90d6bfdb5f7df491a2b5add8e78b7376d5bd4ce1d2df4ea969b62b82157589e5f0d1ecc8e997614087738fb0c7a3a10c1c1727c78e85fdb327ba44a62b0f7c1f45539a48d07e69415a5b08b7304672897e41c47be2386d5f131a5e3cfc4a4f88dcd04ac3baaf772499d0ab6497d0728f6ab1a5776483281dca5aaa9f1fb29eb345dc70d1fea7156ac478ea3184de2b7e7feb3d328be2b86fac0fec74fbe4d41f0edc9eec2301be7478b847b67dbc07e71c531e35ded398e5468e8637273d7a3ca655378aae2bece21523365bf9169249ce8dab19b3d243ef086afa6e08490b8c8adadd2616a22b34282e48aa7d6a4527050f7626d16b340d8039cb723574029f5ad1f266f2e0f3cb305df11a7123bb0f6e3cf2158e0b03c14c5f7bec356af9d564ef1995a984d147bc16c2347aef4e5358aac14e603e1d9aab608e546e7a4bdf5766a55ac0ea3e1a2a0d3e81010989a352ed4639ee70ec0a4bd16523674e831d90ed382ecfadb4c31895b8789a1ef76ffb5903708f4019909c16b2d1a6444a00aff7447a3c3bbfc2f634d293bc9c0229a0928b8ad93810be2ac4d9f7b1f7db2912f95cd58d10c9aa418f1f5acf1d5450e10e40d142a55be366505d0e00d5e1075887e3c938c95cd998f8f14667ff48864b40c5fc623465b0dd4dae7d196ae62bef177bbdd5c203e14b06fadf1dde693a3dbe7d549e41c8a70e1160cd622344f7451c772bca973942063d9e9d371720dd36fbe9827d79ff26574ff697819b980a092b78abadb5878c29014f096a5629ffd57d9cfe762963cf775df233ee3059d4a9b8f2b5f5a9492041f69e9c1e07df0287b80a312efcb0f2bccfc65b1e8e04d7854977c328ef289edf820fcdd898aa95cc3fb3c2fe504140b619f555790123834a516a6bbe0390685048153710a5271a11791c1c6ac0af39e1c0f1bbb446207857656d082b630b0d529d31305ca9df1005f8c5a60aca553ece696e0626a9a6274af9d231079a130e4506067223132d080833231844c9cdcfea57accd66c80f0073834c7ec92522dbb626e754fa7dbb72a6bcc6bbaf7b937db4304069eb0dd5a48f963e39e670b506045466514945e4e0400a1338a12c20c8ba67cb742a078473fdb71a0af629641dde33060f960843c1928fbaf7d06800217b82a064aa21b60f3c4a825a6eabaa73a22738e8773152a6ecc20071a3bbbc2865f551c3f208c4d6c9d4e9b0b663e2a7dec59164536d9bf0dd55964e9193bf4e0854720a98194b5b24fac296740eb73b0282820bb0f98a4fd29eeee7309c73f2e11463b0e2dfb41cec10af840df892adabe29d67267198046b227cc3f71294b77eb9b95f88c8998c7dab02f21abe0f70495a45ef1a725fcf1564c27d6ba27c1c3fb8e55ee060662a584e5f78f0cb7803597e1e0c03584c004ffa426be4d8a491a2966a47903394970a6f278146ad77075ab2785687bfe738a9478f28190198a855d6da920ebebf331271fd9372d096dccb9c07470df5abd88fd10b2a6ed9e2d0b7fe98d6b26e408f0f1b44381bd131f43aaf2d660cb62480822b48fb6cbdfd9b5772377e21cec31b3ebf9dd7883bd30e16406d3c1a6dcb911ebacb13892a6378a2d63900e35cb1684fd36d0a6e5d145afd044921ad891bbac403f3fb4a9b9ef9289f1ff76da485e6a0fb243934c1509b3d6f33cf3c949f4e009b761b37ae0a8d57414eda2712db16e09b65fc5215321f75f5cf8d4e1cc0cb52e5a41bc6ce50a5cd415821b6440b996d38a4bc6ca51388351c8ef4688e1ac3397710457e78fbf2e933ce568194a1bec5676301eb1d8f45d967d49d026527c632c43d50c53a56c5397d13f11fa12827878c236533caffd8f14c42dfb23e5234cd61ada6419f0bcd4ca1cb79f6d62944122b584efd5a0fc21b5e4c34ee7634af67b3c3be69f3854b812657699dc00f94f3d98437ae37199195f273451da93986a04f2211b4e44df0759f3a487aeb55aaaafb39a7aceeb7b81fcd3a88c643fb6af5a84b4898ede03c9860f68f14b495f5b624eb279fdd64b6073314688ee2d4bcd633a1bbac8cc68078101ea601b84af693cb1b3fedafab0bfac8937ccde2600cd095c7f3662d7b7c93211535c862ef3dc2724c492cc1e53a58f23a3e09ef27db633310783c6c798158187cb6bf40ed2bc0aee0dbc3b0cdb1a0446b14d94596990c902dc2b5a64b2f556aa7917cdedf512cc58b7048f8af127f33b899a2a236c64b21725b68876ae7099c386e7799303e557aaeaf231613dd2444b544fc7172f39d8b80baab7c4338e321a196360c8a53e922ccd0f87596625dfbb3af5d2ff5a17222db6914e17ea5809f75b14ea548324652589e2fa391528acd66213b5a1950678bd4df2b7377bd506a2748180fe449fb8df45f3f3cbf1e294e3f531d7c5860fc2b2f85659ec8d0e12628b33888f91b773a02acbd8d5a35b7d291ad7a035d839e852e1449cfec8091381c8b06cd011757fb160f11220d29b51f1fa8e78b8318dd3e62d44e834d6d0f345548292866de0c25a0eed0a7427abf683bcddc7153a1169b507dea5575c6b98f75730647c4c0125e25d4827984a9256278a4df5159acf9309959b3b2f05e0ecdef843487957de90937489d056e258572589656a80f9cf3a28ff0213847639d5446042a8443681ecb37c386f749706e3c4e3ad8f1e0118445b6e9c931e5a7e3d6fb7b5eba690f21f8b9cde6bbb13a2e14ec0adcab658b19bea0aef24c557b50ba8242579670d371363fd022cf3fb37380947ee8412a6a5251dfa852f4015e82737cf19ba4f565aae83c62c1ae4facad23ea1f726f894f9cc3c67e61a583d1e7864e11916251363da3220e49d55b6659634f5501631c9b7768e78984ed57760e87782adf5b3eb587eb933b31d10d70f6c356c82be85eee70d5c5625347f6ab55eb7d95ebfbf87438260262002db06d13c872e1485bbab8f78ee2815331dbf25c36e0fb3dc128f2bcd6f21b4b47febb2ee73628ed29da7b99f8c17eeb2791eb8fde24b35b474aa19492e4ef59bc42dba6b4131790ff18b6c6a7e4b3a1b592d77f55bb66aafad8014dde5d36d1f7174f19939c25ba380feb1c10beb80d5869769932378dc3684ba2471dbd8a4a9506a6061a33ebff612a98f8c7d1f4948c80296c081b813afc20051ee5986219f27b50eabc6cc2a706f340eb31a111cdce6170762bc9e96842ff9a43aa7046c6bbffd0360eb9526795e46361e2be681f9aa7dc3621d54ed1b934e243e0d7b0d73e0eb48665ac03a79a88710b6f7c90007dadcd2a9ecffa0deb6a7dae2d3138c215126e4a75b76efd815a1a361c8e0226e3fde3d1e71ca373360aacc0f40f372dcdc57df0a36dfcbfe6d39f708e4536e96a1290ba8f3db3b84580204ab9d44470b472642763222585378fa1594944b6de8c8654431bc5a343867558a9f322d91185b3a14d598681e40fe8904eb20f0a5ca7b3bf1a01270a8b7554c64d447d7da6ae03c5d0eb0d8a42bc691ccf7d069a0a5845219dd3e452169ea8e9c31246aa9699ed32509c29b727d99b8769eecdfe6e2a954c4cf870026b6edc43a9d110d877d5da875ae16d8109f3fa609cabb79fde7b3e6fa6037c940062895440255e8fb0ee46354e5f4b807f780048d6286606f1e69b2c47795caf5c161aac44739248d84fcabcb96a363ddef247a0b4e95bbc4ed956029fce828d04f61aac15405e9c5476d28e1a96c001deef2af897630b382befd9832d8790e5618f03e4411015e2cbfff839e0697b74c5bb34c12c29f7033f86a01e6f190a21185d50e546674ac495579640a956cb2f4a02ff8ab1a29195e03a5434d30740c88fcdac1f93ba8faa46fa5722e3f32169c242e5c5e6618d68c4773076f7d6f7543e6c5ff3b78e371c677495611ea330ecd4f7820328eb2d1442c9ff555c1c705cbac5f7223056e3936d32eb8bb7fb5bf0e89d4eb307a402f0e1aefb406e2c5e3a7b470c0b8ca91797ced1c3e35e70154e73a0c655e12091b72792ded8acab1385f68c09103af935a212bdb9386085ff3e0cae637c63f57bbf9b11f47ea5fd32b7c2f168e0a9dbe03acf7325db6cc16c582a22b0970e770372a2a8e6b2d8b72e585703c5ed77a589ca5b8ea45ce1a70f15428a38262f39db88e4c41005b35d88d0295f8aa7230aa4f95d5cbf2d5d9b39fdfc5154ba64c2666ab8002af7d454b4c7b05131ae1a5fc4203b89d0dd3f328f9a9e14a0c44d853680c2c972099a2144a792855552ec3969d77c8283dd14f17243ce50b6c42816ce736bac9faba367bae836685046170bf89796d342bd5d5c84b20371e13aa2eb80ab39060e5e5e8c7a122276dce8096c02e920f887eea6d8294db414baa84c780fa0918248b24a0424addd3d35c951ce1b34916eddf15ff8f27f76a5cd9d6330cdec3b8dd917e4632d23cd28055a7ea6a4027eb2bf66073352dfc191747aa5ca4df66da52a2fcc3e060c78c3c62bfe8a3ffb3f40a6ad2b1bdce70b8469d072990257ce54c64a4fd941d076ace2be4fed416759a52e473a26f31ddaeaf82f68217d78d41937f80dd963083d200571e1444adf545ca0b4c2c927fca631b9f7d4f831d1f55ef9c984b2dc2c32d988f75123cedbc5e3b88643870dfc03f519ca7781a20bc8b2863f230a2fb50e45f7af2e004fd514b6d02c4af4f7a46aa1b2079e62508eb4a057b98723d02b15d1dc19c66e4063c76282272777878e40c3fd3fd7febfd35fb4f8d92fb46006e029a0b7c8d243006453490787a330022cd865e3a2cb6262004ce40e6b1051c103a9d01983b0ba2362258f3de9ec73a8955b86938d6ccab36ce4a3d9e7ec27f1e6cf04bfa59e28554745df3aacd7e4fa00c9d9b006376b5ffc18b2bc249c45020025990aad0f100e8a30c39e6ee9e67ef5bfc9d99bdfc6c024558b358fa54b89f63a178ae86803c7b172b6d99e970a9ffa89f160bcaa6f7c7c37b7d6a78badf22f790ad1065d76194378237cca63c3e575c4caf5f74bc7ed6a1ba30ffad3eec3126edd4d8543e96bc6ddb3d860c4a4e80e0cc109ca1852bb849de7420802808545882980c3afc037a21fc2acf05e100009be7e0ca3b4a24f421aff3d4d9bf5a14f5159eb6015ad156b9aea4af794a7c61f464c8f22953911293f45223a04c0bf8656f91dd90a028d89eb9532f4eceeb2a550d6f1a53e89b9a06773c15bd1742891058178acf162f8938e5e1566db375e425a87e4da1516a15e2fe57b31968284d5f97d8c4a6030ff0effaf32dbe414116cbfe9c90fbd5250b8e524b049a87e5ceb8f67e93fdb1ef962cbf34ba29c27848b1d772ed49bef402743bc11029bba094843baeffbc66f80155fd4907977c41033efba76b73520084fb8061e0af4e81252c2f1211cb6b52bbd47cdd1ceeb8c5cdda31e41261da71188bebd27b1286b10b169a52d01208244c0f0496ff18be2b31ed42d1ebfc9d6f478c42bde93cac58ceac4416457a84963a705d1cbafbd69cb4dff715fd2ae52197664ec93313079df455f40576e929d20f5d4e1855814840e019165951d4f8af9282d79f6081e1a9077874c76d483dfd5240a132d6915b3e3c016744ede31f42c046a5e6786d80a48f7f8a05328009428c801c11471259bf5000b47fdb3da202a81b7f4784be2db512d1ff67cb77d5c74485885eafee88eaa57fc3b123ccc916d26a2e6a8b5e30041ad69a944217e9b402b7acc0170c31e8c2e45d83cb76dca6c6997bf69534d1ba2ef625359f478c324f7e52e086549be02f984a9ddd2522dc0d122b94ab2858ffd79966f1e8ee0769b142406504ae10fb750452a660c0e4de2e3b09ebd3220cfa9b27277127f6a280b26b3ff89a02d6611b8f3d475d2f6ad4b17edca4170a37d405082e5c6346a59fda6117414e383639a9a0d227db5afce71f426b667fc81fb49aa4435ba5c658f0b08c90e72a3878aba8a1daefe229e23efeee7fda12450cc3e4643016f45e0398bc55729336eae4e19ff91e467b846303d9ece0a7d86748296aaebc3458f6edc2862284ec7937c200161063d5ac53c95b35a35676d9171a0db4ebae5ed9765f94975c8f9bfb055933954e74437f7e5a709c7ba9ef1e3ec9974b84cf3b80c6a136766c5b47c43ef2a0a51b1839fced5f6a95dca0b9aec29ef1b6dfe77454cffbd1abb8b099ddc8d56fcddf165f2a881f71a92e057d918de1407d66beb05d77b58dbfaa56394d8d4ac99602375c1138e4ab5ed99ee2d085daaf29801b98a4a7169139a914ce1c7399d687ec43d9b9e3f4433f4534917294d0634194c7d330486706a11cb400526409bd2805027d2b72985fd1db8e317fa10d874d0c8b0a0a40f113806dfc79f847e3a701b63bf16ece18289e01766b0093d741d54f2de53879f9e15c03b5de160370bb9b65b8dc8addbcc52d20b2e7fc5477b962c5750bc4d9ca98c046a7dab282f5227d7c3fe78889cc5e06a10b4c7bcb35197bd62d25b54aab5f319e9913d6abbd032f6199ba6fb98f1db2ea494385e05886a9ea1bda14b3e35e3973543189660f873a7e8efc47554e28b8653473237b2a2a736909d3e8fbbbbe5f2da1ddd49b32d52539e555184451a7a07993855c84f12d61bbbdb8390c7ba72b3446bfbd326f1778fc686feb70e0c3f38d302039e3f6b7fb48ff3010cd6b4026f10b7e4f140e72bc2eddefc7c043a3370bd1edc08181eeca7999e37426d2b2d7cabac28f27571078360d80b51cc171f75a3f93fb44d9fd55b4517a6dfffa24c728193587549119347ec0c8bc6ca452b8e242bbf215480a2462f19d034029bf7c74f27d3e8406b5786dbd6fe4983270040ba10dacdd143ec0ec3ff33fd2a8ab80140b42bc9dfc0acd6bce1e3589b4f3623d2630318286c0b0b80425289bbf0f5b722c2d0a88bc43bae0b97db82571035be097cd89eee6b97c3007dac684b51393f41fe52f2e8e86c83447337455b3c6765cbd8bbd077c50adbb12bb2275d4e1b204ab133376b9fb7dd040e97102c0673b196013d3b78faecac0eb704357629e4009975f1f4787cc641a6c46b812e20c3280480cd6e469fa5ba95ba03210a875c36bac70fa8b3e1e027b93f3506f5edee4f73c1fcb78505de9dd2af3f58aee8cc591b2efcc29271ce15c7c9741ff7f04d8e706f4bc5a8dfffbc4201396ab7c0bcde571839d098aeb8823f0db94ac8ca696b96c32b072680719c605a51c5d991b64ceb0d57613afb67f3ab767505ccceea7d33782b0a8289dcb4ba05490878ee410b4398d5e2fdda34f0799e27df98802929f2f8bc3e417eb9abbbac5f911a48d5cffd2525e455eda7ff45ef4246a090adf831bf6f10e7b160d7e1ba35fe2203ecd1844cc7d3d78849767cd464c97942f17e9c46a420e9d49adfc8b94cbe44d21ed6556a4c3ff74c91fcaaf80fd687498c138f390bfccc5aa009ed24043fe725b434fd28238739ad0a084cc4a3fc5ef6f65d86e106f313b6190cab751d218d617573f7e0de58231c2a2fdec4a1b964fd98b31fd915b234697e5e9046c7d1bc27bb29b24eed11283c6ab9dd72b98c3da00bcab6abb898b2f7485647f3b4eed7eafdbcc8acd040cd60545cc5493bf34d90c7fae7c3703523f1ffaa1f1664c7752dc5a3b7950875973a7f7f22d2b97d293255da2faadd15ebbc1cc0a21957fa1862ab84fb82261dfa2d34977289a28835271ddefadc4f999ee818106d96ff05461c07c6f11e99a88aab1c4c30e887a305c1b87fd5d2585ea1f88a3fcdf9ca6762cc72e054a4e3b3bd56aef3ea69f96c2fb49e334d1787c3895fdba56fcc5a9f0306657782cf84be069265351ba84831f74247afdd364e76d99094c7bf89202abb2c67e307f90d25eaf0c766210e2493112d3d3be2991cd7073d4e3d39baab88efd0e2b950bbdd99fef45e2db725ff1de1c7e76e09ca836296b8506c6adb6d3805867e60f9728668a71f81f22a6a38110d94fecccf4512b80c9453ebcf55d5c6b0af93806ed7884077c4eb3a1745704ae926cbce9f933b25dd43b111d3c485a365ceba8e2d35638fe596f28bea6237fa090fd6e9e73f7d6a8d59009514a1ed5c99666bf0b126a8c57518206e302aefcce182b8b5529449c49146baec0e788d60c009103e9725b87faaab0d37752a18220751d9a75e4c30e28d9f587d3db2e63e7e195fee4bad231d0ac2019e25ca31a7eedfd23666c1c332e6c551cf0edb7874283993865b47693bfa1fb5f8be95dcbd0caf0ae8f89f6134114b4f581e7cc47052cc638d226f0b4b0cf682edcc0779dfe5220c45a03f9b74a1b3a9bec8f14ad1825448695d9e79d8c7f900d3cab9898f0ceb5ec2ea1ce2632c70e959bae38c063b63aaa1495045439fa9a84137068c58e85d7af732c1d68df61596bf40bdf88ce26d02cb921efe3a185af1bcad8912bc1c1ac94926d8d863b3042a66170b20e42bf3095eb474f51aa6bf75bc7abb8d26fc85f23f129c7872d7ef2cd48a35859a5c77f6d11cdcca73ef299cb73b188c381e416e4f92b73739c919168136d7a71e187e83a957c0fec4464bef436b1a605e05af960123a385372b346ff2996c05fdc479186de1cc028a4078d5c7975bda07275321ea51dbe2e9629391bf2e6d12a804fa2d85475876446242f8da2c3739d217ce6a6189dae0cf03e9343d62556dab3e644b95f4e0aa71202cb0f1b647003d4b64081d582b0f568397c003d1af6785f559eb06771f4f9f0eb8a684a205dda736c653642946bf2e6611bd98f8e5a0b6be5da45d4a4eb62c825942299bee22be5e7804dc99a880a5200995634492a9bbfdb1d000eb097eb82f910c46f08a6fd146cb74fd15eae46945c1dff95130d314382926a7d5da29b06af26d733c45258e74632c3c1a686ac94bdd05d18b4abd3df215e0a8a72b17b3c8f00e24fbb8d4446bb1a31033bb8473b6ddaf726f3ad8c7bffac689bb96f910ce1c36d2ab500ca19159721fee5eb1c6fb362552899bb61ff65a20d1af881e75fec9a012c7a53f1489ad01c1a6bc73519d69000846e7c5c539b68806df892851bf9ab25bdd12dc2bc93eea9bf97f699221f8d7fa43a99845fe92749fe8148712a501e61458336435b471851552f1d5070d6815aeec5b9e10c9707f1335b4bb572391c3d2c59177e0e00779b44fce763ed43941accd7857c40ec2fff764d4459ddfccd42da18787bbe04330ff5c6f9d97fadec46a537a55ce431c8fb2e20db6352e058f7b88b0041519d7335ce55feba105eb466e0aec089e1aff96ec29cb7ddb82ee5e42c7958d8b1105f9638709c0e879c1203e7047e0c1dabebdf9c8981cef92f9e929fa92848c4a821b99ce17bdeccb02ea4210189ec8270c5d623afe03ffc28a9887ae4179974acde26606e4431c7e231d1f66c8631f745b0dbbfd67d37a9642e4e23f2cdd4a763c166eee09f1060794312ce0f20e46371d477d8c5ffbee82a566d049bf3014716ef00acfe33827fbf8bf011b0fd0cb03d5831d6450fdca1c1486c83a731263b0e937c0492a98f0cfa32f22718c5b1c5f16592221e559abc722dd30add2e4d6b90d3635d62a83fef735fa1790f21db8ad52221221878ff21852d2b0006937dbfe7d73c1e38d99b10723b836d5db993e730b8663ffa2114b9426ffbcdea07bf1f5ac88fb1dae4aa573eee226cc934e0c44c4ee9e18ef7e06af01ccbd851331a7330cee57d107075ad219f06df1c3acb096f0d33719aa36b1dd95b248b03be96a3b210c4eaa4 -MD = 061e0be7fa3c164f342ce81295dbafdcc5fbc47486f2c8240d8f9e30399973c959b57f7cc6ea4b93a5f2d0354717eea8641191539c47f736dcaf46487f7390c0 - -Len = 102400 -Msg = a1ed9fbb03c366c30f7513bc64f45ad979ad888031c6bba8afa553866bb3a468855fede15a658e26565075b8093dda437ce32cc6c5d04bf5d9f5f7dca26589c4515ae05af6799f0e4d5796badb3b7d843a26e805b21077ab09754d5b9b10c45bade75f70fe8701439f915c090575ab635d7ea4831f0fa891e62c3e4d7f3bbff53f0c53699a181b8df206b0efad74cdaa8af3488a355347701922b0f8756fe15ab2d3a28ef4b357b4efbf7bb2fcbe491f6b8ebc601b66ba10495f8ca6a6339251ac44352731e01c7f3dc3a39b19dd898ba856e84dfad06b391fecbb9d390f3aa4d566f47c7c27d3b7841a12f22c59f3b5e954b59bfa17c0b342d02425578b4119d741c7d4fb11e2246ecdaeff5fb8f167d58e099042c523455c13ae882830107957dd9779d625b28ea1e36109d884ea67140ece76fb61fbb912be430cd3850d8b00434ab136ebabbdc564115abf44467e4fdcea934c74b0d50ed7cafb8113a119777acac543ec35798359a8383d816c742efe47305e85aa62f8692a9b596034e9678afdfd24afb98983c90dec7ac2c611587ecb94591c502777794d3584f62fc5767ccda002bd9db66cbc28be9d8fbb1d7663600964c20cee34111a10295df8734c5721f8049c4bc8e63ae1f5ce70b35f2fb6edd5a7fd457dd7387976711bf9bb9223e04b53d629879b4c20db37ee16a02c7e59414b58649d07f752ad84ba9967f0e8f4e216f3a1ba30f9cdb6fd904da814c38e957858cf166c558dfe89c23f3d0daf440576791a2b504ad0cf4bdfbe3f908e73195587efb0af5a13b1a8b95507927fb8fb9bf2fca0a145116e4762d22d48e6f0150b6c2c33780eca0e0b29428b2661380eace5aee2cbf479db19a1f139e3d3edd0c18fef666e7a9b5dd7996e92725cac84d1db9ab9775fee5dea24842d0a5d5293a0799e123aa56ee5379241e31e78fca6345b27ec4d8d593de274f1cf648d07a6d0b1a3ff84972cef519b2348d1bd11bcfaedbd45f486a3c42818a2e89a6af55178bf64f5f359bbc34d3c7c873334d10e4e19c48a1552b237e598fd3f53fc02dcc12c4bbc2ff205a954fdb469ede425e35668a48457fa70e1407d6c9e384c178ed27fbe1be16af1e98e6733b6a7d6f5853a61c6fb6385c409624d56cbf0611db0d44027dcb1ca66ca2201613608102a3a238d90b7e0fb95f67293238f2444fa8aeef8edc546194e953853a7b0b99caa4b39726b7f7764cdf199d43ab27cfb9864492e789f495f9093fae66bee62825f00a39ac01cd0c95342ff9a05fc9f90dd860c6a303161a414098e4116b6aac830a08a8df55792310f31cb6ceb35360ab33760347d4537f1c2421ced11d13978047515d174f665a5e90626d35424e87201c16d15c7a1724d8285cd70c307b899c5c56df0a3c1f32cc9083756a8925ecfaf6a5a94760ebbc13c19c854931fcf345ad9b972ec82e1ce9780277d50474029a47b503af254ba54d8473620ebe32550abf922ddb6ffda933bb61dd0b20b3589ca3b768da33b160e3e573f5d321963f5a06cd0bb680184849df242d837a6e5f608f4f517f28b78f756910a92cf8a302b217cea936c5087a8a67cbd1c47dff97846ecf460450b8718093cc0472cfe35fb166f98ee29b48c083c9bb7244b7f19176c6d9cee0584ec783da28805b03d1a6c678e045307f53baa48995879a94fecdc63bd144b9bbf4e1fdb098b52c30e8687fc21534a6eda3b98b3bcc7a2cb141bce112485ff6d815616ccbaf1b9cd3a2153bd70b05bc62d35da634d2d2717994df55fec1790e595ac64f6fde1bf368a94d893c2410f77b4d0764293b191f7a52b5a355bf1886ac2f711431a83ee67c3871e64612eede938b57637d87c67d2ff5d047cbb3c6f63cfdf269a5800cdc6b0a12e1a93a07e85808be12962b53110708afb1a521fcb3a850eaae20080e4bc188b0f9ba1bf48b156fbc0027b857818c05a48f969c32656ac29a5055a2abcb2c2edc9d1d3b2d5d680ad1aa96914c254b777f2ff4750071f0cdb20eaae27dc0e776d65a270a2ad5dc748f70674899a2b1c86011636edf7fd6cc92179449fcc39ffb6eaf8c2b656acf3756001e60d8505b9327e257cc27d58959eb39a63b9159c226e60ba0f175a2dccdb5b8205c70d4a5420701462f821985000db35559d3e9ea83ecfd0a0ec41471923f3711be0b963b6fbdfcb30b76b256398a3326074cfa658cd4021bd5e9161a4f42db66e7f11b6a769d4312e26e468960d1279cd66511efbc4ba97ad95d4e533f7133946cd9eacef125530a46e13c7b30730f3e49a4b6d59ca4619bab8913a8fd3ace3edf2e7ae55a06dafd9b680ab80300686ec3945fb3a88eb902aef51c88031009aaa157522a2b821971627b47dc72d9b1b2f6ac73066a5b1e246649bf7ceb91847c45ece719e047bcea3e936a34ea9f89bf3565a74a4caa0f8563cf72f4012fbd384f67c04112c823dc8238e87de4a23ec8124852fbe9fc1baa2a2edd89fe5b12432050742c3d83ecccdfe458f3eb826f821fdd1c97acb1b1071bc065ab3d9432416b2f5927cafb864f9a1e225389c09a51a09c5aaa1f7b6e30db2c91d4497b8b97726d05e0359f7eb9534edb0929ed2ddb66fe93afbca9b19bcadbf8a1ac618cd9f891f0d217f034be9e1ef9815658b873b58c5e24fedd19cc7d56e07fc0f6c47d4026b079ec9e56a3dce6f44899a3b8bf2ebe20867076052765160fdb41abb0f5fb93bb342dea432d923f51eb6e4ebd12351c71609c15125104a1dd5088e0d0d88d7177bd46748890409098d63eca24016b1fc72fec3abfcdfe72bf5c1146a29968487c61e0bda5908a834f95a5a68c212340a860db476be295114c7a753db4bd3e714fde67361892b27fdca61d5453e610278b8003dbb5537af60b181f4675b85294586f546e501b6aeed694105429d4942ce729e0581a8512a951d199e1741f571a3ca132d6fa9f1678a3cc29366c5131d951baeb5d09fbeea3d7235faf2e56be8b53107d0056923785facab27ba9f06ba541af9f4b022c816df189eaf002f2eb603249bd6b2299509f122c66844136c4293d9476b2a19b5d604771c6649088802150995e87bd19043ca04d9ff0e0a8bdcdabf5fc1456cce5433f776c7d656bff47449bead6a495a4d71bbad93206aadb1b2340b9f0a045bb5f4007679ae031cb6a74ddece86793b506eb00acd801d18e8a2a011ad7fc7a424cffae225d9f5e76d367cbdf2d7497d744a4ab755380914aa336c3a92ae9ef0c74d4d837260166844aa3d22c266a267e08cf07ed25018eb1febfe4ef79f7189c6f56121094a4ce76189fad7e53a6a40bdbc0c25edce31e36e55bf15835929b54a509e84919f81abec5e1aa2045b8b51326205754dbc3b46c0f61757dfe4acbd7be46d73b3679cfd0eae054cc7d2ebe2680743369a21205a3c586fdbb248e4e9803c34b717ab8525ee03229dd5a6743a87322e307e06c7680b022d6aa58db88082dd5c186473246bb6e4db5cd7df0ca3b66c2e2a9f7218b7547cbbcc60bc0fcca8514e5e43c561168bda975374869d631d3cabeea56dfb91404f7fc98addd3131b1f71515bab2470976cbf4855a20ec3e52a0d423900583cf702e328cbf6eb9e02cf2cb9552c55bf0222b904223b470b36bebcef03311701a01d4db3cd113fb586e9e95dd850dc4cf484ee4f825a3083378120bdaa0a2028632827303535b79fcff60f068d20a15f941bc6f01d05b17311faa173d7935bf969acd868ae6b3ba6047e067c1ba38c400a6eaab19c47b222ebb2a8db31d3b1bcda31c823debab3104d0735872ce286367f050058a7251bd9ee2f9bbb61d208b8de3d5f296d2a0726d31b06ef65e3758a1b6931aee5a9d4e042fbe4dc0e984a369b5a054104c31f30be41e07b70b043850521a67bffdac57f0e9ee906e12e5d7e3c0f22354b8ee37636022bf5f551d66c66b5c6879cc0d7fe7a9e1400819b2bd8e7e41ecbe9923c3f62e450239bcc188a65aef8996564f0a4b085cc9498e79a8cc56261cc87d710d56a71b5cd0b2bef262b93a67b02cdf9bad5da7888cb1b94e1fd1053ffcc66497e7731c3bded764587dfec37f31a03db88142682a5c43d0020b7775d2e6146cd83b1abe2bae8b301f6aa4213ca550f7c5693f051b32b58c5921d1de51fed7f862c3f677b8ba4ec0bbbb41ba2c85df8c66c7ac04d7aa771cd7c548c559b191a5ac049edf4f9ca284b1e24024bb4d7c6a011f21edec1e192ff29874c136a8d1e3389f9c6b7cc0270a967227c79576e82f18f23936c5281c243e0dce38954f093f8cd75792accf3cb0dddd813917ac833a32c34a65ff32e0a81e87bdb1d21ea8291d5e58eb7c046415fc96c4efce38de19d314de01f6d9070a18a8dbc399825f2e5e9728dc572a2da877306b5225b6694c7e698c8148850ff8c0e3a0c448346ebde5044ffbba8b09f6d23cfd16ba9fb5509923ae6a70b16bc28bca955a6a8f8756354826c032b1897f921ee294097f32b4b7e5ec23ec089b15edb031ec6cfe1995d3b545a04c381ca14b48c4607ebf61f75f32ae5436d52e517b56ff00ec2a95eb24ee35326379341a426d1ae2a6eae386f37c6d61cdb196039901652e548f9cd4bd557ded151f70392bde4eb0fe8c07e21925b1d33d2852badb520ccb32879ec1018d8846dd75518c7c2ee852021d7f9744e1143ee1a3e4d5c6cb4e6e12bd0c5e95e8ccb629254892a7c1602c3e099b24eb20fcfb77aedce2dfdfa29d519a660bff19e3e194a9d5da23585ec62efaeb099057e49f5bb3ab707af1b1cf8baa5c378173462f8c7d89c193362ca6414bffb3b9085390fa5cc0fd4cb3f48b2d573f8fe1977c168d0ac4f76c0d6253118749c1e9b4d286f004cde7b998d336c34b807373f8ee2d22fc17da122098431c2749a286dfe9e7c94612ce4612e678c9d1df60dd0a14d9caac02e81a1226fccdc68fd4350bf219e29b402f76b4a6c7cd949cf6716da8b300a516a00874a6e6a2cf7ce568ab83b3d86ec679cfe08c8a2b0e69a2c575f23f4161b3a051aa80a737cca1448641273c174b264bb64900568e9995d46dc589d5298c7a579a465ca4f9288d70326f55193bbae003ce30baa354e0c229cedee82b156fcb4426ba8376636da1f6e18885e1923874307c4a14070a5e7f016d14858781a636e49b89ad7203268f57182f421bc74e635044f794e83b7d1d09cd290aa11aaa4db76d26235e64dd960f4ab6023e47572df1ccbbc5cd54c73c81636ebfde3ce6603b2032ad61e4ed669dfdcf5eafaefd448358291f3ce2c75e36c4683db565051efe391174432fe06171a5ddb0064aab37838ba219ad61e7e26874a80cbd2f70ea6f2c55306882512728e7639ed8c6eb8780ebc93d955eb369b4d8a0a56bf8a4530c8e706a48a8ba182216f3737d8038b4f9dd01038b35b4749a74d470285d29d964b3f57a69ef75c50bc8fff68b230d305cf3dc040583656387ddd625a8c97bfdf65146f952e32eae3481fb60781be38a38b4dca78ad440e71b88081e33da05313fdb076f9a105f543ab67879dad766430b8465768184d14fb3e7fcd27feb7003bfb5993585f352279cfaf98b19e1dfcb440718e99021813def9226dad38a26e5d4658ee3cd08d1b8c9a3f11cbbb7eab380a169892d46eb123d0b089fd542a4684c8f5b02c5cd48884f65e1b746e6017c2fe7d9cdbf41796d1aa734ba0b81730b5687701b16bd1106aca56de321f8ae85d04edc3fdccdb6bf071b1d91dce31d3fa0e280852654d5c45fe6d819034c5c70e04b0357fc282d8890cb35bfcfd40d85aa24eee97b210141d79ec2c1316d95cdfe60c19e940d384a263c1fac6ac0be6de0d32da08bae2dffa251b09452d8e4ed7924a97c4ad9718465e22dd02455ba68c351cf52ee58b65e5e9413dade1ac45fef1b1d99771963b7ae5202e382ff8c06e035367909cd24fe5ada7f3d39bfaeb5de98b04eaf4989648e00112f0d2aadb8c5f2157b64581450359965140c141e5fb631e43469d65d1b7370eb3b396399fec32cced294a5eee46d6547f7bbd49dee148b4bc31d6c493cfd28f3908e36cb698629d53701132f3b60a29a60cf5da7c157e939735077f849999cccc78210cc598d9dcae1304c4fb5bde5fee7cd3bc67a1ef03fdda965c4d1c750c928ab8e177f27dd1299b89deaf3e3a3d7e52bdb6488c814e16a7ec2496614c99b6c610b371b038c4e98f0a46b766070a7f161d92c7df1ebb0924719e066e08b95eb4914a5edaf1fc1977eec5badb2b0f18515a168ba1ad91ffd98d94464d8fb5b3dda46ee47690c2dfdc9d2361a69094728adc0b3dda16191f4fa9ccfe06cbd5dcc8afe6ab8efc5e63447f2853ce1ce0b4490b388493419b920d2b10d59fa26001fd1c7b5c291f18ce3afc9c385bb93d07164f6709d3165e7f9b7d267322fea04c0551f59f50e03748437c46ba564ef1937a105e74a27dac0f8205d68196c6dbe367b81c1b0a2705f8e967ef7fc6c3457ffcb6e66c085ecb69492deaa704e25aeeabb7b7795fdcc807b3255f2fb30081f425a9c7990ea104b7785c288c733965965ab8906057e8c99d291e5e7325eced197b51c9a4bb2e9f1e98f95ad9ebb54302fb226d79fb3150e0d4bab4f32571d1178817b43518ede4c8306e4635753d3e5c165d176c52a0a5fb3b622856ba767415d4614ff32bc61bddc822b54917ba9cc933d156e0641d0f14e77c8444ede41f3ce5986387fea28b84e87d6ebddb12a673dbe6f17e3a91d7545e728e67c5a11ab44525b89899677de619e73b38c92ea4829504b2eddbe246e22aaa0f644a96ada47c6e16cf02ff392be2c8e262e8f6de1eea935fd54ffaa2e7d28ecee684ab203410dd45d44350077acc882ce440529b6d61fbc1e09fbf338adf8495937cc9ba8e8bd90c4e64442ffb5e8fe166d92b259a82a4a0b4d21b43f4d8f62a1339d6c4d775c935e66bc2f8d82046c98fbc67c2cbd5f6c4f9f0f5184c454b560fc3bb863a5417864362b1ac369a13ab08f0f0bb29e35af4580234fbbbafebe12f236148ddb22ac80e50fb9140555f51787dac58db3336fa780fc234699d3e931a60af52e8166ac2ee3e87ef1bd89381886c85e0094df39c031f860b7d97ac3479828ceb84093f3e8c333d10f2ab1504e0c4629dddbafaa39e3b68c81f259d8bf392e25dd91211028f37053beb574fa2278d2ad57d01b2d6f36950b279d07961319698ee0eb948d8a052c7b72e63a72206cfc7d111aa82ffaab32612b01fa87eda9996e74b864c86678d6bcde457874e249320d9c23ed4e46b21d230ef9b92aa97a0c490ba0286d48befd9c535bc56ec2ae01d34b7440f4fddba3d545cca9fad10b50a3080b45c8cb581fae748187cc5bfbfa62c1a449a06a8864dc61f36384eecdf5010c82437748c4ab47a46f661a18c37a30710c6dfd1758debcd6167c356d4277e79b8db8056b952f0c856db6d483850fc0ec353457aecd800b34ae4aa8e6f937cb178609df8e3a19717a15108816c129a895b7234c7b46e72be013553bb662e3200313bf822b3408fb04fdf9a15d08663c0ffac148276572b37afe228a860fd88b00bf5f79ed036c2db870e8bcd0bb340fad8884e71d99c11667b738f1c060a67082d150433e48b16e07164436fc6a219810e8e485d86440e928e71f2de005cb54fc02386a894477506366b2ac3a859d79bc8466b0d245709040f64b8b7f5fb5cceeba8e5c68a73c696feaba8935ae260912e391f4b5cdee90527d2496f8df042cdd72b88556e17f1d8f0ab26a583459eab6aeecdddd6df98dbfe450dce71425193ab34d91de739dd1435f30ac2cc887830a1eddb8c3965fdcebb446c9c49f96f6a904b3fe59ee37492f40bbeb2ddb5d56afebfb3202d7500288758cea0bc1e8698aef922773b1c9d99567ca83d5dd39f9fa6ebbb615c19892f89079ba373b77d662cc5ea9965ed407383cc322bf5ebbd18c4f95d176b58802deadc3b6d16cf3c1c33380014c45c4666a286c3434c04171d7e720009053bcd68d15c16c64c6bab02ead8caaf017495bbdc2fc24e0b2695f5fcdd0b00d0c8592967119476bd95b2607a30b134c43a16ba58519915d9591fea67c2e8c474090ab7d3821e441254397d0ac51e69b4b8b1aa3f73af5d5fa69d42e7a9fe1d9a06c95c3e371af9f3b128a2c32177187af54fd5b81e6cf14414f746a31bb5d3eac67f5ed0b9f25d07b26717cdcb2507bef9d681ecd9389831ac153ec49f75ad0b511206b08f0c38f762de244f4b91ff27cd30f7022c7b19ce75df7271bea674a6af6c9c0741d2526ac67611712a22c75d78437f239f9d3dc2773e29d3ffb0f062e97368fc58aa7309e815255def3f290902f96077bb06ccb6ba18ad12eafce9e80511b1b85bfe627ccfa4a9382252ebd37438e425071f8e514757445507f027df0e2dc163d235e86a830ce52d4bc2d662d5ea51560c4e4a3c25e137c4dff571f009aede2445b7cd7c0d332161f3f7b25f2df6f03150fcca1e5ca0ce89f97491c3007e51233decd9597403a5ffa1594771844409df5d92d4a0f57a50c9ddd34dfffa846289423cd3a9c063b82dde505c41e3bce487bb76316af75907af147c6e4c00a8587eda0f8516f93aa4133144bb765146c852f012a9236a24396025d5bc5419d27d298fcdb5462872afdb229d2ab9d7caff6886cd037356c32f079848febc4dea17b3e8de2ce155f222aa39c372b27c30cff0050e0904c41d31caf63bfe2fa4d86f436daab29086a245abff1e5b0848608112f33f817bbb1c86d1c61882532784cd02a79a0ffbc56a5f03fb16ac6443425cf8dac7348344a77845904653d0ddd778181d140ac91932baddb6142f6d76bfaac7410eeac266a64d4edd2d394fcfb7baac57816ca28be29c5fb67eaacce8bdb1aab17c6ae029024e133335fb78030dd9e6de4afd3021624eb185bee628a125bbc7b1797e8695a1c3bd1dc663f283c21eef39d58518e59a18fcab3aab2aaae00e46c96dec5cb36cf4732048376657bcd1eff08ccc05df734168ae5cc07a0ad5f25081c07d098a4b285ec623407b85e53a0d8cd6999d16d3131c188befbfc9ebb10d62daf9362227a9a696bf46da1724a172941ab68892a4d441702efea1f00c92a4f323288a84e6bd721885112a14604d4690c2e96f5bcccdfe3fafb6ca861fdc3dbc04d2aeb772adead5db6814858387b00935fbfa7a35467c0c75dfdf930bd80246e3be49c3b1c138542a1440717497d886dbb4d0f6c586e25fe8418b20bace191829b504b18d40811ddbde55e01bc5e78f1cdb9ad766d759c070a374331305aabb3f7f8788ed74f0b9548bfcdb605905ac603aff25ff7f09b875cf42d7fec7deb58be47950b8a3aaafffe6dc682b9a59660f97a8e977c719ce5f8b9e11635adc9077ac8212d816da8743b69e9264d10c4491bb3c2bb8f7b28b96a030eb2a07cdd36a9e4bd53415a6ca87c2e95ef34645cf4e6e64f1a957fb7682d69f6c3c16d907cc837ca1b4e736ff35d366d6c0412d8daf77c845322f1d178cf4939c7fcf27b30423bd7e40d6b3aeb4b1bc01b40aec081aa00f2e3bc63ff61ac4b684dc7ae05f7c46b475c02845606c2494e7b5e8a9c8f8afe2b5ac658a9c960cad2b3b5e2b949bb40c8d1c26139bc5f49691ac258d53b26de8e06d5426906695239a85c431d8c9346bcf3c1846ea27e869068207bf33aea2cab967db3a5af427bed7a0f41ab66e907a41094605d2facab64e1dd767f056162f488042ee83a68a26ec76360db3f28ee0ed69f779dda660247267dcaf101190c094a1d06b92e68504e0eed23259bef745db4575ca9293735c794760bd1d46da25a5b3ced90f1be100bcef0fb22f3892531286061f7929ca056ba4a9b99f5fba05839c846082ac66c1876337b5bdc929b09a12f3a01bd12fc8516800cc1cc3f90837463a267403dcf0493190628cd982047bd38477fff1684d327aad1e1eda5fd7c89738566d870b340b4163e223d167f8bdb000c9aef33e3b16c2f8d62c0cb31a3e79c516f3a0bb36d47bf75d0a179e336990b1c1ae3d793b0528291ccfc1bf78a1d32b8e90b6b39eacc796faca15ef5e875ddd848939e1f40894871a8d61499afa8cb0e8cb31bc139b0d86e1ea3224211dfecd3dc64d3d0f26ee5bf5f1541a28508e9d492c7a9e3daa35103bf2d50323355bc912eee35733681eedd88002fac9acc03adb3cf721c5e0277c306b68560dd65c182b8862f509d40c85e9c4d4b025150acec682110c5346cb12e7dc52e38609e904b11c32e03875a16b50443006e59354a3328730298ee2091a89cdfb7337d5ead3cc33bbe06950c3e636887fc2b12e86ff46d1bd3e1fbecadb3dc6cbcdc84247cea35464bd446f5b40c3192aad30ef892b2aea1e14ade2f49e2c502abbe058e83d5f07973e70d952bf1e7e978f0bdd436f075abd73e15471ab7df280032720b56827d4bc2c96968eac703f3030ea019d1205a70123631e274a5935356e47a197962444394f5daff94fe0e55c5773617f5e4b5b51ebda4800c3e8a0b1c4e5e374117ede776f6e2b7aef97f782ce5107d29902fd1794efd8e35d51bb5ccdacef361f5c2ade547012f8d5bcfd0c5b2afb7c0c5116bae749d8b761bd0e9f5041ccc309e6b1d7c50c6c5d4a787f61c7a74367ff612da2a9914f66175322e0174f82051746fac88cea429094f306e9d96fe979b959ca37a56e46d7c73c7e88e87c1ae290a18e1a6fb19b79fb54190c5b2bf59c846276e0a289c4f2b99faa008c709b44be22f336370a8000c9c4413213826db7a6a4b7086789d19f35a52fafcbd40d12e7eeb382ac9cf80d446a05c3cb1d5bb268461814bd1775c6827694fc6c5079345430566895100b88b66fed2749a3c67512711e6d6cdbb94fe9396151398be6914d0e624fbb0dc15965fa81c656bdb7e7ec4c537b3c7ca422b2171f15f82e5c1319b0619fe73c23689a344a09b91335f23e003ea6f5a33f28253755af72e0e3a1023fdabfdf44389d9c44cf563c4c487d4fb467575ef7914789c28b896f4a84234ee356196bcf09e1b5539816a510f871689157f44021a26828df490ab714468246c35c1455829c1a2b892eb2bd094eb4d1bf95e763c87a7448b7189a11e532a4320874186407fb32470d18904cdd512fd265a9968f95225132717fa146654e725ad9268d5f062e0f5108de1a1a340acab3ab1c6b8c2fa1e92e3607871f3da4d4055ffbdc0f263b9b91a109b7eeb77f6ebbba75cc2140ff22832e36b561153cb37dc27a6b3c102cbc4e0120ce910dba0133ba3c23186d44e67b809791d7941cf508292ca3ad6c095cd24fabc9ccdfc36c63d3fad73760791c5c55af8448634e84efbc97ec2ce1d86263b4330f65d5a098932b355047c1a6ac6fd408f77b2ada467aa545af7f17a3b64a583f0824965b6c0bed78f60f37d17dfc2629503990c625f009be526fb77140cf62571cd3cbfccf123f4831596b04794b729af94a3d1c089b13883fc4694be839fb03b3381b89abf2492f69eb054687a3e1e45876dae4d6c1e82ddc46d43896d24acc351d2f0ce7f134b4068eaca08f4e9b8ed7850f2479abb33593bda14032e078390a48ae8c6b582860700a08187a92c720dc3e83e6d8a19a26cbf0776ba4acacd39a8141121f6f4cb90f27c2b92eb88d22d16adf31dbeac58aeba8ffc2d47e0f204e9290a5eb7dc9494cad82889407161d1dd1ca0e6ad05de85dade14caa9ec9aa8c42424db7ccc7988d63ef8f94c98a99283bed836d998ac988c7c4110f5301f9bd5800126ba26d2c3b12b2d51744111c5a70ef9bcc8e73b4d4be501ae9e6df934a9d71fdef48e38fbf82736203c2d1301b377a5b6ff74131a9592e6e229f8c0299d93e152b0652497f7bd93f4289f55cd35a33cd3f1c1bc86f610615a0c630ce14d30e630723e2e0e5c58c73bae1a329ea9fc4f822442a028e9f7f184da3f27d22558aed6ce9bade582735065514031dc8cfd5e401b996666ed8427e0f7efb992a255abd409e03cb3f6b7c01f9693fc2d5b20d9ac5c1867d78d7f74fd09e73aa960c25db6d8be42d0457086b90277ca07a0f152154a522cd12634594774c8136cdd2934dd9f8868e0eb4824c0197e53d1daf948198ad94e0a543d454ecd04dc7373f4d1d6e2c1075c54991ac34019f23285b33c37820013e9a404d97177200e43c1bfb531271ab6b91e0de9411add5da01d99aeedb48946d57225865e07ac216442d45f5af0d7ff7da3f100b80e2ade812f1700aab6b72f746b19cc72f2fbae3b73ed10d2c49b3a1082fd01a69e94fd7c16d5e20cfd2c664ceb4c2c4ecda11d6fd164aa2716d70f18378c6c8b40ae42f78140b362fc5b63a56f57165ffc3ee747e7d56bd66c1dd70b4e2991d498d94769ead2057b38b6a03483a52b150327a47a33b9d65f38d23a50135f22110ba86369a014488436e0b460b4c0db0c76fddd6d217c8a200186918d33878ddf2d9e3f6d6d820d3c7b4c18c07f3496a4dc13ea974db7f7c75abd85293b4d458d531d23fb9f95b3f27a6b35ca4f6aee8c872c549f24d69fc3a8e98daa772ad9aa30b7c98ab2e9ed44b8c0a3e4a1fe53122c89c3db2362f293709d0387937acac42af0989143d919b1baeedba6134964d410ce80d1e5d790c5564a8f56fce79959c65a09a5defdb9b8053855951fe69450f85d4429d8ceeab7ae64998f3febb5d97756954ec0c25dd60c5faa282450420727d8563968936108fd8dba96c8e1a0d1d268d3e2a5c1667a54a731e5dd112e6543a26f8731dfa437d8285b1424740ac15c234e17fa65743352b18534869399f9c05dd899b10e24a2a2c7037dcf1d242668f85c354b48f79fab012cbacd721543226d29f762a952f801ec4c3a4547bd8fad6a96e0f4c670fda20890ef2e1730dfee52fc16c33bcfa669fa8dd0137e174b8dec86a1a37870fbfc5a4a28050d7d0e78a1978e5f2feb1c3f9440e5b63ac2188f1083ddb3d968090e58c11c0ebf4a7d85cba4b4930045e8172c1dd1ba185e452559471bc253d6b35c969e3187c7399b6a43ac200b57508875347d3a7b714c7fe53928e23b923d795b9629ef2c9fbae6aabc1657249fab8bde4fd76686d00d175332b1a7abff1cc9afc9fccb59c35efdcb676bd08b43b750b6c0c51c68df10a9d3d869f28004e532bdc49f4c9bbc963f410815128bddf4759359ce92add917b5fb9cca49544e372309f889f96ee5e139b000ba93b2e8f368f85d4c8fa27852ba4ee24b229535733928e835484ff9c05b7cd3c4eaacdf24b95a5dc75a03178225225b7504cf4539e37f1639bfbb42d4331c03bc7dc63b18d53dddd7882c4106952a6ac0666f17fba08104ffc63d7b6d5f221319c38b77305b274ff5a0aa7f5078db92c5cdf10828fed327000242ee2c1e13845562893e1b998b469a29ea4d004eaa65fdb1f1a0525cfa1ee2ea6825611e54ca07c12bda2b3eee344d8a881496950b46c0a8ed6af8594a3f00f519abdcde8a6699660fe5ffb9d4ab7848f07073da92c7c71950e29b626819e298e40bdfbd18fc92d791ec0978c31eb2fbbfeb388dc56b6999a881ac06b832107c33afea5884de8c8c5e56c91a2df0760942ef453d17a4309070d2bac4df0a12e5a5129d2f428edefac1b0cf1c99e34a0825e73a570e04a4942650481b3124528b94de68bff6a002a968747bde8b49a76ed58d886a1d0f4e2b5584c47842f367b4af6dcd790594b02ebf2c6ffe66a606a3de2cafe4c91695bc6aeab06aa909cb27314b4be903ff3fe132431bead08af04dac5f116596cd03cdf2ecbc70c7d9e529e6e1648e56223a777e52f0324d6aecd2cc9f6d5b0a9510e67a25191923d64e532cda87e780b01837dfd68d5331c864c9cb5814439901658c6d0e86d241a17f397f915673181b51c8e33853cc2215e0990533969dd6844a263803662aa5adf0234ba030bf80e68fa13502e40b92e5f8d7169c74e827b0675a87ce3780c46e39c73d81b73b6f842a3721d0aea008bb05fa8c0d2fb110f8257fc8b98b732264c48bb1a04a651886aa1155fc24180807b089b200376736de0d3c774fd280542418f754966acb306097c62e1fd4d1f55e50eb45002c98edd496e7200b9d26be1ebf7072deb8ec2ba46bac36a6417c65118fb5a1a76fc4ca6e5b263f775be4d4d720ada8e395368eb4ae59fc19fa65ebd3c56f44408159412db260321d8f294ccfd505634f8038ce33c845daf5503cde178a8ec975f1e4d675452ba458b7826a7b450e3e7d1a716e8452067fc2e34fd05f578a9db241e61ee77bff12d3558ed26c092ea6e6b46ed438d402470d443d471db4e93d8fe1eb7ef6df40e9f7f98d090499ed19270e8fb3c3b6cfcd2ec373c6c51b21255962537b25d797b641042b62f76fd021b8595271a782d57ec21191c407f2d8e1c933bc97e70d79e44925d89497036e3d1545659276b099d8418f05b338e466ff39e68559dcd95e106aaf230275fd1de7b853279a93d8a36637cc4e38ea6861da35fb5c3559e3bab74020893116a565ae3c03270e915388b51f39e9b99ee7401f47d29fbef0852635442a79a4eb94ebfcfac5d242f1c9a021625856b9b8f9881ada1cde6b23561736f12d72d2875417408f1bb7ec379380479bc813bdeb17a069872a76ae84df0428d18a134e5c6b5e356385466ec559afa435d9af3a87aa3f97b99c270d777873876ff0c97ced33473802931c5f3d8494a3cb2d97c42159ac01fbd23e1c9dcafbdf16d213e2bc5458c506b59812029cc5e2c6345bcf4a8e7c54c87d4a304a4ef39c70be71144c371968ca7d484bb71ab9cdb18e69c055c136ec99edca0d1f6d014c08066f960f63ef9fd84abb40cd76f6e1178c504bf58a52560ac43be77fad9b6a474a6dcc986361e6babe5fb5b849f3b952be9dd68c52551d75611e740da92883b91b0a4c59ae16b9ec38a40efa0c36a30da5b0d49ca1b59f7464f0272bb83f04d7c8b379d5ac6495d75a36b11526365aa2d217eaa9010a7882405f756c83557a1e03f7f99ef6d217169366309c20893cbcb4516d33e8ca2529739ae34262f260063d56200815e59a3464e121f19395c5a5dcebf0bfd15b21c48f50e5400f9c332ad54ca1c37225bb9b4f05f9b7f7f28218ac5609bf5353fb0df4001fd7c1c98ff67c49e333a408d7b5d2632c41b615fe6fb31e1cb4d73b1d403236f78c21f0b2f392dc68eb24059b3e6f773e316676972571a29e32e5771515ca43e0efb8a8689ca982975c6ab2627fa6c0a409719af8d4789222bbf6ae5ef93ce57044fe670d6c30cb12f9e075ba03f8be023c70097fe7384b3eb2933767550a6a2a5e5b931decb92450663df62e65d5edbd4cea38a8f8216c46a933b8cad3a360738e68e31698b31cd403db8a2c1fdede49ad38af1061d443ef12608905dfa856f0479ead73fabf13226531c83f9c73ee4bffe3e322ceb1807c80924e84e389bc052c7578d27d2da5a00ce926d55625cc1897846b7c9959908376517fe489b81e46af85cbbeba8f52e16d5a3c89f774c6541692ae6a5c2cf298662673913cb3ec1943382c751d74996af91d5fc9dad17b62ef97329871bc353fc279e007671da4118a04f1a2204de7b152ab37118adc69e9a4ea8e739477c6ce2dd43bd3a355e4b3d684d1c25d9bdc38ec7c290d71e6104cb93518781ef025d80abdfd727bed1c64db3043524feed5863908cbfa4a9eecf0aeef77328bb5e0f1ebaf9b605b53b9c8ea8fbcee51b7620dcae986745f677e99f872112f6529769043219c29cc1a4b44970ba4d32d7610540496ef183ac0339d28757ccb25db5527a3ac863b48b15f6c532c91cd1dab5eed98897c326739ba7eb1621092683c1b4c7fa8c0114ba954a4c17b1a18acd7ac2ed949a47f6f5461b315b0831186dc276349bf00485f72d982447f9462758b96bc595ffe4bbd70c7ded7f93ac51c3c080094579d4cfeae4c896e929726e2279d0a9b24f013cc4f5b568a94be3992cc4ba8e1fb1d9ba3ac2c2ea26c98c29d4c2d9e013110842620aace702b63cb750d40c0a521f7b0e90cf6e682562fe1e159c6eb4e1cd6095595248b5b25e2075d8fb5ec7054b23929314b5580f7b2f168e10776b440b71fd52d57219e0cbf8996c3e980b61be370fec987d010b9d87d8e725dc4e6354a342f59c135ab5832aecb3a7a21f8eff214d4263b0ac424f6e2ec7e485a5672f5e2be9ae11c158102036563d644bb39647143e7e34a1db194cded6535bb877250a81d7145696f1fa403ffc08c6d6f90c132c88f0f328ff8389b1bd7d44cebcbd0f0c66d4c821aac7f4ce4e11b10a87e8eb5cc7c1d389d6168d6f246729315e7fd5943ff851a9a901a3adf45f0b2d86b2396da3fabe0b8759c1e0b21bf32784f3c5e10987d878162fb4a295fabe881df36428c6a29bf73bd58bcb10a088f956a245ba6d8a44d41ada9176d9ebb0637531d452d5c15295191054fae6fed2effd13bee913087f06dd89a1f16a39cb06b5f7f1b67b60ca2d4a948533db3db850a1ce9934a209705586c44cdaedecf5b806ca231b5e85ed07f5e9843f97662166695c3c64c396ff0b3d14fafb0d0d18c29034d248263ba26b4395bbe6c381f7777e4411411db5146f2cff131a70a31b6c7abc66067c87d1a05c2290ef079421cc080e7e92597197c8780fff00beb6e6feedeb471d087362ef67186d240aa987ad2e43ed211ecf705f4ccc2775a04f61c01047dd5571063ea08cfdb94b75c71161186ac5b415d9887ccebdf140bd7474fa0c5a91765f484bfbf55bdc2deff7a732ef0b6e14e596c566266ac62bbf3007f308acc9477c427247c7b93e9221403166dbae5009370e10677d5b0ffc4b8802f42dc3ee916dfb9cce2da04742b2aa974603dcd35ab34a52c5fb19327c0c864d45a229691cdd7bafd64d975f044b3dc11a901c5fd1005171c9c72b9973a731d02e9066a0b072cb95a84f26eea19402972aa9f75c34c72b57bb0a19aaa9c79174f71f00fd15d4f2348c5cd55ce2340002bd77f4324cafe1eae3eb6ccfe512af1fe77681e712acf876c99c2d118cd43fe81d229b49e1617a148893ab6ff13092ba47be71c671a2e641a936b5756a1bc83390d17409bb84febbf4295ef193ca422e5f1e5601f85dc37f7252f5f043b2a2c95fac08dba1c176c96dd60dbf9488c86177bfba02708697176d1a76ebde40d594d2dcde255cc0e9253cc24140bb112b3dd7c92430a0c46bf1e2b4bfcc046e6a7a30897e50b5285fb7a91481dcd20e73a9c7631df352c046f5194859fd7de46865c3da71c571a2e067fbf556fb9f26a98c8eb52cb34c22300b59ffcae41149d73cd1f83eeb5bd5751d7c8c4705ec02d4d075e8d9d85791311bec009ceb8846c0e7a30b6d293a6a25c17202dc627f49fc5cc424acca3bb5520d18745679a9822a4d813a87e9d508f93b267e9d7b20a42918c3902ef2c0379ac9268381f53da61d58b2ad1392f558f773e02913b699bb64ecb955e6b6aebf12375e54a4c90c59a1ef808d998c62012952e82ac57cb135b4c0f09a5c7fccf4c0400710475cde44bffa3102a13ee4ac97be85aa3b362fbb227cae8819b6e37faeca6adef3167b0e7e620e33b412430148a000d1fe4adcf4b5083c47a4c1bb07e4bed0e72e5fab60e70d5f49596f46a744e1a1c695228089754ce2fe850a1c3568057f53839f35e200e46c6b19bdb7479367b0b28824e3216a31e7d645f7ceb14485c049773ee23bd3cf7cc27b655c883e1c75bc60bacc659d9d95f66bf298228028daf194a47a1468b7d97607cdfd134be7380da44b04fc157932867f62443122d51774613ac514c582c9ae455e648fc5af40ccdc3e5490daae07b00aaf98853474bdfa66668ae4f41a9592be8058a5b15ed62291fd82c6f5235c9a93405dc7bdec15aa2c91932bfd65854bf99ca0fd19db423749ef56486dbf796ca27f5a9ec62767ad3a24a692e64de0017e18053e040ecc328f7c9abe4a6ca54fbfd359b3560cfb2b18858cc1b9b9f0dbd65e4f117bdfbc3ce80c14cf9511296b73a420ad7583184b4f1e0d5f7e90fb0288d4461d8536597cde078d2455954de7455b79352b7407356656f0 -MD = 26263445024bbdbd0518b331a7ab88e7bdc8d8344a3480d1c19ad0e7c7cb22447cf88e53d2536fd215e25c5158dbc52ef56585f7ab5b771387811a9f9afbdb7f - diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/third_party/NIST/SHAVS/SHA512Monte.rsp temporalio-1.3.0/vendor/ring-0.16.20/third_party/NIST/SHAVS/SHA512Monte.rsp --- temporalio-1.3.0/vendor/ring-0.16.20/third_party/NIST/SHAVS/SHA512Monte.rsp 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/third_party/NIST/SHAVS/SHA512Monte.rsp 1970-01-01 00:00:00.000000000 +0000 @@ -1,309 +0,0 @@ -# CAVS 11.1 -# "SHA-512 Monte" information for "sha_values" -# SHA-512 tests are configured for BYTE oriented implementations -# Generated on Wed May 11 17:26:11 2011 - -[L = 64] - -Seed = 5c337de5caf35d18ed90b5cddfce001ca1b8ee8602f367e7c24ccca6f893802fb1aca7a3dae32dcd60800a59959bc540d63237876b799229ae71a2526fbc52cd - -COUNT = 0 -MD = ada69add0071b794463c8806a177326735fa624b68ab7bcab2388b9276c036e4eaaff87333e83c81c0bca0359d4aeebcbcfd314c0630e0c2af68c1fb19cc470e - -COUNT = 1 -MD = ef219b37c24ae507a2b2b26d1add51b31fb5327eb8c3b19b882fe38049433dbeccd63b3d5b99ba2398920bcefb8aca98cd28a1ee5d2aaf139ce58a15d71b06b4 - -COUNT = 2 -MD = c3d5087a62db0e5c6f5755c417f69037308cbce0e54519ea5be8171496cc6d18023ba15768153cfd74c7e7dc103227e9eed4b0f82233362b2a7b1a2cbcda9daf - -COUNT = 3 -MD = bb3a58f71148116e377505461d65d6c89906481fedfbcfe481b7aa8ceb977d252b3fe21bfff6e7fbf7575ceecf5936bd635e1cf52698c36ef6908ddbd5b6ae05 - -COUNT = 4 -MD = b68f0cd2d63566b3934a50666dec6d62ca1db98e49d7733084c1f86d91a8a08c756fa7ece815e20930dd7cb66351bad8c087c2f94e8757cb98e7f4b86b21a8a8 - -COUNT = 5 -MD = 937d7856a82a84c163c79417d0540c47daaf9ffe662c843737dbbcbe5f865bf6f47a9d2bd10129a4f498073094653c324a2519a1c71ac1279b1623ff7d24647a - -COUNT = 6 -MD = f8fbc058c2b9f84131c9decfa543a35ade41581f670398efd61b3abfced9c1cfcb5324f2370487f9c59a65bc668ea596c8d22ce8a33014dfad28357fa7d05f04 - -COUNT = 7 -MD = 4ab0c9484ff5c30fa64ae6e81510c5fea566eafb88f175f8bc19109f40fe80014c8b77fff10b8750778429bf3c5497e4cb92d9b30014f4cb975dff2a45244c28 - -COUNT = 8 -MD = 685179397554d276513d630234a03419808c698abf2600d7490aabb8e455c6ab6ea412c7729dc140a79dff66533c6946cbe90f9da9ed16e2e629db1651bea870 - -COUNT = 9 -MD = 335e6e941ab7dadfecdb74ea6cb4e8584b6e3408841a33a6cf7fd6a63294b1930a60983240311672acac3840a90e64cc366ce75081b2252627e9c31197ebad03 - -COUNT = 10 -MD = e3217f6af6e279e9445dc3738cbf9ba0e9edba0455844a73648139777afdea2c4d8032e214f541bf92675fb23f24df8e4fe98e0003aadfb6d8f9cc2cd799bbf7 - -COUNT = 11 -MD = ee2fdfb3ae630613b7d890977cf2515deac272a37f27e4a01961ecf103d4ff5b45cc8aef53b635dd75aa51aabf71c0642555ccd3281e0388f8ca09d83258cf30 - -COUNT = 12 -MD = 6a30d97cc98af6a25b673dce7aeab8d762bf2e55ea0c6dc899179281f84dd02a2896f77e9c106b472f55f7adbef7b1157be567ee1236ebdac2a3c5d8cb133eb5 - -COUNT = 13 -MD = ac1176abdc5f71170183d92ae55856221b0d95590af11d9d72ba605ec026bbec52d6974bc43a1efb125ff2b161fbdc616fda00f04193a0bc26aacdfa052a5741 - -COUNT = 14 -MD = 59fa909480620ecc08d34531a6da1b55158b74fc93ddf68e1d242615b6f3843a7952e63e798c6445cde1b07e0be09d0d711cb7b42a0e7760a593b08acfceb63d - -COUNT = 15 -MD = 9eb253319efa61b864f27bd334d7dd78b38d3265fb544e0c8edee950a547e1d8db921a285774ab94d66beae933298d20f2a5aa87c62fe1e383cc3b18e7af18ac - -COUNT = 16 -MD = 81735324005671f7bdad9e685ee8257f5e0622b9fcb5d38dbdfb2df27258c3e1d46d76e24c0c92c744e1b50a2b4b0d31525b3af83cc80a75722d921bdeef59c4 - -COUNT = 17 -MD = 17498cdff4323bb8021e44eca6559e05d8ff9a0ef2ee9d4ba0ac6e73f83972a0dfbb6d47728fa70311d7c82e154966e1b7678263b0f65133e9116969193d429b - -COUNT = 18 -MD = 228c4574d7c45eb9ba9240722133fce74abe00c7328ab30b4bde373dc79afdd6e0569d36268cd5eaa2f27205fc00512577bcbb6699e1d66ed85eafaba7548afb - -COUNT = 19 -MD = 3d40ccd9cc445bbecca9227c67fe455d89e0b7c1c858d32f30e2b544ca9a5a606535aea2e59fec6ec4d1ba898cc4338c6eadef9c0884bcf56aca2f481a2d7d3e - -COUNT = 20 -MD = e1e577aeac92e3a2b7f8a262bf2ac9c037d2274ca6618fbe4cc21db7c699e9946b6671ae45ea433a1e392a5bc9eec96fd641ba8f4a047f022a04a337227004df - -COUNT = 21 -MD = 5e4424c0bcb2f0f7a2428821a9d5840a82401f4440ae6bed25c53cd9e71cf9d39904d6a375bd721f4332ab0202529c91feb9c094c3e6d34ca4f66649ee6fa212 - -COUNT = 22 -MD = 56b199d63ca37189d5ca0d40006ac7bcb9f39cbdc00ef7b8a5697caa7d81d05b645a146995b1151d01958f1589337e14afc6e7dd10a815170e527a398e6ce8c3 - -COUNT = 23 -MD = d2d498ff93fb03013a64f295b5bc68e57d2fb5600da578aa011d43ff432eae3e0c800f9e2a53155e56fdbf5e068fe2b4beb3e42b2585531b8b16c4d8ca3356c6 - -COUNT = 24 -MD = 3d3875489903710f17cf4247b5842ace6f017b1a3b99e9ee5fbc04fc7898e78b12693879878028ca40c63cd0f6925fb7d0ca0412e4f06619e3ace223690f03b8 - -COUNT = 25 -MD = a013e21cd1234483c95c2ea2757be949bc79401ba39b09c316a1612d594642be65ca106e12695ac3808c57c6f2980e895fd1fe188946562afc238414e1e43649 - -COUNT = 26 -MD = c5f6367d7195489e16242f912fbe0d8002e947de3a7e9c53f77b1e5e90e05bd7ca395e787e34cb5f500c02da59c9d83de35601de7ae80dae74a0d6b4a292d43b - -COUNT = 27 -MD = 7c28c44c6aaba83c122f24d68273e28a5afd65b4071d02b7ea3300478d5118971e1356ae57cbc70d2a177ea464a1c2c50d4297b933e789c63b1481797ae8f08c - -COUNT = 28 -MD = af7cb42b1c70a85ac1ae1c2991b25b657c19f4fcf83af7f7dc0ae1028c1452a6a17dc98929634fe6ed3855b70b96bc2caa93d82037b94ebeddc77e4c1a7cc563 - -COUNT = 29 -MD = bd56ad4c0cbd162706053da929d667253aadcf417affb483fff4f2699bf406d128cfdf5196dfbb05bb89ccbf04c5147bd2ebb3156b0bc1768ca6faa171c91c01 - -COUNT = 30 -MD = 004d7b0fff9bcddf4b3913ae190a76728705a3d23874d92a8b7ff246c8fcad46623cb04723c8aded0cba4968d1a8cc1375b99005786c1bcb7ae4bf13325c3ae0 - -COUNT = 31 -MD = 8299a5bf5ed64f525c4eebbeca969fc1b91a81adb58c584bdd2d7676386a31fa546643a3cf505007584f02fb712d708cab645bf078a1b9339f5a76aee985d017 - -COUNT = 32 -MD = ce7100f3455db1a9776a9f40d562ea998afca1f9fee7e0d81c8db34cf68ad23a8bfa6fc04774703e1e56d5196b66966158fcf2a8335a58c6ba7ba1af756ba1dc - -COUNT = 33 -MD = 90aaabcb655ee921b8350229efe6064a60051cf0cac858fa3d43afd5b97cc82301bd1b8cc1f874022e5af948185638783a13ca1bbd5049ace7fbf4f6d90c201f - -COUNT = 34 -MD = 3cf0a25b33ded3e0806dfe603b9987f1d6f2b3fdcb1ec7f8566828c00e17e8f59e38b3bca302396c7525ca194e6cc8501369059e2e34ae21e3141215876847c4 - -COUNT = 35 -MD = bdc5266aee339a1ff13fcf5229773cd3d14b47101e83076927c160bb71bf7445590525a2012d52af008e118e16df1b6bfcaf8f22b4e45f9e749f3c20625a2bc8 - -COUNT = 36 -MD = ef8d2ba885381ab97756d59dbbbf53a1ea35d152b2d8f82c3518430aa34e708359194ea43950d032e151f576d343a5c3cfe6b71d4ed0ead9d3a107402589bad0 - -COUNT = 37 -MD = 194ea5324c4179998dd7057755f255fdea04dadf533f7851e3e9718b610948e32fd28323077d9421142ac808978adfa325b668c8599a2e01c757a5a14ed2dd37 - -COUNT = 38 -MD = 106984d2f0087e621dae760552bc6279072267883c204079481af6034354f1a2b77c17e6c039a1063e479342aa3ccd90330dd3fb5a7d5e976619497e2d3326cd - -COUNT = 39 -MD = a1347216f1a6db47b90c4ded3c5c75440f54c22c87d538314d1340f86f88acba01378acb933ddad0adc6b75d55bfb7e8efc9c4a531b2a410610b7515b6dac66a - -COUNT = 40 -MD = b76e4db147e0eaa4f04880654088b9d0fce518c8c377d92c846345604dc6b2b18d377fdb8e30f06d9bcfe6d7dacc07d6adff73d98d49f8f132b80f3084390830 - -COUNT = 41 -MD = acd4e527763dfd4513f0def0b1edf8ea12dc78d336b7b796f3dcc32e1068725443a2f55ab4f666b27d6bf2ab39669c98293f0a9108051fd3144d31a1ed171ddd - -COUNT = 42 -MD = 10128c15494bc87a87374f676ef9fe2df20b36ffcca41a80bd40b216637b3de710efd070e277827820a7bba3cceb7b21f8fe7f9775d6c4df4d3da5349434ec49 - -COUNT = 43 -MD = 2632dd5c188c6ed3a4610405fdda704add752f5424d9de65a51400fe478e26cd0412e5f91ca4b744c34f4954f40a3a4254431d21954623208b527b7b4daa687e - -COUNT = 44 -MD = 45707f5b6fc5ccd1f78d77f177d10fb8b462c74cc821518cd5cfa4b5d6b40b418044900693c37abbb82367d340fec67f800d74072935da1706b4d90ae26099c7 - -COUNT = 45 -MD = 56c37f31220b5b3040373d91b2c5e42fe9e601a12f7f8dc4534459bf28e484b8713db243c5782c031e674003a3c14c42fd152e7188789065e82795e10f87d54b - -COUNT = 46 -MD = 5da94c899d48bd8299fee3d81662f8d6c5f8f8bc54d18cb0368b13cebaee7ad71e74ea80f34974ad166f04f9a0602809166fe4085a475a8ca86cade12b6754c4 - -COUNT = 47 -MD = 0664363f97ba910760b0922e31ca880ca97469506cb007e3108c36c3ce3ce1801fb4197609479339e8820632b6a38bffffee05a9adc11cc544b9aa6f5b95cc6f - -COUNT = 48 -MD = 732c41a1edaa727c04f627ff158aaff67c18efd667216132b99ab84d108996a10bb008b5d803b22ed1aa78bb0d10f8a762fd34777d7dccce8e84827ba88d4193 - -COUNT = 49 -MD = fc9c21d67e393a2b05a23a17d8db630cbaebaa3def211181749f1bcad181560627fb60ee20fae2e5980cbf50fce0a19dce807e7fb75c4da0ef008bc75d413a65 - -COUNT = 50 -MD = 0453b765afc1edffa595efe345177f5805ed3abc1297ceab757ae7161723a6144cb543299f418049276d16b7896662631634fab9549127c10f27505b7dee8665 - -COUNT = 51 -MD = 3853f3bf024e0668e8d1ea53733a97537f97d9307c5f3a19864ab4eeb1654710693bb961a344dec8a758f5e64b26fcb6dd423419c4a114fa749211a9de06c281 - -COUNT = 52 -MD = 240137f0dd57beb3f7fc283bb3ead423c67883fd46f4e27471d7be57ad469a49bad03a3658418bd55614678f3a463bceff85291314b90ef43ccbcb028f0a7a07 - -COUNT = 53 -MD = f9050a5271edbe4cfdb9520ec05bbdc3cbcb9bce36fd212338d3e7028a39b9ab30793e561d75a2e424193264c7f0775e65599ef0c94e0ad24dbfe18252364267 - -COUNT = 54 -MD = 47caa7a5862fad837aaa409a4a9df2575e645528c35159115911b7c4e2f08ae49d68de97249b31b83ce2c163f649cad4559dc6e6a7191f2922d79a5fd6af167b - -COUNT = 55 -MD = 13f5825c41fa49edf6104e3e35c9c224eba93e37374f730004c39c54e7391e4a847fd61865235a3fe32224c96fbe86f7e14c3d5df496e83ec989a71b4f293a44 - -COUNT = 56 -MD = e5b55e05efe1ca6b9a96a57e3a1523d610d70f837e93b31fa98c2736d3e114d238d46ec6b6e3d19e774b253f6b0c7a2ebe69b7e60fc0874444806b2a2278df45 - -COUNT = 57 -MD = f14a586ac30f0af255f597a9aef9abba5e99c04d17b01f24427c4ee2c196b52acb1ceefc9b15cb822b3ecffdc2f7c49e11d3fc0769acee33361537d379c62e0c - -COUNT = 58 -MD = 7e2d3398807195c48e6ec52d20710bbf8b21ea8de4d1abc197897ccc58aeff40259edc67270cdae0edcc686c0d0dccc5760c1495ab1cf48482dc2000ae2d42ad - -COUNT = 59 -MD = 2f3d5c5f990bf615d5e8b396ccbd0337da39fad09b059f955a431db76a9dc720dffc4e02c0be397c7e0463799cd75fd6ab7c52bec66c8df5ef0d47e14a4c5927 - -COUNT = 60 -MD = 483a1764d308cc494a2b543d29ba616483aefdf91c7769fd084eedaac1add1891df95d317a47430b2bf73e4081f86597020e28afe2d34a22b77ea62b6112d09a - -COUNT = 61 -MD = bfa88691ec951511651c6f14af100eeb26d87729e18ac3ef49a80d73ffeaeea53e97c4a7277a7ee9f2fba070b1c9720d6cdba407dd82267019e3f0f5662b2f2b - -COUNT = 62 -MD = 4c17c8e2e7132dbf82afebc40efc77926d16f4d2c082d846dac28733aa767e2840ebf04f2563df75933466a36e11968d342e4157827605d04d9627ce9b5216c8 - -COUNT = 63 -MD = 70bbfc29a2a765220af84e7bb10d759a3152ad4b5643ef6b89966950ec7ef9503d57bc0a28c4ee789a60bf9dcac59139e15241d73b990410cf92eff213da9eca - -COUNT = 64 -MD = 8d1d56f37fc19b84984a6fa33aa9c2dbdbf79a29c04ad0b4cf20333e6bec943447be2416242f8cd2f9732e79bb925cc5a61a80c5fc9c079961243fd1c1f5900e - -COUNT = 65 -MD = 492fd0171f4dcd5d20ea6c0d34b5576c8894664ae5955e6737f5e3b711c2804d99ccca065b7ec18c82da98b18a3029b765c51ebc7c433b36492e0ed6b8511bb6 - -COUNT = 66 -MD = 7f49e8e54db7e5b4323cae2db71f3e8b8eba172dcad3602e9b7b058007a5589358732d5afffa56072a46e89b1ea27ef8d556deb86b569c635d394f15d99d8a15 - -COUNT = 67 -MD = 56884a6a9210d5f371e25823efb2511a9c410c26a441e07c1bdffe8605084267d49c315baf6a692d7d97844b2714b4930877a5d7f52cf6fa151700fcb6980546 - -COUNT = 68 -MD = 6aaef8284eef221ecb17ea3c9596f075b5155fe7b925d737ed3c6543c761c28c7cd9d9d4b5e2a37b2f183a2a367bbd34b633497bc7a1737d61c8c1f3ef295062 - -COUNT = 69 -MD = 38ef178f5688e59d47c375252db7b39f40c0c84169878ee7ba5086e4b25fea81076b9c37847e9e6bf24ae0b343689c265ec5ca7469e619acd61b0276721efb1b - -COUNT = 70 -MD = e3fe1aabad120777cf24eaae289b486632ca46ceb89afae73dbae5fa87c767879369355a9cc5c21ca604ed91d0f2f58c466573f3e6d88e52c62c0d3cb188e141 - -COUNT = 71 -MD = 82f5bd920457bb2763a0da031a7fed47b236951b1ea420c20fd2b6de1dbfbb9c4600ea7092788493e2d4be6ee24b6dba04e57af3e8f2f14d9837295420ac7631 - -COUNT = 72 -MD = 6d0b26208ba9b1615067bb3ff97b292fe67e4c02d240d649c32370e0a4cd22d03bdf864be4d24a3f5f51aeccfd1afd5191e590edeb5f7bec323b0506c3104b89 - -COUNT = 73 -MD = d081083158054d08371ec84f4d3aa5aa761734ac6091a30330a861fda056f835c750bf4f7981af1693ff28545366bd05cec47bccd77a7d237befb0135c534138 - -COUNT = 74 -MD = 6ba8b52780b8a07a2a2015dd8f0c5e7437b8e024c4ee428f7ba91dfea118cb72a939872550983317132b841b7cbc29a22b8f1cfea0c55203cafc69b55ed6244a - -COUNT = 75 -MD = 312692b0a51f002b7f06d05b39d15a5637dbddd2f4f1a73e6c88a4c841cdba5cd8e69c0939ab39bb1a9c54fa35402143c97edb9704a0e9e1a98701710f6a5dad - -COUNT = 76 -MD = aaee960de201a8dcccff95b834fccf0dafc03fe6cffc0429162bf4aff01165ab07a0c9435e9cb412121b7ba010657ccc3152118602b665072136317d92fd4262 - -COUNT = 77 -MD = 21fdff552e08c86c07f080cefacaaaf31846eb893bfe2e4f88c3c3cd8cbf592a84500942695a5e5ae971ab343ce2695dd1baeb1f94dd4b53d678e14265e421ae - -COUNT = 78 -MD = ca8f1a5b2172f6adb474da53b35e3f73ffd88263d3eecde72e48b16e1a0658015b555ee319005a1d82802e91431ee777610f9b1028d819921e1044ad426b0270 - -COUNT = 79 -MD = ce5ab25eff9c1ddc569a1eaaa66b689109ee269db7066e0b02d39b3564fd14ca6249987b7791e203d3d7c2ebf18558d2f23f94c03dd1d03aa63849e4d2889a76 - -COUNT = 80 -MD = a6f8b0561000dd4ae8b828c5f676e8c1a6474c4a042a645f1815bd52e9ff53c97dc36d5d8997f8ce332185feead76267f5b2e63f597fb3345ca0046e58fc0f24 - -COUNT = 81 -MD = fec86794bad4106c5ad1c1a2d9a1b7aae480396ec231eb5cac21c4077d17a0b652da0037363399a5a1dababa4a40e4c54b9124167580dee9108c4dbb24c57512 - -COUNT = 82 -MD = 594f5dd3f4c87bdc0d81309386e9163a9718e34c7b0dcb4613f8487aa786f9d211cfb61bb247fa9f5ecef042e710f192850f5571807294bfd8a54397850e5773 - -COUNT = 83 -MD = d81ad866f25ef6a0a6431d267114da564513e5ebdcf48db7e95db8cf32a89f0ab107874d796035db97420ffcf1db5f04dc1a52ddbbb960fc63b7f3f835cc8be6 - -COUNT = 84 -MD = 431d537e098e9949f6a68108d55d20952e3bfcdeb7273bac3917e37790a84fa5db04c33a79c113a06cf333e831d7702a00853a93fd0aa5146d934f4f71242a6a - -COUNT = 85 -MD = 4ed95636c6885ae4e63d042e82f4da830c702dbf3b9746d64770a64dd666b33208315f3a947c4dff790771ef283788a9c74da83e22b97f750286a820ee46698c - -COUNT = 86 -MD = a9bcb60b4d7724cdddddbc232b4ac70b94d0d7e9f0724b1222d918930cbb9bdbb04b3ad43e3c8caf3bf8b004ee4aec6bd527ff8eb6189b44827f7ba7057f6a90 - -COUNT = 87 -MD = d6d5e44d5bb07fc4144ab6ab309f048968f73f7992beb326047e9e2cd7af6240bc8abf46703c32fdb58fb2a8672594a660ef855be74f24cec09d4fb00219de82 - -COUNT = 88 -MD = dfda9ac0c7147530da97715ccf47814182255f2f2cf40287db97a4c63b43fcd39e6d41e560921492badb253a7dea0aba863c7c33b912bb59d1ff4de03a4f03bb - -COUNT = 89 -MD = 0395faaaf2e907f27779d6f1cc9c9db68ec390a38fbb0702c6475b46f7a399498d46fd8014f834b131e1e83abba0359b1f16d8fc0a393580615def2ad0caba73 - -COUNT = 90 -MD = 41cb98f09029abe85d24a0f131f116c7f69f54f7e91c250642606512bf3da4ca89ba70a4714a5f66d9ae81ff09317dadaff12a02057074c970f0f02a52bfafd2 - -COUNT = 91 -MD = 8e8f161d48e306c5533ed614b8ef3a1979df6db7e13d0780a73c4a3980ddf0a95f93941d412c93683e39915a660c3fbec0dbb1bb6beea2e2099cd968011535c0 - -COUNT = 92 -MD = 789593f0b8fb83ef9b3ec50ab8f6e1e47344f763d4f7ceab5600989e7b6fd5fef6ee5e487975f64474af6cd71ae4d9ecce8f009edea0227c7ebe73080b8f961b - -COUNT = 93 -MD = f37e1449e0b313d9537a6177f7a31158d353e5b79c781facf02526ec94e0c6cfda37105bac67098b194ea82efb307c2929a9ab8aca0e76c53e829e3f901cd245 - -COUNT = 94 -MD = 2e74e745caaf2d449ab3b031dd214b48616853a512cf2e95c40cb8e7594fe5e4879ac8a26d02eb35b3b96a5c9e7dcae3e15fd050a0bcc1fb3b9cb9c4df0fad3e - -COUNT = 95 -MD = 6eac7069c26082e52574ca6a58abb9b1b9faf452e8cca9f1c7023679ce192ca554892f30e38104d39088a24df35612444a0fc90084af7535fd9344fa51dded84 - -COUNT = 96 -MD = ada6caf30c4f6e3644d952366e01519af6771b406e2c447552f0c597b8dd10e9e9b4e699c9a835de03f422be8980538d9786172dfd2fe511db272a1543d5aa35 - -COUNT = 97 -MD = 4d4b0086b2cb05d713f2805caa7e6605c8f7dbbb2e0f92aa159aebdcd63060305f47b748f1bca6e0b6e11cf8f9697fcccb6584b878c4b54a699290728a40aa1b - -COUNT = 98 -MD = 97420b8a0ad102aeb92139da2c052d2748dd7d2dbb93a9ea79dc15b520d0ca7cab8cb7a00f5b5aebcb49d7e7f52a27180935ce617aeecdecba04064c668edd37 - -COUNT = 99 -MD = 4aa7dad74eb51d09a6ae7735c4b795b078f51c314f14f42a0d63071e13bdc5fd9f51612e77b36d44567502a3b5eb66c609ec017e51d8df93e58d1a44f3c1e375 - diff -Nru temporalio-1.3.0/vendor/ring-0.16.20/third_party/NIST/SHAVS/SHA512ShortMsg.rsp temporalio-1.3.0/vendor/ring-0.16.20/third_party/NIST/SHAVS/SHA512ShortMsg.rsp --- temporalio-1.3.0/vendor/ring-0.16.20/third_party/NIST/SHAVS/SHA512ShortMsg.rsp 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/ring-0.16.20/third_party/NIST/SHAVS/SHA512ShortMsg.rsp 1970-01-01 00:00:00.000000000 +0000 @@ -1,523 +0,0 @@ -# CAVS 11.0 -# "SHA-512 ShortMsg" information -# SHA-512 tests are configured for BYTE oriented implementations -# Generated on Tue Mar 15 08:23:49 2011 - -[L = 64] - -Len = 0 -Msg = 00 -MD = cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e - -Len = 8 -Msg = 21 -MD = 3831a6a6155e509dee59a7f451eb35324d8f8f2df6e3708894740f98fdee23889f4de5adb0c5010dfb555cda77c8ab5dc902094c52de3278f35a75ebc25f093a - -Len = 16 -Msg = 9083 -MD = 55586ebba48768aeb323655ab6f4298fc9f670964fc2e5f2731e34dfa4b0c09e6e1e12e3d7286b3145c61c2047fb1a2a1297f36da64160b31fa4c8c2cddd2fb4 - -Len = 24 -Msg = 0a55db -MD = 7952585e5330cb247d72bae696fc8a6b0f7d0804577e347d99bc1b11e52f384985a428449382306a89261ae143c2f3fb613804ab20b42dc097e5bf4a96ef919b - -Len = 32 -Msg = 23be86d5 -MD = 76d42c8eadea35a69990c63a762f330614a4699977f058adb988f406fb0be8f2ea3dce3a2bbd1d827b70b9b299ae6f9e5058ee97b50bd4922d6d37ddc761f8eb - -Len = 40 -Msg = eb0ca946c1 -MD = d39ecedfe6e705a821aee4f58bfc489c3d9433eb4ac1b03a97e321a2586b40dd0522f40fa5aef36afff591a78c916bfc6d1ca515c4983dd8695b1ec7951d723e - -Len = 48 -Msg = 38667f39277b -MD = 85708b8ff05d974d6af0801c152b95f5fa5c06af9a35230c5bea2752f031f9bd84bd844717b3add308a70dc777f90813c20b47b16385664eefc88449f04f2131 - -Len = 56 -Msg = b39f71aaa8a108 -MD = 258b8efa05b4a06b1e63c7a3f925c5ef11fa03e3d47d631bf4d474983783d8c0b09449009e842fc9fa15de586c67cf8955a17d790b20f41dadf67ee8cdcdfce6 - -Len = 64 -Msg = 6f8d58b7cab1888c -MD = a3941def2803c8dfc08f20c06ba7e9a332ae0c67e47ae57365c243ef40059b11be22c91da6a80c2cff0742a8f4bcd941bdee0b861ec872b215433ce8dcf3c031 - -Len = 72 -Msg = 162b0cf9b3750f9438 -MD = ade217305dc34392aa4b8e57f64f5a3afdd27f1fa969a9a2608353f82b95cfb4ae84598d01575a578a1068a59b34b5045ff6d5299c5cb7ee17180701b2d1d695 - -Len = 80 -Msg = bad7c618f45be207975e -MD = 5886828959d1f82254068be0bd14b6a88f59f534061fb20376a0541052dd3635edf3c6f0ca3d08775e13525df9333a2113c0b2af76515887529910b6c793c8a5 - -Len = 88 -Msg = 6213e10a4420e0d9b77037 -MD = 9982dc2a04dff165567f276fd463efef2b369fa2fbca8cee31ce0de8a79a2eb0b53e437f7d9d1f41c71d725cabb949b513075bad1740c9eefbf6a5c6633400c7 - -Len = 96 -Msg = 6332c3c2a0a625a61df71858 -MD = 9d60375d9858d9f2416fb86fa0a2189ee4213e8710314fd1ebed0fd158b043e6e7c9a76d62c6ba1e1d411a730902309ec676dd491433c6ef66c8f116233d6ce7 - -Len = 104 -Msg = f47be3a2b019d1beededf5b80c -MD = b94292625caa28c7be24a0997eb7328062a76d9b529c0f1d568f850df6d569b5e84df07e9e246be232033ffac3adf2d18f92ab9dacfc0ecf08aff7145f0b833b - -Len = 112 -Msg = b1715f782ff02c6b88937f054116 -MD = ee1a56ee78182ec41d2c3ab33d4c41871d437c5c1ca060ee9e219cb83689b4e5a4174dfdab5d1d1096a31a7c8d3abda75c1b5e6da97e1814901c505b0bc07f25 - -Len = 120 -Msg = 9bcd5262868cd9c8a96c9e82987f03 -MD = 2e07662a001b9755ae922c8e8a95756db5341dc0f2e62ae1cf827038f33ce055f63ad5c00b65391428434ddc01e5535e7fecbf53db66d93099b8e0b7e44e4b25 - -Len = 128 -Msg = cd67bd4054aaa3baa0db178ce232fd5a -MD = 0d8521f8f2f3900332d1a1a55c60ba81d04d28dfe8c504b6328ae787925fe0188f2ba91c3a9f0c1653c4bf0ada356455ea36fd31f8e73e3951cad4ebba8c6e04 - -Len = 136 -Msg = 6ba004fd176791efb381b862e298c67b08 -MD = 112e19144a9c51a223a002b977459920e38afd4ca610bd1c532349e9fa7c0d503215c01ad70e1b2ac5133cf2d10c9e8c1a4c9405f291da2dc45f706761c5e8fe - -Len = 144 -Msg = c6a170936568651020edfe15df8012acda8d -MD = c36c100cdb6c8c45b072f18256d63a66c9843acb4d07de62e0600711d4fbe64c8cf314ec3457c90308147cb7ac7e4d073ba10f0ced78ea724a474b32dae71231 - -Len = 152 -Msg = 61be0c9f5cf62745c7da47c104597194db245c -MD = b379249a3ca5f14c29456710114ba6f6136b34c3fc9f6fb91b59d491af782d6b237eb71aaffdd38079461cf690a46d9a4ddd602d19808ab6235d1d8aa01e8200 - -Len = 160 -Msg = e07056d4f7277bc548099577720a581eec94141d -MD = 59f1856303ff165e2ab5683dddeb6e8ad81f15bb578579b999eb5746680f22cfec6dba741e591ca4d9e53904837701b374be74bbc0847a92179ac2b67496d807 - -Len = 168 -Msg = 67ebda0a3573a9a58751d4169e10c7e8663febb3a8 -MD = 13963f81cfabfca71de4739fd24a10ce3897bba1d716907fc0a28490c192a7fc3ccb8db1f91af7a2d250d6617f0dfd1519d221d618a02e3e3fa9041cf35ed1ea - -Len = 176 -Msg = 63e09db99eb4cd6238677859a567df313c8520d845b4 -MD = 9083e5348b08eb9810b2d15781d8265845410de54fe61750d4b93853690649adc6e72490bc2b7c365e2390573d9414becc0939719e0cb78eca6b2c80c2fda920 - -Len = 184 -Msg = f3e06b4bd79e380a65cb679a98ccd732563cc5ebe892e2 -MD = 6b315f106b07c59eedc5ab1df813b3c0b903060e7217cc010e9070278512a885008dac8b2472a521e77835a7f4deadc1d591aa23b624b69948a99bb60121c54e - -Len = 192 -Msg = 16b17074d3e3d97557f9ed77d920b4b1bff4e845b345a922 -MD = 6884134582a760046433abcbd53db8ff1a89995862f305b887020f6da6c7b903a314721e972bf438483f452a8b09596298a576c903c91df4a414c7bd20fd1d07 - -Len = 200 -Msg = 3edf93251349d22806bed25345fd5c190aac96d6cdb2d758b8 -MD = 299e0daf6605e5b0c30e1ec8bb98e7a3bd7b33b388bdb457452dab509594406c8e7b841e6f4e75c8d6fbd614d5eb9e56c359bfafb4285754787ab72b46dd33f0 - -Len = 208 -Msg = b2d5a14f01e6b778888c562a059ec819ad89992d16a09f7a54b4 -MD = ab2e7d745d8ad393439af2a3fbc9cdc25510d4a04e78b526e12b1c0be3b22966872ebe652e2f46ed5c5acecd2f233a9175dd295ebeb3a0706fc66fa1b137042b - -Len = 216 -Msg = 844b66f12ba0c5f9e92731f571539d1eef332e1549a49dbfa4c6de -MD = c3f9c5781925774783ae9d839772d7513dfcea8c5af8da262c196f9fe80135b2b0c8c6ca0a1604e0a3460247620de20b299f2db7871982d27c2176ae5fa7ad65 - -Len = 224 -Msg = 6b6cc692d39860b1f30203653e25d09c01e6a8043c1a9cb8b249a41e -MD = 2e5263d9a4f21b210e0e161ed39df44102864325788647261a6e70ea4b1ee0abb57b57499bc82158d82336dd53f1ef4464c6a08126e138b2cc0892f765f6af85 - -Len = 232 -Msg = ab1fc9ee845eeb205ec13725daf1fb1f5d50629b14ea9a2235a9350a88 -MD = 72d188a9df5f3b00057bca22c92c0f8228422d974302d22d4b322e7a6c8fc3b2b50ec74c6842781f29f7075c3d4bd065878648846c39bb3e4e2692c0f053f7ed - -Len = 240 -Msg = 594ed82acfc03c0e359cc560b8e4b85f6ee77ee59a70023c2b3d5b3285b2 -MD = 5ef322cb4014ecbb713a13659612a222225984d31c187debc4459ba7901f03dac775400acfe3510b306b79894fb0e8437b412150c9193ee5a2164306ebb78301 - -Len = 248 -Msg = f2c66efbf2a76c5b041860ea576103cd8c6b25e50eca9ff6a2fa88083fe9ac -MD = 7978f93ef7ed02c4a24abecba124d14dd214e1492ff1e168304c0eab89637da0f7a569c43dc4562bdb9404a018b6314fe0eebaccfb25ba76506aa7e9dcd956a7 - -Len = 256 -Msg = 8ccb08d2a1a282aa8cc99902ecaf0f67a9f21cffe28005cb27fcf129e963f99d -MD = 4551def2f9127386eea8d4dae1ea8d8e49b2add0509f27ccbce7d9e950ac7db01d5bca579c271b9f2d806730d88f58252fd0c2587851c3ac8a0e72b4e1dc0da6 - -Len = 264 -Msg = 9f8c49320af9370cd3db20e9b50d3eaa59a6232d7a86fb7d472f124508d7968b05 -MD = 81b002f15c4d48be8517f7ed89df302fb1435c9435efefed58f3eb8ea11910623f1eb9028a66e02121a7f08a7c604226f2324f483e91548dbbd2c441ab704ce5 - -Len = 272 -Msg = 4ab9aa069475e54b25e5688a52dd4acd134169c858105f01a0a1b134c72d4af51f8e -MD = 48ba5a63aba7e7bd8e420475331125a947928c67fdb00f65c4080d9a0b99c0672424e76a1ba6bd76dfe492c730f6f9adccaee7bb11571aadb31f6bb628cfa933 - -Len = 280 -Msg = f0c1d3407de92ef7421e42df5c9ab31d2ec0a750a9522869cbe4cabd66908d5823ec04 -MD = 9e75c5bca2c2af1d7739787f46e1d981c4f98e493d0724b5252c2fbae3c526719f1d27e6ccd0d705240281e8fbf3db75b9b3205c1413436d3b5d140004b8cca1 - -Len = 288 -Msg = ae8c9f8fb41b519b6d943833fe1c32d1c4292fb1ddf1dbe2eb227d9e14d31ed74ebaef12 -MD = 042f9fd0a4ed3d9fec3655ae11011c6f2bc7e457e8812b6d8be2cd45fc6c432a94558c88f22c01439618865e8e49e509c448b342ca914b120344aaf7bcbdca18 - -Len = 296 -Msg = da39fb86237f00303844e61fc6cfe779e42af53349839590bcd2f0e4cbbc279ec0b7e885d1 -MD = ecb43de8c233a731b38e30c5696f8876761b7ea72efe283fd07bedf20029f47c6d2a4427823e100fb087abaf22d7eff42a951c97c3dd05f48a20163fa4367cba - -Len = 304 -Msg = 3e7271d2070ef095394620c4b016576c150f34bea60784613a0f660d7fa5ae56872b88c58398 -MD = 8154d0da634ab2266061acc123acb407650ffe9164a22de3fe29bf05393b2aece92cf4db00ea5b4341c31ddb7de151683c8a71b5a44d5c3175790feac67d18ee - -Len = 312 -Msg = 311fb67f6a0784bb01a2d5a3f3092c407a9d3322319dff9a79f894291c5fac37319fb408402e18 -MD = 1870fe913abb0a4b4f53b6581ae18322cd05328514556607f3f4d7b6a2ac8e9185d94d947d8b9c88e0efa66d89b59f7439c75fdadd1816f7412306ab2b59d664 - -Len = 320 -Msg = 7651ab491b8fa86f969d42977d09df5f8bee3e5899180b52c968b0db057a6f02a886ad617a84915a -MD = f35e50e2e02b8781345f8ceb2198f068ba103476f715cfb487a452882c9f0de0c720b2a088a39d06a8a6b64ce4d6470dfeadc4f65ae06672c057e29f14c4daf9 - -Len = 328 -Msg = dbe5db685ed7cb848c094524c1723519d49dc66ef9fe6d57e6862a6435750bfa0a70f104f5d396e61a -MD = 2fa6e5b2c443a68050f093e7fb713bd6b18f6274c061ed61d79bf0688a61dba1940bcc30998276860943ab038902896d0fbf59b88b07c80de927037097150c40 - -Len = 336 -Msg = 9fa83e96b2a6df23fb372895015678e0b2c9cd18a8542c3eaa2c435a76ae4dc9bd5136d970daff933acf -MD = 3a2c0ec88a3e5347cf0ea9c078838300ef7356f9a6c342063277c106b880a00ed2be205c13064097bd372fde38007bc306561eb4e74bba2bb20bd354aa690ca6 - -Len = 344 -Msg = 8a5a45e398bac1d9b896b5a2b4e3566b91d80ad20c977ea7450ff2efb521d82f65019ee762e0c85c6cc841 -MD = 3c704620f4066d79c1ff67752980f39ef3d9c1023fa5a213a5265376b14a15166ffe069b51df7710d8907fef9406bf375d502ce086ac82aff17229aaa7a5a334 - -Len = 352 -Msg = 49cfffdaf4d031e33b1d28a447450545f6c4293b38d5afbcb9883976c014f080576ec691ac1bff70b742efab -MD = 8bcc4f1ea2b7862ef1591bfa73916665de8faf65439ddf5cc1be43cebfd5f60f205e835a2b186b675b041258c5cff42669316ce25b46a2f4d4218e102f0f5d6f - -Len = 360 -Msg = 2ff845d85efbc4fa5637e9448d950496f19d8d57da99b7bd3df7474822f0a790586736416714e364c6e1fae04e -MD = 236f6f4ed6e858c02d51787e60c578f731f694f8e52b5df4ecd5b04dff14c78e56bad1028d6f626c29d85aeee151a2a2846d3eed5cfafa9854a69fea8af6d04a - -Len = 368 -Msg = cfca05fd893c0f005f5ff796f4da19ba27a1e729956b8b715e67ce4b2d2a382a72ec7814f2f507b1825209a20fcc -MD = d80969284a4565add4dad6ab9b3bdf53446142f84aaf92d4b23dd22ee7241e6c81489ac8b246edcb6df9bd7b23d91a0c517f546feba4ed5790a2be6e165c1709 - -Len = 376 -Msg = cfc425759a9c36bb9f4b32eed7767af6566f68ded0adeae25c7a70ca78ec09774d16c8bc357f6d6f7bd441bf62d942 -MD = b587a785cdf455cc9c544e756c1e306300aa3c59f8725012e68ab4d54020b6d227a164d9f83c905e86f8cebeef708a69f976d6e7b18b9bf78e9b98cc4a5cd1b6 - -Len = 384 -Msg = 097c9db919515242c99d973acb1dc4ed482768f974eb83b465f9f6c82503372006e4490835e2ec8f92301130bfb790b2 -MD = ff5a376f938e73014caef7fe3962944a7230d020b7087869ebe7ec70302721cd06fcdc981c893a425d05e2f99fe198e4db50a088aee2bf1263212110efed422c - -Len = 392 -Msg = 77e73d387e7bc80419ebf5482b61d5255caf819fb59251ff6a384e75f601ea026d83ef950ed0b67518fb99dee0d8aaef1f -MD = c4c89cd882ec945cc888fb9a0127d35e585ecc14a75e4b5b3d8330538d22da28cf6af1ebec96dc247f109cd2aaab9756e6946a3d80db8363a4da3e6ddbb510a1 - -Len = 400 -Msg = 317e5d9ac73ed0633fa18ebebbca7909ec3a5ef790478f9c38cacec44f196d895835b425774483043341381e7af2d383e51a -MD = b10bb04491b9c0c334709b407cda1d503efb6b63ee944f2d366b6855e6e63e5b80115be4be7ff63edecdfb5923792e68123976d79212b3884dec2179d1fcf382 - -Len = 408 -Msg = 209461f20666a346fedf4a530f41a6fa280c43665767be923bc1d80bbcb8c9f8f93ad75782ea2689c8c5d211d2053b993145a0 -MD = 67b7a328d9444056a52ca2f695c5d3f3baafb625a14fb32eee8ff26a40ccb296bec1771a826b55f7ddb6170d4caf7795b612448e66a0f19356fe505927149b47 - -Len = 416 -Msg = 5d61aa45c446f3bf93604b0511313b4e2f306d6b046fbd94797b926746836f2e1dbdc56124060c6ca9c911b1122192d112420827 -MD = d3931bde2bde8271ed18ca0b9148b12f6f16161e637e376fc961f65bc33bcacf2f6addf26a3eaa81b196653cc37e8a739ec5b3df870d8c38c8f28691c22a39bb - -Len = 424 -Msg = 9288c795bb0b86c0419d9c5637dcc37b39bfa18d441e3fbfca75bc0306e5432e8e7b3a5627b5bc7fdc424a77520abdff566e7f2bb8 -MD = e363d0e95d8cd18c384016ebeed6d99c4fa2768e2bd58fca019c5108b9cde1cb46f3f884028a55ce282ec310a10037faa1b16b4a6a669957f0b00f350bbd63d0 - -Len = 432 -Msg = 780427dc164b2f69b8c7d569266f461e2d30c88c4cd6057fb030a6cf636f24e3c0d0db742a7b6193fdaa15eec50dfb4fae6ec7653c91 -MD = 2964b009fb1bf996de12e030b9d6e0608ae8b9dbf2acfb9beb76fc5361cc104ee85c2a46fb7b4cee90848312da302de49afe61c546477e2b25d223d5e3d33560 - -Len = 440 -Msg = ec2a92e47f692b53c1355475c71ceff0b0952a8b3541b2938270247d44e7c5cc04e17236b353da028674eab4047d89ec5dad868cfd91ce -MD = c83aca6147bfcbbc72c377efa8d53654ba0830c5a6a89e1d2a19b713e68fb534640deb833ca512247166dd273b5897e57d526f88eef58f6ff97baee0b4ee5644 - -Len = 448 -Msg = c99e31ad4e23ac68e15e605d0b02437f8147c44f5445a55b68a10905276cce8676481c33e8cd3efe322bb13fe0107bb546ccbec7b8b38d10 -MD = 52992d45a88221d972958e9f2854adaa9a21d2bf7051e1f1019ae78004da50c5b55c144a02afffe539d753949a2b056534f5b4c21f248a05baa52a6c38c7f5dd - -Len = 456 -Msg = 9aa3e8ad92777dfeb121a646ce2e918d1e12b30754bc09470d6da4af6cc9642b012f041ff046569d4fd8d0dccfe448e59feefc908d9ad5af6f -MD = 994d1cda4de40aff4713237cf9f78f7033af83369ac9c64e504091ea2f1caff6c5152d6a0c5608f82886c0093b3d7fbadd49dfd1f9e0f85accf23bc7dad48904 - -Len = 464 -Msg = 5842512c37312511a3d8ae41f5801df60cd682d58b4a997342b6e717e94006c214813e6c63e75591f957a7ec301779838bec8ae3ed7febad0805 -MD = 9763c43331ad0eb279d704c5f6e97e02da8724115026827f889e9fcda21f60fd230894ab35abb719890f3afa51afd31bc6852183b9c51059910af460abd2474d - -Len = 472 -Msg = ca14e2ea2f37c78f78ef280f58707ec549a31a94361073e37701bfe503e4c01ee1f2e123e00e81a188f08fa050825709128a9b66bb8ae6ea47e41d -MD = 4600e022a02258739f67fdd367cc1e662631fb087918768352062b9b3c8de8dbca0e9ec751b91f284694fbddb8d325c0637bccb21dd2efa92e48dbab2e5e9c26 - -Len = 480 -Msg = 647629c779b24c1e76f41744aba17159487532a0156a7d8264db50d645e9595ff81e0c96a850f2aa56c844c613a4b892727a9bfc3d3e20386766f805 -MD = 5bc842fc2d3b7eb31d2d3044df3ec32af114feaa7cfc27ebc8630f46ab6f0c543f59b812e776e5303861d17da3f1f16097641f3b808d4d5cb3e483946409746c - -Len = 488 -Msg = 1c5dc0d1dd2e4c717635ff3e9b67caf957aec0f8f63c1b1e221e800a4c14848f4ea06e644e5d3e1de592ef5a8007fa3f07171b24bd07578d68963e5cb1 -MD = cbf1ea86fa5b3dbf67be82fac41e84cccd0d296c757169b37837d273ccc015eecd102b9ce1cff68fdc7f05d22f2b774734f62ded54c8ee0bf57a5a82010d74f5 - -Len = 496 -Msg = 8a555e75477d065b3af7e615475f37c0a667f73a4c7af5e4a69f28a68d9f4434776a8f90eab7f1d137eb4b22643c0a0d6a16fcfaa1bd62f2783546a9695f -MD = c088e4a3d7da2f6f99a8f3f717361108872b8ffef921b383c24b8061d4e7c27fc56f4f20dc8f952a14043c5650b5a9e777c49c41cfeb3f2de97ee2e16b2c3924 - -Len = 504 -Msg = ebb3e2ad7803508ba46e81e220b1cff33ea8381504110e9f8092ef085afef84db0d436931d085d0e1b06bd218cf571c79338da31a83b4cb1ec6c06d6b98768 -MD = f33428d8fc67aa2cc1adcb2822f37f29cbd72abff68190483e415824f0bcecd447cb4f05a9c47031b9c50e0411c552f31cd04c30cea2bc64bcf825a5f8a66028 - -Len = 512 -Msg = c1ca70ae1279ba0b918157558b4920d6b7fba8a06be515170f202fafd36fb7f79d69fad745dba6150568db1e2b728504113eeac34f527fc82f2200b462ecbf5d -MD = 046e46623912b3932b8d662ab42583423843206301b58bf20ab6d76fd47f1cbbcf421df536ecd7e56db5354e7e0f98822d2129c197f6f0f222b8ec5231f3967d - -Len = 520 -Msg = d3ddddf805b1678a02e39200f6440047acbb062e4a2f046a3ca7f1dd6eb03a18be00cd1eb158706a64af5834c68cf7f105b415194605222c99a2cbf72c50cb14bf -MD = bae7c5d590bf25a493d8f48b8b4638ccb10541c67996e47287b984322009d27d1348f3ef2999f5ee0d38e112cd5a807a57830cdc318a1181e6c4653cdb8cf122 - -Len = 528 -Msg = 8e8ef8aa336b3b98894c3126c71878910618838c00ac8590173c91749972ff3d42a61137029ad74501684f75e1b8d1d74336aa908c44082ae9eb162e901867f54905 -MD = 41672931558a93762522b1d55389ecf1b8c0feb8b88f4587fbd417ca809055b0cb630d8bea133ab7f6cf1f21c6b35e2e25c0d19583258808e6c23e1a75336103 - -Len = 536 -Msg = 52761e1dac0eaea898e0b07cd24f4b2e6bb7bc200ea4b0528842f17b87154559a2ea94459a0e480ae0bdf9f757dd4a335aed0e510138b024a04ed1d591b4323234dbd5 -MD = b826fe80494e19c51b42f2582b2d080ba6b90512f35f2db67dd7fd5ee532eaa16498afba08b4996cbcfdf8d1a2df6b1da939e8265115a48aefa42f38205db436 - -Len = 544 -Msg = 3804ebc43cbea80c2bd7e4fda5c5515500cd2d2b846a1378dbf218d5c377138606eb3cb8ac88f9076f6ff4436f90717427c9df1ba052acbbe4585e98b6e8e0bf800f1946 -MD = 17dd6d87bc6773051e52047fd444996afa8124b0483fe121877f98553448772bd0e7751fc655e9cc2d29830211015d310f191474ca6adc0477a187c03b8fe252 - -Len = 552 -Msg = 2249d698c4d807a8e7b4de21c485738959a0d67e5d2ca6f77983dfccb5dbf47931261e1f1537f3cbca253afb6bf4fe5e7672e1dcc860b3d6c8d243afe2d9758b375e955692 -MD = 6af44563fc468d51182f6c3be58d45932af1d985c6f283976c91a9ff421f383fe21dc7322f397ccead583e26b3e3fda067976a7f34665df25a2ced7b4b09cdec - -Len = 560 -Msg = 32a9c17033658c54f22c7135ddfc879de94d79593ef2dc7d3041bfa872738389864eeda27801794ccc4ff1fcb5ef3fc48833801d6fe959e3627f8ea1536ad00fa9c7d7d9f043 -MD = 6a47699dd3ada2f11bc4ea42072b06cc20857bf164497df1285400c250f5848b6f71957dbdc845f5daeab913036661f69387893fc2d61c25fa59b9d85b19f401 - -Len = 568 -Msg = 3d65f69a590a5baaabcd274fe3ef9e88920ffc7adf05c16d7b0f4d18d72bac1e94c3b3d83b8f4c552eb80e9fde3911403f8b000579816f02e1716fd627946031d0af0793e7f3e1 -MD = ffb2d9450943c24b5933c24812459b75d3d9f380344c9bc06fa3e17ee448eca2f98ff79f7e2235ccd9f9a8176f68a2254bbc9b834d6ac8d2bfdbc1597c432c9f - -Len = 576 -Msg = 76ff8b20a18cf104f6cdb65e2ba8f66ecf844af7e85e8ef2da19e8848a16052ec405a644dafb5ca08ec48f97327ac52c0e56218402c72a9a6dc1cf344d58a716a78d7d7529680bae -MD = f8858144c6d709dd0689a526a548a43f17494950ba2ac20544799e8ea27201d78bce5b921e29a7b4029278e68341ef2a0ca4ba3894566b3c8f8950e3e545a689 - -Len = 584 -Msg = ca88dddfc876a12f45f19562bc9ca250f43267ab251a7f345c3c022e20144e135604078762ef5c8a8f038cf1b1d6a91709b59dd068396a9e971ab628f74886e765384a23607c1a1e6e -MD = 4f3d9eeef349ca51a7e419af1686f42795abde58a85335ce68d496e81e4436a80a61dc143a4300008c23a3e71f4ba98743195a3694a8d02fee11bd314569abc0 - -Len = 592 -Msg = 0a78b16b4026f7ec063db4e7b77c42a298e524e268093c5038853e217dcd65f66428650165fca06a1b4c9cf1537fb5d463630ff3bd71cf32c3538b1fdda3fed5c9f601203319b7e1869a -MD = 6095c3df5b9db7ce524d76123f77421ce888b86a477ae8c6db1d0be8d326d22c852915ab03c0c81a5b7ac71e2c14e74bda17a78d2b10585fa214f6546eb710a0 - -Len = 600 -Msg = 20f10ef9a0e6128675340171cd248df30b586557620b615ca39a00db534315a9012dbdbfd6a994986eb829dbe6cdaf3a37d4f59ac27298742c8f777b6b12677f21eb289129579868705f27 -MD = b4ead3f860eabbd36c770d66c7356f8107acd1485c7c94178c2eaabd50266d7645d009972586ef83ed43ed92882137df5117b88f35231b894ec1741ae7501145 - -Len = 608 -Msg = 995c8f747ea418f7d63aba2260b34ac3c7dceebb78438ca4b1f982b7db9798ec1a7f32622264cb024c0d9e60e955a6e1d677c923518851990a459b767d0f13cd803460f61870db3391b44693 -MD = a00a601edeaca83041dc452d438a8de549594e25d843c2cf60a0e009fb92d87abe28a72690ab657c8d35b43cd02d22ec0755de229d1f922fa6ca18a6d6c2aaae - -Len = 616 -Msg = 0feb23c7e4a19bcbd70bd300d76ec9045d696f8c9687f49ec4154400e231d2f0862495150cf250b6f12f172a7d130f8fa5d175bf2f25e280172ccdfb327951701165302728a619aa2f242631c9 -MD = eeb6dee30c119fb1e1eb5c15ff2b32d8b9c7464a4e4cc6815cd251a6bae29b49961dd5c2fa9c44a9b142ca062c7072cbf3db04299b767789040196bf0c06aa76 - -Len = 624 -Msg = ac59a110623f1a64666f160ed32926676cb5be25dd9d962f441951b0efcb5d6a67ac1a4eae473e49c6257860728853ff415c5e8ec76a8a462ecfd343eeac22dad820722c597332fbfd94ebbd32c6 -MD = f65ea942ae0a47e73b02b1442e5b26083db79307f64dd34a039c476faf18d5c514bb77a2c412a6074a7afc326ea66c74e5705fe2abbabf274333325a15b61fd9 - -Len = 632 -Msg = 9e3e1077e1333a1fb1aa633ccf2f746588ad426489ea08dff5511438b5f4c0b110d1a4d47b540a12b21ea2aa070578ccfa5c22fe0b743ec0cc621c6b3a03b75f4d3eea5dce89e03269afcd9603d0db -MD = 4b5c5df80c344c12388c723856cd06965b2190af652480476747dc2195ea3716f87c1762359583a5f31522f83f7833bec30f1f47d14540417dd463f5d258cd4a - -Len = 640 -Msg = e881e3284c79d8f5237e699e4fbca84090c664bb53229f58cb0842b0436710c9b329d98191b8f030e9c1df89b03858c1569c6ff49a7c07c4a23a8a434b0fde13be4f94cb44ee629d5b44d336090d3de6 -MD = 147d8071c7871ef9256cff32aa63ea031404fa5ee4ec09c56afdd5da919b0cc84a9d35d142c417715203316011cc620cd6855bb117063a5e52867facc680d5f4 - -Len = 648 -Msg = e58521098911503de84311387d375c25929e6e55076eb6934fd8f2b1bb7b9667fbd76d5ee204828769a341b1f716da5bdfece6c62a9f4d4f988267fce1f5615540dbe375324eef607c910d976b45a5ea5f -MD = f97ba056fa41f43b8e1987072a09e828c71c5ff6ad4e37f9ab6b89e2a078933dd23052fa72c6615b613904259e9ff9b55ef7b923b89bc8752f6babddd256e117 - -Len = 656 -Msg = 3796cf51b8726652a4204733b8fbb047cf00fb91a9837e22ec22b1a268f88e2c9f133e5f8527f1b184830e07c3458c83a8ca9f9d9c6998760e610668ba0f22e22b656a737e978b246a17840b7dc4091da85f -MD = c8a466199acbcbc93f2ce042968508c046901631e3118a2d0bf39a9b42b4197a379b3a86cdeca9df2de1a3eb71b79ae9bf2d6575eadf1878029c4093133f54d3 - -Len = 664 -Msg = 9af608d031ccf309d7273c607a8e5e36840d449b55db5b13f03aeb9af49fa7e7cf1383ee2ed9c5a8b7515f16fb1c7c84a681590bf90f56597b844db5ebee223d78109b72350772f7c72ea996603e1e84f2ba5f -MD = f0ded9495b4f64cac585be8a737cfa14247a4a81cdf7f01ebcb134ace71f5a83df2cd72e7773fea1e82beae17e13857372792c8231e2ab9fbeb633e399d5f0ae - -Len = 672 -Msg = d0df1bdf1df6203241722fb9c9c1cf7405017497ae154538ccf9224ad752e6ce1d4ae948639aca70cfe86b2b06543cb9914ebd3085aa3e2963f6e9b93d0b03a31ae26fcb9ca974eee016c091a6fcac37b21cc1d7 -MD = c2da3ea3c8a3fd88a5bc5dea2bc076f861abedefae5a5fbd941ddfd1c41cc3312eb2dc826c2c0f65414fe72ebee447d2f9b1a6a56302660d1f86632ee80a175f - -Len = 680 -Msg = 8cbc9480553acef7bcdba9716ea8d66b4131780917de2b0b048045fcb32b5cac054808e1fce6e94ad851ecb47fe6cb802225d3551e08ea122093d0078dada564212eacf1d6394e0007cc62a1d595ab14ca08a284bc -MD = 63b39b88ceb848188b37316e04560e75a5340ab8d417932d231c997e892b41daa69d9fe3e9a14dd19ccfbbfa01488c208e7b946cfaf16ca2b1bf7c8d8da4e6b2 - -Len = 688 -Msg = 38f184448f3cf82a54cafc556aff336f23f9149e612134b3fc00c8a56455653d88640b12f69062b8432c4335ad8f7ab4ff66cb7eb54f332561a36f024d92c3e26276f4fd48619628cff88e4b8e85cf14ca4767ed990d -MD = 9a49265fc641c59f1a91872cdae490d3da73c0c60fd59648e1d17dba1a647a5b95629392bb4ff5163d1a3cb45427c1437a3b2e1d9f030c0a8bcc5ed22da9e2ed - -Len = 696 -Msg = 70900618b1e9e9db62296fb6c6590c9f10b0a632765c489c887f1ab7c07791765a62e38465e1be281b1d396c6e080b7ee3e6fa56a30b9799d0e629be153ee76f81bc6a3295aa61489bfa87d53a8ad24248a6ede0dfcfe9 -MD = 1c8c3357ff1f8d6ac4defb3af462a73e09159e3a20c6506edd8cd3052df941c81f68c5fbb893912619e28640977fe8eaae8e9d5d4e7d5f132552cefab4540bac - -Len = 704 -Msg = 4e6ddae0d805afcd10a055bce584c848d050fb29fe8f1c64b18e1abfe46b65782e6ff536e89d8d40928b41ed7371365c8080a9647f7532ce6c6d4ac21cfb0c8020783851ec9a7dbc3948f8fca7adf8b2a78c04d898d31ff6 -MD = 5c2f996c779b91b3c4639311f54fabbdde7e2212b53dbae4828c8399588fc00d3b2ae60918aaaf6bb48bc757e52b2bcea84f5d15bf4ec25d5519fb54f6f26e1b - -Len = 712 -Msg = 696825f6d6ea8173ec47d0959a401c4ddf69f8f08ddd678a4d2ff976e3a4372bb39f4159845cb63585e1d4108d32e12fa7c5c9d7ce3508a7f53aca2b4bd951adbcd8984ebb7536563f5884c90bc5023b3316f7e4dc6958f743 -MD = 3ce940ca96b00011375daa95c65f66907d69b3eb3b8d779e6fc971afcc05e990bc4c541f434590f6b18b68c080d0f24475a3e764e9cb85343301314ee2fb661e - -Len = 720 -Msg = 79ecdfd47a29a74220a52819ce4589747f2b30b364d0852cce52f91e4f0f48e61c72fa76b60d3002cae89dfc5519d3430b95c098fa4678516b5e355109ea9b3745aa41d6f8206ee64ae720f8d44653b001057f2eba7f63cd42f9 -MD = ba3d0fe04470f4cf8f08c46d82ae3afd1caea8c13bebbe026b5c1777aa59860af2e3da7751844e0be24072af48bc8a6fd77678aaee04e08f63395f5c8a465763 - -Len = 728 -Msg = 9263fe75e8f6c7d5d642e2ca6a6eea4f44e9a0f249513ed79c9409ffca5526ca4491aebb1382057cc7c36722b0b6c3b15123cde312214f25353abfe30bca170568a8e1ba5408917403a01834080ab607c56a10d0265082498fe0b6 -MD = 7736d7a7fc1eb05857ce7d88abfffa87f58c670bfdfc0a8031f60f379e4b6ad94ac8f13ffe28c697809b5cfac7f13be01e7496a85237c4025539051fb2e32fb6 - -Len = 736 -Msg = 78c17bfe0e02eb526d1a44a1ac127be082181452b625394bd6dc093a2cb432e6ee59c2f8b5503aba30dae41e1a1c6702697c99b2c94e94af48b00caf53b2e0e4e1bbee81ee282c7b2b35f58cf421a07e828d57a6622626af25835399 -MD = b56b6e343166328523e0d1693e5174da643ae83cf69c85a7b3c3bee247b77b84702069d9e6b4cab03bf17fe612009bf4239683ca78ca7e876aca7d07603ba714 - -Len = 744 -Msg = 298bb304a920f960447d8fd38b061bf8fe4ac1f871d8a0feb4549feb72ca694a5a41b6867d94cd5af77d468ad2f315d127b6c41a862800f3985e573e037740298e2c5c6186a9fb83609be2d49f8b4c31f96a2e49b56dbf09571b38587f -MD = 34e3878627904ffbbbd85266cc973c34f931e3cab5d4c31f841c553dd69f84838206067df4f9f3b9102001be19267151e673f5c2d4c2f8438a6999a0a325487d - -Len = 752 -Msg = a3cf714bf112647e727e8cfd46499acd35a640dd393ddd263cd85cf6225f59890a0686dad1c54eb8d809b81c08a98dba131bbdd6fce8ff59d95db824d8831ea480529da739227a6e0f62b603b38c35cdc2581f614a31879b8be54aeefaa0 -MD = 6f230ae4903ddbef0ba384c2e3506eab318bfd1a46ea76099f65a3fd529c91bc2865b9fd943e346de64626b8529f9db1377bf2c5e0129c66b50c6a5cfb364b3a - -Len = 760 -Msg = 0a427ae55ef3a7e6044a08cf6128cbaaabfd776c4e9374708f2ece246fd73603d2f54ac3e01d16cfac2bdaf713920d66e8f0a3d54ee68cff64267d5528cdf2f295f474d10f81173e0143488ac53fc503c444ed23dec63a080ce90c2443dba8 -MD = f6bbe5d0cf13ddf41c1436748a5d1ccae2948547b452c2171c7c8e8b66c6ae4de3c0e8b2962bcb60d3de3608479f80e455c9024d9716c38f6f1206861ab1eaac - -Len = 768 -Msg = 2cbbb87511f4948efec3a61b511ededb1dda8b6ecfc0210c11e43a77ee32dc2e374afae4268e3d30427804868232a966b56006d3214037076bf6a265b72135af0fb2ef7909fea2dea412f7717446b276ff153753662b4d4148c02347e3259169 -MD = 76897b87a8a1cf835c434f6d391c9e5227351af9d3e20a3389c796b98b424281a59068d9c8d567ec2bebc435b0126b059e2d86394a9854d6611e1c922f385496 - -Len = 776 -Msg = 2b23324c9992f60a7fc010159a03cb9a2b290df4fa6a82359b9af602f0a403a5ef33ed5da5b2caf87b77e6a4b93b650348ce2a7dbc08f8da9203d710b587ba5947c65e899f4a759f8e2b049ae7850a8e3e2962f6ef93ea4c631de5d78e729ec5bc -MD = 3beea0b373ed09cf1c919c51d86d642c9125e0ee81698dc4cbadf02e9e6925efb562fd9b87301a6377ca192be79c4118deabc450b54639000c2e312945451fb5 - -Len = 784 -Msg = 4022f930c7033b00d986c65ff6bbbdf9ebd0e58c52844ff658df3893c3202dc533f873d4a7f5a5f944419fb5528c9b6788479a1e891306acae7995fc06db70a59baa95bef7da79f5e793f2db7f2a55825e4fdb4a34884af881ded1089fd5334502a2 -MD = 0358775bbb733ccc49e78f544aeee512370d480d0e13c7e8d5c444c423e592146b45fdb91a1b694d35e36b60e4bc8397fca8bb9790e619339778b9cd1abe3fe9 - -Len = 792 -Msg = 1cb77ba43ce77e236b9fc925f589b1c070780a84f99e8f50c1ff846ac92599cfe91612c8178325bee642a34f4dffdba2aa2ebcf7064339829b26f27993e1106c139c70d578cc05f0e1a777cceddb10a2c67fd9675e4a009df8037d6eeb38f5fba233df -MD = 6502f46551a3fab3a96428fb97801d7a4aa2f17fef6603238df84e17c74309ed3d9489c8b16a9384ee634a3f86d0b3ba9a4dbc9c51ec8bd4bf8d61de6d3d87d7 - -Len = 800 -Msg = 52167de2d6c502d99fa10c27b2ab6203bdebc2cafbbfdef15872a43dd610c2362f796ad9bcb5528d95870058fa454453f1e6065b315d410a3f2650e5d71e69d78d9767dfb4accc057fd2069266b0f180cb319e30ded7535bbe52d24be151de4bb598fc5c -MD = 25cb3ed3983a91b4cf37a65193916c5e3e211b63e943e2f7b50a85d349a463b941aad33eff16561bdfdc92fda06a4e1d94b162de48f06d3c626940b31020925f - -Len = 808 -Msg = cede6697d422ddaa78e2d55ae080b8b9e9356c69bc558201a2d4b0b3190a812c27b34bbcee3a62b781378b1bf636b372bcbae1fa2f816a046a0a649a5c555c641fea4ccd841cc761f38f777972f8c91b0324e71c333ce787f04741439bf087ef5e895011c0 -MD = 0be42a25d77ac6ad995c6be48e783380bad25a61732f87cefb0cce1a769cd69081f494a1a12d657664ef2b4d9c41f2ee83f6e9a84327d8756af9f985595e7d3b - -Len = 816 -Msg = 56d18d3e2e496440d0a5c9e1bcb464faf5bc70a8b562124f5fc9e9deb5fee6544b945e833b8b5d131b773ecb2cdd780cd4e1bb9e4f1e3cb0a1d64d19cf4b30e44e6c2d0cbcb4e284ce50db7a8a8062ddb63f981d9026c532bf8eeddf8af5a43848a32262178c -MD = 982dc61c91a93770582eee8025aa55da8e9edb966bf5cf70d4a6534c0d53a2789a8c4fb65b7fed478cda02ed1e0d198d85c5c735b2417c5fab5d34e969fc8e7e - -Len = 824 -Msg = 25a7320dfaec5af65da4d0f8688e29e8e95532ecc16679ea8aff0f407d898db6922855b0e8901aa9681aa3dca617cb440764cdc7293fbeaf7f585b593c2b0531738e0ade7c8626b9995f4a84d9fc9b593d6bbee01abc53c5be14bf6956fd2fd81000dafc7c7686 -MD = 749c928c3d5510925bfe98659025b0ed7c01acd4d59a9bf1c54863a088091771dc9d407bdbf83b0f44b0902e10349ba79c84d0981d5e8c4f5c733a117fed0790 - -Len = 832 -Msg = 3d7177b28ffd916e7e0634895833ba0bd9e0653df2cc4202c811536a005aec853a505e75db55d3c7107579041099e382a1feac80dde65d72368e909ab85f56d88e68d7c3c80c38f85bf8c2b36959409cc34ba8e3ad94fe8ee1927612d672d92141a329c4dd8a88a9 -MD = 14a331508cd7d94fcce56a66bf65f20870a281c8442f8dbd4c2371454a2b66f8d0994a0b67692e771efc6a5e0b887acae7d6f4ec7338e1aa89f2abc7034c4e4c - -Len = 840 -Msg = c033e4a512297caecdbead892b11a9f7007af9a74bcab89e0bd4ffdd542ca03ea12e17a06c42bd43fc5f3f757fce4f6f5831997abac3f95676e1ebdb11ca43e11aa31e5ebabe18ce8d1bbfd8b02f482e1ce581b532e307e6960eb97441506c2ed299e1282523f41527 -MD = 95ac9b7d22aa458921874c4b4331e7d64761853217c3f83c601abcbccd7e2eaa6ca6ce9a22ebcfe5046d52f8a09097f043ab8bc59243fd770090bb432c3155e9 - -Len = 848 -Msg = 69fff0f1a3dbfb36e32f025819fa99ea9a0edaef73145bf7fcd05d8bb0a646cb3b5d5256d524856acfd2e44d6b72e4ebf1ff23c0ff6c56f821e782d5a15f7052a1445b06668eeb4af700679ee7ae26496fbd4640c06aa149964dfd6011df835ac13b73c8ff21151e8440 -MD = 45d4daa652558d1c12beb0f5662c712f325b4c802fc6eb9ee039c949d002bb786f1a732712be941f9c5c79b3e5c43064d63a38578e5a54ee526acb735b9ad45f - -Len = 856 -Msg = b2c439c97ab7c63736b3796324d68eeb7a471ed142bd9622684167d61234fff82f93f907537a909bc2e75a4bcbc133cf57197662c1af746ae8b81e5b83de05d9b589851de25d3c99c004c1dfb12d93bf50d450af49c428716f5b90ef088e3b6a6b2c46d3ce67b379599018 -MD = c48ec83be5fa669e6ec8db90aca9676cfe2ec0d5e8e7a2431687bb953c0a300be3db4075cca3bac4dfa4d971baf0fa1aff46639db4b238856ff36d1dfcd520f1 - -Len = 864 -Msg = c016f522f26b7470e922b9a287e6d45f6c28813b68c1457e36d9ba266708272f9cbc5411f8db9d8bd5a9449fb6eb0cde7d4d03e5df019f2814a90ceed377c59d7d92623899bcb0268033073559d4d8de488686cbe3d67796e6df6ad4276d0b52cc62c49ebb58d7c95287aa6c -MD = 7402f1a99b47e102b3b73140c6771b07ee6c33b3715e9c4027c441bee40511b735d95e508baea78da26fded9b7038e9a53defa58448aba40dc1e62d7ec592107 - -Len = 872 -Msg = a766b2a7ef916721f4677b67dbc65ef9b4d1bda1ad4e53fc854b0236440822152a111939e5ab2ba207719472b63fd4f4a54f4bde44a205d334a2d72cfe05abf804f41841b86d36920be6b0b529331ac163a985556c84511ec986439f83e1d7311f57d848cfa02df9ea0cf6b99a -MD = ddd60f93a3babc78299cf763e7919d45ac6f479700e1adb05ab137acdf89c1521ecb9dfeacd091e58ca57a1db964a9c3cd1fa39192cc1e9f734caa1c5fa62975 - -Len = 880 -Msg = 10f2be77a4055771a67007cd8630e3230e38288499cb160380290174d66da57455b6baaa9785c84c8a663de41ed3bd544055b9170cec43cb3eb120eceaba1fe36e3eaa3fa4f99b425cd2519f09bc0282bada52d14ce625b1ded3b24d86b1dad342d2b7be322b775b04fc6b86afb4 -MD = a872fa33d463b3343cec57c20c66979c33e1ad067bfc703454696aab5dd0003bc194318f4a8ebbc74503feb7211a472dadee991efe3e38f21a1310f8a76eac80 - -Len = 888 -Msg = 324533e685f1852e358eea8ea8b81c288b3f3beb1f2bc2b8d3fdbac318382e3d7120de30c9c237aa0a34831deb1e5e060a7969cd3a9742ec1e64b354f7eb290cba1c681c66cc7ea994fdf5614f604d1a2718aab581c1c94931b1387e4b7dc73635bf3a7301174075fa70a9227d85d3 -MD = 3b26c5170729d0814153becb95f1b65cd42f9a6d0649d914e4f69d938b5e9dc041cd0f5c8da0b484d7c7bc7b1bdefb08fe8b1bfedc81109345bc9e9a399feedf - -Len = 896 -Msg = 518985977ee21d2bf622a20567124fcbf11c72df805365835ab3c041f4a9cd8a0ad63c9dee1018aa21a9fa3720f47dc48006f1aa3dba544950f87e627f369bc2793ede21223274492cceb77be7eea50e5a509059929a16d33a9f54796cde5770c74bd3ecc25318503f1a41976407aff2 -MD = c00926a374cde55b8fbd77f50da1363da19744d3f464e07ce31794c5a61b6f9c85689fa1cfe136553527fd876be91673c2cac2dd157b2defea360851b6d92cf4 - -Len = 904 -Msg = 9159767275ba6f79cbb3d58c0108339d8c6a41138991ab7aa58b14793b545b04bda61dd255127b12cc501d5aaad476e09fa14aec21626e8d57b7d08c36cdb79eea314bdd77e65779a0b54eab08c48ceb976adf631f4246a33f7ef896887ea8b5dfa2087a225c8c180f8970696101fc283b -MD = 3cd3380a90868de17dee4bd4d7f90d7512696f0a92b2d089240d61a9d20cd3af094c78bf466c2d404dd2f662ec5f4a299be2adeadf627b98e50e1c072b769d62 - -Len = 912 -Msg = fe2d8ae200e6657fdc7494af5a12b2ae940348f1f983f0ba98febbe99c80d115126d57dbf37296765ebb5990256696588b3851d54c8fbe7ade98a6faf7c20b5e4f730f54a7f912ca0ac31bbb53d17949ef69aa0de40c7bab12a871a9b90f68813ca87af4256422a268f4a1d8ec3aa1a947fd -MD = 8025a8608df0f6a01c34cdec012d4cb25852e1b100b68172fc4e86ac8b7126b64859cb9e767a7e59060989cedbd925afc475ca7369bd43f85ae590e224e036dd - -Len = 920 -Msg = dc28484ebfd293d62ac759d5754bdf502423e4d419fa79020805134b2ce3dff738c7556c91d810adbad8dd210f041296b73c2185d4646c97fc0a5b69ed49ac8c7ced0bd1cfd7e3c3cca47374d189247da6811a40b0ab097067ed4ad40ade2e4791e39204e398b3204971445822a1be0dd93af8 -MD = 615115d2e8b62e345adaa4bdb95395a3b4fe27d71c4a111b86c1841463c5f03d6b20d164a39948ab08ae060720d05c10f6022e5c8caf2fa3bca2e04d9c539ded - -Len = 928 -Msg = 5af8c0f26db4e99b47ec2e4a01a786e77899e46d464ac337f175027b61aef3149848af849d76ac39b9b0910fe6594817859e55974fa167518ed72d088dae6b414d744d477974fb719c626da792f981233de24b7579d8acca510a266d73c0ee8ee1424343eaf6ffcc59c86c1becce5894072c6c11 -MD = 09da284d5b6556508be54c8ab6c97bbd472995c6bbd585917ecdb54ea9167208daaa070a7b2b7d8e93ce1315f0d1ef8d69667429c44dc5ee1499de57b229a398 - -Len = 936 -Msg = 49cd0ba0df5bb3f43f68464e3e83e9cbd5d5ee077ffa5591e30f939cb30c93f7d454fb3fbf8bb05327a89c08dc4baf1eef50237317a405775357f1e0d1f31d9f0f0d98124019d47bf18363b1ecfbfe155c10cbc83300e01bc9ce0347c596b35f411e6d8229ad2855e42022b0373ade98663c6d6e9c -MD = 30cbf0679a97c871574d2fc05d7aa760c6bc8a864b7d246c39b9e812f9b7ff7b4ef5197dd5b69493306688b8564de1ad47d75505c913ba6a78788f8caf5788bd - -Len = 944 -Msg = a8a37dfc083ad2f47fff468738bf8b728eb7f1907e427fa15cb4424bc685e55ed7b2825c9c60b839ccc2fe5fb33e36f570cb8661609e630bda05ee641d938428867d90e00744a4aad494c93c5f6d1327878078590cdce1e647c9820818f467641fcd508e2f2ebfd0ff3d4f272393478f3b9e6f806b43 -MD = 8e1c91729be8eb40226f6c58a029380ef7edb9dc166a5c3cdbcefe90bd30d85cb7c4b248e66abf0a3a4c842281299bef6db88858d9e5ab5244f70b7969e1c072 - -Len = 952 -Msg = 36af17595494ef793c42f48410246df07d05936a918afe74cd005e537c586b2843701f5df8952242b74586f83339b48f4ba3a66bdeb457ecdf61784eac6765cd9b8c570dd628dbba6ae5836b9ac3dbcd795f9efdb8742a35bca232abf36eb3b6698b2933965802277ba953a6edcacaf330c1e4e8c7d45f -MD = 158bfc348a30b4fabbe355a7d44bdc2122a4c850444c03f289003ce01bfc1ebf3ecc0febb6a8ff523d25db7681b05bdce048d11943ab476c1967cf6556c4a120 - -Len = 960 -Msg = 42d66edc5f22e0c13c25504c5101a5d172d2db7209e461efa323c0bfaed27e5f808042ea9c3838ea31f9b76de465225ccfbd0c09ca0d9f07e9a43e3e46c7693e00a7e1d483900ddb0a629d5563456dbbf299ac91f92c3d3c17b05d180e6c87c6c93194c39d90273fcf4a482c56084f95e34c04311fa80438 -MD = 061afb119a3c60876e04c10f12ad0f4b977593dc5a2d21096a57e7d3f7d4d44fdef934b2c17d7530674e4f4a1c176dbdcc54811a22e1b8712e4192fc2d4bf8e8 - -Len = 968 -Msg = f91bb2e1a9c4cd96bf250426b3a6afd9b87ac51e93254d2dae3b16ec686ba80fb0bd7a84d218660e9007593075bc4f4c66567f0c7a5fd2010c999a8a0efa81f89ff5bfefe0fb910f0442e6d4a7c55bbb618c69a79a2ddd82a0938927f6fe3a80f04beaeb7c7636e3435d12dcf1c6bb6ed0a4edb69c9657fa93 -MD = 6e692c8c694ee0a3565f37a299e0006b85ab4a821b20e76798220229f656efc6a20211a4e7e4ed77facde0d70e4d5d95bc8ed1d7a56d8df1446d562f044b344c - -Len = 976 -Msg = d1eb961ca6a8f67c49b61e4d3ceaa2a1de6f0ea927b132bf987abdaa725b0e1e274e46830e99a2f75af608964df0dff9a99024fc6839bac5acd10202f921ac71a27fcda681aa3109ebf5f21ee3a849098ea3a551e844fae4b48b5c5bb97ccc802bc5520d68a14cb7e5fc056b67d889d876efb82d0e9a9a2499f1 -MD = 39b2c76ec207120de4b320c7fe069e602c9c38f257596da7369395e87eb64b3acff988c1839ac269d5012c093f9edd4b7cabf13bdea7d42e969ab108269c6ab0 - -Len = 984 -Msg = adf2263200f376886ba7b6f5e4411d5f07f7d9d101590c73ace114bafbcb0fdc99269e87cd2cead2a1cfe5744394d333aba408a07e21f30233b65b907472e9e3c7d6e7aa6d2c47a08a1be7bb877913a6b5604c723384478911c339e3b5fe527c7e288705a89c95d970b443347897e79f6c522bafe62b11ef8f3135 -MD = 3c23d2d8cf4db6ac6a42e27208180f37668bef5ee0a3f879483c8e604e7f42583f202037b8d242c04a87345b8be6dc8b121d6484b9edad0d73c894c1288f5cae - -Len = 992 -Msg = 18e75b47d898ac629c48e80dbfb75dae1e1700b771165eccdb18d628bfc4063dd6c3839a7ec4cd1255c4821b078cd174647b320bb685541d517c579f6b8e3cdd2e109a610c7a921653b204ad018d0340d9938735b60262662016767e1d8824a64954086229c0e3b5bd9ad88c54c1dc5aa4e768ff1a9470ee6f6e998f -MD = 01c756b7c20b5f95fd2b079ab6a50f28b946fb16266b07c6060945dc4fe9e0d279c5b1505b9ec7d8f8f3c9ebf0c5ee9365aec08cf278d65b64daeccc19d3cbf4 - -Len = 1000 -Msg = c2963342cfaa88ccd102a258e6d629f6b0d367dd55116502ca4451ea523623bc4175819a0648df3168e8ea8f10ed27354807d76e02ee1fdf1c9c655ee2b9fd08d557058dabdf8dcf964bfcacc996ae173971e26ea038d407c824260d06c2848a04a488c4c456dbcde2939e561ab908c4097b508638d6cda556465c9cc5 -MD = a4d2f59393a5fea612c3c745f4bb9f41aaf3a3ce1679aa8afc1a62baa4ed452819418c8ae1a1e658757976692390fc43d4decf7d855cd8b498b6dc60cae05a90 - -Len = 1008 -Msg = 85360c3d4257d9878e2f5c16d3cd7d0747df3d231e1a8f63fddc69b3b1101af72153de4c8154b090c9815f2466e0e4f02f3af3a89a7fd04e306664f93e5490d4ce7fc169d553c520ae15dd02c7c613c39b4acd00e0c9a3c501566e52cecea11f7303dd1da61abf3f2532fd396047b1887255f4b256c0afcf58f3ae48c947 -MD = e8352ddcac59e377ea0f9c32bbb43dfd1b6c829fad1954240c41b7c45b0b09db11064b64e2442a96f6530aac2c4abf3beb1eae77f2bce4efe88fee1a70cf5423 - -Len = 1016 -Msg = c13e6ca3abb893aa5f82c4a8ef754460628af6b75af02168f45b72f8f09e45ed127c203bc7bb80ff0c7bd96f8cc6d8110868eb2cfc01037d8058992a6cf2effcbfe498c842e53a2e68a793867968ba18efc4a78b21cdf6a11e5de821dcabab14921ddb33625d48a13baffad6fe8272dbdf4433bd0f7b813c981269c388f001 -MD = 6e56f77f6883d0bd4face8b8d557f144661989f66d51b1fe4b8fc7124d66d9d20218616fea1bcf86c08d63bf8f2f21845a3e519083b937e70aa7c358310b5a7c - -Len = 1024 -Msg = fd2203e467574e834ab07c9097ae164532f24be1eb5d88f1af7748ceff0d2c67a21f4e4097f9d3bb4e9fbf97186e0db6db0100230a52b453d421f8ab9c9a6043aa3295ea20d2f06a2f37470d8a99075f1b8a8336f6228cf08b5942fc1fb4299c7d2480e8e82bce175540bdfad7752bc95b577f229515394f3ae5cec870a4b2f8 -MD = a21b1077d52b27ac545af63b32746c6e3c51cb0cb9f281eb9f3580a6d4996d5c9917d2a6e484627a9d5a06fa1b25327a9d710e027387fc3e07d7c4d14c6086cc - diff -Nru temporalio-1.3.0/vendor/rustix/benches/mod.rs temporalio-1.3.0/vendor/rustix/benches/mod.rs --- temporalio-1.3.0/vendor/rustix/benches/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/benches/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -4,7 +4,7 @@ //! the "fs", "time", and "process" cargo features. //! //! ```sh -//! RUSTFLAGS=--cfg=criterion cargo bench --features=fs,time,process,stdio +//! RUSTFLAGS=--cfg=criterion cargo bench --features=fs,time,process //! ``` #[cfg(any( @@ -12,7 +12,6 @@ not(feature = "fs"), not(feature = "process"), not(feature = "time"), - not(feature = "stdio"), windows, target_os = "emscripten", target_os = "redox", @@ -20,7 +19,7 @@ ))] fn main() { unimplemented!( - "Add --cfg=criterion to RUSTFLAGS and enable the \"fs\", \"time\", \"process\", and \"stdio\" cargo \ + "Add --cfg=criterion to RUSTFLAGS and enable the \"fs\", \"time\", and \"process\" cargo \ features." ) } @@ -30,7 +29,6 @@ not(feature = "fs"), not(feature = "process"), not(feature = "time"), - not(feature = "stdio"), windows, target_os = "emscripten", target_os = "redox", @@ -43,7 +41,6 @@ not(feature = "fs"), not(feature = "process"), not(feature = "time"), - not(feature = "stdio"), windows, target_os = "emscripten", target_os = "redox", @@ -110,27 +107,6 @@ }); } - pub(super) fn simple_fstat(c: &mut Criterion) { - use rustix::fs::fstat; - - c.bench_function("simple fstat", |b| { - b.iter(|| { - fstat(rustix::stdio::stdin()).unwrap(); - }) - }); - } - - pub(super) fn simple_fstat_libc(c: &mut Criterion) { - c.bench_function("simple fstat libc", |b| { - b.iter(|| { - let mut s = std::mem::MaybeUninit::::uninit(); - unsafe { - assert_eq!(libc::fstat(libc::STDIN_FILENO, s.as_mut_ptr()), 0); - } - }) - }); - } - #[cfg(not(target_os = "wasi"))] pub(super) fn simple_clock_gettime(c: &mut Criterion) { use rustix::time::{clock_gettime, ClockId}; @@ -184,7 +160,6 @@ not(feature = "fs"), not(feature = "process"), not(feature = "time"), - not(feature = "stdio"), windows, target_os = "emscripten", target_os = "redox", @@ -196,8 +171,6 @@ suite::simple_statat_libc, suite::simple_statat_libc_cstr, suite::simple_statat_cstr, - suite::simple_fstat, - suite::simple_fstat_libc, suite::simple_clock_gettime, suite::simple_clock_gettime_libc, suite::simple_getpid, @@ -208,7 +181,6 @@ not(feature = "fs"), not(feature = "process"), not(feature = "time"), - not(feature = "stdio"), windows, target_os = "emscripten", target_os = "redox", diff -Nru temporalio-1.3.0/vendor/rustix/build.rs temporalio-1.3.0/vendor/rustix/build.rs --- temporalio-1.3.0/vendor/rustix/build.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/build.rs 2023-10-30 19:40:00.000000000 +0000 @@ -2,7 +2,7 @@ use std::io::Write; /// The directory for inline asm. -const ASM_PATH: &str = "src/backend/linux_raw/arch"; +const ASM_PATH: &str = "src/backend/linux_raw/arch/asm"; fn main() { // Don't rerun this on changes other than build.rs, as we only depend on @@ -34,9 +34,6 @@ // enable the libc backend even if rustix is depended on transitively. let cfg_use_libc = var("CARGO_CFG_RUSTIX_USE_LIBC").is_ok(); - // Check for `--features=rustc-dep-of-std`. - let rustc_dep_of_std = var("CARGO_FEATURE_RUSTC_DEP_OF_STD").is_ok(); - // Check for eg. `RUSTFLAGS=--cfg=rustix_use_experimental_features`. This // is a rustc flag rather than a cargo feature flag because it's // experimental and not something we want accidentally enabled via @@ -55,10 +52,7 @@ // If experimental features are enabled, auto-detect and use available // features. - if rustc_dep_of_std { - use_feature("rustc_attrs"); - use_feature("core_intrinsics"); - } else if rustix_use_experimental_features { + if rustix_use_experimental_features { use_feature_or_nothing("rustc_attrs"); use_feature_or_nothing("core_intrinsics"); } @@ -77,11 +71,6 @@ use_feature("static_assertions"); } - // WASI support can utilize wasi_ext if present. - if os == "wasi" { - use_feature_or_nothing("wasi_ext"); - } - // If the libc backend is requested, or if we're not on a platform for // which we have linux_raw support, use the libc backend. // @@ -94,7 +83,8 @@ || !inline_asm_name_present || is_unsupported_abi || miri - || ((arch == "powerpc64" || arch.starts_with("mips")) && !rustix_use_experimental_asm); + || ((arch == "powerpc64" || arch == "mips" || arch == "mips64" || arch == "mips64r6") + && !rustix_use_experimental_asm); if libc { // Use the libc backend. use_feature("libc"); diff -Nru temporalio-1.3.0/vendor/rustix/.cargo-checksum.json temporalio-1.3.0/vendor/rustix/.cargo-checksum.json --- temporalio-1.3.0/vendor/rustix/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1,316 +1,305 @@ { "files": { "CODE_OF_CONDUCT.md": "f210602311e3f74b32f46237fd55f4ce36d798e85e3db1432ec667f63a7ffc44", - "CONTRIBUTING.md": "3fd57de5c678db1c972da676a8231d2fde9820695ef1f0d53f1e55a3e81d9de0", + "CONTRIBUTING.md": "fb570c76cf924cd75b77bed52b0dbe1e87ce224dc3428c48d98301710dcc331e", "COPYRIGHT": "377c2e7c53250cc5905c0b0532d35973392af16ffb9596a41d99d202cf3617c9", - "Cargo.toml": "5a6eafc41863c968362a1b8424dd0a5e1ce6502496b2999ef97ceac81f30fbcd", + "Cargo.toml": "5473eb2eb17b75a7a5b22223309f10a3e3a3a935d6b61e8dbfe15f1696030680", "LICENSE-APACHE": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2", "LICENSE-Apache-2.0_WITH_LLVM-exception": "268872b9816f90fd8e85db5a28d33f8150ebb8dd016653fb39ef1f94f2686bc5", "LICENSE-MIT": "23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3", "ORG_CODE_OF_CONDUCT.md": "a62b69bf86e605ee1bcbb2f0a12ba79e4cebb6983a7b6491949750aecc4f2178", - "README.md": "0acc443488c1d6f7a0a80a91385d06c7a1920c1f5c847214dd6c23a6bd027f75", + "README.md": "20e6d4bc5a33c81e9a4a04abe8ac611658deb4ab0794cd792f0568f287b68da7", "SECURITY.md": "4d75afb09dd28eb5982e3a1f768ee398d90204669ceef3240a16b31dcf04148a", - "benches/mod.rs": "e260e67273aa0a37cffdc5cd451699335b8ee656c17275a0d0f2b4563c6018ca", - "build.rs": "5f93559819ca7fe233f01579d51ff5b58cb6e96ef9e7817a3358a9b410d5bbf6", - "src/backend/libc/c.rs": "9a929ab2bff99843e8c663b92b93def5c752e96d2e6228520cb50eeec483586b", - "src/backend/libc/conv.rs": "b66d080db3a4c2756fe722462b543982bf88e5bc8071b9dc98d28ec2aee3dbfc", - "src/backend/libc/event/epoll.rs": "b6f00ec602f9a6b9a2b7a66a242efda088b67ed66053692dcbba683df4fdaf19", + "benches/mod.rs": "7abf49bced798168a4f57916654305a6c5d048d12e0ad43d30ab14f24b5e527a", + "build.rs": "36956bd7e6b5a2d5e66e9a91eae41d76bd75b4a25d5427dc22ad48307ef25cc1", + "src/backend/libc/c.rs": "3c6fd97c1ce74d13b18e7e0de489038149c7f1d776459994c445d20896e84cb3", + "src/backend/libc/conv.rs": "71cb0f653fa95705bcea2173840b78dd02f94735db970f8081231320e0478cb9", + "src/backend/libc/event/epoll.rs": "93260ad4105dacd9b27b2499e5e81bad8071e22e3f9468bf417d63962feb8579", "src/backend/libc/event/mod.rs": "7f8547c599b8263eb791890bbe4a0b22fe2676d007ffdcc3e07b2e48d1c994db", - "src/backend/libc/event/poll_fd.rs": "1186dd69fc78d474975f1b8c55c9dd261229cb0c53a0dd2a88754ef62529a917", - "src/backend/libc/event/syscalls.rs": "295a930521b345192caaf916b39189299f81f5f7c9f1aaed235baf3bf6f2f5fa", - "src/backend/libc/event/types.rs": "e81130bc07e8f762ea2942bca1bde048ade0df24aac619907f3055d2dda7d522", + "src/backend/libc/event/poll_fd.rs": "4f614e8811f2a4b85bcd0e65029cbde460adeb7351be9dec3ce84e615a498702", + "src/backend/libc/event/syscalls.rs": "3be2f52fcabad16cf4d554f56d70fb47ac9dee61feabb3d883e701d53745017d", + "src/backend/libc/event/types.rs": "f258bd98a4095b7b278bb267e572b5e599d727a83f42a0508231ac6a396bb795", "src/backend/libc/event/windows_syscalls.rs": "ebfac665c6676c4b803134ab8806be8aa2e96bdbc7799a19c544cd9069b35787", - "src/backend/libc/fs/dir.rs": "71332c794f4e2438e7c700a0d2206fe0088cf98473030e3f8ccddf252ad7f5b2", - "src/backend/libc/fs/inotify.rs": "a027a718db8bf6ff9a778c2cfa706850b466240b0a2296d72b9834c0096968e8", + "src/backend/libc/fs/dir.rs": "4ff9b5f3b6fad06cfb641cf74511c4b80186b426e8c2d67a1b6cba08466b5d4f", + "src/backend/libc/fs/inotify.rs": "bd52622a2f3b596f1c3216b93e65af05e57a8f278e62aeb33c536a66a7f16c7e", "src/backend/libc/fs/makedev.rs": "89c679a0ef18dd41b3c6223bce0f329ad35bf6cadbf16e47b33fad3f312ba4a6", - "src/backend/libc/fs/mod.rs": "3d28b803011b57da6315bb747daf0117218687c0cc610358f5dafddf0b7d44d3", - "src/backend/libc/fs/syscalls.rs": "229d1c27d53bfbd35310b05aaf8b3307d6b6e9948faf0655713bc662f901bd02", - "src/backend/libc/fs/types.rs": "ca25c8271e1fd2ff6c28082884ca112fd5e0523b2aa3cd289cd9a399c962a172", - "src/backend/libc/io/errno.rs": "d33978855c2e0e97d5e1f7a04ab10894f9f2c3e329e949f259a757f89942074e", + "src/backend/libc/fs/mod.rs": "5fa5a19401054cbf8d339192508aa7ad60fb2b0543256dbfbda128c05dedf645", + "src/backend/libc/fs/syscalls.rs": "10aa31d90467588e647c183d90924462713037306969b833ee90f0bb6f8176eb", + "src/backend/libc/fs/types.rs": "e3cb0246d797c3e7c322f1de95a01d8372c793f8896f4a20d507d73e8a474414", + "src/backend/libc/io/errno.rs": "01783934c204b775c12a4da055405ab543f63e5b127b55e305efc47708c7f679", "src/backend/libc/io/mod.rs": "746647bd864e4ec7717925b6d176cebdb392b7d015070244cc48d92780351dd6", - "src/backend/libc/io/syscalls.rs": "cbd9e9db566597de0a709247c8ba3bd1e6ce266a128d639273353c706f0592b7", - "src/backend/libc/io/types.rs": "2efd39bb3df19a9db5496217284f3d2235ddb354fac81dd71861109a56bede0b", - "src/backend/libc/io/windows_syscalls.rs": "fab3fa099aa89cea56a6edc651dd37750e581534f4f45b04a7e425f130b08468", + "src/backend/libc/io/syscalls.rs": "fd71e78eef9f2ae247fb7d5c92c54d4c32161784dc258848db458f89023faf41", + "src/backend/libc/io/types.rs": "2248c2ba2c4b6ecbbb9f6c8dc2814734e8cd05e664c2aab409a243e034ff338b", + "src/backend/libc/io/windows_syscalls.rs": "73d3e609d30dfbb1a032f3ac667b3c65cb8a05a1d54c90bbb253021c85fd496a", "src/backend/libc/io_uring/mod.rs": "2c6478857a0751625edabd61acb841819bfba1093b1faeded15693c805d84952", "src/backend/libc/io_uring/syscalls.rs": "5af8146d5971c833e6fd657f652c618b31f854e1b0811864fba9b658cb633e19", "src/backend/libc/mm/mod.rs": "8aa966faf3853d1a93d0ed91f7e5f4a53539b0287b25a5bfe489fa1d07f7cfd7", - "src/backend/libc/mm/syscalls.rs": "c04c61ad3d7f3b24d13f89144d7fa0a05658cea4763207f9250db4f9362de2fe", - "src/backend/libc/mm/types.rs": "48406d44d79b102ae9d17860749611d26c1f04e3630e9680dfcb20e2efc148a8", - "src/backend/libc/mod.rs": "778083f85aaca00aa5c8ec36b541e0e8a3e693660a6acf4722b4508f015c278c", + "src/backend/libc/mm/syscalls.rs": "858e5bb3bc850b6a2d5ce69b3c8e40ab7cf75d392fe3a022119e5edd0c538db5", + "src/backend/libc/mm/types.rs": "db3b5af83e07a68eaa7f70e04871e818acd5542c135e92b4a38af555e076540e", + "src/backend/libc/mod.rs": "e572b4461d4fe9a399b5db9c8395d6559ffe69586c76506d53d5d7fb37bb87cf", "src/backend/libc/mount/mod.rs": "8aa966faf3853d1a93d0ed91f7e5f4a53539b0287b25a5bfe489fa1d07f7cfd7", "src/backend/libc/mount/syscalls.rs": "1bc87501a078616d0190d2e85de55f3f968b8cb79d49bd9eb839a350eed26089", - "src/backend/libc/mount/types.rs": "1b0d527ae5a272ae441fa35192616a867090204404324a341a7864ae1f5ea3fd", - "src/backend/libc/net/addr.rs": "9bdc2febb20785bc26a820eaba52cb546c67c79cb547f08105087cd0f79d5861", - "src/backend/libc/net/ext.rs": "0dd64877abe1ba86b47a2ab34340e3f6cc7b53b22d0bb5e237daf6a82edd46b0", - "src/backend/libc/net/mod.rs": "5f0bd80a6575aba4a714443ca99af76ad15b053f1f8029aa1d9c7fa10e6d9242", - "src/backend/libc/net/msghdr.rs": "64825203c09cb60ac4e869cd27a44697f1efe53455c41684279d50d8f0a96701", - "src/backend/libc/net/read_sockaddr.rs": "b1a72b7bd56cd152ed0731f571e4d9411b2974f860fc045319dc74b5b077e569", - "src/backend/libc/net/send_recv.rs": "1450ca958431a5bf3a85cdeef88b387f30d5c1215de2c56d164ccda38f21b36c", - "src/backend/libc/net/sockopt.rs": "178a6622bab25bf1813d6c17151f48d820e238db8cbd05be3aae563902d6c53e", - "src/backend/libc/net/syscalls.rs": "1c703ea3d7a1d0bfa43ffe07425882f310260589d513e1a936de434fa653cf3a", - "src/backend/libc/net/write_sockaddr.rs": "6f06f6cf6089fbc43f93f4f3830468735c92277595769867cb6c89e1fe1c299a", - "src/backend/libc/param/auxv.rs": "fc9476c85482b1d44190289224ccf40c96fbf3a2fe3d8554ddb42acb2e97a8ae", + "src/backend/libc/mount/types.rs": "6744dc82723d2e08af1d69b7421642bc1b687d89f9116643df9d2e7a9b1d1c39", + "src/backend/libc/net/addr.rs": "72f504c3a97eaa49d3013db30b55c5c8f711a097b98023ffcbb527d04cf0a014", + "src/backend/libc/net/ext.rs": "d1274fd3ab84bbb8b73f45efe6dbd63f82b09d889a6b2aae07f15970dbb6c6c2", + "src/backend/libc/net/mod.rs": "605b818c6f4c536c96e052d9b843eeca79dccd1d3cf1c8b87e60c8539b8122b4", + "src/backend/libc/net/msghdr.rs": "f82825d40d8872e2e804cde32bbcc68bef43a5f48ad857fb1030550c4eb44838", + "src/backend/libc/net/read_sockaddr.rs": "62b8a444cb9a0a9031d462f96f401db14b851551dd3dc58eec06570d7fec06c2", + "src/backend/libc/net/send_recv.rs": "eb8b0b3d291a176b5a2e4818b683819aee395d860bd566b898c2e1ba4e115886", + "src/backend/libc/net/syscalls.rs": "15b8514e725068a7e45084e0c1ce2bd93c191ff4870544a8f79760d27e0db5cc", + "src/backend/libc/net/write_sockaddr.rs": "1b53ba3d8f3b7353e6c888636e4990c837b078796b8120041e5497342dc9516c", + "src/backend/libc/param/auxv.rs": "fdc85b7c33bcd05a16471e42eb4228c48c98c642443635ba5fc3e9a45438d6d3", "src/backend/libc/param/mod.rs": "5234b8f1bcb886cca6ea003d411d75eaeebe58deedd80e3441354bf46ed85d4d", "src/backend/libc/pid/mod.rs": "2c6478857a0751625edabd61acb841819bfba1093b1faeded15693c805d84952", "src/backend/libc/pid/syscalls.rs": "49ea679b96c0741d048e82964038f9a931bc3cf3a0b59c7db3df89629b9c49e6", "src/backend/libc/pipe/mod.rs": "8aa966faf3853d1a93d0ed91f7e5f4a53539b0287b25a5bfe489fa1d07f7cfd7", - "src/backend/libc/pipe/syscalls.rs": "8affde100f6a9dfc762b79d1e48be5c1039be414f8ef7d5a6acaba882a68d259", - "src/backend/libc/pipe/types.rs": "bcf2751691748b5084a6d8d8851b496bc2ee9011fc1c717839b09b07d423eb7f", + "src/backend/libc/pipe/syscalls.rs": "0bf55fdd9f4e351ec8fbd8cf895ed44f513d230ffd51929229c68d87ff2b18ab", + "src/backend/libc/pipe/types.rs": "ba9f7827ebbf4c2488ccd612beb59b66ced3be2e14a467660bc60aa0332be11d", "src/backend/libc/prctl/mod.rs": "2c6478857a0751625edabd61acb841819bfba1093b1faeded15693c805d84952", "src/backend/libc/prctl/syscalls.rs": "8a2684f444a7555098dce2b92270d81cefdae902716c6e5d59bd7b0657e8a29d", "src/backend/libc/process/cpu_set.rs": "b3d36b01b53b0b6c61a20ed8a69d48eccdd90cc17f82f2926ef1e844f002d0b7", - "src/backend/libc/process/mod.rs": "3f376060815d2ed78081ddf6fb0cddc97dff5dac2f4934f0672cb09736e16377", - "src/backend/libc/process/syscalls.rs": "278c87df6321cad2bd37049a7cfeecad7dd54f5e3a8449368da4c3409637e6af", - "src/backend/libc/process/types.rs": "c011d60d93130e1233ee1d69de1e834a6ce05628220a1c0bea9b5c6eb4c853a2", + "src/backend/libc/process/mod.rs": "d7dc401255bad2e55ffff365339cdc3aad306861d269ad727a817d3cd7763166", + "src/backend/libc/process/syscalls.rs": "b47392bd1aad96ca93ce421d8877e8b6e6da725db7bb521936ca07e4d1bec114", + "src/backend/libc/process/types.rs": "e8e54a21e7450157a8471571727c1c7af169ede372329c0e5d82a2e0193ba76e", "src/backend/libc/process/wait.rs": "0cc556aed976b4bbb3965f74fd76b8216c755fce25043b7b21ce54afa07c9773", "src/backend/libc/pty/mod.rs": "2c6478857a0751625edabd61acb841819bfba1093b1faeded15693c805d84952", - "src/backend/libc/pty/syscalls.rs": "699a4c325fc590b8b5dabfe5a9ff386809be14dd24bf35aa6ef581b2bd75457b", + "src/backend/libc/pty/syscalls.rs": "c4ec64720854f3b83307f67dfc75ab911b3a0378cc2e519054aae045d181f445", "src/backend/libc/rand/mod.rs": "8aa966faf3853d1a93d0ed91f7e5f4a53539b0287b25a5bfe489fa1d07f7cfd7", "src/backend/libc/rand/syscalls.rs": "78c7201e6bcb75e9cab9486d1878861319f865de2b2c46437be68690bd17bf13", - "src/backend/libc/rand/types.rs": "4eb0b4cdd0a9b089d1c9f6a25ad1ca97be28a38b7b07a705ec605b773f63f880", - "src/backend/libc/shm/mod.rs": "8aa966faf3853d1a93d0ed91f7e5f4a53539b0287b25a5bfe489fa1d07f7cfd7", - "src/backend/libc/shm/syscalls.rs": "60d797d4e85e08e6330e6b8d80094356ce377e5484952f88ae2a6e49231c268c", - "src/backend/libc/shm/types.rs": "2206eac8ee74951b995e1e80f10bf235cc6b04e0a099f4adefce546378838233", + "src/backend/libc/rand/types.rs": "7d473c7ee8f19fbcec31f61b28ba6a68e1233f64f37b3b496d396c0197af63e1", "src/backend/libc/system/mod.rs": "38563ea68829ca5a4b1b0695ac8a5c05718e85bdc88a36dc805efdfce45d3909", - "src/backend/libc/system/syscalls.rs": "abe1093f3495668d8576ae55073c74976cffb04d2e1bc20583d7ec12ac848b06", + "src/backend/libc/system/syscalls.rs": "846dfb59afe40bbfc78e57afa76f0616d62d25da2daadcd872aea6fa32aafc3b", "src/backend/libc/system/types.rs": "6871e16aee14fe2ae03cea798c3e509ffe44778a9c0e5608fd73e2e015876d7e", "src/backend/libc/termios/mod.rs": "2c6478857a0751625edabd61acb841819bfba1093b1faeded15693c805d84952", - "src/backend/libc/termios/syscalls.rs": "77c4c6fdfe036251ee1540df5b398a38d87597a5e7e94abaf9b983419ae4ca24", - "src/backend/libc/thread/futex.rs": "b666828653b12634bbd7fd709acf69641b648ec40962a1d4f904c5db14d2eff5", - "src/backend/libc/thread/mod.rs": "fa710053974d7f16a6c49242ee6c10a3b9e1143452b9daeaed8837302a679fff", - "src/backend/libc/thread/syscalls.rs": "c8e84ad232ec1317be989529c24e204c51bb4e1e0212de2c1937b00bc92e5483", + "src/backend/libc/termios/syscalls.rs": "848f17fbf5c37311ec538cf52314140ef2e89c174ef448bdfbceb525b9b40d11", + "src/backend/libc/thread/mod.rs": "0de5f67a684b9fd7628d3009d2ea5fd51b8770e8b387eed14f59152157844287", + "src/backend/libc/thread/syscalls.rs": "fe4dfeb072972eac5e2a8de05d7f5c33fd2580a4ce486c5003497d717bbfd176", "src/backend/libc/time/mod.rs": "38563ea68829ca5a4b1b0695ac8a5c05718e85bdc88a36dc805efdfce45d3909", "src/backend/libc/time/syscalls.rs": "f82e0725c5af8a52e61ee83aad2c77694f2f7a72ac1e6eb284109a70ac6edc38", - "src/backend/libc/time/types.rs": "47ab4178a51c246ecc5f2a2fcca7f6ad9c8a1a45d11dadcb95ee0e4f82e8dfe2", + "src/backend/libc/time/types.rs": "e209e7e5485535d3f5d3494e9f84f5b5b69a052959709b8a61081604fb30fe60", "src/backend/libc/ugid/mod.rs": "2c6478857a0751625edabd61acb841819bfba1093b1faeded15693c805d84952", "src/backend/libc/ugid/syscalls.rs": "8edf91b8790add23902c9f5418da6b0723a371677f29f490e0c8af852f0f1a0c", "src/backend/libc/winsock_c.rs": "3bf3884fd250eca806ffdf96da68e29c133a697810b78b333ea449e523e58562", - "src/backend/linux_raw/arch/aarch64.rs": "2a255c9135bc8a321c180f52b88eb2b158bc9170cd222149caeae63c24587d44", - "src/backend/linux_raw/arch/arm.rs": "165bccb5883d0136e55d42091183765f83d86e9d37a7cb2cec9ae8af32774db6", - "src/backend/linux_raw/arch/mips.rs": "24af364aa93fd4b9917639d473336490a143f0d1723b09f388e72d534160ee51", - "src/backend/linux_raw/arch/mips32r6.rs": "e436a2ade34f2f7c58b8924462b07a2499dfc951e1e1318d51759444fb8b658e", - "src/backend/linux_raw/arch/mips64.rs": "897da9ddc877963ad59464d7f81dc59df8a7e91251e6adea14cfd946e2740a1c", - "src/backend/linux_raw/arch/mips64r6.rs": "3c08aea13c1139fb0dfbe74ca3d0147f007c3aa2eda641afb82c46f6aa4f6cd1", - "src/backend/linux_raw/arch/mod.rs": "37eaeea601d39be00d170856a31a8ec6a27b0d3ac22ab3ee642ab0e45dee237d", - "src/backend/linux_raw/arch/powerpc64.rs": "dfb001f8636a5e46d728900b0804fe6c374e5e18a6f0e76d7d62e0c07da74477", - "src/backend/linux_raw/arch/riscv64.rs": "41d33242d941030f46077dc2b1bc4c7913fe7630d693a5a7eef966bcf38f9d8b", - "src/backend/linux_raw/arch/thumb.rs": "2fd979ab421248c0a4c592bc0cefee63edc26528f469b71b63eaed35356e42e8", - "src/backend/linux_raw/arch/x86.rs": "81c73c0a13925854b54db754f533dec565b1db2d9586e210a2450c6f5915171d", - "src/backend/linux_raw/arch/x86_64.rs": "e929036a1f3cf93ba538f4523b241605cc7b5e61f84ffe6d9d5cdbcb6f73e543", - "src/backend/linux_raw/c.rs": "74cdf34fcd5bba9628c04585fa13721073e2bffe6740315c7655d1a55150230f", - "src/backend/linux_raw/conv.rs": "fd339c2e78e6470cb03614540bea2958eec83f1b6cbecc68696a2d2061365f90", - "src/backend/linux_raw/event/epoll.rs": "4ae8f9de28c6875ab29cde7da9b4b01a6578e905c7a0e0b461d26025cb24ab52", + "src/backend/linux_raw/arch/asm/aarch64.rs": "67011427b3cecd29ee716113d952e70d63574c96d1d3ea3c75d46250bde9ca44", + "src/backend/linux_raw/arch/asm/arm.rs": "7760d51aef17a69a797eb96fd61f7fade0d55bc87ec9a3e77fa6bb6aebaecdbb", + "src/backend/linux_raw/arch/asm/mips.rs": "d00c84cfdb4e37bdee9a2daa0a7b3298afbb4ebe288702203cb43d9c2617012d", + "src/backend/linux_raw/arch/asm/mips32r6.rs": "6c2661361ba0ac5caa8458f502c6cca266ce59a43ab552b7882c07cb64b9d149", + "src/backend/linux_raw/arch/asm/mips64.rs": "ab5455c9b2511ba6b67a66873cd8b53bf77471249fd2779d6437ebb4934087b5", + "src/backend/linux_raw/arch/asm/mips64r6.rs": "a67262dc9cbd583ecfff93953726dabfd6574714d4646aff27582ff034a28cb9", + "src/backend/linux_raw/arch/asm/mod.rs": "1ac43073fc3d28879ab46d9220344785db4ef761a21d0357e4fe564157e6f1a6", + "src/backend/linux_raw/arch/asm/powerpc64.rs": "dcd12314184441f5f7705bea6b829103c7abc9062db366ae5584023a38252a36", + "src/backend/linux_raw/arch/asm/riscv64.rs": "58a58203e9cac2ed21e4a7b26692c5d56d3c2bcddb3f60a648efd18a02129f3c", + "src/backend/linux_raw/arch/asm/thumb.rs": "82b88c9a3b6837f28a738cc760fc2403e7014abdb2c35d2bdbc8073235ae2863", + "src/backend/linux_raw/arch/asm/x86.rs": "c5ac97f4dfe44af1cee43a0b6d87319e1e5441147bda790a5fd3abcdb80715f9", + "src/backend/linux_raw/arch/asm/x86_64.rs": "7c893ca306b3b8a5980c525dc5fa23187a0526bc9f7ac637204d88a1d596df5d", + "src/backend/linux_raw/arch/mod.rs": "31b3753c763ce3d2dd92db926123fc5eb6e0ba66a09f5574b6ebb11c836dcf6b", + "src/backend/linux_raw/c.rs": "1fd8558fccee6d548cb1bc93cceec39ce99133f46103fd75ccca405de2d2a8ad", + "src/backend/linux_raw/conv.rs": "027816a35e624a90b141ce3f84e8634f9626f9da41130a0f777a60484776318e", + "src/backend/linux_raw/elf.rs": "ff5017040b29a8cf8d5077a0c73943bfa5e3862eaab37ee1c3b08a1122968bbe", + "src/backend/linux_raw/event/epoll.rs": "6bea5634e8b0e40b38bc15fa18848548327d81a526516a34c49609ed3276d41c", "src/backend/linux_raw/event/mod.rs": "72e46b04637e2d1d2a6b97af616144995399e489d1fe916faf835d72fc8c64cd", - "src/backend/linux_raw/event/poll_fd.rs": "fe1c289980384edf7334a4afe92f92cb6f51b7c0431ecb19930426a3bdb89fa5", - "src/backend/linux_raw/event/syscalls.rs": "8782cdf978bff0773bf5f35c1056d5c29a40742cf6f99d9606d951b52596cd34", - "src/backend/linux_raw/event/types.rs": "9538403f2e2c5ffcc939769d83fbfcc2db03874b45c36a2858ba07a05a3e3635", - "src/backend/linux_raw/fs/dir.rs": "c675dc5413428d2defd6752e99d210da83639779e853db209de6a1c08d35e0e7", - "src/backend/linux_raw/fs/inotify.rs": "9fc5edea36e347041a39e583cb473dd84af40c63fff3dfbb85a1a97d2833d8e5", + "src/backend/linux_raw/event/poll_fd.rs": "1257867925d18ab0fcefe1c857d39436931d7bb3ca711b2112a32a218faf7d73", + "src/backend/linux_raw/event/syscalls.rs": "f996db9f1f9f2b9bdaf33ef3a80a63ab9b1a65ae956700fd88d355e046ce2890", + "src/backend/linux_raw/event/types.rs": "4edf9c7c399c91f359bc2370a407fa5ab537a84eed26c593ce5bf6dd82c6c6a0", + "src/backend/linux_raw/fs/dir.rs": "d871468c08ea22868f308ce53feb1dbab8740d577441a4f3aadd358baa843d27", + "src/backend/linux_raw/fs/inotify.rs": "85c9d2ed5698cf0eb0f354e9345534a9081b3a7d4b7b016f0a4a5ad5543ab2ed", "src/backend/linux_raw/fs/makedev.rs": "c6b4505c4bcbbc2460e80f3097eb15e2c8ef38d6c6e7abd78e39c53c372139e2", - "src/backend/linux_raw/fs/mod.rs": "8689e46f9c4c3e1190ae5fe39176c573cccac10b3739472128ca237f41e2686a", - "src/backend/linux_raw/fs/syscalls.rs": "a4512f58e2ef01bf0799c96fa7821284866b6826594642565f46d93e566e2e12", - "src/backend/linux_raw/fs/types.rs": "ccbce0b7971064c71b16a341b7f39bf2c375262ea199d6fcf9d1b073b032ccf1", - "src/backend/linux_raw/io/errno.rs": "2681fe1f7da132414606a7c0dbc1c2cbc43e45f326f00d06cdff51d9724c8c5e", + "src/backend/linux_raw/fs/mod.rs": "e22bf30f312f6a05f1e79f7834c33a3c9821514da05fa4786fc31867203a4c74", + "src/backend/linux_raw/fs/syscalls.rs": "13c14c5bcd5fa20d18f603f4625a37f7116f86bb0fe481a1db40cd41bca028c5", + "src/backend/linux_raw/fs/types.rs": "53d170cadfb06fcff5b8333315768fd50eec05f54baa0be443058f9f5bcabe70", + "src/backend/linux_raw/io/errno.rs": "8d6a8d702ddec05c0ec5b518b9c4d6c9b54d390ea9b362e60f2032284c40b112", "src/backend/linux_raw/io/mod.rs": "7ae2324427892cca6f5ab53858d847b165f790a72ec25f3d99fb15f0506c9f27", - "src/backend/linux_raw/io/syscalls.rs": "831ce424f0032e6891d46503e972313fd7a46f15cb2fbb1f87e40fb05a018e9a", - "src/backend/linux_raw/io/types.rs": "d0df5a62248e1ba19af0f89f86da7ba2312d97065c2814ddf6b08a4a0db23bad", + "src/backend/linux_raw/io/syscalls.rs": "b079441386e5eb835b258871ae813dcd39fd8aeef4fc96bee187a45b0544bda7", + "src/backend/linux_raw/io/types.rs": "59d031dd1e769ecbaedaaa3ffc513a7f7154fc48abbb46023166fa38a46f0c61", "src/backend/linux_raw/io_uring/mod.rs": "2c6478857a0751625edabd61acb841819bfba1093b1faeded15693c805d84952", - "src/backend/linux_raw/io_uring/syscalls.rs": "0f7c9cb7ccddf5687e4b9e5b23558871a452a29ac6095a0184a06c47b9b18eb6", + "src/backend/linux_raw/io_uring/syscalls.rs": "b87fa95c16b2d3ca8fd5d72368bda37b8b8ddbb19df3a884efc6eeec393c86d1", "src/backend/linux_raw/mm/mod.rs": "8aa966faf3853d1a93d0ed91f7e5f4a53539b0287b25a5bfe489fa1d07f7cfd7", - "src/backend/linux_raw/mm/syscalls.rs": "ac77ee94bb26bc959d3b077ef60e72863ef845c1438646b61755bdb861467bc6", - "src/backend/linux_raw/mm/types.rs": "46abdd2492301b7fe542ea3949eef2cfe28959cdd1f571ee1350e35b6517349b", - "src/backend/linux_raw/mod.rs": "bb26fe4783f834a4624c99ecf9e4ea8fa4d1c7fe9adfb6d7310fac689e7797bc", + "src/backend/linux_raw/mm/syscalls.rs": "369abe984aa972d8083fee20d764a8d57df242c66f897066367416f2fcc832a3", + "src/backend/linux_raw/mm/types.rs": "74dd9772c7208d6ad2d3830277eb1f67d5b2392553be23c8a64181c21ca1dc37", + "src/backend/linux_raw/mod.rs": "eb94a0ff0f7dad9e114d19bcd9bf5b320b9e8570ce74277756aaf038c815e23f", "src/backend/linux_raw/mount/mod.rs": "8aa966faf3853d1a93d0ed91f7e5f4a53539b0287b25a5bfe489fa1d07f7cfd7", "src/backend/linux_raw/mount/syscalls.rs": "3947261b5d46b9737f02dc5352c3a3a35c63c461fd75bcd8ae6619dfc0bfb54d", - "src/backend/linux_raw/mount/types.rs": "af364e3f054b0fa55562827944235055beb752716347645cd1775d1a4d5615c1", - "src/backend/linux_raw/net/addr.rs": "fbb6c071a8ebc2c557c7013d36d4b540c1ff6ed63103d0a8abcacd8977fbf5c8", - "src/backend/linux_raw/net/mod.rs": "904b2ccd4228ebcda25db0223b92fb03e4042bcc7b0a202f19410a8a5ff517a5", - "src/backend/linux_raw/net/msghdr.rs": "a88e8395dd5a25c103dc2172d4e7013e5104a6d70091ad78efd286ebc8284acf", - "src/backend/linux_raw/net/read_sockaddr.rs": "4ab5d470f03f19a928327603e1d55de8b9e21cbe4bfc6ed65d856803092b1c90", - "src/backend/linux_raw/net/send_recv.rs": "6d5d2aec61a3c1b4a5fef1a8a487dc8e163da8988d1237541ed008baa01128cc", - "src/backend/linux_raw/net/sockopt.rs": "2ea8625ecd68a799c14ed48dec2f3e01f085222b6cc36f4916b20143e08ae575", - "src/backend/linux_raw/net/syscalls.rs": "b231754af1c94f61d206839b45f51516e0210761bbbcc1ef68c1fe6fc8a1bbbb", - "src/backend/linux_raw/net/write_sockaddr.rs": "a9374256cb47b3f4d5fec308986a109ce51a521abab31590df1f66c04c07d437", - "src/backend/linux_raw/param/auxv.rs": "c6a74c0b41aa28c850a80aad7cbad677df65c1f3eb78415872f6f3d1166716f4", - "src/backend/linux_raw/param/init.rs": "a5024f9afe361884f22fb4d65e632ccd8a60f1138ff6bd526df600d40e0d9b7e", - "src/backend/linux_raw/param/libc_auxv.rs": "167621c0b1bfd06c91c1201e9404d6624aa0a702ade17c6e37d9370c636be589", - "src/backend/linux_raw/param/mod.rs": "2e6a1a1c00351b9c88bd615aa923f71d76208df5626dd9bea03067f28f81dc31", + "src/backend/linux_raw/mount/types.rs": "4241f270fc362834dd2cee3eb360e5b5d2bb0300eb07f0ca1bc81363e501c65c", + "src/backend/linux_raw/net/addr.rs": "fa6c4ea03ed465188bdb2113a9815549084b501c35654b46a00de226c7ea5463", + "src/backend/linux_raw/net/mod.rs": "bc9c9c4a8c06b1fb8c57555261176dfb1f3e858a1d89cd2f88e1f31fc126c001", + "src/backend/linux_raw/net/msghdr.rs": "3198339ccd00224aefdba74e9144818fe387222066a387a9dfd95fd8c48cf9d9", + "src/backend/linux_raw/net/read_sockaddr.rs": "24075ac4c05fab5fe44aae4445cdd12ec7e474f047150baa9b768741d6b9693d", + "src/backend/linux_raw/net/send_recv.rs": "aa5107094a1e5c6ce57bc2956d0ac63f24a7e61270f61ab2a353f9c832da0e4e", + "src/backend/linux_raw/net/syscalls.rs": "0adf890dd158f68d3906291af6bef547267190b9f6b08007998703ef833b16dc", + "src/backend/linux_raw/net/write_sockaddr.rs": "0eeeb7ec8dadf95503a2f89fdc933b8f9c7e45e03fdb343ce490b6cc8eec0f96", + "src/backend/linux_raw/param/auxv.rs": "671b06e0609b22b469dae2ee87fd1aa4f4b8ae793be12bb2a08e9499390db330", + "src/backend/linux_raw/param/libc_auxv.rs": "5d08094c1f3dab556235c905e373e5d1a3a3719e76b0d8a3a60d4608520a477e", + "src/backend/linux_raw/param/mod.rs": "db21fc1b0ea5568b8649890fa38a878bfcdcf7398f6cf1640176b37bcc6ce990", + "src/backend/linux_raw/param/mustang_auxv.rs": "9516dbdf84fc78ac7e747b0cd464cbf8d6f9e5b0b0325a0af47d0670cc391da0", "src/backend/linux_raw/pid/mod.rs": "2c6478857a0751625edabd61acb841819bfba1093b1faeded15693c805d84952", - "src/backend/linux_raw/pid/syscalls.rs": "eef6aa01830ddd510b83f507da2002c03e58318b73744be2c06ebbe33c4f194f", + "src/backend/linux_raw/pid/syscalls.rs": "ce3ca4c72096479340364d16f09918e192ffd3a0436a26eb61aad7e7dac3cdcd", "src/backend/linux_raw/pipe/mod.rs": "8aa966faf3853d1a93d0ed91f7e5f4a53539b0287b25a5bfe489fa1d07f7cfd7", - "src/backend/linux_raw/pipe/syscalls.rs": "366c730fc3e991bddb9f5a15b8c3917a8e6ace6d1d5a9113b2749e476faf6f83", - "src/backend/linux_raw/pipe/types.rs": "caee78eaf13af02e5c4024c7459f23287dfd2c544ebab1dc5f728106fafe24da", + "src/backend/linux_raw/pipe/syscalls.rs": "ec53a8b3ac23fc3fc2983615e34a210077947dbdf9b6a55477844fdae7e6b306", + "src/backend/linux_raw/pipe/types.rs": "73db762965df510bf3c908f906acf3a6df182d98d4ba1ebe45a52a4b51751e7e", "src/backend/linux_raw/prctl/mod.rs": "2c6478857a0751625edabd61acb841819bfba1093b1faeded15693c805d84952", - "src/backend/linux_raw/prctl/syscalls.rs": "a18b224307e0d27bda9b7b85c75cd6c7ddfe39f5ce52efb7bb0bf0585b757343", + "src/backend/linux_raw/prctl/syscalls.rs": "01aa9cd77341dcd1efab9f3ac28447d0fbc41ed44d65e52301b347fdd1627e50", "src/backend/linux_raw/process/cpu_set.rs": "dfdcbdf35aff6a3e08e7d38193bf18c12ca8aa64eb0dc417667be82dcc0f7c55", "src/backend/linux_raw/process/mod.rs": "fb393c70a9c63ef9a6bf1fb5a2dc94f07d6b0b6987cc5231c15c607015dafd68", - "src/backend/linux_raw/process/syscalls.rs": "a2e446ba4e09727d11fc3b3d4bb316a659399aad186c08aa5bba80e62741265a", - "src/backend/linux_raw/process/types.rs": "6811ba822bc12a1a6336649151b4adb1f5d3365684a31c07f01953ea9547743d", + "src/backend/linux_raw/process/syscalls.rs": "06313394d332fe385ce2053ae2980cb939665c1d091867d131adf18bd9e7a5dc", + "src/backend/linux_raw/process/types.rs": "d66049cfbdb27e31586f0ff2e53b6adbe0ebb296a876372e9d0d805d10ac5f51", "src/backend/linux_raw/process/wait.rs": "921aee4b0048746087f52615a98edc2aa0fb4b53d6df44be4533098df55d1b05", "src/backend/linux_raw/pty/mod.rs": "2c6478857a0751625edabd61acb841819bfba1093b1faeded15693c805d84952", - "src/backend/linux_raw/pty/syscalls.rs": "ae09c4aecc0ae87b1ca58d82efc58007b9dddaae78460d615f48da19d1cd0f89", + "src/backend/linux_raw/pty/syscalls.rs": "8e0c6bb4a488440b39e5df9aa343bdffa6b28a0213246bc699f8b9676a170fa5", "src/backend/linux_raw/rand/mod.rs": "8aa966faf3853d1a93d0ed91f7e5f4a53539b0287b25a5bfe489fa1d07f7cfd7", - "src/backend/linux_raw/rand/syscalls.rs": "a84f70251672e92f253838bf05e989434f67373233e88d21d8835cbb792b1fe3", - "src/backend/linux_raw/rand/types.rs": "a21dbb1ab31eed6b59a57520be5a3c603c36d18ea74e67f7527f40835ba209a3", - "src/backend/linux_raw/reg.rs": "def5f88730bd625b2298c86559b5a378fce4bf6ce225204740ba087e034abce6", + "src/backend/linux_raw/rand/syscalls.rs": "fb401466368de62ec4ff76bc230f9246623b003fe7452912e1365f443d3eeeb3", + "src/backend/linux_raw/rand/types.rs": "787a59629343688cac0fdabd1b7552b400b9188073a1e0394eacc6e0997e1bfe", + "src/backend/linux_raw/reg.rs": "39b6234971122d247054bda8c2dc3b44493be30482635baa9e2fcbe048e78cbd", "src/backend/linux_raw/runtime/mod.rs": "b2cae8cce3822c3c92942f06ea0b68464040dcac33c6f0f7ee392c6269993347", - "src/backend/linux_raw/runtime/syscalls.rs": "90849c8e429f215c225d430e7f550b5da0bb96054ef01745d3184f6c890ba8cf", - "src/backend/linux_raw/runtime/tls.rs": "6316060560a112c2e9cd9807cdba6e8c91414113a04a739160929ae9a67bba1f", - "src/backend/linux_raw/shm/mod.rs": "8aa966faf3853d1a93d0ed91f7e5f4a53539b0287b25a5bfe489fa1d07f7cfd7", - "src/backend/linux_raw/shm/syscalls.rs": "3ebf91610b02de0312e1f0f0cc5d56e12b4d93794540087b3182cbdf3cb9c8db", - "src/backend/linux_raw/shm/types.rs": "b831b474aba7eb97167c9289f5257776a72b39134b44e67a0ecfcef2394dcd47", + "src/backend/linux_raw/runtime/syscalls.rs": "21497bfe3d0f82de278f07bf53a11a04ffaa595b4ff1af92627940ff2029b8fc", + "src/backend/linux_raw/runtime/tls.rs": "2b8fc61a33ca9b47f854afbb8e3f8b20f9f9416b8884aefe46388c8173c8ae47", "src/backend/linux_raw/system/mod.rs": "8aa966faf3853d1a93d0ed91f7e5f4a53539b0287b25a5bfe489fa1d07f7cfd7", - "src/backend/linux_raw/system/syscalls.rs": "2af6c2672a6528b404b52f501d9803a63e9f47886d3b5d2d2dc5a71cefa7327a", + "src/backend/linux_raw/system/syscalls.rs": "a9bec6662f122b1ec310d417bd9ddc16df13b50de6526d2170aa4d72292c2b14", "src/backend/linux_raw/system/types.rs": "1ceab8d738a71043473b26e97fa3fd79d588a86d4774cbc9b9e1d4f1447a016e", "src/backend/linux_raw/termios/mod.rs": "2c6478857a0751625edabd61acb841819bfba1093b1faeded15693c805d84952", - "src/backend/linux_raw/termios/syscalls.rs": "151f03b938aec36a38fbf4e4b507ddc84d0999a246ee48abd5893464daa736a8", - "src/backend/linux_raw/thread/futex.rs": "0aa0f9f5be6a79de81e82c9f11f1bf8831f682a4b2f6cb29669e1591636f084e", - "src/backend/linux_raw/thread/mod.rs": "6ad4a4b90b9234e79900b27ebbe8837e3a7a36aec532912e3e253edce5225067", - "src/backend/linux_raw/thread/syscalls.rs": "0e3dca63be7322e1e9c58456b28eb8548abb9f08b4436b87b139e891c01c446d", + "src/backend/linux_raw/termios/syscalls.rs": "fdbc96360beabd3adf6ee208a5f236d4b729f11ec7546c906afc0d1fc6ff2505", + "src/backend/linux_raw/thread/futex.rs": "3a130db9f6176dc95fdc14ce61a6bcdcc2c28e82a29ddae3e05f347a189fdd14", + "src/backend/linux_raw/thread/mod.rs": "f7132a68c9db1b4a796781b9e8d0ac268a1ddb713e510bfd43425564ec9b39c4", + "src/backend/linux_raw/thread/syscalls.rs": "5845d1c0a3548f87a114493c345e18dc32875bd7d35a6abcf1241ced9b024c09", "src/backend/linux_raw/time/mod.rs": "672724f55b7b7be6a7452bb1cc2d28b5f0aaa840a2856fe363acce624e1beefc", - "src/backend/linux_raw/time/syscalls.rs": "451da0bbb66accdf58ee7f2f8746a93b22ee985907a08717a3d3b1650457d878", - "src/backend/linux_raw/time/types.rs": "028d2993df8fffe5581f7082b8849381bb21928930dc93e4a536a9c7a316c71d", + "src/backend/linux_raw/time/syscalls.rs": "a7870ef9daaf3fb2ac50f853df6dbcd935a3b2d70e720b80184208f602a918e6", + "src/backend/linux_raw/time/types.rs": "f2b5de6ea0f8b8a886f7b145a0da4ab47520fa81b235377a28a0c6a530083a9a", "src/backend/linux_raw/ugid/mod.rs": "2c6478857a0751625edabd61acb841819bfba1093b1faeded15693c805d84952", - "src/backend/linux_raw/ugid/syscalls.rs": "8c86d251db33b399a1d1cbb8e87afe650b78db84f444d3251309b7a0480b54f7", - "src/backend/linux_raw/vdso.rs": "056314f72c71d4b041739337ca2098afb7fe070f844327f462c293f43481b75b", - "src/backend/linux_raw/vdso_wrappers.rs": "3bec7ee7daacc93b26c15e829e3ecdea62f9fc62244841ec80ee47a55806a69e", - "src/bitcast.rs": "e21c87c292c781b27256c6f5dcf9fd52dd69ed6e21016cbd67ac31a8219ebf8e", - "src/check_types.rs": "e52f710e1cfc12ca13a495f2b43c227b293ff295e1ce3ab332935b28a7579872", - "src/clockid.rs": "e41172c87401ef7b8ad37ec09b5b690c55c51b37009414a2089b34dcac9d93a9", - "src/cstr.rs": "41af2a4429fe6c67a8883f8a8f63d66c90df566abda74fd2b03bcef7b9f24218", + "src/backend/linux_raw/ugid/syscalls.rs": "844b2bed42b9a3c06845dbae1d020bbab5757d23ea3ad7a440e3cd87ff993f72", + "src/backend/linux_raw/vdso.rs": "e454ecefafa95cf7a356204cd42bcf83ca78d89a513d405cc14aa43a4fd52a1d", + "src/backend/linux_raw/vdso_wrappers.rs": "60bbde4bed863e067e7c6804b03f2620d06d7459fb3cd1560d4ab1a0cd99df69", + "src/bitcast.rs": "fe6bdc7fc31fa3b360c44a841c9a0f143629172729c6aaeae76841c74c122ff3", + "src/check_types.rs": "bc31f9b293bfbf272284ed4d0da24e941206a1ac3f18d3abb0b1a61f1ede1dae", + "src/clockid.rs": "1d2e1cfcf23160b55d6b046d235edf2eb2408f072a8bdef3e3a3871885abdd5a", + "src/cstr.rs": "9e3fcd57d6af382a9a4f24b97a29eeb05a3ccd5c8fefd666884f6e4438b3c4a3", "src/event/eventfd.rs": "81cbd08f7bdf40a6ce1ca692b63da1dc8ba925282990668d9d68f1203e839fa1", - "src/event/kqueue.rs": "222842df22e66f41d93dacd3cba933810d9313d5ca9959fddabedda9c4312bf2", - "src/event/mod.rs": "326a7ddfeb33bb95dd31391d65f400fa622e5d0ab827c096cab16af4b6843b51", + "src/event/kqueue.rs": "13d9ac0181bba0588ca6196deeae36d061e915cfd9e0da86318368845ec63e07", + "src/event/mod.rs": "7f4f01e43444c5a1f97af5955fab7e0e1ba20e0f53adc86aecbd501d2db4a745", "src/event/poll.rs": "0ee583dbd457a573a82a06c04a2a24bd2c76e751d27a435507d55338e2871327", - "src/event/port.rs": "4e51ff150e5d17cbd44aa64a38b99c15e26eaaf2e350768b5dcacdfde4fa5212", - "src/ffi.rs": "c2b8b38c02d72749aceb715c496726caba1f1fa989ad3856d0103a2fafed89ed", - "src/fs/abs.rs": "10e1a148a5b05476efbb591dcc969c1a6caf3d2d9592741eef22341a97c8f4a3", - "src/fs/at.rs": "a12f382f7b544ae4bbb7a967de43178dad796e05fd6eb8136e1a34236b48f9dc", - "src/fs/constants.rs": "23923e0fce3221bdac371fe2d05028f30a87dba4f9b4a573b69dc2d6d39320b2", + "src/event/port.rs": "a72f6facaa0dfd93ba66f813586c4f7287dce4d803480224fd78234a834f6c7c", + "src/ffi.rs": "0c6b9a6f20ffb31a827412c0381c6fff09e68265f29d94c5470940e22c5334a2", + "src/fs/abs.rs": "57406bc03c5e1959c4a859a7b0e70bbdb220dec40c8457ad505d8330bfd05633", + "src/fs/at.rs": "edf36efffd2c1751fb176ecfdec41a6d1c2f1e80b305af67bb8d9fcd98c1029d", + "src/fs/constants.rs": "24076a01f8bfc126b0905e9bc0521d2c3a3abc6c3b8c86ddb1e545070d097127", "src/fs/copy_file_range.rs": "d3b644374390d482b2ff749a2459458872b57d0dcf9670368739b7833509a7c2", "src/fs/cwd.rs": "9f429a79ace6e17455634da09216ee0ad3d067a4541518b3193ae6a8d9ff1e26", "src/fs/dir.rs": "347a52f4ca9ac6321c52e802e97ec90d1b4c62ec955c8996fc17f8f5aed69966", - "src/fs/fadvise.rs": "1220e2cf5cf58fc7cc950d48738050a052c504f745ca67130daa6410e248230a", - "src/fs/fcntl.rs": "1d1ee1e0bc962779e1cc1b8b76f39c820746240557daa9e14b47b1799120dc39", + "src/fs/fadvise.rs": "beef66ebe1310fb92628240b2cde68f744c78e50f6ff61bb1404bd4868d9cae8", + "src/fs/fcntl.rs": "2085102d05d0ba963e100ab3e3f19dac4ff27d142fbf798626d20a2a596ba96d", "src/fs/fcntl_apple.rs": "e2f23f038083621bcdecc98d02ce1023508afaecdb2ed0fba5c8b70f955301e5", - "src/fs/fcopyfile.rs": "ce565f61e1fbf2e31086077c2f1d01b6bb3b048915edda87fe9a4a4f5e8ff7e4", - "src/fs/fd.rs": "fe53f211e91352d522ac4f3b553a9366506458e2158295a93c5e746618f7a5fe", + "src/fs/fcopyfile.rs": "ec95929cbbe02cf49233a785e5238931bb107b7903cc5bc95e4231de960995f2", + "src/fs/fd.rs": "6b64b27b4727e00ae1a44cf04f9627326679ecc2d7ea274195e1204aa60c2d50", + "src/fs/file_type.rs": "fefd865f91011f66126213b0994773d99e373b468c31e866002228c98c64ad85", "src/fs/getpath.rs": "28f6970fc1bbc37bb35c84724b59eac436ea7407a4522e18c2bdacb1fdd2edd9", "src/fs/id.rs": "1b5c8a8baf9a9bb1f895f97189cea4e5982a0d35b192afeec6340a6c6222e0cb", - "src/fs/ioctl.rs": "e798eb41bbc201c375bc295ad2928c2467b45b4fbbff3c82236dccbc0d6391a5", + "src/fs/ioctl.rs": "1b222e725402d775813877b73f40f8ac2b513439485d326fbd49e3f4ebedce3b", "src/fs/makedev.rs": "85520b484cb7c15ab71ea1c368578ea3b7e484d82f8510db92b6ce9f7ca341ae", - "src/fs/memfd_create.rs": "00df492a3afdfc65a07d6849422596bf6cd4608a653d5d25ba54d6640eacda11", - "src/fs/mod.rs": "2192ea7f6f81a18d892d3526df00c43d83669f1a1734957ba94cf8269980792e", - "src/fs/mount.rs": "8f6ea2b997dd83c50c90291b9ada3ed77a9ce1ad701c9b0d533b5113b317be5b", + "src/fs/memfd_create.rs": "15a8f28e040cffd8c24c7903483440f88853b2e538ad48d80f3c00b4b2befdea", + "src/fs/mod.rs": "8a3ab65aa3fa9a66ea55ef1ec3db72cab938b2b0deb4e079dd6efd737f91d480", + "src/fs/mount.rs": "c96cacbe65aff4c43fc2f5be03baf2b523bda151ade1828b691de1d040d3b2e6", "src/fs/openat2.rs": "4a95c15dab533a41201b5fa25c8a212956b7571d58cad696bdaf45af8aef96db", - "src/fs/raw_dir.rs": "18ad797876d6230c38d4cacbed081c4028e03ace477d0520d9b226b40de942f0", + "src/fs/raw_dir.rs": "8cb30e31905f90c09c147f828dd9975da3ea1aab6e410642e04d206a8860b302", "src/fs/seek_from.rs": "a9efa0feb9ac789cf47667e91efee2e3f2dcde16cb3b7a928c99da640fa0e0d6", "src/fs/sendfile.rs": "e3b2058741cf4b1698f34d84bb37130cf2b72806d522a16fe541e832cde136cb", - "src/fs/statx.rs": "f925be3d9a179a903549b3ac18038d004f4f2021e46dad4aa2757907aebefeca", + "src/fs/statx.rs": "239d447477f8ac368c8ddf9975c71509c47881f647f59cd941ac07954d8a77f9", "src/fs/sync.rs": "a3b23543834281f347b0f873bd38154d31d404871188ac08f2b20b9196234cfd", - "src/fs/xattr.rs": "5e222adb52caf69d949ab3f944fb2a482dd6ca3a47200532ca6e72d44cbe8334", + "src/fs/xattr.rs": "1d4d7f144716ac8fcae6b728ea23d27db8d3d1d7d2ec3dc31a1dea8e9d6a7eff", "src/io/close.rs": "0aa3cd05a8fed8e5244f97b8b6c2e7f65ed93a4e5435c6329852bb3da7514440", - "src/io/dup.rs": "bbebf4633120e21c7c49ecb93576cffa7e908f8089deb260f8d97426b469a0d4", - "src/io/errno.rs": "58a4d20ba0924e4d514e3c876fbe08982f1623187642ae14780815e65989c8c8", - "src/io/fcntl.rs": "5b7696e40757615940745ecc7f33d84678d24f55eba978a8efdd0805cba7b1c1", - "src/io/ioctl.rs": "3dffbda413fd380f1580e2e75c531a5f4a0487417ea1c235c23fe46b70e46bd9", + "src/io/dup.rs": "a8a59c5d345dc54c57ded890720c33eb78c4d53917c71e8bb6317f7ed122cb87", + "src/io/errno.rs": "777976d6f0e73cc7d7f2a94954e5900683cfcea330664b7192ed5db3ebbd493e", + "src/io/fcntl.rs": "c0f7bd7fce1119b0c1d0085b7ab77d5df02470ae3e06035428a2452dacbec296", + "src/io/ioctl.rs": "69d85054f32523c9b88b9bbee536d3299cfddba0e08f608d950e8a7cc4464e07", "src/io/is_read_write.rs": "1bfb9ee5d58e0b29b44af12fe2668c7bccc841358698dcde47f1519ff9bb73b4", "src/io/mod.rs": "75f1d0646be1d4c7c08b5887d8119b0103be8c25c43ccd4e0e97015508c0bb8f", - "src/io/read_write.rs": "77b8058769dc0bf5a88d73acd7ce70af1a89c549b00b790e281dc20364bcb6af", - "src/io_uring.rs": "4e641c9aaeba14890e4a354ad8b1fda8fe617923b4d3d685da22721d66a14bdf", - "src/ioctl/bsd.rs": "e33772530b1b2d1e7d61ce53d9267e68d88f7f5df13301f90412d89a46c6faaa", - "src/ioctl/linux.rs": "96df90bbc926783f387e8fe1656841d4c7a857fd4e9f41f95492f7dcece33074", - "src/ioctl/mod.rs": "d2233ba2a81738828d28d4297f8dafaf254c475174de48bd0fe3891d29a71bfe", - "src/ioctl/patterns.rs": "af24c47597e619a8e0fd3ca071f21db1963a629b511d9279ef9d36a8030a6fe8", - "src/lib.rs": "ee2b60b7b29c9f4e0f474534a76961c2ce5c9f3640eea67fa395e633b64efa6e", + "src/io/read_write.rs": "54ba528b11601af1338bb0c71a41b256a0033076d30b3946c3fd0bdfa61dd021", + "src/io_uring.rs": "c007f7033c5eb19e166f51bd8e35091f6a1779917284e69c28c8f20a34a18bf9", + "src/lib.rs": "662e3cb93e0b82ac01f95be39f93eba6fb585e4882308c4b00234d143634b5c1", "src/maybe_polyfill/no_std/io/mod.rs": "77889bb5c5a4f2e50e38379cdaa5d0fef4b0cafc3da056735df01f6deae75747", "src/maybe_polyfill/no_std/mod.rs": "ec94a4aab4bc475785e469d10fd6bc95667e1d47d958e9cff3a19049d88c8c80", "src/maybe_polyfill/no_std/net/ip_addr.rs": "046327ee244f758f2bc31d3be305d8cd0dfd8342aac1add8259e999b4b46c4a7", - "src/maybe_polyfill/no_std/net/mod.rs": "486555be5c56cf3e049e65a1ea73aa60839c6f6ca667833e88ee4f360f9606dd", + "src/maybe_polyfill/no_std/net/mod.rs": "b0ee611c454679226a15bf647e7779995f3fe9c8e0507930a0d0613eb414b7c2", "src/maybe_polyfill/no_std/net/socket_addr.rs": "bfeb32d32c176cde76323abcffebfc47e9898fb8d7ce3668c602dc8451086a2d", - "src/maybe_polyfill/no_std/os/fd/mod.rs": "27ef0afbcb0695cbb15101070f417eb51e0ef85ae66ec967d95e80771d507c47", - "src/maybe_polyfill/no_std/os/fd/owned.rs": "ab86ffa2693a04f3085770faf395f95e5303001711be8b19c44a47a0ac574091", - "src/maybe_polyfill/no_std/os/fd/raw.rs": "f3648c7bd4a6ff94bd823ed9e0d99d398e02f24875cf9b25962736999e7c6943", + "src/maybe_polyfill/no_std/os/fd/mod.rs": "d9dfe2a2c25be727847bcdfe6f4898685af2521850298178ca8d46a8e2ceee88", + "src/maybe_polyfill/no_std/os/fd/owned.rs": "4ce3234f8ab2cc8a7b749531336f4f6b6297eff0e20a01190be2c10409a0c066", + "src/maybe_polyfill/no_std/os/fd/raw.rs": "9cedb353580b932879ddc4dee9936212fefb6d42530dc5cec519a0779d5dee33", "src/maybe_polyfill/no_std/os/mod.rs": "27dab639a765827644005d5f2fcc7c825310606b889cc8dd83f54c9528350dc0", "src/maybe_polyfill/no_std/os/windows/io/mod.rs": "5bbcc05c83fee5026dd744a994e0458469466d5be39081baa62df07753b92fd2", "src/maybe_polyfill/no_std/os/windows/io/raw.rs": "4c32609a489dd938a49328b5637cb3bafb96437f2f9f269ab66d7d3cb90247f6", "src/maybe_polyfill/no_std/os/windows/io/socket.rs": "c658f42f24eff44a661f2adfd24a11af80fe9897f3e2af4dc5d2c64808308d65", "src/maybe_polyfill/no_std/os/windows/mod.rs": "fdb416f8f231a4e778b5f985b9ae712ece5e1a1402963ad1a5f6a8b9843795f4", "src/maybe_polyfill/std/mod.rs": "7c16c86cc73e226e65ead598e4018238b22000a345040b706bf1e1b3eba115fc", - "src/mm/madvise.rs": "69481cd3354dbffe6cd93b234448e59de6d0fe6440bcf8b12f951f37745bc1dc", - "src/mm/mmap.rs": "8cd1a8278e138d0805726474bb3016fdaa09a8074bbc8f20d1e842e7fc17efa3", + "src/mm/madvise.rs": "3c262b3713a73fafcedf1b04bb12c048bb11d47ca43c959e5dfa48c27651f4f0", + "src/mm/mmap.rs": "fc32e308a24c6f351d74306943d67a68093a0b6555b4bdf6cd755bf43795f406", "src/mm/mod.rs": "b3a6cb838986d45825b912355cedead761211a494ca6f89b2367a2d2157e340e", - "src/mm/msync.rs": "a9092be024ecbfa9c14edb935404513498b0da2ac6c99fc31fe4e58196a95f02", + "src/mm/msync.rs": "9dcfe5f54235e9314a595edb8d548ac79d222bbcc58bb3263cf7e96d603b23ad", "src/mm/userfaultfd.rs": "8073443bd181ff0b3ba4d0b1ae67370b4864035a0c8b4898cd709dc47c518ae7", "src/mount/fsopen.rs": "160e384e9175fd98669cda1cf3590bb195c2ba7e1c724e9ea06e692595e58ba1", "src/mount/mod.rs": "5f0c9df4727592695deb1cd63ae1de021b03dcd9d0d1b68e1f34d12a7136cb19", "src/mount/mount_unmount.rs": "8ad11675e5d762d33fbefbed06a6a9f9e52a9b689bd06662446152614321ab77", "src/mount/types.rs": "601ae3e10b7dc496fed7f3b40a80e81c6edd7bf13189d7be45c3212d4c684c39", "src/net/mod.rs": "a6bc55f9e086caf46a7c00783498d73a328a66f2a991f1ec65d5f13931377b0f", - "src/net/send_recv/mod.rs": "7b77a70c0ad2601b5da30e8b202e34c6bfc9e10df4ce2b1a35b111522ae123a3", - "src/net/send_recv/msg.rs": "f100a88648b9eba88272aca77d76351432636022a1d4b0e9485e002a3489d05a", - "src/net/socket.rs": "1296706d964d110be7cd46b61a0a06dabf382a2377907ba41badfe94807cb50f", - "src/net/socket_addr_any.rs": "a9af81e967a91b45e51aec4f46a068fade7035c5d19dfaf05bfdcd3b3c32e9bf", + "src/net/send_recv/mod.rs": "f33e39c7b228cd8109823b0a0a1aa397cddad504d49e69b36f74c5b84e5070e5", + "src/net/send_recv/msg.rs": "19caae23209c8de1939687055c230d832a3e45c1dc92cc4fc785edcd7789e849", + "src/net/socket.rs": "6bb087ab208a1e06d535fa11e2aa4a9f96da6e73b697fca93e2a3c89178c4434", + "src/net/socket_addr_any.rs": "d07f9e9ef8873aa5bfd85f669952299286ef6f2cc5b9fea383856432e61b850f", "src/net/socketpair.rs": "56f4885c31d2664cd16e18a9a88792a4912fedd953cec36dba67e8581fd57921", - "src/net/sockopt.rs": "4f00ff76d3cd3fd2e915f51eba59827fb60885d6b0c6d37b32ca4306cb8fe836", - "src/net/types.rs": "35878a8ff12cd7252ed735cb640bad03e4e13c6016769c2d154c0fab08505248", + "src/net/sockopt.rs": "e469ee66afb9b62fc1f55faec589c42b823eee27654b692e8efb83e7e59c9249", + "src/net/types.rs": "f612ab7d062675a5a6f3f3da36bf794567bb40a28caa421fb09b1b8ba91e3822", "src/net/wsa.rs": "6e546b42f50a851fc833c57cda76cfb347203ed4b0dea574a3d325bf5a2ebf80", - "src/param/auxv.rs": "8602af47a39bb340d319807bdecdb9be8b467101a9ed96061277b90234801913", - "src/param/init.rs": "a31c0e5cea61a1a999767fe74f87c0d59eeb6bce66578b842fe0e0c32be27a55", - "src/param/mod.rs": "25b10acd5b1da8faa6f5204e6b0379b38bfab667916e886cca64bea01a42dec2", - "src/path/arg.rs": "d87117157ec21f61a5e50b2779b4284fd13dd7db11b20a6bc9e475d0e4a25357", - "src/path/dec_int.rs": "8ff8e14442c46f8e7a9b80d73973619b4271549b9defd538479bf8c2d93aa72e", + "src/param/auxv.rs": "988872f9bec2e12f35765ae8963cbb9535d4acaedd4c9a4d07ced6feb70e0aaa", + "src/param/init.rs": "671d8974f0d9b82e79076d1f4deabe0273a874a329f74b8aad26e07b86791ba3", + "src/param/mod.rs": "53ee190cf5266a2e057af9412acc50359369470a04dbfe2e6e92a90de15aff57", + "src/path/arg.rs": "dfcb3004b7bc5681b2eeadfe364d8d3a0cea89f85700762ad4433af9c0e744ab", + "src/path/dec_int.rs": "fad9793b89eac526953b994cbed6b614f01c25108f9763e19fb98029feda93a4", "src/path/mod.rs": "6b1b949c94bcc47e0f08a3f8e8db5b61ff497d0dfd3e0655f51c01d3e4b7dfd6", - "src/pid.rs": "f1c486000c5b1311b2d720cee88f089c17ef9a171709673dd06e6f35f4ff98a3", - "src/pipe.rs": "cec0a831237ab2652556b149767d1b382e9739a1bb21ea401a35b36df7f7a3e7", - "src/prctl.rs": "19aa584895874ea48b9bbe1bf695b81257b0281df64dfdd91e1b4bfa298661b7", - "src/process/chdir.rs": "911216459aa429fe9f125f1357d6900b43b0007835b85c719875d00f79a74664", + "src/pid.rs": "26bddad73b279de3e496d2ae8d3304e652a0072da82558f688a702c8b05e5c95", + "src/pipe.rs": "5cc39da9298b32019276b7fe1a5a8b80d813a430b0add4d12d02083307c9f103", + "src/prctl.rs": "a1c85a401538d614f5539871f9a03f9a345b24cfbc845e953deb9f8b96986e2a", + "src/process/chdir.rs": "9d0397bc91bad5bf1c0afec5b3e6dd9cb7de6e54c3d0b760b33a4996a4cb1b25", "src/process/chroot.rs": "2b5f6124eb19f26ad2705174f7ad50cdc0a5d15abd59ffcf55421228d82130b4", - "src/process/exit.rs": "48de66e5504a00cb375d8f415ce63b6225a3f5204268d40726a7d0fbba43f587", - "src/process/id.rs": "e4733f9e8e4b5f50e98ef7a23802e126f1f14ece8b3d7ae7446c6a66affc6bc1", - "src/process/ioctl.rs": "23ad0285671e8d7ca71a63c50655dbf732ccea8af11d754a0558e0236db37e76", - "src/process/kill.rs": "96d5ce432c19cf2b600d5248c681c117abf53ae94bbfca7e75ac533a40e3968e", - "src/process/membarrier.rs": "1c4c39b359d1d0e9bbe16352eedfca9278d9ef298ade8ec00e998617bbcbfed8", - "src/process/mod.rs": "70e7fc79e4edf3ffd56c20643707cafdc595330db68e4ff8f75dcb3756ad5b1d", - "src/process/pidfd.rs": "39de2dc7919eeeb53a5980622616140327671cd7e36bcf597aee1749df3a5b5b", - "src/process/pidfd_getfd.rs": "1faace75bdbcda57a296806dcfa5487811f8d11dad9e6199c98df72feae66724", - "src/process/prctl.rs": "0130d05362a17a9282f3391189095e1f4f51fb56d7a5205906a0011842df4576", + "src/process/exit.rs": "98d55e9a419737cd88327d8eb484b892e2a12706e5dd05e5e43552af8b6a806a", + "src/process/id.rs": "402475cba98cc7e724943bfd218862f76c08b8d200a7b38bb5067bba2a837ef1", + "src/process/ioctl.rs": "6b9527094ad3617057e95268d515bce032656642e7ee55fcc686e4a9cbf01499", + "src/process/kill.rs": "7b879e5cff8a064acd0e7488f4e21bd4e4a8506ce380688b72cc48d283ff9c89", + "src/process/membarrier.rs": "83c152d9e9e34e94a1eb48fbcdfc0cc7ced553759611b6354cb6890ec24c6924", + "src/process/mod.rs": "21e5e4f55e81c447d76970442473678f6345d12a61b3227caf09460cfb82e0e4", + "src/process/pidfd.rs": "ffb343f317e481dfcb74d6158a186635196792b176f7ba59c6fa60448b7942a5", + "src/process/pidfd_getfd.rs": "1b46d1e7b9522932497e94f697c2e8cb0796e44c82c7b95804445ffde72a4003", + "src/process/prctl.rs": "47d8078fdb08ce93616122dac26f39ea4085ff76aa0e58b06393c34b1ce6de55", "src/process/priority.rs": "f135482e71ea8aa0daf92b9f238051178a4c904070fa8409622f94155df3c544", - "src/process/procctl.rs": "430ec397782772d5a028903c2813d3e11f7e577af144b9effd9c42629ac8d3d2", + "src/process/procctl.rs": "7668f8302515316cc70addfe8da4af47ea8872d4acacd72d1c87c0ecb627e8e9", "src/process/rlimit.rs": "10b79de3ced0e64059a94c879742d46a35a6176c776d8eed75031d5e6340283d", - "src/process/sched.rs": "b49ef463f44b5e90a04e9a08569d0ae20eecb8667f38f31c786df1eb099db466", + "src/process/sched.rs": "7c3bfc5be624e7d7f5e043c3ee0b0566fcab3d684d61c272e7b4233410ab1c42", "src/process/sched_yield.rs": "6565faa3928b66ddc74a65e893e15edfa4b9be4f7e5f5f68527501a7f6bc3350", "src/process/umask.rs": "1a0f31a842303c978e3f05ec191e2b5e96104c09c6596473b42b1fac34898a50", - "src/process/wait.rs": "612920489b5618bf82a9a615947e0acbed6eb310acbb9bb70e934d457dd1dd49", - "src/procfs.rs": "63b286dd3302be7f426841eb3b9261ef4785c3159ed78c24734bd5094c9b0b2e", - "src/pty.rs": "652c412e7280d0344b3f9bfe376c106a7f1b42b898b7af344e6e72da268e2bf0", - "src/rand/getrandom.rs": "1c8166a02a74f5593bb4673ef907524df04cbc1568020a5ab2ff7f4aa1283f8b", + "src/process/wait.rs": "5bceb8b2d6144aadc203ed3d7dd24536e0ad4bbef45c3fb9369559dd9284693d", + "src/procfs.rs": "e0329add710a5d005dccd1855b20bc3474f6d2069c3eb0d86b8087c64687e7da", + "src/pty.rs": "602c58dcfa248a5e7f9389851a52f99dfb0e115fc9a70f732d69b0a1d127fae5", + "src/rand/getrandom.rs": "15255b5c5f76cf61ac4fac8b7ac6621049f2b5d2549ec319cdd69ab1ae4d07d2", "src/rand/mod.rs": "cab59332aadd9b679f5b22cbb222d48ee028af5eb9fd4a4d43922da659b895d7", - "src/runtime.rs": "695e60b9cc22755ce0e653fd63a0c73024a14eb8f576c6071dad6806c32f5552", - "src/shm.rs": "b96fe8a05ee5d4536464a8843a776d43a938abaf22c772fc35b5373d95644a8d", - "src/signal.rs": "a294b49d487dafaa42e534f8b1d93e87bec135087676b2ba2ef865cf2fccdaf2", - "src/static_assertions.rs": "504cf66f0d5b8e335be02f9ae8b0a355abc98c2c82eec0098bdf0988e662e260", + "src/runtime.rs": "952cea05413e3ba1fa4fdc4755bf1d0fc0c21a5c8878f2cccc6a533119c193f8", + "src/signal.rs": "c071b4f011deef19a679d7a832d5408a3cd68627161d6510008d6312266a2611", + "src/static_assertions.rs": "39986672f489949be1d6469f0c30fb7d2eaa21bdaa2702a8c150b2b150bf5535", "src/stdio.rs": "a5de2d7d9c3c5a901f88b6acf4754687c958a2f3a93c7945c2b8fcb948d468af", - "src/system.rs": "4d7d1eff18094ec85a8ead70a7ccbe8ef78fd7f5705b7dfe3fa52541e9494887", - "src/termios/ioctl.rs": "a1ac967f7811a482f8bb53847c37c8359f518cd26da9df7b816ba678a0139623", + "src/system.rs": "853b3ddaa10b90226f6d9a0ef7890739ce2fbd150c362c912df6afd19664253c", + "src/termios/ioctl.rs": "fd1db1ee473e884eedc5858e7697d4a00b6ed7d878af85abdb76771225bd2e48", "src/termios/mod.rs": "b44b7caa60b6f458657ed58a0e0eca41bb4e6d6be4b0f042bbb8ab7056cebe4b", "src/termios/tc.rs": "e41312d15464b83b2457c2502fc3f3b9998cfb02ba68739026dd4285cc7130ac", - "src/termios/tty.rs": "35a5fc2d26501e0e6dde1a755eeccf7b4f3b4702c5bac30e0953220808ef7034", - "src/termios/types.rs": "38167a38fb83e84f2845f86b373ecaaa3ebf6c2f91dccd07c10539201d6f5070", - "src/thread/clock.rs": "f49eb7271eb3e6831d9b0c3a01bfddbe4bd69dee237bbaa059884de452b29e79", - "src/thread/futex.rs": "985f9a0dce1e2a4892ae7f26bd1bf119ceae3f9fa6b4707e166624fc1cee76d4", - "src/thread/id.rs": "ad72db4fea9fccb728310bbfd01ef8c00f6cc60fa2a750f6349646a134f7009b", - "src/thread/libcap.rs": "4c51b7df566d38dd0f85f81ef53279a745a39f0f4e1154791fd38438e2ca7db1", - "src/thread/mod.rs": "98634ece0b882f123ad887017692f2a4d94a23a1dec278ed660b3497cac5cceb", - "src/thread/prctl.rs": "6caec7eb4fe122e80ba1ecafc56b710c79ab8b3c97529d5beba74d87af356875", - "src/thread/setns.rs": "ea9142b1f3a5b3f329683be185f960c50e5c1636149e91fbf59e88a897fc607d", + "src/termios/tty.rs": "a3ebab3b73db76fb5594be1bb4ec888a28a63637f8cd0211fdb1b3b645cc2ca2", + "src/termios/types.rs": "c30ab7e4e32ffe896b75eda882c7672b5d8b36d9d87f3a1e4bf31f213a43d0e2", + "src/thread/clock.rs": "469326c822dfb63405ee8537552cedde0b344978280e6645bbadd47dedc71e18", + "src/thread/futex.rs": "4e78c84589b535ca9ca633633696ef212393a98f2890b181acaa8f908fbc5ae2", + "src/thread/id.rs": "f25a6dbcff0e0e7a429ce5e8406afcba3b74f10ad3065c015f8e728fd6880e53", + "src/thread/libcap.rs": "ee1f320d860a3decbec8052897d9e9484591e4b0b64b3b5b419f4d43d144422e", + "src/thread/mod.rs": "6fc33eb022c4ab7f950dfb4fae6ab70b1acbcdbeacd909ae1848e7e54076c310", + "src/thread/prctl.rs": "b1ad06ccca02a3b4311b8ccc935c2e828d413947521d2b1ba9adaec5017959dd", + "src/thread/setns.rs": "ba37cbedcd5b6ef1e09422fbb8caa9fd94e25ebf6930fc7ccc778944cd078cb3", "src/time/clock.rs": "e59a29f1bed8c31c3d5b6fad60f2d4fa6cab8dd8e86148bb3693a5e3a1ce735f", "src/time/mod.rs": "43afee938c80d124d04d4ba190c03f4d21d1e3bfc154fff309211e4f6eabe940", "src/time/timerfd.rs": "f17092b84553741aa2d2b44c6992b5d2c8c96cc2c2007fc9a2c6b2064485e53f", - "src/timespec.rs": "32a4d930cbc0f6dbd23153290db920671cf4ce65a4a127e176f897c1cde42d7d", + "src/timespec.rs": "79c7af1bfb12b56fd482b778dd783d82c6f3233b26bb11ae3dceb454036b1da7", "src/ugid.rs": "6616c6e35b7e43aee5b150f1efae7a50711e0947943c9a96833dbe214ad9e85f", "src/utils.rs": "9ae76f8a41d6cc350cdd58c9084b5c3a5a708eeecd769783debdbcbaef442182", - "src/weak.rs": "c7cf03bf2aeba494b1999ab32183fa8c603ab72e254c0e312a67f168877e410d" + "src/weak.rs": "22070a3fa6e526d851bac81c551aa5cb4f9e609687075999c6d50973eeec3a98" }, - "package": "2b426b0506e5d50a7d8dafcf2e81471400deb602392c7dd110815afb4eaf02a3" + "package": "19ed4fa021d81c8392ce04db050a3da9a60299050b7ae1cf482d862b54a7218f" } diff -Nru temporalio-1.3.0/vendor/rustix/Cargo.toml temporalio-1.3.0/vendor/rustix/Cargo.toml --- temporalio-1.3.0/vendor/rustix/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -13,7 +13,7 @@ edition = "2021" rust-version = "1.63" name = "rustix" -version = "0.38.21" +version = "0.38.8" authors = [ "Dan Gohman ", "Jakub Konka ", @@ -78,7 +78,7 @@ package = "rustc-std-workspace-alloc" [dependencies.bitflags] -version = "2.4.0" +version = "2.3.3" default-features = false [dependencies.compiler_builtins] @@ -99,7 +99,7 @@ version = "1.0" [dev-dependencies.libc] -version = "0.2.148" +version = "0.2.147" [dev-dependencies.libc_errno] version = "0.3.1" @@ -133,14 +133,12 @@ "pty", "rand", "runtime", - "shm", - "stdio", "system", + "stdio", "termios", "thread", "time", ] -alloc = [] cc = [] default = [ "std", @@ -149,7 +147,6 @@ event = [] fs = [] io_uring = [ - "event", "fs", "net", "linux-raw-sys/io_uring", @@ -178,26 +175,18 @@ rand = [] runtime = ["linux-raw-sys/prctl"] rustc-dep-of-std = [ - "dep:core", - "dep:alloc", - "dep:compiler_builtins", + "core", + "alloc", + "compiler_builtins", "linux-raw-sys/rustc-dep-of-std", "bitflags/rustc-dep-of-std", - "compiler_builtins?/rustc-dep-of-std", -] -shm = ["fs"] -std = [ - "bitflags/std", - "alloc", - "libc?/std", - "libc_errno?/std", ] +std = ["bitflags/std"] stdio = [] system = ["linux-raw-sys/system"] termios = [] thread = ["linux-raw-sys/prctl"] time = [] -use-explicitly-provided-auxv = [] use-libc = [ "libc_errno", "libc", @@ -205,7 +194,7 @@ use-libc-auxv = [] [target."cfg(all(any(target_os = \"android\", target_os = \"linux\"), any(rustix_use_libc, miri, not(all(target_os = \"linux\", target_endian = \"little\", any(target_arch = \"arm\", all(target_arch = \"aarch64\", target_pointer_width = \"64\"), target_arch = \"riscv64\", all(rustix_use_experimental_asm, target_arch = \"powerpc64\"), all(rustix_use_experimental_asm, target_arch = \"mips\"), all(rustix_use_experimental_asm, target_arch = \"mips32r6\"), all(rustix_use_experimental_asm, target_arch = \"mips64\"), all(rustix_use_experimental_asm, target_arch = \"mips64r6\"), target_arch = \"x86\", all(target_arch = \"x86_64\", target_pointer_width = \"64\")))))))".dependencies.linux-raw-sys] -version = "0.4.8" +version = "0.4.3" features = [ "general", "ioctl", @@ -217,10 +206,9 @@ version = "0.4" [target."cfg(all(not(rustix_use_libc), not(miri), target_os = \"linux\", target_endian = \"little\", any(target_arch = \"arm\", all(target_arch = \"aarch64\", target_pointer_width = \"64\"), target_arch = \"riscv64\", all(rustix_use_experimental_asm, target_arch = \"powerpc64\"), all(rustix_use_experimental_asm, target_arch = \"mips\"), all(rustix_use_experimental_asm, target_arch = \"mips32r6\"), all(rustix_use_experimental_asm, target_arch = \"mips64\"), all(rustix_use_experimental_asm, target_arch = \"mips64r6\"), target_arch = \"x86\", all(target_arch = \"x86_64\", target_pointer_width = \"64\"))))".dependencies.libc] -version = "0.2.148" +version = "0.2.147" features = ["extra_traits"] optional = true -default-features = false [target."cfg(all(not(rustix_use_libc), not(miri), target_os = \"linux\", target_endian = \"little\", any(target_arch = \"arm\", all(target_arch = \"aarch64\", target_pointer_width = \"64\"), target_arch = \"riscv64\", all(rustix_use_experimental_asm, target_arch = \"powerpc64\"), all(rustix_use_experimental_asm, target_arch = \"mips\"), all(rustix_use_experimental_asm, target_arch = \"mips32r6\"), all(rustix_use_experimental_asm, target_arch = \"mips64\"), all(rustix_use_experimental_asm, target_arch = \"mips64r6\"), target_arch = \"x86\", all(target_arch = \"x86_64\", target_pointer_width = \"64\"))))".dependencies.libc_errno] version = "0.3.1" @@ -229,20 +217,18 @@ package = "errno" [target."cfg(all(not(rustix_use_libc), not(miri), target_os = \"linux\", target_endian = \"little\", any(target_arch = \"arm\", all(target_arch = \"aarch64\", target_pointer_width = \"64\"), target_arch = \"riscv64\", all(rustix_use_experimental_asm, target_arch = \"powerpc64\"), all(rustix_use_experimental_asm, target_arch = \"mips\"), all(rustix_use_experimental_asm, target_arch = \"mips32r6\"), all(rustix_use_experimental_asm, target_arch = \"mips64\"), all(rustix_use_experimental_asm, target_arch = \"mips64r6\"), target_arch = \"x86\", all(target_arch = \"x86_64\", target_pointer_width = \"64\"))))".dependencies.linux-raw-sys] -version = "0.4.8" +version = "0.4.3" features = [ "general", "errno", "ioctl", "no_std", - "elf", ] default-features = false [target."cfg(all(not(windows), any(rustix_use_libc, miri, not(all(target_os = \"linux\", target_endian = \"little\", any(target_arch = \"arm\", all(target_arch = \"aarch64\", target_pointer_width = \"64\"), target_arch = \"riscv64\", all(rustix_use_experimental_asm, target_arch = \"powerpc64\"), all(rustix_use_experimental_asm, target_arch = \"mips\"), all(rustix_use_experimental_asm, target_arch = \"mips32r6\"), all(rustix_use_experimental_asm, target_arch = \"mips64\"), all(rustix_use_experimental_asm, target_arch = \"mips64r6\"), target_arch = \"x86\", all(target_arch = \"x86_64\", target_pointer_width = \"64\")))))))".dependencies.libc] -version = "0.2.148" +version = "0.2.147" features = ["extra_traits"] -default-features = false [target."cfg(all(not(windows), any(rustix_use_libc, miri, not(all(target_os = \"linux\", target_endian = \"little\", any(target_arch = \"arm\", all(target_arch = \"aarch64\", target_pointer_width = \"64\"), target_arch = \"riscv64\", all(rustix_use_experimental_asm, target_arch = \"powerpc64\"), all(rustix_use_experimental_asm, target_arch = \"mips\"), all(rustix_use_experimental_asm, target_arch = \"mips32r6\"), all(rustix_use_experimental_asm, target_arch = \"mips64\"), all(rustix_use_experimental_asm, target_arch = \"mips64r6\"), target_arch = \"x86\", all(target_arch = \"x86_64\", target_pointer_width = \"64\")))))))".dependencies.libc_errno] version = "0.3.1" diff -Nru temporalio-1.3.0/vendor/rustix/CONTRIBUTING.md temporalio-1.3.0/vendor/rustix/CONTRIBUTING.md --- temporalio-1.3.0/vendor/rustix/CONTRIBUTING.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/CONTRIBUTING.md 2023-10-30 19:40:00.000000000 +0000 @@ -9,7 +9,7 @@ features. A special feature, `all-apis` enables all APIs, which is useful for testing. -```console +``` cargo test --features=all-apis ``` @@ -17,7 +17,7 @@ any given build. To test with the libc backend explicitly, additionally enable the `use-libc` feature: -```console +``` cargo test --features=all-apis,use-libc ``` diff -Nru temporalio-1.3.0/vendor/rustix/README.md temporalio-1.3.0/vendor/rustix/README.md --- temporalio-1.3.0/vendor/rustix/README.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/README.md 2023-10-30 19:40:00.000000000 +0000 @@ -55,30 +55,29 @@ The modules [`rustix::io`], [`rustix::fd`], and [`rustix::ffi`] are enabled by default. The rest of the API is conditional with cargo feature flags: -| Name | Description | -| ---------- | -------------------------------------------------------------- | -| `event` | [`rustix::event`]—Polling and event operations. | -| `fs` | [`rustix::fs`]—Filesystem operations. | -| `io_uring` | [`rustix::io_uring`]—Linux io_uring. | -| `mm` | [`rustix::mm`]—Memory map operations. | -| `mount` | [`rustix::mount`]—Linux mount API. | -| `net` | [`rustix::net`]—Network-related operations. | -| `param` | [`rustix::param`]—Process parameters. | -| `pipe` | [`rustix::pipe`]—Pipe operations. | -| `process` | [`rustix::process`]—Process-associated operations. | -| `procfs` | [`rustix::procfs`]—Utilities for reading `/proc` on Linux. | -| `pty` | [`rustix::pty`]—Pseudoterminal operations. | -| `rand` | [`rustix::rand`]—Random-related operations. | -| `shm` | [`rustix::shm`]—POSIX shared memory. | -| `stdio` | [`rustix::stdio`]—Stdio-related operations. | -| `system` | [`rustix::system`]—System-related operations. | -| `termios` | [`rustix::termios`]—Terminal I/O stream operations. | -| `thread` | [`rustix::thread`]—Thread-associated operations. | -| `time` | [`rustix::time`]—Time-related operations. | -| | | -| `use-libc` | Enable the libc backend. | +| Name | Description +| ---------- | --------------------- +| `event` | [`rustix::event`]—Polling and event operations. +| `fs` | [`rustix::fs`]—Filesystem operations. +| `io_uring` | [`rustix::io_uring`]—Linux io_uring. +| `mm` | [`rustix::mm`]—Memory map operations. +| `mount` | [`rustix::mount`]—Linux mount API. +| `net` | [`rustix::net`]—Network-related operations. +| `param` | [`rustix::param`]—Process parameters. +| `pipe` | [`rustix::pipe`]—Pipe operations. +| `process` | [`rustix::process`]—Process-associated operations. +| `procfs` | [`rustix::procfs`]—Utilities for reading `/proc` on Linux. +| `pty` | [`rustix::pty`]—Pseudoterminal operations. +| `rand` | [`rustix::rand`]—Random-related operations. +| `stdio` | [`rustix::stdio`]—Stdio-related operations. +| `system` | [`rustix::system`]—System-related operations. +| `termios` | [`rustix::termios`]—Terminal I/O stream operations. +| `thread` | [`rustix::thread`]—Thread-associated operations. +| `time` | [`rustix::time`]—Time-related operations. +| | +| `use-libc` | Enable the libc backend. -[`rustix::event`]: https://docs.rs/rustix/*/rustix/event/index.html +[`rustix::event`]: https://docs.rs/rustix/*/rustix/fs/index.html [`rustix::fs`]: https://docs.rs/rustix/*/rustix/fs/index.html [`rustix::io_uring`]: https://docs.rs/rustix/*/rustix/io_uring/index.html [`rustix::mm`]: https://docs.rs/rustix/*/rustix/mm/index.html @@ -90,7 +89,6 @@ [`rustix::procfs`]: https://docs.rs/rustix/*/rustix/procfs/index.html [`rustix::pty`]: https://docs.rs/rustix/*/rustix/pty/index.html [`rustix::rand`]: https://docs.rs/rustix/*/rustix/rand/index.html -[`rustix::shm`]: https://docs.rs/rustix/*/rustix/shm/index.html [`rustix::stdio`]: https://docs.rs/rustix/*/rustix/stdio/index.html [`rustix::system`]: https://docs.rs/rustix/*/rustix/system/index.html [`rustix::termios`]: https://docs.rs/rustix/*/rustix/termios/index.html @@ -109,8 +107,8 @@ ## Similar crates -`rustix` is similar to [`nix`], [`simple_libc`], [`unix`], [`nc`], [`uapi`], -and [`rusl`]. `rustix` is architected for [I/O safety] with most APIs using +`rustix` is similar to [`nix`], [`simple_libc`], [`unix`], [`nc`], and +[`uapi`]. `rustix` is architected for [I/O safety] with most APIs using [`OwnedFd`] and [`AsFd`] to manipulate file descriptors rather than `File` or even `c_int`, and supporting multiple backends so that it can use direct syscalls while still being usable on all platforms `libc` supports. Like `nix`, @@ -157,7 +155,6 @@ [`nc`]: https://crates.io/crates/nc [`simple_libc`]: https://crates.io/crates/simple_libc [`uapi`]: https://crates.io/crates/uapi -[`rusl`]: https://lib.rs/crates/rusl [`relibc`]: https://github.com/redox-os/relibc [`syscall`]: https://crates.io/crates/syscall [`sc`]: https://crates.io/crates/sc diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/libc/conv.rs temporalio-1.3.0/vendor/rustix/src/backend/libc/conv.rs --- temporalio-1.3.0/vendor/rustix/src/backend/libc/conv.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/libc/conv.rs 2023-10-30 19:40:00.000000000 +0000 @@ -3,7 +3,7 @@ //! for converting between rustix's types and libc types. use super::c; -#[cfg(all(feature = "alloc", not(any(windows, target_os = "espidf"))))] +#[cfg(not(any(windows, target_os = "espidf")))] use super::fd::IntoRawFd; use super::fd::{AsRawFd, BorrowedFd, FromRawFd, LibcFd, OwnedFd, RawFd}; #[cfg(not(windows))] @@ -16,7 +16,7 @@ c.as_ptr() } -#[cfg(not(any(windows, target_os = "espidf", target_os = "vita", target_os = "wasi")))] +#[cfg(not(any(windows, target_os = "espidf", target_os = "wasi")))] #[inline] pub(super) fn no_fd() -> LibcFd { -1 @@ -27,10 +27,7 @@ fd.as_raw_fd() as LibcFd } -#[cfg(all( - feature = "alloc", - not(any(windows, target_os = "espidf", target_os = "redox")) -))] +#[cfg(not(any(windows, target_os = "espidf", target_os = "redox")))] #[inline] pub(super) fn owned_fd(fd: OwnedFd) -> LibcFd { fd.into_raw_fd() as LibcFd @@ -136,7 +133,7 @@ } } -#[cfg(all(feature = "alloc", not(any(windows, target_os = "wasi"))))] +#[cfg(not(any(windows, target_os = "wasi")))] #[inline] pub(super) fn ret_discarded_char_ptr(raw: *mut c::c_char) -> io::Result<()> { if raw.is_null() { @@ -192,13 +189,7 @@ /// Convert the value to the `msg_iovlen` field of a `msghdr` struct. #[cfg(all( - not(any( - windows, - target_os = "espidf", - target_os = "redox", - target_os = "vita", - target_os = "wasi" - )), + not(any(windows, target_os = "espidf", target_os = "redox", target_os = "wasi")), not(any( target_os = "android", all(target_os = "linux", not(target_env = "musl")) @@ -214,7 +205,6 @@ bsd, solarish, target_env = "musl", - target_os = "aix", target_os = "emscripten", target_os = "fuchsia", target_os = "haiku", @@ -231,14 +221,12 @@ solarish, windows, target_env = "musl", - target_os = "aix", target_os = "emscripten", target_os = "espidf", target_os = "fuchsia", target_os = "haiku", target_os = "nto", target_os = "redox", - target_os = "vita", target_os = "wasi", )))] #[inline] diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/libc/c.rs temporalio-1.3.0/vendor/rustix/src/backend/libc/c.rs --- temporalio-1.3.0/vendor/rustix/src/backend/libc/c.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/libc/c.rs 2023-10-30 19:40:00.000000000 +0000 @@ -14,10 +14,6 @@ #[cfg(all(linux_kernel, target_env = "musl"))] pub(crate) const NFS_SUPER_MAGIC: u32 = 0x0000_6969; -#[cfg(feature = "process")] -#[cfg(not(any(target_os = "espidf", target_os = "wasi")))] -pub(crate) const EXIT_SIGNALED_SIGABRT: c_int = 128 + SIGABRT as c_int; - // TODO: Upstream these. #[cfg(all(linux_kernel, feature = "net"))] pub(crate) const ETH_P_TSN: c_int = linux_raw_sys::if_ether::ETH_P_TSN as _; @@ -83,14 +79,6 @@ #[cfg(all(linux_kernel, feature = "termios"))] pub(crate) const XCASE: tcflag_t = linux_raw_sys::general::XCASE as _; -#[cfg(target_os = "aix")] -pub(crate) const MSG_DONTWAIT: c_int = libc::MSG_NONBLOCK; - -// TODO: Remove once https://github.com/rust-lang/libc/pull/3377 is merged and released. -#[cfg(target_os = "netbsd")] -#[cfg(feature = "net")] -pub(crate) const SO_NOSIGPIPE: c_int = 0x0800; - // On PowerPC, the regular `termios` has the `termios2` fields and there is no // `termios2`. linux-raw-sys has aliases `termios2` to `termios` to cover this // difference, but we still need to manually import it since `libc` doesn't @@ -114,26 +102,19 @@ #[cfg(not(any(target_arch = "aarch64", target_arch = "riscv64")))] #[cfg(any(linux_like, target_os = "aix"))] pub(super) use libc::open64 as open; -#[cfg(any( - linux_kernel, - target_os = "aix", - target_os = "hurd", - target_os = "l4re" -))] +#[cfg(any(linux_kernel, target_os = "aix", target_os = "l4re"))] pub(super) use libc::posix_fallocate64 as posix_fallocate; #[cfg(any(all(linux_like, not(target_os = "android")), target_os = "aix"))] pub(super) use libc::{blkcnt64_t as blkcnt_t, rlim64_t as rlim_t}; -// TODO: AIX has `stat64x`, `fstat64x`, `lstat64x`, and `stat64xat`; add them -// to the upstream libc crate and implement rustix's `statat` etc. with them. #[cfg(target_os = "aix")] pub(super) use libc::{ - blksize64_t as blksize_t, fstat64 as fstat, fstatfs64 as fstatfs, fstatvfs64 as fstatvfs, - ftruncate64 as ftruncate, getrlimit64 as getrlimit, ino_t, lseek64 as lseek, mmap, - off64_t as off_t, openat, posix_fadvise64 as posix_fadvise, preadv, pwritev, - rlimit64 as rlimit, setrlimit64 as setrlimit, statfs64 as statfs, statvfs64 as statvfs, - RLIM_INFINITY, + blksize64_t as blksize_t, fstat64 as fstat, fstatat, fstatfs64 as fstatfs, + fstatvfs64 as fstatvfs, ftruncate64 as ftruncate, getrlimit64 as getrlimit, ino_t, + lseek64 as lseek, mmap, off64_t as off_t, openat, posix_fadvise64 as posix_fadvise, preadv, + pwritev, rlimit64 as rlimit, setrlimit64 as setrlimit, statfs64 as statfs, + statvfs64 as statvfs, RLIM_INFINITY, }; -#[cfg(any(linux_like, target_os = "hurd"))] +#[cfg(linux_like)] pub(super) use libc::{ fstat64 as fstat, fstatat64 as fstatat, fstatfs64 as fstatfs, fstatvfs64 as fstatvfs, ftruncate64 as ftruncate, getrlimit64 as getrlimit, ino64_t as ino_t, lseek64 as lseek, @@ -154,16 +135,11 @@ target_arch = "mips64r6" ) )))] -#[cfg(any(linux_like, target_os = "aix", target_os = "hurd"))] +#[cfg(any(linux_like, target_os = "aix"))] pub(super) use libc::{lstat64 as lstat, stat64 as stat}; -#[cfg(any( - linux_kernel, - target_os = "aix", - target_os = "hurd", - target_os = "emscripten" -))] +#[cfg(any(linux_kernel, target_os = "aix", target_os = "emscripten"))] pub(super) use libc::{pread64 as pread, pwrite64 as pwrite}; -#[cfg(any(target_os = "linux", target_os = "hurd", target_os = "emscripten"))] +#[cfg(any(target_os = "linux", target_os = "emscripten"))] pub(super) use libc::{preadv64 as preadv, pwritev64 as pwritev}; #[cfg(all(target_os = "linux", target_env = "gnu"))] @@ -224,6 +200,25 @@ prlimit64(pid, resource, new_limit, old_limit) } +// 64-bit offsets on 32-bit platforms are passed in endianness-specific +// lo/hi pairs. See src/backend/linux_raw/conv.rs for details. +#[cfg(all(linux_kernel, target_endian = "little", target_pointer_width = "32"))] +fn lo(x: i64) -> usize { + (x >> 32) as usize +} +#[cfg(all(linux_kernel, target_endian = "little", target_pointer_width = "32"))] +fn hi(x: i64) -> usize { + x as usize +} +#[cfg(all(linux_kernel, target_endian = "big", target_pointer_width = "32"))] +fn lo(x: i64) -> usize { + x as usize +} +#[cfg(all(linux_kernel, target_endian = "big", target_pointer_width = "32"))] +fn hi(x: i64) -> usize { + (x >> 32) as usize +} + #[cfg(target_os = "android")] mod readwrite_pv64 { use super::*; @@ -244,18 +239,31 @@ if let Some(fun) = preadv64.get() { fun(fd, iov, iovcnt, offset) } else { - // Unlike the plain "p" functions, the "pv" functions pass their - // offset in an endian-independent way, and always in two registers. - syscall! { - fn preadv( - fd: libc::c_int, - iov: *const libc::iovec, - iovcnt: libc::c_int, - offset_lo: usize, - offset_hi: usize - ) via SYS_preadv -> libc::ssize_t + #[cfg(target_pointer_width = "32")] + { + syscall! { + fn preadv( + fd: libc::c_int, + iov: *const libc::iovec, + iovcnt: libc::c_int, + offset_hi: usize, + offset_lo: usize + ) via SYS_preadv -> libc::ssize_t + } + preadv(fd, iov, iovcnt, hi(offset), lo(offset)) + } + #[cfg(target_pointer_width = "64")] + { + syscall! { + fn preadv( + fd: libc::c_int, + iov: *const libc::iovec, + iovcnt: libc::c_int, + offset: libc::off_t + ) via SYS_preadv -> libc::ssize_t + } + preadv(fd, iov, iovcnt, offset) } - preadv(fd, iov, iovcnt, offset as usize, (offset >> 32) as usize) } } pub(in super::super) unsafe fn pwritev64( @@ -271,25 +279,38 @@ if let Some(fun) = pwritev64.get() { fun(fd, iov, iovcnt, offset) } else { - // Unlike the plain "p" functions, the "pv" functions pass their - // offset in an endian-independent way, and always in two registers. - syscall! { - fn pwritev( - fd: libc::c_int, - iov: *const libc::iovec, - iovcnt: libc::c_int, - offset_lo: usize, - offset_hi: usize - ) via SYS_pwritev -> libc::ssize_t + #[cfg(target_pointer_width = "32")] + { + syscall! { + fn pwritev( + fd: libc::c_int, + iov: *const libc::iovec, + iovcnt: libc::c_int, + offset_hi: usize, + offset_lo: usize + ) via SYS_pwritev -> libc::ssize_t + } + pwritev(fd, iov, iovcnt, hi(offset), lo(offset)) + } + #[cfg(target_pointer_width = "64")] + { + syscall! { + fn pwritev( + fd: libc::c_int, + iov: *const libc::iovec, + iovcnt: libc::c_int, + offset: libc::off_t + ) via SYS_pwritev -> libc::ssize_t + } + pwritev(fd, iov, iovcnt, offset) } - pwritev(fd, iov, iovcnt, offset as usize, (offset >> 32) as usize) } } } #[cfg(target_os = "android")] pub(super) use readwrite_pv64::{preadv64 as preadv, pwritev64 as pwritev}; -// macOS added `preadv` and `pwritev` in version 11.0. +// macOS added preadv and pwritev in version 11.0 #[cfg(apple)] mod readwrite_pv { weakcall! { @@ -333,26 +354,33 @@ if let Some(fun) = preadv64v2.get() { fun(fd, iov, iovcnt, offset, flags) } else { - // Unlike the plain "p" functions, the "pv" functions pass their - // offset in an endian-independent way, and always in two registers. - syscall! { - fn preadv2( - fd: libc::c_int, - iov: *const libc::iovec, - iovcnt: libc::c_int, - offset_lo: usize, - offset_hi: usize, - flags: libc::c_int - ) via SYS_preadv2 -> libc::ssize_t + #[cfg(target_pointer_width = "32")] + { + syscall! { + fn preadv2( + fd: libc::c_int, + iov: *const libc::iovec, + iovcnt: libc::c_int, + offset_hi: usize, + offset_lo: usize, + flags: libc::c_int + ) via SYS_preadv2 -> libc::ssize_t + } + preadv2(fd, iov, iovcnt, hi(offset), lo(offset), flags) + } + #[cfg(target_pointer_width = "64")] + { + syscall! { + fn preadv2( + fd: libc::c_int, + iov: *const libc::iovec, + iovcnt: libc::c_int, + offset: libc::off_t, + flags: libc::c_int + ) via SYS_preadv2 -> libc::ssize_t + } + preadv2(fd, iov, iovcnt, offset, flags) } - preadv2( - fd, - iov, - iovcnt, - offset as usize, - (offset >> 32) as usize, - flags, - ) } } pub(in super::super) unsafe fn pwritev64v2( @@ -369,26 +397,33 @@ if let Some(fun) = pwritev64v2.get() { fun(fd, iov, iovcnt, offset, flags) } else { - // Unlike the plain "p" functions, the "pv" functions pass their - // offset in an endian-independent way, and always in two registers. - syscall! { - fn pwritev2( - fd: libc::c_int, - iov: *const libc::iovec, - iovec: libc::c_int, - offset_lo: usize, - offset_hi: usize, - flags: libc::c_int - ) via SYS_pwritev2 -> libc::ssize_t + #[cfg(target_pointer_width = "32")] + { + syscall! { + fn pwritev2( + fd: libc::c_int, + iov: *const libc::iovec, + iovec: libc::c_int, + offset_hi: usize, + offset_lo: usize, + flags: libc::c_int + ) via SYS_pwritev2 -> libc::ssize_t + } + pwritev2(fd, iov, iovcnt, hi(offset), lo(offset), flags) + } + #[cfg(target_pointer_width = "64")] + { + syscall! { + fn pwritev2( + fd: libc::c_int, + iov:*const libc::iovec, + iovcnt: libc::c_int, + offset: libc::off_t, + flags: libc::c_int + ) via SYS_pwritev2 -> libc::ssize_t + } + pwritev2(fd, iov, iovcnt, offset, flags) } - pwritev2( - fd, - iov, - iovcnt, - offset as usize, - (offset >> 32) as usize, - flags, - ) } } } @@ -411,26 +446,33 @@ offset: libc::off64_t, flags: libc::c_int, ) -> libc::ssize_t { - // Unlike the plain "p" functions, the "pv" functions pass their offset - // in an endian-independent way, and always in two registers. - syscall! { - fn preadv2( - fd: libc::c_int, - iov: *const libc::iovec, - iovcnt: libc::c_int, - offset_lo: usize, - offset_hi: usize, - flags: libc::c_int - ) via SYS_preadv2 -> libc::ssize_t - } - preadv2( - fd, - iov, - iovcnt, - offset as usize, - (offset >> 32) as usize, - flags, - ) + #[cfg(target_pointer_width = "32")] + { + syscall! { + fn preadv2( + fd: libc::c_int, + iov: *const libc::iovec, + iovcnt: libc::c_int, + offset_hi: usize, + offset_lo: usize, + flags: libc::c_int + ) via SYS_preadv2 -> libc::ssize_t + } + preadv2(fd, iov, iovcnt, hi(offset), lo(offset), flags) + } + #[cfg(target_pointer_width = "64")] + { + syscall! { + fn preadv2( + fd: libc::c_int, + iov: *const libc::iovec, + iovcnt: libc::c_int, + offset: libc::off_t, + flags: libc::c_int + ) via SYS_preadv2 -> libc::ssize_t + } + preadv2(fd, iov, iovcnt, offset, flags) + } } pub(in super::super) unsafe fn pwritev64v2( fd: libc::c_int, @@ -439,26 +481,33 @@ offset: libc::off64_t, flags: libc::c_int, ) -> libc::ssize_t { - // Unlike the plain "p" functions, the "pv" functions pass their offset - // in an endian-independent way, and always in two registers. - syscall! { - fn pwritev2( - fd: libc::c_int, - iov: *const libc::iovec, - iovcnt: libc::c_int, - offset_lo: usize, - offset_hi: usize, - flags: libc::c_int - ) via SYS_pwritev2 -> libc::ssize_t - } - pwritev2( - fd, - iov, - iovcnt, - offset as usize, - (offset >> 32) as usize, - flags, - ) + #[cfg(target_pointer_width = "32")] + { + syscall! { + fn pwritev2( + fd: libc::c_int, + iov: *const libc::iovec, + iovcnt: libc::c_int, + offset_hi: usize, + offset_lo: usize, + flags: libc::c_int + ) via SYS_pwritev2 -> libc::ssize_t + } + pwritev2(fd, iov, iovcnt, hi(offset), lo(offset), flags) + } + #[cfg(target_pointer_width = "64")] + { + syscall! { + fn pwritev2( + fd: libc::c_int, + iov:*const libc::iovec, + iovcnt: libc::c_int, + offset: libc::off_t, + flags: libc::c_int + ) via SYS_pwritev2 -> libc::ssize_t + } + pwritev2(fd, iov, iovcnt, offset, flags) + } } } #[cfg(any( diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/libc/event/epoll.rs temporalio-1.3.0/vendor/rustix/src/backend/libc/event/epoll.rs --- temporalio-1.3.0/vendor/rustix/src/backend/libc/event/epoll.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/libc/event/epoll.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,4 +1,8 @@ -//! Linux `epoll` support. +//! epoll support. +//! +//! This is an experiment, and it isn't yet clear whether epoll is the right +//! level of abstraction at which to introduce safety. But it works fairly well +//! in simple examples 🙂. //! //! # Examples //! @@ -70,13 +74,10 @@ //! ``` use crate::backend::c; -#[cfg(feature = "alloc")] -use crate::backend::conv::ret_u32; -use crate::backend::conv::{ret, ret_owned_fd}; +use crate::backend::conv::{ret, ret_owned_fd, ret_u32}; use crate::fd::{AsFd, AsRawFd, OwnedFd}; use crate::io; use crate::utils::as_mut_ptr; -#[cfg(feature = "alloc")] use alloc::vec::Vec; use bitflags::bitflags; use core::ffi::c_void; @@ -91,9 +92,6 @@ pub struct CreateFlags: u32 { /// `EPOLL_CLOEXEC` const CLOEXEC = bitcast!(c::EPOLL_CLOEXEC); - - /// - const _ = !0; } } @@ -147,9 +145,6 @@ /// `EPOLLEXCLUSIVE` #[cfg(not(target_os = "android"))] const EXCLUSIVE = bitcast!(c::EPOLLEXCLUSIVE); - - /// - const _ = !0; } } @@ -256,8 +251,6 @@ /// /// For each event of interest, an element is written to `events`. On /// success, this returns the number of written elements. -#[cfg(feature = "alloc")] -#[cfg_attr(doc_cfg, doc(cfg(feature = "alloc")))] pub fn wait(epoll: impl AsFd, event_list: &mut EventVec, timeout: c::c_int) -> io::Result<()> { // SAFETY: We're calling `epoll_wait` via FFI and we know how it // behaves. @@ -313,8 +306,8 @@ pub data: EventData, } -/// Data associated with an [`Event`]. This can either be a 64-bit integer -/// value or a pointer which preserves pointer provenance. +/// Data assocated with an [`Event`]. This can either be a 64-bit integer value +/// or a pointer which preserves pointer provenance. #[repr(C)] #[derive(Copy, Clone)] pub union EventData { @@ -396,12 +389,10 @@ } /// A vector of `Event`s, plus context for interpreting them. -#[cfg(feature = "alloc")] pub struct EventVec { events: Vec, } -#[cfg(feature = "alloc")] impl EventVec { /// Constructs an `EventVec` from raw pointer, length, and capacity. /// @@ -476,7 +467,6 @@ } } -#[cfg(feature = "alloc")] impl<'a> IntoIterator for &'a EventVec { type IntoIter = Iter<'a>; type Item = Event; diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/libc/event/poll_fd.rs temporalio-1.3.0/vendor/rustix/src/backend/libc/event/poll_fd.rs --- temporalio-1.3.0/vendor/rustix/src/backend/libc/event/poll_fd.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/libc/event/poll_fd.rs 2023-10-30 19:40:00.000000000 +0000 @@ -47,9 +47,6 @@ not(any(target_arch = "sparc", target_arch = "sparc64"))), )] const RDHUP = c::POLLRDHUP; - - /// - const _ = !0; } } diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/libc/event/syscalls.rs temporalio-1.3.0/vendor/rustix/src/backend/libc/event/syscalls.rs --- temporalio-1.3.0/vendor/rustix/src/backend/libc/event/syscalls.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/libc/event/syscalls.rs 2023-10-30 19:40:00.000000000 +0000 @@ -22,7 +22,7 @@ target_os = "espidf" ))] use {crate::backend::conv::ret_owned_fd, crate::event::EventfdFlags}; -#[cfg(all(feature = "alloc", bsd))] +#[cfg(bsd)] use {crate::event::kqueue::Event, crate::utils::as_ptr, core::ptr::null}; #[cfg(any( @@ -61,12 +61,12 @@ } } -#[cfg(all(feature = "alloc", bsd))] +#[cfg(bsd)] pub(crate) fn kqueue() -> io::Result { unsafe { ret_owned_fd(c::kqueue()) } } -#[cfg(all(feature = "alloc", bsd))] +#[cfg(bsd)] pub(crate) unsafe fn kevent( kq: BorrowedFd<'_>, changelist: &[Event], @@ -147,7 +147,7 @@ Ok(Event(unsafe { event.assume_init() })) } -#[cfg(all(feature = "alloc", solarish))] +#[cfg(solarish)] pub(crate) fn port_getn( port: BorrowedFd<'_>, timeout: Option<&mut c::timespec>, diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/libc/event/types.rs temporalio-1.3.0/vendor/rustix/src/backend/libc/event/types.rs --- temporalio-1.3.0/vendor/rustix/src/backend/libc/event/types.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/libc/event/types.rs 2023-10-30 19:40:00.000000000 +0000 @@ -30,8 +30,5 @@ /// `EFD_SEMAPHORE` #[cfg(not(target_os = "espidf"))] const SEMAPHORE = bitcast!(c::EFD_SEMAPHORE); - - /// - const _ = !0; } } diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/libc/fs/dir.rs temporalio-1.3.0/vendor/rustix/src/backend/libc/fs/dir.rs --- temporalio-1.3.0/vendor/rustix/src/backend/libc/fs/dir.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/libc/fs/dir.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,51 +1,37 @@ -#[cfg(not(any(solarish, target_os = "haiku", target_os = "nto", target_os = "vita")))] +#[cfg(not(any(solarish, target_os = "haiku", target_os = "nto")))] use super::types::FileType; use crate::backend::c; use crate::backend::conv::owned_fd; use crate::fd::{AsFd, BorrowedFd}; use crate::ffi::{CStr, CString}; -use crate::fs::{fcntl_getfl, openat, Mode, OFlags}; -#[cfg(not(target_os = "vita"))] -use crate::fs::{fstat, Stat}; +use crate::fs::{fcntl_getfl, fstat, openat, Mode, OFlags, Stat}; #[cfg(not(any( solarish, target_os = "haiku", target_os = "netbsd", target_os = "nto", target_os = "redox", - target_os = "vita", target_os = "wasi", )))] use crate::fs::{fstatfs, StatFs}; -#[cfg(not(any( - solarish, - target_os = "haiku", - target_os = "redox", - target_os = "vita", - target_os = "wasi" -)))] +#[cfg(not(any(solarish, target_os = "haiku", target_os = "redox", target_os = "wasi")))] use crate::fs::{fstatvfs, StatVfs}; use crate::io; -#[cfg(not(any(target_os = "fuchsia", target_os = "vita", target_os = "wasi")))] +#[cfg(not(any(target_os = "fuchsia", target_os = "wasi")))] #[cfg(feature = "process")] use crate::process::fchdir; use alloc::borrow::ToOwned; -#[cfg(not(any(linux_like, target_os = "hurd")))] +#[cfg(not(linux_like))] use c::readdir as libc_readdir; -#[cfg(any(linux_like, target_os = "hurd"))] +#[cfg(linux_like)] use c::readdir64 as libc_readdir; use core::fmt; use core::ptr::NonNull; use libc_errno::{errno, set_errno, Errno}; /// `DIR*` -pub struct Dir { - /// The `libc` `DIR` pointer. - libc_dir: NonNull, - - /// Have we seen any errors in this iteration? - any_errors: bool, -} +#[repr(transparent)] +pub struct Dir(NonNull); impl Dir { /// Construct a `Dir` that reads entries from the given directory @@ -56,38 +42,21 @@ } #[inline] - #[allow(unused_mut)] fn _read_from(fd: BorrowedFd<'_>) -> io::Result { - let mut any_errors = false; - // Given an arbitrary `OwnedFd`, it's impossible to know whether the // user holds a `dup`'d copy which could continue to modify the // file description state, which would cause Undefined Behavior after // our call to `fdopendir`. To prevent this, we obtain an independent // `OwnedFd`. let flags = fcntl_getfl(fd)?; - let fd_for_dir = match openat(fd, cstr!("."), flags | OFlags::CLOEXEC, Mode::empty()) { - Ok(fd) => fd, - #[cfg(not(target_os = "wasi"))] - Err(io::Errno::NOENT) => { - // If "." doesn't exist, it means the directory was removed. - // We treat that as iterating through a directory with no - // entries. - any_errors = true; - crate::io::dup(fd)? - } - Err(err) => return Err(err), - }; + let fd_for_dir = openat(fd, cstr!("."), flags | OFlags::CLOEXEC, Mode::empty())?; let raw = owned_fd(fd_for_dir); unsafe { let libc_dir = c::fdopendir(raw); if let Some(libc_dir) = NonNull::new(libc_dir) { - Ok(Self { - libc_dir, - any_errors, - }) + Ok(Self(libc_dir)) } else { let err = io::Errno::last_os_error(); let _ = c::close(raw); @@ -99,19 +68,13 @@ /// `rewinddir(self)` #[inline] pub fn rewind(&mut self) { - self.any_errors = false; - unsafe { c::rewinddir(self.libc_dir.as_ptr()) } + unsafe { c::rewinddir(self.0.as_ptr()) } } /// `readdir(self)`, where `None` means the end of the directory. pub fn read(&mut self) -> Option> { - // If we've seen errors, don't continue to try to read anyting further. - if self.any_errors { - return None; - } - set_errno(Errno(0)); - let dirent_ptr = unsafe { libc_readdir(self.libc_dir.as_ptr()) }; + let dirent_ptr = unsafe { libc_readdir(self.0.as_ptr()) }; if dirent_ptr.is_null() { let curr_errno = errno().0; if curr_errno == 0 { @@ -119,7 +82,6 @@ None } else { // `errno` is unknown or non-zero, so an error occurred. - self.any_errors = true; Some(Err(io::Errno(curr_errno))) } } else { @@ -137,12 +99,11 @@ solarish, target_os = "aix", target_os = "haiku", - target_os = "nto", - target_os = "vita" + target_os = "nto" )))] d_type: dirent.d_type, - #[cfg(not(any(freebsdlike, netbsdlike, target_os = "vita")))] + #[cfg(not(any(freebsdlike, netbsdlike)))] d_ino: dirent.d_ino, #[cfg(any(freebsdlike, netbsdlike))] @@ -157,10 +118,9 @@ } /// `fstat(self)` - #[cfg(not(target_os = "vita"))] #[inline] pub fn stat(&self) -> io::Result { - fstat(unsafe { BorrowedFd::borrow_raw(c::dirfd(self.libc_dir.as_ptr())) }) + fstat(unsafe { BorrowedFd::borrow_raw(c::dirfd(self.0.as_ptr())) }) } /// `fstatfs(self)` @@ -170,34 +130,27 @@ target_os = "netbsd", target_os = "nto", target_os = "redox", - target_os = "vita", target_os = "wasi", )))] #[inline] pub fn statfs(&self) -> io::Result { - fstatfs(unsafe { BorrowedFd::borrow_raw(c::dirfd(self.libc_dir.as_ptr())) }) + fstatfs(unsafe { BorrowedFd::borrow_raw(c::dirfd(self.0.as_ptr())) }) } /// `fstatvfs(self)` - #[cfg(not(any( - solarish, - target_os = "haiku", - target_os = "redox", - target_os = "vita", - target_os = "wasi" - )))] + #[cfg(not(any(solarish, target_os = "haiku", target_os = "redox", target_os = "wasi")))] #[inline] pub fn statvfs(&self) -> io::Result { - fstatvfs(unsafe { BorrowedFd::borrow_raw(c::dirfd(self.libc_dir.as_ptr())) }) + fstatvfs(unsafe { BorrowedFd::borrow_raw(c::dirfd(self.0.as_ptr())) }) } /// `fchdir(self)` #[cfg(feature = "process")] - #[cfg(not(any(target_os = "fuchsia", target_os = "vita", target_os = "wasi")))] + #[cfg(not(any(target_os = "fuchsia", target_os = "wasi")))] #[cfg_attr(doc_cfg, doc(cfg(feature = "process")))] #[inline] pub fn chdir(&self) -> io::Result<()> { - fchdir(unsafe { BorrowedFd::borrow_raw(c::dirfd(self.libc_dir.as_ptr())) }) + fchdir(unsafe { BorrowedFd::borrow_raw(c::dirfd(self.0.as_ptr())) }) } } @@ -210,7 +163,7 @@ impl Drop for Dir { #[inline] fn drop(&mut self) { - unsafe { c::closedir(self.libc_dir.as_ptr()) }; + unsafe { c::closedir(self.0.as_ptr()) }; } } @@ -225,26 +178,19 @@ impl fmt::Debug for Dir { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - let mut s = f.debug_struct("Dir"); - #[cfg(not(target_os = "vita"))] - s.field("fd", unsafe { &c::dirfd(self.libc_dir.as_ptr()) }); - s.finish() + f.debug_struct("Dir") + .field("fd", unsafe { &c::dirfd(self.0.as_ptr()) }) + .finish() } } /// `struct dirent` #[derive(Debug)] pub struct DirEntry { - #[cfg(not(any( - solarish, - target_os = "aix", - target_os = "haiku", - target_os = "nto", - target_os = "vita" - )))] + #[cfg(not(any(solarish, target_os = "aix", target_os = "haiku", target_os = "nto")))] d_type: u8, - #[cfg(not(any(freebsdlike, netbsdlike, target_os = "vita")))] + #[cfg(not(any(freebsdlike, netbsdlike)))] d_ino: c::ino_t, #[cfg(any(freebsdlike, netbsdlike))] @@ -261,20 +207,14 @@ } /// Returns the type of this directory entry. - #[cfg(not(any( - solarish, - target_os = "aix", - target_os = "haiku", - target_os = "nto", - target_os = "vita" - )))] + #[cfg(not(any(solarish, target_os = "aix", target_os = "haiku", target_os = "nto")))] #[inline] pub fn file_type(&self) -> FileType { FileType::from_dirent_d_type(self.d_type) } /// Return the inode number of this directory entry. - #[cfg(not(any(freebsdlike, netbsdlike, target_os = "vita")))] + #[cfg(not(any(freebsdlike, netbsdlike)))] #[inline] pub fn ino(&self) -> u64 { self.d_ino as u64 @@ -353,45 +293,3 @@ } ); } - -#[test] -fn dir_iterator_handles_io_errors() { - // create a dir, keep the FD, then delete the dir - let tmp = tempfile::tempdir().unwrap(); - let fd = crate::fs::openat( - crate::fs::CWD, - tmp.path(), - crate::fs::OFlags::RDONLY | crate::fs::OFlags::CLOEXEC, - crate::fs::Mode::empty(), - ) - .unwrap(); - - let file_fd = crate::fs::openat( - &fd, - tmp.path().join("test.txt"), - crate::fs::OFlags::WRONLY | crate::fs::OFlags::CREATE, - crate::fs::Mode::RWXU, - ) - .unwrap(); - - let mut dir = Dir::read_from(&fd).unwrap(); - - // Reach inside the `Dir` and replace its directory with a file, which - // will cause the subsequent `readdir` to fail. - unsafe { - let raw_fd = c::dirfd(dir.libc_dir.as_ptr()); - let mut owned_fd: crate::fd::OwnedFd = crate::fd::FromRawFd::from_raw_fd(raw_fd); - crate::io::dup2(&file_fd, &mut owned_fd).unwrap(); - core::mem::forget(owned_fd); - } - - // FreeBSD and macOS seem to read some directory entries before we call - // `.next()`. - #[cfg(any(apple, freebsdlike))] - { - dir.rewind(); - } - - assert!(matches!(dir.next(), Some(Err(_)))); - assert!(matches!(dir.next(), None)); -} diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/libc/fs/inotify.rs temporalio-1.3.0/vendor/rustix/src/backend/libc/fs/inotify.rs --- temporalio-1.3.0/vendor/rustix/src/backend/libc/fs/inotify.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/libc/fs/inotify.rs 2023-10-30 19:40:00.000000000 +0000 @@ -17,9 +17,6 @@ const CLOEXEC = bitcast!(c::IN_CLOEXEC); /// `IN_NONBLOCK` const NONBLOCK = bitcast!(c::IN_NONBLOCK); - - /// - const _ = !0; } } @@ -38,7 +35,7 @@ const CLOSE_NOWRITE = c::IN_CLOSE_NOWRITE; /// `IN_CLOSE_WRITE` const CLOSE_WRITE = c::IN_CLOSE_WRITE; - /// `IN_CREATE` + /// `IN_CREATE ` const CREATE = c::IN_CREATE; /// `IN_DELETE` const DELETE = c::IN_DELETE; @@ -74,9 +71,6 @@ const ONESHOT = c::IN_ONESHOT; /// `IN_ONLYDIR` const ONLYDIR = c::IN_ONLYDIR; - - /// - const _ = !0; } } @@ -90,33 +84,33 @@ unsafe { ret_owned_fd(c::inotify_init1(bitflags_bits!(flags))) } } -/// `inotify_add_watch(self, path, flags)`—Adds a watch to inotify. +/// `inotify_add_watch(self, path, flags)`—Adds a watch to inotify /// -/// This registers or updates a watch for the filesystem path `path` and -/// returns a watch descriptor corresponding to this watch. +/// This registers or updates a watch for the filesystem path `path` +/// and returns a watch descriptor corresponding to this watch. /// -/// Note: Due to the existence of hardlinks, providing two different paths to -/// this method may result in it returning the same watch descriptor. An -/// application should keep track of this externally to avoid logic errors. +/// Note: Due to the existence of hardlinks, providing two +/// different paths to this method may result in it returning +/// the same watch descriptor. An application should keep track of this +/// externally to avoid logic errors. pub fn inotify_add_watch( inot: BorrowedFd<'_>, path: P, flags: WatchFlags, ) -> io::Result { - path.into_with_c_str(|path| { - // SAFETY: The fd and path we are passing is guaranteed valid by the - // type system. - unsafe { - ret_c_int(c::inotify_add_watch( - borrowed_fd(inot), - c_str(path), - flags.bits(), - )) - } - }) + let path = path.as_cow_c_str().unwrap(); + // SAFETY: The fd and path we are passing is guaranteed valid by the type + // system. + unsafe { + ret_c_int(c::inotify_add_watch( + borrowed_fd(inot), + c_str(&path), + flags.bits(), + )) + } } -/// `inotify_rm_watch(self, wd)`—Removes a watch from this inotify. +/// `inotify_rm_watch(self, wd)`—Removes a watch from this inotify /// /// The watch descriptor provided should have previously been returned by /// [`inotify_add_watch`] and not previously have been removed. diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/libc/fs/mod.rs temporalio-1.3.0/vendor/rustix/src/backend/libc/fs/mod.rs --- temporalio-1.3.0/vendor/rustix/src/backend/libc/fs/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/libc/fs/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,4 +1,4 @@ -#[cfg(all(feature = "alloc", not(any(target_os = "espidf", target_os = "redox"))))] +#[cfg(not(any(target_os = "espidf", target_os = "redox")))] pub(crate) mod dir; #[cfg(linux_kernel)] pub mod inotify; @@ -6,18 +6,9 @@ target_os = "espidf", target_os = "haiku", target_os = "redox", - target_os = "vita", target_os = "wasi" )))] pub(crate) mod makedev; #[cfg(not(windows))] pub(crate) mod syscalls; pub(crate) mod types; - -// TODO: Fix linux-raw-sys to define ioctl codes for sparc. -#[cfg(all(linux_kernel, any(target_arch = "sparc", target_arch = "sparc64")))] -pub(crate) const EXT4_IOC_RESIZE_FS: crate::ioctl::RawOpcode = 0x8008_6610; - -#[cfg(all(linux_kernel, not(any(target_arch = "sparc", target_arch = "sparc64"))))] -pub(crate) const EXT4_IOC_RESIZE_FS: crate::ioctl::RawOpcode = - linux_raw_sys::ioctl::EXT4_IOC_RESIZE_FS as crate::ioctl::RawOpcode; diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/libc/fs/syscalls.rs temporalio-1.3.0/vendor/rustix/src/backend/libc/fs/syscalls.rs --- temporalio-1.3.0/vendor/rustix/src/backend/libc/fs/syscalls.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/libc/fs/syscalls.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,20 +1,13 @@ //! libc syscalls supporting `rustix::fs`. use crate::backend::c; -#[cfg(any( - apple, - linux_kernel, - feature = "alloc", - all(linux_kernel, feature = "procfs") -))] -use crate::backend::conv::ret_usize; -use crate::backend::conv::{borrowed_fd, c_str, ret, ret_c_int, ret_off_t, ret_owned_fd}; +use crate::backend::conv::{ + borrowed_fd, c_str, ret, ret_c_int, ret_off_t, ret_owned_fd, ret_usize, +}; use crate::fd::{BorrowedFd, OwnedFd}; use crate::ffi::CStr; #[cfg(apple)] use crate::ffi::CString; -#[cfg(not(any(target_os = "espidf", target_os = "vita")))] -use crate::fs::Access; #[cfg(not(any( apple, netbsdlike, @@ -23,7 +16,6 @@ target_os = "espidf", target_os = "haiku", target_os = "redox", - target_os = "vita", )))] use crate::fs::Advice; #[cfg(not(any(target_os = "espidf", target_os = "redox")))] @@ -36,10 +28,9 @@ target_os = "espidf", target_os = "nto", target_os = "redox", - target_os = "vita", )))] use crate::fs::FallocateFlags; -#[cfg(not(any(target_os = "espidf", target_os = "vita", target_os = "wasi")))] +#[cfg(not(any(target_os = "espidf", target_os = "wasi")))] use crate::fs::FlockOperation; #[cfg(any(linux_kernel, target_os = "freebsd"))] use crate::fs::MemfdFlags; @@ -52,19 +43,12 @@ target_os = "netbsd", target_os = "nto", target_os = "redox", - target_os = "vita", target_os = "wasi", )))] use crate::fs::StatFs; -#[cfg(not(any(target_os = "espidf", target_os = "vita")))] -use crate::fs::Timestamps; -#[cfg(not(any( - apple, - target_os = "espidf", - target_os = "redox", - target_os = "vita", - target_os = "wasi" -)))] +#[cfg(not(target_os = "espidf"))] +use crate::fs::{Access, Timestamps}; +#[cfg(not(any(apple, target_os = "espidf", target_os = "redox", target_os = "wasi")))] use crate::fs::{Dev, FileType}; use crate::fs::{Mode, OFlags, SeekFrom, Stat}; #[cfg(not(any(target_os = "haiku", target_os = "redox", target_os = "wasi")))] @@ -106,7 +90,6 @@ target_arch = "aarch64", target_arch = "riscv32", target_arch = "riscv64", - target_arch = "csky", target_arch = "loongarch64" ))] { @@ -118,7 +101,6 @@ target_arch = "aarch64", target_arch = "riscv32", target_arch = "riscv64", - target_arch = "csky", target_arch = "loongarch64" )))] unsafe { @@ -141,7 +123,7 @@ pub(crate) fn open(path: &CStr, oflags: OFlags, mode: Mode) -> io::Result { // Work around . // glibc versions before 2.25 don't handle `O_TMPFILE` correctly. - #[cfg(all(unix, target_env = "gnu", not(target_os = "hurd")))] + #[cfg(all(unix, target_env = "gnu"))] if oflags.contains(OFlags::TMPFILE) && crate::backend::if_glibc_is_less_than_2_25() { return open_via_syscall(path, oflags, mode); } @@ -169,7 +151,7 @@ /// Use a direct syscall (via libc) for `openat`. /// /// This is only currently necessary as a workaround for old glibc; see below. -#[cfg(all(unix, target_env = "gnu", not(target_os = "hurd")))] +#[cfg(all(unix, target_env = "gnu"))] fn openat_via_syscall( dirfd: BorrowedFd<'_>, path: &CStr, @@ -204,7 +186,7 @@ ) -> io::Result { // Work around . // glibc versions before 2.25 don't handle `O_TMPFILE` correctly. - #[cfg(all(unix, target_env = "gnu", not(target_os = "hurd")))] + #[cfg(all(unix, target_env = "gnu"))] if oflags.contains(OFlags::TMPFILE) && crate::backend::if_glibc_is_less_than_2_25() { return openat_via_syscall(dirfd, path, oflags, mode); } @@ -243,7 +225,6 @@ target_os = "netbsd", target_os = "nto", target_os = "redox", - target_os = "vita", target_os = "wasi", )))] #[inline] @@ -265,7 +246,6 @@ } } -#[cfg(feature = "alloc")] #[inline] pub(crate) fn readlink(path: &CStr, buf: &mut [u8]) -> io::Result { unsafe { @@ -275,10 +255,7 @@ } } -#[cfg(all( - any(feature = "alloc", all(linux_kernel, feature = "procfs")), - not(target_os = "redox") -))] +#[cfg(not(target_os = "redox"))] #[inline] pub(crate) fn readlinkat( dirfd: BorrowedFd<'_>, @@ -521,6 +498,8 @@ } } +/// At present, `libc` only has `renameat2` defined for glibc. On other +/// ABIs, `RenameFlags` has no flags defined, and we use plain `renameat`. #[cfg(any( target_os = "android", all(target_os = "linux", not(target_env = "gnu")), @@ -533,32 +512,8 @@ new_path: &CStr, flags: RenameFlags, ) -> io::Result<()> { - // At present, `libc` only has `renameat2` defined for glibc. If we have - // no flags, we can use plain `renameat`, but otherwise we use `syscall!`. - // to call `renameat2` ourselves. - if flags.is_empty() { - renameat(old_dirfd, old_path, new_dirfd, new_path) - } else { - syscall! { - fn renameat2( - olddirfd: c::c_int, - oldpath: *const c::c_char, - newdirfd: c::c_int, - newpath: *const c::c_char, - flags: c::c_uint - ) via SYS_renameat2 -> c::c_int - } - - unsafe { - ret(renameat2( - borrowed_fd(old_dirfd), - c_str(old_path), - borrowed_fd(new_dirfd), - c_str(new_path), - flags.bits(), - )) - } - } + assert!(flags.is_empty()); + renameat(old_dirfd, old_path, new_dirfd, new_path) } pub(crate) fn symlink(old_path: &CStr, new_path: &CStr) -> io::Result<()> { @@ -660,7 +615,7 @@ } } -#[cfg(not(any(target_os = "aix", target_os = "espidf", target_os = "redox")))] +#[cfg(not(any(target_os = "espidf", target_os = "redox")))] pub(crate) fn statat(dirfd: BorrowedFd<'_>, path: &CStr, flags: AtFlags) -> io::Result { // See the comments in `fstat` about using `crate::fs::statx` here. #[cfg(all( @@ -722,17 +677,12 @@ } } -#[cfg(not(any(target_os = "espidf", target_os = "emscripten", target_os = "vita")))] +#[cfg(not(any(target_os = "espidf", target_os = "emscripten")))] pub(crate) fn access(path: &CStr, access: Access) -> io::Result<()> { unsafe { ret(c::access(c_str(path), access.bits())) } } -#[cfg(not(any( - target_os = "emscripten", - target_os = "espidf", - target_os = "redox", - target_os = "vita" -)))] +#[cfg(not(any(target_os = "emscripten", target_os = "espidf", target_os = "redox")))] pub(crate) fn accessat( dirfd: BorrowedFd<'_>, path: &CStr, @@ -798,7 +748,7 @@ Ok(()) } -#[cfg(not(any(target_os = "espidf", target_os = "redox", target_os = "vita")))] +#[cfg(not(any(target_os = "espidf", target_os = "redox")))] pub(crate) fn utimensat( dirfd: BorrowedFd<'_>, path: &CStr, @@ -878,8 +828,8 @@ )); } - // `setattrlistat` was introduced in 10.13 along with `utimensat`, so - // if we don't have `utimensat`, we don't have `setattrlistat` either. + // `setattrlistat` was introduced in 10.13 along with `utimensat`, so if + // we don't have `utimensat`, we don't have `setattrlistat` either. // Emulate it using `fork`, and `fchdir` and [`setattrlist`]. // // [`setattrlist`]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/setattrlist.2.html @@ -972,11 +922,7 @@ .tv_sec .try_into() .map_err(|_| io::Errno::OVERFLOW)?, - tv_nsec: times - .last_access - .tv_nsec - .try_into() - .map_err(|_| io::Errno::OVERFLOW)?, + tv_nsec: times.last_access.tv_nsec, }, c::timespec { tv_sec: times @@ -984,11 +930,7 @@ .tv_sec .try_into() .map_err(|_| io::Errno::OVERFLOW)?, - tv_nsec: times - .last_modification - .tv_nsec - .try_into() - .map_err(|_| io::Errno::OVERFLOW)?, + tv_nsec: times.last_modification.tv_nsec, }, ]; unsafe { @@ -1109,13 +1051,7 @@ } } -#[cfg(not(any( - apple, - target_os = "espidf", - target_os = "redox", - target_os = "vita", - target_os = "wasi" -)))] +#[cfg(not(any(apple, target_os = "espidf", target_os = "redox", target_os = "wasi")))] pub(crate) fn mknodat( dirfd: BorrowedFd<'_>, path: &CStr, @@ -1194,7 +1130,6 @@ target_os = "espidf", target_os = "haiku", target_os = "redox", - target_os = "vita", )))] pub(crate) fn fadvise(fd: BorrowedFd<'_>, offset: u64, len: u64, advice: Advice) -> io::Result<()> { let offset = offset as i64; @@ -1251,7 +1186,6 @@ target_os = "espidf", target_os = "fuchsia", target_os = "redox", - target_os = "vita", target_os = "wasi" )))] #[inline] @@ -1297,8 +1231,8 @@ SeekFrom::Hole(offset) => (c::SEEK_HOLE, offset), }; - // ESP-IDF and Vita don't support 64-bit offsets. - #[cfg(any(target_os = "espidf", target_os = "vita"))] + // ESP-IDF doesn't support 64-bit offsets. + #[cfg(target_os = "espidf")] let offset: i32 = offset.try_into().map_err(|_| io::Errno::OVERFLOW)?; let offset = unsafe { ret_off_t(c::lseek(borrowed_fd(fd), offset, whence))? }; @@ -1330,14 +1264,6 @@ unsafe { ret(fchmod(borrowed_fd(fd), mode.bits() as c::mode_t)) } } -#[cfg(not(target_os = "wasi"))] -pub(crate) fn chown(path: &CStr, owner: Option, group: Option) -> io::Result<()> { - unsafe { - let (ow, gr) = crate::ugid::translate_fchown_args(owner, group); - ret(c::chown(c_str(path), ow, gr)) - } -} - #[cfg(linux_kernel)] pub(crate) fn fchown(fd: BorrowedFd<'_>, owner: Option, group: Option) -> io::Result<()> { // Use `c::syscall` rather than `c::fchown` because some libc @@ -1365,12 +1291,7 @@ } } -#[cfg(not(any( - target_os = "espidf", - target_os = "solaris", - target_os = "vita", - target_os = "wasi" -)))] +#[cfg(not(any(target_os = "espidf", target_os = "solaris", target_os = "wasi")))] pub(crate) fn flock(fd: BorrowedFd<'_>, operation: FlockOperation) -> io::Result<()> { unsafe { ret(c::flock(borrowed_fd(fd), operation as c::c_int)) } } @@ -1392,12 +1313,7 @@ unsafe { ret(syncfs(borrowed_fd(fd))) } } -#[cfg(not(any( - target_os = "espidf", - target_os = "redox", - target_os = "vita", - target_os = "wasi" -)))] +#[cfg(not(any(target_os = "espidf", target_os = "redox", target_os = "wasi")))] pub(crate) fn sync() { unsafe { c::sync() } } @@ -1465,7 +1381,6 @@ target_os = "netbsd", target_os = "nto", target_os = "redox", - target_os = "vita", target_os = "wasi", )))] pub(crate) fn fstatfs(fd: BorrowedFd<'_>) -> io::Result { @@ -1496,16 +1411,13 @@ f_files: from.f_files as u64, f_ffree: from.f_ffree as u64, f_favail: from.f_ffree as u64, - #[cfg(not(target_os = "aix"))] f_fsid: from.f_fsid as u64, - #[cfg(target_os = "aix")] - f_fsid: ((from.f_fsid.val[0] as u64) << 32) | from.f_fsid.val[1], f_flag: StatVfsMountFlags::from_bits_retain(from.f_flag as u64), f_namemax: from.f_namemax as u64, } } -#[cfg(not(any(target_os = "espidf", target_os = "vita")))] +#[cfg(not(target_os = "espidf"))] pub(crate) fn futimens(fd: BorrowedFd<'_>, times: &Timestamps) -> io::Result<()> { // Old 32-bit version: libc has `futimens` but it is not y2038 safe by // default. But there may be a `__futimens64` we can use. @@ -1581,11 +1493,7 @@ .tv_sec .try_into() .map_err(|_| io::Errno::OVERFLOW)?, - tv_nsec: times - .last_access - .tv_nsec - .try_into() - .map_err(|_| io::Errno::OVERFLOW)?, + tv_nsec: times.last_access.tv_nsec, }, c::timespec { tv_sec: times @@ -1593,11 +1501,7 @@ .tv_sec .try_into() .map_err(|_| io::Errno::OVERFLOW)?, - tv_nsec: times - .last_modification - .tv_nsec - .try_into() - .map_err(|_| io::Errno::OVERFLOW)?, + tv_nsec: times.last_modification.tv_nsec, }, ]; @@ -1613,7 +1517,6 @@ target_os = "espidf", target_os = "nto", target_os = "redox", - target_os = "vita", )))] pub(crate) fn fallocate( fd: BorrowedFd<'_>, @@ -1640,8 +1543,7 @@ assert!(mode.is_empty()); let err = unsafe { c::posix_fallocate(borrowed_fd(fd), offset, len) }; - // `posix_fallocate` returns its error status rather than using - // `errno`. + // `posix_fallocate` returns its error status rather than using `errno`. if err == 0 { Ok(()) } else { @@ -1691,7 +1593,6 @@ target_os = "espidf", target_os = "haiku", target_os = "redox", - target_os = "vita", )))] pub(crate) fn fdatasync(fd: BorrowedFd<'_>) -> io::Result<()> { unsafe { ret(c::fdatasync(borrowed_fd(fd))) } @@ -2133,12 +2034,12 @@ } #[cfg(apple)] -pub(crate) fn fcntl_nocache(fd: BorrowedFd<'_>, value: bool) -> io::Result<()> { +pub(crate) fn fcntl_nocache(fd: BorrowedFd, value: bool) -> io::Result<()> { unsafe { ret(c::fcntl(borrowed_fd(fd), c::F_NOCACHE, value as c::c_int)) } } #[cfg(apple)] -pub(crate) fn fcntl_global_nocache(fd: BorrowedFd<'_>, value: bool) -> io::Result<()> { +pub(crate) fn fcntl_global_nocache(fd: BorrowedFd, value: bool) -> io::Result<()> { unsafe { ret(c::fcntl( borrowed_fd(fd), @@ -2504,6 +2405,55 @@ } } +#[cfg(linux_kernel)] +#[inline] +pub(crate) fn ioctl_blksszget(fd: BorrowedFd) -> io::Result { + let mut result = MaybeUninit::::uninit(); + unsafe { + ret(c::ioctl(borrowed_fd(fd), c::BLKSSZGET, result.as_mut_ptr()))?; + Ok(result.assume_init() as u32) + } +} + +#[cfg(linux_kernel)] +#[inline] +pub(crate) fn ioctl_blkpbszget(fd: BorrowedFd) -> io::Result { + let mut result = MaybeUninit::::uninit(); + unsafe { + ret(c::ioctl( + borrowed_fd(fd), + c::BLKPBSZGET, + result.as_mut_ptr(), + ))?; + Ok(result.assume_init() as u32) + } +} + +// Sparc lacks `FICLONE`. +#[cfg(all(linux_kernel, not(any(target_arch = "sparc", target_arch = "sparc64"))))] +pub(crate) fn ioctl_ficlone(fd: BorrowedFd<'_>, src_fd: BorrowedFd<'_>) -> io::Result<()> { + unsafe { + ret(c::ioctl( + borrowed_fd(fd), + c::FICLONE as _, + borrowed_fd(src_fd), + )) + } +} + +#[cfg(linux_kernel)] +#[inline] +pub(crate) fn ext4_ioc_resize_fs(fd: BorrowedFd<'_>, blocks: u64) -> io::Result<()> { + // TODO: Fix linux-raw-sys to define ioctl codes for sparc. + #[cfg(any(target_arch = "sparc", target_arch = "sparc64"))] + const EXT4_IOC_RESIZE_FS: u32 = 0x8008_6610; + + #[cfg(not(any(target_arch = "sparc", target_arch = "sparc64")))] + use linux_raw_sys::ioctl::EXT4_IOC_RESIZE_FS; + + unsafe { ret(c::ioctl(borrowed_fd(fd), EXT4_IOC_RESIZE_FS as _, &blocks)) } +} + #[test] fn test_sizes() { #[cfg(linux_kernel)] diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/libc/fs/types.rs temporalio-1.3.0/vendor/rustix/src/backend/libc/fs/types.rs --- temporalio-1.3.0/vendor/rustix/src/backend/libc/fs/types.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/libc/fs/types.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,7 +1,7 @@ use crate::backend::c; use bitflags::bitflags; -#[cfg(not(any(target_os = "espidf", target_os = "vita")))] +#[cfg(not(target_os = "espidf"))] bitflags! { /// `*_OK` constants for use with [`accessat`]. /// @@ -20,9 +20,6 @@ /// `F_OK` const EXISTS = c::F_OK; - - /// - const _ = !0; } } @@ -76,9 +73,6 @@ /// `AT_STATX_DONT_SYNC` #[cfg(all(target_os = "linux", target_env = "gnu"))] const STATX_DONT_SYNC = bitcast!(c::AT_STATX_DONT_SYNC); - - /// - const _ = !0; } } @@ -92,67 +86,64 @@ #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] pub struct Mode: RawMode { /// `S_IRWXU` - #[cfg(not(any(target_os = "espidf", target_os = "vita")))] + #[cfg(not(any(target_os = "espidf", target_os = "wasi")))] // WASI doesn't have Unix-style mode flags. const RWXU = c::S_IRWXU as RawMode; /// `S_IRUSR` - #[cfg(not(any(target_os = "espidf", target_os = "vita")))] + #[cfg(not(any(target_os = "espidf", target_os = "wasi")))] // WASI doesn't have Unix-style mode flags. const RUSR = c::S_IRUSR as RawMode; /// `S_IWUSR` - #[cfg(not(any(target_os = "espidf", target_os = "vita")))] + #[cfg(not(any(target_os = "espidf", target_os = "wasi")))] // WASI doesn't have Unix-style mode flags. const WUSR = c::S_IWUSR as RawMode; /// `S_IXUSR` - #[cfg(not(any(target_os = "espidf", target_os = "vita")))] + #[cfg(not(any(target_os = "espidf", target_os = "wasi")))] // WASI doesn't have Unix-style mode flags. const XUSR = c::S_IXUSR as RawMode; /// `S_IRWXG` - #[cfg(not(any(target_os = "espidf", target_os = "vita")))] + #[cfg(not(any(target_os = "espidf", target_os = "wasi")))] // WASI doesn't have Unix-style mode flags. const RWXG = c::S_IRWXG as RawMode; /// `S_IRGRP` - #[cfg(not(any(target_os = "espidf", target_os = "vita")))] + #[cfg(not(any(target_os = "espidf", target_os = "wasi")))] // WASI doesn't have Unix-style mode flags. const RGRP = c::S_IRGRP as RawMode; /// `S_IWGRP` - #[cfg(not(any(target_os = "espidf", target_os = "vita")))] + #[cfg(not(any(target_os = "espidf", target_os = "wasi")))] // WASI doesn't have Unix-style mode flags. const WGRP = c::S_IWGRP as RawMode; /// `S_IXGRP` - #[cfg(not(any(target_os = "espidf", target_os = "vita")))] + #[cfg(not(any(target_os = "espidf", target_os = "wasi")))] // WASI doesn't have Unix-style mode flags. const XGRP = c::S_IXGRP as RawMode; /// `S_IRWXO` - #[cfg(not(any(target_os = "espidf", target_os = "vita")))] + #[cfg(not(any(target_os = "espidf", target_os = "wasi")))] // WASI doesn't have Unix-style mode flags. const RWXO = c::S_IRWXO as RawMode; /// `S_IROTH` - #[cfg(not(any(target_os = "espidf", target_os = "vita")))] + #[cfg(not(any(target_os = "espidf", target_os = "wasi")))] // WASI doesn't have Unix-style mode flags. const ROTH = c::S_IROTH as RawMode; /// `S_IWOTH` - #[cfg(not(any(target_os = "espidf", target_os = "vita")))] + #[cfg(not(any(target_os = "espidf", target_os = "wasi")))] // WASI doesn't have Unix-style mode flags. const WOTH = c::S_IWOTH as RawMode; /// `S_IXOTH` - #[cfg(not(any(target_os = "espidf", target_os = "vita")))] + #[cfg(not(any(target_os = "espidf", target_os = "wasi")))] // WASI doesn't have Unix-style mode flags. const XOTH = c::S_IXOTH as RawMode; /// `S_ISUID` - #[cfg(not(any(target_os = "espidf", target_os = "vita")))] + #[cfg(not(any(target_os = "espidf", target_os = "wasi")))] // WASI doesn't have Unix-style mode flags. const SUID = c::S_ISUID as RawMode; /// `S_ISGID` - #[cfg(not(any(target_os = "espidf", target_os = "vita")))] + #[cfg(not(any(target_os = "espidf", target_os = "wasi")))] // WASI doesn't have Unix-style mode flags. const SGID = c::S_ISGID as RawMode; /// `S_ISVTX` - #[cfg(not(any(target_os = "espidf", target_os = "vita")))] + #[cfg(not(any(target_os = "espidf", target_os = "wasi")))] // WASI doesn't have Unix-style mode flags. const SVTX = c::S_ISVTX as RawMode; - - /// - const _ = !0; } } @@ -213,9 +204,9 @@ /// Similar to `ACCMODE`, but just includes the read/write flags, and /// no other flags. /// - /// On some platforms, `PATH` may be included in `ACCMODE`, when + /// Some implementations include `O_PATH` in `O_ACCMODE`, when /// sometimes we really just want the read/write bits. Caution is - /// indicated, as the presence of `PATH` may mean that the read/write + /// indicated, as the presence of `O_PATH` may mean that the read/write /// bits don't have their usual meaning. const RWMODE = bitcast!(c::O_RDONLY | c::O_WRONLY | c::O_RDWR); @@ -231,7 +222,7 @@ const DIRECTORY = bitcast!(c::O_DIRECTORY); /// `O_DSYNC` - #[cfg(not(any(target_os = "dragonfly", target_os = "espidf", target_os = "l4re", target_os = "redox", target_os = "vita")))] + #[cfg(not(any(target_os = "dragonfly", target_os = "espidf", target_os = "l4re", target_os = "redox")))] const DSYNC = bitcast!(c::O_DSYNC); /// `O_EXCL` @@ -263,7 +254,7 @@ const RDWR = bitcast!(c::O_RDWR); /// `O_NOCTTY` - #[cfg(not(any(target_os = "espidf", target_os = "l4re", target_os = "redox", target_os = "vita")))] + #[cfg(not(any(target_os = "espidf", target_os = "l4re", target_os = "redox")))] const NOCTTY = bitcast!(c::O_NOCTTY); /// `O_RSYNC` @@ -327,9 +318,6 @@ /// `O_EMPTY_PATH` #[cfg(target_os = "freebsd")] const EMPTY_PATH = bitcast!(c::O_EMPTY_PATH); - - /// - const _ = !0; } } @@ -346,9 +334,6 @@ /// `CLONE_NOOWNERCOPY` const NOOWNERCOPY = 2; - - /// - const _ = !0; } } @@ -391,9 +376,6 @@ /// `COPYFILE_ALL` const ALL = copyfile::ALL; - - /// - const _ = !0; } } @@ -422,9 +404,6 @@ /// `RESOLVE_CACHED` (since Linux 5.12) const CACHED = 0x20; - - /// - const _ = !0; } } @@ -444,9 +423,6 @@ /// `RENAME_WHITEOUT` const WHITEOUT = bitcast!(c::RENAME_WHITEOUT); - - /// - const _ = !0; } } @@ -523,12 +499,10 @@ /// Construct a `FileType` from the `d_type` field of a `c::dirent`. #[cfg(not(any( solarish, - target_os = "aix", target_os = "espidf", target_os = "haiku", target_os = "nto", - target_os = "redox", - target_os = "vita" + target_os = "redox" )))] #[inline] pub(crate) const fn from_dirent_d_type(d_type: u8) -> Self { @@ -559,7 +533,6 @@ target_os = "espidf", target_os = "haiku", target_os = "redox", - target_os = "vita", )))] #[derive(Debug, Copy, Clone, Eq, PartialEq)] #[repr(u32)] @@ -624,9 +597,6 @@ const HUGE_2GB = c::MFD_HUGE_2GB; /// `MFD_HUGE_16GB` const HUGE_16GB = c::MFD_HUGE_16GB; - - /// - const _ = !0; } } @@ -640,20 +610,17 @@ #[repr(transparent)] #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] pub struct SealFlags: u32 { - /// `F_SEAL_SEAL` - const SEAL = bitcast!(c::F_SEAL_SEAL); - /// `F_SEAL_SHRINK` - const SHRINK = bitcast!(c::F_SEAL_SHRINK); - /// `F_SEAL_GROW` - const GROW = bitcast!(c::F_SEAL_GROW); - /// `F_SEAL_WRITE` - const WRITE = bitcast!(c::F_SEAL_WRITE); - /// `F_SEAL_FUTURE_WRITE` (since Linux 5.1) - #[cfg(linux_kernel)] - const FUTURE_WRITE = bitcast!(c::F_SEAL_FUTURE_WRITE); - - /// - const _ = !0; + /// `F_SEAL_SEAL`. + const SEAL = bitcast!(c::F_SEAL_SEAL); + /// `F_SEAL_SHRINK`. + const SHRINK = bitcast!(c::F_SEAL_SHRINK); + /// `F_SEAL_GROW`. + const GROW = bitcast!(c::F_SEAL_GROW); + /// `F_SEAL_WRITE`. + const WRITE = bitcast!(c::F_SEAL_WRITE); + /// `F_SEAL_FUTURE_WRITE` (since Linux 5.1) + #[cfg(linux_kernel)] + const FUTURE_WRITE = bitcast!(c::F_SEAL_FUTURE_WRITE); } } @@ -712,9 +679,6 @@ /// `STATX_ALL` const ALL = c::STATX_ALL; - - /// - const _ = !0; } } @@ -773,9 +737,6 @@ /// `STATX_ALL` const ALL = 0xfff; - - /// - const _ = !0; } } @@ -785,8 +746,7 @@ target_os = "aix", target_os = "espidf", target_os = "nto", - target_os = "redox", - target_os = "vita" + target_os = "redox" )))] bitflags! { /// `FALLOC_FL_*` constants for use with [`fallocate`]. @@ -800,7 +760,6 @@ bsd, target_os = "aix", target_os = "haiku", - target_os = "hurd", target_os = "wasi", )))] const KEEP_SIZE = bitcast!(c::FALLOC_FL_KEEP_SIZE); @@ -809,7 +768,6 @@ bsd, target_os = "aix", target_os = "haiku", - target_os = "hurd", target_os = "wasi", )))] const PUNCH_HOLE = bitcast!(c::FALLOC_FL_PUNCH_HOLE); @@ -820,7 +778,6 @@ target_os = "emscripten", target_os = "fuchsia", target_os = "haiku", - target_os = "hurd", target_os = "l4re", target_os = "linux", target_os = "wasi", @@ -831,7 +788,6 @@ bsd, target_os = "aix", target_os = "haiku", - target_os = "hurd", target_os = "emscripten", target_os = "wasi", )))] @@ -841,7 +797,6 @@ bsd, target_os = "aix", target_os = "haiku", - target_os = "hurd", target_os = "emscripten", target_os = "wasi", )))] @@ -851,7 +806,6 @@ bsd, target_os = "aix", target_os = "haiku", - target_os = "hurd", target_os = "emscripten", target_os = "wasi", )))] @@ -861,14 +815,10 @@ bsd, target_os = "aix", target_os = "haiku", - target_os = "hurd", target_os = "emscripten", target_os = "wasi", )))] const UNSHARE_RANGE = bitcast!(c::FALLOC_FL_UNSHARE_RANGE); - - /// - const _ = !0; } } @@ -904,11 +854,11 @@ const NOEXEC = c::ST_NOEXEC as u64; /// `ST_NOSUID` - #[cfg(not(any(target_os = "espidf", target_os = "vita")))] + #[cfg(not(target_os = "espidf"))] const NOSUID = c::ST_NOSUID as u64; /// `ST_RDONLY` - #[cfg(not(any(target_os = "espidf", target_os = "vita")))] + #[cfg(not(target_os = "espidf"))] const RDONLY = c::ST_RDONLY as u64; /// `ST_RELATIME` @@ -918,9 +868,6 @@ /// `ST_SYNCHRONOUS` #[cfg(any(linux_kernel, target_os = "emscripten", target_os = "fuchsia"))] const SYNCHRONOUS = c::ST_SYNCHRONOUS as u64; - - /// - const _ = !0; } } @@ -928,7 +875,7 @@ /// /// [`flock`]: crate::fs::flock /// [`fcntl_lock`]: crate::fs::fcntl_lock -#[cfg(not(any(target_os = "espidf", target_os = "vita", target_os = "wasi")))] +#[cfg(not(any(target_os = "espidf", target_os = "wasi")))] #[derive(Clone, Copy, Debug, PartialEq, Eq)] #[repr(u32)] pub enum FlockOperation { @@ -950,7 +897,7 @@ /// /// [`statat`]: crate::fs::statat /// [`fstat`]: crate::fs::fstat -#[cfg(not(any(linux_like, target_os = "hurd")))] +#[cfg(not(linux_like))] pub type Stat = c::stat; /// `struct stat` for use with [`statat`] and [`fstat`]. @@ -959,7 +906,6 @@ /// [`fstat`]: crate::fs::fstat #[cfg(any( all(linux_kernel, target_pointer_width = "64"), - target_os = "hurd", target_os = "emscripten", target_os = "l4re", ))] @@ -1007,7 +953,6 @@ target_os = "netbsd", target_os = "nto", target_os = "redox", - target_os = "vita", target_os = "wasi", )))] #[allow(clippy::module_name_repetitions)] diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/libc/io/errno.rs temporalio-1.3.0/vendor/rustix/src/backend/libc/io/errno.rs --- temporalio-1.3.0/vendor/rustix/src/backend/libc/io/errno.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/libc/io/errno.rs 2023-10-30 19:40:00.000000000 +0000 @@ -6,32 +6,10 @@ use crate::backend::c; use libc_errno::errno; -/// `errno`—An error code. +/// The error type for `rustix` APIs. /// -/// The error type for `rustix` APIs. This is similar to [`std::io::Error`], -/// but only holds an OS error code, and no extra error value. -/// -/// # References -/// - [POSIX] -/// - [Linux] -/// - [Winsock2] -/// - [FreeBSD] -/// - [NetBSD] -/// - [OpenBSD] -/// - [DragonFly BSD] -/// - [illumos] -/// - [glibc] -/// -/// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/errno.html -/// [Linux]: https://man7.org/linux/man-pages/man3/errno.3.html -/// [Winsock2]: https://learn.microsoft.com/en-us/windows/win32/winsock/windows-sockets-error-codes-2 -/// [FreeBSD]: https://man.freebsd.org/cgi/man.cgi?errno -/// [NetBSD]: https://man.netbsd.org/errno.2 -/// [OpenBSD]: https://man.openbsd.org/errno.2 -/// [DragonFly BSD]: https://man.dragonflybsd.org/?command=errno§ion=2 -/// [illumos]: https://illumos.org/man/3C/errno -/// [glibc]: https://www.gnu.org/software/libc/manual/html_node/Error-Codes.html -/// [`std::io::Error`]: Result +/// This is similar to `std::io::Error`, but only holds an OS error code, +/// and no extra error value. #[repr(transparent)] #[doc(alias = "errno")] #[derive(Eq, PartialEq, Hash, Copy, Clone)] @@ -52,9 +30,7 @@ target_os = "aix", target_os = "espidf", target_os = "haiku", - target_os = "hurd", target_os = "l4re", - target_os = "vita", target_os = "wasi", )))] pub const ADV: Self = Self(c::EADV); @@ -76,9 +52,7 @@ target_os = "aix", target_os = "espidf", target_os = "haiku", - target_os = "hurd", target_os = "l4re", - target_os = "vita", target_os = "wasi", )))] pub const BADE: Self = Self(c::EBADE); @@ -91,9 +65,7 @@ target_os = "aix", target_os = "espidf", target_os = "haiku", - target_os = "hurd", target_os = "l4re", - target_os = "vita", target_os = "wasi", )))] pub const BADFD: Self = Self(c::EBADFD); @@ -107,9 +79,7 @@ target_os = "aix", target_os = "espidf", target_os = "haiku", - target_os = "hurd", target_os = "l4re", - target_os = "vita", target_os = "wasi", )))] pub const BADR: Self = Self(c::EBADR); @@ -123,9 +93,7 @@ target_os = "aix", target_os = "espidf", target_os = "haiku", - target_os = "hurd", target_os = "l4re", - target_os = "vita", target_os = "wasi", )))] pub const BADRQC: Self = Self(c::EBADRQC); @@ -136,9 +104,7 @@ target_os = "aix", target_os = "espidf", target_os = "haiku", - target_os = "hurd", target_os = "l4re", - target_os = "vita", target_os = "wasi", )))] pub const BADSLT: Self = Self(c::EBADSLT); @@ -149,9 +115,7 @@ target_os = "aix", target_os = "espidf", target_os = "haiku", - target_os = "hurd", target_os = "l4re", - target_os = "vita", target_os = "wasi", )))] pub const BFONT: Self = Self(c::EBFONT); @@ -173,9 +137,7 @@ windows, target_os = "espidf", target_os = "haiku", - target_os = "hurd", target_os = "l4re", - target_os = "vita", target_os = "wasi" )))] pub const CHRNG: Self = Self(c::ECHRNG); @@ -186,9 +148,7 @@ target_os = "aix", target_os = "espidf", target_os = "haiku", - target_os = "hurd", target_os = "l4re", - target_os = "vita", target_os = "wasi", )))] pub const COMM: Self = Self(c::ECOMM); @@ -209,8 +169,6 @@ target_os = "android", target_os = "espidf", target_os = "haiku", - target_os = "hurd", - target_os = "vita", target_os = "wasi", )))] pub const DEADLOCK: Self = Self(c::EDEADLOCK); @@ -234,10 +192,8 @@ target_os = "aix", target_os = "espidf", target_os = "haiku", - target_os = "hurd", target_os = "l4re", target_os = "nto", - target_os = "vita", target_os = "wasi", )))] pub const DOTDOT: Self = Self(c::EDOTDOT); @@ -268,11 +224,9 @@ target_os = "android", target_os = "espidf", target_os = "haiku", - target_os = "hurd", target_os = "l4re", target_os = "nto", target_os = "redox", - target_os = "vita", target_os = "wasi", )))] pub const HWPOISON: Self = Self(c::EHWPOISON); @@ -317,10 +271,8 @@ target_os = "aix", target_os = "espidf", target_os = "haiku", - target_os = "hurd", target_os = "l4re", target_os = "nto", - target_os = "vita", target_os = "wasi", )))] pub const ISNAM: Self = Self(c::EISNAM); @@ -332,10 +284,8 @@ target_os = "aix", target_os = "espidf", target_os = "haiku", - target_os = "hurd", target_os = "l4re", target_os = "nto", - target_os = "vita", target_os = "wasi", )))] pub const KEYEXPIRED: Self = Self(c::EKEYEXPIRED); @@ -347,10 +297,8 @@ target_os = "aix", target_os = "espidf", target_os = "haiku", - target_os = "hurd", target_os = "l4re", target_os = "nto", - target_os = "vita", target_os = "wasi", )))] pub const KEYREJECTED: Self = Self(c::EKEYREJECTED); @@ -362,10 +310,8 @@ target_os = "aix", target_os = "espidf", target_os = "haiku", - target_os = "hurd", target_os = "l4re", target_os = "nto", - target_os = "vita", target_os = "wasi", )))] pub const KEYREVOKED: Self = Self(c::EKEYREVOKED); @@ -375,9 +321,7 @@ windows, target_os = "espidf", target_os = "haiku", - target_os = "hurd", target_os = "l4re", - target_os = "vita", target_os = "wasi" )))] pub const L2HLT: Self = Self(c::EL2HLT); @@ -387,9 +331,7 @@ windows, target_os = "espidf", target_os = "haiku", - target_os = "hurd", target_os = "l4re", - target_os = "vita", target_os = "wasi" )))] pub const L2NSYNC: Self = Self(c::EL2NSYNC); @@ -399,9 +341,7 @@ windows, target_os = "espidf", target_os = "haiku", - target_os = "hurd", target_os = "l4re", - target_os = "vita", target_os = "wasi" )))] pub const L3HLT: Self = Self(c::EL3HLT); @@ -411,9 +351,7 @@ windows, target_os = "espidf", target_os = "haiku", - target_os = "hurd", target_os = "l4re", - target_os = "vita", target_os = "wasi" )))] pub const L3RST: Self = Self(c::EL3RST); @@ -424,9 +362,7 @@ target_os = "aix", target_os = "espidf", target_os = "haiku", - target_os = "hurd", target_os = "l4re", - target_os = "vita", target_os = "wasi", )))] pub const LIBACC: Self = Self(c::ELIBACC); @@ -437,9 +373,7 @@ target_os = "aix", target_os = "espidf", target_os = "haiku", - target_os = "hurd", target_os = "l4re", - target_os = "vita", target_os = "wasi", )))] pub const LIBBAD: Self = Self(c::ELIBBAD); @@ -451,7 +385,6 @@ target_os = "espidf", target_os = "haiku", target_os = "l4re", - target_os = "vita", target_os = "wasi", )))] pub const LIBEXEC: Self = Self(c::ELIBEXEC); @@ -462,9 +395,7 @@ target_os = "aix", target_os = "espidf", target_os = "haiku", - target_os = "hurd", target_os = "l4re", - target_os = "vita", target_os = "wasi", )))] pub const LIBMAX: Self = Self(c::ELIBMAX); @@ -475,9 +406,7 @@ target_os = "aix", target_os = "espidf", target_os = "haiku", - target_os = "hurd", target_os = "l4re", - target_os = "vita", target_os = "wasi", )))] pub const LIBSCN: Self = Self(c::ELIBSCN); @@ -487,9 +416,7 @@ windows, target_os = "espidf", target_os = "haiku", - target_os = "hurd", target_os = "l4re", - target_os = "vita", target_os = "wasi" )))] pub const LNRNG: Self = Self(c::ELNRNG); @@ -503,10 +430,8 @@ target_os = "aix", target_os = "espidf", target_os = "haiku", - target_os = "hurd", target_os = "l4re", target_os = "nto", - target_os = "vita", target_os = "wasi", )))] pub const MEDIUMTYPE: Self = Self(c::EMEDIUMTYPE); @@ -531,10 +456,8 @@ target_os = "aix", target_os = "espidf", target_os = "haiku", - target_os = "hurd", target_os = "l4re", target_os = "nto", - target_os = "vita", target_os = "wasi", )))] pub const NAVAIL: Self = Self(c::ENAVAIL); @@ -558,9 +481,7 @@ target_os = "aix", target_os = "espidf", target_os = "haiku", - target_os = "hurd", target_os = "l4re", - target_os = "vita", target_os = "wasi", )))] pub const NOANO: Self = Self(c::ENOANO); @@ -576,9 +497,7 @@ windows, target_os = "espidf", target_os = "haiku", - target_os = "hurd", target_os = "l4re", - target_os = "vita", target_os = "wasi" )))] pub const NOCSI: Self = Self(c::ENOCSI); @@ -608,10 +527,8 @@ target_os = "aix", target_os = "espidf", target_os = "haiku", - target_os = "hurd", target_os = "l4re", target_os = "nto", - target_os = "vita", target_os = "wasi", )))] pub const NOKEY: Self = Self(c::ENOKEY); @@ -629,10 +546,8 @@ target_os = "aix", target_os = "espidf", target_os = "haiku", - target_os = "hurd", target_os = "l4re", target_os = "nto", - target_os = "vita", target_os = "wasi", )))] pub const NOMEDIUM: Self = Self(c::ENOMEDIUM); @@ -652,9 +567,7 @@ target_os = "aix", target_os = "espidf", target_os = "haiku", - target_os = "hurd", target_os = "l4re", - target_os = "vita", target_os = "wasi", )))] pub const NONET: Self = Self(c::ENONET); @@ -665,9 +578,7 @@ target_os = "aix", target_os = "espidf", target_os = "haiku", - target_os = "hurd", target_os = "l4re", - target_os = "vita", target_os = "wasi", )))] pub const NOPKG: Self = Self(c::ENOPKG); @@ -701,13 +612,7 @@ #[cfg(not(windows))] pub const NOSYS: Self = Self(c::ENOSYS); /// `ENOTBLK` - #[cfg(not(any( - windows, - target_os = "espidf", - target_os = "haiku", - target_os = "vita", - target_os = "wasi" - )))] + #[cfg(not(any(windows, target_os = "espidf", target_os = "haiku", target_os = "wasi")))] pub const NOTBLK: Self = Self(c::ENOTBLK); /// `ENOTCAPABLE` #[cfg(any(target_os = "freebsd", target_os = "wasi"))] @@ -727,10 +632,8 @@ target_os = "aix", target_os = "espidf", target_os = "haiku", - target_os = "hurd", target_os = "l4re", target_os = "nto", - target_os = "vita", target_os = "wasi", )))] pub const NOTNAM: Self = Self(c::ENOTNAM); @@ -759,9 +662,7 @@ target_os = "aix", target_os = "espidf", target_os = "haiku", - target_os = "hurd", target_os = "l4re", - target_os = "vita", target_os = "wasi", )))] pub const NOTUNIQ: Self = Self(c::ENOTUNIQ); @@ -828,9 +729,7 @@ target_os = "aix", target_os = "espidf", target_os = "haiku", - target_os = "hurd", target_os = "l4re", - target_os = "vita", target_os = "wasi", )))] pub const REMCHG: Self = Self(c::EREMCHG); @@ -839,7 +738,6 @@ target_os = "espidf", target_os = "haiku", target_os = "l4re", - target_os = "vita", target_os = "wasi" )))] pub const REMOTE: Self = Self(c::EREMOTE); @@ -851,10 +749,8 @@ target_os = "aix", target_os = "espidf", target_os = "haiku", - target_os = "hurd", target_os = "l4re", target_os = "nto", - target_os = "vita", target_os = "wasi", )))] pub const REMOTEIO: Self = Self(c::EREMOTEIO); @@ -864,9 +760,7 @@ windows, target_os = "espidf", target_os = "haiku", - target_os = "hurd", target_os = "l4re", - target_os = "vita", target_os = "wasi" )))] pub const RESTART: Self = Self(c::ERESTART); @@ -879,11 +773,9 @@ target_os = "android", target_os = "espidf", target_os = "haiku", - target_os = "hurd", target_os = "l4re", target_os = "nto", target_os = "redox", - target_os = "vita", target_os = "wasi", )))] pub const RFKILL: Self = Self(c::ERFKILL); @@ -894,19 +786,13 @@ #[cfg(bsd)] pub const RPCMISMATCH: Self = Self(c::ERPCMISMATCH); /// `ESHUTDOWN` - #[cfg(not(any( - target_os = "espidf", - target_os = "l4re", - target_os = "vita", - target_os = "wasi" - )))] + #[cfg(not(any(target_os = "espidf", target_os = "l4re", target_os = "wasi")))] pub const SHUTDOWN: Self = Self(c::ESHUTDOWN); /// `ESOCKTNOSUPPORT` #[cfg(not(any( target_os = "espidf", target_os = "haiku", target_os = "l4re", - target_os = "vita", target_os = "wasi" )))] pub const SOCKTNOSUPPORT: Self = Self(c::ESOCKTNOSUPPORT); @@ -923,9 +809,7 @@ target_os = "aix", target_os = "espidf", target_os = "haiku", - target_os = "hurd", target_os = "l4re", - target_os = "vita", target_os = "wasi", )))] pub const SRMNT: Self = Self(c::ESRMNT); @@ -938,9 +822,7 @@ target_os = "aix", target_os = "espidf", target_os = "haiku", - target_os = "hurd", target_os = "l4re", - target_os = "vita", target_os = "wasi", )))] pub const STRPIPE: Self = Self(c::ESTRPIPE); @@ -973,10 +855,8 @@ target_os = "aix", target_os = "espidf", target_os = "haiku", - target_os = "hurd", target_os = "l4re", target_os = "nto", - target_os = "vita", target_os = "wasi", )))] pub const UCLEAN: Self = Self(c::EUCLEAN); @@ -986,9 +866,7 @@ windows, target_os = "espidf", target_os = "haiku", - target_os = "hurd", target_os = "l4re", - target_os = "vita", target_os = "wasi" )))] pub const UNATCH: Self = Self(c::EUNATCH); @@ -997,7 +875,6 @@ target_os = "espidf", target_os = "haiku", target_os = "l4re", - target_os = "vita", target_os = "wasi" )))] pub const USERS: Self = Self(c::EUSERS); @@ -1013,9 +890,7 @@ target_os = "aix", target_os = "espidf", target_os = "haiku", - target_os = "hurd", target_os = "l4re", - target_os = "vita", target_os = "wasi", )))] pub const XFULL: Self = Self(c::EXFULL); diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/libc/io/syscalls.rs temporalio-1.3.0/vendor/rustix/src/backend/libc/io/syscalls.rs --- temporalio-1.3.0/vendor/rustix/src/backend/libc/io/syscalls.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/libc/io/syscalls.rs 2023-10-30 19:40:00.000000000 +0000 @@ -9,14 +9,12 @@ target_os = "aix", target_os = "espidf", target_os = "nto", - target_os = "vita", target_os = "wasi" )))] use crate::io::DupFlags; #[cfg(linux_kernel)] use crate::io::ReadWriteFlags; use crate::io::{self, FdFlags}; -use crate::ioctl::{IoctlOutput, RawOpcode}; use core::cmp::min; #[cfg(all(feature = "fs", feature = "net"))] use libc_errno::errno; @@ -52,8 +50,8 @@ // Silently cast; we'll get `EINVAL` if the value is negative. let offset = offset as i64; - // ESP-IDF and Vita don't support 64-bit offsets. - #[cfg(any(target_os = "espidf", target_os = "vita"))] + // ESP-IDF doesn't support 64-bit offsets. + #[cfg(target_os = "espidf")] let offset: i32 = offset.try_into().map_err(|_| io::Errno::OVERFLOW)?; unsafe { @@ -72,15 +70,15 @@ // Silently cast; we'll get `EINVAL` if the value is negative. let offset = offset as i64; - // ESP-IDF and Vita don't support 64-bit offsets. - #[cfg(any(target_os = "espidf", target_os = "vita"))] + // ESP-IDF doesn't support 64-bit offsets. + #[cfg(target_os = "espidf")] let offset: i32 = offset.try_into().map_err(|_| io::Errno::OVERFLOW)?; unsafe { ret_usize(c::pwrite(borrowed_fd(fd), buf.as_ptr().cast(), len, offset)) } } #[cfg(not(target_os = "espidf"))] -pub(crate) fn readv(fd: BorrowedFd<'_>, bufs: &mut [IoSliceMut<'_>]) -> io::Result { +pub(crate) fn readv(fd: BorrowedFd<'_>, bufs: &mut [IoSliceMut]) -> io::Result { unsafe { ret_usize(c::readv( borrowed_fd(fd), @@ -91,7 +89,7 @@ } #[cfg(not(target_os = "espidf"))] -pub(crate) fn writev(fd: BorrowedFd<'_>, bufs: &[IoSlice<'_>]) -> io::Result { +pub(crate) fn writev(fd: BorrowedFd<'_>, bufs: &[IoSlice]) -> io::Result { unsafe { ret_usize(c::writev( borrowed_fd(fd), @@ -106,12 +104,11 @@ target_os = "haiku", target_os = "nto", target_os = "redox", - target_os = "solaris", - target_os = "vita" + target_os = "solaris" )))] pub(crate) fn preadv( fd: BorrowedFd<'_>, - bufs: &mut [IoSliceMut<'_>], + bufs: &mut [IoSliceMut], offset: u64, ) -> io::Result { // Silently cast; we'll get `EINVAL` if the value is negative. @@ -131,10 +128,9 @@ target_os = "haiku", target_os = "nto", target_os = "redox", - target_os = "solaris", - target_os = "vita" + target_os = "solaris" )))] -pub(crate) fn pwritev(fd: BorrowedFd<'_>, bufs: &[IoSlice<'_>], offset: u64) -> io::Result { +pub(crate) fn pwritev(fd: BorrowedFd<'_>, bufs: &[IoSlice], offset: u64) -> io::Result { // Silently cast; we'll get `EINVAL` if the value is negative. let offset = offset as i64; unsafe { @@ -150,7 +146,7 @@ #[cfg(linux_kernel)] pub(crate) fn preadv2( fd: BorrowedFd<'_>, - bufs: &mut [IoSliceMut<'_>], + bufs: &mut [IoSliceMut], offset: u64, flags: ReadWriteFlags, ) -> io::Result { @@ -170,7 +166,7 @@ #[cfg(linux_kernel)] pub(crate) fn pwritev2( fd: BorrowedFd<'_>, - bufs: &[IoSlice<'_>], + bufs: &[IoSlice], offset: u64, flags: ReadWriteFlags, ) -> io::Result { @@ -207,22 +203,25 @@ let _ = c::close(raw_fd as c::c_int); } -#[inline] -pub(crate) unsafe fn ioctl( - fd: BorrowedFd<'_>, - request: RawOpcode, - arg: *mut c::c_void, -) -> io::Result { - ret_c_int(c::ioctl(borrowed_fd(fd), request, arg)) +#[cfg(not(target_os = "espidf"))] +pub(crate) fn ioctl_fionread(fd: BorrowedFd<'_>) -> io::Result { + use core::mem::MaybeUninit; + + let mut nread = MaybeUninit::::uninit(); + unsafe { + ret(c::ioctl(borrowed_fd(fd), c::FIONREAD, nread.as_mut_ptr()))?; + // `FIONREAD` returns the number of bytes silently casted to a `c_int`, + // even when this is lossy. The best we can do is convert it back to a + // `u64` without sign-extending it back first. + Ok(u64::from(nread.assume_init() as c::c_uint)) + } } -#[inline] -pub(crate) unsafe fn ioctl_readonly( - fd: BorrowedFd<'_>, - request: RawOpcode, - arg: *mut c::c_void, -) -> io::Result { - ioctl(fd, request, arg) +pub(crate) fn ioctl_fionbio(fd: BorrowedFd<'_>, value: bool) -> io::Result<()> { + unsafe { + let data = value as c::c_int; + ret(c::ioctl(borrowed_fd(fd), c::FIONBIO, &data)) + } } #[cfg(not(any(target_os = "redox", target_os = "wasi")))] @@ -303,13 +302,11 @@ unsafe { ret_owned_fd(c::dup(borrowed_fd(fd))) } } -#[allow(clippy::needless_pass_by_ref_mut)] #[cfg(not(target_os = "wasi"))] pub(crate) fn dup2(fd: BorrowedFd<'_>, new: &mut OwnedFd) -> io::Result<()> { unsafe { ret_discarded_fd(c::dup2(borrowed_fd(fd), borrowed_fd(new.as_fd()))) } } -#[allow(clippy::needless_pass_by_ref_mut)] #[cfg(not(any( apple, target_os = "aix", @@ -319,7 +316,6 @@ target_os = "haiku", target_os = "nto", target_os = "redox", - target_os = "vita", target_os = "wasi", )))] pub(crate) fn dup3(fd: BorrowedFd<'_>, new: &mut OwnedFd, flags: DupFlags) -> io::Result<()> { @@ -346,3 +342,14 @@ // have an `&mut OwnedFd` which means `fd` doesn't alias it. dup2(fd, new) } + +#[cfg(apple)] +pub(crate) fn ioctl_fioclex(fd: BorrowedFd<'_>) -> io::Result<()> { + unsafe { + ret(c::ioctl( + borrowed_fd(fd), + c::FIOCLEX, + core::ptr::null_mut::(), + )) + } +} diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/libc/io/types.rs temporalio-1.3.0/vendor/rustix/src/backend/libc/io/types.rs --- temporalio-1.3.0/vendor/rustix/src/backend/libc/io/types.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/libc/io/types.rs 2023-10-30 19:40:00.000000000 +0000 @@ -11,9 +11,6 @@ pub struct FdFlags: u32 { /// `FD_CLOEXEC` const CLOEXEC = bitcast!(c::FD_CLOEXEC); - - /// - const _ = !0; } } @@ -36,9 +33,6 @@ const NOWAIT = linux_raw_sys::general::RWF_NOWAIT; /// `RWF_APPEND` (since Linux 4.16) const APPEND = linux_raw_sys::general::RWF_APPEND; - - /// - const _ = !0; } } @@ -58,8 +52,5 @@ target_os = "redox", )))] // Android 5.0 has dup3, but libc doesn't have bindings const CLOEXEC = bitcast!(c::O_CLOEXEC); - - /// - const _ = !0; } } diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/libc/io/windows_syscalls.rs temporalio-1.3.0/vendor/rustix/src/backend/libc/io/windows_syscalls.rs --- temporalio-1.3.0/vendor/rustix/src/backend/libc/io/windows_syscalls.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/libc/io/windows_syscalls.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,30 +1,27 @@ //! Windows system calls in the `io` module. use crate::backend::c; -use crate::backend::conv::{borrowed_fd, ret_c_int}; +use crate::backend::conv::{borrowed_fd, ret}; use crate::backend::fd::LibcFd; use crate::fd::{BorrowedFd, RawFd}; use crate::io; -use crate::ioctl::{IoctlOutput, RawOpcode}; +use core::mem::MaybeUninit; pub(crate) unsafe fn close(raw_fd: RawFd) { let _ = c::close(raw_fd as LibcFd); } -#[inline] -pub(crate) unsafe fn ioctl( - fd: BorrowedFd<'_>, - request: RawOpcode, - arg: *mut c::c_void, -) -> io::Result { - ret_c_int(c::ioctl(borrowed_fd(fd), request, arg.cast())) +pub(crate) fn ioctl_fionread(fd: BorrowedFd<'_>) -> io::Result { + let mut nread = MaybeUninit::::uninit(); + unsafe { + ret(c::ioctl(borrowed_fd(fd), c::FIONREAD, nread.as_mut_ptr()))?; + Ok(u64::from(nread.assume_init())) + } } -#[inline] -pub(crate) unsafe fn ioctl_readonly( - fd: BorrowedFd<'_>, - request: RawOpcode, - arg: *mut c::c_void, -) -> io::Result { - ioctl(fd, request, arg) +pub(crate) fn ioctl_fionbio(fd: BorrowedFd<'_>, value: bool) -> io::Result<()> { + unsafe { + let mut data = value as c::c_uint; + ret(c::ioctl(borrowed_fd(fd), c::FIONBIO, &mut data)) + } } diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/libc/mm/syscalls.rs temporalio-1.3.0/vendor/rustix/src/backend/libc/mm/syscalls.rs --- temporalio-1.3.0/vendor/rustix/src/backend/libc/mm/syscalls.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/libc/mm/syscalls.rs 2023-10-30 19:40:00.000000000 +0000 @@ -2,8 +2,6 @@ #[cfg(not(target_os = "redox"))] use super::types::Advice; -#[cfg(any(linux_kernel, freebsdlike, netbsdlike))] -use super::types::MlockAllFlags; #[cfg(any(target_os = "emscripten", target_os = "linux"))] use super::types::MremapFlags; use super::types::{MapFlags, MprotectFlags, MsyncFlags, ProtFlags}; @@ -222,23 +220,3 @@ } ret_owned_fd(userfaultfd(bitflags_bits!(flags))) } - -/// Locks all pages mapped into the address space of the calling process. -/// -/// This includes the pages of the code, data, and stack segment, as well as -/// shared libraries, user space kernel data, shared memory, and memory-mapped -/// files. All mapped pages are guaranteed to be resident in RAM when the call -/// returns successfully; the pages are guaranteed to stay in RAM until later -/// unlocked. -#[inline] -#[cfg(any(linux_kernel, freebsdlike, netbsdlike))] -pub(crate) fn mlockall(flags: MlockAllFlags) -> io::Result<()> { - unsafe { ret(c::mlockall(bitflags_bits!(flags))) } -} - -/// Unlocks all pages mapped into the address space of the calling process. -#[inline] -#[cfg(any(linux_kernel, freebsdlike, netbsdlike))] -pub(crate) fn munlockall() -> io::Result<()> { - unsafe { ret(c::munlockall()) } -} diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/libc/mm/types.rs temporalio-1.3.0/vendor/rustix/src/backend/libc/mm/types.rs --- temporalio-1.3.0/vendor/rustix/src/backend/libc/mm/types.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/libc/mm/types.rs 2023-10-30 19:40:00.000000000 +0000 @@ -16,9 +16,6 @@ const WRITE = bitcast!(c::PROT_WRITE); /// `PROT_EXEC` const EXEC = bitcast!(c::PROT_EXEC); - - /// - const _ = !0; } } @@ -58,9 +55,6 @@ /// `PROT_ADI` #[cfg(all(linux_kernel, any(target_arch = "sparc", target_arch = "sparc64")))] const ADI = linux_raw_sys::general::PROT_ADI; - - /// - const _ = !0; } } @@ -80,7 +74,6 @@ #[cfg(not(any( bsd, solarish, - target_os = "aix", target_os = "android", target_os = "emscripten", target_os = "fuchsia", @@ -95,7 +88,6 @@ #[cfg(not(any( bsd, solarish, - target_os = "aix", target_os = "haiku", target_os = "nto", target_os = "redox", @@ -107,7 +99,6 @@ #[cfg(not(any( bsd, solarish, - target_os = "aix", target_os = "android", target_os = "emscripten", target_os = "fuchsia", @@ -120,7 +111,6 @@ #[cfg(not(any( bsd, solarish, - target_os = "aix", target_os = "haiku", target_os = "nto", target_os = "redox", @@ -130,7 +120,6 @@ #[cfg(not(any( bsd, solarish, - target_os = "aix", target_os = "haiku", target_os = "nto", target_os = "redox", @@ -140,7 +129,6 @@ #[cfg(not(any( bsd, solarish, - target_os = "aix", target_os = "android", target_os = "emscripten", target_os = "fuchsia", @@ -153,7 +141,6 @@ #[cfg(not(any( bsd, solarish, - target_os = "aix", target_os = "android", target_os = "emscripten", target_os = "fuchsia", @@ -166,7 +153,6 @@ #[cfg(not(any( bsd, solarish, - target_os = "aix", target_os = "haiku", target_os = "nto", target_os = "redox", @@ -176,12 +162,7 @@ #[cfg(freebsdlike)] const NOCORE = bitcast!(c::MAP_NOCORE); /// `MAP_NORESERVE` - #[cfg(not(any( - freebsdlike, - target_os = "aix", - target_os = "nto", - target_os = "redox", - )))] + #[cfg(not(any(freebsdlike, target_os = "nto", target_os = "redox")))] const NORESERVE = bitcast!(c::MAP_NORESERVE); /// `MAP_NOSYNC` #[cfg(freebsdlike)] @@ -190,7 +171,6 @@ #[cfg(not(any( bsd, solarish, - target_os = "aix", target_os = "haiku", target_os = "nto", target_os = "redox", @@ -200,7 +180,6 @@ #[cfg(not(any( apple, solarish, - target_os = "aix", target_os = "dragonfly", target_os = "haiku", target_os = "netbsd", @@ -214,7 +193,6 @@ #[cfg(not(any( bsd, solarish, - target_os = "aix", target_os = "android", target_os = "emscripten", target_os = "fuchsia", @@ -230,9 +208,6 @@ /// `MAP_UNINITIALIZED` #[cfg(any())] const UNINITIALIZED = bitcast!(c::MAP_UNINITIALIZED); - - /// - const _ = !0; } } @@ -249,9 +224,6 @@ pub struct MremapFlags: u32 { /// `MREMAP_MAYMOVE` const MAYMOVE = bitcast!(c::MREMAP_MAYMOVE); - - /// - const _ = !0; } } @@ -271,9 +243,6 @@ /// file (so that they can be updated with the fresh values just /// written). const INVALIDATE = bitcast!(c::MS_INVALIDATE); - - /// - const _ = !0; } } @@ -287,9 +256,6 @@ pub struct MlockFlags: u32 { /// `MLOCK_ONFAULT` const ONFAULT = bitcast!(c::MLOCK_ONFAULT); - - /// - const _ = !0; } } @@ -437,32 +403,5 @@ const CLOEXEC = bitcast!(c::O_CLOEXEC); /// `O_NONBLOCK` const NONBLOCK = bitcast!(c::O_NONBLOCK); - - /// - const _ = !0; - } -} - -#[cfg(any(linux_kernel, freebsdlike, netbsdlike))] -bitflags! { - /// `MCL_*` flags for use with [`mlockall`]. - /// - /// [`mlockall`]: crate::mm::mlockall - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct MlockAllFlags: u32 { - // libc doesn't define `MCL_ONFAULT` yet. - // const ONFAULT = libc::MCL_ONFAULT; - /// Lock all pages which will become mapped into the address space of - /// the process in the future. These could be, for instance, new pages - /// required by a growing heap and stack as well as new memory-mapped - /// files or shared memory regions. - const FUTURE = bitcast!(libc::MCL_FUTURE); - /// Lock all pages which are currently mapped into the address space of - /// the process. - const CURRENT = bitcast!(libc::MCL_CURRENT); - - /// - const _ = !0; } } diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/libc/mod.rs temporalio-1.3.0/vendor/rustix/src/backend/libc/mod.rs --- temporalio-1.3.0/vendor/rustix/src/backend/libc/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/libc/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -111,7 +111,7 @@ #[cfg(linux_kernel)] #[cfg(feature = "io_uring")] pub(crate) mod io_uring; -#[cfg(not(any(windows, target_os = "espidf", target_os = "vita", target_os = "wasi")))] +#[cfg(not(any(windows, target_os = "espidf", target_os = "wasi")))] #[cfg(feature = "mm")] pub(crate) mod mm; #[cfg(linux_kernel)] @@ -148,7 +148,7 @@ #[cfg(not(target_os = "wasi"))] #[cfg(feature = "system")] pub(crate) mod system; -#[cfg(not(any(windows, target_os = "vita")))] +#[cfg(not(windows))] #[cfg(feature = "termios")] pub(crate) mod termios; #[cfg(not(windows))] @@ -184,15 +184,6 @@ #[cfg(any(feature = "process", feature = "thread"))] #[cfg(linux_kernel)] pub(crate) mod prctl; -#[cfg(not(any( - windows, - target_os = "android", - target_os = "espidf", - target_os = "vita", - target_os = "wasi" -)))] -#[cfg(feature = "shm")] -pub(crate) mod shm; #[cfg(any(feature = "fs", feature = "thread", feature = "process"))] #[cfg(not(any(windows, target_os = "wasi")))] pub(crate) mod ugid; diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/libc/mount/types.rs temporalio-1.3.0/vendor/rustix/src/backend/libc/mount/types.rs --- temporalio-1.3.0/vendor/rustix/src/backend/libc/mount/types.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/libc/mount/types.rs 2023-10-30 19:40:00.000000000 +0000 @@ -54,9 +54,6 @@ /// `MS_SYNCHRONOUS` const SYNCHRONOUS = c::MS_SYNCHRONOUS; - - /// - const _ = !0; } } @@ -76,9 +73,6 @@ const EXPIRE = bitcast!(c::MNT_EXPIRE); /// `UMOUNT_NOFOLLOW` const NOFOLLOW = bitcast!(c::UMOUNT_NOFOLLOW); - - /// - const _ = !0; } } @@ -91,11 +85,9 @@ #[repr(transparent)] #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] pub struct FsOpenFlags: c::c_uint { - /// `FSOPEN_CLOEXEC` - const FSOPEN_CLOEXEC = 0x0000_0001; - /// - const _ = !0; + /// `FSOPEN_CLOEXEC` + const FSOPEN_CLOEXEC = 0x00000001; } } @@ -109,10 +101,7 @@ #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] pub struct FsMountFlags: c::c_uint { /// `FSMOUNT_CLOEXEC` - const FSMOUNT_CLOEXEC = 0x0000_0001; - - /// - const _ = !0; + const FSMOUNT_CLOEXEC = 0x00000001; } } @@ -157,43 +146,40 @@ #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] pub struct MountAttrFlags: c::c_uint { /// `MOUNT_ATTR_RDONLY` - const MOUNT_ATTR_RDONLY = 0x0000_0001; + const MOUNT_ATTR_RDONLY = 0x00000001; /// `MOUNT_ATTR_NOSUID` - const MOUNT_ATTR_NOSUID = 0x0000_0002; + const MOUNT_ATTR_NOSUID = 0x00000002; /// `MOUNT_ATTR_NODEV` - const MOUNT_ATTR_NODEV = 0x0000_0004; + const MOUNT_ATTR_NODEV = 0x00000004; /// `MOUNT_ATTR_NOEXEC` - const MOUNT_ATTR_NOEXEC = 0x0000_0008; + const MOUNT_ATTR_NOEXEC = 0x00000008; /// `MOUNT_ATTR__ATIME` - const MOUNT_ATTR__ATIME = 0x0000_0070; + const MOUNT_ATTR__ATIME = 0x00000070; /// `MOUNT_ATTR_RELATIME` - const MOUNT_ATTR_RELATIME = 0x0000_0000; + const MOUNT_ATTR_RELATIME = 0x00000000; /// `MOUNT_ATTR_NOATIME` - const MOUNT_ATTR_NOATIME = 0x0000_0010; + const MOUNT_ATTR_NOATIME = 0x00000010; /// `MOUNT_ATTR_STRICTATIME` - const MOUNT_ATTR_STRICTATIME = 0x0000_0020; + const MOUNT_ATTR_STRICTATIME = 0x00000020; /// `MOUNT_ATTR_NODIRATIME` - const MOUNT_ATTR_NODIRATIME = 0x0000_0080; + const MOUNT_ATTR_NODIRATIME = 0x00000080; /// `MOUNT_ATTR_NOUSER` - const MOUNT_ATTR_IDMAP = 0x0010_0000; + const MOUNT_ATTR_IDMAP = 0x00100000; /// `MOUNT_ATTR__ATIME_FLAGS` - const MOUNT_ATTR_NOSYMFOLLOW = 0x0020_0000; + const MOUNT_ATTR_NOSYMFOLLOW = 0x00200000; /// `MOUNT_ATTR__ATIME_FLAGS` const MOUNT_ATTR_SIZE_VER0 = 32; - - /// - const _ = !0; } } @@ -207,35 +193,32 @@ #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] pub struct MoveMountFlags: c::c_uint { /// `MOVE_MOUNT_F_EMPTY_PATH` - const MOVE_MOUNT_F_SYMLINKS = 0x0000_0001; + const MOVE_MOUNT_F_SYMLINKS = 0x00000001; /// `MOVE_MOUNT_F_AUTOMOUNTS` - const MOVE_MOUNT_F_AUTOMOUNTS = 0x0000_0002; + const MOVE_MOUNT_F_AUTOMOUNTS = 0x00000002; /// `MOVE_MOUNT_F_EMPTY_PATH` - const MOVE_MOUNT_F_EMPTY_PATH = 0x0000_0004; + const MOVE_MOUNT_F_EMPTY_PATH = 0x00000004; /// `MOVE_MOUNT_T_SYMLINKS` - const MOVE_MOUNT_T_SYMLINKS = 0x0000_0010; + const MOVE_MOUNT_T_SYMLINKS = 0x00000010; /// `MOVE_MOUNT_T_AUTOMOUNTS` - const MOVE_MOUNT_T_AUTOMOUNTS = 0x0000_0020; + const MOVE_MOUNT_T_AUTOMOUNTS = 0x00000020; /// `MOVE_MOUNT_T_EMPTY_PATH` - const MOVE_MOUNT_T_EMPTY_PATH = 0x0000_0040; + const MOVE_MOUNT_T_EMPTY_PATH = 0x00000040; /// `MOVE_MOUNT__MASK` - const MOVE_MOUNT_SET_GROUP = 0x0000_0100; + const MOVE_MOUNT_SET_GROUP = 0x00000100; // TODO: add when linux 6.5 is released // /// `MOVE_MOUNT_BENEATH` - // const MOVE_MOUNT_BENEATH = 0x0000_0200; + // const MOVE_MOUNT_BENEATH = 0x00000200; /// `MOVE_MOUNT__MASK` - const MOVE_MOUNT__MASK = 0x0000_0377; - - /// - const _ = !0; + const MOVE_MOUNT__MASK = 0x00000377; } } @@ -265,9 +248,6 @@ /// `AT_SYMLINK_NOFOLLOW` const AT_SYMLINK_NOFOLLOW = c::AT_SYMLINK_NOFOLLOW as c::c_uint; - - /// - const _ = !0; } } @@ -281,19 +261,16 @@ #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] pub struct FsPickFlags: c::c_uint { /// `FSPICK_CLOEXEC` - const FSPICK_CLOEXEC = 0x0000_0001; + const FSPICK_CLOEXEC = 0x00000001; /// `FSPICK_SYMLINK_NOFOLLOW` - const FSPICK_SYMLINK_NOFOLLOW = 0x0000_0002; + const FSPICK_SYMLINK_NOFOLLOW = 0x00000002; /// `FSPICK_NO_AUTOMOUNT` - const FSPICK_NO_AUTOMOUNT = 0x0000_0004; + const FSPICK_NO_AUTOMOUNT = 0x00000004; /// `FSPICK_EMPTY_PATH` - const FSPICK_EMPTY_PATH = 0x0000_0008; - - /// - const _ = !0; + const FSPICK_EMPTY_PATH = 0x00000008; } } @@ -317,9 +294,6 @@ const UNBINDABLE = c::MS_UNBINDABLE; /// `MS_REC` const REC = c::MS_REC; - - /// - const _ = !0; } } @@ -330,9 +304,6 @@ pub(crate) struct InternalMountFlags: c::c_ulong { const REMOUNT = c::MS_REMOUNT; const MOVE = c::MS_MOVE; - - /// - const _ = !0; } } diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/libc/net/addr.rs temporalio-1.3.0/vendor/rustix/src/backend/libc/net/addr.rs --- temporalio-1.3.0/vendor/rustix/src/backend/libc/net/addr.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/libc/net/addr.rs 2023-10-30 19:40:00.000000000 +0000 @@ -76,19 +76,15 @@ fn init() -> c::sockaddr_un { c::sockaddr_un { - #[cfg(any(bsd, target_os = "aix", target_os = "haiku", target_os = "nto"))] + #[cfg(any(bsd, target_os = "haiku", target_os = "nto"))] sun_len: 0, - #[cfg(target_os = "vita")] - ss_len: 0, sun_family: c::AF_UNIX as _, #[cfg(any(bsd, target_os = "nto"))] sun_path: [0; 104], - #[cfg(not(any(bsd, target_os = "aix", target_os = "haiku", target_os = "nto")))] + #[cfg(not(any(bsd, target_os = "haiku", target_os = "nto")))] sun_path: [0; 108], #[cfg(target_os = "haiku")] sun_path: [0; 126], - #[cfg(target_os = "aix")] - sun_path: [0; 1023], } } @@ -163,7 +159,9 @@ impl PartialOrd for SocketAddrUnix { #[inline] fn partial_cmp(&self, other: &Self) -> Option { - Some(self.cmp(other)) + let self_len = self.len() - offsetof_sun_path(); + let other_len = other.len() - offsetof_sun_path(); + self.unix.sun_path[..self_len].partial_cmp(&other.unix.sun_path[..other_len]) } } @@ -210,36 +208,18 @@ #[inline] pub(crate) fn offsetof_sun_path() -> usize { let z = c::sockaddr_un { - #[cfg(any(bsd, target_os = "aix", target_os = "haiku", target_os = "nto"))] + #[cfg(any(bsd, target_os = "haiku", target_os = "nto"))] sun_len: 0_u8, - #[cfg(target_os = "vita")] - ss_len: 0, - #[cfg(any( - bsd, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "nto", - target_os = "vita" - ))] + #[cfg(any(bsd, target_os = "espidf", target_os = "haiku", target_os = "nto"))] sun_family: 0_u8, - #[cfg(not(any( - bsd, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "nto", - target_os = "vita" - )))] + #[cfg(not(any(bsd, target_os = "espidf", target_os = "haiku", target_os = "nto")))] sun_family: 0_u16, #[cfg(any(bsd, target_os = "nto"))] sun_path: [0; 104], - #[cfg(not(any(bsd, target_os = "aix", target_os = "haiku", target_os = "nto")))] + #[cfg(not(any(bsd, target_os = "haiku", target_os = "nto")))] sun_path: [0; 108], #[cfg(target_os = "haiku")] sun_path: [0; 126], - #[cfg(target_os = "aix")] - sun_path: [0; 1023], }; (crate::utils::as_ptr(&z.sun_path) as usize) - (crate::utils::as_ptr(&z) as usize) } diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/libc/net/ext.rs temporalio-1.3.0/vendor/rustix/src/backend/libc/net/ext.rs --- temporalio-1.3.0/vendor/rustix/src/backend/libc/net/ext.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/libc/net/ext.rs 2023-10-30 19:40:00.000000000 +0000 @@ -78,15 +78,7 @@ #[cfg(not(windows))] #[inline] pub(crate) const fn sockaddr_in6_new( - #[cfg(any( - bsd, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "nto", - target_os = "vita" - ))] - sin6_len: u8, + #[cfg(any(bsd, target_os = "espidf", target_os = "haiku", target_os = "nto"))] sin6_len: u8, sin6_family: c::sa_family_t, sin6_port: u16, sin6_flowinfo: u32, @@ -94,14 +86,7 @@ sin6_scope_id: u32, ) -> c::sockaddr_in6 { c::sockaddr_in6 { - #[cfg(any( - bsd, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "nto", - target_os = "vita" - ))] + #[cfg(any(bsd, target_os = "espidf", target_os = "haiku", target_os = "nto"))] sin6_len, sin6_family, sin6_port, @@ -110,8 +95,6 @@ sin6_scope_id, #[cfg(solarish)] __sin6_src_id: 0, - #[cfg(target_os = "vita")] - sin6_vport: 0, } } diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/libc/net/mod.rs temporalio-1.3.0/vendor/rustix/src/backend/libc/net/mod.rs --- temporalio-1.3.0/vendor/rustix/src/backend/libc/net/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/libc/net/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,16 +1,8 @@ pub(crate) mod addr; pub(crate) mod ext; -#[cfg(not(any( - windows, - target_os = "espidf", - target_os = "redox", - target_os = "vita", - target_os = "wasi" -)))] +#[cfg(not(any(windows, target_os = "espidf", target_os = "redox", target_os = "wasi")))] pub(crate) mod msghdr; pub(crate) mod read_sockaddr; pub(crate) mod send_recv; -#[cfg(not(any(target_os = "redox", target_os = "wasi")))] -pub(crate) mod sockopt; pub(crate) mod syscalls; pub(crate) mod write_sockaddr; diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/libc/net/msghdr.rs temporalio-1.3.0/vendor/rustix/src/backend/libc/net/msghdr.rs --- temporalio-1.3.0/vendor/rustix/src/backend/libc/net/msghdr.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/libc/net/msghdr.rs 2023-10-30 19:40:00.000000000 +0000 @@ -114,7 +114,7 @@ ) -> R { f({ let mut h = zero_msghdr(); - h.msg_name = as_ptr(&addr.unix) as _; + h.msg_name = as_ptr(addr) as _; h.msg_namelen = addr.addr_len(); h.msg_iov = iov.as_ptr() as _; h.msg_iovlen = msg_iov_len(iov.len()); diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/libc/net/read_sockaddr.rs temporalio-1.3.0/vendor/rustix/src/backend/libc/net/read_sockaddr.rs --- temporalio-1.3.0/vendor/rustix/src/backend/libc/net/read_sockaddr.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/libc/net/read_sockaddr.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,5 +1,5 @@ -//! The BSD sockets API requires us to read the `ss_family` field before we can -//! interpret the rest of a `sockaddr` produced by the kernel. +//! The BSD sockets API requires us to read the `ss_family` field before +//! we can interpret the rest of a `sockaddr` produced by the kernel. #[cfg(unix)] use super::addr::SocketAddrUnix; @@ -14,70 +14,23 @@ // This must match the header of `sockaddr`. #[repr(C)] struct sockaddr_header { - #[cfg(any( - bsd, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "nto", - target_os = "vita" - ))] + #[cfg(any(bsd, target_os = "haiku"))] sa_len: u8, - #[cfg(any( - bsd, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "nto", - target_os = "vita" - ))] + #[cfg(any(bsd, target_os = "haiku"))] ss_family: u8, - #[cfg(not(any( - bsd, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "nto", - target_os = "vita" - )))] + #[cfg(not(any(bsd, target_os = "haiku")))] ss_family: u16, } -/// Read the `ss_family` field from a socket address returned from the OS. -/// -/// # Safety -/// -/// `storage` must point to a valid socket address returned from the OS. #[inline] unsafe fn read_ss_family(storage: *const c::sockaddr_storage) -> u16 { // Assert that we know the layout of `sockaddr`. let _ = c::sockaddr { - #[cfg(any( - bsd, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "nto", - target_os = "vita" - ))] + #[cfg(any(bsd, target_os = "espidf", target_os = "haiku", target_os = "nto"))] sa_len: 0_u8, - #[cfg(any( - bsd, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "nto", - target_os = "vita" - ))] + #[cfg(any(bsd, target_os = "espidf", target_os = "haiku", target_os = "nto"))] sa_family: 0_u8, - #[cfg(not(any( - bsd, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "nto", - target_os = "vita" - )))] + #[cfg(not(any(bsd, target_os = "espidf", target_os = "haiku", target_os = "nto")))] sa_family: 0_u16, #[cfg(not(target_os = "haiku"))] sa_data: [0; 14], @@ -167,10 +120,10 @@ // Otherwise we expect a NUL-terminated filesystem path. // Trim off unused bytes from the end of `path_bytes`. - let path_bytes = if cfg!(any(solarish, target_os = "freebsd")) { - // FreeBSD and illumos sometimes set the length to longer - // than the length of the NUL-terminated string. Find the - // NUL and truncate the string accordingly. + let path_bytes = if cfg!(target_os = "freebsd") { + // FreeBSD sometimes sets the length to longer than the length + // of the NUL-terminated string. Find the NUL and truncate the + // string accordingly. &decode.sun_path[..decode .sun_path .iter() @@ -197,11 +150,6 @@ } } -/// Read an optional socket address returned from the OS. -/// -/// # Safety -/// -/// `storage` must point to a valid socket address returned from the OS. pub(crate) unsafe fn maybe_read_sockaddr_os( storage: *const c::sockaddr_storage, len: usize, @@ -219,11 +167,6 @@ } } -/// Read a socket address returned from the OS. -/// -/// # Safety -/// -/// `storage` must point to a valid socket address returned from the OS. pub(crate) unsafe fn read_sockaddr_os( storage: *const c::sockaddr_storage, len: usize, @@ -289,10 +232,10 @@ assert_eq!(decode.sun_path[len - 1 - offsetof_sun_path], 0); let path_bytes = &decode.sun_path[..len - 1 - offsetof_sun_path]; - // FreeBSD and illumos sometimes set the length to longer than - // the length of the NUL-terminated string. Find the NUL and - // truncate the string accordingly. - #[cfg(any(solarish, target_os = "freebsd"))] + // FreeBSD sometimes sets the length to longer than the length + // of the NUL-terminated string. Find the NUL and truncate the + // string accordingly. + #[cfg(target_os = "freebsd")] let path_bytes = &path_bytes[..path_bytes.iter().position(|b| *b == 0).unwrap()]; SocketAddrAny::Unix( diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/libc/net/send_recv.rs temporalio-1.3.0/vendor/rustix/src/backend/libc/net/send_recv.rs --- temporalio-1.3.0/vendor/rustix/src/backend/libc/net/send_recv.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/libc/net/send_recv.rs 2023-10-30 19:40:00.000000000 +0000 @@ -2,8 +2,7 @@ use bitflags::bitflags; bitflags! { - /// `MSG_*` flags for use with [`send`], [`send_to`], and related - /// functions. + /// `MSG_* flags for use with [`send`], [`send_to`], and related functions. /// /// [`send`]: crate::net::send /// [`sendto`]: crate::net::sendto @@ -15,11 +14,9 @@ bsd, solarish, windows, - target_os = "aix", target_os = "espidf", target_os = "nto", target_os = "haiku", - target_os = "vita", )))] const CONFIRM = bitcast!(c::MSG_CONFIRM); /// `MSG_DONTROUTE` @@ -35,42 +32,27 @@ bsd, solarish, windows, - target_os = "aix", target_os = "haiku", target_os = "nto", - target_os = "vita", )))] const MORE = bitcast!(c::MSG_MORE); - #[cfg(not(any(apple, windows, target_os = "vita")))] + #[cfg(not(any(apple, windows)))] /// `MSG_NOSIGNAL` const NOSIGNAL = bitcast!(c::MSG_NOSIGNAL); /// `MSG_OOB` const OOB = bitcast!(c::MSG_OOB); - - /// - const _ = !0; } } bitflags! { - /// `MSG_*` flags for use with [`recv`], [`recvfrom`], and related - /// functions. + /// `MSG_* flags for use with [`recv`], [`recvfrom`], and related functions. /// /// [`recv`]: crate::net::recv /// [`recvfrom`]: crate::net::recvfrom #[repr(transparent)] #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] pub struct RecvFlags: u32 { - #[cfg(not(any( - apple, - solarish, - windows, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "nto", - target_os = "vita", - )))] + #[cfg(not(any(apple, solarish, windows, target_os = "espidf", target_os = "haiku", target_os = "nto")))] /// `MSG_CMSG_CLOEXEC` const CMSG_CLOEXEC = bitcast!(c::MSG_CMSG_CLOEXEC); /// `MSG_DONTWAIT` @@ -81,11 +63,9 @@ bsd, solarish, windows, - target_os = "aix", target_os = "espidf", target_os = "haiku", target_os = "nto", - target_os = "vita", )))] const ERRQUEUE = bitcast!(c::MSG_ERRQUEUE); /// `MSG_OOB` @@ -96,8 +76,5 @@ const TRUNC = bitcast!(c::MSG_TRUNC); /// `MSG_WAITALL` const WAITALL = bitcast!(c::MSG_WAITALL); - - /// - const _ = !0; } } diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/libc/net/sockopt.rs temporalio-1.3.0/vendor/rustix/src/backend/libc/net/sockopt.rs --- temporalio-1.3.0/vendor/rustix/src/backend/libc/net/sockopt.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/libc/net/sockopt.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,1065 +0,0 @@ -//! libc syscalls supporting `rustix::net::sockopt`. - -use super::ext::{in6_addr_new, in_addr_new}; -use crate::backend::c; -use crate::backend::conv::{borrowed_fd, ret}; -use crate::fd::BorrowedFd; -#[cfg(feature = "alloc")] -#[cfg(any( - linux_like, - target_os = "freebsd", - target_os = "fuchsia", - target_os = "illumos" -))] -use crate::ffi::CStr; -use crate::io; -use crate::net::sockopt::Timeout; -#[cfg(not(any( - apple, - windows, - target_os = "aix", - target_os = "dragonfly", - target_os = "emscripten", - target_os = "espidf", - target_os = "haiku", - target_os = "netbsd", - target_os = "nto", - target_os = "vita", -)))] -use crate::net::AddressFamily; -#[cfg(any( - linux_kernel, - target_os = "freebsd", - target_os = "fuchsia", - target_os = "openbsd", - target_os = "redox", - target_env = "newlib" -))] -use crate::net::Protocol; -#[cfg(any( - linux_kernel, - target_os = "freebsd", - target_os = "fuchsia", - target_os = "openbsd", - target_os = "redox", - target_env = "newlib" -))] -use crate::net::RawProtocol; -use crate::net::{Ipv4Addr, Ipv6Addr, SocketType}; -#[cfg(any(linux_kernel, target_os = "fuchsia"))] -use crate::net::{SocketAddrAny, SocketAddrStorage, SocketAddrV4}; -#[cfg(linux_kernel)] -use crate::net::{SocketAddrV6, UCred}; -use crate::utils::as_mut_ptr; -#[cfg(feature = "alloc")] -#[cfg(any( - linux_like, - target_os = "freebsd", - target_os = "fuchsia", - target_os = "illumos" -))] -use alloc::borrow::ToOwned; -#[cfg(feature = "alloc")] -#[cfg(any( - linux_like, - target_os = "freebsd", - target_os = "fuchsia", - target_os = "illumos" -))] -use alloc::string::String; -#[cfg(apple)] -use c::TCP_KEEPALIVE as TCP_KEEPIDLE; -#[cfg(not(any(apple, target_os = "openbsd", target_os = "haiku", target_os = "nto")))] -use c::TCP_KEEPIDLE; -use core::mem::{size_of, MaybeUninit}; -use core::time::Duration; -#[cfg(windows)] -use windows_sys::Win32::Foundation::BOOL; - -#[inline] -fn getsockopt(fd: BorrowedFd<'_>, level: i32, optname: i32) -> io::Result { - let mut optlen = core::mem::size_of::().try_into().unwrap(); - debug_assert!( - optlen as usize >= core::mem::size_of::(), - "Socket APIs don't ever use `bool` directly" - ); - - let mut value = MaybeUninit::::zeroed(); - getsockopt_raw(fd, level, optname, &mut value, &mut optlen)?; - - // On Windows at least, `getsockopt` has been observed writing 1 - // byte on at least (`IPPROTO_TCP`, `TCP_NODELAY`), even though - // Windows' documentation says that should write a 4-byte `BOOL`. - // So, we initialize the memory to zeros above, and just assert - // that `getsockopt` doesn't write too many bytes here. - assert!( - optlen as usize <= size_of::(), - "unexpected getsockopt size" - ); - - unsafe { Ok(value.assume_init()) } -} - -#[inline] -fn getsockopt_raw( - fd: BorrowedFd<'_>, - level: i32, - optname: i32, - value: &mut MaybeUninit, - optlen: &mut c::socklen_t, -) -> io::Result<()> { - unsafe { - ret(c::getsockopt( - borrowed_fd(fd), - level, - optname, - as_mut_ptr(value).cast(), - optlen, - )) - } -} - -#[inline] -fn setsockopt(fd: BorrowedFd<'_>, level: i32, optname: i32, value: T) -> io::Result<()> { - let optlen = core::mem::size_of::().try_into().unwrap(); - debug_assert!( - optlen as usize >= core::mem::size_of::(), - "Socket APIs don't ever use `bool` directly" - ); - setsockopt_raw(fd, level, optname, &value, optlen) -} - -#[inline] -fn setsockopt_raw( - fd: BorrowedFd<'_>, - level: i32, - optname: i32, - ptr: *const T, - optlen: c::socklen_t, -) -> io::Result<()> { - unsafe { - ret(c::setsockopt( - borrowed_fd(fd), - level, - optname, - ptr.cast(), - optlen, - )) - } -} - -#[inline] -pub(crate) fn get_socket_type(fd: BorrowedFd<'_>) -> io::Result { - getsockopt(fd, c::SOL_SOCKET, c::SO_TYPE) -} - -#[inline] -pub(crate) fn set_socket_reuseaddr(fd: BorrowedFd<'_>, reuseaddr: bool) -> io::Result<()> { - setsockopt(fd, c::SOL_SOCKET, c::SO_REUSEADDR, from_bool(reuseaddr)) -} - -#[inline] -pub(crate) fn get_socket_reuseaddr(fd: BorrowedFd<'_>) -> io::Result { - getsockopt(fd, c::SOL_SOCKET, c::SO_REUSEADDR).map(to_bool) -} - -#[inline] -pub(crate) fn set_socket_broadcast(fd: BorrowedFd<'_>, broadcast: bool) -> io::Result<()> { - setsockopt(fd, c::SOL_SOCKET, c::SO_BROADCAST, from_bool(broadcast)) -} - -#[inline] -pub(crate) fn get_socket_broadcast(fd: BorrowedFd<'_>) -> io::Result { - getsockopt(fd, c::SOL_SOCKET, c::SO_BROADCAST).map(to_bool) -} - -#[inline] -pub(crate) fn set_socket_linger(fd: BorrowedFd<'_>, linger: Option) -> io::Result<()> { - // Convert `linger` to seconds, rounding up. - let l_linger = if let Some(linger) = linger { - duration_to_secs(linger)? - } else { - 0 - }; - let linger = c::linger { - l_onoff: linger.is_some().into(), - l_linger, - }; - setsockopt(fd, c::SOL_SOCKET, c::SO_LINGER, linger) -} - -#[inline] -pub(crate) fn get_socket_linger(fd: BorrowedFd<'_>) -> io::Result> { - let linger: c::linger = getsockopt(fd, c::SOL_SOCKET, c::SO_LINGER)?; - Ok((linger.l_onoff != 0).then(|| Duration::from_secs(linger.l_linger as u64))) -} - -#[cfg(linux_kernel)] -#[inline] -pub(crate) fn set_socket_passcred(fd: BorrowedFd<'_>, passcred: bool) -> io::Result<()> { - setsockopt(fd, c::SOL_SOCKET, c::SO_PASSCRED, from_bool(passcred)) -} - -#[cfg(linux_kernel)] -#[inline] -pub(crate) fn get_socket_passcred(fd: BorrowedFd<'_>) -> io::Result { - getsockopt(fd, c::SOL_SOCKET, c::SO_PASSCRED).map(to_bool) -} - -#[inline] -pub(crate) fn set_socket_timeout( - fd: BorrowedFd<'_>, - id: Timeout, - timeout: Option, -) -> io::Result<()> { - let optname = match id { - Timeout::Recv => c::SO_RCVTIMEO, - Timeout::Send => c::SO_SNDTIMEO, - }; - - #[cfg(not(windows))] - let timeout = match timeout { - Some(timeout) => { - if timeout == Duration::ZERO { - return Err(io::Errno::INVAL); - } - - // Rust's musl libc bindings deprecated `time_t` while they - // transition to 64-bit `time_t`. What we want here is just - // “whatever type `timeval`'s `tv_sec` isâ€, so we're ok using - // the deprecated type. - #[allow(deprecated)] - let tv_sec = timeout.as_secs().try_into().unwrap_or(c::time_t::MAX); - - // `subsec_micros` rounds down, so we use `subsec_nanos` and - // manually round up. - let mut timeout = c::timeval { - tv_sec, - tv_usec: ((timeout.subsec_nanos() + 999) / 1000) as _, - }; - if timeout.tv_sec == 0 && timeout.tv_usec == 0 { - timeout.tv_usec = 1; - } - timeout - } - None => c::timeval { - tv_sec: 0, - tv_usec: 0, - }, - }; - - #[cfg(windows)] - let timeout: u32 = match timeout { - Some(timeout) => { - if timeout == Duration::ZERO { - return Err(io::Errno::INVAL); - } - - // `as_millis` rounds down, so we use `as_nanos` and - // manually round up. - let mut timeout: u32 = ((timeout.as_nanos() + 999_999) / 1_000_000) - .try_into() - .map_err(|_convert_err| io::Errno::INVAL)?; - if timeout == 0 { - timeout = 1; - } - timeout - } - None => 0, - }; - - setsockopt(fd, c::SOL_SOCKET, optname, timeout) -} - -#[inline] -pub(crate) fn get_socket_timeout(fd: BorrowedFd<'_>, id: Timeout) -> io::Result> { - let optname = match id { - Timeout::Recv => c::SO_RCVTIMEO, - Timeout::Send => c::SO_SNDTIMEO, - }; - - #[cfg(not(windows))] - { - let timeout: c::timeval = getsockopt(fd, c::SOL_SOCKET, optname)?; - if timeout.tv_sec == 0 && timeout.tv_usec == 0 { - Ok(None) - } else { - Ok(Some( - Duration::from_secs(timeout.tv_sec as u64) - + Duration::from_micros(timeout.tv_usec as u64), - )) - } - } - - #[cfg(windows)] - { - let timeout: u32 = getsockopt(fd, c::SOL_SOCKET, optname)?; - if timeout == 0 { - Ok(None) - } else { - Ok(Some(Duration::from_millis(timeout as u64))) - } - } -} - -#[cfg(any(apple, freebsdlike, target_os = "netbsd"))] -#[inline] -pub(crate) fn get_socket_nosigpipe(fd: BorrowedFd<'_>) -> io::Result { - getsockopt(fd, c::SOL_SOCKET, c::SO_NOSIGPIPE).map(to_bool) -} - -#[cfg(any(apple, freebsdlike, target_os = "netbsd"))] -#[inline] -pub(crate) fn set_socket_nosigpipe(fd: BorrowedFd<'_>, val: bool) -> io::Result<()> { - setsockopt(fd, c::SOL_SOCKET, c::SO_NOSIGPIPE, from_bool(val)) -} - -#[inline] -pub(crate) fn get_socket_error(fd: BorrowedFd<'_>) -> io::Result> { - let err: c::c_int = getsockopt(fd, c::SOL_SOCKET, c::SO_ERROR)?; - Ok(if err == 0 { - Ok(()) - } else { - Err(io::Errno::from_raw_os_error(err)) - }) -} - -#[inline] -pub(crate) fn set_socket_keepalive(fd: BorrowedFd<'_>, keepalive: bool) -> io::Result<()> { - setsockopt(fd, c::SOL_SOCKET, c::SO_KEEPALIVE, from_bool(keepalive)) -} - -#[inline] -pub(crate) fn get_socket_keepalive(fd: BorrowedFd<'_>) -> io::Result { - getsockopt(fd, c::SOL_SOCKET, c::SO_KEEPALIVE).map(to_bool) -} - -#[inline] -pub(crate) fn set_socket_recv_buffer_size(fd: BorrowedFd<'_>, size: usize) -> io::Result<()> { - let size: c::c_int = size.try_into().map_err(|_| io::Errno::INVAL)?; - setsockopt(fd, c::SOL_SOCKET, c::SO_RCVBUF, size) -} - -#[inline] -pub(crate) fn get_socket_recv_buffer_size(fd: BorrowedFd<'_>) -> io::Result { - getsockopt(fd, c::SOL_SOCKET, c::SO_RCVBUF).map(|size: u32| size as usize) -} - -#[inline] -pub(crate) fn set_socket_send_buffer_size(fd: BorrowedFd<'_>, size: usize) -> io::Result<()> { - let size: c::c_int = size.try_into().map_err(|_| io::Errno::INVAL)?; - setsockopt(fd, c::SOL_SOCKET, c::SO_SNDBUF, size) -} - -#[inline] -pub(crate) fn get_socket_send_buffer_size(fd: BorrowedFd<'_>) -> io::Result { - getsockopt(fd, c::SOL_SOCKET, c::SO_SNDBUF).map(|size: u32| size as usize) -} - -#[inline] -#[cfg(not(any( - apple, - windows, - target_os = "aix", - target_os = "dragonfly", - target_os = "emscripten", - target_os = "espidf", - target_os = "haiku", - target_os = "netbsd", - target_os = "nto", - target_os = "vita", -)))] -pub(crate) fn get_socket_domain(fd: BorrowedFd<'_>) -> io::Result { - let domain: c::c_int = getsockopt(fd, c::SOL_SOCKET, c::SO_DOMAIN)?; - Ok(AddressFamily( - domain.try_into().map_err(|_| io::Errno::OPNOTSUPP)?, - )) -} - -#[inline] -#[cfg(not(apple))] // Apple platforms declare the constant, but do not actually implement it. -pub(crate) fn get_socket_acceptconn(fd: BorrowedFd<'_>) -> io::Result { - getsockopt(fd, c::SOL_SOCKET, c::SO_ACCEPTCONN).map(to_bool) -} - -#[inline] -pub(crate) fn set_socket_oobinline(fd: BorrowedFd<'_>, value: bool) -> io::Result<()> { - setsockopt(fd, c::SOL_SOCKET, c::SO_OOBINLINE, from_bool(value)) -} - -#[inline] -pub(crate) fn get_socket_oobinline(fd: BorrowedFd<'_>) -> io::Result { - getsockopt(fd, c::SOL_SOCKET, c::SO_OOBINLINE).map(to_bool) -} - -#[cfg(not(any(solarish, windows)))] -#[inline] -pub(crate) fn set_socket_reuseport(fd: BorrowedFd<'_>, value: bool) -> io::Result<()> { - setsockopt(fd, c::SOL_SOCKET, c::SO_REUSEPORT, from_bool(value)) -} - -#[cfg(not(any(solarish, windows)))] -#[inline] -pub(crate) fn get_socket_reuseport(fd: BorrowedFd<'_>) -> io::Result { - getsockopt(fd, c::SOL_SOCKET, c::SO_REUSEPORT).map(to_bool) -} - -#[cfg(target_os = "freebsd")] -#[inline] -pub(crate) fn set_socket_reuseport_lb(fd: BorrowedFd<'_>, value: bool) -> io::Result<()> { - setsockopt(fd, c::SOL_SOCKET, c::SO_REUSEPORT_LB, from_bool(value)) -} - -#[cfg(target_os = "freebsd")] -#[inline] -pub(crate) fn get_socket_reuseport_lb(fd: BorrowedFd<'_>) -> io::Result { - getsockopt(fd, c::SOL_SOCKET, c::SO_REUSEPORT_LB).map(to_bool) -} - -#[cfg(any( - linux_kernel, - target_os = "freebsd", - target_os = "fuchsia", - target_os = "openbsd", - target_os = "redox", - target_env = "newlib" -))] -#[inline] -pub(crate) fn get_socket_protocol(fd: BorrowedFd<'_>) -> io::Result> { - getsockopt(fd, c::SOL_SOCKET, c::SO_PROTOCOL) - .map(|raw| RawProtocol::new(raw).map(Protocol::from_raw)) -} - -#[cfg(target_os = "linux")] -#[inline] -pub(crate) fn get_socket_cookie(fd: BorrowedFd<'_>) -> io::Result { - getsockopt(fd, c::SOL_SOCKET, c::SO_COOKIE) -} - -#[cfg(target_os = "linux")] -#[inline] -pub(crate) fn get_socket_incoming_cpu(fd: BorrowedFd<'_>) -> io::Result { - getsockopt(fd, c::SOL_SOCKET, c::SO_INCOMING_CPU) -} - -#[cfg(target_os = "linux")] -#[inline] -pub(crate) fn set_socket_incoming_cpu(fd: BorrowedFd<'_>, value: u32) -> io::Result<()> { - setsockopt(fd, c::SOL_SOCKET, c::SO_INCOMING_CPU, value) -} - -#[inline] -pub(crate) fn set_ip_ttl(fd: BorrowedFd<'_>, ttl: u32) -> io::Result<()> { - setsockopt(fd, c::IPPROTO_IP, c::IP_TTL, ttl) -} - -#[inline] -pub(crate) fn get_ip_ttl(fd: BorrowedFd<'_>) -> io::Result { - getsockopt(fd, c::IPPROTO_IP, c::IP_TTL) -} - -#[inline] -pub(crate) fn set_ipv6_v6only(fd: BorrowedFd<'_>, only_v6: bool) -> io::Result<()> { - setsockopt(fd, c::IPPROTO_IPV6, c::IPV6_V6ONLY, from_bool(only_v6)) -} - -#[inline] -pub(crate) fn get_ipv6_v6only(fd: BorrowedFd<'_>) -> io::Result { - getsockopt(fd, c::IPPROTO_IPV6, c::IPV6_V6ONLY).map(to_bool) -} - -#[inline] -pub(crate) fn set_ip_multicast_loop(fd: BorrowedFd<'_>, multicast_loop: bool) -> io::Result<()> { - setsockopt( - fd, - c::IPPROTO_IP, - c::IP_MULTICAST_LOOP, - from_bool(multicast_loop), - ) -} - -#[inline] -pub(crate) fn get_ip_multicast_loop(fd: BorrowedFd<'_>) -> io::Result { - getsockopt(fd, c::IPPROTO_IP, c::IP_MULTICAST_LOOP).map(to_bool) -} - -#[inline] -pub(crate) fn set_ip_multicast_ttl(fd: BorrowedFd<'_>, multicast_ttl: u32) -> io::Result<()> { - setsockopt(fd, c::IPPROTO_IP, c::IP_MULTICAST_TTL, multicast_ttl) -} - -#[inline] -pub(crate) fn get_ip_multicast_ttl(fd: BorrowedFd<'_>) -> io::Result { - getsockopt(fd, c::IPPROTO_IP, c::IP_MULTICAST_TTL) -} - -#[inline] -pub(crate) fn set_ipv6_multicast_loop(fd: BorrowedFd<'_>, multicast_loop: bool) -> io::Result<()> { - setsockopt( - fd, - c::IPPROTO_IPV6, - c::IPV6_MULTICAST_LOOP, - from_bool(multicast_loop), - ) -} - -#[inline] -pub(crate) fn get_ipv6_multicast_loop(fd: BorrowedFd<'_>) -> io::Result { - getsockopt(fd, c::IPPROTO_IPV6, c::IPV6_MULTICAST_LOOP).map(to_bool) -} - -#[inline] -pub(crate) fn set_ipv6_multicast_hops(fd: BorrowedFd<'_>, multicast_hops: u32) -> io::Result<()> { - setsockopt(fd, c::IPPROTO_IP, c::IPV6_MULTICAST_HOPS, multicast_hops) -} - -#[inline] -pub(crate) fn get_ipv6_multicast_hops(fd: BorrowedFd<'_>) -> io::Result { - getsockopt(fd, c::IPPROTO_IP, c::IPV6_MULTICAST_HOPS) -} - -#[inline] -pub(crate) fn set_ip_add_membership( - fd: BorrowedFd<'_>, - multiaddr: &Ipv4Addr, - interface: &Ipv4Addr, -) -> io::Result<()> { - let mreq = to_ip_mreq(multiaddr, interface); - setsockopt(fd, c::IPPROTO_IP, c::IP_ADD_MEMBERSHIP, mreq) -} - -#[cfg(any( - apple, - freebsdlike, - linux_like, - target_os = "fuchsia", - target_os = "openbsd" -))] -#[inline] -pub(crate) fn set_ip_add_membership_with_ifindex( - fd: BorrowedFd<'_>, - multiaddr: &Ipv4Addr, - address: &Ipv4Addr, - ifindex: i32, -) -> io::Result<()> { - let mreqn = to_ip_mreqn(multiaddr, address, ifindex); - setsockopt(fd, c::IPPROTO_IP, c::IP_ADD_MEMBERSHIP, mreqn) -} - -#[cfg(any(apple, freebsdlike, linux_like, solarish, target_os = "aix"))] -#[inline] -pub(crate) fn set_ip_add_source_membership( - fd: BorrowedFd<'_>, - multiaddr: &Ipv4Addr, - interface: &Ipv4Addr, - sourceaddr: &Ipv4Addr, -) -> io::Result<()> { - let mreq_source = to_imr_source(multiaddr, interface, sourceaddr); - setsockopt(fd, c::IPPROTO_IP, c::IP_ADD_SOURCE_MEMBERSHIP, mreq_source) -} - -#[cfg(any(apple, freebsdlike, linux_like, solarish, target_os = "aix"))] -#[inline] -pub(crate) fn set_ip_drop_source_membership( - fd: BorrowedFd<'_>, - multiaddr: &Ipv4Addr, - interface: &Ipv4Addr, - sourceaddr: &Ipv4Addr, -) -> io::Result<()> { - let mreq_source = to_imr_source(multiaddr, interface, sourceaddr); - setsockopt(fd, c::IPPROTO_IP, c::IP_DROP_SOURCE_MEMBERSHIP, mreq_source) -} - -#[inline] -pub(crate) fn set_ipv6_add_membership( - fd: BorrowedFd<'_>, - multiaddr: &Ipv6Addr, - interface: u32, -) -> io::Result<()> { - #[cfg(not(any( - bsd, - solarish, - target_os = "haiku", - target_os = "l4re", - target_os = "nto" - )))] - use c::IPV6_ADD_MEMBERSHIP; - #[cfg(any( - bsd, - solarish, - target_os = "haiku", - target_os = "l4re", - target_os = "nto" - ))] - use c::IPV6_JOIN_GROUP as IPV6_ADD_MEMBERSHIP; - - let mreq = to_ipv6mr(multiaddr, interface); - setsockopt(fd, c::IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP, mreq) -} - -#[inline] -pub(crate) fn set_ip_drop_membership( - fd: BorrowedFd<'_>, - multiaddr: &Ipv4Addr, - interface: &Ipv4Addr, -) -> io::Result<()> { - let mreq = to_ip_mreq(multiaddr, interface); - setsockopt(fd, c::IPPROTO_IP, c::IP_DROP_MEMBERSHIP, mreq) -} - -#[cfg(any( - apple, - freebsdlike, - linux_like, - target_os = "fuchsia", - target_os = "openbsd" -))] -#[inline] -pub(crate) fn set_ip_drop_membership_with_ifindex( - fd: BorrowedFd<'_>, - multiaddr: &Ipv4Addr, - address: &Ipv4Addr, - ifindex: i32, -) -> io::Result<()> { - let mreqn = to_ip_mreqn(multiaddr, address, ifindex); - setsockopt(fd, c::IPPROTO_IP, c::IP_DROP_MEMBERSHIP, mreqn) -} - -#[inline] -pub(crate) fn set_ipv6_drop_membership( - fd: BorrowedFd<'_>, - multiaddr: &Ipv6Addr, - interface: u32, -) -> io::Result<()> { - #[cfg(not(any( - bsd, - solarish, - target_os = "haiku", - target_os = "l4re", - target_os = "nto" - )))] - use c::IPV6_DROP_MEMBERSHIP; - #[cfg(any( - bsd, - solarish, - target_os = "haiku", - target_os = "l4re", - target_os = "nto" - ))] - use c::IPV6_LEAVE_GROUP as IPV6_DROP_MEMBERSHIP; - - let mreq = to_ipv6mr(multiaddr, interface); - setsockopt(fd, c::IPPROTO_IPV6, IPV6_DROP_MEMBERSHIP, mreq) -} - -#[inline] -pub(crate) fn get_ipv6_unicast_hops(fd: BorrowedFd<'_>) -> io::Result { - getsockopt(fd, c::IPPROTO_IPV6, c::IPV6_UNICAST_HOPS).map(|hops: c::c_int| hops as u8) -} - -#[inline] -pub(crate) fn set_ipv6_unicast_hops(fd: BorrowedFd<'_>, hops: Option) -> io::Result<()> { - let hops = match hops { - Some(hops) => hops as c::c_int, - None => -1, - }; - setsockopt(fd, c::IPPROTO_IPV6, c::IPV6_UNICAST_HOPS, hops) -} - -#[cfg(any( - bsd, - linux_like, - target_os = "aix", - target_os = "fuchsia", - target_os = "haiku", - target_os = "nto", - target_env = "newlib" -))] -#[inline] -pub(crate) fn set_ip_tos(fd: BorrowedFd<'_>, value: u8) -> io::Result<()> { - setsockopt(fd, c::IPPROTO_IP, c::IP_TOS, i32::from(value)) -} - -#[cfg(any( - bsd, - linux_like, - target_os = "aix", - target_os = "fuchsia", - target_os = "haiku", - target_os = "nto", - target_env = "newlib" -))] -#[inline] -pub(crate) fn get_ip_tos(fd: BorrowedFd<'_>) -> io::Result { - let value: i32 = getsockopt(fd, c::IPPROTO_IP, c::IP_TOS)?; - Ok(value as u8) -} - -#[cfg(any(apple, linux_like, target_os = "freebsd", target_os = "fuchsia"))] -#[inline] -pub(crate) fn set_ip_recvtos(fd: BorrowedFd<'_>, value: bool) -> io::Result<()> { - setsockopt(fd, c::IPPROTO_IP, c::IP_RECVTOS, from_bool(value)) -} - -#[cfg(any(apple, linux_like, target_os = "freebsd", target_os = "fuchsia"))] -#[inline] -pub(crate) fn get_ip_recvtos(fd: BorrowedFd<'_>) -> io::Result { - getsockopt(fd, c::IPPROTO_IP, c::IP_RECVTOS).map(to_bool) -} - -#[cfg(any( - bsd, - linux_like, - target_os = "aix", - target_os = "fuchsia", - target_os = "nto" -))] -#[inline] -pub(crate) fn set_ipv6_recvtclass(fd: BorrowedFd<'_>, value: bool) -> io::Result<()> { - setsockopt(fd, c::IPPROTO_IPV6, c::IPV6_RECVTCLASS, from_bool(value)) -} - -#[cfg(any( - bsd, - linux_like, - target_os = "aix", - target_os = "fuchsia", - target_os = "nto" -))] -#[inline] -pub(crate) fn get_ipv6_recvtclass(fd: BorrowedFd<'_>) -> io::Result { - getsockopt(fd, c::IPPROTO_IPV6, c::IPV6_RECVTCLASS).map(to_bool) -} - -#[cfg(any(linux_kernel, target_os = "fuchsia"))] -#[inline] -pub(crate) fn set_ip_freebind(fd: BorrowedFd<'_>, value: bool) -> io::Result<()> { - setsockopt(fd, c::IPPROTO_IP, c::IP_FREEBIND, from_bool(value)) -} - -#[cfg(any(linux_kernel, target_os = "fuchsia"))] -#[inline] -pub(crate) fn get_ip_freebind(fd: BorrowedFd<'_>) -> io::Result { - getsockopt(fd, c::IPPROTO_IP, c::IP_FREEBIND).map(to_bool) -} - -#[cfg(linux_kernel)] -#[inline] -pub(crate) fn set_ipv6_freebind(fd: BorrowedFd<'_>, value: bool) -> io::Result<()> { - setsockopt(fd, c::IPPROTO_IPV6, c::IPV6_FREEBIND, from_bool(value)) -} - -#[cfg(linux_kernel)] -#[inline] -pub(crate) fn get_ipv6_freebind(fd: BorrowedFd<'_>) -> io::Result { - getsockopt(fd, c::IPPROTO_IPV6, c::IPV6_FREEBIND).map(to_bool) -} - -#[cfg(any(linux_kernel, target_os = "fuchsia"))] -#[inline] -pub(crate) fn get_ip_original_dst(fd: BorrowedFd<'_>) -> io::Result { - let level = c::IPPROTO_IP; - let optname = c::SO_ORIGINAL_DST; - let mut value = MaybeUninit::::uninit(); - let mut optlen = core::mem::size_of_val(&value).try_into().unwrap(); - - getsockopt_raw(fd, level, optname, &mut value, &mut optlen)?; - - let any = unsafe { SocketAddrAny::read(value.as_ptr(), optlen as usize)? }; - match any { - SocketAddrAny::V4(v4) => Ok(v4), - _ => unreachable!(), - } -} - -#[cfg(linux_kernel)] -#[inline] -pub(crate) fn get_ipv6_original_dst(fd: BorrowedFd<'_>) -> io::Result { - let level = c::IPPROTO_IPV6; - let optname = c::IP6T_SO_ORIGINAL_DST; - let mut value = MaybeUninit::::uninit(); - let mut optlen = core::mem::size_of_val(&value).try_into().unwrap(); - - getsockopt_raw(fd, level, optname, &mut value, &mut optlen)?; - - let any = unsafe { SocketAddrAny::read(value.as_ptr(), optlen as usize)? }; - match any { - SocketAddrAny::V6(v6) => Ok(v6), - _ => unreachable!(), - } -} - -#[cfg(not(any( - solarish, - windows, - target_os = "espidf", - target_os = "haiku", - target_os = "vita" -)))] -#[inline] -pub(crate) fn set_ipv6_tclass(fd: BorrowedFd<'_>, value: u32) -> io::Result<()> { - setsockopt(fd, c::IPPROTO_IPV6, c::IPV6_TCLASS, value) -} - -#[cfg(not(any( - solarish, - windows, - target_os = "espidf", - target_os = "haiku", - target_os = "vita" -)))] -#[inline] -pub(crate) fn get_ipv6_tclass(fd: BorrowedFd<'_>) -> io::Result { - getsockopt(fd, c::IPPROTO_IPV6, c::IPV6_TCLASS) -} - -#[inline] -pub(crate) fn set_tcp_nodelay(fd: BorrowedFd<'_>, nodelay: bool) -> io::Result<()> { - setsockopt(fd, c::IPPROTO_TCP, c::TCP_NODELAY, from_bool(nodelay)) -} - -#[inline] -pub(crate) fn get_tcp_nodelay(fd: BorrowedFd<'_>) -> io::Result { - getsockopt(fd, c::IPPROTO_TCP, c::TCP_NODELAY).map(to_bool) -} - -#[inline] -#[cfg(not(any(target_os = "openbsd", target_os = "haiku", target_os = "nto")))] -pub(crate) fn set_tcp_keepcnt(fd: BorrowedFd<'_>, count: u32) -> io::Result<()> { - setsockopt(fd, c::IPPROTO_TCP, c::TCP_KEEPCNT, count) -} - -#[inline] -#[cfg(not(any(target_os = "openbsd", target_os = "haiku", target_os = "nto")))] -pub(crate) fn get_tcp_keepcnt(fd: BorrowedFd<'_>) -> io::Result { - getsockopt(fd, c::IPPROTO_TCP, c::TCP_KEEPCNT) -} - -#[inline] -#[cfg(not(any(target_os = "openbsd", target_os = "haiku", target_os = "nto")))] -pub(crate) fn set_tcp_keepidle(fd: BorrowedFd<'_>, duration: Duration) -> io::Result<()> { - let secs: c::c_uint = duration_to_secs(duration)?; - setsockopt(fd, c::IPPROTO_TCP, TCP_KEEPIDLE, secs) -} - -#[inline] -#[cfg(not(any(target_os = "openbsd", target_os = "haiku", target_os = "nto")))] -pub(crate) fn get_tcp_keepidle(fd: BorrowedFd<'_>) -> io::Result { - let secs: c::c_uint = getsockopt(fd, c::IPPROTO_TCP, TCP_KEEPIDLE)?; - Ok(Duration::from_secs(secs as u64)) -} - -#[inline] -#[cfg(not(any(target_os = "openbsd", target_os = "haiku", target_os = "nto")))] -pub(crate) fn set_tcp_keepintvl(fd: BorrowedFd<'_>, duration: Duration) -> io::Result<()> { - let secs: c::c_uint = duration_to_secs(duration)?; - setsockopt(fd, c::IPPROTO_TCP, c::TCP_KEEPINTVL, secs) -} - -#[inline] -#[cfg(not(any(target_os = "openbsd", target_os = "haiku", target_os = "nto")))] -pub(crate) fn get_tcp_keepintvl(fd: BorrowedFd<'_>) -> io::Result { - let secs: c::c_uint = getsockopt(fd, c::IPPROTO_TCP, c::TCP_KEEPINTVL)?; - Ok(Duration::from_secs(secs as u64)) -} - -#[inline] -#[cfg(any(linux_like, target_os = "fuchsia"))] -pub(crate) fn set_tcp_user_timeout(fd: BorrowedFd<'_>, value: u32) -> io::Result<()> { - setsockopt(fd, c::IPPROTO_TCP, c::TCP_USER_TIMEOUT, value) -} - -#[inline] -#[cfg(any(linux_like, target_os = "fuchsia"))] -pub(crate) fn get_tcp_user_timeout(fd: BorrowedFd<'_>) -> io::Result { - getsockopt(fd, c::IPPROTO_TCP, c::TCP_USER_TIMEOUT) -} - -#[cfg(any(linux_like, target_os = "fuchsia"))] -#[inline] -pub(crate) fn set_tcp_quickack(fd: BorrowedFd<'_>, value: bool) -> io::Result<()> { - setsockopt(fd, c::IPPROTO_TCP, c::TCP_QUICKACK, from_bool(value)) -} - -#[cfg(any(linux_like, target_os = "fuchsia"))] -#[inline] -pub(crate) fn get_tcp_quickack(fd: BorrowedFd<'_>) -> io::Result { - getsockopt(fd, c::IPPROTO_TCP, c::TCP_QUICKACK).map(to_bool) -} - -#[cfg(any( - linux_like, - target_os = "freebsd", - target_os = "fuchsia", - target_os = "illumos" -))] -#[inline] -pub(crate) fn set_tcp_congestion(fd: BorrowedFd<'_>, value: &str) -> io::Result<()> { - let level = c::IPPROTO_TCP; - let optname = c::TCP_CONGESTION; - let optlen = value.len().try_into().unwrap(); - setsockopt_raw(fd, level, optname, value.as_ptr(), optlen) -} - -#[cfg(feature = "alloc")] -#[cfg(any( - linux_like, - target_os = "freebsd", - target_os = "fuchsia", - target_os = "illumos" -))] -#[inline] -pub(crate) fn get_tcp_congestion(fd: BorrowedFd<'_>) -> io::Result { - let level = c::IPPROTO_TCP; - let optname = c::TCP_CONGESTION; - const OPTLEN: c::socklen_t = 16; - let mut value = MaybeUninit::<[MaybeUninit; OPTLEN as usize]>::uninit(); - let mut optlen = OPTLEN; - getsockopt_raw(fd, level, optname, &mut value, &mut optlen)?; - unsafe { - let value = value.assume_init(); - let slice: &[u8] = core::mem::transmute(&value[..optlen as usize]); - assert!(slice.iter().any(|b| *b == b'\0')); - Ok( - core::str::from_utf8(CStr::from_ptr(slice.as_ptr().cast()).to_bytes()) - .unwrap() - .to_owned(), - ) - } -} - -#[cfg(any(linux_like, target_os = "fuchsia"))] -#[inline] -pub(crate) fn set_tcp_thin_linear_timeouts(fd: BorrowedFd<'_>, value: bool) -> io::Result<()> { - setsockopt( - fd, - c::IPPROTO_TCP, - c::TCP_THIN_LINEAR_TIMEOUTS, - from_bool(value), - ) -} - -#[cfg(any(linux_like, target_os = "fuchsia"))] -#[inline] -pub(crate) fn get_tcp_thin_linear_timeouts(fd: BorrowedFd<'_>) -> io::Result { - getsockopt(fd, c::IPPROTO_TCP, c::TCP_THIN_LINEAR_TIMEOUTS).map(to_bool) -} - -#[cfg(any(linux_like, solarish, target_os = "fuchsia"))] -#[inline] -pub(crate) fn set_tcp_cork(fd: BorrowedFd<'_>, value: bool) -> io::Result<()> { - setsockopt(fd, c::IPPROTO_TCP, c::TCP_CORK, from_bool(value)) -} - -#[cfg(any(linux_like, solarish, target_os = "fuchsia"))] -#[inline] -pub(crate) fn get_tcp_cork(fd: BorrowedFd<'_>) -> io::Result { - getsockopt(fd, c::IPPROTO_TCP, c::TCP_CORK).map(to_bool) -} - -#[cfg(linux_kernel)] -#[inline] -pub(crate) fn get_socket_peercred(fd: BorrowedFd<'_>) -> io::Result { - getsockopt(fd, c::SOL_SOCKET, c::SO_PEERCRED) -} - -#[inline] -fn to_ip_mreq(multiaddr: &Ipv4Addr, interface: &Ipv4Addr) -> c::ip_mreq { - c::ip_mreq { - imr_multiaddr: to_imr_addr(multiaddr), - imr_interface: to_imr_addr(interface), - } -} - -#[cfg(any( - apple, - freebsdlike, - linux_like, - target_os = "fuchsia", - target_os = "openbsd" -))] -#[inline] -fn to_ip_mreqn(multiaddr: &Ipv4Addr, address: &Ipv4Addr, ifindex: i32) -> c::ip_mreqn { - c::ip_mreqn { - imr_multiaddr: to_imr_addr(multiaddr), - imr_address: to_imr_addr(address), - imr_ifindex: ifindex, - } -} - -#[cfg(any(apple, freebsdlike, linux_like, solarish, target_os = "aix"))] -#[inline] -fn to_imr_source( - multiaddr: &Ipv4Addr, - interface: &Ipv4Addr, - sourceaddr: &Ipv4Addr, -) -> c::ip_mreq_source { - c::ip_mreq_source { - imr_multiaddr: to_imr_addr(multiaddr), - imr_interface: to_imr_addr(interface), - imr_sourceaddr: to_imr_addr(sourceaddr), - } -} - -#[inline] -fn to_imr_addr(addr: &Ipv4Addr) -> c::in_addr { - in_addr_new(u32::from_ne_bytes(addr.octets())) -} - -#[inline] -fn to_ipv6mr(multiaddr: &Ipv6Addr, interface: u32) -> c::ipv6_mreq { - c::ipv6_mreq { - ipv6mr_multiaddr: to_ipv6mr_multiaddr(multiaddr), - ipv6mr_interface: to_ipv6mr_interface(interface), - } -} - -#[inline] -fn to_ipv6mr_multiaddr(multiaddr: &Ipv6Addr) -> c::in6_addr { - in6_addr_new(multiaddr.octets()) -} - -#[cfg(target_os = "android")] -#[inline] -fn to_ipv6mr_interface(interface: u32) -> c::c_int { - interface as c::c_int -} - -#[cfg(not(target_os = "android"))] -#[inline] -fn to_ipv6mr_interface(interface: u32) -> c::c_uint { - interface as c::c_uint -} - -// `getsockopt` and `setsockopt` represent boolean values as integers. -#[cfg(not(windows))] -type RawSocketBool = c::c_int; -#[cfg(windows)] -type RawSocketBool = BOOL; - -// Wrap `RawSocketBool` in a newtype to discourage misuse. -#[repr(transparent)] -#[derive(Copy, Clone)] -struct SocketBool(RawSocketBool); - -// Convert from a `bool` to a `SocketBool`. -#[inline] -fn from_bool(value: bool) -> SocketBool { - SocketBool(value.into()) -} - -// Convert from a `SocketBool` to a `bool`. -#[inline] -fn to_bool(value: SocketBool) -> bool { - value.0 != 0 -} - -/// Convert to seconds, rounding up if necessary. -#[inline] -fn duration_to_secs>(duration: Duration) -> io::Result { - let mut secs = duration.as_secs(); - if duration.subsec_nanos() != 0 { - secs = secs.checked_add(1).ok_or(io::Errno::INVAL)?; - } - T::try_from(secs).map_err(|_e| io::Errno::INVAL) -} diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/libc/net/syscalls.rs temporalio-1.3.0/vendor/rustix/src/backend/libc/net/syscalls.rs --- temporalio-1.3.0/vendor/rustix/src/backend/libc/net/syscalls.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/libc/net/syscalls.rs 2023-10-30 19:40:00.000000000 +0000 @@ -2,6 +2,7 @@ #[cfg(unix)] use super::addr::SocketAddrUnix; +use super::ext::{in6_addr_new, in_addr_new}; use crate::backend::c; use crate::backend::conv::{borrowed_fd, ret, ret_owned_fd, ret_send_recv, send_recv_len}; use crate::fd::{BorrowedFd, OwnedFd}; @@ -9,13 +10,7 @@ use crate::net::{SocketAddrAny, SocketAddrV4, SocketAddrV6}; use crate::utils::as_ptr; use core::mem::{size_of, MaybeUninit}; -#[cfg(not(any( - windows, - target_os = "espidf", - target_os = "redox", - target_os = "vita", - target_os = "wasi" -)))] +#[cfg(not(any(windows, target_os = "espidf", target_os = "redox", target_os = "wasi")))] use { super::msghdr::{with_noaddr_msghdr, with_recv_msghdr, with_v4_msghdr, with_v6_msghdr}, crate::io::{IoSlice, IoSliceMut}, @@ -249,19 +244,6 @@ } #[cfg(not(any(target_os = "redox", target_os = "wasi")))] -pub(crate) fn connect_unspec(sockfd: BorrowedFd<'_>) -> io::Result<()> { - debug_assert_eq!(c::AF_UNSPEC, 0); - let addr = MaybeUninit::::zeroed(); - unsafe { - ret(c::connect( - borrowed_fd(sockfd), - as_ptr(&addr).cast(), - size_of::() as c::socklen_t, - )) - } -} - -#[cfg(not(any(target_os = "redox", target_os = "wasi")))] pub(crate) fn listen(sockfd: BorrowedFd<'_>, backlog: c::c_int) -> io::Result<()> { unsafe { ret(c::listen(borrowed_fd(sockfd), backlog)) } } @@ -274,13 +256,7 @@ } } -#[cfg(not(any( - windows, - target_os = "espidf", - target_os = "redox", - target_os = "vita", - target_os = "wasi" -)))] +#[cfg(not(any(windows, target_os = "espidf", target_os = "redox", target_os = "wasi")))] pub(crate) fn recvmsg( sockfd: BorrowedFd<'_>, iov: &mut [IoSliceMut<'_>], @@ -312,13 +288,7 @@ }) } -#[cfg(not(any( - windows, - target_os = "espidf", - target_os = "redox", - target_os = "vita", - target_os = "wasi" -)))] +#[cfg(not(any(windows, target_os = "espidf", target_os = "redox", target_os = "wasi")))] pub(crate) fn sendmsg( sockfd: BorrowedFd<'_>, iov: &[IoSlice<'_>], @@ -334,13 +304,7 @@ }) } -#[cfg(not(any( - windows, - target_os = "espidf", - target_os = "redox", - target_os = "vita", - target_os = "wasi" -)))] +#[cfg(not(any(windows, target_os = "espidf", target_os = "redox", target_os = "wasi")))] pub(crate) fn sendmsg_v4( sockfd: BorrowedFd<'_>, addr: &SocketAddrV4, @@ -357,13 +321,7 @@ }) } -#[cfg(not(any( - windows, - target_os = "espidf", - target_os = "redox", - target_os = "vita", - target_os = "wasi" -)))] +#[cfg(not(any(windows, target_os = "espidf", target_os = "redox", target_os = "wasi")))] pub(crate) fn sendmsg_v6( sockfd: BorrowedFd<'_>, addr: &SocketAddrV6, @@ -380,10 +338,7 @@ }) } -#[cfg(all( - unix, - not(any(target_os = "espidf", target_os = "redox", target_os = "vita")) -))] +#[cfg(all(unix, not(any(target_os = "espidf", target_os = "redox"))))] pub(crate) fn sendmsg_unix( sockfd: BorrowedFd<'_>, addr: &SocketAddrUnix, @@ -403,12 +358,10 @@ #[cfg(not(any( apple, windows, - target_os = "aix", target_os = "espidf", target_os = "haiku", target_os = "redox", target_os = "nto", - target_os = "vita", target_os = "wasi", )))] pub(crate) fn accept_with(sockfd: BorrowedFd<'_>, flags: SocketFlags) -> io::Result { @@ -443,12 +396,10 @@ #[cfg(not(any( apple, windows, - target_os = "aix", target_os = "espidf", target_os = "haiku", target_os = "nto", target_os = "redox", - target_os = "vita", target_os = "wasi", )))] pub(crate) fn acceptfrom_with( @@ -476,11 +427,9 @@ #[cfg(any( apple, windows, - target_os = "aix", target_os = "espidf", target_os = "haiku", - target_os = "nto", - target_os = "vita", + target_os = "nto" ))] pub(crate) fn accept_with(sockfd: BorrowedFd<'_>, _flags: SocketFlags) -> io::Result { accept(sockfd) @@ -491,11 +440,9 @@ #[cfg(any( apple, windows, - target_os = "aix", target_os = "espidf", target_os = "haiku", - target_os = "nto", - target_os = "vita", + target_os = "nto" ))] pub(crate) fn acceptfrom_with( sockfd: BorrowedFd<'_>, @@ -564,3 +511,577 @@ Ok((fd0, fd1)) } } + +#[cfg(not(any(target_os = "redox", target_os = "wasi")))] +pub(crate) mod sockopt { + use super::{c, in6_addr_new, in_addr_new, BorrowedFd}; + use crate::io; + use crate::net::sockopt::Timeout; + #[cfg(not(any( + apple, + solarish, + windows, + target_os = "dragonfly", + target_os = "emscripten", + target_os = "espidf", + target_os = "haiku", + target_os = "netbsd", + target_os = "nto", + target_os = "openbsd" + )))] + use crate::net::AddressFamily; + use crate::net::{Ipv4Addr, Ipv6Addr, SocketType}; + use crate::utils::as_mut_ptr; + use core::time::Duration; + #[cfg(windows)] + use windows_sys::Win32::Foundation::BOOL; + + #[inline] + fn getsockopt(fd: BorrowedFd<'_>, level: i32, optname: i32) -> io::Result { + use super::*; + + let mut optlen = core::mem::size_of::().try_into().unwrap(); + debug_assert!( + optlen as usize >= core::mem::size_of::(), + "Socket APIs don't ever use `bool` directly" + ); + + unsafe { + let mut value = core::mem::zeroed::(); + ret(c::getsockopt( + borrowed_fd(fd), + level, + optname, + as_mut_ptr(&mut value).cast(), + &mut optlen, + ))?; + // On Windows at least, `getsockopt` has been observed writing 1 + // byte on at least (`IPPROTO_TCP`, `TCP_NODELAY`), even though + // Windows' documentation says that should write a 4-byte `BOOL`. + // So, we initialize the memory to zeros above, and just assert + // that `getsockopt` doesn't write too many bytes here. + assert!( + optlen as usize <= size_of::(), + "unexpected getsockopt size" + ); + Ok(value) + } + } + + #[inline] + fn setsockopt( + fd: BorrowedFd<'_>, + level: i32, + optname: i32, + value: T, + ) -> io::Result<()> { + use super::*; + + let optlen = core::mem::size_of::().try_into().unwrap(); + debug_assert!( + optlen as usize >= core::mem::size_of::(), + "Socket APIs don't ever use `bool` directly" + ); + + unsafe { + ret(c::setsockopt( + borrowed_fd(fd), + level, + optname, + as_ptr(&value).cast(), + optlen, + )) + } + } + + #[inline] + pub(crate) fn get_socket_type(fd: BorrowedFd<'_>) -> io::Result { + getsockopt(fd, c::SOL_SOCKET as _, c::SO_TYPE) + } + + #[inline] + pub(crate) fn set_socket_reuseaddr(fd: BorrowedFd<'_>, reuseaddr: bool) -> io::Result<()> { + setsockopt( + fd, + c::SOL_SOCKET as _, + c::SO_REUSEADDR, + from_bool(reuseaddr), + ) + } + + #[inline] + pub(crate) fn set_socket_broadcast(fd: BorrowedFd<'_>, broadcast: bool) -> io::Result<()> { + setsockopt( + fd, + c::SOL_SOCKET as _, + c::SO_BROADCAST, + from_bool(broadcast), + ) + } + + #[inline] + pub(crate) fn get_socket_broadcast(fd: BorrowedFd<'_>) -> io::Result { + getsockopt(fd, c::SOL_SOCKET as _, c::SO_BROADCAST).map(to_bool) + } + + #[inline] + pub(crate) fn set_socket_linger( + fd: BorrowedFd<'_>, + linger: Option, + ) -> io::Result<()> { + // Convert `linger` to seconds, rounding up. + let l_linger = if let Some(linger) = linger { + let mut l_linger = linger.as_secs(); + if linger.subsec_nanos() != 0 { + l_linger = l_linger.checked_add(1).ok_or(io::Errno::INVAL)?; + } + l_linger.try_into().map_err(|_e| io::Errno::INVAL)? + } else { + 0 + }; + let linger = c::linger { + l_onoff: linger.is_some() as _, + l_linger, + }; + setsockopt(fd, c::SOL_SOCKET as _, c::SO_LINGER, linger) + } + + #[inline] + pub(crate) fn get_socket_linger(fd: BorrowedFd<'_>) -> io::Result> { + let linger: c::linger = getsockopt(fd, c::SOL_SOCKET as _, c::SO_LINGER)?; + Ok((linger.l_onoff != 0).then(|| Duration::from_secs(linger.l_linger as u64))) + } + + #[cfg(linux_kernel)] + #[inline] + pub(crate) fn set_socket_passcred(fd: BorrowedFd<'_>, passcred: bool) -> io::Result<()> { + setsockopt(fd, c::SOL_SOCKET as _, c::SO_PASSCRED, from_bool(passcred)) + } + + #[cfg(linux_kernel)] + #[inline] + pub(crate) fn get_socket_passcred(fd: BorrowedFd<'_>) -> io::Result { + getsockopt(fd, c::SOL_SOCKET as _, c::SO_PASSCRED).map(to_bool) + } + + #[inline] + pub(crate) fn set_socket_timeout( + fd: BorrowedFd<'_>, + id: Timeout, + timeout: Option, + ) -> io::Result<()> { + let optname = match id { + Timeout::Recv => c::SO_RCVTIMEO, + Timeout::Send => c::SO_SNDTIMEO, + }; + + #[cfg(not(windows))] + let timeout = match timeout { + Some(timeout) => { + if timeout == Duration::ZERO { + return Err(io::Errno::INVAL); + } + + // Rust's musl libc bindings deprecated `time_t` while they + // transition to 64-bit `time_t`. What we want here is just + // “whatever type `timeval`'s `tv_sec` isâ€, so we're ok using + // the deprecated type. + #[allow(deprecated)] + let tv_sec = timeout.as_secs().try_into().unwrap_or(c::time_t::MAX); + + // `subsec_micros` rounds down, so we use `subsec_nanos` and + // manually round up. + let mut timeout = c::timeval { + tv_sec, + tv_usec: ((timeout.subsec_nanos() + 999) / 1000) as _, + }; + if timeout.tv_sec == 0 && timeout.tv_usec == 0 { + timeout.tv_usec = 1; + } + timeout + } + None => c::timeval { + tv_sec: 0, + tv_usec: 0, + }, + }; + + #[cfg(windows)] + let timeout: u32 = match timeout { + Some(timeout) => { + if timeout == Duration::ZERO { + return Err(io::Errno::INVAL); + } + + // `as_millis` rounds down, so we use `as_nanos` and + // manually round up. + let mut timeout: u32 = ((timeout.as_nanos() + 999_999) / 1_000_000) + .try_into() + .map_err(|_convert_err| io::Errno::INVAL)?; + if timeout == 0 { + timeout = 1; + } + timeout + } + None => 0, + }; + + setsockopt(fd, c::SOL_SOCKET, optname, timeout) + } + + #[inline] + pub(crate) fn get_socket_timeout( + fd: BorrowedFd<'_>, + id: Timeout, + ) -> io::Result> { + let optname = match id { + Timeout::Recv => c::SO_RCVTIMEO, + Timeout::Send => c::SO_SNDTIMEO, + }; + + #[cfg(not(windows))] + { + let timeout: c::timeval = getsockopt(fd, c::SOL_SOCKET, optname)?; + if timeout.tv_sec == 0 && timeout.tv_usec == 0 { + Ok(None) + } else { + Ok(Some( + Duration::from_secs(timeout.tv_sec as u64) + + Duration::from_micros(timeout.tv_usec as u64), + )) + } + } + + #[cfg(windows)] + { + let timeout: u32 = getsockopt(fd, c::SOL_SOCKET, optname)?; + if timeout == 0 { + Ok(None) + } else { + Ok(Some(Duration::from_millis(timeout as u64))) + } + } + } + + #[cfg(any(apple, target_os = "freebsd"))] + #[inline] + pub(crate) fn get_socket_nosigpipe(fd: BorrowedFd<'_>) -> io::Result { + getsockopt(fd, c::SOL_SOCKET, c::SO_NOSIGPIPE).map(to_bool) + } + + #[cfg(any(apple, target_os = "freebsd"))] + #[inline] + pub(crate) fn set_socket_nosigpipe(fd: BorrowedFd<'_>, val: bool) -> io::Result<()> { + setsockopt(fd, c::SOL_SOCKET, c::SO_NOSIGPIPE, from_bool(val)) + } + + #[inline] + pub(crate) fn get_socket_error(fd: BorrowedFd<'_>) -> io::Result> { + let err: c::c_int = getsockopt(fd, c::SOL_SOCKET as _, c::SO_ERROR)?; + Ok(if err == 0 { + Ok(()) + } else { + Err(io::Errno::from_raw_os_error(err)) + }) + } + + #[inline] + pub(crate) fn set_socket_keepalive(fd: BorrowedFd<'_>, keepalive: bool) -> io::Result<()> { + setsockopt( + fd, + c::SOL_SOCKET as _, + c::SO_KEEPALIVE, + from_bool(keepalive), + ) + } + + #[inline] + pub(crate) fn get_socket_keepalive(fd: BorrowedFd<'_>) -> io::Result { + getsockopt(fd, c::SOL_SOCKET as _, c::SO_KEEPALIVE).map(to_bool) + } + + #[inline] + pub(crate) fn set_socket_recv_buffer_size(fd: BorrowedFd<'_>, size: usize) -> io::Result<()> { + let size: c::c_int = size.try_into().map_err(|_| io::Errno::INVAL)?; + setsockopt(fd, c::SOL_SOCKET as _, c::SO_RCVBUF, size) + } + + #[inline] + pub(crate) fn get_socket_recv_buffer_size(fd: BorrowedFd<'_>) -> io::Result { + getsockopt(fd, c::SOL_SOCKET as _, c::SO_RCVBUF).map(|size: u32| size as usize) + } + + #[inline] + pub(crate) fn set_socket_send_buffer_size(fd: BorrowedFd<'_>, size: usize) -> io::Result<()> { + let size: c::c_int = size.try_into().map_err(|_| io::Errno::INVAL)?; + setsockopt(fd, c::SOL_SOCKET as _, c::SO_SNDBUF, size) + } + + #[inline] + pub(crate) fn get_socket_send_buffer_size(fd: BorrowedFd<'_>) -> io::Result { + getsockopt(fd, c::SOL_SOCKET as _, c::SO_SNDBUF).map(|size: u32| size as usize) + } + + #[inline] + #[cfg(not(any( + apple, + solarish, + windows, + target_os = "dragonfly", + target_os = "emscripten", + target_os = "espidf", + target_os = "haiku", + target_os = "netbsd", + target_os = "nto", + target_os = "openbsd" + )))] + pub(crate) fn get_socket_domain(fd: BorrowedFd<'_>) -> io::Result { + let domain: c::c_int = getsockopt(fd, c::SOL_SOCKET as _, c::SO_DOMAIN)?; + Ok(AddressFamily( + domain.try_into().map_err(|_| io::Errno::OPNOTSUPP)?, + )) + } + + #[inline] + pub(crate) fn set_ip_ttl(fd: BorrowedFd<'_>, ttl: u32) -> io::Result<()> { + setsockopt(fd, c::IPPROTO_IP as _, c::IP_TTL, ttl) + } + + #[inline] + pub(crate) fn get_ip_ttl(fd: BorrowedFd<'_>) -> io::Result { + getsockopt(fd, c::IPPROTO_IP as _, c::IP_TTL) + } + + #[inline] + pub(crate) fn set_ipv6_v6only(fd: BorrowedFd<'_>, only_v6: bool) -> io::Result<()> { + setsockopt(fd, c::IPPROTO_IPV6 as _, c::IPV6_V6ONLY, from_bool(only_v6)) + } + + #[inline] + pub(crate) fn get_ipv6_v6only(fd: BorrowedFd<'_>) -> io::Result { + getsockopt(fd, c::IPPROTO_IPV6 as _, c::IPV6_V6ONLY).map(to_bool) + } + + #[inline] + pub(crate) fn set_ip_multicast_loop( + fd: BorrowedFd<'_>, + multicast_loop: bool, + ) -> io::Result<()> { + setsockopt( + fd, + c::IPPROTO_IP as _, + c::IP_MULTICAST_LOOP, + from_bool(multicast_loop), + ) + } + + #[inline] + pub(crate) fn get_ip_multicast_loop(fd: BorrowedFd<'_>) -> io::Result { + getsockopt(fd, c::IPPROTO_IP as _, c::IP_MULTICAST_LOOP).map(to_bool) + } + + #[inline] + pub(crate) fn set_ip_multicast_ttl(fd: BorrowedFd<'_>, multicast_ttl: u32) -> io::Result<()> { + setsockopt(fd, c::IPPROTO_IP as _, c::IP_MULTICAST_TTL, multicast_ttl) + } + + #[inline] + pub(crate) fn get_ip_multicast_ttl(fd: BorrowedFd<'_>) -> io::Result { + getsockopt(fd, c::IPPROTO_IP as _, c::IP_MULTICAST_TTL) + } + + #[inline] + pub(crate) fn set_ipv6_multicast_loop( + fd: BorrowedFd<'_>, + multicast_loop: bool, + ) -> io::Result<()> { + setsockopt( + fd, + c::IPPROTO_IPV6 as _, + c::IPV6_MULTICAST_LOOP, + from_bool(multicast_loop), + ) + } + + #[inline] + pub(crate) fn get_ipv6_multicast_loop(fd: BorrowedFd<'_>) -> io::Result { + getsockopt(fd, c::IPPROTO_IPV6 as _, c::IPV6_MULTICAST_LOOP).map(to_bool) + } + + #[inline] + pub(crate) fn set_ipv6_multicast_hops( + fd: BorrowedFd<'_>, + multicast_hops: u32, + ) -> io::Result<()> { + setsockopt( + fd, + c::IPPROTO_IP as _, + c::IPV6_MULTICAST_HOPS, + multicast_hops, + ) + } + + #[inline] + pub(crate) fn get_ipv6_multicast_hops(fd: BorrowedFd<'_>) -> io::Result { + getsockopt(fd, c::IPPROTO_IP as _, c::IPV6_MULTICAST_HOPS) + } + + #[inline] + pub(crate) fn set_ip_add_membership( + fd: BorrowedFd<'_>, + multiaddr: &Ipv4Addr, + interface: &Ipv4Addr, + ) -> io::Result<()> { + let mreq = to_imr(multiaddr, interface); + setsockopt(fd, c::IPPROTO_IP as _, c::IP_ADD_MEMBERSHIP, mreq) + } + + #[inline] + pub(crate) fn set_ipv6_add_membership( + fd: BorrowedFd<'_>, + multiaddr: &Ipv6Addr, + interface: u32, + ) -> io::Result<()> { + #[cfg(not(any( + bsd, + solarish, + target_os = "haiku", + target_os = "l4re", + target_os = "nto" + )))] + use c::IPV6_ADD_MEMBERSHIP; + #[cfg(any( + bsd, + solarish, + target_os = "haiku", + target_os = "l4re", + target_os = "nto" + ))] + use c::IPV6_JOIN_GROUP as IPV6_ADD_MEMBERSHIP; + + let mreq = to_ipv6mr(multiaddr, interface); + setsockopt(fd, c::IPPROTO_IPV6 as _, IPV6_ADD_MEMBERSHIP, mreq) + } + + #[inline] + pub(crate) fn set_ip_drop_membership( + fd: BorrowedFd<'_>, + multiaddr: &Ipv4Addr, + interface: &Ipv4Addr, + ) -> io::Result<()> { + let mreq = to_imr(multiaddr, interface); + setsockopt(fd, c::IPPROTO_IP as _, c::IP_DROP_MEMBERSHIP, mreq) + } + + #[inline] + pub(crate) fn set_ipv6_drop_membership( + fd: BorrowedFd<'_>, + multiaddr: &Ipv6Addr, + interface: u32, + ) -> io::Result<()> { + #[cfg(not(any( + bsd, + solarish, + target_os = "haiku", + target_os = "l4re", + target_os = "nto" + )))] + use c::IPV6_DROP_MEMBERSHIP; + #[cfg(any( + bsd, + solarish, + target_os = "haiku", + target_os = "l4re", + target_os = "nto" + ))] + use c::IPV6_LEAVE_GROUP as IPV6_DROP_MEMBERSHIP; + + let mreq = to_ipv6mr(multiaddr, interface); + setsockopt(fd, c::IPPROTO_IPV6 as _, IPV6_DROP_MEMBERSHIP, mreq) + } + + #[inline] + pub(crate) fn get_ipv6_unicast_hops(fd: BorrowedFd<'_>) -> io::Result { + getsockopt(fd, c::IPPROTO_IPV6 as _, c::IPV6_UNICAST_HOPS).map(|hops: c::c_int| hops as u8) + } + + #[inline] + pub(crate) fn set_ipv6_unicast_hops(fd: BorrowedFd<'_>, hops: Option) -> io::Result<()> { + let hops = match hops { + Some(hops) => hops as c::c_int, + None => -1, + }; + setsockopt(fd, c::IPPROTO_IPV6 as _, c::IPV6_UNICAST_HOPS, hops) + } + + #[inline] + pub(crate) fn set_tcp_nodelay(fd: BorrowedFd<'_>, nodelay: bool) -> io::Result<()> { + setsockopt(fd, c::IPPROTO_TCP as _, c::TCP_NODELAY, from_bool(nodelay)) + } + + #[inline] + pub(crate) fn get_tcp_nodelay(fd: BorrowedFd<'_>) -> io::Result { + getsockopt(fd, c::IPPROTO_TCP as _, c::TCP_NODELAY).map(to_bool) + } + + #[inline] + fn to_imr(multiaddr: &Ipv4Addr, interface: &Ipv4Addr) -> c::ip_mreq { + c::ip_mreq { + imr_multiaddr: to_imr_addr(multiaddr), + imr_interface: to_imr_addr(interface), + } + } + + #[inline] + fn to_imr_addr(addr: &Ipv4Addr) -> c::in_addr { + in_addr_new(u32::from_ne_bytes(addr.octets())) + } + + #[inline] + fn to_ipv6mr(multiaddr: &Ipv6Addr, interface: u32) -> c::ipv6_mreq { + c::ipv6_mreq { + ipv6mr_multiaddr: to_ipv6mr_multiaddr(multiaddr), + ipv6mr_interface: to_ipv6mr_interface(interface), + } + } + + #[inline] + fn to_ipv6mr_multiaddr(multiaddr: &Ipv6Addr) -> c::in6_addr { + in6_addr_new(multiaddr.octets()) + } + + #[cfg(target_os = "android")] + #[inline] + fn to_ipv6mr_interface(interface: u32) -> c::c_int { + interface as c::c_int + } + + #[cfg(not(target_os = "android"))] + #[inline] + fn to_ipv6mr_interface(interface: u32) -> c::c_uint { + interface as c::c_uint + } + + // `getsockopt` and `setsockopt` represent boolean values as integers. + #[cfg(not(windows))] + type RawSocketBool = c::c_int; + #[cfg(windows)] + type RawSocketBool = BOOL; + + // Wrap `RawSocketBool` in a newtype to discourage misuse. + #[repr(transparent)] + #[derive(Copy, Clone)] + struct SocketBool(RawSocketBool); + + // Convert from a `bool` to a `SocketBool`. + #[inline] + fn from_bool(value: bool) -> SocketBool { + SocketBool(value as _) + } + + // Convert from a `SocketBool` to a `bool`. + #[inline] + fn to_bool(value: SocketBool) -> bool { + value.0 != 0 + } +} diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/libc/net/write_sockaddr.rs temporalio-1.3.0/vendor/rustix/src/backend/libc/net/write_sockaddr.rs --- temporalio-1.3.0/vendor/rustix/src/backend/libc/net/write_sockaddr.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/libc/net/write_sockaddr.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,5 +1,5 @@ -//! The BSD sockets API requires us to read the `ss_family` field before we can -//! interpret the rest of a `sockaddr` produced by the kernel. +//! The BSD sockets API requires us to read the `ss_family` field before +//! we can interpret the rest of a `sockaddr` produced by the kernel. use super::addr::SocketAddrStorage; #[cfg(unix)] @@ -23,26 +23,15 @@ pub(crate) fn encode_sockaddr_v4(v4: &SocketAddrV4) -> c::sockaddr_in { c::sockaddr_in { - #[cfg(any( - bsd, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "nto", - target_os = "vita", - ))] + #[cfg(any(bsd, target_os = "espidf", target_os = "haiku", target_os = "nto"))] sin_len: size_of::() as _, sin_family: c::AF_INET as _, sin_port: u16::to_be(v4.port()), sin_addr: in_addr_new(u32::from_ne_bytes(v4.ip().octets())), - #[cfg(not(any(target_os = "haiku", target_os = "vita")))] + #[cfg(not(target_os = "haiku"))] sin_zero: [0; 8_usize], #[cfg(target_os = "haiku")] sin_zero: [0; 24_usize], - #[cfg(target_os = "vita")] - sin_zero: [0; 6_usize], - #[cfg(target_os = "vita")] - sin_vport: 0, } } @@ -53,14 +42,7 @@ } pub(crate) fn encode_sockaddr_v6(v6: &SocketAddrV6) -> c::sockaddr_in6 { - #[cfg(any( - bsd, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "nto", - target_os = "vita" - ))] + #[cfg(any(bsd, target_os = "espidf", target_os = "haiku", target_os = "nto"))] { sockaddr_in6_new( size_of::() as _, @@ -71,14 +53,7 @@ v6.scope_id(), ) } - #[cfg(not(any( - bsd, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "nto", - target_os = "vita" - )))] + #[cfg(not(any(bsd, target_os = "espidf", target_os = "haiku", target_os = "nto")))] { sockaddr_in6_new( c::AF_INET6 as _, diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/libc/param/auxv.rs temporalio-1.3.0/vendor/rustix/src/backend/libc/param/auxv.rs --- temporalio-1.3.0/vendor/rustix/src/backend/libc/param/auxv.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/libc/param/auxv.rs 2023-10-30 19:40:00.000000000 +0000 @@ -17,7 +17,7 @@ unsafe { c::sysconf(c::_SC_PAGESIZE) as usize } } -#[cfg(not(any(target_os = "vita", target_os = "wasi")))] +#[cfg(not(target_os = "wasi"))] #[inline] pub(crate) fn clock_ticks_per_second() -> u64 { unsafe { c::sysconf(c::_SC_CLK_TCK) as u64 } diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/libc/pipe/syscalls.rs temporalio-1.3.0/vendor/rustix/src/backend/libc/pipe/syscalls.rs --- temporalio-1.3.0/vendor/rustix/src/backend/libc/pipe/syscalls.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/libc/pipe/syscalls.rs 2023-10-30 19:40:00.000000000 +0000 @@ -55,9 +55,9 @@ #[cfg(linux_kernel)] #[inline] pub fn splice( - fd_in: BorrowedFd<'_>, + fd_in: BorrowedFd, off_in: Option<&mut u64>, - fd_out: BorrowedFd<'_>, + fd_out: BorrowedFd, off_out: Option<&mut u64>, len: usize, flags: SpliceFlags, @@ -80,8 +80,8 @@ #[cfg(linux_kernel)] #[inline] pub unsafe fn vmsplice( - fd: BorrowedFd<'_>, - bufs: &[IoSliceRaw<'_>], + fd: BorrowedFd, + bufs: &[IoSliceRaw], flags: SpliceFlags, ) -> io::Result { ret_usize(c::vmsplice( @@ -95,8 +95,8 @@ #[cfg(linux_kernel)] #[inline] pub fn tee( - fd_in: BorrowedFd<'_>, - fd_out: BorrowedFd<'_>, + fd_in: BorrowedFd, + fd_out: BorrowedFd, len: usize, flags: SpliceFlags, ) -> io::Result { diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/libc/pipe/types.rs temporalio-1.3.0/vendor/rustix/src/backend/libc/pipe/types.rs --- temporalio-1.3.0/vendor/rustix/src/backend/libc/pipe/types.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/libc/pipe/types.rs 2023-10-30 19:40:00.000000000 +0000 @@ -21,14 +21,10 @@ target_os = "nto", target_os = "openbsd", target_os = "redox", - target_os = "vita", )))] const DIRECT = bitcast!(c::O_DIRECT); /// `O_NONBLOCK` const NONBLOCK = bitcast!(c::O_NONBLOCK); - - /// - const _ = !0; } } @@ -47,9 +43,6 @@ const MORE = c::SPLICE_F_MORE; /// `SPLICE_F_GIFT` const GIFT = c::SPLICE_F_GIFT; - - /// - const _ = !0; } } diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/libc/process/mod.rs temporalio-1.3.0/vendor/rustix/src/backend/libc/process/mod.rs --- temporalio-1.3.0/vendor/rustix/src/backend/libc/process/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/libc/process/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -3,5 +3,5 @@ #[cfg(not(windows))] pub(crate) mod syscalls; pub(crate) mod types; -#[cfg(not(any(target_os = "espidf", target_os = "vita", target_os = "wasi")))] +#[cfg(not(any(target_os = "espidf", target_os = "wasi")))] pub(crate) mod wait; diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/libc/process/syscalls.rs temporalio-1.3.0/vendor/rustix/src/backend/libc/process/syscalls.rs --- temporalio-1.3.0/vendor/rustix/src/backend/libc/process/syscalls.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/libc/process/syscalls.rs 2023-10-30 19:40:00.000000000 +0000 @@ -3,28 +3,23 @@ #[cfg(any(linux_kernel, target_os = "dragonfly", target_os = "fuchsia"))] use super::types::RawCpuSet; use crate::backend::c; -#[cfg(not(any(target_os = "wasi", target_os = "fuchsia")))] -use crate::backend::conv::borrowed_fd; #[cfg(feature = "fs")] use crate::backend::conv::c_str; -#[cfg(all(feature = "alloc", feature = "fs", not(target_os = "wasi")))] +#[cfg(all(feature = "fs", not(target_os = "wasi")))] use crate::backend::conv::ret_discarded_char_ptr; #[cfg(not(any( target_os = "espidf", target_os = "fuchsia", target_os = "redox", - target_os = "vita", target_os = "wasi" )))] use crate::backend::conv::ret_infallible; -#[cfg(not(target_os = "wasi"))] -use crate::backend::conv::ret_pid_t; #[cfg(linux_kernel)] use crate::backend::conv::ret_u32; -#[cfg(all(feature = "alloc", not(target_os = "wasi")))] -use crate::backend::conv::ret_usize; +#[cfg(not(target_os = "wasi"))] +use crate::backend::conv::{borrowed_fd, ret_pid_t, ret_usize}; use crate::backend::conv::{ret, ret_c_int}; -#[cfg(not(any(target_os = "wasi", target_os = "fuchsia")))] +#[cfg(not(target_os = "wasi"))] use crate::fd::BorrowedFd; #[cfg(target_os = "linux")] use crate::fd::{AsRawFd, OwnedFd, RawFd}; @@ -33,28 +28,18 @@ #[cfg(feature = "fs")] use crate::fs::Mode; use crate::io; -#[cfg(all(feature = "alloc", not(target_os = "wasi")))] -use crate::process::Gid; -#[cfg(not(target_os = "wasi"))] -use crate::process::Pid; -#[cfg(not(any(target_os = "espidf", target_os = "wasi")))] -use crate::process::Signal; -#[cfg(not(any( - target_os = "espidf", - target_os = "fuchsia", - target_os = "vita", - target_os = "wasi" -)))] +#[cfg(not(any(target_os = "espidf", target_os = "fuchsia", target_os = "wasi")))] use crate::process::Uid; #[cfg(linux_kernel)] use crate::process::{Cpuid, MembarrierCommand, MembarrierQuery}; -#[cfg(not(any(target_os = "espidf", target_os = "vita", target_os = "wasi")))] -use crate::process::{RawPid, WaitOptions, WaitStatus}; +#[cfg(not(target_os = "wasi"))] +use crate::process::{Gid, Pid}; +#[cfg(not(any(target_os = "espidf", target_os = "wasi")))] +use crate::process::{RawPid, Signal, WaitOptions, WaitStatus}; #[cfg(not(any( target_os = "espidf", target_os = "fuchsia", target_os = "redox", - target_os = "vita", target_os = "wasi" )))] use crate::process::{Resource, Rlimit}; @@ -62,7 +47,6 @@ target_os = "espidf", target_os = "redox", target_os = "openbsd", - target_os = "vita", target_os = "wasi" )))] use crate::process::{WaitId, WaitidOptions, WaitidStatus}; @@ -89,7 +73,7 @@ unsafe { ret(c::chroot(c_str(path))) } } -#[cfg(all(feature = "alloc", feature = "fs"))] +#[cfg(feature = "fs")] #[cfg(not(target_os = "wasi"))] pub(crate) fn getcwd(buf: &mut [MaybeUninit]) -> io::Result<()> { unsafe { ret_discarded_char_ptr(c::getcwd(buf.as_mut_ptr().cast(), buf.len())) } @@ -219,7 +203,7 @@ unsafe { Mode::from_bits_retain(c::umask(mask.bits() as c::mode_t).into()) } } -#[cfg(not(any(target_os = "fuchsia", target_os = "vita", target_os = "wasi")))] +#[cfg(not(any(target_os = "fuchsia", target_os = "wasi")))] #[inline] pub(crate) fn nice(inc: i32) -> io::Result { libc_errno::set_errno(libc_errno::Errno(0)); @@ -231,12 +215,7 @@ } } -#[cfg(not(any( - target_os = "espidf", - target_os = "fuchsia", - target_os = "vita", - target_os = "wasi" -)))] +#[cfg(not(any(target_os = "espidf", target_os = "fuchsia", target_os = "wasi")))] #[inline] pub(crate) fn getpriority_user(uid: Uid) -> io::Result { libc_errno::set_errno(libc_errno::Errno(0)); @@ -248,12 +227,7 @@ } } -#[cfg(not(any( - target_os = "espidf", - target_os = "fuchsia", - target_os = "vita", - target_os = "wasi" -)))] +#[cfg(not(any(target_os = "espidf", target_os = "fuchsia", target_os = "wasi")))] #[inline] pub(crate) fn getpriority_pgrp(pgid: Option) -> io::Result { libc_errno::set_errno(libc_errno::Errno(0)); @@ -265,12 +239,7 @@ } } -#[cfg(not(any( - target_os = "espidf", - target_os = "fuchsia", - target_os = "vita", - target_os = "wasi" -)))] +#[cfg(not(any(target_os = "espidf", target_os = "fuchsia", target_os = "wasi")))] #[inline] pub(crate) fn getpriority_process(pid: Option) -> io::Result { libc_errno::set_errno(libc_errno::Errno(0)); @@ -282,23 +251,13 @@ } } -#[cfg(not(any( - target_os = "espidf", - target_os = "fuchsia", - target_os = "vita", - target_os = "wasi" -)))] +#[cfg(not(any(target_os = "espidf", target_os = "fuchsia", target_os = "wasi")))] #[inline] pub(crate) fn setpriority_user(uid: Uid, priority: i32) -> io::Result<()> { unsafe { ret(c::setpriority(c::PRIO_USER, uid.as_raw() as _, priority)) } } -#[cfg(not(any( - target_os = "espidf", - target_os = "fuchsia", - target_os = "vita", - target_os = "wasi" -)))] +#[cfg(not(any(target_os = "espidf", target_os = "fuchsia", target_os = "wasi")))] #[inline] pub(crate) fn setpriority_pgrp(pgid: Option, priority: i32) -> io::Result<()> { unsafe { @@ -310,12 +269,7 @@ } } -#[cfg(not(any( - target_os = "espidf", - target_os = "fuchsia", - target_os = "vita", - target_os = "wasi" -)))] +#[cfg(not(any(target_os = "espidf", target_os = "fuchsia", target_os = "wasi")))] #[inline] pub(crate) fn setpriority_process(pid: Option, priority: i32) -> io::Result<()> { unsafe { @@ -331,7 +285,6 @@ target_os = "espidf", target_os = "fuchsia", target_os = "redox", - target_os = "vita", target_os = "wasi" )))] #[inline] @@ -347,7 +300,6 @@ target_os = "espidf", target_os = "fuchsia", target_os = "redox", - target_os = "vita", target_os = "wasi" )))] #[inline] @@ -377,7 +329,6 @@ target_os = "espidf", target_os = "fuchsia", target_os = "redox", - target_os = "vita", target_os = "wasi" )))] fn rlimit_from_libc(lim: c::rlimit) -> Rlimit { @@ -399,7 +350,6 @@ target_os = "espidf", target_os = "fuchsia", target_os = "redox", - target_os = "vita", target_os = "wasi" )))] fn rlimit_to_libc(lim: Rlimit) -> io::Result { @@ -415,13 +365,13 @@ Ok(c::rlimit { rlim_cur, rlim_max }) } -#[cfg(not(any(target_os = "espidf", target_os = "vita", target_os = "wasi")))] +#[cfg(not(any(target_os = "espidf", target_os = "wasi")))] #[inline] pub(crate) fn wait(waitopts: WaitOptions) -> io::Result> { _waitpid(!0, waitopts) } -#[cfg(not(any(target_os = "espidf", target_os = "vita", target_os = "wasi")))] +#[cfg(not(any(target_os = "espidf", target_os = "wasi")))] #[inline] pub(crate) fn waitpid( pid: Option, @@ -430,13 +380,7 @@ _waitpid(Pid::as_raw(pid), waitopts) } -#[cfg(not(any(target_os = "espidf", target_os = "vita", target_os = "wasi")))] -#[inline] -pub(crate) fn waitpgid(pgid: Pid, waitopts: WaitOptions) -> io::Result> { - _waitpid(-pgid.as_raw_nonzero().get(), waitopts) -} - -#[cfg(not(any(target_os = "espidf", target_os = "vita", target_os = "wasi")))] +#[cfg(not(any(target_os = "espidf", target_os = "wasi")))] #[inline] pub(crate) fn _waitpid( pid: RawPid, @@ -453,7 +397,6 @@ target_os = "espidf", target_os = "redox", target_os = "openbsd", - target_os = "vita", target_os = "wasi" )))] #[inline] @@ -462,7 +405,6 @@ match id { WaitId::All => _waitid_all(options), WaitId::Pid(pid) => _waitid_pid(pid, options), - WaitId::Pgid(pgid) => _waitid_pgid(pgid, options), #[cfg(target_os = "linux")] WaitId::PidFd(fd) => _waitid_pidfd(fd, options), #[cfg(not(target_os = "linux"))] @@ -474,7 +416,6 @@ target_os = "espidf", target_os = "redox", target_os = "openbsd", - target_os = "vita", target_os = "wasi" )))] #[inline] @@ -498,7 +439,6 @@ target_os = "espidf", target_os = "redox", target_os = "openbsd", - target_os = "vita", target_os = "wasi" )))] #[inline] @@ -518,30 +458,6 @@ Ok(unsafe { cvt_waitid_status(status) }) } -#[cfg(not(any( - target_os = "espidf", - target_os = "redox", - target_os = "openbsd", - target_os = "vita", - target_os = "wasi" -)))] -#[inline] -fn _waitid_pgid(pgid: Option, options: WaitidOptions) -> io::Result> { - // `waitid` can return successfully without initializing the struct (no - // children found when using `WNOHANG`) - let mut status = MaybeUninit::::zeroed(); - unsafe { - ret(c::waitid( - c::P_PGID, - Pid::as_raw(pgid) as _, - status.as_mut_ptr(), - options.bits() as _, - ))? - }; - - Ok(unsafe { cvt_waitid_status(status) }) -} - #[cfg(target_os = "linux")] #[inline] fn _waitid_pidfd(fd: BorrowedFd<'_>, options: WaitidOptions) -> io::Result> { @@ -570,7 +486,6 @@ target_os = "espidf", target_os = "openbsd", target_os = "redox", - target_os = "vita", target_os = "wasi" )))] #[inline] @@ -697,9 +612,20 @@ } } -#[cfg(all(feature = "alloc", not(target_os = "wasi")))] +#[cfg(not(target_os = "wasi"))] pub(crate) fn getgroups(buf: &mut [Gid]) -> io::Result { let len = buf.len().try_into().map_err(|_| io::Errno::NOMEM)?; unsafe { ret_usize(c::getgroups(len, buf.as_mut_ptr().cast()) as isize) } } + +#[cfg(not(any( + target_os = "aix", + target_os = "espidf", + target_os = "redox", + target_os = "wasi" +)))] +#[inline] +pub(crate) fn ioctl_tiocsctty(fd: BorrowedFd<'_>) -> io::Result<()> { + unsafe { ret(c::ioctl(borrowed_fd(fd), c::TIOCSCTTY as _, &0_u32)) } +} diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/libc/process/types.rs temporalio-1.3.0/vendor/rustix/src/backend/libc/process/types.rs --- temporalio-1.3.0/vendor/rustix/src/backend/libc/process/types.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/libc/process/types.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,4 +1,3 @@ -#[cfg(not(any(target_os = "espidf", target_os = "vita")))] use crate::backend::c; /// A command for use with [`membarrier`] and [`membarrier_cpu`]. @@ -45,7 +44,6 @@ target_os = "espidf", target_os = "fuchsia", target_os = "redox", - target_os = "vita", target_os = "wasi" )))] #[derive(Copy, Clone, Debug, Eq, PartialEq)] @@ -84,7 +82,6 @@ solarish, target_os = "aix", target_os = "haiku", - target_os = "hurd", target_os = "nto" )))] Locks = bitcast!(c::RLIMIT_LOCKS), @@ -94,7 +91,6 @@ solarish, target_os = "aix", target_os = "haiku", - target_os = "hurd", target_os = "nto" )))] Sigpending = bitcast!(c::RLIMIT_SIGPENDING), @@ -104,7 +100,6 @@ solarish, target_os = "aix", target_os = "haiku", - target_os = "hurd", target_os = "nto" )))] Msgqueue = bitcast!(c::RLIMIT_MSGQUEUE), @@ -114,7 +109,6 @@ solarish, target_os = "aix", target_os = "haiku", - target_os = "hurd", target_os = "nto" )))] Nice = bitcast!(c::RLIMIT_NICE), @@ -124,7 +118,6 @@ solarish, target_os = "aix", target_os = "haiku", - target_os = "hurd", target_os = "nto" )))] Rtprio = bitcast!(c::RLIMIT_RTPRIO), @@ -136,7 +129,6 @@ target_os = "android", target_os = "emscripten", target_os = "haiku", - target_os = "hurd", target_os = "nto", )))] Rttime = bitcast!(c::RLIMIT_RTTIME), @@ -149,6 +141,11 @@ pub const Rss: Self = Self::As; } +pub const EXIT_SUCCESS: c::c_int = c::EXIT_SUCCESS; +pub const EXIT_FAILURE: c::c_int = c::EXIT_FAILURE; +#[cfg(not(any(target_os = "espidf", target_os = "wasi")))] +pub const EXIT_SIGNALED_SIGABRT: c::c_int = 128 + c::SIGABRT; + /// A CPU identifier as a raw integer. #[cfg(linux_kernel)] pub type RawCpuid = u32; diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/libc/pty/syscalls.rs temporalio-1.3.0/vendor/rustix/src/backend/libc/pty/syscalls.rs --- temporalio-1.3.0/vendor/rustix/src/backend/libc/pty/syscalls.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/libc/pty/syscalls.rs 2023-10-30 19:40:00.000000000 +0000 @@ -4,10 +4,9 @@ use crate::backend::conv::{borrowed_fd, ret}; use crate::fd::BorrowedFd; use crate::io; -#[cfg(all( - feature = "alloc", - any(apple, linux_like, target_os = "freebsd", target_os = "fuchsia") -))] +#[cfg(not(target_os = "android"))] +use {crate::backend::conv::ret_owned_fd, crate::fd::OwnedFd, crate::pty::OpenptFlags}; +#[cfg(any(apple, linux_like, target_os = "freebsd", target_os = "fuchsia"))] use { crate::ffi::{CStr, CString}, crate::path::SMALL_PATH_BUFFER_SIZE, @@ -16,20 +15,14 @@ }; #[cfg(not(linux_kernel))] -use crate::{backend::conv::ret_owned_fd, fd::OwnedFd, pty::OpenptFlags}; - -#[cfg(not(linux_kernel))] #[inline] pub(crate) fn openpt(flags: OpenptFlags) -> io::Result { unsafe { ret_owned_fd(c::posix_openpt(flags.bits() as _)) } } -#[cfg(all( - feature = "alloc", - any(apple, linux_like, target_os = "freebsd", target_os = "fuchsia") -))] +#[cfg(any(apple, linux_like, target_os = "freebsd", target_os = "fuchsia"))] #[inline] -pub(crate) fn ptsname(fd: BorrowedFd<'_>, mut buffer: Vec) -> io::Result { +pub(crate) fn ptsname(fd: BorrowedFd, mut buffer: Vec) -> io::Result { // This code would benefit from having a better way to read into // uninitialized memory, but that requires `unsafe`. buffer.clear(); @@ -67,8 +60,7 @@ if let Some(libc_ptsname_r) = ptsname_r.get() { libc_ptsname_r(borrowed_fd(fd), buffer.as_mut_ptr().cast(), buffer.len()) } else { - // The size declared in the `TIOCPTYGNAME` macro in - // sys/ttycom.h is 128. + // The size declared in the `TIOCPTYGNAME` macro in sys/ttycom.h is 128. let mut name: [u8; 128] = [0_u8; 128]; match c::ioctl(borrowed_fd(fd), c::TIOCPTYGNAME as _, &mut name) { 0 => { @@ -88,19 +80,24 @@ return Err(io::Errno::from_raw_os_error(r)); } - // Use `Vec` reallocation strategy to grow capacity exponentially. - buffer.reserve(1); + buffer.reserve(1); // use `Vec` reallocation strategy to grow capacity exponentially buffer.resize(buffer.capacity(), 0_u8); } } #[inline] -pub(crate) fn unlockpt(fd: BorrowedFd<'_>) -> io::Result<()> { +pub(crate) fn unlockpt(fd: BorrowedFd) -> io::Result<()> { unsafe { ret(c::unlockpt(borrowed_fd(fd))) } } #[cfg(not(linux_kernel))] #[inline] -pub(crate) fn grantpt(fd: BorrowedFd<'_>) -> io::Result<()> { +pub(crate) fn grantpt(fd: BorrowedFd) -> io::Result<()> { unsafe { ret(c::grantpt(borrowed_fd(fd))) } } + +#[cfg(target_os = "linux")] +#[inline] +pub(crate) fn ioctl_tiocgptpeer(fd: BorrowedFd, flags: OpenptFlags) -> io::Result { + unsafe { ret_owned_fd(c::ioctl(borrowed_fd(fd), c::TIOCGPTPEER, flags.bits())) } +} diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/libc/rand/types.rs temporalio-1.3.0/vendor/rustix/src/backend/libc/rand/types.rs --- temporalio-1.3.0/vendor/rustix/src/backend/libc/rand/types.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/libc/rand/types.rs 2023-10-30 19:40:00.000000000 +0000 @@ -17,8 +17,5 @@ const NONBLOCK = c::GRND_NONBLOCK; /// `GRND_INSECURE` const INSECURE = c::GRND_INSECURE; - - /// - const _ = !0; } } diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/libc/shm/mod.rs temporalio-1.3.0/vendor/rustix/src/backend/libc/shm/mod.rs --- temporalio-1.3.0/vendor/rustix/src/backend/libc/shm/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/libc/shm/mod.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,2 +0,0 @@ -pub(crate) mod syscalls; -pub(crate) mod types; diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/libc/shm/syscalls.rs temporalio-1.3.0/vendor/rustix/src/backend/libc/shm/syscalls.rs --- temporalio-1.3.0/vendor/rustix/src/backend/libc/shm/syscalls.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/libc/shm/syscalls.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -use crate::ffi::CStr; - -use crate::backend::c; -use crate::backend::conv::{c_str, ret, ret_owned_fd}; -use crate::fd::OwnedFd; -use crate::fs::Mode; -use crate::io; -use crate::shm::ShmOFlags; - -pub(crate) fn shm_open(name: &CStr, oflags: ShmOFlags, mode: Mode) -> io::Result { - // On this platforms, `mode_t` is `u16` and can't be passed directly to a - // variadic function. - #[cfg(apple)] - let mode: c::c_uint = mode.bits().into(); - - // Otherwise, cast to `mode_t` as that's what `open` is documented to take. - #[cfg(not(apple))] - let mode: c::mode_t = mode.bits() as _; - - unsafe { ret_owned_fd(c::shm_open(c_str(name), bitflags_bits!(oflags), mode)) } -} - -pub(crate) fn shm_unlink(name: &CStr) -> io::Result<()> { - unsafe { ret(c::shm_unlink(c_str(name))) } -} diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/libc/shm/types.rs temporalio-1.3.0/vendor/rustix/src/backend/libc/shm/types.rs --- temporalio-1.3.0/vendor/rustix/src/backend/libc/shm/types.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/libc/shm/types.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,30 +0,0 @@ -use crate::backend::c; -use bitflags::bitflags; - -bitflags! { - /// `O_*` constants for use with [`shm_open`]. - /// - /// [`shm_open`]: crate:shm::shm_open - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct ShmOFlags: u32 { - /// `O_CREAT` - #[doc(alias = "CREAT")] - const CREATE = bitcast!(c::O_CREAT); - - /// `O_EXCL` - const EXCL = bitcast!(c::O_EXCL); - - /// `O_RDONLY` - const RDONLY = bitcast!(c::O_RDONLY); - - /// `O_RDWR` - const RDWR = bitcast!(c::O_RDWR); - - /// `O_TRUNC` - const TRUNC = bitcast!(c::O_TRUNC); - - /// - const _ = !0; - } -} diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/libc/system/syscalls.rs temporalio-1.3.0/vendor/rustix/src/backend/libc/system/syscalls.rs --- temporalio-1.3.0/vendor/rustix/src/backend/libc/system/syscalls.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/libc/system/syscalls.rs 2023-10-30 19:40:00.000000000 +0000 @@ -4,8 +4,6 @@ use crate::backend::c; #[cfg(not(target_os = "wasi"))] use crate::backend::conv::ret_infallible; -#[cfg(target_os = "linux")] -use crate::system::RebootCommand; #[cfg(linux_kernel)] use crate::system::Sysinfo; use core::mem::MaybeUninit; @@ -13,7 +11,6 @@ target_os = "emscripten", target_os = "espidf", target_os = "redox", - target_os = "vita", target_os = "wasi" )))] use {crate::backend::conv::ret, crate::io}; @@ -49,7 +46,6 @@ target_os = "emscripten", target_os = "espidf", target_os = "redox", - target_os = "vita", target_os = "wasi" )))] pub(crate) fn sethostname(name: &[u8]) -> io::Result<()> { @@ -60,8 +56,3 @@ )) } } - -#[cfg(target_os = "linux")] -pub(crate) fn reboot(cmd: RebootCommand) -> io::Result<()> { - unsafe { ret(c::reboot(cmd as i32)) } -} diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/libc/termios/syscalls.rs temporalio-1.3.0/vendor/rustix/src/backend/libc/termios/syscalls.rs --- temporalio-1.3.0/vendor/rustix/src/backend/libc/termios/syscalls.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/libc/termios/syscalls.rs 2023-10-30 19:40:00.000000000 +0000 @@ -9,7 +9,7 @@ use crate::backend::conv::ret_pid_t; use crate::backend::conv::{borrowed_fd, ret}; use crate::fd::BorrowedFd; -#[cfg(all(feature = "alloc", feature = "procfs"))] +#[cfg(feature = "procfs")] #[cfg(not(any(target_os = "fuchsia", target_os = "wasi")))] use crate::ffi::CStr; #[cfg(any( @@ -40,13 +40,6 @@ let termios2 = unsafe { let mut termios2 = MaybeUninit::::uninit(); - // QEMU's `TCGETS2` doesn't currently set `input_speed` or - // `output_speed` on PowerPC, so zero out the fields ourselves. - #[cfg(any(target_arch = "powerpc", target_arch = "powerpc64"))] - { - termios2.write(core::mem::zeroed()); - } - ret(c::ioctl( borrowed_fd(fd), c::TCGETS2 as _, @@ -67,33 +60,6 @@ input_speed: termios2.c_ispeed, output_speed: termios2.c_ospeed, }; - - // QEMU's `TCGETS2` doesn't currently set `input_speed` or - // `output_speed` on PowerPC, so set them manually if we can. - #[cfg(any(target_arch = "powerpc", target_arch = "powerpc64"))] - { - use crate::termios::speed; - - if result.output_speed == 0 && (termios2.c_cflag & c::CBAUD) != c::BOTHER { - if let Some(output_speed) = speed::decode(termios2.c_cflag & c::CBAUD) { - result.output_speed = output_speed; - } - } - if result.input_speed == 0 - && ((termios2.c_cflag & c::CIBAUD) >> c::IBSHIFT) != c::BOTHER - { - // For input speeds, `B0` is special-cased to mean the input - // speed is the same as the output speed. - if ((termios2.c_cflag & c::CIBAUD) >> c::IBSHIFT) == c::B0 { - result.input_speed = result.output_speed; - } else if let Some(input_speed) = - speed::decode((termios2.c_cflag & c::CIBAUD) >> c::IBSHIFT) - { - result.input_speed = input_speed; - } - } - } - result.special_codes.0[..termios2.c_cc.len()].copy_from_slice(&termios2.c_cc); Ok(result) @@ -126,7 +92,7 @@ #[cfg(not(any(target_os = "espidf", target_os = "wasi")))] pub(crate) fn tcsetattr( - fd: BorrowedFd<'_>, + fd: BorrowedFd, optional_actions: OptionalActions, termios: &Termios, ) -> io::Result<()> { @@ -144,12 +110,12 @@ // linux-raw-sys' ioctl-generation script for sparc isn't working yet, // so as a temporary workaround, declare these manually. #[cfg(any(target_arch = "sparc", target_arch = "sparc64"))] - const TCSETS: u32 = 0x8024_5409; + const TCSETS: u32 = 0x80245409; #[cfg(any(target_arch = "sparc", target_arch = "sparc64"))] - const TCSETS2: u32 = 0x802c_540d; + const TCSETS2: u32 = 0x802c540d; - // Translate from `optional_actions` into an ioctl request code. On - // MIPS, `optional_actions` already has `TCGETS` added to it. + // Translate from `optional_actions` into an ioctl request code. On MIPS, + // `optional_actions` already has `TCGETS` added to it. let request = TCSETS2 + if cfg!(any( target_arch = "mips", @@ -199,27 +165,27 @@ } #[cfg(not(target_os = "wasi"))] -pub(crate) fn tcsendbreak(fd: BorrowedFd<'_>) -> io::Result<()> { +pub(crate) fn tcsendbreak(fd: BorrowedFd) -> io::Result<()> { unsafe { ret(c::tcsendbreak(borrowed_fd(fd), 0)) } } #[cfg(not(any(target_os = "espidf", target_os = "wasi")))] -pub(crate) fn tcdrain(fd: BorrowedFd<'_>) -> io::Result<()> { +pub(crate) fn tcdrain(fd: BorrowedFd) -> io::Result<()> { unsafe { ret(c::tcdrain(borrowed_fd(fd))) } } #[cfg(not(any(target_os = "espidf", target_os = "wasi")))] -pub(crate) fn tcflush(fd: BorrowedFd<'_>, queue_selector: QueueSelector) -> io::Result<()> { +pub(crate) fn tcflush(fd: BorrowedFd, queue_selector: QueueSelector) -> io::Result<()> { unsafe { ret(c::tcflush(borrowed_fd(fd), queue_selector as _)) } } #[cfg(not(any(target_os = "espidf", target_os = "wasi")))] -pub(crate) fn tcflow(fd: BorrowedFd<'_>, action: Action) -> io::Result<()> { +pub(crate) fn tcflow(fd: BorrowedFd, action: Action) -> io::Result<()> { unsafe { ret(c::tcflow(borrowed_fd(fd), action as _)) } } #[cfg(not(target_os = "wasi"))] -pub(crate) fn tcgetsid(fd: BorrowedFd<'_>) -> io::Result { +pub(crate) fn tcgetsid(fd: BorrowedFd) -> io::Result { unsafe { let pid = ret_pid_t(c::tcgetsid(borrowed_fd(fd)))?; Ok(Pid::from_raw_unchecked(pid)) @@ -227,12 +193,12 @@ } #[cfg(not(any(target_os = "espidf", target_os = "wasi")))] -pub(crate) fn tcsetwinsize(fd: BorrowedFd<'_>, winsize: Winsize) -> io::Result<()> { +pub(crate) fn tcsetwinsize(fd: BorrowedFd, winsize: Winsize) -> io::Result<()> { unsafe { ret(c::ioctl(borrowed_fd(fd), c::TIOCSWINSZ, &winsize)) } } #[cfg(not(any(target_os = "espidf", target_os = "wasi")))] -pub(crate) fn tcgetwinsize(fd: BorrowedFd<'_>) -> io::Result { +pub(crate) fn tcgetwinsize(fd: BorrowedFd) -> io::Result { unsafe { let mut buf = MaybeUninit::::uninit(); ret(c::ioctl( @@ -244,6 +210,26 @@ } } +#[cfg(not(any( + target_os = "espidf", + target_os = "haiku", + target_os = "redox", + target_os = "wasi" +)))] +pub(crate) fn ioctl_tiocexcl(fd: BorrowedFd) -> io::Result<()> { + unsafe { ret(c::ioctl(borrowed_fd(fd), c::TIOCEXCL as _)) } +} + +#[cfg(not(any( + target_os = "espidf", + target_os = "haiku", + target_os = "redox", + target_os = "wasi" +)))] +pub(crate) fn ioctl_tiocnxcl(fd: BorrowedFd) -> io::Result<()> { + unsafe { ret(c::ioctl(borrowed_fd(fd), c::TIOCNXCL as _)) } +} + #[cfg(not(any(target_os = "espidf", target_os = "nto", target_os = "wasi")))] #[inline] pub(crate) fn set_speed(termios: &mut Termios, arbitrary_speed: u32) -> io::Result<()> { @@ -375,13 +361,13 @@ pub(crate) fn isatty(fd: BorrowedFd<'_>) -> bool { // Use the return value of `isatty` alone. We don't check `errno` because // we return `bool` rather than `io::Result`, because we assume - // `BorrowedFd` protects us from `EBADF`, and any other reasonably + // `BorrrowedFd` protects us from `EBADF`, and any other reasonably // anticipated `errno` value would end up interpreted as “assume it's not a // terminal†anyway. unsafe { c::isatty(borrowed_fd(fd)) != 0 } } -#[cfg(all(feature = "alloc", feature = "procfs"))] +#[cfg(feature = "procfs")] #[cfg(not(any(target_os = "fuchsia", target_os = "wasi")))] pub(crate) fn ttyname(dirfd: BorrowedFd<'_>, buf: &mut [MaybeUninit]) -> io::Result { unsafe { diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/libc/thread/futex.rs temporalio-1.3.0/vendor/rustix/src/backend/libc/thread/futex.rs --- temporalio-1.3.0/vendor/rustix/src/backend/libc/thread/futex.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/libc/thread/futex.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,43 +0,0 @@ -use crate::backend::c; - -bitflags::bitflags! { - /// `FUTEX_*` flags for use with [`futex`]. - /// - /// [`futex`]: crate::thread::futex - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct FutexFlags: u32 { - /// `FUTEX_PRIVATE_FLAG` - const PRIVATE = bitcast!(c::FUTEX_PRIVATE_FLAG); - /// `FUTEX_CLOCK_REALTIME` - const CLOCK_REALTIME = bitcast!(c::FUTEX_CLOCK_REALTIME); - } -} - -/// `FUTEX_*` operations for use with [`futex`]. -/// -/// [`futex`]: crate::thread::futex -#[derive(Debug, Copy, Clone, Eq, PartialEq)] -#[repr(u32)] -pub enum FutexOperation { - /// `FUTEX_WAIT` - Wait = bitcast!(c::FUTEX_WAIT), - /// `FUTEX_WAKE` - Wake = bitcast!(c::FUTEX_WAKE), - /// `FUTEX_FD` - Fd = bitcast!(c::FUTEX_FD), - /// `FUTEX_REQUEUE` - Requeue = bitcast!(c::FUTEX_REQUEUE), - /// `FUTEX_CMP_REQUEUE` - CmpRequeue = bitcast!(c::FUTEX_CMP_REQUEUE), - /// `FUTEX_WAKE_OP` - WakeOp = bitcast!(c::FUTEX_WAKE_OP), - /// `FUTEX_LOCK_PI` - LockPi = bitcast!(c::FUTEX_LOCK_PI), - /// `FUTEX_UNLOCK_PI` - UnlockPi = bitcast!(c::FUTEX_UNLOCK_PI), - /// `FUTEX_TRYLOCK_PI` - TrylockPi = bitcast!(c::FUTEX_TRYLOCK_PI), - /// `FUTEX_WAIT_BITSET` - WaitBitset = bitcast!(c::FUTEX_WAIT_BITSET), -} diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/libc/thread/mod.rs temporalio-1.3.0/vendor/rustix/src/backend/libc/thread/mod.rs --- temporalio-1.3.0/vendor/rustix/src/backend/libc/thread/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/libc/thread/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,4 +1,2 @@ -#[cfg(linux_kernel)] -pub(crate) mod futex; #[cfg(not(windows))] pub(crate) mod syscalls; diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/libc/thread/syscalls.rs temporalio-1.3.0/vendor/rustix/src/backend/libc/thread/syscalls.rs --- temporalio-1.3.0/vendor/rustix/src/backend/libc/thread/syscalls.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/libc/thread/syscalls.rs 2023-10-30 19:40:00.000000000 +0000 @@ -10,10 +10,9 @@ use core::mem::MaybeUninit; #[cfg(linux_kernel)] use { - crate::backend::conv::{borrowed_fd, ret_c_int, ret_usize}, + crate::backend::conv::{borrowed_fd, ret_c_int}, crate::fd::BorrowedFd, crate::pid::Pid, - crate::thread::{FutexFlags, FutexOperation}, crate::utils::as_mut_ptr, }; #[cfg(not(any( @@ -24,7 +23,6 @@ target_os = "haiku", target_os = "openbsd", target_os = "redox", - target_os = "vita", target_os = "wasi", )))] use {crate::thread::ClockId, core::ptr::null_mut}; @@ -43,7 +41,6 @@ target_os = "haiku", target_os = "openbsd", target_os = "redox", - target_os = "vita", target_os = "wasi", )))] #[inline] @@ -94,12 +91,7 @@ #[cfg(all( fix_y2038, - not(any( - apple, - target_os = "emscripten", - target_os = "haiku", - target_os = "vita" - )) + not(any(apple, target_os = "emscripten", target_os = "haiku")) ))] fn clock_nanosleep_relative_old(id: ClockId, request: &Timespec) -> NanosleepRelativeResult { let tv_sec = match request.tv_sec.try_into() { @@ -144,7 +136,6 @@ target_os = "haiku", target_os = "openbsd", target_os = "redox", - target_os = "vita", target_os = "wasi", )))] #[inline] @@ -188,12 +179,7 @@ #[cfg(all( fix_y2038, - not(any( - apple, - target_os = "emscripten", - target_os = "haiku", - target_os = "vita" - )) + not(any(apple, target_os = "emscripten", target_os = "haiku")) ))] fn clock_nanosleep_absolute_old(id: ClockId, request: &Timespec) -> io::Result<()> { let flags = c::TIMER_ABSTIME; @@ -293,7 +279,7 @@ #[cfg(linux_kernel)] #[inline] -pub(crate) fn setns(fd: BorrowedFd<'_>, nstype: c::c_int) -> io::Result { +pub(crate) fn setns(fd: BorrowedFd, nstype: c::c_int) -> io::Result { // `setns` wasn't supported in glibc until 2.14, and musl until 0.9.5, // so use `syscall`. weak_or_syscall! { @@ -404,120 +390,3 @@ unsafe { ret(setresgid(rgid.as_raw(), egid.as_raw(), sgid.as_raw())) } } - -// TODO: This could be de-multiplexed. -#[cfg(linux_kernel)] -pub(crate) unsafe fn futex( - uaddr: *mut u32, - op: FutexOperation, - flags: FutexFlags, - val: u32, - utime: *const Timespec, - uaddr2: *mut u32, - val3: u32, -) -> io::Result { - #[cfg(all( - target_pointer_width = "32", - not(any(target_arch = "aarch64", target_arch = "x86_64")) - ))] - { - // TODO: Upstream this to the libc crate. - #[allow(non_upper_case_globals)] - const SYS_futex_time64: i32 = linux_raw_sys::general::__NR_futex_time64 as i32; - - syscall! { - fn futex_time64( - uaddr: *mut u32, - futex_op: c::c_int, - val: u32, - timeout: *const Timespec, - uaddr2: *mut u32, - val3: u32 - ) via SYS_futex_time64 -> c::ssize_t - } - - ret_usize(futex_time64( - uaddr, - op as i32 | flags.bits() as i32, - val, - utime, - uaddr2, - val3, - )) - .or_else(|err| { - // See the comments in `rustix_clock_gettime_via_syscall` about - // emulation. - if err == io::Errno::NOSYS { - futex_old(uaddr, op, flags, val, utime, uaddr2, val3) - } else { - Err(err) - } - }) - } - - #[cfg(any( - target_pointer_width = "64", - target_arch = "aarch64", - target_arch = "x86_64" - ))] - { - syscall! { - fn futex( - uaddr: *mut u32, - futex_op: c::c_int, - val: u32, - timeout: *const linux_raw_sys::general::__kernel_timespec, - uaddr2: *mut u32, - val3: u32 - ) via SYS_futex -> c::c_long - } - - ret_usize(futex( - uaddr, - op as i32 | flags.bits() as i32, - val, - utime.cast(), - uaddr2, - val3, - ) as isize) - } -} - -#[cfg(linux_kernel)] -#[cfg(all( - target_pointer_width = "32", - not(any(target_arch = "aarch64", target_arch = "x86_64")) -))] -unsafe fn futex_old( - uaddr: *mut u32, - op: FutexOperation, - flags: FutexFlags, - val: u32, - utime: *const Timespec, - uaddr2: *mut u32, - val3: u32, -) -> io::Result { - syscall! { - fn futex( - uaddr: *mut u32, - futex_op: c::c_int, - val: u32, - timeout: *const linux_raw_sys::general::__kernel_old_timespec, - uaddr2: *mut u32, - val3: u32 - ) via SYS_futex -> c::c_long - } - - let old_utime = linux_raw_sys::general::__kernel_old_timespec { - tv_sec: (*utime).tv_sec.try_into().map_err(|_| io::Errno::INVAL)?, - tv_nsec: (*utime).tv_nsec.try_into().map_err(|_| io::Errno::INVAL)?, - }; - ret_usize(futex( - uaddr, - op as i32 | flags.bits() as i32, - val, - &old_utime, - uaddr2, - val3, - ) as isize) -} diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/libc/time/types.rs temporalio-1.3.0/vendor/rustix/src/backend/libc/time/types.rs --- temporalio-1.3.0/vendor/rustix/src/backend/libc/time/types.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/libc/time/types.rs 2023-10-30 19:40:00.000000000 +0000 @@ -87,9 +87,6 @@ /// `TFD_CLOEXEC` const CLOEXEC = bitcast!(c::TFD_CLOEXEC); - - /// - const _ = !0; } } @@ -107,9 +104,6 @@ /// `TFD_TIMER_CANCEL_ON_SET` #[cfg(linux_kernel)] const CANCEL_ON_SET = bitcast!(c::TFD_TIMER_CANCEL_ON_SET); - - /// - const _ = !0; } } diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/aarch64.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/aarch64.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/aarch64.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/aarch64.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,268 +0,0 @@ -//! aarch64 Linux system calls. - -use crate::backend::reg::{ - ArgReg, FromAsm, RetReg, SyscallNumber, ToAsm, A0, A1, A2, A3, A4, A5, R0, -}; -use core::arch::asm; - -#[cfg(target_pointer_width = "32")] -compile_error!("arm64-ilp32 is not supported yet"); - -#[inline] -pub(in crate::backend) unsafe fn syscall0_readonly(nr: SyscallNumber<'_>) -> RetReg { - let r0; - asm!( - "svc 0", - in("x8") nr.to_asm(), - lateout("x0") r0, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> RetReg { - let r0; - asm!( - "svc 0", - in("x8") nr.to_asm(), - inlateout("x0") a0.to_asm() => r0, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, -) -> RetReg { - let r0; - asm!( - "svc 0", - in("x8") nr.to_asm(), - inlateout("x0") a0.to_asm() => r0, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1_noreturn(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> ! { - asm!( - "svc 0", - in("x8") nr.to_asm(), - in("x0") a0.to_asm(), - options(nostack, noreturn) - ) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall2( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, -) -> RetReg { - let r0; - asm!( - "svc 0", - in("x8") nr.to_asm(), - inlateout("x0") a0.to_asm() => r0, - in("x1") a1.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall2_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, -) -> RetReg { - let r0; - asm!( - "svc 0", - in("x8") nr.to_asm(), - inlateout("x0") a0.to_asm() => r0, - in("x1") a1.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall3( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, -) -> RetReg { - let r0; - asm!( - "svc 0", - in("x8") nr.to_asm(), - inlateout("x0") a0.to_asm() => r0, - in("x1") a1.to_asm(), - in("x2") a2.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall3_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, -) -> RetReg { - let r0; - asm!( - "svc 0", - in("x8") nr.to_asm(), - inlateout("x0") a0.to_asm() => r0, - in("x1") a1.to_asm(), - in("x2") a2.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall4( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, -) -> RetReg { - let r0; - asm!( - "svc 0", - in("x8") nr.to_asm(), - inlateout("x0") a0.to_asm() => r0, - in("x1") a1.to_asm(), - in("x2") a2.to_asm(), - in("x3") a3.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall4_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, -) -> RetReg { - let r0; - asm!( - "svc 0", - in("x8") nr.to_asm(), - inlateout("x0") a0.to_asm() => r0, - in("x1") a1.to_asm(), - in("x2") a2.to_asm(), - in("x3") a3.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall5( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, -) -> RetReg { - let r0; - asm!( - "svc 0", - in("x8") nr.to_asm(), - inlateout("x0") a0.to_asm() => r0, - in("x1") a1.to_asm(), - in("x2") a2.to_asm(), - in("x3") a3.to_asm(), - in("x4") a4.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall5_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, -) -> RetReg { - let r0; - asm!( - "svc 0", - in("x8") nr.to_asm(), - inlateout("x0") a0.to_asm() => r0, - in("x1") a1.to_asm(), - in("x2") a2.to_asm(), - in("x3") a3.to_asm(), - in("x4") a4.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall6( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, -) -> RetReg { - let r0; - asm!( - "svc 0", - in("x8") nr.to_asm(), - inlateout("x0") a0.to_asm() => r0, - in("x1") a1.to_asm(), - in("x2") a2.to_asm(), - in("x3") a3.to_asm(), - in("x4") a4.to_asm(), - in("x5") a5.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall6_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, -) -> RetReg { - let r0; - asm!( - "svc 0", - in("x8") nr.to_asm(), - inlateout("x0") a0.to_asm() => r0, - in("x1") a1.to_asm(), - in("x2") a2.to_asm(), - in("x3") a3.to_asm(), - in("x4") a4.to_asm(), - in("x5") a5.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/arm.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/arm.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/arm.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/arm.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,265 +0,0 @@ -//! arm Linux system calls. - -use crate::backend::reg::{ - ArgReg, FromAsm, RetReg, SyscallNumber, ToAsm, A0, A1, A2, A3, A4, A5, R0, -}; -use core::arch::asm; - -#[inline] -pub(in crate::backend) unsafe fn syscall0_readonly(nr: SyscallNumber<'_>) -> RetReg { - let r0; - asm!( - "svc 0", - in("r7") nr.to_asm(), - lateout("r0") r0, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> RetReg { - let r0; - asm!( - "svc 0", - in("r7") nr.to_asm(), - inlateout("r0") a0.to_asm() => r0, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, -) -> RetReg { - let r0; - asm!( - "svc 0", - in("r7") nr.to_asm(), - inlateout("r0") a0.to_asm() => r0, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1_noreturn(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> ! { - asm!( - "svc 0", - in("r7") nr.to_asm(), - in("r0") a0.to_asm(), - options(nostack, noreturn) - ) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall2( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, -) -> RetReg { - let r0; - asm!( - "svc 0", - in("r7") nr.to_asm(), - inlateout("r0") a0.to_asm() => r0, - in("r1") a1.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall2_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, -) -> RetReg { - let r0; - asm!( - "svc 0", - in("r7") nr.to_asm(), - inlateout("r0") a0.to_asm() => r0, - in("r1") a1.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall3( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, -) -> RetReg { - let r0; - asm!( - "svc 0", - in("r7") nr.to_asm(), - inlateout("r0") a0.to_asm() => r0, - in("r1") a1.to_asm(), - in("r2") a2.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall3_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, -) -> RetReg { - let r0; - asm!( - "svc 0", - in("r7") nr.to_asm(), - inlateout("r0") a0.to_asm() => r0, - in("r1") a1.to_asm(), - in("r2") a2.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall4( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, -) -> RetReg { - let r0; - asm!( - "svc 0", - in("r7") nr.to_asm(), - inlateout("r0") a0.to_asm() => r0, - in("r1") a1.to_asm(), - in("r2") a2.to_asm(), - in("r3") a3.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall4_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, -) -> RetReg { - let r0; - asm!( - "svc 0", - in("r7") nr.to_asm(), - inlateout("r0") a0.to_asm() => r0, - in("r1") a1.to_asm(), - in("r2") a2.to_asm(), - in("r3") a3.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall5( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, -) -> RetReg { - let r0; - asm!( - "svc 0", - in("r7") nr.to_asm(), - inlateout("r0") a0.to_asm() => r0, - in("r1") a1.to_asm(), - in("r2") a2.to_asm(), - in("r3") a3.to_asm(), - in("r4") a4.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall5_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, -) -> RetReg { - let r0; - asm!( - "svc 0", - in("r7") nr.to_asm(), - inlateout("r0") a0.to_asm() => r0, - in("r1") a1.to_asm(), - in("r2") a2.to_asm(), - in("r3") a3.to_asm(), - in("r4") a4.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall6( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, -) -> RetReg { - let r0; - asm!( - "svc 0", - in("r7") nr.to_asm(), - inlateout("r0") a0.to_asm() => r0, - in("r1") a1.to_asm(), - in("r2") a2.to_asm(), - in("r3") a3.to_asm(), - in("r4") a4.to_asm(), - in("r5") a5.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall6_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, -) -> RetReg { - let r0; - asm!( - "svc 0", - in("r7") nr.to_asm(), - inlateout("r0") a0.to_asm() => r0, - in("r1") a1.to_asm(), - in("r2") a2.to_asm(), - in("r3") a3.to_asm(), - in("r4") a4.to_asm(), - in("r5") a5.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/asm/aarch64.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/asm/aarch64.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/asm/aarch64.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/asm/aarch64.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,268 @@ +//! aarch64 Linux system calls. + +use crate::backend::reg::{ + ArgReg, FromAsm, RetReg, SyscallNumber, ToAsm, A0, A1, A2, A3, A4, A5, R0, +}; +use core::arch::asm; + +#[cfg(target_pointer_width = "32")] +compile_error!("arm64-ilp32 is not supported yet"); + +#[inline] +pub(in crate::backend) unsafe fn syscall0_readonly(nr: SyscallNumber<'_>) -> RetReg { + let r0; + asm!( + "svc 0", + in("x8") nr.to_asm(), + lateout("x0") r0, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall1(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> RetReg { + let r0; + asm!( + "svc 0", + in("x8") nr.to_asm(), + inlateout("x0") a0.to_asm() => r0, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall1_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, +) -> RetReg { + let r0; + asm!( + "svc 0", + in("x8") nr.to_asm(), + inlateout("x0") a0.to_asm() => r0, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall1_noreturn(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> ! { + asm!( + "svc 0", + in("x8") nr.to_asm(), + in("x0") a0.to_asm(), + options(noreturn) + ) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall2( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, +) -> RetReg { + let r0; + asm!( + "svc 0", + in("x8") nr.to_asm(), + inlateout("x0") a0.to_asm() => r0, + in("x1") a1.to_asm(), + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall2_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, +) -> RetReg { + let r0; + asm!( + "svc 0", + in("x8") nr.to_asm(), + inlateout("x0") a0.to_asm() => r0, + in("x1") a1.to_asm(), + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall3( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, +) -> RetReg { + let r0; + asm!( + "svc 0", + in("x8") nr.to_asm(), + inlateout("x0") a0.to_asm() => r0, + in("x1") a1.to_asm(), + in("x2") a2.to_asm(), + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall3_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, +) -> RetReg { + let r0; + asm!( + "svc 0", + in("x8") nr.to_asm(), + inlateout("x0") a0.to_asm() => r0, + in("x1") a1.to_asm(), + in("x2") a2.to_asm(), + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall4( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, +) -> RetReg { + let r0; + asm!( + "svc 0", + in("x8") nr.to_asm(), + inlateout("x0") a0.to_asm() => r0, + in("x1") a1.to_asm(), + in("x2") a2.to_asm(), + in("x3") a3.to_asm(), + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall4_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, +) -> RetReg { + let r0; + asm!( + "svc 0", + in("x8") nr.to_asm(), + inlateout("x0") a0.to_asm() => r0, + in("x1") a1.to_asm(), + in("x2") a2.to_asm(), + in("x3") a3.to_asm(), + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall5( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, +) -> RetReg { + let r0; + asm!( + "svc 0", + in("x8") nr.to_asm(), + inlateout("x0") a0.to_asm() => r0, + in("x1") a1.to_asm(), + in("x2") a2.to_asm(), + in("x3") a3.to_asm(), + in("x4") a4.to_asm(), + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall5_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, +) -> RetReg { + let r0; + asm!( + "svc 0", + in("x8") nr.to_asm(), + inlateout("x0") a0.to_asm() => r0, + in("x1") a1.to_asm(), + in("x2") a2.to_asm(), + in("x3") a3.to_asm(), + in("x4") a4.to_asm(), + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall6( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, + a5: ArgReg<'_, A5>, +) -> RetReg { + let r0; + asm!( + "svc 0", + in("x8") nr.to_asm(), + inlateout("x0") a0.to_asm() => r0, + in("x1") a1.to_asm(), + in("x2") a2.to_asm(), + in("x3") a3.to_asm(), + in("x4") a4.to_asm(), + in("x5") a5.to_asm(), + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall6_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, + a5: ArgReg<'_, A5>, +) -> RetReg { + let r0; + asm!( + "svc 0", + in("x8") nr.to_asm(), + inlateout("x0") a0.to_asm() => r0, + in("x1") a1.to_asm(), + in("x2") a2.to_asm(), + in("x3") a3.to_asm(), + in("x4") a4.to_asm(), + in("x5") a5.to_asm(), + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/asm/arm.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/asm/arm.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/asm/arm.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/asm/arm.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,265 @@ +//! arm Linux system calls. + +use crate::backend::reg::{ + ArgReg, FromAsm, RetReg, SyscallNumber, ToAsm, A0, A1, A2, A3, A4, A5, R0, +}; +use core::arch::asm; + +#[inline] +pub(in crate::backend) unsafe fn syscall0_readonly(nr: SyscallNumber<'_>) -> RetReg { + let r0; + asm!( + "svc 0", + in("r7") nr.to_asm(), + lateout("r0") r0, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall1(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> RetReg { + let r0; + asm!( + "svc 0", + in("r7") nr.to_asm(), + inlateout("r0") a0.to_asm() => r0, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall1_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, +) -> RetReg { + let r0; + asm!( + "svc 0", + in("r7") nr.to_asm(), + inlateout("r0") a0.to_asm() => r0, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall1_noreturn(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> ! { + asm!( + "svc 0", + in("r7") nr.to_asm(), + in("r0") a0.to_asm(), + options(noreturn) + ) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall2( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, +) -> RetReg { + let r0; + asm!( + "svc 0", + in("r7") nr.to_asm(), + inlateout("r0") a0.to_asm() => r0, + in("r1") a1.to_asm(), + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall2_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, +) -> RetReg { + let r0; + asm!( + "svc 0", + in("r7") nr.to_asm(), + inlateout("r0") a0.to_asm() => r0, + in("r1") a1.to_asm(), + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall3( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, +) -> RetReg { + let r0; + asm!( + "svc 0", + in("r7") nr.to_asm(), + inlateout("r0") a0.to_asm() => r0, + in("r1") a1.to_asm(), + in("r2") a2.to_asm(), + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall3_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, +) -> RetReg { + let r0; + asm!( + "svc 0", + in("r7") nr.to_asm(), + inlateout("r0") a0.to_asm() => r0, + in("r1") a1.to_asm(), + in("r2") a2.to_asm(), + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall4( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, +) -> RetReg { + let r0; + asm!( + "svc 0", + in("r7") nr.to_asm(), + inlateout("r0") a0.to_asm() => r0, + in("r1") a1.to_asm(), + in("r2") a2.to_asm(), + in("r3") a3.to_asm(), + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall4_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, +) -> RetReg { + let r0; + asm!( + "svc 0", + in("r7") nr.to_asm(), + inlateout("r0") a0.to_asm() => r0, + in("r1") a1.to_asm(), + in("r2") a2.to_asm(), + in("r3") a3.to_asm(), + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall5( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, +) -> RetReg { + let r0; + asm!( + "svc 0", + in("r7") nr.to_asm(), + inlateout("r0") a0.to_asm() => r0, + in("r1") a1.to_asm(), + in("r2") a2.to_asm(), + in("r3") a3.to_asm(), + in("r4") a4.to_asm(), + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall5_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, +) -> RetReg { + let r0; + asm!( + "svc 0", + in("r7") nr.to_asm(), + inlateout("r0") a0.to_asm() => r0, + in("r1") a1.to_asm(), + in("r2") a2.to_asm(), + in("r3") a3.to_asm(), + in("r4") a4.to_asm(), + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall6( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, + a5: ArgReg<'_, A5>, +) -> RetReg { + let r0; + asm!( + "svc 0", + in("r7") nr.to_asm(), + inlateout("r0") a0.to_asm() => r0, + in("r1") a1.to_asm(), + in("r2") a2.to_asm(), + in("r3") a3.to_asm(), + in("r4") a4.to_asm(), + in("r5") a5.to_asm(), + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall6_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, + a5: ArgReg<'_, A5>, +) -> RetReg { + let r0; + asm!( + "svc 0", + in("r7") nr.to_asm(), + inlateout("r0") a0.to_asm() => r0, + in("r1") a1.to_asm(), + in("r2") a2.to_asm(), + in("r3") a3.to_asm(), + in("r4") a4.to_asm(), + in("r5") a5.to_asm(), + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/asm/mips32r6.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/asm/mips32r6.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/asm/mips32r6.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/asm/mips32r6.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,543 @@ +//! mipsisa32r6el Linux system calls. +//! +//! On mipsisa32r6el, Linux indicates success or failure using `$a3` rather +//! than by returning a negative error code as most other architectures do. +//! +//! Mips-family platforms have a special calling convention for `__NR_pipe`, +//! however we use `__NR_pipe2` instead to avoid having to implement it. + +use crate::backend::reg::{ + ArgReg, FromAsm, RetReg, SyscallNumber, ToAsm, A0, A1, A2, A3, A4, A5, A6, R0, +}; +use core::arch::asm; + +#[inline] +pub(in crate::backend) unsafe fn syscall0_readonly(nr: SyscallNumber) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + lateout("$7" /*$a3*/) err, + lateout("$8" /*$t0*/) _, + lateout("$9" /*$t1*/) _, + lateout("$10" /*$t2*/) _, + lateout("$11" /*$t3*/) _, + lateout("$12" /*$t4*/) _, + lateout("$13" /*$t5*/) _, + lateout("$14" /*$t6*/) _, + lateout("$15" /*$t7*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall1(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + lateout("$7" /*$a3*/) err, + lateout("$8" /*$t0*/) _, + lateout("$9" /*$t1*/) _, + lateout("$10" /*$t2*/) _, + lateout("$11" /*$t3*/) _, + lateout("$12" /*$t4*/) _, + lateout("$13" /*$t5*/) _, + lateout("$14" /*$t6*/) _, + lateout("$15" /*$t7*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall1_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + lateout("$7" /*$a3*/) err, + lateout("$8" /*$t0*/) _, + lateout("$9" /*$t1*/) _, + lateout("$10" /*$t2*/) _, + lateout("$11" /*$t3*/) _, + lateout("$12" /*$t4*/) _, + lateout("$13" /*$t5*/) _, + lateout("$14" /*$t6*/) _, + lateout("$15" /*$t7*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall1_noreturn(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> ! { + asm!( + "syscall", + in("$2" /*$v0*/) nr.to_asm(), + in("$4" /*$a0*/) a0.to_asm(), + options(noreturn) + ) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall2( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + lateout("$7" /*$a3*/) err, + lateout("$8" /*$t0*/) _, + lateout("$9" /*$t1*/) _, + lateout("$10" /*$t2*/) _, + lateout("$11" /*$t3*/) _, + lateout("$12" /*$t4*/) _, + lateout("$13" /*$t5*/) _, + lateout("$14" /*$t6*/) _, + lateout("$15" /*$t7*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall2_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + lateout("$7" /*$a3*/) err, + lateout("$8" /*$t0*/) _, + lateout("$9" /*$t1*/) _, + lateout("$10" /*$t2*/) _, + lateout("$11" /*$t3*/) _, + lateout("$12" /*$t4*/) _, + lateout("$13" /*$t5*/) _, + lateout("$14" /*$t6*/) _, + lateout("$15" /*$t7*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall3( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + in("$6" /*$a2*/) a2.to_asm(), + lateout("$7" /*$a3*/) err, + lateout("$8" /*$t0*/) _, + lateout("$9" /*$t1*/) _, + lateout("$10" /*$t2*/) _, + lateout("$11" /*$t3*/) _, + lateout("$12" /*$t4*/) _, + lateout("$13" /*$t5*/) _, + lateout("$14" /*$t6*/) _, + lateout("$15" /*$t7*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall3_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + in("$6" /*$a2*/) a2.to_asm(), + lateout("$7" /*$a3*/) err, + lateout("$8" /*$t0*/) _, + lateout("$9" /*$t1*/) _, + lateout("$10" /*$t2*/) _, + lateout("$11" /*$t3*/) _, + lateout("$12" /*$t4*/) _, + lateout("$13" /*$t5*/) _, + lateout("$14" /*$t6*/) _, + lateout("$15" /*$t7*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall4( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + in("$6" /*$a2*/) a2.to_asm(), + inlateout("$7" /*$a3*/) a3.to_asm() => err, + lateout("$8" /*$t0*/) _, + lateout("$9" /*$t1*/) _, + lateout("$10" /*$t2*/) _, + lateout("$11" /*$t3*/) _, + lateout("$12" /*$t4*/) _, + lateout("$13" /*$t5*/) _, + lateout("$14" /*$t6*/) _, + lateout("$15" /*$t7*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall4_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + in("$6" /*$a2*/) a2.to_asm(), + inlateout("$7" /*$a3*/) a3.to_asm() => err, + lateout("$8" /*$t0*/) _, + lateout("$9" /*$t1*/) _, + lateout("$10" /*$t2*/) _, + lateout("$11" /*$t3*/) _, + lateout("$12" /*$t4*/) _, + lateout("$13" /*$t5*/) _, + lateout("$14" /*$t6*/) _, + lateout("$15" /*$t7*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall5( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, +) -> RetReg { + let x0; + let err: usize; + asm!( + ".set noat", + "subu $sp, 32", + "sw {}, 16($sp)", + "syscall", + "addu $sp, 32", + ".set at", + in(reg) a4.to_asm(), + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + in("$6" /*$a2*/) a2.to_asm(), + inlateout("$7" /*$a3*/) a3.to_asm() => err, + lateout("$8" /*$t0*/) _, + lateout("$9" /*$t1*/) _, + lateout("$10" /*$t2*/) _, + lateout("$11" /*$t3*/) _, + lateout("$12" /*$t4*/) _, + lateout("$13" /*$t5*/) _, + lateout("$14" /*$t6*/) _, + lateout("$15" /*$t7*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(preserves_flags) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall5_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, +) -> RetReg { + let x0; + let err: usize; + asm!( + ".set noat", + "subu $sp, 32", + "sw {}, 16($sp)", + "syscall", + "addu $sp, 32", + ".set at", + in(reg) a4.to_asm(), + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + in("$6" /*$a2*/) a2.to_asm(), + inlateout("$7" /*$a3*/) a3.to_asm() => err, + lateout("$8" /*$t0*/) _, + lateout("$9" /*$t1*/) _, + lateout("$10" /*$t2*/) _, + lateout("$11" /*$t3*/) _, + lateout("$12" /*$t4*/) _, + lateout("$13" /*$t5*/) _, + lateout("$14" /*$t6*/) _, + lateout("$15" /*$t7*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(preserves_flags, readonly) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall6( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, + a5: ArgReg<'_, A5>, +) -> RetReg { + let x0; + let err: usize; + asm!( + ".set noat", + "subu $sp, 32", + "sw {}, 16($sp)", + "sw {}, 20($sp)", + "syscall", + "addu $sp, 32", + ".set at", + in(reg) a4.to_asm(), + in(reg) a5.to_asm(), + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + in("$6" /*$a2*/) a2.to_asm(), + inlateout("$7" /*$a3*/) a3.to_asm() => err, + lateout("$8" /*$t0*/) _, + lateout("$9" /*$t1*/) _, + lateout("$10" /*$t2*/) _, + lateout("$11" /*$t3*/) _, + lateout("$12" /*$t4*/) _, + lateout("$13" /*$t5*/) _, + lateout("$14" /*$t6*/) _, + lateout("$15" /*$t7*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(preserves_flags) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall6_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, + a5: ArgReg<'_, A5>, +) -> RetReg { + let x0; + let err: usize; + asm!( + ".set noat", + "subu $sp, 32", + "sw {}, 16($sp)", + "sw {}, 20($sp)", + "syscall", + "addu $sp, 32", + ".set at", + in(reg) a4.to_asm(), + in(reg) a5.to_asm(), + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + in("$6" /*$a2*/) a2.to_asm(), + inlateout("$7" /*$a3*/) a3.to_asm() => err, + lateout("$8" /*$t0*/) _, + lateout("$9" /*$t1*/) _, + lateout("$10" /*$t2*/) _, + lateout("$11" /*$t3*/) _, + lateout("$12" /*$t4*/) _, + lateout("$13" /*$t5*/) _, + lateout("$14" /*$t6*/) _, + lateout("$15" /*$t7*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(preserves_flags, readonly) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall7_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, + a5: ArgReg<'_, A5>, + a6: ArgReg<'_, A6>, +) -> RetReg { + let x0; + let err: usize; + asm!( + ".set noat", + "subu $sp, 32", + "sw {}, 16($sp)", + "sw {}, 20($sp)", + "sw {}, 24($sp)", + "syscall", + "addu $sp, 32", + ".set at", + in(reg) a4.to_asm(), + in(reg) a5.to_asm(), + in(reg) a6.to_asm(), + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + in("$6" /*$a2*/) a2.to_asm(), + inlateout("$7" /*$a3*/) a3.to_asm() => err, + lateout("$8" /*$t0*/) _, + lateout("$9" /*$t1*/) _, + lateout("$10" /*$t2*/) _, + lateout("$11" /*$t3*/) _, + lateout("$12" /*$t4*/) _, + lateout("$13" /*$t5*/) _, + lateout("$14" /*$t6*/) _, + lateout("$15" /*$t7*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(preserves_flags, readonly) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/asm/mips64r6.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/asm/mips64r6.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/asm/mips64r6.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/asm/mips64r6.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,470 @@ +//! mipsisa64r6el Linux system calls. +//! +//! On mipsisa64r6el, Linux indicates success or failure using `$a3` (`$7`) +//! rather than by returning a negative error code as most other architectures +//! do. +//! +//! Mips-family platforms have a special calling convention for `__NR_pipe`, +//! however we use `__NR_pipe2` instead to avoid having to implement it. +//! +//! Note that MIPS R6 inline assembly currently doesn't differ from MIPS, +//! because no explicit call of R6-only or R2-only instructions exist here. + +use crate::backend::reg::{ + ArgReg, FromAsm, RetReg, SyscallNumber, ToAsm, A0, A1, A2, A3, A4, A5, R0, +}; +use core::arch::asm; + +#[inline] +pub(in crate::backend) unsafe fn syscall0_readonly(nr: SyscallNumber) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + lateout("$7" /*$a3*/) err, + lateout("$8" /*$a4*/) _, + lateout("$9" /*$a5*/) _, + lateout("$10" /*$a6*/) _, + lateout("$11" /*$a7*/) _, + lateout("$12" /*$t0*/) _, + lateout("$13" /*$t1*/) _, + lateout("$14" /*$t2*/) _, + lateout("$15" /*$t3*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall1(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + lateout("$7" /*$a3*/) err, + lateout("$8" /*$a4*/) _, + lateout("$9" /*$a5*/) _, + lateout("$10" /*$a6*/) _, + lateout("$11" /*$a7*/) _, + lateout("$12" /*$t0*/) _, + lateout("$13" /*$t1*/) _, + lateout("$14" /*$t2*/) _, + lateout("$15" /*$t3*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall1_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + lateout("$7" /*$a3*/) err, + lateout("$8" /*$a4*/) _, + lateout("$9" /*$a5*/) _, + lateout("$10" /*$a6*/) _, + lateout("$11" /*$a7*/) _, + lateout("$12" /*$t0*/) _, + lateout("$13" /*$t1*/) _, + lateout("$14" /*$t2*/) _, + lateout("$15" /*$t3*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall1_noreturn(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> ! { + asm!( + "syscall", + in("$2" /*$v0*/) nr.to_asm(), + in("$4" /*$a0*/) a0.to_asm(), + options(noreturn) + ) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall2( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + lateout("$7" /*$a3*/) err, + lateout("$8" /*$a4*/) _, + lateout("$9" /*$a5*/) _, + lateout("$10" /*$a6*/) _, + lateout("$11" /*$a7*/) _, + lateout("$12" /*$t0*/) _, + lateout("$13" /*$t1*/) _, + lateout("$14" /*$t2*/) _, + lateout("$15" /*$t3*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall2_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + lateout("$7" /*$a3*/) err, + lateout("$8" /*$a4*/) _, + lateout("$9" /*$a5*/) _, + lateout("$10" /*$a6*/) _, + lateout("$11" /*$a7*/) _, + lateout("$12" /*$t0*/) _, + lateout("$13" /*$t1*/) _, + lateout("$14" /*$t2*/) _, + lateout("$15" /*$t3*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall3( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + in("$6" /*$a2*/) a2.to_asm(), + lateout("$7" /*$a3*/) err, + lateout("$8" /*$a4*/) _, + lateout("$9" /*$a5*/) _, + lateout("$10" /*$a6*/) _, + lateout("$11" /*$a7*/) _, + lateout("$12" /*$t0*/) _, + lateout("$13" /*$t1*/) _, + lateout("$14" /*$t2*/) _, + lateout("$15" /*$t3*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall3_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + in("$6" /*$a2*/) a2.to_asm(), + lateout("$7" /*$a3*/) err, + lateout("$8" /*$a4*/) _, + lateout("$9" /*$a5*/) _, + lateout("$10" /*$a6*/) _, + lateout("$11" /*$a7*/) _, + lateout("$12" /*$t0*/) _, + lateout("$13" /*$t1*/) _, + lateout("$14" /*$t2*/) _, + lateout("$15" /*$t3*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall4( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + in("$6" /*$a2*/) a2.to_asm(), + inlateout("$7" /*$a3*/) a3.to_asm() => err, + lateout("$8" /*$a4*/) _, + lateout("$9" /*$a5*/) _, + lateout("$10" /*$a6*/) _, + lateout("$11" /*$a7*/) _, + lateout("$12" /*$t0*/) _, + lateout("$13" /*$t1*/) _, + lateout("$14" /*$t2*/) _, + lateout("$15" /*$t3*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall4_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + in("$6" /*$a2*/) a2.to_asm(), + inlateout("$7" /*$a3*/) a3.to_asm() => err, + lateout("$8" /*$a4*/) _, + lateout("$9" /*$a5*/) _, + lateout("$10" /*$a6*/) _, + lateout("$11" /*$a7*/) _, + lateout("$12" /*$t0*/) _, + lateout("$13" /*$t1*/) _, + lateout("$14" /*$t2*/) _, + lateout("$15" /*$t3*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall5( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + in("$6" /*$a2*/) a2.to_asm(), + inlateout("$7" /*$a3*/) a3.to_asm() => err, + inlateout("$8" /*$a4*/) a4.to_asm() => _, + lateout("$9" /*$a5*/) _, + lateout("$10" /*$a6*/) _, + lateout("$11" /*$a7*/) _, + lateout("$12" /*$t0*/) _, + lateout("$13" /*$t1*/) _, + lateout("$14" /*$t2*/) _, + lateout("$15" /*$t3*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall5_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + in("$6" /*$a2*/) a2.to_asm(), + inlateout("$7" /*$a3*/) a3.to_asm() => err, + inlateout("$8" /*$a4*/) a4.to_asm() => _, + lateout("$9" /*$a5*/) _, + lateout("$10" /*$a6*/) _, + lateout("$11" /*$a7*/) _, + lateout("$12" /*$t0*/) _, + lateout("$13" /*$t1*/) _, + lateout("$14" /*$t2*/) _, + lateout("$15" /*$t3*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall6( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, + a5: ArgReg<'_, A5>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + in("$6" /*$a2*/) a2.to_asm(), + inlateout("$7" /*$a3*/) a3.to_asm() => err, + inlateout("$8" /*$a4*/) a4.to_asm() => _, + inlateout("$9" /*$a5*/) a5.to_asm() => _, + lateout("$10" /*$a6*/) _, + lateout("$11" /*$a7*/) _, + lateout("$12" /*$t0*/) _, + lateout("$13" /*$t1*/) _, + lateout("$14" /*$t2*/) _, + lateout("$15" /*$t3*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall6_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, + a5: ArgReg<'_, A5>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + in("$6" /*$a2*/) a2.to_asm(), + inlateout("$7" /*$a3*/) a3.to_asm() => err, + inlateout("$8" /*$a4*/) a4.to_asm() => _, + inlateout("$9" /*$a5*/) a5.to_asm() => _, + lateout("$10" /*$a6*/) _, + lateout("$11" /*$a7*/) _, + lateout("$12" /*$t0*/) _, + lateout("$13" /*$t1*/) _, + lateout("$14" /*$t2*/) _, + lateout("$15" /*$t3*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/asm/mips64.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/asm/mips64.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/asm/mips64.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/asm/mips64.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,466 @@ +//! mips64el Linux system calls. +//! +//! On mips64el, Linux indicates success or failure using `$a3` (`$7`) rather +//! than by returning a negative error code as most other architectures do. +//! +//! Mips-family platforms have a special calling convention for `__NR_pipe`, +//! however we use `__NR_pipe2` instead to avoid having to implement it. + +use crate::backend::reg::{ + ArgReg, FromAsm, RetReg, SyscallNumber, ToAsm, A0, A1, A2, A3, A4, A5, R0, +}; +use core::arch::asm; + +#[inline] +pub(in crate::backend) unsafe fn syscall0_readonly(nr: SyscallNumber) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + lateout("$7" /*$a3*/) err, + lateout("$8" /*$a4*/) _, + lateout("$9" /*$a5*/) _, + lateout("$10" /*$a6*/) _, + lateout("$11" /*$a7*/) _, + lateout("$12" /*$t0*/) _, + lateout("$13" /*$t1*/) _, + lateout("$14" /*$t2*/) _, + lateout("$15" /*$t3*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall1(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + lateout("$7" /*$a3*/) err, + lateout("$8" /*$a4*/) _, + lateout("$9" /*$a5*/) _, + lateout("$10" /*$a6*/) _, + lateout("$11" /*$a7*/) _, + lateout("$12" /*$t0*/) _, + lateout("$13" /*$t1*/) _, + lateout("$14" /*$t2*/) _, + lateout("$15" /*$t3*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall1_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + lateout("$7" /*$a3*/) err, + lateout("$8" /*$a4*/) _, + lateout("$9" /*$a5*/) _, + lateout("$10" /*$a6*/) _, + lateout("$11" /*$a7*/) _, + lateout("$12" /*$t0*/) _, + lateout("$13" /*$t1*/) _, + lateout("$14" /*$t2*/) _, + lateout("$15" /*$t3*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall1_noreturn(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> ! { + asm!( + "syscall", + in("$2" /*$v0*/) nr.to_asm(), + in("$4" /*$a0*/) a0.to_asm(), + options(noreturn) + ) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall2( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + lateout("$7" /*$a3*/) err, + lateout("$8" /*$a4*/) _, + lateout("$9" /*$a5*/) _, + lateout("$10" /*$a6*/) _, + lateout("$11" /*$a7*/) _, + lateout("$12" /*$t0*/) _, + lateout("$13" /*$t1*/) _, + lateout("$14" /*$t2*/) _, + lateout("$15" /*$t3*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall2_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + lateout("$7" /*$a3*/) err, + lateout("$8" /*$a4*/) _, + lateout("$9" /*$a5*/) _, + lateout("$10" /*$a6*/) _, + lateout("$11" /*$a7*/) _, + lateout("$12" /*$t0*/) _, + lateout("$13" /*$t1*/) _, + lateout("$14" /*$t2*/) _, + lateout("$15" /*$t3*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall3( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + in("$6" /*$a2*/) a2.to_asm(), + lateout("$7" /*$a3*/) err, + lateout("$8" /*$a4*/) _, + lateout("$9" /*$a5*/) _, + lateout("$10" /*$a6*/) _, + lateout("$11" /*$a7*/) _, + lateout("$12" /*$t0*/) _, + lateout("$13" /*$t1*/) _, + lateout("$14" /*$t2*/) _, + lateout("$15" /*$t3*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall3_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + in("$6" /*$a2*/) a2.to_asm(), + lateout("$7" /*$a3*/) err, + lateout("$8" /*$a4*/) _, + lateout("$9" /*$a5*/) _, + lateout("$10" /*$a6*/) _, + lateout("$11" /*$a7*/) _, + lateout("$12" /*$t0*/) _, + lateout("$13" /*$t1*/) _, + lateout("$14" /*$t2*/) _, + lateout("$15" /*$t3*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall4( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + in("$6" /*$a2*/) a2.to_asm(), + inlateout("$7" /*$a3*/) a3.to_asm() => err, + lateout("$8" /*$a4*/) _, + lateout("$9" /*$a5*/) _, + lateout("$10" /*$a6*/) _, + lateout("$11" /*$a7*/) _, + lateout("$12" /*$t0*/) _, + lateout("$13" /*$t1*/) _, + lateout("$14" /*$t2*/) _, + lateout("$15" /*$t3*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall4_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + in("$6" /*$a2*/) a2.to_asm(), + inlateout("$7" /*$a3*/) a3.to_asm() => err, + lateout("$8" /*$a4*/) _, + lateout("$9" /*$a5*/) _, + lateout("$10" /*$a6*/) _, + lateout("$11" /*$a7*/) _, + lateout("$12" /*$t0*/) _, + lateout("$13" /*$t1*/) _, + lateout("$14" /*$t2*/) _, + lateout("$15" /*$t3*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall5( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + in("$6" /*$a2*/) a2.to_asm(), + inlateout("$7" /*$a3*/) a3.to_asm() => err, + inlateout("$8" /*$a4*/) a4.to_asm() => _, + lateout("$9" /*$a5*/) _, + lateout("$10" /*$a6*/) _, + lateout("$11" /*$a7*/) _, + lateout("$12" /*$t0*/) _, + lateout("$13" /*$t1*/) _, + lateout("$14" /*$t2*/) _, + lateout("$15" /*$t3*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall5_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + in("$6" /*$a2*/) a2.to_asm(), + inlateout("$7" /*$a3*/) a3.to_asm() => err, + inlateout("$8" /*$a4*/) a4.to_asm() => _, + lateout("$9" /*$a5*/) _, + lateout("$10" /*$a6*/) _, + lateout("$11" /*$a7*/) _, + lateout("$12" /*$t0*/) _, + lateout("$13" /*$t1*/) _, + lateout("$14" /*$t2*/) _, + lateout("$15" /*$t3*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall6( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, + a5: ArgReg<'_, A5>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + in("$6" /*$a2*/) a2.to_asm(), + inlateout("$7" /*$a3*/) a3.to_asm() => err, + inlateout("$8" /*$a4*/) a4.to_asm() => _, + inlateout("$9" /*$a5*/) a5.to_asm() => _, + lateout("$10" /*$a6*/) _, + lateout("$11" /*$a7*/) _, + lateout("$12" /*$t0*/) _, + lateout("$13" /*$t1*/) _, + lateout("$14" /*$t2*/) _, + lateout("$15" /*$t3*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall6_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, + a5: ArgReg<'_, A5>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + in("$6" /*$a2*/) a2.to_asm(), + inlateout("$7" /*$a3*/) a3.to_asm() => err, + inlateout("$8" /*$a4*/) a4.to_asm() => _, + inlateout("$9" /*$a5*/) a5.to_asm() => _, + lateout("$10" /*$a6*/) _, + lateout("$11" /*$a7*/) _, + lateout("$12" /*$t0*/) _, + lateout("$13" /*$t1*/) _, + lateout("$14" /*$t2*/) _, + lateout("$15" /*$t3*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/asm/mips.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/asm/mips.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/asm/mips.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/asm/mips.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,543 @@ +//! mipsel Linux system calls. +//! +//! On mipsel, Linux indicates success or failure using `$a3` rather +//! than by returning a negative error code as most other architectures do. +//! +//! Mips-family platforms have a special calling convention for `__NR_pipe`, +//! however we use `__NR_pipe2` instead to avoid having to implement it. + +use crate::backend::reg::{ + ArgReg, FromAsm, RetReg, SyscallNumber, ToAsm, A0, A1, A2, A3, A4, A5, A6, R0, +}; +use core::arch::asm; + +#[inline] +pub(in crate::backend) unsafe fn syscall0_readonly(nr: SyscallNumber) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + lateout("$7" /*$a3*/) err, + lateout("$8" /*$t0*/) _, + lateout("$9" /*$t1*/) _, + lateout("$10" /*$t2*/) _, + lateout("$11" /*$t3*/) _, + lateout("$12" /*$t4*/) _, + lateout("$13" /*$t5*/) _, + lateout("$14" /*$t6*/) _, + lateout("$15" /*$t7*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall1(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + lateout("$7" /*$a3*/) err, + lateout("$8" /*$t0*/) _, + lateout("$9" /*$t1*/) _, + lateout("$10" /*$t2*/) _, + lateout("$11" /*$t3*/) _, + lateout("$12" /*$t4*/) _, + lateout("$13" /*$t5*/) _, + lateout("$14" /*$t6*/) _, + lateout("$15" /*$t7*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall1_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + lateout("$7" /*$a3*/) err, + lateout("$8" /*$t0*/) _, + lateout("$9" /*$t1*/) _, + lateout("$10" /*$t2*/) _, + lateout("$11" /*$t3*/) _, + lateout("$12" /*$t4*/) _, + lateout("$13" /*$t5*/) _, + lateout("$14" /*$t6*/) _, + lateout("$15" /*$t7*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall1_noreturn(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> ! { + asm!( + "syscall", + in("$2" /*$v0*/) nr.to_asm(), + in("$4" /*$a0*/) a0.to_asm(), + options(noreturn) + ) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall2( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + lateout("$7" /*$a3*/) err, + lateout("$8" /*$t0*/) _, + lateout("$9" /*$t1*/) _, + lateout("$10" /*$t2*/) _, + lateout("$11" /*$t3*/) _, + lateout("$12" /*$t4*/) _, + lateout("$13" /*$t5*/) _, + lateout("$14" /*$t6*/) _, + lateout("$15" /*$t7*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall2_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + lateout("$7" /*$a3*/) err, + lateout("$8" /*$t0*/) _, + lateout("$9" /*$t1*/) _, + lateout("$10" /*$t2*/) _, + lateout("$11" /*$t3*/) _, + lateout("$12" /*$t4*/) _, + lateout("$13" /*$t5*/) _, + lateout("$14" /*$t6*/) _, + lateout("$15" /*$t7*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall3( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + in("$6" /*$a2*/) a2.to_asm(), + lateout("$7" /*$a3*/) err, + lateout("$8" /*$t0*/) _, + lateout("$9" /*$t1*/) _, + lateout("$10" /*$t2*/) _, + lateout("$11" /*$t3*/) _, + lateout("$12" /*$t4*/) _, + lateout("$13" /*$t5*/) _, + lateout("$14" /*$t6*/) _, + lateout("$15" /*$t7*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall3_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + in("$6" /*$a2*/) a2.to_asm(), + lateout("$7" /*$a3*/) err, + lateout("$8" /*$t0*/) _, + lateout("$9" /*$t1*/) _, + lateout("$10" /*$t2*/) _, + lateout("$11" /*$t3*/) _, + lateout("$12" /*$t4*/) _, + lateout("$13" /*$t5*/) _, + lateout("$14" /*$t6*/) _, + lateout("$15" /*$t7*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall4( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + in("$6" /*$a2*/) a2.to_asm(), + inlateout("$7" /*$a3*/) a3.to_asm() => err, + lateout("$8" /*$t0*/) _, + lateout("$9" /*$t1*/) _, + lateout("$10" /*$t2*/) _, + lateout("$11" /*$t3*/) _, + lateout("$12" /*$t4*/) _, + lateout("$13" /*$t5*/) _, + lateout("$14" /*$t6*/) _, + lateout("$15" /*$t7*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall4_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, +) -> RetReg { + let x0; + let err: usize; + asm!( + "syscall", + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + in("$6" /*$a2*/) a2.to_asm(), + inlateout("$7" /*$a3*/) a3.to_asm() => err, + lateout("$8" /*$t0*/) _, + lateout("$9" /*$t1*/) _, + lateout("$10" /*$t2*/) _, + lateout("$11" /*$t3*/) _, + lateout("$12" /*$t4*/) _, + lateout("$13" /*$t5*/) _, + lateout("$14" /*$t6*/) _, + lateout("$15" /*$t7*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall5( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, +) -> RetReg { + let x0; + let err: usize; + asm!( + ".set noat", + "subu $sp, 32", + "sw {}, 16($sp)", + "syscall", + "addu $sp, 32", + ".set at", + in(reg) a4.to_asm(), + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + in("$6" /*$a2*/) a2.to_asm(), + inlateout("$7" /*$a3*/) a3.to_asm() => err, + lateout("$8" /*$t0*/) _, + lateout("$9" /*$t1*/) _, + lateout("$10" /*$t2*/) _, + lateout("$11" /*$t3*/) _, + lateout("$12" /*$t4*/) _, + lateout("$13" /*$t5*/) _, + lateout("$14" /*$t6*/) _, + lateout("$15" /*$t7*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(preserves_flags) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall5_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, +) -> RetReg { + let x0; + let err: usize; + asm!( + ".set noat", + "subu $sp, 32", + "sw {}, 16($sp)", + "syscall", + "addu $sp, 32", + ".set at", + in(reg) a4.to_asm(), + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + in("$6" /*$a2*/) a2.to_asm(), + inlateout("$7" /*$a3*/) a3.to_asm() => err, + lateout("$8" /*$t0*/) _, + lateout("$9" /*$t1*/) _, + lateout("$10" /*$t2*/) _, + lateout("$11" /*$t3*/) _, + lateout("$12" /*$t4*/) _, + lateout("$13" /*$t5*/) _, + lateout("$14" /*$t6*/) _, + lateout("$15" /*$t7*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(preserves_flags, readonly) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall6( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, + a5: ArgReg<'_, A5>, +) -> RetReg { + let x0; + let err: usize; + asm!( + ".set noat", + "subu $sp, 32", + "sw {}, 16($sp)", + "sw {}, 20($sp)", + "syscall", + "addu $sp, 32", + ".set at", + in(reg) a4.to_asm(), + in(reg) a5.to_asm(), + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + in("$6" /*$a2*/) a2.to_asm(), + inlateout("$7" /*$a3*/) a3.to_asm() => err, + lateout("$8" /*$t0*/) _, + lateout("$9" /*$t1*/) _, + lateout("$10" /*$t2*/) _, + lateout("$11" /*$t3*/) _, + lateout("$12" /*$t4*/) _, + lateout("$13" /*$t5*/) _, + lateout("$14" /*$t6*/) _, + lateout("$15" /*$t7*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(preserves_flags) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall6_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, + a5: ArgReg<'_, A5>, +) -> RetReg { + let x0; + let err: usize; + asm!( + ".set noat", + "subu $sp, 32", + "sw {}, 16($sp)", + "sw {}, 20($sp)", + "syscall", + "addu $sp, 32", + ".set at", + in(reg) a4.to_asm(), + in(reg) a5.to_asm(), + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + in("$6" /*$a2*/) a2.to_asm(), + inlateout("$7" /*$a3*/) a3.to_asm() => err, + lateout("$8" /*$t0*/) _, + lateout("$9" /*$t1*/) _, + lateout("$10" /*$t2*/) _, + lateout("$11" /*$t3*/) _, + lateout("$12" /*$t4*/) _, + lateout("$13" /*$t5*/) _, + lateout("$14" /*$t6*/) _, + lateout("$15" /*$t7*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(preserves_flags, readonly) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall7_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, + a5: ArgReg<'_, A5>, + a6: ArgReg<'_, A6>, +) -> RetReg { + let x0; + let err: usize; + asm!( + ".set noat", + "subu $sp, 32", + "sw {}, 16($sp)", + "sw {}, 20($sp)", + "sw {}, 24($sp)", + "syscall", + "addu $sp, 32", + ".set at", + in(reg) a4.to_asm(), + in(reg) a5.to_asm(), + in(reg) a6.to_asm(), + inlateout("$2" /*$v0*/) nr.to_asm() => x0, + in("$4" /*$a0*/) a0.to_asm(), + in("$5" /*$a1*/) a1.to_asm(), + in("$6" /*$a2*/) a2.to_asm(), + inlateout("$7" /*$a3*/) a3.to_asm() => err, + lateout("$8" /*$t0*/) _, + lateout("$9" /*$t1*/) _, + lateout("$10" /*$t2*/) _, + lateout("$11" /*$t3*/) _, + lateout("$12" /*$t4*/) _, + lateout("$13" /*$t5*/) _, + lateout("$14" /*$t6*/) _, + lateout("$15" /*$t7*/) _, + lateout("$24" /*$t8*/) _, + lateout("$25" /*$t9*/) _, + options(preserves_flags, readonly) + ); + FromAsm::from_asm(if err != 0 { + (x0 as usize).wrapping_neg() as *mut _ + } else { + x0 + }) +} diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/asm/mod.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/asm/mod.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/asm/mod.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/asm/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,24 @@ +//! Inline asm for making system calls. +//! +//! Compilers should really have intrinsics for making system calls. They're +//! much like regular calls, with custom calling conventions, and calling +//! conventions are otherwise the compiler's job. But for now, use inline asm. +//! +//! The calling conventions for Linux syscalls are [documented here]. +//! +//! [documented here]: https://man7.org/linux/man-pages/man2/syscall.2.html + +#[cfg_attr(target_arch = "aarch64", path = "aarch64.rs")] +#[cfg_attr(all(target_arch = "arm", not(thumb_mode)), path = "arm.rs")] +#[cfg_attr(all(target_arch = "arm", thumb_mode), path = "thumb.rs")] +#[cfg_attr(target_arch = "mips", path = "mips.rs")] +#[cfg_attr(target_arch = "mips32r6", path = "mips32r6.rs")] +#[cfg_attr(target_arch = "mips64", path = "mips64.rs")] +#[cfg_attr(target_arch = "mips64r6", path = "mips64r6.rs")] +#[cfg_attr(target_arch = "powerpc64", path = "powerpc64.rs")] +#[cfg_attr(target_arch = "riscv64", path = "riscv64.rs")] +#[cfg_attr(target_arch = "x86", path = "x86.rs")] +#[cfg_attr(target_arch = "x86_64", path = "x86_64.rs")] +mod target_arch; + +pub(in crate::backend) use target_arch::*; diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/asm/powerpc64.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/asm/powerpc64.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/asm/powerpc64.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/asm/powerpc64.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,413 @@ +//! powerpc64le Linux system calls. +//! +//! On powerpc64le, Linux indicates success or failure using `cr0.SO` rather +//! than by returning a negative error code as most other architectures do. In +//! theory we could immediately translate this into a `Result`, and it'd save a +//! few branches. And in theory we could have specialized sequences for use +//! with syscalls that are known to never fail. However, those would require +//! more extensive changes in rustix's platform-independent code. For now, we +//! check the flag and negate the error value to make PowerPC64 look like other +//! architectures. + +use crate::backend::reg::{ + ArgReg, FromAsm, RetReg, SyscallNumber, ToAsm, A0, A1, A2, A3, A4, A5, R0, +}; +use core::arch::asm; + +#[inline] +pub(in crate::backend) unsafe fn syscall0_readonly(nr: SyscallNumber) -> RetReg { + let r0; + asm!( + "sc", + "bns 0f", + "neg 3, 3", + "0:", + inlateout("r0") nr.to_asm() => _, + lateout("r3") r0, + lateout("r4") _, + lateout("r5") _, + lateout("r6") _, + lateout("r7") _, + lateout("r8") _, + lateout("r9") _, + lateout("r10") _, + lateout("r11") _, + lateout("r12") _, + lateout("cr0") _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall1(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> RetReg { + let r0; + asm!( + "sc", + "bns 0f", + "neg 3, 3", + "0:", + inlateout("r0") nr.to_asm() => _, + inlateout("r3") a0.to_asm() => r0, + lateout("r4") _, + lateout("r5") _, + lateout("r6") _, + lateout("r7") _, + lateout("r8") _, + lateout("r9") _, + lateout("r10") _, + lateout("r11") _, + lateout("r12") _, + lateout("cr0") _, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall1_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, +) -> RetReg { + let r0; + asm!( + "sc", + "bns 0f", + "neg 3, 3", + "0:", + inlateout("r0") nr.to_asm() => _, + inlateout("r3") a0.to_asm() => r0, + lateout("r4") _, + lateout("r5") _, + lateout("r6") _, + lateout("r7") _, + lateout("r8") _, + lateout("r9") _, + lateout("r10") _, + lateout("r11") _, + lateout("r12") _, + lateout("cr0") _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall1_noreturn(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> ! { + asm!( + "sc", + in("r0") nr.to_asm(), + in("r3") a0.to_asm(), + options(noreturn) + ) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall2( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, +) -> RetReg { + let r0; + asm!( + "sc", + "bns 0f", + "neg 3, 3", + "0:", + inlateout("r0") nr.to_asm() => _, + inlateout("r3") a0.to_asm() => r0, + inlateout("r4") a1.to_asm() => _, + lateout("r5") _, + lateout("r6") _, + lateout("r7") _, + lateout("r8") _, + lateout("r9") _, + lateout("r10") _, + lateout("r11") _, + lateout("r12") _, + lateout("cr0") _, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall2_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, +) -> RetReg { + let r0; + asm!( + "sc", + "bns 0f", + "neg 3, 3", + "0:", + inlateout("r0") nr.to_asm() => _, + inlateout("r3") a0.to_asm() => r0, + inlateout("r4") a1.to_asm() => _, + lateout("r5") _, + lateout("r6") _, + lateout("r7") _, + lateout("r8") _, + lateout("r9") _, + lateout("r10") _, + lateout("r11") _, + lateout("r12") _, + lateout("cr0") _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall3( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, +) -> RetReg { + let r0; + asm!( + "sc", + "bns 0f", + "neg 3, 3", + "0:", + inlateout("r0") nr.to_asm() => _, + inlateout("r3") a0.to_asm() => r0, + inlateout("r4") a1.to_asm() => _, + inlateout("r5") a2.to_asm() => _, + lateout("r6") _, + lateout("r7") _, + lateout("r8") _, + lateout("r9") _, + lateout("r10") _, + lateout("r11") _, + lateout("r12") _, + lateout("cr0") _, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall3_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, +) -> RetReg { + let r0; + asm!( + "sc", + "bns 0f", + "neg 3, 3", + "0:", + inlateout("r0") nr.to_asm() => _, + inlateout("r3") a0.to_asm() => r0, + inlateout("r4") a1.to_asm() => _, + inlateout("r5") a2.to_asm() => _, + lateout("r6") _, + lateout("r7") _, + lateout("r8") _, + lateout("r9") _, + lateout("r10") _, + lateout("r11") _, + lateout("r12") _, + lateout("cr0") _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall4( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, +) -> RetReg { + let r0; + asm!( + "sc", + "bns 0f", + "neg 3, 3", + "0:", + inlateout("r0") nr.to_asm() => _, + inlateout("r3") a0.to_asm() => r0, + inlateout("r4") a1.to_asm() => _, + inlateout("r5") a2.to_asm() => _, + inlateout("r6") a3.to_asm() => _, + lateout("r7") _, + lateout("r8") _, + lateout("r9") _, + lateout("r10") _, + lateout("r11") _, + lateout("r12") _, + lateout("cr0") _, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall4_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, +) -> RetReg { + let r0; + asm!( + "sc", + "bns 0f", + "neg 3, 3", + "0:", + inlateout("r0") nr.to_asm() => _, + inlateout("r3") a0.to_asm() => r0, + inlateout("r4") a1.to_asm() => _, + inlateout("r5") a2.to_asm() => _, + inlateout("r6") a3.to_asm() => _, + lateout("r7") _, + lateout("r8") _, + lateout("r9") _, + lateout("r10") _, + lateout("r11") _, + lateout("r12") _, + lateout("cr0") _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall5( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, +) -> RetReg { + let r0; + asm!( + "sc", + "bns 0f", + "neg 3, 3", + "0:", + inlateout("r0") nr.to_asm() => _, + inlateout("r3") a0.to_asm() => r0, + inlateout("r4") a1.to_asm() => _, + inlateout("r5") a2.to_asm() => _, + inlateout("r6") a3.to_asm() => _, + inlateout("r7") a4.to_asm() => _, + lateout("r8") _, + lateout("r9") _, + lateout("r10") _, + lateout("r11") _, + lateout("r12") _, + lateout("cr0") _, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall5_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, +) -> RetReg { + let r0; + asm!( + "sc", + "bns 0f", + "neg 3, 3", + "0:", + inlateout("r0") nr.to_asm() => _, + inlateout("r3") a0.to_asm() => r0, + inlateout("r4") a1.to_asm() => _, + inlateout("r5") a2.to_asm() => _, + inlateout("r6") a3.to_asm() => _, + inlateout("r7") a4.to_asm() => _, + lateout("r8") _, + lateout("r9") _, + lateout("r10") _, + lateout("r11") _, + lateout("r12") _, + lateout("cr0") _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall6( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, + a5: ArgReg<'_, A5>, +) -> RetReg { + let r0; + asm!( + "sc", + "bns 0f", + "neg 3, 3", + "0:", + inlateout("r0") nr.to_asm() => _, + inlateout("r3") a0.to_asm() => r0, + inlateout("r4") a1.to_asm() => _, + inlateout("r5") a2.to_asm() => _, + inlateout("r6") a3.to_asm() => _, + inlateout("r7") a4.to_asm() => _, + inlateout("r8") a5.to_asm() => _, + lateout("r9") _, + lateout("r10") _, + lateout("r11") _, + lateout("r12") _, + lateout("cr0") _, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall6_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, + a5: ArgReg<'_, A5>, +) -> RetReg { + let r0; + asm!( + "sc", + "bns 0f", + "neg 3, 3", + "0:", + inlateout("r0") nr.to_asm() => _, + inlateout("r3") a0.to_asm() => r0, + inlateout("r4") a1.to_asm() => _, + inlateout("r5") a2.to_asm() => _, + inlateout("r6") a3.to_asm() => _, + inlateout("r7") a4.to_asm() => _, + inlateout("r8") a5.to_asm() => _, + lateout("r9") _, + lateout("r10") _, + lateout("r11") _, + lateout("r12") _, + lateout("cr0") _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/asm/riscv64.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/asm/riscv64.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/asm/riscv64.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/asm/riscv64.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,265 @@ +//! riscv64 Linux system calls. + +use crate::backend::reg::{ + ArgReg, FromAsm, RetReg, SyscallNumber, ToAsm, A0, A1, A2, A3, A4, A5, R0, +}; +use core::arch::asm; + +#[inline] +pub(in crate::backend) unsafe fn syscall0_readonly(nr: SyscallNumber<'_>) -> RetReg { + let r0; + asm!( + "ecall", + in("a7") nr.to_asm(), + lateout("a0") r0, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall1(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> RetReg { + let r0; + asm!( + "ecall", + in("a7") nr.to_asm(), + inlateout("a0") a0.to_asm() => r0, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall1_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, +) -> RetReg { + let r0; + asm!( + "ecall", + in("a7") nr.to_asm(), + inlateout("a0") a0.to_asm() => r0, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall1_noreturn(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> ! { + asm!( + "ecall", + in("a7") nr.to_asm(), + in("a0") a0.to_asm(), + options(noreturn) + ); +} + +#[inline] +pub(in crate::backend) unsafe fn syscall2( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, +) -> RetReg { + let r0; + asm!( + "ecall", + in("a7") nr.to_asm(), + inlateout("a0") a0.to_asm() => r0, + in("a1") a1.to_asm(), + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall2_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, +) -> RetReg { + let r0; + asm!( + "ecall", + in("a7") nr.to_asm(), + inlateout("a0") a0.to_asm() => r0, + in("a1") a1.to_asm(), + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall3( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, +) -> RetReg { + let r0; + asm!( + "ecall", + in("a7") nr.to_asm(), + inlateout("a0") a0.to_asm() => r0, + in("a1") a1.to_asm(), + in("a2") a2.to_asm(), + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall3_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, +) -> RetReg { + let r0; + asm!( + "ecall", + in("a7") nr.to_asm(), + inlateout("a0") a0.to_asm() => r0, + in("a1") a1.to_asm(), + in("a2") a2.to_asm(), + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall4( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, +) -> RetReg { + let r0; + asm!( + "ecall", + in("a7") nr.to_asm(), + inlateout("a0") a0.to_asm() => r0, + in("a1") a1.to_asm(), + in("a2") a2.to_asm(), + in("a3") a3.to_asm(), + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall4_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, +) -> RetReg { + let r0; + asm!( + "ecall", + in("a7") nr.to_asm(), + inlateout("a0") a0.to_asm() => r0, + in("a1") a1.to_asm(), + in("a2") a2.to_asm(), + in("a3") a3.to_asm(), + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall5( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, +) -> RetReg { + let r0; + asm!( + "ecall", + in("a7") nr.to_asm(), + inlateout("a0") a0.to_asm() => r0, + in("a1") a1.to_asm(), + in("a2") a2.to_asm(), + in("a3") a3.to_asm(), + in("a4") a4.to_asm(), + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall5_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, +) -> RetReg { + let r0; + asm!( + "ecall", + in("a7") nr.to_asm(), + inlateout("a0") a0.to_asm() => r0, + in("a1") a1.to_asm(), + in("a2") a2.to_asm(), + in("a3") a3.to_asm(), + in("a4") a4.to_asm(), + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall6( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, + a5: ArgReg<'_, A5>, +) -> RetReg { + let r0; + asm!( + "ecall", + in("a7") nr.to_asm(), + inlateout("a0") a0.to_asm() => r0, + in("a1") a1.to_asm(), + in("a2") a2.to_asm(), + in("a3") a3.to_asm(), + in("a4") a4.to_asm(), + in("a5") a5.to_asm(), + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall6_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, + a5: ArgReg<'_, A5>, +) -> RetReg { + let r0; + asm!( + "ecall", + in("a7") nr.to_asm(), + inlateout("a0") a0.to_asm() => r0, + in("a1") a1.to_asm(), + in("a2") a2.to_asm(), + in("a3") a3.to_asm(), + in("a4") a4.to_asm(), + in("a5") a5.to_asm(), + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/asm/thumb.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/asm/thumb.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/asm/thumb.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/asm/thumb.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,322 @@ +//! arm Linux system calls, using thumb-mode. +//! +//! In thumb-mode, r7 is the frame pointer and is not permitted to be used in +//! an inline asm operand, so we have to use a different register and copy it +//! into r7 inside the inline asm. + +use crate::backend::reg::{ + ArgReg, FromAsm, RetReg, SyscallNumber, ToAsm, A0, A1, A2, A3, A4, A5, R0, +}; +use core::arch::asm; + +#[inline] +pub(in crate::backend) unsafe fn syscall0_readonly(nr: SyscallNumber<'_>) -> RetReg { + let r0; + asm!( + "mov {tmp}, r7", + "mov r7, {nr}", + "svc 0", + "mov r7, {tmp}", + nr = in(reg) nr.to_asm(), + tmp = out(reg) _, + lateout("r0") r0, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall1(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> RetReg { + let r0; + asm!( + "mov {tmp}, r7", + "mov r7, {nr}", + "svc 0", + "mov r7, {tmp}", + nr = in(reg) nr.to_asm(), + tmp = out(reg) _, + inlateout("r0") a0.to_asm() => r0, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall1_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, +) -> RetReg { + let r0; + asm!( + "mov {tmp}, r7", + "mov r7, {nr}", + "svc 0", + "mov r7, {tmp}", + nr = in(reg) nr.to_asm(), + tmp = out(reg) _, + inlateout("r0") a0.to_asm() => r0, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall1_noreturn(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> ! { + asm!( + "mov r7, {nr}", + "svc 0", + nr = in(reg) nr.to_asm(), + in("r0") a0.to_asm(), + options(noreturn) + ) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall2( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, +) -> RetReg { + let r0; + asm!( + "mov {tmp}, r7", + "mov r7, {nr}", + "svc 0", + "mov r7, {tmp}", + nr = in(reg) nr.to_asm(), + tmp = out(reg) _, + inlateout("r0") a0.to_asm() => r0, + in("r1") a1.to_asm(), + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall2_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, +) -> RetReg { + let r0; + asm!( + "mov {tmp}, r7", + "mov r7, {nr}", + "svc 0", + "mov r7, {tmp}", + nr = in(reg) nr.to_asm(), + tmp = out(reg) _, + inlateout("r0") a0.to_asm() => r0, + in("r1") a1.to_asm(), + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall3( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, +) -> RetReg { + let r0; + asm!( + "mov {tmp}, r7", + "mov r7, {nr}", + "svc 0", + "mov r7, {tmp}", + nr = in(reg) nr.to_asm(), + tmp = out(reg) _, + inlateout("r0") a0.to_asm() => r0, + in("r1") a1.to_asm(), + in("r2") a2.to_asm(), + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall3_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, +) -> RetReg { + let r0; + asm!( + "mov {tmp}, r7", + "mov r7, {nr}", + "svc 0", + "mov r7, {tmp}", + nr = in(reg) nr.to_asm(), + tmp = out(reg) _, + inlateout("r0") a0.to_asm() => r0, + in("r1") a1.to_asm(), + in("r2") a2.to_asm(), + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall4( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, +) -> RetReg { + let r0; + asm!( + "mov {tmp}, r7", + "mov r7, {nr}", + "svc 0", + "mov r7, {tmp}", + nr = in(reg) nr.to_asm(), + tmp = out(reg) _, + inlateout("r0") a0.to_asm() => r0, + in("r1") a1.to_asm(), + in("r2") a2.to_asm(), + in("r3") a3.to_asm(), + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall4_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, +) -> RetReg { + let r0; + asm!( + "mov {tmp}, r7", + "mov r7, {nr}", + "svc 0", + "mov r7, {tmp}", + nr = in(reg) nr.to_asm(), + tmp = out(reg) _, + inlateout("r0") a0.to_asm() => r0, + in("r1") a1.to_asm(), + in("r2") a2.to_asm(), + in("r3") a3.to_asm(), + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall5( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, +) -> RetReg { + let r0; + asm!( + "mov {tmp}, r7", + "mov r7, {nr}", + "svc 0", + "mov r7, {tmp}", + nr = in(reg) nr.to_asm(), + tmp = out(reg) _, + inlateout("r0") a0.to_asm() => r0, + in("r1") a1.to_asm(), + in("r2") a2.to_asm(), + in("r3") a3.to_asm(), + in("r4") a4.to_asm(), + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall5_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, +) -> RetReg { + let r0; + asm!( + "mov {tmp}, r7", + "mov r7, {nr}", + "svc 0", + "mov r7, {tmp}", + nr = in(reg) nr.to_asm(), + tmp = out(reg) _, + inlateout("r0") a0.to_asm() => r0, + in("r1") a1.to_asm(), + in("r2") a2.to_asm(), + in("r3") a3.to_asm(), + in("r4") a4.to_asm(), + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall6( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, + a5: ArgReg<'_, A5>, +) -> RetReg { + let r0; + asm!( + "mov {tmp}, r7", + "mov r7, {nr}", + "svc 0", + "mov r7, {tmp}", + nr = in(reg) nr.to_asm(), + tmp = out(reg) _, + inlateout("r0") a0.to_asm() => r0, + in("r1") a1.to_asm(), + in("r2") a2.to_asm(), + in("r3") a3.to_asm(), + in("r4") a4.to_asm(), + in("r5") a5.to_asm(), + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall6_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, + a5: ArgReg<'_, A5>, +) -> RetReg { + let r0; + asm!( + "mov {tmp}, r7", + "mov r7, {nr}", + "svc 0", + "mov r7, {tmp}", + nr = in(reg) nr.to_asm(), + tmp = out(reg) _, + inlateout("r0") a0.to_asm() => r0, + in("r1") a1.to_asm(), + in("r2") a2.to_asm(), + in("r3") a3.to_asm(), + in("r4") a4.to_asm(), + in("r5") a5.to_asm(), + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/asm/x86_64.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/asm/x86_64.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/asm/x86_64.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/asm/x86_64.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,293 @@ +//! x86-64 Linux system calls. + +use crate::backend::reg::{ + ArgReg, FromAsm, RetReg, SyscallNumber, ToAsm, A0, A1, A2, A3, A4, A5, R0, +}; +use core::arch::asm; + +#[cfg(target_pointer_width = "32")] +compile_error!("x32 is not yet supported"); + +#[inline] +pub(in crate::backend) unsafe fn syscall0_readonly(nr: SyscallNumber<'_>) -> RetReg { + let r0; + asm!( + "syscall", + inlateout("rax") nr.to_asm() => r0, + lateout("rcx") _, + lateout("r11") _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall1(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> RetReg { + let r0; + asm!( + "syscall", + inlateout("rax") nr.to_asm() => r0, + in("rdi") a0.to_asm(), + lateout("rcx") _, + lateout("r11") _, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall1_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, +) -> RetReg { + let r0; + asm!( + "syscall", + inlateout("rax") nr.to_asm() => r0, + in("rdi") a0.to_asm(), + lateout("rcx") _, + lateout("r11") _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall1_noreturn(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> ! { + asm!( + "syscall", + in("rax") nr.to_asm(), + in("rdi") a0.to_asm(), + options(noreturn) + ) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall2( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, +) -> RetReg { + let r0; + asm!( + "syscall", + inlateout("rax") nr.to_asm() => r0, + in("rdi") a0.to_asm(), + in("rsi") a1.to_asm(), + lateout("rcx") _, + lateout("r11") _, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall2_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, +) -> RetReg { + let r0; + asm!( + "syscall", + inlateout("rax") nr.to_asm() => r0, + in("rdi") a0.to_asm(), + in("rsi") a1.to_asm(), + lateout("rcx") _, + lateout("r11") _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall3( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, +) -> RetReg { + let r0; + asm!( + "syscall", + inlateout("rax") nr.to_asm() => r0, + in("rdi") a0.to_asm(), + in("rsi") a1.to_asm(), + in("rdx") a2.to_asm(), + lateout("rcx") _, + lateout("r11") _, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall3_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, +) -> RetReg { + let r0; + asm!( + "syscall", + inlateout("rax") nr.to_asm() => r0, + in("rdi") a0.to_asm(), + in("rsi") a1.to_asm(), + in("rdx") a2.to_asm(), + lateout("rcx") _, + lateout("r11") _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall4( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, +) -> RetReg { + let r0; + asm!( + "syscall", + inlateout("rax") nr.to_asm() => r0, + in("rdi") a0.to_asm(), + in("rsi") a1.to_asm(), + in("rdx") a2.to_asm(), + in("r10") a3.to_asm(), + lateout("rcx") _, + lateout("r11") _, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall4_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, +) -> RetReg { + let r0; + asm!( + "syscall", + inlateout("rax") nr.to_asm() => r0, + in("rdi") a0.to_asm(), + in("rsi") a1.to_asm(), + in("rdx") a2.to_asm(), + in("r10") a3.to_asm(), + lateout("rcx") _, + lateout("r11") _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall5( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, +) -> RetReg { + let r0; + asm!( + "syscall", + inlateout("rax") nr.to_asm() => r0, + in("rdi") a0.to_asm(), + in("rsi") a1.to_asm(), + in("rdx") a2.to_asm(), + in("r10") a3.to_asm(), + in("r8") a4.to_asm(), + lateout("rcx") _, + lateout("r11") _, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall5_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, +) -> RetReg { + let r0; + asm!( + "syscall", + inlateout("rax") nr.to_asm() => r0, + in("rdi") a0.to_asm(), + in("rsi") a1.to_asm(), + in("rdx") a2.to_asm(), + in("r10") a3.to_asm(), + in("r8") a4.to_asm(), + lateout("rcx") _, + lateout("r11") _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall6( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, + a5: ArgReg<'_, A5>, +) -> RetReg { + let r0; + asm!( + "syscall", + inlateout("rax") nr.to_asm() => r0, + in("rdi") a0.to_asm(), + in("rsi") a1.to_asm(), + in("rdx") a2.to_asm(), + in("r10") a3.to_asm(), + in("r8") a4.to_asm(), + in("r9") a5.to_asm(), + lateout("rcx") _, + lateout("r11") _, + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall6_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, + a5: ArgReg<'_, A5>, +) -> RetReg { + let r0; + asm!( + "syscall", + inlateout("rax") nr.to_asm() => r0, + in("rdi") a0.to_asm(), + in("rsi") a1.to_asm(), + in("rdx") a2.to_asm(), + in("r10") a3.to_asm(), + in("r8") a4.to_asm(), + in("r9") a5.to_asm(), + lateout("rcx") _, + lateout("r11") _, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/asm/x86.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/asm/x86.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/asm/x86.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/asm/x86.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,490 @@ +//! 32-bit x86 Linux system calls. +//! +//! There are two forms; `indirect_*` which take a callee, which allow calling +//! through the vDSO when possible, and plain forms, which use the `int 0x80` +//! instruction. +//! +//! Most `rustix` syscalls use the vsyscall mechanism rather than going using +//! `int 0x80` sequences, as vsyscall is much faster. +//! +//! Syscalls made with `int 0x80` preserve the flags register, while syscalls +//! made using vsyscall do not. + +#![allow(dead_code)] + +use crate::backend::reg::{ + ArgReg, FromAsm, RetReg, SyscallNumber, ToAsm, A0, A1, A2, A3, A4, A5, R0, +}; +use crate::backend::vdso_wrappers::SyscallType; +use core::arch::asm; + +#[inline] +pub(in crate::backend) unsafe fn indirect_syscall0( + callee: SyscallType, + nr: SyscallNumber<'_>, +) -> RetReg { + let r0; + asm!( + "call {callee}", + callee = in(reg) callee, + inlateout("eax") nr.to_asm() => r0, + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn indirect_syscall1( + callee: SyscallType, + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, +) -> RetReg { + let r0; + asm!( + "call {callee}", + callee = in(reg) callee, + inlateout("eax") nr.to_asm() => r0, + in("ebx") a0.to_asm(), + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn indirect_syscall1_noreturn( + callee: SyscallType, + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, +) -> ! { + asm!( + "call {callee}", + callee = in(reg) callee, + in("eax") nr.to_asm(), + in("ebx") a0.to_asm(), + options(noreturn) + ) +} + +#[inline] +pub(in crate::backend) unsafe fn indirect_syscall2( + callee: SyscallType, + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, +) -> RetReg { + let r0; + asm!( + "call {callee}", + callee = in(reg) callee, + inlateout("eax") nr.to_asm() => r0, + in("ebx") a0.to_asm(), + in("ecx") a1.to_asm(), + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn indirect_syscall3( + callee: SyscallType, + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, +) -> RetReg { + let r0; + asm!( + "call {callee}", + callee = in(reg) callee, + inlateout("eax") nr.to_asm() => r0, + in("ebx") a0.to_asm(), + in("ecx") a1.to_asm(), + in("edx") a2.to_asm(), + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn indirect_syscall4( + callee: SyscallType, + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, +) -> RetReg { + let r0; + // a3 should go in esi, but `asm!` won't let us use it as an operand. + // Temporarily swap it into place, and then swap it back afterward. + // + // We hard-code the callee operand to use edi instead of `in(reg)` because + // even though we can't name esi as an operand, the compiler can use esi to + // satisfy `in(reg)`. + asm!( + "xchg esi, {a3}", + "call edi", + "xchg esi, {a3}", + a3 = in(reg) a3.to_asm(), + in("edi") callee, + inlateout("eax") nr.to_asm() => r0, + in("ebx") a0.to_asm(), + in("ecx") a1.to_asm(), + in("edx") a2.to_asm(), + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn indirect_syscall5( + callee: SyscallType, + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, +) -> RetReg { + let r0; + // Oof. a3 should go in esi, and `asm!` won't let us use that register as + // an operand. And we can't request stack slots. And there are no other + // registers free. Use eax as a temporary pointer to a slice, since it gets + // clobbered as the return value anyway. + asm!( + "push esi", + "push DWORD PTR [eax + 0]", + "mov esi, DWORD PTR [eax + 4]", + "mov eax, DWORD PTR [eax + 8]", + "call DWORD PTR [esp]", + "pop esi", + "pop esi", + inout("eax") &[callee as _, a3.to_asm(), nr.to_asm()] => r0, + in("ebx") a0.to_asm(), + in("ecx") a1.to_asm(), + in("edx") a2.to_asm(), + in("edi") a4.to_asm(), + ); + FromAsm::from_asm(r0) +} + +#[allow(clippy::too_many_arguments)] +#[inline] +pub(in crate::backend) unsafe fn indirect_syscall6( + callee: SyscallType, + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, + a5: ArgReg<'_, A5>, +) -> RetReg { + let r0; + // Oof again. a3 should go in esi, and a5 should go in ebp, and `asm!` + // won't let us use either of those registers as operands. And we can't + // request stack slots. And there are no other registers free. Use eax as a + // temporary pointer to a slice, since it gets clobbered as the return + // value anyway. + // + // This is another reason that syscalls should be compiler intrinsics + // rather than inline asm. + asm!( + "push ebp", + "push esi", + "push DWORD PTR [eax + 0]", + "mov esi, DWORD PTR [eax + 4]", + "mov ebp, DWORD PTR [eax + 8]", + "mov eax, DWORD PTR [eax + 12]", + "call DWORD PTR [esp]", + "pop esi", + "pop esi", + "pop ebp", + inout("eax") &[callee as _, a3.to_asm(), a5.to_asm(), nr.to_asm()] => r0, + in("ebx") a0.to_asm(), + in("ecx") a1.to_asm(), + in("edx") a2.to_asm(), + in("edi") a4.to_asm(), + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall0_readonly(nr: SyscallNumber<'_>) -> RetReg { + let r0; + asm!( + "int $$0x80", + inlateout("eax") nr.to_asm() => r0, + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall1(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> RetReg { + let r0; + asm!( + "int $$0x80", + inlateout("eax") nr.to_asm() => r0, + in("ebx") a0.to_asm(), + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall1_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, +) -> RetReg { + let r0; + asm!( + "int $$0x80", + inlateout("eax") nr.to_asm() => r0, + in("ebx") a0.to_asm(), + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall1_noreturn(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> ! { + asm!( + "int $$0x80", + in("eax") nr.to_asm(), + in("ebx") a0.to_asm(), + options(noreturn) + ) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall2( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, +) -> RetReg { + let r0; + asm!( + "int $$0x80", + inlateout("eax") nr.to_asm() => r0, + in("ebx") a0.to_asm(), + in("ecx") a1.to_asm(), + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall2_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, +) -> RetReg { + let r0; + asm!( + "int $$0x80", + inlateout("eax") nr.to_asm() => r0, + in("ebx") a0.to_asm(), + in("ecx") a1.to_asm(), + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall3( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, +) -> RetReg { + let r0; + asm!( + "int $$0x80", + inlateout("eax") nr.to_asm() => r0, + in("ebx") a0.to_asm(), + in("ecx") a1.to_asm(), + in("edx") a2.to_asm(), + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall3_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, +) -> RetReg { + let r0; + asm!( + "int $$0x80", + inlateout("eax") nr.to_asm() => r0, + in("ebx") a0.to_asm(), + in("ecx") a1.to_asm(), + in("edx") a2.to_asm(), + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall4( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, +) -> RetReg { + let r0; + // a3 should go in esi, but `asm!` won't let us use it as an operand. + // Temporarily swap it into place, and then swap it back afterward. + asm!( + "xchg esi, {a3}", + "int $$0x80", + "xchg esi, {a3}", + a3 = in(reg) a3.to_asm(), + inlateout("eax") nr.to_asm() => r0, + in("ebx") a0.to_asm(), + in("ecx") a1.to_asm(), + in("edx") a2.to_asm(), + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall4_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, +) -> RetReg { + let r0; + asm!( + "xchg esi, {a3}", + "int $$0x80", + "xchg esi, {a3}", + a3 = in(reg) a3.to_asm(), + inlateout("eax") nr.to_asm() => r0, + in("ebx") a0.to_asm(), + in("ecx") a1.to_asm(), + in("edx") a2.to_asm(), + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall5( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, +) -> RetReg { + let r0; + // As in `syscall4`, use xchg to handle a3. a4 should go in edi, and we can + // use that register as an operand. Unlike in `indirect_syscall5`, we don't + // have a `callee` operand taking up a register, so we have enough + // registers and don't need to use a slice. + asm!( + "xchg esi, {a3}", + "int $$0x80", + "xchg esi, {a3}", + a3 = in(reg) a3.to_asm(), + inlateout("eax") nr.to_asm() => r0, + in("ebx") a0.to_asm(), + in("ecx") a1.to_asm(), + in("edx") a2.to_asm(), + in("edi") a4.to_asm(), + options(nostack, preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall5_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, +) -> RetReg { + let r0; + // See the comments in `syscall5`. + asm!( + "xchg esi, {a3}", + "int $$0x80", + "xchg esi, {a3}", + a3 = in(reg) a3.to_asm(), + inlateout("eax") nr.to_asm() => r0, + in("ebx") a0.to_asm(), + in("ecx") a1.to_asm(), + in("edx") a2.to_asm(), + in("edi") a4.to_asm(), + options(nostack, preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall6( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, + a5: ArgReg<'_, A5>, +) -> RetReg { + let r0; + // See the comments in `indirect_syscall6`. + asm!( + "push ebp", + "push esi", + "mov esi, DWORD PTR [eax + 0]", + "mov ebp, DWORD PTR [eax + 4]", + "mov eax, DWORD PTR [eax + 8]", + "int $$0x80", + "pop esi", + "pop ebp", + inout("eax") &[a3.to_asm(), a5.to_asm(), nr.to_asm()] => r0, + in("ebx") a0.to_asm(), + in("ecx") a1.to_asm(), + in("edx") a2.to_asm(), + in("edi") a4.to_asm(), + options(preserves_flags) + ); + FromAsm::from_asm(r0) +} + +#[inline] +pub(in crate::backend) unsafe fn syscall6_readonly( + nr: SyscallNumber<'_>, + a0: ArgReg<'_, A0>, + a1: ArgReg<'_, A1>, + a2: ArgReg<'_, A2>, + a3: ArgReg<'_, A3>, + a4: ArgReg<'_, A4>, + a5: ArgReg<'_, A5>, +) -> RetReg { + let r0; + // See the comments in `indirect_syscall6`. + asm!( + "push ebp", + "push esi", + "mov esi, DWORD PTR [eax + 0]", + "mov ebp, DWORD PTR [eax + 4]", + "mov eax, DWORD PTR [eax + 8]", + "int $$0x80", + "pop esi", + "pop ebp", + inout("eax") &[a3.to_asm(), a5.to_asm(), nr.to_asm()] => r0, + in("ebx") a0.to_asm(), + in("ecx") a1.to_asm(), + in("edx") a2.to_asm(), + in("edi") a4.to_asm(), + options(preserves_flags, readonly) + ); + FromAsm::from_asm(r0) +} diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/mips32r6.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/mips32r6.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/mips32r6.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/mips32r6.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,543 +0,0 @@ -//! mipsisa32r6el Linux system calls. -//! -//! On mipsisa32r6el, Linux indicates success or failure using `$a3` rather -//! than by returning a negative error code as most other architectures do. -//! -//! Mips-family platforms have a special calling convention for `__NR_pipe`, -//! however we use `__NR_pipe2` instead to avoid having to implement it. - -use crate::backend::reg::{ - ArgReg, FromAsm, RetReg, SyscallNumber, ToAsm, A0, A1, A2, A3, A4, A5, A6, R0, -}; -use core::arch::asm; - -#[inline] -pub(in crate::backend) unsafe fn syscall0_readonly(nr: SyscallNumber) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - lateout("$7" /*$a3*/) err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1_noreturn(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> ! { - asm!( - "syscall", - in("$2" /*$v0*/) nr.to_asm(), - in("$4" /*$a0*/) a0.to_asm(), - options(nostack, noreturn) - ) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall2( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall2_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall3( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall3_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall4( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall4_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall5( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, -) -> RetReg { - let x0; - let err: usize; - asm!( - ".set noat", - "subu $sp, 32", - "sw {}, 16($sp)", - "syscall", - "addu $sp, 32", - ".set at", - in(reg) a4.to_asm(), - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall5_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, -) -> RetReg { - let x0; - let err: usize; - asm!( - ".set noat", - "subu $sp, 32", - "sw {}, 16($sp)", - "syscall", - "addu $sp, 32", - ".set at", - in(reg) a4.to_asm(), - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall6( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, -) -> RetReg { - let x0; - let err: usize; - asm!( - ".set noat", - "subu $sp, 32", - "sw {}, 16($sp)", - "sw {}, 20($sp)", - "syscall", - "addu $sp, 32", - ".set at", - in(reg) a4.to_asm(), - in(reg) a5.to_asm(), - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall6_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, -) -> RetReg { - let x0; - let err: usize; - asm!( - ".set noat", - "subu $sp, 32", - "sw {}, 16($sp)", - "sw {}, 20($sp)", - "syscall", - "addu $sp, 32", - ".set at", - in(reg) a4.to_asm(), - in(reg) a5.to_asm(), - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall7_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, - a6: ArgReg<'_, A6>, -) -> RetReg { - let x0; - let err: usize; - asm!( - ".set noat", - "subu $sp, 32", - "sw {}, 16($sp)", - "sw {}, 20($sp)", - "sw {}, 24($sp)", - "syscall", - "addu $sp, 32", - ".set at", - in(reg) a4.to_asm(), - in(reg) a5.to_asm(), - in(reg) a6.to_asm(), - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/mips64r6.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/mips64r6.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/mips64r6.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/mips64r6.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,470 +0,0 @@ -//! mipsisa64r6el Linux system calls. -//! -//! On mipsisa64r6el, Linux indicates success or failure using `$a3` (`$7`) -//! rather than by returning a negative error code as most other architectures -//! do. -//! -//! Mips-family platforms have a special calling convention for `__NR_pipe`, -//! however we use `__NR_pipe2` instead to avoid having to implement it. -//! -//! Note that MIPS R6 inline assembly currently doesn't differ from MIPS, -//! because no explicit call of R6-only or R2-only instructions exist here. - -use crate::backend::reg::{ - ArgReg, FromAsm, RetReg, SyscallNumber, ToAsm, A0, A1, A2, A3, A4, A5, R0, -}; -use core::arch::asm; - -#[inline] -pub(in crate::backend) unsafe fn syscall0_readonly(nr: SyscallNumber) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - lateout("$7" /*$a3*/) err, - lateout("$8" /*$a4*/) _, - lateout("$9" /*$a5*/) _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$a4*/) _, - lateout("$9" /*$a5*/) _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$a4*/) _, - lateout("$9" /*$a5*/) _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1_noreturn(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> ! { - asm!( - "syscall", - in("$2" /*$v0*/) nr.to_asm(), - in("$4" /*$a0*/) a0.to_asm(), - options(nostack, noreturn) - ) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall2( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$a4*/) _, - lateout("$9" /*$a5*/) _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall2_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$a4*/) _, - lateout("$9" /*$a5*/) _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall3( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$a4*/) _, - lateout("$9" /*$a5*/) _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall3_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$a4*/) _, - lateout("$9" /*$a5*/) _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall4( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - lateout("$8" /*$a4*/) _, - lateout("$9" /*$a5*/) _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall4_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - lateout("$8" /*$a4*/) _, - lateout("$9" /*$a5*/) _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall5( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - inlateout("$8" /*$a4*/) a4.to_asm() => _, - lateout("$9" /*$a5*/) _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall5_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - inlateout("$8" /*$a4*/) a4.to_asm() => _, - lateout("$9" /*$a5*/) _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall6( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - inlateout("$8" /*$a4*/) a4.to_asm() => _, - inlateout("$9" /*$a5*/) a5.to_asm() => _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall6_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - inlateout("$8" /*$a4*/) a4.to_asm() => _, - inlateout("$9" /*$a5*/) a5.to_asm() => _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/mips64.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/mips64.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/mips64.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/mips64.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,466 +0,0 @@ -//! mips64el Linux system calls. -//! -//! On mips64el, Linux indicates success or failure using `$a3` (`$7`) rather -//! than by returning a negative error code as most other architectures do. -//! -//! Mips-family platforms have a special calling convention for `__NR_pipe`, -//! however we use `__NR_pipe2` instead to avoid having to implement it. - -use crate::backend::reg::{ - ArgReg, FromAsm, RetReg, SyscallNumber, ToAsm, A0, A1, A2, A3, A4, A5, R0, -}; -use core::arch::asm; - -#[inline] -pub(in crate::backend) unsafe fn syscall0_readonly(nr: SyscallNumber) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - lateout("$7" /*$a3*/) err, - lateout("$8" /*$a4*/) _, - lateout("$9" /*$a5*/) _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$a4*/) _, - lateout("$9" /*$a5*/) _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$a4*/) _, - lateout("$9" /*$a5*/) _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1_noreturn(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> ! { - asm!( - "syscall", - in("$2" /*$v0*/) nr.to_asm(), - in("$4" /*$a0*/) a0.to_asm(), - options(nostack, noreturn) - ) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall2( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$a4*/) _, - lateout("$9" /*$a5*/) _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall2_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$a4*/) _, - lateout("$9" /*$a5*/) _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall3( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$a4*/) _, - lateout("$9" /*$a5*/) _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall3_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$a4*/) _, - lateout("$9" /*$a5*/) _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall4( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - lateout("$8" /*$a4*/) _, - lateout("$9" /*$a5*/) _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall4_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - lateout("$8" /*$a4*/) _, - lateout("$9" /*$a5*/) _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall5( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - inlateout("$8" /*$a4*/) a4.to_asm() => _, - lateout("$9" /*$a5*/) _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall5_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - inlateout("$8" /*$a4*/) a4.to_asm() => _, - lateout("$9" /*$a5*/) _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall6( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - inlateout("$8" /*$a4*/) a4.to_asm() => _, - inlateout("$9" /*$a5*/) a5.to_asm() => _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall6_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - inlateout("$8" /*$a4*/) a4.to_asm() => _, - inlateout("$9" /*$a5*/) a5.to_asm() => _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/mips.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/mips.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/mips.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/mips.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,543 +0,0 @@ -//! mipsel Linux system calls. -//! -//! On mipsel, Linux indicates success or failure using `$a3` rather -//! than by returning a negative error code as most other architectures do. -//! -//! Mips-family platforms have a special calling convention for `__NR_pipe`, -//! however we use `__NR_pipe2` instead to avoid having to implement it. - -use crate::backend::reg::{ - ArgReg, FromAsm, RetReg, SyscallNumber, ToAsm, A0, A1, A2, A3, A4, A5, A6, R0, -}; -use core::arch::asm; - -#[inline] -pub(in crate::backend) unsafe fn syscall0_readonly(nr: SyscallNumber) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - lateout("$7" /*$a3*/) err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1_noreturn(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> ! { - asm!( - "syscall", - in("$2" /*$v0*/) nr.to_asm(), - in("$4" /*$a0*/) a0.to_asm(), - options(nostack, noreturn) - ) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall2( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall2_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall3( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall3_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall4( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall4_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, -) -> RetReg { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall5( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, -) -> RetReg { - let x0; - let err: usize; - asm!( - ".set noat", - "subu $sp, 32", - "sw {}, 16($sp)", - "syscall", - "addu $sp, 32", - ".set at", - in(reg) a4.to_asm(), - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall5_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, -) -> RetReg { - let x0; - let err: usize; - asm!( - ".set noat", - "subu $sp, 32", - "sw {}, 16($sp)", - "syscall", - "addu $sp, 32", - ".set at", - in(reg) a4.to_asm(), - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall6( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, -) -> RetReg { - let x0; - let err: usize; - asm!( - ".set noat", - "subu $sp, 32", - "sw {}, 16($sp)", - "sw {}, 20($sp)", - "syscall", - "addu $sp, 32", - ".set at", - in(reg) a4.to_asm(), - in(reg) a5.to_asm(), - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall6_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, -) -> RetReg { - let x0; - let err: usize; - asm!( - ".set noat", - "subu $sp, 32", - "sw {}, 16($sp)", - "sw {}, 20($sp)", - "syscall", - "addu $sp, 32", - ".set at", - in(reg) a4.to_asm(), - in(reg) a5.to_asm(), - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall7_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, - a6: ArgReg<'_, A6>, -) -> RetReg { - let x0; - let err: usize; - asm!( - ".set noat", - "subu $sp, 32", - "sw {}, 16($sp)", - "sw {}, 20($sp)", - "sw {}, 24($sp)", - "syscall", - "addu $sp, 32", - ".set at", - in(reg) a4.to_asm(), - in(reg) a5.to_asm(), - in(reg) a6.to_asm(), - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/mod.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/mod.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -3,14 +3,6 @@ //! This module also has a `choose` submodule which chooses a scheme and is //! what most of the `rustix` syscalls use. //! -//! Compilers should really have intrinsics for making system calls. They're -//! much like regular calls, with custom calling conventions, and calling -//! conventions are otherwise the compiler's job. But for now, use inline asm. -//! -//! The calling conventions for Linux syscalls are [documented here]. -//! -//! [documented here]: https://man7.org/linux/man-pages/man2/syscall.2.html -//! //! # Safety //! //! This contains the inline `asm` statements performing the syscall @@ -23,17 +15,6 @@ // These functions always use the machine's syscall instruction, even when it // isn't the fastest option available. -#[cfg_attr(target_arch = "aarch64", path = "aarch64.rs")] -#[cfg_attr(all(target_arch = "arm", not(thumb_mode)), path = "arm.rs")] -#[cfg_attr(all(target_arch = "arm", thumb_mode), path = "thumb.rs")] -#[cfg_attr(target_arch = "mips", path = "mips.rs")] -#[cfg_attr(target_arch = "mips32r6", path = "mips32r6.rs")] -#[cfg_attr(target_arch = "mips64", path = "mips64.rs")] -#[cfg_attr(target_arch = "mips64r6", path = "mips64r6.rs")] -#[cfg_attr(target_arch = "powerpc64", path = "powerpc64.rs")] -#[cfg_attr(target_arch = "riscv64", path = "riscv64.rs")] -#[cfg_attr(target_arch = "x86", path = "x86.rs")] -#[cfg_attr(target_arch = "x86_64", path = "x86_64.rs")] pub(in crate::backend) mod asm; // On most architectures, the architecture syscall instruction is fast, so use diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/powerpc64.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/powerpc64.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/powerpc64.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/powerpc64.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,413 +0,0 @@ -//! powerpc64le Linux system calls. -//! -//! On powerpc64le, Linux indicates success or failure using `cr0.SO` rather -//! than by returning a negative error code as most other architectures do. In -//! theory we could immediately translate this into a `Result`, and it'd save a -//! few branches. And in theory we could have specialized sequences for use -//! with syscalls that are known to never fail. However, those would require -//! more extensive changes in rustix's platform-independent code. For now, we -//! check the flag and negate the error value to make PowerPC64 look like other -//! architectures. - -use crate::backend::reg::{ - ArgReg, FromAsm, RetReg, SyscallNumber, ToAsm, A0, A1, A2, A3, A4, A5, R0, -}; -use core::arch::asm; - -#[inline] -pub(in crate::backend) unsafe fn syscall0_readonly(nr: SyscallNumber<'_>) -> RetReg { - let r0; - asm!( - "sc", - "bns 0f", - "neg 3, 3", - "0:", - inlateout("r0") nr.to_asm() => _, - lateout("r3") r0, - lateout("r4") _, - lateout("r5") _, - lateout("r6") _, - lateout("r7") _, - lateout("r8") _, - lateout("r9") _, - lateout("r10") _, - lateout("r11") _, - lateout("r12") _, - lateout("cr0") _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> RetReg { - let r0; - asm!( - "sc", - "bns 0f", - "neg 3, 3", - "0:", - inlateout("r0") nr.to_asm() => _, - inlateout("r3") a0.to_asm() => r0, - lateout("r4") _, - lateout("r5") _, - lateout("r6") _, - lateout("r7") _, - lateout("r8") _, - lateout("r9") _, - lateout("r10") _, - lateout("r11") _, - lateout("r12") _, - lateout("cr0") _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, -) -> RetReg { - let r0; - asm!( - "sc", - "bns 0f", - "neg 3, 3", - "0:", - inlateout("r0") nr.to_asm() => _, - inlateout("r3") a0.to_asm() => r0, - lateout("r4") _, - lateout("r5") _, - lateout("r6") _, - lateout("r7") _, - lateout("r8") _, - lateout("r9") _, - lateout("r10") _, - lateout("r11") _, - lateout("r12") _, - lateout("cr0") _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1_noreturn(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> ! { - asm!( - "sc", - in("r0") nr.to_asm(), - in("r3") a0.to_asm(), - options(nostack, noreturn) - ) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall2( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, -) -> RetReg { - let r0; - asm!( - "sc", - "bns 0f", - "neg 3, 3", - "0:", - inlateout("r0") nr.to_asm() => _, - inlateout("r3") a0.to_asm() => r0, - inlateout("r4") a1.to_asm() => _, - lateout("r5") _, - lateout("r6") _, - lateout("r7") _, - lateout("r8") _, - lateout("r9") _, - lateout("r10") _, - lateout("r11") _, - lateout("r12") _, - lateout("cr0") _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall2_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, -) -> RetReg { - let r0; - asm!( - "sc", - "bns 0f", - "neg 3, 3", - "0:", - inlateout("r0") nr.to_asm() => _, - inlateout("r3") a0.to_asm() => r0, - inlateout("r4") a1.to_asm() => _, - lateout("r5") _, - lateout("r6") _, - lateout("r7") _, - lateout("r8") _, - lateout("r9") _, - lateout("r10") _, - lateout("r11") _, - lateout("r12") _, - lateout("cr0") _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall3( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, -) -> RetReg { - let r0; - asm!( - "sc", - "bns 0f", - "neg 3, 3", - "0:", - inlateout("r0") nr.to_asm() => _, - inlateout("r3") a0.to_asm() => r0, - inlateout("r4") a1.to_asm() => _, - inlateout("r5") a2.to_asm() => _, - lateout("r6") _, - lateout("r7") _, - lateout("r8") _, - lateout("r9") _, - lateout("r10") _, - lateout("r11") _, - lateout("r12") _, - lateout("cr0") _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall3_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, -) -> RetReg { - let r0; - asm!( - "sc", - "bns 0f", - "neg 3, 3", - "0:", - inlateout("r0") nr.to_asm() => _, - inlateout("r3") a0.to_asm() => r0, - inlateout("r4") a1.to_asm() => _, - inlateout("r5") a2.to_asm() => _, - lateout("r6") _, - lateout("r7") _, - lateout("r8") _, - lateout("r9") _, - lateout("r10") _, - lateout("r11") _, - lateout("r12") _, - lateout("cr0") _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall4( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, -) -> RetReg { - let r0; - asm!( - "sc", - "bns 0f", - "neg 3, 3", - "0:", - inlateout("r0") nr.to_asm() => _, - inlateout("r3") a0.to_asm() => r0, - inlateout("r4") a1.to_asm() => _, - inlateout("r5") a2.to_asm() => _, - inlateout("r6") a3.to_asm() => _, - lateout("r7") _, - lateout("r8") _, - lateout("r9") _, - lateout("r10") _, - lateout("r11") _, - lateout("r12") _, - lateout("cr0") _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall4_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, -) -> RetReg { - let r0; - asm!( - "sc", - "bns 0f", - "neg 3, 3", - "0:", - inlateout("r0") nr.to_asm() => _, - inlateout("r3") a0.to_asm() => r0, - inlateout("r4") a1.to_asm() => _, - inlateout("r5") a2.to_asm() => _, - inlateout("r6") a3.to_asm() => _, - lateout("r7") _, - lateout("r8") _, - lateout("r9") _, - lateout("r10") _, - lateout("r11") _, - lateout("r12") _, - lateout("cr0") _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall5( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, -) -> RetReg { - let r0; - asm!( - "sc", - "bns 0f", - "neg 3, 3", - "0:", - inlateout("r0") nr.to_asm() => _, - inlateout("r3") a0.to_asm() => r0, - inlateout("r4") a1.to_asm() => _, - inlateout("r5") a2.to_asm() => _, - inlateout("r6") a3.to_asm() => _, - inlateout("r7") a4.to_asm() => _, - lateout("r8") _, - lateout("r9") _, - lateout("r10") _, - lateout("r11") _, - lateout("r12") _, - lateout("cr0") _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall5_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, -) -> RetReg { - let r0; - asm!( - "sc", - "bns 0f", - "neg 3, 3", - "0:", - inlateout("r0") nr.to_asm() => _, - inlateout("r3") a0.to_asm() => r0, - inlateout("r4") a1.to_asm() => _, - inlateout("r5") a2.to_asm() => _, - inlateout("r6") a3.to_asm() => _, - inlateout("r7") a4.to_asm() => _, - lateout("r8") _, - lateout("r9") _, - lateout("r10") _, - lateout("r11") _, - lateout("r12") _, - lateout("cr0") _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall6( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, -) -> RetReg { - let r0; - asm!( - "sc", - "bns 0f", - "neg 3, 3", - "0:", - inlateout("r0") nr.to_asm() => _, - inlateout("r3") a0.to_asm() => r0, - inlateout("r4") a1.to_asm() => _, - inlateout("r5") a2.to_asm() => _, - inlateout("r6") a3.to_asm() => _, - inlateout("r7") a4.to_asm() => _, - inlateout("r8") a5.to_asm() => _, - lateout("r9") _, - lateout("r10") _, - lateout("r11") _, - lateout("r12") _, - lateout("cr0") _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall6_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, -) -> RetReg { - let r0; - asm!( - "sc", - "bns 0f", - "neg 3, 3", - "0:", - inlateout("r0") nr.to_asm() => _, - inlateout("r3") a0.to_asm() => r0, - inlateout("r4") a1.to_asm() => _, - inlateout("r5") a2.to_asm() => _, - inlateout("r6") a3.to_asm() => _, - inlateout("r7") a4.to_asm() => _, - inlateout("r8") a5.to_asm() => _, - lateout("r9") _, - lateout("r10") _, - lateout("r11") _, - lateout("r12") _, - lateout("cr0") _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/riscv64.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/riscv64.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/riscv64.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/riscv64.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,265 +0,0 @@ -//! riscv64 Linux system calls. - -use crate::backend::reg::{ - ArgReg, FromAsm, RetReg, SyscallNumber, ToAsm, A0, A1, A2, A3, A4, A5, R0, -}; -use core::arch::asm; - -#[inline] -pub(in crate::backend) unsafe fn syscall0_readonly(nr: SyscallNumber<'_>) -> RetReg { - let r0; - asm!( - "ecall", - in("a7") nr.to_asm(), - lateout("a0") r0, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> RetReg { - let r0; - asm!( - "ecall", - in("a7") nr.to_asm(), - inlateout("a0") a0.to_asm() => r0, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, -) -> RetReg { - let r0; - asm!( - "ecall", - in("a7") nr.to_asm(), - inlateout("a0") a0.to_asm() => r0, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1_noreturn(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> ! { - asm!( - "ecall", - in("a7") nr.to_asm(), - in("a0") a0.to_asm(), - options(nostack, noreturn) - ); -} - -#[inline] -pub(in crate::backend) unsafe fn syscall2( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, -) -> RetReg { - let r0; - asm!( - "ecall", - in("a7") nr.to_asm(), - inlateout("a0") a0.to_asm() => r0, - in("a1") a1.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall2_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, -) -> RetReg { - let r0; - asm!( - "ecall", - in("a7") nr.to_asm(), - inlateout("a0") a0.to_asm() => r0, - in("a1") a1.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall3( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, -) -> RetReg { - let r0; - asm!( - "ecall", - in("a7") nr.to_asm(), - inlateout("a0") a0.to_asm() => r0, - in("a1") a1.to_asm(), - in("a2") a2.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall3_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, -) -> RetReg { - let r0; - asm!( - "ecall", - in("a7") nr.to_asm(), - inlateout("a0") a0.to_asm() => r0, - in("a1") a1.to_asm(), - in("a2") a2.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall4( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, -) -> RetReg { - let r0; - asm!( - "ecall", - in("a7") nr.to_asm(), - inlateout("a0") a0.to_asm() => r0, - in("a1") a1.to_asm(), - in("a2") a2.to_asm(), - in("a3") a3.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall4_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, -) -> RetReg { - let r0; - asm!( - "ecall", - in("a7") nr.to_asm(), - inlateout("a0") a0.to_asm() => r0, - in("a1") a1.to_asm(), - in("a2") a2.to_asm(), - in("a3") a3.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall5( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, -) -> RetReg { - let r0; - asm!( - "ecall", - in("a7") nr.to_asm(), - inlateout("a0") a0.to_asm() => r0, - in("a1") a1.to_asm(), - in("a2") a2.to_asm(), - in("a3") a3.to_asm(), - in("a4") a4.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall5_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, -) -> RetReg { - let r0; - asm!( - "ecall", - in("a7") nr.to_asm(), - inlateout("a0") a0.to_asm() => r0, - in("a1") a1.to_asm(), - in("a2") a2.to_asm(), - in("a3") a3.to_asm(), - in("a4") a4.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall6( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, -) -> RetReg { - let r0; - asm!( - "ecall", - in("a7") nr.to_asm(), - inlateout("a0") a0.to_asm() => r0, - in("a1") a1.to_asm(), - in("a2") a2.to_asm(), - in("a3") a3.to_asm(), - in("a4") a4.to_asm(), - in("a5") a5.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall6_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, -) -> RetReg { - let r0; - asm!( - "ecall", - in("a7") nr.to_asm(), - inlateout("a0") a0.to_asm() => r0, - in("a1") a1.to_asm(), - in("a2") a2.to_asm(), - in("a3") a3.to_asm(), - in("a4") a4.to_asm(), - in("a5") a5.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/thumb.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/thumb.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/thumb.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/thumb.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,322 +0,0 @@ -//! arm Linux system calls, using thumb-mode. -//! -//! In thumb-mode, r7 is the frame pointer and is not permitted to be used in -//! an inline asm operand, so we have to use a different register and copy it -//! into r7 inside the inline asm. - -use crate::backend::reg::{ - ArgReg, FromAsm, RetReg, SyscallNumber, ToAsm, A0, A1, A2, A3, A4, A5, R0, -}; -use core::arch::asm; - -#[inline] -pub(in crate::backend) unsafe fn syscall0_readonly(nr: SyscallNumber<'_>) -> RetReg { - let r0; - asm!( - "mov {tmp}, r7", - "mov r7, {nr}", - "svc 0", - "mov r7, {tmp}", - nr = in(reg) nr.to_asm(), - tmp = out(reg) _, - lateout("r0") r0, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> RetReg { - let r0; - asm!( - "mov {tmp}, r7", - "mov r7, {nr}", - "svc 0", - "mov r7, {tmp}", - nr = in(reg) nr.to_asm(), - tmp = out(reg) _, - inlateout("r0") a0.to_asm() => r0, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, -) -> RetReg { - let r0; - asm!( - "mov {tmp}, r7", - "mov r7, {nr}", - "svc 0", - "mov r7, {tmp}", - nr = in(reg) nr.to_asm(), - tmp = out(reg) _, - inlateout("r0") a0.to_asm() => r0, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1_noreturn(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> ! { - asm!( - "mov r7, {nr}", - "svc 0", - nr = in(reg) nr.to_asm(), - in("r0") a0.to_asm(), - options(nostack, noreturn) - ) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall2( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, -) -> RetReg { - let r0; - asm!( - "mov {tmp}, r7", - "mov r7, {nr}", - "svc 0", - "mov r7, {tmp}", - nr = in(reg) nr.to_asm(), - tmp = out(reg) _, - inlateout("r0") a0.to_asm() => r0, - in("r1") a1.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall2_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, -) -> RetReg { - let r0; - asm!( - "mov {tmp}, r7", - "mov r7, {nr}", - "svc 0", - "mov r7, {tmp}", - nr = in(reg) nr.to_asm(), - tmp = out(reg) _, - inlateout("r0") a0.to_asm() => r0, - in("r1") a1.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall3( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, -) -> RetReg { - let r0; - asm!( - "mov {tmp}, r7", - "mov r7, {nr}", - "svc 0", - "mov r7, {tmp}", - nr = in(reg) nr.to_asm(), - tmp = out(reg) _, - inlateout("r0") a0.to_asm() => r0, - in("r1") a1.to_asm(), - in("r2") a2.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall3_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, -) -> RetReg { - let r0; - asm!( - "mov {tmp}, r7", - "mov r7, {nr}", - "svc 0", - "mov r7, {tmp}", - nr = in(reg) nr.to_asm(), - tmp = out(reg) _, - inlateout("r0") a0.to_asm() => r0, - in("r1") a1.to_asm(), - in("r2") a2.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall4( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, -) -> RetReg { - let r0; - asm!( - "mov {tmp}, r7", - "mov r7, {nr}", - "svc 0", - "mov r7, {tmp}", - nr = in(reg) nr.to_asm(), - tmp = out(reg) _, - inlateout("r0") a0.to_asm() => r0, - in("r1") a1.to_asm(), - in("r2") a2.to_asm(), - in("r3") a3.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall4_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, -) -> RetReg { - let r0; - asm!( - "mov {tmp}, r7", - "mov r7, {nr}", - "svc 0", - "mov r7, {tmp}", - nr = in(reg) nr.to_asm(), - tmp = out(reg) _, - inlateout("r0") a0.to_asm() => r0, - in("r1") a1.to_asm(), - in("r2") a2.to_asm(), - in("r3") a3.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall5( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, -) -> RetReg { - let r0; - asm!( - "mov {tmp}, r7", - "mov r7, {nr}", - "svc 0", - "mov r7, {tmp}", - nr = in(reg) nr.to_asm(), - tmp = out(reg) _, - inlateout("r0") a0.to_asm() => r0, - in("r1") a1.to_asm(), - in("r2") a2.to_asm(), - in("r3") a3.to_asm(), - in("r4") a4.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall5_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, -) -> RetReg { - let r0; - asm!( - "mov {tmp}, r7", - "mov r7, {nr}", - "svc 0", - "mov r7, {tmp}", - nr = in(reg) nr.to_asm(), - tmp = out(reg) _, - inlateout("r0") a0.to_asm() => r0, - in("r1") a1.to_asm(), - in("r2") a2.to_asm(), - in("r3") a3.to_asm(), - in("r4") a4.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall6( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, -) -> RetReg { - let r0; - asm!( - "mov {tmp}, r7", - "mov r7, {nr}", - "svc 0", - "mov r7, {tmp}", - nr = in(reg) nr.to_asm(), - tmp = out(reg) _, - inlateout("r0") a0.to_asm() => r0, - in("r1") a1.to_asm(), - in("r2") a2.to_asm(), - in("r3") a3.to_asm(), - in("r4") a4.to_asm(), - in("r5") a5.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall6_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, -) -> RetReg { - let r0; - asm!( - "mov {tmp}, r7", - "mov r7, {nr}", - "svc 0", - "mov r7, {tmp}", - nr = in(reg) nr.to_asm(), - tmp = out(reg) _, - inlateout("r0") a0.to_asm() => r0, - in("r1") a1.to_asm(), - in("r2") a2.to_asm(), - in("r3") a3.to_asm(), - in("r4") a4.to_asm(), - in("r5") a5.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/x86_64.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/x86_64.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/x86_64.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/x86_64.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,293 +0,0 @@ -//! x86-64 Linux system calls. - -use crate::backend::reg::{ - ArgReg, FromAsm, RetReg, SyscallNumber, ToAsm, A0, A1, A2, A3, A4, A5, R0, -}; -use core::arch::asm; - -#[cfg(target_pointer_width = "32")] -compile_error!("x32 is not yet supported"); - -#[inline] -pub(in crate::backend) unsafe fn syscall0_readonly(nr: SyscallNumber<'_>) -> RetReg { - let r0; - asm!( - "syscall", - inlateout("rax") nr.to_asm() => r0, - lateout("rcx") _, - lateout("r11") _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> RetReg { - let r0; - asm!( - "syscall", - inlateout("rax") nr.to_asm() => r0, - in("rdi") a0.to_asm(), - lateout("rcx") _, - lateout("r11") _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, -) -> RetReg { - let r0; - asm!( - "syscall", - inlateout("rax") nr.to_asm() => r0, - in("rdi") a0.to_asm(), - lateout("rcx") _, - lateout("r11") _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1_noreturn(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> ! { - asm!( - "syscall", - in("rax") nr.to_asm(), - in("rdi") a0.to_asm(), - options(nostack, noreturn) - ) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall2( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, -) -> RetReg { - let r0; - asm!( - "syscall", - inlateout("rax") nr.to_asm() => r0, - in("rdi") a0.to_asm(), - in("rsi") a1.to_asm(), - lateout("rcx") _, - lateout("r11") _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall2_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, -) -> RetReg { - let r0; - asm!( - "syscall", - inlateout("rax") nr.to_asm() => r0, - in("rdi") a0.to_asm(), - in("rsi") a1.to_asm(), - lateout("rcx") _, - lateout("r11") _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall3( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, -) -> RetReg { - let r0; - asm!( - "syscall", - inlateout("rax") nr.to_asm() => r0, - in("rdi") a0.to_asm(), - in("rsi") a1.to_asm(), - in("rdx") a2.to_asm(), - lateout("rcx") _, - lateout("r11") _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall3_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, -) -> RetReg { - let r0; - asm!( - "syscall", - inlateout("rax") nr.to_asm() => r0, - in("rdi") a0.to_asm(), - in("rsi") a1.to_asm(), - in("rdx") a2.to_asm(), - lateout("rcx") _, - lateout("r11") _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall4( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, -) -> RetReg { - let r0; - asm!( - "syscall", - inlateout("rax") nr.to_asm() => r0, - in("rdi") a0.to_asm(), - in("rsi") a1.to_asm(), - in("rdx") a2.to_asm(), - in("r10") a3.to_asm(), - lateout("rcx") _, - lateout("r11") _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall4_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, -) -> RetReg { - let r0; - asm!( - "syscall", - inlateout("rax") nr.to_asm() => r0, - in("rdi") a0.to_asm(), - in("rsi") a1.to_asm(), - in("rdx") a2.to_asm(), - in("r10") a3.to_asm(), - lateout("rcx") _, - lateout("r11") _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall5( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, -) -> RetReg { - let r0; - asm!( - "syscall", - inlateout("rax") nr.to_asm() => r0, - in("rdi") a0.to_asm(), - in("rsi") a1.to_asm(), - in("rdx") a2.to_asm(), - in("r10") a3.to_asm(), - in("r8") a4.to_asm(), - lateout("rcx") _, - lateout("r11") _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall5_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, -) -> RetReg { - let r0; - asm!( - "syscall", - inlateout("rax") nr.to_asm() => r0, - in("rdi") a0.to_asm(), - in("rsi") a1.to_asm(), - in("rdx") a2.to_asm(), - in("r10") a3.to_asm(), - in("r8") a4.to_asm(), - lateout("rcx") _, - lateout("r11") _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall6( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, -) -> RetReg { - let r0; - asm!( - "syscall", - inlateout("rax") nr.to_asm() => r0, - in("rdi") a0.to_asm(), - in("rsi") a1.to_asm(), - in("rdx") a2.to_asm(), - in("r10") a3.to_asm(), - in("r8") a4.to_asm(), - in("r9") a5.to_asm(), - lateout("rcx") _, - lateout("r11") _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall6_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, -) -> RetReg { - let r0; - asm!( - "syscall", - inlateout("rax") nr.to_asm() => r0, - in("rdi") a0.to_asm(), - in("rsi") a1.to_asm(), - in("rdx") a2.to_asm(), - in("r10") a3.to_asm(), - in("r8") a4.to_asm(), - in("r9") a5.to_asm(), - lateout("rcx") _, - lateout("r11") _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/x86.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/x86.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/x86.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/arch/x86.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,489 +0,0 @@ -//! 32-bit x86 Linux system calls. -//! -//! There are two forms; `indirect_*` which take a callee, which allow calling -//! through the vDSO when possible, and plain forms, which use the `int 0x80` -//! instruction. -//! -//! Most `rustix` syscalls use the vsyscall mechanism rather than going using -//! `int 0x80` sequences, as vsyscall is much faster. -//! -//! Syscalls made with `int 0x80` preserve the flags register, while syscalls -//! made using vsyscall do not. - -#![allow(dead_code)] - -use crate::backend::reg::{ - ArgReg, FromAsm, RetReg, SyscallNumber, ToAsm, A0, A1, A2, A3, A4, A5, R0, -}; -use crate::backend::vdso_wrappers::SyscallType; -use core::arch::asm; - -#[inline] -pub(in crate::backend) unsafe fn indirect_syscall0( - callee: SyscallType, - nr: SyscallNumber<'_>, -) -> RetReg { - let r0; - asm!( - "call {callee}", - callee = in(reg) callee, - inlateout("eax") nr.to_asm() => r0, - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn indirect_syscall1( - callee: SyscallType, - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, -) -> RetReg { - let r0; - asm!( - "call {callee}", - callee = in(reg) callee, - inlateout("eax") nr.to_asm() => r0, - in("ebx") a0.to_asm(), - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn indirect_syscall1_noreturn( - callee: SyscallType, - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, -) -> ! { - asm!( - "call {callee}", - callee = in(reg) callee, - in("eax") nr.to_asm(), - in("ebx") a0.to_asm(), - options(noreturn) - ) -} - -#[inline] -pub(in crate::backend) unsafe fn indirect_syscall2( - callee: SyscallType, - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, -) -> RetReg { - let r0; - asm!( - "call {callee}", - callee = in(reg) callee, - inlateout("eax") nr.to_asm() => r0, - in("ebx") a0.to_asm(), - in("ecx") a1.to_asm(), - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn indirect_syscall3( - callee: SyscallType, - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, -) -> RetReg { - let r0; - asm!( - "call {callee}", - callee = in(reg) callee, - inlateout("eax") nr.to_asm() => r0, - in("ebx") a0.to_asm(), - in("ecx") a1.to_asm(), - in("edx") a2.to_asm(), - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn indirect_syscall4( - callee: SyscallType, - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, -) -> RetReg { - let r0; - // a3 should go in esi, but `asm!` won't let us use it as an operand. - // Temporarily swap it into place, and then swap it back afterward. - // - // We hard-code the callee operand to use edi instead of `in(reg)` because - // even though we can't name esi as an operand, the compiler can use esi to - // satisfy `in(reg)`. - asm!( - "xchg esi, {a3}", - "call edi", - "xchg esi, {a3}", - a3 = in(reg) a3.to_asm(), - in("edi") callee, - inlateout("eax") nr.to_asm() => r0, - in("ebx") a0.to_asm(), - in("ecx") a1.to_asm(), - in("edx") a2.to_asm(), - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn indirect_syscall5( - callee: SyscallType, - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, -) -> RetReg { - let r0; - // Oof. a3 should go in esi, and `asm!` won't let us use that register as - // an operand. And we can't request stack slots. And there are no other - // registers free. Use eax as a temporary pointer to a slice, since it gets - // clobbered as the return value anyway. - asm!( - "push esi", - "push DWORD PTR [eax + 0]", - "mov esi, DWORD PTR [eax + 4]", - "mov eax, DWORD PTR [eax + 8]", - "call DWORD PTR [esp]", - "pop esi", - "pop esi", - inout("eax") &[callee as _, a3.to_asm(), nr.to_asm()] => r0, - in("ebx") a0.to_asm(), - in("ecx") a1.to_asm(), - in("edx") a2.to_asm(), - in("edi") a4.to_asm(), - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn indirect_syscall6( - callee: SyscallType, - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, -) -> RetReg { - let r0; - // Oof again. a3 should go in esi, and a5 should go in ebp, and `asm!` - // won't let us use either of those registers as operands. And we can't - // request stack slots. And there are no other registers free. Use eax as a - // temporary pointer to a slice, since it gets clobbered as the return - // value anyway. - // - // This is another reason that syscalls should be compiler intrinsics - // rather than inline asm. - asm!( - "push ebp", - "push esi", - "push DWORD PTR [eax + 0]", - "mov esi, DWORD PTR [eax + 4]", - "mov ebp, DWORD PTR [eax + 8]", - "mov eax, DWORD PTR [eax + 12]", - "call DWORD PTR [esp]", - "pop esi", - "pop esi", - "pop ebp", - inout("eax") &[callee as _, a3.to_asm(), a5.to_asm(), nr.to_asm()] => r0, - in("ebx") a0.to_asm(), - in("ecx") a1.to_asm(), - in("edx") a2.to_asm(), - in("edi") a4.to_asm(), - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall0_readonly(nr: SyscallNumber<'_>) -> RetReg { - let r0; - asm!( - "int $$0x80", - inlateout("eax") nr.to_asm() => r0, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> RetReg { - let r0; - asm!( - "int $$0x80", - inlateout("eax") nr.to_asm() => r0, - in("ebx") a0.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, -) -> RetReg { - let r0; - asm!( - "int $$0x80", - inlateout("eax") nr.to_asm() => r0, - in("ebx") a0.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1_noreturn(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> ! { - asm!( - "int $$0x80", - in("eax") nr.to_asm(), - in("ebx") a0.to_asm(), - options(nostack, noreturn) - ) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall2( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, -) -> RetReg { - let r0; - asm!( - "int $$0x80", - inlateout("eax") nr.to_asm() => r0, - in("ebx") a0.to_asm(), - in("ecx") a1.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall2_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, -) -> RetReg { - let r0; - asm!( - "int $$0x80", - inlateout("eax") nr.to_asm() => r0, - in("ebx") a0.to_asm(), - in("ecx") a1.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall3( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, -) -> RetReg { - let r0; - asm!( - "int $$0x80", - inlateout("eax") nr.to_asm() => r0, - in("ebx") a0.to_asm(), - in("ecx") a1.to_asm(), - in("edx") a2.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall3_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, -) -> RetReg { - let r0; - asm!( - "int $$0x80", - inlateout("eax") nr.to_asm() => r0, - in("ebx") a0.to_asm(), - in("ecx") a1.to_asm(), - in("edx") a2.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall4( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, -) -> RetReg { - let r0; - // a3 should go in esi, but `asm!` won't let us use it as an operand. - // Temporarily swap it into place, and then swap it back afterward. - asm!( - "xchg esi, {a3}", - "int $$0x80", - "xchg esi, {a3}", - a3 = in(reg) a3.to_asm(), - inlateout("eax") nr.to_asm() => r0, - in("ebx") a0.to_asm(), - in("ecx") a1.to_asm(), - in("edx") a2.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall4_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, -) -> RetReg { - let r0; - asm!( - "xchg esi, {a3}", - "int $$0x80", - "xchg esi, {a3}", - a3 = in(reg) a3.to_asm(), - inlateout("eax") nr.to_asm() => r0, - in("ebx") a0.to_asm(), - in("ecx") a1.to_asm(), - in("edx") a2.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall5( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, -) -> RetReg { - let r0; - // As in `syscall4`, use xchg to handle a3. a4 should go in edi, and we can - // use that register as an operand. Unlike in `indirect_syscall5`, we don't - // have a `callee` operand taking up a register, so we have enough - // registers and don't need to use a slice. - asm!( - "xchg esi, {a3}", - "int $$0x80", - "xchg esi, {a3}", - a3 = in(reg) a3.to_asm(), - inlateout("eax") nr.to_asm() => r0, - in("ebx") a0.to_asm(), - in("ecx") a1.to_asm(), - in("edx") a2.to_asm(), - in("edi") a4.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall5_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, -) -> RetReg { - let r0; - // See the comments in `syscall5`. - asm!( - "xchg esi, {a3}", - "int $$0x80", - "xchg esi, {a3}", - a3 = in(reg) a3.to_asm(), - inlateout("eax") nr.to_asm() => r0, - in("ebx") a0.to_asm(), - in("ecx") a1.to_asm(), - in("edx") a2.to_asm(), - in("edi") a4.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall6( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, -) -> RetReg { - let r0; - // See the comments in `indirect_syscall6`. - asm!( - "push ebp", - "push esi", - "mov esi, DWORD PTR [eax + 0]", - "mov ebp, DWORD PTR [eax + 4]", - "mov eax, DWORD PTR [eax + 8]", - "int $$0x80", - "pop esi", - "pop ebp", - inout("eax") &[a3.to_asm(), a5.to_asm(), nr.to_asm()] => r0, - in("ebx") a0.to_asm(), - in("ecx") a1.to_asm(), - in("edx") a2.to_asm(), - in("edi") a4.to_asm(), - options(preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall6_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, -) -> RetReg { - let r0; - // See the comments in `indirect_syscall6`. - asm!( - "push ebp", - "push esi", - "mov esi, DWORD PTR [eax + 0]", - "mov ebp, DWORD PTR [eax + 4]", - "mov eax, DWORD PTR [eax + 8]", - "int $$0x80", - "pop esi", - "pop ebp", - inout("eax") &[a3.to_asm(), a5.to_asm(), nr.to_asm()] => r0, - in("ebx") a0.to_asm(), - in("ecx") a1.to_asm(), - in("edx") a2.to_asm(), - in("edi") a4.to_asm(), - options(preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/conv.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/conv.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/conv.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/conv.rs 2023-10-30 19:40:00.000000000 +0000 @@ -2,8 +2,8 @@ //! //! System call arguments and return values are all communicated with inline //! asm and FFI as `*mut Opaque`. To protect these raw pointers from escaping -//! or being accidentally misused as they travel through the code, we wrap them -//! in [`ArgReg`] and [`RetReg`] structs. This file provides `From` +//! or being accidentally misused as they travel through the code, we wrap +//! them in [`ArgReg`] and [`RetReg`] structs. This file provides `From` //! implementations and explicit conversion functions for converting values //! into and out of these wrapper structs. //! @@ -186,45 +186,45 @@ } #[inline] -pub(super) fn slice_just_addr(v: &[T]) -> ArgReg<'_, Num> { +pub(super) fn slice_just_addr(v: &[T]) -> ArgReg { let mut_ptr = v.as_ptr() as *mut T; raw_arg(mut_ptr.cast()) } #[inline] -pub(super) fn slice_just_addr_mut(v: &mut [T]) -> ArgReg<'_, Num> { +pub(super) fn slice_just_addr_mut(v: &mut [T]) -> ArgReg { raw_arg(v.as_mut_ptr().cast()) } #[inline] pub(super) fn slice( v: &[T], -) -> (ArgReg<'_, Num0>, ArgReg<'_, Num1>) { +) -> (ArgReg, ArgReg) { (slice_just_addr(v), pass_usize(v.len())) } #[inline] pub(super) fn slice_mut( v: &mut [T], -) -> (ArgReg<'_, Num0>, ArgReg<'_, Num1>) { +) -> (ArgReg, ArgReg) { (raw_arg(v.as_mut_ptr().cast()), pass_usize(v.len())) } #[inline] -pub(super) fn by_ref(t: &T) -> ArgReg<'_, Num> { +pub(super) fn by_ref(t: &T) -> ArgReg { let mut_ptr = as_ptr(t) as *mut T; raw_arg(mut_ptr.cast()) } #[inline] -pub(super) fn by_mut(t: &mut T) -> ArgReg<'_, Num> { +pub(super) fn by_mut(t: &mut T) -> ArgReg { raw_arg(as_mut_ptr(t).cast()) } /// Convert an optional mutable reference into a `usize` for passing to a /// syscall. #[inline] -pub(super) fn opt_mut(t: Option<&mut T>) -> ArgReg<'_, Num> { +pub(super) fn opt_mut(t: Option<&mut T>) -> ArgReg { // This optimizes into the equivalent of `transmute(t)`, and has the // advantage of not requiring `unsafe`. match t { @@ -237,7 +237,7 @@ /// syscall. #[cfg(any(target_arch = "aarch64", target_arch = "riscv64"))] #[inline] -pub(super) fn opt_ref(t: Option<&T>) -> ArgReg<'_, Num> { +pub(super) fn opt_ref(t: Option<&T>) -> ArgReg { // This optimizes into the equivalent of `transmute(t)`, and has the // advantage of not requiring `unsafe`. match t { @@ -300,7 +300,7 @@ feature = "fs", all( not(feature = "use-libc-auxv"), - not(feature = "use-explicitly-provided-auxv"), + not(target_vendor = "mustang"), any( feature = "param", feature = "runtime", @@ -620,15 +620,6 @@ c_uint(flags.bits()) } } - -#[cfg(feature = "mm")] -#[cfg(any(linux_kernel, freebsdlike, netbsdlike))] -impl<'a, Num: ArgNumber> From for ArgReg<'a, Num> { - #[inline] - fn from(flags: crate::backend::mm::types::MlockAllFlags) -> Self { - c_uint(flags.bits()) - } -} #[cfg(feature = "mm")] impl<'a, Num: ArgNumber> From for ArgReg<'a, Num> { diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/c.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/c.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/c.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/c.rs 2023-10-30 19:40:00.000000000 +0000 @@ -6,10 +6,9 @@ #![allow(unused_imports)] #![allow(non_camel_case_types)] -pub(crate) type size_t = usize; +pub type size_t = usize; pub(crate) use linux_raw_sys::ctypes::*; pub(crate) use linux_raw_sys::errno::EINVAL; -pub(crate) use linux_raw_sys::ioctl::{FIONBIO, FIONREAD}; // Import the kernel's `uid_t` and `gid_t` if they're 32-bit. #[cfg(not(any(target_arch = "arm", target_arch = "sparc", target_arch = "x86")))] pub(crate) use linux_raw_sys::general::{__kernel_gid_t as gid_t, __kernel_uid_t as uid_t}; @@ -26,7 +25,7 @@ feature = "fs", all( not(feature = "use-libc-auxv"), - not(feature = "use-explicitly-provided-auxv"), + not(target_vendor = "mustang"), any( feature = "param", feature = "runtime", @@ -40,8 +39,6 @@ XATTR_REPLACE, }; -pub(crate) use linux_raw_sys::ioctl::{BLKPBSZGET, BLKSSZGET, FICLONE}; - #[cfg(feature = "io_uring")] pub(crate) use linux_raw_sys::{general::open_how, io_uring::*}; @@ -51,110 +48,40 @@ general::{O_CLOEXEC as SOCK_CLOEXEC, O_NONBLOCK as SOCK_NONBLOCK}, if_ether::*, net::{ - linger, msghdr, sockaddr, sockaddr_in, sockaddr_in6, sockaddr_un, socklen_t, AF_DECnet, - __kernel_sa_family_t as sa_family_t, __kernel_sockaddr_storage as sockaddr_storage, - cmsghdr, in6_addr, in_addr, ip_mreq, ip_mreq_source, ip_mreqn, ipv6_mreq, AF_APPLETALK, - AF_ASH, AF_ATMPVC, AF_ATMSVC, AF_AX25, AF_BLUETOOTH, AF_BRIDGE, AF_CAN, AF_ECONET, - AF_IEEE802154, AF_INET, AF_INET6, AF_IPX, AF_IRDA, AF_ISDN, AF_IUCV, AF_KEY, AF_LLC, - AF_NETBEUI, AF_NETLINK, AF_NETROM, AF_PACKET, AF_PHONET, AF_PPPOX, AF_RDS, AF_ROSE, - AF_RXRPC, AF_SECURITY, AF_SNA, AF_TIPC, AF_UNIX, AF_UNSPEC, AF_WANPIPE, AF_X25, - IP6T_SO_ORIGINAL_DST, IPPROTO_FRAGMENT, IPPROTO_ICMPV6, IPPROTO_MH, IPPROTO_ROUTING, - IPV6_ADD_MEMBERSHIP, IPV6_DROP_MEMBERSHIP, IPV6_FREEBIND, IPV6_MULTICAST_HOPS, - IPV6_MULTICAST_LOOP, IPV6_RECVTCLASS, IPV6_TCLASS, IPV6_UNICAST_HOPS, IPV6_V6ONLY, - IP_ADD_MEMBERSHIP, IP_ADD_SOURCE_MEMBERSHIP, IP_DROP_MEMBERSHIP, IP_DROP_SOURCE_MEMBERSHIP, - IP_FREEBIND, IP_MULTICAST_LOOP, IP_MULTICAST_TTL, IP_RECVTOS, IP_TOS, IP_TTL, - MSG_CMSG_CLOEXEC, MSG_CONFIRM, MSG_DONTROUTE, MSG_DONTWAIT, MSG_EOR, MSG_ERRQUEUE, - MSG_MORE, MSG_NOSIGNAL, MSG_OOB, MSG_PEEK, MSG_TRUNC, MSG_WAITALL, SCM_CREDENTIALS, - SCM_RIGHTS, SHUT_RD, SHUT_RDWR, SHUT_WR, SOCK_DGRAM, SOCK_RAW, SOCK_RDM, SOCK_SEQPACKET, - SOCK_STREAM, SOL_SOCKET, SO_ACCEPTCONN, SO_BROADCAST, SO_COOKIE, SO_DOMAIN, SO_ERROR, - SO_INCOMING_CPU, SO_KEEPALIVE, SO_LINGER, SO_OOBINLINE, SO_ORIGINAL_DST, SO_PASSCRED, - SO_PROTOCOL, SO_RCVBUF, SO_RCVTIMEO_NEW, SO_RCVTIMEO_NEW as SO_RCVTIMEO, SO_RCVTIMEO_OLD, - SO_REUSEADDR, SO_REUSEPORT, SO_SNDBUF, SO_SNDTIMEO_NEW, SO_SNDTIMEO_NEW as SO_SNDTIMEO, - SO_SNDTIMEO_OLD, SO_TYPE, TCP_CONGESTION, TCP_CORK, TCP_KEEPCNT, TCP_KEEPIDLE, - TCP_KEEPINTVL, TCP_NODELAY, TCP_QUICKACK, TCP_THIN_LINEAR_TIMEOUTS, TCP_USER_TIMEOUT, + AF_DECnet, __kernel_sa_family_t as sa_family_t, + __kernel_sockaddr_storage as sockaddr_storage, cmsghdr, in6_addr, in_addr, ip_mreq, + ipv6_mreq, linger, msghdr, sockaddr, sockaddr_in, sockaddr_in6, sockaddr_un, socklen_t, + AF_APPLETALK, AF_ASH, AF_ATMPVC, AF_ATMSVC, AF_AX25, AF_BLUETOOTH, AF_BRIDGE, AF_CAN, + AF_ECONET, AF_IEEE802154, AF_INET, AF_INET6, AF_IPX, AF_IRDA, AF_ISDN, AF_IUCV, AF_KEY, + AF_LLC, AF_NETBEUI, AF_NETLINK, AF_NETROM, AF_PACKET, AF_PHONET, AF_PPPOX, AF_RDS, AF_ROSE, + AF_RXRPC, AF_SECURITY, AF_SNA, AF_TIPC, AF_UNIX, AF_UNSPEC, AF_WANPIPE, AF_X25, IPPROTO_AH, + IPPROTO_BEETPH, IPPROTO_COMP, IPPROTO_DCCP, IPPROTO_EGP, IPPROTO_ENCAP, IPPROTO_ESP, + IPPROTO_ETHERNET, IPPROTO_FRAGMENT, IPPROTO_GRE, IPPROTO_ICMP, IPPROTO_ICMPV6, IPPROTO_IDP, + IPPROTO_IGMP, IPPROTO_IP, IPPROTO_IPIP, IPPROTO_IPV6, IPPROTO_MH, IPPROTO_MPLS, + IPPROTO_MPTCP, IPPROTO_MTP, IPPROTO_PIM, IPPROTO_PUP, IPPROTO_RAW, IPPROTO_ROUTING, + IPPROTO_RSVP, IPPROTO_SCTP, IPPROTO_TCP, IPPROTO_TP, IPPROTO_UDP, IPPROTO_UDPLITE, + IPV6_ADD_MEMBERSHIP, IPV6_DROP_MEMBERSHIP, IPV6_MULTICAST_HOPS, IPV6_MULTICAST_LOOP, + IPV6_UNICAST_HOPS, IPV6_V6ONLY, IP_ADD_MEMBERSHIP, IP_DROP_MEMBERSHIP, IP_MULTICAST_LOOP, + IP_MULTICAST_TTL, IP_TTL, MSG_CMSG_CLOEXEC, MSG_CONFIRM, MSG_DONTROUTE, MSG_DONTWAIT, + MSG_EOR, MSG_ERRQUEUE, MSG_MORE, MSG_NOSIGNAL, MSG_OOB, MSG_PEEK, MSG_TRUNC, MSG_WAITALL, + SCM_CREDENTIALS, SCM_RIGHTS, SHUT_RD, SHUT_RDWR, SHUT_WR, SOCK_DGRAM, SOCK_RAW, SOCK_RDM, + SOCK_SEQPACKET, SOCK_STREAM, SOL_SOCKET, SO_BROADCAST, SO_DOMAIN, SO_ERROR, SO_KEEPALIVE, + SO_LINGER, SO_PASSCRED, SO_RCVBUF, SO_RCVTIMEO_NEW, SO_RCVTIMEO_NEW as SO_RCVTIMEO, + SO_RCVTIMEO_OLD, SO_REUSEADDR, SO_SNDBUF, SO_SNDTIMEO_NEW, SO_SNDTIMEO_NEW as SO_SNDTIMEO, + SO_SNDTIMEO_OLD, SO_TYPE, TCP_NODELAY, }, netlink::*, }; -// Cast away bindgen's `enum` type to make these consistent with the other -// `setsockopt`/`getsockopt` level values. -#[cfg(feature = "net")] -pub(crate) const IPPROTO_IP: u32 = linux_raw_sys::net::IPPROTO_IP as _; -#[cfg(feature = "net")] -pub(crate) const IPPROTO_ICMP: u32 = linux_raw_sys::net::IPPROTO_ICMP as _; -#[cfg(feature = "net")] -pub(crate) const IPPROTO_IGMP: u32 = linux_raw_sys::net::IPPROTO_IGMP as _; -#[cfg(feature = "net")] -pub(crate) const IPPROTO_IPIP: u32 = linux_raw_sys::net::IPPROTO_IPIP as _; -#[cfg(feature = "net")] -pub(crate) const IPPROTO_TCP: u32 = linux_raw_sys::net::IPPROTO_TCP as _; -#[cfg(feature = "net")] -pub(crate) const IPPROTO_EGP: u32 = linux_raw_sys::net::IPPROTO_EGP as _; -#[cfg(feature = "net")] -pub(crate) const IPPROTO_PUP: u32 = linux_raw_sys::net::IPPROTO_PUP as _; -#[cfg(feature = "net")] -pub(crate) const IPPROTO_UDP: u32 = linux_raw_sys::net::IPPROTO_UDP as _; -#[cfg(feature = "net")] -pub(crate) const IPPROTO_IDP: u32 = linux_raw_sys::net::IPPROTO_IDP as _; -#[cfg(feature = "net")] -pub(crate) const IPPROTO_TP: u32 = linux_raw_sys::net::IPPROTO_TP as _; -#[cfg(feature = "net")] -pub(crate) const IPPROTO_DCCP: u32 = linux_raw_sys::net::IPPROTO_DCCP as _; -#[cfg(feature = "net")] -pub(crate) const IPPROTO_IPV6: u32 = linux_raw_sys::net::IPPROTO_IPV6 as _; -#[cfg(feature = "net")] -pub(crate) const IPPROTO_RSVP: u32 = linux_raw_sys::net::IPPROTO_RSVP as _; -#[cfg(feature = "net")] -pub(crate) const IPPROTO_GRE: u32 = linux_raw_sys::net::IPPROTO_GRE as _; -#[cfg(feature = "net")] -pub(crate) const IPPROTO_ESP: u32 = linux_raw_sys::net::IPPROTO_ESP as _; -#[cfg(feature = "net")] -pub(crate) const IPPROTO_AH: u32 = linux_raw_sys::net::IPPROTO_AH as _; -#[cfg(feature = "net")] -pub(crate) const IPPROTO_MTP: u32 = linux_raw_sys::net::IPPROTO_MTP as _; -#[cfg(feature = "net")] -pub(crate) const IPPROTO_BEETPH: u32 = linux_raw_sys::net::IPPROTO_BEETPH as _; -#[cfg(feature = "net")] -pub(crate) const IPPROTO_ENCAP: u32 = linux_raw_sys::net::IPPROTO_ENCAP as _; -#[cfg(feature = "net")] -pub(crate) const IPPROTO_PIM: u32 = linux_raw_sys::net::IPPROTO_PIM as _; -#[cfg(feature = "net")] -pub(crate) const IPPROTO_COMP: u32 = linux_raw_sys::net::IPPROTO_COMP as _; -#[cfg(feature = "net")] -pub(crate) const IPPROTO_SCTP: u32 = linux_raw_sys::net::IPPROTO_SCTP as _; -#[cfg(feature = "net")] -pub(crate) const IPPROTO_UDPLITE: u32 = linux_raw_sys::net::IPPROTO_UDPLITE as _; -#[cfg(feature = "net")] -pub(crate) const IPPROTO_MPLS: u32 = linux_raw_sys::net::IPPROTO_MPLS as _; -#[cfg(feature = "net")] -pub(crate) const IPPROTO_ETHERNET: u32 = linux_raw_sys::net::IPPROTO_ETHERNET as _; -#[cfg(feature = "net")] -pub(crate) const IPPROTO_RAW: u32 = linux_raw_sys::net::IPPROTO_RAW as _; -#[cfg(feature = "net")] -pub(crate) const IPPROTO_MPTCP: u32 = linux_raw_sys::net::IPPROTO_MPTCP as _; - #[cfg(any(feature = "process", feature = "runtime"))] pub(crate) use linux_raw_sys::general::siginfo_t; -#[cfg(any(feature = "process", feature = "runtime"))] -pub(crate) const EXIT_SUCCESS: c_int = 0; -#[cfg(any(feature = "process", feature = "runtime"))] -pub(crate) const EXIT_FAILURE: c_int = 1; -#[cfg(feature = "process")] -pub(crate) const EXIT_SIGNALED_SIGABRT: c_int = 128 + linux_raw_sys::general::SIGABRT as c_int; - #[cfg(feature = "process")] -pub(crate) use linux_raw_sys::{ - general::{ - CLD_CONTINUED, CLD_DUMPED, CLD_EXITED, CLD_KILLED, CLD_STOPPED, CLD_TRAPPED, - O_NONBLOCK as PIDFD_NONBLOCK, P_ALL, P_PGID, P_PID, P_PIDFD, - }, - ioctl::TIOCSCTTY, +pub(crate) use linux_raw_sys::general::{ + CLD_CONTINUED, CLD_DUMPED, CLD_EXITED, CLD_KILLED, CLD_STOPPED, CLD_TRAPPED, + O_NONBLOCK as PIDFD_NONBLOCK, P_ALL, P_PID, P_PIDFD, }; -#[cfg(feature = "pty")] -pub(crate) use linux_raw_sys::ioctl::TIOCGPTPEER; - #[cfg(feature = "termios")] pub(crate) use linux_raw_sys::{ general::{ @@ -172,7 +99,7 @@ VKILL, VLNEXT, VMIN, VQUIT, VREPRINT, VSTART, VSTOP, VSUSP, VSWTC, VT0, VT1, VTDLY, VTIME, VWERASE, XCASE, XTABS, }, - ioctl::{TCGETS2, TCSETS2, TCSETSF2, TCSETSW2, TIOCEXCL, TIOCNXCL}, + ioctl::{TCGETS2, TCSETS2, TCSETSF2, TCSETSW2}, }; // On MIPS, `TCSANOW` et al have `TCSETS` added to them, so we need it to @@ -266,28 +193,3 @@ linux_raw_sys::general::CLOCK_THREAD_CPUTIME_ID as _; pub(crate) const CLOCK_PROCESS_CPUTIME_ID: c_int = linux_raw_sys::general::CLOCK_PROCESS_CPUTIME_ID as _; - -#[cfg(feature = "system")] -mod reboot_symbols { - use super::c_int; - - pub(crate) const LINUX_REBOOT_MAGIC1: c_int = linux_raw_sys::general::LINUX_REBOOT_MAGIC1 as _; - pub(crate) const LINUX_REBOOT_MAGIC2: c_int = linux_raw_sys::general::LINUX_REBOOT_MAGIC2 as _; - - pub(crate) const LINUX_REBOOT_CMD_RESTART: c_int = - linux_raw_sys::general::LINUX_REBOOT_CMD_RESTART as _; - pub(crate) const LINUX_REBOOT_CMD_HALT: c_int = - linux_raw_sys::general::LINUX_REBOOT_CMD_HALT as _; - pub(crate) const LINUX_REBOOT_CMD_CAD_ON: c_int = - linux_raw_sys::general::LINUX_REBOOT_CMD_CAD_ON as _; - pub(crate) const LINUX_REBOOT_CMD_CAD_OFF: c_int = - linux_raw_sys::general::LINUX_REBOOT_CMD_CAD_OFF as _; - pub(crate) const LINUX_REBOOT_CMD_POWER_OFF: c_int = - linux_raw_sys::general::LINUX_REBOOT_CMD_POWER_OFF as _; - pub(crate) const LINUX_REBOOT_CMD_SW_SUSPEND: c_int = - linux_raw_sys::general::LINUX_REBOOT_CMD_SW_SUSPEND as _; - pub(crate) const LINUX_REBOOT_CMD_KEXEC: c_int = - linux_raw_sys::general::LINUX_REBOOT_CMD_KEXEC as _; -} -#[cfg(feature = "system")] -pub(crate) use reboot_symbols::*; diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/elf.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/elf.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/elf.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/elf.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,181 @@ +//! The ELF ABI. 🧠+ +#![allow(non_snake_case)] +#![cfg_attr( + all(not(target_vendor = "mustang"), feature = "use-libc-auxv"), + allow(dead_code) +)] + +pub(super) const SELFMAG: usize = 4; +pub(super) const ELFMAG: [u8; SELFMAG] = [0x7f, b'E', b'L', b'F']; +pub(super) const EI_CLASS: usize = 4; +pub(super) const EI_DATA: usize = 5; +pub(super) const EI_VERSION: usize = 6; +pub(super) const EI_OSABI: usize = 7; +pub(super) const EI_ABIVERSION: usize = 8; +pub(super) const EV_CURRENT: u8 = 1; +#[cfg(target_pointer_width = "32")] +pub(super) const ELFCLASS: u8 = 1; // ELFCLASS32 +#[cfg(target_pointer_width = "64")] +pub(super) const ELFCLASS: u8 = 2; // ELFCLASS64 +#[cfg(target_endian = "little")] +pub(super) const ELFDATA: u8 = 1; // ELFDATA2LSB +#[cfg(target_endian = "big")] +pub(super) const ELFDATA: u8 = 2; // ELFDATA2MSB +pub(super) const ELFOSABI_SYSV: u8 = 0; +pub(super) const ELFOSABI_LINUX: u8 = 3; +// At present all of our supported platforms use 0. +pub(super) const ELFABIVERSION: u8 = 0; +pub(super) const ET_DYN: u16 = 3; +pub(super) const EI_NIDENT: usize = 16; +pub(super) const SHN_UNDEF: u16 = 0; +pub(super) const SHN_ABS: u16 = 0xfff1; +pub(super) const PN_XNUM: u16 = 0xffff; +pub(super) const PT_LOAD: u32 = 1; +pub(super) const PT_DYNAMIC: u32 = 2; +pub(super) const PT_INTERP: u32 = 3; +pub(super) const PT_PHDR: u32 = 6; +pub(super) const PT_TLS: u32 = 7; +pub(super) const PT_GNU_STACK: u32 = 0x6474_e551; +pub(super) const PT_GNU_RELRO: u32 = 0x6474_e552; +pub(super) const PF_X: u32 = 1; +pub(super) const PF_W: u32 = 2; +pub(super) const PF_R: u32 = 4; +pub(super) const DT_NULL: i32 = 0; +pub(super) const DT_HASH: i32 = 4; +pub(super) const DT_STRTAB: i32 = 5; +pub(super) const DT_SYMTAB: i32 = 6; +pub(super) const DT_SYMENT: i32 = 11; +pub(super) const DT_VERSYM: i32 = 0x6fff_fff0; +pub(super) const DT_VERDEF: i32 = 0x6fff_fffc; +pub(super) const STB_WEAK: u8 = 2; +pub(super) const STB_GLOBAL: u8 = 1; +pub(super) const STT_NOTYPE: u8 = 0; +pub(super) const STT_FUNC: u8 = 2; +pub(super) const STN_UNDEF: u32 = 0; +pub(super) const VER_FLG_BASE: u16 = 0x1; +pub(super) const VER_DEF_CURRENT: u16 = 1; +pub(super) const STV_DEFAULT: u8 = 0; +#[cfg(target_arch = "arm")] +pub(super) const EM_CURRENT: u16 = 40; // EM_ARM +#[cfg(target_arch = "x86")] +pub(super) const EM_CURRENT: u16 = 3; // EM_386 +#[cfg(target_arch = "powerpc64")] +pub(super) const EM_CURRENT: u16 = 21; // EM_PPC64 +#[cfg(any( + target_arch = "mips", + target_arch = "mips32r6", + target_arch = "mips64", + target_arch = "mips64r6" +))] +pub(super) const EM_CURRENT: u16 = 8; // EM_MIPS +#[cfg(target_arch = "x86_64")] +pub(super) const EM_CURRENT: u16 = 62; // EM_X86_64 +#[cfg(target_arch = "aarch64")] +pub(super) const EM_CURRENT: u16 = 183; // EM_AARCH64 +#[cfg(target_arch = "riscv64")] +pub(super) const EM_CURRENT: u16 = 243; // EM_RISCV + +#[inline] +pub(super) const fn ELF_ST_VISIBILITY(o: u8) -> u8 { + o & 0x03 +} + +#[inline] +pub(super) const fn ELF_ST_BIND(val: u8) -> u8 { + val >> 4 +} + +#[inline] +pub(super) const fn ELF_ST_TYPE(val: u8) -> u8 { + val & 0xf +} + +#[repr(C)] +pub(super) struct Elf_Ehdr { + pub(super) e_ident: [u8; EI_NIDENT], + pub(super) e_type: u16, + pub(super) e_machine: u16, + pub(super) e_version: u32, + pub(super) e_entry: usize, + pub(super) e_phoff: usize, + pub(super) e_shoff: usize, + pub(super) e_flags: u32, + pub(super) e_ehsize: u16, + pub(super) e_phentsize: u16, + pub(super) e_phnum: u16, + pub(super) e_shentsize: u16, + pub(super) e_shnum: u16, + pub(super) e_shstrndx: u16, +} + +#[cfg(target_pointer_width = "32")] +#[repr(C)] +pub(super) struct Elf_Phdr { + pub(super) p_type: u32, + pub(super) p_offset: usize, + pub(super) p_vaddr: usize, + pub(super) p_paddr: usize, + pub(super) p_filesz: usize, + pub(super) p_memsz: usize, + pub(super) p_flags: u32, + pub(super) p_align: usize, +} + +#[cfg(target_pointer_width = "64")] +#[repr(C)] +pub(super) struct Elf_Phdr { + pub(super) p_type: u32, + pub(super) p_flags: u32, + pub(super) p_offset: usize, + pub(super) p_vaddr: usize, + pub(super) p_paddr: usize, + pub(super) p_filesz: usize, + pub(super) p_memsz: usize, + pub(super) p_align: usize, +} + +#[cfg(target_pointer_width = "32")] +#[repr(C)] +pub(super) struct Elf_Sym { + pub(super) st_name: u32, + pub(super) st_value: usize, + pub(super) st_size: usize, + pub(super) st_info: u8, + pub(super) st_other: u8, + pub(super) st_shndx: u16, +} + +#[cfg(target_pointer_width = "64")] +#[repr(C)] +pub(super) struct Elf_Sym { + pub(super) st_name: u32, + pub(super) st_info: u8, + pub(super) st_other: u8, + pub(super) st_shndx: u16, + pub(super) st_value: usize, + pub(super) st_size: usize, +} + +#[repr(C)] +pub(super) struct Elf_Dyn { + pub(super) d_tag: i32, + pub(super) d_val: usize, +} + +#[repr(C)] +pub(super) struct Elf_Verdef { + pub(super) vd_version: u16, + pub(super) vd_flags: u16, + pub(super) vd_ndx: u16, + pub(super) vd_cnt: u16, + pub(super) vd_hash: u32, + pub(super) vd_aux: u32, + pub(super) vd_next: u32, +} + +#[repr(C)] +pub(super) struct Elf_Verdaux { + pub(super) vda_name: u32, + pub(super) _vda_next: u32, +} diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/event/epoll.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/event/epoll.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/event/epoll.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/event/epoll.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,4 +1,8 @@ -//! Linx `epoll` support. +//! epoll support. +//! +//! This is an experiment, and it isn't yet clear whether epoll is the right +//! level of abstraction at which to introduce safety. But it works fairly well +//! in simple examples 🙂. //! //! # Examples //! @@ -75,7 +79,6 @@ use crate::backend::event::syscalls; use crate::fd::{AsFd, AsRawFd, OwnedFd}; use crate::io; -#[cfg(feature = "alloc")] use alloc::vec::Vec; use bitflags::bitflags; use core::ffi::c_void; @@ -89,9 +92,6 @@ pub struct CreateFlags: c::c_uint { /// `EPOLL_CLOEXEC` const CLOEXEC = linux_raw_sys::general::EPOLL_CLOEXEC; - - /// - const _ = !0; } } @@ -144,9 +144,6 @@ /// `EPOLLEXCLUSIVE` const EXCLUSIVE = linux_raw_sys::general::EPOLLEXCLUSIVE as u32; - - /// - const _ = !0; } } @@ -239,8 +236,6 @@ /// /// For each event of interest, an element is written to `events`. On /// success, this returns the number of written elements. -#[cfg(feature = "alloc")] -#[cfg_attr(doc_cfg, doc(cfg(feature = "alloc")))] #[inline] pub fn wait(epoll: impl AsFd, event_list: &mut EventVec, timeout: c::c_int) -> io::Result<()> { // SAFETY: We're calling `epoll_wait` via FFI and we know how it @@ -287,8 +282,8 @@ pub data: EventData, } -/// Data associated with an [`Event`]. This can either be a 64-bit integer -/// value or a pointer which preserves pointer provenance. +/// Data assocated with an [`Event`]. This can either be a 64-bit integer value +/// or a pointer which preserves pointer provenance. #[repr(C)] #[derive(Copy, Clone)] pub union EventData { @@ -370,12 +365,10 @@ } /// A vector of `Event`s, plus context for interpreting them. -#[cfg(feature = "alloc")] pub struct EventVec { events: Vec, } -#[cfg(feature = "alloc")] impl EventVec { /// Constructs an `EventVec` from raw pointer, length, and capacity. /// @@ -450,7 +443,6 @@ } } -#[cfg(feature = "alloc")] impl<'a> IntoIterator for &'a EventVec { type IntoIter = Iter<'a>; type Item = Event; diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/event/poll_fd.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/event/poll_fd.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/event/poll_fd.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/event/poll_fd.rs 2023-10-30 19:40:00.000000000 +0000 @@ -30,9 +30,6 @@ const NVAL = linux_raw_sys::general::POLLNVAL as u16; /// `POLLRDHUP` const RDHUP = linux_raw_sys::general::POLLRDHUP as u16; - - /// - const _ = !0; } } diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/event/syscalls.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/event/syscalls.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/event/syscalls.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/event/syscalls.rs 2023-10-30 19:40:00.000000000 +0000 @@ -3,13 +3,12 @@ //! # Safety //! //! See the `rustix::backend` module documentation for details. -#![allow(unsafe_code, clippy::undocumented_unsafe_blocks)] +#![allow(unsafe_code)] +#![allow(clippy::undocumented_unsafe_blocks)] use crate::backend::c; -#[cfg(feature = "alloc")] -use crate::backend::conv::pass_usize; use crate::backend::conv::{ - by_ref, c_int, c_uint, raw_fd, ret, ret_owned_fd, ret_usize, slice_mut, zero, + by_ref, c_int, c_uint, pass_usize, raw_fd, ret, ret_owned_fd, ret_usize, slice_mut, zero, }; use crate::event::{epoll, EventfdFlags, PollFd}; use crate::fd::{BorrowedFd, OwnedFd}; @@ -96,7 +95,6 @@ )) } -#[cfg(feature = "alloc")] #[inline] pub(crate) fn epoll_wait( epfd: BorrowedFd<'_>, diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/event/types.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/event/types.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/event/types.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/event/types.rs 2023-10-30 19:40:00.000000000 +0000 @@ -14,8 +14,5 @@ const NONBLOCK = linux_raw_sys::general::EFD_NONBLOCK; /// `EFD_SEMAPHORE` const SEMAPHORE = linux_raw_sys::general::EFD_SEMAPHORE; - - /// - const _ = !0; } } diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/fs/dir.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/fs/dir.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/fs/dir.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/fs/dir.rs 2023-10-30 19:40:00.000000000 +0000 @@ -18,17 +18,9 @@ /// The `OwnedFd` that we read directory entries from. fd: OwnedFd, - /// Have we seen any errors in this iteration? - any_errors: bool, - - /// Should we rewind the stream on the next iteration? - rewind: bool, - - /// The buffer for `linux_dirent64` entries. buf: Vec, - - /// Where we are in the buffer. pos: usize, + next: Option, } impl Dir { @@ -46,39 +38,25 @@ Ok(Self { fd: fd_for_dir, - any_errors: false, - rewind: false, buf: Vec::new(), pos: 0, + next: None, }) } /// `rewinddir(self)` #[inline] pub fn rewind(&mut self) { - self.any_errors = false; - self.rewind = true; self.pos = self.buf.len(); + self.next = Some(0); } /// `readdir(self)`, where `None` means the end of the directory. pub fn read(&mut self) -> Option> { - // If we've seen errors, don't continue to try to read anyting further. - if self.any_errors { - return None; - } - - // If a rewind was requested, seek to the beginning. - if self.rewind { - self.rewind = false; - match io::retry_on_intr(|| { - crate::backend::fs::syscalls::_seek(self.fd.as_fd(), 0, SEEK_SET) - }) { + if let Some(next) = self.next.take() { + match crate::backend::fs::syscalls::_seek(self.fd.as_fd(), next as i64, SEEK_SET) { Ok(_) => (), - Err(err) => { - self.any_errors = true; - return Some(Err(err)); - } + Err(err) => return Some(Err(err)), } } @@ -100,7 +78,7 @@ if self.buf.len() - self.pos < size_of::() { match self.read_more()? { Ok(()) => (), - Err(err) => return Some(Err(err)), + Err(e) => return Some(Err(e)), } } @@ -158,31 +136,14 @@ } fn read_more(&mut self) -> Option> { - // The first few times we're called, we allocate a relatively small - // buffer, because many directories are small. If we're called more, - // use progressively larger allocations, up to a fixed maximum. - // - // The specific sizes and policy here have not been tuned in detail yet - // and may need to be adjusted. In doing so, we should be careful to - // avoid unbounded buffer growth. This buffer only exists to share the - // cost of a `getdents` call over many entries, so if it gets too big, - // cache and heap usage will outweigh the benefit. And ultimately, - // directories can contain more entries than we can allocate contiguous - // memory for, so we'll always need to cap the size at some point. - if self.buf.len() < 1024 * size_of::() { - self.buf.reserve(32 * size_of::()); - } - self.buf.resize(self.buf.capacity(), 0); - let nread = match io::retry_on_intr(|| { - crate::backend::fs::syscalls::getdents(self.fd.as_fd(), &mut self.buf) - }) { + let og_len = self.buf.len(); + // Capacity increment currently chosen by wild guess. + self.buf + .resize(self.buf.capacity() + 32 * size_of::(), 0); + let nread = match crate::backend::fs::syscalls::getdents(self.fd.as_fd(), &mut self.buf) { Ok(nread) => nread, - Err(io::Errno::NOENT) => { - self.any_errors = true; - return None; - } Err(err) => { - self.any_errors = true; + self.buf.resize(og_len, 0); return Some(Err(err)); } }; @@ -264,33 +225,3 @@ self.d_ino } } - -#[test] -fn dir_iterator_handles_io_errors() { - // create a dir, keep the FD, then delete the dir - let tmp = tempfile::tempdir().unwrap(); - let fd = crate::fs::openat( - crate::fs::CWD, - tmp.path(), - crate::fs::OFlags::RDONLY | crate::fs::OFlags::CLOEXEC, - crate::fs::Mode::empty(), - ) - .unwrap(); - - let file_fd = crate::fs::openat( - &fd, - tmp.path().join("test.txt"), - crate::fs::OFlags::WRONLY | crate::fs::OFlags::CREATE, - crate::fs::Mode::RWXU, - ) - .unwrap(); - - let mut dir = Dir::read_from(&fd).unwrap(); - - // Reach inside the `Dir` and replace its directory with a file, which - // will cause the subsequent `getdents64` to fail. - crate::io::dup2(&file_fd, &mut dir.fd).unwrap(); - - assert!(matches!(dir.next(), Some(Err(_)))); - assert!(matches!(dir.next(), None)); -} diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/fs/inotify.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/fs/inotify.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/fs/inotify.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/fs/inotify.rs 2023-10-30 19:40:00.000000000 +0000 @@ -17,9 +17,6 @@ const CLOEXEC = linux_raw_sys::general::IN_CLOEXEC; /// `IN_NONBLOCK` const NONBLOCK = linux_raw_sys::general::IN_NONBLOCK; - - /// - const _ = !0; } } @@ -38,7 +35,7 @@ const CLOSE_NOWRITE = linux_raw_sys::general::IN_CLOSE_NOWRITE; /// `IN_CLOSE_WRITE` const CLOSE_WRITE = linux_raw_sys::general::IN_CLOSE_WRITE; - /// `IN_CREATE` + /// `IN_CREATE ` const CREATE = linux_raw_sys::general::IN_CREATE; /// `IN_DELETE` const DELETE = linux_raw_sys::general::IN_DELETE; @@ -74,9 +71,6 @@ const ONESHOT = linux_raw_sys::general::IN_ONESHOT; /// `IN_ONLYDIR` const ONLYDIR = linux_raw_sys::general::IN_ONLYDIR; - - /// - const _ = !0; } } @@ -92,19 +86,21 @@ /// `inotify_add_watch(self, path, flags)`—Adds a watch to inotify. /// -/// This registers or updates a watch for the filesystem path `path` and -/// returns a watch descriptor corresponding to this watch. +/// This registers or updates a watch for the filesystem path `path` +/// and returns a watch descriptor corresponding to this watch. /// -/// Note: Due to the existence of hardlinks, providing two different paths to -/// this method may result in it returning the same watch descriptor. An -/// application should keep track of this externally to avoid logic errors. +/// Note: Due to the existence of hardlinks, providing two +/// different paths to this method may result in it returning +/// the same watch descriptor. An application should keep track of this +/// externally to avoid logic errors. #[inline] pub fn inotify_add_watch( inot: BorrowedFd<'_>, path: P, flags: WatchFlags, ) -> io::Result { - path.into_with_c_str(|path| syscalls::inotify_add_watch(inot, path, flags)) + let path = path.as_cow_c_str().unwrap(); + syscalls::inotify_add_watch(inot, &path, flags) } /// `inotify_rm_watch(self, wd)`—Removes a watch from this inotify diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/fs/mod.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/fs/mod.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/fs/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/fs/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,13 +1,5 @@ -#[cfg(feature = "alloc")] pub(crate) mod dir; pub mod inotify; pub(crate) mod makedev; pub(crate) mod syscalls; pub(crate) mod types; - -// TODO: Fix linux-raw-sys to define ioctl codes for sparc. -#[cfg(all(linux_kernel, any(target_arch = "sparc", target_arch = "sparc64")))] -pub(crate) const EXT4_IOC_RESIZE_FS: u32 = 0x8008_6610; - -#[cfg(all(linux_kernel, not(any(target_arch = "sparc", target_arch = "sparc64"))))] -pub(crate) use linux_raw_sys::ioctl::EXT4_IOC_RESIZE_FS; diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/fs/syscalls.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/fs/syscalls.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/fs/syscalls.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/fs/syscalls.rs 2023-10-30 19:40:00.000000000 +0000 @@ -40,6 +40,7 @@ F_ADD_SEALS, F_GETFL, F_GET_SEALS, F_SETFL, SEEK_CUR, SEEK_DATA, SEEK_END, SEEK_HOLE, SEEK_SET, STATX__RESERVED, }; +use linux_raw_sys::ioctl::{BLKPBSZGET, BLKSSZGET, EXT4_IOC_RESIZE_FS, FICLONE}; #[cfg(target_pointer_width = "32")] use { crate::backend::conv::{hi, lo, slice_just_addr}, @@ -159,30 +160,6 @@ } #[inline] -pub(crate) fn chown(path: &CStr, owner: Option, group: Option) -> io::Result<()> { - // Most architectures have a `chown` syscall. - #[cfg(not(any(target_arch = "aarch64", target_arch = "riscv64")))] - unsafe { - let (ow, gr) = crate::ugid::translate_fchown_args(owner, group); - ret(syscall_readonly!(__NR_chown, path, c_uint(ow), c_uint(gr))) - } - - // Aarch64 and RISC-V don't, so use `fchownat`. - #[cfg(any(target_arch = "aarch64", target_arch = "riscv64"))] - unsafe { - let (ow, gr) = crate::ugid::translate_fchown_args(owner, group); - ret(syscall_readonly!( - __NR_fchownat, - raw_fd(AT_FDCWD), - path, - c_uint(ow), - c_uint(gr), - zero() - )) - } -} - -#[inline] pub(crate) fn fchown(fd: BorrowedFd<'_>, owner: Option, group: Option) -> io::Result<()> { unsafe { let (ow, gr) = crate::ugid::translate_fchown_args(owner, group); @@ -378,7 +355,6 @@ lo(len) )) } - // On mips, the arguments are not reordered, and padding is inserted // instead to ensure alignment. #[cfg(any(target_arch = "mips", target_arch = "mips32r6"))] @@ -394,9 +370,6 @@ advice )) } - - // For all other 32-bit architectures, use `fadvise64_64` so that we get a - // 64-bit length. #[cfg(all( target_pointer_width = "32", not(any( @@ -417,8 +390,6 @@ advice )) } - - // On 64-bit architectures, use `fadvise64` which is sufficient. #[cfg(target_pointer_width = "64")] unsafe { ret(syscall_readonly!( @@ -942,7 +913,6 @@ } } -#[cfg(feature = "alloc")] #[inline] pub(crate) fn readlink(path: &CStr, buf: &mut [u8]) -> io::Result { let (buf_addr_mut, buf_len) = slice_mut(buf); @@ -957,7 +927,6 @@ } } -#[cfg(any(feature = "alloc", all(linux_kernel, feature = "procfs")))] #[inline] pub(crate) fn readlinkat( dirfd: BorrowedFd<'_>, @@ -1263,7 +1232,6 @@ unsafe { ret(syscall_readonly!(__NR_mkdirat, dirfd, path, mode)) } } -#[cfg(feature = "alloc")] #[inline] pub(crate) fn getdents(fd: BorrowedFd<'_>, dirent: &mut [u8]) -> io::Result { let (dirent_addr_mut, dirent_len) = slice_mut(dirent); @@ -1652,6 +1620,41 @@ unsafe { ret(syscall_readonly!(__NR_fremovexattr, fd, name)) } } +#[inline] +pub(crate) fn ioctl_blksszget(fd: BorrowedFd) -> io::Result { + let mut result = MaybeUninit::::uninit(); + unsafe { + ret(syscall!(__NR_ioctl, fd, c_uint(BLKSSZGET), &mut result))?; + Ok(result.assume_init() as u32) + } +} + +#[inline] +pub(crate) fn ioctl_blkpbszget(fd: BorrowedFd) -> io::Result { + let mut result = MaybeUninit::::uninit(); + unsafe { + ret(syscall!(__NR_ioctl, fd, c_uint(BLKPBSZGET), &mut result))?; + Ok(result.assume_init() as u32) + } +} + +#[inline] +pub(crate) fn ioctl_ficlone(fd: BorrowedFd<'_>, src_fd: BorrowedFd<'_>) -> io::Result<()> { + unsafe { ret(syscall_readonly!(__NR_ioctl, fd, c_uint(FICLONE), src_fd)) } +} + +#[inline] +pub(crate) fn ext4_ioc_resize_fs(fd: BorrowedFd<'_>, blocks: u64) -> io::Result<()> { + unsafe { + ret(syscall_readonly!( + __NR_ioctl, + fd, + c_uint(EXT4_IOC_RESIZE_FS), + by_ref(&blocks) + )) + } +} + #[test] fn test_sizes() { assert_eq_size!(linux_raw_sys::general::__kernel_loff_t, u64); diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/fs/types.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/fs/types.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/fs/types.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/fs/types.rs 2023-10-30 19:40:00.000000000 +0000 @@ -19,9 +19,6 @@ /// `F_OK` const EXISTS = linux_raw_sys::general::F_OK; - - /// - const _ = !0; } } @@ -60,9 +57,6 @@ /// `AT_STATX_DONT_SYNC` const STATX_DONT_SYNC = linux_raw_sys::general::AT_STATX_DONT_SYNC; - - /// - const _ = !0; } } @@ -119,9 +113,6 @@ /// `S_ISVTX` const SVTX = linux_raw_sys::general::S_ISVTX; - - /// - const _ = !0; } } @@ -179,9 +170,9 @@ /// Similar to `ACCMODE`, but just includes the read/write flags, and /// no other flags. /// - /// On some platforms, `PATH` may be included in `ACCMODE`, when + /// Some implementations include `O_PATH` in `O_ACCMODE`, when /// sometimes we really just want the read/write bits. Caution is - /// indicated, as the presence of `PATH` may mean that the read/write + /// indicated, as the presence of `O_PATH` may mean that the read/write /// bits don't have their usual meaning. const RWMODE = linux_raw_sys::general::O_RDONLY | linux_raw_sys::general::O_WRONLY | @@ -249,9 +240,6 @@ /// `O_DIRECT` const DIRECT = linux_raw_sys::general::O_DIRECT; - - /// - const _ = !0; } } @@ -279,9 +267,6 @@ /// `RESOLVE_CACHED` (since Linux 5.12) const CACHED = linux_raw_sys::general::RESOLVE_CACHED as u64; - - /// - const _ = !0; } } @@ -300,9 +285,6 @@ /// `RENAME_WHITEOUT` const WHITEOUT = linux_raw_sys::general::RENAME_WHITEOUT; - - /// - const _ = !0; } } @@ -452,9 +434,6 @@ const HUGE_2GB = linux_raw_sys::general::MFD_HUGE_2GB; /// `MFD_HUGE_16GB` const HUGE_16GB = linux_raw_sys::general::MFD_HUGE_16GB; - - /// - const _ = !0; } } @@ -467,19 +446,16 @@ #[repr(transparent)] #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] pub struct SealFlags: u32 { - /// `F_SEAL_SEAL`. - const SEAL = linux_raw_sys::general::F_SEAL_SEAL; - /// `F_SEAL_SHRINK`. - const SHRINK = linux_raw_sys::general::F_SEAL_SHRINK; - /// `F_SEAL_GROW`. - const GROW = linux_raw_sys::general::F_SEAL_GROW; - /// `F_SEAL_WRITE`. - const WRITE = linux_raw_sys::general::F_SEAL_WRITE; - /// `F_SEAL_FUTURE_WRITE` (since Linux 5.1) - const FUTURE_WRITE = linux_raw_sys::general::F_SEAL_FUTURE_WRITE; - - /// - const _ = !0; + /// `F_SEAL_SEAL`. + const SEAL = linux_raw_sys::general::F_SEAL_SEAL; + /// `F_SEAL_SHRINK`. + const SHRINK = linux_raw_sys::general::F_SEAL_SHRINK; + /// `F_SEAL_GROW`. + const GROW = linux_raw_sys::general::F_SEAL_GROW; + /// `F_SEAL_WRITE`. + const WRITE = linux_raw_sys::general::F_SEAL_WRITE; + /// `F_SEAL_FUTURE_WRITE` (since Linux 5.1) + const FUTURE_WRITE = linux_raw_sys::general::F_SEAL_FUTURE_WRITE; } } @@ -537,9 +513,6 @@ /// `STATX_ALL` const ALL = linux_raw_sys::general::STATX_ALL; - - /// - const _ = !0; } } @@ -564,9 +537,6 @@ const INSERT_RANGE = linux_raw_sys::general::FALLOC_FL_INSERT_RANGE; /// `FALLOC_FL_UNSHARE_RANGE` const UNSHARE_RANGE = linux_raw_sys::general::FALLOC_FL_UNSHARE_RANGE; - - /// - const _ = !0; } } @@ -601,9 +571,6 @@ /// `ST_SYNCHRONOUS` const SYNCHRONOUS = linux_raw_sys::general::MS_SYNCHRONOUS as u64; - - /// - const _ = !0; } } diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/io/errno.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/io/errno.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/io/errno.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/io/errno.rs 2023-10-30 19:40:00.000000000 +0000 @@ -16,32 +16,10 @@ use crate::io; use linux_raw_sys::errno; -/// `errno`—An error code. +/// The error type for `rustix` APIs. /// -/// The error type for `rustix` APIs. This is similar to [`std::io::Error`], -/// but only holds an OS error code, and no extra error value. -/// -/// # References -/// - [POSIX] -/// - [Linux] -/// - [Winsock2] -/// - [FreeBSD] -/// - [NetBSD] -/// - [OpenBSD] -/// - [DragonFly BSD] -/// - [illumos] -/// - [glibc] -/// -/// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/errno.html -/// [Linux]: https://man7.org/linux/man-pages/man3/errno.3.html -/// [Winsock2]: https://learn.microsoft.com/en-us/windows/win32/winsock/windows-sockets-error-codes-2 -/// [FreeBSD]: https://man.freebsd.org/cgi/man.cgi?errno -/// [NetBSD]: https://man.netbsd.org/errno.2 -/// [OpenBSD]: https://man.openbsd.org/errno.2 -/// [DragonFly BSD]: https://man.dragonflybsd.org/?command=errno§ion=2 -/// [illumos]: https://illumos.org/man/3C/errno -/// [glibc]: https://www.gnu.org/software/libc/manual/html_node/Error-Codes.html -/// [`std::io::Error`]: Result +/// This is similar to `std::io::Error`, but only holds an OS error code, +/// and no extra error value. #[repr(transparent)] #[doc(alias = "errno")] #[derive(Eq, PartialEq, Hash, Copy, Clone)] @@ -60,7 +38,7 @@ #[inline] pub fn from_io_error(io_err: &std::io::Error) -> Option { io_err.raw_os_error().and_then(|raw| { - // `std::io::Error` could theoretically have arbitrary OS error + // `std::io::Error` could theoretically have arbitrary "OS error" // values, so check that they're in Linux's range. if (1..4096).contains(&raw) { Some(Self::from_errno(raw as u32)) diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/io/syscalls.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/io/syscalls.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/io/syscalls.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/io/syscalls.rs 2023-10-30 19:40:00.000000000 +0000 @@ -10,23 +10,29 @@ use crate::backend::conv::loff_t_from_u64; #[cfg(all( target_pointer_width = "32", - any(target_arch = "arm", target_arch = "mips", target_arch = "mips32r6"), + any( + target_arch = "arm", + target_arch = "mips", + target_arch = "mips32r6", + target_arch = "power" + ), ))] use crate::backend::conv::zero; use crate::backend::conv::{ - c_uint, pass_usize, raw_fd, ret, ret_c_int, ret_c_uint, ret_discarded_fd, ret_owned_fd, - ret_usize, slice, slice_mut, + by_ref, c_uint, raw_fd, ret, ret_c_uint, ret_discarded_fd, ret_owned_fd, ret_usize, slice, + slice_mut, }; #[cfg(target_pointer_width = "32")] use crate::backend::conv::{hi, lo}; use crate::backend::{c, MAX_IOV}; use crate::fd::{AsFd, BorrowedFd, OwnedFd, RawFd}; use crate::io::{self, DupFlags, FdFlags, IoSlice, IoSliceMut, ReadWriteFlags}; -use crate::ioctl::{IoctlOutput, RawOpcode}; #[cfg(all(feature = "fs", feature = "net"))] use crate::net::{RecvFlags, SendFlags}; use core::cmp; +use core::mem::MaybeUninit; use linux_raw_sys::general::{F_DUPFD_CLOEXEC, F_GETFD, F_SETFD}; +use linux_raw_sys::ioctl::{FIONBIO, FIONREAD}; #[inline] pub(crate) fn read(fd: BorrowedFd<'_>, buf: &mut [u8]) -> io::Result { @@ -42,7 +48,12 @@ // #[cfg(all( target_pointer_width = "32", - any(target_arch = "arm", target_arch = "mips", target_arch = "mips32r6"), + any( + target_arch = "arm", + target_arch = "mips", + target_arch = "mips32r6", + target_arch = "power" + ), ))] unsafe { ret_usize(syscall!( @@ -57,7 +68,12 @@ } #[cfg(all( target_pointer_width = "32", - not(any(target_arch = "arm", target_arch = "mips", target_arch = "mips32r6")), + not(any( + target_arch = "arm", + target_arch = "mips", + target_arch = "mips32r6", + target_arch = "power" + )), ))] unsafe { ret_usize(syscall!( @@ -96,16 +112,25 @@ ) -> io::Result { let (bufs_addr, bufs_len) = slice(&bufs[..cmp::min(bufs.len(), MAX_IOV)]); - // Unlike the plain "p" functions, the "pv" functions pass their offset in - // an endian-independent way, and always in two registers. + #[cfg(target_pointer_width = "32")] unsafe { ret_usize(syscall!( __NR_preadv, fd, bufs_addr, bufs_len, - pass_usize(pos as usize), - pass_usize((pos >> 32) as usize) + hi(pos), + lo(pos) + )) + } + #[cfg(target_pointer_width = "64")] + unsafe { + ret_usize(syscall!( + __NR_preadv, + fd, + bufs_addr, + bufs_len, + loff_t_from_u64(pos) )) } } @@ -119,16 +144,26 @@ ) -> io::Result { let (bufs_addr, bufs_len) = slice(&bufs[..cmp::min(bufs.len(), MAX_IOV)]); - // Unlike the plain "p" functions, the "pv" functions pass their offset in - // an endian-independent way, and always in two registers. + #[cfg(target_pointer_width = "32")] unsafe { ret_usize(syscall!( __NR_preadv2, fd, bufs_addr, bufs_len, - pass_usize(pos as usize), - pass_usize((pos >> 32) as usize), + hi(pos), + lo(pos), + flags + )) + } + #[cfg(target_pointer_width = "64")] + unsafe { + ret_usize(syscall!( + __NR_preadv2, + fd, + bufs_addr, + bufs_len, + loff_t_from_u64(pos), flags )) } @@ -148,7 +183,12 @@ // #[cfg(all( target_pointer_width = "32", - any(target_arch = "arm", target_arch = "mips", target_arch = "mips32r6"), + any( + target_arch = "arm", + target_arch = "mips", + target_arch = "mips32r6", + target_arch = "power" + ), ))] unsafe { ret_usize(syscall_readonly!( @@ -163,7 +203,12 @@ } #[cfg(all( target_pointer_width = "32", - not(any(target_arch = "arm", target_arch = "mips", target_arch = "mips32r6")), + not(any( + target_arch = "arm", + target_arch = "mips", + target_arch = "mips32r6", + target_arch = "power" + )), ))] unsafe { ret_usize(syscall_readonly!( @@ -198,16 +243,25 @@ pub(crate) fn pwritev(fd: BorrowedFd<'_>, bufs: &[IoSlice<'_>], pos: u64) -> io::Result { let (bufs_addr, bufs_len) = slice(&bufs[..cmp::min(bufs.len(), MAX_IOV)]); - // Unlike the plain "p" functions, the "pv" functions pass their offset in - // an endian-independent way, and always in two registers. + #[cfg(target_pointer_width = "32")] + unsafe { + ret_usize(syscall_readonly!( + __NR_pwritev, + fd, + bufs_addr, + bufs_len, + hi(pos), + lo(pos) + )) + } + #[cfg(target_pointer_width = "64")] unsafe { ret_usize(syscall_readonly!( __NR_pwritev, fd, bufs_addr, bufs_len, - pass_usize(pos as usize), - pass_usize((pos >> 32) as usize) + loff_t_from_u64(pos) )) } } @@ -221,16 +275,26 @@ ) -> io::Result { let (bufs_addr, bufs_len) = slice(&bufs[..cmp::min(bufs.len(), MAX_IOV)]); - // Unlike the plain "p" functions, the "pv" functions pass their offset in - // an endian-independent way, and always in two registers. + #[cfg(target_pointer_width = "32")] unsafe { ret_usize(syscall_readonly!( __NR_pwritev2, fd, bufs_addr, bufs_len, - pass_usize(pos as usize), - pass_usize((pos >> 32) as usize), + hi(pos), + lo(pos), + flags + )) + } + #[cfg(target_pointer_width = "64")] + unsafe { + ret_usize(syscall_readonly!( + __NR_pwritev2, + fd, + bufs_addr, + bufs_len, + loff_t_from_u64(pos), flags )) } @@ -243,21 +307,25 @@ } #[inline] -pub(crate) unsafe fn ioctl( - fd: BorrowedFd<'_>, - request: RawOpcode, - arg: *mut c::c_void, -) -> io::Result { - ret_c_int(syscall!(__NR_ioctl, fd, c_uint(request), arg)) +pub(crate) fn ioctl_fionread(fd: BorrowedFd<'_>) -> io::Result { + unsafe { + let mut result = MaybeUninit::::uninit(); + ret(syscall!(__NR_ioctl, fd, c_uint(FIONREAD), &mut result))?; + Ok(result.assume_init() as u64) + } } #[inline] -pub(crate) unsafe fn ioctl_readonly( - fd: BorrowedFd<'_>, - request: RawOpcode, - arg: *mut c::c_void, -) -> io::Result { - ret_c_int(syscall_readonly!(__NR_ioctl, fd, c_uint(request), arg)) +pub(crate) fn ioctl_fionbio(fd: BorrowedFd<'_>, value: bool) -> io::Result<()> { + unsafe { + let data = c::c_int::from(value); + ret(syscall_readonly!( + __NR_ioctl, + fd, + c_uint(FIONBIO), + by_ref(&data) + )) + } } #[cfg(all(feature = "fs", feature = "net"))] @@ -308,7 +376,6 @@ unsafe { ret_owned_fd(syscall_readonly!(__NR_dup, fd)) } } -#[allow(clippy::needless_pass_by_ref_mut)] #[inline] pub(crate) fn dup2(fd: BorrowedFd<'_>, new: &mut OwnedFd) -> io::Result<()> { #[cfg(any(target_arch = "aarch64", target_arch = "riscv64"))] @@ -325,7 +392,6 @@ } } -#[allow(clippy::needless_pass_by_ref_mut)] #[inline] pub(crate) fn dup3(fd: BorrowedFd<'_>, new: &mut OwnedFd, flags: DupFlags) -> io::Result<()> { unsafe { ret_discarded_fd(syscall_readonly!(__NR_dup3, fd, new.as_fd(), flags)) } diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/io/types.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/io/types.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/io/types.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/io/types.rs 2023-10-30 19:40:00.000000000 +0000 @@ -11,9 +11,6 @@ pub struct FdFlags: c::c_uint { /// `FD_CLOEXEC` const CLOEXEC = linux_raw_sys::general::FD_CLOEXEC; - - /// - const _ = !0; } } @@ -35,9 +32,6 @@ const NOWAIT = linux_raw_sys::general::RWF_NOWAIT; /// `RWF_APPEND` (since Linux 4.16) const APPEND = linux_raw_sys::general::RWF_APPEND; - - /// - const _ = !0; } } @@ -50,8 +44,5 @@ pub struct DupFlags: c::c_uint { /// `O_CLOEXEC` const CLOEXEC = linux_raw_sys::general::O_CLOEXEC; - - /// - const _ = !0; } } diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/io_uring/syscalls.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/io_uring/syscalls.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/io_uring/syscalls.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/io_uring/syscalls.rs 2023-10-30 19:40:00.000000000 +0000 @@ -3,7 +3,8 @@ //! # Safety //! //! See the `rustix::backend::syscalls` module documentation for details. -#![allow(unsafe_code, clippy::undocumented_unsafe_blocks)] +#![allow(unsafe_code)] +#![allow(clippy::undocumented_unsafe_blocks)] use crate::backend::conv::{by_mut, c_uint, pass_usize, ret_c_uint, ret_owned_fd}; use crate::fd::{BorrowedFd, OwnedFd}; diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/mm/syscalls.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/mm/syscalls.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/mm/syscalls.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/mm/syscalls.rs 2023-10-30 19:40:00.000000000 +0000 @@ -6,8 +6,6 @@ #![allow(unsafe_code)] #![allow(clippy::undocumented_unsafe_blocks)] -#[cfg(any(linux_kernel, freebsdlike, netbsdlike))] -use super::types::MlockAllFlags; use super::types::{ Advice, MapFlags, MlockFlags, MprotectFlags, MremapFlags, MsyncFlags, ProtFlags, UserfaultfdFlags, @@ -212,30 +210,3 @@ pub(crate) unsafe fn userfaultfd(flags: UserfaultfdFlags) -> io::Result { ret_owned_fd(syscall_readonly!(__NR_userfaultfd, flags)) } - -/// Locks all pages mapped into the address space of the calling process. -/// -/// This includes the pages of the code, data, and stack segment, as well as -/// shared libraries, user space kernel data, shared memory, and memory-mapped -/// files. All mapped pages are guaranteed to be resident in RAM when the call -/// returns successfully; the pages are guaranteed to stay in RAM until later -/// unlocked. -#[inline] -#[cfg(any(linux_kernel, freebsdlike, netbsdlike))] -pub(crate) fn mlockall(flags: MlockAllFlags) -> io::Result<()> { - // When `mlockall` is used with `MCL_ONFAULT | MCL_FUTURE`, the ordering - // of `mlockall` with respect to arbitrary loads may be significant, - // because if a load happens and evokes a fault before the `mlockall`, - // the memory doesn't get locked, but if the load and therefore - // the fault happens after, then the memory does get locked. - // So to be conservative in this regard, we use `syscall` instead - // of `syscall_readonly` - unsafe { ret(syscall!(__NR_mlockall, flags)) } -} - -/// Unlocks all pages mapped into the address space of the calling process. -#[inline] -#[cfg(any(linux_kernel, freebsdlike, netbsdlike))] -pub(crate) fn munlockall() -> io::Result<()> { - unsafe { ret(syscall_readonly!(__NR_munlockall)) } -} diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/mm/types.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/mm/types.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/mm/types.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/mm/types.rs 2023-10-30 19:40:00.000000000 +0000 @@ -16,9 +16,6 @@ const WRITE = linux_raw_sys::general::PROT_WRITE; /// `PROT_EXEC` const EXEC = linux_raw_sys::general::PROT_EXEC; - - /// - const _ = !0; } } @@ -55,9 +52,6 @@ /// `PROT_ADI` #[cfg(any(target_arch = "sparc", target_arch = "sparc64"))] const ADI = linux_raw_sys::general::PROT_ADI; - - /// - const _ = !0; } } @@ -105,9 +99,6 @@ /// `MAP_UNINITIALIZED` #[cfg(not(any(target_arch = "mips", target_arch = "mips32r6", target_arch = "mips64", target_arch = "mips64r6")))] const UNINITIALIZED = linux_raw_sys::general::MAP_UNINITIALIZED; - - /// - const _ = !0; } } @@ -125,9 +116,6 @@ const MAYMOVE = linux_raw_sys::general::MREMAP_MAYMOVE; /// `MREMAP_DONTUNMAP` (since Linux 5.7) const DONTUNMAP = linux_raw_sys::general::MREMAP_DONTUNMAP; - - /// - const _ = !0; } } @@ -147,9 +135,6 @@ /// file (so that they can be updated with the fresh values just /// written). const INVALIDATE = linux_raw_sys::general::MS_INVALIDATE; - - /// - const _ = !0; } } @@ -162,9 +147,6 @@ pub struct MlockFlags: u32 { /// `MLOCK_ONFAULT` const ONFAULT = linux_raw_sys::general::MLOCK_ONFAULT; - - /// - const _ = !0; } } @@ -240,9 +222,9 @@ impl Advice { /// `POSIX_MADV_DONTNEED` /// - /// On Linux, this is mapped to `POSIX_MADV_NORMAL` because Linux's - /// `MADV_DONTNEED` differs from `POSIX_MADV_DONTNEED`. See `LinuxDontNeed` - /// for the Linux behavior. + /// On Linux, this is mapped to `POSIX_MADV_NORMAL` because + /// Linux's `MADV_DONTNEED` differs from `POSIX_MADV_DONTNEED`. See + /// `LinuxDontNeed` for the Linux behavior. pub const DontNeed: Self = Self::Normal; } @@ -257,40 +239,5 @@ const CLOEXEC = linux_raw_sys::general::O_CLOEXEC; /// `O_NONBLOCK` const NONBLOCK = linux_raw_sys::general::O_NONBLOCK; - - /// - const _ = !0; - } -} - -#[cfg(any(linux_kernel, freebsdlike, netbsdlike))] -bitflags! { - /// `MCL_*` flags for use with [`mlockall`]. - /// - /// [`mlockall`]: crate::mm::mlockall - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct MlockAllFlags: u32 { - /// Used together with `MCL_CURRENT`, `MCL_FUTURE`, or both. Mark all - /// current (with `MCL_CURRENT`) or future (with `MCL_FUTURE`) mappings - /// to lock pages when they are faulted in. When used with - /// `MCL_CURRENT`, all present pages are locked, but `mlockall` will - /// not fault in non-present pages. When used with `MCL_FUTURE`, all - /// future mappings will be marked to lock pages when they are faulted - /// in, but they will not be populated by the lock when the mapping is - /// created. `MCL_ONFAULT` must be used with either `MCL_CURRENT` or - /// `MCL_FUTURE` or both. - const ONFAULT = linux_raw_sys::general::MCL_ONFAULT; - /// Lock all pages which will become mapped into the address space of - /// the process in the future. These could be, for instance, new pages - /// required by a growing heap and stack as well as new memory-mapped - /// files or shared memory regions. - const FUTURE = linux_raw_sys::general::MCL_FUTURE; - /// Lock all pages which are currently mapped into the address space of - /// the process. - const CURRENT = linux_raw_sys::general::MCL_CURRENT; - - /// - const _ = !0; } } diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/mod.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/mod.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -17,6 +17,13 @@ #[macro_use] mod arch; mod conv; +#[cfg(any( + feature = "param", + feature = "runtime", + feature = "time", + target_arch = "x86" +))] +mod elf; mod reg; #[cfg(any(feature = "time", target_arch = "x86"))] mod vdso; @@ -29,7 +36,7 @@ feature = "fs", all( not(feature = "use-libc-auxv"), - not(feature = "use-explicitly-provided-auxv"), + not(target_vendor = "mustang"), any( feature = "param", feature = "runtime", @@ -67,8 +74,6 @@ pub(crate) mod rand; #[cfg(feature = "runtime")] pub(crate) mod runtime; -#[cfg(feature = "shm")] -pub(crate) mod shm; #[cfg(feature = "system")] pub(crate) mod system; #[cfg(feature = "termios")] @@ -99,7 +104,7 @@ feature = "thread", all( not(feature = "use-libc-auxv"), - not(feature = "use-explicitly-provided-auxv"), + not(target_vendor = "mustang"), any( feature = "param", feature = "runtime", diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/mount/types.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/mount/types.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/mount/types.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/mount/types.rs 2023-10-30 19:40:00.000000000 +0000 @@ -56,9 +56,6 @@ /// `MS_NOSYMFOLLOW` const NOSYMFOLLOW = linux_raw_sys::general::MS_NOSYMFOLLOW; - - /// - const _ = !0; } } @@ -77,9 +74,6 @@ const EXPIRE = linux_raw_sys::general::MNT_EXPIRE; /// `UMOUNT_NOFOLLOW` const NOFOLLOW = linux_raw_sys::general::UMOUNT_NOFOLLOW; - - /// - const _ = !0; } } @@ -91,11 +85,9 @@ #[repr(transparent)] #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] pub struct FsOpenFlags: c::c_uint { + /// `FSOPEN_CLOEXEC` const FSOPEN_CLOEXEC = linux_raw_sys::general::FSOPEN_CLOEXEC; - - /// - const _ = !0; } } @@ -109,9 +101,6 @@ pub struct FsMountFlags: c::c_uint { /// `FSMOUNT_CLOEXEC` const FSMOUNT_CLOEXEC = linux_raw_sys::general::FSMOUNT_CLOEXEC; - - /// - const _ = !0; } } @@ -188,9 +177,6 @@ /// `MOUNT_ATTR__ATIME_FLAGS` const MOUNT_ATTR_SIZE_VER0 = linux_raw_sys::general::MOUNT_ATTR_SIZE_VER0; - - /// - const _ = !0; } } @@ -229,9 +215,6 @@ /// `MOVE_MOUNT__MASK` const MOVE_MOUNT__MASK = linux_raw_sys::general::MOVE_MOUNT__MASK; - - /// - const _ = !0; } } @@ -260,9 +243,6 @@ /// `AT_SYMLINK_NOFOLLOW` const AT_SYMLINK_NOFOLLOW = linux_raw_sys::general::AT_SYMLINK_NOFOLLOW; - - /// - const _ = !0; } } @@ -285,9 +265,6 @@ /// `FSPICK_EMPTY_PATH` const FSPICK_EMPTY_PATH = linux_raw_sys::general::FSPICK_EMPTY_PATH; - - /// - const _ = !0; } } @@ -310,9 +287,6 @@ const UNBINDABLE = linux_raw_sys::general::MS_UNBINDABLE; /// `MS_REC` const REC = linux_raw_sys::general::MS_REC; - - /// - const _ = !0; } } @@ -322,9 +296,6 @@ pub(crate) struct InternalMountFlags: c::c_uint { const REMOUNT = linux_raw_sys::general::MS_REMOUNT; const MOVE = linux_raw_sys::general::MS_MOVE; - - /// - const _ = !0; } } diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/net/addr.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/net/addr.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/net/addr.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/net/addr.rs 2023-10-30 19:40:00.000000000 +0000 @@ -117,7 +117,9 @@ impl PartialOrd for SocketAddrUnix { #[inline] fn partial_cmp(&self, other: &Self) -> Option { - Some(self.cmp(other)) + let self_len = self.len() - offsetof_sun_path(); + let other_len = other.len() - offsetof_sun_path(); + self.unix.sun_path[..self_len].partial_cmp(&other.unix.sun_path[..other_len]) } } diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/net/mod.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/net/mod.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/net/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/net/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -2,6 +2,5 @@ pub(crate) mod msghdr; pub(crate) mod read_sockaddr; pub(crate) mod send_recv; -pub(crate) mod sockopt; pub(crate) mod syscalls; pub(crate) mod write_sockaddr; diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/net/msghdr.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/net/msghdr.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/net/msghdr.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/net/msghdr.rs 2023-10-30 19:40:00.000000000 +0000 @@ -122,7 +122,7 @@ f: impl FnOnce(c::msghdr) -> R, ) -> R { f(c::msghdr { - msg_name: as_ptr(&addr.unix) as _, + msg_name: as_ptr(addr) as _, msg_namelen: addr.addr_len() as _, msg_iov: iov.as_ptr() as _, msg_iovlen: msg_iov_len(iov.len()), diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/net/read_sockaddr.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/net/read_sockaddr.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/net/read_sockaddr.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/net/read_sockaddr.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,5 +1,5 @@ -//! The BSD sockets API requires us to read the `ss_family` field before we can -//! interpret the rest of a `sockaddr` produced by the kernel. +//! The BSD sockets API requires us to read the `ss_family` field before +//! we can interpret the rest of a `sockaddr` produced by the kernel. #![allow(unsafe_code)] use crate::backend::c; @@ -110,7 +110,7 @@ } } -/// Read an optional socket address returned from the OS. +/// Read a socket address returned from the OS. /// /// # Safety /// diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/net/send_recv.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/net/send_recv.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/net/send_recv.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/net/send_recv.rs 2023-10-30 19:40:00.000000000 +0000 @@ -2,8 +2,7 @@ use bitflags::bitflags; bitflags! { - /// `MSG_*` flags for use with [`send`], [`send_to`], and related - /// functions. + /// `MSG_* flags for use with [`send`], [`send_to`], and related functions. /// /// [`send`]: crate::net::send /// [`sendto`]: crate::net::sendto @@ -24,15 +23,11 @@ const NOSIGNAL = c::MSG_NOSIGNAL; /// `MSG_OOB` const OOB = c::MSG_OOB; - - /// - const _ = !0; } } bitflags! { - /// `MSG_*` flags for use with [`recv`], [`recvfrom`], and related - /// functions. + /// `MSG_* flags for use with [`recv`], [`recvfrom`], and related functions. /// /// [`recv`]: crate::net::recv /// [`recvfrom`]: crate::net::recvfrom @@ -53,8 +48,5 @@ const TRUNC = c::MSG_TRUNC; /// `MSG_WAITALL` const WAITALL = c::MSG_WAITALL; - - /// - const _ = !0; } } diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/net/sockopt.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/net/sockopt.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/net/sockopt.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/net/sockopt.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,879 +0,0 @@ -//! linux_raw syscalls supporting `rustix::net::sockopt`. -//! -//! # Safety -//! -//! See the `rustix::backend` module documentation for details. -#![allow(unsafe_code, clippy::undocumented_unsafe_blocks)] - -use crate::backend::c; -use crate::backend::conv::{by_mut, c_uint, ret, socklen_t}; -use crate::fd::BorrowedFd; -#[cfg(feature = "alloc")] -use crate::ffi::CStr; -use crate::io; -use crate::net::sockopt::Timeout; -use crate::net::{ - AddressFamily, Ipv4Addr, Ipv6Addr, Protocol, RawProtocol, SocketAddrAny, SocketAddrStorage, - SocketAddrV4, SocketAddrV6, SocketType, UCred, -}; -#[cfg(feature = "alloc")] -use alloc::borrow::ToOwned; -#[cfg(feature = "alloc")] -use alloc::string::String; -use core::mem::MaybeUninit; -use core::time::Duration; -use linux_raw_sys::general::{__kernel_old_timeval, __kernel_sock_timeval}; -#[cfg(target_arch = "x86")] -use { - crate::backend::conv::{slice_just_addr, x86_sys}, - crate::backend::reg::{ArgReg, SocketArg}, - linux_raw_sys::net::{SYS_GETSOCKOPT, SYS_SETSOCKOPT}, -}; - -#[inline] -fn getsockopt(fd: BorrowedFd<'_>, level: u32, optname: u32) -> io::Result { - let mut optlen: c::socklen_t = core::mem::size_of::().try_into().unwrap(); - debug_assert!( - optlen as usize >= core::mem::size_of::(), - "Socket APIs don't ever use `bool` directly" - ); - - let mut value = MaybeUninit::::uninit(); - getsockopt_raw(fd, level, optname, &mut value, &mut optlen)?; - - assert_eq!( - optlen as usize, - core::mem::size_of::(), - "unexpected getsockopt size" - ); - - unsafe { Ok(value.assume_init()) } -} - -#[inline] -fn getsockopt_raw( - fd: BorrowedFd<'_>, - level: u32, - optname: u32, - value: &mut MaybeUninit, - optlen: &mut c::socklen_t, -) -> io::Result<()> { - #[cfg(not(target_arch = "x86"))] - unsafe { - ret(syscall!( - __NR_getsockopt, - fd, - c_uint(level), - c_uint(optname), - value, - by_mut(optlen) - )) - } - #[cfg(target_arch = "x86")] - unsafe { - ret(syscall!( - __NR_socketcall, - x86_sys(SYS_GETSOCKOPT), - slice_just_addr::, _>(&[ - fd.into(), - c_uint(level), - c_uint(optname), - value.into(), - by_mut(optlen), - ]) - )) - } -} - -#[inline] -fn setsockopt(fd: BorrowedFd<'_>, level: u32, optname: u32, value: T) -> io::Result<()> { - let optlen = core::mem::size_of::().try_into().unwrap(); - debug_assert!( - optlen as usize >= core::mem::size_of::(), - "Socket APIs don't ever use `bool` directly" - ); - setsockopt_raw(fd, level, optname, &value, optlen) -} - -#[inline] -fn setsockopt_raw( - fd: BorrowedFd<'_>, - level: u32, - optname: u32, - ptr: *const T, - optlen: c::socklen_t, -) -> io::Result<()> { - #[cfg(not(target_arch = "x86"))] - unsafe { - ret(syscall_readonly!( - __NR_setsockopt, - fd, - c_uint(level), - c_uint(optname), - ptr, - socklen_t(optlen) - )) - } - #[cfg(target_arch = "x86")] - unsafe { - ret(syscall_readonly!( - __NR_socketcall, - x86_sys(SYS_SETSOCKOPT), - slice_just_addr::, _>(&[ - fd.into(), - c_uint(level), - c_uint(optname), - ptr.into(), - socklen_t(optlen), - ]) - )) - } -} - -#[inline] -pub(crate) fn get_socket_type(fd: BorrowedFd<'_>) -> io::Result { - getsockopt(fd, c::SOL_SOCKET, c::SO_TYPE) -} - -#[inline] -pub(crate) fn set_socket_reuseaddr(fd: BorrowedFd<'_>, reuseaddr: bool) -> io::Result<()> { - setsockopt(fd, c::SOL_SOCKET, c::SO_REUSEADDR, from_bool(reuseaddr)) -} - -#[inline] -pub(crate) fn get_socket_reuseaddr(fd: BorrowedFd<'_>) -> io::Result { - getsockopt(fd, c::SOL_SOCKET, c::SO_REUSEADDR).map(to_bool) -} - -#[inline] -pub(crate) fn set_socket_broadcast(fd: BorrowedFd<'_>, broadcast: bool) -> io::Result<()> { - setsockopt(fd, c::SOL_SOCKET, c::SO_BROADCAST, from_bool(broadcast)) -} - -#[inline] -pub(crate) fn get_socket_broadcast(fd: BorrowedFd<'_>) -> io::Result { - getsockopt(fd, c::SOL_SOCKET, c::SO_BROADCAST).map(to_bool) -} - -#[inline] -pub(crate) fn set_socket_linger(fd: BorrowedFd<'_>, linger: Option) -> io::Result<()> { - // Convert `linger` to seconds, rounding up. - let l_linger = if let Some(linger) = linger { - duration_to_secs(linger)? - } else { - 0 - }; - let linger = c::linger { - l_onoff: c::c_int::from(linger.is_some()), - l_linger, - }; - setsockopt(fd, c::SOL_SOCKET, c::SO_LINGER, linger) -} - -#[inline] -pub(crate) fn get_socket_linger(fd: BorrowedFd<'_>) -> io::Result> { - let linger: c::linger = getsockopt(fd, c::SOL_SOCKET, c::SO_LINGER)?; - Ok((linger.l_onoff != 0).then(|| Duration::from_secs(linger.l_linger as u64))) -} - -#[inline] -pub(crate) fn set_socket_passcred(fd: BorrowedFd<'_>, passcred: bool) -> io::Result<()> { - setsockopt(fd, c::SOL_SOCKET, c::SO_PASSCRED, from_bool(passcred)) -} - -#[inline] -pub(crate) fn get_socket_passcred(fd: BorrowedFd<'_>) -> io::Result { - getsockopt(fd, c::SOL_SOCKET, c::SO_PASSCRED).map(to_bool) -} - -#[inline] -pub(crate) fn set_socket_timeout( - fd: BorrowedFd<'_>, - id: Timeout, - timeout: Option, -) -> io::Result<()> { - let time = duration_to_linux_sock_timeval(timeout)?; - let optname = match id { - Timeout::Recv => c::SO_RCVTIMEO_NEW, - Timeout::Send => c::SO_SNDTIMEO_NEW, - }; - match setsockopt(fd, c::SOL_SOCKET, optname, time) { - Err(io::Errno::NOPROTOOPT) if c::SO_RCVTIMEO_NEW != c::SO_RCVTIMEO_OLD => { - set_socket_timeout_old(fd, id, timeout) - } - otherwise => otherwise, - } -} - -/// Same as `set_socket_timeout` but uses `__kernel_old_timeval` instead of -/// `__kernel_sock_timeval` and `_OLD` constants instead of `_NEW`. -fn set_socket_timeout_old( - fd: BorrowedFd<'_>, - id: Timeout, - timeout: Option, -) -> io::Result<()> { - let time = duration_to_linux_old_timeval(timeout)?; - let optname = match id { - Timeout::Recv => c::SO_RCVTIMEO_OLD, - Timeout::Send => c::SO_SNDTIMEO_OLD, - }; - setsockopt(fd, c::SOL_SOCKET, optname, time) -} - -#[inline] -pub(crate) fn get_socket_timeout(fd: BorrowedFd<'_>, id: Timeout) -> io::Result> { - let optname = match id { - Timeout::Recv => c::SO_RCVTIMEO_NEW, - Timeout::Send => c::SO_SNDTIMEO_NEW, - }; - let time: __kernel_sock_timeval = match getsockopt(fd, c::SOL_SOCKET, optname) { - Err(io::Errno::NOPROTOOPT) if c::SO_RCVTIMEO_NEW != c::SO_RCVTIMEO_OLD => { - return get_socket_timeout_old(fd, id) - } - otherwise => otherwise?, - }; - Ok(duration_from_linux_sock_timeval(time)) -} - -/// Same as `get_socket_timeout` but uses `__kernel_old_timeval` instead of -/// `__kernel_sock_timeval` and `_OLD` constants instead of `_NEW`. -fn get_socket_timeout_old(fd: BorrowedFd<'_>, id: Timeout) -> io::Result> { - let optname = match id { - Timeout::Recv => c::SO_RCVTIMEO_OLD, - Timeout::Send => c::SO_SNDTIMEO_OLD, - }; - let time: __kernel_old_timeval = getsockopt(fd, c::SOL_SOCKET, optname)?; - Ok(duration_from_linux_old_timeval(time)) -} - -/// Convert a `__linux_sock_timeval` to a Rust `Option`. -#[inline] -fn duration_from_linux_sock_timeval(time: __kernel_sock_timeval) -> Option { - if time.tv_sec == 0 && time.tv_usec == 0 { - None - } else { - Some(Duration::from_secs(time.tv_sec as u64) + Duration::from_micros(time.tv_usec as u64)) - } -} - -/// Like `duration_from_linux` but uses Linux's old 32-bit -/// `__kernel_old_timeval`. -fn duration_from_linux_old_timeval(time: __kernel_old_timeval) -> Option { - if time.tv_sec == 0 && time.tv_usec == 0 { - None - } else { - Some(Duration::from_secs(time.tv_sec as u64) + Duration::from_micros(time.tv_usec as u64)) - } -} - -/// Convert a Rust `Option` to a `__kernel_sock_timeval`. -#[inline] -fn duration_to_linux_sock_timeval(timeout: Option) -> io::Result<__kernel_sock_timeval> { - Ok(match timeout { - Some(timeout) => { - if timeout == Duration::ZERO { - return Err(io::Errno::INVAL); - } - // `subsec_micros` rounds down, so we use `subsec_nanos` and - // manually round up. - let mut timeout = __kernel_sock_timeval { - tv_sec: timeout.as_secs().try_into().unwrap_or(i64::MAX), - tv_usec: ((timeout.subsec_nanos() + 999) / 1000) as _, - }; - if timeout.tv_sec == 0 && timeout.tv_usec == 0 { - timeout.tv_usec = 1; - } - timeout - } - None => __kernel_sock_timeval { - tv_sec: 0, - tv_usec: 0, - }, - }) -} - -/// Like `duration_to_linux` but uses Linux's old 32-bit -/// `__kernel_old_timeval`. -fn duration_to_linux_old_timeval(timeout: Option) -> io::Result<__kernel_old_timeval> { - Ok(match timeout { - Some(timeout) => { - if timeout == Duration::ZERO { - return Err(io::Errno::INVAL); - } - - // `subsec_micros` rounds down, so we use `subsec_nanos` and - // manually round up. - let mut timeout = __kernel_old_timeval { - tv_sec: timeout.as_secs().try_into().unwrap_or(c::c_long::MAX), - tv_usec: ((timeout.subsec_nanos() + 999) / 1000) as _, - }; - if timeout.tv_sec == 0 && timeout.tv_usec == 0 { - timeout.tv_usec = 1; - } - timeout - } - None => __kernel_old_timeval { - tv_sec: 0, - tv_usec: 0, - }, - }) -} - -#[inline] -pub(crate) fn get_socket_error(fd: BorrowedFd<'_>) -> io::Result> { - let err: c::c_int = getsockopt(fd, c::SOL_SOCKET, c::SO_ERROR)?; - Ok(if err == 0 { - Ok(()) - } else { - Err(io::Errno::from_raw_os_error(err)) - }) -} - -#[inline] -pub(crate) fn set_socket_keepalive(fd: BorrowedFd<'_>, keepalive: bool) -> io::Result<()> { - setsockopt(fd, c::SOL_SOCKET, c::SO_KEEPALIVE, from_bool(keepalive)) -} - -#[inline] -pub(crate) fn get_socket_keepalive(fd: BorrowedFd<'_>) -> io::Result { - getsockopt(fd, c::SOL_SOCKET, c::SO_KEEPALIVE).map(to_bool) -} - -#[inline] -pub(crate) fn set_socket_recv_buffer_size(fd: BorrowedFd<'_>, size: usize) -> io::Result<()> { - let size: c::c_int = size.try_into().map_err(|_| io::Errno::INVAL)?; - setsockopt(fd, c::SOL_SOCKET, c::SO_RCVBUF, size) -} - -#[inline] -pub(crate) fn get_socket_recv_buffer_size(fd: BorrowedFd<'_>) -> io::Result { - getsockopt(fd, c::SOL_SOCKET, c::SO_RCVBUF).map(|size: u32| size as usize) -} - -#[inline] -pub(crate) fn set_socket_send_buffer_size(fd: BorrowedFd<'_>, size: usize) -> io::Result<()> { - let size: c::c_int = size.try_into().map_err(|_| io::Errno::INVAL)?; - setsockopt(fd, c::SOL_SOCKET, c::SO_SNDBUF, size) -} - -#[inline] -pub(crate) fn get_socket_send_buffer_size(fd: BorrowedFd<'_>) -> io::Result { - getsockopt(fd, c::SOL_SOCKET, c::SO_SNDBUF).map(|size: u32| size as usize) -} - -#[inline] -pub(crate) fn get_socket_domain(fd: BorrowedFd<'_>) -> io::Result { - let domain: c::c_int = getsockopt(fd, c::SOL_SOCKET, c::SO_DOMAIN)?; - Ok(AddressFamily( - domain.try_into().map_err(|_| io::Errno::OPNOTSUPP)?, - )) -} - -#[inline] -pub(crate) fn get_socket_acceptconn(fd: BorrowedFd<'_>) -> io::Result { - getsockopt(fd, c::SOL_SOCKET, c::SO_ACCEPTCONN).map(to_bool) -} - -#[inline] -pub(crate) fn set_socket_oobinline(fd: BorrowedFd<'_>, value: bool) -> io::Result<()> { - setsockopt(fd, c::SOL_SOCKET, c::SO_OOBINLINE, from_bool(value)) -} - -#[inline] -pub(crate) fn get_socket_oobinline(fd: BorrowedFd<'_>) -> io::Result { - getsockopt(fd, c::SOL_SOCKET, c::SO_OOBINLINE).map(to_bool) -} - -#[inline] -pub(crate) fn set_socket_reuseport(fd: BorrowedFd<'_>, value: bool) -> io::Result<()> { - setsockopt(fd, c::SOL_SOCKET, c::SO_REUSEPORT, from_bool(value)) -} - -#[inline] -pub(crate) fn get_socket_reuseport(fd: BorrowedFd<'_>) -> io::Result { - getsockopt(fd, c::SOL_SOCKET, c::SO_REUSEPORT).map(to_bool) -} - -#[inline] -pub(crate) fn get_socket_protocol(fd: BorrowedFd<'_>) -> io::Result> { - getsockopt(fd, c::SOL_SOCKET, c::SO_PROTOCOL) - .map(|raw: u32| RawProtocol::new(raw).map(Protocol::from_raw)) -} - -#[inline] -pub(crate) fn get_socket_cookie(fd: BorrowedFd<'_>) -> io::Result { - getsockopt(fd, c::SOL_SOCKET, c::SO_COOKIE) -} - -#[inline] -pub(crate) fn get_socket_incoming_cpu(fd: BorrowedFd<'_>) -> io::Result { - getsockopt(fd, c::SOL_SOCKET, c::SO_INCOMING_CPU) -} - -#[inline] -pub(crate) fn set_socket_incoming_cpu(fd: BorrowedFd<'_>, value: u32) -> io::Result<()> { - setsockopt(fd, c::SOL_SOCKET, c::SO_INCOMING_CPU, value) -} - -#[inline] -pub(crate) fn set_ip_ttl(fd: BorrowedFd<'_>, ttl: u32) -> io::Result<()> { - setsockopt(fd, c::IPPROTO_IP, c::IP_TTL, ttl) -} - -#[inline] -pub(crate) fn get_ip_ttl(fd: BorrowedFd<'_>) -> io::Result { - getsockopt(fd, c::IPPROTO_IP, c::IP_TTL) -} - -#[inline] -pub(crate) fn set_ipv6_v6only(fd: BorrowedFd<'_>, only_v6: bool) -> io::Result<()> { - setsockopt(fd, c::IPPROTO_IPV6, c::IPV6_V6ONLY, from_bool(only_v6)) -} - -#[inline] -pub(crate) fn get_ipv6_v6only(fd: BorrowedFd<'_>) -> io::Result { - getsockopt(fd, c::IPPROTO_IPV6, c::IPV6_V6ONLY).map(to_bool) -} - -#[inline] -pub(crate) fn set_ip_multicast_loop(fd: BorrowedFd<'_>, multicast_loop: bool) -> io::Result<()> { - setsockopt( - fd, - c::IPPROTO_IP, - c::IP_MULTICAST_LOOP, - from_bool(multicast_loop), - ) -} - -#[inline] -pub(crate) fn get_ip_multicast_loop(fd: BorrowedFd<'_>) -> io::Result { - getsockopt(fd, c::IPPROTO_IP, c::IP_MULTICAST_LOOP).map(to_bool) -} - -#[inline] -pub(crate) fn set_ip_multicast_ttl(fd: BorrowedFd<'_>, multicast_ttl: u32) -> io::Result<()> { - setsockopt(fd, c::IPPROTO_IP, c::IP_MULTICAST_TTL, multicast_ttl) -} - -#[inline] -pub(crate) fn get_ip_multicast_ttl(fd: BorrowedFd<'_>) -> io::Result { - getsockopt(fd, c::IPPROTO_IP, c::IP_MULTICAST_TTL) -} - -#[inline] -pub(crate) fn set_ipv6_multicast_loop(fd: BorrowedFd<'_>, multicast_loop: bool) -> io::Result<()> { - setsockopt( - fd, - c::IPPROTO_IPV6, - c::IPV6_MULTICAST_LOOP, - from_bool(multicast_loop), - ) -} - -#[inline] -pub(crate) fn get_ipv6_multicast_loop(fd: BorrowedFd<'_>) -> io::Result { - getsockopt(fd, c::IPPROTO_IPV6, c::IPV6_MULTICAST_LOOP).map(to_bool) -} - -#[inline] -pub(crate) fn set_ipv6_multicast_hops(fd: BorrowedFd<'_>, multicast_hops: u32) -> io::Result<()> { - setsockopt(fd, c::IPPROTO_IP, c::IPV6_MULTICAST_HOPS, multicast_hops) -} - -#[inline] -pub(crate) fn get_ipv6_multicast_hops(fd: BorrowedFd<'_>) -> io::Result { - getsockopt(fd, c::IPPROTO_IP, c::IPV6_MULTICAST_HOPS) -} - -#[inline] -pub(crate) fn set_ip_add_membership( - fd: BorrowedFd<'_>, - multiaddr: &Ipv4Addr, - interface: &Ipv4Addr, -) -> io::Result<()> { - let mreq = to_ip_mreq(multiaddr, interface); - setsockopt(fd, c::IPPROTO_IP, c::IP_ADD_MEMBERSHIP, mreq) -} - -#[inline] -pub(crate) fn set_ip_add_membership_with_ifindex( - fd: BorrowedFd<'_>, - multiaddr: &Ipv4Addr, - address: &Ipv4Addr, - ifindex: i32, -) -> io::Result<()> { - let mreqn = to_ip_mreqn(multiaddr, address, ifindex); - setsockopt(fd, c::IPPROTO_IP, c::IP_ADD_MEMBERSHIP, mreqn) -} - -#[inline] -pub(crate) fn set_ip_add_source_membership( - fd: BorrowedFd<'_>, - multiaddr: &Ipv4Addr, - interface: &Ipv4Addr, - sourceaddr: &Ipv4Addr, -) -> io::Result<()> { - let mreq_source = to_imr_source(multiaddr, interface, sourceaddr); - setsockopt(fd, c::IPPROTO_IP, c::IP_ADD_SOURCE_MEMBERSHIP, mreq_source) -} - -#[inline] -pub(crate) fn set_ip_drop_source_membership( - fd: BorrowedFd<'_>, - multiaddr: &Ipv4Addr, - interface: &Ipv4Addr, - sourceaddr: &Ipv4Addr, -) -> io::Result<()> { - let mreq_source = to_imr_source(multiaddr, interface, sourceaddr); - setsockopt(fd, c::IPPROTO_IP, c::IP_DROP_SOURCE_MEMBERSHIP, mreq_source) -} - -#[inline] -pub(crate) fn set_ipv6_add_membership( - fd: BorrowedFd<'_>, - multiaddr: &Ipv6Addr, - interface: u32, -) -> io::Result<()> { - let mreq = to_ipv6mr(multiaddr, interface); - setsockopt(fd, c::IPPROTO_IPV6, c::IPV6_ADD_MEMBERSHIP, mreq) -} - -#[inline] -pub(crate) fn set_ip_drop_membership( - fd: BorrowedFd<'_>, - multiaddr: &Ipv4Addr, - interface: &Ipv4Addr, -) -> io::Result<()> { - let mreq = to_ip_mreq(multiaddr, interface); - setsockopt(fd, c::IPPROTO_IP, c::IP_DROP_MEMBERSHIP, mreq) -} - -#[inline] -pub(crate) fn set_ip_drop_membership_with_ifindex( - fd: BorrowedFd<'_>, - multiaddr: &Ipv4Addr, - address: &Ipv4Addr, - ifindex: i32, -) -> io::Result<()> { - let mreqn = to_ip_mreqn(multiaddr, address, ifindex); - setsockopt(fd, c::IPPROTO_IP, c::IP_DROP_MEMBERSHIP, mreqn) -} - -#[inline] -pub(crate) fn set_ipv6_drop_membership( - fd: BorrowedFd<'_>, - multiaddr: &Ipv6Addr, - interface: u32, -) -> io::Result<()> { - let mreq = to_ipv6mr(multiaddr, interface); - setsockopt(fd, c::IPPROTO_IPV6, c::IPV6_DROP_MEMBERSHIP, mreq) -} - -#[inline] -pub(crate) fn get_ipv6_unicast_hops(fd: BorrowedFd<'_>) -> io::Result { - getsockopt(fd, c::IPPROTO_IPV6, c::IPV6_UNICAST_HOPS).map(|hops: c::c_int| hops as u8) -} - -#[inline] -pub(crate) fn set_ipv6_unicast_hops(fd: BorrowedFd<'_>, hops: Option) -> io::Result<()> { - let hops = match hops { - Some(hops) => hops.into(), - None => -1, - }; - setsockopt(fd, c::IPPROTO_IPV6, c::IPV6_UNICAST_HOPS, hops) -} - -#[inline] -pub(crate) fn set_ip_tos(fd: BorrowedFd<'_>, value: u8) -> io::Result<()> { - setsockopt(fd, c::IPPROTO_IP, c::IP_TOS, i32::from(value)) -} - -#[inline] -pub(crate) fn get_ip_tos(fd: BorrowedFd<'_>) -> io::Result { - let value: i32 = getsockopt(fd, c::IPPROTO_IP, c::IP_TOS)?; - Ok(value as u8) -} - -#[inline] -pub(crate) fn set_ip_recvtos(fd: BorrowedFd<'_>, value: bool) -> io::Result<()> { - setsockopt(fd, c::IPPROTO_IP, c::IP_RECVTOS, from_bool(value)) -} - -#[inline] -pub(crate) fn get_ip_recvtos(fd: BorrowedFd<'_>) -> io::Result { - getsockopt(fd, c::IPPROTO_IP, c::IP_RECVTOS).map(to_bool) -} - -#[inline] -pub(crate) fn set_ipv6_recvtclass(fd: BorrowedFd<'_>, value: bool) -> io::Result<()> { - setsockopt(fd, c::IPPROTO_IPV6, c::IPV6_RECVTCLASS, from_bool(value)) -} - -#[inline] -pub(crate) fn get_ipv6_recvtclass(fd: BorrowedFd<'_>) -> io::Result { - getsockopt(fd, c::IPPROTO_IPV6, c::IPV6_RECVTCLASS).map(to_bool) -} - -#[inline] -pub(crate) fn set_ip_freebind(fd: BorrowedFd<'_>, value: bool) -> io::Result<()> { - setsockopt(fd, c::IPPROTO_IP, c::IP_FREEBIND, from_bool(value)) -} - -#[inline] -pub(crate) fn get_ip_freebind(fd: BorrowedFd<'_>) -> io::Result { - getsockopt(fd, c::IPPROTO_IP, c::IP_FREEBIND).map(to_bool) -} - -#[inline] -pub(crate) fn set_ipv6_freebind(fd: BorrowedFd<'_>, value: bool) -> io::Result<()> { - setsockopt(fd, c::IPPROTO_IPV6, c::IPV6_FREEBIND, from_bool(value)) -} - -#[inline] -pub(crate) fn get_ipv6_freebind(fd: BorrowedFd<'_>) -> io::Result { - getsockopt(fd, c::IPPROTO_IPV6, c::IPV6_FREEBIND).map(to_bool) -} - -#[inline] -pub(crate) fn get_ip_original_dst(fd: BorrowedFd<'_>) -> io::Result { - let level = c::IPPROTO_IP; - let optname = c::SO_ORIGINAL_DST; - let mut value = MaybeUninit::::uninit(); - let mut optlen = core::mem::size_of_val(&value).try_into().unwrap(); - - getsockopt_raw(fd, level, optname, &mut value, &mut optlen)?; - - let any = unsafe { SocketAddrAny::read(value.as_ptr(), optlen as usize)? }; - match any { - SocketAddrAny::V4(v4) => Ok(v4), - _ => unreachable!(), - } -} - -#[inline] -pub(crate) fn get_ipv6_original_dst(fd: BorrowedFd<'_>) -> io::Result { - let level = c::IPPROTO_IPV6; - let optname = c::IP6T_SO_ORIGINAL_DST; - let mut value = MaybeUninit::::uninit(); - let mut optlen = core::mem::size_of_val(&value).try_into().unwrap(); - - getsockopt_raw(fd, level, optname, &mut value, &mut optlen)?; - - let any = unsafe { SocketAddrAny::read(value.as_ptr(), optlen as usize)? }; - match any { - SocketAddrAny::V6(v6) => Ok(v6), - _ => unreachable!(), - } -} - -#[inline] -pub(crate) fn set_ipv6_tclass(fd: BorrowedFd<'_>, value: u32) -> io::Result<()> { - setsockopt(fd, c::IPPROTO_IPV6, c::IPV6_TCLASS, value) -} - -#[inline] -pub(crate) fn get_ipv6_tclass(fd: BorrowedFd<'_>) -> io::Result { - getsockopt(fd, c::IPPROTO_IPV6, c::IPV6_TCLASS) -} - -#[inline] -pub(crate) fn set_tcp_nodelay(fd: BorrowedFd<'_>, nodelay: bool) -> io::Result<()> { - setsockopt(fd, c::IPPROTO_TCP, c::TCP_NODELAY, from_bool(nodelay)) -} - -#[inline] -pub(crate) fn get_tcp_nodelay(fd: BorrowedFd<'_>) -> io::Result { - getsockopt(fd, c::IPPROTO_TCP, c::TCP_NODELAY).map(to_bool) -} - -#[inline] -pub(crate) fn set_tcp_keepcnt(fd: BorrowedFd<'_>, count: u32) -> io::Result<()> { - setsockopt(fd, c::IPPROTO_TCP, c::TCP_KEEPCNT, count) -} - -#[inline] -pub(crate) fn get_tcp_keepcnt(fd: BorrowedFd<'_>) -> io::Result { - getsockopt(fd, c::IPPROTO_TCP, c::TCP_KEEPCNT) -} - -#[inline] -pub(crate) fn set_tcp_keepidle(fd: BorrowedFd<'_>, duration: Duration) -> io::Result<()> { - let secs: c::c_uint = duration_to_secs(duration)?; - setsockopt(fd, c::IPPROTO_TCP, c::TCP_KEEPIDLE, secs) -} - -#[inline] -pub(crate) fn get_tcp_keepidle(fd: BorrowedFd<'_>) -> io::Result { - let secs: c::c_uint = getsockopt(fd, c::IPPROTO_TCP, c::TCP_KEEPIDLE)?; - Ok(Duration::from_secs(secs as u64)) -} - -#[inline] -pub(crate) fn set_tcp_keepintvl(fd: BorrowedFd<'_>, duration: Duration) -> io::Result<()> { - let secs: c::c_uint = duration_to_secs(duration)?; - setsockopt(fd, c::IPPROTO_TCP, c::TCP_KEEPINTVL, secs) -} - -#[inline] -pub(crate) fn get_tcp_keepintvl(fd: BorrowedFd<'_>) -> io::Result { - let secs: c::c_uint = getsockopt(fd, c::IPPROTO_TCP, c::TCP_KEEPINTVL)?; - Ok(Duration::from_secs(secs as u64)) -} - -#[inline] -pub(crate) fn set_tcp_user_timeout(fd: BorrowedFd<'_>, value: u32) -> io::Result<()> { - setsockopt(fd, c::IPPROTO_TCP, c::TCP_USER_TIMEOUT, value) -} - -#[inline] -pub(crate) fn get_tcp_user_timeout(fd: BorrowedFd<'_>) -> io::Result { - getsockopt(fd, c::IPPROTO_TCP, c::TCP_USER_TIMEOUT) -} - -#[inline] -pub(crate) fn set_tcp_quickack(fd: BorrowedFd<'_>, value: bool) -> io::Result<()> { - setsockopt(fd, c::IPPROTO_TCP, c::TCP_QUICKACK, from_bool(value)) -} - -#[inline] -pub(crate) fn get_tcp_quickack(fd: BorrowedFd<'_>) -> io::Result { - getsockopt(fd, c::IPPROTO_TCP, c::TCP_QUICKACK).map(to_bool) -} - -#[inline] -pub(crate) fn set_tcp_congestion(fd: BorrowedFd<'_>, value: &str) -> io::Result<()> { - let level = c::IPPROTO_TCP; - let optname = c::TCP_CONGESTION; - let optlen = value.len().try_into().unwrap(); - setsockopt_raw(fd, level, optname, value.as_ptr(), optlen) -} - -#[cfg(feature = "alloc")] -#[inline] -pub(crate) fn get_tcp_congestion(fd: BorrowedFd<'_>) -> io::Result { - let level = c::IPPROTO_TCP; - let optname = c::TCP_CONGESTION; - const OPTLEN: c::socklen_t = 16; - let mut value = MaybeUninit::<[MaybeUninit; OPTLEN as usize]>::uninit(); - let mut optlen = OPTLEN; - getsockopt_raw(fd, level, optname, &mut value, &mut optlen)?; - unsafe { - let value = value.assume_init(); - let slice: &[u8] = core::mem::transmute(&value[..optlen as usize]); - assert!(slice.iter().any(|b| *b == b'\0')); - Ok( - core::str::from_utf8(CStr::from_ptr(slice.as_ptr().cast()).to_bytes()) - .unwrap() - .to_owned(), - ) - } -} - -#[inline] -pub(crate) fn set_tcp_thin_linear_timeouts(fd: BorrowedFd<'_>, value: bool) -> io::Result<()> { - setsockopt( - fd, - c::IPPROTO_TCP, - c::TCP_THIN_LINEAR_TIMEOUTS, - from_bool(value), - ) -} - -#[inline] -pub(crate) fn get_tcp_thin_linear_timeouts(fd: BorrowedFd<'_>) -> io::Result { - getsockopt(fd, c::IPPROTO_TCP, c::TCP_THIN_LINEAR_TIMEOUTS).map(to_bool) -} - -#[inline] -pub(crate) fn set_tcp_cork(fd: BorrowedFd<'_>, value: bool) -> io::Result<()> { - setsockopt(fd, c::IPPROTO_TCP, c::TCP_CORK, from_bool(value)) -} - -#[inline] -pub(crate) fn get_tcp_cork(fd: BorrowedFd<'_>) -> io::Result { - getsockopt(fd, c::IPPROTO_TCP, c::TCP_CORK).map(to_bool) -} - -#[inline] -pub(crate) fn get_socket_peercred(fd: BorrowedFd<'_>) -> io::Result { - getsockopt(fd, c::SOL_SOCKET, linux_raw_sys::net::SO_PEERCRED) -} - -#[inline] -fn to_ip_mreq(multiaddr: &Ipv4Addr, interface: &Ipv4Addr) -> c::ip_mreq { - c::ip_mreq { - imr_multiaddr: to_imr_addr(multiaddr), - imr_interface: to_imr_addr(interface), - } -} - -#[inline] -fn to_ip_mreqn(multiaddr: &Ipv4Addr, address: &Ipv4Addr, ifindex: i32) -> c::ip_mreqn { - c::ip_mreqn { - imr_multiaddr: to_imr_addr(multiaddr), - imr_address: to_imr_addr(address), - imr_ifindex: ifindex, - } -} - -#[inline] -fn to_imr_source( - multiaddr: &Ipv4Addr, - interface: &Ipv4Addr, - sourceaddr: &Ipv4Addr, -) -> c::ip_mreq_source { - c::ip_mreq_source { - imr_multiaddr: to_imr_addr(multiaddr).s_addr, - imr_interface: to_imr_addr(interface).s_addr, - imr_sourceaddr: to_imr_addr(sourceaddr).s_addr, - } -} - -#[inline] -fn to_imr_addr(addr: &Ipv4Addr) -> c::in_addr { - c::in_addr { - s_addr: u32::from_ne_bytes(addr.octets()), - } -} - -#[inline] -fn to_ipv6mr(multiaddr: &Ipv6Addr, interface: u32) -> c::ipv6_mreq { - c::ipv6_mreq { - ipv6mr_multiaddr: to_ipv6mr_multiaddr(multiaddr), - ipv6mr_ifindex: to_ipv6mr_interface(interface), - } -} - -#[inline] -fn to_ipv6mr_multiaddr(multiaddr: &Ipv6Addr) -> c::in6_addr { - c::in6_addr { - in6_u: linux_raw_sys::net::in6_addr__bindgen_ty_1 { - u6_addr8: multiaddr.octets(), - }, - } -} - -#[inline] -fn to_ipv6mr_interface(interface: u32) -> c::c_int { - interface as c::c_int -} - -#[inline] -fn from_bool(value: bool) -> c::c_uint { - c::c_uint::from(value) -} - -#[inline] -fn to_bool(value: c::c_uint) -> bool { - value != 0 -} - -/// Convert to seconds, rounding up if necessary. -#[inline] -fn duration_to_secs>(duration: Duration) -> io::Result { - let mut secs = duration.as_secs(); - if duration.subsec_nanos() != 0 { - secs = secs.checked_add(1).ok_or(io::Errno::INVAL)?; - } - T::try_from(secs).map_err(|_e| io::Errno::INVAL) -} diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/net/syscalls.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/net/syscalls.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/net/syscalls.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/net/syscalls.rs 2023-10-30 19:40:00.000000000 +0000 @@ -3,7 +3,8 @@ //! # Safety //! //! See the `rustix::backend` module documentation for details. -#![allow(unsafe_code, clippy::undocumented_unsafe_blocks)] +#![allow(unsafe_code)] +#![allow(clippy::undocumented_unsafe_blocks)] use super::msghdr::{ with_noaddr_msghdr, with_recv_msghdr, with_unix_msghdr, with_v4_msghdr, with_v6_msghdr, @@ -30,8 +31,8 @@ crate::backend::reg::{ArgReg, SocketArg}, linux_raw_sys::net::{ SYS_ACCEPT, SYS_ACCEPT4, SYS_BIND, SYS_CONNECT, SYS_GETPEERNAME, SYS_GETSOCKNAME, - SYS_LISTEN, SYS_RECV, SYS_RECVFROM, SYS_RECVMSG, SYS_SEND, SYS_SENDMSG, SYS_SENDTO, - SYS_SHUTDOWN, SYS_SOCKET, SYS_SOCKETPAIR, + SYS_GETSOCKOPT, SYS_LISTEN, SYS_RECV, SYS_RECVFROM, SYS_RECVMSG, SYS_SEND, SYS_SENDMSG, + SYS_SENDTO, SYS_SETSOCKOPT, SYS_SHUTDOWN, SYS_SOCKET, SYS_SOCKETPAIR, }, }; @@ -50,7 +51,7 @@ ret_owned_fd(syscall_readonly!( __NR_socketcall, x86_sys(SYS_SOCKET), - slice_just_addr::, _>(&[ + slice_just_addr::, _>(&[ family.into(), type_.into(), protocol.into(), @@ -80,7 +81,7 @@ ret_owned_fd(syscall_readonly!( __NR_socketcall, x86_sys(SYS_SOCKET), - slice_just_addr::, _>(&[ + slice_just_addr::, _>(&[ family.into(), (type_, flags).into(), protocol.into(), @@ -115,7 +116,7 @@ ret(syscall!( __NR_socketcall, x86_sys(SYS_SOCKETPAIR), - slice_just_addr::, _>(&[ + slice_just_addr::, _>(&[ family.into(), (type_, flags).into(), protocol.into(), @@ -139,7 +140,7 @@ let fd = ret_owned_fd(syscall_readonly!( __NR_socketcall, x86_sys(SYS_ACCEPT), - slice_just_addr::, _>(&[fd.into(), zero(), zero()]) + slice_just_addr::, _>(&[fd.into(), zero(), zero()]) ))?; Ok(fd) } @@ -157,7 +158,7 @@ let fd = ret_owned_fd(syscall_readonly!( __NR_socketcall, x86_sys(SYS_ACCEPT4), - slice_just_addr::, _>(&[fd.into(), zero(), zero(), flags.into()]) + slice_just_addr::, _>(&[fd.into(), zero(), zero(), flags.into()]) ))?; Ok(fd) } @@ -187,7 +188,7 @@ let fd = ret_owned_fd(syscall!( __NR_socketcall, x86_sys(SYS_ACCEPT), - slice_just_addr::, _>(&[ + slice_just_addr::, _>(&[ fd.into(), (&mut storage).into(), by_mut(&mut addrlen), @@ -228,7 +229,7 @@ let fd = ret_owned_fd(syscall!( __NR_socketcall, x86_sys(SYS_ACCEPT4), - slice_just_addr::, _>(&[ + slice_just_addr::, _>(&[ fd.into(), (&mut storage).into(), by_mut(&mut addrlen), @@ -261,7 +262,7 @@ ret_usize(syscall!( __NR_socketcall, x86_sys(SYS_RECVMSG), - slice_just_addr::, _>(&[ + slice_just_addr::, _>(&[ sockfd.into(), by_mut(msghdr), msg_flags.into(), @@ -300,7 +301,7 @@ ret_usize(syscall!( __NR_socketcall, x86_sys(SYS_SENDMSG), - slice_just_addr::, _>(&[ + slice_just_addr::, _>(&[ sockfd.into(), by_ref(&msghdr), msg_flags.into() @@ -330,7 +331,7 @@ ret_usize(syscall!( __NR_socketcall, x86_sys(SYS_SENDMSG), - slice_just_addr::, _>(&[ + slice_just_addr::, _>(&[ sockfd.into(), by_ref(&msghdr), msg_flags.into(), @@ -360,7 +361,7 @@ ret_usize(syscall!( __NR_socketcall, x86_sys(SYS_SENDMSG), - slice_just_addr::, _>(&[ + slice_just_addr::, _>(&[ sockfd.into(), by_ref(&msghdr), msg_flags.into() @@ -390,7 +391,7 @@ ret_usize(syscall!( __NR_socketcall, x86_sys(SYS_SENDMSG), - slice_just_addr::, _>(&[ + slice_just_addr::, _>(&[ sockfd.into(), by_ref(&msghdr), msg_flags.into() @@ -417,7 +418,7 @@ ret(syscall_readonly!( __NR_socketcall, x86_sys(SYS_SHUTDOWN), - slice_just_addr::, _>(&[fd.into(), c_uint(how as c::c_uint)]) + slice_just_addr::, _>(&[fd.into(), c_uint(how as c::c_uint)]) )) } } @@ -460,12 +461,7 @@ ret_usize(syscall_readonly!( __NR_socketcall, x86_sys(SYS_SEND), - slice_just_addr::, _>(&[ - fd.into(), - buf_addr, - buf_len, - flags.into() - ]) + slice_just_addr::, _>(&[fd.into(), buf_addr, buf_len, flags.into()]) )) } } @@ -496,7 +492,7 @@ ret_usize(syscall_readonly!( __NR_socketcall, x86_sys(SYS_SENDTO), - slice_just_addr::, _>(&[ + slice_just_addr::, _>(&[ fd.into(), buf_addr, buf_len, @@ -534,7 +530,7 @@ ret_usize(syscall_readonly!( __NR_socketcall, x86_sys(SYS_SENDTO), - slice_just_addr::, _>(&[ + slice_just_addr::, _>(&[ fd.into(), buf_addr, buf_len, @@ -572,7 +568,7 @@ ret_usize(syscall_readonly!( __NR_socketcall, x86_sys(SYS_SENDTO), - slice_just_addr::, _>(&[ + slice_just_addr::, _>(&[ fd.into(), buf_addr, buf_len, @@ -622,7 +618,7 @@ ret_usize(syscall!( __NR_socketcall, x86_sys(SYS_RECV), - slice_just_addr::, _>(&[ + slice_just_addr::, _>(&[ fd.into(), buf_addr_mut, buf_len, @@ -663,7 +659,7 @@ let nread = ret_usize(syscall!( __NR_socketcall, x86_sys(SYS_RECVFROM), - slice_just_addr::, _>(&[ + slice_just_addr::, _>(&[ fd.into(), buf_addr_mut, buf_len, @@ -704,7 +700,7 @@ ret(syscall!( __NR_socketcall, x86_sys(SYS_GETPEERNAME), - slice_just_addr::, _>(&[ + slice_just_addr::, _>(&[ fd.into(), (&mut storage).into(), by_mut(&mut addrlen), @@ -741,7 +737,7 @@ ret(syscall!( __NR_socketcall, x86_sys(SYS_GETSOCKNAME), - slice_just_addr::, _>(&[ + slice_just_addr::, _>(&[ fd.into(), (&mut storage).into(), by_mut(&mut addrlen), @@ -770,7 +766,7 @@ ret(syscall_readonly!( __NR_socketcall, x86_sys(SYS_BIND), - slice_just_addr::, _>(&[ + slice_just_addr::, _>(&[ fd.into(), by_ref(&encode_sockaddr_v4(addr)), size_of::(), @@ -795,7 +791,7 @@ ret(syscall_readonly!( __NR_socketcall, x86_sys(SYS_BIND), - slice_just_addr::, _>(&[ + slice_just_addr::, _>(&[ fd.into(), by_ref(&encode_sockaddr_v6(addr)), size_of::(), @@ -820,7 +816,7 @@ ret(syscall_readonly!( __NR_socketcall, x86_sys(SYS_BIND), - slice_just_addr::, _>(&[ + slice_just_addr::, _>(&[ fd.into(), by_ref(&addr.unix), socklen_t(addr.addr_len()), @@ -845,7 +841,7 @@ ret(syscall_readonly!( __NR_socketcall, x86_sys(SYS_CONNECT), - slice_just_addr::, _>(&[ + slice_just_addr::, _>(&[ fd.into(), by_ref(&encode_sockaddr_v4(addr)), size_of::(), @@ -870,7 +866,7 @@ ret(syscall_readonly!( __NR_socketcall, x86_sys(SYS_CONNECT), - slice_just_addr::, _>(&[ + slice_just_addr::, _>(&[ fd.into(), by_ref(&encode_sockaddr_v6(addr)), size_of::(), @@ -895,7 +891,7 @@ ret(syscall_readonly!( __NR_socketcall, x86_sys(SYS_CONNECT), - slice_just_addr::, _>(&[ + slice_just_addr::, _>(&[ fd.into(), by_ref(&addr.unix), socklen_t(addr.addr_len()), @@ -905,45 +901,576 @@ } #[inline] -pub(crate) fn connect_unspec(fd: BorrowedFd<'_>) -> io::Result<()> { - debug_assert_eq!(c::AF_UNSPEC, 0); - let addr = MaybeUninit::::zeroed(); - +pub(crate) fn listen(fd: BorrowedFd<'_>, backlog: c::c_int) -> io::Result<()> { #[cfg(not(target_arch = "x86"))] unsafe { - ret(syscall_readonly!( - __NR_connect, - fd, - by_ref(&addr), - size_of::() - )) + ret(syscall_readonly!(__NR_listen, fd, c_int(backlog))) } #[cfg(target_arch = "x86")] unsafe { ret(syscall_readonly!( __NR_socketcall, - x86_sys(SYS_CONNECT), - slice_just_addr::, _>(&[ - fd.into(), - by_ref(&addr), - size_of::(), - ]) + x86_sys(SYS_LISTEN), + slice_just_addr::, _>(&[fd.into(), c_int(backlog)]) )) } } -#[inline] -pub(crate) fn listen(fd: BorrowedFd<'_>, backlog: c::c_int) -> io::Result<()> { - #[cfg(not(target_arch = "x86"))] - unsafe { - ret(syscall_readonly!(__NR_listen, fd, c_int(backlog))) +pub(crate) mod sockopt { + use super::{c, BorrowedFd}; + use crate::io; + use crate::net::sockopt::Timeout; + use crate::net::{AddressFamily, Ipv4Addr, Ipv6Addr, SocketType}; + use c::{SO_RCVTIMEO_NEW, SO_RCVTIMEO_OLD, SO_SNDTIMEO_NEW, SO_SNDTIMEO_OLD}; + use core::time::Duration; + use linux_raw_sys::general::{__kernel_timespec, timeval}; + + #[inline] + fn getsockopt(fd: BorrowedFd<'_>, level: u32, optname: u32) -> io::Result { + use super::*; + + let mut optlen = core::mem::size_of::(); + debug_assert!( + optlen as usize >= core::mem::size_of::(), + "Socket APIs don't ever use `bool` directly" + ); + + #[cfg(not(target_arch = "x86"))] + unsafe { + let mut value = MaybeUninit::::uninit(); + ret(syscall!( + __NR_getsockopt, + fd, + c_uint(level), + c_uint(optname), + &mut value, + by_mut(&mut optlen) + ))?; + + assert_eq!( + optlen as usize, + core::mem::size_of::(), + "unexpected getsockopt size" + ); + Ok(value.assume_init()) + } + #[cfg(target_arch = "x86")] + unsafe { + let mut value = MaybeUninit::::uninit(); + ret(syscall!( + __NR_socketcall, + x86_sys(SYS_GETSOCKOPT), + slice_just_addr::, _>(&[ + fd.into(), + c_uint(level), + c_uint(optname), + (&mut value).into(), + by_mut(&mut optlen), + ]) + ))?; + assert_eq!( + optlen as usize, + core::mem::size_of::(), + "unexpected getsockopt size" + ); + Ok(value.assume_init()) + } + } + + #[inline] + fn setsockopt( + fd: BorrowedFd<'_>, + level: u32, + optname: u32, + value: T, + ) -> io::Result<()> { + use super::*; + + let optlen = core::mem::size_of::().try_into().unwrap(); + debug_assert!( + optlen as usize >= core::mem::size_of::(), + "Socket APIs don't ever use `bool` directly" + ); + + #[cfg(not(target_arch = "x86"))] + unsafe { + ret(syscall_readonly!( + __NR_setsockopt, + fd, + c_uint(level), + c_uint(optname), + by_ref(&value), + socklen_t(optlen) + )) + } + #[cfg(target_arch = "x86")] + unsafe { + ret(syscall_readonly!( + __NR_socketcall, + x86_sys(SYS_SETSOCKOPT), + slice_just_addr::, _>(&[ + fd.into(), + c_uint(level), + c_uint(optname), + by_ref(&value), + socklen_t(optlen), + ]) + )) + } } - #[cfg(target_arch = "x86")] - unsafe { - ret(syscall_readonly!( - __NR_socketcall, - x86_sys(SYS_LISTEN), - slice_just_addr::, _>(&[fd.into(), c_int(backlog)]) + + #[inline] + pub(crate) fn get_socket_type(fd: BorrowedFd<'_>) -> io::Result { + getsockopt(fd, c::SOL_SOCKET as _, c::SO_TYPE) + } + + #[inline] + pub(crate) fn set_socket_reuseaddr(fd: BorrowedFd<'_>, reuseaddr: bool) -> io::Result<()> { + setsockopt( + fd, + c::SOL_SOCKET as _, + c::SO_REUSEADDR, + from_bool(reuseaddr), + ) + } + + #[inline] + pub(crate) fn set_socket_broadcast(fd: BorrowedFd<'_>, broadcast: bool) -> io::Result<()> { + setsockopt( + fd, + c::SOL_SOCKET as _, + c::SO_BROADCAST, + from_bool(broadcast), + ) + } + + #[inline] + pub(crate) fn get_socket_broadcast(fd: BorrowedFd<'_>) -> io::Result { + getsockopt(fd, c::SOL_SOCKET as _, c::SO_BROADCAST).map(to_bool) + } + + #[inline] + pub(crate) fn set_socket_linger( + fd: BorrowedFd<'_>, + linger: Option, + ) -> io::Result<()> { + // Convert `linger` to seconds, rounding up. + let l_linger = if let Some(linger) = linger { + let mut l_linger = linger.as_secs(); + if linger.subsec_nanos() != 0 { + l_linger = l_linger.checked_add(1).ok_or(io::Errno::INVAL)?; + } + l_linger.try_into().map_err(|_e| io::Errno::INVAL)? + } else { + 0 + }; + let linger = c::linger { + l_onoff: c::c_int::from(linger.is_some()), + l_linger, + }; + setsockopt(fd, c::SOL_SOCKET as _, c::SO_LINGER, linger) + } + + #[inline] + pub(crate) fn get_socket_linger(fd: BorrowedFd<'_>) -> io::Result> { + let linger: c::linger = getsockopt(fd, c::SOL_SOCKET as _, c::SO_LINGER)?; + Ok((linger.l_onoff != 0).then(|| Duration::from_secs(linger.l_linger as u64))) + } + + #[inline] + pub(crate) fn set_socket_passcred(fd: BorrowedFd<'_>, passcred: bool) -> io::Result<()> { + setsockopt(fd, c::SOL_SOCKET as _, c::SO_PASSCRED, from_bool(passcred)) + } + + #[inline] + pub(crate) fn get_socket_passcred(fd: BorrowedFd<'_>) -> io::Result { + getsockopt(fd, c::SOL_SOCKET as _, c::SO_PASSCRED).map(to_bool) + } + + #[inline] + pub(crate) fn set_socket_timeout( + fd: BorrowedFd<'_>, + id: Timeout, + timeout: Option, + ) -> io::Result<()> { + let time = duration_to_linux(timeout)?; + let optname = match id { + Timeout::Recv => SO_RCVTIMEO_NEW, + Timeout::Send => SO_SNDTIMEO_NEW, + }; + match setsockopt(fd, c::SOL_SOCKET, optname, time) { + Err(io::Errno::NOPROTOOPT) if SO_RCVTIMEO_NEW != SO_RCVTIMEO_OLD => { + set_socket_timeout_old(fd, id, timeout) + } + otherwise => otherwise, + } + } + + /// Same as `set_socket_timeout` but uses `timeval` instead of + /// `__kernel_timespec` and `_OLD` constants instead of `_NEW`. + fn set_socket_timeout_old( + fd: BorrowedFd<'_>, + id: Timeout, + timeout: Option, + ) -> io::Result<()> { + let time = duration_to_linux_old(timeout)?; + let optname = match id { + Timeout::Recv => SO_RCVTIMEO_OLD, + Timeout::Send => SO_SNDTIMEO_OLD, + }; + setsockopt(fd, c::SOL_SOCKET, optname, time) + } + + #[inline] + pub(crate) fn get_socket_timeout( + fd: BorrowedFd<'_>, + id: Timeout, + ) -> io::Result> { + let optname = match id { + Timeout::Recv => SO_RCVTIMEO_NEW, + Timeout::Send => SO_SNDTIMEO_NEW, + }; + let time: __kernel_timespec = match getsockopt(fd, c::SOL_SOCKET, optname) { + Err(io::Errno::NOPROTOOPT) if SO_RCVTIMEO_NEW != SO_RCVTIMEO_OLD => { + return get_socket_timeout_old(fd, id) + } + otherwise => otherwise?, + }; + Ok(duration_from_linux(time)) + } + + /// Same as `get_socket_timeout` but uses `timeval` instead of + /// `__kernel_timespec` and `_OLD` constants instead of `_NEW`. + fn get_socket_timeout_old(fd: BorrowedFd<'_>, id: Timeout) -> io::Result> { + let optname = match id { + Timeout::Recv => SO_RCVTIMEO_OLD, + Timeout::Send => SO_SNDTIMEO_OLD, + }; + let time: timeval = getsockopt(fd, c::SOL_SOCKET, optname)?; + Ok(duration_from_linux_old(time)) + } + + /// Convert a C `timespec` to a Rust `Option`. + #[inline] + fn duration_from_linux(time: __kernel_timespec) -> Option { + if time.tv_sec == 0 && time.tv_nsec == 0 { + None + } else { + Some( + Duration::from_secs(time.tv_sec as u64) + Duration::from_nanos(time.tv_nsec as u64), + ) + } + } + + /// Like `duration_from_linux` but uses Linux's old 32-bit `timeval`. + fn duration_from_linux_old(time: timeval) -> Option { + if time.tv_sec == 0 && time.tv_usec == 0 { + None + } else { + Some( + Duration::from_secs(time.tv_sec as u64) + + Duration::from_micros(time.tv_usec as u64), + ) + } + } + + /// Convert a Rust `Option` to a C `timespec`. + #[inline] + fn duration_to_linux(timeout: Option) -> io::Result<__kernel_timespec> { + Ok(match timeout { + Some(timeout) => { + if timeout == Duration::ZERO { + return Err(io::Errno::INVAL); + } + let mut timeout = __kernel_timespec { + tv_sec: timeout.as_secs().try_into().unwrap_or(i64::MAX), + tv_nsec: timeout.subsec_nanos().into(), + }; + if timeout.tv_sec == 0 && timeout.tv_nsec == 0 { + timeout.tv_nsec = 1; + } + timeout + } + None => __kernel_timespec { + tv_sec: 0, + tv_nsec: 0, + }, + }) + } + + /// Like `duration_to_linux` but uses Linux's old 32-bit `timeval`. + fn duration_to_linux_old(timeout: Option) -> io::Result { + Ok(match timeout { + Some(timeout) => { + if timeout == Duration::ZERO { + return Err(io::Errno::INVAL); + } + + // `subsec_micros` rounds down, so we use `subsec_nanos` and + // manually round up. + let mut timeout = timeval { + tv_sec: timeout.as_secs().try_into().unwrap_or(c::c_long::MAX), + tv_usec: ((timeout.subsec_nanos() + 999) / 1000) as _, + }; + if timeout.tv_sec == 0 && timeout.tv_usec == 0 { + timeout.tv_usec = 1; + } + timeout + } + None => timeval { + tv_sec: 0, + tv_usec: 0, + }, + }) + } + + #[inline] + pub(crate) fn get_socket_error(fd: BorrowedFd<'_>) -> io::Result> { + let err: c::c_int = getsockopt(fd, c::SOL_SOCKET as _, c::SO_ERROR)?; + Ok(if err == 0 { + Ok(()) + } else { + Err(io::Errno::from_raw_os_error(err)) + }) + } + + #[inline] + pub(crate) fn set_socket_keepalive(fd: BorrowedFd<'_>, keepalive: bool) -> io::Result<()> { + setsockopt( + fd, + c::SOL_SOCKET as _, + c::SO_KEEPALIVE, + from_bool(keepalive), + ) + } + + #[inline] + pub(crate) fn get_socket_keepalive(fd: BorrowedFd<'_>) -> io::Result { + getsockopt(fd, c::SOL_SOCKET as _, c::SO_KEEPALIVE).map(to_bool) + } + + #[inline] + pub(crate) fn set_socket_recv_buffer_size(fd: BorrowedFd<'_>, size: usize) -> io::Result<()> { + let size: c::c_int = size.try_into().map_err(|_| io::Errno::OVERFLOW)?; + setsockopt(fd, c::SOL_SOCKET as _, c::SO_RCVBUF, size) + } + + #[inline] + pub(crate) fn get_socket_recv_buffer_size(fd: BorrowedFd<'_>) -> io::Result { + getsockopt(fd, c::SOL_SOCKET as _, c::SO_RCVBUF).map(|size: u32| size as usize) + } + + #[inline] + pub(crate) fn set_socket_send_buffer_size(fd: BorrowedFd<'_>, size: usize) -> io::Result<()> { + let size: c::c_int = size.try_into().map_err(|_| io::Errno::OVERFLOW)?; + setsockopt(fd, c::SOL_SOCKET as _, c::SO_SNDBUF, size) + } + + #[inline] + pub(crate) fn get_socket_send_buffer_size(fd: BorrowedFd<'_>) -> io::Result { + getsockopt(fd, c::SOL_SOCKET as _, c::SO_SNDBUF).map(|size: u32| size as usize) + } + + #[inline] + pub(crate) fn get_socket_domain(fd: BorrowedFd<'_>) -> io::Result { + let domain: c::c_int = getsockopt(fd, c::SOL_SOCKET as _, c::SO_DOMAIN)?; + Ok(AddressFamily( + domain.try_into().map_err(|_| io::Errno::OPNOTSUPP)?, )) } + + #[inline] + pub(crate) fn set_ip_ttl(fd: BorrowedFd<'_>, ttl: u32) -> io::Result<()> { + setsockopt(fd, c::IPPROTO_IP as _, c::IP_TTL, ttl) + } + + #[inline] + pub(crate) fn get_ip_ttl(fd: BorrowedFd<'_>) -> io::Result { + getsockopt(fd, c::IPPROTO_IP as _, c::IP_TTL) + } + + #[inline] + pub(crate) fn set_ipv6_v6only(fd: BorrowedFd<'_>, only_v6: bool) -> io::Result<()> { + setsockopt(fd, c::IPPROTO_IPV6 as _, c::IPV6_V6ONLY, from_bool(only_v6)) + } + + #[inline] + pub(crate) fn get_ipv6_v6only(fd: BorrowedFd<'_>) -> io::Result { + getsockopt(fd, c::IPPROTO_IPV6 as _, c::IPV6_V6ONLY).map(to_bool) + } + + #[inline] + pub(crate) fn set_ip_multicast_loop( + fd: BorrowedFd<'_>, + multicast_loop: bool, + ) -> io::Result<()> { + setsockopt( + fd, + c::IPPROTO_IP as _, + c::IP_MULTICAST_LOOP, + from_bool(multicast_loop), + ) + } + + #[inline] + pub(crate) fn get_ip_multicast_loop(fd: BorrowedFd<'_>) -> io::Result { + getsockopt(fd, c::IPPROTO_IP as _, c::IP_MULTICAST_LOOP).map(to_bool) + } + + #[inline] + pub(crate) fn set_ip_multicast_ttl(fd: BorrowedFd<'_>, multicast_ttl: u32) -> io::Result<()> { + setsockopt(fd, c::IPPROTO_IP as _, c::IP_MULTICAST_TTL, multicast_ttl) + } + + #[inline] + pub(crate) fn get_ip_multicast_ttl(fd: BorrowedFd<'_>) -> io::Result { + getsockopt(fd, c::IPPROTO_IP as _, c::IP_MULTICAST_TTL) + } + + #[inline] + pub(crate) fn set_ipv6_multicast_loop( + fd: BorrowedFd<'_>, + multicast_loop: bool, + ) -> io::Result<()> { + setsockopt( + fd, + c::IPPROTO_IPV6 as _, + c::IPV6_MULTICAST_LOOP, + from_bool(multicast_loop), + ) + } + + #[inline] + pub(crate) fn get_ipv6_multicast_loop(fd: BorrowedFd<'_>) -> io::Result { + getsockopt(fd, c::IPPROTO_IPV6 as _, c::IPV6_MULTICAST_LOOP).map(to_bool) + } + + #[inline] + pub(crate) fn set_ipv6_multicast_hops( + fd: BorrowedFd<'_>, + multicast_hops: u32, + ) -> io::Result<()> { + setsockopt( + fd, + c::IPPROTO_IP as _, + c::IPV6_MULTICAST_HOPS, + multicast_hops, + ) + } + + #[inline] + pub(crate) fn get_ipv6_multicast_hops(fd: BorrowedFd<'_>) -> io::Result { + getsockopt(fd, c::IPPROTO_IP as _, c::IPV6_MULTICAST_HOPS) + } + + #[inline] + pub(crate) fn set_ip_add_membership( + fd: BorrowedFd<'_>, + multiaddr: &Ipv4Addr, + interface: &Ipv4Addr, + ) -> io::Result<()> { + let mreq = to_imr(multiaddr, interface); + setsockopt(fd, c::IPPROTO_IP as _, c::IP_ADD_MEMBERSHIP, mreq) + } + + #[inline] + pub(crate) fn set_ipv6_add_membership( + fd: BorrowedFd<'_>, + multiaddr: &Ipv6Addr, + interface: u32, + ) -> io::Result<()> { + let mreq = to_ipv6mr(multiaddr, interface); + setsockopt(fd, c::IPPROTO_IPV6 as _, c::IPV6_ADD_MEMBERSHIP, mreq) + } + + #[inline] + pub(crate) fn set_ip_drop_membership( + fd: BorrowedFd<'_>, + multiaddr: &Ipv4Addr, + interface: &Ipv4Addr, + ) -> io::Result<()> { + let mreq = to_imr(multiaddr, interface); + setsockopt(fd, c::IPPROTO_IP as _, c::IP_DROP_MEMBERSHIP, mreq) + } + + #[inline] + pub(crate) fn set_ipv6_drop_membership( + fd: BorrowedFd<'_>, + multiaddr: &Ipv6Addr, + interface: u32, + ) -> io::Result<()> { + let mreq = to_ipv6mr(multiaddr, interface); + setsockopt(fd, c::IPPROTO_IPV6 as _, c::IPV6_DROP_MEMBERSHIP, mreq) + } + + #[inline] + pub(crate) fn get_ipv6_unicast_hops(fd: BorrowedFd<'_>) -> io::Result { + getsockopt(fd, c::IPPROTO_IPV6 as _, c::IPV6_UNICAST_HOPS).map(|hops: c::c_int| hops as u8) + } + + #[inline] + pub(crate) fn set_ipv6_unicast_hops(fd: BorrowedFd<'_>, hops: Option) -> io::Result<()> { + let hops = match hops { + Some(hops) => hops.into(), + None => -1, + }; + setsockopt(fd, c::IPPROTO_IPV6 as _, c::IPV6_UNICAST_HOPS, hops) + } + + #[inline] + pub(crate) fn set_tcp_nodelay(fd: BorrowedFd<'_>, nodelay: bool) -> io::Result<()> { + setsockopt(fd, c::IPPROTO_TCP as _, c::TCP_NODELAY, from_bool(nodelay)) + } + + #[inline] + pub(crate) fn get_tcp_nodelay(fd: BorrowedFd<'_>) -> io::Result { + getsockopt(fd, c::IPPROTO_TCP as _, c::TCP_NODELAY).map(to_bool) + } + + #[inline] + fn to_imr(multiaddr: &Ipv4Addr, interface: &Ipv4Addr) -> c::ip_mreq { + c::ip_mreq { + imr_multiaddr: to_imr_addr(multiaddr), + imr_interface: to_imr_addr(interface), + } + } + + #[inline] + fn to_imr_addr(addr: &Ipv4Addr) -> c::in_addr { + c::in_addr { + s_addr: u32::from_ne_bytes(addr.octets()), + } + } + + #[inline] + fn to_ipv6mr(multiaddr: &Ipv6Addr, interface: u32) -> c::ipv6_mreq { + c::ipv6_mreq { + ipv6mr_multiaddr: to_ipv6mr_multiaddr(multiaddr), + ipv6mr_ifindex: to_ipv6mr_interface(interface), + } + } + + #[inline] + fn to_ipv6mr_multiaddr(multiaddr: &Ipv6Addr) -> c::in6_addr { + c::in6_addr { + in6_u: linux_raw_sys::net::in6_addr__bindgen_ty_1 { + u6_addr8: multiaddr.octets(), + }, + } + } + + #[inline] + fn to_ipv6mr_interface(interface: u32) -> c::c_int { + interface as c::c_int + } + + #[inline] + fn from_bool(value: bool) -> c::c_uint { + c::c_uint::from(value) + } + + #[inline] + fn to_bool(value: c::c_uint) -> bool { + value != 0 + } } diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/net/write_sockaddr.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/net/write_sockaddr.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/net/write_sockaddr.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/net/write_sockaddr.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,5 +1,5 @@ -//! The BSD sockets API requires us to read the `ss_family` field before we can -//! interpret the rest of a `sockaddr` produced by the kernel. +//! The BSD sockets API requires us to read the `ss_family` field before +//! we can interpret the rest of a `sockaddr` produced by the kernel. #![allow(unsafe_code)] use crate::backend::c; diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/param/auxv.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/param/auxv.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/param/auxv.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/param/auxv.rs 2023-10-30 19:40:00.000000000 +0000 @@ -6,26 +6,23 @@ #![allow(unsafe_code)] use crate::backend::c; +use crate::backend::elf::*; use crate::fd::OwnedFd; #[cfg(feature = "param")] use crate::ffi::CStr; use crate::fs::{Mode, OFlags}; use crate::utils::{as_ptr, check_raw_pointer}; -#[cfg(feature = "alloc")] use alloc::vec::Vec; +use core::ffi::c_void; use core::mem::size_of; use core::ptr::{null_mut, read_unaligned, NonNull}; #[cfg(feature = "runtime")] -use core::sync::atomic::AtomicU8; +use core::slice; use core::sync::atomic::Ordering::Relaxed; use core::sync::atomic::{AtomicPtr, AtomicUsize}; -use linux_raw_sys::elf::*; use linux_raw_sys::general::{ - AT_BASE, AT_CLKTCK, AT_EXECFN, AT_HWCAP, AT_HWCAP2, AT_NULL, AT_PAGESZ, AT_SYSINFO_EHDR, -}; -#[cfg(feature = "runtime")] -use linux_raw_sys::general::{ - AT_EGID, AT_ENTRY, AT_EUID, AT_GID, AT_PHDR, AT_PHENT, AT_PHNUM, AT_SECURE, AT_UID, + AT_BASE, AT_CLKTCK, AT_EXECFN, AT_HWCAP, AT_HWCAP2, AT_NULL, AT_PAGESZ, AT_PHDR, AT_PHENT, + AT_PHNUM, AT_SYSINFO_EHDR, }; #[cfg(feature = "param")] @@ -86,36 +83,27 @@ #[cfg(feature = "runtime")] #[inline] -pub(crate) fn linux_secure() -> bool { - let mut secure = SECURE.load(Relaxed); - - // 0 means not initialized yet. - if secure == 0 { - init_auxv(); - secure = SECURE.load(Relaxed); - } - - // 0 means not present. Libc `getauxval(AT_SECURE)` would return 0. - // 1 means not in secure mode. - // 2 means in secure mode. - secure > 1 -} - -#[cfg(feature = "runtime")] -#[inline] -pub(crate) fn exe_phdrs() -> (*const c::c_void, usize, usize) { +pub(crate) fn exe_phdrs() -> (*const c::c_void, usize) { let mut phdr = PHDR.load(Relaxed); - let mut phent = PHENT.load(Relaxed); let mut phnum = PHNUM.load(Relaxed); if phdr.is_null() || phnum == 0 { init_auxv(); phdr = PHDR.load(Relaxed); - phent = PHENT.load(Relaxed); phnum = PHNUM.load(Relaxed); } - (phdr.cast(), phent, phnum) + (phdr.cast(), phnum) +} + +#[cfg(feature = "runtime")] +#[inline] +pub(in super::super) fn exe_phdrs_slice() -> &'static [Elf_Phdr] { + let (phdr, phnum) = exe_phdrs(); + + // SAFETY: We assume the `AT_PHDR` and `AT_PHNUM` values provided by the + // kernel form a valid slice. + unsafe { slice::from_raw_parts(phdr.cast(), phnum) } } /// `AT_SYSINFO_EHDR` isn't present on all platforms in all configurations, so @@ -132,49 +120,25 @@ ehdr } -#[cfg(feature = "runtime")] -#[inline] -pub(crate) fn entry() -> usize { - let mut entry = ENTRY.load(Relaxed); - - if entry == 0 { - init_auxv(); - entry = ENTRY.load(Relaxed); - } - - entry -} - static PAGE_SIZE: AtomicUsize = AtomicUsize::new(0); static CLOCK_TICKS_PER_SECOND: AtomicUsize = AtomicUsize::new(0); static HWCAP: AtomicUsize = AtomicUsize::new(0); static HWCAP2: AtomicUsize = AtomicUsize::new(0); -static EXECFN: AtomicPtr = AtomicPtr::new(null_mut()); static SYSINFO_EHDR: AtomicPtr = AtomicPtr::new(null_mut()); -#[cfg(feature = "runtime")] -static SECURE: AtomicU8 = AtomicU8::new(0); -#[cfg(feature = "runtime")] static PHDR: AtomicPtr = AtomicPtr::new(null_mut()); -#[cfg(feature = "runtime")] -static PHENT: AtomicUsize = AtomicUsize::new(0); -#[cfg(feature = "runtime")] static PHNUM: AtomicUsize = AtomicUsize::new(0); -#[cfg(feature = "runtime")] -static ENTRY: AtomicUsize = AtomicUsize::new(0); +static EXECFN: AtomicPtr = AtomicPtr::new(null_mut()); -#[cfg(feature = "alloc")] fn pr_get_auxv() -> crate::io::Result> { use super::super::conv::{c_int, pass_usize, ret_usize}; - const PR_GET_AUXV: c::c_int = 0x4155_5856; + const PR_GET_AUXV: c::c_int = 0x41555856; let mut buffer = alloc::vec![0u8; 512]; let len = unsafe { ret_usize(syscall_always_asm!( __NR_prctl, c_int(PR_GET_AUXV), buffer.as_ptr(), - pass_usize(buffer.len()), - pass_usize(0), - pass_usize(0) + pass_usize(buffer.len()) ))? }; if len <= buffer.len() { @@ -187,33 +151,28 @@ __NR_prctl, c_int(PR_GET_AUXV), buffer.as_ptr(), - pass_usize(buffer.len()), - pass_usize(0), - pass_usize(0) + pass_usize(buffer.len()) ))? }; assert_eq!(len, buffer.len()); return Ok(buffer); } -/// If we don't have "use-explicitly-provided-auxv" or "use-libc-auxv", we -/// read the aux vector via the `prctl` `PR_GET_AUXV`, with a fallback to -/// /proc/self/auxv for kernels that don't support `PR_GET_AUXV`. +/// On non-Mustang platforms, we read the aux vector via the `prctl` +/// `PR_GET_AUXV`, with a fallback to /proc/self/auxv for kernels that don't +/// support `PR_GET_AUXV`. #[cold] fn init_auxv() { - #[cfg(feature = "alloc")] - { - match pr_get_auxv() { - Ok(buffer) => { - // SAFETY: We assume the kernel returns a valid auxv. - unsafe { - init_from_aux_iter(AuxPointer(buffer.as_ptr().cast())); - } - return; - } - Err(_) => { - // Fall back to /proc/self/auxv on error. + match pr_get_auxv() { + Ok(buffer) => { + // SAFETY: We assume the kernel returns a valid auxv. + unsafe { + init_from_auxp(buffer.as_ptr().cast()); } + return; + } + Err(_) => { + // Fall back to /proc/self/auxv on error. } } @@ -223,17 +182,10 @@ // auxv records. let file = crate::fs::open("/proc/self/auxv", OFlags::RDONLY, Mode::empty()).unwrap(); - #[cfg(feature = "alloc")] - init_from_auxv_file(file).unwrap(); - - #[cfg(not(feature = "alloc"))] - unsafe { - init_from_aux_iter(AuxFile(file)).unwrap(); - } + let _ = init_from_auxv_file(file); } /// Process auxv entries from the open file `auxv`. -#[cfg(feature = "alloc")] #[cold] fn init_from_auxv_file(auxv: OwnedFd) -> Option<()> { let mut buffer = Vec::::with_capacity(512); @@ -259,7 +211,7 @@ } // SAFETY: We loaded from an auxv file into the buffer. - unsafe { init_from_aux_iter(AuxPointer(buffer.as_ptr().cast())) } + unsafe { init_from_auxp(buffer.as_ptr().cast()) } } /// Process auxv entries from the auxv array pointed to by `auxp`. @@ -271,106 +223,120 @@ /// The buffer contains `Elf_aux_t` elements, though it need not be aligned; /// function uses `read_unaligned` to read from it. #[cold] -unsafe fn init_from_aux_iter(aux_iter: impl Iterator) -> Option<()> { +unsafe fn init_from_auxp(mut auxp: *const Elf_auxv_t) -> Option<()> { let mut pagesz = 0; let mut clktck = 0; let mut hwcap = 0; let mut hwcap2 = 0; - let mut execfn = null_mut(); - let mut sysinfo_ehdr = null_mut(); - #[cfg(feature = "runtime")] - let mut secure = 0; - #[cfg(feature = "runtime")] let mut phdr = null_mut(); - #[cfg(feature = "runtime")] let mut phnum = 0; - #[cfg(feature = "runtime")] + let mut execfn = null_mut(); + let mut sysinfo_ehdr = null_mut(); let mut phent = 0; - #[cfg(feature = "runtime")] - let mut entry = 0; - #[cfg(feature = "runtime")] - let mut uid = None; - #[cfg(feature = "runtime")] - let mut euid = None; - #[cfg(feature = "runtime")] - let mut gid = None; - #[cfg(feature = "runtime")] - let mut egid = None; - for Elf_auxv_t { a_type, a_val } in aux_iter { + loop { + let Elf_auxv_t { a_type, a_val } = read_unaligned(auxp); + match a_type as _ { AT_PAGESZ => pagesz = a_val as usize, AT_CLKTCK => clktck = a_val as usize, AT_HWCAP => hwcap = a_val as usize, AT_HWCAP2 => hwcap2 = a_val as usize, - AT_EXECFN => execfn = check_raw_pointer::(a_val as *mut _)?.as_ptr(), - AT_SYSINFO_EHDR => sysinfo_ehdr = check_elf_base(a_val as *mut _)?.as_ptr(), - - AT_BASE => { - let _ = check_elf_base(a_val.cast())?; - } - - #[cfg(feature = "runtime")] - AT_SECURE => secure = (a_val as usize != 0) as u8 + 1, - #[cfg(feature = "runtime")] - AT_UID => uid = Some(a_val), - #[cfg(feature = "runtime")] - AT_EUID => euid = Some(a_val), - #[cfg(feature = "runtime")] - AT_GID => gid = Some(a_val), - #[cfg(feature = "runtime")] - AT_EGID => egid = Some(a_val), - #[cfg(feature = "runtime")] AT_PHDR => phdr = check_raw_pointer::(a_val as *mut _)?.as_ptr(), - #[cfg(feature = "runtime")] AT_PHNUM => phnum = a_val as usize, - #[cfg(feature = "runtime")] AT_PHENT => phent = a_val as usize, - #[cfg(feature = "runtime")] - AT_ENTRY => entry = a_val as usize, - + AT_EXECFN => execfn = check_raw_pointer::(a_val as *mut _)?.as_ptr(), + AT_BASE => check_interpreter_base(a_val.cast())?, + AT_SYSINFO_EHDR => sysinfo_ehdr = check_vdso_base(a_val as *mut _)?.as_ptr(), AT_NULL => break, _ => (), } + auxp = auxp.add(1); } - #[cfg(feature = "runtime")] assert_eq!(phent, size_of::()); - // If we're running set-uid or set-gid, enable “secure execution†mode, - // which doesn't do much, but users may be depending on the things that - // it does do. - #[cfg(feature = "runtime")] - if uid != euid || gid != egid { - secure = 2; - } - - // The base and sysinfo_ehdr (if present) matches our platform. Accept the - // aux values. + // The base and sysinfo_ehdr (if present) matches our platform. Accept + // the aux values. PAGE_SIZE.store(pagesz, Relaxed); CLOCK_TICKS_PER_SECOND.store(clktck, Relaxed); HWCAP.store(hwcap, Relaxed); HWCAP2.store(hwcap2, Relaxed); - EXECFN.store(execfn, Relaxed); - SYSINFO_EHDR.store(sysinfo_ehdr, Relaxed); - #[cfg(feature = "runtime")] - SECURE.store(secure, Relaxed); - #[cfg(feature = "runtime")] PHDR.store(phdr, Relaxed); - #[cfg(feature = "runtime")] PHNUM.store(phnum, Relaxed); - #[cfg(feature = "runtime")] - ENTRY.store(entry, Relaxed); + EXECFN.store(execfn, Relaxed); + SYSINFO_EHDR.store(sysinfo_ehdr, Relaxed); Some(()) } +/// Check that `base` is a valid pointer to the program interpreter. +/// +/// `base` is some value we got from a `AT_BASE` aux record somewhere, +/// which hopefully holds the value of the program interpreter in memory. Do a +/// series of checks to be as sure as we can that it's safe to use. +#[cold] +unsafe fn check_interpreter_base(base: *const Elf_Ehdr) -> Option<()> { + check_elf_base(base)?; + Some(()) +} + /// Check that `base` is a valid pointer to the kernel-provided vDSO. /// /// `base` is some value we got from a `AT_SYSINFO_EHDR` aux record somewhere, /// which hopefully holds the value of the kernel-provided vDSO in memory. Do a /// series of checks to be as sure as we can that it's safe to use. #[cold] +unsafe fn check_vdso_base(base: *const Elf_Ehdr) -> Option> { + // In theory, we could check that we're not attempting to parse our own ELF + // image, as an additional check. However, older Linux toolchains don't + // support this, and Rust's `#[linkage = "extern_weak"]` isn't stable yet, + // so just disable this for now. + /* + { + extern "C" { + static __ehdr_start: c::c_void; + } + + let ehdr_start: *const c::c_void = &__ehdr_start; + if base == ehdr_start { + return None; + } + } + */ + + let hdr = check_elf_base(base)?; + + // Check that the ELF is not writable, since that would indicate that this + // isn't the ELF we think it is. Here we're just using `clock_getres` just + // as an arbitrary system call which writes to a buffer and fails with + // `EFAULT` if the buffer is not writable. + { + use crate::backend::conv::{c_uint, ret}; + if ret(syscall!( + __NR_clock_getres, + c_uint(linux_raw_sys::general::CLOCK_MONOTONIC), + base + )) != Err(crate::io::Errno::FAULT) + { + // We can't gracefully fail here because we would seem to have just + // mutated some unknown memory. + #[cfg(feature = "std")] + { + std::process::abort(); + } + #[cfg(all(not(feature = "std"), feature = "rustc-dep-of-std"))] + { + core::intrinsics::abort(); + } + } + } + + Some(hdr) +} + +/// Check that `base` is a valid pointer to an ELF image. +#[cold] unsafe fn check_elf_base(base: *const Elf_Ehdr) -> Option> { // If we're reading a 64-bit auxv on a 32-bit platform, we'll see a zero // `a_val` because `AT_*` values are never greater than `u32::MAX`. Zero is @@ -434,46 +400,15 @@ Some(NonNull::new_unchecked(as_ptr(hdr) as *mut _)) } -// Aux reading utilities - -// Read auxv records from an array in memory. -struct AuxPointer(*const Elf_auxv_t); - -impl Iterator for AuxPointer { - type Item = Elf_auxv_t; - - #[cold] - fn next(&mut self) -> Option { - unsafe { - let value = read_unaligned(self.0); - self.0 = self.0.add(1); - Some(value) - } - } -} +// ELF ABI -// Read auxv records from a file. -#[cfg(not(feature = "alloc"))] -struct AuxFile(OwnedFd); - -#[cfg(not(feature = "alloc"))] -impl Iterator for AuxFile { - type Item = Elf_auxv_t; - - // This implementation does lots of `read`s and it isn't amazing, but - // hopefully we won't use it often. - #[cold] - fn next(&mut self) -> Option { - let mut buf = [0_u8; size_of::()]; - let mut slice = &mut buf[..]; - while !slice.is_empty() { - match crate::io::read(&self.0, slice) { - Ok(0) => panic!("unexpected end of auxv file"), - Ok(n) => slice = &mut slice[n..], - Err(crate::io::Errno::INTR) => continue, - Err(err) => Err(err).unwrap(), - } - } - Some(unsafe { read_unaligned(buf.as_ptr().cast()) }) - } +#[repr(C)] +#[derive(Copy, Clone)] +struct Elf_auxv_t { + a_type: usize, + + // Some of the values in the auxv array are pointers, so we make `a_val` a + // pointer, in order to preserve their provenance. For the values which are + // integers, we cast this to `usize`. + a_val: *const c_void, } diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/param/init.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/param/init.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/param/init.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/param/init.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,161 +0,0 @@ -//! Linux auxv `init` function, for "use-explicitly-provided-auxv" mode. -//! -//! # Safety -//! -//! This uses raw pointers to locate and read the kernel-provided auxv array. -#![allow(unsafe_code)] - -use crate::backend::c; -#[cfg(feature = "param")] -use crate::ffi::CStr; -use core::ffi::c_void; -use core::ptr::{null_mut, read, NonNull}; -#[cfg(feature = "runtime")] -use core::sync::atomic::AtomicBool; -use core::sync::atomic::{AtomicPtr, AtomicUsize, Ordering}; -use linux_raw_sys::elf::*; -use linux_raw_sys::general::{ - AT_CLKTCK, AT_EXECFN, AT_HWCAP, AT_HWCAP2, AT_NULL, AT_PAGESZ, AT_SYSINFO_EHDR, -}; -#[cfg(feature = "runtime")] -use linux_raw_sys::general::{AT_ENTRY, AT_PHDR, AT_PHENT, AT_PHNUM, AT_SECURE}; - -#[cfg(feature = "param")] -#[inline] -pub(crate) fn page_size() -> usize { - unsafe { PAGE_SIZE.load(Ordering::Relaxed) } -} - -#[cfg(feature = "param")] -#[inline] -pub(crate) fn clock_ticks_per_second() -> u64 { - unsafe { CLOCK_TICKS_PER_SECOND.load(Ordering::Relaxed) as u64 } -} - -#[cfg(feature = "param")] -#[inline] -pub(crate) fn linux_hwcap() -> (usize, usize) { - unsafe { - ( - HWCAP.load(Ordering::Relaxed), - HWCAP2.load(Ordering::Relaxed), - ) - } -} - -#[cfg(feature = "param")] -#[inline] -pub(crate) fn linux_execfn() -> &'static CStr { - let execfn = unsafe { EXECFN.load(Ordering::Relaxed) }; - - // SAFETY: We initialize `EXECFN` to a valid `CStr` pointer, and we assume - // the `AT_EXECFN` value provided by the kernel points to a valid C string. - unsafe { CStr::from_ptr(execfn.cast()) } -} - -#[cfg(feature = "runtime")] -#[inline] -pub(crate) fn linux_secure() -> bool { - unsafe { SECURE.load(Ordering::Relaxed) } -} - -#[cfg(feature = "runtime")] -#[inline] -pub(crate) fn exe_phdrs() -> (*const c_void, usize, usize) { - unsafe { - ( - PHDR.load(Ordering::Relaxed).cast(), - PHENT.load(Ordering::Relaxed), - PHNUM.load(Ordering::Relaxed), - ) - } -} - -/// `AT_SYSINFO_EHDR` isn't present on all platforms in all configurations, so -/// if we don't see it, this function returns a null pointer. -#[inline] -pub(in super::super) fn sysinfo_ehdr() -> *const Elf_Ehdr { - unsafe { SYSINFO_EHDR.load(Ordering::Relaxed) } -} - -#[cfg(feature = "runtime")] -#[inline] -pub(crate) fn entry() -> usize { - unsafe { ENTRY.load(Ordering::Relaxed) } -} - -static mut PAGE_SIZE: AtomicUsize = AtomicUsize::new(0); -static mut CLOCK_TICKS_PER_SECOND: AtomicUsize = AtomicUsize::new(0); -static mut HWCAP: AtomicUsize = AtomicUsize::new(0); -static mut HWCAP2: AtomicUsize = AtomicUsize::new(0); -static mut SYSINFO_EHDR: AtomicPtr = AtomicPtr::new(null_mut()); -// Initialize `EXECFN` to a valid `CStr` pointer so that we don't need to check -// for null on every `execfn` call. -static mut EXECFN: AtomicPtr = AtomicPtr::new(b"\0".as_ptr() as _); -#[cfg(feature = "runtime")] -static mut SECURE: AtomicBool = AtomicBool::new(false); -// Use `dangling` so that we can always treat it like an empty slice. -#[cfg(feature = "runtime")] -static mut PHDR: AtomicPtr = AtomicPtr::new(NonNull::dangling().as_ptr()); -#[cfg(feature = "runtime")] -static mut PHENT: AtomicUsize = AtomicUsize::new(0); -#[cfg(feature = "runtime")] -static mut PHNUM: AtomicUsize = AtomicUsize::new(0); -#[cfg(feature = "runtime")] -static mut ENTRY: AtomicUsize = AtomicUsize::new(0); - -/// When "use-explicitly-provided-auxv" is enabled, we export a function to be -/// called during initialization, and passed a pointer to the original -/// environment variable block set up by the OS. -pub(crate) unsafe fn init(envp: *mut *mut u8) { - init_from_envp(envp); -} - -/// # Safety -/// -/// This must be passed a pointer to the environment variable buffer -/// provided by the kernel, which is followed in memory by the auxv array. -unsafe fn init_from_envp(mut envp: *mut *mut u8) { - while !(*envp).is_null() { - envp = envp.add(1); - } - init_from_auxp(envp.add(1).cast()) -} - -/// Process auxv entries from the auxv array pointed to by `auxp`. -/// -/// # Safety -/// -/// This must be passed a pointer to an auxv array. -/// -/// The buffer contains `Elf_aux_t` elements, though it need not be aligned; -/// function uses `read_unaligned` to read from it. -unsafe fn init_from_auxp(mut auxp: *const Elf_auxv_t) { - loop { - let Elf_auxv_t { a_type, a_val } = read(auxp); - - match a_type as _ { - AT_PAGESZ => PAGE_SIZE.store(a_val as usize, Ordering::Relaxed), - AT_CLKTCK => CLOCK_TICKS_PER_SECOND.store(a_val as usize, Ordering::Relaxed), - AT_HWCAP => HWCAP.store(a_val as usize, Ordering::Relaxed), - AT_HWCAP2 => HWCAP2.store(a_val as usize, Ordering::Relaxed), - AT_EXECFN => EXECFN.store(a_val.cast::(), Ordering::Relaxed), - AT_SYSINFO_EHDR => SYSINFO_EHDR.store(a_val.cast::(), Ordering::Relaxed), - - #[cfg(feature = "runtime")] - AT_SECURE => SECURE.store(a_val as usize != 0, Ordering::Relaxed), - #[cfg(feature = "runtime")] - AT_PHDR => PHDR.store(a_val.cast::(), Ordering::Relaxed), - #[cfg(feature = "runtime")] - AT_PHNUM => PHNUM.store(a_val as usize, Ordering::Relaxed), - #[cfg(feature = "runtime")] - AT_PHENT => PHENT.store(a_val as usize, Ordering::Relaxed), - #[cfg(feature = "runtime")] - AT_ENTRY => ENTRY.store(a_val as usize, Ordering::Relaxed), - - AT_NULL => break, - _ => (), - } - auxp = auxp.add(1); - } -} diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/param/libc_auxv.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/param/libc_auxv.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/param/libc_auxv.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/param/libc_auxv.rs 2023-10-30 19:40:00.000000000 +0000 @@ -6,11 +6,13 @@ #![allow(unsafe_code)] use crate::backend::c; +use crate::backend::elf::*; #[cfg(feature = "param")] use crate::ffi::CStr; #[cfg(not(feature = "runtime"))] use core::ptr::null; -use linux_raw_sys::elf::*; +#[cfg(feature = "runtime")] +use core::slice; // `getauxval` wasn't supported in glibc until 2.16. Also this lets us use // `*mut` as the return type to preserve strict provenance. @@ -24,17 +26,10 @@ fn getauxval(type_: c::c_ulong) -> *mut c::c_void; } -#[cfg(feature = "runtime")] const AT_PHDR: c::c_ulong = 3; -#[cfg(feature = "runtime")] -const AT_PHENT: c::c_ulong = 4; -#[cfg(feature = "runtime")] const AT_PHNUM: c::c_ulong = 5; -#[cfg(feature = "runtime")] -const AT_ENTRY: c::c_ulong = 9; const AT_HWCAP: c::c_ulong = 16; const AT_HWCAP2: c::c_ulong = 26; -const AT_SECURE: c::c_ulong = 23; const AT_EXECFN: c::c_ulong = 31; const AT_SYSINFO_EHDR: c::c_ulong = 33; @@ -57,17 +52,12 @@ fn test_abi() { const_assert_eq!(self::_SC_PAGESIZE, ::libc::_SC_PAGESIZE); const_assert_eq!(self::_SC_CLK_TCK, ::libc::_SC_CLK_TCK); + const_assert_eq!(self::AT_PHDR, ::libc::AT_PHDR); + const_assert_eq!(self::AT_PHNUM, ::libc::AT_PHNUM); const_assert_eq!(self::AT_HWCAP, ::libc::AT_HWCAP); const_assert_eq!(self::AT_HWCAP2, ::libc::AT_HWCAP2); const_assert_eq!(self::AT_EXECFN, ::libc::AT_EXECFN); - const_assert_eq!(self::AT_SECURE, ::libc::AT_SECURE); const_assert_eq!(self::AT_SYSINFO_EHDR, ::libc::AT_SYSINFO_EHDR); - #[cfg(feature = "runtime")] - const_assert_eq!(self::AT_PHDR, ::libc::AT_PHDR); - #[cfg(feature = "runtime")] - const_assert_eq!(self::AT_PHNUM, ::libc::AT_PHNUM); - #[cfg(feature = "runtime")] - const_assert_eq!(self::AT_ENTRY, ::libc::AT_ENTRY); } #[cfg(feature = "param")] @@ -124,23 +114,26 @@ #[cfg(feature = "runtime")] #[inline] -pub(crate) fn linux_secure() -> bool { - unsafe { getauxval(AT_SECURE) as usize != 0 } -} - -#[cfg(feature = "runtime")] -#[inline] -pub(crate) fn exe_phdrs() -> (*const c::c_void, usize, usize) { +pub(crate) fn exe_phdrs() -> (*const c::c_void, usize) { unsafe { let phdr = getauxval(AT_PHDR) as *const c::c_void; - let phent = getauxval(AT_PHENT) as usize; let phnum = getauxval(AT_PHNUM) as usize; - (phdr, phent, phnum) + (phdr, phnum) } } -/// `AT_SYSINFO_EHDR` isn't present on all platforms in all configurations, so -/// if we don't see it, this function returns a null pointer. +#[cfg(feature = "runtime")] +#[inline] +pub(in super::super) fn exe_phdrs_slice() -> &'static [Elf_Phdr] { + let (phdr, phnum) = exe_phdrs(); + + // SAFETY: We assume the `AT_PHDR` and `AT_PHNUM` values provided by the + // kernel form a valid slice. + unsafe { slice::from_raw_parts(phdr.cast(), phnum) } +} + +/// `AT_SYSINFO_EHDR` isn't present on all platforms in all configurations, +/// so if we don't see it, this function returns a null pointer. #[inline] pub(in super::super) fn sysinfo_ehdr() -> *const Elf_Ehdr { #[cfg(not(feature = "runtime"))] @@ -157,9 +150,3 @@ getauxval(AT_SYSINFO_EHDR) as *const Elf_Ehdr } } - -#[cfg(feature = "runtime")] -#[inline] -pub(crate) fn entry() -> usize { - unsafe { getauxval(AT_ENTRY) as usize } -} diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/param/mod.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/param/mod.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/param/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/param/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,15 +1,12 @@ -// With "use-explicitly-provided-auxv" enabled, we expect to be initialized -// with an explicit `rustix::param::init` call. +// On Mustang, origin is in control of program startup and can access the +// incoming aux values on the stack. // // With "use-libc-auxv" enabled, use libc's `getauxval`. // // Otherwise, we read aux values from /proc/self/auxv. -#[cfg_attr(feature = "use-explicitly-provided-auxv", path = "init.rs")] +#[cfg_attr(target_vendor = "mustang", path = "mustang_auxv.rs")] #[cfg_attr( - all( - not(feature = "use-explicitly-provided-auxv"), - feature = "use-libc-auxv" - ), + all(not(target_vendor = "mustang"), feature = "use-libc-auxv"), path = "libc_auxv.rs" )] pub(crate) mod auxv; diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/param/mustang_auxv.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/param/mustang_auxv.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/param/mustang_auxv.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/param/mustang_auxv.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,159 @@ +//! Linux auxv support, for Mustang. +//! +//! # Safety +//! +//! This uses raw pointers to locate and read the kernel-provided auxv array. +#![allow(unsafe_code)] + +use crate::backend::c; +use crate::backend::elf::*; +#[cfg(feature = "param")] +use crate::ffi::CStr; +use core::ffi::c_void; +use core::mem::size_of; +use core::ptr::{null, read}; +#[cfg(feature = "runtime")] +use core::slice; +use linux_raw_sys::general::{ + AT_CLKTCK, AT_EXECFN, AT_HWCAP, AT_HWCAP2, AT_NULL, AT_PAGESZ, AT_PHDR, AT_PHENT, AT_PHNUM, + AT_SYSINFO_EHDR, +}; + +#[cfg(feature = "param")] +#[inline] +pub(crate) fn page_size() -> usize { + // SAFETY: This is initialized during program startup. + unsafe { PAGE_SIZE } +} + +#[cfg(feature = "param")] +#[inline] +pub(crate) fn clock_ticks_per_second() -> u64 { + // SAFETY: This is initialized during program startup. + unsafe { CLOCK_TICKS_PER_SECOND as u64 } +} + +#[cfg(feature = "param")] +#[inline] +pub(crate) fn linux_hwcap() -> (usize, usize) { + // SAFETY: This is initialized during program startup. + unsafe { (HWCAP, HWCAP2) } +} + +#[cfg(feature = "param")] +#[inline] +pub(crate) fn linux_execfn() -> &'static CStr { + // SAFETY: This is initialized during program startup. And we + // assume it's a valid pointer to a NUL-terminated string. + unsafe { CStr::from_ptr(EXECFN.0.cast()) } +} + +#[cfg(feature = "runtime")] +#[inline] +pub(crate) fn exe_phdrs() -> (*const c_void, usize) { + // SAFETY: This is initialized during program startup. + unsafe { (PHDR.0.cast(), PHNUM) } +} + +#[cfg(feature = "runtime")] +#[inline] +pub(in super::super) fn exe_phdrs_slice() -> &'static [Elf_Phdr] { + let (phdr, phnum) = exe_phdrs(); + + // SAFETY: We assume the `AT_PHDR` and `AT_PHNUM` values provided by the + // kernel form a valid slice. + unsafe { slice::from_raw_parts(phdr.cast(), phnum) } +} + +/// `AT_SYSINFO_EHDR` isn't present on all platforms in all configurations, so +/// if we don't see it, this function returns a null pointer. +#[inline] +pub(in super::super) fn sysinfo_ehdr() -> *const Elf_Ehdr { + // SAFETY: This is initialized during program startup. + unsafe { SYSINFO_EHDR.0 } +} + +/// A const pointer to `T` that implements [`Sync`]. +#[repr(transparent)] +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub struct SyncConstPtr(*const T); +unsafe impl Sync for SyncConstPtr {} + +impl SyncConstPtr { + /// Creates a `SyncConstPointer` from a raw pointer. + /// + /// Behavior is undefined if `ptr` is actually not + /// safe to share across threads. + pub const unsafe fn new(ptr: *const T) -> Self { + Self(ptr) + } +} + +static mut PAGE_SIZE: usize = 0; +static mut CLOCK_TICKS_PER_SECOND: usize = 0; +static mut HWCAP: usize = 0; +static mut HWCAP2: usize = 0; +static mut SYSINFO_EHDR: SyncConstPtr = unsafe { SyncConstPtr::new(null()) }; +static mut PHDR: SyncConstPtr = unsafe { SyncConstPtr::new(null()) }; +static mut PHNUM: usize = 0; +static mut EXECFN: SyncConstPtr = unsafe { SyncConstPtr::new(null()) }; + +/// On mustang, we export a function to be called during initialization, and +/// passed a pointer to the original environment variable block set up by the +/// OS. +pub(crate) unsafe fn init(envp: *mut *mut u8) { + init_from_envp(envp); +} + +/// # Safety +/// +/// This must be passed a pointer to the environment variable buffer +/// provided by the kernel, which is followed in memory by the auxv array. +unsafe fn init_from_envp(mut envp: *mut *mut u8) { + while !(*envp).is_null() { + envp = envp.add(1); + } + init_from_auxp(envp.add(1).cast()) +} + +/// Process auxv entries from the auxv array pointed to by `auxp`. +/// +/// # Safety +/// +/// This must be passed a pointer to an auxv array. +/// +/// The buffer contains `Elf_aux_t` elements, though it need not be aligned; +/// function uses `read_unaligned` to read from it. +unsafe fn init_from_auxp(mut auxp: *const Elf_auxv_t) { + loop { + let Elf_auxv_t { a_type, a_val } = read(auxp); + + match a_type as _ { + AT_PAGESZ => PAGE_SIZE = a_val as usize, + AT_CLKTCK => CLOCK_TICKS_PER_SECOND = a_val as usize, + AT_HWCAP => HWCAP = a_val as usize, + AT_HWCAP2 => HWCAP2 = a_val as usize, + AT_PHDR => PHDR = SyncConstPtr::new(a_val.cast::()), + AT_PHNUM => PHNUM = a_val as usize, + AT_PHENT => assert_eq!(a_val as usize, size_of::()), + AT_EXECFN => EXECFN = SyncConstPtr::new(a_val.cast::()), + AT_SYSINFO_EHDR => SYSINFO_EHDR = SyncConstPtr::new(a_val.cast::()), + AT_NULL => break, + _ => (), + } + auxp = auxp.add(1); + } +} + +// ELF ABI + +#[repr(C)] +#[derive(Copy, Clone)] +struct Elf_auxv_t { + a_type: usize, + + // Some of the values in the auxv array are pointers, so we make `a_val` a + // pointer, in order to preserve their provenance. For the values which are + // integers, we cast this to `usize`. + a_val: *const c_void, +} diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/pid/syscalls.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/pid/syscalls.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/pid/syscalls.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/pid/syscalls.rs 2023-10-30 19:40:00.000000000 +0000 @@ -3,7 +3,8 @@ //! # Safety //! //! See the `rustix::backend` module documentation for details. -#![allow(unsafe_code, clippy::undocumented_unsafe_blocks)] +#![allow(unsafe_code)] +#![allow(clippy::undocumented_unsafe_blocks)] use crate::backend::conv::ret_usize_infallible; use crate::pid::{Pid, RawPid}; diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/pipe/syscalls.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/pipe/syscalls.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/pipe/syscalls.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/pipe/syscalls.rs 2023-10-30 19:40:00.000000000 +0000 @@ -3,7 +3,8 @@ //! # Safety //! //! See the `rustix::backend` module documentation for details. -#![allow(unsafe_code, clippy::undocumented_unsafe_blocks)] +#![allow(unsafe_code)] +#![allow(clippy::undocumented_unsafe_blocks)] use crate::backend::conv::{c_int, c_uint, opt_mut, pass_usize, ret, ret_usize, slice}; use crate::backend::{c, MAX_IOV}; @@ -58,9 +59,9 @@ #[inline] pub fn splice( - fd_in: BorrowedFd<'_>, + fd_in: BorrowedFd, off_in: Option<&mut u64>, - fd_out: BorrowedFd<'_>, + fd_out: BorrowedFd, off_out: Option<&mut u64>, len: usize, flags: SpliceFlags, @@ -80,8 +81,8 @@ #[inline] pub unsafe fn vmsplice( - fd: BorrowedFd<'_>, - bufs: &[IoSliceRaw<'_>], + fd: BorrowedFd, + bufs: &[IoSliceRaw], flags: SpliceFlags, ) -> io::Result { let (bufs_addr, bufs_len) = slice(&bufs[..cmp::min(bufs.len(), MAX_IOV)]); @@ -90,8 +91,8 @@ #[inline] pub fn tee( - fd_in: BorrowedFd<'_>, - fd_out: BorrowedFd<'_>, + fd_in: BorrowedFd, + fd_out: BorrowedFd, len: usize, flags: SpliceFlags, ) -> io::Result { diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/pipe/types.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/pipe/types.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/pipe/types.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/pipe/types.rs 2023-10-30 19:40:00.000000000 +0000 @@ -15,9 +15,6 @@ const DIRECT = linux_raw_sys::general::O_DIRECT; /// `O_NONBLOCK` const NONBLOCK = linux_raw_sys::general::O_NONBLOCK; - - /// - const _ = !0; } } @@ -35,9 +32,6 @@ const MORE = linux_raw_sys::general::SPLICE_F_MORE; /// `SPLICE_F_GIFT` const GIFT = linux_raw_sys::general::SPLICE_F_GIFT; - - /// - const _ = !0; } } diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/prctl/syscalls.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/prctl/syscalls.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/prctl/syscalls.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/prctl/syscalls.rs 2023-10-30 19:40:00.000000000 +0000 @@ -3,7 +3,8 @@ //! # Safety //! //! See the `rustix::backend` module documentation for details. -#![allow(unsafe_code, clippy::undocumented_unsafe_blocks)] +#![allow(unsafe_code)] +#![allow(clippy::undocumented_unsafe_blocks)] use crate::backend::c; use crate::backend::conv::{c_int, ret_c_int}; diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/process/syscalls.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/process/syscalls.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/process/syscalls.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/process/syscalls.rs 2023-10-30 19:40:00.000000000 +0000 @@ -3,16 +3,17 @@ //! # Safety //! //! See the `rustix::backend` module documentation for details. -#![allow(unsafe_code, clippy::undocumented_unsafe_blocks)] +#![allow(unsafe_code)] +#![allow(clippy::undocumented_unsafe_blocks)] use super::types::RawCpuSet; use crate::backend::c; -#[cfg(all(feature = "alloc", feature = "fs"))] +#[cfg(feature = "fs")] use crate::backend::conv::slice_mut; use crate::backend::conv::{ by_mut, by_ref, c_int, c_uint, negative_pid, pass_usize, raw_fd, ret, ret_c_int, ret_c_int_infallible, ret_c_uint, ret_infallible, ret_owned_fd, ret_usize, size_of, - slice_just_addr, zero, + slice_just_addr, slice_just_addr_mut, zero, }; use crate::fd::{AsRawFd, BorrowedFd, OwnedFd, RawFd}; #[cfg(feature = "fs")] @@ -20,8 +21,8 @@ use crate::io; use crate::pid::RawPid; use crate::process::{ - Cpuid, MembarrierCommand, MembarrierQuery, Pid, PidfdFlags, PidfdGetfdFlags, Resource, Rlimit, - Uid, WaitId, WaitOptions, WaitStatus, WaitidOptions, WaitidStatus, + Cpuid, Gid, MembarrierCommand, MembarrierQuery, Pid, PidfdFlags, PidfdGetfdFlags, Resource, + Rlimit, Uid, WaitId, WaitOptions, WaitStatus, WaitidOptions, WaitidStatus, }; use crate::signal::Signal; use crate::utils::as_mut_ptr; @@ -31,10 +32,9 @@ membarrier_cmd, membarrier_cmd_flag, rlimit, rlimit64, PRIO_PGRP, PRIO_PROCESS, PRIO_USER, RLIM64_INFINITY, RLIM_INFINITY, }; +use linux_raw_sys::ioctl::TIOCSCTTY; #[cfg(feature = "fs")] use {crate::backend::conv::ret_c_uint_infallible, crate::fs::Mode}; -#[cfg(feature = "alloc")] -use {crate::backend::conv::slice_just_addr_mut, crate::process::Gid}; #[cfg(feature = "fs")] #[inline] @@ -53,7 +53,7 @@ unsafe { ret(syscall_readonly!(__NR_chroot, filename)) } } -#[cfg(all(feature = "alloc", feature = "fs"))] +#[cfg(feature = "fs")] #[inline] pub(crate) fn getcwd(buf: &mut [MaybeUninit]) -> io::Result { let (buf_addr_mut, buf_len) = slice_mut(buf); @@ -141,7 +141,7 @@ #[inline] pub(crate) fn sched_getaffinity(pid: Option, cpuset: &mut RawCpuSet) -> io::Result<()> { unsafe { - // The raw Linux syscall returns the size (in bytes) of the `cpumask_t` + // The raw linux syscall returns the size (in bytes) of the `cpumask_t` // data type that is used internally by the kernel to represent the CPU // set bit mask. let size = ret_usize(syscall!( @@ -365,12 +365,12 @@ /// Convert a Rust [`Rlimit`] to a C `rlimit64`. #[inline] fn rlimit_from_linux(lim: rlimit64) -> Rlimit { - let current = if lim.rlim_cur as u64 == RLIM64_INFINITY as u64 { + let current = if lim.rlim_cur == RLIM64_INFINITY as _ { None } else { Some(lim.rlim_cur) }; - let maximum = if lim.rlim_max as u64 == RLIM64_INFINITY as u64 { + let maximum = if lim.rlim_max == RLIM64_INFINITY as _ { None } else { Some(lim.rlim_max) @@ -395,12 +395,12 @@ /// Like `rlimit_from_linux` but uses Linux's old 32-bit `rlimit`. #[allow(clippy::useless_conversion)] fn rlimit_from_linux_old(lim: rlimit) -> Rlimit { - let current = if lim.rlim_cur as u32 == RLIM_INFINITY as u32 { + let current = if lim.rlim_cur == RLIM_INFINITY as _ { None } else { Some(lim.rlim_cur.into()) }; - let maximum = if lim.rlim_max as u32 == RLIM_INFINITY as u32 { + let maximum = if lim.rlim_max == RLIM_INFINITY as _ { None } else { Some(lim.rlim_max.into()) @@ -436,11 +436,6 @@ } #[inline] -pub(crate) fn waitpgid(pgid: Pid, waitopts: WaitOptions) -> io::Result> { - _waitpid(-pgid.as_raw_nonzero().get(), waitopts) -} - -#[inline] pub(crate) fn _waitpid( pid: RawPid, waitopts: WaitOptions, @@ -464,7 +459,6 @@ match id { WaitId::All => _waitid_all(options), WaitId::Pid(pid) => _waitid_pid(pid, options), - WaitId::Pgid(pid) => _waitid_pgid(pid, options), WaitId::PidFd(fd) => _waitid_pidfd(fd, options), } } @@ -508,25 +502,6 @@ } #[inline] -fn _waitid_pgid(pgid: Option, options: WaitidOptions) -> io::Result> { - // `waitid` can return successfully without initializing the struct (no - // children found when using `WNOHANG`) - let mut status = MaybeUninit::::zeroed(); - unsafe { - ret(syscall!( - __NR_waitid, - c_uint(c::P_PGID), - c_int(Pid::as_raw(pgid)), - by_mut(&mut status), - c_int(options.bits() as _), - zero() - ))? - }; - - Ok(unsafe { cvt_waitid_status(status) }) -} - -#[inline] fn _waitid_pidfd(fd: BorrowedFd<'_>, options: WaitidOptions) -> io::Result> { // `waitid` can return successfully without initializing the struct (no // children found when using `WNOHANG`) @@ -635,7 +610,6 @@ unsafe { ret_owned_fd(syscall_readonly!(__NR_pidfd_open, pid, flags)) } } -#[cfg(feature = "alloc")] #[inline] pub(crate) fn getgroups(buf: &mut [Gid]) -> io::Result { let len = buf.len().try_into().map_err(|_| io::Errno::NOMEM)?; @@ -648,3 +622,15 @@ )) } } + +#[inline] +pub(crate) fn ioctl_tiocsctty(fd: BorrowedFd<'_>) -> io::Result<()> { + unsafe { + ret(syscall_readonly!( + __NR_ioctl, + fd, + c_uint(TIOCSCTTY), + by_ref(&0_u32) + )) + } +} diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/process/types.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/process/types.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/process/types.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/process/types.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,3 +1,4 @@ +use crate::backend::c; use linux_raw_sys::general::membarrier_cmd; /// A command for use with [`membarrier`] and [`membarrier_cpu`]. @@ -77,6 +78,15 @@ Rttime = linux_raw_sys::general::RLIMIT_RTTIME, } +/// `EXIT_SUCCESS` +pub const EXIT_SUCCESS: c::c_int = 0; +/// `EXIT_FAILURE` +pub const EXIT_FAILURE: c::c_int = 1; +/// The status value of a child terminated with a [`Signal::Abort`] signal. +/// +/// [`Signal::Abort`]: crate::process::Signal::Abort +pub const EXIT_SIGNALED_SIGABRT: c::c_int = 128 + linux_raw_sys::general::SIGABRT as i32; + /// A CPU identifier as a raw integer. pub type RawCpuid = u32; diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/pty/syscalls.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/pty/syscalls.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/pty/syscalls.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/pty/syscalls.rs 2023-10-30 19:40:00.000000000 +0000 @@ -3,21 +3,22 @@ //! # Safety //! //! See the `rustix::backend` module documentation for details. -#![allow(unsafe_code, clippy::undocumented_unsafe_blocks)] +#![allow(unsafe_code)] +#![allow(clippy::undocumented_unsafe_blocks)] -use crate::backend::conv::{by_ref, c_uint, ret}; -use crate::fd::BorrowedFd; +use crate::backend::c; +use crate::backend::conv::{by_ref, c_uint, ret, ret_owned_fd}; +use crate::fd::{BorrowedFd, OwnedFd}; +use crate::ffi::CString; use crate::io; -use linux_raw_sys::ioctl::TIOCSPTLCK; -#[cfg(feature = "alloc")] -use { - crate::backend::c, crate::ffi::CString, crate::path::DecInt, alloc::vec::Vec, - core::mem::MaybeUninit, linux_raw_sys::ioctl::TIOCGPTN, -}; +use crate::path::DecInt; +use crate::pty::OpenptFlags; +use alloc::vec::Vec; +use core::mem::MaybeUninit; +use linux_raw_sys::ioctl::{TIOCGPTN, TIOCGPTPEER, TIOCSPTLCK}; -#[cfg(feature = "alloc")] #[inline] -pub(crate) fn ptsname(fd: BorrowedFd<'_>, mut buffer: Vec) -> io::Result { +pub(crate) fn ptsname(fd: BorrowedFd, mut buffer: Vec) -> io::Result { unsafe { let mut n = MaybeUninit::::uninit(); ret(syscall!(__NR_ioctl, fd, c_uint(TIOCGPTN), &mut n))?; @@ -31,7 +32,7 @@ } #[inline] -pub(crate) fn unlockpt(fd: BorrowedFd<'_>) -> io::Result<()> { +pub(crate) fn unlockpt(fd: BorrowedFd) -> io::Result<()> { unsafe { ret(syscall_readonly!( __NR_ioctl, @@ -41,3 +42,16 @@ )) } } + +#[cfg(target_os = "linux")] +#[inline] +pub(crate) fn ioctl_tiocgptpeer(fd: BorrowedFd, flags: OpenptFlags) -> io::Result { + unsafe { + ret_owned_fd(syscall_readonly!( + __NR_ioctl, + fd, + c_uint(TIOCGPTPEER), + flags + )) + } +} diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/rand/syscalls.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/rand/syscalls.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/rand/syscalls.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/rand/syscalls.rs 2023-10-30 19:40:00.000000000 +0000 @@ -3,7 +3,8 @@ //! # Safety //! //! See the `rustix::backend` module documentation for details. -#![allow(unsafe_code, clippy::undocumented_unsafe_blocks)] +#![allow(unsafe_code)] +#![allow(clippy::undocumented_unsafe_blocks)] use crate::backend::conv::{ret_usize, slice_mut}; use crate::io; diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/rand/types.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/rand/types.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/rand/types.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/rand/types.rs 2023-10-30 19:40:00.000000000 +0000 @@ -13,8 +13,5 @@ const NONBLOCK = linux_raw_sys::general::GRND_NONBLOCK; /// `GRND_INSECURE` const INSECURE = linux_raw_sys::general::GRND_INSECURE; - - /// - const _ = !0; } } diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/reg.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/reg.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/reg.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/reg.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,8 +1,8 @@ //! Encapsulation for system call arguments and return values. //! //! The inline-asm code paths do some amount of reordering of arguments; to -//! ensure that we don't accidentally misroute an argument or return value, we -//! use distinct types for each argument index and return value. +//! ensure that we don't accidentally misroute an argument or return value, +//! we use distinct types for each argument index and return value. //! //! # Safety //! @@ -23,8 +23,8 @@ /// /// # Safety /// - /// This should be used immediately before the syscall instruction, and the - /// returned value shouldn't be used for any other purpose. + /// This should be used immediately before the syscall instruction, and + /// the returned value shouldn't be used for any other purpose. #[must_use] unsafe fn to_asm(self) -> *mut Opaque; } @@ -35,8 +35,8 @@ /// /// # Safety /// - /// This should be used immediately after the syscall instruction, and the - /// operand value shouldn't be used for any other purpose. + /// This should be used immediately after the syscall instruction, and + /// the operand value shouldn't be used for any other purpose. #[must_use] unsafe fn from_asm(raw: *mut Opaque) -> Self; } diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/runtime/syscalls.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/runtime/syscalls.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/runtime/syscalls.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/runtime/syscalls.rs 2023-10-30 19:40:00.000000000 +0000 @@ -3,14 +3,14 @@ //! # Safety //! //! See the `rustix::backend` module documentation for details. -#![allow(unsafe_code, clippy::undocumented_unsafe_blocks)] +#![allow(unsafe_code)] +#![allow(clippy::undocumented_unsafe_blocks)] use crate::backend::c; #[cfg(target_arch = "x86")] use crate::backend::conv::by_mut; use crate::backend::conv::{ - by_ref, c_int, c_uint, ret, ret_c_int, ret_c_int_infallible, ret_error, ret_void_star, size_of, - zero, + by_ref, c_int, c_uint, ret, ret_c_int, ret_c_int_infallible, ret_error, size_of, zero, }; #[cfg(feature = "fs")] use crate::fd::BorrowedFd; @@ -23,7 +23,6 @@ use crate::signal::Signal; use crate::timespec::Timespec; use crate::utils::option_as_ptr; -use core::ffi::c_void; use core::mem::MaybeUninit; #[cfg(target_pointer_width = "32")] use linux_raw_sys::general::__kernel_old_timespec; @@ -94,10 +93,7 @@ ret_infallible(syscall_readonly!( __NR_arch_prctl, c_uint(ARCH_SET_FS), - data, - zero(), - zero(), - zero() + data )) } @@ -109,14 +105,7 @@ #[inline] pub(crate) unsafe fn set_thread_name(name: &CStr) -> io::Result<()> { - ret(syscall_readonly!( - __NR_prctl, - c_uint(PR_SET_NAME), - name, - zero(), - zero(), - zero() - )) + ret(syscall_readonly!(__NR_prctl, c_uint(PR_SET_NAME), name)) } #[inline] @@ -265,9 +254,3 @@ pub(crate) fn exit_group(code: c::c_int) -> ! { unsafe { syscall_noreturn!(__NR_exit_group, c_int(code)) } } - -#[inline] -pub(crate) unsafe fn brk(addr: *mut c::c_void) -> io::Result<*mut c_void> { - // Don't mark this `readonly`, so that loads don't get reordered past it. - ret_void_star(syscall!(__NR_brk, addr)) -} diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/runtime/tls.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/runtime/tls.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/runtime/tls.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/runtime/tls.rs 2023-10-30 19:40:00.000000000 +0000 @@ -7,10 +7,9 @@ #![allow(unsafe_code)] use crate::backend::c; -use crate::backend::param::auxv::exe_phdrs; -use core::arch::global_asm; -use core::ptr::{null, NonNull}; -use linux_raw_sys::elf::*; +use crate::backend::elf::*; +use crate::backend::param::auxv::exe_phdrs_slice; +use core::ptr::null; /// For use with [`set_thread_area`]. /// @@ -23,64 +22,30 @@ let mut tls_phdr = null(); let mut stack_size = 0; - let (first_phdr, phent, phnum) = exe_phdrs(); - let mut current_phdr = first_phdr.cast::(); - - // The dynamic address of the dynamic section, which we can compare with - // the `PT_DYNAMIC` header's static address, if present. - let dynamic_addr: *const c::c_void = unsafe { &_DYNAMIC }; + let phdrs = exe_phdrs_slice(); // SAFETY: We assume the phdr array pointer and length the kernel provided // to the process describe a valid phdr array. unsafe { - let phdrs_end = current_phdr.cast::().add(phnum * phent).cast(); - while current_phdr != phdrs_end { - let phdr = &*current_phdr; - current_phdr = current_phdr.cast::().add(phent).cast(); - + for phdr in phdrs { match phdr.p_type { - // Compute the offset from the static virtual addresses - // in the `p_vaddr` fields to the dynamic addresses. We don't - // always get a `PT_PHDR` or `PT_DYNAMIC` header, so use - // whichever one we get. - PT_PHDR => base = first_phdr.cast::().wrapping_sub(phdr.p_vaddr), - PT_DYNAMIC => base = dynamic_addr.cast::().wrapping_sub(phdr.p_vaddr), - + PT_PHDR => base = phdrs.as_ptr().cast::().sub(phdr.p_vaddr), PT_TLS => tls_phdr = phdr, PT_GNU_STACK => stack_size = phdr.p_memsz, _ => {} } } - if tls_phdr.is_null() { - StartupTlsInfo { - addr: NonNull::dangling().as_ptr(), - mem_size: 0, - file_size: 0, - align: 1, - stack_size: 0, - } - } else { - StartupTlsInfo { - addr: base.cast::().wrapping_add((*tls_phdr).p_vaddr).cast(), - mem_size: (*tls_phdr).p_memsz, - file_size: (*tls_phdr).p_filesz, - align: (*tls_phdr).p_align, - stack_size, - } + StartupTlsInfo { + addr: base.cast::().add((*tls_phdr).p_vaddr).cast(), + mem_size: (*tls_phdr).p_memsz, + file_size: (*tls_phdr).p_filesz, + align: (*tls_phdr).p_align, + stack_size, } } } -extern "C" { - /// Declare the `_DYNAMIC` symbol so that we can compare its address with - /// the static address in the `PT_DYNAMIC` header to learn our offset. Use - /// a weak symbol because `_DYNAMIC` is not always present. - static _DYNAMIC: c::c_void; -} -// Rust has `extern_weak` but it isn't stable, so use a `global_asm`. -global_asm!(".weak _DYNAMIC"); - /// The values returned from [`startup_tls_info`]. /// /// [`startup_tls_info`]: crate::runtime::startup_tls_info diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/shm/mod.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/shm/mod.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/shm/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/shm/mod.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,2 +0,0 @@ -pub(crate) mod syscalls; -pub(crate) mod types; diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/shm/syscalls.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/shm/syscalls.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/shm/syscalls.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/shm/syscalls.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,47 +0,0 @@ -use crate::ffi::CStr; - -use crate::backend::fs::syscalls::{open, unlink}; -use crate::backend::fs::types::{Mode, OFlags}; -use crate::fd::OwnedFd; -use crate::io; -use crate::shm::ShmOFlags; - -const NAME_MAX: usize = 255; -const SHM_DIR: &[u8] = b"/dev/shm/"; - -fn get_shm_name(name: &CStr) -> io::Result<([u8; NAME_MAX + SHM_DIR.len() + 1], usize)> { - let name = name.to_bytes(); - - if name.len() > NAME_MAX { - return Err(io::Errno::NAMETOOLONG); - } - - let num_slashes = name.iter().take_while(|x| **x == b'/').count(); - let after_slashes = &name[num_slashes..]; - if after_slashes.is_empty() - || after_slashes == b"." - || after_slashes == b".." - || after_slashes.contains(&b'/') - { - return Err(io::Errno::INVAL); - } - - let mut path = [0; NAME_MAX + SHM_DIR.len() + 1]; - path[..SHM_DIR.len()].copy_from_slice(SHM_DIR); - path[SHM_DIR.len()..SHM_DIR.len() + name.len()].copy_from_slice(name); - Ok((path, SHM_DIR.len() + name.len() + 1)) -} - -pub(crate) fn shm_open(name: &CStr, oflags: ShmOFlags, mode: Mode) -> io::Result { - let (path, len) = get_shm_name(name)?; - open( - CStr::from_bytes_with_nul(&path[..len]).unwrap(), - OFlags::from_bits(oflags.bits()).unwrap() | OFlags::CLOEXEC, - mode, - ) -} - -pub(crate) fn shm_unlink(name: &CStr) -> io::Result<()> { - let (path, len) = get_shm_name(name)?; - unlink(CStr::from_bytes_with_nul(&path[..len]).unwrap()) -} diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/shm/types.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/shm/types.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/shm/types.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/shm/types.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,30 +0,0 @@ -use crate::backend::c; -use bitflags::bitflags; - -bitflags! { - /// `O_*` constants for use with [`shm_open`]. - /// - /// [`shm_open`]: crate:shm::shm_open - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct ShmOFlags: c::c_uint { - /// `O_CREAT` - #[doc(alias = "CREAT")] - const CREATE = linux_raw_sys::general::O_CREAT; - - /// `O_EXCL` - const EXCL = linux_raw_sys::general::O_EXCL; - - /// `O_RDONLY` - const RDONLY = linux_raw_sys::general::O_RDONLY; - - /// `O_RDWR` - const RDWR = linux_raw_sys::general::O_RDWR; - - /// `O_TRUNC` - const TRUNC = linux_raw_sys::general::O_TRUNC; - - /// - const _ = !0; - } -} diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/system/syscalls.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/system/syscalls.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/system/syscalls.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/system/syscalls.rs 2023-10-30 19:40:00.000000000 +0000 @@ -3,13 +3,13 @@ //! # Safety //! //! See the `rustix::backend` module documentation for details. -#![allow(unsafe_code, clippy::undocumented_unsafe_blocks)] +#![allow(unsafe_code)] +#![allow(clippy::undocumented_unsafe_blocks)] use super::types::RawUname; -use crate::backend::c; -use crate::backend::conv::{c_int, ret, ret_infallible, slice}; +use crate::backend::conv::{ret, ret_infallible, slice}; use crate::io; -use crate::system::{RebootCommand, Sysinfo}; +use crate::system::Sysinfo; use core::mem::MaybeUninit; #[inline] @@ -35,15 +35,3 @@ let (ptr, len) = slice(name); unsafe { ret(syscall_readonly!(__NR_sethostname, ptr, len)) } } - -#[inline] -pub(crate) fn reboot(cmd: RebootCommand) -> io::Result<()> { - unsafe { - ret(syscall_readonly!( - __NR_reboot, - c_int(c::LINUX_REBOOT_MAGIC1), - c_int(c::LINUX_REBOOT_MAGIC2), - c_int(cmd as i32) - )) - } -} diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/termios/syscalls.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/termios/syscalls.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/termios/syscalls.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/termios/syscalls.rs 2023-10-30 19:40:00.000000000 +0000 @@ -3,25 +3,27 @@ //! # Safety //! //! See the `rustix::backend` module documentation for details. -#![allow(unsafe_code, clippy::undocumented_unsafe_blocks)] +#![allow(unsafe_code)] +#![allow(clippy::undocumented_unsafe_blocks)] use crate::backend::c; use crate::backend::conv::{by_ref, c_uint, ret}; use crate::fd::BorrowedFd; use crate::io; use crate::pid::Pid; -#[cfg(all(feature = "alloc", feature = "procfs"))] +#[cfg(feature = "procfs")] use crate::procfs; use crate::termios::{ Action, ControlModes, InputModes, LocalModes, OptionalActions, OutputModes, QueueSelector, SpecialCodeIndex, Termios, Winsize, }; -#[cfg(all(feature = "alloc", feature = "procfs"))] +#[cfg(feature = "procfs")] use crate::{ffi::CStr, fs::FileType, path::DecInt}; use core::mem::MaybeUninit; use linux_raw_sys::general::IBSHIFT; use linux_raw_sys::ioctl::{ - TCFLSH, TCSBRK, TCXONC, TIOCGPGRP, TIOCGSID, TIOCGWINSZ, TIOCSPGRP, TIOCSWINSZ, + TCFLSH, TCSBRK, TCXONC, TIOCEXCL, TIOCGPGRP, TIOCGSID, TIOCGWINSZ, TIOCNXCL, TIOCSPGRP, + TIOCSWINSZ, }; #[inline] @@ -37,46 +39,8 @@ pub(crate) fn tcgetattr(fd: BorrowedFd<'_>) -> io::Result { unsafe { let mut result = MaybeUninit::::uninit(); - - // QEMU's `TCGETS2` doesn't currently set `input_speed` or - // `output_speed` on PowerPC, so zero out the fields ourselves. - #[cfg(any(target_arch = "powerpc", target_arch = "powerpc64"))] - { - result.write(core::mem::zeroed()); - } - ret(syscall!(__NR_ioctl, fd, c_uint(c::TCGETS2), &mut result))?; - - let result = result.assume_init(); - - // QEMU's `TCGETS2` doesn't currently set `input_speed` or - // `output_speed` on PowerPC, so set them manually if we can. - #[cfg(any(target_arch = "powerpc", target_arch = "powerpc64"))] - let result = { - use crate::termios::speed; - let mut result = result; - if result.output_speed == 0 && (result.control_modes.bits() & c::CBAUD) != c::BOTHER { - if let Some(output_speed) = speed::decode(result.control_modes.bits() & c::CBAUD) { - result.output_speed = output_speed; - } - } - if result.input_speed == 0 - && ((result.control_modes.bits() & c::CIBAUD) >> c::IBSHIFT) != c::BOTHER - { - // For input speeds, `B0` is special-cased to mean the input - // speed is the same as the output speed. - if ((result.control_modes.bits() & c::CIBAUD) >> c::IBSHIFT) == c::B0 { - result.input_speed = result.output_speed; - } else if let Some(input_speed) = - speed::decode((result.control_modes.bits() & c::CIBAUD) >> c::IBSHIFT) - { - result.input_speed = input_speed; - } - } - result - }; - - Ok(result) + Ok(result.assume_init()) } } @@ -92,7 +56,7 @@ #[inline] pub(crate) fn tcsetattr( - fd: BorrowedFd<'_>, + fd: BorrowedFd, optional_actions: OptionalActions, termios: &Termios, ) -> io::Result<()> { @@ -120,17 +84,17 @@ } #[inline] -pub(crate) fn tcsendbreak(fd: BorrowedFd<'_>) -> io::Result<()> { +pub(crate) fn tcsendbreak(fd: BorrowedFd) -> io::Result<()> { unsafe { ret(syscall_readonly!(__NR_ioctl, fd, c_uint(TCSBRK), c_uint(0))) } } #[inline] -pub(crate) fn tcdrain(fd: BorrowedFd<'_>) -> io::Result<()> { +pub(crate) fn tcdrain(fd: BorrowedFd) -> io::Result<()> { unsafe { ret(syscall_readonly!(__NR_ioctl, fd, c_uint(TCSBRK), c_uint(1))) } } #[inline] -pub(crate) fn tcflush(fd: BorrowedFd<'_>, queue_selector: QueueSelector) -> io::Result<()> { +pub(crate) fn tcflush(fd: BorrowedFd, queue_selector: QueueSelector) -> io::Result<()> { unsafe { ret(syscall_readonly!( __NR_ioctl, @@ -142,7 +106,7 @@ } #[inline] -pub(crate) fn tcflow(fd: BorrowedFd<'_>, action: Action) -> io::Result<()> { +pub(crate) fn tcflow(fd: BorrowedFd, action: Action) -> io::Result<()> { unsafe { ret(syscall_readonly!( __NR_ioctl, @@ -154,7 +118,7 @@ } #[inline] -pub(crate) fn tcgetsid(fd: BorrowedFd<'_>) -> io::Result { +pub(crate) fn tcgetsid(fd: BorrowedFd) -> io::Result { unsafe { let mut result = MaybeUninit::::uninit(); ret(syscall!(__NR_ioctl, fd, c_uint(TIOCGSID), &mut result))?; @@ -164,7 +128,7 @@ } #[inline] -pub(crate) fn tcsetwinsize(fd: BorrowedFd<'_>, winsize: Winsize) -> io::Result<()> { +pub(crate) fn tcsetwinsize(fd: BorrowedFd, winsize: Winsize) -> io::Result<()> { unsafe { ret(syscall!( __NR_ioctl, @@ -180,6 +144,16 @@ unsafe { ret(syscall!(__NR_ioctl, fd, c_uint(TIOCSPGRP), pid)) } } +#[inline] +pub(crate) fn ioctl_tiocexcl(fd: BorrowedFd<'_>) -> io::Result<()> { + unsafe { ret(syscall_readonly!(__NR_ioctl, fd, c_uint(TIOCEXCL))) } +} + +#[inline] +pub(crate) fn ioctl_tiocnxcl(fd: BorrowedFd<'_>) -> io::Result<()> { + unsafe { ret(syscall_readonly!(__NR_ioctl, fd, c_uint(TIOCNXCL))) } +} + /// A wrapper around a conceptual `cfsetspeed` which handles an arbitrary /// integer speed value. #[inline] @@ -266,7 +240,8 @@ tcgetwinsize(fd).is_ok() } -#[cfg(all(feature = "alloc", feature = "procfs"))] +#[cfg(feature = "procfs")] +#[allow(unsafe_code)] pub(crate) fn ttyname(fd: BorrowedFd<'_>, buf: &mut [MaybeUninit]) -> io::Result { let fd_stat = crate::backend::fs::syscalls::fstat(fd)?; @@ -278,7 +253,7 @@ // Check that `fd` is really a tty. tcgetwinsize(fd)?; - // Get a fd to "/proc/self/fd". + // Get a fd to '/proc/self/fd'. let proc_self_fd = procfs::proc_self_fd()?; // Gather the ttyname by reading the "fd" file inside `proc_self_fd`. diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/thread/futex.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/thread/futex.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/thread/futex.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/thread/futex.rs 2023-10-30 19:40:00.000000000 +0000 @@ -9,10 +9,6 @@ const PRIVATE = linux_raw_sys::general::FUTEX_PRIVATE_FLAG; /// `FUTEX_CLOCK_REALTIME` const CLOCK_REALTIME = linux_raw_sys::general::FUTEX_CLOCK_REALTIME; - - // This deliberately lacks a `const _ = !0`, so that users can use - // `from_bits_truncate` to extract the `SocketFlags` from a flags - // value that also includes a `SocketType`. } } diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/thread/mod.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/thread/mod.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/thread/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/thread/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,2 +1,4 @@ -pub(crate) mod futex; +mod futex; pub(crate) mod syscalls; + +pub use futex::{FutexFlags, FutexOperation}; diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/thread/syscalls.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/thread/syscalls.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/thread/syscalls.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/thread/syscalls.rs 2023-10-30 19:40:00.000000000 +0000 @@ -3,7 +3,8 @@ //! # Safety //! //! See the `rustix::backend` module documentation for details. -#![allow(unsafe_code, clippy::undocumented_unsafe_blocks)] +#![allow(unsafe_code)] +#![allow(clippy::undocumented_unsafe_blocks)] use crate::backend::c; use crate::backend::conv::{ @@ -273,7 +274,7 @@ } #[inline] -pub(crate) fn setns(fd: BorrowedFd<'_>, nstype: c::c_int) -> io::Result { +pub(crate) fn setns(fd: BorrowedFd, nstype: c::c_int) -> io::Result { unsafe { ret_c_int(syscall_readonly!(__NR_setns, fd, c_int(nstype))) } } diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/time/syscalls.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/time/syscalls.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/time/syscalls.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/time/syscalls.rs 2023-10-30 19:40:00.000000000 +0000 @@ -3,7 +3,8 @@ //! # Safety //! //! See the `rustix::backend` module documentation for details. -#![allow(unsafe_code, clippy::undocumented_unsafe_blocks)] +#![allow(unsafe_code)] +#![allow(clippy::undocumented_unsafe_blocks)] use crate::backend::conv::{ret, ret_infallible}; use crate::clockid::ClockId; diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/time/types.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/time/types.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/time/types.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/time/types.rs 2023-10-30 19:40:00.000000000 +0000 @@ -20,9 +20,6 @@ /// `TFD_CLOEXEC` const CLOEXEC = linux_raw_sys::general::TFD_CLOEXEC; - - /// - const _ = !0; } } @@ -38,9 +35,6 @@ /// `TFD_TIMER_CANCEL_ON_SET` const CANCEL_ON_SET = linux_raw_sys::general::TFD_TIMER_CANCEL_ON_SET; - - /// - const _ = !0; } } diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/ugid/syscalls.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/ugid/syscalls.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/ugid/syscalls.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/ugid/syscalls.rs 2023-10-30 19:40:00.000000000 +0000 @@ -3,7 +3,8 @@ //! # Safety //! //! See the `rustix::backend` module documentation for details. -#![allow(unsafe_code, clippy::undocumented_unsafe_blocks)] +#![allow(unsafe_code)] +#![allow(clippy::undocumented_unsafe_blocks)] use crate::backend::c; use crate::backend::conv::ret_usize_infallible; diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/vdso.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/vdso.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/vdso.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/vdso.rs 2023-10-30 19:40:00.000000000 +0000 @@ -13,12 +13,12 @@ #![allow(unsafe_code)] use super::c; +use super::elf::*; use crate::ffi::CStr; use crate::utils::check_raw_pointer; use core::ffi::c_void; use core::mem::size_of; use core::ptr::{null, null_mut}; -use linux_raw_sys::elf::*; pub(super) struct Vdso { // Load information @@ -55,7 +55,7 @@ /// Create a `Vdso` value by parsing the vDSO at the `sysinfo_ehdr` address. fn init_from_sysinfo_ehdr() -> Option { - // SAFETY: The auxv initialization code does extensive checks to ensure + // SAFETY: the auxv initialization code does extensive checks to ensure // that the value we get really is an `AT_SYSINFO_EHDR` value from the // kernel. unsafe { @@ -106,9 +106,9 @@ vdso.load_end = vdso.base_plus(phdr.p_offset.checked_add(phdr.p_memsz)?)?; vdso.pv_offset = phdr.p_offset.wrapping_sub(phdr.p_vaddr); } else if phdr.p_type == PT_DYNAMIC { - // If `p_offset` is zero, it's more likely that we're looking - // at memory that has been zeroed than that the kernel has - // somehow aliased the `Ehdr` and the `Elf_Dyn` array. + // If `p_offset` is zero, it's more likely that we're looking at memory + // that has been zeroed than that the kernel has somehow aliased the + // `Ehdr` and the `Elf_Dyn` array. if phdr.p_offset < size_of::() { return None; } @@ -117,9 +117,9 @@ .as_ptr(); num_dyn = phdr.p_memsz / size_of::(); } else if phdr.p_type == PT_INTERP || phdr.p_type == PT_GNU_RELRO { - // Don't trust any ELF image that has an “interpreter†or - // that uses RELRO, which is likely to be a user ELF image - // rather and not the kernel vDSO. + // Don't trust any ELF image that has an “interpreter†or that uses + // RELRO, which is likely to be a user ELF image rather and not the + // kernel vDSO. return None; } } @@ -143,31 +143,28 @@ match d.d_tag { DT_STRTAB => { vdso.symstrings = - check_raw_pointer::(vdso.addr_from_elf(d.d_un.d_ptr)? as *mut _)? - .as_ptr(); + check_raw_pointer::(vdso.addr_from_elf(d.d_val)? as *mut _)?.as_ptr(); } DT_SYMTAB => { vdso.symtab = - check_raw_pointer::(vdso.addr_from_elf(d.d_un.d_ptr)? as *mut _)? + check_raw_pointer::(vdso.addr_from_elf(d.d_val)? as *mut _)? .as_ptr(); } DT_HASH => { - hash = check_raw_pointer::(vdso.addr_from_elf(d.d_un.d_ptr)? as *mut _)? - .as_ptr(); + hash = + check_raw_pointer::(vdso.addr_from_elf(d.d_val)? as *mut _)?.as_ptr(); } DT_VERSYM => { vdso.versym = - check_raw_pointer::(vdso.addr_from_elf(d.d_un.d_ptr)? as *mut _)? - .as_ptr(); + check_raw_pointer::(vdso.addr_from_elf(d.d_val)? as *mut _)?.as_ptr(); } DT_VERDEF => { - vdso.verdef = check_raw_pointer::( - vdso.addr_from_elf(d.d_un.d_ptr)? as *mut _, - )? - .as_ptr(); + vdso.verdef = + check_raw_pointer::(vdso.addr_from_elf(d.d_val)? as *mut _)? + .as_ptr(); } DT_SYMENT => { - if d.d_un.d_ptr != size_of::() { + if d.d_val != size_of::() { return None; // Failed } } @@ -176,8 +173,8 @@ } i = i.checked_add(1)?; } - // The upstream code checks `symstrings`, `symtab`, and `hash` for - // null; here, `check_raw_pointer` has already done that. + // The upstream code checks `symstrings`, `symtab`, and `hash` for null; + // here, `check_raw_pointer` has already done that. if vdso.verdef.is_null() { vdso.versym = null(); diff -Nru temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/vdso_wrappers.rs temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/vdso_wrappers.rs --- temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/vdso_wrappers.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/backend/linux_raw/vdso_wrappers.rs 2023-10-30 19:40:00.000000000 +0000 @@ -36,8 +36,8 @@ #[inline] pub(crate) fn clock_gettime(which_clock: ClockId) -> __kernel_timespec { // SAFETY: `CLOCK_GETTIME` contains either null or the address of a - // function with an ABI like libc `clock_gettime`, and calling it has the - // side effect of writing to the result buffer, and no others. + // function with an ABI like libc `clock_gettime`, and calling it has + // the side effect of writing to the result buffer, and no others. unsafe { let mut result = MaybeUninit::<__kernel_timespec>::uninit(); let callee = match transmute(CLOCK_GETTIME.load(Relaxed)) { @@ -78,8 +78,8 @@ }; // SAFETY: `CLOCK_GETTIME` contains either null or the address of a - // function with an ABI like libc `clock_gettime`, and calling it has the - // side effect of writing to the result buffer, and no others. + // function with an ABI like libc `clock_gettime`, and calling it has + // the side effect of writing to the result buffer, and no others. unsafe { const EINVAL: c::c_int = -(c::EINVAL as c::c_int); let mut timespec = MaybeUninit::::uninit(); @@ -234,8 +234,8 @@ #[cold] fn init_clock_gettime() -> ClockGettimeType { init(); - // SAFETY: Load the function address from static storage that we just - // initialized. + // SAFETY: Load the function address from static storage that we + // just initialized. unsafe { transmute(CLOCK_GETTIME.load(Relaxed)) } } @@ -244,8 +244,8 @@ #[cold] fn init_syscall() -> SyscallType { init(); - // SAFETY: Load the function address from static storage that we just - // initialized. + // SAFETY: Load the function address from static storage that we + // just initialized. unsafe { transmute(SYSCALL.load(Relaxed)) } } @@ -318,7 +318,7 @@ #[cfg(target_arch = "x86")] extern "C" { /// A symbol pointing to an `int 0x80` instruction. This “function†is only - /// called from assembly, and only with the x86 syscall calling convention, + /// called from assembly, and only with the x86 syscall calling convention. /// so its signature here is not its true signature. /// /// This extern block and the `global_asm!` below can be replaced with @@ -345,9 +345,9 @@ fn minimal_init() { // SAFETY: Store default function addresses in static storage so that if we - // end up making any system calls while we read the vDSO, they'll work. If - // the memory happens to already be initialized, this is redundant, but not - // harmful. + // end up making any system calls while we read the vDSO, they'll work. + // If the memory happens to already be initialized, this is redundant, but + // not harmful. unsafe { #[cfg(feature = "time")] { @@ -381,9 +381,9 @@ if let Some(vdso) = vdso::Vdso::new() { #[cfg(feature = "time")] { - // Look up the platform-specific `clock_gettime` symbol as - // documented [here], except on 32-bit platforms where we look up - // the `64`-suffixed variant and fail if we don't find it. + // Look up the platform-specific `clock_gettime` symbol as documented + // [here], except on 32-bit platforms where we look up the + // `64`-suffixed variant and fail if we don't find it. // // [here]: https://man7.org/linux/man-pages/man7/vdso.7.html #[cfg(target_arch = "x86_64")] @@ -408,8 +408,8 @@ #[cfg(target_pointer_width = "64")] let ok = true; - // On some 32-bit platforms, the 64-bit `clock_gettime` symbols are - // not available on older kernel versions. + // On some 32-bit platforms, the 64-bit `clock_gettime` symbols are not + // available on older kernel versions. #[cfg(any( target_arch = "arm", target_arch = "mips", @@ -421,9 +421,9 @@ if ok { assert!(!ptr.is_null()); - // SAFETY: Store the computed function addresses in static - // storage so that we don't need to compute it again (but if - // we do, it doesn't hurt anything). + // SAFETY: Store the computed function addresses in static storage + // so that we don't need to compute it again (but if we do, it + // doesn't hurt anything). unsafe { CLOCK_GETTIME.store(ptr.cast(), Relaxed); } diff -Nru temporalio-1.3.0/vendor/rustix/src/bitcast.rs temporalio-1.3.0/vendor/rustix/src/bitcast.rs --- temporalio-1.3.0/vendor/rustix/src/bitcast.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/bitcast.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,9 +1,6 @@ -//! The `bitcast` and `bitflags_bits` macros. - -#![allow(unused_macros)] - // Ensure that the source and destination types are both primitive integer // types and the same size, and then bitcast. +#[allow(unused_macros)] macro_rules! bitcast { ($x:expr) => {{ if false { @@ -27,6 +24,7 @@ /// Return a [`bitcast`] of the value of `$x.bits()`, where `$x` is a /// `bitflags` type. +#[allow(unused_macros)] macro_rules! bitflags_bits { ($x:expr) => {{ bitcast!($x.bits()) diff -Nru temporalio-1.3.0/vendor/rustix/src/check_types.rs temporalio-1.3.0/vendor/rustix/src/check_types.rs --- temporalio-1.3.0/vendor/rustix/src/check_types.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/check_types.rs 2023-10-30 19:40:00.000000000 +0000 @@ -19,8 +19,8 @@ }; } -/// Check that the field of a struct has the same offset as the corresponding -/// field in the `sys` bindings. +/// Check that the field of a struct has the same offset as the +/// corresponding field in the `sys` bindings. macro_rules! check_struct_field { ($struct:ident, $field:ident) => { const_assert_eq!( @@ -54,8 +54,8 @@ }; } -/// The same as `check_struct_renamed_field`, but for when both the struct and -/// a field are renamed. +/// The same as `check_struct_renamed_field`, but for when both the struct +/// and a field are renamed. macro_rules! check_renamed_struct_renamed_field { ($to_struct:ident, $from_struct:ident, $to:ident, $from:ident) => { const_assert_eq!( diff -Nru temporalio-1.3.0/vendor/rustix/src/clockid.rs temporalio-1.3.0/vendor/rustix/src/clockid.rs --- temporalio-1.3.0/vendor/rustix/src/clockid.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/clockid.rs 2023-10-30 19:40:00.000000000 +0000 @@ -16,31 +16,21 @@ #[non_exhaustive] pub enum ClockId { /// `CLOCK_REALTIME` - Realtime = bitcast!(c::CLOCK_REALTIME), + Realtime = c::CLOCK_REALTIME, /// `CLOCK_MONOTONIC` - Monotonic = bitcast!(c::CLOCK_MONOTONIC), + Monotonic = c::CLOCK_MONOTONIC, /// `CLOCK_UPTIME` #[cfg(any(freebsdlike, target_os = "openbsd"))] Uptime = c::CLOCK_UPTIME, /// `CLOCK_PROCESS_CPUTIME_ID` - #[cfg(not(any( - solarish, - target_os = "netbsd", - target_os = "redox", - target_os = "vita" - )))] + #[cfg(not(any(solarish, target_os = "netbsd", target_os = "redox")))] ProcessCPUTime = c::CLOCK_PROCESS_CPUTIME_ID, /// `CLOCK_THREAD_CPUTIME_ID` - #[cfg(not(any( - solarish, - target_os = "netbsd", - target_os = "redox", - target_os = "vita" - )))] + #[cfg(not(any(solarish, target_os = "netbsd", target_os = "redox")))] ThreadCPUTime = c::CLOCK_THREAD_CPUTIME_ID, /// `CLOCK_REALTIME_COARSE` diff -Nru temporalio-1.3.0/vendor/rustix/src/cstr.rs temporalio-1.3.0/vendor/rustix/src/cstr.rs --- temporalio-1.3.0/vendor/rustix/src/cstr.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/cstr.rs 2023-10-30 19:40:00.000000000 +0000 @@ -44,9 +44,8 @@ // call `from_bytes_with_nul_unchecked`, which as of this writing // is defined as `#[inline]` and completely optimizes away. // - // SAFETY: We have manually checked that the string does not - // contain embedded NULs above, and we append or own NUL terminator - // here. + // SAFETY: We have manually checked that the string does not contain + // embedded NULs above, and we append or own NUL terminator here. unsafe { $crate::ffi::CStr::from_bytes_with_nul_unchecked(concat!($str, "\0").as_bytes()) } diff -Nru temporalio-1.3.0/vendor/rustix/src/event/kqueue.rs temporalio-1.3.0/vendor/rustix/src/event/kqueue.rs --- temporalio-1.3.0/vendor/rustix/src/event/kqueue.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/event/kqueue.rs 2023-10-30 19:40:00.000000000 +0000 @@ -73,11 +73,11 @@ flags: flags.bits() as _, fflags, data: { - // On OpenBSD, data is an `i64` and not an `isize`. + // On openbsd, data is an i64 and not an isize data as _ }, udata: { - // On NetBSD, udata is an `isize` and not a pointer. + // On netbsd, udata is an isize and not a pointer. // TODO: Strict provenance, prevent int-to-ptr cast. udata as _ }, @@ -93,7 +93,7 @@ /// Get the user data for this event. pub fn udata(&self) -> isize { - // On NetBSD, udata is an isize and not a pointer. + // On netbsd, udata is an isize and not a pointer. // TODO: Strict provenance, prevent ptr-to-int cast. self.inner.udata as _ @@ -101,7 +101,7 @@ /// Get the raw data for this event. pub fn data(&self) -> i64 { - // On some BSDs, data is an `isize` and not an `i64`. + // On some bsds, data is an isize and not an i64 self.inner.data as _ } @@ -262,9 +262,6 @@ /// TODO const ERROR = c::EV_ERROR as _; - - /// - const _ = !0; } } @@ -293,9 +290,6 @@ /// The link count of the file has changed. const LINK = c::NOTE_LINK; - - /// - const _ = !0; } } @@ -318,9 +312,6 @@ /// An error has occurred with following the process. const TRACKERR = c::NOTE_TRACKERR; - - /// - const _ = !0; } } @@ -350,9 +341,6 @@ /// Trigger the event. const TRIGGER = c::NOTE_TRIGGER; - - /// - const _ = !0; } } diff -Nru temporalio-1.3.0/vendor/rustix/src/event/mod.rs temporalio-1.3.0/vendor/rustix/src/event/mod.rs --- temporalio-1.3.0/vendor/rustix/src/event/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/event/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -7,7 +7,7 @@ target_os = "espidf" ))] mod eventfd; -#[cfg(all(feature = "alloc", bsd))] +#[cfg(bsd)] pub mod kqueue; mod poll; #[cfg(solarish)] diff -Nru temporalio-1.3.0/vendor/rustix/src/event/port.rs temporalio-1.3.0/vendor/rustix/src/event/port.rs --- temporalio-1.3.0/vendor/rustix/src/event/port.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/event/port.rs 2023-10-30 19:40:00.000000000 +0000 @@ -116,7 +116,6 @@ /// /// [OpenSolaris]: https://www.unix.com/man-page/opensolaris/3C/port_getn/ /// [illumos]: https://illumos.org/man/3C/port_getn -#[cfg(feature = "alloc")] pub fn port_getn( port: impl AsFd, events: &mut Vec, diff -Nru temporalio-1.3.0/vendor/rustix/src/ffi.rs temporalio-1.3.0/vendor/rustix/src/ffi.rs --- temporalio-1.3.0/vendor/rustix/src/ffi.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/ffi.rs 2023-10-30 19:40:00.000000000 +0000 @@ -9,7 +9,8 @@ // If we don't have std, we can depend on core and alloc having these features // in Rust 1.64+. -#[cfg(all(feature = "alloc", not(feature = "std")))] -pub use alloc::ffi::{CString, NulError}; #[cfg(not(feature = "std"))] -pub use core::ffi::{c_char, CStr, FromBytesWithNulError}; +pub use { + alloc::ffi::{CString, NulError}, + core::ffi::{c_char, CStr, FromBytesWithNulError}, +}; diff -Nru temporalio-1.3.0/vendor/rustix/src/fs/abs.rs temporalio-1.3.0/vendor/rustix/src/fs/abs.rs --- temporalio-1.3.0/vendor/rustix/src/fs/abs.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/fs/abs.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,7 +1,8 @@ //! POSIX-style filesystem functions which operate on bare paths. use crate::fd::OwnedFd; -#[cfg(not(any(target_os = "espidf", target_os = "vita")))] +use crate::ffi::{CStr, CString}; +#[cfg(not(target_os = "espidf"))] use crate::fs::Access; #[cfg(not(any( solarish, @@ -10,22 +11,15 @@ target_os = "netbsd", target_os = "nto", target_os = "redox", - target_os = "vita", target_os = "wasi", )))] use crate::fs::StatFs; #[cfg(not(any(target_os = "haiku", target_os = "redox", target_os = "wasi")))] use crate::fs::StatVfs; use crate::fs::{Mode, OFlags, Stat}; -#[cfg(not(target_os = "wasi"))] -use crate::ugid::{Gid, Uid}; +use crate::path::SMALL_PATH_BUFFER_SIZE; use crate::{backend, io, path}; -#[cfg(feature = "alloc")] -use { - crate::ffi::{CStr, CString}, - crate::path::SMALL_PATH_BUFFER_SIZE, - alloc::vec::Vec, -}; +use alloc::vec::Vec; /// `open(path, oflags, mode)`—Opens a file. /// @@ -107,13 +101,11 @@ /// /// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/readlink.html /// [Linux]: https://man7.org/linux/man-pages/man2/readlink.2.html -#[cfg(feature = "alloc")] #[inline] pub fn readlink>>(path: P, reuse: B) -> io::Result { path.into_with_c_str(|path| _readlink(path, reuse.into())) } -#[cfg(feature = "alloc")] fn _readlink(path: &CStr, mut buffer: Vec) -> io::Result { // This code would benefit from having a better way to read into // uninitialized memory, but that requires `unsafe`. @@ -130,8 +122,7 @@ buffer.resize(nread, 0_u8); return Ok(CString::new(buffer).unwrap()); } - // Use `Vec` reallocation strategy to grow capacity exponentially. - buffer.reserve(1); + buffer.reserve(1); // use `Vec` reallocation strategy to grow capacity exponentially buffer.resize(buffer.capacity(), 0_u8); } } @@ -237,7 +228,7 @@ /// /// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/access.html /// [Linux]: https://man7.org/linux/man-pages/man2/access.2.html -#[cfg(not(any(target_os = "espidf", target_os = "vita")))] +#[cfg(not(target_os = "espidf"))] #[inline] pub fn access(path: P, access: Access) -> io::Result<()> { path.into_with_c_str(|path| backend::fs::syscalls::access(path, access)) @@ -259,7 +250,6 @@ target_os = "netbsd", target_os = "nto", target_os = "redox", - target_os = "vita", target_os = "wasi", )))] #[inline] @@ -285,17 +275,3 @@ pub fn statvfs(path: P) -> io::Result { path.into_with_c_str(backend::fs::syscalls::statvfs) } - -/// `chown(path, owner, group)`—Sets open file or directory ownership. -/// -/// # References -/// - [POSIX] -/// - [Linux] -/// -/// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/chown.html -/// [Linux]: https://man7.org/linux/man-pages/man2/chown.2.html -#[cfg(not(target_os = "wasi"))] -#[inline] -pub fn chown(path: P, owner: Option, group: Option) -> io::Result<()> { - path.into_with_c_str(|path| backend::fs::syscalls::chown(path, owner, group)) -} diff -Nru temporalio-1.3.0/vendor/rustix/src/fs/at.rs temporalio-1.3.0/vendor/rustix/src/fs/at.rs --- temporalio-1.3.0/vendor/rustix/src/fs/at.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/fs/at.rs 2023-10-30 19:40:00.000000000 +0000 @@ -3,46 +3,41 @@ //! The `dirfd` argument to these functions may be a file descriptor for a //! directory, or the special value [`CWD`]. //! -//! [`cwd`]: crate::fs::CWD +//! [`cwd`]: crate::fs::cwd::CWD use crate::fd::OwnedFd; -#[cfg(not(any(target_os = "espidf", target_os = "vita")))] -use crate::fs::Access; -#[cfg(not(target_os = "espidf"))] -use crate::fs::AtFlags; +use crate::ffi::{CStr, CString}; #[cfg(apple)] use crate::fs::CloneFlags; +#[cfg(not(any(apple, target_os = "espidf", target_os = "wasi")))] +use crate::fs::FileType; #[cfg(linux_kernel)] use crate::fs::RenameFlags; -#[cfg(not(any(target_os = "aix", target_os = "espidf")))] -use crate::fs::Stat; -#[cfg(not(any(apple, target_os = "espidf", target_os = "vita", target_os = "wasi")))] -use crate::fs::{Dev, FileType}; #[cfg(not(any(target_os = "espidf", target_os = "wasi")))] use crate::fs::{Gid, Uid}; use crate::fs::{Mode, OFlags}; +use crate::path::SMALL_PATH_BUFFER_SIZE; use crate::{backend, io, path}; -use backend::fd::AsFd; -#[cfg(feature = "alloc")] +use alloc::vec::Vec; +use backend::fd::{AsFd, BorrowedFd}; +#[cfg(not(target_os = "espidf"))] use { - crate::ffi::{CStr, CString}, - crate::path::SMALL_PATH_BUFFER_SIZE, - alloc::vec::Vec, - backend::fd::BorrowedFd, + crate::fs::{Access, AtFlags, Stat, Timestamps}, + crate::timespec::Nsecs, }; -#[cfg(not(any(target_os = "espidf", target_os = "vita")))] -use {crate::fs::Timestamps, crate::timespec::Nsecs}; + +pub use backend::fs::types::{Dev, RawMode}; /// `UTIME_NOW` for use with [`utimensat`]. /// /// [`utimensat`]: crate::fs::utimensat -#[cfg(not(any(target_os = "espidf", target_os = "redox", target_os = "vita")))] +#[cfg(not(any(target_os = "espidf", target_os = "redox")))] pub const UTIME_NOW: Nsecs = backend::c::UTIME_NOW as Nsecs; /// `UTIME_OMIT` for use with [`utimensat`]. /// /// [`utimensat`]: crate::fs::utimensat -#[cfg(not(any(target_os = "espidf", target_os = "redox", target_os = "vita")))] +#[cfg(not(any(target_os = "espidf", target_os = "redox")))] pub const UTIME_OMIT: Nsecs = backend::c::UTIME_OMIT as Nsecs; /// `openat(dirfd, path, oflags, mode)`—Opens a file. @@ -81,7 +76,6 @@ /// /// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/readlinkat.html /// [Linux]: https://man7.org/linux/man-pages/man2/readlinkat.2.html -#[cfg(feature = "alloc")] #[inline] pub fn readlinkat>>( dirfd: Fd, @@ -91,7 +85,6 @@ path.into_with_c_str(|path| _readlinkat(dirfd.as_fd(), path, reuse.into())) } -#[cfg(feature = "alloc")] #[allow(unsafe_code)] fn _readlinkat(dirfd: BorrowedFd<'_>, path: &CStr, mut buffer: Vec) -> io::Result { buffer.clear(); @@ -103,8 +96,8 @@ debug_assert!(nread <= buffer.capacity()); if nread < buffer.capacity() { - // SAFETY: From the [documentation]: “On success, these calls - // return the number of bytes placed in buf.†+ // SAFETY: From the [documentation]: + // "On success, these calls return the number of bytes placed in buf." // // [documentation]: https://man7.org/linux/man-pages/man2/readlinkat.2.html unsafe { @@ -112,13 +105,13 @@ } // SAFETY: - // - “readlink places the contents of the symbolic link pathname in - // the buffer buf†- // - [POSIX definition 3.271: Pathname]: “A string that is used to - // identify a file.†- // - [POSIX definition 3.375: String]: “A contiguous sequence of - // bytes terminated by and including the first null byte.†- // - “readlink does not append a terminating null byte to buf.†+ // - "readlink places the contents of the symbolic link pathname in the buffer + // buf" + // - [POSIX definition 3.271: Pathname]: "A string that is used to identify a + // file." + // - [POSIX definition 3.375: String]: "A contiguous sequence of bytes + // terminated by and including the first null byte." + // - "readlink does not append a terminating null byte to buf." // // Thus, there will be no NUL bytes in the string. // @@ -129,8 +122,9 @@ } } - // Use `Vec` reallocation strategy to grow capacity exponentially. - buffer.reserve(buffer.capacity() + 1); + buffer.reserve(buffer.capacity() + 1); // use `Vec` reallocation + // strategy to grow capacity + // exponentially } } @@ -180,8 +174,8 @@ /// `unlinkat(fd, path, flags)`—Unlinks a file or remove a directory. /// -/// With the [`REMOVEDIR`] flag, this removes a directory. This is in place of -/// a `rmdirat` function. +/// With the [`REMOVEDIR`] flag, this removes a directory. This is in place +/// of a `rmdirat` function. /// /// # References /// - [POSIX] @@ -288,8 +282,7 @@ /// [Linux]: https://man7.org/linux/man-pages/man2/fstatat.2.html /// [`Mode::from_raw_mode`]: crate::fs::Mode::from_raw_mode /// [`FileType::from_raw_mode`]: crate::fs::FileType::from_raw_mode -// TODO: Add `stat64xat` to upstream libc bindings and reenable this for AIX. -#[cfg(not(any(target_os = "aix", target_os = "espidf")))] +#[cfg(not(target_os = "espidf"))] #[inline] #[doc(alias = "fstatat")] pub fn statat(dirfd: Fd, path: P, flags: AtFlags) -> io::Result { @@ -312,7 +305,7 @@ /// /// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/faccessat.html /// [Linux]: https://man7.org/linux/man-pages/man2/faccessat.2.html -#[cfg(not(any(target_os = "espidf", target_os = "vita")))] +#[cfg(not(target_os = "espidf"))] #[inline] #[doc(alias = "faccessat")] pub fn accessat( @@ -332,7 +325,7 @@ /// /// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/utimensat.html /// [Linux]: https://man7.org/linux/man-pages/man2/utimensat.2.html -#[cfg(not(any(target_os = "espidf", target_os = "vita")))] +#[cfg(not(target_os = "espidf"))] #[inline] pub fn utimensat( dirfd: Fd, @@ -394,7 +387,7 @@ /// /// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/mknodat.html /// [Linux]: https://man7.org/linux/man-pages/man2/mknodat.2.html -#[cfg(not(any(apple, target_os = "espidf", target_os = "vita", target_os = "wasi")))] +#[cfg(not(any(apple, target_os = "espidf", target_os = "wasi")))] #[inline] pub fn mknodat( dirfd: Fd, diff -Nru temporalio-1.3.0/vendor/rustix/src/fs/constants.rs temporalio-1.3.0/vendor/rustix/src/fs/constants.rs --- temporalio-1.3.0/vendor/rustix/src/fs/constants.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/fs/constants.rs 2023-10-30 19:40:00.000000000 +0000 @@ -3,5 +3,17 @@ use crate::backend; pub use crate::io::FdFlags; -pub use crate::timespec::{Nsecs, Secs, Timespec}; +#[cfg(not(target_os = "espidf"))] +pub use backend::fs::types::Access; +pub use backend::fs::types::{Dev, Mode, OFlags}; + +#[cfg(not(any(target_os = "espidf", target_os = "redox")))] +pub use backend::fs::types::AtFlags; + +#[cfg(apple)] +pub use backend::fs::types::{CloneFlags, CopyfileFlags}; + +#[cfg(linux_kernel)] pub use backend::fs::types::*; + +pub use crate::timespec::{Nsecs, Secs, Timespec}; diff -Nru temporalio-1.3.0/vendor/rustix/src/fs/fadvise.rs temporalio-1.3.0/vendor/rustix/src/fs/fadvise.rs --- temporalio-1.3.0/vendor/rustix/src/fs/fadvise.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/fs/fadvise.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,6 +1,7 @@ use crate::{backend, io}; use backend::fd::AsFd; -use backend::fs::types::Advice; + +pub use backend::fs::types::Advice; /// `posix_fadvise(fd, offset, len, advice)`—Declares an expected access /// pattern for a file. diff -Nru temporalio-1.3.0/vendor/rustix/src/fs/fcntl.rs temporalio-1.3.0/vendor/rustix/src/fs/fcntl.rs --- temporalio-1.3.0/vendor/rustix/src/fs/fcntl.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/fs/fcntl.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,14 +1,13 @@ -//! The Unix `fcntl` function is effectively lots of different functions hidden -//! behind a single dynamic dispatch interface. In order to provide a type-safe -//! API, rustix makes them all separate functions so that they can have -//! dedicated static type signatures. +//! The Unix `fcntl` function is effectively lots of different functions +//! hidden behind a single dynamic dispatch interface. In order to provide +//! a type-safe API, rustix makes them all separate functions so that they +//! can have dedicated static type signatures. #[cfg(not(any( target_os = "emscripten", target_os = "espidf", target_os = "fuchsia", target_os = "redox", - target_os = "vita", target_os = "wasi" )))] use crate::fs::FlockOperation; @@ -65,7 +64,7 @@ } #[cfg(any(linux_kernel, target_os = "freebsd", target_os = "fuchsia"))] -use backend::fs::types::SealFlags; +pub use backend::fs::types::SealFlags; /// `fcntl(fd, F_ADD_SEALS)` /// @@ -87,8 +86,8 @@ /// file should be locked. /// /// Unlike `flock`-style locks, `fcntl`-style locks are process-associated, -/// meaning that they don't guard against being acquired by two threads in the -/// same process. +/// meaning that they don't guard against being acquired by two threads in +/// the same process. /// /// # References /// - [POSIX] @@ -101,7 +100,6 @@ target_os = "espidf", target_os = "fuchsia", target_os = "redox", - target_os = "vita", target_os = "wasi" )))] #[inline] diff -Nru temporalio-1.3.0/vendor/rustix/src/fs/fcopyfile.rs temporalio-1.3.0/vendor/rustix/src/fs/fcopyfile.rs --- temporalio-1.3.0/vendor/rustix/src/fs/fcopyfile.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/fs/fcopyfile.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,7 +1,9 @@ use crate::fs::CopyfileFlags; use crate::{backend, io}; use backend::fd::AsFd; -use backend::fs::types::copyfile_state_t; + +/// `copyfile_state_t` +pub use backend::fs::types::copyfile_state_t; /// `fcopyfile(from, to, state, flags)` /// diff -Nru temporalio-1.3.0/vendor/rustix/src/fs/fd.rs temporalio-1.3.0/vendor/rustix/src/fs/fd.rs --- temporalio-1.3.0/vendor/rustix/src/fs/fd.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/fs/fd.rs 2023-10-30 19:40:00.000000000 +0000 @@ -7,6 +7,10 @@ use crate::fs::{OFlags, SeekFrom, Timespec}; use crate::{backend, io}; use backend::fd::{AsFd, BorrowedFd}; + +#[cfg(not(any(target_os = "espidf", target_os = "wasi")))] +pub use backend::fs::types::FlockOperation; + #[cfg(not(any( netbsdlike, solarish, @@ -15,19 +19,11 @@ target_os = "espidf", target_os = "nto", target_os = "redox", - target_os = "vita", )))] -use backend::fs::types::FallocateFlags; -#[cfg(not(any( - target_os = "espidf", - target_os = "solaris", - target_os = "vita", - target_os = "wasi" -)))] -use backend::fs::types::FlockOperation; -#[cfg(linux_kernel)] -use backend::fs::types::FsWord; -use backend::fs::types::Stat; +pub use backend::fs::types::FallocateFlags; + +pub use backend::fs::types::Stat; + #[cfg(not(any( solarish, target_os = "espidf", @@ -35,12 +31,15 @@ target_os = "netbsd", target_os = "nto", target_os = "redox", - target_os = "vita", target_os = "wasi", )))] -use backend::fs::types::StatFs; +pub use backend::fs::types::StatFs; + #[cfg(not(any(target_os = "haiku", target_os = "redox", target_os = "wasi")))] -use backend::fs::types::StatVfs; +pub use backend::fs::types::{StatVfs, StatVfsMountFlags}; + +#[cfg(linux_kernel)] +pub use backend::fs::types::FsWord; /// Timestamps used by [`utimensat`] and [`futimens`]. /// @@ -106,10 +105,10 @@ backend::fs::syscalls::tell(fd.as_fd()) } -/// `fchmod(fd, mode)`—Sets open file or directory permissions. +/// `fchmod(fd)`—Sets open file or directory permissions. /// -/// This implementation does not support [`OFlags::PATH`] file descriptors, -/// even on platforms where the host libc emulates it. +/// This implementation does not support `O_PATH` file descriptors, even on +/// platforms where the host libc emulates it. /// /// # References /// - [POSIX] @@ -123,7 +122,7 @@ backend::fs::syscalls::fchmod(fd.as_fd(), mode) } -/// `fchown(fd, owner, group)`—Sets open file or directory ownership. +/// `fchown(fd)`—Sets open file or directory ownership. /// /// # References /// - [POSIX] @@ -171,7 +170,6 @@ target_os = "netbsd", target_os = "nto", target_os = "redox", - target_os = "vita", target_os = "wasi", )))] #[inline] @@ -207,7 +205,7 @@ /// /// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/futimens.html /// [Linux]: https://man7.org/linux/man-pages/man2/utimensat.2.html -#[cfg(not(any(target_os = "espidf", target_os = "vita")))] +#[cfg(not(target_os = "espidf"))] #[inline] pub fn futimens(fd: Fd, times: &Timestamps) -> io::Result<()> { backend::fs::syscalls::futimens(fd.as_fd(), times) @@ -236,7 +234,6 @@ target_os = "espidf", target_os = "nto", target_os = "redox", - target_os = "vita", )))] // not implemented in libc for netbsd yet #[inline] #[doc(alias = "posix_fallocate")] @@ -259,7 +256,7 @@ let mode = backend::fs::syscalls::fcntl_getfl(fd)?; // Check for `O_PATH`. - #[cfg(any(linux_kernel, target_os = "emscripten", target_os = "fuchsia"))] + #[cfg(any(linux_kernel, target_os = "fuchsia", target_os = "emscripten"))] if mode.contains(OFlags::PATH) { return Ok((false, false)); } @@ -307,7 +304,6 @@ target_os = "espidf", target_os = "haiku", target_os = "redox", - target_os = "vita", )))] #[inline] pub fn fdatasync(fd: Fd) -> io::Result<()> { @@ -333,12 +329,7 @@ /// - [Linux] /// /// [Linux]: https://man7.org/linux/man-pages/man2/flock.2.html -#[cfg(not(any( - target_os = "espidf", - target_os = "solaris", - target_os = "vita", - target_os = "wasi" -)))] +#[cfg(not(any(target_os = "espidf", target_os = "solaris", target_os = "wasi")))] #[inline] pub fn flock(fd: Fd, operation: FlockOperation) -> io::Result<()> { backend::fs::syscalls::flock(fd.as_fd(), operation) diff -Nru temporalio-1.3.0/vendor/rustix/src/fs/file_type.rs temporalio-1.3.0/vendor/rustix/src/fs/file_type.rs --- temporalio-1.3.0/vendor/rustix/src/fs/file_type.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/fs/file_type.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,4 @@ +use crate::backend; + +/// `S_IF*` constants. +pub use backend::fs::types::FileType; diff -Nru temporalio-1.3.0/vendor/rustix/src/fs/ioctl.rs temporalio-1.3.0/vendor/rustix/src/fs/ioctl.rs --- temporalio-1.3.0/vendor/rustix/src/fs/ioctl.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/fs/ioctl.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,17 +1,11 @@ //! Filesystem-oriented `ioctl` functions. -#![allow(unsafe_code)] - #[cfg(linux_kernel)] use { crate::fd::AsFd, - crate::{backend, io, ioctl}, - backend::c, + crate::{backend, io}, }; -#[cfg(all(linux_kernel, not(any(target_arch = "sparc", target_arch = "sparc64"))))] -use crate::fd::{AsRawFd, BorrowedFd}; - /// `ioctl(fd, BLKSSZGET)`—Returns the logical block size of a block device. /// /// This is mentioned in the [Linux `openat` manual page]. @@ -21,11 +15,7 @@ #[inline] #[doc(alias = "BLKSSZGET")] pub fn ioctl_blksszget(fd: Fd) -> io::Result { - // SAFETY: BLZSSZGET is a getter opcode that gets a u32. - unsafe { - let ctl = ioctl::Getter::, c::c_uint>::new(); - ioctl::ioctl(fd, ctl) - } + backend::fs::syscalls::ioctl_blksszget(fd.as_fd()) } /// `ioctl(fd, BLKPBSZGET)`—Returns the physical block size of a block device. @@ -33,11 +23,7 @@ #[inline] #[doc(alias = "BLKPBSZGET")] pub fn ioctl_blkpbszget(fd: Fd) -> io::Result { - // SAFETY: BLKPBSZGET is a getter opcode that gets a u32. - unsafe { - let ctl = ioctl::Getter::, c::c_uint>::new(); - ioctl::ioctl(fd, ctl) - } + backend::fs::syscalls::ioctl_blkpbszget(fd.as_fd()) } /// `ioctl(fd, FICLONE, src_fd)`—Share data between open files. @@ -52,7 +38,7 @@ #[inline] #[doc(alias = "FICLONE")] pub fn ioctl_ficlone(fd: Fd, src_fd: SrcFd) -> io::Result<()> { - unsafe { ioctl::ioctl(fd, Ficlone(src_fd.as_fd())) } + backend::fs::syscalls::ioctl_ficlone(fd.as_fd(), src_fd.as_fd()) } /// `ioctl(fd, EXT4_IOC_RESIZE_FS, blocks)`—Resize ext4 filesystem on fd. @@ -60,33 +46,5 @@ #[inline] #[doc(alias = "EXT4_IOC_RESIZE_FS")] pub fn ext4_ioc_resize_fs(fd: Fd, blocks: u64) -> io::Result<()> { - // SAFETY: EXT4_IOC_RESIZE_FS is a pointer setter opcode. - unsafe { - let ctl = ioctl::Setter::, u64>::new( - blocks, - ); - ioctl::ioctl(fd, ctl) - } -} - -#[cfg(all(linux_kernel, not(any(target_arch = "sparc", target_arch = "sparc64"))))] -struct Ficlone<'a>(BorrowedFd<'a>); - -#[cfg(all(linux_kernel, not(any(target_arch = "sparc", target_arch = "sparc64"))))] -unsafe impl ioctl::Ioctl for Ficlone<'_> { - type Output = (); - - const IS_MUTATING: bool = false; - const OPCODE: ioctl::Opcode = ioctl::Opcode::old(c::FICLONE as ioctl::RawOpcode); - - fn as_ptr(&mut self) -> *mut c::c_void { - self.0.as_raw_fd() as *mut c::c_void - } - - unsafe fn output_from_ptr( - _: ioctl::IoctlOutput, - _: *mut c::c_void, - ) -> io::Result { - Ok(()) - } + backend::fs::syscalls::ext4_ioc_resize_fs(fd.as_fd(), blocks) } diff -Nru temporalio-1.3.0/vendor/rustix/src/fs/memfd_create.rs temporalio-1.3.0/vendor/rustix/src/fs/memfd_create.rs --- temporalio-1.3.0/vendor/rustix/src/fs/memfd_create.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/fs/memfd_create.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,6 +1,7 @@ use crate::fd::OwnedFd; use crate::{backend, io, path}; -use backend::fs::types::MemfdFlags; + +pub use backend::fs::types::MemfdFlags; /// `memfd_create(path, flags)` /// diff -Nru temporalio-1.3.0/vendor/rustix/src/fs/mod.rs temporalio-1.3.0/vendor/rustix/src/fs/mod.rs --- temporalio-1.3.0/vendor/rustix/src/fs/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/fs/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -9,7 +9,7 @@ #[cfg(not(any(target_os = "espidf", target_os = "redox")))] #[cfg(not(target_os = "haiku"))] // Haiku needs mod cwd; -#[cfg(all(feature = "alloc", not(any(target_os = "espidf", target_os = "redox"))))] +#[cfg(not(any(target_os = "espidf", target_os = "redox")))] mod dir; #[cfg(not(any( apple, @@ -19,7 +19,6 @@ target_os = "espidf", target_os = "haiku", target_os = "redox", - target_os = "vita", )))] mod fadvise; pub(crate) mod fcntl; @@ -28,17 +27,17 @@ #[cfg(apple)] mod fcopyfile; pub(crate) mod fd; +mod file_type; #[cfg(apple)] mod getpath; #[cfg(not(target_os = "wasi"))] // WASI doesn't have get[gpu]id. mod id; -#[cfg(linux_kernel)] +#[cfg(not(target_os = "wasi"))] mod ioctl; #[cfg(not(any( target_os = "espidf", target_os = "haiku", target_os = "redox", - target_os = "vita", target_os = "wasi" )))] mod makedev; @@ -56,12 +55,7 @@ mod sendfile; #[cfg(linux_kernel)] mod statx; -#[cfg(not(any( - target_os = "espidf", - target_os = "redox", - target_os = "vita", - target_os = "wasi" -)))] +#[cfg(not(any(target_os = "espidf", target_os = "redox", target_os = "wasi")))] mod sync; #[cfg(any(apple, linux_kernel))] mod xattr; @@ -77,7 +71,7 @@ #[cfg(not(any(target_os = "espidf", target_os = "redox")))] #[cfg(not(target_os = "haiku"))] // Haiku needs pub use cwd::*; -#[cfg(all(feature = "alloc", not(any(target_os = "espidf", target_os = "redox"))))] +#[cfg(not(any(target_os = "espidf", target_os = "redox")))] pub use dir::{Dir, DirEntry}; #[cfg(not(any( apple, @@ -87,31 +81,30 @@ target_os = "espidf", target_os = "haiku", target_os = "redox", - target_os = "vita", )))] -pub use fadvise::fadvise; +pub use fadvise::{fadvise, Advice}; pub use fcntl::*; #[cfg(apple)] pub use fcntl_apple::*; #[cfg(apple)] pub use fcopyfile::*; pub use fd::*; +pub use file_type::FileType; #[cfg(apple)] pub use getpath::getpath; #[cfg(not(target_os = "wasi"))] pub use id::*; -#[cfg(linux_kernel)] +#[cfg(not(target_os = "wasi"))] pub use ioctl::*; #[cfg(not(any( target_os = "espidf", target_os = "haiku", target_os = "redox", - target_os = "vita", target_os = "wasi" )))] pub use makedev::*; #[cfg(any(linux_kernel, target_os = "freebsd"))] -pub use memfd_create::memfd_create; +pub use memfd_create::{memfd_create, MemfdFlags}; #[cfg(linux_kernel)] #[cfg(feature = "fs")] pub use mount::*; @@ -123,13 +116,8 @@ #[cfg(target_os = "linux")] pub use sendfile::sendfile; #[cfg(linux_kernel)] -pub use statx::statx; -#[cfg(not(any( - target_os = "espidf", - target_os = "redox", - target_os = "vita", - target_os = "wasi" -)))] +pub use statx::{statx, Statx, StatxFlags, StatxTimestamp}; +#[cfg(not(any(target_os = "espidf", target_os = "redox", target_os = "wasi")))] pub use sync::sync; #[cfg(any(apple, linux_kernel))] pub use xattr::*; diff -Nru temporalio-1.3.0/vendor/rustix/src/fs/mount.rs temporalio-1.3.0/vendor/rustix/src/fs/mount.rs --- temporalio-1.3.0/vendor/rustix/src/fs/mount.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/fs/mount.rs 2023-10-30 19:40:00.000000000 +0000 @@ -2,16 +2,16 @@ //! //! These have been moved to a new `rustix::mount` module. -#[deprecated(note = "`rustix::fs::UnmountFlags` moved to `rustix::mount::UnmountFlags`.")] +#[deprecated(note = "rustix::fs::UnmountFlags` moved to `rustix::mount::UnmountFlags`.")] #[doc(hidden)] pub use crate::mount::UnmountFlags; -#[deprecated(note = "`rustix::fs::MountFlags` moved to `rustix::mount::MountFlags`.")] +#[deprecated(note = "rustix::fs::MountFlags` moved to `rustix::mount::MountFlags`.")] #[doc(hidden)] pub use crate::mount::MountFlags; #[deprecated( - note = "`rustix::fs::MountPropagationFlags` moved to `rustix::mount::MountPropagationFlags`." + note = "rustix::fs::MountPropagationFlags` moved to `rustix::mount::MountPropagationFlags`." )] #[doc(hidden)] pub use crate::mount::MountPropagationFlags; diff -Nru temporalio-1.3.0/vendor/rustix/src/fs/raw_dir.rs temporalio-1.3.0/vendor/rustix/src/fs/raw_dir.rs --- temporalio-1.3.0/vendor/rustix/src/fs/raw_dir.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/fs/raw_dir.rs 2023-10-30 19:40:00.000000000 +0000 @@ -43,11 +43,10 @@ /// ``` /// # use std::mem::MaybeUninit; /// # use rustix::fs::{CWD, Mode, OFlags, openat, RawDir}; - /// # use rustix::cstr; /// /// let fd = openat( /// CWD, - /// cstr!("."), + /// ".", /// OFlags::RDONLY | OFlags::DIRECTORY | OFlags::CLOEXEC, /// Mode::empty(), /// ) @@ -66,11 +65,10 @@ /// ``` /// # use std::mem::MaybeUninit; /// # use rustix::fs::{CWD, Mode, OFlags, openat, RawDir}; - /// # use rustix::cstr; /// /// let fd = openat( /// CWD, - /// cstr!("."), + /// ".", /// OFlags::RDONLY | OFlags::DIRECTORY | OFlags::CLOEXEC, /// Mode::empty(), /// ) @@ -94,11 +92,10 @@ /// # use std::mem::MaybeUninit; /// # use rustix::fs::{CWD, Mode, OFlags, openat, RawDir}; /// # use rustix::io::Errno; - /// # use rustix::cstr; /// /// let fd = openat( /// CWD, - /// cstr!("."), + /// ".", /// OFlags::RDONLY | OFlags::DIRECTORY | OFlags::CLOEXEC, /// Mode::empty(), /// ) @@ -196,10 +193,10 @@ /// with GAT support once one becomes available. #[allow(unsafe_code)] #[allow(clippy::should_implement_trait)] - pub fn next(&mut self) -> Option>> { + pub fn next(&mut self) -> Option> { if self.is_buffer_empty() { match getdents_uninit(self.fd.as_fd(), self.buf) { - Ok(0) => return None, + Ok(bytes_read) if bytes_read == 0 => return None, Ok(bytes_read) => { self.initialized = bytes_read; self.offset = 0; diff -Nru temporalio-1.3.0/vendor/rustix/src/fs/statx.rs temporalio-1.3.0/vendor/rustix/src/fs/statx.rs --- temporalio-1.3.0/vendor/rustix/src/fs/statx.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/fs/statx.rs 2023-10-30 19:40:00.000000000 +0000 @@ -3,7 +3,8 @@ use crate::fd::AsFd; use crate::fs::AtFlags; use crate::{backend, io, path}; -use backend::fs::types::{Statx, StatxFlags}; + +pub use backend::fs::types::{Statx, StatxFlags, StatxTimestamp}; #[cfg(feature = "linux_4_11")] use backend::fs::syscalls::statx as _statx; @@ -20,36 +21,6 @@ /// # References /// - [Linux] /// -/// # Examples -/// -/// ``` -/// # use std::path::Path; -/// # use std::io; -/// # use rustix::fs::{AtFlags, StatxFlags}; -/// # use rustix::fd::BorrowedFd; -/// /// Try to determine if the provided path is a mount root. Will return -/// /// `Ok(None)` if the kernel is not new enough to support `statx` or -/// /// [`libc::STATX_ATTR_MOUNT_ROOT`]. -/// fn is_mountpoint(root: BorrowedFd<'_>, path: &Path) -> io::Result> { -/// use rustix::fs::{AtFlags, StatxFlags}; -/// -/// let mountroot_flag = libc::STATX_ATTR_MOUNT_ROOT as u64; -/// match rustix::fs::statx( -/// root, -/// path, -/// AtFlags::NO_AUTOMOUNT | AtFlags::SYMLINK_NOFOLLOW, -/// StatxFlags::empty(), -/// ) { -/// Ok(r) => { -/// let present = (r.stx_attributes_mask & mountroot_flag) > 0; -/// Ok(present.then(|| r.stx_attributes & mountroot_flag > 0)) -/// } -/// Err(e) if e == rustix::io::Errno::NOSYS => Ok(None), -/// Err(e) => Err(e.into()), -/// } -/// } -/// ``` -/// /// [Linux]: https://man7.org/linux/man-pages/man2/statx.2.html #[inline] pub fn statx( @@ -71,9 +42,8 @@ use backend::fs::types::{Statx, StatxFlags}; - // Linux kernel prior to 4.11 and old versions of Docker don't support - // `statx`. We store the availability in a global to avoid unnecessary - // syscalls. + // Linux kernel prior to 4.11 old versions of Docker don't support `statx`. + // We store the availability in a global to avoid unnecessary syscalls. // // 0: Unknown // 1: Not available diff -Nru temporalio-1.3.0/vendor/rustix/src/fs/xattr.rs temporalio-1.3.0/vendor/rustix/src/fs/xattr.rs --- temporalio-1.3.0/vendor/rustix/src/fs/xattr.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/fs/xattr.rs 2023-10-30 19:40:00.000000000 +0000 @@ -14,9 +14,6 @@ /// `XATTR_REPLACE` const REPLACE = c::XATTR_REPLACE as c::c_uint; - - /// - const _ = !0; } } diff -Nru temporalio-1.3.0/vendor/rustix/src/io/dup.rs temporalio-1.3.0/vendor/rustix/src/io/dup.rs --- temporalio-1.3.0/vendor/rustix/src/io/dup.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/io/dup.rs 2023-10-30 19:40:00.000000000 +0000 @@ -115,7 +115,6 @@ target_os = "aix", target_os = "espidf", target_os = "nto", - target_os = "vita", target_os = "wasi" )))] #[inline] diff -Nru temporalio-1.3.0/vendor/rustix/src/io/errno.rs temporalio-1.3.0/vendor/rustix/src/io/errno.rs --- temporalio-1.3.0/vendor/rustix/src/io/errno.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/io/errno.rs 2023-10-30 19:40:00.000000000 +0000 @@ -12,6 +12,31 @@ /// A specialized [`Result`] type for `rustix` APIs. pub type Result = result::Result; +/// `errno`—An error code. +/// +/// The error type for `rustix` APIs. This is similar to [`std::io::Error`], +/// but only holds an OS error code, and no extra error value. +/// +/// # References +/// - [POSIX] +/// - [Linux] +/// - [Winsock2] +/// - [FreeBSD] +/// - [NetBSD] +/// - [OpenBSD] +/// - [DragonFly BSD] +/// - [illumos] +/// - [glibc] +/// +/// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/errno.html +/// [Linux]: https://man7.org/linux/man-pages/man3/errno.3.html +/// [Winsock2]: https://learn.microsoft.com/en-us/windows/win32/winsock/windows-sockets-error-codes-2 +/// [FreeBSD]: https://man.freebsd.org/cgi/man.cgi?errno +/// [NetBSD]: https://man.netbsd.org/errno.2 +/// [OpenBSD]: https://man.openbsd.org/errno.2 +/// [DragonFly BSD]: https://man.dragonflybsd.org/?command=errno§ion=2 +/// [illumos]: https://illumos.org/man/3C/errno +/// [glibc]: https://www.gnu.org/software/libc/manual/html_node/Error-Codes.html pub use backend::io::errno::Errno; impl Errno { diff -Nru temporalio-1.3.0/vendor/rustix/src/io/fcntl.rs temporalio-1.3.0/vendor/rustix/src/io/fcntl.rs --- temporalio-1.3.0/vendor/rustix/src/io/fcntl.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/io/fcntl.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,10 +1,10 @@ -//! The Unix `fcntl` function is effectively lots of different functions hidden -//! behind a single dynamic dispatch interface. In order to provide a type-safe -//! API, rustix makes them all separate functions so that they can have -//! dedicated static type signatures. +//! The Unix `fcntl` function is effectively lots of different functions +//! hidden behind a single dynamic dispatch interface. In order to provide +//! a type-safe API, rustix makes them all separate functions so that they +//! can have dedicated static type signatures. //! -//! `fcntl` functions which are not specific to files or directories live in -//! the [`io`] module instead. +//! `fcntl` functions which are not specific to files or directories live +//! in the [`io`] module instead. //! //! [`io`]: crate::io diff -Nru temporalio-1.3.0/vendor/rustix/src/io/ioctl.rs temporalio-1.3.0/vendor/rustix/src/io/ioctl.rs --- temporalio-1.3.0/vendor/rustix/src/io/ioctl.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/io/ioctl.rs 2023-10-30 19:40:00.000000000 +0000 @@ -6,26 +6,27 @@ //! Some ioctls, such as those related to filesystems, terminals, and //! processes, live in other top-level API modules. -#![allow(unsafe_code)] - -use crate::{backend, io, ioctl}; -use backend::c; +use crate::{backend, io}; use backend::fd::AsFd; /// `ioctl(fd, FIOCLEX, NULL)`—Set the close-on-exec flag. /// -/// This is similar to `fcntl(fd, F_SETFD, FD_CLOEXEC)`, except that it avoids -/// clearing any other flags that might be set. +/// Also known as `fcntl(fd, F_SETFD, FD_CLOEXEC)`. +/// +/// # References +/// - [Winsock2] +/// - [NetBSD] +/// - [OpenBSD] +/// +/// [Winsock2]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-ioctlsocket +/// [NetBSD]: https://man.netbsd.org/ioctl.2#GENERIC%20IOCTLS +/// [OpenBSD]: https://man.openbsd.org/ioctl.2#GENERIC_IOCTLS #[cfg(apple)] #[inline] #[doc(alias = "FIOCLEX")] #[doc(alias = "FD_CLOEXEC")] pub fn ioctl_fioclex(fd: Fd) -> io::Result<()> { - // SAFETY: FIOCLEX is a no-argument setter opcode. - unsafe { - let ctl = ioctl::NoArg::>::new(); - ioctl::ioctl(fd, ctl) - } + backend::io::syscalls::ioctl_fioclex(fd.as_fd()) } /// `ioctl(fd, FIONBIO, &value)`—Enables or disables non-blocking mode. @@ -41,17 +42,13 @@ #[inline] #[doc(alias = "FIONBIO")] pub fn ioctl_fionbio(fd: Fd, value: bool) -> io::Result<()> { - // SAFETY: FIONBIO is a pointer setter opcode. - unsafe { - let ctl = ioctl::Setter::, c::c_int>::new(value.into()); - ioctl::ioctl(fd, ctl) - } + backend::io::syscalls::ioctl_fionbio(fd.as_fd(), value) } /// `ioctl(fd, FIONREAD)`—Returns the number of bytes ready to be read. /// -/// The result of this function gets silently coerced into a C `int` by the OS, -/// so it may contain a wrapped value. +/// The result of this function gets silently coerced into a C `int` +/// by the OS, so it may contain a wrapped value. /// /// # References /// - [Linux] @@ -65,13 +62,9 @@ /// [FreeBSD]: https://man.freebsd.org/cgi/man.cgi?query=ioctl&sektion=2#GENERIC%09IOCTLS /// [NetBSD]: https://man.netbsd.org/ioctl.2#GENERIC%20IOCTLS /// [OpenBSD]: https://man.openbsd.org/ioctl.2#GENERIC_IOCTLS -#[cfg(not(any(target_os = "espidf", target_os = "vita")))] +#[cfg(not(target_os = "espidf"))] #[inline] #[doc(alias = "FIONREAD")] pub fn ioctl_fionread(fd: Fd) -> io::Result { - // SAFETY: FIONREAD is a getter opcode that gets a c_int. - unsafe { - let ctl = ioctl::Getter::, c::c_int>::new(); - ioctl::ioctl(fd, ctl).map(|n| n as u64) - } + backend::io::syscalls::ioctl_fionread(fd.as_fd()) } diff -Nru temporalio-1.3.0/vendor/rustix/src/io/read_write.rs temporalio-1.3.0/vendor/rustix/src/io/read_write.rs --- temporalio-1.3.0/vendor/rustix/src/io/read_write.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/io/read_write.rs 2023-10-30 19:40:00.000000000 +0000 @@ -192,8 +192,7 @@ target_os = "haiku", target_os = "nto", target_os = "redox", - target_os = "solaris", - target_os = "vita" + target_os = "solaris" )))] #[inline] pub fn preadv(fd: Fd, bufs: &mut [IoSliceMut<'_>], offset: u64) -> io::Result { @@ -226,8 +225,7 @@ target_os = "haiku", target_os = "nto", target_os = "redox", - target_os = "solaris", - target_os = "vita" + target_os = "solaris" )))] #[inline] pub fn pwritev(fd: Fd, bufs: &[IoSlice<'_>], offset: u64) -> io::Result { diff -Nru temporalio-1.3.0/vendor/rustix/src/ioctl/bsd.rs temporalio-1.3.0/vendor/rustix/src/ioctl/bsd.rs --- temporalio-1.3.0/vendor/rustix/src/ioctl/bsd.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/ioctl/bsd.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,24 +0,0 @@ -//! `ioctl` opcode behavior for Linux platforms. - -use super::{Direction, RawOpcode}; - -pub(super) const fn compose_opcode( - dir: Direction, - group: RawOpcode, - num: RawOpcode, - size: RawOpcode, -) -> RawOpcode { - let dir = match dir { - Direction::None => NONE, - Direction::Read => READ, - Direction::Write => WRITE, - Direction::ReadWrite => READ | WRITE, - }; - - dir | num | (group << 8) | ((size & IOCPARAM_MASK) << 16) -} - -pub const NONE: RawOpcode = 0x2000_0000; -pub const WRITE: RawOpcode = 0x4000_0000; -pub const READ: RawOpcode = 0x8000_0000; -pub const IOCPARAM_MASK: RawOpcode = 0x1FFF; diff -Nru temporalio-1.3.0/vendor/rustix/src/ioctl/linux.rs temporalio-1.3.0/vendor/rustix/src/ioctl/linux.rs --- temporalio-1.3.0/vendor/rustix/src/ioctl/linux.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/ioctl/linux.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,118 +0,0 @@ -//! `ioctl` opcode behavior for Linux platforms. - -use super::{Direction, RawOpcode}; -use consts::*; - -/// Compose an opcode from its component parts. -pub(super) const fn compose_opcode( - dir: Direction, - group: RawOpcode, - num: RawOpcode, - size: RawOpcode, -) -> RawOpcode { - macro_rules! mask_and_shift { - ($val:expr, $shift:expr, $mask:expr) => {{ - ($val & $mask) << $shift - }}; - } - - let dir = match dir { - Direction::None => NONE, - Direction::Read => READ, - Direction::Write => WRITE, - Direction::ReadWrite => READ | WRITE, - }; - - mask_and_shift!(group, GROUP_SHIFT, GROUP_MASK) - | mask_and_shift!(num, NUM_SHIFT, NUM_MASK) - | mask_and_shift!(size, SIZE_SHIFT, SIZE_MASK) - | mask_and_shift!(dir, DIR_SHIFT, DIR_MASK) -} - -const NUM_BITS: RawOpcode = 8; -const GROUP_BITS: RawOpcode = 8; - -const NUM_SHIFT: RawOpcode = 0; -const GROUP_SHIFT: RawOpcode = NUM_SHIFT + NUM_BITS; -const SIZE_SHIFT: RawOpcode = GROUP_SHIFT + GROUP_BITS; -const DIR_SHIFT: RawOpcode = SIZE_SHIFT + SIZE_BITS; - -const NUM_MASK: RawOpcode = (1 << NUM_BITS) - 1; -const GROUP_MASK: RawOpcode = (1 << GROUP_BITS) - 1; -const SIZE_MASK: RawOpcode = (1 << SIZE_BITS) - 1; -const DIR_MASK: RawOpcode = (1 << DIR_BITS) - 1; - -#[cfg(any( - target_arch = "x86", - target_arch = "arm", - target_arch = "s390x", - target_arch = "x86_64", - target_arch = "aarch64", - target_arch = "riscv32", - target_arch = "riscv64", - target_arch = "loongarch64", - target_arch = "csky" -))] -mod consts { - use super::RawOpcode; - - pub(super) const NONE: RawOpcode = 0; - pub(super) const READ: RawOpcode = 2; - pub(super) const WRITE: RawOpcode = 1; - pub(super) const SIZE_BITS: RawOpcode = 14; - pub(super) const DIR_BITS: RawOpcode = 2; -} - -#[cfg(any( - target_arch = "mips", - target_arch = "mips32r6", - target_arch = "mips64", - target_arch = "mips64r6", - target_arch = "powerpc", - target_arch = "powerpc64", - target_arch = "sparc", - target_arch = "sparc64" -))] -mod consts { - use super::RawOpcode; - - pub(super) const NONE: RawOpcode = 1; - pub(super) const READ: RawOpcode = 2; - pub(super) const WRITE: RawOpcode = 4; - pub(super) const SIZE_BITS: RawOpcode = 13; - pub(super) const DIR_BITS: RawOpcode = 3; -} - -#[cfg(not(any( - // These have no ioctl opcodes defined in linux_raw_sys - // so can't use that as a known-good value for this test. - target_arch = "sparc", - target_arch = "sparc64" -)))] -#[test] -fn check_known_opcodes() { - use crate::backend::c::{c_long, c_uint}; - use core::mem::size_of; - - // _IOR('U', 15, unsigned int) - assert_eq!( - compose_opcode( - Direction::Read, - b'U' as RawOpcode, - 15, - size_of::() as RawOpcode - ), - linux_raw_sys::ioctl::USBDEVFS_CLAIMINTERFACE as RawOpcode - ); - - // _IOW('v', 2, long) - assert_eq!( - compose_opcode( - Direction::Write, - b'v' as RawOpcode, - 2, - size_of::() as RawOpcode - ), - linux_raw_sys::ioctl::FS_IOC_SETVERSION as RawOpcode - ); -} diff -Nru temporalio-1.3.0/vendor/rustix/src/ioctl/mod.rs temporalio-1.3.0/vendor/rustix/src/ioctl/mod.rs --- temporalio-1.3.0/vendor/rustix/src/ioctl/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/ioctl/mod.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,358 +0,0 @@ -//! Unsafe `ioctl` API. -//! -//! Unix systems expose a number of `ioctl`'s. `ioctl`s have been adopted as a -//! general purpose system call for making calls into the kernel. In addition -//! to the wide variety of system calls that are included by default in the -//! kernel, many drivers expose their own `ioctl`'s for controlling their -//! behavior, some of which are proprietary. Therefore it is impossible to make -//! a safe interface for every `ioctl` call, as they all have wildly varying -//! semantics. -//! -//! This module provides an unsafe interface to write your own `ioctl` API. To -//! start, create a type that implements [`Ioctl`]. Then, pass it to [`ioctl`] -//! to make the `ioctl` call. - -#![allow(unsafe_code)] - -use crate::backend::c; -use crate::fd::{AsFd, BorrowedFd}; -use crate::io::Result; - -#[cfg(any(linux_kernel, bsd))] -use core::mem; - -pub use patterns::*; - -mod patterns; - -#[cfg(linux_kernel)] -mod linux; - -#[cfg(bsd)] -mod bsd; - -#[cfg(linux_kernel)] -use linux as platform; - -#[cfg(bsd)] -use bsd as platform; - -/// Perform an `ioctl` call. -/// -/// `ioctl` was originally intended to act as a way of modifying the behavior -/// of files, but has since been adopted as a general purpose system call for -/// making calls into the kernel. In addition to the default calls exposed by -/// generic file descriptors, many drivers expose their own `ioctl` calls for -/// controlling their behavior, some of which are proprietary. -/// -/// This crate exposes many other `ioctl` interfaces with safe and idiomatic -/// wrappers, like [`ioctl_fionbio`] and [`ioctl_fionread`]. It is recommended -/// to use those instead of this function, as they are safer and more -/// idiomatic. For other cases, implement the [`Ioctl`] API and pass it to this -/// function. -/// -/// See documentation for [`Ioctl`] for more information. -/// -/// [`ioctl_fionbio`]: crate::io::ioctl_fionbio -/// [`ioctl_fionread`]: crate::io::ioctl_fionread -/// -/// # Safety -/// -/// While [`Ioctl`] takes much of the unsafety out of `ioctl` calls, it is -/// still unsafe to call this code with arbitrary device drivers, as it is up -/// to the device driver to implement the `ioctl` call correctly. It is on the -/// onus of the protocol between the user and the driver to ensure that the -/// `ioctl` call is safe to make. -/// -/// # References -/// -/// - [Linux] -/// - [WinSock2] -/// - [FreeBSD] -/// - [NetBSD] -/// - [OpenBSD] -/// - [Apple] -/// - [Solaris] -/// - [illumos] -/// -/// [Linux]: https://man7.org/linux/man-pages/man2/ioctl.2.html -/// [Winsock2]: https://learn.microsoft.com/en-us/windows/win32/api/winsock/nf-winsock-ioctlsocket -/// [FreeBSD]: https://man.freebsd.org/cgi/man.cgi?query=ioctl&sektion=2 -/// [NetBSD]: https://man.netbsd.org/ioctl.2 -/// [OpenBSD]: https://man.openbsd.org/ioctl.2 -/// [Apple]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/ioctl.2.html -/// [Solaris]: https://docs.oracle.com/cd/E23824_01/html/821-1463/ioctl-2.html -/// [illumos]: https://illumos.org/man/2/ioctl -#[inline] -pub unsafe fn ioctl(fd: F, mut ioctl: I) -> Result { - let fd = fd.as_fd(); - let request = I::OPCODE.raw(); - let arg = ioctl.as_ptr(); - - // SAFETY: The variant of `Ioctl` asserts that this is a valid IOCTL call - // to make. - let output = if I::IS_MUTATING { - _ioctl(fd, request, arg)? - } else { - _ioctl_readonly(fd, request, arg)? - }; - - // SAFETY: The variant of `Ioctl` asserts that this is a valid pointer to - // the output data. - I::output_from_ptr(output, arg) -} - -unsafe fn _ioctl( - fd: BorrowedFd<'_>, - request: RawOpcode, - arg: *mut c::c_void, -) -> Result { - crate::backend::io::syscalls::ioctl(fd, request, arg) -} - -unsafe fn _ioctl_readonly( - fd: BorrowedFd<'_>, - request: RawOpcode, - arg: *mut c::c_void, -) -> Result { - crate::backend::io::syscalls::ioctl_readonly(fd, request, arg) -} - -/// A trait defining the properties of an `ioctl` command. -/// -/// Objects implementing this trait can be passed to [`ioctl`] to make an -/// `ioctl` call. The contents of the object represent the inputs to the -/// `ioctl` call. The inputs must be convertible to a pointer through the -/// `as_ptr` method. In most cases, this involves either casting a number to a -/// pointer, or creating a pointer to the actual data. The latter case is -/// necessary for `ioctl` calls that modify userspace data. -/// -/// # Safety -/// -/// This trait is unsafe to implement because it is impossible to guarantee -/// that the `ioctl` call is safe. The `ioctl` call may be proprietary, or it -/// may be unsafe to call in certain circumstances. -/// -/// By implementing this trait, you guarantee that: -/// -/// - The `ioctl` call expects the input provided by `as_ptr` and produces the -/// output as indicated by `output`. -/// - That `output_from_ptr` can safely take the pointer from `as_ptr` and cast -/// it to the correct type, *only* after the `ioctl` call. -/// - That `OPCODE` uniquely identifies the `ioctl` call. -/// - That, for whatever platforms you are targeting, the `ioctl` call is safe -/// to make. -/// - If `IS_MUTATING` is false, that no userspace data will be modified by the -/// `ioctl` call. -pub unsafe trait Ioctl { - /// The type of the output data. - /// - /// Given a pointer, one should be able to construct an instance of this - /// type. - type Output; - - /// The opcode used by this `ioctl` command. - /// - /// There are different types of opcode depending on the operation. See - /// documentation for the [`Opcode`] struct for more information. - const OPCODE: Opcode; - - /// Does the `ioctl` mutate any data in the userspace? - /// - /// If the `ioctl` call does not mutate any data in the userspace, then - /// making this `false` enables optimizations that can make the call - /// faster. When in doubt, set this to `true`. - /// - /// # Safety - /// - /// This should only be set to `false` if the `ioctl` call does not mutate - /// any data in the userspace. Undefined behavior may occur if this is set - /// to `false` when it should be `true`. - const IS_MUTATING: bool; - - /// Get a pointer to the data to be passed to the `ioctl` command. - /// - /// See trait-level documentation for more information. - fn as_ptr(&mut self) -> *mut c::c_void; - - /// Cast the output data to the correct type. - /// - /// # Safety - /// - /// The `extract_output` value must be the resulting value after a - /// successful `ioctl` call, and `out` is the direct return value of an - /// `ioctl` call that did not fail. In this case `extract_output` is the - /// pointer that was passed to the `ioctl` call. - unsafe fn output_from_ptr( - out: IoctlOutput, - extract_output: *mut c::c_void, - ) -> Result; -} - -/// The opcode used by an `Ioctl`. -#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] -pub struct Opcode { - /// The raw opcode. - raw: RawOpcode, -} - -impl Opcode { - /// Create a new old `Opcode` from a raw opcode. - /// - /// Rather than being a composition of several attributes, old opcodes are - /// just numbers. In general most drivers follow stricter conventions, but - /// older drivers may still use this strategy. - #[inline] - pub const fn old(raw: RawOpcode) -> Self { - Self { raw } - } - - /// Create a new opcode from a direction, group, number, and size. - /// - /// This corresponds to the C macro `_IOC(direction, group, number, size)` - #[cfg(any(linux_kernel, bsd))] - #[inline] - pub const fn from_components( - direction: Direction, - group: u8, - number: u8, - data_size: usize, - ) -> Self { - if data_size > RawOpcode::MAX as usize { - panic!("data size is too large"); - } - - Self::old(platform::compose_opcode( - direction, - group as RawOpcode, - number as RawOpcode, - data_size as RawOpcode, - )) - } - - /// Create a new non-mutating opcode from a group, a number, and the type - /// of data. - /// - /// This corresponds to the C macro `_IO(group, number)` when `T` is zero - /// sized. - #[cfg(any(linux_kernel, bsd))] - #[inline] - pub const fn none(group: u8, number: u8) -> Self { - Self::from_components(Direction::None, group, number, mem::size_of::()) - } - - /// Create a new reading opcode from a group, a number and the type of - /// data. - /// - /// This corresponds to the C macro `_IOR(group, number, T)`. - #[cfg(any(linux_kernel, bsd))] - #[inline] - pub const fn read(group: u8, number: u8) -> Self { - Self::from_components(Direction::Read, group, number, mem::size_of::()) - } - - /// Create a new writing opcode from a group, a number and the type of - /// data. - /// - /// This corresponds to the C macro `_IOW(group, number, T)`. - #[cfg(any(linux_kernel, bsd))] - #[inline] - pub const fn write(group: u8, number: u8) -> Self { - Self::from_components(Direction::Write, group, number, mem::size_of::()) - } - - /// Create a new reading and writing opcode from a group, a number and the - /// type of data. - /// - /// This corresponds to the C macro `_IOWR(group, number, T)`. - #[cfg(any(linux_kernel, bsd))] - #[inline] - pub const fn read_write(group: u8, number: u8) -> Self { - Self::from_components(Direction::ReadWrite, group, number, mem::size_of::()) - } - - /// Get the raw opcode. - #[inline] - pub fn raw(self) -> RawOpcode { - self.raw - } -} - -/// The direction that an `ioctl` is going. -/// -/// Note that this is relative to userspace. `Read` means reading data from the -/// kernel, and write means the kernel writing data to userspace. -#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] -pub enum Direction { - /// None of the above. - None, - - /// Read data from the kernel. - Read, - - /// Write data to the kernel. - Write, - - /// Read and write data to the kernel. - ReadWrite, -} - -/// The type used by the `ioctl` to signify the output. -pub type IoctlOutput = c::c_int; - -/// The type used by the `ioctl` to signify the command. -pub type RawOpcode = _RawOpcode; - -// Under raw Linux, this is an `unsigned int`. -#[cfg(linux_raw)] -type _RawOpcode = c::c_uint; - -// On libc Linux with GNU libc or uclibc, this is an `unsigned long`. -#[cfg(all( - not(linux_raw), - target_os = "linux", - any(target_env = "gnu", target_env = "uclibc") -))] -type _RawOpcode = c::c_ulong; - -// Musl uses `c_int`. -#[cfg(all( - not(linux_raw), - target_os = "linux", - not(target_env = "gnu"), - not(target_env = "uclibc") -))] -type _RawOpcode = c::c_int; - -// Android uses `c_int`. -#[cfg(all(not(linux_raw), target_os = "android"))] -type _RawOpcode = c::c_int; - -// BSD, Haiku, Hurd, Redox, and Vita use `unsigned long`. -#[cfg(any( - bsd, - target_os = "redox", - target_os = "haiku", - target_os = "hurd", - target_os = "vita" -))] -type _RawOpcode = c::c_ulong; - -// AIX, Emscripten, Fuchsia, Solaris, and WASI use a `int`. -#[cfg(any( - solarish, - target_os = "aix", - target_os = "fuchsia", - target_os = "emscripten", - target_os = "wasi", - target_os = "nto" -))] -type _RawOpcode = c::c_int; - -// ESP-IDF uses a `c_uint`. -#[cfg(target_os = "espidf")] -type _RawOpcode = c::c_uint; - -// Windows has `ioctlsocket`, which uses `i32`. -#[cfg(windows)] -type _RawOpcode = i32; diff -Nru temporalio-1.3.0/vendor/rustix/src/ioctl/patterns.rs temporalio-1.3.0/vendor/rustix/src/ioctl/patterns.rs --- temporalio-1.3.0/vendor/rustix/src/ioctl/patterns.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/ioctl/patterns.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,212 +0,0 @@ -//! Implements typical patterns for `ioctl` usage. - -use super::{Ioctl, IoctlOutput, Opcode, RawOpcode}; - -use crate::backend::c; -use crate::io::Result; - -use core::marker::PhantomData; -use core::ptr::addr_of_mut; -use core::{fmt, mem}; - -/// Implements an `ioctl` with no real arguments. -pub struct NoArg { - /// The opcode. - _opcode: PhantomData, -} - -impl fmt::Debug for NoArg { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_tuple("NoArg").field(&Opcode::OPCODE).finish() - } -} - -impl NoArg { - /// Create a new no-argument `ioctl` object. - /// - /// # Safety - /// - /// - `Opcode` must provide a valid opcode. - #[inline] - pub unsafe fn new() -> Self { - Self { - _opcode: PhantomData, - } - } -} - -unsafe impl Ioctl for NoArg { - type Output = (); - - const IS_MUTATING: bool = false; - const OPCODE: self::Opcode = Opcode::OPCODE; - - fn as_ptr(&mut self) -> *mut c::c_void { - core::ptr::null_mut() - } - - unsafe fn output_from_ptr(_: IoctlOutput, _: *mut c::c_void) -> Result { - Ok(()) - } -} - -/// Implements the traditional “getter†pattern for `ioctl`s. -/// -/// Some `ioctl`s just read data into the userspace. As this is a popular -/// pattern this structure implements it. -pub struct Getter { - /// The output data. - output: mem::MaybeUninit, - - /// The opcode. - _opcode: PhantomData, -} - -impl fmt::Debug for Getter { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_tuple("Getter").field(&Opcode::OPCODE).finish() - } -} - -impl Getter { - /// Create a new getter-style `ioctl` object. - /// - /// # Safety - /// - /// - `Opcode` must provide a valid opcode. - /// - For this opcode, `Output` must be the type that the kernel expects to - /// write into. - #[inline] - pub unsafe fn new() -> Self { - Self { - output: mem::MaybeUninit::uninit(), - _opcode: PhantomData, - } - } -} - -unsafe impl Ioctl for Getter { - type Output = Output; - - const IS_MUTATING: bool = true; - const OPCODE: self::Opcode = Opcode::OPCODE; - - fn as_ptr(&mut self) -> *mut c::c_void { - self.output.as_mut_ptr().cast() - } - - unsafe fn output_from_ptr(_: IoctlOutput, ptr: *mut c::c_void) -> Result { - Ok(ptr.cast::().read()) - } -} - -/// Implements the pattern for `ioctl`s where a pointer argument is given to -/// the `ioctl`. -/// -/// The opcode must be read-only. -pub struct Setter { - /// The input data. - input: Input, - - /// The opcode. - _opcode: PhantomData, -} - -impl fmt::Debug for Setter { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_tuple("Setter") - .field(&Opcode::OPCODE) - .field(&self.input) - .finish() - } -} - -impl Setter { - /// Create a new pointer setter-style `ioctl` object. - /// - /// # Safety - /// - /// - `Opcode` must provide a valid opcode. - /// - For this opcode, `Input` must be the type that the kernel expects to - /// get. - #[inline] - pub unsafe fn new(input: Input) -> Self { - Self { - input, - _opcode: PhantomData, - } - } -} - -unsafe impl Ioctl for Setter { - type Output = (); - - const IS_MUTATING: bool = false; - const OPCODE: self::Opcode = Opcode::OPCODE; - - fn as_ptr(&mut self) -> *mut c::c_void { - addr_of_mut!(self.input).cast::() - } - - unsafe fn output_from_ptr(_: IoctlOutput, _: *mut c::c_void) -> Result { - Ok(()) - } -} - -/// Trait for something that provides an `ioctl` opcode at compile time. -pub trait CompileTimeOpcode { - /// The opcode. - const OPCODE: Opcode; -} - -/// Provides a bad opcode at compile time. -pub struct BadOpcode; - -impl CompileTimeOpcode for BadOpcode { - const OPCODE: Opcode = Opcode::old(OPCODE); -} - -/// Provides a read code at compile time. -/// -/// This corresponds to the C macro `_IOR(GROUP, NUM, Data)`. -#[cfg(any(linux_kernel, bsd))] -pub struct ReadOpcode(Data); - -#[cfg(any(linux_kernel, bsd))] -impl CompileTimeOpcode for ReadOpcode { - const OPCODE: Opcode = Opcode::read::(GROUP, NUM); -} - -/// Provides a write code at compile time. -/// -/// This corresponds to the C macro `_IOW(GROUP, NUM, Data)`. -#[cfg(any(linux_kernel, bsd))] -pub struct WriteOpcode(Data); - -#[cfg(any(linux_kernel, bsd))] -impl CompileTimeOpcode for WriteOpcode { - const OPCODE: Opcode = Opcode::write::(GROUP, NUM); -} - -/// Provides a read/write code at compile time. -/// -/// This corresponds to the C macro `_IOWR(GROUP, NUM, Data)`. -#[cfg(any(linux_kernel, bsd))] -pub struct ReadWriteOpcode(Data); - -#[cfg(any(linux_kernel, bsd))] -impl CompileTimeOpcode for ReadWriteOpcode { - const OPCODE: Opcode = Opcode::read_write::(GROUP, NUM); -} - -/// Provides a `None` code at compile time. -/// -/// This corresponds to the C macro `_IO(GROUP, NUM)` when `Data` is zero -/// sized. -#[cfg(any(linux_kernel, bsd))] -pub struct NoneOpcode(Data); - -#[cfg(any(linux_kernel, bsd))] -impl CompileTimeOpcode for NoneOpcode { - const OPCODE: Opcode = Opcode::none::(GROUP, NUM); -} diff -Nru temporalio-1.3.0/vendor/rustix/src/io_uring.rs temporalio-1.3.0/vendor/rustix/src/io_uring.rs --- temporalio-1.3.0/vendor/rustix/src/io_uring.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/io_uring.rs 2023-10-30 19:40:00.000000000 +0000 @@ -31,49 +31,6 @@ use core::ptr::{null_mut, write_bytes}; use linux_raw_sys::net; -// Export types used in io_uring APIs. -pub use crate::event::epoll::{ - Event as EpollEvent, EventData as EpollEventData, EventFlags as EpollEventFlags, -}; -pub use crate::fs::{Advice, AtFlags, Mode, OFlags, RenameFlags, ResolveFlags, Statx, StatxFlags}; -pub use crate::io::ReadWriteFlags; -pub use crate::net::{RecvFlags, SendFlags, SocketFlags}; -pub use crate::timespec::Timespec; -pub use linux_raw_sys::general::sigset_t; - -pub use net::{__kernel_sockaddr_storage as sockaddr_storage, msghdr, sockaddr, socklen_t}; - -// Declare the `c_char` type for use with entries that take pointers -// to C strings. Define it as unsigned or signed according to the platform -// so that we match what Rust's `CStr` uses. -// -// When we can update to linux-raw-sys 0.5, we can remove this, as its -// `c_char` type will declare this. -/// The C `char` type. -#[cfg(any( - target_arch = "aarch64", - target_arch = "arm", - target_arch = "msp430", - target_arch = "powerpc", - target_arch = "powerpc64", - target_arch = "riscv32", - target_arch = "riscv64", - target_arch = "s390x", -))] -#[allow(non_camel_case_types)] -pub type c_char = u8; -/// The C `char` type. -#[cfg(any( - target_arch = "mips", - target_arch = "mips64", - target_arch = "sparc64", - target_arch = "x86", - target_arch = "x86_64", - target_arch = "xtensa", -))] -#[allow(non_camel_case_types)] -pub type c_char = i8; - mod sys { pub(super) use linux_raw_sys::io_uring::*; #[cfg(test)] @@ -163,12 +120,6 @@ /// `IORING_ENTER_EXT_ARG` const EXT_ARG = sys::IORING_ENTER_EXT_ARG; - - /// `IORING_ENTER_REGISTERED_RING` - const REGISTERED_RING = sys::IORING_ENTER_REGISTERED_RING; - - /// - const _ = !0; } } @@ -504,9 +455,6 @@ /// `IORING_SETUP_DEFER_TASKRUN` const DEFER_TASKRUN = sys::IORING_SETUP_DEFER_TASKRUN; - - /// - const _ = !0; } } @@ -535,9 +483,6 @@ /// `1 << IOSQE_CQE_SKIP_SUCCESS_BIT` const CQE_SKIP_SUCCESS = 1 << sys::IOSQE_CQE_SKIP_SUCCESS_BIT as u8; - - /// - const _ = !0; } } @@ -557,9 +502,6 @@ /// `IORING_CQE_F_NOTIF` const NOTIF = bitcast!(sys::IORING_CQE_F_NOTIF); - - /// - const _ = !0; } } @@ -570,9 +512,6 @@ pub struct IoringFsyncFlags: u32 { /// `IORING_FSYNC_DATASYNC` const DATASYNC = sys::IORING_FSYNC_DATASYNC; - - /// - const _ = !0; } } @@ -605,9 +544,6 @@ /// `IORING_LINK_TIMEOUT_UPDATE` const LINK_TIMEOUT_UPDATE = sys::IORING_LINK_TIMEOUT_UPDATE; - - /// - const _ = !0; } } @@ -618,9 +554,6 @@ pub struct SpliceFlags: u32 { /// `SPLICE_F_FD_IN_FIXED` const FD_IN_FIXED = sys::SPLICE_F_FD_IN_FIXED; - - /// - const _ = !0; } } @@ -631,9 +564,6 @@ pub struct IoringMsgringFlags: u32 { /// `IORING_MSG_RING_CQE_SKIP` const CQE_SKIP = sys::IORING_MSG_RING_CQE_SKIP; - - /// - const _ = !0; } } @@ -653,9 +583,6 @@ /// `IORING_ASYNC_CANCEL_FD` const FD_FIXED = sys::IORING_ASYNC_CANCEL_FD_FIXED; - - /// - const _ = !0; } } @@ -702,9 +629,6 @@ /// `IORING_FEAT_LINKED_FILE` const LINKED_FILE = sys::IORING_FEAT_LINKED_FILE; - - /// - const _ = !0; } } @@ -715,9 +639,6 @@ pub struct IoringOpFlags: u16 { /// `IO_URING_OP_SUPPORTED` const SUPPORTED = sys::IO_URING_OP_SUPPORTED as _; - - /// - const _ = !0; } } @@ -728,9 +649,6 @@ pub struct IoringRsrcFlags: u32 { /// `IORING_RSRC_REGISTER_SPARSE` const REGISTER_SPARSE = sys::IORING_RSRC_REGISTER_SPARSE as _; - - /// - const _ = !0; } } @@ -747,9 +665,6 @@ /// `IORING_SQ_TASKRUN` const TASKRUN = sys::IORING_SQ_TASKRUN; - - /// - const _ = !0; } } @@ -760,9 +675,6 @@ pub struct IoringCqFlags: u32 { /// `IORING_CQ_EVENTFD_DISABLED` const EVENTFD_DISABLED = sys::IORING_CQ_EVENTFD_DISABLED; - - /// - const _ = !0; } } @@ -782,9 +694,6 @@ /// `IORING_POLL_ADD_LEVEL` const ADD_LEVEL = sys::IORING_POLL_ADD_LEVEL; - - /// - const _ = !0; } } @@ -805,9 +714,6 @@ /// `IORING_SEND_ZC_REPORT_USAGE` (since Linux 6.2) const ZC_REPORT_USAGE = sys::IORING_SEND_ZC_REPORT_USAGE as _; - - /// - const _ = !0; } } @@ -828,9 +734,6 @@ /// /// See also [`IoringSendFlags::FIXED_BUF`]. const FIXED_BUF = sys::IORING_RECVSEND_FIXED_BUF as _; - - /// - const _ = !0; } } @@ -841,9 +744,6 @@ pub struct IoringAcceptFlags: u16 { /// `IORING_ACCEPT_MULTISHOT` const MULTISHOT = sys::IORING_ACCEPT_MULTISHOT as _; - - /// - const _ = !0; } } @@ -866,9 +766,6 @@ /// `MSG_ERRQUEUE` const ERRQUEUE = net::MSG_ERRQUEUE; - - /// - const _ = !0; } } @@ -1105,20 +1002,20 @@ pub sync_range_flags: u32, /// `msg_flags` is split into `send_flags` and `recv_flags`. #[doc(alias = "msg_flags")] - pub send_flags: SendFlags, + pub send_flags: crate::net::SendFlags, /// `msg_flags` is split into `send_flags` and `recv_flags`. #[doc(alias = "msg_flags")] - pub recv_flags: RecvFlags, + pub recv_flags: crate::net::RecvFlags, pub timeout_flags: IoringTimeoutFlags, - pub accept_flags: SocketFlags, + pub accept_flags: crate::net::SocketFlags, pub cancel_flags: IoringAsyncCancelFlags, - pub open_flags: OFlags, - pub statx_flags: AtFlags, - pub fadvise_advice: Advice, + pub open_flags: crate::fs::OFlags, + pub statx_flags: crate::fs::AtFlags, + pub fadvise_advice: crate::fs::Advice, pub splice_flags: SpliceFlags, - pub rename_flags: RenameFlags, - pub unlink_flags: AtFlags, - pub hardlink_flags: AtFlags, + pub rename_flags: crate::fs::RenameFlags, + pub unlink_flags: crate::fs::AtFlags, + pub hardlink_flags: crate::fs::AtFlags, pub msg_ring_flags: IoringMsgringFlags, } @@ -1130,33 +1027,12 @@ pub buf_group: u16, } -// TODO: Rename this to include `addr_len` when we have a semver bump? #[allow(missing_docs)] #[repr(C)] #[derive(Copy, Clone)] pub union splice_fd_in_or_file_index_union { pub splice_fd_in: i32, pub file_index: u32, - pub addr_len: addr_len_struct, -} - -#[allow(missing_docs)] -#[repr(C)] -#[derive(Copy, Clone)] -pub struct addr_len_struct { - pub addr_len: u16, - pub __pad3: [u16; 1], -} - -#[allow(missing_docs)] -#[repr(C)] -#[derive(Copy, Clone)] -pub struct io_uring_sync_cancel_reg { - pub addr: u64, - pub fd: i32, - pub flags: IoringAsyncCancelFlags, - pub timeout: Timespec, - pub pad: [u64; 4], } /// An io_uring Completion Queue Entry. @@ -1333,12 +1209,16 @@ #[derive(Debug, Copy, Clone, Default)] pub struct open_how { /// An [`OFlags`] value represented as a `u64`. + /// + /// [`OFlags`]: crate::fs::OFlags pub flags: u64, /// A [`Mode`] value represented as a `u64`. + /// + /// [`Mode`]: crate::fs::Mode pub mode: u64, - pub resolve: ResolveFlags, + pub resolve: crate::fs::ResolveFlags, } #[allow(missing_docs)] @@ -1431,15 +1311,12 @@ fn io_uring_layouts() { use sys as c; - assert_eq_size!(io_uring_ptr, u64); - check_renamed_type!(off_or_addr2_union, io_uring_sqe__bindgen_ty_1); check_renamed_type!(addr_or_splice_off_in_union, io_uring_sqe__bindgen_ty_2); check_renamed_type!(addr3_or_cmd_union, io_uring_sqe__bindgen_ty_6); check_renamed_type!(op_flags_union, io_uring_sqe__bindgen_ty_3); check_renamed_type!(buf_union, io_uring_sqe__bindgen_ty_4); check_renamed_type!(splice_fd_in_or_file_index_union, io_uring_sqe__bindgen_ty_5); - check_renamed_type!(addr_len_struct, io_uring_sqe__bindgen_ty_5__bindgen_ty_1); check_renamed_type!( register_or_sqe_op_or_sqe_flags_union, io_uring_restriction__bindgen_ty_1 @@ -1523,5 +1400,4 @@ check_struct!(open_how, flags, mode, resolve); check_struct!(io_uring_buf_reg, ring_addr, ring_entries, bgid, pad, resv); check_struct!(io_uring_buf, addr, len, bid, resv); - check_struct!(io_uring_sync_cancel_reg, addr, fd, flags, timeout, pad); } diff -Nru temporalio-1.3.0/vendor/rustix/src/lib.rs temporalio-1.3.0/vendor/rustix/src/lib.rs --- temporalio-1.3.0/vendor/rustix/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -55,8 +55,7 @@ //! - Path arguments use [`Arg`], so they accept any string type. //! - File descriptors are passed and returned via [`AsFd`] and [`OwnedFd`] //! instead of bare integers, ensuring I/O safety. -//! - Constants use `enum`s and [`bitflags`] types, and enable [support for -//! externally defined flags]. +//! - Constants use `enum`s and [`bitflags`] types. //! - Multiplexed functions (eg. `fcntl`, `ioctl`, etc.) are de-multiplexed. //! - Variadic functions (eg. `openat`, etc.) are presented as non-variadic. //! - Functions that return strings automatically allocate sufficient memory @@ -94,7 +93,6 @@ //! [I/O-safe]: https://github.com/rust-lang/rfcs/blob/master/text/3128-io-safety.md //! [`Result`]: https://doc.rust-lang.org/stable/std/result/enum.Result.html //! [`Arg`]: https://docs.rs/rustix/*/rustix/path/trait.Arg.html -//! [support for externally defined flags]: https://docs.rs/bitflags/*/bitflags/#externally-defined-flags #![deny(missing_docs)] #![allow(stable_features)] @@ -104,30 +102,25 @@ #![cfg_attr(all(wasi_ext, target_os = "wasi", feature = "std"), feature(wasi_ext))] #![cfg_attr(core_ffi_c, feature(core_ffi_c))] #![cfg_attr(core_c_str, feature(core_c_str))] -#![cfg_attr(all(feature = "alloc", alloc_c_string), feature(alloc_c_string))] -#![cfg_attr(all(feature = "alloc", alloc_ffi), feature(alloc_ffi))] +#![cfg_attr(alloc_c_string, feature(alloc_c_string))] +#![cfg_attr(alloc_ffi, feature(alloc_ffi))] #![cfg_attr(not(feature = "std"), no_std)] #![cfg_attr(feature = "rustc-dep-of-std", feature(ip))] -#![cfg_attr(feature = "rustc-dep-of-std", allow(internal_features))] #![cfg_attr( any(feature = "rustc-dep-of-std", core_intrinsics), feature(core_intrinsics) )] #![cfg_attr(asm_experimental_arch, feature(asm_experimental_arch))] #![cfg_attr(not(feature = "all-apis"), allow(dead_code))] -// It is common in Linux and libc APIs for types to vary between platforms. +// It is common in linux and libc APIs for types to vary between platforms. #![allow(clippy::unnecessary_cast)] -// It is common in Linux and libc APIs for types to vary between platforms. +// It is common in linux and libc APIs for types to vary between platforms. #![allow(clippy::useless_conversion)] // Redox and WASI have enough differences that it isn't worth precisely -// conditionalizing all the `use`s for them. Similar for if we don't have -// "all-apis". -#![cfg_attr( - any(target_os = "redox", target_os = "wasi", not(feature = "all-apis")), - allow(unused_imports) -)] +// conditionalizing all the `use`s for them. +#![cfg_attr(any(target_os = "redox", target_os = "wasi"), allow(unused_imports))] -#[cfg(all(feature = "alloc", not(feature = "rustc-dep-of-std")))] +#[cfg(not(feature = "rustc-dep-of-std"))] extern crate alloc; // Use `static_assertions` macros if we have them, or a polyfill otherwise. @@ -197,7 +190,20 @@ #[cfg(not(windows))] pub mod ffi; #[cfg(not(windows))] -#[cfg(feature = "fs")] +#[cfg(any( + feature = "fs", + all( + linux_raw, + not(feature = "use-libc-auxv"), + not(target_vendor = "mustang"), + any( + feature = "param", + feature = "runtime", + feature = "time", + target_arch = "x86", + ) + ) +))] #[cfg_attr(doc_cfg, doc(cfg(feature = "fs")))] pub mod fs; pub mod io; @@ -205,8 +211,7 @@ #[cfg(feature = "io_uring")] #[cfg_attr(doc_cfg, doc(cfg(feature = "io_uring")))] pub mod io_uring; -pub mod ioctl; -#[cfg(not(any(windows, target_os = "espidf", target_os = "vita", target_os = "wasi")))] +#[cfg(not(any(windows, target_os = "espidf", target_os = "wasi")))] #[cfg(feature = "mm")] #[cfg_attr(doc_cfg, doc(cfg(feature = "mm")))] pub mod mm; @@ -223,7 +228,22 @@ #[cfg_attr(doc_cfg, doc(cfg(feature = "param")))] pub mod param; #[cfg(not(windows))] -#[cfg(any(feature = "fs", feature = "mount", feature = "net"))] +#[cfg(any( + feature = "fs", + feature = "mount", + feature = "net", + all( + linux_raw, + not(feature = "use-libc-auxv"), + not(target_vendor = "mustang"), + any( + feature = "param", + feature = "runtime", + feature = "time", + target_arch = "x86", + ) + ) +))] #[cfg_attr( doc_cfg, doc(cfg(any(feature = "fs", feature = "mount", feature = "net"))) @@ -250,16 +270,6 @@ #[cfg(feature = "rand")] #[cfg_attr(doc_cfg, doc(cfg(feature = "rand")))] pub mod rand; -#[cfg(not(any( - windows, - target_os = "android", - target_os = "espidf", - target_os = "vita", - target_os = "wasi" -)))] -#[cfg(feature = "shm")] -#[cfg_attr(doc_cfg, doc(cfg(feature = "shm")))] -pub mod shm; #[cfg(not(windows))] #[cfg(feature = "stdio")] #[cfg_attr(doc_cfg, doc(cfg(feature = "stdio")))] @@ -268,7 +278,7 @@ #[cfg(not(any(windows, target_os = "wasi")))] #[cfg_attr(doc_cfg, doc(cfg(feature = "system")))] pub mod system; -#[cfg(not(any(windows, target_os = "vita")))] +#[cfg(not(windows))] #[cfg(feature = "termios")] #[cfg_attr(doc_cfg, doc(cfg(feature = "termios")))] pub mod termios; @@ -285,7 +295,7 @@ #[cfg(not(windows))] #[cfg(feature = "runtime")] #[cfg(linux_raw)] -#[cfg_attr(not(document_experimental_runtime_api), doc(hidden))] +#[doc(hidden)] #[cfg_attr(doc_cfg, doc(cfg(feature = "runtime")))] pub mod runtime; @@ -295,40 +305,6 @@ #[cfg(all(feature = "fs", not(feature = "mount")))] pub(crate) mod mount; -// Declare "fs" as a non-public module if "fs" isn't enabled but we need it for -// reading procfs. -#[cfg(not(windows))] -#[cfg(not(feature = "fs"))] -#[cfg(all( - linux_raw, - not(feature = "use-libc-auxv"), - not(feature = "use-explicitly-provided-auxv"), - any( - feature = "param", - feature = "runtime", - feature = "time", - target_arch = "x86", - ) -))] -#[cfg_attr(doc_cfg, doc(cfg(feature = "fs")))] -pub(crate) mod fs; - -// Similarly, declare `path` as a non-public module if needed. -#[cfg(not(windows))] -#[cfg(not(any(feature = "fs", feature = "mount", feature = "net")))] -#[cfg(all( - linux_raw, - not(feature = "use-libc-auxv"), - not(feature = "use-explicitly-provided-auxv"), - any( - feature = "param", - feature = "runtime", - feature = "time", - target_arch = "x86", - ) -))] -pub(crate) mod path; - // Private modules used by multiple public modules. #[cfg(not(any(windows, target_os = "espidf")))] #[cfg(any(feature = "thread", feature = "time", target_arch = "x86"))] @@ -340,8 +316,7 @@ feature = "runtime", feature = "termios", feature = "thread", - all(bsd, feature = "event"), - all(linux_kernel, feature = "net") + all(bsd, feature = "event") ))] mod pid; #[cfg(any(feature = "process", feature = "thread"))] @@ -359,7 +334,7 @@ all( linux_raw, not(feature = "use-libc-auxv"), - not(feature = "use-explicitly-provided-auxv"), + not(target_vendor = "mustang"), any( feature = "param", feature = "runtime", @@ -377,14 +352,13 @@ all( linux_raw, not(feature = "use-libc-auxv"), - not(feature = "use-explicitly-provided-auxv"), + not(target_vendor = "mustang"), any( feature = "param", feature = "runtime", feature = "time", target_arch = "x86", ) - ), - all(linux_kernel, feature = "net") + ) ))] mod ugid; diff -Nru temporalio-1.3.0/vendor/rustix/src/maybe_polyfill/no_std/net/mod.rs temporalio-1.3.0/vendor/rustix/src/maybe_polyfill/no_std/net/mod.rs --- temporalio-1.3.0/vendor/rustix/src/maybe_polyfill/no_std/net/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/maybe_polyfill/no_std/net/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,6 +1,5 @@ mod ip_addr; mod socket_addr; -#[allow(unused_imports)] pub use self::ip_addr::{IpAddr, Ipv4Addr, Ipv6Addr, Ipv6MulticastScope}; pub use self::socket_addr::{SocketAddr, SocketAddrV4, SocketAddrV6}; diff -Nru temporalio-1.3.0/vendor/rustix/src/maybe_polyfill/no_std/os/fd/mod.rs temporalio-1.3.0/vendor/rustix/src/maybe_polyfill/no_std/os/fd/mod.rs --- temporalio-1.3.0/vendor/rustix/src/maybe_polyfill/no_std/os/fd/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/maybe_polyfill/no_std/os/fd/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -5,11 +5,8 @@ //! All code in this file is licensed MIT or Apache 2.0 at your option. //! //! Owned and borrowed Unix-like file descriptors. -//! -//! This module is supported on Unix platforms and WASI, which both use a -//! similar file descriptor system for referencing OS resources. -#![cfg_attr(staged_api, stable(feature = "os_fd", since = "1.66.0"))] +#![cfg_attr(staged_api, unstable(feature = "io_safety", issue = "87074"))] #![deny(unsafe_op_in_unsafe_fn)] // `RawFd`, `AsRawFd`, etc. @@ -18,8 +15,5 @@ // `OwnedFd`, `AsFd`, etc. mod owned; -// Export the types and traits for the public API. -#[cfg_attr(staged_api, stable(feature = "os_fd", since = "1.66.0"))] pub use owned::*; -#[cfg_attr(staged_api, stable(feature = "os_fd", since = "1.66.0"))] pub use raw::*; diff -Nru temporalio-1.3.0/vendor/rustix/src/maybe_polyfill/no_std/os/fd/owned.rs temporalio-1.3.0/vendor/rustix/src/maybe_polyfill/no_std/os/fd/owned.rs --- temporalio-1.3.0/vendor/rustix/src/maybe_polyfill/no_std/os/fd/owned.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/maybe_polyfill/no_std/os/fd/owned.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,6 +1,6 @@ //! The following is derived from Rust's //! library/std/src/os/fd/owned.rs at revision -//! 334a54cd83191f38ad8046ed94c45de735c86c65. +//! fa68e73e9947be8ffc5b3b46d899e4953a44e7e9. //! //! All code in this file is licensed MIT or Apache 2.0 at your option. //! @@ -18,9 +18,8 @@ /// A borrowed file descriptor. /// -/// This has a lifetime parameter to tie it to the lifetime of something that owns the file -/// descriptor. For the duration of that lifetime, it is guaranteed that nobody will close the file -/// descriptor. +/// This has a lifetime parameter to tie it to the lifetime of something that +/// owns the file descriptor. /// /// This uses `repr(transparent)` and has the representation of a host file /// descriptor, so it can be used in FFI in places where a file descriptor is @@ -37,8 +36,8 @@ // 32-bit c_int. Below is -2, in two's complement, but that only works out // because c_int is 32 bits. #[cfg_attr(rustc_attrs, rustc_layout_scalar_valid_range_end(0xFF_FF_FF_FE))] +#[cfg_attr(staged_api, unstable(feature = "io_safety", issue = "87074"))] #[cfg_attr(rustc_attrs, rustc_nonnull_optimization_guaranteed)] -#[cfg_attr(staged_api, stable(feature = "io_safety", since = "1.63.0"))] pub struct BorrowedFd<'fd> { fd: RawFd, _phantom: PhantomData<&'fd OwnedFd>, @@ -46,8 +45,7 @@ /// An owned file descriptor. /// -/// This closes the file descriptor on drop. It is guaranteed that nobody else will close the file -/// descriptor. +/// This closes the file descriptor on drop. /// /// This uses `repr(transparent)` and has the representation of a host file /// descriptor, so it can be used in FFI in places where a file descriptor is @@ -73,11 +71,7 @@ /// The resource pointed to by `fd` must remain open for the duration of /// the returned `BorrowedFd`, and it must not have the value `-1`. #[inline] - #[cfg_attr( - staged_api, - rustc_const_stable(feature = "io_safety", since = "1.63.0") - )] - #[cfg_attr(staged_api, stable(feature = "io_safety", since = "1.63.0"))] + #[cfg_attr(staged_api, unstable(feature = "io_safety", issue = "87074"))] pub const unsafe fn borrow_raw(fd: RawFd) -> Self { assert!(fd != u32::MAX as RawFd); // SAFETY: we just asserted that the value is in the valid range and isn't `-1` (the only value bigger than `0xFF_FF_FF_FE` unsigned) @@ -121,42 +115,6 @@ } } -impl BorrowedFd<'_> { - /// Creates a new `OwnedFd` instance that shares the same underlying file - /// description as the existing `BorrowedFd` instance. - #[cfg(not(any(target_arch = "wasm32", target_os = "hermit")))] - #[cfg_attr(staged_api, stable(feature = "io_safety", since = "1.63.0"))] - pub fn try_clone_to_owned(&self) -> crate::io::Result { - // Avoid using file descriptors below 3 as they are used for stdio - - // We want to atomically duplicate this file descriptor and set the - // CLOEXEC flag, and currently that's done via F_DUPFD_CLOEXEC. This - // is a POSIX flag that was added to Linux in 2.6.24. - #[cfg(not(target_os = "espidf"))] - let fd = crate::io::fcntl_dupfd_cloexec(self, 3)?; - - // For ESP-IDF, F_DUPFD is used instead, because the CLOEXEC semantics - // will never be supported, as this is a bare metal framework with - // no capabilities for multi-process execution. While F_DUPFD is also - // not supported yet, it might be (currently it returns ENOSYS). - #[cfg(target_os = "espidf")] - let fd = crate::io::fcntl_dupfd(self, 3)?; - - Ok(fd) - } - - /// Creates a new `OwnedFd` instance that shares the same underlying file - /// description as the existing `BorrowedFd` instance. - #[cfg(any(target_arch = "wasm32", target_os = "hermit"))] - #[cfg_attr(staged_api, stable(feature = "io_safety", since = "1.63.0"))] - pub fn try_clone_to_owned(&self) -> crate::io::Result { - Err(crate::io::const_io_error!( - crate::io::ErrorKind::Unsupported, - "operation not supported on WASI yet", - )) - } -} - #[cfg_attr(staged_api, unstable(feature = "io_safety", issue = "87074"))] impl AsRawFd for BorrowedFd<'_> { #[inline] @@ -190,9 +148,7 @@ /// # Safety /// /// The resource pointed to by `fd` must be open and suitable for assuming - /// [ownership][io-safety]. The resource must not require any cleanup other than `close`. - /// - /// [io-safety]: io#io-safety + /// ownership. The resource must not require any cleanup other than `close`. #[inline] unsafe fn from_raw_fd(fd: RawFd) -> Self { assert_ne!(fd, u32::MAX as RawFd); diff -Nru temporalio-1.3.0/vendor/rustix/src/maybe_polyfill/no_std/os/fd/raw.rs temporalio-1.3.0/vendor/rustix/src/maybe_polyfill/no_std/os/fd/raw.rs --- temporalio-1.3.0/vendor/rustix/src/maybe_polyfill/no_std/os/fd/raw.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/maybe_polyfill/no_std/os/fd/raw.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,6 +1,6 @@ //! The following is derived from Rust's //! library/std/src/os/fd/raw.rs at revision -//! 334a54cd83191f38ad8046ed94c45de735c86c65. +//! fa68e73e9947be8ffc5b3b46d899e4953a44e7e9. //! //! All code in this file is licensed MIT or Apache 2.0 at your option. //! @@ -71,10 +71,7 @@ /// /// # Safety /// - /// The `fd` passed in must be an [owned file descriptor][io-safety]; - /// in particular, it must be open. - /// - /// [io-safety]: io#io-safety + /// The `fd` passed in must be a valid an open file descriptor. /// /// # Example /// diff -Nru temporalio-1.3.0/vendor/rustix/src/mm/madvise.rs temporalio-1.3.0/vendor/rustix/src/mm/madvise.rs --- temporalio-1.3.0/vendor/rustix/src/mm/madvise.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/mm/madvise.rs 2023-10-30 19:40:00.000000000 +0000 @@ -16,9 +16,9 @@ /// /// # Safety /// -/// `addr` must be a valid pointer to memory that is appropriate to call -/// `posix_madvise` on. Some forms of `advice` may mutate the memory or evoke a -/// variety of side-effects on the mapping and/or the file. +/// `addr` must be a valid pointer to memory that is appropriate to +/// call `posix_madvise` on. Some forms of `advice` may mutate the memory +/// or evoke a variety of side-effects on the mapping and/or the file. /// /// # References /// - [POSIX] diff -Nru temporalio-1.3.0/vendor/rustix/src/mm/mmap.rs temporalio-1.3.0/vendor/rustix/src/mm/mmap.rs --- temporalio-1.3.0/vendor/rustix/src/mm/mmap.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/mm/mmap.rs 2023-10-30 19:40:00.000000000 +0000 @@ -10,40 +10,12 @@ use backend::fd::AsFd; use core::ffi::c_void; -#[cfg(any(linux_kernel, freebsdlike, netbsdlike))] -pub use backend::mm::types::MlockAllFlags; #[cfg(linux_kernel)] pub use backend::mm::types::MlockFlags; #[cfg(any(target_os = "emscripten", target_os = "linux"))] pub use backend::mm::types::MremapFlags; pub use backend::mm::types::{MapFlags, MprotectFlags, ProtFlags}; -impl MapFlags { - /// Create `MAP_HUGETLB` with provided size of huge page. - /// - /// Under the hood it computes - /// `MAP_HUGETLB | (huge_page_size_log2 << MAP_HUGE_SHIFT)`. - /// `huge_page_size_log2` denotes logarithm of huge page size to use and - /// should be between 16 and 63 (inclusive). - /// - /// ``` - /// use rustix::mm::MapFlags; - /// - /// let f = MapFlags::hugetlb_with_size_log2(30).unwrap(); - /// assert_eq!(f, MapFlags::HUGETLB | MapFlags::HUGE_1GB); - /// ``` - #[cfg(linux_kernel)] - pub const fn hugetlb_with_size_log2(huge_page_size_log2: u32) -> Option { - use linux_raw_sys::general::{MAP_HUGETLB, MAP_HUGE_SHIFT}; - if 16 <= huge_page_size_log2 && huge_page_size_log2 <= 63 { - let bits = MAP_HUGETLB | (huge_page_size_log2 << MAP_HUGE_SHIFT); - Self::from_bits(bits) - } else { - None - } - } -} - /// `mmap(ptr, len, prot, flags, fd, offset)`—Create a file-backed memory /// mapping. /// @@ -342,68 +314,3 @@ pub unsafe fn munlock(ptr: *mut c_void, len: usize) -> io::Result<()> { backend::mm::syscalls::munlock(ptr, len) } - -/// Locks all pages mapped into the address space of the calling process. -/// -/// This includes the pages of the code, data, and stack segment, as well as -/// shared libraries, user space kernel data, shared memory, and memory-mapped -/// files. All mapped pages are guaranteed to be resident in RAM when the call -/// returns successfully; the pages are guaranteed to stay in RAM until later -/// unlocked. -/// -/// # References -/// - [POSIX] -/// - [Linux] -/// - [FreeBSD] -/// - [NetBSD] -/// - [OpenBSD] -/// - [DragonFly BSD] -/// - [illumos] -/// - [glibc] -/// -/// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/mlockall.html -/// [Linux]: https://man7.org/linux/man-pages/man2/mlockall.2.html -/// [FreeBSD]: https://man.freebsd.org/cgi/man.cgi?query=mlockall&sektion=2 -/// [NetBSD]: https://man.netbsd.org/mlockall.2 -/// [OpenBSD]: https://man.openbsd.org/mlockall.2 -/// [DragonFly BSD]: https://man.dragonflybsd.org/?command=mlockall§ion=2 -/// [illumos]: https://illumos.org/man/3C/mlockall -/// [glibc]: https://www.gnu.org/software/libc/manual/html_node/Page-Lock-Functions.html#index-mlockall -#[cfg(any(linux_kernel, freebsdlike, netbsdlike))] -#[inline] -pub fn mlockall(flags: MlockAllFlags) -> io::Result<()> { - backend::mm::syscalls::mlockall(flags) -} - -/// Unlocks all pages mapped into the address space of the calling process. -/// -/// # Warnings -/// -/// This function is aware of all the memory pages in the process, as if it -/// were a debugger. It unlocks all the pages, which could potentially -/// compromise security assumptions made by code about memory it has -/// encapsulated. -/// -/// # References -/// - [POSIX] -/// - [Linux] -/// - [FreeBSD] -/// - [NetBSD] -/// - [OpenBSD] -/// - [DragonFly BSD] -/// - [illumos] -/// - [glibc] -/// -/// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/munlockall.html -/// [Linux]: https://man7.org/linux/man-pages/man2/munlockall.2.html -/// [FreeBSD]: https://man.freebsd.org/cgi/man.cgi?query=munlockall&sektion=2 -/// [NetBSD]: https://man.netbsd.org/munlockall.2 -/// [OpenBSD]: https://man.openbsd.org/munlockall.2 -/// [DragonFly BSD]: https://man.dragonflybsd.org/?command=munlockall§ion=2 -/// [illumos]: https://illumos.org/man/3C/munlockall -/// [glibc]: https://www.gnu.org/software/libc/manual/html_node/Page-Lock-Functions.html#index-munlockall -#[cfg(any(linux_kernel, freebsdlike, netbsdlike))] -#[inline] -pub fn munlockall() -> io::Result<()> { - backend::mm::syscalls::munlockall() -} diff -Nru temporalio-1.3.0/vendor/rustix/src/mm/msync.rs temporalio-1.3.0/vendor/rustix/src/mm/msync.rs --- temporalio-1.3.0/vendor/rustix/src/mm/msync.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/mm/msync.rs 2023-10-30 19:40:00.000000000 +0000 @@ -16,9 +16,9 @@ /// /// # Safety /// -/// `addr` must be a valid pointer to memory that is appropriate to call -/// `msync` on. Some forms of `msync` may mutate the memory or evoke a variety -/// of side-effects on the mapping and/or the file. +/// `addr` must be a valid pointer to memory that is appropriate to +/// call `msync` on. Some forms of `msync` may mutate the memory +/// or evoke a variety of side-effects on the mapping and/or the file. /// /// # References /// - [POSIX] diff -Nru temporalio-1.3.0/vendor/rustix/src/net/send_recv/mod.rs temporalio-1.3.0/vendor/rustix/src/net/send_recv/mod.rs --- temporalio-1.3.0/vendor/rustix/src/net/send_recv/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/net/send_recv/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -8,22 +8,10 @@ pub use backend::net::send_recv::{RecvFlags, SendFlags}; -#[cfg(not(any( - windows, - target_os = "espidf", - target_os = "redox", - target_os = "vita", - target_os = "wasi" -)))] +#[cfg(not(any(windows, target_os = "espidf", target_os = "redox", target_os = "wasi")))] mod msg; -#[cfg(not(any( - windows, - target_os = "espidf", - target_os = "redox", - target_os = "vita", - target_os = "wasi" -)))] +#[cfg(not(any(windows, target_os = "espidf", target_os = "redox", target_os = "wasi")))] pub use msg::*; /// `recv(fd, buf, flags)`—Reads data from a socket. diff -Nru temporalio-1.3.0/vendor/rustix/src/net/send_recv/msg.rs temporalio-1.3.0/vendor/rustix/src/net/send_recv/msg.rs --- temporalio-1.3.0/vendor/rustix/src/net/send_recv/msg.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/net/send_recv/msg.rs 2023-10-30 19:40:00.000000000 +0000 @@ -5,14 +5,10 @@ use crate::backend::{self, c}; use crate::fd::{AsFd, BorrowedFd, OwnedFd}; use crate::io::{self, IoSlice, IoSliceMut}; -#[cfg(linux_kernel)] -use crate::net::UCred; use core::iter::FusedIterator; use core::marker::PhantomData; -use core::mem::{align_of, size_of, size_of_val, take}; -#[cfg(linux_kernel)] -use core::ptr::addr_of; +use core::mem::{size_of, size_of_val, take}; use core::{ptr, slice}; use super::{RecvFlags, SendFlags, SocketAddrAny, SocketAddrV4, SocketAddrV6}; @@ -26,11 +22,6 @@ $len * ::core::mem::size_of::<$crate::fd::BorrowedFd<'static>>(), ) }; - (ScmCredentials($len:expr)) => { - $crate::net::__cmsg_space( - $len * ::core::mem::size_of::<$crate::net::UCred>(), - ) - }; // Combo Rules (($($($x:tt)*),+)) => { @@ -42,19 +33,8 @@ } #[doc(hidden)] -pub const fn __cmsg_space(len: usize) -> usize { - // Add `align_of::()` so that we can align the user-provided - // `&[u8]` to the required alignment boundary. - let len = len + align_of::(); - - // Convert `len` to `u32` for `CMSG_SPACE`. This would be `try_into()` if - // we could call that in a `const fn`. - let converted_len = len as u32; - if converted_len as usize != len { - unreachable!(); // `CMSG_SPACE` size overflow - } - - unsafe { c::CMSG_SPACE(converted_len) as usize } +pub fn __cmsg_space(len: usize) -> usize { + unsafe { c::CMSG_SPACE(len.try_into().expect("CMSG_SPACE size overflow")) as usize } } /// Ancillary message for [`sendmsg`], [`sendmsg_v4`], [`sendmsg_v6`], @@ -62,23 +42,24 @@ #[non_exhaustive] pub enum SendAncillaryMessage<'slice, 'fd> { /// Send file descriptors. - #[doc(alias = "SCM_RIGHTS")] ScmRights(&'slice [BorrowedFd<'fd>]), - /// Send process credentials. - #[cfg(linux_kernel)] - #[doc(alias = "SCM_CREDENTIAL")] - ScmCredentials(UCred), } impl SendAncillaryMessage<'_, '_> { /// Get the maximum size of an ancillary message. /// /// This can be helpful in determining the size of the buffer you allocate. - pub const fn size(&self) -> usize { - match self { - Self::ScmRights(slice) => cmsg_space!(ScmRights(slice.len())), - #[cfg(linux_kernel)] - Self::ScmCredentials(_) => cmsg_space!(ScmCredentials(1)), + pub fn size(&self) -> usize { + let total_bytes = match self { + Self::ScmRights(slice) => size_of_val(*slice), + }; + + unsafe { + c::CMSG_SPACE( + total_bytes + .try_into() + .expect("size too large for CMSG_SPACE"), + ) as usize } } } @@ -87,16 +68,10 @@ #[non_exhaustive] pub enum RecvAncillaryMessage<'a> { /// Received file descriptors. - #[doc(alias = "SCM_RIGHTS")] ScmRights(AncillaryIter<'a, OwnedFd>), - /// Received process credentials. - #[cfg(linux_kernel)] - #[doc(alias = "SCM_CREDENTIALS")] - ScmCredentials(UCred), } -/// Buffer for sending ancillary messages with [`sendmsg`], [`sendmsg_v4`], -/// [`sendmsg_v6`], [`sendmsg_unix`], and [`sendmsg_any`]. +/// Buffer for sending ancillary messages. pub struct SendAncillaryBuffer<'buf, 'slice, 'fd> { /// Raw byte buffer for messages. buffer: &'buf mut [u8], @@ -116,20 +91,15 @@ impl Default for SendAncillaryBuffer<'_, '_, '_> { fn default() -> Self { - Self { - buffer: &mut [], - length: 0, - _phantom: PhantomData, - } + Self::new(&mut []) } } impl<'buf, 'slice, 'fd> SendAncillaryBuffer<'buf, 'slice, 'fd> { /// Create a new, empty `SendAncillaryBuffer` from a raw byte buffer. - #[inline] pub fn new(buffer: &'buf mut [u8]) -> Self { Self { - buffer: align_for_cmsghdr(buffer), + buffer, length: 0, _phantom: PhantomData, } @@ -168,13 +138,6 @@ unsafe { slice::from_raw_parts(fds.as_ptr().cast::(), size_of_val(fds)) }; self.push_ancillary(fds_bytes, c::SOL_SOCKET as _, c::SCM_RIGHTS as _) } - #[cfg(linux_kernel)] - SendAncillaryMessage::ScmCredentials(ucred) => { - let ucred_bytes = unsafe { - slice::from_raw_parts(addr_of!(ucred).cast::(), size_of_val(&ucred)) - }; - self.push_ancillary(ucred_bytes, c::SOL_SOCKET as _, c::SCM_CREDENTIALS as _) - } } } @@ -228,8 +191,7 @@ } } -/// Buffer for receiving ancillary messages with [`recvmsg`]. -#[derive(Default)] +/// Buffer for receiving ancillary messages. pub struct RecvAncillaryBuffer<'buf> { /// Raw byte buffer for messages. buffer: &'buf mut [u8], @@ -247,12 +209,17 @@ } } +impl Default for RecvAncillaryBuffer<'_> { + fn default() -> Self { + Self::new(&mut []) + } +} + impl<'buf> RecvAncillaryBuffer<'buf> { /// Create a new, empty `RecvAncillaryBuffer` from a raw byte buffer. - #[inline] pub fn new(buffer: &'buf mut [u8]) -> Self { Self { - buffer: align_for_cmsghdr(buffer), + buffer, read: 0, length: 0, } @@ -307,17 +274,7 @@ } } -/// Return a slice of `buffer` starting at the first `cmsghdr` alignment -/// boundary. -#[inline] -fn align_for_cmsghdr(buffer: &mut [u8]) -> &mut [u8] { - let align = align_of::(); - let addr = buffer.as_ptr() as usize; - let adjusted = (addr + (align - 1)) & align.wrapping_neg(); - &mut buffer[adjusted - addr..] -} - -/// An iterator that drains messages from a [`RecvAncillaryBuffer`]. +/// An iterator that drains messages from a `RecvAncillaryBuffer`. pub struct AncillaryDrain<'buf> { /// Inner iterator over messages. messages: messages::Messages<'buf>, @@ -330,14 +287,14 @@ } impl<'buf> AncillaryDrain<'buf> { - /// A closure that converts a message into a [`RecvAncillaryMessage`]. + /// A closure that converts a message into a `RecvAncillaryMessage`. fn cvt_msg( read: &mut usize, length: &mut usize, msg: &c::cmsghdr, ) -> Option> { unsafe { - // Advance the `read` pointer. + // Advance the "read" pointer. let msg_len = msg.cmsg_len as usize; *read += msg_len; *length -= msg_len; @@ -358,15 +315,6 @@ Some(RecvAncillaryMessage::ScmRights(fds)) } - #[cfg(linux_kernel)] - (c::SOL_SOCKET, c::SCM_CREDENTIALS) => { - if payload_len >= size_of::() { - let ucred = payload.as_ptr().cast::().read_unaligned(); - Some(RecvAncillaryMessage::ScmCredentials(ucred)) - } else { - None - } - } _ => None, } } @@ -745,7 +693,7 @@ /// An iterator over the messages in an ancillary buffer. pub(super) struct Messages<'buf> { - /// The message header we're using to iterate over the messages. + /// The message header we're using to iterator over the messages. msghdr: c::msghdr, /// The current pointer to the next message header to return. diff -Nru temporalio-1.3.0/vendor/rustix/src/net/socket_addr_any.rs temporalio-1.3.0/vendor/rustix/src/net/socket_addr_any.rs --- temporalio-1.3.0/vendor/rustix/src/net/socket_addr_any.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/net/socket_addr_any.rs 2023-10-30 19:40:00.000000000 +0000 @@ -11,7 +11,7 @@ #[cfg(unix)] use crate::net::SocketAddrUnix; -use crate::net::{AddressFamily, SocketAddr, SocketAddrV4, SocketAddrV6}; +use crate::net::{AddressFamily, SocketAddrV4, SocketAddrV6}; use crate::{backend, io}; #[cfg(feature = "std")] use core::fmt; @@ -32,16 +32,6 @@ Unix(SocketAddrUnix), } -impl From for SocketAddrAny { - #[inline] - fn from(from: SocketAddr) -> Self { - match from { - SocketAddr::V4(v4) => Self::V4(v4), - SocketAddr::V6(v6) => Self::V6(v6), - } - } -} - impl From for SocketAddrAny { #[inline] fn from(from: SocketAddrV4) -> Self { diff -Nru temporalio-1.3.0/vendor/rustix/src/net/socket.rs temporalio-1.3.0/vendor/rustix/src/net/socket.rs --- temporalio-1.3.0/vendor/rustix/src/net/socket.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/net/socket.rs 2023-10-30 19:40:00.000000000 +0000 @@ -13,8 +13,7 @@ /// however it is not safe in general to rely on this, as file descriptors may /// be unexpectedly allocated on other threads or in libraries. /// -/// To pass extra flags such as [`SocketFlags::CLOEXEC`] or -/// [`SocketFlags::NONBLOCK`], use [`socket_with`]. +/// To pass extra flags such as [`SocketFlags::CLOEXEC`], use [`socket_with`]. /// /// # References /// - [Beej's Guide to Network Programming] @@ -83,7 +82,6 @@ /// [DragonFly BSD]: https://man.dragonflybsd.org/?command=socket§ion=2 /// [illumos]: https://illumos.org/man/3SOCKET/socket /// [glibc]: https://www.gnu.org/software/libc/manual/html_node/Creating-a-Socket.html -#[doc(alias("socket"))] #[inline] pub fn socket_with( domain: AddressFamily, @@ -273,10 +271,6 @@ /// `connect(sockfd, addr)`—Initiates a connection to an IP address. /// -/// On Windows, a non-blocking socket returns [`Errno::WOULDBLOCK`] if the -/// connection cannot be completed immediately, rather than -/// `Errno::INPROGRESS`. -/// /// # References /// - [Beej's Guide to Network Programming] /// - [POSIX] @@ -301,7 +295,6 @@ /// [DragonFly BSD]: https://man.dragonflybsd.org/?command=connect§ion=2 /// [illumos]: https://illumos.org/man/3SOCKET/connect /// [glibc]: https://www.gnu.org/software/libc/manual/html_node/Connecting.html -/// [`Errno::WOULDBLOCK`]: io::Errno::WOULDBLOCK pub fn connect(sockfd: Fd, addr: &SocketAddr) -> io::Result<()> { _connect(sockfd.as_fd(), addr) } @@ -453,44 +446,6 @@ backend::net::syscalls::connect_unix(sockfd.as_fd(), addr) } -/// `connect(sockfd, {.sa_family = AF_UNSPEC}, sizeof(struct sockaddr))` -/// — Dissolve the socket's association. -/// -/// On UDP sockets, BSD platforms report [`Errno::AFNOSUPPORT`] or -/// [`Errno::INVAL`] even if the disconnect was successful. -/// -/// # References -/// - [Beej's Guide to Network Programming] -/// - [POSIX] -/// - [Linux] -/// - [Apple] -/// - [Winsock2] -/// - [FreeBSD] -/// - [NetBSD] -/// - [OpenBSD] -/// - [DragonFly BSD] -/// - [illumos] -/// - [glibc] -/// -/// [Beej's Guide to Network Programming]: https://beej.us/guide/bgnet/html/split/system-calls-or-bust.html#connect -/// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/connect.html -/// [Linux]: https://man7.org/linux/man-pages/man2/connect.2.html -/// [Apple]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/connect.2.html -/// [Winsock2]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-connect -/// [FreeBSD]: https://man.freebsd.org/cgi/man.cgi?query=connect&sektion=2 -/// [NetBSD]: https://man.netbsd.org/connect.2 -/// [OpenBSD]: https://man.openbsd.org/connect.2 -/// [DragonFly BSD]: https://man.dragonflybsd.org/?command=connect§ion=2 -/// [illumos]: https://illumos.org/man/3SOCKET/connect -/// [glibc]: https://www.gnu.org/software/libc/manual/html_node/Connecting.html -/// [`Errno::AFNOSUPPORT`]: io::Errno::AFNOSUPPORT -/// [`Errno::INVAL`]: io::Errno::INVAL -#[inline] -#[doc(alias = "connect")] -pub fn connect_unspec(sockfd: Fd) -> io::Result<()> { - backend::net::syscalls::connect_unspec(sockfd.as_fd()) -} - /// `listen(fd, backlog)`—Enables listening for incoming connections. /// /// # References diff -Nru temporalio-1.3.0/vendor/rustix/src/net/sockopt.rs temporalio-1.3.0/vendor/rustix/src/net/sockopt.rs --- temporalio-1.3.0/vendor/rustix/src/net/sockopt.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/net/sockopt.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,190 +1,35 @@ //! `getsockopt` and `setsockopt` functions. //! -//! In the rustix API, there is a separate function for each option, so that it -//! can be given an option-specific type signature. -//! -//! # References for all `get_*` functions: -//! -//! - [POSIX `getsockopt`] -//! - [Linux `getsockopt`] -//! - [Winsock2 `getsockopt`] -//! - [Apple `getsockopt`] -//! - [FreeBSD `getsockopt`] -//! - [NetBSD `getsockopt`] -//! - [OpenBSD `getsockopt`] -//! - [DragonFly BSD `getsockopt`] -//! - [illumos `getsockopt`] -//! - [glibc `getsockopt`] -//! -//! [POSIX `getsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html -//! [Linux `getsockopt`]: https://man7.org/linux/man-pages/man2/getsockopt.2.html -//! [Winsock2 `getsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-getsockopt -//! [Apple `getsockopt`]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/getsockopt.2.html -//! [FreeBSD `getsockopt`]: https://man.freebsd.org/cgi/man.cgi?query=getsockopt&sektion=2 -//! [NetBSD `getsockopt`]: https://man.netbsd.org/getsockopt.2 -//! [OpenBSD `getsockopt`]: https://man.openbsd.org/getsockopt.2 -//! [DragonFly BSD `getsockopt`]: https://man.dragonflybsd.org/?command=getsockopt§ion=2 -//! [illumos `getsockopt`]: https://illumos.org/man/3SOCKET/getsockopt -//! [glibc `getsockopt`]: https://www.gnu.org/software/libc/manual/html_node/Socket-Option-Functions.html -//! -//! # References for all `set_*` functions: -//! -//! - [POSIX `setsockopt`] -//! - [Linux `setsockopt`] -//! - [Winsock2 `setsockopt`] -//! - [Apple `setsockopt`] -//! - [FreeBSD `setsockopt`] -//! - [NetBSD `setsockopt`] -//! - [OpenBSD `setsockopt`] -//! - [DragonFly BSD `setsockopt`] -//! - [illumos `setsockopt`] -//! - [glibc `setsockopt`] -//! -//! [POSIX `setsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html -//! [Linux `setsockopt`]: https://man7.org/linux/man-pages/man2/setsockopt.2.html -//! [Winsock2 `setsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-setsockopt -//! [Apple `setsockopt`]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/setsockopt.2.html -//! [FreeBSD `setsockopt`]: https://man.freebsd.org/cgi/man.cgi?query=setsockopt&sektion=2 -//! [NetBSD `setsockopt`]: https://man.netbsd.org/setsockopt.2 -//! [OpenBSD `setsockopt`]: https://man.openbsd.org/setsockopt.2 -//! [DragonFly BSD `setsockopt`]: https://man.dragonflybsd.org/?command=setsockopt§ion=2 -//! [illumos `setsockopt`]: https://illumos.org/man/3SOCKET/setsockopt -//! [glibc `setsockopt`]: https://www.gnu.org/software/libc/manual/html_node/Socket-Option-Functions.html -//! -//! # References for `get_socket_*` and `set_socket_*` functions: -//! -//! - [References for all `get_*` functions] -//! - [References for all `set_*` functions] -//! - [POSIX `sys/socket.h`] -//! - [Linux `socket`] -//! - [Winsock2 `SOL_SOCKET` options] -//! - [glibc `SOL_SOCKET` Options] -//! -//! [POSIX `sys/socket.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_socket.h.html -//! [Linux `socket`]: https://man7.org/linux/man-pages/man7/socket.7.html -//! [Winsock2 `SOL_SOCKET` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/sol-socket-socket-options -//! [glibc `SOL_SOCKET` options]: https://www.gnu.org/software/libc/manual/html_node/Socket_002dLevel-Options.html -//! -//! # References for `get_ip_*` and `set_ip_*` functions: -//! -//! - [References for all `get_*` functions] -//! - [References for all `set_*` functions] -//! - [POSIX `netinet/in.h`] -//! - [Linux `ip`] -//! - [Winsock2 `IPPROTO_IP` options] -//! - [Apple `ip`] -//! - [FreeBSD `ip`] -//! - [NetBSD `ip`] -//! - [OpenBSD `ip`] -//! - [DragonFly BSD `ip`] -//! - [illumos `ip`] -//! -//! [POSIX `netinet/in.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/netinet_in.h.html -//! [Linux `ip`]: https://man7.org/linux/man-pages/man7/ip.7.html -//! [Winsock2 `IPPROTO_IP` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-ip-socket-options -//! [Apple `ip`]: https://opensource.apple.com/source/xnu/xnu-7195.81.3/bsd/man/man4/ip.4.auto.html -//! [FreeBSD `ip`]: https://man.freebsd.org/cgi/man.cgi?query=ip&sektion=4 -//! [NetBSD `ip`]: https://man.netbsd.org/ip.4 -//! [OpenBSD `ip`]: https://man.openbsd.org/ip.4 -//! [DragonFly BSD `ip`]: https://man.dragonflybsd.org/?command=ip§ion=4 -//! [illumos `ip`]: https://illumos.org/man/4P/ip -//! -//! # References for `get_ipv6_*` and `set_ipv6_*` functions: -//! -//! - [References for all `get_*` functions] -//! - [References for all `set_*` functions] -//! - [POSIX `netinet/in.h`] -//! - [Linux `ipv6`] -//! - [Winsock2 `IPPROTO_IPV6` options] -//! - [Apple `ip6`] -//! - [FreeBSD `ip6`] -//! - [NetBSD `ip6`] -//! - [OpenBSD `ip6`] -//! - [DragonFly BSD `ip6`] -//! - [illumos `ip6`] -//! -//! [POSIX `netinet/in.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/netinet_in.h.html -//! [Linux `ipv6`]: https://man7.org/linux/man-pages/man7/ipv6.7.html -//! [Winsock2 `IPPROTO_IPV6` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-ipv6-socket-options -//! [Apple `ip6`]: https://opensource.apple.com/source/xnu/xnu-7195.81.3/bsd/man/man4/ip6.4.auto.html -//! [FreeBSD `ip6`]: https://man.freebsd.org/cgi/man.cgi?query=ip6&sektion=4 -//! [NetBSD `ip6`]: https://man.netbsd.org/ip6.4 -//! [OpenBSD `ip6`]: https://man.openbsd.org/ip6.4 -//! [DragonFly BSD `ip6`]: https://man.dragonflybsd.org/?command=ip6§ion=4 -//! [illumos `ip6`]: https://illumos.org/man/4P/ip6 -//! -//! # References for `get_tcp_*` and `set_tcp_*` functions: -//! -//! - [References for all `get_*` functions] -//! - [References for all `set_*` functions] -//! - [POSIX `netinet/tcp.h`] -//! - [Linux `tcp`] -//! - [Winsock2 `IPPROTO_TCP` options] -//! - [Apple `tcp`] -//! - [FreeBSD `tcp`] -//! - [NetBSD `tcp`] -//! - [OpenBSD `tcp`] -//! - [DragonFly BSD `tcp`] -//! - [illumos `tcp`] -//! -//! [POSIX `netinet/tcp.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/netinet_tcp.h.html -//! [Linux `tcp`]: https://man7.org/linux/man-pages/man7/tcp.7.html -//! [Winsock2 `IPPROTO_TCP` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-tcp-socket-options -//! [Apple `tcp`]: https://opensource.apple.com/source/xnu/xnu-7195.81.3/bsd/man/man4/tcp.4.auto.html -//! [FreeBSD `tcp`]: https://man.freebsd.org/cgi/man.cgi?query=tcp&sektion=4 -//! [NetBSD `tcp`]: https://man.netbsd.org/tcp.4 -//! [OpenBSD `tcp`]: https://man.openbsd.org/tcp.4 -//! [DragonFly BSD `tcp`]: https://man.dragonflybsd.org/?command=tcp§ion=4 -//! [illumos `tcp`]: https://illumos.org/man/4P/tcp -//! -//! [References for all `get_*` functions]: #references-for-all-get_-functions -//! [References for all `set_*` functions]: #references-for-all-set_-functions +//! In the rustix API, there is a separate function for each option, so that +//! it can be given an option-specific type signature. #![doc(alias = "getsockopt")] #![doc(alias = "setsockopt")] #[cfg(not(any( apple, + solarish, windows, - target_os = "aix", target_os = "dragonfly", target_os = "emscripten", target_os = "espidf", target_os = "haiku", target_os = "netbsd", target_os = "nto", - target_os = "vita", + target_os = "openbsd" )))] use crate::net::AddressFamily; -#[cfg(any( - linux_kernel, - target_os = "freebsd", - target_os = "fuchsia", - target_os = "openbsd", - target_os = "redox", - target_env = "newlib" -))] -use crate::net::Protocol; -#[cfg(any(linux_kernel, target_os = "fuchsia"))] -use crate::net::SocketAddrV4; -#[cfg(linux_kernel)] -use crate::net::SocketAddrV6; use crate::net::{Ipv4Addr, Ipv6Addr, SocketType}; use crate::{backend, io}; -#[cfg(feature = "alloc")] -#[cfg(any( - linux_like, - target_os = "freebsd", - target_os = "fuchsia", - target_os = "illumos" -))] -use alloc::string::String; use backend::c; use backend::fd::AsFd; use core::time::Duration; /// Timeout identifier for use with [`set_socket_timeout`] and /// [`get_socket_timeout`]. +/// +/// [`set_socket_timeout`]: crate::net::sockopt::set_socket_timeout. +/// [`get_socket_timeout`]: crate::net::sockopt::get_socket_timeout. #[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)] #[repr(u32)] pub enum Timeout { @@ -197,559 +42,1399 @@ /// `getsockopt(fd, SOL_SOCKET, SO_TYPE)`—Returns the type of a socket. /// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_socket_-and-set_socket_-functions +/// # References +/// - [POSIX `getsockopt`] +/// - [POSIX `sys/socket.h`] +/// - [Linux `getsockopt`] +/// - [Linux `socket`] +/// - [Winsock2 `getsockopt`] +/// - [Winsock2 `SOL_SOCKET` options] +/// - [Apple] +/// - [FreeBSD] +/// - [NetBSD] +/// - [OpenBSD] +/// - [DragonFly BSD] +/// - [illumos] +/// - [glibc `getsockopt`] +/// - [glibc `SOL_SOCKET` Options] +/// +/// [POSIX `getsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html +/// [POSIX `sys/socket.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_socket.h.html +/// [Linux `getsockopt`]: https://man7.org/linux/man-pages/man2/getsockopt.2.html +/// [Linux `socket`]: https://man7.org/linux/man-pages/man7/socket.7.html +/// [Winsock2 `getsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-getsockopt +/// [Winsock2 `SOL_SOCKET` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/sol-socket-socket-options +/// [Apple]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/getsockopt.2.html +/// [FreeBSD]: https://man.freebsd.org/cgi/man.cgi?query=getsockopt&sektion=2 +/// [NetBSD]: https://man.netbsd.org/getsockopt.2 +/// [OpenBSD]: https://man.openbsd.org/getsockopt.2 +/// [DragonFly BSD]: https://man.dragonflybsd.org/?command=getsockopt§ion=2 +/// [illumos]: https://illumos.org/man/3SOCKET/getsockopt +/// [glibc `getsockopt`]: https://www.gnu.org/software/libc/manual/html_node/Socket-Option-Functions.html +/// [glibc `SOL_SOCKET` options]: https://www.gnu.org/software/libc/manual/html_node/Socket_002dLevel-Options.html #[inline] #[doc(alias = "SO_TYPE")] pub fn get_socket_type(fd: Fd) -> io::Result { - backend::net::sockopt::get_socket_type(fd.as_fd()) + backend::net::syscalls::sockopt::get_socket_type(fd.as_fd()) } -/// `setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, value)`—Set whether local -/// addresses may be reused in `bind`. +/// `setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, value)` /// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_socket_-and-set_socket_-functions +/// # References +/// - [POSIX `setsockopt`] +/// - [POSIX `sys/socket.h`] +/// - [Linux `setsockopt`] +/// - [Linux `socket`] +/// - [Winsock2 `setsockopt`] +/// - [Winsock2 `SOL_SOCKET` options] +/// - [Apple] +/// - [FreeBSD] +/// - [NetBSD] +/// - [OpenBSD] +/// - [DragonFly BSD] +/// - [illumos] +/// - [glibc `setsockopt`] +/// - [glibc `SOL_SOCKET` Options] +/// +/// [POSIX `setsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html +/// [POSIX `sys/socket.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_socket.h.html +/// [Linux `setsockopt`]: https://man7.org/linux/man-pages/man2/setsockopt.2.html +/// [Linux `socket`]: https://man7.org/linux/man-pages/man7/socket.7.html +/// [Winsock2 `setsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-setsockopt +/// [Winsock2 `SOL_SOCKET` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/sol-socket-socket-options +/// [Apple]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/setsockopt.2.html +/// [FreeBSD]: https://man.freebsd.org/cgi/man.cgi?query=setsockopt&sektion=2 +/// [NetBSD]: https://man.netbsd.org/setsockopt.2 +/// [OpenBSD]: https://man.openbsd.org/setsockopt.2 +/// [DragonFly BSD]: https://man.dragonflybsd.org/?command=setsockopt§ion=2 +/// [illumos]: https://illumos.org/man/3SOCKET/setsockopt +/// [glibc `setsockopt`]: https://www.gnu.org/software/libc/manual/html_node/Socket-Option-Functions.html +/// [glibc `SOL_SOCKET` options]: https://www.gnu.org/software/libc/manual/html_node/Socket_002dLevel-Options.html #[inline] #[doc(alias = "SO_REUSEADDR")] pub fn set_socket_reuseaddr(fd: Fd, value: bool) -> io::Result<()> { - backend::net::sockopt::set_socket_reuseaddr(fd.as_fd(), value) + backend::net::syscalls::sockopt::set_socket_reuseaddr(fd.as_fd(), value) } -/// `getsockopt(fd, SOL_SOCKET, SO_REUSEADDR)` +/// `setsockopt(fd, SOL_SOCKET, SO_BROADCAST, broadcast)` /// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_socket_-and-set_socket_-functions -#[inline] -#[doc(alias = "SO_REUSEADDR")] -pub fn get_socket_reuseaddr(fd: Fd) -> io::Result { - backend::net::sockopt::get_socket_reuseaddr(fd.as_fd()) -} - -/// `setsockopt(fd, SOL_SOCKET, SO_BROADCAST, value)` -/// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_socket_-and-set_socket_-functions +/// # References +/// - [POSIX `setsockopt`] +/// - [POSIX `sys/socket.h`] +/// - [Linux `setsockopt`] +/// - [Linux `socket`] +/// - [Winsock2 `setsockopt`] +/// - [Winsock2 `SOL_SOCKET` options] +/// - [Apple] +/// - [FreeBSD] +/// - [NetBSD] +/// - [OpenBSD] +/// - [DragonFly BSD] +/// - [illumos] +/// - [glibc `setsockopt`] +/// - [glibc `SOL_SOCKET` Options] +/// +/// [POSIX `setsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html +/// [POSIX `sys/socket.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_socket.h.html +/// [Linux `setsockopt`]: https://man7.org/linux/man-pages/man2/setsockopt.2.html +/// [Linux `socket`]: https://man7.org/linux/man-pages/man7/socket.7.html +/// [Winsock2 `setsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-setsockopt +/// [Winsock2 `SOL_SOCKET` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/sol-socket-socket-options +/// [Apple]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/setsockopt.2.html +/// [FreeBSD]: https://man.freebsd.org/cgi/man.cgi?query=setsockopt&sektion=2 +/// [NetBSD]: https://man.netbsd.org/setsockopt.2 +/// [OpenBSD]: https://man.openbsd.org/setsockopt.2 +/// [DragonFly BSD]: https://man.dragonflybsd.org/?command=setsockopt§ion=2 +/// [illumos]: https://illumos.org/man/3SOCKET/setsockopt +/// [glibc `setsockopt`]: https://www.gnu.org/software/libc/manual/html_node/Socket-Option-Functions.html +/// [glibc `SOL_SOCKET` options]: https://www.gnu.org/software/libc/manual/html_node/Socket_002dLevel-Options.html #[inline] #[doc(alias = "SO_BROADCAST")] -pub fn set_socket_broadcast(fd: Fd, value: bool) -> io::Result<()> { - backend::net::sockopt::set_socket_broadcast(fd.as_fd(), value) +pub fn set_socket_broadcast(fd: Fd, broadcast: bool) -> io::Result<()> { + backend::net::syscalls::sockopt::set_socket_broadcast(fd.as_fd(), broadcast) } /// `getsockopt(fd, SOL_SOCKET, SO_BROADCAST)` /// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_socket_-and-set_socket_-functions +/// # References +/// - [POSIX `getsockopt`] +/// - [POSIX `sys/socket.h`] +/// - [Linux `getsockopt`] +/// - [Linux `socket`] +/// - [Winsock2 `getsockopt`] +/// - [Winsock2 `SOL_SOCKET` options] +/// - [Apple] +/// - [FreeBSD] +/// - [NetBSD] +/// - [OpenBSD] +/// - [DragonFly BSD] +/// - [illumos] +/// - [glibc `getsockopt`] +/// - [glibc `SOL_SOCKET` Options] +/// +/// [POSIX `getsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html +/// [POSIX `sys/socket.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_socket.h.html +/// [Linux `getsockopt`]: https://man7.org/linux/man-pages/man2/getsockopt.2.html +/// [Linux `socket`]: https://man7.org/linux/man-pages/man7/socket.7.html +/// [Winsock2 `getsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-getsockopt +/// [Winsock2 `SOL_SOCKET` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/sol-socket-socket-options +/// [Apple]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/getsockopt.2.html +/// [FreeBSD]: https://man.freebsd.org/cgi/man.cgi?query=getsockopt&sektion=2 +/// [NetBSD]: https://man.netbsd.org/getsockopt.2 +/// [OpenBSD]: https://man.openbsd.org/getsockopt.2 +/// [DragonFly BSD]: https://man.dragonflybsd.org/?command=getsockopt§ion=2 +/// [illumos]: https://illumos.org/man/3SOCKET/getsockopt +/// [glibc `getsockopt`]: https://www.gnu.org/software/libc/manual/html_node/Socket-Option-Functions.html +/// [glibc `SOL_SOCKET` options]: https://www.gnu.org/software/libc/manual/html_node/Socket_002dLevel-Options.html #[inline] #[doc(alias = "SO_BROADCAST")] pub fn get_socket_broadcast(fd: Fd) -> io::Result { - backend::net::sockopt::get_socket_broadcast(fd.as_fd()) + backend::net::syscalls::sockopt::get_socket_broadcast(fd.as_fd()) } -/// `setsockopt(fd, SOL_SOCKET, SO_LINGER, value)` -/// -/// See the [module-level documentation] for more. +/// `setsockopt(fd, SOL_SOCKET, SO_LINGER, linger)` /// -/// [module-level documentation]: self#references-for-get_socket_-and-set_socket_-functions +/// # References +/// - [POSIX `setsockopt`] +/// - [POSIX `sys/socket.h`] +/// - [Linux `setsockopt`] +/// - [Linux `socket`] +/// - [Winsock2 `setsockopt`] +/// - [Winsock2 `SOL_SOCKET` options] +/// - [Apple] +/// - [FreeBSD] +/// - [NetBSD] +/// - [OpenBSD] +/// - [DragonFly BSD] +/// - [illumos] +/// - [glibc `setsockopt`] +/// - [glibc `SOL_SOCKET` Options] +/// +/// [POSIX `setsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html +/// [POSIX `sys/socket.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_socket.h.html +/// [Linux `setsockopt`]: https://man7.org/linux/man-pages/man2/setsockopt.2.html +/// [Linux `socket`]: https://man7.org/linux/man-pages/man7/socket.7.html +/// [Winsock2 `setsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-setsockopt +/// [Winsock2 `SOL_SOCKET` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/sol-socket-socket-options +/// [Apple]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/setsockopt.2.html +/// [FreeBSD]: https://man.freebsd.org/cgi/man.cgi?query=setsockopt&sektion=2 +/// [NetBSD]: https://man.netbsd.org/setsockopt.2 +/// [OpenBSD]: https://man.openbsd.org/setsockopt.2 +/// [DragonFly BSD]: https://man.dragonflybsd.org/?command=setsockopt§ion=2 +/// [illumos]: https://illumos.org/man/3SOCKET/setsockopt +/// [glibc `setsockopt`]: https://www.gnu.org/software/libc/manual/html_node/Socket-Option-Functions.html +/// [glibc `SOL_SOCKET` options]: https://www.gnu.org/software/libc/manual/html_node/Socket_002dLevel-Options.html #[inline] #[doc(alias = "SO_LINGER")] -pub fn set_socket_linger(fd: Fd, value: Option) -> io::Result<()> { - backend::net::sockopt::set_socket_linger(fd.as_fd(), value) +pub fn set_socket_linger(fd: Fd, linger: Option) -> io::Result<()> { + backend::net::syscalls::sockopt::set_socket_linger(fd.as_fd(), linger) } /// `getsockopt(fd, SOL_SOCKET, SO_LINGER)` /// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_socket_-and-set_socket_-functions +/// # References +/// - [POSIX `getsockopt`] +/// - [POSIX `sys/socket.h`] +/// - [Linux `getsockopt`] +/// - [Linux `socket`] +/// - [Winsock2 `getsockopt`] +/// - [Winsock2 `SOL_SOCKET` options] +/// - [Apple] +/// - [FreeBSD] +/// - [NetBSD] +/// - [OpenBSD] +/// - [DragonFly BSD] +/// - [illumos] +/// - [glibc `getsockopt`] +/// - [glibc `SOL_SOCKET` Options] +/// +/// [POSIX `getsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html +/// [POSIX `sys/socket.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_socket.h.html +/// [Linux `getsockopt`]: https://man7.org/linux/man-pages/man2/getsockopt.2.html +/// [Linux `socket`]: https://man7.org/linux/man-pages/man7/socket.7.html +/// [Winsock2 `getsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-getsockopt +/// [Winsock2 `SOL_SOCKET` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/sol-socket-socket-options +/// [Apple]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/getsockopt.2.html +/// [FreeBSD]: https://man.freebsd.org/cgi/man.cgi?query=getsockopt&sektion=2 +/// [NetBSD]: https://man.netbsd.org/getsockopt.2 +/// [OpenBSD]: https://man.openbsd.org/getsockopt.2 +/// [DragonFly BSD]: https://man.dragonflybsd.org/?command=getsockopt§ion=2 +/// [illumos]: https://illumos.org/man/3SOCKET/getsockopt +/// [glibc `getsockopt`]: https://www.gnu.org/software/libc/manual/html_node/Socket-Option-Functions.html +/// [glibc `SOL_SOCKET` options]: https://www.gnu.org/software/libc/manual/html_node/Socket_002dLevel-Options.html #[inline] #[doc(alias = "SO_LINGER")] pub fn get_socket_linger(fd: Fd) -> io::Result> { - backend::net::sockopt::get_socket_linger(fd.as_fd()) + backend::net::syscalls::sockopt::get_socket_linger(fd.as_fd()) } -/// `setsockopt(fd, SOL_SOCKET, SO_PASSCRED, value)` +/// `setsockopt(fd, SOL_SOCKET, SO_PASSCRED, passcred)` /// -/// See the [module-level documentation] for more. +/// # References +/// - [Linux `setsockopt`] +/// - [Linux `socket`] /// -/// [module-level documentation]: self#references-for-get_socket_-and-set_socket_-functions +/// [Linux `setsockopt`]: https://man7.org/linux/man-pages/man2/setsockopt.2.html +/// [Linux `socket`]: https://man7.org/linux/man-pages/man7/socket.7.html #[cfg(linux_kernel)] #[inline] #[doc(alias = "SO_PASSCRED")] -pub fn set_socket_passcred(fd: Fd, value: bool) -> io::Result<()> { - backend::net::sockopt::set_socket_passcred(fd.as_fd(), value) +pub fn set_socket_passcred(fd: Fd, passcred: bool) -> io::Result<()> { + backend::net::syscalls::sockopt::set_socket_passcred(fd.as_fd(), passcred) } /// `getsockopt(fd, SOL_SOCKET, SO_PASSCRED)` /// -/// See the [module-level documentation] for more. +/// # References +/// - [Linux `getsockopt`] +/// - [Linux `socket`] /// -/// [module-level documentation]: self#references-for-get_socket_-and-set_socket_-functions +/// [Linux `getsockopt`]: https://man7.org/linux/man-pages/man2/getsockopt.2.html +/// [Linux `socket`]: https://man7.org/linux/man-pages/man7/socket.7.html #[cfg(linux_kernel)] #[inline] #[doc(alias = "SO_PASSCRED")] pub fn get_socket_passcred(fd: Fd) -> io::Result { - backend::net::sockopt::get_socket_passcred(fd.as_fd()) + backend::net::syscalls::sockopt::get_socket_passcred(fd.as_fd()) } -/// `setsockopt(fd, SOL_SOCKET, id, value)`—Set the sending or receiving +/// `setsockopt(fd, SOL_SOCKET, id, timeout)`—Set the sending or receiving /// timeout. /// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_socket_-and-set_socket_-functions +/// # References +/// - [POSIX `setsockopt`] +/// - [POSIX `sys/socket.h`] +/// - [Linux `setsockopt`] +/// - [Linux `socket`] +/// - [Winsock2 `setsockopt`] +/// - [Winsock2 `SOL_SOCKET` options] +/// - [Apple] +/// - [FreeBSD] +/// - [NetBSD] +/// - [OpenBSD] +/// - [DragonFly BSD] +/// - [illumos] +/// - [glibc `setsockopt`] +/// - [glibc `SOL_SOCKET` Options] +/// +/// [POSIX `setsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html +/// [POSIX `sys/socket.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_socket.h.html +/// [Linux `setsockopt`]: https://man7.org/linux/man-pages/man2/setsockopt.2.html +/// [Linux `socket`]: https://man7.org/linux/man-pages/man7/socket.7.html +/// [Winsock2 `setsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-setsockopt +/// [Winsock2 `SOL_SOCKET` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/sol-socket-socket-options +/// [Apple]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/setsockopt.2.html +/// [FreeBSD]: https://man.freebsd.org/cgi/man.cgi?query=setsockopt&sektion=2 +/// [NetBSD]: https://man.netbsd.org/setsockopt.2 +/// [OpenBSD]: https://man.openbsd.org/setsockopt.2 +/// [DragonFly BSD]: https://man.dragonflybsd.org/?command=setsockopt§ion=2 +/// [illumos]: https://illumos.org/man/3SOCKET/setsockopt +/// [glibc `setsockopt`]: https://www.gnu.org/software/libc/manual/html_node/Socket-Option-Functions.html +/// [glibc `SOL_SOCKET` options]: https://www.gnu.org/software/libc/manual/html_node/Socket_002dLevel-Options.html #[inline] #[doc(alias = "SO_RCVTIMEO")] #[doc(alias = "SO_SNDTIMEO")] pub fn set_socket_timeout( fd: Fd, id: Timeout, - value: Option, + timeout: Option, ) -> io::Result<()> { - backend::net::sockopt::set_socket_timeout(fd.as_fd(), id, value) + backend::net::syscalls::sockopt::set_socket_timeout(fd.as_fd(), id, timeout) } /// `getsockopt(fd, SOL_SOCKET, id)`—Get the sending or receiving timeout. /// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_socket_-and-set_socket_-functions +/// # References +/// - [POSIX `getsockopt`] +/// - [POSIX `sys/socket.h`] +/// - [Linux `getsockopt`] +/// - [Linux `socket`] +/// - [Winsock2 `getsockopt`] +/// - [Winsock2 `SOL_SOCKET` options] +/// - [Apple] +/// - [FreeBSD] +/// - [NetBSD] +/// - [OpenBSD] +/// - [DragonFly BSD] +/// - [illumos] +/// - [glibc `getsockopt`] +/// - [glibc `SOL_SOCKET` Options] +/// +/// [POSIX `getsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html +/// [POSIX `sys/socket.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_socket.h.html +/// [Linux `getsockopt`]: https://man7.org/linux/man-pages/man2/getsockopt.2.html +/// [Linux `socket`]: https://man7.org/linux/man-pages/man7/socket.7.html +/// [Winsock2 `getsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-getsockopt +/// [Winsock2 `SOL_SOCKET` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/sol-socket-socket-options +/// [Apple]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/getsockopt.2.html +/// [FreeBSD]: https://man.freebsd.org/cgi/man.cgi?query=getsockopt&sektion=2 +/// [NetBSD]: https://man.netbsd.org/getsockopt.2 +/// [OpenBSD]: https://man.openbsd.org/getsockopt.2 +/// [DragonFly BSD]: https://man.dragonflybsd.org/?command=getsockopt§ion=2 +/// [illumos]: https://illumos.org/man/3SOCKET/getsockopt +/// [glibc `getsockopt`]: https://www.gnu.org/software/libc/manual/html_node/Socket-Option-Functions.html +/// [glibc `SOL_SOCKET` options]: https://www.gnu.org/software/libc/manual/html_node/Socket_002dLevel-Options.html #[inline] #[doc(alias = "SO_RCVTIMEO")] #[doc(alias = "SO_SNDTIMEO")] pub fn get_socket_timeout(fd: Fd, id: Timeout) -> io::Result> { - backend::net::sockopt::get_socket_timeout(fd.as_fd(), id) + backend::net::syscalls::sockopt::get_socket_timeout(fd.as_fd(), id) } /// `getsockopt(fd, SOL_SOCKET, SO_ERROR)` /// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_socket_-and-set_socket_-functions +/// # References +/// - [POSIX `getsockopt`] +/// - [POSIX `sys/socket.h`] +/// - [Linux `getsockopt`] +/// - [Linux `socket`] +/// - [Winsock2 `getsockopt`] +/// - [Winsock2 `SOL_SOCKET` options] +/// - [Apple] +/// - [FreeBSD] +/// - [NetBSD] +/// - [OpenBSD] +/// - [DragonFly BSD] +/// - [illumos] +/// - [glibc `getsockopt`] +/// - [glibc `SOL_SOCKET` Options] +/// +/// [POSIX `getsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html +/// [POSIX `sys/socket.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_socket.h.html +/// [Linux `getsockopt`]: https://man7.org/linux/man-pages/man2/getsockopt.2.html +/// [Linux `socket`]: https://man7.org/linux/man-pages/man7/socket.7.html +/// [Winsock2 `getsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-getsockopt +/// [Winsock2 `SOL_SOCKET` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/sol-socket-socket-options +/// [Apple]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/getsockopt.2.html +/// [FreeBSD]: https://man.freebsd.org/cgi/man.cgi?query=getsockopt&sektion=2 +/// [NetBSD]: https://man.netbsd.org/getsockopt.2 +/// [OpenBSD]: https://man.openbsd.org/getsockopt.2 +/// [DragonFly BSD]: https://man.dragonflybsd.org/?command=getsockopt§ion=2 +/// [illumos]: https://illumos.org/man/3SOCKET/getsockopt +/// [glibc `getsockopt`]: https://www.gnu.org/software/libc/manual/html_node/Socket-Option-Functions.html +/// [glibc `SOL_SOCKET` options]: https://www.gnu.org/software/libc/manual/html_node/Socket_002dLevel-Options.html #[inline] #[doc(alias = "SO_ERROR")] pub fn get_socket_error(fd: Fd) -> io::Result> { - backend::net::sockopt::get_socket_error(fd.as_fd()) + backend::net::syscalls::sockopt::get_socket_error(fd.as_fd()) } /// `getsockopt(fd, SOL_SOCKET, SO_NOSIGPIPE)` /// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_socket_-and-set_socket_-functions -#[cfg(any(apple, freebsdlike, target_os = "netbsd"))] +/// # References +/// - [POSIX `getsockopt`] +/// - [POSIX `sys/socket.h`] +/// - [Linux `getsockopt`] +/// - [Linux `socket`] +/// - [Winsock2 `getsockopt`] +/// - [Winsock2 `SOL_SOCKET` options] +/// - [Apple] +/// - [FreeBSD] +/// - [NetBSD] +/// - [OpenBSD] +/// - [DragonFly BSD] +/// - [illumos] +/// - [glibc `getsockopt`] +/// - [glibc `SOL_SOCKET` Options] +/// +/// [POSIX `getsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html +/// [POSIX `sys/socket.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_socket.h.html +/// [Linux `getsockopt`]: https://man7.org/linux/man-pages/man2/getsockopt.2.html +/// [Linux `socket`]: https://man7.org/linux/man-pages/man7/socket.7.html +/// [Winsock2 `getsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-getsockopt +/// [Winsock2 `SOL_SOCKET` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/sol-socket-socket-options +/// [Apple]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/getsockopt.2.html +/// [FreeBSD]: https://man.freebsd.org/cgi/man.cgi?query=getsockopt&sektion=2 +/// [NetBSD]: https://man.netbsd.org/getsockopt.2 +/// [OpenBSD]: https://man.openbsd.org/getsockopt.2 +/// [DragonFly BSD]: https://man.dragonflybsd.org/?command=getsockopt§ion=2 +/// [illumos]: https://illumos.org/man/3SOCKET/getsockopt +/// [glibc `getsockopt`]: https://www.gnu.org/software/libc/manual/html_node/Socket-Option-Functions.html +/// [glibc `SOL_SOCKET` options]: https://www.gnu.org/software/libc/manual/html_node/Socket_002dLevel-Options.html +#[cfg(any(apple, target_os = "freebsd"))] #[doc(alias = "SO_NOSIGPIPE")] #[inline] pub fn get_socket_nosigpipe(fd: Fd) -> io::Result { - backend::net::sockopt::get_socket_nosigpipe(fd.as_fd()) + backend::net::syscalls::sockopt::get_socket_nosigpipe(fd.as_fd()) } -/// `setsockopt(fd, SOL_SOCKET, SO_NOSIGPIPE, value)` -/// -/// See the [module-level documentation] for more. +/// `setsockopt(fd, SOL_SOCKET, SO_NOSIGPIPE, val)` /// -/// [module-level documentation]: self#references-for-get_socket_-and-set_socket_-functions -#[cfg(any(apple, freebsdlike, target_os = "netbsd"))] +/// # References +/// - [POSIX `setsockopt`] +/// - [POSIX `sys/socket.h`] +/// - [Linux `setsockopt`] +/// - [Linux `socket`] +/// - [Winsock2 `setsockopt`] +/// - [Winsock2 `SOL_SOCKET` options] +/// - [Apple] +/// - [FreeBSD] +/// - [NetBSD] +/// - [OpenBSD] +/// - [DragonFly BSD] +/// - [illumos] +/// - [glibc `setsockopt`] +/// - [glibc `SOL_SOCKET` Options] +/// +/// [POSIX `setsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html +/// [POSIX `sys/socket.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_socket.h.html +/// [Linux `setsockopt`]: https://man7.org/linux/man-pages/man2/setsockopt.2.html +/// [Linux `socket`]: https://man7.org/linux/man-pages/man7/socket.7.html +/// [Winsock2 `setsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-setsockopt +/// [Winsock2 `SOL_SOCKET` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/sol-socket-socket-options +/// [Apple]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/setsockopt.2.html +/// [FreeBSD]: https://man.freebsd.org/cgi/man.cgi?query=setsockopt&sektion=2 +/// [NetBSD]: https://man.netbsd.org/setsockopt.2 +/// [OpenBSD]: https://man.openbsd.org/setsockopt.2 +/// [DragonFly BSD]: https://man.dragonflybsd.org/?command=setsockopt§ion=2 +/// [illumos]: https://illumos.org/man/3SOCKET/setsockopt +/// [glibc `setsockopt`]: https://www.gnu.org/software/libc/manual/html_node/Socket-Option-Functions.html +/// [glibc `SOL_SOCKET` options]: https://www.gnu.org/software/libc/manual/html_node/Socket_002dLevel-Options.html +#[cfg(any(apple, target_os = "freebsd"))] #[doc(alias = "SO_NOSIGPIPE")] #[inline] -pub fn set_socket_nosigpipe(fd: Fd, value: bool) -> io::Result<()> { - backend::net::sockopt::set_socket_nosigpipe(fd.as_fd(), value) +pub fn set_socket_nosigpipe(fd: Fd, val: bool) -> io::Result<()> { + backend::net::syscalls::sockopt::set_socket_nosigpipe(fd.as_fd(), val) } -/// `setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, value)` -/// -/// See the [module-level documentation] for more. +/// `setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, keepalive)` /// -/// [module-level documentation]: self#references-for-get_socket_-and-set_socket_-functions +/// # References +/// - [POSIX `setsockopt`] +/// - [POSIX `sys/socket.h`] +/// - [Linux `setsockopt`] +/// - [Linux `socket`] +/// - [Winsock2 `setsockopt`] +/// - [Winsock2 `SOL_SOCKET` options] +/// - [Apple] +/// - [FreeBSD] +/// - [NetBSD] +/// - [OpenBSD] +/// - [DragonFly BSD] +/// - [illumos] +/// - [glibc `setsockopt`] +/// - [glibc `SOL_SOCKET` Options] +/// +/// [POSIX `setsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html +/// [POSIX `sys/socket.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_socket.h.html +/// [Linux `setsockopt`]: https://man7.org/linux/man-pages/man2/setsockopt.2.html +/// [Linux `socket`]: https://man7.org/linux/man-pages/man7/socket.7.html +/// [Winsock2 `setsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-setsockopt +/// [Winsock2 `SOL_SOCKET` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/sol-socket-socket-options +/// [Apple]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/setsockopt.2.html +/// [FreeBSD]: https://man.freebsd.org/cgi/man.cgi?query=setsockopt&sektion=2 +/// [NetBSD]: https://man.netbsd.org/setsockopt.2 +/// [OpenBSD]: https://man.openbsd.org/setsockopt.2 +/// [DragonFly BSD]: https://man.dragonflybsd.org/?command=setsockopt§ion=2 +/// [illumos]: https://illumos.org/man/3SOCKET/setsockopt +/// [glibc `setsockopt`]: https://www.gnu.org/software/libc/manual/html_node/Socket-Option-Functions.html +/// [glibc `SOL_SOCKET` options]: https://www.gnu.org/software/libc/manual/html_node/Socket_002dLevel-Options.html #[inline] #[doc(alias = "SO_KEEPALIVE")] -pub fn set_socket_keepalive(fd: Fd, value: bool) -> io::Result<()> { - backend::net::sockopt::set_socket_keepalive(fd.as_fd(), value) +pub fn set_socket_keepalive(fd: Fd, keepalive: bool) -> io::Result<()> { + backend::net::syscalls::sockopt::set_socket_keepalive(fd.as_fd(), keepalive) } /// `getsockopt(fd, SOL_SOCKET, SO_KEEPALIVE)` /// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_socket_-and-set_socket_-functions +/// # References +/// - [POSIX `getsockopt`] +/// - [POSIX `sys/socket.h`] +/// - [Linux `getsockopt`] +/// - [Linux `socket`] +/// - [Winsock2 `getsockopt`] +/// - [Winsock2 `SOL_SOCKET` options] +/// - [Apple] +/// - [FreeBSD] +/// - [NetBSD] +/// - [OpenBSD] +/// - [DragonFly BSD] +/// - [illumos] +/// - [glibc `getsockopt`] +/// - [glibc `SOL_SOCKET` Options] +/// +/// [POSIX `getsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html +/// [POSIX `sys/socket.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_socket.h.html +/// [Linux `getsockopt`]: https://man7.org/linux/man-pages/man2/getsockopt.2.html +/// [Linux `socket`]: https://man7.org/linux/man-pages/man7/socket.7.html +/// [Winsock2 `getsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-getsockopt +/// [Winsock2 `SOL_SOCKET` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/sol-socket-socket-options +/// [Apple]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/getsockopt.2.html +/// [FreeBSD]: https://man.freebsd.org/cgi/man.cgi?query=getsockopt&sektion=2 +/// [NetBSD]: https://man.netbsd.org/getsockopt.2 +/// [OpenBSD]: https://man.openbsd.org/getsockopt.2 +/// [DragonFly BSD]: https://man.dragonflybsd.org/?command=getsockopt§ion=2 +/// [illumos]: https://illumos.org/man/3SOCKET/getsockopt +/// [glibc `getsockopt`]: https://www.gnu.org/software/libc/manual/html_node/Socket-Option-Functions.html +/// [glibc `SOL_SOCKET` options]: https://www.gnu.org/software/libc/manual/html_node/Socket_002dLevel-Options.html #[inline] #[doc(alias = "SO_KEEPALIVE")] pub fn get_socket_keepalive(fd: Fd) -> io::Result { - backend::net::sockopt::get_socket_keepalive(fd.as_fd()) + backend::net::syscalls::sockopt::get_socket_keepalive(fd.as_fd()) } -/// `setsockopt(fd, SOL_SOCKET, SO_RCVBUF, value)` +/// `setsockopt(fd, SOL_SOCKET, SO_RCVBUF, size)` /// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_socket_-and-set_socket_-functions +/// # References +/// - [POSIX `setsockopt`] +/// - [POSIX `sys/socket.h`] +/// - [Linux `setsockopt`] +/// - [Linux `socket`] +/// - [Winsock2 `setsockopt`] +/// - [Winsock2 `SOL_SOCKET` options] +/// - [Apple] +/// - [FreeBSD] +/// - [NetBSD] +/// - [OpenBSD] +/// - [DragonFly BSD] +/// - [illumos] +/// - [glibc `setsockopt`] +/// - [glibc `SOL_SOCKET` Options] +/// +/// [POSIX `setsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html +/// [POSIX `sys/socket.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_socket.h.html +/// [Linux `setsockopt`]: https://man7.org/linux/man-pages/man2/setsockopt.2.html +/// [Linux `socket`]: https://man7.org/linux/man-pages/man7/socket.7.html +/// [Winsock2 `setsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-setsockopt +/// [Winsock2 `SOL_SOCKET` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/sol-socket-socket-options +/// [Apple]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/setsockopt.2.html +/// [FreeBSD]: https://man.freebsd.org/cgi/man.cgi?query=setsockopt&sektion=2 +/// [NetBSD]: https://man.netbsd.org/setsockopt.2 +/// [OpenBSD]: https://man.openbsd.org/setsockopt.2 +/// [DragonFly BSD]: https://man.dragonflybsd.org/?command=setsockopt§ion=2 +/// [illumos]: https://illumos.org/man/3SOCKET/setsockopt +/// [glibc `setsockopt`]: https://www.gnu.org/software/libc/manual/html_node/Socket-Option-Functions.html +/// [glibc `SOL_SOCKET` options]: https://www.gnu.org/software/libc/manual/html_node/Socket_002dLevel-Options.html #[inline] #[doc(alias = "SO_RCVBUF")] -pub fn set_socket_recv_buffer_size(fd: Fd, value: usize) -> io::Result<()> { - backend::net::sockopt::set_socket_recv_buffer_size(fd.as_fd(), value) +pub fn set_socket_recv_buffer_size(fd: Fd, size: usize) -> io::Result<()> { + backend::net::syscalls::sockopt::set_socket_recv_buffer_size(fd.as_fd(), size) } /// `getsockopt(fd, SOL_SOCKET, SO_RCVBUF)` /// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_socket_-and-set_socket_-functions +/// # References +/// - [POSIX `getsockopt`] +/// - [POSIX `sys/socket.h`] +/// - [Linux `getsockopt`] +/// - [Linux `socket`] +/// - [Winsock2 `getsockopt`] +/// - [Winsock2 `SOL_SOCKET` options] +/// - [Apple] +/// - [FreeBSD] +/// - [NetBSD] +/// - [OpenBSD] +/// - [DragonFly BSD] +/// - [illumos] +/// - [glibc `getsockopt`] +/// - [glibc `SOL_SOCKET` Options] +/// +/// [POSIX `getsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html +/// [POSIX `sys/socket.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_socket.h.html +/// [Linux `getsockopt`]: https://man7.org/linux/man-pages/man2/getsockopt.2.html +/// [Linux `socket`]: https://man7.org/linux/man-pages/man7/socket.7.html +/// [Winsock2 `getsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-getsockopt +/// [Winsock2 `SOL_SOCKET` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/sol-socket-socket-options +/// [Apple]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/getsockopt.2.html +/// [FreeBSD]: https://man.freebsd.org/cgi/man.cgi?query=getsockopt&sektion=2 +/// [NetBSD]: https://man.netbsd.org/getsockopt.2 +/// [OpenBSD]: https://man.openbsd.org/getsockopt.2 +/// [DragonFly BSD]: https://man.dragonflybsd.org/?command=getsockopt§ion=2 +/// [illumos]: https://illumos.org/man/3SOCKET/getsockopt +/// [glibc `getsockopt`]: https://www.gnu.org/software/libc/manual/html_node/Socket-Option-Functions.html +/// [glibc `SOL_SOCKET` options]: https://www.gnu.org/software/libc/manual/html_node/Socket_002dLevel-Options.html #[inline] #[doc(alias = "SO_RCVBUF")] pub fn get_socket_recv_buffer_size(fd: Fd) -> io::Result { - backend::net::sockopt::get_socket_recv_buffer_size(fd.as_fd()) + backend::net::syscalls::sockopt::get_socket_recv_buffer_size(fd.as_fd()) } -/// `setsockopt(fd, SOL_SOCKET, SO_SNDBUF, value)` -/// -/// See the [module-level documentation] for more. +/// `setsockopt(fd, SOL_SOCKET, SO_SNDBUF, size)` /// -/// [module-level documentation]: self#references-for-get_socket_-and-set_socket_-functions +/// # References +/// - [POSIX `setsockopt`] +/// - [POSIX `sys/socket.h`] +/// - [Linux `setsockopt`] +/// - [Linux `socket`] +/// - [Winsock2 `setsockopt`] +/// - [Winsock2 `SOL_SOCKET` options] +/// - [Apple] +/// - [FreeBSD] +/// - [NetBSD] +/// - [OpenBSD] +/// - [DragonFly BSD] +/// - [illumos] +/// - [glibc `setsockopt`] +/// - [glibc `SOL_SOCKET` Options] +/// +/// [POSIX `setsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html +/// [POSIX `sys/socket.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_socket.h.html +/// [Linux `setsockopt`]: https://man7.org/linux/man-pages/man2/setsockopt.2.html +/// [Linux `socket`]: https://man7.org/linux/man-pages/man7/socket.7.html +/// [Winsock2 `setsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-setsockopt +/// [Winsock2 `SOL_SOCKET` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/sol-socket-socket-options +/// [Apple]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/setsockopt.2.html +/// [FreeBSD]: https://man.freebsd.org/cgi/man.cgi?query=setsockopt&sektion=2 +/// [NetBSD]: https://man.netbsd.org/setsockopt.2 +/// [OpenBSD]: https://man.openbsd.org/setsockopt.2 +/// [DragonFly BSD]: https://man.dragonflybsd.org/?command=setsockopt§ion=2 +/// [illumos]: https://illumos.org/man/3SOCKET/setsockopt +/// [glibc `setsockopt`]: https://www.gnu.org/software/libc/manual/html_node/Socket-Option-Functions.html +/// [glibc `SOL_SOCKET` options]: https://www.gnu.org/software/libc/manual/html_node/Socket_002dLevel-Options.html #[inline] #[doc(alias = "SO_SNDBUF")] -pub fn set_socket_send_buffer_size(fd: Fd, value: usize) -> io::Result<()> { - backend::net::sockopt::set_socket_send_buffer_size(fd.as_fd(), value) +pub fn set_socket_send_buffer_size(fd: Fd, size: usize) -> io::Result<()> { + backend::net::syscalls::sockopt::set_socket_send_buffer_size(fd.as_fd(), size) } /// `getsockopt(fd, SOL_SOCKET, SO_SNDBUF)` /// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_socket_-and-set_socket_-functions +/// # References +/// - [POSIX `getsockopt`] +/// - [POSIX `sys/socket.h`] +/// - [Linux `getsockopt`] +/// - [Linux `socket`] +/// - [Winsock2 `getsockopt`] +/// - [Winsock2 `SOL_SOCKET` options] +/// - [Apple] +/// - [FreeBSD] +/// - [NetBSD] +/// - [OpenBSD] +/// - [DragonFly BSD] +/// - [illumos] +/// - [glibc `getsockopt`] +/// - [glibc `SOL_SOCKET` Options] +/// +/// [POSIX `getsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html +/// [POSIX `sys/socket.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_socket.h.html +/// [Linux `getsockopt`]: https://man7.org/linux/man-pages/man2/getsockopt.2.html +/// [Linux `socket`]: https://man7.org/linux/man-pages/man7/socket.7.html +/// [Winsock2 `getsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-getsockopt +/// [Winsock2 `SOL_SOCKET` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/sol-socket-socket-options +/// [Apple]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/getsockopt.2.html +/// [FreeBSD]: https://man.freebsd.org/cgi/man.cgi?query=getsockopt&sektion=2 +/// [NetBSD]: https://man.netbsd.org/getsockopt.2 +/// [OpenBSD]: https://man.openbsd.org/getsockopt.2 +/// [DragonFly BSD]: https://man.dragonflybsd.org/?command=getsockopt§ion=2 +/// [illumos]: https://illumos.org/man/3SOCKET/getsockopt +/// [glibc `getsockopt`]: https://www.gnu.org/software/libc/manual/html_node/Socket-Option-Functions.html +/// [glibc `SOL_SOCKET` options]: https://www.gnu.org/software/libc/manual/html_node/Socket_002dLevel-Options.html #[inline] #[doc(alias = "SO_SNDBUF")] pub fn get_socket_send_buffer_size(fd: Fd) -> io::Result { - backend::net::sockopt::get_socket_send_buffer_size(fd.as_fd()) + backend::net::syscalls::sockopt::get_socket_send_buffer_size(fd.as_fd()) } /// `getsockopt(fd, SOL_SOCKET, SO_DOMAIN)` /// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_socket_-and-set_socket_-functions +/// # References +/// - [POSIX `getsockopt`] +/// - [POSIX `sys/socket.h`] +/// - [Linux `getsockopt`] +/// - [Linux `socket`] +/// - [Winsock2 `getsockopt`] +/// - [Winsock2 `SOL_SOCKET` options] +/// - [Apple] +/// - [FreeBSD] +/// - [NetBSD] +/// - [OpenBSD] +/// - [DragonFly BSD] +/// - [illumos] +/// - [glibc `getsockopt`] +/// - [glibc `SOL_SOCKET` Options] +/// +/// [POSIX `getsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html +/// [POSIX `sys/socket.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_socket.h.html +/// [Linux `getsockopt`]: https://man7.org/linux/man-pages/man2/getsockopt.2.html +/// [Linux `socket`]: https://man7.org/linux/man-pages/man7/socket.7.html +/// [Winsock2 `getsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-getsockopt +/// [Winsock2 `SOL_SOCKET` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/sol-socket-socket-options +/// [Apple]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/getsockopt.2.html +/// [FreeBSD]: https://man.freebsd.org/cgi/man.cgi?query=getsockopt&sektion=2 +/// [NetBSD]: https://man.netbsd.org/getsockopt.2 +/// [OpenBSD]: https://man.openbsd.org/getsockopt.2 +/// [DragonFly BSD]: https://man.dragonflybsd.org/?command=getsockopt§ion=2 +/// [illumos]: https://illumos.org/man/3SOCKET/getsockopt +/// [glibc `getsockopt`]: https://www.gnu.org/software/libc/manual/html_node/Socket-Option-Functions.html +/// [glibc `SOL_SOCKET` options]: https://www.gnu.org/software/libc/manual/html_node/Socket_002dLevel-Options.html +// TODO: OpenBSD and Solarish support submitted upstream: https://github.com/rust-lang/libc/pull/3316 #[cfg(not(any( apple, + solarish, windows, - target_os = "aix", target_os = "dragonfly", target_os = "emscripten", target_os = "espidf", target_os = "haiku", target_os = "netbsd", target_os = "nto", - target_os = "vita", + target_os = "openbsd" )))] #[inline] #[doc(alias = "SO_DOMAIN")] pub fn get_socket_domain(fd: Fd) -> io::Result { - backend::net::sockopt::get_socket_domain(fd.as_fd()) -} - -/// `getsockopt(fd, SOL_SOCKET, SO_ACCEPTCONN)` -/// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_socket_-and-set_socket_-functions -#[cfg(not(apple))] // Apple platforms declare the constant, but do not actually implement it. -#[inline] -#[doc(alias = "SO_ACCEPTCONN")] -pub fn get_socket_acceptconn(fd: Fd) -> io::Result { - backend::net::sockopt::get_socket_acceptconn(fd.as_fd()) -} - -/// `setsockopt(fd, SOL_SOCKET, SO_OOBINLINE, value)` -/// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_socket_-and-set_socket_-functions -#[inline] -#[doc(alias = "SO_OOBINLINE")] -pub fn set_socket_oobinline(fd: Fd, value: bool) -> io::Result<()> { - backend::net::sockopt::set_socket_oobinline(fd.as_fd(), value) -} - -/// `getsockopt(fd, SOL_SOCKET, SO_OOBINLINE)` -/// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_socket_-and-set_socket_-functions -#[inline] -#[doc(alias = "SO_OOBINLINE")] -pub fn get_socket_oobinline(fd: Fd) -> io::Result { - backend::net::sockopt::get_socket_oobinline(fd.as_fd()) -} - -/// `setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, value)` -/// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_socket_-and-set_socket_-functions -#[cfg(not(any(solarish, windows)))] -#[cfg(not(windows))] -#[inline] -#[doc(alias = "SO_REUSEPORT")] -pub fn set_socket_reuseport(fd: Fd, value: bool) -> io::Result<()> { - backend::net::sockopt::set_socket_reuseport(fd.as_fd(), value) -} - -/// `getsockopt(fd, SOL_SOCKET, SO_REUSEPORT)` -/// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_socket_-and-set_socket_-functions -#[cfg(not(any(solarish, windows)))] -#[inline] -#[doc(alias = "SO_REUSEPORT")] -pub fn get_socket_reuseport(fd: Fd) -> io::Result { - backend::net::sockopt::get_socket_reuseport(fd.as_fd()) -} - -/// `setsockopt(fd, SOL_SOCKET, SO_REUSEPORT_LB, value)` -/// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_socket_-and-set_socket_-functions -#[cfg(target_os = "freebsd")] -#[inline] -#[doc(alias = "SO_REUSEPORT_LB")] -pub fn set_socket_reuseport_lb(fd: Fd, value: bool) -> io::Result<()> { - backend::net::sockopt::set_socket_reuseport_lb(fd.as_fd(), value) + backend::net::syscalls::sockopt::get_socket_domain(fd.as_fd()) } -/// `getsockopt(fd, SOL_SOCKET, SO_REUSEPORT_LB)` +/// `setsockopt(fd, IPPROTO_IP, IP_TTL, ttl)` /// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_socket_-and-set_socket_-functions -#[cfg(target_os = "freebsd")] -#[inline] -#[doc(alias = "SO_REUSEPORT_LB")] -pub fn get_socket_reuseport_lb(fd: Fd) -> io::Result { - backend::net::sockopt::get_socket_reuseport_lb(fd.as_fd()) -} - -/// `getsockopt(fd, SOL_SOCKET, SO_PROTOCOL)` -/// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_socket_-and-set_socket_-functions -#[cfg(any( - linux_kernel, - target_os = "freebsd", - target_os = "fuchsia", - target_os = "openbsd", - target_os = "redox", - target_env = "newlib" -))] -#[inline] -#[doc(alias = "SO_PROTOCOL")] -pub fn get_socket_protocol(fd: Fd) -> io::Result> { - backend::net::sockopt::get_socket_protocol(fd.as_fd()) -} - -/// `getsockopt(fd, SOL_SOCKET, SO_COOKIE)` -/// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_socket_-and-set_socket_-functions -#[cfg(target_os = "linux")] -#[inline] -#[doc(alias = "SO_COOKIE")] -pub fn get_socket_cookie(fd: Fd) -> io::Result { - backend::net::sockopt::get_socket_cookie(fd.as_fd()) -} - -/// `getsockopt(fd, SOL_SOCKET, SO_INCOMING_CPU)` -/// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_socket_-and-set_socket_-functions -#[cfg(target_os = "linux")] -#[inline] -#[doc(alias = "SO_INCOMING_CPU")] -pub fn get_socket_incoming_cpu(fd: Fd) -> io::Result { - backend::net::sockopt::get_socket_incoming_cpu(fd.as_fd()) -} - -/// `setsockopt(fd, SOL_SOCKET, SO_INCOMING_CPU, value)` -/// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_socket_-and-set_socket_-functions -#[cfg(target_os = "linux")] -#[inline] -#[doc(alias = "SO_INCOMING_CPU")] -pub fn set_socket_incoming_cpu(fd: Fd, value: u32) -> io::Result<()> { - backend::net::sockopt::set_socket_incoming_cpu(fd.as_fd(), value) -} - -/// `setsockopt(fd, IPPROTO_IP, IP_TTL, value)` -/// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_socket_-and-set_socket_-functions +/// # References +/// - [POSIX `setsockopt`] +/// - [POSIX `netinet/in.h`] +/// - [Linux `setsockopt`] +/// - [Linux `ip`] +/// - [Winsock2 `setsockopt`] +/// - [Winsock2 `IPPROTO_IP` options] +/// - [Apple `setsockopt`] +/// - [Apple `ip`] +/// - [FreeBSD `setsockopt`] +/// - [FreeBSD `ip`] +/// - [NetBSD `setsockopt`] +/// - [NetBSD `ip`] +/// - [OpenBSD `setsockopt`] +/// - [OpenBSD `ip`] +/// - [DragonFly BSD `setsockopt`] +/// - [DragonFly BSD `ip`] +/// - [illumos `setsockopt`] +/// - [illumos `ip`] +/// +/// [POSIX `setsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html +/// [Linux `setsockopt`]: https://man7.org/linux/man-pages/man2/setsockopt.2.html +/// [Linux `ip`]: https://man7.org/linux/man-pages/man7/ip.7.html +/// [Winsock2 `setsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-setsockopt +/// [Winsock2 `IPPROTO_IP` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-ip-socket-options +/// [Apple `setsockopt`]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/setsockopt.2.html +/// [Apple `ip`]: https://opensource.apple.com/source/xnu/xnu-7195.81.3/bsd/man/man4/ip.4.auto.html +/// [FreeBSD `setsockopt`]: https://man.freebsd.org/cgi/man.cgi?query=setsockopt&sektion=2 +/// [FreeBSD `ip`]: https://man.freebsd.org/cgi/man.cgi?query=ip&sektion=4 +/// [NetBSD `setsockopt`]: https://man.netbsd.org/setsockopt.2 +/// [NetBSD `ip`]: https://man.netbsd.org/ip.4 +/// [OpenBSD `setsockopt`]: https://man.openbsd.org/setsockopt.2 +/// [OpenBSD `ip`]: https://man.openbsd.org/ip.4 +/// [DragonFly BSD `setsockopt`]: https://man.dragonflybsd.org/?command=setsockopt§ion=2 +/// [DragonFly BSD `ip`]: https://man.dragonflybsd.org/?command=ip§ion=4 +/// [illumos `setsockopt`]: https://illumos.org/man/3SOCKET/setsockopt +/// [illumos `ip`]: https://illumos.org/man/4P/ip #[inline] #[doc(alias = "IP_TTL")] -pub fn set_ip_ttl(fd: Fd, value: u32) -> io::Result<()> { - backend::net::sockopt::set_ip_ttl(fd.as_fd(), value) +pub fn set_ip_ttl(fd: Fd, ttl: u32) -> io::Result<()> { + backend::net::syscalls::sockopt::set_ip_ttl(fd.as_fd(), ttl) } /// `getsockopt(fd, IPPROTO_IP, IP_TTL)` /// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_ip_-and-set_ip_-functions +/// # References +/// - [POSIX `getsockopt`] +/// - [POSIX `netinet/in.h`] +/// - [Linux `getsockopt`] +/// - [Linux `ip`] +/// - [Winsock2 `getsockopt`] +/// - [Winsock2 `IPPROTO_IP` options] +/// - [Apple `getsockopt`] +/// - [Apple `ip`] +/// - [FreeBSD `getsockopt`] +/// - [FreeBSD `ip`] +/// - [NetBSD `getsockopt`] +/// - [NetBSD `ip`] +/// - [OpenBSD `getsockopt`] +/// - [OpenBSD `ip`] +/// - [DragonFly BSD `getsockopt`] +/// - [DragonFly BSD `ip`] +/// - [illumos `getsockopt`] +/// - [illumos `ip`] +/// +/// [POSIX `getsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html +/// [POSIX `netinet/in.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/netinet_in.h.html +/// [Linux `getsockopt`]: https://man7.org/linux/man-pages/man2/getsockopt.2.html +/// [Linux `ip`]: https://man7.org/linux/man-pages/man7/ip.7.html +/// [Winsock2 `getsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-getsockopt +/// [Winsock2 `IPPROTO_IP` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-ip-socket-options +/// [Apple `setsockopt`]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/setsockopt.2.html +/// [Apple `ip`]: https://opensource.apple.com/source/xnu/xnu-7195.81.3/bsd/man/man4/ip.4.auto.html +/// [FreeBSD `setsockopt`]: https://man.freebsd.org/cgi/man.cgi?query=setsockopt&sektion=2 +/// [FreeBSD `ip`]: https://man.freebsd.org/cgi/man.cgi?query=ip&sektion=4 +/// [NetBSD `setsockopt`]: https://man.netbsd.org/setsockopt.2 +/// [NetBSD `ip`]: https://man.netbsd.org/ip.4 +/// [OpenBSD `setsockopt`]: https://man.openbsd.org/setsockopt.2 +/// [OpenBSD `ip`]: https://man.openbsd.org/ip.4 +/// [DragonFly BSD `setsockopt`]: https://man.dragonflybsd.org/?command=setsockopt§ion=2 +/// [DragonFly BSD `ip`]: https://man.dragonflybsd.org/?command=ip§ion=4 +/// [illumos `setsockopt`]: https://illumos.org/man/3SOCKET/setsockopt +/// [illumos `ip`]: https://illumos.org/man/4P/ip #[inline] #[doc(alias = "IP_TTL")] pub fn get_ip_ttl(fd: Fd) -> io::Result { - backend::net::sockopt::get_ip_ttl(fd.as_fd()) + backend::net::syscalls::sockopt::get_ip_ttl(fd.as_fd()) } -/// `setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, value)` -/// -/// See the [module-level documentation] for more. +/// `setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, only_v6)` /// -/// [module-level documentation]: self#references-for-get_ipv6_-and-set_ipv6_-functions +/// # References +/// - [POSIX `setsockopt`] +/// - [POSIX `netinet/in.h`] +/// - [Linux `setsockopt`] +/// - [Linux `ipv6`] +/// - [Winsock2 `setsockopt`] +/// - [Winsock2 `IPPROTO_IPV6` options] +/// - [Apple `setsockopt`] +/// - [Apple `ip6`] +/// - [FreeBSD `setsockopt`] +/// - [FreeBSD `ip6`] +/// - [NetBSD `setsockopt`] +/// - [NetBSD `ip6`] +/// - [OpenBSD `setsockopt`] +/// - [OpenBSD `ip6`] +/// - [DragonFly BSD `setsockopt`] +/// - [DragonFly BSD `ip6`] +/// - [illumos `setsockopt`] +/// - [illumos `ip6`] +/// +/// [POSIX `setsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html +/// [POSIX `netinet/in.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/netinet_in.h.html +/// [Linux `setsockopt`]: https://man7.org/linux/man-pages/man2/setsockopt.2.html +/// [Linux `ipv6`]: https://man7.org/linux/man-pages/man7/ipv6.7.html +/// [Winsock2 `setsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-setsockopt +/// [Winsock2 `IPPROTO_IPV6` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-ipv6-socket-options +/// [Apple `setsockopt`]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/setsockopt.2.html +/// [Apple `ip6`]: https://opensource.apple.com/source/xnu/xnu-7195.81.3/bsd/man/man4/ip6.4.auto.html +/// [FreeBSD `setsockopt`]: https://man.freebsd.org/cgi/man.cgi?query=setsockopt&sektion=2 +/// [FreeBSD `ip6`]: https://man.freebsd.org/cgi/man.cgi?query=ip6&sektion=4 +/// [NetBSD `setsockopt`]: https://man.netbsd.org/setsockopt.2 +/// [NetBSD `ip6`]: https://man.netbsd.org/ip6.4 +/// [OpenBSD `setsockopt`]: https://man.openbsd.org/setsockopt.2 +/// [OpenBSD `ip6`]: https://man.openbsd.org/ip6.4 +/// [DragonFly BSD `setsockopt`]: https://man.dragonflybsd.org/?command=setsockopt§ion=2 +/// [DragonFly BSD `ip6`]: https://man.dragonflybsd.org/?command=ip6§ion=4 +/// [illumos `setsockopt`]: https://illumos.org/man/3SOCKET/setsockopt +/// [illumos `ip6`]: https://illumos.org/man/4P/ip6 #[inline] #[doc(alias = "IPV6_V6ONLY")] -pub fn set_ipv6_v6only(fd: Fd, value: bool) -> io::Result<()> { - backend::net::sockopt::set_ipv6_v6only(fd.as_fd(), value) +pub fn set_ipv6_v6only(fd: Fd, only_v6: bool) -> io::Result<()> { + backend::net::syscalls::sockopt::set_ipv6_v6only(fd.as_fd(), only_v6) } /// `getsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY)` /// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_ipv6_-and-set_ipv6_-functions +/// # References +/// - [POSIX `getsockopt`] +/// - [POSIX `netinet/in.h`] +/// - [Linux `getsockopt`] +/// - [Linux `ipv6`] +/// - [Winsock2 `getsockopt`] +/// - [Winsock2 `IPPROTO_IPV6` options] +/// - [Apple `getsockopt`] +/// - [Apple `ip6`] +/// - [FreeBSD `getsockopt`] +/// - [FreeBSD `ip6`] +/// - [NetBSD `getsockopt`] +/// - [NetBSD `ip6`] +/// - [OpenBSD `getsockopt`] +/// - [OpenBSD `ip6`] +/// - [DragonFly BSD `getsockopt`] +/// - [DragonFly BSD `ip6`] +/// - [illumos `getsockopt`] +/// - [illumos `ip6`] +/// +/// [POSIX `getsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html +/// [POSIX `netinet/in.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/netinet_in.h.html +/// [Linux `getsockopt`]: https://man7.org/linux/man-pages/man2/getsockopt.2.html +/// [Linux `ipv6`]: https://man7.org/linux/man-pages/man7/ipv6.7.html +/// [Winsock2 `getsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-getsockopt +/// [Winsock2 `IPPROTO_IPV6` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-ipv6-socket-options +/// [Apple `getsockopt`]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/getsockopt.2.html +/// [Apple `ip6`]: https://opensource.apple.com/source/xnu/xnu-7195.81.3/bsd/man/man4/ip6.4.auto.html +/// [FreeBSD `getsockopt`]: https://man.freebsd.org/cgi/man.cgi?query=getsockopt&sektion=2 +/// [FreeBSD `ip6`]: https://man.freebsd.org/cgi/man.cgi?query=ip6&sektion=4 +/// [NetBSD `getsockopt`]: https://man.netbsd.org/getsockopt.2 +/// [NetBSD `ip6`]: https://man.netbsd.org/ip6.4 +/// [OpenBSD `getsockopt`]: https://man.openbsd.org/getsockopt.2 +/// [OpenBSD `ip6`]: https://man.openbsd.org/ip6.4 +/// [DragonFly BSD `getsockopt`]: https://man.dragonflybsd.org/?command=getsockopt§ion=2 +/// [DragonFly BSD `ip6`]: https://man.dragonflybsd.org/?command=ip6§ion=4 +/// [illumos `getsockopt`]: https://illumos.org/man/3SOCKET/getsockopt +/// [illumos `ip6`]: https://illumos.org/man/4P/ip6 #[inline] #[doc(alias = "IPV6_V6ONLY")] pub fn get_ipv6_v6only(fd: Fd) -> io::Result { - backend::net::sockopt::get_ipv6_v6only(fd.as_fd()) + backend::net::syscalls::sockopt::get_ipv6_v6only(fd.as_fd()) } -/// `setsockopt(fd, IPPROTO_IP, IP_MULTICAST_LOOP, value)` -/// -/// See the [module-level documentation] for more. +/// `setsockopt(fd, IPPROTO_IP, IP_MULTICAST_LOOP, multicast_loop)` /// -/// [module-level documentation]: self#references-for-get_ip_-and-set_ip_-functions +/// # References +/// - [POSIX `setsockopt`] +/// - [POSIX `netinet/in.h`] +/// - [Linux `setsockopt`] +/// - [Linux `ip`] +/// - [Winsock2 `setsockopt`] +/// - [Winsock2 `IPPROTO_IP` options] +/// - [Apple `setsockopt`] +/// - [Apple `ip`] +/// - [FreeBSD `setsockopt`] +/// - [FreeBSD `ip`] +/// - [NetBSD `setsockopt`] +/// - [NetBSD `ip`] +/// - [OpenBSD `setsockopt`] +/// - [OpenBSD `ip`] +/// - [DragonFly BSD `setsockopt`] +/// - [DragonFly BSD `ip`] +/// - [illumos `setsockopt`] +/// - [illumos `ip`] +/// +/// [POSIX `setsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html +/// [POSIX `netinet/in.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/netinet_in.h.html +/// [Linux `setsockopt`]: https://man7.org/linux/man-pages/man2/setsockopt.2.html +/// [Linux `ip`]: https://man7.org/linux/man-pages/man7/ip.7.html +/// [Winsock2 `setsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-setsockopt +/// [Winsock2 `IPPROTO_IP` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-ip-socket-options +/// [Apple `setsockopt`]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/setsockopt.2.html +/// [Apple `ip`]: https://opensource.apple.com/source/xnu/xnu-7195.81.3/bsd/man/man4/ip.4.auto.html +/// [FreeBSD `setsockopt`]: https://man.freebsd.org/cgi/man.cgi?query=setsockopt&sektion=2 +/// [FreeBSD `ip`]: https://man.freebsd.org/cgi/man.cgi?query=ip&sektion=4 +/// [NetBSD `setsockopt`]: https://man.netbsd.org/setsockopt.2 +/// [NetBSD `ip`]: https://man.netbsd.org/ip.4 +/// [OpenBSD `setsockopt`]: https://man.openbsd.org/setsockopt.2 +/// [OpenBSD `ip`]: https://man.openbsd.org/ip.4 +/// [DragonFly BSD `setsockopt`]: https://man.dragonflybsd.org/?command=setsockopt§ion=2 +/// [DragonFly BSD `ip`]: https://man.dragonflybsd.org/?command=ip§ion=4 +/// [illumos `setsockopt`]: https://illumos.org/man/3SOCKET/setsockopt +/// [illumos `ip`]: https://illumos.org/man/4P/ip #[inline] #[doc(alias = "IP_MULTICAST_LOOP")] -pub fn set_ip_multicast_loop(fd: Fd, value: bool) -> io::Result<()> { - backend::net::sockopt::set_ip_multicast_loop(fd.as_fd(), value) +pub fn set_ip_multicast_loop(fd: Fd, multicast_loop: bool) -> io::Result<()> { + backend::net::syscalls::sockopt::set_ip_multicast_loop(fd.as_fd(), multicast_loop) } /// `getsockopt(fd, IPPROTO_IP, IP_MULTICAST_LOOP)` /// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_ip_-and-set_ip_-functions +/// # References +/// - [POSIX `getsockopt`] +/// - [POSIX `netinet/in.h`] +/// - [Linux `getsockopt`] +/// - [Linux `ip`] +/// - [Winsock2 `getsockopt`] +/// - [Winsock2 `IPPROTO_IP` options] +/// - [Apple `getsockopt`] +/// - [Apple `ip`] +/// - [FreeBSD `getsockopt`] +/// - [FreeBSD `ip`] +/// - [NetBSD `getsockopt`] +/// - [NetBSD `ip`] +/// - [OpenBSD `getsockopt`] +/// - [OpenBSD `ip`] +/// - [DragonFly BSD `getsockopt`] +/// - [DragonFly BSD `ip`] +/// - [illumos `getsockopt`] +/// - [illumos `ip`] +/// +/// [POSIX `getsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html +/// [POSIX `netinet/in.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/netinet_in.h.html +/// [Linux `getsockopt`]: https://man7.org/linux/man-pages/man2/getsockopt.2.html +/// [Linux `ip`]: https://man7.org/linux/man-pages/man7/ip.7.html +/// [Winsock2 `getsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-getsockopt +/// [Winsock2 `IPPROTO_IP` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-ip-socket-options #[inline] #[doc(alias = "IP_MULTICAST_LOOP")] pub fn get_ip_multicast_loop(fd: Fd) -> io::Result { - backend::net::sockopt::get_ip_multicast_loop(fd.as_fd()) + backend::net::syscalls::sockopt::get_ip_multicast_loop(fd.as_fd()) } -/// `setsockopt(fd, IPPROTO_IP, IP_MULTICAST_TTL, value)` +/// `setsockopt(fd, IPPROTO_IP, IP_MULTICAST_TTL, multicast_ttl)` /// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_ip_-and-set_ip_-functions +/// # References +/// - [POSIX `setsockopt`] +/// - [POSIX `netinet/in.h`] +/// - [Linux `setsockopt`] +/// - [Linux `ip`] +/// - [Winsock2 `setsockopt`] +/// - [Winsock2 `IPPROTO_IP` options] +/// - [Apple `setsockopt`] +/// - [Apple `ip`] +/// - [FreeBSD `setsockopt`] +/// - [FreeBSD `ip`] +/// - [NetBSD `setsockopt`] +/// - [NetBSD `ip`] +/// - [OpenBSD `setsockopt`] +/// - [OpenBSD `ip`] +/// - [DragonFly BSD `setsockopt`] +/// - [DragonFly BSD `ip`] +/// - [illumos `setsockopt`] +/// - [illumos `ip`] +/// +/// [POSIX `setsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html +/// [POSIX `netinet/in.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/netinet_in.h.html +/// [Linux `setsockopt`]: https://man7.org/linux/man-pages/man2/setsockopt.2.html +/// [Linux `ip`]: https://man7.org/linux/man-pages/man7/ip.7.html +/// [Winsock2 `setsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-setsockopt +/// [Winsock2 `IPPROTO_IP` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-ip-socket-options +/// [Apple `setsockopt`]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/setsockopt.2.html +/// [Apple `ip`]: https://opensource.apple.com/source/xnu/xnu-7195.81.3/bsd/man/man4/ip.4.auto.html +/// [FreeBSD `setsockopt`]: https://man.freebsd.org/cgi/man.cgi?query=setsockopt&sektion=2 +/// [FreeBSD `ip`]: https://man.freebsd.org/cgi/man.cgi?query=ip&sektion=4 +/// [NetBSD `setsockopt`]: https://man.netbsd.org/setsockopt.2 +/// [NetBSD `ip`]: https://man.netbsd.org/ip.4 +/// [OpenBSD `setsockopt`]: https://man.openbsd.org/setsockopt.2 +/// [OpenBSD `ip`]: https://man.openbsd.org/ip.4 +/// [DragonFly BSD `setsockopt`]: https://man.dragonflybsd.org/?command=setsockopt§ion=2 +/// [DragonFly BSD `ip`]: https://man.dragonflybsd.org/?command=ip§ion=4 +/// [illumos `setsockopt`]: https://illumos.org/man/3SOCKET/setsockopt +/// [illumos `ip`]: https://illumos.org/man/4P/ip #[inline] #[doc(alias = "IP_MULTICAST_TTL")] -pub fn set_ip_multicast_ttl(fd: Fd, value: u32) -> io::Result<()> { - backend::net::sockopt::set_ip_multicast_ttl(fd.as_fd(), value) +pub fn set_ip_multicast_ttl(fd: Fd, multicast_ttl: u32) -> io::Result<()> { + backend::net::syscalls::sockopt::set_ip_multicast_ttl(fd.as_fd(), multicast_ttl) } /// `getsockopt(fd, IPPROTO_IP, IP_MULTICAST_TTL)` /// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_ip_-and-set_ip_-functions +/// # References +/// - [POSIX `getsockopt`] +/// - [POSIX `netinet/in.h`] +/// - [Linux `getsockopt`] +/// - [Linux `ip`] +/// - [Winsock2 `getsockopt`] +/// - [Winsock2 `IPPROTO_IP` options] +/// - [Apple `getsockopt`] +/// - [Apple `ip`] +/// - [FreeBSD `getsockopt`] +/// - [FreeBSD `ip`] +/// - [NetBSD `getsockopt`] +/// - [NetBSD `ip`] +/// - [OpenBSD `getsockopt`] +/// - [OpenBSD `ip`] +/// - [DragonFly BSD `getsockopt`] +/// - [DragonFly BSD `ip`] +/// - [illumos `getsockopt`] +/// - [illumos `ip`] +/// +/// [POSIX `getsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html +/// [POSIX `netinet/in.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/netinet_in.h.html +/// [Linux `getsockopt`]: https://man7.org/linux/man-pages/man2/getsockopt.2.html +/// [Linux `ip`]: https://man7.org/linux/man-pages/man7/ip.7.html +/// [Winsock2 `getsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-getsockopt +/// [Winsock2 `IPPROTO_IP` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-ip-socket-options #[inline] #[doc(alias = "IP_MULTICAST_TTL")] pub fn get_ip_multicast_ttl(fd: Fd) -> io::Result { - backend::net::sockopt::get_ip_multicast_ttl(fd.as_fd()) + backend::net::syscalls::sockopt::get_ip_multicast_ttl(fd.as_fd()) } -/// `setsockopt(fd, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, value)` -/// -/// See the [module-level documentation] for more. +/// `setsockopt(fd, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, multicast_loop)` /// -/// [module-level documentation]: self#references-for-get_ipv6_-and-set_ipv6_-functions +/// # References +/// - [POSIX `setsockopt`] +/// - [POSIX `netinet/in.h`] +/// - [Linux `setsockopt`] +/// - [Linux `ipv6`] +/// - [Winsock2 `setsockopt`] +/// - [Winsock2 `IPPROTO_IPV6` options] +/// - [Apple `setsockopt`] +/// - [Apple `ip6`] +/// - [FreeBSD `setsockopt`] +/// - [FreeBSD `ip6`] +/// - [NetBSD `setsockopt`] +/// - [NetBSD `ip6`] +/// - [OpenBSD `setsockopt`] +/// - [OpenBSD `ip6`] +/// - [DragonFly BSD `setsockopt`] +/// - [DragonFly BSD `ip6`] +/// - [illumos `setsockopt`] +/// - [illumos `ip6`] +/// +/// [POSIX `setsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html +/// [POSIX `netinet/in.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/netinet_in.h.html +/// [Linux `setsockopt`]: https://man7.org/linux/man-pages/man2/setsockopt.2.html +/// [Linux `ipv6`]: https://man7.org/linux/man-pages/man7/ipv6.7.html +/// [Winsock2 `setsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-setsockopt +/// [Winsock2 `IPPROTO_IPV6` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-ipv6-socket-options +/// [Apple `setsockopt`]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/setsockopt.2.html +/// [Apple `ip6`]: https://opensource.apple.com/source/xnu/xnu-7195.81.3/bsd/man/man4/ip6.4.auto.html +/// [FreeBSD `setsockopt`]: https://man.freebsd.org/cgi/man.cgi?query=setsockopt&sektion=2 +/// [FreeBSD `ip6`]: https://man.freebsd.org/cgi/man.cgi?query=ip6&sektion=4 +/// [NetBSD `setsockopt`]: https://man.netbsd.org/setsockopt.2 +/// [NetBSD `ip6`]: https://man.netbsd.org/ip6.4 +/// [OpenBSD `setsockopt`]: https://man.openbsd.org/setsockopt.2 +/// [OpenBSD `ip6`]: https://man.openbsd.org/ip6.4 +/// [DragonFly BSD `setsockopt`]: https://man.dragonflybsd.org/?command=setsockopt§ion=2 +/// [DragonFly BSD `ip6`]: https://man.dragonflybsd.org/?command=ip6§ion=4 +/// [illumos `setsockopt`]: https://illumos.org/man/3SOCKET/setsockopt +/// [illumos `ip6`]: https://illumos.org/man/4P/ip6 #[inline] #[doc(alias = "IPV6_MULTICAST_LOOP")] -pub fn set_ipv6_multicast_loop(fd: Fd, value: bool) -> io::Result<()> { - backend::net::sockopt::set_ipv6_multicast_loop(fd.as_fd(), value) +pub fn set_ipv6_multicast_loop(fd: Fd, multicast_loop: bool) -> io::Result<()> { + backend::net::syscalls::sockopt::set_ipv6_multicast_loop(fd.as_fd(), multicast_loop) } /// `getsockopt(fd, IPPROTO_IPV6, IPV6_MULTICAST_LOOP)` /// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_ipv6_-and-set_ipv6_-functions +/// # References +/// - [POSIX `getsockopt`] +/// - [POSIX `netinet/in.h`] +/// - [Linux `getsockopt`] +/// - [Linux `ipv6`] +/// - [Winsock2 `getsockopt`] +/// - [Winsock2 `IPPROTO_IPV6` options] +/// - [Apple `getsockopt`] +/// - [Apple `ip6`] +/// - [FreeBSD `getsockopt`] +/// - [FreeBSD `ip6`] +/// - [NetBSD `getsockopt`] +/// - [NetBSD `ip6`] +/// - [OpenBSD `getsockopt`] +/// - [OpenBSD `ip6`] +/// - [DragonFly BSD `getsockopt`] +/// - [DragonFly BSD `ip6`] +/// - [illumos `getsockopt`] +/// - [illumos `ip6`] +/// +/// [POSIX `getsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html +/// [POSIX `netinet/in.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/netinet_in.h.html +/// [Linux `getsockopt`]: https://man7.org/linux/man-pages/man2/getsockopt.2.html +/// [Linux `ipv6`]: https://man7.org/linux/man-pages/man7/ipv6.7.html +/// [Winsock2 `getsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-getsockopt +/// [Winsock2 `IPPROTO_IPV6` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-ipv6-socket-options +/// [Apple `getsockopt`]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/getsockopt.2.html +/// [Apple `ip6`]: https://opensource.apple.com/source/xnu/xnu-7195.81.3/bsd/man/man4/ip6.4.auto.html +/// [FreeBSD `getsockopt`]: https://man.freebsd.org/cgi/man.cgi?query=getsockopt&sektion=2 +/// [FreeBSD `ip6`]: https://man.freebsd.org/cgi/man.cgi?query=ip6&sektion=4 +/// [NetBSD `getsockopt`]: https://man.netbsd.org/getsockopt.2 +/// [NetBSD `ip6`]: https://man.netbsd.org/ip6.4 +/// [OpenBSD `getsockopt`]: https://man.openbsd.org/getsockopt.2 +/// [OpenBSD `ip6`]: https://man.openbsd.org/ip6.4 +/// [DragonFly BSD `getsockopt`]: https://man.dragonflybsd.org/?command=getsockopt§ion=2 +/// [DragonFly BSD `ip6`]: https://man.dragonflybsd.org/?command=ip6§ion=4 +/// [illumos `getsockopt`]: https://illumos.org/man/3SOCKET/getsockopt +/// [illumos `ip6`]: https://illumos.org/man/4P/ip6 #[inline] #[doc(alias = "IPV6_MULTICAST_LOOP")] pub fn get_ipv6_multicast_loop(fd: Fd) -> io::Result { - backend::net::sockopt::get_ipv6_multicast_loop(fd.as_fd()) + backend::net::syscalls::sockopt::get_ipv6_multicast_loop(fd.as_fd()) } -/// `getsockopt(fd, IPPROTO_IPV6, IPV6_UNICAST_HOPS)` +/// `setsockopt(fd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, multicast_hops)` /// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_ipv6_-and-set_ipv6_-functions +/// # References +/// - [POSIX `setsockopt`] +/// - [POSIX `netinet/in.h`] +/// - [Linux `setsockopt`] +/// - [Linux `ipv6`] +/// - [Winsock2 `setsockopt`] +/// - [Winsock2 `IPPROTO_IPV6` options] +/// - [Apple `setsockopt`] +/// - [Apple `ip6`] +/// - [FreeBSD `setsockopt`] +/// - [FreeBSD `ip6`] +/// - [NetBSD `setsockopt`] +/// - [NetBSD `ip6`] +/// - [OpenBSD `setsockopt`] +/// - [OpenBSD `ip6`] +/// - [DragonFly BSD `setsockopt`] +/// - [DragonFly BSD `ip6`] +/// - [illumos `setsockopt`] +/// - [illumos `ip6`] +/// +/// [POSIX `setsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html +/// [POSIX `netinet/in.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/netinet_in.h.html +/// [Linux `setsockopt`]: https://man7.org/linux/man-pages/man2/setsockopt.2.html +/// [Linux `ipv6`]: https://man7.org/linux/man-pages/man7/ipv6.7.html +/// [Winsock2 `setsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-setsockopt +/// [Winsock2 `IPPROTO_IPV6` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-ipv6-socket-options +/// [Apple `setsockopt`]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/setsockopt.2.html +/// [Apple `ip6`]: https://opensource.apple.com/source/xnu/xnu-7195.81.3/bsd/man/man4/ip6.4.auto.html +/// [FreeBSD `setsockopt`]: https://man.freebsd.org/cgi/man.cgi?query=setsockopt&sektion=2 +/// [FreeBSD `ip6`]: https://man.freebsd.org/cgi/man.cgi?query=ip6&sektion=4 +/// [NetBSD `setsockopt`]: https://man.netbsd.org/setsockopt.2 +/// [NetBSD `ip6`]: https://man.netbsd.org/ip6.4 +/// [OpenBSD `setsockopt`]: https://man.openbsd.org/setsockopt.2 +/// [OpenBSD `ip6`]: https://man.openbsd.org/ip6.4 +/// [DragonFly BSD `setsockopt`]: https://man.dragonflybsd.org/?command=setsockopt§ion=2 +/// [DragonFly BSD `ip6`]: https://man.dragonflybsd.org/?command=ip6§ion=4 +/// [illumos `setsockopt`]: https://illumos.org/man/3SOCKET/setsockopt +/// [illumos `ip6`]: https://illumos.org/man/4P/ip6 #[inline] -#[doc(alias = "IPV6_UNICAST_HOPS")] -pub fn get_ipv6_unicast_hops(fd: Fd) -> io::Result { - backend::net::sockopt::get_ipv6_unicast_hops(fd.as_fd()) +#[doc(alias = "IP_MULTICAST_TTL")] +pub fn set_ipv6_multicast_hops(fd: Fd, multicast_hops: u32) -> io::Result<()> { + backend::net::syscalls::sockopt::set_ipv6_multicast_hops(fd.as_fd(), multicast_hops) } -/// `setsockopt(fd, IPPROTO_IPV6, IPV6_UNICAST_HOPS, value)` -/// -/// See the [module-level documentation] for more. +/// `getsockopt(fd, IPPROTO_IPV6, IPV6_UNICAST_HOPS)` /// -/// [module-level documentation]: self#references-for-get_ipv6_-and-set_ipv6_-functions +/// # References +/// - [POSIX `getsockopt`] +/// - [POSIX `netinet/in.h`] +/// - [Linux `getsockopt`] +/// - [Linux `ipv6`] +/// - [Winsock2 `getsockopt`] +/// - [Winsock2 `IPPROTO_IPV6` options] +/// - [Apple `getsockopt`] +/// - [Apple `ip6`] +/// - [FreeBSD `getsockopt`] +/// - [FreeBSD `ip6`] +/// - [NetBSD `getsockopt`] +/// - [NetBSD `ip6`] +/// - [OpenBSD `getsockopt`] +/// - [OpenBSD `ip6`] +/// - [DragonFly BSD `getsockopt`] +/// - [DragonFly BSD `ip6`] +/// - [illumos `getsockopt`] +/// - [illumos `ip6`] +/// +/// [POSIX `getsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html +/// [POSIX `netinet/in.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/netinet_in.h.html +/// [Linux `getsockopt`]: https://man7.org/linux/man-pages/man2/getsockopt.2.html +/// [Linux `ipv6`]: https://man7.org/linux/man-pages/man7/ipv6.7.html +/// [Winsock2 `getsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-getsockopt +/// [Winsock2 `IPPROTO_IPV6` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-ipv6-socket-options +/// [Apple `getsockopt`]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/getsockopt.2.html +/// [Apple `ip6`]: https://opensource.apple.com/source/xnu/xnu-7195.81.3/bsd/man/man4/ip6.4.auto.html +/// [FreeBSD `getsockopt`]: https://man.freebsd.org/cgi/man.cgi?query=getsockopt&sektion=2 +/// [FreeBSD `ip6`]: https://man.freebsd.org/cgi/man.cgi?query=ip6&sektion=4 +/// [NetBSD `getsockopt`]: https://man.netbsd.org/getsockopt.2 +/// [NetBSD `ip6`]: https://man.netbsd.org/ip6.4 +/// [OpenBSD `getsockopt`]: https://man.openbsd.org/getsockopt.2 +/// [OpenBSD `ip6`]: https://man.openbsd.org/ip6.4 +/// [DragonFly BSD `getsockopt`]: https://man.dragonflybsd.org/?command=getsockopt§ion=2 +/// [DragonFly BSD `ip6`]: https://man.dragonflybsd.org/?command=ip6§ion=4 +/// [illumos `getsockopt`]: https://illumos.org/man/3SOCKET/getsockopt +/// [illumos `ip6`]: https://illumos.org/man/4P/ip6 #[inline] #[doc(alias = "IPV6_UNICAST_HOPS")] -pub fn set_ipv6_unicast_hops(fd: Fd, value: Option) -> io::Result<()> { - backend::net::sockopt::set_ipv6_unicast_hops(fd.as_fd(), value) +pub fn get_ipv6_unicast_hops(fd: Fd) -> io::Result { + backend::net::syscalls::sockopt::get_ipv6_unicast_hops(fd.as_fd()) } -/// `setsockopt(fd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, value)` -/// -/// See the [module-level documentation] for more. +/// `setsockopt(fd, IPPROTO_IPV6, IPV6_UNICAST_HOPS, unicast_hops)` /// -/// [module-level documentation]: self#references-for-get_ipv6_-and-set_ipv6_-functions +/// # References +/// - [POSIX `setsockopt`] +/// - [POSIX `netinet/in.h`] +/// - [Linux `setsockopt`] +/// - [Linux `ipv6`] +/// - [Winsock2 `setsockopt`] +/// - [Winsock2 `IPPROTO_IPV6` options] +/// - [Apple `setsockopt`] +/// - [Apple `ip6`] +/// - [FreeBSD `setsockopt`] +/// - [FreeBSD `ip6`] +/// - [NetBSD `setsockopt`] +/// - [NetBSD `ip6`] +/// - [OpenBSD `setsockopt`] +/// - [OpenBSD `ip6`] +/// - [DragonFly BSD `setsockopt`] +/// - [DragonFly BSD `ip6`] +/// - [illumos `setsockopt`] +/// - [illumos `ip6`] +/// +/// [POSIX `setsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html +/// [POSIX `netinet/in.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/netinet_in.h.html +/// [Linux `setsockopt`]: https://man7.org/linux/man-pages/man2/setsockopt.2.html +/// [Linux `ipv6`]: https://man7.org/linux/man-pages/man7/ipv6.7.html +/// [Winsock2 `setsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-setsockopt +/// [Winsock2 `IPPROTO_IPV6` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-ipv6-socket-options +/// [Apple `setsockopt`]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/setsockopt.2.html +/// [Apple `ip6`]: https://opensource.apple.com/source/xnu/xnu-7195.81.3/bsd/man/man4/ip6.4.auto.html +/// [FreeBSD `setsockopt`]: https://man.freebsd.org/cgi/man.cgi?query=setsockopt&sektion=2 +/// [FreeBSD `ip6`]: https://man.freebsd.org/cgi/man.cgi?query=ip6&sektion=4 +/// [NetBSD `setsockopt`]: https://man.netbsd.org/setsockopt.2 +/// [NetBSD `ip6`]: https://man.netbsd.org/ip6.4 +/// [OpenBSD `setsockopt`]: https://man.openbsd.org/setsockopt.2 +/// [OpenBSD `ip6`]: https://man.openbsd.org/ip6.4 +/// [DragonFly BSD `setsockopt`]: https://man.dragonflybsd.org/?command=setsockopt§ion=2 +/// [DragonFly BSD `ip6`]: https://man.dragonflybsd.org/?command=ip6§ion=4 +/// [illumos `setsockopt`]: https://illumos.org/man/3SOCKET/setsockopt +/// [illumos `ip6`]: https://illumos.org/man/4P/ip6 #[inline] -#[doc(alias = "IPV6_MULTICAST_HOPS")] -pub fn set_ipv6_multicast_hops(fd: Fd, value: u32) -> io::Result<()> { - backend::net::sockopt::set_ipv6_multicast_hops(fd.as_fd(), value) +#[doc(alias = "IPV6_UNICAST_HOPS")] +pub fn set_ipv6_unicast_hops(fd: Fd, unicast_hops: Option) -> io::Result<()> { + backend::net::syscalls::sockopt::set_ipv6_unicast_hops(fd.as_fd(), unicast_hops) } /// `getsockopt(fd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS)` /// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_ipv6_-and-set_ipv6_-functions +/// # References +/// - [POSIX `getsockopt`] +/// - [POSIX `netinet/in.h`] +/// - [Linux `getsockopt`] +/// - [Linux `ipv6`] +/// - [Winsock2 `getsockopt`] +/// - [Winsock2 `IPPROTO_IPV6` options] +/// - [Apple `getsockopt`] +/// - [Apple `ip6`] +/// - [FreeBSD `getsockopt`] +/// - [FreeBSD `ip6`] +/// - [NetBSD `getsockopt`] +/// - [NetBSD `ip6`] +/// - [OpenBSD `getsockopt`] +/// - [OpenBSD `ip6`] +/// - [DragonFly BSD `getsockopt`] +/// - [DragonFly BSD `ip6`] +/// - [illumos `getsockopt`] +/// - [illumos `ip6`] +/// +/// [POSIX `getsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html +/// [POSIX `netinet/in.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/netinet_in.h.html +/// [Linux `getsockopt`]: https://man7.org/linux/man-pages/man2/getsockopt.2.html +/// [Linux `ipv6`]: https://man7.org/linux/man-pages/man7/ipv6.7.html +/// [Winsock2 `getsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-getsockopt +/// [Winsock2 `IPPROTO_IPV6` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-ipv6-socket-options +/// [Apple `getsockopt`]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/getsockopt.2.html +/// [Apple `ip6`]: https://opensource.apple.com/source/xnu/xnu-7195.81.3/bsd/man/man4/ip6.4.auto.html +/// [FreeBSD `getsockopt`]: https://man.freebsd.org/cgi/man.cgi?query=getsockopt&sektion=2 +/// [FreeBSD `ip6`]: https://man.freebsd.org/cgi/man.cgi?query=ip6&sektion=4 +/// [NetBSD `getsockopt`]: https://man.netbsd.org/getsockopt.2 +/// [NetBSD `ip6`]: https://man.netbsd.org/ip6.4 +/// [OpenBSD `getsockopt`]: https://man.openbsd.org/getsockopt.2 +/// [OpenBSD `ip6`]: https://man.openbsd.org/ip6.4 +/// [DragonFly BSD `getsockopt`]: https://man.dragonflybsd.org/?command=getsockopt§ion=2 +/// [DragonFly BSD `ip6`]: https://man.dragonflybsd.org/?command=ip6§ion=4 +/// [illumos `getsockopt`]: https://illumos.org/man/3SOCKET/getsockopt +/// [illumos `ip6`]: https://illumos.org/man/4P/ip6 #[inline] -#[doc(alias = "IPV6_MULTICAST_HOPS")] +#[doc(alias = "IP_MULTICAST_TTL")] pub fn get_ipv6_multicast_hops(fd: Fd) -> io::Result { - backend::net::sockopt::get_ipv6_multicast_hops(fd.as_fd()) + backend::net::syscalls::sockopt::get_ipv6_multicast_hops(fd.as_fd()) } /// `setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, multiaddr, interface)` /// -/// This is similar to [`set_ip_add_membership`] but always sets `ifindex` -/// value to zero. -/// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_ip_-and-set_ip_-functions +/// # References +/// - [POSIX `setsockopt`] +/// - [POSIX `netinet/in.h`] +/// - [Linux `setsockopt`] +/// - [Linux `ip`] +/// - [Winsock2 `setsockopt`] +/// - [Winsock2 `IPPROTO_IP` options] +/// - [Apple `setsockopt`] +/// - [Apple `ip`] +/// - [FreeBSD `setsockopt`] +/// - [FreeBSD `ip`] +/// - [NetBSD `setsockopt`] +/// - [NetBSD `ip`] +/// - [OpenBSD `setsockopt`] +/// - [OpenBSD `ip`] +/// - [DragonFly BSD `setsockopt`] +/// - [DragonFly BSD `ip`] +/// - [illumos `setsockopt`] +/// - [illumos `ip`] +/// +/// [POSIX `setsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html +/// [POSIX `netinet/in.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/netinet_in.h.html +/// [Linux `setsockopt`]: https://man7.org/linux/man-pages/man2/setsockopt.2.html +/// [Linux `ip`]: https://man7.org/linux/man-pages/man7/ip.7.html +/// [Winsock2 `setsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-setsockopt +/// [Winsock2 `IPPROTO_IP` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-ip-socket-options +/// [Apple `setsockopt`]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/setsockopt.2.html +/// [Apple `ip`]: https://opensource.apple.com/source/xnu/xnu-7195.81.3/bsd/man/man4/ip.4.auto.html +/// [FreeBSD `setsockopt`]: https://man.freebsd.org/cgi/man.cgi?query=setsockopt&sektion=2 +/// [FreeBSD `ip`]: https://man.freebsd.org/cgi/man.cgi?query=ip&sektion=4 +/// [NetBSD `setsockopt`]: https://man.netbsd.org/setsockopt.2 +/// [NetBSD `ip`]: https://man.netbsd.org/ip.4 +/// [OpenBSD `setsockopt`]: https://man.openbsd.org/setsockopt.2 +/// [OpenBSD `ip`]: https://man.openbsd.org/ip.4 +/// [DragonFly BSD `setsockopt`]: https://man.dragonflybsd.org/?command=setsockopt§ion=2 +/// [DragonFly BSD `ip`]: https://man.dragonflybsd.org/?command=ip§ion=4 +/// [illumos `setsockopt`]: https://illumos.org/man/3SOCKET/setsockopt +/// [illumos `ip`]: https://illumos.org/man/4P/ip #[inline] #[doc(alias = "IP_ADD_MEMBERSHIP")] pub fn set_ip_add_membership( @@ -757,90 +1442,51 @@ multiaddr: &Ipv4Addr, interface: &Ipv4Addr, ) -> io::Result<()> { - backend::net::sockopt::set_ip_add_membership(fd.as_fd(), multiaddr, interface) -} - -/// `setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, multiaddr, address, -/// ifindex)` -/// -/// This is similar to [`set_ip_add_membership_with_ifindex`] but additionally -/// allows a `ifindex` value to be given. -/// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_ip_-and-set_ip_-functions -#[cfg(any( - apple, - freebsdlike, - linux_like, - target_os = "fuchsia", - target_os = "openbsd" -))] -#[inline] -#[doc(alias = "IP_ADD_MEMBERSHIP")] -pub fn set_ip_add_membership_with_ifindex( - fd: Fd, - multiaddr: &Ipv4Addr, - address: &Ipv4Addr, - ifindex: i32, -) -> io::Result<()> { - backend::net::sockopt::set_ip_add_membership_with_ifindex( - fd.as_fd(), - multiaddr, - address, - ifindex, - ) -} - -/// `setsockopt(fd, IPPROTO_IP, IP_ADD_SOURCE_MEMBERSHIP, value)` -/// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_ip_-and-set_ip_-functions -#[cfg(any(apple, freebsdlike, linux_like, solarish, target_os = "aix"))] -#[inline] -#[doc(alias = "IP_ADD_SOURCE_MEMBERSHIP")] -pub fn set_ip_add_source_membership( - fd: Fd, - multiaddr: &Ipv4Addr, - interface: &Ipv4Addr, - sourceaddr: &Ipv4Addr, -) -> io::Result<()> { - backend::net::sockopt::set_ip_add_source_membership( - fd.as_fd(), - multiaddr, - interface, - sourceaddr, - ) -} - -/// `setsockopt(fd, IPPROTO_IP, IP_DROP_SOURCE_MEMBERSHIP, value)` -/// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_ip_-and-set_ip_-functions -#[cfg(any(apple, freebsdlike, linux_like, solarish, target_os = "aix"))] -#[inline] -#[doc(alias = "IP_DROP_SOURCE_MEMBERSHIP")] -pub fn set_ip_drop_source_membership( - fd: Fd, - multiaddr: &Ipv4Addr, - interface: &Ipv4Addr, - sourceaddr: &Ipv4Addr, -) -> io::Result<()> { - backend::net::sockopt::set_ip_drop_source_membership( - fd.as_fd(), - multiaddr, - interface, - sourceaddr, - ) + backend::net::syscalls::sockopt::set_ip_add_membership(fd.as_fd(), multiaddr, interface) } /// `setsockopt(fd, IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP, multiaddr, interface)` /// -/// See the [module-level documentation] for more. +/// `IPV6_ADD_MEMBERSHIP` is the same as `IPV6_JOIN_GROUP` in POSIX. /// -/// [module-level documentation]: self#references-for-get_ipv6_-and-set_ipv6_-functions +/// # References +/// - [POSIX `setsockopt`] +/// - [POSIX `netinet/in.h`] +/// - [Linux `setsockopt`] +/// - [Linux `ipv6`] +/// - [Winsock2 `setsockopt`] +/// - [Winsock2 `IPPROTO_IPV6` options] +/// - [Apple `setsockopt`] +/// - [Apple `ip6`] +/// - [FreeBSD `setsockopt`] +/// - [FreeBSD `ip6`] +/// - [NetBSD `setsockopt`] +/// - [NetBSD `ip6`] +/// - [OpenBSD `setsockopt`] +/// - [OpenBSD `ip6`] +/// - [DragonFly BSD `setsockopt`] +/// - [DragonFly BSD `ip6`] +/// - [illumos `setsockopt`] +/// - [illumos `ip6`] +/// +/// [POSIX `setsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html +/// [POSIX `netinet/in.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/netinet_in.h.html +/// [Linux `setsockopt`]: https://man7.org/linux/man-pages/man2/setsockopt.2.html +/// [Linux `ipv6`]: https://man7.org/linux/man-pages/man7/ipv6.7.html +/// [Winsock2 `setsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-setsockopt +/// [Winsock2 `IPPROTO_IPV6` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-ipv6-socket-options +/// [Apple `setsockopt`]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/setsockopt.2.html +/// [Apple `ip6`]: https://opensource.apple.com/source/xnu/xnu-7195.81.3/bsd/man/man4/ip6.4.auto.html +/// [FreeBSD `setsockopt`]: https://man.freebsd.org/cgi/man.cgi?query=setsockopt&sektion=2 +/// [FreeBSD `ip6`]: https://man.freebsd.org/cgi/man.cgi?query=ip6&sektion=4 +/// [NetBSD `setsockopt`]: https://man.netbsd.org/setsockopt.2 +/// [NetBSD `ip6`]: https://man.netbsd.org/ip6.4 +/// [OpenBSD `setsockopt`]: https://man.openbsd.org/setsockopt.2 +/// [OpenBSD `ip6`]: https://man.openbsd.org/ip6.4 +/// [DragonFly BSD `setsockopt`]: https://man.dragonflybsd.org/?command=setsockopt§ion=2 +/// [DragonFly BSD `ip6`]: https://man.dragonflybsd.org/?command=ip6§ion=4 +/// [illumos `setsockopt`]: https://illumos.org/man/3SOCKET/setsockopt +/// [illumos `ip6`]: https://illumos.org/man/4P/ip6 #[inline] #[doc(alias = "IPV6_JOIN_GROUP")] #[doc(alias = "IPV6_ADD_MEMBERSHIP")] @@ -849,17 +1495,49 @@ multiaddr: &Ipv6Addr, interface: u32, ) -> io::Result<()> { - backend::net::sockopt::set_ipv6_add_membership(fd.as_fd(), multiaddr, interface) + backend::net::syscalls::sockopt::set_ipv6_add_membership(fd.as_fd(), multiaddr, interface) } /// `setsockopt(fd, IPPROTO_IP, IP_DROP_MEMBERSHIP, multiaddr, interface)` /// -/// This is similar to [`set_ip_drop_membership`] but always sets `ifindex` -/// value to zero. -/// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_ip_-and-set_ip_-functions +/// # References +/// - [POSIX `setsockopt`] +/// - [POSIX `netinet/in.h`] +/// - [Linux `setsockopt`] +/// - [Linux `ip`] +/// - [Winsock2 `setsockopt`] +/// - [Winsock2 `IPPROTO_IP` options] +/// - [Apple `setsockopt`] +/// - [Apple `ip`] +/// - [FreeBSD `setsockopt`] +/// - [FreeBSD `ip`] +/// - [NetBSD `setsockopt`] +/// - [NetBSD `ip`] +/// - [OpenBSD `setsockopt`] +/// - [OpenBSD `ip`] +/// - [DragonFly BSD `setsockopt`] +/// - [DragonFly BSD `ip`] +/// - [illumos `setsockopt`] +/// - [illumos `ip`] +/// +/// [POSIX `setsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html +/// [POSIX `netinet/in.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/netinet_in.h.html +/// [Linux `setsockopt`]: https://man7.org/linux/man-pages/man2/setsockopt.2.html +/// [Linux `ip`]: https://man7.org/linux/man-pages/man7/ip.7.html +/// [Winsock2 `setsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-setsockopt +/// [Winsock2 `IPPROTO_IP` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-ip-socket-options +/// [Apple `setsockopt`]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/setsockopt.2.html +/// [Apple `ip`]: https://opensource.apple.com/source/xnu/xnu-7195.81.3/bsd/man/man4/ip.4.auto.html +/// [FreeBSD `setsockopt`]: https://man.freebsd.org/cgi/man.cgi?query=setsockopt&sektion=2 +/// [FreeBSD `ip`]: https://man.freebsd.org/cgi/man.cgi?query=ip&sektion=4 +/// [NetBSD `setsockopt`]: https://man.netbsd.org/setsockopt.2 +/// [NetBSD `ip`]: https://man.netbsd.org/ip.4 +/// [OpenBSD `setsockopt`]: https://man.openbsd.org/setsockopt.2 +/// [OpenBSD `ip`]: https://man.openbsd.org/ip.4 +/// [DragonFly BSD `setsockopt`]: https://man.dragonflybsd.org/?command=setsockopt§ion=2 +/// [DragonFly BSD `ip`]: https://man.dragonflybsd.org/?command=ip§ion=4 +/// [illumos `setsockopt`]: https://illumos.org/man/3SOCKET/setsockopt +/// [illumos `ip`]: https://illumos.org/man/4P/ip #[inline] #[doc(alias = "IP_DROP_MEMBERSHIP")] pub fn set_ip_drop_membership( @@ -867,45 +1545,51 @@ multiaddr: &Ipv4Addr, interface: &Ipv4Addr, ) -> io::Result<()> { - backend::net::sockopt::set_ip_drop_membership(fd.as_fd(), multiaddr, interface) -} - -/// `setsockopt(fd, IPPROTO_IP, IP_DROP_MEMBERSHIP, multiaddr, interface)` -/// -/// This is similar to [`set_ip_drop_membership_with_ifindex`] but additionally -/// allows a `ifindex` value to be given. -/// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_ip_-and-set_ip_-functions -#[cfg(any( - apple, - freebsdlike, - linux_like, - target_os = "fuchsia", - target_os = "openbsd" -))] -#[inline] -#[doc(alias = "IP_DROP_MEMBERSHIP")] -pub fn set_ip_drop_membership_with_ifindex( - fd: Fd, - multiaddr: &Ipv4Addr, - address: &Ipv4Addr, - ifindex: i32, -) -> io::Result<()> { - backend::net::sockopt::set_ip_drop_membership_with_ifindex( - fd.as_fd(), - multiaddr, - address, - ifindex, - ) + backend::net::syscalls::sockopt::set_ip_drop_membership(fd.as_fd(), multiaddr, interface) } /// `setsockopt(fd, IPPROTO_IPV6, IPV6_DROP_MEMBERSHIP, multiaddr, interface)` /// -/// See the [module-level documentation] for more. +/// `IPV6_DROP_MEMBERSHIP` is the same as `IPV6_LEAVE_GROUP` in POSIX. /// -/// [module-level documentation]: self#references-for-get_ipv6_-and-set_ipv6_-functions +/// # References +/// - [POSIX `setsockopt`] +/// - [POSIX `netinet/in.h`] +/// - [Linux `setsockopt`] +/// - [Linux `ipv6`] +/// - [Winsock2 `setsockopt`] +/// - [Winsock2 `IPPROTO_IPV6` options] +/// - [Apple `setsockopt`] +/// - [Apple `ip6`] +/// - [FreeBSD `setsockopt`] +/// - [FreeBSD `ip6`] +/// - [NetBSD `setsockopt`] +/// - [NetBSD `ip6`] +/// - [OpenBSD `setsockopt`] +/// - [OpenBSD `ip6`] +/// - [DragonFly BSD `setsockopt`] +/// - [DragonFly BSD `ip6`] +/// - [illumos `setsockopt`] +/// - [illumos `ip6`] +/// +/// [POSIX `setsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html +/// [POSIX `netinet/in.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/netinet_in.h.html +/// [Linux `setsockopt`]: https://man7.org/linux/man-pages/man2/setsockopt.2.html +/// [Linux `ipv6`]: https://man7.org/linux/man-pages/man7/ipv6.7.html +/// [Winsock2 `setsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-setsockopt +/// [Winsock2 `IPPROTO_IPV6` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-ipv6-socket-options +/// [Apple `setsockopt`]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/setsockopt.2.html +/// [Apple `ip6`]: https://opensource.apple.com/source/xnu/xnu-7195.81.3/bsd/man/man4/ip6.4.auto.html +/// [FreeBSD `setsockopt`]: https://man.freebsd.org/cgi/man.cgi?query=setsockopt&sektion=2 +/// [FreeBSD `ip6`]: https://man.freebsd.org/cgi/man.cgi?query=ip6&sektion=4 +/// [NetBSD `setsockopt`]: https://man.netbsd.org/setsockopt.2 +/// [NetBSD `ip6`]: https://man.netbsd.org/ip6.4 +/// [OpenBSD `setsockopt`]: https://man.openbsd.org/setsockopt.2 +/// [OpenBSD `ip6`]: https://man.openbsd.org/ip6.4 +/// [DragonFly BSD `setsockopt`]: https://man.dragonflybsd.org/?command=setsockopt§ion=2 +/// [DragonFly BSD `ip6`]: https://man.dragonflybsd.org/?command=ip6§ion=4 +/// [illumos `setsockopt`]: https://illumos.org/man/3SOCKET/setsockopt +/// [illumos `ip6`]: https://illumos.org/man/4P/ip6 #[inline] #[doc(alias = "IPV6_LEAVE_GROUP")] #[doc(alias = "IPV6_DROP_MEMBERSHIP")] @@ -914,462 +1598,99 @@ multiaddr: &Ipv6Addr, interface: u32, ) -> io::Result<()> { - backend::net::sockopt::set_ipv6_drop_membership(fd.as_fd(), multiaddr, interface) -} - -/// `setsockopt(fd, IPPROTO_IP, IP_TOS, value)` -/// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_ip_-and-set_ip_-functions -#[cfg(any( - bsd, - linux_like, - target_os = "aix", - target_os = "fuchsia", - target_os = "haiku", - target_os = "nto", - target_env = "newlib" -))] -#[inline] -#[doc(alias = "IP_TOS")] -pub fn set_ip_tos(fd: Fd, value: u8) -> io::Result<()> { - backend::net::sockopt::set_ip_tos(fd.as_fd(), value) -} - -/// `getsockopt(fd, IPPROTO_IP, IP_TOS)` -/// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_ip_-and-set_ip_-functions -#[cfg(any( - bsd, - linux_like, - target_os = "aix", - target_os = "fuchsia", - target_os = "haiku", - target_os = "nto", - target_env = "newlib" -))] -#[inline] -#[doc(alias = "IP_TOS")] -pub fn get_ip_tos(fd: Fd) -> io::Result { - backend::net::sockopt::get_ip_tos(fd.as_fd()) -} - -/// `setsockopt(fd, IPPROTO_IP, IP_RECVTOS, value)` -/// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_ip_-and-set_ip_-functions -#[cfg(any(apple, linux_like, target_os = "freebsd", target_os = "fuchsia"))] -#[inline] -#[doc(alias = "IP_RECVTOS")] -pub fn set_ip_recvtos(fd: Fd, value: bool) -> io::Result<()> { - backend::net::sockopt::set_ip_recvtos(fd.as_fd(), value) -} - -/// `getsockopt(fd, IPPROTO_IP, IP_RECVTOS)` -/// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_ip_-and-set_ip_-functions -#[cfg(any(apple, linux_like, target_os = "freebsd", target_os = "fuchsia"))] -#[inline] -#[doc(alias = "IP_RECVTOS")] -pub fn get_ip_recvtos(fd: Fd) -> io::Result { - backend::net::sockopt::get_ip_recvtos(fd.as_fd()) + backend::net::syscalls::sockopt::set_ipv6_drop_membership(fd.as_fd(), multiaddr, interface) } -/// `setsockopt(fd, IPPROTO_IPV6, IPV6_RECVTCLASS, value)` +/// `setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, nodelay)` /// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_ipv6_-and-set_ipv6_-functions -#[cfg(any( - bsd, - linux_like, - target_os = "aix", - target_os = "fuchsia", - target_os = "nto" -))] -#[inline] -#[doc(alias = "IPV6_RECVTCLASS")] -pub fn set_ipv6_recvtclass(fd: Fd, value: bool) -> io::Result<()> { - backend::net::sockopt::set_ipv6_recvtclass(fd.as_fd(), value) -} - -/// `getsockopt(fd, IPPROTO_IPV6, IPV6_RECVTCLASS)` -/// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_ipv6_-and-set_ipv6_-functions -#[cfg(any( - bsd, - linux_like, - target_os = "aix", - target_os = "fuchsia", - target_os = "nto" -))] -#[inline] -#[doc(alias = "IPV6_RECVTCLASS")] -pub fn get_ipv6_recvtclass(fd: Fd) -> io::Result { - backend::net::sockopt::get_ipv6_recvtclass(fd.as_fd()) -} - -/// `setsockopt(fd, IPPROTO_IP, IP_FREEBIND, value)` -/// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_ipv6_-and-set_ipv6_-functions -#[cfg(any(linux_kernel, target_os = "fuchsia"))] -#[inline] -#[doc(alias = "IP_FREEBIND")] -pub fn set_ip_freebind(fd: Fd, value: bool) -> io::Result<()> { - backend::net::sockopt::set_ip_freebind(fd.as_fd(), value) -} - -/// `getsockopt(fd, IPPROTO_IP, IP_FREEBIND)` -/// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_ipv6_-and-set_ipv6_-functions -#[cfg(any(linux_kernel, target_os = "fuchsia"))] -#[inline] -#[doc(alias = "IP_FREEBIND")] -pub fn get_ip_freebind(fd: Fd) -> io::Result { - backend::net::sockopt::get_ip_freebind(fd.as_fd()) -} - -/// `setsockopt(fd, IPPROTO_IPV6, IPV6_FREEBIND, value)` -/// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_ipv6_-and-set_ipv6_-functions -#[cfg(linux_kernel)] -#[inline] -#[doc(alias = "IPV6_FREEBIND")] -pub fn set_ipv6_freebind(fd: Fd, value: bool) -> io::Result<()> { - backend::net::sockopt::set_ipv6_freebind(fd.as_fd(), value) -} - -/// `getsockopt(fd, IPPROTO_IPV6, IPV6_FREEBIND)` -/// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_ipv6_-and-set_ipv6_-functions -#[cfg(linux_kernel)] -#[inline] -#[doc(alias = "IPV6_FREEBIND")] -pub fn get_ipv6_freebind(fd: Fd) -> io::Result { - backend::net::sockopt::get_ipv6_freebind(fd.as_fd()) -} - -/// `getsockopt(fd, IPPROTO_IP, SO_ORIGINAL_DST)` -/// -/// Even though this corresponnds to a `SO_*` constant, it is an `IPPROTO_IP` -/// option. -/// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_ipv6_-and-set_ipv6_-functions -#[cfg(any(linux_kernel, target_os = "fuchsia"))] -#[inline] -#[doc(alias = "SO_ORIGINAL_DST")] -pub fn get_ip_original_dst(fd: Fd) -> io::Result { - backend::net::sockopt::get_ip_original_dst(fd.as_fd()) -} - -/// `getsockopt(fd, IPPROTO_IPV6, IP6T_SO_ORIGINAL_DST)` -/// -/// Even though this corresponnds to a `IP6T_*` constant, it is an -/// `IPPROTO_IPV6` option. -/// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_ipv6_-and-set_ipv6_-functions -#[cfg(linux_kernel)] -#[inline] -#[doc(alias = "IP6T_SO_ORIGINAL_DST")] -pub fn get_ipv6_original_dst(fd: Fd) -> io::Result { - backend::net::sockopt::get_ipv6_original_dst(fd.as_fd()) -} - -/// `setsockopt(fd, IPPROTO_IPV6, IPV6_TCLASS, value)` -/// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_ipv6_-and-set_ipv6_-functions -#[cfg(not(any( - solarish, - windows, - target_os = "espidf", - target_os = "haiku", - target_os = "vita" -)))] -#[inline] -#[doc(alias = "IPV6_TCLASS")] -pub fn set_ipv6_tclass(fd: Fd, value: u32) -> io::Result<()> { - backend::net::sockopt::set_ipv6_tclass(fd.as_fd(), value) -} - -/// `getsockopt(fd, IPPROTO_IPV6, IPV6_TCLASS)` -/// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_ipv6_-and-set_ipv6_-functions -#[cfg(not(any( - solarish, - windows, - target_os = "espidf", - target_os = "haiku", - target_os = "vita" -)))] -#[inline] -#[doc(alias = "IPV6_TCLASS")] -pub fn get_ipv6_tclass(fd: Fd) -> io::Result { - backend::net::sockopt::get_ipv6_tclass(fd.as_fd()) -} - -/// `setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, value)` -/// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_tcp_-and-set_tcp_-functions +/// # References +/// - [POSIX `setsockopt`] +/// - [POSIX `netinet/tcp.h`] +/// - [Linux `setsockopt`] +/// - [Linux `tcp`] +/// - [Winsock2 `setsockopt`] +/// - [Winsock2 `IPPROTO_TCP` options] +/// - [Apple `setsockopt`] +/// - [Apple `tcp`] +/// - [FreeBSD `setsockopt`] +/// - [FreeBSD `tcp`] +/// - [NetBSD `setsockopt`] +/// - [NetBSD `tcp`] +/// - [OpenBSD `setsockopt`] +/// - [OpenBSD `tcp`] +/// - [DragonFly BSD `setsockopt`] +/// - [DragonFly BSD `tcp`] +/// - [illumos `setsockopt`] +/// - [illumos `tcp`] +/// +/// [POSIX `setsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html +/// [POSIX `netinet/tcp.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/netinet_tcp.h.html +/// [Linux `setsockopt`]: https://man7.org/linux/man-pages/man2/setsockopt.2.html +/// [Linux `tcp`]: https://man7.org/linux/man-pages/man7/tcp.7.html +/// [Winsock2 `setsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-setsockopt +/// [Winsock2 `IPPROTO_TCP` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-tcp-socket-options +/// [Apple `setsockopt`]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/setsockopt.2.html +/// [Apple `tcp`]: https://opensource.apple.com/source/xnu/xnu-7195.81.3/bsd/man/man4/tcp.4.auto.html +/// [FreeBSD `setsockopt`]: https://man.freebsd.org/cgi/man.cgi?query=setsockopt&sektion=2 +/// [FreeBSD `tcp`]: https://man.freebsd.org/cgi/man.cgi?query=tcp&sektion=4 +/// [NetBSD `setsockopt`]: https://man.netbsd.org/setsockopt.2 +/// [NetBSD `tcp`]: https://man.netbsd.org/tcp.4 +/// [OpenBSD `setsockopt`]: https://man.openbsd.org/setsockopt.2 +/// [OpenBSD `tcp`]: https://man.openbsd.org/tcp.4 +/// [DragonFly BSD `setsockopt`]: https://man.dragonflybsd.org/?command=setsockopt§ion=2 +/// [DragonFly BSD `tcp`]: https://man.dragonflybsd.org/?command=tcp§ion=4 +/// [illumos `setsockopt`]: https://illumos.org/man/3SOCKET/setsockopt +/// [illumos `tcp`]: https://illumos.org/man/4P/tcp #[inline] #[doc(alias = "TCP_NODELAY")] -pub fn set_tcp_nodelay(fd: Fd, value: bool) -> io::Result<()> { - backend::net::sockopt::set_tcp_nodelay(fd.as_fd(), value) +pub fn set_tcp_nodelay(fd: Fd, nodelay: bool) -> io::Result<()> { + backend::net::syscalls::sockopt::set_tcp_nodelay(fd.as_fd(), nodelay) } /// `getsockopt(fd, IPPROTO_TCP, TCP_NODELAY)` /// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_tcp_-and-set_tcp_-functions +/// # References +/// - [POSIX `getsockopt`] +/// - [POSIX `netinet/tcp.h`] +/// - [Linux `getsockopt`] +/// - [Linux `tcp`] +/// - [Winsock2 `getsockopt`] +/// - [Winsock2 `IPPROTO_TCP` options] +/// - [Apple `getsockopt`] +/// - [Apple `tcp`] +/// - [FreeBSD `getsockopt`] +/// - [FreeBSD `tcp`] +/// - [NetBSD `getsockopt`] +/// - [NetBSD `tcp`] +/// - [OpenBSD `getsockopt`] +/// - [OpenBSD `tcp`] +/// - [DragonFly BSD `getsockopt`] +/// - [DragonFly BSD `tcp`] +/// - [illumos `getsockopt`] +/// - [illumos `tcp`] +/// +/// [POSIX `getsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html +/// [POSIX `netinet/tcp.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/netinet_tcp.h.html +/// [Linux `getsockopt`]: https://man7.org/linux/man-pages/man2/getsockopt.2.html +/// [Linux `tcp`]: https://man7.org/linux/man-pages/man7/tcp.7.html +/// [Winsock2 `getsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-getsockopt +/// [Winsock2 `IPPROTO_TCP` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-tcp-socket-options +/// [Apple `getsockopt`]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/getsockopt.2.html +/// [Apple `tcp`]: https://opensource.apple.com/source/xnu/xnu-7195.81.3/bsd/man/man4/tcp.4.auto.html +/// [FreeBSD `getsockopt`]: https://man.freebsd.org/cgi/man.cgi?query=getsockopt&sektion=2 +/// [FreeBSD `tcp`]: https://man.freebsd.org/cgi/man.cgi?query=tcp&sektion=4 +/// [NetBSD `getsockopt`]: https://man.netbsd.org/getsockopt.2 +/// [NetBSD `tcp`]: https://man.netbsd.org/tcp.4 +/// [OpenBSD `getsockopt`]: https://man.openbsd.org/getsockopt.2 +/// [OpenBSD `tcp`]: https://man.openbsd.org/tcp.4 +/// [DragonFly BSD `getsockopt`]: https://man.dragonflybsd.org/?command=getsockopt§ion=2 +/// [DragonFly BSD `tcp`]: https://man.dragonflybsd.org/?command=tcp§ion=4 +/// [illumos `getsockopt`]: https://illumos.org/man/3SOCKET/getsockopt +/// [illumos `tcp`]: https://illumos.org/man/4P/tcp #[inline] #[doc(alias = "TCP_NODELAY")] pub fn get_tcp_nodelay(fd: Fd) -> io::Result { - backend::net::sockopt::get_tcp_nodelay(fd.as_fd()) -} - -/// `setsockopt(fd, IPPROTO_TCP, TCP_KEEPCNT, value)` -/// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_tcp_-and-set_tcp_-functions -#[cfg(not(any(target_os = "openbsd", target_os = "haiku", target_os = "nto")))] -#[inline] -#[doc(alias = "TCP_KEEPCNT")] -pub fn set_tcp_keepcnt(fd: Fd, value: u32) -> io::Result<()> { - backend::net::sockopt::set_tcp_keepcnt(fd.as_fd(), value) -} - -/// `getsockopt(fd, IPPROTO_TCP, TCP_KEEPCNT)` -/// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_tcp_-and-set_tcp_-functions -#[cfg(not(any(target_os = "openbsd", target_os = "haiku", target_os = "nto")))] -#[inline] -#[doc(alias = "TCP_KEEPCNT")] -pub fn get_tcp_keepcnt(fd: Fd) -> io::Result { - backend::net::sockopt::get_tcp_keepcnt(fd.as_fd()) -} - -/// `setsockopt(fd, IPPROTO_TCP, TCP_KEEPIDLE, value)` -/// -/// `TCP_KEEPALIVE` on Apple platforms. -/// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_tcp_-and-set_tcp_-functions -#[cfg(not(any(target_os = "openbsd", target_os = "haiku", target_os = "nto")))] -#[inline] -#[doc(alias = "TCP_KEEPIDLE")] -pub fn set_tcp_keepidle(fd: Fd, value: Duration) -> io::Result<()> { - backend::net::sockopt::set_tcp_keepidle(fd.as_fd(), value) -} - -/// `getsockopt(fd, IPPROTO_TCP, TCP_KEEPIDLE)` -/// -/// `TCP_KEEPALIVE` on Apple platforms. -/// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_tcp_-and-set_tcp_-functions -#[cfg(not(any(target_os = "openbsd", target_os = "haiku", target_os = "nto")))] -#[inline] -#[doc(alias = "TCP_KEEPIDLE")] -pub fn get_tcp_keepidle(fd: Fd) -> io::Result { - backend::net::sockopt::get_tcp_keepidle(fd.as_fd()) -} - -/// `setsockopt(fd, IPPROTO_TCP, TCP_KEEPINTVL, value)` -/// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_tcp_-and-set_tcp_-functions -#[cfg(not(any(target_os = "openbsd", target_os = "haiku", target_os = "nto")))] -#[inline] -#[doc(alias = "TCP_KEEPINTVL")] -pub fn set_tcp_keepintvl(fd: Fd, value: Duration) -> io::Result<()> { - backend::net::sockopt::set_tcp_keepintvl(fd.as_fd(), value) -} - -/// `getsockopt(fd, IPPROTO_TCP, TCP_KEEPINTVL)` -/// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_tcp_-and-set_tcp_-functions -#[cfg(not(any(target_os = "openbsd", target_os = "haiku", target_os = "nto")))] -#[inline] -#[doc(alias = "TCP_KEEPINTVL")] -pub fn get_tcp_keepintvl(fd: Fd) -> io::Result { - backend::net::sockopt::get_tcp_keepintvl(fd.as_fd()) -} - -/// `setsockopt(fd, IPPROTO_TCP, TCP_USER_TIMEOUT, value)` -/// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_tcp_-and-set_tcp_-functions -#[cfg(any(linux_like, target_os = "fuchsia"))] -#[inline] -#[doc(alias = "TCP_USER_TIMEOUT")] -pub fn set_tcp_user_timeout(fd: Fd, value: u32) -> io::Result<()> { - backend::net::sockopt::set_tcp_user_timeout(fd.as_fd(), value) -} - -/// `getsockopt(fd, IPPROTO_TCP, TCP_USER_TIMEOUT)` -/// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_tcp_-and-set_tcp_-functions -#[cfg(any(linux_like, target_os = "fuchsia"))] -#[inline] -#[doc(alias = "TCP_USER_TIMEOUT")] -pub fn get_tcp_user_timeout(fd: Fd) -> io::Result { - backend::net::sockopt::get_tcp_user_timeout(fd.as_fd()) -} - -/// `setsockopt(fd, IPPROTO_TCP, TCP_QUICKACK, value)` -/// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_tcp_-and-set_tcp_-functions -#[cfg(any(linux_like, target_os = "fuchsia"))] -#[inline] -#[doc(alias = "TCP_QUICKACK")] -pub fn set_tcp_quickack(fd: Fd, value: bool) -> io::Result<()> { - backend::net::sockopt::set_tcp_quickack(fd.as_fd(), value) -} - -/// `getsockopt(fd, IPPROTO_TCP, TCP_QUICKACK)` -/// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_tcp_-and-set_tcp_-functions -#[cfg(any(linux_like, target_os = "fuchsia"))] -#[inline] -#[doc(alias = "TCP_QUICKACK")] -pub fn get_tcp_quickack(fd: Fd) -> io::Result { - backend::net::sockopt::get_tcp_quickack(fd.as_fd()) -} - -/// `setsockopt(fd, IPPROTO_TCP, TCP_CONGESTION, value)` -/// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_tcp_-and-set_tcp_-functions -#[cfg(any( - linux_like, - target_os = "freebsd", - target_os = "fuchsia", - target_os = "illumos" -))] -#[inline] -#[doc(alias = "TCP_CONGESTION")] -pub fn set_tcp_congestion(fd: Fd, value: &str) -> io::Result<()> { - backend::net::sockopt::set_tcp_congestion(fd.as_fd(), value) -} - -/// `getsockopt(fd, IPPROTO_TCP, TCP_CONGESTION)` -/// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_tcp_-and-set_tcp_-functions -#[cfg(feature = "alloc")] -#[cfg(any( - linux_like, - target_os = "freebsd", - target_os = "fuchsia", - target_os = "illumos" -))] -#[inline] -#[doc(alias = "TCP_CONGESTION")] -pub fn get_tcp_congestion(fd: Fd) -> io::Result { - backend::net::sockopt::get_tcp_congestion(fd.as_fd()) -} - -/// `setsockopt(fd, IPPROTO_TCP, TCP_THIN_LINEAR_TIMEOUTS, value)` -/// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_tcp_-and-set_tcp_-functions -#[cfg(any(linux_like, target_os = "fuchsia"))] -#[inline] -#[doc(alias = "TCP_THIN_LINEAR_TIMEOUTS")] -pub fn set_tcp_thin_linear_timeouts(fd: Fd, value: bool) -> io::Result<()> { - backend::net::sockopt::set_tcp_thin_linear_timeouts(fd.as_fd(), value) -} - -/// `getsockopt(fd, IPPROTO_TCP, TCP_THIN_LINEAR_TIMEOUTS)` -/// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_tcp_-and-set_tcp_-functions -#[cfg(any(linux_like, target_os = "fuchsia"))] -#[inline] -#[doc(alias = "TCP_THIN_LINEAR_TIMEOUTS")] -pub fn get_tcp_thin_linear_timeouts(fd: Fd) -> io::Result { - backend::net::sockopt::get_tcp_thin_linear_timeouts(fd.as_fd()) -} - -/// `setsockopt(fd, IPPROTO_TCP, TCP_CORK, value)` -/// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_tcp_-and-set_tcp_-functions -#[cfg(any(linux_like, solarish, target_os = "fuchsia"))] -#[inline] -#[doc(alias = "TCP_CORK")] -pub fn set_tcp_cork(fd: Fd, value: bool) -> io::Result<()> { - backend::net::sockopt::set_tcp_cork(fd.as_fd(), value) -} - -/// `getsockopt(fd, IPPROTO_TCP, TCP_CORK)` -/// -/// See the [module-level documentation] for more. -/// -/// [module-level documentation]: self#references-for-get_tcp_-and-set_tcp_-functions -#[cfg(any(linux_like, solarish, target_os = "fuchsia"))] -#[inline] -#[doc(alias = "TCP_CORK")] -pub fn get_tcp_cork(fd: Fd) -> io::Result { - backend::net::sockopt::get_tcp_cork(fd.as_fd()) -} - -/// Get credentials of Unix domain socket peer process -/// -/// # References -/// - [Linux `unix`] -/// -/// [Linux `unix`]: https://man7.org/linux/man-pages/man7/unix.7.html -#[cfg(linux_kernel)] -#[doc(alias = "SO_PEERCRED")] -pub fn get_socket_peercred(fd: Fd) -> io::Result { - backend::net::sockopt::get_socket_peercred(fd.as_fd()) + backend::net::syscalls::sockopt::get_tcp_nodelay(fd.as_fd()) } #[test] diff -Nru temporalio-1.3.0/vendor/rustix/src/net/types.rs temporalio-1.3.0/vendor/rustix/src/net/types.rs --- temporalio-1.3.0/vendor/rustix/src/net/types.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/net/types.rs 2023-10-30 19:40:00.000000000 +0000 @@ -4,6 +4,7 @@ use bitflags::bitflags; /// A type for holding raw integer socket types. +#[doc(hidden)] pub type RawSocketType = u32; /// `SOCK_*` constants for use with [`socket`]. @@ -47,14 +48,11 @@ } /// A type for holding raw integer address families. +#[doc(hidden)] pub type RawAddressFamily = c::sa_family_t; /// `AF_*` constants for use with [`socket`], [`socket_with`], and /// [`socketpair`]. -/// -/// [`socket`]: crate::net::socket() -/// [`socket_with`]: crate::net::socket_with -/// [`socketpair`]: crate::net::socketpair() #[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)] #[repr(transparent)] pub struct AddressFamily(pub(crate) RawAddressFamily); @@ -88,11 +86,9 @@ bsd, solarish, windows, - target_os = "aix", target_os = "espidf", target_os = "haiku", target_os = "nto", - target_os = "vita", )))] pub const NETLINK: Self = Self(c::AF_NETLINK as _); /// `AF_UNIX`, aka `AF_LOCAL` @@ -103,33 +99,25 @@ bsd, solarish, windows, - target_os = "aix", target_os = "espidf", target_os = "haiku", target_os = "nto", - target_os = "vita", )))] pub const AX25: Self = Self(c::AF_AX25 as _); /// `AF_IPX` - #[cfg(not(any( - target_os = "aix", - target_os = "espidf", - target_os = "vita", - )))] + #[cfg(not(target_os = "espidf"))] pub const IPX: Self = Self(c::AF_IPX as _); /// `AF_APPLETALK` - #[cfg(not(any(target_os = "espidf", target_os = "vita")))] + #[cfg(not(target_os = "espidf"))] pub const APPLETALK: Self = Self(c::AF_APPLETALK as _); /// `AF_NETROM` #[cfg(not(any( bsd, solarish, windows, - target_os = "aix", target_os = "espidf", target_os = "haiku", target_os = "nto", - target_os = "vita", )))] pub const NETROM: Self = Self(c::AF_NETROM as _); /// `AF_BRIDGE` @@ -137,11 +125,9 @@ bsd, solarish, windows, - target_os = "aix", target_os = "espidf", target_os = "haiku", target_os = "nto", - target_os = "vita", )))] pub const BRIDGE: Self = Self(c::AF_BRIDGE as _); /// `AF_ATMPVC` @@ -149,22 +135,18 @@ bsd, solarish, windows, - target_os = "aix", target_os = "espidf", target_os = "haiku", target_os = "nto", - target_os = "vita", )))] pub const ATMPVC: Self = Self(c::AF_ATMPVC as _); /// `AF_X25` #[cfg(not(any( bsd, windows, - target_os = "aix", target_os = "espidf", target_os = "haiku", target_os = "nto", - target_os = "vita", )))] pub const X25: Self = Self(c::AF_X25 as _); /// `AF_ROSE` @@ -172,26 +154,22 @@ bsd, solarish, windows, - target_os = "aix", target_os = "espidf", target_os = "haiku", target_os = "nto", - target_os = "vita", )))] pub const ROSE: Self = Self(c::AF_ROSE as _); /// `AF_DECnet` - #[cfg(not(any(target_os = "espidf", target_os = "haiku", target_os = "vita")))] + #[cfg(not(any(target_os = "espidf", target_os = "haiku")))] pub const DECnet: Self = Self(c::AF_DECnet as _); /// `AF_NETBEUI` #[cfg(not(any( bsd, solarish, windows, - target_os = "aix", target_os = "espidf", target_os = "haiku", target_os = "nto", - target_os = "vita", )))] pub const NETBEUI: Self = Self(c::AF_NETBEUI as _); /// `AF_SECURITY` @@ -199,22 +177,18 @@ bsd, solarish, windows, - target_os = "aix", target_os = "espidf", target_os = "haiku", target_os = "nto", - target_os = "vita", )))] pub const SECURITY: Self = Self(c::AF_SECURITY as _); /// `AF_KEY` #[cfg(not(any( bsd, windows, - target_os = "aix", target_os = "espidf", target_os = "haiku", target_os = "nto", - target_os = "vita", )))] pub const KEY: Self = Self(c::AF_KEY as _); /// `AF_PACKET` @@ -226,11 +200,9 @@ #[cfg(not(any( bsd, windows, - target_os = "aix", target_os = "espidf", target_os = "haiku", target_os = "nto", - target_os = "vita", )))] pub const PACKET: Self = Self(c::AF_PACKET as _); /// `AF_ASH` @@ -238,11 +210,9 @@ bsd, solarish, windows, - target_os = "aix", target_os = "espidf", target_os = "haiku", target_os = "nto", - target_os = "vita", )))] pub const ASH: Self = Self(c::AF_ASH as _); /// `AF_ECONET` @@ -250,11 +220,9 @@ bsd, solarish, windows, - target_os = "aix", target_os = "espidf", target_os = "haiku", target_os = "nto", - target_os = "vita", )))] pub const ECONET: Self = Self(c::AF_ECONET as _); /// `AF_ATMSVC` @@ -262,11 +230,9 @@ bsd, solarish, windows, - target_os = "aix", target_os = "espidf", target_os = "haiku", target_os = "nto", - target_os = "vita", )))] pub const ATMSVC: Self = Self(c::AF_ATMSVC as _); /// `AF_RDS` @@ -274,25 +240,21 @@ bsd, solarish, windows, - target_os = "aix", target_os = "espidf", target_os = "haiku", target_os = "nto", - target_os = "vita", )))] pub const RDS: Self = Self(c::AF_RDS as _); /// `AF_SNA` - #[cfg(not(any(target_os = "espidf", target_os = "haiku", target_os = "vita")))] + #[cfg(not(any(target_os = "espidf", target_os = "haiku")))] pub const SNA: Self = Self(c::AF_SNA as _); /// `AF_IRDA` #[cfg(not(any( bsd, solarish, - target_os = "aix", target_os = "espidf", target_os = "haiku", target_os = "nto", - target_os = "vita", )))] pub const IRDA: Self = Self(c::AF_IRDA as _); /// `AF_PPPOX` @@ -300,11 +262,9 @@ bsd, solarish, windows, - target_os = "aix", target_os = "espidf", target_os = "haiku", target_os = "nto", - target_os = "vita", )))] pub const PPPOX: Self = Self(c::AF_PPPOX as _); /// `AF_WANPIPE` @@ -312,11 +272,9 @@ bsd, solarish, windows, - target_os = "aix", target_os = "espidf", target_os = "haiku", target_os = "nto", - target_os = "vita", )))] pub const WANPIPE: Self = Self(c::AF_WANPIPE as _); /// `AF_LLC` @@ -324,11 +282,9 @@ bsd, solarish, windows, - target_os = "aix", target_os = "espidf", target_os = "haiku", target_os = "nto", - target_os = "vita", )))] pub const LLC: Self = Self(c::AF_LLC as _); /// `AF_CAN` @@ -336,11 +292,9 @@ bsd, solarish, windows, - target_os = "aix", target_os = "espidf", target_os = "haiku", target_os = "nto", - target_os = "vita", )))] pub const CAN: Self = Self(c::AF_CAN as _); /// `AF_TIPC` @@ -348,33 +302,22 @@ bsd, solarish, windows, - target_os = "aix", target_os = "espidf", target_os = "haiku", target_os = "nto", - target_os = "vita", )))] pub const TIPC: Self = Self(c::AF_TIPC as _); /// `AF_BLUETOOTH` - #[cfg(not(any( - apple, - solarish, - windows, - target_os = "aix", - target_os = "espidf", - target_os = "vita", - )))] + #[cfg(not(any(apple, solarish, windows, target_os = "espidf")))] pub const BLUETOOTH: Self = Self(c::AF_BLUETOOTH as _); /// `AF_IUCV` #[cfg(not(any( bsd, solarish, windows, - target_os = "aix", target_os = "espidf", target_os = "haiku", target_os = "nto", - target_os = "vita", )))] pub const IUCV: Self = Self(c::AF_IUCV as _); /// `AF_RXRPC` @@ -382,33 +325,22 @@ bsd, solarish, windows, - target_os = "aix", target_os = "espidf", target_os = "haiku", target_os = "nto", - target_os = "vita", )))] pub const RXRPC: Self = Self(c::AF_RXRPC as _); /// `AF_ISDN` - #[cfg(not(any( - solarish, - windows, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "vita", - )))] + #[cfg(not(any(solarish, windows, target_os = "espidf", target_os = "haiku")))] pub const ISDN: Self = Self(c::AF_ISDN as _); /// `AF_PHONET` #[cfg(not(any( bsd, solarish, windows, - target_os = "aix", target_os = "espidf", target_os = "haiku", target_os = "nto", - target_os = "vita", )))] pub const PHONET: Self = Self(c::AF_PHONET as _); /// `AF_IEEE802154` @@ -416,11 +348,9 @@ bsd, solarish, windows, - target_os = "aix", target_os = "espidf", target_os = "haiku", target_os = "nto", - target_os = "vita", )))] pub const IEEE802154: Self = Self(c::AF_IEEE802154 as _); /// `AF_802` @@ -481,7 +411,7 @@ #[cfg(any(bsd, solarish, target_os = "aix", target_os = "nto"))] pub const IMPLINK: Self = Self(c::AF_IMPLINK as _); /// `AF_IEEE80211` - #[cfg(any(apple, freebsdlike, target_os = "netbsd"))] + #[cfg(any(apple, freebsdlike, linuxlike, target_os = "netbsd"))] pub const IEEE80211: Self = Self(c::AF_IEEE80211 as _); /// `AF_INET6_SDP` #[cfg(target_os = "freebsd")] @@ -508,7 +438,7 @@ #[cfg(any(netbsdlike, target_os = "dragonfly", target_os = "emscripten", target_os = "fuchsia"))] pub const MPLS: Self = Self(c::AF_MPLS as _); /// `AF_NATM` - #[cfg(any(bsd, target_os = "nto"))] + #[cfg(any(bsd, target_os = "aix", target_os = "nto"))] pub const NATM: Self = Self(c::AF_NATM as _); /// `AF_NBS` #[cfg(solarish)] @@ -568,7 +498,7 @@ #[cfg(target_os = "freebsd")] pub const SCLUSTER: Self = Self(c::AF_SCLUSTER as _); /// `AF_SIP` - #[cfg(any(apple, target_os = "freebsd", target_os = "openbsd"))] + #[cfg(any(apple, target_os = "freebsd", target_os = "opensbd"))] pub const SIP: Self = Self(c::AF_SIP as _); /// `AF_SLOW` #[cfg(target_os = "freebsd")] @@ -603,6 +533,7 @@ } /// A type for holding raw integer protocols. +#[doc(hidden)] pub type RawProtocol = core::num::NonZeroU32; const fn new_raw_protocol(u: u32) -> RawProtocol { @@ -638,119 +569,61 @@ /// `IPPROTO_ICMP` pub const ICMP: Protocol = Protocol(new_raw_protocol(c::IPPROTO_ICMP as _)); /// `IPPROTO_IGMP` - #[cfg(not(any( - solarish, - target_os = "espidf", - target_os = "haiku", - target_os = "vita" - )))] + #[cfg(not(any(solarish, target_os = "espidf", target_os = "haiku")))] pub const IGMP: Protocol = Protocol(new_raw_protocol(c::IPPROTO_IGMP as _)); /// `IPPROTO_IPIP` - #[cfg(not(any( - solarish, - windows, - target_os = "espidf", - target_os = "haiku", - target_os = "vita" - )))] + #[cfg(not(any(solarish, windows, target_os = "espidf", target_os = "haiku")))] pub const IPIP: Protocol = Protocol(new_raw_protocol(c::IPPROTO_IPIP as _)); /// `IPPROTO_TCP` pub const TCP: Protocol = Protocol(new_raw_protocol(c::IPPROTO_TCP as _)); /// `IPPROTO_EGP` - #[cfg(not(any( - solarish, - target_os = "espidf", - target_os = "haiku", - target_os = "vita" - )))] + #[cfg(not(any(solarish, target_os = "espidf", target_os = "haiku")))] pub const EGP: Protocol = Protocol(new_raw_protocol(c::IPPROTO_EGP as _)); /// `IPPROTO_PUP` - #[cfg(not(any( - solarish, - target_os = "espidf", - target_os = "haiku", - target_os = "vita" - )))] + #[cfg(not(any(solarish, target_os = "espidf", target_os = "haiku")))] pub const PUP: Protocol = Protocol(new_raw_protocol(c::IPPROTO_PUP as _)); /// `IPPROTO_UDP` pub const UDP: Protocol = Protocol(new_raw_protocol(c::IPPROTO_UDP as _)); /// `IPPROTO_IDP` - #[cfg(not(any( - solarish, - target_os = "espidf", - target_os = "haiku", - target_os = "vita" - )))] + #[cfg(not(any(solarish, target_os = "espidf", target_os = "haiku")))] pub const IDP: Protocol = Protocol(new_raw_protocol(c::IPPROTO_IDP as _)); /// `IPPROTO_TP` - #[cfg(not(any( - solarish, - windows, - target_os = "espidf", - target_os = "haiku", - target_os = "vita" - )))] + #[cfg(not(any(solarish, windows, target_os = "espidf", target_os = "haiku")))] pub const TP: Protocol = Protocol(new_raw_protocol(c::IPPROTO_TP as _)); /// `IPPROTO_DCCP` #[cfg(not(any( apple, solarish, windows, - target_os = "aix", target_os = "dragonfly", target_os = "espidf", target_os = "haiku", target_os = "nto", target_os = "openbsd", - target_os = "vita", )))] pub const DCCP: Protocol = Protocol(new_raw_protocol(c::IPPROTO_DCCP as _)); /// `IPPROTO_IPV6` pub const IPV6: Protocol = Protocol(new_raw_protocol(c::IPPROTO_IPV6 as _)); /// `IPPROTO_RSVP` - #[cfg(not(any( - solarish, - windows, - target_os = "espidf", - target_os = "haiku", - target_os = "vita" - )))] + #[cfg(not(any(solarish, windows, target_os = "espidf", target_os = "haiku")))] pub const RSVP: Protocol = Protocol(new_raw_protocol(c::IPPROTO_RSVP as _)); /// `IPPROTO_GRE` - #[cfg(not(any( - solarish, - windows, - target_os = "espidf", - target_os = "haiku", - target_os = "vita" - )))] + #[cfg(not(any(solarish, windows, target_os = "espidf", target_os = "haiku")))] pub const GRE: Protocol = Protocol(new_raw_protocol(c::IPPROTO_GRE as _)); /// `IPPROTO_ESP` - #[cfg(not(any( - solarish, - target_os = "espidf", - target_os = "haiku", - target_os = "vita" - )))] + #[cfg(not(any(solarish, target_os = "espidf", target_os = "haiku")))] pub const ESP: Protocol = Protocol(new_raw_protocol(c::IPPROTO_ESP as _)); /// `IPPROTO_AH` - #[cfg(not(any( - solarish, - target_os = "espidf", - target_os = "haiku", - target_os = "vita" - )))] + #[cfg(not(any(solarish, target_os = "espidf", target_os = "haiku")))] pub const AH: Protocol = Protocol(new_raw_protocol(c::IPPROTO_AH as _)); /// `IPPROTO_MTP` #[cfg(not(any( solarish, netbsdlike, windows, - target_os = "aix", target_os = "espidf", target_os = "haiku", target_os = "nto", - target_os = "vita", )))] pub const MTP: Protocol = Protocol(new_raw_protocol(c::IPPROTO_MTP as _)); /// `IPPROTO_BEETPH` @@ -758,42 +631,25 @@ bsd, solarish, windows, - target_os = "aix", target_os = "espidf", target_os = "haiku", - target_os = "nto", - target_os = "vita", + target_os = "nto" )))] pub const BEETPH: Protocol = Protocol(new_raw_protocol(c::IPPROTO_BEETPH as _)); /// `IPPROTO_ENCAP` - #[cfg(not(any( - solarish, - windows, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "vita", - )))] + #[cfg(not(any(solarish, windows, target_os = "espidf", target_os = "haiku")))] pub const ENCAP: Protocol = Protocol(new_raw_protocol(c::IPPROTO_ENCAP as _)); /// `IPPROTO_PIM` - #[cfg(not(any( - solarish, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "vita" - )))] + #[cfg(not(any(solarish, target_os = "espidf", target_os = "haiku")))] pub const PIM: Protocol = Protocol(new_raw_protocol(c::IPPROTO_PIM as _)); /// `IPPROTO_COMP` #[cfg(not(any( bsd, solarish, windows, - target_os = "aix", target_os = "espidf", target_os = "haiku", - target_os = "nto", - target_os = "vita", + target_os = "nto" )))] pub const COMP: Protocol = Protocol(new_raw_protocol(c::IPPROTO_COMP as _)); /// `IPPROTO_SCTP` @@ -802,8 +658,7 @@ target_os = "dragonfly", target_os = "espidf", target_os = "haiku", - target_os = "openbsd", - target_os = "vita", + target_os = "openbsd" )))] pub const SCTP: Protocol = Protocol(new_raw_protocol(c::IPPROTO_SCTP as _)); /// `IPPROTO_UDPLITE` @@ -812,12 +667,10 @@ netbsdlike, solarish, windows, - target_os = "aix", target_os = "dragonfly", target_os = "espidf", target_os = "haiku", target_os = "nto", - target_os = "vita", )))] pub const UDPLITE: Protocol = Protocol(new_raw_protocol(c::IPPROTO_UDPLITE as _)); /// `IPPROTO_MPLS` @@ -825,42 +678,33 @@ apple, solarish, windows, - target_os = "aix", target_os = "dragonfly", target_os = "espidf", target_os = "haiku", target_os = "netbsd", target_os = "nto", - target_os = "vita", )))] pub const MPLS: Protocol = Protocol(new_raw_protocol(c::IPPROTO_MPLS as _)); /// `IPPROTO_ETHERNET` #[cfg(linux_kernel)] pub const ETHERNET: Protocol = Protocol(new_raw_protocol(c::IPPROTO_ETHERNET as _)); /// `IPPROTO_RAW` - #[cfg(not(any(target_os = "espidf", target_os = "vita")))] + #[cfg(not(target_os = "espidf"))] pub const RAW: Protocol = Protocol(new_raw_protocol(c::IPPROTO_RAW as _)); /// `IPPROTO_MPTCP` #[cfg(not(any( bsd, solarish, windows, - target_os = "aix", target_os = "emscripten", target_os = "espidf", target_os = "fuchsia", target_os = "haiku", target_os = "nto", - target_os = "vita", )))] pub const MPTCP: Protocol = Protocol(new_raw_protocol(c::IPPROTO_MPTCP as _)); /// `IPPROTO_FRAGMENT` - #[cfg(not(any( - solarish, - target_os = "espidf", - target_os = "haiku", - target_os = "vita" - )))] + #[cfg(not(any(solarish, target_os = "espidf", target_os = "haiku")))] pub const FRAGMENT: Protocol = Protocol(new_raw_protocol(c::IPPROTO_FRAGMENT as _)); /// `IPPROTO_ICMPV6` pub const ICMPV6: Protocol = Protocol(new_raw_protocol(c::IPPROTO_ICMPV6 as _)); @@ -874,16 +718,10 @@ target_os = "espidf", target_os = "haiku", target_os = "nto", - target_os = "vita", )))] pub const MH: Protocol = Protocol(new_raw_protocol(c::IPPROTO_MH as _)); /// `IPPROTO_ROUTING` - #[cfg(not(any( - solarish, - target_os = "espidf", - target_os = "haiku", - target_os = "vita" - )))] + #[cfg(not(any(solarish, target_os = "espidf", target_os = "haiku")))] pub const ROUTING: Protocol = Protocol(new_raw_protocol(c::IPPROTO_ROUTING as _)); } @@ -1424,46 +1262,15 @@ #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] pub struct SocketFlags: c::c_uint { /// `SOCK_NONBLOCK` - #[cfg(not(any( - apple, - windows, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "nto", - target_os = "vita", - )))] + #[cfg(not(any(apple, windows, target_os = "espidf", target_os = "haiku", target_os = "nto")))] const NONBLOCK = bitcast!(c::SOCK_NONBLOCK); /// `SOCK_CLOEXEC` - #[cfg(not(any(apple, windows, target_os = "aix", target_os = "haiku")))] + #[cfg(not(any(apple, windows, target_os = "haiku")))] const CLOEXEC = bitcast!(c::SOCK_CLOEXEC); - - // This deliberately lacks a `const _ = !0`, so that users can use - // `from_bits_truncate` to extract the `SocketFlags` from a flags - // value that also includes a `SocketType`. } } -/// UNIX credentials of socket peer, for use with [`get_socket_peercred`] -/// [`SendAncillaryMessage::ScmCredentials`] and -/// [`RecvAncillaryMessage::ScmCredentials`]. -/// -/// [`get_socket_peercred`]: crate::net::sockopt::get_socket_peercred -/// [`SendAncillaryMessage::ScmCredentials`]: crate::net::SendAncillaryMessage::ScmCredentials -/// [`RecvAncillaryMessage::ScmCredentials`]: crate::net::RecvAncillaryMessage::ScmCredentials -#[cfg(linux_kernel)] -#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)] -#[repr(C)] -pub struct UCred { - /// Process ID of peer - pub pid: crate::pid::Pid, - /// User ID of peer - pub uid: crate::ugid::Uid, - /// Group ID of peer - pub gid: crate::ugid::Gid, -} - #[test] fn test_sizes() { use c::c_int; @@ -1489,7 +1296,4 @@ let t: Option = Some(Protocol::from_raw(RawProtocol::new(4567).unwrap())); assert_eq!(4567_u32, transmute::, u32>(t)); } - - #[cfg(linux_kernel)] - assert_eq_size!(UCred, libc::ucred); } diff -Nru temporalio-1.3.0/vendor/rustix/src/param/auxv.rs temporalio-1.3.0/vendor/rustix/src/param/auxv.rs --- temporalio-1.3.0/vendor/rustix/src/param/auxv.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/param/auxv.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,9 +1,12 @@ use crate::backend; #[cfg(any( linux_raw, - any( - all(target_os = "android", target_pointer_width = "64"), - target_os = "linux", + all( + libc, + any( + all(target_os = "android", target_pointer_width = "64"), + target_os = "linux", + ) ) ))] use crate::ffi::CStr; @@ -36,7 +39,7 @@ /// /// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/sysconf.html /// [Linux]: https://man7.org/linux/man-pages/man3/sysconf.3.html -#[cfg(not(any(target_os = "vita", target_os = "wasi")))] +#[cfg(not(target_os = "wasi"))] #[inline] #[doc(alias = "_SC_CLK_TCK")] pub fn clock_ticks_per_second() -> u64 { @@ -55,9 +58,12 @@ /// [Linux]: https://man7.org/linux/man-pages/man3/getauxval.3.html #[cfg(any( linux_raw, - any( - all(target_os = "android", target_pointer_width = "64"), - target_os = "linux", + all( + libc, + any( + all(target_os = "android", target_pointer_width = "64"), + target_os = "linux", + ) ) ))] #[inline] @@ -76,9 +82,12 @@ /// [Linux]: https://man7.org/linux/man-pages/man3/getauxval.3.html #[cfg(any( linux_raw, - any( - all(target_os = "android", target_pointer_width = "64"), - target_os = "linux", + all( + libc, + any( + all(target_os = "android", target_pointer_width = "64"), + target_os = "linux", + ) ) ))] #[inline] diff -Nru temporalio-1.3.0/vendor/rustix/src/param/init.rs temporalio-1.3.0/vendor/rustix/src/param/init.rs --- temporalio-1.3.0/vendor/rustix/src/param/init.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/param/init.rs 2023-10-30 19:40:00.000000000 +0000 @@ -2,8 +2,8 @@ //! //! # Safety //! -//! When "use-explicitly-provided-auxv" is enabled, the `init` function must be -//! called before any other function in this module. It is unsafe because it +//! On mustang, or on any non-glibc non-musl platform, the `init` function must +//! be called before any other function in this module. It is unsafe because it //! operates on raw pointers. #![allow(unsafe_code)] diff -Nru temporalio-1.3.0/vendor/rustix/src/param/mod.rs temporalio-1.3.0/vendor/rustix/src/param/mod.rs --- temporalio-1.3.0/vendor/rustix/src/param/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/param/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -6,9 +6,9 @@ //! between different processes on the same system. mod auxv; -#[cfg(feature = "use-explicitly-provided-auxv")] +#[cfg(target_vendor = "mustang")] mod init; pub use auxv::*; -#[cfg(feature = "use-explicitly-provided-auxv")] +#[cfg(target_vendor = "mustang")] pub use init::init; diff -Nru temporalio-1.3.0/vendor/rustix/src/path/arg.rs temporalio-1.3.0/vendor/rustix/src/path/arg.rs --- temporalio-1.3.0/vendor/rustix/src/path/arg.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/path/arg.rs 2023-10-30 19:40:00.000000000 +0000 @@ -5,13 +5,16 @@ //! to rustix APIs with string arguments, and it allows rustix to implement //! NUL-termination without the need for copying where possible. -use crate::ffi::CStr; +use crate::ffi::{CStr, CString}; use crate::io; #[cfg(feature = "itoa")] use crate::path::DecInt; use crate::path::SMALL_PATH_BUFFER_SIZE; -#[cfg(all(feature = "alloc", feature = "itoa"))] +use alloc::borrow::Cow; +#[cfg(feature = "itoa")] use alloc::borrow::ToOwned; +use alloc::string::String; +use alloc::vec::Vec; use core::mem::MaybeUninit; use core::{ptr, slice, str}; #[cfg(feature = "std")] @@ -26,17 +29,13 @@ use std::os::wasi::ffi::{OsStrExt, OsStringExt}; #[cfg(feature = "std")] use std::path::{Component, Components, Iter, Path, PathBuf}; -#[cfg(feature = "alloc")] -use {crate::ffi::CString, alloc::borrow::Cow}; -#[cfg(feature = "alloc")] -use {alloc::string::String, alloc::vec::Vec}; /// A trait for passing path arguments. /// /// This is similar to [`AsRef`]`<`[`Path`]`>`, but is implemented for more /// kinds of strings and can convert into more kinds of strings. /// -/// # Examples +/// # Example /// /// ``` /// # #[cfg(any(feature = "fs", feature = "net"))] @@ -68,16 +67,13 @@ /// Returns a potentially-lossy rendering of this string as a /// `Cow<'_, str>`. - #[cfg(feature = "alloc")] fn to_string_lossy(&self) -> Cow<'_, str>; /// Returns a view of this string as a maybe-owned [`CStr`]. - #[cfg(feature = "alloc")] fn as_cow_c_str(&self) -> io::Result>; /// Consumes `self` and returns a view of this string as a maybe-owned /// [`CStr`]. - #[cfg(feature = "alloc")] fn into_c_str<'b>(self) -> io::Result> where Self: 'b; @@ -95,13 +91,11 @@ Ok(self) } - #[cfg(feature = "alloc")] #[inline] fn to_string_lossy(&self) -> Cow<'_, str> { Cow::Borrowed(self) } - #[cfg(feature = "alloc")] #[inline] fn as_cow_c_str(&self) -> io::Result> { Ok(Cow::Owned( @@ -109,7 +103,6 @@ )) } - #[cfg(feature = "alloc")] #[inline] fn into_c_str<'b>(self) -> io::Result> where @@ -130,20 +123,17 @@ } } -#[cfg(feature = "alloc")] impl Arg for &String { #[inline] fn as_str(&self) -> io::Result<&str> { Ok(self) } - #[cfg(feature = "alloc")] #[inline] fn to_string_lossy(&self) -> Cow<'_, str> { Cow::Borrowed(self) } - #[cfg(feature = "alloc")] #[inline] fn as_cow_c_str(&self) -> io::Result> { Ok(Cow::Owned( @@ -151,7 +141,6 @@ )) } - #[cfg(feature = "alloc")] #[inline] fn into_c_str<'b>(self) -> io::Result> where @@ -170,20 +159,17 @@ } } -#[cfg(feature = "alloc")] impl Arg for String { #[inline] fn as_str(&self) -> io::Result<&str> { Ok(self) } - #[cfg(feature = "alloc")] #[inline] fn to_string_lossy(&self) -> Cow<'_, str> { Cow::Borrowed(self) } - #[cfg(feature = "alloc")] #[inline] fn as_cow_c_str(&self) -> io::Result> { Ok(Cow::Owned( @@ -191,7 +177,6 @@ )) } - #[cfg(feature = "alloc")] #[inline] fn into_c_str<'b>(self) -> io::Result> where @@ -219,13 +204,11 @@ self.to_str().ok_or(io::Errno::INVAL) } - #[cfg(feature = "alloc")] #[inline] fn to_string_lossy(&self) -> Cow<'_, str> { OsStr::to_string_lossy(self) } - #[cfg(feature = "alloc")] #[inline] fn as_cow_c_str(&self) -> io::Result> { Ok(Cow::Owned( @@ -233,7 +216,6 @@ )) } - #[cfg(feature = "alloc")] #[inline] fn into_c_str<'b>(self) -> io::Result> where @@ -261,13 +243,11 @@ OsString::as_os_str(self).to_str().ok_or(io::Errno::INVAL) } - #[cfg(feature = "alloc")] #[inline] fn to_string_lossy(&self) -> Cow<'_, str> { self.as_os_str().to_string_lossy() } - #[cfg(feature = "alloc")] #[inline] fn as_cow_c_str(&self) -> io::Result> { Ok(Cow::Owned( @@ -276,7 +256,6 @@ )) } - #[cfg(feature = "alloc")] #[inline] fn into_c_str<'b>(self) -> io::Result> where @@ -302,13 +281,11 @@ self.as_os_str().to_str().ok_or(io::Errno::INVAL) } - #[cfg(feature = "alloc")] #[inline] fn to_string_lossy(&self) -> Cow<'_, str> { self.as_os_str().to_string_lossy() } - #[cfg(feature = "alloc")] #[inline] fn as_cow_c_str(&self) -> io::Result> { Ok(Cow::Owned( @@ -316,7 +293,6 @@ )) } - #[cfg(feature = "alloc")] #[inline] fn into_c_str<'b>(self) -> io::Result> where @@ -344,13 +320,11 @@ self.as_os_str().to_str().ok_or(io::Errno::INVAL) } - #[cfg(feature = "alloc")] #[inline] fn to_string_lossy(&self) -> Cow<'_, str> { Path::to_string_lossy(self) } - #[cfg(feature = "alloc")] #[inline] fn as_cow_c_str(&self) -> io::Result> { Ok(Cow::Owned( @@ -358,7 +332,6 @@ )) } - #[cfg(feature = "alloc")] #[inline] fn into_c_str<'b>(self) -> io::Result> where @@ -389,13 +362,11 @@ .ok_or(io::Errno::INVAL) } - #[cfg(feature = "alloc")] #[inline] fn to_string_lossy(&self) -> Cow<'_, str> { self.as_path().to_string_lossy() } - #[cfg(feature = "alloc")] #[inline] fn as_cow_c_str(&self) -> io::Result> { Ok(Cow::Owned( @@ -404,7 +375,6 @@ )) } - #[cfg(feature = "alloc")] #[inline] fn into_c_str<'b>(self) -> io::Result> where @@ -430,13 +400,11 @@ self.as_os_str().to_str().ok_or(io::Errno::INVAL) } - #[cfg(feature = "alloc")] #[inline] fn to_string_lossy(&self) -> Cow<'_, str> { self.as_os_str().to_string_lossy() } - #[cfg(feature = "alloc")] #[inline] fn as_cow_c_str(&self) -> io::Result> { Ok(Cow::Owned( @@ -444,7 +412,6 @@ )) } - #[cfg(feature = "alloc")] #[inline] fn into_c_str<'b>(self) -> io::Result> where @@ -474,19 +441,16 @@ self.to_str().map_err(|_utf8_err| io::Errno::INVAL) } - #[cfg(feature = "alloc")] #[inline] fn to_string_lossy(&self) -> Cow<'_, str> { CStr::to_string_lossy(self) } - #[cfg(feature = "alloc")] #[inline] fn as_cow_c_str(&self) -> io::Result> { Ok(Cow::Borrowed(self)) } - #[cfg(feature = "alloc")] #[inline] fn into_c_str<'b>(self) -> io::Result> where @@ -505,26 +469,22 @@ } } -#[cfg(feature = "alloc")] impl Arg for &CString { #[inline] fn as_str(&self) -> io::Result<&str> { unimplemented!() } - #[cfg(feature = "alloc")] #[inline] fn to_string_lossy(&self) -> Cow<'_, str> { unimplemented!() } - #[cfg(feature = "alloc")] #[inline] fn as_cow_c_str(&self) -> io::Result> { Ok(Cow::Borrowed(self)) } - #[cfg(feature = "alloc")] #[inline] fn into_c_str<'b>(self) -> io::Result> where @@ -543,26 +503,22 @@ } } -#[cfg(feature = "alloc")] impl Arg for CString { #[inline] fn as_str(&self) -> io::Result<&str> { self.to_str().map_err(|_utf8_err| io::Errno::INVAL) } - #[cfg(feature = "alloc")] #[inline] fn to_string_lossy(&self) -> Cow<'_, str> { CStr::to_string_lossy(self) } - #[cfg(feature = "alloc")] #[inline] fn as_cow_c_str(&self) -> io::Result> { Ok(Cow::Borrowed(self)) } - #[cfg(feature = "alloc")] #[inline] fn into_c_str<'b>(self) -> io::Result> where @@ -581,20 +537,17 @@ } } -#[cfg(feature = "alloc")] impl<'a> Arg for Cow<'a, str> { #[inline] fn as_str(&self) -> io::Result<&str> { Ok(self) } - #[cfg(feature = "alloc")] #[inline] fn to_string_lossy(&self) -> Cow<'_, str> { Cow::Borrowed(self) } - #[cfg(feature = "alloc")] #[inline] fn as_cow_c_str(&self) -> io::Result> { Ok(Cow::Owned( @@ -602,7 +555,6 @@ )) } - #[cfg(feature = "alloc")] #[inline] fn into_c_str<'b>(self) -> io::Result> where @@ -628,20 +580,17 @@ } #[cfg(feature = "std")] -#[cfg(feature = "alloc")] impl<'a> Arg for Cow<'a, OsStr> { #[inline] fn as_str(&self) -> io::Result<&str> { (**self).to_str().ok_or(io::Errno::INVAL) } - #[cfg(feature = "alloc")] #[inline] fn to_string_lossy(&self) -> Cow<'_, str> { (**self).to_string_lossy() } - #[cfg(feature = "alloc")] #[inline] fn as_cow_c_str(&self) -> io::Result> { Ok(Cow::Owned( @@ -649,7 +598,6 @@ )) } - #[cfg(feature = "alloc")] #[inline] fn into_c_str<'b>(self) -> io::Result> where @@ -674,27 +622,23 @@ } } -#[cfg(feature = "alloc")] impl<'a> Arg for Cow<'a, CStr> { #[inline] fn as_str(&self) -> io::Result<&str> { self.to_str().map_err(|_utf8_err| io::Errno::INVAL) } - #[cfg(feature = "alloc")] #[inline] fn to_string_lossy(&self) -> Cow<'_, str> { let borrow: &CStr = core::borrow::Borrow::borrow(self); borrow.to_string_lossy() } - #[cfg(feature = "alloc")] #[inline] fn as_cow_c_str(&self) -> io::Result> { Ok(Cow::Borrowed(self)) } - #[cfg(feature = "alloc")] #[inline] fn into_c_str<'b>(self) -> io::Result> where @@ -720,13 +664,11 @@ self.as_os_str().to_str().ok_or(io::Errno::INVAL) } - #[cfg(feature = "alloc")] #[inline] fn to_string_lossy(&self) -> Cow<'_, str> { self.as_os_str().to_string_lossy() } - #[cfg(feature = "alloc")] #[inline] fn as_cow_c_str(&self) -> io::Result> { Ok(Cow::Owned( @@ -734,7 +676,6 @@ )) } - #[cfg(feature = "alloc")] #[inline] fn into_c_str<'b>(self) -> io::Result> where @@ -762,13 +703,11 @@ self.as_path().to_str().ok_or(io::Errno::INVAL) } - #[cfg(feature = "alloc")] #[inline] fn to_string_lossy(&self) -> Cow<'_, str> { self.as_path().to_string_lossy() } - #[cfg(feature = "alloc")] #[inline] fn as_cow_c_str(&self) -> io::Result> { Ok(Cow::Owned( @@ -777,7 +716,6 @@ )) } - #[cfg(feature = "alloc")] #[inline] fn into_c_str<'b>(self) -> io::Result> where @@ -806,13 +744,11 @@ self.as_path().to_str().ok_or(io::Errno::INVAL) } - #[cfg(feature = "alloc")] #[inline] fn to_string_lossy(&self) -> Cow<'_, str> { self.as_path().to_string_lossy() } - #[cfg(feature = "alloc")] #[inline] fn as_cow_c_str(&self) -> io::Result> { Ok(Cow::Owned( @@ -821,7 +757,6 @@ )) } - #[cfg(feature = "alloc")] #[inline] fn into_c_str<'b>(self) -> io::Result> where @@ -849,13 +784,11 @@ str::from_utf8(self).map_err(|_utf8_err| io::Errno::INVAL) } - #[cfg(feature = "alloc")] #[inline] fn to_string_lossy(&self) -> Cow<'_, str> { String::from_utf8_lossy(self) } - #[cfg(feature = "alloc")] #[inline] fn as_cow_c_str(&self) -> io::Result> { Ok(Cow::Owned( @@ -863,7 +796,6 @@ )) } - #[cfg(feature = "alloc")] #[inline] fn into_c_str<'b>(self) -> io::Result> where @@ -884,20 +816,17 @@ } } -#[cfg(feature = "alloc")] impl Arg for &Vec { #[inline] fn as_str(&self) -> io::Result<&str> { str::from_utf8(self).map_err(|_utf8_err| io::Errno::INVAL) } - #[cfg(feature = "alloc")] #[inline] fn to_string_lossy(&self) -> Cow<'_, str> { String::from_utf8_lossy(self) } - #[cfg(feature = "alloc")] #[inline] fn as_cow_c_str(&self) -> io::Result> { Ok(Cow::Owned( @@ -905,7 +834,6 @@ )) } - #[cfg(feature = "alloc")] #[inline] fn into_c_str<'b>(self) -> io::Result> where @@ -926,20 +854,17 @@ } } -#[cfg(feature = "alloc")] impl Arg for Vec { #[inline] fn as_str(&self) -> io::Result<&str> { str::from_utf8(self).map_err(|_utf8_err| io::Errno::INVAL) } - #[cfg(feature = "alloc")] #[inline] fn to_string_lossy(&self) -> Cow<'_, str> { String::from_utf8_lossy(self) } - #[cfg(feature = "alloc")] #[inline] fn as_cow_c_str(&self) -> io::Result> { Ok(Cow::Owned( @@ -947,7 +872,6 @@ )) } - #[cfg(feature = "alloc")] #[inline] fn into_c_str<'b>(self) -> io::Result> where @@ -975,19 +899,16 @@ Ok(self.as_str()) } - #[cfg(feature = "alloc")] #[inline] fn to_string_lossy(&self) -> Cow<'_, str> { Cow::Borrowed(self.as_str()) } - #[cfg(feature = "alloc")] #[inline] fn as_cow_c_str(&self) -> io::Result> { Ok(Cow::Borrowed(self.as_c_str())) } - #[cfg(feature = "alloc")] #[inline] fn into_c_str<'b>(self) -> io::Result> where @@ -1039,9 +960,8 @@ buf_ptr.add(bytes.len()).write(0); } - // SAFETY: We just wrote the bytes above and they will remain valid for the - // duration of `f` b/c buf doesn't get dropped until the end of the - // function. + // SAFETY: we just wrote the bytes above and they will remain valid for the + // duration of f b/c buf doesn't get dropped until the end of the function. match CStr::from_bytes_with_nul(unsafe { slice::from_raw_parts(buf_ptr, bytes.len() + 1) }) { Ok(s) => f(s), Err(_) => Err(io::Errno::INVAL), @@ -1050,48 +970,10 @@ /// The slow path which handles any length. In theory OS's only support up to /// `PATH_MAX`, but we let the OS enforce that. -#[allow(unsafe_code, clippy::int_plus_one)] #[cold] fn with_c_str_slow_path(bytes: &[u8], f: F) -> io::Result where F: FnOnce(&CStr) -> io::Result, { - #[cfg(feature = "alloc")] - { - f(&CString::new(bytes).map_err(|_cstr_err| io::Errno::INVAL)?) - } - - #[cfg(not(feature = "alloc"))] - { - #[cfg(libc)] - const LARGE_PATH_BUFFER_SIZE: usize = libc::PATH_MAX as usize; - #[cfg(linux_raw)] - const LARGE_PATH_BUFFER_SIZE: usize = linux_raw_sys::general::PATH_MAX as usize; - - // Taken from - // - let mut buf = MaybeUninit::<[u8; LARGE_PATH_BUFFER_SIZE]>::uninit(); - let buf_ptr = buf.as_mut_ptr().cast::(); - - // This helps test our safety condition below. - if bytes.len() + 1 > LARGE_PATH_BUFFER_SIZE { - return Err(io::Errno::NAMETOOLONG); - } - - // SAFETY: `bytes.len() < LARGE_PATH_BUFFER_SIZE` which means we have - // space for `bytes.len() + 1` u8s: - unsafe { - ptr::copy_nonoverlapping(bytes.as_ptr(), buf_ptr, bytes.len()); - buf_ptr.add(bytes.len()).write(0); - } - - // SAFETY: We just wrote the bytes above and they will remain valid for - // the duration of `f` b/c buf doesn't get dropped until the end of the - // function. - match CStr::from_bytes_with_nul(unsafe { slice::from_raw_parts(buf_ptr, bytes.len() + 1) }) - { - Ok(s) => f(s), - Err(_) => Err(io::Errno::INVAL), - } - } + f(&CString::new(bytes).map_err(|_cstr_err| io::Errno::INVAL)?) } diff -Nru temporalio-1.3.0/vendor/rustix/src/path/dec_int.rs temporalio-1.3.0/vendor/rustix/src/path/dec_int.rs --- temporalio-1.3.0/vendor/rustix/src/path/dec_int.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/path/dec_int.rs 2023-10-30 19:40:00.000000000 +0000 @@ -22,7 +22,7 @@ /// /// This is used for opening paths such as `/proc/self/fd/` on Linux. /// -/// # Examples +/// # Example /// /// ``` /// # #[cfg(any(feature = "fs", feature = "net"))] diff -Nru temporalio-1.3.0/vendor/rustix/src/pid.rs temporalio-1.3.0/vendor/rustix/src/pid.rs --- temporalio-1.3.0/vendor/rustix/src/pid.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/pid.rs 2023-10-30 19:40:00.000000000 +0000 @@ -26,7 +26,8 @@ /// Converts a `RawPid` into a `Pid`. /// - /// Returns `Some` for positive `RawPid`s. Otherwise, returns `None`. + /// Returns `Some` for strictly positive `RawPid`s. Otherwise, returns + /// `None`. /// /// This is safe because a `Pid` is a number without any guarantees for the /// kernel. Non-child `Pid`s are always racy for any syscalls, but can only @@ -38,18 +39,18 @@ #[inline] pub const fn from_raw(raw: RawPid) -> Option { if raw > 0 { - // SAFETY: We just checked that `raw > 0`. + // SAFETY: raw > 0. unsafe { Some(Self::from_raw_unchecked(raw)) } } else { None } } - /// Converts a known positive `RawPid` into a `Pid`. + /// Converts a known strictly positive `RawPid` into a `Pid`. /// /// # Safety /// - /// The caller must guarantee `raw` is positive. + /// The caller must guarantee `raw` is strictly positive. #[inline] pub const unsafe fn from_raw_unchecked(raw: RawPid) -> Self { debug_assert!(raw > 0); diff -Nru temporalio-1.3.0/vendor/rustix/src/pipe.rs temporalio-1.3.0/vendor/rustix/src/pipe.rs --- temporalio-1.3.0/vendor/rustix/src/pipe.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/pipe.rs 2023-10-30 19:40:00.000000000 +0000 @@ -14,7 +14,6 @@ target_os = "espidf", target_os = "haiku", target_os = "redox", - target_os = "vita", target_os = "wasi", )))] use backend::c; @@ -40,9 +39,7 @@ windows, target_os = "espidf", target_os = "haiku", - target_os = "hurd", target_os = "redox", - target_os = "vita", target_os = "wasi", )))] pub const PIPE_BUF: usize = c::PIPE_BUF; @@ -156,9 +153,9 @@ /// the pipe is placed in `fd`. /// /// Additionally if `SpliceFlags::GIFT` is set, the caller must also ensure -/// that the contents of `bufs` in never modified following the call, and that -/// all of the pointers in `bufs` are page aligned, and the lengths are -/// multiples of a page size in bytes. +/// that the contents of `bufs` in never modified following the call, +/// and that all of the pointers in `bufs` are page aligned, +/// and the lengths are multiples of a page size in bytes. /// /// # References /// - [Linux] @@ -168,7 +165,7 @@ #[inline] pub unsafe fn vmsplice( fd: PipeFd, - bufs: &[IoSliceRaw<'_>], + bufs: &[IoSliceRaw], flags: SpliceFlags, ) -> io::Result { backend::pipe::syscalls::vmsplice(fd.as_fd(), bufs, flags) @@ -195,7 +192,7 @@ backend::pipe::syscalls::tee(fd_in.as_fd(), fd_out.as_fd(), len, flags) } -/// `fnctl(fd, F_GETPIPE_SZ)`—Return the buffer capacity of a pipe. +/// `ioctl(fd, F_GETPIPE_SZ)`—Return the buffer capacity of a pipe. /// /// # References /// - [Linux] @@ -207,7 +204,7 @@ backend::pipe::syscalls::fcntl_getpipe_sz(fd.as_fd()) } -/// `fnctl(fd, F_SETPIPE_SZ)`—Set the buffer capacity of a pipe. +/// `ioctl(fd, F_SETPIPE_SZ)`—Set the buffer capacity of a pipe. /// /// # References /// - [Linux] diff -Nru temporalio-1.3.0/vendor/rustix/src/prctl.rs temporalio-1.3.0/vendor/rustix/src/prctl.rs --- temporalio-1.3.0/vendor/rustix/src/prctl.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/prctl.rs 2023-10-30 19:40:00.000000000 +0000 @@ -25,9 +25,6 @@ const DATA_AUTHENTICATION_KEY_B = linux_raw_sys::prctl::PR_PAC_APDBKEY; /// `PR_PAC_APGAKEY`—Generic authentication `A` key. const GENERIC_AUTHENTICATION_KEY_A = linux_raw_sys::prctl::PR_PAC_APGAKEY; - - /// - const _ = !0; } } diff -Nru temporalio-1.3.0/vendor/rustix/src/process/chdir.rs temporalio-1.3.0/vendor/rustix/src/process/chdir.rs --- temporalio-1.3.0/vendor/rustix/src/process/chdir.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/process/chdir.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,13 +1,11 @@ #[cfg(not(target_os = "fuchsia"))] use crate::backend::fd::AsFd; -#[cfg(feature = "fs")] -use crate::path; #[cfg(any(feature = "fs", not(target_os = "fuchsia")))] use crate::{backend, io}; -#[cfg(all(feature = "alloc", feature = "fs"))] +#[cfg(feature = "fs")] use { crate::ffi::{CStr, CString}, - crate::path::SMALL_PATH_BUFFER_SIZE, + crate::path::{self, SMALL_PATH_BUFFER_SIZE}, alloc::vec::Vec, }; @@ -50,7 +48,7 @@ /// /// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/getcwd.html /// [Linux]: https://man7.org/linux/man-pages/man3/getcwd.3.html -#[cfg(all(feature = "alloc", feature = "fs"))] +#[cfg(feature = "fs")] #[cfg(not(target_os = "wasi"))] #[cfg_attr(doc_cfg, doc(cfg(feature = "fs")))] #[inline] @@ -58,7 +56,7 @@ _getcwd(reuse.into()) } -#[cfg(all(feature = "alloc", feature = "fs"))] +#[cfg(feature = "fs")] #[allow(unsafe_code)] fn _getcwd(mut buffer: Vec) -> io::Result { buffer.clear(); @@ -67,18 +65,15 @@ loop { match backend::process::syscalls::getcwd(buffer.spare_capacity_mut()) { Err(io::Errno::RANGE) => { - // Use `Vec` reallocation strategy to grow capacity - // exponentially. - buffer.reserve(buffer.capacity() + 1); + buffer.reserve(buffer.capacity() + 1); // use `Vec` reallocation strategy to grow capacity exponentially } Ok(_) => { // SAFETY: // - "These functions return a null-terminated string" - // - [POSIX definition 3.375: String]: "A contiguous sequence - // of bytes terminated by and including the first null byte." + // - [POSIX definition 3.375: String]: "A contiguous sequence of bytes + // terminated by and including the first null byte." // - // Thus, there will be a single NUL byte at the end of the - // string. + // Thus, there will be a single NUL byte at the end of the string. // // [POSIX definition 3.375: String]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_375 unsafe { diff -Nru temporalio-1.3.0/vendor/rustix/src/process/exit.rs temporalio-1.3.0/vendor/rustix/src/process/exit.rs --- temporalio-1.3.0/vendor/rustix/src/process/exit.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/process/exit.rs 2023-10-30 19:40:00.000000000 +0000 @@ -10,7 +10,7 @@ /// /// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/stdlib.h.html /// [Linux]: https://man7.org/linux/man-pages/man3/exit.3.html -pub const EXIT_SUCCESS: i32 = backend::c::EXIT_SUCCESS; +pub const EXIT_SUCCESS: i32 = backend::process::types::EXIT_SUCCESS; /// `EXIT_FAILURE` for use with [`exit`]. /// @@ -22,7 +22,7 @@ /// /// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/stdlib.h.html /// [Linux]: https://man7.org/linux/man-pages/man3/exit.3.html -pub const EXIT_FAILURE: i32 = backend::c::EXIT_FAILURE; +pub const EXIT_FAILURE: i32 = backend::process::types::EXIT_FAILURE; /// The exit status used by a process terminated with a [`Signal::Abort`] /// signal. @@ -33,4 +33,4 @@ /// [Linux]: https://tldp.org/LDP/abs/html/exitcodes.html /// [`Signal::Abort`]: crate::process::Signal::Abort #[cfg(not(any(target_os = "espidf", target_os = "wasi")))] -pub const EXIT_SIGNALED_SIGABRT: i32 = backend::c::EXIT_SIGNALED_SIGABRT; +pub const EXIT_SIGNALED_SIGABRT: i32 = backend::process::types::EXIT_SIGNALED_SIGABRT; diff -Nru temporalio-1.3.0/vendor/rustix/src/process/id.rs temporalio-1.3.0/vendor/rustix/src/process/id.rs --- temporalio-1.3.0/vendor/rustix/src/process/id.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/process/id.rs 2023-10-30 19:40:00.000000000 +0000 @@ -8,7 +8,6 @@ #![allow(unsafe_code)] use crate::{backend, io}; -#[cfg(feature = "alloc")] use alloc::vec::Vec; #[cfg(linux_kernel)] use backend::process::types::RawCpuid; @@ -209,11 +208,12 @@ /// /// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/getgroups.html /// [Linux]: https://man7.org/linux/man-pages/man2/getgroups.2.html -#[cfg(feature = "alloc")] pub fn getgroups() -> io::Result> { + let mut buffer = Vec::new(); + // This code would benefit from having a better way to read into // uninitialized memory, but that requires `unsafe`. - let mut buffer = Vec::with_capacity(8); + buffer.reserve(8); buffer.resize(buffer.capacity(), Gid::ROOT); loop { @@ -225,8 +225,7 @@ buffer.resize(ngroups, Gid::ROOT); return Ok(buffer); } - // Use `Vec` reallocation strategy to grow capacity exponentially. - buffer.reserve(1); + buffer.reserve(1); // use `Vec` reallocation strategy to grow capacity exponentially buffer.resize(buffer.capacity(), Gid::ROOT); } } diff -Nru temporalio-1.3.0/vendor/rustix/src/process/ioctl.rs temporalio-1.3.0/vendor/rustix/src/process/ioctl.rs --- temporalio-1.3.0/vendor/rustix/src/process/ioctl.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/process/ioctl.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,16 +1,7 @@ -//! Process-oriented `ioctl`s. -//! -//! # Safety -//! -//! This module invokes `ioctl`s. - -#![allow(unsafe_code)] - -use crate::{backend, io, ioctl}; -use backend::c; +use crate::{backend, io}; use backend::fd::AsFd; -/// `ioctl(fd, TIOCSCTTY, 0)`—Sets the controlling terminal for the process. +/// `ioctl(fd, TIOCSCTTY, 0)`—Sets the controlling terminal for the processs. /// /// # References /// - [Linux] @@ -26,27 +17,5 @@ #[inline] #[doc(alias = "TIOCSCTTY")] pub fn ioctl_tiocsctty(fd: Fd) -> io::Result<()> { - unsafe { ioctl::ioctl(fd, Tiocsctty) } -} - -#[cfg(not(any(windows, target_os = "aix", target_os = "redox", target_os = "wasi")))] -struct Tiocsctty; - -#[cfg(not(any(windows, target_os = "aix", target_os = "redox", target_os = "wasi")))] -unsafe impl ioctl::Ioctl for Tiocsctty { - type Output = (); - - const IS_MUTATING: bool = false; - const OPCODE: ioctl::Opcode = ioctl::Opcode::old(c::TIOCSCTTY as ioctl::RawOpcode); - - fn as_ptr(&mut self) -> *mut c::c_void { - (&0u32) as *const u32 as *mut c::c_void - } - - unsafe fn output_from_ptr( - _: ioctl::IoctlOutput, - _: *mut c::c_void, - ) -> io::Result { - Ok(()) - } + backend::process::syscalls::ioctl_tiocsctty(fd.as_fd()) } diff -Nru temporalio-1.3.0/vendor/rustix/src/process/kill.rs temporalio-1.3.0/vendor/rustix/src/process/kill.rs --- temporalio-1.3.0/vendor/rustix/src/process/kill.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/process/kill.rs 2023-10-30 19:40:00.000000000 +0000 @@ -19,8 +19,8 @@ /// `kill(-pid, sig)`—Sends a signal to all processes in a process group. /// -/// If `pid` is 1, this sends a signal to all processes the current process has -/// permission to send signals to, except process `1`, possibly other +/// If `pid` is 1, this sends a signal to all processes the current process +/// has permission to send signals to, except process `1`, possibly other /// system-specific processes, and on some systems, the current process. /// /// # References diff -Nru temporalio-1.3.0/vendor/rustix/src/process/membarrier.rs temporalio-1.3.0/vendor/rustix/src/process/membarrier.rs --- temporalio-1.3.0/vendor/rustix/src/process/membarrier.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/process/membarrier.rs 2023-10-30 19:40:00.000000000 +0000 @@ -14,29 +14,26 @@ #[repr(transparent)] #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] pub struct MembarrierQuery: u32 { - /// `MEMBARRIER_CMD_GLOBAL` (also known as `MEMBARRIER_CMD_SHARED`) - #[doc(alias = "SHARED")] - #[doc(alias = "MEMBARRIER_CMD_SHARED")] - const GLOBAL = MembarrierCommand::Global as _; - /// `MEMBARRIER_CMD_GLOBAL_EXPEDITED` - const GLOBAL_EXPEDITED = MembarrierCommand::GlobalExpedited as _; - /// `MEMBARRIER_CMD_REGISTER_GLOBAL_EXPEDITED` - const REGISTER_GLOBAL_EXPEDITED = MembarrierCommand::RegisterGlobalExpedited as _; - /// `MEMBARRIER_CMD_PRIVATE_EXPEDITED` - const PRIVATE_EXPEDITED = MembarrierCommand::PrivateExpedited as _; - /// `MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED` - const REGISTER_PRIVATE_EXPEDITED = MembarrierCommand::RegisterPrivateExpedited as _; - /// `MEMBARRIER_CMD_PRIVATE_EXPEDITED_SYNC_CORE` - const PRIVATE_EXPEDITED_SYNC_CORE = MembarrierCommand::PrivateExpeditedSyncCore as _; - /// `MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_SYNC_CORE` - const REGISTER_PRIVATE_EXPEDITED_SYNC_CORE = MembarrierCommand::RegisterPrivateExpeditedSyncCore as _; - /// `MEMBARRIER_CMD_PRIVATE_EXPEDITED_RSEQ` (since Linux 5.10) - const PRIVATE_EXPEDITED_RSEQ = MembarrierCommand::PrivateExpeditedRseq as _; - /// `MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_RSEQ` (since Linux 5.10) - const REGISTER_PRIVATE_EXPEDITED_RSEQ = MembarrierCommand::RegisterPrivateExpeditedRseq as _; - - /// - const _ = !0; + /// `MEMBARRIER_CMD_GLOBAL` (also known as `MEMBARRIER_CMD_SHARED`) + #[doc(alias = "SHARED")] + #[doc(alias = "MEMBARRIER_CMD_SHARED")] + const GLOBAL = MembarrierCommand::Global as _; + /// `MEMBARRIER_CMD_GLOBAL_EXPEDITED` + const GLOBAL_EXPEDITED = MembarrierCommand::GlobalExpedited as _; + /// `MEMBARRIER_CMD_REGISTER_GLOBAL_EXPEDITED` + const REGISTER_GLOBAL_EXPEDITED = MembarrierCommand::RegisterGlobalExpedited as _; + /// `MEMBARRIER_CMD_PRIVATE_EXPEDITED` + const PRIVATE_EXPEDITED = MembarrierCommand::PrivateExpedited as _; + /// `MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED` + const REGISTER_PRIVATE_EXPEDITED = MembarrierCommand::RegisterPrivateExpedited as _; + /// `MEMBARRIER_CMD_PRIVATE_EXPEDITED_SYNC_CORE` + const PRIVATE_EXPEDITED_SYNC_CORE = MembarrierCommand::PrivateExpeditedSyncCore as _; + /// `MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_SYNC_CORE` + const REGISTER_PRIVATE_EXPEDITED_SYNC_CORE = MembarrierCommand::RegisterPrivateExpeditedSyncCore as _; + /// `MEMBARRIER_CMD_PRIVATE_EXPEDITED_RSEQ` (since Linux 5.10) + const PRIVATE_EXPEDITED_RSEQ = MembarrierCommand::PrivateExpeditedRseq as _; + /// `MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_RSEQ` (since Linux 5.10) + const REGISTER_PRIVATE_EXPEDITED_RSEQ = MembarrierCommand::RegisterPrivateExpeditedRseq as _; } } diff -Nru temporalio-1.3.0/vendor/rustix/src/process/mod.rs temporalio-1.3.0/vendor/rustix/src/process/mod.rs --- temporalio-1.3.0/vendor/rustix/src/process/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/process/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -7,7 +7,7 @@ mod exit; #[cfg(not(target_os = "wasi"))] // WASI doesn't have get[gpu]id. mod id; -#[cfg(not(any(target_os = "aix", target_os = "espidf", target_os = "vita")))] +#[cfg(not(target_os = "espidf"))] mod ioctl; #[cfg(not(any(target_os = "espidf", target_os = "wasi")))] mod kill; @@ -19,8 +19,7 @@ mod pidfd_getfd; #[cfg(linux_kernel)] mod prctl; -#[cfg(not(any(target_os = "fuchsia", target_os = "vita", target_os = "wasi")))] -// WASI doesn't have [gs]etpriority. +#[cfg(not(any(target_os = "fuchsia", target_os = "wasi")))] // WASI doesn't have [gs]etpriority. mod priority; #[cfg(freebsdlike)] mod procctl; @@ -28,7 +27,6 @@ target_os = "espidf", target_os = "fuchsia", target_os = "redox", - target_os = "vita", target_os = "wasi" )))] mod rlimit; @@ -37,7 +35,7 @@ mod sched_yield; #[cfg(not(target_os = "wasi"))] // WASI doesn't have umask. mod umask; -#[cfg(not(any(target_os = "espidf", target_os = "vita", target_os = "wasi")))] +#[cfg(not(any(target_os = "espidf", target_os = "wasi")))] mod wait; #[cfg(not(target_os = "wasi"))] @@ -47,7 +45,7 @@ pub use exit::*; #[cfg(not(target_os = "wasi"))] pub use id::*; -#[cfg(not(any(target_os = "aix", target_os = "espidf", target_os = "vita")))] +#[cfg(not(target_os = "espidf"))] pub use ioctl::*; #[cfg(not(any(target_os = "espidf", target_os = "wasi")))] pub use kill::*; @@ -59,7 +57,7 @@ pub use pidfd_getfd::*; #[cfg(linux_kernel)] pub use prctl::*; -#[cfg(not(any(target_os = "fuchsia", target_os = "vita", target_os = "wasi")))] +#[cfg(not(any(target_os = "fuchsia", target_os = "wasi")))] pub use priority::*; #[cfg(freebsdlike)] pub use procctl::*; @@ -67,7 +65,6 @@ target_os = "espidf", target_os = "fuchsia", target_os = "redox", - target_os = "vita", target_os = "wasi" )))] pub use rlimit::*; @@ -76,5 +73,5 @@ pub use sched_yield::sched_yield; #[cfg(not(target_os = "wasi"))] pub use umask::*; -#[cfg(not(any(target_os = "espidf", target_os = "vita", target_os = "wasi")))] +#[cfg(not(any(target_os = "espidf", target_os = "wasi")))] pub use wait::*; diff -Nru temporalio-1.3.0/vendor/rustix/src/process/pidfd_getfd.rs temporalio-1.3.0/vendor/rustix/src/process/pidfd_getfd.rs --- temporalio-1.3.0/vendor/rustix/src/process/pidfd_getfd.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/process/pidfd_getfd.rs 2023-10-30 19:40:00.000000000 +0000 @@ -17,10 +17,7 @@ /// All flags are reserved for future use. #[repr(transparent)] #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct PidfdGetfdFlags: backend::c::c_uint { - /// - const _ = !0; - } + pub struct PidfdGetfdFlags: backend::c::c_uint {} } /// `syscall(SYS_pidfd_getfd, pidfd, flags)`—Obtain a duplicate of another diff -Nru temporalio-1.3.0/vendor/rustix/src/process/pidfd.rs temporalio-1.3.0/vendor/rustix/src/process/pidfd.rs --- temporalio-1.3.0/vendor/rustix/src/process/pidfd.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/process/pidfd.rs 2023-10-30 19:40:00.000000000 +0000 @@ -11,9 +11,6 @@ pub struct PidfdFlags: backend::c::c_uint { /// `PIDFD_NONBLOCK`. const NONBLOCK = backend::c::PIDFD_NONBLOCK; - - /// - const _ = !0; } } diff -Nru temporalio-1.3.0/vendor/rustix/src/process/prctl.rs temporalio-1.3.0/vendor/rustix/src/process/prctl.rs --- temporalio-1.3.0/vendor/rustix/src/process/prctl.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/process/prctl.rs 2023-10-30 19:40:00.000000000 +0000 @@ -148,9 +148,6 @@ /// Generate a [`Signal::Bus`] signal on unaligned user access. #[doc(alias = "PR_UNALIGN_SIGBUS")] const SIGBUS = 2; - - /// - const _ = !0; } } @@ -410,8 +407,8 @@ /// /// # Safety /// -/// Please ensure the conditions necessary to safely call this function, as -/// detailed in the references above. +/// Please ensure the conditions necessary to safely call this function, +/// as detailed in the references above. /// /// [`prctl(PR_SET_ENDIAN,...)`]: https://man7.org/linux/man-pages/man2/prctl.2.html #[inline] @@ -649,8 +646,8 @@ /// /// # Safety /// -/// Please ensure the conditions necessary to safely call this function, as -/// detailed in the references above. +/// Please ensure the conditions necessary to safely call this function, +/// as detailed in the references above. /// /// [`prctl(PR_SET_MM,...)`]: https://man7.org/linux/man-pages/man2/prctl.2.html #[inline] @@ -673,7 +670,7 @@ #[inline] #[doc(alias = "PR_SET_MM")] #[doc(alias = "PR_SET_MM_EXE_FILE")] -pub fn set_executable_file(fd: BorrowedFd<'_>) -> io::Result<()> { +pub fn set_executable_file(fd: BorrowedFd) -> io::Result<()> { let fd = usize::try_from(fd.as_raw_fd()).map_err(|_r| io::Errno::RANGE)?; unsafe { prctl_3args(PR_SET_MM, PR_SET_MM_EXE_FILE as *mut _, fd as *mut _) }.map(|_r| ()) } @@ -685,8 +682,8 @@ /// /// # Safety /// -/// Please ensure the conditions necessary to safely call this function, as -/// detailed in the references above. +/// Please ensure the conditions necessary to safely call this function, +/// as detailed in the references above. /// /// [`prctl(PR_SET_MM,PR_SET_MM_AUXV,...)`]: https://man7.org/linux/man-pages/man2/prctl.2.html #[inline] @@ -764,8 +761,8 @@ /// /// # Safety /// -/// Please ensure the conditions necessary to safely call this function, as -/// detailed in the references above. +/// Please ensure the conditions necessary to safely call this function, +/// as detailed in the references above. /// /// [`prctl(PR_SET_MM,PR_SET_MM_MAP,...)`]: https://man7.org/linux/man-pages/man2/prctl.2.html #[inline] @@ -960,11 +957,9 @@ const ENABLE = 1_u32 << 1; /// The speculation feature is disabled, mitigation is enabled. const DISABLE = 1_u32 << 2; - /// The speculation feature is disabled, mitigation is enabled, and it - /// cannot be undone. + /// The speculation feature is disabled, mitigation is enabled, and it cannot be undone. const FORCE_DISABLE = 1_u32 << 3; - /// The speculation feature is disabled, mitigation is enabled, and the - /// state will be cleared on `execve`. + /// The speculation feature is disabled, mitigation is enabled, and the state will be cleared on `execve`. const DISABLE_NOEXEC = 1_u32 << 4; } } @@ -974,18 +969,15 @@ #[repr(transparent)] #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] pub struct SpeculationFeatureState: u32 { - /// Mitigation can be controlled per thread by - /// `PR_SET_SPECULATION_CTRL`. + /// Mitigation can be controlled per thread by `PR_SET_SPECULATION_CTRL`. const PRCTL = 1_u32 << 0; /// The speculation feature is enabled, mitigation is disabled. const ENABLE = 1_u32 << 1; /// The speculation feature is disabled, mitigation is enabled. const DISABLE = 1_u32 << 2; - /// The speculation feature is disabled, mitigation is enabled, and it - /// cannot be undone. + /// The speculation feature is disabled, mitigation is enabled, and it cannot be undone. const FORCE_DISABLE = 1_u32 << 3; - /// The speculation feature is disabled, mitigation is enabled, and the - /// state will be cleared on `execve`. + /// The speculation feature is disabled, mitigation is enabled, and the state will be cleared on `execve`. const DISABLE_NOEXEC = 1_u32 << 4; } } @@ -1085,8 +1077,8 @@ /// /// # Safety /// -/// Please ensure the conditions necessary to safely call this function, as -/// detailed in the references above. +/// Please ensure the conditions necessary to safely call this function, +/// as detailed in the references above. /// /// [`prctl(PR_PAC_SET_ENABLED_KEYS,...)`]: https://www.kernel.org/doc/html/v5.18/arm64/pointer-authentication.html #[inline] diff -Nru temporalio-1.3.0/vendor/rustix/src/process/procctl.rs temporalio-1.3.0/vendor/rustix/src/process/procctl.rs --- temporalio-1.3.0/vendor/rustix/src/process/procctl.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/process/procctl.rs 2023-10-30 19:40:00.000000000 +0000 @@ -229,9 +229,6 @@ const OWNED = 1; /// The process is the root of the reaper tree (pid 1). const REALINIT = 2; - - /// - const _ = !0; } } @@ -300,8 +297,7 @@ const REAPER = 4; /// The reported process is in the zombie state. const ZOMBIE = 8; - /// The reported process is stopped by - /// [`Signal::Stop`]/[`Signal::Tstp`]. + /// The reported process is stopped by SIGSTOP/SIGTSTP. const STOPPED = 16; /// The reported process is in the process of exiting. const EXITING = 32; @@ -494,12 +490,12 @@ const PROC_NO_NEW_PRIVS_ENABLE: c_int = 1; -/// Enable the `no_new_privs` mode that ignores SUID and SGID bits on `execve` -/// in the specified process and its future descendants. +/// Enable the `no_new_privs` mode that ignores SUID and SGID bits +/// on `execve` in the specified process and its future descendants. /// -/// This is similar to `set_no_new_privs` on Linux, with the exception that on -/// FreeBSD there is no argument `no_new_privs` argument as it's only possible -/// to enable this mode and there's no going back. +/// This is similar to `set_no_new_privs` on Linux, with the exception +/// that on FreeBSD there is no argument `no_new_privs` argument as it's +/// only possible to enable this mode and there's no going back. /// /// # References /// - [Linux: `prctl(PR_SET_NO_NEW_PRIVS,...)`] diff -Nru temporalio-1.3.0/vendor/rustix/src/process/sched.rs temporalio-1.3.0/vendor/rustix/src/process/sched.rs --- temporalio-1.3.0/vendor/rustix/src/process/sched.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/process/sched.rs 2023-10-30 19:40:00.000000000 +0000 @@ -80,8 +80,8 @@ /// `pid` is the thread ID to update. If pid is `None`, then the current thread /// is updated. /// -/// The `CpuSet` argument specifies the set of CPUs on which the thread will be -/// eligible to run. +/// The `CpuSet` argument specifies the set of CPUs on which the thread will +/// be eligible to run. /// /// # References /// - [Linux] diff -Nru temporalio-1.3.0/vendor/rustix/src/process/wait.rs temporalio-1.3.0/vendor/rustix/src/process/wait.rs --- temporalio-1.3.0/vendor/rustix/src/process/wait.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/process/wait.rs 2023-10-30 19:40:00.000000000 +0000 @@ -9,7 +9,7 @@ use crate::backend::process::wait::SiginfoExt; bitflags! { - /// Options for modifying the behavior of [`wait`]/[`waitpid`]. + /// Options for modifying the behavior of wait/waitpid #[repr(transparent)] #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] pub struct WaitOptions: u32 { @@ -22,15 +22,12 @@ /// Return if a stopped child has been resumed by delivery of /// [`Signal::Cont`]. const CONTINUED = bitcast!(backend::process::wait::WCONTINUED); - - /// - const _ = !0; } } #[cfg(not(any(target_os = "openbsd", target_os = "redox", target_os = "wasi")))] bitflags! { - /// Options for modifying the behavior of [`waitid`]. + /// Options for modifying the behavior of waitid #[repr(transparent)] #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] pub struct WaitidOptions: u32 { @@ -45,9 +42,6 @@ const NOWAIT = bitcast!(backend::process::wait::WNOWAIT); /// Wait for processes that have been stopped. const STOPPED = bitcast!(backend::process::wait::WSTOPPED); - - /// - const _ = !0; } } @@ -93,8 +87,8 @@ backend::process::wait::WIFCONTINUED(self.0 as _) } - /// Returns the number of the signal that stopped the process, if the - /// process was stopped by a signal. + /// Returns the number of the signal that stopped the process, + /// if the process was stopped by a signal. #[inline] pub fn stopping_signal(self) -> Option { if self.stopped() { @@ -104,8 +98,8 @@ } } - /// Returns the exit status number returned by the process, if it exited - /// normally. + /// Returns the exit status number returned by the process, + /// if it exited normally. #[inline] pub fn exit_status(self) -> Option { if self.exited() { @@ -115,8 +109,8 @@ } } - /// Returns the number of the signal that terminated the process, if the - /// process was terminated by a signal. + /// Returns the number of the signal that terminated the process, + /// if the process was terminated by a signal. #[inline] pub fn terminating_signal(self) -> Option { if self.signaled() { @@ -153,15 +147,15 @@ self.si_code() == backend::c::CLD_EXITED } - /// Returns whether the process was terminated by a signal and did not - /// create a core file. + /// Returns whether the process was terminated by a signal + /// and did not create a core file. #[inline] pub fn killed(&self) -> bool { self.si_code() == backend::c::CLD_KILLED } - /// Returns whether the process was terminated by a signal and did create a - /// core file. + /// Returns whether the process was terminated by a signal + /// and did create a core file. #[inline] pub fn dumped(&self) -> bool { self.si_code() == backend::c::CLD_DUMPED @@ -173,10 +167,10 @@ self.si_code() == backend::c::CLD_CONTINUED } - /// Returns the number of the signal that stopped the process, if the - /// process was stopped by a signal. + /// Returns the number of the signal that stopped the process, + /// if the process was stopped by a signal. #[inline] - #[cfg(not(any(target_os = "emscripten", target_os = "fuchsia", target_os = "netbsd")))] + #[cfg(not(any(target_os = "netbsd", target_os = "fuchsia", target_os = "emscripten")))] pub fn stopping_signal(&self) -> Option { if self.stopped() { Some(self.si_status() as _) @@ -185,10 +179,10 @@ } } - /// Returns the number of the signal that trapped the process, if the - /// process was trapped by a signal. + /// Returns the number of the signal that trapped the process, + /// if the process was trapped by a signal. #[inline] - #[cfg(not(any(target_os = "emscripten", target_os = "fuchsia", target_os = "netbsd")))] + #[cfg(not(any(target_os = "netbsd", target_os = "fuchsia", target_os = "emscripten")))] pub fn trapping_signal(&self) -> Option { if self.trapped() { Some(self.si_status() as _) @@ -197,10 +191,10 @@ } } - /// Returns the exit status number returned by the process, if it exited - /// normally. + /// Returns the exit status number returned by the process, + /// if it exited normally. #[inline] - #[cfg(not(any(target_os = "emscripten", target_os = "fuchsia", target_os = "netbsd")))] + #[cfg(not(any(target_os = "netbsd", target_os = "fuchsia", target_os = "emscripten")))] pub fn exit_status(&self) -> Option { if self.exited() { Some(self.si_status() as _) @@ -209,10 +203,10 @@ } } - /// Returns the number of the signal that terminated the process, if the - /// process was terminated by a signal. + /// Returns the number of the signal that terminated the process, + /// if the process was terminated by a signal. #[inline] - #[cfg(not(any(target_os = "emscripten", target_os = "fuchsia", target_os = "netbsd")))] + #[cfg(not(any(target_os = "netbsd", target_os = "fuchsia", target_os = "emscripten")))] pub fn terminating_signal(&self) -> Option { if self.killed() || self.dumped() { Some(self.si_status() as _) @@ -237,7 +231,7 @@ self.0.si_code } - #[cfg(not(any(target_os = "emscripten", target_os = "fuchsia", target_os = "netbsd")))] + #[cfg(not(any(target_os = "netbsd", target_os = "fuchsia", target_os = "emscripten")))] #[allow(unsafe_code)] fn si_status(&self) -> backend::c::c_int { // SAFETY: POSIX [specifies] that the `siginfo_t` returned by a @@ -254,26 +248,20 @@ #[non_exhaustive] pub enum WaitId<'a> { /// Wait on all processes. - #[doc(alias = "P_ALL")] All, /// Wait for a specific process ID. - #[doc(alias = "P_PID")] Pid(Pid), - /// Wait for a specific process group ID, or the calling process' group ID. - #[doc(alias = "P_PGID")] - Pgid(Option), - /// Wait for a specific process file descriptor. #[cfg(target_os = "linux")] - #[doc(alias = "P_PIDFD")] PidFd(BorrowedFd<'a>), /// Eat the lifetime for non-Linux platforms. #[doc(hidden)] #[cfg(not(target_os = "linux"))] __EatLifetime(core::marker::PhantomData<&'a ()>), + // TODO(notgull): Once this crate has the concept of PGIDs, add a WaitId::Pgid } /// `waitpid(pid, waitopts)`—Wait for a specific process to change state. @@ -281,6 +269,12 @@ /// If the pid is `None`, the call will wait for any child process whose /// process group id matches that of the calling process. /// +/// If the pid is equal to `RawPid::MAX`, the call will wait for any child +/// process. +/// +/// Otherwise if the `wrapping_neg` of pid is less than pid, the call will wait +/// for any child process with a group ID equal to the `wrapping_neg` of `pid`. +/// /// Otherwise, the call will wait for the child process with the given pid. /// /// On Success, returns the status of the selected process. @@ -288,16 +282,6 @@ /// If `NOHANG` was specified in the options, and the selected child process /// didn't change state, returns `None`. /// -/// # Bugs -/// -/// This function does not currently support waiting for given process group -/// (the < 0 case of `waitpid`); to do that, currently the [`waitpgid`] or -/// [`waitid`] function must be used. -/// -/// This function does not currently support waiting for any process (the -/// `-1` case of `waitpid`); to do that, currently the [`wait`] function must -/// be used. -/// /// # References /// - [POSIX] /// - [Linux] @@ -310,28 +294,6 @@ Ok(backend::process::syscalls::waitpid(pid, waitopts)?.map(|(_, status)| status)) } -/// `waitpid(-pgid, waitopts)`—Wait for a process in a specific process group -/// to change state. -/// -/// The call will wait for any child process with the given pgid. -/// -/// On Success, returns the status of the selected process. -/// -/// If `NOHANG` was specified in the options, and no selected child process -/// changed state, returns `None`. -/// -/// # References -/// - [POSIX] -/// - [Linux] -/// -/// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/wait.html -/// [Linux]: https://man7.org/linux/man-pages/man2/waitpid.2.html -#[cfg(not(target_os = "wasi"))] -#[inline] -pub fn waitpgid(pgid: Pid, waitopts: WaitOptions) -> io::Result> { - Ok(backend::process::syscalls::waitpgid(pgid, waitopts)?.map(|(_, status)| status)) -} - /// `wait(waitopts)`—Wait for any of the children of calling process to /// change state. /// diff -Nru temporalio-1.3.0/vendor/rustix/src/procfs.rs temporalio-1.3.0/vendor/rustix/src/procfs.rs --- temporalio-1.3.0/vendor/rustix/src/procfs.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/procfs.rs 2023-10-30 19:40:00.000000000 +0000 @@ -18,17 +18,17 @@ //! namespace. So with the checking here, they may fail, but they won't be able //! to succeed with bogus results. +use crate::backend::pid::syscalls::getpid; use crate::fd::{AsFd, BorrowedFd, OwnedFd}; use crate::ffi::CStr; use crate::fs::{ - fstat, fstatfs, major, openat, renameat, FileType, FsWord, Mode, OFlags, RawDir, Stat, CWD, + fstat, fstatfs, major, openat, renameat, Dir, FileType, Mode, OFlags, Stat, CWD, PROC_SUPER_MAGIC, }; use crate::io; use crate::path::DecInt; #[cfg(feature = "rustc-dep-of-std")] use core::lazy::OnceCell; -use core::mem::MaybeUninit; #[cfg(not(feature = "rustc-dep-of-std"))] use once_cell::sync::OnceCell; @@ -42,7 +42,6 @@ Pid, Fd, File, - Symlink, } /// Check a subdirectory of "/proc" for anomalies. @@ -69,22 +68,14 @@ Kind::Proc => check_proc_root(entry, &entry_stat)?, Kind::Pid | Kind::Fd => check_proc_subdir(entry, &entry_stat, proc_stat)?, Kind::File => check_proc_file(&entry_stat, proc_stat)?, - Kind::Symlink => check_proc_symlink(&entry_stat, proc_stat)?, } // "/proc" directories are typically mounted r-xr-xr-x. // "/proc/self/fd" is r-x------. Allow them to have fewer permissions, but // not more. - match kind { - Kind::Symlink => { - // On Linux, symlinks don't have their own permissions. - } - _ => { - let expected_mode = if let Kind::Fd = kind { 0o500 } else { 0o555 }; - if entry_stat.st_mode & 0o777 & !expected_mode != 0 { - return Err(io::Errno::NOTSUP); - } - } + let expected_mode = if let Kind::Fd = kind { 0o500 } else { 0o555 }; + if entry_stat.st_mode & 0o777 & !expected_mode != 0 { + return Err(io::Errno::NOTSUP); } match kind { @@ -110,13 +101,6 @@ return Err(io::Errno::NOTSUP); } } - Kind::Symlink => { - // Check that symlinks in procfs don't have extraneous hard links - // to them (which might indicate hard links to other things). - if entry_stat.st_nlink != 1 { - return Err(io::Errno::NOTSUP); - } - } } Ok(entry_stat) @@ -176,17 +160,6 @@ Ok(()) } -fn check_proc_symlink(stat: &Stat, proc_stat: Option<&Stat>) -> io::Result<()> { - // Check that we have a symbolic link. - if FileType::from_raw_mode(stat.st_mode) != FileType::Symlink { - return Err(io::Errno::NOTSUP); - } - - check_proc_nonroot(stat, proc_stat)?; - - Ok(()) -} - fn check_proc_nonroot(stat: &Stat, proc_stat: Option<&Stat>) -> io::Result<()> { // Check that we haven't been linked back to the root of "/proc". if stat.st_ino == PROC_ROOT_INO { @@ -205,7 +178,7 @@ fn check_procfs(file: BorrowedFd<'_>) -> io::Result<()> { let statfs = fstatfs(file)?; let f_type = statfs.f_type; - if f_type != FsWord::from(PROC_SUPER_MAGIC) { + if f_type != PROC_SUPER_MAGIC.into() { return Err(io::Errno::NOTSUP); } @@ -267,7 +240,6 @@ /// - [Linux] /// /// [Linux]: https://man7.org/linux/man-pages/man5/proc.5.html -#[allow(unsafe_code)] fn proc_self() -> io::Result<(BorrowedFd<'static>, &'static Stat)> { static PROC_SELF: StaticFd = StaticFd::new(); @@ -276,21 +248,11 @@ .get_or_try_init(|| { let (proc, proc_stat) = proc()?; - // `getpid` would return our pid in our own pid namespace, so - // instead use `readlink` on the `self` symlink to learn our pid in - // the procfs namespace. - let self_symlink = open_and_check_file(proc, proc_stat, cstr!("self"), Kind::Symlink)?; - let mut buf = [MaybeUninit::::uninit(); 20]; - let len = crate::backend::fs::syscalls::readlinkat( - self_symlink.as_fd(), - cstr!(""), - &mut buf, - )?; - let pid: &[u8] = unsafe { core::mem::transmute(&buf[..len]) }; + let pid = getpid(); // Open "/proc/self". Use our pid to compute the name rather than // literally using "self", as "self" is a symlink. - let proc_self = proc_opendirat(proc, pid)?; + let proc_self = proc_opendirat(proc, DecInt::new(pid.as_raw_nonzero().get()))?; let proc_self_stat = check_proc_entry(Kind::Pid, proc_self.as_fd(), Some(proc_stat)) .map_err(|_err| io::Errno::NOTSUP)?; @@ -385,12 +347,7 @@ fn _proc_self_fdinfo(fd: BorrowedFd<'_>) -> io::Result { let (proc_self_fdinfo, proc_self_fdinfo_stat) = proc_self_fdinfo()?; let fd_str = DecInt::from_fd(fd); - open_and_check_file( - proc_self_fdinfo, - proc_self_fdinfo_stat, - fd_str.as_c_str(), - Kind::File, - ) + open_and_check_file(proc_self_fdinfo, proc_self_fdinfo_stat, fd_str.as_c_str()) } /// Returns a handle to a Linux `/proc/self/pagemap` file. @@ -443,16 +400,11 @@ /// Open a file under `/proc/self`. fn proc_self_file(name: &CStr) -> io::Result { let (proc_self, proc_self_stat) = proc_self()?; - open_and_check_file(proc_self, proc_self_stat, name, Kind::File) + open_and_check_file(proc_self, proc_self_stat, name) } /// Open a procfs file within in `dir` and check it for bind mounts. -fn open_and_check_file( - dir: BorrowedFd<'_>, - dir_stat: &Stat, - name: &CStr, - kind: Kind, -) -> io::Result { +fn open_and_check_file(dir: BorrowedFd, dir_stat: &Stat, name: &CStr) -> io::Result { let (_, proc_stat) = proc()?; // Don't use `NOATIME`, because it [requires us to own the file], and when @@ -461,11 +413,7 @@ // // [requires us to own the file]: https://man7.org/linux/man-pages/man2/openat.2.html // [to root:root]: https://man7.org/linux/man-pages/man5/proc.5.html - let mut oflags = OFlags::RDONLY | OFlags::CLOEXEC | OFlags::NOFOLLOW | OFlags::NOCTTY; - if let Kind::Symlink = kind { - // Open symlinks with `O_PATH`. - oflags |= OFlags::PATH; - } + let oflags = OFlags::RDONLY | OFlags::CLOEXEC | OFlags::NOFOLLOW | OFlags::NOCTTY; let file = openat(dir, name, oflags, Mode::empty()).map_err(|_err| io::Errno::NOTSUP)?; let file_stat = fstat(&file)?; @@ -475,29 +423,32 @@ // we just opened. If we can't find it, there could be a file bind mount on // top of the file we want. // + // As we scan, we also check for ".", to make sure it's the same directory + // as our original directory, to detect mount points, since + // `Dir::read_from` reopens ".". + // // TODO: With Linux 5.8 we might be able to use `statx` and // `STATX_ATTR_MOUNT_ROOT` to detect mountpoints directly instead of doing // this scanning. + let dir = Dir::read_from(dir).map_err(|_err| io::Errno::NOTSUP)?; - let expected_type = match kind { - Kind::File => FileType::RegularFile, - Kind::Symlink => FileType::Symlink, - _ => unreachable!(), - }; + // Confirm that we got the same inode. + let dot_stat = dir.stat().map_err(|_err| io::Errno::NOTSUP)?; + if (dot_stat.st_dev, dot_stat.st_ino) != (dir_stat.st_dev, dir_stat.st_ino) { + return Err(io::Errno::NOTSUP); + } let mut found_file = false; let mut found_dot = false; - - let mut buf = [MaybeUninit::uninit(); 2048]; - let mut iter = RawDir::new(dir, &mut buf); - while let Some(entry) = iter.next() { + for entry in dir { let entry = entry.map_err(|_err| io::Errno::NOTSUP)?; if entry.ino() == file_stat.st_ino - && entry.file_type() == expected_type + && entry.file_type() == FileType::RegularFile && entry.file_name() == name { // We found the file. Proceed to check the file handle. - let _ = check_proc_entry_with_stat(kind, file.as_fd(), file_stat, Some(proc_stat))?; + let _ = + check_proc_entry_with_stat(Kind::File, file.as_fd(), file_stat, Some(proc_stat))?; found_file = true; } else if entry.ino() == dir_stat.st_ino diff -Nru temporalio-1.3.0/vendor/rustix/src/pty.rs temporalio-1.3.0/vendor/rustix/src/pty.rs --- temporalio-1.3.0/vendor/rustix/src/pty.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/pty.rs 2023-10-30 19:40:00.000000000 +0000 @@ -5,25 +5,17 @@ //! //! [rustix-openpty crate]: https://crates.io/crates/rustix-openpty -#![allow(unsafe_code)] - use crate::backend::c; use crate::fd::{AsFd, OwnedFd}; use crate::fs::OFlags; use crate::{backend, io}; -#[cfg(all( - feature = "alloc", - any(apple, linux_like, target_os = "freebsd", target_os = "fuchsia") -))] +#[cfg(any(apple, linux_like, target_os = "freebsd", target_os = "fuchsia"))] use {crate::ffi::CString, alloc::vec::Vec}; -#[cfg(target_os = "linux")] -use crate::{fd::FromRawFd, ioctl}; - bitflags::bitflags! { /// `O_*` flags for use with [`openpt`] and [`ioctl_tiocgptpeer`]. /// - /// [`ioctl_tiocgptpeer`]: https://docs.rs/rustix/*/x86_64-unknown-linux-gnu/rustix/pty/fn.ioctl_tiocgptpeer.html + /// [`ioctl_tiocgtpeer`]: https://docs.rs/rustix/*/x86_64-unknown-linux-gnu/rustix/pty/fn.ioctl_tiocgtpeer.html #[repr(transparent)] #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] pub struct OpenptFlags: u32 { @@ -31,7 +23,7 @@ const RDWR = c::O_RDWR as c::c_uint; /// `O_NOCTTY` - #[cfg(not(any(target_os = "espidf", target_os = "l4re", target_os = "redox", target_os = "vita")))] + #[cfg(not(any(target_os = "espidf", target_os = "l4re", target_os = "redox")))] const NOCTTY = c::O_NOCTTY as c::c_uint; /// `O_CLOEXEC` @@ -40,9 +32,6 @@ /// rustix supports it on Linux, and FreeBSD and NetBSD support it. #[cfg(any(linux_kernel, target_os = "freebsd", target_os = "netbsd"))] const CLOEXEC = c::O_CLOEXEC as c::c_uint; - - /// - const _ = !0; } } @@ -113,12 +102,9 @@ /// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/ptsname.html /// [Linux]: https://man7.org/linux/man-pages/man3/ptsname.3.html /// [glibc]: https://www.gnu.org/software/libc/manual/html_node/Allocation.html#index-ptsname -#[cfg(all( - feature = "alloc", - any(apple, linux_like, target_os = "freebsd", target_os = "fuchsia") -))] #[inline] #[doc(alias = "ptsname_r")] +#[cfg(any(apple, linux_like, target_os = "freebsd", target_os = "fuchsia"))] pub fn ptsname>>(fd: Fd, reuse: B) -> io::Result { backend::pty::syscalls::ptsname(fd.as_fd(), reuse.into()) } @@ -142,8 +128,8 @@ /// /// On Linux, calling this function has no effect, as the kernel is expected to /// grant the appropriate access. On all other platorms, this function has -/// unspecified behavior if the calling process has a [`Signal::Child`] signal -/// handler installed. +/// unspecified behavior if the calling process has a `SIGCHLD` signal handler +/// installed. /// /// # References /// - [POSIX] @@ -153,7 +139,6 @@ /// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/grantpt.html /// [Linux]: https://man7.org/linux/man-pages/man3/grantpt.3.html /// [glibc]: https://www.gnu.org/software/libc/manual/html_node/Allocation.html#index-grantpt -/// [`Signal::Child`]: crate::process::Signal::Child #[inline] pub fn grantpt(fd: Fd) -> io::Result<()> { #[cfg(not(linux_kernel))] @@ -181,27 +166,5 @@ #[cfg(target_os = "linux")] #[inline] pub fn ioctl_tiocgptpeer(fd: Fd, flags: OpenptFlags) -> io::Result { - unsafe { ioctl::ioctl(fd, Tiocgptpeer(flags)) } -} - -#[cfg(target_os = "linux")] -struct Tiocgptpeer(OpenptFlags); - -#[cfg(target_os = "linux")] -unsafe impl ioctl::Ioctl for Tiocgptpeer { - type Output = OwnedFd; - - const IS_MUTATING: bool = false; - const OPCODE: ioctl::Opcode = ioctl::Opcode::old(c::TIOCGPTPEER as ioctl::RawOpcode); - - fn as_ptr(&mut self) -> *mut c::c_void { - self.0.bits() as *mut c::c_void - } - - unsafe fn output_from_ptr( - ret: ioctl::IoctlOutput, - _arg: *mut c::c_void, - ) -> io::Result { - Ok(OwnedFd::from_raw_fd(ret)) - } + backend::pty::syscalls::ioctl_tiocgptpeer(fd.as_fd(), flags) } diff -Nru temporalio-1.3.0/vendor/rustix/src/rand/getrandom.rs temporalio-1.3.0/vendor/rustix/src/rand/getrandom.rs --- temporalio-1.3.0/vendor/rustix/src/rand/getrandom.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/rand/getrandom.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,5 +1,6 @@ use crate::{backend, io}; +/// `GRND_*` constants for use with [`getrandom`]. pub use backend::rand::types::GetRandomFlags; /// `getrandom(buf, flags)`—Reads a sequence of random bytes. diff -Nru temporalio-1.3.0/vendor/rustix/src/runtime.rs temporalio-1.3.0/vendor/rustix/src/runtime.rs --- temporalio-1.3.0/vendor/rustix/src/runtime.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/runtime.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,12 +1,9 @@ -//! Experimental low-level implementation details for libc-like runtime -//! libraries such as [Origin]. +//! Low-level implementation details for libc-like runtime libraries such as +//! [origin]. //! //! Do not use the functions in this module unless you've read all of their -//! code. They don't always behave the same way as functions with similar names -//! in `libc`. Sometimes information about the differences is included in the -//! Linux documentation under “C library/kernel differences†sections. And, if -//! there is a libc in the process, these functions may have surprising -//! interactions with it. +//! code, *and* you know all the relevant internal implementation details of +//! any libc in the process they'll be used. //! //! These functions are for implementing thread-local storage (TLS), managing //! threads, loaded libraries, and other process-wide resources. Most of @@ -17,7 +14,7 @@ //! The API for these functions is not stable, and this module is //! `doc(hidden)`. //! -//! [Origin]: https://github.com/sunfishcode/origin#readme +//! [origin]: https://github.com/sunfishcode/mustang/tree/main/origin //! //! # Safety //! @@ -37,14 +34,13 @@ #[cfg(linux_raw)] use crate::pid::Pid; #[cfg(linux_raw)] +use crate::signal::Signal; +#[cfg(linux_raw)] #[cfg(feature = "fs")] use backend::fd::AsFd; #[cfg(linux_raw)] use core::ffi::c_void; -#[cfg(linux_raw)] -pub use crate::signal::Signal; - /// `sigaction` #[cfg(linux_raw)] pub type Sigaction = linux_raw_sys::general::kernel_sigaction; @@ -89,7 +85,7 @@ backend::runtime::syscalls::tls::arm_set_tls(data) } -/// `prctl(PR_SET_FS, data)`—Set the x86-64 `fs` register. +/// `prctl(PR_SET_FS, data)`—Set the x86_64 `fs` register. /// /// # Safety /// @@ -101,7 +97,7 @@ backend::runtime::syscalls::tls::set_fs(data) } -/// Set the x86-64 thread ID address. +/// Set the x86_64 thread ID address. /// /// # Safety /// @@ -146,7 +142,7 @@ /// /// This is equivalent to `_exit` and `_Exit` in libc. /// -/// This does not call any `__cxa_atexit`, `atexit`, or any other destructors. +/// This does not all any `__cxa_atexit`, `atexit`, or any other destructors. /// Most programs should use [`std::process::exit`] instead of calling this /// directly. /// @@ -165,70 +161,25 @@ backend::runtime::syscalls::exit_group(status) } -/// `EXIT_SUCCESS` for use with [`exit_group`]. -/// -/// # References -/// - [POSIX] -/// - [Linux] -/// -/// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/stdlib.h.html -/// [Linux]: https://man7.org/linux/man-pages/man3/exit.3.html -pub const EXIT_SUCCESS: i32 = backend::c::EXIT_SUCCESS; - -/// `EXIT_FAILURE` for use with [`exit_group`]. -/// -/// # References -/// - [POSIX] -/// - [Linux] -/// -/// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/stdlib.h.html -/// [Linux]: https://man7.org/linux/man-pages/man3/exit.3.html -pub const EXIT_FAILURE: i32 = backend::c::EXIT_FAILURE; - /// Return fields from the main executable segment headers ("phdrs") relevant /// to initializing TLS provided to the program at startup. -/// -/// `addr` will always be non-null, even when the TLS data is absent, so that -/// the `addr` and `file_size` parameters are suitable for creating a slice -/// with `slice::from_raw_parts`. #[inline] pub fn startup_tls_info() -> StartupTlsInfo { backend::runtime::tls::startup_tls_info() } -/// `(getauxval(AT_PHDR), getauxval(AT_PHENT), getauxval(AT_PHNUM))`—Returns -/// the address, ELF segment header size, and number of ELF segment headers for -/// the main executable. +/// `(getauxval(AT_PHDR), getauxval(AT_PHNUM))`—Returns the address and +/// number of ELF segment headers for the main executable. /// /// # References /// - [Linux] /// /// [Linux]: https://man7.org/linux/man-pages/man3/getauxval.3.html #[inline] -pub fn exe_phdrs() -> (*const c_void, usize, usize) { +pub fn exe_phdrs() -> (*const c_void, usize) { backend::param::auxv::exe_phdrs() } -/// `getauxval(AT_ENTRY)`—Returns the address of the program entrypoint. -/// -/// Most code interested in the program entrypoint address should instead use a -/// symbol reference to `_start`. That will be properly PC-relative or -/// relocated if needed, and will come with appropriate pointer type and -/// pointer provenance. -/// -/// This function is intended only for use in code that implements those -/// relocations, to compute the ASLR offset. It has type `usize`, so it doesn't -/// carry any provenance, and it shouldn't be used to dereference memory. -/// -/// # References -/// - [Linux] -/// -/// [Linux]: https://man7.org/linux/man-pages/man3/getauxval.3.html -#[inline] -pub fn entry() -> usize { - backend::param::auxv::entry() -} - #[cfg(linux_raw)] pub use backend::runtime::tls::StartupTlsInfo; @@ -273,19 +224,13 @@ /// that could cause undefined behavior. The extent to which this also /// applies to Rust functions is unclear at this time. /// -/// - And more. -/// /// # Safety /// /// The child must avoid accessing any memory shared with the parent in a /// way that invokes undefined behavior. It must avoid accessing any threading /// runtime functions in a way that invokes undefined behavior. And it must /// avoid invoking any undefined behavior through any function that is not -/// guaranteed to be async-signal-safe. But, what does async-signal-safe even -/// mean in a Rust program? This documentation does not have all the answers. -/// -/// So you're on your own. And on top of all the troubles with `fork` in -/// general, this wrapper implementation is highly experimental. +/// guaranteed to be async-signal-safe. /// /// # References /// - [POSIX] @@ -485,41 +430,3 @@ pub unsafe fn sigtimedwait(set: &Sigset, timeout: Option) -> io::Result { backend::runtime::syscalls::sigtimedwait(set, timeout) } - -/// `getauxval(AT_SECURE)`—Returns the Linux “secure execution†mode. -/// -/// Return a boolean value indicating whether “secure execution†mode was -/// requested, due to the process having elevated privileges. This includes -/// whether the `AT_SECURE` AUX value is set, and whether the initial real UID -/// and GID differ from the initial effective UID and GID. -/// -/// The meaning of “secure execution†mode is beyond the scope of this comment. -/// -/// # References -/// - [Linux] -/// -/// [Linux]: https://man7.org/linux/man-pages/man3/getauxval.3.html -#[cfg(any( - linux_raw, - any( - all(target_os = "android", target_pointer_width = "64"), - target_os = "linux", - ) -))] -#[inline] -pub fn linux_secure() -> bool { - backend::param::auxv::linux_secure() -} - -/// `brk(addr)`—Change the location of the “program breakâ€. -/// -/// # Safety -/// -/// This is not identical to `brk` in libc. libc `brk` may have bookkeeping -/// that needs to be kept up to date that this doesn't keep up to date, so -/// don't use it unless you are implementing libc. -#[cfg(linux_raw)] -#[inline] -pub unsafe fn brk(addr: *mut c_void) -> io::Result<*mut c_void> { - backend::runtime::syscalls::brk(addr) -} diff -Nru temporalio-1.3.0/vendor/rustix/src/shm.rs temporalio-1.3.0/vendor/rustix/src/shm.rs --- temporalio-1.3.0/vendor/rustix/src/shm.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/shm.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,40 +0,0 @@ -//! POSIX shared memory - -use crate::fd::OwnedFd; -use crate::{backend, io, path}; - -pub use crate::backend::fs::types::Mode; -pub use crate::backend::shm::types::ShmOFlags; - -/// `shm_open(name, oflags, mode)`—Opens a shared memory object. -/// -/// For portability, `name` should begin with a slash, contain no other -/// slashes, and be no longer than an implementation-defined limit (255 on -/// Linux). -/// -/// Exactly one of [`ShmOFlags::RDONLY`] and [`ShmOFlags::RDWR`] should be -/// passed. The file descriptor will be opened with `FD_CLOEXEC` set. -/// -/// # References -/// - [POSIX] -/// - [Linux] -/// -/// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/shm_open.html -/// [Linux]: https://man7.org/linux/man-pages/man3/shm_open.3.html -#[inline] -pub fn shm_open(name: P, flags: ShmOFlags, mode: Mode) -> io::Result { - name.into_with_c_str(|name| backend::shm::syscalls::shm_open(name, flags, mode)) -} - -/// `shm_unlink(name)`—Unlinks a shared memory object. -/// -/// # References -/// - [POSIX] -/// - [Linux] -/// -/// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/shm_unlink.html -/// [Linux]: https://man7.org/linux/man-pages/man3/shm_unlink.3.html -#[inline] -pub fn shm_unlink(name: P) -> io::Result<()> { - name.into_with_c_str(backend::shm::syscalls::shm_unlink) -} diff -Nru temporalio-1.3.0/vendor/rustix/src/signal.rs temporalio-1.3.0/vendor/rustix/src/signal.rs --- temporalio-1.3.0/vendor/rustix/src/signal.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/signal.rs 2023-10-30 19:40:00.000000000 +0000 @@ -30,12 +30,10 @@ /// `SIGKILL` Kill = c::SIGKILL, /// `SIGUSR1` - #[cfg(not(target_os = "vita"))] Usr1 = c::SIGUSR1, /// `SIGSEGV` Segv = c::SIGSEGV, /// `SIGUSR2` - #[cfg(not(target_os = "vita"))] Usr2 = c::SIGUSR2, /// `SIGPIPE` Pipe = c::SIGPIPE, @@ -51,7 +49,6 @@ target_os = "aix", target_os = "haiku", target_os = "nto", - target_os = "vita", all( linux_kernel, any( @@ -66,49 +63,37 @@ )))] Stkflt = c::SIGSTKFLT, /// `SIGCHLD` - #[cfg(not(target_os = "vita"))] #[doc(alias = "Chld")] Child = c::SIGCHLD, /// `SIGCONT` - #[cfg(not(target_os = "vita"))] Cont = c::SIGCONT, /// `SIGSTOP` - #[cfg(not(target_os = "vita"))] Stop = c::SIGSTOP, /// `SIGTSTP` - #[cfg(not(target_os = "vita"))] Tstp = c::SIGTSTP, /// `SIGTTIN` - #[cfg(not(target_os = "vita"))] Ttin = c::SIGTTIN, /// `SIGTTOU` - #[cfg(not(target_os = "vita"))] Ttou = c::SIGTTOU, /// `SIGURG` - #[cfg(not(target_os = "vita"))] Urg = c::SIGURG, /// `SIGXCPU` - #[cfg(not(target_os = "vita"))] Xcpu = c::SIGXCPU, /// `SIGXFSZ` - #[cfg(not(target_os = "vita"))] Xfsz = c::SIGXFSZ, /// `SIGVTALRM` - #[cfg(not(target_os = "vita"))] #[doc(alias = "Vtalrm")] Vtalarm = c::SIGVTALRM, /// `SIGPROF` - #[cfg(not(target_os = "vita"))] Prof = c::SIGPROF, /// `SIGWINCH` - #[cfg(not(target_os = "vita"))] Winch = c::SIGWINCH, /// `SIGIO`, aka `SIGPOLL` #[doc(alias = "Poll")] - #[cfg(not(any(target_os = "haiku", target_os = "vita")))] + #[cfg(not(target_os = "haiku"))] Io = c::SIGIO, /// `SIGPWR` - #[cfg(not(any(bsd, target_os = "haiku", target_os = "vita")))] + #[cfg(not(any(bsd, target_os = "haiku")))] #[doc(alias = "Pwr")] Power = c::SIGPWR, /// `SIGSYS`, aka `SIGUNUSED` @@ -158,10 +143,8 @@ c::SIGBUS => Some(Self::Bus), c::SIGFPE => Some(Self::Fpe), c::SIGKILL => Some(Self::Kill), - #[cfg(not(target_os = "vita"))] c::SIGUSR1 => Some(Self::Usr1), c::SIGSEGV => Some(Self::Segv), - #[cfg(not(target_os = "vita"))] c::SIGUSR2 => Some(Self::Usr2), c::SIGPIPE => Some(Self::Pipe), c::SIGALRM => Some(Self::Alarm), @@ -172,7 +155,6 @@ target_os = "aix", target_os = "haiku", target_os = "nto", - target_os = "vita", all( linux_kernel, any( @@ -186,33 +168,21 @@ ) )))] c::SIGSTKFLT => Some(Self::Stkflt), - #[cfg(not(target_os = "vita"))] c::SIGCHLD => Some(Self::Child), - #[cfg(not(target_os = "vita"))] c::SIGCONT => Some(Self::Cont), - #[cfg(not(target_os = "vita"))] c::SIGSTOP => Some(Self::Stop), - #[cfg(not(target_os = "vita"))] c::SIGTSTP => Some(Self::Tstp), - #[cfg(not(target_os = "vita"))] c::SIGTTIN => Some(Self::Ttin), - #[cfg(not(target_os = "vita"))] c::SIGTTOU => Some(Self::Ttou), - #[cfg(not(target_os = "vita"))] c::SIGURG => Some(Self::Urg), - #[cfg(not(target_os = "vita"))] c::SIGXCPU => Some(Self::Xcpu), - #[cfg(not(target_os = "vita"))] c::SIGXFSZ => Some(Self::Xfsz), - #[cfg(not(target_os = "vita"))] c::SIGVTALRM => Some(Self::Vtalarm), - #[cfg(not(target_os = "vita"))] c::SIGPROF => Some(Self::Prof), - #[cfg(not(target_os = "vita"))] c::SIGWINCH => Some(Self::Winch), - #[cfg(not(any(target_os = "haiku", target_os = "vita")))] + #[cfg(not(target_os = "haiku"))] c::SIGIO => Some(Self::Io), - #[cfg(not(any(bsd, target_os = "haiku", target_os = "vita")))] + #[cfg(not(any(bsd, target_os = "haiku")))] c::SIGPWR => Some(Self::Power), c::SIGSYS => Some(Self::Sys), #[cfg(any( diff -Nru temporalio-1.3.0/vendor/rustix/src/static_assertions.rs temporalio-1.3.0/vendor/rustix/src/static_assertions.rs --- temporalio-1.3.0/vendor/rustix/src/static_assertions.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/static_assertions.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,7 +1,8 @@ //! Workarounds for Rust 1.63 where some things in the `static_assertions` -//! crate do things that don't work in const contexts. We want to call them in -//! const contexts in Rust versions where that's supported so that problems are -//! caught at compile time, and fall back to dynamic asserts in Rust 1.63. +//! crate do things that don't work in const contexts. We want to call them +//! in const contexts in Rust versions where that's supported so that +//! problems are caught at compile time, and fall back to dynamic asserts +//! in Rust 1.63. #![allow(unused_macros)] diff -Nru temporalio-1.3.0/vendor/rustix/src/system.rs temporalio-1.3.0/vendor/rustix/src/system.rs --- temporalio-1.3.0/vendor/rustix/src/system.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/system.rs 2023-10-30 19:40:00.000000000 +0000 @@ -7,10 +7,8 @@ #![allow(unsafe_code)] use crate::backend; -#[cfg(target_os = "linux")] -use crate::backend::c; use crate::ffi::CStr; -#[cfg(not(any(target_os = "espidf", target_os = "emscripten", target_os = "vita")))] +#[cfg(not(any(target_os = "espidf", target_os = "emscripten")))] use crate::io; use core::fmt; @@ -20,8 +18,6 @@ /// `uname()`—Returns high-level information about the runtime OS and /// hardware. /// -/// For `gethostname()`, use [`Uname::nodename`] on the result. -/// /// # References /// - [POSIX] /// - [Linux] @@ -42,7 +38,6 @@ /// [DragonFly BSD]: https://man.dragonflybsd.org/?command=uname§ion=3 /// [illumos]: https://illumos.org/man/2/uname /// [glibc]: https://www.gnu.org/software/libc/manual/html_node/Platform-Type.html -#[doc(alias = "gethostname")] #[inline] pub fn uname() -> Uname { Uname(backend::system::syscalls::uname()) @@ -64,8 +59,6 @@ /// This is intended to be a network name, however it's unable to convey /// information about hosts that have multiple names, or any information /// about where the names are visible. - /// - /// This corresponds to the `gethostname` value. #[inline] pub fn nodename(&self) -> &CStr { Self::to_cstr(self.0.nodename.as_ptr().cast()) @@ -109,25 +102,25 @@ { write!( fmt, - "{:?} {:?} {:?} {:?} {:?}", - self.sysname(), - self.nodename(), - self.release(), - self.version(), - self.machine(), + "{} {} {} {} {}", + self.sysname().to_string_lossy(), + self.nodename().to_string_lossy(), + self.release().to_string_lossy(), + self.version().to_string_lossy(), + self.machine().to_string_lossy(), ) } #[cfg(linux_kernel)] { write!( fmt, - "{:?} {:?} {:?} {:?} {:?} {:?}", - self.sysname(), - self.nodename(), - self.release(), - self.version(), - self.machine(), - self.domainname(), + "{} {} {} {} {} {}", + self.sysname().to_string_lossy(), + self.nodename().to_string_lossy(), + self.release().to_string_lossy(), + self.version().to_string_lossy(), + self.machine().to_string_lossy(), + self.domainname().to_string_lossy(), ) } } @@ -155,66 +148,9 @@ target_os = "emscripten", target_os = "espidf", target_os = "redox", - target_os = "vita", target_os = "wasi" )))] #[inline] pub fn sethostname(name: &[u8]) -> io::Result<()> { backend::system::syscalls::sethostname(name) } - -/// Reboot command for use with [`reboot`]. -#[cfg(target_os = "linux")] -#[derive(Copy, Clone, Debug, Eq, PartialEq)] -#[repr(i32)] -#[non_exhaustive] -pub enum RebootCommand { - /// Disables the Ctrl-Alt-Del keystroke. - /// - /// When disabled, the keystroke will send a [`Signal::Int`] to pid 1. - /// - /// [`Signal::Int`]: crate::process::Signal::Int - CadOff = c::LINUX_REBOOT_CMD_CAD_OFF, - /// Enables the Ctrl-Alt-Del keystroke. - /// - /// When enabled, the keystroke will trigger a [`Restart`]. - /// - /// [`Restart`]: Self::Restart - CadOn = c::LINUX_REBOOT_CMD_CAD_ON, - /// Prints the message "System halted" and halts the system - Halt = c::LINUX_REBOOT_CMD_HALT, - /// Execute a kernel that has been loaded earlier with [`kexec_load`]. - /// - /// [`kexec_load`]: https://man7.org/linux/man-pages/man2/kexec_load.2.html - Kexec = c::LINUX_REBOOT_CMD_KEXEC, - /// Prints the message "Power down.", stops the system, and tries to remove - /// all power - PowerOff = c::LINUX_REBOOT_CMD_POWER_OFF, - /// Prints the message "Restarting system." and triggers a restart - Restart = c::LINUX_REBOOT_CMD_RESTART, - /// Hibernate the system by suspending to disk - SwSuspend = c::LINUX_REBOOT_CMD_SW_SUSPEND, -} - -/// `reboot`—Reboot the system or enable/disable Ctrl-Alt-Del -/// -/// The reboot syscall, despite the name, can actually do much more than -/// reboot. -/// -/// Among other things, it can: -/// - Restart, Halt, Power Off, and Suspend the system -/// - Enable and disable the Ctrl-Alt-Del keystroke -/// - Execute other kernels -/// - Terminate init inside PID namespaces -/// -/// It is highly recommended to carefully read the kernel documentation before -/// calling this function. -/// -/// # References -/// - [Linux] -/// -/// [Linux]: https://man7.org/linux/man-pages/man2/reboot.2.html -#[cfg(target_os = "linux")] -pub fn reboot(cmd: RebootCommand) -> io::Result<()> { - backend::system::syscalls::reboot(cmd) -} diff -Nru temporalio-1.3.0/vendor/rustix/src/termios/ioctl.rs temporalio-1.3.0/vendor/rustix/src/termios/ioctl.rs --- temporalio-1.3.0/vendor/rustix/src/termios/ioctl.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/termios/ioctl.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,10 +1,7 @@ //! Terminal-related `ioctl` functions. -#![allow(unsafe_code)] - use crate::fd::AsFd; -use crate::{backend, io, ioctl}; -use backend::c; +use crate::{backend, io}; /// `ioctl(fd, TIOCEXCL)`—Enables exclusive mode on a terminal. /// @@ -22,11 +19,7 @@ #[inline] #[doc(alias = "TIOCEXCL")] pub fn ioctl_tiocexcl(fd: Fd) -> io::Result<()> { - // SAFETY: TIOCEXCL is a no-argument setter opcode. - unsafe { - let ctl = ioctl::NoArg::>::new(); - ioctl::ioctl(fd, ctl) - } + backend::termios::syscalls::ioctl_tiocexcl(fd.as_fd()) } /// `ioctl(fd, TIOCNXCL)`—Disables exclusive mode on a terminal. @@ -45,9 +38,5 @@ #[inline] #[doc(alias = "TIOCNXCL")] pub fn ioctl_tiocnxcl(fd: Fd) -> io::Result<()> { - // SAFETY: TIOCNXCL is a no-argument setter opcode. - unsafe { - let ctl = ioctl::NoArg::>::new(); - ioctl::ioctl(fd, ctl) - } + backend::termios::syscalls::ioctl_tiocnxcl(fd.as_fd()) } diff -Nru temporalio-1.3.0/vendor/rustix/src/termios/tty.rs temporalio-1.3.0/vendor/rustix/src/termios/tty.rs --- temporalio-1.3.0/vendor/rustix/src/termios/tty.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/termios/tty.rs 2023-10-30 19:40:00.000000000 +0000 @@ -2,7 +2,7 @@ use crate::backend; use backend::fd::AsFd; -#[cfg(all(feature = "alloc", feature = "procfs"))] +#[cfg(feature = "procfs")] #[cfg(not(any(target_os = "fuchsia", target_os = "wasi")))] use { crate::ffi::CString, crate::io, crate::path::SMALL_PATH_BUFFER_SIZE, alloc::vec::Vec, @@ -33,7 +33,7 @@ /// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/ttyname.html /// [Linux]: https://man7.org/linux/man-pages/man3/ttyname.3.html #[cfg(not(any(target_os = "fuchsia", target_os = "wasi")))] -#[cfg(all(feature = "alloc", feature = "procfs"))] +#[cfg(feature = "procfs")] #[cfg_attr(doc_cfg, doc(cfg(feature = "procfs")))] #[doc(alias = "ttyname_r")] #[inline] @@ -42,7 +42,7 @@ } #[cfg(not(any(target_os = "fuchsia", target_os = "wasi")))] -#[cfg(all(feature = "alloc", feature = "procfs"))] +#[cfg(feature = "procfs")] #[allow(unsafe_code)] fn _ttyname(dirfd: BorrowedFd<'_>, mut buffer: Vec) -> io::Result { buffer.clear(); @@ -51,26 +51,22 @@ loop { match backend::termios::syscalls::ttyname(dirfd, buffer.spare_capacity_mut()) { Err(io::Errno::RANGE) => { - // Use `Vec` reallocation strategy to grow capacity - // exponentially. - buffer.reserve(buffer.capacity() + 1); + buffer.reserve(buffer.capacity() + 1); // use `Vec` reallocation strategy to grow capacity exponentially } Ok(len) => { - // SAFETY: Assume the backend returns the length of the string - // excluding the NUL. + // SAFETY: assume the backend returns the length of the string unsafe { - buffer.set_len(len + 1); + buffer.set_len(len); } // SAFETY: - // - “ttyname_r stores this pathname in the buffer buf†- // - [POSIX definition 3.271: Pathname]: “A string that is used - // to identify a file.†- // - [POSIX definition 3.375: String]: “A contiguous sequence - // of bytes terminated by and including the first null byte.†+ // - "ttyname_r stores this pathname in the buffer buf" + // - [POSIX definition 3.271: Pathname]: "A string that is used to identify a + // file." + // - [POSIX definition 3.375: String]: "A contiguous sequence of bytes + // terminated by and including the first null byte." // - // Thus, there will be a single NUL byte at the end of the - // string. + // Thus, there will be a single NUL byte at the end of the string. // // [POSIX definition 3.271: Pathname]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_271 // [POSIX definition 3.375: String]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_375 diff -Nru temporalio-1.3.0/vendor/rustix/src/termios/types.rs temporalio-1.3.0/vendor/rustix/src/termios/types.rs --- temporalio-1.3.0/vendor/rustix/src/termios/types.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/termios/types.rs 2023-10-30 19:40:00.000000000 +0000 @@ -289,13 +289,9 @@ target_os = "aix", target_os = "emscripten", target_os = "haiku", - target_os = "hurd", target_os = "redox", )))] const IUTF8 = c::IUTF8; - - /// - const _ = !0; } } @@ -508,9 +504,6 @@ target_os = "redox", )))] const VT1 = c::VT1; - - /// - const _ = !0; } } @@ -567,14 +560,10 @@ target_os = "aix", target_os = "emscripten", target_os = "haiku", - target_os = "hurd", target_os = "nto", target_os = "redox", )))] const CMSPAR = c::CMSPAR; - - /// - const _ = !0; } } @@ -638,9 +627,6 @@ /// `IEXTEN` const IEXTEN = c::IEXTEN; - - /// - const _ = !0; } } @@ -808,18 +794,7 @@ /// Translate from a `c::speed_t` code to an arbitrary integer speed value /// `u32`. - /// - /// On BSD platforms, integer speed values are already the same as their - /// encoded values, and on Linux platforms, we use `TCGETS2`/`TCSETS2` - /// and the `c_ispeed`/`c_ospeed`` fields, except that on Linux on - /// PowerPC on QEMU, `TCGETS2`/`TCSETS2` don't set `c_ispeed`/`c_ospeed`. - #[cfg(not(any( - bsd, - all( - linux_kernel, - not(any(target_arch = "powerpc", target_arch = "powerpc64")) - ) - )))] + #[cfg(not(any(linux_kernel, bsd)))] pub(crate) const fn decode(encoded_speed: c::speed_t) -> Option { match encoded_speed { c::B0 => Some(0), @@ -1144,7 +1119,6 @@ solarish, target_os = "aix", target_os = "haiku", - target_os = "hurd", target_os = "nto", )))] pub const VSWTC: Self = Self(c::VSWTC as usize); @@ -1277,8 +1251,8 @@ check_renamed_struct_renamed_field!(Termios, termios, local_modes, c_lflag); check_renamed_struct_renamed_field!(Termios, termios, special_codes, c_cc); - // On everything except PowerPC, `termios` matches `termios2` except - // for the addition of `c_ispeed` and `c_ospeed`. + // On everything except PowerPC, `termios` matches `termios2` except for + // the addition of `c_ispeed` and `c_ospeed`. #[cfg(not(any(target_arch = "powerpc", target_arch = "powerpc64")))] const_assert_eq!( memoffset::offset_of!(Termios, input_speed), diff -Nru temporalio-1.3.0/vendor/rustix/src/thread/clock.rs temporalio-1.3.0/vendor/rustix/src/thread/clock.rs --- temporalio-1.3.0/vendor/rustix/src/thread/clock.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/thread/clock.rs 2023-10-30 19:40:00.000000000 +0000 @@ -9,7 +9,6 @@ target_os = "freebsd", // FreeBSD 12 has clock_nanosleep, but libc targets FreeBSD 11. target_os = "openbsd", target_os = "redox", - target_os = "vita", target_os = "wasi", )))] pub use crate::clockid::ClockId; @@ -35,7 +34,6 @@ target_os = "haiku", target_os = "openbsd", target_os = "redox", - target_os = "vita", target_os = "wasi", )))] #[inline] @@ -64,7 +62,6 @@ target_os = "haiku", target_os = "openbsd", target_os = "redox", - target_os = "vita", target_os = "wasi", )))] #[inline] diff -Nru temporalio-1.3.0/vendor/rustix/src/thread/futex.rs temporalio-1.3.0/vendor/rustix/src/thread/futex.rs --- temporalio-1.3.0/vendor/rustix/src/thread/futex.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/thread/futex.rs 2023-10-30 19:40:00.000000000 +0000 @@ -9,7 +9,7 @@ use crate::thread::Timespec; use crate::{backend, io}; -pub use backend::thread::futex::{FutexFlags, FutexOperation}; +pub use backend::thread::{FutexFlags, FutexOperation}; /// `futex(uaddr, op, val, utime, uaddr2, val3)` /// diff -Nru temporalio-1.3.0/vendor/rustix/src/thread/id.rs temporalio-1.3.0/vendor/rustix/src/thread/id.rs --- temporalio-1.3.0/vendor/rustix/src/thread/id.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/thread/id.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,8 +1,7 @@ +use crate::pid::Pid; +use crate::ugid::{Gid, Uid}; use crate::{backend, io}; -pub use crate::pid::{Pid, RawPid}; -pub use crate::ugid::{Gid, RawGid, RawUid, Uid}; - /// `gettid()`—Returns the thread ID. /// /// This returns the OS thread ID, which is not necessarily the same as the @@ -70,7 +69,7 @@ /// /// # Warning /// -/// This is not the setxid you are looking for… POSIX requires xids to be +/// This is not the setxid you are looking for... POSIX requires xids to be /// process granular, but on Linux they are per-thread. Thus, this call only /// changes the xid for the current *thread*, not the entire process even /// though that is in violation of the POSIX standard. @@ -95,7 +94,7 @@ /// /// # Warning /// -/// This is not the setresxid you are looking for… POSIX requires xids to be +/// This is not the setresxid you are looking for... POSIX requires xids to be /// process granular, but on Linux they are per-thread. Thus, this call only /// changes the xid for the current *thread*, not the entire process even /// though that is in violation of the POSIX standard. diff -Nru temporalio-1.3.0/vendor/rustix/src/thread/libcap.rs temporalio-1.3.0/vendor/rustix/src/thread/libcap.rs --- temporalio-1.3.0/vendor/rustix/src/thread/libcap.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/thread/libcap.rs 2023-10-30 19:40:00.000000000 +0000 @@ -102,9 +102,6 @@ const BPF = 1 << linux_raw_sys::general::CAP_BPF; /// `CAP_CHECKPOINT_RESTORE` const CHECKPOINT_RESTORE = 1 << linux_raw_sys::general::CAP_CHECKPOINT_RESTORE; - - /// - const _ = !0; } } diff -Nru temporalio-1.3.0/vendor/rustix/src/thread/mod.rs temporalio-1.3.0/vendor/rustix/src/thread/mod.rs --- temporalio-1.3.0/vendor/rustix/src/thread/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/thread/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -2,7 +2,7 @@ #[cfg(not(target_os = "redox"))] mod clock; -#[cfg(linux_kernel)] +#[cfg(linux_raw)] mod futex; #[cfg(linux_kernel)] mod id; @@ -15,13 +15,10 @@ #[cfg(not(target_os = "redox"))] pub use clock::*; -#[cfg(linux_kernel)] +#[cfg(linux_raw)] pub use futex::{futex, FutexFlags, FutexOperation}; #[cfg(linux_kernel)] -pub use id::{ - gettid, set_thread_gid, set_thread_res_gid, set_thread_res_uid, set_thread_uid, Gid, Pid, - RawGid, RawPid, RawUid, Uid, -}; +pub use id::{gettid, set_thread_gid, set_thread_res_gid, set_thread_res_uid, set_thread_uid}; #[cfg(linux_kernel)] pub use libcap::{capabilities, set_capabilities, CapabilityFlags, CapabilitySets}; #[cfg(linux_kernel)] diff -Nru temporalio-1.3.0/vendor/rustix/src/thread/prctl.rs temporalio-1.3.0/vendor/rustix/src/thread/prctl.rs --- temporalio-1.3.0/vendor/rustix/src/thread/prctl.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/thread/prctl.rs 2023-10-30 19:40:00.000000000 +0000 @@ -19,9 +19,7 @@ use crate::backend::c::{c_int, c_uint, c_void}; use crate::backend::prctl::syscalls; -use crate::ffi::CStr; -#[cfg(feature = "alloc")] -use crate::ffi::CString; +use crate::ffi::{CStr, CString}; use crate::io; use crate::pid::Pid; use crate::prctl::{ @@ -63,7 +61,6 @@ // PR_GET_NAME/PR_SET_NAME // -#[cfg(feature = "alloc")] const PR_GET_NAME: c_int = 16; /// Get the name of the calling thread. @@ -73,7 +70,6 @@ /// /// [`prctl(PR_GET_NAME,...)`]: https://man7.org/linux/man-pages/man2/prctl.2.html #[inline] -#[cfg(feature = "alloc")] pub fn name() -> io::Result { let mut buffer = [0_u8; 16]; unsafe { prctl_2args(PR_GET_NAME, buffer.as_mut_ptr().cast())? }; @@ -205,8 +201,8 @@ /// cleared on successful return from `chown` (not implemented). FileSetID = linux_raw_sys::general::CAP_FSETID, /// Overrides the restriction that the real or effective user ID of a - /// process sending a signal must match the real or effective user ID of - /// the process receiving the signal. + /// process sending a signal must match the real or effective user ID + /// of the process receiving the signal. Kill = linux_raw_sys::general::CAP_KILL, /// Allows `setgid` manipulation. Allows `setgroups`. Allows forged gids on /// socket credentials passing. @@ -366,9 +362,8 @@ /// /// [`Capability::SystemAdmin`] is required to use bpf_probe_write_user. /// - /// [`Capability::SystemAdmin`] is required to iterate system-wide loaded - /// programs, maps, links, and BTFs, and convert their IDs to file - /// descriptors. + /// [`Capability::SystemAdmin`] is required to iterate system wide loaded + /// programs, maps, links, BTFs and convert their IDs to file descriptors. /// /// [`Capability::PerformanceMonitoring`] and /// [`Capability::BerkeleyPacketFilters`] are required to load tracing @@ -443,9 +438,6 @@ const NO_CAP_AMBIENT_RAISE = 1_u32 << 6; /// Set [`NO_CAP_AMBIENT_RAISE`] irreversibly. const NO_CAP_AMBIENT_RAISE_LOCKED = 1_u32 << 7; - - /// - const _ = !0; } } @@ -743,21 +735,16 @@ const PR_MTE_TAG_MASK: u32 = 0xffff_u32 << PR_MTE_TAG_SHIFT; bitflags! { - /// Zero means addresses that are passed for the purpose of being - /// dereferenced by the kernel must be untagged. + /// Zero means addresses that are passed for the purpose of being dereferenced by the kernel must be untagged. #[repr(transparent)] #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] pub struct TaggedAddressMode: u32 { - /// Addresses that are passed for the purpose of being dereferenced by - /// the kernel may be tagged. + /// Addresses that are passed for the purpose of being dereferenced by the kernel may be tagged. const ENABLED = 1_u32 << 0; /// Synchronous tag check fault mode. const TCF_SYNC = 1_u32 << 1; /// Asynchronous tag check fault mode. const TCF_ASYNC = 1_u32 << 2; - - /// - const _ = !0; } } @@ -784,8 +771,8 @@ /// /// # Safety /// -/// Please ensure the conditions necessary to safely call this function, as -/// detailed in the references above. +/// Please ensure the conditions necessary to safely call this function, +/// as detailed in the references above. /// /// [`prctl(PR_SET_TAGGED_ADDR_CTRL,...)`]: https://man7.org/linux/man-pages/man2/prctl.2.html #[inline] @@ -813,8 +800,8 @@ /// /// # Safety /// -/// Please ensure the conditions necessary to safely call this function, as -/// detailed in the references above. +/// Please ensure the conditions necessary to safely call this function, +/// as detailed in the references above. /// /// [`prctl(PR_SET_SYSCALL_USER_DISPATCH,PR_SYS_DISPATCH_OFF,...)`]: https://man7.org/linux/man-pages/man2/prctl.2.html #[inline] @@ -859,8 +846,8 @@ /// /// # Safety /// -/// Please ensure the conditions necessary to safely call this function, as -/// detailed in the references above. +/// Please ensure the conditions necessary to safely call this function, +/// as detailed in the references above. /// /// [`prctl(PR_SET_SYSCALL_USER_DISPATCH,PR_SYS_DISPATCH_ON,...)`]: https://man7.org/linux/man-pages/man2/prctl.2.html #[inline] diff -Nru temporalio-1.3.0/vendor/rustix/src/thread/setns.rs temporalio-1.3.0/vendor/rustix/src/thread/setns.rs --- temporalio-1.3.0/vendor/rustix/src/thread/setns.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/thread/setns.rs 2023-10-30 19:40:00.000000000 +0000 @@ -30,9 +30,6 @@ const PROCESS_ID = CLONE_NEWPID; /// Network name space. const NETWORK = CLONE_NEWNET; - - /// - const _ = !0; } } @@ -85,9 +82,6 @@ const NEWUTS = CLONE_NEWUTS; /// `CLONE_SYSVSEM`. const SYSVSEM = CLONE_SYSVSEM; - - /// - const _ = !0; } } @@ -102,7 +96,7 @@ /// /// [Linux]: https://man7.org/linux/man-pages/man2/setns.2.html pub fn move_into_link_name_space( - fd: BorrowedFd<'_>, + fd: BorrowedFd, allowed_type: Option, ) -> io::Result<()> { let allowed_type = allowed_type.map_or(0, |t| t as c_int); @@ -119,7 +113,7 @@ /// /// [Linux]: https://man7.org/linux/man-pages/man2/setns.2.html pub fn move_into_thread_name_spaces( - fd: BorrowedFd<'_>, + fd: BorrowedFd, allowed_types: ThreadNameSpaceType, ) -> io::Result<()> { syscalls::setns(fd, allowed_types.bits() as c_int).map(|_r| ()) diff -Nru temporalio-1.3.0/vendor/rustix/src/timespec.rs temporalio-1.3.0/vendor/rustix/src/timespec.rs --- temporalio-1.3.0/vendor/rustix/src/timespec.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/timespec.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,7 +1,6 @@ //! `Timespec` and related types, which are used by multiple public API //! modules. -#[cfg(not(fix_y2038))] use crate::backend::c; /// `struct timespec` @@ -29,22 +28,18 @@ #[cfg(fix_y2038)] pub type Secs = i64; -/// A type for the `tv_sec` field of [`Timespec`]. -#[cfg(any( - fix_y2038, - linux_raw, - all(libc, target_arch = "x86_64", target_pointer_width = "32") -))] +/// A type for the `tv_nsec` field of [`Timespec`]. +#[cfg(all(libc, target_arch = "x86_64", target_pointer_width = "32"))] pub type Nsecs = i64; /// A type for the `tv_nsec` field of [`Timespec`]. -#[cfg(all( - not(fix_y2038), - libc, - not(all(target_arch = "x86_64", target_pointer_width = "32")) -))] +#[cfg(all(libc, not(all(target_arch = "x86_64", target_pointer_width = "32"))))] pub type Nsecs = c::c_long; +/// A type for the `tv_nsec` field of [`Timespec`]. +#[cfg(linux_raw)] +pub type Nsecs = i64; + /// On 32-bit glibc platforms, `timespec` has anonymous padding fields, which /// Rust doesn't support yet (see `unnamed_fields`), so we define our own /// struct with explicit padding, with bidirectional `From` impls. @@ -57,7 +52,7 @@ #[cfg(target_endian = "big")] padding: core::mem::MaybeUninit, - pub(crate) tv_nsec: i32, + pub(crate) tv_nsec: Nsecs, #[cfg(target_endian = "little")] padding: core::mem::MaybeUninit, @@ -69,7 +64,7 @@ fn from(t: LibcTimespec) -> Self { Self { tv_sec: t.tv_sec, - tv_nsec: t.tv_nsec as _, + tv_nsec: t.tv_nsec, } } } @@ -80,7 +75,7 @@ fn from(t: Timespec) -> Self { Self { tv_sec: t.tv_sec, - tv_nsec: t.tv_nsec as _, + tv_nsec: t.tv_nsec, padding: core::mem::MaybeUninit::uninit(), } } diff -Nru temporalio-1.3.0/vendor/rustix/src/weak.rs temporalio-1.3.0/vendor/rustix/src/weak.rs --- temporalio-1.3.0/vendor/rustix/src/weak.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustix/src/weak.rs 2023-10-30 19:40:00.000000000 +0000 @@ -184,7 +184,7 @@ // Pass `BorrowedFd` values as the integer value. impl AsSyscallArg for $crate::fd::BorrowedFd<'_> { - type SyscallArgType = ::libc::c_int; + type SyscallArgType = ::libc::c_long; fn into_syscall_arg(self) -> Self::SyscallArgType { $crate::fd::AsRawFd::as_raw_fd(&self) as _ } @@ -192,31 +192,31 @@ // Coerce integer values into `c_long`. impl AsSyscallArg for i8 { - type SyscallArgType = ::libc::c_int; - fn into_syscall_arg(self) -> Self::SyscallArgType { self.into() } + type SyscallArgType = ::libc::c_long; + fn into_syscall_arg(self) -> Self::SyscallArgType { self as _ } } impl AsSyscallArg for u8 { - type SyscallArgType = ::libc::c_int; - fn into_syscall_arg(self) -> Self::SyscallArgType { self.into() } + type SyscallArgType = ::libc::c_long; + fn into_syscall_arg(self) -> Self::SyscallArgType { self as _ } } impl AsSyscallArg for i16 { - type SyscallArgType = ::libc::c_int; - fn into_syscall_arg(self) -> Self::SyscallArgType { self.into() } + type SyscallArgType = ::libc::c_long; + fn into_syscall_arg(self) -> Self::SyscallArgType { self as _ } } impl AsSyscallArg for u16 { - type SyscallArgType = ::libc::c_int; - fn into_syscall_arg(self) -> Self::SyscallArgType { self.into() } + type SyscallArgType = ::libc::c_long; + fn into_syscall_arg(self) -> Self::SyscallArgType { self as _ } } impl AsSyscallArg for i32 { - type SyscallArgType = ::libc::c_int; - fn into_syscall_arg(self) -> Self::SyscallArgType { self } + type SyscallArgType = ::libc::c_long; + fn into_syscall_arg(self) -> Self::SyscallArgType { self as _ } } impl AsSyscallArg for u32 { - type SyscallArgType = ::libc::c_uint; - fn into_syscall_arg(self) -> Self::SyscallArgType { self } + type SyscallArgType = ::libc::c_long; + fn into_syscall_arg(self) -> Self::SyscallArgType { self as _ } } impl AsSyscallArg for usize { - type SyscallArgType = ::libc::c_ulong; + type SyscallArgType = ::libc::c_long; fn into_syscall_arg(self) -> Self::SyscallArgType { self as _ } } @@ -225,12 +225,12 @@ #[cfg(target_pointer_width = "64")] impl AsSyscallArg for i64 { type SyscallArgType = ::libc::c_long; - fn into_syscall_arg(self) -> Self::SyscallArgType { self } + fn into_syscall_arg(self) -> Self::SyscallArgType { self as _ } } #[cfg(target_pointer_width = "64")] impl AsSyscallArg for u64 { - type SyscallArgType = ::libc::c_ulong; - fn into_syscall_arg(self) -> Self::SyscallArgType { self } + type SyscallArgType = ::libc::c_long; + fn into_syscall_arg(self) -> Self::SyscallArgType { self as _ } } // `concat_idents` is [unstable], so we take an extra `sys_name` diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/benches/benchmarks.rs temporalio-1.3.0/vendor/rustls-0.20.9/benches/benchmarks.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/benches/benchmarks.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/benches/benchmarks.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,26 +0,0 @@ -use criterion::criterion_group; -use criterion::criterion_main; -/// Microbenchmarks go here. Larger benchmarks of (e.g..) protocol -/// performance go in examples/internal/bench.rs. -use criterion::Criterion; - -#[path = "../tests/common/mod.rs"] -mod test_utils; -use test_utils::*; - -use rustls::ServerConnection; - -use std::io; -use std::sync::Arc; - -fn bench_ewouldblock(c: &mut Criterion) { - let server_config = make_server_config(KeyType::Rsa); - let mut server = ServerConnection::new(Arc::new(server_config)).unwrap(); - let mut read_ewouldblock = FailsReads::new(io::ErrorKind::WouldBlock); - c.bench_function("read_tls with EWOULDBLOCK", move |b| { - b.iter(|| server.read_tls(&mut read_ewouldblock)) - }); -} - -criterion_group!(benches, bench_ewouldblock); -criterion_main!(benches); diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/build.rs temporalio-1.3.0/vendor/rustls-0.20.9/build.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/build.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/build.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,13 +0,0 @@ -/// This build script allows us to enable the `read_buf` language feature only -/// for Rust Nightly. -/// -/// See the comment in lib.rs to understand why we need this. - -#[cfg_attr(feature = "read_buf", rustversion::not(nightly))] -fn main() {} - -#[cfg(feature = "read_buf")] -#[rustversion::nightly] -fn main() { - println!("cargo:rustc-cfg=read_buf"); -} diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/.cargo-checksum.json temporalio-1.3.0/vendor/rustls-0.20.9/.cargo-checksum.json --- temporalio-1.3.0/vendor/rustls-0.20.9/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/.cargo-checksum.json 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -{"files":{"Cargo.lock":"7d1fc14017dce3fdef4afb72e0bda5d7828855c28bd8fc797fbd035821874372","Cargo.toml":"a8c0392dba251c2c5bcfa734fa083fa7a99b1b547c1b860358f2a107cc7dd5bc","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-ISC":"7cfafc877eccc46c0e346ccbaa5c51bb6b894d2b818e617d970211e232785ad4","LICENSE-MIT":"709e3175b4212f7b13aa93971c9f62ff8c69ec45ad8c6532a7e0c41d7a7d6f8c","README.md":"3e4f54cee7b4b46e1ea1054e7002a50a7a2c714184486611fdc5cded2954d2f4","benches/benchmarks.rs":"0b2c93b68fd4085aaf9748c6f764838b1c070c903564c69f0222a0bb10ded0cc","build.rs":"83af94fa10c4be7653b2b69e1a4656239ecf6fbdfc225341f10e1ec7121b383e","examples/internal/bench.rs":"e94d4db55bc91be6ac1467f56364a3d36a4e4d81b85a8f2c75f859a419615a3a","examples/internal/bogo_shim.rs":"6d6847f5ebdc6372253fa5099ca16d5adc19bcfdd0f01907fb15b9a3f410f6dd","examples/internal/trytls_shim.rs":"88376622d4beeadd3e23fec02cd78df1faf654f306b778d601e24fd32f89c763","src/anchors.rs":"6d665459ff6471cbdeb8dd718542de40bd907d4b6eab5a9cb0f968f7fe7d432a","src/bs_debug.rs":"6a209655cea0ced94f4fc6341bf654a05ca1aa162c67361b3b2c8e28d179b156","src/builder.rs":"d017e40f1fc28e802ee7c7a7b6b1d513f3fca712a05223f24defe62dfe8b95ac","src/check.rs":"8bb5b2e2ac11edaee8ef43620bd3d39911f863e6e436740287a47b00d0c5a0d1","src/cipher.rs":"7345962dc4a4e8ff2826f01285b56f85f04dcec514f92067006bea69ebebbdcb","src/client/builder.rs":"559d27ed1af8165445a7acb4100c2bbd3900265335f4abaf3ba0479f0a1e4028","src/client/client_conn.rs":"4497c792094f556f5596953ce1d5ae7c5b74687e9735bd4bb6f697ea0c2ea872","src/client/common.rs":"d8dcdeb142968308c488e7f04b8c8aa04948168c7cd4024f5b29fe653c460930","src/client/handy.rs":"59803ee39e936996a397f8efc5870c1ed2aba5bd94a54d998ca37ff57904a555","src/client/hs.rs":"669097609f6199319a9a01fb111257a485ab0903c966ee6c30227450cd824075","src/client/tls12.rs":"a892e37ed8bc61de4338ade907b6e5a4d2a69b99f4a0ececc5b31e0b5440f2f5","src/client/tls13.rs":"17723e1e2d31de3d677e3112de9ca8b7bea996299bd110f51ccfec54bdb8845b","src/conn.rs":"3c7b2f24096ac2b778e9038c18e1387557cf1acae8f48b998dc48f8dbf2a696c","src/enums.rs":"40155db4b732a0010a72fcc028450b6679e73f470d37a6cc99ddd00268267270","src/error.rs":"b5e31d234abac5cf6c4e7701a717ca0afaabbe65c8c53b55d12cd117f46c9ae8","src/hash_hs.rs":"4adfdc3caadf97dfa49c33cede24f92e0a51e9dd4e56f7bc78c5c48f1e4fe1da","src/key.rs":"2e6369d60bc7c3fdfe2afbd070b47fb6a961c724f5ffabf74e5eb0f16ea763d5","src/key_log.rs":"781a86f2e9e07d82288f3c130ce3cfe36f3c17743c28bd5d8036d7b5afa1d5f7","src/key_log_file.rs":"d9f68aa1d30af89e22986ac9e0b3d619e511ae254d12600cf0f22865592ed889","src/kx.rs":"ad5a1143153406f019372db51f83cfe64ac6df61d59c4f36f9f88aaaa6ef5c23","src/lib.rs":"8d69f1886fd8b62aa78236c00cbc5bc5720ec6fbd50bbf6799cf3741ce1b0b8c","src/limited_cache.rs":"88303c7b3cb78c77682c1d930793d8b5fca5b22383bd4a1c11ddebadfa93ab5e","src/manual/defaults.rs":"d4d44d094c8dee1e595988674c1f7e19c3d73ae51b8c7aa9921fd8a1a33ad015","src/manual/features.rs":"5aef65271e980cef6ab3be21cd2bfcf18eb4fcb8e7bca1c46788d4fdbd951a22","src/manual/howto.rs":"cded032780c8f7eb48620bf9bfd5f02482f720da9146b2c87c6e4d926d29234a","src/manual/implvulns.rs":"d023ad1183f57bc9bfa20f1fa3c5048f4378548cbb23cbe5bf238fcba598a1ef","src/manual/mod.rs":"8348373cb7d6f21da000ceeba4e39f79e2e81a3a8d01841847d8e54e3a7b6dba","src/manual/tlsvulns.rs":"e9b756bbc9c880a1c754365f361cfc334bfcbc0d457b4c7e50147a0ca181d686","src/msgs/alert.rs":"f121ec448e2144c7759ffd1be7e304c65187bb9f4405a899ee7f33d29ea2c75f","src/msgs/base.rs":"3e7a531287a0ce9a01fb849157cc8351f99dbd41802725629ce09e12383bb7ed","src/msgs/ccs.rs":"616c8ec0b25f5e0562a216144fc94c9c90b963e1742f46a797fe2ed62c3a0b1a","src/msgs/codec.rs":"46a6e8f5d583be2aa9b75fb464c09b1492d4e95a925b24cc2f8f62f731745339","src/msgs/deframer.rs":"e67a3b880cd6bfb1e6f844f8ed60e2c63cac71b771df5bbb0cf256ca96e0bc5f","src/msgs/enums.rs":"413e5f827f7466db4170262b4cd66f7075cb2617f1ac6ab19f7018907efe2c97","src/msgs/enums_test.rs":"efac5515d5b5a745113e52fc707dfa1a6ae37e591337e3dab94476370767eac9","src/msgs/fragmenter.rs":"52d0a455454ab9b504f1f2cd990ec62d47622bb188c8a542f0b1bc903e2b04ae","src/msgs/handshake-test.1.bin":"dfc0687f3b9902e7a0dfd2ebf59d73745b23b103e1d2b337ff555dfe42c5d1dd","src/msgs/handshake.rs":"c8a346180a81799ee5e48ff270b4941b67f57924f7f095283b77dbc31154021d","src/msgs/handshake_test.rs":"ba6d1e31f0401b77a8130ca41a972c2285c2d23c73e60ecc2cfe7178d815deb3","src/msgs/hello-api.devicecheck.apple.com.bin":"2bc3d61745598bf03d412fbcf482152d6810f674f6f6e7dab4fca90b71797c93","src/msgs/hsjoiner.rs":"18da4b1be91ef81a7c7e6b9b6a2908e5c2d2eeec8b92a7bdd5388d42fc9ee9ab","src/msgs/macros.rs":"f82d96fea54ca8e4a1dc3fba2dbb4b80ded4914fd0624cbe952cc357dcb756d7","src/msgs/message.rs":"a6dca50ed6b298aa8db94d08d1f66e019511cb88fcb273d816342061555e3367","src/msgs/message_test.rs":"25767c8b27bf4a49dc73c77788172dbd728e2ab845fa628ee11168d4c359abca","src/msgs/mod.rs":"a081e7409db440221965acad745ca92dc8769c4f73b7b4f19739b50482010a81","src/msgs/persist.rs":"3ec96774c4e01888b36b604f0fd1febd2979dedf3ff2fa7ff7e9b23160a48049","src/msgs/persist_test.rs":"f24e719d27f223eb964eab80d5ea2b585cdf26363011a79eb6dad91c678b4631","src/quic.rs":"09b5860ecc1419aed5c5d74cc529adb76c36d13b3f6eb4f9875e02470e6a1f80","src/rand.rs":"cca10f00636b43298df18bdf25987000e962fda1c8cb4ebbdc26fdc1ecf8a086","src/record_layer.rs":"ccb14f17ed1767b192f1bfc571a4f33b32f9d506a68fc6277815c91af8d3b0cf","src/server/builder.rs":"5bc8ecd3e13fce853e8cc8fef7871554d0d5b4b32145cc8de169a6f2b2f1045b","src/server/common.rs":"41d15562492bbe402960fac598f5c9f48702bb18c6038b3649eb398f620b5e89","src/server/handy.rs":"84428dfd7f3b5f8df00e30fea9b23132793ff9a220b135b36f04998510950a57","src/server/hs.rs":"994b62d6059c8a887f7dc4928ea3912dc58b6c39a4760e56523ccf75cd6402d3","src/server/server_conn.rs":"726fd623298954dfbe40a398ec970d80e89eee7ef108fa7aedf64ebcf10445e8","src/server/tls12.rs":"42ea16f6d19c98aaddd8dd59b3365d27a5f454b97bdd6ee57431f3a7e444417f","src/server/tls13.rs":"c0e26d8007ed54e1dd0658fcd1108d7da0d29f2dc10b14ccba278b6f952a2494","src/sign.rs":"e3e5c6aa1acd271d0432d90429322d604fc0753b69ae3b2f0185c05731271b0b","src/stream.rs":"88e6f54e1c7c5d629bf2ea7f1a8c453ffc8f799921b3ebcf9d2f05f621f69235","src/suites.rs":"e7bba571a5ecbd904b2424f86dd3acc1b155dca5338d20394af49c0bb5c716b2","src/testdata/cert-arstechnica.0.der":"46aabc708067403be19c801e364b3d74d142fa34f0d236bd5ebb78b6ea92ee09","src/testdata/cert-arstechnica.1.der":"f55f9ffcb83c73453261601c7e044db15a0f034b93c05830f28635ef889cf670","src/testdata/cert-arstechnica.2.der":"87dcd4dc74640a322cd205552506d1be64f12596258096544986b4850bc72706","src/testdata/cert-arstechnica.3.der":"28689b30e4c306aab53b027b29e36ad6dd1dcf4b953994482ca84bdc1ecac996","src/testdata/cert-duckduckgo.0.der":"a5d67800ebb234db3814a0fa562d57ddc6f3d55fe999012d67ccce96eedec9d5","src/testdata/cert-duckduckgo.1.der":"52274c57ce4dee3b49db7a7ff708c040f771898b3be88725a86fb4430182fe14","src/testdata/cert-github.0.der":"0ae384bfd4dde9d13e50c5857c05a442c93f8e01445ee4b34540d22bd1e37f1b","src/testdata/cert-github.1.der":"74eab573da7db195097be0e90f334934c7a4c89e8083759db4333a00edd243d9","src/testdata/cert-google.0.der":"41204cc6d81b76f1ec47cc3ec42dd8beca364cfc3d60eef23426aba6d2fb527f","src/testdata/cert-google.1.der":"23ecb03eec17338c4e33a6b48a41dc3cda12281bbc3ff813c0589d6cc2387522","src/testdata/cert-google.2.der":"3ee0278df71fa3c125c4cd487f01d774694e6fc57e0cd94c24efd769133918e5","src/testdata/cert-hn.0.der":"34556ed249da9c079c6ab4394a7ec0faeb58802ade1131a21952655e2f9c601e","src/testdata/cert-hn.1.der":"52274c57ce4dee3b49db7a7ff708c040f771898b3be88725a86fb4430182fe14","src/testdata/cert-reddit.0.der":"c6691fc719fb3afe21ee36ff30c34270a26bec774cde6c5359de960b95efb542","src/testdata/cert-reddit.1.der":"52274c57ce4dee3b49db7a7ff708c040f771898b3be88725a86fb4430182fe14","src/testdata/cert-rustlang.0.der":"8b9884fd898113bcc1158665b8799dcc916b0439154bdb1fb1a34aac90f70740","src/testdata/cert-rustlang.1.der":"f55f9ffcb83c73453261601c7e044db15a0f034b93c05830f28635ef889cf670","src/testdata/cert-rustlang.2.der":"87dcd4dc74640a322cd205552506d1be64f12596258096544986b4850bc72706","src/testdata/cert-rustlang.3.der":"28689b30e4c306aab53b027b29e36ad6dd1dcf4b953994482ca84bdc1ecac996","src/testdata/cert-servo.0.der":"eb197f28ce58d8d0fa3d92e2e2d7be5b98de354410aa66ddd3016e3f24a7250a","src/testdata/cert-servo.1.der":"3abbe63daf756c5016b6b85f52015fd8e8acbe277c5087b127a60563a841ed8a","src/testdata/cert-stackoverflow.0.der":"f4abeb331e28cceb20da7fc18ca95590c0ed1f4e63f52b637b23b9bc06665e64","src/testdata/cert-stackoverflow.1.der":"67add1166b020ae61b8f5fc96813c04c2aa589960796865572a3c7e737613dfd","src/testdata/cert-stackoverflow.2.der":"6d99fb265eb1c5b3744765fcbc648f3cd8e1bffafdc4c2f99b9d47cf7ff1c24f","src/testdata/cert-twitter.0.der":"fe7c6283d9f01487f3637a9d3f51dbe89c12ae6a8ba072bb39392045d403c770","src/testdata/cert-twitter.1.der":"25768713d3b459f9382d2a594f85f34709fd2a8930731542a4146ffb246bec69","src/testdata/cert-wapo.0.der":"babb936bd25e338826c345561b93f8acf15c643a7d6ef07a2168bcc10ad99bb3","src/testdata/cert-wapo.1.der":"75c5b3f01fd1f51a2c447ab7c785d72e69fa9c472c08571e7eadf3b8eabae70c","src/testdata/cert-wikipedia.0.der":"570a5629103e749596336c7ba750d385ed124db5ddbdd6461546500fe81653f2","src/testdata/cert-wikipedia.1.der":"f7a9a1b2fd964a3f2670bd668d561fb7c55d3aa9ab8391e7e169702db8a3dbcf","src/testdata/deframer-empty-applicationdata.bin":"b86ffa54a7c45e93a27d6255cb5037a3d51c6714077883601f06b619892aa0bb","src/testdata/deframer-invalid-contenttype.bin":"5b7e3b73fd67dcd7de3853ba6c1bdc91d5c46936845520744d610254b68b4826","src/testdata/deframer-invalid-empty.bin":"1d4a7cb76d38591ca1d062056e6bb4e409097663d2bf4866e91094e4e317a7a3","src/testdata/deframer-invalid-length.bin":"400f1998d0f76b4e40c030508e779dfbcb3e3359b79704737c9cf36f67221b8b","src/testdata/deframer-invalid-version.bin":"7e9f00a1ada82bbd42c3482e7d0245f657beeaaa2d297342d3a8fbeb58db5ebe","src/testdata/deframer-test.1.bin":"33e15a17ebdee1f2c2c7918f114791492058df12c8c9fc497876ff9d6f7ebb55","src/testdata/deframer-test.2.bin":"a850ca71fdd1cb5a26324bd204d7179aa320ac5324e2b02d1499c87bc8f9689e","src/testdata/eddsakey.der":"606bc208c72f30d11ce19e3d2b93365f6d3e12ccaf87055589f349f390c26a03","src/testdata/nistp256key.der":"02147f779ac9234e561753715383cff4339d142a674a456071b40a63f657673a","src/testdata/nistp256key.pkcs8.der":"8ac0d1f37d827866d4396497b4016c1cdadfb740248bfe1eea24f73a9f1d4d86","src/testdata/nistp384key.der":"ed67accafd2fc24881f9200fd438c10ddd586f9a7d672981c42eb5f7f17abfeb","src/testdata/nistp384key.pkcs8.der":"469e695487cc8aaf5109907b1d201be54f0ee768ce8c0e90b9d63bde98a27980","src/testdata/prf-result.1.bin":"ba86827dfe61b8dd2037e4e8f094d15f1bb574850ae205c8b412814f8ec1284e","src/testdata/prf-result.2.bin":"b46941b6e44dfe3e6b49fef860bc976b1cd6f8829d784991928f1b7ba119716f","src/testdata/rsa2048key.pkcs1.der":"1ba5d98f8477176468664b7b2120566dc3b7e955119cba6c56f7a19a31267bcb","src/testdata/rsa2048key.pkcs8.der":"2e2a42e8e9bfed26a7836244a89cd5fc440b612ae08655b21c8e4b126440d873","src/ticketer.rs":"93c8ed2256ad1520eb8fad01f427e2f811f44efa88cc4ace63e0fe46859bfab0","src/tls12/cipher.rs":"8ed836583e58f86bafaee1faabbd72ff1cfed5f79132345843eb6a72fdd885d8","src/tls12/mod.rs":"f81ccd16aeb72395fa3427a2bed68a17cb7003808fef9ecccf4662240e1e59c7","src/tls12/prf.rs":"03d3d6e08a0a5daf0f6b1d05bcc76c271c7497024f4ac007560cf00b046f03e0","src/tls13/key_schedule.rs":"2ecf3dee35fcc9fe952b8f7737f642699e6fa89bde56c1123b39156449e2301d","src/tls13/mod.rs":"04d715ee7c37e1152fbc8918b74b9b382d354df76fa83c48a51c9e0633e60b20","src/vecbuf.rs":"af52479b29390779d77f59a9f5b60863988ab1610d33a4b87a577f1934d478f6","src/verify.rs":"68c39f7a381a214bcab32188c3441235315a3561384db0f9613ef0859bd72082","src/verifybench.rs":"d7b30c313b73600a0d9b4a15cc55900fb808a4f7eebd76ad7b57f6f38de72ad1","src/versions.rs":"cdafa85b8af2c9452aa26c4d2e532dd71243676a9df256184eb8c5da5db37be1","src/x509.rs":"99230c9042731f4be98a7d07a89229dd675840aed30165e6dc8b191949b71079","tests/api.rs":"31f18fc0819aaba368ea2662f8a7b9e8579f87e7e26934ee4eb6c7d8f4f228ad","tests/bogo.rs":"34b9ce193d93b69a40ec3c529b3a225f2de40fc666f69c26df483fca453f0dd6","tests/client_cert_verifier.rs":"0ed04ee0b066551eeb1f9fc23d3a366662236985e87bee76cc82788b72856f6d","tests/common/mod.rs":"1cc2ebf1706604582f57026a21fd8a130f62b257245aee2005087dc6cdcbf4d2","tests/key_log_file_env.rs":"e2823c2e31c769c0ada203cf4415a8bd3f71176ee60cb00153537d51f2537278","tests/server_cert_verifier.rs":"f36fad333ced9cf58e221d4a2e0dc9042a581a5b06276ffc350112a8270e314d"},"package":"1b80e3dec595989ea8510028f30c408a4630db12c9cbb8de34203b89d6577e99"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/Cargo.lock temporalio-1.3.0/vendor/rustls-0.20.9/Cargo.lock --- temporalio-1.3.0/vendor/rustls-0.20.9/Cargo.lock 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/Cargo.lock 1970-01-01 00:00:00.000000000 +0000 @@ -1,721 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "aho-corasick" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6748e8def348ed4d14996fa801f4122cd763fff530258cdc03f64b25f89d3a5a" -dependencies = [ - "memchr", -] - -[[package]] -name = "atty" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" -dependencies = [ - "hermit-abi 0.1.19", - "libc", - "winapi", -] - -[[package]] -name = "autocfg" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" - -[[package]] -name = "base64" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" - -[[package]] -name = "base64" -version = "0.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "414dcefbc63d77c526a76b3afcf6fbb9b5e2791c19c3aa2297733208750c6e53" - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bumpalo" -version = "3.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" - -[[package]] -name = "cast" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" - -[[package]] -name = "cc" -version = "1.0.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" -dependencies = [ - "libc", -] - -[[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 = "criterion" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b01d6de93b2b6c65e17c634a26653a29d107b3c98c607c765bf38d041531cd8f" -dependencies = [ - "atty", - "cast", - "clap", - "criterion-plot", - "csv", - "itertools", - "lazy_static", - "num-traits", - "oorandom", - "plotters", - "rayon", - "regex", - "serde", - "serde_cbor", - "serde_derive", - "serde_json", - "tinytemplate", - "walkdir", -] - -[[package]] -name = "criterion-plot" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2673cc8207403546f45f5fd319a974b1e6983ad1a3ee7e6041650013be041876" -dependencies = [ - "cast", - "itertools", -] - -[[package]] -name = "crossbeam-channel" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" -dependencies = [ - "cfg-if", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-deque" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" -dependencies = [ - "cfg-if", - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7" -dependencies = [ - "autocfg", - "cfg-if", - "crossbeam-utils", - "memoffset", - "scopeguard", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "csv" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "626ae34994d3d8d668f4269922248239db4ae42d538b14c398b74a52208e8086" -dependencies = [ - "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.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" - -[[package]] -name = "env_logger" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a12e6657c4c97ebab115a42dcee77225f7f482cdd841cf7088c657a42e9e00e7" -dependencies = [ - "atty", - "humantime", - "log", - "regex", - "termcolor", -] - -[[package]] -name = "half" -version = "1.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7" - -[[package]] -name = "hermit-abi" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" -dependencies = [ - "libc", -] - -[[package]] -name = "hermit-abi" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" - -[[package]] -name = "humantime" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" - -[[package]] -name = "itertools" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "1.0.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" - -[[package]] -name = "js-sys" -version = "0.3.64" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" -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.147" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" - -[[package]] -name = "log" -version = "0.4.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" - -[[package]] -name = "memchr" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76fc44e2588d5b436dbc3c6cf62aef290f90dab6235744a93dfe1cc18f451e2c" - -[[package]] -name = "memoffset" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" -dependencies = [ - "autocfg", -] - -[[package]] -name = "num-traits" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" -dependencies = [ - "autocfg", -] - -[[package]] -name = "num_cpus" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" -dependencies = [ - "hermit-abi 0.3.2", - "libc", -] - -[[package]] -name = "once_cell" -version = "1.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" - -[[package]] -name = "oorandom" -version = "11.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575" - -[[package]] -name = "plotters" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2c224ba00d7cadd4d5c660deaf2098e5e80e07846537c51f9cfa4be50c1fd45" -dependencies = [ - "num-traits", - "plotters-backend", - "plotters-svg", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "plotters-backend" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e76628b4d3a7581389a35d5b6e2139607ad7c75b17aed325f210aa91f4a9609" - -[[package]] -name = "plotters-svg" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38f6d39893cca0701371e3c27294f09797214b86f1fb951b89ade8ec04e2abab" -dependencies = [ - "plotters-backend", -] - -[[package]] -name = "proc-macro2" -version = "1.0.66" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "quote" -version = "1.0.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "rayon" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d2df5196e37bcc87abebc0053e20787d73847bb33134a69841207dd0a47f03b" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d" -dependencies = [ - "crossbeam-channel", - "crossbeam-deque", - "crossbeam-utils", - "num_cpus", -] - -[[package]] -name = "regex" -version = "1.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12de2eff854e5fa4b1295edd650e227e9d8fb0c9e90b12e7f36d6a6811791a29" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49530408a136e16e5b486e883fbb6ba058e8e4e8ae6621a77b048b314336e629" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" - -[[package]] -name = "ring" -version = "0.16.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" -dependencies = [ - "cc", - "libc", - "once_cell", - "spin", - "untrusted", - "web-sys", - "winapi", -] - -[[package]] -name = "rustls" -version = "0.20.9" -dependencies = [ - "base64 0.13.1", - "criterion", - "env_logger", - "log", - "ring", - "rustls-pemfile", - "rustversion", - "sct", - "webpki", - "webpki-roots", -] - -[[package]] -name = "rustls-pemfile" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2" -dependencies = [ - "base64 0.21.3", -] - -[[package]] -name = "rustversion" -version = "1.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" - -[[package]] -name = "ryu" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" - -[[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.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "sct" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "serde" -version = "1.0.188" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9e0fcba69a370eed61bcf2b728575f726b50b55cba78064753d708ddc7549e" -dependencies = [ - "serde_derive", -] - -[[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.188" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "serde_json" -version = "1.0.105" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "693151e1ac27563d6dbcec9dee9fbd5da8539b20fa14ad3752b2e6d363ace360" -dependencies = [ - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "spin" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" - -[[package]] -name = "syn" -version = "2.0.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c324c494eba9d92503e6f1ef2e6df781e78f6a7705a0202d9801b198807d518a" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "termcolor" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" -dependencies = [ - "winapi-util", -] - -[[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 = "unicode-ident" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" - -[[package]] -name = "unicode-width" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" - -[[package]] -name = "untrusted" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" - -[[package]] -name = "walkdir" -version = "2.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698" -dependencies = [ - "same-file", - "winapi-util", -] - -[[package]] -name = "wasm-bindgen" -version = "0.2.87" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" -dependencies = [ - "cfg-if", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.87" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" -dependencies = [ - "bumpalo", - "log", - "once_cell", - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.87" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.87" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.87" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" - -[[package]] -name = "web-sys" -version = "0.3.64" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "webpki" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "webpki-roots" -version = "0.22.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c71e40d7d2c34a5106301fb632274ca37242cd0c9d3e64dbece371a40a2d87" -dependencies = [ - "webpki", -] - -[[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" diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/Cargo.toml temporalio-1.3.0/vendor/rustls-0.20.9/Cargo.toml --- temporalio-1.3.0/vendor/rustls-0.20.9/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/Cargo.toml 1970-01-01 00:00:00.000000000 +0000 @@ -1,107 +0,0 @@ -# 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" -rust-version = "1.60" -name = "rustls" -version = "0.20.9" -build = "build.rs" -autobenches = false -description = "Rustls is a modern TLS library written in Rust." -homepage = "https://github.com/rustls/rustls" -readme = "README.md" -categories = [ - "network-programming", - "cryptography", -] -license = "Apache-2.0/ISC/MIT" -repository = "https://github.com/rustls/rustls" -resolver = "2" - -[package.metadata.docs.rs] -all-features = true -rustdoc-args = [ - "--cfg", - "docsrs", -] - -[[example]] -name = "bogo_shim" -path = "examples/internal/bogo_shim.rs" -required-features = [ - "dangerous_configuration", - "quic", -] - -[[example]] -name = "trytls_shim" -path = "examples/internal/trytls_shim.rs" - -[[example]] -name = "bench" -path = "examples/internal/bench.rs" - -[[bench]] -name = "benchmarks" -path = "benches/benchmarks.rs" -harness = false - -[dependencies.log] -version = "0.4.4" -optional = true - -[dependencies.ring] -version = "0.16.20" - -[dependencies.sct] -version = "0.7.0" - -[dependencies.webpki] -version = "0.22.0" -features = [ - "alloc", - "std", -] - -[dev-dependencies.base64] -version = "0.13.0" - -[dev-dependencies.criterion] -version = "0.3.0" - -[dev-dependencies.env_logger] -version = "0.9.0" - -[dev-dependencies.log] -version = "0.4.4" - -[dev-dependencies.rustls-pemfile] -version = "1.0.0" - -[dev-dependencies.webpki-roots] -version = "0.22.0" - -[build-dependencies.rustversion] -version = "1.0.6" -optional = true - -[features] -dangerous_configuration = [] -default = [ - "logging", - "tls12", -] -logging = ["log"] -quic = [] -read_buf = ["rustversion"] -secret_extraction = [] -tls12 = [] diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/examples/internal/bench.rs temporalio-1.3.0/vendor/rustls-0.20.9/examples/internal/bench.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/examples/internal/bench.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/examples/internal/bench.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,664 +0,0 @@ -// This program does assorted benchmarking of rustls. -// -// Note: we don't use any of the standard 'cargo bench', 'test::Bencher', -// etc. because it's unstable at the time of writing. - -use std::convert::TryInto; -use std::env; -use std::fs; -use std::io::{self, Read, Write}; -use std::ops::Deref; -use std::ops::DerefMut; -use std::sync::Arc; -use std::time::{Duration, Instant}; - -use rustls::client::{ClientSessionMemoryCache, NoClientSessionStorage}; -use rustls::server::{ - AllowAnyAuthenticatedClient, NoClientAuth, NoServerSessionStorage, ServerSessionMemoryCache, -}; -use rustls::RootCertStore; -use rustls::Ticketer; -use rustls::{ClientConfig, ClientConnection}; -use rustls::{ConnectionCommon, SideData}; -use rustls::{ServerConfig, ServerConnection}; - -fn duration_nanos(d: Duration) -> f64 { - (d.as_secs() as f64) + f64::from(d.subsec_nanos()) / 1e9 -} - -fn _bench(count: usize, name: &'static str, f_setup: Fsetup, f_test: Ftest) -where - Fsetup: Fn() -> S, - Ftest: Fn(S), -{ - let mut times = Vec::new(); - - for _ in 0..count { - let state = f_setup(); - let start = Instant::now(); - f_test(state); - times.push(duration_nanos(Instant::now().duration_since(start))); - } - - println!("{}", name); - println!("{:?}", times); -} - -fn time(mut f: F) -> f64 -where - F: FnMut(), -{ - let start = Instant::now(); - f(); - let end = Instant::now(); - duration_nanos(end.duration_since(start)) -} - -fn transfer(left: &mut L, right: &mut R, expect_data: Option) -> f64 -where - L: DerefMut + Deref>, - R: DerefMut + Deref>, - LS: SideData, - RS: SideData, -{ - let mut tls_buf = [0u8; 262144]; - let mut read_time = 0f64; - let mut data_left = expect_data; - let mut data_buf = [0u8; 8192]; - - loop { - let mut sz = 0; - - while left.wants_write() { - let written = left - .write_tls(&mut tls_buf[sz..].as_mut()) - .unwrap(); - if written == 0 { - break; - } - - sz += written; - } - - if sz == 0 { - return read_time; - } - - let mut offs = 0; - loop { - let start = Instant::now(); - match right.read_tls(&mut tls_buf[offs..sz].as_ref()) { - Ok(read) => { - right.process_new_packets().unwrap(); - offs += read; - } - Err(err) => { - panic!("error on transfer {}..{}: {}", offs, sz, err); - } - } - - if let Some(left) = &mut data_left { - loop { - let sz = match right.reader().read(&mut data_buf) { - Ok(sz) => sz, - Err(err) if err.kind() == io::ErrorKind::WouldBlock => break, - Err(err) => panic!("failed to read data: {}", err), - }; - - *left -= sz; - if *left == 0 { - break; - } - } - } - - let end = Instant::now(); - read_time += duration_nanos(end.duration_since(start)); - if sz == offs { - break; - } - } - } -} - -#[derive(PartialEq, Clone, Copy)] -enum ClientAuth { - No, - Yes, -} - -#[derive(PartialEq, Clone, Copy)] -enum Resumption { - No, - SessionID, - Tickets, -} - -impl Resumption { - fn label(&self) -> &'static str { - match *self { - Resumption::No => "no-resume", - Resumption::SessionID => "sessionid", - Resumption::Tickets => "tickets", - } - } -} - -// copied from tests/api.rs -#[derive(PartialEq, Clone, Copy, Debug)] -enum KeyType { - Rsa, - Ecdsa, - Ed25519, -} - -struct BenchmarkParam { - key_type: KeyType, - ciphersuite: rustls::SupportedCipherSuite, - version: &'static rustls::SupportedProtocolVersion, -} - -impl BenchmarkParam { - const fn new( - key_type: KeyType, - ciphersuite: rustls::SupportedCipherSuite, - version: &'static rustls::SupportedProtocolVersion, - ) -> BenchmarkParam { - BenchmarkParam { - key_type, - ciphersuite, - version, - } - } -} - -static ALL_BENCHMARKS: &[BenchmarkParam] = &[ - #[cfg(feature = "tls12")] - BenchmarkParam::new( - KeyType::Rsa, - rustls::cipher_suite::TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, - &rustls::version::TLS12, - ), - #[cfg(feature = "tls12")] - BenchmarkParam::new( - KeyType::Ecdsa, - rustls::cipher_suite::TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, - &rustls::version::TLS12, - ), - #[cfg(feature = "tls12")] - BenchmarkParam::new( - KeyType::Rsa, - rustls::cipher_suite::TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, - &rustls::version::TLS12, - ), - #[cfg(feature = "tls12")] - BenchmarkParam::new( - KeyType::Rsa, - rustls::cipher_suite::TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, - &rustls::version::TLS12, - ), - #[cfg(feature = "tls12")] - BenchmarkParam::new( - KeyType::Rsa, - rustls::cipher_suite::TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, - &rustls::version::TLS12, - ), - #[cfg(feature = "tls12")] - BenchmarkParam::new( - KeyType::Ecdsa, - rustls::cipher_suite::TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, - &rustls::version::TLS12, - ), - #[cfg(feature = "tls12")] - BenchmarkParam::new( - KeyType::Ecdsa, - rustls::cipher_suite::TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, - &rustls::version::TLS12, - ), - BenchmarkParam::new( - KeyType::Rsa, - rustls::cipher_suite::TLS13_CHACHA20_POLY1305_SHA256, - &rustls::version::TLS13, - ), - BenchmarkParam::new( - KeyType::Rsa, - rustls::cipher_suite::TLS13_AES_256_GCM_SHA384, - &rustls::version::TLS13, - ), - BenchmarkParam::new( - KeyType::Rsa, - rustls::cipher_suite::TLS13_AES_128_GCM_SHA256, - &rustls::version::TLS13, - ), - BenchmarkParam::new( - KeyType::Ecdsa, - rustls::cipher_suite::TLS13_AES_128_GCM_SHA256, - &rustls::version::TLS13, - ), - BenchmarkParam::new( - KeyType::Ed25519, - rustls::cipher_suite::TLS13_AES_128_GCM_SHA256, - &rustls::version::TLS13, - ), -]; - -impl KeyType { - fn path_for(&self, part: &str) -> String { - match self { - KeyType::Rsa => format!("test-ca/rsa/{}", part), - KeyType::Ecdsa => format!("test-ca/ecdsa/{}", part), - KeyType::Ed25519 => format!("test-ca/eddsa/{}", part), - } - } - - fn get_chain(&self) -> Vec { - rustls_pemfile::certs(&mut io::BufReader::new( - fs::File::open(self.path_for("end.fullchain")).unwrap(), - )) - .unwrap() - .iter() - .map(|v| rustls::Certificate(v.clone())) - .collect() - } - - fn get_key(&self) -> rustls::PrivateKey { - rustls::PrivateKey( - rustls_pemfile::pkcs8_private_keys(&mut io::BufReader::new( - fs::File::open(self.path_for("end.key")).unwrap(), - )) - .unwrap()[0] - .clone(), - ) - } - - fn get_client_chain(&self) -> Vec { - rustls_pemfile::certs(&mut io::BufReader::new( - fs::File::open(self.path_for("client.fullchain")).unwrap(), - )) - .unwrap() - .iter() - .map(|v| rustls::Certificate(v.clone())) - .collect() - } - - fn get_client_key(&self) -> rustls::PrivateKey { - rustls::PrivateKey( - rustls_pemfile::pkcs8_private_keys(&mut io::BufReader::new( - fs::File::open(self.path_for("client.key")).unwrap(), - )) - .unwrap()[0] - .clone(), - ) - } -} - -fn make_server_config( - params: &BenchmarkParam, - client_auth: ClientAuth, - resume: Resumption, - max_fragment_size: Option, -) -> ServerConfig { - let client_auth = match client_auth { - ClientAuth::Yes => { - let roots = params.key_type.get_chain(); - let mut client_auth_roots = RootCertStore::empty(); - for root in roots { - client_auth_roots.add(&root).unwrap(); - } - AllowAnyAuthenticatedClient::new(client_auth_roots) - } - ClientAuth::No => NoClientAuth::new(), - }; - - let mut cfg = ServerConfig::builder() - .with_safe_default_cipher_suites() - .with_safe_default_kx_groups() - .with_protocol_versions(&[params.version]) - .unwrap() - .with_client_cert_verifier(client_auth) - .with_single_cert(params.key_type.get_chain(), params.key_type.get_key()) - .expect("bad certs/private key?"); - - if resume == Resumption::SessionID { - cfg.session_storage = ServerSessionMemoryCache::new(128); - } else if resume == Resumption::Tickets { - cfg.ticketer = Ticketer::new().unwrap(); - } else { - cfg.session_storage = Arc::new(NoServerSessionStorage {}); - } - - cfg.max_fragment_size = max_fragment_size; - cfg -} - -fn make_client_config( - params: &BenchmarkParam, - clientauth: ClientAuth, - resume: Resumption, -) -> ClientConfig { - let mut root_store = RootCertStore::empty(); - let mut rootbuf = - io::BufReader::new(fs::File::open(params.key_type.path_for("ca.cert")).unwrap()); - root_store.add_parsable_certificates(&rustls_pemfile::certs(&mut rootbuf).unwrap()); - - let cfg = ClientConfig::builder() - .with_cipher_suites(&[params.ciphersuite]) - .with_safe_default_kx_groups() - .with_protocol_versions(&[params.version]) - .unwrap() - .with_root_certificates(root_store); - - let mut cfg = if clientauth == ClientAuth::Yes { - cfg.with_single_cert( - params.key_type.get_client_chain(), - params.key_type.get_client_key(), - ) - .unwrap() - } else { - cfg.with_no_client_auth() - }; - - if resume != Resumption::No { - cfg.session_storage = ClientSessionMemoryCache::new(128); - } else { - cfg.session_storage = Arc::new(NoClientSessionStorage {}); - } - - cfg -} - -fn apply_work_multiplier(work: u64) -> u64 { - let mul = match env::var("BENCH_MULTIPLIER") { - Ok(val) => val - .parse::() - .expect("invalid BENCH_MULTIPLIER value"), - Err(_) => 1., - }; - - ((work as f64) * mul).round() as u64 -} - -fn bench_handshake(params: &BenchmarkParam, clientauth: ClientAuth, resume: Resumption) { - let client_config = Arc::new(make_client_config(params, clientauth, resume)); - let server_config = Arc::new(make_server_config(params, clientauth, resume, None)); - - assert!(params.ciphersuite.version() == params.version); - - let rounds = apply_work_multiplier(if resume == Resumption::No { 512 } else { 4096 }); - let mut client_time = 0f64; - let mut server_time = 0f64; - - for _ in 0..rounds { - let server_name = "localhost".try_into().unwrap(); - let mut client = ClientConnection::new(Arc::clone(&client_config), server_name).unwrap(); - let mut server = ServerConnection::new(Arc::clone(&server_config)).unwrap(); - - server_time += time(|| { - transfer(&mut client, &mut server, None); - }); - client_time += time(|| { - transfer(&mut server, &mut client, None); - }); - server_time += time(|| { - transfer(&mut client, &mut server, None); - }); - client_time += time(|| { - transfer(&mut server, &mut client, None); - }); - } - - println!( - "handshakes\t{:?}\t{:?}\t{:?}\tclient\t{}\t{}\t{:.2}\thandshake/s", - params.version, - params.key_type, - params.ciphersuite.suite(), - if clientauth == ClientAuth::Yes { - "mutual" - } else { - "server-auth" - }, - resume.label(), - (rounds as f64) / client_time - ); - println!( - "handshakes\t{:?}\t{:?}\t{:?}\tserver\t{}\t{}\t{:.2}\thandshake/s", - params.version, - params.key_type, - params.ciphersuite.suite(), - if clientauth == ClientAuth::Yes { - "mutual" - } else { - "server-auth" - }, - resume.label(), - (rounds as f64) / server_time - ); -} - -fn do_handshake_step(client: &mut ClientConnection, server: &mut ServerConnection) -> bool { - if server.is_handshaking() || client.is_handshaking() { - transfer(client, server, None); - transfer(server, client, None); - true - } else { - false - } -} - -fn do_handshake(client: &mut ClientConnection, server: &mut ServerConnection) { - while do_handshake_step(client, server) {} -} - -fn bench_bulk(params: &BenchmarkParam, plaintext_size: u64, max_fragment_size: Option) { - let client_config = Arc::new(make_client_config(params, ClientAuth::No, Resumption::No)); - let server_config = Arc::new(make_server_config( - params, - ClientAuth::No, - Resumption::No, - max_fragment_size, - )); - - let server_name = "localhost".try_into().unwrap(); - let mut client = ClientConnection::new(client_config, server_name).unwrap(); - client.set_buffer_limit(None); - let mut server = ServerConnection::new(Arc::clone(&server_config)).unwrap(); - server.set_buffer_limit(None); - - do_handshake(&mut client, &mut server); - - let mut buf = Vec::new(); - buf.resize(plaintext_size as usize, 0u8); - - let total_data = apply_work_multiplier(if plaintext_size < 8192 { - 64 * 1024 * 1024 - } else { - 1024 * 1024 * 1024 - }); - let rounds = total_data / plaintext_size; - let mut time_send = 0f64; - let mut time_recv = 0f64; - - for _ in 0..rounds { - time_send += time(|| { - server.writer().write_all(&buf).unwrap(); - }); - - time_recv += transfer(&mut server, &mut client, Some(buf.len())); - } - - let mfs_str = format!( - "max_fragment_size:{}", - max_fragment_size - .map(|v| v.to_string()) - .unwrap_or_else(|| "default".to_string()) - ); - let total_mbs = ((plaintext_size * rounds) as f64) / (1024. * 1024.); - println!( - "bulk\t{:?}\t{:?}\t{}\tsend\t{:.2}\tMB/s", - params.version, - params.ciphersuite.suite(), - mfs_str, - total_mbs / time_send - ); - println!( - "bulk\t{:?}\t{:?}\t{}\trecv\t{:.2}\tMB/s", - params.version, - params.ciphersuite.suite(), - mfs_str, - total_mbs / time_recv - ); -} - -fn bench_memory(params: &BenchmarkParam, conn_count: u64) { - let client_config = Arc::new(make_client_config(params, ClientAuth::No, Resumption::No)); - let server_config = Arc::new(make_server_config( - params, - ClientAuth::No, - Resumption::No, - None, - )); - - // The target here is to end up with conn_count post-handshake - // server and client sessions. - let conn_count = (conn_count / 2) as usize; - let mut servers = Vec::with_capacity(conn_count); - let mut clients = Vec::with_capacity(conn_count); - - for _i in 0..conn_count { - servers.push(ServerConnection::new(Arc::clone(&server_config)).unwrap()); - let server_name = "localhost".try_into().unwrap(); - clients.push(ClientConnection::new(Arc::clone(&client_config), server_name).unwrap()); - } - - for _step in 0..5 { - for (client, server) in clients - .iter_mut() - .zip(servers.iter_mut()) - { - do_handshake_step(client, server); - } - } - - for client in clients.iter_mut() { - client - .writer() - .write_all(&[0u8; 1024]) - .unwrap(); - } - - for (client, server) in clients - .iter_mut() - .zip(servers.iter_mut()) - { - transfer(client, server, Some(1024)); - } -} - -fn lookup_matching_benches(name: &str) -> Vec<&BenchmarkParam> { - let r: Vec<&BenchmarkParam> = ALL_BENCHMARKS - .iter() - .filter(|params| { - format!("{:?}", params.ciphersuite.suite()).to_lowercase() == name.to_lowercase() - }) - .collect(); - - if r.is_empty() { - panic!("unknown suite {:?}", name); - } - - r -} - -fn selected_tests(mut args: env::Args) { - let mode = args - .next() - .expect("first argument must be mode"); - - match mode.as_ref() { - "bulk" => match args.next() { - Some(suite) => { - let len = args - .next() - .map(|arg| { - arg.parse::() - .expect("3rd arg must be plaintext size integer") - }) - .unwrap_or(1048576); - let mfs = args.next().map(|arg| { - arg.parse::() - .expect("4th arg must be max_fragment_size integer") - }); - for param in lookup_matching_benches(&suite).iter() { - bench_bulk(param, len, mfs); - } - } - None => { - panic!("bulk needs ciphersuite argument"); - } - }, - - "handshake" | "handshake-resume" | "handshake-ticket" => match args.next() { - Some(suite) => { - let resume = if mode == "handshake" { - Resumption::No - } else if mode == "handshake-resume" { - Resumption::SessionID - } else { - Resumption::Tickets - }; - - for param in lookup_matching_benches(&suite).iter() { - bench_handshake(param, ClientAuth::No, resume); - } - } - None => { - panic!("handshake* needs ciphersuite argument"); - } - }, - - "memory" => match args.next() { - Some(suite) => { - let count = args - .next() - .map(|arg| { - arg.parse::() - .expect("3rd arg must be connection count integer") - }) - .unwrap_or(1000000); - for param in lookup_matching_benches(&suite).iter() { - bench_memory(param, count); - } - } - None => { - panic!("memory needs ciphersuite argument"); - } - }, - - _ => { - panic!("unsupported mode {:?}", mode); - } - } -} - -fn all_tests() { - for test in ALL_BENCHMARKS.iter() { - bench_bulk(test, 1024 * 1024, None); - bench_bulk(test, 1024 * 1024, Some(10000)); - bench_handshake(test, ClientAuth::No, Resumption::No); - bench_handshake(test, ClientAuth::Yes, Resumption::No); - bench_handshake(test, ClientAuth::No, Resumption::SessionID); - bench_handshake(test, ClientAuth::Yes, Resumption::SessionID); - bench_handshake(test, ClientAuth::No, Resumption::Tickets); - bench_handshake(test, ClientAuth::Yes, Resumption::Tickets); - } -} - -fn main() { - let mut args = env::args(); - if args.len() > 1 { - args.next(); - selected_tests(args); - } else { - all_tests(); - } -} diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/examples/internal/bogo_shim.rs temporalio-1.3.0/vendor/rustls-0.20.9/examples/internal/bogo_shim.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/examples/internal/bogo_shim.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/examples/internal/bogo_shim.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,1195 +0,0 @@ -// This is a test shim for the BoringSSL-Go ('bogo') TLS -// test suite. See bogo/ for this in action. -// -// https://boringssl.googlesource.com/boringssl/+/master/ssl/test -// - -use base64; -use env_logger; -use rustls; - -use rustls::internal::msgs::codec::{Codec, Reader}; -use rustls::internal::msgs::persist; -use rustls::quic::{self, ClientQuicExt, QuicExt, ServerQuicExt}; -use rustls::server::ClientHello; -use rustls::{CipherSuite, ProtocolVersion}; -use rustls::{ClientConnection, Connection, ServerConnection}; - -use std::convert::TryInto; -use std::env; -use std::fs; -use std::io; -use std::io::BufReader; -use std::io::{Read, Write}; -use std::net; -use std::process; -use std::sync::Arc; -use std::time::SystemTime; - -static BOGO_NACK: i32 = 89; - -macro_rules! println_err( - ($($arg:tt)*) => { { - writeln!(&mut ::std::io::stderr(), $($arg)*).unwrap(); - } } -); - -#[derive(Debug)] -struct Options { - port: u16, - server: bool, - max_fragment: Option, - resumes: usize, - verify_peer: bool, - require_any_client_cert: bool, - offer_no_client_cas: bool, - tickets: bool, - resume_with_tickets_disabled: bool, - queue_data: bool, - queue_data_on_resume: bool, - only_write_one_byte_after_handshake: bool, - only_write_one_byte_after_handshake_on_resume: bool, - shut_down_after_handshake: bool, - check_close_notify: bool, - host_name: String, - use_sni: bool, - send_sct: bool, - key_file: String, - cert_file: String, - protocols: Vec, - support_tls13: bool, - support_tls12: bool, - min_version: Option, - max_version: Option, - server_ocsp_response: Vec, - server_sct_list: Vec, - use_signing_scheme: u16, - curves: Option>, - export_keying_material: usize, - export_keying_material_label: String, - export_keying_material_context: String, - export_keying_material_context_used: bool, - read_size: usize, - quic_transport_params: Vec, - expect_quic_transport_params: Vec, - enable_early_data: bool, - expect_ticket_supports_early_data: bool, - expect_accept_early_data: bool, - expect_reject_early_data: bool, - expect_version: u16, - resumption_delay: u32, -} - -impl Options { - fn new() -> Self { - Options { - port: 0, - server: false, - max_fragment: None, - resumes: 0, - verify_peer: false, - tickets: true, - resume_with_tickets_disabled: false, - host_name: "example.com".to_string(), - use_sni: false, - send_sct: false, - queue_data: false, - queue_data_on_resume: false, - only_write_one_byte_after_handshake: false, - only_write_one_byte_after_handshake_on_resume: false, - shut_down_after_handshake: false, - check_close_notify: false, - require_any_client_cert: false, - offer_no_client_cas: false, - key_file: "".to_string(), - cert_file: "".to_string(), - protocols: vec![], - support_tls13: true, - support_tls12: true, - min_version: None, - max_version: None, - server_ocsp_response: vec![], - server_sct_list: vec![], - use_signing_scheme: 0, - curves: None, - export_keying_material: 0, - export_keying_material_label: "".to_string(), - export_keying_material_context: "".to_string(), - export_keying_material_context_used: false, - read_size: 512, - quic_transport_params: vec![], - expect_quic_transport_params: vec![], - enable_early_data: false, - expect_ticket_supports_early_data: false, - expect_accept_early_data: false, - expect_reject_early_data: false, - expect_version: 0, - resumption_delay: 0, - } - } - - fn version_allowed(&self, vers: ProtocolVersion) -> bool { - (self.min_version.is_none() || vers.get_u16() >= self.min_version.unwrap().get_u16()) - && (self.max_version.is_none() || vers.get_u16() <= self.max_version.unwrap().get_u16()) - } - - fn tls13_supported(&self) -> bool { - self.support_tls13 && self.version_allowed(ProtocolVersion::TLSv1_3) - } - - fn tls12_supported(&self) -> bool { - self.support_tls12 && self.version_allowed(ProtocolVersion::TLSv1_2) - } - - fn supported_versions(&self) -> Vec<&'static rustls::SupportedProtocolVersion> { - let mut versions = vec![]; - - if self.tls12_supported() { - versions.push(&rustls::version::TLS12); - } - - if self.tls13_supported() { - versions.push(&rustls::version::TLS13); - } - versions - } -} - -fn load_cert(filename: &str) -> Vec { - let certfile = fs::File::open(filename).expect("cannot open certificate file"); - let mut reader = BufReader::new(certfile); - rustls_pemfile::certs(&mut reader) - .unwrap() - .iter() - .map(|v| rustls::Certificate(v.clone())) - .collect() -} - -fn load_key(filename: &str) -> rustls::PrivateKey { - let keyfile = fs::File::open(filename).expect("cannot open private key file"); - let mut reader = BufReader::new(keyfile); - let keys = rustls_pemfile::pkcs8_private_keys(&mut reader).unwrap(); - assert!(keys.len() == 1); - rustls::PrivateKey(keys[0].clone()) -} - -fn split_protocols(protos: &str) -> Vec { - let mut ret = Vec::new(); - - let mut offs = 0; - while offs < protos.len() { - let len = protos.as_bytes()[offs] as usize; - let item = protos[offs + 1..offs + 1 + len].to_string(); - ret.push(item); - offs += 1 + len; - } - - ret -} - -struct DummyClientAuth { - mandatory: bool, -} - -impl rustls::server::ClientCertVerifier for DummyClientAuth { - fn offer_client_auth(&self) -> bool { - true - } - - fn client_auth_mandatory(&self) -> Option { - Some(self.mandatory) - } - - fn client_auth_root_subjects(&self) -> Option { - Some(rustls::DistinguishedNames::new()) - } - - fn verify_client_cert( - &self, - _end_entity: &rustls::Certificate, - _intermediates: &[rustls::Certificate], - _now: SystemTime, - ) -> Result { - Ok(rustls::server::ClientCertVerified::assertion()) - } -} - -struct DummyServerAuth { - send_sct: bool, -} - -impl rustls::client::ServerCertVerifier for DummyServerAuth { - fn verify_server_cert( - &self, - _end_entity: &rustls::Certificate, - _certs: &[rustls::Certificate], - _hostname: &rustls::ServerName, - _scts: &mut dyn Iterator, - _ocsp: &[u8], - _now: SystemTime, - ) -> Result { - Ok(rustls::client::ServerCertVerified::assertion()) - } - - fn request_scts(&self) -> bool { - self.send_sct - } -} - -struct FixedSignatureSchemeSigningKey { - key: Arc, - scheme: rustls::SignatureScheme, -} - -impl rustls::sign::SigningKey for FixedSignatureSchemeSigningKey { - fn choose_scheme( - &self, - offered: &[rustls::SignatureScheme], - ) -> Option> { - if offered.contains(&self.scheme) { - self.key.choose_scheme(&[self.scheme]) - } else { - self.key.choose_scheme(&[]) - } - } - fn algorithm(&self) -> rustls::SignatureAlgorithm { - self.key.algorithm() - } -} - -struct FixedSignatureSchemeServerCertResolver { - resolver: Arc, - scheme: rustls::SignatureScheme, -} - -impl rustls::server::ResolvesServerCert for FixedSignatureSchemeServerCertResolver { - fn resolve(&self, client_hello: ClientHello) -> Option> { - let mut certkey = self.resolver.resolve(client_hello)?; - Arc::make_mut(&mut certkey).key = Arc::new(FixedSignatureSchemeSigningKey { - key: certkey.key.clone(), - scheme: self.scheme, - }); - Some(certkey) - } -} - -struct FixedSignatureSchemeClientCertResolver { - resolver: Arc, - scheme: rustls::SignatureScheme, -} - -impl rustls::client::ResolvesClientCert for FixedSignatureSchemeClientCertResolver { - fn resolve( - &self, - acceptable_issuers: &[&[u8]], - sigschemes: &[rustls::SignatureScheme], - ) -> Option> { - if !sigschemes.contains(&self.scheme) { - quit(":NO_COMMON_SIGNATURE_ALGORITHMS:"); - } - let mut certkey = self - .resolver - .resolve(acceptable_issuers, sigschemes)?; - Arc::make_mut(&mut certkey).key = Arc::new(FixedSignatureSchemeSigningKey { - key: certkey.key.clone(), - scheme: self.scheme, - }); - Some(certkey) - } - - fn has_certs(&self) -> bool { - self.resolver.has_certs() - } -} - -fn lookup_scheme(scheme: u16) -> rustls::SignatureScheme { - match scheme { - 0x0401 => rustls::SignatureScheme::RSA_PKCS1_SHA256, - 0x0501 => rustls::SignatureScheme::RSA_PKCS1_SHA384, - 0x0601 => rustls::SignatureScheme::RSA_PKCS1_SHA512, - 0x0403 => rustls::SignatureScheme::ECDSA_NISTP256_SHA256, - 0x0503 => rustls::SignatureScheme::ECDSA_NISTP384_SHA384, - 0x0804 => rustls::SignatureScheme::RSA_PSS_SHA256, - 0x0805 => rustls::SignatureScheme::RSA_PSS_SHA384, - 0x0806 => rustls::SignatureScheme::RSA_PSS_SHA512, - 0x0807 => rustls::SignatureScheme::ED25519, - // TODO: add support for Ed448 - // 0x0808 => rustls::SignatureScheme::ED448, - _ => { - println_err!("Unsupported signature scheme {:04x}", scheme); - process::exit(BOGO_NACK); - } - } -} - -fn lookup_kx_group(group: u16) -> &'static rustls::SupportedKxGroup { - match group { - 0x001d => &rustls::kx_group::X25519, - 0x0017 => &rustls::kx_group::SECP256R1, - 0x0018 => &rustls::kx_group::SECP384R1, - _ => { - println_err!("Unsupported kx group {:04x}", group); - process::exit(BOGO_NACK); - } - } -} - -struct ServerCacheWithResumptionDelay { - delay: u32, - storage: Arc, -} - -impl ServerCacheWithResumptionDelay { - fn new(delay: u32) -> Arc { - Arc::new(Self { - delay, - storage: rustls::server::ServerSessionMemoryCache::new(32), - }) - } -} - -fn align_time() { - /* we don't have an injectable clock source in rustls' public api, and - * resumption timing is in seconds resolution, so tests that use - * resumption_delay tend to be flickery if the seconds time ticks - * during this. - * - * this function delays until a fresh second ticks, which alleviates - * this. gross! - */ - use std::{thread, time}; - - fn sample() -> u64 { - time::SystemTime::now() - .duration_since(time::SystemTime::UNIX_EPOCH) - .unwrap() - .as_secs() - } - - let start_secs = sample(); - while start_secs == sample() { - thread::sleep(time::Duration::from_millis(20)); - } -} - -impl rustls::server::StoresServerSessions for ServerCacheWithResumptionDelay { - fn put(&self, key: Vec, value: Vec) -> bool { - let mut ssv = persist::ServerSessionValue::read_bytes(&value).unwrap(); - ssv.creation_time_sec -= self.delay as u64; - - self.storage - .put(key, ssv.get_encoding()) - } - - fn get(&self, key: &[u8]) -> Option> { - self.storage.get(key) - } - - fn take(&self, key: &[u8]) -> Option> { - self.storage.take(key) - } - - fn can_cache(&self) -> bool { - self.storage.can_cache() - } -} - -fn make_server_cfg(opts: &Options) -> Arc { - let client_auth = - if opts.verify_peer || opts.offer_no_client_cas || opts.require_any_client_cert { - Arc::new(DummyClientAuth { - mandatory: opts.require_any_client_cert, - }) - } else { - rustls::server::NoClientAuth::new() - }; - - let cert = load_cert(&opts.cert_file); - let key = load_key(&opts.key_file); - - let kx_groups = if let Some(curves) = &opts.curves { - curves - .iter() - .map(|curveid| lookup_kx_group(*curveid)) - .collect() - } else { - rustls::ALL_KX_GROUPS.to_vec() - }; - - let mut cfg = rustls::ServerConfig::builder() - .with_safe_default_cipher_suites() - .with_kx_groups(&kx_groups) - .with_protocol_versions(&opts.supported_versions()) - .unwrap() - .with_client_cert_verifier(client_auth) - .with_single_cert_with_ocsp_and_sct( - cert.clone(), - key, - opts.server_ocsp_response.clone(), - opts.server_sct_list.clone(), - ) - .unwrap(); - - cfg.session_storage = ServerCacheWithResumptionDelay::new(opts.resumption_delay); - cfg.max_fragment_size = opts.max_fragment; - - if opts.use_signing_scheme > 0 { - let scheme = lookup_scheme(opts.use_signing_scheme); - cfg.cert_resolver = Arc::new(FixedSignatureSchemeServerCertResolver { - resolver: cfg.cert_resolver.clone(), - scheme, - }); - } - - if opts.tickets { - cfg.ticketer = rustls::Ticketer::new().unwrap(); - } else if opts.resumes == 0 { - cfg.session_storage = Arc::new(rustls::server::NoServerSessionStorage {}); - } - - if !opts.protocols.is_empty() { - cfg.alpn_protocols = opts - .protocols - .iter() - .map(|proto| proto.as_bytes().to_vec()) - .collect::>(); - } - - if opts.enable_early_data { - // see kMaxEarlyDataAccepted in boringssl, which bogo validates - cfg.max_early_data_size = 14336; - cfg.send_half_rtt_data = true; - } - - Arc::new(cfg) -} - -struct ClientCacheWithoutKxHints { - delay: u32, - storage: Arc, -} - -impl ClientCacheWithoutKxHints { - fn new(delay: u32) -> Arc { - Arc::new(ClientCacheWithoutKxHints { - delay, - storage: rustls::client::ClientSessionMemoryCache::new(32), - }) - } -} - -impl rustls::client::StoresClientSessions for ClientCacheWithoutKxHints { - fn put(&self, key: Vec, value: Vec) -> bool { - if key.len() > 2 && key[0] == b'k' && key[1] == b'x' { - return true; - } - - let mut reader = Reader::init(&value[2..]); - let csv = CipherSuite::read_bytes(&value[..2]) - .and_then(|suite| { - persist::ClientSessionValue::read(&mut reader, suite, &rustls::ALL_CIPHER_SUITES) - }) - .unwrap(); - - let value = match csv { - persist::ClientSessionValue::Tls13(mut tls13) => { - tls13.common.rewind_epoch(self.delay); - tls13.get_encoding() - } - persist::ClientSessionValue::Tls12(mut tls12) => { - tls12.common.rewind_epoch(self.delay); - tls12.get_encoding() - } - }; - - self.storage.put(key, value) - } - - fn get(&self, key: &[u8]) -> Option> { - self.storage.get(key) - } -} - -fn make_client_cfg(opts: &Options) -> Arc { - let kx_groups = if let Some(curves) = &opts.curves { - curves - .iter() - .map(|curveid| lookup_kx_group(*curveid)) - .collect() - } else { - rustls::ALL_KX_GROUPS.to_vec() - }; - - let cfg = rustls::ClientConfig::builder() - .with_safe_default_cipher_suites() - .with_kx_groups(&kx_groups) - .with_protocol_versions(&opts.supported_versions()) - .expect("inconsistent settings") - .with_custom_certificate_verifier(Arc::new(DummyServerAuth { - send_sct: opts.send_sct, - })); - - let mut cfg = if !opts.cert_file.is_empty() && !opts.key_file.is_empty() { - let cert = load_cert(&opts.cert_file); - let key = load_key(&opts.key_file); - cfg.with_single_cert(cert, key).unwrap() - } else { - cfg.with_no_client_auth() - }; - - if !opts.cert_file.is_empty() && opts.use_signing_scheme > 0 { - let scheme = lookup_scheme(opts.use_signing_scheme); - cfg.client_auth_cert_resolver = Arc::new(FixedSignatureSchemeClientCertResolver { - resolver: cfg.client_auth_cert_resolver.clone(), - scheme, - }); - } - - let persist = ClientCacheWithoutKxHints::new(opts.resumption_delay); - cfg.session_storage = persist; - cfg.enable_sni = opts.use_sni; - cfg.max_fragment_size = opts.max_fragment; - - if !opts.protocols.is_empty() { - cfg.alpn_protocols = opts - .protocols - .iter() - .map(|proto| proto.as_bytes().to_vec()) - .collect(); - } - - if opts.enable_early_data { - cfg.enable_early_data = true; - } - - Arc::new(cfg) -} - -fn quit(why: &str) -> ! { - println_err!("{}", why); - process::exit(0) -} - -fn quit_err(why: &str) -> ! { - println_err!("{}", why); - process::exit(1) -} - -fn handle_err(err: rustls::Error) -> ! { - use rustls::Error; - use rustls::{AlertDescription, ContentType}; - use std::{thread, time}; - - println!("TLS error: {:?}", err); - thread::sleep(time::Duration::from_millis(100)); - - match err { - Error::InappropriateHandshakeMessage { .. } | Error::InappropriateMessage { .. } => { - quit(":UNEXPECTED_MESSAGE:") - } - Error::AlertReceived(AlertDescription::RecordOverflow) => { - quit(":TLSV1_ALERT_RECORD_OVERFLOW:") - } - Error::AlertReceived(AlertDescription::HandshakeFailure) => quit(":HANDSHAKE_FAILURE:"), - Error::AlertReceived(AlertDescription::ProtocolVersion) => quit(":WRONG_VERSION:"), - Error::AlertReceived(AlertDescription::InternalError) => { - quit(":PEER_ALERT_INTERNAL_ERROR:") - } - Error::CorruptMessagePayload(ContentType::Alert) => quit(":BAD_ALERT:"), - Error::CorruptMessagePayload(ContentType::ChangeCipherSpec) => { - quit(":BAD_CHANGE_CIPHER_SPEC:") - } - Error::CorruptMessagePayload(ContentType::Handshake) => quit(":BAD_HANDSHAKE_MSG:"), - Error::CorruptMessagePayload(ContentType::Unknown(42)) => quit(":GARBAGE:"), - Error::CorruptMessage => quit(":GARBAGE:"), - Error::DecryptError => quit(":DECRYPTION_FAILED_OR_BAD_RECORD_MAC:"), - Error::PeerIncompatibleError(_) => quit(":INCOMPATIBLE:"), - Error::PeerMisbehavedError(s) if s == "too much early_data received" => { - quit(":TOO_MUCH_READ_EARLY_DATA:") - } - Error::PeerMisbehavedError(_) => quit(":PEER_MISBEHAVIOUR:"), - Error::NoCertificatesPresented => quit(":NO_CERTS:"), - Error::AlertReceived(AlertDescription::UnexpectedMessage) => quit(":BAD_ALERT:"), - Error::AlertReceived(AlertDescription::DecompressionFailure) => { - quit_err(":SSLV3_ALERT_DECOMPRESSION_FAILURE:") - } - Error::InvalidCertificateEncoding => quit(":CANNOT_PARSE_LEAF_CERT:"), - Error::InvalidCertificateSignature => quit(":BAD_SIGNATURE:"), - Error::InvalidCertificateSignatureType => quit(":WRONG_SIGNATURE_TYPE:"), - Error::PeerSentOversizedRecord => quit(":DATA_LENGTH_TOO_LONG:"), - _ => { - println_err!("unhandled error: {:?}", err); - quit(":FIXME:") - } - } -} - -fn flush(sess: &mut Connection, conn: &mut net::TcpStream) { - while sess.wants_write() { - match sess.write_tls(conn) { - Err(err) => { - println!("IO error: {:?}", err); - process::exit(0); - } - Ok(_) => {} - } - } - conn.flush().unwrap(); -} - -fn client(conn: &mut Connection) -> &mut ClientConnection { - conn.try_into().unwrap() -} - -fn server(conn: &mut Connection) -> &mut ServerConnection { - match conn { - Connection::Server(s) => s, - _ => panic!("Connection is not a ServerConnection"), - } -} - -fn exec(opts: &Options, mut sess: Connection, count: usize) { - let mut sent_message = false; - - if opts.queue_data || (opts.queue_data_on_resume && count > 0) { - if count > 0 && opts.enable_early_data { - let len = client(&mut sess) - .early_data() - .expect("0rtt not available") - .write(b"hello") - .expect("0rtt write failed"); - sess.writer() - .write_all(&b"hello"[len..]) - .unwrap(); - sent_message = true; - } else if !opts.only_write_one_byte_after_handshake { - let _ = sess.writer().write_all(b"hello"); - sent_message = true; - } - } - - let addrs = [ - net::SocketAddr::from((net::Ipv6Addr::LOCALHOST, opts.port)), - net::SocketAddr::from((net::Ipv4Addr::LOCALHOST, opts.port)), - ]; - let mut conn = net::TcpStream::connect(&addrs[..]).expect("cannot connect"); - let mut sent_shutdown = false; - let mut sent_exporter = false; - let mut quench_writes = false; - - loop { - if !quench_writes { - flush(&mut sess, &mut conn); - } - - if sess.wants_read() { - match sess.read_tls(&mut conn) { - Ok(_) => {} - Err(ref err) if err.kind() == io::ErrorKind::ConnectionReset => {} - Err(err) => panic!("invalid read: {}", err), - }; - - if let Err(err) = sess.process_new_packets() { - flush(&mut sess, &mut conn); /* send any alerts before exiting */ - handle_err(err); - } - } - - if opts.server && opts.enable_early_data { - if let Some(ref mut ed) = server(&mut sess).early_data() { - let mut data = Vec::new(); - let data_len = ed - .read_to_end(&mut data) - .expect("cannot read early_data"); - - for b in data.iter_mut() { - *b ^= 0xff; - } - - sess.writer() - .write_all(&data[..data_len]) - .expect("cannot echo early_data in 1rtt data"); - } - } - - if !sess.is_handshaking() && opts.export_keying_material > 0 && !sent_exporter { - let mut export = Vec::new(); - export.resize(opts.export_keying_material, 0u8); - sess.export_keying_material( - &mut export, - opts.export_keying_material_label - .as_bytes(), - if opts.export_keying_material_context_used { - Some( - opts.export_keying_material_context - .as_bytes(), - ) - } else { - None - }, - ) - .unwrap(); - sess.writer() - .write_all(&export) - .unwrap(); - sent_exporter = true; - } - - if !sess.is_handshaking() && opts.only_write_one_byte_after_handshake && !sent_message { - println!("writing message and then only one byte of its tls frame"); - flush(&mut sess, &mut conn); - - sess.writer() - .write_all(b"hello") - .unwrap(); - sent_message = true; - - let mut one_byte = [0u8]; - let mut cursor = io::Cursor::new(&mut one_byte[..]); - sess.write_tls(&mut cursor).unwrap(); - conn.write(&one_byte).expect("IO error"); - - quench_writes = true; - } - - if opts.enable_early_data && !opts.server && !sess.is_handshaking() && count > 0 { - if opts.expect_accept_early_data && !client(&mut sess).is_early_data_accepted() { - quit_err("Early data was not accepted, but we expect the opposite"); - } else if opts.expect_reject_early_data && client(&mut sess).is_early_data_accepted() { - quit_err("Early data was accepted, but we expect the opposite"); - } - if opts.expect_version == 0x0304 { - match sess.protocol_version() { - Some(ProtocolVersion::TLSv1_3) | Some(ProtocolVersion::Unknown(0x7f17)) => {} - _ => quit_err("wrong protocol version"), - } - } - } - - if !sess.is_handshaking() - && !opts - .expect_quic_transport_params - .is_empty() - { - let their_transport_params = sess - .quic_transport_parameters() - .expect("missing peer quic transport params"); - assert_eq!(opts.expect_quic_transport_params, their_transport_params); - } - - let mut buf = [0u8; 1024]; - let len = match sess - .reader() - .read(&mut buf[..opts.read_size]) - { - Ok(0) => { - if opts.check_close_notify { - println!("close notify ok"); - } - println!("EOF (tls)"); - return; - } - Ok(len) => len, - Err(err) if err.kind() == io::ErrorKind::WouldBlock => 0, - Err(err) if err.kind() == io::ErrorKind::UnexpectedEof => { - if opts.check_close_notify { - quit_err(":CLOSE_WITHOUT_CLOSE_NOTIFY:"); - } - println!("EOF (tcp)"); - return; - } - Err(err) => panic!("unhandled read error {:?}", err), - }; - - if opts.shut_down_after_handshake && !sent_shutdown && !sess.is_handshaking() { - sess.send_close_notify(); - sent_shutdown = true; - } - - if quench_writes && len > 0 { - println!("unquenching writes after {:?}", len); - quench_writes = false; - } - - for b in buf.iter_mut() { - *b ^= 0xff; - } - - sess.writer() - .write_all(&buf[..len]) - .unwrap(); - } -} - -fn main() { - let mut args: Vec<_> = env::args().collect(); - env_logger::init(); - - args.remove(0); - - if !args.is_empty() && args[0] == "-is-handshaker-supported" { - println!("No"); - process::exit(0); - } - println!("options: {:?}", args); - - let mut opts = Options::new(); - - while !args.is_empty() { - let arg = args.remove(0); - match arg.as_ref() { - "-port" => { - opts.port = args.remove(0).parse::().unwrap(); - } - "-server" => { - opts.server = true; - } - "-key-file" => { - opts.key_file = args.remove(0); - } - "-cert-file" => { - opts.cert_file = args.remove(0); - } - "-resume-count" => { - opts.resumes = args.remove(0).parse::().unwrap(); - } - "-no-tls13" => { - opts.support_tls13 = false; - } - "-no-tls12" => { - opts.support_tls12 = false; - } - "-min-version" => { - let min = args.remove(0).parse::().unwrap(); - opts.min_version = Some(ProtocolVersion::Unknown(min)); - } - "-max-version" => { - let max = args.remove(0).parse::().unwrap(); - opts.max_version = Some(ProtocolVersion::Unknown(max)); - } - "-max-send-fragment" => { - let max_fragment = args.remove(0).parse::().unwrap(); - opts.max_fragment = Some(max_fragment + 5); // ours includes header - } - "-read-size" => { - let rdsz = args.remove(0).parse::().unwrap(); - opts.read_size = rdsz; - } - "-tls13-variant" => { - let variant = args.remove(0).parse::().unwrap(); - if variant != 1 { - println!("NYI TLS1.3 variant selection: {:?} {:?}", arg, variant); - process::exit(BOGO_NACK); - } - } - "-no-ticket" => { - opts.tickets = false; - } - "-on-resume-no-ticket" => { - opts.resume_with_tickets_disabled = true; - } - "-signing-prefs" => { - let alg = args.remove(0).parse::().unwrap(); - opts.use_signing_scheme = alg; - } - "-max-cert-list" | - "-expect-curve-id" | - "-expect-resume-curve-id" | - "-expect-peer-signature-algorithm" | - "-expect-peer-verify-pref" | - "-expect-advertised-alpn" | - "-expect-alpn" | - "-on-initial-expect-alpn" | - "-on-resume-expect-alpn" | - "-on-retry-expect-alpn" | - "-expect-server-name" | - "-expect-ocsp-response" | - "-expect-signed-cert-timestamps" | - "-expect-certificate-types" | - "-expect-client-ca-list" | - "-on-retry-expect-early-data-reason" | - "-on-resume-expect-early-data-reason" | - "-on-initial-expect-early-data-reason" | - "-on-initial-expect-cipher" | - "-on-resume-expect-cipher" | - "-on-retry-expect-cipher" | - "-expect-ticket-age-skew" | - "-handshaker-path" | - "-application-settings" | - "-expect-msg-callback" => { - println!("not checking {} {}; NYI", arg, args.remove(0)); - } - - "-expect-secure-renegotiation" | - "-expect-no-session-id" | - "-enable-ed25519" | - "-expect-hrr" | - "-expect-no-hrr" | - "-on-resume-expect-no-offer-early-data" | - "-key-update" | //< we could implement an API for this - "-expect-tls13-downgrade" | - "-expect-session-id" => { - println!("not checking {}; NYI", arg); - } - - "-export-keying-material" => { - opts.export_keying_material = args.remove(0).parse::().unwrap(); - } - "-export-label" => { - opts.export_keying_material_label = args.remove(0); - } - "-export-context" => { - opts.export_keying_material_context = args.remove(0); - } - "-use-export-context" => { - opts.export_keying_material_context_used = true; - } - "-quic-transport-params" => { - opts.quic_transport_params = base64::decode(args.remove(0).as_bytes()) - .expect("invalid base64"); - } - "-expect-quic-transport-params" => { - opts.expect_quic_transport_params = base64::decode(args.remove(0).as_bytes()) - .expect("invalid base64"); - } - - "-ocsp-response" => { - opts.server_ocsp_response = base64::decode(args.remove(0).as_bytes()) - .expect("invalid base64"); - } - "-signed-cert-timestamps" => { - opts.server_sct_list = base64::decode(args.remove(0).as_bytes()) - .expect("invalid base64"); - - if opts.server_sct_list.len() == 2 && - opts.server_sct_list[0] == 0x00 && - opts.server_sct_list[1] == 0x00 { - quit(":INVALID_SCT_LIST:"); - } - } - "-select-alpn" => { - opts.protocols.push(args.remove(0)); - } - "-require-any-client-certificate" => { - opts.require_any_client_cert = true; - } - "-verify-peer" => { - opts.verify_peer = true; - } - "-shim-writes-first" => { - opts.queue_data = true; - } - "-read-with-unfinished-write" => { - opts.queue_data = true; - opts.only_write_one_byte_after_handshake = true; - } - "-shim-shuts-down" => { - opts.shut_down_after_handshake = true; - } - "-check-close-notify" => { - opts.check_close_notify = true; - } - "-host-name" => { - opts.host_name = args.remove(0); - opts.use_sni = true; - } - "-advertise-alpn" => { - opts.protocols = split_protocols(&args.remove(0)); - } - "-use-null-client-ca-list" => { - opts.offer_no_client_cas = true; - } - "-enable-signed-cert-timestamps" => { - opts.send_sct = true; - } - "-enable-early-data" => { - opts.tickets = false; - opts.enable_early_data = true; - } - "-on-resume-shim-writes-first" => { - opts.queue_data_on_resume = true; - } - "-on-resume-read-with-unfinished-write" => { - opts.queue_data_on_resume = true; - opts.only_write_one_byte_after_handshake_on_resume = true; - } - "-expect-ticket-supports-early-data" => { - opts.expect_ticket_supports_early_data = true; - } - "-expect-accept-early-data" | - "-on-resume-expect-accept-early-data" => { - opts.expect_accept_early_data = true; - } - "-expect-early-data-reason" | - "-on-resume-expect-reject-early-data-reason" => { - let reason = args.remove(0); - match reason.as_str() { - "disabled" | "protocol_version" => { - opts.expect_reject_early_data = true; - } - _ => { - println!("NYI early data reason: {}", reason); - process::exit(1); - } - } - } - "-expect-reject-early-data" | - "-on-resume-expect-reject-early-data" => { - opts.expect_reject_early_data = true; - } - "-expect-version" => { - opts.expect_version = args.remove(0).parse::().unwrap(); - } - "-curves" => { - let curve = args.remove(0).parse::().unwrap(); - if let Some(mut curves) = opts.curves.take() { - curves.push(curve); - } else { - opts.curves = Some(vec![ curve ]); - } - } - "-resumption-delay" => { - opts.resumption_delay = args.remove(0).parse::().unwrap(); - align_time(); - } - - // defaults: - "-enable-all-curves" | - "-renegotiate-ignore" | - "-no-tls11" | - "-no-tls1" | - "-no-ssl3" | - "-handoff" | - "-decline-alpn" | - "-expect-no-session" | - "-expect-session-miss" | - "-expect-extended-master-secret" | - "-expect-ticket-renewal" | - "-enable-ocsp-stapling" | - // internal openssl details: - "-async" | - "-implicit-handshake" | - "-use-old-client-cert-callback" | - "-use-early-callback" => {} - - // Not implemented things - "-dtls" | - "-cipher" | - "-psk" | - "-renegotiate-freely" | - "-false-start" | - "-fallback-scsv" | - "-fail-early-callback" | - "-fail-cert-callback" | - "-install-ddos-callback" | - "-advertise-npn" | - "-verify-fail" | - "-expect-channel-id" | - "-send-channel-id" | - "-select-next-proto" | - "-expect-verify-result" | - "-send-alert" | - "-digest-prefs" | - "-use-exporter-between-reads" | - "-ticket-key" | - "-tls-unique" | - "-enable-server-custom-extension" | - "-enable-client-custom-extension" | - "-expect-dhe-group-size" | - "-use-ticket-callback" | - "-enable-grease" | - "-enable-channel-id" | - "-expect-early-data-info" | - "-expect-cipher-aes" | - "-retain-only-sha256-client-cert-initial" | - "-use-client-ca-list" | - "-expect-draft-downgrade" | - "-allow-unknown-alpn-protos" | - "-on-initial-tls13-variant" | - "-on-initial-expect-curve-id" | - "-on-resume-export-early-keying-material" | - "-on-resume-enable-early-data" | - "-export-early-keying-material" | - "-handshake-twice" | - "-on-resume-verify-fail" | - "-reverify-on-resume" | - "-verify-prefs" | - "-no-op-extra-handshake" | - "-expect-peer-cert-file" | - "-no-rsa-pss-rsae-certs" | - "-ignore-tls13-downgrade" | - "-on-initial-expect-peer-cert-file" => { - println!("NYI option {:?}", arg); - process::exit(BOGO_NACK); - } - - _ => { - println!("unhandled option {:?}", arg); - process::exit(1); - } - } - } - - println!("opts {:?}", opts); - - let mut server_cfg = if opts.server { - Some(make_server_cfg(&opts)) - } else { - None - }; - let client_cfg = if !opts.server { - Some(make_client_cfg(&opts)) - } else { - None - }; - - fn make_session( - opts: &Options, - scfg: &Option>, - ccfg: &Option>, - ) -> Connection { - if opts.server { - let scfg = Arc::clone(scfg.as_ref().unwrap()); - let s = if opts.quic_transport_params.is_empty() { - rustls::ServerConnection::new(scfg).unwrap() - } else { - rustls::ServerConnection::new_quic( - scfg, - quic::Version::V1, - opts.quic_transport_params.clone(), - ) - .unwrap() - }; - s.into() - } else { - let server_name = opts - .host_name - .as_str() - .try_into() - .unwrap(); - let ccfg = Arc::clone(ccfg.as_ref().unwrap()); - let c = if opts.quic_transport_params.is_empty() { - rustls::ClientConnection::new(ccfg, server_name) - } else { - rustls::ClientConnection::new_quic( - ccfg, - quic::Version::V1, - server_name, - opts.quic_transport_params.clone(), - ) - } - .unwrap(); - c.into() - } - } - - for i in 0..opts.resumes + 1 { - let sess = make_session(&opts, &server_cfg, &client_cfg); - exec(&opts, sess, i); - - if opts.resume_with_tickets_disabled { - opts.tickets = false; - server_cfg = Some(make_server_cfg(&opts)); - } - } -} diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/examples/internal/trytls_shim.rs temporalio-1.3.0/vendor/rustls-0.20.9/examples/internal/trytls_shim.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/examples/internal/trytls_shim.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/examples/internal/trytls_shim.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,120 +0,0 @@ -// A Rustls stub for TryTLS -// -// Author: Joachim Viide -// See: https://github.com/HowNetWorks/trytls-rustls-stub -// - -use rustls::{ClientConfig, ClientConnection, Error, OwnedTrustAnchor, RootCertStore}; -use std::convert::TryInto; -use std::env; -use std::error::Error as StdError; -use std::fs::File; -use std::io::{BufReader, Read, Write}; -use std::net::TcpStream; -use std::process; -use std::sync::Arc; - -enum Verdict { - Accept, - Reject(Error), -} - -fn parse_args(args: &[String]) -> Result<(String, u16, ClientConfig), Box> { - let mut root_store = RootCertStore::empty(); - match args.len() { - 3 => { - root_store.add_server_trust_anchors( - webpki_roots::TLS_SERVER_ROOTS - .0 - .iter() - .map(|ta| { - OwnedTrustAnchor::from_subject_spki_name_constraints( - ta.subject, - ta.spki, - ta.name_constraints, - ) - }), - ); - } - 4 => { - let f = File::open(&args[3])?; - root_store - .add_parsable_certificates(&rustls_pemfile::certs(&mut BufReader::new(f)).unwrap()); - } - _ => { - return Err(From::from("Incorrect number of arguments")); - } - }; - let config = rustls::ClientConfig::builder() - .with_safe_defaults() - .with_root_certificates(root_store) - .with_no_client_auth(); - - let port = args[2].parse()?; - Ok((args[1].clone(), port, config)) -} - -fn communicate( - host: String, - port: u16, - config: ClientConfig, -) -> Result> { - let server_name = host.as_str().try_into().unwrap(); - let rc_config = Arc::new(config); - let mut client = ClientConnection::new(rc_config, server_name).unwrap(); - let mut stream = TcpStream::connect((&*host, port))?; - - client - .writer() - .write_all(b"GET / HTTP/1.0\r\nConnection: close\r\nContent-Length: 0\r\n\r\n")?; - loop { - while client.wants_write() { - client.write_tls(&mut stream)?; - } - - if client.wants_read() { - if client.read_tls(&mut stream)? == 0 { - return Err(From::from("Connection closed")); - } - - if let Err(err) = client.process_new_packets() { - return match err { - Error::InvalidCertificateData(_) - | Error::InvalidCertificateSignature - | Error::InvalidCertificateSignatureType - | Error::InvalidCertificateEncoding - | Error::AlertReceived(_) => Ok(Verdict::Reject(err)), - _ => Err(From::from(format!("{:?}", err))), - }; - } - - if client.reader().read(&mut [0])? > 0 { - return Ok(Verdict::Accept); - } - } - } -} - -fn main() { - let args: Vec = env::args().collect(); - let (host, port, config) = parse_args(&args).unwrap_or_else(|err| { - println!("Argument error: {}", err); - process::exit(2); - }); - - match communicate(host, port, config) { - Ok(Verdict::Accept) => { - println!("ACCEPT"); - process::exit(0); - } - Ok(Verdict::Reject(reason)) => { - println!("{:?}", reason); - println!("REJECT"); - process::exit(0); - } - Err(err) => { - println!("{}", err); - process::exit(1); - } - } -} diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/LICENSE-APACHE temporalio-1.3.0/vendor/rustls-0.20.9/LICENSE-APACHE --- temporalio-1.3.0/vendor/rustls-0.20.9/LICENSE-APACHE 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/LICENSE-APACHE 1970-01-01 00:00:00.000000000 +0000 @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - -Copyright [yyyy] [name of copyright owner] - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/LICENSE-ISC temporalio-1.3.0/vendor/rustls-0.20.9/LICENSE-ISC --- temporalio-1.3.0/vendor/rustls-0.20.9/LICENSE-ISC 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/LICENSE-ISC 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ -ISC License (ISC) -Copyright (c) 2016, Joseph Birr-Pixton - -Permission to use, copy, modify, and/or distribute this software for -any purpose with or without fee is hereby granted, provided that the -above copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL -WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE -AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL -DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR -PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS -ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF -THIS SOFTWARE. diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/LICENSE-MIT temporalio-1.3.0/vendor/rustls-0.20.9/LICENSE-MIT --- temporalio-1.3.0/vendor/rustls-0.20.9/LICENSE-MIT 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/LICENSE-MIT 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -Copyright (c) 2016 Joseph Birr-Pixton - -Permission is hereby granted, free of charge, to any -person obtaining a copy of this software and associated -documentation files (the "Software"), to deal in the -Software without restriction, including without -limitation the rights to use, copy, modify, merge, -publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software -is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice -shall be included in all copies or substantial portions -of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/README.md temporalio-1.3.0/vendor/rustls-0.20.9/README.md --- temporalio-1.3.0/vendor/rustls-0.20.9/README.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/README.md 1970-01-01 00:00:00.000000000 +0000 @@ -1,298 +0,0 @@ -

- -

- -

-Rustls is a modern TLS library written in Rust. It uses ring for cryptography and webpki for certificate -verification. -

- -# Status -Rustls is ready for use. There are no major breaking interface changes -envisioned after the set included in the 0.20 release. - -If you'd like to help out, please see [CONTRIBUTING.md](CONTRIBUTING.md). - -[![Build Status](https://github.com/rustls/rustls/actions/workflows/build.yml/badge.svg?branch=main)](https://github.com/rustls/rustls/actions/workflows/build.yml?query=branch%3Amain) -[![Coverage Status (codecov.io)](https://codecov.io/gh/rustls/rustls/branch/main/graph/badge.svg)](https://codecov.io/gh/rustls/rustls/) -[![Documentation](https://docs.rs/rustls/badge.svg)](https://docs.rs/rustls/) -[![Chat](https://img.shields.io/discord/976380008299917365?logo=discord)](https://discord.gg/MCSB76RU96) - -## Release history - -* Next release - - Planned: removal of unused signature verification schemes at link-time. -* 0.20.8 (2023-01-12) - - Yield an error from `ConnectionCommon::read_tls()` if buffers are full. - Both a full deframer buffer and a full incoming plaintext buffer will - now cause an error to be returned. Callers should call `process_new_packets()` - and read out the plaintext data from `reader()` after each successful call to `read_tls()`. - - The minimum supported Rust version is now 1.57.0 due to some dependencies - requiring it. -* 0.20.7 (2022-10-18) - - Expose secret extraction API under the `secret_extraction` cargo feature. - This is designed to enable switching from rustls to kTLS (kernel TLS - offload) after a successful TLS 1.2/1.3 handshake, for example. - - Move filtering of signature schemes after config selection, avoiding the need - for linking in encryption/decryption code for all cipher suites at the cost of - exposing more signature schemes in the `ClientHello` emitted by the `Acceptor`. - - Expose AlertDescription, ContentType, and HandshakeType, - SignatureAlgorithm, and NamedGroup as part of the stable API. Previously they - were part of the unstable internals API, but were referenced by parts of the - stable API. - - We now have a [Discord channel](https://discord.gg/MCSB76RU96) for community - discussions. - - The minimum supported Rust version is now 1.56.0 due to several dependencies - requiring it. -* 0.20.6 (2022-05-18) - - 0.20.5 included a change to track more context for the `Error::CorruptMessage` - which made API-incompatible changes to the `Error` type. We yanked 0.20.5 - and have reverted that change as part of 0.20.6. -* 0.20.5 (2022-05-14) - - Correct compatbility with servers which return no TLS extensions and take - advantage of a special case encoding. - - Remove spurious warn-level logging introduced in 0.20.3. - - Expose cipher suites in `ClientHello` type. - - Allow verification of IP addresses with `dangerous_config` enabled. - - Retry I/O operations in `ConnectionCommon::complete_io()` when interrupted. - - Fix server::ResolvesServerCertUsingSni case sensitivity. -* 0.20.4 (2022-02-19) - - Correct regression in QUIC 0-RTT support. -* 0.20.3 (2022-02-13) - - Support loading ECDSA keys in SEC1 format. - - Support receipt of 0-RTT "early data" in TLS1.3 servers. It is not enabled - by default; opt in by setting `ServerConfig::max_early_data_size` to a non-zero - value. - - Support sending of data with the first server flight. This is also not - enabled by default either: opt in by setting `ServerConfig::send_half_rtt_data`. - - Support `read_buf` interface when compiled with nightly. This means - data can be safely read out of a rustls connection into a buffer without - the buffer requiring initialisation first. Set the `read_buf` feature to - use this. - - Improve efficiency when writing vectors of TLS types. - - Reduce copying and improve efficiency in TLS1.2 handshake. -* 0.20.2 (2021-11-21) - - Fix `CipherSuite::as_str()` value (as introduced in 0.20.1). -* 0.20.1 (2021-11-14) - - Allow cipher suite enum items to be stringified. - - Improve documentation of configuration builder types. - - Ensure unused cipher suites can be removed at link-time. - - Ensure single-use error types implement `std::error::Error`, and are public. - -See [RELEASE_NOTES.md](RELEASE_NOTES.md) for further change history. - -# Documentation -Lives here: https://docs.rs/rustls/ - -# Approach -Rustls is a TLS library that aims to provide a good level of cryptographic security, -requires no configuration to achieve that security, and provides no unsafe features or -obsolete cryptography. - -## Current features - -* TLS1.2 and TLS1.3. -* ECDSA, Ed25519 or RSA server authentication by clients. -* ECDSA, Ed25519 or RSA server authentication by servers. -* Forward secrecy using ECDHE; with curve25519, nistp256 or nistp384 curves. -* AES128-GCM and AES256-GCM bulk encryption, with safe nonces. -* ChaCha20-Poly1305 bulk encryption ([RFC7905](https://tools.ietf.org/html/rfc7905)). -* ALPN support. -* SNI support. -* Tunable fragment size to make TLS messages match size of underlying transport. -* Optional use of vectored IO to minimise system calls. -* TLS1.2 session resumption. -* TLS1.2 resumption via tickets ([RFC5077](https://tools.ietf.org/html/rfc5077)). -* TLS1.3 resumption via tickets or session storage. -* TLS1.3 0-RTT data for clients. -* TLS1.3 0-RTT data for servers. -* Client authentication by clients. -* Client authentication by servers. -* Extended master secret support ([RFC7627](https://tools.ietf.org/html/rfc7627)). -* Exporters ([RFC5705](https://tools.ietf.org/html/rfc5705)). -* OCSP stapling by servers. -* SCT stapling by servers. -* SCT verification by clients. - -## Possible future features - -* PSK support. -* OCSP verification by clients. -* Certificate pinning. - -## Non-features - -For reasons [explained in the manual](https://docs.rs/rustls/latest/rustls/manual/_02_tls_vulnerabilities/index.html), -rustls does not and will not support: - -* SSL1, SSL2, SSL3, TLS1 or TLS1.1. -* RC4. -* DES or triple DES. -* EXPORT ciphersuites. -* MAC-then-encrypt ciphersuites. -* Ciphersuites without forward secrecy. -* Renegotiation. -* Kerberos. -* Compression. -* Discrete-log Diffie-Hellman. -* Automatic protocol version downgrade. - -There are plenty of other libraries that provide these features should you -need them. - -### Platform support - -Rustls uses [`ring`](https://crates.io/crates/ring) for implementing the -cryptography in TLS. As a result, rustls only runs on platforms -[supported by `ring`](https://github.com/briansmith/ring#online-automated-testing). -At the time of writing this means x86, x86-64, armv7, and aarch64. - -Rustls requires Rust 1.56 or later. - -# Example code -There are two example programs which use -[mio](https://github.com/carllerche/mio) to do asynchronous IO. - -## Client example program -The client example program is named `tlsclient-mio`. The interface looks like: - -```tlsclient-mio -Connects to the TLS server at hostname:PORT. The default PORT -is 443. By default, this reads a request from stdin (to EOF) -before making the connection. --http replaces this with a -basic HTTP GET request for /. - -If --cafile is not supplied, a built-in set of CA certificates -are used from the webpki-roots crate. - -Usage: - tlsclient-mio [options] [--suite SUITE ...] [--proto PROTO ...] [--protover PROTOVER ...] - tlsclient-mio (--version | -v) - tlsclient-mio (--help | -h) - -Options: - -p, --port PORT Connect to PORT [default: 443]. - --http Send a basic HTTP GET request for /. - --cafile CAFILE Read root certificates from CAFILE. - --auth-key KEY Read client authentication key from KEY. - --auth-certs CERTS Read client authentication certificates from CERTS. - CERTS must match up with KEY. - --protover VERSION Disable default TLS version list, and use - VERSION instead. May be used multiple times. - --suite SUITE Disable default cipher suite list, and use - SUITE instead. May be used multiple times. - --proto PROTOCOL Send ALPN extension containing PROTOCOL. - May be used multiple times to offer several protocols. - --cache CACHE Save session cache to file CACHE. - --no-tickets Disable session ticket support. - --no-sni Disable server name indication support. - --insecure Disable certificate verification. - --verbose Emit log output. - --max-frag-size M Limit outgoing messages to M bytes. - --version, -v Show tool version. - --help, -h Show this screen. -``` - -Some sample runs: - -``` -$ cargo run --bin tlsclient-mio -- --http mozilla-modern.badssl.com -HTTP/1.1 200 OK -Server: nginx/1.6.2 (Ubuntu) -Date: Wed, 01 Jun 2016 18:44:00 GMT -Content-Type: text/html -Content-Length: 644 -(...) -``` - -or - -``` -$ cargo run --bin tlsclient-mio -- --http expired.badssl.com -TLS error: WebPkiError(CertExpired, ValidateServerCert) -Connection closed -``` - -## Server example program -The server example program is named `tlsserver-mio`. The interface looks like: - -```tlsserver-mio -Runs a TLS server on :PORT. The default PORT is 443. - -`echo' mode means the server echoes received data on each connection. - -`http' mode means the server blindly sends a HTTP response on each -connection. - -`forward' means the server forwards plaintext to a connection made to -localhost:fport. - -`--certs' names the full certificate chain, `--key' provides the -RSA private key. - -Usage: - tlsserver-mio --certs CERTFILE --key KEYFILE [--suite SUITE ...] [--proto PROTO ...] [--protover PROTOVER ...] [options] echo - tlsserver-mio --certs CERTFILE --key KEYFILE [--suite SUITE ...] [--proto PROTO ...] [--protover PROTOVER ...] [options] http - tlsserver-mio --certs CERTFILE --key KEYFILE [--suite SUITE ...] [--proto PROTO ...] [--protover PROTOVER ...] [options] forward - tlsserver-mio (--version | -v) - tlsserver-mio (--help | -h) - -Options: - -p, --port PORT Listen on PORT [default: 443]. - --certs CERTFILE Read server certificates from CERTFILE. - This should contain PEM-format certificates - in the right order (the first certificate should - certify KEYFILE, the last should be a root CA). - --key KEYFILE Read private key from KEYFILE. This should be a RSA - private key or PKCS8-encoded private key, in PEM format. - --ocsp OCSPFILE Read DER-encoded OCSP response from OCSPFILE and staple - to certificate. Optional. - --auth CERTFILE Enable client authentication, and accept certificates - signed by those roots provided in CERTFILE. - --require-auth Send a fatal alert if the client does not complete client - authentication. - --resumption Support session resumption. - --tickets Support tickets. - --protover VERSION Disable default TLS version list, and use - VERSION instead. May be used multiple times. - --suite SUITE Disable default cipher suite list, and use - SUITE instead. May be used multiple times. - --proto PROTOCOL Negotiate PROTOCOL using ALPN. - May be used multiple times. - --verbose Emit log output. - --version, -v Show tool version. - --help, -h Show this screen. -``` - -Here's a sample run; we start a TLS echo server, then connect to it with -`openssl` and `tlsclient-mio`: - -``` -$ cargo run --bin tlsserver-mio -- --certs test-ca/rsa/end.fullchain --key test-ca/rsa/end.rsa -p 8443 echo & -$ echo hello world | openssl s_client -ign_eof -quiet -connect localhost:8443 -depth=2 CN = ponytown RSA CA -verify error:num=19:self signed certificate in certificate chain -hello world -^C -$ echo hello world | cargo run --bin tlsclient-mio -- --cafile test-ca/rsa/ca.cert -p 8443 localhost -hello world -^C -``` - -# License - -Rustls is distributed under the following three licenses: - -- Apache License version 2.0. -- MIT license. -- ISC license. - -These are included as LICENSE-APACHE, LICENSE-MIT and LICENSE-ISC -respectively. You may use this software under the terms of any -of these licenses, at your option. - -# Code of conduct - -This project adopts the [Rust Code of Conduct](https://www.rust-lang.org/policies/code-of-conduct). -Please email rustls-mod@googlegroups.com to report any instance of misconduct, or if you -have any comments or questions on the Code of Conduct. diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/src/anchors.rs temporalio-1.3.0/vendor/rustls-0.20.9/src/anchors.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/src/anchors.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/src/anchors.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,154 +0,0 @@ -use crate::key; -#[cfg(feature = "logging")] -use crate::log::{debug, trace}; -use crate::msgs::handshake::{DistinguishedName, DistinguishedNames}; -use crate::x509; - -/// A trust anchor, commonly known as a "Root Certificate." -#[derive(Debug, Clone)] -pub struct OwnedTrustAnchor { - subject: Vec, - spki: Vec, - name_constraints: Option>, -} - -impl OwnedTrustAnchor { - /// Get a `webpki::TrustAnchor` by borrowing the owned elements. - pub(crate) fn to_trust_anchor(&self) -> webpki::TrustAnchor { - webpki::TrustAnchor { - subject: &self.subject, - spki: &self.spki, - name_constraints: self.name_constraints.as_deref(), - } - } - - /// Constructs an `OwnedTrustAnchor` from its components. - /// - /// All inputs are DER-encoded. - /// - /// `subject` is the [Subject] field of the trust anchor. - /// - /// `spki` is the [SubjectPublicKeyInfo] field of the trust anchor. - /// - /// `name_constraints` is the [Name Constraints] to - /// apply for this trust anchor, if any. - /// - /// [Subject]: https://datatracker.ietf.org/doc/html/rfc5280#section-4.1.2.6 - /// [SubjectPublicKeyInfo]: https://datatracker.ietf.org/doc/html/rfc5280#section-4.1.2.7 - /// [Name Constraints]: https://datatracker.ietf.org/doc/html/rfc5280#section-4.2.1.10 - pub fn from_subject_spki_name_constraints( - subject: impl Into>, - spki: impl Into>, - name_constraints: Option>>, - ) -> Self { - Self { - subject: subject.into(), - spki: spki.into(), - name_constraints: name_constraints.map(|x| x.into()), - } - } - - /// Return the subject field. - /// - /// This can be decoded using [x509-parser's FromDer trait](https://docs.rs/x509-parser/latest/x509_parser/traits/trait.FromDer.html). - /// - /// ```ignore - /// use x509_parser::traits::FromDer; - /// println!("{}", x509_parser::x509::X509Name::from_der(anchor.subject())?.1); - /// ``` - pub fn subject(&self) -> &[u8] { - &self.subject - } -} - -/// A container for root certificates able to provide a root-of-trust -/// for connection authentication. -#[derive(Debug, Clone)] -pub struct RootCertStore { - /// The list of roots. - pub roots: Vec, -} - -impl RootCertStore { - /// Make a new, empty `RootCertStore`. - pub fn empty() -> Self { - Self { roots: Vec::new() } - } - - /// Return true if there are no certificates. - pub fn is_empty(&self) -> bool { - self.len() == 0 - } - - /// Say how many certificates are in the container. - pub fn len(&self) -> usize { - self.roots.len() - } - - /// Return the Subject Names for certificates in the container. - #[deprecated(since = "0.20.7", note = "Use OwnedTrustAnchor::subject() instead")] - pub fn subjects(&self) -> DistinguishedNames { - let mut r = DistinguishedNames::new(); - - for ota in &self.roots { - let mut name = Vec::new(); - name.extend_from_slice(&ota.subject); - x509::wrap_in_sequence(&mut name); - r.push(DistinguishedName::new(name)); - } - - r - } - - /// Add a single DER-encoded certificate to the store. - pub fn add(&mut self, der: &key::Certificate) -> Result<(), webpki::Error> { - let ta = webpki::TrustAnchor::try_from_cert_der(&der.0)?; - let ota = OwnedTrustAnchor::from_subject_spki_name_constraints( - ta.subject, - ta.spki, - ta.name_constraints, - ); - self.roots.push(ota); - Ok(()) - } - - /// Adds all the given TrustAnchors `anchors`. This does not - /// fail. - pub fn add_server_trust_anchors( - &mut self, - trust_anchors: impl Iterator, - ) { - self.roots.extend(trust_anchors) - } - - /// Parse the given DER-encoded certificates and add all that can be parsed - /// in a best-effort fashion. - /// - /// This is because large collections of root certificates often - /// include ancient or syntactically invalid certificates. - /// - /// Returns the number of certificates added, and the number that were ignored. - pub fn add_parsable_certificates(&mut self, der_certs: &[Vec]) -> (usize, usize) { - let mut valid_count = 0; - let mut invalid_count = 0; - - for der_cert in der_certs { - #[cfg_attr(not(feature = "logging"), allow(unused_variables))] - match self.add(&key::Certificate(der_cert.clone())) { - Ok(_) => valid_count += 1, - Err(err) => { - trace!("invalid cert der {:?}", der_cert); - debug!("certificate parsing failed: {:?}", err); - invalid_count += 1 - } - } - } - - debug!( - "add_parsable_certificates processed {} valid and {} invalid certs", - valid_count, invalid_count - ); - - (valid_count, invalid_count) - } -} diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/src/bs_debug.rs temporalio-1.3.0/vendor/rustls-0.20.9/src/bs_debug.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/src/bs_debug.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/src/bs_debug.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,77 +0,0 @@ -use std::fmt; - -/// Alternative implementation of `fmt::Debug` for byte slice. -/// -/// Standard `Debug` implementation for `[u8]` is comma separated -/// list of numbers. Since large amount of byte strings are in fact -/// ASCII strings or contain a lot of ASCII strings (e. g. HTTP), -/// it is convenient to print strings as ASCII when possible. -/// -/// This struct wraps `&[u8]` just to override `fmt::Debug`. -/// -/// `BsDebug` is not a part of public API of bytes crate. -pub(crate) struct BsDebug<'a>(pub(crate) &'a [u8]); - -impl<'a> fmt::Debug for BsDebug<'a> { - fn fmt(&self, fmt: &mut fmt::Formatter) -> Result<(), fmt::Error> { - write!(fmt, "b\"")?; - for &c in self.0 { - // https://doc.rust-lang.org/reference.html#byte-escapes - if c == b'\n' { - write!(fmt, "\\n")?; - } else if c == b'\r' { - write!(fmt, "\\r")?; - } else if c == b'\t' { - write!(fmt, "\\t")?; - } else if c == b'\\' || c == b'"' { - write!(fmt, "\\{}", c as char)?; - } else if c == b'\0' { - write!(fmt, "\\0")?; - // ASCII printable - } else if (0x20..0x7f).contains(&c) { - write!(fmt, "{}", c as char)?; - } else { - write!(fmt, "\\x{:02x}", c)?; - } - } - write!(fmt, "\"")?; - Ok(()) - } -} - -#[cfg(test)] -mod test { - use super::BsDebug; - - #[test] - fn debug() { - let vec: Vec<_> = (0..0x100).map(|b| b as u8).collect(); - - let expected = "b\"\ - \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07\ - \\x08\\t\\n\\x0b\\x0c\\r\\x0e\\x0f\ - \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17\ - \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f\ - \x20!\\\"#$%&'()*+,-./0123456789:;<=>?\ - @ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_\ - `abcdefghijklmnopqrstuvwxyz{|}~\\x7f\ - \\x80\\x81\\x82\\x83\\x84\\x85\\x86\\x87\ - \\x88\\x89\\x8a\\x8b\\x8c\\x8d\\x8e\\x8f\ - \\x90\\x91\\x92\\x93\\x94\\x95\\x96\\x97\ - \\x98\\x99\\x9a\\x9b\\x9c\\x9d\\x9e\\x9f\ - \\xa0\\xa1\\xa2\\xa3\\xa4\\xa5\\xa6\\xa7\ - \\xa8\\xa9\\xaa\\xab\\xac\\xad\\xae\\xaf\ - \\xb0\\xb1\\xb2\\xb3\\xb4\\xb5\\xb6\\xb7\ - \\xb8\\xb9\\xba\\xbb\\xbc\\xbd\\xbe\\xbf\ - \\xc0\\xc1\\xc2\\xc3\\xc4\\xc5\\xc6\\xc7\ - \\xc8\\xc9\\xca\\xcb\\xcc\\xcd\\xce\\xcf\ - \\xd0\\xd1\\xd2\\xd3\\xd4\\xd5\\xd6\\xd7\ - \\xd8\\xd9\\xda\\xdb\\xdc\\xdd\\xde\\xdf\ - \\xe0\\xe1\\xe2\\xe3\\xe4\\xe5\\xe6\\xe7\ - \\xe8\\xe9\\xea\\xeb\\xec\\xed\\xee\\xef\ - \\xf0\\xf1\\xf2\\xf3\\xf4\\xf5\\xf6\\xf7\ - \\xf8\\xf9\\xfa\\xfb\\xfc\\xfd\\xfe\\xff\""; - - assert_eq!(expected, format!("{:?}", BsDebug(&vec))); - } -} diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/src/builder.rs temporalio-1.3.0/vendor/rustls-0.20.9/src/builder.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/src/builder.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/src/builder.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,268 +0,0 @@ -use crate::error::Error; -use crate::kx::{SupportedKxGroup, ALL_KX_GROUPS}; -use crate::suites::{SupportedCipherSuite, DEFAULT_CIPHER_SUITES}; -use crate::versions; - -use std::fmt; -use std::marker::PhantomData; - -/// Building a [`ServerConfig`] or [`ClientConfig`] in a linker-friendly and -/// complete way. -/// -/// Linker-friendly: meaning unused cipher suites, protocol -/// versions, key exchange mechanisms, etc. can be discarded -/// by the linker as they'll be unreferenced. -/// -/// Complete: the type system ensures all decisions required to run a -/// server or client have been made by the time the process finishes. -/// -/// Example, to make a [`ServerConfig`]: -/// -/// ```no_run -/// # use rustls::ServerConfig; -/// # let certs = vec![]; -/// # let private_key = rustls::PrivateKey(vec![]); -/// ServerConfig::builder() -/// .with_safe_default_cipher_suites() -/// .with_safe_default_kx_groups() -/// .with_safe_default_protocol_versions() -/// .unwrap() -/// .with_no_client_auth() -/// .with_single_cert(certs, private_key) -/// .expect("bad certificate/key"); -/// ``` -/// -/// This may be shortened to: -/// -/// ```no_run -/// # use rustls::ServerConfig; -/// # let certs = vec![]; -/// # let private_key = rustls::PrivateKey(vec![]); -/// ServerConfig::builder() -/// .with_safe_defaults() -/// .with_no_client_auth() -/// .with_single_cert(certs, private_key) -/// .expect("bad certificate/key"); -/// ``` -/// -/// To make a [`ClientConfig`]: -/// -/// ```no_run -/// # use rustls::ClientConfig; -/// # let root_certs = rustls::RootCertStore::empty(); -/// # let certs = vec![]; -/// # let private_key = rustls::PrivateKey(vec![]); -/// ClientConfig::builder() -/// .with_safe_default_cipher_suites() -/// .with_safe_default_kx_groups() -/// .with_safe_default_protocol_versions() -/// .unwrap() -/// .with_root_certificates(root_certs) -/// .with_single_cert(certs, private_key) -/// .expect("bad certificate/key"); -/// ``` -/// -/// This may be shortened to: -/// -/// ``` -/// # use rustls::ClientConfig; -/// # let root_certs = rustls::RootCertStore::empty(); -/// ClientConfig::builder() -/// .with_safe_defaults() -/// .with_root_certificates(root_certs) -/// .with_no_client_auth(); -/// ``` -/// -/// The types used here fit together like this: -/// -/// 1. Call [`ClientConfig::builder()`] or [`ServerConfig::builder()`] to initialize a builder. -/// 1. You must make a decision on which cipher suites to use, typically -/// by calling [`ConfigBuilder::with_safe_default_cipher_suites()`]. -/// 2. Now you must make a decision -/// on key exchange groups: typically by calling -/// [`ConfigBuilder::with_safe_default_kx_groups()`]. -/// 3. Now you must make -/// a decision on which protocol versions to support, typically by calling -/// [`ConfigBuilder::with_safe_default_protocol_versions()`]. -/// 5. Now see [`ConfigBuilder`] or -/// [`ConfigBuilder`] for further steps. -/// -/// [`ServerConfig`]: crate::ServerConfig -/// [`ClientConfig`]: crate::ClientConfig -/// [`ClientConfig::builder()`]: crate::ClientConfig::builder() -/// [`ServerConfig::builder()`]: crate::ServerConfig::builder() -/// [`ConfigBuilder`]: struct.ConfigBuilder.html#impl-3 -/// [`ConfigBuilder`]: struct.ConfigBuilder.html#impl-6 -#[derive(Clone)] -pub struct ConfigBuilder { - pub(crate) state: State, - pub(crate) side: PhantomData, -} - -impl fmt::Debug for ConfigBuilder { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - let side_name = std::any::type_name::(); - let side_name = side_name - .split("::") - .last() - .unwrap_or(side_name); - f.debug_struct(&format!("ConfigBuilder<{}, _>", side_name)) - .field("state", &self.state) - .finish() - } -} - -/// Config builder state where the caller must supply cipher suites. -/// -/// For more information, see the [`ConfigBuilder`] documentation. -#[derive(Clone, Debug)] -pub struct WantsCipherSuites(pub(crate) ()); - -impl ConfigBuilder { - /// Start side-specific config with defaults for underlying cryptography. - /// - /// If used, this will enable all safe supported cipher suites ([`DEFAULT_CIPHER_SUITES`]), all - /// safe supported key exchange groups ([`ALL_KX_GROUPS`]) and all safe supported protocol - /// versions ([`DEFAULT_VERSIONS`]). - /// - /// These are safe defaults, useful for 99% of applications. - /// - /// [`DEFAULT_VERSIONS`]: versions::DEFAULT_VERSIONS - pub fn with_safe_defaults(self) -> ConfigBuilder { - ConfigBuilder { - state: WantsVerifier { - cipher_suites: DEFAULT_CIPHER_SUITES.to_vec(), - kx_groups: ALL_KX_GROUPS.to_vec(), - versions: versions::EnabledVersions::new(versions::DEFAULT_VERSIONS), - }, - side: self.side, - } - } - - /// Choose a specific set of cipher suites. - pub fn with_cipher_suites( - self, - cipher_suites: &[SupportedCipherSuite], - ) -> ConfigBuilder { - ConfigBuilder { - state: WantsKxGroups { - cipher_suites: cipher_suites.to_vec(), - }, - side: self.side, - } - } - - /// Choose the default set of cipher suites ([`DEFAULT_CIPHER_SUITES`]). - /// - /// Note that this default provides only high-quality suites: there is no need - /// to filter out low-, export- or NULL-strength cipher suites: rustls does not - /// implement these. - pub fn with_safe_default_cipher_suites(self) -> ConfigBuilder { - self.with_cipher_suites(DEFAULT_CIPHER_SUITES) - } -} - -/// Config builder state where the caller must supply key exchange groups. -/// -/// For more information, see the [`ConfigBuilder`] documentation. -#[derive(Clone, Debug)] -pub struct WantsKxGroups { - cipher_suites: Vec, -} - -impl ConfigBuilder { - /// Choose a specific set of key exchange groups. - pub fn with_kx_groups( - self, - kx_groups: &[&'static SupportedKxGroup], - ) -> ConfigBuilder { - ConfigBuilder { - state: WantsVersions { - cipher_suites: self.state.cipher_suites, - kx_groups: kx_groups.to_vec(), - }, - side: self.side, - } - } - - /// Choose the default set of key exchange groups ([`ALL_KX_GROUPS`]). - /// - /// This is a safe default: rustls doesn't implement any poor-quality groups. - pub fn with_safe_default_kx_groups(self) -> ConfigBuilder { - self.with_kx_groups(&ALL_KX_GROUPS) - } -} - -/// Config builder state where the caller must supply TLS protocol versions. -/// -/// For more information, see the [`ConfigBuilder`] documentation. -#[derive(Clone, Debug)] -pub struct WantsVersions { - cipher_suites: Vec, - kx_groups: Vec<&'static SupportedKxGroup>, -} - -impl ConfigBuilder { - /// Accept the default protocol versions: both TLS1.2 and TLS1.3 are enabled. - pub fn with_safe_default_protocol_versions( - self, - ) -> Result, Error> { - self.with_protocol_versions(versions::DEFAULT_VERSIONS) - } - - /// Use a specific set of protocol versions. - pub fn with_protocol_versions( - self, - versions: &[&'static versions::SupportedProtocolVersion], - ) -> Result, Error> { - let mut any_usable_suite = false; - for suite in &self.state.cipher_suites { - if versions.contains(&suite.version()) { - any_usable_suite = true; - break; - } - } - - if !any_usable_suite { - return Err(Error::General("no usable cipher suites configured".into())); - } - - if self.state.kx_groups.is_empty() { - return Err(Error::General("no kx groups configured".into())); - } - - Ok(ConfigBuilder { - state: WantsVerifier { - cipher_suites: self.state.cipher_suites, - kx_groups: self.state.kx_groups, - versions: versions::EnabledVersions::new(versions), - }, - side: self.side, - }) - } -} - -/// Config builder state where the caller must supply a verifier. -/// -/// For more information, see the [`ConfigBuilder`] documentation. -#[derive(Clone, Debug)] -pub struct WantsVerifier { - pub(crate) cipher_suites: Vec, - pub(crate) kx_groups: Vec<&'static SupportedKxGroup>, - pub(crate) versions: versions::EnabledVersions, -} - -/// Helper trait to abstract [`ConfigBuilder`] over building a [`ClientConfig`] or [`ServerConfig`]. -/// -/// [`ClientConfig`]: crate::ClientConfig -/// [`ServerConfig`]: crate::ServerConfig -pub trait ConfigSide: sealed::Sealed {} - -impl ConfigSide for crate::ClientConfig {} -impl ConfigSide for crate::ServerConfig {} - -mod sealed { - pub trait Sealed {} - impl Sealed for crate::ClientConfig {} - impl Sealed for crate::ServerConfig {} -} diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/src/check.rs temporalio-1.3.0/vendor/rustls-0.20.9/src/check.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/src/check.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/src/check.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,77 +0,0 @@ -use crate::error::Error; -#[cfg(feature = "logging")] -use crate::log::warn; -use crate::msgs::enums::{ContentType, HandshakeType}; -use crate::msgs::message::MessagePayload; - -/// For a Message $m, and a HandshakePayload enum member $payload_type, -/// return Ok(payload) if $m is both a handshake message and one that -/// has the given $payload_type. If not, return Err(rustls::Error) quoting -/// $handshake_type as the expected handshake type. -macro_rules! require_handshake_msg( - ( $m:expr, $handshake_type:path, $payload_type:path ) => ( - match &$m.payload { - MessagePayload::Handshake { parsed: $crate::msgs::handshake::HandshakeMessagePayload { - payload: $payload_type(hm), - .. - }, .. } => Ok(hm), - payload => Err($crate::check::inappropriate_handshake_message( - payload, - &[$crate::msgs::enums::ContentType::Handshake], - &[$handshake_type])) - } - ) -); - -/// Like require_handshake_msg, but moves the payload out of $m. -#[cfg(feature = "tls12")] -macro_rules! require_handshake_msg_move( - ( $m:expr, $handshake_type:path, $payload_type:path ) => ( - match $m.payload { - MessagePayload::Handshake { parsed: $crate::msgs::handshake::HandshakeMessagePayload { - payload: $payload_type(hm), - .. - }, .. } => Ok(hm), - payload => - Err($crate::check::inappropriate_handshake_message( - &payload, - &[$crate::msgs::enums::ContentType::Handshake], - &[$handshake_type])) - } - ) -); - -pub(crate) fn inappropriate_message( - payload: &MessagePayload, - content_types: &[ContentType], -) -> Error { - warn!( - "Received a {:?} message while expecting {:?}", - payload.content_type(), - content_types - ); - Error::InappropriateMessage { - expect_types: content_types.to_vec(), - got_type: payload.content_type(), - } -} - -pub(crate) fn inappropriate_handshake_message( - payload: &MessagePayload, - content_types: &[ContentType], - handshake_types: &[HandshakeType], -) -> Error { - match payload { - MessagePayload::Handshake { parsed, .. } => { - warn!( - "Received a {:?} handshake message while expecting {:?}", - parsed.typ, handshake_types - ); - Error::InappropriateHandshakeMessage { - expect_types: handshake_types.to_vec(), - got_type: parsed.typ, - } - } - payload => inappropriate_message(payload, content_types), - } -} diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/src/cipher.rs temporalio-1.3.0/vendor/rustls-0.20.9/src/cipher.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/src/cipher.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/src/cipher.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,101 +0,0 @@ -use crate::error::Error; -use crate::msgs::codec; -use crate::msgs::message::{BorrowedPlainMessage, OpaqueMessage, PlainMessage}; - -use ring::{aead, hkdf}; - -/// Objects with this trait can decrypt TLS messages. -pub trait MessageDecrypter: Send + Sync { - /// Perform the decryption over the concerned TLS message. - - fn decrypt(&self, m: OpaqueMessage, seq: u64) -> Result; -} - -/// Objects with this trait can encrypt TLS messages. -pub(crate) trait MessageEncrypter: Send + Sync { - fn encrypt(&self, m: BorrowedPlainMessage, seq: u64) -> Result; -} - -impl dyn MessageEncrypter { - pub(crate) fn invalid() -> Box { - Box::new(InvalidMessageEncrypter {}) - } -} - -impl dyn MessageDecrypter { - pub(crate) fn invalid() -> Box { - Box::new(InvalidMessageDecrypter {}) - } -} - -/// A write or read IV. -#[derive(Default)] -pub(crate) struct Iv(pub(crate) [u8; ring::aead::NONCE_LEN]); - -impl Iv { - #[cfg(feature = "tls12")] - fn new(value: [u8; ring::aead::NONCE_LEN]) -> Self { - Self(value) - } - - #[cfg(feature = "tls12")] - pub(crate) fn copy(value: &[u8]) -> Self { - debug_assert_eq!(value.len(), ring::aead::NONCE_LEN); - let mut iv = Self::new(Default::default()); - iv.0.copy_from_slice(value); - iv - } - - #[cfg(test)] - pub(crate) fn value(&self) -> &[u8; 12] { - &self.0 - } -} - -pub(crate) struct IvLen; - -impl hkdf::KeyType for IvLen { - fn len(&self) -> usize { - aead::NONCE_LEN - } -} - -impl From> for Iv { - fn from(okm: hkdf::Okm) -> Self { - let mut r = Self(Default::default()); - okm.fill(&mut r.0[..]).unwrap(); - r - } -} - -pub(crate) fn make_nonce(iv: &Iv, seq: u64) -> ring::aead::Nonce { - let mut nonce = [0u8; ring::aead::NONCE_LEN]; - codec::put_u64(seq, &mut nonce[4..]); - - nonce - .iter_mut() - .zip(iv.0.iter()) - .for_each(|(nonce, iv)| { - *nonce ^= *iv; - }); - - aead::Nonce::assume_unique_for_key(nonce) -} - -/// A `MessageEncrypter` which doesn't work. -struct InvalidMessageEncrypter {} - -impl MessageEncrypter for InvalidMessageEncrypter { - fn encrypt(&self, _m: BorrowedPlainMessage, _seq: u64) -> Result { - Err(Error::General("encrypt not yet available".to_string())) - } -} - -/// A `MessageDecrypter` which doesn't work. -struct InvalidMessageDecrypter {} - -impl MessageDecrypter for InvalidMessageDecrypter { - fn decrypt(&self, _m: OpaqueMessage, _seq: u64) -> Result { - Err(Error::DecryptError) - } -} diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/src/client/builder.rs temporalio-1.3.0/vendor/rustls-0.20.9/src/client/builder.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/src/client/builder.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/src/client/builder.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,192 +0,0 @@ -use crate::anchors; -use crate::builder::{ConfigBuilder, WantsVerifier}; -use crate::client::handy; -use crate::client::{ClientConfig, ResolvesClientCert}; -use crate::error::Error; -use crate::key; -use crate::kx::SupportedKxGroup; -use crate::suites::SupportedCipherSuite; -use crate::verify::{self, CertificateTransparencyPolicy}; -use crate::versions; -use crate::NoKeyLog; - -use std::marker::PhantomData; -use std::sync::Arc; -use std::time::SystemTime; - -impl ConfigBuilder { - /// Choose how to verify client certificates. - pub fn with_root_certificates( - self, - root_store: anchors::RootCertStore, - ) -> ConfigBuilder { - ConfigBuilder { - state: WantsTransparencyPolicyOrClientCert { - cipher_suites: self.state.cipher_suites, - kx_groups: self.state.kx_groups, - versions: self.state.versions, - root_store, - }, - side: PhantomData, - } - } - - #[cfg(feature = "dangerous_configuration")] - /// Set a custom certificate verifier. - pub fn with_custom_certificate_verifier( - self, - verifier: Arc, - ) -> ConfigBuilder { - ConfigBuilder { - state: WantsClientCert { - cipher_suites: self.state.cipher_suites, - kx_groups: self.state.kx_groups, - versions: self.state.versions, - verifier, - }, - side: PhantomData, - } - } -} - -/// A config builder state where the caller needs to supply a certificate transparency policy or -/// client certificate resolver. -/// -/// In this state, the caller can optionally enable certificate transparency, or ignore CT and -/// invoke one of the methods related to client certificates (as in the [`WantsClientCert`] state). -/// -/// For more information, see the [`ConfigBuilder`] documentation. -#[derive(Clone, Debug)] -pub struct WantsTransparencyPolicyOrClientCert { - cipher_suites: Vec, - kx_groups: Vec<&'static SupportedKxGroup>, - versions: versions::EnabledVersions, - root_store: anchors::RootCertStore, -} - -impl ConfigBuilder { - /// Set Certificate Transparency logs to use for server certificate validation. - /// - /// Because Certificate Transparency logs are sharded on a per-year basis and can be trusted or - /// distrusted relatively quickly, rustls stores a validation deadline. Server certificates will - /// be validated against the configured CT logs until the deadline expires. After the deadline, - /// certificates will no longer be validated, and a warning message will be logged. The deadline - /// may vary depending on how often you deploy builds with updated dependencies. - pub fn with_certificate_transparency_logs( - self, - logs: &'static [&'static sct::Log], - validation_deadline: SystemTime, - ) -> ConfigBuilder { - self.with_logs(Some(CertificateTransparencyPolicy::new( - logs, - validation_deadline, - ))) - } - - /// Sets a single certificate chain and matching private key for use - /// in client authentication. - /// - /// `cert_chain` is a vector of DER-encoded certificates. - /// `key_der` is a DER-encoded RSA, ECDSA, or Ed25519 private key. - /// - /// This function fails if `key_der` is invalid. - pub fn with_single_cert( - self, - cert_chain: Vec, - key_der: key::PrivateKey, - ) -> Result { - self.with_logs(None) - .with_single_cert(cert_chain, key_der) - } - - /// Do not support client auth. - pub fn with_no_client_auth(self) -> ClientConfig { - self.with_logs(None) - .with_client_cert_resolver(Arc::new(handy::FailResolveClientCert {})) - } - - /// Sets a custom [`ResolvesClientCert`]. - pub fn with_client_cert_resolver( - self, - client_auth_cert_resolver: Arc, - ) -> ClientConfig { - self.with_logs(None) - .with_client_cert_resolver(client_auth_cert_resolver) - } - - fn with_logs( - self, - ct_policy: Option, - ) -> ConfigBuilder { - ConfigBuilder { - state: WantsClientCert { - cipher_suites: self.state.cipher_suites, - kx_groups: self.state.kx_groups, - versions: self.state.versions, - verifier: Arc::new(verify::WebPkiVerifier::new( - self.state.root_store, - ct_policy, - )), - }, - side: PhantomData, - } - } -} - -/// A config builder state where the caller needs to supply whether and how to provide a client -/// certificate. -/// -/// For more information, see the [`ConfigBuilder`] documentation. -#[derive(Clone, Debug)] -pub struct WantsClientCert { - cipher_suites: Vec, - kx_groups: Vec<&'static SupportedKxGroup>, - versions: versions::EnabledVersions, - verifier: Arc, -} - -impl ConfigBuilder { - /// Sets a single certificate chain and matching private key for use - /// in client authentication. - /// - /// `cert_chain` is a vector of DER-encoded certificates. - /// `key_der` is a DER-encoded RSA, ECDSA, or Ed25519 private key. - /// - /// This function fails if `key_der` is invalid. - pub fn with_single_cert( - self, - cert_chain: Vec, - key_der: key::PrivateKey, - ) -> Result { - let resolver = handy::AlwaysResolvesClientCert::new(cert_chain, &key_der)?; - Ok(self.with_client_cert_resolver(Arc::new(resolver))) - } - - /// Do not support client auth. - pub fn with_no_client_auth(self) -> ClientConfig { - self.with_client_cert_resolver(Arc::new(handy::FailResolveClientCert {})) - } - - /// Sets a custom [`ResolvesClientCert`]. - pub fn with_client_cert_resolver( - self, - client_auth_cert_resolver: Arc, - ) -> ClientConfig { - ClientConfig { - cipher_suites: self.state.cipher_suites, - kx_groups: self.state.kx_groups, - alpn_protocols: Vec::new(), - session_storage: handy::ClientSessionMemoryCache::new(256), - max_fragment_size: None, - client_auth_cert_resolver, - enable_tickets: true, - versions: self.state.versions, - enable_sni: true, - verifier: self.state.verifier, - key_log: Arc::new(NoKeyLog {}), - #[cfg(feature = "secret_extraction")] - enable_secret_extraction: false, - enable_early_data: false, - } - } -} diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/src/client/client_conn.rs temporalio-1.3.0/vendor/rustls-0.20.9/src/client/client_conn.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/src/client/client_conn.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/src/client/client_conn.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,667 +0,0 @@ -use crate::builder::{ConfigBuilder, WantsCipherSuites}; -use crate::conn::{CommonState, ConnectionCommon, Protocol, Side}; -use crate::enums::{CipherSuite, ProtocolVersion, SignatureScheme}; -use crate::error::Error; -use crate::kx::SupportedKxGroup; -#[cfg(feature = "logging")] -use crate::log::trace; -#[cfg(feature = "quic")] -use crate::msgs::enums::AlertDescription; -use crate::msgs::handshake::ClientExtension; -use crate::sign; -use crate::suites::SupportedCipherSuite; -use crate::verify; -use crate::versions; -#[cfg(feature = "secret_extraction")] -use crate::ExtractedSecrets; -use crate::KeyLog; - -use super::hs; -#[cfg(feature = "quic")] -use crate::quic; - -use std::convert::TryFrom; -use std::error::Error as StdError; -use std::marker::PhantomData; -use std::net::IpAddr; -use std::ops::{Deref, DerefMut}; -use std::sync::Arc; -use std::{fmt, io, mem}; - -/// A trait for the ability to store client session data. -/// The keys and values are opaque. -/// -/// Both the keys and values should be treated as -/// **highly sensitive data**, containing enough key material -/// to break all security of the corresponding session. -/// -/// `put` is a mutating operation; this isn't expressed -/// in the type system to allow implementations freedom in -/// how to achieve interior mutability. `Mutex` is a common -/// choice. -pub trait StoresClientSessions: Send + Sync { - /// Stores a new `value` for `key`. Returns `true` - /// if the value was stored. - fn put(&self, key: Vec, value: Vec) -> bool; - - /// Returns the latest value for `key`. Returns `None` - /// if there's no such value. - fn get(&self, key: &[u8]) -> Option>; -} - -/// A trait for the ability to choose a certificate chain and -/// private key for the purposes of client authentication. -pub trait ResolvesClientCert: Send + Sync { - /// With the server-supplied acceptable issuers in `acceptable_issuers`, - /// the server's supported signature schemes in `sigschemes`, - /// return a certificate chain and signing key to authenticate. - /// - /// `acceptable_issuers` is undecoded and unverified by the rustls - /// library, but it should be expected to contain a DER encodings - /// of X501 NAMEs. - /// - /// Return None to continue the handshake without any client - /// authentication. The server may reject the handshake later - /// if it requires authentication. - fn resolve( - &self, - acceptable_issuers: &[&[u8]], - sigschemes: &[SignatureScheme], - ) -> Option>; - - /// Return true if any certificates at all are available. - fn has_certs(&self) -> bool; -} - -/// Common configuration for (typically) all connections made by -/// a program. -/// -/// Making one of these can be expensive, and should be -/// once per process rather than once per connection. -/// -/// These must be created via the [`ClientConfig::builder()`] function. -/// -/// # Defaults -/// -/// * [`ClientConfig::max_fragment_size`]: the default is `None`: TLS packets are not fragmented to a specific size. -/// * [`ClientConfig::session_storage`]: the default stores 256 sessions in memory. -/// * [`ClientConfig::alpn_protocols`]: the default is empty -- no ALPN protocol is negotiated. -/// * [`ClientConfig::key_log`]: key material is not logged. -#[derive(Clone)] -pub struct ClientConfig { - /// List of ciphersuites, in preference order. - pub(super) cipher_suites: Vec, - - /// List of supported key exchange algorithms, in preference order -- the - /// first element is the highest priority. - /// - /// The first element in this list is the _default key share algorithm_, - /// and in TLS1.3 a key share for it is sent in the client hello. - pub(super) kx_groups: Vec<&'static SupportedKxGroup>, - - /// Which ALPN protocols we include in our client hello. - /// If empty, no ALPN extension is sent. - pub alpn_protocols: Vec>, - - /// How we store session data or tickets. - pub session_storage: Arc, - - /// The maximum size of TLS message we'll emit. If None, we don't limit TLS - /// message lengths except to the 2**16 limit specified in the standard. - /// - /// rustls enforces an arbitrary minimum of 32 bytes for this field. - /// Out of range values are reported as errors from ClientConnection::new. - /// - /// Setting this value to the TCP MSS may improve latency for stream-y workloads. - pub max_fragment_size: Option, - - /// How to decide what client auth certificate/keys to use. - pub client_auth_cert_resolver: Arc, - - /// Whether to support RFC5077 tickets. You must provide a working - /// `session_storage` member for this to have any meaningful - /// effect. - /// - /// The default is true. - pub enable_tickets: bool, - - /// Supported versions, in no particular order. The default - /// is all supported versions. - pub(super) versions: versions::EnabledVersions, - - /// Whether to send the Server Name Indication (SNI) extension - /// during the client handshake. - /// - /// The default is true. - pub enable_sni: bool, - - /// How to verify the server certificate chain. - pub(super) verifier: Arc, - - /// How to output key material for debugging. The default - /// does nothing. - pub key_log: Arc, - - /// Allows traffic secrets to be extracted after the handshake, - /// e.g. for kTLS setup. - #[cfg(feature = "secret_extraction")] - pub enable_secret_extraction: bool, - - /// Whether to send data on the first flight ("early data") in - /// TLS 1.3 handshakes. - /// - /// The default is false. - pub enable_early_data: bool, -} - -impl fmt::Debug for ClientConfig { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("ClientConfig") - .field("alpn_protocols", &self.alpn_protocols) - .field("max_fragment_size", &self.max_fragment_size) - .field("enable_tickets", &self.enable_tickets) - .field("enable_sni", &self.enable_sni) - .field("enable_early_data", &self.enable_early_data) - .finish_non_exhaustive() - } -} - -impl ClientConfig { - /// Create a builder to build up the client configuration. - /// - /// For more information, see the [`ConfigBuilder`] documentation. - pub fn builder() -> ConfigBuilder { - ConfigBuilder { - state: WantsCipherSuites(()), - side: PhantomData, - } - } - - #[doc(hidden)] - /// We support a given TLS version if it's quoted in the configured - /// versions *and* at least one ciphersuite for this version is - /// also configured. - pub fn supports_version(&self, v: ProtocolVersion) -> bool { - self.versions.contains(v) - && self - .cipher_suites - .iter() - .any(|cs| cs.version().version == v) - } - - /// Access configuration options whose use is dangerous and requires - /// extra care. - #[cfg(feature = "dangerous_configuration")] - pub fn dangerous(&mut self) -> danger::DangerousClientConfig { - danger::DangerousClientConfig { cfg: self } - } - - pub(super) fn find_cipher_suite(&self, suite: CipherSuite) -> Option { - self.cipher_suites - .iter() - .copied() - .find(|&scs| scs.suite() == suite) - } -} - -/// Encodes ways a client can know the expected name of the server. -/// -/// This currently covers knowing the DNS name of the server, but -/// will be extended in the future to supporting privacy-preserving names -/// for the server ("ECH"). For this reason this enum is `non_exhaustive`. -/// -/// # Making one -/// -/// If you have a DNS name as a `&str`, this type implements `TryFrom<&str>`, -/// so you can do: -/// -/// ``` -/// # use std::convert::{TryInto, TryFrom}; -/// # use rustls::ServerName; -/// ServerName::try_from("example.com").expect("invalid DNS name"); -/// -/// // or, alternatively... -/// -/// let x = "example.com".try_into().expect("invalid DNS name"); -/// # let _: ServerName = x; -/// ``` -#[non_exhaustive] -#[derive(Clone, Debug, Eq, Hash, PartialEq)] -pub enum ServerName { - /// The server is identified by a DNS name. The name - /// is sent in the TLS Server Name Indication (SNI) - /// extension. - DnsName(verify::DnsName), - - /// The server is identified by an IP address. SNI is not - /// done. - IpAddress(IpAddr), -} - -impl ServerName { - /// Return the name that should go in the SNI extension. - /// If [`None`] is returned, the SNI extension is not included - /// in the handshake. - pub(crate) fn for_sni(&self) -> Option { - match self { - Self::DnsName(dns_name) => Some(dns_name.0.as_ref()), - Self::IpAddress(_) => None, - } - } - - /// Return a prefix-free, unique encoding for the name. - pub(crate) fn encode(&self) -> Vec { - enum UniqueTypeCode { - DnsName = 0x01, - IpAddr = 0x02, - } - - match self { - Self::DnsName(dns_name) => { - let bytes = dns_name.0.as_ref(); - - let mut r = Vec::with_capacity(2 + bytes.as_ref().len()); - r.push(UniqueTypeCode::DnsName as u8); - r.push(bytes.as_ref().len() as u8); - r.extend_from_slice(bytes.as_ref()); - - r - } - Self::IpAddress(address) => { - let string = address.to_string(); - let bytes = string.as_bytes(); - - let mut r = Vec::with_capacity(2 + bytes.len()); - r.push(UniqueTypeCode::IpAddr as u8); - r.push(bytes.len() as u8); - r.extend_from_slice(bytes); - - r - } - } - } -} - -/// Attempt to make a ServerName from a string by parsing -/// it as a DNS name. -impl TryFrom<&str> for ServerName { - type Error = InvalidDnsNameError; - fn try_from(s: &str) -> Result { - match webpki::DnsNameRef::try_from_ascii_str(s) { - Ok(dns) => Ok(Self::DnsName(verify::DnsName(dns.into()))), - Err(webpki::InvalidDnsNameError) => match s.parse() { - Ok(ip) => Ok(Self::IpAddress(ip)), - Err(_) => Err(InvalidDnsNameError), - }, - } - } -} - -/// The provided input could not be parsed because -/// it is not a syntactically-valid DNS Name. -#[derive(Debug)] -pub struct InvalidDnsNameError; - -impl fmt::Display for InvalidDnsNameError { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.write_str("invalid dns name") - } -} - -impl StdError for InvalidDnsNameError {} - -/// Container for unsafe APIs -#[cfg(feature = "dangerous_configuration")] -pub(super) mod danger { - use std::sync::Arc; - - use super::verify::ServerCertVerifier; - use super::ClientConfig; - - /// Accessor for dangerous configuration options. - #[derive(Debug)] - #[cfg_attr(docsrs, doc(cfg(feature = "dangerous_configuration")))] - pub struct DangerousClientConfig<'a> { - /// The underlying ClientConfig - pub cfg: &'a mut ClientConfig, - } - - impl<'a> DangerousClientConfig<'a> { - /// Overrides the default `ServerCertVerifier` with something else. - pub fn set_certificate_verifier(&mut self, verifier: Arc) { - self.cfg.verifier = verifier; - } - } -} - -#[derive(Debug, PartialEq)] -enum EarlyDataState { - Disabled, - Ready, - Accepted, - AcceptedFinished, - Rejected, -} - -pub(super) struct EarlyData { - state: EarlyDataState, - left: usize, -} - -impl EarlyData { - fn new() -> Self { - Self { - left: 0, - state: EarlyDataState::Disabled, - } - } - - pub(super) fn is_enabled(&self) -> bool { - matches!(self.state, EarlyDataState::Ready | EarlyDataState::Accepted) - } - - fn is_accepted(&self) -> bool { - matches!( - self.state, - EarlyDataState::Accepted | EarlyDataState::AcceptedFinished - ) - } - - pub(super) fn enable(&mut self, max_data: usize) { - assert_eq!(self.state, EarlyDataState::Disabled); - self.state = EarlyDataState::Ready; - self.left = max_data; - } - - pub(super) fn rejected(&mut self) { - trace!("EarlyData rejected"); - self.state = EarlyDataState::Rejected; - } - - pub(super) fn accepted(&mut self) { - trace!("EarlyData accepted"); - assert_eq!(self.state, EarlyDataState::Ready); - self.state = EarlyDataState::Accepted; - } - - pub(super) fn finished(&mut self) { - trace!("EarlyData finished"); - self.state = match self.state { - EarlyDataState::Accepted => EarlyDataState::AcceptedFinished, - _ => panic!("bad EarlyData state"), - } - } - - fn check_write(&mut self, sz: usize) -> io::Result { - match self.state { - EarlyDataState::Disabled => unreachable!(), - EarlyDataState::Ready | EarlyDataState::Accepted => { - let take = if self.left < sz { - mem::replace(&mut self.left, 0) - } else { - self.left -= sz; - sz - }; - - Ok(take) - } - EarlyDataState::Rejected | EarlyDataState::AcceptedFinished => { - Err(io::Error::from(io::ErrorKind::InvalidInput)) - } - } - } - - fn bytes_left(&self) -> usize { - self.left - } -} - -/// Stub that implements io::Write and dispatches to `write_early_data`. -pub struct WriteEarlyData<'a> { - sess: &'a mut ClientConnection, -} - -impl<'a> WriteEarlyData<'a> { - fn new(sess: &'a mut ClientConnection) -> WriteEarlyData<'a> { - WriteEarlyData { sess } - } - - /// How many bytes you may send. Writes will become short - /// once this reaches zero. - pub fn bytes_left(&self) -> usize { - self.sess - .inner - .data - .early_data - .bytes_left() - } -} - -impl<'a> io::Write for WriteEarlyData<'a> { - fn write(&mut self, buf: &[u8]) -> io::Result { - self.sess.write_early_data(buf) - } - - fn flush(&mut self) -> io::Result<()> { - Ok(()) - } -} - -/// This represents a single TLS client connection. -pub struct ClientConnection { - inner: ConnectionCommon, -} - -impl fmt::Debug for ClientConnection { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("ClientConnection") - .finish() - } -} - -impl ClientConnection { - /// Make a new ClientConnection. `config` controls how - /// we behave in the TLS protocol, `name` is the - /// name of the server we want to talk to. - pub fn new(config: Arc, name: ServerName) -> Result { - Self::new_inner(config, name, Vec::new(), Protocol::Tcp) - } - - fn new_inner( - config: Arc, - name: ServerName, - extra_exts: Vec, - proto: Protocol, - ) -> Result { - let mut common_state = CommonState::new(Side::Client); - common_state.set_max_fragment_size(config.max_fragment_size)?; - common_state.protocol = proto; - #[cfg(feature = "secret_extraction")] - { - common_state.enable_secret_extraction = config.enable_secret_extraction; - } - let mut data = ClientConnectionData::new(); - - let mut cx = hs::ClientContext { - common: &mut common_state, - data: &mut data, - }; - - let state = hs::start_handshake(name, extra_exts, config, &mut cx)?; - let inner = ConnectionCommon::new(state, data, common_state); - - Ok(Self { inner }) - } - - /// Returns an `io::Write` implementer you can write bytes to - /// to send TLS1.3 early data (a.k.a. "0-RTT data") to the server. - /// - /// This returns None in many circumstances when the capability to - /// send early data is not available, including but not limited to: - /// - /// - The server hasn't been talked to previously. - /// - The server does not support resumption. - /// - The server does not support early data. - /// - The resumption data for the server has expired. - /// - /// The server specifies a maximum amount of early data. You can - /// learn this limit through the returned object, and writes through - /// it will process only this many bytes. - /// - /// The server can choose not to accept any sent early data -- - /// in this case the data is lost but the connection continues. You - /// can tell this happened using `is_early_data_accepted`. - pub fn early_data(&mut self) -> Option { - if self.inner.data.early_data.is_enabled() { - Some(WriteEarlyData::new(self)) - } else { - None - } - } - - /// Returns True if the server signalled it will process early data. - /// - /// If you sent early data and this returns false at the end of the - /// handshake then the server will not process the data. This - /// is not an error, but you may wish to resend the data. - pub fn is_early_data_accepted(&self) -> bool { - self.inner.data.early_data.is_accepted() - } - - fn write_early_data(&mut self, data: &[u8]) -> io::Result { - self.inner - .data - .early_data - .check_write(data.len()) - .map(|sz| { - self.inner - .common_state - .send_early_plaintext(&data[..sz]) - }) - } - - /// Extract secrets, so they can be used when configuring kTLS, for example. - #[cfg(feature = "secret_extraction")] - pub fn extract_secrets(self) -> Result { - self.inner.extract_secrets() - } -} - -impl Deref for ClientConnection { - type Target = ConnectionCommon; - - fn deref(&self) -> &Self::Target { - &self.inner - } -} - -impl DerefMut for ClientConnection { - fn deref_mut(&mut self) -> &mut Self::Target { - &mut self.inner - } -} - -#[doc(hidden)] -impl<'a> TryFrom<&'a mut crate::Connection> for &'a mut ClientConnection { - type Error = (); - - fn try_from(value: &'a mut crate::Connection) -> Result { - use crate::Connection::*; - match value { - Client(conn) => Ok(conn), - Server(_) => Err(()), - } - } -} - -impl From for crate::Connection { - fn from(conn: ClientConnection) -> Self { - Self::Client(conn) - } -} - -/// State associated with a client connection. -pub struct ClientConnectionData { - pub(super) early_data: EarlyData, - pub(super) resumption_ciphersuite: Option, -} - -impl ClientConnectionData { - fn new() -> Self { - Self { - early_data: EarlyData::new(), - resumption_ciphersuite: None, - } - } -} - -impl crate::conn::SideData for ClientConnectionData {} - -#[cfg(feature = "quic")] -impl quic::QuicExt for ClientConnection { - fn quic_transport_parameters(&self) -> Option<&[u8]> { - self.inner - .common_state - .quic - .params - .as_ref() - .map(|v| v.as_ref()) - } - - fn zero_rtt_keys(&self) -> Option { - Some(quic::DirectionalKeys::new( - self.inner - .data - .resumption_ciphersuite - .and_then(|suite| suite.tls13())?, - self.inner - .common_state - .quic - .early_secret - .as_ref()?, - )) - } - - fn read_hs(&mut self, plaintext: &[u8]) -> Result<(), Error> { - self.inner.read_quic_hs(plaintext) - } - - fn write_hs(&mut self, buf: &mut Vec) -> Option { - quic::write_hs(&mut self.inner.common_state, buf) - } - - fn alert(&self) -> Option { - self.inner.common_state.quic.alert - } -} - -/// Methods specific to QUIC client sessions -#[cfg(feature = "quic")] -#[cfg_attr(docsrs, doc(cfg(feature = "quic")))] -pub trait ClientQuicExt { - /// Make a new QUIC ClientConnection. This differs from `ClientConnection::new()` - /// in that it takes an extra argument, `params`, which contains the - /// TLS-encoded transport parameters to send. - fn new_quic( - config: Arc, - quic_version: quic::Version, - name: ServerName, - params: Vec, - ) -> Result { - if !config.supports_version(ProtocolVersion::TLSv1_3) { - return Err(Error::General( - "TLS 1.3 support is required for QUIC".into(), - )); - } - - let ext = match quic_version { - quic::Version::V1Draft => ClientExtension::TransportParametersDraft(params), - quic::Version::V1 => ClientExtension::TransportParameters(params), - }; - - ClientConnection::new_inner(config, name, vec![ext], Protocol::Quic) - } -} - -#[cfg(feature = "quic")] -impl ClientQuicExt for ClientConnection {} diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/src/client/common.rs temporalio-1.3.0/vendor/rustls-0.20.9/src/client/common.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/src/client/common.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/src/client/common.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,114 +0,0 @@ -use super::ResolvesClientCert; -#[cfg(feature = "logging")] -use crate::log::{debug, trace}; -use crate::msgs::enums::ExtensionType; -use crate::msgs::handshake::CertificatePayload; -use crate::msgs::handshake::SCTList; -use crate::msgs::handshake::ServerExtension; -use crate::{sign, DistinguishedNames, SignatureScheme}; - -use std::sync::Arc; - -#[derive(Debug)] -pub(super) struct ServerCertDetails { - pub(super) cert_chain: CertificatePayload, - pub(super) ocsp_response: Vec, - pub(super) scts: Option, -} - -impl ServerCertDetails { - pub(super) fn new( - cert_chain: CertificatePayload, - ocsp_response: Vec, - scts: Option, - ) -> Self { - Self { - cert_chain, - ocsp_response, - scts, - } - } - - pub(super) fn scts(&self) -> impl Iterator { - self.scts - .as_deref() - .unwrap_or(&[]) - .iter() - .map(|payload| payload.0.as_slice()) - } -} - -pub(super) struct ClientHelloDetails { - pub(super) sent_extensions: Vec, -} - -impl ClientHelloDetails { - pub(super) fn new() -> Self { - Self { - sent_extensions: Vec::new(), - } - } - - pub(super) fn server_may_send_sct_list(&self) -> bool { - self.sent_extensions - .contains(&ExtensionType::SCT) - } - - pub(super) fn server_sent_unsolicited_extensions( - &self, - received_exts: &[ServerExtension], - allowed_unsolicited: &[ExtensionType], - ) -> bool { - for ext in received_exts { - let ext_type = ext.get_type(); - if !self.sent_extensions.contains(&ext_type) && !allowed_unsolicited.contains(&ext_type) - { - trace!("Unsolicited extension {:?}", ext_type); - return true; - } - } - - false - } -} - -pub(super) enum ClientAuthDetails { - /// Send an empty `Certificate` and no `CertificateVerify`. - Empty { auth_context_tls13: Option> }, - /// Send a non-empty `Certificate` and a `CertificateVerify`. - Verify { - certkey: Arc, - signer: Box, - auth_context_tls13: Option>, - }, -} - -impl ClientAuthDetails { - pub(super) fn resolve( - resolver: &dyn ResolvesClientCert, - canames: Option<&DistinguishedNames>, - sigschemes: &[SignatureScheme], - auth_context_tls13: Option>, - ) -> Self { - let acceptable_issuers = canames - .map(Vec::as_slice) - .unwrap_or_default() - .iter() - .map(|p| p.0.as_slice()) - .collect::>(); - - if let Some(certkey) = resolver.resolve(&acceptable_issuers, sigschemes) { - if let Some(signer) = certkey.key.choose_scheme(sigschemes) { - debug!("Attempting client auth"); - return Self::Verify { - certkey, - signer, - auth_context_tls13, - }; - } - } - - debug!("Client auth requested but no cert/sigscheme available"); - Self::Empty { auth_context_tls13 } - } -} diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/src/client/handy.rs temporalio-1.3.0/vendor/rustls-0.20.9/src/client/handy.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/src/client/handy.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/src/client/handy.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,161 +0,0 @@ -use crate::client; -use crate::enums::SignatureScheme; -use crate::error::Error; -use crate::key; -use crate::limited_cache; -use crate::sign; - -use std::sync::{Arc, Mutex}; - -/// An implementer of `StoresClientSessions` which does nothing. -pub struct NoClientSessionStorage {} - -impl client::StoresClientSessions for NoClientSessionStorage { - fn put(&self, _key: Vec, _value: Vec) -> bool { - false - } - - fn get(&self, _key: &[u8]) -> Option> { - None - } -} - -/// An implementer of `StoresClientSessions` that stores everything -/// in memory. It enforces a limit on the number of entries -/// to bound memory usage. -pub struct ClientSessionMemoryCache { - cache: Mutex, Vec>>, -} - -impl ClientSessionMemoryCache { - /// Make a new ClientSessionMemoryCache. `size` is the - /// maximum number of stored sessions. - pub fn new(size: usize) -> Arc { - debug_assert!(size > 0); - Arc::new(Self { - cache: Mutex::new(limited_cache::LimitedCache::new(size)), - }) - } -} - -impl client::StoresClientSessions for ClientSessionMemoryCache { - fn put(&self, key: Vec, value: Vec) -> bool { - self.cache - .lock() - .unwrap() - .insert(key, value); - true - } - - fn get(&self, key: &[u8]) -> Option> { - self.cache - .lock() - .unwrap() - .get(key) - .cloned() - } -} - -pub(super) struct FailResolveClientCert {} - -impl client::ResolvesClientCert for FailResolveClientCert { - fn resolve( - &self, - _acceptable_issuers: &[&[u8]], - _sigschemes: &[SignatureScheme], - ) -> Option> { - None - } - - fn has_certs(&self) -> bool { - false - } -} - -pub(super) struct AlwaysResolvesClientCert(Arc); - -impl AlwaysResolvesClientCert { - pub(super) fn new( - chain: Vec, - priv_key: &key::PrivateKey, - ) -> Result { - let key = sign::any_supported_type(priv_key) - .map_err(|_| Error::General("invalid private key".into()))?; - Ok(Self(Arc::new(sign::CertifiedKey::new(chain, key)))) - } -} - -impl client::ResolvesClientCert for AlwaysResolvesClientCert { - fn resolve( - &self, - _acceptable_issuers: &[&[u8]], - _sigschemes: &[SignatureScheme], - ) -> Option> { - Some(Arc::clone(&self.0)) - } - - fn has_certs(&self) -> bool { - true - } -} - -#[cfg(test)] -mod test { - use super::*; - use crate::client::StoresClientSessions; - - #[test] - fn test_noclientsessionstorage_drops_put() { - let c = NoClientSessionStorage {}; - assert!(!c.put(vec![0x01], vec![0x02])); - } - - #[test] - fn test_noclientsessionstorage_denies_gets() { - let c = NoClientSessionStorage {}; - c.put(vec![0x01], vec![0x02]); - assert_eq!(c.get(&[]), None); - assert_eq!(c.get(&[0x01]), None); - assert_eq!(c.get(&[0x02]), None); - } - - #[test] - fn test_clientsessionmemorycache_accepts_put() { - let c = ClientSessionMemoryCache::new(4); - assert!(c.put(vec![0x01], vec![0x02])); - } - - #[test] - fn test_clientsessionmemorycache_persists_put() { - let c = ClientSessionMemoryCache::new(4); - assert!(c.put(vec![0x01], vec![0x02])); - assert_eq!(c.get(&[0x01]), Some(vec![0x02])); - assert_eq!(c.get(&[0x01]), Some(vec![0x02])); - } - - #[test] - fn test_clientsessionmemorycache_overwrites_put() { - let c = ClientSessionMemoryCache::new(4); - assert!(c.put(vec![0x01], vec![0x02])); - assert!(c.put(vec![0x01], vec![0x04])); - assert_eq!(c.get(&[0x01]), Some(vec![0x04])); - } - - #[test] - fn test_clientsessionmemorycache_drops_to_maintain_size_invariant() { - let c = ClientSessionMemoryCache::new(2); - assert!(c.put(vec![0x01], vec![0x02])); - assert!(c.put(vec![0x03], vec![0x04])); - assert!(c.put(vec![0x05], vec![0x06])); - assert!(c.put(vec![0x07], vec![0x08])); - assert!(c.put(vec![0x09], vec![0x0a])); - - let count = c.get(&[0x01]).iter().count() - + c.get(&[0x03]).iter().count() - + c.get(&[0x05]).iter().count() - + c.get(&[0x07]).iter().count() - + c.get(&[0x09]).iter().count(); - - assert!(count < 5); - } -} diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/src/client/hs.rs temporalio-1.3.0/vendor/rustls-0.20.9/src/client/hs.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/src/client/hs.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/src/client/hs.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,856 +0,0 @@ -#[cfg(feature = "logging")] -use crate::bs_debug; -use crate::check::inappropriate_handshake_message; -use crate::conn::{CommonState, ConnectionRandoms, State}; -use crate::enums::{CipherSuite, ProtocolVersion}; -use crate::error::Error; -use crate::hash_hs::HandshakeHashBuffer; -use crate::kx; -#[cfg(feature = "logging")] -use crate::log::{debug, trace}; -use crate::msgs::base::Payload; -#[cfg(feature = "quic")] -use crate::msgs::base::PayloadU16; -use crate::msgs::codec::{Codec, Reader}; -use crate::msgs::enums::{AlertDescription, Compression, ContentType}; -use crate::msgs::enums::{ECPointFormat, PSKKeyExchangeMode}; -use crate::msgs::enums::{ExtensionType, HandshakeType}; -use crate::msgs::handshake::{CertificateStatusRequest, ClientSessionTicket, SCTList}; -use crate::msgs::handshake::{ClientExtension, HasServerExtensions}; -use crate::msgs::handshake::{ClientHelloPayload, HandshakeMessagePayload, HandshakePayload}; -use crate::msgs::handshake::{ConvertProtocolNameList, ProtocolNameList}; -use crate::msgs::handshake::{ECPointFormatList, SupportedPointFormats}; -use crate::msgs::handshake::{HelloRetryRequest, KeyShareEntry}; -use crate::msgs::handshake::{Random, SessionID}; -use crate::msgs::message::{Message, MessagePayload}; -use crate::msgs::persist; -use crate::ticketer::TimeBase; -use crate::tls13::key_schedule::KeyScheduleEarly; -use crate::SupportedCipherSuite; - -#[cfg(feature = "tls12")] -use super::tls12; -use crate::client::client_conn::ClientConnectionData; -use crate::client::common::ClientHelloDetails; -use crate::client::{tls13, ClientConfig, ServerName}; - -use std::sync::Arc; - -pub(super) type NextState = Box>; -pub(super) type NextStateOrError = Result; -pub(super) type ClientContext<'a> = crate::conn::Context<'a, ClientConnectionData>; - -fn find_session( - server_name: &ServerName, - config: &ClientConfig, - #[cfg(feature = "quic")] cx: &mut ClientContext<'_>, -) -> Option> { - let key = persist::ClientSessionKey::session_for_server_name(server_name); - let key_buf = key.get_encoding(); - - let value = config - .session_storage - .get(&key_buf) - .or_else(|| { - debug!("No cached session for {:?}", server_name); - None - })?; - - #[allow(unused_mut)] - let mut reader = Reader::init(&value[2..]); - #[allow(clippy::bind_instead_of_map)] // https://github.com/rust-lang/rust-clippy/issues/8082 - CipherSuite::read_bytes(&value[..2]) - .and_then(|suite| { - persist::ClientSessionValue::read(&mut reader, suite, &config.cipher_suites) - }) - .and_then(|resuming| { - let retrieved = persist::Retrieved::new(resuming, TimeBase::now().ok()?); - match retrieved.has_expired() { - false => Some(retrieved), - true => None, - } - }) - .and_then(|resuming| { - #[cfg(feature = "quic")] - if cx.common.is_quic() { - let params = PayloadU16::read(&mut reader)?; - cx.common.quic.params = Some(params.0); - } - Some(resuming) - }) -} - -pub(super) fn start_handshake( - server_name: ServerName, - extra_exts: Vec, - config: Arc, - cx: &mut ClientContext<'_>, -) -> NextStateOrError { - let mut transcript_buffer = HandshakeHashBuffer::new(); - if config - .client_auth_cert_resolver - .has_certs() - { - transcript_buffer.set_client_auth_enabled(); - } - - let support_tls13 = config.supports_version(ProtocolVersion::TLSv1_3); - - let mut session_id: Option = None; - let mut resuming_session = find_session( - &server_name, - &config, - #[cfg(feature = "quic")] - cx, - ); - - let key_share = if support_tls13 { - Some(tls13::initial_key_share(&config, &server_name)?) - } else { - None - }; - - if let Some(_resuming) = &mut resuming_session { - #[cfg(feature = "tls12")] - if let persist::ClientSessionValue::Tls12(inner) = &mut _resuming.value { - // If we have a ticket, we use the sessionid as a signal that - // we're doing an abbreviated handshake. See section 3.4 in - // RFC5077. - if !inner.ticket().is_empty() { - inner.session_id = SessionID::random()?; - } - session_id = Some(inner.session_id); - } - - debug!("Resuming session"); - } else { - debug!("Not resuming any session"); - } - - // https://tools.ietf.org/html/rfc8446#appendix-D.4 - // https://tools.ietf.org/html/draft-ietf-quic-tls-34#section-8.4 - if session_id.is_none() && !cx.common.is_quic() { - session_id = Some(SessionID::random()?); - } - - let random = Random::new()?; - let hello_details = ClientHelloDetails::new(); - let sent_tls13_fake_ccs = false; - let may_send_sct_list = config.verifier.request_scts(); - Ok(emit_client_hello_for_retry( - config, - cx, - resuming_session, - random, - false, - transcript_buffer, - sent_tls13_fake_ccs, - hello_details, - session_id, - None, - server_name, - key_share, - extra_exts, - may_send_sct_list, - None, - )) -} - -struct ExpectServerHello { - config: Arc, - resuming_session: Option>, - server_name: ServerName, - random: Random, - using_ems: bool, - transcript_buffer: HandshakeHashBuffer, - early_key_schedule: Option, - hello: ClientHelloDetails, - offered_key_share: Option, - session_id: SessionID, - sent_tls13_fake_ccs: bool, - suite: Option, -} - -struct ExpectServerHelloOrHelloRetryRequest { - next: ExpectServerHello, - extra_exts: Vec, -} - -fn emit_client_hello_for_retry( - config: Arc, - cx: &mut ClientContext<'_>, - resuming_session: Option>, - random: Random, - using_ems: bool, - mut transcript_buffer: HandshakeHashBuffer, - mut sent_tls13_fake_ccs: bool, - mut hello: ClientHelloDetails, - session_id: Option, - retryreq: Option<&HelloRetryRequest>, - server_name: ServerName, - key_share: Option, - extra_exts: Vec, - may_send_sct_list: bool, - suite: Option, -) -> NextState { - // Do we have a SessionID or ticket cached for this host? - let (ticket, resume_version) = if let Some(resuming) = &resuming_session { - match &resuming.value { - persist::ClientSessionValue::Tls13(inner) => { - (inner.ticket().to_vec(), ProtocolVersion::TLSv1_3) - } - #[cfg(feature = "tls12")] - persist::ClientSessionValue::Tls12(inner) => { - (inner.ticket().to_vec(), ProtocolVersion::TLSv1_2) - } - } - } else { - (Vec::new(), ProtocolVersion::Unknown(0)) - }; - - let support_tls12 = config.supports_version(ProtocolVersion::TLSv1_2) && !cx.common.is_quic(); - let support_tls13 = config.supports_version(ProtocolVersion::TLSv1_3); - - let mut supported_versions = Vec::new(); - if support_tls13 { - supported_versions.push(ProtocolVersion::TLSv1_3); - } - - if support_tls12 { - supported_versions.push(ProtocolVersion::TLSv1_2); - } - - // should be unreachable thanks to config builder - assert!(!supported_versions.is_empty()); - - let mut exts = vec![ - ClientExtension::SupportedVersions(supported_versions), - ClientExtension::ECPointFormats(ECPointFormatList::supported()), - ClientExtension::NamedGroups( - config - .kx_groups - .iter() - .map(|skxg| skxg.name) - .collect(), - ), - ClientExtension::SignatureAlgorithms( - config - .verifier - .supported_verify_schemes(), - ), - ClientExtension::ExtendedMasterSecretRequest, - ClientExtension::CertificateStatusRequest(CertificateStatusRequest::build_ocsp()), - ]; - - if let (Some(sni_name), true) = (server_name.for_sni(), config.enable_sni) { - exts.push(ClientExtension::make_sni(sni_name)); - } - - if may_send_sct_list { - exts.push(ClientExtension::SignedCertificateTimestampRequest); - } - - if let Some(key_share) = &key_share { - debug_assert!(support_tls13); - let key_share = KeyShareEntry::new(key_share.group(), key_share.pubkey.as_ref()); - exts.push(ClientExtension::KeyShare(vec![key_share])); - } - - if let Some(cookie) = retryreq.and_then(HelloRetryRequest::get_cookie) { - exts.push(ClientExtension::Cookie(cookie.clone())); - } - - if support_tls13 && config.enable_tickets { - // We could support PSK_KE here too. Such connections don't - // have forward secrecy, and are similar to TLS1.2 resumption. - let psk_modes = vec![PSKKeyExchangeMode::PSK_DHE_KE]; - exts.push(ClientExtension::PresharedKeyModes(psk_modes)); - } - - if !config.alpn_protocols.is_empty() { - exts.push(ClientExtension::Protocols(ProtocolNameList::from_slices( - &config - .alpn_protocols - .iter() - .map(|proto| &proto[..]) - .collect::>(), - ))); - } - - // Extra extensions must be placed before the PSK extension - exts.extend(extra_exts.iter().cloned()); - - let fill_in_binder = if support_tls13 - && config.enable_tickets - && resume_version == ProtocolVersion::TLSv1_3 - && !ticket.is_empty() - { - resuming_session - .as_ref() - .and_then(|resuming| match (suite, resuming.tls13()) { - (Some(suite), Some(resuming)) => { - suite - .tls13()? - .can_resume_from(resuming.suite())?; - Some(resuming) - } - (None, Some(resuming)) => Some(resuming), - _ => None, - }) - .map(|resuming| { - tls13::prepare_resumption( - &config, - cx, - ticket, - &resuming, - &mut exts, - retryreq.is_some(), - ); - resuming - }) - } else if config.enable_tickets { - // If we have a ticket, include it. Otherwise, request one. - if ticket.is_empty() { - exts.push(ClientExtension::SessionTicket(ClientSessionTicket::Request)); - } else { - exts.push(ClientExtension::SessionTicket(ClientSessionTicket::Offer( - Payload::new(ticket), - ))); - } - None - } else { - None - }; - - // Note what extensions we sent. - hello.sent_extensions = exts - .iter() - .map(ClientExtension::get_type) - .collect(); - - let session_id = session_id.unwrap_or_else(SessionID::empty); - let mut cipher_suites: Vec<_> = config - .cipher_suites - .iter() - .map(|cs| cs.suite()) - .collect(); - // We don't do renegotiation at all, in fact. - cipher_suites.push(CipherSuite::TLS_EMPTY_RENEGOTIATION_INFO_SCSV); - - let mut chp = HandshakeMessagePayload { - typ: HandshakeType::ClientHello, - payload: HandshakePayload::ClientHello(ClientHelloPayload { - client_version: ProtocolVersion::TLSv1_2, - random, - session_id, - cipher_suites, - compression_methods: vec![Compression::Null], - extensions: exts, - }), - }; - - let early_key_schedule = if let Some(resuming) = fill_in_binder { - let schedule = tls13::fill_in_psk_binder(&resuming, &transcript_buffer, &mut chp); - Some((resuming.suite(), schedule)) - } else { - None - }; - - let ch = Message { - // "This value MUST be set to 0x0303 for all records generated - // by a TLS 1.3 implementation other than an initial ClientHello - // (i.e., one not generated after a HelloRetryRequest)" - version: if retryreq.is_some() { - ProtocolVersion::TLSv1_2 - } else { - ProtocolVersion::TLSv1_0 - }, - payload: MessagePayload::handshake(chp), - }; - - if retryreq.is_some() { - // send dummy CCS to fool middleboxes prior - // to second client hello - tls13::emit_fake_ccs(&mut sent_tls13_fake_ccs, cx.common); - } - - trace!("Sending ClientHello {:#?}", ch); - - transcript_buffer.add_message(&ch); - cx.common.send_msg(ch, false); - - // Calculate the hash of ClientHello and use it to derive EarlyTrafficSecret - let early_key_schedule = early_key_schedule.map(|(resuming_suite, schedule)| { - if !cx.data.early_data.is_enabled() { - return schedule; - } - - tls13::derive_early_traffic_secret( - &*config.key_log, - cx, - resuming_suite, - &schedule, - &mut sent_tls13_fake_ccs, - &transcript_buffer, - &random.0, - ); - schedule - }); - - let next = ExpectServerHello { - config, - resuming_session, - server_name, - random, - using_ems, - transcript_buffer, - early_key_schedule, - hello, - offered_key_share: key_share, - session_id, - sent_tls13_fake_ccs, - suite, - }; - - if support_tls13 && retryreq.is_none() { - Box::new(ExpectServerHelloOrHelloRetryRequest { next, extra_exts }) - } else { - Box::new(next) - } -} - -pub(super) fn process_alpn_protocol( - common: &mut CommonState, - config: &ClientConfig, - proto: Option<&[u8]>, -) -> Result<(), Error> { - common.alpn_protocol = proto.map(ToOwned::to_owned); - - if let Some(alpn_protocol) = &common.alpn_protocol { - if !config - .alpn_protocols - .contains(alpn_protocol) - { - return Err(common.illegal_param("server sent non-offered ALPN protocol")); - } - } - - #[cfg(feature = "quic")] - { - // RFC 9001 says: "While ALPN only specifies that servers use this alert, QUIC clients MUST - // use error 0x0178 to terminate a connection when ALPN negotiation fails." We judge that - // the user intended to use ALPN (rather than some out-of-band protocol negotiation - // mechanism) iff any ALPN protocols were configured. This defends against badly-behaved - // servers which accept a connection that requires an application-layer protocol they do not - // understand. - if common.is_quic() && common.alpn_protocol.is_none() && !config.alpn_protocols.is_empty() { - common.send_fatal_alert(AlertDescription::NoApplicationProtocol); - return Err(Error::NoApplicationProtocol); - } - } - - debug!( - "ALPN protocol is {:?}", - common - .alpn_protocol - .as_ref() - .map(|v| bs_debug::BsDebug(v)) - ); - Ok(()) -} - -pub(super) fn sct_list_is_invalid(scts: &SCTList) -> bool { - scts.is_empty() || scts.iter().any(|sct| sct.0.is_empty()) -} - -impl State for ExpectServerHello { - fn handle(mut self: Box, cx: &mut ClientContext<'_>, m: Message) -> NextStateOrError { - let server_hello = - require_handshake_msg!(m, HandshakeType::ServerHello, HandshakePayload::ServerHello)?; - trace!("We got ServerHello {:#?}", server_hello); - - use crate::ProtocolVersion::{TLSv1_2, TLSv1_3}; - let tls13_supported = self.config.supports_version(TLSv1_3); - - let server_version = if server_hello.legacy_version == TLSv1_2 { - server_hello - .get_supported_versions() - .unwrap_or(server_hello.legacy_version) - } else { - server_hello.legacy_version - }; - - let version = match server_version { - TLSv1_3 if tls13_supported => TLSv1_3, - TLSv1_2 if self.config.supports_version(TLSv1_2) => { - if cx.data.early_data.is_enabled() && cx.common.early_traffic { - // The client must fail with a dedicated error code if the server - // responds with TLS 1.2 when offering 0-RTT. - return Err(Error::PeerMisbehavedError( - "server chose v1.2 when offering 0-rtt".to_string(), - )); - } - - if server_hello - .get_supported_versions() - .is_some() - { - return Err(cx - .common - .illegal_param("server chose v1.2 using v1.3 extension")); - } - - TLSv1_2 - } - _ => { - cx.common - .send_fatal_alert(AlertDescription::ProtocolVersion); - let msg = match server_version { - TLSv1_2 | TLSv1_3 => "server's TLS version is disabled in client", - _ => "server does not support TLS v1.2/v1.3", - }; - return Err(Error::PeerIncompatibleError(msg.to_string())); - } - }; - - if server_hello.compression_method != Compression::Null { - return Err(cx - .common - .illegal_param("server chose non-Null compression")); - } - - if server_hello.has_duplicate_extension() { - cx.common - .send_fatal_alert(AlertDescription::DecodeError); - return Err(Error::PeerMisbehavedError( - "server sent duplicate extensions".to_string(), - )); - } - - let allowed_unsolicited = [ExtensionType::RenegotiationInfo]; - if self - .hello - .server_sent_unsolicited_extensions(&server_hello.extensions, &allowed_unsolicited) - { - cx.common - .send_fatal_alert(AlertDescription::UnsupportedExtension); - return Err(Error::PeerMisbehavedError( - "server sent unsolicited extension".to_string(), - )); - } - - cx.common.negotiated_version = Some(version); - - // Extract ALPN protocol - if !cx.common.is_tls13() { - process_alpn_protocol(cx.common, &self.config, server_hello.get_alpn_protocol())?; - } - - // If ECPointFormats extension is supplied by the server, it must contain - // Uncompressed. But it's allowed to be omitted. - if let Some(point_fmts) = server_hello.get_ecpoints_extension() { - if !point_fmts.contains(&ECPointFormat::Uncompressed) { - cx.common - .send_fatal_alert(AlertDescription::HandshakeFailure); - return Err(Error::PeerMisbehavedError( - "server does not support uncompressed points".to_string(), - )); - } - } - - let suite = self - .config - .find_cipher_suite(server_hello.cipher_suite) - .ok_or_else(|| { - cx.common - .send_fatal_alert(AlertDescription::HandshakeFailure); - Error::PeerMisbehavedError("server chose non-offered ciphersuite".to_string()) - })?; - - if version != suite.version().version { - return Err(cx - .common - .illegal_param("server chose unusable ciphersuite for version")); - } - - match self.suite { - Some(prev_suite) if prev_suite != suite => { - return Err(cx - .common - .illegal_param("server varied selected ciphersuite")); - } - _ => { - debug!("Using ciphersuite {:?}", suite); - self.suite = Some(suite); - cx.common.suite = Some(suite); - } - } - - // Start our handshake hash, and input the server-hello. - let mut transcript = self - .transcript_buffer - .start_hash(suite.hash_algorithm()); - transcript.add_message(&m); - - let randoms = ConnectionRandoms::new(self.random, server_hello.random); - // For TLS1.3, start message encryption using - // handshake_traffic_secret. - match suite { - SupportedCipherSuite::Tls13(suite) => { - let resuming_session = self - .resuming_session - .and_then(|resuming| match resuming.value { - persist::ClientSessionValue::Tls13(inner) => Some(inner), - #[cfg(feature = "tls12")] - persist::ClientSessionValue::Tls12(_) => None, - }); - - tls13::handle_server_hello( - self.config, - cx, - server_hello, - resuming_session, - self.server_name, - randoms, - suite, - transcript, - self.early_key_schedule, - self.hello, - // We always send a key share when TLS 1.3 is enabled. - self.offered_key_share.unwrap(), - self.sent_tls13_fake_ccs, - ) - } - #[cfg(feature = "tls12")] - SupportedCipherSuite::Tls12(suite) => { - let resuming_session = self - .resuming_session - .and_then(|resuming| match resuming.value { - persist::ClientSessionValue::Tls12(inner) => Some(inner), - persist::ClientSessionValue::Tls13(_) => None, - }); - - tls12::CompleteServerHelloHandling { - config: self.config, - resuming_session, - server_name: self.server_name, - randoms, - using_ems: self.using_ems, - transcript, - } - .handle_server_hello(cx, suite, server_hello, tls13_supported) - } - } - } -} - -impl ExpectServerHelloOrHelloRetryRequest { - fn into_expect_server_hello(self) -> NextState { - Box::new(self.next) - } - - fn handle_hello_retry_request( - self, - cx: &mut ClientContext<'_>, - m: Message, - ) -> NextStateOrError { - let hrr = require_handshake_msg!( - m, - HandshakeType::HelloRetryRequest, - HandshakePayload::HelloRetryRequest - )?; - trace!("Got HRR {:?}", hrr); - - cx.common.check_aligned_handshake()?; - - let cookie = hrr.get_cookie(); - let req_group = hrr.get_requested_key_share_group(); - - // We always send a key share when TLS 1.3 is enabled. - let offered_key_share = self.next.offered_key_share.unwrap(); - - // A retry request is illegal if it contains no cookie and asks for - // retry of a group we already sent. - if cookie.is_none() && req_group == Some(offered_key_share.group()) { - return Err(cx - .common - .illegal_param("server requested hrr with our group")); - } - - // Or has an empty cookie. - if let Some(cookie) = cookie { - if cookie.0.is_empty() { - return Err(cx - .common - .illegal_param("server requested hrr with empty cookie")); - } - } - - // Or has something unrecognised - if hrr.has_unknown_extension() { - cx.common - .send_fatal_alert(AlertDescription::UnsupportedExtension); - return Err(Error::PeerIncompatibleError( - "server sent hrr with unhandled extension".to_string(), - )); - } - - // Or has the same extensions more than once - if hrr.has_duplicate_extension() { - return Err(cx - .common - .illegal_param("server send duplicate hrr extensions")); - } - - // Or asks us to change nothing. - if cookie.is_none() && req_group.is_none() { - return Err(cx - .common - .illegal_param("server requested hrr with no changes")); - } - - // Or does not echo the session_id from our ClientHello: - // - // > the HelloRetryRequest has the same format as a ServerHello message, - // > and the legacy_version, legacy_session_id_echo, cipher_suite, and - // > legacy_compression_method fields have the same meaning - // - // - // and - // - // > A client which receives a legacy_session_id_echo field that does not - // > match what it sent in the ClientHello MUST abort the handshake with an - // > "illegal_parameter" alert. - // - if hrr.session_id != self.next.session_id { - cx.common - .send_fatal_alert(AlertDescription::IllegalParameter); - return Err(Error::PeerMisbehavedError( - "server did not echo the session_id from client hello".to_string(), - )); - } - - // Or asks us to talk a protocol we didn't offer, or doesn't support HRR at all. - match hrr.get_supported_versions() { - Some(ProtocolVersion::TLSv1_3) => { - cx.common.negotiated_version = Some(ProtocolVersion::TLSv1_3); - } - _ => { - return Err(cx - .common - .illegal_param("server requested unsupported version in hrr")); - } - } - - // Or asks us to use a ciphersuite we didn't offer. - let maybe_cs = self - .next - .config - .find_cipher_suite(hrr.cipher_suite); - let cs = match maybe_cs { - Some(cs) => cs, - None => { - return Err(cx - .common - .illegal_param("server requested unsupported cs in hrr")); - } - }; - - // HRR selects the ciphersuite. - cx.common.suite = Some(cs); - - // This is the draft19 change where the transcript became a tree - let transcript = self - .next - .transcript_buffer - .start_hash(cs.hash_algorithm()); - let mut transcript_buffer = transcript.into_hrr_buffer(); - transcript_buffer.add_message(&m); - - // Early data is not allowed after HelloRetryrequest - if cx.data.early_data.is_enabled() { - cx.data.early_data.rejected(); - } - - let may_send_sct_list = self - .next - .hello - .server_may_send_sct_list(); - - let key_share = match req_group { - Some(group) if group != offered_key_share.group() => { - let group = kx::KeyExchange::choose(group, &self.next.config.kx_groups) - .ok_or_else(|| { - cx.common - .illegal_param("server requested hrr with bad group") - })?; - kx::KeyExchange::start(group).ok_or(Error::FailedToGetRandomBytes)? - } - _ => offered_key_share, - }; - - Ok(emit_client_hello_for_retry( - self.next.config, - cx, - self.next.resuming_session, - self.next.random, - self.next.using_ems, - transcript_buffer, - self.next.sent_tls13_fake_ccs, - self.next.hello, - Some(self.next.session_id), - Some(hrr), - self.next.server_name, - Some(key_share), - self.extra_exts, - may_send_sct_list, - Some(cs), - )) - } -} - -impl State for ExpectServerHelloOrHelloRetryRequest { - fn handle(self: Box, cx: &mut ClientContext<'_>, m: Message) -> NextStateOrError { - match m.payload { - MessagePayload::Handshake { - parsed: - HandshakeMessagePayload { - payload: HandshakePayload::ServerHello(..), - .. - }, - .. - } => self - .into_expect_server_hello() - .handle(cx, m), - MessagePayload::Handshake { - parsed: - HandshakeMessagePayload { - payload: HandshakePayload::HelloRetryRequest(..), - .. - }, - .. - } => self.handle_hello_retry_request(cx, m), - payload => Err(inappropriate_handshake_message( - &payload, - &[ContentType::Handshake], - &[HandshakeType::ServerHello, HandshakeType::HelloRetryRequest], - )), - } - } -} - -pub(super) fn send_cert_error_alert(common: &mut CommonState, err: Error) -> Error { - match err { - Error::InvalidCertificateEncoding => { - common.send_fatal_alert(AlertDescription::DecodeError); - } - Error::PeerMisbehavedError(_) => { - common.send_fatal_alert(AlertDescription::IllegalParameter); - } - _ => { - common.send_fatal_alert(AlertDescription::BadCertificate); - } - }; - - err -} diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/src/client/tls12.rs temporalio-1.3.0/vendor/rustls-0.20.9/src/client/tls12.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/src/client/tls12.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/src/client/tls12.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,1118 +0,0 @@ -use crate::check::{inappropriate_handshake_message, inappropriate_message}; -use crate::conn::{CommonState, ConnectionRandoms, Side, State}; -use crate::enums::ProtocolVersion; -use crate::error::Error; -use crate::hash_hs::HandshakeHash; -#[cfg(feature = "logging")] -use crate::log::{debug, trace}; -use crate::msgs::base::{Payload, PayloadU8}; -use crate::msgs::ccs::ChangeCipherSpecPayload; -use crate::msgs::codec::Codec; -use crate::msgs::enums::AlertDescription; -use crate::msgs::enums::{ContentType, HandshakeType}; -use crate::msgs::handshake::{ - CertificatePayload, DecomposedSignatureScheme, DigitallySignedStruct, HandshakeMessagePayload, - HandshakePayload, NewSessionTicketPayload, SCTList, ServerECDHParams, SessionID, -}; -use crate::msgs::message::{Message, MessagePayload}; -use crate::msgs::persist; -use crate::sign::Signer; -#[cfg(feature = "secret_extraction")] -use crate::suites::PartiallyExtractedSecrets; -use crate::suites::SupportedCipherSuite; -use crate::ticketer::TimeBase; -use crate::tls12::{self, ConnectionSecrets, Tls12CipherSuite}; -use crate::{kx, verify}; - -use super::client_conn::ClientConnectionData; -use super::hs::ClientContext; -use crate::client::common::ClientAuthDetails; -use crate::client::common::ServerCertDetails; -use crate::client::{hs, ClientConfig, ServerName}; - -use ring::agreement::PublicKey; -use ring::constant_time; - -use std::sync::Arc; - -pub(super) use server_hello::CompleteServerHelloHandling; - -mod server_hello { - use crate::msgs::enums::ExtensionType; - use crate::msgs::handshake::HasServerExtensions; - use crate::msgs::handshake::ServerHelloPayload; - - use super::*; - - pub(in crate::client) struct CompleteServerHelloHandling { - pub(in crate::client) config: Arc, - pub(in crate::client) resuming_session: Option, - pub(in crate::client) server_name: ServerName, - pub(in crate::client) randoms: ConnectionRandoms, - pub(in crate::client) using_ems: bool, - pub(in crate::client) transcript: HandshakeHash, - } - - impl CompleteServerHelloHandling { - pub(in crate::client) fn handle_server_hello( - mut self, - cx: &mut ClientContext, - suite: &'static Tls12CipherSuite, - server_hello: &ServerHelloPayload, - tls13_supported: bool, - ) -> hs::NextStateOrError { - server_hello - .random - .write_slice(&mut self.randoms.server); - - // Look for TLS1.3 downgrade signal in server random - // both the server random and TLS12_DOWNGRADE_SENTINEL are - // public values and don't require constant time comparison - let has_downgrade_marker = self.randoms.server[24..] == tls12::DOWNGRADE_SENTINEL; - if tls13_supported && has_downgrade_marker { - return Err(cx - .common - .illegal_param("downgrade to TLS1.2 when TLS1.3 is supported")); - } - - // Doing EMS? - self.using_ems = server_hello.ems_support_acked(); - - // Might the server send a ticket? - let must_issue_new_ticket = if server_hello - .find_extension(ExtensionType::SessionTicket) - .is_some() - { - debug!("Server supports tickets"); - true - } else { - false - }; - - // Might the server send a CertificateStatus between Certificate and - // ServerKeyExchange? - let may_send_cert_status = server_hello - .find_extension(ExtensionType::StatusRequest) - .is_some(); - if may_send_cert_status { - debug!("Server may staple OCSP response"); - } - - // Save any sent SCTs for verification against the certificate. - let server_cert_sct_list = if let Some(sct_list) = server_hello.get_sct_list() { - debug!("Server sent {:?} SCTs", sct_list.len()); - - if hs::sct_list_is_invalid(sct_list) { - let error_msg = "server sent invalid SCT list".to_string(); - return Err(Error::PeerMisbehavedError(error_msg)); - } - Some(sct_list.clone()) - } else { - None - }; - - // See if we're successfully resuming. - if let Some(ref resuming) = self.resuming_session { - if resuming.session_id == server_hello.session_id { - debug!("Server agreed to resume"); - - // Is the server telling lies about the ciphersuite? - if resuming.suite() != suite { - let error_msg = - "abbreviated handshake offered, but with varied cs".to_string(); - return Err(Error::PeerMisbehavedError(error_msg)); - } - - // And about EMS support? - if resuming.extended_ms() != self.using_ems { - let error_msg = "server varied ems support over resume".to_string(); - return Err(Error::PeerMisbehavedError(error_msg)); - } - - let secrets = - ConnectionSecrets::new_resume(self.randoms, suite, resuming.secret()); - self.config.key_log.log( - "CLIENT_RANDOM", - &secrets.randoms.client, - &secrets.master_secret, - ); - cx.common - .start_encryption_tls12(&secrets, Side::Client); - - // Since we're resuming, we verified the certificate and - // proof of possession in the prior session. - cx.common.peer_certificates = Some(resuming.server_cert_chain().to_vec()); - let cert_verified = verify::ServerCertVerified::assertion(); - let sig_verified = verify::HandshakeSignatureValid::assertion(); - - return if must_issue_new_ticket { - Ok(Box::new(ExpectNewTicket { - config: self.config, - secrets, - resuming_session: self.resuming_session, - session_id: server_hello.session_id, - server_name: self.server_name, - using_ems: self.using_ems, - transcript: self.transcript, - resuming: true, - cert_verified, - sig_verified, - })) - } else { - Ok(Box::new(ExpectCcs { - config: self.config, - secrets, - resuming_session: self.resuming_session, - session_id: server_hello.session_id, - server_name: self.server_name, - using_ems: self.using_ems, - transcript: self.transcript, - ticket: None, - resuming: true, - cert_verified, - sig_verified, - })) - }; - } - } - - Ok(Box::new(ExpectCertificate { - config: self.config, - resuming_session: self.resuming_session, - session_id: server_hello.session_id, - server_name: self.server_name, - randoms: self.randoms, - using_ems: self.using_ems, - transcript: self.transcript, - suite, - may_send_cert_status, - must_issue_new_ticket, - server_cert_sct_list, - })) - } - } -} - -struct ExpectCertificate { - config: Arc, - resuming_session: Option, - session_id: SessionID, - server_name: ServerName, - randoms: ConnectionRandoms, - using_ems: bool, - transcript: HandshakeHash, - pub(super) suite: &'static Tls12CipherSuite, - may_send_cert_status: bool, - must_issue_new_ticket: bool, - server_cert_sct_list: Option, -} - -impl State for ExpectCertificate { - fn handle( - mut self: Box, - _cx: &mut ClientContext<'_>, - m: Message, - ) -> hs::NextStateOrError { - self.transcript.add_message(&m); - let server_cert_chain = require_handshake_msg_move!( - m, - HandshakeType::Certificate, - HandshakePayload::Certificate - )?; - - if self.may_send_cert_status { - Ok(Box::new(ExpectCertificateStatusOrServerKx { - config: self.config, - resuming_session: self.resuming_session, - session_id: self.session_id, - server_name: self.server_name, - randoms: self.randoms, - using_ems: self.using_ems, - transcript: self.transcript, - suite: self.suite, - server_cert_sct_list: self.server_cert_sct_list, - server_cert_chain, - must_issue_new_ticket: self.must_issue_new_ticket, - })) - } else { - let server_cert = - ServerCertDetails::new(server_cert_chain, vec![], self.server_cert_sct_list); - - Ok(Box::new(ExpectServerKx { - config: self.config, - resuming_session: self.resuming_session, - session_id: self.session_id, - server_name: self.server_name, - randoms: self.randoms, - using_ems: self.using_ems, - transcript: self.transcript, - suite: self.suite, - server_cert, - must_issue_new_ticket: self.must_issue_new_ticket, - })) - } - } -} - -struct ExpectCertificateStatusOrServerKx { - config: Arc, - resuming_session: Option, - session_id: SessionID, - server_name: ServerName, - randoms: ConnectionRandoms, - using_ems: bool, - transcript: HandshakeHash, - suite: &'static Tls12CipherSuite, - server_cert_sct_list: Option, - server_cert_chain: CertificatePayload, - must_issue_new_ticket: bool, -} - -impl State for ExpectCertificateStatusOrServerKx { - fn handle(self: Box, cx: &mut ClientContext<'_>, m: Message) -> hs::NextStateOrError { - match m.payload { - MessagePayload::Handshake { - parsed: - HandshakeMessagePayload { - payload: HandshakePayload::ServerKeyExchange(..), - .. - }, - .. - } => Box::new(ExpectServerKx { - config: self.config, - resuming_session: self.resuming_session, - session_id: self.session_id, - server_name: self.server_name, - randoms: self.randoms, - using_ems: self.using_ems, - transcript: self.transcript, - suite: self.suite, - server_cert: ServerCertDetails::new( - self.server_cert_chain, - vec![], - self.server_cert_sct_list, - ), - must_issue_new_ticket: self.must_issue_new_ticket, - }) - .handle(cx, m), - MessagePayload::Handshake { - parsed: - HandshakeMessagePayload { - payload: HandshakePayload::CertificateStatus(..), - .. - }, - .. - } => Box::new(ExpectCertificateStatus { - config: self.config, - resuming_session: self.resuming_session, - session_id: self.session_id, - server_name: self.server_name, - randoms: self.randoms, - using_ems: self.using_ems, - transcript: self.transcript, - suite: self.suite, - server_cert_sct_list: self.server_cert_sct_list, - server_cert_chain: self.server_cert_chain, - must_issue_new_ticket: self.must_issue_new_ticket, - }) - .handle(cx, m), - payload => Err(inappropriate_handshake_message( - &payload, - &[ContentType::Handshake], - &[ - HandshakeType::ServerKeyExchange, - HandshakeType::CertificateStatus, - ], - )), - } - } -} - -struct ExpectCertificateStatus { - config: Arc, - resuming_session: Option, - session_id: SessionID, - server_name: ServerName, - randoms: ConnectionRandoms, - using_ems: bool, - transcript: HandshakeHash, - suite: &'static Tls12CipherSuite, - server_cert_sct_list: Option, - server_cert_chain: CertificatePayload, - must_issue_new_ticket: bool, -} - -impl State for ExpectCertificateStatus { - fn handle( - mut self: Box, - _cx: &mut ClientContext<'_>, - m: Message, - ) -> hs::NextStateOrError { - self.transcript.add_message(&m); - let server_cert_ocsp_response = require_handshake_msg_move!( - m, - HandshakeType::CertificateStatus, - HandshakePayload::CertificateStatus - )? - .into_inner(); - - trace!( - "Server stapled OCSP response is {:?}", - &server_cert_ocsp_response - ); - - let server_cert = ServerCertDetails::new( - self.server_cert_chain, - server_cert_ocsp_response, - self.server_cert_sct_list, - ); - - Ok(Box::new(ExpectServerKx { - config: self.config, - resuming_session: self.resuming_session, - session_id: self.session_id, - server_name: self.server_name, - randoms: self.randoms, - using_ems: self.using_ems, - transcript: self.transcript, - suite: self.suite, - server_cert, - must_issue_new_ticket: self.must_issue_new_ticket, - })) - } -} - -struct ExpectServerKx { - config: Arc, - resuming_session: Option, - session_id: SessionID, - server_name: ServerName, - randoms: ConnectionRandoms, - using_ems: bool, - transcript: HandshakeHash, - suite: &'static Tls12CipherSuite, - server_cert: ServerCertDetails, - must_issue_new_ticket: bool, -} - -impl State for ExpectServerKx { - fn handle(mut self: Box, cx: &mut ClientContext<'_>, m: Message) -> hs::NextStateOrError { - let opaque_kx = require_handshake_msg!( - m, - HandshakeType::ServerKeyExchange, - HandshakePayload::ServerKeyExchange - )?; - self.transcript.add_message(&m); - - let ecdhe = opaque_kx - .unwrap_given_kxa(&self.suite.kx) - .ok_or_else(|| { - cx.common - .send_fatal_alert(AlertDescription::DecodeError); - Error::CorruptMessagePayload(ContentType::Handshake) - })?; - - // Save the signature and signed parameters for later verification. - let mut kx_params = Vec::new(); - ecdhe.params.encode(&mut kx_params); - let server_kx = ServerKxDetails::new(kx_params, ecdhe.dss); - - #[cfg_attr(not(feature = "logging"), allow(unused_variables))] - { - debug!("ECDHE curve is {:?}", ecdhe.params.curve_params); - } - - Ok(Box::new(ExpectServerDoneOrCertReq { - config: self.config, - resuming_session: self.resuming_session, - session_id: self.session_id, - server_name: self.server_name, - randoms: self.randoms, - using_ems: self.using_ems, - transcript: self.transcript, - suite: self.suite, - server_cert: self.server_cert, - server_kx, - must_issue_new_ticket: self.must_issue_new_ticket, - })) - } -} - -fn emit_certificate( - transcript: &mut HandshakeHash, - cert_chain: CertificatePayload, - common: &mut CommonState, -) { - let cert = Message { - version: ProtocolVersion::TLSv1_2, - payload: MessagePayload::handshake(HandshakeMessagePayload { - typ: HandshakeType::Certificate, - payload: HandshakePayload::Certificate(cert_chain), - }), - }; - - transcript.add_message(&cert); - common.send_msg(cert, false); -} - -fn emit_clientkx(transcript: &mut HandshakeHash, common: &mut CommonState, pubkey: &PublicKey) { - let mut buf = Vec::new(); - let ecpoint = PayloadU8::new(Vec::from(pubkey.as_ref())); - ecpoint.encode(&mut buf); - let pubkey = Payload::new(buf); - - let ckx = Message { - version: ProtocolVersion::TLSv1_2, - payload: MessagePayload::handshake(HandshakeMessagePayload { - typ: HandshakeType::ClientKeyExchange, - payload: HandshakePayload::ClientKeyExchange(pubkey), - }), - }; - - transcript.add_message(&ckx); - common.send_msg(ckx, false); -} - -fn emit_certverify( - transcript: &mut HandshakeHash, - signer: &dyn Signer, - common: &mut CommonState, -) -> Result<(), Error> { - let message = transcript - .take_handshake_buf() - .ok_or_else(|| Error::General("Expected transcript".to_owned()))?; - - let scheme = signer.scheme(); - let sig = signer.sign(&message)?; - let body = DigitallySignedStruct::new(scheme, sig); - - let m = Message { - version: ProtocolVersion::TLSv1_2, - payload: MessagePayload::handshake(HandshakeMessagePayload { - typ: HandshakeType::CertificateVerify, - payload: HandshakePayload::CertificateVerify(body), - }), - }; - - transcript.add_message(&m); - common.send_msg(m, false); - Ok(()) -} - -fn emit_ccs(common: &mut CommonState) { - let ccs = Message { - version: ProtocolVersion::TLSv1_2, - payload: MessagePayload::ChangeCipherSpec(ChangeCipherSpecPayload {}), - }; - - common.send_msg(ccs, false); -} - -fn emit_finished( - secrets: &ConnectionSecrets, - transcript: &mut HandshakeHash, - common: &mut CommonState, -) { - let vh = transcript.get_current_hash(); - let verify_data = secrets.client_verify_data(&vh); - let verify_data_payload = Payload::new(verify_data); - - let f = Message { - version: ProtocolVersion::TLSv1_2, - payload: MessagePayload::handshake(HandshakeMessagePayload { - typ: HandshakeType::Finished, - payload: HandshakePayload::Finished(verify_data_payload), - }), - }; - - transcript.add_message(&f); - common.send_msg(f, true); -} - -struct ServerKxDetails { - kx_params: Vec, - kx_sig: DigitallySignedStruct, -} - -impl ServerKxDetails { - fn new(params: Vec, sig: DigitallySignedStruct) -> Self { - Self { - kx_params: params, - kx_sig: sig, - } - } -} - -// --- Either a CertificateRequest, or a ServerHelloDone. --- -// Existence of the CertificateRequest tells us the server is asking for -// client auth. Otherwise we go straight to ServerHelloDone. -struct ExpectServerDoneOrCertReq { - config: Arc, - resuming_session: Option, - session_id: SessionID, - server_name: ServerName, - randoms: ConnectionRandoms, - using_ems: bool, - transcript: HandshakeHash, - suite: &'static Tls12CipherSuite, - server_cert: ServerCertDetails, - server_kx: ServerKxDetails, - must_issue_new_ticket: bool, -} - -impl State for ExpectServerDoneOrCertReq { - fn handle(mut self: Box, cx: &mut ClientContext<'_>, m: Message) -> hs::NextStateOrError { - if matches!( - m.payload, - MessagePayload::Handshake { - parsed: HandshakeMessagePayload { - payload: HandshakePayload::CertificateRequest(_), - .. - }, - .. - } - ) { - Box::new(ExpectCertificateRequest { - config: self.config, - resuming_session: self.resuming_session, - session_id: self.session_id, - server_name: self.server_name, - randoms: self.randoms, - using_ems: self.using_ems, - transcript: self.transcript, - suite: self.suite, - server_cert: self.server_cert, - server_kx: self.server_kx, - must_issue_new_ticket: self.must_issue_new_ticket, - }) - .handle(cx, m) - } else { - self.transcript.abandon_client_auth(); - - Box::new(ExpectServerDone { - config: self.config, - resuming_session: self.resuming_session, - session_id: self.session_id, - server_name: self.server_name, - randoms: self.randoms, - using_ems: self.using_ems, - transcript: self.transcript, - suite: self.suite, - server_cert: self.server_cert, - server_kx: self.server_kx, - client_auth: None, - must_issue_new_ticket: self.must_issue_new_ticket, - }) - .handle(cx, m) - } - } -} - -struct ExpectCertificateRequest { - config: Arc, - resuming_session: Option, - session_id: SessionID, - server_name: ServerName, - randoms: ConnectionRandoms, - using_ems: bool, - transcript: HandshakeHash, - suite: &'static Tls12CipherSuite, - server_cert: ServerCertDetails, - server_kx: ServerKxDetails, - must_issue_new_ticket: bool, -} - -impl State for ExpectCertificateRequest { - fn handle( - mut self: Box, - _cx: &mut ClientContext<'_>, - m: Message, - ) -> hs::NextStateOrError { - let certreq = require_handshake_msg!( - m, - HandshakeType::CertificateRequest, - HandshakePayload::CertificateRequest - )?; - self.transcript.add_message(&m); - debug!("Got CertificateRequest {:?}", certreq); - - // The RFC jovially describes the design here as 'somewhat complicated' - // and 'somewhat underspecified'. So thanks for that. - // - // We ignore certreq.certtypes as a result, since the information it contains - // is entirely duplicated in certreq.sigschemes. - - const NO_CONTEXT: Option> = None; // TLS 1.2 doesn't use a context. - let client_auth = ClientAuthDetails::resolve( - self.config - .client_auth_cert_resolver - .as_ref(), - Some(&certreq.canames), - &certreq.sigschemes, - NO_CONTEXT, - ); - - Ok(Box::new(ExpectServerDone { - config: self.config, - resuming_session: self.resuming_session, - session_id: self.session_id, - server_name: self.server_name, - randoms: self.randoms, - using_ems: self.using_ems, - transcript: self.transcript, - suite: self.suite, - server_cert: self.server_cert, - server_kx: self.server_kx, - client_auth: Some(client_auth), - must_issue_new_ticket: self.must_issue_new_ticket, - })) - } -} - -struct ExpectServerDone { - config: Arc, - resuming_session: Option, - session_id: SessionID, - server_name: ServerName, - randoms: ConnectionRandoms, - using_ems: bool, - transcript: HandshakeHash, - suite: &'static Tls12CipherSuite, - server_cert: ServerCertDetails, - server_kx: ServerKxDetails, - client_auth: Option, - must_issue_new_ticket: bool, -} - -impl State for ExpectServerDone { - fn handle(self: Box, cx: &mut ClientContext<'_>, m: Message) -> hs::NextStateOrError { - match m.payload { - MessagePayload::Handshake { - parsed: - HandshakeMessagePayload { - payload: HandshakePayload::ServerHelloDone, - .. - }, - .. - } => {} - payload => { - return Err(inappropriate_handshake_message( - &payload, - &[ContentType::Handshake], - &[HandshakeType::ServerHelloDone], - )); - } - } - - let mut st = *self; - st.transcript.add_message(&m); - - cx.common.check_aligned_handshake()?; - - trace!("Server cert is {:?}", st.server_cert.cert_chain); - debug!("Server DNS name is {:?}", st.server_name); - - let suite = st.suite; - - // 1. Verify the cert chain. - // 2. Verify any SCTs provided with the certificate. - // 3. Verify that the top certificate signed their kx. - // 4. If doing client auth, send our Certificate. - // 5. Complete the key exchange: - // a) generate our kx pair - // b) emit a ClientKeyExchange containing it - // c) if doing client auth, emit a CertificateVerify - // d) emit a CCS - // e) derive the shared keys, and start encryption - // 6. emit a Finished, our first encrypted message under the new keys. - - // 1. - let (end_entity, intermediates) = st - .server_cert - .cert_chain - .split_first() - .ok_or(Error::NoCertificatesPresented)?; - let now = std::time::SystemTime::now(); - let cert_verified = st - .config - .verifier - .verify_server_cert( - end_entity, - intermediates, - &st.server_name, - &mut st.server_cert.scts(), - &st.server_cert.ocsp_response, - now, - ) - .map_err(|err| hs::send_cert_error_alert(cx.common, err))?; - - // 3. - // Build up the contents of the signed message. - // It's ClientHello.random || ServerHello.random || ServerKeyExchange.params - let sig_verified = { - let mut message = Vec::new(); - message.extend_from_slice(&st.randoms.client); - message.extend_from_slice(&st.randoms.server); - message.extend_from_slice(&st.server_kx.kx_params); - - // Check the signature is compatible with the ciphersuite. - let sig = &st.server_kx.kx_sig; - if !SupportedCipherSuite::from(suite).usable_for_signature_algorithm(sig.scheme.sign()) - { - let error_message = format!( - "peer signed kx with wrong algorithm (got {:?} expect {:?})", - sig.scheme.sign(), - suite.sign - ); - return Err(Error::PeerMisbehavedError(error_message)); - } - - st.config - .verifier - .verify_tls12_signature(&message, &st.server_cert.cert_chain[0], sig) - .map_err(|err| hs::send_cert_error_alert(cx.common, err))? - }; - cx.common.peer_certificates = Some(st.server_cert.cert_chain); - - // 4. - if let Some(client_auth) = &st.client_auth { - let certs = match client_auth { - ClientAuthDetails::Empty { .. } => Vec::new(), - ClientAuthDetails::Verify { certkey, .. } => certkey.cert.clone(), - }; - emit_certificate(&mut st.transcript, certs, cx.common); - } - - // 5a. - let ecdh_params = - tls12::decode_ecdh_params::(cx.common, &st.server_kx.kx_params)?; - let group = - kx::KeyExchange::choose(ecdh_params.curve_params.named_group, &st.config.kx_groups) - .ok_or_else(|| { - Error::PeerMisbehavedError("peer chose an unsupported group".to_string()) - })?; - let kx = kx::KeyExchange::start(group).ok_or(Error::FailedToGetRandomBytes)?; - - // 5b. - let mut transcript = st.transcript; - emit_clientkx(&mut transcript, cx.common, &kx.pubkey); - // nb. EMS handshake hash only runs up to ClientKeyExchange. - let ems_seed = st - .using_ems - .then(|| transcript.get_current_hash()); - - // 5c. - if let Some(ClientAuthDetails::Verify { signer, .. }) = &st.client_auth { - emit_certverify(&mut transcript, signer.as_ref(), cx.common)?; - } - - // 5d. - emit_ccs(cx.common); - - // 5e. Now commit secrets. - let secrets = ConnectionSecrets::from_key_exchange( - kx, - &ecdh_params.public.0, - ems_seed, - st.randoms, - suite, - )?; - - st.config.key_log.log( - "CLIENT_RANDOM", - &secrets.randoms.client, - &secrets.master_secret, - ); - cx.common - .start_encryption_tls12(&secrets, Side::Client); - cx.common - .record_layer - .start_encrypting(); - - // 6. - emit_finished(&secrets, &mut transcript, cx.common); - - if st.must_issue_new_ticket { - Ok(Box::new(ExpectNewTicket { - config: st.config, - secrets, - resuming_session: st.resuming_session, - session_id: st.session_id, - server_name: st.server_name, - using_ems: st.using_ems, - transcript, - resuming: false, - cert_verified, - sig_verified, - })) - } else { - Ok(Box::new(ExpectCcs { - config: st.config, - secrets, - resuming_session: st.resuming_session, - session_id: st.session_id, - server_name: st.server_name, - using_ems: st.using_ems, - transcript, - ticket: None, - resuming: false, - cert_verified, - sig_verified, - })) - } - } -} - -struct ExpectNewTicket { - config: Arc, - secrets: ConnectionSecrets, - resuming_session: Option, - session_id: SessionID, - server_name: ServerName, - using_ems: bool, - transcript: HandshakeHash, - resuming: bool, - cert_verified: verify::ServerCertVerified, - sig_verified: verify::HandshakeSignatureValid, -} - -impl State for ExpectNewTicket { - fn handle( - mut self: Box, - _cx: &mut ClientContext<'_>, - m: Message, - ) -> hs::NextStateOrError { - self.transcript.add_message(&m); - - let nst = require_handshake_msg_move!( - m, - HandshakeType::NewSessionTicket, - HandshakePayload::NewSessionTicket - )?; - - Ok(Box::new(ExpectCcs { - config: self.config, - secrets: self.secrets, - resuming_session: self.resuming_session, - session_id: self.session_id, - server_name: self.server_name, - using_ems: self.using_ems, - transcript: self.transcript, - ticket: Some(nst), - resuming: self.resuming, - cert_verified: self.cert_verified, - sig_verified: self.sig_verified, - })) - } -} - -// -- Waiting for their CCS -- -struct ExpectCcs { - config: Arc, - secrets: ConnectionSecrets, - resuming_session: Option, - session_id: SessionID, - server_name: ServerName, - using_ems: bool, - transcript: HandshakeHash, - ticket: Option, - resuming: bool, - cert_verified: verify::ServerCertVerified, - sig_verified: verify::HandshakeSignatureValid, -} - -impl State for ExpectCcs { - fn handle(self: Box, cx: &mut ClientContext<'_>, m: Message) -> hs::NextStateOrError { - match m.payload { - MessagePayload::ChangeCipherSpec(..) => {} - payload => { - return Err(inappropriate_message( - &payload, - &[ContentType::ChangeCipherSpec], - )); - } - } - // CCS should not be received interleaved with fragmented handshake-level - // message. - cx.common.check_aligned_handshake()?; - - // nb. msgs layer validates trivial contents of CCS - cx.common - .record_layer - .start_decrypting(); - - Ok(Box::new(ExpectFinished { - config: self.config, - secrets: self.secrets, - resuming_session: self.resuming_session, - session_id: self.session_id, - server_name: self.server_name, - using_ems: self.using_ems, - transcript: self.transcript, - ticket: self.ticket, - resuming: self.resuming, - cert_verified: self.cert_verified, - sig_verified: self.sig_verified, - })) - } -} - -struct ExpectFinished { - config: Arc, - resuming_session: Option, - session_id: SessionID, - server_name: ServerName, - using_ems: bool, - transcript: HandshakeHash, - ticket: Option, - secrets: ConnectionSecrets, - resuming: bool, - cert_verified: verify::ServerCertVerified, - sig_verified: verify::HandshakeSignatureValid, -} - -impl ExpectFinished { - // -- Waiting for their finished -- - fn save_session(&mut self, cx: &mut ClientContext<'_>) { - // Save a ticket. If we got a new ticket, save that. Otherwise, save the - // original ticket again. - let (mut ticket, lifetime) = match self.ticket.take() { - Some(nst) => (nst.ticket.0, nst.lifetime_hint), - None => (Vec::new(), 0), - }; - - if ticket.is_empty() { - if let Some(resuming_session) = &mut self.resuming_session { - ticket = resuming_session.take_ticket(); - } - } - - if self.session_id.is_empty() && ticket.is_empty() { - debug!("Session not saved: server didn't allocate id or ticket"); - return; - } - - let time_now = match TimeBase::now() { - Ok(time_now) => time_now, - #[allow(unused_variables)] - Err(e) => { - debug!("Session not saved: {}", e); - return; - } - }; - - let key = persist::ClientSessionKey::session_for_server_name(&self.server_name); - let value = persist::Tls12ClientSessionValue::new( - self.secrets.suite(), - self.session_id, - ticket, - self.secrets.get_master_secret(), - cx.common - .peer_certificates - .clone() - .unwrap_or_default(), - time_now, - lifetime, - self.using_ems, - ); - - let worked = self - .config - .session_storage - .put(key.get_encoding(), value.get_encoding()); - - if worked { - debug!("Session saved"); - } else { - debug!("Session not saved"); - } - } -} - -impl State for ExpectFinished { - fn handle(self: Box, cx: &mut ClientContext<'_>, m: Message) -> hs::NextStateOrError { - let mut st = *self; - let finished = - require_handshake_msg!(m, HandshakeType::Finished, HandshakePayload::Finished)?; - - cx.common.check_aligned_handshake()?; - - // Work out what verify_data we expect. - let vh = st.transcript.get_current_hash(); - let expect_verify_data = st.secrets.server_verify_data(&vh); - - // Constant-time verification of this is relatively unimportant: they only - // get one chance. But it can't hurt. - let _fin_verified = - constant_time::verify_slices_are_equal(&expect_verify_data, &finished.0) - .map_err(|_| { - cx.common - .send_fatal_alert(AlertDescription::DecryptError); - Error::DecryptError - }) - .map(|_| verify::FinishedMessageVerified::assertion())?; - - // Hash this message too. - st.transcript.add_message(&m); - - st.save_session(cx); - - if st.resuming { - emit_ccs(cx.common); - cx.common - .record_layer - .start_encrypting(); - emit_finished(&st.secrets, &mut st.transcript, cx.common); - } - - cx.common.start_traffic(); - Ok(Box::new(ExpectTraffic { - secrets: st.secrets, - _cert_verified: st.cert_verified, - _sig_verified: st.sig_verified, - _fin_verified, - })) - } -} - -// -- Traffic transit state -- -struct ExpectTraffic { - secrets: ConnectionSecrets, - _cert_verified: verify::ServerCertVerified, - _sig_verified: verify::HandshakeSignatureValid, - _fin_verified: verify::FinishedMessageVerified, -} - -impl State for ExpectTraffic { - fn handle(self: Box, cx: &mut ClientContext<'_>, m: Message) -> hs::NextStateOrError { - match m.payload { - MessagePayload::ApplicationData(payload) => cx - .common - .take_received_plaintext(payload), - payload => { - return Err(inappropriate_message( - &payload, - &[ContentType::ApplicationData], - )); - } - } - Ok(self) - } - - fn export_keying_material( - &self, - output: &mut [u8], - label: &[u8], - context: Option<&[u8]>, - ) -> Result<(), Error> { - self.secrets - .export_keying_material(output, label, context); - Ok(()) - } - - #[cfg(feature = "secret_extraction")] - fn extract_secrets(&self) -> Result { - self.secrets - .extract_secrets(Side::Client) - } -} diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/src/client/tls13.rs temporalio-1.3.0/vendor/rustls-0.20.9/src/client/tls13.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/src/client/tls13.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/src/client/tls13.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,1191 +0,0 @@ -use crate::check::inappropriate_handshake_message; -use crate::conn::{CommonState, ConnectionRandoms, State}; -use crate::enums::{ProtocolVersion, SignatureScheme}; -use crate::error::Error; -use crate::hash_hs::{HandshakeHash, HandshakeHashBuffer}; -use crate::kx; -#[cfg(feature = "logging")] -use crate::log::{debug, trace, warn}; -use crate::msgs::base::{Payload, PayloadU8}; -use crate::msgs::ccs::ChangeCipherSpecPayload; -use crate::msgs::codec::Codec; -use crate::msgs::enums::KeyUpdateRequest; -use crate::msgs::enums::{AlertDescription, NamedGroup}; -use crate::msgs::enums::{ContentType, ExtensionType, HandshakeType}; -use crate::msgs::handshake::ClientExtension; -use crate::msgs::handshake::DigitallySignedStruct; -use crate::msgs::handshake::EncryptedExtensions; -use crate::msgs::handshake::NewSessionTicketPayloadTLS13; -use crate::msgs::handshake::{CertificateEntry, CertificatePayloadTLS13}; -use crate::msgs::handshake::{HandshakeMessagePayload, HandshakePayload}; -use crate::msgs::handshake::{HasServerExtensions, ServerHelloPayload}; -use crate::msgs::handshake::{PresharedKeyIdentity, PresharedKeyOffer}; -use crate::msgs::message::{Message, MessagePayload}; -use crate::msgs::persist; -use crate::tls13::key_schedule::{ - KeyScheduleEarly, KeyScheduleHandshake, KeySchedulePreHandshake, KeyScheduleTraffic, -}; -use crate::tls13::Tls13CipherSuite; -use crate::verify; -#[cfg(feature = "quic")] -use crate::{conn::Protocol, msgs::base::PayloadU16, quic}; -#[cfg(feature = "secret_extraction")] -use crate::{conn::Side, suites::PartiallyExtractedSecrets}; -use crate::{sign, KeyLog}; - -use super::client_conn::ClientConnectionData; -use super::hs::ClientContext; -use crate::client::common::ServerCertDetails; -use crate::client::common::{ClientAuthDetails, ClientHelloDetails}; -use crate::client::{hs, ClientConfig, ServerName, StoresClientSessions}; - -use crate::ticketer::TimeBase; -use ring::constant_time; - -use crate::sign::{CertifiedKey, Signer}; -use std::sync::Arc; - -// Extensions we expect in plaintext in the ServerHello. -static ALLOWED_PLAINTEXT_EXTS: &[ExtensionType] = &[ - ExtensionType::KeyShare, - ExtensionType::PreSharedKey, - ExtensionType::SupportedVersions, -]; - -// Only the intersection of things we offer, and those disallowed -// in TLS1.3 -static DISALLOWED_TLS13_EXTS: &[ExtensionType] = &[ - ExtensionType::ECPointFormats, - ExtensionType::SessionTicket, - ExtensionType::RenegotiationInfo, - ExtensionType::ExtendedMasterSecret, -]; - -pub(super) fn handle_server_hello( - config: Arc, - cx: &mut ClientContext, - server_hello: &ServerHelloPayload, - mut resuming_session: Option, - server_name: ServerName, - randoms: ConnectionRandoms, - suite: &'static Tls13CipherSuite, - transcript: HandshakeHash, - early_key_schedule: Option, - hello: ClientHelloDetails, - our_key_share: kx::KeyExchange, - mut sent_tls13_fake_ccs: bool, -) -> hs::NextStateOrError { - validate_server_hello(cx.common, server_hello)?; - - let their_key_share = server_hello - .get_key_share() - .ok_or_else(|| { - cx.common - .send_fatal_alert(AlertDescription::MissingExtension); - Error::PeerMisbehavedError("missing key share".to_string()) - })?; - - if our_key_share.group() != their_key_share.group { - return Err(cx - .common - .illegal_param("wrong group for key share")); - } - - let key_schedule_pre_handshake = if let (Some(selected_psk), Some(early_key_schedule)) = - (server_hello.get_psk_index(), early_key_schedule) - { - if let Some(ref resuming) = resuming_session { - let resuming_suite = match suite.can_resume_from(resuming.suite()) { - Some(resuming) => resuming, - None => { - return Err(cx - .common - .illegal_param("server resuming incompatible suite")); - } - }; - - // If the server varies the suite here, we will have encrypted early data with - // the wrong suite. - if cx.data.early_data.is_enabled() && resuming_suite != suite { - return Err(cx - .common - .illegal_param("server varied suite with early data")); - } - - if selected_psk != 0 { - return Err(cx - .common - .illegal_param("server selected invalid psk")); - } - - debug!("Resuming using PSK"); - // The key schedule has been initialized and set in fill_in_psk_binder() - } else { - return Err(Error::PeerMisbehavedError( - "server selected unoffered psk".to_string(), - )); - } - KeySchedulePreHandshake::from(early_key_schedule) - } else { - debug!("Not resuming"); - // Discard the early data key schedule. - cx.data.early_data.rejected(); - cx.common.early_traffic = false; - resuming_session.take(); - KeySchedulePreHandshake::new(suite.hkdf_algorithm) - }; - - let key_schedule = our_key_share.complete(&their_key_share.payload.0, |secret| { - Ok(key_schedule_pre_handshake.into_handshake(secret)) - })?; - - // Remember what KX group the server liked for next time. - save_kx_hint(&config, &server_name, their_key_share.group); - - // If we change keying when a subsequent handshake message is being joined, - // the two halves will have different record layer protections. Disallow this. - cx.common.check_aligned_handshake()?; - - let hash_at_client_recvd_server_hello = transcript.get_current_hash(); - - let (key_schedule, client_key, server_key) = key_schedule.derive_handshake_secrets( - hash_at_client_recvd_server_hello, - &*config.key_log, - &randoms.client, - ); - - // Decrypt with the peer's key, encrypt with our own key - cx.common - .record_layer - .set_message_decrypter(suite.derive_decrypter(&server_key)); - - if !cx.data.early_data.is_enabled() { - // Set the client encryption key for handshakes if early data is not used - cx.common - .record_layer - .set_message_encrypter(suite.derive_encrypter(&client_key)); - } - - #[cfg(feature = "quic")] - if cx.common.is_quic() { - cx.common.quic.hs_secrets = Some(quic::Secrets::new(client_key, server_key, suite, true)); - } - - emit_fake_ccs(&mut sent_tls13_fake_ccs, cx.common); - - Ok(Box::new(ExpectEncryptedExtensions { - config, - resuming_session, - server_name, - randoms, - suite, - transcript, - key_schedule, - hello, - })) -} - -fn validate_server_hello( - common: &mut CommonState, - server_hello: &ServerHelloPayload, -) -> Result<(), Error> { - for ext in &server_hello.extensions { - if !ALLOWED_PLAINTEXT_EXTS.contains(&ext.get_type()) { - common.send_fatal_alert(AlertDescription::UnsupportedExtension); - return Err(Error::PeerMisbehavedError( - "server sent unexpected cleartext ext".to_string(), - )); - } - } - - Ok(()) -} - -pub(super) fn initial_key_share( - config: &ClientConfig, - server_name: &ServerName, -) -> Result { - let key = persist::ClientSessionKey::hint_for_server_name(server_name); - let key_buf = key.get_encoding(); - - let maybe_value = config.session_storage.get(&key_buf); - - let group = maybe_value - .and_then(|enc| NamedGroup::read_bytes(&enc)) - .and_then(|group| kx::KeyExchange::choose(group, &config.kx_groups)) - .unwrap_or_else(|| { - config - .kx_groups - .first() - .expect("No kx groups configured") - }); - - kx::KeyExchange::start(group).ok_or(Error::FailedToGetRandomBytes) -} - -fn save_kx_hint(config: &ClientConfig, server_name: &ServerName, group: NamedGroup) { - let key = persist::ClientSessionKey::hint_for_server_name(server_name); - - config - .session_storage - .put(key.get_encoding(), group.get_encoding()); -} - -/// This implements the horrifying TLS1.3 hack where PSK binders have a -/// data dependency on the message they are contained within. -pub(super) fn fill_in_psk_binder( - resuming: &persist::Tls13ClientSessionValue, - transcript: &HandshakeHashBuffer, - hmp: &mut HandshakeMessagePayload, -) -> KeyScheduleEarly { - // We need to know the hash function of the suite we're trying to resume into. - let hkdf_alg = resuming.suite().hkdf_algorithm; - let suite_hash = resuming.suite().hash_algorithm(); - - // The binder is calculated over the clienthello, but doesn't include itself or its - // length, or the length of its container. - let binder_plaintext = hmp.get_encoding_for_binder_signing(); - let handshake_hash = transcript.get_hash_given(suite_hash, &binder_plaintext); - - // Run a fake key_schedule to simulate what the server will do if it chooses - // to resume. - let key_schedule = KeyScheduleEarly::new(hkdf_alg, resuming.secret()); - let real_binder = key_schedule.resumption_psk_binder_key_and_sign_verify_data(&handshake_hash); - - if let HandshakePayload::ClientHello(ref mut ch) = hmp.payload { - ch.set_psk_binder(real_binder.as_ref()); - }; - - key_schedule -} - -pub(super) fn prepare_resumption( - config: &ClientConfig, - cx: &mut ClientContext<'_>, - ticket: Vec, - resuming_session: &persist::Retrieved<&persist::Tls13ClientSessionValue>, - exts: &mut Vec, - doing_retry: bool, -) { - let resuming_suite = resuming_session.suite(); - cx.common.suite = Some(resuming_suite.into()); - cx.data.resumption_ciphersuite = Some(resuming_suite.into()); - // The EarlyData extension MUST be supplied together with the - // PreSharedKey extension. - let max_early_data_size = resuming_session.max_early_data_size(); - if config.enable_early_data && max_early_data_size > 0 && !doing_retry { - cx.data - .early_data - .enable(max_early_data_size as usize); - exts.push(ClientExtension::EarlyData); - } - - // Finally, and only for TLS1.3 with a ticket resumption, include a binder - // for our ticket. This must go last. - // - // Include an empty binder. It gets filled in below because it depends on - // the message it's contained in (!!!). - let obfuscated_ticket_age = resuming_session.obfuscated_ticket_age(); - - let binder_len = resuming_suite - .hash_algorithm() - .output_len; - let binder = vec![0u8; binder_len]; - - let psk_identity = PresharedKeyIdentity::new(ticket, obfuscated_ticket_age); - let psk_ext = PresharedKeyOffer::new(psk_identity, binder); - exts.push(ClientExtension::PresharedKey(psk_ext)); -} - -pub(super) fn derive_early_traffic_secret( - key_log: &dyn KeyLog, - cx: &mut ClientContext<'_>, - resuming_suite: &'static Tls13CipherSuite, - early_key_schedule: &KeyScheduleEarly, - sent_tls13_fake_ccs: &mut bool, - transcript_buffer: &HandshakeHashBuffer, - client_random: &[u8; 32], -) { - // For middlebox compatibility - emit_fake_ccs(sent_tls13_fake_ccs, cx.common); - - let client_hello_hash = transcript_buffer.get_hash_given(resuming_suite.hash_algorithm(), &[]); - let client_early_traffic_secret = - early_key_schedule.client_early_traffic_secret(&client_hello_hash, key_log, client_random); - // Set early data encryption key - cx.common - .record_layer - .set_message_encrypter(resuming_suite.derive_encrypter(&client_early_traffic_secret)); - - #[cfg(feature = "quic")] - if cx.common.is_quic() { - cx.common.quic.early_secret = Some(client_early_traffic_secret); - } - - // Now the client can send encrypted early data - cx.common.early_traffic = true; - trace!("Starting early data traffic"); -} - -pub(super) fn emit_fake_ccs(sent_tls13_fake_ccs: &mut bool, common: &mut CommonState) { - if common.is_quic() { - return; - } - - if std::mem::replace(sent_tls13_fake_ccs, true) { - return; - } - - let m = Message { - version: ProtocolVersion::TLSv1_2, - payload: MessagePayload::ChangeCipherSpec(ChangeCipherSpecPayload {}), - }; - common.send_msg(m, false); -} - -fn validate_encrypted_extensions( - common: &mut CommonState, - hello: &ClientHelloDetails, - exts: &EncryptedExtensions, -) -> Result<(), Error> { - if exts.has_duplicate_extension() { - common.send_fatal_alert(AlertDescription::DecodeError); - return Err(Error::PeerMisbehavedError( - "server sent duplicate encrypted extensions".to_string(), - )); - } - - if hello.server_sent_unsolicited_extensions(exts, &[]) { - common.send_fatal_alert(AlertDescription::UnsupportedExtension); - let msg = "server sent unsolicited encrypted extension".to_string(); - return Err(Error::PeerMisbehavedError(msg)); - } - - for ext in exts { - if ALLOWED_PLAINTEXT_EXTS.contains(&ext.get_type()) - || DISALLOWED_TLS13_EXTS.contains(&ext.get_type()) - { - common.send_fatal_alert(AlertDescription::UnsupportedExtension); - let msg = "server sent inappropriate encrypted extension".to_string(); - return Err(Error::PeerMisbehavedError(msg)); - } - } - - Ok(()) -} - -struct ExpectEncryptedExtensions { - config: Arc, - resuming_session: Option, - server_name: ServerName, - randoms: ConnectionRandoms, - suite: &'static Tls13CipherSuite, - transcript: HandshakeHash, - key_schedule: KeyScheduleHandshake, - hello: ClientHelloDetails, -} - -impl State for ExpectEncryptedExtensions { - fn handle(mut self: Box, cx: &mut ClientContext<'_>, m: Message) -> hs::NextStateOrError { - let exts = require_handshake_msg!( - m, - HandshakeType::EncryptedExtensions, - HandshakePayload::EncryptedExtensions - )?; - debug!("TLS1.3 encrypted extensions: {:?}", exts); - self.transcript.add_message(&m); - - validate_encrypted_extensions(cx.common, &self.hello, exts)?; - hs::process_alpn_protocol(cx.common, &self.config, exts.get_alpn_protocol())?; - - #[cfg(feature = "quic")] - { - // QUIC transport parameters - if cx.common.is_quic() { - match exts.get_quic_params_extension() { - Some(params) => cx.common.quic.params = Some(params), - None => { - return Err(cx - .common - .missing_extension("QUIC transport parameters not found")); - } - } - } - } - - if let Some(resuming_session) = self.resuming_session { - let was_early_traffic = cx.common.early_traffic; - if was_early_traffic { - if exts.early_data_extension_offered() { - cx.data.early_data.accepted(); - } else { - cx.data.early_data.rejected(); - cx.common.early_traffic = false; - } - } - - if was_early_traffic && !cx.common.early_traffic { - // If no early traffic, set the encryption key for handshakes - cx.common - .record_layer - .set_message_encrypter( - self.suite - .derive_encrypter(self.key_schedule.client_key()), - ); - } - - cx.common.peer_certificates = Some( - resuming_session - .server_cert_chain() - .to_vec(), - ); - - // We *don't* reverify the certificate chain here: resumption is a - // continuation of the previous session in terms of security policy. - let cert_verified = verify::ServerCertVerified::assertion(); - let sig_verified = verify::HandshakeSignatureValid::assertion(); - Ok(Box::new(ExpectFinished { - config: self.config, - server_name: self.server_name, - randoms: self.randoms, - suite: self.suite, - transcript: self.transcript, - key_schedule: self.key_schedule, - client_auth: None, - cert_verified, - sig_verified, - })) - } else { - if exts.early_data_extension_offered() { - let msg = "server sent early data extension without resumption".to_string(); - return Err(Error::PeerMisbehavedError(msg)); - } - Ok(Box::new(ExpectCertificateOrCertReq { - config: self.config, - server_name: self.server_name, - randoms: self.randoms, - suite: self.suite, - transcript: self.transcript, - key_schedule: self.key_schedule, - may_send_sct_list: self.hello.server_may_send_sct_list(), - })) - } - } -} - -struct ExpectCertificateOrCertReq { - config: Arc, - server_name: ServerName, - randoms: ConnectionRandoms, - suite: &'static Tls13CipherSuite, - transcript: HandshakeHash, - key_schedule: KeyScheduleHandshake, - may_send_sct_list: bool, -} - -impl State for ExpectCertificateOrCertReq { - fn handle(self: Box, cx: &mut ClientContext<'_>, m: Message) -> hs::NextStateOrError { - match m.payload { - MessagePayload::Handshake { - parsed: - HandshakeMessagePayload { - payload: HandshakePayload::CertificateTLS13(..), - .. - }, - .. - } => Box::new(ExpectCertificate { - config: self.config, - server_name: self.server_name, - randoms: self.randoms, - suite: self.suite, - transcript: self.transcript, - key_schedule: self.key_schedule, - may_send_sct_list: self.may_send_sct_list, - client_auth: None, - }) - .handle(cx, m), - MessagePayload::Handshake { - parsed: - HandshakeMessagePayload { - payload: HandshakePayload::CertificateRequestTLS13(..), - .. - }, - .. - } => Box::new(ExpectCertificateRequest { - config: self.config, - server_name: self.server_name, - randoms: self.randoms, - suite: self.suite, - transcript: self.transcript, - key_schedule: self.key_schedule, - may_send_sct_list: self.may_send_sct_list, - }) - .handle(cx, m), - payload => Err(inappropriate_handshake_message( - &payload, - &[ContentType::Handshake], - &[ - HandshakeType::Certificate, - HandshakeType::CertificateRequest, - ], - )), - } - } -} - -// TLS1.3 version of CertificateRequest handling. We then move to expecting the server -// Certificate. Unfortunately the CertificateRequest type changed in an annoying way -// in TLS1.3. -struct ExpectCertificateRequest { - config: Arc, - server_name: ServerName, - randoms: ConnectionRandoms, - suite: &'static Tls13CipherSuite, - transcript: HandshakeHash, - key_schedule: KeyScheduleHandshake, - may_send_sct_list: bool, -} - -impl State for ExpectCertificateRequest { - fn handle(mut self: Box, cx: &mut ClientContext<'_>, m: Message) -> hs::NextStateOrError { - let certreq = &require_handshake_msg!( - m, - HandshakeType::CertificateRequest, - HandshakePayload::CertificateRequestTLS13 - )?; - self.transcript.add_message(&m); - debug!("Got CertificateRequest {:?}", certreq); - - // Fortunately the problems here in TLS1.2 and prior are corrected in - // TLS1.3. - - // Must be empty during handshake. - if !certreq.context.0.is_empty() { - warn!("Server sent non-empty certreq context"); - cx.common - .send_fatal_alert(AlertDescription::DecodeError); - return Err(Error::CorruptMessagePayload(ContentType::Handshake)); - } - - let tls13_sign_schemes = sign::supported_sign_tls13(); - let no_sigschemes = Vec::new(); - let compat_sigschemes = certreq - .get_sigalgs_extension() - .unwrap_or(&no_sigschemes) - .iter() - .cloned() - .filter(|scheme| tls13_sign_schemes.contains(scheme)) - .collect::>(); - - if compat_sigschemes.is_empty() { - cx.common - .send_fatal_alert(AlertDescription::HandshakeFailure); - return Err(Error::PeerIncompatibleError( - "server sent bad certreq schemes".to_string(), - )); - } - - let client_auth = ClientAuthDetails::resolve( - self.config - .client_auth_cert_resolver - .as_ref(), - certreq.get_authorities_extension(), - &compat_sigschemes, - Some(certreq.context.0.clone()), - ); - - Ok(Box::new(ExpectCertificate { - config: self.config, - server_name: self.server_name, - randoms: self.randoms, - suite: self.suite, - transcript: self.transcript, - key_schedule: self.key_schedule, - may_send_sct_list: self.may_send_sct_list, - client_auth: Some(client_auth), - })) - } -} - -struct ExpectCertificate { - config: Arc, - server_name: ServerName, - randoms: ConnectionRandoms, - suite: &'static Tls13CipherSuite, - transcript: HandshakeHash, - key_schedule: KeyScheduleHandshake, - may_send_sct_list: bool, - client_auth: Option, -} - -impl State for ExpectCertificate { - fn handle(mut self: Box, cx: &mut ClientContext<'_>, m: Message) -> hs::NextStateOrError { - let cert_chain = require_handshake_msg!( - m, - HandshakeType::Certificate, - HandshakePayload::CertificateTLS13 - )?; - self.transcript.add_message(&m); - - // This is only non-empty for client auth. - if !cert_chain.context.0.is_empty() { - warn!("certificate with non-empty context during handshake"); - cx.common - .send_fatal_alert(AlertDescription::DecodeError); - return Err(Error::CorruptMessagePayload(ContentType::Handshake)); - } - - if cert_chain.any_entry_has_duplicate_extension() - || cert_chain.any_entry_has_unknown_extension() - { - warn!("certificate chain contains unsolicited/unknown extension"); - cx.common - .send_fatal_alert(AlertDescription::UnsupportedExtension); - return Err(Error::PeerMisbehavedError( - "bad cert chain extensions".to_string(), - )); - } - - let server_cert = ServerCertDetails::new( - cert_chain.convert(), - cert_chain.get_end_entity_ocsp(), - cert_chain.get_end_entity_scts(), - ); - - if let Some(sct_list) = server_cert.scts.as_ref() { - if hs::sct_list_is_invalid(sct_list) { - let error_msg = "server sent invalid SCT list".to_string(); - return Err(Error::PeerMisbehavedError(error_msg)); - } - - if !self.may_send_sct_list { - let error_msg = "server sent unsolicited SCT list".to_string(); - return Err(Error::PeerMisbehavedError(error_msg)); - } - } - - Ok(Box::new(ExpectCertificateVerify { - config: self.config, - server_name: self.server_name, - randoms: self.randoms, - suite: self.suite, - transcript: self.transcript, - key_schedule: self.key_schedule, - server_cert, - client_auth: self.client_auth, - })) - } -} - -// --- TLS1.3 CertificateVerify --- -struct ExpectCertificateVerify { - config: Arc, - server_name: ServerName, - randoms: ConnectionRandoms, - suite: &'static Tls13CipherSuite, - transcript: HandshakeHash, - key_schedule: KeyScheduleHandshake, - server_cert: ServerCertDetails, - client_auth: Option, -} - -impl State for ExpectCertificateVerify { - fn handle(mut self: Box, cx: &mut ClientContext<'_>, m: Message) -> hs::NextStateOrError { - let cert_verify = require_handshake_msg!( - m, - HandshakeType::CertificateVerify, - HandshakePayload::CertificateVerify - )?; - - trace!("Server cert is {:?}", self.server_cert.cert_chain); - - // 1. Verify the certificate chain. - let (end_entity, intermediates) = self - .server_cert - .cert_chain - .split_first() - .ok_or(Error::NoCertificatesPresented)?; - let now = std::time::SystemTime::now(); - let cert_verified = self - .config - .verifier - .verify_server_cert( - end_entity, - intermediates, - &self.server_name, - &mut self.server_cert.scts(), - &self.server_cert.ocsp_response, - now, - ) - .map_err(|err| hs::send_cert_error_alert(cx.common, err))?; - - // 2. Verify their signature on the handshake. - let handshake_hash = self.transcript.get_current_hash(); - let sig_verified = self - .config - .verifier - .verify_tls13_signature( - &verify::construct_tls13_server_verify_message(&handshake_hash), - &self.server_cert.cert_chain[0], - cert_verify, - ) - .map_err(|err| hs::send_cert_error_alert(cx.common, err))?; - - cx.common.peer_certificates = Some(self.server_cert.cert_chain); - self.transcript.add_message(&m); - - Ok(Box::new(ExpectFinished { - config: self.config, - server_name: self.server_name, - randoms: self.randoms, - suite: self.suite, - transcript: self.transcript, - key_schedule: self.key_schedule, - client_auth: self.client_auth, - cert_verified, - sig_verified, - })) - } -} - -fn emit_certificate_tls13( - transcript: &mut HandshakeHash, - certkey: Option<&CertifiedKey>, - auth_context: Option>, - common: &mut CommonState, -) { - let context = auth_context.unwrap_or_default(); - - let mut cert_payload = CertificatePayloadTLS13 { - context: PayloadU8::new(context), - entries: Vec::new(), - }; - - if let Some(certkey) = certkey { - for cert in &certkey.cert { - cert_payload - .entries - .push(CertificateEntry::new(cert.clone())); - } - } - - let m = Message { - version: ProtocolVersion::TLSv1_3, - payload: MessagePayload::handshake(HandshakeMessagePayload { - typ: HandshakeType::Certificate, - payload: HandshakePayload::CertificateTLS13(cert_payload), - }), - }; - transcript.add_message(&m); - common.send_msg(m, true); -} - -fn emit_certverify_tls13( - transcript: &mut HandshakeHash, - signer: &dyn Signer, - common: &mut CommonState, -) -> Result<(), Error> { - let message = verify::construct_tls13_client_verify_message(&transcript.get_current_hash()); - - let scheme = signer.scheme(); - let sig = signer.sign(&message)?; - let dss = DigitallySignedStruct::new(scheme, sig); - - let m = Message { - version: ProtocolVersion::TLSv1_3, - payload: MessagePayload::handshake(HandshakeMessagePayload { - typ: HandshakeType::CertificateVerify, - payload: HandshakePayload::CertificateVerify(dss), - }), - }; - - transcript.add_message(&m); - common.send_msg(m, true); - Ok(()) -} - -fn emit_finished_tls13( - transcript: &mut HandshakeHash, - verify_data: ring::hmac::Tag, - common: &mut CommonState, -) { - let verify_data_payload = Payload::new(verify_data.as_ref()); - - let m = Message { - version: ProtocolVersion::TLSv1_3, - payload: MessagePayload::handshake(HandshakeMessagePayload { - typ: HandshakeType::Finished, - payload: HandshakePayload::Finished(verify_data_payload), - }), - }; - - transcript.add_message(&m); - common.send_msg(m, true); -} - -fn emit_end_of_early_data_tls13(transcript: &mut HandshakeHash, common: &mut CommonState) { - if common.is_quic() { - return; - } - - let m = Message { - version: ProtocolVersion::TLSv1_3, - payload: MessagePayload::handshake(HandshakeMessagePayload { - typ: HandshakeType::EndOfEarlyData, - payload: HandshakePayload::EndOfEarlyData, - }), - }; - - transcript.add_message(&m); - common.send_msg(m, true); -} - -struct ExpectFinished { - config: Arc, - server_name: ServerName, - randoms: ConnectionRandoms, - suite: &'static Tls13CipherSuite, - transcript: HandshakeHash, - key_schedule: KeyScheduleHandshake, - client_auth: Option, - cert_verified: verify::ServerCertVerified, - sig_verified: verify::HandshakeSignatureValid, -} - -impl State for ExpectFinished { - fn handle(self: Box, cx: &mut ClientContext<'_>, m: Message) -> hs::NextStateOrError { - let mut st = *self; - let finished = - require_handshake_msg!(m, HandshakeType::Finished, HandshakePayload::Finished)?; - - let handshake_hash = st.transcript.get_current_hash(); - let expect_verify_data = st - .key_schedule - .sign_server_finish(&handshake_hash); - - let fin = constant_time::verify_slices_are_equal(expect_verify_data.as_ref(), &finished.0) - .map_err(|_| { - cx.common - .send_fatal_alert(AlertDescription::DecryptError); - Error::DecryptError - }) - .map(|_| verify::FinishedMessageVerified::assertion())?; - - st.transcript.add_message(&m); - - let hash_after_handshake = st.transcript.get_current_hash(); - /* The EndOfEarlyData message to server is still encrypted with early data keys, - * but appears in the transcript after the server Finished. */ - if cx.common.early_traffic { - emit_end_of_early_data_tls13(&mut st.transcript, cx.common); - cx.common.early_traffic = false; - cx.data.early_data.finished(); - cx.common - .record_layer - .set_message_encrypter( - st.suite - .derive_encrypter(st.key_schedule.client_key()), - ); - } - - /* Send our authentication/finished messages. These are still encrypted - * with our handshake keys. */ - if let Some(client_auth) = st.client_auth { - match client_auth { - ClientAuthDetails::Empty { - auth_context_tls13: auth_context, - } => { - emit_certificate_tls13(&mut st.transcript, None, auth_context, cx.common); - } - ClientAuthDetails::Verify { - certkey, - signer, - auth_context_tls13: auth_context, - } => { - emit_certificate_tls13( - &mut st.transcript, - Some(&certkey), - auth_context, - cx.common, - ); - emit_certverify_tls13(&mut st.transcript, signer.as_ref(), cx.common)?; - } - } - } - - let (key_schedule_finished, client_key, server_key) = st - .key_schedule - .into_traffic_with_client_finished_pending( - hash_after_handshake, - &*st.config.key_log, - &st.randoms.client, - ); - let handshake_hash = st.transcript.get_current_hash(); - let (key_schedule_traffic, verify_data, _) = - key_schedule_finished.sign_client_finish(&handshake_hash); - emit_finished_tls13(&mut st.transcript, verify_data, cx.common); - - /* Now move to our application traffic keys. */ - cx.common.check_aligned_handshake()?; - - cx.common - .record_layer - .set_message_decrypter(st.suite.derive_decrypter(&server_key)); - - cx.common - .record_layer - .set_message_encrypter(st.suite.derive_encrypter(&client_key)); - - cx.common.start_traffic(); - - let st = ExpectTraffic { - session_storage: Arc::clone(&st.config.session_storage), - server_name: st.server_name, - suite: st.suite, - transcript: st.transcript, - key_schedule: key_schedule_traffic, - want_write_key_update: false, - _cert_verified: st.cert_verified, - _sig_verified: st.sig_verified, - _fin_verified: fin, - }; - - #[cfg(feature = "quic")] - { - if cx.common.protocol == Protocol::Quic { - cx.common.quic.traffic_secrets = - Some(quic::Secrets::new(client_key, server_key, st.suite, true)); - return Ok(Box::new(ExpectQuicTraffic(st))); - } - } - - Ok(Box::new(st)) - } -} - -// -- Traffic transit state (TLS1.3) -- -// In this state we can be sent tickets, key updates, -// and application data. -struct ExpectTraffic { - session_storage: Arc, - server_name: ServerName, - suite: &'static Tls13CipherSuite, - transcript: HandshakeHash, - key_schedule: KeyScheduleTraffic, - want_write_key_update: bool, - _cert_verified: verify::ServerCertVerified, - _sig_verified: verify::HandshakeSignatureValid, - _fin_verified: verify::FinishedMessageVerified, -} - -impl ExpectTraffic { - #[allow(clippy::unnecessary_wraps)] // returns Err for #[cfg(feature = "quic")] - fn handle_new_ticket_tls13( - &mut self, - cx: &mut ClientContext<'_>, - nst: &NewSessionTicketPayloadTLS13, - ) -> Result<(), Error> { - if nst.has_duplicate_extension() { - cx.common - .send_fatal_alert(AlertDescription::IllegalParameter); - return Err(Error::PeerMisbehavedError( - "peer sent duplicate NewSessionTicket extensions".into(), - )); - } - - let handshake_hash = self.transcript.get_current_hash(); - let secret = self - .key_schedule - .resumption_master_secret_and_derive_ticket_psk(&handshake_hash, &nst.nonce.0); - - let time_now = match TimeBase::now() { - Ok(t) => t, - #[allow(unused_variables)] - Err(e) => { - debug!("Session not saved: {}", e); - return Ok(()); - } - }; - - let value = persist::Tls13ClientSessionValue::new( - self.suite, - nst.ticket.0.clone(), - secret, - cx.common - .peer_certificates - .clone() - .unwrap_or_default(), - time_now, - nst.lifetime, - nst.age_add, - nst.get_max_early_data_size() - .unwrap_or_default(), - ); - - #[cfg(feature = "quic")] - if let Some(sz) = nst.get_max_early_data_size() { - if cx.common.protocol == Protocol::Quic && sz != 0 && sz != 0xffff_ffff { - return Err(Error::PeerMisbehavedError( - "invalid max_early_data_size".into(), - )); - } - } - - let key = persist::ClientSessionKey::session_for_server_name(&self.server_name); - #[allow(unused_mut)] - let mut ticket = value.get_encoding(); - - #[cfg(feature = "quic")] - if let (Protocol::Quic, Some(ref quic_params)) = - (cx.common.protocol, &cx.common.quic.params) - { - PayloadU16::encode_slice(quic_params, &mut ticket); - } - - let worked = self - .session_storage - .put(key.get_encoding(), ticket); - - if worked { - debug!("Ticket saved"); - } else { - debug!("Ticket not saved"); - } - Ok(()) - } - - fn handle_key_update( - &mut self, - common: &mut CommonState, - kur: &KeyUpdateRequest, - ) -> Result<(), Error> { - #[cfg(feature = "quic")] - { - if let Protocol::Quic = common.protocol { - common.send_fatal_alert(AlertDescription::UnexpectedMessage); - let msg = "KeyUpdate received in QUIC connection".to_string(); - warn!("{}", msg); - return Err(Error::PeerMisbehavedError(msg)); - } - } - - // Mustn't be interleaved with other handshake messages. - common.check_aligned_handshake()?; - - match kur { - KeyUpdateRequest::UpdateNotRequested => {} - KeyUpdateRequest::UpdateRequested => { - self.want_write_key_update = true; - } - _ => { - common.send_fatal_alert(AlertDescription::IllegalParameter); - return Err(Error::CorruptMessagePayload(ContentType::Handshake)); - } - } - - // Update our read-side keys. - let new_read_key = self - .key_schedule - .next_server_application_traffic_secret(); - common - .record_layer - .set_message_decrypter( - self.suite - .derive_decrypter(&new_read_key), - ); - - Ok(()) - } -} - -impl State for ExpectTraffic { - fn handle(mut self: Box, cx: &mut ClientContext<'_>, m: Message) -> hs::NextStateOrError { - match m.payload { - MessagePayload::ApplicationData(payload) => cx - .common - .take_received_plaintext(payload), - MessagePayload::Handshake { - parsed: - HandshakeMessagePayload { - payload: HandshakePayload::NewSessionTicketTLS13(ref new_ticket), - .. - }, - .. - } => self.handle_new_ticket_tls13(cx, new_ticket)?, - MessagePayload::Handshake { - parsed: - HandshakeMessagePayload { - payload: HandshakePayload::KeyUpdate(ref key_update), - .. - }, - .. - } => self.handle_key_update(cx.common, key_update)?, - payload => { - return Err(inappropriate_handshake_message( - &payload, - &[ContentType::ApplicationData, ContentType::Handshake], - &[HandshakeType::NewSessionTicket, HandshakeType::KeyUpdate], - )); - } - } - - Ok(self) - } - - fn export_keying_material( - &self, - output: &mut [u8], - label: &[u8], - context: Option<&[u8]>, - ) -> Result<(), Error> { - self.key_schedule - .export_keying_material(output, label, context) - } - - fn perhaps_write_key_update(&mut self, common: &mut CommonState) { - if self.want_write_key_update { - self.want_write_key_update = false; - common.send_msg_encrypt(Message::build_key_update_notify().into()); - - let write_key = self - .key_schedule - .next_client_application_traffic_secret(); - common - .record_layer - .set_message_encrypter(self.suite.derive_encrypter(&write_key)); - } - } - - #[cfg(feature = "secret_extraction")] - fn extract_secrets(&self) -> Result { - self.key_schedule - .extract_secrets(self.suite.common.aead_algorithm, Side::Client) - } -} - -#[cfg(feature = "quic")] -struct ExpectQuicTraffic(ExpectTraffic); - -#[cfg(feature = "quic")] -impl State for ExpectQuicTraffic { - fn handle(mut self: Box, cx: &mut ClientContext<'_>, m: Message) -> hs::NextStateOrError { - let nst = require_handshake_msg!( - m, - HandshakeType::NewSessionTicket, - HandshakePayload::NewSessionTicketTLS13 - )?; - self.0 - .handle_new_ticket_tls13(cx, nst)?; - Ok(self) - } - - fn export_keying_material( - &self, - output: &mut [u8], - label: &[u8], - context: Option<&[u8]>, - ) -> Result<(), Error> { - self.0 - .export_keying_material(output, label, context) - } -} diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/src/conn.rs temporalio-1.3.0/vendor/rustls-0.20.9/src/conn.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/src/conn.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/src/conn.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,1466 +0,0 @@ -use crate::enums::ProtocolVersion; -use crate::error::Error; -use crate::key; -#[cfg(feature = "logging")] -use crate::log::{debug, error, trace, warn}; -use crate::msgs::alert::AlertMessagePayload; -use crate::msgs::base::Payload; -use crate::msgs::deframer::MessageDeframer; -use crate::msgs::enums::HandshakeType; -use crate::msgs::enums::{AlertDescription, AlertLevel, ContentType}; -use crate::msgs::fragmenter::MessageFragmenter; -use crate::msgs::handshake::Random; -use crate::msgs::hsjoiner::{HandshakeJoiner, JoinerError}; -use crate::msgs::message::{ - BorrowedPlainMessage, Message, MessagePayload, OpaqueMessage, PlainMessage, -}; -#[cfg(feature = "quic")] -use crate::quic; -use crate::record_layer; -use crate::suites::SupportedCipherSuite; -#[cfg(feature = "secret_extraction")] -use crate::suites::{ExtractedSecrets, PartiallyExtractedSecrets}; -#[cfg(feature = "tls12")] -use crate::tls12::ConnectionSecrets; -use crate::vecbuf::ChunkVecBuffer; -#[cfg(feature = "quic")] -use std::collections::VecDeque; - -use std::convert::TryFrom; -use std::fmt::Debug; -use std::io; -use std::mem; -use std::ops::{Deref, DerefMut}; - -/// A client or server connection. -#[derive(Debug)] -pub enum Connection { - /// A client connection - Client(crate::client::ClientConnection), - /// A server connection - Server(crate::server::ServerConnection), -} - -impl Connection { - /// Read TLS content from `rd`. - /// - /// See [`ConnectionCommon::read_tls()`] for more information. - pub fn read_tls(&mut self, rd: &mut dyn io::Read) -> Result { - match self { - Self::Client(conn) => conn.read_tls(rd), - Self::Server(conn) => conn.read_tls(rd), - } - } - - /// Returns an object that allows reading plaintext. - pub fn reader(&mut self) -> Reader { - match self { - Self::Client(conn) => conn.reader(), - Self::Server(conn) => conn.reader(), - } - } - - /// Returns an object that allows writing plaintext. - pub fn writer(&mut self) -> Writer { - match self { - Self::Client(conn) => Writer::new(&mut **conn), - Self::Server(conn) => Writer::new(&mut **conn), - } - } - - /// Processes any new packets read by a previous call to [`Connection::read_tls`]. - /// - /// See [`ConnectionCommon::process_new_packets()`] for more information. - pub fn process_new_packets(&mut self) -> Result { - match self { - Self::Client(conn) => conn.process_new_packets(), - Self::Server(conn) => conn.process_new_packets(), - } - } - - /// Derives key material from the agreed connection secrets. - /// - /// See [`ConnectionCommon::export_keying_material()`] for more information. - pub fn export_keying_material( - &self, - output: &mut [u8], - label: &[u8], - context: Option<&[u8]>, - ) -> Result<(), Error> { - match self { - Self::Client(conn) => conn.export_keying_material(output, label, context), - Self::Server(conn) => conn.export_keying_material(output, label, context), - } - } - - /// Extract secrets, to set up kTLS for example - #[cfg(feature = "secret_extraction")] - pub fn extract_secrets(self) -> Result { - match self { - Self::Client(conn) => conn.extract_secrets(), - Self::Server(conn) => conn.extract_secrets(), - } - } - - /// This function uses `io` to complete any outstanding IO for this connection. - /// - /// See [`ConnectionCommon::complete_io()`] for more information. - pub fn complete_io(&mut self, io: &mut T) -> Result<(usize, usize), io::Error> - where - Self: Sized, - T: io::Read + io::Write, - { - match self { - Self::Client(conn) => conn.complete_io(io), - Self::Server(conn) => conn.complete_io(io), - } - } -} - -#[cfg(feature = "quic")] -impl crate::quic::QuicExt for Connection { - fn quic_transport_parameters(&self) -> Option<&[u8]> { - match self { - Self::Client(conn) => conn.quic_transport_parameters(), - Self::Server(conn) => conn.quic_transport_parameters(), - } - } - - fn zero_rtt_keys(&self) -> Option { - match self { - Self::Client(conn) => conn.zero_rtt_keys(), - Self::Server(conn) => conn.zero_rtt_keys(), - } - } - - fn read_hs(&mut self, plaintext: &[u8]) -> Result<(), Error> { - match self { - Self::Client(conn) => conn.read_quic_hs(plaintext), - Self::Server(conn) => conn.read_quic_hs(plaintext), - } - } - - fn write_hs(&mut self, buf: &mut Vec) -> Option { - match self { - Self::Client(conn) => quic::write_hs(conn, buf), - Self::Server(conn) => quic::write_hs(conn, buf), - } - } - - fn alert(&self) -> Option { - match self { - Self::Client(conn) => conn.alert(), - Self::Server(conn) => conn.alert(), - } - } -} - -impl Deref for Connection { - type Target = CommonState; - - fn deref(&self) -> &Self::Target { - match self { - Self::Client(conn) => &conn.common_state, - Self::Server(conn) => &conn.common_state, - } - } -} - -impl DerefMut for Connection { - fn deref_mut(&mut self) -> &mut Self::Target { - match self { - Self::Client(conn) => &mut conn.common_state, - Self::Server(conn) => &mut conn.common_state, - } - } -} - -/// Values of this structure are returned from [`Connection::process_new_packets`] -/// and tell the caller the current I/O state of the TLS connection. -#[derive(Debug, Eq, PartialEq)] -pub struct IoState { - tls_bytes_to_write: usize, - plaintext_bytes_to_read: usize, - peer_has_closed: bool, -} - -impl IoState { - /// How many bytes could be written by [`CommonState::write_tls`] if called - /// right now. A non-zero value implies [`CommonState::wants_write`]. - pub fn tls_bytes_to_write(&self) -> usize { - self.tls_bytes_to_write - } - - /// How many plaintext bytes could be obtained via [`std::io::Read`] - /// without further I/O. - pub fn plaintext_bytes_to_read(&self) -> usize { - self.plaintext_bytes_to_read - } - - /// True if the peer has sent us a close_notify alert. This is - /// the TLS mechanism to securely half-close a TLS connection, - /// and signifies that the peer will not send any further data - /// on this connection. - /// - /// This is also signalled via returning `Ok(0)` from - /// [`std::io::Read`], after all the received bytes have been - /// retrieved. - pub fn peer_has_closed(&self) -> bool { - self.peer_has_closed - } -} - -/// A structure that implements [`std::io::Read`] for reading plaintext. -pub struct Reader<'a> { - received_plaintext: &'a mut ChunkVecBuffer, - peer_cleanly_closed: bool, - has_seen_eof: bool, -} - -impl<'a> io::Read for Reader<'a> { - /// Obtain plaintext data received from the peer over this TLS connection. - /// - /// If the peer closes the TLS session cleanly, this returns `Ok(0)` once all - /// the pending data has been read. No further data can be received on that - /// connection, so the underlying TCP connection should be half-closed too. - /// - /// If the peer closes the TLS session uncleanly (a TCP EOF without sending a - /// `close_notify` alert) this function returns `Err(ErrorKind::UnexpectedEof.into())` - /// once any pending data has been read. - /// - /// Note that support for `close_notify` varies in peer TLS libraries: many do not - /// support it and uncleanly close the TCP connection (this might be - /// vulnerable to truncation attacks depending on the application protocol). - /// This means applications using rustls must both handle EOF - /// from this function, *and* unexpected EOF of the underlying TCP connection. - /// - /// If there are no bytes to read, this returns `Err(ErrorKind::WouldBlock.into())`. - /// - /// You may learn the number of bytes available at any time by inspecting - /// the return of [`Connection::process_new_packets`]. - fn read(&mut self, buf: &mut [u8]) -> io::Result { - let len = self.received_plaintext.read(buf)?; - - if len == 0 && !buf.is_empty() { - // No bytes available: - match (self.peer_cleanly_closed, self.has_seen_eof) { - // cleanly closed; don't care about TCP EOF: express this as Ok(0) - (true, _) => {} - // unclean closure - (false, true) => return Err(io::ErrorKind::UnexpectedEof.into()), - // connection still going, but need more data: signal `WouldBlock` so that - // the caller knows this - (false, false) => return Err(io::ErrorKind::WouldBlock.into()), - } - } - - Ok(len) - } - - /// Obtain plaintext data received from the peer over this TLS connection. - /// - /// If the peer closes the TLS session, this returns `Ok(())` without filling - /// any more of the buffer once all the pending data has been read. No further - /// data can be received on that connection, so the underlying TCP connection - /// should be half-closed too. - /// - /// If the peer closes the TLS session uncleanly (a TCP EOF without sending a - /// `close_notify` alert) this function returns `Err(ErrorKind::UnexpectedEof.into())` - /// once any pending data has been read. - /// - /// Note that support for `close_notify` varies in peer TLS libraries: many do not - /// support it and uncleanly close the TCP connection (this might be - /// vulnerable to truncation attacks depending on the application protocol). - /// This means applications using rustls must both handle EOF - /// from this function, *and* unexpected EOF of the underlying TCP connection. - /// - /// If there are no bytes to read, this returns `Err(ErrorKind::WouldBlock.into())`. - /// - /// You may learn the number of bytes available at any time by inspecting - /// the return of [`Connection::process_new_packets`]. - #[cfg(read_buf)] - fn read_buf(&mut self, mut cursor: io::BorrowedCursor<'_>) -> io::Result<()> { - let before = cursor.written(); - self.received_plaintext - .read_buf(cursor.reborrow())?; - let len = cursor.written() - before; - - if len == 0 && cursor.capacity() > 0 { - // No bytes available: - match (self.peer_cleanly_closed, self.has_seen_eof) { - // cleanly closed; don't care about TCP EOF: express this as Ok(0) - (true, _) => {} - // unclean closure - (false, true) => return Err(io::ErrorKind::UnexpectedEof.into()), - // connection still going, but need more data: signal `WouldBlock` so that - // the caller knows this - (false, false) => return Err(io::ErrorKind::WouldBlock.into()), - } - } - - Ok(()) - } -} - -/// Internal trait implemented by the [`ServerConnection`]/[`ClientConnection`] -/// allowing them to be the subject of a [`Writer`]. -pub trait PlaintextSink { - fn write(&mut self, buf: &[u8]) -> io::Result; - fn write_vectored(&mut self, bufs: &[io::IoSlice<'_>]) -> io::Result; - fn flush(&mut self) -> io::Result<()>; -} - -impl PlaintextSink for ConnectionCommon { - fn write(&mut self, buf: &[u8]) -> io::Result { - Ok(self.send_some_plaintext(buf)) - } - - fn write_vectored(&mut self, bufs: &[io::IoSlice<'_>]) -> io::Result { - let mut sz = 0; - for buf in bufs { - sz += self.send_some_plaintext(buf); - } - Ok(sz) - } - - fn flush(&mut self) -> io::Result<()> { - Ok(()) - } -} - -/// A structure that implements [`std::io::Write`] for writing plaintext. -pub struct Writer<'a> { - sink: &'a mut dyn PlaintextSink, -} - -impl<'a> Writer<'a> { - /// Create a new Writer. - /// - /// This is not an external interface. Get one of these objects - /// from [`Connection::writer`]. - #[doc(hidden)] - pub fn new(sink: &'a mut dyn PlaintextSink) -> Writer<'a> { - Writer { sink } - } -} - -impl<'a> io::Write for Writer<'a> { - /// Send the plaintext `buf` to the peer, encrypting - /// and authenticating it. Once this function succeeds - /// you should call [`CommonState::write_tls`] which will output the - /// corresponding TLS records. - /// - /// This function buffers plaintext sent before the - /// TLS handshake completes, and sends it as soon - /// as it can. See [`CommonState::set_buffer_limit`] to control - /// the size of this buffer. - fn write(&mut self, buf: &[u8]) -> io::Result { - self.sink.write(buf) - } - - fn write_vectored(&mut self, bufs: &[io::IoSlice<'_>]) -> io::Result { - self.sink.write_vectored(bufs) - } - - fn flush(&mut self) -> io::Result<()> { - self.sink.flush() - } -} - -#[derive(Copy, Clone, Eq, PartialEq, Debug)] -pub(crate) enum Protocol { - Tcp, - #[cfg(feature = "quic")] - Quic, -} - -#[derive(Debug)] -pub(crate) struct ConnectionRandoms { - pub(crate) client: [u8; 32], - pub(crate) server: [u8; 32], -} - -/// How many ChangeCipherSpec messages we accept and drop in TLS1.3 handshakes. -/// The spec says 1, but implementations (namely the boringssl test suite) get -/// this wrong. BoringSSL itself accepts up to 32. -static TLS13_MAX_DROPPED_CCS: u8 = 2u8; - -impl ConnectionRandoms { - pub(crate) fn new(client: Random, server: Random) -> Self { - Self { - client: client.0, - server: server.0, - } - } -} - -// --- Common (to client and server) connection functions --- - -fn is_valid_ccs(msg: &OpaqueMessage) -> bool { - // nb. this is prior to the record layer, so is unencrypted. see - // third paragraph of section 5 in RFC8446. - msg.typ == ContentType::ChangeCipherSpec && msg.payload.0 == [0x01] -} - -enum Limit { - Yes, - No, -} - -/// Interface shared by client and server connections. -pub struct ConnectionCommon { - state: Result>, Error>, - pub(crate) data: Data, - pub(crate) common_state: CommonState, - message_deframer: MessageDeframer, - handshake_joiner: HandshakeJoiner, -} - -impl ConnectionCommon { - pub(crate) fn new(state: Box>, data: Data, common_state: CommonState) -> Self { - Self { - state: Ok(state), - data, - common_state, - message_deframer: MessageDeframer::new(), - handshake_joiner: HandshakeJoiner::new(), - } - } - - /// Returns an object that allows reading plaintext. - pub fn reader(&mut self) -> Reader { - Reader { - received_plaintext: &mut self.common_state.received_plaintext, - /// Are we done? i.e., have we processed all received messages, and received a - /// close_notify to indicate that no new messages will arrive? - peer_cleanly_closed: self - .common_state - .has_received_close_notify - && !self.message_deframer.has_pending(), - has_seen_eof: self.common_state.has_seen_eof, - } - } - - /// Returns an object that allows writing plaintext. - pub fn writer(&mut self) -> Writer { - Writer::new(self) - } - - /// This function uses `io` to complete any outstanding IO for - /// this connection. - /// - /// This is a convenience function which solely uses other parts - /// of the public API. - /// - /// What this means depends on the connection state: - /// - /// - If the connection [`is_handshaking`], then IO is performed until - /// the handshake is complete. - /// - Otherwise, if [`wants_write`] is true, [`write_tls`] is invoked - /// until it is all written. - /// - Otherwise, if [`wants_read`] is true, [`read_tls`] is invoked - /// once. - /// - /// The return value is the number of bytes read from and written - /// to `io`, respectively. - /// - /// This function will block if `io` blocks. - /// - /// Errors from TLS record handling (i.e., from [`process_new_packets`]) - /// are wrapped in an `io::ErrorKind::InvalidData`-kind error. - /// - /// [`is_handshaking`]: CommonState::is_handshaking - /// [`wants_read`]: CommonState::wants_read - /// [`wants_write`]: CommonState::wants_write - /// [`write_tls`]: CommonState::write_tls - /// [`read_tls`]: ConnectionCommon::read_tls - /// [`process_new_packets`]: ConnectionCommon::process_new_packets - pub fn complete_io(&mut self, io: &mut T) -> Result<(usize, usize), io::Error> - where - Self: Sized, - T: io::Read + io::Write, - { - let until_handshaked = self.is_handshaking(); - let mut eof = false; - let mut wrlen = 0; - let mut rdlen = 0; - - loop { - while self.wants_write() { - wrlen += self.write_tls(io)?; - } - - if !until_handshaked && wrlen > 0 { - return Ok((rdlen, wrlen)); - } - - while !eof && self.wants_read() { - let read_size = match self.read_tls(io) { - Ok(0) => { - eof = true; - Some(0) - } - Ok(n) => { - rdlen += n; - Some(n) - } - Err(ref err) if err.kind() == io::ErrorKind::Interrupted => None, // nothing to do - Err(err) => return Err(err), - }; - if read_size.is_some() { - break; - } - } - - match self.process_new_packets() { - Ok(_) => {} - Err(e) => { - // In case we have an alert to send describing this error, - // try a last-gasp write -- but don't predate the primary - // error. - let _ignored = self.write_tls(io); - - return Err(io::Error::new(io::ErrorKind::InvalidData, e)); - } - }; - - match (eof, until_handshaked, self.is_handshaking()) { - (_, true, false) => return Ok((rdlen, wrlen)), - (_, false, _) => return Ok((rdlen, wrlen)), - (true, true, true) => return Err(io::Error::from(io::ErrorKind::UnexpectedEof)), - (..) => {} - } - } - } - - /// Extract the first handshake message. - /// - /// This is a shortcut to the `process_new_packets()` -> `process_msg()` -> - /// `process_handshake_messages()` path, specialized for the first handshake message. - pub(crate) fn first_handshake_message(&mut self) -> Result, Error> { - let msg = match self.message_deframer.pop()? { - Some(msg) => msg, - None => return Ok(None), - }; - - let msg = msg.into_plain_message(); - self.handshake_joiner - .push(msg) - .and_then(|aligned| { - self.common_state.aligned_handshake = aligned; - self.handshake_joiner.pop() - }) - .map_err(|_| { - self.common_state - .send_fatal_alert(AlertDescription::DecodeError); - Error::CorruptMessagePayload(ContentType::Handshake) - }) - } - - pub(crate) fn replace_state(&mut self, new: Box>) { - self.state = Ok(new); - } - - fn process_msg( - &mut self, - msg: OpaqueMessage, - state: Box>, - ) -> Result>, Error> { - // Drop CCS messages during handshake in TLS1.3 - if msg.typ == ContentType::ChangeCipherSpec - && !self - .common_state - .may_receive_application_data - && self.common_state.is_tls13() - { - if !is_valid_ccs(&msg) - || self.common_state.received_middlebox_ccs > TLS13_MAX_DROPPED_CCS - { - // "An implementation which receives any other change_cipher_spec value or - // which receives a protected change_cipher_spec record MUST abort the - // handshake with an "unexpected_message" alert." - self.common_state - .send_fatal_alert(AlertDescription::UnexpectedMessage); - return Err(Error::PeerMisbehavedError( - "illegal middlebox CCS received".into(), - )); - } else { - self.common_state.received_middlebox_ccs += 1; - trace!("Dropping CCS"); - return Ok(state); - } - } - - // Decrypt if demanded by current state. - let msg = match self - .common_state - .record_layer - .is_decrypting() - { - true => match self.common_state.decrypt_incoming(msg) { - Ok(None) => { - // message dropped - return Ok(state); - } - Err(e) => { - return Err(e); - } - Ok(Some(msg)) => msg, - }, - false => msg.into_plain_message(), - }; - - // For handshake messages, we need to join them before parsing and processing. - let msg = match self.handshake_joiner.push(msg) { - // Handshake message, we handle these in another method. - Ok(aligned) => { - self.common_state.aligned_handshake = aligned; - - // First decryptable handshake message concludes trial decryption - self.common_state - .record_layer - .finish_trial_decryption(); - - return self.process_new_handshake_messages(state); - } - // Not a handshake message, continue to handle it here. - Err(JoinerError::Unwanted(msg)) => msg, - // Decoding the handshake message failed, yield an error. - Err(JoinerError::Decode) => { - self.common_state - .send_fatal_alert(AlertDescription::DecodeError); - return Err(Error::CorruptMessagePayload(ContentType::Handshake)); - } - }; - - // Now we can fully parse the message payload. - let msg = Message::try_from(msg)?; - - // For alerts, we have separate logic. - if let MessagePayload::Alert(alert) = &msg.payload { - self.common_state.process_alert(alert)?; - return Ok(state); - } - - self.common_state - .process_main_protocol(msg, state, &mut self.data) - } - - /// Processes any new packets read by a previous call to - /// [`Connection::read_tls`]. - /// - /// Errors from this function relate to TLS protocol errors, and - /// are fatal to the connection. Future calls after an error will do - /// no new work and will return the same error. After an error is - /// received from [`process_new_packets`], you should not call [`read_tls`] - /// any more (it will fill up buffers to no purpose). However, you - /// may call the other methods on the connection, including `write`, - /// `send_close_notify`, and `write_tls`. Most likely you will want to - /// call `write_tls` to send any alerts queued by the error and then - /// close the underlying connection. - /// - /// Success from this function comes with some sundry state data - /// about the connection. - /// - /// [`read_tls`]: Connection::read_tls - /// [`process_new_packets`]: Connection::process_new_packets - pub fn process_new_packets(&mut self) -> Result { - let mut state = match mem::replace(&mut self.state, Err(Error::HandshakeNotComplete)) { - Ok(state) => state, - Err(e) => { - self.state = Err(e.clone()); - return Err(e); - } - }; - - while let Some(msg) = self.message_deframer.pop()? { - match self.process_msg(msg, state) { - Ok(new) => state = new, - Err(e) => { - self.state = Err(e.clone()); - return Err(e); - } - } - } - - self.state = Ok(state); - Ok(self.common_state.current_io_state()) - } - - fn process_new_handshake_messages( - &mut self, - mut state: Box>, - ) -> Result>, Error> { - loop { - match self.handshake_joiner.pop() { - Ok(Some(msg)) => { - state = self - .common_state - .process_main_protocol(msg, state, &mut self.data)?; - } - Ok(None) => return Ok(state), - Err(_) => { - #[cfg(feature = "quic")] - if self.common_state.is_quic() { - self.common_state.quic.alert = Some(AlertDescription::DecodeError); - } - - if !self.common_state.is_quic() { - self.common_state - .send_fatal_alert(AlertDescription::DecodeError); - } - - return Err(Error::CorruptMessagePayload(ContentType::Handshake)); - } - } - } - } - - pub(crate) fn send_some_plaintext(&mut self, buf: &[u8]) -> usize { - if let Ok(st) = &mut self.state { - st.perhaps_write_key_update(&mut self.common_state); - } - self.common_state - .send_some_plaintext(buf) - } - - /// Read TLS content from `rd` into the internal buffer. - /// - /// Due to the internal buffering, `rd` can supply TLS messages in arbitrary-sized chunks (like - /// a socket or pipe might). - /// - /// You should call [`process_new_packets()`] each time a call to this function succeeds in order - /// to empty the incoming TLS data buffer. - /// - /// This function returns `Ok(0)` when the underlying `rd` does so. This typically happens when - /// a socket is cleanly closed, or a file is at EOF. Errors may result from the IO done through - /// `rd`; additionally, errors of `ErrorKind::Other` are emitted to signal backpressure: - /// - /// * In order to empty the incoming TLS data buffer, you should call [`process_new_packets()`] - /// each time a call to this function succeeds. - /// * In order to empty the incoming plaintext data buffer, you should empty it through - /// the [`reader()`] after the call to [`process_new_packets()`]. - /// - /// [`process_new_packets()`]: ConnectionCommon::process_new_packets - /// [`reader()`]: ConnectionCommon::reader - pub fn read_tls(&mut self, rd: &mut dyn io::Read) -> Result { - if self.received_plaintext.is_full() { - return Err(io::Error::new( - io::ErrorKind::Other, - "received plaintext buffer full", - )); - } - - let res = self.message_deframer.read(rd); - if let Ok(0) = res { - self.common_state.has_seen_eof = true; - } - res - } - - /// Derives key material from the agreed connection secrets. - /// - /// This function fills in `output` with `output.len()` bytes of key - /// material derived from the master session secret using `label` - /// and `context` for diversification. - /// - /// See RFC5705 for more details on what this does and is for. - /// - /// For TLS1.3 connections, this function does not use the - /// "early" exporter at any point. - /// - /// This function fails if called prior to the handshake completing; - /// check with [`CommonState::is_handshaking`] first. - pub fn export_keying_material( - &self, - output: &mut [u8], - label: &[u8], - context: Option<&[u8]>, - ) -> Result<(), Error> { - match self.state.as_ref() { - Ok(st) => st.export_keying_material(output, label, context), - Err(e) => Err(e.clone()), - } - } - - /// Extract secrets, so they can be used when configuring kTLS, for example. - #[cfg(feature = "secret_extraction")] - pub fn extract_secrets(self) -> Result { - if !self.enable_secret_extraction { - return Err(Error::General("Secret extraction is disabled".into())); - } - - let st = self.state?; - - let record_layer = self.common_state.record_layer; - let PartiallyExtractedSecrets { tx, rx } = st.extract_secrets()?; - Ok(ExtractedSecrets { - tx: (record_layer.write_seq(), tx), - rx: (record_layer.read_seq(), rx), - }) - } -} - -#[cfg(feature = "quic")] -impl ConnectionCommon { - pub(crate) fn read_quic_hs(&mut self, plaintext: &[u8]) -> Result<(), Error> { - let state = match mem::replace(&mut self.state, Err(Error::HandshakeNotComplete)) { - Ok(state) => state, - Err(e) => { - self.state = Err(e.clone()); - return Err(e); - } - }; - - let msg = PlainMessage { - typ: ContentType::Handshake, - version: ProtocolVersion::TLSv1_3, - payload: Payload::new(plaintext.to_vec()), - }; - - if self.handshake_joiner.push(msg).is_err() { - self.common_state.quic.alert = Some(AlertDescription::DecodeError); - return Err(Error::CorruptMessage); - } - - self.process_new_handshake_messages(state) - .map(|state| self.state = Ok(state)) - } -} - -impl Deref for ConnectionCommon { - type Target = CommonState; - - fn deref(&self) -> &Self::Target { - &self.common_state - } -} - -impl DerefMut for ConnectionCommon { - fn deref_mut(&mut self) -> &mut Self::Target { - &mut self.common_state - } -} - -/// Connection state common to both client and server connections. -pub struct CommonState { - pub(crate) negotiated_version: Option, - pub(crate) side: Side, - pub(crate) record_layer: record_layer::RecordLayer, - pub(crate) suite: Option, - pub(crate) alpn_protocol: Option>, - aligned_handshake: bool, - pub(crate) may_send_application_data: bool, - pub(crate) may_receive_application_data: bool, - pub(crate) early_traffic: bool, - sent_fatal_alert: bool, - /// If the peer has signaled end of stream. - has_received_close_notify: bool, - has_seen_eof: bool, - received_middlebox_ccs: u8, - pub(crate) peer_certificates: Option>, - message_fragmenter: MessageFragmenter, - received_plaintext: ChunkVecBuffer, - sendable_plaintext: ChunkVecBuffer, - pub(crate) sendable_tls: ChunkVecBuffer, - #[allow(dead_code)] // only read for QUIC - /// Protocol whose key schedule should be used. Unused for TLS < 1.3. - pub(crate) protocol: Protocol, - #[cfg(feature = "quic")] - pub(crate) quic: Quic, - #[cfg(feature = "secret_extraction")] - pub(crate) enable_secret_extraction: bool, -} - -impl CommonState { - pub(crate) fn new(side: Side) -> Self { - Self { - negotiated_version: None, - side, - record_layer: record_layer::RecordLayer::new(), - suite: None, - alpn_protocol: None, - aligned_handshake: true, - may_send_application_data: false, - may_receive_application_data: false, - early_traffic: false, - sent_fatal_alert: false, - has_received_close_notify: false, - has_seen_eof: false, - received_middlebox_ccs: 0, - peer_certificates: None, - message_fragmenter: MessageFragmenter::default(), - received_plaintext: ChunkVecBuffer::new(Some(DEFAULT_RECEIVED_PLAINTEXT_LIMIT)), - sendable_plaintext: ChunkVecBuffer::new(Some(DEFAULT_BUFFER_LIMIT)), - sendable_tls: ChunkVecBuffer::new(Some(DEFAULT_BUFFER_LIMIT)), - - protocol: Protocol::Tcp, - #[cfg(feature = "quic")] - quic: Quic::new(), - #[cfg(feature = "secret_extraction")] - enable_secret_extraction: false, - } - } - - /// Returns true if the caller should call [`CommonState::write_tls`] as soon - /// as possible. - pub fn wants_write(&self) -> bool { - !self.sendable_tls.is_empty() - } - - /// Returns true if the connection is currently performing the TLS handshake. - /// - /// During this time plaintext written to the connection is buffered in memory. After - /// [`Connection::process_new_packets`] has been called, this might start to return `false` - /// while the final handshake packets still need to be extracted from the connection's buffers. - pub fn is_handshaking(&self) -> bool { - !(self.may_send_application_data && self.may_receive_application_data) - } - - /// Retrieves the certificate chain used by the peer to authenticate. - /// - /// The order of the certificate chain is as it appears in the TLS - /// protocol: the first certificate relates to the peer, the - /// second certifies the first, the third certifies the second, and - /// so on. - /// - /// This is made available for both full and resumed handshakes. - /// - /// For clients, this is the certificate chain of the server. - /// - /// For servers, this is the certificate chain of the client, - /// if client authentication was completed. - /// - /// The return value is None until this value is available. - pub fn peer_certificates(&self) -> Option<&[key::Certificate]> { - self.peer_certificates.as_deref() - } - - /// Retrieves the protocol agreed with the peer via ALPN. - /// - /// A return value of `None` after handshake completion - /// means no protocol was agreed (because no protocols - /// were offered or accepted by the peer). - pub fn alpn_protocol(&self) -> Option<&[u8]> { - self.get_alpn_protocol() - } - - /// Retrieves the ciphersuite agreed with the peer. - /// - /// This returns None until the ciphersuite is agreed. - pub fn negotiated_cipher_suite(&self) -> Option { - self.suite - } - - /// Retrieves the protocol version agreed with the peer. - /// - /// This returns `None` until the version is agreed. - pub fn protocol_version(&self) -> Option { - self.negotiated_version - } - - pub(crate) fn is_tls13(&self) -> bool { - matches!(self.negotiated_version, Some(ProtocolVersion::TLSv1_3)) - } - - fn process_main_protocol( - &mut self, - msg: Message, - mut state: Box>, - data: &mut Data, - ) -> Result>, Error> { - // For TLS1.2, outside of the handshake, send rejection alerts for - // renegotiation requests. These can occur any time. - if self.may_receive_application_data && !self.is_tls13() { - let reject_ty = match self.side { - Side::Client => HandshakeType::HelloRequest, - Side::Server => HandshakeType::ClientHello, - }; - if msg.is_handshake_type(reject_ty) { - self.send_warning_alert(AlertDescription::NoRenegotiation); - return Ok(state); - } - } - - let mut cx = Context { common: self, data }; - match state.handle(&mut cx, msg) { - Ok(next) => { - state = next; - Ok(state) - } - Err(e @ Error::InappropriateMessage { .. }) - | Err(e @ Error::InappropriateHandshakeMessage { .. }) => { - self.send_fatal_alert(AlertDescription::UnexpectedMessage); - Err(e) - } - Err(e) => Err(e), - } - } - - /// Send plaintext application data, fragmenting and - /// encrypting it as it goes out. - /// - /// If internal buffers are too small, this function will not accept - /// all the data. - pub(crate) fn send_some_plaintext(&mut self, data: &[u8]) -> usize { - self.send_plain(data, Limit::Yes) - } - - pub(crate) fn send_early_plaintext(&mut self, data: &[u8]) -> usize { - debug_assert!(self.early_traffic); - debug_assert!(self.record_layer.is_encrypting()); - - if data.is_empty() { - // Don't send empty fragments. - return 0; - } - - self.send_appdata_encrypt(data, Limit::Yes) - } - - // Changing the keys must not span any fragmented handshake - // messages. Otherwise the defragmented messages will have - // been protected with two different record layer protections, - // which is illegal. Not mentioned in RFC. - pub(crate) fn check_aligned_handshake(&mut self) -> Result<(), Error> { - if !self.aligned_handshake { - self.send_fatal_alert(AlertDescription::UnexpectedMessage); - Err(Error::PeerMisbehavedError( - "key epoch or handshake flight with pending fragment".to_string(), - )) - } else { - Ok(()) - } - } - - pub(crate) fn illegal_param(&mut self, why: &str) -> Error { - self.send_fatal_alert(AlertDescription::IllegalParameter); - Error::PeerMisbehavedError(why.to_string()) - } - - pub(crate) fn decrypt_incoming( - &mut self, - encr: OpaqueMessage, - ) -> Result, Error> { - if self - .record_layer - .wants_close_before_decrypt() - { - self.send_close_notify(); - } - - let encrypted_len = encr.payload.0.len(); - let plain = self.record_layer.decrypt_incoming(encr); - - match plain { - Err(Error::PeerSentOversizedRecord) => { - self.send_fatal_alert(AlertDescription::RecordOverflow); - Err(Error::PeerSentOversizedRecord) - } - Err(Error::DecryptError) - if self - .record_layer - .doing_trial_decryption(encrypted_len) => - { - trace!("Dropping undecryptable message after aborted early_data"); - Ok(None) - } - Err(Error::DecryptError) => { - self.send_fatal_alert(AlertDescription::BadRecordMac); - Err(Error::DecryptError) - } - Err(e) => Err(e), - Ok(plain) => Ok(Some(plain)), - } - } - - /// Fragment `m`, encrypt the fragments, and then queue - /// the encrypted fragments for sending. - pub(crate) fn send_msg_encrypt(&mut self, m: PlainMessage) { - let iter = self - .message_fragmenter - .fragment_message(&m); - for m in iter { - self.send_single_fragment(m); - } - } - - /// Like send_msg_encrypt, but operate on an appdata directly. - fn send_appdata_encrypt(&mut self, payload: &[u8], limit: Limit) -> usize { - // Here, the limit on sendable_tls applies to encrypted data, - // but we're respecting it for plaintext data -- so we'll - // be out by whatever the cipher+record overhead is. That's a - // constant and predictable amount, so it's not a terrible issue. - let len = match limit { - Limit::Yes => self - .sendable_tls - .apply_limit(payload.len()), - Limit::No => payload.len(), - }; - - let iter = self.message_fragmenter.fragment_slice( - ContentType::ApplicationData, - ProtocolVersion::TLSv1_2, - &payload[..len], - ); - for m in iter { - self.send_single_fragment(m); - } - - len - } - - fn send_single_fragment(&mut self, m: BorrowedPlainMessage) { - // Close connection once we start to run out of - // sequence space. - if self - .record_layer - .wants_close_before_encrypt() - { - self.send_close_notify(); - } - - // Refuse to wrap counter at all costs. This - // is basically untestable unfortunately. - if self.record_layer.encrypt_exhausted() { - return; - } - - let em = self.record_layer.encrypt_outgoing(m); - self.queue_tls_message(em); - } - - /// Writes TLS messages to `wr`. - /// - /// On success, this function returns `Ok(n)` where `n` is a number of bytes written to `wr` - /// (after encoding and encryption). - /// - /// After this function returns, the connection buffer may not yet be fully flushed. The - /// [`CommonState::wants_write`] function can be used to check if the output buffer is empty. - pub fn write_tls(&mut self, wr: &mut dyn io::Write) -> Result { - self.sendable_tls.write_to(wr) - } - - /// Encrypt and send some plaintext `data`. `limit` controls - /// whether the per-connection buffer limits apply. - /// - /// Returns the number of bytes written from `data`: this might - /// be less than `data.len()` if buffer limits were exceeded. - fn send_plain(&mut self, data: &[u8], limit: Limit) -> usize { - if !self.may_send_application_data { - // If we haven't completed handshaking, buffer - // plaintext to send once we do. - let len = match limit { - Limit::Yes => self - .sendable_plaintext - .append_limited_copy(data), - Limit::No => self - .sendable_plaintext - .append(data.to_vec()), - }; - return len; - } - - debug_assert!(self.record_layer.is_encrypting()); - - if data.is_empty() { - // Don't send empty fragments. - return 0; - } - - self.send_appdata_encrypt(data, limit) - } - - pub(crate) fn start_outgoing_traffic(&mut self) { - self.may_send_application_data = true; - self.flush_plaintext(); - } - - pub(crate) fn start_traffic(&mut self) { - self.may_receive_application_data = true; - self.start_outgoing_traffic(); - } - - /// Sets a limit on the internal buffers used to buffer - /// unsent plaintext (prior to completing the TLS handshake) - /// and unsent TLS records. This limit acts only on application - /// data written through [`Connection::writer`]. - /// - /// By default the limit is 64KB. The limit can be set - /// at any time, even if the current buffer use is higher. - /// - /// [`None`] means no limit applies, and will mean that written - /// data is buffered without bound -- it is up to the application - /// to appropriately schedule its plaintext and TLS writes to bound - /// memory usage. - /// - /// For illustration: `Some(1)` means a limit of one byte applies: - /// [`Connection::writer`] will accept only one byte, encrypt it and - /// add a TLS header. Once this is sent via [`CommonState::write_tls`], - /// another byte may be sent. - /// - /// # Internal write-direction buffering - /// rustls has two buffers whose size are bounded by this setting: - /// - /// ## Buffering of unsent plaintext data prior to handshake completion - /// - /// Calls to [`Connection::writer`] before or during the handshake - /// are buffered (up to the limit specified here). Once the - /// handshake completes this data is encrypted and the resulting - /// TLS records are added to the outgoing buffer. - /// - /// ## Buffering of outgoing TLS records - /// - /// This buffer is used to store TLS records that rustls needs to - /// send to the peer. It is used in these two circumstances: - /// - /// - by [`Connection::process_new_packets`] when a handshake or alert - /// TLS record needs to be sent. - /// - by [`Connection::writer`] post-handshake: the plaintext is - /// encrypted and the resulting TLS record is buffered. - /// - /// This buffer is emptied by [`CommonState::write_tls`]. - pub fn set_buffer_limit(&mut self, limit: Option) { - self.sendable_plaintext.set_limit(limit); - self.sendable_tls.set_limit(limit); - } - - /// Send any buffered plaintext. Plaintext is buffered if - /// written during handshake. - fn flush_plaintext(&mut self) { - if !self.may_send_application_data { - return; - } - - while let Some(buf) = self.sendable_plaintext.pop() { - self.send_plain(&buf, Limit::No); - } - } - - // Put m into sendable_tls for writing. - fn queue_tls_message(&mut self, m: OpaqueMessage) { - self.sendable_tls.append(m.encode()); - } - - /// Send a raw TLS message, fragmenting it if needed. - pub(crate) fn send_msg(&mut self, m: Message, must_encrypt: bool) { - #[cfg(feature = "quic")] - { - if let Protocol::Quic = self.protocol { - if let MessagePayload::Alert(alert) = m.payload { - self.quic.alert = Some(alert.description); - } else { - debug_assert!( - matches!(m.payload, MessagePayload::Handshake { .. }), - "QUIC uses TLS for the cryptographic handshake only" - ); - let mut bytes = Vec::new(); - m.payload.encode(&mut bytes); - self.quic - .hs_queue - .push_back((must_encrypt, bytes)); - } - return; - } - } - if !must_encrypt { - let msg = &m.into(); - let iter = self - .message_fragmenter - .fragment_message(msg); - for m in iter { - self.queue_tls_message(m.to_unencrypted_opaque()); - } - } else { - self.send_msg_encrypt(m.into()); - } - } - - pub(crate) fn take_received_plaintext(&mut self, bytes: Payload) { - self.received_plaintext.append(bytes.0); - } - - #[cfg(feature = "tls12")] - pub(crate) fn start_encryption_tls12(&mut self, secrets: &ConnectionSecrets, side: Side) { - let (dec, enc) = secrets.make_cipher_pair(side); - self.record_layer - .prepare_message_encrypter(enc); - self.record_layer - .prepare_message_decrypter(dec); - } - - #[cfg(feature = "quic")] - pub(crate) fn missing_extension(&mut self, why: &str) -> Error { - self.send_fatal_alert(AlertDescription::MissingExtension); - Error::PeerMisbehavedError(why.to_string()) - } - - fn send_warning_alert(&mut self, desc: AlertDescription) { - warn!("Sending warning alert {:?}", desc); - self.send_warning_alert_no_log(desc); - } - - fn process_alert(&mut self, alert: &AlertMessagePayload) -> Result<(), Error> { - // Reject unknown AlertLevels. - if let AlertLevel::Unknown(_) = alert.level { - self.send_fatal_alert(AlertDescription::IllegalParameter); - } - - // If we get a CloseNotify, make a note to declare EOF to our - // caller. - if alert.description == AlertDescription::CloseNotify { - self.has_received_close_notify = true; - return Ok(()); - } - - // Warnings are nonfatal for TLS1.2, but outlawed in TLS1.3 - // (except, for no good reason, user_cancelled). - if alert.level == AlertLevel::Warning { - if self.is_tls13() && alert.description != AlertDescription::UserCanceled { - self.send_fatal_alert(AlertDescription::DecodeError); - } else { - warn!("TLS alert warning received: {:#?}", alert); - return Ok(()); - } - } - - error!("TLS alert received: {:#?}", alert); - Err(Error::AlertReceived(alert.description)) - } - - pub(crate) fn send_fatal_alert(&mut self, desc: AlertDescription) { - warn!("Sending fatal alert {:?}", desc); - debug_assert!(!self.sent_fatal_alert); - let m = Message::build_alert(AlertLevel::Fatal, desc); - self.send_msg(m, self.record_layer.is_encrypting()); - self.sent_fatal_alert = true; - } - - /// Queues a close_notify warning alert to be sent in the next - /// [`CommonState::write_tls`] call. This informs the peer that the - /// connection is being closed. - pub fn send_close_notify(&mut self) { - debug!("Sending warning alert {:?}", AlertDescription::CloseNotify); - self.send_warning_alert_no_log(AlertDescription::CloseNotify); - } - - fn send_warning_alert_no_log(&mut self, desc: AlertDescription) { - let m = Message::build_alert(AlertLevel::Warning, desc); - self.send_msg(m, self.record_layer.is_encrypting()); - } - - pub(crate) fn set_max_fragment_size(&mut self, new: Option) -> Result<(), Error> { - self.message_fragmenter - .set_max_fragment_size(new) - } - - pub(crate) fn get_alpn_protocol(&self) -> Option<&[u8]> { - self.alpn_protocol - .as_ref() - .map(AsRef::as_ref) - } - - /// Returns true if the caller should call [`Connection::read_tls`] as soon - /// as possible. - /// - /// If there is pending plaintext data to read with [`Connection::reader`], - /// this returns false. If your application respects this mechanism, - /// only one full TLS message will be buffered by rustls. - pub fn wants_read(&self) -> bool { - // We want to read more data all the time, except when we have unprocessed plaintext. - // This provides back-pressure to the TCP buffers. We also don't want to read more after - // the peer has sent us a close notification. - // - // In the handshake case we don't have readable plaintext before the handshake has - // completed, but also don't want to read if we still have sendable tls. - self.received_plaintext.is_empty() - && !self.has_received_close_notify - && (self.may_send_application_data || self.sendable_tls.is_empty()) - } - - fn current_io_state(&self) -> IoState { - IoState { - tls_bytes_to_write: self.sendable_tls.len(), - plaintext_bytes_to_read: self.received_plaintext.len(), - peer_has_closed: self.has_received_close_notify, - } - } - - pub(crate) fn is_quic(&self) -> bool { - #[cfg(feature = "quic")] - { - self.protocol == Protocol::Quic - } - #[cfg(not(feature = "quic"))] - false - } -} - -pub(crate) trait State: Send + Sync { - fn handle( - self: Box, - cx: &mut Context<'_, Data>, - message: Message, - ) -> Result>, Error>; - - fn export_keying_material( - &self, - _output: &mut [u8], - _label: &[u8], - _context: Option<&[u8]>, - ) -> Result<(), Error> { - Err(Error::HandshakeNotComplete) - } - - #[cfg(feature = "secret_extraction")] - fn extract_secrets(&self) -> Result { - Err(Error::HandshakeNotComplete) - } - - fn perhaps_write_key_update(&mut self, _cx: &mut CommonState) {} -} - -pub(crate) struct Context<'a, Data> { - pub(crate) common: &'a mut CommonState, - pub(crate) data: &'a mut Data, -} - -#[cfg(feature = "quic")] -pub(crate) struct Quic { - /// QUIC transport parameters received from the peer during the handshake - pub(crate) params: Option>, - pub(crate) alert: Option, - pub(crate) hs_queue: VecDeque<(bool, Vec)>, - pub(crate) early_secret: Option, - pub(crate) hs_secrets: Option, - pub(crate) traffic_secrets: Option, - /// Whether keys derived from traffic_secrets have been passed to the QUIC implementation - pub(crate) returned_traffic_keys: bool, -} - -#[cfg(feature = "quic")] -impl Quic { - fn new() -> Self { - Self { - params: None, - alert: None, - hs_queue: VecDeque::new(), - early_secret: None, - hs_secrets: None, - traffic_secrets: None, - returned_traffic_keys: false, - } - } -} - -#[derive(Clone, Copy, Debug, PartialEq)] -pub(crate) enum Side { - Client, - Server, -} - -/// Data specific to the peer's side (client or server). -pub trait SideData {} - -const DEFAULT_RECEIVED_PLAINTEXT_LIMIT: usize = 16 * 1024; -const DEFAULT_BUFFER_LIMIT: usize = 64 * 1024; diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/src/enums.rs temporalio-1.3.0/vendor/rustls-0.20.9/src/enums.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/src/enums.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/src/enums.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,431 +0,0 @@ -#![allow(non_camel_case_types)] -#![allow(missing_docs)] -use crate::msgs::codec::{Codec, Reader}; - -enum_builder! { - /// The `ProtocolVersion` TLS protocol enum. Values in this enum are taken - /// from the various RFCs covering TLS, and are listed by IANA. - /// The `Unknown` item is used when processing unrecognised ordinals. - @U16 - EnumName: ProtocolVersion; - EnumVal{ - SSLv2 => 0x0200, - SSLv3 => 0x0300, - TLSv1_0 => 0x0301, - TLSv1_1 => 0x0302, - TLSv1_2 => 0x0303, - TLSv1_3 => 0x0304, - DTLSv1_0 => 0xFEFF, - DTLSv1_2 => 0xFEFD, - DTLSv1_3 => 0xFEFC - } -} - -enum_builder! { - /// The `CipherSuite` TLS protocol enum. Values in this enum are taken - /// from the various RFCs covering TLS, and are listed by IANA. - /// The `Unknown` item is used when processing unrecognised ordinals. - @U16 - EnumName: CipherSuite; - EnumVal{ - TLS_NULL_WITH_NULL_NULL => 0x0000, - TLS_RSA_WITH_NULL_MD5 => 0x0001, - TLS_RSA_WITH_NULL_SHA => 0x0002, - TLS_RSA_EXPORT_WITH_RC4_40_MD5 => 0x0003, - TLS_RSA_WITH_RC4_128_MD5 => 0x0004, - TLS_RSA_WITH_RC4_128_SHA => 0x0005, - TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5 => 0x0006, - TLS_RSA_WITH_IDEA_CBC_SHA => 0x0007, - TLS_RSA_EXPORT_WITH_DES40_CBC_SHA => 0x0008, - TLS_RSA_WITH_DES_CBC_SHA => 0x0009, - TLS_RSA_WITH_3DES_EDE_CBC_SHA => 0x000a, - TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA => 0x000b, - TLS_DH_DSS_WITH_DES_CBC_SHA => 0x000c, - TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA => 0x000d, - TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA => 0x000e, - TLS_DH_RSA_WITH_DES_CBC_SHA => 0x000f, - TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA => 0x0010, - TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA => 0x0011, - TLS_DHE_DSS_WITH_DES_CBC_SHA => 0x0012, - TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA => 0x0013, - TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA => 0x0014, - TLS_DHE_RSA_WITH_DES_CBC_SHA => 0x0015, - TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA => 0x0016, - TLS_DH_anon_EXPORT_WITH_RC4_40_MD5 => 0x0017, - TLS_DH_anon_WITH_RC4_128_MD5 => 0x0018, - TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA => 0x0019, - TLS_DH_anon_WITH_DES_CBC_SHA => 0x001a, - TLS_DH_anon_WITH_3DES_EDE_CBC_SHA => 0x001b, - SSL_FORTEZZA_KEA_WITH_NULL_SHA => 0x001c, - SSL_FORTEZZA_KEA_WITH_FORTEZZA_CBC_SHA => 0x001d, - TLS_KRB5_WITH_DES_CBC_SHA_or_SSL_FORTEZZA_KEA_WITH_RC4_128_SHA => 0x001e, - TLS_KRB5_WITH_3DES_EDE_CBC_SHA => 0x001f, - TLS_KRB5_WITH_RC4_128_SHA => 0x0020, - TLS_KRB5_WITH_IDEA_CBC_SHA => 0x0021, - TLS_KRB5_WITH_DES_CBC_MD5 => 0x0022, - TLS_KRB5_WITH_3DES_EDE_CBC_MD5 => 0x0023, - TLS_KRB5_WITH_RC4_128_MD5 => 0x0024, - TLS_KRB5_WITH_IDEA_CBC_MD5 => 0x0025, - TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA => 0x0026, - TLS_KRB5_EXPORT_WITH_RC2_CBC_40_SHA => 0x0027, - TLS_KRB5_EXPORT_WITH_RC4_40_SHA => 0x0028, - TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5 => 0x0029, - TLS_KRB5_EXPORT_WITH_RC2_CBC_40_MD5 => 0x002a, - TLS_KRB5_EXPORT_WITH_RC4_40_MD5 => 0x002b, - TLS_PSK_WITH_NULL_SHA => 0x002c, - TLS_DHE_PSK_WITH_NULL_SHA => 0x002d, - TLS_RSA_PSK_WITH_NULL_SHA => 0x002e, - TLS_RSA_WITH_AES_128_CBC_SHA => 0x002f, - TLS_DH_DSS_WITH_AES_128_CBC_SHA => 0x0030, - TLS_DH_RSA_WITH_AES_128_CBC_SHA => 0x0031, - TLS_DHE_DSS_WITH_AES_128_CBC_SHA => 0x0032, - TLS_DHE_RSA_WITH_AES_128_CBC_SHA => 0x0033, - TLS_DH_anon_WITH_AES_128_CBC_SHA => 0x0034, - TLS_RSA_WITH_AES_256_CBC_SHA => 0x0035, - TLS_DH_DSS_WITH_AES_256_CBC_SHA => 0x0036, - TLS_DH_RSA_WITH_AES_256_CBC_SHA => 0x0037, - TLS_DHE_DSS_WITH_AES_256_CBC_SHA => 0x0038, - TLS_DHE_RSA_WITH_AES_256_CBC_SHA => 0x0039, - TLS_DH_anon_WITH_AES_256_CBC_SHA => 0x003a, - TLS_RSA_WITH_NULL_SHA256 => 0x003b, - TLS_RSA_WITH_AES_128_CBC_SHA256 => 0x003c, - TLS_RSA_WITH_AES_256_CBC_SHA256 => 0x003d, - TLS_DH_DSS_WITH_AES_128_CBC_SHA256 => 0x003e, - TLS_DH_RSA_WITH_AES_128_CBC_SHA256 => 0x003f, - TLS_DHE_DSS_WITH_AES_128_CBC_SHA256 => 0x0040, - TLS_RSA_WITH_CAMELLIA_128_CBC_SHA => 0x0041, - TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA => 0x0042, - TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA => 0x0043, - TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA => 0x0044, - TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA => 0x0045, - TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA => 0x0046, - TLS_ECDH_ECDSA_WITH_NULL_SHA_draft => 0x0047, - TLS_ECDH_ECDSA_WITH_RC4_128_SHA_draft => 0x0048, - TLS_ECDH_ECDSA_WITH_DES_CBC_SHA_draft => 0x0049, - TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA_draft => 0x004a, - TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA_draft => 0x004b, - TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA_draft => 0x004c, - TLS_ECDH_ECNRA_WITH_DES_CBC_SHA_draft => 0x004d, - TLS_ECDH_ECNRA_WITH_3DES_EDE_CBC_SHA_draft => 0x004e, - TLS_ECMQV_ECDSA_NULL_SHA_draft => 0x004f, - TLS_ECMQV_ECDSA_WITH_RC4_128_SHA_draft => 0x0050, - TLS_ECMQV_ECDSA_WITH_DES_CBC_SHA_draft => 0x0051, - TLS_ECMQV_ECDSA_WITH_3DES_EDE_CBC_SHA_draft => 0x0052, - TLS_ECMQV_ECNRA_NULL_SHA_draft => 0x0053, - TLS_ECMQV_ECNRA_WITH_RC4_128_SHA_draft => 0x0054, - TLS_ECMQV_ECNRA_WITH_DES_CBC_SHA_draft => 0x0055, - TLS_ECMQV_ECNRA_WITH_3DES_EDE_CBC_SHA_draft => 0x0056, - TLS_ECDH_anon_NULL_WITH_SHA_draft => 0x0057, - TLS_ECDH_anon_WITH_RC4_128_SHA_draft => 0x0058, - TLS_ECDH_anon_WITH_DES_CBC_SHA_draft => 0x0059, - TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA_draft => 0x005a, - TLS_ECDH_anon_EXPORT_WITH_DES40_CBC_SHA_draft => 0x005b, - TLS_ECDH_anon_EXPORT_WITH_RC4_40_SHA_draft => 0x005c, - TLS_RSA_EXPORT1024_WITH_RC4_56_MD5 => 0x0060, - TLS_RSA_EXPORT1024_WITH_RC2_CBC_56_MD5 => 0x0061, - TLS_RSA_EXPORT1024_WITH_DES_CBC_SHA => 0x0062, - TLS_DHE_DSS_EXPORT1024_WITH_DES_CBC_SHA => 0x0063, - TLS_RSA_EXPORT1024_WITH_RC4_56_SHA => 0x0064, - TLS_DHE_DSS_EXPORT1024_WITH_RC4_56_SHA => 0x0065, - TLS_DHE_DSS_WITH_RC4_128_SHA => 0x0066, - TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 => 0x0067, - TLS_DH_DSS_WITH_AES_256_CBC_SHA256 => 0x0068, - TLS_DH_RSA_WITH_AES_256_CBC_SHA256 => 0x0069, - TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 => 0x006a, - TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 => 0x006b, - TLS_DH_anon_WITH_AES_128_CBC_SHA256 => 0x006c, - TLS_DH_anon_WITH_AES_256_CBC_SHA256 => 0x006d, - TLS_DHE_DSS_WITH_3DES_EDE_CBC_RMD => 0x0072, - TLS_DHE_DSS_WITH_AES_128_CBC_RMD => 0x0073, - TLS_DHE_DSS_WITH_AES_256_CBC_RMD => 0x0074, - TLS_DHE_RSA_WITH_3DES_EDE_CBC_RMD => 0x0077, - TLS_DHE_RSA_WITH_AES_128_CBC_RMD => 0x0078, - TLS_DHE_RSA_WITH_AES_256_CBC_RMD => 0x0079, - TLS_RSA_WITH_3DES_EDE_CBC_RMD => 0x007c, - TLS_RSA_WITH_AES_128_CBC_RMD => 0x007d, - TLS_RSA_WITH_AES_256_CBC_RMD => 0x007e, - TLS_GOSTR341094_WITH_28147_CNT_IMIT => 0x0080, - TLS_GOSTR341001_WITH_28147_CNT_IMIT => 0x0081, - TLS_GOSTR341094_WITH_NULL_GOSTR3411 => 0x0082, - TLS_GOSTR341001_WITH_NULL_GOSTR3411 => 0x0083, - TLS_RSA_WITH_CAMELLIA_256_CBC_SHA => 0x0084, - TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA => 0x0085, - TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA => 0x0086, - TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA => 0x0087, - TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA => 0x0088, - TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA => 0x0089, - TLS_PSK_WITH_RC4_128_SHA => 0x008a, - TLS_PSK_WITH_3DES_EDE_CBC_SHA => 0x008b, - TLS_PSK_WITH_AES_128_CBC_SHA => 0x008c, - TLS_PSK_WITH_AES_256_CBC_SHA => 0x008d, - TLS_DHE_PSK_WITH_RC4_128_SHA => 0x008e, - TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA => 0x008f, - TLS_DHE_PSK_WITH_AES_128_CBC_SHA => 0x0090, - TLS_DHE_PSK_WITH_AES_256_CBC_SHA => 0x0091, - TLS_RSA_PSK_WITH_RC4_128_SHA => 0x0092, - TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA => 0x0093, - TLS_RSA_PSK_WITH_AES_128_CBC_SHA => 0x0094, - TLS_RSA_PSK_WITH_AES_256_CBC_SHA => 0x0095, - TLS_RSA_WITH_SEED_CBC_SHA => 0x0096, - TLS_DH_DSS_WITH_SEED_CBC_SHA => 0x0097, - TLS_DH_RSA_WITH_SEED_CBC_SHA => 0x0098, - TLS_DHE_DSS_WITH_SEED_CBC_SHA => 0x0099, - TLS_DHE_RSA_WITH_SEED_CBC_SHA => 0x009a, - TLS_DH_anon_WITH_SEED_CBC_SHA => 0x009b, - TLS_RSA_WITH_AES_128_GCM_SHA256 => 0x009c, - TLS_RSA_WITH_AES_256_GCM_SHA384 => 0x009d, - TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 => 0x009e, - TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 => 0x009f, - TLS_DH_RSA_WITH_AES_128_GCM_SHA256 => 0x00a0, - TLS_DH_RSA_WITH_AES_256_GCM_SHA384 => 0x00a1, - TLS_DHE_DSS_WITH_AES_128_GCM_SHA256 => 0x00a2, - TLS_DHE_DSS_WITH_AES_256_GCM_SHA384 => 0x00a3, - TLS_DH_DSS_WITH_AES_128_GCM_SHA256 => 0x00a4, - TLS_DH_DSS_WITH_AES_256_GCM_SHA384 => 0x00a5, - TLS_DH_anon_WITH_AES_128_GCM_SHA256 => 0x00a6, - TLS_DH_anon_WITH_AES_256_GCM_SHA384 => 0x00a7, - TLS_PSK_WITH_AES_128_GCM_SHA256 => 0x00a8, - TLS_PSK_WITH_AES_256_GCM_SHA384 => 0x00a9, - TLS_DHE_PSK_WITH_AES_128_GCM_SHA256 => 0x00aa, - TLS_DHE_PSK_WITH_AES_256_GCM_SHA384 => 0x00ab, - TLS_RSA_PSK_WITH_AES_128_GCM_SHA256 => 0x00ac, - TLS_RSA_PSK_WITH_AES_256_GCM_SHA384 => 0x00ad, - TLS_PSK_WITH_AES_128_CBC_SHA256 => 0x00ae, - TLS_PSK_WITH_AES_256_CBC_SHA384 => 0x00af, - TLS_PSK_WITH_NULL_SHA256 => 0x00b0, - TLS_PSK_WITH_NULL_SHA384 => 0x00b1, - TLS_DHE_PSK_WITH_AES_128_CBC_SHA256 => 0x00b2, - TLS_DHE_PSK_WITH_AES_256_CBC_SHA384 => 0x00b3, - TLS_DHE_PSK_WITH_NULL_SHA256 => 0x00b4, - TLS_DHE_PSK_WITH_NULL_SHA384 => 0x00b5, - TLS_RSA_PSK_WITH_AES_128_CBC_SHA256 => 0x00b6, - TLS_RSA_PSK_WITH_AES_256_CBC_SHA384 => 0x00b7, - TLS_RSA_PSK_WITH_NULL_SHA256 => 0x00b8, - TLS_RSA_PSK_WITH_NULL_SHA384 => 0x00b9, - TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 => 0x00ba, - TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA256 => 0x00bb, - TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA256 => 0x00bc, - TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256 => 0x00bd, - TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 => 0x00be, - TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA256 => 0x00bf, - TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 => 0x00c0, - TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA256 => 0x00c1, - TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA256 => 0x00c2, - TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256 => 0x00c3, - TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 => 0x00c4, - TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA256 => 0x00c5, - TLS_EMPTY_RENEGOTIATION_INFO_SCSV => 0x00ff, - TLS13_AES_128_GCM_SHA256 => 0x1301, - TLS13_AES_256_GCM_SHA384 => 0x1302, - TLS13_CHACHA20_POLY1305_SHA256 => 0x1303, - TLS13_AES_128_CCM_SHA256 => 0x1304, - TLS13_AES_128_CCM_8_SHA256 => 0x1305, - TLS_ECDH_ECDSA_WITH_NULL_SHA => 0xc001, - TLS_ECDH_ECDSA_WITH_RC4_128_SHA => 0xc002, - TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA => 0xc003, - TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA => 0xc004, - TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA => 0xc005, - TLS_ECDHE_ECDSA_WITH_NULL_SHA => 0xc006, - TLS_ECDHE_ECDSA_WITH_RC4_128_SHA => 0xc007, - TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA => 0xc008, - TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA => 0xc009, - TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA => 0xc00a, - TLS_ECDH_RSA_WITH_NULL_SHA => 0xc00b, - TLS_ECDH_RSA_WITH_RC4_128_SHA => 0xc00c, - TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA => 0xc00d, - TLS_ECDH_RSA_WITH_AES_128_CBC_SHA => 0xc00e, - TLS_ECDH_RSA_WITH_AES_256_CBC_SHA => 0xc00f, - TLS_ECDHE_RSA_WITH_NULL_SHA => 0xc010, - TLS_ECDHE_RSA_WITH_RC4_128_SHA => 0xc011, - TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA => 0xc012, - TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA => 0xc013, - TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA => 0xc014, - TLS_ECDH_anon_WITH_NULL_SHA => 0xc015, - TLS_ECDH_anon_WITH_RC4_128_SHA => 0xc016, - TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA => 0xc017, - TLS_ECDH_anon_WITH_AES_128_CBC_SHA => 0xc018, - TLS_ECDH_anon_WITH_AES_256_CBC_SHA => 0xc019, - TLS_SRP_SHA_WITH_3DES_EDE_CBC_SHA => 0xc01a, - TLS_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA => 0xc01b, - TLS_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA => 0xc01c, - TLS_SRP_SHA_WITH_AES_128_CBC_SHA => 0xc01d, - TLS_SRP_SHA_RSA_WITH_AES_128_CBC_SHA => 0xc01e, - TLS_SRP_SHA_DSS_WITH_AES_128_CBC_SHA => 0xc01f, - TLS_SRP_SHA_WITH_AES_256_CBC_SHA => 0xc020, - TLS_SRP_SHA_RSA_WITH_AES_256_CBC_SHA => 0xc021, - TLS_SRP_SHA_DSS_WITH_AES_256_CBC_SHA => 0xc022, - TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 => 0xc023, - TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 => 0xc024, - TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 => 0xc025, - TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 => 0xc026, - TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 => 0xc027, - TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 => 0xc028, - TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 => 0xc029, - TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 => 0xc02a, - TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 => 0xc02b, - TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 => 0xc02c, - TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 => 0xc02d, - TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 => 0xc02e, - TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 => 0xc02f, - TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 => 0xc030, - TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 => 0xc031, - TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 => 0xc032, - TLS_ECDHE_PSK_WITH_RC4_128_SHA => 0xc033, - TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA => 0xc034, - TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA => 0xc035, - TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA => 0xc036, - TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 => 0xc037, - TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384 => 0xc038, - TLS_ECDHE_PSK_WITH_NULL_SHA => 0xc039, - TLS_ECDHE_PSK_WITH_NULL_SHA256 => 0xc03a, - TLS_ECDHE_PSK_WITH_NULL_SHA384 => 0xc03b, - TLS_RSA_WITH_ARIA_128_CBC_SHA256 => 0xc03c, - TLS_RSA_WITH_ARIA_256_CBC_SHA384 => 0xc03d, - TLS_DH_DSS_WITH_ARIA_128_CBC_SHA256 => 0xc03e, - TLS_DH_DSS_WITH_ARIA_256_CBC_SHA384 => 0xc03f, - TLS_DH_RSA_WITH_ARIA_128_CBC_SHA256 => 0xc040, - TLS_DH_RSA_WITH_ARIA_256_CBC_SHA384 => 0xc041, - TLS_DHE_DSS_WITH_ARIA_128_CBC_SHA256 => 0xc042, - TLS_DHE_DSS_WITH_ARIA_256_CBC_SHA384 => 0xc043, - TLS_DHE_RSA_WITH_ARIA_128_CBC_SHA256 => 0xc044, - TLS_DHE_RSA_WITH_ARIA_256_CBC_SHA384 => 0xc045, - TLS_DH_anon_WITH_ARIA_128_CBC_SHA256 => 0xc046, - TLS_DH_anon_WITH_ARIA_256_CBC_SHA384 => 0xc047, - TLS_ECDHE_ECDSA_WITH_ARIA_128_CBC_SHA256 => 0xc048, - TLS_ECDHE_ECDSA_WITH_ARIA_256_CBC_SHA384 => 0xc049, - TLS_ECDH_ECDSA_WITH_ARIA_128_CBC_SHA256 => 0xc04a, - TLS_ECDH_ECDSA_WITH_ARIA_256_CBC_SHA384 => 0xc04b, - TLS_ECDHE_RSA_WITH_ARIA_128_CBC_SHA256 => 0xc04c, - TLS_ECDHE_RSA_WITH_ARIA_256_CBC_SHA384 => 0xc04d, - TLS_ECDH_RSA_WITH_ARIA_128_CBC_SHA256 => 0xc04e, - TLS_ECDH_RSA_WITH_ARIA_256_CBC_SHA384 => 0xc04f, - TLS_RSA_WITH_ARIA_128_GCM_SHA256 => 0xc050, - TLS_RSA_WITH_ARIA_256_GCM_SHA384 => 0xc051, - TLS_DHE_RSA_WITH_ARIA_128_GCM_SHA256 => 0xc052, - TLS_DHE_RSA_WITH_ARIA_256_GCM_SHA384 => 0xc053, - TLS_DH_RSA_WITH_ARIA_128_GCM_SHA256 => 0xc054, - TLS_DH_RSA_WITH_ARIA_256_GCM_SHA384 => 0xc055, - TLS_DHE_DSS_WITH_ARIA_128_GCM_SHA256 => 0xc056, - TLS_DHE_DSS_WITH_ARIA_256_GCM_SHA384 => 0xc057, - TLS_DH_DSS_WITH_ARIA_128_GCM_SHA256 => 0xc058, - TLS_DH_DSS_WITH_ARIA_256_GCM_SHA384 => 0xc059, - TLS_DH_anon_WITH_ARIA_128_GCM_SHA256 => 0xc05a, - TLS_DH_anon_WITH_ARIA_256_GCM_SHA384 => 0xc05b, - TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256 => 0xc05c, - TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384 => 0xc05d, - TLS_ECDH_ECDSA_WITH_ARIA_128_GCM_SHA256 => 0xc05e, - TLS_ECDH_ECDSA_WITH_ARIA_256_GCM_SHA384 => 0xc05f, - TLS_ECDHE_RSA_WITH_ARIA_128_GCM_SHA256 => 0xc060, - TLS_ECDHE_RSA_WITH_ARIA_256_GCM_SHA384 => 0xc061, - TLS_ECDH_RSA_WITH_ARIA_128_GCM_SHA256 => 0xc062, - TLS_ECDH_RSA_WITH_ARIA_256_GCM_SHA384 => 0xc063, - TLS_PSK_WITH_ARIA_128_CBC_SHA256 => 0xc064, - TLS_PSK_WITH_ARIA_256_CBC_SHA384 => 0xc065, - TLS_DHE_PSK_WITH_ARIA_128_CBC_SHA256 => 0xc066, - TLS_DHE_PSK_WITH_ARIA_256_CBC_SHA384 => 0xc067, - TLS_RSA_PSK_WITH_ARIA_128_CBC_SHA256 => 0xc068, - TLS_RSA_PSK_WITH_ARIA_256_CBC_SHA384 => 0xc069, - TLS_PSK_WITH_ARIA_128_GCM_SHA256 => 0xc06a, - TLS_PSK_WITH_ARIA_256_GCM_SHA384 => 0xc06b, - TLS_DHE_PSK_WITH_ARIA_128_GCM_SHA256 => 0xc06c, - TLS_DHE_PSK_WITH_ARIA_256_GCM_SHA384 => 0xc06d, - TLS_RSA_PSK_WITH_ARIA_128_GCM_SHA256 => 0xc06e, - TLS_RSA_PSK_WITH_ARIA_256_GCM_SHA384 => 0xc06f, - TLS_ECDHE_PSK_WITH_ARIA_128_CBC_SHA256 => 0xc070, - TLS_ECDHE_PSK_WITH_ARIA_256_CBC_SHA384 => 0xc071, - TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 => 0xc072, - TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 => 0xc073, - TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 => 0xc074, - TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 => 0xc075, - TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 => 0xc076, - TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384 => 0xc077, - TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256 => 0xc078, - TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384 => 0xc079, - TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256 => 0xc07a, - TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384 => 0xc07b, - TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 => 0xc07c, - TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 => 0xc07d, - TLS_DH_RSA_WITH_CAMELLIA_128_GCM_SHA256 => 0xc07e, - TLS_DH_RSA_WITH_CAMELLIA_256_GCM_SHA384 => 0xc07f, - TLS_DHE_DSS_WITH_CAMELLIA_128_GCM_SHA256 => 0xc080, - TLS_DHE_DSS_WITH_CAMELLIA_256_GCM_SHA384 => 0xc081, - TLS_DH_DSS_WITH_CAMELLIA_128_GCM_SHA256 => 0xc082, - TLS_DH_DSS_WITH_CAMELLIA_256_GCM_SHA384 => 0xc083, - TLS_DH_anon_WITH_CAMELLIA_128_GCM_SHA256 => 0xc084, - TLS_DH_anon_WITH_CAMELLIA_256_GCM_SHA384 => 0xc085, - TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 => 0xc086, - TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 => 0xc087, - TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 => 0xc088, - TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 => 0xc089, - TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 => 0xc08a, - TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 => 0xc08b, - TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256 => 0xc08c, - TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384 => 0xc08d, - TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256 => 0xc08e, - TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384 => 0xc08f, - TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256 => 0xc090, - TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384 => 0xc091, - TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256 => 0xc092, - TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384 => 0xc093, - TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256 => 0xc094, - TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384 => 0xc095, - TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 => 0xc096, - TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 => 0xc097, - TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256 => 0xc098, - TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384 => 0xc099, - TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 => 0xc09a, - TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 => 0xc09b, - TLS_RSA_WITH_AES_128_CCM => 0xc09c, - TLS_RSA_WITH_AES_256_CCM => 0xc09d, - TLS_DHE_RSA_WITH_AES_128_CCM => 0xc09e, - TLS_DHE_RSA_WITH_AES_256_CCM => 0xc09f, - TLS_RSA_WITH_AES_128_CCM_8 => 0xc0a0, - TLS_RSA_WITH_AES_256_CCM_8 => 0xc0a1, - TLS_DHE_RSA_WITH_AES_128_CCM_8 => 0xc0a2, - TLS_DHE_RSA_WITH_AES_256_CCM_8 => 0xc0a3, - TLS_PSK_WITH_AES_128_CCM => 0xc0a4, - TLS_PSK_WITH_AES_256_CCM => 0xc0a5, - TLS_DHE_PSK_WITH_AES_128_CCM => 0xc0a6, - TLS_DHE_PSK_WITH_AES_256_CCM => 0xc0a7, - TLS_PSK_WITH_AES_128_CCM_8 => 0xc0a8, - TLS_PSK_WITH_AES_256_CCM_8 => 0xc0a9, - TLS_PSK_DHE_WITH_AES_128_CCM_8 => 0xc0aa, - TLS_PSK_DHE_WITH_AES_256_CCM_8 => 0xc0ab, - TLS_ECDHE_ECDSA_WITH_AES_128_CCM => 0xc0ac, - TLS_ECDHE_ECDSA_WITH_AES_256_CCM => 0xc0ad, - TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 => 0xc0ae, - TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8 => 0xc0af, - TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 => 0xcca8, - TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 => 0xcca9, - TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256 => 0xccaa, - TLS_PSK_WITH_CHACHA20_POLY1305_SHA256 => 0xccab, - TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256 => 0xccac, - TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256 => 0xccad, - TLS_RSA_PSK_WITH_CHACHA20_POLY1305_SHA256 => 0xccae, - SSL_RSA_FIPS_WITH_DES_CBC_SHA => 0xfefe, - SSL_RSA_FIPS_WITH_3DES_EDE_CBC_SHA => 0xfeff - } -} - -enum_builder! { - /// The `SignatureScheme` TLS protocol enum. Values in this enum are taken - /// from the various RFCs covering TLS, and are listed by IANA. - /// The `Unknown` item is used when processing unrecognised ordinals. - @U16 - EnumName: SignatureScheme; - EnumVal{ - RSA_PKCS1_SHA1 => 0x0201, - ECDSA_SHA1_Legacy => 0x0203, - RSA_PKCS1_SHA256 => 0x0401, - ECDSA_NISTP256_SHA256 => 0x0403, - RSA_PKCS1_SHA384 => 0x0501, - ECDSA_NISTP384_SHA384 => 0x0503, - RSA_PKCS1_SHA512 => 0x0601, - ECDSA_NISTP521_SHA512 => 0x0603, - RSA_PSS_SHA256 => 0x0804, - RSA_PSS_SHA384 => 0x0805, - RSA_PSS_SHA512 => 0x0806, - ED25519 => 0x0807, - ED448 => 0x0808 - } -} diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/src/error.rs temporalio-1.3.0/vendor/rustls-0.20.9/src/error.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/src/error.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/src/error.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,245 +0,0 @@ -use crate::msgs::enums::{AlertDescription, ContentType, HandshakeType}; -use crate::rand; - -use std::error::Error as StdError; -use std::fmt; -use std::time::SystemTimeError; - -/// rustls reports protocol errors using this type. -#[derive(Debug, PartialEq, Clone)] -pub enum Error { - /// We received a TLS message that isn't valid right now. - /// `expect_types` lists the message types we can expect right now. - /// `got_type` is the type we found. This error is typically - /// caused by a buggy TLS stack (the peer or this one), a broken - /// network, or an attack. - InappropriateMessage { - /// Which types we expected - expect_types: Vec, - /// What type we received - got_type: ContentType, - }, - - /// We received a TLS handshake message that isn't valid right now. - /// `expect_types` lists the handshake message types we can expect - /// right now. `got_type` is the type we found. - InappropriateHandshakeMessage { - /// Which handshake type we expected - expect_types: Vec, - /// What handshake type we received - got_type: HandshakeType, - }, - - /// The peer sent us a syntactically incorrect TLS message. - CorruptMessage, - - /// The peer sent us a TLS message with invalid contents. - CorruptMessagePayload(ContentType), - - /// The peer didn't give us any certificates. - NoCertificatesPresented, - - /// The certificate verifier doesn't support the given type of name. - UnsupportedNameType, - - /// We couldn't decrypt a message. This is invariably fatal. - DecryptError, - - /// We couldn't encrypt a message because it was larger than the allowed message size. - /// This should never happen if the application is using valid record sizes. - EncryptError, - - /// The peer doesn't support a protocol version/feature we require. - /// The parameter gives a hint as to what version/feature it is. - PeerIncompatibleError(String), - - /// The peer deviated from the standard TLS protocol. - /// The parameter gives a hint where. - PeerMisbehavedError(String), - - /// We received a fatal alert. This means the peer is unhappy. - AlertReceived(AlertDescription), - - /// We received an invalidly encoded certificate from the peer. - InvalidCertificateEncoding, - - /// We received a certificate with invalid signature type. - InvalidCertificateSignatureType, - - /// We received a certificate with invalid signature. - InvalidCertificateSignature, - - /// We received a certificate which includes invalid data. - InvalidCertificateData(String), - - /// The presented SCT(s) were invalid. - InvalidSct(sct::Error), - - /// A catch-all error for unlikely errors. - General(String), - - /// We failed to figure out what time it currently is. - FailedToGetCurrentTime, - - /// We failed to acquire random bytes from the system. - FailedToGetRandomBytes, - - /// This function doesn't work until the TLS handshake - /// is complete. - HandshakeNotComplete, - - /// The peer sent an oversized record/fragment. - PeerSentOversizedRecord, - - /// An incoming connection did not support any known application protocol. - NoApplicationProtocol, - - /// The `max_fragment_size` value supplied in configuration was too small, - /// or too large. - BadMaxFragmentSize, -} - -fn join(items: &[T]) -> String { - items - .iter() - .map(|x| format!("{:?}", x)) - .collect::>() - .join(" or ") -} - -impl fmt::Display for Error { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - match *self { - Self::InappropriateMessage { - ref expect_types, - ref got_type, - } => write!( - f, - "received unexpected message: got {:?} when expecting {}", - got_type, - join::(expect_types) - ), - Self::InappropriateHandshakeMessage { - ref expect_types, - ref got_type, - } => write!( - f, - "received unexpected handshake message: got {:?} when expecting {}", - got_type, - join::(expect_types) - ), - Self::CorruptMessagePayload(ref typ) => { - write!(f, "received corrupt message of type {:?}", typ) - } - Self::PeerIncompatibleError(ref why) => write!(f, "peer is incompatible: {}", why), - Self::PeerMisbehavedError(ref why) => write!(f, "peer misbehaved: {}", why), - Self::AlertReceived(ref alert) => write!(f, "received fatal alert: {:?}", alert), - Self::InvalidCertificateEncoding => { - write!(f, "invalid peer certificate encoding") - } - Self::InvalidCertificateSignatureType => { - write!(f, "invalid peer certificate signature type") - } - Self::InvalidCertificateSignature => { - write!(f, "invalid peer certificate signature") - } - Self::InvalidCertificateData(ref reason) => { - write!(f, "invalid peer certificate contents: {}", reason) - } - Self::CorruptMessage => write!(f, "received corrupt message"), - Self::NoCertificatesPresented => write!(f, "peer sent no certificates"), - Self::UnsupportedNameType => write!(f, "presented server name type wasn't supported"), - Self::DecryptError => write!(f, "cannot decrypt peer's message"), - Self::EncryptError => write!(f, "cannot encrypt message"), - Self::PeerSentOversizedRecord => write!(f, "peer sent excess record size"), - Self::HandshakeNotComplete => write!(f, "handshake not complete"), - Self::NoApplicationProtocol => write!(f, "peer doesn't support any known protocol"), - Self::InvalidSct(ref err) => write!(f, "invalid certificate timestamp: {:?}", err), - Self::FailedToGetCurrentTime => write!(f, "failed to get current time"), - Self::FailedToGetRandomBytes => write!(f, "failed to get random bytes"), - Self::BadMaxFragmentSize => { - write!(f, "the supplied max_fragment_size was too small or large") - } - Self::General(ref err) => write!(f, "unexpected error: {}", err), - } - } -} - -impl From for Error { - #[inline] - fn from(_: SystemTimeError) -> Self { - Self::FailedToGetCurrentTime - } -} - -impl StdError for Error {} - -impl From for Error { - fn from(_: rand::GetRandomFailed) -> Self { - Self::FailedToGetRandomBytes - } -} - -#[cfg(test)] -mod tests { - use super::Error; - - #[test] - fn smoke() { - use crate::msgs::enums::{AlertDescription, ContentType, HandshakeType}; - use sct; - - let all = vec![ - Error::InappropriateMessage { - expect_types: vec![ContentType::Alert], - got_type: ContentType::Handshake, - }, - Error::InappropriateHandshakeMessage { - expect_types: vec![HandshakeType::ClientHello, HandshakeType::Finished], - got_type: HandshakeType::ServerHello, - }, - Error::CorruptMessage, - Error::CorruptMessagePayload(ContentType::Alert), - Error::NoCertificatesPresented, - Error::DecryptError, - Error::PeerIncompatibleError("no tls1.2".to_string()), - Error::PeerMisbehavedError("inconsistent something".to_string()), - Error::AlertReceived(AlertDescription::ExportRestriction), - Error::InvalidCertificateEncoding, - Error::InvalidCertificateSignatureType, - Error::InvalidCertificateSignature, - Error::InvalidCertificateData("Data".into()), - Error::InvalidSct(sct::Error::MalformedSct), - Error::General("undocumented error".to_string()), - Error::FailedToGetCurrentTime, - Error::FailedToGetRandomBytes, - Error::HandshakeNotComplete, - Error::PeerSentOversizedRecord, - Error::NoApplicationProtocol, - Error::BadMaxFragmentSize, - ]; - - for err in all { - println!("{:?}:", err); - println!(" fmt '{}'", err); - } - } - - #[test] - fn rand_error_mapping() { - use super::rand; - let err: Error = rand::GetRandomFailed.into(); - assert_eq!(err, Error::FailedToGetRandomBytes); - } - - #[test] - fn time_error_mapping() { - use std::time::SystemTime; - - let time_error = SystemTime::UNIX_EPOCH - .duration_since(SystemTime::now()) - .unwrap_err(); - let err: Error = time_error.into(); - assert_eq!(err, Error::FailedToGetCurrentTime); - } -} diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/src/hash_hs.rs temporalio-1.3.0/vendor/rustls-0.20.9/src/hash_hs.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/src/hash_hs.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/src/hash_hs.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,240 +0,0 @@ -use crate::msgs::codec::Codec; -use crate::msgs::handshake::HandshakeMessagePayload; -use crate::msgs::message::{Message, MessagePayload}; -use ring::digest; -use std::mem; - -/// Early stage buffering of handshake payloads. -/// -/// Before we know the hash algorithm to use to verify the handshake, we just buffer the messages. -/// During the handshake, we may restart the transcript due to a HelloRetryRequest, reverting -/// from the `HandshakeHash` to a `HandshakeHashBuffer` again. -pub(crate) struct HandshakeHashBuffer { - buffer: Vec, - client_auth_enabled: bool, -} - -impl HandshakeHashBuffer { - pub(crate) fn new() -> Self { - Self { - buffer: Vec::new(), - client_auth_enabled: false, - } - } - - /// We might be doing client auth, so need to keep a full - /// log of the handshake. - pub(crate) fn set_client_auth_enabled(&mut self) { - self.client_auth_enabled = true; - } - - /// Hash/buffer a handshake message. - pub(crate) fn add_message(&mut self, m: &Message) { - if let MessagePayload::Handshake { encoded, .. } = &m.payload { - self.buffer - .extend_from_slice(&encoded.0); - } - } - - /// Hash or buffer a byte slice. - #[cfg(test)] - fn update_raw(&mut self, buf: &[u8]) { - self.buffer.extend_from_slice(buf); - } - - /// Get the hash value if we were to hash `extra` too. - pub(crate) fn get_hash_given( - &self, - hash: &'static digest::Algorithm, - extra: &[u8], - ) -> digest::Digest { - let mut ctx = digest::Context::new(hash); - ctx.update(&self.buffer); - ctx.update(extra); - ctx.finish() - } - - /// We now know what hash function the verify_data will use. - pub(crate) fn start_hash(self, alg: &'static digest::Algorithm) -> HandshakeHash { - let mut ctx = digest::Context::new(alg); - ctx.update(&self.buffer); - HandshakeHash { - ctx, - client_auth: match self.client_auth_enabled { - true => Some(self.buffer), - false => None, - }, - } - } -} - -/// This deals with keeping a running hash of the handshake -/// payloads. This is computed by buffering initially. Once -/// we know what hash function we need to use we switch to -/// incremental hashing. -/// -/// For client auth, we also need to buffer all the messages. -/// This is disabled in cases where client auth is not possible. -pub(crate) struct HandshakeHash { - /// None before we know what hash function we're using - ctx: digest::Context, - - /// buffer for client-auth. - client_auth: Option>, -} - -impl HandshakeHash { - /// We decided not to do client auth after all, so discard - /// the transcript. - pub(crate) fn abandon_client_auth(&mut self) { - self.client_auth = None; - } - - /// Hash/buffer a handshake message. - pub(crate) fn add_message(&mut self, m: &Message) -> &mut Self { - if let MessagePayload::Handshake { encoded, .. } = &m.payload { - self.update_raw(&encoded.0); - } - self - } - - /// Hash or buffer a byte slice. - fn update_raw(&mut self, buf: &[u8]) -> &mut Self { - self.ctx.update(buf); - - if let Some(buffer) = &mut self.client_auth { - buffer.extend_from_slice(buf); - } - - self - } - - /// Get the hash value if we were to hash `extra` too, - /// using hash function `hash`. - pub(crate) fn get_hash_given(&self, extra: &[u8]) -> digest::Digest { - let mut ctx = self.ctx.clone(); - ctx.update(extra); - ctx.finish() - } - - pub(crate) fn into_hrr_buffer(self) -> HandshakeHashBuffer { - let old_hash = self.ctx.finish(); - let old_handshake_hash_msg = - HandshakeMessagePayload::build_handshake_hash(old_hash.as_ref()); - - HandshakeHashBuffer { - client_auth_enabled: self.client_auth.is_some(), - buffer: old_handshake_hash_msg.get_encoding(), - } - } - - /// Take the current hash value, and encapsulate it in a - /// 'handshake_hash' handshake message. Start this hash - /// again, with that message at the front. - pub(crate) fn rollup_for_hrr(&mut self) { - let ctx = &mut self.ctx; - - let old_ctx = mem::replace(ctx, digest::Context::new(ctx.algorithm())); - let old_hash = old_ctx.finish(); - let old_handshake_hash_msg = - HandshakeMessagePayload::build_handshake_hash(old_hash.as_ref()); - - self.update_raw(&old_handshake_hash_msg.get_encoding()); - } - - /// Get the current hash value. - pub(crate) fn get_current_hash(&self) -> digest::Digest { - self.ctx.clone().finish() - } - - /// Takes this object's buffer containing all handshake messages - /// so far. This method only works once; it resets the buffer - /// to empty. - #[cfg(feature = "tls12")] - pub(crate) fn take_handshake_buf(&mut self) -> Option> { - self.client_auth.take() - } - - /// The digest algorithm - pub(crate) fn algorithm(&self) -> &'static digest::Algorithm { - self.ctx.algorithm() - } -} - -#[cfg(test)] -mod test { - use super::HandshakeHashBuffer; - use ring::digest; - - #[test] - fn hashes_correctly() { - let mut hhb = HandshakeHashBuffer::new(); - hhb.update_raw(b"hello"); - assert_eq!(hhb.buffer.len(), 5); - let mut hh = hhb.start_hash(&digest::SHA256); - assert!(hh.client_auth.is_none()); - hh.update_raw(b"world"); - let h = hh.get_current_hash(); - let h = h.as_ref(); - assert_eq!(h[0], 0x93); - assert_eq!(h[1], 0x6a); - assert_eq!(h[2], 0x18); - assert_eq!(h[3], 0x5c); - } - - #[cfg(feature = "tls12")] - #[test] - fn buffers_correctly() { - let mut hhb = HandshakeHashBuffer::new(); - hhb.set_client_auth_enabled(); - hhb.update_raw(b"hello"); - assert_eq!(hhb.buffer.len(), 5); - let mut hh = hhb.start_hash(&digest::SHA256); - assert_eq!( - hh.client_auth - .as_ref() - .map(|buf| buf.len()), - Some(5) - ); - hh.update_raw(b"world"); - assert_eq!( - hh.client_auth - .as_ref() - .map(|buf| buf.len()), - Some(10) - ); - let h = hh.get_current_hash(); - let h = h.as_ref(); - assert_eq!(h[0], 0x93); - assert_eq!(h[1], 0x6a); - assert_eq!(h[2], 0x18); - assert_eq!(h[3], 0x5c); - let buf = hh.take_handshake_buf(); - assert_eq!(Some(b"helloworld".to_vec()), buf); - } - - #[test] - fn abandon() { - let mut hhb = HandshakeHashBuffer::new(); - hhb.set_client_auth_enabled(); - hhb.update_raw(b"hello"); - assert_eq!(hhb.buffer.len(), 5); - let mut hh = hhb.start_hash(&digest::SHA256); - assert_eq!( - hh.client_auth - .as_ref() - .map(|buf| buf.len()), - Some(5) - ); - hh.abandon_client_auth(); - assert_eq!(hh.client_auth, None); - hh.update_raw(b"world"); - assert_eq!(hh.client_auth, None); - let h = hh.get_current_hash(); - let h = h.as_ref(); - assert_eq!(h[0], 0x93); - assert_eq!(h[1], 0x6a); - assert_eq!(h[2], 0x18); - assert_eq!(h[3], 0x5c); - } -} diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/src/key_log_file.rs temporalio-1.3.0/vendor/rustls-0.20.9/src/key_log_file.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/src/key_log_file.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/src/key_log_file.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,154 +0,0 @@ -#[cfg(feature = "logging")] -use crate::log::warn; -use crate::KeyLog; -use std::env; -use std::fs::{File, OpenOptions}; -use std::io; -use std::io::Write; -use std::path::Path; -use std::sync::Mutex; - -// Internal mutable state for KeyLogFile -struct KeyLogFileInner { - file: Option, - buf: Vec, -} - -impl KeyLogFileInner { - fn new(var: Result) -> Self { - let path = match var { - Ok(ref s) => Path::new(s), - Err(env::VarError::NotUnicode(ref s)) => Path::new(s), - Err(env::VarError::NotPresent) => { - return Self { - file: None, - buf: Vec::new(), - }; - } - }; - - #[cfg_attr(not(feature = "logging"), allow(unused_variables))] - let file = match OpenOptions::new() - .append(true) - .create(true) - .open(path) - { - Ok(f) => Some(f), - Err(e) => { - warn!("unable to create key log file {:?}: {}", path, e); - None - } - }; - - Self { - file, - buf: Vec::new(), - } - } - - fn try_write(&mut self, label: &str, client_random: &[u8], secret: &[u8]) -> io::Result<()> { - let mut file = match self.file { - None => { - return Ok(()); - } - Some(ref f) => f, - }; - - self.buf.truncate(0); - write!(self.buf, "{} ", label)?; - for b in client_random.iter() { - write!(self.buf, "{:02x}", b)?; - } - write!(self.buf, " ")?; - for b in secret.iter() { - write!(self.buf, "{:02x}", b)?; - } - writeln!(self.buf)?; - file.write_all(&self.buf) - } -} - -/// [`KeyLog`] implementation that opens a file whose name is -/// given by the `SSLKEYLOGFILE` environment variable, and writes -/// keys into it. -/// -/// If `SSLKEYLOGFILE` is not set, this does nothing. -/// -/// If such a file cannot be opened, or cannot be written then -/// this does nothing but logs errors at warning-level. -pub struct KeyLogFile(Mutex); - -impl KeyLogFile { - /// Makes a new `KeyLogFile`. The environment variable is - /// inspected and the named file is opened during this call. - pub fn new() -> Self { - let var = env::var("SSLKEYLOGFILE"); - Self(Mutex::new(KeyLogFileInner::new(var))) - } -} - -impl KeyLog for KeyLogFile { - fn log(&self, label: &str, client_random: &[u8], secret: &[u8]) { - #[cfg_attr(not(feature = "logging"), allow(unused_variables))] - match self - .0 - .lock() - .unwrap() - .try_write(label, client_random, secret) - { - Ok(()) => {} - Err(e) => { - warn!("error writing to key log file: {}", e); - } - } - } -} - -#[cfg(all(test, target_os = "linux"))] -mod test { - use super::*; - - fn init() { - let _ = env_logger::builder() - .is_test(true) - .try_init(); - } - - #[test] - fn test_env_var_is_not_unicode() { - init(); - let mut inner = KeyLogFileInner::new(Err(env::VarError::NotUnicode( - "/tmp/keylogfileinnertest".into(), - ))); - assert!(inner - .try_write("label", b"random", b"secret") - .is_ok()); - } - - #[test] - fn test_env_var_is_not_set() { - init(); - let mut inner = KeyLogFileInner::new(Err(env::VarError::NotPresent)); - assert!(inner - .try_write("label", b"random", b"secret") - .is_ok()); - } - - #[test] - fn test_env_var_cannot_be_opened() { - init(); - let mut inner = KeyLogFileInner::new(Ok("/dev/does-not-exist".into())); - assert!(inner - .try_write("label", b"random", b"secret") - .is_ok()); - } - - #[test] - fn test_env_var_cannot_be_written() { - init(); - let mut inner = KeyLogFileInner::new(Ok("/dev/full".into())); - assert!(inner - .try_write("label", b"random", b"secret") - .is_err()); - } -} diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/src/key_log.rs temporalio-1.3.0/vendor/rustls-0.20.9/src/key_log.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/src/key_log.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/src/key_log.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,55 +0,0 @@ -/// This trait represents the ability to do something useful -/// with key material, such as logging it to a file for debugging. -/// -/// Naturally, secrets passed over the interface are *extremely* -/// sensitive and can break the security of past, present and -/// future sessions. -/// -/// You'll likely want some interior mutability in your -/// implementation to make this useful. -/// -/// See [`KeyLogFile`](crate::KeyLogFile) that implements the standard -/// `SSLKEYLOGFILE` environment variable behaviour. -pub trait KeyLog: Send + Sync { - /// Log the given `secret`. `client_random` is provided for - /// session identification. `label` describes precisely what - /// `secret` means: - /// - /// - `CLIENT_RANDOM`: `secret` is the master secret for a TLSv1.2 session. - /// - `CLIENT_EARLY_TRAFFIC_SECRET`: `secret` encrypts early data - /// transmitted by a client - /// - `SERVER_HANDSHAKE_TRAFFIC_SECRET`: `secret` encrypts - /// handshake messages from the server during a TLSv1.3 handshake. - /// - `CLIENT_HANDSHAKE_TRAFFIC_SECRET`: `secret` encrypts - /// handshake messages from the client during a TLSv1.3 handshake. - /// - `SERVER_TRAFFIC_SECRET_0`: `secret` encrypts post-handshake data - /// from the server in a TLSv1.3 session. - /// - `CLIENT_TRAFFIC_SECRET_0`: `secret` encrypts post-handshake data - /// from the client in a TLSv1.3 session. - /// - `EXPORTER_SECRET`: `secret` is the post-handshake exporter secret - /// in a TLSv1.3 session. - /// - /// These strings are selected to match the NSS key log format: - /// - fn log(&self, label: &str, client_random: &[u8], secret: &[u8]); - - /// Indicates whether the secret with label `label` will be logged. - /// - /// If `will_log` returns true then `log` will be called with the secret. - /// Otherwise, `log` will not be called for the secret. This is a - /// performance optimization. - fn will_log(&self, _label: &str) -> bool { - true - } -} - -/// KeyLog that does exactly nothing. -pub struct NoKeyLog; - -impl KeyLog for NoKeyLog { - fn log(&self, _: &str, _: &[u8], _: &[u8]) {} - #[inline] - fn will_log(&self, _label: &str) -> bool { - false - } -} diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/src/key.rs temporalio-1.3.0/vendor/rustls-0.20.9/src/key.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/src/key.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/src/key.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,52 +0,0 @@ -use std::fmt; - -/// This type contains a private key by value. -/// -/// The private key must be DER-encoded ASN.1 in either -/// PKCS#8 or PKCS#1 format. -/// -/// The `rustls-pemfile` crate can be used to extract -/// private keys from a PEM file in these formats. -#[derive(Debug, Clone, Eq, PartialEq)] -pub struct PrivateKey(pub Vec); - -/// This type contains a single certificate by value. -/// -/// The certificate must be DER-encoded X.509. -/// -/// The `rustls-pemfile` crate can be used to parse a PEM file. -/// -/// ## Note -/// -/// If you are receiving certificates from an untrusted client or server, the contents -/// must be validated manually. -#[derive(Clone, Eq, Hash, Ord, PartialEq, PartialOrd)] -pub struct Certificate(pub Vec); - -impl AsRef<[u8]> for Certificate { - fn as_ref(&self) -> &[u8] { - &self.0 - } -} - -impl fmt::Debug for Certificate { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - use super::bs_debug::BsDebug; - f.debug_tuple("Certificate") - .field(&BsDebug(&self.0)) - .finish() - } -} - -#[cfg(test)] -mod test { - use super::Certificate; - - #[test] - fn certificate_debug() { - assert_eq!( - "Certificate(b\"ab\")", - format!("{:?}", Certificate(b"ab".to_vec())) - ); - } -} diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/src/kx.rs temporalio-1.3.0/vendor/rustls-0.20.9/src/kx.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/src/kx.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/src/kx.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,100 +0,0 @@ -use std::fmt; - -use crate::error::Error; -use crate::msgs::enums::NamedGroup; - -/// An in-progress key exchange. This has the algorithm, -/// our private key, and our public key. -pub(crate) struct KeyExchange { - skxg: &'static SupportedKxGroup, - privkey: ring::agreement::EphemeralPrivateKey, - pub(crate) pubkey: ring::agreement::PublicKey, -} - -impl KeyExchange { - /// Choose a SupportedKxGroup by name, from a list of supported groups. - pub(crate) fn choose( - name: NamedGroup, - supported: &[&'static SupportedKxGroup], - ) -> Option<&'static SupportedKxGroup> { - supported - .iter() - .find(|skxg| skxg.name == name) - .cloned() - } - - /// Start a key exchange, using the given SupportedKxGroup. - /// - /// This generates an ephemeral key pair and stores it in the returned KeyExchange object. - pub(crate) fn start(skxg: &'static SupportedKxGroup) -> Option { - let rng = ring::rand::SystemRandom::new(); - let ours = - ring::agreement::EphemeralPrivateKey::generate(skxg.agreement_algorithm, &rng).ok()?; - - let pubkey = ours.compute_public_key().ok()?; - - Some(Self { - skxg, - privkey: ours, - pubkey, - }) - } - - /// Return the group being used. - pub(crate) fn group(&self) -> NamedGroup { - self.skxg.name - } - - /// Completes the key exchange, given the peer's public key. - /// - /// The shared secret is passed into the closure passed down in `f`, and the result of calling - /// `f` is returned to the caller. - pub(crate) fn complete( - self, - peer: &[u8], - f: impl FnOnce(&[u8]) -> Result, - ) -> Result { - let peer_key = ring::agreement::UnparsedPublicKey::new(self.skxg.agreement_algorithm, peer); - ring::agreement::agree_ephemeral(self.privkey, &peer_key, (), f) - .map_err(|()| Error::PeerMisbehavedError("key agreement failed".to_string())) - } -} - -/// A key-exchange group supported by rustls. -/// -/// All possible instances of this class are provided by the library in -/// the `ALL_KX_GROUPS` array. -pub struct SupportedKxGroup { - /// The IANA "TLS Supported Groups" name of the group - pub name: NamedGroup, - - /// The corresponding ring agreement::Algorithm - agreement_algorithm: &'static ring::agreement::Algorithm, -} - -impl fmt::Debug for SupportedKxGroup { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - self.name.fmt(f) - } -} - -/// Ephemeral ECDH on curve25519 (see RFC7748) -pub static X25519: SupportedKxGroup = SupportedKxGroup { - name: NamedGroup::X25519, - agreement_algorithm: &ring::agreement::X25519, -}; - -/// Ephemeral ECDH on secp256r1 (aka NIST-P256) -pub static SECP256R1: SupportedKxGroup = SupportedKxGroup { - name: NamedGroup::secp256r1, - agreement_algorithm: &ring::agreement::ECDH_P256, -}; - -/// Ephemeral ECDH on secp384r1 (aka NIST-P384) -pub static SECP384R1: SupportedKxGroup = SupportedKxGroup { - name: NamedGroup::secp384r1, - agreement_algorithm: &ring::agreement::ECDH_P384, -}; - -/// A list of all the key exchange groups supported by rustls. -pub static ALL_KX_GROUPS: [&SupportedKxGroup; 3] = [&X25519, &SECP256R1, &SECP384R1]; diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/src/lib.rs temporalio-1.3.0/vendor/rustls-0.20.9/src/lib.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/src/lib.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,529 +0,0 @@ -//! # Rustls - a modern TLS library -//! Rustls is a TLS library that aims to provide a good level of cryptographic security, -//! requires no configuration to achieve that security, and provides no unsafe features or -//! obsolete cryptography. -//! -//! ## Current features -//! -//! * TLS1.2 and TLS1.3. -//! * ECDSA, Ed25519 or RSA server authentication by clients. -//! * ECDSA, Ed25519 or RSA server authentication by servers. -//! * Forward secrecy using ECDHE; with curve25519, nistp256 or nistp384 curves. -//! * AES128-GCM and AES256-GCM bulk encryption, with safe nonces. -//! * ChaCha20-Poly1305 bulk encryption ([RFC7905](https://tools.ietf.org/html/rfc7905)). -//! * ALPN support. -//! * SNI support. -//! * Tunable fragment size to make TLS messages match size of underlying transport. -//! * Optional use of vectored IO to minimise system calls. -//! * TLS1.2 session resumption. -//! * TLS1.2 resumption via tickets ([RFC5077](https://tools.ietf.org/html/rfc5077)). -//! * TLS1.3 resumption via tickets or session storage. -//! * TLS1.3 0-RTT data for clients. -//! * TLS1.3 0-RTT data for servers. -//! * Client authentication by clients. -//! * Client authentication by servers. -//! * Extended master secret support ([RFC7627](https://tools.ietf.org/html/rfc7627)). -//! * Exporters ([RFC5705](https://tools.ietf.org/html/rfc5705)). -//! * OCSP stapling by servers. -//! * SCT stapling by servers. -//! * SCT verification by clients. -//! -//! ## Possible future features -//! -//! * PSK support. -//! * OCSP verification by clients. -//! * Certificate pinning. -//! -//! ## Non-features -//! -//! For reasons [explained in the manual](manual), -//! rustls does not and will not support: -//! -//! * SSL1, SSL2, SSL3, TLS1 or TLS1.1. -//! * RC4. -//! * DES or triple DES. -//! * EXPORT ciphersuites. -//! * MAC-then-encrypt ciphersuites. -//! * Ciphersuites without forward secrecy. -//! * Renegotiation. -//! * Kerberos. -//! * Compression. -//! * Discrete-log Diffie-Hellman. -//! * Automatic protocol version downgrade. -//! -//! There are plenty of other libraries that provide these features should you -//! need them. -//! -//! ### Platform support -//! -//! Rustls uses [`ring`](https://crates.io/crates/ring) for implementing the -//! cryptography in TLS. As a result, rustls only runs on platforms -//! [supported by `ring`](https://github.com/briansmith/ring#online-automated-testing). -//! At the time of writing this means x86, x86-64, armv7, and aarch64. -//! -//! ## Design Overview -//! ### Rustls does not take care of network IO -//! It doesn't make or accept TCP connections, or do DNS, or read or write files. -//! -//! There's example client and server code which uses mio to do all needed network -//! IO. -//! -//! ### Rustls provides encrypted pipes -//! These are the [`ServerConnection`] and [`ClientConnection`] types. You supply raw TLS traffic -//! on the left (via the [`read_tls()`] and [`write_tls()`] methods) and then read/write the -//! plaintext on the right: -//! -//! [`read_tls()`]: Connection::read_tls -//! [`write_tls()`]: Connection::read_tls -//! -//! ```text -//! TLS Plaintext -//! === ========= -//! read_tls() +-----------------------+ reader() as io::Read -//! | | -//! +---------> ClientConnection +---------> -//! | or | -//! <---------+ ServerConnection <---------+ -//! | | -//! write_tls() +-----------------------+ writer() as io::Write -//! ``` -//! -//! ### Rustls takes care of server certificate verification -//! You do not need to provide anything other than a set of root certificates to trust. -//! Certificate verification cannot be turned off or disabled in the main API. -//! -//! ## Getting started -//! This is the minimum you need to do to make a TLS client connection. -//! -//! First we load some root certificates. These are used to authenticate the server. -//! The recommended way is to depend on the `webpki_roots` crate which contains -//! the Mozilla set of root certificates. -//! -//! ```rust,no_run -//! let mut root_store = rustls::RootCertStore::empty(); -//! root_store.add_server_trust_anchors( -//! webpki_roots::TLS_SERVER_ROOTS -//! .0 -//! .iter() -//! .map(|ta| { -//! rustls::OwnedTrustAnchor::from_subject_spki_name_constraints( -//! ta.subject, -//! ta.spki, -//! ta.name_constraints, -//! ) -//! }) -//! ); -//! ``` -//! -//! Next, we make a `ClientConfig`. You're likely to make one of these per process, -//! and use it for all connections made by that process. -//! -//! ```rust,no_run -//! # let root_store: rustls::RootCertStore = panic!(); -//! let config = rustls::ClientConfig::builder() -//! .with_safe_defaults() -//! .with_root_certificates(root_store) -//! .with_no_client_auth(); -//! ``` -//! -//! Now we can make a connection. You need to provide the server's hostname so we -//! know what to expect to find in the server's certificate. -//! -//! ```rust -//! # use rustls; -//! # use webpki; -//! # use std::sync::Arc; -//! # use std::convert::TryInto; -//! # let mut root_store = rustls::RootCertStore::empty(); -//! # root_store.add_server_trust_anchors( -//! # webpki_roots::TLS_SERVER_ROOTS -//! # .0 -//! # .iter() -//! # .map(|ta| { -//! # rustls::OwnedTrustAnchor::from_subject_spki_name_constraints( -//! # ta.subject, -//! # ta.spki, -//! # ta.name_constraints, -//! # ) -//! # }) -//! # ); -//! # let config = rustls::ClientConfig::builder() -//! # .with_safe_defaults() -//! # .with_root_certificates(root_store) -//! # .with_no_client_auth(); -//! let rc_config = Arc::new(config); -//! let example_com = "example.com".try_into().unwrap(); -//! let mut client = rustls::ClientConnection::new(rc_config, example_com); -//! ``` -//! -//! Now you should do appropriate IO for the `client` object. If `client.wants_read()` yields -//! true, you should call `client.read_tls()` when the underlying connection has data. -//! Likewise, if `client.wants_write()` yields true, you should call `client.write_tls()` -//! when the underlying connection is able to send data. You should continue doing this -//! as long as the connection is valid. -//! -//! The return types of `read_tls()` and `write_tls()` only tell you if the IO worked. No -//! parsing or processing of the TLS messages is done. After each `read_tls()` you should -//! therefore call `client.process_new_packets()` which parses and processes the messages. -//! Any error returned from `process_new_packets` is fatal to the connection, and will tell you -//! why. For example, if the server's certificate is expired `process_new_packets` will -//! return `Err(WebPkiError(CertExpired, ValidateServerCert))`. From this point on, -//! `process_new_packets` will not do any new work and will return that error continually. -//! -//! You can extract newly received data by calling `client.reader()` (which implements the -//! `io::Read` trait). You can send data to the peer by calling `client.writer()` (which -//! implements `io::Write` trait). Note that `client.writer().write()` buffers data you -//! send if the TLS connection is not yet established: this is useful for writing (say) a -//! HTTP request, but this is buffered so avoid large amounts of data. -//! -//! The following code uses a fictional socket IO API for illustration, and does not handle -//! errors. -//! -//! ```rust,no_run -//! # let mut client = rustls::ClientConnection::new(panic!(), panic!()).unwrap(); -//! # struct Socket { } -//! # impl Socket { -//! # fn ready_for_write(&self) -> bool { false } -//! # fn ready_for_read(&self) -> bool { false } -//! # fn wait_for_something_to_happen(&self) { } -//! # } -//! # -//! # use std::io::{Read, Write, Result}; -//! # impl Read for Socket { -//! # fn read(&mut self, buf: &mut [u8]) -> Result { panic!() } -//! # } -//! # impl Write for Socket { -//! # fn write(&mut self, buf: &[u8]) -> Result { panic!() } -//! # fn flush(&mut self) -> Result<()> { panic!() } -//! # } -//! # -//! # fn connect(_address: &str, _port: u16) -> Socket { -//! # panic!(); -//! # } -//! use std::io; -//! use rustls::Connection; -//! -//! client.writer().write(b"GET / HTTP/1.0\r\n\r\n").unwrap(); -//! let mut socket = connect("example.com", 443); -//! loop { -//! if client.wants_read() && socket.ready_for_read() { -//! client.read_tls(&mut socket).unwrap(); -//! client.process_new_packets().unwrap(); -//! -//! let mut plaintext = Vec::new(); -//! client.reader().read_to_end(&mut plaintext).unwrap(); -//! io::stdout().write(&plaintext).unwrap(); -//! } -//! -//! if client.wants_write() && socket.ready_for_write() { -//! client.write_tls(&mut socket).unwrap(); -//! } -//! -//! socket.wait_for_something_to_happen(); -//! } -//! ``` -//! -//! # Examples -//! [`tlsserver`](https://github.com/rustls/rustls/blob/main/examples/src/bin/tlsserver-mio.rs) -//! and [`tlsclient`](https://github.com/rustls/rustls/blob/main/examples/src/bin/tlsclient-mio.rs) -//! are full worked examples. These both use mio. -//! -//! # Crate features -//! Here's a list of what features are exposed by the rustls crate and what -//! they mean. -//! -//! - `logging`: this makes the rustls crate depend on the `log` crate. -//! rustls outputs interesting protocol-level messages at `trace!` and `debug!` -//! level, and protocol-level errors at `warn!` and `error!` level. The log -//! messages do not contain secret key data, and so are safe to archive without -//! affecting session security. This feature is in the default set. -//! -//! - `dangerous_configuration`: this feature enables a `dangerous()` method on -//! `ClientConfig` and `ServerConfig` that allows setting inadvisable options, -//! such as replacing the certificate verification process. Applications -//! requesting this feature should be reviewed carefully. -//! -//! - `quic`: this feature exposes additional constructors and functions -//! for using rustls as a TLS library for QUIC. See the `quic` module for -//! details of these. You will only need this if you're writing a QUIC -//! implementation. -//! -//! - `tls12`: enables support for TLS version 1.2. This feature is in the default -//! set. Note that, due to the additive nature of Cargo features and because it -//! is enabled by default, other crates in your dependency graph could re-enable -//! it for your application. If you want to disable TLS 1.2 for security reasons, -//! consider explicitly enabling TLS 1.3 only in the config builder API. -//! -//! - `read_buf`: When building with Rust Nightly, adds support for the unstable -//! `std::io::ReadBuf` and related APIs. This reduces costs from initializing -//! buffers. Will do nothing on non-Nightly releases. - -// Require docs for public APIs, deny unsafe code, etc. -#![forbid(unsafe_code, unused_must_use)] -#![cfg_attr(not(read_buf), forbid(unstable_features))] -#![deny( - clippy::clone_on_ref_ptr, - clippy::use_self, - trivial_casts, - trivial_numeric_casts, - missing_docs, - unreachable_pub, - unused_import_braces, - unused_extern_crates, - unused_qualifications -)] -// Relax these clippy lints: -// - ptr_arg: this triggers on references to type aliases that are Vec -// underneath. -// - too_many_arguments: some things just need a lot of state, wrapping it -// doesn't necessarily make it easier to follow what's going on -// - new_ret_no_self: we sometimes return `Arc`, which seems fine -// - single_component_path_imports: our top-level `use log` import causes -// a false positive, https://github.com/rust-lang/rust-clippy/issues/5210 -// - new_without_default: for internal constructors, the indirection is not -// helpful -#![allow( - clippy::too_many_arguments, - clippy::new_ret_no_self, - clippy::ptr_arg, - clippy::single_component_path_imports, - clippy::new_without_default -)] -// Enable documentation for all features on docs.rs -#![cfg_attr(docsrs, feature(doc_cfg))] -// XXX: Because of https://github.com/rust-lang/rust/issues/54726, we cannot -// write `#![rustversion::attr(nightly, feature(read_buf))]` here. Instead, -// build.rs set `read_buf` for (only) Rust Nightly to get the same effect. -// -// All the other conditional logic in the crate could use -// `#[rustversion::nightly]` instead of `#[cfg(read_buf)]`; `#[cfg(read_buf)]` -// is used to avoid needing `rustversion` to be compiled twice during -// cross-compiling. -#![cfg_attr(read_buf, feature(read_buf))] - -// log for logging (optional). -#[cfg(feature = "logging")] -use log; - -#[cfg(not(feature = "logging"))] -#[macro_use] -mod log { - macro_rules! trace ( ($($tt:tt)*) => {{}} ); - macro_rules! debug ( ($($tt:tt)*) => {{}} ); - macro_rules! warn ( ($($tt:tt)*) => {{}} ); - macro_rules! error ( ($($tt:tt)*) => {{}} ); -} - -#[macro_use] -mod msgs; -mod anchors; -mod cipher; -mod conn; -mod error; -mod hash_hs; -mod limited_cache; -mod rand; -mod record_layer; -mod stream; -#[cfg(feature = "tls12")] -mod tls12; -mod tls13; -mod vecbuf; -mod verify; -#[cfg(test)] -mod verifybench; -mod x509; -#[macro_use] -mod check; -mod bs_debug; -mod builder; -mod enums; -mod key; -mod key_log; -mod key_log_file; -mod kx; -mod suites; -mod ticketer; -mod versions; - -/// Internal classes which may be useful outside the library. -/// The contents of this section DO NOT form part of the stable interface. -pub mod internal { - /// Low-level TLS message parsing and encoding functions. - pub mod msgs { - pub use crate::msgs::*; - } - /// Low-level TLS message decryption functions. - pub mod cipher { - pub use crate::cipher::MessageDecrypter; - } -} - -// The public interface is: -pub use crate::anchors::{OwnedTrustAnchor, RootCertStore}; -pub use crate::builder::{ - ConfigBuilder, ConfigSide, WantsCipherSuites, WantsKxGroups, WantsVerifier, WantsVersions, -}; -pub use crate::conn::{ - CommonState, Connection, ConnectionCommon, IoState, Reader, SideData, Writer, -}; -pub use crate::enums::{CipherSuite, ProtocolVersion, SignatureScheme}; -pub use crate::error::Error; -pub use crate::key::{Certificate, PrivateKey}; -pub use crate::key_log::{KeyLog, NoKeyLog}; -pub use crate::key_log_file::KeyLogFile; -pub use crate::kx::{SupportedKxGroup, ALL_KX_GROUPS}; -pub use crate::msgs::enums::{ - AlertDescription, ContentType, HandshakeType, NamedGroup, SignatureAlgorithm, -}; -pub use crate::msgs::handshake::{DigitallySignedStruct, DistinguishedNames}; -pub use crate::stream::{Stream, StreamOwned}; -pub use crate::suites::{ - BulkAlgorithm, SupportedCipherSuite, ALL_CIPHER_SUITES, DEFAULT_CIPHER_SUITES, -}; -#[cfg(feature = "secret_extraction")] -pub use crate::suites::{ConnectionTrafficSecrets, ExtractedSecrets}; -pub use crate::ticketer::Ticketer; -#[cfg(feature = "tls12")] -pub use crate::tls12::Tls12CipherSuite; -pub use crate::tls13::Tls13CipherSuite; -pub use crate::versions::{SupportedProtocolVersion, ALL_VERSIONS, DEFAULT_VERSIONS}; - -/// Items for use in a client. -pub mod client { - pub(super) mod builder; - mod client_conn; - mod common; - pub(super) mod handy; - mod hs; - #[cfg(feature = "tls12")] - mod tls12; - mod tls13; - - pub use builder::{WantsClientCert, WantsTransparencyPolicyOrClientCert}; - #[cfg(feature = "quic")] - pub use client_conn::ClientQuicExt; - pub use client_conn::InvalidDnsNameError; - pub use client_conn::ResolvesClientCert; - pub use client_conn::ServerName; - pub use client_conn::StoresClientSessions; - pub use client_conn::{ClientConfig, ClientConnection, ClientConnectionData, WriteEarlyData}; - pub use handy::{ClientSessionMemoryCache, NoClientSessionStorage}; - - #[cfg(feature = "dangerous_configuration")] - pub use crate::verify::{ - CertificateTransparencyPolicy, HandshakeSignatureValid, ServerCertVerified, - ServerCertVerifier, WebPkiVerifier, - }; - #[cfg(feature = "dangerous_configuration")] - pub use client_conn::danger::DangerousClientConfig; -} - -pub use client::{ClientConfig, ClientConnection, ServerName}; - -/// Items for use in a server. -pub mod server { - pub(crate) mod builder; - mod common; - pub(crate) mod handy; - mod hs; - mod server_conn; - #[cfg(feature = "tls12")] - mod tls12; - mod tls13; - - pub use crate::verify::{ - AllowAnyAnonymousOrAuthenticatedClient, AllowAnyAuthenticatedClient, NoClientAuth, - }; - pub use builder::WantsServerCert; - pub use handy::ResolvesServerCertUsingSni; - pub use handy::{NoServerSessionStorage, ServerSessionMemoryCache}; - #[cfg(feature = "quic")] - pub use server_conn::ServerQuicExt; - pub use server_conn::StoresServerSessions; - pub use server_conn::{ - Accepted, Acceptor, ReadEarlyData, ServerConfig, ServerConnection, ServerConnectionData, - }; - pub use server_conn::{ClientHello, ProducesTickets, ResolvesServerCert}; - - #[cfg(feature = "dangerous_configuration")] - pub use crate::verify::{ClientCertVerified, ClientCertVerifier, DnsName}; -} - -pub use server::{ServerConfig, ServerConnection}; - -/// All defined ciphersuites appear in this module. -/// -/// [`ALL_CIPHER_SUITES`] is provided as an array of all of these values. -pub mod cipher_suite { - pub use crate::suites::CipherSuiteCommon; - #[cfg(feature = "tls12")] - pub use crate::tls12::TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256; - #[cfg(feature = "tls12")] - pub use crate::tls12::TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384; - #[cfg(feature = "tls12")] - pub use crate::tls12::TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256; - #[cfg(feature = "tls12")] - pub use crate::tls12::TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256; - #[cfg(feature = "tls12")] - pub use crate::tls12::TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384; - #[cfg(feature = "tls12")] - pub use crate::tls12::TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256; - pub use crate::tls13::TLS13_AES_128_GCM_SHA256; - pub use crate::tls13::TLS13_AES_256_GCM_SHA384; - pub use crate::tls13::TLS13_CHACHA20_POLY1305_SHA256; -} - -/// All defined protocol versions appear in this module. -/// -/// ALL_VERSIONS is a provided as an array of all of these values. -pub mod version { - #[cfg(feature = "tls12")] - pub use crate::versions::TLS12; - pub use crate::versions::TLS13; -} - -/// All defined key exchange groups appear in this module. -/// -/// ALL_KX_GROUPS is provided as an array of all of these values. -pub mod kx_group { - pub use crate::kx::SECP256R1; - pub use crate::kx::SECP384R1; - pub use crate::kx::X25519; -} - -/// Message signing interfaces and implementations. -pub mod sign; - -#[cfg(feature = "quic")] -#[cfg_attr(docsrs, doc(cfg(feature = "quic")))] -/// APIs for implementing QUIC TLS -pub mod quic; - -/// This is the rustls manual. -pub mod manual; - -/** Type renames. */ -#[allow(clippy::upper_case_acronyms)] -#[doc(hidden)] -#[deprecated(since = "0.20.0", note = "Use ResolvesServerCertUsingSni")] -pub type ResolvesServerCertUsingSNI = server::ResolvesServerCertUsingSni; -#[allow(clippy::upper_case_acronyms)] -#[cfg(feature = "dangerous_configuration")] -#[doc(hidden)] -#[deprecated(since = "0.20.0", note = "Use client::WebPkiVerifier")] -pub type WebPKIVerifier = client::WebPkiVerifier; -#[allow(clippy::upper_case_acronyms)] -#[doc(hidden)] -#[deprecated(since = "0.20.0", note = "Use Error")] -pub type TLSError = Error; -#[doc(hidden)] -#[deprecated(since = "0.20.0", note = "Use ClientConnection")] -pub type ClientSession = ClientConnection; -#[doc(hidden)] -#[deprecated(since = "0.20.0", note = "Use ServerConnection")] -pub type ServerSession = ServerConnection; - -/* Apologies: would make a trait alias here, but those remain unstable. -pub trait Session = Connection; -*/ diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/src/limited_cache.rs temporalio-1.3.0/vendor/rustls-0.20.9/src/limited_cache.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/src/limited_cache.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/src/limited_cache.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,175 +0,0 @@ -use std::borrow::Borrow; -use std::collections::hash_map::Entry; -use std::collections::{HashMap, VecDeque}; -use std::hash::Hash; - -/// A HashMap-alike, which never gets larger than a specified -/// capacity, and evicts the oldest insertion to maintain this. -/// -/// The requested capacity may be rounded up by the underlying -/// collections. This implementation uses all the allocated -/// storage. -/// -/// This is inefficient: it stores keys twice. -pub(crate) struct LimitedCache { - map: HashMap, - - // first item is the oldest key - oldest: VecDeque, -} - -impl LimitedCache -where - K: Eq + Hash + Clone + std::fmt::Debug, -{ - /// Create a new LimitedCache with the given rough capacity. - pub(crate) fn new(capacity_order_of_magnitude: usize) -> Self { - Self { - map: HashMap::with_capacity(capacity_order_of_magnitude), - oldest: VecDeque::with_capacity(capacity_order_of_magnitude), - } - } - - pub(crate) fn insert(&mut self, k: K, v: V) { - let inserted_new_item = match self.map.entry(k) { - Entry::Occupied(mut old) => { - // nb. does not freshen entry in `oldest` - old.insert(v); - false - } - - entry @ Entry::Vacant(_) => { - self.oldest - .push_back(entry.key().clone()); - entry.or_insert(v); - true - } - }; - - // ensure next insert() does not require a realloc - if inserted_new_item && self.oldest.capacity() == self.oldest.len() { - if let Some(oldest_key) = self.oldest.pop_front() { - self.map.remove(&oldest_key); - } - } - } - - pub(crate) fn get(&self, k: &Q) -> Option<&V> - where - K: Borrow, - Q: Hash + Eq, - { - self.map.get(k) - } - - pub(crate) fn remove(&mut self, k: &Q) -> Option - where - K: Borrow, - Q: Hash + Eq, - { - if let Some(value) = self.map.remove(k) { - // O(N) search, followed by O(N) removal - if let Some(index) = self - .oldest - .iter() - .position(|item| item.borrow() == k) - { - self.oldest.remove(index); - } - Some(value) - } else { - None - } - } -} - -#[cfg(test)] -mod test { - type Test = super::LimitedCache; - - #[test] - fn test_updates_existing_item() { - let mut t = Test::new(3); - t.insert("abc".into(), 1); - t.insert("abc".into(), 2); - assert_eq!(t.get("abc"), Some(&2)); - } - - #[test] - fn test_evicts_oldest_item() { - let mut t = Test::new(3); - t.insert("abc".into(), 1); - t.insert("def".into(), 2); - t.insert("ghi".into(), 3); - - assert_eq!(t.get("abc"), None); - assert_eq!(t.get("def"), Some(&2)); - assert_eq!(t.get("ghi"), Some(&3)); - } - - #[test] - fn test_evicts_second_oldest_item_if_first_removed() { - let mut t = Test::new(3); - t.insert("abc".into(), 1); - t.insert("def".into(), 2); - - assert_eq!(t.remove("abc"), Some(1)); - - t.insert("ghi".into(), 3); - t.insert("jkl".into(), 4); - - assert_eq!(t.get("abc"), None); - assert_eq!(t.get("def"), None); - assert_eq!(t.get("ghi"), Some(&3)); - assert_eq!(t.get("jkl"), Some(&4)); - } - - #[test] - fn test_evicts_after_second_oldest_item_removed() { - let mut t = Test::new(3); - t.insert("abc".into(), 1); - t.insert("def".into(), 2); - - assert_eq!(t.remove("def"), Some(2)); - assert_eq!(t.get("abc"), Some(&1)); - - t.insert("ghi".into(), 3); - t.insert("jkl".into(), 4); - - assert_eq!(t.get("abc"), None); - assert_eq!(t.get("def"), None); - assert_eq!(t.get("ghi"), Some(&3)); - assert_eq!(t.get("jkl"), Some(&4)); - } - - #[test] - fn test_removes_all_items() { - let mut t = Test::new(3); - t.insert("abc".into(), 1); - t.insert("def".into(), 2); - - assert_eq!(t.remove("def"), Some(2)); - assert_eq!(t.remove("abc"), Some(1)); - - t.insert("ghi".into(), 3); - t.insert("jkl".into(), 4); - t.insert("mno".into(), 5); - - assert_eq!(t.get("abc"), None); - assert_eq!(t.get("def"), None); - assert_eq!(t.get("ghi"), None); - assert_eq!(t.get("jkl"), Some(&4)); - assert_eq!(t.get("mno"), Some(&5)); - } - - #[test] - fn test_inserts_many_items() { - let mut t = Test::new(3); - - for _ in 0..10000 { - t.insert("abc".into(), 1); - t.insert("def".into(), 2); - t.insert("ghi".into(), 3); - } - } -} diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/src/manual/defaults.rs temporalio-1.3.0/vendor/rustls-0.20.9/src/manual/defaults.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/src/manual/defaults.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/src/manual/defaults.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,29 +0,0 @@ -/*! - -## Rationale for defaults - -### Why is AES-256 preferred over AES-128? - -This is a trade-off between: - -1. classical security level: searching a 2^128 key space is as implausible as 2^256. -2. post-quantum security level: the difference is more meaningful, and AES-256 seems like the conservative choice. -3. performance: AES-256 is around 40% slower than AES-128, though hardware acceleration typically narrows this gap. - -The choice is frankly quite marginal. - -### Why is AES-GCM preferred over chacha20-poly1305? - -Hardware support for accelerating AES-GCM is widespread, and hardware-accelerated AES-GCM -is quicker than un-accelerated chacha20-poly1305. - -However, if you know your application will run on a platform without that, you should -_definitely_ change the default order to prefer chacha20-poly1305: both the performance and -the implementation security will be improved. We think this is an uncommon case. - -### Why is x25519 preferred for key exchange over nistp256? - -Both provide roughly the same classical security level, but x25519 has better performance and -it's _much_ more likely that both peers will have good quality implementations. - -*/ diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/src/manual/features.rs temporalio-1.3.0/vendor/rustls-0.20.9/src/manual/features.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/src/manual/features.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/src/manual/features.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,50 +0,0 @@ -/*! - -## Current features - -* TLS1.2 and TLS1.3. -* ECDSA, Ed25519 or RSA server authentication by clients. -* ECDSA, Ed25519 or RSA server authentication by servers. -* Forward secrecy using ECDHE; with curve25519, nistp256 or nistp384 curves. -* AES128-GCM and AES256-GCM bulk encryption, with safe nonces. -* ChaCha20-Poly1305 bulk encryption ([RFC7905](https://tools.ietf.org/html/rfc7905)). -* ALPN support. -* SNI support. -* Tunable MTU to make TLS messages match size of underlying transport. -* Optional use of vectored IO to minimise system calls. -* TLS1.2 session resumption. -* TLS1.2 resumption via tickets (RFC5077). -* TLS1.3 resumption via tickets or session storage. -* TLS1.3 0-RTT data for clients. -* Client authentication by clients. -* Client authentication by servers. -* Extended master secret support (RFC7627). -* Exporters (RFC5705). -* OCSP stapling by servers. -* SCT stapling by servers. -* SCT verification by clients. - -## Possible future features - -* PSK support. -* OCSP verification by clients. -* Certificate pinning. - -## Non-features - -For reasons explained in the other sections of this manual, rustls does not -and will not support: - -* SSL1, SSL2, SSL3, TLS1 or TLS1.1. -* RC4. -* DES or triple DES. -* EXPORT ciphersuites. -* MAC-then-encrypt ciphersuites. -* Ciphersuites without forward secrecy. -* Renegotiation. -* Kerberos. -* Compression. -* Discrete-log Diffie-Hellman. -* Automatic protocol version downgrade. - -*/ diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/src/manual/howto.rs temporalio-1.3.0/vendor/rustls-0.20.9/src/manual/howto.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/src/manual/howto.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/src/manual/howto.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,36 +0,0 @@ -/*! # Customising private key usage - -By default rustls supports PKCS#8-format[^1] RSA or ECDSA keys, plus PKCS#1-format RSA keys. - -However, if your private key resides in a HSM, or in another process, or perhaps -another machine, rustls has some extension points to support this: - -The main trait you must implement is [`sign::SigningKey`][signing_key]. The primary method here -is [`choose_scheme`][choose_scheme] where you are given a set of [`SignatureScheme`s][sig_scheme] the client says -it supports: you must choose one (or return `None` -- this aborts the handshake). Having -done that, you return an implementation of the [`sign::Signer`][signer] trait. -The [`sign()`][sign_method] performs the signature and returns it. - -(Unfortunately this is currently designed for keys with low latency access, like in a -PKCS#11 provider, Microsoft CryptoAPI, etc. so is blocking rather than asynchronous. -It's a TODO to make these and other extension points async.) - -Once you have these two pieces, configuring a server to use them involves, briefly: - -- packaging your `sign::SigningKey` with the matching certificate chain into a [`sign::CertifiedKey`][certified_key] -- making a [`ResolvesServerCertUsingSni`][cert_using_sni] and feeding in your `sign::CertifiedKey` for all SNI hostnames you want to use it for, -- setting that as your `ServerConfig`'s [`cert_resolver`][cert_resolver] - -[signing_key]: ../../sign/trait.SigningKey.html -[choose_scheme]: ../../sign/trait.SigningKey.html#tymethod.choose_scheme -[sig_scheme]: ../../enum.SignatureScheme.html -[signer]: ../../sign/trait.Signer.html -[sign_method]: ../../sign/trait.Signer.html#tymethod.sign -[certified_key]: ../../sign/struct.CertifiedKey.html -[cert_using_sni]: ../../struct.ResolvesServerCertUsingSni.html -[cert_resolver]: ../../struct.ServerConfig.html#structfield.cert_resolver - -[^1]: For PKCS#8 it does not support password encryption -- there's not a meaningful threat - model addressed by this, and the encryption supported is typically extremely poor. - -*/ diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/src/manual/implvulns.rs temporalio-1.3.0/vendor/rustls-0.20.9/src/manual/implvulns.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/src/manual/implvulns.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/src/manual/implvulns.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,104 +0,0 @@ -/*! # A review of TLS Implementation Vulnerabilities - -An important part of engineering involves studying and learning from the mistakes of the past. -It would be tremendously unfortunate to spend effort re-discovering and re-fixing the same -vulnerabilities that were discovered in the past. - -## Memory safety - -Being written entirely in the safe-subset of Rust immediately offers us freedom from the entire -class of memory safety vulnerabilities. There are too many to exhaustively list, and there will -certainly be more in the future. - -Examples: - -- Heartbleed [CVE-2014-0160](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-0160) (OpenSSL) -- Memory corruption in ASN.1 decoder [CVE-2016-2108](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-2108) (OpenSSL) -- Buffer overflow in read_server_hello [CVE-2014-3466](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-3466) (GnuTLS) - -## `goto fail` - -This is the name of a vulnerability in Apple Secure Transport [CVE-2014-1266](https://nvd.nist.gov/vuln/detail/CVE-2014-1266). -This boiled down to the following code, which validates the server's signature on the key exchange: - -```c - if ((err = SSLHashSHA1.update(&hashCtx, &serverRandom)) != 0) - goto fail; - if ((err = SSLHashSHA1.update(&hashCtx, &signedParams)) != 0) - goto fail; -> goto fail; - if ((err = SSLHashSHA1.final(&hashCtx, &hashOut)) != 0) - goto fail; -``` - -The marked line was duplicated, likely accidentally during a merge. This meant -the remaining part of the function (including the actual signature validation) -was unconditionally skipped. - -Ultimately the one countermeasure to this type of bug is basic testing: that a -valid signature returns success, and that an invalid one does not. rustls -has such testing, but this is really table stakes for security code. - -Further than this, though, we could consider that the *lack* of an error from -this function is a poor indicator that the signature was valid. rustls, instead, -has zero-size and non-copyable types that indicate a particular signature validation -has been performed. These types can be thought of as *capabilities* originated only -by designated signature verification functions -- such functions can then be a focus -of manual code review. Like capabilities, values of these types are otherwise unforgeable, -and are communicable only by Rust's move semantics. - -Values of these types are threaded through the protocol state machine, leading to terminal -states that look like: - -```ignore -struct ExpectTraffic { - (...) - _cert_verified: verify::ServerCertVerified, - _sig_verified: verify::HandshakeSignatureValid, - _fin_verified: verify::FinishedMessageVerified, -} -``` - -Since this state requires a value of these types, it will be a compile-time error to -reach that state without performing the requisite security-critical operations. - -This approach is not infallible, but it has zero runtime cost. - -## State machine attacks: EarlyCCS and SMACK/SKIP/FREAK - -EarlyCCS [CVE-2014-0224](https://nvd.nist.gov/vuln/detail/CVE-2014-0224) was a vulnerability in OpenSSL -found in 2014. The TLS `ChangeCipherSpec` message would be processed at inappropriate times, leading -to data being encrypted with the wrong keys (specifically, keys which were not secret). This resulted -from OpenSSL taking a *reactive* strategy to incoming messages ("when I get a message X, I should do Y") -which allows it to diverge from the proper state machine under attacker control. - -[SMACK](https://mitls.org/pages/attacks/SMACK) is a similar suite of vulnerabilities found in JSSE, -CyaSSL, OpenSSL, Mono and axTLS. "SKIP-TLS" demonstrated that some implementations allowed handshake -messages (and in one case, the entire handshake!) to be skipped leading to breaks in security. "FREAK" -found that some implementations incorrectly allowed export-only state transitions (i.e., transitions that -were only valid when an export ciphersuite was in use). - -rustls represents its protocol state machine carefully to avoid these defects. We model the handshake, -CCS and application data subprotocols in the same single state machine. Each state in this machine is -represented with a single struct, and transitions are modelled as functions that consume the current state -plus one TLS message[^1] and return a struct representing the next state. These functions fully validate -the message type before further operations. - -A sample sequence for a full TLSv1.2 handshake by a client looks like: - -- `hs::ExpectServerHello` (nb. ClientHello is logically sent before this state); transition to `tls12::ExpectCertificate` -- `tls12::ExpectCertificate`; transition to `tls12::ExpectServerKX` -- `tls12::ExpectServerKX`; transition to `tls12::ExpectServerDoneOrCertReq` -- `tls12::ExpectServerDoneOrCertReq`; delegates to `tls12::ExpectCertificateRequest` or `tls12::ExpectServerDone` depending on incoming message. - - `tls12::ExpectServerDone`; transition to `tls12::ExpectCCS` -- `tls12::ExpectCCS`; transition to `tls12::ExpectFinished` -- `tls12::ExpectFinished`; transition to `tls12::ExpectTraffic` -- `tls12::ExpectTraffic`; terminal state; transitions to `tls12::ExpectTraffic` - -In the future we plan to formally prove that all possible transitions modelled in this system of types -are correct with respect to the standard(s). At the moment we rely merely on exhaustive testing. - -[^1]: a logical TLS message: post-decryption, post-fragmentation. - - -*/ diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/src/manual/mod.rs temporalio-1.3.0/vendor/rustls-0.20.9/src/manual/mod.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/src/manual/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/src/manual/mod.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,30 +0,0 @@ -/*! - -This documentation primarily aims to explain design decisions taken in rustls. - -It does this from a few aspects: how rustls attempts to avoid construction errors -that occurred in other TLS libraries, how rustls attempts to avoid past TLS -protocol vulnerabilities, and assorted advice for achieving common tasks with rustls. -*/ -#![allow(non_snake_case)] - -/// This section discusses vulnerabilities in other TLS implementations, theorising their -/// root cause and how we aim to avoid them in rustls. -#[path = "implvulns.rs"] -pub mod _01_impl_vulnerabilities; - -/// This section discusses vulnerabilities and design errors in the TLS protocol. -#[path = "tlsvulns.rs"] -pub mod _02_tls_vulnerabilities; - -/// This section collects together goal-oriented documentation. -#[path = "howto.rs"] -pub mod _03_howto; - -/// This section documents rustls itself: what protocol features are and are not implemented. -#[path = "features.rs"] -pub mod _04_features; - -/// This section provides rationale for the defaults in rustls. -#[path = "defaults.rs"] -pub mod _05_defaults; diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/src/manual/tlsvulns.rs temporalio-1.3.0/vendor/rustls-0.20.9/src/manual/tlsvulns.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/src/manual/tlsvulns.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/src/manual/tlsvulns.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,173 +0,0 @@ -/*! # A review of protocol vulnerabilities - -## CBC MAC-then-encrypt ciphersuites - -Back in 2000 [Bellare and Namprempre](https://eprint.iacr.org/2000/025) discussed how to make authenticated -encryption by composing separate encryption and authentication primitives. That paper included this table: - -| Composition Method | Privacy || Integrity || -|--------------------|---------||-----------|| -|| IND-CPA | IND-CCA | NM-CPA | INT-PTXT | INT-CTXT | -| Encrypt-and-MAC | insecure | insecure | insecure | secure | insecure | -| MAC-then-encrypt | secure | insecure | insecure | secure | insecure | -| Encrypt-then-MAC | secure | secure | secure | secure | secure | - -One may assume from this fairly clear result that encrypt-and-MAC and MAC-then-encrypt compositions would be quickly abandoned -in favour of the remaining proven-secure option. But that didn't happen, not in TLSv1.1 (2006) nor in TLSv1.2 (2008). Worse, -both RFCs included incorrect advice on countermeasures for implementers, suggesting that the flaw was "not believed to be large -enough to be exploitable". - -[Lucky 13](http://www.isg.rhul.ac.uk/tls/Lucky13.html) (2013) exploited this flaw and affected all implementations, including -those written [after discovery](https://aws.amazon.com/blogs/security/s2n-and-lucky-13/). OpenSSL even had a -[memory safety vulnerability in the fix for Lucky 13](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-2107), which -gives a flavour of the kind of complexity required to remove the side channel. - -rustls does not implement CBC MAC-then-encrypt ciphersuites for these reasons. TLSv1.3 removed support for these -ciphersuites in 2018. - -There are some further rejected options worth mentioning: [RFC7366](https://tools.ietf.org/html/rfc7366) defines -Encrypt-then-MAC for TLS, but unfortunately cannot be negotiated without also supporting MAC-then-encrypt -(clients cannot express "I offer CBC, but only EtM and not MtE"). - -## RSA PKCS#1 encryption - -"RSA key exchange" in TLS involves the client choosing a large random value and encrypting it using the server's -public key. This has two overall problems: - -1. It provides no _forward secrecy_: later compromise of the server's private key breaks confidentiality of - *all* past sessions using that key. This is a crucial property in the presence of software that is often - [poor at keeping a secret](http://heartbleed.com/). -2. The padding used in practice in TLS ("PKCS#1", or fully "RSAES-PKCS1-v1_5") has been known to be broken since - [1998](http://archiv.infsec.ethz.ch/education/fs08/secsem/bleichenbacher98.pdf). - -In a similar pattern to the MAC-then-encrypt problem discussed above, TLSv1.0 (1999), TLSv1.1 (2006) and TLSv1.2 (2008) -continued to specify use of PKCS#1 encryption, again with incrementally more complex and incorrect advice on countermeasures. - -[ROBOT](https://robotattack.org/) (2018) showed that implementations were still vulnerable to these attacks twenty years later. - -rustls does not support RSA key exchange. TLSv1.3 also removed support. - -## BEAST - -[BEAST](https://vnhacker.blogspot.com/2011/09/beast.html) ([CVE-2011-3389](https://nvd.nist.gov/vuln/detail/CVE-2011-3389)) -was demonstrated in 2011 by Thai Duong and Juliano Rizzo, -and was another vulnerability in CBC-based ciphersuites in SSLv3.0 and TLSv1.0. CBC mode is vulnerable to adaptive -chosen-plaintext attacks if the IV is predictable. In the case of these protocol versions, the IV was the previous -block of ciphertext (as if the entire TLS session was one CBC ciphertext, albeit revealed incrementally). This was -obviously predictable, since it was published on the wire. - -OpenSSL contained a countermeasure for this problem from 2002 onwards: it encrypts an empty message before each real -one, so that the IV used in the real message is unpredictable. This was turned off by default due to bugs in IE6. - -TLSv1.1 fix this vulnerability, but not any of the other deficiencies of CBC mode (see above). - -rustls does not support these ciphersuites. - -## CRIME - -In 2002 [John Kelsey](https://www.iacr.org/cryptodb/archive/2002/FSE/3091/3091.pdf) discussed the length side channel -as applied to compression of combined secret and attacker-chosen strings. - -Compression continued to be an option in TLSv1.1 (2006) and in TLSv1.2 (2008). Support in libraries was widespread. - -[CRIME](http://netifera.com/research/crime/CRIME_ekoparty2012.pdf) ([CVE-2012-4929](https://nvd.nist.gov/vuln/detail/CVE-2012-4929)) -was demonstrated in 2012, again by Thai Duong and Juliano Rizzo. It attacked several protocols offering transparent -compression of application data, allowing quick adaptive chosen-plaintext attacks against secret values like cookies. - -rustls does not implement compression. TLSv1.3 also removed support. - -## Logjam / FREAK - -Way back when SSL was first being born, circa 1995, the US government considered cryptography a munition requiring -export control. SSL contained specific ciphersuites with dramatically small key sizes that were not subject -to export control. These controls were dropped in 2000. - -Since the "export-grade" ciphersuites no longer fulfilled any purpose, and because they were actively harmful to users, -one may have expected software support to disappear quickly. This did not happen. - -In 2015 [the FREAK attack](https://mitls.org/pages/attacks/SMACK#freak) ([CVE-2015-0204](https://nvd.nist.gov/vuln/detail/CVE-2015-0204)) -and [the Logjam attack](https://weakdh.org/) ([CVE-2015-4000](https://nvd.nist.gov/vuln/detail/CVE-2015-4000)) both -demonstrated total breaks of security in the presence of servers that accepted export ciphersuites. FREAK factored -512-bit RSA keys, while Logjam optimised solving discrete logs in the 512-bit group used by many different servers. - -Naturally, rustls does not implement any of these ciphersuites. - -## SWEET32 - -Block ciphers are vulnerable to birthday attacks, where the probability of repeating a block increases dramatically -once a particular key has been used for many blocks. For block ciphers with 64-bit blocks, this becomes probable -once a given key encrypts the order of 32GB of data. - -[Sweet32](https://sweet32.info/) ([CVE-2016-2183](https://nvd.nist.gov/vuln/detail/CVE-2016-2183)) attacked this fact -in the context of TLS support for 3DES, breaking confidentiality by analysing a large amount of attacker-induced traffic -in one session. - -rustls does not support any 64-bit block ciphers. - -## DROWN - -[DROWN](https://drownattack.com/) ([CVE-2016-0800](https://nvd.nist.gov/vuln/detail/CVE-2016-0800)) is a cross-protocol -attack that breaks the security of TLSv1.2 and earlier (when used with RSA key exchange) by using SSLv2. It is required -that the server uses the same key for both protocol versions. - -rustls naturally does not support SSLv2, but most importantly does not support RSA key exchange for TLSv1.2. - -## Poodle - -[POODLE](https://www.openssl.org/~bodo/ssl-poodle.pdf) ([CVE-2014-3566](https://nvd.nist.gov/vuln/detail/CVE-2014-3566)) -is an attack against CBC mode ciphersuites in SSLv3. This was possible in most cases because some clients willingly -downgraded to SSLv3 after failed handshakes for later versions. - -rustls does not support CBC mode ciphersuites, or SSLv3. Note that rustls does not need to implement `TLS_FALLBACK_SCSV` -introduced as a countermeasure because it contains no ability to downgrade to earlier protocol versions. - -## GCM nonces - -[RFC5288](https://tools.ietf.org/html/rfc5288) introduced GCM-based ciphersuites for use in TLS. Unfortunately -the design was poor; it reused design for an unrelated security setting proposed in RFC5116. - -GCM is a typical nonce-based AEAD: it requires a unique (but not necessarily unpredictable) 96-bit nonce for each encryption -with a given key. The design specified by RFC5288 left two-thirds of the nonce construction up to implementations: - -- wasting 8 bytes per TLS ciphertext, -- meaning correct operation cannot be tested for (e.g., in protocol-level test vectors). - -There were no trade-offs here: TLS has a 64-bit sequence number that is not allowed to wrap and would make an ideal nonce. - -As a result, a [2016 study](https://eprint.iacr.org/2016/475.pdf) found: - -- implementations from IBM, A10 and Citrix used randomly-chosen nonces, which are unlikely to be unique over long connections, -- an implementation from Radware used the same nonce for the first two messages. - -rustls uses a counter from a random starting point for GCM nonces. TLSv1.3 and the Chacha20-Poly1305 TLSv1.2 ciphersuite -standardise this method. - -## Renegotiation - -In 2009 Marsh Ray and Steve Dispensa [discovered](https://kryptera.se/Renegotiating%20TLS.pdf) that the renegotiation -feature of all versions of TLS allows a MitM to splice a request of their choice onto the front of the client's real HTTP -request. A countermeasure was proposed and widely implemented to bind renegotiations to their previous negotiations; -unfortunately this was insufficient. - -rustls does not support renegotiation in TLSv1.2. TLSv1.3 also no longer supports renegotiation. - -## 3SHAKE - -[3SHAKE](https://www.mitls.org/pages/attacks/3SHAKE) (2014) described a complex attack that broke the "Secure Renegotiation" extension -introduced as a countermeasure to the previous protocol flaw. - -rustls does not support renegotiation for TLSv1.2 connections, or RSA key exchange, and both are required for this attack -to work. rustls implements the "Extended Master Secret" (RFC7627) extension for TLSv1.2 which was standardised as a countermeasure. - -TLSv1.3 no longer supports renegotiation and RSA key exchange. It also effectively incorporates the improvements made in RFC7627. - -## KCI - -[This vulnerability](https://kcitls.org/) makes use of TLS ciphersuites (those offering static DH) which were standardised -yet not widely used. However, they were implemented by libraries, and as a result enabled for various clients. It coupled -this with misconfigured certificates (on services including facebook.com) which allowed their misuse to MitM connections. - -rustls does not support static DH/EC-DH ciphersuites. We assert that it is misissuance to sign an EC certificate -with the keyUsage extension allowing both signatures and key exchange. That it isn't is probably a failure -of CAB Forum baseline requirements. -*/ diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/alert.rs temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/alert.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/alert.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/alert.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,22 +0,0 @@ -use crate::msgs::codec::{Codec, Reader}; -use crate::msgs::enums::{AlertDescription, AlertLevel}; - -#[derive(Debug)] -pub struct AlertMessagePayload { - pub level: AlertLevel, - pub description: AlertDescription, -} - -impl Codec for AlertMessagePayload { - fn encode(&self, bytes: &mut Vec) { - self.level.encode(bytes); - self.description.encode(bytes); - } - - fn read(r: &mut Reader) -> Option { - let level = AlertLevel::read(r)?; - let description = AlertDescription::read(r)?; - - Some(Self { level, description }) - } -} diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/base.rs temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/base.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/base.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/base.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,170 +0,0 @@ -use std::fmt; - -use crate::key; -use crate::msgs::codec; -use crate::msgs::codec::{Codec, Reader}; - -/// An externally length'd payload -#[derive(Clone, Eq, PartialEq)] -pub struct Payload(pub Vec); - -impl Codec for Payload { - fn encode(&self, bytes: &mut Vec) { - bytes.extend_from_slice(&self.0); - } - - fn read(r: &mut Reader) -> Option { - Some(Self::read(r)) - } -} - -impl Payload { - pub fn new(bytes: impl Into>) -> Self { - Self(bytes.into()) - } - - pub fn empty() -> Self { - Self::new(Vec::new()) - } - - pub fn read(r: &mut Reader) -> Self { - Self(r.rest().to_vec()) - } -} - -impl Codec for key::Certificate { - fn encode(&self, bytes: &mut Vec) { - codec::u24(self.0.len() as u32).encode(bytes); - bytes.extend_from_slice(&self.0); - } - - fn read(r: &mut Reader) -> Option { - let len = codec::u24::read(r)?.0 as usize; - let mut sub = r.sub(len)?; - let body = sub.rest().to_vec(); - Some(Self(body)) - } -} - -impl fmt::Debug for Payload { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - hex(f, &self.0) - } -} - -/// An arbitrary, unknown-content, u24-length-prefixed payload -#[derive(Clone, Eq, PartialEq)] -pub struct PayloadU24(pub Vec); - -impl PayloadU24 { - pub fn new(bytes: Vec) -> Self { - Self(bytes) - } -} - -impl Codec for PayloadU24 { - fn encode(&self, bytes: &mut Vec) { - codec::u24(self.0.len() as u32).encode(bytes); - bytes.extend_from_slice(&self.0); - } - - fn read(r: &mut Reader) -> Option { - let len = codec::u24::read(r)?.0 as usize; - let mut sub = r.sub(len)?; - let body = sub.rest().to_vec(); - Some(Self(body)) - } -} - -impl fmt::Debug for PayloadU24 { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - hex(f, &self.0) - } -} - -/// An arbitrary, unknown-content, u16-length-prefixed payload -#[derive(Clone, Eq, PartialEq)] -pub struct PayloadU16(pub Vec); - -impl PayloadU16 { - pub fn new(bytes: Vec) -> Self { - Self(bytes) - } - - pub fn empty() -> Self { - Self::new(Vec::new()) - } - - pub fn encode_slice(slice: &[u8], bytes: &mut Vec) { - (slice.len() as u16).encode(bytes); - bytes.extend_from_slice(slice); - } -} - -impl Codec for PayloadU16 { - fn encode(&self, bytes: &mut Vec) { - Self::encode_slice(&self.0, bytes); - } - - fn read(r: &mut Reader) -> Option { - let len = u16::read(r)? as usize; - let mut sub = r.sub(len)?; - let body = sub.rest().to_vec(); - Some(Self(body)) - } -} - -impl fmt::Debug for PayloadU16 { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - hex(f, &self.0) - } -} - -/// An arbitrary, unknown-content, u8-length-prefixed payload -#[derive(Clone, Eq, PartialEq)] -pub struct PayloadU8(pub Vec); - -impl PayloadU8 { - pub fn new(bytes: Vec) -> Self { - Self(bytes) - } - - pub fn empty() -> Self { - Self(Vec::new()) - } - - pub fn into_inner(self) -> Vec { - self.0 - } -} - -impl Codec for PayloadU8 { - fn encode(&self, bytes: &mut Vec) { - (self.0.len() as u8).encode(bytes); - bytes.extend_from_slice(&self.0); - } - - fn read(r: &mut Reader) -> Option { - let len = u8::read(r)? as usize; - let mut sub = r.sub(len)?; - let body = sub.rest().to_vec(); - Some(Self(body)) - } -} - -impl fmt::Debug for PayloadU8 { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - hex(f, &self.0) - } -} - -// Format an iterator of u8 into a hex string -pub(super) fn hex<'a>( - f: &mut fmt::Formatter<'_>, - payload: impl IntoIterator, -) -> fmt::Result { - for b in payload { - write!(f, "{:02x}", b)? - } - Ok(()) -} diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/ccs.rs temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/ccs.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/ccs.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/ccs.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,20 +0,0 @@ -use crate::msgs::codec::{Codec, Reader}; - -#[derive(Debug)] -pub struct ChangeCipherSpecPayload; - -impl Codec for ChangeCipherSpecPayload { - fn encode(&self, bytes: &mut Vec) { - 1u8.encode(bytes); - } - - fn read(r: &mut Reader) -> Option { - let typ = u8::read(r)?; - - if typ == 1 && !r.any_left() { - Some(Self {}) - } else { - None - } - } -} diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/codec.rs temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/codec.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/codec.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/codec.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,290 +0,0 @@ -use std::convert::TryInto; -use std::fmt::Debug; - -/// Wrapper over a slice of bytes that allows reading chunks from -/// with the current position state held using a cursor. -/// -/// A new reader for a sub section of the the buffer can be created -/// using the `sub` function or a section of a certain length can -/// be obtained using the `take` function -pub struct Reader<'a> { - /// The underlying buffer storing the readers content - buffer: &'a [u8], - /// Stores the current reading position for the buffer - cursor: usize, -} - -impl<'a> Reader<'a> { - /// Creates a new Reader of the provided `bytes` slice with - /// the initial cursor position of zero. - pub fn init(bytes: &[u8]) -> Reader { - Reader { - buffer: bytes, - cursor: 0, - } - } - - /// Attempts to create a new Reader on a sub section of this - /// readers bytes by taking a slice of the provided `length` - /// will return None if there is not enough bytes - pub fn sub(&mut self, length: usize) -> Option { - self.take(length).map(Reader::init) - } - - /// Borrows a slice of all the remaining bytes - /// that appear after the cursor position. - /// - /// Moves the cursor to the end of the buffer length. - pub fn rest(&mut self) -> &[u8] { - let rest = &self.buffer[self.cursor..]; - self.cursor = self.buffer.len(); - rest - } - - /// Attempts to borrow a slice of bytes from the current - /// cursor position of `length` if there is not enough - /// bytes remaining after the cursor to take the length - /// then None is returned instead. - pub fn take(&mut self, length: usize) -> Option<&[u8]> { - if self.left() < length { - return None; - } - let current = self.cursor; - self.cursor += length; - Some(&self.buffer[current..current + length]) - } - - /// Used to check whether the reader has any content left - /// after the cursor (cursor has not reached end of buffer) - pub fn any_left(&self) -> bool { - self.cursor < self.buffer.len() - } - - /// Returns the cursor position which is also the number - /// of bytes that have been read from the buffer. - pub fn used(&self) -> usize { - self.cursor - } - - /// Returns the number of bytes that are still able to be - /// read (The number of remaining takes) - pub fn left(&self) -> usize { - self.buffer.len() - self.cursor - } -} - -/// Trait for implementing encoding and decoding functionality -/// on something. -pub trait Codec: Debug + Sized { - /// Function for encoding itself by appending itself to - /// the provided vec of bytes. - fn encode(&self, bytes: &mut Vec); - - /// Function for decoding itself from the provided reader - /// will return Some if the decoding was successful or - /// None if it was not. - fn read(_: &mut Reader) -> Option; - - /// Convenience function for encoding the implementation - /// into a vec and returning it - fn get_encoding(&self) -> Vec { - let mut bytes = Vec::new(); - self.encode(&mut bytes); - bytes - } - - /// Function for wrapping a call to the read function in - /// a Reader for the slice of bytes provided - fn read_bytes(bytes: &[u8]) -> Option { - let mut reader = Reader::init(bytes); - Self::read(&mut reader) - } -} - -fn decode_u8(bytes: &[u8]) -> Option { - let [value]: [u8; 1] = bytes.try_into().ok()?; - Some(value) -} - -impl Codec for u8 { - fn encode(&self, bytes: &mut Vec) { - bytes.push(*self); - } - - fn read(r: &mut Reader) -> Option { - r.take(1).and_then(decode_u8) - } -} - -pub fn put_u16(v: u16, out: &mut [u8]) { - let out: &mut [u8; 2] = (&mut out[..2]).try_into().unwrap(); - *out = u16::to_be_bytes(v); -} - -pub fn decode_u16(bytes: &[u8]) -> Option { - Some(u16::from_be_bytes(bytes.try_into().ok()?)) -} - -impl Codec for u16 { - fn encode(&self, bytes: &mut Vec) { - let mut b16 = [0u8; 2]; - put_u16(*self, &mut b16); - bytes.extend_from_slice(&b16); - } - - fn read(r: &mut Reader) -> Option { - r.take(2).and_then(decode_u16) - } -} - -// Make a distinct type for u24, even though it's a u32 underneath -#[allow(non_camel_case_types)] -#[derive(Debug, Copy, Clone)] -pub struct u24(pub u32); - -impl u24 { - pub fn decode(bytes: &[u8]) -> Option { - let [a, b, c]: [u8; 3] = bytes.try_into().ok()?; - Some(Self(u32::from_be_bytes([0, a, b, c]))) - } -} - -#[cfg(any(target_pointer_width = "32", target_pointer_width = "64"))] -impl From for usize { - #[inline] - fn from(v: u24) -> Self { - v.0 as Self - } -} - -impl Codec for u24 { - fn encode(&self, bytes: &mut Vec) { - let be_bytes = u32::to_be_bytes(self.0); - bytes.extend_from_slice(&be_bytes[1..]) - } - - fn read(r: &mut Reader) -> Option { - r.take(3).and_then(Self::decode) - } -} - -pub fn decode_u32(bytes: &[u8]) -> Option { - Some(u32::from_be_bytes(bytes.try_into().ok()?)) -} - -impl Codec for u32 { - fn encode(&self, bytes: &mut Vec) { - bytes.extend(Self::to_be_bytes(*self)) - } - - fn read(r: &mut Reader) -> Option { - r.take(4).and_then(decode_u32) - } -} - -pub fn put_u64(v: u64, bytes: &mut [u8]) { - let bytes: &mut [u8; 8] = (&mut bytes[..8]).try_into().unwrap(); - *bytes = u64::to_be_bytes(v) -} - -pub fn decode_u64(bytes: &[u8]) -> Option { - Some(u64::from_be_bytes(bytes.try_into().ok()?)) -} - -impl Codec for u64 { - fn encode(&self, bytes: &mut Vec) { - let mut b64 = [0u8; 8]; - put_u64(*self, &mut b64); - bytes.extend_from_slice(&b64); - } - - fn read(r: &mut Reader) -> Option { - r.take(8).and_then(decode_u64) - } -} - -pub fn encode_vec_u8(bytes: &mut Vec, items: &[T]) { - let len_offset = bytes.len(); - bytes.push(0); - - for i in items { - i.encode(bytes); - } - - let len = bytes.len() - len_offset - 1; - debug_assert!(len <= 0xff); - bytes[len_offset] = len as u8; -} - -pub fn encode_vec_u16(bytes: &mut Vec, items: &[T]) { - let len_offset = bytes.len(); - bytes.extend([0, 0]); - - for i in items { - i.encode(bytes); - } - - let len = bytes.len() - len_offset - 2; - debug_assert!(len <= 0xffff); - let out: &mut [u8; 2] = (&mut bytes[len_offset..len_offset + 2]) - .try_into() - .unwrap(); - *out = u16::to_be_bytes(len as u16); -} - -pub fn encode_vec_u24(bytes: &mut Vec, items: &[T]) { - let len_offset = bytes.len(); - bytes.extend([0, 0, 0]); - - for i in items { - i.encode(bytes); - } - - let len = bytes.len() - len_offset - 3; - debug_assert!(len <= 0xff_ffff); - let len_bytes = u32::to_be_bytes(len as u32); - let out: &mut [u8; 3] = (&mut bytes[len_offset..len_offset + 3]) - .try_into() - .unwrap(); - out.copy_from_slice(&len_bytes[1..]); -} - -pub fn read_vec_u8(r: &mut Reader) -> Option> { - let mut ret: Vec = Vec::new(); - let len = usize::from(u8::read(r)?); - let mut sub = r.sub(len)?; - - while sub.any_left() { - ret.push(T::read(&mut sub)?); - } - - Some(ret) -} - -pub fn read_vec_u16(r: &mut Reader) -> Option> { - let mut ret: Vec = Vec::new(); - let len = usize::from(u16::read(r)?); - let mut sub = r.sub(len)?; - - while sub.any_left() { - ret.push(T::read(&mut sub)?); - } - - Some(ret) -} - -pub fn read_vec_u24_limited(r: &mut Reader, max_bytes: usize) -> Option> { - let mut ret: Vec = Vec::new(); - let len = u24::read(r)?.0 as usize; - if len > max_bytes { - return None; - } - - let mut sub = r.sub(len)?; - - while sub.any_left() { - ret.push(T::read(&mut sub)?); - } - - Some(ret) -} diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/deframer.rs temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/deframer.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/deframer.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/deframer.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,425 +0,0 @@ -use std::collections::VecDeque; -use std::io; - -use crate::error::Error; -use crate::msgs::codec; -use crate::msgs::message::{MessageError, OpaqueMessage}; - -/// This deframer works to reconstruct TLS messages -/// from arbitrary-sized reads, buffering as necessary. -/// The input is `read()`, get the output from `pop()`. -pub struct MessageDeframer { - /// Completed frames for output. - frames: VecDeque, - - /// Set to true if the peer is not talking TLS, but some other - /// protocol. The caller should abort the connection, because - /// the deframer cannot recover. - desynced: bool, - - /// A fixed-size buffer containing the currently-accumulating - /// TLS message. - buf: Box<[u8; OpaqueMessage::MAX_WIRE_SIZE]>, - - /// What size prefix of `buf` is used. - used: usize, -} - -impl Default for MessageDeframer { - fn default() -> Self { - Self::new() - } -} - -impl MessageDeframer { - pub fn new() -> Self { - Self { - frames: VecDeque::new(), - desynced: false, - buf: Box::new([0u8; OpaqueMessage::MAX_WIRE_SIZE]), - used: 0, - } - } - - /// Return any complete messages that the deframer has been able to parse. - /// - /// Returns an `Error` if the deframer failed to parse some message contents, - /// `Ok(None)` if no full message is buffered, and `Ok(Some(_))` if a valid message was found. - pub fn pop(&mut self) -> Result, Error> { - if self.desynced { - return Err(Error::CorruptMessage); - } else if let Some(msg) = self.frames.pop_front() { - return Ok(Some(msg)); - } - - let mut taken = 0; - loop { - // Does our `buf` contain a full message? It does if it is big enough to - // contain a header, and that header has a length which falls within `buf`. - // If so, deframe it and place the message onto the frames output queue. - let mut rd = codec::Reader::init(&self.buf[taken..self.used]); - let m = match OpaqueMessage::read(&mut rd) { - Ok(m) => m, - Err(MessageError::TooShortForHeader | MessageError::TooShortForLength) => break, - Err(_) => { - self.desynced = true; - return Err(Error::CorruptMessage); - } - }; - - taken += rd.used(); - self.frames.push_back(m); - } - - #[allow(clippy::comparison_chain)] - if taken < self.used { - /* Before: - * +----------+----------+----------+ - * | taken | pending |xxxxxxxxxx| - * +----------+----------+----------+ - * 0 ^ taken ^ self.used - * - * After: - * +----------+----------+----------+ - * | pending |xxxxxxxxxxxxxxxxxxxxx| - * +----------+----------+----------+ - * 0 ^ self.used - */ - - self.buf - .copy_within(taken..self.used, 0); - self.used -= taken; - } else if taken == self.used { - self.used = 0; - } - - Ok(self.frames.pop_front()) - } - - /// Read some bytes from `rd`, and add them to our internal buffer. - #[allow(clippy::comparison_chain)] - pub fn read(&mut self, rd: &mut dyn io::Read) -> io::Result { - if self.used == OpaqueMessage::MAX_WIRE_SIZE { - return Err(io::Error::new(io::ErrorKind::Other, "message buffer full")); - } - - // Try to do the largest reads possible. Note that if - // we get a message with a length field out of range here, - // we do a zero length read. That looks like an EOF to - // the next layer up, which is fine. - debug_assert!(self.used <= OpaqueMessage::MAX_WIRE_SIZE); - let new_bytes = rd.read(&mut self.buf[self.used..])?; - self.used += new_bytes; - Ok(new_bytes) - } - - /// Returns true if we have messages for the caller - /// to process, either whole messages in our output - /// queue or partial messages in our buffer. - pub fn has_pending(&self) -> bool { - !self.frames.is_empty() || self.used > 0 - } -} - -#[cfg(test)] -mod tests { - use super::MessageDeframer; - use crate::msgs::message::{Message, OpaqueMessage}; - use crate::{msgs, Error}; - use std::convert::TryFrom; - use std::io; - - const FIRST_MESSAGE: &[u8] = include_bytes!("../testdata/deframer-test.1.bin"); - const SECOND_MESSAGE: &[u8] = include_bytes!("../testdata/deframer-test.2.bin"); - - const EMPTY_APPLICATIONDATA_MESSAGE: &[u8] = - include_bytes!("../testdata/deframer-empty-applicationdata.bin"); - - const INVALID_EMPTY_MESSAGE: &[u8] = include_bytes!("../testdata/deframer-invalid-empty.bin"); - const INVALID_CONTENTTYPE_MESSAGE: &[u8] = - include_bytes!("../testdata/deframer-invalid-contenttype.bin"); - const INVALID_VERSION_MESSAGE: &[u8] = - include_bytes!("../testdata/deframer-invalid-version.bin"); - const INVALID_LENGTH_MESSAGE: &[u8] = include_bytes!("../testdata/deframer-invalid-length.bin"); - - struct ByteRead<'a> { - buf: &'a [u8], - offs: usize, - } - - impl<'a> ByteRead<'a> { - fn new(bytes: &'a [u8]) -> Self { - ByteRead { - buf: bytes, - offs: 0, - } - } - } - - impl<'a> io::Read for ByteRead<'a> { - fn read(&mut self, buf: &mut [u8]) -> io::Result { - let mut len = 0; - - while len < buf.len() && len < self.buf.len() - self.offs { - buf[len] = self.buf[self.offs + len]; - len += 1; - } - - self.offs += len; - - Ok(len) - } - } - - fn input_bytes(d: &mut MessageDeframer, bytes: &[u8]) -> io::Result { - let mut rd = ByteRead::new(bytes); - d.read(&mut rd) - } - - fn input_bytes_concat( - d: &mut MessageDeframer, - bytes1: &[u8], - bytes2: &[u8], - ) -> io::Result { - let mut bytes = vec![0u8; bytes1.len() + bytes2.len()]; - bytes[..bytes1.len()].clone_from_slice(bytes1); - bytes[bytes1.len()..].clone_from_slice(bytes2); - let mut rd = ByteRead::new(&bytes); - d.read(&mut rd) - } - - struct ErrorRead { - error: Option, - } - - impl ErrorRead { - fn new(error: io::Error) -> Self { - Self { error: Some(error) } - } - } - - impl io::Read for ErrorRead { - fn read(&mut self, buf: &mut [u8]) -> io::Result { - for (i, b) in buf.iter_mut().enumerate() { - *b = i as u8; - } - - let error = self.error.take().unwrap(); - Err(error) - } - } - - fn input_error(d: &mut MessageDeframer) { - let error = io::Error::from(io::ErrorKind::TimedOut); - let mut rd = ErrorRead::new(error); - d.read(&mut rd) - .expect_err("error not propagated"); - } - - fn input_whole_incremental(d: &mut MessageDeframer, bytes: &[u8]) { - let before = d.used; - - for i in 0..bytes.len() { - assert_len(1, input_bytes(d, &bytes[i..i + 1])); - assert!(d.has_pending()); - } - - assert_eq!(before + bytes.len(), d.used); - } - - fn assert_len(want: usize, got: io::Result) { - if let Ok(gotval) = got { - assert_eq!(gotval, want); - } else { - panic!("read failed, expected {:?} bytes", want); - } - } - - fn pop_first(d: &mut MessageDeframer) { - let m = d.pop().unwrap().unwrap(); - assert_eq!(m.typ, msgs::enums::ContentType::Handshake); - Message::try_from(m.into_plain_message()).unwrap(); - } - - fn pop_second(d: &mut MessageDeframer) { - let m = d.pop().unwrap().unwrap(); - assert_eq!(m.typ, msgs::enums::ContentType::Alert); - Message::try_from(m.into_plain_message()).unwrap(); - } - - #[test] - fn check_incremental() { - let mut d = MessageDeframer::new(); - assert!(!d.has_pending()); - input_whole_incremental(&mut d, FIRST_MESSAGE); - assert!(d.has_pending()); - assert_eq!(0, d.frames.len()); - pop_first(&mut d); - assert!(!d.has_pending()); - assert!(!d.desynced); - } - - #[test] - fn check_incremental_2() { - let mut d = MessageDeframer::new(); - assert!(!d.has_pending()); - input_whole_incremental(&mut d, FIRST_MESSAGE); - assert!(d.has_pending()); - input_whole_incremental(&mut d, SECOND_MESSAGE); - assert!(d.has_pending()); - assert_eq!(0, d.frames.len()); - pop_first(&mut d); - assert!(d.has_pending()); - assert_eq!(1, d.frames.len()); - pop_second(&mut d); - assert!(!d.has_pending()); - assert!(!d.desynced); - } - - #[test] - fn check_whole() { - let mut d = MessageDeframer::new(); - assert!(!d.has_pending()); - assert_len(FIRST_MESSAGE.len(), input_bytes(&mut d, FIRST_MESSAGE)); - assert!(d.has_pending()); - assert_eq!(d.frames.len(), 0); - pop_first(&mut d); - assert!(!d.has_pending()); - assert!(!d.desynced); - } - - #[test] - fn check_whole_2() { - let mut d = MessageDeframer::new(); - assert!(!d.has_pending()); - assert_len(FIRST_MESSAGE.len(), input_bytes(&mut d, FIRST_MESSAGE)); - assert_len(SECOND_MESSAGE.len(), input_bytes(&mut d, SECOND_MESSAGE)); - assert_eq!(d.frames.len(), 0); - pop_first(&mut d); - assert_eq!(d.frames.len(), 1); - pop_second(&mut d); - assert!(!d.has_pending()); - assert!(!d.desynced); - } - - #[test] - fn test_two_in_one_read() { - let mut d = MessageDeframer::new(); - assert!(!d.has_pending()); - assert_len( - FIRST_MESSAGE.len() + SECOND_MESSAGE.len(), - input_bytes_concat(&mut d, FIRST_MESSAGE, SECOND_MESSAGE), - ); - assert_eq!(d.frames.len(), 0); - pop_first(&mut d); - assert_eq!(d.frames.len(), 1); - pop_second(&mut d); - assert!(!d.has_pending()); - assert!(!d.desynced); - } - - #[test] - fn test_two_in_one_read_shortest_first() { - let mut d = MessageDeframer::new(); - assert!(!d.has_pending()); - assert_len( - FIRST_MESSAGE.len() + SECOND_MESSAGE.len(), - input_bytes_concat(&mut d, SECOND_MESSAGE, FIRST_MESSAGE), - ); - assert_eq!(d.frames.len(), 0); - pop_second(&mut d); - assert_eq!(d.frames.len(), 1); - pop_first(&mut d); - assert!(!d.has_pending()); - assert!(!d.desynced); - } - - #[test] - fn test_incremental_with_nonfatal_read_error() { - let mut d = MessageDeframer::new(); - assert_len(3, input_bytes(&mut d, &FIRST_MESSAGE[..3])); - input_error(&mut d); - assert_len( - FIRST_MESSAGE.len() - 3, - input_bytes(&mut d, &FIRST_MESSAGE[3..]), - ); - assert_eq!(d.frames.len(), 0); - pop_first(&mut d); - assert!(!d.has_pending()); - assert!(!d.desynced); - } - - #[test] - fn test_invalid_contenttype_errors() { - let mut d = MessageDeframer::new(); - assert_len( - INVALID_CONTENTTYPE_MESSAGE.len(), - input_bytes(&mut d, INVALID_CONTENTTYPE_MESSAGE), - ); - assert_eq!(d.pop().unwrap_err(), Error::CorruptMessage); - } - - #[test] - fn test_invalid_version_errors() { - let mut d = MessageDeframer::new(); - assert_len( - INVALID_VERSION_MESSAGE.len(), - input_bytes(&mut d, INVALID_VERSION_MESSAGE), - ); - assert_eq!(d.pop().unwrap_err(), Error::CorruptMessage); - } - - #[test] - fn test_invalid_length_errors() { - let mut d = MessageDeframer::new(); - assert_len( - INVALID_LENGTH_MESSAGE.len(), - input_bytes(&mut d, INVALID_LENGTH_MESSAGE), - ); - assert_eq!(d.pop().unwrap_err(), Error::CorruptMessage); - } - - #[test] - fn test_empty_applicationdata() { - let mut d = MessageDeframer::new(); - assert_len( - EMPTY_APPLICATIONDATA_MESSAGE.len(), - input_bytes(&mut d, EMPTY_APPLICATIONDATA_MESSAGE), - ); - let m = d.pop().unwrap().unwrap(); - assert_eq!(m.typ, msgs::enums::ContentType::ApplicationData); - assert_eq!(m.payload.0.len(), 0); - assert!(!d.has_pending()); - assert!(!d.desynced); - } - - #[test] - fn test_invalid_empty_errors() { - let mut d = MessageDeframer::new(); - assert_len( - INVALID_EMPTY_MESSAGE.len(), - input_bytes(&mut d, INVALID_EMPTY_MESSAGE), - ); - assert_eq!(d.pop().unwrap_err(), Error::CorruptMessage); - // CorruptMessage has been fused - assert_eq!(d.pop().unwrap_err(), Error::CorruptMessage); - } - - #[test] - fn test_limited_buffer() { - const PAYLOAD_LEN: usize = 16_384; - let mut message = Vec::with_capacity(8192); - message.push(0x17); // ApplicationData - message.extend(&[0x03, 0x04]); // ProtocolVersion - message.extend((PAYLOAD_LEN as u16).to_be_bytes()); // payload length - message.extend(&[0; PAYLOAD_LEN]); - - let mut d = MessageDeframer::new(); - assert_len(message.len(), input_bytes(&mut d, &message)); - assert_len( - OpaqueMessage::MAX_WIRE_SIZE - 16_389, - input_bytes(&mut d, &message), - ); - assert!(input_bytes(&mut d, &message).is_err()); - } -} diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/enums.rs temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/enums.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/enums.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/enums.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,375 +0,0 @@ -#![allow(clippy::upper_case_acronyms)] -#![allow(non_camel_case_types)] -/// This file is autogenerated. See https://github.com/ctz/tls-hacking/ -use crate::msgs::codec::{Codec, Reader}; - -enum_builder! { - /// The `HashAlgorithm` TLS protocol enum. Values in this enum are taken - /// from the various RFCs covering TLS, and are listed by IANA. - /// The `Unknown` item is used when processing unrecognised ordinals. - @U8 - EnumName: HashAlgorithm; - EnumVal{ - NONE => 0x00, - MD5 => 0x01, - SHA1 => 0x02, - SHA224 => 0x03, - SHA256 => 0x04, - SHA384 => 0x05, - SHA512 => 0x06 - } -} - -enum_builder! { - /// The `SignatureAlgorithm` TLS protocol enum. Values in this enum are taken - /// from the various RFCs covering TLS, and are listed by IANA. - /// The `Unknown` item is used when processing unrecognised ordinals. - @U8 - EnumName: SignatureAlgorithm; - EnumVal{ - Anonymous => 0x00, - RSA => 0x01, - DSA => 0x02, - ECDSA => 0x03, - ED25519 => 0x07, - ED448 => 0x08 - } -} - -enum_builder! { - /// The `ClientCertificateType` TLS protocol enum. Values in this enum are taken - /// from the various RFCs covering TLS, and are listed by IANA. - /// The `Unknown` item is used when processing unrecognised ordinals. - @U8 - EnumName: ClientCertificateType; - EnumVal{ - RSASign => 0x01, - DSSSign => 0x02, - RSAFixedDH => 0x03, - DSSFixedDH => 0x04, - RSAEphemeralDH => 0x05, - DSSEphemeralDH => 0x06, - FortezzaDMS => 0x14, - ECDSASign => 0x40, - RSAFixedECDH => 0x41, - ECDSAFixedECDH => 0x42 - } -} - -enum_builder! { - /// The `Compression` TLS protocol enum. Values in this enum are taken - /// from the various RFCs covering TLS, and are listed by IANA. - /// The `Unknown` item is used when processing unrecognised ordinals. - @U8 - EnumName: Compression; - EnumVal{ - Null => 0x00, - Deflate => 0x01, - LSZ => 0x40 - } -} - -enum_builder! { - /// The `ContentType` TLS protocol enum. Values in this enum are taken - /// from the various RFCs covering TLS, and are listed by IANA. - /// The `Unknown` item is used when processing unrecognised ordinals. - @U8 - EnumName: ContentType; - EnumVal{ - ChangeCipherSpec => 0x14, - Alert => 0x15, - Handshake => 0x16, - ApplicationData => 0x17, - Heartbeat => 0x18 - } -} - -enum_builder! { - /// The `HandshakeType` TLS protocol enum. Values in this enum are taken - /// from the various RFCs covering TLS, and are listed by IANA. - /// The `Unknown` item is used when processing unrecognised ordinals. - @U8 - EnumName: HandshakeType; - EnumVal{ - HelloRequest => 0x00, - ClientHello => 0x01, - ServerHello => 0x02, - HelloVerifyRequest => 0x03, - NewSessionTicket => 0x04, - EndOfEarlyData => 0x05, - HelloRetryRequest => 0x06, - EncryptedExtensions => 0x08, - Certificate => 0x0b, - ServerKeyExchange => 0x0c, - CertificateRequest => 0x0d, - ServerHelloDone => 0x0e, - CertificateVerify => 0x0f, - ClientKeyExchange => 0x10, - Finished => 0x14, - CertificateURL => 0x15, - CertificateStatus => 0x16, - KeyUpdate => 0x18, - MessageHash => 0xfe - } -} - -enum_builder! { - /// The `AlertLevel` TLS protocol enum. Values in this enum are taken - /// from the various RFCs covering TLS, and are listed by IANA. - /// The `Unknown` item is used when processing unrecognised ordinals. - @U8 - EnumName: AlertLevel; - EnumVal{ - Warning => 0x01, - Fatal => 0x02 - } -} - -enum_builder! { - /// The `AlertDescription` TLS protocol enum. Values in this enum are taken - /// from the various RFCs covering TLS, and are listed by IANA. - /// The `Unknown` item is used when processing unrecognised ordinals. - @U8 - EnumName: AlertDescription; - EnumVal{ - CloseNotify => 0x00, - UnexpectedMessage => 0x0a, - BadRecordMac => 0x14, - DecryptionFailed => 0x15, - RecordOverflow => 0x16, - DecompressionFailure => 0x1e, - HandshakeFailure => 0x28, - NoCertificate => 0x29, - BadCertificate => 0x2a, - UnsupportedCertificate => 0x2b, - CertificateRevoked => 0x2c, - CertificateExpired => 0x2d, - CertificateUnknown => 0x2e, - IllegalParameter => 0x2f, - UnknownCA => 0x30, - AccessDenied => 0x31, - DecodeError => 0x32, - DecryptError => 0x33, - ExportRestriction => 0x3c, - ProtocolVersion => 0x46, - InsufficientSecurity => 0x47, - InternalError => 0x50, - InappropriateFallback => 0x56, - UserCanceled => 0x5a, - NoRenegotiation => 0x64, - MissingExtension => 0x6d, - UnsupportedExtension => 0x6e, - CertificateUnobtainable => 0x6f, - UnrecognisedName => 0x70, - BadCertificateStatusResponse => 0x71, - BadCertificateHashValue => 0x72, - UnknownPSKIdentity => 0x73, - CertificateRequired => 0x74, - NoApplicationProtocol => 0x78 - } -} - -enum_builder! { - /// The `HeartbeatMessageType` TLS protocol enum. Values in this enum are taken - /// from the various RFCs covering TLS, and are listed by IANA. - /// The `Unknown` item is used when processing unrecognised ordinals. - @U8 - EnumName: HeartbeatMessageType; - EnumVal{ - Request => 0x01, - Response => 0x02 - } -} - -enum_builder! { - /// The `ExtensionType` TLS protocol enum. Values in this enum are taken - /// from the various RFCs covering TLS, and are listed by IANA. - /// The `Unknown` item is used when processing unrecognised ordinals. - @U16 - EnumName: ExtensionType; - EnumVal{ - ServerName => 0x0000, - MaxFragmentLength => 0x0001, - ClientCertificateUrl => 0x0002, - TrustedCAKeys => 0x0003, - TruncatedHMAC => 0x0004, - StatusRequest => 0x0005, - UserMapping => 0x0006, - ClientAuthz => 0x0007, - ServerAuthz => 0x0008, - CertificateType => 0x0009, - EllipticCurves => 0x000a, - ECPointFormats => 0x000b, - SRP => 0x000c, - SignatureAlgorithms => 0x000d, - UseSRTP => 0x000e, - Heartbeat => 0x000f, - ALProtocolNegotiation => 0x0010, - SCT => 0x0012, - Padding => 0x0015, - ExtendedMasterSecret => 0x0017, - SessionTicket => 0x0023, - PreSharedKey => 0x0029, - EarlyData => 0x002a, - SupportedVersions => 0x002b, - Cookie => 0x002c, - PSKKeyExchangeModes => 0x002d, - TicketEarlyDataInfo => 0x002e, - CertificateAuthorities => 0x002f, - OIDFilters => 0x0030, - PostHandshakeAuth => 0x0031, - SignatureAlgorithmsCert => 0x0032, - KeyShare => 0x0033, - TransportParameters => 0x0039, - NextProtocolNegotiation => 0x3374, - ChannelId => 0x754f, - RenegotiationInfo => 0xff01, - TransportParametersDraft => 0xffa5 - } -} - -enum_builder! { - /// The `ServerNameType` TLS protocol enum. Values in this enum are taken - /// from the various RFCs covering TLS, and are listed by IANA. - /// The `Unknown` item is used when processing unrecognised ordinals. - @U8 - EnumName: ServerNameType; - EnumVal{ - HostName => 0x00 - } -} - -enum_builder! { - /// The `NamedCurve` TLS protocol enum. Values in this enum are taken - /// from the various RFCs covering TLS, and are listed by IANA. - /// The `Unknown` item is used when processing unrecognised ordinals. - @U16 - EnumName: NamedCurve; - EnumVal{ - sect163k1 => 0x0001, - sect163r1 => 0x0002, - sect163r2 => 0x0003, - sect193r1 => 0x0004, - sect193r2 => 0x0005, - sect233k1 => 0x0006, - sect233r1 => 0x0007, - sect239k1 => 0x0008, - sect283k1 => 0x0009, - sect283r1 => 0x000a, - sect409k1 => 0x000b, - sect409r1 => 0x000c, - sect571k1 => 0x000d, - sect571r1 => 0x000e, - secp160k1 => 0x000f, - secp160r1 => 0x0010, - secp160r2 => 0x0011, - secp192k1 => 0x0012, - secp192r1 => 0x0013, - secp224k1 => 0x0014, - secp224r1 => 0x0015, - secp256k1 => 0x0016, - secp256r1 => 0x0017, - secp384r1 => 0x0018, - secp521r1 => 0x0019, - brainpoolp256r1 => 0x001a, - brainpoolp384r1 => 0x001b, - brainpoolp512r1 => 0x001c, - X25519 => 0x001d, - X448 => 0x001e, - arbitrary_explicit_prime_curves => 0xff01, - arbitrary_explicit_char2_curves => 0xff02 - } -} - -enum_builder! { - /// The `NamedGroup` TLS protocol enum. Values in this enum are taken - /// from the various RFCs covering TLS, and are listed by IANA. - /// The `Unknown` item is used when processing unrecognised ordinals. - @U16 - EnumName: NamedGroup; - EnumVal{ - secp256r1 => 0x0017, - secp384r1 => 0x0018, - secp521r1 => 0x0019, - X25519 => 0x001d, - X448 => 0x001e, - FFDHE2048 => 0x0100, - FFDHE3072 => 0x0101, - FFDHE4096 => 0x0102, - FFDHE6144 => 0x0103, - FFDHE8192 => 0x0104 - } -} - -enum_builder! { - /// The `ECPointFormat` TLS protocol enum. Values in this enum are taken - /// from the various RFCs covering TLS, and are listed by IANA. - /// The `Unknown` item is used when processing unrecognised ordinals. - @U8 - EnumName: ECPointFormat; - EnumVal{ - Uncompressed => 0x00, - ANSIX962CompressedPrime => 0x01, - ANSIX962CompressedChar2 => 0x02 - } -} - -enum_builder! { - /// The `HeartbeatMode` TLS protocol enum. Values in this enum are taken - /// from the various RFCs covering TLS, and are listed by IANA. - /// The `Unknown` item is used when processing unrecognised ordinals. - @U8 - EnumName: HeartbeatMode; - EnumVal{ - PeerAllowedToSend => 0x01, - PeerNotAllowedToSend => 0x02 - } -} - -enum_builder! { - /// The `ECCurveType` TLS protocol enum. Values in this enum are taken - /// from the various RFCs covering TLS, and are listed by IANA. - /// The `Unknown` item is used when processing unrecognised ordinals. - @U8 - EnumName: ECCurveType; - EnumVal{ - ExplicitPrime => 0x01, - ExplicitChar2 => 0x02, - NamedCurve => 0x03 - } -} - -enum_builder! { - /// The `PSKKeyExchangeMode` TLS protocol enum. Values in this enum are taken - /// from the various RFCs covering TLS, and are listed by IANA. - /// The `Unknown` item is used when processing unrecognised ordinals. - @U8 - EnumName: PSKKeyExchangeMode; - EnumVal{ - PSK_KE => 0x00, - PSK_DHE_KE => 0x01 - } -} - -enum_builder! { - /// The `KeyUpdateRequest` TLS protocol enum. Values in this enum are taken - /// from the various RFCs covering TLS, and are listed by IANA. - /// The `Unknown` item is used when processing unrecognised ordinals. - @U8 - EnumName: KeyUpdateRequest; - EnumVal{ - UpdateNotRequested => 0x00, - UpdateRequested => 0x01 - } -} - -enum_builder! { - /// The `CertificateStatusType` TLS protocol enum. Values in this enum are taken - /// from the various RFCs covering TLS, and are listed by IANA. - /// The `Unknown` item is used when processing unrecognised ordinals. - @U8 - EnumName: CertificateStatusType; - EnumVal{ - OCSP => 0x01 - } -} diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/enums_test.rs temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/enums_test.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/enums_test.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/enums_test.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,88 +0,0 @@ -/// These tests are intended to provide coverage and -/// check panic-safety of relatively unused values. -use super::codec::Codec; -use super::enums::*; - -fn get8(enum_value: &T) -> u8 { - let enc = enum_value.get_encoding(); - assert_eq!(enc.len(), 1); - enc[0] -} - -fn get16(enum_value: &T) -> u16 { - let enc = enum_value.get_encoding(); - assert_eq!(enc.len(), 2); - (enc[0] as u16 >> 8) | (enc[1] as u16) -} - -fn test_enum16(first: T, last: T) { - let first_v = get16(&first); - let last_v = get16(&last); - - for val in first_v..last_v + 1 { - let mut buf = Vec::new(); - val.encode(&mut buf); - assert_eq!(buf.len(), 2); - - let t = T::read_bytes(&buf).unwrap(); - assert_eq!(val, get16(&t)); - } -} - -fn test_enum8(first: T, last: T) { - let first_v = get8(&first); - let last_v = get8(&last); - - for val in first_v..last_v + 1 { - let mut buf = Vec::new(); - val.encode(&mut buf); - assert_eq!(buf.len(), 1); - - let t = T::read_bytes(&buf).unwrap(); - assert_eq!(val, get8(&t)); - } -} - -#[test] -fn test_enums() { - test_enum8::(HashAlgorithm::NONE, HashAlgorithm::SHA512); - test_enum8::(SignatureAlgorithm::Anonymous, SignatureAlgorithm::ECDSA); - test_enum8::( - ClientCertificateType::RSASign, - ClientCertificateType::ECDSAFixedECDH, - ); - test_enum8::(Compression::Null, Compression::LSZ); - test_enum8::(ContentType::ChangeCipherSpec, ContentType::Heartbeat); - test_enum8::(HandshakeType::HelloRequest, HandshakeType::MessageHash); - test_enum8::(AlertLevel::Warning, AlertLevel::Fatal); - test_enum8::( - AlertDescription::CloseNotify, - AlertDescription::NoApplicationProtocol, - ); - test_enum8::( - HeartbeatMessageType::Request, - HeartbeatMessageType::Response, - ); - test_enum16::(ExtensionType::ServerName, ExtensionType::RenegotiationInfo); - test_enum8::(ServerNameType::HostName, ServerNameType::HostName); - test_enum16::( - NamedCurve::sect163k1, - NamedCurve::arbitrary_explicit_char2_curves, - ); - test_enum16::(NamedGroup::secp256r1, NamedGroup::FFDHE8192); - test_enum8::( - ECPointFormat::Uncompressed, - ECPointFormat::ANSIX962CompressedChar2, - ); - test_enum8::( - HeartbeatMode::PeerAllowedToSend, - HeartbeatMode::PeerNotAllowedToSend, - ); - test_enum8::(ECCurveType::ExplicitPrime, ECCurveType::NamedCurve); - test_enum8::(PSKKeyExchangeMode::PSK_KE, PSKKeyExchangeMode::PSK_DHE_KE); - test_enum8::( - KeyUpdateRequest::UpdateNotRequested, - KeyUpdateRequest::UpdateRequested, - ); - test_enum8::(CertificateStatusType::OCSP, CertificateStatusType::OCSP); -} diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/fragmenter.rs temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/fragmenter.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/fragmenter.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/fragmenter.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,162 +0,0 @@ -use crate::enums::ProtocolVersion; -use crate::msgs::enums::ContentType; -use crate::msgs::message::{BorrowedPlainMessage, PlainMessage}; -use crate::Error; -pub const MAX_FRAGMENT_LEN: usize = 16384; -pub const PACKET_OVERHEAD: usize = 1 + 2 + 2; -pub const MAX_FRAGMENT_SIZE: usize = MAX_FRAGMENT_LEN + PACKET_OVERHEAD; - -pub struct MessageFragmenter { - max_frag: usize, -} - -impl Default for MessageFragmenter { - fn default() -> Self { - Self { - max_frag: MAX_FRAGMENT_LEN, - } - } -} - -impl MessageFragmenter { - /// Take the Message `msg` and re-fragment it into new - /// messages whose fragment is no more than max_frag. - /// Return an iterator across those messages. - /// Payloads are borrowed. - pub fn fragment_message<'a>( - &self, - msg: &'a PlainMessage, - ) -> impl Iterator> + 'a { - self.fragment_slice(msg.typ, msg.version, &msg.payload.0) - } - - /// Enqueue borrowed fragments of (version, typ, payload) which - /// are no longer than max_frag onto the `out` deque. - pub fn fragment_slice<'a>( - &self, - typ: ContentType, - version: ProtocolVersion, - payload: &'a [u8], - ) -> impl Iterator> + 'a { - payload - .chunks(self.max_frag) - .map(move |c| BorrowedPlainMessage { - typ, - version, - payload: c, - }) - } - - /// Set the maximum fragment size that will be produced. - /// - /// This includes overhead. A `max_fragment_size` of 10 will produce TLS fragments - /// up to 10 bytes long. - /// - /// A `max_fragment_size` of `None` sets the highest allowable fragment size. - /// - /// Returns BadMaxFragmentSize if the size is smaller than 32 or larger than 16389. - pub fn set_max_fragment_size(&mut self, max_fragment_size: Option) -> Result<(), Error> { - self.max_frag = match max_fragment_size { - Some(sz @ 32..=MAX_FRAGMENT_SIZE) => sz - PACKET_OVERHEAD, - None => MAX_FRAGMENT_LEN, - _ => return Err(Error::BadMaxFragmentSize), - }; - Ok(()) - } -} - -#[cfg(test)] -mod tests { - use super::{MessageFragmenter, PACKET_OVERHEAD}; - use crate::enums::ProtocolVersion; - use crate::msgs::base::Payload; - use crate::msgs::enums::ContentType; - use crate::msgs::message::{BorrowedPlainMessage, PlainMessage}; - - fn msg_eq( - m: &BorrowedPlainMessage, - total_len: usize, - typ: &ContentType, - version: &ProtocolVersion, - bytes: &[u8], - ) { - assert_eq!(&m.typ, typ); - assert_eq!(&m.version, version); - assert_eq!(m.payload, bytes); - - let buf = m.to_unencrypted_opaque().encode(); - - assert_eq!(total_len, buf.len()); - } - - #[test] - fn smoke() { - let typ = ContentType::Handshake; - let version = ProtocolVersion::TLSv1_2; - let data: Vec = (1..70u8).collect(); - let m = PlainMessage { - typ, - version, - payload: Payload::new(data), - }; - - let mut frag = MessageFragmenter::default(); - frag.set_max_fragment_size(Some(32)) - .unwrap(); - let q = frag - .fragment_message(&m) - .collect::>(); - assert_eq!(q.len(), 3); - msg_eq( - &q[0], - 32, - &typ, - &version, - &[ - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, - ], - ); - msg_eq( - &q[1], - 32, - &typ, - &version, - &[ - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, - 49, 50, 51, 52, 53, 54, - ], - ); - msg_eq( - &q[2], - 20, - &typ, - &version, - &[55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69], - ); - } - - #[test] - fn non_fragment() { - let m = PlainMessage { - typ: ContentType::Handshake, - version: ProtocolVersion::TLSv1_2, - payload: Payload::new(b"\x01\x02\x03\x04\x05\x06\x07\x08".to_vec()), - }; - - let mut frag = MessageFragmenter::default(); - frag.set_max_fragment_size(Some(32)) - .unwrap(); - let q = frag - .fragment_message(&m) - .collect::>(); - assert_eq!(q.len(), 1); - msg_eq( - &q[0], - PACKET_OVERHEAD + 8, - &ContentType::Handshake, - &ProtocolVersion::TLSv1_2, - b"\x01\x02\x03\x04\x05\x06\x07\x08", - ); - } -} diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/handshake.rs temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/handshake.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/handshake.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/handshake.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,2371 +0,0 @@ -#![allow(non_camel_case_types)] -use crate::enums::{CipherSuite, ProtocolVersion, SignatureScheme}; -use crate::key; -use crate::msgs::base::{Payload, PayloadU16, PayloadU24, PayloadU8}; -use crate::msgs::codec; -use crate::msgs::codec::{Codec, Reader}; -use crate::msgs::enums::{ - CertificateStatusType, ClientCertificateType, Compression, ECCurveType, ECPointFormat, - ExtensionType, HandshakeType, HashAlgorithm, KeyUpdateRequest, NamedGroup, PSKKeyExchangeMode, - ServerNameType, SignatureAlgorithm, -}; -use crate::rand; - -#[cfg(feature = "logging")] -use crate::log::warn; - -use std::collections; -use std::fmt; - -macro_rules! declare_u8_vec( - ($name:ident, $itemtype:ty) => { - pub type $name = Vec<$itemtype>; - - impl Codec for $name { - fn encode(&self, bytes: &mut Vec) { - codec::encode_vec_u8(bytes, self); - } - - fn read(r: &mut Reader) -> Option { - codec::read_vec_u8::<$itemtype>(r) - } - } - } -); - -macro_rules! declare_u16_vec( - ($name:ident, $itemtype:ty) => { - pub type $name = Vec<$itemtype>; - - impl Codec for $name { - fn encode(&self, bytes: &mut Vec) { - codec::encode_vec_u16(bytes, self); - } - - fn read(r: &mut Reader) -> Option { - codec::read_vec_u16::<$itemtype>(r) - } - } - } -); - -declare_u16_vec!(VecU16OfPayloadU8, PayloadU8); -declare_u16_vec!(VecU16OfPayloadU16, PayloadU16); - -#[derive(Clone, Copy, Eq, PartialEq)] -pub struct Random(pub [u8; 32]); - -impl fmt::Debug for Random { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - super::base::hex(f, &self.0) - } -} - -static HELLO_RETRY_REQUEST_RANDOM: Random = Random([ - 0xcf, 0x21, 0xad, 0x74, 0xe5, 0x9a, 0x61, 0x11, 0xbe, 0x1d, 0x8c, 0x02, 0x1e, 0x65, 0xb8, 0x91, - 0xc2, 0xa2, 0x11, 0x16, 0x7a, 0xbb, 0x8c, 0x5e, 0x07, 0x9e, 0x09, 0xe2, 0xc8, 0xa8, 0x33, 0x9c, -]); - -static ZERO_RANDOM: Random = Random([0u8; 32]); - -impl Codec for Random { - fn encode(&self, bytes: &mut Vec) { - bytes.extend_from_slice(&self.0); - } - - fn read(r: &mut Reader) -> Option { - let bytes = r.take(32)?; - let mut opaque = [0; 32]; - opaque.clone_from_slice(bytes); - - Some(Self(opaque)) - } -} - -impl Random { - pub fn new() -> Result { - let mut data = [0u8; 32]; - rand::fill_random(&mut data)?; - Ok(Self(data)) - } - - pub fn write_slice(&self, bytes: &mut [u8]) { - let buf = self.get_encoding(); - bytes.copy_from_slice(&buf); - } -} - -impl From<[u8; 32]> for Random { - #[inline] - fn from(bytes: [u8; 32]) -> Self { - Self(bytes) - } -} - -#[derive(Copy, Clone)] -pub struct SessionID { - len: usize, - data: [u8; 32], -} - -impl fmt::Debug for SessionID { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - super::base::hex(f, &self.data[..self.len]) - } -} - -impl PartialEq for SessionID { - fn eq(&self, other: &Self) -> bool { - if self.len != other.len { - return false; - } - - let mut diff = 0u8; - for i in 0..self.len { - diff |= self.data[i] ^ other.data[i] - } - - diff == 0u8 - } -} - -impl Codec for SessionID { - fn encode(&self, bytes: &mut Vec) { - debug_assert!(self.len <= 32); - bytes.push(self.len as u8); - bytes.extend_from_slice(&self.data[..self.len]); - } - - fn read(r: &mut Reader) -> Option { - let len = u8::read(r)? as usize; - if len > 32 { - return None; - } - - let bytes = r.take(len)?; - let mut out = [0u8; 32]; - out[..len].clone_from_slice(&bytes[..len]); - - Some(Self { data: out, len }) - } -} - -impl SessionID { - pub fn random() -> Result { - let mut data = [0u8; 32]; - rand::fill_random(&mut data)?; - Ok(Self { data, len: 32 }) - } - - pub fn empty() -> Self { - Self { - data: [0u8; 32], - len: 0, - } - } - - pub fn len(&self) -> usize { - self.len - } - - pub fn is_empty(&self) -> bool { - self.len == 0 - } -} - -#[derive(Clone, Debug)] -pub struct UnknownExtension { - pub typ: ExtensionType, - pub payload: Payload, -} - -impl UnknownExtension { - fn encode(&self, bytes: &mut Vec) { - self.payload.encode(bytes); - } - - fn read(typ: ExtensionType, r: &mut Reader) -> Self { - let payload = Payload::read(r); - Self { typ, payload } - } -} - -declare_u8_vec!(ECPointFormatList, ECPointFormat); - -pub trait SupportedPointFormats { - fn supported() -> ECPointFormatList; -} - -impl SupportedPointFormats for ECPointFormatList { - fn supported() -> ECPointFormatList { - vec![ECPointFormat::Uncompressed] - } -} - -declare_u16_vec!(NamedGroups, NamedGroup); - -declare_u16_vec!(SupportedSignatureSchemes, SignatureScheme); - -pub trait DecomposedSignatureScheme { - fn sign(&self) -> SignatureAlgorithm; - fn make(alg: SignatureAlgorithm, hash: HashAlgorithm) -> SignatureScheme; -} - -impl DecomposedSignatureScheme for SignatureScheme { - fn sign(&self) -> SignatureAlgorithm { - match *self { - Self::RSA_PKCS1_SHA1 - | Self::RSA_PKCS1_SHA256 - | Self::RSA_PKCS1_SHA384 - | Self::RSA_PKCS1_SHA512 - | Self::RSA_PSS_SHA256 - | Self::RSA_PSS_SHA384 - | Self::RSA_PSS_SHA512 => SignatureAlgorithm::RSA, - Self::ECDSA_NISTP256_SHA256 - | Self::ECDSA_NISTP384_SHA384 - | Self::ECDSA_NISTP521_SHA512 => SignatureAlgorithm::ECDSA, - _ => SignatureAlgorithm::Unknown(0), - } - } - - fn make(alg: SignatureAlgorithm, hash: HashAlgorithm) -> SignatureScheme { - use crate::msgs::enums::HashAlgorithm::{SHA1, SHA256, SHA384, SHA512}; - use crate::msgs::enums::SignatureAlgorithm::{ECDSA, RSA}; - - match (alg, hash) { - (RSA, SHA1) => Self::RSA_PKCS1_SHA1, - (RSA, SHA256) => Self::RSA_PKCS1_SHA256, - (RSA, SHA384) => Self::RSA_PKCS1_SHA384, - (RSA, SHA512) => Self::RSA_PKCS1_SHA512, - (ECDSA, SHA256) => Self::ECDSA_NISTP256_SHA256, - (ECDSA, SHA384) => Self::ECDSA_NISTP384_SHA384, - (ECDSA, SHA512) => Self::ECDSA_NISTP521_SHA512, - (_, _) => unreachable!(), - } - } -} - -#[derive(Clone, Debug)] -pub enum ServerNamePayload { - // Stored twice, bytes so we can round-trip, and DnsName for use - HostName((PayloadU16, webpki::DnsName)), - Unknown(Payload), -} - -impl ServerNamePayload { - pub fn new_hostname(hostname: webpki::DnsName) -> Self { - let raw = { - let s: &str = hostname.as_ref().into(); - PayloadU16::new(s.as_bytes().into()) - }; - Self::HostName((raw, hostname)) - } - - fn read_hostname(r: &mut Reader) -> Option { - let raw = PayloadU16::read(r)?; - - let dns_name = { - match webpki::DnsNameRef::try_from_ascii(&raw.0) { - Ok(dns_name) => dns_name.into(), - Err(_) => { - warn!("Illegal SNI hostname received {:?}", raw.0); - return None; - } - } - }; - Some(Self::HostName((raw, dns_name))) - } - - fn encode(&self, bytes: &mut Vec) { - match *self { - Self::HostName((ref r, _)) => r.encode(bytes), - Self::Unknown(ref r) => r.encode(bytes), - } - } -} - -#[derive(Clone, Debug)] -pub struct ServerName { - pub typ: ServerNameType, - pub payload: ServerNamePayload, -} - -impl Codec for ServerName { - fn encode(&self, bytes: &mut Vec) { - self.typ.encode(bytes); - self.payload.encode(bytes); - } - - fn read(r: &mut Reader) -> Option { - let typ = ServerNameType::read(r)?; - - let payload = match typ { - ServerNameType::HostName => ServerNamePayload::read_hostname(r)?, - _ => ServerNamePayload::Unknown(Payload::read(r)), - }; - - Some(Self { typ, payload }) - } -} - -declare_u16_vec!(ServerNameRequest, ServerName); - -pub trait ConvertServerNameList { - fn has_duplicate_names_for_type(&self) -> bool; - fn get_single_hostname(&self) -> Option; -} - -impl ConvertServerNameList for ServerNameRequest { - /// RFC6066: "The ServerNameList MUST NOT contain more than one name of the same name_type." - fn has_duplicate_names_for_type(&self) -> bool { - let mut seen = collections::HashSet::new(); - - for name in self { - if !seen.insert(name.typ.get_u8()) { - return true; - } - } - - false - } - - fn get_single_hostname(&self) -> Option { - fn only_dns_hostnames(name: &ServerName) -> Option { - if let ServerNamePayload::HostName((_, ref dns)) = name.payload { - Some(dns.as_ref()) - } else { - None - } - } - - self.iter() - .filter_map(only_dns_hostnames) - .next() - } -} - -pub type ProtocolNameList = VecU16OfPayloadU8; - -pub trait ConvertProtocolNameList { - fn from_slices(names: &[&[u8]]) -> Self; - fn to_slices(&self) -> Vec<&[u8]>; - fn as_single_slice(&self) -> Option<&[u8]>; -} - -impl ConvertProtocolNameList for ProtocolNameList { - fn from_slices(names: &[&[u8]]) -> Self { - let mut ret = Self::new(); - - for name in names { - ret.push(PayloadU8::new(name.to_vec())); - } - - ret - } - - fn to_slices(&self) -> Vec<&[u8]> { - self.iter() - .map(|proto| -> &[u8] { &proto.0 }) - .collect::>() - } - - fn as_single_slice(&self) -> Option<&[u8]> { - if self.len() == 1 { - Some(&self[0].0) - } else { - None - } - } -} - -// --- TLS 1.3 Key shares --- -#[derive(Clone, Debug)] -pub struct KeyShareEntry { - pub group: NamedGroup, - pub payload: PayloadU16, -} - -impl KeyShareEntry { - pub fn new(group: NamedGroup, payload: &[u8]) -> Self { - Self { - group, - payload: PayloadU16::new(payload.to_vec()), - } - } -} - -impl Codec for KeyShareEntry { - fn encode(&self, bytes: &mut Vec) { - self.group.encode(bytes); - self.payload.encode(bytes); - } - - fn read(r: &mut Reader) -> Option { - let group = NamedGroup::read(r)?; - let payload = PayloadU16::read(r)?; - - Some(Self { group, payload }) - } -} - -// --- TLS 1.3 PresharedKey offers --- -#[derive(Clone, Debug)] -pub struct PresharedKeyIdentity { - pub identity: PayloadU16, - pub obfuscated_ticket_age: u32, -} - -impl PresharedKeyIdentity { - pub fn new(id: Vec, age: u32) -> Self { - Self { - identity: PayloadU16::new(id), - obfuscated_ticket_age: age, - } - } -} - -impl Codec for PresharedKeyIdentity { - fn encode(&self, bytes: &mut Vec) { - self.identity.encode(bytes); - self.obfuscated_ticket_age.encode(bytes); - } - - fn read(r: &mut Reader) -> Option { - Some(Self { - identity: PayloadU16::read(r)?, - obfuscated_ticket_age: u32::read(r)?, - }) - } -} - -declare_u16_vec!(PresharedKeyIdentities, PresharedKeyIdentity); -pub type PresharedKeyBinder = PayloadU8; -pub type PresharedKeyBinders = VecU16OfPayloadU8; - -#[derive(Clone, Debug)] -pub struct PresharedKeyOffer { - pub identities: PresharedKeyIdentities, - pub binders: PresharedKeyBinders, -} - -impl PresharedKeyOffer { - /// Make a new one with one entry. - pub fn new(id: PresharedKeyIdentity, binder: Vec) -> Self { - Self { - identities: vec![id], - binders: vec![PresharedKeyBinder::new(binder)], - } - } -} - -impl Codec for PresharedKeyOffer { - fn encode(&self, bytes: &mut Vec) { - self.identities.encode(bytes); - self.binders.encode(bytes); - } - - fn read(r: &mut Reader) -> Option { - Some(Self { - identities: PresharedKeyIdentities::read(r)?, - binders: PresharedKeyBinders::read(r)?, - }) - } -} - -// --- RFC6066 certificate status request --- -type ResponderIDs = VecU16OfPayloadU16; - -#[derive(Clone, Debug)] -pub struct OCSPCertificateStatusRequest { - pub responder_ids: ResponderIDs, - pub extensions: PayloadU16, -} - -impl Codec for OCSPCertificateStatusRequest { - fn encode(&self, bytes: &mut Vec) { - CertificateStatusType::OCSP.encode(bytes); - self.responder_ids.encode(bytes); - self.extensions.encode(bytes); - } - - fn read(r: &mut Reader) -> Option { - Some(Self { - responder_ids: ResponderIDs::read(r)?, - extensions: PayloadU16::read(r)?, - }) - } -} - -#[derive(Clone, Debug)] -pub enum CertificateStatusRequest { - OCSP(OCSPCertificateStatusRequest), - Unknown((CertificateStatusType, Payload)), -} - -impl Codec for CertificateStatusRequest { - fn encode(&self, bytes: &mut Vec) { - match self { - Self::OCSP(ref r) => r.encode(bytes), - Self::Unknown((typ, payload)) => { - typ.encode(bytes); - payload.encode(bytes); - } - } - } - - fn read(r: &mut Reader) -> Option { - let typ = CertificateStatusType::read(r)?; - - match typ { - CertificateStatusType::OCSP => { - let ocsp_req = OCSPCertificateStatusRequest::read(r)?; - Some(Self::OCSP(ocsp_req)) - } - _ => { - let data = Payload::read(r); - Some(Self::Unknown((typ, data))) - } - } - } -} - -impl CertificateStatusRequest { - pub fn build_ocsp() -> Self { - let ocsp = OCSPCertificateStatusRequest { - responder_ids: ResponderIDs::new(), - extensions: PayloadU16::empty(), - }; - Self::OCSP(ocsp) - } -} - -// --- -// SCTs - -pub type SCTList = VecU16OfPayloadU16; - -// --- - -declare_u8_vec!(PSKKeyExchangeModes, PSKKeyExchangeMode); -declare_u16_vec!(KeyShareEntries, KeyShareEntry); -declare_u8_vec!(ProtocolVersions, ProtocolVersion); - -#[derive(Clone, Debug)] -pub enum ClientExtension { - ECPointFormats(ECPointFormatList), - NamedGroups(NamedGroups), - SignatureAlgorithms(SupportedSignatureSchemes), - ServerName(ServerNameRequest), - SessionTicket(ClientSessionTicket), - Protocols(ProtocolNameList), - SupportedVersions(ProtocolVersions), - KeyShare(KeyShareEntries), - PresharedKeyModes(PSKKeyExchangeModes), - PresharedKey(PresharedKeyOffer), - Cookie(PayloadU16), - ExtendedMasterSecretRequest, - CertificateStatusRequest(CertificateStatusRequest), - SignedCertificateTimestampRequest, - TransportParameters(Vec), - TransportParametersDraft(Vec), - EarlyData, - Unknown(UnknownExtension), -} - -impl ClientExtension { - pub fn get_type(&self) -> ExtensionType { - match *self { - Self::ECPointFormats(_) => ExtensionType::ECPointFormats, - Self::NamedGroups(_) => ExtensionType::EllipticCurves, - Self::SignatureAlgorithms(_) => ExtensionType::SignatureAlgorithms, - Self::ServerName(_) => ExtensionType::ServerName, - Self::SessionTicket(_) => ExtensionType::SessionTicket, - Self::Protocols(_) => ExtensionType::ALProtocolNegotiation, - Self::SupportedVersions(_) => ExtensionType::SupportedVersions, - Self::KeyShare(_) => ExtensionType::KeyShare, - Self::PresharedKeyModes(_) => ExtensionType::PSKKeyExchangeModes, - Self::PresharedKey(_) => ExtensionType::PreSharedKey, - Self::Cookie(_) => ExtensionType::Cookie, - Self::ExtendedMasterSecretRequest => ExtensionType::ExtendedMasterSecret, - Self::CertificateStatusRequest(_) => ExtensionType::StatusRequest, - Self::SignedCertificateTimestampRequest => ExtensionType::SCT, - Self::TransportParameters(_) => ExtensionType::TransportParameters, - Self::TransportParametersDraft(_) => ExtensionType::TransportParametersDraft, - Self::EarlyData => ExtensionType::EarlyData, - Self::Unknown(ref r) => r.typ, - } - } -} - -impl Codec for ClientExtension { - fn encode(&self, bytes: &mut Vec) { - self.get_type().encode(bytes); - - let mut sub: Vec = Vec::new(); - match *self { - Self::ECPointFormats(ref r) => r.encode(&mut sub), - Self::NamedGroups(ref r) => r.encode(&mut sub), - Self::SignatureAlgorithms(ref r) => r.encode(&mut sub), - Self::ServerName(ref r) => r.encode(&mut sub), - Self::SessionTicket(ClientSessionTicket::Request) - | Self::ExtendedMasterSecretRequest - | Self::SignedCertificateTimestampRequest - | Self::EarlyData => {} - Self::SessionTicket(ClientSessionTicket::Offer(ref r)) => r.encode(&mut sub), - Self::Protocols(ref r) => r.encode(&mut sub), - Self::SupportedVersions(ref r) => r.encode(&mut sub), - Self::KeyShare(ref r) => r.encode(&mut sub), - Self::PresharedKeyModes(ref r) => r.encode(&mut sub), - Self::PresharedKey(ref r) => r.encode(&mut sub), - Self::Cookie(ref r) => r.encode(&mut sub), - Self::CertificateStatusRequest(ref r) => r.encode(&mut sub), - Self::TransportParameters(ref r) | Self::TransportParametersDraft(ref r) => { - sub.extend_from_slice(r) - } - Self::Unknown(ref r) => r.encode(&mut sub), - } - - (sub.len() as u16).encode(bytes); - bytes.append(&mut sub); - } - - fn read(r: &mut Reader) -> Option { - let typ = ExtensionType::read(r)?; - let len = u16::read(r)? as usize; - let mut sub = r.sub(len)?; - - let ext = match typ { - ExtensionType::ECPointFormats => { - Self::ECPointFormats(ECPointFormatList::read(&mut sub)?) - } - ExtensionType::EllipticCurves => Self::NamedGroups(NamedGroups::read(&mut sub)?), - ExtensionType::SignatureAlgorithms => { - let schemes = SupportedSignatureSchemes::read(&mut sub)?; - Self::SignatureAlgorithms(schemes) - } - ExtensionType::ServerName => Self::ServerName(ServerNameRequest::read(&mut sub)?), - ExtensionType::SessionTicket => { - if sub.any_left() { - let contents = Payload::read(&mut sub); - Self::SessionTicket(ClientSessionTicket::Offer(contents)) - } else { - Self::SessionTicket(ClientSessionTicket::Request) - } - } - ExtensionType::ALProtocolNegotiation => { - Self::Protocols(ProtocolNameList::read(&mut sub)?) - } - ExtensionType::SupportedVersions => { - Self::SupportedVersions(ProtocolVersions::read(&mut sub)?) - } - ExtensionType::KeyShare => Self::KeyShare(KeyShareEntries::read(&mut sub)?), - ExtensionType::PSKKeyExchangeModes => { - Self::PresharedKeyModes(PSKKeyExchangeModes::read(&mut sub)?) - } - ExtensionType::PreSharedKey => Self::PresharedKey(PresharedKeyOffer::read(&mut sub)?), - ExtensionType::Cookie => Self::Cookie(PayloadU16::read(&mut sub)?), - ExtensionType::ExtendedMasterSecret if !sub.any_left() => { - Self::ExtendedMasterSecretRequest - } - ExtensionType::StatusRequest => { - let csr = CertificateStatusRequest::read(&mut sub)?; - Self::CertificateStatusRequest(csr) - } - ExtensionType::SCT if !sub.any_left() => Self::SignedCertificateTimestampRequest, - ExtensionType::TransportParameters => Self::TransportParameters(sub.rest().to_vec()), - ExtensionType::TransportParametersDraft => { - Self::TransportParametersDraft(sub.rest().to_vec()) - } - ExtensionType::EarlyData if !sub.any_left() => Self::EarlyData, - _ => Self::Unknown(UnknownExtension::read(typ, &mut sub)), - }; - - if sub.any_left() { - None - } else { - Some(ext) - } - } -} - -fn trim_hostname_trailing_dot_for_sni(dns_name: webpki::DnsNameRef) -> webpki::DnsName { - let dns_name_str: &str = dns_name.into(); - - // RFC6066: "The hostname is represented as a byte string using - // ASCII encoding without a trailing dot" - if dns_name_str.ends_with('.') { - let trimmed = &dns_name_str[0..dns_name_str.len() - 1]; - webpki::DnsNameRef::try_from_ascii_str(trimmed) - .unwrap() - .to_owned() - } else { - dns_name.to_owned() - } -} - -impl ClientExtension { - /// Make a basic SNI ServerNameRequest quoting `hostname`. - pub fn make_sni(dns_name: webpki::DnsNameRef) -> Self { - let name = ServerName { - typ: ServerNameType::HostName, - payload: ServerNamePayload::new_hostname(trim_hostname_trailing_dot_for_sni(dns_name)), - }; - - Self::ServerName(vec![name]) - } -} - -#[derive(Clone, Debug)] -pub enum ClientSessionTicket { - Request, - Offer(Payload), -} - -#[derive(Clone, Debug)] -pub enum ServerExtension { - ECPointFormats(ECPointFormatList), - ServerNameAck, - SessionTicketAck, - RenegotiationInfo(PayloadU8), - Protocols(ProtocolNameList), - KeyShare(KeyShareEntry), - PresharedKey(u16), - ExtendedMasterSecretAck, - CertificateStatusAck, - SignedCertificateTimestamp(SCTList), - SupportedVersions(ProtocolVersion), - TransportParameters(Vec), - TransportParametersDraft(Vec), - EarlyData, - Unknown(UnknownExtension), -} - -impl ServerExtension { - pub fn get_type(&self) -> ExtensionType { - match *self { - Self::ECPointFormats(_) => ExtensionType::ECPointFormats, - Self::ServerNameAck => ExtensionType::ServerName, - Self::SessionTicketAck => ExtensionType::SessionTicket, - Self::RenegotiationInfo(_) => ExtensionType::RenegotiationInfo, - Self::Protocols(_) => ExtensionType::ALProtocolNegotiation, - Self::KeyShare(_) => ExtensionType::KeyShare, - Self::PresharedKey(_) => ExtensionType::PreSharedKey, - Self::ExtendedMasterSecretAck => ExtensionType::ExtendedMasterSecret, - Self::CertificateStatusAck => ExtensionType::StatusRequest, - Self::SignedCertificateTimestamp(_) => ExtensionType::SCT, - Self::SupportedVersions(_) => ExtensionType::SupportedVersions, - Self::TransportParameters(_) => ExtensionType::TransportParameters, - Self::TransportParametersDraft(_) => ExtensionType::TransportParametersDraft, - Self::EarlyData => ExtensionType::EarlyData, - Self::Unknown(ref r) => r.typ, - } - } -} - -impl Codec for ServerExtension { - fn encode(&self, bytes: &mut Vec) { - self.get_type().encode(bytes); - - let mut sub: Vec = Vec::new(); - match *self { - Self::ECPointFormats(ref r) => r.encode(&mut sub), - Self::ServerNameAck - | Self::SessionTicketAck - | Self::ExtendedMasterSecretAck - | Self::CertificateStatusAck - | Self::EarlyData => {} - Self::RenegotiationInfo(ref r) => r.encode(&mut sub), - Self::Protocols(ref r) => r.encode(&mut sub), - Self::KeyShare(ref r) => r.encode(&mut sub), - Self::PresharedKey(r) => r.encode(&mut sub), - Self::SignedCertificateTimestamp(ref r) => r.encode(&mut sub), - Self::SupportedVersions(ref r) => r.encode(&mut sub), - Self::TransportParameters(ref r) | Self::TransportParametersDraft(ref r) => { - sub.extend_from_slice(r) - } - Self::Unknown(ref r) => r.encode(&mut sub), - } - - (sub.len() as u16).encode(bytes); - bytes.append(&mut sub); - } - - fn read(r: &mut Reader) -> Option { - let typ = ExtensionType::read(r)?; - let len = u16::read(r)? as usize; - let mut sub = r.sub(len)?; - - let ext = match typ { - ExtensionType::ECPointFormats => { - Self::ECPointFormats(ECPointFormatList::read(&mut sub)?) - } - ExtensionType::ServerName => Self::ServerNameAck, - ExtensionType::SessionTicket => Self::SessionTicketAck, - ExtensionType::StatusRequest => Self::CertificateStatusAck, - ExtensionType::RenegotiationInfo => Self::RenegotiationInfo(PayloadU8::read(&mut sub)?), - ExtensionType::ALProtocolNegotiation => { - Self::Protocols(ProtocolNameList::read(&mut sub)?) - } - ExtensionType::KeyShare => Self::KeyShare(KeyShareEntry::read(&mut sub)?), - ExtensionType::PreSharedKey => Self::PresharedKey(u16::read(&mut sub)?), - ExtensionType::ExtendedMasterSecret => Self::ExtendedMasterSecretAck, - ExtensionType::SCT => { - let scts = SCTList::read(&mut sub)?; - Self::SignedCertificateTimestamp(scts) - } - ExtensionType::SupportedVersions => { - Self::SupportedVersions(ProtocolVersion::read(&mut sub)?) - } - ExtensionType::TransportParameters => Self::TransportParameters(sub.rest().to_vec()), - ExtensionType::TransportParametersDraft => { - Self::TransportParametersDraft(sub.rest().to_vec()) - } - ExtensionType::EarlyData => Self::EarlyData, - _ => Self::Unknown(UnknownExtension::read(typ, &mut sub)), - }; - - if sub.any_left() { - None - } else { - Some(ext) - } - } -} - -impl ServerExtension { - pub fn make_alpn(proto: &[&[u8]]) -> Self { - Self::Protocols(ProtocolNameList::from_slices(proto)) - } - - pub fn make_empty_renegotiation_info() -> Self { - let empty = Vec::new(); - Self::RenegotiationInfo(PayloadU8::new(empty)) - } - - pub fn make_sct(sctl: Vec) -> Self { - let scts = SCTList::read_bytes(&sctl).expect("invalid SCT list"); - Self::SignedCertificateTimestamp(scts) - } -} - -#[derive(Debug)] -pub struct ClientHelloPayload { - pub client_version: ProtocolVersion, - pub random: Random, - pub session_id: SessionID, - pub cipher_suites: Vec, - pub compression_methods: Vec, - pub extensions: Vec, -} - -impl Codec for ClientHelloPayload { - fn encode(&self, bytes: &mut Vec) { - self.client_version.encode(bytes); - self.random.encode(bytes); - self.session_id.encode(bytes); - codec::encode_vec_u16(bytes, &self.cipher_suites); - codec::encode_vec_u8(bytes, &self.compression_methods); - - if !self.extensions.is_empty() { - codec::encode_vec_u16(bytes, &self.extensions); - } - } - - fn read(r: &mut Reader) -> Option { - let mut ret = Self { - client_version: ProtocolVersion::read(r)?, - random: Random::read(r)?, - session_id: SessionID::read(r)?, - cipher_suites: codec::read_vec_u16::(r)?, - compression_methods: codec::read_vec_u8::(r)?, - extensions: Vec::new(), - }; - - if r.any_left() { - ret.extensions = codec::read_vec_u16::(r)?; - } - - if r.any_left() || ret.extensions.is_empty() { - None - } else { - Some(ret) - } - } -} - -impl ClientHelloPayload { - /// Returns true if there is more than one extension of a given - /// type. - pub fn has_duplicate_extension(&self) -> bool { - let mut seen = collections::HashSet::new(); - - for ext in &self.extensions { - let typ = ext.get_type().get_u16(); - - if seen.contains(&typ) { - return true; - } - seen.insert(typ); - } - - false - } - - pub fn find_extension(&self, ext: ExtensionType) -> Option<&ClientExtension> { - self.extensions - .iter() - .find(|x| x.get_type() == ext) - } - - pub fn get_sni_extension(&self) -> Option<&ServerNameRequest> { - let ext = self.find_extension(ExtensionType::ServerName)?; - match *ext { - ClientExtension::ServerName(ref req) => Some(req), - _ => None, - } - } - - pub fn get_sigalgs_extension(&self) -> Option<&SupportedSignatureSchemes> { - let ext = self.find_extension(ExtensionType::SignatureAlgorithms)?; - match *ext { - ClientExtension::SignatureAlgorithms(ref req) => Some(req), - _ => None, - } - } - - pub fn get_namedgroups_extension(&self) -> Option<&NamedGroups> { - let ext = self.find_extension(ExtensionType::EllipticCurves)?; - match *ext { - ClientExtension::NamedGroups(ref req) => Some(req), - _ => None, - } - } - - pub fn get_ecpoints_extension(&self) -> Option<&ECPointFormatList> { - let ext = self.find_extension(ExtensionType::ECPointFormats)?; - match *ext { - ClientExtension::ECPointFormats(ref req) => Some(req), - _ => None, - } - } - - pub fn get_alpn_extension(&self) -> Option<&ProtocolNameList> { - let ext = self.find_extension(ExtensionType::ALProtocolNegotiation)?; - match *ext { - ClientExtension::Protocols(ref req) => Some(req), - _ => None, - } - } - - pub fn get_quic_params_extension(&self) -> Option> { - let ext = self - .find_extension(ExtensionType::TransportParameters) - .or_else(|| self.find_extension(ExtensionType::TransportParametersDraft))?; - match *ext { - ClientExtension::TransportParameters(ref bytes) - | ClientExtension::TransportParametersDraft(ref bytes) => Some(bytes.to_vec()), - _ => None, - } - } - - pub fn get_ticket_extension(&self) -> Option<&ClientExtension> { - self.find_extension(ExtensionType::SessionTicket) - } - - pub fn get_versions_extension(&self) -> Option<&ProtocolVersions> { - let ext = self.find_extension(ExtensionType::SupportedVersions)?; - match *ext { - ClientExtension::SupportedVersions(ref vers) => Some(vers), - _ => None, - } - } - - pub fn get_keyshare_extension(&self) -> Option<&KeyShareEntries> { - let ext = self.find_extension(ExtensionType::KeyShare)?; - match *ext { - ClientExtension::KeyShare(ref shares) => Some(shares), - _ => None, - } - } - - pub fn has_keyshare_extension_with_duplicates(&self) -> bool { - if let Some(entries) = self.get_keyshare_extension() { - let mut seen = collections::HashSet::new(); - - for kse in entries { - let grp = kse.group.get_u16(); - - if !seen.insert(grp) { - return true; - } - } - } - - false - } - - pub fn get_psk(&self) -> Option<&PresharedKeyOffer> { - let ext = self.find_extension(ExtensionType::PreSharedKey)?; - match *ext { - ClientExtension::PresharedKey(ref psk) => Some(psk), - _ => None, - } - } - - pub fn check_psk_ext_is_last(&self) -> bool { - self.extensions - .last() - .map_or(false, |ext| ext.get_type() == ExtensionType::PreSharedKey) - } - - pub fn get_psk_modes(&self) -> Option<&PSKKeyExchangeModes> { - let ext = self.find_extension(ExtensionType::PSKKeyExchangeModes)?; - match *ext { - ClientExtension::PresharedKeyModes(ref psk_modes) => Some(psk_modes), - _ => None, - } - } - - pub fn psk_mode_offered(&self, mode: PSKKeyExchangeMode) -> bool { - self.get_psk_modes() - .map(|modes| modes.contains(&mode)) - .unwrap_or(false) - } - - pub fn set_psk_binder(&mut self, binder: impl Into>) { - let last_extension = self.extensions.last_mut(); - if let Some(ClientExtension::PresharedKey(ref mut offer)) = last_extension { - offer.binders[0] = PresharedKeyBinder::new(binder.into()); - } - } - - pub fn ems_support_offered(&self) -> bool { - self.find_extension(ExtensionType::ExtendedMasterSecret) - .is_some() - } - - pub fn early_data_extension_offered(&self) -> bool { - self.find_extension(ExtensionType::EarlyData) - .is_some() - } -} - -#[derive(Debug)] -pub enum HelloRetryExtension { - KeyShare(NamedGroup), - Cookie(PayloadU16), - SupportedVersions(ProtocolVersion), - Unknown(UnknownExtension), -} - -impl HelloRetryExtension { - pub fn get_type(&self) -> ExtensionType { - match *self { - Self::KeyShare(_) => ExtensionType::KeyShare, - Self::Cookie(_) => ExtensionType::Cookie, - Self::SupportedVersions(_) => ExtensionType::SupportedVersions, - Self::Unknown(ref r) => r.typ, - } - } -} - -impl Codec for HelloRetryExtension { - fn encode(&self, bytes: &mut Vec) { - self.get_type().encode(bytes); - - let mut sub: Vec = Vec::new(); - match *self { - Self::KeyShare(ref r) => r.encode(&mut sub), - Self::Cookie(ref r) => r.encode(&mut sub), - Self::SupportedVersions(ref r) => r.encode(&mut sub), - Self::Unknown(ref r) => r.encode(&mut sub), - } - - (sub.len() as u16).encode(bytes); - bytes.append(&mut sub); - } - - fn read(r: &mut Reader) -> Option { - let typ = ExtensionType::read(r)?; - let len = u16::read(r)? as usize; - let mut sub = r.sub(len)?; - - let ext = match typ { - ExtensionType::KeyShare => Self::KeyShare(NamedGroup::read(&mut sub)?), - ExtensionType::Cookie => Self::Cookie(PayloadU16::read(&mut sub)?), - ExtensionType::SupportedVersions => { - Self::SupportedVersions(ProtocolVersion::read(&mut sub)?) - } - _ => Self::Unknown(UnknownExtension::read(typ, &mut sub)), - }; - - if sub.any_left() { - None - } else { - Some(ext) - } - } -} - -#[derive(Debug)] -pub struct HelloRetryRequest { - pub legacy_version: ProtocolVersion, - pub session_id: SessionID, - pub cipher_suite: CipherSuite, - pub extensions: Vec, -} - -impl Codec for HelloRetryRequest { - fn encode(&self, bytes: &mut Vec) { - self.legacy_version.encode(bytes); - HELLO_RETRY_REQUEST_RANDOM.encode(bytes); - self.session_id.encode(bytes); - self.cipher_suite.encode(bytes); - Compression::Null.encode(bytes); - codec::encode_vec_u16(bytes, &self.extensions); - } - - fn read(r: &mut Reader) -> Option { - let session_id = SessionID::read(r)?; - let cipher_suite = CipherSuite::read(r)?; - let compression = Compression::read(r)?; - - if compression != Compression::Null { - return None; - } - - Some(Self { - legacy_version: ProtocolVersion::Unknown(0), - session_id, - cipher_suite, - extensions: codec::read_vec_u16::(r)?, - }) - } -} - -impl HelloRetryRequest { - /// Returns true if there is more than one extension of a given - /// type. - pub fn has_duplicate_extension(&self) -> bool { - let mut seen = collections::HashSet::new(); - - for ext in &self.extensions { - let typ = ext.get_type().get_u16(); - - if seen.contains(&typ) { - return true; - } - seen.insert(typ); - } - - false - } - - pub fn has_unknown_extension(&self) -> bool { - self.extensions.iter().any(|ext| { - ext.get_type() != ExtensionType::KeyShare - && ext.get_type() != ExtensionType::SupportedVersions - && ext.get_type() != ExtensionType::Cookie - }) - } - - fn find_extension(&self, ext: ExtensionType) -> Option<&HelloRetryExtension> { - self.extensions - .iter() - .find(|x| x.get_type() == ext) - } - - pub fn get_requested_key_share_group(&self) -> Option { - let ext = self.find_extension(ExtensionType::KeyShare)?; - match *ext { - HelloRetryExtension::KeyShare(grp) => Some(grp), - _ => None, - } - } - - pub fn get_cookie(&self) -> Option<&PayloadU16> { - let ext = self.find_extension(ExtensionType::Cookie)?; - match *ext { - HelloRetryExtension::Cookie(ref ck) => Some(ck), - _ => None, - } - } - - pub fn get_supported_versions(&self) -> Option { - let ext = self.find_extension(ExtensionType::SupportedVersions)?; - match *ext { - HelloRetryExtension::SupportedVersions(ver) => Some(ver), - _ => None, - } - } -} - -#[derive(Debug)] -pub struct ServerHelloPayload { - pub legacy_version: ProtocolVersion, - pub random: Random, - pub session_id: SessionID, - pub cipher_suite: CipherSuite, - pub compression_method: Compression, - pub extensions: Vec, -} - -impl Codec for ServerHelloPayload { - fn encode(&self, bytes: &mut Vec) { - self.legacy_version.encode(bytes); - self.random.encode(bytes); - - self.session_id.encode(bytes); - self.cipher_suite.encode(bytes); - self.compression_method.encode(bytes); - - if !self.extensions.is_empty() { - codec::encode_vec_u16(bytes, &self.extensions); - } - } - - // minus version and random, which have already been read. - fn read(r: &mut Reader) -> Option { - let session_id = SessionID::read(r)?; - let suite = CipherSuite::read(r)?; - let compression = Compression::read(r)?; - - // RFC5246: - // "The presence of extensions can be detected by determining whether - // there are bytes following the compression_method field at the end of - // the ServerHello." - let extensions = if r.any_left() { - codec::read_vec_u16::(r)? - } else { - vec![] - }; - - let ret = Self { - legacy_version: ProtocolVersion::Unknown(0), - random: ZERO_RANDOM, - session_id, - cipher_suite: suite, - compression_method: compression, - extensions, - }; - - if r.any_left() { - None - } else { - Some(ret) - } - } -} - -impl HasServerExtensions for ServerHelloPayload { - fn get_extensions(&self) -> &[ServerExtension] { - &self.extensions - } -} - -impl ServerHelloPayload { - pub fn get_key_share(&self) -> Option<&KeyShareEntry> { - let ext = self.find_extension(ExtensionType::KeyShare)?; - match *ext { - ServerExtension::KeyShare(ref share) => Some(share), - _ => None, - } - } - - pub fn get_psk_index(&self) -> Option { - let ext = self.find_extension(ExtensionType::PreSharedKey)?; - match *ext { - ServerExtension::PresharedKey(ref index) => Some(*index), - _ => None, - } - } - - pub fn get_ecpoints_extension(&self) -> Option<&ECPointFormatList> { - let ext = self.find_extension(ExtensionType::ECPointFormats)?; - match *ext { - ServerExtension::ECPointFormats(ref fmts) => Some(fmts), - _ => None, - } - } - - pub fn ems_support_acked(&self) -> bool { - self.find_extension(ExtensionType::ExtendedMasterSecret) - .is_some() - } - - pub fn get_sct_list(&self) -> Option<&SCTList> { - let ext = self.find_extension(ExtensionType::SCT)?; - match *ext { - ServerExtension::SignedCertificateTimestamp(ref sctl) => Some(sctl), - _ => None, - } - } - - pub fn get_supported_versions(&self) -> Option { - let ext = self.find_extension(ExtensionType::SupportedVersions)?; - match *ext { - ServerExtension::SupportedVersions(vers) => Some(vers), - _ => None, - } - } -} - -pub type CertificatePayload = Vec; - -impl Codec for CertificatePayload { - fn encode(&self, bytes: &mut Vec) { - codec::encode_vec_u24(bytes, self); - } - - fn read(r: &mut Reader) -> Option { - // 64KB of certificates is plenty, 16MB is obviously silly - codec::read_vec_u24_limited(r, 0x10000) - } -} - -// TLS1.3 changes the Certificate payload encoding. -// That's annoying. It means the parsing is not -// context-free any more. - -#[derive(Debug)] -pub enum CertificateExtension { - CertificateStatus(CertificateStatus), - SignedCertificateTimestamp(SCTList), - Unknown(UnknownExtension), -} - -impl CertificateExtension { - pub fn get_type(&self) -> ExtensionType { - match *self { - Self::CertificateStatus(_) => ExtensionType::StatusRequest, - Self::SignedCertificateTimestamp(_) => ExtensionType::SCT, - Self::Unknown(ref r) => r.typ, - } - } - - pub fn make_sct(sct_list: Vec) -> Self { - let sctl = SCTList::read_bytes(&sct_list).expect("invalid SCT list"); - Self::SignedCertificateTimestamp(sctl) - } - - pub fn get_cert_status(&self) -> Option<&Vec> { - match *self { - Self::CertificateStatus(ref cs) => Some(&cs.ocsp_response.0), - _ => None, - } - } - - pub fn get_sct_list(&self) -> Option<&SCTList> { - match *self { - Self::SignedCertificateTimestamp(ref sctl) => Some(sctl), - _ => None, - } - } -} - -impl Codec for CertificateExtension { - fn encode(&self, bytes: &mut Vec) { - self.get_type().encode(bytes); - - let mut sub: Vec = Vec::new(); - match *self { - Self::CertificateStatus(ref r) => r.encode(&mut sub), - Self::SignedCertificateTimestamp(ref r) => r.encode(&mut sub), - Self::Unknown(ref r) => r.encode(&mut sub), - } - - (sub.len() as u16).encode(bytes); - bytes.append(&mut sub); - } - - fn read(r: &mut Reader) -> Option { - let typ = ExtensionType::read(r)?; - let len = u16::read(r)? as usize; - let mut sub = r.sub(len)?; - - let ext = match typ { - ExtensionType::StatusRequest => { - let st = CertificateStatus::read(&mut sub)?; - Self::CertificateStatus(st) - } - ExtensionType::SCT => { - let scts = SCTList::read(&mut sub)?; - Self::SignedCertificateTimestamp(scts) - } - _ => Self::Unknown(UnknownExtension::read(typ, &mut sub)), - }; - - if sub.any_left() { - None - } else { - Some(ext) - } - } -} - -declare_u16_vec!(CertificateExtensions, CertificateExtension); - -#[derive(Debug)] -pub struct CertificateEntry { - pub cert: key::Certificate, - pub exts: CertificateExtensions, -} - -impl Codec for CertificateEntry { - fn encode(&self, bytes: &mut Vec) { - self.cert.encode(bytes); - self.exts.encode(bytes); - } - - fn read(r: &mut Reader) -> Option { - Some(Self { - cert: key::Certificate::read(r)?, - exts: CertificateExtensions::read(r)?, - }) - } -} - -impl CertificateEntry { - pub fn new(cert: key::Certificate) -> Self { - Self { - cert, - exts: Vec::new(), - } - } - - pub fn has_duplicate_extension(&self) -> bool { - let mut seen = collections::HashSet::new(); - - for ext in &self.exts { - let typ = ext.get_type().get_u16(); - - if seen.contains(&typ) { - return true; - } - seen.insert(typ); - } - - false - } - - pub fn has_unknown_extension(&self) -> bool { - self.exts.iter().any(|ext| { - ext.get_type() != ExtensionType::StatusRequest && ext.get_type() != ExtensionType::SCT - }) - } - - pub fn get_ocsp_response(&self) -> Option<&Vec> { - self.exts - .iter() - .find(|ext| ext.get_type() == ExtensionType::StatusRequest) - .and_then(CertificateExtension::get_cert_status) - } - - pub fn get_scts(&self) -> Option<&SCTList> { - self.exts - .iter() - .find(|ext| ext.get_type() == ExtensionType::SCT) - .and_then(CertificateExtension::get_sct_list) - } -} - -#[derive(Debug)] -pub struct CertificatePayloadTLS13 { - pub context: PayloadU8, - pub entries: Vec, -} - -impl Codec for CertificatePayloadTLS13 { - fn encode(&self, bytes: &mut Vec) { - self.context.encode(bytes); - codec::encode_vec_u24(bytes, &self.entries); - } - - fn read(r: &mut Reader) -> Option { - Some(Self { - context: PayloadU8::read(r)?, - entries: codec::read_vec_u24_limited::(r, 0x10000)?, - }) - } -} - -impl CertificatePayloadTLS13 { - pub fn new(entries: Vec) -> Self { - Self { - context: PayloadU8::empty(), - entries, - } - } - - pub fn any_entry_has_duplicate_extension(&self) -> bool { - for entry in &self.entries { - if entry.has_duplicate_extension() { - return true; - } - } - - false - } - - pub fn any_entry_has_unknown_extension(&self) -> bool { - for entry in &self.entries { - if entry.has_unknown_extension() { - return true; - } - } - - false - } - - pub fn any_entry_has_extension(&self) -> bool { - for entry in &self.entries { - if !entry.exts.is_empty() { - return true; - } - } - - false - } - - pub fn get_end_entity_ocsp(&self) -> Vec { - self.entries - .first() - .and_then(CertificateEntry::get_ocsp_response) - .cloned() - .unwrap_or_default() - } - - pub fn get_end_entity_scts(&self) -> Option { - self.entries - .first() - .and_then(CertificateEntry::get_scts) - .cloned() - } - - pub fn convert(&self) -> CertificatePayload { - let mut ret = Vec::new(); - for entry in &self.entries { - ret.push(entry.cert.clone()); - } - ret - } -} - -#[derive(Debug)] -pub enum KeyExchangeAlgorithm { - BulkOnly, - DH, - DHE, - RSA, - ECDH, - ECDHE, -} - -// We don't support arbitrary curves. It's a terrible -// idea and unnecessary attack surface. Please, -// get a grip. -#[derive(Debug)] -pub struct ECParameters { - pub curve_type: ECCurveType, - pub named_group: NamedGroup, -} - -impl Codec for ECParameters { - fn encode(&self, bytes: &mut Vec) { - self.curve_type.encode(bytes); - self.named_group.encode(bytes); - } - - fn read(r: &mut Reader) -> Option { - let ct = ECCurveType::read(r)?; - - if ct != ECCurveType::NamedCurve { - return None; - } - - let grp = NamedGroup::read(r)?; - - Some(Self { - curve_type: ct, - named_group: grp, - }) - } -} - -#[derive(Debug, Clone)] -pub struct DigitallySignedStruct { - pub scheme: SignatureScheme, - #[deprecated(since = "0.20.7", note = "Use signature() accessor")] - pub sig: PayloadU16, -} - -impl DigitallySignedStruct { - #![allow(deprecated)] - pub fn new(scheme: SignatureScheme, sig: Vec) -> Self { - Self { - scheme, - sig: PayloadU16::new(sig), - } - } - - pub fn signature(&self) -> &[u8] { - &self.sig.0 - } -} - -impl Codec for DigitallySignedStruct { - #![allow(deprecated)] - fn encode(&self, bytes: &mut Vec) { - self.scheme.encode(bytes); - self.sig.encode(bytes); - } - - fn read(r: &mut Reader) -> Option { - let scheme = SignatureScheme::read(r)?; - let sig = PayloadU16::read(r)?; - - Some(Self { scheme, sig }) - } -} - -#[derive(Debug)] -pub struct ClientECDHParams { - pub public: PayloadU8, -} - -impl Codec for ClientECDHParams { - fn encode(&self, bytes: &mut Vec) { - self.public.encode(bytes); - } - - fn read(r: &mut Reader) -> Option { - let pb = PayloadU8::read(r)?; - Some(Self { public: pb }) - } -} - -#[derive(Debug)] -pub struct ServerECDHParams { - pub curve_params: ECParameters, - pub public: PayloadU8, -} - -impl ServerECDHParams { - pub fn new(named_group: NamedGroup, pubkey: &[u8]) -> Self { - Self { - curve_params: ECParameters { - curve_type: ECCurveType::NamedCurve, - named_group, - }, - public: PayloadU8::new(pubkey.to_vec()), - } - } -} - -impl Codec for ServerECDHParams { - fn encode(&self, bytes: &mut Vec) { - self.curve_params.encode(bytes); - self.public.encode(bytes); - } - - fn read(r: &mut Reader) -> Option { - let cp = ECParameters::read(r)?; - let pb = PayloadU8::read(r)?; - - Some(Self { - curve_params: cp, - public: pb, - }) - } -} - -#[derive(Debug)] -pub struct ECDHEServerKeyExchange { - pub params: ServerECDHParams, - pub dss: DigitallySignedStruct, -} - -impl Codec for ECDHEServerKeyExchange { - fn encode(&self, bytes: &mut Vec) { - self.params.encode(bytes); - self.dss.encode(bytes); - } - - fn read(r: &mut Reader) -> Option { - let params = ServerECDHParams::read(r)?; - let dss = DigitallySignedStruct::read(r)?; - - Some(Self { params, dss }) - } -} - -#[derive(Debug)] -pub enum ServerKeyExchangePayload { - ECDHE(ECDHEServerKeyExchange), - Unknown(Payload), -} - -impl Codec for ServerKeyExchangePayload { - fn encode(&self, bytes: &mut Vec) { - match *self { - Self::ECDHE(ref x) => x.encode(bytes), - Self::Unknown(ref x) => x.encode(bytes), - } - } - - fn read(r: &mut Reader) -> Option { - // read as Unknown, fully parse when we know the - // KeyExchangeAlgorithm - Some(Self::Unknown(Payload::read(r))) - } -} - -impl ServerKeyExchangePayload { - pub fn unwrap_given_kxa(&self, kxa: &KeyExchangeAlgorithm) -> Option { - if let Self::Unknown(ref unk) = *self { - let mut rd = Reader::init(&unk.0); - - let result = match *kxa { - KeyExchangeAlgorithm::ECDHE => ECDHEServerKeyExchange::read(&mut rd), - _ => None, - }; - - if !rd.any_left() { - return result; - }; - } - - None - } -} - -// -- EncryptedExtensions (TLS1.3 only) -- -declare_u16_vec!(EncryptedExtensions, ServerExtension); - -pub trait HasServerExtensions { - fn get_extensions(&self) -> &[ServerExtension]; - - /// Returns true if there is more than one extension of a given - /// type. - fn has_duplicate_extension(&self) -> bool { - let mut seen = collections::HashSet::new(); - - for ext in self.get_extensions() { - let typ = ext.get_type().get_u16(); - - if seen.contains(&typ) { - return true; - } - seen.insert(typ); - } - - false - } - - fn find_extension(&self, ext: ExtensionType) -> Option<&ServerExtension> { - self.get_extensions() - .iter() - .find(|x| x.get_type() == ext) - } - - fn get_alpn_protocol(&self) -> Option<&[u8]> { - let ext = self.find_extension(ExtensionType::ALProtocolNegotiation)?; - match *ext { - ServerExtension::Protocols(ref protos) => protos.as_single_slice(), - _ => None, - } - } - - fn get_quic_params_extension(&self) -> Option> { - let ext = self - .find_extension(ExtensionType::TransportParameters) - .or_else(|| self.find_extension(ExtensionType::TransportParametersDraft))?; - match *ext { - ServerExtension::TransportParameters(ref bytes) - | ServerExtension::TransportParametersDraft(ref bytes) => Some(bytes.to_vec()), - _ => None, - } - } - - fn early_data_extension_offered(&self) -> bool { - self.find_extension(ExtensionType::EarlyData) - .is_some() - } -} - -impl HasServerExtensions for EncryptedExtensions { - fn get_extensions(&self) -> &[ServerExtension] { - self - } -} - -// -- CertificateRequest and sundries -- -declare_u8_vec!(ClientCertificateTypes, ClientCertificateType); -pub type DistinguishedName = PayloadU16; -/// DistinguishedNames is a `Vec>` wrapped in internal types. Each element contains the -/// DER or BER encoded [`Subject` field from RFC 5280](https://datatracker.ietf.org/doc/html/rfc5280#section-4.1.2.6) -/// for a single certificate. The Subject field is -/// [encoded as an RFC 5280 `Name`](https://datatracker.ietf.org/doc/html/rfc5280#page-116). -/// It can be decoded using [x509-parser's FromDer trait](https://docs.rs/x509-parser/latest/x509_parser/traits/trait.FromDer.html). -/// -/// ```ignore -/// for name in distinguished_names { -/// use x509_parser::traits::FromDer; -/// println!("{}", x509_parser::x509::X509Name::from_der(&name.0)?.1); -/// } -/// ``` -pub type DistinguishedNames = VecU16OfPayloadU16; - -#[derive(Debug)] -pub struct CertificateRequestPayload { - pub certtypes: ClientCertificateTypes, - pub sigschemes: SupportedSignatureSchemes, - pub canames: DistinguishedNames, -} - -impl Codec for CertificateRequestPayload { - fn encode(&self, bytes: &mut Vec) { - self.certtypes.encode(bytes); - self.sigschemes.encode(bytes); - self.canames.encode(bytes); - } - - fn read(r: &mut Reader) -> Option { - let certtypes = ClientCertificateTypes::read(r)?; - let sigschemes = SupportedSignatureSchemes::read(r)?; - let canames = DistinguishedNames::read(r)?; - - if sigschemes.is_empty() { - warn!("meaningless CertificateRequest message"); - None - } else { - Some(Self { - certtypes, - sigschemes, - canames, - }) - } - } -} - -#[derive(Debug)] -pub enum CertReqExtension { - SignatureAlgorithms(SupportedSignatureSchemes), - AuthorityNames(DistinguishedNames), - Unknown(UnknownExtension), -} - -impl CertReqExtension { - pub fn get_type(&self) -> ExtensionType { - match *self { - Self::SignatureAlgorithms(_) => ExtensionType::SignatureAlgorithms, - Self::AuthorityNames(_) => ExtensionType::CertificateAuthorities, - Self::Unknown(ref r) => r.typ, - } - } -} - -impl Codec for CertReqExtension { - fn encode(&self, bytes: &mut Vec) { - self.get_type().encode(bytes); - - let mut sub: Vec = Vec::new(); - match *self { - Self::SignatureAlgorithms(ref r) => r.encode(&mut sub), - Self::AuthorityNames(ref r) => r.encode(&mut sub), - Self::Unknown(ref r) => r.encode(&mut sub), - } - - (sub.len() as u16).encode(bytes); - bytes.append(&mut sub); - } - - fn read(r: &mut Reader) -> Option { - let typ = ExtensionType::read(r)?; - let len = u16::read(r)? as usize; - let mut sub = r.sub(len)?; - - let ext = match typ { - ExtensionType::SignatureAlgorithms => { - let schemes = SupportedSignatureSchemes::read(&mut sub)?; - if schemes.is_empty() { - return None; - } - Self::SignatureAlgorithms(schemes) - } - ExtensionType::CertificateAuthorities => { - let cas = DistinguishedNames::read(&mut sub)?; - Self::AuthorityNames(cas) - } - _ => Self::Unknown(UnknownExtension::read(typ, &mut sub)), - }; - - if sub.any_left() { - None - } else { - Some(ext) - } - } -} - -declare_u16_vec!(CertReqExtensions, CertReqExtension); - -#[derive(Debug)] -pub struct CertificateRequestPayloadTLS13 { - pub context: PayloadU8, - pub extensions: CertReqExtensions, -} - -impl Codec for CertificateRequestPayloadTLS13 { - fn encode(&self, bytes: &mut Vec) { - self.context.encode(bytes); - self.extensions.encode(bytes); - } - - fn read(r: &mut Reader) -> Option { - let context = PayloadU8::read(r)?; - let extensions = CertReqExtensions::read(r)?; - - Some(Self { - context, - extensions, - }) - } -} - -impl CertificateRequestPayloadTLS13 { - pub fn find_extension(&self, ext: ExtensionType) -> Option<&CertReqExtension> { - self.extensions - .iter() - .find(|x| x.get_type() == ext) - } - - pub fn get_sigalgs_extension(&self) -> Option<&SupportedSignatureSchemes> { - let ext = self.find_extension(ExtensionType::SignatureAlgorithms)?; - match *ext { - CertReqExtension::SignatureAlgorithms(ref sa) => Some(sa), - _ => None, - } - } - - pub fn get_authorities_extension(&self) -> Option<&DistinguishedNames> { - let ext = self.find_extension(ExtensionType::CertificateAuthorities)?; - match *ext { - CertReqExtension::AuthorityNames(ref an) => Some(an), - _ => None, - } - } -} - -// -- NewSessionTicket -- -#[derive(Debug)] -pub struct NewSessionTicketPayload { - pub lifetime_hint: u32, - pub ticket: PayloadU16, -} - -impl NewSessionTicketPayload { - pub fn new(lifetime_hint: u32, ticket: Vec) -> Self { - Self { - lifetime_hint, - ticket: PayloadU16::new(ticket), - } - } -} - -impl Codec for NewSessionTicketPayload { - fn encode(&self, bytes: &mut Vec) { - self.lifetime_hint.encode(bytes); - self.ticket.encode(bytes); - } - - fn read(r: &mut Reader) -> Option { - let lifetime = u32::read(r)?; - let ticket = PayloadU16::read(r)?; - - Some(Self { - lifetime_hint: lifetime, - ticket, - }) - } -} - -// -- NewSessionTicket electric boogaloo -- -#[derive(Debug)] -pub enum NewSessionTicketExtension { - EarlyData(u32), - Unknown(UnknownExtension), -} - -impl NewSessionTicketExtension { - pub fn get_type(&self) -> ExtensionType { - match *self { - Self::EarlyData(_) => ExtensionType::EarlyData, - Self::Unknown(ref r) => r.typ, - } - } -} - -impl Codec for NewSessionTicketExtension { - fn encode(&self, bytes: &mut Vec) { - self.get_type().encode(bytes); - - let mut sub: Vec = Vec::new(); - match *self { - Self::EarlyData(r) => r.encode(&mut sub), - Self::Unknown(ref r) => r.encode(&mut sub), - } - - (sub.len() as u16).encode(bytes); - bytes.append(&mut sub); - } - - fn read(r: &mut Reader) -> Option { - let typ = ExtensionType::read(r)?; - let len = u16::read(r)? as usize; - let mut sub = r.sub(len)?; - - let ext = match typ { - ExtensionType::EarlyData => Self::EarlyData(u32::read(&mut sub)?), - _ => Self::Unknown(UnknownExtension::read(typ, &mut sub)), - }; - - if sub.any_left() { - None - } else { - Some(ext) - } - } -} - -declare_u16_vec!(NewSessionTicketExtensions, NewSessionTicketExtension); - -#[derive(Debug)] -pub struct NewSessionTicketPayloadTLS13 { - pub lifetime: u32, - pub age_add: u32, - pub nonce: PayloadU8, - pub ticket: PayloadU16, - pub exts: NewSessionTicketExtensions, -} - -impl NewSessionTicketPayloadTLS13 { - pub fn new(lifetime: u32, age_add: u32, nonce: Vec, ticket: Vec) -> Self { - Self { - lifetime, - age_add, - nonce: PayloadU8::new(nonce), - ticket: PayloadU16::new(ticket), - exts: vec![], - } - } - - pub fn has_duplicate_extension(&self) -> bool { - let mut seen = collections::HashSet::new(); - - for ext in &self.exts { - let typ = ext.get_type().get_u16(); - - if seen.contains(&typ) { - return true; - } - seen.insert(typ); - } - - false - } - - pub fn find_extension(&self, ext: ExtensionType) -> Option<&NewSessionTicketExtension> { - self.exts - .iter() - .find(|x| x.get_type() == ext) - } - - pub fn get_max_early_data_size(&self) -> Option { - let ext = self.find_extension(ExtensionType::EarlyData)?; - match *ext { - NewSessionTicketExtension::EarlyData(ref sz) => Some(*sz), - _ => None, - } - } -} - -impl Codec for NewSessionTicketPayloadTLS13 { - fn encode(&self, bytes: &mut Vec) { - self.lifetime.encode(bytes); - self.age_add.encode(bytes); - self.nonce.encode(bytes); - self.ticket.encode(bytes); - self.exts.encode(bytes); - } - - fn read(r: &mut Reader) -> Option { - let lifetime = u32::read(r)?; - let age_add = u32::read(r)?; - let nonce = PayloadU8::read(r)?; - let ticket = PayloadU16::read(r)?; - let exts = NewSessionTicketExtensions::read(r)?; - - Some(Self { - lifetime, - age_add, - nonce, - ticket, - exts, - }) - } -} - -// -- RFC6066 certificate status types - -/// Only supports OCSP -#[derive(Debug)] -pub struct CertificateStatus { - pub ocsp_response: PayloadU24, -} - -impl Codec for CertificateStatus { - fn encode(&self, bytes: &mut Vec) { - CertificateStatusType::OCSP.encode(bytes); - self.ocsp_response.encode(bytes); - } - - fn read(r: &mut Reader) -> Option { - let typ = CertificateStatusType::read(r)?; - - match typ { - CertificateStatusType::OCSP => Some(Self { - ocsp_response: PayloadU24::read(r)?, - }), - _ => None, - } - } -} - -impl CertificateStatus { - pub fn new(ocsp: Vec) -> Self { - Self { - ocsp_response: PayloadU24::new(ocsp), - } - } - - pub fn into_inner(self) -> Vec { - self.ocsp_response.0 - } -} - -#[derive(Debug)] -pub enum HandshakePayload { - HelloRequest, - ClientHello(ClientHelloPayload), - ServerHello(ServerHelloPayload), - HelloRetryRequest(HelloRetryRequest), - Certificate(CertificatePayload), - CertificateTLS13(CertificatePayloadTLS13), - ServerKeyExchange(ServerKeyExchangePayload), - CertificateRequest(CertificateRequestPayload), - CertificateRequestTLS13(CertificateRequestPayloadTLS13), - CertificateVerify(DigitallySignedStruct), - ServerHelloDone, - EndOfEarlyData, - ClientKeyExchange(Payload), - NewSessionTicket(NewSessionTicketPayload), - NewSessionTicketTLS13(NewSessionTicketPayloadTLS13), - EncryptedExtensions(EncryptedExtensions), - KeyUpdate(KeyUpdateRequest), - Finished(Payload), - CertificateStatus(CertificateStatus), - MessageHash(Payload), - Unknown(Payload), -} - -impl HandshakePayload { - fn encode(&self, bytes: &mut Vec) { - use self::HandshakePayload::*; - match *self { - HelloRequest | ServerHelloDone | EndOfEarlyData => {} - ClientHello(ref x) => x.encode(bytes), - ServerHello(ref x) => x.encode(bytes), - HelloRetryRequest(ref x) => x.encode(bytes), - Certificate(ref x) => x.encode(bytes), - CertificateTLS13(ref x) => x.encode(bytes), - ServerKeyExchange(ref x) => x.encode(bytes), - ClientKeyExchange(ref x) => x.encode(bytes), - CertificateRequest(ref x) => x.encode(bytes), - CertificateRequestTLS13(ref x) => x.encode(bytes), - CertificateVerify(ref x) => x.encode(bytes), - NewSessionTicket(ref x) => x.encode(bytes), - NewSessionTicketTLS13(ref x) => x.encode(bytes), - EncryptedExtensions(ref x) => x.encode(bytes), - KeyUpdate(ref x) => x.encode(bytes), - Finished(ref x) => x.encode(bytes), - CertificateStatus(ref x) => x.encode(bytes), - MessageHash(ref x) => x.encode(bytes), - Unknown(ref x) => x.encode(bytes), - } - } -} - -#[derive(Debug)] -pub struct HandshakeMessagePayload { - pub typ: HandshakeType, - pub payload: HandshakePayload, -} - -impl Codec for HandshakeMessagePayload { - fn encode(&self, bytes: &mut Vec) { - // encode payload to learn length - let mut sub: Vec = Vec::new(); - self.payload.encode(&mut sub); - - // output type, length, and encoded payload - match self.typ { - HandshakeType::HelloRetryRequest => HandshakeType::ServerHello, - _ => self.typ, - } - .encode(bytes); - codec::u24(sub.len() as u32).encode(bytes); - bytes.append(&mut sub); - } - - fn read(r: &mut Reader) -> Option { - Self::read_version(r, ProtocolVersion::TLSv1_2) - } -} - -impl HandshakeMessagePayload { - pub fn read_version(r: &mut Reader, vers: ProtocolVersion) -> Option { - let mut typ = HandshakeType::read(r)?; - let len = codec::u24::read(r)?.0 as usize; - let mut sub = r.sub(len)?; - - let payload = match typ { - HandshakeType::HelloRequest if sub.left() == 0 => HandshakePayload::HelloRequest, - HandshakeType::ClientHello => { - HandshakePayload::ClientHello(ClientHelloPayload::read(&mut sub)?) - } - HandshakeType::ServerHello => { - let version = ProtocolVersion::read(&mut sub)?; - let random = Random::read(&mut sub)?; - - if random == HELLO_RETRY_REQUEST_RANDOM { - let mut hrr = HelloRetryRequest::read(&mut sub)?; - hrr.legacy_version = version; - typ = HandshakeType::HelloRetryRequest; - HandshakePayload::HelloRetryRequest(hrr) - } else { - let mut shp = ServerHelloPayload::read(&mut sub)?; - shp.legacy_version = version; - shp.random = random; - HandshakePayload::ServerHello(shp) - } - } - HandshakeType::Certificate if vers == ProtocolVersion::TLSv1_3 => { - let p = CertificatePayloadTLS13::read(&mut sub)?; - HandshakePayload::CertificateTLS13(p) - } - HandshakeType::Certificate => { - HandshakePayload::Certificate(CertificatePayload::read(&mut sub)?) - } - HandshakeType::ServerKeyExchange => { - let p = ServerKeyExchangePayload::read(&mut sub)?; - HandshakePayload::ServerKeyExchange(p) - } - HandshakeType::ServerHelloDone => { - if sub.any_left() { - return None; - } - HandshakePayload::ServerHelloDone - } - HandshakeType::ClientKeyExchange => { - HandshakePayload::ClientKeyExchange(Payload::read(&mut sub)) - } - HandshakeType::CertificateRequest if vers == ProtocolVersion::TLSv1_3 => { - let p = CertificateRequestPayloadTLS13::read(&mut sub)?; - HandshakePayload::CertificateRequestTLS13(p) - } - HandshakeType::CertificateRequest => { - let p = CertificateRequestPayload::read(&mut sub)?; - HandshakePayload::CertificateRequest(p) - } - HandshakeType::CertificateVerify => { - HandshakePayload::CertificateVerify(DigitallySignedStruct::read(&mut sub)?) - } - HandshakeType::NewSessionTicket if vers == ProtocolVersion::TLSv1_3 => { - let p = NewSessionTicketPayloadTLS13::read(&mut sub)?; - HandshakePayload::NewSessionTicketTLS13(p) - } - HandshakeType::NewSessionTicket => { - let p = NewSessionTicketPayload::read(&mut sub)?; - HandshakePayload::NewSessionTicket(p) - } - HandshakeType::EncryptedExtensions => { - HandshakePayload::EncryptedExtensions(EncryptedExtensions::read(&mut sub)?) - } - HandshakeType::KeyUpdate => { - HandshakePayload::KeyUpdate(KeyUpdateRequest::read(&mut sub)?) - } - HandshakeType::EndOfEarlyData => { - if sub.any_left() { - return None; - } - HandshakePayload::EndOfEarlyData - } - HandshakeType::Finished => HandshakePayload::Finished(Payload::read(&mut sub)), - HandshakeType::CertificateStatus => { - HandshakePayload::CertificateStatus(CertificateStatus::read(&mut sub)?) - } - HandshakeType::MessageHash => { - // does not appear on the wire - return None; - } - HandshakeType::HelloRetryRequest => { - // not legal on wire - return None; - } - _ => HandshakePayload::Unknown(Payload::read(&mut sub)), - }; - - if sub.any_left() { - None - } else { - Some(Self { typ, payload }) - } - } - - pub fn build_key_update_notify() -> Self { - Self { - typ: HandshakeType::KeyUpdate, - payload: HandshakePayload::KeyUpdate(KeyUpdateRequest::UpdateNotRequested), - } - } - - pub fn get_encoding_for_binder_signing(&self) -> Vec { - let mut ret = self.get_encoding(); - - let binder_len = match self.payload { - HandshakePayload::ClientHello(ref ch) => match ch.extensions.last() { - Some(ClientExtension::PresharedKey(ref offer)) => { - let mut binders_encoding = Vec::new(); - offer - .binders - .encode(&mut binders_encoding); - binders_encoding.len() - } - _ => 0, - }, - _ => 0, - }; - - let ret_len = ret.len() - binder_len; - ret.truncate(ret_len); - ret - } - - pub fn build_handshake_hash(hash: &[u8]) -> Self { - Self { - typ: HandshakeType::MessageHash, - payload: HandshakePayload::MessageHash(Payload::new(hash.to_vec())), - } - } -} Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/handshake-test.1.bin and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/handshake-test.1.bin differ diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/handshake_test.rs temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/handshake_test.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/handshake_test.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/handshake_test.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,1247 +0,0 @@ -use crate::enums::{CipherSuite, ProtocolVersion, SignatureScheme}; -use crate::key::Certificate; -use crate::msgs::base::{Payload, PayloadU16, PayloadU24, PayloadU8}; -use crate::msgs::codec::{put_u16, Codec, Reader}; -use crate::msgs::enums::{ - ClientCertificateType, Compression, ECCurveType, ExtensionType, HandshakeType, HashAlgorithm, - KeyUpdateRequest, NamedGroup, PSKKeyExchangeMode, ServerNameType, SignatureAlgorithm, -}; -use crate::msgs::handshake::{ - CertReqExtension, CertificateEntry, CertificateExtension, CertificatePayloadTLS13, - CertificateRequestPayload, CertificateRequestPayloadTLS13, CertificateStatus, - CertificateStatusRequest, ClientExtension, ClientHelloPayload, ClientSessionTicket, - ConvertProtocolNameList, ConvertServerNameList, DecomposedSignatureScheme, - DigitallySignedStruct, ECDHEServerKeyExchange, ECParameters, ECPointFormatList, - EncryptedExtensions, HandshakeMessagePayload, HandshakePayload, HasServerExtensions, - HelloRetryExtension, HelloRetryRequest, KeyShareEntry, NewSessionTicketExtension, - NewSessionTicketPayload, NewSessionTicketPayloadTLS13, PresharedKeyBinder, - PresharedKeyIdentity, PresharedKeyOffer, Random, ServerECDHParams, ServerExtension, - ServerHelloPayload, ServerKeyExchangePayload, SessionID, SupportedPointFormats, - UnknownExtension, -}; -use webpki::DnsNameRef; - -#[test] -fn rejects_short_random() { - let bytes = [0x01; 31]; - let mut rd = Reader::init(&bytes); - assert_eq!(Random::read(&mut rd), None); -} - -#[test] -fn reads_random() { - let bytes = [0x01; 32]; - let mut rd = Reader::init(&bytes); - let rnd = Random::read(&mut rd).unwrap(); - println!("{:?}", rnd); - - assert!(!rd.any_left()); -} - -#[test] -fn debug_random() { - assert_eq!( - "0101010101010101010101010101010101010101010101010101010101010101", - format!("{:?}", Random::from([1; 32])) - ); -} - -#[test] -fn rejects_truncated_sessionid() { - let bytes = [32; 32]; - let mut rd = Reader::init(&bytes); - assert_eq!(SessionID::read(&mut rd), None); -} - -#[test] -fn rejects_sessionid_with_bad_length() { - let bytes = [33; 33]; - let mut rd = Reader::init(&bytes); - assert_eq!(SessionID::read(&mut rd), None); -} - -#[test] -fn sessionid_with_different_lengths_are_unequal() { - let a = SessionID::read(&mut Reader::init(&[1u8, 1])).unwrap(); - let b = SessionID::read(&mut Reader::init(&[2u8, 1, 2])).unwrap(); - assert_ne!(a, b); -} - -#[test] -fn accepts_short_sessionid() { - let bytes = [1; 2]; - let mut rd = Reader::init(&bytes); - let sess = SessionID::read(&mut rd).unwrap(); - println!("{:?}", sess); - - assert!(!sess.is_empty()); - assert_eq!(sess.len(), 1); - assert!(!rd.any_left()); -} - -#[test] -fn accepts_empty_sessionid() { - let bytes = [0; 1]; - let mut rd = Reader::init(&bytes); - let sess = SessionID::read(&mut rd).unwrap(); - println!("{:?}", sess); - - assert!(sess.is_empty()); - assert_eq!(sess.len(), 0); - assert!(!rd.any_left()); -} - -#[test] -fn debug_sessionid() { - let bytes = [ - 32, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, - ]; - let mut rd = Reader::init(&bytes); - let sess = SessionID::read(&mut rd).unwrap(); - assert_eq!( - "0101010101010101010101010101010101010101010101010101010101010101", - format!("{:?}", sess) - ); -} - -#[test] -fn can_roundtrip_unknown_client_ext() { - let bytes = [0x12u8, 0x34u8, 0, 3, 1, 2, 3]; - let mut rd = Reader::init(&bytes); - let ext = ClientExtension::read(&mut rd).unwrap(); - - println!("{:?}", ext); - assert_eq!(ext.get_type(), ExtensionType::Unknown(0x1234)); - assert_eq!(bytes.to_vec(), ext.get_encoding()); -} - -#[test] -fn refuses_client_ext_with_unparsed_bytes() { - let bytes = [0x00u8, 0x0b, 0x00, 0x04, 0x02, 0xf8, 0x01, 0x02]; - let mut rd = Reader::init(&bytes); - assert!(ClientExtension::read(&mut rd).is_none()); -} - -#[test] -fn refuses_server_ext_with_unparsed_bytes() { - let bytes = [0x00u8, 0x0b, 0x00, 0x04, 0x02, 0xf8, 0x01, 0x02]; - let mut rd = Reader::init(&bytes); - assert!(ServerExtension::read(&mut rd).is_none()); -} - -#[test] -fn refuses_certificate_ext_with_unparsed_bytes() { - let bytes = [0x00u8, 0x12, 0x00, 0x03, 0x00, 0x00, 0x01]; - let mut rd = Reader::init(&bytes); - assert!(CertificateExtension::read(&mut rd).is_none()); -} - -#[test] -fn refuses_certificate_req_ext_with_unparsed_bytes() { - let bytes = [0x00u8, 0x0d, 0x00, 0x05, 0x00, 0x02, 0x01, 0x02, 0xff]; - let mut rd = Reader::init(&bytes); - assert!(CertReqExtension::read(&mut rd).is_none()); -} - -#[test] -fn refuses_helloreq_ext_with_unparsed_bytes() { - let bytes = [0x00u8, 0x2b, 0x00, 0x03, 0x00, 0x00, 0x01]; - let mut rd = Reader::init(&bytes); - assert!(HelloRetryExtension::read(&mut rd).is_none()); -} - -#[test] -fn refuses_newsessionticket_ext_with_unparsed_bytes() { - let bytes = [0x00u8, 0x2a, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x01]; - let mut rd = Reader::init(&bytes); - assert!(NewSessionTicketExtension::read(&mut rd).is_none()); -} - -#[test] -fn can_roundtrip_single_sni() { - let bytes = [0, 0, 0, 7, 0, 5, 0, 0, 2, 0x6c, 0x6f]; - let mut rd = Reader::init(&bytes); - let ext = ClientExtension::read(&mut rd).unwrap(); - println!("{:?}", ext); - - assert_eq!(ext.get_type(), ExtensionType::ServerName); - assert_eq!(bytes.to_vec(), ext.get_encoding()); -} - -#[test] -fn can_round_trip_mixed_case_sni() { - let bytes = [0, 0, 0, 7, 0, 5, 0, 0, 2, 0x4c, 0x6f]; - let mut rd = Reader::init(&bytes); - let ext = ClientExtension::read(&mut rd).unwrap(); - println!("{:?}", ext); - - assert_eq!(ext.get_type(), ExtensionType::ServerName); - assert_eq!(bytes.to_vec(), ext.get_encoding()); -} - -#[test] -fn can_roundtrip_other_sni_name_types() { - let bytes = [0, 0, 0, 7, 0, 5, 1, 0, 2, 0x6c, 0x6f]; - let mut rd = Reader::init(&bytes); - let ext = ClientExtension::read(&mut rd).unwrap(); - println!("{:?}", ext); - - assert_eq!(ext.get_type(), ExtensionType::ServerName); - assert_eq!(bytes.to_vec(), ext.get_encoding()); -} - -#[test] -fn get_single_hostname_returns_none_for_other_sni_name_types() { - let bytes = [0, 0, 0, 7, 0, 5, 1, 0, 2, 0x6c, 0x6f]; - let mut rd = Reader::init(&bytes); - let ext = ClientExtension::read(&mut rd).unwrap(); - println!("{:?}", ext); - - assert_eq!(ext.get_type(), ExtensionType::ServerName); - if let ClientExtension::ServerName(snr) = ext { - assert!(!snr.has_duplicate_names_for_type()); - assert!(snr.get_single_hostname().is_none()); - } else { - unreachable!(); - } -} - -#[test] -fn can_roundtrip_multiname_sni() { - let bytes = [0, 0, 0, 12, 0, 10, 0, 0, 2, 0x68, 0x69, 0, 0, 2, 0x6c, 0x6f]; - let mut rd = Reader::init(&bytes); - let ext = ClientExtension::read(&mut rd).unwrap(); - println!("{:?}", ext); - - assert_eq!(ext.get_type(), ExtensionType::ServerName); - assert_eq!(bytes.to_vec(), ext.get_encoding()); - match ext { - ClientExtension::ServerName(req) => { - assert_eq!(2, req.len()); - - assert!(req.has_duplicate_names_for_type()); - - let dns_name_str: &str = req - .get_single_hostname() - .unwrap() - .into(); - assert_eq!(dns_name_str, "hi"); - - assert_eq!(req[0].typ, ServerNameType::HostName); - assert_eq!(req[1].typ, ServerNameType::HostName); - } - _ => unreachable!(), - } -} - -#[test] -fn rejects_truncated_sni() { - let bytes = [0, 0, 0, 1, 0]; - assert!(ClientExtension::read(&mut Reader::init(&bytes)).is_none()); - - let bytes = [0, 0, 0, 2, 0, 1]; - assert!(ClientExtension::read(&mut Reader::init(&bytes)).is_none()); - - let bytes = [0, 0, 0, 3, 0, 1, 0]; - assert!(ClientExtension::read(&mut Reader::init(&bytes)).is_none()); - - let bytes = [0, 0, 0, 4, 0, 2, 0, 0]; - assert!(ClientExtension::read(&mut Reader::init(&bytes)).is_none()); - - let bytes = [0, 0, 0, 5, 0, 3, 0, 0, 0]; - assert!(ClientExtension::read(&mut Reader::init(&bytes)).is_none()); - - let bytes = [0, 0, 0, 5, 0, 3, 0, 0, 1]; - assert!(ClientExtension::read(&mut Reader::init(&bytes)).is_none()); - - let bytes = [0, 0, 0, 6, 0, 4, 0, 0, 2, 0x68]; - assert!(ClientExtension::read(&mut Reader::init(&bytes)).is_none()); -} - -#[test] -fn can_roundtrip_psk_identity() { - let bytes = [0, 0, 0x11, 0x22, 0x33, 0x44]; - let psk_id = PresharedKeyIdentity::read(&mut Reader::init(&bytes)).unwrap(); - println!("{:?}", psk_id); - assert_eq!(psk_id.obfuscated_ticket_age, 0x11223344); - assert_eq!(psk_id.get_encoding(), bytes.to_vec()); - - let bytes = [0, 5, 0x1, 0x2, 0x3, 0x4, 0x5, 0x11, 0x22, 0x33, 0x44]; - let psk_id = PresharedKeyIdentity::read(&mut Reader::init(&bytes)).unwrap(); - println!("{:?}", psk_id); - assert_eq!(psk_id.identity.0, vec![0x1, 0x2, 0x3, 0x4, 0x5]); - assert_eq!(psk_id.obfuscated_ticket_age, 0x11223344); - assert_eq!(psk_id.get_encoding(), bytes.to_vec()); -} - -#[test] -fn can_roundtrip_psk_offer() { - let bytes = [ - 0, 7, 0, 1, 0x99, 0x11, 0x22, 0x33, 0x44, 0, 4, 3, 0x01, 0x02, 0x3, - ]; - let psko = PresharedKeyOffer::read(&mut Reader::init(&bytes)).unwrap(); - println!("{:?}", psko); - - assert_eq!(psko.identities.len(), 1); - assert_eq!(psko.identities[0].identity.0, vec![0x99]); - assert_eq!(psko.identities[0].obfuscated_ticket_age, 0x11223344); - assert_eq!(psko.binders.len(), 1); - assert_eq!(psko.binders[0].0, vec![1, 2, 3]); - assert_eq!(psko.get_encoding(), bytes.to_vec()); -} - -#[test] -fn can_roundtrip_certstatusreq_for_ocsp() { - let ext = ClientExtension::CertificateStatusRequest(CertificateStatusRequest::build_ocsp()); - println!("{:?}", ext); - - let bytes = [ - 0, 5, // CertificateStatusRequest - 0, 11, 1, // OCSP - 0, 5, 0, 3, 0, 1, 1, 0, 1, 2, - ]; - - let csr = ClientExtension::read(&mut Reader::init(&bytes)).unwrap(); - println!("{:?}", csr); - assert_eq!(csr.get_encoding(), bytes.to_vec()); -} - -#[test] -fn can_roundtrip_certstatusreq_for_other() { - let bytes = [ - 0, 5, // CertificateStatusRequest - 0, 5, 2, // !OCSP - 1, 2, 3, 4, - ]; - - let csr = ClientExtension::read(&mut Reader::init(&bytes)).unwrap(); - println!("{:?}", csr); - assert_eq!(csr.get_encoding(), bytes.to_vec()); -} - -#[test] -fn can_roundtrip_multi_proto() { - let bytes = [0, 16, 0, 8, 0, 6, 2, 0x68, 0x69, 2, 0x6c, 0x6f]; - let mut rd = Reader::init(&bytes); - let ext = ClientExtension::read(&mut rd).unwrap(); - println!("{:?}", ext); - - assert_eq!(ext.get_type(), ExtensionType::ALProtocolNegotiation); - assert_eq!(ext.get_encoding(), bytes.to_vec()); - match ext { - ClientExtension::Protocols(prot) => { - assert_eq!(2, prot.len()); - assert_eq!(vec![b"hi", b"lo"], prot.to_slices()); - assert_eq!(prot.as_single_slice(), None); - } - _ => unreachable!(), - } -} - -#[test] -fn can_roundtrip_single_proto() { - let bytes = [0, 16, 0, 5, 0, 3, 2, 0x68, 0x69]; - let mut rd = Reader::init(&bytes); - let ext = ClientExtension::read(&mut rd).unwrap(); - println!("{:?}", ext); - - assert_eq!(ext.get_type(), ExtensionType::ALProtocolNegotiation); - assert_eq!(bytes.to_vec(), ext.get_encoding()); - match ext { - ClientExtension::Protocols(prot) => { - assert_eq!(1, prot.len()); - assert_eq!(vec![b"hi"], prot.to_slices()); - assert_eq!(prot.as_single_slice(), Some(&b"hi"[..])); - } - _ => unreachable!(), - } -} - -#[test] -fn decomposed_signature_scheme_has_correct_mappings() { - assert_eq!( - SignatureScheme::make(SignatureAlgorithm::RSA, HashAlgorithm::SHA1), - SignatureScheme::RSA_PKCS1_SHA1 - ); - assert_eq!( - SignatureScheme::make(SignatureAlgorithm::RSA, HashAlgorithm::SHA256), - SignatureScheme::RSA_PKCS1_SHA256 - ); - assert_eq!( - SignatureScheme::make(SignatureAlgorithm::RSA, HashAlgorithm::SHA384), - SignatureScheme::RSA_PKCS1_SHA384 - ); - assert_eq!( - SignatureScheme::make(SignatureAlgorithm::RSA, HashAlgorithm::SHA512), - SignatureScheme::RSA_PKCS1_SHA512 - ); - - assert_eq!( - SignatureScheme::make(SignatureAlgorithm::ECDSA, HashAlgorithm::SHA256), - SignatureScheme::ECDSA_NISTP256_SHA256 - ); - assert_eq!( - SignatureScheme::make(SignatureAlgorithm::ECDSA, HashAlgorithm::SHA384), - SignatureScheme::ECDSA_NISTP384_SHA384 - ); - assert_eq!( - SignatureScheme::make(SignatureAlgorithm::ECDSA, HashAlgorithm::SHA512), - SignatureScheme::ECDSA_NISTP521_SHA512 - ); -} - -fn get_sample_clienthellopayload() -> ClientHelloPayload { - ClientHelloPayload { - client_version: ProtocolVersion::TLSv1_2, - random: Random::from([0; 32]), - session_id: SessionID::empty(), - cipher_suites: vec![CipherSuite::TLS_NULL_WITH_NULL_NULL], - compression_methods: vec![Compression::Null], - extensions: vec![ - ClientExtension::ECPointFormats(ECPointFormatList::supported()), - ClientExtension::NamedGroups(vec![NamedGroup::X25519]), - ClientExtension::SignatureAlgorithms(vec![SignatureScheme::ECDSA_NISTP256_SHA256]), - ClientExtension::make_sni(DnsNameRef::try_from_ascii_str("hello").unwrap()), - ClientExtension::SessionTicket(ClientSessionTicket::Request), - ClientExtension::SessionTicket(ClientSessionTicket::Offer(Payload(vec![]))), - ClientExtension::Protocols(vec![PayloadU8(vec![0])]), - ClientExtension::SupportedVersions(vec![ProtocolVersion::TLSv1_3]), - ClientExtension::KeyShare(vec![KeyShareEntry::new(NamedGroup::X25519, &[1, 2, 3])]), - ClientExtension::PresharedKeyModes(vec![PSKKeyExchangeMode::PSK_DHE_KE]), - ClientExtension::PresharedKey(PresharedKeyOffer { - identities: vec![ - PresharedKeyIdentity::new(vec![3, 4, 5], 123456), - PresharedKeyIdentity::new(vec![6, 7, 8], 7891011), - ], - binders: vec![ - PresharedKeyBinder::new(vec![1, 2, 3]), - PresharedKeyBinder::new(vec![3, 4, 5]), - ], - }), - ClientExtension::Cookie(PayloadU16(vec![1, 2, 3])), - ClientExtension::ExtendedMasterSecretRequest, - ClientExtension::CertificateStatusRequest(CertificateStatusRequest::build_ocsp()), - ClientExtension::SignedCertificateTimestampRequest, - ClientExtension::TransportParameters(vec![1, 2, 3]), - ClientExtension::Unknown(UnknownExtension { - typ: ExtensionType::Unknown(12345), - payload: Payload(vec![1, 2, 3]), - }), - ], - } -} - -#[test] -fn can_print_all_clientextensions() { - println!("client hello {:?}", get_sample_clienthellopayload()); -} - -#[test] -fn can_clone_all_clientextensions() { - let _ = get_sample_serverhellopayload().extensions; -} - -#[test] -fn client_has_duplicate_extensions_works() { - let mut chp = get_sample_clienthellopayload(); - assert!(chp.has_duplicate_extension()); // due to SessionTicketRequest/SessionTicketOffer - - chp.extensions.drain(1..); - assert!(!chp.has_duplicate_extension()); - - chp.extensions = vec![]; - assert!(!chp.has_duplicate_extension()); -} - -#[test] -fn test_truncated_psk_offer() { - let ext = ClientExtension::PresharedKey(PresharedKeyOffer { - identities: vec![PresharedKeyIdentity::new(vec![3, 4, 5], 123456)], - binders: vec![PresharedKeyBinder::new(vec![1, 2, 3])], - }); - - let mut enc = ext.get_encoding(); - println!("testing {:?} enc {:?}", ext, enc); - for l in 0..enc.len() { - if l == 9 { - continue; - } - put_u16(l as u16, &mut enc[4..]); - let rc = ClientExtension::read_bytes(&enc); - assert!(rc.is_none()); - } -} - -#[test] -fn test_truncated_client_hello_is_detected() { - let ch = get_sample_clienthellopayload(); - let enc = ch.get_encoding(); - println!("testing {:?} enc {:?}", ch, enc); - - for l in 0..enc.len() { - println!("len {:?} enc {:?}", l, &enc[..l]); - if l == 41 { - continue; // where extensions are empty - } - assert!(ClientHelloPayload::read_bytes(&enc[..l]).is_none()); - } -} - -#[test] -fn test_truncated_client_extension_is_detected() { - let chp = get_sample_clienthellopayload(); - - for ext in &chp.extensions { - let mut enc = ext.get_encoding(); - println!("testing {:?} enc {:?}", ext, enc); - - // "outer" truncation, i.e., where the extension-level length is longer than - // the input - for l in 0..enc.len() { - assert!(ClientExtension::read_bytes(&enc[..l]).is_none()); - } - - // these extension types don't have any internal encoding that rustls validates: - match ext.get_type() { - ExtensionType::TransportParameters | ExtensionType::Unknown(_) => { - continue; - } - _ => {} - }; - - // "inner" truncation, where the extension-level length agrees with the input - // length, but isn't long enough for the type of extension - for l in 0..(enc.len() - 4) { - put_u16(l as u16, &mut enc[2..]); - println!(" encoding {:?} len {:?}", enc, l); - assert!(ClientExtension::read_bytes(&enc).is_none()); - } - } -} - -fn test_client_extension_getter(typ: ExtensionType, getter: fn(&ClientHelloPayload) -> bool) { - let mut chp = get_sample_clienthellopayload(); - let ext = chp.find_extension(typ).unwrap().clone(); - - chp.extensions = vec![]; - assert!(!getter(&chp)); - - chp.extensions = vec![ext]; - assert!(getter(&chp)); - - chp.extensions = vec![ClientExtension::Unknown(UnknownExtension { - typ, - payload: Payload(vec![]), - })]; - assert!(!getter(&chp)); -} - -#[test] -fn client_get_sni_extension() { - test_client_extension_getter(ExtensionType::ServerName, |chp| { - chp.get_sni_extension().is_some() - }); -} - -#[test] -fn client_get_sigalgs_extension() { - test_client_extension_getter(ExtensionType::SignatureAlgorithms, |chp| { - chp.get_sigalgs_extension().is_some() - }); -} - -#[test] -fn client_get_namedgroups_extension() { - test_client_extension_getter(ExtensionType::EllipticCurves, |chp| { - chp.get_namedgroups_extension() - .is_some() - }); -} - -#[test] -fn client_get_ecpoints_extension() { - test_client_extension_getter(ExtensionType::ECPointFormats, |chp| { - chp.get_ecpoints_extension().is_some() - }); -} - -#[test] -fn client_get_alpn_extension() { - test_client_extension_getter(ExtensionType::ALProtocolNegotiation, |chp| { - chp.get_alpn_extension().is_some() - }); -} - -#[test] -fn client_get_quic_params_extension() { - test_client_extension_getter(ExtensionType::TransportParameters, |chp| { - chp.get_quic_params_extension() - .is_some() - }); -} - -#[test] -fn client_get_versions_extension() { - test_client_extension_getter(ExtensionType::SupportedVersions, |chp| { - chp.get_versions_extension().is_some() - }); -} - -#[test] -fn client_get_keyshare_extension() { - test_client_extension_getter(ExtensionType::KeyShare, |chp| { - chp.get_keyshare_extension().is_some() - }); -} - -#[test] -fn client_get_psk() { - test_client_extension_getter(ExtensionType::PreSharedKey, |chp| chp.get_psk().is_some()); -} - -#[test] -fn client_get_psk_modes() { - test_client_extension_getter(ExtensionType::PSKKeyExchangeModes, |chp| { - chp.get_psk_modes().is_some() - }); -} - -#[test] -fn test_truncated_helloretry_extension_is_detected() { - let hrr = get_sample_helloretryrequest(); - - for ext in &hrr.extensions { - let mut enc = ext.get_encoding(); - println!("testing {:?} enc {:?}", ext, enc); - - // "outer" truncation, i.e., where the extension-level length is longer than - // the input - for l in 0..enc.len() { - assert!(HelloRetryExtension::read_bytes(&enc[..l]).is_none()); - } - - // these extension types don't have any internal encoding that rustls validates: - if let ExtensionType::Unknown(_) = ext.get_type() { - continue; - } - - // "inner" truncation, where the extension-level length agrees with the input - // length, but isn't long enough for the type of extension - for l in 0..(enc.len() - 4) { - put_u16(l as u16, &mut enc[2..]); - println!(" encoding {:?} len {:?}", enc, l); - assert!(HelloRetryExtension::read_bytes(&enc).is_none()); - } - } -} - -fn test_helloretry_extension_getter(typ: ExtensionType, getter: fn(&HelloRetryRequest) -> bool) { - let mut hrr = get_sample_helloretryrequest(); - let mut exts = std::mem::take(&mut hrr.extensions); - exts.retain(|ext| ext.get_type() == typ); - - assert!(!getter(&hrr)); - - hrr.extensions = exts; - assert!(getter(&hrr)); - - hrr.extensions = vec![HelloRetryExtension::Unknown(UnknownExtension { - typ, - payload: Payload(vec![]), - })]; - assert!(!getter(&hrr)); -} - -#[test] -fn helloretry_get_requested_key_share_group() { - test_helloretry_extension_getter(ExtensionType::KeyShare, |hrr| { - hrr.get_requested_key_share_group() - .is_some() - }); -} - -#[test] -fn helloretry_get_cookie() { - test_helloretry_extension_getter(ExtensionType::Cookie, |hrr| hrr.get_cookie().is_some()); -} - -#[test] -fn helloretry_get_supported_versions() { - test_helloretry_extension_getter(ExtensionType::SupportedVersions, |hrr| { - hrr.get_supported_versions().is_some() - }); -} - -#[test] -fn test_truncated_server_extension_is_detected() { - let shp = get_sample_serverhellopayload(); - - for ext in &shp.extensions { - let mut enc = ext.get_encoding(); - println!("testing {:?} enc {:?}", ext, enc); - - // "outer" truncation, i.e., where the extension-level length is longer than - // the input - for l in 0..enc.len() { - assert!(ServerExtension::read_bytes(&enc[..l]).is_none()); - } - - // these extension types don't have any internal encoding that rustls validates: - match ext.get_type() { - ExtensionType::TransportParameters | ExtensionType::Unknown(_) => { - continue; - } - _ => {} - }; - - // "inner" truncation, where the extension-level length agrees with the input - // length, but isn't long enough for the type of extension - for l in 0..(enc.len() - 4) { - put_u16(l as u16, &mut enc[2..]); - println!(" encoding {:?} len {:?}", enc, l); - assert!(ServerExtension::read_bytes(&enc).is_none()); - } - } -} - -fn test_server_extension_getter(typ: ExtensionType, getter: fn(&ServerHelloPayload) -> bool) { - let mut shp = get_sample_serverhellopayload(); - let ext = shp.find_extension(typ).unwrap().clone(); - - shp.extensions = vec![]; - assert!(!getter(&shp)); - - shp.extensions = vec![ext]; - assert!(getter(&shp)); - - shp.extensions = vec![ServerExtension::Unknown(UnknownExtension { - typ, - payload: Payload(vec![]), - })]; - assert!(!getter(&shp)); -} - -#[test] -fn server_get_key_share() { - test_server_extension_getter(ExtensionType::KeyShare, |shp| shp.get_key_share().is_some()); -} - -#[test] -fn server_get_psk_index() { - test_server_extension_getter(ExtensionType::PreSharedKey, |shp| { - shp.get_psk_index().is_some() - }); -} - -#[test] -fn server_get_ecpoints_extension() { - test_server_extension_getter(ExtensionType::ECPointFormats, |shp| { - shp.get_ecpoints_extension().is_some() - }); -} - -#[test] -fn server_get_sct_list() { - test_server_extension_getter(ExtensionType::SCT, |shp| shp.get_sct_list().is_some()); -} - -#[test] -fn server_get_supported_versions() { - test_server_extension_getter(ExtensionType::SupportedVersions, |shp| { - shp.get_supported_versions().is_some() - }); -} - -fn test_cert_extension_getter(typ: ExtensionType, getter: fn(&CertificateEntry) -> bool) { - let mut ce = get_sample_certificatepayloadtls13() - .entries - .remove(0); - let mut exts = std::mem::take(&mut ce.exts); - exts.retain(|ext| ext.get_type() == typ); - - assert!(!getter(&ce)); - - ce.exts = exts; - assert!(getter(&ce)); - - ce.exts = vec![CertificateExtension::Unknown(UnknownExtension { - typ, - payload: Payload(vec![]), - })]; - assert!(!getter(&ce)); -} - -#[test] -fn certentry_get_ocsp_response() { - test_cert_extension_getter(ExtensionType::StatusRequest, |ce| { - ce.get_ocsp_response().is_some() - }); -} - -#[test] -fn certentry_get_scts() { - test_cert_extension_getter(ExtensionType::SCT, |ce| ce.get_scts().is_some()); -} - -fn get_sample_serverhellopayload() -> ServerHelloPayload { - ServerHelloPayload { - legacy_version: ProtocolVersion::TLSv1_2, - random: Random::from([0; 32]), - session_id: SessionID::empty(), - cipher_suite: CipherSuite::TLS_NULL_WITH_NULL_NULL, - compression_method: Compression::Null, - extensions: vec![ - ServerExtension::ECPointFormats(ECPointFormatList::supported()), - ServerExtension::ServerNameAck, - ServerExtension::SessionTicketAck, - ServerExtension::RenegotiationInfo(PayloadU8(vec![0])), - ServerExtension::Protocols(vec![PayloadU8(vec![0])]), - ServerExtension::KeyShare(KeyShareEntry::new(NamedGroup::X25519, &[1, 2, 3])), - ServerExtension::PresharedKey(3), - ServerExtension::ExtendedMasterSecretAck, - ServerExtension::CertificateStatusAck, - ServerExtension::SignedCertificateTimestamp(vec![PayloadU16(vec![0])]), - ServerExtension::SupportedVersions(ProtocolVersion::TLSv1_2), - ServerExtension::TransportParameters(vec![1, 2, 3]), - ServerExtension::Unknown(UnknownExtension { - typ: ExtensionType::Unknown(12345), - payload: Payload(vec![1, 2, 3]), - }), - ], - } -} - -#[test] -fn can_print_all_serverextensions() { - println!("server hello {:?}", get_sample_serverhellopayload()); -} - -#[test] -fn can_clone_all_serverextensions() { - let _ = get_sample_serverhellopayload().extensions; -} - -fn get_sample_helloretryrequest() -> HelloRetryRequest { - HelloRetryRequest { - legacy_version: ProtocolVersion::TLSv1_2, - session_id: SessionID::empty(), - cipher_suite: CipherSuite::TLS_NULL_WITH_NULL_NULL, - extensions: vec![ - HelloRetryExtension::KeyShare(NamedGroup::X25519), - HelloRetryExtension::Cookie(PayloadU16(vec![0])), - HelloRetryExtension::SupportedVersions(ProtocolVersion::TLSv1_2), - HelloRetryExtension::Unknown(UnknownExtension { - typ: ExtensionType::Unknown(12345), - payload: Payload(vec![1, 2, 3]), - }), - ], - } -} - -fn get_sample_certificatepayloadtls13() -> CertificatePayloadTLS13 { - CertificatePayloadTLS13 { - context: PayloadU8(vec![1, 2, 3]), - entries: vec![CertificateEntry { - cert: Certificate(vec![3, 4, 5]), - exts: vec![ - CertificateExtension::CertificateStatus(CertificateStatus { - ocsp_response: PayloadU24(vec![1, 2, 3]), - }), - CertificateExtension::SignedCertificateTimestamp(vec![PayloadU16(vec![0])]), - CertificateExtension::Unknown(UnknownExtension { - typ: ExtensionType::Unknown(12345), - payload: Payload(vec![1, 2, 3]), - }), - ], - }], - } -} - -fn get_sample_serverkeyexchangepayload_ecdhe() -> ServerKeyExchangePayload { - ServerKeyExchangePayload::ECDHE(ECDHEServerKeyExchange { - params: ServerECDHParams { - curve_params: ECParameters { - curve_type: ECCurveType::NamedCurve, - named_group: NamedGroup::X25519, - }, - public: PayloadU8(vec![1, 2, 3]), - }, - dss: DigitallySignedStruct::new(SignatureScheme::RSA_PSS_SHA256, vec![1, 2, 3]), - }) -} - -fn get_sample_serverkeyexchangepayload_unknown() -> ServerKeyExchangePayload { - ServerKeyExchangePayload::Unknown(Payload(vec![1, 2, 3])) -} - -fn get_sample_certificaterequestpayload() -> CertificateRequestPayload { - CertificateRequestPayload { - certtypes: vec![ClientCertificateType::RSASign], - sigschemes: vec![SignatureScheme::ECDSA_NISTP256_SHA256], - canames: vec![PayloadU16(vec![1, 2, 3])], - } -} - -fn get_sample_certificaterequestpayloadtls13() -> CertificateRequestPayloadTLS13 { - CertificateRequestPayloadTLS13 { - context: PayloadU8(vec![1, 2, 3]), - extensions: vec![ - CertReqExtension::SignatureAlgorithms(vec![SignatureScheme::ECDSA_NISTP256_SHA256]), - CertReqExtension::AuthorityNames(vec![PayloadU16(vec![1, 2, 3])]), - CertReqExtension::Unknown(UnknownExtension { - typ: ExtensionType::Unknown(12345), - payload: Payload(vec![1, 2, 3]), - }), - ], - } -} - -fn get_sample_newsessionticketpayload() -> NewSessionTicketPayload { - NewSessionTicketPayload { - lifetime_hint: 1234, - ticket: PayloadU16(vec![1, 2, 3]), - } -} - -fn get_sample_newsessionticketpayloadtls13() -> NewSessionTicketPayloadTLS13 { - NewSessionTicketPayloadTLS13 { - lifetime: 123, - age_add: 1234, - nonce: PayloadU8(vec![1, 2, 3]), - ticket: PayloadU16(vec![4, 5, 6]), - exts: vec![NewSessionTicketExtension::Unknown(UnknownExtension { - typ: ExtensionType::Unknown(12345), - payload: Payload(vec![1, 2, 3]), - })], - } -} - -fn get_sample_encryptedextensions() -> EncryptedExtensions { - get_sample_serverhellopayload().extensions -} - -fn get_sample_certificatestatus() -> CertificateStatus { - CertificateStatus { - ocsp_response: PayloadU24(vec![1, 2, 3]), - } -} - -fn get_all_tls12_handshake_payloads() -> Vec { - vec![ - HandshakeMessagePayload { - typ: HandshakeType::HelloRequest, - payload: HandshakePayload::HelloRequest, - }, - HandshakeMessagePayload { - typ: HandshakeType::ClientHello, - payload: HandshakePayload::ClientHello(get_sample_clienthellopayload()), - }, - HandshakeMessagePayload { - typ: HandshakeType::ServerHello, - payload: HandshakePayload::ServerHello(get_sample_serverhellopayload()), - }, - HandshakeMessagePayload { - typ: HandshakeType::HelloRetryRequest, - payload: HandshakePayload::HelloRetryRequest(get_sample_helloretryrequest()), - }, - HandshakeMessagePayload { - typ: HandshakeType::Certificate, - payload: HandshakePayload::Certificate(vec![Certificate(vec![1, 2, 3])]), - }, - HandshakeMessagePayload { - typ: HandshakeType::ServerKeyExchange, - payload: HandshakePayload::ServerKeyExchange( - get_sample_serverkeyexchangepayload_ecdhe(), - ), - }, - HandshakeMessagePayload { - typ: HandshakeType::ServerKeyExchange, - payload: HandshakePayload::ServerKeyExchange( - get_sample_serverkeyexchangepayload_unknown(), - ), - }, - HandshakeMessagePayload { - typ: HandshakeType::CertificateRequest, - payload: HandshakePayload::CertificateRequest(get_sample_certificaterequestpayload()), - }, - HandshakeMessagePayload { - typ: HandshakeType::ServerHelloDone, - payload: HandshakePayload::ServerHelloDone, - }, - HandshakeMessagePayload { - typ: HandshakeType::ClientKeyExchange, - payload: HandshakePayload::ClientKeyExchange(Payload(vec![1, 2, 3])), - }, - HandshakeMessagePayload { - typ: HandshakeType::NewSessionTicket, - payload: HandshakePayload::NewSessionTicket(get_sample_newsessionticketpayload()), - }, - HandshakeMessagePayload { - typ: HandshakeType::EncryptedExtensions, - payload: HandshakePayload::EncryptedExtensions(get_sample_encryptedextensions()), - }, - HandshakeMessagePayload { - typ: HandshakeType::KeyUpdate, - payload: HandshakePayload::KeyUpdate(KeyUpdateRequest::UpdateRequested), - }, - HandshakeMessagePayload { - typ: HandshakeType::KeyUpdate, - payload: HandshakePayload::KeyUpdate(KeyUpdateRequest::UpdateNotRequested), - }, - HandshakeMessagePayload { - typ: HandshakeType::Finished, - payload: HandshakePayload::Finished(Payload(vec![1, 2, 3])), - }, - HandshakeMessagePayload { - typ: HandshakeType::CertificateStatus, - payload: HandshakePayload::CertificateStatus(get_sample_certificatestatus()), - }, - HandshakeMessagePayload { - typ: HandshakeType::Unknown(99), - payload: HandshakePayload::Unknown(Payload(vec![1, 2, 3])), - }, - ] -} - -#[test] -fn can_roundtrip_all_tls12_handshake_payloads() { - for ref hm in get_all_tls12_handshake_payloads().iter() { - println!("{:?}", hm.typ); - let bytes = hm.get_encoding(); - let mut rd = Reader::init(&bytes); - let other = HandshakeMessagePayload::read(&mut rd).unwrap(); - assert!(!rd.any_left()); - assert_eq!(hm.get_encoding(), other.get_encoding()); - - println!("{:?}", hm); - println!("{:?}", other); - } -} - -#[test] -fn can_detect_truncation_of_all_tls12_handshake_payloads() { - for hm in get_all_tls12_handshake_payloads().iter() { - let mut enc = hm.get_encoding(); - println!("test {:?} enc {:?}", hm, enc); - - // outer truncation - for l in 0..enc.len() { - assert!(HandshakeMessagePayload::read_bytes(&enc[..l]).is_none()) - } - - // inner truncation - for l in 0..enc.len() - 4 { - put_u24(l as u32, &mut enc[1..]); - println!(" check len {:?} enc {:?}", l, enc); - - match (hm.typ, l) { - (HandshakeType::ClientHello, 41) - | (HandshakeType::ServerHello, 38) - | (HandshakeType::ServerKeyExchange, _) - | (HandshakeType::ClientKeyExchange, _) - | (HandshakeType::Finished, _) - | (HandshakeType::Unknown(_), _) => continue, - _ => {} - }; - - assert!(HandshakeMessagePayload::read_version( - &mut Reader::init(&enc), - ProtocolVersion::TLSv1_2 - ) - .is_none()); - assert!(HandshakeMessagePayload::read_bytes(&enc).is_none()); - } - } -} - -fn get_all_tls13_handshake_payloads() -> Vec { - vec![ - HandshakeMessagePayload { - typ: HandshakeType::HelloRequest, - payload: HandshakePayload::HelloRequest, - }, - HandshakeMessagePayload { - typ: HandshakeType::ClientHello, - payload: HandshakePayload::ClientHello(get_sample_clienthellopayload()), - }, - HandshakeMessagePayload { - typ: HandshakeType::ServerHello, - payload: HandshakePayload::ServerHello(get_sample_serverhellopayload()), - }, - HandshakeMessagePayload { - typ: HandshakeType::HelloRetryRequest, - payload: HandshakePayload::HelloRetryRequest(get_sample_helloretryrequest()), - }, - HandshakeMessagePayload { - typ: HandshakeType::Certificate, - payload: HandshakePayload::CertificateTLS13(get_sample_certificatepayloadtls13()), - }, - HandshakeMessagePayload { - typ: HandshakeType::ServerKeyExchange, - payload: HandshakePayload::ServerKeyExchange( - get_sample_serverkeyexchangepayload_ecdhe(), - ), - }, - HandshakeMessagePayload { - typ: HandshakeType::ServerKeyExchange, - payload: HandshakePayload::ServerKeyExchange( - get_sample_serverkeyexchangepayload_unknown(), - ), - }, - HandshakeMessagePayload { - typ: HandshakeType::CertificateRequest, - payload: HandshakePayload::CertificateRequestTLS13( - get_sample_certificaterequestpayloadtls13(), - ), - }, - HandshakeMessagePayload { - typ: HandshakeType::CertificateVerify, - payload: HandshakePayload::CertificateVerify(DigitallySignedStruct::new( - SignatureScheme::ECDSA_NISTP256_SHA256, - vec![1, 2, 3], - )), - }, - HandshakeMessagePayload { - typ: HandshakeType::ServerHelloDone, - payload: HandshakePayload::ServerHelloDone, - }, - HandshakeMessagePayload { - typ: HandshakeType::ClientKeyExchange, - payload: HandshakePayload::ClientKeyExchange(Payload(vec![1, 2, 3])), - }, - HandshakeMessagePayload { - typ: HandshakeType::NewSessionTicket, - payload: HandshakePayload::NewSessionTicketTLS13( - get_sample_newsessionticketpayloadtls13(), - ), - }, - HandshakeMessagePayload { - typ: HandshakeType::EncryptedExtensions, - payload: HandshakePayload::EncryptedExtensions(get_sample_encryptedextensions()), - }, - HandshakeMessagePayload { - typ: HandshakeType::KeyUpdate, - payload: HandshakePayload::KeyUpdate(KeyUpdateRequest::UpdateRequested), - }, - HandshakeMessagePayload { - typ: HandshakeType::KeyUpdate, - payload: HandshakePayload::KeyUpdate(KeyUpdateRequest::UpdateNotRequested), - }, - HandshakeMessagePayload { - typ: HandshakeType::Finished, - payload: HandshakePayload::Finished(Payload(vec![1, 2, 3])), - }, - HandshakeMessagePayload { - typ: HandshakeType::CertificateStatus, - payload: HandshakePayload::CertificateStatus(get_sample_certificatestatus()), - }, - HandshakeMessagePayload { - typ: HandshakeType::Unknown(99), - payload: HandshakePayload::Unknown(Payload(vec![1, 2, 3])), - }, - ] -} - -#[test] -fn can_roundtrip_all_tls13_handshake_payloads() { - for ref hm in get_all_tls13_handshake_payloads().iter() { - println!("{:?}", hm.typ); - let bytes = hm.get_encoding(); - let mut rd = Reader::init(&bytes); - - let other = - HandshakeMessagePayload::read_version(&mut rd, ProtocolVersion::TLSv1_3).unwrap(); - assert!(!rd.any_left()); - assert_eq!(hm.get_encoding(), other.get_encoding()); - - println!("{:?}", hm); - println!("{:?}", other); - } -} - -fn put_u24(u: u32, b: &mut [u8]) { - b[0] = (u >> 16) as u8; - b[1] = (u >> 8) as u8; - b[2] = u as u8; -} - -#[test] -fn can_detect_truncation_of_all_tls13_handshake_payloads() { - for hm in get_all_tls13_handshake_payloads().iter() { - let mut enc = hm.get_encoding(); - println!("test {:?} enc {:?}", hm, enc); - - // outer truncation - for l in 0..enc.len() { - assert!(HandshakeMessagePayload::read_bytes(&enc[..l]).is_none()) - } - - // inner truncation - for l in 0..enc.len() - 4 { - put_u24(l as u32, &mut enc[1..]); - println!(" check len {:?} enc {:?}", l, enc); - - match (hm.typ, l) { - (HandshakeType::ClientHello, 41) - | (HandshakeType::ServerHello, 38) - | (HandshakeType::ServerKeyExchange, _) - | (HandshakeType::ClientKeyExchange, _) - | (HandshakeType::Finished, _) - | (HandshakeType::Unknown(_), _) => continue, - _ => {} - }; - - assert!(HandshakeMessagePayload::read_version( - &mut Reader::init(&enc), - ProtocolVersion::TLSv1_3 - ) - .is_none()); - } - } -} - -#[test] -fn cannot_read_messagehash_from_network() { - let mh = HandshakeMessagePayload { - typ: HandshakeType::MessageHash, - payload: HandshakePayload::MessageHash(Payload::new(vec![1, 2, 3])), - }; - println!("mh {:?}", mh); - let enc = mh.get_encoding(); - assert!(HandshakeMessagePayload::read_bytes(&enc).is_none()); -} - -#[test] -fn cannot_decode_huge_certificate() { - let mut buf = [0u8; 65 * 1024]; - // exactly 64KB decodes fine - buf[0] = 0x0b; - buf[1] = 0x01; - buf[2] = 0x00; - buf[3] = 0x03; - buf[4] = 0x01; - buf[5] = 0x00; - buf[6] = 0x00; - buf[7] = 0x00; - buf[8] = 0xff; - buf[9] = 0xfd; - HandshakeMessagePayload::read_bytes(&buf).unwrap(); - - // however 64KB + 1 byte does not - buf[1] = 0x01; - buf[2] = 0x00; - buf[3] = 0x04; - buf[4] = 0x01; - buf[5] = 0x00; - buf[6] = 0x01; - assert!(HandshakeMessagePayload::read_bytes(&buf).is_none()); -} - -#[test] -fn can_decode_server_hello_from_api_devicecheck_apple_com() { - let data = include_bytes!("hello-api.devicecheck.apple.com.bin"); - let mut r = Reader::init(data); - let hm = HandshakeMessagePayload::read(&mut r).unwrap(); - println!("msg: {:?}", hm); -} Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/hello-api.devicecheck.apple.com.bin and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/hello-api.devicecheck.apple.com.bin differ diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/hsjoiner.rs temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/hsjoiner.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/hsjoiner.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/hsjoiner.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,281 +0,0 @@ -use std::collections::VecDeque; - -use crate::enums::ProtocolVersion; -use crate::msgs::base::Payload; -use crate::msgs::codec; -use crate::msgs::enums::ContentType; -use crate::msgs::handshake::HandshakeMessagePayload; -use crate::msgs::message::{Message, MessagePayload, PlainMessage}; - -const HEADER_SIZE: usize = 1 + 3; - -/// TLS allows for handshake messages of up to 16MB. We -/// restrict that to 64KB to limit potential for denial-of- -/// service. -const MAX_HANDSHAKE_SIZE: u32 = 0xffff; - -/// This works to reconstruct TLS handshake messages -/// from individual TLS messages. It's guaranteed that -/// TLS messages output from this layer contain precisely -/// one handshake payload. -pub struct HandshakeJoiner { - /// The message payload(s) we're currently accumulating. - buf: Vec, - - /// Sizes of messages currently in the buffer. - /// - /// The buffer can be larger than the sum of the sizes in this queue, because it might contain - /// the start of a message that hasn't fully been received yet as its suffix. - sizes: VecDeque, - - /// Version of the protocol we're currently parsing. - version: ProtocolVersion, -} - -impl HandshakeJoiner { - /// Make a new HandshakeJoiner. - pub fn new() -> Self { - Self { - buf: Vec::new(), - sizes: VecDeque::new(), - version: ProtocolVersion::TLSv1_2, - } - } - - /// Take the message, and join/split it as needed. - /// - /// Returns `Err(JoinerError::Unwanted(msg))` if `msg`'s type is not `ContentType::Handshake` or - /// `JoinerError::Decode` if a received payload has an advertised size larger than we accept. - /// - /// Otherwise, yields a `bool` to indicate whether the handshake is "aligned": if the buffer currently - /// only contains complete payloads (that is, no incomplete message in the suffix). - pub fn push(&mut self, msg: PlainMessage) -> Result { - if msg.typ != ContentType::Handshake { - return Err(JoinerError::Unwanted(msg)); - } - - // The vast majority of the time `self.buf` will be empty since most - // handshake messages arrive in a single fragment. Avoid allocating and - // copying in that common case. - if self.buf.is_empty() { - self.buf = msg.payload.0; - } else { - self.buf - .extend_from_slice(&msg.payload.0[..]); - } - - if msg.version == ProtocolVersion::TLSv1_3 { - self.version = msg.version; - } - - // Check the suffix of the buffer that hasn't been covered by `sizes` so far - // for complete messages. If we find any, update `self.sizes` and `complete`. - let mut complete = self.sizes.iter().copied().sum(); - while let Some(size) = payload_size(&self.buf[complete..])? { - self.sizes.push_back(size); - complete += size; - } - - // Use the value of `complete` to determine if the buffer currently contains any - // incomplete messages. If not, an incoming message is said to be "aligned". - Ok(complete == self.buf.len()) - } - - /// Parse the first received message out of the buffer. - /// - /// Returns `Ok(None)` if we don't have a complete message in the buffer, or `Err` if we - /// fail to parse the first message in the buffer. - pub fn pop(&mut self) -> Result, JoinerError> { - let len = match self.sizes.pop_front() { - Some(len) => len, - None => return Ok(None), - }; - - // Parse the first part of the buffer as a handshake buffer. - // If we get `None` back, we've failed to parse the message. - // If we succeed, drain the relevant bytes from the buffer. - - let buf = &self.buf[..len]; - let mut rd = codec::Reader::init(buf); - let parsed = match HandshakeMessagePayload::read_version(&mut rd, self.version) { - Some(p) => p, - None => return Err(JoinerError::Decode), - }; - - let message = Message { - version: self.version, - payload: MessagePayload::Handshake { - parsed, - encoded: Payload::new(buf), - }, - }; - - self.buf.drain(..len); - Ok(Some(message)) - } -} - -/// Does `buf` contain a full handshake payload? -/// -/// Returns `Ok(Some(_))` with the length of the payload (including header) if it does, -/// `Ok(None)` if the buffer is too small to contain a message with the length advertised in the -/// header, or `Err` if the advertised length is larger than what we want to accept -/// (`MAX_HANDSHAKE_SIZE`). -fn payload_size(buf: &[u8]) -> Result, JoinerError> { - if buf.len() < HEADER_SIZE { - return Ok(None); - } - - let (header, rest) = buf.split_at(HEADER_SIZE); - match codec::u24::decode(&header[1..]) { - Some(len) if len.0 > MAX_HANDSHAKE_SIZE => Err(JoinerError::Decode), - Some(len) if rest.get(..len.into()).is_some() => Ok(Some(HEADER_SIZE + usize::from(len))), - _ => Ok(None), - } -} - -#[derive(Debug)] -pub enum JoinerError { - Unwanted(PlainMessage), - Decode, -} - -#[cfg(test)] -mod tests { - use super::HandshakeJoiner; - use crate::enums::ProtocolVersion; - use crate::msgs::base::Payload; - use crate::msgs::codec::Codec; - use crate::msgs::enums::{ContentType, HandshakeType}; - use crate::msgs::handshake::{HandshakeMessagePayload, HandshakePayload}; - use crate::msgs::message::{Message, MessagePayload, PlainMessage}; - - #[test] - fn want() { - let mut hj = HandshakeJoiner::new(); - let wanted = PlainMessage { - typ: ContentType::Handshake, - version: ProtocolVersion::TLSv1_2, - payload: Payload::new(b"\x00\x00\x00\x00".to_vec()), - }; - - let unwanted = PlainMessage { - typ: ContentType::Alert, - version: ProtocolVersion::TLSv1_2, - payload: Payload::new(b"ponytown".to_vec()), - }; - - hj.push(wanted).unwrap(); - hj.push(unwanted).unwrap_err(); - } - - fn pop_eq(expect: &PlainMessage, hj: &mut HandshakeJoiner) { - let got = hj.pop().unwrap().unwrap(); - assert_eq!(got.payload.content_type(), expect.typ); - assert_eq!(got.version, expect.version); - - let (mut left, mut right) = (Vec::new(), Vec::new()); - got.payload.encode(&mut left); - expect.payload.encode(&mut right); - - assert_eq!(left, right); - } - - #[test] - fn split() { - // Check we split two handshake messages within one PDU. - let mut hj = HandshakeJoiner::new(); - - // two HelloRequests - assert!(hj - .push(PlainMessage { - typ: ContentType::Handshake, - version: ProtocolVersion::TLSv1_2, - payload: Payload::new(b"\x00\x00\x00\x00\x00\x00\x00\x00".to_vec()), - }) - .unwrap()); - - let expect = Message { - version: ProtocolVersion::TLSv1_2, - payload: MessagePayload::handshake(HandshakeMessagePayload { - typ: HandshakeType::HelloRequest, - payload: HandshakePayload::HelloRequest, - }), - } - .into(); - - pop_eq(&expect, &mut hj); - pop_eq(&expect, &mut hj); - } - - #[test] - fn broken() { - // Check obvious crap payloads are reported as errors, not panics. - let mut hj = HandshakeJoiner::new(); - - // short ClientHello - hj.push(PlainMessage { - typ: ContentType::Handshake, - version: ProtocolVersion::TLSv1_2, - payload: Payload::new(b"\x01\x00\x00\x02\xff\xff".to_vec()), - }) - .unwrap(); - - hj.pop().unwrap_err(); - } - - #[test] - fn join() { - // Check we join one handshake message split over two PDUs. - let mut hj = HandshakeJoiner::new(); - - // Introduce Finished of 16 bytes, providing 4. - hj.push(PlainMessage { - typ: ContentType::Handshake, - version: ProtocolVersion::TLSv1_2, - payload: Payload::new(b"\x14\x00\x00\x10\x00\x01\x02\x03\x04".to_vec()), - }) - .unwrap(); - - // 11 more bytes. - assert!(!hj - .push(PlainMessage { - typ: ContentType::Handshake, - version: ProtocolVersion::TLSv1_2, - payload: Payload::new(b"\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e".to_vec()), - }) - .unwrap()); - - // Final 1 byte. - assert!(hj - .push(PlainMessage { - typ: ContentType::Handshake, - version: ProtocolVersion::TLSv1_2, - payload: Payload::new(b"\x0f".to_vec()), - }) - .unwrap()); - - let payload = b"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f".to_vec(); - let expect = Message { - version: ProtocolVersion::TLSv1_2, - payload: MessagePayload::handshake(HandshakeMessagePayload { - typ: HandshakeType::Finished, - payload: HandshakePayload::Finished(Payload::new(payload)), - }), - } - .into(); - - pop_eq(&expect, &mut hj); - } - - #[test] - fn test_rejects_giant_certs() { - let mut hj = HandshakeJoiner::new(); - hj.push(PlainMessage { - typ: ContentType::Handshake, - version: ProtocolVersion::TLSv1_2, - payload: Payload::new(b"\x0b\x01\x00\x04\x01\x00\x01\x00\xff\xfe".to_vec()), - }) - .unwrap_err(); - } -} diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/macros.rs temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/macros.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/macros.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/macros.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,88 +0,0 @@ -/// A macro which defines an enum type. -macro_rules! enum_builder { - ( - $(#[$comment:meta])* - @U8 - EnumName: $enum_name: ident; - EnumVal { $( $enum_var: ident => $enum_val: expr ),* } - ) => { - $(#[$comment])* - #[derive(Debug, PartialEq, Eq, Clone, Copy)] - pub enum $enum_name { - $( $enum_var),* - ,Unknown(u8) - } - impl $enum_name { - pub fn get_u8(&self) -> u8 { - let x = self.clone(); - match x { - $( $enum_name::$enum_var => $enum_val),* - ,$enum_name::Unknown(x) => x - } - } - } - impl Codec for $enum_name { - fn encode(&self, bytes: &mut Vec) { - self.get_u8().encode(bytes); - } - - fn read(r: &mut Reader) -> Option { - u8::read(r).map($enum_name::from) - } - } - impl From for $enum_name { - fn from(x: u8) -> Self { - match x { - $($enum_val => $enum_name::$enum_var),* - , x => $enum_name::Unknown(x), - } - } - } - }; - ( - $(#[$comment:meta])* - @U16 - EnumName: $enum_name: ident; - EnumVal { $( $enum_var: ident => $enum_val: expr ),* } - ) => { - $(#[$comment])* - #[derive(Debug, PartialEq, Eq, Clone, Copy)] - pub enum $enum_name { - $( $enum_var),* - ,Unknown(u16) - } - impl $enum_name { - pub fn get_u16(&self) -> u16 { - let x = self.clone(); - match x { - $( $enum_name::$enum_var => $enum_val),* - ,$enum_name::Unknown(x) => x - } - } - - pub fn as_str(&self) -> Option<&'static str> { - match self { - $( $enum_name::$enum_var => Some(stringify!($enum_var))),* - ,$enum_name::Unknown(_) => None, - } - } - } - impl Codec for $enum_name { - fn encode(&self, bytes: &mut Vec) { - self.get_u16().encode(bytes); - } - - fn read(r: &mut Reader) -> Option { - u16::read(r).map($enum_name::from) - } - } - impl From for $enum_name { - fn from(x: u16) -> Self { - match x { - $($enum_val => $enum_name::$enum_var),* - , x => $enum_name::Unknown(x), - } - } - } - }; -} diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/message.rs temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/message.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/message.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/message.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,292 +0,0 @@ -use crate::enums::ProtocolVersion; -use crate::error::Error; -use crate::msgs::alert::AlertMessagePayload; -use crate::msgs::base::Payload; -use crate::msgs::ccs::ChangeCipherSpecPayload; -use crate::msgs::codec::{Codec, Reader}; -use crate::msgs::enums::{AlertDescription, AlertLevel, ContentType, HandshakeType}; -use crate::msgs::handshake::HandshakeMessagePayload; - -use std::convert::TryFrom; - -#[derive(Debug)] -pub enum MessagePayload { - Alert(AlertMessagePayload), - Handshake { - parsed: HandshakeMessagePayload, - encoded: Payload, - }, - ChangeCipherSpec(ChangeCipherSpecPayload), - ApplicationData(Payload), -} - -impl MessagePayload { - pub fn encode(&self, bytes: &mut Vec) { - match self { - Self::Alert(x) => x.encode(bytes), - Self::Handshake { encoded, .. } => bytes.extend(&encoded.0), - Self::ChangeCipherSpec(x) => x.encode(bytes), - Self::ApplicationData(x) => x.encode(bytes), - } - } - - pub fn handshake(parsed: HandshakeMessagePayload) -> Self { - Self::Handshake { - encoded: Payload::new(parsed.get_encoding()), - parsed, - } - } - - pub fn new(typ: ContentType, vers: ProtocolVersion, payload: Payload) -> Result { - let mut r = Reader::init(&payload.0); - let parsed = match typ { - ContentType::ApplicationData => return Ok(Self::ApplicationData(payload)), - ContentType::Alert => AlertMessagePayload::read(&mut r) - .filter(|_| !r.any_left()) - .map(MessagePayload::Alert), - ContentType::Handshake => HandshakeMessagePayload::read_version(&mut r, vers) - .filter(|_| !r.any_left()) - .map(|parsed| Self::Handshake { - parsed, - encoded: payload, - }), - ContentType::ChangeCipherSpec => ChangeCipherSpecPayload::read(&mut r) - .filter(|_| !r.any_left()) - .map(MessagePayload::ChangeCipherSpec), - _ => None, - }; - - parsed.ok_or(Error::CorruptMessagePayload(typ)) - } - - pub fn content_type(&self) -> ContentType { - match self { - Self::Alert(_) => ContentType::Alert, - Self::Handshake { .. } => ContentType::Handshake, - Self::ChangeCipherSpec(_) => ContentType::ChangeCipherSpec, - Self::ApplicationData(_) => ContentType::ApplicationData, - } - } -} - -/// A TLS frame, named TLSPlaintext in the standard. -/// -/// This type owns all memory for its interior parts. It is used to read/write from/to I/O -/// buffers as well as for fragmenting, joining and encryption/decryption. It can be converted -/// into a `Message` by decoding the payload. -#[derive(Clone, Debug)] -pub struct OpaqueMessage { - pub typ: ContentType, - pub version: ProtocolVersion, - pub payload: Payload, -} - -impl OpaqueMessage { - /// `MessageError` allows callers to distinguish between valid prefixes (might - /// become valid if we read more data) and invalid data. - pub fn read(r: &mut Reader) -> Result { - let typ = ContentType::read(r).ok_or(MessageError::TooShortForHeader)?; - let version = ProtocolVersion::read(r).ok_or(MessageError::TooShortForHeader)?; - let len = u16::read(r).ok_or(MessageError::TooShortForHeader)?; - - // Reject undersize messages - // implemented per section 5.1 of RFC8446 (TLSv1.3) - // per section 6.2.1 of RFC5246 (TLSv1.2) - if typ != ContentType::ApplicationData && len == 0 { - return Err(MessageError::IllegalLength); - } - - // Reject oversize messages - if len >= Self::MAX_PAYLOAD { - return Err(MessageError::IllegalLength); - } - - // Don't accept any new content-types. - if let ContentType::Unknown(_) = typ { - return Err(MessageError::IllegalContentType); - } - - // Accept only versions 0x03XX for any XX. - match version { - ProtocolVersion::Unknown(ref v) if (v & 0xff00) != 0x0300 => { - return Err(MessageError::IllegalProtocolVersion); - } - _ => {} - }; - - let mut sub = r - .sub(len as usize) - .ok_or(MessageError::TooShortForLength)?; - let payload = Payload::read(&mut sub); - - Ok(Self { - typ, - version, - payload, - }) - } - - pub fn encode(self) -> Vec { - let mut buf = Vec::new(); - self.typ.encode(&mut buf); - self.version.encode(&mut buf); - (self.payload.0.len() as u16).encode(&mut buf); - self.payload.encode(&mut buf); - buf - } - - /// Force conversion into a plaintext message. - /// - /// This should only be used for messages that are known to be in plaintext. Otherwise, the - /// `OpaqueMessage` should be decrypted into a `PlainMessage` using a `MessageDecrypter`. - pub fn into_plain_message(self) -> PlainMessage { - PlainMessage { - version: self.version, - typ: self.typ, - payload: self.payload, - } - } - - /// This is the maximum on-the-wire size of a TLSCiphertext. - /// That's 2^14 payload bytes, a header, and a 2KB allowance - /// for ciphertext overheads. - const MAX_PAYLOAD: u16 = 16384 + 2048; - - /// Content type, version and size. - const HEADER_SIZE: u16 = 1 + 2 + 2; - - /// Maximum on-wire message size. - pub const MAX_WIRE_SIZE: usize = (Self::MAX_PAYLOAD + Self::HEADER_SIZE) as usize; -} - -impl From for PlainMessage { - fn from(msg: Message) -> Self { - let typ = msg.payload.content_type(); - let payload = match msg.payload { - MessagePayload::ApplicationData(payload) => payload, - _ => { - let mut buf = Vec::new(); - msg.payload.encode(&mut buf); - Payload(buf) - } - }; - - Self { - typ, - version: msg.version, - payload, - } - } -} - -/// A decrypted TLS frame -/// -/// This type owns all memory for its interior parts. It can be decrypted from an OpaqueMessage -/// or encrypted into an OpaqueMessage, and it is also used for joining and fragmenting. -#[derive(Clone, Debug)] -pub struct PlainMessage { - pub typ: ContentType, - pub version: ProtocolVersion, - pub payload: Payload, -} - -impl PlainMessage { - pub fn into_unencrypted_opaque(self) -> OpaqueMessage { - OpaqueMessage { - version: self.version, - typ: self.typ, - payload: self.payload, - } - } - - pub fn borrow(&self) -> BorrowedPlainMessage<'_> { - BorrowedPlainMessage { - version: self.version, - typ: self.typ, - payload: &self.payload.0, - } - } -} - -/// A message with decoded payload -#[derive(Debug)] -pub struct Message { - pub version: ProtocolVersion, - pub payload: MessagePayload, -} - -impl Message { - pub fn is_handshake_type(&self, hstyp: HandshakeType) -> bool { - // Bit of a layering violation, but OK. - if let MessagePayload::Handshake { parsed, .. } = &self.payload { - parsed.typ == hstyp - } else { - false - } - } - - pub fn build_alert(level: AlertLevel, desc: AlertDescription) -> Self { - Self { - version: ProtocolVersion::TLSv1_2, - payload: MessagePayload::Alert(AlertMessagePayload { - level, - description: desc, - }), - } - } - - pub fn build_key_update_notify() -> Self { - Self { - version: ProtocolVersion::TLSv1_3, - payload: MessagePayload::handshake(HandshakeMessagePayload::build_key_update_notify()), - } - } -} - -/// Parses a plaintext message into a well-typed [`Message`]. -/// -/// A [`PlainMessage`] must contain plaintext content. Encrypted content should be stored in an -/// [`OpaqueMessage`] and decrypted before being stored into a [`PlainMessage`]. -impl TryFrom for Message { - type Error = Error; - - fn try_from(plain: PlainMessage) -> Result { - Ok(Self { - version: plain.version, - payload: MessagePayload::new(plain.typ, plain.version, plain.payload)?, - }) - } -} - -/// A TLS frame, named TLSPlaintext in the standard. -/// -/// This type differs from `OpaqueMessage` because it borrows -/// its payload. You can make a `OpaqueMessage` from an -/// `BorrowMessage`, but this involves a copy. -/// -/// This type also cannot decode its internals and -/// cannot be read/encoded; only `OpaqueMessage` can do that. -pub struct BorrowedPlainMessage<'a> { - pub typ: ContentType, - pub version: ProtocolVersion, - pub payload: &'a [u8], -} - -impl<'a> BorrowedPlainMessage<'a> { - pub fn to_unencrypted_opaque(&self) -> OpaqueMessage { - OpaqueMessage { - version: self.version, - typ: self.typ, - payload: Payload(self.payload.to_vec()), - } - } -} - -#[derive(Debug)] -pub enum MessageError { - TooShortForHeader, - TooShortForLength, - IllegalLength, - IllegalContentType, - IllegalProtocolVersion, -} diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/message_test.rs temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/message_test.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/message_test.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/message_test.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,113 +0,0 @@ -use crate::msgs::base::{PayloadU16, PayloadU24, PayloadU8}; - -use super::base::Payload; -use super::codec::Reader; -use super::enums::{AlertDescription, AlertLevel, HandshakeType}; -use super::message::{Message, OpaqueMessage, PlainMessage}; - -use std::convert::TryFrom; -use std::fs; -use std::io::Read; -use std::path::{Path, PathBuf}; - -#[test] -fn test_read_fuzz_corpus() { - fn corpus_dir() -> PathBuf { - let from_subcrate = Path::new("../fuzz/corpus/message"); - let from_root = Path::new("fuzz/corpus/message"); - - if from_root.is_dir() { - from_root.to_path_buf() - } else { - from_subcrate.to_path_buf() - } - } - - for file in fs::read_dir(corpus_dir()).unwrap() { - let mut f = fs::File::open(file.unwrap().path()).unwrap(); - let mut bytes = Vec::new(); - f.read_to_end(&mut bytes).unwrap(); - - let mut rd = Reader::init(&bytes); - let msg = OpaqueMessage::read(&mut rd) - .unwrap() - .into_plain_message(); - println!("{:?}", msg); - - let msg = match Message::try_from(msg) { - Ok(msg) => msg, - Err(_) => continue, - }; - - let enc = PlainMessage::from(msg) - .into_unencrypted_opaque() - .encode(); - assert_eq!(bytes.to_vec(), enc); - assert_eq!(bytes[..rd.used()].to_vec(), enc); - } -} - -#[test] -fn can_read_safari_client_hello() { - let _ = env_logger::Builder::new() - .filter(None, log::LevelFilter::Trace) - .try_init(); - - let bytes = b"\ - \x16\x03\x01\x00\xeb\x01\x00\x00\xe7\x03\x03\xb6\x1f\xe4\x3a\x55\ - \x90\x3e\xc0\x28\x9c\x12\xe0\x5c\x84\xea\x90\x1b\xfb\x11\xfc\xbd\ - \x25\x55\xda\x9f\x51\x93\x1b\x8d\x92\x66\xfd\x00\x00\x2e\xc0\x2c\ - \xc0\x2b\xc0\x24\xc0\x23\xc0\x0a\xc0\x09\xcc\xa9\xc0\x30\xc0\x2f\ - \xc0\x28\xc0\x27\xc0\x14\xc0\x13\xcc\xa8\x00\x9d\x00\x9c\x00\x3d\ - \x00\x3c\x00\x35\x00\x2f\xc0\x08\xc0\x12\x00\x0a\x01\x00\x00\x90\ - \xff\x01\x00\x01\x00\x00\x00\x00\x0e\x00\x0c\x00\x00\x09\x31\x32\ - \x37\x2e\x30\x2e\x30\x2e\x31\x00\x17\x00\x00\x00\x0d\x00\x18\x00\ - \x16\x04\x03\x08\x04\x04\x01\x05\x03\x02\x03\x08\x05\x08\x05\x05\ - \x01\x08\x06\x06\x01\x02\x01\x00\x05\x00\x05\x01\x00\x00\x00\x00\ - \x33\x74\x00\x00\x00\x12\x00\x00\x00\x10\x00\x30\x00\x2e\x02\x68\ - \x32\x05\x68\x32\x2d\x31\x36\x05\x68\x32\x2d\x31\x35\x05\x68\x32\ - \x2d\x31\x34\x08\x73\x70\x64\x79\x2f\x33\x2e\x31\x06\x73\x70\x64\ - \x79\x2f\x33\x08\x68\x74\x74\x70\x2f\x31\x2e\x31\x00\x0b\x00\x02\ - \x01\x00\x00\x0a\x00\x0a\x00\x08\x00\x1d\x00\x17\x00\x18\x00\x19"; - let mut rd = Reader::init(bytes); - let m = OpaqueMessage::read(&mut rd).unwrap(); - println!("m = {:?}", m); - assert!(Message::try_from(m.into_plain_message()).is_err()); -} - -#[test] -fn alert_is_not_handshake() { - let m = Message::build_alert(AlertLevel::Fatal, AlertDescription::DecodeError); - assert!(!m.is_handshake_type(HandshakeType::ClientHello)); -} - -#[test] -fn alert_is_not_opaque() { - let m = Message::build_alert(AlertLevel::Fatal, AlertDescription::DecodeError); - assert!(Message::try_from(m).is_ok()); -} - -#[test] -fn construct_all_types() { - let samples = [ - &b"\x14\x03\x04\x00\x01\x01"[..], - &b"\x15\x03\x04\x00\x02\x01\x16"[..], - &b"\x16\x03\x04\x00\x05\x18\x00\x00\x01\x00"[..], - &b"\x17\x03\x04\x00\x04\x11\x22\x33\x44"[..], - &b"\x18\x03\x04\x00\x04\x11\x22\x33\x44"[..], - ]; - for &bytes in samples.iter() { - let m = OpaqueMessage::read(&mut Reader::init(bytes)).unwrap(); - println!("m = {:?}", m); - let m = Message::try_from(m.into_plain_message()); - println!("m' = {:?}", m); - } -} - -#[test] -fn debug_payload() { - assert_eq!("01020304", format!("{:?}", Payload(vec![1, 2, 3, 4]))); - assert_eq!("01020304", format!("{:?}", PayloadU8(vec![1, 2, 3, 4]))); - assert_eq!("01020304", format!("{:?}", PayloadU16(vec![1, 2, 3, 4]))); - assert_eq!("01020304", format!("{:?}", PayloadU24(vec![1, 2, 3, 4]))); -} diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/mod.rs temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/mod.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/mod.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,51 +0,0 @@ -#![allow(clippy::upper_case_acronyms)] -#![allow(missing_docs)] - -#[macro_use] -mod macros; - -pub mod alert; -pub mod base; -pub mod ccs; -pub mod codec; -pub mod deframer; -pub mod enums; -pub mod fragmenter; -pub mod handshake; -pub mod hsjoiner; -pub mod message; -pub mod persist; - -#[cfg(test)] -mod handshake_test; - -#[cfg(test)] -mod persist_test; - -#[cfg(test)] -pub(crate) mod enums_test; - -#[cfg(test)] -mod message_test; - -#[cfg(test)] -mod test { - use std::convert::TryFrom; - - #[test] - fn smoketest() { - use super::codec::Reader; - use super::message::{Message, OpaqueMessage}; - let bytes = include_bytes!("handshake-test.1.bin"); - let mut r = Reader::init(bytes); - - while r.any_left() { - let m = OpaqueMessage::read(&mut r).unwrap(); - - let out = m.clone().encode(); - assert!(!out.is_empty()); - - Message::try_from(m.into_plain_message()).unwrap(); - } - } -} diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/persist.rs temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/persist.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/persist.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/persist.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,543 +0,0 @@ -use crate::client::ServerName; -use crate::enums::{CipherSuite, ProtocolVersion}; -use crate::key; -use crate::msgs::base::{PayloadU16, PayloadU8}; -use crate::msgs::codec::{Codec, Reader}; -use crate::msgs::handshake::CertificatePayload; -use crate::msgs::handshake::SessionID; -use crate::suites::SupportedCipherSuite; -use crate::ticketer::TimeBase; -#[cfg(feature = "tls12")] -use crate::tls12::Tls12CipherSuite; -use crate::tls13::Tls13CipherSuite; - -use std::cmp; -#[cfg(feature = "tls12")] -use std::mem; - -// These are the keys and values we store in session storage. - -// --- Client types --- -/// Keys for session resumption and tickets. -/// Matching value is a `ClientSessionValue`. -#[derive(Debug)] -pub struct ClientSessionKey { - kind: &'static [u8], - name: Vec, -} - -impl Codec for ClientSessionKey { - fn encode(&self, bytes: &mut Vec) { - bytes.extend_from_slice(self.kind); - bytes.extend_from_slice(&self.name); - } - - // Don't need to read these. - fn read(_r: &mut Reader) -> Option { - None - } -} - -impl ClientSessionKey { - pub fn session_for_server_name(server_name: &ServerName) -> Self { - Self { - kind: b"session", - name: server_name.encode(), - } - } - - pub fn hint_for_server_name(server_name: &ServerName) -> Self { - Self { - kind: b"kx-hint", - name: server_name.encode(), - } - } -} - -#[derive(Debug)] -pub enum ClientSessionValue { - Tls13(Tls13ClientSessionValue), - #[cfg(feature = "tls12")] - Tls12(Tls12ClientSessionValue), -} - -impl ClientSessionValue { - pub fn read( - reader: &mut Reader<'_>, - suite: CipherSuite, - supported: &[SupportedCipherSuite], - ) -> Option { - match supported - .iter() - .find(|s| s.suite() == suite)? - { - SupportedCipherSuite::Tls13(inner) => { - Tls13ClientSessionValue::read(inner, reader).map(ClientSessionValue::Tls13) - } - #[cfg(feature = "tls12")] - SupportedCipherSuite::Tls12(inner) => { - Tls12ClientSessionValue::read(inner, reader).map(ClientSessionValue::Tls12) - } - } - } - - fn common(&self) -> &ClientSessionCommon { - match self { - Self::Tls13(inner) => &inner.common, - #[cfg(feature = "tls12")] - Self::Tls12(inner) => &inner.common, - } - } -} - -impl From for ClientSessionValue { - fn from(v: Tls13ClientSessionValue) -> Self { - Self::Tls13(v) - } -} - -#[cfg(feature = "tls12")] -impl From for ClientSessionValue { - fn from(v: Tls12ClientSessionValue) -> Self { - Self::Tls12(v) - } -} - -pub struct Retrieved { - pub value: T, - retrieved_at: TimeBase, -} - -impl Retrieved { - pub fn new(value: T, retrieved_at: TimeBase) -> Self { - Self { - value, - retrieved_at, - } - } -} - -impl Retrieved<&Tls13ClientSessionValue> { - pub fn obfuscated_ticket_age(&self) -> u32 { - let age_secs = self - .retrieved_at - .as_secs() - .saturating_sub(self.value.common.epoch); - let age_millis = age_secs as u32 * 1000; - age_millis.wrapping_add(self.value.age_add) - } -} - -impl Retrieved { - pub fn tls13(&self) -> Option> { - match &self.value { - ClientSessionValue::Tls13(value) => Some(Retrieved::new(value, self.retrieved_at)), - #[cfg(feature = "tls12")] - ClientSessionValue::Tls12(_) => None, - } - } - - pub fn has_expired(&self) -> bool { - let common = self.value.common(); - common.lifetime_secs != 0 - && common - .epoch - .saturating_add(u64::from(common.lifetime_secs)) - < self.retrieved_at.as_secs() - } -} - -impl std::ops::Deref for Retrieved { - type Target = T; - - fn deref(&self) -> &Self::Target { - &self.value - } -} - -#[derive(Debug)] -pub struct Tls13ClientSessionValue { - suite: &'static Tls13CipherSuite, - age_add: u32, - max_early_data_size: u32, - pub common: ClientSessionCommon, -} - -impl Tls13ClientSessionValue { - pub fn new( - suite: &'static Tls13CipherSuite, - ticket: Vec, - secret: Vec, - server_cert_chain: Vec, - time_now: TimeBase, - lifetime_secs: u32, - age_add: u32, - max_early_data_size: u32, - ) -> Self { - Self { - suite, - age_add, - max_early_data_size, - common: ClientSessionCommon::new( - ticket, - secret, - time_now, - lifetime_secs, - server_cert_chain, - ), - } - } - - /// [`Codec::read()`] with an extra `suite` argument. - /// - /// We decode the `suite` argument separately because it allows us to - /// decide whether we're decoding an 1.2 or 1.3 session value. - pub fn read(suite: &'static Tls13CipherSuite, r: &mut Reader) -> Option { - Some(Self { - suite, - age_add: u32::read(r)?, - max_early_data_size: u32::read(r)?, - common: ClientSessionCommon::read(r)?, - }) - } - - /// Inherent implementation of the [`Codec::get_encoding()`] method. - /// - /// (See `read()` for why this is inherent here.) - pub fn get_encoding(&self) -> Vec { - let mut bytes = Vec::with_capacity(16); - self.suite - .common - .suite - .encode(&mut bytes); - self.age_add.encode(&mut bytes); - self.max_early_data_size - .encode(&mut bytes); - self.common.encode(&mut bytes); - bytes - } - - pub fn max_early_data_size(&self) -> u32 { - self.max_early_data_size - } - - pub fn suite(&self) -> &'static Tls13CipherSuite { - self.suite - } -} - -impl std::ops::Deref for Tls13ClientSessionValue { - type Target = ClientSessionCommon; - - fn deref(&self) -> &Self::Target { - &self.common - } -} - -#[cfg(feature = "tls12")] -#[derive(Debug)] -pub struct Tls12ClientSessionValue { - suite: &'static Tls12CipherSuite, - pub session_id: SessionID, - extended_ms: bool, - pub common: ClientSessionCommon, -} - -#[cfg(feature = "tls12")] -impl Tls12ClientSessionValue { - pub fn new( - suite: &'static Tls12CipherSuite, - session_id: SessionID, - ticket: Vec, - master_secret: Vec, - server_cert_chain: Vec, - time_now: TimeBase, - lifetime_secs: u32, - extended_ms: bool, - ) -> Self { - Self { - suite, - session_id, - extended_ms, - common: ClientSessionCommon::new( - ticket, - master_secret, - time_now, - lifetime_secs, - server_cert_chain, - ), - } - } - - /// [`Codec::read()`] with an extra `suite` argument. - /// - /// We decode the `suite` argument separately because it allows us to - /// decide whether we're decoding an 1.2 or 1.3 session value. - fn read(suite: &'static Tls12CipherSuite, r: &mut Reader) -> Option { - Some(Self { - suite, - session_id: SessionID::read(r)?, - extended_ms: u8::read(r)? == 1, - common: ClientSessionCommon::read(r)?, - }) - } - - /// Inherent implementation of the [`Codec::get_encoding()`] method. - /// - /// (See `read()` for why this is inherent here.) - pub fn get_encoding(&self) -> Vec { - let mut bytes = Vec::with_capacity(16); - self.suite - .common - .suite - .encode(&mut bytes); - self.session_id.encode(&mut bytes); - (u8::from(self.extended_ms)).encode(&mut bytes); - self.common.encode(&mut bytes); - bytes - } - - pub fn take_ticket(&mut self) -> Vec { - mem::take(&mut self.common.ticket.0) - } - - pub fn extended_ms(&self) -> bool { - self.extended_ms - } - - pub fn suite(&self) -> &'static Tls12CipherSuite { - self.suite - } -} - -#[cfg(feature = "tls12")] -impl std::ops::Deref for Tls12ClientSessionValue { - type Target = ClientSessionCommon; - - fn deref(&self) -> &Self::Target { - &self.common - } -} - -#[derive(Debug)] -pub struct ClientSessionCommon { - ticket: PayloadU16, - secret: PayloadU8, - epoch: u64, - lifetime_secs: u32, - server_cert_chain: CertificatePayload, -} - -impl ClientSessionCommon { - fn new( - ticket: Vec, - secret: Vec, - time_now: TimeBase, - lifetime_secs: u32, - server_cert_chain: Vec, - ) -> Self { - Self { - ticket: PayloadU16(ticket), - secret: PayloadU8(secret), - epoch: time_now.as_secs(), - lifetime_secs: cmp::min(lifetime_secs, MAX_TICKET_LIFETIME), - server_cert_chain, - } - } - - /// [`Codec::read()`] is inherent here to avoid leaking the [`Codec`] - /// implementation through [`Deref`] implementations on - /// [`Tls12ClientSessionValue`] and [`Tls13ClientSessionValue`]. - fn read(r: &mut Reader) -> Option { - Some(Self { - ticket: PayloadU16::read(r)?, - secret: PayloadU8::read(r)?, - epoch: u64::read(r)?, - lifetime_secs: u32::read(r)?, - server_cert_chain: CertificatePayload::read(r)?, - }) - } - - /// [`Codec::encode()`] is inherent here to avoid leaking the [`Codec`] - /// implementation through [`Deref`] implementations on - /// [`Tls12ClientSessionValue`] and [`Tls13ClientSessionValue`]. - fn encode(&self, bytes: &mut Vec) { - self.ticket.encode(bytes); - self.secret.encode(bytes); - self.epoch.encode(bytes); - self.lifetime_secs.encode(bytes); - self.server_cert_chain.encode(bytes); - } - - pub fn server_cert_chain(&self) -> &[key::Certificate] { - self.server_cert_chain.as_ref() - } - - pub fn secret(&self) -> &[u8] { - self.secret.0.as_ref() - } - - pub fn ticket(&self) -> &[u8] { - self.ticket.0.as_ref() - } - - /// Test only: wind back epoch by delta seconds. - pub fn rewind_epoch(&mut self, delta: u32) { - self.epoch -= delta as u64; - } -} - -static MAX_TICKET_LIFETIME: u32 = 7 * 24 * 60 * 60; - -/// This is the maximum allowed skew between server and client clocks, over -/// the maximum ticket lifetime period. This encompasses TCP retransmission -/// times in case packet loss occurs when the client sends the ClientHello -/// or receives the NewSessionTicket, _and_ actual clock skew over this period. -static MAX_FRESHNESS_SKEW_MS: u32 = 60 * 1000; - -// --- Server types --- -pub type ServerSessionKey = SessionID; - -#[derive(Debug)] -pub struct ServerSessionValue { - pub sni: Option, - pub version: ProtocolVersion, - pub cipher_suite: CipherSuite, - pub master_secret: PayloadU8, - pub extended_ms: bool, - pub client_cert_chain: Option, - pub alpn: Option, - pub application_data: PayloadU16, - pub creation_time_sec: u64, - pub age_obfuscation_offset: u32, - freshness: Option, -} - -impl Codec for ServerSessionValue { - fn encode(&self, bytes: &mut Vec) { - if let Some(ref sni) = self.sni { - 1u8.encode(bytes); - let sni_bytes: &str = sni.as_ref().into(); - PayloadU8::new(Vec::from(sni_bytes)).encode(bytes); - } else { - 0u8.encode(bytes); - } - self.version.encode(bytes); - self.cipher_suite.encode(bytes); - self.master_secret.encode(bytes); - (u8::from(self.extended_ms)).encode(bytes); - if let Some(ref chain) = self.client_cert_chain { - 1u8.encode(bytes); - chain.encode(bytes); - } else { - 0u8.encode(bytes); - } - if let Some(ref alpn) = self.alpn { - 1u8.encode(bytes); - alpn.encode(bytes); - } else { - 0u8.encode(bytes); - } - self.application_data.encode(bytes); - self.creation_time_sec.encode(bytes); - self.age_obfuscation_offset - .encode(bytes); - } - - fn read(r: &mut Reader) -> Option { - let has_sni = u8::read(r)?; - let sni = if has_sni == 1 { - let dns_name = PayloadU8::read(r)?; - let dns_name = webpki::DnsNameRef::try_from_ascii(&dns_name.0).ok()?; - Some(dns_name.into()) - } else { - None - }; - let v = ProtocolVersion::read(r)?; - let cs = CipherSuite::read(r)?; - let ms = PayloadU8::read(r)?; - let ems = u8::read(r)?; - let has_ccert = u8::read(r)? == 1; - let ccert = if has_ccert { - Some(CertificatePayload::read(r)?) - } else { - None - }; - let has_alpn = u8::read(r)? == 1; - let alpn = if has_alpn { - Some(PayloadU8::read(r)?) - } else { - None - }; - let application_data = PayloadU16::read(r)?; - let creation_time_sec = u64::read(r)?; - let age_obfuscation_offset = u32::read(r)?; - - Some(Self { - sni, - version: v, - cipher_suite: cs, - master_secret: ms, - extended_ms: ems == 1u8, - client_cert_chain: ccert, - alpn, - application_data, - creation_time_sec, - age_obfuscation_offset, - freshness: None, - }) - } -} - -impl ServerSessionValue { - pub fn new( - sni: Option<&webpki::DnsName>, - v: ProtocolVersion, - cs: CipherSuite, - ms: Vec, - client_cert_chain: Option, - alpn: Option>, - application_data: Vec, - creation_time: TimeBase, - age_obfuscation_offset: u32, - ) -> Self { - Self { - sni: sni.cloned(), - version: v, - cipher_suite: cs, - master_secret: PayloadU8::new(ms), - extended_ms: false, - client_cert_chain, - alpn: alpn.map(PayloadU8::new), - application_data: PayloadU16::new(application_data), - creation_time_sec: creation_time.as_secs(), - age_obfuscation_offset, - freshness: None, - } - } - - pub fn set_extended_ms_used(&mut self) { - self.extended_ms = true; - } - - pub fn set_freshness(mut self, obfuscated_client_age_ms: u32, time_now: TimeBase) -> Self { - let client_age_ms = obfuscated_client_age_ms.wrapping_sub(self.age_obfuscation_offset); - let server_age_ms = (time_now - .as_secs() - .saturating_sub(self.creation_time_sec) as u32) - .saturating_mul(1000); - - let age_difference = if client_age_ms < server_age_ms { - server_age_ms - client_age_ms - } else { - client_age_ms - server_age_ms - }; - - self.freshness = Some(age_difference <= MAX_FRESHNESS_SKEW_MS); - self - } - - pub fn is_fresh(&self) -> bool { - self.freshness.unwrap_or_default() - } -} diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/persist_test.rs temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/persist_test.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/persist_test.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/src/msgs/persist_test.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,78 +0,0 @@ -use super::codec::{Codec, Reader}; -use super::persist::*; -use crate::enums::*; - -use crate::key::Certificate; -use crate::ticketer::TimeBase; -use crate::tls13::TLS13_AES_128_GCM_SHA256; - -use std::convert::TryInto; - -#[test] -fn clientsessionkey_is_debug() { - let name = "hello".try_into().unwrap(); - let csk = ClientSessionKey::session_for_server_name(&name); - println!("{:?}", csk); -} - -#[test] -fn clientsessionkey_cannot_be_read() { - let bytes = [0; 1]; - let mut rd = Reader::init(&bytes); - assert!(ClientSessionKey::read(&mut rd).is_none()); -} - -#[test] -fn clientsessionvalue_is_debug() { - let csv = ClientSessionValue::from(Tls13ClientSessionValue::new( - TLS13_AES_128_GCM_SHA256 - .tls13() - .unwrap(), - vec![], - vec![1, 2, 3], - vec![Certificate(b"abc".to_vec()), Certificate(b"def".to_vec())], - TimeBase::now().unwrap(), - 15, - 10, - 128, - )); - println!("{:?}", csv); -} - -#[test] -fn serversessionvalue_is_debug() { - let ssv = ServerSessionValue::new( - None, - ProtocolVersion::TLSv1_3, - CipherSuite::TLS13_AES_128_GCM_SHA256, - vec![1, 2, 3], - None, - None, - vec![4, 5, 6], - TimeBase::now().unwrap(), - 0x12345678, - ); - println!("{:?}", ssv); -} - -#[test] -fn serversessionvalue_no_sni() { - let bytes = [ - 0x00, 0x03, 0x03, 0xc0, 0x23, 0x03, 0x01, 0x02, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, - 0x23, 0x34, 0x45, 0x56, 0x67, 0x78, 0x89, 0xfe, 0xed, 0xf0, 0x0d, - ]; - let mut rd = Reader::init(&bytes); - let ssv = ServerSessionValue::read(&mut rd).unwrap(); - assert_eq!(ssv.get_encoding(), bytes); -} - -#[test] -fn serversessionvalue_with_cert() { - let bytes = [ - 0x00, 0x03, 0x03, 0xc0, 0x23, 0x03, 0x01, 0x02, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, - 0x23, 0x34, 0x45, 0x56, 0x67, 0x78, 0x89, 0xfe, 0xed, 0xf0, 0x0d, - ]; - let mut rd = Reader::init(&bytes); - let ssv = ServerSessionValue::read(&mut rd).unwrap(); - assert_eq!(ssv.get_encoding(), bytes); -} diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/src/quic.rs temporalio-1.3.0/vendor/rustls-0.20.9/src/quic.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/src/quic.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/src/quic.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,620 +0,0 @@ -/// This module contains optional APIs for implementing QUIC TLS. -use crate::cipher::{Iv, IvLen}; -pub use crate::client::ClientQuicExt; -use crate::conn::CommonState; -use crate::error::Error; -use crate::msgs::enums::AlertDescription; -pub use crate::server::ServerQuicExt; -use crate::suites::BulkAlgorithm; -use crate::tls13::key_schedule::hkdf_expand; -use crate::tls13::{Tls13CipherSuite, TLS13_AES_128_GCM_SHA256_INTERNAL}; -use std::fmt::Debug; - -use ring::{aead, hkdf}; - -/// Secrets used to encrypt/decrypt traffic -#[derive(Clone, Debug)] -pub struct Secrets { - /// Secret used to encrypt packets transmitted by the client - client: hkdf::Prk, - /// Secret used to encrypt packets transmitted by the server - server: hkdf::Prk, - /// Cipher suite used with these secrets - suite: &'static Tls13CipherSuite, - is_client: bool, -} - -impl Secrets { - pub(crate) fn new( - client: hkdf::Prk, - server: hkdf::Prk, - suite: &'static Tls13CipherSuite, - is_client: bool, - ) -> Self { - Self { - client, - server, - suite, - is_client, - } - } - - /// Derive the next set of packet keys - pub fn next_packet_keys(&mut self) -> PacketKeySet { - let keys = PacketKeySet::new(self); - self.update(); - keys - } - - fn update(&mut self) { - let hkdf_alg = self.suite.hkdf_algorithm; - self.client = hkdf_expand(&self.client, hkdf_alg, b"quic ku", &[]); - self.server = hkdf_expand(&self.server, hkdf_alg, b"quic ku", &[]); - } - - fn local_remote(&self) -> (&hkdf::Prk, &hkdf::Prk) { - if self.is_client { - (&self.client, &self.server) - } else { - (&self.server, &self.client) - } - } -} - -/// Generic methods for QUIC sessions -pub trait QuicExt { - /// Return the TLS-encoded transport parameters for the session's peer. - /// - /// While the transport parameters are technically available prior to the - /// completion of the handshake, they cannot be fully trusted until the - /// handshake completes, and reliance on them should be minimized. - /// However, any tampering with the parameters will cause the handshake - /// to fail. - fn quic_transport_parameters(&self) -> Option<&[u8]>; - - /// Compute the keys for encrypting/decrypting 0-RTT packets, if available - fn zero_rtt_keys(&self) -> Option; - - /// Consume unencrypted TLS handshake data. - /// - /// Handshake data obtained from separate encryption levels should be supplied in separate calls. - fn read_hs(&mut self, plaintext: &[u8]) -> Result<(), Error>; - - /// Emit unencrypted TLS handshake data. - /// - /// When this returns `Some(_)`, the new keys must be used for future handshake data. - fn write_hs(&mut self, buf: &mut Vec) -> Option; - - /// Emit the TLS description code of a fatal alert, if one has arisen. - /// - /// Check after `read_hs` returns `Err(_)`. - fn alert(&self) -> Option; -} - -/// Keys used to communicate in a single direction -pub struct DirectionalKeys { - /// Encrypts or decrypts a packet's headers - pub header: HeaderProtectionKey, - /// Encrypts or decrypts the payload of a packet - pub packet: PacketKey, -} - -impl DirectionalKeys { - pub(crate) fn new(suite: &'static Tls13CipherSuite, secret: &hkdf::Prk) -> Self { - Self { - header: HeaderProtectionKey::new(suite, secret), - packet: PacketKey::new(suite, secret), - } - } -} - -/// A QUIC header protection key -pub struct HeaderProtectionKey(aead::quic::HeaderProtectionKey); - -impl HeaderProtectionKey { - fn new(suite: &'static Tls13CipherSuite, secret: &hkdf::Prk) -> Self { - let alg = match suite.common.bulk { - BulkAlgorithm::Aes128Gcm => &aead::quic::AES_128, - BulkAlgorithm::Aes256Gcm => &aead::quic::AES_256, - BulkAlgorithm::Chacha20Poly1305 => &aead::quic::CHACHA20, - }; - - Self(hkdf_expand(secret, alg, b"quic hp", &[])) - } - - /// Adds QUIC Header Protection. - /// - /// `sample` must contain the sample of encrypted payload; see - /// [Header Protection Sample]. - /// - /// `first` must reference the first byte of the header, referred to as - /// `packet[0]` in [Header Protection Application]. - /// - /// `packet_number` must reference the Packet Number field; this is - /// `packet[pn_offset:pn_offset+pn_length]` in [Header Protection Application]. - /// - /// Returns an error without modifying anything if `sample` is not - /// the correct length (see [Header Protection Sample] and [`Self::sample_len()`]), - /// or `packet_number` is longer than allowed (see [Packet Number Encoding and Decoding]). - /// - /// Otherwise, `first` and `packet_number` will have the header protection added. - /// - /// [Header Protection Application]: https://datatracker.ietf.org/doc/html/rfc9001#section-5.4.1 - /// [Header Protection Sample]: https://datatracker.ietf.org/doc/html/rfc9001#section-5.4.2 - /// [Packet Number Encoding and Decoding]: https://datatracker.ietf.org/doc/html/rfc9000#section-17.1 - #[inline] - pub fn encrypt_in_place( - &self, - sample: &[u8], - first: &mut u8, - packet_number: &mut [u8], - ) -> Result<(), Error> { - self.xor_in_place(sample, first, packet_number, false) - } - - /// Removes QUIC Header Protection. - /// - /// `sample` must contain the sample of encrypted payload; see - /// [Header Protection Sample]. - /// - /// `first` must reference the first byte of the header, referred to as - /// `packet[0]` in [Header Protection Application]. - /// - /// `packet_number` must reference the Packet Number field; this is - /// `packet[pn_offset:pn_offset+pn_length]` in [Header Protection Application]. - /// - /// Returns an error without modifying anything if `sample` is not - /// the correct length (see [Header Protection Sample] and [`Self::sample_len()`]), - /// or `packet_number` is longer than allowed (see - /// [Packet Number Encoding and Decoding]). - /// - /// Otherwise, `first` and `packet_number` will have the header protection removed. - /// - /// [Header Protection Application]: https://datatracker.ietf.org/doc/html/rfc9001#section-5.4.1 - /// [Header Protection Sample]: https://datatracker.ietf.org/doc/html/rfc9001#section-5.4.2 - /// [Packet Number Encoding and Decoding]: https://datatracker.ietf.org/doc/html/rfc9000#section-17.1 - #[inline] - pub fn decrypt_in_place( - &self, - sample: &[u8], - first: &mut u8, - packet_number: &mut [u8], - ) -> Result<(), Error> { - self.xor_in_place(sample, first, packet_number, true) - } - - fn xor_in_place( - &self, - sample: &[u8], - first: &mut u8, - packet_number: &mut [u8], - masked: bool, - ) -> Result<(), Error> { - // This implements [Header Protection Application] almost verbatim. - - let mask = self - .0 - .new_mask(sample) - .map_err(|_| Error::General("sample of invalid length".into()))?; - - // The `unwrap()` will not panic because `new_mask` returns a - // non-empty result. - let (first_mask, pn_mask) = mask.split_first().unwrap(); - - // It is OK for the `mask` to be longer than `packet_number`, - // but a valid `packet_number` will never be longer than `mask`. - if packet_number.len() > pn_mask.len() { - return Err(Error::General("packet number too long".into())); - } - - // Infallible from this point on. Before this point, `first` and - // `packet_number` are unchanged. - - const LONG_HEADER_FORM: u8 = 0x80; - let bits = match *first & LONG_HEADER_FORM == LONG_HEADER_FORM { - true => 0x0f, // Long header: 4 bits masked - false => 0x1f, // Short header: 5 bits masked - }; - - let first_plain = match masked { - // When unmasking, use the packet length bits after unmasking - true => *first ^ (first_mask & bits), - // When masking, use the packet length bits before masking - false => *first, - }; - let pn_len = (first_plain & 0x03) as usize + 1; - - *first ^= first_mask & bits; - for (dst, m) in packet_number - .iter_mut() - .zip(pn_mask) - .take(pn_len) - { - *dst ^= m; - } - - Ok(()) - } - - /// Expected sample length for the key's algorithm - #[inline] - pub fn sample_len(&self) -> usize { - self.0.algorithm().sample_len() - } -} - -/// Keys to encrypt or decrypt the payload of a packet -pub struct PacketKey { - /// Encrypts or decrypts a packet's payload - key: aead::LessSafeKey, - /// Computes unique nonces for each packet - iv: Iv, - /// The cipher suite used for this packet key - suite: &'static Tls13CipherSuite, -} - -impl PacketKey { - fn new(suite: &'static Tls13CipherSuite, secret: &hkdf::Prk) -> Self { - Self { - key: aead::LessSafeKey::new(hkdf_expand( - secret, - suite.common.aead_algorithm, - b"quic key", - &[], - )), - iv: hkdf_expand(secret, IvLen, b"quic iv", &[]), - suite, - } - } - - /// Encrypt a QUIC packet - /// - /// Takes a `packet_number`, used to derive the nonce; the packet `header`, which is used as - /// the additional authenticated data; and the `payload`. The authentication tag is returned if - /// encryption succeeds. - /// - /// Fails iff the payload is longer than allowed by the cipher suite's AEAD algorithm. - pub fn encrypt_in_place( - &self, - packet_number: u64, - header: &[u8], - payload: &mut [u8], - ) -> Result { - let aad = aead::Aad::from(header); - let nonce = nonce_for(packet_number, &self.iv); - let tag = self - .key - .seal_in_place_separate_tag(nonce, aad, payload) - .map_err(|_| Error::EncryptError)?; - Ok(Tag(tag)) - } - - /// Decrypt a QUIC packet - /// - /// Takes the packet `header`, which is used as the additional authenticated data, and the - /// `payload`, which includes the authentication tag. - /// - /// If the return value is `Ok`, the decrypted payload can be found in `payload`, up to the - /// length found in the return value. - pub fn decrypt_in_place<'a>( - &self, - packet_number: u64, - header: &[u8], - payload: &'a mut [u8], - ) -> Result<&'a [u8], Error> { - let payload_len = payload.len(); - let aad = aead::Aad::from(header); - let nonce = nonce_for(packet_number, &self.iv); - self.key - .open_in_place(nonce, aad, payload) - .map_err(|_| Error::DecryptError)?; - - let plain_len = payload_len - self.key.algorithm().tag_len(); - Ok(&payload[..plain_len]) - } - - /// Number of times the packet key can be used without sacrificing confidentiality - /// - /// See . - #[inline] - pub fn confidentiality_limit(&self) -> u64 { - self.suite.confidentiality_limit - } - - /// Number of times the packet key can be used without sacrificing integrity - /// - /// See . - #[inline] - pub fn integrity_limit(&self) -> u64 { - self.suite.integrity_limit - } - - /// Tag length for the underlying AEAD algorithm - #[inline] - pub fn tag_len(&self) -> usize { - self.key.algorithm().tag_len() - } -} - -/// AEAD tag, must be appended to encrypted cipher text -pub struct Tag(aead::Tag); - -impl AsRef<[u8]> for Tag { - #[inline] - fn as_ref(&self) -> &[u8] { - self.0.as_ref() - } -} - -/// Packet protection keys for bidirectional 1-RTT communication -pub struct PacketKeySet { - /// Encrypts outgoing packets - pub local: PacketKey, - /// Decrypts incoming packets - pub remote: PacketKey, -} - -impl PacketKeySet { - fn new(secrets: &Secrets) -> Self { - let (local, remote) = secrets.local_remote(); - Self { - local: PacketKey::new(secrets.suite, local), - remote: PacketKey::new(secrets.suite, remote), - } - } -} - -/// Complete set of keys used to communicate with the peer -pub struct Keys { - /// Encrypts outgoing packets - pub local: DirectionalKeys, - /// Decrypts incoming packets - pub remote: DirectionalKeys, -} - -impl Keys { - /// Construct keys for use with initial packets - pub fn initial(version: Version, client_dst_connection_id: &[u8], is_client: bool) -> Self { - const CLIENT_LABEL: &[u8] = b"client in"; - const SERVER_LABEL: &[u8] = b"server in"; - let salt = version.initial_salt(); - let hs_secret = hkdf::Salt::new(hkdf::HKDF_SHA256, salt).extract(client_dst_connection_id); - - let secrets = Secrets { - client: hkdf_expand(&hs_secret, hkdf::HKDF_SHA256, CLIENT_LABEL, &[]), - server: hkdf_expand(&hs_secret, hkdf::HKDF_SHA256, SERVER_LABEL, &[]), - suite: TLS13_AES_128_GCM_SHA256_INTERNAL, - is_client, - }; - Self::new(&secrets) - } - - fn new(secrets: &Secrets) -> Self { - let (local, remote) = secrets.local_remote(); - Self { - local: DirectionalKeys::new(secrets.suite, local), - remote: DirectionalKeys::new(secrets.suite, remote), - } - } -} - -pub(crate) fn write_hs(this: &mut CommonState, buf: &mut Vec) -> Option { - while let Some((_, msg)) = this.quic.hs_queue.pop_front() { - buf.extend_from_slice(&msg); - if let Some(&(true, _)) = this.quic.hs_queue.front() { - if this.quic.hs_secrets.is_some() { - // Allow the caller to switch keys before proceeding. - break; - } - } - } - - if let Some(secrets) = this.quic.hs_secrets.take() { - return Some(KeyChange::Handshake { - keys: Keys::new(&secrets), - }); - } - - if let Some(mut secrets) = this.quic.traffic_secrets.take() { - if !this.quic.returned_traffic_keys { - this.quic.returned_traffic_keys = true; - let keys = Keys::new(&secrets); - secrets.update(); - return Some(KeyChange::OneRtt { - keys, - next: secrets, - }); - } - } - - None -} - -/// Key material for use in QUIC packet spaces -/// -/// QUIC uses 4 different sets of keys (and progressive key updates for long-running connections): -/// -/// * Initial: these can be created from [`Keys::initial()`] -/// * 0-RTT keys: can be retrieved from [`QuicExt::zero_rtt_keys()`] -/// * Handshake: these are returned from [`QuicExt::write_hs()`] after `ClientHello` and -/// `ServerHello` messages have been exchanged -/// * 1-RTT keys: these are returned from [`QuicExt::write_hs()`] after the handshake is done -/// -/// Once the 1-RTT keys have been exchanged, either side may initiate a key update. Progressive -/// update keys can be obtained from the [`Secrets`] returned in [`KeyChange::OneRtt`]. Note that -/// only packet keys are updated by key updates; header protection keys remain the same. -#[allow(clippy::large_enum_variant)] -pub enum KeyChange { - /// Keys for the handshake space - Handshake { - /// Header and packet keys for the handshake space - keys: Keys, - }, - /// Keys for 1-RTT data - OneRtt { - /// Header and packet keys for 1-RTT data - keys: Keys, - /// Secrets to derive updated keys from - next: Secrets, - }, -} - -/// Compute the nonce to use for encrypting or decrypting `packet_number` -fn nonce_for(packet_number: u64, iv: &Iv) -> ring::aead::Nonce { - let mut out = [0; aead::NONCE_LEN]; - out[4..].copy_from_slice(&packet_number.to_be_bytes()); - for (out, inp) in out.iter_mut().zip(iv.0.iter()) { - *out ^= inp; - } - aead::Nonce::assume_unique_for_key(out) -} - -/// QUIC protocol version -/// -/// Governs version-specific behavior in the TLS layer -#[non_exhaustive] -#[derive(Clone, Copy, Debug)] -pub enum Version { - /// Draft versions 29, 30, 31 and 32 - V1Draft, - /// First stable RFC - V1, -} - -impl Version { - fn initial_salt(self) -> &'static [u8; 20] { - match self { - Self::V1Draft => &[ - // https://datatracker.ietf.org/doc/html/draft-ietf-quic-tls-32#section-5.2 - 0xaf, 0xbf, 0xec, 0x28, 0x99, 0x93, 0xd2, 0x4c, 0x9e, 0x97, 0x86, 0xf1, 0x9c, 0x61, - 0x11, 0xe0, 0x43, 0x90, 0xa8, 0x99, - ], - Self::V1 => &[ - // https://www.rfc-editor.org/rfc/rfc9001.html#name-initial-secrets - 0x38, 0x76, 0x2c, 0xf7, 0xf5, 0x59, 0x34, 0xb3, 0x4d, 0x17, 0x9a, 0xe6, 0xa4, 0xc8, - 0x0c, 0xad, 0xcc, 0xbb, 0x7f, 0x0a, - ], - } - } -} - -#[cfg(test)] -mod test { - use super::*; - - #[test] - fn short_packet_header_protection() { - // https://www.rfc-editor.org/rfc/rfc9001.html#name-chacha20-poly1305-short-hea - - const PN: u64 = 654360564; - const SECRET: &[u8] = &[ - 0x9a, 0xc3, 0x12, 0xa7, 0xf8, 0x77, 0x46, 0x8e, 0xbe, 0x69, 0x42, 0x27, 0x48, 0xad, - 0x00, 0xa1, 0x54, 0x43, 0xf1, 0x82, 0x03, 0xa0, 0x7d, 0x60, 0x60, 0xf6, 0x88, 0xf3, - 0x0f, 0x21, 0x63, 0x2b, - ]; - - let secret = hkdf::Prk::new_less_safe(hkdf::HKDF_SHA256, SECRET); - use crate::tls13::TLS13_CHACHA20_POLY1305_SHA256_INTERNAL; - let hpk = HeaderProtectionKey::new(TLS13_CHACHA20_POLY1305_SHA256_INTERNAL, &secret); - let packet = PacketKey::new(TLS13_CHACHA20_POLY1305_SHA256_INTERNAL, &secret); - - const PLAIN: &[u8] = &[0x42, 0x00, 0xbf, 0xf4, 0x01]; - - let mut buf = PLAIN.to_vec(); - let (header, payload) = buf.split_at_mut(4); - let tag = packet - .encrypt_in_place(PN, &*header, payload) - .unwrap(); - buf.extend(tag.as_ref()); - - let pn_offset = 1; - let (header, sample) = buf.split_at_mut(pn_offset + 4); - let (first, rest) = header.split_at_mut(1); - let sample = &sample[..hpk.sample_len()]; - hpk.encrypt_in_place(sample, &mut first[0], dbg!(rest)) - .unwrap(); - - const PROTECTED: &[u8] = &[ - 0x4c, 0xfe, 0x41, 0x89, 0x65, 0x5e, 0x5c, 0xd5, 0x5c, 0x41, 0xf6, 0x90, 0x80, 0x57, - 0x5d, 0x79, 0x99, 0xc2, 0x5a, 0x5b, 0xfb, - ]; - - assert_eq!(&buf, PROTECTED); - - let (header, sample) = buf.split_at_mut(pn_offset + 4); - let (first, rest) = header.split_at_mut(1); - let sample = &sample[..hpk.sample_len()]; - hpk.decrypt_in_place(sample, &mut first[0], rest) - .unwrap(); - - let (header, payload_tag) = buf.split_at_mut(4); - let plain = packet - .decrypt_in_place(PN, &*header, payload_tag) - .unwrap(); - - assert_eq!(plain, &PLAIN[4..]); - } - - #[test] - fn key_update_test_vector() { - fn equal_prk(x: &hkdf::Prk, y: &hkdf::Prk) -> bool { - let mut x_data = [0; 16]; - let mut y_data = [0; 16]; - let x_okm = x - .expand(&[b"info"], &aead::quic::AES_128) - .unwrap(); - x_okm.fill(&mut x_data[..]).unwrap(); - let y_okm = y - .expand(&[b"info"], &aead::quic::AES_128) - .unwrap(); - y_okm.fill(&mut y_data[..]).unwrap(); - x_data == y_data - } - - let mut secrets = Secrets { - // Constant dummy values for reproducibility - client: hkdf::Prk::new_less_safe( - hkdf::HKDF_SHA256, - &[ - 0xb8, 0x76, 0x77, 0x08, 0xf8, 0x77, 0x23, 0x58, 0xa6, 0xea, 0x9f, 0xc4, 0x3e, - 0x4a, 0xdd, 0x2c, 0x96, 0x1b, 0x3f, 0x52, 0x87, 0xa6, 0xd1, 0x46, 0x7e, 0xe0, - 0xae, 0xab, 0x33, 0x72, 0x4d, 0xbf, - ], - ), - server: hkdf::Prk::new_less_safe( - hkdf::HKDF_SHA256, - &[ - 0x42, 0xdc, 0x97, 0x21, 0x40, 0xe0, 0xf2, 0xe3, 0x98, 0x45, 0xb7, 0x67, 0x61, - 0x34, 0x39, 0xdc, 0x67, 0x58, 0xca, 0x43, 0x25, 0x9b, 0x87, 0x85, 0x06, 0x82, - 0x4e, 0xb1, 0xe4, 0x38, 0xd8, 0x55, - ], - ), - suite: TLS13_AES_128_GCM_SHA256_INTERNAL, - is_client: true, - }; - secrets.update(); - - assert!(equal_prk( - &secrets.client, - &hkdf::Prk::new_less_safe( - hkdf::HKDF_SHA256, - &[ - 0x42, 0xca, 0xc8, 0xc9, 0x1c, 0xd5, 0xeb, 0x40, 0x68, 0x2e, 0x43, 0x2e, 0xdf, - 0x2d, 0x2b, 0xe9, 0xf4, 0x1a, 0x52, 0xca, 0x6b, 0x22, 0xd8, 0xe6, 0xcd, 0xb1, - 0xe8, 0xac, 0xa9, 0x6, 0x1f, 0xce - ] - ) - )); - assert!(equal_prk( - &secrets.server, - &hkdf::Prk::new_less_safe( - hkdf::HKDF_SHA256, - &[ - 0xeb, 0x7f, 0x5e, 0x2a, 0x12, 0x3f, 0x40, 0x7d, 0xb4, 0x99, 0xe3, 0x61, 0xca, - 0xe5, 0x90, 0xd4, 0xd9, 0x92, 0xe1, 0x4b, 0x7a, 0xce, 0x3, 0xc2, 0x44, 0xe0, - 0x42, 0x21, 0x15, 0xb6, 0xd3, 0x8a - ] - ) - )); - } -} diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/src/rand.rs temporalio-1.3.0/vendor/rustls-0.20.9/src/rand.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/src/rand.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/src/rand.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,30 +0,0 @@ -use crate::msgs::codec; -/// The single place where we generate random material -/// for our own use. These functions never fail, -/// they panic on error. -use ring::rand::{SecureRandom, SystemRandom}; - -/// Fill the whole slice with random material. -pub(crate) fn fill_random(bytes: &mut [u8]) -> Result<(), GetRandomFailed> { - SystemRandom::new() - .fill(bytes) - .map_err(|_| GetRandomFailed) -} - -/// Make a Vec of the given size -/// containing random material. -pub(crate) fn random_vec(len: usize) -> Result, GetRandomFailed> { - let mut v = vec![0; len]; - fill_random(&mut v)?; - Ok(v) -} - -/// Return a uniformly random u32. -pub(crate) fn random_u32() -> Result { - let mut buf = [0u8; 4]; - fill_random(&mut buf)?; - codec::decode_u32(&buf).ok_or(GetRandomFailed) -} - -#[derive(Debug)] -pub struct GetRandomFailed; diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/src/record_layer.rs temporalio-1.3.0/vendor/rustls-0.20.9/src/record_layer.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/src/record_layer.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/src/record_layer.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,192 +0,0 @@ -use crate::cipher::{MessageDecrypter, MessageEncrypter}; -use crate::error::Error; -use crate::msgs::message::{BorrowedPlainMessage, OpaqueMessage, PlainMessage}; - -static SEQ_SOFT_LIMIT: u64 = 0xffff_ffff_ffff_0000u64; -static SEQ_HARD_LIMIT: u64 = 0xffff_ffff_ffff_fffeu64; - -#[derive(PartialEq)] -enum DirectionState { - /// No keying material. - Invalid, - - /// Keying material present, but not yet in use. - Prepared, - - /// Keying material in use. - Active, -} - -pub(crate) struct RecordLayer { - message_encrypter: Box, - message_decrypter: Box, - write_seq: u64, - read_seq: u64, - encrypt_state: DirectionState, - decrypt_state: DirectionState, - - // Message encrypted with other keys may be encountered, so failures - // should be swallowed by the caller. This struct tracks the amount - // of message size this is allowed for. - trial_decryption_len: Option, -} - -impl RecordLayer { - pub(crate) fn new() -> Self { - Self { - message_encrypter: ::invalid(), - message_decrypter: ::invalid(), - write_seq: 0, - read_seq: 0, - encrypt_state: DirectionState::Invalid, - decrypt_state: DirectionState::Invalid, - trial_decryption_len: None, - } - } - - pub(crate) fn is_encrypting(&self) -> bool { - self.encrypt_state == DirectionState::Active - } - - pub(crate) fn is_decrypting(&self) -> bool { - self.decrypt_state == DirectionState::Active - } - - #[cfg(feature = "secret_extraction")] - pub(crate) fn write_seq(&self) -> u64 { - self.write_seq - } - - #[cfg(feature = "secret_extraction")] - pub(crate) fn read_seq(&self) -> u64 { - self.read_seq - } - - pub(crate) fn doing_trial_decryption(&mut self, requested: usize) -> bool { - match self - .trial_decryption_len - .and_then(|value| value.checked_sub(requested)) - { - Some(remaining) => { - self.trial_decryption_len = Some(remaining); - true - } - _ => false, - } - } - - /// Prepare to use the given `MessageEncrypter` for future message encryption. - /// It is not used until you call `start_encrypting`. - pub(crate) fn prepare_message_encrypter(&mut self, cipher: Box) { - self.message_encrypter = cipher; - self.write_seq = 0; - self.encrypt_state = DirectionState::Prepared; - } - - /// Prepare to use the given `MessageDecrypter` for future message decryption. - /// It is not used until you call `start_decrypting`. - pub(crate) fn prepare_message_decrypter(&mut self, cipher: Box) { - self.message_decrypter = cipher; - self.read_seq = 0; - self.decrypt_state = DirectionState::Prepared; - } - - /// Start using the `MessageEncrypter` previously provided to the previous - /// call to `prepare_message_encrypter`. - pub(crate) fn start_encrypting(&mut self) { - debug_assert!(self.encrypt_state == DirectionState::Prepared); - self.encrypt_state = DirectionState::Active; - } - - /// Start using the `MessageDecrypter` previously provided to the previous - /// call to `prepare_message_decrypter`. - pub(crate) fn start_decrypting(&mut self) { - debug_assert!(self.decrypt_state == DirectionState::Prepared); - self.decrypt_state = DirectionState::Active; - } - - /// Set and start using the given `MessageEncrypter` for future outgoing - /// message encryption. - pub(crate) fn set_message_encrypter(&mut self, cipher: Box) { - self.prepare_message_encrypter(cipher); - self.start_encrypting(); - } - - /// Set and start using the given `MessageDecrypter` for future incoming - /// message decryption. - pub(crate) fn set_message_decrypter(&mut self, cipher: Box) { - self.prepare_message_decrypter(cipher); - self.start_decrypting(); - self.trial_decryption_len = None; - } - - /// Set and start using the given `MessageDecrypter` for future incoming - /// message decryption, and enable "trial decryption" mode for when TLS1.3 - /// 0-RTT is attempted but rejected by the server. - pub(crate) fn set_message_decrypter_with_trial_decryption( - &mut self, - cipher: Box, - max_length: usize, - ) { - self.prepare_message_decrypter(cipher); - self.start_decrypting(); - self.trial_decryption_len = Some(max_length); - } - - pub(crate) fn finish_trial_decryption(&mut self) { - self.trial_decryption_len = None; - } - - /// Return true if the peer appears to getting close to encrypting - /// too many messages with this key. - /// - /// Perhaps if we send an alert well before their counter wraps, a - /// buggy peer won't make a terrible mistake here? - /// - /// Note that there's no reason to refuse to decrypt: the security - /// failure has already happened. - pub(crate) fn wants_close_before_decrypt(&self) -> bool { - self.read_seq == SEQ_SOFT_LIMIT - } - - /// Return true if we are getting close to encrypting too many - /// messages with our encryption key. - pub(crate) fn wants_close_before_encrypt(&self) -> bool { - self.write_seq == SEQ_SOFT_LIMIT - } - - /// Return true if we outright refuse to do anything with the - /// encryption key. - pub(crate) fn encrypt_exhausted(&self) -> bool { - self.write_seq >= SEQ_HARD_LIMIT - } - - /// Decrypt a TLS message. - /// - /// `encr` is a decoded message allegedly received from the peer. - /// If it can be decrypted, its decryption is returned. Otherwise, - /// an error is returned. - pub(crate) fn decrypt_incoming(&mut self, encr: OpaqueMessage) -> Result { - debug_assert!(self.is_decrypting()); - let seq = self.read_seq; - let msg = self - .message_decrypter - .decrypt(encr, seq)?; - self.read_seq += 1; - Ok(msg) - } - - /// Encrypt a TLS message. - /// - /// `plain` is a TLS message we'd like to send. This function - /// panics if the requisite keying material hasn't been established yet. - pub(crate) fn encrypt_outgoing(&mut self, plain: BorrowedPlainMessage) -> OpaqueMessage { - debug_assert!(self.encrypt_state == DirectionState::Active); - assert!(!self.encrypt_exhausted()); - let seq = self.write_seq; - self.write_seq += 1; - self.message_encrypter - .encrypt(plain, seq) - .unwrap() - } -} diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/src/server/builder.rs temporalio-1.3.0/vendor/rustls-0.20.9/src/server/builder.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/src/server/builder.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/src/server/builder.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,116 +0,0 @@ -use crate::builder::{ConfigBuilder, WantsVerifier}; -use crate::error::Error; -use crate::key; -use crate::kx::SupportedKxGroup; -use crate::server::handy; -use crate::server::{ResolvesServerCert, ServerConfig}; -use crate::suites::SupportedCipherSuite; -use crate::verify; -use crate::versions; -use crate::NoKeyLog; - -use std::marker::PhantomData; -use std::sync::Arc; - -impl ConfigBuilder { - /// Choose how to verify client certificates. - pub fn with_client_cert_verifier( - self, - client_cert_verifier: Arc, - ) -> ConfigBuilder { - ConfigBuilder { - state: WantsServerCert { - cipher_suites: self.state.cipher_suites, - kx_groups: self.state.kx_groups, - versions: self.state.versions, - verifier: client_cert_verifier, - }, - side: PhantomData, - } - } - - /// Disable client authentication. - pub fn with_no_client_auth(self) -> ConfigBuilder { - self.with_client_cert_verifier(verify::NoClientAuth::new()) - } -} - -/// A config builder state where the caller must supply how to provide a server certificate to -/// the connecting peer. -/// -/// For more information, see the [`ConfigBuilder`] documentation. -#[derive(Clone, Debug)] -pub struct WantsServerCert { - cipher_suites: Vec, - kx_groups: Vec<&'static SupportedKxGroup>, - versions: versions::EnabledVersions, - verifier: Arc, -} - -impl ConfigBuilder { - /// Sets a single certificate chain and matching private key. This - /// certificate and key is used for all subsequent connections, - /// irrespective of things like SNI hostname. - /// - /// Note that the end-entity certificate must have the - /// [Subject Alternative Name](https://tools.ietf.org/html/rfc6125#section-4.1) - /// extension to describe, e.g., the valid DNS name. The `commonName` field is - /// disregarded. - /// - /// `cert_chain` is a vector of DER-encoded certificates. - /// `key_der` is a DER-encoded RSA, ECDSA, or Ed25519 private key. - /// - /// This function fails if `key_der` is invalid. - pub fn with_single_cert( - self, - cert_chain: Vec, - key_der: key::PrivateKey, - ) -> Result { - let resolver = handy::AlwaysResolvesChain::new(cert_chain, &key_der)?; - Ok(self.with_cert_resolver(Arc::new(resolver))) - } - - /// Sets a single certificate chain, matching private key, OCSP - /// response and SCTs. This certificate and key is used for all - /// subsequent connections, irrespective of things like SNI hostname. - /// - /// `cert_chain` is a vector of DER-encoded certificates. - /// `key_der` is a DER-encoded RSA, ECDSA, or Ed25519 private key. - /// `ocsp` is a DER-encoded OCSP response. Ignored if zero length. - /// `scts` is an `SignedCertificateTimestampList` encoding (see RFC6962) - /// and is ignored if empty. - /// - /// This function fails if `key_der` is invalid. - pub fn with_single_cert_with_ocsp_and_sct( - self, - cert_chain: Vec, - key_der: key::PrivateKey, - ocsp: Vec, - scts: Vec, - ) -> Result { - let resolver = - handy::AlwaysResolvesChain::new_with_extras(cert_chain, &key_der, ocsp, scts)?; - Ok(self.with_cert_resolver(Arc::new(resolver))) - } - - /// Sets a custom [`ResolvesServerCert`]. - pub fn with_cert_resolver(self, cert_resolver: Arc) -> ServerConfig { - ServerConfig { - cipher_suites: self.state.cipher_suites, - kx_groups: self.state.kx_groups, - verifier: self.state.verifier, - cert_resolver, - ignore_client_order: false, - max_fragment_size: None, - session_storage: handy::ServerSessionMemoryCache::new(256), - ticketer: Arc::new(handy::NeverProducesTickets {}), - alpn_protocols: Vec::new(), - versions: self.state.versions, - key_log: Arc::new(NoKeyLog {}), - #[cfg(feature = "secret_extraction")] - enable_secret_extraction: false, - max_early_data_size: 0, - send_half_rtt_data: false, - } - } -} diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/src/server/common.rs temporalio-1.3.0/vendor/rustls-0.20.9/src/server/common.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/src/server/common.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/src/server/common.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,41 +0,0 @@ -use crate::{key, sign}; - -/// ActiveCertifiedKey wraps CertifiedKey and tracks OSCP and SCT state -/// in a single handshake. -pub(super) struct ActiveCertifiedKey<'a> { - key: &'a sign::CertifiedKey, - ocsp: Option<&'a [u8]>, - sct_list: Option<&'a [u8]>, -} - -impl<'a> ActiveCertifiedKey<'a> { - pub(super) fn from_certified_key(key: &sign::CertifiedKey) -> ActiveCertifiedKey { - ActiveCertifiedKey { - key, - ocsp: key.ocsp.as_deref(), - sct_list: key.sct_list.as_deref(), - } - } - - /// Get the certificate chain - #[inline] - pub(super) fn get_cert(&self) -> &[key::Certificate] { - &self.key.cert - } - - /// Get the signing key - #[inline] - pub(super) fn get_key(&self) -> &dyn sign::SigningKey { - &*self.key.key - } - - #[inline] - pub(super) fn get_ocsp(&self) -> Option<&[u8]> { - self.ocsp - } - - #[inline] - pub(super) fn get_sct_list(&self) -> Option<&[u8]> { - self.sct_list - } -} diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/src/server/handy.rs temporalio-1.3.0/vendor/rustls-0.20.9/src/server/handy.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/src/server/handy.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/src/server/handy.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,278 +0,0 @@ -use crate::error::Error; -use crate::key; -use crate::limited_cache; -use crate::server; -use crate::server::ClientHello; -use crate::sign; - -use std::collections; -use std::sync::{Arc, Mutex}; - -/// Something which never stores sessions. -pub struct NoServerSessionStorage {} - -impl server::StoresServerSessions for NoServerSessionStorage { - fn put(&self, _id: Vec, _sec: Vec) -> bool { - false - } - fn get(&self, _id: &[u8]) -> Option> { - None - } - fn take(&self, _id: &[u8]) -> Option> { - None - } - fn can_cache(&self) -> bool { - false - } -} - -/// An implementer of `StoresServerSessions` that stores everything -/// in memory. If enforces a limit on the number of stored sessions -/// to bound memory usage. -pub struct ServerSessionMemoryCache { - cache: Mutex, Vec>>, -} - -impl ServerSessionMemoryCache { - /// Make a new ServerSessionMemoryCache. `size` is the maximum - /// number of stored sessions, and may be rounded-up for - /// efficiency. - pub fn new(size: usize) -> Arc { - Arc::new(Self { - cache: Mutex::new(limited_cache::LimitedCache::new(size)), - }) - } -} - -impl server::StoresServerSessions for ServerSessionMemoryCache { - fn put(&self, key: Vec, value: Vec) -> bool { - self.cache - .lock() - .unwrap() - .insert(key, value); - true - } - - fn get(&self, key: &[u8]) -> Option> { - self.cache - .lock() - .unwrap() - .get(key) - .cloned() - } - - fn take(&self, key: &[u8]) -> Option> { - self.cache.lock().unwrap().remove(key) - } - - fn can_cache(&self) -> bool { - true - } -} - -/// Something which never produces tickets. -pub(super) struct NeverProducesTickets {} - -impl server::ProducesTickets for NeverProducesTickets { - fn enabled(&self) -> bool { - false - } - fn lifetime(&self) -> u32 { - 0 - } - fn encrypt(&self, _bytes: &[u8]) -> Option> { - None - } - fn decrypt(&self, _bytes: &[u8]) -> Option> { - None - } -} - -/// Something which always resolves to the same cert chain. -pub(super) struct AlwaysResolvesChain(Arc); - -impl AlwaysResolvesChain { - /// Creates an `AlwaysResolvesChain`, auto-detecting the underlying private - /// key type and encoding. - pub(super) fn new( - chain: Vec, - priv_key: &key::PrivateKey, - ) -> Result { - let key = sign::any_supported_type(priv_key) - .map_err(|_| Error::General("invalid private key".into()))?; - Ok(Self(Arc::new(sign::CertifiedKey::new(chain, key)))) - } - - /// Creates an `AlwaysResolvesChain`, auto-detecting the underlying private - /// key type and encoding. - /// - /// If non-empty, the given OCSP response and SCTs are attached. - pub(super) fn new_with_extras( - chain: Vec, - priv_key: &key::PrivateKey, - ocsp: Vec, - scts: Vec, - ) -> Result { - let mut r = Self::new(chain, priv_key)?; - - { - let cert = Arc::make_mut(&mut r.0); - if !ocsp.is_empty() { - cert.ocsp = Some(ocsp); - } - if !scts.is_empty() { - cert.sct_list = Some(scts); - } - } - - Ok(r) - } -} - -impl server::ResolvesServerCert for AlwaysResolvesChain { - fn resolve(&self, _client_hello: ClientHello) -> Option> { - Some(Arc::clone(&self.0)) - } -} - -/// Something that resolves do different cert chains/keys based -/// on client-supplied server name (via SNI). -pub struct ResolvesServerCertUsingSni { - by_name: collections::HashMap>, -} - -impl ResolvesServerCertUsingSni { - /// Create a new and empty (i.e., knows no certificates) resolver. - pub fn new() -> Self { - Self { - by_name: collections::HashMap::new(), - } - } - - /// Add a new `sign::CertifiedKey` to be used for the given SNI `name`. - /// - /// This function fails if `name` is not a valid DNS name, or if - /// it's not valid for the supplied certificate, or if the certificate - /// chain is syntactically faulty. - pub fn add(&mut self, name: &str, ck: sign::CertifiedKey) -> Result<(), Error> { - let checked_name = webpki::DnsNameRef::try_from_ascii_str(name) - .map_err(|_| Error::General("Bad DNS name".into()))? - .to_owned(); - - ck.cross_check_end_entity_cert(Some(checked_name.as_ref()))?; - let as_str: &str = checked_name.as_ref().into(); - self.by_name - .insert(as_str.to_string(), Arc::new(ck)); - Ok(()) - } -} - -impl server::ResolvesServerCert for ResolvesServerCertUsingSni { - fn resolve(&self, client_hello: ClientHello) -> Option> { - if let Some(name) = client_hello.server_name() { - self.by_name.get(name).map(Arc::clone) - } else { - // This kind of resolver requires SNI - None - } - } -} - -#[cfg(test)] -mod test { - use super::*; - use crate::server::ProducesTickets; - use crate::server::ResolvesServerCert; - use crate::server::StoresServerSessions; - - #[test] - fn test_noserversessionstorage_drops_put() { - let c = NoServerSessionStorage {}; - assert!(!c.put(vec![0x01], vec![0x02])); - } - - #[test] - fn test_noserversessionstorage_denies_gets() { - let c = NoServerSessionStorage {}; - c.put(vec![0x01], vec![0x02]); - assert_eq!(c.get(&[]), None); - assert_eq!(c.get(&[0x01]), None); - assert_eq!(c.get(&[0x02]), None); - } - - #[test] - fn test_noserversessionstorage_denies_takes() { - let c = NoServerSessionStorage {}; - assert_eq!(c.take(&[]), None); - assert_eq!(c.take(&[0x01]), None); - assert_eq!(c.take(&[0x02]), None); - } - - #[test] - fn test_serversessionmemorycache_accepts_put() { - let c = ServerSessionMemoryCache::new(4); - assert!(c.put(vec![0x01], vec![0x02])); - } - - #[test] - fn test_serversessionmemorycache_persists_put() { - let c = ServerSessionMemoryCache::new(4); - assert!(c.put(vec![0x01], vec![0x02])); - assert_eq!(c.get(&[0x01]), Some(vec![0x02])); - assert_eq!(c.get(&[0x01]), Some(vec![0x02])); - } - - #[test] - fn test_serversessionmemorycache_overwrites_put() { - let c = ServerSessionMemoryCache::new(4); - assert!(c.put(vec![0x01], vec![0x02])); - assert!(c.put(vec![0x01], vec![0x04])); - assert_eq!(c.get(&[0x01]), Some(vec![0x04])); - } - - #[test] - fn test_serversessionmemorycache_drops_to_maintain_size_invariant() { - let c = ServerSessionMemoryCache::new(2); - assert!(c.put(vec![0x01], vec![0x02])); - assert!(c.put(vec![0x03], vec![0x04])); - assert!(c.put(vec![0x05], vec![0x06])); - assert!(c.put(vec![0x07], vec![0x08])); - assert!(c.put(vec![0x09], vec![0x0a])); - - let count = c.get(&[0x01]).iter().count() - + c.get(&[0x03]).iter().count() - + c.get(&[0x05]).iter().count() - + c.get(&[0x07]).iter().count() - + c.get(&[0x09]).iter().count(); - - assert!(count < 5); - } - - #[test] - fn test_neverproducestickets_does_nothing() { - let npt = NeverProducesTickets {}; - assert!(!npt.enabled()); - assert_eq!(0, npt.lifetime()); - assert_eq!(None, npt.encrypt(&[])); - assert_eq!(None, npt.decrypt(&[])); - } - - #[test] - fn test_resolvesservercertusingsni_requires_sni() { - let rscsni = ResolvesServerCertUsingSni::new(); - assert!(rscsni - .resolve(ClientHello::new(&None, &[], None, &[])) - .is_none()); - } - - #[test] - fn test_resolvesservercertusingsni_handles_unknown_name() { - let rscsni = ResolvesServerCertUsingSni::new(); - let name = webpki::DnsNameRef::try_from_ascii_str("hello.com") - .unwrap() - .to_owned(); - assert!(rscsni - .resolve(ClientHello::new(&Some(name), &[], None, &[])) - .is_none()); - } -} diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/src/server/hs.rs temporalio-1.3.0/vendor/rustls-0.20.9/src/server/hs.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/src/server/hs.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/src/server/hs.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,522 +0,0 @@ -use crate::conn::{CommonState, ConnectionRandoms, State}; -#[cfg(feature = "tls12")] -use crate::enums::CipherSuite; -use crate::enums::{ProtocolVersion, SignatureScheme}; -use crate::error::Error; -use crate::hash_hs::{HandshakeHash, HandshakeHashBuffer}; -#[cfg(feature = "logging")] -use crate::log::{debug, trace}; -use crate::msgs::enums::HandshakeType; -use crate::msgs::enums::{AlertDescription, Compression, ExtensionType}; -#[cfg(feature = "tls12")] -use crate::msgs::handshake::SessionID; -use crate::msgs::handshake::{ClientHelloPayload, Random, ServerExtension}; -use crate::msgs::handshake::{ConvertProtocolNameList, ConvertServerNameList, HandshakePayload}; -use crate::msgs::message::{Message, MessagePayload}; -use crate::msgs::persist; -use crate::server::{ClientHello, ServerConfig}; -use crate::suites; -use crate::SupportedCipherSuite; - -use super::server_conn::ServerConnectionData; -#[cfg(feature = "tls12")] -use super::tls12; -use crate::server::common::ActiveCertifiedKey; -use crate::server::tls13; - -use std::sync::Arc; - -pub(super) type NextState = Box>; -pub(super) type NextStateOrError = Result; -pub(super) type ServerContext<'a> = crate::conn::Context<'a, ServerConnectionData>; - -pub(super) fn incompatible(common: &mut CommonState, why: &str) -> Error { - common.send_fatal_alert(AlertDescription::HandshakeFailure); - Error::PeerIncompatibleError(why.to_string()) -} - -fn bad_version(common: &mut CommonState, why: &str) -> Error { - common.send_fatal_alert(AlertDescription::ProtocolVersion); - Error::PeerIncompatibleError(why.to_string()) -} - -pub(super) fn decode_error(common: &mut CommonState, why: &str) -> Error { - common.send_fatal_alert(AlertDescription::DecodeError); - Error::PeerMisbehavedError(why.to_string()) -} - -pub(super) fn can_resume( - suite: SupportedCipherSuite, - sni: &Option, - using_ems: bool, - resumedata: &persist::ServerSessionValue, -) -> bool { - // The RFCs underspecify what happens if we try to resume to - // an unoffered/varying suite. We merely don't resume in weird cases. - // - // RFC 6066 says "A server that implements this extension MUST NOT accept - // the request to resume the session if the server_name extension contains - // a different name. Instead, it proceeds with a full handshake to - // establish a new session." - resumedata.cipher_suite == suite.suite() - && (resumedata.extended_ms == using_ems || (resumedata.extended_ms && !using_ems)) - && &resumedata.sni == sni -} - -#[derive(Default)] -pub(super) struct ExtensionProcessing { - // extensions to reply with - pub(super) exts: Vec, - #[cfg(feature = "tls12")] - pub(super) send_ticket: bool, -} - -impl ExtensionProcessing { - pub(super) fn new() -> Self { - Default::default() - } - - pub(super) fn process_common( - &mut self, - config: &ServerConfig, - cx: &mut ServerContext<'_>, - ocsp_response: &mut Option<&[u8]>, - sct_list: &mut Option<&[u8]>, - hello: &ClientHelloPayload, - resumedata: Option<&persist::ServerSessionValue>, - extra_exts: Vec, - ) -> Result<(), Error> { - // ALPN - let our_protocols = &config.alpn_protocols; - let maybe_their_protocols = hello.get_alpn_extension(); - if let Some(their_protocols) = maybe_their_protocols { - let their_protocols = their_protocols.to_slices(); - - if their_protocols - .iter() - .any(|protocol| protocol.is_empty()) - { - return Err(Error::PeerMisbehavedError( - "client offered empty ALPN protocol".to_string(), - )); - } - - cx.common.alpn_protocol = our_protocols - .iter() - .find(|protocol| their_protocols.contains(&protocol.as_slice())) - .cloned(); - if let Some(ref selected_protocol) = cx.common.alpn_protocol { - debug!("Chosen ALPN protocol {:?}", selected_protocol); - self.exts - .push(ServerExtension::make_alpn(&[selected_protocol])); - } else if !our_protocols.is_empty() { - cx.common - .send_fatal_alert(AlertDescription::NoApplicationProtocol); - return Err(Error::NoApplicationProtocol); - } - } - - #[cfg(feature = "quic")] - { - if cx.common.is_quic() { - // QUIC has strict ALPN, unlike TLS's more backwards-compatible behavior. RFC 9001 - // says: "The server MUST treat the inability to select a compatible application - // protocol as a connection error of type 0x0178". We judge that ALPN was desired - // (rather than some out-of-band protocol negotiation mechanism) iff any ALPN - // protocols were configured locally or offered by the client. This helps prevent - // successful establishment of connections between peers that can't understand - // each other. - if cx.common.alpn_protocol.is_none() - && (!our_protocols.is_empty() || maybe_their_protocols.is_some()) - { - cx.common - .send_fatal_alert(AlertDescription::NoApplicationProtocol); - return Err(Error::NoApplicationProtocol); - } - - match hello.get_quic_params_extension() { - Some(params) => cx.common.quic.params = Some(params), - None => { - return Err(cx - .common - .missing_extension("QUIC transport parameters not found")); - } - } - } - } - - let for_resume = resumedata.is_some(); - // SNI - if !for_resume && hello.get_sni_extension().is_some() { - self.exts - .push(ServerExtension::ServerNameAck); - } - - // Send status_request response if we have one. This is not allowed - // if we're resuming, and is only triggered if we have an OCSP response - // to send. - if !for_resume - && hello - .find_extension(ExtensionType::StatusRequest) - .is_some() - { - if ocsp_response.is_some() && !cx.common.is_tls13() { - // Only TLS1.2 sends confirmation in ServerHello - self.exts - .push(ServerExtension::CertificateStatusAck); - } - } else { - // Throw away any OCSP response so we don't try to send it later. - ocsp_response.take(); - } - - if !for_resume - && hello - .find_extension(ExtensionType::SCT) - .is_some() - { - if !cx.common.is_tls13() { - // Take the SCT list, if any, so we don't send it later, - // and put it in the legacy extension. - if let Some(sct_list) = sct_list.take() { - self.exts - .push(ServerExtension::make_sct(sct_list.to_vec())); - } - } - } else { - // Throw away any SCT list so we don't send it later. - sct_list.take(); - } - - self.exts.extend(extra_exts); - - Ok(()) - } - - #[cfg(feature = "tls12")] - pub(super) fn process_tls12( - &mut self, - config: &ServerConfig, - hello: &ClientHelloPayload, - using_ems: bool, - ) { - // Renegotiation. - // (We don't do reneg at all, but would support the secure version if we did.) - let secure_reneg_offered = hello - .find_extension(ExtensionType::RenegotiationInfo) - .is_some() - || hello - .cipher_suites - .contains(&CipherSuite::TLS_EMPTY_RENEGOTIATION_INFO_SCSV); - - if secure_reneg_offered { - self.exts - .push(ServerExtension::make_empty_renegotiation_info()); - } - - // Tickets: - // If we get any SessionTicket extension and have tickets enabled, - // we send an ack. - if hello - .find_extension(ExtensionType::SessionTicket) - .is_some() - && config.ticketer.enabled() - { - self.send_ticket = true; - self.exts - .push(ServerExtension::SessionTicketAck); - } - - // Confirm use of EMS if offered. - if using_ems { - self.exts - .push(ServerExtension::ExtendedMasterSecretAck); - } - } -} - -pub(super) struct ExpectClientHello { - pub(super) config: Arc, - pub(super) extra_exts: Vec, - pub(super) transcript: HandshakeHashOrBuffer, - #[cfg(feature = "tls12")] - pub(super) session_id: SessionID, - #[cfg(feature = "tls12")] - pub(super) using_ems: bool, - pub(super) done_retry: bool, - pub(super) send_ticket: bool, -} - -impl ExpectClientHello { - pub(super) fn new(config: Arc, extra_exts: Vec) -> Self { - let mut transcript_buffer = HandshakeHashBuffer::new(); - - if config.verifier.offer_client_auth() { - transcript_buffer.set_client_auth_enabled(); - } - - Self { - config, - extra_exts, - transcript: HandshakeHashOrBuffer::Buffer(transcript_buffer), - #[cfg(feature = "tls12")] - session_id: SessionID::empty(), - #[cfg(feature = "tls12")] - using_ems: false, - done_retry: false, - send_ticket: false, - } - } - - /// Continues handling of a `ClientHello` message once config and certificate are available. - pub(super) fn with_certified_key( - self, - mut sig_schemes: Vec, - client_hello: &ClientHelloPayload, - m: &Message, - cx: &mut ServerContext<'_>, - ) -> NextStateOrError { - let tls13_enabled = self - .config - .supports_version(ProtocolVersion::TLSv1_3); - let tls12_enabled = self - .config - .supports_version(ProtocolVersion::TLSv1_2); - - // Are we doing TLS1.3? - let maybe_versions_ext = client_hello.get_versions_extension(); - let version = if let Some(versions) = maybe_versions_ext { - if versions.contains(&ProtocolVersion::TLSv1_3) && tls13_enabled { - ProtocolVersion::TLSv1_3 - } else if !versions.contains(&ProtocolVersion::TLSv1_2) || !tls12_enabled { - return Err(bad_version(cx.common, "TLS1.2 not offered/enabled")); - } else if cx.common.is_quic() { - return Err(bad_version( - cx.common, - "Expecting QUIC connection, but client does not support TLSv1_3", - )); - } else { - ProtocolVersion::TLSv1_2 - } - } else if client_hello.client_version.get_u16() < ProtocolVersion::TLSv1_2.get_u16() { - return Err(bad_version(cx.common, "Client does not support TLSv1_2")); - } else if !tls12_enabled && tls13_enabled { - return Err(bad_version( - cx.common, - "Server requires TLS1.3, but client omitted versions ext", - )); - } else if cx.common.is_quic() { - return Err(bad_version( - cx.common, - "Expecting QUIC connection, but client does not support TLSv1_3", - )); - } else { - ProtocolVersion::TLSv1_2 - }; - - cx.common.negotiated_version = Some(version); - - // We communicate to the upper layer what kind of key they should choose - // via the sigschemes value. Clients tend to treat this extension - // orthogonally to offered ciphersuites (even though, in TLS1.2 it is not). - // So: reduce the offered sigschemes to those compatible with the - // intersection of ciphersuites. - let client_suites = self - .config - .cipher_suites - .iter() - .copied() - .filter(|scs| { - client_hello - .cipher_suites - .contains(&scs.suite()) - }) - .collect::>(); - - sig_schemes - .retain(|scheme| suites::compatible_sigscheme_for_suites(*scheme, &client_suites)); - - // Choose a certificate. - let certkey = { - let client_hello = ClientHello::new( - &cx.data.sni, - &sig_schemes, - client_hello.get_alpn_extension(), - &client_hello.cipher_suites, - ); - - let certkey = self - .config - .cert_resolver - .resolve(client_hello); - - certkey.ok_or_else(|| { - cx.common - .send_fatal_alert(AlertDescription::AccessDenied); - Error::General("no server certificate chain resolved".to_string()) - })? - }; - let certkey = ActiveCertifiedKey::from_certified_key(&certkey); - - // Reduce our supported ciphersuites by the certificate. - // (no-op for TLS1.3) - let suitable_suites = - suites::reduce_given_sigalg(&self.config.cipher_suites, certkey.get_key().algorithm()); - - // And version - let suitable_suites = suites::reduce_given_version(&suitable_suites, version); - - let suite = if self.config.ignore_client_order { - suites::choose_ciphersuite_preferring_server( - &client_hello.cipher_suites, - &suitable_suites, - ) - } else { - suites::choose_ciphersuite_preferring_client( - &client_hello.cipher_suites, - &suitable_suites, - ) - } - .ok_or_else(|| incompatible(cx.common, "no ciphersuites in common"))?; - - debug!("decided upon suite {:?}", suite); - cx.common.suite = Some(suite); - - // Start handshake hash. - let starting_hash = suite.hash_algorithm(); - let transcript = match self.transcript { - HandshakeHashOrBuffer::Buffer(inner) => inner.start_hash(starting_hash), - HandshakeHashOrBuffer::Hash(inner) if inner.algorithm() == starting_hash => inner, - _ => { - return Err(cx - .common - .illegal_param("hash differed on retry")); - } - }; - - // Save their Random. - let randoms = ConnectionRandoms::new(client_hello.random, Random::new()?); - match suite { - SupportedCipherSuite::Tls13(suite) => tls13::CompleteClientHelloHandling { - config: self.config, - transcript, - suite, - randoms, - done_retry: self.done_retry, - send_ticket: self.send_ticket, - extra_exts: self.extra_exts, - } - .handle_client_hello(cx, certkey, m, client_hello, sig_schemes), - #[cfg(feature = "tls12")] - SupportedCipherSuite::Tls12(suite) => tls12::CompleteClientHelloHandling { - config: self.config, - transcript, - session_id: self.session_id, - suite, - using_ems: self.using_ems, - randoms, - send_ticket: self.send_ticket, - extra_exts: self.extra_exts, - } - .handle_client_hello( - cx, - certkey, - m, - client_hello, - sig_schemes, - tls13_enabled, - ), - } - } -} - -impl State for ExpectClientHello { - fn handle(self: Box, cx: &mut ServerContext<'_>, m: Message) -> NextStateOrError { - let (client_hello, sig_schemes) = - process_client_hello(&m, self.done_retry, cx.common, cx.data)?; - self.with_certified_key(sig_schemes, client_hello, &m, cx) - } -} - -/// Configuration-independent validation of a `ClientHello` message. -/// -/// This represents the first part of the `ClientHello` handling, where we do all validation that -/// doesn't depend on a `ServerConfig` being available and extract everything needed to build a -/// [`ClientHello`] value for a [`ResolvesServerConfig`]/`ResolvesServerCert`]. -/// -/// Note that this will modify `data.sni` even if config or certificate resolution fail. -pub(super) fn process_client_hello<'a>( - m: &'a Message, - done_retry: bool, - common: &mut CommonState, - data: &mut ServerConnectionData, -) -> Result<(&'a ClientHelloPayload, Vec), Error> { - let client_hello = - require_handshake_msg!(m, HandshakeType::ClientHello, HandshakePayload::ClientHello)?; - trace!("we got a clienthello {:?}", client_hello); - - if !client_hello - .compression_methods - .contains(&Compression::Null) - { - common.send_fatal_alert(AlertDescription::IllegalParameter); - return Err(Error::PeerIncompatibleError( - "client did not offer Null compression".to_string(), - )); - } - - if client_hello.has_duplicate_extension() { - return Err(decode_error(common, "client sent duplicate extensions")); - } - - // No handshake messages should follow this one in this flight. - common.check_aligned_handshake()?; - - // Extract and validate the SNI DNS name, if any, before giving it to - // the cert resolver. In particular, if it is invalid then we should - // send an Illegal Parameter alert instead of the Internal Error alert - // (or whatever) that we'd send if this were checked later or in a - // different way. - let sni: Option = match client_hello.get_sni_extension() { - Some(sni) => { - if sni.has_duplicate_names_for_type() { - return Err(decode_error( - common, - "ClientHello SNI contains duplicate name types", - )); - } - - if let Some(hostname) = sni.get_single_hostname() { - Some(hostname.into()) - } else { - return Err(common.illegal_param("ClientHello SNI did not contain a hostname")); - } - } - None => None, - }; - - // save only the first SNI - if let (Some(sni), false) = (&sni, done_retry) { - // Save the SNI into the session. - // The SNI hostname is immutable once set. - assert!(data.sni.is_none()); - data.sni = Some(sni.clone()) - } else if data.sni != sni { - return Err(Error::PeerIncompatibleError( - "SNI differed on retry".to_string(), - )); - } - - let sig_schemes = client_hello - .get_sigalgs_extension() - .ok_or_else(|| incompatible(common, "client didn't describe signature schemes"))? - .clone(); - - Ok((client_hello, sig_schemes)) -} - -#[allow(clippy::large_enum_variant)] -pub(crate) enum HandshakeHashOrBuffer { - Buffer(HandshakeHashBuffer), - Hash(HandshakeHash), -} diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/src/server/server_conn.rs temporalio-1.3.0/vendor/rustls-0.20.9/src/server/server_conn.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/src/server/server_conn.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/src/server/server_conn.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,849 +0,0 @@ -use crate::builder::{ConfigBuilder, WantsCipherSuites}; -use crate::conn::{CommonState, ConnectionCommon, Side, State}; -use crate::enums::{CipherSuite, ProtocolVersion, SignatureScheme}; -use crate::error::Error; -use crate::kx::SupportedKxGroup; -#[cfg(feature = "logging")] -use crate::log::trace; -use crate::msgs::base::{Payload, PayloadU8}; -#[cfg(feature = "quic")] -use crate::msgs::enums::AlertDescription; -use crate::msgs::handshake::{ClientHelloPayload, ServerExtension}; -use crate::msgs::message::Message; -use crate::sign; -use crate::suites::SupportedCipherSuite; -use crate::vecbuf::ChunkVecBuffer; -use crate::verify; -#[cfg(feature = "secret_extraction")] -use crate::ExtractedSecrets; -use crate::KeyLog; -#[cfg(feature = "quic")] -use crate::{conn::Protocol, quic}; - -use super::hs; - -use std::marker::PhantomData; -use std::ops::{Deref, DerefMut}; -use std::sync::Arc; -use std::{fmt, io}; - -/// A trait for the ability to store server session data. -/// -/// The keys and values are opaque. -/// -/// Both the keys and values should be treated as -/// **highly sensitive data**, containing enough key material -/// to break all security of the corresponding sessions. -/// -/// Implementations can be lossy (in other words, forgetting -/// key/value pairs) without any negative security consequences. -/// -/// However, note that `take` **must** reliably delete a returned -/// value. If it does not, there may be security consequences. -/// -/// `put` and `take` are mutating operations; this isn't expressed -/// in the type system to allow implementations freedom in -/// how to achieve interior mutability. `Mutex` is a common -/// choice. -pub trait StoresServerSessions: Send + Sync { - /// Store session secrets encoded in `value` against `key`, - /// overwrites any existing value against `key`. Returns `true` - /// if the value was stored. - fn put(&self, key: Vec, value: Vec) -> bool; - - /// Find a value with the given `key`. Return it, or None - /// if it doesn't exist. - fn get(&self, key: &[u8]) -> Option>; - - /// Find a value with the given `key`. Return it and delete it; - /// or None if it doesn't exist. - fn take(&self, key: &[u8]) -> Option>; - - /// Whether the store can cache another session. This is used to indicate to clients - /// whether their session can be resumed; the implementation is not required to remember - /// a session even if it returns `true` here. - fn can_cache(&self) -> bool; -} - -/// A trait for the ability to encrypt and decrypt tickets. -pub trait ProducesTickets: Send + Sync { - /// Returns true if this implementation will encrypt/decrypt - /// tickets. Should return false if this is a dummy - /// implementation: the server will not send the SessionTicket - /// extension and will not call the other functions. - fn enabled(&self) -> bool; - - /// Returns the lifetime in seconds of tickets produced now. - /// The lifetime is provided as a hint to clients that the - /// ticket will not be useful after the given time. - /// - /// This lifetime must be implemented by key rolling and - /// erasure, *not* by storing a lifetime in the ticket. - /// - /// The objective is to limit damage to forward secrecy caused - /// by tickets, not just limiting their lifetime. - fn lifetime(&self) -> u32; - - /// Encrypt and authenticate `plain`, returning the resulting - /// ticket. Return None if `plain` cannot be encrypted for - /// some reason: an empty ticket will be sent and the connection - /// will continue. - fn encrypt(&self, plain: &[u8]) -> Option>; - - /// Decrypt `cipher`, validating its authenticity protection - /// and recovering the plaintext. `cipher` is fully attacker - /// controlled, so this decryption must be side-channel free, - /// panic-proof, and otherwise bullet-proof. If the decryption - /// fails, return None. - fn decrypt(&self, cipher: &[u8]) -> Option>; -} - -/// How to choose a certificate chain and signing key for use -/// in server authentication. -pub trait ResolvesServerCert: Send + Sync { - /// Choose a certificate chain and matching key given simplified - /// ClientHello information. - /// - /// Return `None` to abort the handshake. - fn resolve(&self, client_hello: ClientHello) -> Option>; -} - -/// A struct representing the received Client Hello -pub struct ClientHello<'a> { - server_name: &'a Option, - signature_schemes: &'a [SignatureScheme], - alpn: Option<&'a Vec>, - cipher_suites: &'a [CipherSuite], -} - -impl<'a> ClientHello<'a> { - /// Creates a new ClientHello - pub(super) fn new( - server_name: &'a Option, - signature_schemes: &'a [SignatureScheme], - alpn: Option<&'a Vec>, - cipher_suites: &'a [CipherSuite], - ) -> Self { - trace!("sni {:?}", server_name); - trace!("sig schemes {:?}", signature_schemes); - trace!("alpn protocols {:?}", alpn); - trace!("cipher suites {:?}", cipher_suites); - - ClientHello { - server_name, - signature_schemes, - alpn, - cipher_suites, - } - } - - /// Get the server name indicator. - /// - /// Returns `None` if the client did not supply a SNI. - pub fn server_name(&self) -> Option<&str> { - self.server_name - .as_ref() - .map(>::as_ref) - } - - /// Get the compatible signature schemes. - /// - /// Returns standard-specified default if the client omitted this extension. - pub fn signature_schemes(&self) -> &[SignatureScheme] { - self.signature_schemes - } - - /// Get the ALPN protocol identifiers submitted by the client. - /// - /// Returns `None` if the client did not include an ALPN extension. - /// - /// Application Layer Protocol Negotiation (ALPN) is a TLS extension that lets a client - /// submit a set of identifiers that each a represent an application-layer protocol. - /// The server will then pick its preferred protocol from the set submitted by the client. - /// Each identifier is represented as a byte array, although common values are often ASCII-encoded. - /// See the official RFC-7301 specifications at - /// for more information on ALPN. - /// - /// For example, a HTTP client might specify "http/1.1" and/or "h2". Other well-known values - /// are listed in the at IANA registry at - /// . - /// - /// The server can specify supported ALPN protocols by setting [`ServerConfig::alpn_protocols`]. - /// During the handshake, the server will select the first protocol configured that the client supports. - pub fn alpn(&self) -> Option> { - self.alpn.map(|protocols| { - protocols - .iter() - .map(|proto| proto.0.as_slice()) - }) - } - - /// Get cipher suites. - pub fn cipher_suites(&self) -> &[CipherSuite] { - self.cipher_suites - } -} - -/// Common configuration for a set of server sessions. -/// -/// Making one of these can be expensive, and should be -/// once per process rather than once per connection. -/// -/// These must be created via the [`ServerConfig::builder()`] function. -/// -/// # Defaults -/// -/// * [`ServerConfig::max_fragment_size`]: the default is `None`: TLS packets are not fragmented to a specific size. -/// * [`ServerConfig::session_storage`]: the default stores 256 sessions in memory. -/// * [`ServerConfig::alpn_protocols`]: the default is empty -- no ALPN protocol is negotiated. -/// * [`ServerConfig::key_log`]: key material is not logged. -#[derive(Clone)] -pub struct ServerConfig { - /// List of ciphersuites, in preference order. - pub(super) cipher_suites: Vec, - - /// List of supported key exchange groups. - /// - /// The first is the highest priority: they will be - /// offered to the client in this order. - pub(super) kx_groups: Vec<&'static SupportedKxGroup>, - - /// Ignore the client's ciphersuite order. Instead, - /// choose the top ciphersuite in the server list - /// which is supported by the client. - pub ignore_client_order: bool, - - /// The maximum size of TLS message we'll emit. If None, we don't limit TLS - /// message lengths except to the 2**16 limit specified in the standard. - /// - /// rustls enforces an arbitrary minimum of 32 bytes for this field. - /// Out of range values are reported as errors from ServerConnection::new. - /// - /// Setting this value to the TCP MSS may improve latency for stream-y workloads. - pub max_fragment_size: Option, - - /// How to store client sessions. - pub session_storage: Arc, - - /// How to produce tickets. - pub ticketer: Arc, - - /// How to choose a server cert and key. - pub cert_resolver: Arc, - - /// Protocol names we support, most preferred first. - /// If empty we don't do ALPN at all. - pub alpn_protocols: Vec>, - - /// Supported protocol versions, in no particular order. - /// The default is all supported versions. - pub(super) versions: crate::versions::EnabledVersions, - - /// How to verify client certificates. - pub(super) verifier: Arc, - - /// How to output key material for debugging. The default - /// does nothing. - pub key_log: Arc, - - /// Allows traffic secrets to be extracted after the handshake, - /// e.g. for kTLS setup. - #[cfg(feature = "secret_extraction")] - pub enable_secret_extraction: bool, - - /// Amount of early data to accept for sessions created by - /// this config. Specify 0 to disable early data. The - /// default is 0. - /// - /// Read the early data via [`ServerConnection::early_data`]. - /// - /// The units for this are _both_ plaintext bytes, _and_ ciphertext - /// bytes, depending on whether the server accepts a client's early_data - /// or not. It is therefore recommended to include some slop in - /// this value to account for the unknown amount of ciphertext - /// expansion in the latter case. - pub max_early_data_size: u32, - - /// Whether the server should send "0.5RTT" data. This means the server - /// sends data after its first flight of handshake messages, without - /// waiting for the client to complete the handshake. - /// - /// This can improve TTFB latency for either server-speaks-first protocols, - /// or client-speaks-first protocols when paired with "0RTT" data. This - /// comes at the cost of a subtle weakening of the normal handshake - /// integrity guarantees that TLS provides. Note that the initial - /// `ClientHello` is indirectly authenticated because it is included - /// in the transcript used to derive the keys used to encrypt the data. - /// - /// This only applies to TLS1.3 connections. TLS1.2 connections cannot - /// do this optimisation and this setting is ignored for them. It is - /// also ignored for TLS1.3 connections that even attempt client - /// authentication. - /// - /// This defaults to false. This means the first application data - /// sent by the server comes after receiving and validating the client's - /// handshake up to the `Finished` message. This is the safest option. - pub send_half_rtt_data: bool, -} - -impl fmt::Debug for ServerConfig { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("ServerConfig") - .field("ignore_client_order", &self.ignore_client_order) - .field("max_fragment_size", &self.max_fragment_size) - .field("alpn_protocols", &self.alpn_protocols) - .field("max_early_data_size", &self.max_early_data_size) - .field("send_half_rtt_data", &self.send_half_rtt_data) - .finish_non_exhaustive() - } -} - -impl ServerConfig { - /// Create builder to build up the server configuration. - /// - /// For more information, see the [`ConfigBuilder`] documentation. - pub fn builder() -> ConfigBuilder { - ConfigBuilder { - state: WantsCipherSuites(()), - side: PhantomData, - } - } - - #[doc(hidden)] - /// We support a given TLS version if it's quoted in the configured - /// versions *and* at least one ciphersuite for this version is - /// also configured. - pub fn supports_version(&self, v: ProtocolVersion) -> bool { - self.versions.contains(v) - && self - .cipher_suites - .iter() - .any(|cs| cs.version().version == v) - } -} - -/// Allows reading of early data in resumed TLS1.3 connections. -/// -/// "Early data" is also known as "0-RTT data". -/// -/// This structure implements [`std::io::Read`]. -pub struct ReadEarlyData<'a> { - early_data: &'a mut EarlyDataState, -} - -impl<'a> ReadEarlyData<'a> { - fn new(early_data: &'a mut EarlyDataState) -> Self { - ReadEarlyData { early_data } - } -} - -impl<'a> std::io::Read for ReadEarlyData<'a> { - fn read(&mut self, buf: &mut [u8]) -> io::Result { - self.early_data.read(buf) - } - - #[cfg(read_buf)] - fn read_buf(&mut self, cursor: io::BorrowedCursor<'_>) -> io::Result<()> { - self.early_data.read_buf(cursor) - } -} - -/// This represents a single TLS server connection. -/// -/// Send TLS-protected data to the peer using the `io::Write` trait implementation. -/// Read data from the peer using the `io::Read` trait implementation. -pub struct ServerConnection { - inner: ConnectionCommon, -} - -impl ServerConnection { - /// Make a new ServerConnection. `config` controls how - /// we behave in the TLS protocol. - pub fn new(config: Arc) -> Result { - Self::from_config(config, vec![]) - } - - fn from_config( - config: Arc, - extra_exts: Vec, - ) -> Result { - let mut common = CommonState::new(Side::Server); - common.set_max_fragment_size(config.max_fragment_size)?; - #[cfg(feature = "secret_extraction")] - { - common.enable_secret_extraction = config.enable_secret_extraction; - } - Ok(Self { - inner: ConnectionCommon::new( - Box::new(hs::ExpectClientHello::new(config, extra_exts)), - ServerConnectionData::default(), - common, - ), - }) - } - - /// Retrieves the SNI hostname, if any, used to select the certificate and - /// private key. - /// - /// This returns `None` until some time after the client's SNI extension - /// value is processed during the handshake. It will never be `None` when - /// the connection is ready to send or process application data, unless the - /// client does not support SNI. - /// - /// This is useful for application protocols that need to enforce that the - /// SNI hostname matches an application layer protocol hostname. For - /// example, HTTP/1.1 servers commonly expect the `Host:` header field of - /// every request on a connection to match the hostname in the SNI extension - /// when the client provides the SNI extension. - /// - /// The SNI hostname is also used to match sessions during session - /// resumption. - pub fn sni_hostname(&self) -> Option<&str> { - self.inner.data.get_sni_str() - } - - /// Application-controlled portion of the resumption ticket supplied by the client, if any. - /// - /// Recovered from the prior session's `set_resumption_data`. Integrity is guaranteed by rustls. - /// - /// Returns `Some` iff a valid resumption ticket has been received from the client. - pub fn received_resumption_data(&self) -> Option<&[u8]> { - self.inner - .data - .received_resumption_data - .as_ref() - .map(|x| &x[..]) - } - - /// Set the resumption data to embed in future resumption tickets supplied to the client. - /// - /// Defaults to the empty byte string. Must be less than 2^15 bytes to allow room for other - /// data. Should be called while `is_handshaking` returns true to ensure all transmitted - /// resumption tickets are affected. - /// - /// Integrity will be assured by rustls, but the data will be visible to the client. If secrecy - /// from the client is desired, encrypt the data separately. - pub fn set_resumption_data(&mut self, data: &[u8]) { - assert!(data.len() < 2usize.pow(15)); - self.inner.data.resumption_data = data.into(); - } - - /// Explicitly discard early data, notifying the client - /// - /// Useful if invariants encoded in `received_resumption_data()` cannot be respected. - /// - /// Must be called while `is_handshaking` is true. - pub fn reject_early_data(&mut self) { - assert!( - self.is_handshaking(), - "cannot retroactively reject early data" - ); - self.inner.data.early_data.reject(); - } - - /// Returns an `io::Read` implementer you can read bytes from that are - /// received from a client as TLS1.3 0RTT/"early" data, during the handshake. - /// - /// This returns `None` in many circumstances, such as : - /// - /// - Early data is disabled if [`ServerConfig::max_early_data_size`] is zero (the default). - /// - The session negotiated with the client is not TLS1.3. - /// - The client just doesn't support early data. - /// - The connection doesn't resume an existing session. - /// - The client hasn't sent a full ClientHello yet. - pub fn early_data(&mut self) -> Option { - if self - .inner - .data - .early_data - .was_accepted() - { - Some(ReadEarlyData::new(&mut self.inner.data.early_data)) - } else { - None - } - } - - /// Extract secrets, so they can be used when configuring kTLS, for example. - #[cfg(feature = "secret_extraction")] - pub fn extract_secrets(self) -> Result { - self.inner.extract_secrets() - } -} - -impl fmt::Debug for ServerConnection { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("ServerConnection") - .finish() - } -} - -impl Deref for ServerConnection { - type Target = ConnectionCommon; - - fn deref(&self) -> &Self::Target { - &self.inner - } -} - -impl DerefMut for ServerConnection { - fn deref_mut(&mut self) -> &mut Self::Target { - &mut self.inner - } -} - -impl From for crate::Connection { - fn from(conn: ServerConnection) -> Self { - Self::Server(conn) - } -} - -/// Handle on a server-side connection before configuration is available. -/// -/// The `Acceptor` allows the caller to provide a [`ServerConfig`] based on the [`ClientHello`] of -/// the incoming connection. -pub struct Acceptor { - inner: Option>, -} - -impl Default for Acceptor { - fn default() -> Self { - Self { - inner: Some(ConnectionCommon::new( - Box::new(Accepting), - ServerConnectionData::default(), - CommonState::new(Side::Server), - )), - } - } -} - -impl Acceptor { - /// Create a new `Acceptor`. - #[deprecated( - since = "0.20.7", - note = "Use Acceptor::default instead for an infallible constructor" - )] - pub fn new() -> Result { - Ok(Self::default()) - } - - /// Returns true if the caller should call [`Connection::read_tls()`] as soon as possible. - /// - /// Since the purpose of an Acceptor is to read and then parse TLS bytes, this always returns true. - /// - /// [`Connection::read_tls()`]: crate::Connection::read_tls - #[deprecated(since = "0.20.7", note = "Always returns true")] - pub fn wants_read(&self) -> bool { - self.inner - .as_ref() - .map(|conn| conn.common_state.wants_read()) - .unwrap_or(false) - } - - /// Read TLS content from `rd`. - /// - /// Returns an error if this `Acceptor` has already yielded an [`Accepted`]. For more details, - /// refer to [`Connection::read_tls()`]. - /// - /// [`Connection::read_tls()`]: crate::Connection::read_tls - pub fn read_tls(&mut self, rd: &mut dyn io::Read) -> Result { - match &mut self.inner { - Some(conn) => conn.read_tls(rd), - None => Err(io::Error::new( - io::ErrorKind::Other, - "acceptor cannot read after successful acceptance", - )), - } - } - - /// Check if a `ClientHello` message has been received. - /// - /// Returns `Ok(None)` if the complete `ClientHello` has not yet been received. - /// Do more I/O and then call this function again. - /// - /// Returns `Ok(Some(accepted))` if the connection has been accepted. Call - /// `accepted.into_connection()` to continue. Do not call this function again. - /// - /// Returns `Err(err)` if an error occurred. Do not call this function again. - pub fn accept(&mut self) -> Result, Error> { - let mut connection = match self.inner.take() { - Some(conn) => conn, - None => { - return Err(Error::General("Acceptor polled after completion".into())); - } - }; - - let message = match connection.first_handshake_message()? { - Some(msg) => msg, - None => { - self.inner = Some(connection); - return Ok(None); - } - }; - - let (_, sig_schemes) = hs::process_client_hello( - &message, - false, - &mut connection.common_state, - &mut connection.data, - )?; - - Ok(Some(Accepted { - connection, - message, - sig_schemes, - })) - } -} - -/// Represents a `ClientHello` message received through the [`Acceptor`]. -/// -/// Contains the state required to resume the connection through [`Accepted::into_connection()`]. -pub struct Accepted { - connection: ConnectionCommon, - message: Message, - sig_schemes: Vec, -} - -impl Accepted { - /// Get the [`ClientHello`] for this connection. - pub fn client_hello(&self) -> ClientHello<'_> { - let payload = Self::client_hello_payload(&self.message); - ClientHello::new( - &self.connection.data.sni, - &self.sig_schemes, - payload.get_alpn_extension(), - &payload.cipher_suites, - ) - } - - /// Convert the [`Accepted`] into a [`ServerConnection`]. - /// - /// Takes the state returned from [`Acceptor::accept()`] as well as the [`ServerConfig`] and - /// [`sign::CertifiedKey`] that should be used for the session. Returns an error if - /// configuration-dependent validation of the received `ClientHello` message fails. - pub fn into_connection(mut self, config: Arc) -> Result { - self.connection - .common_state - .set_max_fragment_size(config.max_fragment_size)?; - - #[cfg(feature = "secret_extraction")] - { - self.connection - .common_state - .enable_secret_extraction = config.enable_secret_extraction; - } - - let state = hs::ExpectClientHello::new(config, Vec::new()); - let mut cx = hs::ServerContext { - common: &mut self.connection.common_state, - data: &mut self.connection.data, - }; - - let new = state.with_certified_key( - self.sig_schemes, - Self::client_hello_payload(&self.message), - &self.message, - &mut cx, - )?; - - self.connection.replace_state(new); - Ok(ServerConnection { - inner: self.connection, - }) - } - - fn client_hello_payload(message: &Message) -> &ClientHelloPayload { - match &message.payload { - crate::msgs::message::MessagePayload::Handshake { parsed, .. } => match &parsed.payload - { - crate::msgs::handshake::HandshakePayload::ClientHello(ch) => ch, - _ => unreachable!(), - }, - _ => unreachable!(), - } - } -} - -struct Accepting; - -impl State for Accepting { - fn handle( - self: Box, - _cx: &mut hs::ServerContext<'_>, - _m: Message, - ) -> Result>, Error> { - Err(Error::General("unreachable state".into())) - } -} - -pub(super) enum EarlyDataState { - New, - Accepted(ChunkVecBuffer), - Rejected, -} - -impl Default for EarlyDataState { - fn default() -> Self { - Self::New - } -} - -impl EarlyDataState { - pub(super) fn reject(&mut self) { - *self = Self::Rejected; - } - - pub(super) fn accept(&mut self, max_size: usize) { - *self = Self::Accepted(ChunkVecBuffer::new(Some(max_size))); - } - - fn was_accepted(&self) -> bool { - matches!(self, Self::Accepted(_)) - } - - pub(super) fn was_rejected(&self) -> bool { - matches!(self, Self::Rejected) - } - - fn read(&mut self, buf: &mut [u8]) -> io::Result { - match self { - Self::Accepted(ref mut received) => received.read(buf), - _ => Err(io::Error::from(io::ErrorKind::BrokenPipe)), - } - } - - #[cfg(read_buf)] - fn read_buf(&mut self, cursor: io::BorrowedCursor<'_>) -> io::Result<()> { - match self { - Self::Accepted(ref mut received) => received.read_buf(cursor), - _ => Err(io::Error::from(io::ErrorKind::BrokenPipe)), - } - } - - pub(super) fn take_received_plaintext(&mut self, bytes: Payload) -> bool { - let available = bytes.0.len(); - match self { - Self::Accepted(ref mut received) if received.apply_limit(available) == available => { - received.append(bytes.0); - true - } - _ => false, - } - } -} - -// these branches not reachable externally, unless something else goes wrong. -#[test] -fn test_read_in_new_state() { - assert_eq!( - format!("{:?}", EarlyDataState::default().read(&mut [0u8; 5])), - "Err(Kind(BrokenPipe))" - ); -} - -#[cfg(read_buf)] -#[test] -fn test_read_buf_in_new_state() { - use std::io::BorrowedBuf; - - let mut buf = [0u8; 5]; - let mut buf: BorrowedBuf<'_> = buf.as_mut_slice().into(); - assert_eq!( - format!("{:?}", EarlyDataState::default().read_buf(buf.unfilled())), - "Err(Kind(BrokenPipe))" - ); -} - -/// State associated with a server connection. -#[derive(Default)] -pub struct ServerConnectionData { - pub(super) sni: Option, - pub(super) received_resumption_data: Option>, - pub(super) resumption_data: Vec, - pub(super) early_data: EarlyDataState, -} - -impl ServerConnectionData { - pub(super) fn get_sni_str(&self) -> Option<&str> { - self.sni.as_ref().map(AsRef::as_ref) - } -} - -impl crate::conn::SideData for ServerConnectionData {} - -#[cfg(feature = "quic")] -impl quic::QuicExt for ServerConnection { - fn quic_transport_parameters(&self) -> Option<&[u8]> { - self.inner - .common_state - .quic - .params - .as_ref() - .map(|v| v.as_ref()) - } - - fn zero_rtt_keys(&self) -> Option { - Some(quic::DirectionalKeys::new( - self.inner - .common_state - .suite - .and_then(|suite| suite.tls13())?, - self.inner - .common_state - .quic - .early_secret - .as_ref()?, - )) - } - - fn read_hs(&mut self, plaintext: &[u8]) -> Result<(), Error> { - self.inner.read_quic_hs(plaintext) - } - - fn write_hs(&mut self, buf: &mut Vec) -> Option { - quic::write_hs(&mut self.inner.common_state, buf) - } - - fn alert(&self) -> Option { - self.inner.common_state.quic.alert - } -} - -/// Methods specific to QUIC server sessions -#[cfg(feature = "quic")] -#[cfg_attr(docsrs, doc(cfg(feature = "quic")))] -pub trait ServerQuicExt { - /// Make a new QUIC ServerConnection. This differs from `ServerConnection::new()` - /// in that it takes an extra argument, `params`, which contains the - /// TLS-encoded transport parameters to send. - fn new_quic( - config: Arc, - quic_version: quic::Version, - params: Vec, - ) -> Result { - if !config.supports_version(ProtocolVersion::TLSv1_3) { - return Err(Error::General( - "TLS 1.3 support is required for QUIC".into(), - )); - } - - if config.max_early_data_size != 0 && config.max_early_data_size != 0xffff_ffff { - return Err(Error::General( - "QUIC sessions must set a max early data of 0 or 2^32-1".into(), - )); - } - - let ext = match quic_version { - quic::Version::V1Draft => ServerExtension::TransportParametersDraft(params), - quic::Version::V1 => ServerExtension::TransportParameters(params), - }; - let mut new = ServerConnection::from_config(config, vec![ext])?; - new.inner.common_state.protocol = Protocol::Quic; - Ok(new) - } -} - -#[cfg(feature = "quic")] -impl ServerQuicExt for ServerConnection {} diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/src/server/tls12.rs temporalio-1.3.0/vendor/rustls-0.20.9/src/server/tls12.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/src/server/tls12.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/src/server/tls12.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,941 +0,0 @@ -use crate::check::inappropriate_message; -use crate::conn::{CommonState, ConnectionRandoms, Side, State}; -use crate::enums::ProtocolVersion; -use crate::error::Error; -use crate::hash_hs::HandshakeHash; -use crate::key::Certificate; -#[cfg(feature = "logging")] -use crate::log::{debug, trace}; -use crate::msgs::base::Payload; -use crate::msgs::ccs::ChangeCipherSpecPayload; -use crate::msgs::codec::Codec; -use crate::msgs::enums::{AlertDescription, ContentType, HandshakeType}; -use crate::msgs::handshake::{ClientECDHParams, HandshakeMessagePayload, HandshakePayload}; -use crate::msgs::handshake::{NewSessionTicketPayload, SessionID}; -use crate::msgs::message::{Message, MessagePayload}; -use crate::msgs::persist; -#[cfg(feature = "secret_extraction")] -use crate::suites::PartiallyExtractedSecrets; -use crate::tls12::{self, ConnectionSecrets, Tls12CipherSuite}; -use crate::{kx, ticketer, verify}; - -use super::common::ActiveCertifiedKey; -use super::hs::{self, ServerContext}; -use super::server_conn::{ProducesTickets, ServerConfig, ServerConnectionData}; - -use ring::constant_time; - -use std::sync::Arc; - -pub(super) use client_hello::CompleteClientHelloHandling; - -mod client_hello { - use crate::enums::SignatureScheme; - use crate::msgs::enums::ECPointFormat; - use crate::msgs::enums::{ClientCertificateType, Compression}; - use crate::msgs::handshake::{CertificateRequestPayload, ClientSessionTicket, Random}; - use crate::msgs::handshake::{ - CertificateStatus, DigitallySignedStruct, ECDHEServerKeyExchange, - }; - use crate::msgs::handshake::{ClientExtension, SessionID}; - use crate::msgs::handshake::{ClientHelloPayload, ServerHelloPayload}; - use crate::msgs::handshake::{ECPointFormatList, ServerECDHParams, SupportedPointFormats}; - use crate::msgs::handshake::{ServerExtension, ServerKeyExchangePayload}; - use crate::sign; - - use super::*; - - pub(in crate::server) struct CompleteClientHelloHandling { - pub(in crate::server) config: Arc, - pub(in crate::server) transcript: HandshakeHash, - pub(in crate::server) session_id: SessionID, - pub(in crate::server) suite: &'static Tls12CipherSuite, - pub(in crate::server) using_ems: bool, - pub(in crate::server) randoms: ConnectionRandoms, - pub(in crate::server) send_ticket: bool, - pub(in crate::server) extra_exts: Vec, - } - - impl CompleteClientHelloHandling { - pub(in crate::server) fn handle_client_hello( - mut self, - cx: &mut ServerContext<'_>, - server_key: ActiveCertifiedKey, - chm: &Message, - client_hello: &ClientHelloPayload, - sigschemes_ext: Vec, - tls13_enabled: bool, - ) -> hs::NextStateOrError { - // -- TLS1.2 only from hereon in -- - self.transcript.add_message(chm); - - if client_hello.ems_support_offered() { - self.using_ems = true; - } - - let groups_ext = client_hello - .get_namedgroups_extension() - .ok_or_else(|| hs::incompatible(cx.common, "client didn't describe groups"))?; - let ecpoints_ext = client_hello - .get_ecpoints_extension() - .ok_or_else(|| hs::incompatible(cx.common, "client didn't describe ec points"))?; - - trace!("namedgroups {:?}", groups_ext); - trace!("ecpoints {:?}", ecpoints_ext); - - if !ecpoints_ext.contains(&ECPointFormat::Uncompressed) { - cx.common - .send_fatal_alert(AlertDescription::IllegalParameter); - return Err(Error::PeerIncompatibleError( - "client didn't support uncompressed ec points".to_string(), - )); - } - - // -- If TLS1.3 is enabled, signal the downgrade in the server random - if tls13_enabled { - self.randoms.server[24..].copy_from_slice(&tls12::DOWNGRADE_SENTINEL); - } - - // -- Check for resumption -- - // We can do this either by (in order of preference): - // 1. receiving a ticket that decrypts - // 2. receiving a sessionid that is in our cache - // - // If we receive a ticket, the sessionid won't be in our - // cache, so don't check. - // - // If either works, we end up with a ServerConnectionValue - // which is passed to start_resumption and concludes - // our handling of the ClientHello. - // - let mut ticket_received = false; - let resume_data = client_hello - .get_ticket_extension() - .and_then(|ticket_ext| match ticket_ext { - ClientExtension::SessionTicket(ClientSessionTicket::Offer(ticket)) => { - Some(ticket) - } - _ => None, - }) - .and_then(|ticket| { - ticket_received = true; - debug!("Ticket received"); - let data = self.config.ticketer.decrypt(&ticket.0); - if data.is_none() { - debug!("Ticket didn't decrypt"); - } - data - }) - .or_else(|| { - // Perhaps resume? If we received a ticket, the sessionid - // does not correspond to a real session. - if client_hello.session_id.is_empty() || ticket_received { - return None; - } - - self.config - .session_storage - .get(&client_hello.session_id.get_encoding()) - }) - .and_then(|x| persist::ServerSessionValue::read_bytes(&x)) - .filter(|resumedata| { - hs::can_resume(self.suite.into(), &cx.data.sni, self.using_ems, resumedata) - }); - - if let Some(data) = resume_data { - return self.start_resumption(cx, client_hello, &client_hello.session_id, data); - } - - // Now we have chosen a ciphersuite, we can make kx decisions. - let sigschemes = self - .suite - .resolve_sig_schemes(&sigschemes_ext); - - if sigschemes.is_empty() { - return Err(hs::incompatible(cx.common, "no overlapping sigschemes")); - } - - let group = self - .config - .kx_groups - .iter() - .find(|skxg| groups_ext.contains(&skxg.name)) - .cloned() - .ok_or_else(|| hs::incompatible(cx.common, "no supported group"))?; - - let ecpoint = ECPointFormatList::supported() - .iter() - .find(|format| ecpoints_ext.contains(format)) - .cloned() - .ok_or_else(|| hs::incompatible(cx.common, "no supported point format"))?; - - debug_assert_eq!(ecpoint, ECPointFormat::Uncompressed); - - let (mut ocsp_response, mut sct_list) = - (server_key.get_ocsp(), server_key.get_sct_list()); - - // If we're not offered a ticket or a potential session ID, allocate a session ID. - if !self.config.session_storage.can_cache() { - self.session_id = SessionID::empty(); - } else if self.session_id.is_empty() && !ticket_received { - self.session_id = SessionID::random()?; - } - - self.send_ticket = emit_server_hello( - &self.config, - &mut self.transcript, - cx, - self.session_id, - self.suite, - self.using_ems, - &mut ocsp_response, - &mut sct_list, - client_hello, - None, - &self.randoms, - self.extra_exts, - )?; - emit_certificate(&mut self.transcript, cx.common, server_key.get_cert()); - if let Some(ocsp_response) = ocsp_response { - emit_cert_status(&mut self.transcript, cx.common, ocsp_response); - } - let server_kx = emit_server_kx( - &mut self.transcript, - cx.common, - sigschemes, - group, - server_key.get_key(), - &self.randoms, - )?; - let doing_client_auth = emit_certificate_req(&self.config, &mut self.transcript, cx)?; - emit_server_hello_done(&mut self.transcript, cx.common); - - if doing_client_auth { - Ok(Box::new(ExpectCertificate { - config: self.config, - transcript: self.transcript, - randoms: self.randoms, - session_id: self.session_id, - suite: self.suite, - using_ems: self.using_ems, - server_kx, - send_ticket: self.send_ticket, - })) - } else { - Ok(Box::new(ExpectClientKx { - config: self.config, - transcript: self.transcript, - randoms: self.randoms, - session_id: self.session_id, - suite: self.suite, - using_ems: self.using_ems, - server_kx, - client_cert: None, - send_ticket: self.send_ticket, - })) - } - } - - fn start_resumption( - mut self, - cx: &mut ServerContext<'_>, - client_hello: &ClientHelloPayload, - id: &SessionID, - resumedata: persist::ServerSessionValue, - ) -> hs::NextStateOrError { - debug!("Resuming connection"); - - if resumedata.extended_ms && !self.using_ems { - return Err(cx - .common - .illegal_param("refusing to resume without ems")); - } - - self.session_id = *id; - self.send_ticket = emit_server_hello( - &self.config, - &mut self.transcript, - cx, - self.session_id, - self.suite, - self.using_ems, - &mut None, - &mut None, - client_hello, - Some(&resumedata), - &self.randoms, - self.extra_exts, - )?; - - let secrets = ConnectionSecrets::new_resume( - self.randoms, - self.suite, - &resumedata.master_secret.0, - ); - self.config.key_log.log( - "CLIENT_RANDOM", - &secrets.randoms.client, - &secrets.master_secret, - ); - cx.common - .start_encryption_tls12(&secrets, Side::Server); - cx.common.peer_certificates = resumedata.client_cert_chain; - - if self.send_ticket { - emit_ticket( - &secrets, - &mut self.transcript, - self.using_ems, - cx, - &*self.config.ticketer, - )?; - } - emit_ccs(cx.common); - cx.common - .record_layer - .start_encrypting(); - emit_finished(&secrets, &mut self.transcript, cx.common); - - Ok(Box::new(ExpectCcs { - config: self.config, - secrets, - transcript: self.transcript, - session_id: self.session_id, - using_ems: self.using_ems, - resuming: true, - send_ticket: self.send_ticket, - })) - } - } - - fn emit_server_hello( - config: &ServerConfig, - transcript: &mut HandshakeHash, - cx: &mut ServerContext<'_>, - session_id: SessionID, - suite: &'static Tls12CipherSuite, - using_ems: bool, - ocsp_response: &mut Option<&[u8]>, - sct_list: &mut Option<&[u8]>, - hello: &ClientHelloPayload, - resumedata: Option<&persist::ServerSessionValue>, - randoms: &ConnectionRandoms, - extra_exts: Vec, - ) -> Result { - let mut ep = hs::ExtensionProcessing::new(); - ep.process_common( - config, - cx, - ocsp_response, - sct_list, - hello, - resumedata, - extra_exts, - )?; - ep.process_tls12(config, hello, using_ems); - - let sh = Message { - version: ProtocolVersion::TLSv1_2, - payload: MessagePayload::handshake(HandshakeMessagePayload { - typ: HandshakeType::ServerHello, - payload: HandshakePayload::ServerHello(ServerHelloPayload { - legacy_version: ProtocolVersion::TLSv1_2, - random: Random::from(randoms.server), - session_id, - cipher_suite: suite.common.suite, - compression_method: Compression::Null, - extensions: ep.exts, - }), - }), - }; - - trace!("sending server hello {:?}", sh); - transcript.add_message(&sh); - cx.common.send_msg(sh, false); - Ok(ep.send_ticket) - } - - fn emit_certificate( - transcript: &mut HandshakeHash, - common: &mut CommonState, - cert_chain: &[Certificate], - ) { - let c = Message { - version: ProtocolVersion::TLSv1_2, - payload: MessagePayload::handshake(HandshakeMessagePayload { - typ: HandshakeType::Certificate, - payload: HandshakePayload::Certificate(cert_chain.to_owned()), - }), - }; - - transcript.add_message(&c); - common.send_msg(c, false); - } - - fn emit_cert_status(transcript: &mut HandshakeHash, common: &mut CommonState, ocsp: &[u8]) { - let st = CertificateStatus::new(ocsp.to_owned()); - - let c = Message { - version: ProtocolVersion::TLSv1_2, - payload: MessagePayload::handshake(HandshakeMessagePayload { - typ: HandshakeType::CertificateStatus, - payload: HandshakePayload::CertificateStatus(st), - }), - }; - - transcript.add_message(&c); - common.send_msg(c, false); - } - - fn emit_server_kx( - transcript: &mut HandshakeHash, - common: &mut CommonState, - sigschemes: Vec, - skxg: &'static kx::SupportedKxGroup, - signing_key: &dyn sign::SigningKey, - randoms: &ConnectionRandoms, - ) -> Result { - let kx = kx::KeyExchange::start(skxg).ok_or(Error::FailedToGetRandomBytes)?; - let secdh = ServerECDHParams::new(skxg.name, kx.pubkey.as_ref()); - - let mut msg = Vec::new(); - msg.extend(randoms.client); - msg.extend(randoms.server); - secdh.encode(&mut msg); - - let signer = signing_key - .choose_scheme(&sigschemes) - .ok_or_else(|| Error::General("incompatible signing key".to_string()))?; - let sigscheme = signer.scheme(); - let sig = signer.sign(&msg)?; - - let skx = ServerKeyExchangePayload::ECDHE(ECDHEServerKeyExchange { - params: secdh, - dss: DigitallySignedStruct::new(sigscheme, sig), - }); - - let m = Message { - version: ProtocolVersion::TLSv1_2, - payload: MessagePayload::handshake(HandshakeMessagePayload { - typ: HandshakeType::ServerKeyExchange, - payload: HandshakePayload::ServerKeyExchange(skx), - }), - }; - - transcript.add_message(&m); - common.send_msg(m, false); - Ok(kx) - } - - fn emit_certificate_req( - config: &ServerConfig, - transcript: &mut HandshakeHash, - cx: &mut ServerContext<'_>, - ) -> Result { - let client_auth = &config.verifier; - - if !client_auth.offer_client_auth() { - return Ok(false); - } - - let verify_schemes = client_auth.supported_verify_schemes(); - - let names = client_auth - .client_auth_root_subjects() - .ok_or_else(|| { - debug!("could not determine root subjects based on SNI"); - cx.common - .send_fatal_alert(AlertDescription::AccessDenied); - Error::General("client rejected by client_auth_root_subjects".into()) - })?; - - let cr = CertificateRequestPayload { - certtypes: vec![ - ClientCertificateType::RSASign, - ClientCertificateType::ECDSASign, - ], - sigschemes: verify_schemes, - canames: names, - }; - - let m = Message { - version: ProtocolVersion::TLSv1_2, - payload: MessagePayload::handshake(HandshakeMessagePayload { - typ: HandshakeType::CertificateRequest, - payload: HandshakePayload::CertificateRequest(cr), - }), - }; - - trace!("Sending CertificateRequest {:?}", m); - transcript.add_message(&m); - cx.common.send_msg(m, false); - Ok(true) - } - - fn emit_server_hello_done(transcript: &mut HandshakeHash, common: &mut CommonState) { - let m = Message { - version: ProtocolVersion::TLSv1_2, - payload: MessagePayload::handshake(HandshakeMessagePayload { - typ: HandshakeType::ServerHelloDone, - payload: HandshakePayload::ServerHelloDone, - }), - }; - - transcript.add_message(&m); - common.send_msg(m, false); - } -} - -// --- Process client's Certificate for client auth --- -struct ExpectCertificate { - config: Arc, - transcript: HandshakeHash, - randoms: ConnectionRandoms, - session_id: SessionID, - suite: &'static Tls12CipherSuite, - using_ems: bool, - server_kx: kx::KeyExchange, - send_ticket: bool, -} - -impl State for ExpectCertificate { - fn handle(mut self: Box, cx: &mut ServerContext<'_>, m: Message) -> hs::NextStateOrError { - self.transcript.add_message(&m); - let cert_chain = require_handshake_msg_move!( - m, - HandshakeType::Certificate, - HandshakePayload::Certificate - )?; - - // If we can't determine if the auth is mandatory, abort - let mandatory = self - .config - .verifier - .client_auth_mandatory() - .ok_or_else(|| { - debug!("could not determine if client auth is mandatory based on SNI"); - cx.common - .send_fatal_alert(AlertDescription::AccessDenied); - Error::General("client rejected by client_auth_mandatory".into()) - })?; - - trace!("certs {:?}", cert_chain); - - let client_cert = match cert_chain.split_first() { - None if mandatory => { - cx.common - .send_fatal_alert(AlertDescription::CertificateRequired); - return Err(Error::NoCertificatesPresented); - } - None => { - debug!("client auth requested but no certificate supplied"); - self.transcript.abandon_client_auth(); - None - } - Some((end_entity, intermediates)) => { - let now = std::time::SystemTime::now(); - self.config - .verifier - .verify_client_cert(end_entity, intermediates, now) - .map_err(|err| { - hs::incompatible(cx.common, "certificate invalid"); - err - })?; - - Some(cert_chain) - } - }; - - Ok(Box::new(ExpectClientKx { - config: self.config, - transcript: self.transcript, - randoms: self.randoms, - session_id: self.session_id, - suite: self.suite, - using_ems: self.using_ems, - server_kx: self.server_kx, - client_cert, - send_ticket: self.send_ticket, - })) - } -} - -// --- Process client's KeyExchange --- -struct ExpectClientKx { - config: Arc, - transcript: HandshakeHash, - randoms: ConnectionRandoms, - session_id: SessionID, - suite: &'static Tls12CipherSuite, - using_ems: bool, - server_kx: kx::KeyExchange, - client_cert: Option>, - send_ticket: bool, -} - -impl State for ExpectClientKx { - fn handle(mut self: Box, cx: &mut ServerContext<'_>, m: Message) -> hs::NextStateOrError { - let client_kx = require_handshake_msg!( - m, - HandshakeType::ClientKeyExchange, - HandshakePayload::ClientKeyExchange - )?; - self.transcript.add_message(&m); - let ems_seed = self - .using_ems - .then(|| self.transcript.get_current_hash()); - - // Complete key agreement, and set up encryption with the - // resulting premaster secret. - let peer_kx_params = - tls12::decode_ecdh_params::(cx.common, &client_kx.0)?; - let secrets = ConnectionSecrets::from_key_exchange( - self.server_kx, - &peer_kx_params.public.0, - ems_seed, - self.randoms, - self.suite, - )?; - - self.config.key_log.log( - "CLIENT_RANDOM", - &secrets.randoms.client, - &secrets.master_secret, - ); - cx.common - .start_encryption_tls12(&secrets, Side::Server); - - if let Some(client_cert) = self.client_cert { - Ok(Box::new(ExpectCertificateVerify { - config: self.config, - secrets, - transcript: self.transcript, - session_id: self.session_id, - using_ems: self.using_ems, - client_cert, - send_ticket: self.send_ticket, - })) - } else { - Ok(Box::new(ExpectCcs { - config: self.config, - secrets, - transcript: self.transcript, - session_id: self.session_id, - using_ems: self.using_ems, - resuming: false, - send_ticket: self.send_ticket, - })) - } - } -} - -// --- Process client's certificate proof --- -struct ExpectCertificateVerify { - config: Arc, - secrets: ConnectionSecrets, - transcript: HandshakeHash, - session_id: SessionID, - using_ems: bool, - client_cert: Vec, - send_ticket: bool, -} - -impl State for ExpectCertificateVerify { - fn handle(mut self: Box, cx: &mut ServerContext<'_>, m: Message) -> hs::NextStateOrError { - let rc = { - let sig = require_handshake_msg!( - m, - HandshakeType::CertificateVerify, - HandshakePayload::CertificateVerify - )?; - - match self.transcript.take_handshake_buf() { - Some(msgs) => { - let certs = &self.client_cert; - self.config - .verifier - .verify_tls12_signature(&msgs, &certs[0], sig) - } - None => { - // This should be unreachable; the handshake buffer was initialized with - // client authentication if the verifier wants to offer it. - // `transcript.abandon_client_auth()` can extract it, but its only caller in - // this flow will also set `ExpectClientKx::client_cert` to `None`, making it - // impossible to reach this state. - cx.common - .send_fatal_alert(AlertDescription::AccessDenied); - Err(Error::General("client authentication not set up".into())) - } - } - }; - - if let Err(e) = rc { - cx.common - .send_fatal_alert(AlertDescription::AccessDenied); - return Err(e); - } - - trace!("client CertificateVerify OK"); - cx.common.peer_certificates = Some(self.client_cert); - - self.transcript.add_message(&m); - Ok(Box::new(ExpectCcs { - config: self.config, - secrets: self.secrets, - transcript: self.transcript, - session_id: self.session_id, - using_ems: self.using_ems, - resuming: false, - send_ticket: self.send_ticket, - })) - } -} - -// --- Process client's ChangeCipherSpec --- -struct ExpectCcs { - config: Arc, - secrets: ConnectionSecrets, - transcript: HandshakeHash, - session_id: SessionID, - using_ems: bool, - resuming: bool, - send_ticket: bool, -} - -impl State for ExpectCcs { - fn handle(self: Box, cx: &mut ServerContext<'_>, m: Message) -> hs::NextStateOrError { - match m.payload { - MessagePayload::ChangeCipherSpec(..) => {} - payload => { - return Err(inappropriate_message( - &payload, - &[ContentType::ChangeCipherSpec], - )) - } - } - - // CCS should not be received interleaved with fragmented handshake-level - // message. - cx.common.check_aligned_handshake()?; - - cx.common - .record_layer - .start_decrypting(); - Ok(Box::new(ExpectFinished { - config: self.config, - secrets: self.secrets, - transcript: self.transcript, - session_id: self.session_id, - using_ems: self.using_ems, - resuming: self.resuming, - send_ticket: self.send_ticket, - })) - } -} - -// --- Process client's Finished --- -fn get_server_connection_value_tls12( - secrets: &ConnectionSecrets, - using_ems: bool, - cx: &ServerContext<'_>, - time_now: ticketer::TimeBase, -) -> persist::ServerSessionValue { - let version = ProtocolVersion::TLSv1_2; - let secret = secrets.get_master_secret(); - - let mut v = persist::ServerSessionValue::new( - cx.data.sni.as_ref(), - version, - secrets.suite().common.suite, - secret, - cx.common.peer_certificates.clone(), - cx.common.alpn_protocol.clone(), - cx.data.resumption_data.clone(), - time_now, - 0, - ); - - if using_ems { - v.set_extended_ms_used(); - } - - v -} - -fn emit_ticket( - secrets: &ConnectionSecrets, - transcript: &mut HandshakeHash, - using_ems: bool, - cx: &mut ServerContext<'_>, - ticketer: &dyn ProducesTickets, -) -> Result<(), Error> { - let time_now = ticketer::TimeBase::now()?; - let plain = get_server_connection_value_tls12(secrets, using_ems, cx, time_now).get_encoding(); - - // If we can't produce a ticket for some reason, we can't - // report an error. Send an empty one. - let ticket = ticketer - .encrypt(&plain) - .unwrap_or_default(); - let ticket_lifetime = ticketer.lifetime(); - - let m = Message { - version: ProtocolVersion::TLSv1_2, - payload: MessagePayload::handshake(HandshakeMessagePayload { - typ: HandshakeType::NewSessionTicket, - payload: HandshakePayload::NewSessionTicket(NewSessionTicketPayload::new( - ticket_lifetime, - ticket, - )), - }), - }; - - transcript.add_message(&m); - cx.common.send_msg(m, false); - Ok(()) -} - -fn emit_ccs(common: &mut CommonState) { - let m = Message { - version: ProtocolVersion::TLSv1_2, - payload: MessagePayload::ChangeCipherSpec(ChangeCipherSpecPayload {}), - }; - - common.send_msg(m, false); -} - -fn emit_finished( - secrets: &ConnectionSecrets, - transcript: &mut HandshakeHash, - common: &mut CommonState, -) { - let vh = transcript.get_current_hash(); - let verify_data = secrets.server_verify_data(&vh); - let verify_data_payload = Payload::new(verify_data); - - let f = Message { - version: ProtocolVersion::TLSv1_2, - payload: MessagePayload::handshake(HandshakeMessagePayload { - typ: HandshakeType::Finished, - payload: HandshakePayload::Finished(verify_data_payload), - }), - }; - - transcript.add_message(&f); - common.send_msg(f, true); -} - -struct ExpectFinished { - config: Arc, - secrets: ConnectionSecrets, - transcript: HandshakeHash, - session_id: SessionID, - using_ems: bool, - resuming: bool, - send_ticket: bool, -} - -impl State for ExpectFinished { - fn handle(mut self: Box, cx: &mut ServerContext<'_>, m: Message) -> hs::NextStateOrError { - let finished = - require_handshake_msg!(m, HandshakeType::Finished, HandshakePayload::Finished)?; - - cx.common.check_aligned_handshake()?; - - let vh = self.transcript.get_current_hash(); - let expect_verify_data = self.secrets.client_verify_data(&vh); - - let _fin_verified = - constant_time::verify_slices_are_equal(&expect_verify_data, &finished.0) - .map_err(|_| { - cx.common - .send_fatal_alert(AlertDescription::DecryptError); - Error::DecryptError - }) - .map(|_| verify::FinishedMessageVerified::assertion())?; - - // Save connection, perhaps - if !self.resuming && !self.session_id.is_empty() { - let time_now = ticketer::TimeBase::now()?; - let value = - get_server_connection_value_tls12(&self.secrets, self.using_ems, cx, time_now); - - let worked = self - .config - .session_storage - .put(self.session_id.get_encoding(), value.get_encoding()); - if worked { - debug!("Session saved"); - } else { - debug!("Session not saved"); - } - } - - // Send our CCS and Finished. - self.transcript.add_message(&m); - if !self.resuming { - if self.send_ticket { - emit_ticket( - &self.secrets, - &mut self.transcript, - self.using_ems, - cx, - &*self.config.ticketer, - )?; - } - emit_ccs(cx.common); - cx.common - .record_layer - .start_encrypting(); - emit_finished(&self.secrets, &mut self.transcript, cx.common); - } - - cx.common.start_traffic(); - Ok(Box::new(ExpectTraffic { - secrets: self.secrets, - _fin_verified, - })) - } -} - -// --- Process traffic --- -struct ExpectTraffic { - secrets: ConnectionSecrets, - _fin_verified: verify::FinishedMessageVerified, -} - -impl ExpectTraffic {} - -impl State for ExpectTraffic { - fn handle(self: Box, cx: &mut ServerContext<'_>, m: Message) -> hs::NextStateOrError { - match m.payload { - MessagePayload::ApplicationData(payload) => cx - .common - .take_received_plaintext(payload), - payload => { - return Err(inappropriate_message( - &payload, - &[ContentType::ApplicationData], - )); - } - } - Ok(self) - } - - fn export_keying_material( - &self, - output: &mut [u8], - label: &[u8], - context: Option<&[u8]>, - ) -> Result<(), Error> { - self.secrets - .export_keying_material(output, label, context); - Ok(()) - } - - #[cfg(feature = "secret_extraction")] - fn extract_secrets(&self) -> Result { - self.secrets - .extract_secrets(Side::Server) - } -} diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/src/server/tls13.rs temporalio-1.3.0/vendor/rustls-0.20.9/src/server/tls13.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/src/server/tls13.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/src/server/tls13.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,1388 +0,0 @@ -use crate::check::inappropriate_handshake_message; -use crate::conn::{CommonState, ConnectionRandoms, State}; -use crate::enums::ProtocolVersion; -use crate::error::Error; -use crate::hash_hs::HandshakeHash; -use crate::key::Certificate; -#[cfg(feature = "logging")] -use crate::log::{debug, trace, warn}; -use crate::msgs::codec::Codec; -use crate::msgs::enums::{AlertDescription, KeyUpdateRequest}; -use crate::msgs::enums::{ContentType, HandshakeType}; -use crate::msgs::handshake::HandshakeMessagePayload; -use crate::msgs::handshake::HandshakePayload; -use crate::msgs::handshake::{NewSessionTicketExtension, NewSessionTicketPayloadTLS13}; -use crate::msgs::message::{Message, MessagePayload}; -use crate::msgs::persist; -use crate::rand; -use crate::server::ServerConfig; -use crate::ticketer; -use crate::tls13::key_schedule::{KeyScheduleTraffic, KeyScheduleTrafficWithClientFinishedPending}; -use crate::tls13::Tls13CipherSuite; -use crate::verify; -#[cfg(feature = "quic")] -use crate::{check::inappropriate_message, conn::Protocol}; -#[cfg(feature = "secret_extraction")] -use crate::{conn::Side, suites::PartiallyExtractedSecrets}; - -use super::hs::{self, HandshakeHashOrBuffer, ServerContext}; -use super::server_conn::ServerConnectionData; - -use std::sync::Arc; - -use ring::constant_time; - -pub(super) use client_hello::CompleteClientHelloHandling; - -mod client_hello { - use crate::enums::SignatureScheme; - use crate::kx; - use crate::msgs::base::{Payload, PayloadU8}; - use crate::msgs::ccs::ChangeCipherSpecPayload; - use crate::msgs::enums::NamedGroup; - use crate::msgs::enums::{Compression, PSKKeyExchangeMode}; - use crate::msgs::handshake::CertReqExtension; - use crate::msgs::handshake::CertificateEntry; - use crate::msgs::handshake::CertificateExtension; - use crate::msgs::handshake::CertificatePayloadTLS13; - use crate::msgs::handshake::CertificateRequestPayloadTLS13; - use crate::msgs::handshake::CertificateStatus; - use crate::msgs::handshake::ClientHelloPayload; - use crate::msgs::handshake::DigitallySignedStruct; - use crate::msgs::handshake::HelloRetryExtension; - use crate::msgs::handshake::HelloRetryRequest; - use crate::msgs::handshake::KeyShareEntry; - use crate::msgs::handshake::Random; - use crate::msgs::handshake::ServerExtension; - use crate::msgs::handshake::ServerHelloPayload; - use crate::msgs::handshake::SessionID; - #[cfg(feature = "quic")] - use crate::quic; - use crate::server::common::ActiveCertifiedKey; - use crate::sign; - use crate::tls13::key_schedule::{ - KeyScheduleEarly, KeyScheduleHandshake, KeySchedulePreHandshake, - }; - - use super::*; - - #[derive(PartialEq)] - pub(super) enum EarlyDataDecision { - Disabled, - RequestedButRejected, - Accepted, - } - - pub(in crate::server) struct CompleteClientHelloHandling { - pub(in crate::server) config: Arc, - pub(in crate::server) transcript: HandshakeHash, - pub(in crate::server) suite: &'static Tls13CipherSuite, - pub(in crate::server) randoms: ConnectionRandoms, - pub(in crate::server) done_retry: bool, - pub(in crate::server) send_ticket: bool, - pub(in crate::server) extra_exts: Vec, - } - - fn max_early_data_size(configured: u32) -> usize { - if configured != 0 { - configured as usize - } else { - // The relevant max_early_data_size may in fact be unknowable: if - // we (the server) have turned off early_data but the client has - // a stale ticket from when we allowed early_data: we'll naturally - // reject early_data but need an upper bound on the amount of data - // to drop. - // - // Use a single maximum-sized message. - 16384 - } - } - - impl CompleteClientHelloHandling { - fn check_binder( - &self, - suite: &'static Tls13CipherSuite, - client_hello: &Message, - psk: &[u8], - binder: &[u8], - ) -> bool { - let binder_plaintext = match &client_hello.payload { - MessagePayload::Handshake { parsed, .. } => { - parsed.get_encoding_for_binder_signing() - } - _ => unreachable!(), - }; - - let handshake_hash = self - .transcript - .get_hash_given(&binder_plaintext); - - let key_schedule = KeyScheduleEarly::new(suite.hkdf_algorithm, psk); - let real_binder = - key_schedule.resumption_psk_binder_key_and_sign_verify_data(&handshake_hash); - - constant_time::verify_slices_are_equal(real_binder.as_ref(), binder).is_ok() - } - - fn attempt_tls13_ticket_decryption( - &mut self, - ticket: &[u8], - ) -> Option { - if self.config.ticketer.enabled() { - self.config - .ticketer - .decrypt(ticket) - .and_then(|plain| persist::ServerSessionValue::read_bytes(&plain)) - } else { - self.config - .session_storage - .take(ticket) - .and_then(|plain| persist::ServerSessionValue::read_bytes(&plain)) - } - } - - pub(in crate::server) fn handle_client_hello( - mut self, - cx: &mut ServerContext<'_>, - server_key: ActiveCertifiedKey, - chm: &Message, - client_hello: &ClientHelloPayload, - mut sigschemes_ext: Vec, - ) -> hs::NextStateOrError { - if client_hello.compression_methods.len() != 1 { - return Err(cx - .common - .illegal_param("client offered wrong compressions")); - } - - let groups_ext = client_hello - .get_namedgroups_extension() - .ok_or_else(|| hs::incompatible(cx.common, "client didn't describe groups"))?; - - let tls13_schemes = sign::supported_sign_tls13(); - sigschemes_ext.retain(|scheme| tls13_schemes.contains(scheme)); - - let shares_ext = client_hello - .get_keyshare_extension() - .ok_or_else(|| hs::incompatible(cx.common, "client didn't send keyshares"))?; - - if client_hello.has_keyshare_extension_with_duplicates() { - return Err(cx - .common - .illegal_param("client sent duplicate keyshares")); - } - - let early_data_requested = client_hello.early_data_extension_offered(); - - // EarlyData extension is illegal in second ClientHello - if self.done_retry && early_data_requested { - return Err(cx - .common - .illegal_param("client sent EarlyData in second ClientHello")); - } - - // choose a share that we support - let chosen_share = self - .config - .kx_groups - .iter() - .find_map(|group| { - shares_ext - .iter() - .find(|share| share.group == group.name) - }); - - let chosen_share = match chosen_share { - Some(s) => s, - None => { - // We don't have a suitable key share. Choose a suitable group and - // send a HelloRetryRequest. - let retry_group_maybe = self - .config - .kx_groups - .iter() - .find(|group| groups_ext.contains(&group.name)) - .cloned(); - - self.transcript.add_message(chm); - - if let Some(group) = retry_group_maybe { - if self.done_retry { - return Err(cx - .common - .illegal_param("did not follow retry request")); - } - - emit_hello_retry_request( - &mut self.transcript, - self.suite, - client_hello.session_id, - cx.common, - group.name, - ); - emit_fake_ccs(cx.common); - - let skip_early_data = max_early_data_size(self.config.max_early_data_size); - - let next = Box::new(hs::ExpectClientHello { - config: self.config, - transcript: HandshakeHashOrBuffer::Hash(self.transcript), - #[cfg(feature = "tls12")] - session_id: SessionID::empty(), - #[cfg(feature = "tls12")] - using_ems: false, - done_retry: true, - send_ticket: self.send_ticket, - extra_exts: self.extra_exts, - }); - - return if early_data_requested { - Ok(Box::new(ExpectAndSkipRejectedEarlyData { - skip_data_left: skip_early_data, - next, - })) - } else { - Ok(next) - }; - } - - return Err(hs::incompatible( - cx.common, - "no kx group overlap with client", - )); - } - }; - - let mut chosen_psk_index = None; - let mut resumedata = None; - let time_now = ticketer::TimeBase::now()?; - - if let Some(psk_offer) = client_hello.get_psk() { - if !client_hello.check_psk_ext_is_last() { - return Err(cx - .common - .illegal_param("psk extension in wrong position")); - } - - if psk_offer.binders.is_empty() { - return Err(hs::decode_error(cx.common, "psk extension missing binder")); - } - - if psk_offer.binders.len() != psk_offer.identities.len() { - return Err(cx - .common - .illegal_param("psk extension mismatched ids/binders")); - } - - for (i, psk_id) in psk_offer.identities.iter().enumerate() { - let resume = match self - .attempt_tls13_ticket_decryption(&psk_id.identity.0) - .map(|resumedata| { - resumedata.set_freshness(psk_id.obfuscated_ticket_age, time_now) - }) - .filter(|resumedata| { - hs::can_resume(self.suite.into(), &cx.data.sni, false, resumedata) - }) { - Some(resume) => resume, - None => continue, - }; - - if !self.check_binder( - self.suite, - chm, - &resume.master_secret.0, - &psk_offer.binders[i].0, - ) { - cx.common - .send_fatal_alert(AlertDescription::DecryptError); - return Err(Error::PeerMisbehavedError( - "client sent wrong binder".to_string(), - )); - } - - chosen_psk_index = Some(i); - resumedata = Some(resume); - break; - } - } - - if !client_hello.psk_mode_offered(PSKKeyExchangeMode::PSK_DHE_KE) { - debug!("Client unwilling to resume, DHE_KE not offered"); - self.send_ticket = false; - chosen_psk_index = None; - resumedata = None; - } else { - self.send_ticket = true; - } - - if let Some(ref resume) = resumedata { - cx.data.received_resumption_data = Some(resume.application_data.0.clone()); - cx.common.peer_certificates = resume.client_cert_chain.clone(); - } - - let full_handshake = resumedata.is_none(); - self.transcript.add_message(chm); - let key_schedule = emit_server_hello( - &mut self.transcript, - &self.randoms, - self.suite, - cx, - &client_hello.session_id, - chosen_share, - chosen_psk_index, - resumedata - .as_ref() - .map(|x| &x.master_secret.0[..]), - &self.config, - )?; - if !self.done_retry { - emit_fake_ccs(cx.common); - } - - let (mut ocsp_response, mut sct_list) = - (server_key.get_ocsp(), server_key.get_sct_list()); - let doing_early_data = emit_encrypted_extensions( - &mut self.transcript, - self.suite, - cx, - &mut ocsp_response, - &mut sct_list, - client_hello, - resumedata.as_ref(), - self.extra_exts, - &self.config, - )?; - - let doing_client_auth = if full_handshake { - let client_auth = - emit_certificate_req_tls13(&mut self.transcript, cx, &self.config)?; - emit_certificate_tls13( - &mut self.transcript, - cx.common, - server_key.get_cert(), - ocsp_response, - sct_list, - ); - emit_certificate_verify_tls13( - &mut self.transcript, - cx.common, - server_key.get_key(), - &sigschemes_ext, - )?; - client_auth - } else { - false - }; - - // If we're not doing early data, then the next messages we receive - // are encrypted with the handshake keys. - match doing_early_data { - EarlyDataDecision::Disabled => { - cx.common - .record_layer - .set_message_decrypter( - self.suite - .derive_decrypter(key_schedule.client_key()), - ); - cx.data.early_data.reject(); - } - EarlyDataDecision::RequestedButRejected => { - debug!("Client requested early_data, but not accepted: switching to handshake keys with trial decryption"); - cx.common - .record_layer - .set_message_decrypter_with_trial_decryption( - self.suite - .derive_decrypter(key_schedule.client_key()), - max_early_data_size(self.config.max_early_data_size), - ); - cx.data.early_data.reject(); - } - EarlyDataDecision::Accepted => { - cx.data - .early_data - .accept(self.config.max_early_data_size as usize); - } - } - - cx.common.check_aligned_handshake()?; - let key_schedule_traffic = emit_finished_tls13( - &mut self.transcript, - self.suite, - &self.randoms, - cx, - key_schedule, - &self.config, - ); - - if !doing_client_auth && self.config.send_half_rtt_data { - // Application data can be sent immediately after Finished, in one - // flight. However, if client auth is enabled, we don't want to send - // application data to an unauthenticated peer. - cx.common.start_outgoing_traffic(); - } - - if doing_client_auth { - Ok(Box::new(ExpectCertificate { - config: self.config, - transcript: self.transcript, - suite: self.suite, - key_schedule: key_schedule_traffic, - send_ticket: self.send_ticket, - })) - } else if doing_early_data == EarlyDataDecision::Accepted && !cx.common.is_quic() { - // Not used for QUIC: RFC 9001 §8.3: Clients MUST NOT send the EndOfEarlyData - // message. A server MUST treat receipt of a CRYPTO frame in a 0-RTT packet as a - // connection error of type PROTOCOL_VIOLATION. - Ok(Box::new(ExpectEarlyData { - config: self.config, - transcript: self.transcript, - suite: self.suite, - key_schedule: key_schedule_traffic, - send_ticket: self.send_ticket, - })) - } else { - Ok(Box::new(ExpectFinished { - config: self.config, - transcript: self.transcript, - suite: self.suite, - key_schedule: key_schedule_traffic, - send_ticket: self.send_ticket, - })) - } - } - } - - fn emit_server_hello( - transcript: &mut HandshakeHash, - randoms: &ConnectionRandoms, - suite: &'static Tls13CipherSuite, - cx: &mut ServerContext<'_>, - session_id: &SessionID, - share: &KeyShareEntry, - chosen_psk_idx: Option, - resuming_psk: Option<&[u8]>, - config: &ServerConfig, - ) -> Result { - let mut extensions = Vec::new(); - - // Prepare key exchange - let kx = kx::KeyExchange::choose(share.group, &config.kx_groups) - .and_then(kx::KeyExchange::start) - .ok_or(Error::FailedToGetRandomBytes)?; - - let kse = KeyShareEntry::new(share.group, kx.pubkey.as_ref()); - extensions.push(ServerExtension::KeyShare(kse)); - extensions.push(ServerExtension::SupportedVersions(ProtocolVersion::TLSv1_3)); - - if let Some(psk_idx) = chosen_psk_idx { - extensions.push(ServerExtension::PresharedKey(psk_idx as u16)); - } - - let sh = Message { - version: ProtocolVersion::TLSv1_2, - payload: MessagePayload::handshake(HandshakeMessagePayload { - typ: HandshakeType::ServerHello, - payload: HandshakePayload::ServerHello(ServerHelloPayload { - legacy_version: ProtocolVersion::TLSv1_2, - random: Random::from(randoms.server), - session_id: *session_id, - cipher_suite: suite.common.suite, - compression_method: Compression::Null, - extensions, - }), - }), - }; - - cx.common.check_aligned_handshake()?; - - let client_hello_hash = transcript.get_hash_given(&[]); - - trace!("sending server hello {:?}", sh); - transcript.add_message(&sh); - cx.common.send_msg(sh, false); - - // Start key schedule - let (key_schedule_pre_handshake, early_data_client_key) = if let Some(psk) = resuming_psk { - let early_key_schedule = KeyScheduleEarly::new(suite.hkdf_algorithm, psk); - let client_early_traffic_secret = early_key_schedule.client_early_traffic_secret( - &client_hello_hash, - &*config.key_log, - &randoms.client, - ); - - ( - KeySchedulePreHandshake::from(early_key_schedule), - Some(client_early_traffic_secret), - ) - } else { - (KeySchedulePreHandshake::new(suite.hkdf_algorithm), None) - }; - - // Do key exchange - let key_schedule = kx.complete(&share.payload.0, |secret| { - Ok(key_schedule_pre_handshake.into_handshake(secret)) - })?; - - let handshake_hash = transcript.get_current_hash(); - let (key_schedule, _client_key, server_key) = key_schedule.derive_handshake_secrets( - handshake_hash, - &*config.key_log, - &randoms.client, - ); - - // Set up to encrypt with handshake secrets, but decrypt with early_data keys. - // If not doing early_data after all, this is corrected later to the handshake - // keys (now stored in key_schedule). - cx.common - .record_layer - .set_message_encrypter(suite.derive_encrypter(&server_key)); - - if let Some(key) = &early_data_client_key { - cx.common - .record_layer - .set_message_decrypter(suite.derive_decrypter(key)); - } - - #[cfg(feature = "quic")] - if cx.common.is_quic() { - // If 0-RTT should be rejected, this will be clobbered by ExtensionProcessing - // before the application can see. - cx.common.quic.early_secret = early_data_client_key; - cx.common.quic.hs_secrets = - Some(quic::Secrets::new(_client_key, server_key, suite, false)); - } - - Ok(key_schedule) - } - - fn emit_fake_ccs(common: &mut CommonState) { - if common.is_quic() { - return; - } - let m = Message { - version: ProtocolVersion::TLSv1_2, - payload: MessagePayload::ChangeCipherSpec(ChangeCipherSpecPayload {}), - }; - common.send_msg(m, false); - } - - fn emit_hello_retry_request( - transcript: &mut HandshakeHash, - suite: &'static Tls13CipherSuite, - session_id: SessionID, - common: &mut CommonState, - group: NamedGroup, - ) { - let mut req = HelloRetryRequest { - legacy_version: ProtocolVersion::TLSv1_2, - session_id, - cipher_suite: suite.common.suite, - extensions: Vec::new(), - }; - - req.extensions - .push(HelloRetryExtension::KeyShare(group)); - req.extensions - .push(HelloRetryExtension::SupportedVersions( - ProtocolVersion::TLSv1_3, - )); - - let m = Message { - version: ProtocolVersion::TLSv1_2, - payload: MessagePayload::handshake(HandshakeMessagePayload { - typ: HandshakeType::HelloRetryRequest, - payload: HandshakePayload::HelloRetryRequest(req), - }), - }; - - trace!("Requesting retry {:?}", m); - transcript.rollup_for_hrr(); - transcript.add_message(&m); - common.send_msg(m, false); - } - - fn decide_if_early_data_allowed( - cx: &mut ServerContext<'_>, - client_hello: &ClientHelloPayload, - resumedata: Option<&persist::ServerSessionValue>, - suite: &'static Tls13CipherSuite, - config: &ServerConfig, - ) -> EarlyDataDecision { - let early_data_requested = client_hello.early_data_extension_offered(); - let rejected_or_disabled = match early_data_requested { - true => EarlyDataDecision::RequestedButRejected, - false => EarlyDataDecision::Disabled, - }; - - let resume = match resumedata { - Some(resume) => resume, - None => { - // never any early data if not resuming. - return rejected_or_disabled; - } - }; - - /* Non-zero max_early_data_size controls whether early_data is allowed at all. - * We also require stateful resumption. */ - let early_data_configured = config.max_early_data_size > 0 && !config.ticketer.enabled(); - - /* "For PSKs provisioned via NewSessionTicket, a server MUST validate - * that the ticket age for the selected PSK identity (computed by - * subtracting ticket_age_add from PskIdentity.obfuscated_ticket_age - * modulo 2^32) is within a small tolerance of the time since the ticket - * was issued (see Section 8)." -- this is implemented in ServerSessionValue::set_freshness() - * and related. - * - * "In order to accept early data, the server [...] MUST verify that the - * following values are the same as those associated with the - * selected PSK: - * - * - The TLS version number - * - The selected cipher suite - * - The selected ALPN [RFC7301] protocol, if any" - * - * (RFC8446, 4.2.10) */ - let early_data_possible = early_data_requested - && resume.is_fresh() - && Some(resume.version) == cx.common.negotiated_version - && resume.cipher_suite == suite.common.suite - && resume.alpn.as_ref().map(|x| &x.0) == cx.common.alpn_protocol.as_ref(); - - if early_data_configured && early_data_possible && !cx.data.early_data.was_rejected() { - EarlyDataDecision::Accepted - } else { - #[cfg(feature = "quic")] - if cx.common.is_quic() { - // Clobber value set in tls13::emit_server_hello - cx.common.quic.early_secret = None; - } - - rejected_or_disabled - } - } - - fn emit_encrypted_extensions( - transcript: &mut HandshakeHash, - suite: &'static Tls13CipherSuite, - cx: &mut ServerContext<'_>, - ocsp_response: &mut Option<&[u8]>, - sct_list: &mut Option<&[u8]>, - hello: &ClientHelloPayload, - resumedata: Option<&persist::ServerSessionValue>, - extra_exts: Vec, - config: &ServerConfig, - ) -> Result { - let mut ep = hs::ExtensionProcessing::new(); - ep.process_common( - config, - cx, - ocsp_response, - sct_list, - hello, - resumedata, - extra_exts, - )?; - - let early_data = decide_if_early_data_allowed(cx, hello, resumedata, suite, config); - if early_data == EarlyDataDecision::Accepted { - ep.exts.push(ServerExtension::EarlyData); - } - - let ee = Message { - version: ProtocolVersion::TLSv1_3, - payload: MessagePayload::handshake(HandshakeMessagePayload { - typ: HandshakeType::EncryptedExtensions, - payload: HandshakePayload::EncryptedExtensions(ep.exts), - }), - }; - - trace!("sending encrypted extensions {:?}", ee); - transcript.add_message(&ee); - cx.common.send_msg(ee, true); - Ok(early_data) - } - - fn emit_certificate_req_tls13( - transcript: &mut HandshakeHash, - cx: &mut ServerContext<'_>, - config: &ServerConfig, - ) -> Result { - if !config.verifier.offer_client_auth() { - return Ok(false); - } - - let mut cr = CertificateRequestPayloadTLS13 { - context: PayloadU8::empty(), - extensions: Vec::new(), - }; - - let schemes = config - .verifier - .supported_verify_schemes(); - cr.extensions - .push(CertReqExtension::SignatureAlgorithms(schemes.to_vec())); - - let names = config - .verifier - .client_auth_root_subjects() - .ok_or_else(|| { - debug!("could not determine root subjects based on SNI"); - cx.common - .send_fatal_alert(AlertDescription::AccessDenied); - Error::General("client rejected by client_auth_root_subjects".into()) - })?; - - if !names.is_empty() { - cr.extensions - .push(CertReqExtension::AuthorityNames(names)); - } - - let m = Message { - version: ProtocolVersion::TLSv1_3, - payload: MessagePayload::handshake(HandshakeMessagePayload { - typ: HandshakeType::CertificateRequest, - payload: HandshakePayload::CertificateRequestTLS13(cr), - }), - }; - - trace!("Sending CertificateRequest {:?}", m); - transcript.add_message(&m); - cx.common.send_msg(m, true); - Ok(true) - } - - fn emit_certificate_tls13( - transcript: &mut HandshakeHash, - common: &mut CommonState, - cert_chain: &[Certificate], - ocsp_response: Option<&[u8]>, - sct_list: Option<&[u8]>, - ) { - let mut cert_entries = vec![]; - for cert in cert_chain { - let entry = CertificateEntry { - cert: cert.to_owned(), - exts: Vec::new(), - }; - - cert_entries.push(entry); - } - - if let Some(end_entity_cert) = cert_entries.first_mut() { - // Apply OCSP response to first certificate (we don't support OCSP - // except for leaf certs). - if let Some(ocsp) = ocsp_response { - let cst = CertificateStatus::new(ocsp.to_owned()); - end_entity_cert - .exts - .push(CertificateExtension::CertificateStatus(cst)); - } - - // Likewise, SCT - if let Some(sct_list) = sct_list { - end_entity_cert - .exts - .push(CertificateExtension::make_sct(sct_list.to_owned())); - } - } - - let cert_body = CertificatePayloadTLS13::new(cert_entries); - let c = Message { - version: ProtocolVersion::TLSv1_3, - payload: MessagePayload::handshake(HandshakeMessagePayload { - typ: HandshakeType::Certificate, - payload: HandshakePayload::CertificateTLS13(cert_body), - }), - }; - - trace!("sending certificate {:?}", c); - transcript.add_message(&c); - common.send_msg(c, true); - } - - fn emit_certificate_verify_tls13( - transcript: &mut HandshakeHash, - common: &mut CommonState, - signing_key: &dyn sign::SigningKey, - schemes: &[SignatureScheme], - ) -> Result<(), Error> { - let message = verify::construct_tls13_server_verify_message(&transcript.get_current_hash()); - - let signer = signing_key - .choose_scheme(schemes) - .ok_or_else(|| hs::incompatible(common, "no overlapping sigschemes"))?; - - let scheme = signer.scheme(); - let sig = signer.sign(&message)?; - - let cv = DigitallySignedStruct::new(scheme, sig); - - let m = Message { - version: ProtocolVersion::TLSv1_3, - payload: MessagePayload::handshake(HandshakeMessagePayload { - typ: HandshakeType::CertificateVerify, - payload: HandshakePayload::CertificateVerify(cv), - }), - }; - - trace!("sending certificate-verify {:?}", m); - transcript.add_message(&m); - common.send_msg(m, true); - Ok(()) - } - - fn emit_finished_tls13( - transcript: &mut HandshakeHash, - suite: &'static Tls13CipherSuite, - randoms: &ConnectionRandoms, - cx: &mut ServerContext<'_>, - key_schedule: KeyScheduleHandshake, - config: &ServerConfig, - ) -> KeyScheduleTrafficWithClientFinishedPending { - let handshake_hash = transcript.get_current_hash(); - let verify_data = key_schedule.sign_server_finish(&handshake_hash); - let verify_data_payload = Payload::new(verify_data.as_ref()); - - let m = Message { - version: ProtocolVersion::TLSv1_3, - payload: MessagePayload::handshake(HandshakeMessagePayload { - typ: HandshakeType::Finished, - payload: HandshakePayload::Finished(verify_data_payload), - }), - }; - - trace!("sending finished {:?}", m); - transcript.add_message(&m); - let hash_at_server_fin = transcript.get_current_hash(); - cx.common.send_msg(m, true); - - // Now move to application data keys. Read key change is deferred until - // the Finish message is received & validated. - let (key_schedule_traffic, _client_key, server_key) = key_schedule - .into_traffic_with_client_finished_pending( - hash_at_server_fin, - &*config.key_log, - &randoms.client, - ); - cx.common - .record_layer - .set_message_encrypter(suite.derive_encrypter(&server_key)); - - #[cfg(feature = "quic")] - { - cx.common.quic.traffic_secrets = - Some(quic::Secrets::new(_client_key, server_key, suite, false)); - } - - key_schedule_traffic - } -} - -struct ExpectAndSkipRejectedEarlyData { - skip_data_left: usize, - next: Box, -} - -impl State for ExpectAndSkipRejectedEarlyData { - fn handle(mut self: Box, cx: &mut ServerContext<'_>, m: Message) -> hs::NextStateOrError { - /* "The server then ignores early data by skipping all records with an external - * content type of "application_data" (indicating that they are encrypted), - * up to the configured max_early_data_size." - * (RFC8446, 14.2.10) */ - if let MessagePayload::ApplicationData(ref skip_data) = m.payload { - if skip_data.0.len() <= self.skip_data_left { - self.skip_data_left -= skip_data.0.len(); - return Ok(self); - } - } - - self.next.handle(cx, m) - } -} - -struct ExpectCertificate { - config: Arc, - transcript: HandshakeHash, - suite: &'static Tls13CipherSuite, - key_schedule: KeyScheduleTrafficWithClientFinishedPending, - send_ticket: bool, -} - -impl State for ExpectCertificate { - fn handle(mut self: Box, cx: &mut ServerContext<'_>, m: Message) -> hs::NextStateOrError { - let certp = require_handshake_msg!( - m, - HandshakeType::Certificate, - HandshakePayload::CertificateTLS13 - )?; - self.transcript.add_message(&m); - - // We don't send any CertificateRequest extensions, so any extensions - // here are illegal. - if certp.any_entry_has_extension() { - return Err(Error::PeerMisbehavedError( - "client sent unsolicited cert extension".to_string(), - )); - } - - let client_cert = certp.convert(); - - let mandatory = self - .config - .verifier - .client_auth_mandatory() - .ok_or_else(|| { - debug!("could not determine if client auth is mandatory based on SNI"); - cx.common - .send_fatal_alert(AlertDescription::AccessDenied); - Error::General("client rejected by client_auth_mandatory".into()) - })?; - - let (end_entity, intermediates) = match client_cert.split_first() { - None => { - if !mandatory { - debug!("client auth requested but no certificate supplied"); - self.transcript.abandon_client_auth(); - return Ok(Box::new(ExpectFinished { - config: self.config, - suite: self.suite, - key_schedule: self.key_schedule, - transcript: self.transcript, - send_ticket: self.send_ticket, - })); - } - - cx.common - .send_fatal_alert(AlertDescription::CertificateRequired); - return Err(Error::NoCertificatesPresented); - } - Some(chain) => chain, - }; - - let now = std::time::SystemTime::now(); - self.config - .verifier - .verify_client_cert(end_entity, intermediates, now) - .map_err(|err| { - hs::incompatible(cx.common, "certificate invalid"); - err - })?; - - Ok(Box::new(ExpectCertificateVerify { - config: self.config, - suite: self.suite, - transcript: self.transcript, - key_schedule: self.key_schedule, - client_cert, - send_ticket: self.send_ticket, - })) - } -} - -struct ExpectCertificateVerify { - config: Arc, - transcript: HandshakeHash, - suite: &'static Tls13CipherSuite, - key_schedule: KeyScheduleTrafficWithClientFinishedPending, - client_cert: Vec, - send_ticket: bool, -} - -impl State for ExpectCertificateVerify { - fn handle(mut self: Box, cx: &mut ServerContext<'_>, m: Message) -> hs::NextStateOrError { - let rc = { - let sig = require_handshake_msg!( - m, - HandshakeType::CertificateVerify, - HandshakePayload::CertificateVerify - )?; - let handshake_hash = self.transcript.get_current_hash(); - self.transcript.abandon_client_auth(); - let certs = &self.client_cert; - let msg = verify::construct_tls13_client_verify_message(&handshake_hash); - - self.config - .verifier - .verify_tls13_signature(&msg, &certs[0], sig) - }; - - if let Err(e) = rc { - cx.common - .send_fatal_alert(AlertDescription::AccessDenied); - return Err(e); - } - - trace!("client CertificateVerify OK"); - cx.common.peer_certificates = Some(self.client_cert); - - self.transcript.add_message(&m); - Ok(Box::new(ExpectFinished { - config: self.config, - suite: self.suite, - key_schedule: self.key_schedule, - transcript: self.transcript, - send_ticket: self.send_ticket, - })) - } -} - -// --- Process (any number of) early ApplicationData messages, -// followed by a terminating handshake EndOfEarlyData message --- - -struct ExpectEarlyData { - config: Arc, - transcript: HandshakeHash, - suite: &'static Tls13CipherSuite, - key_schedule: KeyScheduleTrafficWithClientFinishedPending, - send_ticket: bool, -} - -impl State for ExpectEarlyData { - fn handle(mut self: Box, cx: &mut ServerContext<'_>, m: Message) -> hs::NextStateOrError { - match m.payload { - MessagePayload::ApplicationData(payload) => { - match cx - .data - .early_data - .take_received_plaintext(payload) - { - true => Ok(self), - false => { - cx.common - .send_fatal_alert(AlertDescription::UnexpectedMessage); - Err(Error::PeerMisbehavedError( - "too much early_data received".into(), - )) - } - } - } - MessagePayload::Handshake { - parsed: - HandshakeMessagePayload { - typ: HandshakeType::EndOfEarlyData, - payload: HandshakePayload::EndOfEarlyData, - }, - .. - } => { - cx.common - .record_layer - .set_message_decrypter( - self.suite - .derive_decrypter(self.key_schedule.client_key()), - ); - - self.transcript.add_message(&m); - Ok(Box::new(ExpectFinished { - config: self.config, - suite: self.suite, - key_schedule: self.key_schedule, - transcript: self.transcript, - send_ticket: self.send_ticket, - })) - } - payload => Err(inappropriate_handshake_message( - &payload, - &[ContentType::ApplicationData, ContentType::Handshake], - &[HandshakeType::EndOfEarlyData], - )), - } - } -} - -// --- Process client's Finished --- -fn get_server_session_value( - transcript: &mut HandshakeHash, - suite: &'static Tls13CipherSuite, - key_schedule: &KeyScheduleTraffic, - cx: &ServerContext<'_>, - nonce: &[u8], - time_now: ticketer::TimeBase, - age_obfuscation_offset: u32, -) -> persist::ServerSessionValue { - let version = ProtocolVersion::TLSv1_3; - - let handshake_hash = transcript.get_current_hash(); - let secret = - key_schedule.resumption_master_secret_and_derive_ticket_psk(&handshake_hash, nonce); - - persist::ServerSessionValue::new( - cx.data.sni.as_ref(), - version, - suite.common.suite, - secret, - cx.common.peer_certificates.clone(), - cx.common.alpn_protocol.clone(), - cx.data.resumption_data.clone(), - time_now, - age_obfuscation_offset, - ) -} - -struct ExpectFinished { - config: Arc, - transcript: HandshakeHash, - suite: &'static Tls13CipherSuite, - key_schedule: KeyScheduleTrafficWithClientFinishedPending, - send_ticket: bool, -} - -impl ExpectFinished { - fn emit_ticket( - transcript: &mut HandshakeHash, - suite: &'static Tls13CipherSuite, - cx: &mut ServerContext<'_>, - key_schedule: &KeyScheduleTraffic, - config: &ServerConfig, - ) -> Result<(), Error> { - let nonce = rand::random_vec(32)?; - let now = ticketer::TimeBase::now()?; - let age_add = rand::random_u32()?; - let plain = - get_server_session_value(transcript, suite, key_schedule, cx, &nonce, now, age_add) - .get_encoding(); - - let stateless = config.ticketer.enabled(); - let (ticket, lifetime) = if stateless { - let ticket = match config.ticketer.encrypt(&plain) { - Some(t) => t, - None => return Ok(()), - }; - (ticket, config.ticketer.lifetime()) - } else { - let id = rand::random_vec(32)?; - let stored = config - .session_storage - .put(id.clone(), plain); - if !stored { - trace!("resumption not available; not issuing ticket"); - return Ok(()); - } - let stateful_lifetime = 24 * 60 * 60; // this is a bit of a punt - (id, stateful_lifetime) - }; - - let mut payload = NewSessionTicketPayloadTLS13::new(lifetime, age_add, nonce, ticket); - - if config.max_early_data_size > 0 { - if !stateless { - payload - .exts - .push(NewSessionTicketExtension::EarlyData( - config.max_early_data_size, - )); - } else { - // We implement RFC8446 section 8.1: by enforcing that 0-RTT is - // only possible if using stateful resumption - warn!("early_data with stateless resumption is not allowed"); - } - } - - let m = Message { - version: ProtocolVersion::TLSv1_3, - payload: MessagePayload::handshake(HandshakeMessagePayload { - typ: HandshakeType::NewSessionTicket, - payload: HandshakePayload::NewSessionTicketTLS13(payload), - }), - }; - - trace!("sending new ticket {:?} (stateless: {})", m, stateless); - transcript.add_message(&m); - cx.common.send_msg(m, true); - Ok(()) - } -} - -impl State for ExpectFinished { - fn handle(mut self: Box, cx: &mut ServerContext<'_>, m: Message) -> hs::NextStateOrError { - let finished = - require_handshake_msg!(m, HandshakeType::Finished, HandshakePayload::Finished)?; - - let handshake_hash = self.transcript.get_current_hash(); - let (key_schedule_traffic, expect_verify_data, client_key) = self - .key_schedule - .sign_client_finish(&handshake_hash); - - let fin = constant_time::verify_slices_are_equal(expect_verify_data.as_ref(), &finished.0) - .map_err(|_| { - cx.common - .send_fatal_alert(AlertDescription::DecryptError); - warn!("Finished wrong"); - Error::DecryptError - }) - .map(|_| verify::FinishedMessageVerified::assertion())?; - - // nb. future derivations include Client Finished, but not the - // main application data keying. - self.transcript.add_message(&m); - - cx.common.check_aligned_handshake()?; - - // Install keying to read future messages. - cx.common - .record_layer - .set_message_decrypter(self.suite.derive_decrypter(&client_key)); - - if self.send_ticket { - Self::emit_ticket( - &mut self.transcript, - self.suite, - cx, - &key_schedule_traffic, - &self.config, - )?; - } - - // Application data may now flow, even if we have client auth enabled. - cx.common.start_traffic(); - - #[cfg(feature = "quic")] - { - if cx.common.protocol == Protocol::Quic { - return Ok(Box::new(ExpectQuicTraffic { - key_schedule: key_schedule_traffic, - _fin_verified: fin, - })); - } - } - - Ok(Box::new(ExpectTraffic { - suite: self.suite, - key_schedule: key_schedule_traffic, - want_write_key_update: false, - _fin_verified: fin, - })) - } -} - -// --- Process traffic --- -struct ExpectTraffic { - suite: &'static Tls13CipherSuite, - key_schedule: KeyScheduleTraffic, - want_write_key_update: bool, - _fin_verified: verify::FinishedMessageVerified, -} - -impl ExpectTraffic { - fn handle_key_update( - &mut self, - common: &mut CommonState, - kur: &KeyUpdateRequest, - ) -> Result<(), Error> { - #[cfg(feature = "quic")] - { - if let Protocol::Quic = common.protocol { - common.send_fatal_alert(AlertDescription::UnexpectedMessage); - let msg = "KeyUpdate received in QUIC connection".to_string(); - warn!("{}", msg); - return Err(Error::PeerMisbehavedError(msg)); - } - } - - common.check_aligned_handshake()?; - - match kur { - KeyUpdateRequest::UpdateNotRequested => {} - KeyUpdateRequest::UpdateRequested => { - self.want_write_key_update = true; - } - _ => { - common.send_fatal_alert(AlertDescription::IllegalParameter); - return Err(Error::CorruptMessagePayload(ContentType::Handshake)); - } - } - - // Update our read-side keys. - let new_read_key = self - .key_schedule - .next_client_application_traffic_secret(); - common - .record_layer - .set_message_decrypter( - self.suite - .derive_decrypter(&new_read_key), - ); - - Ok(()) - } -} - -impl State for ExpectTraffic { - fn handle(mut self: Box, cx: &mut ServerContext, m: Message) -> hs::NextStateOrError { - match m.payload { - MessagePayload::ApplicationData(payload) => cx - .common - .take_received_plaintext(payload), - MessagePayload::Handshake { - parsed: - HandshakeMessagePayload { - payload: HandshakePayload::KeyUpdate(key_update), - .. - }, - .. - } => self.handle_key_update(cx.common, &key_update)?, - payload => { - return Err(inappropriate_handshake_message( - &payload, - &[ContentType::ApplicationData, ContentType::Handshake], - &[HandshakeType::KeyUpdate], - )); - } - } - - Ok(self) - } - - fn export_keying_material( - &self, - output: &mut [u8], - label: &[u8], - context: Option<&[u8]>, - ) -> Result<(), Error> { - self.key_schedule - .export_keying_material(output, label, context) - } - - fn perhaps_write_key_update(&mut self, common: &mut CommonState) { - if self.want_write_key_update { - self.want_write_key_update = false; - common.send_msg_encrypt(Message::build_key_update_notify().into()); - - let write_key = self - .key_schedule - .next_server_application_traffic_secret(); - common - .record_layer - .set_message_encrypter(self.suite.derive_encrypter(&write_key)); - } - } - - #[cfg(feature = "secret_extraction")] - fn extract_secrets(&self) -> Result { - self.key_schedule - .extract_secrets(self.suite.common.aead_algorithm, Side::Server) - } -} - -#[cfg(feature = "quic")] -struct ExpectQuicTraffic { - key_schedule: KeyScheduleTraffic, - _fin_verified: verify::FinishedMessageVerified, -} - -#[cfg(feature = "quic")] -impl State for ExpectQuicTraffic { - fn handle(self: Box, _cx: &mut ServerContext<'_>, m: Message) -> hs::NextStateOrError { - // reject all messages - Err(inappropriate_message(&m.payload, &[])) - } - - fn export_keying_material( - &self, - output: &mut [u8], - label: &[u8], - context: Option<&[u8]>, - ) -> Result<(), Error> { - self.key_schedule - .export_keying_material(output, label, context) - } -} diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/src/sign.rs temporalio-1.3.0/vendor/rustls-0.20.9/src/sign.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/src/sign.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/src/sign.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,523 +0,0 @@ -use crate::enums::SignatureScheme; -use crate::error::Error; -use crate::key; -use crate::msgs::enums::SignatureAlgorithm; -use crate::x509::{wrap_in_asn1_len, wrap_in_sequence}; - -use ring::io::der; -use ring::signature::{self, EcdsaKeyPair, Ed25519KeyPair, RsaKeyPair}; - -use std::convert::TryFrom; -use std::error::Error as StdError; -use std::fmt; -use std::sync::Arc; - -/// An abstract signing key. -pub trait SigningKey: Send + Sync { - /// Choose a `SignatureScheme` from those offered. - /// - /// Expresses the choice by returning something that implements `Signer`, - /// using the chosen scheme. - fn choose_scheme(&self, offered: &[SignatureScheme]) -> Option>; - - /// What kind of key we have. - fn algorithm(&self) -> SignatureAlgorithm; -} - -/// A thing that can sign a message. -pub trait Signer: Send + Sync { - /// Signs `message` using the selected scheme. - fn sign(&self, message: &[u8]) -> Result, Error>; - - /// Reveals which scheme will be used when you call `sign()`. - fn scheme(&self) -> SignatureScheme; -} - -/// A packaged-together certificate chain, matching `SigningKey` and -/// optional stapled OCSP response and/or SCT list. -#[derive(Clone)] -pub struct CertifiedKey { - /// The certificate chain. - pub cert: Vec, - - /// The certified key. - pub key: Arc, - - /// An optional OCSP response from the certificate issuer, - /// attesting to its continued validity. - pub ocsp: Option>, - - /// An optional collection of SCTs from CT logs, proving the - /// certificate is included on those logs. This must be - /// a `SignedCertificateTimestampList` encoding; see RFC6962. - pub sct_list: Option>, -} - -impl CertifiedKey { - /// Make a new CertifiedKey, with the given chain and key. - /// - /// The cert chain must not be empty. The first certificate in the chain - /// must be the end-entity certificate. - pub fn new(cert: Vec, key: Arc) -> Self { - Self { - cert, - key, - ocsp: None, - sct_list: None, - } - } - - /// The end-entity certificate. - pub fn end_entity_cert(&self) -> Result<&key::Certificate, SignError> { - self.cert.get(0).ok_or(SignError(())) - } - - /// Check the certificate chain for validity: - /// - it should be non-empty list - /// - the first certificate should be parsable as a x509v3, - /// - the first certificate should quote the given server name - /// (if provided) - /// - /// These checks are not security-sensitive. They are the - /// *server* attempting to detect accidental misconfiguration. - pub(crate) fn cross_check_end_entity_cert( - &self, - name: Option, - ) -> Result<(), Error> { - // Always reject an empty certificate chain. - let end_entity_cert = self - .end_entity_cert() - .map_err(|SignError(())| { - Error::General("No end-entity certificate in certificate chain".to_string()) - })?; - - // Reject syntactically-invalid end-entity certificates. - let end_entity_cert = - webpki::EndEntityCert::try_from(end_entity_cert.as_ref()).map_err(|_| { - Error::General( - "End-entity certificate in certificate \ - chain is syntactically invalid" - .to_string(), - ) - })?; - - if let Some(name) = name { - // If SNI was offered then the certificate must be valid for - // that hostname. Note that this doesn't fully validate that the - // certificate is valid; it only validates that the name is one - // that the certificate is valid for, if the certificate is - // valid. - if end_entity_cert - .verify_is_valid_for_dns_name(name) - .is_err() - { - return Err(Error::General( - "The server certificate is not \ - valid for the given name" - .to_string(), - )); - } - } - - Ok(()) - } -} - -/// Parse `der` as any supported key encoding/type, returning -/// the first which works. -pub fn any_supported_type(der: &key::PrivateKey) -> Result, SignError> { - if let Ok(rsa) = RsaSigningKey::new(der) { - Ok(Arc::new(rsa)) - } else if let Ok(ecdsa) = any_ecdsa_type(der) { - Ok(ecdsa) - } else { - any_eddsa_type(der) - } -} - -/// Parse `der` as any ECDSA key type, returning the first which works. -/// -/// Both SEC1 (PEM section starting with 'BEGIN EC PRIVATE KEY') and PKCS8 -/// (PEM section starting with 'BEGIN PRIVATE KEY') encodings are supported. -pub fn any_ecdsa_type(der: &key::PrivateKey) -> Result, SignError> { - if let Ok(ecdsa_p256) = EcdsaSigningKey::new( - der, - SignatureScheme::ECDSA_NISTP256_SHA256, - &signature::ECDSA_P256_SHA256_ASN1_SIGNING, - ) { - return Ok(Arc::new(ecdsa_p256)); - } - - if let Ok(ecdsa_p384) = EcdsaSigningKey::new( - der, - SignatureScheme::ECDSA_NISTP384_SHA384, - &signature::ECDSA_P384_SHA384_ASN1_SIGNING, - ) { - return Ok(Arc::new(ecdsa_p384)); - } - - Err(SignError(())) -} - -/// Parse `der` as any EdDSA key type, returning the first which works. -pub fn any_eddsa_type(der: &key::PrivateKey) -> Result, SignError> { - if let Ok(ed25519) = Ed25519SigningKey::new(der, SignatureScheme::ED25519) { - return Ok(Arc::new(ed25519)); - } - - // TODO: Add support for Ed448 - - Err(SignError(())) -} - -/// A `SigningKey` for RSA-PKCS1 or RSA-PSS. -/// -/// This is used by the test suite, so it must be `pub`, but it isn't part of -/// the public, stable, API. -#[doc(hidden)] -pub struct RsaSigningKey { - key: Arc, -} - -static ALL_RSA_SCHEMES: &[SignatureScheme] = &[ - SignatureScheme::RSA_PSS_SHA512, - SignatureScheme::RSA_PSS_SHA384, - SignatureScheme::RSA_PSS_SHA256, - SignatureScheme::RSA_PKCS1_SHA512, - SignatureScheme::RSA_PKCS1_SHA384, - SignatureScheme::RSA_PKCS1_SHA256, -]; - -impl RsaSigningKey { - /// Make a new `RsaSigningKey` from a DER encoding, in either - /// PKCS#1 or PKCS#8 format. - pub fn new(der: &key::PrivateKey) -> Result { - RsaKeyPair::from_der(&der.0) - .or_else(|_| RsaKeyPair::from_pkcs8(&der.0)) - .map(|s| Self { key: Arc::new(s) }) - .map_err(|_| SignError(())) - } -} - -impl SigningKey for RsaSigningKey { - fn choose_scheme(&self, offered: &[SignatureScheme]) -> Option> { - ALL_RSA_SCHEMES - .iter() - .find(|scheme| offered.contains(scheme)) - .map(|scheme| RsaSigner::new(Arc::clone(&self.key), *scheme)) - } - - fn algorithm(&self) -> SignatureAlgorithm { - SignatureAlgorithm::RSA - } -} - -#[allow(clippy::upper_case_acronyms)] -#[doc(hidden)] -#[deprecated(since = "0.20.0", note = "Use RsaSigningKey")] -pub type RSASigningKey = RsaSigningKey; - -struct RsaSigner { - key: Arc, - scheme: SignatureScheme, - encoding: &'static dyn signature::RsaEncoding, -} - -impl RsaSigner { - fn new(key: Arc, scheme: SignatureScheme) -> Box { - let encoding: &dyn signature::RsaEncoding = match scheme { - SignatureScheme::RSA_PKCS1_SHA256 => &signature::RSA_PKCS1_SHA256, - SignatureScheme::RSA_PKCS1_SHA384 => &signature::RSA_PKCS1_SHA384, - SignatureScheme::RSA_PKCS1_SHA512 => &signature::RSA_PKCS1_SHA512, - SignatureScheme::RSA_PSS_SHA256 => &signature::RSA_PSS_SHA256, - SignatureScheme::RSA_PSS_SHA384 => &signature::RSA_PSS_SHA384, - SignatureScheme::RSA_PSS_SHA512 => &signature::RSA_PSS_SHA512, - _ => unreachable!(), - }; - - Box::new(Self { - key, - scheme, - encoding, - }) - } -} - -impl Signer for RsaSigner { - fn sign(&self, message: &[u8]) -> Result, Error> { - let mut sig = vec![0; self.key.public_modulus_len()]; - - let rng = ring::rand::SystemRandom::new(); - self.key - .sign(self.encoding, &rng, message, &mut sig) - .map(|_| sig) - .map_err(|_| Error::General("signing failed".to_string())) - } - - fn scheme(&self) -> SignatureScheme { - self.scheme - } -} - -/// A SigningKey that uses exactly one TLS-level SignatureScheme -/// and one ring-level signature::SigningAlgorithm. -/// -/// Compare this to RsaSigningKey, which for a particular key is -/// willing to sign with several algorithms. This is quite poor -/// cryptography practice, but is necessary because a given RSA key -/// is expected to work in TLS1.2 (PKCS#1 signatures) and TLS1.3 -/// (PSS signatures) -- nobody is willing to obtain certificates for -/// different protocol versions. -/// -/// Currently this is only implemented for ECDSA keys. -struct EcdsaSigningKey { - key: Arc, - scheme: SignatureScheme, -} - -impl EcdsaSigningKey { - /// Make a new `ECDSASigningKey` from a DER encoding in PKCS#8 or SEC1 - /// format, expecting a key usable with precisely the given signature - /// scheme. - fn new( - der: &key::PrivateKey, - scheme: SignatureScheme, - sigalg: &'static signature::EcdsaSigningAlgorithm, - ) -> Result { - EcdsaKeyPair::from_pkcs8(sigalg, &der.0) - .map_err(|_| ()) - .or_else(|_| Self::convert_sec1_to_pkcs8(scheme, sigalg, &der.0)) - .map(|kp| Self { - key: Arc::new(kp), - scheme, - }) - } - - /// Convert a SEC1 encoding to PKCS8, and ask ring to parse it. This - /// can be removed once https://github.com/briansmith/ring/pull/1456 - /// (or equivalent) is landed. - fn convert_sec1_to_pkcs8( - scheme: SignatureScheme, - sigalg: &'static signature::EcdsaSigningAlgorithm, - maybe_sec1_der: &[u8], - ) -> Result { - let pkcs8_prefix = match scheme { - SignatureScheme::ECDSA_NISTP256_SHA256 => &PKCS8_PREFIX_ECDSA_NISTP256, - SignatureScheme::ECDSA_NISTP384_SHA384 => &PKCS8_PREFIX_ECDSA_NISTP384, - _ => unreachable!(), // all callers are in this file - }; - - // wrap sec1 encoding in an OCTET STRING - let mut sec1_wrap = Vec::with_capacity(maybe_sec1_der.len() + 8); - sec1_wrap.extend_from_slice(maybe_sec1_der); - wrap_in_asn1_len(&mut sec1_wrap); - sec1_wrap.insert(0, der::Tag::OctetString as u8); - - let mut pkcs8 = Vec::with_capacity(pkcs8_prefix.len() + sec1_wrap.len() + 4); - pkcs8.extend_from_slice(pkcs8_prefix); - pkcs8.extend_from_slice(&sec1_wrap); - wrap_in_sequence(&mut pkcs8); - - EcdsaKeyPair::from_pkcs8(sigalg, &pkcs8).map_err(|_| ()) - } -} - -// This is (line-by-line): -// - INTEGER Version = 0 -// - SEQUENCE (privateKeyAlgorithm) -// - id-ecPublicKey OID -// - prime256v1 OID -const PKCS8_PREFIX_ECDSA_NISTP256: &[u8] = b"\x02\x01\x00\ - \x30\x13\ - \x06\x07\x2a\x86\x48\xce\x3d\x02\x01\ - \x06\x08\x2a\x86\x48\xce\x3d\x03\x01\x07"; - -// This is (line-by-line): -// - INTEGER Version = 0 -// - SEQUENCE (privateKeyAlgorithm) -// - id-ecPublicKey OID -// - secp384r1 OID -const PKCS8_PREFIX_ECDSA_NISTP384: &[u8] = b"\x02\x01\x00\ - \x30\x10\ - \x06\x07\x2a\x86\x48\xce\x3d\x02\x01\ - \x06\x05\x2b\x81\x04\x00\x22"; - -impl SigningKey for EcdsaSigningKey { - fn choose_scheme(&self, offered: &[SignatureScheme]) -> Option> { - if offered.contains(&self.scheme) { - Some(Box::new(EcdsaSigner { - key: Arc::clone(&self.key), - scheme: self.scheme, - })) - } else { - None - } - } - - fn algorithm(&self) -> SignatureAlgorithm { - use crate::msgs::handshake::DecomposedSignatureScheme; - self.scheme.sign() - } -} - -struct EcdsaSigner { - key: Arc, - scheme: SignatureScheme, -} - -impl Signer for EcdsaSigner { - fn sign(&self, message: &[u8]) -> Result, Error> { - let rng = ring::rand::SystemRandom::new(); - self.key - .sign(&rng, message) - .map_err(|_| Error::General("signing failed".into())) - .map(|sig| sig.as_ref().into()) - } - - fn scheme(&self) -> SignatureScheme { - self.scheme - } -} - -/// A SigningKey that uses exactly one TLS-level SignatureScheme -/// and one ring-level signature::SigningAlgorithm. -/// -/// Compare this to RsaSigningKey, which for a particular key is -/// willing to sign with several algorithms. This is quite poor -/// cryptography practice, but is necessary because a given RSA key -/// is expected to work in TLS1.2 (PKCS#1 signatures) and TLS1.3 -/// (PSS signatures) -- nobody is willing to obtain certificates for -/// different protocol versions. -/// -/// Currently this is only implemented for Ed25519 keys. -struct Ed25519SigningKey { - key: Arc, - scheme: SignatureScheme, -} - -impl Ed25519SigningKey { - /// Make a new `Ed25519SigningKey` from a DER encoding in PKCS#8 format, - /// expecting a key usable with precisely the given signature scheme. - fn new(der: &key::PrivateKey, scheme: SignatureScheme) -> Result { - Ed25519KeyPair::from_pkcs8_maybe_unchecked(&der.0) - .map(|kp| Self { - key: Arc::new(kp), - scheme, - }) - .map_err(|_| SignError(())) - } -} - -impl SigningKey for Ed25519SigningKey { - fn choose_scheme(&self, offered: &[SignatureScheme]) -> Option> { - if offered.contains(&self.scheme) { - Some(Box::new(Ed25519Signer { - key: Arc::clone(&self.key), - scheme: self.scheme, - })) - } else { - None - } - } - - fn algorithm(&self) -> SignatureAlgorithm { - use crate::msgs::handshake::DecomposedSignatureScheme; - self.scheme.sign() - } -} - -struct Ed25519Signer { - key: Arc, - scheme: SignatureScheme, -} - -impl Signer for Ed25519Signer { - fn sign(&self, message: &[u8]) -> Result, Error> { - Ok(self.key.sign(message).as_ref().into()) - } - - fn scheme(&self) -> SignatureScheme { - self.scheme - } -} - -/// The set of schemes we support for signatures and -/// that are allowed for TLS1.3. -pub fn supported_sign_tls13() -> &'static [SignatureScheme] { - &[ - SignatureScheme::ECDSA_NISTP384_SHA384, - SignatureScheme::ECDSA_NISTP256_SHA256, - SignatureScheme::RSA_PSS_SHA512, - SignatureScheme::RSA_PSS_SHA384, - SignatureScheme::RSA_PSS_SHA256, - SignatureScheme::ED25519, - ] -} - -/// Errors while signing -#[derive(Debug)] -pub struct SignError(()); - -impl fmt::Display for SignError { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.write_str("sign error") - } -} - -impl StdError for SignError {} - -#[test] -fn can_load_ecdsa_nistp256_pkcs8() { - let key = key::PrivateKey(include_bytes!("testdata/nistp256key.pkcs8.der").to_vec()); - assert!(any_supported_type(&key).is_ok()); - assert!(any_ecdsa_type(&key).is_ok()); - assert!(any_eddsa_type(&key).is_err()); -} - -#[test] -fn can_load_ecdsa_nistp256_sec1() { - let key = key::PrivateKey(include_bytes!("testdata/nistp256key.der").to_vec()); - assert!(any_supported_type(&key).is_ok()); - assert!(any_ecdsa_type(&key).is_ok()); - assert!(any_eddsa_type(&key).is_err()); -} - -#[test] -fn can_load_ecdsa_nistp384_pkcs8() { - let key = key::PrivateKey(include_bytes!("testdata/nistp384key.pkcs8.der").to_vec()); - assert!(any_supported_type(&key).is_ok()); - assert!(any_ecdsa_type(&key).is_ok()); - assert!(any_eddsa_type(&key).is_err()); -} - -#[test] -fn can_load_ecdsa_nistp384_sec1() { - let key = key::PrivateKey(include_bytes!("testdata/nistp384key.der").to_vec()); - assert!(any_supported_type(&key).is_ok()); - assert!(any_ecdsa_type(&key).is_ok()); - assert!(any_eddsa_type(&key).is_err()); -} - -#[test] -fn can_load_eddsa_pkcs8() { - let key = key::PrivateKey(include_bytes!("testdata/eddsakey.der").to_vec()); - assert!(any_supported_type(&key).is_ok()); - assert!(any_eddsa_type(&key).is_ok()); - assert!(any_ecdsa_type(&key).is_err()); -} - -#[test] -fn can_load_rsa2048_pkcs8() { - let key = key::PrivateKey(include_bytes!("testdata/rsa2048key.pkcs8.der").to_vec()); - assert!(any_supported_type(&key).is_ok()); - assert!(any_eddsa_type(&key).is_err()); - assert!(any_ecdsa_type(&key).is_err()); -} - -#[test] -fn can_load_rsa2048_pkcs1() { - let key = key::PrivateKey(include_bytes!("testdata/rsa2048key.pkcs1.der").to_vec()); - assert!(any_supported_type(&key).is_ok()); - assert!(any_eddsa_type(&key).is_err()); - assert!(any_ecdsa_type(&key).is_err()); -} diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/src/stream.rs temporalio-1.3.0/vendor/rustls-0.20.9/src/stream.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/src/stream.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/src/stream.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,254 +0,0 @@ -use crate::conn::{ConnectionCommon, SideData}; - -use std::io::{IoSlice, Read, Result, Write}; -use std::ops::{Deref, DerefMut}; - -/// This type implements `io::Read` and `io::Write`, encapsulating -/// a Connection `C` and an underlying transport `T`, such as a socket. -/// -/// This allows you to use a rustls Connection like a normal stream. -#[derive(Debug)] -pub struct Stream<'a, C: 'a + ?Sized, T: 'a + Read + Write + ?Sized> { - /// Our TLS connection - pub conn: &'a mut C, - - /// The underlying transport, like a socket - pub sock: &'a mut T, -} - -impl<'a, C, T, S> Stream<'a, C, T> -where - C: 'a + DerefMut + Deref>, - T: 'a + Read + Write, - S: SideData, -{ - /// Make a new Stream using the Connection `conn` and socket-like object - /// `sock`. This does not fail and does no IO. - pub fn new(conn: &'a mut C, sock: &'a mut T) -> Self { - Self { conn, sock } - } - - /// If we're handshaking, complete all the IO for that. - /// If we have data to write, write it all. - fn complete_prior_io(&mut self) -> Result<()> { - if self.conn.is_handshaking() { - self.conn.complete_io(self.sock)?; - } - - if self.conn.wants_write() { - self.conn.complete_io(self.sock)?; - } - - Ok(()) - } -} - -impl<'a, C, T, S> Read for Stream<'a, C, T> -where - C: 'a + DerefMut + Deref>, - T: 'a + Read + Write, - S: SideData, -{ - fn read(&mut self, buf: &mut [u8]) -> Result { - self.complete_prior_io()?; - - // We call complete_io() in a loop since a single call may read only - // a partial packet from the underlying transport. A full packet is - // needed to get more plaintext, which we must do if EOF has not been - // hit. Otherwise, we will prematurely signal EOF by returning 0. We - // determine if EOF has actually been hit by checking if 0 bytes were - // read from the underlying transport. - while self.conn.wants_read() { - let at_eof = self.conn.complete_io(self.sock)?.0 == 0; - if at_eof { - if let Ok(io_state) = self.conn.process_new_packets() { - if at_eof && io_state.plaintext_bytes_to_read() == 0 { - return Ok(0); - } - } - break; - } - } - - self.conn.reader().read(buf) - } - - #[cfg(read_buf)] - fn read_buf(&mut self, cursor: std::io::BorrowedCursor<'_>) -> Result<()> { - self.complete_prior_io()?; - - // We call complete_io() in a loop since a single call may read only - // a partial packet from the underlying transport. A full packet is - // needed to get more plaintext, which we must do if EOF has not been - // hit. Otherwise, we will prematurely signal EOF by returning without - // writing anything. We determine if EOF has actually been hit by - // checking if 0 bytes were read from the underlying transport. - while self.conn.wants_read() { - let at_eof = self.conn.complete_io(self.sock)?.0 == 0; - if at_eof { - if let Ok(io_state) = self.conn.process_new_packets() { - if at_eof && io_state.plaintext_bytes_to_read() == 0 { - return Ok(()); - } - } - break; - } - } - - self.conn.reader().read_buf(cursor) - } -} - -impl<'a, C, T, S> Write for Stream<'a, C, T> -where - C: 'a + DerefMut + Deref>, - T: 'a + Read + Write, - S: SideData, -{ - fn write(&mut self, buf: &[u8]) -> Result { - self.complete_prior_io()?; - - let len = self.conn.writer().write(buf)?; - - // Try to write the underlying transport here, but don't let - // any errors mask the fact we've consumed `len` bytes. - // Callers will learn of permanent errors on the next call. - let _ = self.conn.complete_io(self.sock); - - Ok(len) - } - - fn write_vectored(&mut self, bufs: &[IoSlice<'_>]) -> Result { - self.complete_prior_io()?; - - let len = self - .conn - .writer() - .write_vectored(bufs)?; - - // Try to write the underlying transport here, but don't let - // any errors mask the fact we've consumed `len` bytes. - // Callers will learn of permanent errors on the next call. - let _ = self.conn.complete_io(self.sock); - - Ok(len) - } - - fn flush(&mut self) -> Result<()> { - self.complete_prior_io()?; - - self.conn.writer().flush()?; - if self.conn.wants_write() { - self.conn.complete_io(self.sock)?; - } - Ok(()) - } -} - -/// This type implements `io::Read` and `io::Write`, encapsulating -/// and owning a Connection `C` and an underlying blocking transport -/// `T`, such as a socket. -/// -/// This allows you to use a rustls Connection like a normal stream. -#[derive(Debug)] -pub struct StreamOwned { - /// Our connection - pub conn: C, - - /// The underlying transport, like a socket - pub sock: T, -} - -impl StreamOwned -where - C: DerefMut + Deref>, - T: Read + Write, - S: SideData, -{ - /// Make a new StreamOwned taking the Connection `conn` and socket-like - /// object `sock`. This does not fail and does no IO. - /// - /// This is the same as `Stream::new` except `conn` and `sock` are - /// moved into the StreamOwned. - pub fn new(conn: C, sock: T) -> Self { - Self { conn, sock } - } - - /// Get a reference to the underlying socket - pub fn get_ref(&self) -> &T { - &self.sock - } - - /// Get a mutable reference to the underlying socket - pub fn get_mut(&mut self) -> &mut T { - &mut self.sock - } -} - -impl<'a, C, T, S> StreamOwned -where - C: DerefMut + Deref>, - T: Read + Write, - S: SideData, -{ - fn as_stream(&'a mut self) -> Stream<'a, C, T> { - Stream { - conn: &mut self.conn, - sock: &mut self.sock, - } - } -} - -impl Read for StreamOwned -where - C: DerefMut + Deref>, - T: Read + Write, - S: SideData, -{ - fn read(&mut self, buf: &mut [u8]) -> Result { - self.as_stream().read(buf) - } - - #[cfg(read_buf)] - fn read_buf(&mut self, cursor: std::io::BorrowedCursor<'_>) -> Result<()> { - self.as_stream().read_buf(cursor) - } -} - -impl Write for StreamOwned -where - C: DerefMut + Deref>, - T: Read + Write, - S: SideData, -{ - fn write(&mut self, buf: &[u8]) -> Result { - self.as_stream().write(buf) - } - - fn flush(&mut self) -> Result<()> { - self.as_stream().flush() - } -} - -#[cfg(test)] -mod tests { - use super::{Stream, StreamOwned}; - use crate::client::ClientConnection; - use crate::server::ServerConnection; - use std::net::TcpStream; - - #[test] - fn stream_can_be_created_for_connection_and_tcpstream() { - type _Test<'a> = Stream<'a, ClientConnection, TcpStream>; - } - - #[test] - fn streamowned_can_be_created_for_client_and_tcpstream() { - type _Test = StreamOwned; - } - - #[test] - fn streamowned_can_be_created_for_server_and_tcpstream() { - type _Test = StreamOwned; - } -} diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/src/suites.rs temporalio-1.3.0/vendor/rustls-0.20.9/src/suites.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/src/suites.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/src/suites.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,340 +0,0 @@ -use std::fmt; - -use crate::enums::{CipherSuite, ProtocolVersion, SignatureScheme}; -use crate::msgs::enums::SignatureAlgorithm; -use crate::msgs::handshake::DecomposedSignatureScheme; -#[cfg(feature = "tls12")] -use crate::tls12::Tls12CipherSuite; -#[cfg(feature = "tls12")] -use crate::tls12::{ - TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, - // TLS1.2 suites - TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, - TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, - TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, - TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, - TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, -}; -use crate::tls13::Tls13CipherSuite; -use crate::tls13::{ - TLS13_AES_128_GCM_SHA256, TLS13_AES_256_GCM_SHA384, TLS13_CHACHA20_POLY1305_SHA256, -}; -#[cfg(feature = "tls12")] -use crate::versions::TLS12; -use crate::versions::{SupportedProtocolVersion, TLS13}; - -/// Bulk symmetric encryption scheme used by a cipher suite. -#[allow(non_camel_case_types)] -#[derive(Debug, Eq, PartialEq)] -pub enum BulkAlgorithm { - /// AES with 128-bit keys in Galois counter mode. - Aes128Gcm, - - /// AES with 256-bit keys in Galois counter mode. - Aes256Gcm, - - /// Chacha20 for confidentiality with poly1305 for authenticity. - Chacha20Poly1305, -} - -/// Common state for cipher suites (both for TLS 1.2 and TLS 1.3) -#[derive(Debug)] -pub struct CipherSuiteCommon { - /// The TLS enumeration naming this cipher suite. - pub suite: CipherSuite, - - /// How to do bulk encryption. - pub bulk: BulkAlgorithm, - - pub(crate) aead_algorithm: &'static ring::aead::Algorithm, -} - -/// A cipher suite supported by rustls. -/// -/// All possible instances of this type are provided by the library in -/// the [`ALL_CIPHER_SUITES`] array. -#[derive(Clone, Copy, PartialEq)] -pub enum SupportedCipherSuite { - /// A TLS 1.2 cipher suite - #[cfg(feature = "tls12")] - Tls12(&'static Tls12CipherSuite), - /// A TLS 1.3 cipher suite - Tls13(&'static Tls13CipherSuite), -} - -impl fmt::Debug for SupportedCipherSuite { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - self.suite().fmt(f) - } -} - -impl SupportedCipherSuite { - /// Which hash function to use with this suite. - pub fn hash_algorithm(&self) -> &'static ring::digest::Algorithm { - match self { - #[cfg(feature = "tls12")] - Self::Tls12(inner) => inner.hash_algorithm(), - Self::Tls13(inner) => inner.hash_algorithm(), - } - } - - /// The cipher suite's identifier - pub fn suite(&self) -> CipherSuite { - self.common().suite - } - - pub(crate) fn common(&self) -> &CipherSuiteCommon { - match self { - #[cfg(feature = "tls12")] - Self::Tls12(inner) => &inner.common, - Self::Tls13(inner) => &inner.common, - } - } - - pub(crate) fn tls13(&self) -> Option<&'static Tls13CipherSuite> { - match self { - #[cfg(feature = "tls12")] - Self::Tls12(_) => None, - Self::Tls13(inner) => Some(inner), - } - } - - /// Return supported protocol version for the cipher suite. - pub fn version(&self) -> &'static SupportedProtocolVersion { - match self { - #[cfg(feature = "tls12")] - Self::Tls12(_) => &TLS12, - Self::Tls13(_) => &TLS13, - } - } - - /// Return true if this suite is usable for a key only offering `sig_alg` - /// signatures. This resolves to true for all TLS1.3 suites. - pub fn usable_for_signature_algorithm(&self, _sig_alg: SignatureAlgorithm) -> bool { - match self { - Self::Tls13(_) => true, // no constraint expressed by ciphersuite (e.g., TLS1.3) - #[cfg(feature = "tls12")] - Self::Tls12(inner) => inner - .sign - .iter() - .any(|scheme| scheme.sign() == _sig_alg), - } - } -} - -/// A list of all the cipher suites supported by rustls. -pub static ALL_CIPHER_SUITES: &[SupportedCipherSuite] = &[ - // TLS1.3 suites - TLS13_AES_256_GCM_SHA384, - TLS13_AES_128_GCM_SHA256, - TLS13_CHACHA20_POLY1305_SHA256, - // TLS1.2 suites - #[cfg(feature = "tls12")] - TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, - #[cfg(feature = "tls12")] - TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, - #[cfg(feature = "tls12")] - TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, - #[cfg(feature = "tls12")] - TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, - #[cfg(feature = "tls12")] - TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, - #[cfg(feature = "tls12")] - TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, -]; - -/// The cipher suite configuration that an application should use by default. -/// -/// This will be [`ALL_CIPHER_SUITES`] sans any supported cipher suites that -/// shouldn't be enabled by most applications. -pub static DEFAULT_CIPHER_SUITES: &[SupportedCipherSuite] = ALL_CIPHER_SUITES; - -// These both O(N^2)! -pub(crate) fn choose_ciphersuite_preferring_client( - client_suites: &[CipherSuite], - server_suites: &[SupportedCipherSuite], -) -> Option { - for client_suite in client_suites { - if let Some(selected) = server_suites - .iter() - .find(|x| *client_suite == x.suite()) - { - return Some(*selected); - } - } - - None -} - -pub(crate) fn choose_ciphersuite_preferring_server( - client_suites: &[CipherSuite], - server_suites: &[SupportedCipherSuite], -) -> Option { - if let Some(selected) = server_suites - .iter() - .find(|x| client_suites.contains(&x.suite())) - { - return Some(*selected); - } - - None -} - -/// Return a list of the ciphersuites in `all` with the suites -/// incompatible with `SignatureAlgorithm` `sigalg` removed. -pub(crate) fn reduce_given_sigalg( - all: &[SupportedCipherSuite], - sigalg: SignatureAlgorithm, -) -> Vec { - all.iter() - .filter(|&&suite| suite.usable_for_signature_algorithm(sigalg)) - .copied() - .collect() -} - -/// Return a list of the ciphersuites in `all` with the suites -/// incompatible with the chosen `version` removed. -pub(crate) fn reduce_given_version( - all: &[SupportedCipherSuite], - version: ProtocolVersion, -) -> Vec { - all.iter() - .filter(|&&suite| suite.version().version == version) - .copied() - .collect() -} - -/// Return true if `sigscheme` is usable by any of the given suites. -pub(crate) fn compatible_sigscheme_for_suites( - sigscheme: SignatureScheme, - common_suites: &[SupportedCipherSuite], -) -> bool { - let sigalg = sigscheme.sign(); - common_suites - .iter() - .any(|&suite| suite.usable_for_signature_algorithm(sigalg)) -} - -/// Secrets for transmitting/receiving data over a TLS session. -/// -/// After performing a handshake with rustls, these secrets can be extracted -/// to configure kTLS for a socket, and have the kernel take over encryption -/// and/or decryption. -#[cfg(feature = "secret_extraction")] -pub struct ExtractedSecrets { - /// sequence number and secrets for the "tx" (transmit) direction - pub tx: (u64, ConnectionTrafficSecrets), - - /// sequence number and secrets for the "rx" (receive) direction - pub rx: (u64, ConnectionTrafficSecrets), -} - -/// [ExtractedSecrets] minus the sequence numbers -#[cfg(feature = "secret_extraction")] -pub(crate) struct PartiallyExtractedSecrets { - /// secrets for the "tx" (transmit) direction - pub(crate) tx: ConnectionTrafficSecrets, - - /// secrets for the "rx" (receive) direction - pub(crate) rx: ConnectionTrafficSecrets, -} - -/// Secrets used to encrypt/decrypt data in a TLS session. -/// -/// These can be used to configure kTLS for a socket in one direction. -/// The only other piece of information needed is the sequence number, -/// which is in [ExtractedSecrets]. -#[cfg(feature = "secret_extraction")] -#[non_exhaustive] -pub enum ConnectionTrafficSecrets { - /// Secrets for the AES_128_GCM AEAD algorithm - Aes128Gcm { - /// key (16 bytes) - key: [u8; 16], - /// salt (4 bytes) - salt: [u8; 4], - /// initialization vector (8 bytes, chopped from key block) - iv: [u8; 8], - }, - - /// Secrets for the AES_256_GCM AEAD algorithm - Aes256Gcm { - /// key (32 bytes) - key: [u8; 32], - /// salt (4 bytes) - salt: [u8; 4], - /// initialization vector (8 bytes, chopped from key block) - iv: [u8; 8], - }, - - /// Secrets for the CHACHA20_POLY1305 AEAD algorithm - Chacha20Poly1305 { - /// key (32 bytes) - key: [u8; 32], - /// initialization vector (12 bytes) - iv: [u8; 12], - }, -} - -#[cfg(test)] -mod test { - use super::*; - use crate::enums::CipherSuite; - - #[test] - fn test_client_pref() { - let client = vec![ - CipherSuite::TLS13_AES_128_GCM_SHA256, - CipherSuite::TLS13_AES_256_GCM_SHA384, - ]; - let server = vec![TLS13_AES_256_GCM_SHA384, TLS13_AES_128_GCM_SHA256]; - let chosen = choose_ciphersuite_preferring_client(&client, &server); - assert!(chosen.is_some()); - assert_eq!(chosen.unwrap(), TLS13_AES_128_GCM_SHA256); - } - - #[test] - fn test_server_pref() { - let client = vec![ - CipherSuite::TLS13_AES_128_GCM_SHA256, - CipherSuite::TLS13_AES_256_GCM_SHA384, - ]; - let server = vec![TLS13_AES_256_GCM_SHA384, TLS13_AES_128_GCM_SHA256]; - let chosen = choose_ciphersuite_preferring_server(&client, &server); - assert!(chosen.is_some()); - assert_eq!(chosen.unwrap(), TLS13_AES_256_GCM_SHA384); - } - - #[test] - fn test_pref_fails() { - assert!(choose_ciphersuite_preferring_client( - &[CipherSuite::TLS_NULL_WITH_NULL_NULL], - ALL_CIPHER_SUITES - ) - .is_none()); - assert!(choose_ciphersuite_preferring_server( - &[CipherSuite::TLS_NULL_WITH_NULL_NULL], - ALL_CIPHER_SUITES - ) - .is_none()); - } - - #[test] - fn test_scs_is_debug() { - println!("{:?}", ALL_CIPHER_SUITES); - } - - #[test] - fn test_can_resume_to() { - assert!(TLS13_AES_128_GCM_SHA256 - .tls13() - .unwrap() - .can_resume_from(crate::tls13::TLS13_CHACHA20_POLY1305_SHA256_INTERNAL) - .is_some()); - assert!(TLS13_AES_256_GCM_SHA384 - .tls13() - .unwrap() - .can_resume_from(crate::tls13::TLS13_CHACHA20_POLY1305_SHA256_INTERNAL) - .is_none()); - } -} Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/cert-arstechnica.0.der and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/cert-arstechnica.0.der differ Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/cert-arstechnica.1.der and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/cert-arstechnica.1.der differ Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/cert-arstechnica.2.der and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/cert-arstechnica.2.der differ Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/cert-arstechnica.3.der and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/cert-arstechnica.3.der differ Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/cert-duckduckgo.0.der and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/cert-duckduckgo.0.der differ Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/cert-duckduckgo.1.der and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/cert-duckduckgo.1.der differ Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/cert-github.0.der and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/cert-github.0.der differ Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/cert-github.1.der and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/cert-github.1.der differ Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/cert-google.0.der and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/cert-google.0.der differ Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/cert-google.1.der and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/cert-google.1.der differ Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/cert-google.2.der and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/cert-google.2.der differ Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/cert-hn.0.der and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/cert-hn.0.der differ Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/cert-hn.1.der and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/cert-hn.1.der differ Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/cert-reddit.0.der and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/cert-reddit.0.der differ Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/cert-reddit.1.der and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/cert-reddit.1.der differ Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/cert-rustlang.0.der and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/cert-rustlang.0.der differ Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/cert-rustlang.1.der and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/cert-rustlang.1.der differ Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/cert-rustlang.2.der and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/cert-rustlang.2.der differ Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/cert-rustlang.3.der and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/cert-rustlang.3.der differ Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/cert-servo.0.der and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/cert-servo.0.der differ Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/cert-servo.1.der and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/cert-servo.1.der differ Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/cert-stackoverflow.0.der and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/cert-stackoverflow.0.der differ Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/cert-stackoverflow.1.der and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/cert-stackoverflow.1.der differ Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/cert-stackoverflow.2.der and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/cert-stackoverflow.2.der differ Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/cert-twitter.0.der and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/cert-twitter.0.der differ Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/cert-twitter.1.der and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/cert-twitter.1.der differ Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/cert-wapo.0.der and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/cert-wapo.0.der differ Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/cert-wapo.1.der and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/cert-wapo.1.der differ Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/cert-wikipedia.0.der and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/cert-wikipedia.0.der differ Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/cert-wikipedia.1.der and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/cert-wikipedia.1.der differ Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/deframer-empty-applicationdata.bin and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/deframer-empty-applicationdata.bin differ Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/deframer-invalid-contenttype.bin and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/deframer-invalid-contenttype.bin differ Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/deframer-invalid-empty.bin and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/deframer-invalid-empty.bin differ Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/deframer-invalid-length.bin and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/deframer-invalid-length.bin differ Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/deframer-invalid-version.bin and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/deframer-invalid-version.bin differ Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/deframer-test.1.bin and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/deframer-test.1.bin differ Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/deframer-test.2.bin and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/deframer-test.2.bin differ Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/eddsakey.der and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/eddsakey.der differ Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/nistp256key.der and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/nistp256key.der differ Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/nistp256key.pkcs8.der and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/nistp256key.pkcs8.der differ Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/nistp384key.der and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/nistp384key.der differ Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/nistp384key.pkcs8.der and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/nistp384key.pkcs8.der differ diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/prf-result.1.bin temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/prf-result.1.bin --- temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/prf-result.1.bin 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/prf-result.1.bin 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -ãò)ºr{á{& U|ÔSª²ÃÔ•2›RÔæÛZk0‘é 5ÉɤkNºù¯ "÷}ï«ý7—ÀVK«O¼‘fnï›—üãOyg‰º¤€‚Ñ"îBŧ.ZQÿ÷‡4{f \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/prf-result.2.bin temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/prf-result.2.bin --- temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/prf-result.2.bin 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/prf-result.2.bin 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -aõˆÇ˜ÅÂÿnzœµíÍãùLfš*F8×Õ²ƒ-öx˜uÇ~m†‹Ç\Eâ´ ô¡q;'7hC%’÷ÜŽ¨ï">ê…„¿he= ü@VØð%Ä]ߦæþÇðT´ ÖòУ#>I¤>uÅcí¾"þ%N3¡°éö¹‚fu¾ÇЄVXÜœ9uE@@¹ôlz@á¸ø ¦ 9z(¿õÒïPfhBû¤v2½µOöc?†»È6æ@Ôؘ \ No newline at end of file Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/rsa2048key.pkcs1.der and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/rsa2048key.pkcs1.der differ Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/rsa2048key.pkcs8.der and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/rustls-0.20.9/src/testdata/rsa2048key.pkcs8.der differ diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/src/ticketer.rs temporalio-1.3.0/vendor/rustls-0.20.9/src/ticketer.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/src/ticketer.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/src/ticketer.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,338 +0,0 @@ -use crate::rand; -use crate::server::ProducesTickets; -use crate::Error; - -use ring::aead; -use std::mem; -use std::sync::{Arc, Mutex, MutexGuard}; -use std::time; - -/// The timebase for expiring and rolling tickets and ticketing -/// keys. This is UNIX wall time in seconds. -/// -/// This is guaranteed to be on or after the UNIX epoch. -#[derive(Clone, Copy, Debug)] -pub struct TimeBase(time::Duration); - -impl TimeBase { - #[inline] - pub fn now() -> Result { - Ok(Self( - time::SystemTime::now().duration_since(time::UNIX_EPOCH)?, - )) - } - - #[inline] - pub fn as_secs(&self) -> u64 { - self.0.as_secs() - } -} - -/// This is a `ProducesTickets` implementation which uses -/// any *ring* `aead::Algorithm` to encrypt and authentication -/// the ticket payload. It does not enforce any lifetime -/// constraint. -struct AeadTicketer { - alg: &'static aead::Algorithm, - key: aead::LessSafeKey, - lifetime: u32, -} - -impl AeadTicketer { - /// Make a ticketer with recommended configuration and a random key. - fn new() -> Result { - let mut key = [0u8; 32]; - rand::fill_random(&mut key)?; - - let alg = &aead::CHACHA20_POLY1305; - let key = aead::UnboundKey::new(alg, &key).unwrap(); - - Ok(Self { - alg, - key: aead::LessSafeKey::new(key), - lifetime: 60 * 60 * 12, - }) - } -} - -impl ProducesTickets for AeadTicketer { - fn enabled(&self) -> bool { - true - } - fn lifetime(&self) -> u32 { - self.lifetime - } - - /// Encrypt `message` and return the ciphertext. - fn encrypt(&self, message: &[u8]) -> Option> { - // Random nonce, because a counter is a privacy leak. - let mut nonce_buf = [0u8; 12]; - rand::fill_random(&mut nonce_buf).ok()?; - let nonce = ring::aead::Nonce::assume_unique_for_key(nonce_buf); - let aad = ring::aead::Aad::empty(); - - let mut ciphertext = - Vec::with_capacity(nonce_buf.len() + message.len() + self.key.algorithm().tag_len()); - ciphertext.extend(nonce_buf); - ciphertext.extend(message); - self.key - .seal_in_place_separate_tag(nonce, aad, &mut ciphertext[nonce_buf.len()..]) - .map(|tag| { - ciphertext.extend(tag.as_ref()); - ciphertext - }) - .ok() - } - - /// Decrypt `ciphertext` and recover the original message. - fn decrypt(&self, ciphertext: &[u8]) -> Option> { - // Non-panicking `let (nonce, ciphertext) = ciphertext.split_at(...)`. - let nonce = ciphertext.get(..self.alg.nonce_len())?; - let ciphertext = ciphertext.get(nonce.len()..)?; - - // This won't fail since `nonce` has the required length. - let nonce = ring::aead::Nonce::try_assume_unique_for_key(nonce).ok()?; - - let mut out = Vec::from(ciphertext); - - let plain_len = self - .key - .open_in_place(nonce, aead::Aad::empty(), &mut out) - .ok()? - .len(); - out.truncate(plain_len); - - Some(out) - } -} - -struct TicketSwitcherState { - next: Option>, - current: Box, - previous: Option>, - next_switch_time: u64, -} - -/// A ticketer that has a 'current' sub-ticketer and a single -/// 'previous' ticketer. It creates a new ticketer every so -/// often, demoting the current ticketer. -struct TicketSwitcher { - generator: fn() -> Result, rand::GetRandomFailed>, - lifetime: u32, - state: Mutex, -} - -impl TicketSwitcher { - /// `lifetime` is in seconds, and is how long the current ticketer - /// is used to generate new tickets. Tickets are accepted for no - /// longer than twice this duration. `generator` produces a new - /// `ProducesTickets` implementation. - fn new( - lifetime: u32, - generator: fn() -> Result, rand::GetRandomFailed>, - ) -> Result { - let now = TimeBase::now()?; - Ok(Self { - generator, - lifetime, - state: Mutex::new(TicketSwitcherState { - next: Some(generator()?), - current: generator()?, - previous: None, - next_switch_time: now - .as_secs() - .saturating_add(u64::from(lifetime)), - }), - }) - } - - /// If it's time, demote the `current` ticketer to `previous` (so it - /// does no new encryptions but can do decryption) and use next for a - /// new `current` ticketer. - /// - /// Calling this regularly will ensure timely key erasure. Otherwise, - /// key erasure will be delayed until the next encrypt/decrypt call. - /// - /// For efficiency, this is also responsible for locking the state mutex - /// and returning the mutexguard. - fn maybe_roll(&self, now: TimeBase) -> Option> { - // The code below aims to make switching as efficient as possible - // in the common case that the generator never fails. To achieve this - // we run the following steps: - // 1. If no switch is necessary, just return the mutexguard - // 2. Shift over all of the ticketers (so current becomes previous, - // and next becomes current). After this, other threads can - // start using the new current ticketer. - // 3. unlock mutex and generate new ticketer. - // 4. Place new ticketer in next and return current - // - // There are a few things to note here. First, we don't check whether - // a new switch might be needed in step 4, even though, due to locking - // and entropy collection, significant amounts of time may have passed. - // This is to guarantee that the thread doing the switch will eventually - // make progress. - // - // Second, because next may be None, step 2 can fail. In that case - // we enter a recovery mode where we generate 2 new ticketers, one for - // next and one for the current ticketer. We then take the mutex a - // second time and redo the time check to see if a switch is still - // necessary. - // - // This somewhat convoluted approach ensures good availability of the - // mutex, by ensuring that the state is usable and the mutex not held - // during generation. It also ensures that, so long as the inner - // ticketer never generates panics during encryption/decryption, - // we are guaranteed to never panic when holding the mutex. - - let now = now.as_secs(); - let mut are_recovering = false; // Are we recovering from previous failure? - { - // Scope the mutex so we only take it for as long as needed - let mut state = self.state.lock().ok()?; - - // Fast path in case we do not need to switch to the next ticketer yet - if now <= state.next_switch_time { - return Some(state); - } - - // Make the switch, or mark for recovery if not possible - if let Some(next) = state.next.take() { - state.previous = Some(mem::replace(&mut state.current, next)); - state.next_switch_time = now.saturating_add(u64::from(self.lifetime)); - } else { - are_recovering = true; - } - } - - // We always need a next, so generate it now - let next = (self.generator)().ok()?; - if !are_recovering { - // Normal path, generate new next and place it in the state - let mut state = self.state.lock().ok()?; - state.next = Some(next); - Some(state) - } else { - // Recovering, generate also a new current ticketer, and modify state - // as needed. (we need to redo the time check, otherwise this might - // result in very rapid switching of ticketers) - let new_current = (self.generator)().ok()?; - let mut state = self.state.lock().ok()?; - state.next = Some(next); - if now > state.next_switch_time { - state.previous = Some(mem::replace(&mut state.current, new_current)); - state.next_switch_time = now.saturating_add(u64::from(self.lifetime)); - } - Some(state) - } - } -} - -impl ProducesTickets for TicketSwitcher { - fn lifetime(&self) -> u32 { - self.lifetime * 2 - } - - fn enabled(&self) -> bool { - true - } - - fn encrypt(&self, message: &[u8]) -> Option> { - let state = self.maybe_roll(TimeBase::now().ok()?)?; - - state.current.encrypt(message) - } - - fn decrypt(&self, ciphertext: &[u8]) -> Option> { - let state = self.maybe_roll(TimeBase::now().ok()?)?; - - // Decrypt with the current key; if that fails, try with the previous. - state - .current - .decrypt(ciphertext) - .or_else(|| { - state - .previous - .as_ref() - .and_then(|previous| previous.decrypt(ciphertext)) - }) - } -} - -/// A concrete, safe ticket creation mechanism. -pub struct Ticketer {} - -fn generate_inner() -> Result, rand::GetRandomFailed> { - Ok(Box::new(AeadTicketer::new()?)) -} - -impl Ticketer { - /// Make the recommended Ticketer. This produces tickets - /// with a 12 hour life and randomly generated keys. - /// - /// The encryption mechanism used in Chacha20Poly1305. - pub fn new() -> Result, Error> { - Ok(Arc::new(TicketSwitcher::new(6 * 60 * 60, generate_inner)?)) - } -} - -#[test] -fn basic_pairwise_test() { - let t = Ticketer::new().unwrap(); - assert!(t.enabled()); - let cipher = t.encrypt(b"hello world").unwrap(); - let plain = t.decrypt(&cipher).unwrap(); - assert_eq!(plain, b"hello world"); -} - -#[test] -fn ticketswitcher_switching_test() { - let t = Arc::new(TicketSwitcher::new(1, generate_inner).unwrap()); - let now = TimeBase::now().unwrap(); - let cipher1 = t.encrypt(b"ticket 1").unwrap(); - assert_eq!(t.decrypt(&cipher1).unwrap(), b"ticket 1"); - { - // Trigger new ticketer - t.maybe_roll(TimeBase(now.0 + std::time::Duration::from_secs(10))); - } - let cipher2 = t.encrypt(b"ticket 2").unwrap(); - assert_eq!(t.decrypt(&cipher1).unwrap(), b"ticket 1"); - assert_eq!(t.decrypt(&cipher2).unwrap(), b"ticket 2"); - { - // Trigger new ticketer - t.maybe_roll(TimeBase(now.0 + std::time::Duration::from_secs(20))); - } - let cipher3 = t.encrypt(b"ticket 3").unwrap(); - assert!(t.decrypt(&cipher1).is_none()); - assert_eq!(t.decrypt(&cipher2).unwrap(), b"ticket 2"); - assert_eq!(t.decrypt(&cipher3).unwrap(), b"ticket 3"); -} - -#[cfg(test)] -fn fail_generator() -> Result, rand::GetRandomFailed> { - Err(rand::GetRandomFailed) -} - -#[test] -fn ticketswitcher_recover_test() { - let mut t = TicketSwitcher::new(1, generate_inner).unwrap(); - let now = TimeBase::now().unwrap(); - let cipher1 = t.encrypt(b"ticket 1").unwrap(); - assert_eq!(t.decrypt(&cipher1).unwrap(), b"ticket 1"); - t.generator = fail_generator; - { - // Failed new ticketer - t.maybe_roll(TimeBase(now.0 + std::time::Duration::from_secs(10))); - } - t.generator = generate_inner; - let cipher2 = t.encrypt(b"ticket 2").unwrap(); - assert_eq!(t.decrypt(&cipher1).unwrap(), b"ticket 1"); - assert_eq!(t.decrypt(&cipher2).unwrap(), b"ticket 2"); - { - // recover - t.maybe_roll(TimeBase(now.0 + std::time::Duration::from_secs(20))); - } - let cipher3 = t.encrypt(b"ticket 3").unwrap(); - assert!(t.decrypt(&cipher1).is_none()); - assert_eq!(t.decrypt(&cipher2).unwrap(), b"ticket 2"); - assert_eq!(t.decrypt(&cipher3).unwrap(), b"ticket 3"); -} diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/src/tls12/cipher.rs temporalio-1.3.0/vendor/rustls-0.20.9/src/tls12/cipher.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/src/tls12/cipher.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/src/tls12/cipher.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,236 +0,0 @@ -use crate::cipher::{make_nonce, Iv, MessageDecrypter, MessageEncrypter}; -use crate::enums::ProtocolVersion; -use crate::error::Error; -use crate::msgs::base::Payload; -use crate::msgs::codec; -use crate::msgs::enums::ContentType; -use crate::msgs::fragmenter::MAX_FRAGMENT_LEN; -use crate::msgs::message::{BorrowedPlainMessage, OpaqueMessage, PlainMessage}; - -use ring::aead; - -const TLS12_AAD_SIZE: usize = 8 + 1 + 2 + 2; - -fn make_tls12_aad( - seq: u64, - typ: ContentType, - vers: ProtocolVersion, - len: usize, -) -> ring::aead::Aad<[u8; TLS12_AAD_SIZE]> { - let mut out = [0; TLS12_AAD_SIZE]; - codec::put_u64(seq, &mut out[0..]); - out[8] = typ.get_u8(); - codec::put_u16(vers.get_u16(), &mut out[9..]); - codec::put_u16(len as u16, &mut out[11..]); - ring::aead::Aad::from(out) -} - -pub(crate) struct AesGcm; - -impl Tls12AeadAlgorithm for AesGcm { - fn decrypter(&self, dec_key: aead::LessSafeKey, dec_iv: &[u8]) -> Box { - let mut ret = GcmMessageDecrypter { - dec_key, - dec_salt: [0u8; 4], - }; - - debug_assert_eq!(dec_iv.len(), 4); - ret.dec_salt.copy_from_slice(dec_iv); - Box::new(ret) - } - - fn encrypter( - &self, - enc_key: aead::LessSafeKey, - write_iv: &[u8], - explicit: &[u8], - ) -> Box { - debug_assert_eq!(write_iv.len(), 4); - debug_assert_eq!(explicit.len(), 8); - - // The GCM nonce is constructed from a 32-bit 'salt' derived - // from the master-secret, and a 64-bit explicit part, - // with no specified construction. Thanks for that. - // - // We use the same construction as TLS1.3/ChaCha20Poly1305: - // a starting point extracted from the key block, xored with - // the sequence number. - let mut iv = Iv(Default::default()); - iv.0[..4].copy_from_slice(write_iv); - iv.0[4..].copy_from_slice(explicit); - - Box::new(GcmMessageEncrypter { enc_key, iv }) - } -} - -pub(crate) struct ChaCha20Poly1305; - -impl Tls12AeadAlgorithm for ChaCha20Poly1305 { - fn decrypter(&self, dec_key: aead::LessSafeKey, iv: &[u8]) -> Box { - Box::new(ChaCha20Poly1305MessageDecrypter { - dec_key, - dec_offset: Iv::copy(iv), - }) - } - - fn encrypter( - &self, - enc_key: aead::LessSafeKey, - enc_iv: &[u8], - _: &[u8], - ) -> Box { - Box::new(ChaCha20Poly1305MessageEncrypter { - enc_key, - enc_offset: Iv::copy(enc_iv), - }) - } -} - -pub(crate) trait Tls12AeadAlgorithm: Send + Sync + 'static { - fn decrypter(&self, key: aead::LessSafeKey, iv: &[u8]) -> Box; - fn encrypter( - &self, - key: aead::LessSafeKey, - iv: &[u8], - extra: &[u8], - ) -> Box; -} - -/// A `MessageEncrypter` for AES-GCM AEAD ciphersuites. TLS 1.2 only. -struct GcmMessageEncrypter { - enc_key: aead::LessSafeKey, - iv: Iv, -} - -/// A `MessageDecrypter` for AES-GCM AEAD ciphersuites. TLS1.2 only. -struct GcmMessageDecrypter { - dec_key: aead::LessSafeKey, - dec_salt: [u8; 4], -} - -const GCM_EXPLICIT_NONCE_LEN: usize = 8; -const GCM_OVERHEAD: usize = GCM_EXPLICIT_NONCE_LEN + 16; - -impl MessageDecrypter for GcmMessageDecrypter { - fn decrypt(&self, mut msg: OpaqueMessage, seq: u64) -> Result { - let payload = &mut msg.payload.0; - if payload.len() < GCM_OVERHEAD { - return Err(Error::DecryptError); - } - - let nonce = { - let mut nonce = [0u8; 12]; - nonce[..4].copy_from_slice(&self.dec_salt); - nonce[4..].copy_from_slice(&payload[..8]); - aead::Nonce::assume_unique_for_key(nonce) - }; - - let aad = make_tls12_aad(seq, msg.typ, msg.version, payload.len() - GCM_OVERHEAD); - - let plain_len = self - .dec_key - .open_within(nonce, aad, payload, GCM_EXPLICIT_NONCE_LEN..) - .map_err(|_| Error::DecryptError)? - .len(); - - if plain_len > MAX_FRAGMENT_LEN { - return Err(Error::PeerSentOversizedRecord); - } - - payload.truncate(plain_len); - Ok(msg.into_plain_message()) - } -} - -impl MessageEncrypter for GcmMessageEncrypter { - fn encrypt(&self, msg: BorrowedPlainMessage, seq: u64) -> Result { - let nonce = make_nonce(&self.iv, seq); - let aad = make_tls12_aad(seq, msg.typ, msg.version, msg.payload.len()); - - let total_len = msg.payload.len() + self.enc_key.algorithm().tag_len(); - let mut payload = Vec::with_capacity(GCM_EXPLICIT_NONCE_LEN + total_len); - payload.extend_from_slice(&nonce.as_ref()[4..]); - payload.extend_from_slice(msg.payload); - - self.enc_key - .seal_in_place_separate_tag(nonce, aad, &mut payload[GCM_EXPLICIT_NONCE_LEN..]) - .map(|tag| payload.extend(tag.as_ref())) - .map_err(|_| Error::General("encrypt failed".to_string()))?; - - Ok(OpaqueMessage { - typ: msg.typ, - version: msg.version, - payload: Payload::new(payload), - }) - } -} - -/// The RFC7905/RFC7539 ChaCha20Poly1305 construction. -/// This implementation does the AAD construction required in TLS1.2. -/// TLS1.3 uses `TLS13MessageEncrypter`. -struct ChaCha20Poly1305MessageEncrypter { - enc_key: aead::LessSafeKey, - enc_offset: Iv, -} - -/// The RFC7905/RFC7539 ChaCha20Poly1305 construction. -/// This implementation does the AAD construction required in TLS1.2. -/// TLS1.3 uses `TLS13MessageDecrypter`. -struct ChaCha20Poly1305MessageDecrypter { - dec_key: aead::LessSafeKey, - dec_offset: Iv, -} - -const CHACHAPOLY1305_OVERHEAD: usize = 16; - -impl MessageDecrypter for ChaCha20Poly1305MessageDecrypter { - fn decrypt(&self, mut msg: OpaqueMessage, seq: u64) -> Result { - let payload = &mut msg.payload.0; - - if payload.len() < CHACHAPOLY1305_OVERHEAD { - return Err(Error::DecryptError); - } - - let nonce = make_nonce(&self.dec_offset, seq); - let aad = make_tls12_aad( - seq, - msg.typ, - msg.version, - payload.len() - CHACHAPOLY1305_OVERHEAD, - ); - - let plain_len = self - .dec_key - .open_in_place(nonce, aad, payload) - .map_err(|_| Error::DecryptError)? - .len(); - - if plain_len > MAX_FRAGMENT_LEN { - return Err(Error::PeerSentOversizedRecord); - } - - payload.truncate(plain_len); - Ok(msg.into_plain_message()) - } -} - -impl MessageEncrypter for ChaCha20Poly1305MessageEncrypter { - fn encrypt(&self, msg: BorrowedPlainMessage, seq: u64) -> Result { - let nonce = make_nonce(&self.enc_offset, seq); - let aad = make_tls12_aad(seq, msg.typ, msg.version, msg.payload.len()); - - let total_len = msg.payload.len() + self.enc_key.algorithm().tag_len(); - let mut buf = Vec::with_capacity(total_len); - buf.extend_from_slice(msg.payload); - - self.enc_key - .seal_in_place_append_tag(nonce, aad, &mut buf) - .map_err(|_| Error::General("encrypt failed".to_string()))?; - - Ok(OpaqueMessage { - typ: msg.typ, - version: msg.version, - payload: Payload::new(buf), - }) - } -} diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/src/tls12/mod.rs temporalio-1.3.0/vendor/rustls-0.20.9/src/tls12/mod.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/src/tls12/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/src/tls12/mod.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,537 +0,0 @@ -use crate::cipher::{MessageDecrypter, MessageEncrypter}; -use crate::conn::{CommonState, ConnectionRandoms, Side}; -use crate::enums::{CipherSuite, SignatureScheme}; -use crate::kx; -use crate::msgs::codec::{Codec, Reader}; -use crate::msgs::enums::{AlertDescription, ContentType}; -use crate::msgs::handshake::KeyExchangeAlgorithm; -use crate::suites::{BulkAlgorithm, CipherSuiteCommon, SupportedCipherSuite}; -#[cfg(feature = "secret_extraction")] -use crate::suites::{ConnectionTrafficSecrets, PartiallyExtractedSecrets}; -use crate::Error; - -use ring::aead; -use ring::digest::Digest; - -use std::fmt; - -mod cipher; -pub(crate) use cipher::{AesGcm, ChaCha20Poly1305, Tls12AeadAlgorithm}; - -mod prf; - -/// The TLS1.2 ciphersuite TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256. -pub static TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256: SupportedCipherSuite = - SupportedCipherSuite::Tls12(&Tls12CipherSuite { - common: CipherSuiteCommon { - suite: CipherSuite::TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, - bulk: BulkAlgorithm::Chacha20Poly1305, - aead_algorithm: &ring::aead::CHACHA20_POLY1305, - }, - kx: KeyExchangeAlgorithm::ECDHE, - sign: TLS12_ECDSA_SCHEMES, - fixed_iv_len: 12, - explicit_nonce_len: 0, - aead_alg: &ChaCha20Poly1305, - hmac_algorithm: ring::hmac::HMAC_SHA256, - }); - -/// The TLS1.2 ciphersuite TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 -pub static TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256: SupportedCipherSuite = - SupportedCipherSuite::Tls12(&Tls12CipherSuite { - common: CipherSuiteCommon { - suite: CipherSuite::TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, - bulk: BulkAlgorithm::Chacha20Poly1305, - aead_algorithm: &ring::aead::CHACHA20_POLY1305, - }, - kx: KeyExchangeAlgorithm::ECDHE, - sign: TLS12_RSA_SCHEMES, - fixed_iv_len: 12, - explicit_nonce_len: 0, - aead_alg: &ChaCha20Poly1305, - hmac_algorithm: ring::hmac::HMAC_SHA256, - }); - -/// The TLS1.2 ciphersuite TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 -pub static TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256: SupportedCipherSuite = - SupportedCipherSuite::Tls12(&Tls12CipherSuite { - common: CipherSuiteCommon { - suite: CipherSuite::TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, - bulk: BulkAlgorithm::Aes128Gcm, - aead_algorithm: &ring::aead::AES_128_GCM, - }, - kx: KeyExchangeAlgorithm::ECDHE, - sign: TLS12_RSA_SCHEMES, - fixed_iv_len: 4, - explicit_nonce_len: 8, - aead_alg: &AesGcm, - hmac_algorithm: ring::hmac::HMAC_SHA256, - }); - -/// The TLS1.2 ciphersuite TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 -pub static TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384: SupportedCipherSuite = - SupportedCipherSuite::Tls12(&Tls12CipherSuite { - common: CipherSuiteCommon { - suite: CipherSuite::TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, - bulk: BulkAlgorithm::Aes256Gcm, - aead_algorithm: &ring::aead::AES_256_GCM, - }, - kx: KeyExchangeAlgorithm::ECDHE, - sign: TLS12_RSA_SCHEMES, - fixed_iv_len: 4, - explicit_nonce_len: 8, - aead_alg: &AesGcm, - hmac_algorithm: ring::hmac::HMAC_SHA384, - }); - -/// The TLS1.2 ciphersuite TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 -pub static TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256: SupportedCipherSuite = - SupportedCipherSuite::Tls12(&Tls12CipherSuite { - common: CipherSuiteCommon { - suite: CipherSuite::TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, - bulk: BulkAlgorithm::Aes128Gcm, - aead_algorithm: &ring::aead::AES_128_GCM, - }, - kx: KeyExchangeAlgorithm::ECDHE, - sign: TLS12_ECDSA_SCHEMES, - fixed_iv_len: 4, - explicit_nonce_len: 8, - aead_alg: &AesGcm, - hmac_algorithm: ring::hmac::HMAC_SHA256, - }); - -/// The TLS1.2 ciphersuite TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 -pub static TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384: SupportedCipherSuite = - SupportedCipherSuite::Tls12(&Tls12CipherSuite { - common: CipherSuiteCommon { - suite: CipherSuite::TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, - bulk: BulkAlgorithm::Aes256Gcm, - aead_algorithm: &ring::aead::AES_256_GCM, - }, - kx: KeyExchangeAlgorithm::ECDHE, - sign: TLS12_ECDSA_SCHEMES, - fixed_iv_len: 4, - explicit_nonce_len: 8, - aead_alg: &AesGcm, - hmac_algorithm: ring::hmac::HMAC_SHA384, - }); - -static TLS12_ECDSA_SCHEMES: &[SignatureScheme] = &[ - SignatureScheme::ED25519, - SignatureScheme::ECDSA_NISTP521_SHA512, - SignatureScheme::ECDSA_NISTP384_SHA384, - SignatureScheme::ECDSA_NISTP256_SHA256, -]; - -static TLS12_RSA_SCHEMES: &[SignatureScheme] = &[ - SignatureScheme::RSA_PSS_SHA512, - SignatureScheme::RSA_PSS_SHA384, - SignatureScheme::RSA_PSS_SHA256, - SignatureScheme::RSA_PKCS1_SHA512, - SignatureScheme::RSA_PKCS1_SHA384, - SignatureScheme::RSA_PKCS1_SHA256, -]; - -/// A TLS 1.2 cipher suite supported by rustls. -pub struct Tls12CipherSuite { - /// Common cipher suite fields. - pub common: CipherSuiteCommon, - pub(crate) hmac_algorithm: ring::hmac::Algorithm, - /// How to exchange/agree keys. - pub kx: KeyExchangeAlgorithm, - - /// How to sign messages for authentication. - pub sign: &'static [SignatureScheme], - - /// How long the fixed part of the 'IV' is. - /// - /// This isn't usually an IV, but we continue the - /// terminology misuse to match the standard. - pub fixed_iv_len: usize, - - /// This is a non-standard extension which extends the - /// key block to provide an initial explicit nonce offset, - /// in a deterministic and safe way. GCM needs this, - /// chacha20poly1305 works this way by design. - pub explicit_nonce_len: usize, - - pub(crate) aead_alg: &'static dyn Tls12AeadAlgorithm, -} - -impl Tls12CipherSuite { - /// Resolve the set of supported `SignatureScheme`s from the - /// offered `SupportedSignatureSchemes`. If we return an empty - /// set, the handshake terminates. - pub fn resolve_sig_schemes(&self, offered: &[SignatureScheme]) -> Vec { - self.sign - .iter() - .filter(|pref| offered.contains(pref)) - .cloned() - .collect() - } - - /// Which hash function to use with this suite. - pub fn hash_algorithm(&self) -> &'static ring::digest::Algorithm { - self.hmac_algorithm.digest_algorithm() - } -} - -impl From<&'static Tls12CipherSuite> for SupportedCipherSuite { - fn from(s: &'static Tls12CipherSuite) -> Self { - Self::Tls12(s) - } -} - -impl PartialEq for Tls12CipherSuite { - fn eq(&self, other: &Self) -> bool { - self.common.suite == other.common.suite - } -} - -impl fmt::Debug for Tls12CipherSuite { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("Tls12CipherSuite") - .field("suite", &self.common.suite) - .field("bulk", &self.common.bulk) - .finish() - } -} - -/// TLS1.2 per-connection keying material -pub(crate) struct ConnectionSecrets { - pub(crate) randoms: ConnectionRandoms, - suite: &'static Tls12CipherSuite, - pub(crate) master_secret: [u8; 48], -} - -impl ConnectionSecrets { - pub(crate) fn from_key_exchange( - kx: kx::KeyExchange, - peer_pub_key: &[u8], - ems_seed: Option, - randoms: ConnectionRandoms, - suite: &'static Tls12CipherSuite, - ) -> Result { - let mut ret = Self { - randoms, - suite, - master_secret: [0u8; 48], - }; - - let (label, seed) = match ems_seed { - Some(seed) => ("extended master secret", Seed::Ems(seed)), - None => ( - "master secret", - Seed::Randoms(join_randoms(&ret.randoms.client, &ret.randoms.server)), - ), - }; - - kx.complete(peer_pub_key, |secret| { - prf::prf( - &mut ret.master_secret, - suite.hmac_algorithm, - secret, - label.as_bytes(), - seed.as_ref(), - ); - Ok(()) - })?; - - Ok(ret) - } - - pub(crate) fn new_resume( - randoms: ConnectionRandoms, - suite: &'static Tls12CipherSuite, - master_secret: &[u8], - ) -> Self { - let mut ret = Self { - randoms, - suite, - master_secret: [0u8; 48], - }; - ret.master_secret - .copy_from_slice(master_secret); - ret - } - - /// Make a `MessageCipherPair` based on the given supported ciphersuite `scs`, - /// and the session's `secrets`. - pub(crate) fn make_cipher_pair(&self, side: Side) -> MessageCipherPair { - fn split_key<'a>( - key_block: &'a [u8], - alg: &'static aead::Algorithm, - ) -> (aead::LessSafeKey, &'a [u8]) { - // Might panic if the key block is too small. - let (key, rest) = key_block.split_at(alg.key_len()); - // Won't panic because its only prerequisite is that `key` is `alg.key_len()` bytes long. - let key = aead::UnboundKey::new(alg, key).unwrap(); - (aead::LessSafeKey::new(key), rest) - } - - // Make a key block, and chop it up. - // nb. we don't implement any ciphersuites with nonzero mac_key_len. - let key_block = self.make_key_block(); - - let suite = self.suite; - let scs = &suite.common; - - let (client_write_key, key_block) = split_key(&key_block, scs.aead_algorithm); - let (server_write_key, key_block) = split_key(key_block, scs.aead_algorithm); - let (client_write_iv, key_block) = key_block.split_at(suite.fixed_iv_len); - let (server_write_iv, extra) = key_block.split_at(suite.fixed_iv_len); - - let (write_key, write_iv, read_key, read_iv) = match side { - Side::Client => ( - client_write_key, - client_write_iv, - server_write_key, - server_write_iv, - ), - Side::Server => ( - server_write_key, - server_write_iv, - client_write_key, - client_write_iv, - ), - }; - - ( - suite - .aead_alg - .decrypter(read_key, read_iv), - suite - .aead_alg - .encrypter(write_key, write_iv, extra), - ) - } - - fn make_key_block(&self) -> Vec { - let suite = &self.suite; - let common = &self.suite.common; - - let len = - (common.aead_algorithm.key_len() + suite.fixed_iv_len) * 2 + suite.explicit_nonce_len; - - let mut out = Vec::new(); - out.resize(len, 0u8); - - // NOTE: opposite order to above for no good reason. - // Don't design security protocols on drugs, kids. - let randoms = join_randoms(&self.randoms.server, &self.randoms.client); - prf::prf( - &mut out, - self.suite.hmac_algorithm, - &self.master_secret, - b"key expansion", - &randoms, - ); - - out - } - - pub(crate) fn suite(&self) -> &'static Tls12CipherSuite { - self.suite - } - - pub(crate) fn get_master_secret(&self) -> Vec { - let mut ret = Vec::new(); - ret.extend_from_slice(&self.master_secret); - ret - } - - fn make_verify_data(&self, handshake_hash: &Digest, label: &[u8]) -> Vec { - let mut out = Vec::new(); - out.resize(12, 0u8); - - prf::prf( - &mut out, - self.suite.hmac_algorithm, - &self.master_secret, - label, - handshake_hash.as_ref(), - ); - out - } - - pub(crate) fn client_verify_data(&self, handshake_hash: &Digest) -> Vec { - self.make_verify_data(handshake_hash, b"client finished") - } - - pub(crate) fn server_verify_data(&self, handshake_hash: &Digest) -> Vec { - self.make_verify_data(handshake_hash, b"server finished") - } - - pub(crate) fn export_keying_material( - &self, - output: &mut [u8], - label: &[u8], - context: Option<&[u8]>, - ) { - let mut randoms = Vec::new(); - randoms.extend_from_slice(&self.randoms.client); - randoms.extend_from_slice(&self.randoms.server); - if let Some(context) = context { - assert!(context.len() <= 0xffff); - (context.len() as u16).encode(&mut randoms); - randoms.extend_from_slice(context); - } - - prf::prf( - output, - self.suite.hmac_algorithm, - &self.master_secret, - label, - &randoms, - ) - } - - #[cfg(feature = "secret_extraction")] - pub(crate) fn extract_secrets(&self, side: Side) -> Result { - // Make a key block, and chop it up - let key_block = self.make_key_block(); - - let suite = self.suite; - let algo = suite.common.aead_algorithm; - - let (client_key, key_block) = key_block.split_at(algo.key_len()); - let (server_key, key_block) = key_block.split_at(algo.key_len()); - let (client_iv, key_block) = key_block.split_at(suite.fixed_iv_len); - let (server_iv, extra) = key_block.split_at(suite.fixed_iv_len); - - // A key/IV pair (fixed IV len is 4 for GCM, 12 for Chacha) - struct Pair<'a> { - key: &'a [u8], - iv: &'a [u8], - } - - let client_pair = Pair { - key: client_key, - iv: client_iv, - }; - let server_pair = Pair { - key: server_key, - iv: server_iv, - }; - - let (client_secrets, server_secrets) = if algo == &ring::aead::AES_128_GCM { - let extract = |pair: Pair| -> ConnectionTrafficSecrets { - let mut key = [0u8; 16]; - key.copy_from_slice(pair.key); - - let mut salt = [0u8; 4]; - salt.copy_from_slice(pair.iv); - - let mut iv = [0u8; 8]; - iv.copy_from_slice(&extra[..8]); - - ConnectionTrafficSecrets::Aes128Gcm { key, salt, iv } - }; - - (extract(client_pair), extract(server_pair)) - } else if algo == &ring::aead::AES_256_GCM { - let extract = |pair: Pair| -> ConnectionTrafficSecrets { - let mut key = [0u8; 32]; - key.copy_from_slice(pair.key); - - let mut salt = [0u8; 4]; - salt.copy_from_slice(pair.iv); - - let mut iv = [0u8; 8]; - iv.copy_from_slice(&extra[..8]); - - ConnectionTrafficSecrets::Aes256Gcm { key, salt, iv } - }; - - (extract(client_pair), extract(server_pair)) - } else if algo == &ring::aead::CHACHA20_POLY1305 { - let extract = |pair: Pair| -> ConnectionTrafficSecrets { - let mut key = [0u8; 32]; - key.copy_from_slice(pair.key); - - let mut iv = [0u8; 12]; - iv.copy_from_slice(pair.iv); - - ConnectionTrafficSecrets::Chacha20Poly1305 { key, iv } - }; - - (extract(client_pair), extract(server_pair)) - } else { - return Err(Error::General(format!( - "exporting secrets for {:?}: unimplemented", - algo - ))); - }; - - let (tx, rx) = match side { - Side::Client => (client_secrets, server_secrets), - Side::Server => (server_secrets, client_secrets), - }; - Ok(PartiallyExtractedSecrets { tx, rx }) - } -} - -enum Seed { - Ems(Digest), - Randoms([u8; 64]), -} - -impl AsRef<[u8]> for Seed { - fn as_ref(&self) -> &[u8] { - match self { - Self::Ems(seed) => seed.as_ref(), - Self::Randoms(randoms) => randoms.as_ref(), - } - } -} - -fn join_randoms(first: &[u8; 32], second: &[u8; 32]) -> [u8; 64] { - let mut randoms = [0u8; 64]; - randoms[..32].copy_from_slice(first); - randoms[32..].copy_from_slice(second); - randoms -} - -type MessageCipherPair = (Box, Box); - -pub(crate) fn decode_ecdh_params( - common: &mut CommonState, - kx_params: &[u8], -) -> Result { - decode_ecdh_params_::(kx_params).ok_or_else(|| { - common.send_fatal_alert(AlertDescription::DecodeError); - Error::CorruptMessagePayload(ContentType::Handshake) - }) -} - -fn decode_ecdh_params_(kx_params: &[u8]) -> Option { - let mut rd = Reader::init(kx_params); - let ecdh_params = T::read(&mut rd)?; - match rd.any_left() { - false => Some(ecdh_params), - true => None, - } -} - -pub(crate) const DOWNGRADE_SENTINEL: [u8; 8] = [0x44, 0x4f, 0x57, 0x4e, 0x47, 0x52, 0x44, 0x01]; - -#[cfg(test)] -mod tests { - use super::*; - use crate::msgs::handshake::{ClientECDHParams, ServerECDHParams}; - - #[test] - fn server_ecdhe_remaining_bytes() { - let key = kx::KeyExchange::start(&kx::X25519).unwrap(); - let server_params = ServerECDHParams::new(key.group(), key.pubkey.as_ref()); - let mut server_buf = Vec::new(); - server_params.encode(&mut server_buf); - server_buf.push(34); - assert!(decode_ecdh_params_::(&server_buf).is_none()); - } - - #[test] - fn client_ecdhe_invalid() { - assert!(decode_ecdh_params_::(&[34]).is_none()); - } -} diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/src/tls12/prf.rs temporalio-1.3.0/vendor/rustls-0.20.9/src/tls12/prf.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/src/tls12/prf.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/src/tls12/prf.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,67 +0,0 @@ -use ring::hmac; - -fn concat_sign(key: &hmac::Key, a: &[u8], b: &[u8]) -> hmac::Tag { - let mut ctx = hmac::Context::with_key(key); - ctx.update(a); - ctx.update(b); - ctx.sign() -} - -fn p(out: &mut [u8], alg: hmac::Algorithm, secret: &[u8], seed: &[u8]) { - let hmac_key = hmac::Key::new(alg, secret); - - // A(1) - let mut current_a = hmac::sign(&hmac_key, seed); - let chunk_size = alg.digest_algorithm().output_len; - for chunk in out.chunks_mut(chunk_size) { - // P_hash[i] = HMAC_hash(secret, A(i) + seed) - let p_term = concat_sign(&hmac_key, current_a.as_ref(), seed); - chunk.copy_from_slice(&p_term.as_ref()[..chunk.len()]); - - // A(i+1) = HMAC_hash(secret, A(i)) - current_a = hmac::sign(&hmac_key, current_a.as_ref()); - } -} - -fn concat(a: &[u8], b: &[u8]) -> Vec { - let mut ret = Vec::new(); - ret.extend_from_slice(a); - ret.extend_from_slice(b); - ret -} - -pub(crate) fn prf(out: &mut [u8], alg: hmac::Algorithm, secret: &[u8], label: &[u8], seed: &[u8]) { - let joined_seed = concat(label, seed); - p(out, alg, secret, &joined_seed); -} - -#[cfg(test)] -mod tests { - use ring::hmac::{HMAC_SHA256, HMAC_SHA512}; - - #[test] - fn check_sha256() { - let secret = b"\x9b\xbe\x43\x6b\xa9\x40\xf0\x17\xb1\x76\x52\x84\x9a\x71\xdb\x35"; - let seed = b"\xa0\xba\x9f\x93\x6c\xda\x31\x18\x27\xa6\xf7\x96\xff\xd5\x19\x8c"; - let label = b"test label"; - let expect = include_bytes!("../testdata/prf-result.1.bin"); - let mut output = [0u8; 100]; - - super::prf(&mut output, HMAC_SHA256, secret, label, seed); - assert_eq!(expect.len(), output.len()); - assert_eq!(expect.to_vec(), output.to_vec()); - } - - #[test] - fn check_sha512() { - let secret = b"\xb0\x32\x35\x23\xc1\x85\x35\x99\x58\x4d\x88\x56\x8b\xbb\x05\xeb"; - let seed = b"\xd4\x64\x0e\x12\xe4\xbc\xdb\xfb\x43\x7f\x03\xe6\xae\x41\x8e\xe5"; - let label = b"test label"; - let expect = include_bytes!("../testdata/prf-result.2.bin"); - let mut output = [0u8; 196]; - - super::prf(&mut output, HMAC_SHA512, secret, label, seed); - assert_eq!(expect.len(), output.len()); - assert_eq!(expect.to_vec(), output.to_vec()); - } -} diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/src/tls13/key_schedule.rs temporalio-1.3.0/vendor/rustls-0.20.9/src/tls13/key_schedule.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/src/tls13/key_schedule.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/src/tls13/key_schedule.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,800 +0,0 @@ -use crate::cipher::{Iv, IvLen}; -use crate::error::Error; -use crate::msgs::base::PayloadU8; -use crate::KeyLog; -#[cfg(feature = "secret_extraction")] -use crate::{ - conn::Side, - suites::{ConnectionTrafficSecrets, PartiallyExtractedSecrets}, -}; - -/// Key schedule maintenance for TLS1.3 -use ring::{ - aead, - digest::{self, Digest}, - hkdf::{self, KeyType as _}, - hmac, -}; - -/// The kinds of secret we can extract from `KeySchedule`. -#[derive(Debug, Clone, Copy, PartialEq)] -enum SecretKind { - ResumptionPskBinderKey, - ClientEarlyTrafficSecret, - ClientHandshakeTrafficSecret, - ServerHandshakeTrafficSecret, - ClientApplicationTrafficSecret, - ServerApplicationTrafficSecret, - ExporterMasterSecret, - ResumptionMasterSecret, - DerivedSecret, -} - -impl SecretKind { - fn to_bytes(self) -> &'static [u8] { - use self::SecretKind::*; - match self { - ResumptionPskBinderKey => b"res binder", - ClientEarlyTrafficSecret => b"c e traffic", - ClientHandshakeTrafficSecret => b"c hs traffic", - ServerHandshakeTrafficSecret => b"s hs traffic", - ClientApplicationTrafficSecret => b"c ap traffic", - ServerApplicationTrafficSecret => b"s ap traffic", - ExporterMasterSecret => b"exp master", - ResumptionMasterSecret => b"res master", - DerivedSecret => b"derived", - } - } - - fn log_label(self) -> Option<&'static str> { - use self::SecretKind::*; - Some(match self { - ClientEarlyTrafficSecret => "CLIENT_EARLY_TRAFFIC_SECRET", - ClientHandshakeTrafficSecret => "CLIENT_HANDSHAKE_TRAFFIC_SECRET", - ServerHandshakeTrafficSecret => "SERVER_HANDSHAKE_TRAFFIC_SECRET", - ClientApplicationTrafficSecret => "CLIENT_TRAFFIC_SECRET_0", - ServerApplicationTrafficSecret => "SERVER_TRAFFIC_SECRET_0", - ExporterMasterSecret => "EXPORTER_SECRET", - _ => { - return None; - } - }) - } -} - -/// This is the TLS1.3 key schedule. It stores the current secret and -/// the type of hash. This isn't used directly; but only through the -/// typestates. -struct KeySchedule { - current: hkdf::Prk, - algorithm: ring::hkdf::Algorithm, -} - -// We express the state of a contained KeySchedule using these -// typestates. This means we can write code that cannot accidentally -// (e.g.) encrypt application data using a KeySchedule solely constructed -// with an empty or trivial secret, or extract the wrong kind of secrets -// at a given point. - -/// KeySchedule for early data stage. -pub(crate) struct KeyScheduleEarly { - ks: KeySchedule, -} - -impl KeyScheduleEarly { - pub(crate) fn new(algorithm: hkdf::Algorithm, secret: &[u8]) -> Self { - Self { - ks: KeySchedule::new(algorithm, secret), - } - } - - pub(crate) fn client_early_traffic_secret( - &self, - hs_hash: &Digest, - key_log: &dyn KeyLog, - client_random: &[u8; 32], - ) -> hkdf::Prk { - self.ks.derive_logged_secret( - SecretKind::ClientEarlyTrafficSecret, - hs_hash.as_ref(), - key_log, - client_random, - ) - } - - pub(crate) fn resumption_psk_binder_key_and_sign_verify_data( - &self, - hs_hash: &Digest, - ) -> hmac::Tag { - let resumption_psk_binder_key = self - .ks - .derive_for_empty_hash(SecretKind::ResumptionPskBinderKey); - self.ks - .sign_verify_data(&resumption_psk_binder_key, hs_hash) - } -} - -/// Pre-handshake key schedule -/// -/// The inner `KeySchedule` is either constructed without any secrets based on ths HKDF algorithm -/// or is extracted from a `KeyScheduleEarly`. This can then be used to derive the `KeyScheduleHandshakeStart`. -pub(crate) struct KeySchedulePreHandshake { - ks: KeySchedule, -} - -impl KeySchedulePreHandshake { - pub(crate) fn new(algorithm: hkdf::Algorithm) -> Self { - Self { - ks: KeySchedule::new_with_empty_secret(algorithm), - } - } - - pub(crate) fn into_handshake(mut self, secret: &[u8]) -> KeyScheduleHandshakeStart { - self.ks.input_secret(secret); - KeyScheduleHandshakeStart { ks: self.ks } - } -} - -impl From for KeySchedulePreHandshake { - fn from(KeyScheduleEarly { ks }: KeyScheduleEarly) -> Self { - Self { ks } - } -} - -/// KeySchedule during handshake. -pub(crate) struct KeyScheduleHandshakeStart { - ks: KeySchedule, -} - -impl KeyScheduleHandshakeStart { - pub(crate) fn derive_handshake_secrets( - self, - hs_hash: Digest, - key_log: &dyn KeyLog, - client_random: &[u8; 32], - ) -> (KeyScheduleHandshake, hkdf::Prk, hkdf::Prk) { - // Use an empty handshake hash for the initial handshake. - let client_secret = self.ks.derive_logged_secret( - SecretKind::ClientHandshakeTrafficSecret, - hs_hash.as_ref(), - key_log, - client_random, - ); - - let server_secret = self.ks.derive_logged_secret( - SecretKind::ServerHandshakeTrafficSecret, - hs_hash.as_ref(), - key_log, - client_random, - ); - - let new = KeyScheduleHandshake { - ks: self.ks, - client_handshake_traffic_secret: client_secret.clone(), - server_handshake_traffic_secret: server_secret.clone(), - }; - - (new, client_secret, server_secret) - } -} - -pub(crate) struct KeyScheduleHandshake { - ks: KeySchedule, - client_handshake_traffic_secret: hkdf::Prk, - server_handshake_traffic_secret: hkdf::Prk, -} - -impl KeyScheduleHandshake { - pub(crate) fn sign_server_finish(&self, hs_hash: &Digest) -> hmac::Tag { - self.ks - .sign_finish(&self.server_handshake_traffic_secret, hs_hash) - } - - pub(crate) fn client_key(&self) -> &hkdf::Prk { - &self.client_handshake_traffic_secret - } - - pub(crate) fn into_traffic_with_client_finished_pending( - self, - hs_hash: Digest, - key_log: &dyn KeyLog, - client_random: &[u8; 32], - ) -> ( - KeyScheduleTrafficWithClientFinishedPending, - hkdf::Prk, - hkdf::Prk, - ) { - let traffic = KeyScheduleTraffic::new(self.ks, hs_hash, key_log, client_random); - - let client_secret = traffic - .current_client_traffic_secret - .clone(); - let server_secret = traffic - .current_server_traffic_secret - .clone(); - - let new = KeyScheduleTrafficWithClientFinishedPending { - handshake_client_traffic_secret: self.client_handshake_traffic_secret, - traffic, - }; - - (new, client_secret, server_secret) - } -} - -/// KeySchedule during traffic stage, retaining the ability to calculate the client's -/// finished verify_data. The traffic stage key schedule can be extracted from it -/// through signing the client finished hash. -pub(crate) struct KeyScheduleTrafficWithClientFinishedPending { - handshake_client_traffic_secret: hkdf::Prk, - traffic: KeyScheduleTraffic, -} - -impl KeyScheduleTrafficWithClientFinishedPending { - pub(crate) fn client_key(&self) -> &hkdf::Prk { - &self.handshake_client_traffic_secret - } - - pub(crate) fn sign_client_finish( - self, - hs_hash: &Digest, - ) -> (KeyScheduleTraffic, hmac::Tag, hkdf::Prk) { - let tag = self - .traffic - .ks - .sign_finish(&self.handshake_client_traffic_secret, hs_hash); - - let client_secret = self - .traffic - .current_client_traffic_secret - .clone(); - - (self.traffic, tag, client_secret) - } -} - -/// KeySchedule during traffic stage. All traffic & exporter keys are guaranteed -/// to be available. -pub(crate) struct KeyScheduleTraffic { - ks: KeySchedule, - current_client_traffic_secret: hkdf::Prk, - current_server_traffic_secret: hkdf::Prk, - current_exporter_secret: hkdf::Prk, -} - -impl KeyScheduleTraffic { - fn new( - mut ks: KeySchedule, - hs_hash: Digest, - key_log: &dyn KeyLog, - client_random: &[u8; 32], - ) -> Self { - ks.input_empty(); - - let current_client_traffic_secret = ks.derive_logged_secret( - SecretKind::ClientApplicationTrafficSecret, - hs_hash.as_ref(), - key_log, - client_random, - ); - - let current_server_traffic_secret = ks.derive_logged_secret( - SecretKind::ServerApplicationTrafficSecret, - hs_hash.as_ref(), - key_log, - client_random, - ); - - let current_exporter_secret = ks.derive_logged_secret( - SecretKind::ExporterMasterSecret, - hs_hash.as_ref(), - key_log, - client_random, - ); - - Self { - ks, - current_client_traffic_secret, - current_server_traffic_secret, - current_exporter_secret, - } - } - - pub(crate) fn next_server_application_traffic_secret(&mut self) -> hkdf::Prk { - let secret = self - .ks - .derive_next(&self.current_server_traffic_secret); - self.current_server_traffic_secret = secret.clone(); - secret - } - - pub(crate) fn next_client_application_traffic_secret(&mut self) -> hkdf::Prk { - let secret = self - .ks - .derive_next(&self.current_client_traffic_secret); - self.current_client_traffic_secret = secret.clone(); - secret - } - - pub(crate) fn resumption_master_secret_and_derive_ticket_psk( - &self, - hs_hash: &Digest, - nonce: &[u8], - ) -> Vec { - let resumption_master_secret = self.ks.derive( - self.ks.algorithm(), - SecretKind::ResumptionMasterSecret, - hs_hash.as_ref(), - ); - self.ks - .derive_ticket_psk(&resumption_master_secret, nonce) - } - - pub(crate) fn export_keying_material( - &self, - out: &mut [u8], - label: &[u8], - context: Option<&[u8]>, - ) -> Result<(), Error> { - self.ks - .export_keying_material(&self.current_exporter_secret, out, label, context) - } - - #[cfg(feature = "secret_extraction")] - pub(crate) fn extract_secrets( - &self, - algo: &ring::aead::Algorithm, - side: Side, - ) -> Result { - fn expand( - secret: &hkdf::Prk, - ) -> Result<([u8; KEY_LEN], [u8; IV_LEN]), Error> { - let mut key = [0u8; KEY_LEN]; - let mut iv = [0u8; IV_LEN]; - - hkdf_expand_info(secret, PayloadU8Len(key.len()), b"key", &[], |okm| { - okm.fill(&mut key) - }) - .map_err(|_| Error::General("hkdf_expand_info failed".to_string()))?; - - hkdf_expand_info(secret, PayloadU8Len(iv.len()), b"iv", &[], |okm| { - okm.fill(&mut iv) - }) - .map_err(|_| Error::General("hkdf_expand_info failed".to_string()))?; - - Ok((key, iv)) - } - - let client_secrets; - let server_secrets; - - if algo == &ring::aead::AES_128_GCM { - let extract = |secret: &hkdf::Prk| -> Result { - let (key, iv_in) = expand::<16, 12>(secret)?; - - let mut salt = [0u8; 4]; - salt.copy_from_slice(&iv_in[..4]); - - let mut iv = [0u8; 8]; - iv.copy_from_slice(&iv_in[4..]); - - Ok(ConnectionTrafficSecrets::Aes128Gcm { key, salt, iv }) - }; - - client_secrets = extract(&self.current_client_traffic_secret)?; - server_secrets = extract(&self.current_server_traffic_secret)?; - } else if algo == &ring::aead::AES_256_GCM { - let extract = |secret: &hkdf::Prk| -> Result { - let (key, iv_in) = expand::<32, 12>(secret)?; - - let mut salt = [0u8; 4]; - salt.copy_from_slice(&iv_in[..4]); - - let mut iv = [0u8; 8]; - iv.copy_from_slice(&iv_in[4..]); - - Ok(ConnectionTrafficSecrets::Aes256Gcm { key, salt, iv }) - }; - - client_secrets = extract(&self.current_client_traffic_secret)?; - server_secrets = extract(&self.current_server_traffic_secret)?; - } else if algo == &ring::aead::CHACHA20_POLY1305 { - let extract = |secret: &hkdf::Prk| -> Result { - let (key, iv) = expand::<32, 12>(secret)?; - Ok(ConnectionTrafficSecrets::Chacha20Poly1305 { key, iv }) - }; - - client_secrets = extract(&self.current_client_traffic_secret)?; - server_secrets = extract(&self.current_server_traffic_secret)?; - } else { - return Err(Error::General(format!( - "exporting secrets for {:?}: unimplemented", - algo - ))); - } - - let (tx, rx) = match side { - crate::conn::Side::Client => (client_secrets, server_secrets), - crate::conn::Side::Server => (server_secrets, client_secrets), - }; - Ok(PartiallyExtractedSecrets { tx, rx }) - } -} - -impl KeySchedule { - fn new(algorithm: hkdf::Algorithm, secret: &[u8]) -> Self { - let zeroes = [0u8; digest::MAX_OUTPUT_LEN]; - let salt = hkdf::Salt::new(algorithm, &zeroes[..algorithm.len()]); - Self { - current: salt.extract(secret), - algorithm, - } - } - - #[inline] - fn algorithm(&self) -> hkdf::Algorithm { - self.algorithm - } - - fn new_with_empty_secret(algorithm: hkdf::Algorithm) -> Self { - let zeroes = [0u8; digest::MAX_OUTPUT_LEN]; - Self::new(algorithm, &zeroes[..algorithm.len()]) - } - - /// Input the empty secret. - fn input_empty(&mut self) { - let zeroes = [0u8; digest::MAX_OUTPUT_LEN]; - self.input_secret(&zeroes[..self.algorithm.len()]); - } - - /// Input the given secret. - fn input_secret(&mut self, secret: &[u8]) { - let salt: hkdf::Salt = self.derive_for_empty_hash(SecretKind::DerivedSecret); - self.current = salt.extract(secret); - } - - /// Derive a secret of given `kind`, using current handshake hash `hs_hash`. - fn derive(&self, key_type: L, kind: SecretKind, hs_hash: &[u8]) -> T - where - T: for<'a> From>, - L: hkdf::KeyType, - { - hkdf_expand(&self.current, key_type, kind.to_bytes(), hs_hash) - } - - fn derive_logged_secret( - &self, - kind: SecretKind, - hs_hash: &[u8], - key_log: &dyn KeyLog, - client_random: &[u8; 32], - ) -> hkdf::Prk { - let log_label = kind - .log_label() - .expect("not a loggable secret"); - if key_log.will_log(log_label) { - let secret = self - .derive::(PayloadU8Len(self.algorithm.len()), kind, hs_hash) - .into_inner(); - key_log.log(log_label, client_random, &secret); - } - self.derive(self.algorithm, kind, hs_hash) - } - - /// Derive a secret of given `kind` using the hash of the empty string - /// for the handshake hash. Useful only for - /// `SecretKind::ResumptionPSKBinderKey` and - /// `SecretKind::DerivedSecret`. - fn derive_for_empty_hash(&self, kind: SecretKind) -> T - where - T: for<'a> From>, - { - let digest_alg = self - .algorithm - .hmac_algorithm() - .digest_algorithm(); - let empty_hash = digest::digest(digest_alg, &[]); - self.derive(self.algorithm, kind, empty_hash.as_ref()) - } - - /// Sign the finished message consisting of `hs_hash` using a current - /// traffic secret. - fn sign_finish(&self, base_key: &hkdf::Prk, hs_hash: &Digest) -> hmac::Tag { - self.sign_verify_data(base_key, hs_hash) - } - - /// Sign the finished message consisting of `hs_hash` using the key material - /// `base_key`. - fn sign_verify_data(&self, base_key: &hkdf::Prk, hs_hash: &Digest) -> hmac::Tag { - let hmac_alg = self.algorithm.hmac_algorithm(); - let hmac_key = hkdf_expand(base_key, hmac_alg, b"finished", &[]); - hmac::sign(&hmac_key, hs_hash.as_ref()) - } - - /// Derive the next application traffic secret, returning it. - fn derive_next(&self, base_key: &hkdf::Prk) -> hkdf::Prk { - hkdf_expand(base_key, self.algorithm, b"traffic upd", &[]) - } - - /// Derive the PSK to use given a resumption_master_secret and - /// ticket_nonce. - fn derive_ticket_psk(&self, rms: &hkdf::Prk, nonce: &[u8]) -> Vec { - let payload: PayloadU8 = hkdf_expand( - rms, - PayloadU8Len(self.algorithm.len()), - b"resumption", - nonce, - ); - payload.into_inner() - } - - fn export_keying_material( - &self, - current_exporter_secret: &hkdf::Prk, - out: &mut [u8], - label: &[u8], - context: Option<&[u8]>, - ) -> Result<(), Error> { - let digest_alg = self - .algorithm - .hmac_algorithm() - .digest_algorithm(); - - let h_empty = digest::digest(digest_alg, &[]); - let secret: hkdf::Prk = hkdf_expand( - current_exporter_secret, - self.algorithm, - label, - h_empty.as_ref(), - ); - - let h_context = digest::digest(digest_alg, context.unwrap_or(&[])); - - // TODO: Test what happens when this fails - hkdf_expand_info( - &secret, - PayloadU8Len(out.len()), - b"exporter", - h_context.as_ref(), - |okm| okm.fill(out), - ) - .map_err(|_| Error::General("exporting too much".to_string())) - } -} - -pub(crate) fn hkdf_expand(secret: &hkdf::Prk, key_type: L, label: &[u8], context: &[u8]) -> T -where - T: for<'a> From>, - L: hkdf::KeyType, -{ - hkdf_expand_info(secret, key_type, label, context, |okm| okm.into()) -} - -fn hkdf_expand_info( - secret: &hkdf::Prk, - key_type: L, - label: &[u8], - context: &[u8], - f: F, -) -> T -where - F: for<'b> FnOnce(hkdf::Okm<'b, L>) -> T, - L: hkdf::KeyType, -{ - const LABEL_PREFIX: &[u8] = b"tls13 "; - - let output_len = u16::to_be_bytes(key_type.len() as u16); - let label_len = u8::to_be_bytes((LABEL_PREFIX.len() + label.len()) as u8); - let context_len = u8::to_be_bytes(context.len() as u8); - - let info = &[ - &output_len[..], - &label_len[..], - LABEL_PREFIX, - label, - &context_len[..], - context, - ]; - let okm = secret.expand(info, key_type).unwrap(); - - f(okm) -} - -pub(crate) struct PayloadU8Len(pub(crate) usize); -impl hkdf::KeyType for PayloadU8Len { - fn len(&self) -> usize { - self.0 - } -} - -impl From> for PayloadU8 { - fn from(okm: hkdf::Okm) -> Self { - let mut r = vec![0u8; okm.len().0]; - okm.fill(&mut r[..]).unwrap(); - Self::new(r) - } -} - -pub(crate) fn derive_traffic_key( - secret: &hkdf::Prk, - aead_algorithm: &'static aead::Algorithm, -) -> aead::UnboundKey { - hkdf_expand(secret, aead_algorithm, b"key", &[]) -} - -pub(crate) fn derive_traffic_iv(secret: &hkdf::Prk) -> Iv { - hkdf_expand(secret, IvLen, b"iv", &[]) -} - -#[cfg(test)] -mod test { - use super::{derive_traffic_iv, derive_traffic_key, KeySchedule, SecretKind}; - use crate::KeyLog; - use ring::{aead, hkdf}; - - #[test] - fn test_vectors() { - /* These test vectors generated with OpenSSL. */ - let hs_start_hash = [ - 0xec, 0x14, 0x7a, 0x06, 0xde, 0xa3, 0xc8, 0x84, 0x6c, 0x02, 0xb2, 0x23, 0x8e, 0x41, - 0xbd, 0xdc, 0x9d, 0x89, 0xf9, 0xae, 0xa1, 0x7b, 0x5e, 0xfd, 0x4d, 0x74, 0x82, 0xaf, - 0x75, 0x88, 0x1c, 0x0a, - ]; - - let hs_full_hash = [ - 0x75, 0x1a, 0x3d, 0x4a, 0x14, 0xdf, 0xab, 0xeb, 0x68, 0xe9, 0x2c, 0xa5, 0x91, 0x8e, - 0x24, 0x08, 0xb9, 0xbc, 0xb0, 0x74, 0x89, 0x82, 0xec, 0x9c, 0x32, 0x30, 0xac, 0x30, - 0xbb, 0xeb, 0x23, 0xe2, - ]; - - let ecdhe_secret = [ - 0xe7, 0xb8, 0xfe, 0xf8, 0x90, 0x3b, 0x52, 0x0c, 0xb9, 0xa1, 0x89, 0x71, 0xb6, 0x9d, - 0xd4, 0x5d, 0xca, 0x53, 0xce, 0x2f, 0x12, 0xbf, 0x3b, 0xef, 0x93, 0x15, 0xe3, 0x12, - 0x71, 0xdf, 0x4b, 0x40, - ]; - - let client_hts = [ - 0x61, 0x7b, 0x35, 0x07, 0x6b, 0x9d, 0x0e, 0x08, 0xcf, 0x73, 0x1d, 0x94, 0xa8, 0x66, - 0x14, 0x78, 0x41, 0x09, 0xef, 0x25, 0x55, 0x51, 0x92, 0x1d, 0xd4, 0x6e, 0x04, 0x01, - 0x35, 0xcf, 0x46, 0xab, - ]; - - let client_hts_key = [ - 0x62, 0xd0, 0xdd, 0x00, 0xf6, 0x96, 0x19, 0xd3, 0xb8, 0x19, 0x3a, 0xb4, 0xa0, 0x95, - 0x85, 0xa7, - ]; - - let client_hts_iv = [ - 0xff, 0xf7, 0x5d, 0xf5, 0xad, 0x35, 0xd5, 0xcb, 0x3c, 0x53, 0xf3, 0xa9, - ]; - - let server_hts = [ - 0xfc, 0xf7, 0xdf, 0xe6, 0x4f, 0xa2, 0xc0, 0x4f, 0x62, 0x35, 0x38, 0x7f, 0x43, 0x4e, - 0x01, 0x42, 0x23, 0x36, 0xd9, 0xc0, 0x39, 0xde, 0x68, 0x47, 0xa0, 0xb9, 0xdd, 0xcf, - 0x29, 0xa8, 0x87, 0x59, - ]; - - let server_hts_key = [ - 0x04, 0x67, 0xf3, 0x16, 0xa8, 0x05, 0xb8, 0xc4, 0x97, 0xee, 0x67, 0x04, 0x7b, 0xbc, - 0xbc, 0x54, - ]; - - let server_hts_iv = [ - 0xde, 0x83, 0xa7, 0x3e, 0x9d, 0x81, 0x4b, 0x04, 0xc4, 0x8b, 0x78, 0x09, - ]; - - let client_ats = [ - 0xc1, 0x4a, 0x6d, 0x79, 0x76, 0xd8, 0x10, 0x2b, 0x5a, 0x0c, 0x99, 0x51, 0x49, 0x3f, - 0xee, 0x87, 0xdc, 0xaf, 0xf8, 0x2c, 0x24, 0xca, 0xb2, 0x14, 0xe8, 0xbe, 0x71, 0xa8, - 0x20, 0x6d, 0xbd, 0xa5, - ]; - - let client_ats_key = [ - 0xcc, 0x9f, 0x5f, 0x98, 0x0b, 0x5f, 0x10, 0x30, 0x6c, 0xba, 0xd7, 0xbe, 0x98, 0xd7, - 0x57, 0x2e, - ]; - - let client_ats_iv = [ - 0xb8, 0x09, 0x29, 0xe8, 0xd0, 0x2c, 0x70, 0xf6, 0x11, 0x62, 0xed, 0x6b, - ]; - - let server_ats = [ - 0x2c, 0x90, 0x77, 0x38, 0xd3, 0xf8, 0x37, 0x02, 0xd1, 0xe4, 0x59, 0x8f, 0x48, 0x48, - 0x53, 0x1d, 0x9f, 0x93, 0x65, 0x49, 0x1b, 0x9f, 0x7f, 0x52, 0xc8, 0x22, 0x29, 0x0d, - 0x4c, 0x23, 0x21, 0x92, - ]; - - let server_ats_key = [ - 0x0c, 0xb2, 0x95, 0x62, 0xd8, 0xd8, 0x8f, 0x48, 0xb0, 0x2c, 0xbf, 0xbe, 0xd7, 0xe6, - 0x2b, 0xb3, - ]; - - let server_ats_iv = [ - 0x0d, 0xb2, 0x8f, 0x98, 0x85, 0x86, 0xa1, 0xb7, 0xe4, 0xd5, 0xc6, 0x9c, - ]; - - let hkdf = hkdf::HKDF_SHA256; - let mut ks = KeySchedule::new_with_empty_secret(hkdf); - ks.input_secret(&ecdhe_secret); - - assert_traffic_secret( - &ks, - SecretKind::ClientHandshakeTrafficSecret, - &hs_start_hash, - &client_hts, - &client_hts_key, - &client_hts_iv, - ); - - assert_traffic_secret( - &ks, - SecretKind::ServerHandshakeTrafficSecret, - &hs_start_hash, - &server_hts, - &server_hts_key, - &server_hts_iv, - ); - - ks.input_empty(); - - assert_traffic_secret( - &ks, - SecretKind::ClientApplicationTrafficSecret, - &hs_full_hash, - &client_ats, - &client_ats_key, - &client_ats_iv, - ); - - assert_traffic_secret( - &ks, - SecretKind::ServerApplicationTrafficSecret, - &hs_full_hash, - &server_ats, - &server_ats_key, - &server_ats_iv, - ); - } - - fn assert_traffic_secret( - ks: &KeySchedule, - kind: SecretKind, - hash: &[u8], - expected_traffic_secret: &[u8], - expected_key: &[u8], - expected_iv: &[u8], - ) { - struct Log<'a>(&'a [u8]); - impl KeyLog for Log<'_> { - fn log(&self, _label: &str, _client_random: &[u8], secret: &[u8]) { - assert_eq!(self.0, secret); - } - } - let log = Log(expected_traffic_secret); - let traffic_secret = ks.derive_logged_secret(kind, hash, &log, &[0; 32]); - - // Since we can't test key equality, we test the output of sealing with the key instead. - let aead_alg = &aead::AES_128_GCM; - let key = derive_traffic_key(&traffic_secret, aead_alg); - let seal_output = seal_zeroes(key); - let expected_key = aead::UnboundKey::new(aead_alg, expected_key).unwrap(); - let expected_seal_output = seal_zeroes(expected_key); - assert_eq!(seal_output, expected_seal_output); - assert!(seal_output.len() >= 48); // Sanity check. - - let iv = derive_traffic_iv(&traffic_secret); - assert_eq!(iv.value(), expected_iv); - } - - fn seal_zeroes(key: aead::UnboundKey) -> Vec { - let key = aead::LessSafeKey::new(key); - let mut seal_output = vec![0; 32]; - key.seal_in_place_append_tag( - aead::Nonce::assume_unique_for_key([0; aead::NONCE_LEN]), - aead::Aad::empty(), - &mut seal_output, - ) - .unwrap(); - seal_output - } -} diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/src/tls13/mod.rs temporalio-1.3.0/vendor/rustls-0.20.9/src/tls13/mod.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/src/tls13/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/src/tls13/mod.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,224 +0,0 @@ -use crate::cipher::{make_nonce, Iv, MessageDecrypter, MessageEncrypter}; -use crate::enums::{CipherSuite, ProtocolVersion}; -use crate::error::Error; -use crate::msgs::base::Payload; -use crate::msgs::codec::Codec; -use crate::msgs::enums::ContentType; -use crate::msgs::fragmenter::MAX_FRAGMENT_LEN; -use crate::msgs::message::{BorrowedPlainMessage, OpaqueMessage, PlainMessage}; -use crate::suites::{BulkAlgorithm, CipherSuiteCommon, SupportedCipherSuite}; - -use ring::{aead, hkdf}; - -use std::fmt; - -pub(crate) mod key_schedule; -use key_schedule::{derive_traffic_iv, derive_traffic_key}; - -/// The TLS1.3 ciphersuite TLS_CHACHA20_POLY1305_SHA256 -pub static TLS13_CHACHA20_POLY1305_SHA256: SupportedCipherSuite = - SupportedCipherSuite::Tls13(TLS13_CHACHA20_POLY1305_SHA256_INTERNAL); - -pub(crate) static TLS13_CHACHA20_POLY1305_SHA256_INTERNAL: &Tls13CipherSuite = &Tls13CipherSuite { - common: CipherSuiteCommon { - suite: CipherSuite::TLS13_CHACHA20_POLY1305_SHA256, - bulk: BulkAlgorithm::Chacha20Poly1305, - aead_algorithm: &ring::aead::CHACHA20_POLY1305, - }, - hkdf_algorithm: ring::hkdf::HKDF_SHA256, - #[cfg(feature = "quic")] - confidentiality_limit: u64::MAX, - #[cfg(feature = "quic")] - integrity_limit: 1 << 36, -}; - -/// The TLS1.3 ciphersuite TLS_AES_256_GCM_SHA384 -pub static TLS13_AES_256_GCM_SHA384: SupportedCipherSuite = - SupportedCipherSuite::Tls13(&Tls13CipherSuite { - common: CipherSuiteCommon { - suite: CipherSuite::TLS13_AES_256_GCM_SHA384, - bulk: BulkAlgorithm::Aes256Gcm, - aead_algorithm: &ring::aead::AES_256_GCM, - }, - hkdf_algorithm: ring::hkdf::HKDF_SHA384, - #[cfg(feature = "quic")] - confidentiality_limit: 1 << 23, - #[cfg(feature = "quic")] - integrity_limit: 1 << 52, - }); - -/// The TLS1.3 ciphersuite TLS_AES_128_GCM_SHA256 -pub static TLS13_AES_128_GCM_SHA256: SupportedCipherSuite = - SupportedCipherSuite::Tls13(TLS13_AES_128_GCM_SHA256_INTERNAL); - -pub(crate) static TLS13_AES_128_GCM_SHA256_INTERNAL: &Tls13CipherSuite = &Tls13CipherSuite { - common: CipherSuiteCommon { - suite: CipherSuite::TLS13_AES_128_GCM_SHA256, - bulk: BulkAlgorithm::Aes128Gcm, - aead_algorithm: &ring::aead::AES_128_GCM, - }, - hkdf_algorithm: ring::hkdf::HKDF_SHA256, - #[cfg(feature = "quic")] - confidentiality_limit: 1 << 23, - #[cfg(feature = "quic")] - integrity_limit: 1 << 52, -}; - -/// A TLS 1.3 cipher suite supported by rustls. -pub struct Tls13CipherSuite { - /// Common cipher suite fields. - pub common: CipherSuiteCommon, - pub(crate) hkdf_algorithm: ring::hkdf::Algorithm, - #[cfg(feature = "quic")] - pub(crate) confidentiality_limit: u64, - #[cfg(feature = "quic")] - pub(crate) integrity_limit: u64, -} - -impl Tls13CipherSuite { - pub(crate) fn derive_encrypter(&self, secret: &hkdf::Prk) -> Box { - let key = derive_traffic_key(secret, self.common.aead_algorithm); - let iv = derive_traffic_iv(secret); - - Box::new(Tls13MessageEncrypter { - enc_key: aead::LessSafeKey::new(key), - iv, - }) - } - - /// Derive a `MessageDecrypter` object from the concerned TLS 1.3 - /// cipher suite. - pub fn derive_decrypter(&self, secret: &hkdf::Prk) -> Box { - let key = derive_traffic_key(secret, self.common.aead_algorithm); - let iv = derive_traffic_iv(secret); - - Box::new(Tls13MessageDecrypter { - dec_key: aead::LessSafeKey::new(key), - iv, - }) - } - - /// Which hash function to use with this suite. - pub fn hash_algorithm(&self) -> &'static ring::digest::Algorithm { - self.hkdf_algorithm - .hmac_algorithm() - .digest_algorithm() - } - - /// Can a session using suite self resume from suite prev? - pub fn can_resume_from(&self, prev: &'static Self) -> Option<&'static Self> { - (prev.hash_algorithm() == self.hash_algorithm()).then(|| prev) - } -} - -impl From<&'static Tls13CipherSuite> for SupportedCipherSuite { - fn from(s: &'static Tls13CipherSuite) -> Self { - Self::Tls13(s) - } -} - -impl PartialEq for Tls13CipherSuite { - fn eq(&self, other: &Self) -> bool { - self.common.suite == other.common.suite - } -} - -impl fmt::Debug for Tls13CipherSuite { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("Tls13CipherSuite") - .field("suite", &self.common.suite) - .field("bulk", &self.common.bulk) - .finish() - } -} - -struct Tls13MessageEncrypter { - enc_key: aead::LessSafeKey, - iv: Iv, -} - -struct Tls13MessageDecrypter { - dec_key: aead::LessSafeKey, - iv: Iv, -} - -fn unpad_tls13(v: &mut Vec) -> ContentType { - loop { - match v.pop() { - Some(0) => {} - Some(content_type) => return ContentType::from(content_type), - None => return ContentType::Unknown(0), - } - } -} - -fn make_tls13_aad(len: usize) -> ring::aead::Aad<[u8; TLS13_AAD_SIZE]> { - ring::aead::Aad::from([ - 0x17, // ContentType::ApplicationData - 0x3, // ProtocolVersion (major) - 0x3, // ProtocolVersion (minor) - (len >> 8) as u8, - len as u8, - ]) -} - -// https://datatracker.ietf.org/doc/html/rfc8446#section-5.2 -const TLS13_AAD_SIZE: usize = 1 + 2 + 2; - -impl MessageEncrypter for Tls13MessageEncrypter { - fn encrypt(&self, msg: BorrowedPlainMessage, seq: u64) -> Result { - let total_len = msg.payload.len() + 1 + self.enc_key.algorithm().tag_len(); - let mut payload = Vec::with_capacity(total_len); - payload.extend_from_slice(msg.payload); - msg.typ.encode(&mut payload); - - let nonce = make_nonce(&self.iv, seq); - let aad = make_tls13_aad(total_len); - - self.enc_key - .seal_in_place_append_tag(nonce, aad, &mut payload) - .map_err(|_| Error::General("encrypt failed".to_string()))?; - - Ok(OpaqueMessage { - typ: ContentType::ApplicationData, - version: ProtocolVersion::TLSv1_2, - payload: Payload::new(payload), - }) - } -} - -impl MessageDecrypter for Tls13MessageDecrypter { - fn decrypt(&self, mut msg: OpaqueMessage, seq: u64) -> Result { - let payload = &mut msg.payload.0; - if payload.len() < self.dec_key.algorithm().tag_len() { - return Err(Error::DecryptError); - } - - let nonce = make_nonce(&self.iv, seq); - let aad = make_tls13_aad(payload.len()); - let plain_len = self - .dec_key - .open_in_place(nonce, aad, payload) - .map_err(|_| Error::DecryptError)? - .len(); - - payload.truncate(plain_len); - - if payload.len() > MAX_FRAGMENT_LEN + 1 { - return Err(Error::PeerSentOversizedRecord); - } - - msg.typ = unpad_tls13(payload); - if msg.typ == ContentType::Unknown(0) { - let msg = "peer sent bad TLSInnerPlaintext".to_string(); - return Err(Error::PeerMisbehavedError(msg)); - } - - if payload.len() > MAX_FRAGMENT_LEN { - return Err(Error::PeerSentOversizedRecord); - } - - msg.version = ProtocolVersion::TLSv1_3; - Ok(msg.into_plain_message()) - } -} diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/src/vecbuf.rs temporalio-1.3.0/vendor/rustls-0.20.9/src/vecbuf.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/src/vecbuf.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/src/vecbuf.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,200 +0,0 @@ -use std::cmp; -use std::collections::VecDeque; -use std::io; -use std::io::Read; - -/// This is a byte buffer that is built from a vector -/// of byte vectors. This avoids extra copies when -/// appending a new byte vector, at the expense of -/// more complexity when reading out. -pub(crate) struct ChunkVecBuffer { - chunks: VecDeque>, - limit: Option, -} - -impl ChunkVecBuffer { - pub(crate) fn new(limit: Option) -> Self { - Self { - chunks: VecDeque::new(), - limit, - } - } - - /// Sets the upper limit on how many bytes this - /// object can store. - /// - /// Setting a lower limit than the currently stored - /// data is not an error. - /// - /// A [`None`] limit is interpreted as no limit. - pub(crate) fn set_limit(&mut self, new_limit: Option) { - self.limit = new_limit; - } - - /// If we're empty - pub(crate) fn is_empty(&self) -> bool { - self.chunks.is_empty() - } - - pub(crate) fn is_full(&self) -> bool { - self.limit - .map(|limit| self.len() > limit) - .unwrap_or_default() - } - - /// How many bytes we're storing - pub(crate) fn len(&self) -> usize { - let mut len = 0; - for ch in &self.chunks { - len += ch.len(); - } - len - } - - /// For a proposed append of `len` bytes, how many - /// bytes should we actually append to adhere to the - /// currently set `limit`? - pub(crate) fn apply_limit(&self, len: usize) -> usize { - if let Some(limit) = self.limit { - let space = limit.saturating_sub(self.len()); - cmp::min(len, space) - } else { - len - } - } - - /// Append a copy of `bytes`, perhaps a prefix if - /// we're near the limit. - pub(crate) fn append_limited_copy(&mut self, bytes: &[u8]) -> usize { - let take = self.apply_limit(bytes.len()); - self.append(bytes[..take].to_vec()); - take - } - - /// Take and append the given `bytes`. - pub(crate) fn append(&mut self, bytes: Vec) -> usize { - let len = bytes.len(); - - if !bytes.is_empty() { - self.chunks.push_back(bytes); - } - - len - } - - /// Take one of the chunks from this object. This - /// function panics if the object `is_empty`. - pub(crate) fn pop(&mut self) -> Option> { - self.chunks.pop_front() - } - - /// Read data out of this object, writing it into `buf` - /// and returning how many bytes were written there. - pub(crate) fn read(&mut self, buf: &mut [u8]) -> io::Result { - let mut offs = 0; - - while offs < buf.len() && !self.is_empty() { - let used = self.chunks[0] - .as_slice() - .read(&mut buf[offs..])?; - - self.consume(used); - offs += used; - } - - Ok(offs) - } - - #[cfg(read_buf)] - /// Read data out of this object, writing it into `cursor`. - pub(crate) fn read_buf(&mut self, mut cursor: io::BorrowedCursor<'_>) -> io::Result<()> { - while !self.is_empty() && cursor.capacity() > 0 { - let chunk = self.chunks[0].as_slice(); - let used = std::cmp::min(chunk.len(), cursor.capacity()); - cursor.append(&chunk[..used]); - self.consume(used); - } - - Ok(()) - } - - fn consume(&mut self, mut used: usize) { - while let Some(mut buf) = self.chunks.pop_front() { - if used < buf.len() { - self.chunks - .push_front(buf.split_off(used)); - break; - } else { - used -= buf.len(); - } - } - } - - /// Read data out of this object, passing it `wr` - pub(crate) fn write_to(&mut self, wr: &mut dyn io::Write) -> io::Result { - if self.is_empty() { - return Ok(0); - } - - let mut bufs = [io::IoSlice::new(&[]); 64]; - for (iov, chunk) in bufs.iter_mut().zip(self.chunks.iter()) { - *iov = io::IoSlice::new(chunk); - } - let len = cmp::min(bufs.len(), self.chunks.len()); - let used = wr.write_vectored(&bufs[..len])?; - self.consume(used); - Ok(used) - } -} - -#[cfg(test)] -mod test { - use super::ChunkVecBuffer; - - #[test] - fn short_append_copy_with_limit() { - let mut cvb = ChunkVecBuffer::new(Some(12)); - assert_eq!(cvb.append_limited_copy(b"hello"), 5); - assert_eq!(cvb.append_limited_copy(b"world"), 5); - assert_eq!(cvb.append_limited_copy(b"hello"), 2); - assert_eq!(cvb.append_limited_copy(b"world"), 0); - - let mut buf = [0u8; 12]; - assert_eq!(cvb.read(&mut buf).unwrap(), 12); - assert_eq!(buf.to_vec(), b"helloworldhe".to_vec()); - } - - #[cfg(read_buf)] - #[test] - fn read_buf() { - use std::{io::BorrowedBuf, mem::MaybeUninit}; - - { - let mut cvb = ChunkVecBuffer::new(None); - cvb.append(b"test ".to_vec()); - cvb.append(b"fixture ".to_vec()); - cvb.append(b"data".to_vec()); - - let mut buf = [MaybeUninit::::uninit(); 8]; - let mut buf: BorrowedBuf<'_> = buf.as_mut_slice().into(); - cvb.read_buf(buf.unfilled()).unwrap(); - assert_eq!(buf.filled(), b"test fix"); - buf.clear(); - cvb.read_buf(buf.unfilled()).unwrap(); - assert_eq!(buf.filled(), b"ture dat"); - buf.clear(); - cvb.read_buf(buf.unfilled()).unwrap(); - assert_eq!(buf.filled(), b"a"); - } - - { - let mut cvb = ChunkVecBuffer::new(None); - cvb.append(b"short message".to_vec()); - - let mut buf = [MaybeUninit::::uninit(); 1024]; - let mut buf: BorrowedBuf<'_> = buf.as_mut_slice().into(); - cvb.read_buf(buf.unfilled()).unwrap(); - assert_eq!(buf.filled(), b"short message"); - } - } -} diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/src/verifybench.rs temporalio-1.3.0/vendor/rustls-0.20.9/src/verifybench.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/src/verifybench.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/src/verifybench.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,245 +0,0 @@ -// This program does benchmarking of the functions in verify.rs, -// that do certificate chain validation and signature verification. -// -// Note: we don't use any of the standard 'cargo bench', 'test::Bencher', -// etc. because it's unstable at the time of writing. - -use std::convert::TryInto; -use std::time::{Duration, Instant, SystemTime}; - -use crate::key; -use crate::verify; -use crate::verify::ServerCertVerifier; -use crate::{anchors, OwnedTrustAnchor}; - -use webpki_roots; - -fn duration_nanos(d: Duration) -> u64 { - ((d.as_secs() as f64) * 1e9 + (d.subsec_nanos() as f64)) as u64 -} - -#[test] -fn test_reddit_cert() { - Context::new( - "reddit", - "reddit.com", - &[ - include_bytes!("testdata/cert-reddit.0.der"), - include_bytes!("testdata/cert-reddit.1.der"), - ], - ) - .bench(100) -} - -#[test] -fn test_github_cert() { - Context::new( - "github", - "github.com", - &[ - include_bytes!("testdata/cert-github.0.der"), - include_bytes!("testdata/cert-github.1.der"), - ], - ) - .bench(100) -} - -#[test] -fn test_arstechnica_cert() { - Context::new( - "arstechnica", - "arstechnica.com", - &[ - include_bytes!("testdata/cert-arstechnica.0.der"), - include_bytes!("testdata/cert-arstechnica.1.der"), - include_bytes!("testdata/cert-arstechnica.2.der"), - include_bytes!("testdata/cert-arstechnica.3.der"), - ], - ) - .bench(100) -} - -#[test] -fn test_servo_cert() { - Context::new( - "servo", - "servo.org", - &[ - include_bytes!("testdata/cert-servo.0.der"), - include_bytes!("testdata/cert-servo.1.der"), - ], - ) - .bench(100) -} - -#[test] -fn test_twitter_cert() { - Context::new( - "twitter", - "twitter.com", - &[ - include_bytes!("testdata/cert-twitter.0.der"), - include_bytes!("testdata/cert-twitter.1.der"), - ], - ) - .bench(100) -} - -#[test] -fn test_wikipedia_cert() { - Context::new( - "wikipedia", - "wikipedia.org", - &[ - include_bytes!("testdata/cert-wikipedia.0.der"), - include_bytes!("testdata/cert-wikipedia.1.der"), - ], - ) - .bench(100) -} - -#[test] -fn test_google_cert() { - Context::new( - "google", - "www.google.com", - &[ - include_bytes!("testdata/cert-google.0.der"), - include_bytes!("testdata/cert-google.1.der"), - ], - ) - .bench(100) -} - -#[test] -fn test_hn_cert() { - Context::new( - "hn", - "news.ycombinator.com", - &[ - include_bytes!("testdata/cert-hn.0.der"), - include_bytes!("testdata/cert-hn.1.der"), - ], - ) - .bench(100) -} - -#[test] -fn test_stackoverflow_cert() { - Context::new( - "stackoverflow", - "stackoverflow.com", - &[ - include_bytes!("testdata/cert-stackoverflow.0.der"), - include_bytes!("testdata/cert-stackoverflow.1.der"), - ], - ) - .bench(100) -} - -#[test] -fn test_duckduckgo_cert() { - Context::new( - "duckduckgo", - "duckduckgo.com", - &[ - include_bytes!("testdata/cert-duckduckgo.0.der"), - include_bytes!("testdata/cert-duckduckgo.1.der"), - ], - ) - .bench(100) -} - -#[test] -fn test_rustlang_cert() { - Context::new( - "rustlang", - "www.rust-lang.org", - &[ - include_bytes!("testdata/cert-rustlang.0.der"), - include_bytes!("testdata/cert-rustlang.1.der"), - include_bytes!("testdata/cert-rustlang.2.der"), - ], - ) - .bench(100) -} - -#[test] -fn test_wapo_cert() { - Context::new( - "wapo", - "www.washingtonpost.com", - &[ - include_bytes!("testdata/cert-wapo.0.der"), - include_bytes!("testdata/cert-wapo.1.der"), - ], - ) - .bench(100) -} - -struct Context { - name: &'static str, - domain: &'static str, - roots: anchors::RootCertStore, - chain: Vec, - now: SystemTime, -} - -impl Context { - fn new(name: &'static str, domain: &'static str, certs: &[&'static [u8]]) -> Self { - let mut roots = anchors::RootCertStore::empty(); - roots.add_server_trust_anchors( - webpki_roots::TLS_SERVER_ROOTS - .0 - .iter() - .map(|ta| { - OwnedTrustAnchor::from_subject_spki_name_constraints( - ta.subject, - ta.spki, - ta.name_constraints, - ) - }), - ); - Self { - name, - domain, - roots, - chain: certs - .iter() - .copied() - .map(|bytes| key::Certificate(bytes.to_vec())) - .collect(), - now: SystemTime::UNIX_EPOCH + Duration::from_secs(1640870720), - } - } - - fn bench(&self, count: usize) { - let verifier = verify::WebPkiVerifier::new(self.roots.clone(), None); - const SCTS: &[&[u8]] = &[]; - const OCSP_RESPONSE: &[u8] = &[]; - let mut times = Vec::new(); - - let (end_entity, intermediates) = self.chain.split_first().unwrap(); - for _ in 0..count { - let start = Instant::now(); - let server_name = self.domain.try_into().unwrap(); - verifier - .verify_server_cert( - end_entity, - intermediates, - &server_name, - &mut SCTS.iter().copied(), - OCSP_RESPONSE, - self.now, - ) - .unwrap(); - times.push(duration_nanos(Instant::now().duration_since(start))); - } - - println!( - "verify_server_cert({}): min {:?}us", - self.name, - times.iter().min().unwrap() / 1000 - ); - } -} diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/src/verify.rs temporalio-1.3.0/vendor/rustls-0.20.9/src/verify.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/src/verify.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/src/verify.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,809 +0,0 @@ -use std::fmt; - -use crate::anchors::{OwnedTrustAnchor, RootCertStore}; -use crate::client::ServerName; -use crate::enums::SignatureScheme; -use crate::error::Error; -use crate::key::Certificate; -#[cfg(feature = "logging")] -use crate::log::{debug, trace, warn}; -use crate::msgs::handshake::{DigitallySignedStruct, DistinguishedNames}; - -use ring::digest::Digest; - -use std::convert::TryFrom; -use std::sync::Arc; -use std::time::SystemTime; - -type SignatureAlgorithms = &'static [&'static webpki::SignatureAlgorithm]; - -/// Which signature verification mechanisms we support. No particular -/// order. -static SUPPORTED_SIG_ALGS: SignatureAlgorithms = &[ - &webpki::ECDSA_P256_SHA256, - &webpki::ECDSA_P256_SHA384, - &webpki::ECDSA_P384_SHA256, - &webpki::ECDSA_P384_SHA384, - &webpki::ED25519, - &webpki::RSA_PSS_2048_8192_SHA256_LEGACY_KEY, - &webpki::RSA_PSS_2048_8192_SHA384_LEGACY_KEY, - &webpki::RSA_PSS_2048_8192_SHA512_LEGACY_KEY, - &webpki::RSA_PKCS1_2048_8192_SHA256, - &webpki::RSA_PKCS1_2048_8192_SHA384, - &webpki::RSA_PKCS1_2048_8192_SHA512, - &webpki::RSA_PKCS1_3072_8192_SHA384, -]; - -// Marker types. These are used to bind the fact some verification -// (certificate chain or handshake signature) has taken place into -// protocol states. We use this to have the compiler check that there -// are no 'goto fail'-style elisions of important checks before we -// reach the traffic stage. -// -// These types are public, but cannot be directly constructed. This -// means their origins can be precisely determined by looking -// for their `assertion` constructors. - -/// Zero-sized marker type representing verification of a signature. -#[derive(Debug)] -#[cfg_attr(docsrs, doc(cfg(feature = "dangerous_configuration")))] -pub struct HandshakeSignatureValid(()); - -impl HandshakeSignatureValid { - /// Make a `HandshakeSignatureValid` - pub fn assertion() -> Self { - Self(()) - } -} - -#[derive(Debug)] -pub(crate) struct FinishedMessageVerified(()); - -impl FinishedMessageVerified { - pub(crate) fn assertion() -> Self { - Self(()) - } -} - -/// Zero-sized marker type representing verification of a server cert chain. -#[allow(unreachable_pub)] -#[derive(Debug)] -#[cfg_attr(docsrs, doc(cfg(feature = "dangerous_configuration")))] -pub struct ServerCertVerified(()); - -#[allow(unreachable_pub)] -impl ServerCertVerified { - /// Make a `ServerCertVerified` - pub fn assertion() -> Self { - Self(()) - } -} - -/// Zero-sized marker type representing verification of a client cert chain. -#[derive(Debug)] -#[cfg_attr(docsrs, doc(cfg(feature = "dangerous_configuration")))] -pub struct ClientCertVerified(()); - -impl ClientCertVerified { - /// Make a `ClientCertVerified` - pub fn assertion() -> Self { - Self(()) - } -} - -/// Something that can verify a server certificate chain, and verify -/// signatures made by certificates. -#[allow(unreachable_pub)] -#[cfg_attr(docsrs, doc(cfg(feature = "dangerous_configuration")))] -pub trait ServerCertVerifier: Send + Sync { - /// Verify the end-entity certificate `end_entity` is valid for the - /// hostname `dns_name` and chains to at least one trust anchor. - /// - /// `intermediates` contains all certificates other than `end_entity` that - /// were sent as part of the server's [Certificate] message. It is in the - /// same order that the server sent them and may be empty. - /// - /// Note that none of the certificates have been parsed yet, so it is the responsibility of - /// the implementor to handle invalid data. It is recommended that the implementor returns - /// [`Error::InvalidCertificateEncoding`] when these cases are encountered. - /// - /// `scts` contains the Signed Certificate Timestamps (SCTs) the server - /// sent with the end-entity certificate, if any. - /// - /// [Certificate]: https://datatracker.ietf.org/doc/html/rfc8446#section-4.4.2 - fn verify_server_cert( - &self, - end_entity: &Certificate, - intermediates: &[Certificate], - server_name: &ServerName, - scts: &mut dyn Iterator, - ocsp_response: &[u8], - now: SystemTime, - ) -> Result; - - /// Verify a signature allegedly by the given server certificate. - /// - /// `message` is not hashed, and needs hashing during the verification. - /// The signature and algorithm are within `dss`. `cert` contains the - /// public key to use. - /// - /// `cert` has already been validated by [`ServerCertVerifier::verify_server_cert`]. - /// - /// If and only if the signature is valid, return `Ok(HandshakeSignatureValid)`. - /// Otherwise, return an error -- rustls will send an alert and abort the - /// connection. - /// - /// This method is only called for TLS1.2 handshakes. Note that, in TLS1.2, - /// SignatureSchemes such as `SignatureScheme::ECDSA_NISTP256_SHA256` are not - /// in fact bound to the specific curve implied in their name. - /// - /// This trait method has a default implementation that uses webpki to verify - /// the signature. - fn verify_tls12_signature( - &self, - message: &[u8], - cert: &Certificate, - dss: &DigitallySignedStruct, - ) -> Result { - verify_signed_struct(message, cert, dss) - } - - /// Verify a signature allegedly by the given server certificate. - /// - /// This method is only called for TLS1.3 handshakes. - /// - /// This method is very similar to `verify_tls12_signature`: but note the - /// tighter ECDSA SignatureScheme semantics -- e.g. `SignatureScheme::ECDSA_NISTP256_SHA256` - /// must only validate signatures using public keys on the right curve -- - /// rustls does not enforce this requirement for you. - /// - /// `cert` has already been validated by [`ServerCertVerifier::verify_server_cert`]. - /// - /// If and only if the signature is valid, return `Ok(HandshakeSignatureValid)`. - /// Otherwise, return an error -- rustls will send an alert and abort the - /// connection. - /// - /// This trait method has a default implementation that uses webpki to verify - /// the signature. - fn verify_tls13_signature( - &self, - message: &[u8], - cert: &Certificate, - dss: &DigitallySignedStruct, - ) -> Result { - verify_tls13(message, cert, dss) - } - - /// Return the list of SignatureSchemes that this verifier will handle, - /// in `verify_tls12_signature` and `verify_tls13_signature` calls. - /// - /// This should be in priority order, with the most preferred first. - /// - /// This trait method has a default implementation that reflects the schemes - /// supported by webpki. - fn supported_verify_schemes(&self) -> Vec { - WebPkiVerifier::verification_schemes() - } - - /// Returns `true` if Rustls should ask the server to send SCTs. - /// - /// Signed Certificate Timestamps (SCTs) are used for Certificate - /// Transparency validation. - /// - /// The default implementation of this function returns true. - fn request_scts(&self) -> bool { - true - } -} - -impl fmt::Debug for dyn ServerCertVerifier { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "dyn ServerCertVerifier") - } -} - -/// A type which encapsulates a string that is a syntactically valid DNS name. -#[derive(Clone, Debug, Eq, Hash, PartialEq)] -#[cfg_attr(docsrs, doc(cfg(feature = "dangerous_configuration")))] -pub struct DnsName(pub(crate) webpki::DnsName); - -impl AsRef for DnsName { - fn as_ref(&self) -> &str { - AsRef::::as_ref(&self.0) - } -} - -/// Something that can verify a client certificate chain -#[allow(unreachable_pub)] -#[cfg_attr(docsrs, doc(cfg(feature = "dangerous_configuration")))] -pub trait ClientCertVerifier: Send + Sync { - /// Returns `true` to enable the server to request a client certificate and - /// `false` to skip requesting a client certificate. Defaults to `true`. - fn offer_client_auth(&self) -> bool { - true - } - - /// Return `Some(true)` to require a client certificate and `Some(false)` to make - /// client authentication optional. Return `None` to abort the connection. - /// Defaults to `Some(self.offer_client_auth())`. - fn client_auth_mandatory(&self) -> Option { - Some(self.offer_client_auth()) - } - - /// Returns the [Subjects] of the client authentication trust anchors to - /// share with the client when requesting client authentication. - /// - /// These must be DER-encoded X.500 distinguished names, per RFC 5280. - /// They are sent in the [`certificate_authorities`] extension of a - /// [`CertificateRequest`] message. - /// - /// [Subjects]: https://datatracker.ietf.org/doc/html/rfc5280#section-4.1.2.6 - /// [`CertificateRequest`]: https://datatracker.ietf.org/doc/html/rfc8446#section-4.3.2 - /// [`certificate_authorities`]: https://datatracker.ietf.org/doc/html/rfc8446#section-4.2.4 - /// - /// Return `None` to abort the connection. Return an empty `Vec` to continue - /// the handshake without sending a CertificateRequest message. - fn client_auth_root_subjects(&self) -> Option; - - /// Verify the end-entity certificate `end_entity` is valid, acceptable, - /// and chains to at least one of the trust anchors trusted by - /// this verifier. - /// - /// `intermediates` contains the intermediate certificates the - /// client sent along with the end-entity certificate; it is in the same - /// order that the peer sent them and may be empty. - /// - /// Note that none of the certificates have been parsed yet, so it is the responsibility of - /// the implementor to handle invalid data. It is recommended that the implementor returns - /// [`Error::InvalidCertificateEncoding`] when these cases are encountered. - fn verify_client_cert( - &self, - end_entity: &Certificate, - intermediates: &[Certificate], - now: SystemTime, - ) -> Result; - - /// Verify a signature allegedly by the given client certificate. - /// - /// `message` is not hashed, and needs hashing during the verification. - /// The signature and algorithm are within `dss`. `cert` contains the - /// public key to use. - /// - /// `cert` has already been validated by [`ClientCertVerifier::verify_client_cert`]. - /// - /// If and only if the signature is valid, return `Ok(HandshakeSignatureValid)`. - /// Otherwise, return an error -- rustls will send an alert and abort the - /// connection. - /// - /// This method is only called for TLS1.2 handshakes. Note that, in TLS1.2, - /// SignatureSchemes such as `SignatureScheme::ECDSA_NISTP256_SHA256` are not - /// in fact bound to the specific curve implied in their name. - /// - /// This trait method has a default implementation that uses webpki to verify - /// the signature. - fn verify_tls12_signature( - &self, - message: &[u8], - cert: &Certificate, - dss: &DigitallySignedStruct, - ) -> Result { - verify_signed_struct(message, cert, dss) - } - - /// Verify a signature allegedly by the given client certificate. - /// - /// This method is only called for TLS1.3 handshakes. - /// - /// This method is very similar to `verify_tls12_signature`, but note the - /// tighter ECDSA SignatureScheme semantics in TLS 1.3. For example, - /// `SignatureScheme::ECDSA_NISTP256_SHA256` - /// must only validate signatures using public keys on the right curve -- - /// rustls does not enforce this requirement for you. - /// - /// This trait method has a default implementation that uses webpki to verify - /// the signature. - fn verify_tls13_signature( - &self, - message: &[u8], - cert: &Certificate, - dss: &DigitallySignedStruct, - ) -> Result { - verify_tls13(message, cert, dss) - } - - /// Return the list of SignatureSchemes that this verifier will handle, - /// in `verify_tls12_signature` and `verify_tls13_signature` calls. - /// - /// This should be in priority order, with the most preferred first. - /// - /// This trait method has a default implementation that reflects the schemes - /// supported by webpki. - fn supported_verify_schemes(&self) -> Vec { - WebPkiVerifier::verification_schemes() - } -} - -impl fmt::Debug for dyn ClientCertVerifier { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "dyn ClientCertVerifier") - } -} - -impl ServerCertVerifier for WebPkiVerifier { - /// Will verify the certificate is valid in the following ways: - /// - Signed by a trusted `RootCertStore` CA - /// - Not Expired - /// - Valid for DNS entry - fn verify_server_cert( - &self, - end_entity: &Certificate, - intermediates: &[Certificate], - server_name: &ServerName, - scts: &mut dyn Iterator, - ocsp_response: &[u8], - now: SystemTime, - ) -> Result { - let (cert, chain, trustroots) = prepare(end_entity, intermediates, &self.roots)?; - let webpki_now = webpki::Time::try_from(now).map_err(|_| Error::FailedToGetCurrentTime)?; - - let dns_name = match server_name { - ServerName::DnsName(dns_name) => dns_name, - ServerName::IpAddress(_) => { - return Err(Error::UnsupportedNameType); - } - }; - - let cert = cert - .verify_is_valid_tls_server_cert( - SUPPORTED_SIG_ALGS, - &webpki::TlsServerTrustAnchors(&trustroots), - &chain, - webpki_now, - ) - .map_err(pki_error) - .map(|_| cert)?; - - if let Some(policy) = &self.ct_policy { - policy.verify(end_entity, now, scts)?; - } - - if !ocsp_response.is_empty() { - trace!("Unvalidated OCSP response: {:?}", ocsp_response.to_vec()); - } - - cert.verify_is_valid_for_dns_name(dns_name.0.as_ref()) - .map_err(pki_error) - .map(|_| ServerCertVerified::assertion()) - } -} - -/// Default `ServerCertVerifier`, see the trait impl for more information. -#[allow(unreachable_pub)] -#[cfg_attr(docsrs, doc(cfg(feature = "dangerous_configuration")))] -pub struct WebPkiVerifier { - roots: RootCertStore, - ct_policy: Option, -} - -#[allow(unreachable_pub)] -impl WebPkiVerifier { - /// Constructs a new `WebPkiVerifier`. - /// - /// `roots` is the set of trust anchors to trust for issuing server certs. - /// - /// `ct_logs` is the list of logs that are trusted for Certificate - /// Transparency. Currently CT log enforcement is opportunistic; see - /// . - pub fn new(roots: RootCertStore, ct_policy: Option) -> Self { - Self { roots, ct_policy } - } - - /// Returns the signature verification methods supported by - /// webpki. - pub fn verification_schemes() -> Vec { - vec![ - SignatureScheme::ECDSA_NISTP384_SHA384, - SignatureScheme::ECDSA_NISTP256_SHA256, - SignatureScheme::ED25519, - SignatureScheme::RSA_PSS_SHA512, - SignatureScheme::RSA_PSS_SHA384, - SignatureScheme::RSA_PSS_SHA256, - SignatureScheme::RSA_PKCS1_SHA512, - SignatureScheme::RSA_PKCS1_SHA384, - SignatureScheme::RSA_PKCS1_SHA256, - ] - } -} - -/// Policy for enforcing Certificate Transparency. -/// -/// Because Certificate Transparency logs are sharded on a per-year basis and can be trusted or -/// distrusted relatively quickly, rustls stores a validation deadline. Server certificates will -/// be validated against the configured CT logs until the deadline expires. After the deadline, -/// certificates will no longer be validated, and a warning message will be logged. The deadline -/// may vary depending on how often you deploy builds with updated dependencies. -#[allow(unreachable_pub)] -#[cfg_attr(docsrs, doc(cfg(feature = "dangerous_configuration")))] -pub struct CertificateTransparencyPolicy { - logs: &'static [&'static sct::Log<'static>], - validation_deadline: SystemTime, -} - -impl CertificateTransparencyPolicy { - /// Create a new policy. - #[allow(unreachable_pub)] - pub fn new( - logs: &'static [&'static sct::Log<'static>], - validation_deadline: SystemTime, - ) -> Self { - Self { - logs, - validation_deadline, - } - } - - fn verify( - &self, - cert: &Certificate, - now: SystemTime, - scts: &mut dyn Iterator, - ) -> Result<(), Error> { - if self.logs.is_empty() { - return Ok(()); - } else if self - .validation_deadline - .duration_since(now) - .is_err() - { - warn!("certificate transparency logs have expired, validation disabled"); - return Ok(()); - } - - let now = unix_time_millis(now)?; - let mut last_sct_error = None; - for sct in scts { - #[cfg_attr(not(feature = "logging"), allow(unused_variables))] - match sct::verify_sct(&cert.0, sct, now, self.logs) { - Ok(index) => { - debug!( - "Valid SCT signed by {} on {}", - self.logs[index].operated_by, self.logs[index].description - ); - return Ok(()); - } - Err(e) => { - if e.should_be_fatal() { - return Err(Error::InvalidSct(e)); - } - debug!("SCT ignored because {:?}", e); - last_sct_error = Some(e); - } - } - } - - /* If we were supplied with some logs, and some SCTs, - * but couldn't verify any of them, fail the handshake. */ - if let Some(last_sct_error) = last_sct_error { - warn!("No valid SCTs provided"); - return Err(Error::InvalidSct(last_sct_error)); - } - - Ok(()) - } -} - -type CertChainAndRoots<'a, 'b> = ( - webpki::EndEntityCert<'a>, - Vec<&'a [u8]>, - Vec>, -); - -fn prepare<'a, 'b>( - end_entity: &'a Certificate, - intermediates: &'a [Certificate], - roots: &'b RootCertStore, -) -> Result, Error> { - // EE cert must appear first. - let cert = webpki::EndEntityCert::try_from(end_entity.0.as_ref()).map_err(pki_error)?; - - let intermediates: Vec<&'a [u8]> = intermediates - .iter() - .map(|cert| cert.0.as_ref()) - .collect(); - - let trustroots: Vec = roots - .roots - .iter() - .map(OwnedTrustAnchor::to_trust_anchor) - .collect(); - - Ok((cert, intermediates, trustroots)) -} - -/// A `ClientCertVerifier` that will ensure that every client provides a trusted -/// certificate, without any name checking. -pub struct AllowAnyAuthenticatedClient { - roots: RootCertStore, -} - -impl AllowAnyAuthenticatedClient { - /// Construct a new `AllowAnyAuthenticatedClient`. - /// - /// `roots` is the list of trust anchors to use for certificate validation. - pub fn new(roots: RootCertStore) -> Arc { - Arc::new(Self { roots }) - } -} - -impl ClientCertVerifier for AllowAnyAuthenticatedClient { - fn offer_client_auth(&self) -> bool { - true - } - - #[allow(deprecated)] - fn client_auth_root_subjects(&self) -> Option { - Some(self.roots.subjects()) - } - - fn verify_client_cert( - &self, - end_entity: &Certificate, - intermediates: &[Certificate], - now: SystemTime, - ) -> Result { - let (cert, chain, trustroots) = prepare(end_entity, intermediates, &self.roots)?; - let now = webpki::Time::try_from(now).map_err(|_| Error::FailedToGetCurrentTime)?; - cert.verify_is_valid_tls_client_cert( - SUPPORTED_SIG_ALGS, - &webpki::TlsClientTrustAnchors(&trustroots), - &chain, - now, - ) - .map_err(pki_error) - .map(|_| ClientCertVerified::assertion()) - } -} - -/// A `ClientCertVerifier` that will allow both anonymous and authenticated -/// clients, without any name checking. -/// -/// Client authentication will be requested during the TLS handshake. If the -/// client offers a certificate then this acts like -/// `AllowAnyAuthenticatedClient`, otherwise this acts like `NoClientAuth`. -pub struct AllowAnyAnonymousOrAuthenticatedClient { - inner: AllowAnyAuthenticatedClient, -} - -impl AllowAnyAnonymousOrAuthenticatedClient { - /// Construct a new `AllowAnyAnonymousOrAuthenticatedClient`. - /// - /// `roots` is the list of trust anchors to use for certificate validation. - pub fn new(roots: RootCertStore) -> Arc { - Arc::new(Self { - inner: AllowAnyAuthenticatedClient { roots }, - }) - } -} - -impl ClientCertVerifier for AllowAnyAnonymousOrAuthenticatedClient { - fn offer_client_auth(&self) -> bool { - self.inner.offer_client_auth() - } - - fn client_auth_mandatory(&self) -> Option { - Some(false) - } - - fn client_auth_root_subjects(&self) -> Option { - self.inner.client_auth_root_subjects() - } - - fn verify_client_cert( - &self, - end_entity: &Certificate, - intermediates: &[Certificate], - now: SystemTime, - ) -> Result { - self.inner - .verify_client_cert(end_entity, intermediates, now) - } -} - -fn pki_error(error: webpki::Error) -> Error { - use webpki::Error::*; - match error { - BadDer | BadDerTime => Error::InvalidCertificateEncoding, - InvalidSignatureForPublicKey => Error::InvalidCertificateSignature, - UnsupportedSignatureAlgorithm | UnsupportedSignatureAlgorithmForPublicKey => { - Error::InvalidCertificateSignatureType - } - e => Error::InvalidCertificateData(format!("invalid peer certificate: {}", e)), - } -} - -/// Turns off client authentication. -pub struct NoClientAuth; - -impl NoClientAuth { - /// Constructs a `NoClientAuth` and wraps it in an `Arc`. - pub fn new() -> Arc { - Arc::new(Self) - } -} - -impl ClientCertVerifier for NoClientAuth { - fn offer_client_auth(&self) -> bool { - false - } - - fn client_auth_root_subjects(&self) -> Option { - unimplemented!(); - } - - fn verify_client_cert( - &self, - _end_entity: &Certificate, - _intermediates: &[Certificate], - _now: SystemTime, - ) -> Result { - unimplemented!(); - } -} - -static ECDSA_SHA256: SignatureAlgorithms = - &[&webpki::ECDSA_P256_SHA256, &webpki::ECDSA_P384_SHA256]; - -static ECDSA_SHA384: SignatureAlgorithms = - &[&webpki::ECDSA_P256_SHA384, &webpki::ECDSA_P384_SHA384]; - -static ED25519: SignatureAlgorithms = &[&webpki::ED25519]; - -static RSA_SHA256: SignatureAlgorithms = &[&webpki::RSA_PKCS1_2048_8192_SHA256]; -static RSA_SHA384: SignatureAlgorithms = &[&webpki::RSA_PKCS1_2048_8192_SHA384]; -static RSA_SHA512: SignatureAlgorithms = &[&webpki::RSA_PKCS1_2048_8192_SHA512]; -static RSA_PSS_SHA256: SignatureAlgorithms = &[&webpki::RSA_PSS_2048_8192_SHA256_LEGACY_KEY]; -static RSA_PSS_SHA384: SignatureAlgorithms = &[&webpki::RSA_PSS_2048_8192_SHA384_LEGACY_KEY]; -static RSA_PSS_SHA512: SignatureAlgorithms = &[&webpki::RSA_PSS_2048_8192_SHA512_LEGACY_KEY]; - -fn convert_scheme(scheme: SignatureScheme) -> Result { - match scheme { - // nb. for TLS1.2 the curve is not fixed by SignatureScheme. - SignatureScheme::ECDSA_NISTP256_SHA256 => Ok(ECDSA_SHA256), - SignatureScheme::ECDSA_NISTP384_SHA384 => Ok(ECDSA_SHA384), - - SignatureScheme::ED25519 => Ok(ED25519), - - SignatureScheme::RSA_PKCS1_SHA256 => Ok(RSA_SHA256), - SignatureScheme::RSA_PKCS1_SHA384 => Ok(RSA_SHA384), - SignatureScheme::RSA_PKCS1_SHA512 => Ok(RSA_SHA512), - - SignatureScheme::RSA_PSS_SHA256 => Ok(RSA_PSS_SHA256), - SignatureScheme::RSA_PSS_SHA384 => Ok(RSA_PSS_SHA384), - SignatureScheme::RSA_PSS_SHA512 => Ok(RSA_PSS_SHA512), - - _ => { - let error_msg = format!("received unadvertised sig scheme {:?}", scheme); - Err(Error::PeerMisbehavedError(error_msg)) - } - } -} - -fn verify_sig_using_any_alg( - cert: &webpki::EndEntityCert, - algs: SignatureAlgorithms, - message: &[u8], - sig: &[u8], -) -> Result<(), webpki::Error> { - // TLS doesn't itself give us enough info to map to a single webpki::SignatureAlgorithm. - // Therefore, convert_algs maps to several and we try them all. - for alg in algs { - match cert.verify_signature(alg, message, sig) { - Err(webpki::Error::UnsupportedSignatureAlgorithmForPublicKey) => continue, - res => return res, - } - } - - Err(webpki::Error::UnsupportedSignatureAlgorithmForPublicKey) -} - -fn verify_signed_struct( - message: &[u8], - cert: &Certificate, - dss: &DigitallySignedStruct, -) -> Result { - let possible_algs = convert_scheme(dss.scheme)?; - let cert = webpki::EndEntityCert::try_from(cert.0.as_ref()).map_err(pki_error)?; - - verify_sig_using_any_alg(&cert, possible_algs, message, dss.signature()) - .map_err(pki_error) - .map(|_| HandshakeSignatureValid::assertion()) -} - -fn convert_alg_tls13( - scheme: SignatureScheme, -) -> Result<&'static webpki::SignatureAlgorithm, Error> { - use crate::enums::SignatureScheme::*; - - match scheme { - ECDSA_NISTP256_SHA256 => Ok(&webpki::ECDSA_P256_SHA256), - ECDSA_NISTP384_SHA384 => Ok(&webpki::ECDSA_P384_SHA384), - ED25519 => Ok(&webpki::ED25519), - RSA_PSS_SHA256 => Ok(&webpki::RSA_PSS_2048_8192_SHA256_LEGACY_KEY), - RSA_PSS_SHA384 => Ok(&webpki::RSA_PSS_2048_8192_SHA384_LEGACY_KEY), - RSA_PSS_SHA512 => Ok(&webpki::RSA_PSS_2048_8192_SHA512_LEGACY_KEY), - _ => { - let error_msg = format!("received unsupported sig scheme {:?}", scheme); - Err(Error::PeerMisbehavedError(error_msg)) - } - } -} - -/// Constructs the signature message specified in section 4.4.3 of RFC8446. -pub(crate) fn construct_tls13_client_verify_message(handshake_hash: &Digest) -> Vec { - construct_tls13_verify_message(handshake_hash, b"TLS 1.3, client CertificateVerify\x00") -} - -/// Constructs the signature message specified in section 4.4.3 of RFC8446. -pub(crate) fn construct_tls13_server_verify_message(handshake_hash: &Digest) -> Vec { - construct_tls13_verify_message(handshake_hash, b"TLS 1.3, server CertificateVerify\x00") -} - -fn construct_tls13_verify_message( - handshake_hash: &Digest, - context_string_with_0: &[u8], -) -> Vec { - let mut msg = Vec::new(); - msg.resize(64, 0x20u8); - msg.extend_from_slice(context_string_with_0); - msg.extend_from_slice(handshake_hash.as_ref()); - msg -} - -fn verify_tls13( - msg: &[u8], - cert: &Certificate, - dss: &DigitallySignedStruct, -) -> Result { - let alg = convert_alg_tls13(dss.scheme)?; - - let cert = webpki::EndEntityCert::try_from(cert.0.as_ref()).map_err(pki_error)?; - - cert.verify_signature(alg, msg, dss.signature()) - .map_err(pki_error) - .map(|_| HandshakeSignatureValid::assertion()) -} - -fn unix_time_millis(now: SystemTime) -> Result { - now.duration_since(std::time::UNIX_EPOCH) - .map(|dur| dur.as_secs()) - .map_err(|_| Error::FailedToGetCurrentTime) - .and_then(|secs| { - secs.checked_mul(1000) - .ok_or(Error::FailedToGetCurrentTime) - }) -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn assertions_are_debug() { - assert_eq!( - format!("{:?}", ClientCertVerified::assertion()), - "ClientCertVerified(())" - ); - assert_eq!( - format!("{:?}", HandshakeSignatureValid::assertion()), - "HandshakeSignatureValid(())" - ); - assert_eq!( - format!("{:?}", FinishedMessageVerified::assertion()), - "FinishedMessageVerified(())" - ); - assert_eq!( - format!("{:?}", ServerCertVerified::assertion()), - "ServerCertVerified(())" - ); - } -} diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/src/versions.rs temporalio-1.3.0/vendor/rustls-0.20.9/src/versions.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/src/versions.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/src/versions.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,99 +0,0 @@ -use std::fmt; - -use crate::enums::ProtocolVersion; - -/// A TLS protocol version supported by rustls. -/// -/// All possible instances of this class are provided by the library in -/// the [`ALL_VERSIONS`] array, as well as individually as [`TLS12`] -/// and [`TLS13`]. -#[derive(Eq, PartialEq)] -pub struct SupportedProtocolVersion { - /// The TLS enumeration naming this version. - pub version: ProtocolVersion, - is_private: (), -} - -impl fmt::Debug for SupportedProtocolVersion { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - self.version.fmt(f) - } -} - -/// TLS1.2 -#[cfg(feature = "tls12")] -pub static TLS12: SupportedProtocolVersion = SupportedProtocolVersion { - version: ProtocolVersion::TLSv1_2, - is_private: (), -}; - -/// TLS1.3 -pub static TLS13: SupportedProtocolVersion = SupportedProtocolVersion { - version: ProtocolVersion::TLSv1_3, - is_private: (), -}; - -/// A list of all the protocol versions supported by rustls. -pub static ALL_VERSIONS: &[&SupportedProtocolVersion] = &[ - &TLS13, - #[cfg(feature = "tls12")] - &TLS12, -]; - -/// The version configuration that an application should use by default. -/// -/// This will be [`ALL_VERSIONS`] for now, but gives space in the future -/// to remove a version from here and require users to opt-in to older -/// versions. -pub static DEFAULT_VERSIONS: &[&SupportedProtocolVersion] = ALL_VERSIONS; - -#[derive(Clone)] -pub(crate) struct EnabledVersions { - #[cfg(feature = "tls12")] - tls12: Option<&'static SupportedProtocolVersion>, - tls13: Option<&'static SupportedProtocolVersion>, -} - -impl fmt::Debug for EnabledVersions { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - let mut list = &mut f.debug_list(); - #[cfg(feature = "tls12")] - if let Some(v) = self.tls12 { - list = list.entry(v) - } - if let Some(v) = self.tls13 { - list = list.entry(v) - } - list.finish() - } -} - -impl EnabledVersions { - pub(crate) fn new(versions: &[&'static SupportedProtocolVersion]) -> Self { - let mut ev = Self { - #[cfg(feature = "tls12")] - tls12: None, - tls13: None, - }; - - for v in versions { - match v.version { - #[cfg(feature = "tls12")] - ProtocolVersion::TLSv1_2 => ev.tls12 = Some(v), - ProtocolVersion::TLSv1_3 => ev.tls13 = Some(v), - _ => {} - } - } - - ev - } - - pub(crate) fn contains(&self, version: ProtocolVersion) -> bool { - match version { - #[cfg(feature = "tls12")] - ProtocolVersion::TLSv1_2 => self.tls12.is_some(), - ProtocolVersion::TLSv1_3 => self.tls13.is_some(), - _ => false, - } - } -} diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/src/x509.rs temporalio-1.3.0/vendor/rustls-0.20.9/src/x509.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/src/x509.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/src/x509.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,93 +0,0 @@ -// Additional x509/asn1 functions to those provided in webpki/ring. - -use ring::io::der; - -pub(crate) fn wrap_in_asn1_len(bytes: &mut Vec) { - let len = bytes.len(); - - if len <= 0x7f { - bytes.insert(0, len as u8); - } else { - bytes.insert(0, 0x80u8); - let mut left = len; - while left > 0 { - let byte = (left & 0xff) as u8; - bytes.insert(1, byte); - bytes[0] += 1; - left >>= 8; - } - } -} - -/// Prepend stuff to `bytes` to put it in a DER SEQUENCE. -pub(crate) fn wrap_in_sequence(bytes: &mut Vec) { - wrap_in_asn1_len(bytes); - bytes.insert(0, der::Tag::Sequence as u8); -} - -#[test] -fn test_empty() { - let mut val = Vec::new(); - wrap_in_sequence(&mut val); - assert_eq!(vec![0x30, 0x00], val); -} - -#[test] -fn test_small() { - let mut val = Vec::new(); - val.insert(0, 0x00); - val.insert(1, 0x11); - val.insert(2, 0x22); - val.insert(3, 0x33); - wrap_in_sequence(&mut val); - assert_eq!(vec![0x30, 0x04, 0x00, 0x11, 0x22, 0x33], val); -} - -#[test] -fn test_medium() { - let mut val = Vec::new(); - val.resize(255, 0x12); - wrap_in_sequence(&mut val); - assert_eq!(vec![0x30, 0x81, 0xff, 0x12, 0x12, 0x12], val[..6].to_vec()); -} - -#[test] -fn test_large() { - let mut val = Vec::new(); - val.resize(4660, 0x12); - wrap_in_sequence(&mut val); - assert_eq!(vec![0x30, 0x82, 0x12, 0x34, 0x12, 0x12], val[..6].to_vec()); -} - -#[test] -fn test_huge() { - let mut val = Vec::new(); - val.resize(0xffff, 0x12); - wrap_in_sequence(&mut val); - assert_eq!(vec![0x30, 0x82, 0xff, 0xff, 0x12, 0x12], val[..6].to_vec()); - assert_eq!(val.len(), 0xffff + 4); -} - -#[test] -fn test_gigantic() { - let mut val = Vec::new(); - val.resize(0x100000, 0x12); - wrap_in_sequence(&mut val); - assert_eq!( - vec![0x30, 0x83, 0x10, 0x00, 0x00, 0x12, 0x12], - val[..7].to_vec() - ); - assert_eq!(val.len(), 0x100000 + 5); -} - -#[test] -fn test_ludicrous() { - let mut val = Vec::new(); - val.resize(0x1000000, 0x12); - wrap_in_sequence(&mut val); - assert_eq!( - vec![0x30, 0x84, 0x01, 0x00, 0x00, 0x00, 0x12, 0x12], - val[..8].to_vec() - ); - assert_eq!(val.len(), 0x1000000 + 6); -} diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/tests/api.rs temporalio-1.3.0/vendor/rustls-0.20.9/tests/api.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/tests/api.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/tests/api.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,4445 +0,0 @@ -//! Assorted public API tests. -use std::cell::RefCell; -use std::convert::TryFrom; -#[cfg(feature = "tls12")] -use std::convert::TryInto; -use std::fmt; -use std::io::{self, IoSlice, Read, Write}; -use std::mem; -use std::ops::{Deref, DerefMut}; -use std::sync::atomic::{AtomicUsize, Ordering}; -use std::sync::Arc; -use std::sync::Mutex; - -use log; - -use rustls::client::ResolvesClientCert; -use rustls::internal::msgs::base::Payload; -use rustls::internal::msgs::codec::Codec; -#[cfg(feature = "quic")] -use rustls::quic::{self, ClientQuicExt, QuicExt, ServerQuicExt}; -use rustls::server::{AllowAnyAnonymousOrAuthenticatedClient, ClientHello, ResolvesServerCert}; -#[cfg(feature = "secret_extraction")] -use rustls::ConnectionTrafficSecrets; -use rustls::{sign, ConnectionCommon, Error, KeyLog, SideData}; -use rustls::{CipherSuite, ProtocolVersion, SignatureScheme}; -use rustls::{ClientConfig, ClientConnection}; -use rustls::{ServerConfig, ServerConnection}; -use rustls::{Stream, StreamOwned}; -use rustls::{SupportedCipherSuite, ALL_CIPHER_SUITES}; - -mod common; -use crate::common::*; - -fn alpn_test_error( - server_protos: Vec>, - client_protos: Vec>, - agreed: Option<&[u8]>, - expected_error: Option, -) { - let mut server_config = make_server_config(KeyType::Rsa); - server_config.alpn_protocols = server_protos; - - let server_config = Arc::new(server_config); - - for version in rustls::ALL_VERSIONS { - let mut client_config = make_client_config_with_versions(KeyType::Rsa, &[version]); - client_config.alpn_protocols = client_protos.clone(); - - let (mut client, mut server) = - make_pair_for_arc_configs(&Arc::new(client_config), &server_config); - - assert_eq!(client.alpn_protocol(), None); - assert_eq!(server.alpn_protocol(), None); - let error = do_handshake_until_error(&mut client, &mut server); - assert_eq!(client.alpn_protocol(), agreed); - assert_eq!(server.alpn_protocol(), agreed); - assert_eq!(error.err(), expected_error); - } -} - -fn alpn_test(server_protos: Vec>, client_protos: Vec>, agreed: Option<&[u8]>) { - alpn_test_error(server_protos, client_protos, agreed, None) -} - -#[test] -fn alpn() { - // no support - alpn_test(vec![], vec![], None); - - // server support - alpn_test(vec![b"server-proto".to_vec()], vec![], None); - - // client support - alpn_test(vec![], vec![b"client-proto".to_vec()], None); - - // no overlap - alpn_test_error( - vec![b"server-proto".to_vec()], - vec![b"client-proto".to_vec()], - None, - Some(ErrorFromPeer::Server(Error::NoApplicationProtocol)), - ); - - // server chooses preference - alpn_test( - vec![b"server-proto".to_vec(), b"client-proto".to_vec()], - vec![b"client-proto".to_vec(), b"server-proto".to_vec()], - Some(b"server-proto"), - ); - - // case sensitive - alpn_test_error( - vec![b"PROTO".to_vec()], - vec![b"proto".to_vec()], - None, - Some(ErrorFromPeer::Server(Error::NoApplicationProtocol)), - ); -} - -fn version_test( - client_versions: &[&'static rustls::SupportedProtocolVersion], - server_versions: &[&'static rustls::SupportedProtocolVersion], - result: Option, -) { - let client_versions = if client_versions.is_empty() { - &rustls::ALL_VERSIONS - } else { - client_versions - }; - let server_versions = if server_versions.is_empty() { - &rustls::ALL_VERSIONS - } else { - server_versions - }; - - let client_config = make_client_config_with_versions(KeyType::Rsa, client_versions); - let server_config = make_server_config_with_versions(KeyType::Rsa, server_versions); - - println!( - "version {:?} {:?} -> {:?}", - client_versions, server_versions, result - ); - - let (mut client, mut server) = make_pair_for_configs(client_config, server_config); - - assert_eq!(client.protocol_version(), None); - assert_eq!(server.protocol_version(), None); - if result.is_none() { - let err = do_handshake_until_error(&mut client, &mut server); - assert!(err.is_err()); - } else { - do_handshake(&mut client, &mut server); - assert_eq!(client.protocol_version(), result); - assert_eq!(server.protocol_version(), result); - } -} - -#[test] -fn versions() { - // default -> 1.3 - version_test(&[], &[], Some(ProtocolVersion::TLSv1_3)); - - // client default, server 1.2 -> 1.2 - #[cfg(feature = "tls12")] - version_test( - &[], - &[&rustls::version::TLS12], - Some(ProtocolVersion::TLSv1_2), - ); - - // client 1.2, server default -> 1.2 - #[cfg(feature = "tls12")] - version_test( - &[&rustls::version::TLS12], - &[], - Some(ProtocolVersion::TLSv1_2), - ); - - // client 1.2, server 1.3 -> fail - #[cfg(feature = "tls12")] - version_test(&[&rustls::version::TLS12], &[&rustls::version::TLS13], None); - - // client 1.3, server 1.2 -> fail - #[cfg(feature = "tls12")] - version_test(&[&rustls::version::TLS13], &[&rustls::version::TLS12], None); - - // client 1.3, server 1.2+1.3 -> 1.3 - #[cfg(feature = "tls12")] - version_test( - &[&rustls::version::TLS13], - &[&rustls::version::TLS12, &rustls::version::TLS13], - Some(ProtocolVersion::TLSv1_3), - ); - - // client 1.2+1.3, server 1.2 -> 1.2 - #[cfg(feature = "tls12")] - version_test( - &[&rustls::version::TLS13, &rustls::version::TLS12], - &[&rustls::version::TLS12], - Some(ProtocolVersion::TLSv1_2), - ); -} - -fn check_read(reader: &mut dyn io::Read, bytes: &[u8]) { - let mut buf = vec![0u8; bytes.len() + 1]; - assert_eq!(bytes.len(), reader.read(&mut buf).unwrap()); - assert_eq!(bytes, &buf[..bytes.len()]); -} - -#[test] -fn config_builder_for_client_rejects_empty_kx_groups() { - assert_eq!( - ClientConfig::builder() - .with_safe_default_cipher_suites() - .with_kx_groups(&[]) - .with_safe_default_protocol_versions() - .err(), - Some(Error::General("no kx groups configured".into())) - ); -} - -#[test] -fn config_builder_for_client_rejects_empty_cipher_suites() { - assert_eq!( - ClientConfig::builder() - .with_cipher_suites(&[]) - .with_safe_default_kx_groups() - .with_safe_default_protocol_versions() - .err(), - Some(Error::General("no usable cipher suites configured".into())) - ); -} - -#[cfg(feature = "tls12")] -#[test] -fn config_builder_for_client_rejects_incompatible_cipher_suites() { - assert_eq!( - ClientConfig::builder() - .with_cipher_suites(&[rustls::cipher_suite::TLS13_AES_256_GCM_SHA384]) - .with_safe_default_kx_groups() - .with_protocol_versions(&[&rustls::version::TLS12]) - .err(), - Some(Error::General("no usable cipher suites configured".into())) - ); -} - -#[test] -fn config_builder_for_server_rejects_empty_kx_groups() { - assert_eq!( - ServerConfig::builder() - .with_safe_default_cipher_suites() - .with_kx_groups(&[]) - .with_safe_default_protocol_versions() - .err(), - Some(Error::General("no kx groups configured".into())) - ); -} - -#[test] -fn config_builder_for_server_rejects_empty_cipher_suites() { - assert_eq!( - ServerConfig::builder() - .with_cipher_suites(&[]) - .with_safe_default_kx_groups() - .with_safe_default_protocol_versions() - .err(), - Some(Error::General("no usable cipher suites configured".into())) - ); -} - -#[cfg(feature = "tls12")] -#[test] -fn config_builder_for_server_rejects_incompatible_cipher_suites() { - assert_eq!( - ServerConfig::builder() - .with_cipher_suites(&[rustls::cipher_suite::TLS13_AES_256_GCM_SHA384]) - .with_safe_default_kx_groups() - .with_protocol_versions(&[&rustls::version::TLS12]) - .err(), - Some(Error::General("no usable cipher suites configured".into())) - ); -} - -#[test] -fn buffered_client_data_sent() { - let server_config = Arc::new(make_server_config(KeyType::Rsa)); - - for version in rustls::ALL_VERSIONS { - let client_config = make_client_config_with_versions(KeyType::Rsa, &[version]); - let (mut client, mut server) = - make_pair_for_arc_configs(&Arc::new(client_config), &server_config); - - assert_eq!(5, client.writer().write(b"hello").unwrap()); - - do_handshake(&mut client, &mut server); - transfer(&mut client, &mut server); - server.process_new_packets().unwrap(); - - check_read(&mut server.reader(), b"hello"); - } -} - -#[test] -fn buffered_server_data_sent() { - let server_config = Arc::new(make_server_config(KeyType::Rsa)); - - for version in rustls::ALL_VERSIONS { - let client_config = make_client_config_with_versions(KeyType::Rsa, &[version]); - let (mut client, mut server) = - make_pair_for_arc_configs(&Arc::new(client_config), &server_config); - - assert_eq!(5, server.writer().write(b"hello").unwrap()); - - do_handshake(&mut client, &mut server); - transfer(&mut server, &mut client); - client.process_new_packets().unwrap(); - - check_read(&mut client.reader(), b"hello"); - } -} - -#[test] -fn buffered_both_data_sent() { - let server_config = Arc::new(make_server_config(KeyType::Rsa)); - - for version in rustls::ALL_VERSIONS { - let client_config = make_client_config_with_versions(KeyType::Rsa, &[version]); - let (mut client, mut server) = - make_pair_for_arc_configs(&Arc::new(client_config), &server_config); - - assert_eq!( - 12, - server - .writer() - .write(b"from-server!") - .unwrap() - ); - assert_eq!( - 12, - client - .writer() - .write(b"from-client!") - .unwrap() - ); - - do_handshake(&mut client, &mut server); - - transfer(&mut server, &mut client); - client.process_new_packets().unwrap(); - transfer(&mut client, &mut server); - server.process_new_packets().unwrap(); - - check_read(&mut client.reader(), b"from-server!"); - check_read(&mut server.reader(), b"from-client!"); - } -} - -#[test] -fn client_can_get_server_cert() { - for kt in ALL_KEY_TYPES.iter() { - for version in rustls::ALL_VERSIONS { - let client_config = make_client_config_with_versions(*kt, &[version]); - let (mut client, mut server) = - make_pair_for_configs(client_config, make_server_config(*kt)); - do_handshake(&mut client, &mut server); - - let certs = client.peer_certificates(); - assert_eq!(certs, Some(kt.get_chain().as_slice())); - } - } -} - -#[test] -fn client_can_get_server_cert_after_resumption() { - for kt in ALL_KEY_TYPES.iter() { - let server_config = make_server_config(*kt); - for version in rustls::ALL_VERSIONS { - let client_config = make_client_config_with_versions(*kt, &[version]); - let (mut client, mut server) = - make_pair_for_configs(client_config.clone(), server_config.clone()); - do_handshake(&mut client, &mut server); - - let original_certs = client.peer_certificates(); - - let (mut client, mut server) = - make_pair_for_configs(client_config.clone(), server_config.clone()); - do_handshake(&mut client, &mut server); - - let resumed_certs = client.peer_certificates(); - - assert_eq!(original_certs, resumed_certs); - } - } -} - -#[test] -fn server_can_get_client_cert() { - for kt in ALL_KEY_TYPES.iter() { - let server_config = Arc::new(make_server_config_with_mandatory_client_auth(*kt)); - - for version in rustls::ALL_VERSIONS { - let client_config = make_client_config_with_versions_with_auth(*kt, &[version]); - let (mut client, mut server) = - make_pair_for_arc_configs(&Arc::new(client_config), &server_config); - do_handshake(&mut client, &mut server); - - let certs = server.peer_certificates(); - assert_eq!(certs, Some(kt.get_client_chain().as_slice())); - } - } -} - -#[test] -fn server_can_get_client_cert_after_resumption() { - for kt in ALL_KEY_TYPES.iter() { - let server_config = Arc::new(make_server_config_with_mandatory_client_auth(*kt)); - - for version in rustls::ALL_VERSIONS { - let client_config = make_client_config_with_versions_with_auth(*kt, &[version]); - let client_config = Arc::new(client_config); - let (mut client, mut server) = - make_pair_for_arc_configs(&client_config, &server_config); - do_handshake(&mut client, &mut server); - let original_certs = server.peer_certificates(); - - let (mut client, mut server) = - make_pair_for_arc_configs(&client_config, &server_config); - do_handshake(&mut client, &mut server); - let resumed_certs = server.peer_certificates(); - assert_eq!(original_certs, resumed_certs); - } - } -} - -#[test] -fn test_config_builders_debug() { - let b = ServerConfig::builder(); - assert_eq!( - "ConfigBuilder { state: WantsCipherSuites(()) }", - format!("{:?}", b) - ); - let b = b.with_cipher_suites(&[rustls::cipher_suite::TLS13_CHACHA20_POLY1305_SHA256]); - assert_eq!("ConfigBuilder { state: WantsKxGroups { cipher_suites: [TLS13_CHACHA20_POLY1305_SHA256] } }", format!("{:?}", b)); - let b = b.with_kx_groups(&[&rustls::kx_group::X25519]); - assert_eq!("ConfigBuilder { state: WantsVersions { cipher_suites: [TLS13_CHACHA20_POLY1305_SHA256], kx_groups: [X25519] } }", format!("{:?}", b)); - let b = b - .with_protocol_versions(&[&rustls::version::TLS13]) - .unwrap(); - let b = b.with_no_client_auth(); - assert_eq!("ConfigBuilder { state: WantsServerCert { cipher_suites: [TLS13_CHACHA20_POLY1305_SHA256], kx_groups: [X25519], versions: [TLSv1_3], verifier: dyn ClientCertVerifier } }", format!("{:?}", b)); - - let b = ClientConfig::builder(); - assert_eq!( - "ConfigBuilder { state: WantsCipherSuites(()) }", - format!("{:?}", b) - ); - let b = b.with_cipher_suites(&[rustls::cipher_suite::TLS13_CHACHA20_POLY1305_SHA256]); - assert_eq!("ConfigBuilder { state: WantsKxGroups { cipher_suites: [TLS13_CHACHA20_POLY1305_SHA256] } }", format!("{:?}", b)); - let b = b.with_kx_groups(&[&rustls::kx_group::X25519]); - assert_eq!("ConfigBuilder { state: WantsVersions { cipher_suites: [TLS13_CHACHA20_POLY1305_SHA256], kx_groups: [X25519] } }", format!("{:?}", b)); - let b = b - .with_protocol_versions(&[&rustls::version::TLS13]) - .unwrap(); - assert_eq!("ConfigBuilder { state: WantsVerifier { cipher_suites: [TLS13_CHACHA20_POLY1305_SHA256], kx_groups: [X25519], versions: [TLSv1_3] } }", format!("{:?}", b)); -} - -/// Test that the server handles combination of `offer_client_auth()` returning true -/// and `client_auth_mandatory` returning `Some(false)`. This exercises both the -/// client's and server's ability to "recover" from the server asking for a client -/// certificate and not being given one. This also covers the implementation -/// of `AllowAnyAnonymousOrAuthenticatedClient`. -#[test] -fn server_allow_any_anonymous_or_authenticated_client() { - let kt = KeyType::Rsa; - for client_cert_chain in [None, Some(kt.get_client_chain())].iter() { - let client_auth_roots = get_client_root_store(kt); - let client_auth = AllowAnyAnonymousOrAuthenticatedClient::new(client_auth_roots); - - let server_config = ServerConfig::builder() - .with_safe_defaults() - .with_client_cert_verifier(client_auth) - .with_single_cert(kt.get_chain(), kt.get_key()) - .unwrap(); - let server_config = Arc::new(server_config); - - for version in rustls::ALL_VERSIONS { - let client_config = if client_cert_chain.is_some() { - make_client_config_with_versions_with_auth(kt, &[version]) - } else { - make_client_config_with_versions(kt, &[version]) - }; - let (mut client, mut server) = - make_pair_for_arc_configs(&Arc::new(client_config), &server_config); - do_handshake(&mut client, &mut server); - - let certs = server.peer_certificates(); - assert_eq!(certs, client_cert_chain.as_deref()); - } - } -} - -fn check_read_and_close(reader: &mut dyn io::Read, expect: &[u8]) { - check_read(reader, expect); - assert!(matches!(reader.read(&mut [0u8; 5]), Ok(0))); -} - -#[test] -fn server_close_notify() { - let kt = KeyType::Rsa; - let server_config = Arc::new(make_server_config_with_mandatory_client_auth(kt)); - - for version in rustls::ALL_VERSIONS { - let client_config = make_client_config_with_versions_with_auth(kt, &[version]); - let (mut client, mut server) = - make_pair_for_arc_configs(&Arc::new(client_config), &server_config); - do_handshake(&mut client, &mut server); - - // check that alerts don't overtake appdata - assert_eq!( - 12, - server - .writer() - .write(b"from-server!") - .unwrap() - ); - assert_eq!( - 12, - client - .writer() - .write(b"from-client!") - .unwrap() - ); - server.send_close_notify(); - - transfer(&mut server, &mut client); - let io_state = client.process_new_packets().unwrap(); - assert!(io_state.peer_has_closed()); - check_read_and_close(&mut client.reader(), b"from-server!"); - - transfer(&mut client, &mut server); - server.process_new_packets().unwrap(); - check_read(&mut server.reader(), b"from-client!"); - } -} - -#[test] -fn client_close_notify() { - let kt = KeyType::Rsa; - let server_config = Arc::new(make_server_config_with_mandatory_client_auth(kt)); - - for version in rustls::ALL_VERSIONS { - let client_config = make_client_config_with_versions_with_auth(kt, &[version]); - let (mut client, mut server) = - make_pair_for_arc_configs(&Arc::new(client_config), &server_config); - do_handshake(&mut client, &mut server); - - // check that alerts don't overtake appdata - assert_eq!( - 12, - server - .writer() - .write(b"from-server!") - .unwrap() - ); - assert_eq!( - 12, - client - .writer() - .write(b"from-client!") - .unwrap() - ); - client.send_close_notify(); - - transfer(&mut client, &mut server); - let io_state = server.process_new_packets().unwrap(); - assert!(io_state.peer_has_closed()); - check_read_and_close(&mut server.reader(), b"from-client!"); - - transfer(&mut server, &mut client); - client.process_new_packets().unwrap(); - check_read(&mut client.reader(), b"from-server!"); - } -} - -#[test] -fn server_closes_uncleanly() { - let kt = KeyType::Rsa; - let server_config = Arc::new(make_server_config(kt)); - - for version in rustls::ALL_VERSIONS { - let client_config = make_client_config_with_versions(kt, &[version]); - let (mut client, mut server) = - make_pair_for_arc_configs(&Arc::new(client_config), &server_config); - do_handshake(&mut client, &mut server); - - // check that unclean EOF reporting does not overtake appdata - assert_eq!( - 12, - server - .writer() - .write(b"from-server!") - .unwrap() - ); - assert_eq!( - 12, - client - .writer() - .write(b"from-client!") - .unwrap() - ); - - transfer(&mut server, &mut client); - transfer_eof(&mut client); - let io_state = client.process_new_packets().unwrap(); - assert!(!io_state.peer_has_closed()); - check_read(&mut client.reader(), b"from-server!"); - - assert!(matches!(client.reader().read(&mut [0u8; 1]), - Err(err) if err.kind() == io::ErrorKind::UnexpectedEof)); - - // may still transmit pending frames - transfer(&mut client, &mut server); - server.process_new_packets().unwrap(); - check_read(&mut server.reader(), b"from-client!"); - } -} - -#[test] -fn client_closes_uncleanly() { - let kt = KeyType::Rsa; - let server_config = Arc::new(make_server_config(kt)); - - for version in rustls::ALL_VERSIONS { - let client_config = make_client_config_with_versions(kt, &[version]); - let (mut client, mut server) = - make_pair_for_arc_configs(&Arc::new(client_config), &server_config); - do_handshake(&mut client, &mut server); - - // check that unclean EOF reporting does not overtake appdata - assert_eq!( - 12, - server - .writer() - .write(b"from-server!") - .unwrap() - ); - assert_eq!( - 12, - client - .writer() - .write(b"from-client!") - .unwrap() - ); - - transfer(&mut client, &mut server); - transfer_eof(&mut server); - let io_state = server.process_new_packets().unwrap(); - assert!(!io_state.peer_has_closed()); - check_read(&mut server.reader(), b"from-client!"); - - assert!(matches!(server.reader().read(&mut [0u8; 1]), - Err(err) if err.kind() == io::ErrorKind::UnexpectedEof)); - - // may still transmit pending frames - transfer(&mut server, &mut client); - client.process_new_packets().unwrap(); - check_read(&mut client.reader(), b"from-server!"); - } -} - -#[derive(Default)] -struct ServerCheckCertResolve { - expected_sni: Option, - expected_sigalgs: Option>, - expected_alpn: Option>>, - expected_cipher_suites: Option>, -} - -impl ResolvesServerCert for ServerCheckCertResolve { - fn resolve(&self, client_hello: ClientHello) -> Option> { - if client_hello - .signature_schemes() - .is_empty() - { - panic!("no signature schemes shared by client"); - } - - if client_hello.cipher_suites().is_empty() { - panic!("no cipher suites shared by client"); - } - - if let Some(expected_sni) = &self.expected_sni { - let sni: &str = client_hello - .server_name() - .expect("sni unexpectedly absent"); - assert_eq!(expected_sni, sni); - } - - if let Some(expected_sigalgs) = &self.expected_sigalgs { - assert_eq!( - expected_sigalgs, - client_hello.signature_schemes(), - "unexpected signature schemes" - ); - } - - if let Some(expected_alpn) = &self.expected_alpn { - let alpn = client_hello - .alpn() - .expect("alpn unexpectedly absent") - .collect::>(); - assert_eq!(alpn.len(), expected_alpn.len()); - - for (got, wanted) in alpn.iter().zip(expected_alpn.iter()) { - assert_eq!(got, &wanted.as_slice()); - } - } - - if let Some(expected_cipher_suites) = &self.expected_cipher_suites { - assert_eq!( - expected_cipher_suites, - client_hello.cipher_suites(), - "unexpected cipher suites" - ); - } - - None - } -} - -#[test] -fn server_cert_resolve_with_sni() { - for kt in ALL_KEY_TYPES.iter() { - let client_config = make_client_config(*kt); - let mut server_config = make_server_config(*kt); - - server_config.cert_resolver = Arc::new(ServerCheckCertResolve { - expected_sni: Some("the-value-from-sni".into()), - ..Default::default() - }); - - let mut client = - ClientConnection::new(Arc::new(client_config), dns_name("the-value-from-sni")).unwrap(); - let mut server = ServerConnection::new(Arc::new(server_config)).unwrap(); - - let err = do_handshake_until_error(&mut client, &mut server); - assert!(err.is_err()); - } -} - -#[test] -fn server_cert_resolve_with_alpn() { - for kt in ALL_KEY_TYPES.iter() { - let mut client_config = make_client_config(*kt); - client_config.alpn_protocols = vec!["foo".into(), "bar".into()]; - - let mut server_config = make_server_config(*kt); - server_config.cert_resolver = Arc::new(ServerCheckCertResolve { - expected_alpn: Some(vec![b"foo".to_vec(), b"bar".to_vec()]), - ..Default::default() - }); - - let mut client = - ClientConnection::new(Arc::new(client_config), dns_name("sni-value")).unwrap(); - let mut server = ServerConnection::new(Arc::new(server_config)).unwrap(); - - let err = do_handshake_until_error(&mut client, &mut server); - assert!(err.is_err()); - } -} - -#[test] -fn client_trims_terminating_dot() { - for kt in ALL_KEY_TYPES.iter() { - let client_config = make_client_config(*kt); - let mut server_config = make_server_config(*kt); - - server_config.cert_resolver = Arc::new(ServerCheckCertResolve { - expected_sni: Some("some-host.com".into()), - ..Default::default() - }); - - let mut client = - ClientConnection::new(Arc::new(client_config), dns_name("some-host.com.")).unwrap(); - let mut server = ServerConnection::new(Arc::new(server_config)).unwrap(); - - let err = do_handshake_until_error(&mut client, &mut server); - assert!(err.is_err()); - } -} - -#[cfg(feature = "tls12")] -fn check_sigalgs_reduced_by_ciphersuite( - kt: KeyType, - suite: CipherSuite, - expected_sigalgs: Vec, -) { - let client_config = finish_client_config( - kt, - ClientConfig::builder() - .with_cipher_suites(&[find_suite(suite)]) - .with_safe_default_kx_groups() - .with_safe_default_protocol_versions() - .unwrap(), - ); - - let mut server_config = make_server_config(kt); - - server_config.cert_resolver = Arc::new(ServerCheckCertResolve { - expected_sigalgs: Some(expected_sigalgs), - expected_cipher_suites: Some(vec![suite, CipherSuite::TLS_EMPTY_RENEGOTIATION_INFO_SCSV]), - ..Default::default() - }); - - let mut client = ClientConnection::new(Arc::new(client_config), dns_name("localhost")).unwrap(); - let mut server = ServerConnection::new(Arc::new(server_config)).unwrap(); - - let err = do_handshake_until_error(&mut client, &mut server); - assert!(err.is_err()); -} - -#[cfg(feature = "tls12")] -#[test] -fn server_cert_resolve_reduces_sigalgs_for_rsa_ciphersuite() { - check_sigalgs_reduced_by_ciphersuite( - KeyType::Rsa, - CipherSuite::TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, - vec![ - SignatureScheme::RSA_PSS_SHA512, - SignatureScheme::RSA_PSS_SHA384, - SignatureScheme::RSA_PSS_SHA256, - SignatureScheme::RSA_PKCS1_SHA512, - SignatureScheme::RSA_PKCS1_SHA384, - SignatureScheme::RSA_PKCS1_SHA256, - ], - ); -} - -#[cfg(feature = "tls12")] -#[test] -fn server_cert_resolve_reduces_sigalgs_for_ecdsa_ciphersuite() { - check_sigalgs_reduced_by_ciphersuite( - KeyType::Ecdsa, - CipherSuite::TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, - vec![ - SignatureScheme::ECDSA_NISTP384_SHA384, - SignatureScheme::ECDSA_NISTP256_SHA256, - SignatureScheme::ED25519, - ], - ); -} - -struct ServerCheckNoSNI {} - -impl ResolvesServerCert for ServerCheckNoSNI { - fn resolve(&self, client_hello: ClientHello) -> Option> { - assert!(client_hello.server_name().is_none()); - - None - } -} - -#[test] -fn client_with_sni_disabled_does_not_send_sni() { - for kt in ALL_KEY_TYPES.iter() { - let mut server_config = make_server_config(*kt); - server_config.cert_resolver = Arc::new(ServerCheckNoSNI {}); - let server_config = Arc::new(server_config); - - for version in rustls::ALL_VERSIONS { - let mut client_config = make_client_config_with_versions(*kt, &[version]); - client_config.enable_sni = false; - - let mut client = - ClientConnection::new(Arc::new(client_config), dns_name("value-not-sent")).unwrap(); - let mut server = ServerConnection::new(Arc::clone(&server_config)).unwrap(); - - let err = do_handshake_until_error(&mut client, &mut server); - assert!(err.is_err()); - } - } -} - -#[test] -fn client_checks_server_certificate_with_given_name() { - for kt in ALL_KEY_TYPES.iter() { - let server_config = Arc::new(make_server_config(*kt)); - - for version in rustls::ALL_VERSIONS { - let client_config = make_client_config_with_versions(*kt, &[version]); - let mut client = ClientConnection::new( - Arc::new(client_config), - dns_name("not-the-right-hostname.com"), - ) - .unwrap(); - let mut server = ServerConnection::new(Arc::clone(&server_config)).unwrap(); - - let err = do_handshake_until_error(&mut client, &mut server); - assert_eq!( - err, - Err(ErrorFromPeer::Client(Error::InvalidCertificateData( - "invalid peer certificate: CertNotValidForName".into(), - ))) - ); - } - } -} - -struct ClientCheckCertResolve { - query_count: AtomicUsize, - expect_queries: usize, -} - -impl ClientCheckCertResolve { - fn new(expect_queries: usize) -> Self { - ClientCheckCertResolve { - query_count: AtomicUsize::new(0), - expect_queries, - } - } -} - -impl Drop for ClientCheckCertResolve { - fn drop(&mut self) { - if !std::thread::panicking() { - let count = self.query_count.load(Ordering::SeqCst); - assert_eq!(count, self.expect_queries); - } - } -} - -impl ResolvesClientCert for ClientCheckCertResolve { - fn resolve( - &self, - acceptable_issuers: &[&[u8]], - sigschemes: &[SignatureScheme], - ) -> Option> { - self.query_count - .fetch_add(1, Ordering::SeqCst); - - if acceptable_issuers.is_empty() { - panic!("no issuers offered by server"); - } - - if sigschemes.is_empty() { - panic!("no signature schemes shared by server"); - } - - None - } - - fn has_certs(&self) -> bool { - true - } -} - -#[test] -fn client_cert_resolve() { - for kt in ALL_KEY_TYPES.iter() { - let server_config = Arc::new(make_server_config_with_mandatory_client_auth(*kt)); - - for version in rustls::ALL_VERSIONS { - let mut client_config = make_client_config_with_versions(*kt, &[version]); - client_config.client_auth_cert_resolver = Arc::new(ClientCheckCertResolve::new(1)); - - let (mut client, mut server) = - make_pair_for_arc_configs(&Arc::new(client_config), &server_config); - - assert_eq!( - do_handshake_until_error(&mut client, &mut server), - Err(ErrorFromPeer::Server(Error::NoCertificatesPresented)) - ); - } - } -} - -#[test] -fn client_auth_works() { - for kt in ALL_KEY_TYPES.iter() { - let server_config = Arc::new(make_server_config_with_mandatory_client_auth(*kt)); - - for version in rustls::ALL_VERSIONS { - let client_config = make_client_config_with_versions_with_auth(*kt, &[version]); - let (mut client, mut server) = - make_pair_for_arc_configs(&Arc::new(client_config), &server_config); - do_handshake(&mut client, &mut server); - } - } -} - -#[test] -fn client_error_is_sticky() { - let (mut client, _) = make_pair(KeyType::Rsa); - client - .read_tls(&mut b"\x16\x03\x03\x00\x08\x0f\x00\x00\x04junk".as_ref()) - .unwrap(); - let mut err = client.process_new_packets(); - assert!(err.is_err()); - err = client.process_new_packets(); - assert!(err.is_err()); -} - -#[test] -fn server_error_is_sticky() { - let (_, mut server) = make_pair(KeyType::Rsa); - server - .read_tls(&mut b"\x16\x03\x03\x00\x08\x0f\x00\x00\x04junk".as_ref()) - .unwrap(); - let mut err = server.process_new_packets(); - assert!(err.is_err()); - err = server.process_new_packets(); - assert!(err.is_err()); -} - -#[test] -fn server_flush_does_nothing() { - let (_, mut server) = make_pair(KeyType::Rsa); - assert!(matches!(server.writer().flush(), Ok(()))); -} - -#[test] -fn client_flush_does_nothing() { - let (mut client, _) = make_pair(KeyType::Rsa); - assert!(matches!(client.writer().flush(), Ok(()))); -} - -#[test] -fn server_is_send_and_sync() { - let (_, server) = make_pair(KeyType::Rsa); - &server as &dyn Send; - &server as &dyn Sync; -} - -#[test] -fn client_is_send_and_sync() { - let (client, _) = make_pair(KeyType::Rsa); - &client as &dyn Send; - &client as &dyn Sync; -} - -#[test] -fn server_respects_buffer_limit_pre_handshake() { - let (mut client, mut server) = make_pair(KeyType::Rsa); - - server.set_buffer_limit(Some(32)); - - assert_eq!( - server - .writer() - .write(b"01234567890123456789") - .unwrap(), - 20 - ); - assert_eq!( - server - .writer() - .write(b"01234567890123456789") - .unwrap(), - 12 - ); - - do_handshake(&mut client, &mut server); - transfer(&mut server, &mut client); - client.process_new_packets().unwrap(); - - check_read(&mut client.reader(), b"01234567890123456789012345678901"); -} - -#[test] -fn server_respects_buffer_limit_pre_handshake_with_vectored_write() { - let (mut client, mut server) = make_pair(KeyType::Rsa); - - server.set_buffer_limit(Some(32)); - - assert_eq!( - server - .writer() - .write_vectored(&[ - IoSlice::new(b"01234567890123456789"), - IoSlice::new(b"01234567890123456789") - ]) - .unwrap(), - 32 - ); - - do_handshake(&mut client, &mut server); - transfer(&mut server, &mut client); - client.process_new_packets().unwrap(); - - check_read(&mut client.reader(), b"01234567890123456789012345678901"); -} - -#[test] -fn server_respects_buffer_limit_post_handshake() { - let (mut client, mut server) = make_pair(KeyType::Rsa); - - // this test will vary in behaviour depending on the default suites - do_handshake(&mut client, &mut server); - server.set_buffer_limit(Some(48)); - - assert_eq!( - server - .writer() - .write(b"01234567890123456789") - .unwrap(), - 20 - ); - assert_eq!( - server - .writer() - .write(b"01234567890123456789") - .unwrap(), - 6 - ); - - transfer(&mut server, &mut client); - client.process_new_packets().unwrap(); - - check_read(&mut client.reader(), b"01234567890123456789012345"); -} - -#[test] -fn client_respects_buffer_limit_pre_handshake() { - let (mut client, mut server) = make_pair(KeyType::Rsa); - - client.set_buffer_limit(Some(32)); - - assert_eq!( - client - .writer() - .write(b"01234567890123456789") - .unwrap(), - 20 - ); - assert_eq!( - client - .writer() - .write(b"01234567890123456789") - .unwrap(), - 12 - ); - - do_handshake(&mut client, &mut server); - transfer(&mut client, &mut server); - server.process_new_packets().unwrap(); - - check_read(&mut server.reader(), b"01234567890123456789012345678901"); -} - -#[test] -fn client_respects_buffer_limit_pre_handshake_with_vectored_write() { - let (mut client, mut server) = make_pair(KeyType::Rsa); - - client.set_buffer_limit(Some(32)); - - assert_eq!( - client - .writer() - .write_vectored(&[ - IoSlice::new(b"01234567890123456789"), - IoSlice::new(b"01234567890123456789") - ]) - .unwrap(), - 32 - ); - - do_handshake(&mut client, &mut server); - transfer(&mut client, &mut server); - server.process_new_packets().unwrap(); - - check_read(&mut server.reader(), b"01234567890123456789012345678901"); -} - -#[test] -fn client_respects_buffer_limit_post_handshake() { - let (mut client, mut server) = make_pair(KeyType::Rsa); - - do_handshake(&mut client, &mut server); - client.set_buffer_limit(Some(48)); - - assert_eq!( - client - .writer() - .write(b"01234567890123456789") - .unwrap(), - 20 - ); - assert_eq!( - client - .writer() - .write(b"01234567890123456789") - .unwrap(), - 6 - ); - - transfer(&mut client, &mut server); - server.process_new_packets().unwrap(); - - check_read(&mut server.reader(), b"01234567890123456789012345"); -} - -struct OtherSession<'a, C, S> -where - C: DerefMut + Deref>, - S: SideData, -{ - sess: &'a mut C, - pub reads: usize, - pub writevs: Vec>, - fail_ok: bool, - pub short_writes: bool, - pub last_error: Option, -} - -impl<'a, C, S> OtherSession<'a, C, S> -where - C: DerefMut + Deref>, - S: SideData, -{ - fn new(sess: &'a mut C) -> OtherSession<'a, C, S> { - OtherSession { - sess, - reads: 0, - writevs: vec![], - fail_ok: false, - short_writes: false, - last_error: None, - } - } - - fn new_fails(sess: &'a mut C) -> OtherSession<'a, C, S> { - let mut os = OtherSession::new(sess); - os.fail_ok = true; - os - } -} - -impl<'a, C, S> io::Read for OtherSession<'a, C, S> -where - C: DerefMut + Deref>, - S: SideData, -{ - fn read(&mut self, mut b: &mut [u8]) -> io::Result { - self.reads += 1; - self.sess.write_tls(b.by_ref()) - } -} - -impl<'a, C, S> io::Write for OtherSession<'a, C, S> -where - C: DerefMut + Deref>, - S: SideData, -{ - fn write(&mut self, _: &[u8]) -> io::Result { - unreachable!() - } - - fn flush(&mut self) -> io::Result<()> { - Ok(()) - } - - fn write_vectored<'b>(&mut self, b: &[io::IoSlice<'b>]) -> io::Result { - let mut total = 0; - let mut lengths = vec![]; - for bytes in b { - let write_len = if self.short_writes { - if bytes.len() > 5 { - bytes.len() / 2 - } else { - bytes.len() - } - } else { - bytes.len() - }; - - let l = self - .sess - .read_tls(&mut io::Cursor::new(&bytes[..write_len]))?; - lengths.push(l); - total += l; - if bytes.len() != l { - break; - } - } - - let rc = self.sess.process_new_packets(); - if !self.fail_ok { - rc.unwrap(); - } else if rc.is_err() { - self.last_error = rc.err(); - } - - self.writevs.push(lengths); - Ok(total) - } -} - -#[test] -fn server_read_returns_wouldblock_when_no_data() { - let (_, mut server) = make_pair(KeyType::Rsa); - assert!(matches!(server.reader().read(&mut [0u8; 1]), - Err(err) if err.kind() == io::ErrorKind::WouldBlock)); -} - -#[test] -fn client_read_returns_wouldblock_when_no_data() { - let (mut client, _) = make_pair(KeyType::Rsa); - assert!(matches!(client.reader().read(&mut [0u8; 1]), - Err(err) if err.kind() == io::ErrorKind::WouldBlock)); -} - -#[test] -fn new_server_returns_initial_io_state() { - let (_, mut server) = make_pair(KeyType::Rsa); - let io_state = server.process_new_packets().unwrap(); - println!("IoState is Debug {:?}", io_state); - assert_eq!(io_state.plaintext_bytes_to_read(), 0); - assert!(!io_state.peer_has_closed()); - assert_eq!(io_state.tls_bytes_to_write(), 0); -} - -#[test] -fn new_client_returns_initial_io_state() { - let (mut client, _) = make_pair(KeyType::Rsa); - let io_state = client.process_new_packets().unwrap(); - println!("IoState is Debug {:?}", io_state); - assert_eq!(io_state.plaintext_bytes_to_read(), 0); - assert!(!io_state.peer_has_closed()); - assert!(io_state.tls_bytes_to_write() > 200); -} - -#[test] -fn client_complete_io_for_handshake() { - let (mut client, mut server) = make_pair(KeyType::Rsa); - - assert!(client.is_handshaking()); - let (rdlen, wrlen) = client - .complete_io(&mut OtherSession::new(&mut server)) - .unwrap(); - assert!(rdlen > 0 && wrlen > 0); - assert!(!client.is_handshaking()); -} - -#[test] -fn client_complete_io_for_handshake_eof() { - let (mut client, _) = make_pair(KeyType::Rsa); - let mut input = io::Cursor::new(Vec::new()); - - assert!(client.is_handshaking()); - let err = client - .complete_io(&mut input) - .unwrap_err(); - assert_eq!(io::ErrorKind::UnexpectedEof, err.kind()); -} - -#[test] -fn client_complete_io_for_write() { - for kt in ALL_KEY_TYPES.iter() { - let (mut client, mut server) = make_pair(*kt); - - do_handshake(&mut client, &mut server); - - client - .writer() - .write_all(b"01234567890123456789") - .unwrap(); - client - .writer() - .write_all(b"01234567890123456789") - .unwrap(); - { - let mut pipe = OtherSession::new(&mut server); - let (rdlen, wrlen) = client.complete_io(&mut pipe).unwrap(); - assert!(rdlen == 0 && wrlen > 0); - println!("{:?}", pipe.writevs); - assert_eq!(pipe.writevs, vec![vec![42, 42]]); - } - check_read( - &mut server.reader(), - b"0123456789012345678901234567890123456789", - ); - } -} - -#[test] -fn client_complete_io_for_read() { - for kt in ALL_KEY_TYPES.iter() { - let (mut client, mut server) = make_pair(*kt); - - do_handshake(&mut client, &mut server); - - server - .writer() - .write_all(b"01234567890123456789") - .unwrap(); - { - let mut pipe = OtherSession::new(&mut server); - let (rdlen, wrlen) = client.complete_io(&mut pipe).unwrap(); - assert!(rdlen > 0 && wrlen == 0); - assert_eq!(pipe.reads, 1); - } - check_read(&mut client.reader(), b"01234567890123456789"); - } -} - -#[test] -fn server_complete_io_for_handshake() { - for kt in ALL_KEY_TYPES.iter() { - let (mut client, mut server) = make_pair(*kt); - - assert!(server.is_handshaking()); - let (rdlen, wrlen) = server - .complete_io(&mut OtherSession::new(&mut client)) - .unwrap(); - assert!(rdlen > 0 && wrlen > 0); - assert!(!server.is_handshaking()); - } -} - -#[test] -fn server_complete_io_for_handshake_eof() { - let (_, mut server) = make_pair(KeyType::Rsa); - let mut input = io::Cursor::new(Vec::new()); - - assert!(server.is_handshaking()); - let err = server - .complete_io(&mut input) - .unwrap_err(); - assert_eq!(io::ErrorKind::UnexpectedEof, err.kind()); -} - -#[test] -fn server_complete_io_for_write() { - for kt in ALL_KEY_TYPES.iter() { - let (mut client, mut server) = make_pair(*kt); - - do_handshake(&mut client, &mut server); - - server - .writer() - .write_all(b"01234567890123456789") - .unwrap(); - server - .writer() - .write_all(b"01234567890123456789") - .unwrap(); - { - let mut pipe = OtherSession::new(&mut client); - let (rdlen, wrlen) = server.complete_io(&mut pipe).unwrap(); - assert!(rdlen == 0 && wrlen > 0); - assert_eq!(pipe.writevs, vec![vec![42, 42]]); - } - check_read( - &mut client.reader(), - b"0123456789012345678901234567890123456789", - ); - } -} - -#[test] -fn server_complete_io_for_read() { - for kt in ALL_KEY_TYPES.iter() { - let (mut client, mut server) = make_pair(*kt); - - do_handshake(&mut client, &mut server); - - client - .writer() - .write_all(b"01234567890123456789") - .unwrap(); - { - let mut pipe = OtherSession::new(&mut client); - let (rdlen, wrlen) = server.complete_io(&mut pipe).unwrap(); - assert!(rdlen > 0 && wrlen == 0); - assert_eq!(pipe.reads, 1); - } - check_read(&mut server.reader(), b"01234567890123456789"); - } -} - -#[test] -fn client_stream_write() { - for kt in ALL_KEY_TYPES.iter() { - let (mut client, mut server) = make_pair(*kt); - - { - let mut pipe = OtherSession::new(&mut server); - let mut stream = Stream::new(&mut client, &mut pipe); - assert_eq!(stream.write(b"hello").unwrap(), 5); - } - check_read(&mut server.reader(), b"hello"); - } -} - -#[test] -fn client_streamowned_write() { - for kt in ALL_KEY_TYPES.iter() { - let (client, mut server) = make_pair(*kt); - - { - let pipe = OtherSession::new(&mut server); - let mut stream = StreamOwned::new(client, pipe); - assert_eq!(stream.write(b"hello").unwrap(), 5); - } - check_read(&mut server.reader(), b"hello"); - } -} - -#[test] -fn client_stream_read() { - for kt in ALL_KEY_TYPES.iter() { - let (mut client, mut server) = make_pair(*kt); - - server - .writer() - .write_all(b"world") - .unwrap(); - - { - let mut pipe = OtherSession::new(&mut server); - let mut stream = Stream::new(&mut client, &mut pipe); - check_read(&mut stream, b"world"); - } - } -} - -#[test] -fn client_streamowned_read() { - for kt in ALL_KEY_TYPES.iter() { - let (client, mut server) = make_pair(*kt); - - server - .writer() - .write_all(b"world") - .unwrap(); - - { - let pipe = OtherSession::new(&mut server); - let mut stream = StreamOwned::new(client, pipe); - check_read(&mut stream, b"world"); - } - } -} - -#[test] -fn server_stream_write() { - for kt in ALL_KEY_TYPES.iter() { - let (mut client, mut server) = make_pair(*kt); - - { - let mut pipe = OtherSession::new(&mut client); - let mut stream = Stream::new(&mut server, &mut pipe); - assert_eq!(stream.write(b"hello").unwrap(), 5); - } - check_read(&mut client.reader(), b"hello"); - } -} - -#[test] -fn server_streamowned_write() { - for kt in ALL_KEY_TYPES.iter() { - let (mut client, server) = make_pair(*kt); - - { - let pipe = OtherSession::new(&mut client); - let mut stream = StreamOwned::new(server, pipe); - assert_eq!(stream.write(b"hello").unwrap(), 5); - } - check_read(&mut client.reader(), b"hello"); - } -} - -#[test] -fn server_stream_read() { - for kt in ALL_KEY_TYPES.iter() { - let (mut client, mut server) = make_pair(*kt); - - client - .writer() - .write_all(b"world") - .unwrap(); - - { - let mut pipe = OtherSession::new(&mut client); - let mut stream = Stream::new(&mut server, &mut pipe); - check_read(&mut stream, b"world"); - } - } -} - -#[test] -fn server_streamowned_read() { - for kt in ALL_KEY_TYPES.iter() { - let (mut client, server) = make_pair(*kt); - - client - .writer() - .write_all(b"world") - .unwrap(); - - { - let pipe = OtherSession::new(&mut client); - let mut stream = StreamOwned::new(server, pipe); - check_read(&mut stream, b"world"); - } - } -} - -struct FailsWrites { - errkind: io::ErrorKind, - after: usize, -} - -impl io::Read for FailsWrites { - fn read(&mut self, _b: &mut [u8]) -> io::Result { - Ok(0) - } -} - -impl io::Write for FailsWrites { - fn write(&mut self, b: &[u8]) -> io::Result { - if self.after > 0 { - self.after -= 1; - Ok(b.len()) - } else { - Err(io::Error::new(self.errkind, "oops")) - } - } - - fn flush(&mut self) -> io::Result<()> { - Ok(()) - } -} - -#[test] -fn stream_write_reports_underlying_io_error_before_plaintext_processed() { - let (mut client, mut server) = make_pair(KeyType::Rsa); - do_handshake(&mut client, &mut server); - - let mut pipe = FailsWrites { - errkind: io::ErrorKind::ConnectionAborted, - after: 0, - }; - client - .writer() - .write_all(b"hello") - .unwrap(); - let mut client_stream = Stream::new(&mut client, &mut pipe); - let rc = client_stream.write(b"world"); - assert!(rc.is_err()); - let err = rc.err().unwrap(); - assert_eq!(err.kind(), io::ErrorKind::ConnectionAborted); -} - -#[test] -fn stream_write_swallows_underlying_io_error_after_plaintext_processed() { - let (mut client, mut server) = make_pair(KeyType::Rsa); - do_handshake(&mut client, &mut server); - - let mut pipe = FailsWrites { - errkind: io::ErrorKind::ConnectionAborted, - after: 1, - }; - client - .writer() - .write_all(b"hello") - .unwrap(); - let mut client_stream = Stream::new(&mut client, &mut pipe); - let rc = client_stream.write(b"world"); - assert_eq!(format!("{:?}", rc), "Ok(5)"); -} - -fn make_disjoint_suite_configs() -> (ClientConfig, ServerConfig) { - let kt = KeyType::Rsa; - let server_config = finish_server_config( - kt, - ServerConfig::builder() - .with_cipher_suites(&[rustls::cipher_suite::TLS13_CHACHA20_POLY1305_SHA256]) - .with_safe_default_kx_groups() - .with_safe_default_protocol_versions() - .unwrap(), - ); - - let client_config = finish_client_config( - kt, - ClientConfig::builder() - .with_cipher_suites(&[rustls::cipher_suite::TLS13_AES_256_GCM_SHA384]) - .with_safe_default_kx_groups() - .with_safe_default_protocol_versions() - .unwrap(), - ); - - (client_config, server_config) -} - -#[test] -fn client_stream_handshake_error() { - let (client_config, server_config) = make_disjoint_suite_configs(); - let (mut client, mut server) = make_pair_for_configs(client_config, server_config); - - { - let mut pipe = OtherSession::new_fails(&mut server); - let mut client_stream = Stream::new(&mut client, &mut pipe); - let rc = client_stream.write(b"hello"); - assert!(rc.is_err()); - assert_eq!( - format!("{:?}", rc), - "Err(Custom { kind: InvalidData, error: AlertReceived(HandshakeFailure) })" - ); - let rc = client_stream.write(b"hello"); - assert!(rc.is_err()); - assert_eq!( - format!("{:?}", rc), - "Err(Custom { kind: InvalidData, error: AlertReceived(HandshakeFailure) })" - ); - } -} - -#[test] -fn client_streamowned_handshake_error() { - let (client_config, server_config) = make_disjoint_suite_configs(); - let (client, mut server) = make_pair_for_configs(client_config, server_config); - - let pipe = OtherSession::new_fails(&mut server); - let mut client_stream = StreamOwned::new(client, pipe); - let rc = client_stream.write(b"hello"); - assert!(rc.is_err()); - assert_eq!( - format!("{:?}", rc), - "Err(Custom { kind: InvalidData, error: AlertReceived(HandshakeFailure) })" - ); - let rc = client_stream.write(b"hello"); - assert!(rc.is_err()); - assert_eq!( - format!("{:?}", rc), - "Err(Custom { kind: InvalidData, error: AlertReceived(HandshakeFailure) })" - ); -} - -#[test] -fn server_stream_handshake_error() { - let (client_config, server_config) = make_disjoint_suite_configs(); - let (mut client, mut server) = make_pair_for_configs(client_config, server_config); - - client - .writer() - .write_all(b"world") - .unwrap(); - - { - let mut pipe = OtherSession::new_fails(&mut client); - let mut server_stream = Stream::new(&mut server, &mut pipe); - let mut bytes = [0u8; 5]; - let rc = server_stream.read(&mut bytes); - assert!(rc.is_err()); - assert_eq!( - format!("{:?}", rc), - "Err(Custom { kind: InvalidData, error: PeerIncompatibleError(\"no ciphersuites in common\") })" - ); - } -} - -#[test] -fn server_streamowned_handshake_error() { - let (client_config, server_config) = make_disjoint_suite_configs(); - let (mut client, server) = make_pair_for_configs(client_config, server_config); - - client - .writer() - .write_all(b"world") - .unwrap(); - - let pipe = OtherSession::new_fails(&mut client); - let mut server_stream = StreamOwned::new(server, pipe); - let mut bytes = [0u8; 5]; - let rc = server_stream.read(&mut bytes); - assert!(rc.is_err()); - assert_eq!( - format!("{:?}", rc), - "Err(Custom { kind: InvalidData, error: PeerIncompatibleError(\"no ciphersuites in common\") })" - ); -} - -#[test] -fn server_config_is_clone() { - let _ = make_server_config(KeyType::Rsa); -} - -#[test] -fn client_config_is_clone() { - let _ = make_client_config(KeyType::Rsa); -} - -#[test] -fn client_connection_is_debug() { - let (client, _) = make_pair(KeyType::Rsa); - println!("{:?}", client); -} - -#[test] -fn server_connection_is_debug() { - let (_, server) = make_pair(KeyType::Rsa); - println!("{:?}", server); -} - -#[test] -fn server_complete_io_for_handshake_ending_with_alert() { - let (client_config, server_config) = make_disjoint_suite_configs(); - let (mut client, mut server) = make_pair_for_configs(client_config, server_config); - - assert!(server.is_handshaking()); - - let mut pipe = OtherSession::new_fails(&mut client); - let rc = server.complete_io(&mut pipe); - assert!(rc.is_err(), "server io failed due to handshake failure"); - assert!(!server.wants_write(), "but server did send its alert"); - assert_eq!( - format!("{:?}", pipe.last_error), - "Some(AlertReceived(HandshakeFailure))", - "which was received by client" - ); -} - -#[test] -fn server_exposes_offered_sni() { - let kt = KeyType::Rsa; - for version in rustls::ALL_VERSIONS { - let client_config = make_client_config_with_versions(kt, &[version]); - let mut client = - ClientConnection::new(Arc::new(client_config), dns_name("second.testserver.com")) - .unwrap(); - let mut server = ServerConnection::new(Arc::new(make_server_config(kt))).unwrap(); - - assert_eq!(None, server.sni_hostname()); - do_handshake(&mut client, &mut server); - assert_eq!(Some("second.testserver.com"), server.sni_hostname()); - } -} - -#[test] -fn server_exposes_offered_sni_smashed_to_lowercase() { - // webpki actually does this for us in its DnsName type - let kt = KeyType::Rsa; - for version in rustls::ALL_VERSIONS { - let client_config = make_client_config_with_versions(kt, &[version]); - let mut client = - ClientConnection::new(Arc::new(client_config), dns_name("SECOND.TESTServer.com")) - .unwrap(); - let mut server = ServerConnection::new(Arc::new(make_server_config(kt))).unwrap(); - - assert_eq!(None, server.sni_hostname()); - do_handshake(&mut client, &mut server); - assert_eq!(Some("second.testserver.com"), server.sni_hostname()); - } -} - -#[test] -fn server_exposes_offered_sni_even_if_resolver_fails() { - let kt = KeyType::Rsa; - let resolver = rustls::server::ResolvesServerCertUsingSni::new(); - - let mut server_config = make_server_config(kt); - server_config.cert_resolver = Arc::new(resolver); - let server_config = Arc::new(server_config); - - for version in rustls::ALL_VERSIONS { - let client_config = make_client_config_with_versions(kt, &[version]); - let mut server = ServerConnection::new(Arc::clone(&server_config)).unwrap(); - let mut client = - ClientConnection::new(Arc::new(client_config), dns_name("thisdoesNOTexist.com")) - .unwrap(); - - assert_eq!(None, server.sni_hostname()); - transfer(&mut client, &mut server); - assert_eq!( - server.process_new_packets(), - Err(Error::General( - "no server certificate chain resolved".to_string() - )) - ); - assert_eq!(Some("thisdoesnotexist.com"), server.sni_hostname()); - } -} - -#[test] -fn sni_resolver_works() { - let kt = KeyType::Rsa; - let mut resolver = rustls::server::ResolvesServerCertUsingSni::new(); - let signing_key = sign::RsaSigningKey::new(&kt.get_key()).unwrap(); - let signing_key: Arc = Arc::new(signing_key); - resolver - .add( - "localhost", - sign::CertifiedKey::new(kt.get_chain(), signing_key.clone()), - ) - .unwrap(); - - let mut server_config = make_server_config(kt); - server_config.cert_resolver = Arc::new(resolver); - let server_config = Arc::new(server_config); - - let mut server1 = ServerConnection::new(Arc::clone(&server_config)).unwrap(); - let mut client1 = - ClientConnection::new(Arc::new(make_client_config(kt)), dns_name("localhost")).unwrap(); - let err = do_handshake_until_error(&mut client1, &mut server1); - assert_eq!(err, Ok(())); - - let mut server2 = ServerConnection::new(Arc::clone(&server_config)).unwrap(); - let mut client2 = - ClientConnection::new(Arc::new(make_client_config(kt)), dns_name("notlocalhost")).unwrap(); - let err = do_handshake_until_error(&mut client2, &mut server2); - assert_eq!( - err, - Err(ErrorFromPeer::Server(Error::General( - "no server certificate chain resolved".into() - ))) - ); -} - -#[test] -fn sni_resolver_rejects_wrong_names() { - let kt = KeyType::Rsa; - let mut resolver = rustls::server::ResolvesServerCertUsingSni::new(); - let signing_key = sign::RsaSigningKey::new(&kt.get_key()).unwrap(); - let signing_key: Arc = Arc::new(signing_key); - - assert_eq!( - Ok(()), - resolver.add( - "localhost", - sign::CertifiedKey::new(kt.get_chain(), signing_key.clone()) - ) - ); - assert_eq!( - Err(Error::General( - "The server certificate is not valid for the given name".into() - )), - resolver.add( - "not-localhost", - sign::CertifiedKey::new(kt.get_chain(), signing_key.clone()) - ) - ); - assert_eq!( - Err(Error::General("Bad DNS name".into())), - resolver.add( - "not ascii 🦀", - sign::CertifiedKey::new(kt.get_chain(), signing_key.clone()) - ) - ); -} - -#[test] -fn sni_resolver_lower_cases_configured_names() { - let kt = KeyType::Rsa; - let mut resolver = rustls::server::ResolvesServerCertUsingSni::new(); - let signing_key = sign::RsaSigningKey::new(&kt.get_key()).unwrap(); - let signing_key: Arc = Arc::new(signing_key); - - assert_eq!( - Ok(()), - resolver.add( - "LOCALHOST", - sign::CertifiedKey::new(kt.get_chain(), signing_key.clone()) - ) - ); - - let mut server_config = make_server_config(kt); - server_config.cert_resolver = Arc::new(resolver); - let server_config = Arc::new(server_config); - - let mut server1 = ServerConnection::new(Arc::clone(&server_config)).unwrap(); - let mut client1 = - ClientConnection::new(Arc::new(make_client_config(kt)), dns_name("localhost")).unwrap(); - let err = do_handshake_until_error(&mut client1, &mut server1); - assert_eq!(err, Ok(())); -} - -#[test] -fn sni_resolver_lower_cases_queried_names() { - // actually, the handshake parser does this, but the effect is the same. - let kt = KeyType::Rsa; - let mut resolver = rustls::server::ResolvesServerCertUsingSni::new(); - let signing_key = sign::RsaSigningKey::new(&kt.get_key()).unwrap(); - let signing_key: Arc = Arc::new(signing_key); - - assert_eq!( - Ok(()), - resolver.add( - "localhost", - sign::CertifiedKey::new(kt.get_chain(), signing_key.clone()) - ) - ); - - let mut server_config = make_server_config(kt); - server_config.cert_resolver = Arc::new(resolver); - let server_config = Arc::new(server_config); - - let mut server1 = ServerConnection::new(Arc::clone(&server_config)).unwrap(); - let mut client1 = - ClientConnection::new(Arc::new(make_client_config(kt)), dns_name("LOCALHOST")).unwrap(); - let err = do_handshake_until_error(&mut client1, &mut server1); - assert_eq!(err, Ok(())); -} - -#[test] -fn sni_resolver_rejects_bad_certs() { - let kt = KeyType::Rsa; - let mut resolver = rustls::server::ResolvesServerCertUsingSni::new(); - let signing_key = sign::RsaSigningKey::new(&kt.get_key()).unwrap(); - let signing_key: Arc = Arc::new(signing_key); - - assert_eq!( - Err(Error::General( - "No end-entity certificate in certificate chain".into() - )), - resolver.add( - "localhost", - sign::CertifiedKey::new(vec![], signing_key.clone()) - ) - ); - - let bad_chain = vec![rustls::Certificate(vec![0xa0])]; - assert_eq!( - Err(Error::General( - "End-entity certificate in certificate chain is syntactically invalid".into() - )), - resolver.add( - "localhost", - sign::CertifiedKey::new(bad_chain, signing_key.clone()) - ) - ); -} - -fn do_exporter_test(client_config: ClientConfig, server_config: ServerConfig) { - let mut client_secret = [0u8; 64]; - let mut server_secret = [0u8; 64]; - - let (mut client, mut server) = make_pair_for_configs(client_config, server_config); - - assert_eq!( - Err(Error::HandshakeNotComplete), - client.export_keying_material(&mut client_secret, b"label", Some(b"context")) - ); - assert_eq!( - Err(Error::HandshakeNotComplete), - server.export_keying_material(&mut server_secret, b"label", Some(b"context")) - ); - do_handshake(&mut client, &mut server); - - assert_eq!( - Ok(()), - client.export_keying_material(&mut client_secret, b"label", Some(b"context")) - ); - assert_eq!( - Ok(()), - server.export_keying_material(&mut server_secret, b"label", Some(b"context")) - ); - assert_eq!(client_secret.to_vec(), server_secret.to_vec()); - - assert_eq!( - Ok(()), - client.export_keying_material(&mut client_secret, b"label", None) - ); - assert_ne!(client_secret.to_vec(), server_secret.to_vec()); - assert_eq!( - Ok(()), - server.export_keying_material(&mut server_secret, b"label", None) - ); - assert_eq!(client_secret.to_vec(), server_secret.to_vec()); -} - -#[cfg(feature = "tls12")] -#[test] -fn test_tls12_exporter() { - for kt in ALL_KEY_TYPES.iter() { - let client_config = make_client_config_with_versions(*kt, &[&rustls::version::TLS12]); - let server_config = make_server_config(*kt); - - do_exporter_test(client_config, server_config); - } -} - -#[test] -fn test_tls13_exporter() { - for kt in ALL_KEY_TYPES.iter() { - let client_config = make_client_config_with_versions(*kt, &[&rustls::version::TLS13]); - let server_config = make_server_config(*kt); - - do_exporter_test(client_config, server_config); - } -} - -fn do_suite_test( - client_config: ClientConfig, - server_config: ServerConfig, - expect_suite: SupportedCipherSuite, - expect_version: ProtocolVersion, -) { - println!( - "do_suite_test {:?} {:?}", - expect_version, - expect_suite.suite() - ); - let (mut client, mut server) = make_pair_for_configs(client_config, server_config); - - assert_eq!(None, client.negotiated_cipher_suite()); - assert_eq!(None, server.negotiated_cipher_suite()); - assert_eq!(None, client.protocol_version()); - assert_eq!(None, server.protocol_version()); - assert!(client.is_handshaking()); - assert!(server.is_handshaking()); - - transfer(&mut client, &mut server); - server.process_new_packets().unwrap(); - - assert!(client.is_handshaking()); - assert!(server.is_handshaking()); - assert_eq!(None, client.protocol_version()); - assert_eq!(Some(expect_version), server.protocol_version()); - assert_eq!(None, client.negotiated_cipher_suite()); - assert_eq!(Some(expect_suite), server.negotiated_cipher_suite()); - - transfer(&mut server, &mut client); - client.process_new_packets().unwrap(); - - assert_eq!(Some(expect_suite), client.negotiated_cipher_suite()); - assert_eq!(Some(expect_suite), server.negotiated_cipher_suite()); - - transfer(&mut client, &mut server); - server.process_new_packets().unwrap(); - transfer(&mut server, &mut client); - client.process_new_packets().unwrap(); - - assert!(!client.is_handshaking()); - assert!(!server.is_handshaking()); - assert_eq!(Some(expect_version), client.protocol_version()); - assert_eq!(Some(expect_version), server.protocol_version()); - assert_eq!(Some(expect_suite), client.negotiated_cipher_suite()); - assert_eq!(Some(expect_suite), server.negotiated_cipher_suite()); -} - -fn find_suite(suite: CipherSuite) -> SupportedCipherSuite { - for scs in ALL_CIPHER_SUITES.iter().copied() { - if scs.suite() == suite { - return scs; - } - } - - panic!("find_suite given unsupported suite"); -} - -static TEST_CIPHERSUITES: &[(&rustls::SupportedProtocolVersion, KeyType, CipherSuite)] = &[ - ( - &rustls::version::TLS13, - KeyType::Rsa, - CipherSuite::TLS13_CHACHA20_POLY1305_SHA256, - ), - ( - &rustls::version::TLS13, - KeyType::Rsa, - CipherSuite::TLS13_AES_256_GCM_SHA384, - ), - ( - &rustls::version::TLS13, - KeyType::Rsa, - CipherSuite::TLS13_AES_128_GCM_SHA256, - ), - #[cfg(feature = "tls12")] - ( - &rustls::version::TLS12, - KeyType::Ecdsa, - CipherSuite::TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, - ), - #[cfg(feature = "tls12")] - ( - &rustls::version::TLS12, - KeyType::Rsa, - CipherSuite::TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, - ), - #[cfg(feature = "tls12")] - ( - &rustls::version::TLS12, - KeyType::Ecdsa, - CipherSuite::TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, - ), - #[cfg(feature = "tls12")] - ( - &rustls::version::TLS12, - KeyType::Ecdsa, - CipherSuite::TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, - ), - #[cfg(feature = "tls12")] - ( - &rustls::version::TLS12, - KeyType::Rsa, - CipherSuite::TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, - ), - #[cfg(feature = "tls12")] - ( - &rustls::version::TLS12, - KeyType::Rsa, - CipherSuite::TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, - ), -]; - -#[test] -fn negotiated_ciphersuite_default() { - for kt in ALL_KEY_TYPES.iter() { - do_suite_test( - make_client_config(*kt), - make_server_config(*kt), - find_suite(CipherSuite::TLS13_AES_256_GCM_SHA384), - ProtocolVersion::TLSv1_3, - ); - } -} - -#[test] -fn all_suites_covered() { - assert_eq!(ALL_CIPHER_SUITES.len(), TEST_CIPHERSUITES.len()); -} - -#[test] -fn negotiated_ciphersuite_client() { - for item in TEST_CIPHERSUITES.iter() { - let (version, kt, suite) = *item; - let scs = find_suite(suite); - let client_config = finish_client_config( - kt, - ClientConfig::builder() - .with_cipher_suites(&[scs]) - .with_safe_default_kx_groups() - .with_protocol_versions(&[version]) - .unwrap(), - ); - - do_suite_test(client_config, make_server_config(kt), scs, version.version); - } -} - -#[test] -fn negotiated_ciphersuite_server() { - for item in TEST_CIPHERSUITES.iter() { - let (version, kt, suite) = *item; - let scs = find_suite(suite); - let server_config = finish_server_config( - kt, - ServerConfig::builder() - .with_cipher_suites(&[scs]) - .with_safe_default_kx_groups() - .with_protocol_versions(&[version]) - .unwrap(), - ); - - do_suite_test(make_client_config(kt), server_config, scs, version.version); - } -} - -#[derive(Debug, PartialEq)] -struct KeyLogItem { - label: String, - client_random: Vec, - secret: Vec, -} - -struct KeyLogToVec { - label: &'static str, - items: Mutex>, -} - -impl KeyLogToVec { - fn new(who: &'static str) -> Self { - KeyLogToVec { - label: who, - items: Mutex::new(vec![]), - } - } - - fn take(&self) -> Vec { - std::mem::take(&mut self.items.lock().unwrap()) - } -} - -impl KeyLog for KeyLogToVec { - fn log(&self, label: &str, client: &[u8], secret: &[u8]) { - let value = KeyLogItem { - label: label.into(), - client_random: client.into(), - secret: secret.into(), - }; - - println!("key log {:?}: {:?}", self.label, value); - - self.items.lock().unwrap().push(value); - } -} - -#[cfg(feature = "tls12")] -#[test] -fn key_log_for_tls12() { - let client_key_log = Arc::new(KeyLogToVec::new("client")); - let server_key_log = Arc::new(KeyLogToVec::new("server")); - - let kt = KeyType::Rsa; - let mut client_config = make_client_config_with_versions(kt, &[&rustls::version::TLS12]); - client_config.key_log = client_key_log.clone(); - let client_config = Arc::new(client_config); - - let mut server_config = make_server_config(kt); - server_config.key_log = server_key_log.clone(); - let server_config = Arc::new(server_config); - - // full handshake - let (mut client, mut server) = make_pair_for_arc_configs(&client_config, &server_config); - do_handshake(&mut client, &mut server); - - let client_full_log = client_key_log.take(); - let server_full_log = server_key_log.take(); - assert_eq!(client_full_log, server_full_log); - assert_eq!(1, client_full_log.len()); - assert_eq!("CLIENT_RANDOM", client_full_log[0].label); - - // resumed - let (mut client, mut server) = make_pair_for_arc_configs(&client_config, &server_config); - do_handshake(&mut client, &mut server); - - let client_resume_log = client_key_log.take(); - let server_resume_log = server_key_log.take(); - assert_eq!(client_resume_log, server_resume_log); - assert_eq!(1, client_resume_log.len()); - assert_eq!("CLIENT_RANDOM", client_resume_log[0].label); - assert_eq!(client_full_log[0].secret, client_resume_log[0].secret); -} - -#[test] -fn key_log_for_tls13() { - let client_key_log = Arc::new(KeyLogToVec::new("client")); - let server_key_log = Arc::new(KeyLogToVec::new("server")); - - let kt = KeyType::Rsa; - let mut client_config = make_client_config_with_versions(kt, &[&rustls::version::TLS13]); - client_config.key_log = client_key_log.clone(); - let client_config = Arc::new(client_config); - - let mut server_config = make_server_config(kt); - server_config.key_log = server_key_log.clone(); - let server_config = Arc::new(server_config); - - // full handshake - let (mut client, mut server) = make_pair_for_arc_configs(&client_config, &server_config); - do_handshake(&mut client, &mut server); - - let client_full_log = client_key_log.take(); - let server_full_log = server_key_log.take(); - - assert_eq!(5, client_full_log.len()); - assert_eq!("CLIENT_HANDSHAKE_TRAFFIC_SECRET", client_full_log[0].label); - assert_eq!("SERVER_HANDSHAKE_TRAFFIC_SECRET", client_full_log[1].label); - assert_eq!("CLIENT_TRAFFIC_SECRET_0", client_full_log[2].label); - assert_eq!("SERVER_TRAFFIC_SECRET_0", client_full_log[3].label); - assert_eq!("EXPORTER_SECRET", client_full_log[4].label); - - assert_eq!(client_full_log[0], server_full_log[0]); - assert_eq!(client_full_log[1], server_full_log[1]); - assert_eq!(client_full_log[2], server_full_log[2]); - assert_eq!(client_full_log[3], server_full_log[3]); - assert_eq!(client_full_log[4], server_full_log[4]); - - // resumed - let (mut client, mut server) = make_pair_for_arc_configs(&client_config, &server_config); - do_handshake(&mut client, &mut server); - - let client_resume_log = client_key_log.take(); - let server_resume_log = server_key_log.take(); - - assert_eq!(5, client_resume_log.len()); - assert_eq!( - "CLIENT_HANDSHAKE_TRAFFIC_SECRET", - client_resume_log[0].label - ); - assert_eq!( - "SERVER_HANDSHAKE_TRAFFIC_SECRET", - client_resume_log[1].label - ); - assert_eq!("CLIENT_TRAFFIC_SECRET_0", client_resume_log[2].label); - assert_eq!("SERVER_TRAFFIC_SECRET_0", client_resume_log[3].label); - assert_eq!("EXPORTER_SECRET", client_resume_log[4].label); - - assert_eq!(6, server_resume_log.len()); - assert_eq!("CLIENT_EARLY_TRAFFIC_SECRET", server_resume_log[0].label); - assert_eq!( - "CLIENT_HANDSHAKE_TRAFFIC_SECRET", - server_resume_log[1].label - ); - assert_eq!( - "SERVER_HANDSHAKE_TRAFFIC_SECRET", - server_resume_log[2].label - ); - assert_eq!("CLIENT_TRAFFIC_SECRET_0", server_resume_log[3].label); - assert_eq!("SERVER_TRAFFIC_SECRET_0", server_resume_log[4].label); - assert_eq!("EXPORTER_SECRET", server_resume_log[5].label); - - assert_eq!(client_resume_log[0], server_resume_log[1]); - assert_eq!(client_resume_log[1], server_resume_log[2]); - assert_eq!(client_resume_log[2], server_resume_log[3]); - assert_eq!(client_resume_log[3], server_resume_log[4]); - assert_eq!(client_resume_log[4], server_resume_log[5]); -} - -#[test] -fn vectored_write_for_server_appdata() { - let (mut client, mut server) = make_pair(KeyType::Rsa); - do_handshake(&mut client, &mut server); - - server - .writer() - .write_all(b"01234567890123456789") - .unwrap(); - server - .writer() - .write_all(b"01234567890123456789") - .unwrap(); - { - let mut pipe = OtherSession::new(&mut client); - let wrlen = server.write_tls(&mut pipe).unwrap(); - assert_eq!(84, wrlen); - assert_eq!(pipe.writevs, vec![vec![42, 42]]); - } - check_read( - &mut client.reader(), - b"0123456789012345678901234567890123456789", - ); -} - -#[test] -fn vectored_write_for_client_appdata() { - let (mut client, mut server) = make_pair(KeyType::Rsa); - do_handshake(&mut client, &mut server); - - client - .writer() - .write_all(b"01234567890123456789") - .unwrap(); - client - .writer() - .write_all(b"01234567890123456789") - .unwrap(); - { - let mut pipe = OtherSession::new(&mut server); - let wrlen = client.write_tls(&mut pipe).unwrap(); - assert_eq!(84, wrlen); - assert_eq!(pipe.writevs, vec![vec![42, 42]]); - } - check_read( - &mut server.reader(), - b"0123456789012345678901234567890123456789", - ); -} - -#[test] -fn vectored_write_for_server_handshake_with_half_rtt_data() { - let mut server_config = make_server_config(KeyType::Rsa); - server_config.send_half_rtt_data = true; - let (mut client, mut server) = - make_pair_for_configs(make_client_config_with_auth(KeyType::Rsa), server_config); - - server - .writer() - .write_all(b"01234567890123456789") - .unwrap(); - server - .writer() - .write_all(b"0123456789") - .unwrap(); - - transfer(&mut client, &mut server); - server.process_new_packets().unwrap(); - { - let mut pipe = OtherSession::new(&mut client); - let wrlen = server.write_tls(&mut pipe).unwrap(); - // don't assert exact sizes here, to avoid a brittle test - assert!(wrlen > 4000); // its pretty big (contains cert chain) - assert_eq!(pipe.writevs.len(), 1); // only one writev - assert_eq!(pipe.writevs[0].len(), 8); // at least a server hello/ccs/cert/serverkx/0.5rtt data - } - - client.process_new_packets().unwrap(); - transfer(&mut client, &mut server); - server.process_new_packets().unwrap(); - { - let mut pipe = OtherSession::new(&mut client); - let wrlen = server.write_tls(&mut pipe).unwrap(); - assert_eq!(wrlen, 103); - assert_eq!(pipe.writevs, vec![vec![103]]); - } - - assert!(!server.is_handshaking()); - assert!(!client.is_handshaking()); - check_read(&mut client.reader(), b"012345678901234567890123456789"); -} - -fn check_half_rtt_does_not_work(server_config: ServerConfig) { - let (mut client, mut server) = - make_pair_for_configs(make_client_config_with_auth(KeyType::Rsa), server_config); - - server - .writer() - .write_all(b"01234567890123456789") - .unwrap(); - server - .writer() - .write_all(b"0123456789") - .unwrap(); - - transfer(&mut client, &mut server); - server.process_new_packets().unwrap(); - { - let mut pipe = OtherSession::new(&mut client); - let wrlen = server.write_tls(&mut pipe).unwrap(); - // don't assert exact sizes here, to avoid a brittle test - assert!(wrlen > 4000); // its pretty big (contains cert chain) - assert_eq!(pipe.writevs.len(), 1); // only one writev - assert!(pipe.writevs[0].len() >= 6); // at least a server hello/ccs/cert/serverkx data - } - - // client second flight - client.process_new_packets().unwrap(); - transfer(&mut client, &mut server); - - // when client auth is enabled, we don't sent 0.5-rtt data, as we'd be sending - // it to an unauthenticated peer. so it happens here, in the server's second - // flight (42 and 32 are lengths of appdata sent above). - server.process_new_packets().unwrap(); - { - let mut pipe = OtherSession::new(&mut client); - let wrlen = server.write_tls(&mut pipe).unwrap(); - assert_eq!(wrlen, 177); - assert_eq!(pipe.writevs, vec![vec![103, 42, 32]]); - } - - assert!(!server.is_handshaking()); - assert!(!client.is_handshaking()); - check_read(&mut client.reader(), b"012345678901234567890123456789"); -} - -#[test] -fn vectored_write_for_server_handshake_no_half_rtt_with_client_auth() { - let mut server_config = make_server_config_with_mandatory_client_auth(KeyType::Rsa); - server_config.send_half_rtt_data = true; // ask even though it will be ignored - check_half_rtt_does_not_work(server_config); -} - -#[test] -fn vectored_write_for_server_handshake_no_half_rtt_by_default() { - let server_config = make_server_config(KeyType::Rsa); - assert!(!server_config.send_half_rtt_data); - check_half_rtt_does_not_work(server_config); -} - -#[test] -fn vectored_write_for_client_handshake() { - let (mut client, mut server) = make_pair(KeyType::Rsa); - - client - .writer() - .write_all(b"01234567890123456789") - .unwrap(); - client - .writer() - .write_all(b"0123456789") - .unwrap(); - { - let mut pipe = OtherSession::new(&mut server); - let wrlen = client.write_tls(&mut pipe).unwrap(); - // don't assert exact sizes here, to avoid a brittle test - assert!(wrlen > 200); // just the client hello - assert_eq!(pipe.writevs.len(), 1); // only one writev - assert!(pipe.writevs[0].len() == 1); // only a client hello - } - - transfer(&mut server, &mut client); - client.process_new_packets().unwrap(); - - { - let mut pipe = OtherSession::new(&mut server); - let wrlen = client.write_tls(&mut pipe).unwrap(); - assert_eq!(wrlen, 154); - // CCS, finished, then two application datas - assert_eq!(pipe.writevs, vec![vec![6, 74, 42, 32]]); - } - - assert!(!server.is_handshaking()); - assert!(!client.is_handshaking()); - check_read(&mut server.reader(), b"012345678901234567890123456789"); -} - -#[test] -fn vectored_write_with_slow_client() { - let (mut client, mut server) = make_pair(KeyType::Rsa); - - client.set_buffer_limit(Some(32)); - - do_handshake(&mut client, &mut server); - server - .writer() - .write_all(b"01234567890123456789") - .unwrap(); - - { - let mut pipe = OtherSession::new(&mut client); - pipe.short_writes = true; - let wrlen = server.write_tls(&mut pipe).unwrap() - + server.write_tls(&mut pipe).unwrap() - + server.write_tls(&mut pipe).unwrap() - + server.write_tls(&mut pipe).unwrap() - + server.write_tls(&mut pipe).unwrap() - + server.write_tls(&mut pipe).unwrap(); - assert_eq!(42, wrlen); - assert_eq!( - pipe.writevs, - vec![vec![21], vec![10], vec![5], vec![3], vec![3]] - ); - } - check_read(&mut client.reader(), b"01234567890123456789"); -} - -struct ServerStorage { - storage: Arc, - put_count: AtomicUsize, - get_count: AtomicUsize, - take_count: AtomicUsize, -} - -impl ServerStorage { - fn new() -> Self { - ServerStorage { - storage: rustls::server::ServerSessionMemoryCache::new(1024), - put_count: AtomicUsize::new(0), - get_count: AtomicUsize::new(0), - take_count: AtomicUsize::new(0), - } - } - - fn puts(&self) -> usize { - self.put_count.load(Ordering::SeqCst) - } - fn gets(&self) -> usize { - self.get_count.load(Ordering::SeqCst) - } - fn takes(&self) -> usize { - self.take_count.load(Ordering::SeqCst) - } -} - -impl fmt::Debug for ServerStorage { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!( - f, - "(put: {:?}, get: {:?}, take: {:?})", - self.put_count, self.get_count, self.take_count - ) - } -} - -impl rustls::server::StoresServerSessions for ServerStorage { - fn put(&self, key: Vec, value: Vec) -> bool { - self.put_count - .fetch_add(1, Ordering::SeqCst); - self.storage.put(key, value) - } - - fn get(&self, key: &[u8]) -> Option> { - self.get_count - .fetch_add(1, Ordering::SeqCst); - self.storage.get(key) - } - - fn take(&self, key: &[u8]) -> Option> { - self.take_count - .fetch_add(1, Ordering::SeqCst); - self.storage.take(key) - } - - fn can_cache(&self) -> bool { - true - } -} - -struct ClientStorage { - storage: Arc, - put_count: AtomicUsize, - get_count: AtomicUsize, - last_put_key: Mutex>>, -} - -impl ClientStorage { - fn new() -> Self { - ClientStorage { - storage: rustls::client::ClientSessionMemoryCache::new(1024), - put_count: AtomicUsize::new(0), - get_count: AtomicUsize::new(0), - last_put_key: Mutex::new(None), - } - } - - fn puts(&self) -> usize { - self.put_count.load(Ordering::SeqCst) - } - fn gets(&self) -> usize { - self.get_count.load(Ordering::SeqCst) - } -} - -impl fmt::Debug for ClientStorage { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!( - f, - "(puts: {:?}, gets: {:?} )", - self.put_count, self.get_count - ) - } -} - -impl rustls::client::StoresClientSessions for ClientStorage { - fn put(&self, key: Vec, value: Vec) -> bool { - self.put_count - .fetch_add(1, Ordering::SeqCst); - *self.last_put_key.lock().unwrap() = Some(key.clone()); - self.storage.put(key, value) - } - - fn get(&self, key: &[u8]) -> Option> { - self.get_count - .fetch_add(1, Ordering::SeqCst); - self.storage.get(key) - } -} - -#[test] -fn tls13_stateful_resumption() { - let kt = KeyType::Rsa; - let client_config = make_client_config_with_versions(kt, &[&rustls::version::TLS13]); - let client_config = Arc::new(client_config); - - let mut server_config = make_server_config(kt); - let storage = Arc::new(ServerStorage::new()); - server_config.session_storage = storage.clone(); - let server_config = Arc::new(server_config); - - // full handshake - let (mut client, mut server) = make_pair_for_arc_configs(&client_config, &server_config); - let (full_c2s, full_s2c) = do_handshake(&mut client, &mut server); - assert_eq!(storage.puts(), 1); - assert_eq!(storage.gets(), 0); - assert_eq!(storage.takes(), 0); - assert_eq!( - client - .peer_certificates() - .map(|certs| certs.len()), - Some(3) - ); - - // resumed - let (mut client, mut server) = make_pair_for_arc_configs(&client_config, &server_config); - let (resume_c2s, resume_s2c) = do_handshake(&mut client, &mut server); - assert!(resume_c2s > full_c2s); - assert!(resume_s2c < full_s2c); - assert_eq!(storage.puts(), 2); - assert_eq!(storage.gets(), 0); - assert_eq!(storage.takes(), 1); - assert_eq!( - client - .peer_certificates() - .map(|certs| certs.len()), - Some(3) - ); - - // resumed again - let (mut client, mut server) = make_pair_for_arc_configs(&client_config, &server_config); - let (resume2_c2s, resume2_s2c) = do_handshake(&mut client, &mut server); - assert_eq!(resume_s2c, resume2_s2c); - assert_eq!(resume_c2s, resume2_c2s); - assert_eq!(storage.puts(), 3); - assert_eq!(storage.gets(), 0); - assert_eq!(storage.takes(), 2); - assert_eq!( - client - .peer_certificates() - .map(|certs| certs.len()), - Some(3) - ); -} - -#[test] -fn tls13_stateless_resumption() { - let kt = KeyType::Rsa; - let client_config = make_client_config_with_versions(kt, &[&rustls::version::TLS13]); - let client_config = Arc::new(client_config); - - let mut server_config = make_server_config(kt); - server_config.ticketer = rustls::Ticketer::new().unwrap(); - let storage = Arc::new(ServerStorage::new()); - server_config.session_storage = storage.clone(); - let server_config = Arc::new(server_config); - - // full handshake - let (mut client, mut server) = make_pair_for_arc_configs(&client_config, &server_config); - let (full_c2s, full_s2c) = do_handshake(&mut client, &mut server); - assert_eq!(storage.puts(), 0); - assert_eq!(storage.gets(), 0); - assert_eq!(storage.takes(), 0); - assert_eq!( - client - .peer_certificates() - .map(|certs| certs.len()), - Some(3) - ); - - // resumed - let (mut client, mut server) = make_pair_for_arc_configs(&client_config, &server_config); - let (resume_c2s, resume_s2c) = do_handshake(&mut client, &mut server); - assert!(resume_c2s > full_c2s); - assert!(resume_s2c < full_s2c); - assert_eq!(storage.puts(), 0); - assert_eq!(storage.gets(), 0); - assert_eq!(storage.takes(), 0); - assert_eq!( - client - .peer_certificates() - .map(|certs| certs.len()), - Some(3) - ); - - // resumed again - let (mut client, mut server) = make_pair_for_arc_configs(&client_config, &server_config); - let (resume2_c2s, resume2_s2c) = do_handshake(&mut client, &mut server); - assert_eq!(resume_s2c, resume2_s2c); - assert_eq!(resume_c2s, resume2_c2s); - assert_eq!(storage.puts(), 0); - assert_eq!(storage.gets(), 0); - assert_eq!(storage.takes(), 0); - assert_eq!( - client - .peer_certificates() - .map(|certs| certs.len()), - Some(3) - ); -} - -#[test] -fn early_data_not_available() { - let (mut client, _) = make_pair(KeyType::Rsa); - assert!(client.early_data().is_none()); -} - -fn early_data_configs() -> (Arc, Arc) { - let kt = KeyType::Rsa; - let mut client_config = make_client_config(kt); - client_config.enable_early_data = true; - client_config.session_storage = Arc::new(ClientStorage::new()); - - let mut server_config = make_server_config(kt); - server_config.max_early_data_size = 1234; - (Arc::new(client_config), Arc::new(server_config)) -} - -#[test] -fn early_data_is_available_on_resumption() { - let (client_config, server_config) = early_data_configs(); - - let (mut client, mut server) = make_pair_for_arc_configs(&client_config, &server_config); - do_handshake(&mut client, &mut server); - - let (mut client, mut server) = make_pair_for_arc_configs(&client_config, &server_config); - assert!(client.early_data().is_some()); - assert_eq!( - client - .early_data() - .unwrap() - .bytes_left(), - 1234 - ); - client - .early_data() - .unwrap() - .flush() - .unwrap(); - assert_eq!( - client - .early_data() - .unwrap() - .write(b"hello") - .unwrap(), - 5 - ); - do_handshake(&mut client, &mut server); - - let mut received_early_data = [0u8; 5]; - assert_eq!( - server - .early_data() - .expect("early_data didn't happen") - .read(&mut received_early_data) - .expect("early_data failed unexpectedly"), - 5 - ); - assert_eq!(&received_early_data[..], b"hello"); -} - -#[test] -fn early_data_not_available_on_server_before_client_hello() { - let mut server = ServerConnection::new(Arc::new(make_server_config(KeyType::Rsa))).unwrap(); - assert!(server.early_data().is_none()); -} - -#[test] -fn early_data_can_be_rejected_by_server() { - let (client_config, server_config) = early_data_configs(); - - let (mut client, mut server) = make_pair_for_arc_configs(&client_config, &server_config); - do_handshake(&mut client, &mut server); - - let (mut client, mut server) = make_pair_for_arc_configs(&client_config, &server_config); - assert!(client.early_data().is_some()); - assert_eq!( - client - .early_data() - .unwrap() - .bytes_left(), - 1234 - ); - client - .early_data() - .unwrap() - .flush() - .unwrap(); - assert_eq!( - client - .early_data() - .unwrap() - .write(b"hello") - .unwrap(), - 5 - ); - server.reject_early_data(); - do_handshake(&mut client, &mut server); - - assert!(!client.is_early_data_accepted()); -} - -#[cfg(feature = "quic")] -mod test_quic { - use super::*; - use rustls::Connection; - - // Returns the sender's next secrets to use, or the receiver's error. - fn step( - send: &mut dyn QuicExt, - recv: &mut dyn QuicExt, - ) -> Result, Error> { - let mut buf = Vec::new(); - let change = loop { - let prev = buf.len(); - if let Some(x) = send.write_hs(&mut buf) { - break Some(x); - } - if prev == buf.len() { - break None; - } - }; - if let Err(e) = recv.read_hs(&buf) { - return Err(e); - } else { - assert_eq!(recv.alert(), None); - } - - Ok(change) - } - - #[test] - fn test_quic_handshake() { - fn equal_packet_keys(x: &quic::PacketKey, y: &quic::PacketKey) -> bool { - // Check that these two sets of keys are equal. - let mut buf = vec![0; 32]; - let (header, payload_tag) = buf.split_at_mut(8); - let (payload, tag_buf) = payload_tag.split_at_mut(8); - let tag = x - .encrypt_in_place(42, &*header, payload) - .unwrap(); - tag_buf.copy_from_slice(tag.as_ref()); - - let result = y.decrypt_in_place(42, &*header, payload_tag); - match result { - Ok(payload) => payload == &[0; 8], - Err(_) => false, - } - } - - fn compatible_keys(x: &quic::KeyChange, y: &quic::KeyChange) -> bool { - fn keys(kc: &quic::KeyChange) -> &quic::Keys { - match kc { - quic::KeyChange::Handshake { keys } => keys, - quic::KeyChange::OneRtt { keys, .. } => keys, - } - } - - let (x, y) = (keys(x), keys(y)); - equal_packet_keys(&x.local.packet, &y.remote.packet) - && equal_packet_keys(&x.remote.packet, &y.local.packet) - } - - let kt = KeyType::Rsa; - let mut client_config = make_client_config_with_versions(kt, &[&rustls::version::TLS13]); - client_config.enable_early_data = true; - let client_config = Arc::new(client_config); - let mut server_config = make_server_config_with_versions(kt, &[&rustls::version::TLS13]); - server_config.max_early_data_size = 0xffffffff; - let server_config = Arc::new(server_config); - let client_params = &b"client params"[..]; - let server_params = &b"server params"[..]; - - // full handshake - let mut client = Connection::from( - ClientConnection::new_quic( - Arc::clone(&client_config), - quic::Version::V1, - dns_name("localhost"), - client_params.into(), - ) - .unwrap(), - ); - - let mut server = Connection::from( - ServerConnection::new_quic( - Arc::clone(&server_config), - quic::Version::V1, - server_params.into(), - ) - .unwrap(), - ); - - let client_initial = step(&mut client, &mut server).unwrap(); - assert!(client_initial.is_none()); - assert!(client.zero_rtt_keys().is_none()); - assert_eq!(server.quic_transport_parameters(), Some(client_params)); - let server_hs = step(&mut server, &mut client) - .unwrap() - .unwrap(); - assert!(server.zero_rtt_keys().is_none()); - let client_hs = step(&mut client, &mut server) - .unwrap() - .unwrap(); - assert!(compatible_keys(&server_hs, &client_hs)); - assert!(client.is_handshaking()); - let server_1rtt = step(&mut server, &mut client) - .unwrap() - .unwrap(); - assert!(!client.is_handshaking()); - assert_eq!(client.quic_transport_parameters(), Some(server_params)); - assert!(server.is_handshaking()); - let client_1rtt = step(&mut client, &mut server) - .unwrap() - .unwrap(); - assert!(!server.is_handshaking()); - assert!(compatible_keys(&server_1rtt, &client_1rtt)); - assert!(!compatible_keys(&server_hs, &server_1rtt)); - assert!(step(&mut client, &mut server) - .unwrap() - .is_none()); - assert!(step(&mut server, &mut client) - .unwrap() - .is_none()); - - // 0-RTT handshake - let mut client = ClientConnection::new_quic( - Arc::clone(&client_config), - quic::Version::V1, - dns_name("localhost"), - client_params.into(), - ) - .unwrap(); - assert!(client - .negotiated_cipher_suite() - .is_some()); - - let mut server = ServerConnection::new_quic( - Arc::clone(&server_config), - quic::Version::V1, - server_params.into(), - ) - .unwrap(); - - step(&mut client, &mut server).unwrap(); - assert_eq!(client.quic_transport_parameters(), Some(server_params)); - { - let client_early = client.zero_rtt_keys().unwrap(); - let server_early = server.zero_rtt_keys().unwrap(); - assert!(equal_packet_keys( - &client_early.packet, - &server_early.packet - )); - } - step(&mut server, &mut client) - .unwrap() - .unwrap(); - step(&mut client, &mut server) - .unwrap() - .unwrap(); - step(&mut server, &mut client) - .unwrap() - .unwrap(); - assert!(client.is_early_data_accepted()); - - // 0-RTT rejection - { - let client_config = (*client_config).clone(); - let mut client = ClientConnection::new_quic( - Arc::new(client_config), - quic::Version::V1, - dns_name("localhost"), - client_params.into(), - ) - .unwrap(); - - let mut server = ServerConnection::new_quic( - Arc::clone(&server_config), - quic::Version::V1, - server_params.into(), - ) - .unwrap(); - - step(&mut client, &mut server).unwrap(); - assert_eq!(client.quic_transport_parameters(), Some(server_params)); - assert!(client.zero_rtt_keys().is_some()); - assert!(server.zero_rtt_keys().is_none()); - step(&mut server, &mut client) - .unwrap() - .unwrap(); - step(&mut client, &mut server) - .unwrap() - .unwrap(); - step(&mut server, &mut client) - .unwrap() - .unwrap(); - assert!(!client.is_early_data_accepted()); - } - - // failed handshake - let mut client = ClientConnection::new_quic( - client_config, - quic::Version::V1, - dns_name("example.com"), - client_params.into(), - ) - .unwrap(); - - let mut server = - ServerConnection::new_quic(server_config, quic::Version::V1, server_params.into()) - .unwrap(); - - step(&mut client, &mut server).unwrap(); - step(&mut server, &mut client) - .unwrap() - .unwrap(); - assert!(step(&mut server, &mut client).is_err()); - assert_eq!( - client.alert(), - Some(rustls::AlertDescription::BadCertificate) - ); - - // Key updates - - let (mut client_secrets, mut server_secrets) = match (client_1rtt, server_1rtt) { - (quic::KeyChange::OneRtt { next: c, .. }, quic::KeyChange::OneRtt { next: s, .. }) => { - (c, s) - } - _ => unreachable!(), - }; - - let mut client_next = client_secrets.next_packet_keys(); - let mut server_next = server_secrets.next_packet_keys(); - assert!(equal_packet_keys(&client_next.local, &server_next.remote)); - assert!(equal_packet_keys(&server_next.local, &client_next.remote)); - - client_next = client_secrets.next_packet_keys(); - server_next = server_secrets.next_packet_keys(); - assert!(equal_packet_keys(&client_next.local, &server_next.remote)); - assert!(equal_packet_keys(&server_next.local, &client_next.remote)); - } - - #[test] - fn test_quic_rejects_missing_alpn() { - let client_params = &b"client params"[..]; - let server_params = &b"server params"[..]; - - for &kt in ALL_KEY_TYPES.iter() { - let client_config = make_client_config_with_versions(kt, &[&rustls::version::TLS13]); - let client_config = Arc::new(client_config); - - let mut server_config = - make_server_config_with_versions(kt, &[&rustls::version::TLS13]); - server_config.alpn_protocols = vec!["foo".into()]; - let server_config = Arc::new(server_config); - - let mut client = ClientConnection::new_quic( - client_config, - quic::Version::V1, - dns_name("localhost"), - client_params.into(), - ) - .unwrap(); - let mut server = - ServerConnection::new_quic(server_config, quic::Version::V1, server_params.into()) - .unwrap(); - - assert_eq!( - step(&mut client, &mut server) - .err() - .unwrap(), - Error::NoApplicationProtocol - ); - - assert_eq!( - server.alert(), - Some(rustls::AlertDescription::NoApplicationProtocol) - ); - } - } - - #[cfg(feature = "tls12")] - #[test] - fn test_quic_no_tls13_error() { - let mut client_config = - make_client_config_with_versions(KeyType::Ed25519, &[&rustls::version::TLS12]); - client_config.alpn_protocols = vec!["foo".into()]; - let client_config = Arc::new(client_config); - - assert!(ClientConnection::new_quic( - client_config, - quic::Version::V1, - dns_name("localhost"), - b"client params".to_vec(), - ) - .is_err()); - - let mut server_config = - make_server_config_with_versions(KeyType::Ed25519, &[&rustls::version::TLS12]); - server_config.alpn_protocols = vec!["foo".into()]; - let server_config = Arc::new(server_config); - - assert!(ServerConnection::new_quic( - server_config, - quic::Version::V1, - b"server params".to_vec(), - ) - .is_err()); - } - - #[test] - fn test_quic_invalid_early_data_size() { - let mut server_config = - make_server_config_with_versions(KeyType::Ed25519, &[&rustls::version::TLS13]); - server_config.alpn_protocols = vec!["foo".into()]; - - let cases = [ - (None, true), - (Some(0u32), true), - (Some(5), false), - (Some(0xffff_ffff), true), - ]; - - for &(size, ok) in cases.iter() { - println!("early data size case: {:?}", size); - if let Some(new) = size { - server_config.max_early_data_size = new; - } - - let wrapped = Arc::new(server_config.clone()); - assert_eq!( - ServerConnection::new_quic(wrapped, quic::Version::V1, b"server params".to_vec(),) - .is_ok(), - ok - ); - } - } - - #[test] - fn test_quic_server_no_params_received() { - let server_config = - make_server_config_with_versions(KeyType::Ed25519, &[&rustls::version::TLS13]); - let server_config = Arc::new(server_config); - - let mut server = - ServerConnection::new_quic(server_config, quic::Version::V1, b"server params".to_vec()) - .unwrap(); - - use ring::rand::SecureRandom; - use rustls::internal::msgs::base::PayloadU16; - use rustls::internal::msgs::enums::{Compression, HandshakeType, NamedGroup}; - use rustls::internal::msgs::handshake::{ - ClientHelloPayload, HandshakeMessagePayload, KeyShareEntry, Random, SessionID, - }; - use rustls::internal::msgs::message::PlainMessage; - use rustls::{CipherSuite, SignatureScheme}; - - let rng = ring::rand::SystemRandom::new(); - let mut random = [0; 32]; - rng.fill(&mut random).unwrap(); - let random = Random::from(random); - - let kx = ring::agreement::EphemeralPrivateKey::generate(&ring::agreement::X25519, &rng) - .unwrap() - .compute_public_key() - .unwrap(); - - let client_hello = Message { - version: ProtocolVersion::TLSv1_3, - payload: MessagePayload::handshake(HandshakeMessagePayload { - typ: HandshakeType::ClientHello, - payload: HandshakePayload::ClientHello(ClientHelloPayload { - client_version: ProtocolVersion::TLSv1_3, - random, - session_id: SessionID::random().unwrap(), - cipher_suites: vec![CipherSuite::TLS13_AES_128_GCM_SHA256], - compression_methods: vec![Compression::Null], - extensions: vec![ - ClientExtension::SupportedVersions(vec![ProtocolVersion::TLSv1_3]), - ClientExtension::NamedGroups(vec![NamedGroup::X25519]), - ClientExtension::SignatureAlgorithms(vec![SignatureScheme::ED25519]), - ClientExtension::KeyShare(vec![KeyShareEntry { - group: NamedGroup::X25519, - payload: PayloadU16::new(kx.as_ref().to_vec()), - }]), - ], - }), - }), - }; - - let buf = PlainMessage::from(client_hello) - .into_unencrypted_opaque() - .encode(); - server - .read_tls(&mut buf.as_slice()) - .unwrap(); - assert_eq!( - server.process_new_packets().err(), - Some(Error::PeerMisbehavedError( - "QUIC transport parameters not found".into(), - )), - ); - } - - #[test] - fn test_quic_server_no_tls12() { - let mut server_config = - make_server_config_with_versions(KeyType::Ed25519, &[&rustls::version::TLS13]); - server_config.alpn_protocols = vec!["foo".into()]; - let server_config = Arc::new(server_config); - - use ring::rand::SecureRandom; - use rustls::internal::msgs::base::PayloadU16; - use rustls::internal::msgs::enums::{Compression, HandshakeType, NamedGroup}; - use rustls::internal::msgs::handshake::{ - ClientHelloPayload, HandshakeMessagePayload, KeyShareEntry, Random, SessionID, - }; - use rustls::internal::msgs::message::PlainMessage; - use rustls::{CipherSuite, SignatureScheme}; - - let rng = ring::rand::SystemRandom::new(); - let mut random = [0; 32]; - rng.fill(&mut random).unwrap(); - let random = Random::from(random); - - let kx = ring::agreement::EphemeralPrivateKey::generate(&ring::agreement::X25519, &rng) - .unwrap() - .compute_public_key() - .unwrap(); - - let mut server = - ServerConnection::new_quic(server_config, quic::Version::V1, b"server params".to_vec()) - .unwrap(); - - let client_hello = Message { - version: ProtocolVersion::TLSv1_2, - payload: MessagePayload::handshake(HandshakeMessagePayload { - typ: HandshakeType::ClientHello, - payload: HandshakePayload::ClientHello(ClientHelloPayload { - client_version: ProtocolVersion::TLSv1_2, - random: random.clone(), - session_id: SessionID::random().unwrap(), - cipher_suites: vec![CipherSuite::TLS13_AES_128_GCM_SHA256], - compression_methods: vec![Compression::Null], - extensions: vec![ - ClientExtension::NamedGroups(vec![NamedGroup::X25519]), - ClientExtension::SignatureAlgorithms(vec![SignatureScheme::ED25519]), - ClientExtension::KeyShare(vec![KeyShareEntry { - group: NamedGroup::X25519, - payload: PayloadU16::new(kx.as_ref().to_vec()), - }]), - ], - }), - }), - }; - - let buf = PlainMessage::from(client_hello) - .into_unencrypted_opaque() - .encode(); - server - .read_tls(&mut buf.as_slice()) - .unwrap(); - assert_eq!( - server.process_new_packets().err(), - Some(Error::PeerIncompatibleError( - "Server requires TLS1.3, but client omitted versions ext".into(), - )), - ); - } - - #[test] - fn packet_key_api() { - use rustls::quic::{Keys, Version}; - - // Test vectors: https://www.rfc-editor.org/rfc/rfc9001.html#name-client-initial - const CONNECTION_ID: &[u8] = &[0x83, 0x94, 0xc8, 0xf0, 0x3e, 0x51, 0x57, 0x08]; - const PACKET_NUMBER: u64 = 2; - const PLAIN_HEADER: &[u8] = &[ - 0xc3, 0x00, 0x00, 0x00, 0x01, 0x08, 0x83, 0x94, 0xc8, 0xf0, 0x3e, 0x51, 0x57, 0x08, - 0x00, 0x00, 0x44, 0x9e, 0x00, 0x00, 0x00, 0x02, - ]; - - const PAYLOAD: &[u8] = &[ - 0x06, 0x00, 0x40, 0xf1, 0x01, 0x00, 0x00, 0xed, 0x03, 0x03, 0xeb, 0xf8, 0xfa, 0x56, - 0xf1, 0x29, 0x39, 0xb9, 0x58, 0x4a, 0x38, 0x96, 0x47, 0x2e, 0xc4, 0x0b, 0xb8, 0x63, - 0xcf, 0xd3, 0xe8, 0x68, 0x04, 0xfe, 0x3a, 0x47, 0xf0, 0x6a, 0x2b, 0x69, 0x48, 0x4c, - 0x00, 0x00, 0x04, 0x13, 0x01, 0x13, 0x02, 0x01, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x0e, 0x00, 0x00, 0x0b, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, - 0x63, 0x6f, 0x6d, 0xff, 0x01, 0x00, 0x01, 0x00, 0x00, 0x0a, 0x00, 0x08, 0x00, 0x06, - 0x00, 0x1d, 0x00, 0x17, 0x00, 0x18, 0x00, 0x10, 0x00, 0x07, 0x00, 0x05, 0x04, 0x61, - 0x6c, 0x70, 0x6e, 0x00, 0x05, 0x00, 0x05, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, - 0x00, 0x26, 0x00, 0x24, 0x00, 0x1d, 0x00, 0x20, 0x93, 0x70, 0xb2, 0xc9, 0xca, 0xa4, - 0x7f, 0xba, 0xba, 0xf4, 0x55, 0x9f, 0xed, 0xba, 0x75, 0x3d, 0xe1, 0x71, 0xfa, 0x71, - 0xf5, 0x0f, 0x1c, 0xe1, 0x5d, 0x43, 0xe9, 0x94, 0xec, 0x74, 0xd7, 0x48, 0x00, 0x2b, - 0x00, 0x03, 0x02, 0x03, 0x04, 0x00, 0x0d, 0x00, 0x10, 0x00, 0x0e, 0x04, 0x03, 0x05, - 0x03, 0x06, 0x03, 0x02, 0x03, 0x08, 0x04, 0x08, 0x05, 0x08, 0x06, 0x00, 0x2d, 0x00, - 0x02, 0x01, 0x01, 0x00, 0x1c, 0x00, 0x02, 0x40, 0x01, 0x00, 0x39, 0x00, 0x32, 0x04, - 0x08, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x05, 0x04, 0x80, 0x00, 0xff, - 0xff, 0x07, 0x04, 0x80, 0x00, 0xff, 0xff, 0x08, 0x01, 0x10, 0x01, 0x04, 0x80, 0x00, - 0x75, 0x30, 0x09, 0x01, 0x10, 0x0f, 0x08, 0x83, 0x94, 0xc8, 0xf0, 0x3e, 0x51, 0x57, - 0x08, 0x06, 0x04, 0x80, 0x00, 0xff, 0xff, - ]; - - let client_keys = Keys::initial(Version::V1, &CONNECTION_ID, true); - assert_eq!( - client_keys - .local - .packet - .confidentiality_limit(), - 2u64.pow(23) - ); - assert_eq!( - client_keys - .local - .packet - .integrity_limit(), - 2u64.pow(52) - ); - assert_eq!(client_keys.local.packet.tag_len(), 16); - - let mut buf = Vec::new(); - buf.extend(PLAIN_HEADER); - buf.extend(PAYLOAD); - let header_len = PLAIN_HEADER.len(); - let tag_len = client_keys.local.packet.tag_len(); - let padding_len = 1200 - header_len - PAYLOAD.len() - tag_len; - buf.extend(std::iter::repeat(0).take(padding_len)); - let (header, payload) = buf.split_at_mut(header_len); - let tag = client_keys - .local - .packet - .encrypt_in_place(PACKET_NUMBER, &*header, payload) - .unwrap(); - - let sample_len = client_keys.local.header.sample_len(); - let sample = &payload[..sample_len]; - let (first, rest) = header.split_at_mut(1); - client_keys - .local - .header - .encrypt_in_place(sample, &mut first[0], &mut rest[17..21]) - .unwrap(); - buf.extend_from_slice(tag.as_ref()); - - const PROTECTED: &[u8] = &[ - 0xc0, 0x00, 0x00, 0x00, 0x01, 0x08, 0x83, 0x94, 0xc8, 0xf0, 0x3e, 0x51, 0x57, 0x08, - 0x00, 0x00, 0x44, 0x9e, 0x7b, 0x9a, 0xec, 0x34, 0xd1, 0xb1, 0xc9, 0x8d, 0xd7, 0x68, - 0x9f, 0xb8, 0xec, 0x11, 0xd2, 0x42, 0xb1, 0x23, 0xdc, 0x9b, 0xd8, 0xba, 0xb9, 0x36, - 0xb4, 0x7d, 0x92, 0xec, 0x35, 0x6c, 0x0b, 0xab, 0x7d, 0xf5, 0x97, 0x6d, 0x27, 0xcd, - 0x44, 0x9f, 0x63, 0x30, 0x00, 0x99, 0xf3, 0x99, 0x1c, 0x26, 0x0e, 0xc4, 0xc6, 0x0d, - 0x17, 0xb3, 0x1f, 0x84, 0x29, 0x15, 0x7b, 0xb3, 0x5a, 0x12, 0x82, 0xa6, 0x43, 0xa8, - 0xd2, 0x26, 0x2c, 0xad, 0x67, 0x50, 0x0c, 0xad, 0xb8, 0xe7, 0x37, 0x8c, 0x8e, 0xb7, - 0x53, 0x9e, 0xc4, 0xd4, 0x90, 0x5f, 0xed, 0x1b, 0xee, 0x1f, 0xc8, 0xaa, 0xfb, 0xa1, - 0x7c, 0x75, 0x0e, 0x2c, 0x7a, 0xce, 0x01, 0xe6, 0x00, 0x5f, 0x80, 0xfc, 0xb7, 0xdf, - 0x62, 0x12, 0x30, 0xc8, 0x37, 0x11, 0xb3, 0x93, 0x43, 0xfa, 0x02, 0x8c, 0xea, 0x7f, - 0x7f, 0xb5, 0xff, 0x89, 0xea, 0xc2, 0x30, 0x82, 0x49, 0xa0, 0x22, 0x52, 0x15, 0x5e, - 0x23, 0x47, 0xb6, 0x3d, 0x58, 0xc5, 0x45, 0x7a, 0xfd, 0x84, 0xd0, 0x5d, 0xff, 0xfd, - 0xb2, 0x03, 0x92, 0x84, 0x4a, 0xe8, 0x12, 0x15, 0x46, 0x82, 0xe9, 0xcf, 0x01, 0x2f, - 0x90, 0x21, 0xa6, 0xf0, 0xbe, 0x17, 0xdd, 0xd0, 0xc2, 0x08, 0x4d, 0xce, 0x25, 0xff, - 0x9b, 0x06, 0xcd, 0xe5, 0x35, 0xd0, 0xf9, 0x20, 0xa2, 0xdb, 0x1b, 0xf3, 0x62, 0xc2, - 0x3e, 0x59, 0x6d, 0x11, 0xa4, 0xf5, 0xa6, 0xcf, 0x39, 0x48, 0x83, 0x8a, 0x3a, 0xec, - 0x4e, 0x15, 0xda, 0xf8, 0x50, 0x0a, 0x6e, 0xf6, 0x9e, 0xc4, 0xe3, 0xfe, 0xb6, 0xb1, - 0xd9, 0x8e, 0x61, 0x0a, 0xc8, 0xb7, 0xec, 0x3f, 0xaf, 0x6a, 0xd7, 0x60, 0xb7, 0xba, - 0xd1, 0xdb, 0x4b, 0xa3, 0x48, 0x5e, 0x8a, 0x94, 0xdc, 0x25, 0x0a, 0xe3, 0xfd, 0xb4, - 0x1e, 0xd1, 0x5f, 0xb6, 0xa8, 0xe5, 0xeb, 0xa0, 0xfc, 0x3d, 0xd6, 0x0b, 0xc8, 0xe3, - 0x0c, 0x5c, 0x42, 0x87, 0xe5, 0x38, 0x05, 0xdb, 0x05, 0x9a, 0xe0, 0x64, 0x8d, 0xb2, - 0xf6, 0x42, 0x64, 0xed, 0x5e, 0x39, 0xbe, 0x2e, 0x20, 0xd8, 0x2d, 0xf5, 0x66, 0xda, - 0x8d, 0xd5, 0x99, 0x8c, 0xca, 0xbd, 0xae, 0x05, 0x30, 0x60, 0xae, 0x6c, 0x7b, 0x43, - 0x78, 0xe8, 0x46, 0xd2, 0x9f, 0x37, 0xed, 0x7b, 0x4e, 0xa9, 0xec, 0x5d, 0x82, 0xe7, - 0x96, 0x1b, 0x7f, 0x25, 0xa9, 0x32, 0x38, 0x51, 0xf6, 0x81, 0xd5, 0x82, 0x36, 0x3a, - 0xa5, 0xf8, 0x99, 0x37, 0xf5, 0xa6, 0x72, 0x58, 0xbf, 0x63, 0xad, 0x6f, 0x1a, 0x0b, - 0x1d, 0x96, 0xdb, 0xd4, 0xfa, 0xdd, 0xfc, 0xef, 0xc5, 0x26, 0x6b, 0xa6, 0x61, 0x17, - 0x22, 0x39, 0x5c, 0x90, 0x65, 0x56, 0xbe, 0x52, 0xaf, 0xe3, 0xf5, 0x65, 0x63, 0x6a, - 0xd1, 0xb1, 0x7d, 0x50, 0x8b, 0x73, 0xd8, 0x74, 0x3e, 0xeb, 0x52, 0x4b, 0xe2, 0x2b, - 0x3d, 0xcb, 0xc2, 0xc7, 0x46, 0x8d, 0x54, 0x11, 0x9c, 0x74, 0x68, 0x44, 0x9a, 0x13, - 0xd8, 0xe3, 0xb9, 0x58, 0x11, 0xa1, 0x98, 0xf3, 0x49, 0x1d, 0xe3, 0xe7, 0xfe, 0x94, - 0x2b, 0x33, 0x04, 0x07, 0xab, 0xf8, 0x2a, 0x4e, 0xd7, 0xc1, 0xb3, 0x11, 0x66, 0x3a, - 0xc6, 0x98, 0x90, 0xf4, 0x15, 0x70, 0x15, 0x85, 0x3d, 0x91, 0xe9, 0x23, 0x03, 0x7c, - 0x22, 0x7a, 0x33, 0xcd, 0xd5, 0xec, 0x28, 0x1c, 0xa3, 0xf7, 0x9c, 0x44, 0x54, 0x6b, - 0x9d, 0x90, 0xca, 0x00, 0xf0, 0x64, 0xc9, 0x9e, 0x3d, 0xd9, 0x79, 0x11, 0xd3, 0x9f, - 0xe9, 0xc5, 0xd0, 0xb2, 0x3a, 0x22, 0x9a, 0x23, 0x4c, 0xb3, 0x61, 0x86, 0xc4, 0x81, - 0x9e, 0x8b, 0x9c, 0x59, 0x27, 0x72, 0x66, 0x32, 0x29, 0x1d, 0x6a, 0x41, 0x82, 0x11, - 0xcc, 0x29, 0x62, 0xe2, 0x0f, 0xe4, 0x7f, 0xeb, 0x3e, 0xdf, 0x33, 0x0f, 0x2c, 0x60, - 0x3a, 0x9d, 0x48, 0xc0, 0xfc, 0xb5, 0x69, 0x9d, 0xbf, 0xe5, 0x89, 0x64, 0x25, 0xc5, - 0xba, 0xc4, 0xae, 0xe8, 0x2e, 0x57, 0xa8, 0x5a, 0xaf, 0x4e, 0x25, 0x13, 0xe4, 0xf0, - 0x57, 0x96, 0xb0, 0x7b, 0xa2, 0xee, 0x47, 0xd8, 0x05, 0x06, 0xf8, 0xd2, 0xc2, 0x5e, - 0x50, 0xfd, 0x14, 0xde, 0x71, 0xe6, 0xc4, 0x18, 0x55, 0x93, 0x02, 0xf9, 0x39, 0xb0, - 0xe1, 0xab, 0xd5, 0x76, 0xf2, 0x79, 0xc4, 0xb2, 0xe0, 0xfe, 0xb8, 0x5c, 0x1f, 0x28, - 0xff, 0x18, 0xf5, 0x88, 0x91, 0xff, 0xef, 0x13, 0x2e, 0xef, 0x2f, 0xa0, 0x93, 0x46, - 0xae, 0xe3, 0x3c, 0x28, 0xeb, 0x13, 0x0f, 0xf2, 0x8f, 0x5b, 0x76, 0x69, 0x53, 0x33, - 0x41, 0x13, 0x21, 0x19, 0x96, 0xd2, 0x00, 0x11, 0xa1, 0x98, 0xe3, 0xfc, 0x43, 0x3f, - 0x9f, 0x25, 0x41, 0x01, 0x0a, 0xe1, 0x7c, 0x1b, 0xf2, 0x02, 0x58, 0x0f, 0x60, 0x47, - 0x47, 0x2f, 0xb3, 0x68, 0x57, 0xfe, 0x84, 0x3b, 0x19, 0xf5, 0x98, 0x40, 0x09, 0xdd, - 0xc3, 0x24, 0x04, 0x4e, 0x84, 0x7a, 0x4f, 0x4a, 0x0a, 0xb3, 0x4f, 0x71, 0x95, 0x95, - 0xde, 0x37, 0x25, 0x2d, 0x62, 0x35, 0x36, 0x5e, 0x9b, 0x84, 0x39, 0x2b, 0x06, 0x10, - 0x85, 0x34, 0x9d, 0x73, 0x20, 0x3a, 0x4a, 0x13, 0xe9, 0x6f, 0x54, 0x32, 0xec, 0x0f, - 0xd4, 0xa1, 0xee, 0x65, 0xac, 0xcd, 0xd5, 0xe3, 0x90, 0x4d, 0xf5, 0x4c, 0x1d, 0xa5, - 0x10, 0xb0, 0xff, 0x20, 0xdc, 0xc0, 0xc7, 0x7f, 0xcb, 0x2c, 0x0e, 0x0e, 0xb6, 0x05, - 0xcb, 0x05, 0x04, 0xdb, 0x87, 0x63, 0x2c, 0xf3, 0xd8, 0xb4, 0xda, 0xe6, 0xe7, 0x05, - 0x76, 0x9d, 0x1d, 0xe3, 0x54, 0x27, 0x01, 0x23, 0xcb, 0x11, 0x45, 0x0e, 0xfc, 0x60, - 0xac, 0x47, 0x68, 0x3d, 0x7b, 0x8d, 0x0f, 0x81, 0x13, 0x65, 0x56, 0x5f, 0xd9, 0x8c, - 0x4c, 0x8e, 0xb9, 0x36, 0xbc, 0xab, 0x8d, 0x06, 0x9f, 0xc3, 0x3b, 0xd8, 0x01, 0xb0, - 0x3a, 0xde, 0xa2, 0xe1, 0xfb, 0xc5, 0xaa, 0x46, 0x3d, 0x08, 0xca, 0x19, 0x89, 0x6d, - 0x2b, 0xf5, 0x9a, 0x07, 0x1b, 0x85, 0x1e, 0x6c, 0x23, 0x90, 0x52, 0x17, 0x2f, 0x29, - 0x6b, 0xfb, 0x5e, 0x72, 0x40, 0x47, 0x90, 0xa2, 0x18, 0x10, 0x14, 0xf3, 0xb9, 0x4a, - 0x4e, 0x97, 0xd1, 0x17, 0xb4, 0x38, 0x13, 0x03, 0x68, 0xcc, 0x39, 0xdb, 0xb2, 0xd1, - 0x98, 0x06, 0x5a, 0xe3, 0x98, 0x65, 0x47, 0x92, 0x6c, 0xd2, 0x16, 0x2f, 0x40, 0xa2, - 0x9f, 0x0c, 0x3c, 0x87, 0x45, 0xc0, 0xf5, 0x0f, 0xba, 0x38, 0x52, 0xe5, 0x66, 0xd4, - 0x45, 0x75, 0xc2, 0x9d, 0x39, 0xa0, 0x3f, 0x0c, 0xda, 0x72, 0x19, 0x84, 0xb6, 0xf4, - 0x40, 0x59, 0x1f, 0x35, 0x5e, 0x12, 0xd4, 0x39, 0xff, 0x15, 0x0a, 0xab, 0x76, 0x13, - 0x49, 0x9d, 0xbd, 0x49, 0xad, 0xab, 0xc8, 0x67, 0x6e, 0xef, 0x02, 0x3b, 0x15, 0xb6, - 0x5b, 0xfc, 0x5c, 0xa0, 0x69, 0x48, 0x10, 0x9f, 0x23, 0xf3, 0x50, 0xdb, 0x82, 0x12, - 0x35, 0x35, 0xeb, 0x8a, 0x74, 0x33, 0xbd, 0xab, 0xcb, 0x90, 0x92, 0x71, 0xa6, 0xec, - 0xbc, 0xb5, 0x8b, 0x93, 0x6a, 0x88, 0xcd, 0x4e, 0x8f, 0x2e, 0x6f, 0xf5, 0x80, 0x01, - 0x75, 0xf1, 0x13, 0x25, 0x3d, 0x8f, 0xa9, 0xca, 0x88, 0x85, 0xc2, 0xf5, 0x52, 0xe6, - 0x57, 0xdc, 0x60, 0x3f, 0x25, 0x2e, 0x1a, 0x8e, 0x30, 0x8f, 0x76, 0xf0, 0xbe, 0x79, - 0xe2, 0xfb, 0x8f, 0x5d, 0x5f, 0xbb, 0xe2, 0xe3, 0x0e, 0xca, 0xdd, 0x22, 0x07, 0x23, - 0xc8, 0xc0, 0xae, 0xa8, 0x07, 0x8c, 0xdf, 0xcb, 0x38, 0x68, 0x26, 0x3f, 0xf8, 0xf0, - 0x94, 0x00, 0x54, 0xda, 0x48, 0x78, 0x18, 0x93, 0xa7, 0xe4, 0x9a, 0xd5, 0xaf, 0xf4, - 0xaf, 0x30, 0x0c, 0xd8, 0x04, 0xa6, 0xb6, 0x27, 0x9a, 0xb3, 0xff, 0x3a, 0xfb, 0x64, - 0x49, 0x1c, 0x85, 0x19, 0x4a, 0xab, 0x76, 0x0d, 0x58, 0xa6, 0x06, 0x65, 0x4f, 0x9f, - 0x44, 0x00, 0xe8, 0xb3, 0x85, 0x91, 0x35, 0x6f, 0xbf, 0x64, 0x25, 0xac, 0xa2, 0x6d, - 0xc8, 0x52, 0x44, 0x25, 0x9f, 0xf2, 0xb1, 0x9c, 0x41, 0xb9, 0xf9, 0x6f, 0x3c, 0xa9, - 0xec, 0x1d, 0xde, 0x43, 0x4d, 0xa7, 0xd2, 0xd3, 0x92, 0xb9, 0x05, 0xdd, 0xf3, 0xd1, - 0xf9, 0xaf, 0x93, 0xd1, 0xaf, 0x59, 0x50, 0xbd, 0x49, 0x3f, 0x5a, 0xa7, 0x31, 0xb4, - 0x05, 0x6d, 0xf3, 0x1b, 0xd2, 0x67, 0xb6, 0xb9, 0x0a, 0x07, 0x98, 0x31, 0xaa, 0xf5, - 0x79, 0xbe, 0x0a, 0x39, 0x01, 0x31, 0x37, 0xaa, 0xc6, 0xd4, 0x04, 0xf5, 0x18, 0xcf, - 0xd4, 0x68, 0x40, 0x64, 0x7e, 0x78, 0xbf, 0xe7, 0x06, 0xca, 0x4c, 0xf5, 0xe9, 0xc5, - 0x45, 0x3e, 0x9f, 0x7c, 0xfd, 0x2b, 0x8b, 0x4c, 0x8d, 0x16, 0x9a, 0x44, 0xe5, 0x5c, - 0x88, 0xd4, 0xa9, 0xa7, 0xf9, 0x47, 0x42, 0x41, 0xe2, 0x21, 0xaf, 0x44, 0x86, 0x00, - 0x18, 0xab, 0x08, 0x56, 0x97, 0x2e, 0x19, 0x4c, 0xd9, 0x34, - ]; - - assert_eq!(&buf, PROTECTED); - - let (header, payload) = buf.split_at_mut(header_len); - let (first, rest) = header.split_at_mut(1); - let sample = &payload[..sample_len]; - - let server_keys = Keys::initial(Version::V1, &CONNECTION_ID, false); - server_keys - .remote - .header - .decrypt_in_place(sample, &mut first[0], &mut rest[17..21]) - .unwrap(); - let payload = server_keys - .remote - .packet - .decrypt_in_place(PACKET_NUMBER, &*header, payload) - .unwrap(); - - assert_eq!(&payload[..PAYLOAD.len()], PAYLOAD); - assert_eq!(payload.len(), buf.len() - header_len - tag_len); - } - - #[test] - fn test_quic_exporter() { - for &kt in ALL_KEY_TYPES.iter() { - let client_config = make_client_config_with_versions(kt, &[&rustls::version::TLS13]); - let server_config = make_server_config_with_versions(kt, &[&rustls::version::TLS13]); - - do_exporter_test(client_config, server_config); - } - } -} // mod test_quic - -#[test] -fn test_client_does_not_offer_sha1() { - use rustls::internal::msgs::{ - codec::Reader, enums::HandshakeType, handshake::HandshakePayload, message::MessagePayload, - message::OpaqueMessage, - }; - - for kt in ALL_KEY_TYPES.iter() { - for version in rustls::ALL_VERSIONS { - let client_config = make_client_config_with_versions(*kt, &[version]); - let (mut client, _) = make_pair_for_configs(client_config, make_server_config(*kt)); - - assert!(client.wants_write()); - let mut buf = [0u8; 262144]; - let sz = client - .write_tls(&mut buf.as_mut()) - .unwrap(); - let msg = OpaqueMessage::read(&mut Reader::init(&buf[..sz])).unwrap(); - let msg = Message::try_from(msg.into_plain_message()).unwrap(); - assert!(msg.is_handshake_type(HandshakeType::ClientHello)); - - let client_hello = match msg.payload { - MessagePayload::Handshake { parsed, .. } => match parsed.payload { - HandshakePayload::ClientHello(ch) => ch, - _ => unreachable!(), - }, - _ => unreachable!(), - }; - - let sigalgs = client_hello - .get_sigalgs_extension() - .unwrap(); - assert!( - !sigalgs.contains(&SignatureScheme::RSA_PKCS1_SHA1), - "sha1 unexpectedly offered" - ); - } - } -} - -#[test] -fn test_client_config_keyshare() { - let client_config = - make_client_config_with_kx_groups(KeyType::Rsa, &[&rustls::kx_group::SECP384R1]); - let server_config = - make_server_config_with_kx_groups(KeyType::Rsa, &[&rustls::kx_group::SECP384R1]); - let (mut client, mut server) = make_pair_for_configs(client_config, server_config); - do_handshake_until_error(&mut client, &mut server).unwrap(); -} - -#[test] -fn test_client_config_keyshare_mismatch() { - let client_config = - make_client_config_with_kx_groups(KeyType::Rsa, &[&rustls::kx_group::SECP384R1]); - let server_config = - make_server_config_with_kx_groups(KeyType::Rsa, &[&rustls::kx_group::X25519]); - let (mut client, mut server) = make_pair_for_configs(client_config, server_config); - assert!(do_handshake_until_error(&mut client, &mut server).is_err()); -} - -#[test] -fn test_client_sends_helloretryrequest() { - // client sends a secp384r1 key share - let mut client_config = make_client_config_with_kx_groups( - KeyType::Rsa, - &[&rustls::kx_group::SECP384R1, &rustls::kx_group::X25519], - ); - - let storage = Arc::new(ClientStorage::new()); - client_config.session_storage = storage.clone(); - - // but server only accepts x25519, so a HRR is required - let server_config = - make_server_config_with_kx_groups(KeyType::Rsa, &[&rustls::kx_group::X25519]); - - let (mut client, mut server) = make_pair_for_configs(client_config, server_config); - - // client sends hello - { - let mut pipe = OtherSession::new(&mut server); - let wrlen = client.write_tls(&mut pipe).unwrap(); - assert!(wrlen > 200); - assert_eq!(pipe.writevs.len(), 1); - assert!(pipe.writevs[0].len() == 1); - } - - // server sends HRR - { - let mut pipe = OtherSession::new(&mut client); - let wrlen = server.write_tls(&mut pipe).unwrap(); - assert!(wrlen < 100); // just the hello retry request - assert_eq!(pipe.writevs.len(), 1); // only one writev - assert!(pipe.writevs[0].len() == 2); // hello retry request and CCS - } - - // client sends fixed hello - { - let mut pipe = OtherSession::new(&mut server); - let wrlen = client.write_tls(&mut pipe).unwrap(); - assert!(wrlen > 200); // just the client hello retry - assert_eq!(pipe.writevs.len(), 1); // only one writev - assert!(pipe.writevs[0].len() == 2); // only a CCS & client hello retry - } - - // server completes handshake - { - let mut pipe = OtherSession::new(&mut client); - let wrlen = server.write_tls(&mut pipe).unwrap(); - assert!(wrlen > 200); - assert_eq!(pipe.writevs.len(), 1); - assert!(pipe.writevs[0].len() == 5); // server hello / encrypted exts / cert / cert-verify / finished - } - - do_handshake_until_error(&mut client, &mut server).unwrap(); - - // client only did two storage queries: one for a session, another for a kx type - assert_eq!(storage.gets(), 2); - assert_eq!(storage.puts(), 2); -} - -#[test] -fn test_client_rejects_hrr_with_varied_session_id() { - let different_session_id = SessionID::random().unwrap(); - - let assert_client_sends_hello_with_secp384 = |msg: &mut Message| -> Altered { - if let MessagePayload::Handshake { parsed, encoded } = &mut msg.payload { - if let HandshakePayload::ClientHello(ch) = &mut parsed.payload { - let keyshares = ch - .get_keyshare_extension() - .expect("missing key share extension"); - assert_eq!(keyshares.len(), 1); - assert_eq!(keyshares[0].group, rustls::NamedGroup::secp384r1); - - ch.session_id = different_session_id; - *encoded = Payload::new(parsed.get_encoding()); - } - } - Altered::InPlace - }; - - let assert_server_requests_retry_and_echoes_session_id = |msg: &mut Message| -> Altered { - if let MessagePayload::Handshake { parsed, .. } = &mut msg.payload { - if let HandshakePayload::HelloRetryRequest(hrr) = &mut parsed.payload { - let group = hrr.get_requested_key_share_group(); - assert_eq!(group, Some(rustls::NamedGroup::X25519)); - - assert_eq!(hrr.session_id, different_session_id); - } - } - Altered::InPlace - }; - - // client prefers a secp384r1 key share, server only accepts x25519 - let client_config = make_client_config_with_kx_groups( - KeyType::Rsa, - &[&rustls::kx_group::SECP384R1, &rustls::kx_group::X25519], - ); - - let server_config = - make_server_config_with_kx_groups(KeyType::Rsa, &[&rustls::kx_group::X25519]); - - let (client, server) = make_pair_for_configs(client_config, server_config); - let (mut client, mut server) = (client.into(), server.into()); - transfer_altered( - &mut client, - assert_client_sends_hello_with_secp384, - &mut server, - ); - server.process_new_packets().unwrap(); - transfer_altered( - &mut server, - assert_server_requests_retry_and_echoes_session_id, - &mut client, - ); - assert_eq!( - client.process_new_packets(), - Err(Error::PeerMisbehavedError( - "server did not echo the session_id from client hello".to_string() - )) - ); -} - -#[test] -fn test_client_attempts_to_use_unsupported_kx_group() { - // common to both client configs - let shared_storage = Arc::new(ClientStorage::new()); - - // first, client sends a x25519 and server agrees. x25519 is inserted - // into kx group cache. - let mut client_config_1 = - make_client_config_with_kx_groups(KeyType::Rsa, &[&rustls::kx_group::X25519]); - client_config_1.session_storage = shared_storage.clone(); - - // second, client only supports secp-384 and so kx group cache - // contains an unusable value. - let mut client_config_2 = - make_client_config_with_kx_groups(KeyType::Rsa, &[&rustls::kx_group::SECP384R1]); - client_config_2.session_storage = shared_storage; - - let server_config = make_server_config(KeyType::Rsa); - - // first handshake - let (mut client_1, mut server) = make_pair_for_configs(client_config_1, server_config.clone()); - do_handshake_until_error(&mut client_1, &mut server).unwrap(); - - // second handshake - let (mut client_2, mut server) = make_pair_for_configs(client_config_2, server_config); - do_handshake_until_error(&mut client_2, &mut server).unwrap(); -} - -#[test] -fn test_client_mtu_reduction() { - struct CollectWrites { - writevs: Vec>, - } - - impl io::Write for CollectWrites { - fn write(&mut self, _: &[u8]) -> io::Result { - panic!() - } - fn flush(&mut self) -> io::Result<()> { - panic!() - } - fn write_vectored<'b>(&mut self, b: &[io::IoSlice<'b>]) -> io::Result { - let writes = b - .iter() - .map(|slice| slice.len()) - .collect::>(); - let len = writes.iter().sum(); - self.writevs.push(writes); - Ok(len) - } - } - - fn collect_write_lengths(client: &mut ClientConnection) -> Vec { - let mut collector = CollectWrites { writevs: vec![] }; - - client - .write_tls(&mut collector) - .unwrap(); - assert_eq!(collector.writevs.len(), 1); - collector.writevs[0].clone() - } - - for kt in ALL_KEY_TYPES.iter() { - let mut client_config = make_client_config(*kt); - client_config.max_fragment_size = Some(64); - let mut client = - ClientConnection::new(Arc::new(client_config), dns_name("localhost")).unwrap(); - let writes = collect_write_lengths(&mut client); - println!("writes at mtu=64: {:?}", writes); - assert!(writes.iter().all(|x| *x <= 64)); - assert!(writes.len() > 1); - } -} - -#[test] -fn test_server_mtu_reduction() { - let mut server_config = make_server_config(KeyType::Rsa); - server_config.max_fragment_size = Some(64); - server_config.send_half_rtt_data = true; - let (mut client, mut server) = - make_pair_for_configs(make_client_config(KeyType::Rsa), server_config); - - let big_data = [0u8; 2048]; - server - .writer() - .write_all(&big_data) - .unwrap(); - - let encryption_overhead = 20; // FIXME: see issue #991 - - transfer(&mut client, &mut server); - server.process_new_packets().unwrap(); - { - let mut pipe = OtherSession::new(&mut client); - server.write_tls(&mut pipe).unwrap(); - - assert_eq!(pipe.writevs.len(), 1); - assert!(pipe.writevs[0] - .iter() - .all(|x| *x <= 64 + encryption_overhead)); - } - - client.process_new_packets().unwrap(); - transfer(&mut client, &mut server); - server.process_new_packets().unwrap(); - { - let mut pipe = OtherSession::new(&mut client); - server.write_tls(&mut pipe).unwrap(); - assert_eq!(pipe.writevs.len(), 1); - assert!(pipe.writevs[0] - .iter() - .all(|x| *x <= 64 + encryption_overhead)); - } - - client.process_new_packets().unwrap(); - check_read(&mut client.reader(), &big_data); -} - -fn check_client_max_fragment_size(size: usize) -> Option { - let mut client_config = make_client_config(KeyType::Ed25519); - client_config.max_fragment_size = Some(size); - ClientConnection::new(Arc::new(client_config), dns_name("localhost")).err() -} - -#[test] -fn bad_client_max_fragment_sizes() { - assert_eq!( - check_client_max_fragment_size(31), - Some(Error::BadMaxFragmentSize) - ); - assert_eq!(check_client_max_fragment_size(32), None); - assert_eq!(check_client_max_fragment_size(64), None); - assert_eq!(check_client_max_fragment_size(1460), None); - assert_eq!(check_client_max_fragment_size(0x4000), None); - assert_eq!(check_client_max_fragment_size(0x4005), None); - assert_eq!( - check_client_max_fragment_size(0x4006), - Some(Error::BadMaxFragmentSize) - ); - assert_eq!( - check_client_max_fragment_size(0xffff), - Some(Error::BadMaxFragmentSize) - ); -} - -fn assert_lt(left: usize, right: usize) { - if left >= right { - panic!("expected {} < {}", left, right); - } -} - -#[test] -fn connection_types_are_not_huge() { - // Arbitrary sizes - assert_lt(mem::size_of::(), 1600); - assert_lt(mem::size_of::(), 1600); -} - -use rustls::internal::msgs::handshake::SessionID; -use rustls::internal::msgs::{ - handshake::ClientExtension, handshake::HandshakePayload, message::Message, - message::MessagePayload, -}; - -#[test] -fn test_server_rejects_duplicate_sni_names() { - fn duplicate_sni_payload(msg: &mut Message) -> Altered { - if let MessagePayload::Handshake { parsed, encoded } = &mut msg.payload { - if let HandshakePayload::ClientHello(ch) = &mut parsed.payload { - for mut ext in ch.extensions.iter_mut() { - if let ClientExtension::ServerName(snr) = &mut ext { - snr.push(snr[0].clone()); - } - } - } - - *encoded = Payload::new(parsed.get_encoding()); - } - Altered::InPlace - } - - let (client, server) = make_pair(KeyType::Rsa); - let (mut client, mut server) = (client.into(), server.into()); - transfer_altered(&mut client, duplicate_sni_payload, &mut server); - assert_eq!( - server.process_new_packets(), - Err(Error::PeerMisbehavedError( - "ClientHello SNI contains duplicate name types".into() - )) - ); -} - -#[test] -fn test_server_rejects_empty_sni_extension() { - fn empty_sni_payload(msg: &mut Message) -> Altered { - if let MessagePayload::Handshake { parsed, encoded } = &mut msg.payload { - if let HandshakePayload::ClientHello(ch) = &mut parsed.payload { - for mut ext in ch.extensions.iter_mut() { - if let ClientExtension::ServerName(snr) = &mut ext { - snr.clear(); - } - } - } - - *encoded = Payload::new(parsed.get_encoding()); - } - - Altered::InPlace - } - - let (client, server) = make_pair(KeyType::Rsa); - let (mut client, mut server) = (client.into(), server.into()); - transfer_altered(&mut client, empty_sni_payload, &mut server); - assert_eq!( - server.process_new_packets(), - Err(Error::PeerMisbehavedError( - "ClientHello SNI did not contain a hostname".into() - )) - ); -} - -#[test] -fn test_server_rejects_clients_without_any_kx_group_overlap() { - fn different_kx_group(msg: &mut Message) -> Altered { - if let MessagePayload::Handshake { parsed, encoded } = &mut msg.payload { - if let HandshakePayload::ClientHello(ch) = &mut parsed.payload { - for mut ext in ch.extensions.iter_mut() { - if let ClientExtension::NamedGroups(ngs) = &mut ext { - ngs.clear(); - } - if let ClientExtension::KeyShare(ks) = &mut ext { - ks.clear(); - } - } - } - - *encoded = Payload::new(parsed.get_encoding()); - } - Altered::InPlace - } - - let (client, server) = make_pair(KeyType::Rsa); - let (mut client, mut server) = (client.into(), server.into()); - transfer_altered(&mut client, different_kx_group, &mut server); - assert_eq!( - server.process_new_packets(), - Err(Error::PeerIncompatibleError( - "no kx group overlap with client".into() - )) - ); -} - -#[test] -fn test_client_rejects_illegal_tls13_ccs() { - fn corrupt_ccs(msg: &mut Message) -> Altered { - if let MessagePayload::ChangeCipherSpec(_) = &mut msg.payload { - println!("seen CCS {:?}", msg); - return Altered::Raw(vec![0x14, 0x03, 0x03, 0x00, 0x02, 0x01, 0x02]); - } - Altered::InPlace - } - - let (mut client, mut server) = make_pair(KeyType::Rsa); - transfer(&mut client, &mut server); - server.process_new_packets().unwrap(); - - let (mut server, mut client) = (server.into(), client.into()); - - transfer_altered(&mut server, corrupt_ccs, &mut client); - assert_eq!( - client.process_new_packets(), - Err(Error::PeerMisbehavedError( - "illegal middlebox CCS received".into() - )) - ); -} - -/// https://github.com/rustls/rustls/issues/797 -#[cfg(feature = "tls12")] -#[test] -fn test_client_tls12_no_resume_after_server_downgrade() { - let mut client_config = common::make_client_config(KeyType::Ed25519); - let client_storage = Arc::new(ClientStorage::new()); - client_config.session_storage = client_storage.clone(); - let client_config = Arc::new(client_config); - - let server_config_1 = Arc::new(common::finish_server_config( - KeyType::Ed25519, - ServerConfig::builder() - .with_safe_default_cipher_suites() - .with_safe_default_kx_groups() - .with_protocol_versions(&[&rustls::version::TLS13]) - .unwrap(), - )); - - let mut server_config_2 = common::finish_server_config( - KeyType::Ed25519, - ServerConfig::builder() - .with_safe_default_cipher_suites() - .with_safe_default_kx_groups() - .with_protocol_versions(&[&rustls::version::TLS12]) - .unwrap(), - ); - server_config_2.session_storage = Arc::new(rustls::server::NoServerSessionStorage {}); - - dbg!("handshake 1"); - let mut client_1 = - ClientConnection::new(client_config.clone(), "localhost".try_into().unwrap()).unwrap(); - let mut server_1 = ServerConnection::new(server_config_1).unwrap(); - common::do_handshake(&mut client_1, &mut server_1); - assert_eq!(client_storage.puts(), 2); - - dbg!("handshake 2"); - let mut client_2 = - ClientConnection::new(client_config, "localhost".try_into().unwrap()).unwrap(); - let mut server_2 = ServerConnection::new(Arc::new(server_config_2)).unwrap(); - common::do_handshake(&mut client_2, &mut server_2); - assert_eq!(client_storage.puts(), 2); -} - -#[test] -fn test_acceptor() { - use rustls::server::Acceptor; - - let client_config = Arc::new(make_client_config(KeyType::Ed25519)); - let mut client = ClientConnection::new(client_config, dns_name("localhost")).unwrap(); - let mut buf = Vec::new(); - client.write_tls(&mut buf).unwrap(); - - let server_config = Arc::new(make_server_config(KeyType::Ed25519)); - let mut acceptor = Acceptor::default(); - acceptor - .read_tls(&mut buf.as_slice()) - .unwrap(); - let accepted = acceptor.accept().unwrap().unwrap(); - let ch = accepted.client_hello(); - assert_eq!(ch.server_name(), Some("localhost")); - - let server = accepted - .into_connection(server_config) - .unwrap(); - assert!(server.wants_write()); - - // Reusing an acceptor is not allowed - assert_eq!( - acceptor - .read_tls(&mut [0u8].as_ref()) - .err() - .unwrap() - .kind(), - io::ErrorKind::Other, - ); - assert_eq!( - acceptor.accept().err(), - Some(Error::General("Acceptor polled after completion".into())) - ); - - let mut acceptor = Acceptor::default(); - assert!(acceptor.accept().unwrap().is_none()); - acceptor - .read_tls(&mut &buf[..3]) - .unwrap(); // incomplete message - assert!(acceptor.accept().unwrap().is_none()); - acceptor - .read_tls(&mut [0x80, 0x00].as_ref()) - .unwrap(); // invalid message (len = 32k bytes) - assert!(acceptor.accept().is_err()); - - let mut acceptor = Acceptor::default(); - // Minimal valid 1-byte application data message is not a handshake message - acceptor - .read_tls(&mut [0x17, 0x03, 0x03, 0x00, 0x01, 0x00].as_ref()) - .unwrap(); - assert!(acceptor.accept().is_err()); - - let mut acceptor = Acceptor::default(); - // Minimal 1-byte ClientHello message is not a legal handshake message - acceptor - .read_tls(&mut [0x16, 0x03, 0x03, 0x00, 0x05, 0x01, 0x00, 0x00, 0x01, 0x00].as_ref()) - .unwrap(); - assert!(acceptor.accept().is_err()); -} - -#[derive(Default, Debug)] -struct LogCounts { - trace: usize, - debug: usize, - info: usize, - warn: usize, - error: usize, -} - -impl LogCounts { - fn new() -> Self { - Self { - ..Default::default() - } - } - - fn reset(&mut self) { - *self = Self::new(); - } - - fn add(&mut self, level: log::Level) { - match level { - log::Level::Trace => self.trace += 1, - log::Level::Debug => self.debug += 1, - log::Level::Info => self.info += 1, - log::Level::Warn => self.warn += 1, - log::Level::Error => self.error += 1, - } - } -} - -thread_local!(static COUNTS: RefCell = RefCell::new(LogCounts::new())); - -struct CountingLogger; - -static LOGGER: CountingLogger = CountingLogger; - -impl CountingLogger { - fn install() { - log::set_logger(&LOGGER).unwrap(); - log::set_max_level(log::LevelFilter::Trace); - } - - fn reset() { - COUNTS.with(|c| { - c.borrow_mut().reset(); - }); - } -} - -impl log::Log for CountingLogger { - fn enabled(&self, _metadata: &log::Metadata) -> bool { - true - } - - fn log(&self, record: &log::Record) { - println!("logging at {:?}: {:?}", record.level(), record.args()); - - COUNTS.with(|c| { - c.borrow_mut().add(record.level()); - }); - } - - fn flush(&self) {} -} - -#[test] -fn test_no_warning_logging_during_successful_sessions() { - CountingLogger::install(); - CountingLogger::reset(); - - for kt in ALL_KEY_TYPES.iter() { - for version in rustls::ALL_VERSIONS { - let client_config = make_client_config_with_versions(*kt, &[version]); - let (mut client, mut server) = - make_pair_for_configs(client_config, make_server_config(*kt)); - do_handshake(&mut client, &mut server); - } - } - - if cfg!(feature = "logging") { - COUNTS.with(|c| { - println!("After tests: {:?}", c.borrow()); - assert_eq!(c.borrow().warn, 0); - assert_eq!(c.borrow().error, 0); - assert_eq!(c.borrow().info, 0); - assert!(c.borrow().trace > 0); - assert!(c.borrow().debug > 0); - }); - } else { - COUNTS.with(|c| { - println!("After tests: {:?}", c.borrow()); - assert_eq!(c.borrow().warn, 0); - assert_eq!(c.borrow().error, 0); - assert_eq!(c.borrow().info, 0); - assert_eq!(c.borrow().trace, 0); - assert_eq!(c.borrow().debug, 0); - }); - } -} - -/// Test that secrets can be extracted and used for encryption/decryption. -#[cfg(feature = "secret_extraction")] -#[test] -fn test_secret_extraction_enabled() { - // Normally, secret extraction would be used to configure kTLS (TLS offload - // to the kernel). We want this test to run on any platform, though, so - // instead we just compare secrets for equality. - - // TLS 1.2 and 1.3 have different mechanisms for key exchange and handshake, - // and secrets are stored/extracted differently, so we want to test them both. - // We support 3 different AEAD algorithms (AES-128-GCM mode, AES-256-GCM, and - // Chacha20Poly1305), so that's 2*3 = 6 combinations to test. - let kt = KeyType::Rsa; - for suite in [ - rustls::cipher_suite::TLS13_AES_128_GCM_SHA256, - rustls::cipher_suite::TLS13_AES_256_GCM_SHA384, - rustls::cipher_suite::TLS13_CHACHA20_POLY1305_SHA256, - rustls::cipher_suite::TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, - rustls::cipher_suite::TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, - rustls::cipher_suite::TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, - ] { - let version = suite.version(); - println!("Testing suite {:?}", suite.suite().as_str()); - - // Only offer the cipher suite (and protocol version) that we're testing - let mut server_config = ServerConfig::builder() - .with_cipher_suites(&[suite]) - .with_safe_default_kx_groups() - .with_protocol_versions(&[version]) - .unwrap() - .with_no_client_auth() - .with_single_cert(kt.get_chain(), kt.get_key()) - .unwrap(); - // Opt into secret extraction from both sides - server_config.enable_secret_extraction = true; - let server_config = Arc::new(server_config); - - let mut client_config = make_client_config(kt); - client_config.enable_secret_extraction = true; - - let (mut client, mut server) = - make_pair_for_arc_configs(&Arc::new(client_config), &server_config); - - do_handshake(&mut client, &mut server); - - // The handshake is finished, we're now able to extract traffic secrets - let client_secrets = client.extract_secrets().unwrap(); - let server_secrets = server.extract_secrets().unwrap(); - - // Comparing secrets for equality is something you should never have to - // do in production code, so ConnectionTrafficSecrets doesn't implement - // PartialEq/Eq on purpose. Instead, we have to get creative. - fn explode_secrets(s: &ConnectionTrafficSecrets) -> (&[u8], &[u8], &[u8]) { - match s { - ConnectionTrafficSecrets::Aes128Gcm { key, salt, iv } => (key, salt, iv), - ConnectionTrafficSecrets::Aes256Gcm { key, salt, iv } => (key, salt, iv), - ConnectionTrafficSecrets::Chacha20Poly1305 { key, iv } => (key, &[], iv), - _ => panic!("unexpected secret type"), - } - } - - fn assert_secrets_equal( - (l_seq, l_sec): (u64, ConnectionTrafficSecrets), - (r_seq, r_sec): (u64, ConnectionTrafficSecrets), - ) { - assert_eq!(l_seq, r_seq); - assert_eq!(explode_secrets(&l_sec), explode_secrets(&r_sec)); - } - - assert_secrets_equal(client_secrets.tx, server_secrets.rx); - assert_secrets_equal(client_secrets.rx, server_secrets.tx); - } -} - -/// Test that secrets cannot be extracted unless explicitly enabled, and until -/// the handshake is done. -#[cfg(feature = "secret_extraction")] -#[test] -fn test_secret_extraction_disabled_or_too_early() { - let suite = rustls::cipher_suite::TLS13_AES_128_GCM_SHA256; - let kt = KeyType::Rsa; - - for (server_enable, client_enable) in [(true, false), (false, true)] { - let mut server_config = ServerConfig::builder() - .with_cipher_suites(&[suite]) - .with_safe_default_kx_groups() - .with_safe_default_protocol_versions() - .unwrap() - .with_no_client_auth() - .with_single_cert(kt.get_chain(), kt.get_key()) - .unwrap(); - server_config.enable_secret_extraction = server_enable; - let server_config = Arc::new(server_config); - - let mut client_config = make_client_config(kt); - client_config.enable_secret_extraction = client_enable; - - let client_config = Arc::new(client_config); - - let (client, server) = make_pair_for_arc_configs(&client_config, &server_config); - - assert!( - client.extract_secrets().is_err(), - "extraction should fail until handshake completes" - ); - assert!( - server.extract_secrets().is_err(), - "extraction should fail until handshake completes" - ); - - let (mut client, mut server) = make_pair_for_arc_configs(&client_config, &server_config); - - do_handshake(&mut client, &mut server); - - assert_eq!(server_enable, server.extract_secrets().is_ok()); - assert_eq!(client_enable, client.extract_secrets().is_ok()); - } -} - -#[test] -fn test_received_plaintext_backpressure() { - let suite = rustls::cipher_suite::TLS13_AES_128_GCM_SHA256; - let kt = KeyType::Rsa; - - let server_config = Arc::new( - ServerConfig::builder() - .with_cipher_suites(&[suite]) - .with_safe_default_kx_groups() - .with_safe_default_protocol_versions() - .unwrap() - .with_no_client_auth() - .with_single_cert(kt.get_chain(), kt.get_key()) - .unwrap(), - ); - - let client_config = Arc::new(make_client_config(kt)); - let (mut client, mut server) = make_pair_for_arc_configs(&client_config, &server_config); - do_handshake(&mut client, &mut server); - - // Fill the server's received plaintext buffer with 16k bytes - let client_buf = [0; 16_385]; - dbg!(client - .writer() - .write(&client_buf) - .unwrap()); - let mut network_buf = Vec::with_capacity(32_768); - let sent = dbg!(client - .write_tls(&mut network_buf) - .unwrap()); - assert_eq!( - sent, - dbg!(server - .read_tls(&mut &network_buf[..sent]) - .unwrap()) - ); - server.process_new_packets().unwrap(); - - // Send two more bytes from client to server - dbg!(client - .writer() - .write(&client_buf[..2]) - .unwrap()); - let sent = dbg!(client - .write_tls(&mut network_buf) - .unwrap()); - - // Get an error because the received plaintext buffer is full - assert!(server - .read_tls(&mut &network_buf[..sent]) - .is_err()); - - // Read out some of the plaintext - server - .reader() - .read_exact(&mut [0; 2]) - .unwrap(); - - // Now there's room again in the plaintext buffer - assert_eq!( - server - .read_tls(&mut &network_buf[..sent]) - .unwrap(), - 24 - ); -} diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/tests/bogo.rs temporalio-1.3.0/vendor/rustls-0.20.9/tests/bogo.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/tests/bogo.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/tests/bogo.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -// Runs the bogo test suite, in the form of a rust test. -// Note that bogo requires a golang environment to build -// and run. - -#[test] -#[cfg(all(coverage, feature = "quic", feature = "dangerous_configuration"))] -fn run_bogo_tests() { - use std::process::Command; - - let rc = Command::new("./runme") - .current_dir("../bogo") - .spawn() - .expect("cannot run bogo/runme") - .wait() - .expect("cannot wait for bogo"); - - assert!(rc.success(), "bogo exited non-zero"); -} diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/tests/client_cert_verifier.rs temporalio-1.3.0/vendor/rustls-0.20.9/tests/client_cert_verifier.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/tests/client_cert_verifier.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/tests/client_cert_verifier.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,324 +0,0 @@ -//! Tests for configuring and using a [`ClientCertVerifier`] for a server. - -#![cfg(feature = "dangerous_configuration")] - -mod common; - -use crate::common::{ - dns_name, do_handshake_until_both_error, do_handshake_until_error, get_client_root_store, - make_client_config_with_versions, make_client_config_with_versions_with_auth, - make_pair_for_arc_configs, ErrorFromPeer, KeyType, ALL_KEY_TYPES, -}; -use rustls::client::WebPkiVerifier; -use rustls::internal::msgs::base::PayloadU16; -use rustls::server::{ClientCertVerified, ClientCertVerifier}; -use rustls::AlertDescription; -use rustls::ContentType; -use rustls::{ - Certificate, ClientConnection, DistinguishedNames, Error, ServerConfig, ServerConnection, - SignatureScheme, -}; -use std::sync::Arc; - -// Client is authorized! -fn ver_ok() -> Result { - Ok(rustls::server::ClientCertVerified::assertion()) -} - -// Use when we shouldn't even attempt verification -fn ver_unreachable() -> Result { - unreachable!() -} - -// Verifier that returns an error that we can expect -fn ver_err() -> Result { - Err(Error::General("test err".to_string())) -} - -fn server_config_with_verifier( - kt: KeyType, - client_cert_verifier: MockClientVerifier, -) -> ServerConfig { - ServerConfig::builder() - .with_safe_defaults() - .with_client_cert_verifier(Arc::new(client_cert_verifier)) - .with_single_cert(kt.get_chain(), kt.get_key()) - .unwrap() -} - -#[test] -// Happy path, we resolve to a root, it is verified OK, should be able to connect -fn client_verifier_works() { - for kt in ALL_KEY_TYPES.iter() { - let client_verifier = MockClientVerifier { - verified: ver_ok, - subjects: Some( - get_client_root_store(*kt) - .roots - .iter() - .map(|r| PayloadU16(r.subject().to_vec())) - .collect(), - ), - mandatory: Some(true), - offered_schemes: None, - }; - - let server_config = server_config_with_verifier(*kt, client_verifier); - let server_config = Arc::new(server_config); - - for version in rustls::ALL_VERSIONS { - let client_config = make_client_config_with_versions_with_auth(*kt, &[version]); - let (mut client, mut server) = - make_pair_for_arc_configs(&Arc::new(client_config.clone()), &server_config); - let err = do_handshake_until_error(&mut client, &mut server); - assert_eq!(err, Ok(())); - } - } -} - -// Server offers no verification schemes -#[test] -fn client_verifier_no_schemes() { - for kt in ALL_KEY_TYPES.iter() { - let client_verifier = MockClientVerifier { - verified: ver_ok, - subjects: Some( - get_client_root_store(*kt) - .roots - .iter() - .map(|r| PayloadU16(r.subject().to_vec())) - .collect(), - ), - mandatory: Some(true), - offered_schemes: Some(vec![]), - }; - - let server_config = server_config_with_verifier(*kt, client_verifier); - let server_config = Arc::new(server_config); - - for version in rustls::ALL_VERSIONS { - let client_config = make_client_config_with_versions_with_auth(*kt, &[version]); - let (mut client, mut server) = - make_pair_for_arc_configs(&Arc::new(client_config.clone()), &server_config); - let err = do_handshake_until_error(&mut client, &mut server); - assert_eq!( - err, - Err(ErrorFromPeer::Client(Error::CorruptMessagePayload( - ContentType::Handshake - ))) - ); - } - } -} - -// Common case, we do not find a root store to resolve to -#[test] -fn client_verifier_no_root() { - for kt in ALL_KEY_TYPES.iter() { - let client_verifier = MockClientVerifier { - verified: ver_ok, - subjects: None, - mandatory: Some(true), - offered_schemes: None, - }; - - let server_config = server_config_with_verifier(*kt, client_verifier); - let server_config = Arc::new(server_config); - - for version in rustls::ALL_VERSIONS { - let client_config = make_client_config_with_versions_with_auth(*kt, &[version]); - let mut server = ServerConnection::new(Arc::clone(&server_config)).unwrap(); - let mut client = - ClientConnection::new(Arc::new(client_config), dns_name("notlocalhost")).unwrap(); - let errs = do_handshake_until_both_error(&mut client, &mut server); - assert_eq!( - errs, - Err(vec![ - ErrorFromPeer::Server(Error::General( - "client rejected by client_auth_root_subjects".into() - )), - ErrorFromPeer::Client(Error::AlertReceived(AlertDescription::AccessDenied)) - ]) - ); - } - } -} - -// If we cannot resolve a root, we cannot decide if auth is mandatory -#[test] -fn client_verifier_no_auth_no_root() { - for kt in ALL_KEY_TYPES.iter() { - let client_verifier = MockClientVerifier { - verified: ver_unreachable, - subjects: None, - mandatory: Some(true), - offered_schemes: None, - }; - - let server_config = server_config_with_verifier(*kt, client_verifier); - let server_config = Arc::new(server_config); - - for version in rustls::ALL_VERSIONS { - let client_config = make_client_config_with_versions(*kt, &[version]); - let mut server = ServerConnection::new(Arc::clone(&server_config)).unwrap(); - let mut client = - ClientConnection::new(Arc::new(client_config), dns_name("notlocalhost")).unwrap(); - let errs = do_handshake_until_both_error(&mut client, &mut server); - assert_eq!( - errs, - Err(vec![ - ErrorFromPeer::Server(Error::General( - "client rejected by client_auth_root_subjects".into() - )), - ErrorFromPeer::Client(Error::AlertReceived(AlertDescription::AccessDenied)) - ]) - ); - } - } -} - -// If we do have a root, we must do auth -#[test] -fn client_verifier_no_auth_yes_root() { - for kt in ALL_KEY_TYPES.iter() { - let client_verifier = MockClientVerifier { - verified: ver_unreachable, - subjects: Some( - get_client_root_store(*kt) - .roots - .iter() - .map(|r| PayloadU16(r.subject().to_vec())) - .collect(), - ), - mandatory: Some(true), - offered_schemes: None, - }; - - let server_config = server_config_with_verifier(*kt, client_verifier); - let server_config = Arc::new(server_config); - - for version in rustls::ALL_VERSIONS { - let client_config = make_client_config_with_versions(*kt, &[version]); - let mut server = ServerConnection::new(Arc::clone(&server_config)).unwrap(); - let mut client = - ClientConnection::new(Arc::new(client_config), dns_name("localhost")).unwrap(); - let errs = do_handshake_until_both_error(&mut client, &mut server); - assert_eq!( - errs, - Err(vec![ - ErrorFromPeer::Server(Error::NoCertificatesPresented), - ErrorFromPeer::Client(Error::AlertReceived( - AlertDescription::CertificateRequired - )) - ]) - ); - } - } -} - -#[test] -// Triple checks we propagate the rustls::Error through -fn client_verifier_fails_properly() { - for kt in ALL_KEY_TYPES.iter() { - let client_verifier = MockClientVerifier { - verified: ver_err, - subjects: Some( - get_client_root_store(*kt) - .roots - .iter() - .map(|r| PayloadU16(r.subject().to_vec())) - .collect(), - ), - mandatory: Some(true), - offered_schemes: None, - }; - - let server_config = server_config_with_verifier(*kt, client_verifier); - let server_config = Arc::new(server_config); - - for version in rustls::ALL_VERSIONS { - let client_config = make_client_config_with_versions_with_auth(*kt, &[version]); - let mut server = ServerConnection::new(Arc::clone(&server_config)).unwrap(); - let mut client = - ClientConnection::new(Arc::new(client_config), dns_name("localhost")).unwrap(); - let err = do_handshake_until_error(&mut client, &mut server); - assert_eq!( - err, - Err(ErrorFromPeer::Server(Error::General("test err".into()))) - ); - } - } -} - -#[test] -// If a verifier returns a None on Mandatory-ness, then we error out -fn client_verifier_must_determine_client_auth_requirement_to_continue() { - for kt in ALL_KEY_TYPES.iter() { - let client_verifier = MockClientVerifier { - verified: ver_ok, - subjects: Some( - get_client_root_store(*kt) - .roots - .iter() - .map(|r| PayloadU16(r.subject().to_vec())) - .collect(), - ), - mandatory: None, - offered_schemes: None, - }; - - let server_config = server_config_with_verifier(*kt, client_verifier); - let server_config = Arc::new(server_config); - - for version in rustls::ALL_VERSIONS { - let client_config = make_client_config_with_versions_with_auth(*kt, &[version]); - let mut server = ServerConnection::new(Arc::clone(&server_config)).unwrap(); - let mut client = - ClientConnection::new(Arc::new(client_config), dns_name("localhost")).unwrap(); - let errs = do_handshake_until_both_error(&mut client, &mut server); - assert_eq!( - errs, - Err(vec![ - ErrorFromPeer::Server(Error::General( - "client rejected by client_auth_mandatory".into() - )), - ErrorFromPeer::Client(Error::AlertReceived(AlertDescription::AccessDenied)) - ]) - ); - } - } -} - -pub struct MockClientVerifier { - pub verified: fn() -> Result, - pub subjects: Option, - pub mandatory: Option, - pub offered_schemes: Option>, -} - -impl ClientCertVerifier for MockClientVerifier { - fn client_auth_mandatory(&self) -> Option { - self.mandatory - } - - fn client_auth_root_subjects(&self) -> Option { - self.subjects.as_ref().cloned() - } - - fn verify_client_cert( - &self, - _end_entity: &Certificate, - _intermediates: &[Certificate], - _now: std::time::SystemTime, - ) -> Result { - (self.verified)() - } - - fn supported_verify_schemes(&self) -> Vec { - if let Some(schemes) = &self.offered_schemes { - schemes.clone() - } else { - WebPkiVerifier::verification_schemes() - } - } -} diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/tests/common/mod.rs temporalio-1.3.0/vendor/rustls-0.20.9/tests/common/mod.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/tests/common/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/tests/common/mod.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,474 +0,0 @@ -#![allow(dead_code)] - -use std::convert::{TryFrom, TryInto}; -use std::io; -use std::ops::{Deref, DerefMut}; -use std::sync::Arc; - -use rustls::internal::msgs::codec::Reader; -use rustls::internal::msgs::message::{Message, OpaqueMessage, PlainMessage}; -use rustls::server::AllowAnyAuthenticatedClient; -use rustls::Connection; -use rustls::Error; -use rustls::RootCertStore; -use rustls::{Certificate, PrivateKey}; -use rustls::{ClientConfig, ClientConnection}; -use rustls::{ConnectionCommon, ServerConfig, ServerConnection, SideData}; - -macro_rules! embed_files { - ( - $( - ($name:ident, $keytype:expr, $path:expr); - )+ - ) => { - $( - const $name: &'static [u8] = include_bytes!( - concat!("../../../test-ca/", $keytype, "/", $path)); - )+ - - pub fn bytes_for(keytype: &str, path: &str) -> &'static [u8] { - match (keytype, path) { - $( - ($keytype, $path) => $name, - )+ - _ => panic!("unknown keytype {} with path {}", keytype, path), - } - } - } -} - -embed_files! { - (ECDSA_CA_CERT, "ecdsa", "ca.cert"); - (ECDSA_CA_DER, "ecdsa", "ca.der"); - (ECDSA_CA_KEY, "ecdsa", "ca.key"); - (ECDSA_CLIENT_CERT, "ecdsa", "client.cert"); - (ECDSA_CLIENT_CHAIN, "ecdsa", "client.chain"); - (ECDSA_CLIENT_FULLCHAIN, "ecdsa", "client.fullchain"); - (ECDSA_CLIENT_KEY, "ecdsa", "client.key"); - (ECDSA_CLIENT_REQ, "ecdsa", "client.req"); - (ECDSA_END_CERT, "ecdsa", "end.cert"); - (ECDSA_END_CHAIN, "ecdsa", "end.chain"); - (ECDSA_END_FULLCHAIN, "ecdsa", "end.fullchain"); - (ECDSA_END_KEY, "ecdsa", "end.key"); - (ECDSA_END_REQ, "ecdsa", "end.req"); - (ECDSA_INTER_CERT, "ecdsa", "inter.cert"); - (ECDSA_INTER_KEY, "ecdsa", "inter.key"); - (ECDSA_INTER_REQ, "ecdsa", "inter.req"); - (ECDSA_NISTP256_PEM, "ecdsa", "nistp256.pem"); - (ECDSA_NISTP384_PEM, "ecdsa", "nistp384.pem"); - - (EDDSA_CA_CERT, "eddsa", "ca.cert"); - (EDDSA_CA_DER, "eddsa", "ca.der"); - (EDDSA_CA_KEY, "eddsa", "ca.key"); - (EDDSA_CLIENT_CERT, "eddsa", "client.cert"); - (EDDSA_CLIENT_CHAIN, "eddsa", "client.chain"); - (EDDSA_CLIENT_FULLCHAIN, "eddsa", "client.fullchain"); - (EDDSA_CLIENT_KEY, "eddsa", "client.key"); - (EDDSA_CLIENT_REQ, "eddsa", "client.req"); - (EDDSA_END_CERT, "eddsa", "end.cert"); - (EDDSA_END_CHAIN, "eddsa", "end.chain"); - (EDDSA_END_FULLCHAIN, "eddsa", "end.fullchain"); - (EDDSA_END_KEY, "eddsa", "end.key"); - (EDDSA_END_REQ, "eddsa", "end.req"); - (EDDSA_INTER_CERT, "eddsa", "inter.cert"); - (EDDSA_INTER_KEY, "eddsa", "inter.key"); - (EDDSA_INTER_REQ, "eddsa", "inter.req"); - - (RSA_CA_CERT, "rsa", "ca.cert"); - (RSA_CA_DER, "rsa", "ca.der"); - (RSA_CA_KEY, "rsa", "ca.key"); - (RSA_CLIENT_CERT, "rsa", "client.cert"); - (RSA_CLIENT_CHAIN, "rsa", "client.chain"); - (RSA_CLIENT_FULLCHAIN, "rsa", "client.fullchain"); - (RSA_CLIENT_KEY, "rsa", "client.key"); - (RSA_CLIENT_REQ, "rsa", "client.req"); - (RSA_CLIENT_RSA, "rsa", "client.rsa"); - (RSA_END_CERT, "rsa", "end.cert"); - (RSA_END_CHAIN, "rsa", "end.chain"); - (RSA_END_FULLCHAIN, "rsa", "end.fullchain"); - (RSA_END_KEY, "rsa", "end.key"); - (RSA_END_REQ, "rsa", "end.req"); - (RSA_END_RSA, "rsa", "end.rsa"); - (RSA_INTER_CERT, "rsa", "inter.cert"); - (RSA_INTER_KEY, "rsa", "inter.key"); - (RSA_INTER_REQ, "rsa", "inter.req"); -} - -pub fn transfer( - left: &mut (impl DerefMut + Deref>), - right: &mut (impl DerefMut + Deref>), -) -> usize { - let mut buf = [0u8; 262144]; - let mut total = 0; - - while left.wants_write() { - let sz = { - let into_buf: &mut dyn io::Write = &mut &mut buf[..]; - left.write_tls(into_buf).unwrap() - }; - total += sz; - if sz == 0 { - return total; - } - - let mut offs = 0; - loop { - let from_buf: &mut dyn io::Read = &mut &buf[offs..sz]; - offs += right.read_tls(from_buf).unwrap(); - if sz == offs { - break; - } - } - } - - total -} - -pub fn transfer_eof(conn: &mut (impl DerefMut + Deref>)) { - let empty_buf = [0u8; 0]; - let empty_cursor: &mut dyn io::Read = &mut &empty_buf[..]; - let sz = conn.read_tls(empty_cursor).unwrap(); - assert_eq!(sz, 0); -} - -pub enum Altered { - /// message has been edited in-place (or is unchanged) - InPlace, - /// send these raw bytes instead of the message. - Raw(Vec), -} - -pub fn transfer_altered(left: &mut Connection, filter: F, right: &mut Connection) -> usize -where - F: Fn(&mut Message) -> Altered, -{ - let mut buf = [0u8; 262144]; - let mut total = 0; - - while left.wants_write() { - let sz = { - let into_buf: &mut dyn io::Write = &mut &mut buf[..]; - left.write_tls(into_buf).unwrap() - }; - total += sz; - if sz == 0 { - return total; - } - - let mut reader = Reader::init(&buf[..sz]); - while reader.any_left() { - let message = OpaqueMessage::read(&mut reader).unwrap(); - let mut message = Message::try_from(message.into_plain_message()).unwrap(); - let message_enc = match filter(&mut message) { - Altered::InPlace => PlainMessage::from(message) - .into_unencrypted_opaque() - .encode(), - Altered::Raw(data) => data, - }; - - let message_enc_reader: &mut dyn io::Read = &mut &message_enc[..]; - let len = right - .read_tls(message_enc_reader) - .unwrap(); - assert_eq!(len, message_enc.len()); - } - } - - total -} - -#[derive(Clone, Copy, PartialEq)] -pub enum KeyType { - Rsa, - Ecdsa, - Ed25519, -} - -pub static ALL_KEY_TYPES: [KeyType; 3] = [KeyType::Rsa, KeyType::Ecdsa, KeyType::Ed25519]; - -impl KeyType { - fn bytes_for(&self, part: &str) -> &'static [u8] { - match self { - KeyType::Rsa => bytes_for("rsa", part), - KeyType::Ecdsa => bytes_for("ecdsa", part), - KeyType::Ed25519 => bytes_for("eddsa", part), - } - } - - pub fn get_chain(&self) -> Vec { - rustls_pemfile::certs(&mut io::BufReader::new(self.bytes_for("end.fullchain"))) - .unwrap() - .iter() - .map(|v| Certificate(v.clone())) - .collect() - } - - pub fn get_key(&self) -> PrivateKey { - PrivateKey( - rustls_pemfile::pkcs8_private_keys(&mut io::BufReader::new(self.bytes_for("end.key"))) - .unwrap()[0] - .clone(), - ) - } - - pub fn get_client_chain(&self) -> Vec { - rustls_pemfile::certs(&mut io::BufReader::new(self.bytes_for("client.fullchain"))) - .unwrap() - .iter() - .map(|v| Certificate(v.clone())) - .collect() - } - - fn get_client_key(&self) -> PrivateKey { - PrivateKey( - rustls_pemfile::pkcs8_private_keys(&mut io::BufReader::new( - self.bytes_for("client.key"), - )) - .unwrap()[0] - .clone(), - ) - } -} - -pub fn finish_server_config( - kt: KeyType, - conf: rustls::ConfigBuilder, -) -> ServerConfig { - conf.with_no_client_auth() - .with_single_cert(kt.get_chain(), kt.get_key()) - .unwrap() -} - -pub fn make_server_config(kt: KeyType) -> ServerConfig { - finish_server_config(kt, ServerConfig::builder().with_safe_defaults()) -} - -pub fn make_server_config_with_versions( - kt: KeyType, - versions: &[&'static rustls::SupportedProtocolVersion], -) -> ServerConfig { - finish_server_config( - kt, - ServerConfig::builder() - .with_safe_default_cipher_suites() - .with_safe_default_kx_groups() - .with_protocol_versions(versions) - .unwrap(), - ) -} - -pub fn make_server_config_with_kx_groups( - kt: KeyType, - kx_groups: &[&'static rustls::SupportedKxGroup], -) -> ServerConfig { - finish_server_config( - kt, - ServerConfig::builder() - .with_safe_default_cipher_suites() - .with_kx_groups(kx_groups) - .with_safe_default_protocol_versions() - .unwrap(), - ) -} - -pub fn get_client_root_store(kt: KeyType) -> RootCertStore { - let roots = kt.get_chain(); - let mut client_auth_roots = RootCertStore::empty(); - for root in roots { - client_auth_roots.add(&root).unwrap(); - } - client_auth_roots -} - -pub fn make_server_config_with_mandatory_client_auth(kt: KeyType) -> ServerConfig { - let client_auth_roots = get_client_root_store(kt); - - let client_auth = AllowAnyAuthenticatedClient::new(client_auth_roots); - - ServerConfig::builder() - .with_safe_defaults() - .with_client_cert_verifier(client_auth) - .with_single_cert(kt.get_chain(), kt.get_key()) - .unwrap() -} - -pub fn finish_client_config( - kt: KeyType, - config: rustls::ConfigBuilder, -) -> ClientConfig { - let mut root_store = RootCertStore::empty(); - let mut rootbuf = io::BufReader::new(kt.bytes_for("ca.cert")); - root_store.add_parsable_certificates(&rustls_pemfile::certs(&mut rootbuf).unwrap()); - - config - .with_root_certificates(root_store) - .with_no_client_auth() -} - -pub fn finish_client_config_with_creds( - kt: KeyType, - config: rustls::ConfigBuilder, -) -> ClientConfig { - let mut root_store = RootCertStore::empty(); - let mut rootbuf = io::BufReader::new(kt.bytes_for("ca.cert")); - root_store.add_parsable_certificates(&rustls_pemfile::certs(&mut rootbuf).unwrap()); - - config - .with_root_certificates(root_store) - .with_single_cert(kt.get_client_chain(), kt.get_client_key()) - .unwrap() -} - -pub fn make_client_config(kt: KeyType) -> ClientConfig { - finish_client_config(kt, ClientConfig::builder().with_safe_defaults()) -} - -pub fn make_client_config_with_kx_groups( - kt: KeyType, - kx_groups: &[&'static rustls::SupportedKxGroup], -) -> ClientConfig { - let builder = ClientConfig::builder() - .with_safe_default_cipher_suites() - .with_kx_groups(kx_groups) - .with_safe_default_protocol_versions() - .unwrap(); - finish_client_config(kt, builder) -} - -pub fn make_client_config_with_versions( - kt: KeyType, - versions: &[&'static rustls::SupportedProtocolVersion], -) -> ClientConfig { - let builder = ClientConfig::builder() - .with_safe_default_cipher_suites() - .with_safe_default_kx_groups() - .with_protocol_versions(versions) - .unwrap(); - finish_client_config(kt, builder) -} - -pub fn make_client_config_with_auth(kt: KeyType) -> ClientConfig { - finish_client_config_with_creds(kt, ClientConfig::builder().with_safe_defaults()) -} - -pub fn make_client_config_with_versions_with_auth( - kt: KeyType, - versions: &[&'static rustls::SupportedProtocolVersion], -) -> ClientConfig { - let builder = ClientConfig::builder() - .with_safe_default_cipher_suites() - .with_safe_default_kx_groups() - .with_protocol_versions(versions) - .unwrap(); - finish_client_config_with_creds(kt, builder) -} - -pub fn make_pair(kt: KeyType) -> (ClientConnection, ServerConnection) { - make_pair_for_configs(make_client_config(kt), make_server_config(kt)) -} - -pub fn make_pair_for_configs( - client_config: ClientConfig, - server_config: ServerConfig, -) -> (ClientConnection, ServerConnection) { - make_pair_for_arc_configs(&Arc::new(client_config), &Arc::new(server_config)) -} - -pub fn make_pair_for_arc_configs( - client_config: &Arc, - server_config: &Arc, -) -> (ClientConnection, ServerConnection) { - ( - ClientConnection::new(Arc::clone(client_config), dns_name("localhost")).unwrap(), - ServerConnection::new(Arc::clone(server_config)).unwrap(), - ) -} - -pub fn do_handshake( - client: &mut (impl DerefMut + Deref>), - server: &mut (impl DerefMut + Deref>), -) -> (usize, usize) { - let (mut to_client, mut to_server) = (0, 0); - while server.is_handshaking() || client.is_handshaking() { - to_server += transfer(client, server); - server.process_new_packets().unwrap(); - to_client += transfer(server, client); - client.process_new_packets().unwrap(); - } - (to_server, to_client) -} - -#[derive(PartialEq, Debug)] -pub enum ErrorFromPeer { - Client(Error), - Server(Error), -} - -pub fn do_handshake_until_error( - client: &mut ClientConnection, - server: &mut ServerConnection, -) -> Result<(), ErrorFromPeer> { - while server.is_handshaking() || client.is_handshaking() { - transfer(client, server); - server - .process_new_packets() - .map_err(ErrorFromPeer::Server)?; - transfer(server, client); - client - .process_new_packets() - .map_err(ErrorFromPeer::Client)?; - } - - Ok(()) -} - -pub fn do_handshake_until_both_error( - client: &mut ClientConnection, - server: &mut ServerConnection, -) -> Result<(), Vec> { - match do_handshake_until_error(client, server) { - Err(server_err @ ErrorFromPeer::Server(_)) => { - let mut errors = vec![server_err]; - transfer(server, client); - let client_err = client - .process_new_packets() - .map_err(ErrorFromPeer::Client) - .expect_err("client didn't produce error after server error"); - errors.push(client_err); - Err(errors) - } - - Err(client_err @ ErrorFromPeer::Client(_)) => { - let mut errors = vec![client_err]; - transfer(client, server); - let server_err = server - .process_new_packets() - .map_err(ErrorFromPeer::Server) - .expect_err("server didn't produce error after client error"); - errors.push(server_err); - Err(errors) - } - - Ok(()) => Ok(()), - } -} - -pub fn dns_name(name: &'static str) -> rustls::ServerName { - name.try_into().unwrap() -} - -pub struct FailsReads { - errkind: io::ErrorKind, -} - -impl FailsReads { - pub fn new(errkind: io::ErrorKind) -> Self { - FailsReads { errkind } - } -} - -impl io::Read for FailsReads { - fn read(&mut self, _b: &mut [u8]) -> io::Result { - Err(io::Error::from(self.errkind)) - } -} diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/tests/key_log_file_env.rs temporalio-1.3.0/vendor/rustls-0.20.9/tests/key_log_file_env.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/tests/key_log_file_env.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/tests/key_log_file_env.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,104 +0,0 @@ -//! Tests of [`rustls::KeyLogFile`] that require us to set environment variables. -//! -//! vvvv -//! Every test you add to this file MUST execute through `serialized()`. -//! ^^^^ -//! -//! See https://github.com/rust-lang/rust/issues/90308; despite not being marked -//! `unsafe`, `env::var::set_var` is an unsafe function. These tests are separated -//! from the rest of the tests so that their use of `set_ver` is less likely to -//! affect them; as of the time these tests were moved to this file, Cargo will -//! compile each test suite file to a separate executable, so these will be run -//! in a completely separate process. This way, executing every test through -//! `serialized()` will cause them to be run one at a time. -//! -//! Note: If/when we add new constructors to `KeyLogFile` to allow constructing -//! one from a path directly (without using an environment variable), then those -//! tests SHOULD NOT go in this file. -//! -//! XXX: These tests don't actually test the functionality; they just ensure -//! the code coverage doesn't complain it isn't covered. TODO: Verify that the -//! file was created successfully, with the right permissions, etc., and that it -//! contains something like what we expect. - -#[allow(dead_code)] -mod common; - -use crate::common::{ - do_handshake, make_client_config_with_versions, make_pair_for_arc_configs, make_server_config, - transfer, KeyType, -}; -use std::{ - env, - io::Write, - sync::{Arc, Mutex, Once}, -}; - -/// Approximates `#[serial]` from the `serial_test` crate. -/// -/// No attempt is made to recover from a poisoned mutex, which will -/// happen when `f` panics. In other words, all the tests that use -/// `serialized` will start failing after one test panics. -fn serialized(f: impl FnOnce()) { - // Ensure every test is run serialized - // TODO: Use `std::sync::Lazy` once that is stable. - static mut MUTEX: Option> = None; - static ONCE: Once = Once::new(); - ONCE.call_once(|| unsafe { - MUTEX = Some(Mutex::new(())); - }); - let mutex = unsafe { MUTEX.as_mut() }; - - let _guard = mutex.unwrap().lock().unwrap(); - - // XXX: NOT thread safe. - env::set_var("SSLKEYLOGFILE", "./sslkeylogfile.txt"); - - f() -} - -#[test] -fn exercise_key_log_file_for_client() { - serialized(|| { - let server_config = Arc::new(make_server_config(KeyType::Rsa)); - env::set_var("SSLKEYLOGFILE", "./sslkeylogfile.txt"); - - for version in rustls::ALL_VERSIONS { - let mut client_config = make_client_config_with_versions(KeyType::Rsa, &[version]); - client_config.key_log = Arc::new(rustls::KeyLogFile::new()); - - let (mut client, mut server) = - make_pair_for_arc_configs(&Arc::new(client_config), &server_config); - - assert_eq!(5, client.writer().write(b"hello").unwrap()); - - do_handshake(&mut client, &mut server); - transfer(&mut client, &mut server); - server.process_new_packets().unwrap(); - } - }) -} - -#[test] -fn exercise_key_log_file_for_server() { - serialized(|| { - let mut server_config = make_server_config(KeyType::Rsa); - - env::set_var("SSLKEYLOGFILE", "./sslkeylogfile.txt"); - server_config.key_log = Arc::new(rustls::KeyLogFile::new()); - - let server_config = Arc::new(server_config); - - for version in rustls::ALL_VERSIONS { - let client_config = make_client_config_with_versions(KeyType::Rsa, &[version]); - let (mut client, mut server) = - make_pair_for_arc_configs(&Arc::new(client_config), &server_config); - - assert_eq!(5, client.writer().write(b"hello").unwrap()); - - do_handshake(&mut client, &mut server); - transfer(&mut client, &mut server); - server.process_new_packets().unwrap(); - } - }) -} diff -Nru temporalio-1.3.0/vendor/rustls-0.20.9/tests/server_cert_verifier.rs temporalio-1.3.0/vendor/rustls-0.20.9/tests/server_cert_verifier.rs --- temporalio-1.3.0/vendor/rustls-0.20.9/tests/server_cert_verifier.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/rustls-0.20.9/tests/server_cert_verifier.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,272 +0,0 @@ -//! Tests for configuring and using a [`ServerCertVerifier`] for a client. - -#![cfg(feature = "dangerous_configuration")] - -mod common; -use crate::common::{ - do_handshake, do_handshake_until_both_error, make_client_config_with_versions, - make_pair_for_arc_configs, make_server_config, ErrorFromPeer, ALL_KEY_TYPES, -}; -use rustls::client::{ - HandshakeSignatureValid, ServerCertVerified, ServerCertVerifier, WebPkiVerifier, -}; -use rustls::internal::msgs::handshake::DigitallySignedStruct; -use rustls::AlertDescription; -use rustls::{Certificate, Error, SignatureScheme}; -use std::sync::Arc; - -#[test] -fn client_can_override_certificate_verification() { - for kt in ALL_KEY_TYPES.iter() { - let verifier = Arc::new(MockServerVerifier::accepts_anything()); - - let server_config = Arc::new(make_server_config(*kt)); - - for version in rustls::ALL_VERSIONS { - let mut client_config = make_client_config_with_versions(*kt, &[version]); - client_config - .dangerous() - .set_certificate_verifier(verifier.clone()); - - let (mut client, mut server) = - make_pair_for_arc_configs(&Arc::new(client_config), &server_config); - do_handshake(&mut client, &mut server); - } - } -} - -#[test] -fn client_can_override_certificate_verification_and_reject_certificate() { - for kt in ALL_KEY_TYPES.iter() { - let verifier = Arc::new(MockServerVerifier::rejects_certificate( - Error::CorruptMessage, - )); - - let server_config = Arc::new(make_server_config(*kt)); - - for version in rustls::ALL_VERSIONS { - let mut client_config = make_client_config_with_versions(*kt, &[version]); - client_config - .dangerous() - .set_certificate_verifier(verifier.clone()); - - let (mut client, mut server) = - make_pair_for_arc_configs(&Arc::new(client_config), &server_config); - let errs = do_handshake_until_both_error(&mut client, &mut server); - assert_eq!( - errs, - Err(vec![ - ErrorFromPeer::Client(Error::CorruptMessage), - ErrorFromPeer::Server(Error::AlertReceived(AlertDescription::BadCertificate)) - ]) - ); - } - } -} - -#[cfg(feature = "tls12")] -#[test] -fn client_can_override_certificate_verification_and_reject_tls12_signatures() { - for kt in ALL_KEY_TYPES.iter() { - let mut client_config = make_client_config_with_versions(*kt, &[&rustls::version::TLS12]); - let verifier = Arc::new(MockServerVerifier::rejects_tls12_signatures( - Error::CorruptMessage, - )); - - client_config - .dangerous() - .set_certificate_verifier(verifier); - - let server_config = Arc::new(make_server_config(*kt)); - - let (mut client, mut server) = - make_pair_for_arc_configs(&Arc::new(client_config), &server_config); - let errs = do_handshake_until_both_error(&mut client, &mut server); - assert_eq!( - errs, - Err(vec![ - ErrorFromPeer::Client(Error::CorruptMessage), - ErrorFromPeer::Server(Error::AlertReceived(AlertDescription::BadCertificate)) - ]) - ); - } -} - -#[test] -fn client_can_override_certificate_verification_and_reject_tls13_signatures() { - for kt in ALL_KEY_TYPES.iter() { - let mut client_config = make_client_config_with_versions(*kt, &[&rustls::version::TLS13]); - let verifier = Arc::new(MockServerVerifier::rejects_tls13_signatures( - Error::CorruptMessage, - )); - - client_config - .dangerous() - .set_certificate_verifier(verifier); - - let server_config = Arc::new(make_server_config(*kt)); - - let (mut client, mut server) = - make_pair_for_arc_configs(&Arc::new(client_config), &server_config); - let errs = do_handshake_until_both_error(&mut client, &mut server); - assert_eq!( - errs, - Err(vec![ - ErrorFromPeer::Client(Error::CorruptMessage), - ErrorFromPeer::Server(Error::AlertReceived(AlertDescription::BadCertificate)) - ]) - ); - } -} - -#[test] -fn client_can_override_certificate_verification_and_offer_no_signature_schemes() { - for kt in ALL_KEY_TYPES.iter() { - let verifier = Arc::new(MockServerVerifier::offers_no_signature_schemes()); - - let server_config = Arc::new(make_server_config(*kt)); - - for version in rustls::ALL_VERSIONS { - let mut client_config = make_client_config_with_versions(*kt, &[version]); - client_config - .dangerous() - .set_certificate_verifier(verifier.clone()); - - let (mut client, mut server) = - make_pair_for_arc_configs(&Arc::new(client_config), &server_config); - let errs = do_handshake_until_both_error(&mut client, &mut server); - assert_eq!( - errs, - Err(vec![ - ErrorFromPeer::Server(Error::PeerIncompatibleError( - "no overlapping sigschemes".into() - )), - ErrorFromPeer::Client(Error::AlertReceived(AlertDescription::HandshakeFailure)), - ]) - ); - } - } -} - -pub struct MockServerVerifier { - cert_rejection_error: Option, - tls12_signature_error: Option, - tls13_signature_error: Option, - wants_scts: bool, - signature_schemes: Vec, -} - -impl ServerCertVerifier for MockServerVerifier { - fn verify_server_cert( - &self, - end_entity: &rustls::Certificate, - intermediates: &[rustls::Certificate], - server_name: &rustls::ServerName, - scts: &mut dyn Iterator, - oscp_response: &[u8], - now: std::time::SystemTime, - ) -> Result { - let scts: Vec> = scts.map(|x| x.to_owned()).collect(); - println!( - "verify_server_cert({:?}, {:?}, {:?}, {:?}, {:?}, {:?})", - end_entity, intermediates, server_name, scts, oscp_response, now - ); - if let Some(error) = &self.cert_rejection_error { - Err(error.clone()) - } else { - Ok(ServerCertVerified::assertion()) - } - } - - fn verify_tls12_signature( - &self, - message: &[u8], - cert: &Certificate, - dss: &DigitallySignedStruct, - ) -> Result { - println!( - "verify_tls12_signature({:?}, {:?}, {:?})", - message, cert, dss - ); - if let Some(error) = &self.tls12_signature_error { - Err(error.clone()) - } else { - Ok(HandshakeSignatureValid::assertion()) - } - } - - fn verify_tls13_signature( - &self, - message: &[u8], - cert: &Certificate, - dss: &DigitallySignedStruct, - ) -> Result { - println!( - "verify_tls13_signature({:?}, {:?}, {:?})", - message, cert, dss - ); - if let Some(error) = &self.tls13_signature_error { - Err(error.clone()) - } else { - Ok(HandshakeSignatureValid::assertion()) - } - } - - fn supported_verify_schemes(&self) -> Vec { - self.signature_schemes.clone() - } - - fn request_scts(&self) -> bool { - println!("request_scts? {:?}", self.wants_scts); - self.wants_scts - } -} - -impl MockServerVerifier { - pub fn accepts_anything() -> Self { - MockServerVerifier { - cert_rejection_error: None, - ..Default::default() - } - } - - pub fn rejects_certificate(err: Error) -> Self { - MockServerVerifier { - cert_rejection_error: Some(err), - ..Default::default() - } - } - - pub fn rejects_tls12_signatures(err: Error) -> Self { - MockServerVerifier { - tls12_signature_error: Some(err), - ..Default::default() - } - } - - pub fn rejects_tls13_signatures(err: Error) -> Self { - MockServerVerifier { - tls13_signature_error: Some(err), - ..Default::default() - } - } - - pub fn offers_no_signature_schemes() -> Self { - MockServerVerifier { - signature_schemes: vec![], - ..Default::default() - } - } -} - -impl Default for MockServerVerifier { - fn default() -> Self { - MockServerVerifier { - cert_rejection_error: None, - tls12_signature_error: None, - tls13_signature_error: None, - wants_scts: false, - signature_schemes: WebPkiVerifier::verification_schemes(), - } - } -} diff -Nru temporalio-1.3.0/vendor/semver/.cargo-checksum.json temporalio-1.3.0/vendor/semver/.cargo-checksum.json --- temporalio-1.3.0/vendor/semver/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/semver/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"Cargo.toml":"f271bcfad60d3df30778405a9cf9970c4b6eacb328ab36cdfc6c0f1060a56286","LICENSE-APACHE":"62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","README.md":"de1a03443ab8f147676199856a975ec00f3f7334fc5d5d5e056ec8f3fcb61dd5","benches/parse.rs":"6531f66f80ce2fc83878f9bf84f94c42e96f1e709466f2b88be8d95a3cec1511","build.rs":"9a3d42e37b665745044b5d91c6e02dd458152e336a7013654972f4a1a0b562d9","src/backport.rs":"66db55d15d0e2808bffe4cde7cd1d99bda999b26cbe40bb6b5e43b94f9b631d2","src/display.rs":"9ba42f7a6579aa9c7dd72f2380036f5c9664592f3eacd09ea25cef291a3e64e5","src/error.rs":"895e11a9e454cab207415186b15a29dac1f0a5bf9b8dba7bd45da5bb5a6ace31","src/eval.rs":"b7e7ec976051b9f87ddf5cfdbaad64654d98d86ae0763f7d88b14eeaeac6013c","src/identifier.rs":"459725383cbd0e2d769aa947decd1f031bdc8732339783ad24eb2b44f0f5d040","src/impls.rs":"48baf552d28f6d0ce63da2d2d53a710222ed87834d44e8b0493a0827e1d718f2","src/lib.rs":"fa6ee9bfe44353ed9c5e07bcfd676a62070826e04fe669357dd53e940f73a3ce","src/parse.rs":"920f8327a1ba0c16a28f518f2d50998faf1d6a8db379b92cb72976f176650f09","src/serde.rs":"e2a9b9dc3cd2cccc250eaffad049de418ef791bf8c4a34111a48f068353e0a37","tests/node/mod.rs":"2710d9b8daace2038b66db0f8f4cc522dee938e7cbc42d7739c31995343c32f4","tests/test_autotrait.rs":"2631b78c9c63f1829c814fa88fcab0c5d77eb4e2d9c0c418d50c33e12a511e90","tests/test_identifier.rs":"fba0428bf5c43c733d17ca30952822ed6e1af6de1e5ef11bd8fb46c6b10f65fd","tests/test_version.rs":"9587d2c397524e1d33499d9bb2725fe746406fa4d162713b7f56029942a4a84b","tests/test_version_req.rs":"1aa4ad4f58f1ec3226b334d0f82b6ebae732585dd9b2c35328b576a1b3638a8d","tests/util/mod.rs":"b35cd4e7fcc9a6fa2496d163d716155ddd379e027ef9516c1af05ce0cf605ae1"},"package":"836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090"} \ No newline at end of file +{"files":{"Cargo.toml":"b596875460fd9bbd7c3bd1d3f13f4dd70ccf88ee25fae4bc996f99b179148588","LICENSE-APACHE":"62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","README.md":"de1a03443ab8f147676199856a975ec00f3f7334fc5d5d5e056ec8f3fcb61dd5","benches/parse.rs":"6531f66f80ce2fc83878f9bf84f94c42e96f1e709466f2b88be8d95a3cec1511","build.rs":"9a3d42e37b665745044b5d91c6e02dd458152e336a7013654972f4a1a0b562d9","src/backport.rs":"66db55d15d0e2808bffe4cde7cd1d99bda999b26cbe40bb6b5e43b94f9b631d2","src/display.rs":"9ba42f7a6579aa9c7dd72f2380036f5c9664592f3eacd09ea25cef291a3e64e5","src/error.rs":"895e11a9e454cab207415186b15a29dac1f0a5bf9b8dba7bd45da5bb5a6ace31","src/eval.rs":"b7e7ec976051b9f87ddf5cfdbaad64654d98d86ae0763f7d88b14eeaeac6013c","src/identifier.rs":"459725383cbd0e2d769aa947decd1f031bdc8732339783ad24eb2b44f0f5d040","src/impls.rs":"79b5a2ac6ca3d4cb46adfb1494756079f53bef780dd81c3a8d3adf86f91395c8","src/lib.rs":"280ffdd4bda1aa7fed6c32e5ff57aac382d3619283a675fd23e6f9951f4bd001","src/parse.rs":"920f8327a1ba0c16a28f518f2d50998faf1d6a8db379b92cb72976f176650f09","src/serde.rs":"e2a9b9dc3cd2cccc250eaffad049de418ef791bf8c4a34111a48f068353e0a37","tests/node/mod.rs":"2710d9b8daace2038b66db0f8f4cc522dee938e7cbc42d7739c31995343c32f4","tests/test_autotrait.rs":"2631b78c9c63f1829c814fa88fcab0c5d77eb4e2d9c0c418d50c33e12a511e90","tests/test_identifier.rs":"6c3da46c73df210527b60f1069131b15e2c65eb7b5d11793940d00cf66812f4d","tests/test_version.rs":"4f45827cdab1d965f73b93662b84007d056135c97d5ffaa9973c1d9f58666785","tests/test_version_req.rs":"b6eea0258cc3b6d567a9f6c42693a97316345083495236c47e85374fd45f7cf0","tests/util/mod.rs":"db61c2cd86af864d8be4f2a3d5f25c86d7712201cc6ab47b715facf5f7f275b7"},"package":"b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/semver/Cargo.toml temporalio-1.3.0/vendor/semver/Cargo.toml --- temporalio-1.3.0/vendor/semver/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/semver/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -13,7 +13,7 @@ edition = "2018" rust-version = "1.31" name = "semver" -version = "1.0.20" +version = "1.0.18" authors = ["David Tolnay "] description = "Parser and evaluator for Cargo's flavor of Semantic Versioning" documentation = "https://docs.rs/semver" diff -Nru temporalio-1.3.0/vendor/semver/src/impls.rs temporalio-1.3.0/vendor/semver/src/impls.rs --- temporalio-1.3.0/vendor/semver/src/impls.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/semver/src/impls.rs 2023-10-30 19:40:00.000000000 +0000 @@ -38,13 +38,13 @@ impl PartialOrd for Prerelease { fn partial_cmp(&self, rhs: &Self) -> Option { - Some(self.cmp(rhs)) + Some(Ord::cmp(self, rhs)) } } impl PartialOrd for BuildMetadata { fn partial_cmp(&self, rhs: &Self) -> Option { - Some(self.cmp(rhs)) + Some(Ord::cmp(self, rhs)) } } diff -Nru temporalio-1.3.0/vendor/semver/src/lib.rs temporalio-1.3.0/vendor/semver/src/lib.rs --- temporalio-1.3.0/vendor/semver/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/semver/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -60,7 +60,7 @@ //! //! [Specifying Dependencies]: https://doc.rust-lang.org/cargo/reference/specifying-dependencies.html -#![doc(html_root_url = "https://docs.rs/semver/1.0.20")] +#![doc(html_root_url = "https://docs.rs/semver/1.0.18")] #![cfg_attr(doc_cfg, feature(doc_cfg))] #![cfg_attr(all(not(feature = "std"), not(no_alloc_crate)), no_std)] #![cfg_attr(not(no_unsafe_op_in_unsafe_fn_lint), deny(unsafe_op_in_unsafe_fn))] @@ -102,7 +102,6 @@ use crate::alloc::vec::Vec; use crate::identifier::Identifier; -use core::cmp::Ordering; use core::str::FromStr; #[allow(unused_imports)] @@ -432,53 +431,6 @@ pub fn parse(text: &str) -> Result { Version::from_str(text) } - - /// Compare the major, minor, patch, and pre-release value of two versions, - /// disregarding build metadata. Versions that differ only in build metadata - /// are considered equal. This comparison is what the SemVer spec refers to - /// as "precedence". - /// - /// # Example - /// - /// ``` - /// use semver::Version; - /// - /// let mut versions = [ - /// "1.20.0+c144a98".parse::().unwrap(), - /// "1.20.0".parse().unwrap(), - /// "1.0.0".parse().unwrap(), - /// "1.0.0-alpha".parse().unwrap(), - /// "1.20.0+bc17664".parse().unwrap(), - /// ]; - /// - /// // This is a stable sort, so it preserves the relative order of equal - /// // elements. The three 1.20.0 versions differ only in build metadata so - /// // they are not reordered relative to one another. - /// versions.sort_by(Version::cmp_precedence); - /// assert_eq!(versions, [ - /// "1.0.0-alpha".parse().unwrap(), - /// "1.0.0".parse().unwrap(), - /// "1.20.0+c144a98".parse().unwrap(), - /// "1.20.0".parse().unwrap(), - /// "1.20.0+bc17664".parse().unwrap(), - /// ]); - /// - /// // Totally order the versions, including comparing the build metadata. - /// versions.sort(); - /// assert_eq!(versions, [ - /// "1.0.0-alpha".parse().unwrap(), - /// "1.0.0".parse().unwrap(), - /// "1.20.0".parse().unwrap(), - /// "1.20.0+bc17664".parse().unwrap(), - /// "1.20.0+c144a98".parse().unwrap(), - /// ]); - /// ``` - pub fn cmp_precedence(&self, other: &Self) -> Ordering { - Ord::cmp( - &(self.major, self.minor, self.patch, &self.pre), - &(other.major, other.minor, other.patch, &other.pre), - ) - } } impl VersionReq { diff -Nru temporalio-1.3.0/vendor/semver/tests/test_identifier.rs temporalio-1.3.0/vendor/semver/tests/test_identifier.rs --- temporalio-1.3.0/vendor/semver/tests/test_identifier.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/semver/tests/test_identifier.rs 2023-10-30 19:40:00.000000000 +0000 @@ -43,9 +43,3 @@ assert_ne!(prerelease("aaaaaaaaa"), prerelease("bbbbbbbbb")); assert_ne!(build_metadata("1"), build_metadata("001")); } - -#[test] -fn test_prerelease() { - let err = prerelease_err("1.b\0"); - assert_to_string(err, "unexpected character in pre-release identifier"); -} diff -Nru temporalio-1.3.0/vendor/semver/tests/test_version_req.rs temporalio-1.3.0/vendor/semver/tests/test_version_req.rs --- temporalio-1.3.0/vendor/semver/tests/test_version_req.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/semver/tests/test_version_req.rs 2023-10-30 19:40:00.000000000 +0000 @@ -168,9 +168,6 @@ // https://github.com/steveklabnik/semver/issues/56 let err = req_err("1.2.3 - 2.3.4"); assert_to_string(err, "expected comma after patch version number, found '-'"); - - let err = req_err(">1, >2, >3, >4, >5, >6, >7, >8, >9, >10, >11, >12, >13, >14, >15, >16, >17, >18, >19, >20, >21, >22, >23, >24, >25, >26, >27, >28, >29, >30, >31, >32, >33"); - assert_to_string(err, "excessive number of version comparators"); } #[test] @@ -335,7 +332,7 @@ } #[test] -pub fn test_parse() { +pub fn test_parse_errors() { let err = req_err("\0"); assert_to_string( err, @@ -371,45 +368,6 @@ } #[test] -fn test_comparator_parse() { - let parsed = comparator("1.2.3-alpha"); - assert_to_string(parsed, "^1.2.3-alpha"); - - let parsed = comparator("2.X"); - assert_to_string(parsed, "2.*"); - - let parsed = comparator("2"); - assert_to_string(parsed, "^2"); - - let parsed = comparator("2.x.x"); - assert_to_string(parsed, "2.*"); - - let err = comparator_err("1.2.3-01"); - assert_to_string(err, "invalid leading zero in pre-release identifier"); - - let err = comparator_err("1.2.3+4."); - assert_to_string(err, "empty identifier segment in build metadata"); - - let err = comparator_err(">"); - assert_to_string( - err, - "unexpected end of input while parsing major version number", - ); - - let err = comparator_err("1."); - assert_to_string( - err, - "unexpected end of input while parsing minor version number", - ); - - let err = comparator_err("1.*."); - assert_to_string(err, "unexpected character after wildcard in version req"); - - let err = comparator_err("1.2.3+4ÿ"); - assert_to_string(err, "unexpected character 'ÿ' after build metadata"); -} - -#[test] fn test_cargo3202() { let ref r = req("0.*.*"); assert_to_string(r, "0.*"); diff -Nru temporalio-1.3.0/vendor/semver/tests/test_version.rs temporalio-1.3.0/vendor/semver/tests/test_version.rs --- temporalio-1.3.0/vendor/semver/tests/test_version.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/semver/tests/test_version.rs 2023-10-30 19:40:00.000000000 +0000 @@ -47,18 +47,6 @@ let err = version_err("1.2.3-01"); assert_to_string(err, "invalid leading zero in pre-release identifier"); - let err = version_err("1.2.3++"); - assert_to_string(err, "empty identifier segment in build metadata"); - - let err = version_err("07"); - assert_to_string(err, "invalid leading zero in major version number"); - - let err = version_err("111111111111111111111.0.0"); - assert_to_string(err, "value of major version number exceeds u64::MAX"); - - let err = version_err("8\0"); - assert_to_string(err, "unexpected character '\\0' after major version number"); - let parsed = version("1.2.3"); let expected = Version::new(1, 2, 3); assert_eq!(parsed, expected); diff -Nru temporalio-1.3.0/vendor/semver/tests/util/mod.rs temporalio-1.3.0/vendor/semver/tests/util/mod.rs --- temporalio-1.3.0/vendor/semver/tests/util/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/semver/tests/util/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,6 +1,6 @@ #![allow(dead_code)] -use semver::{BuildMetadata, Comparator, Error, Prerelease, Version, VersionReq}; +use semver::{BuildMetadata, Error, Prerelease, Version, VersionReq}; use std::fmt::Display; #[cfg_attr(not(no_track_caller), track_caller)] @@ -24,26 +24,11 @@ } #[cfg_attr(not(no_track_caller), track_caller)] -pub(super) fn comparator(text: &str) -> Comparator { - Comparator::parse(text).unwrap() -} - -#[cfg_attr(not(no_track_caller), track_caller)] -pub(super) fn comparator_err(text: &str) -> Error { - Comparator::parse(text).unwrap_err() -} - -#[cfg_attr(not(no_track_caller), track_caller)] pub(super) fn prerelease(text: &str) -> Prerelease { Prerelease::new(text).unwrap() } #[cfg_attr(not(no_track_caller), track_caller)] -pub(super) fn prerelease_err(text: &str) -> Error { - Prerelease::new(text).unwrap_err() -} - -#[cfg_attr(not(no_track_caller), track_caller)] pub(super) fn build_metadata(text: &str) -> BuildMetadata { BuildMetadata::new(text).unwrap() } diff -Nru temporalio-1.3.0/vendor/serde/build.rs temporalio-1.3.0/vendor/serde/build.rs --- temporalio-1.3.0/vendor/serde/build.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/serde/build.rs 2023-10-30 19:40:00.000000000 +0000 @@ -27,10 +27,11 @@ println!("cargo:rustc-cfg=no_relaxed_trait_bounds"); } - // f32::copysign and f64::copysign stabilized in Rust 1.35. - // https://blog.rust-lang.org/2019/05/23/Rust-1.35.0.html#copy-the-sign-of-a-floating-point-number-onto-another - if minor < 35 { - println!("cargo:rustc-cfg=no_float_copysign"); + // Disabled on Emscripten targets before Rust 1.40 since + // Emscripten did not support 128-bit integers until Rust 1.40 + // (https://github.com/rust-lang/rust/pull/65251) + if emscripten && minor < 40 { + println!("cargo:rustc-cfg=no_integer128"); } // Current minimum supported version of serde_derive crate is Rust 1.56. diff -Nru temporalio-1.3.0/vendor/serde/.cargo-checksum.json temporalio-1.3.0/vendor/serde/.cargo-checksum.json --- temporalio-1.3.0/vendor/serde/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/serde/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"Cargo.toml":"bb01ab870a09677abe91d6957adf97e6c14ecf2570f600018bab2f5baff9d63f","LICENSE-APACHE":"62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","README.md":"c3ece10a36d19b4e857a770eaf74a2164d220f55fa11947065a3898c1697ecef","build.rs":"f9ba30324b9ce085c903595fb55a5293f8c2348ff36bfe870521b935ae6d105c","crates-io.md":"56e988ac4944c45f5bf5051e3827892ed8fb817853d99d9df1fff6621108e270","src/de/format.rs":"c85071b016df643b161859682d21ce34fa0ebf2a3bdbeeea69859da48f5d934f","src/de/ignored_any.rs":"6480f2b2a83dc4764d01b2eec7309729eef2492eede2e5ee98d23a60b05198eb","src/de/impls.rs":"807dd688e9022caaf2f230cf50c46e0691445f6293a43e7f5d4864eaf3d9582c","src/de/mod.rs":"ea4c534d938a91def4c574cd166e58972cbcb2c146264f002fe24e5960da0118","src/de/seed.rs":"045d890712a04eb33ffc5a021e5d948a63c89402b8ffeea749df2171b7484f8f","src/de/size_hint.rs":"fff83dc39d30e75e8e611991f9c5399188a1aad23a6462dbca2c8b62655cfedb","src/de/value.rs":"2577d0e7729fe6499ced1480f74ef8658bc72e572ec9f0a76e1b7ae067952bb9","src/integer128.rs":"29ef30b7d94507b34807090e68173767cdc7aff62edccd38affe69e75338dddc","src/lib.rs":"7f8b9eecfa7248a45632d0c59d76fa9b3b34058612dd8d55f02dfc2e6e9cc096","src/macros.rs":"e3486ef4a9a4ed1b27234aa1817ccb25ec0eb026ffc95e2c71c7b917f1f45629","src/private/de.rs":"6557a124fdaf61f9c7cd80163e40f4a453354e45b63a4eb55dafdfe0159f6881","src/private/doc.rs":"9ad740e9ea2eedf861b77116eda9a6fb74bc8553541cd17d1bc5791a3ef3271a","src/private/mod.rs":"b8f0c348621d91dd9da3db83d8877e70bc61ad0a2dc2d6fb57c6fc2c2cbafa26","src/private/ser.rs":"656613691bd8d40cb70a52d4ebe3ee96a993c8a1292d50822d9ca5bdad84426b","src/ser/fmt.rs":"77a5583e5c227ea1982b097ed6378af5c899d43761d71e33440262fd35944695","src/ser/impls.rs":"52de614a78b78e5a878b583c28f1cb9e5e637a22f5a0d8bd5077083cd77c427b","src/ser/impossible.rs":"e11b37689ec1395378d546fce74221ca9046d0761744301f12029102fd07e30e","src/ser/mod.rs":"e95dabf07216136440d6a2822cf37775f583d141c21d1b37ec9c55ae2a5024ab","src/std_error.rs":"25a07149e2e468747ffa5a58051c7f93d7b3c0fa0372f012a96c97ec8ab03b97"},"package":"91d3c334ca1ee894a2c6f6ad698fe8c435b76d504b13d436f0685d648d6d96f7"} \ No newline at end of file +{"files":{"Cargo.toml":"a3afbb6f2324fb0489d86fdb42d3e0ce6d230d5b0e51341316ab9acaf0b9ac4d","LICENSE-APACHE":"62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","README.md":"c3ece10a36d19b4e857a770eaf74a2164d220f55fa11947065a3898c1697ecef","build.rs":"7a01eef82b6868208976e3dd96a6bf69ae968855f87d8514825fc2281dbd7b57","crates-io.md":"56e988ac4944c45f5bf5051e3827892ed8fb817853d99d9df1fff6621108e270","src/de/format.rs":"c85071b016df643b161859682d21ce34fa0ebf2a3bdbeeea69859da48f5d934f","src/de/ignored_any.rs":"b991c390d45bce988593946f50da9b67138bfc7fb31777abf0fcdc4611e61cd7","src/de/impls.rs":"494f4a34bfab95c544476501d3fe3b43956b61c52aecbbaf725c8f26a712d3d9","src/de/mod.rs":"f58587a0bd627af4d868e2e73534d676d20e2c48ff978de8042fd33c6ab8239d","src/de/seed.rs":"045d890712a04eb33ffc5a021e5d948a63c89402b8ffeea749df2171b7484f8f","src/de/size_hint.rs":"fff83dc39d30e75e8e611991f9c5399188a1aad23a6462dbca2c8b62655cfedb","src/de/value.rs":"7c7c50519d15aca2afe0cf96df97fabea145a9e1dd4d67afca0a2bcabb452553","src/integer128.rs":"12e5834455e78c3917f8417865141d1bfbf6a25f64273b7551661d75abe8b9d1","src/lib.rs":"610a79c6dc586c3c74eb5f2d53722886ad082bbc614f5babd2b3dd1f3415ab5c","src/macros.rs":"75df6143d4566437a8349d4352a706882a95f946c5d1d7d6fbe0c29a9ab542cb","src/private/de.rs":"6557a124fdaf61f9c7cd80163e40f4a453354e45b63a4eb55dafdfe0159f6881","src/private/doc.rs":"9ad740e9ea2eedf861b77116eda9a6fb74bc8553541cd17d1bc5791a3ef3271a","src/private/mod.rs":"b8f0c348621d91dd9da3db83d8877e70bc61ad0a2dc2d6fb57c6fc2c2cbafa26","src/private/ser.rs":"656613691bd8d40cb70a52d4ebe3ee96a993c8a1292d50822d9ca5bdad84426b","src/ser/fmt.rs":"95fe0beaf0b0e7b0d04faab463677f8bc05ed67308aa508bbb86fe721fe709ca","src/ser/impls.rs":"f785c48f1dc302c839e740c5add2346b89b5e1535edbcc4b46cdb55af6f776a3","src/ser/impossible.rs":"e11b37689ec1395378d546fce74221ca9046d0761744301f12029102fd07e30e","src/ser/mod.rs":"e0f77d73ef09b2cba888bc13f6c17fddf4c51d4575c65b14f3df8151f5b5c465","src/std_error.rs":"25a07149e2e468747ffa5a58051c7f93d7b3c0fa0372f012a96c97ec8ab03b97"},"package":"9f5db24220c009de9bd45e69fb2938f4b6d2df856aa9304ce377b3180f83b7c1"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/serde/Cargo.toml temporalio-1.3.0/vendor/serde/Cargo.toml --- temporalio-1.3.0/vendor/serde/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/serde/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -13,7 +13,7 @@ edition = "2018" rust-version = "1.31" name = "serde" -version = "1.0.190" +version = "1.0.186" authors = [ "Erick Tryzelaar ", "David Tolnay ", @@ -66,4 +66,4 @@ unstable = [] [target."cfg(any())".dependencies.serde_derive] -version = "=1.0.190" +version = "=1.0.186" diff -Nru temporalio-1.3.0/vendor/serde/src/de/ignored_any.rs temporalio-1.3.0/vendor/serde/src/de/ignored_any.rs --- temporalio-1.3.0/vendor/serde/src/de/ignored_any.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/serde/src/de/ignored_any.rs 2023-10-30 19:40:00.000000000 +0000 @@ -129,10 +129,12 @@ Ok(IgnoredAny) } - #[inline] - fn visit_i128(self, x: i128) -> Result { - let _ = x; - Ok(IgnoredAny) + serde_if_integer128! { + #[inline] + fn visit_i128(self, x: i128) -> Result { + let _ = x; + Ok(IgnoredAny) + } } #[inline] @@ -141,10 +143,12 @@ Ok(IgnoredAny) } - #[inline] - fn visit_u128(self, x: u128) -> Result { - let _ = x; - Ok(IgnoredAny) + serde_if_integer128! { + #[inline] + fn visit_u128(self, x: u128) -> Result { + let _ = x; + Ok(IgnoredAny) + } } #[inline] diff -Nru temporalio-1.3.0/vendor/serde/src/de/impls.rs temporalio-1.3.0/vendor/serde/src/de/impls.rs --- temporalio-1.3.0/vendor/serde/src/de/impls.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/serde/src/de/impls.rs 2023-10-30 19:40:00.000000000 +0000 @@ -180,28 +180,6 @@ }; } -macro_rules! num_as_copysign_self { - ($ty:ident : $visit:ident) => { - #[inline] - fn $visit(self, v: $ty) -> Result - where - E: Error, - { - #[cfg(any(no_float_copysign, not(feature = "std")))] - { - Ok(v as Self::Value) - } - - #[cfg(all(not(no_float_copysign), feature = "std"))] - { - // Preserve sign of NaN. The `as` produces a nondeterministic sign. - let sign = if v.is_sign_positive() { 1.0 } else { -1.0 }; - Ok((v as Self::Value).copysign(sign)) - } - } - }; -} - macro_rules! int_to_int { ($ty:ident : $visit:ident) => { #[inline] @@ -373,7 +351,7 @@ impl_deserialize_num! { f32, deserialize_f32 num_self!(f32:visit_f32); - num_as_copysign_self!(f64:visit_f64); + num_as_self!(f64:visit_f64); num_as_self!(i8:visit_i8 i16:visit_i16 i32:visit_i32 i64:visit_i64); num_as_self!(u8:visit_u8 u16:visit_u16 u32:visit_u32 u64:visit_u64); } @@ -381,67 +359,69 @@ impl_deserialize_num! { f64, deserialize_f64 num_self!(f64:visit_f64); - num_as_copysign_self!(f32:visit_f32); + num_as_self!(f32:visit_f32); num_as_self!(i8:visit_i8 i16:visit_i16 i32:visit_i32 i64:visit_i64); num_as_self!(u8:visit_u8 u16:visit_u16 u32:visit_u32 u64:visit_u64); } -macro_rules! num_128 { - ($ty:ident : $visit:ident) => { - fn $visit(self, v: $ty) -> Result - where - E: Error, - { - if v as i128 >= Self::Value::min_value() as i128 - && v as u128 <= Self::Value::max_value() as u128 - { - Ok(v as Self::Value) - } else { - Err(Error::invalid_value( - Unexpected::Other(stringify!($ty)), - &self, - )) +serde_if_integer128! { + macro_rules! num_128 { + ($ty:ident : $visit:ident) => { + fn $visit(self, v: $ty) -> Result + where + E: Error, + { + if v as i128 >= Self::Value::min_value() as i128 + && v as u128 <= Self::Value::max_value() as u128 + { + Ok(v as Self::Value) + } else { + Err(Error::invalid_value( + Unexpected::Other(stringify!($ty)), + &self, + )) + } } - } - }; + }; - (nonzero $primitive:ident $ty:ident : $visit:ident) => { - fn $visit(self, v: $ty) -> Result - where - E: Error, - { - if v as i128 >= $primitive::min_value() as i128 - && v as u128 <= $primitive::max_value() as u128 - { - if let Some(nonzero) = Self::Value::new(v as $primitive) { - Ok(nonzero) + (nonzero $primitive:ident $ty:ident : $visit:ident) => { + fn $visit(self, v: $ty) -> Result + where + E: Error, + { + if v as i128 >= $primitive::min_value() as i128 + && v as u128 <= $primitive::max_value() as u128 + { + if let Some(nonzero) = Self::Value::new(v as $primitive) { + Ok(nonzero) + } else { + Err(Error::invalid_value(Unexpected::Unsigned(0), &self)) + } } else { - Err(Error::invalid_value(Unexpected::Unsigned(0), &self)) + Err(Error::invalid_value( + Unexpected::Other(stringify!($ty)), + &self, + )) } - } else { - Err(Error::invalid_value( - Unexpected::Other(stringify!($ty)), - &self, - )) } - } - }; -} + }; + } -impl_deserialize_num! { - i128, NonZeroI128 cfg(not(no_num_nonzero_signed)), deserialize_i128 - num_self!(i128:visit_i128); - num_as_self!(i8:visit_i8 i16:visit_i16 i32:visit_i32 i64:visit_i64); - num_as_self!(u8:visit_u8 u16:visit_u16 u32:visit_u32 u64:visit_u64); - num_128!(u128:visit_u128); -} - -impl_deserialize_num! { - u128, NonZeroU128, deserialize_u128 - num_self!(u128:visit_u128); - num_as_self!(u8:visit_u8 u16:visit_u16 u32:visit_u32 u64:visit_u64); - int_to_uint!(i8:visit_i8 i16:visit_i16 i32:visit_i32 i64:visit_i64); - num_128!(i128:visit_i128); + impl_deserialize_num! { + i128, NonZeroI128 cfg(not(no_num_nonzero_signed)), deserialize_i128 + num_self!(i128:visit_i128); + num_as_self!(i8:visit_i8 i16:visit_i16 i32:visit_i32 i64:visit_i64); + num_as_self!(u8:visit_u8 u16:visit_u16 u32:visit_u32 u64:visit_u64); + num_128!(u128:visit_u128); + } + + impl_deserialize_num! { + u128, NonZeroU128, deserialize_u128 + num_self!(u128:visit_u128); + num_as_self!(u8:visit_u8 u16:visit_u16 u32:visit_u32 u64:visit_u64); + int_to_uint!(i8:visit_i8 i16:visit_i16 i32:visit_i32 i64:visit_i64); + num_128!(i128:visit_i128); + } } //////////////////////////////////////////////////////////////////////////////// diff -Nru temporalio-1.3.0/vendor/serde/src/de/mod.rs temporalio-1.3.0/vendor/serde/src/de/mod.rs --- temporalio-1.3.0/vendor/serde/src/de/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/serde/src/de/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -118,6 +118,7 @@ pub mod value; +#[cfg(not(no_integer128))] mod format; mod ignored_any; mod impls; @@ -948,15 +949,18 @@ where V: Visitor<'de>; - /// Hint that the `Deserialize` type is expecting an `i128` value. - /// - /// The default behavior unconditionally returns an error. - fn deserialize_i128(self, visitor: V) -> Result - where - V: Visitor<'de>, - { - let _ = visitor; - Err(Error::custom("i128 is not supported")) + serde_if_integer128! { + /// Hint that the `Deserialize` type is expecting an `i128` value. + /// + /// This method is available only on Rust compiler versions >=1.26. The + /// default behavior unconditionally returns an error. + fn deserialize_i128(self, visitor: V) -> Result + where + V: Visitor<'de> + { + let _ = visitor; + Err(Error::custom("i128 is not supported")) + } } /// Hint that the `Deserialize` type is expecting a `u8` value. @@ -979,15 +983,18 @@ where V: Visitor<'de>; - /// Hint that the `Deserialize` type is expecting an `u128` value. - /// - /// The default behavior unconditionally returns an error. - fn deserialize_u128(self, visitor: V) -> Result - where - V: Visitor<'de>, - { - let _ = visitor; - Err(Error::custom("u128 is not supported")) + serde_if_integer128! { + /// Hint that the `Deserialize` type is expecting an `u128` value. + /// + /// This method is available only on Rust compiler versions >=1.26. The + /// default behavior unconditionally returns an error. + fn deserialize_u128(self, visitor: V) -> Result + where + V: Visitor<'de> + { + let _ = visitor; + Err(Error::custom("u128 is not supported")) + } } /// Hint that the `Deserialize` type is expecting a `f32` value. @@ -1359,20 +1366,20 @@ Err(Error::invalid_type(Unexpected::Signed(v), &self)) } - /// The input contains a `i128`. - /// - /// The default implementation fails with a type error. - fn visit_i128(self, v: i128) -> Result - where - E: Error, - { - let mut buf = [0u8; 58]; - let mut writer = format::Buf::new(&mut buf); - fmt::Write::write_fmt(&mut writer, format_args!("integer `{}` as i128", v)).unwrap(); - Err(Error::invalid_type( - Unexpected::Other(writer.as_str()), - &self, - )) + serde_if_integer128! { + /// The input contains a `i128`. + /// + /// This method is available only on Rust compiler versions >=1.26. The + /// default implementation fails with a type error. + fn visit_i128(self, v: i128) -> Result + where + E: Error, + { + let mut buf = [0u8; 58]; + let mut writer = format::Buf::new(&mut buf); + fmt::Write::write_fmt(&mut writer, format_args!("integer `{}` as i128", v)).unwrap(); + Err(Error::invalid_type(Unexpected::Other(writer.as_str()), &self)) + } } /// The input contains a `u8`. @@ -1421,20 +1428,20 @@ Err(Error::invalid_type(Unexpected::Unsigned(v), &self)) } - /// The input contains a `u128`. - /// - /// The default implementation fails with a type error. - fn visit_u128(self, v: u128) -> Result - where - E: Error, - { - let mut buf = [0u8; 57]; - let mut writer = format::Buf::new(&mut buf); - fmt::Write::write_fmt(&mut writer, format_args!("integer `{}` as u128", v)).unwrap(); - Err(Error::invalid_type( - Unexpected::Other(writer.as_str()), - &self, - )) + serde_if_integer128! { + /// The input contains a `u128`. + /// + /// This method is available only on Rust compiler versions >=1.26. The + /// default implementation fails with a type error. + fn visit_u128(self, v: u128) -> Result + where + E: Error, + { + let mut buf = [0u8; 57]; + let mut writer = format::Buf::new(&mut buf); + fmt::Write::write_fmt(&mut writer, format_args!("integer `{}` as u128", v)).unwrap(); + Err(Error::invalid_type(Unexpected::Other(writer.as_str()), &self)) + } } /// The input contains an `f32`. diff -Nru temporalio-1.3.0/vendor/serde/src/de/value.rs temporalio-1.3.0/vendor/serde/src/de/value.rs --- temporalio-1.3.0/vendor/serde/src/de/value.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/serde/src/de/value.rs 2023-10-30 19:40:00.000000000 +0000 @@ -292,17 +292,20 @@ primitive_deserializer!(i16, "an `i16`.", I16Deserializer, visit_i16); primitive_deserializer!(i32, "an `i32`.", I32Deserializer, visit_i32); primitive_deserializer!(i64, "an `i64`.", I64Deserializer, visit_i64); -primitive_deserializer!(i128, "an `i128`.", I128Deserializer, visit_i128); primitive_deserializer!(isize, "an `isize`.", IsizeDeserializer, visit_i64 as i64); primitive_deserializer!(u8, "a `u8`.", U8Deserializer, visit_u8); primitive_deserializer!(u16, "a `u16`.", U16Deserializer, visit_u16); primitive_deserializer!(u64, "a `u64`.", U64Deserializer, visit_u64); -primitive_deserializer!(u128, "a `u128`.", U128Deserializer, visit_u128); primitive_deserializer!(usize, "a `usize`.", UsizeDeserializer, visit_u64 as u64); primitive_deserializer!(f32, "an `f32`.", F32Deserializer, visit_f32); primitive_deserializer!(f64, "an `f64`.", F64Deserializer, visit_f64); primitive_deserializer!(char, "a `char`.", CharDeserializer, visit_char); +serde_if_integer128! { + primitive_deserializer!(i128, "an `i128`.", I128Deserializer, visit_i128); + primitive_deserializer!(u128, "a `u128`.", U128Deserializer, visit_u128); +} + /// A deserializer holding a `u32`. pub struct U32Deserializer { value: u32, diff -Nru temporalio-1.3.0/vendor/serde/src/integer128.rs temporalio-1.3.0/vendor/serde/src/integer128.rs --- temporalio-1.3.0/vendor/serde/src/integer128.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/serde/src/integer128.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,9 +1,82 @@ -// No longer used. Old versions of serde used this macro for supporting targets -// that did not yet have 128-bit integer support. +/// Conditional compilation depending on whether Serde is built with support for +/// 128-bit integers. +/// +/// Data formats that wish to support Rust compiler versions older than 1.26 +/// (or targets that lack 128-bit integers) may place the i128 / u128 methods +/// of their Serializer and Deserializer behind this macro. +/// +/// Data formats that require a minimum Rust compiler version of at least 1.26, +/// or do not target platforms that lack 128-bit integers, do not need to +/// bother with this macro and may assume support for 128-bit integers. +/// +/// ```edition2021 +/// # use serde::__private::doc::Error; +/// # +/// # struct MySerializer; +/// # +/// use serde::{serde_if_integer128, Serializer}; +/// +/// impl Serializer for MySerializer { +/// type Ok = (); +/// type Error = Error; +/// +/// fn serialize_i64(self, v: i64) -> Result { +/// /* ... */ +/// # unimplemented!() +/// } +/// +/// /* ... */ +/// +/// serde_if_integer128! { +/// fn serialize_i128(self, v: i128) -> Result { +/// /* ... */ +/// # unimplemented!() +/// } +/// +/// fn serialize_u128(self, v: u128) -> Result { +/// /* ... */ +/// # unimplemented!() +/// } +/// } +/// # +/// # serde::__serialize_unimplemented! { +/// # bool i8 i16 i32 u8 u16 u32 u64 f32 f64 char str bytes none some +/// # unit unit_struct unit_variant newtype_struct newtype_variant seq +/// # tuple tuple_struct tuple_variant map struct struct_variant +/// # } +/// } +/// ``` +/// +/// When Serde is built with support for 128-bit integers, this macro expands +/// transparently into just the input tokens. +/// +/// ```edition2021 +/// macro_rules! serde_if_integer128 { +/// ($($tt:tt)*) => { +/// $($tt)* +/// }; +/// } +/// ``` +/// +/// When built without support for 128-bit integers, this macro expands to +/// nothing. +/// +/// ```edition2021 +/// macro_rules! serde_if_integer128 { +/// ($($tt:tt)*) => {}; +/// } +/// ``` +#[cfg(not(no_integer128))] #[macro_export] -#[doc(hidden)] macro_rules! serde_if_integer128 { ($($tt:tt)*) => { $($tt)* }; } + +#[cfg(no_integer128)] +#[macro_export] +#[doc(hidden)] +macro_rules! serde_if_integer128 { + ($($tt:tt)*) => {}; +} diff -Nru temporalio-1.3.0/vendor/serde/src/lib.rs temporalio-1.3.0/vendor/serde/src/lib.rs --- temporalio-1.3.0/vendor/serde/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/serde/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -63,7 +63,6 @@ //! and from DynamoDB. //! - [Hjson], a syntax extension to JSON designed around human reading and //! editing. *(deserialization only)* -//! - [CSV], Comma-separated values is a tabular text file format. //! //! [JSON]: https://github.com/serde-rs/json //! [Postcard]: https://github.com/jamesmunns/postcard @@ -90,12 +89,11 @@ //! [DynamoDB Items]: https://docs.rs/serde_dynamo //! [rusoto_dynamodb]: https://docs.rs/rusoto_dynamodb //! [Hjson]: https://github.com/Canop/deser-hjson -//! [CSV]: https://docs.rs/csv //////////////////////////////////////////////////////////////////////////////// // Serde types in rustdoc of other crates get linked to here. -#![doc(html_root_url = "https://docs.rs/serde/1.0.190")] +#![doc(html_root_url = "https://docs.rs/serde/1.0.186")] // Support using Serde without the standard library! #![cfg_attr(not(feature = "std"), no_std)] // Unstable functionality only if the user asks for it. For tracking and @@ -168,14 +166,11 @@ pub use std::*; } + pub use self::core::{cmp, iter, mem, num, ptr, slice, str}; pub use self::core::{f32, f64}; pub use self::core::{i16, i32, i64, i8, isize}; - pub use self::core::{iter, num, ptr, str}; pub use self::core::{u16, u32, u64, u8, usize}; - #[cfg(any(feature = "std", feature = "alloc"))] - pub use self::core::{cmp, mem, slice}; - pub use self::core::cell::{Cell, RefCell}; pub use self::core::clone::{self, Clone}; pub use self::core::cmp::Reverse; diff -Nru temporalio-1.3.0/vendor/serde/src/macros.rs temporalio-1.3.0/vendor/serde/src/macros.rs --- temporalio-1.3.0/vendor/serde/src/macros.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/serde/src/macros.rs 2023-10-30 19:40:00.000000000 +0000 @@ -154,7 +154,9 @@ forward_to_deserialize_any_method!{deserialize_i64<$l, $v>()} }; (i128<$l:tt, $v:ident>) => { - forward_to_deserialize_any_method!{deserialize_i128<$l, $v>()} + serde_if_integer128! { + forward_to_deserialize_any_method!{deserialize_i128<$l, $v>()} + } }; (u8<$l:tt, $v:ident>) => { forward_to_deserialize_any_method!{deserialize_u8<$l, $v>()} @@ -169,7 +171,9 @@ forward_to_deserialize_any_method!{deserialize_u64<$l, $v>()} }; (u128<$l:tt, $v:ident>) => { - forward_to_deserialize_any_method!{deserialize_u128<$l, $v>()} + serde_if_integer128! { + forward_to_deserialize_any_method!{deserialize_u128<$l, $v>()} + } }; (f32<$l:tt, $v:ident>) => { forward_to_deserialize_any_method!{deserialize_f32<$l, $v>()} diff -Nru temporalio-1.3.0/vendor/serde/src/ser/fmt.rs temporalio-1.3.0/vendor/serde/src/ser/fmt.rs --- temporalio-1.3.0/vendor/serde/src/ser/fmt.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/serde/src/ser/fmt.rs 2023-10-30 19:40:00.000000000 +0000 @@ -52,12 +52,10 @@ serialize_i16: i16, serialize_i32: i32, serialize_i64: i64, - serialize_i128: i128, serialize_u8: u8, serialize_u16: u16, serialize_u32: u32, serialize_u64: u64, - serialize_u128: u128, serialize_f32: f32, serialize_f64: f64, serialize_char: char, @@ -65,6 +63,13 @@ serialize_unit_struct: &'static str, } + serde_if_integer128! { + fmt_primitives! { + serialize_i128: i128, + serialize_u128: u128, + } + } + fn serialize_unit_variant( self, _name: &'static str, diff -Nru temporalio-1.3.0/vendor/serde/src/ser/impls.rs temporalio-1.3.0/vendor/serde/src/ser/impls.rs --- temporalio-1.3.0/vendor/serde/src/ser/impls.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/serde/src/ser/impls.rs 2023-10-30 19:40:00.000000000 +0000 @@ -24,17 +24,20 @@ primitive_impl!(i16, serialize_i16); primitive_impl!(i32, serialize_i32); primitive_impl!(i64, serialize_i64); -primitive_impl!(i128, serialize_i128); primitive_impl!(usize, serialize_u64 as u64); primitive_impl!(u8, serialize_u8); primitive_impl!(u16, serialize_u16); primitive_impl!(u32, serialize_u32); primitive_impl!(u64, serialize_u64); -primitive_impl!(u128, serialize_u128); primitive_impl!(f32, serialize_f32); primitive_impl!(f64, serialize_f64); primitive_impl!(char, serialize_char); +serde_if_integer128! { + primitive_impl!(i128, serialize_i128); + primitive_impl!(u128, serialize_u128); +} + //////////////////////////////////////////////////////////////////////////////// impl Serialize for str { @@ -550,7 +553,6 @@ NonZeroU16, NonZeroU32, NonZeroU64, - NonZeroU128, NonZeroUsize, } @@ -560,10 +562,22 @@ NonZeroI16, NonZeroI32, NonZeroI64, - NonZeroI128, NonZeroIsize, } +// Currently 128-bit integers do not work on Emscripten targets so we need an +// additional `#[cfg]` +serde_if_integer128! { + nonzero_integers! { + NonZeroU128, + } + + #[cfg(not(no_num_nonzero_signed))] + nonzero_integers! { + NonZeroI128, + } +} + impl Serialize for Cell where T: Serialize + Copy, diff -Nru temporalio-1.3.0/vendor/serde/src/ser/mod.rs temporalio-1.3.0/vendor/serde/src/ser/mod.rs --- temporalio-1.3.0/vendor/serde/src/ser/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/serde/src/ser/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -488,27 +488,30 @@ /// ``` fn serialize_i64(self, v: i64) -> Result; - /// Serialize an `i128` value. - /// - /// ```edition2021 - /// # use serde::Serializer; - /// # - /// # serde::__private_serialize!(); - /// # - /// impl Serialize for i128 { - /// fn serialize(&self, serializer: S) -> Result - /// where - /// S: Serializer, - /// { - /// serializer.serialize_i128(*self) - /// } - /// } - /// ``` - /// - /// The default behavior unconditionally returns an error. - fn serialize_i128(self, v: i128) -> Result { - let _ = v; - Err(Error::custom("i128 is not supported")) + serde_if_integer128! { + /// Serialize an `i128` value. + /// + /// ```edition2021 + /// # use serde::Serializer; + /// # + /// # serde::__private_serialize!(); + /// # + /// impl Serialize for i128 { + /// fn serialize(&self, serializer: S) -> Result + /// where + /// S: Serializer, + /// { + /// serializer.serialize_i128(*self) + /// } + /// } + /// ``` + /// + /// This method is available only on Rust compiler versions >=1.26. The + /// default behavior unconditionally returns an error. + fn serialize_i128(self, v: i128) -> Result { + let _ = v; + Err(Error::custom("i128 is not supported")) + } } /// Serialize a `u8` value. @@ -595,27 +598,30 @@ /// ``` fn serialize_u64(self, v: u64) -> Result; - /// Serialize a `u128` value. - /// - /// ```edition2021 - /// # use serde::Serializer; - /// # - /// # serde::__private_serialize!(); - /// # - /// impl Serialize for u128 { - /// fn serialize(&self, serializer: S) -> Result - /// where - /// S: Serializer, - /// { - /// serializer.serialize_u128(*self) - /// } - /// } - /// ``` - /// - /// The default behavior unconditionally returns an error. - fn serialize_u128(self, v: u128) -> Result { - let _ = v; - Err(Error::custom("u128 is not supported")) + serde_if_integer128! { + /// Serialize a `u128` value. + /// + /// ```edition2021 + /// # use serde::Serializer; + /// # + /// # serde::__private_serialize!(); + /// # + /// impl Serialize for u128 { + /// fn serialize(&self, serializer: S) -> Result + /// where + /// S: Serializer, + /// { + /// serializer.serialize_u128(*self) + /// } + /// } + /// ``` + /// + /// This method is available only on Rust compiler versions >=1.26. The + /// default behavior unconditionally returns an error. + fn serialize_u128(self, v: u128) -> Result { + let _ = v; + Err(Error::custom("u128 is not supported")) + } } /// Serialize an `f32` value. diff -Nru temporalio-1.3.0/vendor/serde_derive/.cargo-checksum.json temporalio-1.3.0/vendor/serde_derive/.cargo-checksum.json --- temporalio-1.3.0/vendor/serde_derive/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/serde_derive/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"Cargo.toml":"7b54bd563c18f13902ff05933454d0957cf65a13a5ef4c97f7c77ca0d5baab5b","LICENSE-APACHE":"62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","README.md":"c3ece10a36d19b4e857a770eaf74a2164d220f55fa11947065a3898c1697ecef","crates-io.md":"56e988ac4944c45f5bf5051e3827892ed8fb817853d99d9df1fff6621108e270","src/bound.rs":"1b4504ae82ec3dc287eeb4262a57380af484f483c1d6b6c8ebb121370fda135a","src/de.rs":"c221ab2b94a5d80dccff74a37f3448b3d695656552b452595dc289c73b12fb2b","src/dummy.rs":"9533dfee23f20d92ea75734c739022820c2787ded0d54f459feacdeb770ec912","src/fragment.rs":"6757cb4c3131d4300f093572efc273c4ab5a20e3e1efb54a311dcfa52d0bd6eb","src/internals/ast.rs":"7dc997e4090033bbd1d0bdd870e8bb87b096b7f66cfd02047f6b85ebdd569b12","src/internals/attr.rs":"7ec05ffad5b049ba2c91cfb9eedc5d472030682d9c8bcd81040f646525dcc7cd","src/internals/case.rs":"10c8dda2b32d8c6c6b63cf09cdc63d02375af7e95ecefe8fecb34f93b65191bb","src/internals/check.rs":"11275a0889c41323306f5de737f7aacb341adf1dcec298ce40860615be898b3f","src/internals/ctxt.rs":"83a4e6fbe0e439d578478883594407e03f2f340541be479bdf0b04a202633a37","src/internals/mod.rs":"ed021ca635c18132a0e5c3d90f21b7f65def0a61e946421a30200b5b9ab6ad43","src/internals/receiver.rs":"105d72145d1e6a45cdccee3694fcba599ece59194d2e070e8c5669c6f18c81da","src/internals/respan.rs":"899753859c58ce5f532a3ec4584796a52f13ed5a0533191e48c953ba5c1b52ff","src/internals/symbol.rs":"d619e88caa3c7a09b03014257f2b349ee922290062d9b97b4dd19d0e64532690","src/lib.rs":"5e34f7d6b006e03bd7a434cf2f351207b0c53d47cd1256fc9d0d4ee408451d0d","src/pretend.rs":"2c79785bc42e975534d7d88c04b46377cefd3db948b63a32234707531c55b099","src/ser.rs":"e3341471cea9d7e2fb4043e5d1746862beb9a4e25196170879eeac529d460920","src/this.rs":"87818dc80cbb521b51938a653d09daf10aafc220bb10425948de82ad670fcb85"},"package":"67c5609f394e5c2bd7fc51efda478004ea80ef42fee983d5c67a65e34f32c0e3"} \ No newline at end of file +{"files":{"Cargo.toml":"4db5f2b436c12465529a2972c8fd592ae42e3409eb938db71b511f58eba9acf0","LICENSE-APACHE":"62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","README.md":"c3ece10a36d19b4e857a770eaf74a2164d220f55fa11947065a3898c1697ecef","crates-io.md":"56e988ac4944c45f5bf5051e3827892ed8fb817853d99d9df1fff6621108e270","src/bound.rs":"1b4504ae82ec3dc287eeb4262a57380af484f483c1d6b6c8ebb121370fda135a","src/de.rs":"d82c3bc1c7aec8aa7d513ceae65646421910781a3c277c817cf2e15e8e116dcf","src/dummy.rs":"9533dfee23f20d92ea75734c739022820c2787ded0d54f459feacdeb770ec912","src/fragment.rs":"6757cb4c3131d4300f093572efc273c4ab5a20e3e1efb54a311dcfa52d0bd6eb","src/internals/ast.rs":"7dc997e4090033bbd1d0bdd870e8bb87b096b7f66cfd02047f6b85ebdd569b12","src/internals/attr.rs":"7ec05ffad5b049ba2c91cfb9eedc5d472030682d9c8bcd81040f646525dcc7cd","src/internals/case.rs":"10c8dda2b32d8c6c6b63cf09cdc63d02375af7e95ecefe8fecb34f93b65191bb","src/internals/check.rs":"11275a0889c41323306f5de737f7aacb341adf1dcec298ce40860615be898b3f","src/internals/ctxt.rs":"83a4e6fbe0e439d578478883594407e03f2f340541be479bdf0b04a202633a37","src/internals/mod.rs":"ed021ca635c18132a0e5c3d90f21b7f65def0a61e946421a30200b5b9ab6ad43","src/internals/receiver.rs":"105d72145d1e6a45cdccee3694fcba599ece59194d2e070e8c5669c6f18c81da","src/internals/respan.rs":"899753859c58ce5f532a3ec4584796a52f13ed5a0533191e48c953ba5c1b52ff","src/internals/symbol.rs":"d619e88caa3c7a09b03014257f2b349ee922290062d9b97b4dd19d0e64532690","src/lib.rs":"cc5567a13b884989c5e8903cf8b6be799b91839e63cfb7eadebecf051a8863b7","src/pretend.rs":"2c79785bc42e975534d7d88c04b46377cefd3db948b63a32234707531c55b099","src/ser.rs":"e3341471cea9d7e2fb4043e5d1746862beb9a4e25196170879eeac529d460920","src/this.rs":"87818dc80cbb521b51938a653d09daf10aafc220bb10425948de82ad670fcb85"},"package":"5ad697f7e0b65af4983a4ce8f56ed5b357e8d3c36651bf6a7e13639c17b8e670"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/serde_derive/Cargo.toml temporalio-1.3.0/vendor/serde_derive/Cargo.toml --- temporalio-1.3.0/vendor/serde_derive/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/serde_derive/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -12,7 +12,7 @@ [package] rust-version = "1.56" name = "serde_derive" -version = "1.0.190" +version = "1.0.186" authors = [ "Erick Tryzelaar ", "David Tolnay ", diff -Nru temporalio-1.3.0/vendor/serde_derive/src/de.rs temporalio-1.3.0/vendor/serde_derive/src/de.rs --- temporalio-1.3.0/vendor/serde_derive/src/de.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/serde_derive/src/de.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1737,6 +1737,7 @@ quote!(__deserializer), )) }); + let attempts = first_attempt.into_iter().chain(attempts); // TODO this message could be better by saving the errors from the failed // attempts. The heuristic used by TOML was to count the number of fields // processed before an error, and use the error that happened after the @@ -1749,23 +1750,10 @@ ); let fallthrough_msg = cattrs.expecting().unwrap_or(&fallthrough_msg); - // Ignore any error associated with non-untagged deserialization so that we - // can fall through to the untagged variants. This may be infallible so we - // need to provide the error type. - let first_attempt = first_attempt.map(|expr| { - quote! { - if let _serde::__private::Result::<_, __D::Error>::Ok(__ok) = (|| #expr)() { - return _serde::__private::Ok(__ok); - } - } - }); - quote_block! { let __content = <_serde::__private::de::Content as _serde::Deserialize>::deserialize(__deserializer)?; let __deserializer = _serde::__private::de::ContentRefDeserializer::<__D::Error>::new(&__content); - #first_attempt - #( if let _serde::__private::Ok(__ok) = #attempts { return _serde::__private::Ok(__ok); @@ -1840,7 +1828,7 @@ let this_value = ¶ms.this_value; let type_name = params.type_name(); let variant_name = variant.ident.to_string(); - let default = variant.fields.first().map(|field| { + let default = variant.fields.get(0).map(|field| { let default = Expr(expr_is_missing(field, cattrs)); quote!((#default)) }); @@ -1885,7 +1873,7 @@ let this_value = ¶ms.this_value; let type_name = params.type_name(); let variant_name = variant.ident.to_string(); - let default = variant.fields.first().map(|field| { + let default = variant.fields.get(0).map(|field| { let default = Expr(expr_is_missing(field, cattrs)); quote!((#default)) }); diff -Nru temporalio-1.3.0/vendor/serde_derive/src/lib.rs temporalio-1.3.0/vendor/serde_derive/src/lib.rs --- temporalio-1.3.0/vendor/serde_derive/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/serde_derive/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -13,7 +13,7 @@ //! //! [https://serde.rs/derive.html]: https://serde.rs/derive.html -#![doc(html_root_url = "https://docs.rs/serde_derive/1.0.190")] +#![doc(html_root_url = "https://docs.rs/serde_derive/1.0.186")] // Ignored clippy lints #![allow( // clippy false positive: https://github.com/rust-lang/rust-clippy/issues/7054 diff -Nru temporalio-1.3.0/vendor/serde_json/build.rs temporalio-1.3.0/vendor/serde_json/build.rs --- temporalio-1.3.0/vendor/serde_json/build.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/serde_json/build.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,4 +1,6 @@ use std::env; +use std::process::Command; +use std::str::{self, FromStr}; fn main() { println!("cargo:rerun-if-changed=build.rs"); @@ -14,4 +16,39 @@ println!("cargo:rustc-cfg=limb_width_32"); } } + + let minor = match rustc_minor_version() { + Some(minor) => minor, + None => return, + }; + + // BTreeMap::get_key_value + // https://blog.rust-lang.org/2019/12/19/Rust-1.40.0.html#additions-to-the-standard-library + if minor < 40 { + println!("cargo:rustc-cfg=no_btreemap_get_key_value"); + } + + // BTreeMap::remove_entry + // https://blog.rust-lang.org/2020/07/16/Rust-1.45.0.html#library-changes + if minor < 45 { + println!("cargo:rustc-cfg=no_btreemap_remove_entry"); + } + + // BTreeMap::retain + // https://blog.rust-lang.org/2021/06/17/Rust-1.53.0.html#stabilized-apis + if minor < 53 { + println!("cargo:rustc-cfg=no_btreemap_retain"); + } +} + +fn rustc_minor_version() -> Option { + let rustc = env::var_os("RUSTC")?; + let output = Command::new(rustc).arg("--version").output().ok()?; + let version = str::from_utf8(&output.stdout).ok()?; + let mut pieces = version.split('.'); + if pieces.next() != Some("rustc 1") { + return None; + } + let next = pieces.next()?; + u32::from_str(next).ok() } diff -Nru temporalio-1.3.0/vendor/serde_json/.cargo-checksum.json temporalio-1.3.0/vendor/serde_json/.cargo-checksum.json --- temporalio-1.3.0/vendor/serde_json/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/serde_json/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"CONTRIBUTING.md":"f5270cafba66223a7b51ffc0d286075a17bb7cd88762fc80d333d3102629f4d8","Cargo.toml":"e68bf53b10d1809f1f81b9f4a8dc4c2bfb98f18eedf150e2118e9fa13f0dede6","LICENSE-APACHE":"62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","README.md":"e49066294ebbeca4e71e5cb8f2e43b5f7a41cd0b47eeb1bad7b24d3c136bd8c0","build.rs":"83958125f23604be59b63eb47ee06309d012b6b7411ccbe09f9a39b9eff3cc11","src/de.rs":"8cb56c5168ad52dfff97a0f3bc88c200e3ad0a9278eedaa27629120f8b6e6052","src/error.rs":"c8998e8595127d712c2d2c85f6fc69d59f9fcb567009631b5b029669542dcc75","src/features_check/error.rs":"d7359f864afbfe105a38abea9f563dc423036ebc4c956a5695a4beef144dc7ec","src/features_check/mod.rs":"2209f8d5c46b50c8a3b8dc22338dcaf0135d192e8b05d2f456cbe6a73104e958","src/io/core.rs":"60ba28f67a9acaecf8964b611efba416b13f9f2bae4befc329fdf0e037293802","src/io/mod.rs":"fd1ed5080495cab21117f6f7d3c2c9e3687cad0c69a0cd087b08a145a9e672da","src/iter.rs":"f832c469cd7999d26ba9b76baa69b257a212a7edb3dfdf9b1d1bb35e8da85fa9","src/lexical/algorithm.rs":"bd6106e5d8875c9ff1c1d57256b459a4f0992d14a0df1a5fffcd3d3cbdccee8c","src/lexical/bhcomp.rs":"b7c68d74c0055eb67ec2c1bcf27bbc28bef8f1bbc43db8eb94ba69892230add6","src/lexical/bignum.rs":"4230cde10dc8eae456a713cf90ec4e48dff4b1d0c542621ce7f00f39ade2645e","src/lexical/cached.rs":"0e127398691f8042c19cde209e7f4b0161f0f3150342430145929f711e6fdac8","src/lexical/cached_float80.rs":"0f8f74a22cb7d871322a9893bffd0255ca10bf9dffd13afb2462dd3d7f51805f","src/lexical/digit.rs":"9502805adbc3da059131d1fac0a802e17065b36cd7472606b3af24e3241d5cb8","src/lexical/errors.rs":"3d9f6de6245533bcb101dfd718cfed61d59dc293f6768cedae28aa13ace164f5","src/lexical/exponent.rs":"387e945b97dc7ba48a7091c50d228a0dde3a1c4145703d4ab9c31191a91693b0","src/lexical/float.rs":"fe356213c92a049f4bef2f58bc0e3a26866ca06b8c1d74d0f961c5b883852cad","src/lexical/large_powers.rs":"34537f5c701afce1ec2a1fd3c14950381b2e27c9ad74f002c91f3708e8da9ca5","src/lexical/large_powers32.rs":"d533037c6141e6671102aee490c9cdeaba81e667ddca781b2b99db2c455e4a1a","src/lexical/large_powers64.rs":"745dd7c0cbe499eec027ef586248881011d9df20c7efab7929c1807b59886ba1","src/lexical/math.rs":"240804aa030849495fa03a83a0ee8539d5a5c8639b825f2d69d27b7567b06fb3","src/lexical/mod.rs":"4b4c5228779c0f135a4cb018700e3bcd495da48b74421a86f6b8b304acdef924","src/lexical/num.rs":"cf705c62612e31d704f43d94a633ea1243c6befad7ef5792e2e881a7fd21e809","src/lexical/parse.rs":"c2bfac4c70a19938ced61e991f4ec606764887cf12bac1a0978b5b5318a56aac","src/lexical/rounding.rs":"697207248ba17b7f4965aedb11d276261ada5b06d9c6265d8fd6246664ff6e3c","src/lexical/shift.rs":"bc1ed053dd63d45ac9c35302f18de9f00d94027f28af4ab749c9248439de832a","src/lexical/small_powers.rs":"4608dd218b8002435db7e1ec79d2d0fef5f47ae257b93353326d52ecc80cccda","src/lib.rs":"f8a08c5c1fb7d7d62a66a6be83c94d4f7fe9d57c5bae1c8e18bfb9888c76d5f7","src/macros.rs":"516f69976f433bcc5e48c32b3e29c2e0ab7b549810827d7a9c59171cdf11c1e2","src/map.rs":"5a96fa857e54a04fdca5e3ae93dd44a56fc8acdd71dd2c57a75cef495f7eb8b2","src/number.rs":"464e576953bc3d3df228d88890dd2fe4da123479f5756e03e06c7f7633959156","src/raw.rs":"4183bd3e8b7c97605ec5bab4e7fbdb2a09e00bdc53984fbe2066674510ea74ae","src/read.rs":"6b5b6689f5728f9d2e73a1f6216a811ceb77315174334b44513199898e316f37","src/ser.rs":"ee5b6cb04c2ff7058b52cb5d0383218f484505ce0896e5c7fd5076bd9d90952e","src/value/de.rs":"69d88d0ba8a8fea15964e0c95968e53ab308b143176537bfa6368432a682a65c","src/value/from.rs":"add9687e35db3962729d986c8aa54785cadeb07b8b7121cd4075e3a37ecc73a1","src/value/index.rs":"1a0d59629ae16d6553686de8d7152abd470153f67f9a1b69741e480ba491cd67","src/value/mod.rs":"4c7af0f6de5d7e7b83e59a5062892d0a071710f73f0326886ce239d5ae05ba09","src/value/partial_eq.rs":"655fd0bf3ab1d6669444a55ab849f43bb333032de8ca8f1ee95e1068da43ee22","src/value/ser.rs":"6b065423acf88d875d30608d61210a372507c7242d6525e5ef66077296ba32f1","tests/compiletest.rs":"022a8e400ef813d7ea1875b944549cee5125f6a995dc33e93b48cba3e1b57bd1","tests/debug.rs":"a8451217c1e127ad6e653ef11e0513525ee350e1e37dd575758a8ee9301b28fb","tests/lexical.rs":"8ee6e617ef62a090de49ac2a930130a6913ab5316100781543c7788f89ef99c2","tests/lexical/algorithm.rs":"da378df9ee24bfa033968d5c94e91b58e52c39bf6c825dec51c3eb7250cc5874","tests/lexical/exponent.rs":"26ea92abc654a6a88a8281552bca2f76ea1fa4c17d66a1dd6defe14f7d89b666","tests/lexical/float.rs":"0440f2d85c993bcccd925096d7f4136bf624ffd66b3c7ee565d158390685eb11","tests/lexical/math.rs":"4874be2103be5fbe8b8015354414df271ffa00fd815546fc077f15fb4d7a5a37","tests/lexical/num.rs":"6e650c40de85ed72ac06b6bf1487ba161f3824e26d827df6cfdf2bbdb8d05a05","tests/lexical/parse.rs":"a11f09bb003a3a024548008cf78bf76526ed71b00077d1989f45eb8cebc93b9c","tests/lexical/rounding.rs":"6c56e39ba534616c1b2146e8efa6eb57aed322e683bf23183cd32a61fae6447e","tests/macros/mod.rs":"93aa1d54af20bc2c55b6ae8db73c1414cda2626eb9fa7bd57b9d613a3c6e6a19","tests/map.rs":"89f604c5788bcb8dc82c82e252dc0da47257986e353c09d14e4ef3e58c455f2d","tests/regression.rs":"86731134bfb9bb693d9a4fc62393027de80a8bf031109ea6c7ea475b1ebdde8d","tests/regression/issue1004.rs":"38d7e3b6c515b881078ebd21ca8063d2ca105cd319695d29538f879e37f091b5","tests/regression/issue520.rs":"d146be3472db902b48127d65fe83aa9f698143aca9074c83cd1a9d5dd28e3ec3","tests/regression/issue795.rs":"582e2e7c68113f05a4b1d2cb556a2df7cc77f2ce8164a32c5cc58ae68abb60ec","tests/regression/issue845.rs":"66eb0eeabb744adaad42fd8e2638de22b458a04ec33863e2683b60eb3d500297","tests/regression/issue953.rs":"b2cddc761f5ca6639900c173765a8a5868528a896924e5e925db2696469208f7","tests/stream.rs":"c7d91014538ecd8f495b196d40e999ab2745f2e69fa2ff9e52521605dc6ce856","tests/test.rs":"316938d202db3b706a493917f5380edb6893cb7bac36ffa460e9ce5c281ce340","tests/ui/missing_colon.rs":"d07e0c34d98eb43465f0a0310f2c0b5d5b0d26d243b352a1c6bbe6ad3b27eda9","tests/ui/missing_colon.stderr":"3732fd8f4e57b84efc07170cda5f9c5b2b17c707e23c1659222b5a46f652a8d8","tests/ui/missing_comma.rs":"b8a9662f99c3e6dd2b6417892c37640578ce91d3a8365bf10c1f686a3227aa87","tests/ui/missing_comma.stderr":"eae626cf93c97abd105066e624ca4e8cb096784413b9d2564cf9414a8492bc4d","tests/ui/missing_value.rs":"bca25d67127fb88e7c191c7b03af5a4ce8a9abb630f3d2e6a6c1e77e213dc9a4","tests/ui/missing_value.stderr":"b0df8add5cf74e5df30eedd3ca347e4862c04a01c54d802ff45392f2032065b1","tests/ui/not_found.rs":"d0a7adb309879ff65aee115b52cc33d36f4bad353cf97c4effc34a6128c2bee3","tests/ui/not_found.stderr":"359b751c0c21fab6d460daef4d5f73a265f7769c9b578f98ea3cb6cbf2387643","tests/ui/parse_expr.rs":"32e6d51f528db3d1ab0ed1e24765b865be393565c26f77413c5aa39d601ac563","tests/ui/parse_expr.stderr":"4fcd0a014fbce31c9266bab8527d6e6b6806a0e21d9e0275ce713137856073ce","tests/ui/parse_key.rs":"18829b2af320d5cf8a0a5cd3aaf84c7e92cc874651c30e45a3acafb76c2d8b93","tests/ui/parse_key.stderr":"fcb44e060b804a4762b7291e128c41d7010ffa8ab820b8828fd13fbe6d405ca6","tests/ui/unexpected_after_array_element.rs":"a343fc3104431720bdfcf330bcc3cfcd98c8dec3e951133b495242478b0b7eb3","tests/ui/unexpected_after_array_element.stderr":"8df615998fa3057bb9ed865981a35cdbb771625337048f0ad3fba7734e607adf","tests/ui/unexpected_after_map_entry.rs":"6e3bd2def435ca610e346bbc75cdbaf61963eb2ef1885bb5f76781ba1fac37ef","tests/ui/unexpected_after_map_entry.stderr":"b1985c89075ab48b2158bd1705ed766d37854b3d4620ab257cc8bc319d224f17","tests/ui/unexpected_colon.rs":"a313cff3fed4be4c33f1eda5d0c5c98147fb835a56d36470d9f367352c1d61ef","tests/ui/unexpected_colon.stderr":"b2288742fa6a4a7eb65d2ae899bcfed8795b57bd04958da227d60928a8df26c5","tests/ui/unexpected_comma.rs":"55a8b684bde1ce905837cce719fd457d8898b61cebc27e5b420d05cb6be97256","tests/ui/unexpected_comma.stderr":"4c103ca63ff15e2ca659242cc0eae0612bf050e7580da62f1cf50de8082aa7dc"},"package":"3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b"} \ No newline at end of file +{"files":{"CONTRIBUTING.md":"f5270cafba66223a7b51ffc0d286075a17bb7cd88762fc80d333d3102629f4d8","Cargo.toml":"299e588dc56a4f18b4cccbb2501f956bcf2a161ee7831a110c6080f9d8ca90b2","LICENSE-APACHE":"62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","README.md":"1e5a86e6b5e79f92f9e7226d9a8ba16d4ec70567d153c9cacebcb582770378a1","build.rs":"0dd97b63a07aa2d4bbb4c7d0e73b521da130769da9f49f28a7b63332781eb3de","src/de.rs":"8cb56c5168ad52dfff97a0f3bc88c200e3ad0a9278eedaa27629120f8b6e6052","src/error.rs":"c8998e8595127d712c2d2c85f6fc69d59f9fcb567009631b5b029669542dcc75","src/features_check/error.rs":"d7359f864afbfe105a38abea9f563dc423036ebc4c956a5695a4beef144dc7ec","src/features_check/mod.rs":"2209f8d5c46b50c8a3b8dc22338dcaf0135d192e8b05d2f456cbe6a73104e958","src/io/core.rs":"60ba28f67a9acaecf8964b611efba416b13f9f2bae4befc329fdf0e037293802","src/io/mod.rs":"fd1ed5080495cab21117f6f7d3c2c9e3687cad0c69a0cd087b08a145a9e672da","src/iter.rs":"f832c469cd7999d26ba9b76baa69b257a212a7edb3dfdf9b1d1bb35e8da85fa9","src/lexical/algorithm.rs":"bd6106e5d8875c9ff1c1d57256b459a4f0992d14a0df1a5fffcd3d3cbdccee8c","src/lexical/bhcomp.rs":"b7c68d74c0055eb67ec2c1bcf27bbc28bef8f1bbc43db8eb94ba69892230add6","src/lexical/bignum.rs":"4230cde10dc8eae456a713cf90ec4e48dff4b1d0c542621ce7f00f39ade2645e","src/lexical/cached.rs":"0e127398691f8042c19cde209e7f4b0161f0f3150342430145929f711e6fdac8","src/lexical/cached_float80.rs":"0f8f74a22cb7d871322a9893bffd0255ca10bf9dffd13afb2462dd3d7f51805f","src/lexical/digit.rs":"9502805adbc3da059131d1fac0a802e17065b36cd7472606b3af24e3241d5cb8","src/lexical/errors.rs":"3d9f6de6245533bcb101dfd718cfed61d59dc293f6768cedae28aa13ace164f5","src/lexical/exponent.rs":"387e945b97dc7ba48a7091c50d228a0dde3a1c4145703d4ab9c31191a91693b0","src/lexical/float.rs":"fe356213c92a049f4bef2f58bc0e3a26866ca06b8c1d74d0f961c5b883852cad","src/lexical/large_powers.rs":"34537f5c701afce1ec2a1fd3c14950381b2e27c9ad74f002c91f3708e8da9ca5","src/lexical/large_powers32.rs":"d533037c6141e6671102aee490c9cdeaba81e667ddca781b2b99db2c455e4a1a","src/lexical/large_powers64.rs":"745dd7c0cbe499eec027ef586248881011d9df20c7efab7929c1807b59886ba1","src/lexical/math.rs":"240804aa030849495fa03a83a0ee8539d5a5c8639b825f2d69d27b7567b06fb3","src/lexical/mod.rs":"4b4c5228779c0f135a4cb018700e3bcd495da48b74421a86f6b8b304acdef924","src/lexical/num.rs":"cf705c62612e31d704f43d94a633ea1243c6befad7ef5792e2e881a7fd21e809","src/lexical/parse.rs":"c2bfac4c70a19938ced61e991f4ec606764887cf12bac1a0978b5b5318a56aac","src/lexical/rounding.rs":"697207248ba17b7f4965aedb11d276261ada5b06d9c6265d8fd6246664ff6e3c","src/lexical/shift.rs":"bc1ed053dd63d45ac9c35302f18de9f00d94027f28af4ab749c9248439de832a","src/lexical/small_powers.rs":"4608dd218b8002435db7e1ec79d2d0fef5f47ae257b93353326d52ecc80cccda","src/lib.rs":"0c43843f179f928ba8c6a19c4b81c307e54aef2ae90feca88b782ba9e1c853f5","src/macros.rs":"516f69976f433bcc5e48c32b3e29c2e0ab7b549810827d7a9c59171cdf11c1e2","src/map.rs":"b268a714042a3a2ce39878a5ae2eeac305460ccb6615b4b90b96ea38cf7b9e5d","src/number.rs":"21c95a6a8be8df5e2e4e7653984138640c6eb1d3d1b69f2f3841645c25b2226c","src/raw.rs":"d76153f2e8ccb8e770ae9c688c7ca93c3a56c1891c7ef1c0b49a215bb4da52ae","src/read.rs":"49b4b1d067b6485cbded28fb961666ab5df82c36661af722dbae756efb6b2891","src/ser.rs":"ee5b6cb04c2ff7058b52cb5d0383218f484505ce0896e5c7fd5076bd9d90952e","src/value/de.rs":"69d88d0ba8a8fea15964e0c95968e53ab308b143176537bfa6368432a682a65c","src/value/from.rs":"d17ecf4407137d87b1c00b0d3855655923f850c4b668a6c3b670b248e7bf8061","src/value/index.rs":"8a99d8d50f5674181ced22f6e81dc529eaecb01e543e30346e51fe42cb4b8a5f","src/value/mod.rs":"ee7305db19bcf9e9f0bcca8844ce46bf36efe41f6dadc14884d9cf0985f1bf7a","src/value/partial_eq.rs":"b64e1e1dffd50fefe3106ca74499aac01ea3d76b995d3cc1ef3a2b2768d0f1cf","src/value/ser.rs":"6b065423acf88d875d30608d61210a372507c7242d6525e5ef66077296ba32f1","tests/compiletest.rs":"022a8e400ef813d7ea1875b944549cee5125f6a995dc33e93b48cba3e1b57bd1","tests/debug.rs":"a8451217c1e127ad6e653ef11e0513525ee350e1e37dd575758a8ee9301b28fb","tests/lexical.rs":"b65eaef5edbc3294751c6ddc0a51eaf8de9165d65955f87c2e3b2679a49de3b0","tests/lexical/algorithm.rs":"da378df9ee24bfa033968d5c94e91b58e52c39bf6c825dec51c3eb7250cc5874","tests/lexical/exponent.rs":"26ea92abc654a6a88a8281552bca2f76ea1fa4c17d66a1dd6defe14f7d89b666","tests/lexical/float.rs":"0440f2d85c993bcccd925096d7f4136bf624ffd66b3c7ee565d158390685eb11","tests/lexical/math.rs":"4874be2103be5fbe8b8015354414df271ffa00fd815546fc077f15fb4d7a5a37","tests/lexical/num.rs":"6e650c40de85ed72ac06b6bf1487ba161f3824e26d827df6cfdf2bbdb8d05a05","tests/lexical/parse.rs":"17c73e0a59d462716d974b8dd23a291eb6efdc3a933248874e5eab7e7209d67f","tests/lexical/rounding.rs":"6c56e39ba534616c1b2146e8efa6eb57aed322e683bf23183cd32a61fae6447e","tests/macros/mod.rs":"93aa1d54af20bc2c55b6ae8db73c1414cda2626eb9fa7bd57b9d613a3c6e6a19","tests/map.rs":"dcc5212242e4e93703c4335d54f5603b0211b33d6fb5ab410bb630cda6d46b09","tests/regression.rs":"86731134bfb9bb693d9a4fc62393027de80a8bf031109ea6c7ea475b1ebdde8d","tests/regression/issue1004.rs":"38d7e3b6c515b881078ebd21ca8063d2ca105cd319695d29538f879e37f091b5","tests/regression/issue520.rs":"d146be3472db902b48127d65fe83aa9f698143aca9074c83cd1a9d5dd28e3ec3","tests/regression/issue795.rs":"582e2e7c68113f05a4b1d2cb556a2df7cc77f2ce8164a32c5cc58ae68abb60ec","tests/regression/issue845.rs":"66eb0eeabb744adaad42fd8e2638de22b458a04ec33863e2683b60eb3d500297","tests/regression/issue953.rs":"b2cddc761f5ca6639900c173765a8a5868528a896924e5e925db2696469208f7","tests/stream.rs":"c7d91014538ecd8f495b196d40e999ab2745f2e69fa2ff9e52521605dc6ce856","tests/test.rs":"eff7da41d2e0a89ace8bbfaa3cd731581e1d2a70e40a9a3d11a1ecc4fafafe6e","tests/ui/missing_colon.rs":"d07e0c34d98eb43465f0a0310f2c0b5d5b0d26d243b352a1c6bbe6ad3b27eda9","tests/ui/missing_colon.stderr":"3732fd8f4e57b84efc07170cda5f9c5b2b17c707e23c1659222b5a46f652a8d8","tests/ui/missing_comma.rs":"b8a9662f99c3e6dd2b6417892c37640578ce91d3a8365bf10c1f686a3227aa87","tests/ui/missing_comma.stderr":"eae626cf93c97abd105066e624ca4e8cb096784413b9d2564cf9414a8492bc4d","tests/ui/missing_value.rs":"bca25d67127fb88e7c191c7b03af5a4ce8a9abb630f3d2e6a6c1e77e213dc9a4","tests/ui/missing_value.stderr":"b0df8add5cf74e5df30eedd3ca347e4862c04a01c54d802ff45392f2032065b1","tests/ui/not_found.rs":"d0a7adb309879ff65aee115b52cc33d36f4bad353cf97c4effc34a6128c2bee3","tests/ui/not_found.stderr":"359b751c0c21fab6d460daef4d5f73a265f7769c9b578f98ea3cb6cbf2387643","tests/ui/parse_expr.rs":"32e6d51f528db3d1ab0ed1e24765b865be393565c26f77413c5aa39d601ac563","tests/ui/parse_expr.stderr":"4fcd0a014fbce31c9266bab8527d6e6b6806a0e21d9e0275ce713137856073ce","tests/ui/parse_key.rs":"18829b2af320d5cf8a0a5cd3aaf84c7e92cc874651c30e45a3acafb76c2d8b93","tests/ui/parse_key.stderr":"fcb44e060b804a4762b7291e128c41d7010ffa8ab820b8828fd13fbe6d405ca6","tests/ui/unexpected_after_array_element.rs":"a343fc3104431720bdfcf330bcc3cfcd98c8dec3e951133b495242478b0b7eb3","tests/ui/unexpected_after_array_element.stderr":"8df615998fa3057bb9ed865981a35cdbb771625337048f0ad3fba7734e607adf","tests/ui/unexpected_after_map_entry.rs":"6e3bd2def435ca610e346bbc75cdbaf61963eb2ef1885bb5f76781ba1fac37ef","tests/ui/unexpected_after_map_entry.stderr":"b1985c89075ab48b2158bd1705ed766d37854b3d4620ab257cc8bc319d224f17","tests/ui/unexpected_colon.rs":"a313cff3fed4be4c33f1eda5d0c5c98147fb835a56d36470d9f367352c1d61ef","tests/ui/unexpected_colon.stderr":"b2288742fa6a4a7eb65d2ae899bcfed8795b57bd04958da227d60928a8df26c5","tests/ui/unexpected_comma.rs":"55a8b684bde1ce905837cce719fd457d8898b61cebc27e5b420d05cb6be97256","tests/ui/unexpected_comma.stderr":"4c103ca63ff15e2ca659242cc0eae0612bf050e7580da62f1cf50de8082aa7dc"},"package":"693151e1ac27563d6dbcec9dee9fbd5da8539b20fa14ad3752b2e6d363ace360"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/serde_json/Cargo.toml temporalio-1.3.0/vendor/serde_json/Cargo.toml --- temporalio-1.3.0/vendor/serde_json/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/serde_json/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -13,7 +13,7 @@ edition = "2021" rust-version = "1.56" name = "serde_json" -version = "1.0.108" +version = "1.0.105" authors = [ "Erick Tryzelaar ", "David Tolnay ", diff -Nru temporalio-1.3.0/vendor/serde_json/README.md temporalio-1.3.0/vendor/serde_json/README.md --- temporalio-1.3.0/vendor/serde_json/README.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/serde_json/README.md 2023-10-30 19:40:00.000000000 +0000 @@ -76,7 +76,7 @@ A string of JSON data can be parsed into a `serde_json::Value` by the [`serde_json::from_str`][from_str] function. There is also -[`from_slice`][from_slice] for parsing from a byte slice &\[u8\] and +[`from_slice`][from_slice] for parsing from a byte slice &[u8] and [`from_reader`][from_reader] for parsing from any `io::Read` like a File or a TCP stream. diff -Nru temporalio-1.3.0/vendor/serde_json/src/lib.rs temporalio-1.3.0/vendor/serde_json/src/lib.rs --- temporalio-1.3.0/vendor/serde_json/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/serde_json/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -55,9 +55,10 @@ //! ``` //! //! A string of JSON data can be parsed into a `serde_json::Value` by the -//! [`serde_json::from_str`][from_str] function. There is also [`from_slice`] -//! for parsing from a byte slice &\[u8\] and [`from_reader`] for parsing from -//! any `io::Read` like a File or a TCP stream. +//! [`serde_json::from_str`][from_str] function. There is also +//! [`from_slice`][from_slice] for parsing from a byte slice &[u8] and +//! [`from_reader`][from_reader] for parsing from any `io::Read` like a File or +//! a TCP stream. //! //! ``` //! use serde_json::{Result, Value}; @@ -299,7 +300,7 @@ //! [macro]: crate::json //! [`serde-json-core`]: https://github.com/rust-embedded-community/serde-json-core -#![doc(html_root_url = "https://docs.rs/serde_json/1.0.108")] +#![doc(html_root_url = "https://docs.rs/serde_json/1.0.105")] // Ignored clippy lints #![allow( clippy::collapsible_else_if, diff -Nru temporalio-1.3.0/vendor/serde_json/src/map.rs temporalio-1.3.0/vendor/serde_json/src/map.rs --- temporalio-1.3.0/vendor/serde_json/src/map.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/serde_json/src/map.rs 2023-10-30 19:40:00.000000000 +0000 @@ -106,6 +106,7 @@ /// The key may be any borrowed form of the map's key type, but the ordering /// on the borrowed form *must* match the ordering on the key type. #[inline] + #[cfg(any(feature = "preserve_order", not(no_btreemap_get_key_value)))] pub fn get_key_value(&self, key: &Q) -> Option<(&String, &Value)> where String: Borrow, @@ -152,7 +153,44 @@ String: Borrow, Q: ?Sized + Ord + Eq + Hash, { - self.map.remove_entry(key) + #[cfg(any(feature = "preserve_order", not(no_btreemap_remove_entry)))] + return self.map.remove_entry(key); + #[cfg(all( + not(feature = "preserve_order"), + no_btreemap_remove_entry, + not(no_btreemap_get_key_value), + ))] + { + let (key, _value) = self.map.get_key_value(key)?; + let key = key.clone(); + let value = self.map.remove::(&key)?; + Some((key, value)) + } + #[cfg(all( + not(feature = "preserve_order"), + no_btreemap_remove_entry, + no_btreemap_get_key_value, + ))] + { + use core::ops::{Bound, RangeBounds}; + + struct Key<'a, Q: ?Sized>(&'a Q); + + impl<'a, Q: ?Sized> RangeBounds for Key<'a, Q> { + fn start_bound(&self) -> Bound<&Q> { + Bound::Included(self.0) + } + fn end_bound(&self) -> Bound<&Q> { + Bound::Included(self.0) + } + } + + let mut range = self.map.range(Key(key)); + let (key, _value) = range.next()?; + let key = key.clone(); + let value = self.map.remove::(&key)?; + Some((key, value)) + } } /// Moves all elements from other into self, leaving other empty. @@ -238,6 +276,7 @@ /// /// In other words, remove all pairs `(k, v)` such that `f(&k, &mut v)` /// returns `false`. + #[cfg(not(no_btreemap_retain))] #[inline] pub fn retain(&mut self, f: F) where diff -Nru temporalio-1.3.0/vendor/serde_json/src/number.rs temporalio-1.3.0/vendor/serde_json/src/number.rs --- temporalio-1.3.0/vendor/serde_json/src/number.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/serde_json/src/number.rs 2023-10-30 19:40:00.000000000 +0000 @@ -279,33 +279,6 @@ } } - /// Returns the exact original JSON representation that this Number was - /// parsed from. - /// - /// For numbers constructed not via parsing, such as by `From`, returns - /// the JSON representation that serde\_json would serialize for this - /// number. - /// - /// ``` - /// # use serde_json::Number; - /// for value in [ - /// "7", - /// "12.34", - /// "34e-56789", - /// "0.0123456789000000012345678900000001234567890000123456789", - /// "343412345678910111213141516171819202122232425262728293034", - /// "-343412345678910111213141516171819202122232425262728293031", - /// ] { - /// let number: Number = serde_json::from_str(value).unwrap(); - /// assert_eq!(number.as_str(), value); - /// } - /// ``` - #[cfg(feature = "arbitrary_precision")] - #[cfg_attr(docsrs, doc(cfg(feature = "arbitrary_precision")))] - pub fn as_str(&self) -> &str { - &self.n - } - pub(crate) fn as_f32(&self) -> Option { #[cfg(not(feature = "arbitrary_precision"))] match self.n { diff -Nru temporalio-1.3.0/vendor/serde_json/src/raw.rs temporalio-1.3.0/vendor/serde_json/src/raw.rs --- temporalio-1.3.0/vendor/serde_json/src/raw.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/serde_json/src/raw.rs 2023-10-30 19:40:00.000000000 +0000 @@ -527,251 +527,3 @@ seed.deserialize(BorrowedStrDeserializer::new(self.raw_value.take().unwrap())) } } - -impl<'de> IntoDeserializer<'de, Error> for &'de RawValue { - type Deserializer = &'de RawValue; - - fn into_deserializer(self) -> Self::Deserializer { - self - } -} - -impl<'de> Deserializer<'de> for &'de RawValue { - type Error = Error; - - fn deserialize_any(self, visitor: V) -> Result - where - V: Visitor<'de>, - { - crate::Deserializer::from_str(&self.json).deserialize_any(visitor) - } - - fn deserialize_bool(self, visitor: V) -> Result - where - V: Visitor<'de>, - { - crate::Deserializer::from_str(&self.json).deserialize_bool(visitor) - } - - fn deserialize_i8(self, visitor: V) -> Result - where - V: Visitor<'de>, - { - crate::Deserializer::from_str(&self.json).deserialize_i8(visitor) - } - - fn deserialize_i16(self, visitor: V) -> Result - where - V: Visitor<'de>, - { - crate::Deserializer::from_str(&self.json).deserialize_i16(visitor) - } - - fn deserialize_i32(self, visitor: V) -> Result - where - V: Visitor<'de>, - { - crate::Deserializer::from_str(&self.json).deserialize_i32(visitor) - } - - fn deserialize_i64(self, visitor: V) -> Result - where - V: Visitor<'de>, - { - crate::Deserializer::from_str(&self.json).deserialize_i64(visitor) - } - - fn deserialize_i128(self, visitor: V) -> Result - where - V: Visitor<'de>, - { - crate::Deserializer::from_str(&self.json).deserialize_i128(visitor) - } - - fn deserialize_u8(self, visitor: V) -> Result - where - V: Visitor<'de>, - { - crate::Deserializer::from_str(&self.json).deserialize_u8(visitor) - } - - fn deserialize_u16(self, visitor: V) -> Result - where - V: Visitor<'de>, - { - crate::Deserializer::from_str(&self.json).deserialize_u16(visitor) - } - - fn deserialize_u32(self, visitor: V) -> Result - where - V: Visitor<'de>, - { - crate::Deserializer::from_str(&self.json).deserialize_u32(visitor) - } - - fn deserialize_u64(self, visitor: V) -> Result - where - V: Visitor<'de>, - { - crate::Deserializer::from_str(&self.json).deserialize_u64(visitor) - } - - fn deserialize_u128(self, visitor: V) -> Result - where - V: Visitor<'de>, - { - crate::Deserializer::from_str(&self.json).deserialize_u128(visitor) - } - - fn deserialize_f32(self, visitor: V) -> Result - where - V: Visitor<'de>, - { - crate::Deserializer::from_str(&self.json).deserialize_f32(visitor) - } - - fn deserialize_f64(self, visitor: V) -> Result - where - V: Visitor<'de>, - { - crate::Deserializer::from_str(&self.json).deserialize_f64(visitor) - } - - fn deserialize_char(self, visitor: V) -> Result - where - V: Visitor<'de>, - { - crate::Deserializer::from_str(&self.json).deserialize_char(visitor) - } - - fn deserialize_str(self, visitor: V) -> Result - where - V: Visitor<'de>, - { - crate::Deserializer::from_str(&self.json).deserialize_str(visitor) - } - - fn deserialize_string(self, visitor: V) -> Result - where - V: Visitor<'de>, - { - crate::Deserializer::from_str(&self.json).deserialize_string(visitor) - } - - fn deserialize_bytes(self, visitor: V) -> Result - where - V: Visitor<'de>, - { - crate::Deserializer::from_str(&self.json).deserialize_bytes(visitor) - } - - fn deserialize_byte_buf(self, visitor: V) -> Result - where - V: Visitor<'de>, - { - crate::Deserializer::from_str(&self.json).deserialize_byte_buf(visitor) - } - - fn deserialize_option(self, visitor: V) -> Result - where - V: Visitor<'de>, - { - crate::Deserializer::from_str(&self.json).deserialize_option(visitor) - } - - fn deserialize_unit(self, visitor: V) -> Result - where - V: Visitor<'de>, - { - crate::Deserializer::from_str(&self.json).deserialize_unit(visitor) - } - - fn deserialize_unit_struct(self, name: &'static str, visitor: V) -> Result - where - V: Visitor<'de>, - { - crate::Deserializer::from_str(&self.json).deserialize_unit_struct(name, visitor) - } - - fn deserialize_newtype_struct( - self, - name: &'static str, - visitor: V, - ) -> Result - where - V: Visitor<'de>, - { - crate::Deserializer::from_str(&self.json).deserialize_newtype_struct(name, visitor) - } - - fn deserialize_seq(self, visitor: V) -> Result - where - V: Visitor<'de>, - { - crate::Deserializer::from_str(&self.json).deserialize_seq(visitor) - } - - fn deserialize_tuple(self, len: usize, visitor: V) -> Result - where - V: Visitor<'de>, - { - crate::Deserializer::from_str(&self.json).deserialize_tuple(len, visitor) - } - - fn deserialize_tuple_struct( - self, - name: &'static str, - len: usize, - visitor: V, - ) -> Result - where - V: Visitor<'de>, - { - crate::Deserializer::from_str(&self.json).deserialize_tuple_struct(name, len, visitor) - } - - fn deserialize_map(self, visitor: V) -> Result - where - V: Visitor<'de>, - { - crate::Deserializer::from_str(&self.json).deserialize_map(visitor) - } - - fn deserialize_struct( - self, - name: &'static str, - fields: &'static [&'static str], - visitor: V, - ) -> Result - where - V: Visitor<'de>, - { - crate::Deserializer::from_str(&self.json).deserialize_struct(name, fields, visitor) - } - - fn deserialize_enum( - self, - name: &'static str, - variants: &'static [&'static str], - visitor: V, - ) -> Result - where - V: Visitor<'de>, - { - crate::Deserializer::from_str(&self.json).deserialize_enum(name, variants, visitor) - } - - fn deserialize_identifier(self, visitor: V) -> Result - where - V: Visitor<'de>, - { - crate::Deserializer::from_str(&self.json).deserialize_identifier(visitor) - } - - fn deserialize_ignored_any(self, visitor: V) -> Result - where - V: Visitor<'de>, - { - crate::Deserializer::from_str(&self.json).deserialize_ignored_any(visitor) - } -} diff -Nru temporalio-1.3.0/vendor/serde_json/src/read.rs temporalio-1.3.0/vendor/serde_json/src/read.rs --- temporalio-1.3.0/vendor/serde_json/src/read.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/serde_json/src/read.rs 2023-10-30 19:40:00.000000000 +0000 @@ -81,7 +81,7 @@ #[doc(hidden)] fn ignore_str(&mut self) -> Result<()>; - /// Assumes the previous byte was a hex escape sequence ('\u') in a string. + /// Assumes the previous byte was a hex escape sequnce ('\u') in a string. /// Parses next hexadecimal sequence. #[doc(hidden)] fn decode_hex_escape(&mut self) -> Result; diff -Nru temporalio-1.3.0/vendor/serde_json/src/value/from.rs temporalio-1.3.0/vendor/serde_json/src/value/from.rs --- temporalio-1.3.0/vendor/serde_json/src/value/from.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/serde_json/src/value/from.rs 2023-10-30 19:40:00.000000000 +0000 @@ -28,8 +28,7 @@ } impl From for Value { - /// Convert 32-bit floating point number to `Value::Number`, or - /// `Value::Null` if infinite or NaN. + /// Convert 32-bit floating point number to `Value` /// /// # Examples /// @@ -45,8 +44,7 @@ } impl From for Value { - /// Convert 64-bit floating point number to `Value::Number`, or - /// `Value::Null` if infinite or NaN. + /// Convert 64-bit floating point number to `Value` /// /// # Examples /// @@ -62,7 +60,7 @@ } impl From for Value { - /// Convert boolean to `Value::Bool`. + /// Convert boolean to `Value` /// /// # Examples /// @@ -78,7 +76,7 @@ } impl From for Value { - /// Convert `String` to `Value::String`. + /// Convert `String` to `Value` /// /// # Examples /// @@ -93,8 +91,8 @@ } } -impl From<&str> for Value { - /// Convert string slice to `Value::String`. +impl<'a> From<&'a str> for Value { + /// Convert string slice to `Value` /// /// # Examples /// @@ -110,7 +108,7 @@ } impl<'a> From> for Value { - /// Convert copy-on-write string to `Value::String`. + /// Convert copy-on-write string to `Value` /// /// # Examples /// @@ -135,7 +133,7 @@ } impl From for Value { - /// Convert `Number` to `Value::Number`. + /// Convert `Number` to `Value` /// /// # Examples /// @@ -151,7 +149,7 @@ } impl From> for Value { - /// Convert map (with string keys) to `Value::Object`. + /// Convert map (with string keys) to `Value` /// /// # Examples /// @@ -168,7 +166,7 @@ } impl> From> for Value { - /// Convert a `Vec` to `Value::Array`. + /// Convert a `Vec` to `Value` /// /// # Examples /// @@ -183,8 +181,8 @@ } } -impl> From<&[T]> for Value { - /// Convert a slice to `Value::Array`. +impl<'a, T: Clone + Into> From<&'a [T]> for Value { + /// Convert a slice to `Value` /// /// # Examples /// @@ -194,13 +192,13 @@ /// let v: &[&str] = &["lorem", "ipsum", "dolor"]; /// let x: Value = v.into(); /// ``` - fn from(f: &[T]) -> Self { + fn from(f: &'a [T]) -> Self { Value::Array(f.iter().cloned().map(Into::into).collect()) } } impl> FromIterator for Value { - /// Create a `Value::Array` by collecting an iterator of array elements. + /// Convert an iteratable type to a `Value` /// /// # Examples /// @@ -230,7 +228,7 @@ } impl, V: Into> FromIterator<(K, V)> for Value { - /// Create a `Value::Object` by collecting an iterator of key-value pairs. + /// Convert an iteratable type to a `Value` /// /// # Examples /// @@ -250,7 +248,7 @@ } impl From<()> for Value { - /// Convert `()` to `Value::Null`. + /// Convert `()` to `Value` /// /// # Examples /// diff -Nru temporalio-1.3.0/vendor/serde_json/src/value/index.rs temporalio-1.3.0/vendor/serde_json/src/value/index.rs --- temporalio-1.3.0/vendor/serde_json/src/value/index.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/serde_json/src/value/index.rs 2023-10-30 19:40:00.000000000 +0000 @@ -116,7 +116,7 @@ } } -impl Index for &T +impl<'a, T> Index for &'a T where T: ?Sized + Index, { diff -Nru temporalio-1.3.0/vendor/serde_json/src/value/mod.rs temporalio-1.3.0/vendor/serde_json/src/value/mod.rs --- temporalio-1.3.0/vendor/serde_json/src/value/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/serde_json/src/value/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -514,28 +514,6 @@ } } - /// If the `Value` is a Number, returns the associated [`Number`]. Returns - /// None otherwise. - /// - /// ``` - /// # use serde_json::{json, Number}; - /// # - /// let v = json!({ "a": 1, "b": 2.2, "c": -3, "d": "4" }); - /// - /// assert_eq!(v["a"].as_number(), Some(&Number::from(1u64))); - /// assert_eq!(v["b"].as_number(), Some(&Number::from_f64(2.2).unwrap())); - /// assert_eq!(v["c"].as_number(), Some(&Number::from(-3i64))); - /// - /// // The string `"4"` is not a number. - /// assert_eq!(v["d"].as_number(), None); - /// ``` - pub fn as_number(&self) -> Option<&Number> { - match self { - Value::Number(number) => Some(number), - _ => None, - } - } - /// Returns true if the `Value` is an integer between `i64::MIN` and /// `i64::MAX`. /// diff -Nru temporalio-1.3.0/vendor/serde_json/src/value/partial_eq.rs temporalio-1.3.0/vendor/serde_json/src/value/partial_eq.rs --- temporalio-1.3.0/vendor/serde_json/src/value/partial_eq.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/serde_json/src/value/partial_eq.rs 2023-10-30 19:40:00.000000000 +0000 @@ -34,7 +34,7 @@ } } -impl PartialEq<&str> for Value { +impl<'a> PartialEq<&'a str> for Value { fn eq(&self, other: &&str) -> bool { eq_str(self, *other) } @@ -46,7 +46,7 @@ } } -impl PartialEq for &str { +impl<'a> PartialEq for &'a str { fn eq(&self, other: &Value) -> bool { eq_str(other, *self) } diff -Nru temporalio-1.3.0/vendor/serde_json/tests/lexical/parse.rs temporalio-1.3.0/vendor/serde_json/tests/lexical/parse.rs --- temporalio-1.3.0/vendor/serde_json/tests/lexical/parse.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/serde_json/tests/lexical/parse.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,7 +1,7 @@ // Adapted from https://github.com/Alexhuszagh/rust-lexical. use crate::lexical::num::Float; -use crate::lexical::{parse_concise_float, parse_truncated_float}; +use crate::lexical::parse::{parse_concise_float, parse_truncated_float}; use core::f64; use core::fmt::Debug; diff -Nru temporalio-1.3.0/vendor/serde_json/tests/lexical.rs temporalio-1.3.0/vendor/serde_json/tests/lexical.rs --- temporalio-1.3.0/vendor/serde_json/tests/lexical.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/serde_json/tests/lexical.rs 2023-10-30 19:40:00.000000000 +0000 @@ -26,6 +26,11 @@ #[path = "../src/lexical/mod.rs"] mod lexical; +mod lib { + pub use std::vec::Vec; + pub use std::{cmp, iter, mem, ops}; +} + #[path = "lexical/algorithm.rs"] mod algorithm; diff -Nru temporalio-1.3.0/vendor/serde_json/tests/map.rs temporalio-1.3.0/vendor/serde_json/tests/map.rs --- temporalio-1.3.0/vendor/serde_json/tests/map.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/serde_json/tests/map.rs 2023-10-30 19:40:00.000000000 +0000 @@ -35,6 +35,7 @@ assert!(val.is_empty()); } +#[cfg(not(no_btreemap_retain))] #[test] fn test_retain() { let mut v: Value = from_str(r#"{"b":null,"a":null,"c":null}"#).unwrap(); diff -Nru temporalio-1.3.0/vendor/serde_json/tests/test.rs temporalio-1.3.0/vendor/serde_json/tests/test.rs --- temporalio-1.3.0/vendor/serde_json/tests/test.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/serde_json/tests/test.rs 2023-10-30 19:40:00.000000000 +0000 @@ -160,29 +160,17 @@ #[test] fn test_encode_nonfinite_float_yields_null() { - let v = to_value(::std::f64::NAN.copysign(1.0)).unwrap(); - assert!(v.is_null()); - - let v = to_value(::std::f64::NAN.copysign(-1.0)).unwrap(); + let v = to_value(::std::f64::NAN).unwrap(); assert!(v.is_null()); let v = to_value(::std::f64::INFINITY).unwrap(); assert!(v.is_null()); - let v = to_value(-::std::f64::INFINITY).unwrap(); - assert!(v.is_null()); - - let v = to_value(::std::f32::NAN.copysign(1.0)).unwrap(); - assert!(v.is_null()); - - let v = to_value(::std::f32::NAN.copysign(-1.0)).unwrap(); + let v = to_value(::std::f32::NAN).unwrap(); assert!(v.is_null()); let v = to_value(::std::f32::INFINITY).unwrap(); assert!(v.is_null()); - - let v = to_value(-::std::f32::INFINITY).unwrap(); - assert!(v.is_null()); } #[test] diff -Nru temporalio-1.3.0/vendor/sha1/.cargo-checksum.json temporalio-1.3.0/vendor/sha1/.cargo-checksum.json --- temporalio-1.3.0/vendor/sha1/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/sha1/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"CHANGELOG.md":"7e9245847760fa99eaab7e4864a199148387aaa6121ac3dfbe189f0b684cf7d2","Cargo.toml":"cbfdd2dcaf34776f686caf30420c0a32a13d032fdd62495a054e65c3b0769132","LICENSE-APACHE":"a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5","LICENSE-MIT":"b4eb00df6e2a4d22518fcaa6a2b4646f249b3a3c9814509b22bd2091f1392ff1","README.md":"8028a4064be59cba366c1bafa682002b52891a3cc2d2169d8f38064ba69773d1","benches/mod.rs":"2765aec429270711235d6cd4911d0c21658e2fa3dfbe24559f24e21b056b507c","src/compress.rs":"fcd99dc9c137e1fc05e47d406adfeeafccb31bed981e7c8bf480d765fb36e877","src/compress/aarch64.rs":"b1e66c2df53eaf84ccf7466aed47c0718fc3dbe1d1c565b65abd60e84b6fc5d4","src/compress/loongarch64_asm.rs":"0fd7d61b5ca7d7bce40cd9ce9012eb787da9f9df87595bfe00f8d882267d182e","src/compress/soft.rs":"bc6dda22b15acd76d97e202a8b251d9c68441d426a71600b2a61c36dd6f3a08e","src/compress/x86.rs":"9d2b4f240a311a84b351c136cccdc4dc00a7fc35703146ad51ed2d6e0aaef2d0","src/lib.rs":"c3409d489833cf896d611baf0ca0e5958629fc9e5f91a1144e789dc1858c513c","tests/data/sha1.blb":"b9c03b9e56e0a7b08a6d6867599a33cab1a55aec3f41fef910c133fc35dc2851","tests/mod.rs":"34bb42bf4679b3f23ffc2338356c8579c872026eef9989955a29ba44a432c3b5"},"package":"e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba"} \ No newline at end of file +{"files":{"CHANGELOG.md":"f3930b8a16e5173aca294672a3f83d44949160073cb7b20ed8eadc475f602b13","Cargo.toml":"03465b24b6574f22f50d0f1f4d7c972dd1098c50c457bda1035e9a7b9fa5bccd","LICENSE-APACHE":"a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5","LICENSE-MIT":"b4eb00df6e2a4d22518fcaa6a2b4646f249b3a3c9814509b22bd2091f1392ff1","README.md":"e3e967137d854fef6c4a8c9d018c93bf35640a325a825b6a404dd3183219206c","benches/mod.rs":"2765aec429270711235d6cd4911d0c21658e2fa3dfbe24559f24e21b056b507c","src/compress.rs":"3e401e6a4ac3699994cedf34ff66d12a828bbef3457e8e751a3147a03a70607e","src/compress/aarch64.rs":"b1e66c2df53eaf84ccf7466aed47c0718fc3dbe1d1c565b65abd60e84b6fc5d4","src/compress/soft.rs":"bc6dda22b15acd76d97e202a8b251d9c68441d426a71600b2a61c36dd6f3a08e","src/compress/x86.rs":"9d2b4f240a311a84b351c136cccdc4dc00a7fc35703146ad51ed2d6e0aaef2d0","src/lib.rs":"dea41278ae1d72c64925a1b417d343068edf0c92e87b9f2350f31d78ef1ef7cd","tests/data/sha1.blb":"b9c03b9e56e0a7b08a6d6867599a33cab1a55aec3f41fef910c133fc35dc2851","tests/mod.rs":"34bb42bf4679b3f23ffc2338356c8579c872026eef9989955a29ba44a432c3b5"},"package":"f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/sha1/Cargo.toml temporalio-1.3.0/vendor/sha1/Cargo.toml --- temporalio-1.3.0/vendor/sha1/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/sha1/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -3,48 +3,35 @@ # 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. +# 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. +# If you believe there's an error in this file please file an +# issue against the rust-lang/cargo repository. If you're +# editing this file be aware that the upstream Cargo.toml +# will likely look very different (and much more reasonable) [package] edition = "2018" name = "sha1" -version = "0.10.6" +version = "0.10.5" authors = ["RustCrypto Developers"] description = "SHA-1 hash function" documentation = "https://docs.rs/sha1" readme = "README.md" -keywords = [ - "crypto", - "sha1", - "hash", - "digest", -] -categories = [ - "cryptography", - "no-std", -] +keywords = ["crypto", "sha1", "hash", "digest"] +categories = ["cryptography", "no-std"] license = "MIT OR Apache-2.0" repository = "https://github.com/RustCrypto/hashes" - [package.metadata.docs.rs] all-features = true -rustdoc-args = [ - "--cfg", - "docsrs", -] - +rustdoc-args = ["--cfg", "docsrs"] [dependencies.cfg-if] version = "1.0" [dependencies.digest] -version = "0.10.7" - +version = "0.10.4" [dev-dependencies.digest] -version = "0.10.7" +version = "0.10.4" features = ["dev"] [dev-dependencies.hex-literal] @@ -55,10 +42,8 @@ compress = [] default = ["std"] force-soft = [] -loongarch64_asm = [] oid = ["digest/oid"] std = ["digest/std"] - [target."cfg(any(target_arch = \"aarch64\", target_arch = \"x86\", target_arch = \"x86_64\"))".dependencies.cpufeatures] version = "0.2" diff -Nru temporalio-1.3.0/vendor/sha1/CHANGELOG.md temporalio-1.3.0/vendor/sha1/CHANGELOG.md --- temporalio-1.3.0/vendor/sha1/CHANGELOG.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/sha1/CHANGELOG.md 2023-10-30 19:40:00.000000000 +0000 @@ -5,12 +5,6 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## 0.10.6 (2023-09-21) -### Added -- `asm!`-based backend for LoongArch64 targets gated behind `loongarch64_asm` feature [#504] - -[#504]: https://github.com/RustCrypto/hashes/pull/504 - ## 0.10.5 (2022-09-16) ### Added - Feature-gated OID support ([#405]) diff -Nru temporalio-1.3.0/vendor/sha1/README.md temporalio-1.3.0/vendor/sha1/README.md --- temporalio-1.3.0/vendor/sha1/README.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/sha1/README.md 2023-10-30 19:40:00.000000000 +0000 @@ -48,10 +48,10 @@ [//]: # (badges) -[crate-image]: https://img.shields.io/crates/v/sha1.svg -[crate-link]: https://crates.io/crates/sha1 -[docs-image]: https://docs.rs/sha1/badge.svg -[docs-link]: https://docs.rs/sha1/ +[crate-image]: https://img.shields.io/crates/v/sha-1.svg +[crate-link]: https://crates.io/crates/sha-1 +[docs-image]: https://docs.rs/sha-1/badge.svg +[docs-link]: https://docs.rs/sha-1/ [license-image]: https://img.shields.io/badge/license-Apache2.0/MIT-blue.svg [rustc-image]: https://img.shields.io/badge/rustc-1.41+-blue.svg [chat-image]: https://img.shields.io/badge/zulip-join_chat-blue.svg diff -Nru temporalio-1.3.0/vendor/sha1/src/compress/loongarch64_asm.rs temporalio-1.3.0/vendor/sha1/src/compress/loongarch64_asm.rs --- temporalio-1.3.0/vendor/sha1/src/compress/loongarch64_asm.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/sha1/src/compress/loongarch64_asm.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,255 +0,0 @@ -//! LoongArch64 assembly backend - -use core::arch::asm; - -const K: [u32; 4] = [0x5A827999, 0x6ED9EBA1, 0x8F1BBCDC, 0xCA62C1D6]; - -macro_rules! c { - ($($l:expr)*) => { - concat!($($l ,)*) - }; -} - -macro_rules! round0a { - ($a:literal, $b:literal, $c:literal, $d:literal, $e:literal, $i:literal) => { - c!( - "ld.w $t5, $a1, (" $i " * 4);" - "revb.2h $t5, $t5;" - "rotri.w $t5, $t5, 16;" - "add.w " $e ", " $e ", $t5;" - "st.w $t5, $sp, (" $i " * 4);" - "xor $t5, " $c "," $d ";" - "and $t5, $t5, " $b ";" - "xor $t5, $t5, " $d ";" - roundtail!($a, $b, $e, $i, "$a4") - ) - }; -} - -macro_rules! scheldule { - ($i:literal, $e:literal) => { - c!( - "ld.w $t5, $sp, (((" $i " - 3) & 0xF) * 4);" - "ld.w $t6, $sp, (((" $i " - 8) & 0xF) * 4);" - "ld.w $t7, $sp, (((" $i " - 14) & 0xF) * 4);" - "ld.w $t8, $sp, (((" $i " - 16) & 0xF) * 4);" - "xor $t5, $t5, $t6;" - "xor $t5, $t5, $t7;" - "xor $t5, $t5, $t8;" - "rotri.w $t5, $t5, 31;" - "add.w " $e "," $e ", $t5;" - "st.w $t5, $sp, ((" $i " & 0xF) * 4);" - ) - }; -} - -macro_rules! round0b { - ($a:literal, $b:literal, $c:literal, $d:literal, $e:literal, $i:literal) => { - c!( - scheldule!($i, $e) - "xor $t5," $c "," $d ";" - "and $t5, $t5," $b ";" - "xor $t5, $t5," $d ";" - roundtail!($a, $b, $e, $i, "$a4") - ) - }; -} - -macro_rules! round1 { - ($a:literal, $b:literal, $c:literal, $d:literal, $e:literal, $i:literal) => { - c!( - scheldule!($i, $e) - "xor $t5," $b "," $c ";" - "xor $t5, $t5," $d ";" - roundtail!($a, $b, $e, $i, "$a5") - ) - }; -} - -macro_rules! round2 { - ($a:literal, $b:literal, $c:literal, $d:literal, $e:literal, $i:literal) => { - c!( - scheldule!($i, $e) - "or $t5," $c "," $d ";" - "and $t5, $t5, " $b ";" - "and $t7," $c "," $d ";" - "or $t5, $t5, $t7;" - roundtail!($a, $b, $e, $i, "$a6") - ) - }; -} - -macro_rules! round3 { - ($a:literal, $b:literal, $c:literal, $d:literal, $e:literal, $i:literal) => { - c!( - scheldule!($i, $e) - "xor $t5," $b "," $c ";" - "xor $t5, $t5," $d ";" - roundtail!($a, $b, $e, $i, "$a7") - ) - }; -} - -macro_rules! roundtail { - ($a:literal, $b:literal, $e:literal, $i:literal, $k:literal) => { - c!( - "rotri.w " $b "," $b ", 2;" - "add.w " $e "," $e ", $t5;" - "add.w " $e "," $e "," $k ";" - "rotri.w $t5," $a ", 27;" - "add.w " $e "," $e ", $t5;" - ) - }; -} - -pub fn compress(state: &mut [u32; 5], blocks: &[[u8; 64]]) { - if blocks.is_empty() { - return; - } - - unsafe { - asm!( - // Allocate scratch stack space - "addi.d $sp, $sp, -64;", - - // Load state - "ld.w $t0, $a0, 0", - "ld.w $t1, $a0, 4", - "ld.w $t2, $a0, 8", - "ld.w $t3, $a0, 12", - "ld.w $t4, $a0, 16", - - "42:", - - round0a!("$t0", "$t1", "$t2", "$t3", "$t4", 0), - round0a!("$t4", "$t0", "$t1", "$t2", "$t3", 1), - round0a!("$t3", "$t4", "$t0", "$t1", "$t2", 2), - round0a!("$t2", "$t3", "$t4", "$t0", "$t1", 3), - round0a!("$t1", "$t2", "$t3", "$t4", "$t0", 4), - round0a!("$t0", "$t1", "$t2", "$t3", "$t4", 5), - round0a!("$t4", "$t0", "$t1", "$t2", "$t3", 6), - round0a!("$t3", "$t4", "$t0", "$t1", "$t2", 7), - round0a!("$t2", "$t3", "$t4", "$t0", "$t1", 8), - round0a!("$t1", "$t2", "$t3", "$t4", "$t0", 9), - round0a!("$t0", "$t1", "$t2", "$t3", "$t4", 10), - round0a!("$t4", "$t0", "$t1", "$t2", "$t3", 11), - round0a!("$t3", "$t4", "$t0", "$t1", "$t2", 12), - round0a!("$t2", "$t3", "$t4", "$t0", "$t1", 13), - round0a!("$t1", "$t2", "$t3", "$t4", "$t0", 14), - round0a!("$t0", "$t1", "$t2", "$t3", "$t4", 15), - round0b!("$t4", "$t0", "$t1", "$t2", "$t3", 16), - round0b!("$t3", "$t4", "$t0", "$t1", "$t2", 17), - round0b!("$t2", "$t3", "$t4", "$t0", "$t1", 18), - round0b!("$t1", "$t2", "$t3", "$t4", "$t0", 19), - round1!("$t0", "$t1", "$t2", "$t3", "$t4", 20), - round1!("$t4", "$t0", "$t1", "$t2", "$t3", 21), - round1!("$t3", "$t4", "$t0", "$t1", "$t2", 22), - round1!("$t2", "$t3", "$t4", "$t0", "$t1", 23), - round1!("$t1", "$t2", "$t3", "$t4", "$t0", 24), - round1!("$t0", "$t1", "$t2", "$t3", "$t4", 25), - round1!("$t4", "$t0", "$t1", "$t2", "$t3", 26), - round1!("$t3", "$t4", "$t0", "$t1", "$t2", 27), - round1!("$t2", "$t3", "$t4", "$t0", "$t1", 28), - round1!("$t1", "$t2", "$t3", "$t4", "$t0", 29), - round1!("$t0", "$t1", "$t2", "$t3", "$t4", 30), - round1!("$t4", "$t0", "$t1", "$t2", "$t3", 31), - round1!("$t3", "$t4", "$t0", "$t1", "$t2", 32), - round1!("$t2", "$t3", "$t4", "$t0", "$t1", 33), - round1!("$t1", "$t2", "$t3", "$t4", "$t0", 34), - round1!("$t0", "$t1", "$t2", "$t3", "$t4", 35), - round1!("$t4", "$t0", "$t1", "$t2", "$t3", 36), - round1!("$t3", "$t4", "$t0", "$t1", "$t2", 37), - round1!("$t2", "$t3", "$t4", "$t0", "$t1", 38), - round1!("$t1", "$t2", "$t3", "$t4", "$t0", 39), - round2!("$t0", "$t1", "$t2", "$t3", "$t4", 40), - round2!("$t4", "$t0", "$t1", "$t2", "$t3", 41), - round2!("$t3", "$t4", "$t0", "$t1", "$t2", 42), - round2!("$t2", "$t3", "$t4", "$t0", "$t1", 43), - round2!("$t1", "$t2", "$t3", "$t4", "$t0", 44), - round2!("$t0", "$t1", "$t2", "$t3", "$t4", 45), - round2!("$t4", "$t0", "$t1", "$t2", "$t3", 46), - round2!("$t3", "$t4", "$t0", "$t1", "$t2", 47), - round2!("$t2", "$t3", "$t4", "$t0", "$t1", 48), - round2!("$t1", "$t2", "$t3", "$t4", "$t0", 49), - round2!("$t0", "$t1", "$t2", "$t3", "$t4", 50), - round2!("$t4", "$t0", "$t1", "$t2", "$t3", 51), - round2!("$t3", "$t4", "$t0", "$t1", "$t2", 52), - round2!("$t2", "$t3", "$t4", "$t0", "$t1", 53), - round2!("$t1", "$t2", "$t3", "$t4", "$t0", 54), - round2!("$t0", "$t1", "$t2", "$t3", "$t4", 55), - round2!("$t4", "$t0", "$t1", "$t2", "$t3", 56), - round2!("$t3", "$t4", "$t0", "$t1", "$t2", 57), - round2!("$t2", "$t3", "$t4", "$t0", "$t1", 58), - round2!("$t1", "$t2", "$t3", "$t4", "$t0", 59), - round3!("$t0", "$t1", "$t2", "$t3", "$t4", 60), - round3!("$t4", "$t0", "$t1", "$t2", "$t3", 61), - round3!("$t3", "$t4", "$t0", "$t1", "$t2", 62), - round3!("$t2", "$t3", "$t4", "$t0", "$t1", 63), - round3!("$t1", "$t2", "$t3", "$t4", "$t0", 64), - round3!("$t0", "$t1", "$t2", "$t3", "$t4", 65), - round3!("$t4", "$t0", "$t1", "$t2", "$t3", 66), - round3!("$t3", "$t4", "$t0", "$t1", "$t2", 67), - round3!("$t2", "$t3", "$t4", "$t0", "$t1", 68), - round3!("$t1", "$t2", "$t3", "$t4", "$t0", 69), - round3!("$t0", "$t1", "$t2", "$t3", "$t4", 70), - round3!("$t4", "$t0", "$t1", "$t2", "$t3", 71), - round3!("$t3", "$t4", "$t0", "$t1", "$t2", 72), - round3!("$t2", "$t3", "$t4", "$t0", "$t1", 73), - round3!("$t1", "$t2", "$t3", "$t4", "$t0", 74), - round3!("$t0", "$t1", "$t2", "$t3", "$t4", 75), - round3!("$t4", "$t0", "$t1", "$t2", "$t3", 76), - round3!("$t3", "$t4", "$t0", "$t1", "$t2", 77), - round3!("$t2", "$t3", "$t4", "$t0", "$t1", 78), - round3!("$t1", "$t2", "$t3", "$t4", "$t0", 79), - - // Update state registers - "ld.w $t5, $a0, 0", // a - "ld.w $t6, $a0, 4", // b - "ld.w $t7, $a0, 8", // c - "ld.w $t8, $a0, 12", // d - "add.w $t0, $t0, $t5", - "ld.w $t5, $a0, 16", // e - "add.w $t1, $t1, $t6", - "add.w $t2, $t2, $t7", - "add.w $t3, $t3, $t8", - "add.w $t4, $t4, $t5", - - // Save updated state - "st.w $t0, $a0, 0", - "st.w $t1, $a0, 4", - "st.w $t2, $a0, 8", - "st.w $t3, $a0, 12", - "st.w $t4, $a0, 16", - - // Looping over blocks - "addi.d $a1, $a1, 64", - "addi.d $a2, $a2, -1", - "bnez $a2, 42b", - - // Restore stack register - "addi.d $sp, $sp, 64", - - in("$a0") state, - inout("$a1") blocks.as_ptr() => _, - inout("$a2") blocks.len() => _, - - in("$a4") K[0], - in("$a5") K[1], - in("$a6") K[2], - in("$a7") K[3], - - // Clobbers - out("$t0") _, - out("$t1") _, - out("$t2") _, - out("$t3") _, - out("$t4") _, - out("$t5") _, - out("$t6") _, - out("$t7") _, - out("$t8") _, - - options(preserves_flags), - ); - } -} diff -Nru temporalio-1.3.0/vendor/sha1/src/compress.rs temporalio-1.3.0/vendor/sha1/src/compress.rs --- temporalio-1.3.0/vendor/sha1/src/compress.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/sha1/src/compress.rs 2023-10-30 19:40:00.000000000 +0000 @@ -9,9 +9,6 @@ mod soft; mod aarch64; use aarch64::compress as compress_inner; - } else if #[cfg(all(feature = "loongarch64_asm", target_arch = "loongarch64"))] { - mod loongarch64_asm; - use loongarch64_asm::compress as compress_inner; } else if #[cfg(any(target_arch = "x86", target_arch = "x86_64"))] { #[cfg(not(feature = "asm"))] mod soft; diff -Nru temporalio-1.3.0/vendor/sha1/src/lib.rs temporalio-1.3.0/vendor/sha1/src/lib.rs --- temporalio-1.3.0/vendor/sha1/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/sha1/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -33,12 +33,12 @@ //! //! This crate has been transferred to the RustCrypto organization and uses //! implementation previously published as the `sha-1` crate. The previous -//! zero dependencies version is now published as the [`sha1_smol`] crate. +//! zero dependencies version is now published as the [`sha1_smoll`] crate. //! //! [1]: https://en.wikipedia.org/wiki/SHA-1 //! [2]: https://sha-mbles.github.io/ //! [3]: https://github.com/RustCrypto/hashes -//! [`sha1_smol`]: https://github.com/mitsuhiko/sha1-smol/ +//! [`sha1_smoll`]: https://github.com/mitsuhiko/sha1-smol/ #![no_std] #![cfg_attr(docsrs, feature(doc_cfg))] diff -Nru temporalio-1.3.0/vendor/sha2/.cargo-checksum.json temporalio-1.3.0/vendor/sha2/.cargo-checksum.json --- temporalio-1.3.0/vendor/sha2/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/sha2/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"CHANGELOG.md":"b7b0a14409ac2880f86fe50d9584acc81f2346ebcb4e46a9e2235b54ac5b02ef","Cargo.toml":"5fdf94b86fc47d105d2f2cc55c6346d15e7f3d2d7ea92031b1ce2d24276e7778","LICENSE-APACHE":"a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5","LICENSE-MIT":"b4eb00df6e2a4d22518fcaa6a2b4646f249b3a3c9814509b22bd2091f1392ff1","README.md":"b7af562922e4a631657acf264772d2af2b72a08d9bbc5fbcf56d9324f9027708","benches/mod.rs":"c32d9f91a541821ea988c14eee710963e623ef1edf69b02b41a29bc44e04ba95","src/consts.rs":"2f820349fa7cbf9fecc1d4aabbd1a721bb1badc3f32ef9e903826960b6f42523","src/core_api.rs":"73b160d98bfa6737688875ad73da5e3c2c93582604dc313d208200e12fdab676","src/lib.rs":"9d0ec0ba86a801bd9b2024f0b84ee322a26c7376a623dd61210e0eb9d6355aa1","src/sha256.rs":"78e84eea5d517554aa5a10860bf2ce5013ca26d529e78643cd59062546e0746f","src/sha256/aarch64.rs":"18121a25867a575fec8ef64da763693ece4e3e3e84da095254b8471234c6f1f8","src/sha256/loongarch64_asm.rs":"79e2d5e3c039581e2319f8789de9ed13a8dd819ebffd13532dbd83448c7ad662","src/sha256/soft.rs":"98e765a8e8dfa0af31f2b76570f212e6b3099522bf300e1554cbbd9fd5d02960","src/sha256/x86.rs":"70f1597f2029522b35bfd026df0a8908f086523ab2a80ba3ef35e6231b56353c","src/sha512.rs":"1b19c23c63e9cfca8b42fd9e108a8570dd03e22a37d4d6f499f2fa5e566cb2de","src/sha512/aarch64.rs":"2ed929329a0fa66180e4726d028713a49f99cc223e635078fc1f3252a44981e0","src/sha512/loongarch64_asm.rs":"58a7b54d95a0e037ba80570d96ffe0dd7c0014c7fcb45b90725e522cc4992d8a","src/sha512/soft.rs":"0183ad89418b886859d2afa9bf061bc92759ae337c1d26147b4300042e63ef42","src/sha512/x86.rs":"c7dd8bdf3212e1e8c4cc9cc6b380dc0468f79dcfd0f61a445d0d38cead45a03a","tests/data/sha224.blb":"59b185972521af418fd49a079de3d5f5bed74cd76d80473da51cab3faee6c7d0","tests/data/sha256.blb":"bb096934bb7e43e41ce143d211397afca6fcdfe243a39811688ea31aae6f800a","tests/data/sha384.blb":"e8fe66c07ba336fae2c0aa4c87cb768f41bd4ed318ee1a36fbde0a68581946ec","tests/data/sha512.blb":"1cc0e86571f2f4e3bc81438ce7b6c25c118d2d7437355240113f59cbb782c8d6","tests/data/sha512_224.blb":"b02dd46741db1034112e0888d0cdb233a21b9a82c319456f806bbaae49acf440","tests/data/sha512_256.blb":"95195b758e362d92ff0cebebac4cca696512ea5811b635243bc70e29164e5786","tests/mod.rs":"61be596fd9b45a8db345950ff2ed6f87eaf4d239ac156885f36e819da0597644"},"package":"793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8"} \ No newline at end of file +{"files":{"CHANGELOG.md":"61b6ae2d035d98d2b5612a5c1c40238f4fa7e7bb3062daacf677abb4f7c60eab","Cargo.toml":"7d0b0694d8fd9d50c060a871ae98f80f392473086ec0723aa2017081c8654dce","LICENSE-APACHE":"a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5","LICENSE-MIT":"b4eb00df6e2a4d22518fcaa6a2b4646f249b3a3c9814509b22bd2091f1392ff1","README.md":"b7af562922e4a631657acf264772d2af2b72a08d9bbc5fbcf56d9324f9027708","benches/mod.rs":"c32d9f91a541821ea988c14eee710963e623ef1edf69b02b41a29bc44e04ba95","src/consts.rs":"2f820349fa7cbf9fecc1d4aabbd1a721bb1badc3f32ef9e903826960b6f42523","src/core_api.rs":"73b160d98bfa6737688875ad73da5e3c2c93582604dc313d208200e12fdab676","src/lib.rs":"9d0ec0ba86a801bd9b2024f0b84ee322a26c7376a623dd61210e0eb9d6355aa1","src/sha256.rs":"cfc2b62a412112e471781a770793f0ba0466594b2e37001334562f3d95f340ce","src/sha256/aarch64.rs":"18121a25867a575fec8ef64da763693ece4e3e3e84da095254b8471234c6f1f8","src/sha256/soft.rs":"98e765a8e8dfa0af31f2b76570f212e6b3099522bf300e1554cbbd9fd5d02960","src/sha256/x86.rs":"70f1597f2029522b35bfd026df0a8908f086523ab2a80ba3ef35e6231b56353c","src/sha512.rs":"b0c94cf6e1a4a8efb8ccc494da96fdf805b1745fef7614875df5b4db9ee186da","src/sha512/aarch64.rs":"2ed929329a0fa66180e4726d028713a49f99cc223e635078fc1f3252a44981e0","src/sha512/soft.rs":"0183ad89418b886859d2afa9bf061bc92759ae337c1d26147b4300042e63ef42","src/sha512/x86.rs":"c7dd8bdf3212e1e8c4cc9cc6b380dc0468f79dcfd0f61a445d0d38cead45a03a","tests/data/sha224.blb":"59b185972521af418fd49a079de3d5f5bed74cd76d80473da51cab3faee6c7d0","tests/data/sha256.blb":"bb096934bb7e43e41ce143d211397afca6fcdfe243a39811688ea31aae6f800a","tests/data/sha384.blb":"e8fe66c07ba336fae2c0aa4c87cb768f41bd4ed318ee1a36fbde0a68581946ec","tests/data/sha512.blb":"1cc0e86571f2f4e3bc81438ce7b6c25c118d2d7437355240113f59cbb782c8d6","tests/data/sha512_224.blb":"b02dd46741db1034112e0888d0cdb233a21b9a82c319456f806bbaae49acf440","tests/data/sha512_256.blb":"95195b758e362d92ff0cebebac4cca696512ea5811b635243bc70e29164e5786","tests/mod.rs":"61be596fd9b45a8db345950ff2ed6f87eaf4d239ac156885f36e819da0597644"},"package":"479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/sha2/Cargo.toml temporalio-1.3.0/vendor/sha2/Cargo.toml --- temporalio-1.3.0/vendor/sha2/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/sha2/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -12,7 +12,7 @@ [package] edition = "2018" name = "sha2" -version = "0.10.8" +version = "0.10.7" authors = ["RustCrypto Developers"] description = """ Pure Rust implementation of the SHA-2 hash function family @@ -59,7 +59,6 @@ compress = [] default = ["std"] force-soft = [] -loongarch64_asm = [] oid = ["digest/oid"] std = ["digest/std"] diff -Nru temporalio-1.3.0/vendor/sha2/CHANGELOG.md temporalio-1.3.0/vendor/sha2/CHANGELOG.md --- temporalio-1.3.0/vendor/sha2/CHANGELOG.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/sha2/CHANGELOG.md 2023-10-30 19:40:00.000000000 +0000 @@ -5,12 +5,6 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## 0.10.8 (2023-09-26) -### Added -- `asm!`-based backend for LoongArch64 targets gated behind `loongarch64_asm` feature [#507] - -[#507]: https://github.com/RustCrypto/hashes/pull/507 - ## 0.10.7 (2023-06-15) ### Added - AArch64 Neon-based backend ([#490]) diff -Nru temporalio-1.3.0/vendor/sha2/src/sha256/loongarch64_asm.rs temporalio-1.3.0/vendor/sha2/src/sha256/loongarch64_asm.rs --- temporalio-1.3.0/vendor/sha2/src/sha256/loongarch64_asm.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/sha2/src/sha256/loongarch64_asm.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,227 +0,0 @@ -//! LoongArch64 assembly backend - -macro_rules! c { - ($($l:expr)*) => { - concat!($($l ,)*) - }; -} - -macro_rules! rounda { - ($i:literal, $a:literal, $b:literal, $c:literal, $d:literal, $e:literal, $f:literal, $g:literal, $h:literal) => { - c!( - "ld.w $a5, $a1, (" $i " * 4);" - "revb.2h $a5, $a5;" - "rotri.w $a5, $a5, 16;" - roundtail!($i, $a, $b, $c, $d, $e, $f, $g, $h) - ) - }; -} - -macro_rules! roundb { - ($i:literal, $a:literal, $b:literal, $c:literal, $d:literal, $e:literal, $f:literal, $g:literal, $h:literal) => { - c!( - "ld.w $a4, $sp, (((" $i " - 15) & 0xF) * 4);" - "ld.w $a5, $sp, (((" $i " - 16) & 0xF) * 4);" - "ld.w $a6, $sp, (((" $i " - 7) & 0xF) * 4);" - "add.w $a5, $a5, $a6;" - "rotri.w $a6, $a4, 18;" - "srli.w $a7, $a4, 3;" - "rotri.w $a4, $a4, 7;" - "xor $a6, $a6, $a7;" - "xor $a4, $a4, $a6;" - "add.w $a5, $a5, $a4;" - "ld.w $a4, $sp, (((" $i " - 2) & 0xF) * 4);" - "rotri.w $a6, $a4, 19;" - "srli.w $a7, $a4, 10;" - "rotri.w $a4, $a4, 17;" - "xor $a6, $a6, $a7;" - "xor $a4, $a4, $a6;" - "add.w $a5, $a5, $a4;" - roundtail!($i, $a, $b, $c, $d, $e, $f, $g, $h) - ) - }; -} - -macro_rules! roundtail { - ($i:literal, $a:literal, $b:literal, $c:literal, $d:literal, $e:literal, $f:literal, $g:literal, $h:literal) => { - c!( - // Part 0 - "rotri.w $a6, " $e ", 11;" - "rotri.w $a7, " $e ", 25;" - "rotri.w $a4, " $e ", 6;" - "xor $a6, $a6, $a7;" - "xor $a4, $a4, $a6;" - "xor $a6, " $g ", " $f ";" - "ld.w $a7, $a3, " $i " * 4;" - "and $a6, $a6, " $e ";" - "xor $a6, $a6, " $g ";" - "add.w $a4, $a4, $a6;" - "add.w $a4, $a4, $a7;" - "add.w " $h ", " $h ", $a5;" - "add.w " $h ", " $h ", $a4;" - // Part 1 - "add.w " $d ", " $d ", " $h ";" - // Part 2 - "rotri.w $a6, " $a ", 13;" - "rotri.w $a7, " $a ", 22;" - "rotri.w $a4, " $a ", 2;" - "xor $a6, $a6, $a7;" - "xor $a4, $a4, $a6;" - "add.w " $h ", " $h ", $a4;" - "or $a4, " $c ", " $b ";" - "and $a6, " $c ", " $b ";" - "and $a4, $a4, " $a ";" - "or $a4, $a4, $a6;" - "add.w " $h ", " $h ", $a4;" - "st.w $a5, $sp, ((" $i " & 0xF) * 4);" - ) - }; -} - -pub fn compress(state: &mut [u32; 8], blocks: &[[u8; 64]]) { - if blocks.is_empty() { - return; - } - - unsafe { - core::arch::asm!( - // Allocate scratch stack space - "addi.d $sp, $sp, -64;", - - // Load state - "ld.w $t0, $a0, 0", - "ld.w $t1, $a0, 4", - "ld.w $t2, $a0, 8", - "ld.w $t3, $a0, 12", - "ld.w $t4, $a0, 16", - "ld.w $t5, $a0, 20", - "ld.w $t6, $a0, 24", - "ld.w $t7, $a0, 28", - - "42:", - - // Do 64 rounds of hashing - rounda!( 0, "$t0" , "$t1" , "$t2", "$t3", "$t4", "$t5", "$t6", "$t7"), - rounda!( 1, "$t7", "$t0" , "$t1" , "$t2", "$t3", "$t4", "$t5", "$t6"), - rounda!( 2, "$t6", "$t7", "$t0" , "$t1" , "$t2", "$t3", "$t4", "$t5"), - rounda!( 3, "$t5", "$t6", "$t7", "$t0" , "$t1" , "$t2", "$t3", "$t4"), - rounda!( 4, "$t4", "$t5", "$t6", "$t7", "$t0" , "$t1" , "$t2", "$t3"), - rounda!( 5, "$t3", "$t4", "$t5", "$t6", "$t7", "$t0" , "$t1" , "$t2"), - rounda!( 6, "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t0" , "$t1"), - rounda!( 7, "$t1" , "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t0"), - rounda!( 8, "$t0" , "$t1" , "$t2", "$t3", "$t4", "$t5", "$t6", "$t7"), - rounda!( 9, "$t7", "$t0" , "$t1" , "$t2", "$t3", "$t4", "$t5", "$t6"), - rounda!(10, "$t6", "$t7", "$t0" , "$t1" , "$t2", "$t3", "$t4", "$t5"), - rounda!(11, "$t5", "$t6", "$t7", "$t0" , "$t1" , "$t2", "$t3", "$t4"), - rounda!(12, "$t4", "$t5", "$t6", "$t7", "$t0" , "$t1" , "$t2", "$t3"), - rounda!(13, "$t3", "$t4", "$t5", "$t6", "$t7", "$t0" , "$t1" , "$t2"), - rounda!(14, "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t0" , "$t1"), - rounda!(15, "$t1" , "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t0"), - roundb!(16, "$t0" , "$t1" , "$t2", "$t3", "$t4", "$t5", "$t6", "$t7"), - roundb!(17, "$t7", "$t0" , "$t1" , "$t2", "$t3", "$t4", "$t5", "$t6"), - roundb!(18, "$t6", "$t7", "$t0" , "$t1" , "$t2", "$t3", "$t4", "$t5"), - roundb!(19, "$t5", "$t6", "$t7", "$t0" , "$t1" , "$t2", "$t3", "$t4"), - roundb!(20, "$t4", "$t5", "$t6", "$t7", "$t0" , "$t1" , "$t2", "$t3"), - roundb!(21, "$t3", "$t4", "$t5", "$t6", "$t7", "$t0" , "$t1" , "$t2"), - roundb!(22, "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t0" , "$t1"), - roundb!(23, "$t1" , "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t0"), - roundb!(24, "$t0" , "$t1" , "$t2", "$t3", "$t4", "$t5", "$t6", "$t7"), - roundb!(25, "$t7", "$t0" , "$t1" , "$t2", "$t3", "$t4", "$t5", "$t6"), - roundb!(26, "$t6", "$t7", "$t0" , "$t1" , "$t2", "$t3", "$t4", "$t5"), - roundb!(27, "$t5", "$t6", "$t7", "$t0" , "$t1" , "$t2", "$t3", "$t4"), - roundb!(28, "$t4", "$t5", "$t6", "$t7", "$t0" , "$t1" , "$t2", "$t3"), - roundb!(29, "$t3", "$t4", "$t5", "$t6", "$t7", "$t0" , "$t1" , "$t2"), - roundb!(30, "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t0" , "$t1"), - roundb!(31, "$t1" , "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t0"), - roundb!(32, "$t0" , "$t1" , "$t2", "$t3", "$t4", "$t5", "$t6", "$t7"), - roundb!(33, "$t7", "$t0" , "$t1" , "$t2", "$t3", "$t4", "$t5", "$t6"), - roundb!(34, "$t6", "$t7", "$t0" , "$t1" , "$t2", "$t3", "$t4", "$t5"), - roundb!(35, "$t5", "$t6", "$t7", "$t0" , "$t1" , "$t2", "$t3", "$t4"), - roundb!(36, "$t4", "$t5", "$t6", "$t7", "$t0" , "$t1" , "$t2", "$t3"), - roundb!(37, "$t3", "$t4", "$t5", "$t6", "$t7", "$t0" , "$t1" , "$t2"), - roundb!(38, "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t0" , "$t1"), - roundb!(39, "$t1" , "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t0"), - roundb!(40, "$t0" , "$t1" , "$t2", "$t3", "$t4", "$t5", "$t6", "$t7"), - roundb!(41, "$t7", "$t0" , "$t1" , "$t2", "$t3", "$t4", "$t5", "$t6"), - roundb!(42, "$t6", "$t7", "$t0" , "$t1" , "$t2", "$t3", "$t4", "$t5"), - roundb!(43, "$t5", "$t6", "$t7", "$t0" , "$t1" , "$t2", "$t3", "$t4"), - roundb!(44, "$t4", "$t5", "$t6", "$t7", "$t0" , "$t1" , "$t2", "$t3"), - roundb!(45, "$t3", "$t4", "$t5", "$t6", "$t7", "$t0" , "$t1" , "$t2"), - roundb!(46, "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t0" , "$t1"), - roundb!(47, "$t1" , "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t0"), - roundb!(48, "$t0" , "$t1" , "$t2", "$t3", "$t4", "$t5", "$t6", "$t7"), - roundb!(49, "$t7", "$t0" , "$t1" , "$t2", "$t3", "$t4", "$t5", "$t6"), - roundb!(50, "$t6", "$t7", "$t0" , "$t1" , "$t2", "$t3", "$t4", "$t5"), - roundb!(51, "$t5", "$t6", "$t7", "$t0" , "$t1" , "$t2", "$t3", "$t4"), - roundb!(52, "$t4", "$t5", "$t6", "$t7", "$t0" , "$t1" , "$t2", "$t3"), - roundb!(53, "$t3", "$t4", "$t5", "$t6", "$t7", "$t0" , "$t1" , "$t2"), - roundb!(54, "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t0" , "$t1"), - roundb!(55, "$t1" , "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t0"), - roundb!(56, "$t0" , "$t1" , "$t2", "$t3", "$t4", "$t5", "$t6", "$t7"), - roundb!(57, "$t7", "$t0" , "$t1" , "$t2", "$t3", "$t4", "$t5", "$t6"), - roundb!(58, "$t6", "$t7", "$t0" , "$t1" , "$t2", "$t3", "$t4", "$t5"), - roundb!(59, "$t5", "$t6", "$t7", "$t0" , "$t1" , "$t2", "$t3", "$t4"), - roundb!(60, "$t4", "$t5", "$t6", "$t7", "$t0" , "$t1" , "$t2", "$t3"), - roundb!(61, "$t3", "$t4", "$t5", "$t6", "$t7", "$t0" , "$t1" , "$t2"), - roundb!(62, "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t0" , "$t1"), - roundb!(63, "$t1" , "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t0"), - - // Update state registers - "ld.w $a4, $a0, 0", // a - "ld.w $a5, $a0, 4", // b - "ld.w $a6, $a0, 8", // c - "ld.w $a7, $a0, 12", // d - "add.w $t0, $t0, $a4", - "add.w $t1, $t1, $a5", - "add.w $t2, $t2, $a6", - "add.w $t3, $t3, $a7", - "ld.w $a4, $a0, 16", // e - "ld.w $a5, $a0, 20", // f - "ld.w $a6, $a0, 24", // g - "ld.w $a7, $a0, 28", // h - "add.w $t4, $t4, $a4", - "add.w $t5, $t5, $a5", - "add.w $t6, $t6, $a6", - "add.w $t7, $t7, $a7", - - // Save updated state - "st.w $t0, $a0, 0", - "st.w $t1, $a0, 4", - "st.w $t2, $a0, 8", - "st.w $t3, $a0, 12", - "st.w $t4, $a0, 16", - "st.w $t5, $a0, 20", - "st.w $t6, $a0, 24", - "st.w $t7, $a0, 28", - - // Looping over blocks - "addi.d $a1, $a1, 64", - "addi.d $a2, $a2, -1", - "bnez $a2, 42b", - - // Restore stack register - "addi.d $sp, $sp, 64", - - in("$a0") state, - inout("$a1") blocks.as_ptr() => _, - inout("$a2") blocks.len() => _, - in("$a3") crate::consts::K32.as_ptr(), - - // Clobbers - out("$a4") _, - out("$a5") _, - out("$a6") _, - out("$a7") _, - out("$t0") _, - out("$t1") _, - out("$t2") _, - out("$t3") _, - out("$t4") _, - out("$t5") _, - out("$t6") _, - out("$t7") _, - - options(preserves_flags), - ); - } -} diff -Nru temporalio-1.3.0/vendor/sha2/src/sha256.rs temporalio-1.3.0/vendor/sha2/src/sha256.rs --- temporalio-1.3.0/vendor/sha2/src/sha256.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/sha2/src/sha256.rs 2023-10-30 19:40:00.000000000 +0000 @@ -17,9 +17,6 @@ mod soft; mod aarch64; use aarch64::compress; - } else if #[cfg(all(feature = "loongarch64_asm", target_arch = "loongarch64"))] { - mod loongarch64_asm; - use loongarch64_asm::compress; } else { mod soft; use soft::compress; diff -Nru temporalio-1.3.0/vendor/sha2/src/sha512/loongarch64_asm.rs temporalio-1.3.0/vendor/sha2/src/sha512/loongarch64_asm.rs --- temporalio-1.3.0/vendor/sha2/src/sha512/loongarch64_asm.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/sha2/src/sha512/loongarch64_asm.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,242 +0,0 @@ -//! LoongArch64 assembly backend - -macro_rules! c { - ($($l:expr)*) => { - concat!($($l ,)*) - }; -} - -macro_rules! rounda { - ($i:literal, $a:literal, $b:literal, $c:literal, $d:literal, $e:literal, $f:literal, $g:literal, $h:literal) => { - c!( - "ld.d $a5, $a1, (" $i " * 8);" - "revb.d $a5, $a5;" - roundtail!($i, $a, $b, $c, $d, $e, $f, $g, $h) - ) - }; -} - -macro_rules! roundb { - ($i:literal, $a:literal, $b:literal, $c:literal, $d:literal, $e:literal, $f:literal, $g:literal, $h:literal) => { - c!( - "ld.d $a4, $sp, (((" $i " - 15) & 0xF) * 8);" - "ld.d $a5, $sp, (((" $i " - 16) & 0xF) * 8);" - "ld.d $a6, $sp, (((" $i " - 7) & 0xF) * 8);" - "add.d $a5, $a5, $a6;" - "rotri.d $a6, $a4, 8;" - "srli.d $a7, $a4, 7;" - "rotri.d $a4, $a4, 1;" - "xor $a6, $a6, $a7;" - "xor $a4, $a4, $a6;" - "add.d $a5, $a5, $a4;" - "ld.d $a4, $sp, (((" $i " - 2) & 0xF) * 8);" - "rotri.d $a6, $a4, 61;" - "srli.d $a7, $a4, 6;" - "rotri.d $a4, $a4, 19;" - "xor $a6, $a6, $a7;" - "xor $a4, $a4, $a6;" - "add.d $a5, $a5, $a4;" - roundtail!($i, $a, $b, $c, $d, $e, $f, $g, $h) - ) - }; -} - -macro_rules! roundtail { - ($i:literal, $a:literal, $b:literal, $c:literal, $d:literal, $e:literal, $f:literal, $g:literal, $h:literal) => { - c!( - // Part 0 - "rotri.d $a6, " $e ", 18;" - "rotri.d $a7, " $e ", 41;" - "rotri.d $a4, " $e ", 14;" - "xor $a6, $a6, $a7;" - "xor $a4, $a4, $a6;" - "xor $a6, " $g ", " $f ";" - "ld.d $a7, $a3, " $i " * 8;" - "and $a6, $a6, " $e ";" - "xor $a6, $a6, " $g ";" - "add.d $a4, $a4, $a6;" - "add.d $a4, $a4, $a7;" - "add.d " $h ", " $h ", $a5;" - "add.d " $h ", " $h ", $a4;" - // Part 1 - "add.d " $d ", " $d ", " $h ";" - // Part 2 - "rotri.d $a6, " $a ", 39;" - "rotri.d $a7, " $a ", 34;" - "rotri.d $a4, " $a ", 28;" - "xor $a6, $a6, $a7;" - "xor $a4, $a4, $a6;" - "add.d " $h ", " $h ", $a4;" - "or $a4, " $c ", " $b ";" - "and $a6, " $c ", " $b ";" - "and $a4, $a4, " $a ";" - "or $a4, $a4, $a6;" - "add.d " $h ", " $h ", $a4;" - "st.d $a5, $sp, ((" $i " & 0xF) * 8);" - ) - }; -} - -pub fn compress(state: &mut [u64; 8], blocks: &[[u8; 128]]) { - if blocks.is_empty() { - return; - } - - unsafe { - core::arch::asm!( - // Allocate scratch stack space - "addi.d $sp, $sp, -128;", - - // Load state - "ld.d $t0, $a0, 0", - "ld.d $t1, $a0, 8", - "ld.d $t2, $a0, 16", - "ld.d $t3, $a0, 24", - "ld.d $t4, $a0, 32", - "ld.d $t5, $a0, 40", - "ld.d $t6, $a0, 48", - "ld.d $t7, $a0, 56", - - "42:", - - // Do 64 rounds of hashing - rounda!( 0, "$t0" , "$t1" , "$t2", "$t3", "$t4", "$t5", "$t6", "$t7"), - rounda!( 1, "$t7", "$t0" , "$t1" , "$t2", "$t3", "$t4", "$t5", "$t6"), - rounda!( 2, "$t6", "$t7", "$t0" , "$t1" , "$t2", "$t3", "$t4", "$t5"), - rounda!( 3, "$t5", "$t6", "$t7", "$t0" , "$t1" , "$t2", "$t3", "$t4"), - rounda!( 4, "$t4", "$t5", "$t6", "$t7", "$t0" , "$t1" , "$t2", "$t3"), - rounda!( 5, "$t3", "$t4", "$t5", "$t6", "$t7", "$t0" , "$t1" , "$t2"), - rounda!( 6, "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t0" , "$t1"), - rounda!( 7, "$t1" , "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t0"), - rounda!( 8, "$t0" , "$t1" , "$t2", "$t3", "$t4", "$t5", "$t6", "$t7"), - rounda!( 9, "$t7", "$t0" , "$t1" , "$t2", "$t3", "$t4", "$t5", "$t6"), - rounda!(10, "$t6", "$t7", "$t0" , "$t1" , "$t2", "$t3", "$t4", "$t5"), - rounda!(11, "$t5", "$t6", "$t7", "$t0" , "$t1" , "$t2", "$t3", "$t4"), - rounda!(12, "$t4", "$t5", "$t6", "$t7", "$t0" , "$t1" , "$t2", "$t3"), - rounda!(13, "$t3", "$t4", "$t5", "$t6", "$t7", "$t0" , "$t1" , "$t2"), - rounda!(14, "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t0" , "$t1"), - rounda!(15, "$t1" , "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t0"), - roundb!(16, "$t0" , "$t1" , "$t2", "$t3", "$t4", "$t5", "$t6", "$t7"), - roundb!(17, "$t7", "$t0" , "$t1" , "$t2", "$t3", "$t4", "$t5", "$t6"), - roundb!(18, "$t6", "$t7", "$t0" , "$t1" , "$t2", "$t3", "$t4", "$t5"), - roundb!(19, "$t5", "$t6", "$t7", "$t0" , "$t1" , "$t2", "$t3", "$t4"), - roundb!(20, "$t4", "$t5", "$t6", "$t7", "$t0" , "$t1" , "$t2", "$t3"), - roundb!(21, "$t3", "$t4", "$t5", "$t6", "$t7", "$t0" , "$t1" , "$t2"), - roundb!(22, "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t0" , "$t1"), - roundb!(23, "$t1" , "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t0"), - roundb!(24, "$t0" , "$t1" , "$t2", "$t3", "$t4", "$t5", "$t6", "$t7"), - roundb!(25, "$t7", "$t0" , "$t1" , "$t2", "$t3", "$t4", "$t5", "$t6"), - roundb!(26, "$t6", "$t7", "$t0" , "$t1" , "$t2", "$t3", "$t4", "$t5"), - roundb!(27, "$t5", "$t6", "$t7", "$t0" , "$t1" , "$t2", "$t3", "$t4"), - roundb!(28, "$t4", "$t5", "$t6", "$t7", "$t0" , "$t1" , "$t2", "$t3"), - roundb!(29, "$t3", "$t4", "$t5", "$t6", "$t7", "$t0" , "$t1" , "$t2"), - roundb!(30, "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t0" , "$t1"), - roundb!(31, "$t1" , "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t0"), - roundb!(32, "$t0" , "$t1" , "$t2", "$t3", "$t4", "$t5", "$t6", "$t7"), - roundb!(33, "$t7", "$t0" , "$t1" , "$t2", "$t3", "$t4", "$t5", "$t6"), - roundb!(34, "$t6", "$t7", "$t0" , "$t1" , "$t2", "$t3", "$t4", "$t5"), - roundb!(35, "$t5", "$t6", "$t7", "$t0" , "$t1" , "$t2", "$t3", "$t4"), - roundb!(36, "$t4", "$t5", "$t6", "$t7", "$t0" , "$t1" , "$t2", "$t3"), - roundb!(37, "$t3", "$t4", "$t5", "$t6", "$t7", "$t0" , "$t1" , "$t2"), - roundb!(38, "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t0" , "$t1"), - roundb!(39, "$t1" , "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t0"), - roundb!(40, "$t0" , "$t1" , "$t2", "$t3", "$t4", "$t5", "$t6", "$t7"), - roundb!(41, "$t7", "$t0" , "$t1" , "$t2", "$t3", "$t4", "$t5", "$t6"), - roundb!(42, "$t6", "$t7", "$t0" , "$t1" , "$t2", "$t3", "$t4", "$t5"), - roundb!(43, "$t5", "$t6", "$t7", "$t0" , "$t1" , "$t2", "$t3", "$t4"), - roundb!(44, "$t4", "$t5", "$t6", "$t7", "$t0" , "$t1" , "$t2", "$t3"), - roundb!(45, "$t3", "$t4", "$t5", "$t6", "$t7", "$t0" , "$t1" , "$t2"), - roundb!(46, "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t0" , "$t1"), - roundb!(47, "$t1" , "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t0"), - roundb!(48, "$t0" , "$t1" , "$t2", "$t3", "$t4", "$t5", "$t6", "$t7"), - roundb!(49, "$t7", "$t0" , "$t1" , "$t2", "$t3", "$t4", "$t5", "$t6"), - roundb!(50, "$t6", "$t7", "$t0" , "$t1" , "$t2", "$t3", "$t4", "$t5"), - roundb!(51, "$t5", "$t6", "$t7", "$t0" , "$t1" , "$t2", "$t3", "$t4"), - roundb!(52, "$t4", "$t5", "$t6", "$t7", "$t0" , "$t1" , "$t2", "$t3"), - roundb!(53, "$t3", "$t4", "$t5", "$t6", "$t7", "$t0" , "$t1" , "$t2"), - roundb!(54, "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t0" , "$t1"), - roundb!(55, "$t1" , "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t0"), - roundb!(56, "$t0" , "$t1" , "$t2", "$t3", "$t4", "$t5", "$t6", "$t7"), - roundb!(57, "$t7", "$t0" , "$t1" , "$t2", "$t3", "$t4", "$t5", "$t6"), - roundb!(58, "$t6", "$t7", "$t0" , "$t1" , "$t2", "$t3", "$t4", "$t5"), - roundb!(59, "$t5", "$t6", "$t7", "$t0" , "$t1" , "$t2", "$t3", "$t4"), - roundb!(60, "$t4", "$t5", "$t6", "$t7", "$t0" , "$t1" , "$t2", "$t3"), - roundb!(61, "$t3", "$t4", "$t5", "$t6", "$t7", "$t0" , "$t1" , "$t2"), - roundb!(62, "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t0" , "$t1"), - roundb!(63, "$t1" , "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t0"), - roundb!(64, "$t0" , "$t1" , "$t2", "$t3", "$t4", "$t5", "$t6", "$t7"), - roundb!(65, "$t7", "$t0" , "$t1" , "$t2", "$t3", "$t4", "$t5", "$t6"), - roundb!(66, "$t6", "$t7", "$t0" , "$t1" , "$t2", "$t3", "$t4", "$t5"), - roundb!(67, "$t5", "$t6", "$t7", "$t0" , "$t1" , "$t2", "$t3", "$t4"), - roundb!(68, "$t4", "$t5", "$t6", "$t7", "$t0" , "$t1" , "$t2", "$t3"), - roundb!(69, "$t3", "$t4", "$t5", "$t6", "$t7", "$t0" , "$t1" , "$t2"), - roundb!(70, "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t0" , "$t1"), - roundb!(71, "$t1" , "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t0"), - roundb!(72, "$t0" , "$t1" , "$t2", "$t3", "$t4", "$t5", "$t6", "$t7"), - roundb!(73, "$t7", "$t0" , "$t1" , "$t2", "$t3", "$t4", "$t5", "$t6"), - roundb!(74, "$t6", "$t7", "$t0" , "$t1" , "$t2", "$t3", "$t4", "$t5"), - roundb!(75, "$t5", "$t6", "$t7", "$t0" , "$t1" , "$t2", "$t3", "$t4"), - roundb!(76, "$t4", "$t5", "$t6", "$t7", "$t0" , "$t1" , "$t2", "$t3"), - roundb!(77, "$t3", "$t4", "$t5", "$t6", "$t7", "$t0" , "$t1" , "$t2"), - roundb!(78, "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t0" , "$t1"), - roundb!(79, "$t1" , "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t0"), - - // Update state registers - "ld.d $a4, $a0, 0", // a - "ld.d $a5, $a0, 8", // b - "ld.d $a6, $a0, 16", // c - "ld.d $a7, $a0, 24", // d - "add.d $t0, $t0, $a4", - "add.d $t1, $t1, $a5", - "add.d $t2, $t2, $a6", - "add.d $t3, $t3, $a7", - "ld.d $a4, $a0, 32", // e - "ld.d $a5, $a0, 40", // f - "ld.d $a6, $a0, 48", // g - "ld.d $a7, $a0, 56", // h - "add.d $t4, $t4, $a4", - "add.d $t5, $t5, $a5", - "add.d $t6, $t6, $a6", - "add.d $t7, $t7, $a7", - - // Save updated state - "st.d $t0, $a0, 0", - "st.d $t1, $a0, 8", - "st.d $t2, $a0, 16", - "st.d $t3, $a0, 24", - "st.d $t4, $a0, 32", - "st.d $t5, $a0, 40", - "st.d $t6, $a0, 48", - "st.d $t7, $a0, 56", - - // Looping over blocks - "addi.d $a1, $a1, 128", - "addi.d $a2, $a2, -1", - "bnez $a2, 42b", - - // Restore stack register - "addi.d $sp, $sp, 128", - - in("$a0") state, - inout("$a1") blocks.as_ptr() => _, - inout("$a2") blocks.len() => _, - in("$a3") crate::consts::K64.as_ptr(), - - // Clobbers - out("$a4") _, - out("$a5") _, - out("$a6") _, - out("$a7") _, - out("$t0") _, - out("$t1") _, - out("$t2") _, - out("$t3") _, - out("$t4") _, - out("$t5") _, - out("$t6") _, - out("$t7") _, - - options(preserves_flags), - ); - } -} diff -Nru temporalio-1.3.0/vendor/sha2/src/sha512.rs temporalio-1.3.0/vendor/sha2/src/sha512.rs --- temporalio-1.3.0/vendor/sha2/src/sha512.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/sha2/src/sha512.rs 2023-10-30 19:40:00.000000000 +0000 @@ -19,9 +19,6 @@ mod soft; mod aarch64; use aarch64::compress; - } else if #[cfg(all(feature = "loongarch64_asm", target_arch = "loongarch64"))] { - mod loongarch64_asm; - use loongarch64_asm::compress; } else { mod soft; use soft::compress; diff -Nru temporalio-1.3.0/vendor/sharded-slab/benches/bench.rs temporalio-1.3.0/vendor/sharded-slab/benches/bench.rs --- temporalio-1.3.0/vendor/sharded-slab/benches/bench.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/sharded-slab/benches/bench.rs 2023-10-30 19:40:00.000000000 +0000 @@ -26,7 +26,7 @@ let end = self.end.clone(); let slab = self.slab.clone(); thread::spawn(move || { - f(&start, &*slab); + f(&*start, &*slab); end.wait(); }); self diff -Nru temporalio-1.3.0/vendor/sharded-slab/.cargo-checksum.json temporalio-1.3.0/vendor/sharded-slab/.cargo-checksum.json --- temporalio-1.3.0/vendor/sharded-slab/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/sharded-slab/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"CHANGELOG.md":"7e3afcfd86e5fb650b0193a4c6e5247bf8d82ca2162202883cdba2a55d1b1452","Cargo.toml":"972705c4e87d779dd18458a39b16c9d8438d32d22bbbbcf6065fdf281c7924b2","IMPLEMENTATION.md":"c192c8288dffc0ecbf41d59ae8b1664ea9b323b3dd16f99f3041019b464fb55e","LICENSE":"eafbfa606bc005ed7fd2f623d65af17ffe4ef7c017221ac14405bf4140771ea9","README.md":"51409ab641f970e4bb7e04286344f38ba6b12b6d676e1e26211234b717e60da9","benches/bench.rs":"456f5e671097eaecfa65f828a7e7eae99765d7b63e3c385cf849897c3dcb2c22","bin/loom.sh":"903241204befb0f1f6e7ea98e2a24244c98e8567595c03af42f65b78a4b231c1","flake.lock":"4db51b12a0e28f1580d1c352f0296f335fbee21b8317e9cb96ef5bb6381a625c","flake.nix":"50a7df609933d62aff26d31e5814fee12e9ef67a6a2de6e5753400d2f1193956","rust-toolchain.toml":"390f502d778894a0073b46950ad61b78fa7ce285a9ef2dd26a88b65d5bce591b","src/cfg.rs":"b26b129bd1e27f279f76b4ce3a7e2d22b092077be50dab3cfde195d6ea662d2d","src/clear.rs":"765537aa6a4c65d9b42d6eb46b3dd801c2723b5c5b6bcdcabf671d63278f938e","src/implementation.rs":"dec81aebb88e006ab405256fb16e8ecca6b07c3582c1c803bdfcc2a84b1d21cf","src/iter.rs":"7abf7e6d283e04aabee5e8abc391540c4e731c2b26ab9a1a62d915fbf772abfc","src/lib.rs":"6cf3dbf8b7f5d7f5a8a3f6570990a943befccaee9e0fe1f710734b0bf3537642","src/macros.rs":"3d22bc75b29c551e8a8cde347e61ebe7c981862190ca82bbf5f529ff7ec1d1dd","src/page/mod.rs":"07e1d1fd2f02d97cd251c20b6c258df55c866c991ddc8fae46e29f23a1baf57a","src/page/slot.rs":"c9b815d074a76a47c146d9e5ee1a0414595db520ff7367ccbd640a9a05b74de2","src/page/stack.rs":"549853d1a2c1c15987eee89d4327c4592f274c3cc1c5b695e419bd460f61c5c4","src/pool.rs":"cf04cec4e24984a40c9300dc86baf6fb79432be7cd3a2276ad69a0c932be4098","src/shard.rs":"b2ac1b210b778ffa312b7013948735b3c5b73f65f2f8356ffef5ce4797ea8fdc","src/sync.rs":"9ad35bbb515f7e56c62b9e5e048a147a3490b419e2ebe79f66047674953f1689","src/tests/custom_config.rs":"4776d2eea5c4bcfc8d2767c184a54a885caaeed0f4cb9779975ec0e36aa0bd1e","src/tests/loom_pool.rs":"363bb7fbd6b99b870cc51ae3eb5b5a9cc02e5ef7ba0e5b83a495d7f1aab58dcc","src/tests/loom_slab.rs":"8106d494eda2be06e9fb69625c4e0bec463c64b8971c09a137acb3b8ad342403","src/tests/mod.rs":"d809497c204d674e7178f0fd41249b554905d8c6bf88e12dc997a951ae42ce2d","src/tests/properties.rs":"7e80ae17631dc0319266b7af080465c821c7b81f5f6baa045195a67675156908","src/tid.rs":"a8ba7c3f1a397e3a55d83ba32f9f1cc24137c249700cf44cb3cd0d2ed14f8065","tests/reserved_bits_leak.rs":"94b027496efdc63bae420b3f52b5114c9e1ac226ec0f96844d158fecc6cd1a3f"},"package":"f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6"} \ No newline at end of file +{"files":{"CHANGELOG.md":"9c0e06d18ed28fa4c4f0e010e392c0b3562c8ada22fcc2f22133d654686c7f15","Cargo.toml":"5967b83356e0272aa80a10f37dbec0bc2968f08bee6626c83a5be74d32ce767e","IMPLEMENTATION.md":"c192c8288dffc0ecbf41d59ae8b1664ea9b323b3dd16f99f3041019b464fb55e","LICENSE":"eafbfa606bc005ed7fd2f623d65af17ffe4ef7c017221ac14405bf4140771ea9","README.md":"4406c839a896217ab92e2f17d9162270d57b24204bcbbb12284a66cc72f3a40a","benches/bench.rs":"dd2b45ae38b3480537649d8fef80d566aa71c21933b59f3bb2200eb1793adc3b","bin/loom.sh":"903241204befb0f1f6e7ea98e2a24244c98e8567595c03af42f65b78a4b231c1","src/cfg.rs":"b26b129bd1e27f279f76b4ce3a7e2d22b092077be50dab3cfde195d6ea662d2d","src/clear.rs":"765537aa6a4c65d9b42d6eb46b3dd801c2723b5c5b6bcdcabf671d63278f938e","src/implementation.rs":"dec81aebb88e006ab405256fb16e8ecca6b07c3582c1c803bdfcc2a84b1d21cf","src/iter.rs":"a6880250c411471842cac8b9d28b7cbba4600ef33958530fd39ab54fbe2fdbe0","src/lib.rs":"b881289761889e91f7963a5e6d7d12377dc4600cac7b63fd69b06c8e2054d178","src/macros.rs":"3d22bc75b29c551e8a8cde347e61ebe7c981862190ca82bbf5f529ff7ec1d1dd","src/page/mod.rs":"1c61f1b42e2fab7e402ee22edac0dc71101da833fe4139651f4c79139e42d277","src/page/slot.rs":"053f3090af39e5d5205a969b808bf29eda34ce31e1c40c79b9e4ccfd60220332","src/page/stack.rs":"549853d1a2c1c15987eee89d4327c4592f274c3cc1c5b695e419bd460f61c5c4","src/pool.rs":"cf04cec4e24984a40c9300dc86baf6fb79432be7cd3a2276ad69a0c932be4098","src/shard.rs":"dd2e97d1357f7792b56a37d09e9598ccecfab3e3f8e602a3cf562978fa20e888","src/sync.rs":"9ad35bbb515f7e56c62b9e5e048a147a3490b419e2ebe79f66047674953f1689","src/tests/loom_pool.rs":"363bb7fbd6b99b870cc51ae3eb5b5a9cc02e5ef7ba0e5b83a495d7f1aab58dcc","src/tests/loom_slab.rs":"3d230cdf0048f02fc5046038e1574bc9c5f61972952aa21d86992e856161d3e6","src/tests/mod.rs":"44808a038c645f16ec26658a835fee815850f06563a2e680136b0fdbe6e44e39","src/tid.rs":"6a87728bebb947a47a9593d0274d1c332f4f6c4ffc733211546dc447de55d913"},"package":"900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/sharded-slab/Cargo.toml temporalio-1.3.0/vendor/sharded-slab/Cargo.toml --- temporalio-1.3.0/vendor/sharded-slab/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/sharded-slab/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -11,67 +11,41 @@ [package] edition = "2018" -rust-version = "1.42.0" name = "sharded-slab" -version = "0.1.7" +version = "0.1.4" authors = ["Eliza Weisman "] -description = """ -A lock-free concurrent slab. -""" +description = "A lock-free concurrent slab.\n" homepage = "https://github.com/hawkw/sharded-slab" -documentation = "https://docs.rs/sharded-slab/" +documentation = "https://docs.rs/sharded-slab/0.1.4/sharded_slab" readme = "README.md" -keywords = [ - "slab", - "allocator", - "lock-free", - "atomic", -] -categories = [ - "memory-management", - "data-structures", - "concurrency", -] +keywords = ["slab", "allocator", "lock-free", "atomic"] +categories = ["memory-management", "data-structures", "concurrency"] license = "MIT" repository = "https://github.com/hawkw/sharded-slab" - [package.metadata.docs.rs] all-features = true -rustdoc-args = [ - "--cfg", - "docsrs", -] +rustdoc-args = ["--cfg", "docsrs"] [[bench]] name = "bench" harness = false - [dependencies.lazy_static] version = "1" - [dev-dependencies.criterion] version = "0.3" -[dev-dependencies.indexmap] -version = "1" - -[dev-dependencies.memory-stats] -version = "1" +[dev-dependencies.loom] +version = "0.5" +features = ["checkpoint"] [dev-dependencies.proptest] version = "1" [dev-dependencies.slab] version = "0.4.2" - [target."cfg(loom)".dependencies.loom] version = "0.5" features = ["checkpoint"] optional = true - -[target."cfg(loom)".dev-dependencies.loom] -version = "0.5" -features = ["checkpoint"] - [badges.maintenance] status = "experimental" diff -Nru temporalio-1.3.0/vendor/sharded-slab/CHANGELOG.md temporalio-1.3.0/vendor/sharded-slab/CHANGELOG.md --- temporalio-1.3.0/vendor/sharded-slab/CHANGELOG.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/sharded-slab/CHANGELOG.md 2023-10-30 19:40:00.000000000 +0000 @@ -1,38 +1,3 @@ - -### v0.1.7 (2023-10-04) - - -#### Bug Fixes - -* index out of bounds in `get()` and `get_owned()` (#88) ([fdbc930f](https://github.com/hawkw/sharded-slab/commit/fdbc930fb14b0f6f8b77cd6efdad5a1bdf8d3c04)) -* **unique_iter:** prevent panics if a slab is empty (#88) ([bd599e0b](https://github.com/hawkw/sharded-slab/commit/bd599e0b2a60a953f25f27ba1fa86682150e05c2), closes [#73](https://github.com/hawkw/sharded-slab/issues/73)) - - - - -## 0.1.6 (2023-09-27) - - -#### Features - -* publicly export `UniqueIter` (#87) ([e4d6482d](https://github.com/hawkw/sharded-slab/commit/e4d6482db05d5767b47eae1b0217faad30f2ebd5), closes [#77](https://github.com/hawkw/sharded-slab/issues/77)) - -#### Bug Fixes - -* use a smaller `CustomConfig` for 32-bit tests (#84) ([828ffff9](https://github.com/hawkw/sharded-slab/commit/828ffff9f82cfc41ed66b4743563c4dddc97c1ce), closes [#82](https://github.com/hawkw/sharded-slab/issues/82)) - - - - -## 0.1.5 (2023-08-28) - - -#### Bug Fixes - -* **Slab:** invalid generation in case of custom config (#80) ([ca090279](https://github.com/hawkw/sharded-slab/commit/ca09027944812d024676029a3dde62d27ef22015)) - - - ### 0.1.4 (2021-10-12) diff -Nru temporalio-1.3.0/vendor/sharded-slab/flake.lock temporalio-1.3.0/vendor/sharded-slab/flake.lock --- temporalio-1.3.0/vendor/sharded-slab/flake.lock 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/sharded-slab/flake.lock 1970-01-01 00:00:00.000000000 +0000 @@ -1,85 +0,0 @@ -{ - "nodes": { - "flake-utils": { - "inputs": { - "systems": "systems" - }, - "locked": { - "lastModified": 1692799911, - "narHash": "sha256-3eihraek4qL744EvQXsK1Ha6C3CR7nnT8X2qWap4RNk=", - "owner": "numtide", - "repo": "flake-utils", - "rev": "f9e7cf818399d17d347f847525c5a5a8032e4e44", - "type": "github" - }, - "original": { - "owner": "numtide", - "repo": "flake-utils", - "type": "github" - } - }, - "nixpkgs": { - "locked": { - "lastModified": 1693158576, - "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixos-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "root": { - "inputs": { - "flake-utils": "flake-utils", - "nixpkgs": "nixpkgs", - "rust-overlay": "rust-overlay" - } - }, - "rust-overlay": { - "inputs": { - "flake-utils": [ - "flake-utils" - ], - "nixpkgs": [ - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1693188660, - "narHash": "sha256-F8vlVcYoEBRJqV3pN2QNSCI/A2i77ad5R9iiZ4llt1A=", - "owner": "oxalica", - "repo": "rust-overlay", - "rev": "23756b2c5594da5c1ad2f40ae2440b9f8a2165b7", - "type": "github" - }, - "original": { - "owner": "oxalica", - "repo": "rust-overlay", - "type": "github" - } - }, - "systems": { - "locked": { - "lastModified": 1681028828, - "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", - "owner": "nix-systems", - "repo": "default", - "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", - "type": "github" - }, - "original": { - "owner": "nix-systems", - "repo": "default", - "type": "github" - } - } - }, - "root": "root", - "version": 7 -} diff -Nru temporalio-1.3.0/vendor/sharded-slab/flake.nix temporalio-1.3.0/vendor/sharded-slab/flake.nix --- temporalio-1.3.0/vendor/sharded-slab/flake.nix 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/sharded-slab/flake.nix 1970-01-01 00:00:00.000000000 +0000 @@ -1,28 +0,0 @@ -# in flake.nix -{ - description = - "Flake containing a development shell for the `sharded-slab` crate"; - - inputs = { - nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; - flake-utils.url = "github:numtide/flake-utils"; - rust-overlay = { - url = "github:oxalica/rust-overlay"; - inputs = { - nixpkgs.follows = "nixpkgs"; - flake-utils.follows = "flake-utils"; - }; - }; - }; - - outputs = { self, nixpkgs, flake-utils, rust-overlay }: - flake-utils.lib.eachDefaultSystem (system: - let - overlays = [ (import rust-overlay) ]; - pkgs = import nixpkgs { inherit system overlays; }; - rustToolchain = pkgs.pkgsBuildHost.rust-bin.stable.latest.default; - nativeBuildInputs = with pkgs; [ rustToolchain pkg-config ]; - in with pkgs; { - devShells.default = mkShell { inherit nativeBuildInputs; }; - }); -} diff -Nru temporalio-1.3.0/vendor/sharded-slab/README.md temporalio-1.3.0/vendor/sharded-slab/README.md --- temporalio-1.3.0/vendor/sharded-slab/README.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/sharded-slab/README.md 2023-10-30 19:40:00.000000000 +0000 @@ -11,7 +11,7 @@ [crates-badge]: https://img.shields.io/crates/v/sharded-slab.svg [crates-url]: https://crates.io/crates/sharded-slab [docs-badge]: https://docs.rs/sharded-slab/badge.svg -[docs-url]: https://docs.rs/sharded-slab/latest +[docs-url]: https://docs.rs/sharded-slab/0.1.4/sharded_slab [ci-badge]: https://github.com/hawkw/sharded-slab/workflows/CI/badge.svg [ci-url]: https://github.com/hawkw/sharded-slab/actions?workflow=CI [license-badge]: https://img.shields.io/crates/l/sharded-slab @@ -35,7 +35,7 @@ First, add this to your `Cargo.toml`: ```toml -sharded-slab = "0.1.7" +sharded-slab = "0.1.1" ``` This crate provides two types, [`Slab`] and [`Pool`], which provide slightly @@ -127,7 +127,7 @@ ## Comparison with Similar Crates -- [`slab`][slab crate]: Carl Lerche's `slab` crate provides a slab implementation with a +- [`slab`]: Carl Lerche's `slab` crate provides a slab implementation with a similar API, implemented by storing all data in a single vector. Unlike `sharded-slab`, inserting and removing elements from the slab requires @@ -150,7 +150,7 @@ concurrent use-cases, while `slab` should be preferred in single-threaded use-cases. -[slab crate]: https://crates.io/crates/slab +[`slab`]: https://crates.io/crates/slab ## Safety and Correctness diff -Nru temporalio-1.3.0/vendor/sharded-slab/rust-toolchain.toml temporalio-1.3.0/vendor/sharded-slab/rust-toolchain.toml --- temporalio-1.3.0/vendor/sharded-slab/rust-toolchain.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/sharded-slab/rust-toolchain.toml 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ -[toolchain] -channel = "stable" -profile = "default" -targets = [ - "i686-unknown-linux-musl", - "x86_64-unknown-linux-gnu", -] \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/sharded-slab/src/iter.rs temporalio-1.3.0/vendor/sharded-slab/src/iter.rs --- temporalio-1.3.0/vendor/sharded-slab/src/iter.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/sharded-slab/src/iter.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,19 +1,15 @@ -use std::{iter::FusedIterator, slice}; +use crate::{page, shard}; +use std::slice; -use crate::{cfg, page, shard}; - -/// An exclusive fused iterator over the items in a [`Slab`](crate::Slab). -#[must_use = "iterators are lazy and do nothing unless consumed"] #[derive(Debug)] -pub struct UniqueIter<'a, T, C: cfg::Config> { +pub struct UniqueIter<'a, T, C: crate::cfg::Config> { pub(super) shards: shard::IterMut<'a, Option, C>, pub(super) pages: slice::Iter<'a, page::Shared, C>>, pub(super) slots: Option>, } -impl<'a, T, C: cfg::Config> Iterator for UniqueIter<'a, T, C> { +impl<'a, T, C: crate::cfg::Config> Iterator for UniqueIter<'a, T, C> { type Item = &'a T; - fn next(&mut self) -> Option { test_println!("UniqueIter::next"); loop { @@ -41,5 +37,3 @@ } } } - -impl FusedIterator for UniqueIter<'_, T, C> {} diff -Nru temporalio-1.3.0/vendor/sharded-slab/src/lib.rs temporalio-1.3.0/vendor/sharded-slab/src/lib.rs --- temporalio-1.3.0/vendor/sharded-slab/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/sharded-slab/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -215,11 +215,8 @@ mod shard; mod tid; -pub use self::{ - cfg::{Config, DefaultConfig}, - clear::Clear, - iter::UniqueIter, -}; +pub use cfg::{Config, DefaultConfig}; +pub use clear::Clear; #[doc(inline)] pub use pool::Pool; @@ -738,26 +735,15 @@ } /// Returns an iterator over all the items in the slab. - /// - /// Because this iterator exclusively borrows the slab (i.e. it holds an - /// `&mut Slab`), elements will not be added or removed while the - /// iteration is in progress. pub fn unique_iter(&mut self) -> iter::UniqueIter<'_, T, C> { let mut shards = self.shards.iter_mut(); - - let (pages, slots) = match shards.next() { - Some(shard) => { - let mut pages = shard.iter(); - let slots = pages.next().and_then(page::Shared::iter); - (pages, slots) - } - None => ([].iter(), None), - }; - + let shard = shards.next().expect("must be at least 1 shard"); + let mut pages = shard.iter(); + let slots = pages.next().and_then(page::Shared::iter); iter::UniqueIter { shards, - pages, slots, + pages, } } } diff -Nru temporalio-1.3.0/vendor/sharded-slab/src/page/mod.rs temporalio-1.3.0/vendor/sharded-slab/src/page/mod.rs --- temporalio-1.3.0/vendor/sharded-slab/src/page/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/sharded-slab/src/page/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -247,7 +247,7 @@ } pub(crate) fn iter(&self) -> Option> { - let slab = self.slab.with(|slab| unsafe { (*slab).as_ref() }); + let slab = self.slab.with(|slab| unsafe { (&*slab).as_ref() }); slab.map(|slab| { slab.iter() .filter_map(Shared::make_ref as fn(&'a Slot, C>) -> Option<&'a T>) @@ -402,7 +402,7 @@ impl Clone for Addr { fn clone(&self) -> Self { - *self + Self::from_usize(self.addr) } } diff -Nru temporalio-1.3.0/vendor/sharded-slab/src/page/slot.rs temporalio-1.3.0/vendor/sharded-slab/src/page/slot.rs --- temporalio-1.3.0/vendor/sharded-slab/src/page/slot.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/sharded-slab/src/page/slot.rs 2023-10-30 19:40:00.000000000 +0000 @@ -134,7 +134,7 @@ let new_refs = refs.incr()?; match self.lifecycle.compare_exchange( lifecycle, - new_refs.pack(lifecycle), + new_refs.pack(current_gen.pack(state.pack(0))), Ordering::AcqRel, Ordering::Acquire, ) { @@ -242,7 +242,7 @@ let mut spin_exp = 0; let next_gen = gen.advance(); loop { - let current_gen = LifecycleGen::from_packed(lifecycle).0; + let current_gen = Generation::from_packed(lifecycle); test_println!("-> release_with; lifecycle={:#x}; expected_gen={:?}; current_gen={:?}; next_gen={:?};", lifecycle, gen, @@ -261,7 +261,7 @@ match self.lifecycle.compare_exchange( lifecycle, - LifecycleGen(next_gen).pack(lifecycle), + next_gen.pack(lifecycle), Ordering::AcqRel, Ordering::Acquire, ) { @@ -499,9 +499,8 @@ // Are we the last guard, and is the slot marked for removal? let dropping = refs.value == 1 && state == State::Marked; let new_lifecycle = if dropping { - // If so, we want to advance the state to "removing". - // Also, reset the ref count to 0. - LifecycleGen(gen).pack(State::Removing as usize) + // If so, we want to advance the state to "removing" + gen.pack(State::Removing as usize) } else { // Otherwise, just subtract 1 from the ref count. refs.decr().pack(lifecycle) @@ -584,7 +583,7 @@ impl Clone for Generation { fn clone(&self) -> Self { - *self + Self::new(self.value) } } @@ -748,7 +747,7 @@ impl Clone for RefCount { fn clone(&self) -> Self { - *self + Self::from_usize(self.value) } } @@ -876,8 +875,7 @@ debug_assert!(state == State::Marked || thread::panicking(), "state was not MARKED; someone else has removed the slot while we have exclusive access!\nactual={:?}", state); debug_assert!(refs.value == 0 || thread::panicking(), "ref count was not 0; someone else has referenced the slot while we have exclusive access!\nactual={:?}", refs); - - let new_lifecycle = LifecycleGen(self.generation()).pack(State::Removing as usize); + let new_lifecycle = self.generation().pack(State::Removing as usize); match slot.lifecycle.compare_exchange( curr_lifecycle, diff -Nru temporalio-1.3.0/vendor/sharded-slab/src/shard.rs temporalio-1.3.0/vendor/sharded-slab/src/shard.rs --- temporalio-1.3.0/vendor/sharded-slab/src/shard.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/sharded-slab/src/shard.rs 2023-10-30 19:40:00.000000000 +0000 @@ -77,7 +77,7 @@ let (addr, page_index) = page::indices::(idx); test_println!("-> {:?}", addr); - if page_index >= self.shared.len() { + if page_index > self.shared.len() { return None; } @@ -132,7 +132,7 @@ debug_assert_eq_in_drop!(Tid::::from_packed(idx).as_usize(), self.tid); let (addr, page_index) = page::indices::(idx); - if page_index >= self.shared.len() { + if page_index > self.shared.len() { return false; } @@ -143,7 +143,7 @@ debug_assert_eq_in_drop!(Tid::::from_packed(idx).as_usize(), self.tid); let (addr, page_index) = page::indices::(idx); - if page_index >= self.shared.len() { + if page_index > self.shared.len() { return false; } @@ -183,7 +183,7 @@ debug_assert_eq_in_drop!(Tid::::from_packed(idx).as_usize(), self.tid); let (addr, page_index) = page::indices::(idx); - if page_index >= self.shared.len() { + if page_index > self.shared.len() { return false; } @@ -194,7 +194,7 @@ debug_assert_eq_in_drop!(Tid::::from_packed(idx).as_usize(), self.tid); let (addr, page_index) = page::indices::(idx); - if page_index >= self.shared.len() { + if page_index > self.shared.len() { return false; } @@ -221,7 +221,7 @@ debug_assert_eq_in_drop!(Tid::::from_packed(idx).as_usize(), self.tid); let (addr, page_index) = page::indices::(idx); - if page_index >= self.shared.len() { + if page_index > self.shared.len() { return false; } @@ -232,7 +232,7 @@ debug_assert_eq_in_drop!(Tid::::from_packed(idx).as_usize(), self.tid); let (addr, page_index) = page::indices::(idx); - if page_index >= self.shared.len() { + if page_index > self.shared.len() { return false; } diff -Nru temporalio-1.3.0/vendor/sharded-slab/src/tests/custom_config.rs temporalio-1.3.0/vendor/sharded-slab/src/tests/custom_config.rs --- temporalio-1.3.0/vendor/sharded-slab/src/tests/custom_config.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/sharded-slab/src/tests/custom_config.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,78 +0,0 @@ -//! Ensures that a custom config behaves as the default config, until limits are reached. -//! Prevents regression after #80. - -use crate::{cfg::CfgPrivate, Config, Slab}; - -struct CustomConfig; - -#[cfg(target_pointer_width = "64")] -impl Config for CustomConfig { - const INITIAL_PAGE_SIZE: usize = 32; - const MAX_PAGES: usize = 15; - const MAX_THREADS: usize = 256; - const RESERVED_BITS: usize = 24; -} - -#[cfg(not(target_pointer_width = "64"))] -impl Config for CustomConfig { - const INITIAL_PAGE_SIZE: usize = 16; - const MAX_PAGES: usize = 6; - const MAX_THREADS: usize = 128; - const RESERVED_BITS: usize = 12; -} - -// We should repeat actions several times to detect invalid lifecycle changes. -const ITERS: u64 = 5; - -#[track_caller] -fn slab_eq(mut lhs: Slab, mut rhs: Slab) { - let mut lhs_vec = lhs.unique_iter().collect::>(); - lhs_vec.sort_unstable(); - let mut rhs_vec = rhs.unique_iter().collect::>(); - rhs_vec.sort_unstable(); - assert_eq!(lhs_vec, rhs_vec); -} - -/// Calls `insert(); remove()` multiple times to detect invalid releasing. -/// Initially, it revealed bugs in the `Slot::release_with()` implementation. -#[test] -fn insert_remove() { - eprintln!("bits={}; config={:#?}", usize::BITS, CustomConfig::debug()); - - let default_slab = Slab::::new(); - let custom_slab = Slab::::new_with_config::(); - - for i in 0..=ITERS { - let idx = default_slab.insert(i).unwrap(); - assert!(default_slab.remove(idx)); - - let idx = custom_slab.insert(i).unwrap(); - assert!(custom_slab.remove(idx)); - } - - slab_eq(custom_slab, default_slab); -} - -/// Calls `get()` multiple times to detect invalid ref counting. -/// Initially, it revealed bugs in the `Slot::get()` implementation. -#[test] -fn double_get() { - eprintln!("bits={}; config={:#?}", usize::BITS, CustomConfig::debug()); - - let default_slab = Slab::::new(); - let custom_slab = Slab::::new_with_config::(); - - for i in 0..=ITERS { - let idx = default_slab.insert(i).unwrap(); - assert!(default_slab.get(idx).is_some()); - assert!(default_slab.get(idx).is_some()); - assert!(default_slab.remove(idx)); - - let idx = custom_slab.insert(i).unwrap(); - assert!(custom_slab.get(idx).is_some()); - assert!(custom_slab.get(idx).is_some()); - assert!(custom_slab.remove(idx)); - } - - slab_eq(custom_slab, default_slab); -} diff -Nru temporalio-1.3.0/vendor/sharded-slab/src/tests/loom_slab.rs temporalio-1.3.0/vendor/sharded-slab/src/tests/loom_slab.rs --- temporalio-1.3.0/vendor/sharded-slab/src/tests/loom_slab.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/sharded-slab/src/tests/loom_slab.rs 2023-10-30 19:40:00.000000000 +0000 @@ -381,7 +381,7 @@ #[test] fn unique_iter() { run_model("unique_iter", || { - let mut slab = Arc::new(Slab::new()); + let mut slab = std::sync::Arc::new(Slab::new()); let s = slab.clone(); let t1 = thread::spawn(move || { @@ -398,7 +398,7 @@ t1.join().expect("thread 1 should not panic"); t2.join().expect("thread 2 should not panic"); - let slab = Arc::get_mut(&mut slab).expect("other arcs should be dropped"); + let slab = std::sync::Arc::get_mut(&mut slab).expect("other arcs should be dropped"); let items: Vec<_> = slab.unique_iter().map(|&i| i).collect(); assert!(items.contains(&1), "items: {:?}", items); assert!(items.contains(&2), "items: {:?}", items); diff -Nru temporalio-1.3.0/vendor/sharded-slab/src/tests/mod.rs temporalio-1.3.0/vendor/sharded-slab/src/tests/mod.rs --- temporalio-1.3.0/vendor/sharded-slab/src/tests/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/sharded-slab/src/tests/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -65,11 +65,7 @@ } } -#[cfg(not(loom))] -mod custom_config; #[cfg(loom)] mod loom_pool; #[cfg(loom)] mod loom_slab; -#[cfg(not(loom))] -mod properties; diff -Nru temporalio-1.3.0/vendor/sharded-slab/src/tests/properties.rs temporalio-1.3.0/vendor/sharded-slab/src/tests/properties.rs --- temporalio-1.3.0/vendor/sharded-slab/src/tests/properties.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/sharded-slab/src/tests/properties.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,244 +0,0 @@ -//! This module contains property-based tests against the public API: -//! * API never panics. -//! * Active entries cannot be overridden until removed. -//! * The slab doesn't produce overlapping keys. -//! * The slab doesn't leave "lost" keys. -//! * `get()`, `get_owned`, and `contains()` are consistent. -//! * `RESERVED_BITS` are actually not used. -//! -//! The test is supposed to be deterministic, so it doesn't spawn real threads -//! and uses `tid::with()` to override the TID for the current thread. - -use std::{ops::Range, sync::Arc}; - -use indexmap::IndexMap; -use proptest::prelude::*; - -use crate::{tid, Config, DefaultConfig, Slab}; - -const THREADS: Range = 1..4; -const ACTIONS: Range = 1..1000; - -#[derive(Debug, Clone)] -struct Action { - tid: usize, - kind: ActionKind, -} - -#[derive(Debug, Clone)] -enum ActionKind { - Insert, - VacantEntry, - RemoveRandom(usize), // key - RemoveExistent(usize), // seed - TakeRandom(usize), // key - TakeExistent(usize), // seed - GetRandom(usize), // key - GetExistent(usize), // seed -} - -prop_compose! { - fn action_strategy()(tid in THREADS, kind in action_kind_strategy()) -> Action { - Action { tid, kind } - } -} - -fn action_kind_strategy() -> impl Strategy { - prop_oneof![ - 1 => Just(ActionKind::Insert), - 1 => Just(ActionKind::VacantEntry), - 1 => prop::num::usize::ANY.prop_map(ActionKind::RemoveRandom), - 1 => prop::num::usize::ANY.prop_map(ActionKind::RemoveExistent), - 1 => prop::num::usize::ANY.prop_map(ActionKind::TakeRandom), - 1 => prop::num::usize::ANY.prop_map(ActionKind::TakeExistent), - // Produce `GetRandom` and `GetExistent` more often. - 5 => prop::num::usize::ANY.prop_map(ActionKind::GetRandom), - 5 => prop::num::usize::ANY.prop_map(ActionKind::GetExistent), - ] -} - -/// Stores active entries (added and not yet removed). -#[derive(Default)] -struct Active { - // Use `IndexMap` to preserve determinism. - map: IndexMap, - prev_value: u32, -} - -impl Active { - fn next_value(&mut self) -> u32 { - self.prev_value += 1; - self.prev_value - } - - fn get(&self, key: usize) -> Option { - self.map.get(&key).copied() - } - - fn get_any(&self, seed: usize) -> Option<(usize, u32)> { - if self.map.is_empty() { - return None; - } - - let index = seed % self.map.len(); - self.map.get_index(index).map(|(k, v)| (*k, *v)) - } - - fn insert(&mut self, key: usize, value: u32) { - assert_eq!( - self.map.insert(key, value), - None, - "keys of active entries must be unique" - ); - } - - fn remove(&mut self, key: usize) -> Option { - self.map.swap_remove(&key) - } - - fn remove_any(&mut self, seed: usize) -> Option<(usize, u32)> { - if self.map.is_empty() { - return None; - } - - let index = seed % self.map.len(); - self.map.swap_remove_index(index) - } - - fn drain(&mut self) -> impl Iterator + '_ { - self.map.drain(..) - } -} - -fn used_bits(key: usize) -> usize { - assert_eq!( - C::RESERVED_BITS + Slab::::USED_BITS, - std::mem::size_of::() * 8 - ); - key & ((!0) >> C::RESERVED_BITS) -} - -fn apply_action( - slab: &Arc>, - active: &mut Active, - action: ActionKind, -) -> Result<(), TestCaseError> { - match action { - ActionKind::Insert => { - let value = active.next_value(); - let key = slab.insert(value).expect("unexpectedly exhausted slab"); - prop_assert_eq!(used_bits::(key), key); - active.insert(key, value); - } - ActionKind::VacantEntry => { - let value = active.next_value(); - let entry = slab.vacant_entry().expect("unexpectedly exhausted slab"); - let key = entry.key(); - prop_assert_eq!(used_bits::(key), key); - entry.insert(value); - active.insert(key, value); - } - ActionKind::RemoveRandom(key) => { - let used_key = used_bits::(key); - prop_assert_eq!(slab.get(key).map(|e| *e), slab.get(used_key).map(|e| *e)); - prop_assert_eq!(slab.remove(key), active.remove(used_key).is_some()); - } - ActionKind::RemoveExistent(seed) => { - if let Some((key, _value)) = active.remove_any(seed) { - prop_assert!(slab.contains(key)); - prop_assert!(slab.remove(key)); - } - } - ActionKind::TakeRandom(key) => { - let used_key = used_bits::(key); - prop_assert_eq!(slab.get(key).map(|e| *e), slab.get(used_key).map(|e| *e)); - prop_assert_eq!(slab.take(key), active.remove(used_key)); - } - ActionKind::TakeExistent(seed) => { - if let Some((key, value)) = active.remove_any(seed) { - prop_assert!(slab.contains(key)); - prop_assert_eq!(slab.take(key), Some(value)); - } - } - ActionKind::GetRandom(key) => { - let used_key = used_bits::(key); - prop_assert_eq!(slab.get(key).map(|e| *e), slab.get(used_key).map(|e| *e)); - prop_assert_eq!(slab.get(key).map(|e| *e), active.get(used_key)); - prop_assert_eq!( - slab.clone().get_owned(key).map(|e| *e), - active.get(used_key) - ); - } - ActionKind::GetExistent(seed) => { - if let Some((key, value)) = active.get_any(seed) { - prop_assert!(slab.contains(key)); - prop_assert_eq!(slab.get(key).map(|e| *e), Some(value)); - prop_assert_eq!(slab.clone().get_owned(key).map(|e| *e), Some(value)); - } - } - } - - Ok(()) -} - -fn run(actions: Vec) -> Result<(), TestCaseError> { - let mut slab = Arc::new(Slab::new_with_config::()); - let mut active = Active::default(); - - // Apply all actions. - for action in actions { - // Override the TID for the current thread instead of using multiple real threads - // to preserve determinism. We're not checking concurrency issues here, they should be - // covered by loom tests anyway. Thus, it's fine to run all actions consequently. - tid::with(action.tid, || { - apply_action::(&slab, &mut active, action.kind) - })?; - } - - // Ensure the slab contains all remaining entries. - let mut expected_values = Vec::new(); - for (key, value) in active.drain() { - prop_assert!(slab.contains(key)); - prop_assert_eq!(slab.get(key).map(|e| *e), Some(value)); - prop_assert_eq!(slab.clone().get_owned(key).map(|e| *e), Some(value)); - expected_values.push(value); - } - expected_values.sort(); - - // Ensure `unique_iter()` returns all remaining entries. - let slab = Arc::get_mut(&mut slab).unwrap(); - let mut actual_values = slab.unique_iter().copied().collect::>(); - actual_values.sort(); - prop_assert_eq!(actual_values, expected_values); - - Ok(()) -} - -proptest! { - #[test] - fn default_config(actions in prop::collection::vec(action_strategy(), ACTIONS)) { - run::(actions)?; - } - - #[test] - fn custom_config(actions in prop::collection::vec(action_strategy(), ACTIONS)) { - run::(actions)?; - } -} - -struct CustomConfig; - -#[cfg(target_pointer_width = "64")] -impl Config for CustomConfig { - const INITIAL_PAGE_SIZE: usize = 32; - const MAX_PAGES: usize = 15; - const MAX_THREADS: usize = 256; - const RESERVED_BITS: usize = 24; -} -#[cfg(target_pointer_width = "32")] -impl Config for CustomConfig { - const INITIAL_PAGE_SIZE: usize = 16; - const MAX_PAGES: usize = 6; - const MAX_THREADS: usize = 128; - const RESERVED_BITS: usize = 12; -} diff -Nru temporalio-1.3.0/vendor/sharded-slab/src/tid.rs temporalio-1.3.0/vendor/sharded-slab/src/tid.rs --- temporalio-1.3.0/vendor/sharded-slab/src/tid.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/sharded-slab/src/tid.rs 2023-10-30 19:40:00.000000000 +0000 @@ -12,6 +12,7 @@ collections::VecDeque, fmt, marker::PhantomData, + sync::PoisonError, }; /// Uniquely identifies a thread. @@ -122,7 +123,7 @@ impl Clone for Tid { fn clone(&self) -> Self { - *self + Self::new(self.id) } } @@ -185,26 +186,9 @@ #[cfg(not(all(loom, any(feature = "loom", test))))] impl Drop for Registration { fn drop(&mut self) { - use std::sync::PoisonError; - if let Some(id) = self.0.get() { let mut free_list = REGISTRY.free.lock().unwrap_or_else(PoisonError::into_inner); free_list.push_back(id); } } } - -#[cfg(all(test, not(loom)))] -pub(crate) fn with(tid: usize, f: impl FnOnce() -> R) -> R { - struct Guard(Option); - - impl Drop for Guard { - fn drop(&mut self) { - REGISTRATION.with(|r| r.0.set(self.0.take())); - } - } - - let prev = REGISTRATION.with(|r| r.0.replace(Some(tid))); - let _guard = Guard(prev); - f() -} diff -Nru temporalio-1.3.0/vendor/sharded-slab/tests/reserved_bits_leak.rs temporalio-1.3.0/vendor/sharded-slab/tests/reserved_bits_leak.rs --- temporalio-1.3.0/vendor/sharded-slab/tests/reserved_bits_leak.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/sharded-slab/tests/reserved_bits_leak.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,26 +0,0 @@ -// Reproduces https://github.com/hawkw/sharded-slab/issues/83 -use memory_stats::memory_stats; -use sharded_slab::Config; -use sharded_slab::Slab; - -struct CustomConfig; -impl Config for CustomConfig { - const RESERVED_BITS: usize = 1; // This is the cause. -} - -#[test] -fn reserved_bits_doesnt_leak() { - let slab = Slab::new_with_config::(); - for n in 0..1000 { - let mem_before = memory_stats().unwrap(); - let key = slab.insert(0).unwrap(); - slab.remove(key); - let usage = memory_stats().unwrap(); - eprintln!( - "n: {n:<4}\tkey: {key:#08x} rss: {:>16} vs:{:>16}", - usage.physical_mem, usage.virtual_mem - ); - - assert_eq!(mem_before.virtual_mem, usage.virtual_mem); - } -} diff -Nru temporalio-1.3.0/vendor/smallvec/.cargo-checksum.json temporalio-1.3.0/vendor/smallvec/.cargo-checksum.json --- temporalio-1.3.0/vendor/smallvec/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/smallvec/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"Cargo.toml":"964f828a4ed019af9a728f6a0f63dc5860446c7b21abe2be1a0b92ddc82d1140","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"0b28172679e0009b655da42797c03fd163a3379d5cfa67ba1f1655e974a2a1a9","README.md":"a01127c37308457e8d396b176fb790846be0978c173be3f13260b62efcef011b","benches/bench.rs":"e2a235d68be20996014c00468b369887d2041ce95486625de3cef35b8f2e4acd","debug_metadata/README.md":"4d7f1c1b2c25ce2231ef71864d06e54323867459035b53bc9e00f66a0a44f82e","debug_metadata/smallvec.natvis":"3092ddebd8fffc3486536d7f27f8c5eae3a8a093d45cd8eeb3946ea2b0c35a15","scripts/run_miri.sh":"74a9f9adc43f986e81977b03846f7dd00122a0150bd8ec3fe4842a1a787e0f07","src/arbitrary.rs":"22e55cfbf60374945b30e6d0855129eff67cd8b878cef6fa997e1f4be67b9e3d","src/lib.rs":"aed3176e0c74d7eb1d405ee096a4d1027626ed5f1bb65da4c0ef89f83b8f66ed","src/specialization.rs":"46433586203399251cba496d67b88d34e1be3c2b591986b77463513da1c66471","src/tests.rs":"d0a70bb7b4e1d0a174f2a195c8ab55280a40589bab7028999afd787b3fff6eae","tests/debugger_visualizer.rs":"185456ad253957fc0c9e904ff8a1135397ac991c29fa3c60f75d8d81f7463022","tests/macro.rs":"22ad4f6f104a599fdcba19cad8834105b8656b212fb6c7573a427d447f5db14f"},"package":"942b4a808e05215192e39f4ab80813e599068285906cc91aa64f923db842bd5a"} \ No newline at end of file +{"files":{"Cargo.toml":"dd059cc04554e412d3ad325d3cbbd5bfd275428fea1f7930c9b2aaf87c2dcab8","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"0b28172679e0009b655da42797c03fd163a3379d5cfa67ba1f1655e974a2a1a9","README.md":"a01127c37308457e8d396b176fb790846be0978c173be3f13260b62efcef011b","benches/bench.rs":"e2a235d68be20996014c00468b369887d2041ce95486625de3cef35b8f2e4acd","debug_metadata/README.md":"4d7f1c1b2c25ce2231ef71864d06e54323867459035b53bc9e00f66a0a44f82e","debug_metadata/smallvec.natvis":"3092ddebd8fffc3486536d7f27f8c5eae3a8a093d45cd8eeb3946ea2b0c35a15","scripts/run_miri.sh":"74a9f9adc43f986e81977b03846f7dd00122a0150bd8ec3fe4842a1a787e0f07","src/arbitrary.rs":"22e55cfbf60374945b30e6d0855129eff67cd8b878cef6fa997e1f4be67b9e3d","src/lib.rs":"f2f20a3dffbde2514044e43626d4d3da73d15e2cbed7cdcc65f310373dd7fae9","src/specialization.rs":"46433586203399251cba496d67b88d34e1be3c2b591986b77463513da1c66471","src/tests.rs":"d0a70bb7b4e1d0a174f2a195c8ab55280a40589bab7028999afd787b3fff6eae","tests/debugger_visualizer.rs":"185456ad253957fc0c9e904ff8a1135397ac991c29fa3c60f75d8d81f7463022","tests/macro.rs":"22ad4f6f104a599fdcba19cad8834105b8656b212fb6c7573a427d447f5db14f"},"package":"62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/smallvec/Cargo.toml temporalio-1.3.0/vendor/smallvec/Cargo.toml --- temporalio-1.3.0/vendor/smallvec/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/smallvec/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -12,7 +12,7 @@ [package] edition = "2018" name = "smallvec" -version = "1.11.1" +version = "1.11.0" authors = ["The Servo Project Developers"] description = "'Small vector' optimization: store up to a small number of items on the stack" documentation = "https://docs.rs/smallvec/" @@ -33,7 +33,6 @@ rustdoc-args = [ "--cfg", "docsrs", - "--generate-link-to-definition", ] [[test]] diff -Nru temporalio-1.3.0/vendor/smallvec/src/lib.rs temporalio-1.3.0/vendor/smallvec/src/lib.rs --- temporalio-1.3.0/vendor/smallvec/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/smallvec/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1120,7 +1120,7 @@ unsafe { let (mut ptr, mut len, cap) = self.triple_mut(); if *len == cap { - self.reserve_one_unchecked(); + self.reserve(1); let (heap_ptr, heap_len) = self.data.heap_mut(); ptr = heap_ptr; len = heap_len; @@ -1225,23 +1225,13 @@ infallible(self.try_reserve(additional)) } - /// Internal method used to grow in push() and insert(), where we know already we have to grow. - #[cold] - fn reserve_one_unchecked(&mut self) { - debug_assert_eq!(self.len(), self.capacity()); - let new_cap = self.len() - .checked_add(1) - .and_then(usize::checked_next_power_of_two) - .expect("capacity overflow"); - infallible(self.try_grow(new_cap)) - } - /// Reserve capacity for `additional` more elements to be inserted. /// /// May reserve more space to avoid frequent reallocations. pub fn try_reserve(&mut self, additional: usize) -> Result<(), CollectionAllocErr> { - // prefer triple_mut() even if triple() would work so that the optimizer removes duplicated - // calls to it from callers. + // prefer triple_mut() even if triple() would work + // so that the optimizer removes duplicated calls to it + // from callers like insert() let (_, &mut len, cap) = self.triple_mut(); if cap - len >= additional { return Ok(()); @@ -1367,14 +1357,10 @@ /// /// Panics if `index > len`. pub fn insert(&mut self, index: usize, element: A::Item) { + self.reserve(1); + unsafe { - let (mut ptr, mut len_ptr, cap) = self.triple_mut(); - if *len_ptr == cap { - self.reserve_one_unchecked(); - let (heap_ptr, heap_len_ptr) = self.data.heap_mut(); - ptr = heap_ptr; - len_ptr = heap_len_ptr; - } + let (ptr, len_ptr, _) = self.triple_mut(); let mut ptr = ptr.as_ptr(); let len = *len_ptr; ptr = ptr.add(index); @@ -1772,7 +1758,6 @@ /// elements toward the back. /// /// For slices of `Copy` types, this is more efficient than `insert`. - #[inline] pub fn insert_from_slice(&mut self, index: usize, slice: &[A::Item]) { self.reserve(slice.len()); diff -Nru temporalio-1.3.0/vendor/socket2/.cargo-checksum.json temporalio-1.3.0/vendor/socket2/.cargo-checksum.json --- temporalio-1.3.0/vendor/socket2/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/socket2/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"Cargo.toml":"b90237dd0094556fa5f270e8d6612dd8d6b4d35244c397c60d6f191b5a8442d7","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397","README.md":"5b9d3a55525334c4abdb992a49f8dd4f9853f3c061e905334c56ab1dba1bb3ff","src/lib.rs":"b4757798ca38b3f9ec9e99aeec3918080f8b52a45d677382ad91c7049b209683","src/sockaddr.rs":"1e3a30766beb175a509ed295148de57a6ce6d39382e68c066a2bc4565fa1f033","src/socket.rs":"a4ef50a384867a2278c5f1bb15d4689394926c8b2fb3f840d25ae4f6000e54cf","src/sockref.rs":"7e16a5300cdd003e591486cb3bd384bdb92044e940e3ddf327da27935dc51e22","src/sys/unix.rs":"40c7ac6af023844b74f0824a9fe4df5b3a9b37c9288aed97c10529e4fbd1e2c8","src/sys/windows.rs":"ab92ae1e961413673c58bcad42a28eedebc0b2e7f82f38908839d13cc5bbca7f"},"package":"7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9"} \ No newline at end of file +{"files":{"Cargo.toml":"295835834de15ff318e7962ae780888a9cc32e7677442cc2f0e9bd1d5ae78579","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397","README.md":"5b9d3a55525334c4abdb992a49f8dd4f9853f3c061e905334c56ab1dba1bb3ff","src/lib.rs":"57b05305e77fc03dcfdbaa2f5309229a4ea5f61f4f29325c7c629e1f8d092b33","src/sockaddr.rs":"ee416fcfbffbf9c423b5e743f634653a905fb8637ba84739bca8050fcf2049ff","src/socket.rs":"49bf1fe386f82735e5fb7de6c1044fc8ad96f74d40cba250351cfe42a72f8d1f","src/sockref.rs":"7e16a5300cdd003e591486cb3bd384bdb92044e940e3ddf327da27935dc51e22","src/sys/unix.rs":"bf3af8d705de88373c542ccca716951896e44026ec366000f4608a2fd59f7861","src/sys/windows.rs":"7e4e700282cb480e99dc0603a7cdcd7111cb60a50cafc28d62247df570b1694b"},"package":"2538b18701741680e0322a2302176d3253a35388e2e62f172f64f4f16605f877"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/socket2/Cargo.toml temporalio-1.3.0/vendor/socket2/Cargo.toml --- temporalio-1.3.0/vendor/socket2/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/socket2/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -13,7 +13,7 @@ edition = "2021" rust-version = "1.63" name = "socket2" -version = "0.5.5" +version = "0.5.3" authors = [ "Alex Crichton ", "Thomas de Zeeuw ", @@ -74,7 +74,7 @@ all = [] [target."cfg(unix)".dependencies.libc] -version = "0.2.149" +version = "0.2.141" [target."cfg(windows)".dependencies.windows-sys] version = "0.48" diff -Nru temporalio-1.3.0/vendor/socket2/src/lib.rs temporalio-1.3.0/vendor/socket2/src/lib.rs --- temporalio-1.3.0/vendor/socket2/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/socket2/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -59,12 +59,6 @@ #![doc(test(attr(deny(warnings))))] use std::fmt; -#[cfg(not(target_os = "redox"))] -use std::io::IoSlice; -#[cfg(not(target_os = "redox"))] -use std::marker::PhantomData; -#[cfg(not(target_os = "redox"))] -use std::mem; use std::mem::MaybeUninit; use std::net::SocketAddr; use std::ops::{Deref, DerefMut}; @@ -270,16 +264,13 @@ pub const DCCP: Type = Type(sys::SOCK_DCCP); /// Type corresponding to `SOCK_SEQPACKET`. - #[cfg(all(feature = "all", not(target_os = "espidf")))] - #[cfg_attr(docsrs, doc(cfg(all(feature = "all", not(target_os = "espidf")))))] + #[cfg(feature = "all")] + #[cfg_attr(docsrs, doc(cfg(feature = "all")))] pub const SEQPACKET: Type = Type(sys::SOCK_SEQPACKET); /// Type corresponding to `SOCK_RAW`. - #[cfg(all(feature = "all", not(any(target_os = "redox", target_os = "espidf"))))] - #[cfg_attr( - docsrs, - doc(cfg(all(feature = "all", not(any(target_os = "redox", target_os = "espidf"))))) - )] + #[cfg(all(feature = "all", not(target_os = "redox")))] + #[cfg_attr(docsrs, doc(cfg(all(feature = "all", not(target_os = "redox")))))] pub const RAW: Type = Type(sys::SOCK_RAW); } @@ -342,10 +333,6 @@ ) ))] pub const UDPLITE: Protocol = Protocol(sys::IPPROTO_UDPLITE); - - /// Protocol corresponding to `DIVERT`. - #[cfg(all(feature = "all", any(target_os = "freebsd", target_os = "openbsd")))] - pub const DIVERT: Protocol = Protocol(sys::IPPROTO_DIVERT); } impl From for Protocol { @@ -377,7 +364,6 @@ /// /// On Unix this corresponds to the `MSG_TRUNC` flag. /// On Windows this corresponds to the `WSAEMSGSIZE` error code. - #[cfg(not(target_os = "espidf"))] pub const fn is_truncated(self) -> bool { self.0 & sys::MSG_TRUNC != 0 } @@ -425,15 +411,13 @@ /// See [`Socket::set_tcp_keepalive`]. #[derive(Debug, Clone)] pub struct TcpKeepalive { - #[cfg_attr(any(target_os = "openbsd", target_os = "vita"), allow(dead_code))] + #[cfg_attr(target_os = "openbsd", allow(dead_code))] time: Option, #[cfg(not(any( target_os = "openbsd", target_os = "redox", target_os = "solaris", target_os = "nto", - target_os = "espidf", - target_os = "vita", )))] interval: Option, #[cfg(not(any( @@ -442,8 +426,6 @@ target_os = "solaris", target_os = "windows", target_os = "nto", - target_os = "espidf", - target_os = "vita", )))] retries: Option, } @@ -458,8 +440,6 @@ target_os = "redox", target_os = "solaris", target_os = "nto", - target_os = "espidf", - target_os = "vita", )))] interval: None, #[cfg(not(any( @@ -468,8 +448,6 @@ target_os = "solaris", target_os = "windows", target_os = "nto", - target_os = "espidf", - target_os = "vita", )))] retries: None, } @@ -584,139 +562,3 @@ } } } - -/// Configuration of a `sendmsg(2)` system call. -/// -/// This wraps `msghdr` on Unix and `WSAMSG` on Windows. Also see [`MsgHdrMut`] -/// for the variant used by `recvmsg(2)`. -#[cfg(not(target_os = "redox"))] -pub struct MsgHdr<'addr, 'bufs, 'control> { - inner: sys::msghdr, - #[allow(clippy::type_complexity)] - _lifetimes: PhantomData<(&'addr SockAddr, &'bufs IoSlice<'bufs>, &'control [u8])>, -} - -#[cfg(not(target_os = "redox"))] -impl<'addr, 'bufs, 'control> MsgHdr<'addr, 'bufs, 'control> { - /// Create a new `MsgHdr` with all empty/zero fields. - #[allow(clippy::new_without_default)] - pub fn new() -> MsgHdr<'addr, 'bufs, 'control> { - // SAFETY: all zero is valid for `msghdr` and `WSAMSG`. - MsgHdr { - inner: unsafe { mem::zeroed() }, - _lifetimes: PhantomData, - } - } - - /// Set the address (name) of the message. - /// - /// Corresponds to setting `msg_name` and `msg_namelen` on Unix and `name` - /// and `namelen` on Windows. - pub fn with_addr(mut self, addr: &'addr SockAddr) -> Self { - sys::set_msghdr_name(&mut self.inner, addr); - self - } - - /// Set the buffer(s) of the message. - /// - /// Corresponds to setting `msg_iov` and `msg_iovlen` on Unix and `lpBuffers` - /// and `dwBufferCount` on Windows. - pub fn with_buffers(mut self, bufs: &'bufs [IoSlice<'_>]) -> Self { - let ptr = bufs.as_ptr() as *mut _; - sys::set_msghdr_iov(&mut self.inner, ptr, bufs.len()); - self - } - - /// Set the control buffer of the message. - /// - /// Corresponds to setting `msg_control` and `msg_controllen` on Unix and - /// `Control` on Windows. - pub fn with_control(mut self, buf: &'control [u8]) -> Self { - let ptr = buf.as_ptr() as *mut _; - sys::set_msghdr_control(&mut self.inner, ptr, buf.len()); - self - } - - /// Set the flags of the message. - /// - /// Corresponds to setting `msg_flags` on Unix and `dwFlags` on Windows. - pub fn with_flags(mut self, flags: sys::c_int) -> Self { - sys::set_msghdr_flags(&mut self.inner, flags); - self - } -} - -#[cfg(not(target_os = "redox"))] -impl<'name, 'bufs, 'control> fmt::Debug for MsgHdr<'name, 'bufs, 'control> { - fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { - "MsgHdr".fmt(fmt) - } -} - -/// Configuration of a `recvmsg(2)` system call. -/// -/// This wraps `msghdr` on Unix and `WSAMSG` on Windows. Also see [`MsgHdr`] for -/// the variant used by `sendmsg(2)`. -#[cfg(not(target_os = "redox"))] -pub struct MsgHdrMut<'addr, 'bufs, 'control> { - inner: sys::msghdr, - #[allow(clippy::type_complexity)] - _lifetimes: PhantomData<( - &'addr mut SockAddr, - &'bufs mut MaybeUninitSlice<'bufs>, - &'control mut [u8], - )>, -} - -#[cfg(not(target_os = "redox"))] -impl<'addr, 'bufs, 'control> MsgHdrMut<'addr, 'bufs, 'control> { - /// Create a new `MsgHdrMut` with all empty/zero fields. - #[allow(clippy::new_without_default)] - pub fn new() -> MsgHdrMut<'addr, 'bufs, 'control> { - // SAFETY: all zero is valid for `msghdr` and `WSAMSG`. - MsgHdrMut { - inner: unsafe { mem::zeroed() }, - _lifetimes: PhantomData, - } - } - - /// Set the mutable address (name) of the message. - /// - /// Corresponds to setting `msg_name` and `msg_namelen` on Unix and `name` - /// and `namelen` on Windows. - #[allow(clippy::needless_pass_by_ref_mut)] - pub fn with_addr(mut self, addr: &'addr mut SockAddr) -> Self { - sys::set_msghdr_name(&mut self.inner, addr); - self - } - - /// Set the mutable buffer(s) of the message. - /// - /// Corresponds to setting `msg_iov` and `msg_iovlen` on Unix and `lpBuffers` - /// and `dwBufferCount` on Windows. - pub fn with_buffers(mut self, bufs: &'bufs mut [MaybeUninitSlice<'_>]) -> Self { - sys::set_msghdr_iov(&mut self.inner, bufs.as_mut_ptr().cast(), bufs.len()); - self - } - - /// Set the mutable control buffer of the message. - /// - /// Corresponds to setting `msg_control` and `msg_controllen` on Unix and - /// `Control` on Windows. - pub fn with_control(mut self, buf: &'control mut [MaybeUninit]) -> Self { - sys::set_msghdr_control(&mut self.inner, buf.as_mut_ptr().cast(), buf.len()); - self - } - - /// Returns the flags of the message. - pub fn flags(&self) -> RecvFlags { - sys::msghdr_flags(&self.inner) - } -} - -#[cfg(not(target_os = "redox"))] -impl<'name, 'bufs, 'control> fmt::Debug for MsgHdrMut<'name, 'bufs, 'control> { - fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { - "MsgHdrMut".fmt(fmt) - } -} diff -Nru temporalio-1.3.0/vendor/socket2/src/sockaddr.rs temporalio-1.3.0/vendor/socket2/src/sockaddr.rs --- temporalio-1.3.0/vendor/socket2/src/sockaddr.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/socket2/src/sockaddr.rs 2023-10-30 19:40:00.000000000 +0000 @@ -205,6 +205,12 @@ self.storage.ss_family == AF_UNIX as sa_family_t } + /// Returns a raw pointer to the address storage. + #[cfg(all(unix, not(target_os = "redox")))] + pub(crate) const fn as_storage_ptr(&self) -> *const sockaddr_storage { + &self.storage + } + /// Returns this address as a `SocketAddr` if it is in the `AF_INET` (IPv4) /// or `AF_INET6` (IPv6) family, otherwise returns `None`. pub fn as_socket(&self) -> Option { @@ -285,23 +291,6 @@ storage.sin_zero = Default::default(); mem::size_of::() as socklen_t }; - #[cfg(any( - target_os = "dragonfly", - target_os = "freebsd", - target_os = "haiku", - target_os = "hermit", - target_os = "ios", - target_os = "macos", - target_os = "netbsd", - target_os = "nto", - target_os = "openbsd", - target_os = "tvos", - target_os = "vxworks", - target_os = "watchos", - ))] - { - storage.ss_len = len as u8; - } SockAddr { storage, len } } } @@ -328,23 +317,6 @@ } mem::size_of::() as socklen_t }; - #[cfg(any( - target_os = "dragonfly", - target_os = "freebsd", - target_os = "haiku", - target_os = "hermit", - target_os = "ios", - target_os = "macos", - target_os = "netbsd", - target_os = "nto", - target_os = "openbsd", - target_os = "tvos", - target_os = "vxworks", - target_os = "watchos", - ))] - { - storage.ss_len = len as u8; - } SockAddr { storage, len } } } diff -Nru temporalio-1.3.0/vendor/socket2/src/socket.rs temporalio-1.3.0/vendor/socket2/src/socket.rs --- temporalio-1.3.0/vendor/socket2/src/socket.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/socket2/src/socket.rs 2023-10-30 19:40:00.000000000 +0000 @@ -21,11 +21,9 @@ use std::time::Duration; use crate::sys::{self, c_int, getsockopt, setsockopt, Bool}; -#[cfg(all(unix, not(target_os = "redox")))] -use crate::MsgHdrMut; use crate::{Domain, Protocol, SockAddr, TcpKeepalive, Type}; #[cfg(not(target_os = "redox"))] -use crate::{MaybeUninitSlice, MsgHdr, RecvFlags}; +use crate::{MaybeUninitSlice, RecvFlags}; /// Owned wrapper around a system socket. /// @@ -48,8 +46,8 @@ /// # Notes /// /// Some methods that set options on `Socket` require two system calls to set -/// their options without overwriting previously set options. We do this by -/// first getting the current settings, applying the desired changes, and then +/// there options without overwriting previously set options. We do this by +/// first getting the current settings, applying the desired changes and than /// updating the settings. This means that the operation is **not** atomic. This /// can lead to a data race when two threads are changing options in parallel. /// @@ -629,19 +627,6 @@ sys::peek_sender(self.as_raw()) } - /// Receive a message from a socket using a message structure. - /// - /// This is not supported on Windows as calling `WSARecvMsg` (the `recvmsg` - /// equivalent) is not straight forward on Windows. See - /// - /// for an example (in C++). - #[doc = man_links!(recvmsg(2))] - #[cfg(all(unix, not(target_os = "redox")))] - #[cfg_attr(docsrs, doc(cfg(all(unix, not(target_os = "redox")))))] - pub fn recvmsg(&self, msg: &mut MsgHdrMut<'_, '_, '_>, flags: sys::c_int) -> io::Result { - sys::recvmsg(self.as_raw(), msg, flags) - } - /// Sends data on the socket to a connected peer. /// /// This is typically used on TCP sockets or datagram sockets which have @@ -740,14 +725,6 @@ ) -> io::Result { sys::send_to_vectored(self.as_raw(), bufs, addr, flags) } - - /// Send a message on a socket using a message structure. - #[doc = man_links!(sendmsg(2))] - #[cfg(not(target_os = "redox"))] - #[cfg_attr(docsrs, doc(cfg(not(target_os = "redox"))))] - pub fn sendmsg(&self, msg: &MsgHdr<'_, '_, '_>, flags: sys::c_int) -> io::Result { - sys::sendmsg(self.as_raw(), msg, flags) - } } /// Set `SOCK_CLOEXEC` and `NO_HANDLE_INHERIT` on the `ty`pe on platforms that @@ -790,8 +767,6 @@ target_os = "linux", target_os = "netbsd", target_os = "openbsd", - target_os = "espidf", - target_os = "vita", )) ))] socket._set_cloexec(true)?; @@ -1110,11 +1085,8 @@ /// For more information about this option, see [`set_header_included`]. /// /// [`set_header_included`]: Socket::set_header_included - #[cfg(all(feature = "all", not(any(target_os = "redox", target_os = "espidf"))))] - #[cfg_attr( - docsrs, - doc(cfg(all(feature = "all", not(any(target_os = "redox", target_os = "espidf"))))) - )] + #[cfg(all(feature = "all", not(target_os = "redox")))] + #[cfg_attr(docsrs, doc(cfg(all(feature = "all", not(target_os = "redox")))))] pub fn header_included(&self) -> io::Result { unsafe { getsockopt::(self.as_raw(), sys::IPPROTO_IP, sys::IP_HDRINCL) @@ -1137,11 +1109,8 @@ any(target_os = "fuchsia", target_os = "illumos", target_os = "solaris"), allow(rustdoc::broken_intra_doc_links) )] - #[cfg(all(feature = "all", not(any(target_os = "redox", target_os = "espidf"))))] - #[cfg_attr( - docsrs, - doc(cfg(all(feature = "all", not(any(target_os = "redox", target_os = "espidf"))))) - )] + #[cfg(all(feature = "all", not(target_os = "redox")))] + #[cfg_attr(docsrs, doc(cfg(all(feature = "all", not(target_os = "redox")))))] pub fn set_header_included(&self, included: bool) -> io::Result<()> { unsafe { setsockopt( @@ -1245,8 +1214,6 @@ target_os = "redox", target_os = "solaris", target_os = "nto", - target_os = "espidf", - target_os = "vita", )))] pub fn join_multicast_v4_n( &self, @@ -1278,8 +1245,6 @@ target_os = "redox", target_os = "solaris", target_os = "nto", - target_os = "espidf", - target_os = "vita", )))] pub fn leave_multicast_v4_n( &self, @@ -1312,8 +1277,6 @@ target_os = "redox", target_os = "fuchsia", target_os = "nto", - target_os = "espidf", - target_os = "vita", )))] pub fn join_ssm_v4( &self, @@ -1349,8 +1312,6 @@ target_os = "redox", target_os = "fuchsia", target_os = "nto", - target_os = "espidf", - target_os = "vita", )))] pub fn leave_ssm_v4( &self, @@ -1528,8 +1489,6 @@ target_os = "solaris", target_os = "haiku", target_os = "nto", - target_os = "espidf", - target_os = "vita", )))] pub fn set_recv_tos(&self, recv_tos: bool) -> io::Result<()> { unsafe { @@ -1558,8 +1517,6 @@ target_os = "solaris", target_os = "haiku", target_os = "nto", - target_os = "espidf", - target_os = "vita", )))] pub fn recv_tos(&self) -> io::Result { unsafe { @@ -1775,8 +1732,6 @@ target_os = "redox", target_os = "solaris", target_os = "haiku", - target_os = "espidf", - target_os = "vita", )))] pub fn recv_tclass_v6(&self) -> io::Result { unsafe { @@ -1799,8 +1754,6 @@ target_os = "redox", target_os = "solaris", target_os = "haiku", - target_os = "espidf", - target_os = "vita", )))] pub fn set_recv_tclass_v6(&self, recv_tclass: bool) -> io::Result<()> { unsafe { @@ -1826,23 +1779,13 @@ /// supported Unix operating systems. #[cfg(all( feature = "all", - not(any( - windows, - target_os = "haiku", - target_os = "openbsd", - target_os = "vita" - )) + not(any(windows, target_os = "haiku", target_os = "openbsd")) ))] #[cfg_attr( docsrs, doc(cfg(all( feature = "all", - not(any( - windows, - target_os = "haiku", - target_os = "openbsd", - target_os = "vita" - )) + not(any(windows, target_os = "haiku", target_os = "openbsd")) ))) )] pub fn keepalive_time(&self) -> io::Result { diff -Nru temporalio-1.3.0/vendor/socket2/src/sys/unix.rs temporalio-1.3.0/vendor/socket2/src/sys/unix.rs --- temporalio-1.3.0/vendor/socket2/src/sys/unix.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/socket2/src/sys/unix.rs 2023-10-30 19:40:00.000000000 +0000 @@ -70,9 +70,9 @@ use libc::ssize_t; use libc::{in6_addr, in_addr}; -use crate::{Domain, Protocol, SockAddr, TcpKeepalive, Type}; #[cfg(not(target_os = "redox"))] -use crate::{MsgHdr, MsgHdrMut, RecvFlags}; +use crate::RecvFlags; +use crate::{Domain, Protocol, SockAddr, TcpKeepalive, Type}; pub(crate) use libc::c_int; @@ -81,9 +81,9 @@ // Used in `Type`. #[cfg(all(feature = "all", target_os = "linux"))] pub(crate) use libc::SOCK_DCCP; -#[cfg(all(feature = "all", not(any(target_os = "redox", target_os = "espidf"))))] +#[cfg(all(feature = "all", not(target_os = "redox")))] pub(crate) use libc::SOCK_RAW; -#[cfg(all(feature = "all", not(target_os = "espidf")))] +#[cfg(feature = "all")] pub(crate) use libc::SOCK_SEQPACKET; pub(crate) use libc::{SOCK_DGRAM, SOCK_STREAM}; // Used in `Protocol`. @@ -105,16 +105,12 @@ pub(crate) use libc::IPPROTO_UDPLITE; pub(crate) use libc::{IPPROTO_ICMP, IPPROTO_ICMPV6, IPPROTO_TCP, IPPROTO_UDP}; // Used in `SockAddr`. -#[cfg(all(feature = "all", any(target_os = "freebsd", target_os = "openbsd")))] -pub(crate) use libc::IPPROTO_DIVERT; pub(crate) use libc::{ sa_family_t, sockaddr, sockaddr_in, sockaddr_in6, sockaddr_storage, socklen_t, }; // Used in `RecvFlags`. -#[cfg(not(any(target_os = "redox", target_os = "espidf")))] -pub(crate) use libc::MSG_TRUNC; #[cfg(not(target_os = "redox"))] -pub(crate) use libc::SO_OOBINLINE; +pub(crate) use libc::{MSG_TRUNC, SO_OOBINLINE}; // Used in `Socket`. #[cfg(not(target_os = "nto"))] pub(crate) use libc::ipv6_mreq as Ipv6Mreq; @@ -127,11 +123,9 @@ target_os = "redox", target_os = "solaris", target_os = "haiku", - target_os = "espidf", - target_os = "vita", )))] pub(crate) use libc::IPV6_RECVTCLASS; -#[cfg(all(feature = "all", not(any(target_os = "redox", target_os = "espidf"))))] +#[cfg(all(feature = "all", not(target_os = "redox")))] pub(crate) use libc::IP_HDRINCL; #[cfg(not(any( target_os = "aix", @@ -144,8 +138,6 @@ target_os = "solaris", target_os = "haiku", target_os = "nto", - target_os = "espidf", - target_os = "vita", )))] pub(crate) use libc::IP_RECVTOS; #[cfg(not(any( @@ -184,8 +176,6 @@ target_os = "redox", target_os = "fuchsia", target_os = "nto", - target_os = "espidf", - target_os = "vita", )))] pub(crate) use libc::{ ip_mreq_source as IpMreqSource, IP_ADD_SOURCE_MEMBERSHIP, IP_DROP_SOURCE_MEMBERSHIP, @@ -258,7 +248,6 @@ target_os = "openbsd", target_os = "tvos", target_os = "watchos", - target_os = "vita", )))] use libc::TCP_KEEPIDLE as KEEPALIVE_TIME; @@ -338,8 +327,6 @@ target_os = "solaris", target_os = "tvos", target_os = "watchos", - target_os = "espidf", - target_os = "vita", ))] type IovLen = c_int; @@ -482,11 +469,10 @@ libc::SOCK_DGRAM, #[cfg(all(feature = "all", target_os = "linux"))] libc::SOCK_DCCP, - #[cfg(not(any(target_os = "redox", target_os = "espidf")))] + #[cfg(not(target_os = "redox"))] libc::SOCK_RAW, - #[cfg(not(any(target_os = "redox", target_os = "haiku", target_os = "espidf")))] + #[cfg(not(any(target_os = "redox", target_os = "haiku")))] libc::SOCK_RDM, - #[cfg(not(target_os = "espidf"))] libc::SOCK_SEQPACKET, /* TODO: add these optional bit OR-ed flags: #[cfg(any( @@ -534,8 +520,6 @@ ) ))] libc::IPPROTO_UDPLITE, - #[cfg(all(feature = "all", any(target_os = "freebsd", target_os = "openbsd")))] - libc::IPPROTO_DIVERT, ); /// Unix-only API. @@ -550,7 +534,6 @@ /// On Unix this corresponds to the `MSG_EOR` flag. /// /// [`SEQPACKET`]: Type::SEQPACKET - #[cfg(not(target_os = "espidf"))] pub const fn is_end_of_record(self) -> bool { self.0 & libc::MSG_EOR != 0 } @@ -569,13 +552,11 @@ #[cfg(not(target_os = "redox"))] impl std::fmt::Debug for RecvFlags { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - let mut s = f.debug_struct("RecvFlags"); - #[cfg(not(target_os = "espidf"))] - s.field("is_end_of_record", &self.is_end_of_record()); - s.field("is_out_of_band", &self.is_out_of_band()); - #[cfg(not(target_os = "espidf"))] - s.field("is_truncated", &self.is_truncated()); - s.finish() + f.debug_struct("RecvFlags") + .field("is_end_of_record", &self.is_end_of_record()) + .field("is_out_of_band", &self.is_out_of_band()) + .field("is_truncated", &self.is_truncated()) + .finish() } } @@ -661,39 +642,6 @@ Ok(unsafe { SockAddr::new(storage, len as socklen_t) }) } -// Used in `MsgHdr`. -#[cfg(not(target_os = "redox"))] -pub(crate) use libc::msghdr; - -#[cfg(not(target_os = "redox"))] -pub(crate) fn set_msghdr_name(msg: &mut msghdr, name: &SockAddr) { - msg.msg_name = name.as_ptr() as *mut _; - msg.msg_namelen = name.len(); -} - -#[cfg(not(target_os = "redox"))] -#[allow(clippy::unnecessary_cast)] // IovLen type can be `usize`. -pub(crate) fn set_msghdr_iov(msg: &mut msghdr, ptr: *mut libc::iovec, len: usize) { - msg.msg_iov = ptr; - msg.msg_iovlen = min(len, IovLen::MAX as usize) as IovLen; -} - -#[cfg(not(target_os = "redox"))] -pub(crate) fn set_msghdr_control(msg: &mut msghdr, ptr: *mut libc::c_void, len: usize) { - msg.msg_control = ptr; - msg.msg_controllen = len as _; -} - -#[cfg(not(target_os = "redox"))] -pub(crate) fn set_msghdr_flags(msg: &mut msghdr, flags: libc::c_int) { - msg.msg_flags = flags; -} - -#[cfg(not(target_os = "redox"))] -pub(crate) fn msghdr_flags(msg: &msghdr) -> RecvFlags { - RecvFlags(msg.msg_flags) -} - /// Unix only API. impl SockAddr { /// Constructs a `SockAddr` with the family `AF_VSOCK` and the provided CID/port. @@ -933,20 +881,12 @@ syscall!(fcntl(fd, libc::F_DUPFD_CLOEXEC, 0)) } -#[cfg(all(feature = "all", unix, not(target_os = "vita")))] +#[cfg(all(feature = "all", unix))] pub(crate) fn nonblocking(fd: Socket) -> io::Result { let file_status_flags = fcntl_get(fd, libc::F_GETFL)?; Ok((file_status_flags & libc::O_NONBLOCK) != 0) } -#[cfg(all(feature = "all", target_os = "vita"))] -pub(crate) fn nonblocking(fd: Socket) -> io::Result { - unsafe { - getsockopt::(fd, libc::SOL_SOCKET, libc::SO_NONBLOCK).map(|non_block| non_block != 0) - } -} - -#[cfg(not(target_os = "vita"))] pub(crate) fn set_nonblocking(fd: Socket, nonblocking: bool) -> io::Result<()> { if nonblocking { fcntl_add(fd, libc::F_GETFL, libc::F_SETFL, libc::O_NONBLOCK) @@ -955,18 +895,6 @@ } } -#[cfg(target_os = "vita")] -pub(crate) fn set_nonblocking(fd: Socket, nonblocking: bool) -> io::Result<()> { - unsafe { - setsockopt( - fd, - libc::SOL_SOCKET, - libc::SO_NONBLOCK, - nonblocking as libc::c_int, - ) - } -} - pub(crate) fn shutdown(fd: Socket, how: Shutdown) -> io::Result<()> { let how = match how { Shutdown::Write => libc::SHUT_WR, @@ -1022,9 +950,7 @@ bufs: &mut [crate::MaybeUninitSlice<'_>], flags: c_int, ) -> io::Result<(usize, RecvFlags)> { - let mut msg = MsgHdrMut::new().with_buffers(bufs); - let n = recvmsg(fd, &mut msg, flags)?; - Ok((n, msg.flags())) + recvmsg(fd, ptr::null_mut(), bufs, flags).map(|(n, _, recv_flags)| (n, recv_flags)) } #[cfg(not(target_os = "redox"))] @@ -1033,29 +959,42 @@ bufs: &mut [crate::MaybeUninitSlice<'_>], flags: c_int, ) -> io::Result<(usize, RecvFlags, SockAddr)> { - let mut msg = MsgHdrMut::new().with_buffers(bufs); - // SAFETY: `recvmsg` initialises the address storage and we set the length + // Safety: `recvmsg` initialises the address storage and we set the length // manually. - let (n, addr) = unsafe { + unsafe { SockAddr::try_init(|storage, len| { - msg.inner.msg_name = storage.cast(); - msg.inner.msg_namelen = *len; - let n = recvmsg(fd, &mut msg, flags)?; - // Set the correct address length. - *len = msg.inner.msg_namelen; - Ok(n) - })? - }; - Ok((n, msg.flags(), addr)) + recvmsg(fd, storage, bufs, flags).map(|(n, addrlen, recv_flags)| { + // Set the correct address length. + *len = addrlen; + (n, recv_flags) + }) + }) + } + .map(|((n, recv_flags), addr)| (n, recv_flags, addr)) } +/// Returns the (bytes received, sending address len, `RecvFlags`). #[cfg(not(target_os = "redox"))] -pub(crate) fn recvmsg( +#[allow(clippy::unnecessary_cast)] // For `IovLen::MAX as usize` (Already `usize` on Linux). +fn recvmsg( fd: Socket, - msg: &mut MsgHdrMut<'_, '_, '_>, + msg_name: *mut sockaddr_storage, + bufs: &mut [crate::MaybeUninitSlice<'_>], flags: c_int, -) -> io::Result { - syscall!(recvmsg(fd, &mut msg.inner, flags)).map(|n| n as usize) +) -> io::Result<(usize, libc::socklen_t, RecvFlags)> { + let msg_namelen = if msg_name.is_null() { + 0 + } else { + size_of::() as libc::socklen_t + }; + // libc::msghdr contains unexported padding fields on Fuchsia. + let mut msg: libc::msghdr = unsafe { mem::zeroed() }; + msg.msg_name = msg_name.cast(); + msg.msg_namelen = msg_namelen; + msg.msg_iov = bufs.as_mut_ptr().cast(); + msg.msg_iovlen = min(bufs.len(), IovLen::MAX as usize) as IovLen; + syscall!(recvmsg(fd, &mut msg, flags)) + .map(|n| (n as usize, msg.msg_namelen, RecvFlags(msg.msg_flags))) } pub(crate) fn send(fd: Socket, buf: &[u8], flags: c_int) -> io::Result { @@ -1070,8 +1009,7 @@ #[cfg(not(target_os = "redox"))] pub(crate) fn send_vectored(fd: Socket, bufs: &[IoSlice<'_>], flags: c_int) -> io::Result { - let msg = MsgHdr::new().with_buffers(bufs); - sendmsg(fd, &msg, flags) + sendmsg(fd, ptr::null(), 0, bufs, flags) } pub(crate) fn send_to(fd: Socket, buf: &[u8], addr: &SockAddr, flags: c_int) -> io::Result { @@ -1093,13 +1031,30 @@ addr: &SockAddr, flags: c_int, ) -> io::Result { - let msg = MsgHdr::new().with_addr(addr).with_buffers(bufs); - sendmsg(fd, &msg, flags) + sendmsg(fd, addr.as_storage_ptr(), addr.len(), bufs, flags) } +/// Returns the (bytes received, sending address len, `RecvFlags`). #[cfg(not(target_os = "redox"))] -pub(crate) fn sendmsg(fd: Socket, msg: &MsgHdr<'_, '_, '_>, flags: c_int) -> io::Result { - syscall!(sendmsg(fd, &msg.inner, flags)).map(|n| n as usize) +#[allow(clippy::unnecessary_cast)] // For `IovLen::MAX as usize` (Already `usize` on Linux). +fn sendmsg( + fd: Socket, + msg_name: *const sockaddr_storage, + msg_namelen: socklen_t, + bufs: &[IoSlice<'_>], + flags: c_int, +) -> io::Result { + // libc::msghdr contains unexported padding fields on Fuchsia. + let mut msg: libc::msghdr = unsafe { mem::zeroed() }; + // Safety: we're creating a `*mut` pointer from a reference, which is UB + // once actually used. However the OS should not write to it in the + // `sendmsg` system call. + msg.msg_name = (msg_name as *mut sockaddr_storage).cast(); + msg.msg_namelen = msg_namelen; + // Safety: Same as above about `*const` -> `*mut`. + msg.msg_iov = bufs.as_ptr() as *mut _; + msg.msg_iovlen = min(bufs.len(), IovLen::MAX as usize) as IovLen; + syscall!(sendmsg(fd, &msg, flags)).map(|n| n as usize) } /// Wrapper around `getsockopt` to deal with platform specific timeouts. @@ -1143,16 +1098,10 @@ } } -#[cfg(all( - feature = "all", - not(any(target_os = "haiku", target_os = "openbsd", target_os = "vita")) -))] +#[cfg(all(feature = "all", not(any(target_os = "haiku", target_os = "openbsd"))))] #[cfg_attr( docsrs, - doc(cfg(all( - feature = "all", - not(any(target_os = "haiku", target_os = "openbsd", target_os = "vita")) - ))) + doc(cfg(all(feature = "all", not(any(target_os = "haiku", target_os = "openbsd"))))) )] pub(crate) fn keepalive_time(fd: Socket) -> io::Result { unsafe { @@ -1163,12 +1112,7 @@ #[allow(unused_variables)] pub(crate) fn set_tcp_keepalive(fd: Socket, keepalive: &TcpKeepalive) -> io::Result<()> { - #[cfg(not(any( - target_os = "haiku", - target_os = "openbsd", - target_os = "nto", - target_os = "vita" - )))] + #[cfg(not(any(target_os = "haiku", target_os = "openbsd", target_os = "nto")))] if let Some(time) = keepalive.time { let secs = into_secs(time); unsafe { setsockopt(fd, libc::IPPROTO_TCP, KEEPALIVE_TIME, secs)? } @@ -1208,24 +1152,17 @@ Ok(()) } -#[cfg(not(any( - target_os = "haiku", - target_os = "openbsd", - target_os = "nto", - target_os = "vita" -)))] +#[cfg(not(any(target_os = "haiku", target_os = "openbsd", target_os = "nto")))] fn into_secs(duration: Duration) -> c_int { min(duration.as_secs(), c_int::MAX as u64) as c_int } /// Get the flags using `cmd`. -#[cfg(not(target_os = "vita"))] fn fcntl_get(fd: Socket, cmd: c_int) -> io::Result { syscall!(fcntl(fd, cmd)) } /// Add `flag` to the current set flags of `F_GETFD`. -#[cfg(not(target_os = "vita"))] fn fcntl_add(fd: Socket, get_cmd: c_int, set_cmd: c_int, flag: c_int) -> io::Result<()> { let previous = fcntl_get(fd, get_cmd)?; let new = previous | flag; @@ -1238,7 +1175,6 @@ } /// Remove `flag` to the current set flags of `F_GETFD`. -#[cfg(not(target_os = "vita"))] fn fcntl_remove(fd: Socket, get_cmd: c_int, set_cmd: c_int, flag: c_int) -> io::Result<()> { let previous = fcntl_get(fd, get_cmd)?; let new = previous & !flag; @@ -1318,8 +1254,6 @@ target_os = "redox", target_os = "solaris", target_os = "nto", - target_os = "espidf", - target_os = "vita", )))] pub(crate) const fn to_mreqn( multiaddr: &Ipv4Addr, @@ -1416,13 +1350,12 @@ ), allow(rustdoc::broken_intra_doc_links) )] - #[cfg(all(feature = "all", not(target_os = "vita")))] + #[cfg(feature = "all")] #[cfg_attr(docsrs, doc(cfg(all(feature = "all", unix))))] pub fn set_cloexec(&self, close_on_exec: bool) -> io::Result<()> { self._set_cloexec(close_on_exec) } - #[cfg(not(target_os = "vita"))] pub(crate) fn _set_cloexec(&self, close_on_exec: bool) -> io::Result<()> { if close_on_exec { fcntl_add( @@ -1887,8 +1820,8 @@ /// Sets the value for the `SO_SETFIB` option on this socket. /// /// Bind socket to the specified forwarding table (VRF) on a FreeBSD. - #[cfg(all(feature = "all", target_os = "freebsd"))] - #[cfg_attr(docsrs, doc(cfg(all(feature = "all", target_os = "freebsd"))))] + #[cfg(all(feature = "all", any(target_os = "freebsd")))] + #[cfg_attr(docsrs, doc(cfg(all(feature = "all", any(target_os = "freebsd")))))] pub fn set_fib(&self, fib: u32) -> io::Result<()> { syscall!(setsockopt( self.as_raw(), @@ -1900,33 +1833,6 @@ .map(|_| ()) } - /// This method is deprecated, use [`crate::Socket::bind_device_by_index_v4`]. - #[cfg(all( - feature = "all", - any( - target_os = "ios", - target_os = "macos", - target_os = "tvos", - target_os = "watchos", - ) - ))] - #[cfg_attr( - docsrs, - doc(cfg(all( - feature = "all", - any( - target_os = "ios", - target_os = "macos", - target_os = "tvos", - target_os = "watchos", - ) - ))) - )] - #[deprecated = "Use `Socket::bind_device_by_index_v4` instead"] - pub fn bind_device_by_index(&self, interface: Option) -> io::Result<()> { - self.bind_device_by_index_v4(interface) - } - /// Sets the value for `IP_BOUND_IF` option on this socket. /// /// If a socket is bound to an interface, only packets received from that @@ -1958,47 +1864,11 @@ ) ))) )] - pub fn bind_device_by_index_v4(&self, interface: Option) -> io::Result<()> { + pub fn bind_device_by_index(&self, interface: Option) -> io::Result<()> { let index = interface.map_or(0, NonZeroU32::get); unsafe { setsockopt(self.as_raw(), IPPROTO_IP, libc::IP_BOUND_IF, index) } } - /// Sets the value for `IPV6_BOUND_IF` option on this socket. - /// - /// If a socket is bound to an interface, only packets received from that - /// particular interface are processed by the socket. - /// - /// If `interface` is `None`, the binding is removed. If the `interface` - /// index is not valid, an error is returned. - /// - /// One can use [`libc::if_nametoindex`] to convert an interface alias to an - /// index. - #[cfg(all( - feature = "all", - any( - target_os = "ios", - target_os = "macos", - target_os = "tvos", - target_os = "watchos", - ) - ))] - #[cfg_attr( - docsrs, - doc(cfg(all( - feature = "all", - any( - target_os = "ios", - target_os = "macos", - target_os = "tvos", - target_os = "watchos", - ) - ))) - )] - pub fn bind_device_by_index_v6(&self, interface: Option) -> io::Result<()> { - let index = interface.map_or(0, NonZeroU32::get); - unsafe { setsockopt(self.as_raw(), IPPROTO_IPV6, libc::IPV6_BOUND_IF, index) } - } - /// Gets the value for `IP_BOUND_IF` option on this socket, i.e. the index /// for the interface to which the socket is bound. /// @@ -2025,72 +1895,12 @@ ) ))) )] - pub fn device_index_v4(&self) -> io::Result> { + pub fn device_index(&self) -> io::Result> { let index = unsafe { getsockopt::(self.as_raw(), IPPROTO_IP, libc::IP_BOUND_IF)? }; Ok(NonZeroU32::new(index)) } - /// This method is deprecated, use [`crate::Socket::device_index_v4`]. - #[cfg(all( - feature = "all", - any( - target_os = "ios", - target_os = "macos", - target_os = "tvos", - target_os = "watchos", - ) - ))] - #[cfg_attr( - docsrs, - doc(cfg(all( - feature = "all", - any( - target_os = "ios", - target_os = "macos", - target_os = "tvos", - target_os = "watchos", - ) - ))) - )] - #[deprecated = "Use `Socket::device_index_v4` instead"] - pub fn device_index(&self) -> io::Result> { - self.device_index_v4() - } - - /// Gets the value for `IPV6_BOUND_IF` option on this socket, i.e. the index - /// for the interface to which the socket is bound. - /// - /// Returns `None` if the socket is not bound to any interface, otherwise - /// returns an interface index. - #[cfg(all( - feature = "all", - any( - target_os = "ios", - target_os = "macos", - target_os = "tvos", - target_os = "watchos", - ) - ))] - #[cfg_attr( - docsrs, - doc(cfg(all( - feature = "all", - any( - target_os = "ios", - target_os = "macos", - target_os = "tvos", - target_os = "watchos", - ) - ))) - )] - pub fn device_index_v6(&self) -> io::Result> { - let index = unsafe { - getsockopt::(self.as_raw(), IPPROTO_IPV6, libc::IPV6_BOUND_IF)? - }; - Ok(NonZeroU32::new(index)) - } - /// Get the value of the `SO_INCOMING_CPU` option on this socket. /// /// For more information about this option, see [`set_cpu_affinity`]. @@ -2173,35 +1983,6 @@ } } - /// Get the value of the `SO_REUSEPORT_LB` option on this socket. - /// - /// For more information about this option, see [`set_reuse_port_lb`]. - /// - /// [`set_reuse_port_lb`]: crate::Socket::set_reuse_port_lb - #[cfg(all(feature = "all", target_os = "freebsd"))] - pub fn reuse_port_lb(&self) -> io::Result { - unsafe { - getsockopt::(self.as_raw(), libc::SOL_SOCKET, libc::SO_REUSEPORT_LB) - .map(|reuse| reuse != 0) - } - } - - /// Set value for the `SO_REUSEPORT_LB` option on this socket. - /// - /// This allows multiple programs or threads to bind to the same port and - /// incoming connections will be load balanced using a hash function. - #[cfg(all(feature = "all", target_os = "freebsd"))] - pub fn set_reuse_port_lb(&self, reuse: bool) -> io::Result<()> { - unsafe { - setsockopt( - self.as_raw(), - libc::SOL_SOCKET, - libc::SO_REUSEPORT_LB, - reuse as c_int, - ) - } - } - /// Get the value of the `IP_FREEBIND` option on this socket. /// /// For more information about this option, see [`set_freebind`]. @@ -2643,8 +2424,8 @@ /// Therefore, there is no corresponding `set` helper. /// /// For more information about this option, see [Linux patch](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=5daab9db7b65df87da26fd8cfa695fb9546a1ddb) - #[cfg(all(feature = "all", target_os = "linux"))] - #[cfg_attr(docsrs, doc(cfg(all(feature = "all", target_os = "linux"))))] + #[cfg(all(feature = "all", any(target_os = "linux")))] + #[cfg_attr(docsrs, doc(cfg(all(feature = "all", any(target_os = "linux")))))] pub fn cookie(&self) -> io::Result { unsafe { getsockopt::(self.as_raw(), libc::SOL_SOCKET, libc::SO_COOKIE) } } @@ -2754,7 +2535,11 @@ payload.as_mut_ptr().cast(), &mut len, )) - .map(|_| payload[..len as usize].to_vec()) + .map(|_| { + let buf = &payload[..len as usize]; + // TODO: use `MaybeUninit::slice_assume_init_ref` once stable. + unsafe { &*(buf as *const [_] as *const [u8]) }.into() + }) } /// Set the value of the `TCP_CONGESTION` option for this socket. diff -Nru temporalio-1.3.0/vendor/socket2/src/sys/windows.rs temporalio-1.3.0/vendor/socket2/src/sys/windows.rs --- temporalio-1.3.0/vendor/socket2/src/sys/windows.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/socket2/src/sys/windows.rs 2023-10-30 19:40:00.000000000 +0000 @@ -20,8 +20,6 @@ use std::{process, ptr, slice}; use windows_sys::Win32::Foundation::{SetHandleInformation, HANDLE, HANDLE_FLAG_INHERIT}; -#[cfg(feature = "all")] -use windows_sys::Win32::Networking::WinSock::SO_PROTOCOL_INFOW; use windows_sys::Win32::Networking::WinSock::{ self, tcp_keepalive, FIONBIO, IN6_ADDR, IN6_ADDR_0, INVALID_SOCKET, IN_ADDR, IN_ADDR_0, POLLERR, POLLHUP, POLLRDNORM, POLLWRNORM, SD_BOTH, SD_RECEIVE, SD_SEND, SIO_KEEPALIVE_VALS, @@ -30,7 +28,7 @@ }; use windows_sys::Win32::System::Threading::INFINITE; -use crate::{MsgHdr, RecvFlags, SockAddr, TcpKeepalive, Type}; +use crate::{RecvFlags, SockAddr, TcpKeepalive, Type}; #[allow(non_camel_case_types)] pub(crate) type c_int = std::os::raw::c_int; @@ -63,7 +61,7 @@ SOCKADDR_STORAGE as sockaddr_storage, }; #[allow(non_camel_case_types)] -pub(crate) type sa_family_t = windows_sys::Win32::Networking::WinSock::ADDRESS_FAMILY; +pub(crate) type sa_family_t = windows_sys::Win32::Networking::WinSock::sa_family_t; #[allow(non_camel_case_types)] pub(crate) type socklen_t = windows_sys::Win32::Networking::WinSock::socklen_t; // Used in `Socket`. @@ -189,32 +187,6 @@ } } -// Used in `MsgHdr`. -pub(crate) use windows_sys::Win32::Networking::WinSock::WSAMSG as msghdr; - -pub(crate) fn set_msghdr_name(msg: &mut msghdr, name: &SockAddr) { - msg.name = name.as_ptr() as *mut _; - msg.namelen = name.len(); -} - -pub(crate) fn set_msghdr_iov(msg: &mut msghdr, ptr: *mut WSABUF, len: usize) { - msg.lpBuffers = ptr; - msg.dwBufferCount = min(len, u32::MAX as usize) as u32; -} - -pub(crate) fn set_msghdr_control(msg: &mut msghdr, ptr: *mut u8, len: usize) { - msg.Control.buf = ptr; - msg.Control.len = len as u32; -} - -pub(crate) fn set_msghdr_flags(msg: &mut msghdr, flags: c_int) { - msg.dwFlags = flags as u32; -} - -pub(crate) fn msghdr_flags(msg: &msghdr) -> RecvFlags { - RecvFlags(msg.dwFlags as c_int) -} - fn init() { static INIT: Once = Once::new(); @@ -665,23 +637,6 @@ .map(|_| nsent as usize) } -pub(crate) fn sendmsg(socket: Socket, msg: &MsgHdr<'_, '_, '_>, flags: c_int) -> io::Result { - let mut nsent = 0; - syscall!( - WSASendMsg( - socket, - &msg.inner, - flags as u32, - &mut nsent, - ptr::null_mut(), - None, - ), - PartialEq::eq, - SOCKET_ERROR - ) - .map(|_| nsent as usize) -} - /// Wrapper around `getsockopt` to deal with platform specific timeouts. pub(crate) fn timeout_opt(fd: Socket, lvl: c_int, name: i32) -> io::Result> { unsafe { getsockopt(fd, lvl, name).map(from_ms) } @@ -922,21 +877,6 @@ Ok(()) } } - - /// Returns the [`Protocol`] of this socket by checking the `SO_PROTOCOL_INFOW` - /// option on this socket. - /// - /// [`Protocol`]: crate::Protocol - #[cfg(feature = "all")] - pub fn protocol(&self) -> io::Result> { - let info = unsafe { - getsockopt::(self.as_raw(), SOL_SOCKET, SO_PROTOCOL_INFOW)? - }; - match info.iProtocol { - 0 => Ok(None), - p => Ok(Some(crate::Protocol::from(p))), - } - } } #[cfg_attr(docsrs, doc(cfg(windows)))] diff -Nru temporalio-1.3.0/vendor/socket2-0.4.10/.cargo-checksum.json temporalio-1.3.0/vendor/socket2-0.4.10/.cargo-checksum.json --- temporalio-1.3.0/vendor/socket2-0.4.10/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/socket2-0.4.10/.cargo-checksum.json 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -{"files":{"Cargo.toml":"0f84ab2a54b9e7de3e3336672b8512ae454cdd464ed17ec8b411bcfe305a6659","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397","README.md":"b3fadb399050f2755504188e81dec8150f6a1eba86b6410a9ce9c1ea0c850287","src/lib.rs":"ee8b2687408aa92da9e35dc212d84c930910ca88fb64c21e1083f12645f50a26","src/sockaddr.rs":"da05e8851b17914deee8befbaeb9c41e1339cef28b0aba29b3ff9f97ca1c217e","src/socket.rs":"11eb76f6a91d5f1b16ab5077f34c68c14da907c5e6e6df9fb64eaaaa3e88a711","src/sockref.rs":"02de263cce039aaddaee5d6c2bb3940bdfae5697a3fc9df47d226fb3cac03cd9","src/sys/unix.rs":"d531eefd9b496412c45763c9f8340921aa203f7ffef058acf594676eed36e1cc","src/sys/windows.rs":"d271c768295c0f84e79f6286aa783ce15ab0265f150195824fdcd10003dada33"},"package":"9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/socket2-0.4.10/Cargo.toml temporalio-1.3.0/vendor/socket2-0.4.10/Cargo.toml --- temporalio-1.3.0/vendor/socket2-0.4.10/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/socket2-0.4.10/Cargo.toml 1970-01-01 00:00:00.000000000 +0000 @@ -1,68 +0,0 @@ -# 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 = "socket2" -version = "0.4.10" -authors = [ - "Alex Crichton ", - "Thomas de Zeeuw ", -] -include = [ - "Cargo.toml", - "LICENSE-APACHE", - "LICENSE-MIT", - "README.md", - "src/**/*.rs", -] -description = """ -Utilities for handling networking sockets with a maximal amount of configuration -possible intended. -""" -homepage = "https://github.com/rust-lang/socket2" -documentation = "https://docs.rs/socket2" -readme = "README.md" -keywords = [ - "io", - "socket", - "network", -] -categories = [ - "api-bindings", - "network-programming", -] -license = "MIT OR Apache-2.0" -repository = "https://github.com/rust-lang/socket2" - -[package.metadata.docs.rs] -all-features = true -rustdoc-args = [ - "--cfg", - "docsrs", -] - -[package.metadata.playground] -features = ["all"] - -[features] -all = [] - -[target."cfg(unix)".dependencies.libc] -version = "0.2.149" - -[target."cfg(windows)".dependencies.winapi] -version = "0.3.9" -features = [ - "handleapi", - "ws2ipdef", - "ws2tcpip", -] diff -Nru temporalio-1.3.0/vendor/socket2-0.4.10/LICENSE-APACHE temporalio-1.3.0/vendor/socket2-0.4.10/LICENSE-APACHE --- temporalio-1.3.0/vendor/socket2-0.4.10/LICENSE-APACHE 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/socket2-0.4.10/LICENSE-APACHE 1970-01-01 00:00:00.000000000 +0000 @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - -Copyright [yyyy] [name of copyright owner] - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff -Nru temporalio-1.3.0/vendor/socket2-0.4.10/LICENSE-MIT temporalio-1.3.0/vendor/socket2-0.4.10/LICENSE-MIT --- temporalio-1.3.0/vendor/socket2-0.4.10/LICENSE-MIT 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/socket2-0.4.10/LICENSE-MIT 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -Copyright (c) 2014 Alex Crichton - -Permission is hereby granted, free of charge, to any -person obtaining a copy of this software and associated -documentation files (the "Software"), to deal in the -Software without restriction, including without -limitation the rights to use, copy, modify, merge, -publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software -is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice -shall be included in all copies or substantial portions -of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. diff -Nru temporalio-1.3.0/vendor/socket2-0.4.10/README.md temporalio-1.3.0/vendor/socket2-0.4.10/README.md --- temporalio-1.3.0/vendor/socket2-0.4.10/README.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/socket2-0.4.10/README.md 1970-01-01 00:00:00.000000000 +0000 @@ -1,84 +0,0 @@ -# Socket2 - -Socket2 is a crate that provides utilities for creating and using sockets. - -The goal of this crate is to create and use a socket using advanced -configuration options (those that are not available in the types in the standard -library) without using any unsafe code. - -This crate provides as direct as possible access to the system's functionality -for sockets, this means little effort to provide cross-platform utilities. It is -up to the user to know how to use sockets when using this crate. *If you don't -know how to create a socket using libc/system calls then this crate is not for -you*. Most, if not all, functions directly relate to the equivalent system call -with no error handling applied, so no handling errors such as `EINTR`. As a -result using this crate can be a little wordy, but it should give you maximal -flexibility over configuration of sockets. - -See the [API documentation] for more. - -[API documentation]: https://docs.rs/socket2 - -# Two branches - -Currently Socket2 supports two versions: v0.4 and v0.3. Version 0.4 is developed -in the master branch, version 0.3 in the [v0.3.x branch]. - -[v0.3.x branch]: https://github.com/rust-lang/socket2/tree/v0.3.x - -# OS support - -Socket2 attempts to support the same OS/architectures as Rust does, see -https://doc.rust-lang.org/nightly/rustc/platform-support.html. However this is -not always possible, below is current list of support OSs. - -*If your favorite OS is not on the list consider contributing it! See [issue -#78].* - -[issue #78]: https://github.com/rust-lang/socket2/issues/78 - -### Tier 1 - -These OSs are tested with each commit in the CI and must always pass the tests. -All functions/types/etc., excluding ones behind the `all` feature, must work on -these OSs. - -* Linux -* macOS -* Windows - -### Tier 2 - -These OSs are currently build in the CI, but not tested. Not all -functions/types/etc. may work on these OSs, even ones **not** behind the `all` -feature flag. - -* Android -* FreeBSD -* Fuchsia -* iOS -* illumos -* NetBSD -* Redox -* Solaris - -# Minimum Supported Rust Version (MSRV) - -Socket2 uses 1.46.0 as MSRV. - -# License - -This project is licensed under either of - - * Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or - https://www.apache.org/licenses/LICENSE-2.0) - * MIT license ([LICENSE-MIT](LICENSE-MIT) or - https://opensource.org/licenses/MIT) - -at your option. - -### Contribution - -Unless you explicitly state otherwise, any contribution intentionally submitted -for inclusion in this project by you, as defined in the Apache-2.0 license, -shall be dual licensed as above, without any additional terms or conditions. diff -Nru temporalio-1.3.0/vendor/socket2-0.4.10/src/lib.rs temporalio-1.3.0/vendor/socket2-0.4.10/src/lib.rs --- temporalio-1.3.0/vendor/socket2-0.4.10/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/socket2-0.4.10/src/lib.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,487 +0,0 @@ -// Copyright 2015 The Rust Project Developers. -// -// Licensed under the Apache License, Version 2.0 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -//! Utilities for creating and using sockets. -//! -//! The goal of this crate is to create and use a socket using advanced -//! configuration options (those that are not available in the types in the -//! standard library) without using any unsafe code. -//! -//! This crate provides as direct as possible access to the system's -//! functionality for sockets, this means little effort to provide -//! cross-platform utilities. It is up to the user to know how to use sockets -//! when using this crate. *If you don't know how to create a socket using -//! libc/system calls then this crate is not for you*. Most, if not all, -//! functions directly relate to the equivalent system call with no error -//! handling applied, so no handling errors such as [`EINTR`]. As a result using -//! this crate can be a little wordy, but it should give you maximal flexibility -//! over configuration of sockets. -//! -//! [`EINTR`]: std::io::ErrorKind::Interrupted -//! -//! # Examples -//! -//! ```no_run -//! # fn main() -> std::io::Result<()> { -//! use std::net::{SocketAddr, TcpListener}; -//! use socket2::{Socket, Domain, Type}; -//! -//! // Create a TCP listener bound to two addresses. -//! let socket = Socket::new(Domain::IPV6, Type::STREAM, None)?; -//! -//! socket.set_only_v6(false)?; -//! let address: SocketAddr = "[::1]:12345".parse().unwrap(); -//! socket.bind(&address.into())?; -//! socket.listen(128)?; -//! -//! let listener: TcpListener = socket.into(); -//! // ... -//! # drop(listener); -//! # Ok(()) } -//! ``` -//! -//! ## Features -//! -//! This crate has a single feature `all`, which enables all functions even ones -//! that are not available on all OSs. - -#![doc(html_root_url = "https://docs.rs/socket2/0.4")] -#![deny(missing_docs, missing_debug_implementations, rust_2018_idioms)] -// Show required OS/features on docs.rs. -#![cfg_attr(docsrs, feature(doc_cfg))] -// Disallow warnings when running tests. -#![cfg_attr(test, deny(warnings))] -// Disallow warnings in examples. -#![doc(test(attr(deny(warnings))))] - -use std::fmt; -use std::mem::MaybeUninit; -use std::net::SocketAddr; -use std::ops::{Deref, DerefMut}; -use std::time::Duration; - -/// Macro to implement `fmt::Debug` for a type, printing the constant names -/// rather than a number. -/// -/// Note this is used in the `sys` module and thus must be defined before -/// defining the modules. -macro_rules! impl_debug { - ( - // Type name for which to implement `fmt::Debug`. - $type: path, - $( - $(#[$target: meta])* - // The flag(s) to check. - // Need to specific the libc crate because Windows doesn't use - // `libc` but `winapi`. - $libc: ident :: $flag: ident - ),+ $(,)* - ) => { - impl std::fmt::Debug for $type { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - let string = match self.0 { - $( - $(#[$target])* - $libc :: $flag => stringify!($flag), - )+ - n => return write!(f, "{}", n), - }; - f.write_str(string) - } - } - }; -} - -/// Macro to convert from one network type to another. -macro_rules! from { - ($from: ty, $for: ty) => { - impl From<$from> for $for { - fn from(socket: $from) -> $for { - #[cfg(unix)] - unsafe { - <$for>::from_raw_fd(socket.into_raw_fd()) - } - #[cfg(windows)] - unsafe { - <$for>::from_raw_socket(socket.into_raw_socket()) - } - } - } - }; -} - -mod sockaddr; -mod socket; -mod sockref; - -#[cfg_attr(unix, path = "sys/unix.rs")] -#[cfg_attr(windows, path = "sys/windows.rs")] -mod sys; - -#[cfg(not(any(windows, unix)))] -compile_error!("Socket2 doesn't support the compile target"); - -use sys::c_int; - -pub use sockaddr::SockAddr; -pub use socket::Socket; -pub use sockref::SockRef; - -#[cfg(not(any( - target_os = "haiku", - target_os = "illumos", - target_os = "netbsd", - target_os = "redox", - target_os = "solaris", -)))] -pub use socket::InterfaceIndexOrAddress; - -/// Specification of the communication domain for a socket. -/// -/// This is a newtype wrapper around an integer which provides a nicer API in -/// addition to an injection point for documentation. Convenience constants such -/// as [`Domain::IPV4`], [`Domain::IPV6`], etc, are provided to avoid reaching -/// into libc for various constants. -/// -/// This type is freely interconvertible with C's `int` type, however, if a raw -/// value needs to be provided. -#[derive(Copy, Clone, Eq, PartialEq)] -pub struct Domain(c_int); - -impl Domain { - /// Domain for IPv4 communication, corresponding to `AF_INET`. - pub const IPV4: Domain = Domain(sys::AF_INET); - - /// Domain for IPv6 communication, corresponding to `AF_INET6`. - pub const IPV6: Domain = Domain(sys::AF_INET6); - - /// Returns the correct domain for `address`. - pub const fn for_address(address: SocketAddr) -> Domain { - match address { - SocketAddr::V4(_) => Domain::IPV4, - SocketAddr::V6(_) => Domain::IPV6, - } - } -} - -impl From for Domain { - fn from(d: c_int) -> Domain { - Domain(d) - } -} - -impl From for c_int { - fn from(d: Domain) -> c_int { - d.0 - } -} - -/// Specification of communication semantics on a socket. -/// -/// This is a newtype wrapper around an integer which provides a nicer API in -/// addition to an injection point for documentation. Convenience constants such -/// as [`Type::STREAM`], [`Type::DGRAM`], etc, are provided to avoid reaching -/// into libc for various constants. -/// -/// This type is freely interconvertible with C's `int` type, however, if a raw -/// value needs to be provided. -#[derive(Copy, Clone, Eq, PartialEq)] -pub struct Type(c_int); - -impl Type { - /// Type corresponding to `SOCK_STREAM`. - /// - /// Used for protocols such as TCP. - pub const STREAM: Type = Type(sys::SOCK_STREAM); - - /// Type corresponding to `SOCK_DGRAM`. - /// - /// Used for protocols such as UDP. - pub const DGRAM: Type = Type(sys::SOCK_DGRAM); - - /// Type corresponding to `SOCK_SEQPACKET`. - #[cfg(all(feature = "all", not(target_os = "espidf")))] - #[cfg_attr(docsrs, doc(cfg(all(feature = "all", not(target_os = "espidf")))))] - pub const SEQPACKET: Type = Type(sys::SOCK_SEQPACKET); - - /// Type corresponding to `SOCK_RAW`. - #[cfg(all(feature = "all", not(any(target_os = "redox", target_os = "espidf"))))] - #[cfg_attr( - docsrs, - doc(cfg(all(feature = "all", not(any(target_os = "redox", target_os = "espidf"))))) - )] - pub const RAW: Type = Type(sys::SOCK_RAW); -} - -impl From for Type { - fn from(t: c_int) -> Type { - Type(t) - } -} - -impl From for c_int { - fn from(t: Type) -> c_int { - t.0 - } -} - -/// Protocol specification used for creating sockets via `Socket::new`. -/// -/// This is a newtype wrapper around an integer which provides a nicer API in -/// addition to an injection point for documentation. -/// -/// This type is freely interconvertible with C's `int` type, however, if a raw -/// value needs to be provided. -#[derive(Copy, Clone, Eq, PartialEq)] -pub struct Protocol(c_int); - -impl Protocol { - /// Protocol corresponding to `ICMPv4`. - pub const ICMPV4: Protocol = Protocol(sys::IPPROTO_ICMP); - - /// Protocol corresponding to `ICMPv6`. - pub const ICMPV6: Protocol = Protocol(sys::IPPROTO_ICMPV6); - - /// Protocol corresponding to `TCP`. - pub const TCP: Protocol = Protocol(sys::IPPROTO_TCP); - - /// Protocol corresponding to `UDP`. - pub const UDP: Protocol = Protocol(sys::IPPROTO_UDP); -} - -impl From for Protocol { - fn from(p: c_int) -> Protocol { - Protocol(p) - } -} - -impl From for c_int { - fn from(p: Protocol) -> c_int { - p.0 - } -} - -/// Flags for incoming messages. -/// -/// Flags provide additional information about incoming messages. -#[cfg(not(target_os = "redox"))] -#[cfg_attr(docsrs, doc(cfg(not(target_os = "redox"))))] -#[derive(Copy, Clone, Eq, PartialEq)] -pub struct RecvFlags(c_int); - -#[cfg(not(target_os = "redox"))] -impl RecvFlags { - /// Check if the message contains a truncated datagram. - /// - /// This flag is only used for datagram-based sockets, - /// not for stream sockets. - /// - /// On Unix this corresponds to the `MSG_TRUNC` flag. - /// On Windows this corresponds to the `WSAEMSGSIZE` error code. - #[cfg(not(target_os = "espidf"))] - pub const fn is_truncated(self) -> bool { - self.0 & sys::MSG_TRUNC != 0 - } -} - -/// A version of [`IoSliceMut`] that allows the buffer to be uninitialised. -/// -/// [`IoSliceMut`]: std::io::IoSliceMut -#[repr(transparent)] -pub struct MaybeUninitSlice<'a>(sys::MaybeUninitSlice<'a>); - -impl<'a> fmt::Debug for MaybeUninitSlice<'a> { - fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { - fmt::Debug::fmt(self.0.as_slice(), fmt) - } -} - -impl<'a> MaybeUninitSlice<'a> { - /// Creates a new `MaybeUninitSlice` wrapping a byte slice. - /// - /// # Panics - /// - /// Panics on Windows if the slice is larger than 4GB. - pub fn new(buf: &'a mut [MaybeUninit]) -> MaybeUninitSlice<'a> { - MaybeUninitSlice(sys::MaybeUninitSlice::new(buf)) - } -} - -impl<'a> Deref for MaybeUninitSlice<'a> { - type Target = [MaybeUninit]; - - fn deref(&self) -> &[MaybeUninit] { - self.0.as_slice() - } -} - -impl<'a> DerefMut for MaybeUninitSlice<'a> { - fn deref_mut(&mut self) -> &mut [MaybeUninit] { - self.0.as_mut_slice() - } -} - -/// Configures a socket's TCP keepalive parameters. -/// -/// See [`Socket::set_tcp_keepalive`]. -#[derive(Debug, Clone)] -pub struct TcpKeepalive { - #[cfg_attr(any(target_os = "openbsd", target_os = "vita"), allow(dead_code))] - time: Option, - #[cfg(not(any( - target_os = "openbsd", - target_os = "redox", - target_os = "solaris", - target_os = "nto", - target_os = "espidf", - target_os = "vita", - )))] - interval: Option, - #[cfg(not(any( - target_os = "openbsd", - target_os = "redox", - target_os = "solaris", - target_os = "windows", - target_os = "nto", - target_os = "espidf", - target_os = "vita", - )))] - retries: Option, -} - -impl TcpKeepalive { - /// Returns a new, empty set of TCP keepalive parameters. - pub const fn new() -> TcpKeepalive { - TcpKeepalive { - time: None, - #[cfg(not(any( - target_os = "openbsd", - target_os = "redox", - target_os = "solaris", - target_os = "nto", - target_os = "espidf", - target_os = "vita", - )))] - interval: None, - #[cfg(not(any( - target_os = "openbsd", - target_os = "redox", - target_os = "solaris", - target_os = "windows", - target_os = "nto", - target_os = "espidf", - target_os = "vita", - )))] - retries: None, - } - } - - /// Set the amount of time after which TCP keepalive probes will be sent on - /// idle connections. - /// - /// This will set `TCP_KEEPALIVE` on macOS and iOS, and - /// `TCP_KEEPIDLE` on all other Unix operating systems, except - /// OpenBSD and Haiku which don't support any way to set this - /// option. On Windows, this sets the value of the `tcp_keepalive` - /// struct's `keepalivetime` field. - /// - /// Some platforms specify this value in seconds, so sub-second - /// specifications may be omitted. - pub const fn with_time(self, time: Duration) -> Self { - Self { - time: Some(time), - ..self - } - } - - /// Set the value of the `TCP_KEEPINTVL` option. On Windows, this sets the - /// value of the `tcp_keepalive` struct's `keepaliveinterval` field. - /// - /// Sets the time interval between TCP keepalive probes. - /// - /// Some platforms specify this value in seconds, so sub-second - /// specifications may be omitted. - #[cfg(all( - feature = "all", - any( - target_os = "android", - target_os = "dragonfly", - target_os = "freebsd", - target_os = "fuchsia", - target_os = "illumos", - target_os = "linux", - target_os = "netbsd", - target_vendor = "apple", - windows, - ) - ))] - #[cfg_attr( - docsrs, - doc(cfg(all( - feature = "all", - any( - target_os = "android", - target_os = "dragonfly", - target_os = "freebsd", - target_os = "fuchsia", - target_os = "illumos", - target_os = "linux", - target_os = "netbsd", - target_vendor = "apple", - windows, - ) - ))) - )] - pub const fn with_interval(self, interval: Duration) -> Self { - Self { - interval: Some(interval), - ..self - } - } - - /// Set the value of the `TCP_KEEPCNT` option. - /// - /// Set the maximum number of TCP keepalive probes that will be sent before - /// dropping a connection, if TCP keepalive is enabled on this socket. - #[cfg(all( - feature = "all", - any( - doc, - target_os = "android", - target_os = "dragonfly", - target_os = "freebsd", - target_os = "fuchsia", - target_os = "illumos", - target_os = "linux", - target_os = "netbsd", - target_vendor = "apple", - ) - ))] - #[cfg_attr( - docsrs, - doc(cfg(all( - feature = "all", - any( - target_os = "android", - target_os = "dragonfly", - target_os = "freebsd", - target_os = "fuchsia", - target_os = "illumos", - target_os = "linux", - target_os = "netbsd", - target_vendor = "apple", - ) - ))) - )] - pub const fn with_retries(self, retries: u32) -> Self { - Self { - retries: Some(retries), - ..self - } - } -} diff -Nru temporalio-1.3.0/vendor/socket2-0.4.10/src/sockaddr.rs temporalio-1.3.0/vendor/socket2-0.4.10/src/sockaddr.rs --- temporalio-1.3.0/vendor/socket2-0.4.10/src/sockaddr.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/socket2-0.4.10/src/sockaddr.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,360 +0,0 @@ -use std::mem::{self, size_of, MaybeUninit}; -use std::net::{SocketAddr, SocketAddrV4, SocketAddrV6}; -use std::{fmt, io}; - -use crate::sys::{ - sa_family_t, sockaddr, sockaddr_in, sockaddr_in6, sockaddr_storage, socklen_t, AF_INET, - AF_INET6, -}; -#[cfg(windows)] -use winapi::shared::ws2ipdef::SOCKADDR_IN6_LH_u; - -/// The address of a socket. -/// -/// `SockAddr`s may be constructed directly to and from the standard library -/// [`SocketAddr`], [`SocketAddrV4`], and [`SocketAddrV6`] types. -#[derive(Clone)] -pub struct SockAddr { - storage: sockaddr_storage, - len: socklen_t, -} - -#[allow(clippy::len_without_is_empty)] -impl SockAddr { - /// Create a `SockAddr` from the underlying storage and its length. - /// - /// # Safety - /// - /// Caller must ensure that the address family and length match the type of - /// storage address. For example if `storage.ss_family` is set to `AF_INET` - /// the `storage` must be initialised as `sockaddr_in`, setting the content - /// and length appropriately. - /// - /// # Examples - /// - /// ``` - /// # fn main() -> std::io::Result<()> { - /// # #[cfg(unix)] { - /// use std::io; - /// use std::mem; - /// use std::os::unix::io::AsRawFd; - /// - /// use socket2::{SockAddr, Socket, Domain, Type}; - /// - /// let socket = Socket::new(Domain::IPV4, Type::STREAM, None)?; - /// - /// // Initialise a `SocketAddr` byte calling `getsockname(2)`. - /// let mut addr_storage: libc::sockaddr_storage = unsafe { mem::zeroed() }; - /// let mut len = mem::size_of_val(&addr_storage) as libc::socklen_t; - /// - /// // The `getsockname(2)` system call will intiliase `storage` for - /// // us, setting `len` to the correct length. - /// let res = unsafe { - /// libc::getsockname( - /// socket.as_raw_fd(), - /// (&mut addr_storage as *mut libc::sockaddr_storage).cast(), - /// &mut len, - /// ) - /// }; - /// if res == -1 { - /// return Err(io::Error::last_os_error()); - /// } - /// - /// let address = unsafe { SockAddr::new(addr_storage, len) }; - /// # drop(address); - /// # } - /// # Ok(()) - /// # } - /// ``` - pub const unsafe fn new(storage: sockaddr_storage, len: socklen_t) -> SockAddr { - SockAddr { storage, len } - } - - /// Initialise a `SockAddr` by calling the function `init`. - /// - /// The type of the address storage and length passed to the function `init` - /// is OS/architecture specific. - /// - /// The address is zeroed before `init` is called and is thus valid to - /// dereference and read from. The length initialised to the maximum length - /// of the storage. - /// - /// # Safety - /// - /// Caller must ensure that the address family and length match the type of - /// storage address. For example if `storage.ss_family` is set to `AF_INET` - /// the `storage` must be initialised as `sockaddr_in`, setting the content - /// and length appropriately. - /// - /// # Examples - /// - /// ``` - /// # fn main() -> std::io::Result<()> { - /// # #[cfg(unix)] { - /// use std::io; - /// use std::os::unix::io::AsRawFd; - /// - /// use socket2::{SockAddr, Socket, Domain, Type}; - /// - /// let socket = Socket::new(Domain::IPV4, Type::STREAM, None)?; - /// - /// // Initialise a `SocketAddr` byte calling `getsockname(2)`. - /// let (_, address) = unsafe { - /// SockAddr::init(|addr_storage, len| { - /// // The `getsockname(2)` system call will intiliase `storage` for - /// // us, setting `len` to the correct length. - /// if libc::getsockname(socket.as_raw_fd(), addr_storage.cast(), len) == -1 { - /// Err(io::Error::last_os_error()) - /// } else { - /// Ok(()) - /// } - /// }) - /// }?; - /// # drop(address); - /// # } - /// # Ok(()) - /// # } - /// ``` - pub unsafe fn init(init: F) -> io::Result<(T, SockAddr)> - where - F: FnOnce(*mut sockaddr_storage, *mut socklen_t) -> io::Result, - { - const STORAGE_SIZE: socklen_t = size_of::() as socklen_t; - // NOTE: `SockAddr::unix` depends on the storage being zeroed before - // calling `init`. - // NOTE: calling `recvfrom` with an empty buffer also depends on the - // storage being zeroed before calling `init` as the OS might not - // initialise it. - let mut storage = MaybeUninit::::zeroed(); - let mut len = STORAGE_SIZE; - init(storage.as_mut_ptr(), &mut len).map(|res| { - debug_assert!(len <= STORAGE_SIZE, "overflown address storage"); - let addr = SockAddr { - // Safety: zeroed-out `sockaddr_storage` is valid, caller must - // ensure at least `len` bytes are valid. - storage: storage.assume_init(), - len, - }; - (res, addr) - }) - } - - /// Returns this address's family. - pub const fn family(&self) -> sa_family_t { - self.storage.ss_family - } - - /// Returns the size of this address in bytes. - pub const fn len(&self) -> socklen_t { - self.len - } - - /// Returns a raw pointer to the address. - pub const fn as_ptr(&self) -> *const sockaddr { - &self.storage as *const _ as *const _ - } - - /// Returns a raw pointer to the address storage. - #[cfg(all(unix, not(target_os = "redox")))] - pub(crate) const fn as_storage_ptr(&self) -> *const sockaddr_storage { - &self.storage - } - - /// Returns this address as a `SocketAddr` if it is in the `AF_INET` (IPv4) - /// or `AF_INET6` (IPv6) family, otherwise returns `None`. - pub fn as_socket(&self) -> Option { - if self.storage.ss_family == AF_INET as sa_family_t { - // Safety: if the ss_family field is AF_INET then storage must be a sockaddr_in. - let addr = unsafe { &*(&self.storage as *const _ as *const sockaddr_in) }; - - let ip = crate::sys::from_in_addr(addr.sin_addr); - let port = u16::from_be(addr.sin_port); - Some(SocketAddr::V4(SocketAddrV4::new(ip, port))) - } else if self.storage.ss_family == AF_INET6 as sa_family_t { - // Safety: if the ss_family field is AF_INET6 then storage must be a sockaddr_in6. - let addr = unsafe { &*(&self.storage as *const _ as *const sockaddr_in6) }; - - let ip = crate::sys::from_in6_addr(addr.sin6_addr); - let port = u16::from_be(addr.sin6_port); - Some(SocketAddr::V6(SocketAddrV6::new( - ip, - port, - addr.sin6_flowinfo, - #[cfg(unix)] - addr.sin6_scope_id, - #[cfg(windows)] - unsafe { - *addr.u.sin6_scope_id() - }, - ))) - } else { - None - } - } - - /// Returns this address as a [`SocketAddrV4`] if it is in the `AF_INET` - /// family. - pub fn as_socket_ipv4(&self) -> Option { - match self.as_socket() { - Some(SocketAddr::V4(addr)) => Some(addr), - _ => None, - } - } - - /// Returns this address as a [`SocketAddrV6`] if it is in the `AF_INET6` - /// family. - pub fn as_socket_ipv6(&self) -> Option { - match self.as_socket() { - Some(SocketAddr::V6(addr)) => Some(addr), - _ => None, - } - } -} - -impl From for SockAddr { - fn from(addr: SocketAddr) -> SockAddr { - match addr { - SocketAddr::V4(addr) => addr.into(), - SocketAddr::V6(addr) => addr.into(), - } - } -} - -impl From for SockAddr { - fn from(addr: SocketAddrV4) -> SockAddr { - let sockaddr_in = sockaddr_in { - sin_family: AF_INET as sa_family_t, - sin_port: addr.port().to_be(), - sin_addr: crate::sys::to_in_addr(addr.ip()), - sin_zero: Default::default(), - #[cfg(any( - target_os = "dragonfly", - target_os = "freebsd", - target_os = "haiku", - target_os = "ios", - target_os = "macos", - target_os = "netbsd", - target_os = "openbsd", - target_os = "nto", - target_os = "espidf", - target_os = "vita", - ))] - sin_len: 0, - #[cfg(target_os = "vita")] - sin_vport: addr.port().to_be(), - }; - let mut storage = MaybeUninit::::zeroed(); - // Safety: A `sockaddr_in` is memory compatible with a `sockaddr_storage` - unsafe { (storage.as_mut_ptr() as *mut sockaddr_in).write(sockaddr_in) }; - SockAddr { - storage: unsafe { storage.assume_init() }, - len: mem::size_of::() as socklen_t, - } - } -} - -impl From for SockAddr { - fn from(addr: SocketAddrV6) -> SockAddr { - #[cfg(windows)] - let u = unsafe { - let mut u = mem::zeroed::(); - *u.sin6_scope_id_mut() = addr.scope_id(); - u - }; - - let sockaddr_in6 = sockaddr_in6 { - sin6_family: AF_INET6 as sa_family_t, - sin6_port: addr.port().to_be(), - sin6_addr: crate::sys::to_in6_addr(addr.ip()), - sin6_flowinfo: addr.flowinfo(), - #[cfg(unix)] - sin6_scope_id: addr.scope_id(), - #[cfg(windows)] - u, - #[cfg(any( - target_os = "dragonfly", - target_os = "freebsd", - target_os = "haiku", - target_os = "ios", - target_os = "macos", - target_os = "netbsd", - target_os = "openbsd", - target_os = "nto", - target_os = "espidf", - target_os = "vita", - ))] - sin6_len: 0, - #[cfg(target_os = "vita")] - sin6_vport: addr.port().to_be(), - #[cfg(any(target_os = "solaris", target_os = "illumos"))] - __sin6_src_id: 0, - }; - let mut storage = MaybeUninit::::zeroed(); - // Safety: A `sockaddr_in6` is memory compatible with a `sockaddr_storage` - unsafe { (storage.as_mut_ptr() as *mut sockaddr_in6).write(sockaddr_in6) }; - SockAddr { - storage: unsafe { storage.assume_init() }, - len: mem::size_of::() as socklen_t, - } - } -} - -impl fmt::Debug for SockAddr { - fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { - let mut f = fmt.debug_struct("SockAddr"); - #[cfg(any( - target_os = "dragonfly", - target_os = "freebsd", - target_os = "haiku", - target_os = "hermit", - target_os = "ios", - target_os = "macos", - target_os = "netbsd", - target_os = "openbsd", - target_os = "vxworks", - target_os = "nto", - ))] - f.field("ss_len", &self.storage.ss_len); - f.field("ss_family", &self.storage.ss_family) - .field("len", &self.len) - .finish() - } -} - -#[test] -fn ipv4() { - use std::net::Ipv4Addr; - let std = SocketAddrV4::new(Ipv4Addr::new(1, 2, 3, 4), 9876); - let addr = SockAddr::from(std); - assert_eq!(addr.family(), AF_INET as sa_family_t); - assert_eq!(addr.len(), size_of::() as socklen_t); - assert_eq!(addr.as_socket(), Some(SocketAddr::V4(std))); - assert_eq!(addr.as_socket_ipv4(), Some(std)); - assert!(addr.as_socket_ipv6().is_none()); - - let addr = SockAddr::from(SocketAddr::from(std)); - assert_eq!(addr.family(), AF_INET as sa_family_t); - assert_eq!(addr.len(), size_of::() as socklen_t); - assert_eq!(addr.as_socket(), Some(SocketAddr::V4(std))); - assert_eq!(addr.as_socket_ipv4(), Some(std)); - assert!(addr.as_socket_ipv6().is_none()); -} - -#[test] -fn ipv6() { - use std::net::Ipv6Addr; - let std = SocketAddrV6::new(Ipv6Addr::new(1, 2, 3, 4, 5, 6, 7, 8), 9876, 11, 12); - let addr = SockAddr::from(std); - assert_eq!(addr.family(), AF_INET6 as sa_family_t); - assert_eq!(addr.len(), size_of::() as socklen_t); - assert_eq!(addr.as_socket(), Some(SocketAddr::V6(std))); - assert!(addr.as_socket_ipv4().is_none()); - assert_eq!(addr.as_socket_ipv6(), Some(std)); - - let addr = SockAddr::from(SocketAddr::from(std)); - assert_eq!(addr.family(), AF_INET6 as sa_family_t); - assert_eq!(addr.len(), size_of::() as socklen_t); - assert_eq!(addr.as_socket(), Some(SocketAddr::V6(std))); - assert!(addr.as_socket_ipv4().is_none()); - assert_eq!(addr.as_socket_ipv6(), Some(std)); -} diff -Nru temporalio-1.3.0/vendor/socket2-0.4.10/src/socket.rs temporalio-1.3.0/vendor/socket2-0.4.10/src/socket.rs --- temporalio-1.3.0/vendor/socket2-0.4.10/src/socket.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/socket2-0.4.10/src/socket.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,1968 +0,0 @@ -// Copyright 2015 The Rust Project Developers. -// -// Licensed under the Apache License, Version 2.0 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -use std::fmt; -use std::io::{self, Read, Write}; -#[cfg(not(target_os = "redox"))] -use std::io::{IoSlice, IoSliceMut}; -use std::mem::MaybeUninit; -#[cfg(not(target_os = "nto"))] -use std::net::Ipv6Addr; -use std::net::{self, Ipv4Addr, Shutdown}; -#[cfg(unix)] -use std::os::unix::io::{FromRawFd, IntoRawFd}; -#[cfg(windows)] -use std::os::windows::io::{FromRawSocket, IntoRawSocket}; -use std::time::Duration; - -use crate::sys::{self, c_int, getsockopt, setsockopt, Bool}; -use crate::{Domain, Protocol, SockAddr, TcpKeepalive, Type}; -#[cfg(not(target_os = "redox"))] -use crate::{MaybeUninitSlice, RecvFlags}; - -/// Owned wrapper around a system socket. -/// -/// This type simply wraps an instance of a file descriptor (`c_int`) on Unix -/// and an instance of `SOCKET` on Windows. This is the main type exported by -/// this crate and is intended to mirror the raw semantics of sockets on -/// platforms as closely as possible. Almost all methods correspond to -/// precisely one libc or OS API call which is essentially just a "Rustic -/// translation" of what's below. -/// -/// ## Converting to and from other types -/// -/// This type can be freely converted into the network primitives provided by -/// the standard library, such as [`TcpStream`] or [`UdpSocket`], using the -/// [`From`] trait, see the example below. -/// -/// [`TcpStream`]: std::net::TcpStream -/// [`UdpSocket`]: std::net::UdpSocket -/// -/// # Notes -/// -/// Some methods that set options on `Socket` require two system calls to set -/// there options without overwriting previously set options. We do this by -/// first getting the current settings, applying the desired changes and than -/// updating the settings. This means that the operation is **not** atomic. This -/// can lead to a data race when two threads are changing options in parallel. -/// -/// # Examples -/// ```no_run -/// # fn main() -> std::io::Result<()> { -/// use std::net::{SocketAddr, TcpListener}; -/// use socket2::{Socket, Domain, Type}; -/// -/// // create a TCP listener bound to two addresses -/// let socket = Socket::new(Domain::IPV4, Type::STREAM, None)?; -/// -/// let address: SocketAddr = "[::1]:12345".parse().unwrap(); -/// let address = address.into(); -/// socket.bind(&address)?; -/// socket.bind(&address)?; -/// socket.listen(128)?; -/// -/// let listener: TcpListener = socket.into(); -/// // ... -/// # drop(listener); -/// # Ok(()) } -/// ``` -pub struct Socket { - inner: Inner, -} - -/// Store a `TcpStream` internally to take advantage of its niche optimizations on Unix platforms. -pub(crate) type Inner = std::net::TcpStream; - -impl Socket { - /// # Safety - /// - /// The caller must ensure `raw` is a valid file descriptor/socket. NOTE: - /// this should really be marked `unsafe`, but this being an internal - /// function, often passed as mapping function, it's makes it very - /// inconvenient to mark it as `unsafe`. - pub(crate) fn from_raw(raw: sys::Socket) -> Socket { - Socket { - inner: unsafe { - // SAFETY: the caller must ensure that `raw` is a valid file - // descriptor, but when it isn't it could return I/O errors, or - // potentially close a fd it doesn't own. All of that isn't - // memory unsafe, so it's not desired but never memory unsafe or - // causes UB. - // - // However there is one exception. We use `TcpStream` to - // represent the `Socket` internally (see `Inner` type), - // `TcpStream` has a layout optimisation that doesn't allow for - // negative file descriptors (as those are always invalid). - // Violating this assumption (fd never negative) causes UB, - // something we don't want. So check for that we have this - // `assert!`. - #[cfg(unix)] - assert!(raw >= 0, "tried to create a `Socket` with an invalid fd"); - sys::socket_from_raw(raw) - }, - } - } - - pub(crate) fn as_raw(&self) -> sys::Socket { - sys::socket_as_raw(&self.inner) - } - - pub(crate) fn into_raw(self) -> sys::Socket { - sys::socket_into_raw(self.inner) - } - - /// Creates a new socket and sets common flags. - /// - /// This function corresponds to `socket(2)` on Unix and `WSASocketW` on - /// Windows. - /// - /// On Unix-like systems, the close-on-exec flag is set on the new socket. - /// Additionally, on Apple platforms `SOCK_NOSIGPIPE` is set. On Windows, - /// the socket is made non-inheritable. - /// - /// [`Socket::new_raw`] can be used if you don't want these flags to be set. - pub fn new(domain: Domain, ty: Type, protocol: Option) -> io::Result { - let ty = set_common_type(ty); - Socket::new_raw(domain, ty, protocol).and_then(set_common_flags) - } - - /// Creates a new socket ready to be configured. - /// - /// This function corresponds to `socket(2)` on Unix and `WSASocketW` on - /// Windows and simply creates a new socket, no other configuration is done. - pub fn new_raw(domain: Domain, ty: Type, protocol: Option) -> io::Result { - let protocol = protocol.map(|p| p.0).unwrap_or(0); - sys::socket(domain.0, ty.0, protocol).map(Socket::from_raw) - } - - /// Creates a pair of sockets which are connected to each other. - /// - /// This function corresponds to `socketpair(2)`. - /// - /// This function sets the same flags as in done for [`Socket::new`], - /// [`Socket::pair_raw`] can be used if you don't want to set those flags. - #[cfg(any(doc, all(feature = "all", unix)))] - #[cfg_attr(docsrs, doc(cfg(all(feature = "all", unix))))] - pub fn pair( - domain: Domain, - ty: Type, - protocol: Option, - ) -> io::Result<(Socket, Socket)> { - let ty = set_common_type(ty); - let (a, b) = Socket::pair_raw(domain, ty, protocol)?; - let a = set_common_flags(a)?; - let b = set_common_flags(b)?; - Ok((a, b)) - } - - /// Creates a pair of sockets which are connected to each other. - /// - /// This function corresponds to `socketpair(2)`. - #[cfg(any(doc, all(feature = "all", unix)))] - #[cfg_attr(docsrs, doc(cfg(all(feature = "all", unix))))] - pub fn pair_raw( - domain: Domain, - ty: Type, - protocol: Option, - ) -> io::Result<(Socket, Socket)> { - let protocol = protocol.map(|p| p.0).unwrap_or(0); - sys::socketpair(domain.0, ty.0, protocol) - .map(|[a, b]| (Socket::from_raw(a), Socket::from_raw(b))) - } - - /// Binds this socket to the specified address. - /// - /// This function directly corresponds to the `bind(2)` function on Windows - /// and Unix. - pub fn bind(&self, address: &SockAddr) -> io::Result<()> { - sys::bind(self.as_raw(), address) - } - - /// Initiate a connection on this socket to the specified address. - /// - /// This function directly corresponds to the `connect(2)` function on - /// Windows and Unix. - /// - /// An error will be returned if `listen` or `connect` has already been - /// called on this builder. - /// - /// # Notes - /// - /// When using a non-blocking connect (by setting the socket into - /// non-blocking mode before calling this function), socket option can't be - /// set *while connecting*. This will cause errors on Windows. Socket - /// options can be safely set before and after connecting the socket. - pub fn connect(&self, address: &SockAddr) -> io::Result<()> { - sys::connect(self.as_raw(), address) - } - - /// Initiate a connection on this socket to the specified address, only - /// only waiting for a certain period of time for the connection to be - /// established. - /// - /// Unlike many other methods on `Socket`, this does *not* correspond to a - /// single C function. It sets the socket to nonblocking mode, connects via - /// connect(2), and then waits for the connection to complete with poll(2) - /// on Unix and select on Windows. When the connection is complete, the - /// socket is set back to blocking mode. On Unix, this will loop over - /// `EINTR` errors. - /// - /// # Warnings - /// - /// The non-blocking state of the socket is overridden by this function - - /// it will be returned in blocking mode on success, and in an indeterminate - /// state on failure. - /// - /// If the connection request times out, it may still be processing in the - /// background - a second call to `connect` or `connect_timeout` may fail. - pub fn connect_timeout(&self, addr: &SockAddr, timeout: Duration) -> io::Result<()> { - self.set_nonblocking(true)?; - let res = self.connect(addr); - self.set_nonblocking(false)?; - - match res { - Ok(()) => return Ok(()), - Err(ref e) if e.kind() == io::ErrorKind::WouldBlock => {} - #[cfg(unix)] - Err(ref e) if e.raw_os_error() == Some(libc::EINPROGRESS) => {} - Err(e) => return Err(e), - } - - sys::poll_connect(self, timeout) - } - - /// Mark a socket as ready to accept incoming connection requests using - /// [`Socket::accept()`]. - /// - /// This function directly corresponds to the `listen(2)` function on - /// Windows and Unix. - /// - /// An error will be returned if `listen` or `connect` has already been - /// called on this builder. - pub fn listen(&self, backlog: c_int) -> io::Result<()> { - sys::listen(self.as_raw(), backlog) - } - - /// Accept a new incoming connection from this listener. - /// - /// This function uses `accept4(2)` on platforms that support it and - /// `accept(2)` platforms that do not. - /// - /// This function sets the same flags as in done for [`Socket::new`], - /// [`Socket::accept_raw`] can be used if you don't want to set those flags. - pub fn accept(&self) -> io::Result<(Socket, SockAddr)> { - // Use `accept4` on platforms that support it. - #[cfg(any( - target_os = "android", - target_os = "dragonfly", - target_os = "freebsd", - target_os = "fuchsia", - target_os = "illumos", - target_os = "linux", - target_os = "netbsd", - target_os = "openbsd", - ))] - return self._accept4(libc::SOCK_CLOEXEC); - - // Fall back to `accept` on platforms that do not support `accept4`. - #[cfg(not(any( - target_os = "android", - target_os = "dragonfly", - target_os = "freebsd", - target_os = "fuchsia", - target_os = "illumos", - target_os = "linux", - target_os = "netbsd", - target_os = "openbsd", - )))] - { - let (socket, addr) = self.accept_raw()?; - let socket = set_common_flags(socket)?; - // `set_common_flags` does not disable inheritance on Windows because `Socket::new` - // unlike `accept` is able to create the socket with inheritance disabled. - #[cfg(windows)] - socket._set_no_inherit(true)?; - Ok((socket, addr)) - } - } - - /// Accept a new incoming connection from this listener. - /// - /// This function directly corresponds to the `accept(2)` function on - /// Windows and Unix. - pub fn accept_raw(&self) -> io::Result<(Socket, SockAddr)> { - sys::accept(self.as_raw()).map(|(inner, addr)| (Socket::from_raw(inner), addr)) - } - - /// Returns the socket address of the local half of this socket. - /// - /// # Notes - /// - /// Depending on the OS this may return an error if the socket is not - /// [bound]. - /// - /// [bound]: Socket::bind - pub fn local_addr(&self) -> io::Result { - sys::getsockname(self.as_raw()) - } - - /// Returns the socket address of the remote peer of this socket. - /// - /// # Notes - /// - /// This returns an error if the socket is not [`connect`ed]. - /// - /// [`connect`ed]: Socket::connect - pub fn peer_addr(&self) -> io::Result { - sys::getpeername(self.as_raw()) - } - - /// Returns the [`Type`] of this socket by checking the `SO_TYPE` option on - /// this socket. - pub fn r#type(&self) -> io::Result { - unsafe { getsockopt::(self.as_raw(), sys::SOL_SOCKET, sys::SO_TYPE).map(Type) } - } - - /// Creates a new independently owned handle to the underlying socket. - /// - /// # Notes - /// - /// On Unix this uses `F_DUPFD_CLOEXEC` and thus sets the `FD_CLOEXEC` on - /// the returned socket. - /// - /// On Windows this uses `WSA_FLAG_NO_HANDLE_INHERIT` setting inheriting to - /// false. - /// - /// On Windows this can **not** be used function cannot be used on a - /// QOS-enabled socket, see - /// . - pub fn try_clone(&self) -> io::Result { - sys::try_clone(self.as_raw()).map(Socket::from_raw) - } - - /// Moves this TCP stream into or out of nonblocking mode. - /// - /// # Notes - /// - /// On Unix this corresponds to calling `fcntl` (un)setting `O_NONBLOCK`. - /// - /// On Windows this corresponds to calling `ioctlsocket` (un)setting - /// `FIONBIO`. - pub fn set_nonblocking(&self, nonblocking: bool) -> io::Result<()> { - sys::set_nonblocking(self.as_raw(), nonblocking) - } - - /// Shuts down the read, write, or both halves of this connection. - /// - /// This function will cause all pending and future I/O on the specified - /// portions to return immediately with an appropriate value. - pub fn shutdown(&self, how: Shutdown) -> io::Result<()> { - sys::shutdown(self.as_raw(), how) - } - - /// Receives data on the socket from the remote address to which it is - /// connected. - /// - /// The [`connect`] method will connect this socket to a remote address. - /// This method might fail if the socket is not connected. - /// - /// [`connect`]: Socket::connect - /// - /// # Safety - /// - /// Normally casting a `&mut [u8]` to `&mut [MaybeUninit]` would be - /// unsound, as that allows us to write uninitialised bytes to the buffer. - /// However this implementation promises to not write uninitialised bytes to - /// the `buf`fer and passes it directly to `recv(2)` system call. This - /// promise ensures that this function can be called using a `buf`fer of - /// type `&mut [u8]`. - /// - /// Note that the [`io::Read::read`] implementation calls this function with - /// a `buf`fer of type `&mut [u8]`, allowing initialised buffers to be used - /// without using `unsafe`. - pub fn recv(&self, buf: &mut [MaybeUninit]) -> io::Result { - self.recv_with_flags(buf, 0) - } - - /// Receives out-of-band (OOB) data on the socket from the remote address to - /// which it is connected by setting the `MSG_OOB` flag for this call. - /// - /// For more information, see [`recv`], [`out_of_band_inline`]. - /// - /// [`recv`]: Socket::recv - /// [`out_of_band_inline`]: Socket::out_of_band_inline - pub fn recv_out_of_band(&self, buf: &mut [MaybeUninit]) -> io::Result { - self.recv_with_flags(buf, sys::MSG_OOB) - } - - /// Identical to [`recv`] but allows for specification of arbitrary flags to - /// the underlying `recv` call. - /// - /// [`recv`]: Socket::recv - pub fn recv_with_flags( - &self, - buf: &mut [MaybeUninit], - flags: sys::c_int, - ) -> io::Result { - sys::recv(self.as_raw(), buf, flags) - } - - /// Receives data on the socket from the remote address to which it is - /// connected. Unlike [`recv`] this allows passing multiple buffers. - /// - /// The [`connect`] method will connect this socket to a remote address. - /// This method might fail if the socket is not connected. - /// - /// In addition to the number of bytes read, this function returns the flags - /// for the received message. See [`RecvFlags`] for more information about - /// the returned flags. - /// - /// [`recv`]: Socket::recv - /// [`connect`]: Socket::connect - /// - /// # Safety - /// - /// Normally casting a `IoSliceMut` to `MaybeUninitSlice` would be unsound, - /// as that allows us to write uninitialised bytes to the buffer. However - /// this implementation promises to not write uninitialised bytes to the - /// `bufs` and passes it directly to `recvmsg(2)` system call. This promise - /// ensures that this function can be called using `bufs` of type `&mut - /// [IoSliceMut]`. - /// - /// Note that the [`io::Read::read_vectored`] implementation calls this - /// function with `buf`s of type `&mut [IoSliceMut]`, allowing initialised - /// buffers to be used without using `unsafe`. - #[cfg(not(target_os = "redox"))] - #[cfg_attr(docsrs, doc(cfg(not(target_os = "redox"))))] - pub fn recv_vectored( - &self, - bufs: &mut [MaybeUninitSlice<'_>], - ) -> io::Result<(usize, RecvFlags)> { - self.recv_vectored_with_flags(bufs, 0) - } - - /// Identical to [`recv_vectored`] but allows for specification of arbitrary - /// flags to the underlying `recvmsg`/`WSARecv` call. - /// - /// [`recv_vectored`]: Socket::recv_vectored - /// - /// # Safety - /// - /// `recv_from_vectored` makes the same safety guarantees regarding `bufs` - /// as [`recv_vectored`]. - /// - /// [`recv_vectored`]: Socket::recv_vectored - #[cfg(not(target_os = "redox"))] - #[cfg_attr(docsrs, doc(cfg(not(target_os = "redox"))))] - pub fn recv_vectored_with_flags( - &self, - bufs: &mut [MaybeUninitSlice<'_>], - flags: c_int, - ) -> io::Result<(usize, RecvFlags)> { - sys::recv_vectored(self.as_raw(), bufs, flags) - } - - /// Receives data on the socket from the remote adress to which it is - /// connected, without removing that data from the queue. On success, - /// returns the number of bytes peeked. - /// - /// Successive calls return the same data. This is accomplished by passing - /// `MSG_PEEK` as a flag to the underlying `recv` system call. - /// - /// # Safety - /// - /// `peek` makes the same safety guarantees regarding the `buf`fer as - /// [`recv`]. - /// - /// [`recv`]: Socket::recv - pub fn peek(&self, buf: &mut [MaybeUninit]) -> io::Result { - self.recv_with_flags(buf, sys::MSG_PEEK) - } - - /// Receives data from the socket. On success, returns the number of bytes - /// read and the address from whence the data came. - /// - /// # Safety - /// - /// `recv_from` makes the same safety guarantees regarding the `buf`fer as - /// [`recv`]. - /// - /// [`recv`]: Socket::recv - pub fn recv_from(&self, buf: &mut [MaybeUninit]) -> io::Result<(usize, SockAddr)> { - self.recv_from_with_flags(buf, 0) - } - - /// Identical to [`recv_from`] but allows for specification of arbitrary - /// flags to the underlying `recvfrom` call. - /// - /// [`recv_from`]: Socket::recv_from - pub fn recv_from_with_flags( - &self, - buf: &mut [MaybeUninit], - flags: c_int, - ) -> io::Result<(usize, SockAddr)> { - sys::recv_from(self.as_raw(), buf, flags) - } - - /// Receives data from the socket. Returns the amount of bytes read, the - /// [`RecvFlags`] and the remote address from the data is coming. Unlike - /// [`recv_from`] this allows passing multiple buffers. - /// - /// [`recv_from`]: Socket::recv_from - /// - /// # Safety - /// - /// `recv_from_vectored` makes the same safety guarantees regarding `bufs` - /// as [`recv_vectored`]. - /// - /// [`recv_vectored`]: Socket::recv_vectored - #[cfg(not(target_os = "redox"))] - #[cfg_attr(docsrs, doc(cfg(not(target_os = "redox"))))] - pub fn recv_from_vectored( - &self, - bufs: &mut [MaybeUninitSlice<'_>], - ) -> io::Result<(usize, RecvFlags, SockAddr)> { - self.recv_from_vectored_with_flags(bufs, 0) - } - - /// Identical to [`recv_from_vectored`] but allows for specification of - /// arbitrary flags to the underlying `recvmsg`/`WSARecvFrom` call. - /// - /// [`recv_from_vectored`]: Socket::recv_from_vectored - /// - /// # Safety - /// - /// `recv_from_vectored` makes the same safety guarantees regarding `bufs` - /// as [`recv_vectored`]. - /// - /// [`recv_vectored`]: Socket::recv_vectored - #[cfg(not(target_os = "redox"))] - #[cfg_attr(docsrs, doc(cfg(not(target_os = "redox"))))] - pub fn recv_from_vectored_with_flags( - &self, - bufs: &mut [MaybeUninitSlice<'_>], - flags: c_int, - ) -> io::Result<(usize, RecvFlags, SockAddr)> { - sys::recv_from_vectored(self.as_raw(), bufs, flags) - } - - /// Receives data from the socket, without removing it from the queue. - /// - /// Successive calls return the same data. This is accomplished by passing - /// `MSG_PEEK` as a flag to the underlying `recvfrom` system call. - /// - /// On success, returns the number of bytes peeked and the address from - /// whence the data came. - /// - /// # Safety - /// - /// `peek_from` makes the same safety guarantees regarding the `buf`fer as - /// [`recv`]. - /// - /// # Note: Datagram Sockets - /// For datagram sockets, the behavior of this method when `buf` is smaller than - /// the datagram at the head of the receive queue differs between Windows and - /// Unix-like platforms (Linux, macOS, BSDs, etc: colloquially termed "*nix"). - /// - /// On *nix platforms, the datagram is truncated to the length of `buf`. - /// - /// On Windows, an error corresponding to `WSAEMSGSIZE` will be returned. - /// - /// For consistency between platforms, be sure to provide a sufficiently large buffer to avoid - /// truncation; the exact size required depends on the underlying protocol. - /// - /// If you just want to know the sender of the data, try [`peek_sender`]. - /// - /// [`recv`]: Socket::recv - /// [`peek_sender`]: Socket::peek_sender - pub fn peek_from(&self, buf: &mut [MaybeUninit]) -> io::Result<(usize, SockAddr)> { - self.recv_from_with_flags(buf, sys::MSG_PEEK) - } - - /// Retrieve the sender for the data at the head of the receive queue. - /// - /// This is equivalent to calling [`peek_from`] with a zero-sized buffer, - /// but suppresses the `WSAEMSGSIZE` error on Windows. - /// - /// [`peek_from`]: Socket::peek_from - pub fn peek_sender(&self) -> io::Result { - sys::peek_sender(self.as_raw()) - } - - /// Sends data on the socket to a connected peer. - /// - /// This is typically used on TCP sockets or datagram sockets which have - /// been connected. - /// - /// On success returns the number of bytes that were sent. - pub fn send(&self, buf: &[u8]) -> io::Result { - self.send_with_flags(buf, 0) - } - - /// Identical to [`send`] but allows for specification of arbitrary flags to the underlying - /// `send` call. - /// - /// [`send`]: #method.send - pub fn send_with_flags(&self, buf: &[u8], flags: c_int) -> io::Result { - sys::send(self.as_raw(), buf, flags) - } - - /// Send data to the connected peer. Returns the amount of bytes written. - #[cfg(not(target_os = "redox"))] - #[cfg_attr(docsrs, doc(cfg(not(target_os = "redox"))))] - pub fn send_vectored(&self, bufs: &[IoSlice<'_>]) -> io::Result { - self.send_vectored_with_flags(bufs, 0) - } - - /// Identical to [`send_vectored`] but allows for specification of arbitrary - /// flags to the underlying `sendmsg`/`WSASend` call. - /// - /// [`send_vectored`]: Socket::send_vectored - #[cfg(not(target_os = "redox"))] - #[cfg_attr(docsrs, doc(cfg(not(target_os = "redox"))))] - pub fn send_vectored_with_flags( - &self, - bufs: &[IoSlice<'_>], - flags: c_int, - ) -> io::Result { - sys::send_vectored(self.as_raw(), bufs, flags) - } - - /// Sends out-of-band (OOB) data on the socket to connected peer - /// by setting the `MSG_OOB` flag for this call. - /// - /// For more information, see [`send`], [`out_of_band_inline`]. - /// - /// [`send`]: #method.send - /// [`out_of_band_inline`]: #method.out_of_band_inline - pub fn send_out_of_band(&self, buf: &[u8]) -> io::Result { - self.send_with_flags(buf, sys::MSG_OOB) - } - - /// Sends data on the socket to the given address. On success, returns the - /// number of bytes written. - /// - /// This is typically used on UDP or datagram-oriented sockets. - pub fn send_to(&self, buf: &[u8], addr: &SockAddr) -> io::Result { - self.send_to_with_flags(buf, addr, 0) - } - - /// Identical to [`send_to`] but allows for specification of arbitrary flags - /// to the underlying `sendto` call. - /// - /// [`send_to`]: Socket::send_to - pub fn send_to_with_flags( - &self, - buf: &[u8], - addr: &SockAddr, - flags: c_int, - ) -> io::Result { - sys::send_to(self.as_raw(), buf, addr, flags) - } - - /// Send data to a peer listening on `addr`. Returns the amount of bytes - /// written. - #[cfg(not(target_os = "redox"))] - #[cfg_attr(docsrs, doc(cfg(not(target_os = "redox"))))] - pub fn send_to_vectored(&self, bufs: &[IoSlice<'_>], addr: &SockAddr) -> io::Result { - self.send_to_vectored_with_flags(bufs, addr, 0) - } - - /// Identical to [`send_to_vectored`] but allows for specification of - /// arbitrary flags to the underlying `sendmsg`/`WSASendTo` call. - /// - /// [`send_to_vectored`]: Socket::send_to_vectored - #[cfg(not(target_os = "redox"))] - #[cfg_attr(docsrs, doc(cfg(not(target_os = "redox"))))] - pub fn send_to_vectored_with_flags( - &self, - bufs: &[IoSlice<'_>], - addr: &SockAddr, - flags: c_int, - ) -> io::Result { - sys::send_to_vectored(self.as_raw(), bufs, addr, flags) - } -} - -/// Set `SOCK_CLOEXEC` and `NO_HANDLE_INHERIT` on the `ty`pe on platforms that -/// support it. -#[inline(always)] -fn set_common_type(ty: Type) -> Type { - // On platforms that support it set `SOCK_CLOEXEC`. - #[cfg(any( - target_os = "android", - target_os = "dragonfly", - target_os = "freebsd", - target_os = "fuchsia", - target_os = "illumos", - target_os = "linux", - target_os = "netbsd", - target_os = "openbsd", - ))] - let ty = ty._cloexec(); - - // On windows set `NO_HANDLE_INHERIT`. - #[cfg(windows)] - let ty = ty._no_inherit(); - - ty -} - -/// Set `FD_CLOEXEC` and `NOSIGPIPE` on the `socket` for platforms that need it. -#[inline(always)] -#[allow(clippy::unnecessary_wraps)] -fn set_common_flags(socket: Socket) -> io::Result { - // On platforms that don't have `SOCK_CLOEXEC` use `FD_CLOEXEC`. - #[cfg(all( - unix, - not(any( - target_os = "android", - target_os = "dragonfly", - target_os = "freebsd", - target_os = "fuchsia", - target_os = "illumos", - target_os = "linux", - target_os = "netbsd", - target_os = "openbsd", - target_os = "espidf", - target_os = "vita", - )) - ))] - socket._set_cloexec(true)?; - - // On Apple platforms set `NOSIGPIPE`. - #[cfg(target_vendor = "apple")] - socket._set_nosigpipe(true)?; - - Ok(socket) -} - -/// A local interface specified by its index or an address assigned to it. -/// -/// `Index(0)` and `Address(Ipv4Addr::UNSPECIFIED)` are equivalent and indicate -/// that an appropriate interface should be selected by the system. -#[cfg(not(any( - target_os = "haiku", - target_os = "illumos", - target_os = "netbsd", - target_os = "redox", - target_os = "solaris", -)))] -#[derive(Debug)] -pub enum InterfaceIndexOrAddress { - /// An interface index. - Index(u32), - /// An address assigned to an interface. - Address(Ipv4Addr), -} - -/// Socket options get/set using `SOL_SOCKET`. -/// -/// Additional documentation can be found in documentation of the OS. -/// * Linux: -/// * Windows: -impl Socket { - /// Get the value of the `SO_BROADCAST` option for this socket. - /// - /// For more information about this option, see [`set_broadcast`]. - /// - /// [`set_broadcast`]: Socket::set_broadcast - pub fn broadcast(&self) -> io::Result { - unsafe { - getsockopt::(self.as_raw(), sys::SOL_SOCKET, sys::SO_BROADCAST) - .map(|broadcast| broadcast != 0) - } - } - - /// Set the value of the `SO_BROADCAST` option for this socket. - /// - /// When enabled, this socket is allowed to send packets to a broadcast - /// address. - pub fn set_broadcast(&self, broadcast: bool) -> io::Result<()> { - unsafe { - setsockopt( - self.as_raw(), - sys::SOL_SOCKET, - sys::SO_BROADCAST, - broadcast as c_int, - ) - } - } - - /// Get the value of the `SO_ERROR` option on this socket. - /// - /// This will retrieve the stored error in the underlying socket, clearing - /// the field in the process. This can be useful for checking errors between - /// calls. - pub fn take_error(&self) -> io::Result> { - match unsafe { getsockopt::(self.as_raw(), sys::SOL_SOCKET, sys::SO_ERROR) } { - Ok(0) => Ok(None), - Ok(errno) => Ok(Some(io::Error::from_raw_os_error(errno))), - Err(err) => Err(err), - } - } - - /// Get the value of the `SO_KEEPALIVE` option on this socket. - /// - /// For more information about this option, see [`set_keepalive`]. - /// - /// [`set_keepalive`]: Socket::set_keepalive - pub fn keepalive(&self) -> io::Result { - unsafe { - getsockopt::(self.as_raw(), sys::SOL_SOCKET, sys::SO_KEEPALIVE) - .map(|keepalive| keepalive != 0) - } - } - - /// Set value for the `SO_KEEPALIVE` option on this socket. - /// - /// Enable sending of keep-alive messages on connection-oriented sockets. - pub fn set_keepalive(&self, keepalive: bool) -> io::Result<()> { - unsafe { - setsockopt( - self.as_raw(), - sys::SOL_SOCKET, - sys::SO_KEEPALIVE, - keepalive as c_int, - ) - } - } - - /// Get the value of the `SO_LINGER` option on this socket. - /// - /// For more information about this option, see [`set_linger`]. - /// - /// [`set_linger`]: Socket::set_linger - pub fn linger(&self) -> io::Result> { - unsafe { - getsockopt::(self.as_raw(), sys::SOL_SOCKET, sys::SO_LINGER) - .map(from_linger) - } - } - - /// Set value for the `SO_LINGER` option on this socket. - /// - /// If `linger` is not `None`, a close(2) or shutdown(2) will not return - /// until all queued messages for the socket have been successfully sent or - /// the linger timeout has been reached. Otherwise, the call returns - /// immediately and the closing is done in the background. When the socket - /// is closed as part of exit(2), it always lingers in the background. - /// - /// # Notes - /// - /// On most OSs the duration only has a precision of seconds and will be - /// silently truncated. - /// - /// On Apple platforms (e.g. macOS, iOS, etc) this uses `SO_LINGER_SEC`. - pub fn set_linger(&self, linger: Option) -> io::Result<()> { - let linger = into_linger(linger); - unsafe { setsockopt(self.as_raw(), sys::SOL_SOCKET, sys::SO_LINGER, linger) } - } - - /// Get value for the `SO_OOBINLINE` option on this socket. - /// - /// For more information about this option, see [`set_out_of_band_inline`]. - /// - /// [`set_out_of_band_inline`]: Socket::set_out_of_band_inline - #[cfg(not(target_os = "redox"))] - #[cfg_attr(docsrs, doc(cfg(not(target_os = "redox"))))] - pub fn out_of_band_inline(&self) -> io::Result { - unsafe { - getsockopt::(self.as_raw(), sys::SOL_SOCKET, sys::SO_OOBINLINE) - .map(|oob_inline| oob_inline != 0) - } - } - - /// Set value for the `SO_OOBINLINE` option on this socket. - /// - /// If this option is enabled, out-of-band data is directly placed into the - /// receive data stream. Otherwise, out-of-band data is passed only when the - /// `MSG_OOB` flag is set during receiving. As per RFC6093, TCP sockets - /// using the Urgent mechanism are encouraged to set this flag. - #[cfg(not(target_os = "redox"))] - #[cfg_attr(docsrs, doc(cfg(not(target_os = "redox"))))] - pub fn set_out_of_band_inline(&self, oob_inline: bool) -> io::Result<()> { - unsafe { - setsockopt( - self.as_raw(), - sys::SOL_SOCKET, - sys::SO_OOBINLINE, - oob_inline as c_int, - ) - } - } - - /// Get value for the `SO_RCVBUF` option on this socket. - /// - /// For more information about this option, see [`set_recv_buffer_size`]. - /// - /// [`set_recv_buffer_size`]: Socket::set_recv_buffer_size - pub fn recv_buffer_size(&self) -> io::Result { - unsafe { - getsockopt::(self.as_raw(), sys::SOL_SOCKET, sys::SO_RCVBUF) - .map(|size| size as usize) - } - } - - /// Set value for the `SO_RCVBUF` option on this socket. - /// - /// Changes the size of the operating system's receive buffer associated - /// with the socket. - pub fn set_recv_buffer_size(&self, size: usize) -> io::Result<()> { - unsafe { - setsockopt( - self.as_raw(), - sys::SOL_SOCKET, - sys::SO_RCVBUF, - size as c_int, - ) - } - } - - /// Get value for the `SO_RCVTIMEO` option on this socket. - /// - /// If the returned timeout is `None`, then `read` and `recv` calls will - /// block indefinitely. - pub fn read_timeout(&self) -> io::Result> { - sys::timeout_opt(self.as_raw(), sys::SOL_SOCKET, sys::SO_RCVTIMEO) - } - - /// Set value for the `SO_RCVTIMEO` option on this socket. - /// - /// If `timeout` is `None`, then `read` and `recv` calls will block - /// indefinitely. - pub fn set_read_timeout(&self, duration: Option) -> io::Result<()> { - sys::set_timeout_opt(self.as_raw(), sys::SOL_SOCKET, sys::SO_RCVTIMEO, duration) - } - - /// Get the value of the `SO_REUSEADDR` option on this socket. - /// - /// For more information about this option, see [`set_reuse_address`]. - /// - /// [`set_reuse_address`]: Socket::set_reuse_address - pub fn reuse_address(&self) -> io::Result { - unsafe { - getsockopt::(self.as_raw(), sys::SOL_SOCKET, sys::SO_REUSEADDR) - .map(|reuse| reuse != 0) - } - } - - /// Set value for the `SO_REUSEADDR` option on this socket. - /// - /// This indicates that futher calls to `bind` may allow reuse of local - /// addresses. For IPv4 sockets this means that a socket may bind even when - /// there's a socket already listening on this port. - pub fn set_reuse_address(&self, reuse: bool) -> io::Result<()> { - unsafe { - setsockopt( - self.as_raw(), - sys::SOL_SOCKET, - sys::SO_REUSEADDR, - reuse as c_int, - ) - } - } - - /// Get the value of the `SO_SNDBUF` option on this socket. - /// - /// For more information about this option, see [`set_send_buffer_size`]. - /// - /// [`set_send_buffer_size`]: Socket::set_send_buffer_size - pub fn send_buffer_size(&self) -> io::Result { - unsafe { - getsockopt::(self.as_raw(), sys::SOL_SOCKET, sys::SO_SNDBUF) - .map(|size| size as usize) - } - } - - /// Set value for the `SO_SNDBUF` option on this socket. - /// - /// Changes the size of the operating system's send buffer associated with - /// the socket. - pub fn set_send_buffer_size(&self, size: usize) -> io::Result<()> { - unsafe { - setsockopt( - self.as_raw(), - sys::SOL_SOCKET, - sys::SO_SNDBUF, - size as c_int, - ) - } - } - - /// Get value for the `SO_SNDTIMEO` option on this socket. - /// - /// If the returned timeout is `None`, then `write` and `send` calls will - /// block indefinitely. - pub fn write_timeout(&self) -> io::Result> { - sys::timeout_opt(self.as_raw(), sys::SOL_SOCKET, sys::SO_SNDTIMEO) - } - - /// Set value for the `SO_SNDTIMEO` option on this socket. - /// - /// If `timeout` is `None`, then `write` and `send` calls will block - /// indefinitely. - pub fn set_write_timeout(&self, duration: Option) -> io::Result<()> { - sys::set_timeout_opt(self.as_raw(), sys::SOL_SOCKET, sys::SO_SNDTIMEO, duration) - } -} - -fn from_linger(linger: sys::linger) -> Option { - if linger.l_onoff == 0 { - None - } else { - Some(Duration::from_secs(linger.l_linger as u64)) - } -} - -fn into_linger(duration: Option) -> sys::linger { - match duration { - Some(duration) => sys::linger { - l_onoff: 1, - l_linger: duration.as_secs() as _, - }, - None => sys::linger { - l_onoff: 0, - l_linger: 0, - }, - } -} - -/// Socket options for IPv4 sockets, get/set using `IPPROTO_IP`. -/// -/// Additional documentation can be found in documentation of the OS. -/// * Linux: -/// * Windows: -impl Socket { - /// Get the value of the `IP_HDRINCL` option on this socket. - /// - /// For more information about this option, see [`set_header_included`]. - /// - /// [`set_header_included`]: Socket::set_header_included - #[cfg(all(feature = "all", not(any(target_os = "redox", target_os = "espidf"))))] - #[cfg_attr( - docsrs, - doc(cfg(all(feature = "all", not(any(target_os = "redox", target_os = "espidf"))))) - )] - pub fn header_included(&self) -> io::Result { - unsafe { - getsockopt::(self.as_raw(), sys::IPPROTO_IP, sys::IP_HDRINCL) - .map(|included| included != 0) - } - } - - /// Set the value of the `IP_HDRINCL` option on this socket. - /// - /// If enabled, the user supplies an IP header in front of the user data. - /// Valid only for [`SOCK_RAW`] sockets; see [raw(7)] for more information. - /// When this flag is enabled, the values set by `IP_OPTIONS`, [`IP_TTL`], - /// and [`IP_TOS`] are ignored. - /// - /// [`SOCK_RAW`]: Type::RAW - /// [raw(7)]: https://man7.org/linux/man-pages/man7/raw.7.html - /// [`IP_TTL`]: Socket::set_ttl - /// [`IP_TOS`]: Socket::set_tos - #[cfg(all(feature = "all", not(any(target_os = "redox", target_os = "espidf"))))] - #[cfg_attr( - docsrs, - doc(cfg(all(feature = "all", not(any(target_os = "redox", target_os = "espidf"))))) - )] - pub fn set_header_included(&self, included: bool) -> io::Result<()> { - unsafe { - setsockopt( - self.as_raw(), - sys::IPPROTO_IP, - sys::IP_HDRINCL, - included as c_int, - ) - } - } - - /// Get the value of the `IP_TRANSPARENT` option on this socket. - /// - /// For more information about this option, see [`set_ip_transparent`]. - /// - /// [`set_ip_transparent`]: Socket::set_ip_transparent - #[cfg(any(doc, all(feature = "all", target_os = "linux")))] - #[cfg_attr(docsrs, doc(cfg(all(feature = "all", target_os = "linux"))))] - pub fn ip_transparent(&self) -> io::Result { - unsafe { - getsockopt::(self.as_raw(), sys::IPPROTO_IP, libc::IP_TRANSPARENT) - .map(|transparent| transparent != 0) - } - } - - /// Set the value of the `IP_TRANSPARENT` option on this socket. - /// - /// Setting this boolean option enables transparent proxying - /// on this socket. This socket option allows the calling - /// application to bind to a nonlocal IP address and operate - /// both as a client and a server with the foreign address as - /// the local endpoint. NOTE: this requires that routing be - /// set up in a way that packets going to the foreign address - /// are routed through the TProxy box (i.e., the system - /// hosting the application that employs the IP_TRANSPARENT - /// socket option). Enabling this socket option requires - /// superuser privileges (the `CAP_NET_ADMIN` capability). - /// - /// TProxy redirection with the iptables TPROXY target also - /// requires that this option be set on the redirected socket. - #[cfg(any(doc, all(feature = "all", target_os = "linux")))] - #[cfg_attr(docsrs, doc(cfg(all(feature = "all", target_os = "linux"))))] - pub fn set_ip_transparent(&self, transparent: bool) -> io::Result<()> { - unsafe { - setsockopt( - self.as_raw(), - sys::IPPROTO_IP, - libc::IP_TRANSPARENT, - transparent as c_int, - ) - } - } - - /// Join a multicast group using `IP_ADD_MEMBERSHIP` option on this socket. - /// - /// This function specifies a new multicast group for this socket to join. - /// The address must be a valid multicast address, and `interface` is the - /// address of the local interface with which the system should join the - /// multicast group. If it's [`Ipv4Addr::UNSPECIFIED`] (`INADDR_ANY`) then - /// an appropriate interface is chosen by the system. - pub fn join_multicast_v4(&self, multiaddr: &Ipv4Addr, interface: &Ipv4Addr) -> io::Result<()> { - let mreq = sys::IpMreq { - imr_multiaddr: sys::to_in_addr(multiaddr), - imr_interface: sys::to_in_addr(interface), - }; - unsafe { setsockopt(self.as_raw(), sys::IPPROTO_IP, sys::IP_ADD_MEMBERSHIP, mreq) } - } - - /// Leave a multicast group using `IP_DROP_MEMBERSHIP` option on this socket. - /// - /// For more information about this option, see [`join_multicast_v4`]. - /// - /// [`join_multicast_v4`]: Socket::join_multicast_v4 - pub fn leave_multicast_v4(&self, multiaddr: &Ipv4Addr, interface: &Ipv4Addr) -> io::Result<()> { - let mreq = sys::IpMreq { - imr_multiaddr: sys::to_in_addr(multiaddr), - imr_interface: sys::to_in_addr(interface), - }; - unsafe { - setsockopt( - self.as_raw(), - sys::IPPROTO_IP, - sys::IP_DROP_MEMBERSHIP, - mreq, - ) - } - } - - /// Join a multicast group using `IP_ADD_MEMBERSHIP` option on this socket. - /// - /// This function specifies a new multicast group for this socket to join. - /// The address must be a valid multicast address, and `interface` specifies - /// the local interface with which the system should join the multicast - /// group. See [`InterfaceIndexOrAddress`]. - #[cfg(not(any( - target_os = "haiku", - target_os = "illumos", - target_os = "netbsd", - target_os = "openbsd", - target_os = "redox", - target_os = "solaris", - target_os = "nto", - target_os = "espidf", - target_os = "vita", - )))] - pub fn join_multicast_v4_n( - &self, - multiaddr: &Ipv4Addr, - interface: &InterfaceIndexOrAddress, - ) -> io::Result<()> { - let mreqn = sys::to_mreqn(multiaddr, interface); - unsafe { - setsockopt( - self.as_raw(), - sys::IPPROTO_IP, - sys::IP_ADD_MEMBERSHIP, - mreqn, - ) - } - } - - /// Leave a multicast group using `IP_DROP_MEMBERSHIP` option on this socket. - /// - /// For more information about this option, see [`join_multicast_v4_n`]. - /// - /// [`join_multicast_v4_n`]: Socket::join_multicast_v4_n - #[cfg(not(any( - target_os = "haiku", - target_os = "illumos", - target_os = "netbsd", - target_os = "openbsd", - target_os = "redox", - target_os = "solaris", - target_os = "nto", - target_os = "espidf", - target_os = "vita", - )))] - pub fn leave_multicast_v4_n( - &self, - multiaddr: &Ipv4Addr, - interface: &InterfaceIndexOrAddress, - ) -> io::Result<()> { - let mreqn = sys::to_mreqn(multiaddr, interface); - unsafe { - setsockopt( - self.as_raw(), - sys::IPPROTO_IP, - sys::IP_DROP_MEMBERSHIP, - mreqn, - ) - } - } - - /// Join a multicast SSM channel using `IP_ADD_SOURCE_MEMBERSHIP` option on this socket. - /// - /// This function specifies a new multicast channel for this socket to join. - /// The group must be a valid SSM group address, the source must be the address of the sender - /// and `interface` is the address of the local interface with which the system should join the - /// multicast group. If it's [`Ipv4Addr::UNSPECIFIED`] (`INADDR_ANY`) then - /// an appropriate interface is chosen by the system. - #[cfg(not(any( - target_os = "dragonfly", - target_os = "haiku", - target_os = "netbsd", - target_os = "openbsd", - target_os = "redox", - target_os = "fuchsia", - target_os = "nto", - target_os = "espidf", - target_os = "vita", - )))] - pub fn join_ssm_v4( - &self, - source: &Ipv4Addr, - group: &Ipv4Addr, - interface: &Ipv4Addr, - ) -> io::Result<()> { - let mreqs = sys::IpMreqSource { - imr_multiaddr: sys::to_in_addr(group), - imr_interface: sys::to_in_addr(interface), - imr_sourceaddr: sys::to_in_addr(source), - }; - unsafe { - setsockopt( - self.as_raw(), - sys::IPPROTO_IP, - sys::IP_ADD_SOURCE_MEMBERSHIP, - mreqs, - ) - } - } - - /// Leave a multicast group using `IP_DROP_SOURCE_MEMBERSHIP` option on this socket. - /// - /// For more information about this option, see [`join_ssm_v4`]. - /// - /// [`join_ssm_v4`]: Socket::join_ssm_v4 - #[cfg(not(any( - target_os = "dragonfly", - target_os = "haiku", - target_os = "netbsd", - target_os = "openbsd", - target_os = "redox", - target_os = "fuchsia", - target_os = "nto", - target_os = "espidf", - target_os = "vita", - )))] - pub fn leave_ssm_v4( - &self, - source: &Ipv4Addr, - group: &Ipv4Addr, - interface: &Ipv4Addr, - ) -> io::Result<()> { - let mreqs = sys::IpMreqSource { - imr_multiaddr: sys::to_in_addr(group), - imr_interface: sys::to_in_addr(interface), - imr_sourceaddr: sys::to_in_addr(source), - }; - unsafe { - setsockopt( - self.as_raw(), - sys::IPPROTO_IP, - sys::IP_DROP_SOURCE_MEMBERSHIP, - mreqs, - ) - } - } - - /// Get the value of the `IP_MULTICAST_IF` option for this socket. - /// - /// For more information about this option, see [`set_multicast_if_v4`]. - /// - /// [`set_multicast_if_v4`]: Socket::set_multicast_if_v4 - pub fn multicast_if_v4(&self) -> io::Result { - unsafe { - getsockopt(self.as_raw(), sys::IPPROTO_IP, sys::IP_MULTICAST_IF).map(sys::from_in_addr) - } - } - - /// Set the value of the `IP_MULTICAST_IF` option for this socket. - /// - /// Specifies the interface to use for routing multicast packets. - pub fn set_multicast_if_v4(&self, interface: &Ipv4Addr) -> io::Result<()> { - let interface = sys::to_in_addr(interface); - unsafe { - setsockopt( - self.as_raw(), - sys::IPPROTO_IP, - sys::IP_MULTICAST_IF, - interface, - ) - } - } - - /// Get the value of the `IP_MULTICAST_LOOP` option for this socket. - /// - /// For more information about this option, see [`set_multicast_loop_v4`]. - /// - /// [`set_multicast_loop_v4`]: Socket::set_multicast_loop_v4 - pub fn multicast_loop_v4(&self) -> io::Result { - unsafe { - getsockopt::(self.as_raw(), sys::IPPROTO_IP, sys::IP_MULTICAST_LOOP) - .map(|loop_v4| loop_v4 != 0) - } - } - - /// Set the value of the `IP_MULTICAST_LOOP` option for this socket. - /// - /// If enabled, multicast packets will be looped back to the local socket. - /// Note that this may not have any affect on IPv6 sockets. - pub fn set_multicast_loop_v4(&self, loop_v4: bool) -> io::Result<()> { - unsafe { - setsockopt( - self.as_raw(), - sys::IPPROTO_IP, - sys::IP_MULTICAST_LOOP, - loop_v4 as c_int, - ) - } - } - - /// Get the value of the `IP_MULTICAST_TTL` option for this socket. - /// - /// For more information about this option, see [`set_multicast_ttl_v4`]. - /// - /// [`set_multicast_ttl_v4`]: Socket::set_multicast_ttl_v4 - pub fn multicast_ttl_v4(&self) -> io::Result { - unsafe { - getsockopt::(self.as_raw(), sys::IPPROTO_IP, sys::IP_MULTICAST_TTL) - .map(|ttl| ttl as u32) - } - } - - /// Set the value of the `IP_MULTICAST_TTL` option for this socket. - /// - /// Indicates the time-to-live value of outgoing multicast packets for - /// this socket. The default value is 1 which means that multicast packets - /// don't leave the local network unless explicitly requested. - /// - /// Note that this may not have any affect on IPv6 sockets. - pub fn set_multicast_ttl_v4(&self, ttl: u32) -> io::Result<()> { - unsafe { - setsockopt( - self.as_raw(), - sys::IPPROTO_IP, - sys::IP_MULTICAST_TTL, - ttl as c_int, - ) - } - } - - /// Get the value of the `IP_TTL` option for this socket. - /// - /// For more information about this option, see [`set_ttl`]. - /// - /// [`set_ttl`]: Socket::set_ttl - pub fn ttl(&self) -> io::Result { - unsafe { - getsockopt::(self.as_raw(), sys::IPPROTO_IP, sys::IP_TTL).map(|ttl| ttl as u32) - } - } - - /// Set the value of the `IP_TTL` option for this socket. - /// - /// This value sets the time-to-live field that is used in every packet sent - /// from this socket. - pub fn set_ttl(&self, ttl: u32) -> io::Result<()> { - unsafe { setsockopt(self.as_raw(), sys::IPPROTO_IP, sys::IP_TTL, ttl as c_int) } - } - - /// Set the value of the `IP_TOS` option for this socket. - /// - /// This value sets the type-of-service field that is used in every packet - /// sent from this socket. - /// - /// NOTE: - /// documents that not all versions of windows support `IP_TOS`. - #[cfg(not(any( - target_os = "fuchsia", - target_os = "redox", - target_os = "solaris", - target_os = "illumos", - )))] - pub fn set_tos(&self, tos: u32) -> io::Result<()> { - unsafe { setsockopt(self.as_raw(), sys::IPPROTO_IP, sys::IP_TOS, tos as c_int) } - } - - /// Get the value of the `IP_TOS` option for this socket. - /// - /// For more information about this option, see [`set_tos`]. - /// - /// NOTE: - /// documents that not all versions of windows support `IP_TOS`. - /// - /// [`set_tos`]: Socket::set_tos - #[cfg(not(any( - target_os = "fuchsia", - target_os = "redox", - target_os = "solaris", - target_os = "illumos", - )))] - pub fn tos(&self) -> io::Result { - unsafe { - getsockopt::(self.as_raw(), sys::IPPROTO_IP, sys::IP_TOS).map(|tos| tos as u32) - } - } - - /// Set the value of the `IP_RECVTOS` option for this socket. - /// - /// If enabled, the IP_TOS ancillary message is passed with - /// incoming packets. It contains a byte which specifies the - /// Type of Service/Precedence field of the packet header. - #[cfg(not(any( - target_os = "dragonfly", - target_os = "fuchsia", - target_os = "illumos", - target_os = "netbsd", - target_os = "openbsd", - target_os = "redox", - target_os = "solaris", - target_os = "windows", - target_os = "nto", - target_os = "espidf", - target_os = "vita", - )))] - pub fn set_recv_tos(&self, recv_tos: bool) -> io::Result<()> { - let recv_tos = if recv_tos { 1 } else { 0 }; - - unsafe { - setsockopt( - self.as_raw(), - sys::IPPROTO_IP, - sys::IP_RECVTOS, - recv_tos as c_int, - ) - } - } - - /// Get the value of the `IP_RECVTOS` option for this socket. - /// - /// For more information about this option, see [`set_recv_tos`]. - /// - /// [`set_recv_tos`]: Socket::set_recv_tos - #[cfg(not(any( - target_os = "dragonfly", - target_os = "fuchsia", - target_os = "illumos", - target_os = "netbsd", - target_os = "openbsd", - target_os = "redox", - target_os = "solaris", - target_os = "windows", - target_os = "nto", - target_os = "espidf", - target_os = "vita", - )))] - pub fn recv_tos(&self) -> io::Result { - unsafe { - getsockopt::(self.as_raw(), sys::IPPROTO_IP, sys::IP_RECVTOS) - .map(|recv_tos| recv_tos > 0) - } - } -} - -/// Socket options for IPv6 sockets, get/set using `IPPROTO_IPV6`. -/// -/// Additional documentation can be found in documentation of the OS. -/// * Linux: -/// * Windows: -impl Socket { - /// Join a multicast group using `IPV6_ADD_MEMBERSHIP` option on this socket. - /// - /// Some OSs use `IPV6_JOIN_GROUP` for this option. - /// - /// This function specifies a new multicast group for this socket to join. - /// The address must be a valid multicast address, and `interface` is the - /// index of the interface to join/leave (or 0 to indicate any interface). - #[cfg(not(target_os = "nto"))] - pub fn join_multicast_v6(&self, multiaddr: &Ipv6Addr, interface: u32) -> io::Result<()> { - let mreq = sys::Ipv6Mreq { - ipv6mr_multiaddr: sys::to_in6_addr(multiaddr), - // NOTE: some OSs use `c_int`, others use `c_uint`. - ipv6mr_interface: interface as _, - }; - unsafe { - setsockopt( - self.as_raw(), - sys::IPPROTO_IPV6, - sys::IPV6_ADD_MEMBERSHIP, - mreq, - ) - } - } - - /// Leave a multicast group using `IPV6_DROP_MEMBERSHIP` option on this socket. - /// - /// Some OSs use `IPV6_LEAVE_GROUP` for this option. - /// - /// For more information about this option, see [`join_multicast_v6`]. - /// - /// [`join_multicast_v6`]: Socket::join_multicast_v6 - #[cfg(not(target_os = "nto"))] - pub fn leave_multicast_v6(&self, multiaddr: &Ipv6Addr, interface: u32) -> io::Result<()> { - let mreq = sys::Ipv6Mreq { - ipv6mr_multiaddr: sys::to_in6_addr(multiaddr), - // NOTE: some OSs use `c_int`, others use `c_uint`. - ipv6mr_interface: interface as _, - }; - unsafe { - setsockopt( - self.as_raw(), - sys::IPPROTO_IPV6, - sys::IPV6_DROP_MEMBERSHIP, - mreq, - ) - } - } - - /// Get the value of the `IPV6_MULTICAST_HOPS` option for this socket - /// - /// For more information about this option, see [`set_multicast_hops_v6`]. - /// - /// [`set_multicast_hops_v6`]: Socket::set_multicast_hops_v6 - pub fn multicast_hops_v6(&self) -> io::Result { - unsafe { - getsockopt::(self.as_raw(), sys::IPPROTO_IPV6, sys::IPV6_MULTICAST_HOPS) - .map(|hops| hops as u32) - } - } - - /// Set the value of the `IPV6_MULTICAST_HOPS` option for this socket - /// - /// Indicates the number of "routers" multicast packets will transit for - /// this socket. The default value is 1 which means that multicast packets - /// don't leave the local network unless explicitly requested. - pub fn set_multicast_hops_v6(&self, hops: u32) -> io::Result<()> { - unsafe { - setsockopt( - self.as_raw(), - sys::IPPROTO_IPV6, - sys::IPV6_MULTICAST_HOPS, - hops as c_int, - ) - } - } - - /// Get the value of the `IPV6_MULTICAST_IF` option for this socket. - /// - /// For more information about this option, see [`set_multicast_if_v6`]. - /// - /// [`set_multicast_if_v6`]: Socket::set_multicast_if_v6 - pub fn multicast_if_v6(&self) -> io::Result { - unsafe { - getsockopt::(self.as_raw(), sys::IPPROTO_IPV6, sys::IPV6_MULTICAST_IF) - .map(|interface| interface as u32) - } - } - - /// Set the value of the `IPV6_MULTICAST_IF` option for this socket. - /// - /// Specifies the interface to use for routing multicast packets. Unlike - /// ipv4, this is generally required in ipv6 contexts where network routing - /// prefixes may overlap. - pub fn set_multicast_if_v6(&self, interface: u32) -> io::Result<()> { - unsafe { - setsockopt( - self.as_raw(), - sys::IPPROTO_IPV6, - sys::IPV6_MULTICAST_IF, - interface as c_int, - ) - } - } - - /// Get the value of the `IPV6_MULTICAST_LOOP` option for this socket. - /// - /// For more information about this option, see [`set_multicast_loop_v6`]. - /// - /// [`set_multicast_loop_v6`]: Socket::set_multicast_loop_v6 - pub fn multicast_loop_v6(&self) -> io::Result { - unsafe { - getsockopt::(self.as_raw(), sys::IPPROTO_IPV6, sys::IPV6_MULTICAST_LOOP) - .map(|loop_v6| loop_v6 != 0) - } - } - - /// Set the value of the `IPV6_MULTICAST_LOOP` option for this socket. - /// - /// Controls whether this socket sees the multicast packets it sends itself. - /// Note that this may not have any affect on IPv4 sockets. - pub fn set_multicast_loop_v6(&self, loop_v6: bool) -> io::Result<()> { - unsafe { - setsockopt( - self.as_raw(), - sys::IPPROTO_IPV6, - sys::IPV6_MULTICAST_LOOP, - loop_v6 as c_int, - ) - } - } - - /// Get the value of the `IPV6_UNICAST_HOPS` option for this socket. - /// - /// Specifies the hop limit for ipv6 unicast packets - pub fn unicast_hops_v6(&self) -> io::Result { - unsafe { - getsockopt::(self.as_raw(), sys::IPPROTO_IPV6, sys::IPV6_UNICAST_HOPS) - .map(|hops| hops as u32) - } - } - - /// Set the value for the `IPV6_UNICAST_HOPS` option on this socket. - /// - /// Specifies the hop limit for ipv6 unicast packets - pub fn set_unicast_hops_v6(&self, hops: u32) -> io::Result<()> { - unsafe { - setsockopt( - self.as_raw(), - sys::IPPROTO_IPV6, - sys::IPV6_UNICAST_HOPS, - hops as c_int, - ) - } - } - - /// Get the value of the `IPV6_V6ONLY` option for this socket. - /// - /// For more information about this option, see [`set_only_v6`]. - /// - /// [`set_only_v6`]: Socket::set_only_v6 - pub fn only_v6(&self) -> io::Result { - unsafe { - getsockopt::(self.as_raw(), sys::IPPROTO_IPV6, sys::IPV6_V6ONLY) - .map(|only_v6| only_v6 != 0) - } - } - - /// Set the value for the `IPV6_V6ONLY` option on this socket. - /// - /// If this is set to `true` then the socket is restricted to sending and - /// receiving IPv6 packets only. In this case two IPv4 and IPv6 applications - /// can bind the same port at the same time. - /// - /// If this is set to `false` then the socket can be used to send and - /// receive packets from an IPv4-mapped IPv6 address. - pub fn set_only_v6(&self, only_v6: bool) -> io::Result<()> { - unsafe { - setsockopt( - self.as_raw(), - sys::IPPROTO_IPV6, - sys::IPV6_V6ONLY, - only_v6 as c_int, - ) - } - } -} - -/// Socket options for TCP sockets, get/set using `IPPROTO_TCP`. -/// -/// Additional documentation can be found in documentation of the OS. -/// * Linux: -/// * Windows: -impl Socket { - /// Get the value of the `TCP_KEEPIDLE` option on this socket. - /// - /// This returns the value of `TCP_KEEPALIVE` on macOS and iOS and `TCP_KEEPIDLE` on all other - /// supported Unix operating systems. - #[cfg(any( - doc, - all( - feature = "all", - not(any( - windows, - target_os = "haiku", - target_os = "openbsd", - target_os = "vita" - )) - ) - ))] - #[cfg_attr( - docsrs, - doc(cfg(all( - feature = "all", - not(any( - windows, - target_os = "haiku", - target_os = "openbsd", - target_os = "vita" - )) - ))) - )] - pub fn keepalive_time(&self) -> io::Result { - sys::keepalive_time(self.as_raw()) - } - - /// Get the value of the `TCP_KEEPINTVL` option on this socket. - /// - /// For more information about this option, see [`set_tcp_keepalive`]. - /// - /// [`set_tcp_keepalive`]: Socket::set_tcp_keepalive - #[cfg(all( - feature = "all", - any( - doc, - target_os = "android", - target_os = "dragonfly", - target_os = "freebsd", - target_os = "fuchsia", - target_os = "illumos", - target_os = "linux", - target_os = "netbsd", - target_vendor = "apple", - ) - ))] - #[cfg_attr( - docsrs, - doc(cfg(all( - feature = "all", - any( - target_os = "android", - target_os = "dragonfly", - target_os = "freebsd", - target_os = "fuchsia", - target_os = "illumos", - target_os = "linux", - target_os = "netbsd", - target_vendor = "apple", - ) - ))) - )] - pub fn keepalive_interval(&self) -> io::Result { - unsafe { - getsockopt::(self.as_raw(), sys::IPPROTO_TCP, sys::TCP_KEEPINTVL) - .map(|secs| Duration::from_secs(secs as u64)) - } - } - - /// Get the value of the `TCP_KEEPCNT` option on this socket. - /// - /// For more information about this option, see [`set_tcp_keepalive`]. - /// - /// [`set_tcp_keepalive`]: Socket::set_tcp_keepalive - #[cfg(all( - feature = "all", - any( - doc, - target_os = "android", - target_os = "dragonfly", - target_os = "freebsd", - target_os = "fuchsia", - target_os = "illumos", - target_os = "linux", - target_os = "netbsd", - target_vendor = "apple", - ) - ))] - #[cfg_attr( - docsrs, - doc(cfg(all( - feature = "all", - any( - target_os = "android", - target_os = "dragonfly", - target_os = "freebsd", - target_os = "fuchsia", - target_os = "illumos", - target_os = "linux", - target_os = "netbsd", - target_vendor = "apple", - ) - ))) - )] - pub fn keepalive_retries(&self) -> io::Result { - unsafe { - getsockopt::(self.as_raw(), sys::IPPROTO_TCP, sys::TCP_KEEPCNT) - .map(|retries| retries as u32) - } - } - - /// Set parameters configuring TCP keepalive probes for this socket. - /// - /// The supported parameters depend on the operating system, and are - /// configured using the [`TcpKeepalive`] struct. At a minimum, all systems - /// support configuring the [keepalive time]: the time after which the OS - /// will start sending keepalive messages on an idle connection. - /// - /// [keepalive time]: TcpKeepalive::with_time - /// - /// # Notes - /// - /// * This will enable `SO_KEEPALIVE` on this socket, if it is not already - /// enabled. - /// * On some platforms, such as Windows, any keepalive parameters *not* - /// configured by the `TcpKeepalive` struct passed to this function may be - /// overwritten with their default values. Therefore, this function should - /// either only be called once per socket, or the same parameters should - /// be passed every time it is called. - /// - /// # Examples - /// - /// ``` - /// use std::time::Duration; - /// - /// use socket2::{Socket, TcpKeepalive, Domain, Type}; - /// - /// # fn main() -> std::io::Result<()> { - /// let socket = Socket::new(Domain::IPV4, Type::STREAM, None)?; - /// let keepalive = TcpKeepalive::new() - /// .with_time(Duration::from_secs(4)); - /// // Depending on the target operating system, we may also be able to - /// // configure the keepalive probe interval and/or the number of - /// // retries here as well. - /// - /// socket.set_tcp_keepalive(&keepalive)?; - /// # Ok(()) } - /// ``` - /// - pub fn set_tcp_keepalive(&self, params: &TcpKeepalive) -> io::Result<()> { - self.set_keepalive(true)?; - sys::set_tcp_keepalive(self.as_raw(), params) - } - - /// Get the value of the `TCP_NODELAY` option on this socket. - /// - /// For more information about this option, see [`set_nodelay`]. - /// - /// [`set_nodelay`]: Socket::set_nodelay - pub fn nodelay(&self) -> io::Result { - unsafe { - getsockopt::(self.as_raw(), sys::IPPROTO_TCP, sys::TCP_NODELAY) - .map(|nodelay| nodelay != 0) - } - } - - /// Set the value of the `TCP_NODELAY` option on this socket. - /// - /// If set, this option disables the Nagle algorithm. This means that - /// segments are always sent as soon as possible, even if there is only a - /// small amount of data. When not set, data is buffered until there is a - /// sufficient amount to send out, thereby avoiding the frequent sending of - /// small packets. - pub fn set_nodelay(&self, nodelay: bool) -> io::Result<()> { - unsafe { - setsockopt( - self.as_raw(), - sys::IPPROTO_TCP, - sys::TCP_NODELAY, - nodelay as c_int, - ) - } - } -} - -impl Read for Socket { - fn read(&mut self, buf: &mut [u8]) -> io::Result { - // Safety: the `recv` implementation promises not to write uninitialised - // bytes to the `buf`fer, so this casting is safe. - let buf = unsafe { &mut *(buf as *mut [u8] as *mut [MaybeUninit]) }; - self.recv(buf) - } - - #[cfg(not(target_os = "redox"))] - fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> io::Result { - // Safety: both `IoSliceMut` and `MaybeUninitSlice` promise to have the - // same layout, that of `iovec`/`WSABUF`. Furthermore `recv_vectored` - // promises to not write unitialised bytes to the `bufs` and pass it - // directly to the `recvmsg` system call, so this is safe. - let bufs = unsafe { &mut *(bufs as *mut [IoSliceMut<'_>] as *mut [MaybeUninitSlice<'_>]) }; - self.recv_vectored(bufs).map(|(n, _)| n) - } -} - -impl<'a> Read for &'a Socket { - fn read(&mut self, buf: &mut [u8]) -> io::Result { - // Safety: see other `Read::read` impl. - let buf = unsafe { &mut *(buf as *mut [u8] as *mut [MaybeUninit]) }; - self.recv(buf) - } - - #[cfg(not(target_os = "redox"))] - fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> io::Result { - // Safety: see other `Read::read` impl. - let bufs = unsafe { &mut *(bufs as *mut [IoSliceMut<'_>] as *mut [MaybeUninitSlice<'_>]) }; - self.recv_vectored(bufs).map(|(n, _)| n) - } -} - -impl Write for Socket { - fn write(&mut self, buf: &[u8]) -> io::Result { - self.send(buf) - } - - #[cfg(not(target_os = "redox"))] - fn write_vectored(&mut self, bufs: &[IoSlice<'_>]) -> io::Result { - self.send_vectored(bufs) - } - - fn flush(&mut self) -> io::Result<()> { - Ok(()) - } -} - -impl<'a> Write for &'a Socket { - fn write(&mut self, buf: &[u8]) -> io::Result { - self.send(buf) - } - - #[cfg(not(target_os = "redox"))] - fn write_vectored(&mut self, bufs: &[IoSlice<'_>]) -> io::Result { - self.send_vectored(bufs) - } - - fn flush(&mut self) -> io::Result<()> { - Ok(()) - } -} - -impl fmt::Debug for Socket { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("Socket") - .field("raw", &self.as_raw()) - .field("local_addr", &self.local_addr().ok()) - .field("peer_addr", &self.peer_addr().ok()) - .finish() - } -} - -from!(net::TcpStream, Socket); -from!(net::TcpListener, Socket); -from!(net::UdpSocket, Socket); -from!(Socket, net::TcpStream); -from!(Socket, net::TcpListener); -from!(Socket, net::UdpSocket); diff -Nru temporalio-1.3.0/vendor/socket2-0.4.10/src/sockref.rs temporalio-1.3.0/vendor/socket2-0.4.10/src/sockref.rs --- temporalio-1.3.0/vendor/socket2-0.4.10/src/sockref.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/socket2-0.4.10/src/sockref.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,147 +0,0 @@ -use std::fmt; -use std::marker::PhantomData; -use std::mem::ManuallyDrop; -use std::ops::Deref; -#[cfg(unix)] -use std::os::unix::io::{AsRawFd, FromRawFd}; -#[cfg(windows)] -use std::os::windows::io::{AsRawSocket, FromRawSocket}; - -use crate::Socket; - -/// A reference to a [`Socket`] that can be used to configure socket types other -/// than the `Socket` type itself. -/// -/// This allows for example a [`TcpStream`], found in the standard library, to -/// be configured using all the additional methods found in the [`Socket`] API. -/// -/// `SockRef` can be created from any socket type that implements [`AsRawFd`] -/// (Unix) or [`AsRawSocket`] (Windows) using the [`From`] implementation, but -/// the caller must ensure the file descriptor/socket is a valid. -/// -/// [`TcpStream`]: std::net::TcpStream -// Don't use intra-doc links because they won't build on every platform. -/// [`AsRawFd`]: https://doc.rust-lang.org/stable/std/os/unix/io/trait.AsRawFd.html -/// [`AsRawSocket`]: https://doc.rust-lang.org/stable/std/os/windows/io/trait.AsRawSocket.html -/// -/// # Examples -/// -/// Below is an example of converting a [`TcpStream`] into a [`SockRef`]. -/// -/// ``` -/// use std::net::{TcpStream, SocketAddr}; -/// -/// use socket2::SockRef; -/// -/// # fn main() -> Result<(), Box> { -/// // Create `TcpStream` from the standard library. -/// let address: SocketAddr = "127.0.0.1:1234".parse()?; -/// # let b1 = std::sync::Arc::new(std::sync::Barrier::new(2)); -/// # let b2 = b1.clone(); -/// # let handle = std::thread::spawn(move || { -/// # let listener = std::net::TcpListener::bind(address).unwrap(); -/// # b2.wait(); -/// # let (stream, _) = listener.accept().unwrap(); -/// # std::thread::sleep(std::time::Duration::from_millis(10)); -/// # drop(stream); -/// # }); -/// # b1.wait(); -/// let stream = TcpStream::connect(address)?; -/// -/// // Create a `SockRef`erence to the stream. -/// let socket_ref = SockRef::from(&stream); -/// // Use `Socket::set_nodelay` on the stream. -/// socket_ref.set_nodelay(true)?; -/// drop(socket_ref); -/// -/// assert_eq!(stream.nodelay()?, true); -/// # handle.join().unwrap(); -/// # Ok(()) -/// # } -/// ``` -/// -/// Below is an example of **incorrect usage** of `SockRef::from`, which is -/// currently possible (but not intended and will be fixed in future versions). -/// -/// ```compile_fail -/// use socket2::SockRef; -/// -/// # fn main() -> Result<(), Box> { -/// /// THIS USAGE IS NOT VALID! -/// let socket_ref = SockRef::from(&123); -/// // The above line is overseen possibility when using `SockRef::from`, it -/// // uses the `RawFd` (on Unix), which is a type alias for `c_int`/`i32`, -/// // which implements `AsRawFd`. However it may be clear that this usage is -/// // invalid as it doesn't guarantee that `123` is a valid file descriptor. -/// -/// // Using `Socket::set_nodelay` now will call it on a file descriptor we -/// // don't own! We don't even not if the file descriptor is valid or a socket. -/// socket_ref.set_nodelay(true)?; -/// drop(socket_ref); -/// # Ok(()) -/// # } -/// # DO_NOT_COMPILE -/// ``` -pub struct SockRef<'s> { - /// Because this is a reference we don't own the `Socket`, however `Socket` - /// closes itself when dropped, so we use `ManuallyDrop` to prevent it from - /// closing itself. - socket: ManuallyDrop, - /// Because we don't own the socket we need to ensure the socket remains - /// open while we have a "reference" to it, the lifetime `'s` ensures this. - _lifetime: PhantomData<&'s Socket>, -} - -impl<'s> Deref for SockRef<'s> { - type Target = Socket; - - fn deref(&self) -> &Self::Target { - &self.socket - } -} - -/// On Windows, a corresponding `From<&impl AsRawSocket>` implementation exists. -#[cfg(unix)] -#[cfg_attr(docsrs, doc(cfg(unix)))] -impl<'s, S> From<&'s S> for SockRef<'s> -where - S: AsRawFd, -{ - /// The caller must ensure `S` is actually a socket. - fn from(socket: &'s S) -> Self { - let fd = socket.as_raw_fd(); - assert!(fd >= 0); - SockRef { - socket: ManuallyDrop::new(unsafe { Socket::from_raw_fd(fd) }), - _lifetime: PhantomData, - } - } -} - -/// On Unix, a corresponding `From<&impl AsRawFd>` implementation exists. -#[cfg(windows)] -#[cfg_attr(docsrs, doc(cfg(windows)))] -impl<'s, S> From<&'s S> for SockRef<'s> -where - S: AsRawSocket, -{ - /// See the `From<&impl AsRawFd>` implementation. - fn from(socket: &'s S) -> Self { - let socket = socket.as_raw_socket(); - assert!(socket != winapi::um::winsock2::INVALID_SOCKET as _); - SockRef { - socket: ManuallyDrop::new(unsafe { Socket::from_raw_socket(socket) }), - _lifetime: PhantomData, - } - } -} - -impl fmt::Debug for SockRef<'_> { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("SockRef") - .field("raw", &self.socket.as_raw()) - .field("local_addr", &self.socket.local_addr().ok()) - .field("peer_addr", &self.socket.peer_addr().ok()) - .finish() - } -} diff -Nru temporalio-1.3.0/vendor/socket2-0.4.10/src/sys/unix.rs temporalio-1.3.0/vendor/socket2-0.4.10/src/sys/unix.rs --- temporalio-1.3.0/vendor/socket2-0.4.10/src/sys/unix.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/socket2-0.4.10/src/sys/unix.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,2142 +0,0 @@ -// Copyright 2015 The Rust Project Developers. -// -// Licensed under the Apache License, Version 2.0 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -use std::cmp::min; -#[cfg(not(target_os = "redox"))] -use std::io::IoSlice; -use std::marker::PhantomData; -use std::mem::{self, size_of, MaybeUninit}; -use std::net::Shutdown; -use std::net::{Ipv4Addr, Ipv6Addr}; -#[cfg(all(feature = "all", target_vendor = "apple"))] -use std::num::NonZeroU32; -#[cfg(all( - feature = "all", - any( - target_os = "android", - target_os = "freebsd", - target_os = "linux", - target_vendor = "apple", - ) -))] -use std::num::NonZeroUsize; -#[cfg(feature = "all")] -use std::os::unix::ffi::OsStrExt; -#[cfg(all( - feature = "all", - any( - target_os = "android", - target_os = "freebsd", - target_os = "linux", - target_vendor = "apple", - ) -))] -use std::os::unix::io::RawFd; -use std::os::unix::io::{AsRawFd, FromRawFd, IntoRawFd}; -#[cfg(feature = "all")] -use std::os::unix::net::{UnixDatagram, UnixListener, UnixStream}; -#[cfg(feature = "all")] -use std::path::Path; -#[cfg(not(all(target_os = "redox", not(feature = "all"))))] -use std::ptr; -use std::time::{Duration, Instant}; -use std::{io, slice}; - -#[cfg(not(target_vendor = "apple"))] -use libc::ssize_t; -use libc::{c_void, in6_addr, in_addr}; - -#[cfg(not(target_os = "redox"))] -use crate::RecvFlags; -use crate::{Domain, Protocol, SockAddr, TcpKeepalive, Type}; - -pub(crate) use libc::c_int; - -// Used in `Domain`. -pub(crate) use libc::{AF_INET, AF_INET6}; -// Used in `Type`. -#[cfg(all(feature = "all", not(any(target_os = "redox", target_os = "espidf"))))] -pub(crate) use libc::SOCK_RAW; -#[cfg(all(feature = "all", not(target_os = "espidf")))] -pub(crate) use libc::SOCK_SEQPACKET; -pub(crate) use libc::{SOCK_DGRAM, SOCK_STREAM}; -// Used in `Protocol`. -pub(crate) use libc::{IPPROTO_ICMP, IPPROTO_ICMPV6, IPPROTO_TCP, IPPROTO_UDP}; -// Used in `SockAddr`. -pub(crate) use libc::{ - sa_family_t, sockaddr, sockaddr_in, sockaddr_in6, sockaddr_storage, socklen_t, -}; -// Used in `RecvFlags`. -#[cfg(not(any(target_os = "redox", target_os = "espidf")))] -pub(crate) use libc::MSG_TRUNC; -#[cfg(not(target_os = "redox"))] -pub(crate) use libc::SO_OOBINLINE; -// Used in `Socket`. -#[cfg(not(target_os = "nto"))] -pub(crate) use libc::ipv6_mreq as Ipv6Mreq; -#[cfg(all(feature = "all", not(target_os = "redox")))] -pub(crate) use libc::IP_HDRINCL; -#[cfg(not(any( - target_os = "dragonfly", - target_os = "fuchsia", - target_os = "illumos", - target_os = "netbsd", - target_os = "openbsd", - target_os = "redox", - target_os = "solaris", - target_os = "haiku", - target_os = "nto", - target_os = "espidf", - target_os = "vita", -)))] -pub(crate) use libc::IP_RECVTOS; -#[cfg(not(any( - target_os = "fuchsia", - target_os = "redox", - target_os = "solaris", - target_os = "illumos", -)))] -pub(crate) use libc::IP_TOS; -#[cfg(not(target_vendor = "apple"))] -pub(crate) use libc::SO_LINGER; -#[cfg(target_vendor = "apple")] -pub(crate) use libc::SO_LINGER_SEC as SO_LINGER; -pub(crate) use libc::{ - ip_mreq as IpMreq, linger, IPPROTO_IP, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, IPV6_MULTICAST_IF, - IPV6_MULTICAST_LOOP, IPV6_UNICAST_HOPS, IPV6_V6ONLY, IP_ADD_MEMBERSHIP, IP_DROP_MEMBERSHIP, - IP_MULTICAST_IF, IP_MULTICAST_LOOP, IP_MULTICAST_TTL, IP_TTL, MSG_OOB, MSG_PEEK, SOL_SOCKET, - SO_BROADCAST, SO_ERROR, SO_KEEPALIVE, SO_RCVBUF, SO_RCVTIMEO, SO_REUSEADDR, SO_SNDBUF, - SO_SNDTIMEO, SO_TYPE, TCP_NODELAY, -}; -#[cfg(not(any( - target_os = "dragonfly", - target_os = "haiku", - target_os = "netbsd", - target_os = "openbsd", - target_os = "redox", - target_os = "fuchsia", - target_os = "nto", - target_os = "espidf", - target_os = "vita", -)))] -pub(crate) use libc::{ - ip_mreq_source as IpMreqSource, IP_ADD_SOURCE_MEMBERSHIP, IP_DROP_SOURCE_MEMBERSHIP, -}; -#[cfg(not(any( - target_os = "dragonfly", - target_os = "freebsd", - target_os = "haiku", - target_os = "illumos", - target_os = "netbsd", - target_os = "openbsd", - target_os = "solaris", - target_os = "nto", - target_vendor = "apple" -)))] -pub(crate) use libc::{IPV6_ADD_MEMBERSHIP, IPV6_DROP_MEMBERSHIP}; -#[cfg(any( - target_os = "dragonfly", - target_os = "freebsd", - target_os = "haiku", - target_os = "illumos", - target_os = "netbsd", - target_os = "openbsd", - target_os = "solaris", - target_vendor = "apple", -))] -pub(crate) use libc::{ - IPV6_JOIN_GROUP as IPV6_ADD_MEMBERSHIP, IPV6_LEAVE_GROUP as IPV6_DROP_MEMBERSHIP, -}; -#[cfg(all( - feature = "all", - any( - target_os = "android", - target_os = "dragonfly", - target_os = "freebsd", - target_os = "fuchsia", - target_os = "illumos", - target_os = "linux", - target_os = "netbsd", - target_vendor = "apple", - ) -))] -pub(crate) use libc::{TCP_KEEPCNT, TCP_KEEPINTVL}; - -// See this type in the Windows file. -pub(crate) type Bool = c_int; - -#[cfg(any(target_vendor = "apple", target_os = "nto"))] -use libc::TCP_KEEPALIVE as KEEPALIVE_TIME; -#[cfg(not(any( - target_vendor = "apple", - target_os = "haiku", - target_os = "openbsd", - target_os = "nto", - target_os = "vita", -)))] -use libc::TCP_KEEPIDLE as KEEPALIVE_TIME; - -/// Helper macro to execute a system call that returns an `io::Result`. -macro_rules! syscall { - ($fn: ident ( $($arg: expr),* $(,)* ) ) => {{ - #[allow(unused_unsafe)] - let res = unsafe { libc::$fn($($arg, )*) }; - if res == -1 { - Err(std::io::Error::last_os_error()) - } else { - Ok(res) - } - }}; -} - -/// Maximum size of a buffer passed to system call like `recv` and `send`. -#[cfg(not(target_vendor = "apple"))] -const MAX_BUF_LEN: usize = ::max_value() as usize; - -// The maximum read limit on most posix-like systems is `SSIZE_MAX`, with the -// man page quoting that if the count of bytes to read is greater than -// `SSIZE_MAX` the result is "unspecified". -// -// On macOS, however, apparently the 64-bit libc is either buggy or -// intentionally showing odd behavior by rejecting any read with a size larger -// than or equal to INT_MAX. To handle both of these the read size is capped on -// both platforms. -#[cfg(target_vendor = "apple")] -const MAX_BUF_LEN: usize = ::max_value() as usize - 1; - -#[cfg(any( - all( - target_os = "linux", - any( - target_env = "gnu", - all(target_env = "uclibc", target_pointer_width = "64") - ) - ), - target_os = "android", -))] -type IovLen = usize; - -#[cfg(any( - all( - target_os = "linux", - any( - target_env = "musl", - all(target_env = "uclibc", target_pointer_width = "32") - ) - ), - target_os = "dragonfly", - target_os = "freebsd", - target_os = "fuchsia", - target_os = "haiku", - target_os = "illumos", - target_os = "netbsd", - target_os = "openbsd", - target_os = "solaris", - target_os = "nto", - target_vendor = "apple", - target_os = "espidf", - target_os = "vita", -))] -type IovLen = c_int; - -/// Unix only API. -impl Domain { - /// Domain for Unix socket communication, corresponding to `AF_UNIX`. - #[cfg_attr(docsrs, doc(cfg(unix)))] - pub const UNIX: Domain = Domain(libc::AF_UNIX); - - /// Domain for low-level packet interface, corresponding to `AF_PACKET`. - #[cfg(all( - feature = "all", - any(target_os = "android", target_os = "fuchsia", target_os = "linux") - ))] - #[cfg_attr( - docsrs, - doc(cfg(all( - feature = "all", - any(target_os = "android", target_os = "fuchsia", target_os = "linux") - ))) - )] - pub const PACKET: Domain = Domain(libc::AF_PACKET); - - /// Domain for low-level VSOCK interface, corresponding to `AF_VSOCK`. - #[cfg(all(feature = "all", any(target_os = "android", target_os = "linux")))] - #[cfg_attr( - docsrs, - doc(cfg(all(feature = "all", any(target_os = "android", target_os = "linux")))) - )] - pub const VSOCK: Domain = Domain(libc::AF_VSOCK); -} - -impl_debug!( - Domain, - libc::AF_INET, - libc::AF_INET6, - libc::AF_UNIX, - #[cfg(any(target_os = "android", target_os = "fuchsia", target_os = "linux"))] - #[cfg_attr( - docsrs, - doc(cfg(any(target_os = "android", target_os = "fuchsia", target_os = "linux"))) - )] - libc::AF_PACKET, - #[cfg(any(target_os = "android", target_os = "linux"))] - #[cfg_attr(docsrs, doc(cfg(any(target_os = "android", target_os = "linux"))))] - libc::AF_VSOCK, - libc::AF_UNSPEC, // = 0. -); - -/// Unix only API. -impl Type { - /// Set `SOCK_NONBLOCK` on the `Type`. - #[cfg(all( - feature = "all", - any( - target_os = "android", - target_os = "dragonfly", - target_os = "freebsd", - target_os = "fuchsia", - target_os = "illumos", - target_os = "linux", - target_os = "netbsd", - target_os = "openbsd" - ) - ))] - #[cfg_attr( - docsrs, - doc(cfg(all( - feature = "all", - any( - target_os = "android", - target_os = "dragonfly", - target_os = "freebsd", - target_os = "fuchsia", - target_os = "illumos", - target_os = "linux", - target_os = "netbsd", - target_os = "openbsd" - ) - ))) - )] - pub const fn nonblocking(self) -> Type { - Type(self.0 | libc::SOCK_NONBLOCK) - } - - /// Set `SOCK_CLOEXEC` on the `Type`. - #[cfg(all( - feature = "all", - any( - target_os = "android", - target_os = "dragonfly", - target_os = "freebsd", - target_os = "fuchsia", - target_os = "illumos", - target_os = "linux", - target_os = "netbsd", - target_os = "openbsd" - ) - ))] - #[cfg_attr( - docsrs, - doc(cfg(all( - feature = "all", - any( - target_os = "android", - target_os = "dragonfly", - target_os = "freebsd", - target_os = "fuchsia", - target_os = "illumos", - target_os = "linux", - target_os = "netbsd", - target_os = "openbsd" - ) - ))) - )] - pub const fn cloexec(self) -> Type { - self._cloexec() - } - - #[cfg(any( - target_os = "android", - target_os = "dragonfly", - target_os = "freebsd", - target_os = "fuchsia", - target_os = "illumos", - target_os = "linux", - target_os = "netbsd", - target_os = "openbsd" - ))] - pub(crate) const fn _cloexec(self) -> Type { - Type(self.0 | libc::SOCK_CLOEXEC) - } -} - -impl_debug!( - Type, - libc::SOCK_STREAM, - libc::SOCK_DGRAM, - #[cfg(not(any(target_os = "redox", target_os = "espidf")))] - libc::SOCK_RAW, - #[cfg(not(any(target_os = "redox", target_os = "haiku", target_os = "espidf")))] - libc::SOCK_RDM, - #[cfg(not(target_os = "espidf"))] - libc::SOCK_SEQPACKET, - /* TODO: add these optional bit OR-ed flags: - #[cfg(any( - target_os = "android", - target_os = "dragonfly", - target_os = "freebsd", - target_os = "fuchsia", - target_os = "linux", - target_os = "netbsd", - target_os = "openbsd" - ))] - libc::SOCK_NONBLOCK, - #[cfg(any( - target_os = "android", - target_os = "dragonfly", - target_os = "freebsd", - target_os = "fuchsia", - target_os = "linux", - target_os = "netbsd", - target_os = "openbsd" - ))] - libc::SOCK_CLOEXEC, - */ -); - -impl_debug!( - Protocol, - libc::IPPROTO_ICMP, - libc::IPPROTO_ICMPV6, - libc::IPPROTO_TCP, - libc::IPPROTO_UDP, -); - -/// Unix-only API. -#[cfg(not(target_os = "redox"))] -impl RecvFlags { - /// Check if the message terminates a record. - /// - /// Not all socket types support the notion of records. - /// For socket types that do support it (such as [`SEQPACKET`][Type::SEQPACKET]), - /// a record is terminated by sending a message with the end-of-record flag set. - /// - /// On Unix this corresponds to the MSG_EOR flag. - #[cfg(not(target_os = "espidf"))] - pub const fn is_end_of_record(self) -> bool { - self.0 & libc::MSG_EOR != 0 - } - - /// Check if the message contains out-of-band data. - /// - /// This is useful for protocols where you receive out-of-band data - /// mixed in with the normal data stream. - /// - /// On Unix this corresponds to the MSG_OOB flag. - pub const fn is_out_of_band(self) -> bool { - self.0 & libc::MSG_OOB != 0 - } -} - -#[cfg(not(target_os = "redox"))] -impl std::fmt::Debug for RecvFlags { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - let mut s = f.debug_struct("RecvFlags"); - #[cfg(not(target_os = "espidf"))] - s.field("is_end_of_record", &self.is_end_of_record()); - s.field("is_out_of_band", &self.is_out_of_band()); - #[cfg(not(target_os = "espidf"))] - s.field("is_truncated", &self.is_truncated()); - s.finish() - } -} - -#[repr(transparent)] -pub struct MaybeUninitSlice<'a> { - vec: libc::iovec, - _lifetime: PhantomData<&'a mut [MaybeUninit]>, -} - -unsafe impl<'a> Send for MaybeUninitSlice<'a> {} - -unsafe impl<'a> Sync for MaybeUninitSlice<'a> {} - -impl<'a> MaybeUninitSlice<'a> { - pub(crate) fn new(buf: &'a mut [MaybeUninit]) -> MaybeUninitSlice<'a> { - MaybeUninitSlice { - vec: libc::iovec { - iov_base: buf.as_mut_ptr().cast(), - iov_len: buf.len(), - }, - _lifetime: PhantomData, - } - } - - pub(crate) fn as_slice(&self) -> &[MaybeUninit] { - unsafe { slice::from_raw_parts(self.vec.iov_base.cast(), self.vec.iov_len) } - } - - pub(crate) fn as_mut_slice(&mut self) -> &mut [MaybeUninit] { - unsafe { slice::from_raw_parts_mut(self.vec.iov_base.cast(), self.vec.iov_len) } - } -} - -/// Unix only API. -impl SockAddr { - /// Constructs a `SockAddr` with the family `AF_UNIX` and the provided path. - /// - /// # Failure - /// - /// Returns an error if the path is longer than `SUN_LEN`. - #[cfg(feature = "all")] - #[cfg_attr(docsrs, doc(cfg(all(unix, feature = "all"))))] - #[allow(unused_unsafe)] // TODO: replace with `unsafe_op_in_unsafe_fn` once stable. - pub fn unix

(path: P) -> io::Result - where - P: AsRef, - { - unsafe { - SockAddr::init(|storage, len| { - // Safety: `SockAddr::init` zeros the address, which is a valid - // representation. - let storage: &mut libc::sockaddr_un = unsafe { &mut *storage.cast() }; - let len: &mut socklen_t = unsafe { &mut *len }; - - let bytes = path.as_ref().as_os_str().as_bytes(); - let too_long = match bytes.first() { - None => false, - // linux abstract namespaces aren't null-terminated - Some(&0) => bytes.len() > storage.sun_path.len(), - Some(_) => bytes.len() >= storage.sun_path.len(), - }; - if too_long { - return Err(io::Error::new( - io::ErrorKind::InvalidInput, - "path must be shorter than SUN_LEN", - )); - } - - storage.sun_family = libc::AF_UNIX as sa_family_t; - // Safety: `bytes` and `addr.sun_path` are not overlapping and - // both point to valid memory. - // `SockAddr::init` zeroes the memory, so the path is already - // null terminated. - unsafe { - ptr::copy_nonoverlapping( - bytes.as_ptr(), - storage.sun_path.as_mut_ptr() as *mut u8, - bytes.len(), - ) - }; - - let base = storage as *const _ as usize; - let path = &storage.sun_path as *const _ as usize; - let sun_path_offset = path - base; - let length = sun_path_offset - + bytes.len() - + match bytes.first() { - Some(&0) | None => 0, - Some(_) => 1, - }; - *len = length as socklen_t; - - Ok(()) - }) - } - .map(|(_, addr)| addr) - } -} - -impl SockAddr { - /// Constructs a `SockAddr` with the family `AF_VSOCK` and the provided CID/port. - /// - /// # Errors - /// - /// This function can never fail. In a future version of this library it will be made - /// infallible. - #[allow(unused_unsafe)] // TODO: replace with `unsafe_op_in_unsafe_fn` once stable. - #[cfg(all(feature = "all", any(target_os = "android", target_os = "linux")))] - #[cfg_attr( - docsrs, - doc(cfg(all(feature = "all", any(target_os = "android", target_os = "linux")))) - )] - pub fn vsock(cid: u32, port: u32) -> io::Result { - unsafe { - SockAddr::init(|storage, len| { - // Safety: `SockAddr::init` zeros the address, which is a valid - // representation. - let storage: &mut libc::sockaddr_vm = unsafe { &mut *storage.cast() }; - let len: &mut socklen_t = unsafe { &mut *len }; - - storage.svm_family = libc::AF_VSOCK as sa_family_t; - storage.svm_cid = cid; - storage.svm_port = port; - - *len = mem::size_of::() as socklen_t; - - Ok(()) - }) - } - .map(|(_, addr)| addr) - } - - /// Returns this address VSOCK CID/port if it is in the `AF_VSOCK` family, - /// otherwise return `None`. - #[cfg(all(feature = "all", any(target_os = "android", target_os = "linux")))] - #[cfg_attr( - docsrs, - doc(cfg(all(feature = "all", any(target_os = "android", target_os = "linux")))) - )] - pub fn vsock_address(&self) -> Option<(u32, u32)> { - if self.family() == libc::AF_VSOCK as sa_family_t { - // Safety: if the ss_family field is AF_VSOCK then storage must be a sockaddr_vm. - let addr = unsafe { &*(self.as_ptr() as *const libc::sockaddr_vm) }; - Some((addr.svm_cid, addr.svm_port)) - } else { - None - } - } -} - -pub(crate) type Socket = c_int; - -pub(crate) unsafe fn socket_from_raw(socket: Socket) -> crate::socket::Inner { - crate::socket::Inner::from_raw_fd(socket) -} - -pub(crate) fn socket_as_raw(socket: &crate::socket::Inner) -> Socket { - socket.as_raw_fd() -} - -pub(crate) fn socket_into_raw(socket: crate::socket::Inner) -> Socket { - socket.into_raw_fd() -} - -pub(crate) fn socket(family: c_int, ty: c_int, protocol: c_int) -> io::Result { - syscall!(socket(family, ty, protocol)) -} - -#[cfg(feature = "all")] -pub(crate) fn socketpair(family: c_int, ty: c_int, protocol: c_int) -> io::Result<[Socket; 2]> { - let mut fds = [0, 0]; - syscall!(socketpair(family, ty, protocol, fds.as_mut_ptr())).map(|_| fds) -} - -pub(crate) fn bind(fd: Socket, addr: &SockAddr) -> io::Result<()> { - syscall!(bind(fd, addr.as_ptr(), addr.len() as _)).map(|_| ()) -} - -pub(crate) fn connect(fd: Socket, addr: &SockAddr) -> io::Result<()> { - syscall!(connect(fd, addr.as_ptr(), addr.len())).map(|_| ()) -} - -pub(crate) fn poll_connect(socket: &crate::Socket, timeout: Duration) -> io::Result<()> { - let start = Instant::now(); - - let mut pollfd = libc::pollfd { - fd: socket.as_raw(), - events: libc::POLLIN | libc::POLLOUT, - revents: 0, - }; - - loop { - let elapsed = start.elapsed(); - if elapsed >= timeout { - return Err(io::ErrorKind::TimedOut.into()); - } - - let timeout = (timeout - elapsed).as_millis(); - let timeout = clamp(timeout, 1, c_int::max_value() as u128) as c_int; - - match syscall!(poll(&mut pollfd, 1, timeout)) { - Ok(0) => return Err(io::ErrorKind::TimedOut.into()), - Ok(_) => { - // Error or hang up indicates an error (or failure to connect). - if (pollfd.revents & libc::POLLHUP) != 0 || (pollfd.revents & libc::POLLERR) != 0 { - match socket.take_error() { - Ok(Some(err)) => return Err(err), - Ok(None) => { - return Err(io::Error::new( - io::ErrorKind::Other, - "no error set after POLLHUP", - )) - } - Err(err) => return Err(err), - } - } - return Ok(()); - } - // Got interrupted, try again. - Err(ref err) if err.kind() == io::ErrorKind::Interrupted => continue, - Err(err) => return Err(err), - } - } -} - -// TODO: use clamp from std lib, stable since 1.50. -fn clamp(value: T, min: T, max: T) -> T -where - T: Ord, -{ - if value <= min { - min - } else if value >= max { - max - } else { - value - } -} - -pub(crate) fn listen(fd: Socket, backlog: c_int) -> io::Result<()> { - syscall!(listen(fd, backlog)).map(|_| ()) -} - -pub(crate) fn accept(fd: Socket) -> io::Result<(Socket, SockAddr)> { - // Safety: `accept` initialises the `SockAddr` for us. - unsafe { SockAddr::init(|storage, len| syscall!(accept(fd, storage.cast(), len))) } -} - -pub(crate) fn getsockname(fd: Socket) -> io::Result { - // Safety: `accept` initialises the `SockAddr` for us. - unsafe { SockAddr::init(|storage, len| syscall!(getsockname(fd, storage.cast(), len))) } - .map(|(_, addr)| addr) -} - -pub(crate) fn getpeername(fd: Socket) -> io::Result { - // Safety: `accept` initialises the `SockAddr` for us. - unsafe { SockAddr::init(|storage, len| syscall!(getpeername(fd, storage.cast(), len))) } - .map(|(_, addr)| addr) -} - -pub(crate) fn try_clone(fd: Socket) -> io::Result { - syscall!(fcntl(fd, libc::F_DUPFD_CLOEXEC, 0)) -} - -#[cfg(not(target_os = "vita"))] -pub(crate) fn set_nonblocking(fd: Socket, nonblocking: bool) -> io::Result<()> { - if nonblocking { - fcntl_add(fd, libc::F_GETFL, libc::F_SETFL, libc::O_NONBLOCK) - } else { - fcntl_remove(fd, libc::F_GETFL, libc::F_SETFL, libc::O_NONBLOCK) - } -} - -#[cfg(target_os = "vita")] -pub(crate) fn set_nonblocking(fd: Socket, nonblocking: bool) -> io::Result<()> { - unsafe { - setsockopt( - fd, - libc::SOL_SOCKET, - libc::SO_NONBLOCK, - nonblocking as libc::c_int, - ) - } -} - -pub(crate) fn shutdown(fd: Socket, how: Shutdown) -> io::Result<()> { - let how = match how { - Shutdown::Write => libc::SHUT_WR, - Shutdown::Read => libc::SHUT_RD, - Shutdown::Both => libc::SHUT_RDWR, - }; - syscall!(shutdown(fd, how)).map(|_| ()) -} - -pub(crate) fn recv(fd: Socket, buf: &mut [MaybeUninit], flags: c_int) -> io::Result { - syscall!(recv( - fd, - buf.as_mut_ptr().cast(), - min(buf.len(), MAX_BUF_LEN), - flags, - )) - .map(|n| n as usize) -} - -pub(crate) fn recv_from( - fd: Socket, - buf: &mut [MaybeUninit], - flags: c_int, -) -> io::Result<(usize, SockAddr)> { - // Safety: `recvfrom` initialises the `SockAddr` for us. - unsafe { - SockAddr::init(|addr, addrlen| { - syscall!(recvfrom( - fd, - buf.as_mut_ptr().cast(), - min(buf.len(), MAX_BUF_LEN), - flags, - addr.cast(), - addrlen - )) - .map(|n| n as usize) - }) - } -} - -pub(crate) fn peek_sender(fd: Socket) -> io::Result { - // Unix-like platforms simply truncate the returned data, so this implementation is trivial. - // However, for Windows this requires suppressing the `WSAEMSGSIZE` error, - // so that requires a different approach. - // NOTE: macOS does not populate `sockaddr` if you pass a zero-sized buffer. - let (_, sender) = recv_from(fd, &mut [MaybeUninit::uninit(); 8], MSG_PEEK)?; - Ok(sender) -} - -#[cfg(not(target_os = "redox"))] -pub(crate) fn recv_vectored( - fd: Socket, - bufs: &mut [crate::MaybeUninitSlice<'_>], - flags: c_int, -) -> io::Result<(usize, RecvFlags)> { - recvmsg(fd, ptr::null_mut(), bufs, flags).map(|(n, _, recv_flags)| (n, recv_flags)) -} - -#[cfg(not(target_os = "redox"))] -pub(crate) fn recv_from_vectored( - fd: Socket, - bufs: &mut [crate::MaybeUninitSlice<'_>], - flags: c_int, -) -> io::Result<(usize, RecvFlags, SockAddr)> { - // Safety: `recvmsg` initialises the address storage and we set the length - // manually. - unsafe { - SockAddr::init(|storage, len| { - recvmsg(fd, storage, bufs, flags).map(|(n, addrlen, recv_flags)| { - // Set the correct address length. - *len = addrlen; - (n, recv_flags) - }) - }) - } - .map(|((n, recv_flags), addr)| (n, recv_flags, addr)) -} - -/// Returns the (bytes received, sending address len, `RecvFlags`). -#[cfg(not(target_os = "redox"))] -fn recvmsg( - fd: Socket, - msg_name: *mut sockaddr_storage, - bufs: &mut [crate::MaybeUninitSlice<'_>], - flags: c_int, -) -> io::Result<(usize, libc::socklen_t, RecvFlags)> { - let msg_namelen = if msg_name.is_null() { - 0 - } else { - size_of::() as libc::socklen_t - }; - // libc::msghdr contains unexported padding fields on Fuchsia. - let mut msg: libc::msghdr = unsafe { mem::zeroed() }; - msg.msg_name = msg_name.cast(); - msg.msg_namelen = msg_namelen; - msg.msg_iov = bufs.as_mut_ptr().cast(); - msg.msg_iovlen = min(bufs.len(), IovLen::MAX as usize) as IovLen; - syscall!(recvmsg(fd, &mut msg, flags)) - .map(|n| (n as usize, msg.msg_namelen, RecvFlags(msg.msg_flags))) -} - -pub(crate) fn send(fd: Socket, buf: &[u8], flags: c_int) -> io::Result { - syscall!(send( - fd, - buf.as_ptr().cast(), - min(buf.len(), MAX_BUF_LEN), - flags, - )) - .map(|n| n as usize) -} - -#[cfg(not(target_os = "redox"))] -pub(crate) fn send_vectored(fd: Socket, bufs: &[IoSlice<'_>], flags: c_int) -> io::Result { - sendmsg(fd, ptr::null(), 0, bufs, flags) -} - -pub(crate) fn send_to(fd: Socket, buf: &[u8], addr: &SockAddr, flags: c_int) -> io::Result { - syscall!(sendto( - fd, - buf.as_ptr().cast(), - min(buf.len(), MAX_BUF_LEN), - flags, - addr.as_ptr(), - addr.len(), - )) - .map(|n| n as usize) -} - -#[cfg(not(target_os = "redox"))] -pub(crate) fn send_to_vectored( - fd: Socket, - bufs: &[IoSlice<'_>], - addr: &SockAddr, - flags: c_int, -) -> io::Result { - sendmsg(fd, addr.as_storage_ptr(), addr.len(), bufs, flags) -} - -/// Returns the (bytes received, sending address len, `RecvFlags`). -#[cfg(not(target_os = "redox"))] -fn sendmsg( - fd: Socket, - msg_name: *const sockaddr_storage, - msg_namelen: socklen_t, - bufs: &[IoSlice<'_>], - flags: c_int, -) -> io::Result { - // libc::msghdr contains unexported padding fields on Fuchsia. - let mut msg: libc::msghdr = unsafe { mem::zeroed() }; - // Safety: we're creating a `*mut` pointer from a reference, which is UB - // once actually used. However the OS should not write to it in the - // `sendmsg` system call. - msg.msg_name = (msg_name as *mut sockaddr_storage).cast(); - msg.msg_namelen = msg_namelen; - // Safety: Same as above about `*const` -> `*mut`. - msg.msg_iov = bufs.as_ptr() as *mut _; - msg.msg_iovlen = min(bufs.len(), IovLen::MAX as usize) as IovLen; - syscall!(sendmsg(fd, &msg, flags)).map(|n| n as usize) -} - -/// Wrapper around `getsockopt` to deal with platform specific timeouts. -pub(crate) fn timeout_opt(fd: Socket, opt: c_int, val: c_int) -> io::Result> { - unsafe { getsockopt(fd, opt, val).map(from_timeval) } -} - -fn from_timeval(duration: libc::timeval) -> Option { - if duration.tv_sec == 0 && duration.tv_usec == 0 { - None - } else { - let sec = duration.tv_sec as u64; - let nsec = (duration.tv_usec as u32) * 1000; - Some(Duration::new(sec, nsec)) - } -} - -/// Wrapper around `setsockopt` to deal with platform specific timeouts. -pub(crate) fn set_timeout_opt( - fd: Socket, - opt: c_int, - val: c_int, - duration: Option, -) -> io::Result<()> { - let duration = into_timeval(duration); - unsafe { setsockopt(fd, opt, val, duration) } -} - -fn into_timeval(duration: Option) -> libc::timeval { - match duration { - // https://github.com/rust-lang/libc/issues/1848 - #[cfg_attr(target_env = "musl", allow(deprecated))] - Some(duration) => libc::timeval { - tv_sec: min(duration.as_secs(), libc::time_t::max_value() as u64) as libc::time_t, - tv_usec: duration.subsec_micros() as libc::suseconds_t, - }, - None => libc::timeval { - tv_sec: 0, - tv_usec: 0, - }, - } -} - -#[cfg(feature = "all")] -#[cfg(not(any(target_os = "haiku", target_os = "openbsd", target_os = "vita")))] -pub(crate) fn keepalive_time(fd: Socket) -> io::Result { - unsafe { - getsockopt::(fd, IPPROTO_TCP, KEEPALIVE_TIME) - .map(|secs| Duration::from_secs(secs as u64)) - } -} - -#[allow(unused_variables)] -pub(crate) fn set_tcp_keepalive(fd: Socket, keepalive: &TcpKeepalive) -> io::Result<()> { - #[cfg(not(any( - target_os = "haiku", - target_os = "openbsd", - target_os = "nto", - target_os = "vita" - )))] - if let Some(time) = keepalive.time { - let secs = into_secs(time); - unsafe { setsockopt(fd, libc::IPPROTO_TCP, KEEPALIVE_TIME, secs)? } - } - - #[cfg(any( - target_os = "android", - target_os = "dragonfly", - target_os = "freebsd", - target_os = "fuchsia", - target_os = "illumos", - target_os = "linux", - target_os = "netbsd", - target_vendor = "apple", - ))] - { - if let Some(interval) = keepalive.interval { - let secs = into_secs(interval); - unsafe { setsockopt(fd, libc::IPPROTO_TCP, libc::TCP_KEEPINTVL, secs)? } - } - - if let Some(retries) = keepalive.retries { - unsafe { setsockopt(fd, libc::IPPROTO_TCP, libc::TCP_KEEPCNT, retries as c_int)? } - } - } - - #[cfg(target_os = "nto")] - if let Some(time) = keepalive.time { - let secs = into_timeval(Some(time)); - unsafe { setsockopt(fd, libc::IPPROTO_TCP, KEEPALIVE_TIME, secs)? } - } - - Ok(()) -} - -#[cfg(not(any( - target_os = "haiku", - target_os = "openbsd", - target_os = "nto", - target_os = "vita" -)))] -fn into_secs(duration: Duration) -> c_int { - min(duration.as_secs(), c_int::max_value() as u64) as c_int -} - -/// Add `flag` to the current set flags of `F_GETFD`. -#[cfg(not(target_os = "vita"))] -fn fcntl_add(fd: Socket, get_cmd: c_int, set_cmd: c_int, flag: c_int) -> io::Result<()> { - let previous = syscall!(fcntl(fd, get_cmd))?; - let new = previous | flag; - if new != previous { - syscall!(fcntl(fd, set_cmd, new)).map(|_| ()) - } else { - // Flag was already set. - Ok(()) - } -} - -/// Remove `flag` to the current set flags of `F_GETFD`. -#[cfg(not(target_os = "vita"))] -fn fcntl_remove(fd: Socket, get_cmd: c_int, set_cmd: c_int, flag: c_int) -> io::Result<()> { - let previous = syscall!(fcntl(fd, get_cmd))?; - let new = previous & !flag; - if new != previous { - syscall!(fcntl(fd, set_cmd, new)).map(|_| ()) - } else { - // Flag was already set. - Ok(()) - } -} - -/// Caller must ensure `T` is the correct type for `opt` and `val`. -pub(crate) unsafe fn getsockopt(fd: Socket, opt: c_int, val: c_int) -> io::Result { - let mut payload: MaybeUninit = MaybeUninit::uninit(); - let mut len = size_of::() as libc::socklen_t; - syscall!(getsockopt( - fd, - opt, - val, - payload.as_mut_ptr().cast(), - &mut len, - )) - .map(|_| { - debug_assert_eq!(len as usize, size_of::()); - // Safety: `getsockopt` initialised `payload` for us. - payload.assume_init() - }) -} - -/// Caller must ensure `T` is the correct type for `opt` and `val`. -pub(crate) unsafe fn setsockopt( - fd: Socket, - opt: c_int, - val: c_int, - payload: T, -) -> io::Result<()> { - let payload = &payload as *const T as *const c_void; - syscall!(setsockopt( - fd, - opt, - val, - payload, - mem::size_of::() as libc::socklen_t, - )) - .map(|_| ()) -} - -pub(crate) fn to_in_addr(addr: &Ipv4Addr) -> in_addr { - // `s_addr` is stored as BE on all machines, and the array is in BE order. - // So the native endian conversion method is used so that it's never - // swapped. - in_addr { - s_addr: u32::from_ne_bytes(addr.octets()), - } -} - -pub(crate) fn from_in_addr(in_addr: in_addr) -> Ipv4Addr { - Ipv4Addr::from(in_addr.s_addr.to_ne_bytes()) -} - -pub(crate) fn to_in6_addr(addr: &Ipv6Addr) -> in6_addr { - in6_addr { - s6_addr: addr.octets(), - } -} - -pub(crate) fn from_in6_addr(addr: in6_addr) -> Ipv6Addr { - Ipv6Addr::from(addr.s6_addr) -} - -#[cfg(not(any( - target_os = "haiku", - target_os = "illumos", - target_os = "netbsd", - target_os = "openbsd", - target_os = "redox", - target_os = "solaris", - target_os = "nto", - target_os = "espidf", - target_os = "vita", -)))] -pub(crate) fn to_mreqn( - multiaddr: &Ipv4Addr, - interface: &crate::socket::InterfaceIndexOrAddress, -) -> libc::ip_mreqn { - match interface { - crate::socket::InterfaceIndexOrAddress::Index(interface) => libc::ip_mreqn { - imr_multiaddr: to_in_addr(multiaddr), - imr_address: to_in_addr(&Ipv4Addr::UNSPECIFIED), - imr_ifindex: *interface as _, - }, - crate::socket::InterfaceIndexOrAddress::Address(interface) => libc::ip_mreqn { - imr_multiaddr: to_in_addr(multiaddr), - imr_address: to_in_addr(interface), - imr_ifindex: 0, - }, - } -} - -/// Unix only API. -impl crate::Socket { - /// Accept a new incoming connection from this listener. - /// - /// This function directly corresponds to the `accept4(2)` function. - /// - /// This function will block the calling thread until a new connection is - /// established. When established, the corresponding `Socket` and the remote - /// peer's address will be returned. - #[cfg(all( - feature = "all", - any( - target_os = "android", - target_os = "dragonfly", - target_os = "freebsd", - target_os = "fuchsia", - target_os = "illumos", - target_os = "linux", - target_os = "netbsd", - target_os = "openbsd" - ) - ))] - #[cfg_attr( - docsrs, - doc(cfg(all( - feature = "all", - any( - target_os = "android", - target_os = "dragonfly", - target_os = "freebsd", - target_os = "fuchsia", - target_os = "illumos", - target_os = "linux", - target_os = "netbsd", - target_os = "openbsd" - ) - ))) - )] - pub fn accept4(&self, flags: c_int) -> io::Result<(crate::Socket, SockAddr)> { - self._accept4(flags) - } - - #[cfg(any( - target_os = "android", - target_os = "dragonfly", - target_os = "freebsd", - target_os = "fuchsia", - target_os = "illumos", - target_os = "linux", - target_os = "netbsd", - target_os = "openbsd" - ))] - pub(crate) fn _accept4(&self, flags: c_int) -> io::Result<(crate::Socket, SockAddr)> { - // Safety: `accept4` initialises the `SockAddr` for us. - unsafe { - SockAddr::init(|storage, len| { - syscall!(accept4(self.as_raw(), storage.cast(), len, flags)) - .map(crate::Socket::from_raw) - }) - } - } - - /// Sets `CLOEXEC` on the socket. - /// - /// # Notes - /// - /// On supported platforms you can use [`Type::cloexec`]. - #[cfg(all(feature = "all", not(target_os = "vita")))] - #[cfg_attr(docsrs, doc(cfg(all(feature = "all", unix, not(target_os = "vita")))))] - pub fn set_cloexec(&self, close_on_exec: bool) -> io::Result<()> { - self._set_cloexec(close_on_exec) - } - - #[cfg(not(target_os = "vita"))] - pub(crate) fn _set_cloexec(&self, close_on_exec: bool) -> io::Result<()> { - if close_on_exec { - fcntl_add( - self.as_raw(), - libc::F_GETFD, - libc::F_SETFD, - libc::FD_CLOEXEC, - ) - } else { - fcntl_remove( - self.as_raw(), - libc::F_GETFD, - libc::F_SETFD, - libc::FD_CLOEXEC, - ) - } - } - - /// Sets `SO_NOSIGPIPE` on the socket. - #[cfg(all(feature = "all", any(doc, target_vendor = "apple")))] - #[cfg_attr(docsrs, doc(cfg(all(feature = "all", target_vendor = "apple"))))] - pub fn set_nosigpipe(&self, nosigpipe: bool) -> io::Result<()> { - self._set_nosigpipe(nosigpipe) - } - - #[cfg(target_vendor = "apple")] - pub(crate) fn _set_nosigpipe(&self, nosigpipe: bool) -> io::Result<()> { - unsafe { - setsockopt( - self.as_raw(), - libc::SOL_SOCKET, - libc::SO_NOSIGPIPE, - nosigpipe as c_int, - ) - } - } - - /// Gets the value of the `TCP_MAXSEG` option on this socket. - /// - /// For more information about this option, see [`set_mss`]. - /// - /// [`set_mss`]: crate::Socket::set_mss - #[cfg(all(feature = "all", not(target_os = "redox")))] - #[cfg_attr(docsrs, doc(cfg(all(feature = "all", unix, not(target_os = "redox")))))] - pub fn mss(&self) -> io::Result { - unsafe { - getsockopt::(self.as_raw(), libc::IPPROTO_TCP, libc::TCP_MAXSEG) - .map(|mss| mss as u32) - } - } - - /// Sets the value of the `TCP_MAXSEG` option on this socket. - /// - /// The `TCP_MAXSEG` option denotes the TCP Maximum Segment Size and is only - /// available on TCP sockets. - #[cfg(all(feature = "all", not(target_os = "redox")))] - #[cfg_attr(docsrs, doc(cfg(all(feature = "all", unix, not(target_os = "redox")))))] - pub fn set_mss(&self, mss: u32) -> io::Result<()> { - unsafe { - setsockopt( - self.as_raw(), - libc::IPPROTO_TCP, - libc::TCP_MAXSEG, - mss as c_int, - ) - } - } - - /// Returns `true` if `listen(2)` was called on this socket by checking the - /// `SO_ACCEPTCONN` option on this socket. - #[cfg(all( - feature = "all", - any( - target_os = "android", - target_os = "freebsd", - target_os = "fuchsia", - target_os = "linux", - ) - ))] - #[cfg_attr( - docsrs, - doc(cfg(all( - feature = "all", - any( - target_os = "android", - target_os = "freebsd", - target_os = "fuchsia", - target_os = "linux", - ) - ))) - )] - pub fn is_listener(&self) -> io::Result { - unsafe { - getsockopt::(self.as_raw(), libc::SOL_SOCKET, libc::SO_ACCEPTCONN) - .map(|v| v != 0) - } - } - - /// Returns the [`Domain`] of this socket by checking the `SO_DOMAIN` option - /// on this socket. - #[cfg(all( - feature = "all", - any( - target_os = "android", - // TODO: add FreeBSD. - // target_os = "freebsd", - target_os = "fuchsia", - target_os = "linux", - ) - ))] - #[cfg_attr(docsrs, doc(cfg(all( - feature = "all", - any( - target_os = "android", - // TODO: add FreeBSD. - // target_os = "freebsd", - target_os = "fuchsia", - target_os = "linux", - ) - ))))] - pub fn domain(&self) -> io::Result { - unsafe { getsockopt::(self.as_raw(), libc::SOL_SOCKET, libc::SO_DOMAIN).map(Domain) } - } - - /// Returns the [`Protocol`] of this socket by checking the `SO_PROTOCOL` - /// option on this socket. - #[cfg(all( - feature = "all", - any( - target_os = "android", - target_os = "freebsd", - target_os = "fuchsia", - target_os = "linux", - ) - ))] - #[cfg_attr( - docsrs, - doc(cfg(all( - feature = "all", - any( - target_os = "android", - target_os = "freebsd", - target_os = "fuchsia", - target_os = "linux", - ) - ))) - )] - pub fn protocol(&self) -> io::Result> { - unsafe { - getsockopt::(self.as_raw(), libc::SOL_SOCKET, libc::SO_PROTOCOL).map(|v| match v - { - 0 => None, - p => Some(Protocol(p)), - }) - } - } - - /// Gets the value for the `SO_MARK` option on this socket. - /// - /// This value gets the socket mark field for each packet sent through - /// this socket. - /// - /// On Linux this function requires the `CAP_NET_ADMIN` capability. - #[cfg(all( - feature = "all", - any(target_os = "android", target_os = "fuchsia", target_os = "linux") - ))] - #[cfg_attr( - docsrs, - doc(cfg(all( - feature = "all", - any(target_os = "android", target_os = "fuchsia", target_os = "linux") - ))) - )] - pub fn mark(&self) -> io::Result { - unsafe { - getsockopt::(self.as_raw(), libc::SOL_SOCKET, libc::SO_MARK) - .map(|mark| mark as u32) - } - } - - /// Sets the value for the `SO_MARK` option on this socket. - /// - /// This value sets the socket mark field for each packet sent through - /// this socket. Changing the mark can be used for mark-based routing - /// without netfilter or for packet filtering. - /// - /// On Linux this function requires the `CAP_NET_ADMIN` capability. - #[cfg(all( - feature = "all", - any(target_os = "android", target_os = "fuchsia", target_os = "linux") - ))] - #[cfg_attr( - docsrs, - doc(cfg(all( - feature = "all", - any(target_os = "android", target_os = "fuchsia", target_os = "linux") - ))) - )] - pub fn set_mark(&self, mark: u32) -> io::Result<()> { - unsafe { - setsockopt::( - self.as_raw(), - libc::SOL_SOCKET, - libc::SO_MARK, - mark as c_int, - ) - } - } - - /// Get the value of the `TCP_CORK` option on this socket. - /// - /// For more information about this option, see [`set_cork`]. - /// - /// [`set_cork`]: Socket::set_cork - #[cfg(all( - feature = "all", - any(target_os = "android", target_os = "fuchsia", target_os = "linux") - ))] - #[cfg_attr( - docsrs, - doc(cfg(all( - feature = "all", - any(target_os = "android", target_os = "fuchsia", target_os = "linux") - ))) - )] - pub fn cork(&self) -> io::Result { - unsafe { - getsockopt::(self.as_raw(), libc::IPPROTO_TCP, libc::TCP_CORK) - .map(|cork| cork != 0) - } - } - - /// Set the value of the `TCP_CORK` option on this socket. - /// - /// If set, don't send out partial frames. All queued partial frames are - /// sent when the option is cleared again. There is a 200 millisecond ceiling on - /// the time for which output is corked by `TCP_CORK`. If this ceiling is reached, - /// then queued data is automatically transmitted. - #[cfg(all( - feature = "all", - any(target_os = "android", target_os = "fuchsia", target_os = "linux") - ))] - #[cfg_attr( - docsrs, - doc(cfg(all( - feature = "all", - any(target_os = "android", target_os = "fuchsia", target_os = "linux") - ))) - )] - pub fn set_cork(&self, cork: bool) -> io::Result<()> { - unsafe { - setsockopt( - self.as_raw(), - libc::IPPROTO_TCP, - libc::TCP_CORK, - cork as c_int, - ) - } - } - - /// Get the value of the `TCP_QUICKACK` option on this socket. - /// - /// For more information about this option, see [`set_quickack`]. - /// - /// [`set_quickack`]: Socket::set_quickack - #[cfg(all( - feature = "all", - any(target_os = "android", target_os = "fuchsia", target_os = "linux") - ))] - #[cfg_attr( - docsrs, - doc(cfg(all( - feature = "all", - any(target_os = "android", target_os = "fuchsia", target_os = "linux") - ))) - )] - pub fn quickack(&self) -> io::Result { - unsafe { - getsockopt::(self.as_raw(), libc::IPPROTO_TCP, libc::TCP_QUICKACK) - .map(|quickack| quickack != 0) - } - } - - /// Set the value of the `TCP_QUICKACK` option on this socket. - /// - /// If set, acks are sent immediately, rather than delayed if needed in accordance to normal - /// TCP operation. This flag is not permanent, it only enables a switch to or from quickack mode. - /// Subsequent operation of the TCP protocol will once again enter/leave quickack mode depending on - /// internal protocol processing and factors such as delayed ack timeouts occurring and data transfer. - #[cfg(all( - feature = "all", - any(target_os = "android", target_os = "fuchsia", target_os = "linux") - ))] - #[cfg_attr( - docsrs, - doc(cfg(all( - feature = "all", - any(target_os = "android", target_os = "fuchsia", target_os = "linux") - ))) - )] - pub fn set_quickack(&self, quickack: bool) -> io::Result<()> { - unsafe { - setsockopt( - self.as_raw(), - libc::IPPROTO_TCP, - libc::TCP_QUICKACK, - quickack as c_int, - ) - } - } - - /// Get the value of the `TCP_THIN_LINEAR_TIMEOUTS` option on this socket. - /// - /// For more information about this option, see [`set_thin_linear_timeouts`]. - /// - /// [`set_thin_linear_timeouts`]: Socket::set_thin_linear_timeouts - #[cfg(all( - feature = "all", - any(target_os = "android", target_os = "fuchsia", target_os = "linux") - ))] - #[cfg_attr( - docsrs, - doc(cfg(all( - feature = "all", - any(target_os = "android", target_os = "fuchsia", target_os = "linux") - ))) - )] - pub fn thin_linear_timeouts(&self) -> io::Result { - unsafe { - getsockopt::( - self.as_raw(), - libc::IPPROTO_TCP, - libc::TCP_THIN_LINEAR_TIMEOUTS, - ) - .map(|timeouts| timeouts != 0) - } - } - - /// Set the value of the `TCP_THIN_LINEAR_TIMEOUTS` option on this socket. - /// - /// If set, the kernel will dynamically detect a thin-stream connection if there are less than four packets in flight. - /// With less than four packets in flight the normal TCP fast retransmission will not be effective. - /// The kernel will modify the retransmission to avoid the very high latencies that thin stream suffer because of exponential backoff. - #[cfg(all( - feature = "all", - any(target_os = "android", target_os = "fuchsia", target_os = "linux") - ))] - #[cfg_attr( - docsrs, - doc(cfg(all( - feature = "all", - any(target_os = "android", target_os = "fuchsia", target_os = "linux") - ))) - )] - pub fn set_thin_linear_timeouts(&self, timeouts: bool) -> io::Result<()> { - unsafe { - setsockopt( - self.as_raw(), - libc::IPPROTO_TCP, - libc::TCP_THIN_LINEAR_TIMEOUTS, - timeouts as c_int, - ) - } - } - - /// Gets the value for the `SO_BINDTODEVICE` option on this socket. - /// - /// This value gets the socket binded device's interface name. - #[cfg(all( - feature = "all", - any(target_os = "android", target_os = "fuchsia", target_os = "linux") - ))] - #[cfg_attr( - docsrs, - doc(cfg(all( - feature = "all", - any(target_os = "android", target_os = "fuchsia", target_os = "linux") - ))) - )] - pub fn device(&self) -> io::Result>> { - // TODO: replace with `MaybeUninit::uninit_array` once stable. - let mut buf: [MaybeUninit; libc::IFNAMSIZ] = - unsafe { MaybeUninit::uninit().assume_init() }; - let mut len = buf.len() as libc::socklen_t; - syscall!(getsockopt( - self.as_raw(), - libc::SOL_SOCKET, - libc::SO_BINDTODEVICE, - buf.as_mut_ptr().cast(), - &mut len, - ))?; - if len == 0 { - Ok(None) - } else { - let buf = &buf[..len as usize - 1]; - // TODO: use `MaybeUninit::slice_assume_init_ref` once stable. - Ok(Some(unsafe { &*(buf as *const [_] as *const [u8]) }.into())) - } - } - - /// Sets the value for the `SO_BINDTODEVICE` option on this socket. - /// - /// If a socket is bound to an interface, only packets received from that - /// particular interface are processed by the socket. Note that this only - /// works for some socket types, particularly `AF_INET` sockets. - /// - /// If `interface` is `None` or an empty string it removes the binding. - #[cfg(all( - feature = "all", - any(target_os = "android", target_os = "fuchsia", target_os = "linux") - ))] - #[cfg_attr( - docsrs, - doc(cfg(all( - feature = "all", - any(target_os = "android", target_os = "fuchsia", target_os = "linux") - ))) - )] - pub fn bind_device(&self, interface: Option<&[u8]>) -> io::Result<()> { - let (value, len) = if let Some(interface) = interface { - (interface.as_ptr(), interface.len()) - } else { - (ptr::null(), 0) - }; - syscall!(setsockopt( - self.as_raw(), - libc::SOL_SOCKET, - libc::SO_BINDTODEVICE, - value.cast(), - len as libc::socklen_t, - )) - .map(|_| ()) - } - - /// Sets the value for the `SO_SETFIB` option on this socket. - /// - /// Bind socket to the specified forwarding table (VRF) on a FreeBSD. - #[cfg(all(feature = "all", any(target_os = "freebsd")))] - #[cfg_attr(docsrs, doc(cfg(all(feature = "all", any(target_os = "freebsd")))))] - pub fn set_fib(&self, fib: u32) -> io::Result<()> { - syscall!(setsockopt( - self.as_raw(), - libc::SOL_SOCKET, - libc::SO_SETFIB, - (&fib as *const u32).cast(), - mem::size_of::() as libc::socklen_t, - )) - .map(|_| ()) - } - - /// Sets the value for `IP_BOUND_IF` option on this socket. - /// - /// If a socket is bound to an interface, only packets received from that - /// particular interface are processed by the socket. - /// - /// If `interface` is `None`, the binding is removed. If the `interface` - /// index is not valid, an error is returned. - /// - /// One can use `libc::if_nametoindex` to convert an interface alias to an - /// index. - #[cfg(all(feature = "all", target_vendor = "apple"))] - #[cfg_attr(docsrs, doc(cfg(all(feature = "all", target_vendor = "apple"))))] - pub fn bind_device_by_index(&self, interface: Option) -> io::Result<()> { - let index = interface.map(NonZeroU32::get).unwrap_or(0); - unsafe { setsockopt(self.as_raw(), IPPROTO_IP, libc::IP_BOUND_IF, index) } - } - - /// Gets the value for `IP_BOUND_IF` option on this socket, i.e. the index - /// for the interface to which the socket is bound. - /// - /// Returns `None` if the socket is not bound to any interface, otherwise - /// returns an interface index. - #[cfg(all(feature = "all", target_vendor = "apple"))] - #[cfg_attr(docsrs, doc(cfg(all(feature = "all", target_vendor = "apple"))))] - pub fn device_index(&self) -> io::Result> { - let index = - unsafe { getsockopt::(self.as_raw(), IPPROTO_IP, libc::IP_BOUND_IF)? }; - Ok(NonZeroU32::new(index)) - } - - /// Get the value of the `SO_INCOMING_CPU` option on this socket. - /// - /// For more information about this option, see [`set_cpu_affinity`]. - /// - /// [`set_cpu_affinity`]: crate::Socket::set_cpu_affinity - #[cfg(all(feature = "all", target_os = "linux"))] - #[cfg_attr(docsrs, doc(cfg(all(feature = "all", target_os = "linux"))))] - pub fn cpu_affinity(&self) -> io::Result { - unsafe { - getsockopt::(self.as_raw(), libc::SOL_SOCKET, libc::SO_INCOMING_CPU) - .map(|cpu| cpu as usize) - } - } - - /// Set value for the `SO_INCOMING_CPU` option on this socket. - /// - /// Sets the CPU affinity of the socket. - #[cfg(all(feature = "all", target_os = "linux"))] - #[cfg_attr(docsrs, doc(cfg(all(feature = "all", target_os = "linux"))))] - pub fn set_cpu_affinity(&self, cpu: usize) -> io::Result<()> { - unsafe { - setsockopt( - self.as_raw(), - libc::SOL_SOCKET, - libc::SO_INCOMING_CPU, - cpu as c_int, - ) - } - } - - /// Get the value of the `SO_REUSEPORT` option on this socket. - /// - /// For more information about this option, see [`set_reuse_port`]. - /// - /// [`set_reuse_port`]: crate::Socket::set_reuse_port - #[cfg(all( - feature = "all", - not(any(target_os = "solaris", target_os = "illumos")) - ))] - #[cfg_attr( - docsrs, - doc(cfg(all( - feature = "all", - unix, - not(any(target_os = "solaris", target_os = "illumos")) - ))) - )] - pub fn reuse_port(&self) -> io::Result { - unsafe { - getsockopt::(self.as_raw(), libc::SOL_SOCKET, libc::SO_REUSEPORT) - .map(|reuse| reuse != 0) - } - } - - /// Set value for the `SO_REUSEPORT` option on this socket. - /// - /// This indicates that further calls to `bind` may allow reuse of local - /// addresses. For IPv4 sockets this means that a socket may bind even when - /// there's a socket already listening on this port. - #[cfg(all( - feature = "all", - not(any(target_os = "solaris", target_os = "illumos")) - ))] - #[cfg_attr( - docsrs, - doc(cfg(all( - feature = "all", - unix, - not(any(target_os = "solaris", target_os = "illumos")) - ))) - )] - pub fn set_reuse_port(&self, reuse: bool) -> io::Result<()> { - unsafe { - setsockopt( - self.as_raw(), - libc::SOL_SOCKET, - libc::SO_REUSEPORT, - reuse as c_int, - ) - } - } - - /// Get the value of the `IP_FREEBIND` option on this socket. - /// - /// For more information about this option, see [`set_freebind`]. - /// - /// [`set_freebind`]: crate::Socket::set_freebind - #[cfg(all( - feature = "all", - any(target_os = "android", target_os = "fuchsia", target_os = "linux") - ))] - #[cfg_attr( - docsrs, - doc(cfg(all( - feature = "all", - any(target_os = "android", target_os = "fuchsia", target_os = "linux") - ))) - )] - pub fn freebind(&self) -> io::Result { - unsafe { - getsockopt::(self.as_raw(), libc::SOL_IP, libc::IP_FREEBIND) - .map(|freebind| freebind != 0) - } - } - - /// Set value for the `IP_FREEBIND` option on this socket. - /// - /// If enabled, this boolean option allows binding to an IP address that is - /// nonlocal or does not (yet) exist. This permits listening on a socket, - /// without requiring the underlying network interface or the specified - /// dynamic IP address to be up at the time that the application is trying - /// to bind to it. - #[cfg(all( - feature = "all", - any(target_os = "android", target_os = "fuchsia", target_os = "linux") - ))] - #[cfg_attr( - docsrs, - doc(cfg(all( - feature = "all", - any(target_os = "android", target_os = "fuchsia", target_os = "linux") - ))) - )] - pub fn set_freebind(&self, freebind: bool) -> io::Result<()> { - unsafe { - setsockopt( - self.as_raw(), - libc::SOL_IP, - libc::IP_FREEBIND, - freebind as c_int, - ) - } - } - - /// Get the value of the `IPV6_FREEBIND` option on this socket. - /// - /// This is an IPv6 counterpart of `IP_FREEBIND` socket option on - /// Android/Linux. For more information about this option, see - /// [`set_freebind`]. - /// - /// [`set_freebind`]: crate::Socket::set_freebind - #[cfg(all(feature = "all", any(target_os = "android", target_os = "linux")))] - #[cfg_attr( - docsrs, - doc(cfg(all(feature = "all", any(target_os = "android", target_os = "linux")))) - )] - pub fn freebind_ipv6(&self) -> io::Result { - unsafe { - getsockopt::(self.as_raw(), libc::SOL_IPV6, libc::IPV6_FREEBIND) - .map(|freebind| freebind != 0) - } - } - - /// Set value for the `IPV6_FREEBIND` option on this socket. - /// - /// This is an IPv6 counterpart of `IP_FREEBIND` socket option on - /// Android/Linux. For more information about this option, see - /// [`set_freebind`]. - /// - /// [`set_freebind`]: crate::Socket::set_freebind - /// - /// # Examples - /// - /// On Linux: - /// - /// ``` - /// use socket2::{Domain, Socket, Type}; - /// use std::io::{self, Error, ErrorKind}; - /// - /// fn enable_freebind(socket: &Socket) -> io::Result<()> { - /// match socket.domain()? { - /// Domain::IPV4 => socket.set_freebind(true)?, - /// Domain::IPV6 => socket.set_freebind_ipv6(true)?, - /// _ => return Err(Error::new(ErrorKind::Other, "unsupported domain")), - /// }; - /// Ok(()) - /// } - /// - /// # fn main() -> io::Result<()> { - /// # let socket = Socket::new(Domain::IPV6, Type::STREAM, None)?; - /// # enable_freebind(&socket) - /// # } - /// ``` - #[cfg(all(feature = "all", any(target_os = "android", target_os = "linux")))] - #[cfg_attr( - docsrs, - doc(cfg(all(feature = "all", any(target_os = "android", target_os = "linux")))) - )] - pub fn set_freebind_ipv6(&self, freebind: bool) -> io::Result<()> { - unsafe { - setsockopt( - self.as_raw(), - libc::SOL_IPV6, - libc::IPV6_FREEBIND, - freebind as c_int, - ) - } - } - - /// Copies data between a `file` and this socket using the `sendfile(2)` - /// system call. Because this copying is done within the kernel, - /// `sendfile()` is more efficient than the combination of `read(2)` and - /// `write(2)`, which would require transferring data to and from user - /// space. - /// - /// Different OSs support different kinds of `file`s, see the OS - /// documentation for what kind of files are supported. Generally *regular* - /// files are supported by all OSs. - /// - /// The `offset` is the absolute offset into the `file` to use as starting - /// point. - /// - /// Depending on the OS this function *may* change the offset of `file`. For - /// the best results reset the offset of the file before using it again. - /// - /// The `length` determines how many bytes to send, where a length of `None` - /// means it will try to send all bytes. - #[cfg(all( - feature = "all", - any( - target_os = "android", - target_os = "freebsd", - target_os = "linux", - target_vendor = "apple", - ) - ))] - #[cfg_attr( - docsrs, - doc(cfg(all( - feature = "all", - any( - target_os = "android", - target_os = "freebsd", - target_os = "linux", - target_vendor = "apple", - ) - ))) - )] - pub fn sendfile( - &self, - file: &F, - offset: usize, - length: Option, - ) -> io::Result - where - F: AsRawFd, - { - self._sendfile(file.as_raw_fd(), offset as _, length) - } - - #[cfg(all(feature = "all", target_vendor = "apple"))] - fn _sendfile( - &self, - file: RawFd, - offset: libc::off_t, - length: Option, - ) -> io::Result { - // On macOS `length` is value-result parameter. It determines the number - // of bytes to write and returns the number of bytes written. - let mut length = match length { - Some(n) => n.get() as libc::off_t, - // A value of `0` means send all bytes. - None => 0, - }; - syscall!(sendfile( - file, - self.as_raw(), - offset, - &mut length, - ptr::null_mut(), - 0, - )) - .map(|_| length as usize) - } - - #[cfg(all(feature = "all", any(target_os = "android", target_os = "linux")))] - fn _sendfile( - &self, - file: RawFd, - offset: libc::off_t, - length: Option, - ) -> io::Result { - let count = match length { - Some(n) => n.get() as libc::size_t, - // The maximum the Linux kernel will write in a single call. - None => 0x7ffff000, // 2,147,479,552 bytes. - }; - let mut offset = offset; - syscall!(sendfile(self.as_raw(), file, &mut offset, count)).map(|n| n as usize) - } - - #[cfg(all(feature = "all", target_os = "freebsd"))] - fn _sendfile( - &self, - file: RawFd, - offset: libc::off_t, - length: Option, - ) -> io::Result { - let nbytes = match length { - Some(n) => n.get() as libc::size_t, - // A value of `0` means send all bytes. - None => 0, - }; - let mut sbytes: libc::off_t = 0; - syscall!(sendfile( - file, - self.as_raw(), - offset, - nbytes, - ptr::null_mut(), - &mut sbytes, - 0, - )) - .map(|_| sbytes as usize) - } - - /// Set the value of the `TCP_USER_TIMEOUT` option on this socket. - /// - /// If set, this specifies the maximum amount of time that transmitted data may remain - /// unacknowledged or buffered data may remain untransmitted before TCP will forcibly close the - /// corresponding connection. - /// - /// Setting `timeout` to `None` or a zero duration causes the system default timeouts to - /// be used. If `timeout` in milliseconds is larger than `c_uint::MAX`, the timeout is clamped - /// to `c_uint::MAX`. For example, when `c_uint` is a 32-bit value, this limits the timeout to - /// approximately 49.71 days. - #[cfg(all( - feature = "all", - any(target_os = "android", target_os = "fuchsia", target_os = "linux") - ))] - #[cfg_attr( - docsrs, - doc(cfg(all( - feature = "all", - any(target_os = "android", target_os = "fuchsia", target_os = "linux") - ))) - )] - pub fn set_tcp_user_timeout(&self, timeout: Option) -> io::Result<()> { - let timeout = timeout - .map(|to| min(to.as_millis(), libc::c_uint::MAX as u128) as libc::c_uint) - .unwrap_or(0); - unsafe { - setsockopt( - self.as_raw(), - libc::IPPROTO_TCP, - libc::TCP_USER_TIMEOUT, - timeout, - ) - } - } - - /// Get the value of the `TCP_USER_TIMEOUT` option on this socket. - /// - /// For more information about this option, see [`set_tcp_user_timeout`]. - /// - /// [`set_tcp_user_timeout`]: Socket::set_tcp_user_timeout - #[cfg(all( - feature = "all", - any(target_os = "android", target_os = "fuchsia", target_os = "linux") - ))] - #[cfg_attr( - docsrs, - doc(cfg(all( - feature = "all", - any(target_os = "android", target_os = "fuchsia", target_os = "linux") - ))) - )] - pub fn tcp_user_timeout(&self) -> io::Result> { - unsafe { - getsockopt::(self.as_raw(), libc::IPPROTO_TCP, libc::TCP_USER_TIMEOUT) - .map(|millis| { - if millis == 0 { - None - } else { - Some(Duration::from_millis(millis as u64)) - } - }) - } - } - - /// Attach Berkeley Packet Filter(BPF) on this socket. - /// - /// BPF allows a user-space program to attach a filter onto any socket - /// and allow or disallow certain types of data to come through the socket. - /// - /// For more information about this option, see [filter](https://www.kernel.org/doc/html/v5.12/networking/filter.html) - #[cfg(all(feature = "all", any(target_os = "linux", target_os = "android")))] - pub fn attach_filter(&self, filters: &[libc::sock_filter]) -> io::Result<()> { - let prog = libc::sock_fprog { - len: filters.len() as u16, - filter: filters.as_ptr() as *mut _, - }; - - unsafe { - setsockopt( - self.as_raw(), - libc::SOL_SOCKET, - libc::SO_ATTACH_FILTER, - prog, - ) - } - } - - /// Detach Berkeley Packet Filter(BPF) from this socket. - /// - /// For more information about this option, see [`attach_filter`] - #[cfg(all(feature = "all", any(target_os = "linux", target_os = "android")))] - pub fn detach_filter(&self) -> io::Result<()> { - unsafe { setsockopt(self.as_raw(), libc::SOL_SOCKET, libc::SO_DETACH_FILTER, 0) } - } -} - -#[cfg_attr(docsrs, doc(cfg(unix)))] -impl AsRawFd for crate::Socket { - fn as_raw_fd(&self) -> c_int { - self.as_raw() - } -} - -#[cfg_attr(docsrs, doc(cfg(unix)))] -impl IntoRawFd for crate::Socket { - fn into_raw_fd(self) -> c_int { - self.into_raw() - } -} - -#[cfg_attr(docsrs, doc(cfg(unix)))] -impl FromRawFd for crate::Socket { - unsafe fn from_raw_fd(fd: c_int) -> crate::Socket { - crate::Socket::from_raw(fd) - } -} - -#[cfg(feature = "all")] -from!(UnixStream, crate::Socket); -#[cfg(feature = "all")] -from!(UnixListener, crate::Socket); -#[cfg(feature = "all")] -from!(UnixDatagram, crate::Socket); -#[cfg(feature = "all")] -from!(crate::Socket, UnixStream); -#[cfg(feature = "all")] -from!(crate::Socket, UnixListener); -#[cfg(feature = "all")] -from!(crate::Socket, UnixDatagram); - -#[test] -fn in_addr_convertion() { - let ip = Ipv4Addr::new(127, 0, 0, 1); - let raw = to_in_addr(&ip); - // NOTE: `in_addr` is packed on NetBSD and it's unsafe to borrow. - let a = raw.s_addr; - assert_eq!(a, u32::from_ne_bytes([127, 0, 0, 1])); - assert_eq!(from_in_addr(raw), ip); - - let ip = Ipv4Addr::new(127, 34, 4, 12); - let raw = to_in_addr(&ip); - let a = raw.s_addr; - assert_eq!(a, u32::from_ne_bytes([127, 34, 4, 12])); - assert_eq!(from_in_addr(raw), ip); -} - -#[test] -fn in6_addr_convertion() { - let ip = Ipv6Addr::new(0x2000, 1, 2, 3, 4, 5, 6, 7); - let raw = to_in6_addr(&ip); - let want = [32, 0, 0, 1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6, 0, 7]; - assert_eq!(raw.s6_addr, want); - assert_eq!(from_in6_addr(raw), ip); -} diff -Nru temporalio-1.3.0/vendor/socket2-0.4.10/src/sys/windows.rs temporalio-1.3.0/vendor/socket2-0.4.10/src/sys/windows.rs --- temporalio-1.3.0/vendor/socket2-0.4.10/src/sys/windows.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/socket2-0.4.10/src/sys/windows.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,882 +0,0 @@ -// Copyright 2015 The Rust Project Developers. -// -// Licensed under the Apache License, Version 2.0 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -use std::cmp::min; -use std::io::{self, IoSlice}; -use std::marker::PhantomData; -use std::mem::{self, size_of, MaybeUninit}; -use std::net::{self, Ipv4Addr, Ipv6Addr, Shutdown}; -use std::os::windows::prelude::*; -use std::sync::Once; -use std::time::{Duration, Instant}; -use std::{ptr, slice}; - -use winapi::ctypes::c_long; -use winapi::shared::in6addr::*; -use winapi::shared::inaddr::*; -use winapi::shared::minwindef::DWORD; -use winapi::shared::minwindef::ULONG; -use winapi::shared::mstcpip::{tcp_keepalive, SIO_KEEPALIVE_VALS}; -use winapi::shared::ntdef::HANDLE; -use winapi::shared::ws2def; -use winapi::shared::ws2def::WSABUF; -use winapi::um::handleapi::SetHandleInformation; -use winapi::um::processthreadsapi::GetCurrentProcessId; -use winapi::um::winbase::{self, INFINITE}; -use winapi::um::winsock2::{ - self as sock, u_long, POLLERR, POLLHUP, POLLRDNORM, POLLWRNORM, SD_BOTH, SD_RECEIVE, SD_SEND, - WSAPOLLFD, -}; -use winapi::um::winsock2::{SOCKET_ERROR, WSAEMSGSIZE, WSAESHUTDOWN}; - -use crate::{RecvFlags, SockAddr, TcpKeepalive, Type}; - -pub(crate) use winapi::ctypes::c_int; - -/// Fake MSG_TRUNC flag for the [`RecvFlags`] struct. -/// -/// The flag is enabled when a `WSARecv[From]` call returns `WSAEMSGSIZE`. The -/// value of the flag is defined by us. -pub(crate) const MSG_TRUNC: c_int = 0x01; - -// Used in `Domain`. -pub(crate) use winapi::shared::ws2def::{AF_INET, AF_INET6}; -// Used in `Type`. -pub(crate) use winapi::shared::ws2def::{SOCK_DGRAM, SOCK_STREAM}; -#[cfg(feature = "all")] -pub(crate) use winapi::shared::ws2def::{SOCK_RAW, SOCK_SEQPACKET}; -// Used in `Protocol`. -pub(crate) const IPPROTO_ICMP: c_int = winapi::shared::ws2def::IPPROTO_ICMP as c_int; -pub(crate) const IPPROTO_ICMPV6: c_int = winapi::shared::ws2def::IPPROTO_ICMPV6 as c_int; -pub(crate) const IPPROTO_TCP: c_int = winapi::shared::ws2def::IPPROTO_TCP as c_int; -pub(crate) const IPPROTO_UDP: c_int = winapi::shared::ws2def::IPPROTO_UDP as c_int; -// Used in `SockAddr`. -pub(crate) use winapi::shared::ws2def::{ - ADDRESS_FAMILY as sa_family_t, SOCKADDR as sockaddr, SOCKADDR_IN as sockaddr_in, - SOCKADDR_STORAGE as sockaddr_storage, -}; -pub(crate) use winapi::shared::ws2ipdef::SOCKADDR_IN6_LH as sockaddr_in6; -pub(crate) use winapi::um::ws2tcpip::socklen_t; -// Used in `Socket`. -pub(crate) use winapi::shared::ws2def::{ - IPPROTO_IP, SOL_SOCKET, SO_BROADCAST, SO_ERROR, SO_KEEPALIVE, SO_LINGER, SO_OOBINLINE, - SO_RCVBUF, SO_RCVTIMEO, SO_REUSEADDR, SO_SNDBUF, SO_SNDTIMEO, SO_TYPE, TCP_NODELAY, -}; -#[cfg(feature = "all")] -pub(crate) use winapi::shared::ws2ipdef::IP_HDRINCL; -pub(crate) use winapi::shared::ws2ipdef::{ - IPV6_ADD_MEMBERSHIP, IPV6_DROP_MEMBERSHIP, IPV6_MREQ as Ipv6Mreq, IPV6_MULTICAST_HOPS, - IPV6_MULTICAST_IF, IPV6_MULTICAST_LOOP, IPV6_UNICAST_HOPS, IPV6_V6ONLY, IP_ADD_MEMBERSHIP, - IP_ADD_SOURCE_MEMBERSHIP, IP_DROP_MEMBERSHIP, IP_DROP_SOURCE_MEMBERSHIP, IP_MREQ as IpMreq, - IP_MREQ_SOURCE as IpMreqSource, IP_MULTICAST_IF, IP_MULTICAST_LOOP, IP_MULTICAST_TTL, IP_TOS, - IP_TTL, -}; -pub(crate) use winapi::um::winsock2::{linger, MSG_OOB, MSG_PEEK}; -pub(crate) const IPPROTO_IPV6: c_int = winapi::shared::ws2def::IPPROTO_IPV6 as c_int; - -/// Type used in set/getsockopt to retrieve the `TCP_NODELAY` option. -/// -/// NOTE: -/// documents that options such as `TCP_NODELAY` and `SO_KEEPALIVE` expect a -/// `BOOL` (alias for `c_int`, 4 bytes), however in practice this turns out to -/// be false (or misleading) as a `BOOLEAN` (`c_uchar`, 1 byte) is returned by -/// `getsockopt`. -pub(crate) type Bool = winapi::shared::ntdef::BOOLEAN; - -/// Maximum size of a buffer passed to system call like `recv` and `send`. -const MAX_BUF_LEN: usize = ::max_value() as usize; - -/// Helper macro to execute a system call that returns an `io::Result`. -macro_rules! syscall { - ($fn: ident ( $($arg: expr),* $(,)* ), $err_test: path, $err_value: expr) => {{ - #[allow(unused_unsafe)] - let res = unsafe { sock::$fn($($arg, )*) }; - if $err_test(&res, &$err_value) { - Err(io::Error::last_os_error()) - } else { - Ok(res) - } - }}; -} - -impl_debug!( - crate::Domain, - ws2def::AF_INET, - ws2def::AF_INET6, - ws2def::AF_UNIX, - ws2def::AF_UNSPEC, // = 0. -); - -/// Windows only API. -impl Type { - /// Our custom flag to set `WSA_FLAG_NO_HANDLE_INHERIT` on socket creation. - /// Trying to mimic `Type::cloexec` on windows. - const NO_INHERIT: c_int = 1 << ((size_of::() * 8) - 1); // Last bit. - - /// Set `WSA_FLAG_NO_HANDLE_INHERIT` on the socket. - #[cfg(feature = "all")] - #[cfg_attr(docsrs, doc(cfg(all(windows, feature = "all"))))] - pub const fn no_inherit(self) -> Type { - self._no_inherit() - } - - pub(crate) const fn _no_inherit(self) -> Type { - Type(self.0 | Type::NO_INHERIT) - } -} - -impl_debug!( - crate::Type, - ws2def::SOCK_STREAM, - ws2def::SOCK_DGRAM, - ws2def::SOCK_RAW, - ws2def::SOCK_RDM, - ws2def::SOCK_SEQPACKET, -); - -impl_debug!( - crate::Protocol, - self::IPPROTO_ICMP, - self::IPPROTO_ICMPV6, - self::IPPROTO_TCP, - self::IPPROTO_UDP, -); - -impl std::fmt::Debug for RecvFlags { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - f.debug_struct("RecvFlags") - .field("is_truncated", &self.is_truncated()) - .finish() - } -} - -#[repr(transparent)] -pub struct MaybeUninitSlice<'a> { - vec: WSABUF, - _lifetime: PhantomData<&'a mut [MaybeUninit]>, -} - -unsafe impl<'a> Send for MaybeUninitSlice<'a> {} - -unsafe impl<'a> Sync for MaybeUninitSlice<'a> {} - -impl<'a> MaybeUninitSlice<'a> { - pub fn new(buf: &'a mut [MaybeUninit]) -> MaybeUninitSlice<'a> { - assert!(buf.len() <= ULONG::MAX as usize); - MaybeUninitSlice { - vec: WSABUF { - len: buf.len() as ULONG, - buf: buf.as_mut_ptr().cast(), - }, - _lifetime: PhantomData, - } - } - - pub fn as_slice(&self) -> &[MaybeUninit] { - unsafe { slice::from_raw_parts(self.vec.buf.cast(), self.vec.len as usize) } - } - - pub fn as_mut_slice(&mut self) -> &mut [MaybeUninit] { - unsafe { slice::from_raw_parts_mut(self.vec.buf.cast(), self.vec.len as usize) } - } -} - -fn init() { - static INIT: Once = Once::new(); - - INIT.call_once(|| { - // Initialize winsock through the standard library by just creating a - // dummy socket. Whether this is successful or not we drop the result as - // libstd will be sure to have initialized winsock. - let _ = net::UdpSocket::bind("127.0.0.1:34254"); - }); -} - -pub(crate) type Socket = sock::SOCKET; - -pub(crate) unsafe fn socket_from_raw(socket: Socket) -> crate::socket::Inner { - crate::socket::Inner::from_raw_socket(socket as RawSocket) -} - -pub(crate) fn socket_as_raw(socket: &crate::socket::Inner) -> Socket { - socket.as_raw_socket() as Socket -} - -pub(crate) fn socket_into_raw(socket: crate::socket::Inner) -> Socket { - socket.into_raw_socket() as Socket -} - -pub(crate) fn socket(family: c_int, mut ty: c_int, protocol: c_int) -> io::Result { - init(); - - // Check if we set our custom flag. - let flags = if ty & Type::NO_INHERIT != 0 { - ty = ty & !Type::NO_INHERIT; - sock::WSA_FLAG_NO_HANDLE_INHERIT - } else { - 0 - }; - - syscall!( - WSASocketW( - family, - ty, - protocol, - ptr::null_mut(), - 0, - sock::WSA_FLAG_OVERLAPPED | flags, - ), - PartialEq::eq, - sock::INVALID_SOCKET - ) -} - -pub(crate) fn bind(socket: Socket, addr: &SockAddr) -> io::Result<()> { - syscall!(bind(socket, addr.as_ptr(), addr.len()), PartialEq::ne, 0).map(|_| ()) -} - -pub(crate) fn connect(socket: Socket, addr: &SockAddr) -> io::Result<()> { - syscall!(connect(socket, addr.as_ptr(), addr.len()), PartialEq::ne, 0).map(|_| ()) -} - -pub(crate) fn poll_connect(socket: &crate::Socket, timeout: Duration) -> io::Result<()> { - let start = Instant::now(); - - let mut fd_array = WSAPOLLFD { - fd: socket.as_raw(), - events: POLLRDNORM | POLLWRNORM, - revents: 0, - }; - - loop { - let elapsed = start.elapsed(); - if elapsed >= timeout { - return Err(io::ErrorKind::TimedOut.into()); - } - - let timeout = (timeout - elapsed).as_millis(); - let timeout = clamp(timeout, 1, c_int::max_value() as u128) as c_int; - - match syscall!( - WSAPoll(&mut fd_array, 1, timeout), - PartialEq::eq, - sock::SOCKET_ERROR - ) { - Ok(0) => return Err(io::ErrorKind::TimedOut.into()), - Ok(_) => { - // Error or hang up indicates an error (or failure to connect). - if (fd_array.revents & POLLERR) != 0 || (fd_array.revents & POLLHUP) != 0 { - match socket.take_error() { - Ok(Some(err)) => return Err(err), - Ok(None) => { - return Err(io::Error::new( - io::ErrorKind::Other, - "no error set after POLLHUP", - )) - } - Err(err) => return Err(err), - } - } - return Ok(()); - } - // Got interrupted, try again. - Err(ref err) if err.kind() == io::ErrorKind::Interrupted => continue, - Err(err) => return Err(err), - } - } -} - -// TODO: use clamp from std lib, stable since 1.50. -fn clamp(value: T, min: T, max: T) -> T -where - T: Ord, -{ - if value <= min { - min - } else if value >= max { - max - } else { - value - } -} - -pub(crate) fn listen(socket: Socket, backlog: c_int) -> io::Result<()> { - syscall!(listen(socket, backlog), PartialEq::ne, 0).map(|_| ()) -} - -pub(crate) fn accept(socket: Socket) -> io::Result<(Socket, SockAddr)> { - // Safety: `accept` initialises the `SockAddr` for us. - unsafe { - SockAddr::init(|storage, len| { - syscall!( - accept(socket, storage.cast(), len), - PartialEq::eq, - sock::INVALID_SOCKET - ) - }) - } -} - -pub(crate) fn getsockname(socket: Socket) -> io::Result { - // Safety: `getsockname` initialises the `SockAddr` for us. - unsafe { - SockAddr::init(|storage, len| { - syscall!( - getsockname(socket, storage.cast(), len), - PartialEq::eq, - sock::SOCKET_ERROR - ) - }) - } - .map(|(_, addr)| addr) -} - -pub(crate) fn getpeername(socket: Socket) -> io::Result { - // Safety: `getpeername` initialises the `SockAddr` for us. - unsafe { - SockAddr::init(|storage, len| { - syscall!( - getpeername(socket, storage.cast(), len), - PartialEq::eq, - sock::SOCKET_ERROR - ) - }) - } - .map(|(_, addr)| addr) -} - -pub(crate) fn try_clone(socket: Socket) -> io::Result { - let mut info: MaybeUninit = MaybeUninit::uninit(); - syscall!( - WSADuplicateSocketW(socket, GetCurrentProcessId(), info.as_mut_ptr()), - PartialEq::eq, - sock::SOCKET_ERROR - )?; - // Safety: `WSADuplicateSocketW` intialised `info` for us. - let mut info = unsafe { info.assume_init() }; - - syscall!( - WSASocketW( - info.iAddressFamily, - info.iSocketType, - info.iProtocol, - &mut info, - 0, - sock::WSA_FLAG_OVERLAPPED | sock::WSA_FLAG_NO_HANDLE_INHERIT, - ), - PartialEq::eq, - sock::INVALID_SOCKET - ) -} - -pub(crate) fn set_nonblocking(socket: Socket, nonblocking: bool) -> io::Result<()> { - let mut nonblocking = nonblocking as u_long; - ioctlsocket(socket, sock::FIONBIO, &mut nonblocking) -} - -pub(crate) fn shutdown(socket: Socket, how: Shutdown) -> io::Result<()> { - let how = match how { - Shutdown::Write => SD_SEND, - Shutdown::Read => SD_RECEIVE, - Shutdown::Both => SD_BOTH, - }; - syscall!(shutdown(socket, how), PartialEq::eq, sock::SOCKET_ERROR).map(|_| ()) -} - -pub(crate) fn recv(socket: Socket, buf: &mut [MaybeUninit], flags: c_int) -> io::Result { - let res = syscall!( - recv( - socket, - buf.as_mut_ptr().cast(), - min(buf.len(), MAX_BUF_LEN) as c_int, - flags, - ), - PartialEq::eq, - sock::SOCKET_ERROR - ); - match res { - Ok(n) => Ok(n as usize), - Err(ref err) if err.raw_os_error() == Some(sock::WSAESHUTDOWN as i32) => Ok(0), - Err(err) => Err(err), - } -} - -pub(crate) fn recv_vectored( - socket: Socket, - bufs: &mut [crate::MaybeUninitSlice<'_>], - flags: c_int, -) -> io::Result<(usize, RecvFlags)> { - let mut nread = 0; - let mut flags = flags as DWORD; - let res = syscall!( - WSARecv( - socket, - bufs.as_mut_ptr().cast(), - min(bufs.len(), DWORD::max_value() as usize) as DWORD, - &mut nread, - &mut flags, - ptr::null_mut(), - None, - ), - PartialEq::eq, - sock::SOCKET_ERROR - ); - match res { - Ok(_) => Ok((nread as usize, RecvFlags(0))), - Err(ref err) if err.raw_os_error() == Some(sock::WSAESHUTDOWN as i32) => { - Ok((0, RecvFlags(0))) - } - Err(ref err) if err.raw_os_error() == Some(sock::WSAEMSGSIZE as i32) => { - Ok((nread as usize, RecvFlags(MSG_TRUNC))) - } - Err(err) => Err(err), - } -} - -pub(crate) fn recv_from( - socket: Socket, - buf: &mut [MaybeUninit], - flags: c_int, -) -> io::Result<(usize, SockAddr)> { - // Safety: `recvfrom` initialises the `SockAddr` for us. - unsafe { - SockAddr::init(|storage, addrlen| { - let res = syscall!( - recvfrom( - socket, - buf.as_mut_ptr().cast(), - min(buf.len(), MAX_BUF_LEN) as c_int, - flags, - storage.cast(), - addrlen, - ), - PartialEq::eq, - sock::SOCKET_ERROR - ); - match res { - Ok(n) => Ok(n as usize), - Err(ref err) if err.raw_os_error() == Some(sock::WSAESHUTDOWN as i32) => Ok(0), - Err(err) => Err(err), - } - }) - } -} - -pub(crate) fn peek_sender(socket: Socket) -> io::Result { - // Safety: `recvfrom` initialises the `SockAddr` for us. - let ((), sender) = unsafe { - SockAddr::init(|storage, addrlen| { - let res = syscall!( - recvfrom( - socket, - // Windows *appears* not to care if you pass a null pointer. - ptr::null_mut(), - 0, - MSG_PEEK, - storage.cast(), - addrlen, - ), - PartialEq::eq, - SOCKET_ERROR - ); - match res { - Ok(_n) => Ok(()), - Err(e) => match e.raw_os_error() { - Some(code) if code == (WSAESHUTDOWN as i32) || code == (WSAEMSGSIZE as i32) => { - Ok(()) - } - _ => Err(e), - }, - } - }) - }?; - - Ok(sender) -} - -pub(crate) fn recv_from_vectored( - socket: Socket, - bufs: &mut [crate::MaybeUninitSlice<'_>], - flags: c_int, -) -> io::Result<(usize, RecvFlags, SockAddr)> { - // Safety: `recvfrom` initialises the `SockAddr` for us. - unsafe { - SockAddr::init(|storage, addrlen| { - let mut nread = 0; - let mut flags = flags as DWORD; - let res = syscall!( - WSARecvFrom( - socket, - bufs.as_mut_ptr().cast(), - min(bufs.len(), DWORD::max_value() as usize) as DWORD, - &mut nread, - &mut flags, - storage.cast(), - addrlen, - ptr::null_mut(), - None, - ), - PartialEq::eq, - sock::SOCKET_ERROR - ); - match res { - Ok(_) => Ok((nread as usize, RecvFlags(0))), - Err(ref err) if err.raw_os_error() == Some(sock::WSAESHUTDOWN as i32) => { - Ok((nread as usize, RecvFlags(0))) - } - Err(ref err) if err.raw_os_error() == Some(sock::WSAEMSGSIZE as i32) => { - Ok((nread as usize, RecvFlags(MSG_TRUNC))) - } - Err(err) => Err(err), - } - }) - } - .map(|((n, recv_flags), addr)| (n, recv_flags, addr)) -} - -pub(crate) fn send(socket: Socket, buf: &[u8], flags: c_int) -> io::Result { - syscall!( - send( - socket, - buf.as_ptr().cast(), - min(buf.len(), MAX_BUF_LEN) as c_int, - flags, - ), - PartialEq::eq, - sock::SOCKET_ERROR - ) - .map(|n| n as usize) -} - -pub(crate) fn send_vectored( - socket: Socket, - bufs: &[IoSlice<'_>], - flags: c_int, -) -> io::Result { - let mut nsent = 0; - syscall!( - WSASend( - socket, - // FIXME: From the `WSASend` docs [1]: - // > For a Winsock application, once the WSASend function is called, - // > the system owns these buffers and the application may not - // > access them. - // - // So what we're doing is actually UB as `bufs` needs to be `&mut - // [IoSlice<'_>]`. - // - // Tracking issue: https://github.com/rust-lang/socket2-rs/issues/129. - // - // NOTE: `send_to_vectored` has the same problem. - // - // [1] https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsasend - bufs.as_ptr() as *mut _, - min(bufs.len(), DWORD::max_value() as usize) as DWORD, - &mut nsent, - flags as DWORD, - std::ptr::null_mut(), - None, - ), - PartialEq::eq, - sock::SOCKET_ERROR - ) - .map(|_| nsent as usize) -} - -pub(crate) fn send_to( - socket: Socket, - buf: &[u8], - addr: &SockAddr, - flags: c_int, -) -> io::Result { - syscall!( - sendto( - socket, - buf.as_ptr().cast(), - min(buf.len(), MAX_BUF_LEN) as c_int, - flags, - addr.as_ptr(), - addr.len(), - ), - PartialEq::eq, - sock::SOCKET_ERROR - ) - .map(|n| n as usize) -} - -pub(crate) fn send_to_vectored( - socket: Socket, - bufs: &[IoSlice<'_>], - addr: &SockAddr, - flags: c_int, -) -> io::Result { - let mut nsent = 0; - syscall!( - WSASendTo( - socket, - // FIXME: Same problem as in `send_vectored`. - bufs.as_ptr() as *mut _, - bufs.len().min(DWORD::MAX as usize) as DWORD, - &mut nsent, - flags as DWORD, - addr.as_ptr(), - addr.len(), - ptr::null_mut(), - None, - ), - PartialEq::eq, - sock::SOCKET_ERROR - ) - .map(|_| nsent as usize) -} - -/// Wrapper around `getsockopt` to deal with platform specific timeouts. -pub(crate) fn timeout_opt(fd: Socket, lvl: c_int, name: c_int) -> io::Result> { - unsafe { getsockopt(fd, lvl, name).map(from_ms) } -} - -fn from_ms(duration: DWORD) -> Option { - if duration == 0 { - None - } else { - let secs = duration / 1000; - let nsec = (duration % 1000) * 1000000; - Some(Duration::new(secs as u64, nsec as u32)) - } -} - -/// Wrapper around `setsockopt` to deal with platform specific timeouts. -pub(crate) fn set_timeout_opt( - fd: Socket, - level: c_int, - optname: c_int, - duration: Option, -) -> io::Result<()> { - let duration = into_ms(duration); - unsafe { setsockopt(fd, level, optname, duration) } -} - -fn into_ms(duration: Option) -> DWORD { - // Note that a duration is a (u64, u32) (seconds, nanoseconds) pair, and the - // timeouts in windows APIs are typically u32 milliseconds. To translate, we - // have two pieces to take care of: - // - // * Nanosecond precision is rounded up - // * Greater than u32::MAX milliseconds (50 days) is rounded up to - // INFINITE (never time out). - duration - .map(|duration| min(duration.as_millis(), INFINITE as u128) as DWORD) - .unwrap_or(0) -} - -pub(crate) fn set_tcp_keepalive(socket: Socket, keepalive: &TcpKeepalive) -> io::Result<()> { - let mut keepalive = tcp_keepalive { - onoff: 1, - keepalivetime: into_ms(keepalive.time), - keepaliveinterval: into_ms(keepalive.interval), - }; - let mut out = 0; - syscall!( - WSAIoctl( - socket, - SIO_KEEPALIVE_VALS, - &mut keepalive as *mut _ as *mut _, - size_of::() as _, - ptr::null_mut(), - 0, - &mut out, - ptr::null_mut(), - None, - ), - PartialEq::eq, - sock::SOCKET_ERROR - ) - .map(|_| ()) -} - -/// Caller must ensure `T` is the correct type for `level` and `optname`. -pub(crate) unsafe fn getsockopt(socket: Socket, level: c_int, optname: c_int) -> io::Result { - let mut optval: MaybeUninit = MaybeUninit::uninit(); - let mut optlen = mem::size_of::() as c_int; - syscall!( - getsockopt( - socket, - level, - optname, - optval.as_mut_ptr().cast(), - &mut optlen, - ), - PartialEq::eq, - sock::SOCKET_ERROR - ) - .map(|_| { - debug_assert_eq!(optlen as usize, mem::size_of::()); - // Safety: `getsockopt` initialised `optval` for us. - optval.assume_init() - }) -} - -/// Caller must ensure `T` is the correct type for `level` and `optname`. -pub(crate) unsafe fn setsockopt( - socket: Socket, - level: c_int, - optname: c_int, - optval: T, -) -> io::Result<()> { - syscall!( - setsockopt( - socket, - level, - optname, - (&optval as *const T).cast(), - mem::size_of::() as c_int, - ), - PartialEq::eq, - sock::SOCKET_ERROR - ) - .map(|_| ()) -} - -fn ioctlsocket(socket: Socket, cmd: c_long, payload: &mut u_long) -> io::Result<()> { - syscall!( - ioctlsocket(socket, cmd, payload), - PartialEq::eq, - sock::SOCKET_ERROR - ) - .map(|_| ()) -} - -pub(crate) fn to_in_addr(addr: &Ipv4Addr) -> IN_ADDR { - let mut s_un: in_addr_S_un = unsafe { mem::zeroed() }; - // `S_un` is stored as BE on all machines, and the array is in BE order. So - // the native endian conversion method is used so that it's never swapped. - unsafe { *(s_un.S_addr_mut()) = u32::from_ne_bytes(addr.octets()) }; - IN_ADDR { S_un: s_un } -} - -pub(crate) fn from_in_addr(in_addr: IN_ADDR) -> Ipv4Addr { - Ipv4Addr::from(unsafe { *in_addr.S_un.S_addr() }.to_ne_bytes()) -} - -pub(crate) fn to_in6_addr(addr: &Ipv6Addr) -> in6_addr { - let mut ret_addr: in6_addr_u = unsafe { mem::zeroed() }; - unsafe { *(ret_addr.Byte_mut()) = addr.octets() }; - let mut ret: in6_addr = unsafe { mem::zeroed() }; - ret.u = ret_addr; - ret -} - -pub(crate) fn from_in6_addr(addr: in6_addr) -> Ipv6Addr { - Ipv6Addr::from(*unsafe { addr.u.Byte() }) -} - -pub(crate) fn to_mreqn( - multiaddr: &Ipv4Addr, - interface: &crate::socket::InterfaceIndexOrAddress, -) -> IpMreq { - IpMreq { - imr_multiaddr: to_in_addr(multiaddr), - // Per https://docs.microsoft.com/en-us/windows/win32/api/ws2ipdef/ns-ws2ipdef-ip_mreq#members: - // - // imr_interface - // - // The local IPv4 address of the interface or the interface index on - // which the multicast group should be joined or dropped. This value is - // in network byte order. If this member specifies an IPv4 address of - // 0.0.0.0, the default IPv4 multicast interface is used. - // - // To use an interface index of 1 would be the same as an IP address of - // 0.0.0.1. - imr_interface: match interface { - crate::socket::InterfaceIndexOrAddress::Index(interface) => { - to_in_addr(&(*interface).into()) - } - crate::socket::InterfaceIndexOrAddress::Address(interface) => to_in_addr(interface), - }, - } -} - -/// Windows only API. -impl crate::Socket { - /// Sets `HANDLE_FLAG_INHERIT` using `SetHandleInformation`. - #[cfg(feature = "all")] - #[cfg_attr(docsrs, doc(cfg(all(windows, feature = "all"))))] - pub fn set_no_inherit(&self, no_inherit: bool) -> io::Result<()> { - self._set_no_inherit(no_inherit) - } - - pub(crate) fn _set_no_inherit(&self, no_inherit: bool) -> io::Result<()> { - // NOTE: can't use `syscall!` because it expects the function in the - // `sock::` path. - let res = unsafe { - SetHandleInformation( - self.as_raw() as HANDLE, - winbase::HANDLE_FLAG_INHERIT, - !no_inherit as _, - ) - }; - if res == 0 { - // Zero means error. - Err(io::Error::last_os_error()) - } else { - Ok(()) - } - } -} - -impl AsRawSocket for crate::Socket { - fn as_raw_socket(&self) -> RawSocket { - self.as_raw() as RawSocket - } -} - -impl IntoRawSocket for crate::Socket { - fn into_raw_socket(self) -> RawSocket { - self.into_raw() as RawSocket - } -} - -impl FromRawSocket for crate::Socket { - unsafe fn from_raw_socket(socket: RawSocket) -> crate::Socket { - crate::Socket::from_raw(socket as Socket) - } -} - -#[test] -fn in_addr_convertion() { - let ip = Ipv4Addr::new(127, 0, 0, 1); - let raw = to_in_addr(&ip); - assert_eq!(unsafe { *raw.S_un.S_addr() }, 127 << 0 | 1 << 24); - assert_eq!(from_in_addr(raw), ip); - - let ip = Ipv4Addr::new(127, 34, 4, 12); - let raw = to_in_addr(&ip); - assert_eq!( - unsafe { *raw.S_un.S_addr() }, - 127 << 0 | 34 << 8 | 4 << 16 | 12 << 24 - ); - assert_eq!(from_in_addr(raw), ip); -} - -#[test] -fn in6_addr_convertion() { - let ip = Ipv6Addr::new(0x2000, 1, 2, 3, 4, 5, 6, 7); - let raw = to_in6_addr(&ip); - let want = [ - 0x2000u16.to_be(), - 1u16.to_be(), - 2u16.to_be(), - 3u16.to_be(), - 4u16.to_be(), - 5u16.to_be(), - 6u16.to_be(), - 7u16.to_be(), - ]; - assert_eq!(unsafe { *raw.u.Word() }, want); - assert_eq!(from_in6_addr(raw), ip); -} diff -Nru temporalio-1.3.0/vendor/socket2-0.4.9/.cargo-checksum.json temporalio-1.3.0/vendor/socket2-0.4.9/.cargo-checksum.json --- temporalio-1.3.0/vendor/socket2-0.4.9/.cargo-checksum.json 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/socket2-0.4.9/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1 @@ +{"files":{"Cargo.toml":"a923f376ccc72eace3803c02342d6ef8c1d0fde8af4fcdb3e86bc55e4b31e800","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397","README.md":"b3fadb399050f2755504188e81dec8150f6a1eba86b6410a9ce9c1ea0c850287","src/lib.rs":"0805b736e0cde0ae1d064ff1887f8ae37b219d17309d427be122d5ccd51c116b","src/sockaddr.rs":"a2b7f7c8959b8ff1546d1f1b38f305b22607d7a59c0698e5a8f9cfd81e4b8ede","src/socket.rs":"bd938d210a9763b0ed3395b192698c36c4f88e44adb8f3aaf12a6743efeffa2a","src/sockref.rs":"02de263cce039aaddaee5d6c2bb3940bdfae5697a3fc9df47d226fb3cac03cd9","src/sys/unix.rs":"6db80abf67e6a4555280eba076371798cab333fcb4729fab2a460a5d709f9667","src/sys/windows.rs":"d271c768295c0f84e79f6286aa783ce15ab0265f150195824fdcd10003dada33"},"package":"64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/socket2-0.4.9/Cargo.toml temporalio-1.3.0/vendor/socket2-0.4.9/Cargo.toml --- temporalio-1.3.0/vendor/socket2-0.4.9/Cargo.toml 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/socket2-0.4.9/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,68 @@ +# 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 = "socket2" +version = "0.4.9" +authors = [ + "Alex Crichton ", + "Thomas de Zeeuw ", +] +include = [ + "Cargo.toml", + "LICENSE-APACHE", + "LICENSE-MIT", + "README.md", + "src/**/*.rs", +] +description = """ +Utilities for handling networking sockets with a maximal amount of configuration +possible intended. +""" +homepage = "https://github.com/rust-lang/socket2" +documentation = "https://docs.rs/socket2" +readme = "README.md" +keywords = [ + "io", + "socket", + "network", +] +categories = [ + "api-bindings", + "network-programming", +] +license = "MIT OR Apache-2.0" +repository = "https://github.com/rust-lang/socket2" + +[package.metadata.docs.rs] +all-features = true +rustdoc-args = [ + "--cfg", + "docsrs", +] + +[package.metadata.playground] +features = ["all"] + +[features] +all = [] + +[target."cfg(unix)".dependencies.libc] +version = "0.2.139" + +[target."cfg(windows)".dependencies.winapi] +version = "0.3.9" +features = [ + "handleapi", + "ws2ipdef", + "ws2tcpip", +] diff -Nru temporalio-1.3.0/vendor/socket2-0.4.9/LICENSE-APACHE temporalio-1.3.0/vendor/socket2-0.4.9/LICENSE-APACHE --- temporalio-1.3.0/vendor/socket2-0.4.9/LICENSE-APACHE 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/socket2-0.4.9/LICENSE-APACHE 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff -Nru temporalio-1.3.0/vendor/socket2-0.4.9/LICENSE-MIT temporalio-1.3.0/vendor/socket2-0.4.9/LICENSE-MIT --- temporalio-1.3.0/vendor/socket2-0.4.9/LICENSE-MIT 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/socket2-0.4.9/LICENSE-MIT 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,25 @@ +Copyright (c) 2014 Alex Crichton + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff -Nru temporalio-1.3.0/vendor/socket2-0.4.9/README.md temporalio-1.3.0/vendor/socket2-0.4.9/README.md --- temporalio-1.3.0/vendor/socket2-0.4.9/README.md 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/socket2-0.4.9/README.md 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,84 @@ +# Socket2 + +Socket2 is a crate that provides utilities for creating and using sockets. + +The goal of this crate is to create and use a socket using advanced +configuration options (those that are not available in the types in the standard +library) without using any unsafe code. + +This crate provides as direct as possible access to the system's functionality +for sockets, this means little effort to provide cross-platform utilities. It is +up to the user to know how to use sockets when using this crate. *If you don't +know how to create a socket using libc/system calls then this crate is not for +you*. Most, if not all, functions directly relate to the equivalent system call +with no error handling applied, so no handling errors such as `EINTR`. As a +result using this crate can be a little wordy, but it should give you maximal +flexibility over configuration of sockets. + +See the [API documentation] for more. + +[API documentation]: https://docs.rs/socket2 + +# Two branches + +Currently Socket2 supports two versions: v0.4 and v0.3. Version 0.4 is developed +in the master branch, version 0.3 in the [v0.3.x branch]. + +[v0.3.x branch]: https://github.com/rust-lang/socket2/tree/v0.3.x + +# OS support + +Socket2 attempts to support the same OS/architectures as Rust does, see +https://doc.rust-lang.org/nightly/rustc/platform-support.html. However this is +not always possible, below is current list of support OSs. + +*If your favorite OS is not on the list consider contributing it! See [issue +#78].* + +[issue #78]: https://github.com/rust-lang/socket2/issues/78 + +### Tier 1 + +These OSs are tested with each commit in the CI and must always pass the tests. +All functions/types/etc., excluding ones behind the `all` feature, must work on +these OSs. + +* Linux +* macOS +* Windows + +### Tier 2 + +These OSs are currently build in the CI, but not tested. Not all +functions/types/etc. may work on these OSs, even ones **not** behind the `all` +feature flag. + +* Android +* FreeBSD +* Fuchsia +* iOS +* illumos +* NetBSD +* Redox +* Solaris + +# Minimum Supported Rust Version (MSRV) + +Socket2 uses 1.46.0 as MSRV. + +# License + +This project is licensed under either of + + * Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or + https://www.apache.org/licenses/LICENSE-2.0) + * MIT license ([LICENSE-MIT](LICENSE-MIT) or + https://opensource.org/licenses/MIT) + +at your option. + +### Contribution + +Unless you explicitly state otherwise, any contribution intentionally submitted +for inclusion in this project by you, as defined in the Apache-2.0 license, +shall be dual licensed as above, without any additional terms or conditions. diff -Nru temporalio-1.3.0/vendor/socket2-0.4.9/src/lib.rs temporalio-1.3.0/vendor/socket2-0.4.9/src/lib.rs --- temporalio-1.3.0/vendor/socket2-0.4.9/src/lib.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/socket2-0.4.9/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,475 @@ +// Copyright 2015 The Rust Project Developers. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +//! Utilities for creating and using sockets. +//! +//! The goal of this crate is to create and use a socket using advanced +//! configuration options (those that are not available in the types in the +//! standard library) without using any unsafe code. +//! +//! This crate provides as direct as possible access to the system's +//! functionality for sockets, this means little effort to provide +//! cross-platform utilities. It is up to the user to know how to use sockets +//! when using this crate. *If you don't know how to create a socket using +//! libc/system calls then this crate is not for you*. Most, if not all, +//! functions directly relate to the equivalent system call with no error +//! handling applied, so no handling errors such as [`EINTR`]. As a result using +//! this crate can be a little wordy, but it should give you maximal flexibility +//! over configuration of sockets. +//! +//! [`EINTR`]: std::io::ErrorKind::Interrupted +//! +//! # Examples +//! +//! ```no_run +//! # fn main() -> std::io::Result<()> { +//! use std::net::{SocketAddr, TcpListener}; +//! use socket2::{Socket, Domain, Type}; +//! +//! // Create a TCP listener bound to two addresses. +//! let socket = Socket::new(Domain::IPV6, Type::STREAM, None)?; +//! +//! socket.set_only_v6(false)?; +//! let address: SocketAddr = "[::1]:12345".parse().unwrap(); +//! socket.bind(&address.into())?; +//! socket.listen(128)?; +//! +//! let listener: TcpListener = socket.into(); +//! // ... +//! # drop(listener); +//! # Ok(()) } +//! ``` +//! +//! ## Features +//! +//! This crate has a single feature `all`, which enables all functions even ones +//! that are not available on all OSs. + +#![doc(html_root_url = "https://docs.rs/socket2/0.4")] +#![deny(missing_docs, missing_debug_implementations, rust_2018_idioms)] +// Show required OS/features on docs.rs. +#![cfg_attr(docsrs, feature(doc_cfg))] +// Disallow warnings when running tests. +#![cfg_attr(test, deny(warnings))] +// Disallow warnings in examples. +#![doc(test(attr(deny(warnings))))] + +use std::fmt; +use std::mem::MaybeUninit; +use std::net::SocketAddr; +use std::ops::{Deref, DerefMut}; +use std::time::Duration; + +/// Macro to implement `fmt::Debug` for a type, printing the constant names +/// rather than a number. +/// +/// Note this is used in the `sys` module and thus must be defined before +/// defining the modules. +macro_rules! impl_debug { + ( + // Type name for which to implement `fmt::Debug`. + $type: path, + $( + $(#[$target: meta])* + // The flag(s) to check. + // Need to specific the libc crate because Windows doesn't use + // `libc` but `winapi`. + $libc: ident :: $flag: ident + ),+ $(,)* + ) => { + impl std::fmt::Debug for $type { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let string = match self.0 { + $( + $(#[$target])* + $libc :: $flag => stringify!($flag), + )+ + n => return write!(f, "{}", n), + }; + f.write_str(string) + } + } + }; +} + +/// Macro to convert from one network type to another. +macro_rules! from { + ($from: ty, $for: ty) => { + impl From<$from> for $for { + fn from(socket: $from) -> $for { + #[cfg(unix)] + unsafe { + <$for>::from_raw_fd(socket.into_raw_fd()) + } + #[cfg(windows)] + unsafe { + <$for>::from_raw_socket(socket.into_raw_socket()) + } + } + } + }; +} + +mod sockaddr; +mod socket; +mod sockref; + +#[cfg_attr(unix, path = "sys/unix.rs")] +#[cfg_attr(windows, path = "sys/windows.rs")] +mod sys; + +#[cfg(not(any(windows, unix)))] +compile_error!("Socket2 doesn't support the compile target"); + +use sys::c_int; + +pub use sockaddr::SockAddr; +pub use socket::Socket; +pub use sockref::SockRef; + +#[cfg(not(any( + target_os = "haiku", + target_os = "illumos", + target_os = "netbsd", + target_os = "redox", + target_os = "solaris", +)))] +pub use socket::InterfaceIndexOrAddress; + +/// Specification of the communication domain for a socket. +/// +/// This is a newtype wrapper around an integer which provides a nicer API in +/// addition to an injection point for documentation. Convenience constants such +/// as [`Domain::IPV4`], [`Domain::IPV6`], etc, are provided to avoid reaching +/// into libc for various constants. +/// +/// This type is freely interconvertible with C's `int` type, however, if a raw +/// value needs to be provided. +#[derive(Copy, Clone, Eq, PartialEq)] +pub struct Domain(c_int); + +impl Domain { + /// Domain for IPv4 communication, corresponding to `AF_INET`. + pub const IPV4: Domain = Domain(sys::AF_INET); + + /// Domain for IPv6 communication, corresponding to `AF_INET6`. + pub const IPV6: Domain = Domain(sys::AF_INET6); + + /// Returns the correct domain for `address`. + pub const fn for_address(address: SocketAddr) -> Domain { + match address { + SocketAddr::V4(_) => Domain::IPV4, + SocketAddr::V6(_) => Domain::IPV6, + } + } +} + +impl From for Domain { + fn from(d: c_int) -> Domain { + Domain(d) + } +} + +impl From for c_int { + fn from(d: Domain) -> c_int { + d.0 + } +} + +/// Specification of communication semantics on a socket. +/// +/// This is a newtype wrapper around an integer which provides a nicer API in +/// addition to an injection point for documentation. Convenience constants such +/// as [`Type::STREAM`], [`Type::DGRAM`], etc, are provided to avoid reaching +/// into libc for various constants. +/// +/// This type is freely interconvertible with C's `int` type, however, if a raw +/// value needs to be provided. +#[derive(Copy, Clone, Eq, PartialEq)] +pub struct Type(c_int); + +impl Type { + /// Type corresponding to `SOCK_STREAM`. + /// + /// Used for protocols such as TCP. + pub const STREAM: Type = Type(sys::SOCK_STREAM); + + /// Type corresponding to `SOCK_DGRAM`. + /// + /// Used for protocols such as UDP. + pub const DGRAM: Type = Type(sys::SOCK_DGRAM); + + /// Type corresponding to `SOCK_SEQPACKET`. + #[cfg(feature = "all")] + #[cfg_attr(docsrs, doc(cfg(feature = "all")))] + pub const SEQPACKET: Type = Type(sys::SOCK_SEQPACKET); + + /// Type corresponding to `SOCK_RAW`. + #[cfg(all(feature = "all", not(target_os = "redox")))] + #[cfg_attr(docsrs, doc(cfg(all(feature = "all", not(target_os = "redox")))))] + pub const RAW: Type = Type(sys::SOCK_RAW); +} + +impl From for Type { + fn from(t: c_int) -> Type { + Type(t) + } +} + +impl From for c_int { + fn from(t: Type) -> c_int { + t.0 + } +} + +/// Protocol specification used for creating sockets via `Socket::new`. +/// +/// This is a newtype wrapper around an integer which provides a nicer API in +/// addition to an injection point for documentation. +/// +/// This type is freely interconvertible with C's `int` type, however, if a raw +/// value needs to be provided. +#[derive(Copy, Clone, Eq, PartialEq)] +pub struct Protocol(c_int); + +impl Protocol { + /// Protocol corresponding to `ICMPv4`. + pub const ICMPV4: Protocol = Protocol(sys::IPPROTO_ICMP); + + /// Protocol corresponding to `ICMPv6`. + pub const ICMPV6: Protocol = Protocol(sys::IPPROTO_ICMPV6); + + /// Protocol corresponding to `TCP`. + pub const TCP: Protocol = Protocol(sys::IPPROTO_TCP); + + /// Protocol corresponding to `UDP`. + pub const UDP: Protocol = Protocol(sys::IPPROTO_UDP); +} + +impl From for Protocol { + fn from(p: c_int) -> Protocol { + Protocol(p) + } +} + +impl From for c_int { + fn from(p: Protocol) -> c_int { + p.0 + } +} + +/// Flags for incoming messages. +/// +/// Flags provide additional information about incoming messages. +#[cfg(not(target_os = "redox"))] +#[cfg_attr(docsrs, doc(cfg(not(target_os = "redox"))))] +#[derive(Copy, Clone, Eq, PartialEq)] +pub struct RecvFlags(c_int); + +#[cfg(not(target_os = "redox"))] +impl RecvFlags { + /// Check if the message contains a truncated datagram. + /// + /// This flag is only used for datagram-based sockets, + /// not for stream sockets. + /// + /// On Unix this corresponds to the `MSG_TRUNC` flag. + /// On Windows this corresponds to the `WSAEMSGSIZE` error code. + pub const fn is_truncated(self) -> bool { + self.0 & sys::MSG_TRUNC != 0 + } +} + +/// A version of [`IoSliceMut`] that allows the buffer to be uninitialised. +/// +/// [`IoSliceMut`]: std::io::IoSliceMut +#[repr(transparent)] +pub struct MaybeUninitSlice<'a>(sys::MaybeUninitSlice<'a>); + +impl<'a> fmt::Debug for MaybeUninitSlice<'a> { + fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { + fmt::Debug::fmt(self.0.as_slice(), fmt) + } +} + +impl<'a> MaybeUninitSlice<'a> { + /// Creates a new `MaybeUninitSlice` wrapping a byte slice. + /// + /// # Panics + /// + /// Panics on Windows if the slice is larger than 4GB. + pub fn new(buf: &'a mut [MaybeUninit]) -> MaybeUninitSlice<'a> { + MaybeUninitSlice(sys::MaybeUninitSlice::new(buf)) + } +} + +impl<'a> Deref for MaybeUninitSlice<'a> { + type Target = [MaybeUninit]; + + fn deref(&self) -> &[MaybeUninit] { + self.0.as_slice() + } +} + +impl<'a> DerefMut for MaybeUninitSlice<'a> { + fn deref_mut(&mut self) -> &mut [MaybeUninit] { + self.0.as_mut_slice() + } +} + +/// Configures a socket's TCP keepalive parameters. +/// +/// See [`Socket::set_tcp_keepalive`]. +#[derive(Debug, Clone)] +pub struct TcpKeepalive { + #[cfg_attr(target_os = "openbsd", allow(dead_code))] + time: Option, + #[cfg(not(any( + target_os = "openbsd", + target_os = "redox", + target_os = "solaris", + target_os = "nto", + )))] + interval: Option, + #[cfg(not(any( + target_os = "openbsd", + target_os = "redox", + target_os = "solaris", + target_os = "windows", + target_os = "nto", + )))] + retries: Option, +} + +impl TcpKeepalive { + /// Returns a new, empty set of TCP keepalive parameters. + pub const fn new() -> TcpKeepalive { + TcpKeepalive { + time: None, + #[cfg(not(any( + target_os = "openbsd", + target_os = "redox", + target_os = "solaris", + target_os = "nto", + )))] + interval: None, + #[cfg(not(any( + target_os = "openbsd", + target_os = "redox", + target_os = "solaris", + target_os = "windows", + target_os = "nto", + )))] + retries: None, + } + } + + /// Set the amount of time after which TCP keepalive probes will be sent on + /// idle connections. + /// + /// This will set `TCP_KEEPALIVE` on macOS and iOS, and + /// `TCP_KEEPIDLE` on all other Unix operating systems, except + /// OpenBSD and Haiku which don't support any way to set this + /// option. On Windows, this sets the value of the `tcp_keepalive` + /// struct's `keepalivetime` field. + /// + /// Some platforms specify this value in seconds, so sub-second + /// specifications may be omitted. + pub const fn with_time(self, time: Duration) -> Self { + Self { + time: Some(time), + ..self + } + } + + /// Set the value of the `TCP_KEEPINTVL` option. On Windows, this sets the + /// value of the `tcp_keepalive` struct's `keepaliveinterval` field. + /// + /// Sets the time interval between TCP keepalive probes. + /// + /// Some platforms specify this value in seconds, so sub-second + /// specifications may be omitted. + #[cfg(all( + feature = "all", + any( + target_os = "android", + target_os = "dragonfly", + target_os = "freebsd", + target_os = "fuchsia", + target_os = "illumos", + target_os = "linux", + target_os = "netbsd", + target_vendor = "apple", + windows, + ) + ))] + #[cfg_attr( + docsrs, + doc(cfg(all( + feature = "all", + any( + target_os = "android", + target_os = "dragonfly", + target_os = "freebsd", + target_os = "fuchsia", + target_os = "illumos", + target_os = "linux", + target_os = "netbsd", + target_vendor = "apple", + windows, + ) + ))) + )] + pub const fn with_interval(self, interval: Duration) -> Self { + Self { + interval: Some(interval), + ..self + } + } + + /// Set the value of the `TCP_KEEPCNT` option. + /// + /// Set the maximum number of TCP keepalive probes that will be sent before + /// dropping a connection, if TCP keepalive is enabled on this socket. + #[cfg(all( + feature = "all", + any( + doc, + target_os = "android", + target_os = "dragonfly", + target_os = "freebsd", + target_os = "fuchsia", + target_os = "illumos", + target_os = "linux", + target_os = "netbsd", + target_vendor = "apple", + ) + ))] + #[cfg_attr( + docsrs, + doc(cfg(all( + feature = "all", + any( + target_os = "android", + target_os = "dragonfly", + target_os = "freebsd", + target_os = "fuchsia", + target_os = "illumos", + target_os = "linux", + target_os = "netbsd", + target_vendor = "apple", + ) + ))) + )] + pub const fn with_retries(self, retries: u32) -> Self { + Self { + retries: Some(retries), + ..self + } + } +} diff -Nru temporalio-1.3.0/vendor/socket2-0.4.9/src/sockaddr.rs temporalio-1.3.0/vendor/socket2-0.4.9/src/sockaddr.rs --- temporalio-1.3.0/vendor/socket2-0.4.9/src/sockaddr.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/socket2-0.4.9/src/sockaddr.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,350 @@ +use std::mem::{self, size_of, MaybeUninit}; +use std::net::{SocketAddr, SocketAddrV4, SocketAddrV6}; +use std::{fmt, io}; + +use crate::sys::{ + sa_family_t, sockaddr, sockaddr_in, sockaddr_in6, sockaddr_storage, socklen_t, AF_INET, + AF_INET6, +}; +#[cfg(windows)] +use winapi::shared::ws2ipdef::SOCKADDR_IN6_LH_u; + +/// The address of a socket. +/// +/// `SockAddr`s may be constructed directly to and from the standard library +/// [`SocketAddr`], [`SocketAddrV4`], and [`SocketAddrV6`] types. +#[derive(Clone)] +pub struct SockAddr { + storage: sockaddr_storage, + len: socklen_t, +} + +#[allow(clippy::len_without_is_empty)] +impl SockAddr { + /// Create a `SockAddr` from the underlying storage and its length. + /// + /// # Safety + /// + /// Caller must ensure that the address family and length match the type of + /// storage address. For example if `storage.ss_family` is set to `AF_INET` + /// the `storage` must be initialised as `sockaddr_in`, setting the content + /// and length appropriately. + /// + /// # Examples + /// + /// ``` + /// # fn main() -> std::io::Result<()> { + /// # #[cfg(unix)] { + /// use std::io; + /// use std::mem; + /// use std::os::unix::io::AsRawFd; + /// + /// use socket2::{SockAddr, Socket, Domain, Type}; + /// + /// let socket = Socket::new(Domain::IPV4, Type::STREAM, None)?; + /// + /// // Initialise a `SocketAddr` byte calling `getsockname(2)`. + /// let mut addr_storage: libc::sockaddr_storage = unsafe { mem::zeroed() }; + /// let mut len = mem::size_of_val(&addr_storage) as libc::socklen_t; + /// + /// // The `getsockname(2)` system call will intiliase `storage` for + /// // us, setting `len` to the correct length. + /// let res = unsafe { + /// libc::getsockname( + /// socket.as_raw_fd(), + /// (&mut addr_storage as *mut libc::sockaddr_storage).cast(), + /// &mut len, + /// ) + /// }; + /// if res == -1 { + /// return Err(io::Error::last_os_error()); + /// } + /// + /// let address = unsafe { SockAddr::new(addr_storage, len) }; + /// # drop(address); + /// # } + /// # Ok(()) + /// # } + /// ``` + pub const unsafe fn new(storage: sockaddr_storage, len: socklen_t) -> SockAddr { + SockAddr { storage, len } + } + + /// Initialise a `SockAddr` by calling the function `init`. + /// + /// The type of the address storage and length passed to the function `init` + /// is OS/architecture specific. + /// + /// The address is zeroed before `init` is called and is thus valid to + /// dereference and read from. The length initialised to the maximum length + /// of the storage. + /// + /// # Safety + /// + /// Caller must ensure that the address family and length match the type of + /// storage address. For example if `storage.ss_family` is set to `AF_INET` + /// the `storage` must be initialised as `sockaddr_in`, setting the content + /// and length appropriately. + /// + /// # Examples + /// + /// ``` + /// # fn main() -> std::io::Result<()> { + /// # #[cfg(unix)] { + /// use std::io; + /// use std::os::unix::io::AsRawFd; + /// + /// use socket2::{SockAddr, Socket, Domain, Type}; + /// + /// let socket = Socket::new(Domain::IPV4, Type::STREAM, None)?; + /// + /// // Initialise a `SocketAddr` byte calling `getsockname(2)`. + /// let (_, address) = unsafe { + /// SockAddr::init(|addr_storage, len| { + /// // The `getsockname(2)` system call will intiliase `storage` for + /// // us, setting `len` to the correct length. + /// if libc::getsockname(socket.as_raw_fd(), addr_storage.cast(), len) == -1 { + /// Err(io::Error::last_os_error()) + /// } else { + /// Ok(()) + /// } + /// }) + /// }?; + /// # drop(address); + /// # } + /// # Ok(()) + /// # } + /// ``` + pub unsafe fn init(init: F) -> io::Result<(T, SockAddr)> + where + F: FnOnce(*mut sockaddr_storage, *mut socklen_t) -> io::Result, + { + const STORAGE_SIZE: socklen_t = size_of::() as socklen_t; + // NOTE: `SockAddr::unix` depends on the storage being zeroed before + // calling `init`. + // NOTE: calling `recvfrom` with an empty buffer also depends on the + // storage being zeroed before calling `init` as the OS might not + // initialise it. + let mut storage = MaybeUninit::::zeroed(); + let mut len = STORAGE_SIZE; + init(storage.as_mut_ptr(), &mut len).map(|res| { + debug_assert!(len <= STORAGE_SIZE, "overflown address storage"); + let addr = SockAddr { + // Safety: zeroed-out `sockaddr_storage` is valid, caller must + // ensure at least `len` bytes are valid. + storage: storage.assume_init(), + len, + }; + (res, addr) + }) + } + + /// Returns this address's family. + pub const fn family(&self) -> sa_family_t { + self.storage.ss_family + } + + /// Returns the size of this address in bytes. + pub const fn len(&self) -> socklen_t { + self.len + } + + /// Returns a raw pointer to the address. + pub const fn as_ptr(&self) -> *const sockaddr { + &self.storage as *const _ as *const _ + } + + /// Returns a raw pointer to the address storage. + #[cfg(all(unix, not(target_os = "redox")))] + pub(crate) const fn as_storage_ptr(&self) -> *const sockaddr_storage { + &self.storage + } + + /// Returns this address as a `SocketAddr` if it is in the `AF_INET` (IPv4) + /// or `AF_INET6` (IPv6) family, otherwise returns `None`. + pub fn as_socket(&self) -> Option { + if self.storage.ss_family == AF_INET as sa_family_t { + // Safety: if the ss_family field is AF_INET then storage must be a sockaddr_in. + let addr = unsafe { &*(&self.storage as *const _ as *const sockaddr_in) }; + + let ip = crate::sys::from_in_addr(addr.sin_addr); + let port = u16::from_be(addr.sin_port); + Some(SocketAddr::V4(SocketAddrV4::new(ip, port))) + } else if self.storage.ss_family == AF_INET6 as sa_family_t { + // Safety: if the ss_family field is AF_INET6 then storage must be a sockaddr_in6. + let addr = unsafe { &*(&self.storage as *const _ as *const sockaddr_in6) }; + + let ip = crate::sys::from_in6_addr(addr.sin6_addr); + let port = u16::from_be(addr.sin6_port); + Some(SocketAddr::V6(SocketAddrV6::new( + ip, + port, + addr.sin6_flowinfo, + #[cfg(unix)] + addr.sin6_scope_id, + #[cfg(windows)] + unsafe { + *addr.u.sin6_scope_id() + }, + ))) + } else { + None + } + } + + /// Returns this address as a [`SocketAddrV4`] if it is in the `AF_INET` + /// family. + pub fn as_socket_ipv4(&self) -> Option { + match self.as_socket() { + Some(SocketAddr::V4(addr)) => Some(addr), + _ => None, + } + } + + /// Returns this address as a [`SocketAddrV6`] if it is in the `AF_INET6` + /// family. + pub fn as_socket_ipv6(&self) -> Option { + match self.as_socket() { + Some(SocketAddr::V6(addr)) => Some(addr), + _ => None, + } + } +} + +impl From for SockAddr { + fn from(addr: SocketAddr) -> SockAddr { + match addr { + SocketAddr::V4(addr) => addr.into(), + SocketAddr::V6(addr) => addr.into(), + } + } +} + +impl From for SockAddr { + fn from(addr: SocketAddrV4) -> SockAddr { + let sockaddr_in = sockaddr_in { + sin_family: AF_INET as sa_family_t, + sin_port: addr.port().to_be(), + sin_addr: crate::sys::to_in_addr(addr.ip()), + sin_zero: Default::default(), + #[cfg(any( + target_os = "dragonfly", + target_os = "freebsd", + target_os = "haiku", + target_os = "ios", + target_os = "macos", + target_os = "netbsd", + target_os = "openbsd" + ))] + sin_len: 0, + }; + let mut storage = MaybeUninit::::zeroed(); + // Safety: A `sockaddr_in` is memory compatible with a `sockaddr_storage` + unsafe { (storage.as_mut_ptr() as *mut sockaddr_in).write(sockaddr_in) }; + SockAddr { + storage: unsafe { storage.assume_init() }, + len: mem::size_of::() as socklen_t, + } + } +} + +impl From for SockAddr { + fn from(addr: SocketAddrV6) -> SockAddr { + #[cfg(windows)] + let u = unsafe { + let mut u = mem::zeroed::(); + *u.sin6_scope_id_mut() = addr.scope_id(); + u + }; + + let sockaddr_in6 = sockaddr_in6 { + sin6_family: AF_INET6 as sa_family_t, + sin6_port: addr.port().to_be(), + sin6_addr: crate::sys::to_in6_addr(addr.ip()), + sin6_flowinfo: addr.flowinfo(), + #[cfg(unix)] + sin6_scope_id: addr.scope_id(), + #[cfg(windows)] + u, + #[cfg(any( + target_os = "dragonfly", + target_os = "freebsd", + target_os = "haiku", + target_os = "ios", + target_os = "macos", + target_os = "netbsd", + target_os = "openbsd" + ))] + sin6_len: 0, + #[cfg(any(target_os = "solaris", target_os = "illumos"))] + __sin6_src_id: 0, + }; + let mut storage = MaybeUninit::::zeroed(); + // Safety: A `sockaddr_in6` is memory compatible with a `sockaddr_storage` + unsafe { (storage.as_mut_ptr() as *mut sockaddr_in6).write(sockaddr_in6) }; + SockAddr { + storage: unsafe { storage.assume_init() }, + len: mem::size_of::() as socklen_t, + } + } +} + +impl fmt::Debug for SockAddr { + fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { + let mut f = fmt.debug_struct("SockAddr"); + #[cfg(any( + target_os = "dragonfly", + target_os = "freebsd", + target_os = "haiku", + target_os = "hermit", + target_os = "ios", + target_os = "macos", + target_os = "netbsd", + target_os = "openbsd", + target_os = "vxworks", + target_os = "nto", + ))] + f.field("ss_len", &self.storage.ss_len); + f.field("ss_family", &self.storage.ss_family) + .field("len", &self.len) + .finish() + } +} + +#[test] +fn ipv4() { + use std::net::Ipv4Addr; + let std = SocketAddrV4::new(Ipv4Addr::new(1, 2, 3, 4), 9876); + let addr = SockAddr::from(std); + assert_eq!(addr.family(), AF_INET as sa_family_t); + assert_eq!(addr.len(), size_of::() as socklen_t); + assert_eq!(addr.as_socket(), Some(SocketAddr::V4(std))); + assert_eq!(addr.as_socket_ipv4(), Some(std)); + assert!(addr.as_socket_ipv6().is_none()); + + let addr = SockAddr::from(SocketAddr::from(std)); + assert_eq!(addr.family(), AF_INET as sa_family_t); + assert_eq!(addr.len(), size_of::() as socklen_t); + assert_eq!(addr.as_socket(), Some(SocketAddr::V4(std))); + assert_eq!(addr.as_socket_ipv4(), Some(std)); + assert!(addr.as_socket_ipv6().is_none()); +} + +#[test] +fn ipv6() { + use std::net::Ipv6Addr; + let std = SocketAddrV6::new(Ipv6Addr::new(1, 2, 3, 4, 5, 6, 7, 8), 9876, 11, 12); + let addr = SockAddr::from(std); + assert_eq!(addr.family(), AF_INET6 as sa_family_t); + assert_eq!(addr.len(), size_of::() as socklen_t); + assert_eq!(addr.as_socket(), Some(SocketAddr::V6(std))); + assert!(addr.as_socket_ipv4().is_none()); + assert_eq!(addr.as_socket_ipv6(), Some(std)); + + let addr = SockAddr::from(SocketAddr::from(std)); + assert_eq!(addr.family(), AF_INET6 as sa_family_t); + assert_eq!(addr.len(), size_of::() as socklen_t); + assert_eq!(addr.as_socket(), Some(SocketAddr::V6(std))); + assert!(addr.as_socket_ipv4().is_none()); + assert_eq!(addr.as_socket_ipv6(), Some(std)); +} diff -Nru temporalio-1.3.0/vendor/socket2-0.4.9/src/socket.rs temporalio-1.3.0/vendor/socket2-0.4.9/src/socket.rs --- temporalio-1.3.0/vendor/socket2-0.4.9/src/socket.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/socket2-0.4.9/src/socket.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,1938 @@ +// Copyright 2015 The Rust Project Developers. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +use std::fmt; +use std::io::{self, Read, Write}; +#[cfg(not(target_os = "redox"))] +use std::io::{IoSlice, IoSliceMut}; +use std::mem::MaybeUninit; +#[cfg(not(target_os = "nto"))] +use std::net::Ipv6Addr; +use std::net::{self, Ipv4Addr, Shutdown}; +#[cfg(unix)] +use std::os::unix::io::{FromRawFd, IntoRawFd}; +#[cfg(windows)] +use std::os::windows::io::{FromRawSocket, IntoRawSocket}; +use std::time::Duration; + +use crate::sys::{self, c_int, getsockopt, setsockopt, Bool}; +use crate::{Domain, Protocol, SockAddr, TcpKeepalive, Type}; +#[cfg(not(target_os = "redox"))] +use crate::{MaybeUninitSlice, RecvFlags}; + +/// Owned wrapper around a system socket. +/// +/// This type simply wraps an instance of a file descriptor (`c_int`) on Unix +/// and an instance of `SOCKET` on Windows. This is the main type exported by +/// this crate and is intended to mirror the raw semantics of sockets on +/// platforms as closely as possible. Almost all methods correspond to +/// precisely one libc or OS API call which is essentially just a "Rustic +/// translation" of what's below. +/// +/// ## Converting to and from other types +/// +/// This type can be freely converted into the network primitives provided by +/// the standard library, such as [`TcpStream`] or [`UdpSocket`], using the +/// [`From`] trait, see the example below. +/// +/// [`TcpStream`]: std::net::TcpStream +/// [`UdpSocket`]: std::net::UdpSocket +/// +/// # Notes +/// +/// Some methods that set options on `Socket` require two system calls to set +/// there options without overwriting previously set options. We do this by +/// first getting the current settings, applying the desired changes and than +/// updating the settings. This means that the operation is **not** atomic. This +/// can lead to a data race when two threads are changing options in parallel. +/// +/// # Examples +/// ```no_run +/// # fn main() -> std::io::Result<()> { +/// use std::net::{SocketAddr, TcpListener}; +/// use socket2::{Socket, Domain, Type}; +/// +/// // create a TCP listener bound to two addresses +/// let socket = Socket::new(Domain::IPV4, Type::STREAM, None)?; +/// +/// let address: SocketAddr = "[::1]:12345".parse().unwrap(); +/// let address = address.into(); +/// socket.bind(&address)?; +/// socket.bind(&address)?; +/// socket.listen(128)?; +/// +/// let listener: TcpListener = socket.into(); +/// // ... +/// # drop(listener); +/// # Ok(()) } +/// ``` +pub struct Socket { + inner: Inner, +} + +/// Store a `TcpStream` internally to take advantage of its niche optimizations on Unix platforms. +pub(crate) type Inner = std::net::TcpStream; + +impl Socket { + /// # Safety + /// + /// The caller must ensure `raw` is a valid file descriptor/socket. NOTE: + /// this should really be marked `unsafe`, but this being an internal + /// function, often passed as mapping function, it's makes it very + /// inconvenient to mark it as `unsafe`. + pub(crate) fn from_raw(raw: sys::Socket) -> Socket { + Socket { + inner: unsafe { + // SAFETY: the caller must ensure that `raw` is a valid file + // descriptor, but when it isn't it could return I/O errors, or + // potentially close a fd it doesn't own. All of that isn't + // memory unsafe, so it's not desired but never memory unsafe or + // causes UB. + // + // However there is one exception. We use `TcpStream` to + // represent the `Socket` internally (see `Inner` type), + // `TcpStream` has a layout optimisation that doesn't allow for + // negative file descriptors (as those are always invalid). + // Violating this assumption (fd never negative) causes UB, + // something we don't want. So check for that we have this + // `assert!`. + #[cfg(unix)] + assert!(raw >= 0, "tried to create a `Socket` with an invalid fd"); + sys::socket_from_raw(raw) + }, + } + } + + pub(crate) fn as_raw(&self) -> sys::Socket { + sys::socket_as_raw(&self.inner) + } + + pub(crate) fn into_raw(self) -> sys::Socket { + sys::socket_into_raw(self.inner) + } + + /// Creates a new socket and sets common flags. + /// + /// This function corresponds to `socket(2)` on Unix and `WSASocketW` on + /// Windows. + /// + /// On Unix-like systems, the close-on-exec flag is set on the new socket. + /// Additionally, on Apple platforms `SOCK_NOSIGPIPE` is set. On Windows, + /// the socket is made non-inheritable. + /// + /// [`Socket::new_raw`] can be used if you don't want these flags to be set. + pub fn new(domain: Domain, ty: Type, protocol: Option) -> io::Result { + let ty = set_common_type(ty); + Socket::new_raw(domain, ty, protocol).and_then(set_common_flags) + } + + /// Creates a new socket ready to be configured. + /// + /// This function corresponds to `socket(2)` on Unix and `WSASocketW` on + /// Windows and simply creates a new socket, no other configuration is done. + pub fn new_raw(domain: Domain, ty: Type, protocol: Option) -> io::Result { + let protocol = protocol.map(|p| p.0).unwrap_or(0); + sys::socket(domain.0, ty.0, protocol).map(Socket::from_raw) + } + + /// Creates a pair of sockets which are connected to each other. + /// + /// This function corresponds to `socketpair(2)`. + /// + /// This function sets the same flags as in done for [`Socket::new`], + /// [`Socket::pair_raw`] can be used if you don't want to set those flags. + #[cfg(any(doc, all(feature = "all", unix)))] + #[cfg_attr(docsrs, doc(cfg(all(feature = "all", unix))))] + pub fn pair( + domain: Domain, + ty: Type, + protocol: Option, + ) -> io::Result<(Socket, Socket)> { + let ty = set_common_type(ty); + let (a, b) = Socket::pair_raw(domain, ty, protocol)?; + let a = set_common_flags(a)?; + let b = set_common_flags(b)?; + Ok((a, b)) + } + + /// Creates a pair of sockets which are connected to each other. + /// + /// This function corresponds to `socketpair(2)`. + #[cfg(any(doc, all(feature = "all", unix)))] + #[cfg_attr(docsrs, doc(cfg(all(feature = "all", unix))))] + pub fn pair_raw( + domain: Domain, + ty: Type, + protocol: Option, + ) -> io::Result<(Socket, Socket)> { + let protocol = protocol.map(|p| p.0).unwrap_or(0); + sys::socketpair(domain.0, ty.0, protocol) + .map(|[a, b]| (Socket::from_raw(a), Socket::from_raw(b))) + } + + /// Binds this socket to the specified address. + /// + /// This function directly corresponds to the `bind(2)` function on Windows + /// and Unix. + pub fn bind(&self, address: &SockAddr) -> io::Result<()> { + sys::bind(self.as_raw(), address) + } + + /// Initiate a connection on this socket to the specified address. + /// + /// This function directly corresponds to the `connect(2)` function on + /// Windows and Unix. + /// + /// An error will be returned if `listen` or `connect` has already been + /// called on this builder. + /// + /// # Notes + /// + /// When using a non-blocking connect (by setting the socket into + /// non-blocking mode before calling this function), socket option can't be + /// set *while connecting*. This will cause errors on Windows. Socket + /// options can be safely set before and after connecting the socket. + pub fn connect(&self, address: &SockAddr) -> io::Result<()> { + sys::connect(self.as_raw(), address) + } + + /// Initiate a connection on this socket to the specified address, only + /// only waiting for a certain period of time for the connection to be + /// established. + /// + /// Unlike many other methods on `Socket`, this does *not* correspond to a + /// single C function. It sets the socket to nonblocking mode, connects via + /// connect(2), and then waits for the connection to complete with poll(2) + /// on Unix and select on Windows. When the connection is complete, the + /// socket is set back to blocking mode. On Unix, this will loop over + /// `EINTR` errors. + /// + /// # Warnings + /// + /// The non-blocking state of the socket is overridden by this function - + /// it will be returned in blocking mode on success, and in an indeterminate + /// state on failure. + /// + /// If the connection request times out, it may still be processing in the + /// background - a second call to `connect` or `connect_timeout` may fail. + pub fn connect_timeout(&self, addr: &SockAddr, timeout: Duration) -> io::Result<()> { + self.set_nonblocking(true)?; + let res = self.connect(addr); + self.set_nonblocking(false)?; + + match res { + Ok(()) => return Ok(()), + Err(ref e) if e.kind() == io::ErrorKind::WouldBlock => {} + #[cfg(unix)] + Err(ref e) if e.raw_os_error() == Some(libc::EINPROGRESS) => {} + Err(e) => return Err(e), + } + + sys::poll_connect(self, timeout) + } + + /// Mark a socket as ready to accept incoming connection requests using + /// [`Socket::accept()`]. + /// + /// This function directly corresponds to the `listen(2)` function on + /// Windows and Unix. + /// + /// An error will be returned if `listen` or `connect` has already been + /// called on this builder. + pub fn listen(&self, backlog: c_int) -> io::Result<()> { + sys::listen(self.as_raw(), backlog) + } + + /// Accept a new incoming connection from this listener. + /// + /// This function uses `accept4(2)` on platforms that support it and + /// `accept(2)` platforms that do not. + /// + /// This function sets the same flags as in done for [`Socket::new`], + /// [`Socket::accept_raw`] can be used if you don't want to set those flags. + pub fn accept(&self) -> io::Result<(Socket, SockAddr)> { + // Use `accept4` on platforms that support it. + #[cfg(any( + target_os = "android", + target_os = "dragonfly", + target_os = "freebsd", + target_os = "fuchsia", + target_os = "illumos", + target_os = "linux", + target_os = "netbsd", + target_os = "openbsd", + ))] + return self._accept4(libc::SOCK_CLOEXEC); + + // Fall back to `accept` on platforms that do not support `accept4`. + #[cfg(not(any( + target_os = "android", + target_os = "dragonfly", + target_os = "freebsd", + target_os = "fuchsia", + target_os = "illumos", + target_os = "linux", + target_os = "netbsd", + target_os = "openbsd", + )))] + { + let (socket, addr) = self.accept_raw()?; + let socket = set_common_flags(socket)?; + // `set_common_flags` does not disable inheritance on Windows because `Socket::new` + // unlike `accept` is able to create the socket with inheritance disabled. + #[cfg(windows)] + socket._set_no_inherit(true)?; + Ok((socket, addr)) + } + } + + /// Accept a new incoming connection from this listener. + /// + /// This function directly corresponds to the `accept(2)` function on + /// Windows and Unix. + pub fn accept_raw(&self) -> io::Result<(Socket, SockAddr)> { + sys::accept(self.as_raw()).map(|(inner, addr)| (Socket::from_raw(inner), addr)) + } + + /// Returns the socket address of the local half of this socket. + /// + /// # Notes + /// + /// Depending on the OS this may return an error if the socket is not + /// [bound]. + /// + /// [bound]: Socket::bind + pub fn local_addr(&self) -> io::Result { + sys::getsockname(self.as_raw()) + } + + /// Returns the socket address of the remote peer of this socket. + /// + /// # Notes + /// + /// This returns an error if the socket is not [`connect`ed]. + /// + /// [`connect`ed]: Socket::connect + pub fn peer_addr(&self) -> io::Result { + sys::getpeername(self.as_raw()) + } + + /// Returns the [`Type`] of this socket by checking the `SO_TYPE` option on + /// this socket. + pub fn r#type(&self) -> io::Result { + unsafe { getsockopt::(self.as_raw(), sys::SOL_SOCKET, sys::SO_TYPE).map(Type) } + } + + /// Creates a new independently owned handle to the underlying socket. + /// + /// # Notes + /// + /// On Unix this uses `F_DUPFD_CLOEXEC` and thus sets the `FD_CLOEXEC` on + /// the returned socket. + /// + /// On Windows this uses `WSA_FLAG_NO_HANDLE_INHERIT` setting inheriting to + /// false. + /// + /// On Windows this can **not** be used function cannot be used on a + /// QOS-enabled socket, see + /// . + pub fn try_clone(&self) -> io::Result { + sys::try_clone(self.as_raw()).map(Socket::from_raw) + } + + /// Moves this TCP stream into or out of nonblocking mode. + /// + /// # Notes + /// + /// On Unix this corresponds to calling `fcntl` (un)setting `O_NONBLOCK`. + /// + /// On Windows this corresponds to calling `ioctlsocket` (un)setting + /// `FIONBIO`. + pub fn set_nonblocking(&self, nonblocking: bool) -> io::Result<()> { + sys::set_nonblocking(self.as_raw(), nonblocking) + } + + /// Shuts down the read, write, or both halves of this connection. + /// + /// This function will cause all pending and future I/O on the specified + /// portions to return immediately with an appropriate value. + pub fn shutdown(&self, how: Shutdown) -> io::Result<()> { + sys::shutdown(self.as_raw(), how) + } + + /// Receives data on the socket from the remote address to which it is + /// connected. + /// + /// The [`connect`] method will connect this socket to a remote address. + /// This method might fail if the socket is not connected. + /// + /// [`connect`]: Socket::connect + /// + /// # Safety + /// + /// Normally casting a `&mut [u8]` to `&mut [MaybeUninit]` would be + /// unsound, as that allows us to write uninitialised bytes to the buffer. + /// However this implementation promises to not write uninitialised bytes to + /// the `buf`fer and passes it directly to `recv(2)` system call. This + /// promise ensures that this function can be called using a `buf`fer of + /// type `&mut [u8]`. + /// + /// Note that the [`io::Read::read`] implementation calls this function with + /// a `buf`fer of type `&mut [u8]`, allowing initialised buffers to be used + /// without using `unsafe`. + pub fn recv(&self, buf: &mut [MaybeUninit]) -> io::Result { + self.recv_with_flags(buf, 0) + } + + /// Receives out-of-band (OOB) data on the socket from the remote address to + /// which it is connected by setting the `MSG_OOB` flag for this call. + /// + /// For more information, see [`recv`], [`out_of_band_inline`]. + /// + /// [`recv`]: Socket::recv + /// [`out_of_band_inline`]: Socket::out_of_band_inline + pub fn recv_out_of_band(&self, buf: &mut [MaybeUninit]) -> io::Result { + self.recv_with_flags(buf, sys::MSG_OOB) + } + + /// Identical to [`recv`] but allows for specification of arbitrary flags to + /// the underlying `recv` call. + /// + /// [`recv`]: Socket::recv + pub fn recv_with_flags( + &self, + buf: &mut [MaybeUninit], + flags: sys::c_int, + ) -> io::Result { + sys::recv(self.as_raw(), buf, flags) + } + + /// Receives data on the socket from the remote address to which it is + /// connected. Unlike [`recv`] this allows passing multiple buffers. + /// + /// The [`connect`] method will connect this socket to a remote address. + /// This method might fail if the socket is not connected. + /// + /// In addition to the number of bytes read, this function returns the flags + /// for the received message. See [`RecvFlags`] for more information about + /// the returned flags. + /// + /// [`recv`]: Socket::recv + /// [`connect`]: Socket::connect + /// + /// # Safety + /// + /// Normally casting a `IoSliceMut` to `MaybeUninitSlice` would be unsound, + /// as that allows us to write uninitialised bytes to the buffer. However + /// this implementation promises to not write uninitialised bytes to the + /// `bufs` and passes it directly to `recvmsg(2)` system call. This promise + /// ensures that this function can be called using `bufs` of type `&mut + /// [IoSliceMut]`. + /// + /// Note that the [`io::Read::read_vectored`] implementation calls this + /// function with `buf`s of type `&mut [IoSliceMut]`, allowing initialised + /// buffers to be used without using `unsafe`. + #[cfg(not(target_os = "redox"))] + #[cfg_attr(docsrs, doc(cfg(not(target_os = "redox"))))] + pub fn recv_vectored( + &self, + bufs: &mut [MaybeUninitSlice<'_>], + ) -> io::Result<(usize, RecvFlags)> { + self.recv_vectored_with_flags(bufs, 0) + } + + /// Identical to [`recv_vectored`] but allows for specification of arbitrary + /// flags to the underlying `recvmsg`/`WSARecv` call. + /// + /// [`recv_vectored`]: Socket::recv_vectored + /// + /// # Safety + /// + /// `recv_from_vectored` makes the same safety guarantees regarding `bufs` + /// as [`recv_vectored`]. + /// + /// [`recv_vectored`]: Socket::recv_vectored + #[cfg(not(target_os = "redox"))] + #[cfg_attr(docsrs, doc(cfg(not(target_os = "redox"))))] + pub fn recv_vectored_with_flags( + &self, + bufs: &mut [MaybeUninitSlice<'_>], + flags: c_int, + ) -> io::Result<(usize, RecvFlags)> { + sys::recv_vectored(self.as_raw(), bufs, flags) + } + + /// Receives data on the socket from the remote adress to which it is + /// connected, without removing that data from the queue. On success, + /// returns the number of bytes peeked. + /// + /// Successive calls return the same data. This is accomplished by passing + /// `MSG_PEEK` as a flag to the underlying `recv` system call. + /// + /// # Safety + /// + /// `peek` makes the same safety guarantees regarding the `buf`fer as + /// [`recv`]. + /// + /// [`recv`]: Socket::recv + pub fn peek(&self, buf: &mut [MaybeUninit]) -> io::Result { + self.recv_with_flags(buf, sys::MSG_PEEK) + } + + /// Receives data from the socket. On success, returns the number of bytes + /// read and the address from whence the data came. + /// + /// # Safety + /// + /// `recv_from` makes the same safety guarantees regarding the `buf`fer as + /// [`recv`]. + /// + /// [`recv`]: Socket::recv + pub fn recv_from(&self, buf: &mut [MaybeUninit]) -> io::Result<(usize, SockAddr)> { + self.recv_from_with_flags(buf, 0) + } + + /// Identical to [`recv_from`] but allows for specification of arbitrary + /// flags to the underlying `recvfrom` call. + /// + /// [`recv_from`]: Socket::recv_from + pub fn recv_from_with_flags( + &self, + buf: &mut [MaybeUninit], + flags: c_int, + ) -> io::Result<(usize, SockAddr)> { + sys::recv_from(self.as_raw(), buf, flags) + } + + /// Receives data from the socket. Returns the amount of bytes read, the + /// [`RecvFlags`] and the remote address from the data is coming. Unlike + /// [`recv_from`] this allows passing multiple buffers. + /// + /// [`recv_from`]: Socket::recv_from + /// + /// # Safety + /// + /// `recv_from_vectored` makes the same safety guarantees regarding `bufs` + /// as [`recv_vectored`]. + /// + /// [`recv_vectored`]: Socket::recv_vectored + #[cfg(not(target_os = "redox"))] + #[cfg_attr(docsrs, doc(cfg(not(target_os = "redox"))))] + pub fn recv_from_vectored( + &self, + bufs: &mut [MaybeUninitSlice<'_>], + ) -> io::Result<(usize, RecvFlags, SockAddr)> { + self.recv_from_vectored_with_flags(bufs, 0) + } + + /// Identical to [`recv_from_vectored`] but allows for specification of + /// arbitrary flags to the underlying `recvmsg`/`WSARecvFrom` call. + /// + /// [`recv_from_vectored`]: Socket::recv_from_vectored + /// + /// # Safety + /// + /// `recv_from_vectored` makes the same safety guarantees regarding `bufs` + /// as [`recv_vectored`]. + /// + /// [`recv_vectored`]: Socket::recv_vectored + #[cfg(not(target_os = "redox"))] + #[cfg_attr(docsrs, doc(cfg(not(target_os = "redox"))))] + pub fn recv_from_vectored_with_flags( + &self, + bufs: &mut [MaybeUninitSlice<'_>], + flags: c_int, + ) -> io::Result<(usize, RecvFlags, SockAddr)> { + sys::recv_from_vectored(self.as_raw(), bufs, flags) + } + + /// Receives data from the socket, without removing it from the queue. + /// + /// Successive calls return the same data. This is accomplished by passing + /// `MSG_PEEK` as a flag to the underlying `recvfrom` system call. + /// + /// On success, returns the number of bytes peeked and the address from + /// whence the data came. + /// + /// # Safety + /// + /// `peek_from` makes the same safety guarantees regarding the `buf`fer as + /// [`recv`]. + /// + /// # Note: Datagram Sockets + /// For datagram sockets, the behavior of this method when `buf` is smaller than + /// the datagram at the head of the receive queue differs between Windows and + /// Unix-like platforms (Linux, macOS, BSDs, etc: colloquially termed "*nix"). + /// + /// On *nix platforms, the datagram is truncated to the length of `buf`. + /// + /// On Windows, an error corresponding to `WSAEMSGSIZE` will be returned. + /// + /// For consistency between platforms, be sure to provide a sufficiently large buffer to avoid + /// truncation; the exact size required depends on the underlying protocol. + /// + /// If you just want to know the sender of the data, try [`peek_sender`]. + /// + /// [`recv`]: Socket::recv + /// [`peek_sender`]: Socket::peek_sender + pub fn peek_from(&self, buf: &mut [MaybeUninit]) -> io::Result<(usize, SockAddr)> { + self.recv_from_with_flags(buf, sys::MSG_PEEK) + } + + /// Retrieve the sender for the data at the head of the receive queue. + /// + /// This is equivalent to calling [`peek_from`] with a zero-sized buffer, + /// but suppresses the `WSAEMSGSIZE` error on Windows. + /// + /// [`peek_from`]: Socket::peek_from + pub fn peek_sender(&self) -> io::Result { + sys::peek_sender(self.as_raw()) + } + + /// Sends data on the socket to a connected peer. + /// + /// This is typically used on TCP sockets or datagram sockets which have + /// been connected. + /// + /// On success returns the number of bytes that were sent. + pub fn send(&self, buf: &[u8]) -> io::Result { + self.send_with_flags(buf, 0) + } + + /// Identical to [`send`] but allows for specification of arbitrary flags to the underlying + /// `send` call. + /// + /// [`send`]: #method.send + pub fn send_with_flags(&self, buf: &[u8], flags: c_int) -> io::Result { + sys::send(self.as_raw(), buf, flags) + } + + /// Send data to the connected peer. Returns the amount of bytes written. + #[cfg(not(target_os = "redox"))] + #[cfg_attr(docsrs, doc(cfg(not(target_os = "redox"))))] + pub fn send_vectored(&self, bufs: &[IoSlice<'_>]) -> io::Result { + self.send_vectored_with_flags(bufs, 0) + } + + /// Identical to [`send_vectored`] but allows for specification of arbitrary + /// flags to the underlying `sendmsg`/`WSASend` call. + /// + /// [`send_vectored`]: Socket::send_vectored + #[cfg(not(target_os = "redox"))] + #[cfg_attr(docsrs, doc(cfg(not(target_os = "redox"))))] + pub fn send_vectored_with_flags( + &self, + bufs: &[IoSlice<'_>], + flags: c_int, + ) -> io::Result { + sys::send_vectored(self.as_raw(), bufs, flags) + } + + /// Sends out-of-band (OOB) data on the socket to connected peer + /// by setting the `MSG_OOB` flag for this call. + /// + /// For more information, see [`send`], [`out_of_band_inline`]. + /// + /// [`send`]: #method.send + /// [`out_of_band_inline`]: #method.out_of_band_inline + pub fn send_out_of_band(&self, buf: &[u8]) -> io::Result { + self.send_with_flags(buf, sys::MSG_OOB) + } + + /// Sends data on the socket to the given address. On success, returns the + /// number of bytes written. + /// + /// This is typically used on UDP or datagram-oriented sockets. + pub fn send_to(&self, buf: &[u8], addr: &SockAddr) -> io::Result { + self.send_to_with_flags(buf, addr, 0) + } + + /// Identical to [`send_to`] but allows for specification of arbitrary flags + /// to the underlying `sendto` call. + /// + /// [`send_to`]: Socket::send_to + pub fn send_to_with_flags( + &self, + buf: &[u8], + addr: &SockAddr, + flags: c_int, + ) -> io::Result { + sys::send_to(self.as_raw(), buf, addr, flags) + } + + /// Send data to a peer listening on `addr`. Returns the amount of bytes + /// written. + #[cfg(not(target_os = "redox"))] + #[cfg_attr(docsrs, doc(cfg(not(target_os = "redox"))))] + pub fn send_to_vectored(&self, bufs: &[IoSlice<'_>], addr: &SockAddr) -> io::Result { + self.send_to_vectored_with_flags(bufs, addr, 0) + } + + /// Identical to [`send_to_vectored`] but allows for specification of + /// arbitrary flags to the underlying `sendmsg`/`WSASendTo` call. + /// + /// [`send_to_vectored`]: Socket::send_to_vectored + #[cfg(not(target_os = "redox"))] + #[cfg_attr(docsrs, doc(cfg(not(target_os = "redox"))))] + pub fn send_to_vectored_with_flags( + &self, + bufs: &[IoSlice<'_>], + addr: &SockAddr, + flags: c_int, + ) -> io::Result { + sys::send_to_vectored(self.as_raw(), bufs, addr, flags) + } +} + +/// Set `SOCK_CLOEXEC` and `NO_HANDLE_INHERIT` on the `ty`pe on platforms that +/// support it. +#[inline(always)] +fn set_common_type(ty: Type) -> Type { + // On platforms that support it set `SOCK_CLOEXEC`. + #[cfg(any( + target_os = "android", + target_os = "dragonfly", + target_os = "freebsd", + target_os = "fuchsia", + target_os = "illumos", + target_os = "linux", + target_os = "netbsd", + target_os = "openbsd", + ))] + let ty = ty._cloexec(); + + // On windows set `NO_HANDLE_INHERIT`. + #[cfg(windows)] + let ty = ty._no_inherit(); + + ty +} + +/// Set `FD_CLOEXEC` and `NOSIGPIPE` on the `socket` for platforms that need it. +#[inline(always)] +#[allow(clippy::unnecessary_wraps)] +fn set_common_flags(socket: Socket) -> io::Result { + // On platforms that don't have `SOCK_CLOEXEC` use `FD_CLOEXEC`. + #[cfg(all( + unix, + not(any( + target_os = "android", + target_os = "dragonfly", + target_os = "freebsd", + target_os = "fuchsia", + target_os = "illumos", + target_os = "linux", + target_os = "netbsd", + target_os = "openbsd", + )) + ))] + socket._set_cloexec(true)?; + + // On Apple platforms set `NOSIGPIPE`. + #[cfg(target_vendor = "apple")] + socket._set_nosigpipe(true)?; + + Ok(socket) +} + +/// A local interface specified by its index or an address assigned to it. +/// +/// `Index(0)` and `Address(Ipv4Addr::UNSPECIFIED)` are equivalent and indicate +/// that an appropriate interface should be selected by the system. +#[cfg(not(any( + target_os = "haiku", + target_os = "illumos", + target_os = "netbsd", + target_os = "redox", + target_os = "solaris", +)))] +#[derive(Debug)] +pub enum InterfaceIndexOrAddress { + /// An interface index. + Index(u32), + /// An address assigned to an interface. + Address(Ipv4Addr), +} + +/// Socket options get/set using `SOL_SOCKET`. +/// +/// Additional documentation can be found in documentation of the OS. +/// * Linux: +/// * Windows: +impl Socket { + /// Get the value of the `SO_BROADCAST` option for this socket. + /// + /// For more information about this option, see [`set_broadcast`]. + /// + /// [`set_broadcast`]: Socket::set_broadcast + pub fn broadcast(&self) -> io::Result { + unsafe { + getsockopt::(self.as_raw(), sys::SOL_SOCKET, sys::SO_BROADCAST) + .map(|broadcast| broadcast != 0) + } + } + + /// Set the value of the `SO_BROADCAST` option for this socket. + /// + /// When enabled, this socket is allowed to send packets to a broadcast + /// address. + pub fn set_broadcast(&self, broadcast: bool) -> io::Result<()> { + unsafe { + setsockopt( + self.as_raw(), + sys::SOL_SOCKET, + sys::SO_BROADCAST, + broadcast as c_int, + ) + } + } + + /// Get the value of the `SO_ERROR` option on this socket. + /// + /// This will retrieve the stored error in the underlying socket, clearing + /// the field in the process. This can be useful for checking errors between + /// calls. + pub fn take_error(&self) -> io::Result> { + match unsafe { getsockopt::(self.as_raw(), sys::SOL_SOCKET, sys::SO_ERROR) } { + Ok(0) => Ok(None), + Ok(errno) => Ok(Some(io::Error::from_raw_os_error(errno))), + Err(err) => Err(err), + } + } + + /// Get the value of the `SO_KEEPALIVE` option on this socket. + /// + /// For more information about this option, see [`set_keepalive`]. + /// + /// [`set_keepalive`]: Socket::set_keepalive + pub fn keepalive(&self) -> io::Result { + unsafe { + getsockopt::(self.as_raw(), sys::SOL_SOCKET, sys::SO_KEEPALIVE) + .map(|keepalive| keepalive != 0) + } + } + + /// Set value for the `SO_KEEPALIVE` option on this socket. + /// + /// Enable sending of keep-alive messages on connection-oriented sockets. + pub fn set_keepalive(&self, keepalive: bool) -> io::Result<()> { + unsafe { + setsockopt( + self.as_raw(), + sys::SOL_SOCKET, + sys::SO_KEEPALIVE, + keepalive as c_int, + ) + } + } + + /// Get the value of the `SO_LINGER` option on this socket. + /// + /// For more information about this option, see [`set_linger`]. + /// + /// [`set_linger`]: Socket::set_linger + pub fn linger(&self) -> io::Result> { + unsafe { + getsockopt::(self.as_raw(), sys::SOL_SOCKET, sys::SO_LINGER) + .map(from_linger) + } + } + + /// Set value for the `SO_LINGER` option on this socket. + /// + /// If `linger` is not `None`, a close(2) or shutdown(2) will not return + /// until all queued messages for the socket have been successfully sent or + /// the linger timeout has been reached. Otherwise, the call returns + /// immediately and the closing is done in the background. When the socket + /// is closed as part of exit(2), it always lingers in the background. + /// + /// # Notes + /// + /// On most OSs the duration only has a precision of seconds and will be + /// silently truncated. + /// + /// On Apple platforms (e.g. macOS, iOS, etc) this uses `SO_LINGER_SEC`. + pub fn set_linger(&self, linger: Option) -> io::Result<()> { + let linger = into_linger(linger); + unsafe { setsockopt(self.as_raw(), sys::SOL_SOCKET, sys::SO_LINGER, linger) } + } + + /// Get value for the `SO_OOBINLINE` option on this socket. + /// + /// For more information about this option, see [`set_out_of_band_inline`]. + /// + /// [`set_out_of_band_inline`]: Socket::set_out_of_band_inline + #[cfg(not(target_os = "redox"))] + #[cfg_attr(docsrs, doc(cfg(not(target_os = "redox"))))] + pub fn out_of_band_inline(&self) -> io::Result { + unsafe { + getsockopt::(self.as_raw(), sys::SOL_SOCKET, sys::SO_OOBINLINE) + .map(|oob_inline| oob_inline != 0) + } + } + + /// Set value for the `SO_OOBINLINE` option on this socket. + /// + /// If this option is enabled, out-of-band data is directly placed into the + /// receive data stream. Otherwise, out-of-band data is passed only when the + /// `MSG_OOB` flag is set during receiving. As per RFC6093, TCP sockets + /// using the Urgent mechanism are encouraged to set this flag. + #[cfg(not(target_os = "redox"))] + #[cfg_attr(docsrs, doc(cfg(not(target_os = "redox"))))] + pub fn set_out_of_band_inline(&self, oob_inline: bool) -> io::Result<()> { + unsafe { + setsockopt( + self.as_raw(), + sys::SOL_SOCKET, + sys::SO_OOBINLINE, + oob_inline as c_int, + ) + } + } + + /// Get value for the `SO_RCVBUF` option on this socket. + /// + /// For more information about this option, see [`set_recv_buffer_size`]. + /// + /// [`set_recv_buffer_size`]: Socket::set_recv_buffer_size + pub fn recv_buffer_size(&self) -> io::Result { + unsafe { + getsockopt::(self.as_raw(), sys::SOL_SOCKET, sys::SO_RCVBUF) + .map(|size| size as usize) + } + } + + /// Set value for the `SO_RCVBUF` option on this socket. + /// + /// Changes the size of the operating system's receive buffer associated + /// with the socket. + pub fn set_recv_buffer_size(&self, size: usize) -> io::Result<()> { + unsafe { + setsockopt( + self.as_raw(), + sys::SOL_SOCKET, + sys::SO_RCVBUF, + size as c_int, + ) + } + } + + /// Get value for the `SO_RCVTIMEO` option on this socket. + /// + /// If the returned timeout is `None`, then `read` and `recv` calls will + /// block indefinitely. + pub fn read_timeout(&self) -> io::Result> { + sys::timeout_opt(self.as_raw(), sys::SOL_SOCKET, sys::SO_RCVTIMEO) + } + + /// Set value for the `SO_RCVTIMEO` option on this socket. + /// + /// If `timeout` is `None`, then `read` and `recv` calls will block + /// indefinitely. + pub fn set_read_timeout(&self, duration: Option) -> io::Result<()> { + sys::set_timeout_opt(self.as_raw(), sys::SOL_SOCKET, sys::SO_RCVTIMEO, duration) + } + + /// Get the value of the `SO_REUSEADDR` option on this socket. + /// + /// For more information about this option, see [`set_reuse_address`]. + /// + /// [`set_reuse_address`]: Socket::set_reuse_address + pub fn reuse_address(&self) -> io::Result { + unsafe { + getsockopt::(self.as_raw(), sys::SOL_SOCKET, sys::SO_REUSEADDR) + .map(|reuse| reuse != 0) + } + } + + /// Set value for the `SO_REUSEADDR` option on this socket. + /// + /// This indicates that futher calls to `bind` may allow reuse of local + /// addresses. For IPv4 sockets this means that a socket may bind even when + /// there's a socket already listening on this port. + pub fn set_reuse_address(&self, reuse: bool) -> io::Result<()> { + unsafe { + setsockopt( + self.as_raw(), + sys::SOL_SOCKET, + sys::SO_REUSEADDR, + reuse as c_int, + ) + } + } + + /// Get the value of the `SO_SNDBUF` option on this socket. + /// + /// For more information about this option, see [`set_send_buffer_size`]. + /// + /// [`set_send_buffer_size`]: Socket::set_send_buffer_size + pub fn send_buffer_size(&self) -> io::Result { + unsafe { + getsockopt::(self.as_raw(), sys::SOL_SOCKET, sys::SO_SNDBUF) + .map(|size| size as usize) + } + } + + /// Set value for the `SO_SNDBUF` option on this socket. + /// + /// Changes the size of the operating system's send buffer associated with + /// the socket. + pub fn set_send_buffer_size(&self, size: usize) -> io::Result<()> { + unsafe { + setsockopt( + self.as_raw(), + sys::SOL_SOCKET, + sys::SO_SNDBUF, + size as c_int, + ) + } + } + + /// Get value for the `SO_SNDTIMEO` option on this socket. + /// + /// If the returned timeout is `None`, then `write` and `send` calls will + /// block indefinitely. + pub fn write_timeout(&self) -> io::Result> { + sys::timeout_opt(self.as_raw(), sys::SOL_SOCKET, sys::SO_SNDTIMEO) + } + + /// Set value for the `SO_SNDTIMEO` option on this socket. + /// + /// If `timeout` is `None`, then `write` and `send` calls will block + /// indefinitely. + pub fn set_write_timeout(&self, duration: Option) -> io::Result<()> { + sys::set_timeout_opt(self.as_raw(), sys::SOL_SOCKET, sys::SO_SNDTIMEO, duration) + } +} + +fn from_linger(linger: sys::linger) -> Option { + if linger.l_onoff == 0 { + None + } else { + Some(Duration::from_secs(linger.l_linger as u64)) + } +} + +fn into_linger(duration: Option) -> sys::linger { + match duration { + Some(duration) => sys::linger { + l_onoff: 1, + l_linger: duration.as_secs() as _, + }, + None => sys::linger { + l_onoff: 0, + l_linger: 0, + }, + } +} + +/// Socket options for IPv4 sockets, get/set using `IPPROTO_IP`. +/// +/// Additional documentation can be found in documentation of the OS. +/// * Linux: +/// * Windows: +impl Socket { + /// Get the value of the `IP_HDRINCL` option on this socket. + /// + /// For more information about this option, see [`set_header_included`]. + /// + /// [`set_header_included`]: Socket::set_header_included + #[cfg(all(feature = "all", not(target_os = "redox")))] + #[cfg_attr(docsrs, doc(all(feature = "all", not(target_os = "redox"))))] + pub fn header_included(&self) -> io::Result { + unsafe { + getsockopt::(self.as_raw(), sys::IPPROTO_IP, sys::IP_HDRINCL) + .map(|included| included != 0) + } + } + + /// Set the value of the `IP_HDRINCL` option on this socket. + /// + /// If enabled, the user supplies an IP header in front of the user data. + /// Valid only for [`SOCK_RAW`] sockets; see [raw(7)] for more information. + /// When this flag is enabled, the values set by `IP_OPTIONS`, [`IP_TTL`], + /// and [`IP_TOS`] are ignored. + /// + /// [`SOCK_RAW`]: Type::RAW + /// [raw(7)]: https://man7.org/linux/man-pages/man7/raw.7.html + /// [`IP_TTL`]: Socket::set_ttl + /// [`IP_TOS`]: Socket::set_tos + #[cfg(all(feature = "all", not(target_os = "redox")))] + #[cfg_attr(docsrs, doc(all(feature = "all", not(target_os = "redox"))))] + pub fn set_header_included(&self, included: bool) -> io::Result<()> { + unsafe { + setsockopt( + self.as_raw(), + sys::IPPROTO_IP, + sys::IP_HDRINCL, + included as c_int, + ) + } + } + + /// Get the value of the `IP_TRANSPARENT` option on this socket. + /// + /// For more information about this option, see [`set_ip_transparent`]. + /// + /// [`set_ip_transparent`]: Socket::set_ip_transparent + #[cfg(any(doc, all(feature = "all", target_os = "linux")))] + #[cfg_attr(docsrs, doc(cfg(all(feature = "all", target_os = "linux"))))] + pub fn ip_transparent(&self) -> io::Result { + unsafe { + getsockopt::(self.as_raw(), sys::IPPROTO_IP, libc::IP_TRANSPARENT) + .map(|transparent| transparent != 0) + } + } + + /// Set the value of the `IP_TRANSPARENT` option on this socket. + /// + /// Setting this boolean option enables transparent proxying + /// on this socket. This socket option allows the calling + /// application to bind to a nonlocal IP address and operate + /// both as a client and a server with the foreign address as + /// the local endpoint. NOTE: this requires that routing be + /// set up in a way that packets going to the foreign address + /// are routed through the TProxy box (i.e., the system + /// hosting the application that employs the IP_TRANSPARENT + /// socket option). Enabling this socket option requires + /// superuser privileges (the `CAP_NET_ADMIN` capability). + /// + /// TProxy redirection with the iptables TPROXY target also + /// requires that this option be set on the redirected socket. + #[cfg(any(doc, all(feature = "all", target_os = "linux")))] + #[cfg_attr(docsrs, doc(cfg(all(feature = "all", target_os = "linux"))))] + pub fn set_ip_transparent(&self, transparent: bool) -> io::Result<()> { + unsafe { + setsockopt( + self.as_raw(), + sys::IPPROTO_IP, + libc::IP_TRANSPARENT, + transparent as c_int, + ) + } + } + + /// Join a multicast group using `IP_ADD_MEMBERSHIP` option on this socket. + /// + /// This function specifies a new multicast group for this socket to join. + /// The address must be a valid multicast address, and `interface` is the + /// address of the local interface with which the system should join the + /// multicast group. If it's [`Ipv4Addr::UNSPECIFIED`] (`INADDR_ANY`) then + /// an appropriate interface is chosen by the system. + pub fn join_multicast_v4(&self, multiaddr: &Ipv4Addr, interface: &Ipv4Addr) -> io::Result<()> { + let mreq = sys::IpMreq { + imr_multiaddr: sys::to_in_addr(multiaddr), + imr_interface: sys::to_in_addr(interface), + }; + unsafe { setsockopt(self.as_raw(), sys::IPPROTO_IP, sys::IP_ADD_MEMBERSHIP, mreq) } + } + + /// Leave a multicast group using `IP_DROP_MEMBERSHIP` option on this socket. + /// + /// For more information about this option, see [`join_multicast_v4`]. + /// + /// [`join_multicast_v4`]: Socket::join_multicast_v4 + pub fn leave_multicast_v4(&self, multiaddr: &Ipv4Addr, interface: &Ipv4Addr) -> io::Result<()> { + let mreq = sys::IpMreq { + imr_multiaddr: sys::to_in_addr(multiaddr), + imr_interface: sys::to_in_addr(interface), + }; + unsafe { + setsockopt( + self.as_raw(), + sys::IPPROTO_IP, + sys::IP_DROP_MEMBERSHIP, + mreq, + ) + } + } + + /// Join a multicast group using `IP_ADD_MEMBERSHIP` option on this socket. + /// + /// This function specifies a new multicast group for this socket to join. + /// The address must be a valid multicast address, and `interface` specifies + /// the local interface with which the system should join the multicast + /// group. See [`InterfaceIndexOrAddress`]. + #[cfg(not(any( + target_os = "haiku", + target_os = "illumos", + target_os = "netbsd", + target_os = "openbsd", + target_os = "redox", + target_os = "solaris", + target_os = "nto", + )))] + pub fn join_multicast_v4_n( + &self, + multiaddr: &Ipv4Addr, + interface: &InterfaceIndexOrAddress, + ) -> io::Result<()> { + let mreqn = sys::to_mreqn(multiaddr, interface); + unsafe { + setsockopt( + self.as_raw(), + sys::IPPROTO_IP, + sys::IP_ADD_MEMBERSHIP, + mreqn, + ) + } + } + + /// Leave a multicast group using `IP_DROP_MEMBERSHIP` option on this socket. + /// + /// For more information about this option, see [`join_multicast_v4_n`]. + /// + /// [`join_multicast_v4_n`]: Socket::join_multicast_v4_n + #[cfg(not(any( + target_os = "haiku", + target_os = "illumos", + target_os = "netbsd", + target_os = "openbsd", + target_os = "redox", + target_os = "solaris", + target_os = "nto", + )))] + pub fn leave_multicast_v4_n( + &self, + multiaddr: &Ipv4Addr, + interface: &InterfaceIndexOrAddress, + ) -> io::Result<()> { + let mreqn = sys::to_mreqn(multiaddr, interface); + unsafe { + setsockopt( + self.as_raw(), + sys::IPPROTO_IP, + sys::IP_DROP_MEMBERSHIP, + mreqn, + ) + } + } + + /// Join a multicast SSM channel using `IP_ADD_SOURCE_MEMBERSHIP` option on this socket. + /// + /// This function specifies a new multicast channel for this socket to join. + /// The group must be a valid SSM group address, the source must be the address of the sender + /// and `interface` is the address of the local interface with which the system should join the + /// multicast group. If it's [`Ipv4Addr::UNSPECIFIED`] (`INADDR_ANY`) then + /// an appropriate interface is chosen by the system. + #[cfg(not(any( + target_os = "dragonfly", + target_os = "haiku", + target_os = "netbsd", + target_os = "openbsd", + target_os = "redox", + target_os = "fuchsia", + target_os = "nto", + )))] + pub fn join_ssm_v4( + &self, + source: &Ipv4Addr, + group: &Ipv4Addr, + interface: &Ipv4Addr, + ) -> io::Result<()> { + let mreqs = sys::IpMreqSource { + imr_multiaddr: sys::to_in_addr(group), + imr_interface: sys::to_in_addr(interface), + imr_sourceaddr: sys::to_in_addr(source), + }; + unsafe { + setsockopt( + self.as_raw(), + sys::IPPROTO_IP, + sys::IP_ADD_SOURCE_MEMBERSHIP, + mreqs, + ) + } + } + + /// Leave a multicast group using `IP_DROP_SOURCE_MEMBERSHIP` option on this socket. + /// + /// For more information about this option, see [`join_ssm_v4`]. + /// + /// [`join_ssm_v4`]: Socket::join_ssm_v4 + #[cfg(not(any( + target_os = "dragonfly", + target_os = "haiku", + target_os = "netbsd", + target_os = "openbsd", + target_os = "redox", + target_os = "fuchsia", + target_os = "nto", + )))] + pub fn leave_ssm_v4( + &self, + source: &Ipv4Addr, + group: &Ipv4Addr, + interface: &Ipv4Addr, + ) -> io::Result<()> { + let mreqs = sys::IpMreqSource { + imr_multiaddr: sys::to_in_addr(group), + imr_interface: sys::to_in_addr(interface), + imr_sourceaddr: sys::to_in_addr(source), + }; + unsafe { + setsockopt( + self.as_raw(), + sys::IPPROTO_IP, + sys::IP_DROP_SOURCE_MEMBERSHIP, + mreqs, + ) + } + } + + /// Get the value of the `IP_MULTICAST_IF` option for this socket. + /// + /// For more information about this option, see [`set_multicast_if_v4`]. + /// + /// [`set_multicast_if_v4`]: Socket::set_multicast_if_v4 + pub fn multicast_if_v4(&self) -> io::Result { + unsafe { + getsockopt(self.as_raw(), sys::IPPROTO_IP, sys::IP_MULTICAST_IF).map(sys::from_in_addr) + } + } + + /// Set the value of the `IP_MULTICAST_IF` option for this socket. + /// + /// Specifies the interface to use for routing multicast packets. + pub fn set_multicast_if_v4(&self, interface: &Ipv4Addr) -> io::Result<()> { + let interface = sys::to_in_addr(interface); + unsafe { + setsockopt( + self.as_raw(), + sys::IPPROTO_IP, + sys::IP_MULTICAST_IF, + interface, + ) + } + } + + /// Get the value of the `IP_MULTICAST_LOOP` option for this socket. + /// + /// For more information about this option, see [`set_multicast_loop_v4`]. + /// + /// [`set_multicast_loop_v4`]: Socket::set_multicast_loop_v4 + pub fn multicast_loop_v4(&self) -> io::Result { + unsafe { + getsockopt::(self.as_raw(), sys::IPPROTO_IP, sys::IP_MULTICAST_LOOP) + .map(|loop_v4| loop_v4 != 0) + } + } + + /// Set the value of the `IP_MULTICAST_LOOP` option for this socket. + /// + /// If enabled, multicast packets will be looped back to the local socket. + /// Note that this may not have any affect on IPv6 sockets. + pub fn set_multicast_loop_v4(&self, loop_v4: bool) -> io::Result<()> { + unsafe { + setsockopt( + self.as_raw(), + sys::IPPROTO_IP, + sys::IP_MULTICAST_LOOP, + loop_v4 as c_int, + ) + } + } + + /// Get the value of the `IP_MULTICAST_TTL` option for this socket. + /// + /// For more information about this option, see [`set_multicast_ttl_v4`]. + /// + /// [`set_multicast_ttl_v4`]: Socket::set_multicast_ttl_v4 + pub fn multicast_ttl_v4(&self) -> io::Result { + unsafe { + getsockopt::(self.as_raw(), sys::IPPROTO_IP, sys::IP_MULTICAST_TTL) + .map(|ttl| ttl as u32) + } + } + + /// Set the value of the `IP_MULTICAST_TTL` option for this socket. + /// + /// Indicates the time-to-live value of outgoing multicast packets for + /// this socket. The default value is 1 which means that multicast packets + /// don't leave the local network unless explicitly requested. + /// + /// Note that this may not have any affect on IPv6 sockets. + pub fn set_multicast_ttl_v4(&self, ttl: u32) -> io::Result<()> { + unsafe { + setsockopt( + self.as_raw(), + sys::IPPROTO_IP, + sys::IP_MULTICAST_TTL, + ttl as c_int, + ) + } + } + + /// Get the value of the `IP_TTL` option for this socket. + /// + /// For more information about this option, see [`set_ttl`]. + /// + /// [`set_ttl`]: Socket::set_ttl + pub fn ttl(&self) -> io::Result { + unsafe { + getsockopt::(self.as_raw(), sys::IPPROTO_IP, sys::IP_TTL).map(|ttl| ttl as u32) + } + } + + /// Set the value of the `IP_TTL` option for this socket. + /// + /// This value sets the time-to-live field that is used in every packet sent + /// from this socket. + pub fn set_ttl(&self, ttl: u32) -> io::Result<()> { + unsafe { setsockopt(self.as_raw(), sys::IPPROTO_IP, sys::IP_TTL, ttl as c_int) } + } + + /// Set the value of the `IP_TOS` option for this socket. + /// + /// This value sets the type-of-service field that is used in every packet + /// sent from this socket. + /// + /// NOTE: + /// documents that not all versions of windows support `IP_TOS`. + #[cfg(not(any( + target_os = "fuchsia", + target_os = "redox", + target_os = "solaris", + target_os = "illumos", + )))] + pub fn set_tos(&self, tos: u32) -> io::Result<()> { + unsafe { setsockopt(self.as_raw(), sys::IPPROTO_IP, sys::IP_TOS, tos as c_int) } + } + + /// Get the value of the `IP_TOS` option for this socket. + /// + /// For more information about this option, see [`set_tos`]. + /// + /// NOTE: + /// documents that not all versions of windows support `IP_TOS`. + /// + /// [`set_tos`]: Socket::set_tos + #[cfg(not(any( + target_os = "fuchsia", + target_os = "redox", + target_os = "solaris", + target_os = "illumos", + )))] + pub fn tos(&self) -> io::Result { + unsafe { + getsockopt::(self.as_raw(), sys::IPPROTO_IP, sys::IP_TOS).map(|tos| tos as u32) + } + } + + /// Set the value of the `IP_RECVTOS` option for this socket. + /// + /// If enabled, the IP_TOS ancillary message is passed with + /// incoming packets. It contains a byte which specifies the + /// Type of Service/Precedence field of the packet header. + #[cfg(not(any( + target_os = "dragonfly", + target_os = "fuchsia", + target_os = "illumos", + target_os = "netbsd", + target_os = "openbsd", + target_os = "redox", + target_os = "solaris", + target_os = "windows", + target_os = "nto", + )))] + pub fn set_recv_tos(&self, recv_tos: bool) -> io::Result<()> { + let recv_tos = if recv_tos { 1 } else { 0 }; + + unsafe { + setsockopt( + self.as_raw(), + sys::IPPROTO_IP, + sys::IP_RECVTOS, + recv_tos as c_int, + ) + } + } + + /// Get the value of the `IP_RECVTOS` option for this socket. + /// + /// For more information about this option, see [`set_recv_tos`]. + /// + /// [`set_recv_tos`]: Socket::set_recv_tos + #[cfg(not(any( + target_os = "dragonfly", + target_os = "fuchsia", + target_os = "illumos", + target_os = "netbsd", + target_os = "openbsd", + target_os = "redox", + target_os = "solaris", + target_os = "windows", + target_os = "nto", + )))] + pub fn recv_tos(&self) -> io::Result { + unsafe { + getsockopt::(self.as_raw(), sys::IPPROTO_IP, sys::IP_RECVTOS) + .map(|recv_tos| recv_tos > 0) + } + } +} + +/// Socket options for IPv6 sockets, get/set using `IPPROTO_IPV6`. +/// +/// Additional documentation can be found in documentation of the OS. +/// * Linux: +/// * Windows: +impl Socket { + /// Join a multicast group using `IPV6_ADD_MEMBERSHIP` option on this socket. + /// + /// Some OSs use `IPV6_JOIN_GROUP` for this option. + /// + /// This function specifies a new multicast group for this socket to join. + /// The address must be a valid multicast address, and `interface` is the + /// index of the interface to join/leave (or 0 to indicate any interface). + #[cfg(not(target_os = "nto"))] + pub fn join_multicast_v6(&self, multiaddr: &Ipv6Addr, interface: u32) -> io::Result<()> { + let mreq = sys::Ipv6Mreq { + ipv6mr_multiaddr: sys::to_in6_addr(multiaddr), + // NOTE: some OSs use `c_int`, others use `c_uint`. + ipv6mr_interface: interface as _, + }; + unsafe { + setsockopt( + self.as_raw(), + sys::IPPROTO_IPV6, + sys::IPV6_ADD_MEMBERSHIP, + mreq, + ) + } + } + + /// Leave a multicast group using `IPV6_DROP_MEMBERSHIP` option on this socket. + /// + /// Some OSs use `IPV6_LEAVE_GROUP` for this option. + /// + /// For more information about this option, see [`join_multicast_v6`]. + /// + /// [`join_multicast_v6`]: Socket::join_multicast_v6 + #[cfg(not(target_os = "nto"))] + pub fn leave_multicast_v6(&self, multiaddr: &Ipv6Addr, interface: u32) -> io::Result<()> { + let mreq = sys::Ipv6Mreq { + ipv6mr_multiaddr: sys::to_in6_addr(multiaddr), + // NOTE: some OSs use `c_int`, others use `c_uint`. + ipv6mr_interface: interface as _, + }; + unsafe { + setsockopt( + self.as_raw(), + sys::IPPROTO_IPV6, + sys::IPV6_DROP_MEMBERSHIP, + mreq, + ) + } + } + + /// Get the value of the `IPV6_MULTICAST_HOPS` option for this socket + /// + /// For more information about this option, see [`set_multicast_hops_v6`]. + /// + /// [`set_multicast_hops_v6`]: Socket::set_multicast_hops_v6 + pub fn multicast_hops_v6(&self) -> io::Result { + unsafe { + getsockopt::(self.as_raw(), sys::IPPROTO_IPV6, sys::IPV6_MULTICAST_HOPS) + .map(|hops| hops as u32) + } + } + + /// Set the value of the `IPV6_MULTICAST_HOPS` option for this socket + /// + /// Indicates the number of "routers" multicast packets will transit for + /// this socket. The default value is 1 which means that multicast packets + /// don't leave the local network unless explicitly requested. + pub fn set_multicast_hops_v6(&self, hops: u32) -> io::Result<()> { + unsafe { + setsockopt( + self.as_raw(), + sys::IPPROTO_IPV6, + sys::IPV6_MULTICAST_HOPS, + hops as c_int, + ) + } + } + + /// Get the value of the `IPV6_MULTICAST_IF` option for this socket. + /// + /// For more information about this option, see [`set_multicast_if_v6`]. + /// + /// [`set_multicast_if_v6`]: Socket::set_multicast_if_v6 + pub fn multicast_if_v6(&self) -> io::Result { + unsafe { + getsockopt::(self.as_raw(), sys::IPPROTO_IPV6, sys::IPV6_MULTICAST_IF) + .map(|interface| interface as u32) + } + } + + /// Set the value of the `IPV6_MULTICAST_IF` option for this socket. + /// + /// Specifies the interface to use for routing multicast packets. Unlike + /// ipv4, this is generally required in ipv6 contexts where network routing + /// prefixes may overlap. + pub fn set_multicast_if_v6(&self, interface: u32) -> io::Result<()> { + unsafe { + setsockopt( + self.as_raw(), + sys::IPPROTO_IPV6, + sys::IPV6_MULTICAST_IF, + interface as c_int, + ) + } + } + + /// Get the value of the `IPV6_MULTICAST_LOOP` option for this socket. + /// + /// For more information about this option, see [`set_multicast_loop_v6`]. + /// + /// [`set_multicast_loop_v6`]: Socket::set_multicast_loop_v6 + pub fn multicast_loop_v6(&self) -> io::Result { + unsafe { + getsockopt::(self.as_raw(), sys::IPPROTO_IPV6, sys::IPV6_MULTICAST_LOOP) + .map(|loop_v6| loop_v6 != 0) + } + } + + /// Set the value of the `IPV6_MULTICAST_LOOP` option for this socket. + /// + /// Controls whether this socket sees the multicast packets it sends itself. + /// Note that this may not have any affect on IPv4 sockets. + pub fn set_multicast_loop_v6(&self, loop_v6: bool) -> io::Result<()> { + unsafe { + setsockopt( + self.as_raw(), + sys::IPPROTO_IPV6, + sys::IPV6_MULTICAST_LOOP, + loop_v6 as c_int, + ) + } + } + + /// Get the value of the `IPV6_UNICAST_HOPS` option for this socket. + /// + /// Specifies the hop limit for ipv6 unicast packets + pub fn unicast_hops_v6(&self) -> io::Result { + unsafe { + getsockopt::(self.as_raw(), sys::IPPROTO_IPV6, sys::IPV6_UNICAST_HOPS) + .map(|hops| hops as u32) + } + } + + /// Set the value for the `IPV6_UNICAST_HOPS` option on this socket. + /// + /// Specifies the hop limit for ipv6 unicast packets + pub fn set_unicast_hops_v6(&self, hops: u32) -> io::Result<()> { + unsafe { + setsockopt( + self.as_raw(), + sys::IPPROTO_IPV6, + sys::IPV6_UNICAST_HOPS, + hops as c_int, + ) + } + } + + /// Get the value of the `IPV6_V6ONLY` option for this socket. + /// + /// For more information about this option, see [`set_only_v6`]. + /// + /// [`set_only_v6`]: Socket::set_only_v6 + pub fn only_v6(&self) -> io::Result { + unsafe { + getsockopt::(self.as_raw(), sys::IPPROTO_IPV6, sys::IPV6_V6ONLY) + .map(|only_v6| only_v6 != 0) + } + } + + /// Set the value for the `IPV6_V6ONLY` option on this socket. + /// + /// If this is set to `true` then the socket is restricted to sending and + /// receiving IPv6 packets only. In this case two IPv4 and IPv6 applications + /// can bind the same port at the same time. + /// + /// If this is set to `false` then the socket can be used to send and + /// receive packets from an IPv4-mapped IPv6 address. + pub fn set_only_v6(&self, only_v6: bool) -> io::Result<()> { + unsafe { + setsockopt( + self.as_raw(), + sys::IPPROTO_IPV6, + sys::IPV6_V6ONLY, + only_v6 as c_int, + ) + } + } +} + +/// Socket options for TCP sockets, get/set using `IPPROTO_TCP`. +/// +/// Additional documentation can be found in documentation of the OS. +/// * Linux: +/// * Windows: +impl Socket { + /// Get the value of the `TCP_KEEPIDLE` option on this socket. + /// + /// This returns the value of `TCP_KEEPALIVE` on macOS and iOS and `TCP_KEEPIDLE` on all other + /// supported Unix operating systems. + #[cfg(any( + doc, + all( + feature = "all", + not(any(windows, target_os = "haiku", target_os = "openbsd")) + ) + ))] + #[cfg_attr( + docsrs, + doc(cfg(all( + feature = "all", + not(any(windows, target_os = "haiku", target_os = "openbsd")) + ))) + )] + pub fn keepalive_time(&self) -> io::Result { + sys::keepalive_time(self.as_raw()) + } + + /// Get the value of the `TCP_KEEPINTVL` option on this socket. + /// + /// For more information about this option, see [`set_tcp_keepalive`]. + /// + /// [`set_tcp_keepalive`]: Socket::set_tcp_keepalive + #[cfg(all( + feature = "all", + any( + doc, + target_os = "android", + target_os = "dragonfly", + target_os = "freebsd", + target_os = "fuchsia", + target_os = "illumos", + target_os = "linux", + target_os = "netbsd", + target_vendor = "apple", + ) + ))] + #[cfg_attr( + docsrs, + doc(cfg(all( + feature = "all", + any( + target_os = "android", + target_os = "dragonfly", + target_os = "freebsd", + target_os = "fuchsia", + target_os = "illumos", + target_os = "linux", + target_os = "netbsd", + target_vendor = "apple", + ) + ))) + )] + pub fn keepalive_interval(&self) -> io::Result { + unsafe { + getsockopt::(self.as_raw(), sys::IPPROTO_TCP, sys::TCP_KEEPINTVL) + .map(|secs| Duration::from_secs(secs as u64)) + } + } + + /// Get the value of the `TCP_KEEPCNT` option on this socket. + /// + /// For more information about this option, see [`set_tcp_keepalive`]. + /// + /// [`set_tcp_keepalive`]: Socket::set_tcp_keepalive + #[cfg(all( + feature = "all", + any( + doc, + target_os = "android", + target_os = "dragonfly", + target_os = "freebsd", + target_os = "fuchsia", + target_os = "illumos", + target_os = "linux", + target_os = "netbsd", + target_vendor = "apple", + ) + ))] + #[cfg_attr( + docsrs, + doc(cfg(all( + feature = "all", + any( + target_os = "android", + target_os = "dragonfly", + target_os = "freebsd", + target_os = "fuchsia", + target_os = "illumos", + target_os = "linux", + target_os = "netbsd", + target_vendor = "apple", + ) + ))) + )] + pub fn keepalive_retries(&self) -> io::Result { + unsafe { + getsockopt::(self.as_raw(), sys::IPPROTO_TCP, sys::TCP_KEEPCNT) + .map(|retries| retries as u32) + } + } + + /// Set parameters configuring TCP keepalive probes for this socket. + /// + /// The supported parameters depend on the operating system, and are + /// configured using the [`TcpKeepalive`] struct. At a minimum, all systems + /// support configuring the [keepalive time]: the time after which the OS + /// will start sending keepalive messages on an idle connection. + /// + /// [keepalive time]: TcpKeepalive::with_time + /// + /// # Notes + /// + /// * This will enable `SO_KEEPALIVE` on this socket, if it is not already + /// enabled. + /// * On some platforms, such as Windows, any keepalive parameters *not* + /// configured by the `TcpKeepalive` struct passed to this function may be + /// overwritten with their default values. Therefore, this function should + /// either only be called once per socket, or the same parameters should + /// be passed every time it is called. + /// + /// # Examples + /// + /// ``` + /// use std::time::Duration; + /// + /// use socket2::{Socket, TcpKeepalive, Domain, Type}; + /// + /// # fn main() -> std::io::Result<()> { + /// let socket = Socket::new(Domain::IPV4, Type::STREAM, None)?; + /// let keepalive = TcpKeepalive::new() + /// .with_time(Duration::from_secs(4)); + /// // Depending on the target operating system, we may also be able to + /// // configure the keepalive probe interval and/or the number of + /// // retries here as well. + /// + /// socket.set_tcp_keepalive(&keepalive)?; + /// # Ok(()) } + /// ``` + /// + pub fn set_tcp_keepalive(&self, params: &TcpKeepalive) -> io::Result<()> { + self.set_keepalive(true)?; + sys::set_tcp_keepalive(self.as_raw(), params) + } + + /// Get the value of the `TCP_NODELAY` option on this socket. + /// + /// For more information about this option, see [`set_nodelay`]. + /// + /// [`set_nodelay`]: Socket::set_nodelay + pub fn nodelay(&self) -> io::Result { + unsafe { + getsockopt::(self.as_raw(), sys::IPPROTO_TCP, sys::TCP_NODELAY) + .map(|nodelay| nodelay != 0) + } + } + + /// Set the value of the `TCP_NODELAY` option on this socket. + /// + /// If set, this option disables the Nagle algorithm. This means that + /// segments are always sent as soon as possible, even if there is only a + /// small amount of data. When not set, data is buffered until there is a + /// sufficient amount to send out, thereby avoiding the frequent sending of + /// small packets. + pub fn set_nodelay(&self, nodelay: bool) -> io::Result<()> { + unsafe { + setsockopt( + self.as_raw(), + sys::IPPROTO_TCP, + sys::TCP_NODELAY, + nodelay as c_int, + ) + } + } +} + +impl Read for Socket { + fn read(&mut self, buf: &mut [u8]) -> io::Result { + // Safety: the `recv` implementation promises not to write uninitialised + // bytes to the `buf`fer, so this casting is safe. + let buf = unsafe { &mut *(buf as *mut [u8] as *mut [MaybeUninit]) }; + self.recv(buf) + } + + #[cfg(not(target_os = "redox"))] + fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> io::Result { + // Safety: both `IoSliceMut` and `MaybeUninitSlice` promise to have the + // same layout, that of `iovec`/`WSABUF`. Furthermore `recv_vectored` + // promises to not write unitialised bytes to the `bufs` and pass it + // directly to the `recvmsg` system call, so this is safe. + let bufs = unsafe { &mut *(bufs as *mut [IoSliceMut<'_>] as *mut [MaybeUninitSlice<'_>]) }; + self.recv_vectored(bufs).map(|(n, _)| n) + } +} + +impl<'a> Read for &'a Socket { + fn read(&mut self, buf: &mut [u8]) -> io::Result { + // Safety: see other `Read::read` impl. + let buf = unsafe { &mut *(buf as *mut [u8] as *mut [MaybeUninit]) }; + self.recv(buf) + } + + #[cfg(not(target_os = "redox"))] + fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> io::Result { + // Safety: see other `Read::read` impl. + let bufs = unsafe { &mut *(bufs as *mut [IoSliceMut<'_>] as *mut [MaybeUninitSlice<'_>]) }; + self.recv_vectored(bufs).map(|(n, _)| n) + } +} + +impl Write for Socket { + fn write(&mut self, buf: &[u8]) -> io::Result { + self.send(buf) + } + + #[cfg(not(target_os = "redox"))] + fn write_vectored(&mut self, bufs: &[IoSlice<'_>]) -> io::Result { + self.send_vectored(bufs) + } + + fn flush(&mut self) -> io::Result<()> { + Ok(()) + } +} + +impl<'a> Write for &'a Socket { + fn write(&mut self, buf: &[u8]) -> io::Result { + self.send(buf) + } + + #[cfg(not(target_os = "redox"))] + fn write_vectored(&mut self, bufs: &[IoSlice<'_>]) -> io::Result { + self.send_vectored(bufs) + } + + fn flush(&mut self) -> io::Result<()> { + Ok(()) + } +} + +impl fmt::Debug for Socket { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_struct("Socket") + .field("raw", &self.as_raw()) + .field("local_addr", &self.local_addr().ok()) + .field("peer_addr", &self.peer_addr().ok()) + .finish() + } +} + +from!(net::TcpStream, Socket); +from!(net::TcpListener, Socket); +from!(net::UdpSocket, Socket); +from!(Socket, net::TcpStream); +from!(Socket, net::TcpListener); +from!(Socket, net::UdpSocket); diff -Nru temporalio-1.3.0/vendor/socket2-0.4.9/src/sockref.rs temporalio-1.3.0/vendor/socket2-0.4.9/src/sockref.rs --- temporalio-1.3.0/vendor/socket2-0.4.9/src/sockref.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/socket2-0.4.9/src/sockref.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,147 @@ +use std::fmt; +use std::marker::PhantomData; +use std::mem::ManuallyDrop; +use std::ops::Deref; +#[cfg(unix)] +use std::os::unix::io::{AsRawFd, FromRawFd}; +#[cfg(windows)] +use std::os::windows::io::{AsRawSocket, FromRawSocket}; + +use crate::Socket; + +/// A reference to a [`Socket`] that can be used to configure socket types other +/// than the `Socket` type itself. +/// +/// This allows for example a [`TcpStream`], found in the standard library, to +/// be configured using all the additional methods found in the [`Socket`] API. +/// +/// `SockRef` can be created from any socket type that implements [`AsRawFd`] +/// (Unix) or [`AsRawSocket`] (Windows) using the [`From`] implementation, but +/// the caller must ensure the file descriptor/socket is a valid. +/// +/// [`TcpStream`]: std::net::TcpStream +// Don't use intra-doc links because they won't build on every platform. +/// [`AsRawFd`]: https://doc.rust-lang.org/stable/std/os/unix/io/trait.AsRawFd.html +/// [`AsRawSocket`]: https://doc.rust-lang.org/stable/std/os/windows/io/trait.AsRawSocket.html +/// +/// # Examples +/// +/// Below is an example of converting a [`TcpStream`] into a [`SockRef`]. +/// +/// ``` +/// use std::net::{TcpStream, SocketAddr}; +/// +/// use socket2::SockRef; +/// +/// # fn main() -> Result<(), Box> { +/// // Create `TcpStream` from the standard library. +/// let address: SocketAddr = "127.0.0.1:1234".parse()?; +/// # let b1 = std::sync::Arc::new(std::sync::Barrier::new(2)); +/// # let b2 = b1.clone(); +/// # let handle = std::thread::spawn(move || { +/// # let listener = std::net::TcpListener::bind(address).unwrap(); +/// # b2.wait(); +/// # let (stream, _) = listener.accept().unwrap(); +/// # std::thread::sleep(std::time::Duration::from_millis(10)); +/// # drop(stream); +/// # }); +/// # b1.wait(); +/// let stream = TcpStream::connect(address)?; +/// +/// // Create a `SockRef`erence to the stream. +/// let socket_ref = SockRef::from(&stream); +/// // Use `Socket::set_nodelay` on the stream. +/// socket_ref.set_nodelay(true)?; +/// drop(socket_ref); +/// +/// assert_eq!(stream.nodelay()?, true); +/// # handle.join().unwrap(); +/// # Ok(()) +/// # } +/// ``` +/// +/// Below is an example of **incorrect usage** of `SockRef::from`, which is +/// currently possible (but not intended and will be fixed in future versions). +/// +/// ```compile_fail +/// use socket2::SockRef; +/// +/// # fn main() -> Result<(), Box> { +/// /// THIS USAGE IS NOT VALID! +/// let socket_ref = SockRef::from(&123); +/// // The above line is overseen possibility when using `SockRef::from`, it +/// // uses the `RawFd` (on Unix), which is a type alias for `c_int`/`i32`, +/// // which implements `AsRawFd`. However it may be clear that this usage is +/// // invalid as it doesn't guarantee that `123` is a valid file descriptor. +/// +/// // Using `Socket::set_nodelay` now will call it on a file descriptor we +/// // don't own! We don't even not if the file descriptor is valid or a socket. +/// socket_ref.set_nodelay(true)?; +/// drop(socket_ref); +/// # Ok(()) +/// # } +/// # DO_NOT_COMPILE +/// ``` +pub struct SockRef<'s> { + /// Because this is a reference we don't own the `Socket`, however `Socket` + /// closes itself when dropped, so we use `ManuallyDrop` to prevent it from + /// closing itself. + socket: ManuallyDrop, + /// Because we don't own the socket we need to ensure the socket remains + /// open while we have a "reference" to it, the lifetime `'s` ensures this. + _lifetime: PhantomData<&'s Socket>, +} + +impl<'s> Deref for SockRef<'s> { + type Target = Socket; + + fn deref(&self) -> &Self::Target { + &self.socket + } +} + +/// On Windows, a corresponding `From<&impl AsRawSocket>` implementation exists. +#[cfg(unix)] +#[cfg_attr(docsrs, doc(cfg(unix)))] +impl<'s, S> From<&'s S> for SockRef<'s> +where + S: AsRawFd, +{ + /// The caller must ensure `S` is actually a socket. + fn from(socket: &'s S) -> Self { + let fd = socket.as_raw_fd(); + assert!(fd >= 0); + SockRef { + socket: ManuallyDrop::new(unsafe { Socket::from_raw_fd(fd) }), + _lifetime: PhantomData, + } + } +} + +/// On Unix, a corresponding `From<&impl AsRawFd>` implementation exists. +#[cfg(windows)] +#[cfg_attr(docsrs, doc(cfg(windows)))] +impl<'s, S> From<&'s S> for SockRef<'s> +where + S: AsRawSocket, +{ + /// See the `From<&impl AsRawFd>` implementation. + fn from(socket: &'s S) -> Self { + let socket = socket.as_raw_socket(); + assert!(socket != winapi::um::winsock2::INVALID_SOCKET as _); + SockRef { + socket: ManuallyDrop::new(unsafe { Socket::from_raw_socket(socket) }), + _lifetime: PhantomData, + } + } +} + +impl fmt::Debug for SockRef<'_> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_struct("SockRef") + .field("raw", &self.socket.as_raw()) + .field("local_addr", &self.socket.local_addr().ok()) + .field("peer_addr", &self.socket.peer_addr().ok()) + .finish() + } +} diff -Nru temporalio-1.3.0/vendor/socket2-0.4.9/src/sys/unix.rs temporalio-1.3.0/vendor/socket2-0.4.9/src/sys/unix.rs --- temporalio-1.3.0/vendor/socket2-0.4.9/src/sys/unix.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/socket2-0.4.9/src/sys/unix.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,2101 @@ +// Copyright 2015 The Rust Project Developers. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +use std::cmp::min; +#[cfg(not(target_os = "redox"))] +use std::io::IoSlice; +use std::marker::PhantomData; +use std::mem::{self, size_of, MaybeUninit}; +use std::net::Shutdown; +use std::net::{Ipv4Addr, Ipv6Addr}; +#[cfg(all(feature = "all", target_vendor = "apple"))] +use std::num::NonZeroU32; +#[cfg(all( + feature = "all", + any( + target_os = "android", + target_os = "freebsd", + target_os = "linux", + target_vendor = "apple", + ) +))] +use std::num::NonZeroUsize; +#[cfg(feature = "all")] +use std::os::unix::ffi::OsStrExt; +#[cfg(all( + feature = "all", + any( + target_os = "android", + target_os = "freebsd", + target_os = "linux", + target_vendor = "apple", + ) +))] +use std::os::unix::io::RawFd; +use std::os::unix::io::{AsRawFd, FromRawFd, IntoRawFd}; +#[cfg(feature = "all")] +use std::os::unix::net::{UnixDatagram, UnixListener, UnixStream}; +#[cfg(feature = "all")] +use std::path::Path; +#[cfg(not(all(target_os = "redox", not(feature = "all"))))] +use std::ptr; +use std::time::{Duration, Instant}; +use std::{io, slice}; + +#[cfg(not(target_vendor = "apple"))] +use libc::ssize_t; +use libc::{c_void, in6_addr, in_addr}; + +#[cfg(not(target_os = "redox"))] +use crate::RecvFlags; +use crate::{Domain, Protocol, SockAddr, TcpKeepalive, Type}; + +pub(crate) use libc::c_int; + +// Used in `Domain`. +pub(crate) use libc::{AF_INET, AF_INET6}; +// Used in `Type`. +#[cfg(all(feature = "all", not(target_os = "redox")))] +pub(crate) use libc::SOCK_RAW; +#[cfg(feature = "all")] +pub(crate) use libc::SOCK_SEQPACKET; +pub(crate) use libc::{SOCK_DGRAM, SOCK_STREAM}; +// Used in `Protocol`. +pub(crate) use libc::{IPPROTO_ICMP, IPPROTO_ICMPV6, IPPROTO_TCP, IPPROTO_UDP}; +// Used in `SockAddr`. +pub(crate) use libc::{ + sa_family_t, sockaddr, sockaddr_in, sockaddr_in6, sockaddr_storage, socklen_t, +}; +// Used in `RecvFlags`. +#[cfg(not(target_os = "redox"))] +pub(crate) use libc::{MSG_TRUNC, SO_OOBINLINE}; +// Used in `Socket`. +#[cfg(not(target_os = "nto"))] +pub(crate) use libc::ipv6_mreq as Ipv6Mreq; +#[cfg(all(feature = "all", not(target_os = "redox")))] +pub(crate) use libc::IP_HDRINCL; +#[cfg(not(any( + target_os = "dragonfly", + target_os = "fuchsia", + target_os = "illumos", + target_os = "netbsd", + target_os = "openbsd", + target_os = "redox", + target_os = "solaris", + target_os = "haiku", + target_os = "nto", +)))] +pub(crate) use libc::IP_RECVTOS; +#[cfg(not(any( + target_os = "fuchsia", + target_os = "redox", + target_os = "solaris", + target_os = "illumos", +)))] +pub(crate) use libc::IP_TOS; +#[cfg(not(target_vendor = "apple"))] +pub(crate) use libc::SO_LINGER; +#[cfg(target_vendor = "apple")] +pub(crate) use libc::SO_LINGER_SEC as SO_LINGER; +pub(crate) use libc::{ + ip_mreq as IpMreq, linger, IPPROTO_IP, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, IPV6_MULTICAST_IF, + IPV6_MULTICAST_LOOP, IPV6_UNICAST_HOPS, IPV6_V6ONLY, IP_ADD_MEMBERSHIP, IP_DROP_MEMBERSHIP, + IP_MULTICAST_IF, IP_MULTICAST_LOOP, IP_MULTICAST_TTL, IP_TTL, MSG_OOB, MSG_PEEK, SOL_SOCKET, + SO_BROADCAST, SO_ERROR, SO_KEEPALIVE, SO_RCVBUF, SO_RCVTIMEO, SO_REUSEADDR, SO_SNDBUF, + SO_SNDTIMEO, SO_TYPE, TCP_NODELAY, +}; +#[cfg(not(any( + target_os = "dragonfly", + target_os = "haiku", + target_os = "netbsd", + target_os = "openbsd", + target_os = "redox", + target_os = "fuchsia", + target_os = "nto", +)))] +pub(crate) use libc::{ + ip_mreq_source as IpMreqSource, IP_ADD_SOURCE_MEMBERSHIP, IP_DROP_SOURCE_MEMBERSHIP, +}; +#[cfg(not(any( + target_os = "dragonfly", + target_os = "freebsd", + target_os = "haiku", + target_os = "illumos", + target_os = "netbsd", + target_os = "openbsd", + target_os = "solaris", + target_os = "nto", + target_vendor = "apple" +)))] +pub(crate) use libc::{IPV6_ADD_MEMBERSHIP, IPV6_DROP_MEMBERSHIP}; +#[cfg(any( + target_os = "dragonfly", + target_os = "freebsd", + target_os = "haiku", + target_os = "illumos", + target_os = "netbsd", + target_os = "openbsd", + target_os = "solaris", + target_vendor = "apple", +))] +pub(crate) use libc::{ + IPV6_JOIN_GROUP as IPV6_ADD_MEMBERSHIP, IPV6_LEAVE_GROUP as IPV6_DROP_MEMBERSHIP, +}; +#[cfg(all( + feature = "all", + any( + target_os = "android", + target_os = "dragonfly", + target_os = "freebsd", + target_os = "fuchsia", + target_os = "illumos", + target_os = "linux", + target_os = "netbsd", + target_vendor = "apple", + ) +))] +pub(crate) use libc::{TCP_KEEPCNT, TCP_KEEPINTVL}; + +// See this type in the Windows file. +pub(crate) type Bool = c_int; + +#[cfg(any(target_vendor = "apple", target_os = "nto"))] +use libc::TCP_KEEPALIVE as KEEPALIVE_TIME; +#[cfg(not(any( + target_vendor = "apple", + target_os = "haiku", + target_os = "openbsd", + target_os = "nto", +)))] +use libc::TCP_KEEPIDLE as KEEPALIVE_TIME; + +/// Helper macro to execute a system call that returns an `io::Result`. +macro_rules! syscall { + ($fn: ident ( $($arg: expr),* $(,)* ) ) => {{ + #[allow(unused_unsafe)] + let res = unsafe { libc::$fn($($arg, )*) }; + if res == -1 { + Err(std::io::Error::last_os_error()) + } else { + Ok(res) + } + }}; +} + +/// Maximum size of a buffer passed to system call like `recv` and `send`. +#[cfg(not(target_vendor = "apple"))] +const MAX_BUF_LEN: usize = ::max_value() as usize; + +// The maximum read limit on most posix-like systems is `SSIZE_MAX`, with the +// man page quoting that if the count of bytes to read is greater than +// `SSIZE_MAX` the result is "unspecified". +// +// On macOS, however, apparently the 64-bit libc is either buggy or +// intentionally showing odd behavior by rejecting any read with a size larger +// than or equal to INT_MAX. To handle both of these the read size is capped on +// both platforms. +#[cfg(target_vendor = "apple")] +const MAX_BUF_LEN: usize = ::max_value() as usize - 1; + +#[cfg(any( + all( + target_os = "linux", + any( + target_env = "gnu", + all(target_env = "uclibc", target_pointer_width = "64") + ) + ), + target_os = "android", +))] +type IovLen = usize; + +#[cfg(any( + all( + target_os = "linux", + any( + target_env = "musl", + all(target_env = "uclibc", target_pointer_width = "32") + ) + ), + target_os = "dragonfly", + target_os = "freebsd", + target_os = "fuchsia", + target_os = "haiku", + target_os = "illumos", + target_os = "netbsd", + target_os = "openbsd", + target_os = "solaris", + target_os = "nto", + target_vendor = "apple", +))] +type IovLen = c_int; + +/// Unix only API. +impl Domain { + /// Domain for Unix socket communication, corresponding to `AF_UNIX`. + #[cfg_attr(docsrs, doc(cfg(unix)))] + pub const UNIX: Domain = Domain(libc::AF_UNIX); + + /// Domain for low-level packet interface, corresponding to `AF_PACKET`. + #[cfg(all( + feature = "all", + any(target_os = "android", target_os = "fuchsia", target_os = "linux") + ))] + #[cfg_attr( + docsrs, + doc(cfg(all( + feature = "all", + any(target_os = "android", target_os = "fuchsia", target_os = "linux") + ))) + )] + pub const PACKET: Domain = Domain(libc::AF_PACKET); + + /// Domain for low-level VSOCK interface, corresponding to `AF_VSOCK`. + #[cfg(all(feature = "all", any(target_os = "android", target_os = "linux")))] + #[cfg_attr( + docsrs, + doc(cfg(all(feature = "all", any(target_os = "android", target_os = "linux")))) + )] + pub const VSOCK: Domain = Domain(libc::AF_VSOCK); +} + +impl_debug!( + Domain, + libc::AF_INET, + libc::AF_INET6, + libc::AF_UNIX, + #[cfg(any(target_os = "android", target_os = "fuchsia", target_os = "linux"))] + #[cfg_attr( + docsrs, + doc(cfg(any(target_os = "android", target_os = "fuchsia", target_os = "linux"))) + )] + libc::AF_PACKET, + #[cfg(any(target_os = "android", target_os = "linux"))] + #[cfg_attr(docsrs, doc(cfg(any(target_os = "android", target_os = "linux"))))] + libc::AF_VSOCK, + libc::AF_UNSPEC, // = 0. +); + +/// Unix only API. +impl Type { + /// Set `SOCK_NONBLOCK` on the `Type`. + #[cfg(all( + feature = "all", + any( + target_os = "android", + target_os = "dragonfly", + target_os = "freebsd", + target_os = "fuchsia", + target_os = "illumos", + target_os = "linux", + target_os = "netbsd", + target_os = "openbsd" + ) + ))] + #[cfg_attr( + docsrs, + doc(cfg(all( + feature = "all", + any( + target_os = "android", + target_os = "dragonfly", + target_os = "freebsd", + target_os = "fuchsia", + target_os = "illumos", + target_os = "linux", + target_os = "netbsd", + target_os = "openbsd" + ) + ))) + )] + pub const fn nonblocking(self) -> Type { + Type(self.0 | libc::SOCK_NONBLOCK) + } + + /// Set `SOCK_CLOEXEC` on the `Type`. + #[cfg(all( + feature = "all", + any( + target_os = "android", + target_os = "dragonfly", + target_os = "freebsd", + target_os = "fuchsia", + target_os = "illumos", + target_os = "linux", + target_os = "netbsd", + target_os = "openbsd" + ) + ))] + #[cfg_attr( + docsrs, + doc(cfg(all( + feature = "all", + any( + target_os = "android", + target_os = "dragonfly", + target_os = "freebsd", + target_os = "fuchsia", + target_os = "illumos", + target_os = "linux", + target_os = "netbsd", + target_os = "openbsd" + ) + ))) + )] + pub const fn cloexec(self) -> Type { + self._cloexec() + } + + #[cfg(any( + target_os = "android", + target_os = "dragonfly", + target_os = "freebsd", + target_os = "fuchsia", + target_os = "illumos", + target_os = "linux", + target_os = "netbsd", + target_os = "openbsd" + ))] + pub(crate) const fn _cloexec(self) -> Type { + Type(self.0 | libc::SOCK_CLOEXEC) + } +} + +impl_debug!( + Type, + libc::SOCK_STREAM, + libc::SOCK_DGRAM, + #[cfg(not(target_os = "redox"))] + libc::SOCK_RAW, + #[cfg(not(any(target_os = "redox", target_os = "haiku")))] + libc::SOCK_RDM, + libc::SOCK_SEQPACKET, + /* TODO: add these optional bit OR-ed flags: + #[cfg(any( + target_os = "android", + target_os = "dragonfly", + target_os = "freebsd", + target_os = "fuchsia", + target_os = "linux", + target_os = "netbsd", + target_os = "openbsd" + ))] + libc::SOCK_NONBLOCK, + #[cfg(any( + target_os = "android", + target_os = "dragonfly", + target_os = "freebsd", + target_os = "fuchsia", + target_os = "linux", + target_os = "netbsd", + target_os = "openbsd" + ))] + libc::SOCK_CLOEXEC, + */ +); + +impl_debug!( + Protocol, + libc::IPPROTO_ICMP, + libc::IPPROTO_ICMPV6, + libc::IPPROTO_TCP, + libc::IPPROTO_UDP, +); + +/// Unix-only API. +#[cfg(not(target_os = "redox"))] +impl RecvFlags { + /// Check if the message terminates a record. + /// + /// Not all socket types support the notion of records. + /// For socket types that do support it (such as [`SEQPACKET`][Type::SEQPACKET]), + /// a record is terminated by sending a message with the end-of-record flag set. + /// + /// On Unix this corresponds to the MSG_EOR flag. + pub const fn is_end_of_record(self) -> bool { + self.0 & libc::MSG_EOR != 0 + } + + /// Check if the message contains out-of-band data. + /// + /// This is useful for protocols where you receive out-of-band data + /// mixed in with the normal data stream. + /// + /// On Unix this corresponds to the MSG_OOB flag. + pub const fn is_out_of_band(self) -> bool { + self.0 & libc::MSG_OOB != 0 + } +} + +#[cfg(not(target_os = "redox"))] +impl std::fmt::Debug for RecvFlags { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("RecvFlags") + .field("is_end_of_record", &self.is_end_of_record()) + .field("is_out_of_band", &self.is_out_of_band()) + .field("is_truncated", &self.is_truncated()) + .finish() + } +} + +#[repr(transparent)] +pub struct MaybeUninitSlice<'a> { + vec: libc::iovec, + _lifetime: PhantomData<&'a mut [MaybeUninit]>, +} + +unsafe impl<'a> Send for MaybeUninitSlice<'a> {} + +unsafe impl<'a> Sync for MaybeUninitSlice<'a> {} + +impl<'a> MaybeUninitSlice<'a> { + pub(crate) fn new(buf: &'a mut [MaybeUninit]) -> MaybeUninitSlice<'a> { + MaybeUninitSlice { + vec: libc::iovec { + iov_base: buf.as_mut_ptr().cast(), + iov_len: buf.len(), + }, + _lifetime: PhantomData, + } + } + + pub(crate) fn as_slice(&self) -> &[MaybeUninit] { + unsafe { slice::from_raw_parts(self.vec.iov_base.cast(), self.vec.iov_len) } + } + + pub(crate) fn as_mut_slice(&mut self) -> &mut [MaybeUninit] { + unsafe { slice::from_raw_parts_mut(self.vec.iov_base.cast(), self.vec.iov_len) } + } +} + +/// Unix only API. +impl SockAddr { + /// Constructs a `SockAddr` with the family `AF_UNIX` and the provided path. + /// + /// # Failure + /// + /// Returns an error if the path is longer than `SUN_LEN`. + #[cfg(feature = "all")] + #[cfg_attr(docsrs, doc(cfg(all(unix, feature = "all"))))] + #[allow(unused_unsafe)] // TODO: replace with `unsafe_op_in_unsafe_fn` once stable. + pub fn unix

(path: P) -> io::Result + where + P: AsRef, + { + unsafe { + SockAddr::init(|storage, len| { + // Safety: `SockAddr::init` zeros the address, which is a valid + // representation. + let storage: &mut libc::sockaddr_un = unsafe { &mut *storage.cast() }; + let len: &mut socklen_t = unsafe { &mut *len }; + + let bytes = path.as_ref().as_os_str().as_bytes(); + let too_long = match bytes.first() { + None => false, + // linux abstract namespaces aren't null-terminated + Some(&0) => bytes.len() > storage.sun_path.len(), + Some(_) => bytes.len() >= storage.sun_path.len(), + }; + if too_long { + return Err(io::Error::new( + io::ErrorKind::InvalidInput, + "path must be shorter than SUN_LEN", + )); + } + + storage.sun_family = libc::AF_UNIX as sa_family_t; + // Safety: `bytes` and `addr.sun_path` are not overlapping and + // both point to valid memory. + // `SockAddr::init` zeroes the memory, so the path is already + // null terminated. + unsafe { + ptr::copy_nonoverlapping( + bytes.as_ptr(), + storage.sun_path.as_mut_ptr() as *mut u8, + bytes.len(), + ) + }; + + let base = storage as *const _ as usize; + let path = &storage.sun_path as *const _ as usize; + let sun_path_offset = path - base; + let length = sun_path_offset + + bytes.len() + + match bytes.first() { + Some(&0) | None => 0, + Some(_) => 1, + }; + *len = length as socklen_t; + + Ok(()) + }) + } + .map(|(_, addr)| addr) + } +} + +impl SockAddr { + /// Constructs a `SockAddr` with the family `AF_VSOCK` and the provided CID/port. + /// + /// # Errors + /// + /// This function can never fail. In a future version of this library it will be made + /// infallible. + #[allow(unused_unsafe)] // TODO: replace with `unsafe_op_in_unsafe_fn` once stable. + #[cfg(all(feature = "all", any(target_os = "android", target_os = "linux")))] + #[cfg_attr( + docsrs, + doc(cfg(all(feature = "all", any(target_os = "android", target_os = "linux")))) + )] + pub fn vsock(cid: u32, port: u32) -> io::Result { + unsafe { + SockAddr::init(|storage, len| { + // Safety: `SockAddr::init` zeros the address, which is a valid + // representation. + let storage: &mut libc::sockaddr_vm = unsafe { &mut *storage.cast() }; + let len: &mut socklen_t = unsafe { &mut *len }; + + storage.svm_family = libc::AF_VSOCK as sa_family_t; + storage.svm_cid = cid; + storage.svm_port = port; + + *len = mem::size_of::() as socklen_t; + + Ok(()) + }) + } + .map(|(_, addr)| addr) + } + + /// Returns this address VSOCK CID/port if it is in the `AF_VSOCK` family, + /// otherwise return `None`. + #[cfg(all(feature = "all", any(target_os = "android", target_os = "linux")))] + #[cfg_attr( + docsrs, + doc(cfg(all(feature = "all", any(target_os = "android", target_os = "linux")))) + )] + pub fn vsock_address(&self) -> Option<(u32, u32)> { + if self.family() == libc::AF_VSOCK as sa_family_t { + // Safety: if the ss_family field is AF_VSOCK then storage must be a sockaddr_vm. + let addr = unsafe { &*(self.as_ptr() as *const libc::sockaddr_vm) }; + Some((addr.svm_cid, addr.svm_port)) + } else { + None + } + } +} + +pub(crate) type Socket = c_int; + +pub(crate) unsafe fn socket_from_raw(socket: Socket) -> crate::socket::Inner { + crate::socket::Inner::from_raw_fd(socket) +} + +pub(crate) fn socket_as_raw(socket: &crate::socket::Inner) -> Socket { + socket.as_raw_fd() +} + +pub(crate) fn socket_into_raw(socket: crate::socket::Inner) -> Socket { + socket.into_raw_fd() +} + +pub(crate) fn socket(family: c_int, ty: c_int, protocol: c_int) -> io::Result { + syscall!(socket(family, ty, protocol)) +} + +#[cfg(feature = "all")] +pub(crate) fn socketpair(family: c_int, ty: c_int, protocol: c_int) -> io::Result<[Socket; 2]> { + let mut fds = [0, 0]; + syscall!(socketpair(family, ty, protocol, fds.as_mut_ptr())).map(|_| fds) +} + +pub(crate) fn bind(fd: Socket, addr: &SockAddr) -> io::Result<()> { + syscall!(bind(fd, addr.as_ptr(), addr.len() as _)).map(|_| ()) +} + +pub(crate) fn connect(fd: Socket, addr: &SockAddr) -> io::Result<()> { + syscall!(connect(fd, addr.as_ptr(), addr.len())).map(|_| ()) +} + +pub(crate) fn poll_connect(socket: &crate::Socket, timeout: Duration) -> io::Result<()> { + let start = Instant::now(); + + let mut pollfd = libc::pollfd { + fd: socket.as_raw(), + events: libc::POLLIN | libc::POLLOUT, + revents: 0, + }; + + loop { + let elapsed = start.elapsed(); + if elapsed >= timeout { + return Err(io::ErrorKind::TimedOut.into()); + } + + let timeout = (timeout - elapsed).as_millis(); + let timeout = clamp(timeout, 1, c_int::max_value() as u128) as c_int; + + match syscall!(poll(&mut pollfd, 1, timeout)) { + Ok(0) => return Err(io::ErrorKind::TimedOut.into()), + Ok(_) => { + // Error or hang up indicates an error (or failure to connect). + if (pollfd.revents & libc::POLLHUP) != 0 || (pollfd.revents & libc::POLLERR) != 0 { + match socket.take_error() { + Ok(Some(err)) => return Err(err), + Ok(None) => { + return Err(io::Error::new( + io::ErrorKind::Other, + "no error set after POLLHUP", + )) + } + Err(err) => return Err(err), + } + } + return Ok(()); + } + // Got interrupted, try again. + Err(ref err) if err.kind() == io::ErrorKind::Interrupted => continue, + Err(err) => return Err(err), + } + } +} + +// TODO: use clamp from std lib, stable since 1.50. +fn clamp(value: T, min: T, max: T) -> T +where + T: Ord, +{ + if value <= min { + min + } else if value >= max { + max + } else { + value + } +} + +pub(crate) fn listen(fd: Socket, backlog: c_int) -> io::Result<()> { + syscall!(listen(fd, backlog)).map(|_| ()) +} + +pub(crate) fn accept(fd: Socket) -> io::Result<(Socket, SockAddr)> { + // Safety: `accept` initialises the `SockAddr` for us. + unsafe { SockAddr::init(|storage, len| syscall!(accept(fd, storage.cast(), len))) } +} + +pub(crate) fn getsockname(fd: Socket) -> io::Result { + // Safety: `accept` initialises the `SockAddr` for us. + unsafe { SockAddr::init(|storage, len| syscall!(getsockname(fd, storage.cast(), len))) } + .map(|(_, addr)| addr) +} + +pub(crate) fn getpeername(fd: Socket) -> io::Result { + // Safety: `accept` initialises the `SockAddr` for us. + unsafe { SockAddr::init(|storage, len| syscall!(getpeername(fd, storage.cast(), len))) } + .map(|(_, addr)| addr) +} + +pub(crate) fn try_clone(fd: Socket) -> io::Result { + syscall!(fcntl(fd, libc::F_DUPFD_CLOEXEC, 0)) +} + +pub(crate) fn set_nonblocking(fd: Socket, nonblocking: bool) -> io::Result<()> { + if nonblocking { + fcntl_add(fd, libc::F_GETFL, libc::F_SETFL, libc::O_NONBLOCK) + } else { + fcntl_remove(fd, libc::F_GETFL, libc::F_SETFL, libc::O_NONBLOCK) + } +} + +pub(crate) fn shutdown(fd: Socket, how: Shutdown) -> io::Result<()> { + let how = match how { + Shutdown::Write => libc::SHUT_WR, + Shutdown::Read => libc::SHUT_RD, + Shutdown::Both => libc::SHUT_RDWR, + }; + syscall!(shutdown(fd, how)).map(|_| ()) +} + +pub(crate) fn recv(fd: Socket, buf: &mut [MaybeUninit], flags: c_int) -> io::Result { + syscall!(recv( + fd, + buf.as_mut_ptr().cast(), + min(buf.len(), MAX_BUF_LEN), + flags, + )) + .map(|n| n as usize) +} + +pub(crate) fn recv_from( + fd: Socket, + buf: &mut [MaybeUninit], + flags: c_int, +) -> io::Result<(usize, SockAddr)> { + // Safety: `recvfrom` initialises the `SockAddr` for us. + unsafe { + SockAddr::init(|addr, addrlen| { + syscall!(recvfrom( + fd, + buf.as_mut_ptr().cast(), + min(buf.len(), MAX_BUF_LEN), + flags, + addr.cast(), + addrlen + )) + .map(|n| n as usize) + }) + } +} + +pub(crate) fn peek_sender(fd: Socket) -> io::Result { + // Unix-like platforms simply truncate the returned data, so this implementation is trivial. + // However, for Windows this requires suppressing the `WSAEMSGSIZE` error, + // so that requires a different approach. + // NOTE: macOS does not populate `sockaddr` if you pass a zero-sized buffer. + let (_, sender) = recv_from(fd, &mut [MaybeUninit::uninit(); 8], MSG_PEEK)?; + Ok(sender) +} + +#[cfg(not(target_os = "redox"))] +pub(crate) fn recv_vectored( + fd: Socket, + bufs: &mut [crate::MaybeUninitSlice<'_>], + flags: c_int, +) -> io::Result<(usize, RecvFlags)> { + recvmsg(fd, ptr::null_mut(), bufs, flags).map(|(n, _, recv_flags)| (n, recv_flags)) +} + +#[cfg(not(target_os = "redox"))] +pub(crate) fn recv_from_vectored( + fd: Socket, + bufs: &mut [crate::MaybeUninitSlice<'_>], + flags: c_int, +) -> io::Result<(usize, RecvFlags, SockAddr)> { + // Safety: `recvmsg` initialises the address storage and we set the length + // manually. + unsafe { + SockAddr::init(|storage, len| { + recvmsg(fd, storage, bufs, flags).map(|(n, addrlen, recv_flags)| { + // Set the correct address length. + *len = addrlen; + (n, recv_flags) + }) + }) + } + .map(|((n, recv_flags), addr)| (n, recv_flags, addr)) +} + +/// Returns the (bytes received, sending address len, `RecvFlags`). +#[cfg(not(target_os = "redox"))] +fn recvmsg( + fd: Socket, + msg_name: *mut sockaddr_storage, + bufs: &mut [crate::MaybeUninitSlice<'_>], + flags: c_int, +) -> io::Result<(usize, libc::socklen_t, RecvFlags)> { + let msg_namelen = if msg_name.is_null() { + 0 + } else { + size_of::() as libc::socklen_t + }; + // libc::msghdr contains unexported padding fields on Fuchsia. + let mut msg: libc::msghdr = unsafe { mem::zeroed() }; + msg.msg_name = msg_name.cast(); + msg.msg_namelen = msg_namelen; + msg.msg_iov = bufs.as_mut_ptr().cast(); + msg.msg_iovlen = min(bufs.len(), IovLen::MAX as usize) as IovLen; + syscall!(recvmsg(fd, &mut msg, flags)) + .map(|n| (n as usize, msg.msg_namelen, RecvFlags(msg.msg_flags))) +} + +pub(crate) fn send(fd: Socket, buf: &[u8], flags: c_int) -> io::Result { + syscall!(send( + fd, + buf.as_ptr().cast(), + min(buf.len(), MAX_BUF_LEN), + flags, + )) + .map(|n| n as usize) +} + +#[cfg(not(target_os = "redox"))] +pub(crate) fn send_vectored(fd: Socket, bufs: &[IoSlice<'_>], flags: c_int) -> io::Result { + sendmsg(fd, ptr::null(), 0, bufs, flags) +} + +pub(crate) fn send_to(fd: Socket, buf: &[u8], addr: &SockAddr, flags: c_int) -> io::Result { + syscall!(sendto( + fd, + buf.as_ptr().cast(), + min(buf.len(), MAX_BUF_LEN), + flags, + addr.as_ptr(), + addr.len(), + )) + .map(|n| n as usize) +} + +#[cfg(not(target_os = "redox"))] +pub(crate) fn send_to_vectored( + fd: Socket, + bufs: &[IoSlice<'_>], + addr: &SockAddr, + flags: c_int, +) -> io::Result { + sendmsg(fd, addr.as_storage_ptr(), addr.len(), bufs, flags) +} + +/// Returns the (bytes received, sending address len, `RecvFlags`). +#[cfg(not(target_os = "redox"))] +fn sendmsg( + fd: Socket, + msg_name: *const sockaddr_storage, + msg_namelen: socklen_t, + bufs: &[IoSlice<'_>], + flags: c_int, +) -> io::Result { + // libc::msghdr contains unexported padding fields on Fuchsia. + let mut msg: libc::msghdr = unsafe { mem::zeroed() }; + // Safety: we're creating a `*mut` pointer from a reference, which is UB + // once actually used. However the OS should not write to it in the + // `sendmsg` system call. + msg.msg_name = (msg_name as *mut sockaddr_storage).cast(); + msg.msg_namelen = msg_namelen; + // Safety: Same as above about `*const` -> `*mut`. + msg.msg_iov = bufs.as_ptr() as *mut _; + msg.msg_iovlen = min(bufs.len(), IovLen::MAX as usize) as IovLen; + syscall!(sendmsg(fd, &msg, flags)).map(|n| n as usize) +} + +/// Wrapper around `getsockopt` to deal with platform specific timeouts. +pub(crate) fn timeout_opt(fd: Socket, opt: c_int, val: c_int) -> io::Result> { + unsafe { getsockopt(fd, opt, val).map(from_timeval) } +} + +fn from_timeval(duration: libc::timeval) -> Option { + if duration.tv_sec == 0 && duration.tv_usec == 0 { + None + } else { + let sec = duration.tv_sec as u64; + let nsec = (duration.tv_usec as u32) * 1000; + Some(Duration::new(sec, nsec)) + } +} + +/// Wrapper around `setsockopt` to deal with platform specific timeouts. +pub(crate) fn set_timeout_opt( + fd: Socket, + opt: c_int, + val: c_int, + duration: Option, +) -> io::Result<()> { + let duration = into_timeval(duration); + unsafe { setsockopt(fd, opt, val, duration) } +} + +fn into_timeval(duration: Option) -> libc::timeval { + match duration { + // https://github.com/rust-lang/libc/issues/1848 + #[cfg_attr(target_env = "musl", allow(deprecated))] + Some(duration) => libc::timeval { + tv_sec: min(duration.as_secs(), libc::time_t::max_value() as u64) as libc::time_t, + tv_usec: duration.subsec_micros() as libc::suseconds_t, + }, + None => libc::timeval { + tv_sec: 0, + tv_usec: 0, + }, + } +} + +#[cfg(feature = "all")] +#[cfg(not(any(target_os = "haiku", target_os = "openbsd")))] +pub(crate) fn keepalive_time(fd: Socket) -> io::Result { + unsafe { + getsockopt::(fd, IPPROTO_TCP, KEEPALIVE_TIME) + .map(|secs| Duration::from_secs(secs as u64)) + } +} + +#[allow(unused_variables)] +pub(crate) fn set_tcp_keepalive(fd: Socket, keepalive: &TcpKeepalive) -> io::Result<()> { + #[cfg(not(any(target_os = "haiku", target_os = "openbsd", target_os = "nto")))] + if let Some(time) = keepalive.time { + let secs = into_secs(time); + unsafe { setsockopt(fd, libc::IPPROTO_TCP, KEEPALIVE_TIME, secs)? } + } + + #[cfg(any( + target_os = "android", + target_os = "dragonfly", + target_os = "freebsd", + target_os = "fuchsia", + target_os = "illumos", + target_os = "linux", + target_os = "netbsd", + target_vendor = "apple", + ))] + { + if let Some(interval) = keepalive.interval { + let secs = into_secs(interval); + unsafe { setsockopt(fd, libc::IPPROTO_TCP, libc::TCP_KEEPINTVL, secs)? } + } + + if let Some(retries) = keepalive.retries { + unsafe { setsockopt(fd, libc::IPPROTO_TCP, libc::TCP_KEEPCNT, retries as c_int)? } + } + } + + #[cfg(target_os = "nto")] + if let Some(time) = keepalive.time { + let secs = into_timeval(Some(time)); + unsafe { setsockopt(fd, libc::IPPROTO_TCP, KEEPALIVE_TIME, secs)? } + } + + Ok(()) +} + +#[cfg(not(any(target_os = "haiku", target_os = "openbsd", target_os = "nto")))] +fn into_secs(duration: Duration) -> c_int { + min(duration.as_secs(), c_int::max_value() as u64) as c_int +} + +/// Add `flag` to the current set flags of `F_GETFD`. +fn fcntl_add(fd: Socket, get_cmd: c_int, set_cmd: c_int, flag: c_int) -> io::Result<()> { + let previous = syscall!(fcntl(fd, get_cmd))?; + let new = previous | flag; + if new != previous { + syscall!(fcntl(fd, set_cmd, new)).map(|_| ()) + } else { + // Flag was already set. + Ok(()) + } +} + +/// Remove `flag` to the current set flags of `F_GETFD`. +fn fcntl_remove(fd: Socket, get_cmd: c_int, set_cmd: c_int, flag: c_int) -> io::Result<()> { + let previous = syscall!(fcntl(fd, get_cmd))?; + let new = previous & !flag; + if new != previous { + syscall!(fcntl(fd, set_cmd, new)).map(|_| ()) + } else { + // Flag was already set. + Ok(()) + } +} + +/// Caller must ensure `T` is the correct type for `opt` and `val`. +pub(crate) unsafe fn getsockopt(fd: Socket, opt: c_int, val: c_int) -> io::Result { + let mut payload: MaybeUninit = MaybeUninit::uninit(); + let mut len = size_of::() as libc::socklen_t; + syscall!(getsockopt( + fd, + opt, + val, + payload.as_mut_ptr().cast(), + &mut len, + )) + .map(|_| { + debug_assert_eq!(len as usize, size_of::()); + // Safety: `getsockopt` initialised `payload` for us. + payload.assume_init() + }) +} + +/// Caller must ensure `T` is the correct type for `opt` and `val`. +pub(crate) unsafe fn setsockopt( + fd: Socket, + opt: c_int, + val: c_int, + payload: T, +) -> io::Result<()> { + let payload = &payload as *const T as *const c_void; + syscall!(setsockopt( + fd, + opt, + val, + payload, + mem::size_of::() as libc::socklen_t, + )) + .map(|_| ()) +} + +pub(crate) fn to_in_addr(addr: &Ipv4Addr) -> in_addr { + // `s_addr` is stored as BE on all machines, and the array is in BE order. + // So the native endian conversion method is used so that it's never + // swapped. + in_addr { + s_addr: u32::from_ne_bytes(addr.octets()), + } +} + +pub(crate) fn from_in_addr(in_addr: in_addr) -> Ipv4Addr { + Ipv4Addr::from(in_addr.s_addr.to_ne_bytes()) +} + +pub(crate) fn to_in6_addr(addr: &Ipv6Addr) -> in6_addr { + in6_addr { + s6_addr: addr.octets(), + } +} + +pub(crate) fn from_in6_addr(addr: in6_addr) -> Ipv6Addr { + Ipv6Addr::from(addr.s6_addr) +} + +#[cfg(not(any( + target_os = "haiku", + target_os = "illumos", + target_os = "netbsd", + target_os = "openbsd", + target_os = "redox", + target_os = "solaris", + target_os = "nto", +)))] +pub(crate) fn to_mreqn( + multiaddr: &Ipv4Addr, + interface: &crate::socket::InterfaceIndexOrAddress, +) -> libc::ip_mreqn { + match interface { + crate::socket::InterfaceIndexOrAddress::Index(interface) => libc::ip_mreqn { + imr_multiaddr: to_in_addr(multiaddr), + imr_address: to_in_addr(&Ipv4Addr::UNSPECIFIED), + imr_ifindex: *interface as _, + }, + crate::socket::InterfaceIndexOrAddress::Address(interface) => libc::ip_mreqn { + imr_multiaddr: to_in_addr(multiaddr), + imr_address: to_in_addr(interface), + imr_ifindex: 0, + }, + } +} + +/// Unix only API. +impl crate::Socket { + /// Accept a new incoming connection from this listener. + /// + /// This function directly corresponds to the `accept4(2)` function. + /// + /// This function will block the calling thread until a new connection is + /// established. When established, the corresponding `Socket` and the remote + /// peer's address will be returned. + #[cfg(all( + feature = "all", + any( + target_os = "android", + target_os = "dragonfly", + target_os = "freebsd", + target_os = "fuchsia", + target_os = "illumos", + target_os = "linux", + target_os = "netbsd", + target_os = "openbsd" + ) + ))] + #[cfg_attr( + docsrs, + doc(cfg(all( + feature = "all", + any( + target_os = "android", + target_os = "dragonfly", + target_os = "freebsd", + target_os = "fuchsia", + target_os = "illumos", + target_os = "linux", + target_os = "netbsd", + target_os = "openbsd" + ) + ))) + )] + pub fn accept4(&self, flags: c_int) -> io::Result<(crate::Socket, SockAddr)> { + self._accept4(flags) + } + + #[cfg(any( + target_os = "android", + target_os = "dragonfly", + target_os = "freebsd", + target_os = "fuchsia", + target_os = "illumos", + target_os = "linux", + target_os = "netbsd", + target_os = "openbsd" + ))] + pub(crate) fn _accept4(&self, flags: c_int) -> io::Result<(crate::Socket, SockAddr)> { + // Safety: `accept4` initialises the `SockAddr` for us. + unsafe { + SockAddr::init(|storage, len| { + syscall!(accept4(self.as_raw(), storage.cast(), len, flags)) + .map(crate::Socket::from_raw) + }) + } + } + + /// Sets `CLOEXEC` on the socket. + /// + /// # Notes + /// + /// On supported platforms you can use [`Type::cloexec`]. + #[cfg(feature = "all")] + #[cfg_attr(docsrs, doc(cfg(all(feature = "all", unix))))] + pub fn set_cloexec(&self, close_on_exec: bool) -> io::Result<()> { + self._set_cloexec(close_on_exec) + } + + pub(crate) fn _set_cloexec(&self, close_on_exec: bool) -> io::Result<()> { + if close_on_exec { + fcntl_add( + self.as_raw(), + libc::F_GETFD, + libc::F_SETFD, + libc::FD_CLOEXEC, + ) + } else { + fcntl_remove( + self.as_raw(), + libc::F_GETFD, + libc::F_SETFD, + libc::FD_CLOEXEC, + ) + } + } + + /// Sets `SO_NOSIGPIPE` on the socket. + #[cfg(all(feature = "all", any(doc, target_vendor = "apple")))] + #[cfg_attr(docsrs, doc(cfg(all(feature = "all", target_vendor = "apple"))))] + pub fn set_nosigpipe(&self, nosigpipe: bool) -> io::Result<()> { + self._set_nosigpipe(nosigpipe) + } + + #[cfg(target_vendor = "apple")] + pub(crate) fn _set_nosigpipe(&self, nosigpipe: bool) -> io::Result<()> { + unsafe { + setsockopt( + self.as_raw(), + libc::SOL_SOCKET, + libc::SO_NOSIGPIPE, + nosigpipe as c_int, + ) + } + } + + /// Gets the value of the `TCP_MAXSEG` option on this socket. + /// + /// For more information about this option, see [`set_mss`]. + /// + /// [`set_mss`]: crate::Socket::set_mss + #[cfg(all(feature = "all", not(target_os = "redox")))] + #[cfg_attr(docsrs, doc(cfg(all(feature = "all", unix, not(target_os = "redox")))))] + pub fn mss(&self) -> io::Result { + unsafe { + getsockopt::(self.as_raw(), libc::IPPROTO_TCP, libc::TCP_MAXSEG) + .map(|mss| mss as u32) + } + } + + /// Sets the value of the `TCP_MAXSEG` option on this socket. + /// + /// The `TCP_MAXSEG` option denotes the TCP Maximum Segment Size and is only + /// available on TCP sockets. + #[cfg(all(feature = "all", not(target_os = "redox")))] + #[cfg_attr(docsrs, doc(cfg(all(feature = "all", unix, not(target_os = "redox")))))] + pub fn set_mss(&self, mss: u32) -> io::Result<()> { + unsafe { + setsockopt( + self.as_raw(), + libc::IPPROTO_TCP, + libc::TCP_MAXSEG, + mss as c_int, + ) + } + } + + /// Returns `true` if `listen(2)` was called on this socket by checking the + /// `SO_ACCEPTCONN` option on this socket. + #[cfg(all( + feature = "all", + any( + target_os = "android", + target_os = "freebsd", + target_os = "fuchsia", + target_os = "linux", + ) + ))] + #[cfg_attr( + docsrs, + doc(cfg(all( + feature = "all", + any( + target_os = "android", + target_os = "freebsd", + target_os = "fuchsia", + target_os = "linux", + ) + ))) + )] + pub fn is_listener(&self) -> io::Result { + unsafe { + getsockopt::(self.as_raw(), libc::SOL_SOCKET, libc::SO_ACCEPTCONN) + .map(|v| v != 0) + } + } + + /// Returns the [`Domain`] of this socket by checking the `SO_DOMAIN` option + /// on this socket. + #[cfg(all( + feature = "all", + any( + target_os = "android", + // TODO: add FreeBSD. + // target_os = "freebsd", + target_os = "fuchsia", + target_os = "linux", + ) + ))] + #[cfg_attr(docsrs, doc(cfg(all( + feature = "all", + any( + target_os = "android", + // TODO: add FreeBSD. + // target_os = "freebsd", + target_os = "fuchsia", + target_os = "linux", + ) + ))))] + pub fn domain(&self) -> io::Result { + unsafe { getsockopt::(self.as_raw(), libc::SOL_SOCKET, libc::SO_DOMAIN).map(Domain) } + } + + /// Returns the [`Protocol`] of this socket by checking the `SO_PROTOCOL` + /// option on this socket. + #[cfg(all( + feature = "all", + any( + target_os = "android", + target_os = "freebsd", + target_os = "fuchsia", + target_os = "linux", + ) + ))] + #[cfg_attr( + docsrs, + doc(cfg(all( + feature = "all", + any( + target_os = "android", + target_os = "freebsd", + target_os = "fuchsia", + target_os = "linux", + ) + ))) + )] + pub fn protocol(&self) -> io::Result> { + unsafe { + getsockopt::(self.as_raw(), libc::SOL_SOCKET, libc::SO_PROTOCOL).map(|v| match v + { + 0 => None, + p => Some(Protocol(p)), + }) + } + } + + /// Gets the value for the `SO_MARK` option on this socket. + /// + /// This value gets the socket mark field for each packet sent through + /// this socket. + /// + /// On Linux this function requires the `CAP_NET_ADMIN` capability. + #[cfg(all( + feature = "all", + any(target_os = "android", target_os = "fuchsia", target_os = "linux") + ))] + #[cfg_attr( + docsrs, + doc(cfg(all( + feature = "all", + any(target_os = "android", target_os = "fuchsia", target_os = "linux") + ))) + )] + pub fn mark(&self) -> io::Result { + unsafe { + getsockopt::(self.as_raw(), libc::SOL_SOCKET, libc::SO_MARK) + .map(|mark| mark as u32) + } + } + + /// Sets the value for the `SO_MARK` option on this socket. + /// + /// This value sets the socket mark field for each packet sent through + /// this socket. Changing the mark can be used for mark-based routing + /// without netfilter or for packet filtering. + /// + /// On Linux this function requires the `CAP_NET_ADMIN` capability. + #[cfg(all( + feature = "all", + any(target_os = "android", target_os = "fuchsia", target_os = "linux") + ))] + #[cfg_attr( + docsrs, + doc(cfg(all( + feature = "all", + any(target_os = "android", target_os = "fuchsia", target_os = "linux") + ))) + )] + pub fn set_mark(&self, mark: u32) -> io::Result<()> { + unsafe { + setsockopt::( + self.as_raw(), + libc::SOL_SOCKET, + libc::SO_MARK, + mark as c_int, + ) + } + } + + /// Get the value of the `TCP_CORK` option on this socket. + /// + /// For more information about this option, see [`set_cork`]. + /// + /// [`set_cork`]: Socket::set_cork + #[cfg(all( + feature = "all", + any(target_os = "android", target_os = "fuchsia", target_os = "linux") + ))] + #[cfg_attr( + docsrs, + doc(cfg(all( + feature = "all", + any(target_os = "android", target_os = "fuchsia", target_os = "linux") + ))) + )] + pub fn cork(&self) -> io::Result { + unsafe { + getsockopt::(self.as_raw(), libc::IPPROTO_TCP, libc::TCP_CORK) + .map(|cork| cork != 0) + } + } + + /// Set the value of the `TCP_CORK` option on this socket. + /// + /// If set, don't send out partial frames. All queued partial frames are + /// sent when the option is cleared again. There is a 200 millisecond ceiling on + /// the time for which output is corked by `TCP_CORK`. If this ceiling is reached, + /// then queued data is automatically transmitted. + #[cfg(all( + feature = "all", + any(target_os = "android", target_os = "fuchsia", target_os = "linux") + ))] + #[cfg_attr( + docsrs, + doc(cfg(all( + feature = "all", + any(target_os = "android", target_os = "fuchsia", target_os = "linux") + ))) + )] + pub fn set_cork(&self, cork: bool) -> io::Result<()> { + unsafe { + setsockopt( + self.as_raw(), + libc::IPPROTO_TCP, + libc::TCP_CORK, + cork as c_int, + ) + } + } + + /// Get the value of the `TCP_QUICKACK` option on this socket. + /// + /// For more information about this option, see [`set_quickack`]. + /// + /// [`set_quickack`]: Socket::set_quickack + #[cfg(all( + feature = "all", + any(target_os = "android", target_os = "fuchsia", target_os = "linux") + ))] + #[cfg_attr( + docsrs, + doc(cfg(all( + feature = "all", + any(target_os = "android", target_os = "fuchsia", target_os = "linux") + ))) + )] + pub fn quickack(&self) -> io::Result { + unsafe { + getsockopt::(self.as_raw(), libc::IPPROTO_TCP, libc::TCP_QUICKACK) + .map(|quickack| quickack != 0) + } + } + + /// Set the value of the `TCP_QUICKACK` option on this socket. + /// + /// If set, acks are sent immediately, rather than delayed if needed in accordance to normal + /// TCP operation. This flag is not permanent, it only enables a switch to or from quickack mode. + /// Subsequent operation of the TCP protocol will once again enter/leave quickack mode depending on + /// internal protocol processing and factors such as delayed ack timeouts occurring and data transfer. + #[cfg(all( + feature = "all", + any(target_os = "android", target_os = "fuchsia", target_os = "linux") + ))] + #[cfg_attr( + docsrs, + doc(cfg(all( + feature = "all", + any(target_os = "android", target_os = "fuchsia", target_os = "linux") + ))) + )] + pub fn set_quickack(&self, quickack: bool) -> io::Result<()> { + unsafe { + setsockopt( + self.as_raw(), + libc::IPPROTO_TCP, + libc::TCP_QUICKACK, + quickack as c_int, + ) + } + } + + /// Get the value of the `TCP_THIN_LINEAR_TIMEOUTS` option on this socket. + /// + /// For more information about this option, see [`set_thin_linear_timeouts`]. + /// + /// [`set_thin_linear_timeouts`]: Socket::set_thin_linear_timeouts + #[cfg(all( + feature = "all", + any(target_os = "android", target_os = "fuchsia", target_os = "linux") + ))] + #[cfg_attr( + docsrs, + doc(cfg(all( + feature = "all", + any(target_os = "android", target_os = "fuchsia", target_os = "linux") + ))) + )] + pub fn thin_linear_timeouts(&self) -> io::Result { + unsafe { + getsockopt::( + self.as_raw(), + libc::IPPROTO_TCP, + libc::TCP_THIN_LINEAR_TIMEOUTS, + ) + .map(|timeouts| timeouts != 0) + } + } + + /// Set the value of the `TCP_THIN_LINEAR_TIMEOUTS` option on this socket. + /// + /// If set, the kernel will dynamically detect a thin-stream connection if there are less than four packets in flight. + /// With less than four packets in flight the normal TCP fast retransmission will not be effective. + /// The kernel will modify the retransmission to avoid the very high latencies that thin stream suffer because of exponential backoff. + #[cfg(all( + feature = "all", + any(target_os = "android", target_os = "fuchsia", target_os = "linux") + ))] + #[cfg_attr( + docsrs, + doc(cfg(all( + feature = "all", + any(target_os = "android", target_os = "fuchsia", target_os = "linux") + ))) + )] + pub fn set_thin_linear_timeouts(&self, timeouts: bool) -> io::Result<()> { + unsafe { + setsockopt( + self.as_raw(), + libc::IPPROTO_TCP, + libc::TCP_THIN_LINEAR_TIMEOUTS, + timeouts as c_int, + ) + } + } + + /// Gets the value for the `SO_BINDTODEVICE` option on this socket. + /// + /// This value gets the socket binded device's interface name. + #[cfg(all( + feature = "all", + any(target_os = "android", target_os = "fuchsia", target_os = "linux") + ))] + #[cfg_attr( + docsrs, + doc(cfg(all( + feature = "all", + any(target_os = "android", target_os = "fuchsia", target_os = "linux") + ))) + )] + pub fn device(&self) -> io::Result>> { + // TODO: replace with `MaybeUninit::uninit_array` once stable. + let mut buf: [MaybeUninit; libc::IFNAMSIZ] = + unsafe { MaybeUninit::uninit().assume_init() }; + let mut len = buf.len() as libc::socklen_t; + syscall!(getsockopt( + self.as_raw(), + libc::SOL_SOCKET, + libc::SO_BINDTODEVICE, + buf.as_mut_ptr().cast(), + &mut len, + ))?; + if len == 0 { + Ok(None) + } else { + let buf = &buf[..len as usize - 1]; + // TODO: use `MaybeUninit::slice_assume_init_ref` once stable. + Ok(Some(unsafe { &*(buf as *const [_] as *const [u8]) }.into())) + } + } + + /// Sets the value for the `SO_BINDTODEVICE` option on this socket. + /// + /// If a socket is bound to an interface, only packets received from that + /// particular interface are processed by the socket. Note that this only + /// works for some socket types, particularly `AF_INET` sockets. + /// + /// If `interface` is `None` or an empty string it removes the binding. + #[cfg(all( + feature = "all", + any(target_os = "android", target_os = "fuchsia", target_os = "linux") + ))] + #[cfg_attr( + docsrs, + doc(cfg(all( + feature = "all", + any(target_os = "android", target_os = "fuchsia", target_os = "linux") + ))) + )] + pub fn bind_device(&self, interface: Option<&[u8]>) -> io::Result<()> { + let (value, len) = if let Some(interface) = interface { + (interface.as_ptr(), interface.len()) + } else { + (ptr::null(), 0) + }; + syscall!(setsockopt( + self.as_raw(), + libc::SOL_SOCKET, + libc::SO_BINDTODEVICE, + value.cast(), + len as libc::socklen_t, + )) + .map(|_| ()) + } + + /// Sets the value for the `SO_SETFIB` option on this socket. + /// + /// Bind socket to the specified forwarding table (VRF) on a FreeBSD. + #[cfg(all(feature = "all", any(target_os = "freebsd")))] + #[cfg_attr(docsrs, doc(cfg(all(feature = "all", any(target_os = "freebsd")))))] + pub fn set_fib(&self, fib: u32) -> io::Result<()> { + syscall!(setsockopt( + self.as_raw(), + libc::SOL_SOCKET, + libc::SO_SETFIB, + (&fib as *const u32).cast(), + mem::size_of::() as libc::socklen_t, + )) + .map(|_| ()) + } + + /// Sets the value for `IP_BOUND_IF` option on this socket. + /// + /// If a socket is bound to an interface, only packets received from that + /// particular interface are processed by the socket. + /// + /// If `interface` is `None`, the binding is removed. If the `interface` + /// index is not valid, an error is returned. + /// + /// One can use `libc::if_nametoindex` to convert an interface alias to an + /// index. + #[cfg(all(feature = "all", target_vendor = "apple"))] + #[cfg_attr(docsrs, doc(cfg(all(feature = "all", target_vendor = "apple"))))] + pub fn bind_device_by_index(&self, interface: Option) -> io::Result<()> { + let index = interface.map(NonZeroU32::get).unwrap_or(0); + unsafe { setsockopt(self.as_raw(), IPPROTO_IP, libc::IP_BOUND_IF, index) } + } + + /// Gets the value for `IP_BOUND_IF` option on this socket, i.e. the index + /// for the interface to which the socket is bound. + /// + /// Returns `None` if the socket is not bound to any interface, otherwise + /// returns an interface index. + #[cfg(all(feature = "all", target_vendor = "apple"))] + #[cfg_attr(docsrs, doc(cfg(all(feature = "all", target_vendor = "apple"))))] + pub fn device_index(&self) -> io::Result> { + let index = + unsafe { getsockopt::(self.as_raw(), IPPROTO_IP, libc::IP_BOUND_IF)? }; + Ok(NonZeroU32::new(index)) + } + + /// Get the value of the `SO_INCOMING_CPU` option on this socket. + /// + /// For more information about this option, see [`set_cpu_affinity`]. + /// + /// [`set_cpu_affinity`]: crate::Socket::set_cpu_affinity + #[cfg(all(feature = "all", target_os = "linux"))] + #[cfg_attr(docsrs, doc(cfg(all(feature = "all", target_os = "linux"))))] + pub fn cpu_affinity(&self) -> io::Result { + unsafe { + getsockopt::(self.as_raw(), libc::SOL_SOCKET, libc::SO_INCOMING_CPU) + .map(|cpu| cpu as usize) + } + } + + /// Set value for the `SO_INCOMING_CPU` option on this socket. + /// + /// Sets the CPU affinity of the socket. + #[cfg(all(feature = "all", target_os = "linux"))] + #[cfg_attr(docsrs, doc(cfg(all(feature = "all", target_os = "linux"))))] + pub fn set_cpu_affinity(&self, cpu: usize) -> io::Result<()> { + unsafe { + setsockopt( + self.as_raw(), + libc::SOL_SOCKET, + libc::SO_INCOMING_CPU, + cpu as c_int, + ) + } + } + + /// Get the value of the `SO_REUSEPORT` option on this socket. + /// + /// For more information about this option, see [`set_reuse_port`]. + /// + /// [`set_reuse_port`]: crate::Socket::set_reuse_port + #[cfg(all( + feature = "all", + not(any(target_os = "solaris", target_os = "illumos")) + ))] + #[cfg_attr( + docsrs, + doc(cfg(all( + feature = "all", + unix, + not(any(target_os = "solaris", target_os = "illumos")) + ))) + )] + pub fn reuse_port(&self) -> io::Result { + unsafe { + getsockopt::(self.as_raw(), libc::SOL_SOCKET, libc::SO_REUSEPORT) + .map(|reuse| reuse != 0) + } + } + + /// Set value for the `SO_REUSEPORT` option on this socket. + /// + /// This indicates that further calls to `bind` may allow reuse of local + /// addresses. For IPv4 sockets this means that a socket may bind even when + /// there's a socket already listening on this port. + #[cfg(all( + feature = "all", + not(any(target_os = "solaris", target_os = "illumos")) + ))] + #[cfg_attr( + docsrs, + doc(cfg(all( + feature = "all", + unix, + not(any(target_os = "solaris", target_os = "illumos")) + ))) + )] + pub fn set_reuse_port(&self, reuse: bool) -> io::Result<()> { + unsafe { + setsockopt( + self.as_raw(), + libc::SOL_SOCKET, + libc::SO_REUSEPORT, + reuse as c_int, + ) + } + } + + /// Get the value of the `IP_FREEBIND` option on this socket. + /// + /// For more information about this option, see [`set_freebind`]. + /// + /// [`set_freebind`]: crate::Socket::set_freebind + #[cfg(all( + feature = "all", + any(target_os = "android", target_os = "fuchsia", target_os = "linux") + ))] + #[cfg_attr( + docsrs, + doc(cfg(all( + feature = "all", + any(target_os = "android", target_os = "fuchsia", target_os = "linux") + ))) + )] + pub fn freebind(&self) -> io::Result { + unsafe { + getsockopt::(self.as_raw(), libc::SOL_IP, libc::IP_FREEBIND) + .map(|freebind| freebind != 0) + } + } + + /// Set value for the `IP_FREEBIND` option on this socket. + /// + /// If enabled, this boolean option allows binding to an IP address that is + /// nonlocal or does not (yet) exist. This permits listening on a socket, + /// without requiring the underlying network interface or the specified + /// dynamic IP address to be up at the time that the application is trying + /// to bind to it. + #[cfg(all( + feature = "all", + any(target_os = "android", target_os = "fuchsia", target_os = "linux") + ))] + #[cfg_attr( + docsrs, + doc(cfg(all( + feature = "all", + any(target_os = "android", target_os = "fuchsia", target_os = "linux") + ))) + )] + pub fn set_freebind(&self, freebind: bool) -> io::Result<()> { + unsafe { + setsockopt( + self.as_raw(), + libc::SOL_IP, + libc::IP_FREEBIND, + freebind as c_int, + ) + } + } + + /// Get the value of the `IPV6_FREEBIND` option on this socket. + /// + /// This is an IPv6 counterpart of `IP_FREEBIND` socket option on + /// Android/Linux. For more information about this option, see + /// [`set_freebind`]. + /// + /// [`set_freebind`]: crate::Socket::set_freebind + #[cfg(all(feature = "all", any(target_os = "android", target_os = "linux")))] + #[cfg_attr( + docsrs, + doc(cfg(all(feature = "all", any(target_os = "android", target_os = "linux")))) + )] + pub fn freebind_ipv6(&self) -> io::Result { + unsafe { + getsockopt::(self.as_raw(), libc::SOL_IPV6, libc::IPV6_FREEBIND) + .map(|freebind| freebind != 0) + } + } + + /// Set value for the `IPV6_FREEBIND` option on this socket. + /// + /// This is an IPv6 counterpart of `IP_FREEBIND` socket option on + /// Android/Linux. For more information about this option, see + /// [`set_freebind`]. + /// + /// [`set_freebind`]: crate::Socket::set_freebind + /// + /// # Examples + /// + /// On Linux: + /// + /// ``` + /// use socket2::{Domain, Socket, Type}; + /// use std::io::{self, Error, ErrorKind}; + /// + /// fn enable_freebind(socket: &Socket) -> io::Result<()> { + /// match socket.domain()? { + /// Domain::IPV4 => socket.set_freebind(true)?, + /// Domain::IPV6 => socket.set_freebind_ipv6(true)?, + /// _ => return Err(Error::new(ErrorKind::Other, "unsupported domain")), + /// }; + /// Ok(()) + /// } + /// + /// # fn main() -> io::Result<()> { + /// # let socket = Socket::new(Domain::IPV6, Type::STREAM, None)?; + /// # enable_freebind(&socket) + /// # } + /// ``` + #[cfg(all(feature = "all", any(target_os = "android", target_os = "linux")))] + #[cfg_attr( + docsrs, + doc(cfg(all(feature = "all", any(target_os = "android", target_os = "linux")))) + )] + pub fn set_freebind_ipv6(&self, freebind: bool) -> io::Result<()> { + unsafe { + setsockopt( + self.as_raw(), + libc::SOL_IPV6, + libc::IPV6_FREEBIND, + freebind as c_int, + ) + } + } + + /// Copies data between a `file` and this socket using the `sendfile(2)` + /// system call. Because this copying is done within the kernel, + /// `sendfile()` is more efficient than the combination of `read(2)` and + /// `write(2)`, which would require transferring data to and from user + /// space. + /// + /// Different OSs support different kinds of `file`s, see the OS + /// documentation for what kind of files are supported. Generally *regular* + /// files are supported by all OSs. + /// + /// The `offset` is the absolute offset into the `file` to use as starting + /// point. + /// + /// Depending on the OS this function *may* change the offset of `file`. For + /// the best results reset the offset of the file before using it again. + /// + /// The `length` determines how many bytes to send, where a length of `None` + /// means it will try to send all bytes. + #[cfg(all( + feature = "all", + any( + target_os = "android", + target_os = "freebsd", + target_os = "linux", + target_vendor = "apple", + ) + ))] + #[cfg_attr( + docsrs, + doc(cfg(all( + feature = "all", + any( + target_os = "android", + target_os = "freebsd", + target_os = "linux", + target_vendor = "apple", + ) + ))) + )] + pub fn sendfile( + &self, + file: &F, + offset: usize, + length: Option, + ) -> io::Result + where + F: AsRawFd, + { + self._sendfile(file.as_raw_fd(), offset as _, length) + } + + #[cfg(all(feature = "all", target_vendor = "apple"))] + fn _sendfile( + &self, + file: RawFd, + offset: libc::off_t, + length: Option, + ) -> io::Result { + // On macOS `length` is value-result parameter. It determines the number + // of bytes to write and returns the number of bytes written. + let mut length = match length { + Some(n) => n.get() as libc::off_t, + // A value of `0` means send all bytes. + None => 0, + }; + syscall!(sendfile( + file, + self.as_raw(), + offset, + &mut length, + ptr::null_mut(), + 0, + )) + .map(|_| length as usize) + } + + #[cfg(all(feature = "all", any(target_os = "android", target_os = "linux")))] + fn _sendfile( + &self, + file: RawFd, + offset: libc::off_t, + length: Option, + ) -> io::Result { + let count = match length { + Some(n) => n.get() as libc::size_t, + // The maximum the Linux kernel will write in a single call. + None => 0x7ffff000, // 2,147,479,552 bytes. + }; + let mut offset = offset; + syscall!(sendfile(self.as_raw(), file, &mut offset, count)).map(|n| n as usize) + } + + #[cfg(all(feature = "all", target_os = "freebsd"))] + fn _sendfile( + &self, + file: RawFd, + offset: libc::off_t, + length: Option, + ) -> io::Result { + let nbytes = match length { + Some(n) => n.get() as libc::size_t, + // A value of `0` means send all bytes. + None => 0, + }; + let mut sbytes: libc::off_t = 0; + syscall!(sendfile( + file, + self.as_raw(), + offset, + nbytes, + ptr::null_mut(), + &mut sbytes, + 0, + )) + .map(|_| sbytes as usize) + } + + /// Set the value of the `TCP_USER_TIMEOUT` option on this socket. + /// + /// If set, this specifies the maximum amount of time that transmitted data may remain + /// unacknowledged or buffered data may remain untransmitted before TCP will forcibly close the + /// corresponding connection. + /// + /// Setting `timeout` to `None` or a zero duration causes the system default timeouts to + /// be used. If `timeout` in milliseconds is larger than `c_uint::MAX`, the timeout is clamped + /// to `c_uint::MAX`. For example, when `c_uint` is a 32-bit value, this limits the timeout to + /// approximately 49.71 days. + #[cfg(all( + feature = "all", + any(target_os = "android", target_os = "fuchsia", target_os = "linux") + ))] + #[cfg_attr( + docsrs, + doc(cfg(all( + feature = "all", + any(target_os = "android", target_os = "fuchsia", target_os = "linux") + ))) + )] + pub fn set_tcp_user_timeout(&self, timeout: Option) -> io::Result<()> { + let timeout = timeout + .map(|to| min(to.as_millis(), libc::c_uint::MAX as u128) as libc::c_uint) + .unwrap_or(0); + unsafe { + setsockopt( + self.as_raw(), + libc::IPPROTO_TCP, + libc::TCP_USER_TIMEOUT, + timeout, + ) + } + } + + /// Get the value of the `TCP_USER_TIMEOUT` option on this socket. + /// + /// For more information about this option, see [`set_tcp_user_timeout`]. + /// + /// [`set_tcp_user_timeout`]: Socket::set_tcp_user_timeout + #[cfg(all( + feature = "all", + any(target_os = "android", target_os = "fuchsia", target_os = "linux") + ))] + #[cfg_attr( + docsrs, + doc(cfg(all( + feature = "all", + any(target_os = "android", target_os = "fuchsia", target_os = "linux") + ))) + )] + pub fn tcp_user_timeout(&self) -> io::Result> { + unsafe { + getsockopt::(self.as_raw(), libc::IPPROTO_TCP, libc::TCP_USER_TIMEOUT) + .map(|millis| { + if millis == 0 { + None + } else { + Some(Duration::from_millis(millis as u64)) + } + }) + } + } + + /// Attach Berkeley Packet Filter(BPF) on this socket. + /// + /// BPF allows a user-space program to attach a filter onto any socket + /// and allow or disallow certain types of data to come through the socket. + /// + /// For more information about this option, see [filter](https://www.kernel.org/doc/html/v5.12/networking/filter.html) + #[cfg(all(feature = "all", any(target_os = "linux", target_os = "android")))] + pub fn attach_filter(&self, filters: &[libc::sock_filter]) -> io::Result<()> { + let prog = libc::sock_fprog { + len: filters.len() as u16, + filter: filters.as_ptr() as *mut _, + }; + + unsafe { + setsockopt( + self.as_raw(), + libc::SOL_SOCKET, + libc::SO_ATTACH_FILTER, + prog, + ) + } + } + + /// Detach Berkeley Packet Filter(BPF) from this socket. + /// + /// For more information about this option, see [`attach_filter`] + #[cfg(all(feature = "all", any(target_os = "linux", target_os = "android")))] + pub fn detach_filter(&self) -> io::Result<()> { + unsafe { setsockopt(self.as_raw(), libc::SOL_SOCKET, libc::SO_DETACH_FILTER, 0) } + } +} + +#[cfg_attr(docsrs, doc(cfg(unix)))] +impl AsRawFd for crate::Socket { + fn as_raw_fd(&self) -> c_int { + self.as_raw() + } +} + +#[cfg_attr(docsrs, doc(cfg(unix)))] +impl IntoRawFd for crate::Socket { + fn into_raw_fd(self) -> c_int { + self.into_raw() + } +} + +#[cfg_attr(docsrs, doc(cfg(unix)))] +impl FromRawFd for crate::Socket { + unsafe fn from_raw_fd(fd: c_int) -> crate::Socket { + crate::Socket::from_raw(fd) + } +} + +#[cfg(feature = "all")] +from!(UnixStream, crate::Socket); +#[cfg(feature = "all")] +from!(UnixListener, crate::Socket); +#[cfg(feature = "all")] +from!(UnixDatagram, crate::Socket); +#[cfg(feature = "all")] +from!(crate::Socket, UnixStream); +#[cfg(feature = "all")] +from!(crate::Socket, UnixListener); +#[cfg(feature = "all")] +from!(crate::Socket, UnixDatagram); + +#[test] +fn in_addr_convertion() { + let ip = Ipv4Addr::new(127, 0, 0, 1); + let raw = to_in_addr(&ip); + // NOTE: `in_addr` is packed on NetBSD and it's unsafe to borrow. + let a = raw.s_addr; + assert_eq!(a, u32::from_ne_bytes([127, 0, 0, 1])); + assert_eq!(from_in_addr(raw), ip); + + let ip = Ipv4Addr::new(127, 34, 4, 12); + let raw = to_in_addr(&ip); + let a = raw.s_addr; + assert_eq!(a, u32::from_ne_bytes([127, 34, 4, 12])); + assert_eq!(from_in_addr(raw), ip); +} + +#[test] +fn in6_addr_convertion() { + let ip = Ipv6Addr::new(0x2000, 1, 2, 3, 4, 5, 6, 7); + let raw = to_in6_addr(&ip); + let want = [32, 0, 0, 1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6, 0, 7]; + assert_eq!(raw.s6_addr, want); + assert_eq!(from_in6_addr(raw), ip); +} diff -Nru temporalio-1.3.0/vendor/socket2-0.4.9/src/sys/windows.rs temporalio-1.3.0/vendor/socket2-0.4.9/src/sys/windows.rs --- temporalio-1.3.0/vendor/socket2-0.4.9/src/sys/windows.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/socket2-0.4.9/src/sys/windows.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,882 @@ +// Copyright 2015 The Rust Project Developers. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +use std::cmp::min; +use std::io::{self, IoSlice}; +use std::marker::PhantomData; +use std::mem::{self, size_of, MaybeUninit}; +use std::net::{self, Ipv4Addr, Ipv6Addr, Shutdown}; +use std::os::windows::prelude::*; +use std::sync::Once; +use std::time::{Duration, Instant}; +use std::{ptr, slice}; + +use winapi::ctypes::c_long; +use winapi::shared::in6addr::*; +use winapi::shared::inaddr::*; +use winapi::shared::minwindef::DWORD; +use winapi::shared::minwindef::ULONG; +use winapi::shared::mstcpip::{tcp_keepalive, SIO_KEEPALIVE_VALS}; +use winapi::shared::ntdef::HANDLE; +use winapi::shared::ws2def; +use winapi::shared::ws2def::WSABUF; +use winapi::um::handleapi::SetHandleInformation; +use winapi::um::processthreadsapi::GetCurrentProcessId; +use winapi::um::winbase::{self, INFINITE}; +use winapi::um::winsock2::{ + self as sock, u_long, POLLERR, POLLHUP, POLLRDNORM, POLLWRNORM, SD_BOTH, SD_RECEIVE, SD_SEND, + WSAPOLLFD, +}; +use winapi::um::winsock2::{SOCKET_ERROR, WSAEMSGSIZE, WSAESHUTDOWN}; + +use crate::{RecvFlags, SockAddr, TcpKeepalive, Type}; + +pub(crate) use winapi::ctypes::c_int; + +/// Fake MSG_TRUNC flag for the [`RecvFlags`] struct. +/// +/// The flag is enabled when a `WSARecv[From]` call returns `WSAEMSGSIZE`. The +/// value of the flag is defined by us. +pub(crate) const MSG_TRUNC: c_int = 0x01; + +// Used in `Domain`. +pub(crate) use winapi::shared::ws2def::{AF_INET, AF_INET6}; +// Used in `Type`. +pub(crate) use winapi::shared::ws2def::{SOCK_DGRAM, SOCK_STREAM}; +#[cfg(feature = "all")] +pub(crate) use winapi::shared::ws2def::{SOCK_RAW, SOCK_SEQPACKET}; +// Used in `Protocol`. +pub(crate) const IPPROTO_ICMP: c_int = winapi::shared::ws2def::IPPROTO_ICMP as c_int; +pub(crate) const IPPROTO_ICMPV6: c_int = winapi::shared::ws2def::IPPROTO_ICMPV6 as c_int; +pub(crate) const IPPROTO_TCP: c_int = winapi::shared::ws2def::IPPROTO_TCP as c_int; +pub(crate) const IPPROTO_UDP: c_int = winapi::shared::ws2def::IPPROTO_UDP as c_int; +// Used in `SockAddr`. +pub(crate) use winapi::shared::ws2def::{ + ADDRESS_FAMILY as sa_family_t, SOCKADDR as sockaddr, SOCKADDR_IN as sockaddr_in, + SOCKADDR_STORAGE as sockaddr_storage, +}; +pub(crate) use winapi::shared::ws2ipdef::SOCKADDR_IN6_LH as sockaddr_in6; +pub(crate) use winapi::um::ws2tcpip::socklen_t; +// Used in `Socket`. +pub(crate) use winapi::shared::ws2def::{ + IPPROTO_IP, SOL_SOCKET, SO_BROADCAST, SO_ERROR, SO_KEEPALIVE, SO_LINGER, SO_OOBINLINE, + SO_RCVBUF, SO_RCVTIMEO, SO_REUSEADDR, SO_SNDBUF, SO_SNDTIMEO, SO_TYPE, TCP_NODELAY, +}; +#[cfg(feature = "all")] +pub(crate) use winapi::shared::ws2ipdef::IP_HDRINCL; +pub(crate) use winapi::shared::ws2ipdef::{ + IPV6_ADD_MEMBERSHIP, IPV6_DROP_MEMBERSHIP, IPV6_MREQ as Ipv6Mreq, IPV6_MULTICAST_HOPS, + IPV6_MULTICAST_IF, IPV6_MULTICAST_LOOP, IPV6_UNICAST_HOPS, IPV6_V6ONLY, IP_ADD_MEMBERSHIP, + IP_ADD_SOURCE_MEMBERSHIP, IP_DROP_MEMBERSHIP, IP_DROP_SOURCE_MEMBERSHIP, IP_MREQ as IpMreq, + IP_MREQ_SOURCE as IpMreqSource, IP_MULTICAST_IF, IP_MULTICAST_LOOP, IP_MULTICAST_TTL, IP_TOS, + IP_TTL, +}; +pub(crate) use winapi::um::winsock2::{linger, MSG_OOB, MSG_PEEK}; +pub(crate) const IPPROTO_IPV6: c_int = winapi::shared::ws2def::IPPROTO_IPV6 as c_int; + +/// Type used in set/getsockopt to retrieve the `TCP_NODELAY` option. +/// +/// NOTE: +/// documents that options such as `TCP_NODELAY` and `SO_KEEPALIVE` expect a +/// `BOOL` (alias for `c_int`, 4 bytes), however in practice this turns out to +/// be false (or misleading) as a `BOOLEAN` (`c_uchar`, 1 byte) is returned by +/// `getsockopt`. +pub(crate) type Bool = winapi::shared::ntdef::BOOLEAN; + +/// Maximum size of a buffer passed to system call like `recv` and `send`. +const MAX_BUF_LEN: usize = ::max_value() as usize; + +/// Helper macro to execute a system call that returns an `io::Result`. +macro_rules! syscall { + ($fn: ident ( $($arg: expr),* $(,)* ), $err_test: path, $err_value: expr) => {{ + #[allow(unused_unsafe)] + let res = unsafe { sock::$fn($($arg, )*) }; + if $err_test(&res, &$err_value) { + Err(io::Error::last_os_error()) + } else { + Ok(res) + } + }}; +} + +impl_debug!( + crate::Domain, + ws2def::AF_INET, + ws2def::AF_INET6, + ws2def::AF_UNIX, + ws2def::AF_UNSPEC, // = 0. +); + +/// Windows only API. +impl Type { + /// Our custom flag to set `WSA_FLAG_NO_HANDLE_INHERIT` on socket creation. + /// Trying to mimic `Type::cloexec` on windows. + const NO_INHERIT: c_int = 1 << ((size_of::() * 8) - 1); // Last bit. + + /// Set `WSA_FLAG_NO_HANDLE_INHERIT` on the socket. + #[cfg(feature = "all")] + #[cfg_attr(docsrs, doc(cfg(all(windows, feature = "all"))))] + pub const fn no_inherit(self) -> Type { + self._no_inherit() + } + + pub(crate) const fn _no_inherit(self) -> Type { + Type(self.0 | Type::NO_INHERIT) + } +} + +impl_debug!( + crate::Type, + ws2def::SOCK_STREAM, + ws2def::SOCK_DGRAM, + ws2def::SOCK_RAW, + ws2def::SOCK_RDM, + ws2def::SOCK_SEQPACKET, +); + +impl_debug!( + crate::Protocol, + self::IPPROTO_ICMP, + self::IPPROTO_ICMPV6, + self::IPPROTO_TCP, + self::IPPROTO_UDP, +); + +impl std::fmt::Debug for RecvFlags { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("RecvFlags") + .field("is_truncated", &self.is_truncated()) + .finish() + } +} + +#[repr(transparent)] +pub struct MaybeUninitSlice<'a> { + vec: WSABUF, + _lifetime: PhantomData<&'a mut [MaybeUninit]>, +} + +unsafe impl<'a> Send for MaybeUninitSlice<'a> {} + +unsafe impl<'a> Sync for MaybeUninitSlice<'a> {} + +impl<'a> MaybeUninitSlice<'a> { + pub fn new(buf: &'a mut [MaybeUninit]) -> MaybeUninitSlice<'a> { + assert!(buf.len() <= ULONG::MAX as usize); + MaybeUninitSlice { + vec: WSABUF { + len: buf.len() as ULONG, + buf: buf.as_mut_ptr().cast(), + }, + _lifetime: PhantomData, + } + } + + pub fn as_slice(&self) -> &[MaybeUninit] { + unsafe { slice::from_raw_parts(self.vec.buf.cast(), self.vec.len as usize) } + } + + pub fn as_mut_slice(&mut self) -> &mut [MaybeUninit] { + unsafe { slice::from_raw_parts_mut(self.vec.buf.cast(), self.vec.len as usize) } + } +} + +fn init() { + static INIT: Once = Once::new(); + + INIT.call_once(|| { + // Initialize winsock through the standard library by just creating a + // dummy socket. Whether this is successful or not we drop the result as + // libstd will be sure to have initialized winsock. + let _ = net::UdpSocket::bind("127.0.0.1:34254"); + }); +} + +pub(crate) type Socket = sock::SOCKET; + +pub(crate) unsafe fn socket_from_raw(socket: Socket) -> crate::socket::Inner { + crate::socket::Inner::from_raw_socket(socket as RawSocket) +} + +pub(crate) fn socket_as_raw(socket: &crate::socket::Inner) -> Socket { + socket.as_raw_socket() as Socket +} + +pub(crate) fn socket_into_raw(socket: crate::socket::Inner) -> Socket { + socket.into_raw_socket() as Socket +} + +pub(crate) fn socket(family: c_int, mut ty: c_int, protocol: c_int) -> io::Result { + init(); + + // Check if we set our custom flag. + let flags = if ty & Type::NO_INHERIT != 0 { + ty = ty & !Type::NO_INHERIT; + sock::WSA_FLAG_NO_HANDLE_INHERIT + } else { + 0 + }; + + syscall!( + WSASocketW( + family, + ty, + protocol, + ptr::null_mut(), + 0, + sock::WSA_FLAG_OVERLAPPED | flags, + ), + PartialEq::eq, + sock::INVALID_SOCKET + ) +} + +pub(crate) fn bind(socket: Socket, addr: &SockAddr) -> io::Result<()> { + syscall!(bind(socket, addr.as_ptr(), addr.len()), PartialEq::ne, 0).map(|_| ()) +} + +pub(crate) fn connect(socket: Socket, addr: &SockAddr) -> io::Result<()> { + syscall!(connect(socket, addr.as_ptr(), addr.len()), PartialEq::ne, 0).map(|_| ()) +} + +pub(crate) fn poll_connect(socket: &crate::Socket, timeout: Duration) -> io::Result<()> { + let start = Instant::now(); + + let mut fd_array = WSAPOLLFD { + fd: socket.as_raw(), + events: POLLRDNORM | POLLWRNORM, + revents: 0, + }; + + loop { + let elapsed = start.elapsed(); + if elapsed >= timeout { + return Err(io::ErrorKind::TimedOut.into()); + } + + let timeout = (timeout - elapsed).as_millis(); + let timeout = clamp(timeout, 1, c_int::max_value() as u128) as c_int; + + match syscall!( + WSAPoll(&mut fd_array, 1, timeout), + PartialEq::eq, + sock::SOCKET_ERROR + ) { + Ok(0) => return Err(io::ErrorKind::TimedOut.into()), + Ok(_) => { + // Error or hang up indicates an error (or failure to connect). + if (fd_array.revents & POLLERR) != 0 || (fd_array.revents & POLLHUP) != 0 { + match socket.take_error() { + Ok(Some(err)) => return Err(err), + Ok(None) => { + return Err(io::Error::new( + io::ErrorKind::Other, + "no error set after POLLHUP", + )) + } + Err(err) => return Err(err), + } + } + return Ok(()); + } + // Got interrupted, try again. + Err(ref err) if err.kind() == io::ErrorKind::Interrupted => continue, + Err(err) => return Err(err), + } + } +} + +// TODO: use clamp from std lib, stable since 1.50. +fn clamp(value: T, min: T, max: T) -> T +where + T: Ord, +{ + if value <= min { + min + } else if value >= max { + max + } else { + value + } +} + +pub(crate) fn listen(socket: Socket, backlog: c_int) -> io::Result<()> { + syscall!(listen(socket, backlog), PartialEq::ne, 0).map(|_| ()) +} + +pub(crate) fn accept(socket: Socket) -> io::Result<(Socket, SockAddr)> { + // Safety: `accept` initialises the `SockAddr` for us. + unsafe { + SockAddr::init(|storage, len| { + syscall!( + accept(socket, storage.cast(), len), + PartialEq::eq, + sock::INVALID_SOCKET + ) + }) + } +} + +pub(crate) fn getsockname(socket: Socket) -> io::Result { + // Safety: `getsockname` initialises the `SockAddr` for us. + unsafe { + SockAddr::init(|storage, len| { + syscall!( + getsockname(socket, storage.cast(), len), + PartialEq::eq, + sock::SOCKET_ERROR + ) + }) + } + .map(|(_, addr)| addr) +} + +pub(crate) fn getpeername(socket: Socket) -> io::Result { + // Safety: `getpeername` initialises the `SockAddr` for us. + unsafe { + SockAddr::init(|storage, len| { + syscall!( + getpeername(socket, storage.cast(), len), + PartialEq::eq, + sock::SOCKET_ERROR + ) + }) + } + .map(|(_, addr)| addr) +} + +pub(crate) fn try_clone(socket: Socket) -> io::Result { + let mut info: MaybeUninit = MaybeUninit::uninit(); + syscall!( + WSADuplicateSocketW(socket, GetCurrentProcessId(), info.as_mut_ptr()), + PartialEq::eq, + sock::SOCKET_ERROR + )?; + // Safety: `WSADuplicateSocketW` intialised `info` for us. + let mut info = unsafe { info.assume_init() }; + + syscall!( + WSASocketW( + info.iAddressFamily, + info.iSocketType, + info.iProtocol, + &mut info, + 0, + sock::WSA_FLAG_OVERLAPPED | sock::WSA_FLAG_NO_HANDLE_INHERIT, + ), + PartialEq::eq, + sock::INVALID_SOCKET + ) +} + +pub(crate) fn set_nonblocking(socket: Socket, nonblocking: bool) -> io::Result<()> { + let mut nonblocking = nonblocking as u_long; + ioctlsocket(socket, sock::FIONBIO, &mut nonblocking) +} + +pub(crate) fn shutdown(socket: Socket, how: Shutdown) -> io::Result<()> { + let how = match how { + Shutdown::Write => SD_SEND, + Shutdown::Read => SD_RECEIVE, + Shutdown::Both => SD_BOTH, + }; + syscall!(shutdown(socket, how), PartialEq::eq, sock::SOCKET_ERROR).map(|_| ()) +} + +pub(crate) fn recv(socket: Socket, buf: &mut [MaybeUninit], flags: c_int) -> io::Result { + let res = syscall!( + recv( + socket, + buf.as_mut_ptr().cast(), + min(buf.len(), MAX_BUF_LEN) as c_int, + flags, + ), + PartialEq::eq, + sock::SOCKET_ERROR + ); + match res { + Ok(n) => Ok(n as usize), + Err(ref err) if err.raw_os_error() == Some(sock::WSAESHUTDOWN as i32) => Ok(0), + Err(err) => Err(err), + } +} + +pub(crate) fn recv_vectored( + socket: Socket, + bufs: &mut [crate::MaybeUninitSlice<'_>], + flags: c_int, +) -> io::Result<(usize, RecvFlags)> { + let mut nread = 0; + let mut flags = flags as DWORD; + let res = syscall!( + WSARecv( + socket, + bufs.as_mut_ptr().cast(), + min(bufs.len(), DWORD::max_value() as usize) as DWORD, + &mut nread, + &mut flags, + ptr::null_mut(), + None, + ), + PartialEq::eq, + sock::SOCKET_ERROR + ); + match res { + Ok(_) => Ok((nread as usize, RecvFlags(0))), + Err(ref err) if err.raw_os_error() == Some(sock::WSAESHUTDOWN as i32) => { + Ok((0, RecvFlags(0))) + } + Err(ref err) if err.raw_os_error() == Some(sock::WSAEMSGSIZE as i32) => { + Ok((nread as usize, RecvFlags(MSG_TRUNC))) + } + Err(err) => Err(err), + } +} + +pub(crate) fn recv_from( + socket: Socket, + buf: &mut [MaybeUninit], + flags: c_int, +) -> io::Result<(usize, SockAddr)> { + // Safety: `recvfrom` initialises the `SockAddr` for us. + unsafe { + SockAddr::init(|storage, addrlen| { + let res = syscall!( + recvfrom( + socket, + buf.as_mut_ptr().cast(), + min(buf.len(), MAX_BUF_LEN) as c_int, + flags, + storage.cast(), + addrlen, + ), + PartialEq::eq, + sock::SOCKET_ERROR + ); + match res { + Ok(n) => Ok(n as usize), + Err(ref err) if err.raw_os_error() == Some(sock::WSAESHUTDOWN as i32) => Ok(0), + Err(err) => Err(err), + } + }) + } +} + +pub(crate) fn peek_sender(socket: Socket) -> io::Result { + // Safety: `recvfrom` initialises the `SockAddr` for us. + let ((), sender) = unsafe { + SockAddr::init(|storage, addrlen| { + let res = syscall!( + recvfrom( + socket, + // Windows *appears* not to care if you pass a null pointer. + ptr::null_mut(), + 0, + MSG_PEEK, + storage.cast(), + addrlen, + ), + PartialEq::eq, + SOCKET_ERROR + ); + match res { + Ok(_n) => Ok(()), + Err(e) => match e.raw_os_error() { + Some(code) if code == (WSAESHUTDOWN as i32) || code == (WSAEMSGSIZE as i32) => { + Ok(()) + } + _ => Err(e), + }, + } + }) + }?; + + Ok(sender) +} + +pub(crate) fn recv_from_vectored( + socket: Socket, + bufs: &mut [crate::MaybeUninitSlice<'_>], + flags: c_int, +) -> io::Result<(usize, RecvFlags, SockAddr)> { + // Safety: `recvfrom` initialises the `SockAddr` for us. + unsafe { + SockAddr::init(|storage, addrlen| { + let mut nread = 0; + let mut flags = flags as DWORD; + let res = syscall!( + WSARecvFrom( + socket, + bufs.as_mut_ptr().cast(), + min(bufs.len(), DWORD::max_value() as usize) as DWORD, + &mut nread, + &mut flags, + storage.cast(), + addrlen, + ptr::null_mut(), + None, + ), + PartialEq::eq, + sock::SOCKET_ERROR + ); + match res { + Ok(_) => Ok((nread as usize, RecvFlags(0))), + Err(ref err) if err.raw_os_error() == Some(sock::WSAESHUTDOWN as i32) => { + Ok((nread as usize, RecvFlags(0))) + } + Err(ref err) if err.raw_os_error() == Some(sock::WSAEMSGSIZE as i32) => { + Ok((nread as usize, RecvFlags(MSG_TRUNC))) + } + Err(err) => Err(err), + } + }) + } + .map(|((n, recv_flags), addr)| (n, recv_flags, addr)) +} + +pub(crate) fn send(socket: Socket, buf: &[u8], flags: c_int) -> io::Result { + syscall!( + send( + socket, + buf.as_ptr().cast(), + min(buf.len(), MAX_BUF_LEN) as c_int, + flags, + ), + PartialEq::eq, + sock::SOCKET_ERROR + ) + .map(|n| n as usize) +} + +pub(crate) fn send_vectored( + socket: Socket, + bufs: &[IoSlice<'_>], + flags: c_int, +) -> io::Result { + let mut nsent = 0; + syscall!( + WSASend( + socket, + // FIXME: From the `WSASend` docs [1]: + // > For a Winsock application, once the WSASend function is called, + // > the system owns these buffers and the application may not + // > access them. + // + // So what we're doing is actually UB as `bufs` needs to be `&mut + // [IoSlice<'_>]`. + // + // Tracking issue: https://github.com/rust-lang/socket2-rs/issues/129. + // + // NOTE: `send_to_vectored` has the same problem. + // + // [1] https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsasend + bufs.as_ptr() as *mut _, + min(bufs.len(), DWORD::max_value() as usize) as DWORD, + &mut nsent, + flags as DWORD, + std::ptr::null_mut(), + None, + ), + PartialEq::eq, + sock::SOCKET_ERROR + ) + .map(|_| nsent as usize) +} + +pub(crate) fn send_to( + socket: Socket, + buf: &[u8], + addr: &SockAddr, + flags: c_int, +) -> io::Result { + syscall!( + sendto( + socket, + buf.as_ptr().cast(), + min(buf.len(), MAX_BUF_LEN) as c_int, + flags, + addr.as_ptr(), + addr.len(), + ), + PartialEq::eq, + sock::SOCKET_ERROR + ) + .map(|n| n as usize) +} + +pub(crate) fn send_to_vectored( + socket: Socket, + bufs: &[IoSlice<'_>], + addr: &SockAddr, + flags: c_int, +) -> io::Result { + let mut nsent = 0; + syscall!( + WSASendTo( + socket, + // FIXME: Same problem as in `send_vectored`. + bufs.as_ptr() as *mut _, + bufs.len().min(DWORD::MAX as usize) as DWORD, + &mut nsent, + flags as DWORD, + addr.as_ptr(), + addr.len(), + ptr::null_mut(), + None, + ), + PartialEq::eq, + sock::SOCKET_ERROR + ) + .map(|_| nsent as usize) +} + +/// Wrapper around `getsockopt` to deal with platform specific timeouts. +pub(crate) fn timeout_opt(fd: Socket, lvl: c_int, name: c_int) -> io::Result> { + unsafe { getsockopt(fd, lvl, name).map(from_ms) } +} + +fn from_ms(duration: DWORD) -> Option { + if duration == 0 { + None + } else { + let secs = duration / 1000; + let nsec = (duration % 1000) * 1000000; + Some(Duration::new(secs as u64, nsec as u32)) + } +} + +/// Wrapper around `setsockopt` to deal with platform specific timeouts. +pub(crate) fn set_timeout_opt( + fd: Socket, + level: c_int, + optname: c_int, + duration: Option, +) -> io::Result<()> { + let duration = into_ms(duration); + unsafe { setsockopt(fd, level, optname, duration) } +} + +fn into_ms(duration: Option) -> DWORD { + // Note that a duration is a (u64, u32) (seconds, nanoseconds) pair, and the + // timeouts in windows APIs are typically u32 milliseconds. To translate, we + // have two pieces to take care of: + // + // * Nanosecond precision is rounded up + // * Greater than u32::MAX milliseconds (50 days) is rounded up to + // INFINITE (never time out). + duration + .map(|duration| min(duration.as_millis(), INFINITE as u128) as DWORD) + .unwrap_or(0) +} + +pub(crate) fn set_tcp_keepalive(socket: Socket, keepalive: &TcpKeepalive) -> io::Result<()> { + let mut keepalive = tcp_keepalive { + onoff: 1, + keepalivetime: into_ms(keepalive.time), + keepaliveinterval: into_ms(keepalive.interval), + }; + let mut out = 0; + syscall!( + WSAIoctl( + socket, + SIO_KEEPALIVE_VALS, + &mut keepalive as *mut _ as *mut _, + size_of::() as _, + ptr::null_mut(), + 0, + &mut out, + ptr::null_mut(), + None, + ), + PartialEq::eq, + sock::SOCKET_ERROR + ) + .map(|_| ()) +} + +/// Caller must ensure `T` is the correct type for `level` and `optname`. +pub(crate) unsafe fn getsockopt(socket: Socket, level: c_int, optname: c_int) -> io::Result { + let mut optval: MaybeUninit = MaybeUninit::uninit(); + let mut optlen = mem::size_of::() as c_int; + syscall!( + getsockopt( + socket, + level, + optname, + optval.as_mut_ptr().cast(), + &mut optlen, + ), + PartialEq::eq, + sock::SOCKET_ERROR + ) + .map(|_| { + debug_assert_eq!(optlen as usize, mem::size_of::()); + // Safety: `getsockopt` initialised `optval` for us. + optval.assume_init() + }) +} + +/// Caller must ensure `T` is the correct type for `level` and `optname`. +pub(crate) unsafe fn setsockopt( + socket: Socket, + level: c_int, + optname: c_int, + optval: T, +) -> io::Result<()> { + syscall!( + setsockopt( + socket, + level, + optname, + (&optval as *const T).cast(), + mem::size_of::() as c_int, + ), + PartialEq::eq, + sock::SOCKET_ERROR + ) + .map(|_| ()) +} + +fn ioctlsocket(socket: Socket, cmd: c_long, payload: &mut u_long) -> io::Result<()> { + syscall!( + ioctlsocket(socket, cmd, payload), + PartialEq::eq, + sock::SOCKET_ERROR + ) + .map(|_| ()) +} + +pub(crate) fn to_in_addr(addr: &Ipv4Addr) -> IN_ADDR { + let mut s_un: in_addr_S_un = unsafe { mem::zeroed() }; + // `S_un` is stored as BE on all machines, and the array is in BE order. So + // the native endian conversion method is used so that it's never swapped. + unsafe { *(s_un.S_addr_mut()) = u32::from_ne_bytes(addr.octets()) }; + IN_ADDR { S_un: s_un } +} + +pub(crate) fn from_in_addr(in_addr: IN_ADDR) -> Ipv4Addr { + Ipv4Addr::from(unsafe { *in_addr.S_un.S_addr() }.to_ne_bytes()) +} + +pub(crate) fn to_in6_addr(addr: &Ipv6Addr) -> in6_addr { + let mut ret_addr: in6_addr_u = unsafe { mem::zeroed() }; + unsafe { *(ret_addr.Byte_mut()) = addr.octets() }; + let mut ret: in6_addr = unsafe { mem::zeroed() }; + ret.u = ret_addr; + ret +} + +pub(crate) fn from_in6_addr(addr: in6_addr) -> Ipv6Addr { + Ipv6Addr::from(*unsafe { addr.u.Byte() }) +} + +pub(crate) fn to_mreqn( + multiaddr: &Ipv4Addr, + interface: &crate::socket::InterfaceIndexOrAddress, +) -> IpMreq { + IpMreq { + imr_multiaddr: to_in_addr(multiaddr), + // Per https://docs.microsoft.com/en-us/windows/win32/api/ws2ipdef/ns-ws2ipdef-ip_mreq#members: + // + // imr_interface + // + // The local IPv4 address of the interface or the interface index on + // which the multicast group should be joined or dropped. This value is + // in network byte order. If this member specifies an IPv4 address of + // 0.0.0.0, the default IPv4 multicast interface is used. + // + // To use an interface index of 1 would be the same as an IP address of + // 0.0.0.1. + imr_interface: match interface { + crate::socket::InterfaceIndexOrAddress::Index(interface) => { + to_in_addr(&(*interface).into()) + } + crate::socket::InterfaceIndexOrAddress::Address(interface) => to_in_addr(interface), + }, + } +} + +/// Windows only API. +impl crate::Socket { + /// Sets `HANDLE_FLAG_INHERIT` using `SetHandleInformation`. + #[cfg(feature = "all")] + #[cfg_attr(docsrs, doc(cfg(all(windows, feature = "all"))))] + pub fn set_no_inherit(&self, no_inherit: bool) -> io::Result<()> { + self._set_no_inherit(no_inherit) + } + + pub(crate) fn _set_no_inherit(&self, no_inherit: bool) -> io::Result<()> { + // NOTE: can't use `syscall!` because it expects the function in the + // `sock::` path. + let res = unsafe { + SetHandleInformation( + self.as_raw() as HANDLE, + winbase::HANDLE_FLAG_INHERIT, + !no_inherit as _, + ) + }; + if res == 0 { + // Zero means error. + Err(io::Error::last_os_error()) + } else { + Ok(()) + } + } +} + +impl AsRawSocket for crate::Socket { + fn as_raw_socket(&self) -> RawSocket { + self.as_raw() as RawSocket + } +} + +impl IntoRawSocket for crate::Socket { + fn into_raw_socket(self) -> RawSocket { + self.into_raw() as RawSocket + } +} + +impl FromRawSocket for crate::Socket { + unsafe fn from_raw_socket(socket: RawSocket) -> crate::Socket { + crate::Socket::from_raw(socket as Socket) + } +} + +#[test] +fn in_addr_convertion() { + let ip = Ipv4Addr::new(127, 0, 0, 1); + let raw = to_in_addr(&ip); + assert_eq!(unsafe { *raw.S_un.S_addr() }, 127 << 0 | 1 << 24); + assert_eq!(from_in_addr(raw), ip); + + let ip = Ipv4Addr::new(127, 34, 4, 12); + let raw = to_in_addr(&ip); + assert_eq!( + unsafe { *raw.S_un.S_addr() }, + 127 << 0 | 34 << 8 | 4 << 16 | 12 << 24 + ); + assert_eq!(from_in_addr(raw), ip); +} + +#[test] +fn in6_addr_convertion() { + let ip = Ipv6Addr::new(0x2000, 1, 2, 3, 4, 5, 6, 7); + let raw = to_in6_addr(&ip); + let want = [ + 0x2000u16.to_be(), + 1u16.to_be(), + 2u16.to_be(), + 3u16.to_be(), + 4u16.to_be(), + 5u16.to_be(), + 6u16.to_be(), + 7u16.to_be(), + ]; + assert_eq!(unsafe { *raw.u.Word() }, want); + assert_eq!(from_in6_addr(raw), ip); +} diff -Nru temporalio-1.3.0/vendor/spin-0.5.2/.cargo-checksum.json temporalio-1.3.0/vendor/spin-0.5.2/.cargo-checksum.json --- temporalio-1.3.0/vendor/spin-0.5.2/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/spin-0.5.2/.cargo-checksum.json 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -{"files":{"Cargo.toml":"5202788831ce65bfa4b67dc3dcdd7698b30f1985dd1319cb31aec6a9afd4bde7","LICENSE":"6ac8711fb340c62ce0a4ecd463342d3fa0e8e70de697c863a2e1c0c53006003c","README.md":"90b21c45b2fd68f8dbf12ec8f61339e8689f031eb806ad90e73f11510e53eb72","examples/debug.rs":"0074651d78f8ed6d6c0274ae832c0d78de6c5c59423936f58e79cb3c98baea2c","script/doc-upload.cfg":"7383ee022197c1dade9a2e6888261def4a80df08ecb72b1b4db47d1e8a6ff8e0","src/lib.rs":"865d4759a7ed4b99b9c68f52ac849e7beb43940a8fb12c853e568d817821949a","src/mutex.rs":"3d2ae66354a799b66e0f1102790fadd1a09c5c6ecaea1290bde1867e91310c5e","src/once.rs":"61d8221858e2bfc41cc0fab802867e5eb05169dd2fa51912696188c31cf1f4ca","src/rw_lock.rs":"1af1974a2aefac645c4d32c85df2257422fa0f655a57ffcf61f7867769c918ed"},"package":"6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/spin-0.5.2/Cargo.toml temporalio-1.3.0/vendor/spin-0.5.2/Cargo.toml --- temporalio-1.3.0/vendor/spin-0.5.2/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/spin-0.5.2/Cargo.toml 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -# 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 believe there's an error in this file please file an -# issue against the rust-lang/cargo repository. If you're -# editing this file be aware that the upstream Cargo.toml -# will likely look very different (and much more reasonable) - -[package] -name = "spin" -version = "0.5.2" -authors = ["Mathijs van de Nes ", "John Ericson "] -description = "Synchronization primitives based on spinning.\nThey may contain data, are usable without `std`,\nand static initializers are available.\n" -documentation = "https://mvdnes.github.io/rust-docs/spin-rs/spin/index.html" -keywords = ["spinlock", "mutex", "rwlock"] -license = "MIT" -repository = "https://github.com/mvdnes/spin-rs.git" diff -Nru temporalio-1.3.0/vendor/spin-0.5.2/examples/debug.rs temporalio-1.3.0/vendor/spin-0.5.2/examples/debug.rs --- temporalio-1.3.0/vendor/spin-0.5.2/examples/debug.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/spin-0.5.2/examples/debug.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -extern crate spin; - -fn main() { - let mutex = spin::Mutex::new(42); - println!("{:?}", mutex); - { - let x = mutex.lock(); - println!("{:?}, {:?}", mutex, *x); - } - - let rwlock = spin::RwLock::new(42); - println!("{:?}", rwlock); - { - let x = rwlock.read(); - println!("{:?}, {:?}", rwlock, *x); - } - { - let x = rwlock.write(); - println!("{:?}, {:?}", rwlock, *x); - } -} diff -Nru temporalio-1.3.0/vendor/spin-0.5.2/LICENSE temporalio-1.3.0/vendor/spin-0.5.2/LICENSE --- temporalio-1.3.0/vendor/spin-0.5.2/LICENSE 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/spin-0.5.2/LICENSE 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 Mathijs van de Nes - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/spin-0.5.2/README.md temporalio-1.3.0/vendor/spin-0.5.2/README.md --- temporalio-1.3.0/vendor/spin-0.5.2/README.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/spin-0.5.2/README.md 1970-01-01 00:00:00.000000000 +0000 @@ -1,64 +0,0 @@ -spin-rs -=========== - -[![Build Status](https://travis-ci.org/mvdnes/spin-rs.svg)](https://travis-ci.org/mvdnes/spin-rs) -[![Crates.io version](https://img.shields.io/crates/v/spin.svg)](https://crates.io/crates/spin) -[![docs.rs](https://docs.rs/spin/badge.svg)](https://docs.rs/spin/) - -This Rust library implements a simple -[spinlock](https://en.wikipedia.org/wiki/Spinlock), and is safe for `#[no_std]` environments. - -Usage ------ - -Include the following code in your Cargo.toml - -```toml -[dependencies.spin] -version = "0.5" -``` - -Example -------- - -When calling `lock` on a `Mutex` you will get a reference to the data. When this -reference is dropped, the lock will be unlocked. - -```rust -extern crate spin; - -fn main() -{ - let mutex = spin::Mutex::new(0); - let rw_lock = spin::RwLock::new(0); - - // Modify the data - { - let mut data = mutex.lock(); - *data = 2; - let mut data = rw_lock.write(); - *data = 3; - } - - // Read the data - let answer = - { - let data1 = mutex.lock(); - let data2 = rw_lock.read(); - let data3 = rw_lock.read(); // sharing - (*data1, *data2, *data3) - }; - - println!("Answers are {:?}", answer); -} -``` - -To share the lock, an `Arc>` may be used. - -Remarks -------- - -The behaviour of these lock is similar to their namesakes in `std::sync`. they -differ on the following: - - - The lock will not be poisoned in case of failure; diff -Nru temporalio-1.3.0/vendor/spin-0.5.2/script/doc-upload.cfg temporalio-1.3.0/vendor/spin-0.5.2/script/doc-upload.cfg --- temporalio-1.3.0/vendor/spin-0.5.2/script/doc-upload.cfg 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/spin-0.5.2/script/doc-upload.cfg 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ -PROJECT_NAME=spin-rs -DOCS_REPO=mvdnes/rust-docs.git -DOC_RUST_VERSION=stable diff -Nru temporalio-1.3.0/vendor/spin-0.5.2/src/lib.rs temporalio-1.3.0/vendor/spin-0.5.2/src/lib.rs --- temporalio-1.3.0/vendor/spin-0.5.2/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/spin-0.5.2/src/lib.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -#![crate_type = "lib"] -#![warn(missing_docs)] - -//! Synchronization primitives based on spinning - -#![no_std] - -#[cfg(test)] -#[macro_use] -extern crate std; - -pub use mutex::*; -pub use rw_lock::*; -pub use once::*; - -mod mutex; -mod rw_lock; -mod once; diff -Nru temporalio-1.3.0/vendor/spin-0.5.2/src/mutex.rs temporalio-1.3.0/vendor/spin-0.5.2/src/mutex.rs --- temporalio-1.3.0/vendor/spin-0.5.2/src/mutex.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/spin-0.5.2/src/mutex.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,388 +0,0 @@ -use core::sync::atomic::{AtomicBool, Ordering, spin_loop_hint as cpu_relax}; -use core::cell::UnsafeCell; -use core::marker::Sync; -use core::ops::{Drop, Deref, DerefMut}; -use core::fmt; -use core::option::Option::{self, None, Some}; -use core::default::Default; - -/// This type provides MUTual EXclusion based on spinning. -/// -/// # Description -/// -/// The behaviour of these lock is similar to their namesakes in `std::sync`. they -/// differ on the following: -/// -/// - The lock will not be poisoned in case of failure; -/// -/// # Simple examples -/// -/// ``` -/// use spin; -/// let spin_mutex = spin::Mutex::new(0); -/// -/// // Modify the data -/// { -/// let mut data = spin_mutex.lock(); -/// *data = 2; -/// } -/// -/// // Read the data -/// let answer = -/// { -/// let data = spin_mutex.lock(); -/// *data -/// }; -/// -/// assert_eq!(answer, 2); -/// ``` -/// -/// # Thread-safety example -/// -/// ``` -/// use spin; -/// use std::sync::{Arc, Barrier}; -/// -/// let numthreads = 1000; -/// let spin_mutex = Arc::new(spin::Mutex::new(0)); -/// -/// // We use a barrier to ensure the readout happens after all writing -/// let barrier = Arc::new(Barrier::new(numthreads + 1)); -/// -/// for _ in (0..numthreads) -/// { -/// let my_barrier = barrier.clone(); -/// let my_lock = spin_mutex.clone(); -/// std::thread::spawn(move|| -/// { -/// let mut guard = my_lock.lock(); -/// *guard += 1; -/// -/// // Release the lock to prevent a deadlock -/// drop(guard); -/// my_barrier.wait(); -/// }); -/// } -/// -/// barrier.wait(); -/// -/// let answer = { *spin_mutex.lock() }; -/// assert_eq!(answer, numthreads); -/// ``` -pub struct Mutex -{ - lock: AtomicBool, - data: UnsafeCell, -} - -/// A guard to which the protected data can be accessed -/// -/// When the guard falls out of scope it will release the lock. -#[derive(Debug)] -pub struct MutexGuard<'a, T: ?Sized + 'a> -{ - lock: &'a AtomicBool, - data: &'a mut T, -} - -// Same unsafe impls as `std::sync::Mutex` -unsafe impl Sync for Mutex {} -unsafe impl Send for Mutex {} - -impl Mutex -{ - /// Creates a new spinlock wrapping the supplied data. - /// - /// May be used statically: - /// - /// ``` - /// use spin; - /// - /// static MUTEX: spin::Mutex<()> = spin::Mutex::new(()); - /// - /// fn demo() { - /// let lock = MUTEX.lock(); - /// // do something with lock - /// drop(lock); - /// } - /// ``` - pub const fn new(user_data: T) -> Mutex - { - Mutex - { - lock: AtomicBool::new(false), - data: UnsafeCell::new(user_data), - } - } - - /// Consumes this mutex, returning the underlying data. - pub fn into_inner(self) -> T { - // We know statically that there are no outstanding references to - // `self` so there's no need to lock. - let Mutex { data, .. } = self; - data.into_inner() - } -} - -impl Mutex -{ - fn obtain_lock(&self) - { - while self.lock.compare_and_swap(false, true, Ordering::Acquire) != false - { - // Wait until the lock looks unlocked before retrying - while self.lock.load(Ordering::Relaxed) - { - cpu_relax(); - } - } - } - - /// Locks the spinlock and returns a guard. - /// - /// The returned value may be dereferenced for data access - /// and the lock will be dropped when the guard falls out of scope. - /// - /// ``` - /// let mylock = spin::Mutex::new(0); - /// { - /// let mut data = mylock.lock(); - /// // The lock is now locked and the data can be accessed - /// *data += 1; - /// // The lock is implicitly dropped - /// } - /// - /// ``` - pub fn lock(&self) -> MutexGuard - { - self.obtain_lock(); - MutexGuard - { - lock: &self.lock, - data: unsafe { &mut *self.data.get() }, - } - } - - /// Force unlock the spinlock. - /// - /// This is *extremely* unsafe if the lock is not held by the current - /// thread. However, this can be useful in some instances for exposing the - /// lock to FFI that doesn't know how to deal with RAII. - /// - /// If the lock isn't held, this is a no-op. - pub unsafe fn force_unlock(&self) { - self.lock.store(false, Ordering::Release); - } - - /// Tries to lock the mutex. If it is already locked, it will return None. Otherwise it returns - /// a guard within Some. - pub fn try_lock(&self) -> Option> - { - if self.lock.compare_and_swap(false, true, Ordering::Acquire) == false - { - Some( - MutexGuard { - lock: &self.lock, - data: unsafe { &mut *self.data.get() }, - } - ) - } - else - { - None - } - } -} - -impl fmt::Debug for Mutex -{ - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result - { - match self.try_lock() - { - Some(guard) => write!(f, "Mutex {{ data: ") - .and_then(|()| (&*guard).fmt(f)) - .and_then(|()| write!(f, "}}")), - None => write!(f, "Mutex {{ }}"), - } - } -} - -impl Default for Mutex { - fn default() -> Mutex { - Mutex::new(Default::default()) - } -} - -impl<'a, T: ?Sized> Deref for MutexGuard<'a, T> -{ - type Target = T; - fn deref<'b>(&'b self) -> &'b T { &*self.data } -} - -impl<'a, T: ?Sized> DerefMut for MutexGuard<'a, T> -{ - fn deref_mut<'b>(&'b mut self) -> &'b mut T { &mut *self.data } -} - -impl<'a, T: ?Sized> Drop for MutexGuard<'a, T> -{ - /// The dropping of the MutexGuard will release the lock it was created from. - fn drop(&mut self) - { - self.lock.store(false, Ordering::Release); - } -} - -#[cfg(test)] -mod tests { - use std::prelude::v1::*; - - use std::sync::mpsc::channel; - use std::sync::Arc; - use std::sync::atomic::{AtomicUsize, Ordering}; - use std::thread; - - use super::*; - - #[derive(Eq, PartialEq, Debug)] - struct NonCopy(i32); - - #[test] - fn smoke() { - let m = Mutex::new(()); - drop(m.lock()); - drop(m.lock()); - } - - #[test] - fn lots_and_lots() { - static M: Mutex<()> = Mutex::new(()); - static mut CNT: u32 = 0; - const J: u32 = 1000; - const K: u32 = 3; - - fn inc() { - for _ in 0..J { - unsafe { - let _g = M.lock(); - CNT += 1; - } - } - } - - let (tx, rx) = channel(); - for _ in 0..K { - let tx2 = tx.clone(); - thread::spawn(move|| { inc(); tx2.send(()).unwrap(); }); - let tx2 = tx.clone(); - thread::spawn(move|| { inc(); tx2.send(()).unwrap(); }); - } - - drop(tx); - for _ in 0..2 * K { - rx.recv().unwrap(); - } - assert_eq!(unsafe {CNT}, J * K * 2); - } - - #[test] - fn try_lock() { - let mutex = Mutex::new(42); - - // First lock succeeds - let a = mutex.try_lock(); - assert_eq!(a.as_ref().map(|r| **r), Some(42)); - - // Additional lock failes - let b = mutex.try_lock(); - assert!(b.is_none()); - - // After dropping lock, it succeeds again - ::core::mem::drop(a); - let c = mutex.try_lock(); - assert_eq!(c.as_ref().map(|r| **r), Some(42)); - } - - #[test] - fn test_into_inner() { - let m = Mutex::new(NonCopy(10)); - assert_eq!(m.into_inner(), NonCopy(10)); - } - - #[test] - fn test_into_inner_drop() { - struct Foo(Arc); - impl Drop for Foo { - fn drop(&mut self) { - self.0.fetch_add(1, Ordering::SeqCst); - } - } - let num_drops = Arc::new(AtomicUsize::new(0)); - let m = Mutex::new(Foo(num_drops.clone())); - assert_eq!(num_drops.load(Ordering::SeqCst), 0); - { - let _inner = m.into_inner(); - assert_eq!(num_drops.load(Ordering::SeqCst), 0); - } - assert_eq!(num_drops.load(Ordering::SeqCst), 1); - } - - #[test] - fn test_mutex_arc_nested() { - // Tests nested mutexes and access - // to underlying data. - let arc = Arc::new(Mutex::new(1)); - let arc2 = Arc::new(Mutex::new(arc)); - let (tx, rx) = channel(); - let _t = thread::spawn(move|| { - let lock = arc2.lock(); - let lock2 = lock.lock(); - assert_eq!(*lock2, 1); - tx.send(()).unwrap(); - }); - rx.recv().unwrap(); - } - - #[test] - fn test_mutex_arc_access_in_unwind() { - let arc = Arc::new(Mutex::new(1)); - let arc2 = arc.clone(); - let _ = thread::spawn(move|| -> () { - struct Unwinder { - i: Arc>, - } - impl Drop for Unwinder { - fn drop(&mut self) { - *self.i.lock() += 1; - } - } - let _u = Unwinder { i: arc2 }; - panic!(); - }).join(); - let lock = arc.lock(); - assert_eq!(*lock, 2); - } - - #[test] - fn test_mutex_unsized() { - let mutex: &Mutex<[i32]> = &Mutex::new([1, 2, 3]); - { - let b = &mut *mutex.lock(); - b[0] = 4; - b[2] = 5; - } - let comp: &[i32] = &[4, 2, 5]; - assert_eq!(&*mutex.lock(), comp); - } - - #[test] - fn test_mutex_force_lock() { - let lock = Mutex::new(()); - ::std::mem::forget(lock.lock()); - unsafe { - lock.force_unlock(); - } - assert!(lock.try_lock().is_some()); - } -} diff -Nru temporalio-1.3.0/vendor/spin-0.5.2/src/once.rs temporalio-1.3.0/vendor/spin-0.5.2/src/once.rs --- temporalio-1.3.0/vendor/spin-0.5.2/src/once.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/spin-0.5.2/src/once.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,290 +0,0 @@ -use core::cell::UnsafeCell; -use core::sync::atomic::{AtomicUsize, Ordering, spin_loop_hint as cpu_relax}; -use core::fmt; - -/// A synchronization primitive which can be used to run a one-time global -/// initialization. Unlike its std equivalent, this is generalized so that the -/// closure returns a value and it is stored. Once therefore acts something like -/// a future, too. -/// -/// # Examples -/// -/// ``` -/// use spin; -/// -/// static START: spin::Once<()> = spin::Once::new(); -/// -/// START.call_once(|| { -/// // run initialization here -/// }); -/// ``` -pub struct Once { - state: AtomicUsize, - data: UnsafeCell>, // TODO remove option and use mem::uninitialized -} - -impl fmt::Debug for Once { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - match self.try() { - Some(s) => write!(f, "Once {{ data: ") - .and_then(|()| s.fmt(f)) - .and_then(|()| write!(f, "}}")), - None => write!(f, "Once {{ }}") - } - } -} - -// Same unsafe impls as `std::sync::RwLock`, because this also allows for -// concurrent reads. -unsafe impl Sync for Once {} -unsafe impl Send for Once {} - -// Four states that a Once can be in, encoded into the lower bits of `state` in -// the Once structure. -const INCOMPLETE: usize = 0x0; -const RUNNING: usize = 0x1; -const COMPLETE: usize = 0x2; -const PANICKED: usize = 0x3; - -use core::hint::unreachable_unchecked as unreachable; - -impl Once { - /// Initialization constant of `Once`. - pub const INIT: Self = Once { - state: AtomicUsize::new(INCOMPLETE), - data: UnsafeCell::new(None), - }; - - /// Creates a new `Once` value. - pub const fn new() -> Once { - Self::INIT - } - - fn force_get<'a>(&'a self) -> &'a T { - match unsafe { &*self.data.get() }.as_ref() { - None => unsafe { unreachable() }, - Some(p) => p, - } - } - - /// Performs an initialization routine once and only once. The given closure - /// will be executed if this is the first time `call_once` has been called, - /// and otherwise the routine will *not* be invoked. - /// - /// This method will block the calling thread if another initialization - /// routine is currently running. - /// - /// When this function returns, it is guaranteed that some initialization - /// has run and completed (it may not be the closure specified). The - /// returned pointer will point to the result from the closure that was - /// run. - /// - /// # Examples - /// - /// ``` - /// use spin; - /// - /// static INIT: spin::Once = spin::Once::new(); - /// - /// fn get_cached_val() -> usize { - /// *INIT.call_once(expensive_computation) - /// } - /// - /// fn expensive_computation() -> usize { - /// // ... - /// # 2 - /// } - /// ``` - pub fn call_once<'a, F>(&'a self, builder: F) -> &'a T - where F: FnOnce() -> T - { - let mut status = self.state.load(Ordering::SeqCst); - - if status == INCOMPLETE { - status = self.state.compare_and_swap(INCOMPLETE, - RUNNING, - Ordering::SeqCst); - if status == INCOMPLETE { // We init - // We use a guard (Finish) to catch panics caused by builder - let mut finish = Finish { state: &self.state, panicked: true }; - unsafe { *self.data.get() = Some(builder()) }; - finish.panicked = false; - - status = COMPLETE; - self.state.store(status, Ordering::SeqCst); - - // This next line is strictly an optimization - return self.force_get(); - } - } - - loop { - match status { - INCOMPLETE => unreachable!(), - RUNNING => { // We spin - cpu_relax(); - status = self.state.load(Ordering::SeqCst) - }, - PANICKED => panic!("Once has panicked"), - COMPLETE => return self.force_get(), - _ => unsafe { unreachable() }, - } - } - } - - /// Returns a pointer iff the `Once` was previously initialized - pub fn try<'a>(&'a self) -> Option<&'a T> { - match self.state.load(Ordering::SeqCst) { - COMPLETE => Some(self.force_get()), - _ => None, - } - } - - /// Like try, but will spin if the `Once` is in the process of being - /// initialized - pub fn wait<'a>(&'a self) -> Option<&'a T> { - loop { - match self.state.load(Ordering::SeqCst) { - INCOMPLETE => return None, - RUNNING => cpu_relax(), // We spin - COMPLETE => return Some(self.force_get()), - PANICKED => panic!("Once has panicked"), - _ => unsafe { unreachable() }, - } - } - } -} - -struct Finish<'a> { - state: &'a AtomicUsize, - panicked: bool, -} - -impl<'a> Drop for Finish<'a> { - fn drop(&mut self) { - if self.panicked { - self.state.store(PANICKED, Ordering::SeqCst); - } - } -} - -#[cfg(test)] -mod tests { - use std::prelude::v1::*; - - use std::sync::mpsc::channel; - use std::thread; - use super::Once; - - #[test] - fn smoke_once() { - static O: Once<()> = Once::new(); - let mut a = 0; - O.call_once(|| a += 1); - assert_eq!(a, 1); - O.call_once(|| a += 1); - assert_eq!(a, 1); - } - - #[test] - fn smoke_once_value() { - static O: Once = Once::new(); - let a = O.call_once(|| 1); - assert_eq!(*a, 1); - let b = O.call_once(|| 2); - assert_eq!(*b, 1); - } - - #[test] - fn stampede_once() { - static O: Once<()> = Once::new(); - static mut RUN: bool = false; - - let (tx, rx) = channel(); - for _ in 0..10 { - let tx = tx.clone(); - thread::spawn(move|| { - for _ in 0..4 { thread::yield_now() } - unsafe { - O.call_once(|| { - assert!(!RUN); - RUN = true; - }); - assert!(RUN); - } - tx.send(()).unwrap(); - }); - } - - unsafe { - O.call_once(|| { - assert!(!RUN); - RUN = true; - }); - assert!(RUN); - } - - for _ in 0..10 { - rx.recv().unwrap(); - } - } - - #[test] - fn try() { - static INIT: Once = Once::new(); - - assert!(INIT.try().is_none()); - INIT.call_once(|| 2); - assert_eq!(INIT.try().map(|r| *r), Some(2)); - } - - #[test] - fn try_no_wait() { - static INIT: Once = Once::new(); - - assert!(INIT.try().is_none()); - thread::spawn(move|| { - INIT.call_once(|| loop { }); - }); - assert!(INIT.try().is_none()); - } - - - #[test] - fn wait() { - static INIT: Once = Once::new(); - - assert!(INIT.wait().is_none()); - INIT.call_once(|| 3); - assert_eq!(INIT.wait().map(|r| *r), Some(3)); - } - - #[test] - fn panic() { - use ::std::panic; - - static INIT: Once<()> = Once::new(); - - // poison the once - let t = panic::catch_unwind(|| { - INIT.call_once(|| panic!()); - }); - assert!(t.is_err()); - - // poisoning propagates - let t = panic::catch_unwind(|| { - INIT.call_once(|| {}); - }); - assert!(t.is_err()); - } - - #[test] - fn init_constant() { - static O: Once<()> = Once::INIT; - let mut a = 0; - O.call_once(|| a += 1); - assert_eq!(a, 1); - O.call_once(|| a += 1); - assert_eq!(a, 1); - } -} diff -Nru temporalio-1.3.0/vendor/spin-0.5.2/src/rw_lock.rs temporalio-1.3.0/vendor/spin-0.5.2/src/rw_lock.rs --- temporalio-1.3.0/vendor/spin-0.5.2/src/rw_lock.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/spin-0.5.2/src/rw_lock.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,777 +0,0 @@ -use core::cell::UnsafeCell; -use core::default::Default; -use core::fmt; -use core::marker::PhantomData; -use core::mem; -use core::ops::{Deref, DerefMut}; -use core::ptr::NonNull; -use core::sync::atomic::{spin_loop_hint as cpu_relax, AtomicUsize, Ordering}; - -/// A reader-writer lock -/// -/// This type of lock allows a number of readers or at most one writer at any -/// point in time. The write portion of this lock typically allows modification -/// of the underlying data (exclusive access) and the read portion of this lock -/// typically allows for read-only access (shared access). -/// -/// The type parameter `T` represents the data that this lock protects. It is -/// required that `T` satisfies `Send` to be shared across tasks and `Sync` to -/// allow concurrent access through readers. The RAII guards returned from the -/// locking methods implement `Deref` (and `DerefMut` for the `write` methods) -/// to allow access to the contained of the lock. -/// -/// An [`RwLockUpgradeableGuard`](RwLockUpgradeableGuard) can be upgraded to a -/// writable guard through the [`RwLockUpgradeableGuard::upgrade`](RwLockUpgradeableGuard::upgrade) -/// [`RwLockUpgradeableGuard::try_upgrade`](RwLockUpgradeableGuard::try_upgrade) functions. -/// Writable or upgradeable guards can be downgraded through their respective `downgrade` -/// functions. -/// -/// Based on Facebook's -/// [`folly/RWSpinLock.h`](https://github.com/facebook/folly/blob/a0394d84f2d5c3e50ebfd0566f9d3acb52cfab5a/folly/synchronization/RWSpinLock.h). -/// This implementation is unfair to writers - if the lock always has readers, then no writers will -/// ever get a chance. Using an upgradeable lock guard can *somewhat* alleviate this issue as no -/// new readers are allowed when an upgradeable guard is held, but upgradeable guards can be taken -/// when there are existing readers. However if the lock is that highly contended and writes are -/// crucial then this implementation may be a poor choice. -/// -/// # Examples -/// -/// ``` -/// use spin; -/// -/// let lock = spin::RwLock::new(5); -/// -/// // many reader locks can be held at once -/// { -/// let r1 = lock.read(); -/// let r2 = lock.read(); -/// assert_eq!(*r1, 5); -/// assert_eq!(*r2, 5); -/// } // read locks are dropped at this point -/// -/// // only one write lock may be held, however -/// { -/// let mut w = lock.write(); -/// *w += 1; -/// assert_eq!(*w, 6); -/// } // write lock is dropped here -/// ``` -pub struct RwLock { - lock: AtomicUsize, - data: UnsafeCell, -} - -const READER: usize = 1 << 2; -const UPGRADED: usize = 1 << 1; -const WRITER: usize = 1; - -/// A guard from which the protected data can be read -/// -/// When the guard falls out of scope it will decrement the read count, -/// potentially releasing the lock. -#[derive(Debug)] -pub struct RwLockReadGuard<'a, T: 'a + ?Sized> { - lock: &'a AtomicUsize, - data: NonNull, -} - -/// A guard to which the protected data can be written -/// -/// When the guard falls out of scope it will release the lock. -#[derive(Debug)] -pub struct RwLockWriteGuard<'a, T: 'a + ?Sized> { - lock: &'a AtomicUsize, - data: NonNull, - #[doc(hidden)] - _invariant: PhantomData<&'a mut T>, -} - -/// A guard from which the protected data can be read, and can be upgraded -/// to a writable guard if needed -/// -/// No writers or other upgradeable guards can exist while this is in scope. New reader -/// creation is prevented (to alleviate writer starvation) but there may be existing readers -/// when the lock is acquired. -/// -/// When the guard falls out of scope it will release the lock. -#[derive(Debug)] -pub struct RwLockUpgradeableGuard<'a, T: 'a + ?Sized> { - lock: &'a AtomicUsize, - data: NonNull, - #[doc(hidden)] - _invariant: PhantomData<&'a mut T>, -} - -// Same unsafe impls as `std::sync::RwLock` -unsafe impl Send for RwLock {} -unsafe impl Sync for RwLock {} - -impl RwLock { - /// Creates a new spinlock wrapping the supplied data. - /// - /// May be used statically: - /// - /// ``` - /// use spin; - /// - /// static RW_LOCK: spin::RwLock<()> = spin::RwLock::new(()); - /// - /// fn demo() { - /// let lock = RW_LOCK.read(); - /// // do something with lock - /// drop(lock); - /// } - /// ``` - #[inline] - pub const fn new(user_data: T) -> RwLock { - RwLock { - lock: AtomicUsize::new(0), - data: UnsafeCell::new(user_data), - } - } - - /// Consumes this `RwLock`, returning the underlying data. - #[inline] - pub fn into_inner(self) -> T { - // We know statically that there are no outstanding references to - // `self` so there's no need to lock. - let RwLock { data, .. } = self; - data.into_inner() - } -} - -impl RwLock { - /// Locks this rwlock with shared read access, blocking the current thread - /// until it can be acquired. - /// - /// The calling thread will be blocked until there are no more writers which - /// hold the lock. There may be other readers currently inside the lock when - /// this method returns. This method does not provide any guarantees with - /// respect to the ordering of whether contentious readers or writers will - /// acquire the lock first. - /// - /// Returns an RAII guard which will release this thread's shared access - /// once it is dropped. - /// - /// ``` - /// let mylock = spin::RwLock::new(0); - /// { - /// let mut data = mylock.read(); - /// // The lock is now locked and the data can be read - /// println!("{}", *data); - /// // The lock is dropped - /// } - /// ``` - #[inline] - pub fn read(&self) -> RwLockReadGuard { - loop { - match self.try_read() { - Some(guard) => return guard, - None => cpu_relax(), - } - } - } - - /// Attempt to acquire this lock with shared read access. - /// - /// This function will never block and will return immediately if `read` - /// would otherwise succeed. Returns `Some` of an RAII guard which will - /// release the shared access of this thread when dropped, or `None` if the - /// access could not be granted. This method does not provide any - /// guarantees with respect to the ordering of whether contentious readers - /// or writers will acquire the lock first. - /// - /// ``` - /// let mylock = spin::RwLock::new(0); - /// { - /// match mylock.try_read() { - /// Some(data) => { - /// // The lock is now locked and the data can be read - /// println!("{}", *data); - /// // The lock is dropped - /// }, - /// None => (), // no cigar - /// }; - /// } - /// ``` - #[inline] - pub fn try_read(&self) -> Option> { - let value = self.lock.fetch_add(READER, Ordering::Acquire); - - // We check the UPGRADED bit here so that new readers are prevented when an UPGRADED lock is held. - // This helps reduce writer starvation. - if value & (WRITER | UPGRADED) != 0 { - // Lock is taken, undo. - self.lock.fetch_sub(READER, Ordering::Release); - None - } else { - Some(RwLockReadGuard { - lock: &self.lock, - data: unsafe { NonNull::new_unchecked(self.data.get()) }, - }) - } - } - - /// Force decrement the reader count. - /// - /// This is *extremely* unsafe if there are outstanding `RwLockReadGuard`s - /// live, or if called more times than `read` has been called, but can be - /// useful in FFI contexts where the caller doesn't know how to deal with - /// RAII. The underlying atomic operation uses `Ordering::Release`. - #[inline] - pub unsafe fn force_read_decrement(&self) { - debug_assert!(self.lock.load(Ordering::Relaxed) & !WRITER > 0); - self.lock.fetch_sub(READER, Ordering::Release); - } - - /// Force unlock exclusive write access. - /// - /// This is *extremely* unsafe if there are outstanding `RwLockWriteGuard`s - /// live, or if called when there are current readers, but can be useful in - /// FFI contexts where the caller doesn't know how to deal with RAII. The - /// underlying atomic operation uses `Ordering::Release`. - #[inline] - pub unsafe fn force_write_unlock(&self) { - debug_assert_eq!(self.lock.load(Ordering::Relaxed) & !(WRITER | UPGRADED), 0); - self.lock.fetch_and(!(WRITER | UPGRADED), Ordering::Release); - } - - #[inline(always)] - fn try_write_internal(&self, strong: bool) -> Option> { - if compare_exchange( - &self.lock, - 0, - WRITER, - Ordering::Acquire, - Ordering::Relaxed, - strong, - ) - .is_ok() - { - Some(RwLockWriteGuard { - lock: &self.lock, - data: unsafe { NonNull::new_unchecked(self.data.get()) }, - _invariant: PhantomData, - }) - } else { - None - } - } - - /// Lock this rwlock with exclusive write access, blocking the current - /// thread until it can be acquired. - /// - /// This function will not return while other writers or other readers - /// currently have access to the lock. - /// - /// Returns an RAII guard which will drop the write access of this rwlock - /// when dropped. - /// - /// ``` - /// let mylock = spin::RwLock::new(0); - /// { - /// let mut data = mylock.write(); - /// // The lock is now locked and the data can be written - /// *data += 1; - /// // The lock is dropped - /// } - /// ``` - #[inline] - pub fn write(&self) -> RwLockWriteGuard { - loop { - match self.try_write_internal(false) { - Some(guard) => return guard, - None => cpu_relax(), - } - } - } - - /// Attempt to lock this rwlock with exclusive write access. - /// - /// This function does not ever block, and it will return `None` if a call - /// to `write` would otherwise block. If successful, an RAII guard is - /// returned. - /// - /// ``` - /// let mylock = spin::RwLock::new(0); - /// { - /// match mylock.try_write() { - /// Some(mut data) => { - /// // The lock is now locked and the data can be written - /// *data += 1; - /// // The lock is implicitly dropped - /// }, - /// None => (), // no cigar - /// }; - /// } - /// ``` - #[inline] - pub fn try_write(&self) -> Option> { - self.try_write_internal(true) - } - - /// Obtain a readable lock guard that can later be upgraded to a writable lock guard. - /// Upgrades can be done through the [`RwLockUpgradeableGuard::upgrade`](RwLockUpgradeableGuard::upgrade) method. - #[inline] - pub fn upgradeable_read(&self) -> RwLockUpgradeableGuard { - loop { - match self.try_upgradeable_read() { - Some(guard) => return guard, - None => cpu_relax(), - } - } - } - - /// Tries to obtain an upgradeable lock guard. - #[inline] - pub fn try_upgradeable_read(&self) -> Option> { - if self.lock.fetch_or(UPGRADED, Ordering::Acquire) & (WRITER | UPGRADED) == 0 { - Some(RwLockUpgradeableGuard { - lock: &self.lock, - data: unsafe { NonNull::new_unchecked(self.data.get()) }, - _invariant: PhantomData, - }) - } else { - // We can't unflip the UPGRADED bit back just yet as there is another upgradeable or write lock. - // When they unlock, they will clear the bit. - None - } - } -} - -impl fmt::Debug for RwLock { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - match self.try_read() { - Some(guard) => write!(f, "RwLock {{ data: ") - .and_then(|()| (&*guard).fmt(f)) - .and_then(|()| write!(f, "}}")), - None => write!(f, "RwLock {{ }}"), - } - } -} - -impl Default for RwLock { - fn default() -> RwLock { - RwLock::new(Default::default()) - } -} - -impl<'rwlock, T: ?Sized> RwLockUpgradeableGuard<'rwlock, T> { - #[inline(always)] - fn try_upgrade_internal(self, strong: bool) -> Result, Self> { - if compare_exchange( - &self.lock, - UPGRADED, - WRITER, - Ordering::Acquire, - Ordering::Relaxed, - strong, - ) - .is_ok() - { - // Upgrade successful - let out = Ok(RwLockWriteGuard { - lock: &self.lock, - data: self.data, - _invariant: PhantomData, - }); - - // Forget the old guard so its destructor doesn't run - mem::forget(self); - - out - } else { - Err(self) - } - } - - /// Upgrades an upgradeable lock guard to a writable lock guard. - /// - /// ``` - /// let mylock = spin::RwLock::new(0); - /// - /// let upgradeable = mylock.upgradeable_read(); // Readable, but not yet writable - /// let writable = upgradeable.upgrade(); - /// ``` - #[inline] - pub fn upgrade(mut self) -> RwLockWriteGuard<'rwlock, T> { - loop { - self = match self.try_upgrade_internal(false) { - Ok(guard) => return guard, - Err(e) => e, - }; - - cpu_relax(); - } - } - - /// Tries to upgrade an upgradeable lock guard to a writable lock guard. - /// - /// ``` - /// let mylock = spin::RwLock::new(0); - /// let upgradeable = mylock.upgradeable_read(); // Readable, but not yet writable - /// - /// match upgradeable.try_upgrade() { - /// Ok(writable) => /* upgrade successful - use writable lock guard */ (), - /// Err(upgradeable) => /* upgrade unsuccessful */ (), - /// }; - /// ``` - #[inline] - pub fn try_upgrade(self) -> Result, Self> { - self.try_upgrade_internal(true) - } - - #[inline] - /// Downgrades the upgradeable lock guard to a readable, shared lock guard. Cannot fail and is guaranteed not to spin. - /// - /// ``` - /// let mylock = spin::RwLock::new(1); - /// - /// let upgradeable = mylock.upgradeable_read(); - /// assert!(mylock.try_read().is_none()); - /// assert_eq!(*upgradeable, 1); - /// - /// let readable = upgradeable.downgrade(); // This is guaranteed not to spin - /// assert!(mylock.try_read().is_some()); - /// assert_eq!(*readable, 1); - /// ``` - pub fn downgrade(self) -> RwLockReadGuard<'rwlock, T> { - // Reserve the read guard for ourselves - self.lock.fetch_add(READER, Ordering::Acquire); - - RwLockReadGuard { - lock: &self.lock, - data: self.data, - } - - // Dropping self removes the UPGRADED bit - } -} - -impl<'rwlock, T: ?Sized> RwLockWriteGuard<'rwlock, T> { - /// Downgrades the writable lock guard to a readable, shared lock guard. Cannot fail and is guaranteed not to spin. - /// - /// ``` - /// let mylock = spin::RwLock::new(0); - /// - /// let mut writable = mylock.write(); - /// *writable = 1; - /// - /// let readable = writable.downgrade(); // This is guaranteed not to spin - /// # let readable_2 = mylock.try_read().unwrap(); - /// assert_eq!(*readable, 1); - /// ``` - #[inline] - pub fn downgrade(self) -> RwLockReadGuard<'rwlock, T> { - // Reserve the read guard for ourselves - self.lock.fetch_add(READER, Ordering::Acquire); - - RwLockReadGuard { - lock: &self.lock, - data: self.data, - } - - // Dropping self removes the WRITER bit - } -} - -impl<'rwlock, T: ?Sized> Deref for RwLockReadGuard<'rwlock, T> { - type Target = T; - - fn deref(&self) -> &T { - unsafe { self.data.as_ref() } - } -} - -impl<'rwlock, T: ?Sized> Deref for RwLockUpgradeableGuard<'rwlock, T> { - type Target = T; - - fn deref(&self) -> &T { - unsafe { self.data.as_ref() } - } -} - -impl<'rwlock, T: ?Sized> Deref for RwLockWriteGuard<'rwlock, T> { - type Target = T; - - fn deref(&self) -> &T { - unsafe { self.data.as_ref() } - } -} - -impl<'rwlock, T: ?Sized> DerefMut for RwLockWriteGuard<'rwlock, T> { - fn deref_mut(&mut self) -> &mut T { - unsafe { self.data.as_mut() } - } -} - -impl<'rwlock, T: ?Sized> Drop for RwLockReadGuard<'rwlock, T> { - fn drop(&mut self) { - debug_assert!(self.lock.load(Ordering::Relaxed) & !(WRITER | UPGRADED) > 0); - self.lock.fetch_sub(READER, Ordering::Release); - } -} - -impl<'rwlock, T: ?Sized> Drop for RwLockUpgradeableGuard<'rwlock, T> { - fn drop(&mut self) { - debug_assert_eq!( - self.lock.load(Ordering::Relaxed) & (WRITER | UPGRADED), - UPGRADED - ); - self.lock.fetch_sub(UPGRADED, Ordering::AcqRel); - } -} - -impl<'rwlock, T: ?Sized> Drop for RwLockWriteGuard<'rwlock, T> { - fn drop(&mut self) { - debug_assert_eq!(self.lock.load(Ordering::Relaxed) & WRITER, WRITER); - - // Writer is responsible for clearing both WRITER and UPGRADED bits. - // The UPGRADED bit may be set if an upgradeable lock attempts an upgrade while this lock is held. - self.lock.fetch_and(!(WRITER | UPGRADED), Ordering::Release); - } -} - -#[inline(always)] -fn compare_exchange( - atomic: &AtomicUsize, - current: usize, - new: usize, - success: Ordering, - failure: Ordering, - strong: bool, -) -> Result { - if strong { - atomic.compare_exchange(current, new, success, failure) - } else { - atomic.compare_exchange_weak(current, new, success, failure) - } -} - -#[cfg(test)] -mod tests { - use std::prelude::v1::*; - - use std::sync::atomic::{AtomicUsize, Ordering}; - use std::sync::mpsc::channel; - use std::sync::Arc; - use std::thread; - - use super::*; - - #[derive(Eq, PartialEq, Debug)] - struct NonCopy(i32); - - #[test] - fn smoke() { - let l = RwLock::new(()); - drop(l.read()); - drop(l.write()); - drop((l.read(), l.read())); - drop(l.write()); - } - - // TODO: needs RNG - //#[test] - //fn frob() { - // static R: RwLock = RwLock::new(); - // const N: usize = 10; - // const M: usize = 1000; - // - // let (tx, rx) = channel::<()>(); - // for _ in 0..N { - // let tx = tx.clone(); - // thread::spawn(move|| { - // let mut rng = rand::thread_rng(); - // for _ in 0..M { - // if rng.gen_weighted_bool(N) { - // drop(R.write()); - // } else { - // drop(R.read()); - // } - // } - // drop(tx); - // }); - // } - // drop(tx); - // let _ = rx.recv(); - // unsafe { R.destroy(); } - //} - - #[test] - fn test_rw_arc() { - let arc = Arc::new(RwLock::new(0)); - let arc2 = arc.clone(); - let (tx, rx) = channel(); - - thread::spawn(move || { - let mut lock = arc2.write(); - for _ in 0..10 { - let tmp = *lock; - *lock = -1; - thread::yield_now(); - *lock = tmp + 1; - } - tx.send(()).unwrap(); - }); - - // Readers try to catch the writer in the act - let mut children = Vec::new(); - for _ in 0..5 { - let arc3 = arc.clone(); - children.push(thread::spawn(move || { - let lock = arc3.read(); - assert!(*lock >= 0); - })); - } - - // Wait for children to pass their asserts - for r in children { - assert!(r.join().is_ok()); - } - - // Wait for writer to finish - rx.recv().unwrap(); - let lock = arc.read(); - assert_eq!(*lock, 10); - } - - #[test] - fn test_rw_access_in_unwind() { - let arc = Arc::new(RwLock::new(1)); - let arc2 = arc.clone(); - let _ = thread::spawn(move || -> () { - struct Unwinder { - i: Arc>, - } - impl Drop for Unwinder { - fn drop(&mut self) { - let mut lock = self.i.write(); - *lock += 1; - } - } - let _u = Unwinder { i: arc2 }; - panic!(); - }) - .join(); - let lock = arc.read(); - assert_eq!(*lock, 2); - } - - #[test] - fn test_rwlock_unsized() { - let rw: &RwLock<[i32]> = &RwLock::new([1, 2, 3]); - { - let b = &mut *rw.write(); - b[0] = 4; - b[2] = 5; - } - let comp: &[i32] = &[4, 2, 5]; - assert_eq!(&*rw.read(), comp); - } - - #[test] - fn test_rwlock_try_write() { - use std::mem::drop; - - let lock = RwLock::new(0isize); - let read_guard = lock.read(); - - let write_result = lock.try_write(); - match write_result { - None => (), - Some(_) => assert!( - false, - "try_write should not succeed while read_guard is in scope" - ), - } - - drop(read_guard); - } - - #[test] - fn test_rw_try_read() { - let m = RwLock::new(0); - mem::forget(m.write()); - assert!(m.try_read().is_none()); - } - - #[test] - fn test_into_inner() { - let m = RwLock::new(NonCopy(10)); - assert_eq!(m.into_inner(), NonCopy(10)); - } - - #[test] - fn test_into_inner_drop() { - struct Foo(Arc); - impl Drop for Foo { - fn drop(&mut self) { - self.0.fetch_add(1, Ordering::SeqCst); - } - } - let num_drops = Arc::new(AtomicUsize::new(0)); - let m = RwLock::new(Foo(num_drops.clone())); - assert_eq!(num_drops.load(Ordering::SeqCst), 0); - { - let _inner = m.into_inner(); - assert_eq!(num_drops.load(Ordering::SeqCst), 0); - } - assert_eq!(num_drops.load(Ordering::SeqCst), 1); - } - - #[test] - fn test_force_read_decrement() { - let m = RwLock::new(()); - ::std::mem::forget(m.read()); - ::std::mem::forget(m.read()); - ::std::mem::forget(m.read()); - assert!(m.try_write().is_none()); - unsafe { - m.force_read_decrement(); - m.force_read_decrement(); - } - assert!(m.try_write().is_none()); - unsafe { - m.force_read_decrement(); - } - assert!(m.try_write().is_some()); - } - - #[test] - fn test_force_write_unlock() { - let m = RwLock::new(()); - ::std::mem::forget(m.write()); - assert!(m.try_read().is_none()); - unsafe { - m.force_write_unlock(); - } - assert!(m.try_read().is_some()); - } - - #[test] - fn test_upgrade_downgrade() { - let m = RwLock::new(()); - { - let _r = m.read(); - let upg = m.try_upgradeable_read().unwrap(); - assert!(m.try_read().is_none()); - assert!(m.try_write().is_none()); - assert!(upg.try_upgrade().is_err()); - } - { - let w = m.write(); - assert!(m.try_upgradeable_read().is_none()); - let _r = w.downgrade(); - assert!(m.try_upgradeable_read().is_some()); - assert!(m.try_read().is_some()); - assert!(m.try_write().is_none()); - } - { - let _u = m.upgradeable_read(); - assert!(m.try_upgradeable_read().is_none()); - } - - assert!(m.try_upgradeable_read().unwrap().try_upgrade().is_ok()); - } -} diff -Nru temporalio-1.3.0/vendor/static_assertions/.cargo-checksum.json temporalio-1.3.0/vendor/static_assertions/.cargo-checksum.json --- temporalio-1.3.0/vendor/static_assertions/.cargo-checksum.json 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/static_assertions/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1 @@ +{"files":{"CHANGELOG.md":"750f74f3b520672a81dd2ede5c097cfe972c0da181dd8fd010e7131a3526d4fd","Cargo.toml":"6531dbe3d557e427f9e3510e50cdf3de751a319eece11c9a937b35cfab8744c4","LICENSE-APACHE":"cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30","LICENSE-MIT":"ea084a2373ebc1f0902c09266e7bf25a05ab3814c1805bb017ffa7308f90c061","README.md":"88cc779ada8c6e1362c2d095c179284ec2755797729946ebccfe8264fcff0f8e","src/assert_cfg.rs":"ce9230bcc055d8df21ceefbed4233df5e73ecb832829ba23ac8d7f54ec457522","src/assert_eq_align.rs":"f09c4ec30e476446ab337a4a9ed950edf21c780a42ece7613f0ffc20225331ae","src/assert_eq_size.rs":"c06d2ff44e1f7af8a57b7c2fe5a9c69aa2a90d12cd41614c9d4f3ae551cdb64c","src/assert_fields.rs":"9c5baeac0215be557213eec9e80fc00de10a721d9b2c369fece743fcc6ccdc8e","src/assert_impl.rs":"fe5a2fffcbb78f60991bbc590481e74fd0d5f7ed8fa75718644599e1fae117ce","src/assert_obj_safe.rs":"88584809f3aa2dfce966b0adbeb6128191229465d653e57b68f968be001eff03","src/assert_trait.rs":"87b2d4dbd4334d9ace9880b81f3a1fbf91725c5e152b34a74c86457ca40ece30","src/assert_type.rs":"7cd942341efa7ed0b89b5e4fe1faa62bafb537ec6cf72ee6866115daee931885","src/const_assert.rs":"e0dcfe9016e34455f5efcb23500f716386d42b9fb09c6d08566d03dce8249e51","src/lib.rs":"4cbaaff38a6ac16631e774ab5a349056cbd2335ac570aeb46c5616eaf9700c3b"},"package":"a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/static_assertions/Cargo.toml temporalio-1.3.0/vendor/static_assertions/Cargo.toml --- temporalio-1.3.0/vendor/static_assertions/Cargo.toml 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/static_assertions/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,39 @@ +# 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 believe there's an error in this file please file an +# issue against the rust-lang/cargo repository. If you're +# editing this file be aware that the upstream Cargo.toml +# will likely look very different (and much more reasonable) + +[package] +name = "static_assertions" +version = "1.1.0" +authors = ["Nikolai Vazquez"] +include = ["Cargo.toml", "src/**/*.rs", "README.md", "CHANGELOG.md", "LICENSE*"] +description = "Compile-time assertions to ensure that invariants are met." +homepage = "https://github.com/nvzqz/static-assertions-rs" +documentation = "https://docs.rs/static_assertions/" +readme = "README.md" +keywords = ["assert", "static", "testing"] +categories = ["no-std", "rust-patterns", "development-tools::testing"] +license = "MIT OR Apache-2.0" +repository = "https://github.com/nvzqz/static-assertions-rs" + +[features] +nightly = [] +[badges.is-it-maintained-issue-resolution] +repository = "nvzqz/static-assertions-rs" + +[badges.is-it-maintained-open-issues] +repository = "nvzqz/static-assertions-rs" + +[badges.maintenance] +status = "passively-maintained" + +[badges.travis-ci] +repository = "nvzqz/static-assertions-rs" diff -Nru temporalio-1.3.0/vendor/static_assertions/CHANGELOG.md temporalio-1.3.0/vendor/static_assertions/CHANGELOG.md --- temporalio-1.3.0/vendor/static_assertions/CHANGELOG.md 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/static_assertions/CHANGELOG.md 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,181 @@ +# Changelog [![Crates.io][crate-badge]][crate] +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog] and this project adheres to +[Semantic Versioning]. + +## [Unreleased] + +## [1.1.0] - 2019-11-03 +### Added +- `assert_impl_any!` macro +- `assert_impl_one!` macro +- `assert_trait_sub_all!` macro +- `assert_trait_super_all!` macro +- Frequently asked questions to `README.md` + +### Fixed +- `assert_eq_size_val!`, `const_assert_eq!`, and `const_assert_ne!` to export + their local inner macros. Not having this prevented them from working when + `use`d or called directly via `static_assertions::macro!(...)` + +### Removed +- Unused `_assert_obj_safe!` from pre-1.0 + +## [1.0.0] - 2019-10-02 +### Added +- `assert_eq_align!` macro + +### Removed +- **[breaking]** Labels from macros that needed them 🎉 + - Made possible by [`const _`] in Rust 1.37 +- **[breaking]** `assert_impl!` macro + +### Fixed +- `assert_fields!` now works for `enum` types with multiple variants + +### Changed +- **[breaking]** `const_assert!` macro to only take one expression + - Reasoning: when custom error messages are added in the future (via + [`assert!`]), having the macro allow for multiple comma-separated + expressions may lead to ambiguity +- **[breaking]** Trait assertions to use `Type: Trait` syntax +- **[breaking]** Field assertions to use `Type: field1, field2` syntax +- **[breaking]** Renamed `assert_{ne,eq}_type!` to `assert_type_{ne,eq}_all!` + +## [0.3.4] - 2019-06-12 +### Changed +- Aliased `assert_impl!` to `assert_impl_all!` and deprecated `assert_impl!` + +### Added +- `assert_impl_all!` as replacement to `assert_impl!` +- `assert_not_impl_all!` and `assert_not_impl_any!` macro counterparts to + `assert_impl_all!` + +### Fixed +- `assert_eq_type!` now works with types involving lifetimes + +## [0.3.3] - 2019-06-12 +### Added +- `const_assert_ne!` macro counterpart to `const_assert_eq!` + +### Fixed +- `assert_eq_type!` would pass when types can coerce via `Deref`, such as with + `str` and `String` + +## [0.3.2] - 2019-05-15 +### Added +- A `assert_eq_type!` macro that allows for checking whether inputs are the same + concrete type +- A `assert_ne_type!` macro for checking whether inputs all refer to different + types + +### Fixed +- `const_assert!` now only takes `bool` values whereas integer (or other type) + values could previously be passed + +## [0.3.1] - 2018-11-15 +### Fixed +- Macros that refer to other internal macros can now be imported when compiling + for Rust 2018 ([issue + #10](https://github.com/nvzqz/static-assertions-rs/issues/10)) + +## [0.3.0] - 2018-11-14 +### Changed +- Bumped minimum supported (automatically tested) Rust version to 1.24.0 +- Moved message parameter for `assert_cfg!()` to last argument position, making + it consistent with other macros + +### Removed +- No need to use `macro!(label; ...)` syntax when compiling on nightly Rust and + enabling the `nightly` feature flag + +## [0.2.5] - 2017-12-12 +### Changed +- `assert_eq_size_ptr` wraps its code inside of a closure, ensuring that the + unsafe code inside never runs +- Clippy no longer warns about `unneeded_field_pattern` within `assert_fields` + +### Added +- Much better documentation with test examples that are guaranteed to fail at + compile-time + +### Removed +- Removed testing features; compile failure tests are now done via doc tests + +## [0.2.4] - 2017-12-11 +### Removed +- Removed the actual call to `mem::transmute` while still utilizing it for size + verification ([Simon Sapin], [#5]) + +### Added +- `assert_cfg` macro that asserts that the given configuration is set +- `assert_fields` macro to assert that a struct type or enum variant has a given + field + +### Fixed +- Allow more generics flexibility in `assert_impl` + +## [0.2.3] - 2017-08-24 +### Fixed +- Trailing commas are now allowed + +### Removed +- Removed clippy warnings + +## [0.2.2] - 2017-08-13 +### Added +- Added `assert_impl` macro to ensure a type implements a given set of traits + +## [0.2.1] - 2017-08-13 +### Added +- Added `assert_obj_safe` macro for ensuring that a trait is object-safe + +## [0.2.0] - 2017-08-12 +### Added +- Added `assert_eq_size_ptr` macro + +### Fixed +- Allow `assert_eq_size`, `const_assert`, and `const_assert_eq` in non-function + contexts via providing a unique label [#1] + +### Removed +- **[Breaking]** Semicolon-separated `assert_eq_size` is no longer allowed + +## [0.1.1] - 2017-08-12 +### Added +- Added `const_assert_eq` macro + +## 0.1.0 - 2017-08-12 + +Initial release + +[Simon Sapin]: https://github.com/SimonSapin + +[`assert!`]: https://doc.rust-lang.org/stable/std/macro.assert.html +[`const _`]: https://github.com/rust-lang/rfcs/blob/master/text/2526-const-wildcard.md + +[#1]: https://github.com/nvzqz/static-assertions-rs/issues/1 +[#5]: https://github.com/nvzqz/static-assertions-rs/pull/5 + +[crate]: https://crates.io/crates/static_assertions +[crate-badge]: https://img.shields.io/crates/v/static_assertions.svg + +[Keep a Changelog]: http://keepachangelog.com/en/1.0.0/ +[Semantic Versioning]: http://semver.org/spec/v2.0.0.html + +[Unreleased]: https://github.com/nvzqz/static-assertions-rs/compare/v1.1.0...HEAD +[1.1.0]: https://github.com/nvzqz/static-assertions-rs/compare/v1.0.0...v1.1.0 +[1.0.0]: https://github.com/nvzqz/static-assertions-rs/compare/v0.3.4...v1.0.0 +[0.3.4]: https://github.com/nvzqz/static-assertions-rs/compare/v0.3.3...v0.3.4 +[0.3.3]: https://github.com/nvzqz/static-assertions-rs/compare/v0.3.2...v0.3.3 +[0.3.2]: https://github.com/nvzqz/static-assertions-rs/compare/v0.3.1...v0.3.2 +[0.3.1]: https://github.com/nvzqz/static-assertions-rs/compare/v0.3.0...v0.3.1 +[0.3.0]: https://github.com/nvzqz/static-assertions-rs/compare/v0.2.5...v0.3.0 +[0.2.5]: https://github.com/nvzqz/static-assertions-rs/compare/v0.2.4...v0.2.5 +[0.2.4]: https://github.com/nvzqz/static-assertions-rs/compare/v0.2.3...v0.2.4 +[0.2.3]: https://github.com/nvzqz/static-assertions-rs/compare/v0.2.2...v0.2.3 +[0.2.2]: https://github.com/nvzqz/static-assertions-rs/compare/v0.2.1...v0.2.2 +[0.2.1]: https://github.com/nvzqz/static-assertions-rs/compare/v0.2.0...v0.2.1 +[0.2.0]: https://github.com/nvzqz/static-assertions-rs/compare/v0.1.1...v0.2.0 +[0.1.1]: https://github.com/nvzqz/static-assertions-rs/compare/v0.1.0...v0.1.1 diff -Nru temporalio-1.3.0/vendor/static_assertions/LICENSE-APACHE temporalio-1.3.0/vendor/static_assertions/LICENSE-APACHE --- temporalio-1.3.0/vendor/static_assertions/LICENSE-APACHE 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/static_assertions/LICENSE-APACHE 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff -Nru temporalio-1.3.0/vendor/static_assertions/LICENSE-MIT temporalio-1.3.0/vendor/static_assertions/LICENSE-MIT --- temporalio-1.3.0/vendor/static_assertions/LICENSE-MIT 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/static_assertions/LICENSE-MIT 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017 Nikolai Vazquez + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff -Nru temporalio-1.3.0/vendor/static_assertions/README.md temporalio-1.3.0/vendor/static_assertions/README.md --- temporalio-1.3.0/vendor/static_assertions/README.md 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/static_assertions/README.md 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,188 @@ +[![Banner](https://raw.githubusercontent.com/nvzqz/static-assertions-rs/assets/Banner.png)](https://github.com/nvzqz/static-assertions-rs) + +

+ +Compile-time assertions for Rust, brought to you by +[Nikolai Vazquez](https://twitter.com/NikolaiVazquez). + +This library lets you ensure correct assumptions about constants, types, and +more. See the [docs] and [FAQ](#faq) for more info! + +## Installation + +This crate is available +[on crates.io](https://crates.io/crates/static_assertions) and can be used by +adding the following to your project's +[`Cargo.toml`](https://doc.rust-lang.org/cargo/reference/manifest.html): + +```toml +[dependencies] +static_assertions = "1.1.0" +``` + +and this to your crate root (`main.rs` or `lib.rs`): + +```rust +#[macro_use] +extern crate static_assertions; +``` + +## Usage + +This crate exposes the following macros: +- [`assert_cfg!`] +- [`assert_eq_align!`] +- [`assert_eq_size!`] +- [`assert_eq_size_ptr!`] +- [`assert_eq_size_val!`] +- [`assert_fields!`] +- [`assert_impl_all!`] +- [`assert_impl_any!`] +- [`assert_impl_one!`] +- [`assert_not_impl_all!`] +- [`assert_not_impl_any!`] +- [`assert_obj_safe!`] +- [`assert_trait_sub_all!`] +- [`assert_trait_super_all!`] +- [`assert_type_eq_all!`] +- [`assert_type_ne_all!`] +- [`const_assert!`] +- [`const_assert_eq!`] +- [`const_assert_ne!`] + +## FAQ + +- **Q:** When would I want to use this? + + **A:** This library is useful for when wanting to ensure properties of + constants, types, and traits. + + Basic examples: + + - With the release of 1.39, `str::len` can be called in a `const` + context. Using [`const_assert!`], one can check that a string generated from + elsewhere is of a given size: + + ```rust + const DATA: &str = include_str!("path/to/string.txt"); + + const_assert!(DATA.len() < 512); + ``` + + - Have a type that absolutely must implement certain traits? With + [`assert_impl_all!`], one can ensure this: + + ```rust + struct Foo { + value: // ... + } + + assert_impl_all!(Foo: Send, Sync); + ``` + +- **Q:** How can I contribute? + + **A:** A couple of ways! You can: + + - Attempt coming up with some form of static analysis that you'd like to see + implemented. Create a [new issue] and describe how you'd imagine your + assertion to work, with example code to demonstrate. + + - Implement your own static assertion and create a [pull request]. + + - Give feedback. What are some pain points? Where is it unpleasant? + + - Write docs. If you're familiar with how this library works, sharing your + knowledge with the rest its users would be great! + +- **Q:** Will this affect my compiled binary? + + **A:** Nope! There is zero runtime cost to using this because all checks are + at compile-time, and so no code is emitted to run. + +- **Q:** Will this affect my compile times? + + **A:** Likely not by anything perceivable. If this is a concern, this library + can be put in `dev-dependencies`: + + ```toml + [dev-dependencies] + static_assertions = "1.1.0" + ``` + + and then assertions can be conditionally run behind `#[cfg(test)]`: + + ```rust + #[cfg(test)] + const_assert_eq!(MEANING_OF_LIFE, 42); + ``` + + However, the assertions will only be checked when running `cargo test`. This + somewhat defeats the purpose of catching false static conditions up-front with + a compilation failure. + +- **Q:** What is `const _`? + + **A:** It's a way of creating an unnamed constant. This is used so that macros + can be called from a global scope without requiring a scope-unique label. This + library makes use of the side effects of evaluating the `const` expression. + See the feature's + [tracking issue](https://github.com/rust-lang/rust/issues/54912) + and + [issue #1](https://github.com/nvzqz/static-assertions-rs/issues/1) + for more info. + +## Changes + +See [`CHANGELOG.md`](https://github.com/nvzqz/static-assertions-rs/blob/master/CHANGELOG.md) +for a complete list of what has changed from one version to another. + +## License + +This project is released under either: + +- [MIT License](https://github.com/nvzqz/static-assertions-rs/blob/master/LICENSE-MIT) + +- [Apache License (Version 2.0)](https://github.com/nvzqz/static-assertions-rs/blob/master/LICENSE-APACHE) + +at your choosing. + +[new issue]: https://github.com/nvzqz/static-assertions-rs/issues/new +[pull request]: https://github.com/nvzqz/static-assertions-rs/pulls +[docs]: https://docs.rs/static_assertions + +[`assert_cfg!`]: https://docs.rs/static_assertions/1.1.0/static_assertions/macro.assert_cfg.html +[`assert_eq_align!`]: https://docs.rs/static_assertions/1.1.0/static_assertions/macro.assert_eq_align.html +[`assert_eq_size!`]: https://docs.rs/static_assertions/1.1.0/static_assertions/macro.assert_eq_size.html +[`assert_eq_size_ptr!`]: https://docs.rs/static_assertions/1.1.0/static_assertions/macro.assert_eq_size_ptr.html +[`assert_eq_size_val!`]: https://docs.rs/static_assertions/1.1.0/static_assertions/macro.assert_eq_size_val.html +[`assert_fields!`]: https://docs.rs/static_assertions/1.1.0/static_assertions/macro.assert_fields.html +[`assert_impl_all!`]: https://docs.rs/static_assertions/1.1.0/static_assertions/macro.assert_impl_all.html +[`assert_impl_any!`]: https://docs.rs/static_assertions/1.1.0/static_assertions/macro.assert_impl_any.html +[`assert_impl_one!`]: https://docs.rs/static_assertions/1.1.0/static_assertions/macro.assert_impl_one.html +[`assert_not_impl_all!`]: https://docs.rs/static_assertions/1.1.0/static_assertions/macro.assert_not_impl_all.html +[`assert_not_impl_any!`]: https://docs.rs/static_assertions/1.1.0/static_assertions/macro.assert_not_impl_any.html +[`assert_obj_safe!`]: https://docs.rs/static_assertions/1.1.0/static_assertions/macro.assert_obj_safe.html +[`assert_trait_sub_all!`]: https://docs.rs/static_assertions/1.1.0/static_assertions/macro.assert_trait_sub_all.html +[`assert_trait_super_all!`]: https://docs.rs/static_assertions/1.1.0/static_assertions/macro.assert_trait_super_all.html +[`assert_type_eq_all!`]: https://docs.rs/static_assertions/1.1.0/static_assertions/macro.assert_type_eq_all.html +[`assert_type_ne_all!`]: https://docs.rs/static_assertions/1.1.0/static_assertions/macro.assert_type_ne_all.html +[`const_assert!`]: https://docs.rs/static_assertions/1.1.0/static_assertions/macro.const_assert.html +[`const_assert_eq!`]: https://docs.rs/static_assertions/1.1.0/static_assertions/macro.const_assert_eq.html +[`const_assert_ne!`]: https://docs.rs/static_assertions/1.1.0/static_assertions/macro.const_assert_ne.html diff -Nru temporalio-1.3.0/vendor/static_assertions/src/assert_cfg.rs temporalio-1.3.0/vendor/static_assertions/src/assert_cfg.rs --- temporalio-1.3.0/vendor/static_assertions/src/assert_cfg.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/static_assertions/src/assert_cfg.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,49 @@ +/// Asserts that a given configuration is set. +/// +/// # Examples +/// +/// A project will simply fail to compile if the given configuration is not set. +/// +/// ``` +/// # #[macro_use] extern crate static_assertions; fn main() {} +/// // We're not masochists +/// # #[cfg(not(target_pointer_width = "16"))] // Just in case +/// assert_cfg!(not(target_pointer_width = "16")); +/// ``` +/// +/// If a project does not support a set of configurations, you may want to +/// report why. There is the option of providing a compile error message string: +/// +/// ``` +/// # #[macro_use] extern crate static_assertions; fn main() {} +/// # #[cfg(any(unix, windows))] +/// assert_cfg!(any(unix, windows), "There is only support for Unix or Windows"); +/// +/// // User needs to specify a database back-end +/// # #[cfg(target_pointer_width = "0")] // Impossible +/// assert_cfg!(all(not(all(feature = "mysql", feature = "mongodb")), +/// any( feature = "mysql", feature = "mongodb")), +/// "Must exclusively use MySQL or MongoDB as database back-end"); +/// ``` +/// +/// Some configurations are impossible. For example, we can't be compiling for +/// both macOS _and_ Windows simultaneously: +/// +/// ```compile_fail +/// # #[macro_use] extern crate static_assertions; fn main() {} +/// assert_cfg!(all(target_os = "macos", +/// target_os = "windows"), +/// "No, that's not how it works! ಠ_ಠ"); +/// ``` +#[macro_export] +macro_rules! assert_cfg { + () => {}; + ($($cfg:meta)+, $msg:expr $(,)?) => { + #[cfg(not($($cfg)+))] + compile_error!($msg); + }; + ($($cfg:tt)*) => { + #[cfg(not($($cfg)*))] + compile_error!(concat!("Cfg does not pass: ", stringify!($($cfg)*))); + }; +} diff -Nru temporalio-1.3.0/vendor/static_assertions/src/assert_eq_align.rs temporalio-1.3.0/vendor/static_assertions/src/assert_eq_align.rs --- temporalio-1.3.0/vendor/static_assertions/src/assert_eq_align.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/static_assertions/src/assert_eq_align.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,45 @@ +/// Asserts that types are equal in alignment. +/// +/// This is useful when ensuring that pointer arithmetic is done correctly, or +/// when [FFI] requires a type to have the same alignment as some foreign type. +/// +/// # Examples +/// +/// A `usize` has the same alignment as any pointer type: +/// +/// ``` +/// # #[macro_use] extern crate static_assertions; fn main() {} +/// assert_eq_align!(usize, *const u8, *mut u8); +/// ``` +/// +/// The following passes because `[i32; 4]` has the same alignment as `i32`: +/// +/// ``` +/// # #[macro_use] extern crate static_assertions; fn main() {} +/// assert_eq_align!([i32; 4], i32); +/// ``` +/// +/// The following example fails to compile because `i32x4` explicitly has 4 +/// times the alignment as `[i32; 4]`: +/// +/// ```compile_fail +/// # #[macro_use] extern crate static_assertions; fn main() {} +/// # #[allow(non_camel_case_types)] +/// #[repr(align(16))] +/// struct i32x4([i32; 4]); +/// +/// assert_eq_align!(i32x4, [i32; 4]); +/// ``` +/// +/// [FFI]: https://en.wikipedia.org/wiki/Foreign_function_interface +#[macro_export] +macro_rules! assert_eq_align { + ($x:ty, $($xs:ty),+ $(,)?) => { + const _: fn() = || { + // Assigned instance must match the annotated type or else it will + // fail to compile + use $crate::_core::mem::align_of; + $(let _: [(); align_of::<$x>()] = [(); align_of::<$xs>()];)+ + }; + }; +} diff -Nru temporalio-1.3.0/vendor/static_assertions/src/assert_eq_size.rs temporalio-1.3.0/vendor/static_assertions/src/assert_eq_size.rs --- temporalio-1.3.0/vendor/static_assertions/src/assert_eq_size.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/static_assertions/src/assert_eq_size.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,123 @@ +/// Asserts that types are equal in size. +/// +/// When performing operations such as pointer casts or dealing with [`usize`] +/// versus [`u64`] versus [`u32`], the size of your types matter. That is where +/// this macro comes into play. +/// +/// # Alternatives +/// +/// There also exists [`assert_eq_size_val`](macro.assert_eq_size_val.html) and +/// [`assert_eq_size_ptr`](macro.assert_eq_size_ptr.html). Instead of specifying +/// types to compare, values' sizes can be directly compared against each other. +/// +/// # Examples +/// +/// These three types, despite being very different, all have the same size: +/// +/// ``` +/// # #[macro_use] extern crate static_assertions; fn main() {} +/// assert_eq_size!([u8; 4], (u16, u16), u32); +/// ``` +/// +/// The following example fails to compile because `u32` has 4 times the size of +/// `u8`: +/// +/// ```compile_fail +/// # #[macro_use] extern crate static_assertions; fn main() {} +/// assert_eq_size!(u32, u8); +/// ``` +/// +/// [`usize`]: https://doc.rust-lang.org/std/primitive.usize.html +/// [`u64`]: https://doc.rust-lang.org/std/primitive.u64.html +/// [`u32`]: https://doc.rust-lang.org/std/primitive.u32.html +#[macro_export] +macro_rules! assert_eq_size { + ($x:ty, $($xs:ty),+ $(,)?) => { + const _: fn() = || { + $(let _ = $crate::_core::mem::transmute::<$x, $xs>;)+ + }; + }; +} + +/// Asserts that values pointed to are equal in size. +/// +/// # Examples +/// +/// This especially is useful for when coercing pointers between different types +/// and ensuring the underlying values are the same size. +/// +/// ``` +/// # #[macro_use] extern crate static_assertions; fn main() {} +/// fn operation(x: &(u32, u32), y: &[u16; 4]) { +/// assert_eq_size_ptr!(x, y); +/// // ... +/// } +/// ``` +/// +/// The following example fails to compile because byte arrays of different +/// lengths have different sizes: +/// +/// ```compile_fail +/// # #[macro_use] extern crate static_assertions; +/// # fn main() { +/// static BYTES: &[u8; 4] = &[ +/// /* ... */ +/// # 0; 4 +/// ]; +/// +/// static TABLE: &[u8; 16] = &[ +/// /* ... */ +/// # 0; 16 +/// ]; +/// +/// assert_eq_size_ptr!(BYTES, TABLE); +/// ``` +#[macro_export] +macro_rules! assert_eq_size_ptr { + ($x:expr, $($xs:expr),+ $(,)?) => { + #[allow(unknown_lints, unsafe_code, forget_copy, useless_transmute)] + let _ = || unsafe { + use $crate::_core::{mem, ptr}; + let mut copy = ptr::read($x); + $(ptr::write(&mut copy, mem::transmute(ptr::read($xs)));)+ + mem::forget(copy); + }; + } +} + +/// Asserts that values are equal in size. +/// +/// This macro doesn't consume its arguments and thus works for +/// non-[`Clone`]able values. +/// +/// # Examples +/// +/// ``` +/// # #[macro_use] extern crate static_assertions; +/// # fn main() { +/// struct Byte(u8); +/// +/// let x = 10u8; +/// let y = Byte(42); // Works for non-cloneable types +/// +/// assert_eq_size_val!(x, y); +/// assert_eq_size_val!(x, y, 0u8); +/// # } +/// ``` +/// +/// Even though both values are 0, they are of types with different sizes: +/// +/// ```compile_fail +/// # #[macro_use] extern crate static_assertions; +/// # fn main() { +/// assert_eq_size_val!(0u8, 0u32); +/// # } +/// ``` +/// +/// [`Clone`]: https://doc.rust-lang.org/std/clone/trait.Clone.html +#[macro_export(local_inner_macros)] +macro_rules! assert_eq_size_val { + ($x:expr, $($xs:expr),+ $(,)?) => { + assert_eq_size_ptr!(&$x, $(&$xs),+); + } +} diff -Nru temporalio-1.3.0/vendor/static_assertions/src/assert_fields.rs temporalio-1.3.0/vendor/static_assertions/src/assert_fields.rs --- temporalio-1.3.0/vendor/static_assertions/src/assert_fields.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/static_assertions/src/assert_fields.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,72 @@ +/// Asserts that the type has the given fields. +/// +/// # Examples +/// +/// One common use case is when types have fields defined multiple times as a +/// result of `#[cfg]`. This can be an issue when exposing a public API. +/// +/// ``` +/// # #[macro_use] extern crate static_assertions; +/// pub struct Ty { +/// #[cfg(windows)] +/// pub val1: u8, +/// #[cfg(not(windows))] +/// pub val1: usize, +/// +/// #[cfg(unix)] +/// pub val2: u32, +/// #[cfg(not(unix))] +/// pub val2: usize, +/// } +/// +/// // Always have `val2` regardless of OS +/// assert_fields!(Ty: val2); +/// ``` +/// +/// This macro even works with `enum` variants: +/// +/// ``` +/// # #[macro_use] extern crate static_assertions; fn main() {} +/// enum Data { +/// Val { +/// id: i32, +/// name: String, +/// bytes: [u8; 128], +/// }, +/// Ptr(*const u8), +/// } +/// +/// assert_fields!(Data::Val: id, bytes); +/// ``` +/// +/// The following example fails to compile because [`Range`] does not have a field named `middle`: +/// +/// ```compile_fail +/// # #[macro_use] extern crate static_assertions; fn main() {} +/// use std::ops::Range; +/// +/// assert_fields!(Range: middle); +/// ``` +/// +/// [`Range`]: https://doc.rust-lang.org/std/ops/struct.Range.html +#[macro_export] +macro_rules! assert_fields { + ($t:ident::$v:ident: $($f:ident),+) => { + #[allow(unknown_lints, unneeded_field_pattern)] + const _: fn() = || { + #[allow(dead_code, unreachable_patterns)] + fn assert(value: $t) { + match value { + $($t::$v { $f: _, .. } => {},)+ + _ => {} + } + } + }; + }; + ($t:path: $($f:ident),+) => { + #[allow(unknown_lints, unneeded_field_pattern)] + const _: fn() = || { + $(let $t { $f: _, .. };)+ + }; + }; +} diff -Nru temporalio-1.3.0/vendor/static_assertions/src/assert_impl.rs temporalio-1.3.0/vendor/static_assertions/src/assert_impl.rs --- temporalio-1.3.0/vendor/static_assertions/src/assert_impl.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/static_assertions/src/assert_impl.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,356 @@ +/// Asserts that the type implements exactly one in a set of traits. +/// +/// Related: +/// - [`assert_impl_any!`] +/// - [`assert_impl_all!`] +/// - [`assert_not_impl_all!`] +/// - [`assert_not_impl_any!`] +/// +/// # Examples +/// +/// Given some type `Foo`, it is expected to implement either `Snap`, `Crackle`, +/// or `Pop`: +/// +/// ```compile_fail +/// # use static_assertions::assert_impl_one; fn main() {} +/// struct Foo; +/// +/// trait Snap {} +/// trait Crackle {} +/// trait Pop {} +/// +/// assert_impl_one!(Foo: Snap, Crackle, Pop); +/// ``` +/// +/// If _only_ `Crackle` is implemented, the assertion passes: +/// +/// ``` +/// # use static_assertions::assert_impl_one; fn main() {} +/// # struct Foo; +/// # trait Snap {} +/// # trait Crackle {} +/// # trait Pop {} +/// impl Crackle for Foo {} +/// +/// assert_impl_one!(Foo: Snap, Crackle, Pop); +/// ``` +/// +/// If `Snap` or `Pop` is _also_ implemented, the assertion fails: +/// +/// ```compile_fail +/// # use static_assertions::assert_impl_one; fn main() {} +/// # struct Foo; +/// # trait Snap {} +/// # trait Crackle {} +/// # trait Pop {} +/// # impl Crackle for Foo {} +/// impl Pop for Foo {} +/// +/// assert_impl_one!(Foo: Snap, Crackle, Pop); +/// ``` +/// +/// [`assert_impl_any!`]: macro.assert_impl_any.html +/// [`assert_impl_all!`]: macro.assert_impl_all.html +/// [`assert_not_impl_all!`]: macro.assert_not_impl_all.html +/// [`assert_not_impl_any!`]: macro.assert_not_impl_any.html +#[macro_export] +macro_rules! assert_impl_one { + ($x:ty: $($t:path),+ $(,)?) => { + const _: fn() = || { + // Generic trait that must be implemented for `$x` exactly once. + trait AmbiguousIfMoreThanOne { + // Required for actually being able to reference the trait. + fn some_item() {} + } + + // Creates multiple scoped `Token` types for each trait `$t`, over + // which a specialized `AmbiguousIfMoreThanOne` is + // implemented for every type that implements `$t`. + $({ + #[allow(dead_code)] + struct Token; + + impl AmbiguousIfMoreThanOne for T {} + })+ + + // If there is only one specialized trait impl, type inference with + // `_` can be resolved and this can compile. Fails to compile if + // `$x` implements more than one `AmbiguousIfMoreThanOne` or + // does not implement any at all. + let _ = <$x as AmbiguousIfMoreThanOne<_>>::some_item; + }; + }; +} + +/// Asserts that the type implements _all_ of the given traits. +/// +/// See [`assert_not_impl_all!`] for achieving the opposite effect. +/// +/// # Examples +/// +/// This can be used to ensure types implement auto traits such as [`Send`] and +/// [`Sync`], as well as traits with [blanket `impl`s][blanket]. +/// +/// ``` +/// # #[macro_use] extern crate static_assertions; fn main() {} +/// assert_impl_all!(u32: Copy, Send); +/// assert_impl_all!(&str: Into); +/// ``` +/// +/// The following example fails to compile because raw pointers do not implement +/// [`Send`] since they cannot be moved between threads safely: +/// +/// ```compile_fail +/// # #[macro_use] extern crate static_assertions; fn main() {} +/// assert_impl_all!(*const u8: Send); +/// ``` +/// +/// [`assert_not_impl_all!`]: macro.assert_not_impl_all.html +/// [`Send`]: https://doc.rust-lang.org/std/marker/trait.Send.html +/// [`Sync`]: https://doc.rust-lang.org/std/marker/trait.Sync.html +/// [blanket]: https://doc.rust-lang.org/book/ch10-02-traits.html#using-trait-bounds-to-conditionally-implement-methods +#[macro_export] +macro_rules! assert_impl_all { + ($type:ty: $($trait:path),+ $(,)?) => { + const _: fn() = || { + // Only callable when `$type` implements all traits in `$($trait)+`. + fn assert_impl_all() {} + assert_impl_all::<$type>(); + }; + }; +} + +/// Asserts that the type implements _any_ of the given traits. +/// +/// See [`assert_not_impl_any!`] for achieving the opposite effect. +/// +/// # Examples +/// +/// `u8` cannot be converted from `u16`, but it can be converted into `u16`: +/// +/// ``` +/// # #[macro_use] extern crate static_assertions; fn main() {} +/// assert_impl_any!(u8: From, Into); +/// ``` +/// +/// The unit type cannot be converted from `u8` or `u16`, but it does implement +/// [`Send`]: +/// +/// ``` +/// # #[macro_use] extern crate static_assertions; fn main() {} +/// assert_impl_any!((): From, From, Send); +/// ``` +/// +/// The following example fails to compile because raw pointers do not implement +/// [`Send`] or [`Sync`] since they cannot be moved or shared between threads +/// safely: +/// +/// ```compile_fail +/// # #[macro_use] extern crate static_assertions; fn main() {} +/// assert_impl_any!(*const u8: Send, Sync); +/// ``` +/// +/// [`assert_not_impl_any!`]: macro.assert_not_impl_any.html +/// [`Send`]: https://doc.rust-lang.org/std/marker/trait.Send.html +/// [`Sync`]: https://doc.rust-lang.org/std/marker/trait.Sync.html +#[macro_export] +macro_rules! assert_impl_any { + ($x:ty: $($t:path),+ $(,)?) => { + const _: fn() = || { + use $crate::_core::marker::PhantomData; + use $crate::_core::ops::Deref; + + // Fallback to use as the first iterative assignment to `previous`. + let previous = AssertImplAnyFallback; + struct AssertImplAnyFallback; + + // Ensures that blanket traits can't impersonate the method. This + // prevents a false positive attack where---if a blanket trait is in + // scope that has `_static_assertions_impl_any`---the macro will + // compile when it shouldn't. + // + // See https://github.com/nvzqz/static-assertions-rs/issues/19 for + // more info. + struct ActualAssertImplAnyToken; + trait AssertImplAnyToken {} + impl AssertImplAnyToken for ActualAssertImplAnyToken {} + fn assert_impl_any_token(_: T) {} + + $(let previous = { + struct Wrapper(PhantomData, N); + + // If the method for this wrapper can't be called then the + // compiler will insert a deref and try again. This forwards the + // compiler's next attempt to the previous wrapper. + impl Deref for Wrapper { + type Target = N; + + fn deref(&self) -> &Self::Target { + &self.1 + } + } + + // This impl is bounded on the `$t` trait, so the method can + // only be called if `$x` implements `$t`. This is why a new + // `Wrapper` is defined for each `previous`. + impl Wrapper { + fn _static_assertions_impl_any(&self) -> ActualAssertImplAnyToken { + ActualAssertImplAnyToken + } + } + + Wrapper::<$x, _>(PhantomData, previous) + };)+ + + // Attempt to find the method that can actually be called. The found + // method must return a type that implements the sealed `Token` + // trait, this ensures that blanket trait methods can't cause this + // macro to compile. + assert_impl_any_token(previous._static_assertions_impl_any()); + }; + }; +} + +/// Asserts that the type does **not** implement _all_ of the given traits. +/// +/// This can be used to ensure types do not implement auto traits such as +/// [`Send`] and [`Sync`], as well as traits with [blanket `impl`s][blanket]. +/// +/// Note that the combination of all provided traits is required to not be +/// implemented. If you want to check that none of multiple traits are +/// implemented you should invoke [`assert_not_impl_any!`] instead. +/// +/// # Examples +/// +/// Although `u32` implements `From`, it does not implement `Into`: +/// +/// ``` +/// # #[macro_use] extern crate static_assertions; fn main() {} +/// assert_not_impl_all!(u32: From, Into); +/// ``` +/// +/// The following example fails to compile since `u32` can be converted into +/// `u64`. +/// +/// ```compile_fail +/// # #[macro_use] extern crate static_assertions; fn main() {} +/// assert_not_impl_all!(u32: Into); +/// ``` +/// +/// The following compiles because [`Cell`] is not both [`Sync`] _and_ [`Send`]: +/// +/// ``` +/// # #[macro_use] extern crate static_assertions; fn main() {} +/// use std::cell::Cell; +/// +/// assert_not_impl_all!(Cell: Sync, Send); +/// ``` +/// +/// But it is [`Send`], so this fails to compile: +/// +/// ```compile_fail +/// # #[macro_use] extern crate static_assertions; fn main() {} +/// # std::cell::Cell; +/// assert_not_impl_all!(Cell: Send); +/// ``` +/// +/// [`Send`]: https://doc.rust-lang.org/std/marker/trait.Send.html +/// [`Sync`]: https://doc.rust-lang.org/std/marker/trait.Sync.html +/// [`assert_not_impl_any!`]: macro.assert_not_impl_any.html +/// [`Cell`]: https://doc.rust-lang.org/std/cell/struct.Cell.html +/// [blanket]: https://doc.rust-lang.org/book/ch10-02-traits.html#using-trait-bounds-to-conditionally-implement-methods +#[macro_export] +macro_rules! assert_not_impl_all { + ($x:ty: $($t:path),+ $(,)?) => { + const _: fn() = || { + // Generic trait with a blanket impl over `()` for all types. + trait AmbiguousIfImpl { + // Required for actually being able to reference the trait. + fn some_item() {} + } + + impl AmbiguousIfImpl<()> for T {} + + // Used for the specialized impl when *all* traits in + // `$($t)+` are implemented. + #[allow(dead_code)] + struct Invalid; + + impl AmbiguousIfImpl for T {} + + // If there is only one specialized trait impl, type inference with + // `_` can be resolved and this can compile. Fails to compile if + // `$x` implements `AmbiguousIfImpl`. + let _ = <$x as AmbiguousIfImpl<_>>::some_item; + }; + }; +} + +/// Asserts that the type does **not** implement _any_ of the given traits. +/// +/// This can be used to ensure types do not implement auto traits such as +/// [`Send`] and [`Sync`], as well as traits with [blanket `impl`s][blanket]. +/// +/// This macro causes a compilation failure if any of the provided individual +/// traits are implemented for the type. If you want to check that a combination +/// of traits is not implemented you should invoke [`assert_not_impl_all!`] +/// instead. For single traits both macros behave the same. +/// +/// # Examples +/// +/// If `u32` were to implement `Into` conversions for `usize` _and_ for `u8`, +/// the following would fail to compile: +/// +/// ``` +/// # #[macro_use] extern crate static_assertions; fn main() {} +/// assert_not_impl_any!(u32: Into, Into); +/// ``` +/// +/// This is also good for simple one-off cases: +/// +/// ``` +/// # #[macro_use] extern crate static_assertions; fn main() {} +/// assert_not_impl_any!(&'static mut u8: Copy); +/// ``` +/// +/// The following example fails to compile since `u32` can be converted into +/// `u64` even though it can not be converted into a `u16`: +/// +/// ```compile_fail +/// # #[macro_use] extern crate static_assertions; fn main() {} +/// assert_not_impl_any!(u32: Into, Into); +/// ``` +/// +/// [`Send`]: https://doc.rust-lang.org/std/marker/trait.Send.html +/// [`Sync`]: https://doc.rust-lang.org/std/marker/trait.Sync.html +/// [`assert_not_impl_all!`]: macro.assert_not_impl_all.html +/// [blanket]: https://doc.rust-lang.org/book/ch10-02-traits.html#using-trait-bounds-to-conditionally-implement-methods +#[macro_export] +macro_rules! assert_not_impl_any { + ($x:ty: $($t:path),+ $(,)?) => { + const _: fn() = || { + // Generic trait with a blanket impl over `()` for all types. + trait AmbiguousIfImpl { + // Required for actually being able to reference the trait. + fn some_item() {} + } + + impl AmbiguousIfImpl<()> for T {} + + // Creates multiple scoped `Invalid` types for each trait `$t`, over + // which a specialized `AmbiguousIfImpl` is implemented for + // every type that implements `$t`. + $({ + #[allow(dead_code)] + struct Invalid; + + impl AmbiguousIfImpl for T {} + })+ + + // If there is only one specialized trait impl, type inference with + // `_` can be resolved and this can compile. Fails to compile if + // `$x` implements any `AmbiguousIfImpl`. + let _ = <$x as AmbiguousIfImpl<_>>::some_item; + }; + }; +} diff -Nru temporalio-1.3.0/vendor/static_assertions/src/assert_obj_safe.rs temporalio-1.3.0/vendor/static_assertions/src/assert_obj_safe.rs --- temporalio-1.3.0/vendor/static_assertions/src/assert_obj_safe.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/static_assertions/src/assert_obj_safe.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,76 @@ +// FIXME: Link below is required to render in index +/// Asserts that the traits support dynamic dispatch +/// ([object-safety](https://doc.rust-lang.org/book/ch17-02-trait-objects.html#object-safety-is-required-for-trait-objects)). +/// +/// This is useful for when changes are made to a trait that accidentally +/// prevent it from being used as an [object]. Such a case would be adding a +/// generic method and forgetting to add `where Self: Sized` after it. If left +/// unnoticed, that mistake will affect crate users and break both forward and +/// backward compatibility. +/// +/// # Examples +/// +/// When exposing a public API, it's important that traits that could previously +/// use dynamic dispatch can still do so in future compatible crate versions. +/// +/// ``` +/// # #[macro_use] extern crate static_assertions; fn main() {} +/// trait MySafeTrait { +/// fn foo(&self) -> u32; +/// } +/// +/// assert_obj_safe!(std::fmt::Write, MySafeTrait); +/// ``` +/// +/// Works with traits that are not in the calling module: +/// +/// ``` +/// # #[macro_use] extern crate static_assertions; fn main() {} +/// mod inner { +/// pub trait BasicTrait { +/// fn bar(&self); +/// } +/// assert_obj_safe!(BasicTrait); +/// } +/// +/// assert_obj_safe!(inner::BasicTrait); +/// ``` +/// +/// The following example fails to compile because raw pointers cannot be sent +/// between threads safely: +/// +/// ```compile_fail +/// # #[macro_use] extern crate static_assertions; fn main() {} +/// assert_impl!(*const u8, Send); +/// ``` +/// +/// The following example fails to compile because generics without +/// `where Self: Sized` are not allowed in [object-safe][object] trait methods: +/// +/// ```compile_fail +/// # #[macro_use] extern crate static_assertions; fn main() {} +/// trait MyUnsafeTrait { +/// fn baz(&self) -> T; +/// } +/// +/// assert_obj_safe!(MyUnsafeTrait); +/// ``` +/// +/// When we fix that, the previous code will compile: +/// +/// ``` +/// # #[macro_use] extern crate static_assertions; fn main() {} +/// trait MyUnsafeTrait { +/// fn baz(&self) -> T where Self: Sized; +/// } +/// +/// assert_obj_safe!(MyUnsafeTrait); +/// ``` +/// +/// [object]: https://doc.rust-lang.org/book/ch17-02-trait-objects.html#object-safety-is-required-for-trait-objects +#[macro_export] +macro_rules! assert_obj_safe { + ($($xs:path),+ $(,)?) => { + $(const _: Option<&$xs> = None;)+ + }; +} diff -Nru temporalio-1.3.0/vendor/static_assertions/src/assert_trait.rs temporalio-1.3.0/vendor/static_assertions/src/assert_trait.rs --- temporalio-1.3.0/vendor/static_assertions/src/assert_trait.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/static_assertions/src/assert_trait.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,105 @@ +/// Asserts that the trait is a child of all of the other traits. +/// +/// Related: +/// - [`assert_trait_super_all!`] +/// +/// # Examples +/// +/// All types that implement [`Copy`] must implement [`Clone`]: +/// +/// ``` +/// # #[macro_use] extern crate static_assertions; fn main() {} +/// assert_trait_sub_all!(Copy: Clone); +/// ``` +/// +/// All types that implement [`Ord`] must implement [`PartialEq`], [`Eq`], and +/// [`PartialOrd`]: +/// +/// ``` +/// # #[macro_use] extern crate static_assertions; fn main() {} +/// assert_trait_sub_all!(Ord: PartialEq, Eq, PartialOrd); +/// ``` +/// +/// The following example fails to compile because [`Eq`] is not required for +/// [`PartialOrd`]: +/// +/// ```compile_fail +/// # #[macro_use] extern crate static_assertions; fn main() {} +/// assert_trait_sub_all!(PartialOrd: Eq); +/// ``` +/// +/// [`assert_trait_super_all!`]: macro.assert_trait_super_all.html +/// +/// [`Copy`]: https://doc.rust-lang.org/std/marker/trait.Copy.html +/// [`Clone`]: https://doc.rust-lang.org/std/clone/trait.Clone.html +/// [`Ord`]: https://doc.rust-lang.org/std/cmp/trait.Ord.html +/// [`PartialOrd`]: https://doc.rust-lang.org/std/cmp/trait.PartialOrd.html +/// [`Eq`]: https://doc.rust-lang.org/std/cmp/trait.Eq.html +/// [`PartialEq`]: https://doc.rust-lang.org/std/cmp/trait.PartialEq.html +#[macro_export] +macro_rules! assert_trait_sub_all { + ($sub:path: $($super:path),+ $(,)?) => { + const _: () = { + // One scope per super-trait. + $({ + #[allow(non_camel_case_types)] + trait __Impl_Implication: $super {} + + // Can only be implemented for `$sub` types if `$super` is + // also implemented. + impl __Impl_Implication for T {} + })+ + }; + }; +} + +/// Asserts that the trait is a parent of all of the other traits. +/// +/// Related: +/// - [`assert_trait_sub_all!`] +/// +/// # Examples +/// +/// With this, traits `A` and `B` can both be tested to require [`Copy`] on a +/// single line: +/// +/// ``` +/// # use static_assertions::assert_trait_super_all; +/// trait A: Copy {} +/// trait B: Copy {} +/// +/// assert_trait_super_all!(Copy: A, B); +/// ``` +/// +/// Otherwise, each sub-trait would require its own call to +/// [`assert_trait_sub_all!`]: +/// +/// ``` +/// # #[macro_use] extern crate static_assertions; fn main() {} +/// # trait A: Copy {} +/// # trait B: Copy {} +/// assert_trait_sub_all!(A: Copy); +/// assert_trait_sub_all!(B: Copy); +/// ``` +/// +/// The following example fails to compile because trait `C` does not require +/// [`Copy`]: +/// +/// ```compile_fail +/// # use static_assertions::assert_trait_super_all; +/// # trait A: Copy {} +/// # trait B: Copy {} +/// trait C {} +/// +/// assert_trait_super_all!(Copy: A, B, C); +/// ``` +/// +/// [`assert_trait_sub_all!`]: macro.assert_trait_sub_all.html +/// +/// [`Copy`]: https://doc.rust-lang.org/std/marker/trait.Copy.html +#[macro_export(local_inner_macros)] +macro_rules! assert_trait_super_all { + ($super:path: $($sub:path),+ $(,)?) => { + $(assert_trait_sub_all!($sub: $super);)+ + }; +} diff -Nru temporalio-1.3.0/vendor/static_assertions/src/assert_type.rs temporalio-1.3.0/vendor/static_assertions/src/assert_type.rs --- temporalio-1.3.0/vendor/static_assertions/src/assert_type.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/static_assertions/src/assert_type.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,101 @@ +/// Asserts that _all_ types in a list are equal to each other. +/// +/// # Examples +/// +/// Often times, type aliases are used to express usage semantics via naming. In +/// some cases, the underlying type may differ based on platform. However, other +/// types like [`c_float`] will always alias the same type. +/// +/// ``` +/// # #[macro_use] extern crate static_assertions; fn main() {} +/// use std::os::raw::c_float; +/// +/// assert_type_eq_all!(c_float, f32); +/// ``` +/// +/// This macro can also be used to compare types that involve lifetimes! Just +/// use `'static` in that case: +/// +/// ``` +/// # #[macro_use] extern crate static_assertions; +/// # fn main() { +/// type Buf<'a> = &'a [u8]; +/// +/// assert_type_eq_all!(Buf<'static>, &'static [u8]); +/// # } +/// ``` +/// +/// The following example fails to compile because `String` and `str` do not +/// refer to the same type: +/// +/// ```compile_fail +/// # #[macro_use] extern crate static_assertions; fn main() {} +/// assert_type_eq_all!(String, str); +/// ``` +/// +/// This should also work the other way around, regardless of [`Deref`] +/// implementations. +/// +/// ```compile_fail +/// # #[macro_use] extern crate static_assertions; fn main() {} +/// assert_type_eq_all!(str, String); +/// ``` +/// +/// [`c_float`]: https://doc.rust-lang.org/std/os/raw/type.c_float.html +/// [`Deref`]: https://doc.rust-lang.org/std/ops/trait.Deref.html +#[macro_export] +macro_rules! assert_type_eq_all { + ($x:ty, $($xs:ty),+ $(,)*) => { + const _: fn() = || { $({ + trait TypeEq { + type This: ?Sized; + } + + impl TypeEq for T { + type This = Self; + } + + fn assert_type_eq_all() + where + T: ?Sized + TypeEq, + U: ?Sized, + {} + + assert_type_eq_all::<$x, $xs>(); + })+ }; + }; +} + +/// Asserts that _all_ types are **not** equal to each other. +/// +/// # Examples +/// +/// Rust has all sorts of slices, but they represent different types of data: +/// +/// ``` +/// # #[macro_use] extern crate static_assertions; fn main() {} +/// assert_type_ne_all!([u8], [u16], str); +/// ``` +/// +/// The following example fails to compile because [`c_uchar`] is a type alias +/// for [`u8`]: +/// +/// ```compile_fail +/// # #[macro_use] extern crate static_assertions; fn main() {} +/// use std::os::raw::c_uchar; +/// +/// assert_type_ne_all!(c_uchar, u8, u32); +/// ``` +/// +/// [`c_uchar`]: https://doc.rust-lang.org/std/os/raw/type.c_uchar.html +/// [`u8`]: https://doc.rust-lang.org/std/primitive.u8.html +#[macro_export] +macro_rules! assert_type_ne_all { + ($x:ty, $($y:ty),+ $(,)?) => { + const _: fn() = || { + trait MutuallyExclusive {} + impl MutuallyExclusive for $x {} + $(impl MutuallyExclusive for $y {})+ + }; + }; +} diff -Nru temporalio-1.3.0/vendor/static_assertions/src/const_assert.rs temporalio-1.3.0/vendor/static_assertions/src/const_assert.rs --- temporalio-1.3.0/vendor/static_assertions/src/const_assert.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/static_assertions/src/const_assert.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,109 @@ +/// Asserts that constant expressions evaluate to `true`. +/// +/// Constant expressions can be ensured to have certain properties via this +/// macro If the expression evaluates to `false`, the file will fail to compile. +/// This is synonymous to [`static_assert` in C++][static_assert]. +/// +/// # Alternatives +/// +/// There also exists [`const_assert_eq`](macro.const_assert_eq.html) for +/// validating whether a sequence of expressions are equal to one another. +/// +/// # Examples +/// +/// A common use case is to guarantee properties about a constant value that's +/// generated via meta-programming. +/// +/// ``` +/// # #[macro_use] extern crate static_assertions; fn main() {} +/// const VALUE: i32 = // ... +/// # 3; +/// +/// const_assert!(VALUE >= 2); +/// ``` +/// +/// Inputs are type-checked as booleans: +/// +/// ```compile_fail +/// # #[macro_use] extern crate static_assertions; fn main() {} +/// const_assert!(!0); +/// ``` +/// +/// Despite this being a macro, we see this produces a type error: +/// +/// ```txt +/// | const_assert!(!0); +/// | ^^ expected bool, found integral variable +/// | +/// = note: expected type `bool` +/// found type `{integer}` +/// ``` +/// +/// The following fails to compile because multiplying by 5 does not have an +/// identity property: +/// +/// ```compile_fail +/// # #[macro_use] extern crate static_assertions; fn main() {} +/// const_assert!(5 * 5 == 5); +/// ``` +/// +/// [static_assert]: http://en.cppreference.com/w/cpp/language/static_assert +#[macro_export] +macro_rules! const_assert { + ($x:expr $(,)?) => { + #[allow(unknown_lints, eq_op)] + const _: [(); 0 - !{ const ASSERT: bool = $x; ASSERT } as usize] = []; + }; +} + +/// Asserts that constants are equal in value. +/// +/// # Examples +/// +/// This works as a shorthand for `const_assert!(a == b)`: +/// +/// ``` +/// # #[macro_use] extern crate static_assertions; fn main() {} +/// const TWO: usize = 2; +/// +/// const_assert_eq!(TWO * TWO, TWO + TWO); +/// ``` +/// +/// Just because 2 × 2 = 2 + 2 doesn't mean it holds true for other numbers: +/// +/// ```compile_fail +/// # #[macro_use] extern crate static_assertions; fn main() {} +/// const_assert_eq!(4 + 4, 4 * 4); +/// ``` +#[macro_export(local_inner_macros)] +macro_rules! const_assert_eq { + ($x:expr, $y:expr $(,)?) => { + const_assert!($x == $y); + }; +} + +/// Asserts that constants are **not** equal in value. +/// +/// # Examples +/// +/// This works as a shorthand for `const_assert!(a != b)`: +/// +/// ``` +/// # #[macro_use] extern crate static_assertions; fn main() {} +/// const NUM: usize = 32; +/// +/// const_assert_ne!(NUM * NUM, 64); +/// ``` +/// +/// The following example fails to compile because 2 is magic and 2 × 2 = 2 + 2: +/// +/// ```compile_fail +/// # #[macro_use] extern crate static_assertions; fn main() {} +/// const_assert_ne!(2 + 2, 2 * 2); +/// ``` +#[macro_export(local_inner_macros)] +macro_rules! const_assert_ne { + ($x:expr, $y:expr $(,)?) => { + const_assert!($x != $y); + }; +} diff -Nru temporalio-1.3.0/vendor/static_assertions/src/lib.rs temporalio-1.3.0/vendor/static_assertions/src/lib.rs --- temporalio-1.3.0/vendor/static_assertions/src/lib.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/static_assertions/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,97 @@ +//! [![Banner](https://raw.githubusercontent.com/nvzqz/static-assertions-rs/assets/Banner.png)](https://github.com/nvzqz/static-assertions-rs) +//! +//! +//! +//! Assertions to ensure correct assumptions about constants, types, and more. +//! +//! _All_ checks provided by this crate are performed at [compile-time]. This +//! allows for finding errors quickly and early when it comes to ensuring +//! certain features or aspects of a codebase. These macros are especially +//! important when exposing a public API that requires types to be the same size +//! or implement certain traits. +//! +//! # Usage +//! +//! This crate is available [on crates.io][crate] and can be used by adding the +//! following to your project's [`Cargo.toml`]: +//! +//! ```toml +//! [dependencies] +//! static_assertions = "1.1.0" +//! ``` +//! +//! and this to your crate root (`main.rs` or `lib.rs`): +//! +//! ``` +//! #[macro_use] +//! extern crate static_assertions; +//! # fn main() {} +//! ``` +//! +//! When using [Rust 2018 edition][2018], the following shorthand can help if +//! having `#[macro_use]` is undesirable. +//! +//! ```edition2018 +//! extern crate static_assertions as sa; +//! +//! sa::const_assert!(true); +//! ``` +//! +//! # Examples +//! +//! Very thorough examples are provided in the docs for +//! [each individual macro](#macros). Failure case examples are also documented. +//! +//! # Changes +//! +//! See [`CHANGELOG.md`](https://github.com/nvzqz/static-assertions-rs/blob/master/CHANGELOG.md) +//! for an exhaustive list of what has changed from one version to another. +//! +//! # Donate +//! +//! This project is made freely available (as in free beer), but unfortunately +//! not all beer is free! So, if you would like to buy me a beer (or coffee or +//! *more*), then consider supporting my work that's benefited your project +//! and thousands of others. +//! +//! +//! Become a Patron! +//! +//! +//! Buy me a coffee +//! +//! +//! [Rust 1.37]: https://blog.rust-lang.org/2019/08/15/Rust-1.37.0.html +//! [2018]: https://blog.rust-lang.org/2018/12/06/Rust-1.31-and-rust-2018.html#rust-2018 +//! [crate]: https://crates.io/crates/static_assertions +//! [compile-time]: https://en.wikipedia.org/wiki/Compile_time +//! [`Cargo.toml`]: https://doc.rust-lang.org/cargo/reference/manifest.html + +#![doc(html_root_url = "https://docs.rs/static_assertions/1.1.0")] +#![doc(html_logo_url = "https://raw.githubusercontent.com/nvzqz/static-assertions-rs/assets/Icon.png")] + +#![no_std] + +#![deny(unused_macros)] + +#[doc(hidden)] +pub extern crate core as _core; + +mod assert_cfg; +mod assert_eq_align; +mod assert_eq_size; +mod assert_fields; +mod assert_impl; +mod assert_obj_safe; +mod assert_trait; +mod assert_type; +mod const_assert; diff -Nru temporalio-1.3.0/vendor/syn/.cargo-checksum.json temporalio-1.3.0/vendor/syn/.cargo-checksum.json --- temporalio-1.3.0/vendor/syn/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/syn/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"Cargo.toml":"f56cb0ef622eddc84e2f801e2123e0e3728847d581d8597a6d5707339162e96b","LICENSE-APACHE":"62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","README.md":"f6904878f9082d7d267b6d0d737ef211ff165cfd039a4d45ad88e9861f3e217f","benches/file.rs":"0a0527c78d849148cbb6118b4d36f72da7d4add865ba1a410e0a1be9e8dbfe0e","benches/rust.rs":"c006f01aacf95f61e5d6f4064be4040896a37a9632fb3dcfd9bc2a7ab171741d","src/attr.rs":"bd5ffae18a363162f7d9c12a1b6c1d023070cbf1b060c98ebc38ef79f1de9c67","src/bigint.rs":"0299829b2f7a1a798fe2f7bc1680e4a10f9b6f4a852d09af4da2deab466c4242","src/buffer.rs":"3ef1c3302acc4f9976484fd11c28981a5ff245cf4f3b8b888b7f065c8614881e","src/custom_keyword.rs":"f2704d15a337def453bdb337359fffdd014d62ae875cd6dbd442691c932f89c9","src/custom_punctuation.rs":"2e688f6a7c3c0405f209a6aaa85a43fc34807fc280e4a71235642fc9333492dd","src/data.rs":"09ce487d27f7dd79031b390c8344fc6361d64b05064ee25dba1489cf3aa56128","src/derive.rs":"3132e7f064725c7ca43f26daee93ec78037d46a935c6b0758af905cff450c15c","src/discouraged.rs":"482970b03bdee3cbc30c034f644e3293b25387db46300da5d8d8efd97dad8507","src/drops.rs":"013385f1dd95663f1afab41abc1e2eea04181998644828935ca564c74d6462ae","src/error.rs":"8dbb17978f688e12bcce58232f05c0ca9ed9de1fe511440793fb958da2fc93b9","src/export.rs":"6b519b1c17967cdd1519f52f981022435fcf940834fc8a705923426b65f21eac","src/expr.rs":"388348e9404a53331fe84d670bc0da889e1e9471461a8dc0a2e010a377103ecf","src/ext.rs":"3cf2d869812e5be894aa1c48bf074da262143fb2df1c9ac1b5ee965bf2a96a1c","src/file.rs":"a4d510dd0e2756bd54983dfa747601918c801e987cbf92deab44cdca6a201aeb","src/gen/clone.rs":"46540509dc99bb849014948a0c5b02ea372d5feceae5ea391c29f226f06516eb","src/gen/debug.rs":"32b2076b755f021428a0fb268a94057e1bcb1cd400feb895946703d7919b843a","src/gen/eq.rs":"aa5455b2cc0d9846d119ce001e821872df911f65133b993e3801a42e8f635f2a","src/gen/fold.rs":"305fe1db2b5b7039e79104a6e8ead11b1ee3c009f31f2a2bbebca10e494188cd","src/gen/hash.rs":"4ca8239c681ea5fd7b16bb61bff9034bff09680c088f5a16e90e99013e55742f","src/gen/visit.rs":"cbd0ebe18da62614c66a7900ef67350a5efee261bcdfff6cffc1ea6c4e754e34","src/gen/visit_mut.rs":"1b2a260ab3a6465eed6164f6d2c0cec977f9c3ca912f6bed81f8599b4d8f5cb0","src/gen_helper.rs":"750caab67ba0ba11a95ea28cd38026485227bb4aa114cdb497472386f60fdb35","src/generics.rs":"cb1a0374c523a469d48b1db7316166559034d437fb4f6cc5661511edb8aba32c","src/group.rs":"f5911e9cf2dc2dffab546590167c48de30409cb7708aa3307d22be143df720e4","src/ident.rs":"1b2d86d2e380b1fa83aee6ed113c47f0b482a229c25be428dac921deec0b4852","src/item.rs":"00ae729a00854f15203dbcbf2251910658eb052130de243144dcbec68be37919","src/lib.rs":"723c0555b398e4efd39c3198b4fc264b2bab6051e6f81ea3af81865784fdf4ec","src/lifetime.rs":"64abfd72af5dd271b2de1a8304ca0899b90da7750df9dec2ee8102bceb08a426","src/lit.rs":"3a70ebbc81563b967d2cbf589b6980a5b202ee3379d5d401e01a4c2af124d7ae","src/lookahead.rs":"376092f91a1c32e1b277db0a6790fdda151c9ec51bd971fe6a6545b5b9e73b5d","src/mac.rs":"b1cf73f34a27a8f1429125e726623a524fb5dce875eb68ead3beaffa976442c3","src/macros.rs":"64fce3fda990306cfae5f0409918946ff7c9e98ecad963932e6c1436c0b0d4c2","src/meta.rs":"9df61ebaa405ef743ba1629b39ee5e806f9ead77694a1027f192da860270c83d","src/op.rs":"fe5db7c3373b956234ea8a1a7d129a06e5aef5db77c44c1c2fedb4aaa667ac56","src/parse.rs":"e57637899f8533da26e16d41575c3489fd1bf3560cea427ba57b3c966d891d8e","src/parse_macro_input.rs":"4a753b2a6dbfefd6dc93852d66b4f6d73ebd6b8b9be74019fc476f429b9a892d","src/parse_quote.rs":"08c8f4eaedeffaac73170b59921d140f63f4a01c243993dff050b4b848d0ac1f","src/pat.rs":"4d99c5ed6a08e6adfd0f6c31438befd3f03e48982a36bb2544962d9db7805a4a","src/path.rs":"8079943ec924ad5338e4bfa16b15b8ea0d6d27092396b62667eadcd0b98f20db","src/print.rs":"22910bf0521ab868ebd7c62601c55912d12cfb400c65723e08e5cfa3a2d111c0","src/punctuated.rs":"dffaab15b9215c70d7db416e8d4c44b78c43ba2f255485e6211363f0f0fea063","src/restriction.rs":"62efbc127d7e7316dd1070c0e976872de6238b2602bba1fb35df18511b4e7199","src/sealed.rs":"6ece3b3dcb30f6bb98b93d83759ca7712ee8592bef9c0511141039c38765db0e","src/span.rs":"0a48e375e5c9768f6f64174a91ba6a255f4b021e2fb3548d8494e617f142601b","src/spanned.rs":"1bba75d73dd4dc5be6c4e11fdd72686d340fb25b5808830bd603ddc840beabdc","src/stmt.rs":"321d445f681c46ac30644504df2a8afc333a1dde0371159e9e077a17eed16548","src/thread.rs":"1f1deb1272525ab2af9a36aac4bce8f65b0e315adb1656641fd7075662f49222","src/token.rs":"42c9c9d8a7145255abf0cb1af1f2fe56a0b428a8a5ea8ff08e58f894fb519fd5","src/tt.rs":"32490509abcc4a5a3c7eb5628337172b3b49d30697d2f7b7df4d8045255c13da","src/ty.rs":"1d11c614298f25a8fa42165a01d6545fc699a446d7f3f8630162c7f478b26886","src/verbatim.rs":"87cbe82a90f48efb57ffd09141042698b3e011a21d0d5412154d80324b0a5ef0","src/whitespace.rs":"718a80c12cdd145358e2690f0f68ff7779a91ec17ce9fde9bb755f635fce69ad","tests/common/eq.rs":"e51d7f102ec29eef1336e0aad451378d0191845f9b1617744b79d47ff557e6df","tests/common/mod.rs":"432ad35577f836a20b517d8c26ed994ac25fe73ef2f461c67688b61b99762015","tests/common/parse.rs":"246ddf1d303a9dbbc380e8d0689bd851cef3c3146d09d2627175deb9203b003d","tests/debug/gen.rs":"bc638d0fcb4a007d658535b60eec09cf4dc2c4907062832cb94fe6960a0d7e01","tests/debug/mod.rs":"dd87563bbd359401790a9c4185178539929ff9fa35a6998657af82a85731fe4c","tests/macros/mod.rs":"4c84bd9e82df255258671b6a57b0f2a3e4bef2127a2e8b842a4b6f3037b7fc5c","tests/regression.rs":"e9565ea0efecb4136f099164ffcfa26e1996b0a27fb9c6659e90ad9bdd42e7b6","tests/regression/issue1108.rs":"f32db35244a674e22ff824ca9e5bbec2184e287b59f022db68c418b5878a2edc","tests/regression/issue1235.rs":"a2266b10c3f7c7af5734817ab0a3e8b309b51e7d177b63f26e67e6b744d280b0","tests/repo/mod.rs":"ca9ca1d192aa25ffcfc12161edf4998f4c4e3160f8834f8f7259023a28981e5c","tests/repo/progress.rs":"c08d0314a7f3ecf760d471f27da3cd2a500aeb9f1c8331bffb2aa648f9fabf3f","tests/test_asyncness.rs":"3868181f25f7470476077f80a442a7804b6b9b371ad5917f4fd18b1002714c64","tests/test_attribute.rs":"b35550a43bbd187bb330997ba36f90c65d8fc489135b1d32ef4547f145cb7612","tests/test_derive_input.rs":"c215245c4d09052661ac5b65b34e950ea47622847bdffe648d380470f12db8f2","tests/test_expr.rs":"2de81f6171bcde3db8d36ce90b9c77ce672f93dcb1e03b6a44290b039246132b","tests/test_generics.rs":"b77741aa38e6ac7e1a9082faf168e7b7b92fbabf9f3fd07306676339a67394df","tests/test_grouping.rs":"ecbe3324878b2e2be42640a3dec198620cff18731fcb95ee7e94eacd11d2fec1","tests/test_ident.rs":"9eb53d1e21edf23e7c9e14dc74dcc2b2538e9221e19dbcc0a44e3acc2e90f3f6","tests/test_item.rs":"7f0255b61d0a6921313c09aaba470beefc55f1d4e66d1e24cfac7a3f63b035d8","tests/test_iterators.rs":"f4dacb5f3a8e0473dfb0d27f05270d41e79eddb4759b1fad3e88e379b4731e17","tests/test_lit.rs":"8e30c2d7837673a742d77aef01212788bbd099182dd5c1d10ee474cfeb786c39","tests/test_meta.rs":"3e1bb60b4bd56adb1e04b0e2d867404f0d81f7bf69caf7d8a70fc7090e079e84","tests/test_parse_buffer.rs":"3ed83ea2e50f84b80c0b543aac4bfbd379610d0911c0baa1eb94bb925bda7341","tests/test_parse_stream.rs":"a7e186272c89a239cae03053b5a039cdc073cdb46fad64b178fe76fde98405d5","tests/test_pat.rs":"fe94e084ee478d41cccea4eeb3e975386a70d36ff7cbb902ba0c767d536aab6e","tests/test_path.rs":"0033e1082b576bb3217ebd4546423d6f86fde7ee7ba3aba8c57bf137d2b42f47","tests/test_precedence.rs":"d3c34f2e5ffe22f7bdacff7ab6af71b24ba8150fdcc640f3c3e28db3491a556a","tests/test_receiver.rs":"af64117acd66fbf42edc476f731ecd20c88009d9cb641dbd7a1d6384ae99ae73","tests/test_round_trip.rs":"61183de56bf70c628659b9529f794b9f138904959f919f08f3b8176ba62c76ef","tests/test_shebang.rs":"06d3acabed004767d8b3a0389bde7485a6719cad6a0d0b4ac2c7439b03586651","tests/test_should_parse.rs":"1d3535698a446e2755bfc360676bdb161841a1f454cdef6e7556c6d06a95c89d","tests/test_size.rs":"78c14995718c2f8d5a7296c8f524601c30f91a5586e1402c0775977a4f814406","tests/test_stmt.rs":"42a3707056da0ce3a01f8fb13e8b7631f9be6066627ac376e1874742419ad2cc","tests/test_token_trees.rs":"d012da9c3c861073711b006bf6ffdc073821fb9fb0a08733628cdae57124d1f5","tests/test_ty.rs":"f7f21f76e9e798669f09a95c380e26ae5959ee8ac5f3b765b1a799cc9505d075","tests/test_visibility.rs":"cf4c93997cd88821ef7f8e2dd5d1586175cce4614407cd3bdf371ecc4d8abc44","tests/zzz_stable.rs":"2a862e59cb446235ed99aec0e6ada8e16d3ecc30229b29d825b7c0bbc2602989"},"package":"e96b79aaa137db8f61e26363a0c9b47d8b4ec75da28b7d1d614c2303e232408b"} \ No newline at end of file +{"files":{"Cargo.toml":"1fe7cdf292faefe74cebc20883bc16e98f7b1a0324824582a7362c75c0516034","LICENSE-APACHE":"62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","README.md":"f6904878f9082d7d267b6d0d737ef211ff165cfd039a4d45ad88e9861f3e217f","benches/file.rs":"0a0527c78d849148cbb6118b4d36f72da7d4add865ba1a410e0a1be9e8dbfe0e","benches/rust.rs":"c006f01aacf95f61e5d6f4064be4040896a37a9632fb3dcfd9bc2a7ab171741d","src/attr.rs":"bd5ffae18a363162f7d9c12a1b6c1d023070cbf1b060c98ebc38ef79f1de9c67","src/bigint.rs":"0299829b2f7a1a798fe2f7bc1680e4a10f9b6f4a852d09af4da2deab466c4242","src/buffer.rs":"3ef1c3302acc4f9976484fd11c28981a5ff245cf4f3b8b888b7f065c8614881e","src/custom_keyword.rs":"f2704d15a337def453bdb337359fffdd014d62ae875cd6dbd442691c932f89c9","src/custom_punctuation.rs":"4227e8f9c6d78be776db0cf67d6cf836ee2ad39848984c11c1e44febc34ab375","src/data.rs":"7d217b0252a0d14b2db308ac00f48ba24a831e01a49b893f5b3ee6b580dab4cb","src/derive.rs":"3132e7f064725c7ca43f26daee93ec78037d46a935c6b0758af905cff450c15c","src/discouraged.rs":"482970b03bdee3cbc30c034f644e3293b25387db46300da5d8d8efd97dad8507","src/drops.rs":"013385f1dd95663f1afab41abc1e2eea04181998644828935ca564c74d6462ae","src/error.rs":"8dbb17978f688e12bcce58232f05c0ca9ed9de1fe511440793fb958da2fc93b9","src/export.rs":"6b519b1c17967cdd1519f52f981022435fcf940834fc8a705923426b65f21eac","src/expr.rs":"388348e9404a53331fe84d670bc0da889e1e9471461a8dc0a2e010a377103ecf","src/ext.rs":"3cf2d869812e5be894aa1c48bf074da262143fb2df1c9ac1b5ee965bf2a96a1c","src/file.rs":"a4d510dd0e2756bd54983dfa747601918c801e987cbf92deab44cdca6a201aeb","src/gen/clone.rs":"46540509dc99bb849014948a0c5b02ea372d5feceae5ea391c29f226f06516eb","src/gen/debug.rs":"32b2076b755f021428a0fb268a94057e1bcb1cd400feb895946703d7919b843a","src/gen/eq.rs":"aa5455b2cc0d9846d119ce001e821872df911f65133b993e3801a42e8f635f2a","src/gen/fold.rs":"305fe1db2b5b7039e79104a6e8ead11b1ee3c009f31f2a2bbebca10e494188cd","src/gen/hash.rs":"4ca8239c681ea5fd7b16bb61bff9034bff09680c088f5a16e90e99013e55742f","src/gen/visit.rs":"cbd0ebe18da62614c66a7900ef67350a5efee261bcdfff6cffc1ea6c4e754e34","src/gen/visit_mut.rs":"1b2a260ab3a6465eed6164f6d2c0cec977f9c3ca912f6bed81f8599b4d8f5cb0","src/gen_helper.rs":"750caab67ba0ba11a95ea28cd38026485227bb4aa114cdb497472386f60fdb35","src/generics.rs":"cb1a0374c523a469d48b1db7316166559034d437fb4f6cc5661511edb8aba32c","src/group.rs":"f5911e9cf2dc2dffab546590167c48de30409cb7708aa3307d22be143df720e4","src/ident.rs":"c26102f3dd66c85e05dbc9e41fb8c6ff3cf227e1ec84152b7ac920584a866578","src/item.rs":"68b2fbbf908460617dd7cf017478638ab6232a5bb2597868d67f1c809aea0232","src/lib.rs":"8c67ef153c56a2552c027256ad99407b7a6ae3a4dd43fda80ec9070780348da7","src/lifetime.rs":"531ef74507eaf942a3aedfac83bbdbc17463102a6c806f675a83a0d6dc612c52","src/lit.rs":"f7d5029e33a49d400a52027540134a86565cbcb5362f15097ffdc63d3a057380","src/lookahead.rs":"376092f91a1c32e1b277db0a6790fdda151c9ec51bd971fe6a6545b5b9e73b5d","src/mac.rs":"b1cf73f34a27a8f1429125e726623a524fb5dce875eb68ead3beaffa976442c3","src/macros.rs":"4e464104c590200213635624706d83e4a0ddd5aedd826ab4aabb390000f35ae0","src/meta.rs":"9df61ebaa405ef743ba1629b39ee5e806f9ead77694a1027f192da860270c83d","src/op.rs":"fe5db7c3373b956234ea8a1a7d129a06e5aef5db77c44c1c2fedb4aaa667ac56","src/parse.rs":"e57637899f8533da26e16d41575c3489fd1bf3560cea427ba57b3c966d891d8e","src/parse_macro_input.rs":"4a753b2a6dbfefd6dc93852d66b4f6d73ebd6b8b9be74019fc476f429b9a892d","src/parse_quote.rs":"08c8f4eaedeffaac73170b59921d140f63f4a01c243993dff050b4b848d0ac1f","src/pat.rs":"4d99c5ed6a08e6adfd0f6c31438befd3f03e48982a36bb2544962d9db7805a4a","src/path.rs":"f53bd51c4049630c9c28ba5a07276f110d87ef9da737a143fe4c2aa2e92d1fd3","src/print.rs":"22910bf0521ab868ebd7c62601c55912d12cfb400c65723e08e5cfa3a2d111c0","src/punctuated.rs":"dffaab15b9215c70d7db416e8d4c44b78c43ba2f255485e6211363f0f0fea063","src/restriction.rs":"62efbc127d7e7316dd1070c0e976872de6238b2602bba1fb35df18511b4e7199","src/sealed.rs":"6ece3b3dcb30f6bb98b93d83759ca7712ee8592bef9c0511141039c38765db0e","src/span.rs":"0a48e375e5c9768f6f64174a91ba6a255f4b021e2fb3548d8494e617f142601b","src/spanned.rs":"1bba75d73dd4dc5be6c4e11fdd72686d340fb25b5808830bd603ddc840beabdc","src/stmt.rs":"321d445f681c46ac30644504df2a8afc333a1dde0371159e9e077a17eed16548","src/thread.rs":"1f1deb1272525ab2af9a36aac4bce8f65b0e315adb1656641fd7075662f49222","src/token.rs":"94cca416e38225dc8e7ca5033a33f2edc216cb0680696ac81127351d3b2d7785","src/tt.rs":"32490509abcc4a5a3c7eb5628337172b3b49d30697d2f7b7df4d8045255c13da","src/ty.rs":"1d11c614298f25a8fa42165a01d6545fc699a446d7f3f8630162c7f478b26886","src/verbatim.rs":"87cbe82a90f48efb57ffd09141042698b3e011a21d0d5412154d80324b0a5ef0","src/whitespace.rs":"718a80c12cdd145358e2690f0f68ff7779a91ec17ce9fde9bb755f635fce69ad","tests/common/eq.rs":"add52aa28c339853660cea002b80aaf56f919757266c68873fb117a20ddd66f5","tests/common/mod.rs":"432ad35577f836a20b517d8c26ed994ac25fe73ef2f461c67688b61b99762015","tests/common/parse.rs":"246ddf1d303a9dbbc380e8d0689bd851cef3c3146d09d2627175deb9203b003d","tests/debug/gen.rs":"0b689be01a4f4a0d168617b0f867f248a9e3d211e259926e6ec6c10a59776d81","tests/debug/mod.rs":"dd87563bbd359401790a9c4185178539929ff9fa35a6998657af82a85731fe4c","tests/macros/mod.rs":"4c84bd9e82df255258671b6a57b0f2a3e4bef2127a2e8b842a4b6f3037b7fc5c","tests/regression.rs":"e9565ea0efecb4136f099164ffcfa26e1996b0a27fb9c6659e90ad9bdd42e7b6","tests/regression/issue1108.rs":"f32db35244a674e22ff824ca9e5bbec2184e287b59f022db68c418b5878a2edc","tests/regression/issue1235.rs":"a2266b10c3f7c7af5734817ab0a3e8b309b51e7d177b63f26e67e6b744d280b0","tests/repo/mod.rs":"a857b13b258846a5f2b25c66e8db149c703ab7f623505dc18206eec4244ffba2","tests/repo/progress.rs":"c08d0314a7f3ecf760d471f27da3cd2a500aeb9f1c8331bffb2aa648f9fabf3f","tests/test_asyncness.rs":"3868181f25f7470476077f80a442a7804b6b9b371ad5917f4fd18b1002714c64","tests/test_attribute.rs":"b35550a43bbd187bb330997ba36f90c65d8fc489135b1d32ef4547f145cb7612","tests/test_derive_input.rs":"c215245c4d09052661ac5b65b34e950ea47622847bdffe648d380470f12db8f2","tests/test_expr.rs":"2de81f6171bcde3db8d36ce90b9c77ce672f93dcb1e03b6a44290b039246132b","tests/test_generics.rs":"b77741aa38e6ac7e1a9082faf168e7b7b92fbabf9f3fd07306676339a67394df","tests/test_grouping.rs":"ecbe3324878b2e2be42640a3dec198620cff18731fcb95ee7e94eacd11d2fec1","tests/test_ident.rs":"9eb53d1e21edf23e7c9e14dc74dcc2b2538e9221e19dbcc0a44e3acc2e90f3f6","tests/test_item.rs":"7f0255b61d0a6921313c09aaba470beefc55f1d4e66d1e24cfac7a3f63b035d8","tests/test_iterators.rs":"f4dacb5f3a8e0473dfb0d27f05270d41e79eddb4759b1fad3e88e379b4731e17","tests/test_lit.rs":"7297fed48ca248689f112f67b6f024f2f2784e29c6cd33185ac659c350834b01","tests/test_meta.rs":"3e1bb60b4bd56adb1e04b0e2d867404f0d81f7bf69caf7d8a70fc7090e079e84","tests/test_parse_buffer.rs":"3ed83ea2e50f84b80c0b543aac4bfbd379610d0911c0baa1eb94bb925bda7341","tests/test_parse_stream.rs":"a7e186272c89a239cae03053b5a039cdc073cdb46fad64b178fe76fde98405d5","tests/test_pat.rs":"fe94e084ee478d41cccea4eeb3e975386a70d36ff7cbb902ba0c767d536aab6e","tests/test_path.rs":"0033e1082b576bb3217ebd4546423d6f86fde7ee7ba3aba8c57bf137d2b42f47","tests/test_precedence.rs":"1395b213a1aa953a3b2eacc922853f8d0e3afba552325440bfbe4df6b62102a1","tests/test_receiver.rs":"af64117acd66fbf42edc476f731ecd20c88009d9cb641dbd7a1d6384ae99ae73","tests/test_round_trip.rs":"61183de56bf70c628659b9529f794b9f138904959f919f08f3b8176ba62c76ef","tests/test_shebang.rs":"06d3acabed004767d8b3a0389bde7485a6719cad6a0d0b4ac2c7439b03586651","tests/test_should_parse.rs":"1d3535698a446e2755bfc360676bdb161841a1f454cdef6e7556c6d06a95c89d","tests/test_size.rs":"78c14995718c2f8d5a7296c8f524601c30f91a5586e1402c0775977a4f814406","tests/test_stmt.rs":"42a3707056da0ce3a01f8fb13e8b7631f9be6066627ac376e1874742419ad2cc","tests/test_token_trees.rs":"d012da9c3c861073711b006bf6ffdc073821fb9fb0a08733628cdae57124d1f5","tests/test_ty.rs":"f7f21f76e9e798669f09a95c380e26ae5959ee8ac5f3b765b1a799cc9505d075","tests/test_visibility.rs":"cf4c93997cd88821ef7f8e2dd5d1586175cce4614407cd3bdf371ecc4d8abc44","tests/zzz_stable.rs":"2a862e59cb446235ed99aec0e6ada8e16d3ecc30229b29d825b7c0bbc2602989"},"package":"c324c494eba9d92503e6f1ef2e6df781e78f6a7705a0202d9801b198807d518a"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/syn/Cargo.toml temporalio-1.3.0/vendor/syn/Cargo.toml --- temporalio-1.3.0/vendor/syn/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/syn/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -13,7 +13,7 @@ edition = "2021" rust-version = "1.56" name = "syn" -version = "2.0.38" +version = "2.0.29" authors = ["David Tolnay "] include = [ "/benches/**", @@ -75,7 +75,7 @@ ] [dependencies.proc-macro2] -version = "1.0.67" +version = "1.0.62" default-features = false [dependencies.quote] diff -Nru temporalio-1.3.0/vendor/syn/src/custom_punctuation.rs temporalio-1.3.0/vendor/syn/src/custom_punctuation.rs --- temporalio-1.3.0/vendor/syn/src/custom_punctuation.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/syn/src/custom_punctuation.rs 2023-10-30 19:40:00.000000000 +0000 @@ -114,7 +114,7 @@ macro_rules! impl_parse_for_custom_punctuation { ($ident:ident, $($tt:tt)+) => { impl $crate::token::CustomToken for $ident { - fn peek(cursor: $crate::buffer::Cursor) -> $crate::__private::bool { + fn peek(cursor: $crate::buffer::Cursor) -> bool { $crate::__private::peek_punct(cursor, $crate::stringify_punct!($($tt)+)) } diff -Nru temporalio-1.3.0/vendor/syn/src/data.rs temporalio-1.3.0/vendor/syn/src/data.rs --- temporalio-1.3.0/vendor/syn/src/data.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/syn/src/data.rs 2023-10-30 19:40:00.000000000 +0000 @@ -214,37 +214,17 @@ /// Parses a named (braced struct) field. #[cfg_attr(doc_cfg, doc(cfg(feature = "parsing")))] pub fn parse_named(input: ParseStream) -> Result { - let attrs = input.call(Attribute::parse_outer)?; - let vis: Visibility = input.parse()?; - - let unnamed_field = cfg!(feature = "full") && input.peek(Token![_]); - let ident = if unnamed_field { - input.call(Ident::parse_any) - } else { - input.parse() - }?; - - let colon_token: Token![:] = input.parse()?; - - let ty: Type = if unnamed_field - && (input.peek(Token![struct]) - || input.peek(Token![union]) && input.peek2(token::Brace)) - { - let begin = input.fork(); - input.call(Ident::parse_any)?; - input.parse::()?; - Type::Verbatim(verbatim::between(&begin, input)) - } else { - input.parse()? - }; - Ok(Field { - attrs, - vis, + attrs: input.call(Attribute::parse_outer)?, + vis: input.parse()?, mutability: FieldMutability::None, - ident: Some(ident), - colon_token: Some(colon_token), - ty, + ident: Some(if input.peek(Token![_]) { + input.call(Ident::parse_any) + } else { + input.parse() + }?), + colon_token: Some(input.parse()?), + ty: input.parse()?, }) } diff -Nru temporalio-1.3.0/vendor/syn/src/ident.rs temporalio-1.3.0/vendor/syn/src/ident.rs --- temporalio-1.3.0/vendor/syn/src/ident.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/syn/src/ident.rs 2023-10-30 19:40:00.000000000 +0000 @@ -4,12 +4,10 @@ pub use proc_macro2::Ident; #[cfg(feature = "parsing")] -pub_if_not_doc! { - #[doc(hidden)] - #[allow(non_snake_case)] - pub fn Ident(marker: lookahead::TokenMarker) -> Ident { - match marker {} - } +#[doc(hidden)] +#[allow(non_snake_case)] +pub fn Ident(marker: lookahead::TokenMarker) -> Ident { + match marker {} } macro_rules! ident_from_token { diff -Nru temporalio-1.3.0/vendor/syn/src/item.rs temporalio-1.3.0/vendor/syn/src/item.rs --- temporalio-1.3.0/vendor/syn/src/item.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/syn/src/item.rs 2023-10-30 19:40:00.000000000 +0000 @@ -985,35 +985,24 @@ } else { return Err(lookahead.error()); }; - let mut generics: Generics = input.parse()?; let colon_token = input.parse()?; let ty = input.parse()?; - let value = if let Some(eq_token) = input.parse::>()? { - let expr: Expr = input.parse()?; - Some((eq_token, expr)) + if input.peek(Token![;]) { + input.parse::()?; + Ok(Item::Verbatim(verbatim::between(&begin, input))) } else { - None - }; - generics.where_clause = input.parse()?; - let semi_token: Token![;] = input.parse()?; - match value { - Some((eq_token, expr)) - if generics.lt_token.is_none() && generics.where_clause.is_none() => - { - Ok(Item::Const(ItemConst { - attrs: Vec::new(), - vis, - const_token, - ident, - generics, - colon_token, - ty, - eq_token, - expr: Box::new(expr), - semi_token, - })) - } - _ => Ok(Item::Verbatim(verbatim::between(&begin, input))), + Ok(Item::Const(ItemConst { + attrs: Vec::new(), + vis, + const_token, + ident, + generics: Generics::default(), + colon_token, + ty, + eq_token: input.parse()?, + expr: input.parse()?, + semi_token: input.parse()?, + })) } } else if lookahead.peek(Token![unsafe]) { ahead.parse::()?; @@ -1411,34 +1400,24 @@ #[cfg_attr(doc_cfg, doc(cfg(feature = "parsing")))] impl Parse for ItemConst { fn parse(input: ParseStream) -> Result { - let attrs = input.call(Attribute::parse_outer)?; - let vis: Visibility = input.parse()?; - let const_token: Token![const] = input.parse()?; - - let lookahead = input.lookahead1(); - let ident = if lookahead.peek(Ident) || lookahead.peek(Token![_]) { - input.call(Ident::parse_any)? - } else { - return Err(lookahead.error()); - }; - - let colon_token: Token![:] = input.parse()?; - let ty: Type = input.parse()?; - let eq_token: Token![=] = input.parse()?; - let expr: Expr = input.parse()?; - let semi_token: Token![;] = input.parse()?; - Ok(ItemConst { - attrs, - vis, - const_token, - ident, + attrs: input.call(Attribute::parse_outer)?, + vis: input.parse()?, + const_token: input.parse()?, + ident: { + let lookahead = input.lookahead1(); + if lookahead.peek(Ident) || lookahead.peek(Token![_]) { + input.call(Ident::parse_any)? + } else { + return Err(lookahead.error()); + } + }, generics: Generics::default(), - colon_token, - ty: Box::new(ty), - eq_token, - expr: Box::new(expr), - semi_token, + colon_token: input.parse()?, + ty: input.parse()?, + eq_token: input.parse()?, + expr: input.parse()?, + semi_token: input.parse()?, }) } } @@ -2245,36 +2224,10 @@ let mut item = if lookahead.peek(Token![fn]) || peek_signature(&ahead) { input.parse().map(TraitItem::Fn) } else if lookahead.peek(Token![const]) { - let const_token: Token![const] = ahead.parse()?; + ahead.parse::()?; let lookahead = ahead.lookahead1(); if lookahead.peek(Ident) || lookahead.peek(Token![_]) { - input.advance_to(&ahead); - let ident = input.call(Ident::parse_any)?; - let mut generics: Generics = input.parse()?; - let colon_token: Token![:] = input.parse()?; - let ty: Type = input.parse()?; - let default = if let Some(eq_token) = input.parse::>()? { - let expr: Expr = input.parse()?; - Some((eq_token, expr)) - } else { - None - }; - generics.where_clause = input.parse()?; - let semi_token: Token![;] = input.parse()?; - if generics.lt_token.is_none() && generics.where_clause.is_none() { - Ok(TraitItem::Const(TraitItemConst { - attrs: Vec::new(), - const_token, - ident, - generics, - colon_token, - ty, - default, - semi_token, - })) - } else { - return Ok(TraitItem::Verbatim(verbatim::between(&begin, input))); - } + input.parse().map(TraitItem::Const) } else if lookahead.peek(Token![async]) || lookahead.peek(Token![unsafe]) || lookahead.peek(Token![extern]) @@ -2320,36 +2273,30 @@ #[cfg_attr(doc_cfg, doc(cfg(feature = "parsing")))] impl Parse for TraitItemConst { fn parse(input: ParseStream) -> Result { - let attrs = input.call(Attribute::parse_outer)?; - let const_token: Token![const] = input.parse()?; - - let lookahead = input.lookahead1(); - let ident = if lookahead.peek(Ident) || lookahead.peek(Token![_]) { - input.call(Ident::parse_any)? - } else { - return Err(lookahead.error()); - }; - - let colon_token: Token![:] = input.parse()?; - let ty: Type = input.parse()?; - let default = if input.peek(Token![=]) { - let eq_token: Token![=] = input.parse()?; - let default: Expr = input.parse()?; - Some((eq_token, default)) - } else { - None - }; - let semi_token: Token![;] = input.parse()?; - Ok(TraitItemConst { - attrs, - const_token, - ident, + attrs: input.call(Attribute::parse_outer)?, + const_token: input.parse()?, + ident: { + let lookahead = input.lookahead1(); + if lookahead.peek(Ident) || lookahead.peek(Token![_]) { + input.call(Ident::parse_any)? + } else { + return Err(lookahead.error()); + } + }, generics: Generics::default(), - colon_token, - ty, - default, - semi_token, + colon_token: input.parse()?, + ty: input.parse()?, + default: { + if input.peek(Token![=]) { + let eq_token: Token![=] = input.parse()?; + let default: Expr = input.parse()?; + Some((eq_token, default)) + } else { + None + } + }, + semi_token: input.parse()?, }) } } @@ -2603,37 +2550,26 @@ } else { return Err(lookahead.error()); }; - let mut generics: Generics = input.parse()?; let colon_token: Token![:] = input.parse()?; let ty: Type = input.parse()?; - let value = if let Some(eq_token) = input.parse::>()? { - let expr: Expr = input.parse()?; - Some((eq_token, expr)) + if let Some(eq_token) = input.parse()? { + return Ok(ImplItem::Const(ImplItemConst { + attrs, + vis, + defaultness, + const_token, + ident, + generics: Generics::default(), + colon_token, + ty, + eq_token, + expr: input.parse()?, + semi_token: input.parse()?, + })); } else { - None - }; - generics.where_clause = input.parse()?; - let semi_token: Token![;] = input.parse()?; - return match value { - Some((eq_token, expr)) - if generics.lt_token.is_none() && generics.where_clause.is_none() => - { - Ok(ImplItem::Const(ImplItemConst { - attrs, - vis, - defaultness, - const_token, - ident, - generics, - colon_token, - ty, - eq_token, - expr, - semi_token, - })) - } - _ => Ok(ImplItem::Verbatim(verbatim::between(&begin, input))), - }; + input.parse::()?; + return Ok(ImplItem::Verbatim(verbatim::between(&begin, input))); + } } else if lookahead.peek(Token![type]) { parse_impl_item_type(begin, input) } else if vis.is_inherited() @@ -2668,36 +2604,25 @@ #[cfg_attr(doc_cfg, doc(cfg(feature = "parsing")))] impl Parse for ImplItemConst { fn parse(input: ParseStream) -> Result { - let attrs = input.call(Attribute::parse_outer)?; - let vis: Visibility = input.parse()?; - let defaultness: Option = input.parse()?; - let const_token: Token![const] = input.parse()?; - - let lookahead = input.lookahead1(); - let ident = if lookahead.peek(Ident) || lookahead.peek(Token![_]) { - input.call(Ident::parse_any)? - } else { - return Err(lookahead.error()); - }; - - let colon_token: Token![:] = input.parse()?; - let ty: Type = input.parse()?; - let eq_token: Token![=] = input.parse()?; - let expr: Expr = input.parse()?; - let semi_token: Token![;] = input.parse()?; - Ok(ImplItemConst { - attrs, - vis, - defaultness, - const_token, - ident, + attrs: input.call(Attribute::parse_outer)?, + vis: input.parse()?, + defaultness: input.parse()?, + const_token: input.parse()?, + ident: { + let lookahead = input.lookahead1(); + if lookahead.peek(Ident) || lookahead.peek(Token![_]) { + input.call(Ident::parse_any)? + } else { + return Err(lookahead.error()); + } + }, generics: Generics::default(), - colon_token, - ty, - eq_token, - expr, - semi_token, + colon_token: input.parse()?, + ty: input.parse()?, + eq_token: input.parse()?, + expr: input.parse()?, + semi_token: input.parse()?, }) } } diff -Nru temporalio-1.3.0/vendor/syn/src/lib.rs temporalio-1.3.0/vendor/syn/src/lib.rs --- temporalio-1.3.0/vendor/syn/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/syn/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -249,7 +249,7 @@ //! dynamic library libproc_macro from rustc toolchain. // Syn types in rustdoc of other crates get linked to here. -#![doc(html_root_url = "https://docs.rs/syn/2.0.38")] +#![doc(html_root_url = "https://docs.rs/syn/2.0.29")] #![cfg_attr(doc_cfg, feature(doc_cfg))] #![allow(non_camel_case_types)] #![allow( diff -Nru temporalio-1.3.0/vendor/syn/src/lifetime.rs temporalio-1.3.0/vendor/syn/src/lifetime.rs --- temporalio-1.3.0/vendor/syn/src/lifetime.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/syn/src/lifetime.rs 2023-10-30 19:40:00.000000000 +0000 @@ -113,12 +113,10 @@ } #[cfg(feature = "parsing")] -pub_if_not_doc! { - #[doc(hidden)] - #[allow(non_snake_case)] - pub fn Lifetime(marker: lookahead::TokenMarker) -> Lifetime { - match marker {} - } +#[doc(hidden)] +#[allow(non_snake_case)] +pub fn Lifetime(marker: lookahead::TokenMarker) -> Lifetime { + match marker {} } #[cfg(feature = "parsing")] diff -Nru temporalio-1.3.0/vendor/syn/src/lit.rs temporalio-1.3.0/vendor/syn/src/lit.rs --- temporalio-1.3.0/vendor/syn/src/lit.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/syn/src/lit.rs 2023-10-30 19:40:00.000000000 +0000 @@ -758,12 +758,10 @@ } #[cfg(feature = "parsing")] - pub_if_not_doc! { - #[doc(hidden)] - #[allow(non_snake_case)] - pub fn $ty(marker: lookahead::TokenMarker) -> $ty { - match marker {} - } + #[doc(hidden)] + #[allow(non_snake_case)] + pub fn $ty(marker: lookahead::TokenMarker) -> $ty { + match marker {} } }; } @@ -776,12 +774,10 @@ lit_extra_traits!(LitFloat); #[cfg(feature = "parsing")] -pub_if_not_doc! { - #[doc(hidden)] - #[allow(non_snake_case)] - pub fn LitBool(marker: lookahead::TokenMarker) -> LitBool { - match marker {} - } +#[doc(hidden)] +#[allow(non_snake_case)] +pub fn LitBool(marker: lookahead::TokenMarker) -> LitBool { + match marker {} } ast_enum! { @@ -798,12 +794,10 @@ } #[cfg(feature = "parsing")] -pub_if_not_doc! { - #[doc(hidden)] - #[allow(non_snake_case)] - pub fn Lit(marker: lookahead::TokenMarker) -> Lit { - match marker {} - } +#[doc(hidden)] +#[allow(non_snake_case)] +pub fn Lit(marker: lookahead::TokenMarker) -> Lit { + match marker {} } #[cfg(feature = "parsing")] @@ -1095,7 +1089,6 @@ // c"...", cr"...", cr#"..."# // TODO: add a Lit::CStr variant? b'c' => return Lit::Verbatim(token), - b'(' if repr == "(/*ERROR*/)" => return Lit::Verbatim(token), _ => {} } diff -Nru temporalio-1.3.0/vendor/syn/src/macros.rs temporalio-1.3.0/vendor/syn/src/macros.rs --- temporalio-1.3.0/vendor/syn/src/macros.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/syn/src/macros.rs 2023-10-30 19:40:00.000000000 +0000 @@ -166,20 +166,3 @@ (enum enum) => {}; (pub pub) => {}; } - -// Rustdoc bug: does not respect the doc(hidden) on some items. -#[cfg(all(doc, feature = "parsing"))] -macro_rules! pub_if_not_doc { - ($(#[$m:meta])* pub $($item:tt)*) => { - $(#[$m])* - pub(crate) $($item)* - }; -} - -#[cfg(all(not(doc), feature = "parsing"))] -macro_rules! pub_if_not_doc { - ($(#[$m:meta])* pub $($item:tt)*) => { - $(#[$m])* - pub $($item)* - }; -} diff -Nru temporalio-1.3.0/vendor/syn/src/path.rs temporalio-1.3.0/vendor/syn/src/path.rs --- temporalio-1.3.0/vendor/syn/src/path.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/syn/src/path.rs 2023-10-30 19:40:00.000000000 +0000 @@ -82,19 +82,6 @@ None } } - - /// An error if this path is not a single ident, as defined in `get_ident`. - #[cfg(feature = "parsing")] - #[cfg_attr(doc_cfg, doc(cfg(feature = "parsing")))] - pub fn require_ident(&self) -> Result<&Ident> { - self.get_ident().ok_or_else(|| { - crate::error::new2( - self.segments.first().unwrap().ident.span(), - self.segments.last().unwrap().ident.span(), - "expected this path to be an identifier", - ) - }) - } } ast_struct! { diff -Nru temporalio-1.3.0/vendor/syn/src/token.rs temporalio-1.3.0/vendor/syn/src/token.rs --- temporalio-1.3.0/vendor/syn/src/token.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/syn/src/token.rs 2023-10-30 19:40:00.000000000 +0000 @@ -143,7 +143,6 @@ /// Support writing `token.span` rather than `token.spans[0]` on tokens that /// hold a single span. #[repr(transparent)] - #[allow(unknown_lints, repr_transparent_external_private_fields)] // False positive: https://github.com/rust-lang/rust/issues/78586#issuecomment-1722680482 pub struct WithSpan { pub span: Span, } @@ -366,7 +365,6 @@ ($($token:literal pub struct $name:ident/$len:tt #[doc = $usage:literal])*) => { $( #[cfg_attr(not(doc), repr(transparent))] - #[allow(unknown_lints, repr_transparent_external_private_fields)] // False positive: https://github.com/rust-lang/rust/issues/78586#issuecomment-1722680482 #[doc = concat!('`', $token, '`')] /// /// Usage: @@ -842,67 +840,6 @@ /// A type-macro that expands to the name of the Rust type representation of a /// given token. /// -/// As a type, `Token!` is commonly used in the type of struct fields, the type -/// of a `let` statement, or in turbofish for a `parse` function. -/// -/// ``` -/// use syn::{Ident, Token}; -/// use syn::parse::{Parse, ParseStream, Result}; -/// -/// // `struct Foo;` -/// pub struct UnitStruct { -/// struct_token: Token![struct], -/// ident: Ident, -/// semi_token: Token![;], -/// } -/// -/// impl Parse for UnitStruct { -/// fn parse(input: ParseStream) -> Result { -/// let struct_token: Token![struct] = input.parse()?; -/// let ident: Ident = input.parse()?; -/// let semi_token = input.parse::()?; -/// Ok(UnitStruct { struct_token, ident, semi_token }) -/// } -/// } -/// ``` -/// -/// As an expression, `Token!` is used for peeking tokens or instantiating -/// tokens from a span. -/// -/// ``` -/// # use syn::{Ident, Token}; -/// # use syn::parse::{Parse, ParseStream, Result}; -/// # -/// # struct UnitStruct { -/// # struct_token: Token![struct], -/// # ident: Ident, -/// # semi_token: Token![;], -/// # } -/// # -/// # impl Parse for UnitStruct { -/// # fn parse(input: ParseStream) -> Result { -/// # unimplemented!() -/// # } -/// # } -/// # -/// fn make_unit_struct(name: Ident) -> UnitStruct { -/// let span = name.span(); -/// UnitStruct { -/// struct_token: Token![struct](span), -/// ident: name, -/// semi_token: Token![;](span), -/// } -/// } -/// -/// # fn parse(input: ParseStream) -> Result<()> { -/// if input.peek(Token![struct]) { -/// let unit_struct: UnitStruct = input.parse()?; -/// /* ... */ -/// } -/// # Ok(()) -/// # } -/// ``` -/// /// See the [token module] documentation for details and examples. /// /// [token module]: crate::token diff -Nru temporalio-1.3.0/vendor/syn/tests/common/eq.rs temporalio-1.3.0/vendor/syn/tests/common/eq.rs --- temporalio-1.3.0/vendor/syn/tests/common/eq.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/syn/tests/common/eq.rs 2023-10-30 19:40:00.000000000 +0000 @@ -156,7 +156,7 @@ use rustc_data_structures::sync::Lrc; use rustc_span::source_map::Spanned; use rustc_span::symbol::{sym, Ident}; -use rustc_span::{ErrorGuaranteed, Span, Symbol, SyntaxContext, DUMMY_SP}; +use rustc_span::{Span, Symbol, SyntaxContext, DUMMY_SP}; use std::collections::HashMap; use std::hash::{BuildHasher, Hash}; use thin_vec::ThinVec; @@ -296,7 +296,6 @@ spanless_eq_partial_eq!(Delimiter); spanless_eq_partial_eq!(InlineAsmOptions); spanless_eq_partial_eq!(token::LitKind); -spanless_eq_partial_eq!(ErrorGuaranteed); macro_rules! spanless_eq_struct { { @@ -580,7 +579,7 @@ spanless_eq_enum!(VisibilityKind; Public Restricted(path id shorthand) Inherited); spanless_eq_enum!(WherePredicate; BoundPredicate(0) RegionPredicate(0) EqPredicate(0)); spanless_eq_enum!(ExprKind; Array(0) ConstBlock(0) Call(0 1) MethodCall(0) - Tup(0) Binary(0 1 2) Unary(0 1) Lit(0) Cast(0 1) Type(0 1) Let(0 1 2 3) + Tup(0) Binary(0 1 2) Unary(0 1) Lit(0) Cast(0 1) Type(0 1) Let(0 1 2) If(0 1 2) While(0 1 2) ForLoop(0 1 2 3) Loop(0 1 2) Match(0 1) Closure(0) Block(0 1) Async(0 1) Await(0 1) TryBlock(0) Assign(0 1 2) AssignOp(0 1 2) Field(0 1) Index(0 1 2) Underscore Range(0 1 2) Path(0 1) AddrOf(0 1 2) @@ -599,8 +598,8 @@ Or(0) Path(0 1) Tuple(0) Box(0) Ref(0 1) Lit(0) Range(0 1 2) Slice(0) Rest Paren(0) MacCall(0)); spanless_eq_enum!(TyKind; Slice(0) Array(0 1) Ptr(0) Ref(0 1) BareFn(0) Never - Tup(0) AnonStruct(0) AnonUnion(0) Path(0 1) TraitObject(0 1) ImplTrait(0 1) - Paren(0) Typeof(0) Infer ImplicitSelf MacCall(0) Err CVarArgs); + Tup(0) Path(0 1) TraitObject(0 1) ImplTrait(0 1) Paren(0) Typeof(0) Infer + ImplicitSelf MacCall(0) Err CVarArgs); impl SpanlessEq for Ident { fn eq(&self, other: &Self) -> bool { diff -Nru temporalio-1.3.0/vendor/syn/tests/debug/gen.rs temporalio-1.3.0/vendor/syn/tests/debug/gen.rs --- temporalio-1.3.0/vendor/syn/tests/debug/gen.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/syn/tests/debug/gen.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,7 +1,6 @@ // This file is @generated by syn-internal-codegen. // It is not intended for manual editing. -#![allow(repr_transparent_external_private_fields)] #![allow(clippy::match_wildcard_for_single_variants)] use super::{Lite, Present}; use ref_cast::RefCast; diff -Nru temporalio-1.3.0/vendor/syn/tests/repo/mod.rs temporalio-1.3.0/vendor/syn/tests/repo/mod.rs --- temporalio-1.3.0/vendor/syn/tests/repo/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/syn/tests/repo/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -13,16 +13,15 @@ use tar::Archive; use walkdir::{DirEntry, WalkDir}; -const REVISION: &str = "9f5fc1bd443f59583e7af0d94d289f95fe1e20c4"; +const REVISION: &str = "85bf07972a1041b9e25393b803d0e006bec3eaaf"; #[rustfmt::skip] static EXCLUDE_FILES: &[&str] = &[ - // TODO: CStr literals: c"…", cr"…" - // https://github.com/dtolnay/syn/issues/1502 + // CStr literals (c"…") are not yet supported by rustc's lexer + // https://github.com/rust-lang/rust/issues/113333 + "src/tools/clippy/tests/ui/needless_raw_string_hashes.rs", + "src/tools/rust-analyzer/crates/parser/test_data/parser/inline/ok/0085_expr_literals.rs", "src/tools/rust-analyzer/crates/parser/test_data/parser/inline/ok/0085_expr_literals.rs", - - // TODO: explicit tail calls: `become _g()` - // https://github.com/dtolnay/syn/issues/1501 "tests/ui/explicit-tail-calls/return-lifetime-sub.rs", // TODO: non-lifetime binders: `where for<'a, T> &'a Struct: Trait` @@ -116,6 +115,7 @@ // Various extensions to Rust syntax made up by rust-analyzer "src/tools/rust-analyzer/crates/parser/test_data/parser/inline/ok/0012_type_item_where_clause.rs", + "src/tools/rust-analyzer/crates/parser/test_data/parser/inline/ok/0040_crate_keyword_vis.rs", "src/tools/rust-analyzer/crates/parser/test_data/parser/inline/ok/0058_range_pat.rs", "src/tools/rust-analyzer/crates/parser/test_data/parser/inline/ok/0123_param_list_vararg.rs", "src/tools/rust-analyzer/crates/parser/test_data/parser/inline/ok/0131_existential_type.rs", @@ -288,38 +288,21 @@ if needs_clone { download_and_unpack().unwrap(); } - let mut missing = String::new(); let test_src = Path::new("tests/rust"); - - let mut exclude_files_set = BTreeSet::new(); for exclude in EXCLUDE_FILES { - if !exclude_files_set.insert(exclude) { - panic!("duplicate path in EXCLUDE_FILES: {}", exclude); - } - for dir in EXCLUDE_DIRS { - if Path::new(exclude).starts_with(dir) { - panic!("excluded file {} is inside an excluded dir", exclude); - } - } if !test_src.join(exclude).is_file() { missing += "\ntests/rust/"; missing += exclude; } } - - let mut exclude_dirs_set = BTreeSet::new(); for exclude in EXCLUDE_DIRS { - if !exclude_dirs_set.insert(exclude) { - panic!("duplicate path in EXCLUDE_DIRS: {}", exclude); - } if !test_src.join(exclude).is_dir() { missing += "\ntests/rust/"; missing += exclude; missing += "/"; } } - if !missing.is_empty() { panic!("excluded test file does not exist:{}\n", missing); } diff -Nru temporalio-1.3.0/vendor/syn/tests/test_lit.rs temporalio-1.3.0/vendor/syn/tests/test_lit.rs --- temporalio-1.3.0/vendor/syn/tests/test_lit.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/syn/tests/test_lit.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,7 +1,6 @@ #![allow( clippy::float_cmp, clippy::non_ascii_literal, - clippy::single_match_else, clippy::uninlined_format_args )] @@ -14,13 +13,14 @@ use syn::{Lit, LitFloat, LitInt, LitStr}; fn lit(s: &str) -> Lit { - let mut tokens = TokenStream::from_str(s).unwrap().into_iter(); - match tokens.next().unwrap() { - TokenTree::Literal(lit) => { - assert!(tokens.next().is_none()); - Lit::new(lit) - } - wrong => panic!("{:?}", wrong), + match TokenStream::from_str(s) + .unwrap() + .into_iter() + .next() + .unwrap() + { + TokenTree::Literal(lit) => Lit::new(lit), + _ => panic!(), } } diff -Nru temporalio-1.3.0/vendor/syn/tests/test_precedence.rs temporalio-1.3.0/vendor/syn/tests/test_precedence.rs --- temporalio-1.3.0/vendor/syn/tests/test_precedence.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/syn/tests/test_precedence.rs 2023-10-30 19:40:00.000000000 +0000 @@ -30,7 +30,6 @@ extern crate rustc_data_structures; extern crate rustc_driver; extern crate rustc_span; -extern crate smallvec; extern crate thin_vec; use crate::common::eq::SpanlessEq; @@ -169,17 +168,15 @@ /// This method operates on librustc objects. fn librustc_brackets(mut librustc_expr: P) -> Option> { use rustc_ast::ast::{ - AssocItem, AssocItemKind, Attribute, BinOpKind, Block, BorrowKind, Expr, ExprField, - ExprKind, GenericArg, GenericBound, ItemKind, Local, LocalKind, Pat, Stmt, StmtKind, - StructExpr, StructRest, TraitBoundModifier, Ty, + Attribute, BinOpKind, Block, BorrowKind, Expr, ExprField, ExprKind, GenericArg, + GenericBound, Local, LocalKind, Pat, Stmt, StmtKind, StructExpr, StructRest, + TraitBoundModifier, Ty, }; use rustc_ast::mut_visit::{ - noop_flat_map_assoc_item, noop_visit_generic_arg, noop_visit_item_kind, noop_visit_local, - noop_visit_param_bound, MutVisitor, + noop_visit_generic_arg, noop_visit_local, noop_visit_param_bound, MutVisitor, }; use rustc_data_structures::flat_map_in_place::FlatMapInPlace; use rustc_span::DUMMY_SP; - use smallvec::SmallVec; use std::mem; use std::ops::DerefMut; use thin_vec::ThinVec; @@ -188,17 +185,6 @@ failed: bool, } - fn contains_let_chain(expr: &Expr) -> bool { - match &expr.kind { - ExprKind::Let(..) => true, - ExprKind::Binary(binop, left, right) => { - binop.node == BinOpKind::And - && (contains_let_chain(left) || contains_let_chain(right)) - } - _ => false, - } - } - fn flat_map_field(mut f: ExprField, vis: &mut T) -> Vec { if f.is_shorthand { noop_visit_expr(&mut f.expr, vis); @@ -255,7 +241,12 @@ noop_visit_expr(e, self); match e.kind { ExprKind::Block(..) | ExprKind::If(..) | ExprKind::Let(..) => {} - ExprKind::Binary(..) if contains_let_chain(e) => {} + ExprKind::Binary(binop, ref left, ref right) + if match (&left.kind, binop.node, &right.kind) { + (ExprKind::Let(..), BinOpKind::And, _) + | (_, BinOpKind::And, ExprKind::Let(..)) => true, + _ => false, + } => {} _ => { let inner = mem::replace( e, @@ -309,39 +300,6 @@ } } - fn visit_item_kind(&mut self, item: &mut ItemKind) { - match item { - ItemKind::Const(const_item) - if !const_item.generics.params.is_empty() - || !const_item.generics.where_clause.predicates.is_empty() => {} - _ => noop_visit_item_kind(item, self), - } - } - - fn flat_map_trait_item(&mut self, item: P) -> SmallVec<[P; 1]> { - match &item.kind { - AssocItemKind::Const(const_item) - if !const_item.generics.params.is_empty() - || !const_item.generics.where_clause.predicates.is_empty() => - { - SmallVec::from([item]) - } - _ => noop_flat_map_assoc_item(item, self), - } - } - - fn flat_map_impl_item(&mut self, item: P) -> SmallVec<[P; 1]> { - match &item.kind { - AssocItemKind::Const(const_item) - if !const_item.generics.params.is_empty() - || !const_item.generics.where_clause.predicates.is_empty() => - { - SmallVec::from([item]) - } - _ => noop_flat_map_assoc_item(item, self), - } - } - // We don't want to look at expressions that might appear in patterns or // types yet. We'll look into comparing those in the future. For now // focus on expressions appearing in other places. @@ -376,42 +334,28 @@ struct ParenthesizeEveryExpr; - fn parenthesize(expr: Expr) -> Expr { - Expr::Paren(ExprParen { - attrs: Vec::new(), - expr: Box::new(expr), - paren_token: token::Paren::default(), - }) - } - fn needs_paren(expr: &Expr) -> bool { match expr { Expr::Group(_) => unreachable!(), Expr::If(_) | Expr::Unsafe(_) | Expr::Block(_) | Expr::Let(_) => false, - Expr::Binary(_) => !contains_let_chain(expr), + Expr::Binary(bin) => match (&*bin.left, bin.op, &*bin.right) { + (Expr::Let(_), BinOp::And(_), _) | (_, BinOp::And(_), Expr::Let(_)) => false, + _ => true, + }, _ => true, } } - fn contains_let_chain(expr: &Expr) -> bool { - match expr { - Expr::Let(_) => true, - Expr::Binary(expr) => { - matches!(expr.op, BinOp::And(_)) - && (contains_let_chain(&expr.left) || contains_let_chain(&expr.right)) - } - _ => false, - } - } - impl Fold for ParenthesizeEveryExpr { fn fold_expr(&mut self, expr: Expr) -> Expr { - let needs_paren = needs_paren(&expr); - let folded = fold_expr(self, expr); - if needs_paren { - parenthesize(folded) + if needs_paren(&expr) { + Expr::Paren(ExprParen { + attrs: Vec::new(), + expr: Box::new(fold_expr(self, expr)), + paren_token: token::Paren::default(), + }) } else { - folded + fold_expr(self, expr) } } diff -Nru temporalio-1.3.0/vendor/system-configuration/.cargo-checksum.json temporalio-1.3.0/vendor/system-configuration/.cargo-checksum.json --- temporalio-1.3.0/vendor/system-configuration/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/system-configuration/.cargo-checksum.json 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -{"files":{"Cargo.lock":"ba4707a39d79dc0097c26fc9948b805cc46f069db6cf7fe0574ea5984b42e2cc","Cargo.toml":"402efa548ee938acc9c70934e9d02f88fbafeabd5eaa6f8c701a82e20ab3fa50","README.md":"56aff0466dddd2a4d0b5605189ec735bc2c64815ad313e0cad5baa4b25c718db","examples/set_dns.rs":"1d15c9d7531a2288dd014118eb02d39897fcaa0d6791dee8d35f888922a4f5c9","examples/watch_dns.rs":"5f812b584b66b776a1fb36fd0d39bc140f42f81649da3b962877fe1150f21c65","src/dynamic_store.rs":"32547e52bf198683751b73e2fc744104f2d95bdfe50cf014d6f17760c62e99e0","src/lib.rs":"d52d3afbbfa22df9c36aeea43a55fb13c29bf0b2376a91b558f2883512912901","src/network_configuration.rs":"28be42626e6be879620f724abe008cf81f73f21f0d980c3181f02a7f02e5b5d4","src/network_reachability.rs":"834e6c488383a40a2d9707b01f03463ca3e9f2fb1d0fd3457104eb5edd070421","src/preferences.rs":"a4c436f432daacad3d2e015e673baacb34b5f3249c9fe0683c0cdb1099705204"},"package":"ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/system-configuration/Cargo.lock temporalio-1.3.0/vendor/system-configuration/Cargo.lock --- temporalio-1.3.0/vendor/system-configuration/Cargo.lock 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/system-configuration/Cargo.lock 1970-01-01 00:00:00.000000000 +0000 @@ -1,50 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "bitflags" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" - -[[package]] -name = "core-foundation" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6888e10551bb93e424d8df1d07f1a8b4fceb0001a3a4b048bfc47554946f47b3" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" - -[[package]] -name = "libc" -version = "0.2.64" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74dfca3d9957906e8d1e6a0b641dc9a59848e793f1da2165889fd4f62d10d79c" - -[[package]] -name = "system-configuration" -version = "0.5.1" -dependencies = [ - "bitflags", - "core-foundation", - "system-configuration-sys", -] - -[[package]] -name = "system-configuration-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" -dependencies = [ - "core-foundation-sys", - "libc", -] diff -Nru temporalio-1.3.0/vendor/system-configuration/Cargo.toml temporalio-1.3.0/vendor/system-configuration/Cargo.toml --- temporalio-1.3.0/vendor/system-configuration/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/system-configuration/Cargo.toml 1970-01-01 00:00:00.000000000 +0000 @@ -1,40 +0,0 @@ -# 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 = "2021" -name = "system-configuration" -version = "0.5.1" -authors = ["Mullvad VPN"] -description = "Bindings to SystemConfiguration framework for macOS" -readme = "README.md" -keywords = [ - "macos", - "system", - "configuration", - "bindings", -] -categories = [ - "api-bindings", - "os::macos-apis", -] -license = "MIT OR Apache-2.0" -repository = "https://github.com/mullvad/system-configuration-rs" -resolver = "1" - -[dependencies.bitflags] -version = "1" - -[dependencies.core-foundation] -version = "0.9" - -[dependencies.system-configuration-sys] -version = "0.5" diff -Nru temporalio-1.3.0/vendor/system-configuration/examples/set_dns.rs temporalio-1.3.0/vendor/system-configuration/examples/set_dns.rs --- temporalio-1.3.0/vendor/system-configuration/examples/set_dns.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/system-configuration/examples/set_dns.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,50 +0,0 @@ -use core_foundation::{ - array::CFArray, - base::{TCFType, ToVoid}, - dictionary::CFDictionary, - propertylist::CFPropertyList, - string::{CFString, CFStringRef}, -}; -use system_configuration::{ - dynamic_store::{SCDynamicStore, SCDynamicStoreBuilder}, - sys::schema_definitions::{kSCDynamicStorePropNetPrimaryService, kSCPropNetDNSServerAddresses}, -}; - -// This example will change the DNS settings on the primary -// network interface to 8.8.8.8 and 8.8.4.4 - -fn main() { - let store = SCDynamicStoreBuilder::new("my-test-dyn-store").build(); - let primary_service_uuid = get_primary_service_uuid(&store).expect("No PrimaryService active"); - println!("PrimaryService UUID: {}", primary_service_uuid); - - let primary_service_path = CFString::new(&format!( - "State:/Network/Service/{}/DNS", - primary_service_uuid - )); - println!("PrimaryService path: {}", primary_service_path); - - let dns_dictionary = create_dns_dictionary(&[ - CFString::from_static_string("8.8.8.8"), - CFString::from_static_string("8.8.4.4"), - ]); - - let success = store.set(primary_service_path, dns_dictionary); - println!("success? {}", success); -} - -fn get_primary_service_uuid(store: &SCDynamicStore) -> Option { - let dictionary = store - .get("State:/Network/Global/IPv4") - .and_then(CFPropertyList::downcast_into::)?; - dictionary - .find(unsafe { kSCDynamicStorePropNetPrimaryService }.to_void()) - .map(|ptr| unsafe { CFString::wrap_under_get_rule(*ptr as CFStringRef) }) -} - -fn create_dns_dictionary(addresses: &[CFString]) -> CFDictionary { - let key = unsafe { CFString::wrap_under_get_rule(kSCPropNetDNSServerAddresses) }; - let value = CFArray::from_CFTypes(addresses); - let typed_dict = CFDictionary::from_CFType_pairs(&[(key, value)]); - unsafe { CFDictionary::wrap_under_get_rule(typed_dict.as_concrete_TypeRef()) } -} diff -Nru temporalio-1.3.0/vendor/system-configuration/examples/watch_dns.rs temporalio-1.3.0/vendor/system-configuration/examples/watch_dns.rs --- temporalio-1.3.0/vendor/system-configuration/examples/watch_dns.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/system-configuration/examples/watch_dns.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,81 +0,0 @@ -use core_foundation::{ - array::CFArray, - base::{CFType, TCFType, ToVoid}, - dictionary::CFDictionary, - propertylist::CFPropertyList, - runloop::{kCFRunLoopCommonModes, CFRunLoop}, - string::CFString, -}; -use system_configuration::{ - dynamic_store::{SCDynamicStore, SCDynamicStoreBuilder, SCDynamicStoreCallBackContext}, - sys::schema_definitions::kSCPropNetDNSServerAddresses, -}; - -// This example will watch the dynamic store for changes to any DNS setting. As soon as a change -// is detected, it will be printed to stdout. - -fn main() { - let callback_context = SCDynamicStoreCallBackContext { - callout: my_callback, - info: Context { call_count: 0 }, - }; - - let store = SCDynamicStoreBuilder::new("my-watch-dns-store") - .callback_context(callback_context) - .build(); - - let watch_keys: CFArray = CFArray::from_CFTypes(&[]); - let watch_patterns = - CFArray::from_CFTypes(&[CFString::from("(State|Setup):/Network/Service/.*/DNS")]); - - if store.set_notification_keys(&watch_keys, &watch_patterns) { - println!("Registered for notifications"); - } else { - panic!("Unable to register notifications"); - } - - let run_loop_source = store.create_run_loop_source(); - let run_loop = CFRunLoop::get_current(); - run_loop.add_source(&run_loop_source, unsafe { kCFRunLoopCommonModes }); - - println!("Entering run loop"); - CFRunLoop::run_current(); -} - -/// This struct acts as a user provided context/payload to each notification callback. -/// Here one can store any type of data or state needed in the callback function. -#[derive(Debug)] -struct Context { - call_count: u64, -} - -#[allow(clippy::needless_pass_by_value)] -fn my_callback(store: SCDynamicStore, changed_keys: CFArray, context: &mut Context) { - context.call_count += 1; - println!("Callback call count: {}", context.call_count); - - for key in changed_keys.iter() { - if let Some(addresses) = get_dns(&store, key.clone()) { - println!("{} changed DNS to {:?}", *key, addresses); - } else { - println!("{} removed DNS", *key); - } - } -} - -fn get_dns(store: &SCDynamicStore, path: CFString) -> Option> { - let dns_settings = store - .get(path) - .and_then(CFPropertyList::downcast_into::)?; - let address_array = dns_settings - .find(unsafe { kSCPropNetDNSServerAddresses }.to_void()) - .map(|ptr| unsafe { CFType::wrap_under_get_rule(*ptr) }) - .and_then(CFType::downcast_into::)?; - let mut result = Vec::with_capacity(address_array.len() as usize); - for address_ptr in &address_array { - let address = - unsafe { CFType::wrap_under_get_rule(*address_ptr) }.downcast_into::()?; - result.push(address.to_string()) - } - Some(result) -} diff -Nru temporalio-1.3.0/vendor/system-configuration/README.md temporalio-1.3.0/vendor/system-configuration/README.md --- temporalio-1.3.0/vendor/system-configuration/README.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/system-configuration/README.md 1970-01-01 00:00:00.000000000 +0000 @@ -1,12 +0,0 @@ -## SystemConfiguration bindings - -This crate is a high level binding to the Apple [SystemConfiguration] framework. For low level -FFI bindings, check out the [`system-configuration-sys`] crate. - -This crate only implements a small part of the [SystemConfiguration] framework so far. If you -need a yet unimplemented part, feel free to submit a pull request! - -[SystemConfiguration]: https://developer.apple.com/documentation/systemconfiguration?language=objc -[`system-configuration-sys`]: https://crates.io/crates/system-configuration-sys - -License: MIT/Apache-2.0 diff -Nru temporalio-1.3.0/vendor/system-configuration/src/dynamic_store.rs temporalio-1.3.0/vendor/system-configuration/src/dynamic_store.rs --- temporalio-1.3.0/vendor/system-configuration/src/dynamic_store.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/system-configuration/src/dynamic_store.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,301 +0,0 @@ -// Copyright 2017 Amagicom AB. -// -// Licensed under the Apache License, Version 2.0 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -//! Bindings to [`SCDynamicStore`]. -//! -//! See the examples directory for examples how to use this module. -//! -//! [`SCDynamicStore`]: https://developer.apple.com/documentation/systemconfiguration/scdynamicstore?language=objc - -use crate::sys::{ - dynamic_store::{ - kSCDynamicStoreUseSessionKeys, SCDynamicStoreCallBack, SCDynamicStoreContext, - SCDynamicStoreCopyKeyList, SCDynamicStoreCopyValue, SCDynamicStoreCreateRunLoopSource, - SCDynamicStoreCreateWithOptions, SCDynamicStoreGetTypeID, SCDynamicStoreRef, - SCDynamicStoreRemoveValue, SCDynamicStoreSetNotificationKeys, SCDynamicStoreSetValue, - }, - dynamic_store_copy_specific::SCDynamicStoreCopyProxies, -}; -use core_foundation::{ - array::{CFArray, CFArrayRef}, - base::{kCFAllocatorDefault, CFType, TCFType}, - boolean::CFBoolean, - dictionary::CFDictionary, - propertylist::{CFPropertyList, CFPropertyListSubClass}, - runloop::CFRunLoopSource, - string::CFString, -}; -use std::{ffi::c_void, ptr}; - -/// Struct describing the callback happening when a watched value in the dynamic store is changed. -pub struct SCDynamicStoreCallBackContext { - /// The callback function that will be called when a watched value in the dynamic store is - /// changed. - pub callout: SCDynamicStoreCallBackT, - - /// The argument passed to each `callout` call. Can be used to keep state between - /// callbacks. - pub info: T, -} - -/// Signature for callback functions getting called when a watched value in the dynamic store is -/// changed. -/// -/// This is the safe callback definition, abstracting over the lower level `SCDynamicStoreCallBack` -/// from the `system-configuration-sys` crate. -pub type SCDynamicStoreCallBackT = - fn(store: SCDynamicStore, changed_keys: CFArray, info: &mut T); - -/// Builder for [`SCDynamicStore`] sessions. -/// -/// [`SCDynamicStore`]: struct.SCDynamicStore.html -pub struct SCDynamicStoreBuilder { - name: CFString, - session_keys: bool, - callback_context: Option>, -} - -impl SCDynamicStoreBuilder<()> { - /// Creates a new builder. `name` is used as the name parameter when creating the - /// [`SCDynamicStore`] session. - /// - /// [`SCDynamicStore`]: struct.SCDynamicStore.html - pub fn new>(name: S) -> Self { - SCDynamicStoreBuilder { - name: name.into(), - session_keys: false, - callback_context: None, - } - } -} - -impl SCDynamicStoreBuilder { - /// Set wether or not the created [`SCDynamicStore`] should have session keys or not. - /// See [`SCDynamicStoreCreateWithOptions`] for details. - /// - /// Defaults to `false`. - /// - /// [`SCDynamicStore`]: struct.SCDynamicStore.html - /// [`SCDynamicStoreCreateWithOptions`]: https://developer.apple.com/documentation/systemconfiguration/1437818-scdynamicstorecreatewithoptions?language=objc - pub fn session_keys(mut self, session_keys: bool) -> Self { - self.session_keys = session_keys; - self - } - - /// Set a callback context (callback function and data to pass to each callback call). - /// - /// Defaults to having callbacks disabled. - pub fn callback_context( - self, - callback_context: SCDynamicStoreCallBackContext, - ) -> SCDynamicStoreBuilder { - SCDynamicStoreBuilder { - name: self.name, - session_keys: self.session_keys, - callback_context: Some(callback_context), - } - } - - /// Create the dynamic store session. - pub fn build(mut self) -> SCDynamicStore { - let store_options = self.create_store_options(); - if let Some(callback_context) = self.callback_context.take() { - SCDynamicStore::create( - &self.name, - &store_options, - Some(convert_callback::), - &mut self.create_context(callback_context), - ) - } else { - SCDynamicStore::create(&self.name, &store_options, None, ptr::null_mut()) - } - } - - fn create_store_options(&self) -> CFDictionary { - let key = unsafe { CFString::wrap_under_create_rule(kSCDynamicStoreUseSessionKeys) }; - let value = CFBoolean::from(self.session_keys); - let typed_dict = CFDictionary::from_CFType_pairs(&[(key, value)]); - unsafe { CFDictionary::wrap_under_get_rule(typed_dict.as_concrete_TypeRef()) } - } - - fn create_context( - &self, - callback_context: SCDynamicStoreCallBackContext, - ) -> SCDynamicStoreContext { - // move the callback context struct to the heap and "forget" it. - // It will later be brought back into the Rust typesystem and freed in - // `release_callback_context` - let info_ptr = Box::into_raw(Box::new(callback_context)); - - SCDynamicStoreContext { - version: 0, - info: info_ptr as *mut _ as *mut c_void, - retain: None, - release: Some(release_callback_context::), - copyDescription: None, - } - } -} - -declare_TCFType! { - /// Access to the key-value pairs in the dynamic store of a running system. - /// - /// Use the [`SCDynamicStoreBuilder`] to create instances of this. - /// - /// [`SCDynamicStoreBuilder`]: struct.SCDynamicStoreBuilder.html - SCDynamicStore, SCDynamicStoreRef -} - -impl_TCFType!(SCDynamicStore, SCDynamicStoreRef, SCDynamicStoreGetTypeID); - -impl SCDynamicStore { - /// Creates a new session used to interact with the dynamic store maintained by the System - /// Configuration server. - fn create( - name: &CFString, - store_options: &CFDictionary, - callout: SCDynamicStoreCallBack, - context: *mut SCDynamicStoreContext, - ) -> Self { - unsafe { - let store = SCDynamicStoreCreateWithOptions( - kCFAllocatorDefault, - name.as_concrete_TypeRef(), - store_options.as_concrete_TypeRef(), - callout, - context, - ); - SCDynamicStore::wrap_under_create_rule(store) - } - } - - /// Returns the keys that represent the current dynamic store entries that match the specified - /// pattern. Or `None` if an error occured. - /// - /// `pattern` - A regular expression pattern used to match the dynamic store keys. - pub fn get_keys>(&self, pattern: S) -> Option> { - let cf_pattern = pattern.into(); - unsafe { - let array_ref = SCDynamicStoreCopyKeyList( - self.as_concrete_TypeRef(), - cf_pattern.as_concrete_TypeRef(), - ); - if !array_ref.is_null() { - Some(CFArray::wrap_under_create_rule(array_ref)) - } else { - None - } - } - } - - /// Returns the key-value pairs that represent the current internet proxy settings. Or `None` if - /// no proxy settings have been defined or if an error occured. - pub fn get_proxies(&self) -> Option> { - unsafe { - let dictionary_ref = SCDynamicStoreCopyProxies(self.as_concrete_TypeRef()); - if !dictionary_ref.is_null() { - Some(CFDictionary::wrap_under_create_rule(dictionary_ref)) - } else { - None - } - } - } - - /// If the given key exists in the store, the associated value is returned. - /// - /// Use `CFPropertyList::downcast_into` to cast the result into the correct type. - pub fn get>(&self, key: S) -> Option { - let cf_key = key.into(); - unsafe { - let dict_ref = - SCDynamicStoreCopyValue(self.as_concrete_TypeRef(), cf_key.as_concrete_TypeRef()); - if !dict_ref.is_null() { - Some(CFPropertyList::wrap_under_create_rule(dict_ref)) - } else { - None - } - } - } - - /// Sets the value of the given key. Overwrites existing values. - /// Returns `true` on success, false on failure. - pub fn set, V: CFPropertyListSubClass>(&self, key: S, value: V) -> bool { - self.set_raw(key, &value.into_CFPropertyList()) - } - - /// Sets the value of the given key. Overwrites existing values. - /// Returns `true` on success, false on failure. - pub fn set_raw>(&self, key: S, value: &CFPropertyList) -> bool { - let cf_key = key.into(); - let success = unsafe { - SCDynamicStoreSetValue( - self.as_concrete_TypeRef(), - cf_key.as_concrete_TypeRef(), - value.as_concrete_TypeRef(), - ) - }; - success != 0 - } - - /// Removes the value of the specified key from the dynamic store. - pub fn remove>(&self, key: S) -> bool { - let cf_key = key.into(); - let success = unsafe { - SCDynamicStoreRemoveValue(self.as_concrete_TypeRef(), cf_key.as_concrete_TypeRef()) - }; - success != 0 - } - - /// Specifies a set of keys and key patterns that should be monitored for changes. - pub fn set_notification_keys( - &self, - keys: &CFArray, - patterns: &CFArray, - ) -> bool { - let success = unsafe { - SCDynamicStoreSetNotificationKeys( - self.as_concrete_TypeRef(), - keys.as_concrete_TypeRef(), - patterns.as_concrete_TypeRef(), - ) - }; - success != 0 - } - - /// Creates a run loop source object that can be added to the application's run loop. - pub fn create_run_loop_source(&self) -> CFRunLoopSource { - unsafe { - let run_loop_source_ref = SCDynamicStoreCreateRunLoopSource( - kCFAllocatorDefault, - self.as_concrete_TypeRef(), - 0, - ); - CFRunLoopSource::wrap_under_create_rule(run_loop_source_ref) - } - } -} - -/// The raw callback used by the safe `SCDynamicStore` to convert from the `SCDynamicStoreCallBack` -/// to the `SCDynamicStoreCallBackT` -unsafe extern "C" fn convert_callback( - store_ref: SCDynamicStoreRef, - changed_keys_ref: CFArrayRef, - context_ptr: *mut c_void, -) { - let store = SCDynamicStore::wrap_under_get_rule(store_ref); - let changed_keys = CFArray::::wrap_under_get_rule(changed_keys_ref); - let context = &mut *(context_ptr as *mut _ as *mut SCDynamicStoreCallBackContext); - - (context.callout)(store, changed_keys, &mut context.info); -} - -// Release function called by core foundation on release of the dynamic store context. -unsafe extern "C" fn release_callback_context(context_ptr: *const c_void) { - // Bring back the context object from raw ptr so it is correctly freed. - let _context = Box::from_raw(context_ptr as *mut SCDynamicStoreCallBackContext); -} diff -Nru temporalio-1.3.0/vendor/system-configuration/src/lib.rs temporalio-1.3.0/vendor/system-configuration/src/lib.rs --- temporalio-1.3.0/vendor/system-configuration/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/system-configuration/src/lib.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -// Copyright 2017 Amagicom AB. -// -// Licensed under the Apache License, Version 2.0 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -//! # SystemConfiguration bindings -//! -//! This crate is a high level binding to the Apple [SystemConfiguration] framework. For low level -//! FFI bindings, check out the [`system-configuration-sys`] crate. -//! -//! This crate only implements a small part of the [SystemConfiguration] framework so far. If you -//! need a yet unimplemented part, feel free to submit a pull request! -//! -//! [SystemConfiguration]: https://developer.apple.com/documentation/systemconfiguration?language=objc -//! [`system-configuration-sys`]: https://crates.io/crates/system-configuration-sys - -#![deny(missing_docs)] - -/// CoreFoundation wrappers -#[macro_use] -pub extern crate core_foundation; -/// Low-level SystemConfiguration bindings -pub extern crate system_configuration_sys as sys; - -pub mod dynamic_store; -pub mod network_configuration; -pub mod network_reachability; -pub mod preferences; diff -Nru temporalio-1.3.0/vendor/system-configuration/src/network_configuration.rs temporalio-1.3.0/vendor/system-configuration/src/network_configuration.rs --- temporalio-1.3.0/vendor/system-configuration/src/network_configuration.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/system-configuration/src/network_configuration.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,347 +0,0 @@ -//! Bindings for [`SCNetworkConfiguration`]. -//! -//! [`SCNetworkConfiguration`]: https://developer.apple.com/documentation/systemconfiguration/scnetworkconfiguration?language=objc -use core_foundation::{ - array::CFArray, - base::{TCFType, ToVoid}, - string::CFString, -}; -use system_configuration_sys::network_configuration::{ - SCNetworkInterfaceCopyAll, SCNetworkInterfaceGetBSDName, SCNetworkInterfaceGetInterfaceType, - SCNetworkInterfaceGetLocalizedDisplayName, SCNetworkInterfaceGetTypeID, SCNetworkInterfaceRef, - SCNetworkServiceCopyAll, SCNetworkServiceGetEnabled, SCNetworkServiceGetInterface, - SCNetworkServiceGetServiceID, SCNetworkServiceGetTypeID, SCNetworkServiceRef, - SCNetworkSetCopyCurrent, SCNetworkSetGetServiceOrder, SCNetworkSetGetTypeID, SCNetworkSetRef, -}; - -use crate::preferences::SCPreferences; - -core_foundation::declare_TCFType!( - /// Represents a network interface. - /// - /// See [`SCNetworkInterfaceRef`] and its [methods] for details. - /// - /// [`SCNetworkInterfaceRef`]: https://developer.apple.com/documentation/systemconfiguration/scnetworkinterfaceref?language=objc - /// [methods]: https://developer.apple.com/documentation/systemconfiguration/scnetworkconfiguration?language=objc - SCNetworkInterface, - SCNetworkInterfaceRef -); -core_foundation::impl_TCFType!( - SCNetworkInterface, - SCNetworkInterfaceRef, - SCNetworkInterfaceGetTypeID -); - -// TODO: implement all the other methods a SCNetworkInterface has -impl SCNetworkInterface { - /// Get type of the network interface, if the type is recognized, returns `None` otherwise. - /// - /// See [`SCNetworkInterfaceGetInterfaceType`] for details. - /// - /// [`SCNetworkInterfaceGetInterfaceType`]: https://developer.apple.com/documentation/systemconfiguration/1517371-scnetworkinterfacegetinterfacety?language=objc - pub fn interface_type(&self) -> Option { - SCNetworkInterfaceType::from_cfstring(&self.interface_type_string()?) - } - - /// Returns the raw interface type identifier. - /// - /// See [`SCNetworkInterfaceGetInterfaceType`] for details. - /// - /// [`SCNetworkInterfaceGetInterfaceType`]: https://developer.apple.com/documentation/systemconfiguration/1517371-scnetworkinterfacegetinterfacety?language=objc - pub fn interface_type_string(&self) -> Option { - unsafe { - let ptr = SCNetworkInterfaceGetInterfaceType(self.0); - if ptr.is_null() { - None - } else { - Some(CFString::wrap_under_get_rule(ptr)) - } - } - } - - /// Returns the _BSD_ name for the interface, such as `en0`. - /// - /// See [`SCNetworkInterfaceGetBSDName`] for details. - /// - /// [`SCNetworkInterfaceGetBSDName`]: https://developer.apple.com/documentation/systemconfiguration/1516854-scnetworkinterfacegetbsdname?language=objc - pub fn bsd_name(&self) -> Option { - unsafe { - let ptr = SCNetworkInterfaceGetBSDName(self.0); - if ptr.is_null() { - None - } else { - Some(CFString::wrap_under_get_rule(ptr)) - } - } - } - - /// Returns the localized display name for the interface. - /// - /// See [`SCNetworkInterfaceGetLocalizedDisplayName`] for details. - /// - /// [`SCNetworkInterfaceGetLocalizedDisplayName`]: https://developer.apple.com/documentation/systemconfiguration/1517060-scnetworkinterfacegetlocalizeddi?language=objc - pub fn display_name(&self) -> Option { - unsafe { - let ptr = SCNetworkInterfaceGetLocalizedDisplayName(self.0); - if ptr.is_null() { - None - } else { - Some(CFString::wrap_under_get_rule(ptr)) - } - } - } -} - -/// Represents the possible network interface types. -/// -/// See [_Network Interface Types_] documentation for details. -/// -/// [_Network Interface Types_]: https://developer.apple.com/documentation/systemconfiguration/scnetworkconfiguration/network_interface_types?language=objc -#[derive(Debug)] -pub enum SCNetworkInterfaceType { - /// A 6to4 interface. - SixToFour, - /// Bluetooth interface. - Bluetooth, - /// Bridge interface. - Bridge, - /// Ethernet bond interface. - Bond, - /// Ethernet interface. - Ethernet, - /// FireWire interface. - FireWire, - /// IEEE80211 interface. - IEEE80211, - /// IPSec interface. - IPSec, - /// IrDA interface. - IrDA, - /// L2TP interface. - L2TP, - /// Modem interface. - Modem, - /// PPP interface. - PPP, - /// PPTP interface. - /// - /// Deprecated, one should use the PPP variant. - PPTP, - /// Serial interface. - Serial, - /// VLAN interface. - VLAN, - /// WWAN interface. - WWAN, - /// IPv4 interface. - IPv4, -} - -impl SCNetworkInterfaceType { - /// Tries to construct a type by matching it to string constants used to identify a network - /// interface type. If no constants match it, `None` is returned. - pub fn from_cfstring(type_id: &CFString) -> Option { - use system_configuration_sys::network_configuration::*; - - let id_is_equal_to = |const_str| -> bool { - let const_str = unsafe { CFString::wrap_under_get_rule(const_str) }; - &const_str == type_id - }; - unsafe { - if id_is_equal_to(kSCNetworkInterfaceType6to4) { - Some(SCNetworkInterfaceType::SixToFour) - } else if id_is_equal_to(kSCNetworkInterfaceTypeBluetooth) { - Some(SCNetworkInterfaceType::Bluetooth) - } else if id_is_equal_to(kSCNetworkInterfaceTypeBridge) { - Some(SCNetworkInterfaceType::Bridge) - } else if id_is_equal_to(kSCNetworkInterfaceTypeBond) { - Some(SCNetworkInterfaceType::Bond) - } else if id_is_equal_to(kSCNetworkInterfaceTypeEthernet) { - Some(SCNetworkInterfaceType::Ethernet) - } else if id_is_equal_to(kSCNetworkInterfaceTypeFireWire) { - Some(SCNetworkInterfaceType::FireWire) - } else if id_is_equal_to(kSCNetworkInterfaceTypeIEEE80211) { - Some(SCNetworkInterfaceType::IEEE80211) - } else if id_is_equal_to(kSCNetworkInterfaceTypeIPSec) { - Some(SCNetworkInterfaceType::IPSec) - } else if id_is_equal_to(kSCNetworkInterfaceTypeIrDA) { - Some(SCNetworkInterfaceType::IrDA) - } else if id_is_equal_to(kSCNetworkInterfaceTypeL2TP) { - Some(SCNetworkInterfaceType::L2TP) - } else if id_is_equal_to(kSCNetworkInterfaceTypeModem) { - Some(SCNetworkInterfaceType::Modem) - } else if id_is_equal_to(kSCNetworkInterfaceTypePPP) { - Some(SCNetworkInterfaceType::PPP) - } else if id_is_equal_to(kSCNetworkInterfaceTypePPTP) { - Some(SCNetworkInterfaceType::PPTP) - } else if id_is_equal_to(kSCNetworkInterfaceTypeSerial) { - Some(SCNetworkInterfaceType::Serial) - } else if id_is_equal_to(kSCNetworkInterfaceTypeVLAN) { - Some(SCNetworkInterfaceType::VLAN) - } else if id_is_equal_to(kSCNetworkInterfaceTypeWWAN) { - Some(SCNetworkInterfaceType::WWAN) - } else if id_is_equal_to(kSCNetworkInterfaceTypeIPv4) { - Some(SCNetworkInterfaceType::IPv4) - } else { - None - } - } - } -} - -/// Retrieve all current network interfaces -/// -/// See [`SCNetworkInterfaceCopyAll`] for more details. -/// -/// [`SCNetworkInterfaceCopyAll`]: https://developer.apple.com/documentation/systemconfiguration/1517090-scnetworkinterfacecopyall?language=objc -pub fn get_interfaces() -> CFArray { - unsafe { CFArray::::wrap_under_create_rule(SCNetworkInterfaceCopyAll()) } -} - -core_foundation::declare_TCFType!( - /// Represents a network service. - /// - /// See [`SCNetworkInterfaceRef`] and its [methods] for details. - /// - /// [`SCNetworkInterfaceRef`]: https://developer.apple.com/documentation/systemconfiguration/scnetworkserviceref?language=objc - /// [methods]: https://developer.apple.com/documentation/systemconfiguration/scnetworkconfiguration?language=objc - SCNetworkService, - SCNetworkServiceRef -); - -core_foundation::impl_TCFType!( - SCNetworkService, - SCNetworkServiceRef, - SCNetworkServiceGetTypeID -); - -impl SCNetworkService { - /// Returns an array of all network services - pub fn get_services(prefs: &SCPreferences) -> CFArray { - unsafe { - let array_ptr = SCNetworkServiceCopyAll(prefs.to_void()); - if array_ptr.is_null() { - return create_empty_array(); - } - CFArray::::wrap_under_create_rule(array_ptr) - } - } - - /// Returns true if the network service is currently enabled - pub fn enabled(&self) -> bool { - unsafe { SCNetworkServiceGetEnabled(self.0) == 0 } - } - - /// Returns the network interface backing this network service, if it has one. - pub fn network_interface(&self) -> Option { - unsafe { - let ptr = SCNetworkServiceGetInterface(self.0); - if ptr.is_null() { - None - } else { - Some(SCNetworkInterface::wrap_under_get_rule(ptr)) - } - } - } - - /// Returns the service identifier. - pub fn id(&self) -> Option { - unsafe { - let ptr = SCNetworkServiceGetServiceID(self.0); - if ptr.is_null() { - None - } else { - Some(CFString::wrap_under_get_rule(ptr)) - } - } - } -} - -core_foundation::declare_TCFType!( - /// Represents a complete network configuration for a particular host. - /// - /// See [`SCNetworkSet`] for details. - /// - /// [`SCNetworkSet`]: https://developer.apple.com/documentation/systemconfiguration/scnetworksetref?language=objc - SCNetworkSet, - SCNetworkSetRef -); - -core_foundation::impl_TCFType!(SCNetworkSet, SCNetworkSetRef, SCNetworkSetGetTypeID); - -impl SCNetworkSet { - /// Constructs a new set of network services from the preferences. - pub fn new(prefs: &SCPreferences) -> Self { - let ptr = unsafe { SCNetworkSetCopyCurrent(prefs.to_void()) }; - unsafe { SCNetworkSet::wrap_under_create_rule(ptr) } - } - - /// Returns an list of network service identifiers, ordered by their priority. - pub fn service_order(&self) -> CFArray { - unsafe { - let array_ptr = SCNetworkSetGetServiceOrder(self.0); - if array_ptr.is_null() { - return create_empty_array(); - } - CFArray::::wrap_under_get_rule(array_ptr) - } - } -} - -fn create_empty_array() -> CFArray { - use std::ptr::null; - unsafe { - CFArray::wrap_under_create_rule(core_foundation::array::CFArrayCreate( - null() as *const _, - null() as *const _, - 0, - null() as *const _, - )) - } -} - -#[cfg(test)] -mod test { - use super::*; - - #[test] - fn test_get_all_interfaces() { - let _ = get_interfaces(); - } - - #[test] - fn test_get_type() { - for iface in get_interfaces().into_iter() { - if iface.interface_type().is_none() { - panic!( - "Interface {:?} ({:?}) has unrecognized type {:?}", - iface.display_name(), - iface.bsd_name(), - iface.interface_type_string() - ) - } - } - } - - #[test] - fn test_service_order() { - let prefs = SCPreferences::default(&CFString::new("test")); - let services = SCNetworkService::get_services(&prefs); - let set = SCNetworkSet::new(&prefs); - let service_order = set.service_order(); - - assert!(service_order.iter().all(|service_id| { - services - .iter() - .find(|service| service.id().as_ref() == Some(&*service_id)) - .is_some() - })) - } - - #[test] - fn test_empty_array() { - let empty = create_empty_array::(); - let values = empty.get_all_values(); - assert!(values.is_empty()) - } -} diff -Nru temporalio-1.3.0/vendor/system-configuration/src/network_reachability.rs temporalio-1.3.0/vendor/system-configuration/src/network_reachability.rs --- temporalio-1.3.0/vendor/system-configuration/src/network_reachability.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/system-configuration/src/network_reachability.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,475 +0,0 @@ -//! Bindings for [`SCNetworkReachability`] -//! -//! [`SCNetworkReachability`]: https://developer.apple.com/documentation/systemconfiguration/scnetworkreachability-g7d - -use core_foundation::{ - base::{TCFType, ToVoid}, - runloop::CFRunLoop, - string::{CFString, CFStringRef}, -}; -use system_configuration_sys::{ - libc, - network_reachability::{ - kSCNetworkReachabilityFlagsConnectionOnDemand, - kSCNetworkReachabilityFlagsConnectionOnTraffic, - kSCNetworkReachabilityFlagsConnectionRequired, - kSCNetworkReachabilityFlagsInterventionRequired, kSCNetworkReachabilityFlagsIsDirect, - kSCNetworkReachabilityFlagsIsLocalAddress, kSCNetworkReachabilityFlagsIsWWAN, - kSCNetworkReachabilityFlagsReachable, kSCNetworkReachabilityFlagsTransientConnection, - SCNetworkReachabilityContext, SCNetworkReachabilityCreateWithAddress, - SCNetworkReachabilityCreateWithAddressPair, SCNetworkReachabilityCreateWithName, - SCNetworkReachabilityFlags, SCNetworkReachabilityGetFlags, SCNetworkReachabilityGetTypeID, - SCNetworkReachabilityRef, SCNetworkReachabilityScheduleWithRunLoop, - SCNetworkReachabilitySetCallback, SCNetworkReachabilityUnscheduleFromRunLoop, - }, -}; - -use std::{ - error::Error, - ffi::{c_void, CStr}, - fmt::{self, Display}, - net::SocketAddr, - ptr, - sync::Arc, -}; - -/// Failure to determine reachability -#[derive(Debug)] -pub enum ReachabilityError { - /// `SCNetworkReachabilityGetFlags` call failed. - FailedToDetermineReachability, - /// `SCNetworkReachabilityGetFlags` call returned unrecognized flags. - UnrecognizedFlags(u32), -} - -/// Failure to schedule a reachability callback on a runloop. -#[derive(Debug)] -pub struct SchedulingError(()); - -impl Display for SchedulingError { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "Failed to schedule a reachability callback on a runloop") - } -} - -impl Error for SchedulingError {} - -/// Failure to unschedule a reachability callback on a runloop. -#[derive(Debug)] -pub struct UnschedulingError(()); - -impl Display for UnschedulingError { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!( - f, - "Failed to unschedule a reachability callback on a runloop" - ) - } -} - -impl Error for UnschedulingError {} - -/// Failure to set a callback for changes in reachability. -#[derive(Debug)] -pub struct SetCallbackError {} - -impl Display for SetCallbackError { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "Failed to set a callback for reachability") - } -} - -impl Error for SetCallbackError {} - -bitflags::bitflags! { - /// Rustier interface for [`SCNetworkReachabilityFlags`]. - /// - /// [`SCNetworkReachability`]: https://developer.apple.com/documentation/systemconfiguration/scnetworkreachabilityflags - pub struct ReachabilityFlags: u32 { - /// The specified node name or address can be reached via a transient connection, such as - /// PPP. - const TRANSIENT_CONNECTION = kSCNetworkReachabilityFlagsTransientConnection; - /// The specified node name or address can be reached using the current network - /// configuration. - const REACHABLE = kSCNetworkReachabilityFlagsReachable; - /// The specified node name or address can be reached using the current network - /// configuration, but a connection must first be established. If this flag is set, the - /// `CONNECTION_ON_TRAFFIC` flag, `CONNECTION_ON_DEMAND` flag, or `IS_WANN` flag is also - /// typically set to indicate the type of connection required. If the user must manually - /// make the connection, the `INTERVENTION_REQUIRED` flag is also set. - const CONNECTION_REQUIRED = kSCNetworkReachabilityFlagsConnectionRequired; - /// The specified node name or address can be reached using the current network - /// configuration, but a connection must first be established. Any traffic directed to the - /// specified name or address will initiate the connection. - const CONNECTION_ON_TRAFFIC = kSCNetworkReachabilityFlagsConnectionOnTraffic; - /// The specified node name or address can be reached using the current network - /// configuration, but a connection must first be established. - const INTERVENTION_REQUIRED = kSCNetworkReachabilityFlagsInterventionRequired; - /// The specified node name or address can be reached using the current network - /// configuration, but a connection must first be established. - const CONNECTION_ON_DEMAND = kSCNetworkReachabilityFlagsConnectionOnDemand; - /// The specified node name or address is one that is associated with a network interface on the current system. - const IS_LOCAL_ADDRESS = kSCNetworkReachabilityFlagsIsLocalAddress; - /// Network traffic to the specified node name or address will not go through a gateway, but - /// is routed directly to one of the interfaces in the system. - const IS_DIRECT = kSCNetworkReachabilityFlagsIsDirect; - /// The specified node name or address can be reached via a cellular connection, such as EDGE or GPRS. - const IS_WWAN = kSCNetworkReachabilityFlagsIsWWAN; - } -} - -core_foundation::declare_TCFType!( - /// A network address or host for which the connectivity can be determined. - /// - /// See [`SCNetworkReachability`] for details. - /// - /// [`SCNetworkReachability`]: https://developer.apple.com/documentation/systemconfiguration/scnetworkreachability-g7d - SCNetworkReachability, - SCNetworkReachabilityRef -); - -core_foundation::impl_TCFType!( - SCNetworkReachability, - SCNetworkReachabilityRef, - SCNetworkReachabilityGetTypeID -); - -impl SCNetworkReachability { - /// Construct a SCNetworkReachability struct with a local and a remote socket address. - /// - /// See [`SCNetworkReachabilityCreateWithAddressPair`] for details. - /// - /// [`SCNetworkReachabilityCreateWithAddressPair`]: https://developer.apple.com/documentation/systemconfiguration/1514908-scnetworkreachabilitycreatewitha?language=objc - pub fn from_addr_pair(local: SocketAddr, remote: SocketAddr) -> SCNetworkReachability { - let ptr = unsafe { - SCNetworkReachabilityCreateWithAddressPair( - std::ptr::null(), - &*to_c_sockaddr(local), - &*to_c_sockaddr(remote), - ) - }; - - unsafe { Self::wrap_under_create_rule(ptr) } - } - - /// Construct a Reachability from either a hostname or a network node - /// - /// See [`SCNetworkReachabilityCreateWithName`] for details. - /// - /// [`SCNetworkReachabilityCreateWithName`]: https://developer.apple.com/documentation/systemconfiguration/1514904-scnetworkreachabilitycreatewithn?language=objc - pub fn from_host(host: &CStr) -> Option { - let ptr = unsafe { SCNetworkReachabilityCreateWithName(ptr::null(), host.as_ptr()) }; - if ptr.is_null() { - None - } else { - unsafe { Some(Self::wrap_under_create_rule(ptr)) } - } - } - - /// Return a flag indicating whether the specified network address is reachable. - /// - /// See [`SCNetworkReachabilityGetFlags`] for details. - /// - /// [`SCNetworkReachabilityGetFlags`]: https://developer.apple.com/documentation/systemconfiguration/1514924-scnetworkreachabilitygetflags?language=objc - pub fn reachability(&self) -> Result { - let mut raw_flags = 0u32; - if unsafe { SCNetworkReachabilityGetFlags(self.0, &mut raw_flags) } == 0u8 { - return Err(ReachabilityError::FailedToDetermineReachability); - } - - ReachabilityFlags::from_bits(raw_flags) - .ok_or(ReachabilityError::UnrecognizedFlags(raw_flags)) - } - - /// Schedule callback with runloop. - /// - /// See [`SCNetworkReachabilityScheduleFromRunLoop`] for details. - /// - /// [`SCNetworkReachabilityScheduleFromRunLoop`]: https://developer.apple.com/documentation/systemconfiguration/1514894-scnetworkreachabilityschedulewit?language=objc - pub fn schedule_with_runloop( - &self, - run_loop: &CFRunLoop, - run_loop_mode: CFStringRef, - ) -> Result<(), SchedulingError> { - if unsafe { - SCNetworkReachabilityScheduleWithRunLoop( - self.0, - run_loop.to_void() as *mut _, - run_loop_mode, - ) - } == 0u8 - { - Err(SchedulingError(())) - } else { - Ok(()) - } - } - - /// Unschedule from run loop. - /// - /// See [`SCNetworkReachabilityUnscheduleFromRunLoop`] for details. - /// - /// [`SCNetworkReachabilityUnscheduleFromRunLoop`]: https://developer.apple.com/documentation/systemconfiguration/1514899-scnetworkreachabilityunschedulef?language=objc - pub fn unschedule_from_runloop( - &self, - run_loop: &CFRunLoop, - run_loop_mode: CFStringRef, - ) -> Result<(), UnschedulingError> { - if unsafe { - SCNetworkReachabilityUnscheduleFromRunLoop( - self.0, - run_loop.to_void() as *mut _, - run_loop_mode, - ) - } == 0u8 - { - Err(UnschedulingError(())) - } else { - Ok(()) - } - } - - /// Sets callback that is run whenever network connectivity changes. For the callback to be - /// invoked, the `SCNetworkReachability` has to be registered on a run loop. Calling this - /// function multiple times will clear the subsequently set callback. - /// - /// See [`SCNetworkReachabilityContext`] for details. - /// - /// [`SCNetworkReachabilityContext`]: https://developer.apple.com/documentation/systemconfiguration/1514903-scnetworkreachabilitysetcallback?language=objc - pub fn set_callback( - &mut self, - callback: F, - ) -> Result<(), SetCallbackError> { - let callback = Arc::new(NetworkReachabilityCallbackContext::new( - self.clone(), - callback, - )); - - let mut callback_context = SCNetworkReachabilityContext { - version: 0, - info: Arc::into_raw(callback) as *mut _, - retain: Some(NetworkReachabilityCallbackContext::::retain_context), - release: Some(NetworkReachabilityCallbackContext::::release_context), - copyDescription: Some(NetworkReachabilityCallbackContext::::copy_ctx_description), - }; - - if unsafe { - SCNetworkReachabilitySetCallback( - self.0, - Some(NetworkReachabilityCallbackContext::::callback), - &mut callback_context, - ) - } == 0u8 - { - Err(SetCallbackError {}) - } else { - Ok(()) - } - } -} - -impl From for SCNetworkReachability { - fn from(addr: SocketAddr) -> Self { - unsafe { - let ptr = - SCNetworkReachabilityCreateWithAddress(std::ptr::null(), &*to_c_sockaddr(addr)); - SCNetworkReachability::wrap_under_create_rule(ptr) - } - } -} - -struct NetworkReachabilityCallbackContext { - _host: SCNetworkReachability, - callback: T, -} - -impl NetworkReachabilityCallbackContext { - fn new(host: SCNetworkReachability, callback: T) -> Self { - Self { - _host: host, - callback, - } - } - - extern "C" fn callback( - _target: SCNetworkReachabilityRef, - flags: SCNetworkReachabilityFlags, - context: *mut c_void, - ) { - let context: &mut Self = unsafe { &mut (*(context as *mut _)) }; - (context.callback)(unsafe { ReachabilityFlags::from_bits_unchecked(flags) }); - } - - extern "C" fn copy_ctx_description(_ctx: *const c_void) -> CFStringRef { - let description = CFString::from_static_string("NetworkRechability's callback context"); - let description_ref = description.as_concrete_TypeRef(); - std::mem::forget(description); - description_ref - } - - extern "C" fn release_context(ctx: *const c_void) { - unsafe { - let _ = Arc::from_raw(ctx as *mut Self); - } - } - - extern "C" fn retain_context(ctx_ptr: *const c_void) -> *const c_void { - unsafe { - let ctx_ref: Arc = Arc::from_raw(ctx_ptr as *const Self); - let new_ctx = ctx_ref.clone(); - std::mem::forget(ctx_ref); - Arc::into_raw(new_ctx) as *const c_void - } - } -} - -/// Allocates a libc::sockaddr compatible struct and fills it with either a libc::sockaddr_in or a -/// libc::sockaddr_in6, depending on the passed in standard library SocketAddr. -fn to_c_sockaddr(addr: SocketAddr) -> Box { - let ptr = match addr { - SocketAddr::V4(addr) => Box::into_raw(Box::new(libc::sockaddr_in { - sin_len: std::mem::size_of::() as u8, - sin_family: libc::AF_INET as u8, - sin_port: addr.port(), - sin_addr: libc::in_addr { - s_addr: u32::from(*addr.ip()), - }, - sin_zero: [0i8; 8], - })) as *mut c_void, - SocketAddr::V6(addr) => Box::into_raw(Box::new(libc::sockaddr_in6 { - sin6_len: std::mem::size_of::() as u8, - sin6_family: libc::AF_INET6 as u8, - sin6_port: addr.port(), - sin6_flowinfo: 0, - sin6_addr: libc::in6_addr { - s6_addr: addr.ip().octets(), - }, - sin6_scope_id: 0, - })) as *mut c_void, - }; - - unsafe { Box::from_raw(ptr as *mut _) } -} - -#[cfg(test)] -mod test { - use super::*; - - use core_foundation::runloop::{kCFRunLoopCommonModes, CFRunLoop}; - use std::ffi::CString; - - #[test] - fn test_network_reachability_from_addr() { - let sockaddrs = vec![ - "0.0.0.0:0".parse::().unwrap(), - "[::0]:0".parse::().unwrap(), - ]; - - for addr in sockaddrs { - let mut reachability = SCNetworkReachability::from(addr); - assert!( - !reachability.0.is_null(), - "Failed to construct a SCNetworkReachability struct with {}", - addr - ); - reachability.set_callback(|_| {}).unwrap(); - reachability - .schedule_with_runloop(&CFRunLoop::get_current(), unsafe { kCFRunLoopCommonModes }) - .unwrap(); - reachability - .unschedule_from_runloop(&CFRunLoop::get_current(), unsafe { - kCFRunLoopCommonModes - }) - .unwrap(); - } - } - - #[test] - fn test_sockaddr_pair_reachability() { - let pairs = vec![ - ("0.0.0.0:0", "[::0]:0"), - ("[::0]:0", "0.0.0.0:0"), - ("[::0]:0", "[::0]:0"), - ("0.0.0.0:0", "0.0.0.0:0"), - ] - .into_iter() - .map(|(a, b)| (a.parse().unwrap(), b.parse().unwrap())); - - for (local, remote) in pairs { - let mut reachability = SCNetworkReachability::from_addr_pair(local, remote); - assert!( - !reachability.0.is_null(), - "Failed to construct a SCNetworkReachability struct with address pair {} - {}", - local, - remote - ); - reachability.set_callback(|_| {}).unwrap(); - reachability - .schedule_with_runloop(&CFRunLoop::get_current(), unsafe { kCFRunLoopCommonModes }) - .unwrap(); - reachability - .unschedule_from_runloop(&CFRunLoop::get_current(), unsafe { - kCFRunLoopCommonModes - }) - .unwrap(); - } - } - - #[test] - fn test_reachability_ref_from_host() { - let valid_inputs = vec!["example.com", "host-in-local-network", "en0"]; - - let get_cstring = |input: &str| CString::new(input).unwrap(); - - for input in valid_inputs.into_iter().map(get_cstring) { - match SCNetworkReachability::from_host(&input) { - Some(mut reachability) => { - reachability.set_callback(|_| {}).unwrap(); - reachability - .schedule_with_runloop(&CFRunLoop::get_current(), unsafe { - kCFRunLoopCommonModes - }) - .unwrap(); - reachability - .unschedule_from_runloop(&CFRunLoop::get_current(), unsafe { - kCFRunLoopCommonModes - }) - .unwrap(); - } - None => { - panic!( - "Failed to construct a SCNetworkReachability from {}", - input.to_string_lossy(), - ); - } - } - } - - // Can only testify that an empty string is invalid, everything else seems to work - assert!( - !SCNetworkReachability::from_host(&get_cstring("")).is_some(), - "Constructed valid SCNetworkReachability from empty string" - ); - } - - unsafe impl Send for SCNetworkReachability {} - - #[test] - fn assert_infallibility_of_setting_a_callback() { - let (tx, rx) = std::sync::mpsc::channel(); - std::thread::spawn(move || { - let mut reachability = - SCNetworkReachability::from("0.0.0.0:0".parse::().unwrap()); - reachability.set_callback(|_| {}).unwrap(); - reachability - .schedule_with_runloop(&CFRunLoop::get_current(), unsafe { kCFRunLoopCommonModes }) - .unwrap(); - reachability.set_callback(|_| {}).unwrap(); - let _ = tx.send(reachability); - CFRunLoop::run_current(); - }); - let mut reachability = rx.recv().unwrap(); - std::thread::sleep(std::time::Duration::from_secs(1)); - reachability.set_callback(|_| {}).unwrap(); - } -} diff -Nru temporalio-1.3.0/vendor/system-configuration/src/preferences.rs temporalio-1.3.0/vendor/system-configuration/src/preferences.rs --- temporalio-1.3.0/vendor/system-configuration/src/preferences.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/system-configuration/src/preferences.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,83 +0,0 @@ -// Copyright 2017 Amagicom AB. -// -// Licensed under the Apache License, Version 2.0 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -//! Bindings to [`SCPreferences`]. -//! -//! See the examples directory for examples how to use this module. -//! -//! [`SCPreferences`]: https://developer.apple.com/documentation/systemconfiguration/scpreferences-ft8 - -use crate::sys::preferences::{SCPreferencesCreate, SCPreferencesGetTypeID, SCPreferencesRef}; -use core_foundation::base::{CFAllocator, TCFType}; -use core_foundation::string::CFString; -use std::ptr; - -declare_TCFType! { - /// The handle to an open preferences session for accessing system configuration preferences. - SCPreferences, SCPreferencesRef -} - -impl_TCFType!(SCPreferences, SCPreferencesRef, SCPreferencesGetTypeID); - -impl SCPreferences { - /// Initiates access to the default system preferences using the default allocator. - pub fn default(calling_process_name: &CFString) -> Self { - Self::new(None, calling_process_name, None) - } - - /// Initiates access to the given (`prefs_id`) group of configuration preferences using the - /// default allocator. To access the default system preferences, use the [`default`] - /// constructor. - /// - /// [`default`]: #method.default - pub fn group(calling_process_name: &CFString, prefs_id: &CFString) -> Self { - Self::new(None, calling_process_name, Some(prefs_id)) - } - - /// Initiates access to the per-system set of configuration preferences with a given - /// allocator and preference group to access. See the underlying [SCPreferencesCreate] function - /// documentation for details. Use the helper constructors [`default`] and [`group`] to easier - /// create an instance using the default allocator. - /// - /// [SCPreferencesCreate]: https://developer.apple.com/documentation/systemconfiguration/1516807-scpreferencescreate?language=objc - /// [`default`]: #method.default - /// [`group`]: #method.group - pub fn new( - allocator: Option<&CFAllocator>, - calling_process_name: &CFString, - prefs_id: Option<&CFString>, - ) -> Self { - let allocator_ref = match allocator { - Some(allocator) => allocator.as_concrete_TypeRef(), - None => ptr::null(), - }; - let prefs_id_ref = match prefs_id { - Some(prefs_id) => prefs_id.as_concrete_TypeRef(), - None => ptr::null(), - }; - - unsafe { - SCPreferences::wrap_under_create_rule(SCPreferencesCreate( - allocator_ref, - calling_process_name.as_concrete_TypeRef(), - prefs_id_ref, - )) - } - } -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn retain_count() { - let preferences = SCPreferences::default(&CFString::new("test")); - assert_eq!(preferences.retain_count(), 1); - } -} diff -Nru temporalio-1.3.0/vendor/system-configuration-sys/build.rs temporalio-1.3.0/vendor/system-configuration-sys/build.rs --- temporalio-1.3.0/vendor/system-configuration-sys/build.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/system-configuration-sys/build.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,13 +0,0 @@ -// Copyright 2017 Amagicom AB. -// -// Licensed under the Apache License, Version 2.0 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -fn main() { - if std::env::var("TARGET").unwrap().contains("-apple") { - println!("cargo:rustc-link-lib=framework=SystemConfiguration"); - } -} diff -Nru temporalio-1.3.0/vendor/system-configuration-sys/.cargo-checksum.json temporalio-1.3.0/vendor/system-configuration-sys/.cargo-checksum.json --- temporalio-1.3.0/vendor/system-configuration-sys/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/system-configuration-sys/.cargo-checksum.json 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -{"files":{"Cargo.toml":"c7245470d8d9538fabccd3f250add9d750aa9d7341bc7ad93a122d8c74b020fe","build.rs":"cf4c21c898e9671345d4684c75014189623574f9ec96414999a9db2d73b1e40f","src/dynamic_store.rs":"20bf39e566328f5161123924510e14c5a0cdd88ac83ce875bea60c7301bbb5da","src/dynamic_store_copy_specific.rs":"0a82d1f522a16232d8ff9a7eb8c9a6de43daa4677579d4ff012bfd31b139af2d","src/lib.rs":"a363917cffaa1bfc9a9ef7a25340f538dde4adea2c8704831e8816ccbb5c9a7f","src/network_configuration.rs":"7dcbc6ae590c23064abc8cad9c73c564c0c89a01953b45d4ee8cab876e512ecf","src/network_reachability.rs":"a8872812e757ac4a7f067478de71f06617c32e8a1096b6779791340a306e60d0","src/preferences.rs":"51f742dbfa2304b28f1981fa5d65eefb9057f07df46414ac8fcb3599ff247583","src/schema_definitions.rs":"a23e69224e2e5660dab40186273de28346959e345b898b5ee0f7e2bb58b2ba81"},"package":"a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/system-configuration-sys/Cargo.toml temporalio-1.3.0/vendor/system-configuration-sys/Cargo.toml --- temporalio-1.3.0/vendor/system-configuration-sys/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/system-configuration-sys/Cargo.toml 1970-01-01 00:00:00.000000000 +0000 @@ -1,26 +0,0 @@ -# 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 = "2021" -name = "system-configuration-sys" -version = "0.5.0" -authors = ["Mullvad VPN"] -description = "Low level bindings to SystemConfiguration framework for macOS" -keywords = ["macos", "system", "configuration", "bindings"] -categories = ["external-ffi-bindings", "os::macos-apis"] -license = "MIT OR Apache-2.0" -repository = "https://github.com/mullvad/system-configuration-rs" -[dependencies.core-foundation-sys] -version = "0.8" - -[dependencies.libc] -version = "0.2.49" diff -Nru temporalio-1.3.0/vendor/system-configuration-sys/src/dynamic_store_copy_specific.rs temporalio-1.3.0/vendor/system-configuration-sys/src/dynamic_store_copy_specific.rs --- temporalio-1.3.0/vendor/system-configuration-sys/src/dynamic_store_copy_specific.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/system-configuration-sys/src/dynamic_store_copy_specific.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,36 +0,0 @@ -// automatically generated by rust-bindgen - -// Generated using: -// bindgen 0.54.0 -// macOS SDK 10.15.4. - -use crate::dynamic_store::SCDynamicStoreRef; -use core_foundation_sys::dictionary::CFDictionaryRef; -use core_foundation_sys::string::{CFStringEncoding, CFStringRef}; - -use libc::c_uint; - -pub type __uint32_t = c_uint; -pub type __darwin_gid_t = __uint32_t; -pub type __darwin_uid_t = __uint32_t; -pub type gid_t = __darwin_gid_t; -pub type uid_t = __darwin_uid_t; -pub type UInt32 = c_uint; -extern "C" { - pub fn SCDynamicStoreCopyComputerName( - store: SCDynamicStoreRef, - nameEncoding: *mut CFStringEncoding, - ) -> CFStringRef; - - pub fn SCDynamicStoreCopyConsoleUser( - store: SCDynamicStoreRef, - uid: *mut uid_t, - gid: *mut gid_t, - ) -> CFStringRef; - - pub fn SCDynamicStoreCopyLocalHostName(store: SCDynamicStoreRef) -> CFStringRef; - - pub fn SCDynamicStoreCopyLocation(store: SCDynamicStoreRef) -> CFStringRef; - - pub fn SCDynamicStoreCopyProxies(store: SCDynamicStoreRef) -> CFDictionaryRef; -} diff -Nru temporalio-1.3.0/vendor/system-configuration-sys/src/dynamic_store.rs temporalio-1.3.0/vendor/system-configuration-sys/src/dynamic_store.rs --- temporalio-1.3.0/vendor/system-configuration-sys/src/dynamic_store.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/system-configuration-sys/src/dynamic_store.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,117 +0,0 @@ -// automatically generated by rust-bindgen - -// Generated using: -// bindgen 0.54.0 -// macOS SDK 10.15.4. - -use core::ffi::c_void; -use core_foundation_sys::array::CFArrayRef; -use core_foundation_sys::base::{Boolean, CFAllocatorRef, CFIndex, CFTypeID}; -use core_foundation_sys::dictionary::CFDictionaryRef; -use core_foundation_sys::propertylist::CFPropertyListRef; -use core_foundation_sys::runloop::CFRunLoopSourceRef; -use core_foundation_sys::string::CFStringRef; - -use crate::dispatch_queue_t; - -#[repr(C)] -pub struct __SCDynamicStore(c_void); - -pub type SCDynamicStoreRef = *const __SCDynamicStore; -#[repr(C)] -pub struct SCDynamicStoreContext { - pub version: CFIndex, - pub info: *mut ::core::ffi::c_void, - pub retain: Option< - unsafe extern "C" fn(info: *const ::core::ffi::c_void) -> *const ::core::ffi::c_void, - >, - pub release: Option, - pub copyDescription: - Option CFStringRef>, -} -pub type SCDynamicStoreCallBack = Option< - unsafe extern "C" fn( - store: SCDynamicStoreRef, - changedKeys: CFArrayRef, - info: *mut ::core::ffi::c_void, - ), ->; -extern "C" { - pub fn SCDynamicStoreGetTypeID() -> CFTypeID; - - pub fn SCDynamicStoreCreate( - allocator: CFAllocatorRef, - name: CFStringRef, - callout: SCDynamicStoreCallBack, - context: *mut SCDynamicStoreContext, - ) -> SCDynamicStoreRef; - - pub fn SCDynamicStoreCreateWithOptions( - allocator: CFAllocatorRef, - name: CFStringRef, - storeOptions: CFDictionaryRef, - callout: SCDynamicStoreCallBack, - context: *mut SCDynamicStoreContext, - ) -> SCDynamicStoreRef; - - pub static kSCDynamicStoreUseSessionKeys: CFStringRef; - - pub fn SCDynamicStoreCreateRunLoopSource( - allocator: CFAllocatorRef, - store: SCDynamicStoreRef, - order: CFIndex, - ) -> CFRunLoopSourceRef; - - pub fn SCDynamicStoreSetDispatchQueue( - store: SCDynamicStoreRef, - queue: dispatch_queue_t, - ) -> Boolean; - - pub fn SCDynamicStoreCopyKeyList(store: SCDynamicStoreRef, pattern: CFStringRef) -> CFArrayRef; - - pub fn SCDynamicStoreAddValue( - store: SCDynamicStoreRef, - key: CFStringRef, - value: CFPropertyListRef, - ) -> Boolean; - - pub fn SCDynamicStoreAddTemporaryValue( - store: SCDynamicStoreRef, - key: CFStringRef, - value: CFPropertyListRef, - ) -> Boolean; - - pub fn SCDynamicStoreCopyValue(store: SCDynamicStoreRef, key: CFStringRef) - -> CFPropertyListRef; - - pub fn SCDynamicStoreCopyMultiple( - store: SCDynamicStoreRef, - keys: CFArrayRef, - patterns: CFArrayRef, - ) -> CFDictionaryRef; - - pub fn SCDynamicStoreSetValue( - store: SCDynamicStoreRef, - key: CFStringRef, - value: CFPropertyListRef, - ) -> Boolean; - - pub fn SCDynamicStoreSetMultiple( - store: SCDynamicStoreRef, - keysToSet: CFDictionaryRef, - keysToRemove: CFArrayRef, - keysToNotify: CFArrayRef, - ) -> Boolean; - - pub fn SCDynamicStoreRemoveValue(store: SCDynamicStoreRef, key: CFStringRef) -> Boolean; - - pub fn SCDynamicStoreNotifyValue(store: SCDynamicStoreRef, key: CFStringRef) -> Boolean; - - pub fn SCDynamicStoreSetNotificationKeys( - store: SCDynamicStoreRef, - keys: CFArrayRef, - patterns: CFArrayRef, - ) -> Boolean; - - pub fn SCDynamicStoreCopyNotifiedKeys(store: SCDynamicStoreRef) -> CFArrayRef; -} diff -Nru temporalio-1.3.0/vendor/system-configuration-sys/src/lib.rs temporalio-1.3.0/vendor/system-configuration-sys/src/lib.rs --- temporalio-1.3.0/vendor/system-configuration-sys/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/system-configuration-sys/src/lib.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -// Copyright 2017 Amagicom AB. -// -// Licensed under the Apache License, Version 2.0 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -//! Low level bindings to the Apple [SystemConfiguration] framework. Generated with bindgen. -//! For a safe, higher level, API, check out the [`system-configuration`] crate. -//! -//! [SystemConfiguration]: https://developer.apple.com/documentation/systemconfiguration?language=objc -//! [`system-configuration`]: https://crates.io/crates/system-configuration - -#![no_std] -#![allow(non_camel_case_types)] -#![allow(non_upper_case_globals)] -#![allow(non_snake_case)] - -pub use core_foundation_sys; -pub use libc; - -/// This is a temporary solution. -pub type dispatch_queue_t = *mut libc::c_void; - -pub mod dynamic_store; -pub mod dynamic_store_copy_specific; -pub mod network_configuration; -pub mod network_reachability; -pub mod preferences; -pub mod schema_definitions; diff -Nru temporalio-1.3.0/vendor/system-configuration-sys/src/network_configuration.rs temporalio-1.3.0/vendor/system-configuration-sys/src/network_configuration.rs --- temporalio-1.3.0/vendor/system-configuration-sys/src/network_configuration.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/system-configuration-sys/src/network_configuration.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,389 +0,0 @@ -// automatically generated by rust-bindgen - -// Generated using: -// bindgen 0.54.0 -// macOS SDK 10.15.4. - -use core::ffi::c_void; -use core_foundation_sys::array::CFArrayRef; -use core_foundation_sys::base::{Boolean, CFAllocatorRef, CFIndex, CFTypeID}; -use core_foundation_sys::dictionary::CFDictionaryRef; -use core_foundation_sys::runloop::CFRunLoopRef; -use core_foundation_sys::string::CFStringRef; - -use crate::dispatch_queue_t; -use crate::preferences::SCPreferencesRef; -use libc::{c_char, c_int, sockaddr, socklen_t}; - -pub type __SCNetworkConnection = c_void; -pub type __SCNetworkInterface = c_void; -pub type __SCBondStatus = c_void; -pub type __SCNetworkProtocol = c_void; -pub type __SCNetworkService = c_void; -pub type __SCNetworkSet = c_void; - -pub type SCNetworkConnectionFlags = u32; -extern "C" { - pub fn SCNetworkCheckReachabilityByAddress( - address: *const sockaddr, - addrlen: socklen_t, - flags: *mut SCNetworkConnectionFlags, - ) -> Boolean; - - pub fn SCNetworkCheckReachabilityByName( - nodename: *const c_char, - flags: *mut SCNetworkConnectionFlags, - ) -> Boolean; - - pub fn SCNetworkInterfaceRefreshConfiguration(ifName: CFStringRef) -> Boolean; -} -pub type SCNetworkConnectionRef = *const __SCNetworkConnection; -#[repr(C)] -pub struct SCNetworkConnectionContext { - pub version: CFIndex, - pub info: *mut ::core::ffi::c_void, - pub retain: Option< - unsafe extern "C" fn(info: *const ::core::ffi::c_void) -> *const ::core::ffi::c_void, - >, - pub release: Option, - pub copyDescription: - Option CFStringRef>, -} -pub type SCNetworkConnectionStatus = i32; -pub type SCNetworkConnectionCallBack = Option< - unsafe extern "C" fn( - connection: SCNetworkConnectionRef, - status: SCNetworkConnectionStatus, - info: *mut ::core::ffi::c_void, - ), ->; -extern "C" { - pub fn SCNetworkConnectionGetTypeID() -> CFTypeID; - - pub fn SCNetworkConnectionCopyUserPreferences( - selectionOptions: CFDictionaryRef, - serviceID: *mut CFStringRef, - userOptions: *mut CFDictionaryRef, - ) -> Boolean; - - pub fn SCNetworkConnectionCreateWithServiceID( - allocator: CFAllocatorRef, - serviceID: CFStringRef, - callout: SCNetworkConnectionCallBack, - context: *mut SCNetworkConnectionContext, - ) -> SCNetworkConnectionRef; - - pub fn SCNetworkConnectionCopyServiceID(connection: SCNetworkConnectionRef) -> CFStringRef; - - pub fn SCNetworkConnectionGetStatus( - connection: SCNetworkConnectionRef, - ) -> SCNetworkConnectionStatus; - - pub fn SCNetworkConnectionCopyExtendedStatus( - connection: SCNetworkConnectionRef, - ) -> CFDictionaryRef; - - pub fn SCNetworkConnectionCopyStatistics(connection: SCNetworkConnectionRef) - -> CFDictionaryRef; - - pub fn SCNetworkConnectionStart( - connection: SCNetworkConnectionRef, - userOptions: CFDictionaryRef, - linger: Boolean, - ) -> Boolean; - - pub fn SCNetworkConnectionStop( - connection: SCNetworkConnectionRef, - forceDisconnect: Boolean, - ) -> Boolean; - - pub fn SCNetworkConnectionCopyUserOptions( - connection: SCNetworkConnectionRef, - ) -> CFDictionaryRef; - - pub fn SCNetworkConnectionScheduleWithRunLoop( - connection: SCNetworkConnectionRef, - runLoop: CFRunLoopRef, - runLoopMode: CFStringRef, - ) -> Boolean; - - pub fn SCNetworkConnectionUnscheduleFromRunLoop( - connection: SCNetworkConnectionRef, - runLoop: CFRunLoopRef, - runLoopMode: CFStringRef, - ) -> Boolean; - - pub fn SCNetworkConnectionSetDispatchQueue( - connection: SCNetworkConnectionRef, - queue: dispatch_queue_t, - ) -> Boolean; -} -pub type SCNetworkInterfaceRef = *const __SCNetworkInterface; -extern "C" { - pub static kSCNetworkInterfaceType6to4: CFStringRef; - - pub static kSCNetworkInterfaceTypeBluetooth: CFStringRef; - - pub static kSCNetworkInterfaceTypeBond: CFStringRef; - - pub static kSCNetworkInterfaceTypeBridge: CFStringRef; - - pub static kSCNetworkInterfaceTypeEthernet: CFStringRef; - - pub static kSCNetworkInterfaceTypeFireWire: CFStringRef; - - pub static kSCNetworkInterfaceTypeIEEE80211: CFStringRef; - - pub static kSCNetworkInterfaceTypeIPSec: CFStringRef; - - pub static kSCNetworkInterfaceTypeIrDA: CFStringRef; - - pub static kSCNetworkInterfaceTypeL2TP: CFStringRef; - - pub static kSCNetworkInterfaceTypeModem: CFStringRef; - - pub static kSCNetworkInterfaceTypePPP: CFStringRef; - - pub static kSCNetworkInterfaceTypePPTP: CFStringRef; - - pub static kSCNetworkInterfaceTypeSerial: CFStringRef; - - pub static kSCNetworkInterfaceTypeVLAN: CFStringRef; - - pub static kSCNetworkInterfaceTypeWWAN: CFStringRef; - - pub static kSCNetworkInterfaceTypeIPv4: CFStringRef; - - pub static kSCNetworkInterfaceIPv4: SCNetworkInterfaceRef; -} -pub type SCBondInterfaceRef = SCNetworkInterfaceRef; -pub type SCBondStatusRef = *const __SCBondStatus; -pub const kSCBondStatusOK: _bindgen_ty_286 = 0; -pub const kSCBondStatusLinkInvalid: _bindgen_ty_286 = 1; -pub const kSCBondStatusNoPartner: _bindgen_ty_286 = 2; -pub const kSCBondStatusNotInActiveGroup: _bindgen_ty_286 = 3; -pub const kSCBondStatusUnknown: _bindgen_ty_286 = 999; -pub type _bindgen_ty_286 = u32; -extern "C" { - pub static kSCBondStatusDeviceAggregationStatus: CFStringRef; - - pub static kSCBondStatusDeviceCollecting: CFStringRef; - - pub static kSCBondStatusDeviceDistributing: CFStringRef; -} -pub type SCNetworkProtocolRef = *const __SCNetworkProtocol; -pub type SCNetworkServiceRef = *const __SCNetworkService; -pub type SCNetworkSetRef = *const __SCNetworkSet; -extern "C" { - pub fn SCNetworkInterfaceGetTypeID() -> CFTypeID; - - pub fn SCNetworkInterfaceCopyAll() -> CFArrayRef; - - pub fn SCNetworkInterfaceGetSupportedInterfaceTypes( - interface: SCNetworkInterfaceRef, - ) -> CFArrayRef; - - pub fn SCNetworkInterfaceGetSupportedProtocolTypes( - interface: SCNetworkInterfaceRef, - ) -> CFArrayRef; - - pub fn SCNetworkInterfaceCreateWithInterface( - interface: SCNetworkInterfaceRef, - interfaceType: CFStringRef, - ) -> SCNetworkInterfaceRef; - - pub fn SCNetworkInterfaceGetBSDName(interface: SCNetworkInterfaceRef) -> CFStringRef; - - pub fn SCNetworkInterfaceGetConfiguration(interface: SCNetworkInterfaceRef) -> CFDictionaryRef; - - pub fn SCNetworkInterfaceGetExtendedConfiguration( - interface: SCNetworkInterfaceRef, - extendedType: CFStringRef, - ) -> CFDictionaryRef; - - pub fn SCNetworkInterfaceGetHardwareAddressString( - interface: SCNetworkInterfaceRef, - ) -> CFStringRef; - - pub fn SCNetworkInterfaceGetInterface( - interface: SCNetworkInterfaceRef, - ) -> SCNetworkInterfaceRef; - - pub fn SCNetworkInterfaceGetInterfaceType(interface: SCNetworkInterfaceRef) -> CFStringRef; - - pub fn SCNetworkInterfaceGetLocalizedDisplayName( - interface: SCNetworkInterfaceRef, - ) -> CFStringRef; - - pub fn SCNetworkInterfaceSetConfiguration( - interface: SCNetworkInterfaceRef, - config: CFDictionaryRef, - ) -> Boolean; - - pub fn SCNetworkInterfaceSetExtendedConfiguration( - interface: SCNetworkInterfaceRef, - extendedType: CFStringRef, - config: CFDictionaryRef, - ) -> Boolean; - - pub fn SCNetworkInterfaceCopyMediaOptions( - interface: SCNetworkInterfaceRef, - current: *mut CFDictionaryRef, - active: *mut CFDictionaryRef, - available: *mut CFArrayRef, - filter: Boolean, - ) -> Boolean; - - pub fn SCNetworkInterfaceCopyMediaSubTypes(available: CFArrayRef) -> CFArrayRef; - - pub fn SCNetworkInterfaceCopyMediaSubTypeOptions( - available: CFArrayRef, - subType: CFStringRef, - ) -> CFArrayRef; - - pub fn SCNetworkInterfaceCopyMTU( - interface: SCNetworkInterfaceRef, - mtu_cur: *mut c_int, - mtu_min: *mut c_int, - mtu_max: *mut c_int, - ) -> Boolean; - - pub fn SCNetworkInterfaceSetMediaOptions( - interface: SCNetworkInterfaceRef, - subtype: CFStringRef, - options: CFArrayRef, - ) -> Boolean; - - pub fn SCNetworkInterfaceSetMTU(interface: SCNetworkInterfaceRef, mtu: c_int) -> Boolean; - - pub fn SCNetworkInterfaceForceConfigurationRefresh(interface: SCNetworkInterfaceRef) - -> Boolean; - - pub fn SCBondInterfaceCopyAll(prefs: SCPreferencesRef) -> CFArrayRef; - - pub fn SCBondInterfaceCopyAvailableMemberInterfaces(prefs: SCPreferencesRef) -> CFArrayRef; - - pub fn SCBondInterfaceCreate(prefs: SCPreferencesRef) -> SCBondInterfaceRef; - - pub fn SCBondInterfaceRemove(bond: SCBondInterfaceRef) -> Boolean; - - pub fn SCBondInterfaceGetMemberInterfaces(bond: SCBondInterfaceRef) -> CFArrayRef; - - pub fn SCBondInterfaceGetOptions(bond: SCBondInterfaceRef) -> CFDictionaryRef; - - pub fn SCBondInterfaceSetMemberInterfaces( - bond: SCBondInterfaceRef, - members: CFArrayRef, - ) -> Boolean; - - pub fn SCBondInterfaceSetLocalizedDisplayName( - bond: SCBondInterfaceRef, - newName: CFStringRef, - ) -> Boolean; - - pub fn SCBondInterfaceSetOptions( - bond: SCBondInterfaceRef, - newOptions: CFDictionaryRef, - ) -> Boolean; - - pub fn SCBondInterfaceCopyStatus(bond: SCBondInterfaceRef) -> SCBondStatusRef; - - pub fn SCNetworkProtocolGetTypeID() -> CFTypeID; - - pub fn SCNetworkProtocolGetConfiguration(protocol: SCNetworkProtocolRef) -> CFDictionaryRef; - - pub fn SCNetworkProtocolGetEnabled(protocol: SCNetworkProtocolRef) -> Boolean; - - pub fn SCNetworkProtocolGetProtocolType(protocol: SCNetworkProtocolRef) -> CFStringRef; - - pub fn SCNetworkProtocolSetConfiguration( - protocol: SCNetworkProtocolRef, - config: CFDictionaryRef, - ) -> Boolean; - - pub fn SCNetworkProtocolSetEnabled(protocol: SCNetworkProtocolRef, enabled: Boolean) - -> Boolean; - - pub fn SCNetworkServiceGetTypeID() -> CFTypeID; - - pub fn SCNetworkServiceAddProtocolType( - service: SCNetworkServiceRef, - protocolType: CFStringRef, - ) -> Boolean; - - pub fn SCNetworkServiceCopyAll(prefs: SCPreferencesRef) -> CFArrayRef; - - pub fn SCNetworkServiceCopyProtocols(service: SCNetworkServiceRef) -> CFArrayRef; - - pub fn SCNetworkServiceCreate( - prefs: SCPreferencesRef, - interface: SCNetworkInterfaceRef, - ) -> SCNetworkServiceRef; - - pub fn SCNetworkServiceCopy( - prefs: SCPreferencesRef, - serviceID: CFStringRef, - ) -> SCNetworkServiceRef; - - pub fn SCNetworkServiceEstablishDefaultConfiguration(service: SCNetworkServiceRef) -> Boolean; - - pub fn SCNetworkServiceGetEnabled(service: SCNetworkServiceRef) -> Boolean; - - pub fn SCNetworkServiceGetInterface(service: SCNetworkServiceRef) -> SCNetworkInterfaceRef; - - pub fn SCNetworkServiceGetName(service: SCNetworkServiceRef) -> CFStringRef; - - pub fn SCNetworkServiceCopyProtocol( - service: SCNetworkServiceRef, - protocolType: CFStringRef, - ) -> SCNetworkProtocolRef; - - pub fn SCNetworkServiceGetServiceID(service: SCNetworkServiceRef) -> CFStringRef; - - pub fn SCNetworkServiceRemove(service: SCNetworkServiceRef) -> Boolean; - - pub fn SCNetworkServiceRemoveProtocolType( - service: SCNetworkServiceRef, - protocolType: CFStringRef, - ) -> Boolean; - - pub fn SCNetworkServiceSetEnabled(service: SCNetworkServiceRef, enabled: Boolean) -> Boolean; - - pub fn SCNetworkServiceSetName(service: SCNetworkServiceRef, name: CFStringRef) -> Boolean; - - pub fn SCNetworkSetGetTypeID() -> CFTypeID; - - pub fn SCNetworkSetAddService(set: SCNetworkSetRef, service: SCNetworkServiceRef) -> Boolean; - - pub fn SCNetworkSetContainsInterface( - set: SCNetworkSetRef, - interface: SCNetworkInterfaceRef, - ) -> Boolean; - - pub fn SCNetworkSetCopyAll(prefs: SCPreferencesRef) -> CFArrayRef; - - pub fn SCNetworkSetCopyCurrent(prefs: SCPreferencesRef) -> SCNetworkSetRef; - - pub fn SCNetworkSetCopyServices(set: SCNetworkSetRef) -> CFArrayRef; - - pub fn SCNetworkSetCreate(prefs: SCPreferencesRef) -> SCNetworkSetRef; - - pub fn SCNetworkSetCopy(prefs: SCPreferencesRef, setID: CFStringRef) -> SCNetworkSetRef; - - pub fn SCNetworkSetGetName(set: SCNetworkSetRef) -> CFStringRef; - - pub fn SCNetworkSetGetSetID(set: SCNetworkSetRef) -> CFStringRef; - - pub fn SCNetworkSetGetServiceOrder(set: SCNetworkSetRef) -> CFArrayRef; - - pub fn SCNetworkSetRemove(set: SCNetworkSetRef) -> Boolean; - - pub fn SCNetworkSetRemoveService(set: SCNetworkSetRef, service: SCNetworkServiceRef) - -> Boolean; - - pub fn SCNetworkSetSetCurrent(set: SCNetworkSetRef) -> Boolean; - - pub fn SCNetworkSetSetName(set: SCNetworkSetRef, name: CFStringRef) -> Boolean; - - pub fn SCNetworkSetSetServiceOrder(set: SCNetworkSetRef, newOrder: CFArrayRef) -> Boolean; -} diff -Nru temporalio-1.3.0/vendor/system-configuration-sys/src/network_reachability.rs temporalio-1.3.0/vendor/system-configuration-sys/src/network_reachability.rs --- temporalio-1.3.0/vendor/system-configuration-sys/src/network_reachability.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/system-configuration-sys/src/network_reachability.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,92 +0,0 @@ -// automatically generated by rust-bindgen - -// Generated using: -// bindgen 0.54.0 -// macOS SDK 10.15.4. - -#![cfg_attr(feature = "cargo-clippy", allow(clippy::unreadable_literal))] -use crate::dispatch_queue_t; -use core_foundation_sys::base::{Boolean, CFAllocatorRef, CFIndex, CFTypeID}; -use core_foundation_sys::runloop::CFRunLoopRef; -use core_foundation_sys::string::CFStringRef; -use libc::{c_char, c_void, sockaddr}; -pub type __SCNetworkReachability = c_void; - -pub type SCNetworkReachabilityRef = *const __SCNetworkReachability; -#[repr(C)] -pub struct SCNetworkReachabilityContext { - pub version: CFIndex, - pub info: *mut ::core::ffi::c_void, - pub retain: Option< - unsafe extern "C" fn(info: *const ::core::ffi::c_void) -> *const ::core::ffi::c_void, - >, - pub release: Option, - pub copyDescription: - Option CFStringRef>, -} -pub type SCNetworkReachabilityFlags = u32; -pub const kSCNetworkReachabilityFlagsTransientConnection: _bindgen_ty_64 = 1; -pub const kSCNetworkReachabilityFlagsReachable: _bindgen_ty_64 = 2; -pub const kSCNetworkReachabilityFlagsConnectionRequired: _bindgen_ty_64 = 4; -pub const kSCNetworkReachabilityFlagsConnectionOnTraffic: _bindgen_ty_64 = 8; -pub const kSCNetworkReachabilityFlagsInterventionRequired: _bindgen_ty_64 = 16; -pub const kSCNetworkReachabilityFlagsConnectionOnDemand: _bindgen_ty_64 = 32; -pub const kSCNetworkReachabilityFlagsIsLocalAddress: _bindgen_ty_64 = 65536; -pub const kSCNetworkReachabilityFlagsIsDirect: _bindgen_ty_64 = 131072; -pub const kSCNetworkReachabilityFlagsIsWWAN: _bindgen_ty_64 = 262144; -pub const kSCNetworkReachabilityFlagsConnectionAutomatic: _bindgen_ty_64 = 8; -pub type _bindgen_ty_64 = u32; -pub type SCNetworkReachabilityCallBack = Option< - unsafe extern "C" fn( - target: SCNetworkReachabilityRef, - flags: SCNetworkReachabilityFlags, - info: *mut ::core::ffi::c_void, - ), ->; -extern "C" { - pub fn SCNetworkReachabilityCreateWithAddress( - allocator: CFAllocatorRef, - address: *const sockaddr, - ) -> SCNetworkReachabilityRef; - - pub fn SCNetworkReachabilityCreateWithAddressPair( - allocator: CFAllocatorRef, - localAddress: *const sockaddr, - remoteAddress: *const sockaddr, - ) -> SCNetworkReachabilityRef; - - pub fn SCNetworkReachabilityCreateWithName( - allocator: CFAllocatorRef, - nodename: *const c_char, - ) -> SCNetworkReachabilityRef; - - pub fn SCNetworkReachabilityGetTypeID() -> CFTypeID; - - pub fn SCNetworkReachabilityGetFlags( - target: SCNetworkReachabilityRef, - flags: *mut SCNetworkReachabilityFlags, - ) -> Boolean; - - pub fn SCNetworkReachabilitySetCallback( - target: SCNetworkReachabilityRef, - callout: SCNetworkReachabilityCallBack, - context: *mut SCNetworkReachabilityContext, - ) -> Boolean; - - pub fn SCNetworkReachabilityScheduleWithRunLoop( - target: SCNetworkReachabilityRef, - runLoop: CFRunLoopRef, - runLoopMode: CFStringRef, - ) -> Boolean; - - pub fn SCNetworkReachabilityUnscheduleFromRunLoop( - target: SCNetworkReachabilityRef, - runLoop: CFRunLoopRef, - runLoopMode: CFStringRef, - ) -> Boolean; - - pub fn SCNetworkReachabilitySetDispatchQueue( - target: SCNetworkReachabilityRef, - queue: dispatch_queue_t, - ) -> Boolean; -} diff -Nru temporalio-1.3.0/vendor/system-configuration-sys/src/preferences.rs temporalio-1.3.0/vendor/system-configuration-sys/src/preferences.rs --- temporalio-1.3.0/vendor/system-configuration-sys/src/preferences.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/system-configuration-sys/src/preferences.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,109 +0,0 @@ -// automatically generated by rust-bindgen - -// Generated using: -// bindgen 0.54.0 -// macOS SDK 10.15.4. - -use core::ffi::c_void; -use core_foundation_sys::array::CFArrayRef; -use core_foundation_sys::base::{Boolean, CFAllocatorRef, CFIndex, CFTypeID}; -use core_foundation_sys::data::CFDataRef; -use core_foundation_sys::propertylist::CFPropertyListRef; -use core_foundation_sys::runloop::CFRunLoopRef; -use core_foundation_sys::string::CFStringRef; - -use crate::dispatch_queue_t; - -pub type AuthorizationOpaqueRef = c_void; -pub type __SCPreferences = c_void; - -pub type AuthorizationRef = *const AuthorizationOpaqueRef; -pub type SCPreferencesRef = *const __SCPreferences; -pub type SCPreferencesNotification = u32; -#[repr(C)] -pub struct SCPreferencesContext { - pub version: CFIndex, - pub info: *mut ::core::ffi::c_void, - pub retain: Option< - unsafe extern "C" fn(info: *const ::core::ffi::c_void) -> *const ::core::ffi::c_void, - >, - pub release: Option, - pub copyDescription: - Option CFStringRef>, -} -pub type SCPreferencesCallBack = Option< - unsafe extern "C" fn( - prefs: SCPreferencesRef, - notificationType: SCPreferencesNotification, - info: *mut ::core::ffi::c_void, - ), ->; -extern "C" { - pub fn SCPreferencesGetTypeID() -> CFTypeID; - - pub fn SCPreferencesCreate( - allocator: CFAllocatorRef, - name: CFStringRef, - prefsID: CFStringRef, - ) -> SCPreferencesRef; - - pub fn SCPreferencesCreateWithAuthorization( - allocator: CFAllocatorRef, - name: CFStringRef, - prefsID: CFStringRef, - authorization: AuthorizationRef, - ) -> SCPreferencesRef; - - pub fn SCPreferencesLock(prefs: SCPreferencesRef, wait: Boolean) -> Boolean; - - pub fn SCPreferencesCommitChanges(prefs: SCPreferencesRef) -> Boolean; - - pub fn SCPreferencesApplyChanges(prefs: SCPreferencesRef) -> Boolean; - - pub fn SCPreferencesUnlock(prefs: SCPreferencesRef) -> Boolean; - - pub fn SCPreferencesGetSignature(prefs: SCPreferencesRef) -> CFDataRef; - - pub fn SCPreferencesCopyKeyList(prefs: SCPreferencesRef) -> CFArrayRef; - - pub fn SCPreferencesGetValue(prefs: SCPreferencesRef, key: CFStringRef) -> CFPropertyListRef; - - pub fn SCPreferencesAddValue( - prefs: SCPreferencesRef, - key: CFStringRef, - value: CFPropertyListRef, - ) -> Boolean; - - pub fn SCPreferencesSetValue( - prefs: SCPreferencesRef, - key: CFStringRef, - value: CFPropertyListRef, - ) -> Boolean; - - pub fn SCPreferencesRemoveValue(prefs: SCPreferencesRef, key: CFStringRef) -> Boolean; - - pub fn SCPreferencesSetCallback( - prefs: SCPreferencesRef, - callout: SCPreferencesCallBack, - context: *mut SCPreferencesContext, - ) -> Boolean; - - pub fn SCPreferencesScheduleWithRunLoop( - prefs: SCPreferencesRef, - runLoop: CFRunLoopRef, - runLoopMode: CFStringRef, - ) -> Boolean; - - pub fn SCPreferencesUnscheduleFromRunLoop( - prefs: SCPreferencesRef, - runLoop: CFRunLoopRef, - runLoopMode: CFStringRef, - ) -> Boolean; - - pub fn SCPreferencesSetDispatchQueue( - prefs: SCPreferencesRef, - queue: dispatch_queue_t, - ) -> Boolean; - - pub fn SCPreferencesSynchronize(prefs: SCPreferencesRef); -} diff -Nru temporalio-1.3.0/vendor/system-configuration-sys/src/schema_definitions.rs temporalio-1.3.0/vendor/system-configuration-sys/src/schema_definitions.rs --- temporalio-1.3.0/vendor/system-configuration-sys/src/schema_definitions.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/system-configuration-sys/src/schema_definitions.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,543 +0,0 @@ -// automatically generated by rust-bindgen - -// Generated using: -// bindgen 0.54.0 -// macOS SDK 10.15.4. - -use core_foundation_sys::string::CFStringRef; - -extern "C" { - pub static kSCResvLink: CFStringRef; - - pub static kSCResvInactive: CFStringRef; - - pub static kSCPropInterfaceName: CFStringRef; - - pub static kSCPropMACAddress: CFStringRef; - - pub static kSCPropUserDefinedName: CFStringRef; - - pub static kSCPropVersion: CFStringRef; - - pub static kSCPrefCurrentSet: CFStringRef; - - pub static kSCPrefNetworkServices: CFStringRef; - - pub static kSCPrefSets: CFStringRef; - - pub static kSCPrefSystem: CFStringRef; - - pub static kSCCompNetwork: CFStringRef; - - pub static kSCCompService: CFStringRef; - - pub static kSCCompGlobal: CFStringRef; - - pub static kSCCompHostNames: CFStringRef; - - pub static kSCCompInterface: CFStringRef; - - pub static kSCCompSystem: CFStringRef; - - pub static kSCCompUsers: CFStringRef; - - pub static kSCCompAnyRegex: CFStringRef; - - pub static kSCEntNetAirPort: CFStringRef; - - pub static kSCEntNetDHCP: CFStringRef; - - pub static kSCEntNetDNS: CFStringRef; - - pub static kSCEntNetEthernet: CFStringRef; - - pub static kSCEntNetFireWire: CFStringRef; - - pub static kSCEntNetInterface: CFStringRef; - - pub static kSCEntNetIPSec: CFStringRef; - - pub static kSCEntNetIPv4: CFStringRef; - - pub static kSCEntNetIPv6: CFStringRef; - - pub static kSCEntNetL2TP: CFStringRef; - - pub static kSCEntNetLink: CFStringRef; - - pub static kSCEntNetModem: CFStringRef; - - pub static kSCEntNetPPP: CFStringRef; - - pub static kSCEntNetPPPoE: CFStringRef; - - pub static kSCEntNetPPPSerial: CFStringRef; - - pub static kSCEntNetPPTP: CFStringRef; - - pub static kSCEntNetProxies: CFStringRef; - - pub static kSCEntNetSMB: CFStringRef; - - pub static kSCEntNet6to4: CFStringRef; - - pub static kSCPropNetOverridePrimary: CFStringRef; - - pub static kSCPropNetServiceOrder: CFStringRef; - - pub static kSCPropNetPPPOverridePrimary: CFStringRef; - - pub static kSCPropNetInterfaces: CFStringRef; - - pub static kSCPropNetLocalHostName: CFStringRef; - - pub static kSCPropNetAirPortAllowNetCreation: CFStringRef; - - pub static kSCPropNetAirPortAuthPassword: CFStringRef; - - pub static kSCPropNetAirPortAuthPasswordEncryption: CFStringRef; - - pub static kSCPropNetAirPortJoinMode: CFStringRef; - - pub static kSCPropNetAirPortPowerEnabled: CFStringRef; - - pub static kSCPropNetAirPortPreferredNetwork: CFStringRef; - - pub static kSCPropNetAirPortSavePasswords: CFStringRef; - - pub static kSCValNetAirPortJoinModeAutomatic: CFStringRef; - - pub static kSCValNetAirPortJoinModePreferred: CFStringRef; - - pub static kSCValNetAirPortJoinModeRanked: CFStringRef; - - pub static kSCValNetAirPortJoinModeRecent: CFStringRef; - - pub static kSCValNetAirPortJoinModeStrongest: CFStringRef; - - pub static kSCValNetAirPortAuthPasswordEncryptionKeychain: CFStringRef; - - pub static kSCPropNetDNSDomainName: CFStringRef; - - pub static kSCPropNetDNSOptions: CFStringRef; - - pub static kSCPropNetDNSSearchDomains: CFStringRef; - - pub static kSCPropNetDNSSearchOrder: CFStringRef; - - pub static kSCPropNetDNSServerAddresses: CFStringRef; - - pub static kSCPropNetDNSServerPort: CFStringRef; - - pub static kSCPropNetDNSServerTimeout: CFStringRef; - - pub static kSCPropNetDNSSortList: CFStringRef; - - pub static kSCPropNetDNSSupplementalMatchDomains: CFStringRef; - - pub static kSCPropNetDNSSupplementalMatchOrders: CFStringRef; - - pub static kSCPropNetEthernetMediaSubType: CFStringRef; - - pub static kSCPropNetEthernetMediaOptions: CFStringRef; - - pub static kSCPropNetEthernetMTU: CFStringRef; - - pub static kSCPropNetInterfaceDeviceName: CFStringRef; - - pub static kSCPropNetInterfaceHardware: CFStringRef; - - pub static kSCPropNetInterfaceType: CFStringRef; - - pub static kSCPropNetInterfaceSubType: CFStringRef; - - pub static kSCPropNetInterfaceSupportsModemOnHold: CFStringRef; - - pub static kSCValNetInterfaceTypeEthernet: CFStringRef; - - pub static kSCValNetInterfaceTypeFireWire: CFStringRef; - - pub static kSCValNetInterfaceTypePPP: CFStringRef; - - pub static kSCValNetInterfaceType6to4: CFStringRef; - - pub static kSCValNetInterfaceTypeIPSec: CFStringRef; - - pub static kSCValNetInterfaceSubTypePPPoE: CFStringRef; - - pub static kSCValNetInterfaceSubTypePPPSerial: CFStringRef; - - pub static kSCValNetInterfaceSubTypePPTP: CFStringRef; - - pub static kSCValNetInterfaceSubTypeL2TP: CFStringRef; - - pub static kSCPropNetIPSecAuthenticationMethod: CFStringRef; - - pub static kSCPropNetIPSecLocalCertificate: CFStringRef; - - pub static kSCPropNetIPSecLocalIdentifier: CFStringRef; - - pub static kSCPropNetIPSecLocalIdentifierType: CFStringRef; - - pub static kSCPropNetIPSecSharedSecret: CFStringRef; - - pub static kSCPropNetIPSecSharedSecretEncryption: CFStringRef; - - pub static kSCPropNetIPSecConnectTime: CFStringRef; - - pub static kSCPropNetIPSecRemoteAddress: CFStringRef; - - pub static kSCPropNetIPSecStatus: CFStringRef; - - pub static kSCPropNetIPSecXAuthEnabled: CFStringRef; - - pub static kSCPropNetIPSecXAuthName: CFStringRef; - - pub static kSCPropNetIPSecXAuthPassword: CFStringRef; - - pub static kSCPropNetIPSecXAuthPasswordEncryption: CFStringRef; - - pub static kSCValNetIPSecAuthenticationMethodSharedSecret: CFStringRef; - - pub static kSCValNetIPSecAuthenticationMethodCertificate: CFStringRef; - - pub static kSCValNetIPSecAuthenticationMethodHybrid: CFStringRef; - - pub static kSCValNetIPSecLocalIdentifierTypeKeyID: CFStringRef; - - pub static kSCValNetIPSecSharedSecretEncryptionKeychain: CFStringRef; - - pub static kSCValNetIPSecXAuthPasswordEncryptionKeychain: CFStringRef; - - pub static kSCValNetIPSecXAuthPasswordEncryptionPrompt: CFStringRef; - - pub static kSCPropNetIPv4Addresses: CFStringRef; - - pub static kSCPropNetIPv4ConfigMethod: CFStringRef; - - pub static kSCPropNetIPv4DHCPClientID: CFStringRef; - - pub static kSCPropNetIPv4Router: CFStringRef; - - pub static kSCPropNetIPv4SubnetMasks: CFStringRef; - - pub static kSCPropNetIPv4DestAddresses: CFStringRef; - - pub static kSCPropNetIPv4BroadcastAddresses: CFStringRef; - - pub static kSCValNetIPv4ConfigMethodAutomatic: CFStringRef; - - pub static kSCValNetIPv4ConfigMethodBOOTP: CFStringRef; - - pub static kSCValNetIPv4ConfigMethodDHCP: CFStringRef; - - pub static kSCValNetIPv4ConfigMethodINFORM: CFStringRef; - - pub static kSCValNetIPv4ConfigMethodLinkLocal: CFStringRef; - - pub static kSCValNetIPv4ConfigMethodManual: CFStringRef; - - pub static kSCValNetIPv4ConfigMethodPPP: CFStringRef; - - pub static kSCPropNetIPv6Addresses: CFStringRef; - - pub static kSCPropNetIPv6ConfigMethod: CFStringRef; - - pub static kSCPropNetIPv6DestAddresses: CFStringRef; - - pub static kSCPropNetIPv6Flags: CFStringRef; - - pub static kSCPropNetIPv6PrefixLength: CFStringRef; - - pub static kSCPropNetIPv6Router: CFStringRef; - - pub static kSCValNetIPv6ConfigMethodAutomatic: CFStringRef; - - pub static kSCValNetIPv6ConfigMethodLinkLocal: CFStringRef; - - pub static kSCValNetIPv6ConfigMethodManual: CFStringRef; - - pub static kSCValNetIPv6ConfigMethodRouterAdvertisement: CFStringRef; - - pub static kSCValNetIPv6ConfigMethod6to4: CFStringRef; - - pub static kSCPropNet6to4Relay: CFStringRef; - - pub static kSCPropNetLinkActive: CFStringRef; - - pub static kSCPropNetLinkDetaching: CFStringRef; - - pub static kSCPropNetModemAccessPointName: CFStringRef; - - pub static kSCPropNetModemConnectionPersonality: CFStringRef; - - pub static kSCPropNetModemConnectionScript: CFStringRef; - - pub static kSCPropNetModemConnectSpeed: CFStringRef; - - pub static kSCPropNetModemDataCompression: CFStringRef; - - pub static kSCPropNetModemDeviceContextID: CFStringRef; - - pub static kSCPropNetModemDeviceModel: CFStringRef; - - pub static kSCPropNetModemDeviceVendor: CFStringRef; - - pub static kSCPropNetModemDialMode: CFStringRef; - - pub static kSCPropNetModemErrorCorrection: CFStringRef; - - pub static kSCPropNetModemHoldCallWaitingAudibleAlert: CFStringRef; - - pub static kSCPropNetModemHoldDisconnectOnAnswer: CFStringRef; - - pub static kSCPropNetModemHoldEnabled: CFStringRef; - - pub static kSCPropNetModemHoldReminder: CFStringRef; - - pub static kSCPropNetModemHoldReminderTime: CFStringRef; - - pub static kSCPropNetModemNote: CFStringRef; - - pub static kSCPropNetModemPulseDial: CFStringRef; - - pub static kSCPropNetModemSpeaker: CFStringRef; - - pub static kSCPropNetModemSpeed: CFStringRef; - - pub static kSCValNetModemDialModeIgnoreDialTone: CFStringRef; - - pub static kSCValNetModemDialModeManual: CFStringRef; - - pub static kSCValNetModemDialModeWaitForDialTone: CFStringRef; - - pub static kSCPropNetPPPACSPEnabled: CFStringRef; - - pub static kSCPropNetPPPConnectTime: CFStringRef; - - pub static kSCPropNetPPPDeviceLastCause: CFStringRef; - - pub static kSCPropNetPPPDialOnDemand: CFStringRef; - - pub static kSCPropNetPPPDisconnectOnFastUserSwitch: CFStringRef; - - pub static kSCPropNetPPPDisconnectOnIdle: CFStringRef; - - pub static kSCPropNetPPPDisconnectOnIdleTimer: CFStringRef; - - pub static kSCPropNetPPPDisconnectOnLogout: CFStringRef; - - pub static kSCPropNetPPPDisconnectOnSleep: CFStringRef; - - pub static kSCPropNetPPPDisconnectTime: CFStringRef; - - pub static kSCPropNetPPPIdleReminder: CFStringRef; - - pub static kSCPropNetPPPIdleReminderTimer: CFStringRef; - - pub static kSCPropNetPPPLastCause: CFStringRef; - - pub static kSCPropNetPPPLogfile: CFStringRef; - - pub static kSCPropNetPPPPlugins: CFStringRef; - - pub static kSCPropNetPPPRetryConnectTime: CFStringRef; - - pub static kSCPropNetPPPSessionTimer: CFStringRef; - - pub static kSCPropNetPPPStatus: CFStringRef; - - pub static kSCPropNetPPPUseSessionTimer: CFStringRef; - - pub static kSCPropNetPPPVerboseLogging: CFStringRef; - - pub static kSCPropNetPPPAuthEAPPlugins: CFStringRef; - - pub static kSCPropNetPPPAuthName: CFStringRef; - - pub static kSCPropNetPPPAuthPassword: CFStringRef; - - pub static kSCPropNetPPPAuthPasswordEncryption: CFStringRef; - - pub static kSCPropNetPPPAuthPrompt: CFStringRef; - - pub static kSCPropNetPPPAuthProtocol: CFStringRef; - - pub static kSCValNetPPPAuthPasswordEncryptionKeychain: CFStringRef; - - pub static kSCValNetPPPAuthPasswordEncryptionToken: CFStringRef; - - pub static kSCValNetPPPAuthPromptBefore: CFStringRef; - - pub static kSCValNetPPPAuthPromptAfter: CFStringRef; - - pub static kSCValNetPPPAuthProtocolCHAP: CFStringRef; - - pub static kSCValNetPPPAuthProtocolEAP: CFStringRef; - - pub static kSCValNetPPPAuthProtocolMSCHAP1: CFStringRef; - - pub static kSCValNetPPPAuthProtocolMSCHAP2: CFStringRef; - - pub static kSCValNetPPPAuthProtocolPAP: CFStringRef; - - pub static kSCPropNetPPPCommAlternateRemoteAddress: CFStringRef; - - pub static kSCPropNetPPPCommConnectDelay: CFStringRef; - - pub static kSCPropNetPPPCommDisplayTerminalWindow: CFStringRef; - - pub static kSCPropNetPPPCommRedialCount: CFStringRef; - - pub static kSCPropNetPPPCommRedialEnabled: CFStringRef; - - pub static kSCPropNetPPPCommRedialInterval: CFStringRef; - - pub static kSCPropNetPPPCommRemoteAddress: CFStringRef; - - pub static kSCPropNetPPPCommTerminalScript: CFStringRef; - - pub static kSCPropNetPPPCommUseTerminalScript: CFStringRef; - - pub static kSCPropNetPPPCCPEnabled: CFStringRef; - - pub static kSCPropNetPPPCCPMPPE40Enabled: CFStringRef; - - pub static kSCPropNetPPPCCPMPPE128Enabled: CFStringRef; - - pub static kSCPropNetPPPIPCPCompressionVJ: CFStringRef; - - pub static kSCPropNetPPPIPCPUsePeerDNS: CFStringRef; - - pub static kSCPropNetPPPLCPEchoEnabled: CFStringRef; - - pub static kSCPropNetPPPLCPEchoFailure: CFStringRef; - - pub static kSCPropNetPPPLCPEchoInterval: CFStringRef; - - pub static kSCPropNetPPPLCPCompressionACField: CFStringRef; - - pub static kSCPropNetPPPLCPCompressionPField: CFStringRef; - - pub static kSCPropNetPPPLCPMRU: CFStringRef; - - pub static kSCPropNetPPPLCPMTU: CFStringRef; - - pub static kSCPropNetPPPLCPReceiveACCM: CFStringRef; - - pub static kSCPropNetPPPLCPTransmitACCM: CFStringRef; - - pub static kSCPropNetL2TPIPSecSharedSecret: CFStringRef; - - pub static kSCPropNetL2TPIPSecSharedSecretEncryption: CFStringRef; - - pub static kSCPropNetL2TPTransport: CFStringRef; - - pub static kSCValNetL2TPIPSecSharedSecretEncryptionKeychain: CFStringRef; - - pub static kSCValNetL2TPTransportIP: CFStringRef; - - pub static kSCValNetL2TPTransportIPSec: CFStringRef; - - pub static kSCPropNetProxiesExceptionsList: CFStringRef; - - pub static kSCPropNetProxiesExcludeSimpleHostnames: CFStringRef; - - pub static kSCPropNetProxiesFTPEnable: CFStringRef; - - pub static kSCPropNetProxiesFTPPassive: CFStringRef; - - pub static kSCPropNetProxiesFTPPort: CFStringRef; - - pub static kSCPropNetProxiesFTPProxy: CFStringRef; - - pub static kSCPropNetProxiesGopherEnable: CFStringRef; - - pub static kSCPropNetProxiesGopherPort: CFStringRef; - - pub static kSCPropNetProxiesGopherProxy: CFStringRef; - - pub static kSCPropNetProxiesHTTPEnable: CFStringRef; - - pub static kSCPropNetProxiesHTTPPort: CFStringRef; - - pub static kSCPropNetProxiesHTTPProxy: CFStringRef; - - pub static kSCPropNetProxiesHTTPSEnable: CFStringRef; - - pub static kSCPropNetProxiesHTTPSPort: CFStringRef; - - pub static kSCPropNetProxiesHTTPSProxy: CFStringRef; - - pub static kSCPropNetProxiesRTSPEnable: CFStringRef; - - pub static kSCPropNetProxiesRTSPPort: CFStringRef; - - pub static kSCPropNetProxiesRTSPProxy: CFStringRef; - - pub static kSCPropNetProxiesSOCKSEnable: CFStringRef; - - pub static kSCPropNetProxiesSOCKSPort: CFStringRef; - - pub static kSCPropNetProxiesSOCKSProxy: CFStringRef; - - pub static kSCPropNetProxiesProxyAutoConfigEnable: CFStringRef; - - pub static kSCPropNetProxiesProxyAutoConfigJavaScript: CFStringRef; - - pub static kSCPropNetProxiesProxyAutoConfigURLString: CFStringRef; - - pub static kSCPropNetProxiesProxyAutoDiscoveryEnable: CFStringRef; - - pub static kSCPropNetSMBNetBIOSName: CFStringRef; - - pub static kSCPropNetSMBNetBIOSNodeType: CFStringRef; - - pub static kSCPropNetSMBNetBIOSScope: CFStringRef; - - pub static kSCPropNetSMBWINSAddresses: CFStringRef; - - pub static kSCPropNetSMBWorkgroup: CFStringRef; - - pub static kSCValNetSMBNetBIOSNodeTypeBroadcast: CFStringRef; - - pub static kSCValNetSMBNetBIOSNodeTypePeer: CFStringRef; - - pub static kSCValNetSMBNetBIOSNodeTypeMixed: CFStringRef; - - pub static kSCValNetSMBNetBIOSNodeTypeHybrid: CFStringRef; - - pub static kSCEntUsersConsoleUser: CFStringRef; - - pub static kSCPropSystemComputerName: CFStringRef; - - pub static kSCPropSystemComputerNameEncoding: CFStringRef; - - pub static kSCDynamicStoreDomainFile: CFStringRef; - - pub static kSCDynamicStoreDomainPlugin: CFStringRef; - - pub static kSCDynamicStoreDomainSetup: CFStringRef; - - pub static kSCDynamicStoreDomainState: CFStringRef; - - pub static kSCDynamicStoreDomainPrefs: CFStringRef; - - pub static kSCDynamicStorePropSetupCurrentSet: CFStringRef; - - pub static kSCDynamicStorePropSetupLastUpdated: CFStringRef; - - pub static kSCDynamicStorePropNetInterfaces: CFStringRef; - - pub static kSCDynamicStorePropNetPrimaryInterface: CFStringRef; - - pub static kSCDynamicStorePropNetPrimaryService: CFStringRef; - - pub static kSCDynamicStorePropNetServiceIDs: CFStringRef; - - pub static kSCPropUsersConsoleUserName: CFStringRef; - - pub static kSCPropUsersConsoleUserUID: CFStringRef; - - pub static kSCPropUsersConsoleUserGID: CFStringRef; -} diff -Nru temporalio-1.3.0/vendor/target-lexicon/.cargo-checksum.json temporalio-1.3.0/vendor/target-lexicon/.cargo-checksum.json --- temporalio-1.3.0/vendor/target-lexicon/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/target-lexicon/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"Cargo.lock":"456978ebff2352328a676dede5d66c24572634f495693b64ccfe7d45c03f39d9","Cargo.toml":"34573d5fbde6665e477c5c794e3f0a8fa61722bf4000da678768580441343d83","LICENSE":"268872b9816f90fd8e85db5a28d33f8150ebb8dd016653fb39ef1f94f2686bc5","README.md":"c3467056d91be3f59562158ee9604c729b5b5f473efbefb036032803eb76809e","build.rs":"678ba872ef2254e8901d6a00536f64d74d375d919f845113bd3ded709b6edb4a","examples/host.rs":"503bafddfb372123fe4dc0e7b8037808beb5bfe6df60c00d3315922bd3792c6c","examples/misc.rs":"49a579845450b7b020ed5c97dca142fc548725893cbc82f6f750ee0caab2beca","scripts/rust-targets.sh":"89564342916321c5bc35e772d374a7f0af22cc9ae6dcc0027eca48d2269f18cb","src/data_model.rs":"38c0c184ee65b882872298127d9c6878292bd12c139792e82328a5facc2428ae","src/host.rs":"d742406eba58f35c4c9f1041e506bb63d6c0eb752c2e88f4a6646538ef1aba38","src/lib.rs":"d18401920ad8b1bd1bce505c2c9f8bf8724f123919234d6007f80634b3d306d5","src/parse_error.rs":"b3735eabc0fd0a9dfdd6375662f20ec96a79852a00a05a98fb2e421545285e53","src/targets.rs":"8cacd69c71d9d22a11268b5e326fd4f94185546a0be302c008757915b1509e49","src/triple.rs":"aa8cec103b077bf679daab97f0a23c85476aece2ef18f117bf8d69d55bbd6ea0"},"package":"14c39fd04924ca3a864207c66fc2cd7d22d7c016007f9ce846cbb9326331930a"} \ No newline at end of file +{"files":{"Cargo.lock":"5bcb176ac7da0238ae235571a00a527140e221761f51f557370568e797804af3","Cargo.toml":"87b7daec5106f369f35f90144be03641b504db718c4733304202c683d83d64e6","LICENSE":"268872b9816f90fd8e85db5a28d33f8150ebb8dd016653fb39ef1f94f2686bc5","README.md":"c3467056d91be3f59562158ee9604c729b5b5f473efbefb036032803eb76809e","build.rs":"678ba872ef2254e8901d6a00536f64d74d375d919f845113bd3ded709b6edb4a","examples/host.rs":"503bafddfb372123fe4dc0e7b8037808beb5bfe6df60c00d3315922bd3792c6c","examples/misc.rs":"49a579845450b7b020ed5c97dca142fc548725893cbc82f6f750ee0caab2beca","scripts/rust-targets.sh":"89564342916321c5bc35e772d374a7f0af22cc9ae6dcc0027eca48d2269f18cb","src/data_model.rs":"38c0c184ee65b882872298127d9c6878292bd12c139792e82328a5facc2428ae","src/host.rs":"d742406eba58f35c4c9f1041e506bb63d6c0eb752c2e88f4a6646538ef1aba38","src/lib.rs":"d18401920ad8b1bd1bce505c2c9f8bf8724f123919234d6007f80634b3d306d5","src/parse_error.rs":"b3735eabc0fd0a9dfdd6375662f20ec96a79852a00a05a98fb2e421545285e53","src/targets.rs":"5ae76162c6e8746ae63f6ba73ad0f3971531b7ccae6f916ad3d368caedd889fb","src/triple.rs":"aa8cec103b077bf679daab97f0a23c85476aece2ef18f117bf8d69d55bbd6ea0"},"package":"9d0e916b1148c8e263850e1ebcbd046f333e0683c724876bb0da63ea4373dc8a"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/target-lexicon/Cargo.lock temporalio-1.3.0/vendor/target-lexicon/Cargo.lock --- temporalio-1.3.0/vendor/target-lexicon/Cargo.lock 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/target-lexicon/Cargo.lock 2023-10-30 19:40:00.000000000 +0000 @@ -4,59 +4,27 @@ [[package]] name = "itoa" -version = "1.0.9" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" - -[[package]] -name = "proc-macro2" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "quote" -version = "1.0.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" -dependencies = [ - "proc-macro2", -] +checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" [[package]] name = "ryu" -version = "1.0.15" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" +checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" [[package]] name = "serde" -version = "1.0.189" +version = "1.0.164" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e422a44e74ad4001bdc8eede9a4570ab52f71190e9c076d14369f38b9200537" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.189" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e48d1f918009ce3145511378cf68d613e3b3d9137d67272562080d68a2b32d5" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] +checksum = "9e8c8cf938e98f769bc164923b06dce91cea1751522f46f8466461af04c9027d" [[package]] name = "serde_json" -version = "1.0.107" +version = "1.0.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b420ce6e3d8bd882e9b243c6eed35dbc9a6110c9769e74b584e0d68d1f20c65" +checksum = "bdf3bf93142acad5821c99197022e170842cdbc1c30482b98750c688c640842a" dependencies = [ "itoa", "ryu", @@ -64,26 +32,9 @@ ] [[package]] -name = "syn" -version = "2.0.38" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e96b79aaa137db8f61e26363a0c9b47d8b4ec75da28b7d1d614c2303e232408b" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] name = "target-lexicon" -version = "0.12.12" +version = "0.12.11" dependencies = [ "serde", "serde_json", ] - -[[package]] -name = "unicode-ident" -version = "1.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" diff -Nru temporalio-1.3.0/vendor/target-lexicon/Cargo.toml temporalio-1.3.0/vendor/target-lexicon/Cargo.toml --- temporalio-1.3.0/vendor/target-lexicon/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/target-lexicon/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -12,7 +12,7 @@ [package] edition = "2018" name = "target-lexicon" -version = "0.12.12" +version = "0.12.11" authors = ["Dan Gohman "] description = "Targeting utilities for compilers and related tools" documentation = "https://docs.rs/target-lexicon/" @@ -36,7 +36,6 @@ version = "1.0" [features] -arch_zkasm = [] default = [] serde_support = [ "serde", diff -Nru temporalio-1.3.0/vendor/target-lexicon/src/targets.rs temporalio-1.3.0/vendor/target-lexicon/src/targets.rs --- temporalio-1.3.0/vendor/target-lexicon/src/targets.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/target-lexicon/src/targets.rs 2023-10-30 19:40:00.000000000 +0000 @@ -47,11 +47,6 @@ X86_64h, XTensa, Clever(CleverArchitecture), - /// A software machine that produces zero-knowledge proofs of the execution. - /// - /// See https://wiki.polygon.technology/docs/category/zk-assembly/ - #[cfg(feature = "arch_zkasm")] - ZkAsm, } #[cfg_attr(feature = "rust_1_40", non_exhaustive)] @@ -861,8 +856,6 @@ | Sparc | Sparc64 | Sparcv9 => Ok(Endianness::Big), - #[cfg(feature="arch_zkasm")] - ZkAsm => Ok(Endianness::Big), } } @@ -903,8 +896,6 @@ | LoongArch64 | Wasm64 | Clever(_) => Ok(PointerWidth::U64), - #[cfg(feature="arch_zkasm")] - ZkAsm => Ok(PointerWidth::U64), } } @@ -952,8 +943,6 @@ X86_64h => Cow::Borrowed("x86_64h"), XTensa => Cow::Borrowed("xtensa"), Clever(ver) => ver.into_str(), - #[cfg(feature = "arch_zkasm")] - ZkAsm => Cow::Borrowed("zkasm"), } } } @@ -1229,8 +1218,6 @@ "x86_64" => X86_64, "x86_64h" => X86_64h, "xtensa" => XTensa, - #[cfg(feature = "arch_zkasm")] - "zkasm" => ZkAsm, _ => { if let Ok(arm) = ArmArchitecture::from_str(s) { Arm(arm) @@ -1722,8 +1709,6 @@ "x86_64-wrs-vxworks", "xtensa-esp32-espidf", "clever-unknown-elf", - #[cfg(feature = "arch_zkasm")] - "zkasm-unknown-unknown", ]; for target in targets.iter() { diff -Nru temporalio-1.3.0/vendor/tempfile/.cargo-checksum.json temporalio-1.3.0/vendor/tempfile/.cargo-checksum.json --- temporalio-1.3.0/vendor/tempfile/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tempfile/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"CHANGELOG.md":"2533d89b7047ced43fd0f0aa410c9bf1f4d8388308585eae28a3d49cb71dbcb0","Cargo.toml":"93b08b8882c3b42e51a152031f1d53d0006b0c5ef79a9a5211acd7242ae416a2","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"8b427f5bc501764575e52ba4f9d95673cf8f6d80a86d0d06599852e1a9a20a36","README.md":"972f1c35ec653943e067fd2c3d09e78f593b2e9e1eafd5b9668bf3653513de3e","deny.toml":"cb4c35327cbf8a20a6b19ac3fdf2c47b665da1662c90e3eae8a3825f9b72596e","src/dir.rs":"3b515f42feb934ba83ba56d506116e5e932c6b863b764fd61d26994eff28700a","src/error.rs":"cc7d8eace0fff11cb342158d2885d5637bfb14b24ef30755e808554772039c5f","src/file/imp/mod.rs":"f6da9fcd93f11889670a251fdd8231b5f4614e5a971b7b183f52b44af68568d5","src/file/imp/other.rs":"501cd1b444a5821127ea831fc8018706148f2d9f47c478f502b069963a42a2c7","src/file/imp/unix.rs":"0fa63a8b831947fdc7307e889d129adef6f47b19965b963a5e25d70cb3106e62","src/file/imp/windows.rs":"fa4211087c36290064de9a41b5e533e4e8c24a10fb8f8908835a67e00555c06e","src/file/mod.rs":"3a51ab219e0adab18324cab072fed01b0805781d6f15e79ca8b8a36543683bcc","src/lib.rs":"6303e7470c680ad785f32eb717de2e512b88c2c5da0e1684e3704471fabd7398","src/spooled.rs":"de848218bb7c0733d9c46e337564137673c95f5a6cf9f6bb28baf218b2503247","src/util.rs":"63737b9180cb769c1fcac56f1fa928221ae41a8917872d3e878d0a915e877710","tests/namedtempfile.rs":"87dd6a8bba2fdd77418ec2b50b8aec5e26d05a2f780182b4e9ff464b3404d47c","tests/spooled.rs":"a97e96404dc5136421ac027b965070c0d5b44c93d06d456e12dc85f81755d064","tests/tempdir.rs":"f5a86f56df6bb60aa5dfa136ce75f8d0f29c2e87546dccfe1fb680d209be525e","tests/tempfile.rs":"9a2f8142151a6aa2fd047aa3749f9982ece4b080a3ace0d3c58d6bdb3f883c81"},"package":"7ef1adac450ad7f4b3c28589471ade84f25f731a7a0fe30d71dfa9f60fd808e5"} \ No newline at end of file +{"files":{"CHANGELOG.md":"14cb935001b72d1da431865d0e618b58ca962cc17c8be6bcd9cf4e1699f58b7d","Cargo.toml":"285d4565218bd4a8e5d36cb9b12ece4b8bb9c91d3357e75708acb0ca2f414b49","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"8b427f5bc501764575e52ba4f9d95673cf8f6d80a86d0d06599852e1a9a20a36","README.md":"972f1c35ec653943e067fd2c3d09e78f593b2e9e1eafd5b9668bf3653513de3e","src/dir.rs":"3b515f42feb934ba83ba56d506116e5e932c6b863b764fd61d26994eff28700a","src/error.rs":"cc7d8eace0fff11cb342158d2885d5637bfb14b24ef30755e808554772039c5f","src/file/imp/mod.rs":"f6da9fcd93f11889670a251fdd8231b5f4614e5a971b7b183f52b44af68568d5","src/file/imp/other.rs":"501cd1b444a5821127ea831fc8018706148f2d9f47c478f502b069963a42a2c7","src/file/imp/unix.rs":"0fa63a8b831947fdc7307e889d129adef6f47b19965b963a5e25d70cb3106e62","src/file/imp/windows.rs":"fa4211087c36290064de9a41b5e533e4e8c24a10fb8f8908835a67e00555c06e","src/file/mod.rs":"f417e0e8637116e50de201581b1dfe8feb8dee30f71c5bb9dbcd95603094cb49","src/lib.rs":"6303e7470c680ad785f32eb717de2e512b88c2c5da0e1684e3704471fabd7398","src/spooled.rs":"de848218bb7c0733d9c46e337564137673c95f5a6cf9f6bb28baf218b2503247","src/util.rs":"63737b9180cb769c1fcac56f1fa928221ae41a8917872d3e878d0a915e877710","tests/namedtempfile.rs":"87dd6a8bba2fdd77418ec2b50b8aec5e26d05a2f780182b4e9ff464b3404d47c","tests/spooled.rs":"a97e96404dc5136421ac027b965070c0d5b44c93d06d456e12dc85f81755d064","tests/tempdir.rs":"f5a86f56df6bb60aa5dfa136ce75f8d0f29c2e87546dccfe1fb680d209be525e","tests/tempfile.rs":"9a2f8142151a6aa2fd047aa3749f9982ece4b080a3ace0d3c58d6bdb3f883c81"},"package":"cb94d2f3cc536af71caac6b6fcebf65860b347e7ce0cc9ebe8f70d3e521054ef"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/tempfile/Cargo.toml temporalio-1.3.0/vendor/tempfile/Cargo.toml --- temporalio-1.3.0/vendor/tempfile/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tempfile/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -13,7 +13,7 @@ edition = "2018" rust-version = "1.63" name = "tempfile" -version = "3.8.1" +version = "3.8.0" authors = [ "Steven Allen ", "The Rust Project Developers", @@ -45,11 +45,11 @@ nightly = [] [target."cfg(any(unix, target_os = \"wasi\"))".dependencies.rustix] -version = "0.38.21" +version = "0.38" features = ["fs"] [target."cfg(target_os = \"redox\")".dependencies.redox_syscall] -version = "0.4" +version = "0.3" [target."cfg(windows)".dependencies.windows-sys] version = "0.48" diff -Nru temporalio-1.3.0/vendor/tempfile/CHANGELOG.md temporalio-1.3.0/vendor/tempfile/CHANGELOG.md --- temporalio-1.3.0/vendor/tempfile/CHANGELOG.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tempfile/CHANGELOG.md 2023-10-30 19:40:00.000000000 +0000 @@ -1,11 +1,5 @@ # Changelog -## 3.8.1 - -- Update rustix to fix a potential panic on `persist_noclobber` on android. -- Update redox_syscall to 0.4 (on redox). -- Fix some docs typos. - ## 3.8.0 - Added `with_prefix` and `with_prefix_in` to `TempDir` and `NamedTempFile` to make it easier to create temporary files/directories with nice prefixes. diff -Nru temporalio-1.3.0/vendor/tempfile/deny.toml temporalio-1.3.0/vendor/tempfile/deny.toml --- temporalio-1.3.0/vendor/tempfile/deny.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tempfile/deny.toml 1970-01-01 00:00:00.000000000 +0000 @@ -1,40 +0,0 @@ - -[advisories] -notice = "deny" -unmaintained = "deny" -vulnerability = "deny" -yanked = "deny" -ignore = [] - -[licenses] -allow = [ - "Apache-2.0", - "MIT", -] -default = "deny" -confidence-threshold = 1.0 -unlicensed = "deny" - -[bans] -allow = [] -deny = [] -multiple-versions = "deny" -skip = [ - # Transitive dependency of both redox_syscall and rustix (rustix has newer). - # - # Only one version of bitflags ultimately gets compiled in due to OS-based feature flags in tempfile. - { name = "bitflags" }, -] -skip-tree = [] -wildcards = "deny" - -[sources] -allow-git = [] -allow-registry = ["https://github.com/rust-lang/crates.io-index"] -unknown-git = "deny" -unknown-registry = "deny" - -[sources.allow-org] -github = [] -gitlab = [] -bitbucket = [] diff -Nru temporalio-1.3.0/vendor/tempfile/src/file/mod.rs temporalio-1.3.0/vendor/tempfile/src/file/mod.rs --- temporalio-1.3.0/vendor/tempfile/src/file/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tempfile/src/file/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -611,7 +611,7 @@ /// This is equivalent to: /// /// ```ignore - /// Builder::new().tempfile_in(dir) + /// Builder::new().prefix(&prefix).tempfile() /// ``` /// /// See [`NamedTempFile::new()`] for details. @@ -731,7 +731,7 @@ /// # Security /// /// This method persists the temporary file using its path and may not be - /// secure in all cases. Please read the security section on the top + /// secure in the in all cases. Please read the security section on the top /// level documentation of this type for details. /// /// # Errors @@ -785,7 +785,7 @@ /// # Security /// /// This method persists the temporary file using its path and may not be - /// secure in all cases. Please read the security section on the top + /// secure in the in all cases. Please read the security section on the top /// level documentation of this type for details. /// /// # Errors diff -Nru temporalio-1.3.0/vendor/thiserror/build.rs temporalio-1.3.0/vendor/thiserror/build.rs --- temporalio-1.3.0/vendor/thiserror/build.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/thiserror/build.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,5 +1,3 @@ -#![allow(clippy::needless_raw_string_hashes)] - use std::env; use std::fs; use std::path::Path; diff -Nru temporalio-1.3.0/vendor/thiserror/.cargo-checksum.json temporalio-1.3.0/vendor/thiserror/.cargo-checksum.json --- temporalio-1.3.0/vendor/thiserror/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/thiserror/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"Cargo.toml":"a6c11176591c171057bebc4f6281352b49114559205d604c288b5d9ecfac4646","LICENSE-APACHE":"62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","README.md":"106c5a937767d49503e1fc5eae1b924f57f15decd8583720a3c652483e348a64","build.rs":"e3b1264d1b235d030636d858308caceadf75704c572f87be364751c909a1f496","rust-toolchain.toml":"6bbb61302978c736b2da03e4fb40e3beab908f85d533ab46fd541e637b5f3e0f","src/aserror.rs":"cf3c98abb2b9e06afa3c4aba0df14938417c3e330315863437561cbb3573888b","src/display.rs":"0adeeeb524c6bee06de179d54e82a43dc12d2c5b7f69f6fd268ba4611ebf5233","src/lib.rs":"5b2a5f5f00db8854c407527d30204114edc8ffd6f457d59f66ba433d93a302bc","src/provide.rs":"8007e22953bacfcc57bb7d12a03fbeb0acece5d2ec889cf55522a4e071d26df3","tests/compiletest.rs":"022a8e400ef813d7ea1875b944549cee5125f6a995dc33e93b48cba3e1b57bd1","tests/test_backtrace.rs":"a8f038490fb881463c0e8c36557617c47cf2d181f16c00525d4d139c7964fade","tests/test_deprecated.rs":"7b80a10f090a3982da017556d3d71398abcead59afd8278c7b9d9b1f7b66c7b3","tests/test_display.rs":"28e0f938fe0f6354529c35722eff04830451e27718145c27522c9acf7f8a6639","tests/test_error.rs":"d06dca3c38f22d7ce4e27dadd6c0f78e5cefe3a2ebbc5fe44abc9ddd5ee1985f","tests/test_expr.rs":"6d6d686b7f31e063c76647b24df347acfceba6897ce3a5f54b2851cde387579b","tests/test_from.rs":"36bd22be7b048cd187a19076aeac1456040f20a0b677b01c6003998b63439ea1","tests/test_generics.rs":"adc61f0d5fe8d53796848d44fb0373be5eab19a1eeb6a7172bc6f0dd7b91199c","tests/test_lints.rs":"c17d79d77edfcdd4b8f6dcdcd1c70ad065cfbc747e1a618ac6343315d0b59ea4","tests/test_option.rs":"ac30d929c019d6c54d1c1792b09e43c18dc0e4123b82051ff9e5db5e63c15e43","tests/test_path.rs":"ef5452c7e828a0179f5ace7e19f95b9762aa887caf10244adbfe36ded712c090","tests/test_source.rs":"f2f04f11bf8a709eddb1c68f113cda0c2be87e56800d6b9d991bedd545b4642f","tests/test_transparent.rs":"cd8d5be14d00d610a1782104bea6c013618501dab5c3625178ecfcf66e31f939","tests/ui/bad-field-attr.rs":"c5b567e3091969a01061843fb2d95c5e1aa3fa81edfeecdf416a84a6fba40aa8","tests/ui/bad-field-attr.stderr":"78f576d5ec66464a77f1cdf0f5bb7dcdf18f7f04f1165983a6239ec59d908ea3","tests/ui/concat-display.rs":"3995bd6b3bdd67df7bb16499775d89600c0dd20895633fe807396a64c117078d","tests/ui/concat-display.stderr":"256dfde61ee689ebe51588b135e2e030bdf95ba5adef1cb59f588c797bbdeef2","tests/ui/duplicate-enum-source.rs":"bfe28ce18042d446a76c7411aa233598211ce1157fdd3cb87bff3b3fa7c33131","tests/ui/duplicate-enum-source.stderr":"3d32fead420b27b4497be49080bc3b78f7f0ba339ead3de6c94e5dc20302c18f","tests/ui/duplicate-fmt.rs":"af53b66445bcce076a114376747f176b42c060a156563a41ccb638ae14c451fd","tests/ui/duplicate-fmt.stderr":"998bb121ce6f1595fd99529a7a1b06451b6bf476924337dce5524a83a7a5f1a1","tests/ui/duplicate-struct-source.rs":"f3d5f8e3d6fccfcdbb630db291353709583a920c6bf46f9f9de9966b67ea4c0f","tests/ui/duplicate-struct-source.stderr":"fb761d76668ac42357cf37b03c0abdbae5de0a828034990850291c9cb6ab766d","tests/ui/duplicate-transparent.rs":"41a9447e85f1a47027023442acde55c3d8610ec46d91b39bd43a42d7a004d747","tests/ui/duplicate-transparent.stderr":"4975abad43e973df158f18098d9bcb9dc39f8e75d3e733ed5d6620d1ee065c11","tests/ui/from-backtrace-backtrace.rs":"0caac64486c0eb9c076553c0502d468fbc477602a9a2595165a1dcd95524e5ff","tests/ui/from-backtrace-backtrace.stderr":"e24156ae0828878f3282341732b6e032eaa8cb4b4db366a6b5437ed0731d40a7","tests/ui/from-not-source.rs":"744a55aeffe11066830159ac023c33aaa5576e313b341fa24440ee13dfe3ac98","tests/ui/from-not-source.stderr":"525038e8b841707b927434cca4549168f73bd305faca17552a0d1fffa542ccc4","tests/ui/lifetime.rs":"e72e0391695e47fcd07edbf3819f114e468e2097086ec687781c7c8d6b4b7da7","tests/ui/lifetime.stderr":"d889a23f71324afe95dafc5f9d15337fbdbc9977cb8924f0cafe3a3becf4ced7","tests/ui/missing-fmt.rs":"bc9e2830e54c2474ff6c27a766ed3dee88d29e40f93f30e8d64d63233866c17d","tests/ui/missing-fmt.stderr":"9a20ccee9b660fe31a5b3199307b48580bb8305cb9ce33d97d3fc767a0cfc614","tests/ui/no-display.rs":"962245372272d23e9833311c15e73221b3c7da822a2ff90189613af56ffb5c2e","tests/ui/no-display.stderr":"9e2161baf5f66ab22370322f2e66e7633bf04b1ec07ef656e904b984bcc45d09","tests/ui/source-enum-not-error.rs":"3add5e7b4503d964bcae0848904822e1473c1d08c5a146c2df5347314ce1b8df","tests/ui/source-enum-not-error.stderr":"c093580558a259489eef92728d19aeca3b6c27ec17c39a02a75f0a924b095675","tests/ui/source-enum-unnamed-field-not-error.rs":"a98989e908b84a8e6e6dceef02af7bdd1098a444d229950f67ed4f54d55c62e7","tests/ui/source-enum-unnamed-field-not-error.stderr":"45b520f44e6fd10792d7f48e8ca7bc89850aa039278cba7c9f6ea11aa6378494","tests/ui/source-struct-not-error.rs":"09fb7713637242dca9192585a6daeb8d732dc1c1d0fa522b74f1c98618e6d949","tests/ui/source-struct-not-error.stderr":"66fb5fa85d59f11d8b5f7ec99469a843c51943b0010e554bdf56376a0614a2ca","tests/ui/source-struct-unnamed-field-not-error.rs":"eee605a9aafbb093666393e25cef4f7d7b8e90d518b9fadbdbed9685c66ccfcd","tests/ui/source-struct-unnamed-field-not-error.stderr":"38e4bd380ff1637c179b277ea1beb0a1ce688d191e5a9502ee69ab752e9ba70f","tests/ui/transparent-display.rs":"b3c59583eb64b0b5a246444456d03cf52d51bcdc08885023600dbb44fd87e5f2","tests/ui/transparent-display.stderr":"16d538914e0d92026bde4b4bec75660217da9ecc6b621d12d2eb81d33ed1d1da","tests/ui/transparent-enum-many.rs":"2a40a764fb4683bff57973eec61507a6c00f7d4d7a32da6e7bd0190c2e445434","tests/ui/transparent-enum-many.stderr":"f1d78c1d6d8edbef153420db4fb9ca3dc6076fa043b5b1bc0cd291daa417a3ea","tests/ui/transparent-enum-not-error.rs":"f6315993e68bc71d6d4d39afa4d059695308ef785f92cc0d1df3e9ff55be2a9a","tests/ui/transparent-enum-not-error.stderr":"e485c39f861ab66a6a41f0a423b1b13ba277968210284148883b350b5d629ccc","tests/ui/transparent-enum-source.rs":"18f606a98ac0a53f08dc56f5f923b9cbe75d25ed34479c777b48dac305d5968c","tests/ui/transparent-enum-source.stderr":"1b2e0ac53951034575d43ec0396c4e2b3cfb272db2aef8d6baa13a7e1632cc84","tests/ui/transparent-enum-unnamed-field-not-error.rs":"0c720567e9e0f87921055dfa9f607661725377633445e01a4b5048c7a7a50a85","tests/ui/transparent-enum-unnamed-field-not-error.stderr":"6b8ba244eba94006039d10f35bdd7526136bcff4751b13313ab12283d5bdc24c","tests/ui/transparent-struct-many.rs":"72c6b6c1a44c203d3bc68989b2f1ec092531ef75b745432824c3776c290326f6","tests/ui/transparent-struct-many.stderr":"7bd0536dbb54a0ce7d4a8e66ca7624a1b132d8a1d1e4fecca642ec77494ac01c","tests/ui/transparent-struct-not-error.rs":"fd814d3141c9182b1267b558d9daef8dd6e8b6462e1ad42b197f3a1c0703dce2","tests/ui/transparent-struct-not-error.stderr":"bb8b856515b34711c046f195b4267d2bb21309c5d3ac0a39d6660c55dadafb41","tests/ui/transparent-struct-source.rs":"863fa691ed7d27e8767da58d9ee11fd40d6642274b36338ca1074c07964ea2b3","tests/ui/transparent-struct-source.stderr":"267dab65929e67d32347fb467a00b43af931f8205d727d7671938580217fc70e","tests/ui/transparent-struct-unnamed-field-not-error.rs":"fbff5874be44a5dcc347693d7929537256b187dfec467ed72c9968c095228d8d","tests/ui/transparent-struct-unnamed-field-not-error.stderr":"684d4ed4325f2e7fb95c84a6d231585b2be313990c41222fda66b99a84e7b884","tests/ui/unexpected-field-fmt.rs":"29fba7b4d81c642ec8e47cfe053aa515acf9080a86d65e685363a48993becfe3","tests/ui/unexpected-field-fmt.stderr":"20731c4a08af04bed3ff513903adadd690b6bc532b15604557e7f25575a8338f","tests/ui/unexpected-struct-source.rs":"c6cbe882d622635c216feb8290b1bd536ce0ec4feee16bc087667a21b3641d5c","tests/ui/unexpected-struct-source.stderr":"7c8227513478f6cc09e8a28be337c8a0e758a06ca5978d774c91bd43c4a54043","tests/ui/union.rs":"331adff27cebd8b95b03b6742cc8247331fda1f961e1590ed39c8d39f50cf1d8","tests/ui/union.stderr":"5f67ad29753d6fb14bc03aef7d4a1f660ee7796e469c037efbf8b13456934ad3"},"package":"f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2"} \ No newline at end of file +{"files":{"Cargo.toml":"426e954049c684a86d819889248e16d5035fee3e6208c8561a6306f67829c37f","LICENSE-APACHE":"62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","README.md":"106c5a937767d49503e1fc5eae1b924f57f15decd8583720a3c652483e348a64","build.rs":"68e8862d9a6fa607647c01232662a3d9a44462aec390a6fe98beccd59fa58f7d","rust-toolchain.toml":"6bbb61302978c736b2da03e4fb40e3beab908f85d533ab46fd541e637b5f3e0f","src/aserror.rs":"cf3c98abb2b9e06afa3c4aba0df14938417c3e330315863437561cbb3573888b","src/display.rs":"44edb82464d52b33604236445e7429b86273fcd921fbaafc72270f0e1d8876ff","src/lib.rs":"c42c4fed186c0d328fb2f8cec2dc72be925c54936db148b2700203319ff78a7c","src/provide.rs":"8007e22953bacfcc57bb7d12a03fbeb0acece5d2ec889cf55522a4e071d26df3","tests/compiletest.rs":"022a8e400ef813d7ea1875b944549cee5125f6a995dc33e93b48cba3e1b57bd1","tests/test_backtrace.rs":"a8f038490fb881463c0e8c36557617c47cf2d181f16c00525d4d139c7964fade","tests/test_deprecated.rs":"7b80a10f090a3982da017556d3d71398abcead59afd8278c7b9d9b1f7b66c7b3","tests/test_display.rs":"f7d023365adbd47a24cb62cea02905503fd54705cbfdffdfdb3412dc210737a9","tests/test_error.rs":"d06dca3c38f22d7ce4e27dadd6c0f78e5cefe3a2ebbc5fe44abc9ddd5ee1985f","tests/test_expr.rs":"388402702a3be4ffcd0574d66733e8932bf7d5de37544a00ecb0e4f8d8246da4","tests/test_from.rs":"36bd22be7b048cd187a19076aeac1456040f20a0b677b01c6003998b63439ea1","tests/test_generics.rs":"4f33747e3f62550d5af94687679af230ef92fbb3247ae4b41df46792a040e4dc","tests/test_lints.rs":"c17d79d77edfcdd4b8f6dcdcd1c70ad065cfbc747e1a618ac6343315d0b59ea4","tests/test_option.rs":"ac30d929c019d6c54d1c1792b09e43c18dc0e4123b82051ff9e5db5e63c15e43","tests/test_path.rs":"ef5452c7e828a0179f5ace7e19f95b9762aa887caf10244adbfe36ded712c090","tests/test_source.rs":"f2f04f11bf8a709eddb1c68f113cda0c2be87e56800d6b9d991bedd545b4642f","tests/test_transparent.rs":"cd8d5be14d00d610a1782104bea6c013618501dab5c3625178ecfcf66e31f939","tests/ui/bad-field-attr.rs":"c5b567e3091969a01061843fb2d95c5e1aa3fa81edfeecdf416a84a6fba40aa8","tests/ui/bad-field-attr.stderr":"78f576d5ec66464a77f1cdf0f5bb7dcdf18f7f04f1165983a6239ec59d908ea3","tests/ui/concat-display.rs":"3995bd6b3bdd67df7bb16499775d89600c0dd20895633fe807396a64c117078d","tests/ui/concat-display.stderr":"256dfde61ee689ebe51588b135e2e030bdf95ba5adef1cb59f588c797bbdeef2","tests/ui/duplicate-enum-source.rs":"bfe28ce18042d446a76c7411aa233598211ce1157fdd3cb87bff3b3fa7c33131","tests/ui/duplicate-enum-source.stderr":"3d32fead420b27b4497be49080bc3b78f7f0ba339ead3de6c94e5dc20302c18f","tests/ui/duplicate-fmt.rs":"af53b66445bcce076a114376747f176b42c060a156563a41ccb638ae14c451fd","tests/ui/duplicate-fmt.stderr":"998bb121ce6f1595fd99529a7a1b06451b6bf476924337dce5524a83a7a5f1a1","tests/ui/duplicate-struct-source.rs":"f3d5f8e3d6fccfcdbb630db291353709583a920c6bf46f9f9de9966b67ea4c0f","tests/ui/duplicate-struct-source.stderr":"fb761d76668ac42357cf37b03c0abdbae5de0a828034990850291c9cb6ab766d","tests/ui/duplicate-transparent.rs":"41a9447e85f1a47027023442acde55c3d8610ec46d91b39bd43a42d7a004d747","tests/ui/duplicate-transparent.stderr":"4975abad43e973df158f18098d9bcb9dc39f8e75d3e733ed5d6620d1ee065c11","tests/ui/from-backtrace-backtrace.rs":"1fd51c5a1f7f6b6ee676d9fc798b6276ef2ce75def33d07f0e4b7bbde3291859","tests/ui/from-backtrace-backtrace.stderr":"f9774e9dad51374501ef4a55fa2dacece4d1c70e29ca18761394bdb80a9a74da","tests/ui/from-not-source.rs":"744a55aeffe11066830159ac023c33aaa5576e313b341fa24440ee13dfe3ac98","tests/ui/from-not-source.stderr":"525038e8b841707b927434cca4549168f73bd305faca17552a0d1fffa542ccc4","tests/ui/lifetime.rs":"e72e0391695e47fcd07edbf3819f114e468e2097086ec687781c7c8d6b4b7da7","tests/ui/lifetime.stderr":"d889a23f71324afe95dafc5f9d15337fbdbc9977cb8924f0cafe3a3becf4ced7","tests/ui/missing-fmt.rs":"bc9e2830e54c2474ff6c27a766ed3dee88d29e40f93f30e8d64d63233866c17d","tests/ui/missing-fmt.stderr":"9a20ccee9b660fe31a5b3199307b48580bb8305cb9ce33d97d3fc767a0cfc614","tests/ui/no-display.rs":"962245372272d23e9833311c15e73221b3c7da822a2ff90189613af56ffb5c2e","tests/ui/no-display.stderr":"d7bdecccb74d21677361fb7f89dc784dc859258afcf663fa1c48da6c172a61aa","tests/ui/source-enum-not-error.rs":"7c57c63b3ec37bc456738acea2e1038de5b0f32fe7e83984037d7ad1ed921737","tests/ui/source-enum-not-error.stderr":"feac587e2436fd7bed73e7265dceb31b495587f1a8eea5c5fefd9da66b912dac","tests/ui/source-struct-not-error.rs":"09fb7713637242dca9192585a6daeb8d732dc1c1d0fa522b74f1c98618e6d949","tests/ui/source-struct-not-error.stderr":"66fb5fa85d59f11d8b5f7ec99469a843c51943b0010e554bdf56376a0614a2ca","tests/ui/transparent-display.rs":"b3c59583eb64b0b5a246444456d03cf52d51bcdc08885023600dbb44fd87e5f2","tests/ui/transparent-display.stderr":"16d538914e0d92026bde4b4bec75660217da9ecc6b621d12d2eb81d33ed1d1da","tests/ui/transparent-enum-many.rs":"2a40a764fb4683bff57973eec61507a6c00f7d4d7a32da6e7bd0190c2e445434","tests/ui/transparent-enum-many.stderr":"f1d78c1d6d8edbef153420db4fb9ca3dc6076fa043b5b1bc0cd291daa417a3ea","tests/ui/transparent-enum-source.rs":"18f606a98ac0a53f08dc56f5f923b9cbe75d25ed34479c777b48dac305d5968c","tests/ui/transparent-enum-source.stderr":"1b2e0ac53951034575d43ec0396c4e2b3cfb272db2aef8d6baa13a7e1632cc84","tests/ui/transparent-struct-many.rs":"72c6b6c1a44c203d3bc68989b2f1ec092531ef75b745432824c3776c290326f6","tests/ui/transparent-struct-many.stderr":"7bd0536dbb54a0ce7d4a8e66ca7624a1b132d8a1d1e4fecca642ec77494ac01c","tests/ui/transparent-struct-source.rs":"863fa691ed7d27e8767da58d9ee11fd40d6642274b36338ca1074c07964ea2b3","tests/ui/transparent-struct-source.stderr":"267dab65929e67d32347fb467a00b43af931f8205d727d7671938580217fc70e","tests/ui/unexpected-field-fmt.rs":"29fba7b4d81c642ec8e47cfe053aa515acf9080a86d65e685363a48993becfe3","tests/ui/unexpected-field-fmt.stderr":"20731c4a08af04bed3ff513903adadd690b6bc532b15604557e7f25575a8338f","tests/ui/unexpected-struct-source.rs":"c6cbe882d622635c216feb8290b1bd536ce0ec4feee16bc087667a21b3641d5c","tests/ui/unexpected-struct-source.stderr":"7c8227513478f6cc09e8a28be337c8a0e758a06ca5978d774c91bd43c4a54043","tests/ui/union.rs":"331adff27cebd8b95b03b6742cc8247331fda1f961e1590ed39c8d39f50cf1d8","tests/ui/union.stderr":"5f67ad29753d6fb14bc03aef7d4a1f660ee7796e469c037efbf8b13456934ad3"},"package":"97a802ec30afc17eee47b2855fc72e0c4cd62be9b4efe6591edde0ec5bd68d8f"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/thiserror/Cargo.toml temporalio-1.3.0/vendor/thiserror/Cargo.toml --- temporalio-1.3.0/vendor/thiserror/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/thiserror/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -13,7 +13,7 @@ edition = "2021" rust-version = "1.56" name = "thiserror" -version = "1.0.50" +version = "1.0.47" authors = ["David Tolnay "] description = "derive(Error)" documentation = "https://docs.rs/thiserror" @@ -32,7 +32,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies.thiserror-impl] -version = "=1.0.50" +version = "=1.0.47" [dev-dependencies.anyhow] version = "1.0.73" diff -Nru temporalio-1.3.0/vendor/thiserror/src/display.rs temporalio-1.3.0/vendor/thiserror/src/display.rs --- temporalio-1.3.0/vendor/thiserror/src/display.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/thiserror/src/display.rs 2023-10-30 19:40:00.000000000 +0000 @@ -2,39 +2,29 @@ use std::path::{self, Path, PathBuf}; #[doc(hidden)] -pub trait AsDisplay<'a> { - // TODO: convert to generic associated type. - // https://github.com/dtolnay/thiserror/pull/253 - type Target: Display; - - fn as_display(&'a self) -> Self::Target; +pub trait DisplayAsDisplay { + fn as_display(&self) -> Self; } -impl<'a, T> AsDisplay<'a> for &T -where - T: Display + 'a, -{ - type Target = &'a T; - - fn as_display(&'a self) -> Self::Target { - *self +impl DisplayAsDisplay for &T { + fn as_display(&self) -> Self { + self } } -impl<'a> AsDisplay<'a> for Path { - type Target = path::Display<'a>; +#[doc(hidden)] +pub trait PathAsDisplay { + fn as_display(&self) -> path::Display<'_>; +} - #[inline] - fn as_display(&'a self) -> Self::Target { +impl PathAsDisplay for Path { + fn as_display(&self) -> path::Display<'_> { self.display() } } -impl<'a> AsDisplay<'a> for PathBuf { - type Target = path::Display<'a>; - - #[inline] - fn as_display(&'a self) -> Self::Target { +impl PathAsDisplay for PathBuf { + fn as_display(&self) -> path::Display<'_> { self.display() } } diff -Nru temporalio-1.3.0/vendor/thiserror/src/lib.rs temporalio-1.3.0/vendor/thiserror/src/lib.rs --- temporalio-1.3.0/vendor/thiserror/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/thiserror/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -228,12 +228,13 @@ //! //! [`anyhow`]: https://github.com/dtolnay/anyhow -#![doc(html_root_url = "https://docs.rs/thiserror/1.0.50")] +#![doc(html_root_url = "https://docs.rs/thiserror/1.0.47")] #![allow( + // Clippy bug: https://github.com/rust-lang/rust-clippy/issues/7421 + clippy::doc_markdown, clippy::module_name_repetitions, - clippy::needless_lifetimes, clippy::return_self_not_must_use, - clippy::wildcard_imports + clippy::wildcard_imports, )] #![cfg_attr(error_generic_member_access, feature(error_generic_member_access))] @@ -250,7 +251,7 @@ #[doc(hidden)] pub use crate::aserror::AsDynError; #[doc(hidden)] - pub use crate::display::AsDisplay; + pub use crate::display::{DisplayAsDisplay, PathAsDisplay}; #[cfg(error_generic_member_access)] #[doc(hidden)] pub use crate::provide::ThiserrorProvide; diff -Nru temporalio-1.3.0/vendor/thiserror/tests/test_display.rs temporalio-1.3.0/vendor/thiserror/tests/test_display.rs --- temporalio-1.3.0/vendor/thiserror/tests/test_display.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/thiserror/tests/test_display.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,5 +1,3 @@ -#![allow(clippy::uninlined_format_args)] - use std::fmt::{self, Display}; use thiserror::Error; diff -Nru temporalio-1.3.0/vendor/thiserror/tests/test_expr.rs temporalio-1.3.0/vendor/thiserror/tests/test_expr.rs --- temporalio-1.3.0/vendor/thiserror/tests/test_expr.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/thiserror/tests/test_expr.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,8 +1,4 @@ -#![allow( - clippy::iter_cloned_collect, - clippy::option_if_let_else, - clippy::uninlined_format_args -)] +#![allow(clippy::iter_cloned_collect, clippy::option_if_let_else)] use std::fmt::Display; use thiserror::Error; diff -Nru temporalio-1.3.0/vendor/thiserror/tests/test_generics.rs temporalio-1.3.0/vendor/thiserror/tests/test_generics.rs --- temporalio-1.3.0/vendor/thiserror/tests/test_generics.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/thiserror/tests/test_generics.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,4 +1,4 @@ -#![allow(clippy::needless_late_init, clippy::uninlined_format_args)] +#![allow(clippy::needless_late_init)] use std::fmt::{self, Debug, Display}; use thiserror::Error; diff -Nru temporalio-1.3.0/vendor/thiserror/tests/ui/from-backtrace-backtrace.rs temporalio-1.3.0/vendor/thiserror/tests/ui/from-backtrace-backtrace.rs --- temporalio-1.3.0/vendor/thiserror/tests/ui/from-backtrace-backtrace.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/thiserror/tests/ui/from-backtrace-backtrace.rs 2023-10-30 19:40:00.000000000 +0000 @@ -5,11 +5,6 @@ #[derive(Error, Debug)] #[error("...")] -pub struct Error( - #[from] - #[backtrace] - std::io::Error, - Backtrace, -); +pub struct Error(#[from] #[backtrace] std::io::Error, Backtrace); fn main() {} diff -Nru temporalio-1.3.0/vendor/thiserror/tests/ui/from-backtrace-backtrace.stderr temporalio-1.3.0/vendor/thiserror/tests/ui/from-backtrace-backtrace.stderr --- temporalio-1.3.0/vendor/thiserror/tests/ui/from-backtrace-backtrace.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/thiserror/tests/ui/from-backtrace-backtrace.stderr 2023-10-30 19:40:00.000000000 +0000 @@ -1,5 +1,5 @@ error: deriving From requires no fields other than source and backtrace - --> tests/ui/from-backtrace-backtrace.rs:9:5 + --> tests/ui/from-backtrace-backtrace.rs:8:18 | -9 | #[from] - | ^^^^^^^ +8 | pub struct Error(#[from] #[backtrace] std::io::Error, Backtrace); + | ^^^^^^^ diff -Nru temporalio-1.3.0/vendor/thiserror/tests/ui/no-display.stderr temporalio-1.3.0/vendor/thiserror/tests/ui/no-display.stderr --- temporalio-1.3.0/vendor/thiserror/tests/ui/no-display.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/thiserror/tests/ui/no-display.stderr 2023-10-30 19:40:00.000000000 +0000 @@ -9,7 +9,7 @@ | = note: the following trait bounds were not satisfied: `NoDisplay: std::fmt::Display` - which is required by `&NoDisplay: AsDisplay<'_>` + which is required by `&NoDisplay: DisplayAsDisplay` note: the trait `std::fmt::Display` must be implemented --> $RUST/core/src/fmt/mod.rs | diff -Nru temporalio-1.3.0/vendor/thiserror/tests/ui/source-enum-not-error.rs temporalio-1.3.0/vendor/thiserror/tests/ui/source-enum-not-error.rs --- temporalio-1.3.0/vendor/thiserror/tests/ui/source-enum-not-error.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/thiserror/tests/ui/source-enum-not-error.rs 2023-10-30 19:40:00.000000000 +0000 @@ -6,7 +6,9 @@ #[derive(Error, Debug)] #[error("...")] pub enum ErrorEnum { - Broken { source: NotError }, + Broken { + source: NotError, + }, } fn main() {} diff -Nru temporalio-1.3.0/vendor/thiserror/tests/ui/source-enum-not-error.stderr temporalio-1.3.0/vendor/thiserror/tests/ui/source-enum-not-error.stderr --- temporalio-1.3.0/vendor/thiserror/tests/ui/source-enum-not-error.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/thiserror/tests/ui/source-enum-not-error.stderr 2023-10-30 19:40:00.000000000 +0000 @@ -1,22 +1,22 @@ error[E0599]: the method `as_dyn_error` exists for reference `&NotError`, but its trait bounds were not satisfied - --> tests/ui/source-enum-not-error.rs:9:14 - | -4 | pub struct NotError; - | ------------------- - | | - | doesn't satisfy `NotError: AsDynError<'_>` - | doesn't satisfy `NotError: std::error::Error` + --> tests/ui/source-enum-not-error.rs:10:9 + | +4 | pub struct NotError; + | ------------------- + | | + | doesn't satisfy `NotError: AsDynError<'_>` + | doesn't satisfy `NotError: std::error::Error` ... -9 | Broken { source: NotError }, - | ^^^^^^ method cannot be called on `&NotError` due to unsatisfied trait bounds - | - = note: the following trait bounds were not satisfied: - `NotError: std::error::Error` - which is required by `NotError: AsDynError<'_>` - `&NotError: std::error::Error` - which is required by `&NotError: AsDynError<'_>` +10 | source: NotError, + | ^^^^^^ method cannot be called on `&NotError` due to unsatisfied trait bounds + | + = note: the following trait bounds were not satisfied: + `NotError: std::error::Error` + which is required by `NotError: AsDynError<'_>` + `&NotError: std::error::Error` + which is required by `&NotError: AsDynError<'_>` note: the trait `std::error::Error` must be implemented - --> $RUST/core/src/error.rs - | - | pub trait Error: Debug + Display { - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + --> $RUST/core/src/error.rs + | + | pub trait Error: Debug + Display { + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff -Nru temporalio-1.3.0/vendor/thiserror/tests/ui/source-enum-unnamed-field-not-error.rs temporalio-1.3.0/vendor/thiserror/tests/ui/source-enum-unnamed-field-not-error.rs --- temporalio-1.3.0/vendor/thiserror/tests/ui/source-enum-unnamed-field-not-error.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/thiserror/tests/ui/source-enum-unnamed-field-not-error.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,12 +0,0 @@ -use thiserror::Error; - -#[derive(Debug)] -pub struct NotError; - -#[derive(Error, Debug)] -#[error("...")] -pub enum ErrorEnum { - Broken(#[source] NotError), -} - -fn main() {} diff -Nru temporalio-1.3.0/vendor/thiserror/tests/ui/source-enum-unnamed-field-not-error.stderr temporalio-1.3.0/vendor/thiserror/tests/ui/source-enum-unnamed-field-not-error.stderr --- temporalio-1.3.0/vendor/thiserror/tests/ui/source-enum-unnamed-field-not-error.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/thiserror/tests/ui/source-enum-unnamed-field-not-error.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,22 +0,0 @@ -error[E0599]: the method `as_dyn_error` exists for reference `&NotError`, but its trait bounds were not satisfied - --> tests/ui/source-enum-unnamed-field-not-error.rs:9:14 - | -4 | pub struct NotError; - | ------------------- - | | - | doesn't satisfy `NotError: AsDynError<'_>` - | doesn't satisfy `NotError: std::error::Error` -... -9 | Broken(#[source] NotError), - | ^^^^^^ method cannot be called on `&NotError` due to unsatisfied trait bounds - | - = note: the following trait bounds were not satisfied: - `NotError: std::error::Error` - which is required by `NotError: AsDynError<'_>` - `&NotError: std::error::Error` - which is required by `&NotError: AsDynError<'_>` -note: the trait `std::error::Error` must be implemented - --> $RUST/core/src/error.rs - | - | pub trait Error: Debug + Display { - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff -Nru temporalio-1.3.0/vendor/thiserror/tests/ui/source-struct-unnamed-field-not-error.rs temporalio-1.3.0/vendor/thiserror/tests/ui/source-struct-unnamed-field-not-error.rs --- temporalio-1.3.0/vendor/thiserror/tests/ui/source-struct-unnamed-field-not-error.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/thiserror/tests/ui/source-struct-unnamed-field-not-error.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,10 +0,0 @@ -use thiserror::Error; - -#[derive(Debug)] -struct NotError; - -#[derive(Error, Debug)] -#[error("...")] -pub struct ErrorStruct(#[source] NotError); - -fn main() {} diff -Nru temporalio-1.3.0/vendor/thiserror/tests/ui/source-struct-unnamed-field-not-error.stderr temporalio-1.3.0/vendor/thiserror/tests/ui/source-struct-unnamed-field-not-error.stderr --- temporalio-1.3.0/vendor/thiserror/tests/ui/source-struct-unnamed-field-not-error.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/thiserror/tests/ui/source-struct-unnamed-field-not-error.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -error[E0599]: the method `as_dyn_error` exists for struct `NotError`, but its trait bounds were not satisfied - --> tests/ui/source-struct-unnamed-field-not-error.rs:8:26 - | -4 | struct NotError; - | --------------- - | | - | method `as_dyn_error` not found for this struct - | doesn't satisfy `NotError: AsDynError<'_>` - | doesn't satisfy `NotError: std::error::Error` -... -8 | pub struct ErrorStruct(#[source] NotError); - | ^^^^^^ method cannot be called on `NotError` due to unsatisfied trait bounds - | - = note: the following trait bounds were not satisfied: - `NotError: std::error::Error` - which is required by `NotError: AsDynError<'_>` -note: the trait `std::error::Error` must be implemented - --> $RUST/core/src/error.rs - | - | pub trait Error: Debug + Display { - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff -Nru temporalio-1.3.0/vendor/thiserror/tests/ui/transparent-enum-not-error.rs temporalio-1.3.0/vendor/thiserror/tests/ui/transparent-enum-not-error.rs --- temporalio-1.3.0/vendor/thiserror/tests/ui/transparent-enum-not-error.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/thiserror/tests/ui/transparent-enum-not-error.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,9 +0,0 @@ -use thiserror::Error; - -#[derive(Error, Debug)] -pub enum Error { - #[error(transparent)] - Other { message: String }, -} - -fn main() {} diff -Nru temporalio-1.3.0/vendor/thiserror/tests/ui/transparent-enum-not-error.stderr temporalio-1.3.0/vendor/thiserror/tests/ui/transparent-enum-not-error.stderr --- temporalio-1.3.0/vendor/thiserror/tests/ui/transparent-enum-not-error.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/thiserror/tests/ui/transparent-enum-not-error.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,23 +0,0 @@ -error[E0599]: the method `as_dyn_error` exists for reference `&String`, but its trait bounds were not satisfied - --> tests/ui/transparent-enum-not-error.rs:5:13 - | -5 | #[error(transparent)] - | ^^^^^^^^^^^ method cannot be called on `&String` due to unsatisfied trait bounds - | - ::: $RUST/alloc/src/string.rs - | - | pub struct String { - | ----------------- - | | - | doesn't satisfy `String: AsDynError<'_>` - | doesn't satisfy `String: std::error::Error` - | - = note: the following trait bounds were not satisfied: - `String: std::error::Error` - which is required by `String: AsDynError<'_>` - `&String: std::error::Error` - which is required by `&String: AsDynError<'_>` - `str: Sized` - which is required by `str: AsDynError<'_>` - `str: std::error::Error` - which is required by `str: AsDynError<'_>` diff -Nru temporalio-1.3.0/vendor/thiserror/tests/ui/transparent-enum-unnamed-field-not-error.rs temporalio-1.3.0/vendor/thiserror/tests/ui/transparent-enum-unnamed-field-not-error.rs --- temporalio-1.3.0/vendor/thiserror/tests/ui/transparent-enum-unnamed-field-not-error.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/thiserror/tests/ui/transparent-enum-unnamed-field-not-error.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,9 +0,0 @@ -use thiserror::Error; - -#[derive(Error, Debug)] -pub enum Error { - #[error(transparent)] - Other(String), -} - -fn main() {} diff -Nru temporalio-1.3.0/vendor/thiserror/tests/ui/transparent-enum-unnamed-field-not-error.stderr temporalio-1.3.0/vendor/thiserror/tests/ui/transparent-enum-unnamed-field-not-error.stderr --- temporalio-1.3.0/vendor/thiserror/tests/ui/transparent-enum-unnamed-field-not-error.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/thiserror/tests/ui/transparent-enum-unnamed-field-not-error.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,23 +0,0 @@ -error[E0599]: the method `as_dyn_error` exists for reference `&String`, but its trait bounds were not satisfied - --> tests/ui/transparent-enum-unnamed-field-not-error.rs:5:13 - | -5 | #[error(transparent)] - | ^^^^^^^^^^^ method cannot be called on `&String` due to unsatisfied trait bounds - | - ::: $RUST/alloc/src/string.rs - | - | pub struct String { - | ----------------- - | | - | doesn't satisfy `String: AsDynError<'_>` - | doesn't satisfy `String: std::error::Error` - | - = note: the following trait bounds were not satisfied: - `String: std::error::Error` - which is required by `String: AsDynError<'_>` - `&String: std::error::Error` - which is required by `&String: AsDynError<'_>` - `str: Sized` - which is required by `str: AsDynError<'_>` - `str: std::error::Error` - which is required by `str: AsDynError<'_>` diff -Nru temporalio-1.3.0/vendor/thiserror/tests/ui/transparent-struct-not-error.rs temporalio-1.3.0/vendor/thiserror/tests/ui/transparent-struct-not-error.rs --- temporalio-1.3.0/vendor/thiserror/tests/ui/transparent-struct-not-error.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/thiserror/tests/ui/transparent-struct-not-error.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,9 +0,0 @@ -use thiserror::Error; - -#[derive(Error, Debug)] -#[error(transparent)] -pub struct Error { - message: String, -} - -fn main() {} diff -Nru temporalio-1.3.0/vendor/thiserror/tests/ui/transparent-struct-not-error.stderr temporalio-1.3.0/vendor/thiserror/tests/ui/transparent-struct-not-error.stderr --- temporalio-1.3.0/vendor/thiserror/tests/ui/transparent-struct-not-error.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/thiserror/tests/ui/transparent-struct-not-error.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -error[E0599]: the method `as_dyn_error` exists for struct `String`, but its trait bounds were not satisfied - --> tests/ui/transparent-struct-not-error.rs:4:9 - | -4 | #[error(transparent)] - | ^^^^^^^^^^^ method cannot be called on `String` due to unsatisfied trait bounds - | - ::: $RUST/alloc/src/string.rs - | - | pub struct String { - | ----------------- - | | - | doesn't satisfy `String: AsDynError<'_>` - | doesn't satisfy `String: std::error::Error` - | - = note: the following trait bounds were not satisfied: - `String: std::error::Error` - which is required by `String: AsDynError<'_>` - `str: Sized` - which is required by `str: AsDynError<'_>` - `str: std::error::Error` - which is required by `str: AsDynError<'_>` diff -Nru temporalio-1.3.0/vendor/thiserror/tests/ui/transparent-struct-unnamed-field-not-error.rs temporalio-1.3.0/vendor/thiserror/tests/ui/transparent-struct-unnamed-field-not-error.rs --- temporalio-1.3.0/vendor/thiserror/tests/ui/transparent-struct-unnamed-field-not-error.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/thiserror/tests/ui/transparent-struct-unnamed-field-not-error.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ -use thiserror::Error; - -#[derive(Error, Debug)] -#[error(transparent)] -pub struct Error(String); - -fn main() {} diff -Nru temporalio-1.3.0/vendor/thiserror/tests/ui/transparent-struct-unnamed-field-not-error.stderr temporalio-1.3.0/vendor/thiserror/tests/ui/transparent-struct-unnamed-field-not-error.stderr --- temporalio-1.3.0/vendor/thiserror/tests/ui/transparent-struct-unnamed-field-not-error.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/thiserror/tests/ui/transparent-struct-unnamed-field-not-error.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -error[E0599]: the method `as_dyn_error` exists for struct `String`, but its trait bounds were not satisfied - --> tests/ui/transparent-struct-unnamed-field-not-error.rs:4:9 - | -4 | #[error(transparent)] - | ^^^^^^^^^^^ method cannot be called on `String` due to unsatisfied trait bounds - | - ::: $RUST/alloc/src/string.rs - | - | pub struct String { - | ----------------- - | | - | doesn't satisfy `String: AsDynError<'_>` - | doesn't satisfy `String: std::error::Error` - | - = note: the following trait bounds were not satisfied: - `String: std::error::Error` - which is required by `String: AsDynError<'_>` - `str: Sized` - which is required by `str: AsDynError<'_>` - `str: std::error::Error` - which is required by `str: AsDynError<'_>` diff -Nru temporalio-1.3.0/vendor/thiserror-impl/.cargo-checksum.json temporalio-1.3.0/vendor/thiserror-impl/.cargo-checksum.json --- temporalio-1.3.0/vendor/thiserror-impl/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/thiserror-impl/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"Cargo.toml":"3f5057552ccac72bba0665fbc5c5cca35a8cb5e6751eec516b1052212ce8e27d","LICENSE-APACHE":"62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","src/ast.rs":"c7601e8394f5ee304365c520181f0dbeaa807ddaa71ce4a8618ea1a70f81b3b2","src/attr.rs":"ad5319f053a18ec3841300b2ae553ffa005749ba7099fe4b318126223e4dcbdf","src/expand.rs":"222c77246df56d96dddf4441ba0327579ebba89c65f0123aaab0505c51bd84a3","src/fmt.rs":"d63d39120c18712596f9f2a1715821148c2becd4d8bad5bc1b307210a84dbe98","src/generics.rs":"2076cde22271be355a8131a77add4b93f83ab0af4317cd2df5471fffa4f95c66","src/lib.rs":"a17484d590d702ea79172ef84a94de4a96b439d1a5fdac69d24417f25461af04","src/prop.rs":"5ba613e38430831259f20b258f33d57dcb783fbaeeb49e5faffa7b2a7be99e67","src/span.rs":"430460a4fa0d1fa9c627c1ddd575d2b101778fea84217591e1a93a5f6a2a0132","src/valid.rs":"ac95253944fd360d3578d0643a7baabb2cfa6bf9fbced7a6ce1f7b0529a3bb98"},"package":"266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8"} \ No newline at end of file +{"files":{"Cargo.toml":"7adfcbfb61f6e08a1b05802640e4648a14cffdc6faa614f18f4ac57ec4bbfe7b","LICENSE-APACHE":"62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","src/ast.rs":"c7601e8394f5ee304365c520181f0dbeaa807ddaa71ce4a8618ea1a70f81b3b2","src/attr.rs":"13404e2a5b32ac24a041b977787864d52f3d5253d685894f62fd88625a102561","src/expand.rs":"5515ef3efdd0b24e7191d1f96ff16911f4e2259148072974022295e4a93c03ea","src/fmt.rs":"d63d39120c18712596f9f2a1715821148c2becd4d8bad5bc1b307210a84dbe98","src/generics.rs":"2076cde22271be355a8131a77add4b93f83ab0af4317cd2df5471fffa4f95c66","src/lib.rs":"7d023310cd3db670554ce108a6afd94e1ae3c55c83661d4b9fcebdf1865b9e4b","src/prop.rs":"6709932aee8f9d217f40cd644629c0ecb2f46d333ae8a1398e8d745534f4e028","src/valid.rs":"ac95253944fd360d3578d0643a7baabb2cfa6bf9fbced7a6ce1f7b0529a3bb98"},"package":"6bb623b56e39ab7dcd4b1b98bb6c8f8d907ed255b18de254088016b27a8ee19b"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/thiserror-impl/Cargo.toml temporalio-1.3.0/vendor/thiserror-impl/Cargo.toml --- temporalio-1.3.0/vendor/thiserror-impl/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/thiserror-impl/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -13,7 +13,7 @@ edition = "2021" rust-version = "1.56" name = "thiserror-impl" -version = "1.0.50" +version = "1.0.47" authors = ["David Tolnay "] description = "Implementation detail of the `thiserror` crate" license = "MIT OR Apache-2.0" diff -Nru temporalio-1.3.0/vendor/thiserror-impl/src/attr.rs temporalio-1.3.0/vendor/thiserror-impl/src/attr.rs --- temporalio-1.3.0/vendor/thiserror-impl/src/attr.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/thiserror-impl/src/attr.rs 2023-10-30 19:40:00.000000000 +0000 @@ -197,7 +197,7 @@ let fmt = &self.fmt; let args = &self.args; tokens.extend(quote! { - ::core::write!(__formatter, #fmt #args) + std::write!(__formatter, #fmt #args) }); } } @@ -205,6 +205,6 @@ impl ToTokens for Trait { fn to_tokens(&self, tokens: &mut TokenStream) { let trait_name = format_ident!("{}", format!("{:?}", self)); - tokens.extend(quote!(::core::fmt::#trait_name)); + tokens.extend(quote!(std::fmt::#trait_name)); } } diff -Nru temporalio-1.3.0/vendor/thiserror-impl/src/expand.rs temporalio-1.3.0/vendor/thiserror-impl/src/expand.rs --- temporalio-1.3.0/vendor/thiserror-impl/src/expand.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/thiserror-impl/src/expand.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,10 +1,10 @@ use crate::ast::{Enum, Field, Input, Struct}; use crate::attr::Trait; use crate::generics::InferredBounds; -use crate::span::MemberSpan; use proc_macro2::TokenStream; use quote::{format_ident, quote, quote_spanned, ToTokens}; use std::collections::BTreeSet as Set; +use syn::spanned::Spanned; use syn::{ Data, DeriveInput, GenericArgument, Member, PathArguments, Result, Token, Type, Visibility, }; @@ -23,13 +23,13 @@ let (impl_generics, ty_generics, where_clause) = input.generics.split_for_impl(); let mut error_inferred_bounds = InferredBounds::new(); - let source_body = if let Some(transparent_attr) = &input.attrs.transparent { + let source_body = if input.attrs.transparent.is_some() { let only_field = &input.fields[0]; if only_field.contains_generic { error_inferred_bounds.insert(only_field.ty, quote!(std::error::Error)); } let member = &only_field.member; - Some(quote_spanned! {transparent_attr.span=> + Some(quote! { std::error::Error::source(self.#member.as_dyn_error()) }) } else if let Some(source_field) = input.source_field() { @@ -39,22 +39,20 @@ error_inferred_bounds.insert(ty, quote!(std::error::Error + 'static)); } let asref = if type_is_option(source_field.ty) { - Some(quote_spanned!(source.member_span()=> .as_ref()?)) + Some(quote_spanned!(source.span()=> .as_ref()?)) } else { None }; - let dyn_error = quote_spanned! {source_field.source_span()=> - self.#source #asref.as_dyn_error() - }; + let dyn_error = quote_spanned!(source.span()=> self.#source #asref.as_dyn_error()); Some(quote! { - ::core::option::Option::Some(#dyn_error) + std::option::Option::Some(#dyn_error) }) } else { None }; let source_method = source_body.map(|body| { quote! { - fn source(&self) -> ::core::option::Option<&(dyn std::error::Error + 'static)> { + fn source(&self) -> std::option::Option<&(dyn std::error::Error + 'static)> { use thiserror::__private::AsDynError; #body } @@ -67,13 +65,13 @@ let body = if let Some(source_field) = input.source_field() { let source = &source_field.member; let source_provide = if type_is_option(source_field.ty) { - quote_spanned! {source.member_span()=> - if let ::core::option::Option::Some(source) = &self.#source { + quote_spanned! {source.span()=> + if let std::option::Option::Some(source) = &self.#source { source.thiserror_provide(#request); } } } else { - quote_spanned! {source.member_span()=> + quote_spanned! {source.span()=> self.#source.thiserror_provide(#request); } }; @@ -81,7 +79,7 @@ None } else if type_is_option(backtrace_field.ty) { Some(quote! { - if let ::core::option::Option::Some(backtrace) = &self.#backtrace { + if let std::option::Option::Some(backtrace) = &self.#backtrace { #request.provide_ref::(backtrace); } }) @@ -97,7 +95,7 @@ } } else if type_is_option(backtrace_field.ty) { quote! { - if let ::core::option::Option::Some(backtrace) = &self.#backtrace { + if let std::option::Option::Some(backtrace) = &self.#backtrace { #request.provide_ref::(backtrace); } } @@ -118,11 +116,18 @@ let only_field = &input.fields[0].member; display_implied_bounds.insert((0, Trait::Display)); Some(quote! { - ::core::fmt::Display::fmt(&self.#only_field, __formatter) + std::fmt::Display::fmt(&self.#only_field, __formatter) }) } else if let Some(display) = &input.attrs.display { display_implied_bounds = display.implied_bounds.clone(); - let use_as_display = use_as_display(display.has_bonus_display); + let use_as_display = if display.has_bonus_display { + Some(quote! { + #[allow(unused_imports)] + use thiserror::__private::{DisplayAsDisplay, PathAsDisplay}; + }) + } else { + None + }; let pat = fields_pat(&input.fields); Some(quote! { #use_as_display @@ -144,9 +149,9 @@ let display_where_clause = display_inferred_bounds.augment_where_clause(input.generics); quote! { #[allow(unused_qualifications)] - impl #impl_generics ::core::fmt::Display for #ty #ty_generics #display_where_clause { + impl #impl_generics std::fmt::Display for #ty #ty_generics #display_where_clause { #[allow(clippy::used_underscore_binding)] - fn fmt(&self, __formatter: &mut ::core::fmt::Formatter) -> ::core::fmt::Result { + fn fmt(&self, __formatter: &mut std::fmt::Formatter) -> std::fmt::Result { #body } } @@ -159,7 +164,7 @@ let body = from_initializer(from_field, backtrace_field); quote! { #[allow(unused_qualifications)] - impl #impl_generics ::core::convert::From<#from> for #ty #ty_generics #where_clause { + impl #impl_generics std::convert::From<#from> for #ty #ty_generics #where_clause { #[allow(deprecated)] fn from(source: #from) -> Self { #ty #body @@ -195,15 +200,13 @@ let source_method = if input.has_source() { let arms = input.variants.iter().map(|variant| { let ident = &variant.ident; - if let Some(transparent_attr) = &variant.attrs.transparent { + if variant.attrs.transparent.is_some() { let only_field = &variant.fields[0]; if only_field.contains_generic { error_inferred_bounds.insert(only_field.ty, quote!(std::error::Error)); } let member = &only_field.member; - let source = quote_spanned! {transparent_attr.span=> - std::error::Error::source(transparent.as_dyn_error()) - }; + let source = quote!(std::error::Error::source(transparent.as_dyn_error())); quote! { #ty::#ident {#member: transparent} => #source, } @@ -214,25 +217,23 @@ error_inferred_bounds.insert(ty, quote!(std::error::Error + 'static)); } let asref = if type_is_option(source_field.ty) { - Some(quote_spanned!(source.member_span()=> .as_ref()?)) + Some(quote_spanned!(source.span()=> .as_ref()?)) } else { None }; let varsource = quote!(source); - let dyn_error = quote_spanned! {source_field.source_span()=> - #varsource #asref.as_dyn_error() - }; + let dyn_error = quote_spanned!(source.span()=> #varsource #asref.as_dyn_error()); quote! { - #ty::#ident {#source: #varsource, ..} => ::core::option::Option::Some(#dyn_error), + #ty::#ident {#source: #varsource, ..} => std::option::Option::Some(#dyn_error), } } else { quote! { - #ty::#ident {..} => ::core::option::Option::None, + #ty::#ident {..} => std::option::Option::None, } } }); Some(quote! { - fn source(&self) -> ::core::option::Option<&(dyn std::error::Error + 'static)> { + fn source(&self) -> std::option::Option<&(dyn std::error::Error + 'static)> { use thiserror::__private::AsDynError; #[allow(deprecated)] match self { @@ -256,19 +257,19 @@ let source = &source_field.member; let varsource = quote!(source); let source_provide = if type_is_option(source_field.ty) { - quote_spanned! {source.member_span()=> - if let ::core::option::Option::Some(source) = #varsource { + quote_spanned! {source.span()=> + if let std::option::Option::Some(source) = #varsource { source.thiserror_provide(#request); } } } else { - quote_spanned! {source.member_span()=> + quote_spanned! {source.span()=> #varsource.thiserror_provide(#request); } }; let self_provide = if type_is_option(backtrace_field.ty) { quote! { - if let ::core::option::Option::Some(backtrace) = backtrace { + if let std::option::Option::Some(backtrace) = backtrace { #request.provide_ref::(backtrace); } } @@ -295,13 +296,13 @@ let backtrace = &backtrace_field.member; let varsource = quote!(source); let source_provide = if type_is_option(source_field.ty) { - quote_spanned! {backtrace.member_span()=> - if let ::core::option::Option::Some(source) = #varsource { + quote_spanned! {backtrace.span()=> + if let std::option::Option::Some(source) = #varsource { source.thiserror_provide(#request); } } } else { - quote_spanned! {backtrace.member_span()=> + quote_spanned! {backtrace.span()=> #varsource.thiserror_provide(#request); } }; @@ -316,7 +317,7 @@ let backtrace = &backtrace_field.member; let body = if type_is_option(backtrace_field.ty) { quote! { - if let ::core::option::Option::Some(backtrace) = backtrace { + if let std::option::Option::Some(backtrace) = backtrace { #request.provide_ref::(backtrace); } } @@ -350,13 +351,19 @@ let display_impl = if input.has_display() { let mut display_inferred_bounds = InferredBounds::new(); - let has_bonus_display = input.variants.iter().any(|v| { + let use_as_display = if input.variants.iter().any(|v| { v.attrs .display .as_ref() .map_or(false, |display| display.has_bonus_display) - }); - let use_as_display = use_as_display(has_bonus_display); + }) { + Some(quote! { + #[allow(unused_imports)] + use thiserror::__private::{DisplayAsDisplay, PathAsDisplay}; + }) + } else { + None + }; let void_deref = if input.variants.is_empty() { Some(quote!(*)) } else { @@ -375,7 +382,7 @@ Member::Unnamed(index) => format_ident!("_{}", index), }; display_implied_bounds.insert((0, Trait::Display)); - quote!(::core::fmt::Display::fmt(#only_field, __formatter)) + quote!(std::fmt::Display::fmt(#only_field, __formatter)) } }; for (field, bound) in display_implied_bounds { @@ -394,8 +401,8 @@ let display_where_clause = display_inferred_bounds.augment_where_clause(input.generics); Some(quote! { #[allow(unused_qualifications)] - impl #impl_generics ::core::fmt::Display for #ty #ty_generics #display_where_clause { - fn fmt(&self, __formatter: &mut ::core::fmt::Formatter) -> ::core::fmt::Result { + impl #impl_generics std::fmt::Display for #ty #ty_generics #display_where_clause { + fn fmt(&self, __formatter: &mut std::fmt::Formatter) -> std::fmt::Result { #use_as_display #[allow(unused_variables, deprecated, clippy::used_underscore_binding)] match #void_deref self { @@ -416,7 +423,7 @@ let body = from_initializer(from_field, backtrace_field); Some(quote! { #[allow(unused_qualifications)] - impl #impl_generics ::core::convert::From<#from> for #ty #ty_generics #where_clause { + impl #impl_generics std::convert::From<#from> for #ty #ty_generics #where_clause { #[allow(deprecated)] fn from(source: #from) -> Self { #ty::#variant #body @@ -459,20 +466,10 @@ } } -fn use_as_display(needs_as_display: bool) -> Option { - if needs_as_display { - Some(quote! { - use thiserror::__private::AsDisplay as _; - }) - } else { - None - } -} - fn from_initializer(from_field: &Field, backtrace_field: Option<&Field>) -> TokenStream { let from_member = &from_field.member; let some_source = if type_is_option(from_field.ty) { - quote!(::core::option::Option::Some(source)) + quote!(std::option::Option::Some(source)) } else { quote!(source) }; @@ -480,11 +477,11 @@ let backtrace_member = &backtrace_field.member; if type_is_option(backtrace_field.ty) { quote! { - #backtrace_member: ::core::option::Option::Some(std::backtrace::Backtrace::capture()), + #backtrace_member: std::option::Option::Some(std::backtrace::Backtrace::capture()), } } else { quote! { - #backtrace_member: ::core::convert::From::from(std::backtrace::Backtrace::capture()), + #backtrace_member: std::convert::From::from(std::backtrace::Backtrace::capture()), } } }); diff -Nru temporalio-1.3.0/vendor/thiserror-impl/src/lib.rs temporalio-1.3.0/vendor/thiserror-impl/src/lib.rs --- temporalio-1.3.0/vendor/thiserror-impl/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/thiserror-impl/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -3,10 +3,8 @@ clippy::cast_lossless, clippy::cast_possible_truncation, clippy::manual_find, - clippy::manual_let_else, clippy::manual_map, clippy::map_unwrap_or, - clippy::module_name_repetitions, clippy::needless_pass_by_value, clippy::option_if_let_else, clippy::range_plus_one, @@ -23,7 +21,6 @@ mod fmt; mod generics; mod prop; -mod span; mod valid; use proc_macro::TokenStream; diff -Nru temporalio-1.3.0/vendor/thiserror-impl/src/prop.rs temporalio-1.3.0/vendor/thiserror-impl/src/prop.rs --- temporalio-1.3.0/vendor/thiserror-impl/src/prop.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/thiserror-impl/src/prop.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,6 +1,4 @@ use crate::ast::{Enum, Field, Struct, Variant}; -use crate::span::MemberSpan; -use proc_macro2::Span; use syn::{Member, Type}; impl Struct<'_> { @@ -72,16 +70,6 @@ pub(crate) fn is_backtrace(&self) -> bool { type_is_backtrace(self.ty) } - - pub(crate) fn source_span(&self) -> Span { - if let Some(source_attr) = &self.attrs.source { - source_attr.path().get_ident().unwrap().span() - } else if let Some(from_attr) = &self.attrs.from { - from_attr.path().get_ident().unwrap().span() - } else { - self.member.member_span() - } - } } fn from_field<'a, 'b>(fields: &'a [Field<'b>]) -> Option<&'a Field<'b>> { diff -Nru temporalio-1.3.0/vendor/thiserror-impl/src/span.rs temporalio-1.3.0/vendor/thiserror-impl/src/span.rs --- temporalio-1.3.0/vendor/thiserror-impl/src/span.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/thiserror-impl/src/span.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ -use proc_macro2::Span; -use syn::Member; - -pub trait MemberSpan { - fn member_span(&self) -> Span; -} - -impl MemberSpan for Member { - fn member_span(&self) -> Span { - match self { - Member::Named(ident) => ident.span(), - Member::Unnamed(index) => index.span, - } - } -} diff -Nru temporalio-1.3.0/vendor/tokio/.cargo-checksum.json temporalio-1.3.0/vendor/tokio/.cargo-checksum.json --- temporalio-1.3.0/vendor/tokio/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"CHANGELOG.md":"41a034e73e0d8b064af0562f5d389a7bd857c61128b267d1cf9e0320c45b739c","Cargo.toml":"7fc3c581df4a43e984f8483022c4bbde77547ed618caacc3075612054897c917","LICENSE":"1a594f153f129c2de7b15f3262394bdca3dcc2da40058e3ea435c8473eb1f3a0","README.md":"f9509d0aa2bdeac731ebd38481e43ae95437c7d38dcdc5160434f476c5821564","docs/reactor-refactor.md":"24d4f3ec6d8828bb96afe0084df9e7739bbdf1995283dbd2cd76740311485b75","external-types.toml":"d808de4bbff94d5ea56f1b1783497b0c6cd107534853aca8c79ee8404d8c2399","src/blocking.rs":"8e62b2cdc512fedbca4b4c4f983629af035afea4ee7e918bb1a3e9851c8e034e","src/doc/mod.rs":"f54f0d17974e68bd93035137a36b216dad05402cd4f3f64ea7e0008e7c309858","src/doc/os.rs":"9de68b5ad2ba2783d76f7b92a572e238705ebeea0893a10f21c755ea884a58fa","src/fs/canonicalize.rs":"93c64b72abdca17877d6ab61d50a43765d6aef9e0a9f7aaf41b6b0b7d9a8a380","src/fs/copy.rs":"262180fadc66e5ac2bf1e8389628fdd039f14788e66a4f8b10e10633e7310f20","src/fs/create_dir.rs":"233cbab2579a787614aeee88845a57f1578e9c2e064a3456c799f61430e911ad","src/fs/create_dir_all.rs":"56081d541caadca0fc59e84d55e78e702fe9373679598016224ad0b072b189a7","src/fs/dir_builder.rs":"b5b21229c7bf15e2074afab1accfbc392f3c69e546c7b652cfdc8e90d5a4a301","src/fs/file.rs":"de648446116abae4eb6bbabe352de94bd58510fa2e361c34ec58d83e287a6a11","src/fs/file/tests.rs":"014b0bd871a58d42d8b97cf2d860f83693294f935c808f1406f4b26e5d09afa2","src/fs/hard_link.rs":"98cccbbb3719baee11c232e79723ab1cb3d6c8056bddb109c4990fe2c236c1fb","src/fs/metadata.rs":"782a1a5dbc2cd6c40e928579fbfcf39e5f1de28def78781590c0280acdf02960","src/fs/mocks.rs":"040c47fed2757d3c1913109d397d6443450826db1920f19c7147a0c96893559c","src/fs/mod.rs":"8743addab538366cbe90b43cb233c54e1be524c173b9e659fda4fe9fd78060b2","src/fs/open_options.rs":"cd8acd3deaa339f38cbe14b1537ca4b07b9830105d3b385d965585330c824304","src/fs/open_options/mock_open_options.rs":"60ebc4bea76d742ead8fc5b5f4079450eb2450ecfed5f83d7d89cfe148f4ca54","src/fs/read.rs":"055ae8b6ae96ebae2d05f8780e7592bb587a742506c6df8ee8b380fc7d2820ef","src/fs/read_dir.rs":"3d67be6f69299cffe1b6403a0cb182f76bc576ebd6ae8722a2e0ef47a8f912ad","src/fs/read_link.rs":"93c104a21253372fef7056ab82e6065b0a1a8fc9be8b7329dfd5a8dd07c618b0","src/fs/read_to_string.rs":"9e5b2d476a6084e32a92c5421a8abc9d4f335f4ec677beec4bf8bfa109d7d106","src/fs/remove_dir.rs":"96475771e9c52678768288d8df6814216e0801bebc848481597ad34e829a5854","src/fs/remove_dir_all.rs":"b85abd05c7ab64ee8dc6cf5663a11e713aa51b357759ef660ef3cae3365ccc42","src/fs/remove_file.rs":"1cdf8bf16b3a164c594dac8773b7d1f9ebb28de169343184d34d6aac3b3a7eaa","src/fs/rename.rs":"a97875e92626fa46e23fece7b8698c9c4cea2bae8f1be8726f30ae6fe80ae0c7","src/fs/set_permissions.rs":"8adccafa475dcfc1bc3989af73374d90683c1be4953ef812e5fd606f968d7b7a","src/fs/symlink.rs":"32cf3e906531d30ebe6d8be7ee3bfe049949759b566015b56d0851f51abcff50","src/fs/symlink_dir.rs":"66a6655f5306854a7b6ed3748598bbe737055da9635bded715a04c3abfacda7c","src/fs/symlink_file.rs":"ec5816344f8c0b79c4d84e0ef2a987d753c719afd3bbc0d0a739224477a9edd2","src/fs/symlink_metadata.rs":"f5ce1e05f137da995e3e0d9582bae0a5f7ef4251285c64e912b0eedbb068b395","src/fs/try_exists.rs":"c666196690c4d45991374b03b27f0838b33e98d0be2838638d4de4ff856894b7","src/fs/write.rs":"1ffb734d31748bd879ad398b0fe99bdec569782b42677022957db2cae95c4d2d","src/future/block_on.rs":"30bad79b005a1ba7f696bec5639a5886b1f653a152b8948ae5fcd287c05ab8db","src/future/maybe_done.rs":"9042619f2a907e81763ac6082c080faa28af5d571dd49e82b60f3f14d58598f3","src/future/mod.rs":"980c251669bc73dd64a1f0df898c3081429c61d68ab7fcb2440ea251074f7011","src/future/poll_fn.rs":"b3c0eaeb442991d3fe27f53f2c2849f5f40b0f974035036c26661bcdaffa09df","src/future/trace.rs":"c42712a8d372922eba7e05cd21382fe5df5eec02cbcc870062100b59ab99654f","src/future/try_join.rs":"0ea5a069b17a34bbc091acbd74b9d51794a55a85dfa63fe2404d5ee91a4f0038","src/fuzz.rs":"db998767c729f35320b1d489f43f4d7788e989c8d16c0793188a2868207d8e25","src/io/async_buf_read.rs":"b37caa8f6c974b3c97327c635218803e573c531d4197950840549aa794357c99","src/io/async_fd.rs":"b54c4ce53bedcbdefd6525069ebc69724e95a490e3c685ac445c42da19eba1bf","src/io/async_read.rs":"f52c8d2f4a283c0dc8d06dc974484749973125b0b691bc0c3d100972ac67cb92","src/io/async_seek.rs":"a9a0df389ff2be3d79208ec475fcfede46a86f6ea0b822b1a4ce8273ec714b0b","src/io/async_write.rs":"198ed6a475b6f093fd2ff15e618d816d7e33cb8bc28d2e2299533e5df0bd78d6","src/io/blocking.rs":"28d8ad4ef1d03f11c5d119ccb6333bbe5a0cb666ee894ebaf83b1d8113665561","src/io/bsd/poll_aio.rs":"45e818a201c8dce93f612c7856ba4259724d2c9fcf341001eb9833f821f16f3f","src/io/interest.rs":"a19db24a34f5cfd9b242e2f68c21b60893cf2119be56bd1b7638314d2c3126fe","src/io/mod.rs":"d9b04c6badbd9317e6f02f182d7457de3429f70ca74306f6895de73828c37b2f","src/io/poll_evented.rs":"d3946956bf3795297e67fdfe783b4cc19e4a4310c23db2a8abbc12afa6123faa","src/io/read_buf.rs":"14f82f701d5056d1d5581c70aec98f7c6d287899df45e4b2e82388e7c97cca57","src/io/ready.rs":"85fc7a192552607acf6623e1f083b4e12447067bfa57fd667fb2c6e9fce7a4d8","src/io/seek.rs":"e9e346fc926c3360601b80a8319a25fd0567dd6f77fab666694e9787deaef633","src/io/split.rs":"5b1be9d1bfae72e483d02fc3b341ff13829c1fa67b9d7ec1481769aae91ed27c","src/io/stderr.rs":"6490414b47ea05a7dfd0001f864f9cd6dd236f70d8ae9acdac5d3590b2b04495","src/io/stdin.rs":"7c734283ca48e13db2bc4185c5f4ad811b497094598e3c0226a85f46ecbdd843","src/io/stdio_common.rs":"f8c72bddf74e48af264676b36470636c16e227b46740c46d44f6b21b2a44bef8","src/io/stdout.rs":"9121ce7c88e83659a1984dfce781e259d40fcd90b254f28dc03a452e7fe9cb92","src/io/util/async_buf_read_ext.rs":"010e722194c93d56dccc8794db9f73954ff58e87364599474c4d97398f4bdc99","src/io/util/async_read_ext.rs":"5c2a884c8793bb727de725298de87048545ae69c56378d8d6e196f1726583fd5","src/io/util/async_seek_ext.rs":"0535ec6139be7ea68becafc0d374aaf9d996ce9cbe5dca0b8e70b133a661c1ea","src/io/util/async_write_ext.rs":"b5ae408708110d8f45af4cd54e0182a36b28c57fa7f97e89787ef1df85ea85d3","src/io/util/buf_reader.rs":"670a58f404e5689daf1f2b3070b0b9e95fef96ad19f0e8487f294e8a2afe558d","src/io/util/buf_stream.rs":"2246fe71b707c15d7168c5da5ee158cec6e854d4fd11b685531c16a9c3cf2c6a","src/io/util/buf_writer.rs":"f9c3e018c9f9177fb6d910096503caee727bebd3c36f5f67dca2c4c55044408a","src/io/util/chain.rs":"5cd8df2cc7bbcd18ca2336a78507fa8009c0a9e595f81730a8c16cadb8f731a2","src/io/util/copy.rs":"f4c7d59736f9a6d8a1efdabf9685dce2ccc3053c5f9578d3b3aab4be58dd5c8b","src/io/util/copy_bidirectional.rs":"89a5fb3f77e9863c9496c02afc2613fce039f47a1b2322e6221dccda8323f80f","src/io/util/copy_buf.rs":"9d83771a6edcc6d0d32f066072e375634e21a13517968ec9b21a4edddbcc2605","src/io/util/empty.rs":"32cbcfa8bc033e7ae1cd62505a84125750d1abccd0c37b2a433c5eb80db0f0f6","src/io/util/fill_buf.rs":"223725d828071e923f25d2d49a0f6e470c411a6d9ba225700f2dd8d5793601bb","src/io/util/flush.rs":"fe3b4ff226e294843b8cbea9dc4e02d581582b78ddaafce137c96e290699c718","src/io/util/lines.rs":"1d9f9b99567111c911e72a4caa2abb19b277f2cdd0ca3268ac5ca6df5276259f","src/io/util/mem.rs":"0b4aed07c02a2225b688a167e6645023eb028b86afeee4bd4eed71294c1fb32f","src/io/util/mod.rs":"6a9012d78fe2bed8240e7a628e9421cbef45433551522624065fdcbb329f3594","src/io/util/read.rs":"58988c3fbcf5ede633dc224d7df5a372495c4485757dec9bdbd825138bb7f5d4","src/io/util/read_buf.rs":"a87be2d115c09a6782ec8cadeafc92fb1fbe534580e71540087c3298a03bfca2","src/io/util/read_exact.rs":"4a8650fd7a885963a0fef2bec24c17046c5624e4dd7fe229ab3f33c4a92fc66c","src/io/util/read_int.rs":"49da230796335df584832cd7deb8370b4d1e0350d743046389a9d9ae17dbd94f","src/io/util/read_line.rs":"9cdb2d778b81bc50098a6851981ed9f541bd0c7896c0763b811971b5a598b7e8","src/io/util/read_to_end.rs":"1c061665818a4ca9632403aa95955bc435f4438c6d6317370ca728fb47acdbc5","src/io/util/read_to_string.rs":"fafb5463b013cc8f76def3a505dbebd179afc95bde0e2ca9388e428265788924","src/io/util/read_until.rs":"d9a932dfb5ef3d0d5e8faa72a2b3b9d1765c85599f3bc77741f69e7fe9c0d037","src/io/util/repeat.rs":"d4effcd81338831eb373cf2db972a99218b8379b91066940a732edcf4524c7c2","src/io/util/shutdown.rs":"971454342b4636fbd68e123d59d87017d81f72afb410c385846069b11def8efe","src/io/util/sink.rs":"0dcb794e48ca9b1c28e5f9f2051073ea0951a54c9c7dfc903ce9e5489d3d8cd7","src/io/util/split.rs":"03a59adccda29608886e38a1f484fbd4d6a6019180c4cfa851372d250796aa5a","src/io/util/take.rs":"ef080ce27d23cc23b9f99fe14ddd56349a3cb1442aba18f8405c30d20017b074","src/io/util/vec_with_initialized.rs":"f8673705967021b5a3cb819d672df89ec81eb5baabb48de7bb598d53352b62f8","src/io/util/write.rs":"20d14ee545ab1f67732915522e97808d1ddde13d151505c1289b596be519f7c8","src/io/util/write_all.rs":"906ff3fb24c6a979b104598f9a8229421bcaf2a4218c28069504b34a218241f6","src/io/util/write_all_buf.rs":"5911bf673ef89097938f4e2e38d9012865b28a0ce5ebb217ebe0e2507de6c1e3","src/io/util/write_buf.rs":"ab51d6174de24cbb729ce77dbaeea27e16059b8253e4830d8243ec5f08a08a8c","src/io/util/write_int.rs":"f321e69b0c7c01728b079e9fdeedb96c26475667e8b259d0c5f4a83d060990d1","src/io/util/write_vectored.rs":"7a335a9f796daa048fa9708dc44d32d2567b36461a6d88f07893eb31f304b69d","src/lib.rs":"28bbf0952b3de36f4e205c2fd1b687a5b9ddcbc08a7616fec18802a81fd1b698","src/loom/mocked.rs":"5b85e97fcee3be1b0443b5608c7fe909b040bac463c94b817ed6b42bfd8031c3","src/loom/mod.rs":"b14b9333a7a21bd125a4ae82f01e5ea9c9ed2f78d7d1ad49a13d9b176f1fe8ab","src/loom/std/atomic_u16.rs":"5aba33a798e8a95129e3fd039e4412322e25880003ba782031df9faac3dc93e1","src/loom/std/atomic_u32.rs":"7fbaa448621371cbb9b8dd882701236b41bed599d69eeeb0a1e25b2a9a4645ad","src/loom/std/atomic_u64.rs":"2d98d1608058f3248d79b1e9c96118627fef6362ccfefa77047be2e5617d7571","src/loom/std/atomic_u64_as_mutex.rs":"1a6b9f8417e968a78dcddd8c7c320c447b9f27d5f84245cae86c3ef68425c749","src/loom/std/atomic_u64_native.rs":"559e6fd21e678b904f5a905f2756a4a8e32ca68a8c7a9b4344af86979373cfa0","src/loom/std/atomic_u64_static_const_new.rs":"a1c0e7d2ea28904ae76227baa7da5da33b68257f4c1a7a456f8d3171529bd934","src/loom/std/atomic_u64_static_once_cell.rs":"92a25654dd8232f6c02c8ec58d4f706030db442fb2a5ba07f1aec09149559725","src/loom/std/atomic_usize.rs":"698c0a65ea4d1ad05d49770cef2614cee643794be4b6208ee071a3e381201349","src/loom/std/barrier.rs":"1539e5773ad0ab1936e8a9a6cf5c20bc697915abde15b3e0898615194eb37fb0","src/loom/std/mod.rs":"22da677018c512c613226a991115c35cef6b02da6ce43fb9ce0530f3eacf2117","src/loom/std/mutex.rs":"ce413b7819207a93d93984811476b4902e39ad172e8dd87fc3376c2398c7044e","src/loom/std/parking_lot.rs":"16b82f1580b4cf5949a9cb9ebfa2c11d98d91f97b2b2f7b6f90a213dd736985b","src/loom/std/unsafe_cell.rs":"789497164c351a563293d82edb82180576471b92ee3aec77de1a92a47423e390","src/macros/addr_of.rs":"cbd020a07ffba2b1c608856081499645cf606cb45444dc53d94457381a94bc33","src/macros/cfg.rs":"377b9afe24981c9b1f461d95619bd5ccb2560544c43515648d99576655cee078","src/macros/join.rs":"076dbeed1cbbb292e39012d18c0d1c97848bce48c4609b23f327025989b34a8e","src/macros/loom.rs":"bee8a86b0b96697cc21e4b5e9f1a3403c1f9dbc8c4e591a2ea91f51c2469d3d0","src/macros/mod.rs":"913b1382779ceedbd13606e429f59b9c7ad929324f121452f47773c232c3303f","src/macros/pin.rs":"294e5644061e41801dcee5494b7334439e09af0b6219ce164090feb624864631","src/macros/ready.rs":"6efd4c866c4718c3a9a7b5564b435e2d13e9c1ae91fd98b1313d5e7c182942d6","src/macros/select.rs":"4d9588dd514cf9f25b8c3c76ab08ad141d8f7ed1acdd856c6418946edd08f055","src/macros/support.rs":"da976befe4ba4d29e96f0de24cafe6e1f7f97364274e240556a01f2af77314de","src/macros/thread_local.rs":"c03b4bd975825f89feb0a138aaa5e3413ee8dbd6959a3d25ebdef8780126464c","src/macros/trace.rs":"33befd4533a3b2b4b22e246033f2bea8930174a7da58adaa57dbf20931275bcd","src/macros/try_join.rs":"2233cb76a6ce35d020ebbb8a0b0d713f01c0b6fd20fd878442bcca688c97ed6a","src/net/addr.rs":"0ed3d72ef6679e3ad76c6830143713c611d357ca4ece88c3ee5ceb2787217224","src/net/lookup_host.rs":"c7a21d735225e316253d822f6b11a17107e6a8db004f947a54d8bc12ec782baf","src/net/mod.rs":"301307d5a5f8c783418646ef9f7712414226a73061a691b468e0e3ebb7eb4df9","src/net/tcp/listener.rs":"8ad5e1193b3d306f5f9ce7a1ad02dd43aabbbe26f9c407338d49d23c35c3bde8","src/net/tcp/mod.rs":"347182e4f0381896bf3b7ab578c4564f1730ae25a108076ec65b8e855683fbf6","src/net/tcp/socket.rs":"fc3030f5ac54a0fca7feb2e97b27837c191500e8d7f8bbd68e18a05added25bd","src/net/tcp/split.rs":"75d1f6c4afa23397164a30c4409a73c8d3df022c780aa4f91fabfa90549cc606","src/net/tcp/split_owned.rs":"0c5a9f48e7e49c257c25e138f74c0c5d3402edf447a860cbfc1a36439d997295","src/net/tcp/stream.rs":"d1538abe1605e5471a2851a9b65d0eb0d997bc1f6279378244b52344bed392ab","src/net/udp.rs":"088244bde74e946856f41f28899708aa1977b31d4c682a2465e1ffb78e3b48a8","src/net/unix/datagram/mod.rs":"fc48924e5d1e551405b0708a2d122473cdafeeee802a5722f64b4cf41a1c01da","src/net/unix/datagram/socket.rs":"23bd655f5e0938d934714904b7221e4c1456d611cb76f7bf46ee9379f8b70295","src/net/unix/listener.rs":"af8488a7efea8f6fffc36d857631e7452125a5263bbffd3fbb9263c405ea898f","src/net/unix/mod.rs":"72008ca5352432de2203321244da5377afe5779ac15f5f6a577998c037e7e4ae","src/net/unix/pipe.rs":"b4645ef11731716a53c62dd01ab91fd944847a2c6e4049e2ba1a9fbd6491428c","src/net/unix/socketaddr.rs":"66bf18321a81baeb394a7094567632b113e44e12d2643109b6a97c89d919bf3a","src/net/unix/split.rs":"bd0388de8b6035b8cce2a34989ff56304697ed6864615ae13474f4e9c504faa0","src/net/unix/split_owned.rs":"5eccba5c1d589af4e5b52d17410c2290c289db5583676cf016de93ccabdace9e","src/net/unix/stream.rs":"5fc4926d83ace17a11737a64c03997b0e737d26f1b0cc66dbbb037e438ac2740","src/net/unix/ucred.rs":"755e280300577ae29605f0850aed95a65b3787aef65b5e7c7e2df9e92212df75","src/net/windows/mod.rs":"a1525f35c1acb92b15bec788a625b76acb42f9424f392074db697102ce79760d","src/net/windows/named_pipe.rs":"f59b2f22d373698d5859a8f20f2aff1190e6b77733844b7f5a50f9fd28b81093","src/process/kill.rs":"2f98bd1bd28ab37bedc34ab7b737760407ab5315420538acbd18da31d2662d94","src/process/mod.rs":"3712af791fc87b30aa294bf8b8c9440f7a47401977c7c8e478b25a50cc5957e6","src/process/unix/mod.rs":"44d936079ea6ee09113e9948f5f4cedcf0351050ff54c4949922bfa53b3a7de3","src/process/unix/orphan.rs":"d641d9dcf41b0ce26a3ccc38e2e8d3cd505c060a87a137fa761132e2290bd886","src/process/unix/reap.rs":"62868319849b8482d8d927dcd00cc8a74b9af61fd47494b39bd41fe2f4dcf0b6","src/process/windows.rs":"7a47feef09bd00c701bacf6239dc146def081869d0ccaf4172220c9bcccb9bdc","src/runtime/blocking/mod.rs":"3a1e04d2fc5590c7c0a19c85ecbd893108f9a81b197162378c525133c3bbc7aa","src/runtime/blocking/pool.rs":"b61fe8afcd4deef0510e2ff84e6c874901d8f4c371bcceedccdc9261305d0d0b","src/runtime/blocking/schedule.rs":"8768ca9cdefc1b765f8915cdda096f7e5596e12c8181a5d90ba4a6b6cadd36bf","src/runtime/blocking/shutdown.rs":"6eaf2a1418b885bcc1ce3f257b99382de9c16f848ed53d9e00dc97389bb6b816","src/runtime/blocking/task.rs":"08571bce8a99dd6296ba7099c1f6da8c832d13a8c43db22044c683470147d7d4","src/runtime/builder.rs":"4a593b13bbdbe8205447d3087d1d629127c3dca38da0a4592045059cc0479b05","src/runtime/config.rs":"0184fae982b428993a92e1651f5c0918fd2f62a1113b67dabc444304e700d1ad","src/runtime/context.rs":"fa5278a91f67983916867d5a1f7265f30c7c65e036b43ddcd57c5ca036194db5","src/runtime/context/blocking.rs":"82ec6b5c6b0ce7b18582cc931e9cdd6d5946366cd676c9e6bb0235e6e8471ed3","src/runtime/context/current.rs":"51023fb843227d82a4c8b7a093148a2b36306f398e2770026d5d1e0f296e08dd","src/runtime/context/runtime.rs":"df7b8deca59426ac39d6950b518172ff7a7ef306c1681187a4d3b1f22168984d","src/runtime/context/runtime_mt.rs":"911b95f39dbed005a02fde0394bd74c02e14e5b9f5c98bf49511f6c68ac5dac8","src/runtime/context/scoped.rs":"16bfa1da16baa831cc926c41df869b99bfbc6d96cf39a04aa4914a9e4b19a2f0","src/runtime/coop.rs":"746b852952306f05a4da31243cff626b5c39b6ffdc4a6bc1c9a5a7c7fad5e103","src/runtime/driver.rs":"2e9640d81bb8adf0a471d58c321b5fd50586d9c986d52e4f454fc0cd85c71f3f","src/runtime/dump.rs":"de53e25c28c362cc8bd4f321d23a7c5c8a3956ed3a2ffa4acd4d62f6397ab9fd","src/runtime/handle.rs":"c29a825b2f6c3bb657a20f0ac5c2099c791b0085c82bc102589b28e331bc614d","src/runtime/id.rs":"c43d92101ffcba10a4eb7a876910ee4944b1f921a89f7e44d5889776bdb2e19d","src/runtime/io/driver.rs":"5e63691a3ad633200b8aa13669fdcb38a413e3160ebb9b651754fef24c4fbe94","src/runtime/io/driver/signal.rs":"2e53479e68f48bf39c8cce92f0d12422bf4c68d931e741aae8daed854cd3f6ac","src/runtime/io/metrics.rs":"e711c65da155ef73e567125c0c9db33b2f511982a0c0a6b4f3b37c2d87c791a6","src/runtime/io/mod.rs":"270fead37871b8ee185e2e6e7adccb564bc8f2a0a02d693657afa76748e8ad1d","src/runtime/io/registration.rs":"7f9256af455e3d3a9b4db4cbb18ef14b3cb67740540af8df473931bd69db6411","src/runtime/io/registration_set.rs":"df44009a88c17b6a122ba6d2c8c5bde11af2222b3b8d0003a3d990990efcdde4","src/runtime/io/scheduled_io.rs":"9def82d79737b38dc25b6858821c79adf2d057501f70d47432b360ada202081a","src/runtime/metrics/batch.rs":"68fd84f0ccf135b10e2ef44c71c481129ca608005751c76deeae820d81534f2b","src/runtime/metrics/histogram.rs":"1d85cc2e6e1ef02b2cc4f2c627d5405d603742b995dd3ff23909a3a2fbedc8bb","src/runtime/metrics/io.rs":"960f44573cd16e2ec43ed872f235ece09db9f4c87e217002ae0d180e20ce9838","src/runtime/metrics/mock.rs":"d18d2ebbea8e4e191ab3ee77e2604a49e1597d1f6e858a2500bfa7e438176e76","src/runtime/metrics/mod.rs":"6c690fffe34bac1267eb3dc0ed93481874795d2fd2fe9f495859fab0866fb814","src/runtime/metrics/runtime.rs":"b244501ae29d1b5adfeb201e28ea88261cd2104c8bc3e89867898acdeaad523f","src/runtime/metrics/scheduler.rs":"997ba0339af84ef878881fdb6f35d8f6b39dc81e8f0b5cafce94476d50675c91","src/runtime/metrics/worker.rs":"84725f923fa65825a74841f6b3df06e100a838da61942f1113814496f896cef4","src/runtime/mod.rs":"5509476a72103a3939fc9fb037b352644462ec246748bc35a265a30c2e7781d1","src/runtime/park.rs":"a01589e5a164a9719ed8613552c9bea805ca96761b79cfae2eb30f002b694cb1","src/runtime/process.rs":"f40854b46e5851d7f5ee10f50d839aac933343c2178508f419c8e41dc60557db","src/runtime/runtime.rs":"9a733f2afea3d1ae3563560db8f5146f38470e5c1bc46ac6911f9429723d57dd","src/runtime/scheduler/block_in_place.rs":"38b87ad398cae4e48bfd2afd9e2e9a0af1ee34c379c781d749d38cfe5fe8bd29","src/runtime/scheduler/current_thread/mod.rs":"b9669912fe5ead3a70c3f3892fb2435b5b6ec92b935f9a82e44fb522d95501c1","src/runtime/scheduler/defer.rs":"6124d19b90b56db1aa0688ac0e4af964a6882a51814b0065fc80d3cb6398e98c","src/runtime/scheduler/inject.rs":"fea0cf9dba0e72efaea4671a1693fa5bc68aef376d9773407855551951810426","src/runtime/scheduler/inject/metrics.rs":"26ee4f9d34c9d670eb75ee8d02a6e268952a1ef698ab3213d71873a97ea2c851","src/runtime/scheduler/inject/pop.rs":"335b42278217a3020ec1419d070132f8f5a0ce832c504dc7806c42821848be83","src/runtime/scheduler/inject/rt_multi_thread.rs":"d31776b467009c63f7797fd8caf3a2b1a78023e96e41d1f49d01bc4bda65cc26","src/runtime/scheduler/inject/shared.rs":"6fdc9c11674c2e83c37721ac0c30f0e7d23f8af8e4c4a4ec5f18e276b80e05b2","src/runtime/scheduler/inject/synced.rs":"b69a737bcba7cd27c660081c57c03b3672502e2c358beece0d4d8c9815e8af92","src/runtime/scheduler/lock.rs":"2aa5a50067dcc79d66ca39d1e4982c28f55bdcec43ddd7bc91414de5f794019c","src/runtime/scheduler/mod.rs":"a71998635e1c881e2e9871286de0522eb34fcf1ae0d9ae617827eb8593a2d810","src/runtime/scheduler/multi_thread/counters.rs":"e5a6a1a1d01a50890dabbeb7998c7b64a954ed94bbb7cf9505ff917ed63633f6","src/runtime/scheduler/multi_thread/handle.rs":"d10a984c2bd999c2d9ecd3e690052971cbc733cad4d77c808254decdf916f0ea","src/runtime/scheduler/multi_thread/handle/metrics.rs":"d5858d459700380a372821c2a5f03255f96e58e2fdfe8367e6cf355fb29c7b72","src/runtime/scheduler/multi_thread/handle/taskdump.rs":"20768dab2f9683ecb10849fd3a4a2862a0f9942fba97d6ac29c8bf5ba7017c62","src/runtime/scheduler/multi_thread/idle.rs":"c2be2afa82ddbbe36eb6e231c8a01cd7c233d9c6e197d2feae32200098e974e9","src/runtime/scheduler/multi_thread/mod.rs":"2fae4c9f66b57d15f63c485ee6ebe724f1d41de126e641418ed6ec40c8fb3e0a","src/runtime/scheduler/multi_thread/overflow.rs":"c70ff49356fa6948f9dc53a19014a5dbf7f6bf52d4c00d9c2e20b0d23b7b3bf0","src/runtime/scheduler/multi_thread/park.rs":"86aa7fb6f52b16237e9465fe572ff61c7aa13e5fe9654ce52dab435e23df9781","src/runtime/scheduler/multi_thread/queue.rs":"1b7ace7cdf3ae20b80980aeab84ca4493d6ecd0247c808340a8b62fc3f7ee77f","src/runtime/scheduler/multi_thread/stats.rs":"a423bc706b141d808764911ccb9079d0232e55126e5c7919672013b0ec32a5db","src/runtime/scheduler/multi_thread/trace.rs":"f8ac6b0db76c45057c0061908d5acd63eb1463c397984bfd9a80f4bbc2748f30","src/runtime/scheduler/multi_thread/trace_mock.rs":"3ce6a3d19b53b608cba34fda213e498691ed55ce4a542806f9080bd2dbdb054a","src/runtime/scheduler/multi_thread/worker.rs":"60565a05ff33fedbe468b666218cb341b405bd76ee51f5eb34ee580596fda221","src/runtime/scheduler/multi_thread/worker/metrics.rs":"14e15c7315e1e1a6829b67beda6a858570b70eb9ecf9f0f3d7530881ff7799ea","src/runtime/scheduler/multi_thread/worker/taskdump.rs":"ea2bd932ef0a3b999fd8a16e15f9e7dfe8c30f3589569b7f7ab334a63ad3bede","src/runtime/scheduler/multi_thread/worker/taskdump_mock.rs":"f8664a755109ddc87f7ab82c4815cb12eb37c0bee3a1808907ac10534b9867c4","src/runtime/scheduler/multi_thread_alt/counters.rs":"6d65b0741d5ab6afaaf7ebe31419fdbb953752bd83fac679f2ffa897ccedde86","src/runtime/scheduler/multi_thread_alt/handle.rs":"282c992c4c483c0f4f9145c0548b383010fb26261479e8d7c12813bc2766756f","src/runtime/scheduler/multi_thread_alt/handle/metrics.rs":"d5858d459700380a372821c2a5f03255f96e58e2fdfe8367e6cf355fb29c7b72","src/runtime/scheduler/multi_thread_alt/handle/taskdump.rs":"20768dab2f9683ecb10849fd3a4a2862a0f9942fba97d6ac29c8bf5ba7017c62","src/runtime/scheduler/multi_thread_alt/idle.rs":"23b34e1fe1540ba9d501f79ca590a4ddf99ff6683abb5155f4f1a435ed5360fb","src/runtime/scheduler/multi_thread_alt/mod.rs":"fabc12c49c4121da7914c6bfe301c70dc36a942149dc82187e29c75a0b8782e9","src/runtime/scheduler/multi_thread_alt/overflow.rs":"c70ff49356fa6948f9dc53a19014a5dbf7f6bf52d4c00d9c2e20b0d23b7b3bf0","src/runtime/scheduler/multi_thread_alt/park.rs":"86aa7fb6f52b16237e9465fe572ff61c7aa13e5fe9654ce52dab435e23df9781","src/runtime/scheduler/multi_thread_alt/queue.rs":"e15940695427b373976aa7cadeba2e2ce7296fdd136029e71b27b87cbf939532","src/runtime/scheduler/multi_thread_alt/stats.rs":"2764574e25b9276fe529ae41c24e1e56593262540771788294f38f26f1d3e633","src/runtime/scheduler/multi_thread_alt/trace.rs":"e54f7dcea7603c861e7afbfefe7441766f8fb3c0f5ed1bcfd76a3bf0b89ac692","src/runtime/scheduler/multi_thread_alt/trace_mock.rs":"3ce6a3d19b53b608cba34fda213e498691ed55ce4a542806f9080bd2dbdb054a","src/runtime/scheduler/multi_thread_alt/worker.rs":"9f3d64f57119d0a9d029df2c99013cb4e82b6953d74124e574d04b44a31fd4a8","src/runtime/scheduler/multi_thread_alt/worker/metrics.rs":"14e15c7315e1e1a6829b67beda6a858570b70eb9ecf9f0f3d7530881ff7799ea","src/runtime/scheduler/multi_thread_alt/worker/taskdump.rs":"9f1c93258038a3b32af9215ad7b1b54767b2d6dcb4ad503d90e5779225bcdf13","src/runtime/scheduler/multi_thread_alt/worker/taskdump_mock.rs":"f8664a755109ddc87f7ab82c4815cb12eb37c0bee3a1808907ac10534b9867c4","src/runtime/signal/mod.rs":"1498f18f55e730270f8c92906857d856de5ae264d80a96699c8b8b2f9439b77f","src/runtime/task/abort.rs":"81004b45834ab44f1b673b31379d37c68c5ce8acb7d223ea58207f412745d3d5","src/runtime/task/core.rs":"a2c34cde1e1d22e405323a32ba90cb69ef335c552e8b3247a9e9983c680c2cca","src/runtime/task/error.rs":"0367095439c51ce94f53b13aa64404e13e85b114f77cdcd7315d4cb3d4fb9344","src/runtime/task/harness.rs":"1e6ea44979d0bcf96226979f73e87967bfb3e46286cb21770809989719d047ec","src/runtime/task/id.rs":"4cade5f2c02e5d3a0c516625aa8def2da110db3b83d13a6d9e26f2a1ad8b31c5","src/runtime/task/join.rs":"db92ae97f715e36bc77fb6d8d668479472f5454406aaf4c1191623e59a893989","src/runtime/task/list.rs":"86f1aabae9b130dc41c2d5d52b5b61801539be6e3e09d52a06705af357e07cb1","src/runtime/task/mod.rs":"8ff9a21c66499705b992a6318428cd6446d9caf84b03c6445fa6d4e76b9c92e1","src/runtime/task/raw.rs":"4c30fe4cb3c57361b0f28a4acd25877b1f6e6507076b5933ad91f098ab2d7f71","src/runtime/task/state.rs":"2a75a1af1e2e6bfbbb6e33c8421c0841d0680f1fbbf42d2b555d9d33ef9f0c8b","src/runtime/task/trace/mod.rs":"a92eb57080db5c9f1d564b5208fa5761f6df14fd9df691151648b1066cbf2d60","src/runtime/task/trace/symbol.rs":"bde671f445b351d388e5fcb80e8cb8be4424a4fac4b8ec3aee356eb86082b422","src/runtime/task/trace/tree.rs":"b8f9aa018147d539841e5716394086709fec6a8d0f95f6b2fc011ed131063dd6","src/runtime/task/waker.rs":"39fbfa7c33406aac935d2ff8d022af6d3f9619ac7edae62d24b1ca97268e6499","src/runtime/tests/inject.rs":"97b68f6c22f6861b2a1649a8f919bae3310d6fddeae107aee4dcbf00de526cdc","src/runtime/tests/loom_blocking.rs":"fb4bf871ae59cd567ae4a2cb568d7cba31ad92579bea17c598d273a3a749f74a","src/runtime/tests/loom_current_thread.rs":"f9a8b7e0d0b829eaee01d155005800c7a907ec7f92acdbc0678e9149aa95ce1d","src/runtime/tests/loom_current_thread/yield_now.rs":"fac610e464660c196a35ce15a46c9ebf537d3f3475cfc633e58c76c25eb558fe","src/runtime/tests/loom_join_set.rs":"d6612a19c695907a8bb41b24df3b404cb521cae6f30226f2449dc32f18700b69","src/runtime/tests/loom_local.rs":"69cf7fa67da9e3efe3eee722791f811efb395dcf821780051e62842654de09e3","src/runtime/tests/loom_multi_thread.rs":"6e45d9197e3ab26270cfc4c8c48f1fa3a0d508e7d8d4c0cecb3663a83fbe80eb","src/runtime/tests/loom_multi_thread/queue.rs":"54ae93457aaa96dafa25c683b13b8133994ead7eaa135539468868c94a2e623c","src/runtime/tests/loom_multi_thread/shutdown.rs":"2f48626eb0a4135d480aa5bf72e514c4abf39aa17711c96d3829f93c03758557","src/runtime/tests/loom_multi_thread/yield_now.rs":"fac610e464660c196a35ce15a46c9ebf537d3f3475cfc633e58c76c25eb558fe","src/runtime/tests/loom_multi_thread_alt.rs":"8e06356844ef57004f0f9fa3ed4c596e6b173c01b9529022b252fd27bc3bc8a8","src/runtime/tests/loom_multi_thread_alt/queue.rs":"54ae93457aaa96dafa25c683b13b8133994ead7eaa135539468868c94a2e623c","src/runtime/tests/loom_multi_thread_alt/shutdown.rs":"2f48626eb0a4135d480aa5bf72e514c4abf39aa17711c96d3829f93c03758557","src/runtime/tests/loom_multi_thread_alt/yield_now.rs":"fac610e464660c196a35ce15a46c9ebf537d3f3475cfc633e58c76c25eb558fe","src/runtime/tests/loom_oneshot.rs":"cb0cb66e1014708a10a2236c2dbbac9441b6a6e36a49c419fa3a51af62b054ce","src/runtime/tests/mod.rs":"1d8d0b89fda125b00eaf782bc95fb1211d1d14b391b7089f08815ed8c41f7ebc","src/runtime/tests/queue.rs":"56ea2b3c8f3a1a01091c3e624259b03a57ab555e52ee77931ad9edaf5d6db329","src/runtime/tests/task.rs":"a9e7e18447eb1c43f0590580c2001c206eaa48e542502a04bc8dd4817de3962d","src/runtime/tests/task_combinations.rs":"0ebf6682728fc5ede9374b6353a8fe5d0cb1d27e511f338e779607d8fcaebcf6","src/runtime/thread_id.rs":"ad85f1057b2c61838620f1323fa8a710e140bf448fb2aa1d9d1f87a7fad5f01d","src/runtime/time/entry.rs":"7f07396d64c008f1d3b9a7d496564a07bb976837c3e1f0b21ba02ddfb6306515","src/runtime/time/handle.rs":"1ecbebdc070477d61b782b2f4d3a5b9b5cc06dbe447188f23eef3257fd16ea8b","src/runtime/time/mod.rs":"28f78f2bfce3b7cd61a893b19b93a285d55f084299401816f3d9fec03d87de70","src/runtime/time/source.rs":"c03f9eb4d229a582826164031541f028e26b95c75fd02fabfde3668cc81b5e8a","src/runtime/time/tests/mod.rs":"fd656b75bd4e7737b517b1e84949d84f5af72c8b52ee68777555c724bb1bf7cb","src/runtime/time/wheel/level.rs":"974a230b26f6d4fc9f4046741f1e8ef90acd2d53132f135515bc37914afc276e","src/runtime/time/wheel/mod.rs":"1104133c6d50ea708c5733f7bf05b2ad1f027608a7495d18e649c9b97f31204c","src/signal/ctrl_c.rs":"3e1d98df851b9ea1418f607c260434e906ada4e3d6c14cdfa5c81a0c4d55cdd3","src/signal/mod.rs":"4da598cb028d5716628bcfc06c0fb0bb8fb8f0f0986c6a328a655e76979cd85d","src/signal/registry.rs":"c9e9d1df123c6069c2ad80824162a5de8c0163a9c63714d26ba2128538e34cfa","src/signal/reusable_box.rs":"3d3b710b1794d9f8f5463e9ca380ece60c426b58786a5cb5f40add627da01aeb","src/signal/unix.rs":"0504cf52a28e9e8e528fab0ccd4e9c3dc86fdcfb807ecc9506fb6adca186c531","src/signal/windows.rs":"826a2a16fc9ff37ecaf7eef88f09d8b5f57adb6095dc10b981a4c0bb67b70a2d","src/signal/windows/stub.rs":"a6d3b11aa3a7247f7a8365c3241857bcde48d8c390d569e6bc9529c9b1f8ecd1","src/signal/windows/sys.rs":"3e4882762ac424cb3b3caf71d5a69f571fbe14e6b298889ccb227c58b213c257","src/sync/barrier.rs":"45a8ca0fec02e6a6fa77cfeeb09e3a142f931d413c00962aa0d0036ff8ff37bb","src/sync/batch_semaphore.rs":"818f0b5d04d7305acbea8a8c13bfe7c2b4532930935526f25d58fd43295d39aa","src/sync/broadcast.rs":"6fb0a8fd84c52c21938657ceedb0e8e52d057afdbf34c984416b1d68ccdc24e9","src/sync/mod.rs":"080f05653cabfb3423b0c96d04581764f3c4f97d813b0d09151d2e346e160480","src/sync/mpsc/block.rs":"70a034a62ea88a95e970352a7a3e004c2755c75afa34d71f3653537389e6e2d6","src/sync/mpsc/bounded.rs":"26f5471babc1262f5d547600cf0151a6bb6221e1c44be71f509629a61ec5b960","src/sync/mpsc/chan.rs":"d3e6583e6b01126025bb7e0d4a893e43dc1c5c4cbd93f05b5a901aa97aec44bf","src/sync/mpsc/error.rs":"c11e21843f2cb734446a5b1cf3537b212481cc012f27e93b34848586919928d9","src/sync/mpsc/list.rs":"2c99cec4d3d179f6e668b8de37e58525477be3f069a9a748f7f8ed2f8a40f817","src/sync/mpsc/mod.rs":"3699ff2b4c5315f0a1cde40a1d3a45bc312febe1cb612cd68c6176ed7590bf1f","src/sync/mpsc/unbounded.rs":"5cd0694dbd4a2f33d44756a382c02780e1951dae19d246fe1af3e026ad6da5ca","src/sync/mutex.rs":"82232f5ec117ba89d7535db47f201162b3589de3b0321b819b73a81f4a72b0ca","src/sync/notify.rs":"c7433db663208d33dcf8b1ceff3a1761c425aecdd093f2d448ef5bbb7ed6cb85","src/sync/once_cell.rs":"45549067ea02478c8452bf55d9dc699a41b33339804cab1e7f8f981df0220f5e","src/sync/oneshot.rs":"2900d5d4ac81c3056c04b38ba7252eb4e98437943cba1bd6f06eafe78873cf93","src/sync/rwlock.rs":"c463130615337f2ad8ca20bcc430fb65a96f3f8f8daa1162597c2e6c129db8c8","src/sync/rwlock/owned_read_guard.rs":"135d81271f0028263ce99c3246cd335a08912b50a43f125b3e8f7739ca353cfb","src/sync/rwlock/owned_write_guard.rs":"ef56443fac210bc3d0c2b66beda8436154c2ab726f1dc208758b54b2b087762d","src/sync/rwlock/owned_write_guard_mapped.rs":"3038187dc3a791a89505621230d3edd8629287ec11490ff37f2c624b593c5325","src/sync/rwlock/read_guard.rs":"0f7e52adacad0fb1529a453eb14f8207a8caabd8f5fca4aeb2031a9e9b0981f1","src/sync/rwlock/write_guard.rs":"f3855cdd09940c86a9bd10b91d3ebb37b2219b60c727a3bed377404ef2483c35","src/sync/rwlock/write_guard_mapped.rs":"8c839c4ac4b73faa1c1fc697753e23fce113ba6e576d2abc022ddadb98a34af4","src/sync/semaphore.rs":"fd172ec3e84527a95153ee817797194c748b1f368b9fe2e21b79a9c6898a9e5a","src/sync/task/atomic_waker.rs":"41e9e05522254afbacec9895390d6f95498e413a61d8f654f9c421c808e7f83f","src/sync/task/mod.rs":"f5e38105c7f8a942c0e49b973bad0a8c2a1df81deea19f3c5228edc4896c1725","src/sync/tests/atomic_waker.rs":"28dc6d373e83a846c4b6fdbca55949dfd901730428fbf002f78209e1f9f5125d","src/sync/tests/loom_atomic_waker.rs":"984b52699c47383b9b62e6c4ff93fd458bbe64cb4ca836463adbaf94d27c38ee","src/sync/tests/loom_broadcast.rs":"b2c6f138707fc389ee7d91109bc38093af9060b3465e68d3543cb652e0070406","src/sync/tests/loom_list.rs":"54321d0a1a21e65ddd7e958b751480bb35b93d9d4ca11a218043e684e0d6bfff","src/sync/tests/loom_mpsc.rs":"4883352b9d75a81c878609613545ae14910eca4f2e7f3718053dfdb792aa0760","src/sync/tests/loom_notify.rs":"cd401c73084df551043b7d96b9f2c51e9c1929a9038eb899381bd4ecafe04ec8","src/sync/tests/loom_oneshot.rs":"c3596c15692b16e7cb8cd6957362adb3a98b3d7f16c4a4262f19a3a27f262b03","src/sync/tests/loom_rwlock.rs":"80ec00bdcac838806d4d9f711cb154e02f22913ba68711855c39ca92028d3e4e","src/sync/tests/loom_semaphore_batch.rs":"c6f69b8d5b2e6842287ed34638a9045095d9f94c86ba6bb84c1224bbe10026ff","src/sync/tests/loom_watch.rs":"d451c914e94c5a672abec3232e58aff6218581f0c0b1802434ddbe771b1be6a1","src/sync/tests/mod.rs":"1ef2026ac3dfbb70a437b8be441deca4b7b5e72638b71daf753b89808cd3c9ee","src/sync/tests/notify.rs":"23600377d3eb041c2dcb3702b63109475302b22827c30e90c1e8754a18f306cb","src/sync/tests/semaphore_batch.rs":"1f928cefc34b332d0b7c86a3b4d29d2b9ea37ba57dcf5eabc7bb62138f4a51e6","src/sync/watch.rs":"9713e8aa590093be72ad61589dfe0678aff5af153ffcf9bb8b92c2cfad83cd7a","src/task/blocking.rs":"96ad214e99e2120a05c938f61c2bcfd0ac8bd20619dda12d93318d4f0ab7f41c","src/task/builder.rs":"6704158d8adb0e1a1a2b1b66548fb295c6c1e32b7387e6f3c9c6ebde9a0c084c","src/task/consume_budget.rs":"f1000b9628938a5964f70793506f51579849284a4acb10d5e9c70080c5caea47","src/task/join_set.rs":"e178485ba52bdeeaf0f9320e150637770db8313cbbfd442440dd61a98fb5c402","src/task/local.rs":"32b08a7300b249c1b1bb5e643534356a7b181257614a3515a012f15610582e69","src/task/mod.rs":"68c4e77221655cc3cd208e20fd9f8b3035d5f6176e30a90c5ec67423f8ff8ec4","src/task/spawn.rs":"e86d2ef3615955c35423dca8b3af9e3eadc5cc3e641916354500128680172e43","src/task/task_local.rs":"fda56b1515e5058ee423f32d39892f523e59a5b744a4adf8a1a1cca9108b6385","src/task/unconstrained.rs":"8e75239ae694f296136fbacadb232ae0a255b0b2013e1eb0390bfbb82af36692","src/task/yield_now.rs":"ce1f9417f650142488a8c27856e995676c5e74b8965832966bedff6a99b8165c","src/time/clock.rs":"839139149402a4ab18f3144a36249f57d36536ca44a646de0bd6eba374a71ef9","src/time/error.rs":"dad4d124c6102e21d589e5d022a4fe99a00eb68c5980c755cba3cc5d043110ac","src/time/instant.rs":"164ee00dabfa6bb9fe4c9854f937ee92ae454eeaaeaa7a447e09434ea95bf722","src/time/interval.rs":"6bd0a45000fc88607b863ff563a36983daacb9f50c204033a6b3a1726909a64d","src/time/mod.rs":"c790bbe9356ceb56fd20e762c9002906aa4eee1d1d297fa0c520130f72d3be3a","src/time/sleep.rs":"97800884c5ae2ba330dc079912c19f93a67605311d85a7de134f6886120ae0f2","src/time/timeout.rs":"67f5396cad468dac3381b323734739914052a0f72c3df018eeab14a855f6c8d8","src/util/atomic_cell.rs":"6e156b730f69c698cece358ff5b206e8dd88083230fd49b2fc4a66a539b92553","src/util/bit.rs":"a5c16c671e58ac19a46621efa3cb02eac21fdebfbf97529fc0f2aa708250f738","src/util/cacheline.rs":"204079442ea5db45488f327a48a3ef13a93702c8f77640511e5ed4398dca4390","src/util/error.rs":"de1a0d662e9359da3e19739125b1450f571abadf30e34f50f085b23d8da28d80","src/util/idle_notified_set.rs":"7c54b9cd9490a085e224047825bc6f79827ce32d39e16547ab624bd113a7f3d7","src/util/linked_list.rs":"5dde85250258107b2504d3064c8776626db5df1dd67cd3fe7b7997b0866f77c8","src/util/markers.rs":"fb9b674d9a48c97b411db8a3264fa2781026a0eafa74cf276cd47d8ad62cbf02","src/util/memchr.rs":"8cb5e0a0da9b7d94d29a994dd4e725e547ce31f87b5bf24a1a9b53b0ae65cc08","src/util/mod.rs":"9b659eef0a411f5ad5f75fae5a4122463450c99c036a46771f79744ad1cdfc76","src/util/once_cell.rs":"bafbbff82e595a0b8f41f3d5273dcfcacd282c51a24f14666105391a456c5db7","src/util/rand.rs":"c36ca3d9e971e857b132f29ce3ce0ca3fb7c82a4f413354e7acc91cb6e8ee285","src/util/rand/rt.rs":"9790a2b6d822edbffde723f38b75ded408dba6954d711f285bd17924322b246b","src/util/rand/rt_unstable.rs":"bdb69915fe12a9e0b8f2ab4d72466663b7a3e87e671343a0a623028690f4e452","src/util/rc_cell.rs":"362a7a7b776389688299628a4678378fa02f88fbc6ed7f9fe006054d9b62643a","src/util/sync_wrapper.rs":"8f1ab76280171c33c0bafaec9c1cb1d48cfb0d19a1ab2b768cdf7d7e40f07d00","src/util/trace.rs":"eb32f5d2e3d7b1d73bbc185dd22893ecd1cbbef61365abd22dbe19c3893a0c2a","src/util/try_lock.rs":"c4ee49e1751ee0a7df1a8cbd4f8d36ea1d7355e3ac584fdb8697a94cd7a7a8f8","src/util/wake.rs":"de004e6fe21d9d86d22b7e193229436c57cd2e62177782c495fe463798fff063","src/util/wake_list.rs":"c3443e695fd0b5c41c06d66cab96549064e9b645043559d01f82f365dcc4ff6a","tests/_require_full.rs":"1f58c8125018bd88b9f21647cee3d957b716bcce70f9144af1de58ee6712908f","tests/async_send_sync.rs":"69166867e7a32f5a6f44a4d7f69ae22063fa08f2d77a1ddcb760e0cb1006c014","tests/buffered.rs":"ad2fc9e69437dc8815888286e2ef457215e770b5da13b1e6123559bd18f7199c","tests/dump.rs":"fd5bc91090912351c89afd6d91109b7c389d255479bb7c8355a7b69f78474dd1","tests/duplex_stream.rs":"680a6052e9a7ab6c0684f17f922243c24691dfe9e83dd099217d439b61d50838","tests/fs.rs":"e2d21101b603216c65df87259cf604f3832b8ed4d39a81aa3a3e90972611a700","tests/fs_canonicalize_dir.rs":"f08d79322e814eeb09fc6548d1a7daf301322a5397b3283360daa31470e90e16","tests/fs_copy.rs":"c71fbf6780d3b484940a590992901127670a4a27ebfb75a0cb92d17ef9e6f860","tests/fs_dir.rs":"4f29f2979a869ed12498cd9c5a2869b02d94ccea8c1a845cf9587d6c7bd0476d","tests/fs_file.rs":"e05bc4f2d49ebd77d96be87b79fca05cda9bb5a5ce209cff18b8d6bb51a23d17","tests/fs_link.rs":"52da287ce88ac500b3e46b5a00549d56044c75b908a7771b63c29b2de2f95828","tests/fs_open_options.rs":"f13c92227bbf089850f018f8b3ed5b527c4ef32d5305dc1bd751122abb30ebf1","tests/fs_open_options_windows.rs":"eae02a644078164bab7bd1c1a5a2ebc85f90adb110c955eb4bf01a34e9321aac","tests/fs_remove_dir_all.rs":"463ada6fbd6455070eec5d84684d76dbe9a245c82698b6e2264674ea0343cc5e","tests/fs_remove_file.rs":"614e41551c81276b7f700ac3b6a31bdc426772c881033d822cfc3759a3468a93","tests/fs_rename.rs":"c5397d389b2aefef31e2f4bc5f7e4b4a2c9c1e3109945de9f93dffc98bf0ae00","tests/fs_symlink_dir_windows.rs":"bec061561203ccdce24a0f5754690fe4d38030036055a667f46b6f452a9d31ec","tests/fs_symlink_file_windows.rs":"02ba203872a6ddd20c8e65471d77d544d85d6dfb4fd572b3f7782d73be01aafe","tests/fs_try_exists.rs":"198e5b1d81c140307ddff8deee3a79ecec044d61b2225139da3c38b2fa1e1b9a","tests/io_async_fd.rs":"b1140d2c17edf580c9cb1309beb48ca0699a6681d66df94b75b0fa6efe5f9f79","tests/io_async_read.rs":"a590efe9bb01986f067118640a3b55f6760186e554f8e8f2404231d4e96f61b9","tests/io_buf_reader.rs":"f5a322dea6fe9f40c18a085a865919c1bbfe8653203b37d1e18b77d259c6211d","tests/io_buf_writer.rs":"3bdabe9ac26f3189929ab3e8957150f5262d5b426fd3cb6c4761a45014b1c1fa","tests/io_chain.rs":"f5d3ddc9f6e8152ceb08b5dda2ca3168b174f1f67ff28a4c5983bcbad69d8af6","tests/io_copy.rs":"0683dee400710c1696a6634ecee64c39e7027344e66bfdd6b2a78de8ca913555","tests/io_copy_bidirectional.rs":"3a207b2390ef8562b547cf2c897e1e89d4dc31a41f2b353a1356b20704bc42cf","tests/io_driver.rs":"887d25bbab98334fad891c8f8ff2cb7aec0f10d01e2993cdd0cbc4c6e406df88","tests/io_driver_drop.rs":"a0126f26fdc2693129f6941a897b5648bf9593123de355119d2e38683b15f1cc","tests/io_fill_buf.rs":"930ce8ab5562c2013f4a75cdf717e41a7f8f3cbad6bae7bde68f0cfa3f2fd80a","tests/io_lines.rs":"f5b1599ffff44819e269519ff0a08635ea1c5d7c541293e63ee33d98f25f0e3b","tests/io_mem_stream.rs":"7b20d86c02c8a868cfa3aa4d228519090d156fdd9a8a19a3be263f264fc9d33c","tests/io_panic.rs":"bbc26639d765041163caf7776c5c983b8852ddd8feb40883d6098b21c942e75b","tests/io_poll_aio.rs":"165f80ebc81e8ccb4d335c9b9a89d960f097de9b17e92bc964effa3c76ce5f98","tests/io_read.rs":"c0ed5738a4b2d9623b2e0a67cab0fb19bc50015f62ced524b5d9069c57e10f05","tests/io_read_buf.rs":"6dc454751af0e9cccb44fdfb12b9f0311fa8afa482886aa56e3e15d49ae1e06c","tests/io_read_exact.rs":"b6387dbeb0baceb7a1f74a9a3a8b4a654894465368be27c3bbf4352b79fc4314","tests/io_read_line.rs":"8296624b4f5e162c79024f3beab2f561f4195a244cfd4c53e4d06282f56a31bf","tests/io_read_to_end.rs":"722e2922a40080d391a83b4903f47823779740090624a98ac30e9f164b20a3bb","tests/io_read_to_string.rs":"c9ebfee5cb262d822119c2881ea1cc0c73598b13c517c297663e35bb120a089d","tests/io_read_until.rs":"b6c0df9e4852766910ec68affcd92fbfbc280018b7f9c16cf5f4830f9b8389f0","tests/io_split.rs":"fcd232f797503596b2f8a6b0c4fe6df146108456a670f7f101e4c4eeed52fffb","tests/io_take.rs":"06e91faae76440228df71383650f86752e7b749b193f1729071a7e8fc516e01b","tests/io_util_empty.rs":"32dff601a78e46e12339bf1577463c7ce1070d71d78a2fb33318112a111dc120","tests/io_write.rs":"98668a8c8feae0f85714df1dfecfcd94fba4ba347bdc3d8aaa4ea8b175055c69","tests/io_write_all.rs":"e171af1ecab45a439b384c3bae7198959c3f5e2e998967dbd9296760b52951b7","tests/io_write_all_buf.rs":"2c037f07ac464eaa4e0b87e4e4968b28a0f2f1b1d1e218546c9d5dac7a75d145","tests/io_write_buf.rs":"331d3b54c7664386bb87585f39910d1fe31bfbdfa012a2dc2120e535dcdac329","tests/io_write_int.rs":"3f4b50345f7d7d558e71ac7f2a8c1c4b7b771dad09fe2e1fbf9a17d4fb93c001","tests/join_handle_panic.rs":"a17a56a6283d229e64083cc433b4fb86b913f2cabd692177fdd7edc65baa7e42","tests/macros_join.rs":"4411683c1fe79419457e758650ce89ed76f28041a890cd05db9143034b63719c","tests/macros_pin.rs":"f8fe8ade470196dc09b061b0cdd71ef25e114a201d5eb500e0f8232b436012cb","tests/macros_rename_test.rs":"94715e8014bc4c67cebe830f3d800c4cb0937bc6245de4b5410e5729bb2c7f9a","tests/macros_select.rs":"7f5ad6e104c95a30b465aafae1211384c07228c61d15f64efb4cfe55111bbc22","tests/macros_test.rs":"7bdcb1fb36b09e0666c05c264e9dbf87eafb236db580c4ff0595d30bcaa68377","tests/macros_try_join.rs":"79a2e9c784e7249fb4bfe73c41d2efa88206fec36a8449e6fb7ecf95f50d8d4f","tests/net_bind_resource.rs":"ba0dcc301ee170fba82cbbfbf0172b665b9914c0004270d8a420d5cd948eda84","tests/net_lookup_host.rs":"69831a012b36346e25c3ffe0dee2dc31d0faeb294a9deadb46118c2561b617b2","tests/net_named_pipe.rs":"dfb791caa5a4ed1bae0605da27ef599abd8cbe745c2fa95a31853bd46465b042","tests/net_panic.rs":"9fabb8e012d92fbe23eef513c3e983b12a07f3c39d72dea06b35bc4902486916","tests/net_unix_pipe.rs":"6b6956dd7d584fa18309fc8c86a74f5270c9fc2faed2f5c3b722c11e93419abe","tests/no_rt.rs":"7ff583bbcd848d2721088dbfc45d0d70f978f8101275cc9bd220ac6d392f17d6","tests/process_arg0.rs":"785d801cf281230e3208512820e7d71b4d8362b8cf33fc72235da370e10983a8","tests/process_issue_2174.rs":"66c56d8dfda4e1723928da713dddea8d15774d6730398effadf0ec28f4c6f1e1","tests/process_issue_42.rs":"26043f8246b00046137551f7a9f638652c70f527f10b4d91e4286643120ca41d","tests/process_kill_on_drop.rs":"9b4bf8a73769fb268ef3687141e8df6122814855d3bbc4e63295c66b0ee6cff7","tests/process_raw_handle.rs":"aaf0dc242ce69f1a8c614e04515c41584f7e213f84ebf23238521eb881e0a6de","tests/process_smoke.rs":"4b55f2aa526b773be55e718abd54ab23851848c4cb28274af587d3bc8ab48f75","tests/rt_basic.rs":"2eb193a4a4555cb8aa636fa3437b4cdf12f64a888e20afe642b1b3872242ec3f","tests/rt_common.rs":"f3b03e4b987e742073646d21935f89c5f4ab05812e2b4569621dee1da8163662","tests/rt_handle.rs":"c9d021e651a1ffb3aefe9ce27f763b7f6be742b386c977d9fa0b6afe24749d78","tests/rt_handle_block_on.rs":"067205bfb6ce2c7b48301be4bc7d368c26b98ed1e0d17f58e64fa5c528205570","tests/rt_metrics.rs":"043c22f70d3754377c2c7d9b9377ed12b5bc2ab4daba5ec5d6ba2fcd1d95f66b","tests/rt_panic.rs":"3f757e55aba050e745347f1040b623d5b005bcc070d1e265cc4442589c7d3ed4","tests/rt_threaded.rs":"1c56f40ee5e0ec7da0a8e546d91535f59e7cd7d035f8c7408530b6d74b0392b0","tests/rt_threaded_alt.rs":"eaf1fc504ad333c74ffde01475c1a087e1f566ec1bc840427ce09c83d1037a76","tests/rt_time_start_paused.rs":"76549719f16e9cbdd9a84b9d97929ed7c8ca95b8d4d715608eb99f950cdda7a3","tests/signal_ctrl_c.rs":"9b53065781b37f3db5f7c67938239b0f3b0ebbc5938c14a5b730ad7ec07415d2","tests/signal_drop_recv.rs":"d1ec97213d9c6fd9fb25ea8c2b015c9e9ee1a62fe0853fc558bc8801e5a3a841","tests/signal_drop_rt.rs":"f968c1154262a4427b5aad2d9fb36d3b7d47084312d0b5527a8eb3d589381d8b","tests/signal_drop_signal.rs":"041940550863250f359630dc67ef133874d809ddaf0a6c1238cee1565a19efec","tests/signal_multi_rt.rs":"a1c50c25f4707fda7665da61b3317dd61fc32c63c61db2bbdb56065bd9c591ce","tests/signal_no_rt.rs":"6978c2ca34a0244fd312d760ad416d961e7e27681e4bb936dfd583aefe6aaf1a","tests/signal_notify_both.rs":"bf0b9def20f530d146ee865305833d8e9bee07a0515e66573d7ff30e2c631123","tests/signal_panic.rs":"0b26845bbc7f388346e0fe3af98a2257dbfd0eb84168368994a0857e06a42398","tests/signal_twice.rs":"bce33093eed151955d13c334d6d8a5bc5ca67cf5b37c246e435a24c15bc166a0","tests/signal_usr1.rs":"86ad07594b09d35e71011d1e12a1fa2c477bfbc4a2a36df1421b6594a0930074","tests/support/io_vec.rs":"9b3001e120138ead4a63720019c669ff00f8455a74dea2fb231633b3b58c9b09","tests/support/leaked_buffers.rs":"85ddbce3ff6b0c5cc8cb30449dd37e5bfedc94f8357e741ec88ff04462bc60c3","tests/support/mpsc_stream.rs":"00d48122fa2ccbf1fe0b110ce3cf22590eda54b3ddec0134b1f9376eb1169645","tests/support/panic.rs":"7bcaf8ea2d249b5c1acb3c1b769cbe479834630dc71b3ce1114b8b46277f44da","tests/support/signal.rs":"83531afa2e8e71cfd90cd4e1fc821490ffa824f0f9f0c9c4a027c08fed6b8712","tests/sync_barrier.rs":"f166e526d12f840de404ef58a375e475dc7434292b2f23d557214749d0e6c372","tests/sync_broadcast.rs":"ce41987e3c5b7856684608528a2db19806073e41bf9a6a341f0a8c6ec4bbc4b8","tests/sync_errors.rs":"7a49ec77f4c967b3c76c946789f43c51e0a820a67e947ed42e30ef65ec9242e9","tests/sync_mpsc.rs":"b7306cbf9256570e63273bef7fd4e97658ea48c4580950078b54649470976ebd","tests/sync_mpsc_weak.rs":"5b8335b663cfccae9a08fcec4a3a73a890abd36d2f58adbd845d4745af4fafaa","tests/sync_mutex.rs":"432591e4893b4c64a58116463b6c16a2eb23fd42eee42af96d93b9d03728608a","tests/sync_mutex_owned.rs":"2664c35f66161825cf8e0ca863347735cf4d1252a208577e5084dc1935a18596","tests/sync_notify.rs":"9786acc38aecc651704b5e5b194c3a45a06a3ea032464145a5f17af2062399bf","tests/sync_once_cell.rs":"d4a792f554acbfcd66f2c794cda44f180a330d8bc488823af984196fe2c91d74","tests/sync_oneshot.rs":"6e3542ed15fc8e08bb422e0ad001cb422035c06305511b156e9645f2322abe4c","tests/sync_panic.rs":"6667fca8d892b2126e49ee86fea63ce8f90a2e7ce6e8326a46b522b682c61723","tests/sync_rwlock.rs":"47094f85a9d6db9d3011d09f8db014f692cdc3239449bbf2d54575c4923e8dc5","tests/sync_semaphore.rs":"63a61b02ac674cee92e963a2e92f058fdda22dd95f05a087136524042bb8bc8f","tests/sync_semaphore_owned.rs":"5688e32fb6f9d6ad95dc6859fb5c5682e4e75e59dab9d2f0c02b9360d455e4d2","tests/sync_watch.rs":"5df73545149e505f423dd04c75c8dc8c645681eec66888d76a498013a2034205","tests/task_abort.rs":"4347395642f407e22605c4421199b1ad7192be5963704f0c6822616aad9e07e8","tests/task_blocking.rs":"dca80f95e916f1cd619ae479a37bc891bfbcad36ac24088ed1d23802777b3e3a","tests/task_builder.rs":"784830b868e9fd7b0d9413cbd7719eea7606c62dffaaf59986ed3e7902e9a3e5","tests/task_id.rs":"98caa8b1874e3cf65d06bbbf2a0dde936c397aba25e5f4859ecc96a8774c446c","tests/task_join_set.rs":"060eed473a3f930a31f6bdec16b053944681b86fce005974cca4f0780a08a2ff","tests/task_local.rs":"fee94e54f2043dbbdcf36e6fe1787e7e2fcb814affbb9c370831a58281791755","tests/task_local_set.rs":"0b47d11e94daaef453b674b0bb04080fc8564edfe690985a5678b99dd235bf43","tests/task_panic.rs":"815ba77560f18f92e68db86688e82d5c6c3d8a83ee9caed2968eef0ea30c10de","tests/task_yield_now.rs":"dbd0f342129b2d06edc0daee360731e5adcb2e3a19f8d658a2cb510490d7fa25","tests/tcp_accept.rs":"e25e52fe4087638b05fc74e1be5311e015a723043d4de7b8e8867ae4bb999f9d","tests/tcp_connect.rs":"03abbf5cb0e163de534feeafb8498357231bfb3a38844e20a5e459d241dd204f","tests/tcp_echo.rs":"7dce84fa8c5ad0014846c3d0eaec1df8ad779fdfcc44441d068e32b408ba3716","tests/tcp_into_split.rs":"8248df254d9a7653c151eede9846994f1543ef902757ec2a196eaee1b0522936","tests/tcp_into_std.rs":"b2daa51b870dfb83c72958ed900ba863578e7d6c9339a591e97612a5f4d670b9","tests/tcp_peek.rs":"aeecf794f845e5396df9901780089289e285c10b65b9fd9a8ece669e808d535e","tests/tcp_shutdown.rs":"82eec393777a05f4a6ebe460e74d1dbab6b80d55b1289573932a891677c345f7","tests/tcp_socket.rs":"185f1a0121f5f22d9ccb5969fd36e64d12c563efd2d1964e2becbd73128677d9","tests/tcp_split.rs":"5210f66e120f90f6c5110b28859cb1582713885f2986ebf1600c6321095e85f0","tests/tcp_stream.rs":"08c0986f8ded0a517df2935eb6f76d31456ef699082d7dc140260bbc8f91c9d0","tests/test_clock.rs":"d5c9bf7bb5d926e2b29b43e47b5bb051b0f761bfe44d5fef349ed442ea7b416f","tests/time_interval.rs":"2f52d3e28bd1d8c93f25bfcd72ea259a14eed5e43a8e9d99c9e482d9939f445c","tests/time_panic.rs":"9c46cffc7c5fa7bd812422dc2a3574a7ff39350438e4a3382fcf7eea37d2fcc4","tests/time_pause.rs":"a5b155c5d2d6b6ca35bc1ad58c3982fd08740ac97da351b6094223002786dc2e","tests/time_rt.rs":"7467d08a4d681eba4d2207e8254e8f5cbf3755c0dbd40e9bea51e6838993b11e","tests/time_sleep.rs":"69bfed71e9b9e174fa447d36406666ea91c01994c9a700f82d0a0ae0b9bf8b73","tests/time_timeout.rs":"31d4955a4009b24aa0a506335607b6aa0e6b21cbc533650739642c4334b888d9","tests/udp.rs":"153ab04ca9d14b63967fea25e46855959931aa786bb375f1c39bcb36cc9d8c66","tests/uds_cred.rs":"146c6e9bdbb82a268f178b03575f94a40db81ef67a740dd16ead5b9e4a447f1b","tests/uds_datagram.rs":"f8d886adc6c3947960991392cd8540a0b4a7f7b0110a24d10805237b385b49f0","tests/uds_split.rs":"79d54d6ce35e5d15138299091871ecbdb6492ae6863fe406021fd7359f1ed7fd","tests/uds_stream.rs":"287b7d5e297df3e326488d98f9645ebfcf8be0205ba6a8e5ddaadac58240e113","tests/unwindsafe.rs":"e833431d40708f39b8bf54b809b635d77d9895f46f3c42aa14d3e9108415279d"},"package":"4f38200e3ef7995e5ef13baec2f432a6da0aa9ac495b2c0e8f3b7eec2c92d653"} \ No newline at end of file +{"files":{"CHANGELOG.md":"208e9421c33fab4054df032f2867fac386261ed59f91c50bc9099996f2534765","Cargo.toml":"b6a2f2d96e73d8820acff6022d6420f516b95450a0cafd2cb7ff7f873c18d494","LICENSE":"1a594f153f129c2de7b15f3262394bdca3dcc2da40058e3ea435c8473eb1f3a0","README.md":"4ef0bc3b9a8381b0141f6e2dc7f56cb93b8dbfbf820ef1396e44df31c7c2fe38","docs/reactor-refactor.md":"24d4f3ec6d8828bb96afe0084df9e7739bbdf1995283dbd2cd76740311485b75","external-types.toml":"d808de4bbff94d5ea56f1b1783497b0c6cd107534853aca8c79ee8404d8c2399","src/blocking.rs":"8e62b2cdc512fedbca4b4c4f983629af035afea4ee7e918bb1a3e9851c8e034e","src/doc/mod.rs":"f54f0d17974e68bd93035137a36b216dad05402cd4f3f64ea7e0008e7c309858","src/doc/os.rs":"9de68b5ad2ba2783d76f7b92a572e238705ebeea0893a10f21c755ea884a58fa","src/fs/canonicalize.rs":"93c64b72abdca17877d6ab61d50a43765d6aef9e0a9f7aaf41b6b0b7d9a8a380","src/fs/copy.rs":"262180fadc66e5ac2bf1e8389628fdd039f14788e66a4f8b10e10633e7310f20","src/fs/create_dir.rs":"233cbab2579a787614aeee88845a57f1578e9c2e064a3456c799f61430e911ad","src/fs/create_dir_all.rs":"56081d541caadca0fc59e84d55e78e702fe9373679598016224ad0b072b189a7","src/fs/dir_builder.rs":"b5b21229c7bf15e2074afab1accfbc392f3c69e546c7b652cfdc8e90d5a4a301","src/fs/file.rs":"c31deebcea93c15ebf2e2a5606c52f1ba6a0ac57fe37b69b0984253b6f36b0f9","src/fs/file/tests.rs":"014b0bd871a58d42d8b97cf2d860f83693294f935c808f1406f4b26e5d09afa2","src/fs/hard_link.rs":"98cccbbb3719baee11c232e79723ab1cb3d6c8056bddb109c4990fe2c236c1fb","src/fs/metadata.rs":"782a1a5dbc2cd6c40e928579fbfcf39e5f1de28def78781590c0280acdf02960","src/fs/mocks.rs":"d3718127d1d0362253bc7c7ca4d6abd21548fe69296291d1ae12a97ccf7fc196","src/fs/mod.rs":"8743addab538366cbe90b43cb233c54e1be524c173b9e659fda4fe9fd78060b2","src/fs/open_options.rs":"cd8acd3deaa339f38cbe14b1537ca4b07b9830105d3b385d965585330c824304","src/fs/open_options/mock_open_options.rs":"60ebc4bea76d742ead8fc5b5f4079450eb2450ecfed5f83d7d89cfe148f4ca54","src/fs/read.rs":"055ae8b6ae96ebae2d05f8780e7592bb587a742506c6df8ee8b380fc7d2820ef","src/fs/read_dir.rs":"3d67be6f69299cffe1b6403a0cb182f76bc576ebd6ae8722a2e0ef47a8f912ad","src/fs/read_link.rs":"93c104a21253372fef7056ab82e6065b0a1a8fc9be8b7329dfd5a8dd07c618b0","src/fs/read_to_string.rs":"9e5b2d476a6084e32a92c5421a8abc9d4f335f4ec677beec4bf8bfa109d7d106","src/fs/remove_dir.rs":"96475771e9c52678768288d8df6814216e0801bebc848481597ad34e829a5854","src/fs/remove_dir_all.rs":"b85abd05c7ab64ee8dc6cf5663a11e713aa51b357759ef660ef3cae3365ccc42","src/fs/remove_file.rs":"1cdf8bf16b3a164c594dac8773b7d1f9ebb28de169343184d34d6aac3b3a7eaa","src/fs/rename.rs":"a97875e92626fa46e23fece7b8698c9c4cea2bae8f1be8726f30ae6fe80ae0c7","src/fs/set_permissions.rs":"8adccafa475dcfc1bc3989af73374d90683c1be4953ef812e5fd606f968d7b7a","src/fs/symlink.rs":"32cf3e906531d30ebe6d8be7ee3bfe049949759b566015b56d0851f51abcff50","src/fs/symlink_dir.rs":"66a6655f5306854a7b6ed3748598bbe737055da9635bded715a04c3abfacda7c","src/fs/symlink_file.rs":"ec5816344f8c0b79c4d84e0ef2a987d753c719afd3bbc0d0a739224477a9edd2","src/fs/symlink_metadata.rs":"f5ce1e05f137da995e3e0d9582bae0a5f7ef4251285c64e912b0eedbb068b395","src/fs/try_exists.rs":"c666196690c4d45991374b03b27f0838b33e98d0be2838638d4de4ff856894b7","src/fs/write.rs":"1ffb734d31748bd879ad398b0fe99bdec569782b42677022957db2cae95c4d2d","src/future/block_on.rs":"30bad79b005a1ba7f696bec5639a5886b1f653a152b8948ae5fcd287c05ab8db","src/future/maybe_done.rs":"9042619f2a907e81763ac6082c080faa28af5d571dd49e82b60f3f14d58598f3","src/future/mod.rs":"6f28857347c50cd6467f1ca7d1b1028b633de7d142c3f3ca710a8693d1e839f9","src/future/poll_fn.rs":"b3c0eaeb442991d3fe27f53f2c2849f5f40b0f974035036c26661bcdaffa09df","src/future/trace.rs":"c42712a8d372922eba7e05cd21382fe5df5eec02cbcc870062100b59ab99654f","src/future/try_join.rs":"0ea5a069b17a34bbc091acbd74b9d51794a55a85dfa63fe2404d5ee91a4f0038","src/fuzz.rs":"db998767c729f35320b1d489f43f4d7788e989c8d16c0793188a2868207d8e25","src/io/async_buf_read.rs":"b37caa8f6c974b3c97327c635218803e573c531d4197950840549aa794357c99","src/io/async_fd.rs":"b54c4ce53bedcbdefd6525069ebc69724e95a490e3c685ac445c42da19eba1bf","src/io/async_read.rs":"f52c8d2f4a283c0dc8d06dc974484749973125b0b691bc0c3d100972ac67cb92","src/io/async_seek.rs":"a9a0df389ff2be3d79208ec475fcfede46a86f6ea0b822b1a4ce8273ec714b0b","src/io/async_write.rs":"198ed6a475b6f093fd2ff15e618d816d7e33cb8bc28d2e2299533e5df0bd78d6","src/io/blocking.rs":"b94dcac1e0ca315b356e7a71e5d71696e79363b92480603e699051e390b62873","src/io/bsd/poll_aio.rs":"45e818a201c8dce93f612c7856ba4259724d2c9fcf341001eb9833f821f16f3f","src/io/interest.rs":"66b1d4cc325bce46888887b25f3bffb2cd398bb96f659edf7292b2f0f8ce167f","src/io/mod.rs":"d9b04c6badbd9317e6f02f182d7457de3429f70ca74306f6895de73828c37b2f","src/io/poll_evented.rs":"d3946956bf3795297e67fdfe783b4cc19e4a4310c23db2a8abbc12afa6123faa","src/io/read_buf.rs":"14f82f701d5056d1d5581c70aec98f7c6d287899df45e4b2e82388e7c97cca57","src/io/ready.rs":"85fc7a192552607acf6623e1f083b4e12447067bfa57fd667fb2c6e9fce7a4d8","src/io/seek.rs":"e9e346fc926c3360601b80a8319a25fd0567dd6f77fab666694e9787deaef633","src/io/split.rs":"5b1be9d1bfae72e483d02fc3b341ff13829c1fa67b9d7ec1481769aae91ed27c","src/io/stderr.rs":"6490414b47ea05a7dfd0001f864f9cd6dd236f70d8ae9acdac5d3590b2b04495","src/io/stdin.rs":"7c734283ca48e13db2bc4185c5f4ad811b497094598e3c0226a85f46ecbdd843","src/io/stdio_common.rs":"f8c72bddf74e48af264676b36470636c16e227b46740c46d44f6b21b2a44bef8","src/io/stdout.rs":"9121ce7c88e83659a1984dfce781e259d40fcd90b254f28dc03a452e7fe9cb92","src/io/util/async_buf_read_ext.rs":"010e722194c93d56dccc8794db9f73954ff58e87364599474c4d97398f4bdc99","src/io/util/async_read_ext.rs":"5c2a884c8793bb727de725298de87048545ae69c56378d8d6e196f1726583fd5","src/io/util/async_seek_ext.rs":"0535ec6139be7ea68becafc0d374aaf9d996ce9cbe5dca0b8e70b133a661c1ea","src/io/util/async_write_ext.rs":"b5ae408708110d8f45af4cd54e0182a36b28c57fa7f97e89787ef1df85ea85d3","src/io/util/buf_reader.rs":"670a58f404e5689daf1f2b3070b0b9e95fef96ad19f0e8487f294e8a2afe558d","src/io/util/buf_stream.rs":"2246fe71b707c15d7168c5da5ee158cec6e854d4fd11b685531c16a9c3cf2c6a","src/io/util/buf_writer.rs":"f9c3e018c9f9177fb6d910096503caee727bebd3c36f5f67dca2c4c55044408a","src/io/util/chain.rs":"5cd8df2cc7bbcd18ca2336a78507fa8009c0a9e595f81730a8c16cadb8f731a2","src/io/util/copy.rs":"f4c7d59736f9a6d8a1efdabf9685dce2ccc3053c5f9578d3b3aab4be58dd5c8b","src/io/util/copy_bidirectional.rs":"89a5fb3f77e9863c9496c02afc2613fce039f47a1b2322e6221dccda8323f80f","src/io/util/copy_buf.rs":"9d83771a6edcc6d0d32f066072e375634e21a13517968ec9b21a4edddbcc2605","src/io/util/empty.rs":"32cbcfa8bc033e7ae1cd62505a84125750d1abccd0c37b2a433c5eb80db0f0f6","src/io/util/fill_buf.rs":"223725d828071e923f25d2d49a0f6e470c411a6d9ba225700f2dd8d5793601bb","src/io/util/flush.rs":"fe3b4ff226e294843b8cbea9dc4e02d581582b78ddaafce137c96e290699c718","src/io/util/lines.rs":"1d9f9b99567111c911e72a4caa2abb19b277f2cdd0ca3268ac5ca6df5276259f","src/io/util/mem.rs":"5089e03d72b2873ab3f56cd86944e6bd29439c427219cb090610b5b4bf032fca","src/io/util/mod.rs":"6a9012d78fe2bed8240e7a628e9421cbef45433551522624065fdcbb329f3594","src/io/util/read.rs":"58988c3fbcf5ede633dc224d7df5a372495c4485757dec9bdbd825138bb7f5d4","src/io/util/read_buf.rs":"a87be2d115c09a6782ec8cadeafc92fb1fbe534580e71540087c3298a03bfca2","src/io/util/read_exact.rs":"4a8650fd7a885963a0fef2bec24c17046c5624e4dd7fe229ab3f33c4a92fc66c","src/io/util/read_int.rs":"49da230796335df584832cd7deb8370b4d1e0350d743046389a9d9ae17dbd94f","src/io/util/read_line.rs":"9cdb2d778b81bc50098a6851981ed9f541bd0c7896c0763b811971b5a598b7e8","src/io/util/read_to_end.rs":"1c061665818a4ca9632403aa95955bc435f4438c6d6317370ca728fb47acdbc5","src/io/util/read_to_string.rs":"fafb5463b013cc8f76def3a505dbebd179afc95bde0e2ca9388e428265788924","src/io/util/read_until.rs":"d9a932dfb5ef3d0d5e8faa72a2b3b9d1765c85599f3bc77741f69e7fe9c0d037","src/io/util/repeat.rs":"d4effcd81338831eb373cf2db972a99218b8379b91066940a732edcf4524c7c2","src/io/util/shutdown.rs":"971454342b4636fbd68e123d59d87017d81f72afb410c385846069b11def8efe","src/io/util/sink.rs":"0dcb794e48ca9b1c28e5f9f2051073ea0951a54c9c7dfc903ce9e5489d3d8cd7","src/io/util/split.rs":"03a59adccda29608886e38a1f484fbd4d6a6019180c4cfa851372d250796aa5a","src/io/util/take.rs":"ef080ce27d23cc23b9f99fe14ddd56349a3cb1442aba18f8405c30d20017b074","src/io/util/vec_with_initialized.rs":"f8673705967021b5a3cb819d672df89ec81eb5baabb48de7bb598d53352b62f8","src/io/util/write.rs":"20d14ee545ab1f67732915522e97808d1ddde13d151505c1289b596be519f7c8","src/io/util/write_all.rs":"906ff3fb24c6a979b104598f9a8229421bcaf2a4218c28069504b34a218241f6","src/io/util/write_all_buf.rs":"5911bf673ef89097938f4e2e38d9012865b28a0ce5ebb217ebe0e2507de6c1e3","src/io/util/write_buf.rs":"ab51d6174de24cbb729ce77dbaeea27e16059b8253e4830d8243ec5f08a08a8c","src/io/util/write_int.rs":"f321e69b0c7c01728b079e9fdeedb96c26475667e8b259d0c5f4a83d060990d1","src/io/util/write_vectored.rs":"7a335a9f796daa048fa9708dc44d32d2567b36461a6d88f07893eb31f304b69d","src/lib.rs":"28bbf0952b3de36f4e205c2fd1b687a5b9ddcbc08a7616fec18802a81fd1b698","src/loom/mocked.rs":"5b85e97fcee3be1b0443b5608c7fe909b040bac463c94b817ed6b42bfd8031c3","src/loom/mod.rs":"b14b9333a7a21bd125a4ae82f01e5ea9c9ed2f78d7d1ad49a13d9b176f1fe8ab","src/loom/std/atomic_u16.rs":"5aba33a798e8a95129e3fd039e4412322e25880003ba782031df9faac3dc93e1","src/loom/std/atomic_u32.rs":"7fbaa448621371cbb9b8dd882701236b41bed599d69eeeb0a1e25b2a9a4645ad","src/loom/std/atomic_u64.rs":"2d98d1608058f3248d79b1e9c96118627fef6362ccfefa77047be2e5617d7571","src/loom/std/atomic_u64_as_mutex.rs":"1a6b9f8417e968a78dcddd8c7c320c447b9f27d5f84245cae86c3ef68425c749","src/loom/std/atomic_u64_native.rs":"559e6fd21e678b904f5a905f2756a4a8e32ca68a8c7a9b4344af86979373cfa0","src/loom/std/atomic_u64_static_const_new.rs":"a1c0e7d2ea28904ae76227baa7da5da33b68257f4c1a7a456f8d3171529bd934","src/loom/std/atomic_u64_static_once_cell.rs":"92a25654dd8232f6c02c8ec58d4f706030db442fb2a5ba07f1aec09149559725","src/loom/std/atomic_usize.rs":"698c0a65ea4d1ad05d49770cef2614cee643794be4b6208ee071a3e381201349","src/loom/std/barrier.rs":"1539e5773ad0ab1936e8a9a6cf5c20bc697915abde15b3e0898615194eb37fb0","src/loom/std/mod.rs":"22da677018c512c613226a991115c35cef6b02da6ce43fb9ce0530f3eacf2117","src/loom/std/mutex.rs":"ce413b7819207a93d93984811476b4902e39ad172e8dd87fc3376c2398c7044e","src/loom/std/parking_lot.rs":"16b82f1580b4cf5949a9cb9ebfa2c11d98d91f97b2b2f7b6f90a213dd736985b","src/loom/std/unsafe_cell.rs":"789497164c351a563293d82edb82180576471b92ee3aec77de1a92a47423e390","src/macros/addr_of.rs":"cbd020a07ffba2b1c608856081499645cf606cb45444dc53d94457381a94bc33","src/macros/cfg.rs":"377b9afe24981c9b1f461d95619bd5ccb2560544c43515648d99576655cee078","src/macros/join.rs":"076dbeed1cbbb292e39012d18c0d1c97848bce48c4609b23f327025989b34a8e","src/macros/loom.rs":"bee8a86b0b96697cc21e4b5e9f1a3403c1f9dbc8c4e591a2ea91f51c2469d3d0","src/macros/mod.rs":"913b1382779ceedbd13606e429f59b9c7ad929324f121452f47773c232c3303f","src/macros/pin.rs":"294e5644061e41801dcee5494b7334439e09af0b6219ce164090feb624864631","src/macros/ready.rs":"6efd4c866c4718c3a9a7b5564b435e2d13e9c1ae91fd98b1313d5e7c182942d6","src/macros/select.rs":"4d9588dd514cf9f25b8c3c76ab08ad141d8f7ed1acdd856c6418946edd08f055","src/macros/support.rs":"da976befe4ba4d29e96f0de24cafe6e1f7f97364274e240556a01f2af77314de","src/macros/thread_local.rs":"c03b4bd975825f89feb0a138aaa5e3413ee8dbd6959a3d25ebdef8780126464c","src/macros/trace.rs":"33befd4533a3b2b4b22e246033f2bea8930174a7da58adaa57dbf20931275bcd","src/macros/try_join.rs":"2233cb76a6ce35d020ebbb8a0b0d713f01c0b6fd20fd878442bcca688c97ed6a","src/net/addr.rs":"0ed3d72ef6679e3ad76c6830143713c611d357ca4ece88c3ee5ceb2787217224","src/net/lookup_host.rs":"c7a21d735225e316253d822f6b11a17107e6a8db004f947a54d8bc12ec782baf","src/net/mod.rs":"301307d5a5f8c783418646ef9f7712414226a73061a691b468e0e3ebb7eb4df9","src/net/tcp/listener.rs":"8ad5e1193b3d306f5f9ce7a1ad02dd43aabbbe26f9c407338d49d23c35c3bde8","src/net/tcp/mod.rs":"347182e4f0381896bf3b7ab578c4564f1730ae25a108076ec65b8e855683fbf6","src/net/tcp/socket.rs":"fc3030f5ac54a0fca7feb2e97b27837c191500e8d7f8bbd68e18a05added25bd","src/net/tcp/split.rs":"75d1f6c4afa23397164a30c4409a73c8d3df022c780aa4f91fabfa90549cc606","src/net/tcp/split_owned.rs":"0c5a9f48e7e49c257c25e138f74c0c5d3402edf447a860cbfc1a36439d997295","src/net/tcp/stream.rs":"d1538abe1605e5471a2851a9b65d0eb0d997bc1f6279378244b52344bed392ab","src/net/udp.rs":"088244bde74e946856f41f28899708aa1977b31d4c682a2465e1ffb78e3b48a8","src/net/unix/datagram/mod.rs":"fc48924e5d1e551405b0708a2d122473cdafeeee802a5722f64b4cf41a1c01da","src/net/unix/datagram/socket.rs":"23bd655f5e0938d934714904b7221e4c1456d611cb76f7bf46ee9379f8b70295","src/net/unix/listener.rs":"af8488a7efea8f6fffc36d857631e7452125a5263bbffd3fbb9263c405ea898f","src/net/unix/mod.rs":"72008ca5352432de2203321244da5377afe5779ac15f5f6a577998c037e7e4ae","src/net/unix/pipe.rs":"203cab9ee396bc3452c879d24bca59b8628a6e76a1098770dd9043c90a46a31e","src/net/unix/socketaddr.rs":"66bf18321a81baeb394a7094567632b113e44e12d2643109b6a97c89d919bf3a","src/net/unix/split.rs":"bd0388de8b6035b8cce2a34989ff56304697ed6864615ae13474f4e9c504faa0","src/net/unix/split_owned.rs":"5eccba5c1d589af4e5b52d17410c2290c289db5583676cf016de93ccabdace9e","src/net/unix/stream.rs":"5fc4926d83ace17a11737a64c03997b0e737d26f1b0cc66dbbb037e438ac2740","src/net/unix/ucred.rs":"48cebf377e3e406366c6da9305197c53fba057de28bd93f5b534c1329d854eba","src/net/windows/mod.rs":"a1525f35c1acb92b15bec788a625b76acb42f9424f392074db697102ce79760d","src/net/windows/named_pipe.rs":"f59b2f22d373698d5859a8f20f2aff1190e6b77733844b7f5a50f9fd28b81093","src/process/kill.rs":"2f98bd1bd28ab37bedc34ab7b737760407ab5315420538acbd18da31d2662d94","src/process/mod.rs":"439048f3a0f48916ef59c3ff024dae69575c98aab710e9e61d5aabbadb9cc195","src/process/unix/mod.rs":"44d936079ea6ee09113e9948f5f4cedcf0351050ff54c4949922bfa53b3a7de3","src/process/unix/orphan.rs":"d641d9dcf41b0ce26a3ccc38e2e8d3cd505c060a87a137fa761132e2290bd886","src/process/unix/reap.rs":"62868319849b8482d8d927dcd00cc8a74b9af61fd47494b39bd41fe2f4dcf0b6","src/process/windows.rs":"7a47feef09bd00c701bacf6239dc146def081869d0ccaf4172220c9bcccb9bdc","src/runtime/blocking/mod.rs":"3a1e04d2fc5590c7c0a19c85ecbd893108f9a81b197162378c525133c3bbc7aa","src/runtime/blocking/pool.rs":"b61fe8afcd4deef0510e2ff84e6c874901d8f4c371bcceedccdc9261305d0d0b","src/runtime/blocking/schedule.rs":"8768ca9cdefc1b765f8915cdda096f7e5596e12c8181a5d90ba4a6b6cadd36bf","src/runtime/blocking/shutdown.rs":"6eaf2a1418b885bcc1ce3f257b99382de9c16f848ed53d9e00dc97389bb6b816","src/runtime/blocking/task.rs":"08571bce8a99dd6296ba7099c1f6da8c832d13a8c43db22044c683470147d7d4","src/runtime/builder.rs":"4a593b13bbdbe8205447d3087d1d629127c3dca38da0a4592045059cc0479b05","src/runtime/config.rs":"0184fae982b428993a92e1651f5c0918fd2f62a1113b67dabc444304e700d1ad","src/runtime/context.rs":"b2c974ae63995a4b7f81f5f2fcad429487659fd7df462492f52f5fcef76afca6","src/runtime/context/blocking.rs":"82ec6b5c6b0ce7b18582cc931e9cdd6d5946366cd676c9e6bb0235e6e8471ed3","src/runtime/context/current.rs":"51023fb843227d82a4c8b7a093148a2b36306f398e2770026d5d1e0f296e08dd","src/runtime/context/runtime.rs":"df7b8deca59426ac39d6950b518172ff7a7ef306c1681187a4d3b1f22168984d","src/runtime/context/runtime_mt.rs":"911b95f39dbed005a02fde0394bd74c02e14e5b9f5c98bf49511f6c68ac5dac8","src/runtime/context/scoped.rs":"16bfa1da16baa831cc926c41df869b99bfbc6d96cf39a04aa4914a9e4b19a2f0","src/runtime/coop.rs":"746b852952306f05a4da31243cff626b5c39b6ffdc4a6bc1c9a5a7c7fad5e103","src/runtime/driver.rs":"2e9640d81bb8adf0a471d58c321b5fd50586d9c986d52e4f454fc0cd85c71f3f","src/runtime/dump.rs":"de53e25c28c362cc8bd4f321d23a7c5c8a3956ed3a2ffa4acd4d62f6397ab9fd","src/runtime/handle.rs":"0cb8587946ddedf134734445ab789dd4554ee353bcdb4434f09d5fc98b23b23c","src/runtime/id.rs":"c43d92101ffcba10a4eb7a876910ee4944b1f921a89f7e44d5889776bdb2e19d","src/runtime/io/driver.rs":"5e63691a3ad633200b8aa13669fdcb38a413e3160ebb9b651754fef24c4fbe94","src/runtime/io/driver/signal.rs":"2e53479e68f48bf39c8cce92f0d12422bf4c68d931e741aae8daed854cd3f6ac","src/runtime/io/metrics.rs":"e711c65da155ef73e567125c0c9db33b2f511982a0c0a6b4f3b37c2d87c791a6","src/runtime/io/mod.rs":"270fead37871b8ee185e2e6e7adccb564bc8f2a0a02d693657afa76748e8ad1d","src/runtime/io/registration.rs":"7f9256af455e3d3a9b4db4cbb18ef14b3cb67740540af8df473931bd69db6411","src/runtime/io/registration_set.rs":"df44009a88c17b6a122ba6d2c8c5bde11af2222b3b8d0003a3d990990efcdde4","src/runtime/io/scheduled_io.rs":"30b171cdf036dbe93331d30c67b0a2b2358589625f061f660cda669cbffa38ba","src/runtime/metrics/batch.rs":"68fd84f0ccf135b10e2ef44c71c481129ca608005751c76deeae820d81534f2b","src/runtime/metrics/histogram.rs":"1d85cc2e6e1ef02b2cc4f2c627d5405d603742b995dd3ff23909a3a2fbedc8bb","src/runtime/metrics/io.rs":"960f44573cd16e2ec43ed872f235ece09db9f4c87e217002ae0d180e20ce9838","src/runtime/metrics/mock.rs":"d18d2ebbea8e4e191ab3ee77e2604a49e1597d1f6e858a2500bfa7e438176e76","src/runtime/metrics/mod.rs":"6c690fffe34bac1267eb3dc0ed93481874795d2fd2fe9f495859fab0866fb814","src/runtime/metrics/runtime.rs":"2123f97e744610fe30de8aaf3e308a22fe7d166f73749858eef59883cec3ce5d","src/runtime/metrics/scheduler.rs":"997ba0339af84ef878881fdb6f35d8f6b39dc81e8f0b5cafce94476d50675c91","src/runtime/metrics/worker.rs":"84725f923fa65825a74841f6b3df06e100a838da61942f1113814496f896cef4","src/runtime/mod.rs":"5509476a72103a3939fc9fb037b352644462ec246748bc35a265a30c2e7781d1","src/runtime/park.rs":"a01589e5a164a9719ed8613552c9bea805ca96761b79cfae2eb30f002b694cb1","src/runtime/process.rs":"f40854b46e5851d7f5ee10f50d839aac933343c2178508f419c8e41dc60557db","src/runtime/runtime.rs":"b312b5da72b47fd98dfb836e2417a1121c9c86021f8a3a697763da7cc6fddcde","src/runtime/scheduler/block_in_place.rs":"38b87ad398cae4e48bfd2afd9e2e9a0af1ee34c379c781d749d38cfe5fe8bd29","src/runtime/scheduler/current_thread/mod.rs":"b9669912fe5ead3a70c3f3892fb2435b5b6ec92b935f9a82e44fb522d95501c1","src/runtime/scheduler/defer.rs":"6124d19b90b56db1aa0688ac0e4af964a6882a51814b0065fc80d3cb6398e98c","src/runtime/scheduler/inject.rs":"fea0cf9dba0e72efaea4671a1693fa5bc68aef376d9773407855551951810426","src/runtime/scheduler/inject/metrics.rs":"26ee4f9d34c9d670eb75ee8d02a6e268952a1ef698ab3213d71873a97ea2c851","src/runtime/scheduler/inject/pop.rs":"335b42278217a3020ec1419d070132f8f5a0ce832c504dc7806c42821848be83","src/runtime/scheduler/inject/rt_multi_thread.rs":"d31776b467009c63f7797fd8caf3a2b1a78023e96e41d1f49d01bc4bda65cc26","src/runtime/scheduler/inject/shared.rs":"6fdc9c11674c2e83c37721ac0c30f0e7d23f8af8e4c4a4ec5f18e276b80e05b2","src/runtime/scheduler/inject/synced.rs":"b69a737bcba7cd27c660081c57c03b3672502e2c358beece0d4d8c9815e8af92","src/runtime/scheduler/lock.rs":"2aa5a50067dcc79d66ca39d1e4982c28f55bdcec43ddd7bc91414de5f794019c","src/runtime/scheduler/mod.rs":"a71998635e1c881e2e9871286de0522eb34fcf1ae0d9ae617827eb8593a2d810","src/runtime/scheduler/multi_thread/counters.rs":"e5a6a1a1d01a50890dabbeb7998c7b64a954ed94bbb7cf9505ff917ed63633f6","src/runtime/scheduler/multi_thread/handle.rs":"d10a984c2bd999c2d9ecd3e690052971cbc733cad4d77c808254decdf916f0ea","src/runtime/scheduler/multi_thread/handle/metrics.rs":"d5858d459700380a372821c2a5f03255f96e58e2fdfe8367e6cf355fb29c7b72","src/runtime/scheduler/multi_thread/handle/taskdump.rs":"20768dab2f9683ecb10849fd3a4a2862a0f9942fba97d6ac29c8bf5ba7017c62","src/runtime/scheduler/multi_thread/idle.rs":"c2be2afa82ddbbe36eb6e231c8a01cd7c233d9c6e197d2feae32200098e974e9","src/runtime/scheduler/multi_thread/mod.rs":"2fae4c9f66b57d15f63c485ee6ebe724f1d41de126e641418ed6ec40c8fb3e0a","src/runtime/scheduler/multi_thread/overflow.rs":"c70ff49356fa6948f9dc53a19014a5dbf7f6bf52d4c00d9c2e20b0d23b7b3bf0","src/runtime/scheduler/multi_thread/park.rs":"86aa7fb6f52b16237e9465fe572ff61c7aa13e5fe9654ce52dab435e23df9781","src/runtime/scheduler/multi_thread/queue.rs":"1b7ace7cdf3ae20b80980aeab84ca4493d6ecd0247c808340a8b62fc3f7ee77f","src/runtime/scheduler/multi_thread/stats.rs":"a423bc706b141d808764911ccb9079d0232e55126e5c7919672013b0ec32a5db","src/runtime/scheduler/multi_thread/trace.rs":"f8ac6b0db76c45057c0061908d5acd63eb1463c397984bfd9a80f4bbc2748f30","src/runtime/scheduler/multi_thread/trace_mock.rs":"3ce6a3d19b53b608cba34fda213e498691ed55ce4a542806f9080bd2dbdb054a","src/runtime/scheduler/multi_thread/worker.rs":"60565a05ff33fedbe468b666218cb341b405bd76ee51f5eb34ee580596fda221","src/runtime/scheduler/multi_thread/worker/metrics.rs":"14e15c7315e1e1a6829b67beda6a858570b70eb9ecf9f0f3d7530881ff7799ea","src/runtime/scheduler/multi_thread/worker/taskdump.rs":"ea2bd932ef0a3b999fd8a16e15f9e7dfe8c30f3589569b7f7ab334a63ad3bede","src/runtime/scheduler/multi_thread/worker/taskdump_mock.rs":"f8664a755109ddc87f7ab82c4815cb12eb37c0bee3a1808907ac10534b9867c4","src/runtime/scheduler/multi_thread_alt/counters.rs":"6d65b0741d5ab6afaaf7ebe31419fdbb953752bd83fac679f2ffa897ccedde86","src/runtime/scheduler/multi_thread_alt/handle.rs":"282c992c4c483c0f4f9145c0548b383010fb26261479e8d7c12813bc2766756f","src/runtime/scheduler/multi_thread_alt/handle/metrics.rs":"d5858d459700380a372821c2a5f03255f96e58e2fdfe8367e6cf355fb29c7b72","src/runtime/scheduler/multi_thread_alt/handle/taskdump.rs":"20768dab2f9683ecb10849fd3a4a2862a0f9942fba97d6ac29c8bf5ba7017c62","src/runtime/scheduler/multi_thread_alt/idle.rs":"23b34e1fe1540ba9d501f79ca590a4ddf99ff6683abb5155f4f1a435ed5360fb","src/runtime/scheduler/multi_thread_alt/mod.rs":"fabc12c49c4121da7914c6bfe301c70dc36a942149dc82187e29c75a0b8782e9","src/runtime/scheduler/multi_thread_alt/overflow.rs":"c70ff49356fa6948f9dc53a19014a5dbf7f6bf52d4c00d9c2e20b0d23b7b3bf0","src/runtime/scheduler/multi_thread_alt/park.rs":"86aa7fb6f52b16237e9465fe572ff61c7aa13e5fe9654ce52dab435e23df9781","src/runtime/scheduler/multi_thread_alt/queue.rs":"e15940695427b373976aa7cadeba2e2ce7296fdd136029e71b27b87cbf939532","src/runtime/scheduler/multi_thread_alt/stats.rs":"2764574e25b9276fe529ae41c24e1e56593262540771788294f38f26f1d3e633","src/runtime/scheduler/multi_thread_alt/trace.rs":"e54f7dcea7603c861e7afbfefe7441766f8fb3c0f5ed1bcfd76a3bf0b89ac692","src/runtime/scheduler/multi_thread_alt/trace_mock.rs":"3ce6a3d19b53b608cba34fda213e498691ed55ce4a542806f9080bd2dbdb054a","src/runtime/scheduler/multi_thread_alt/worker.rs":"9f3d64f57119d0a9d029df2c99013cb4e82b6953d74124e574d04b44a31fd4a8","src/runtime/scheduler/multi_thread_alt/worker/metrics.rs":"14e15c7315e1e1a6829b67beda6a858570b70eb9ecf9f0f3d7530881ff7799ea","src/runtime/scheduler/multi_thread_alt/worker/taskdump.rs":"9f1c93258038a3b32af9215ad7b1b54767b2d6dcb4ad503d90e5779225bcdf13","src/runtime/scheduler/multi_thread_alt/worker/taskdump_mock.rs":"f8664a755109ddc87f7ab82c4815cb12eb37c0bee3a1808907ac10534b9867c4","src/runtime/signal/mod.rs":"1498f18f55e730270f8c92906857d856de5ae264d80a96699c8b8b2f9439b77f","src/runtime/task/abort.rs":"81004b45834ab44f1b673b31379d37c68c5ce8acb7d223ea58207f412745d3d5","src/runtime/task/core.rs":"c44a12f3e67053241b8d02165970c63233bac08678fa24958544840247c69ba8","src/runtime/task/error.rs":"0367095439c51ce94f53b13aa64404e13e85b114f77cdcd7315d4cb3d4fb9344","src/runtime/task/harness.rs":"1e6ea44979d0bcf96226979f73e87967bfb3e46286cb21770809989719d047ec","src/runtime/task/id.rs":"4cade5f2c02e5d3a0c516625aa8def2da110db3b83d13a6d9e26f2a1ad8b31c5","src/runtime/task/join.rs":"db92ae97f715e36bc77fb6d8d668479472f5454406aaf4c1191623e59a893989","src/runtime/task/list.rs":"86f1aabae9b130dc41c2d5d52b5b61801539be6e3e09d52a06705af357e07cb1","src/runtime/task/mod.rs":"1b2b22445017154448acd77784e21715f90806db6c20d03a1be05852299d6c78","src/runtime/task/raw.rs":"4c30fe4cb3c57361b0f28a4acd25877b1f6e6507076b5933ad91f098ab2d7f71","src/runtime/task/state.rs":"2a75a1af1e2e6bfbbb6e33c8421c0841d0680f1fbbf42d2b555d9d33ef9f0c8b","src/runtime/task/trace/mod.rs":"2ccb5ea559bc0faefa0d1413b70f4cb48564ff6a313a327e8b0fec71d86bf8c9","src/runtime/task/trace/symbol.rs":"bde671f445b351d388e5fcb80e8cb8be4424a4fac4b8ec3aee356eb86082b422","src/runtime/task/trace/tree.rs":"b8f9aa018147d539841e5716394086709fec6a8d0f95f6b2fc011ed131063dd6","src/runtime/task/waker.rs":"39fbfa7c33406aac935d2ff8d022af6d3f9619ac7edae62d24b1ca97268e6499","src/runtime/tests/inject.rs":"97b68f6c22f6861b2a1649a8f919bae3310d6fddeae107aee4dcbf00de526cdc","src/runtime/tests/loom_blocking.rs":"fb4bf871ae59cd567ae4a2cb568d7cba31ad92579bea17c598d273a3a749f74a","src/runtime/tests/loom_current_thread.rs":"f9a8b7e0d0b829eaee01d155005800c7a907ec7f92acdbc0678e9149aa95ce1d","src/runtime/tests/loom_current_thread/yield_now.rs":"fac610e464660c196a35ce15a46c9ebf537d3f3475cfc633e58c76c25eb558fe","src/runtime/tests/loom_join_set.rs":"d6612a19c695907a8bb41b24df3b404cb521cae6f30226f2449dc32f18700b69","src/runtime/tests/loom_local.rs":"69cf7fa67da9e3efe3eee722791f811efb395dcf821780051e62842654de09e3","src/runtime/tests/loom_multi_thread.rs":"6e45d9197e3ab26270cfc4c8c48f1fa3a0d508e7d8d4c0cecb3663a83fbe80eb","src/runtime/tests/loom_multi_thread/queue.rs":"54ae93457aaa96dafa25c683b13b8133994ead7eaa135539468868c94a2e623c","src/runtime/tests/loom_multi_thread/shutdown.rs":"2f48626eb0a4135d480aa5bf72e514c4abf39aa17711c96d3829f93c03758557","src/runtime/tests/loom_multi_thread/yield_now.rs":"fac610e464660c196a35ce15a46c9ebf537d3f3475cfc633e58c76c25eb558fe","src/runtime/tests/loom_multi_thread_alt.rs":"8e06356844ef57004f0f9fa3ed4c596e6b173c01b9529022b252fd27bc3bc8a8","src/runtime/tests/loom_multi_thread_alt/queue.rs":"54ae93457aaa96dafa25c683b13b8133994ead7eaa135539468868c94a2e623c","src/runtime/tests/loom_multi_thread_alt/shutdown.rs":"2f48626eb0a4135d480aa5bf72e514c4abf39aa17711c96d3829f93c03758557","src/runtime/tests/loom_multi_thread_alt/yield_now.rs":"fac610e464660c196a35ce15a46c9ebf537d3f3475cfc633e58c76c25eb558fe","src/runtime/tests/loom_oneshot.rs":"cb0cb66e1014708a10a2236c2dbbac9441b6a6e36a49c419fa3a51af62b054ce","src/runtime/tests/mod.rs":"1d8d0b89fda125b00eaf782bc95fb1211d1d14b391b7089f08815ed8c41f7ebc","src/runtime/tests/queue.rs":"56ea2b3c8f3a1a01091c3e624259b03a57ab555e52ee77931ad9edaf5d6db329","src/runtime/tests/task.rs":"a9e7e18447eb1c43f0590580c2001c206eaa48e542502a04bc8dd4817de3962d","src/runtime/tests/task_combinations.rs":"0ebf6682728fc5ede9374b6353a8fe5d0cb1d27e511f338e779607d8fcaebcf6","src/runtime/thread_id.rs":"ad85f1057b2c61838620f1323fa8a710e140bf448fb2aa1d9d1f87a7fad5f01d","src/runtime/time/entry.rs":"7f07396d64c008f1d3b9a7d496564a07bb976837c3e1f0b21ba02ddfb6306515","src/runtime/time/handle.rs":"1ecbebdc070477d61b782b2f4d3a5b9b5cc06dbe447188f23eef3257fd16ea8b","src/runtime/time/mod.rs":"28f78f2bfce3b7cd61a893b19b93a285d55f084299401816f3d9fec03d87de70","src/runtime/time/source.rs":"c03f9eb4d229a582826164031541f028e26b95c75fd02fabfde3668cc81b5e8a","src/runtime/time/tests/mod.rs":"fd656b75bd4e7737b517b1e84949d84f5af72c8b52ee68777555c724bb1bf7cb","src/runtime/time/wheel/level.rs":"974a230b26f6d4fc9f4046741f1e8ef90acd2d53132f135515bc37914afc276e","src/runtime/time/wheel/mod.rs":"1104133c6d50ea708c5733f7bf05b2ad1f027608a7495d18e649c9b97f31204c","src/signal/ctrl_c.rs":"3e1d98df851b9ea1418f607c260434e906ada4e3d6c14cdfa5c81a0c4d55cdd3","src/signal/mod.rs":"4da598cb028d5716628bcfc06c0fb0bb8fb8f0f0986c6a328a655e76979cd85d","src/signal/registry.rs":"c9e9d1df123c6069c2ad80824162a5de8c0163a9c63714d26ba2128538e34cfa","src/signal/reusable_box.rs":"3d3b710b1794d9f8f5463e9ca380ece60c426b58786a5cb5f40add627da01aeb","src/signal/unix.rs":"0504cf52a28e9e8e528fab0ccd4e9c3dc86fdcfb807ecc9506fb6adca186c531","src/signal/windows.rs":"826a2a16fc9ff37ecaf7eef88f09d8b5f57adb6095dc10b981a4c0bb67b70a2d","src/signal/windows/stub.rs":"a6d3b11aa3a7247f7a8365c3241857bcde48d8c390d569e6bc9529c9b1f8ecd1","src/signal/windows/sys.rs":"3e4882762ac424cb3b3caf71d5a69f571fbe14e6b298889ccb227c58b213c257","src/sync/barrier.rs":"45a8ca0fec02e6a6fa77cfeeb09e3a142f931d413c00962aa0d0036ff8ff37bb","src/sync/batch_semaphore.rs":"19c84049d3aa94a0b9434fa2ddbe282b9084f53dd4ac6512ef291074fc498362","src/sync/broadcast.rs":"d0aec6eb038a6ecc15638a925d1d66b9147e9418c97032e5fcb7581c2e1caa7d","src/sync/mod.rs":"bd94e0b941f6c61623bf9ed6317c545c5a076d3431471f014f0448984c2bb82c","src/sync/mpsc/block.rs":"70a034a62ea88a95e970352a7a3e004c2755c75afa34d71f3653537389e6e2d6","src/sync/mpsc/bounded.rs":"fe08d3d153053f54c51c16f0cd67b74141c14b7d4e852cf2577a156e92b4707b","src/sync/mpsc/chan.rs":"c45f04b6aa6b89123f43b3d8bd08eb055542e4d966673d76a11850a0be6ae718","src/sync/mpsc/error.rs":"c11e21843f2cb734446a5b1cf3537b212481cc012f27e93b34848586919928d9","src/sync/mpsc/list.rs":"2c99cec4d3d179f6e668b8de37e58525477be3f069a9a748f7f8ed2f8a40f817","src/sync/mpsc/mod.rs":"3699ff2b4c5315f0a1cde40a1d3a45bc312febe1cb612cd68c6176ed7590bf1f","src/sync/mpsc/unbounded.rs":"5cd0694dbd4a2f33d44756a382c02780e1951dae19d246fe1af3e026ad6da5ca","src/sync/mutex.rs":"29e0dd08a9f23605a1f5a42fb8c75cc8b645bc0f81182be03e174f48a0853cdd","src/sync/notify.rs":"865f50de55b6e8ba9ea7b7eadd51e7962ef126f2d4f4967348a0361f074d3d50","src/sync/once_cell.rs":"ba8e1b63ab7a04052ccd5ff7f5e5f1f3381499fe274990f2a7e12af9ce6ef35f","src/sync/oneshot.rs":"2900d5d4ac81c3056c04b38ba7252eb4e98437943cba1bd6f06eafe78873cf93","src/sync/rwlock.rs":"efe15979ebd75cbbc9d6b12bf27d2a38678ae145a6fa1ed76bce48a65e002930","src/sync/rwlock/owned_read_guard.rs":"135d81271f0028263ce99c3246cd335a08912b50a43f125b3e8f7739ca353cfb","src/sync/rwlock/owned_write_guard.rs":"ef56443fac210bc3d0c2b66beda8436154c2ab726f1dc208758b54b2b087762d","src/sync/rwlock/owned_write_guard_mapped.rs":"3038187dc3a791a89505621230d3edd8629287ec11490ff37f2c624b593c5325","src/sync/rwlock/read_guard.rs":"0f7e52adacad0fb1529a453eb14f8207a8caabd8f5fca4aeb2031a9e9b0981f1","src/sync/rwlock/write_guard.rs":"f3855cdd09940c86a9bd10b91d3ebb37b2219b60c727a3bed377404ef2483c35","src/sync/rwlock/write_guard_mapped.rs":"8c839c4ac4b73faa1c1fc697753e23fce113ba6e576d2abc022ddadb98a34af4","src/sync/semaphore.rs":"d5d2c60a976a008e32a3c06bb42cc7cd50d7e35bcd39fb84f11fca6f0a3f7bf6","src/sync/task/atomic_waker.rs":"41e9e05522254afbacec9895390d6f95498e413a61d8f654f9c421c808e7f83f","src/sync/task/mod.rs":"f5e38105c7f8a942c0e49b973bad0a8c2a1df81deea19f3c5228edc4896c1725","src/sync/tests/atomic_waker.rs":"28dc6d373e83a846c4b6fdbca55949dfd901730428fbf002f78209e1f9f5125d","src/sync/tests/loom_atomic_waker.rs":"984b52699c47383b9b62e6c4ff93fd458bbe64cb4ca836463adbaf94d27c38ee","src/sync/tests/loom_broadcast.rs":"b2c6f138707fc389ee7d91109bc38093af9060b3465e68d3543cb652e0070406","src/sync/tests/loom_list.rs":"f0ce15a0f965fe558a21bca24863c712156eaeb10feb8ef91031a6d6e3cc5dba","src/sync/tests/loom_mpsc.rs":"4883352b9d75a81c878609613545ae14910eca4f2e7f3718053dfdb792aa0760","src/sync/tests/loom_notify.rs":"cd401c73084df551043b7d96b9f2c51e9c1929a9038eb899381bd4ecafe04ec8","src/sync/tests/loom_oneshot.rs":"c3596c15692b16e7cb8cd6957362adb3a98b3d7f16c4a4262f19a3a27f262b03","src/sync/tests/loom_rwlock.rs":"80ec00bdcac838806d4d9f711cb154e02f22913ba68711855c39ca92028d3e4e","src/sync/tests/loom_semaphore_batch.rs":"c6f69b8d5b2e6842287ed34638a9045095d9f94c86ba6bb84c1224bbe10026ff","src/sync/tests/loom_watch.rs":"d451c914e94c5a672abec3232e58aff6218581f0c0b1802434ddbe771b1be6a1","src/sync/tests/mod.rs":"1ef2026ac3dfbb70a437b8be441deca4b7b5e72638b71daf753b89808cd3c9ee","src/sync/tests/notify.rs":"23600377d3eb041c2dcb3702b63109475302b22827c30e90c1e8754a18f306cb","src/sync/tests/semaphore_batch.rs":"1f928cefc34b332d0b7c86a3b4d29d2b9ea37ba57dcf5eabc7bb62138f4a51e6","src/sync/watch.rs":"b327f57690f225ab30b9df59298aee07575f4ea3dd698c5e2d2cf599bf83d7a6","src/task/blocking.rs":"96ad214e99e2120a05c938f61c2bcfd0ac8bd20619dda12d93318d4f0ab7f41c","src/task/builder.rs":"6704158d8adb0e1a1a2b1b66548fb295c6c1e32b7387e6f3c9c6ebde9a0c084c","src/task/consume_budget.rs":"f1000b9628938a5964f70793506f51579849284a4acb10d5e9c70080c5caea47","src/task/join_set.rs":"e178485ba52bdeeaf0f9320e150637770db8313cbbfd442440dd61a98fb5c402","src/task/local.rs":"c7bd8b0a54c73124755645cf6b1a97f71c2ac6125787a2dcf6de7ed5e235fda9","src/task/mod.rs":"68c4e77221655cc3cd208e20fd9f8b3035d5f6176e30a90c5ec67423f8ff8ec4","src/task/spawn.rs":"1b4546ba873255b9ba28b755e2349200cb299c253ed6539c9fe0045ce48b7f0a","src/task/task_local.rs":"fda56b1515e5058ee423f32d39892f523e59a5b744a4adf8a1a1cca9108b6385","src/task/unconstrained.rs":"8e75239ae694f296136fbacadb232ae0a255b0b2013e1eb0390bfbb82af36692","src/task/yield_now.rs":"ce1f9417f650142488a8c27856e995676c5e74b8965832966bedff6a99b8165c","src/time/clock.rs":"839139149402a4ab18f3144a36249f57d36536ca44a646de0bd6eba374a71ef9","src/time/error.rs":"de761055f6596528fa158eb2179aa662fb1510d93aaa2102f8de3192c6a6d1ae","src/time/instant.rs":"164ee00dabfa6bb9fe4c9854f937ee92ae454eeaaeaa7a447e09434ea95bf722","src/time/interval.rs":"6bd0a45000fc88607b863ff563a36983daacb9f50c204033a6b3a1726909a64d","src/time/mod.rs":"c790bbe9356ceb56fd20e762c9002906aa4eee1d1d297fa0c520130f72d3be3a","src/time/sleep.rs":"97800884c5ae2ba330dc079912c19f93a67605311d85a7de134f6886120ae0f2","src/time/timeout.rs":"67f5396cad468dac3381b323734739914052a0f72c3df018eeab14a855f6c8d8","src/util/atomic_cell.rs":"6e156b730f69c698cece358ff5b206e8dd88083230fd49b2fc4a66a539b92553","src/util/bit.rs":"a5c16c671e58ac19a46621efa3cb02eac21fdebfbf97529fc0f2aa708250f738","src/util/cacheline.rs":"52d1db8c66768a4e08daa34600be17bfae3600cd8de0a90bf02c8411317a4954","src/util/error.rs":"de1a0d662e9359da3e19739125b1450f571abadf30e34f50f085b23d8da28d80","src/util/idle_notified_set.rs":"7c54b9cd9490a085e224047825bc6f79827ce32d39e16547ab624bd113a7f3d7","src/util/linked_list.rs":"5dde85250258107b2504d3064c8776626db5df1dd67cd3fe7b7997b0866f77c8","src/util/markers.rs":"fb9b674d9a48c97b411db8a3264fa2781026a0eafa74cf276cd47d8ad62cbf02","src/util/memchr.rs":"8cb5e0a0da9b7d94d29a994dd4e725e547ce31f87b5bf24a1a9b53b0ae65cc08","src/util/mod.rs":"9b659eef0a411f5ad5f75fae5a4122463450c99c036a46771f79744ad1cdfc76","src/util/once_cell.rs":"bafbbff82e595a0b8f41f3d5273dcfcacd282c51a24f14666105391a456c5db7","src/util/rand.rs":"c36ca3d9e971e857b132f29ce3ce0ca3fb7c82a4f413354e7acc91cb6e8ee285","src/util/rand/rt.rs":"9790a2b6d822edbffde723f38b75ded408dba6954d711f285bd17924322b246b","src/util/rand/rt_unstable.rs":"bdb69915fe12a9e0b8f2ab4d72466663b7a3e87e671343a0a623028690f4e452","src/util/rc_cell.rs":"362a7a7b776389688299628a4678378fa02f88fbc6ed7f9fe006054d9b62643a","src/util/sync_wrapper.rs":"8f1ab76280171c33c0bafaec9c1cb1d48cfb0d19a1ab2b768cdf7d7e40f07d00","src/util/trace.rs":"eb32f5d2e3d7b1d73bbc185dd22893ecd1cbbef61365abd22dbe19c3893a0c2a","src/util/try_lock.rs":"c4ee49e1751ee0a7df1a8cbd4f8d36ea1d7355e3ac584fdb8697a94cd7a7a8f8","src/util/wake.rs":"de004e6fe21d9d86d22b7e193229436c57cd2e62177782c495fe463798fff063","src/util/wake_list.rs":"c3443e695fd0b5c41c06d66cab96549064e9b645043559d01f82f365dcc4ff6a","tests/_require_full.rs":"1f58c8125018bd88b9f21647cee3d957b716bcce70f9144af1de58ee6712908f","tests/async_send_sync.rs":"69166867e7a32f5a6f44a4d7f69ae22063fa08f2d77a1ddcb760e0cb1006c014","tests/buffered.rs":"ad2fc9e69437dc8815888286e2ef457215e770b5da13b1e6123559bd18f7199c","tests/dump.rs":"4eb9887bd06cf82dca679d6e27a37770f8a8bcf44c8f5b06cd3cbad835848788","tests/fs.rs":"e2d21101b603216c65df87259cf604f3832b8ed4d39a81aa3a3e90972611a700","tests/fs_canonicalize_dir.rs":"f08d79322e814eeb09fc6548d1a7daf301322a5397b3283360daa31470e90e16","tests/fs_copy.rs":"c71fbf6780d3b484940a590992901127670a4a27ebfb75a0cb92d17ef9e6f860","tests/fs_dir.rs":"4f29f2979a869ed12498cd9c5a2869b02d94ccea8c1a845cf9587d6c7bd0476d","tests/fs_file.rs":"9807f142c169ca8982a2ac0264cb39743581c185500ec6a44c3639c02dd0fdb6","tests/fs_link.rs":"52da287ce88ac500b3e46b5a00549d56044c75b908a7771b63c29b2de2f95828","tests/fs_open_options.rs":"f13c92227bbf089850f018f8b3ed5b527c4ef32d5305dc1bd751122abb30ebf1","tests/fs_open_options_windows.rs":"eae02a644078164bab7bd1c1a5a2ebc85f90adb110c955eb4bf01a34e9321aac","tests/fs_remove_dir_all.rs":"463ada6fbd6455070eec5d84684d76dbe9a245c82698b6e2264674ea0343cc5e","tests/fs_remove_file.rs":"614e41551c81276b7f700ac3b6a31bdc426772c881033d822cfc3759a3468a93","tests/fs_rename.rs":"c5397d389b2aefef31e2f4bc5f7e4b4a2c9c1e3109945de9f93dffc98bf0ae00","tests/fs_symlink_dir_windows.rs":"bec061561203ccdce24a0f5754690fe4d38030036055a667f46b6f452a9d31ec","tests/fs_symlink_file_windows.rs":"02ba203872a6ddd20c8e65471d77d544d85d6dfb4fd572b3f7782d73be01aafe","tests/fs_try_exists.rs":"198e5b1d81c140307ddff8deee3a79ecec044d61b2225139da3c38b2fa1e1b9a","tests/io_async_fd.rs":"b1140d2c17edf580c9cb1309beb48ca0699a6681d66df94b75b0fa6efe5f9f79","tests/io_async_read.rs":"a590efe9bb01986f067118640a3b55f6760186e554f8e8f2404231d4e96f61b9","tests/io_buf_reader.rs":"f5a322dea6fe9f40c18a085a865919c1bbfe8653203b37d1e18b77d259c6211d","tests/io_buf_writer.rs":"3bdabe9ac26f3189929ab3e8957150f5262d5b426fd3cb6c4761a45014b1c1fa","tests/io_chain.rs":"f5d3ddc9f6e8152ceb08b5dda2ca3168b174f1f67ff28a4c5983bcbad69d8af6","tests/io_copy.rs":"0683dee400710c1696a6634ecee64c39e7027344e66bfdd6b2a78de8ca913555","tests/io_copy_bidirectional.rs":"3a207b2390ef8562b547cf2c897e1e89d4dc31a41f2b353a1356b20704bc42cf","tests/io_driver.rs":"887d25bbab98334fad891c8f8ff2cb7aec0f10d01e2993cdd0cbc4c6e406df88","tests/io_driver_drop.rs":"a0126f26fdc2693129f6941a897b5648bf9593123de355119d2e38683b15f1cc","tests/io_fill_buf.rs":"930ce8ab5562c2013f4a75cdf717e41a7f8f3cbad6bae7bde68f0cfa3f2fd80a","tests/io_lines.rs":"f5b1599ffff44819e269519ff0a08635ea1c5d7c541293e63ee33d98f25f0e3b","tests/io_mem_stream.rs":"7b20d86c02c8a868cfa3aa4d228519090d156fdd9a8a19a3be263f264fc9d33c","tests/io_panic.rs":"bbc26639d765041163caf7776c5c983b8852ddd8feb40883d6098b21c942e75b","tests/io_poll_aio.rs":"165f80ebc81e8ccb4d335c9b9a89d960f097de9b17e92bc964effa3c76ce5f98","tests/io_read.rs":"c0ed5738a4b2d9623b2e0a67cab0fb19bc50015f62ced524b5d9069c57e10f05","tests/io_read_buf.rs":"6dc454751af0e9cccb44fdfb12b9f0311fa8afa482886aa56e3e15d49ae1e06c","tests/io_read_exact.rs":"b6387dbeb0baceb7a1f74a9a3a8b4a654894465368be27c3bbf4352b79fc4314","tests/io_read_line.rs":"8296624b4f5e162c79024f3beab2f561f4195a244cfd4c53e4d06282f56a31bf","tests/io_read_to_end.rs":"722e2922a40080d391a83b4903f47823779740090624a98ac30e9f164b20a3bb","tests/io_read_to_string.rs":"c9ebfee5cb262d822119c2881ea1cc0c73598b13c517c297663e35bb120a089d","tests/io_read_until.rs":"b6c0df9e4852766910ec68affcd92fbfbc280018b7f9c16cf5f4830f9b8389f0","tests/io_split.rs":"fcd232f797503596b2f8a6b0c4fe6df146108456a670f7f101e4c4eeed52fffb","tests/io_take.rs":"06e91faae76440228df71383650f86752e7b749b193f1729071a7e8fc516e01b","tests/io_util_empty.rs":"32dff601a78e46e12339bf1577463c7ce1070d71d78a2fb33318112a111dc120","tests/io_write.rs":"98668a8c8feae0f85714df1dfecfcd94fba4ba347bdc3d8aaa4ea8b175055c69","tests/io_write_all.rs":"e171af1ecab45a439b384c3bae7198959c3f5e2e998967dbd9296760b52951b7","tests/io_write_all_buf.rs":"2c037f07ac464eaa4e0b87e4e4968b28a0f2f1b1d1e218546c9d5dac7a75d145","tests/io_write_buf.rs":"331d3b54c7664386bb87585f39910d1fe31bfbdfa012a2dc2120e535dcdac329","tests/io_write_int.rs":"3f4b50345f7d7d558e71ac7f2a8c1c4b7b771dad09fe2e1fbf9a17d4fb93c001","tests/join_handle_panic.rs":"a17a56a6283d229e64083cc433b4fb86b913f2cabd692177fdd7edc65baa7e42","tests/macros_join.rs":"4411683c1fe79419457e758650ce89ed76f28041a890cd05db9143034b63719c","tests/macros_pin.rs":"f8fe8ade470196dc09b061b0cdd71ef25e114a201d5eb500e0f8232b436012cb","tests/macros_rename_test.rs":"94715e8014bc4c67cebe830f3d800c4cb0937bc6245de4b5410e5729bb2c7f9a","tests/macros_select.rs":"7f5ad6e104c95a30b465aafae1211384c07228c61d15f64efb4cfe55111bbc22","tests/macros_test.rs":"7bdcb1fb36b09e0666c05c264e9dbf87eafb236db580c4ff0595d30bcaa68377","tests/macros_try_join.rs":"79a2e9c784e7249fb4bfe73c41d2efa88206fec36a8449e6fb7ecf95f50d8d4f","tests/net_bind_resource.rs":"ba0dcc301ee170fba82cbbfbf0172b665b9914c0004270d8a420d5cd948eda84","tests/net_lookup_host.rs":"69831a012b36346e25c3ffe0dee2dc31d0faeb294a9deadb46118c2561b617b2","tests/net_named_pipe.rs":"dfb791caa5a4ed1bae0605da27ef599abd8cbe745c2fa95a31853bd46465b042","tests/net_panic.rs":"9fabb8e012d92fbe23eef513c3e983b12a07f3c39d72dea06b35bc4902486916","tests/net_unix_pipe.rs":"6b6956dd7d584fa18309fc8c86a74f5270c9fc2faed2f5c3b722c11e93419abe","tests/no_rt.rs":"7ff583bbcd848d2721088dbfc45d0d70f978f8101275cc9bd220ac6d392f17d6","tests/process_arg0.rs":"785d801cf281230e3208512820e7d71b4d8362b8cf33fc72235da370e10983a8","tests/process_issue_2174.rs":"66c56d8dfda4e1723928da713dddea8d15774d6730398effadf0ec28f4c6f1e1","tests/process_issue_42.rs":"26043f8246b00046137551f7a9f638652c70f527f10b4d91e4286643120ca41d","tests/process_kill_on_drop.rs":"9b4bf8a73769fb268ef3687141e8df6122814855d3bbc4e63295c66b0ee6cff7","tests/process_raw_handle.rs":"aaf0dc242ce69f1a8c614e04515c41584f7e213f84ebf23238521eb881e0a6de","tests/process_smoke.rs":"4b55f2aa526b773be55e718abd54ab23851848c4cb28274af587d3bc8ab48f75","tests/rt_basic.rs":"2eb193a4a4555cb8aa636fa3437b4cdf12f64a888e20afe642b1b3872242ec3f","tests/rt_common.rs":"f3b03e4b987e742073646d21935f89c5f4ab05812e2b4569621dee1da8163662","tests/rt_handle.rs":"c9d021e651a1ffb3aefe9ce27f763b7f6be742b386c977d9fa0b6afe24749d78","tests/rt_handle_block_on.rs":"067205bfb6ce2c7b48301be4bc7d368c26b98ed1e0d17f58e64fa5c528205570","tests/rt_metrics.rs":"043c22f70d3754377c2c7d9b9377ed12b5bc2ab4daba5ec5d6ba2fcd1d95f66b","tests/rt_panic.rs":"3f757e55aba050e745347f1040b623d5b005bcc070d1e265cc4442589c7d3ed4","tests/rt_threaded.rs":"b2d166628893edda790bcae446f2466bfbd04d8dfba5262eb5eb01aa3b08d236","tests/rt_threaded_alt.rs":"eaf1fc504ad333c74ffde01475c1a087e1f566ec1bc840427ce09c83d1037a76","tests/rt_time_start_paused.rs":"76549719f16e9cbdd9a84b9d97929ed7c8ca95b8d4d715608eb99f950cdda7a3","tests/signal_ctrl_c.rs":"9b53065781b37f3db5f7c67938239b0f3b0ebbc5938c14a5b730ad7ec07415d2","tests/signal_drop_recv.rs":"d1ec97213d9c6fd9fb25ea8c2b015c9e9ee1a62fe0853fc558bc8801e5a3a841","tests/signal_drop_rt.rs":"f968c1154262a4427b5aad2d9fb36d3b7d47084312d0b5527a8eb3d589381d8b","tests/signal_drop_signal.rs":"041940550863250f359630dc67ef133874d809ddaf0a6c1238cee1565a19efec","tests/signal_multi_rt.rs":"a1c50c25f4707fda7665da61b3317dd61fc32c63c61db2bbdb56065bd9c591ce","tests/signal_no_rt.rs":"6978c2ca34a0244fd312d760ad416d961e7e27681e4bb936dfd583aefe6aaf1a","tests/signal_notify_both.rs":"bf0b9def20f530d146ee865305833d8e9bee07a0515e66573d7ff30e2c631123","tests/signal_panic.rs":"0b26845bbc7f388346e0fe3af98a2257dbfd0eb84168368994a0857e06a42398","tests/signal_twice.rs":"bce33093eed151955d13c334d6d8a5bc5ca67cf5b37c246e435a24c15bc166a0","tests/signal_usr1.rs":"86ad07594b09d35e71011d1e12a1fa2c477bfbc4a2a36df1421b6594a0930074","tests/support/io_vec.rs":"9b3001e120138ead4a63720019c669ff00f8455a74dea2fb231633b3b58c9b09","tests/support/leaked_buffers.rs":"85ddbce3ff6b0c5cc8cb30449dd37e5bfedc94f8357e741ec88ff04462bc60c3","tests/support/mpsc_stream.rs":"00d48122fa2ccbf1fe0b110ce3cf22590eda54b3ddec0134b1f9376eb1169645","tests/support/panic.rs":"7bcaf8ea2d249b5c1acb3c1b769cbe479834630dc71b3ce1114b8b46277f44da","tests/support/signal.rs":"83531afa2e8e71cfd90cd4e1fc821490ffa824f0f9f0c9c4a027c08fed6b8712","tests/sync_barrier.rs":"f166e526d12f840de404ef58a375e475dc7434292b2f23d557214749d0e6c372","tests/sync_broadcast.rs":"ce41987e3c5b7856684608528a2db19806073e41bf9a6a341f0a8c6ec4bbc4b8","tests/sync_errors.rs":"7a49ec77f4c967b3c76c946789f43c51e0a820a67e947ed42e30ef65ec9242e9","tests/sync_mpsc.rs":"b7306cbf9256570e63273bef7fd4e97658ea48c4580950078b54649470976ebd","tests/sync_mpsc_weak.rs":"5b8335b663cfccae9a08fcec4a3a73a890abd36d2f58adbd845d4745af4fafaa","tests/sync_mutex.rs":"432591e4893b4c64a58116463b6c16a2eb23fd42eee42af96d93b9d03728608a","tests/sync_mutex_owned.rs":"2664c35f66161825cf8e0ca863347735cf4d1252a208577e5084dc1935a18596","tests/sync_notify.rs":"9786acc38aecc651704b5e5b194c3a45a06a3ea032464145a5f17af2062399bf","tests/sync_once_cell.rs":"d4a792f554acbfcd66f2c794cda44f180a330d8bc488823af984196fe2c91d74","tests/sync_oneshot.rs":"6e3542ed15fc8e08bb422e0ad001cb422035c06305511b156e9645f2322abe4c","tests/sync_panic.rs":"6667fca8d892b2126e49ee86fea63ce8f90a2e7ce6e8326a46b522b682c61723","tests/sync_rwlock.rs":"47094f85a9d6db9d3011d09f8db014f692cdc3239449bbf2d54575c4923e8dc5","tests/sync_semaphore.rs":"63a61b02ac674cee92e963a2e92f058fdda22dd95f05a087136524042bb8bc8f","tests/sync_semaphore_owned.rs":"5688e32fb6f9d6ad95dc6859fb5c5682e4e75e59dab9d2f0c02b9360d455e4d2","tests/sync_watch.rs":"a4f8a7b445e5089ba915a973627b7348e03acda165cd7b4ce9b9d66cac7912d6","tests/task_abort.rs":"4347395642f407e22605c4421199b1ad7192be5963704f0c6822616aad9e07e8","tests/task_blocking.rs":"dca80f95e916f1cd619ae479a37bc891bfbcad36ac24088ed1d23802777b3e3a","tests/task_builder.rs":"784830b868e9fd7b0d9413cbd7719eea7606c62dffaaf59986ed3e7902e9a3e5","tests/task_id.rs":"98caa8b1874e3cf65d06bbbf2a0dde936c397aba25e5f4859ecc96a8774c446c","tests/task_join_set.rs":"060eed473a3f930a31f6bdec16b053944681b86fce005974cca4f0780a08a2ff","tests/task_local.rs":"fee94e54f2043dbbdcf36e6fe1787e7e2fcb814affbb9c370831a58281791755","tests/task_local_set.rs":"0b47d11e94daaef453b674b0bb04080fc8564edfe690985a5678b99dd235bf43","tests/task_panic.rs":"815ba77560f18f92e68db86688e82d5c6c3d8a83ee9caed2968eef0ea30c10de","tests/task_yield_now.rs":"dbd0f342129b2d06edc0daee360731e5adcb2e3a19f8d658a2cb510490d7fa25","tests/tcp_accept.rs":"e25e52fe4087638b05fc74e1be5311e015a723043d4de7b8e8867ae4bb999f9d","tests/tcp_connect.rs":"03abbf5cb0e163de534feeafb8498357231bfb3a38844e20a5e459d241dd204f","tests/tcp_echo.rs":"7dce84fa8c5ad0014846c3d0eaec1df8ad779fdfcc44441d068e32b408ba3716","tests/tcp_into_split.rs":"8248df254d9a7653c151eede9846994f1543ef902757ec2a196eaee1b0522936","tests/tcp_into_std.rs":"b2daa51b870dfb83c72958ed900ba863578e7d6c9339a591e97612a5f4d670b9","tests/tcp_peek.rs":"aeecf794f845e5396df9901780089289e285c10b65b9fd9a8ece669e808d535e","tests/tcp_shutdown.rs":"82eec393777a05f4a6ebe460e74d1dbab6b80d55b1289573932a891677c345f7","tests/tcp_socket.rs":"185f1a0121f5f22d9ccb5969fd36e64d12c563efd2d1964e2becbd73128677d9","tests/tcp_split.rs":"5210f66e120f90f6c5110b28859cb1582713885f2986ebf1600c6321095e85f0","tests/tcp_stream.rs":"08c0986f8ded0a517df2935eb6f76d31456ef699082d7dc140260bbc8f91c9d0","tests/test_clock.rs":"d5c9bf7bb5d926e2b29b43e47b5bb051b0f761bfe44d5fef349ed442ea7b416f","tests/time_interval.rs":"2f52d3e28bd1d8c93f25bfcd72ea259a14eed5e43a8e9d99c9e482d9939f445c","tests/time_panic.rs":"9c46cffc7c5fa7bd812422dc2a3574a7ff39350438e4a3382fcf7eea37d2fcc4","tests/time_pause.rs":"a5b155c5d2d6b6ca35bc1ad58c3982fd08740ac97da351b6094223002786dc2e","tests/time_rt.rs":"7467d08a4d681eba4d2207e8254e8f5cbf3755c0dbd40e9bea51e6838993b11e","tests/time_sleep.rs":"b006035ef12c7f25e32a65bdf5e3a3da7cee0b1e7a096f821252237e3f48119c","tests/time_timeout.rs":"31d4955a4009b24aa0a506335607b6aa0e6b21cbc533650739642c4334b888d9","tests/udp.rs":"153ab04ca9d14b63967fea25e46855959931aa786bb375f1c39bcb36cc9d8c66","tests/uds_cred.rs":"146c6e9bdbb82a268f178b03575f94a40db81ef67a740dd16ead5b9e4a447f1b","tests/uds_datagram.rs":"f8d886adc6c3947960991392cd8540a0b4a7f7b0110a24d10805237b385b49f0","tests/uds_split.rs":"79d54d6ce35e5d15138299091871ecbdb6492ae6863fe406021fd7359f1ed7fd","tests/uds_stream.rs":"287b7d5e297df3e326488d98f9645ebfcf8be0205ba6a8e5ddaadac58240e113","tests/unwindsafe.rs":"e833431d40708f39b8bf54b809b635d77d9895f46f3c42aa14d3e9108415279d"},"package":"17ed6077ed6cd6c74735e21f37eb16dc3935f96878b1fe961074089cc80893f9"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/tokio/Cargo.toml temporalio-1.3.0/vendor/tokio/Cargo.toml --- temporalio-1.3.0/vendor/tokio/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -13,7 +13,7 @@ edition = "2021" rust-version = "1.63" name = "tokio" -version = "1.33.0" +version = "1.32.0" authors = ["Tokio Contributors "] description = """ An event-driven, non-blocking I/O platform for writing asynchronous I/O @@ -39,16 +39,12 @@ rustc-args = [ "--cfg", "tokio_unstable", - "--cfg", - "tokio_taskdump", ] rustdoc-args = [ "--cfg", "docsrs", "--cfg", "tokio_unstable", - "--cfg", - "tokio_taskdump", ] [package.metadata.playground] @@ -154,6 +150,7 @@ "windows-sys/Win32_Foundation", "windows-sys/Win32_System_Console", ] +stats = [] sync = [] test-util = [ "rt", diff -Nru temporalio-1.3.0/vendor/tokio/CHANGELOG.md temporalio-1.3.0/vendor/tokio/CHANGELOG.md --- temporalio-1.3.0/vendor/tokio/CHANGELOG.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio/CHANGELOG.md 2023-10-30 19:40:00.000000000 +0000 @@ -1,86 +1,3 @@ -# 1.33.0 (October 9, 2023) - -### Fixed - -- io: mark `Interest::add` with `#[must_use]` ([#6037]) -- runtime: fix cache line size for RISC-V ([#5994]) -- sync: prevent lock poisoning in `watch::Receiver::wait_for` ([#6021]) -- task: fix `spawn_local` source location ([#5984]) - -### Changed - -- macros: use `::core` imports instead of `::std` in `tokio::test` ([#5973]) -- sync: use Acquire/Release orderings instead of SeqCst in `watch` ([#6018]) - -### Added - -- fs: add vectored writes to `tokio::fs::File` ([#5958]) -- io: add `Interest::remove` method ([#5906]) -- io: add vectored writes to `DuplexStream` ([#5985]) -- net: add Apple tvOS support ([#6045]) -- sync: add `?Sized` bound to `{MutexGuard,OwnedMutexGuard}::map` ([#5997]) -- sync: add `watch::Receiver::mark_unseen` ([#5962], [#6014], [#6017]) -- sync: add `watch::Sender::new` ([#5998]) -- sync: add const fn `OnceCell::from_value` ([#5903]) - -### Removed - -- remove unused `stats` feature ([#5952]) - -### Documented - -- add missing backticks in code examples ([#5938], [#6056]) -- fix typos ([#5988], [#6030]) -- process: document that `Child::wait` is cancel safe ([#5977]) -- sync: add examples for `Semaphore` ([#5939], [#5956], [#5978], [#6031], [#6032], [#6050]) -- sync: document that `broadcast` capacity is a lower bound ([#6042]) -- sync: document that `const_new` is not instrumented ([#6002]) -- sync: improve cancel-safety documentation for `mpsc::Sender::send` ([#5947]) -- sync: improve docs for `watch` channel ([#5954]) -- taskdump: render taskdump documentation on docs.rs ([#5972]) - -### Unstable - -- taskdump: fix potential deadlock ([#6036]) - -[#5903]: https://github.com/tokio-rs/tokio/pull/5903 -[#5906]: https://github.com/tokio-rs/tokio/pull/5906 -[#5938]: https://github.com/tokio-rs/tokio/pull/5938 -[#5939]: https://github.com/tokio-rs/tokio/pull/5939 -[#5947]: https://github.com/tokio-rs/tokio/pull/5947 -[#5952]: https://github.com/tokio-rs/tokio/pull/5952 -[#5954]: https://github.com/tokio-rs/tokio/pull/5954 -[#5956]: https://github.com/tokio-rs/tokio/pull/5956 -[#5958]: https://github.com/tokio-rs/tokio/pull/5958 -[#5960]: https://github.com/tokio-rs/tokio/pull/5960 -[#5962]: https://github.com/tokio-rs/tokio/pull/5962 -[#5971]: https://github.com/tokio-rs/tokio/pull/5971 -[#5972]: https://github.com/tokio-rs/tokio/pull/5972 -[#5973]: https://github.com/tokio-rs/tokio/pull/5973 -[#5977]: https://github.com/tokio-rs/tokio/pull/5977 -[#5978]: https://github.com/tokio-rs/tokio/pull/5978 -[#5984]: https://github.com/tokio-rs/tokio/pull/5984 -[#5985]: https://github.com/tokio-rs/tokio/pull/5985 -[#5988]: https://github.com/tokio-rs/tokio/pull/5988 -[#5994]: https://github.com/tokio-rs/tokio/pull/5994 -[#5997]: https://github.com/tokio-rs/tokio/pull/5997 -[#5998]: https://github.com/tokio-rs/tokio/pull/5998 -[#6002]: https://github.com/tokio-rs/tokio/pull/6002 -[#6014]: https://github.com/tokio-rs/tokio/pull/6014 -[#6017]: https://github.com/tokio-rs/tokio/pull/6017 -[#6018]: https://github.com/tokio-rs/tokio/pull/6018 -[#6021]: https://github.com/tokio-rs/tokio/pull/6021 -[#6030]: https://github.com/tokio-rs/tokio/pull/6030 -[#6031]: https://github.com/tokio-rs/tokio/pull/6031 -[#6032]: https://github.com/tokio-rs/tokio/pull/6032 -[#6036]: https://github.com/tokio-rs/tokio/pull/6036 -[#6037]: https://github.com/tokio-rs/tokio/pull/6037 -[#6042]: https://github.com/tokio-rs/tokio/pull/6042 -[#6045]: https://github.com/tokio-rs/tokio/pull/6045 -[#6050]: https://github.com/tokio-rs/tokio/pull/6050 -[#6056]: https://github.com/tokio-rs/tokio/pull/6056 -[#6058]: https://github.com/tokio-rs/tokio/pull/6058 - # 1.32.0 (August 16, 2023) ### Fixed @@ -443,16 +360,6 @@ [#5513]: https://github.com/tokio-rs/tokio/pull/5513 [#5517]: https://github.com/tokio-rs/tokio/pull/5517 -# 1.25.2 (September 22, 2023) - -Forward ports 1.20.6 changes. - -### Changed - -- io: use `memchr` from `libc` ([#5960]) - -[#5960]: https://github.com/tokio-rs/tokio/pull/5960 - # 1.25.1 (May 28, 2023) Forward ports 1.18.6 changes. @@ -799,16 +706,6 @@ [#4956]: https://github.com/tokio-rs/tokio/pull/4956 [#4959]: https://github.com/tokio-rs/tokio/pull/4959 -# 1.20.6 (September 22, 2023) - -This is a backport of a change from 1.27.0. - -### Changed - -- io: use `memchr` from `libc` ([#5960]) - -[#5960]: https://github.com/tokio-rs/tokio/pull/5960 - # 1.20.5 (May 28, 2023) Forward ports 1.18.6 changes. diff -Nru temporalio-1.3.0/vendor/tokio/README.md temporalio-1.3.0/vendor/tokio/README.md --- temporalio-1.3.0/vendor/tokio/README.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio/README.md 2023-10-30 19:40:00.000000000 +0000 @@ -56,7 +56,7 @@ ```toml [dependencies] -tokio = { version = "1.33.0", features = ["full"] } +tokio = { version = "1.32.0", features = ["full"] } ``` Then, on your main.rs: @@ -218,17 +218,16 @@ * `1.20.x` - LTS release until September 2023. (MSRV 1.49) * `1.25.x` - LTS release until March 2024. (MSRV 1.49) - * `1.32.x` - LTS release until September 2024 (MSRV 1.63) Each LTS release will continue to receive backported fixes for at least a year. If you wish to use a fixed minor release in your project, we recommend that you use an LTS release. To use a fixed minor version, you can specify the version with a tilde. For -example, to specify that you wish to use the newest `1.25.x` patch release, you +example, to specify that you wish to use the newest `1.18.x` patch release, you can use the following dependency specification: ```text -tokio = { version = "~1.25", features = [...] } +tokio = { version = "~1.18", features = [...] } ``` ### Previous LTS releases diff -Nru temporalio-1.3.0/vendor/tokio/src/fs/file.rs temporalio-1.3.0/vendor/tokio/src/fs/file.rs --- temporalio-1.3.0/vendor/tokio/src/fs/file.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio/src/fs/file.rs 2023-10-30 19:40:00.000000000 +0000 @@ -2,6 +2,7 @@ //! //! [`File`]: File +use self::State::*; use crate::fs::{asyncify, OpenOptions}; use crate::io::blocking::Buf; use crate::io::{AsyncRead, AsyncSeek, AsyncWrite, ReadBuf}; @@ -16,6 +17,7 @@ use std::sync::Arc; use std::task::Context; use std::task::Poll; +use std::task::Poll::*; #[cfg(test)] use super::mocks::JoinHandle; @@ -349,7 +351,7 @@ inner.complete_inflight().await; let mut buf = match inner.state { - State::Idle(ref mut buf_cell) => buf_cell.take().unwrap(), + Idle(ref mut buf_cell) => buf_cell.take().unwrap(), _ => unreachable!(), }; @@ -361,7 +363,7 @@ let std = self.std.clone(); - inner.state = State::Busy(spawn_blocking(move || { + inner.state = Busy(spawn_blocking(move || { let res = if let Some(seek) = seek { (&*std).seek(seek).and_then(|_| std.set_len(size)) } else { @@ -374,11 +376,11 @@ })); let (op, buf) = match inner.state { - State::Idle(_) => unreachable!(), - State::Busy(ref mut rx) => rx.await?, + Idle(_) => unreachable!(), + Busy(ref mut rx) => rx.await?, }; - inner.state = State::Idle(Some(buf)); + inner.state = Idle(Some(buf)); match op { Operation::Seek(res) => res.map(|pos| { @@ -530,51 +532,51 @@ loop { match inner.state { - State::Idle(ref mut buf_cell) => { + Idle(ref mut buf_cell) => { let mut buf = buf_cell.take().unwrap(); if !buf.is_empty() { buf.copy_to(dst); *buf_cell = Some(buf); - return Poll::Ready(Ok(())); + return Ready(Ok(())); } buf.ensure_capacity_for(dst); let std = me.std.clone(); - inner.state = State::Busy(spawn_blocking(move || { + inner.state = Busy(spawn_blocking(move || { let res = buf.read_from(&mut &*std); (Operation::Read(res), buf) })); } - State::Busy(ref mut rx) => { + Busy(ref mut rx) => { let (op, mut buf) = ready!(Pin::new(rx).poll(cx))?; match op { Operation::Read(Ok(_)) => { buf.copy_to(dst); - inner.state = State::Idle(Some(buf)); - return Poll::Ready(Ok(())); + inner.state = Idle(Some(buf)); + return Ready(Ok(())); } Operation::Read(Err(e)) => { assert!(buf.is_empty()); - inner.state = State::Idle(Some(buf)); - return Poll::Ready(Err(e)); + inner.state = Idle(Some(buf)); + return Ready(Err(e)); } Operation::Write(Ok(_)) => { assert!(buf.is_empty()); - inner.state = State::Idle(Some(buf)); + inner.state = Idle(Some(buf)); continue; } Operation::Write(Err(e)) => { assert!(inner.last_write_err.is_none()); inner.last_write_err = Some(e.kind()); - inner.state = State::Idle(Some(buf)); + inner.state = Idle(Some(buf)); } Operation::Seek(result) => { assert!(buf.is_empty()); - inner.state = State::Idle(Some(buf)); + inner.state = Idle(Some(buf)); if let Ok(pos) = result { inner.pos = pos; } @@ -593,11 +595,11 @@ let inner = me.inner.get_mut(); match inner.state { - State::Busy(_) => Err(io::Error::new( + Busy(_) => Err(io::Error::new( io::ErrorKind::Other, "other file operation is pending, call poll_complete before start_seek", )), - State::Idle(ref mut buf_cell) => { + Idle(ref mut buf_cell) => { let mut buf = buf_cell.take().unwrap(); // Factor in any unread data from the buf @@ -611,7 +613,7 @@ let std = me.std.clone(); - inner.state = State::Busy(spawn_blocking(move || { + inner.state = Busy(spawn_blocking(move || { let res = (&*std).seek(pos); (Operation::Seek(res), buf) })); @@ -626,10 +628,10 @@ loop { match inner.state { - State::Idle(_) => return Poll::Ready(Ok(inner.pos)), - State::Busy(ref mut rx) => { + Idle(_) => return Poll::Ready(Ok(inner.pos)), + Busy(ref mut rx) => { let (op, buf) = ready!(Pin::new(rx).poll(cx))?; - inner.state = State::Idle(Some(buf)); + inner.state = Idle(Some(buf)); match op { Operation::Read(_) => {} @@ -642,7 +644,7 @@ if let Ok(pos) = res { inner.pos = pos; } - return Poll::Ready(res); + return Ready(res); } } } @@ -662,12 +664,12 @@ let inner = me.inner.get_mut(); if let Some(e) = inner.last_write_err.take() { - return Poll::Ready(Err(e.into())); + return Ready(Err(e.into())); } loop { match inner.state { - State::Idle(ref mut buf_cell) => { + Idle(ref mut buf_cell) => { let mut buf = buf_cell.take().unwrap(); let seek = if !buf.is_empty() { @@ -692,13 +694,13 @@ io::Error::new(io::ErrorKind::Other, "background task failed") })?; - inner.state = State::Busy(blocking_task_join_handle); + inner.state = Busy(blocking_task_join_handle); - return Poll::Ready(Ok(n)); + return Ready(Ok(n)); } - State::Busy(ref mut rx) => { + Busy(ref mut rx) => { let (op, buf) = ready!(Pin::new(rx).poll(cx))?; - inner.state = State::Idle(Some(buf)); + inner.state = Idle(Some(buf)); match op { Operation::Read(_) => { @@ -723,81 +725,6 @@ } } - fn poll_write_vectored( - self: Pin<&mut Self>, - cx: &mut Context<'_>, - bufs: &[io::IoSlice<'_>], - ) -> Poll> { - ready!(crate::trace::trace_leaf(cx)); - let me = self.get_mut(); - let inner = me.inner.get_mut(); - - if let Some(e) = inner.last_write_err.take() { - return Poll::Ready(Err(e.into())); - } - - loop { - match inner.state { - State::Idle(ref mut buf_cell) => { - let mut buf = buf_cell.take().unwrap(); - - let seek = if !buf.is_empty() { - Some(SeekFrom::Current(buf.discard_read())) - } else { - None - }; - - let n = buf.copy_from_bufs(bufs); - let std = me.std.clone(); - - let blocking_task_join_handle = spawn_mandatory_blocking(move || { - let res = if let Some(seek) = seek { - (&*std).seek(seek).and_then(|_| buf.write_to(&mut &*std)) - } else { - buf.write_to(&mut &*std) - }; - - (Operation::Write(res), buf) - }) - .ok_or_else(|| { - io::Error::new(io::ErrorKind::Other, "background task failed") - })?; - - inner.state = State::Busy(blocking_task_join_handle); - - return Poll::Ready(Ok(n)); - } - State::Busy(ref mut rx) => { - let (op, buf) = ready!(Pin::new(rx).poll(cx))?; - inner.state = State::Idle(Some(buf)); - - match op { - Operation::Read(_) => { - // We don't care about the result here. The fact - // that the cursor has advanced will be reflected in - // the next iteration of the loop - continue; - } - Operation::Write(res) => { - // If the previous write was successful, continue. - // Otherwise, error. - res?; - continue; - } - Operation::Seek(_) => { - // Ignore the seek - continue; - } - } - } - } - } - } - - fn is_write_vectored(&self) -> bool { - true - } - fn poll_flush(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { ready!(crate::trace::trace_leaf(cx)); let inner = self.inner.get_mut(); @@ -894,21 +821,21 @@ fn poll_flush(&mut self, cx: &mut Context<'_>) -> Poll> { if let Some(e) = self.last_write_err.take() { - return Poll::Ready(Err(e.into())); + return Ready(Err(e.into())); } let (op, buf) = match self.state { - State::Idle(_) => return Poll::Ready(Ok(())), - State::Busy(ref mut rx) => ready!(Pin::new(rx).poll(cx))?, + Idle(_) => return Ready(Ok(())), + Busy(ref mut rx) => ready!(Pin::new(rx).poll(cx))?, }; // The buffer is not used here - self.state = State::Idle(Some(buf)); + self.state = Idle(Some(buf)); match op { - Operation::Read(_) => Poll::Ready(Ok(())), - Operation::Write(res) => Poll::Ready(res), - Operation::Seek(_) => Poll::Ready(Ok(())), + Operation::Read(_) => Ready(Ok(())), + Operation::Write(res) => Ready(res), + Operation::Seek(_) => Ready(Ok(())), } } } diff -Nru temporalio-1.3.0/vendor/tokio/src/fs/mocks.rs temporalio-1.3.0/vendor/tokio/src/fs/mocks.rs --- temporalio-1.3.0/vendor/tokio/src/fs/mocks.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio/src/fs/mocks.rs 2023-10-30 19:40:00.000000000 +0000 @@ -124,12 +124,12 @@ type Output = Result; fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { - use std::task::Poll; + use std::task::Poll::*; match Pin::new(&mut self.rx).poll(cx) { - Poll::Ready(Ok(v)) => Poll::Ready(Ok(v)), - Poll::Ready(Err(e)) => panic!("error = {:?}", e), - Poll::Pending => Poll::Pending, + Ready(Ok(v)) => Ready(Ok(v)), + Ready(Err(e)) => panic!("error = {:?}", e), + Pending => Pending, } } } diff -Nru temporalio-1.3.0/vendor/tokio/src/future/mod.rs temporalio-1.3.0/vendor/tokio/src/future/mod.rs --- temporalio-1.3.0/vendor/tokio/src/future/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio/src/future/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -20,7 +20,6 @@ cfg_trace! { mod trace; - #[allow(unused_imports)] pub(crate) use trace::InstrumentedFuture as Future; } diff -Nru temporalio-1.3.0/vendor/tokio/src/io/blocking.rs temporalio-1.3.0/vendor/tokio/src/io/blocking.rs --- temporalio-1.3.0/vendor/tokio/src/io/blocking.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio/src/io/blocking.rs 2023-10-30 19:40:00.000000000 +0000 @@ -6,8 +6,11 @@ use std::io; use std::io::prelude::*; use std::pin::Pin; +use std::task::Poll::*; use std::task::{Context, Poll}; +use self::State::*; + /// `T` should not implement _both_ Read and Write. #[derive(Debug)] pub(crate) struct Blocking { @@ -55,38 +58,38 @@ ) -> Poll> { loop { match self.state { - State::Idle(ref mut buf_cell) => { + Idle(ref mut buf_cell) => { let mut buf = buf_cell.take().unwrap(); if !buf.is_empty() { buf.copy_to(dst); *buf_cell = Some(buf); - return Poll::Ready(Ok(())); + return Ready(Ok(())); } buf.ensure_capacity_for(dst); let mut inner = self.inner.take().unwrap(); - self.state = State::Busy(sys::run(move || { + self.state = Busy(sys::run(move || { let res = buf.read_from(&mut inner); (res, buf, inner) })); } - State::Busy(ref mut rx) => { + Busy(ref mut rx) => { let (res, mut buf, inner) = ready!(Pin::new(rx).poll(cx))?; self.inner = Some(inner); match res { Ok(_) => { buf.copy_to(dst); - self.state = State::Idle(Some(buf)); - return Poll::Ready(Ok(())); + self.state = Idle(Some(buf)); + return Ready(Ok(())); } Err(e) => { assert!(buf.is_empty()); - self.state = State::Idle(Some(buf)); - return Poll::Ready(Err(e)); + self.state = Idle(Some(buf)); + return Ready(Err(e)); } } } @@ -106,7 +109,7 @@ ) -> Poll> { loop { match self.state { - State::Idle(ref mut buf_cell) => { + Idle(ref mut buf_cell) => { let mut buf = buf_cell.take().unwrap(); assert!(buf.is_empty()); @@ -114,7 +117,7 @@ let n = buf.copy_from(src); let mut inner = self.inner.take().unwrap(); - self.state = State::Busy(sys::run(move || { + self.state = Busy(sys::run(move || { let n = buf.len(); let res = buf.write_to(&mut inner).map(|_| n); @@ -122,11 +125,11 @@ })); self.need_flush = true; - return Poll::Ready(Ok(n)); + return Ready(Ok(n)); } - State::Busy(ref mut rx) => { + Busy(ref mut rx) => { let (res, buf, inner) = ready!(Pin::new(rx).poll(cx))?; - self.state = State::Idle(Some(buf)); + self.state = Idle(Some(buf)); self.inner = Some(inner); // If error, return @@ -141,24 +144,24 @@ let need_flush = self.need_flush; match self.state { // The buffer is not used here - State::Idle(ref mut buf_cell) => { + Idle(ref mut buf_cell) => { if need_flush { let buf = buf_cell.take().unwrap(); let mut inner = self.inner.take().unwrap(); - self.state = State::Busy(sys::run(move || { + self.state = Busy(sys::run(move || { let res = inner.flush().map(|_| 0); (res, buf, inner) })); self.need_flush = false; } else { - return Poll::Ready(Ok(())); + return Ready(Ok(())); } } - State::Busy(ref mut rx) => { + Busy(ref mut rx) => { let (res, buf, inner) = ready!(Pin::new(rx).poll(cx))?; - self.state = State::Idle(Some(buf)); + self.state = Idle(Some(buf)); self.inner = Some(inner); // If error, return @@ -273,22 +276,5 @@ self.buf.truncate(0); ret } - - pub(crate) fn copy_from_bufs(&mut self, bufs: &[io::IoSlice<'_>]) -> usize { - assert!(self.is_empty()); - - let mut rem = MAX_BUF; - for buf in bufs { - if rem == 0 { - break - } - - let len = buf.len().min(rem); - self.buf.extend_from_slice(&buf[..len]); - rem -= len; - } - - MAX_BUF - rem - } } } diff -Nru temporalio-1.3.0/vendor/tokio/src/io/interest.rs temporalio-1.3.0/vendor/tokio/src/io/interest.rs --- temporalio-1.3.0/vendor/tokio/src/io/interest.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio/src/io/interest.rs 2023-10-30 19:40:00.000000000 +0000 @@ -163,45 +163,10 @@ /// /// assert!(BOTH.is_readable()); /// assert!(BOTH.is_writable()); - #[must_use = "this returns the result of the operation, without modifying the original"] pub const fn add(self, other: Interest) -> Interest { Self(self.0 | other.0) } - /// Remove `Interest` from `self`. - /// - /// Interests present in `other` but *not* in `self` are ignored. - /// - /// Returns `None` if the set would be empty after removing `Interest`. - /// - /// # Examples - /// - /// ``` - /// use tokio::io::Interest; - /// - /// const RW_INTEREST: Interest = Interest::READABLE.add(Interest::WRITABLE); - /// - /// let w_interest = RW_INTEREST.remove(Interest::READABLE).unwrap(); - /// assert!(!w_interest.is_readable()); - /// assert!(w_interest.is_writable()); - /// - /// // Removing all interests from the set returns `None`. - /// assert_eq!(w_interest.remove(Interest::WRITABLE), None); - /// - /// // Remove all interests at once. - /// assert_eq!(RW_INTEREST.remove(RW_INTEREST), None); - /// ``` - #[must_use = "this returns the result of the operation, without modifying the original"] - pub fn remove(self, other: Interest) -> Option { - let value = self.0 & !other.0; - - if value != 0 { - Some(Self(value)) - } else { - None - } - } - // This function must be crate-private to avoid exposing a `mio` dependency. pub(crate) fn to_mio(self) -> mio::Interest { fn mio_add(wrapped: &mut Option, add: mio::Interest) { diff -Nru temporalio-1.3.0/vendor/tokio/src/io/util/mem.rs temporalio-1.3.0/vendor/tokio/src/io/util/mem.rs --- temporalio-1.3.0/vendor/tokio/src/io/util/mem.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio/src/io/util/mem.rs 2023-10-30 19:40:00.000000000 +0000 @@ -124,18 +124,6 @@ Pin::new(&mut *self.write.lock()).poll_write(cx, buf) } - fn poll_write_vectored( - self: Pin<&mut Self>, - cx: &mut task::Context<'_>, - bufs: &[std::io::IoSlice<'_>], - ) -> Poll> { - Pin::new(&mut *self.write.lock()).poll_write_vectored(cx, bufs) - } - - fn is_write_vectored(&self) -> bool { - true - } - #[allow(unused_mut)] fn poll_flush( mut self: Pin<&mut Self>, @@ -236,37 +224,6 @@ } Poll::Ready(Ok(len)) } - - fn poll_write_vectored_internal( - mut self: Pin<&mut Self>, - cx: &mut task::Context<'_>, - bufs: &[std::io::IoSlice<'_>], - ) -> Poll> { - if self.is_closed { - return Poll::Ready(Err(std::io::ErrorKind::BrokenPipe.into())); - } - let avail = self.max_buf_size - self.buffer.len(); - if avail == 0 { - self.write_waker = Some(cx.waker().clone()); - return Poll::Pending; - } - - let mut rem = avail; - for buf in bufs { - if rem == 0 { - break; - } - - let len = buf.len().min(rem); - self.buffer.extend_from_slice(&buf[..len]); - rem -= len; - } - - if let Some(waker) = self.read_waker.take() { - waker.wake(); - } - Poll::Ready(Ok(avail - rem)) - } } impl AsyncRead for Pipe { @@ -328,38 +285,6 @@ } } - cfg_coop! { - fn poll_write_vectored( - self: Pin<&mut Self>, - cx: &mut task::Context<'_>, - bufs: &[std::io::IoSlice<'_>], - ) -> Poll> { - ready!(crate::trace::trace_leaf(cx)); - let coop = ready!(crate::runtime::coop::poll_proceed(cx)); - - let ret = self.poll_write_vectored_internal(cx, bufs); - if ret.is_ready() { - coop.made_progress(); - } - ret - } - } - - cfg_not_coop! { - fn poll_write_vectored( - self: Pin<&mut Self>, - cx: &mut task::Context<'_>, - bufs: &[std::io::IoSlice<'_>], - ) -> Poll> { - ready!(crate::trace::trace_leaf(cx)); - self.poll_write_vectored_internal(cx, bufs) - } - } - - fn is_write_vectored(&self) -> bool { - true - } - fn poll_flush(self: Pin<&mut Self>, _: &mut task::Context<'_>) -> Poll> { Poll::Ready(Ok(())) } diff -Nru temporalio-1.3.0/vendor/tokio/src/net/unix/pipe.rs temporalio-1.3.0/vendor/tokio/src/net/unix/pipe.rs --- temporalio-1.3.0/vendor/tokio/src/net/unix/pipe.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio/src/net/unix/pipe.rs 2023-10-30 19:40:00.000000000 +0000 @@ -22,12 +22,13 @@ /// Generally speaking, when using `OpenOptions`, you'll first call [`new`], /// then chain calls to methods to set each option, then call either /// [`open_receiver`] or [`open_sender`], passing the path of the FIFO file you -/// are trying to open. This will give you a [`io::Result`] with a pipe end -/// inside that you can further operate on. +/// are trying to open. This will give you a [`io::Result`][result] with a pipe +/// end inside that you can further operate on. /// /// [`new`]: OpenOptions::new /// [`open_receiver`]: OpenOptions::open_receiver /// [`open_sender`]: OpenOptions::open_sender +/// [result]: std::io::Result /// /// # Examples /// diff -Nru temporalio-1.3.0/vendor/tokio/src/net/unix/ucred.rs temporalio-1.3.0/vendor/tokio/src/net/unix/ucred.rs --- temporalio-1.3.0/vendor/tokio/src/net/unix/ucred.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio/src/net/unix/ucred.rs 2023-10-30 19:40:00.000000000 +0000 @@ -45,7 +45,7 @@ #[cfg(any(target_os = "dragonfly", target_os = "freebsd"))] pub(crate) use self::impl_bsd::get_peer_cred; -#[cfg(any(target_os = "macos", target_os = "ios", target_os = "tvos"))] +#[cfg(any(target_os = "macos", target_os = "ios"))] pub(crate) use self::impl_macos::get_peer_cred; #[cfg(any(target_os = "solaris", target_os = "illumos"))] @@ -187,7 +187,7 @@ } } -#[cfg(any(target_os = "macos", target_os = "ios", target_os = "tvos"))] +#[cfg(any(target_os = "macos", target_os = "ios"))] pub(crate) mod impl_macos { use crate::net::unix::{self, UnixStream}; diff -Nru temporalio-1.3.0/vendor/tokio/src/process/mod.rs temporalio-1.3.0/vendor/tokio/src/process/mod.rs --- temporalio-1.3.0/vendor/tokio/src/process/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio/src/process/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1166,10 +1166,6 @@ /// If the caller wishes to explicitly control when the child's stdin /// handle is closed, they may `.take()` it before calling `.wait()`: /// - /// # Cancel safety - /// - /// This function is cancel safe. - /// /// ``` /// # #[cfg(not(unix))]fn main(){} /// # #[cfg(unix)] diff -Nru temporalio-1.3.0/vendor/tokio/src/runtime/context.rs temporalio-1.3.0/vendor/tokio/src/runtime/context.rs --- temporalio-1.3.0/vendor/tokio/src/runtime/context.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio/src/runtime/context.rs 2023-10-30 19:40:00.000000000 +0000 @@ -80,23 +80,23 @@ #[cfg(feature = "rt")] thread_id: Cell::new(None), - // Tracks the current runtime handle to use when spawning, - // accessing drivers, etc... + /// Tracks the current runtime handle to use when spawning, + /// accessing drivers, etc... #[cfg(feature = "rt")] current: current::HandleCell::new(), - // Tracks the current scheduler internal context + /// Tracks the current scheduler internal context #[cfg(feature = "rt")] scheduler: Scoped::new(), #[cfg(feature = "rt")] current_task_id: Cell::new(None), - // Tracks if the current thread is currently driving a runtime. - // Note, that if this is set to "entered", the current scheduler - // handle may not reference the runtime currently executing. This - // is because other runtime handles may be set to current from - // within a runtime. + /// Tracks if the current thread is currently driving a runtime. + /// Note, that if this is set to "entered", the current scheduler + /// handle may not reference the runtime currently executing. This + /// is because other runtime handles may be set to current from + /// within a runtime. #[cfg(feature = "rt")] runtime: Cell::new(EnterRuntime::NotEntered), diff -Nru temporalio-1.3.0/vendor/tokio/src/runtime/handle.rs temporalio-1.3.0/vendor/tokio/src/runtime/handle.rs --- temporalio-1.3.0/vendor/tokio/src/runtime/handle.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio/src/runtime/handle.rs 2023-10-30 19:40:00.000000000 +0000 @@ -543,14 +543,6 @@ scheduler::Handle::MultiThreadAlt(_) => panic!("task dump not implemented for this runtime flavor"), } } - - /// Produces `true` if the current task is being traced for a dump; - /// otherwise false. This function is only public for integration - /// testing purposes. Do not rely on it. - #[doc(hidden)] - pub fn is_tracing() -> bool { - super::task::trace::Context::is_tracing() - } } cfg_rt_multi_thread! { @@ -612,19 +604,20 @@ impl fmt::Debug for TryCurrentErrorKind { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + use TryCurrentErrorKind::*; match self { - TryCurrentErrorKind::NoContext => f.write_str("NoContext"), - TryCurrentErrorKind::ThreadLocalDestroyed => f.write_str("ThreadLocalDestroyed"), + NoContext => f.write_str("NoContext"), + ThreadLocalDestroyed => f.write_str("ThreadLocalDestroyed"), } } } impl fmt::Display for TryCurrentError { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - use TryCurrentErrorKind as E; + use TryCurrentErrorKind::*; match self.kind { - E::NoContext => f.write_str(CONTEXT_MISSING_ERROR), - E::ThreadLocalDestroyed => f.write_str(THREAD_LOCAL_DESTROYED_ERROR), + NoContext => f.write_str(CONTEXT_MISSING_ERROR), + ThreadLocalDestroyed => f.write_str(THREAD_LOCAL_DESTROYED_ERROR), } } } diff -Nru temporalio-1.3.0/vendor/tokio/src/runtime/io/scheduled_io.rs temporalio-1.3.0/vendor/tokio/src/runtime/io/scheduled_io.rs --- temporalio-1.3.0/vendor/tokio/src/runtime/io/scheduled_io.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio/src/runtime/io/scheduled_io.rs 2023-10-30 19:40:00.000000000 +0000 @@ -44,20 +44,25 @@ ), repr(align(128)) )] -// arm, mips, mips64, sparc, and hexagon have 32-byte cache line size. +// arm, mips, mips64, riscv64, sparc, and hexagon have 32-byte cache line size. // // Sources: // - https://github.com/golang/go/blob/3dd58676054223962cd915bb0934d1f9f489d4d2/src/internal/cpu/cpu_arm.go#L7 // - https://github.com/golang/go/blob/3dd58676054223962cd915bb0934d1f9f489d4d2/src/internal/cpu/cpu_mips.go#L7 // - https://github.com/golang/go/blob/3dd58676054223962cd915bb0934d1f9f489d4d2/src/internal/cpu/cpu_mipsle.go#L7 // - https://github.com/golang/go/blob/3dd58676054223962cd915bb0934d1f9f489d4d2/src/internal/cpu/cpu_mips64x.go#L9 +// - https://github.com/golang/go/blob/3dd58676054223962cd915bb0934d1f9f489d4d2/src/internal/cpu/cpu_riscv64.go#L7 // - https://github.com/torvalds/linux/blob/3516bd729358a2a9b090c1905bd2a3fa926e24c6/arch/sparc/include/asm/cache.h#L17 // - https://github.com/torvalds/linux/blob/3516bd729358a2a9b090c1905bd2a3fa926e24c6/arch/hexagon/include/asm/cache.h#L12 +// +// riscv32 is assumed not to exceed the cache line size of riscv64. #[cfg_attr( any( target_arch = "arm", target_arch = "mips", target_arch = "mips64", + target_arch = "riscv32", + target_arch = "riscv64", target_arch = "sparc", target_arch = "hexagon", ), @@ -74,13 +79,12 @@ // - https://github.com/golang/go/blob/3dd58676054223962cd915bb0934d1f9f489d4d2/src/internal/cpu/cpu_s390x.go#L7 // - https://github.com/torvalds/linux/blob/3516bd729358a2a9b090c1905bd2a3fa926e24c6/arch/s390/include/asm/cache.h#L13 #[cfg_attr(target_arch = "s390x", repr(align(256)))] -// x86, riscv, wasm, and sparc64 have 64-byte cache line size. +// x86, wasm, and sparc64 have 64-byte cache line size. // // Sources: // - https://github.com/golang/go/blob/dda2991c2ea0c5914714469c4defc2562a907230/src/internal/cpu/cpu_x86.go#L9 // - https://github.com/golang/go/blob/3dd58676054223962cd915bb0934d1f9f489d4d2/src/internal/cpu/cpu_wasm.go#L7 // - https://github.com/torvalds/linux/blob/3516bd729358a2a9b090c1905bd2a3fa926e24c6/arch/sparc/include/asm/cache.h#L19 -// - https://github.com/torvalds/linux/blob/3516bd729358a2a9b090c1905bd2a3fa926e24c6/arch/riscv/include/asm/cache.h#L10 // // All others are assumed to have 64-byte cache line size. #[cfg_attr( @@ -91,6 +95,8 @@ target_arch = "arm", target_arch = "mips", target_arch = "mips64", + target_arch = "riscv32", + target_arch = "riscv64", target_arch = "sparc", target_arch = "hexagon", target_arch = "m68k", diff -Nru temporalio-1.3.0/vendor/tokio/src/runtime/metrics/runtime.rs temporalio-1.3.0/vendor/tokio/src/runtime/metrics/runtime.rs --- temporalio-1.3.0/vendor/tokio/src/runtime/metrics/runtime.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio/src/runtime/metrics/runtime.rs 2023-10-30 19:40:00.000000000 +0000 @@ -474,7 +474,7 @@ /// /// This metric only applies to the **multi-threaded** scheduler. /// - /// The worker overflow count starts at zero when the runtime is created and + /// The worker steal count starts at zero when the runtime is created and /// increases by one each time the worker attempts to schedule a task /// locally, but its local queue is full. When this happens, half of the /// local queue is moved to the injection queue. diff -Nru temporalio-1.3.0/vendor/tokio/src/runtime/runtime.rs temporalio-1.3.0/vendor/tokio/src/runtime/runtime.rs --- temporalio-1.3.0/vendor/tokio/src/runtime/runtime.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio/src/runtime/runtime.rs 2023-10-30 19:40:00.000000000 +0000 @@ -260,7 +260,6 @@ /// println!("now running on a worker thread"); /// }); /// # } - /// ``` #[track_caller] pub fn spawn_blocking(&self, func: F) -> JoinHandle where diff -Nru temporalio-1.3.0/vendor/tokio/src/runtime/task/core.rs temporalio-1.3.0/vendor/tokio/src/runtime/task/core.rs --- temporalio-1.3.0/vendor/tokio/src/runtime/task/core.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio/src/runtime/task/core.rs 2023-10-30 19:40:00.000000000 +0000 @@ -57,20 +57,25 @@ ), repr(align(128)) )] -// arm, mips, mips64, sparc, and hexagon have 32-byte cache line size. +// arm, mips, mips64, riscv64, sparc, and hexagon have 32-byte cache line size. // // Sources: // - https://github.com/golang/go/blob/3dd58676054223962cd915bb0934d1f9f489d4d2/src/internal/cpu/cpu_arm.go#L7 // - https://github.com/golang/go/blob/3dd58676054223962cd915bb0934d1f9f489d4d2/src/internal/cpu/cpu_mips.go#L7 // - https://github.com/golang/go/blob/3dd58676054223962cd915bb0934d1f9f489d4d2/src/internal/cpu/cpu_mipsle.go#L7 // - https://github.com/golang/go/blob/3dd58676054223962cd915bb0934d1f9f489d4d2/src/internal/cpu/cpu_mips64x.go#L9 +// - https://github.com/golang/go/blob/3dd58676054223962cd915bb0934d1f9f489d4d2/src/internal/cpu/cpu_riscv64.go#L7 // - https://github.com/torvalds/linux/blob/3516bd729358a2a9b090c1905bd2a3fa926e24c6/arch/sparc/include/asm/cache.h#L17 // - https://github.com/torvalds/linux/blob/3516bd729358a2a9b090c1905bd2a3fa926e24c6/arch/hexagon/include/asm/cache.h#L12 +// +// riscv32 is assumed not to exceed the cache line size of riscv64. #[cfg_attr( any( target_arch = "arm", target_arch = "mips", target_arch = "mips64", + target_arch = "riscv32", + target_arch = "riscv64", target_arch = "sparc", target_arch = "hexagon", ), @@ -87,13 +92,12 @@ // - https://github.com/golang/go/blob/3dd58676054223962cd915bb0934d1f9f489d4d2/src/internal/cpu/cpu_s390x.go#L7 // - https://github.com/torvalds/linux/blob/3516bd729358a2a9b090c1905bd2a3fa926e24c6/arch/s390/include/asm/cache.h#L13 #[cfg_attr(target_arch = "s390x", repr(align(256)))] -// x86, riscv, wasm, and sparc64 have 64-byte cache line size. +// x86, wasm, and sparc64 have 64-byte cache line size. // // Sources: // - https://github.com/golang/go/blob/dda2991c2ea0c5914714469c4defc2562a907230/src/internal/cpu/cpu_x86.go#L9 // - https://github.com/golang/go/blob/3dd58676054223962cd915bb0934d1f9f489d4d2/src/internal/cpu/cpu_wasm.go#L7 // - https://github.com/torvalds/linux/blob/3516bd729358a2a9b090c1905bd2a3fa926e24c6/arch/sparc/include/asm/cache.h#L19 -// - https://github.com/torvalds/linux/blob/3516bd729358a2a9b090c1905bd2a3fa926e24c6/arch/riscv/include/asm/cache.h#L10 // // All others are assumed to have 64-byte cache line size. #[cfg_attr( @@ -104,6 +108,8 @@ target_arch = "arm", target_arch = "mips", target_arch = "mips64", + target_arch = "riscv32", + target_arch = "riscv64", target_arch = "sparc", target_arch = "hexagon", target_arch = "m68k", diff -Nru temporalio-1.3.0/vendor/tokio/src/runtime/task/mod.rs temporalio-1.3.0/vendor/tokio/src/runtime/task/mod.rs --- temporalio-1.3.0/vendor/tokio/src/runtime/task/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio/src/runtime/task/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -361,14 +361,6 @@ fn header_ptr(&self) -> NonNull
{ self.raw.header_ptr() } - - cfg_taskdump! { - pub(super) fn notify_for_tracing(&self) -> Notified { - self.as_raw().state().transition_to_notified_for_tracing(); - // SAFETY: `transition_to_notified_for_tracing` increments the refcount. - unsafe { Notified(Task::new(self.raw)) } - } - } } impl Notified { diff -Nru temporalio-1.3.0/vendor/tokio/src/runtime/task/trace/mod.rs temporalio-1.3.0/vendor/tokio/src/runtime/task/trace/mod.rs --- temporalio-1.3.0/vendor/tokio/src/runtime/task/trace/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio/src/runtime/task/trace/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -18,7 +18,7 @@ use symbol::Symbol; use tree::Tree; -use super::{Notified, OwnedTasks, Schedule}; +use super::{Notified, OwnedTasks}; type Backtrace = Vec; type SymbolTrace = Vec; @@ -100,16 +100,6 @@ Self::try_with_current(|context| f(&context.collector)).expect(FAIL_NO_THREAD_LOCAL) } } - - /// Produces `true` if the current task is being traced; otherwise false. - pub(crate) fn is_tracing() -> bool { - Self::with_current_collector(|maybe_collector| { - let collector = maybe_collector.take(); - let result = collector.is_some(); - maybe_collector.set(collector); - result - }) - } } impl Trace { @@ -278,8 +268,22 @@ drop(task); } - // precondition: We have drained the tasks from the injection queue. - trace_owned(owned) + // notify each task + let mut tasks = vec![]; + owned.for_each(|task| { + // set the notified bit + task.as_raw().state().transition_to_notified_for_tracing(); + // store the raw tasks into a vec + tasks.push(task.as_raw()); + }); + + tasks + .into_iter() + .map(|task| { + let ((), trace) = Trace::capture(|| task.poll()); + trace + }) + .collect() } cfg_rt_multi_thread! { @@ -312,34 +316,21 @@ drop(synced); - // precondition: we have drained the tasks from the local and injection - // queues. - trace_owned(owned) - } -} - -/// Trace the `OwnedTasks`. -/// -/// # Preconditions -/// -/// This helper presumes exclusive access to each task. The tasks must not exist -/// in any other queue. -fn trace_owned(owned: &OwnedTasks) -> Vec { - // notify each task - let mut tasks = vec![]; - owned.for_each(|task| { - // notify the task (and thus make it poll-able) and stash it - tasks.push(task.notify_for_tracing()); - // we do not poll it here since we hold a lock on `owned` and the task - // may complete and need to remove itself from `owned`. - }); + // notify each task + let mut traces = vec![]; + owned.for_each(|task| { + // set the notified bit + task.as_raw().state().transition_to_notified_for_tracing(); + + // trace the task + let ((), trace) = Trace::capture(|| task.as_raw().poll()); + traces.push(trace); + + // reschedule the task + let _ = task.as_raw().state().transition_to_notified_by_ref(); + task.as_raw().schedule(); + }); - tasks - .into_iter() - .map(|task| { - let local_notified = owned.assert_owner(task); - let ((), trace) = Trace::capture(|| local_notified.run()); - trace - }) - .collect() + traces + } } diff -Nru temporalio-1.3.0/vendor/tokio/src/sync/batch_semaphore.rs temporalio-1.3.0/vendor/tokio/src/sync/batch_semaphore.rs --- temporalio-1.3.0/vendor/tokio/src/sync/batch_semaphore.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio/src/sync/batch_semaphore.rs 2023-10-30 19:40:00.000000000 +0000 @@ -28,6 +28,7 @@ use std::pin::Pin; use std::ptr::NonNull; use std::sync::atomic::Ordering::*; +use std::task::Poll::*; use std::task::{Context, Poll, Waker}; use std::{cmp, fmt}; @@ -205,20 +206,6 @@ } } - /// Creates a new closed semaphore with 0 permits. - #[cfg(not(all(loom, test)))] - pub(crate) const fn const_new_closed() -> Self { - Self { - permits: AtomicUsize::new(Self::CLOSED), - waiters: Mutex::const_new(Waitlist { - queue: LinkedList::new(), - closed: true, - }), - #[cfg(all(tokio_unstable, feature = "tracing"))] - resource_span: tracing::Span::none(), - } - } - /// Returns the current number of available permits. pub(crate) fn available_permits(&self) -> usize { self.permits.load(Acquire) >> Self::PERMIT_SHIFT @@ -390,7 +377,7 @@ let mut waiters = loop { // Has the semaphore closed? if curr & Self::CLOSED > 0 { - return Poll::Ready(Err(AcquireError::closed())); + return Ready(Err(AcquireError::closed())); } let mut remaining = 0; @@ -435,7 +422,7 @@ ) }); - return Poll::Ready(Ok(())); + return Ready(Ok(())); } else if lock.is_none() { break self.waiters.lock(); } @@ -447,7 +434,7 @@ }; if waiters.closed { - return Poll::Ready(Err(AcquireError::closed())); + return Ready(Err(AcquireError::closed())); } #[cfg(all(tokio_unstable, feature = "tracing"))] @@ -461,7 +448,7 @@ if node.assign_permits(&mut acquired) { self.add_permits_locked(acquired, waiters); - return Poll::Ready(Ok(())); + return Ready(Ok(())); } assert_eq!(acquired, 0); @@ -493,7 +480,7 @@ drop(waiters); drop(old_waker); - Poll::Pending + Pending } } @@ -571,15 +558,15 @@ let coop = ready!(crate::runtime::coop::poll_proceed(cx)); let result = match semaphore.poll_acquire(cx, needed, node, *queued) { - Poll::Pending => { + Pending => { *queued = true; - Poll::Pending + Pending } - Poll::Ready(r) => { + Ready(r) => { coop.made_progress(); r?; *queued = false; - Poll::Ready(Ok(())) + Ready(Ok(())) } }; diff -Nru temporalio-1.3.0/vendor/tokio/src/sync/broadcast.rs temporalio-1.3.0/vendor/tokio/src/sync/broadcast.rs --- temporalio-1.3.0/vendor/tokio/src/sync/broadcast.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio/src/sync/broadcast.rs 2023-10-30 19:40:00.000000000 +0000 @@ -407,8 +407,6 @@ /// Create a bounded, multi-producer, multi-consumer channel where each sent /// value is broadcasted to all active receivers. /// -/// **Note:** The actual capacity may be greater than the provided `capacity`. -/// /// All data sent on [`Sender`] will become available on every active /// [`Receiver`] in the same order as it was sent. /// @@ -476,7 +474,7 @@ impl Sender { /// Creates the sending-half of the [`broadcast`] channel. /// - /// See the documentation of [`broadcast::channel`] for more information on this method. + /// See documentation of [`broadcast::channel`] for errors when calling this function. /// /// [`broadcast`]: crate::sync::broadcast /// [`broadcast::channel`]: crate::sync::broadcast @@ -1325,7 +1323,6 @@ /// let _ = tx.send(10); /// sync_code.join().unwrap(); /// } - /// ``` pub fn blocking_recv(&mut self) -> Result { crate::future::block_on(self.recv()) } diff -Nru temporalio-1.3.0/vendor/tokio/src/sync/mod.rs temporalio-1.3.0/vendor/tokio/src/sync/mod.rs --- temporalio-1.3.0/vendor/tokio/src/sync/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio/src/sync/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -85,6 +85,7 @@ //! } //! ``` //! +//! [oneshot]: oneshot //! [`JoinHandle`]: crate::task::JoinHandle //! //! ## `mpsc` channel @@ -174,11 +175,11 @@ //! } //! ``` //! -//! The [`mpsc`] and [`oneshot`] channels can be combined to provide a request / -//! response type synchronization pattern with a shared resource. A task is -//! spawned to synchronize a resource and waits on commands received on a -//! [`mpsc`] channel. Each command includes a [`oneshot`] `Sender` on which the -//! result of the command is sent. +//! The [`mpsc`][mpsc] and [`oneshot`][oneshot] channels can be combined to +//! provide a request / response type synchronization pattern with a shared +//! resource. A task is spawned to synchronize a resource and waits on commands +//! received on a [`mpsc`][mpsc] channel. Each command includes a +//! [`oneshot`][oneshot] `Sender` on which the result of the command is sent. //! //! **Example:** use a task to synchronize a `u64` counter. Each task sends an //! "fetch and increment" command. The counter value **before** the increment is @@ -235,6 +236,8 @@ //! } //! ``` //! +//! [mpsc]: mpsc +//! //! ## `broadcast` channel //! //! The [`broadcast` channel] supports sending **many** values from @@ -380,7 +383,7 @@ //! sleep.set(time::sleep_until(op_start + conf.timeout)); //! } //! _ = rx.changed() => { -//! conf = rx.borrow_and_update().clone(); +//! conf = rx.borrow().clone(); //! //! // The configuration has been updated. Update the //! // `sleep` using the new `timeout` value. @@ -413,24 +416,24 @@ //! operate in a similar way as their `std` counterparts but will wait //! asynchronously instead of blocking the thread. //! -//! * [`Barrier`] Ensures multiple tasks will wait for each other to reach a -//! point in the program, before continuing execution all together. +//! * [`Barrier`](Barrier) Ensures multiple tasks will wait for each other to +//! reach a point in the program, before continuing execution all together. //! -//! * [`Mutex`] Mutual Exclusion mechanism, which ensures that at most one -//! thread at a time is able to access some data. +//! * [`Mutex`](Mutex) Mutual Exclusion mechanism, which ensures that at most +//! one thread at a time is able to access some data. //! -//! * [`Notify`] Basic task notification. `Notify` supports notifying a +//! * [`Notify`](Notify) Basic task notification. `Notify` supports notifying a //! receiving task without sending data. In this case, the task wakes up and //! resumes processing. //! -//! * [`RwLock`] Provides a mutual exclusion mechanism which allows multiple -//! readers at the same time, while allowing only one writer at a time. In -//! some cases, this can be more efficient than a mutex. -//! -//! * [`Semaphore`] Limits the amount of concurrency. A semaphore holds a -//! number of permits, which tasks may request in order to enter a critical -//! section. Semaphores are useful for implementing limiting or bounding of -//! any kind. +//! * [`RwLock`](RwLock) Provides a mutual exclusion mechanism which allows +//! multiple readers at the same time, while allowing only one writer at a +//! time. In some cases, this can be more efficient than a mutex. +//! +//! * [`Semaphore`](Semaphore) Limits the amount of concurrency. A semaphore +//! holds a number of permits, which tasks may request in order to enter a +//! critical section. Semaphores are useful for implementing limiting or +//! bounding of any kind. cfg_sync! { /// Named future types. diff -Nru temporalio-1.3.0/vendor/tokio/src/sync/mpsc/bounded.rs temporalio-1.3.0/vendor/tokio/src/sync/mpsc/bounded.rs --- temporalio-1.3.0/vendor/tokio/src/sync/mpsc/bounded.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio/src/sync/mpsc/bounded.rs 2023-10-30 19:40:00.000000000 +0000 @@ -439,11 +439,7 @@ /// /// If `send` is used as the event in a [`tokio::select!`](crate::select) /// statement and some other branch completes first, then it is guaranteed - /// that the message was not sent. **However, in that case, the message - /// is dropped and will be lost.** - /// - /// To avoid losing messages, use [`reserve`](Self::reserve) to reserve - /// capacity, then use the returned [`Permit`] to send the message. + /// that the message was not sent. /// /// This channel uses a queue to ensure that calls to `send` and `reserve` /// complete in the order they were requested. Cancelling a call to diff -Nru temporalio-1.3.0/vendor/tokio/src/sync/mpsc/chan.rs temporalio-1.3.0/vendor/tokio/src/sync/mpsc/chan.rs --- temporalio-1.3.0/vendor/tokio/src/sync/mpsc/chan.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio/src/sync/mpsc/chan.rs 2023-10-30 19:40:00.000000000 +0000 @@ -241,7 +241,7 @@ /// Receive the next value pub(crate) fn recv(&mut self, cx: &mut Context<'_>) -> Poll> { - use super::block::Read; + use super::block::Read::*; ready!(crate::trace::trace_leaf(cx)); @@ -254,12 +254,12 @@ macro_rules! try_recv { () => { match rx_fields.list.pop(&self.inner.tx) { - Some(Read::Value(value)) => { + Some(Value(value)) => { self.inner.semaphore.add_permit(); coop.made_progress(); return Ready(Some(value)); } - Some(Read::Closed) => { + Some(Closed) => { // TODO: This check may not be required as it most // likely can only return `true` at this point. A // channel is closed when all tx handles are diff -Nru temporalio-1.3.0/vendor/tokio/src/sync/mutex.rs temporalio-1.3.0/vendor/tokio/src/sync/mutex.rs --- temporalio-1.3.0/vendor/tokio/src/sync/mutex.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio/src/sync/mutex.rs 2023-10-30 19:40:00.000000000 +0000 @@ -103,7 +103,7 @@ /// threads. /// 2. Each spawned task obtains a lock and releases it on every iteration. /// 3. Mutation of the data protected by the Mutex is done by de-referencing -/// the obtained lock as seen on lines 13 and 20. +/// the obtained lock as seen on lines 12 and 19. /// /// Tokio's Mutex works in a simple FIFO (first in, first out) style where all /// calls to [`lock`] complete in the order they were performed. In that way the @@ -371,11 +371,6 @@ /// Creates a new lock in an unlocked state ready for use. /// - /// When using the `tracing` [unstable feature], a `Mutex` created with - /// `const_new` will not be instrumented. As such, it will not be visible - /// in [`tokio-console`]. Instead, [`Mutex::new`] should be used to create - /// an instrumented object if that is needed. - /// /// # Examples /// /// ``` @@ -383,9 +378,6 @@ /// /// static LOCK: Mutex = Mutex::const_new(5); /// ``` - /// - /// [`tokio-console`]: https://github.com/tokio-rs/console - /// [unstable feature]: crate#unstable-features #[cfg(not(all(loom, test)))] pub const fn const_new(t: T) -> Self where @@ -854,7 +846,6 @@ #[inline] pub fn map(mut this: Self, f: F) -> MappedMutexGuard<'a, U> where - U: ?Sized, F: FnOnce(&mut T) -> &mut U, { let data = f(&mut *this) as *mut U; @@ -903,7 +894,6 @@ #[inline] pub fn try_map(mut this: Self, f: F) -> Result, Self> where - U: ?Sized, F: FnOnce(&mut T) -> Option<&mut U>, { let data = match f(&mut *this) { @@ -1036,7 +1026,6 @@ #[inline] pub fn map(mut this: Self, f: F) -> OwnedMappedMutexGuard where - U: ?Sized, F: FnOnce(&mut T) -> &mut U, { let data = f(&mut *this) as *mut U; @@ -1085,7 +1074,6 @@ #[inline] pub fn try_map(mut this: Self, f: F) -> Result, Self> where - U: ?Sized, F: FnOnce(&mut T) -> Option<&mut U>, { let data = match f(&mut *this) { diff -Nru temporalio-1.3.0/vendor/tokio/src/sync/notify.rs temporalio-1.3.0/vendor/tokio/src/sync/notify.rs --- temporalio-1.3.0/vendor/tokio/src/sync/notify.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio/src/sync/notify.rs 2023-10-30 19:40:00.000000000 +0000 @@ -436,11 +436,6 @@ /// Create a new `Notify`, initialized without a permit. /// - /// When using the `tracing` [unstable feature], a `Notify` created with - /// `const_new` will not be instrumented. As such, it will not be visible - /// in [`tokio-console`]. Instead, [`Notify::new`] should be used to create - /// an instrumented object if that is needed. - /// /// # Examples /// /// ``` @@ -448,9 +443,6 @@ /// /// static NOTIFY: Notify = Notify::const_new(); /// ``` - /// - /// [`tokio-console`]: https://github.com/tokio-rs/console - /// [unstable feature]: crate#unstable-features #[cfg(not(all(loom, test)))] pub const fn const_new() -> Notify { Notify { @@ -888,11 +880,13 @@ } fn poll_notified(self: Pin<&mut Self>, waker: Option<&Waker>) -> Poll<()> { + use State::*; + let (notify, state, notify_waiters_calls, waiter) = self.project(); 'outer_loop: loop { match *state { - State::Init => { + Init => { let curr = notify.state.load(SeqCst); // Optimistically try acquiring a pending notification @@ -905,7 +899,7 @@ if res.is_ok() { // Acquired the notification - *state = State::Done; + *state = Done; continue 'outer_loop; } @@ -923,7 +917,7 @@ // if notify_waiters has been called after the future // was created, then we are done if get_num_notify_waiters_calls(curr) != *notify_waiters_calls { - *state = State::Done; + *state = Done; continue 'outer_loop; } @@ -959,7 +953,7 @@ match res { Ok(_) => { // Acquired the notification - *state = State::Done; + *state = Done; continue 'outer_loop; } Err(actual) => { @@ -987,14 +981,14 @@ // Insert the waiter into the linked list waiters.push_front(NonNull::from(waiter)); - *state = State::Waiting; + *state = Waiting; drop(waiters); drop(old_waker); return Poll::Pending; } - State::Waiting => { + Waiting => { #[cfg(tokio_taskdump)] if let Some(waker) = waker { let mut ctx = Context::from_waker(waker); @@ -1007,7 +1001,7 @@ drop(unsafe { waiter.waker.with_mut(|waker| (*waker).take()) }); waiter.notification.clear(); - *state = State::Done; + *state = Done; return Poll::Ready(()); } @@ -1032,7 +1026,7 @@ drop(waiters); drop(old_waker); - *state = State::Done; + *state = Done; return Poll::Ready(()); } @@ -1054,7 +1048,7 @@ // The list is used in `notify_waiters`, so it must be guarded. unsafe { waiters.remove(NonNull::from(waiter)) }; - *state = State::Done; + *state = Done; } else { // Safety: we hold the lock, so we can modify the waker. unsafe { @@ -1088,7 +1082,7 @@ // Drop the old waker after releasing the lock. drop(old_waker); } - State::Done => { + Done => { #[cfg(tokio_taskdump)] if let Some(waker) = waker { let mut ctx = Context::from_waker(waker); @@ -1111,13 +1105,15 @@ impl Drop for Notified<'_> { fn drop(&mut self) { + use State::*; + // Safety: The type only transitions to a "Waiting" state when pinned. let (notify, state, _, waiter) = unsafe { Pin::new_unchecked(self).project() }; // This is where we ensure safety. The `Notified` value is being // dropped, which means we must ensure that the waiter entry is no // longer stored in the linked list. - if matches!(*state, State::Waiting) { + if matches!(*state, Waiting) { let mut waiters = notify.waiters.lock(); let mut notify_state = notify.state.load(SeqCst); diff -Nru temporalio-1.3.0/vendor/tokio/src/sync/once_cell.rs temporalio-1.3.0/vendor/tokio/src/sync/once_cell.rs --- temporalio-1.3.0/vendor/tokio/src/sync/once_cell.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio/src/sync/once_cell.rs 2023-10-30 19:40:00.000000000 +0000 @@ -149,54 +149,11 @@ } } - /// Creates a new `OnceCell` that contains the provided value. - /// - /// # Example - /// - /// When using the `tracing` [unstable feature], a `OnceCell` created with - /// `const_new_with` will not be instrumented. As such, it will not be - /// visible in [`tokio-console`]. Instead, [`OnceCell::new_with`] should be - /// used to create an instrumented object if that is needed. - /// - /// ``` - /// use tokio::sync::OnceCell; - /// - /// static ONCE: OnceCell = OnceCell::const_new_with(1); - /// - /// async fn get_global_integer() -> &'static u32 { - /// ONCE.get_or_init(|| async { - /// 1 + 1 - /// }).await - /// } - /// - /// #[tokio::main] - /// async fn main() { - /// let result = get_global_integer().await; - /// assert_eq!(*result, 1); - /// } - /// ``` - /// - /// [`tokio-console`]: https://github.com/tokio-rs/console - /// [unstable feature]: crate#unstable-features - #[cfg(not(all(loom, test)))] - pub const fn const_new_with(value: T) -> Self { - OnceCell { - value_set: AtomicBool::new(true), - value: UnsafeCell::new(MaybeUninit::new(value)), - semaphore: Semaphore::const_new_closed(), - } - } - /// Creates a new empty `OnceCell` instance. /// /// Equivalent to `OnceCell::new`, except that it can be used in static /// variables. /// - /// When using the `tracing` [unstable feature], a `OnceCell` created with - /// `const_new` will not be instrumented. As such, it will not be visible - /// in [`tokio-console`]. Instead, [`OnceCell::new`] should be used to - /// create an instrumented object if that is needed. - /// /// # Example /// /// ``` @@ -216,9 +173,6 @@ /// assert_eq!(*result, 2); /// } /// ``` - /// - /// [`tokio-console`]: https://github.com/tokio-rs/console - /// [unstable feature]: crate#unstable-features #[cfg(not(all(loom, test)))] pub const fn const_new() -> Self { OnceCell { diff -Nru temporalio-1.3.0/vendor/tokio/src/sync/rwlock.rs temporalio-1.3.0/vendor/tokio/src/sync/rwlock.rs --- temporalio-1.3.0/vendor/tokio/src/sync/rwlock.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio/src/sync/rwlock.rs 2023-10-30 19:40:00.000000000 +0000 @@ -327,11 +327,6 @@ /// Creates a new instance of an `RwLock` which is unlocked. /// - /// When using the `tracing` [unstable feature], a `RwLock` created with - /// `const_new` will not be instrumented. As such, it will not be visible - /// in [`tokio-console`]. Instead, [`RwLock::new`] should be used to create - /// an instrumented object if that is needed. - /// /// # Examples /// /// ``` @@ -339,9 +334,6 @@ /// /// static LOCK: RwLock = RwLock::const_new(5); /// ``` - /// - /// [`tokio-console`]: https://github.com/tokio-rs/console - /// [unstable feature]: crate#unstable-features #[cfg(not(all(loom, test)))] pub const fn const_new(value: T) -> RwLock where diff -Nru temporalio-1.3.0/vendor/tokio/src/sync/semaphore.rs temporalio-1.3.0/vendor/tokio/src/sync/semaphore.rs --- temporalio-1.3.0/vendor/tokio/src/sync/semaphore.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio/src/sync/semaphore.rs 2023-10-30 19:40:00.000000000 +0000 @@ -47,288 +47,28 @@ /// } /// ``` /// -/// ## Limit the number of simultaneously opened files in your program +/// Use [`Semaphore::acquire_owned`] to move permits across tasks: /// -/// Most operating systems have limits on the number of open file -/// handles. Even in systems without explicit limits, resource constraints -/// implicitly set an upper bound on the number of open files. If your -/// program attempts to open a large number of files and exceeds this -/// limit, it will result in an error. -/// -/// This example uses a Semaphore with 100 permits. By acquiring a permit from -/// the Semaphore before accessing a file, you ensure that your program opens -/// no more than 100 files at a time. When trying to open the 101st -/// file, the program will wait until a permit becomes available before -/// proceeding to open another file. -/// ``` -/// use std::io::Result; -/// use tokio::fs::File; -/// use tokio::sync::Semaphore; -/// use tokio::io::AsyncWriteExt; -/// -/// static PERMITS: Semaphore = Semaphore::const_new(100); -/// -/// async fn write_to_file(message: &[u8]) -> Result<()> { -/// let _permit = PERMITS.acquire().await.unwrap(); -/// let mut buffer = File::create("example.txt").await?; -/// buffer.write_all(message).await?; -/// Ok(()) // Permit goes out of scope here, and is available again for acquisition -/// } /// ``` -/// -/// ## Limit the number of incoming requests being handled at the same time -/// -/// Similar to limiting the number of simultaneously opened files, network handles -/// are a limited resource. Allowing an unbounded amount of requests to be processed -/// could result in a denial-of-service, among many other issues. -/// -/// This example uses an `Arc` instead of a global variable. -/// To limit the number of requests that can be processed at the time, -/// we acquire a permit for each task before spawning it. Once acquired, -/// a new task is spawned; and once finished, the permit is dropped inside -/// of the task to allow others to spawn. Permits must be acquired via -/// [`Semaphore::acquire_owned`] to be movable across the task boundary. -/// (Since our semaphore is not a global variable — if it was, then `acquire` would be enough.) -/// -/// ```no_run /// use std::sync::Arc; /// use tokio::sync::Semaphore; -/// use tokio::net::TcpListener; /// /// #[tokio::main] -/// async fn main() -> std::io::Result<()> { +/// async fn main() { /// let semaphore = Arc::new(Semaphore::new(3)); -/// let listener = TcpListener::bind("127.0.0.1:8080").await?; +/// let mut join_handles = Vec::new(); /// -/// loop { -/// // Acquire permit before accepting the next socket. -/// // -/// // We use `acquire_owned` so that we can move `permit` into -/// // other tasks. +/// for _ in 0..5 { /// let permit = semaphore.clone().acquire_owned().await.unwrap(); -/// let (mut socket, _) = listener.accept().await?; -/// -/// tokio::spawn(async move { -/// // Do work using the socket. -/// handle_connection(&mut socket).await; -/// // Drop socket while the permit is still live. -/// drop(socket); -/// // Drop the permit, so more tasks can be created. +/// join_handles.push(tokio::spawn(async move { +/// // perform task... +/// // explicitly own `permit` in the task /// drop(permit); -/// }); +/// })); /// } -/// } -/// # async fn handle_connection(_socket: &mut tokio::net::TcpStream) { -/// # // Do work -/// # } -/// ``` -/// -/// ## Prevent tests from running in parallel -/// -/// By default, Rust runs tests in the same file in parallel. However, in some -/// cases, running two tests in parallel may lead to problems. For example, this -/// can happen when tests use the same database. -/// -/// Consider the following scenario: -/// 1. `test_insert`: Inserts a key-value pair into the database, then retrieves -/// the value using the same key to verify the insertion. -/// 2. `test_update`: Inserts a key, then updates the key to a new value and -/// verifies that the value has been accurately updated. -/// 3. `test_others`: A third test that doesn't modify the database state. It -/// can run in parallel with the other tests. -/// -/// In this example, `test_insert` and `test_update` need to run in sequence to -/// work, but it doesn't matter which test runs first. We can leverage a -/// semaphore with a single permit to address this challenge. -/// -/// ``` -/// # use tokio::sync::Mutex; -/// # use std::collections::BTreeMap; -/// # struct Database { -/// # map: Mutex>, -/// # } -/// # impl Database { -/// # pub const fn setup() -> Database { -/// # Database { -/// # map: Mutex::const_new(BTreeMap::new()), -/// # } -/// # } -/// # pub async fn insert(&self, key: &str, value: i32) { -/// # self.map.lock().await.insert(key.to_string(), value); -/// # } -/// # pub async fn update(&self, key: &str, value: i32) { -/// # self.map.lock().await -/// # .entry(key.to_string()) -/// # .and_modify(|origin| *origin = value); -/// # } -/// # pub async fn delete(&self, key: &str) { -/// # self.map.lock().await.remove(key); -/// # } -/// # pub async fn get(&self, key: &str) -> i32 { -/// # *self.map.lock().await.get(key).unwrap() -/// # } -/// # } -/// use tokio::sync::Semaphore; -/// -/// // Initialize a static semaphore with only one permit, which is used to -/// // prevent test_insert and test_update from running in parallel. -/// static PERMIT: Semaphore = Semaphore::const_new(1); -/// -/// // Initialize the database that will be used by the subsequent tests. -/// static DB: Database = Database::setup(); -/// -/// #[tokio::test] -/// # async fn fake_test_insert() {} -/// async fn test_insert() { -/// // Acquire permit before proceeding. Since the semaphore has only one permit, -/// // the test will wait if the permit is already acquired by other tests. -/// let permit = PERMIT.acquire().await.unwrap(); -/// -/// // Do the actual test stuff with database -/// -/// // Insert a key-value pair to database -/// let (key, value) = ("name", 0); -/// DB.insert(key, value).await; -/// -/// // Verify that the value has been inserted correctly. -/// assert_eq!(DB.get(key).await, value); -/// -/// // Undo the insertion, so the database is empty at the end of the test. -/// DB.delete(key).await; -/// -/// // Drop permit. This allows the other test to start running. -/// drop(permit); -/// } -/// -/// #[tokio::test] -/// # async fn fake_test_update() {} -/// async fn test_update() { -/// // Acquire permit before proceeding. Since the semaphore has only one permit, -/// // the test will wait if the permit is already acquired by other tests. -/// let permit = PERMIT.acquire().await.unwrap(); -/// -/// // Do the same insert. -/// let (key, value) = ("name", 0); -/// DB.insert(key, value).await; -/// -/// // Update the existing value with a new one. -/// let new_value = 1; -/// DB.update(key, new_value).await; -/// -/// // Verify that the value has been updated correctly. -/// assert_eq!(DB.get(key).await, new_value); -/// -/// // Undo any modificattion. -/// DB.delete(key).await; -/// -/// // Drop permit. This allows the other test to start running. -/// drop(permit); -/// } -/// -/// #[tokio::test] -/// # async fn fake_test_others() {} -/// async fn test_others() { -/// // This test can run in parallel with test_insert and test_update, -/// // so it does not use PERMIT. -/// } -/// # #[tokio::main(flavor = "current_thread")] -/// # async fn main() { -/// # test_insert().await; -/// # test_update().await; -/// # test_others().await; -/// # } -/// ``` /// -/// ## Rate limiting using a token bucket -/// -/// This example showcases the [`add_permits`] and [`SemaphorePermit::forget`] methods. -/// -/// Many applications and systems have constraints on the rate at which certain -/// operations should occur. Exceeding this rate can result in suboptimal -/// performance or even errors. -/// -/// This example implements rate limiting using a [token bucket]. A token bucket is a form of rate -/// limiting that doesn't kick in immediately, to allow for short bursts of incoming requests that -/// arrive at the same time. -/// -/// With a token bucket, each incoming request consumes a token, and the tokens are refilled at a -/// certain rate that defines the rate limit. When a burst of requests arrives, tokens are -/// immediately given out until the bucket is empty. Once the bucket is empty, requests will have to -/// wait for new tokens to be added. -/// -/// Unlike the example that limits how many requests can be handled at the same time, we do not add -/// tokens back when we finish handling a request. Instead, tokens are added only by a timer task. -/// -/// Note that this implementation is suboptimal when the duration is small, because it consumes a -/// lot of cpu constantly looping and sleeping. -/// -/// [token bucket]: https://en.wikipedia.org/wiki/Token_bucket -/// [`add_permits`]: crate::sync::Semaphore::add_permits -/// [`SemaphorePermit::forget`]: crate::sync::SemaphorePermit::forget -/// ``` -/// use std::sync::Arc; -/// use tokio::sync::Semaphore; -/// use tokio::time::{interval, Duration}; -/// -/// struct TokenBucket { -/// sem: Arc, -/// jh: tokio::task::JoinHandle<()>, -/// } -/// -/// impl TokenBucket { -/// fn new(duration: Duration, capacity: usize) -> Self { -/// let sem = Arc::new(Semaphore::new(capacity)); -/// -/// // refills the tokens at the end of each interval -/// let jh = tokio::spawn({ -/// let sem = sem.clone(); -/// let mut interval = interval(duration); -/// interval.set_missed_tick_behavior(tokio::time::MissedTickBehavior::Skip); -/// -/// async move { -/// loop { -/// interval.tick().await; -/// -/// if sem.available_permits() < capacity { -/// sem.add_permits(1); -/// } -/// } -/// } -/// }); -/// -/// Self { jh, sem } -/// } -/// -/// async fn acquire(&self) { -/// // This can return an error if the semaphore is closed, but we -/// // never close it, so this error can never happen. -/// let permit = self.sem.acquire().await.unwrap(); -/// // To avoid releasing the permit back to the semaphore, we use -/// // the `SemaphorePermit::forget` method. -/// permit.forget(); -/// } -/// } -/// -/// impl Drop for TokenBucket { -/// fn drop(&mut self) { -/// // Kill the background task so it stops taking up resources when we -/// // don't need it anymore. -/// self.jh.abort(); -/// } -/// } -/// -/// #[tokio::main] -/// # async fn _hidden() {} -/// # #[tokio::main(flavor = "current_thread", start_paused = true)] -/// async fn main() { -/// let capacity = 5; -/// let update_interval = Duration::from_secs_f32(1.0 / capacity as f32); -/// let bucket = TokenBucket::new(update_interval, capacity); -/// -/// for _ in 0..5 { -/// bucket.acquire().await; -/// -/// // do the operation +/// for handle in join_handles { +/// handle.await.unwrap(); /// } /// } /// ``` @@ -425,11 +165,6 @@ /// Creates a new semaphore with the initial number of permits. /// - /// When using the `tracing` [unstable feature], a `Semaphore` created with - /// `const_new` will not be instrumented. As such, it will not be visible - /// in [`tokio-console`]. Instead, [`Semaphore::new`] should be used to - /// create an instrumented object if that is needed. - /// /// # Examples /// /// ``` @@ -437,9 +172,6 @@ /// /// static SEM: Semaphore = Semaphore::const_new(10); /// ``` - /// - /// [`tokio-console`]: https://github.com/tokio-rs/console - /// [unstable feature]: crate#unstable-features #[cfg(not(all(loom, test)))] pub const fn const_new(permits: usize) -> Self { Self { @@ -456,16 +188,6 @@ #[cfg(all(tokio_unstable, feature = "tracing"))] resource_span: tracing::Span::none(), } - } - - /// Creates a new closed semaphore with 0 permits. - #[cfg(not(all(loom, test)))] - pub(crate) const fn const_new_closed() -> Self { - Self { - ll_sem: ll::Semaphore::const_new_closed(), - #[cfg(all(tokio_unstable, feature = "tracing"))] - resource_span: tracing::Span::none(), - } } /// Returns the current number of available permits. diff -Nru temporalio-1.3.0/vendor/tokio/src/sync/tests/loom_list.rs temporalio-1.3.0/vendor/tokio/src/sync/tests/loom_list.rs --- temporalio-1.3.0/vendor/tokio/src/sync/tests/loom_list.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio/src/sync/tests/loom_list.rs 2023-10-30 19:40:00.000000000 +0000 @@ -5,7 +5,7 @@ #[test] fn smoke() { - use crate::sync::mpsc::block::Read; + use crate::sync::mpsc::block::Read::*; const NUM_TX: usize = 2; const NUM_MSG: usize = 2; @@ -28,7 +28,7 @@ loop { match rx.pop(&tx) { - Some(Read::Value((th, v))) => { + Some(Value((th, v))) => { assert_eq!(v, next[th]); next[th] += 1; @@ -36,7 +36,7 @@ break; } } - Some(Read::Closed) => { + Some(Closed) => { panic!(); } None => { diff -Nru temporalio-1.3.0/vendor/tokio/src/sync/watch.rs temporalio-1.3.0/vendor/tokio/src/sync/watch.rs --- temporalio-1.3.0/vendor/tokio/src/sync/watch.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio/src/sync/watch.rs 2023-10-30 19:40:00.000000000 +0000 @@ -10,75 +10,24 @@ //! //! [`channel`] returns a [`Sender`] / [`Receiver`] pair. These are the producer //! and consumer halves of the channel. The channel is created with an initial -//! value. -//! -//! Each [`Receiver`] independently tracks the last value *seen* by its caller. -//! -//! To access the **current** value stored in the channel and mark it as *seen* -//! by a given [`Receiver`], use [`Receiver::borrow_and_update()`]. -//! -//! To access the current value **without** marking it as *seen*, use -//! [`Receiver::borrow()`]. (If the value has already been marked *seen*, -//! [`Receiver::borrow()`] is equivalent to [`Receiver::borrow_and_update()`].) -//! -//! For more information on when to use these methods, see -//! [here](#borrow_and_update-versus-borrow). -//! -//! ## Change notifications -//! -//! The [`Receiver`] half provides an asynchronous [`changed`] method. This -//! method is ready when a new, *unseen* value is sent via the [`Sender`] half. -//! -//! * [`Receiver::changed()`] returns `Ok(())` on receiving a new value, or -//! `Err(`[`error::RecvError`]`)` if the [`Sender`] has been dropped. -//! * If the current value is *unseen* when calling [`changed`], then -//! [`changed`] will return immediately. If the current value is *seen*, then -//! it will sleep until either a new message is sent via the [`Sender`] half, -//! or the [`Sender`] is dropped. -//! * On completion, the [`changed`] method marks the new value as *seen*. -//! * At creation, the initial value is considered *seen*. In other words, -//! [`Receiver::changed()`] will not return until a subsequent value is sent. -//! * New [`Receiver`] instances can be created with [`Sender::subscribe()`]. -//! The current value at the time the [`Receiver`] is created is considered -//! *seen*. -//! -//! ## `borrow_and_update` versus `borrow` -//! -//! If the receiver intends to await notifications from [`changed`] in a loop, -//! [`Receiver::borrow_and_update()`] should be preferred over -//! [`Receiver::borrow()`]. This avoids a potential race where a new value is -//! sent between [`changed`] being ready and the value being read. (If -//! [`Receiver::borrow()`] is used, the loop may run twice with the same value.) -//! -//! If the receiver is only interested in the current value, and does not intend -//! to wait for changes, then [`Receiver::borrow()`] can be used. It may be more -//! convenient to use [`borrow`](Receiver::borrow) since it's an `&self` -//! method---[`borrow_and_update`](Receiver::borrow_and_update) requires `&mut -//! self`. +//! value. The **latest** value stored in the channel is accessed with +//! [`Receiver::borrow()`]. Awaiting [`Receiver::changed()`] waits for a new +//! value to be sent by the [`Sender`] half. //! //! # Examples //! -//! The following example prints `hello! world! `. -//! //! ``` //! use tokio::sync::watch; -//! use tokio::time::{Duration, sleep}; //! //! # async fn dox() -> Result<(), Box> { //! let (tx, mut rx) = watch::channel("hello"); //! //! tokio::spawn(async move { -//! // Use the equivalent of a "do-while" loop so the initial value is -//! // processed before awaiting the `changed()` future. -//! loop { -//! println!("{}! ", *rx.borrow_and_update()); -//! if rx.changed().await.is_err() { -//! break; -//! } +//! while rx.changed().await.is_ok() { +//! println!("received = {:?}", *rx.borrow()); //! } //! }); //! -//! sleep(Duration::from_millis(100)).await; //! tx.send("world")?; //! # Ok(()) //! # } @@ -90,8 +39,8 @@ //! when all [`Receiver`] handles have been dropped. This indicates that there //! is no further interest in the values being produced and work can be stopped. //! -//! The value in the channel will not be dropped until the sender and all -//! receivers have been dropped. +//! The value in the channel will not be dropped until the sender and all receivers +//! have been dropped. //! //! # Thread safety //! @@ -101,15 +50,11 @@ //! //! [`Sender`]: crate::sync::watch::Sender //! [`Receiver`]: crate::sync::watch::Receiver -//! [`changed`]: crate::sync::watch::Receiver::changed //! [`Receiver::changed()`]: crate::sync::watch::Receiver::changed //! [`Receiver::borrow()`]: crate::sync::watch::Receiver::borrow -//! [`Receiver::borrow_and_update()`]: -//! crate::sync::watch::Receiver::borrow_and_update //! [`channel`]: crate::sync::watch::channel //! [`Sender::is_closed`]: crate::sync::watch::Sender::is_closed //! [`Sender::closed`]: crate::sync::watch::Sender::closed -//! [`Sender::subscribe()`]: crate::sync::watch::Sender::subscribe use crate::sync::notify::Notify; @@ -357,12 +302,9 @@ use self::state::{AtomicState, Version}; mod state { use crate::loom::sync::atomic::AtomicUsize; - use crate::loom::sync::atomic::Ordering; - - const CLOSED_BIT: usize = 1; + use crate::loom::sync::atomic::Ordering::SeqCst; - // Using 2 as the step size preserves the `CLOSED_BIT`. - const STEP_SIZE: usize = 2; + const CLOSED: usize = 1; /// The version part of the state. The lowest bit is always zero. #[derive(Copy, Clone, Debug, Eq, PartialEq)] @@ -377,69 +319,49 @@ pub(super) struct StateSnapshot(usize); /// The state stored in an atomic integer. - /// - /// The `Sender` uses `Release` ordering for storing a new state - /// and the `Receiver`s use `Acquire` ordering for loading the - /// current state. This ensures that written values are seen by - /// the `Receiver`s for a proper handover. #[derive(Debug)] pub(super) struct AtomicState(AtomicUsize); impl Version { - /// Decrements the version. - pub(super) fn decrement(&mut self) { - // Using a wrapping decrement here is required to ensure that the - // operation is consistent with `std::sync::atomic::AtomicUsize::fetch_add()` - // which wraps on overflow. - self.0 = self.0.wrapping_sub(STEP_SIZE); + /// Get the initial version when creating the channel. + pub(super) fn initial() -> Self { + Version(0) } - - pub(super) const INITIAL: Self = Version(0); } impl StateSnapshot { /// Extract the version from the state. pub(super) fn version(self) -> Version { - Version(self.0 & !CLOSED_BIT) + Version(self.0 & !CLOSED) } /// Is the closed bit set? pub(super) fn is_closed(self) -> bool { - (self.0 & CLOSED_BIT) == CLOSED_BIT + (self.0 & CLOSED) == CLOSED } } impl AtomicState { /// Create a new `AtomicState` that is not closed and which has the - /// version set to `Version::INITIAL`. + /// version set to `Version::initial()`. pub(super) fn new() -> Self { - AtomicState(AtomicUsize::new(Version::INITIAL.0)) + AtomicState(AtomicUsize::new(0)) } /// Load the current value of the state. - /// - /// Only used by the receiver and for debugging purposes. - /// - /// The receiver side (read-only) uses `Acquire` ordering for a proper handover - /// of the shared value with the sender side (single writer). The state is always - /// updated after modifying and before releasing the (exclusive) lock on the - /// shared value. pub(super) fn load(&self) -> StateSnapshot { - StateSnapshot(self.0.load(Ordering::Acquire)) + StateSnapshot(self.0.load(SeqCst)) } /// Increment the version counter. - pub(super) fn increment_version_while_locked(&self) { - // Use `Release` ordering to ensure that the shared value - // has been written before updating the version. The shared - // value is still protected by an exclusive lock during this - // method. - self.0.fetch_add(STEP_SIZE, Ordering::Release); + pub(super) fn increment_version(&self) { + // Increment by two to avoid touching the CLOSED bit. + self.0.fetch_add(2, SeqCst); } /// Set the closed bit in the state. pub(super) fn set_closed(&self) { - self.0.fetch_or(CLOSED_BIT, Ordering::Release); + self.0.fetch_or(CLOSED, SeqCst); } } } @@ -452,28 +374,19 @@ /// /// # Examples /// -/// The following example prints `hello! world! `. -/// /// ``` /// use tokio::sync::watch; -/// use tokio::time::{Duration, sleep}; /// /// # async fn dox() -> Result<(), Box> { -/// let (tx, mut rx) = watch::channel("hello"); +/// let (tx, mut rx) = watch::channel("hello"); /// -/// tokio::spawn(async move { -/// // Use the equivalent of a "do-while" loop so the initial value is -/// // processed before awaiting the `changed()` future. -/// loop { -/// println!("{}! ", *rx.borrow_and_update()); -/// if rx.changed().await.is_err() { -/// break; +/// tokio::spawn(async move { +/// while rx.changed().await.is_ok() { +/// println!("received = {:?}", *rx.borrow()); /// } -/// } -/// }); +/// }); /// -/// sleep(Duration::from_millis(100)).await; -/// tx.send("world")?; +/// tx.send("world")?; /// # Ok(()) /// # } /// ``` @@ -495,7 +408,7 @@ let rx = Receiver { shared, - version: Version::INITIAL, + version: Version::initial(), }; (tx, rx) @@ -540,11 +453,7 @@ /// ``` /// /// - /// For more information on when to use this method versus - /// [`borrow_and_update`], see [here](self#borrow_and_update-versus-borrow). - /// /// [`changed`]: Receiver::changed - /// [`borrow_and_update`]: Receiver::borrow_and_update /// /// # Examples /// @@ -596,11 +505,7 @@ /// ``` /// /// - /// For more information on when to use this method versus [`borrow`], see - /// [here](self#borrow_and_update-versus-borrow). - /// /// [`changed`]: Receiver::changed - /// [`borrow`]: Receiver::borrow pub fn borrow_and_update(&mut self) -> Ref<'_, T> { let inner = self.shared.value.read().unwrap(); @@ -657,18 +562,6 @@ Ok(self.version != new_version) } - /// Marks the state as changed. - /// - /// After invoking this method [`has_changed()`](Self::has_changed) - /// returns `true` and [`changed()`](Self::changed) returns - /// immediately, regardless of whether a new value has been sent. - /// - /// This is useful for triggering an initial change notification after - /// subscribing to synchronize new receivers. - pub fn mark_changed(&mut self) { - self.version.decrement(); - } - /// Waits for a change notification, then marks the newest value as seen. /// /// If the newest value in the channel has not yet been marked seen when @@ -679,9 +572,6 @@ /// /// This method returns an error if and only if the [`Sender`] is dropped. /// - /// For more information, see - /// [*Change notifications*](self#change-notifications) in the module-level documentation. - /// /// # Cancel safety /// /// This method is cancel safe. If you use it as the event in a @@ -705,7 +595,7 @@ /// }); /// /// assert!(rx.changed().await.is_ok()); - /// assert_eq!(*rx.borrow_and_update(), "goodbye"); + /// assert_eq!(*rx.borrow(), "goodbye"); /// /// // The `tx` handle has been dropped /// assert!(rx.changed().await.is_err()); @@ -715,7 +605,7 @@ changed_impl(&self.shared, &mut self.version).await } - /// Waits for a value that satisfies the provided condition. + /// Waits for a value that satisifes the provided condition. /// /// This method will call the provided closure whenever something is sent on /// the channel. Once the closure returns `true`, this method will return a @@ -788,23 +678,8 @@ let has_changed = self.version != new_version; self.version = new_version; - if !closed || has_changed { - let result = panic::catch_unwind(panic::AssertUnwindSafe(|| f(&inner))); - match result { - Ok(true) => { - return Ok(Ref { inner, has_changed }); - } - Ok(false) => { - // Skip the value. - } - Err(panicked) => { - // Drop the read-lock to avoid poisoning it. - drop(inner); - // Forward the panic to the caller. - panic::resume_unwind(panicked); - // Unreachable - } - }; + if (!closed || has_changed) && f(&inner) { + return Ok(Ref { inner, has_changed }); } } @@ -855,7 +730,7 @@ } if state.is_closed() { - // The sender has been dropped. + // All receivers have dropped. return Some(Err(error::RecvError(()))); } @@ -904,27 +779,6 @@ } impl Sender { - /// Creates the sending-half of the [`watch`] channel. - /// - /// See documentation of [`watch::channel`] for errors when calling this function. - /// Beware that attempting to send a value when there are no receivers will - /// return an error. - /// - /// [`watch`]: crate::sync::watch - /// [`watch::channel`]: crate::sync::watch - /// - /// # Examples - /// ``` - /// let sender = tokio::sync::watch::Sender::new(0u8); - /// assert!(sender.send(3).is_err()); - /// let _rec = sender.subscribe(); - /// assert!(sender.send(4).is_ok()); - /// ``` - pub fn new(init: T) -> Self { - let (tx, _) = channel(init); - tx - } - /// Sends a new value via the channel, notifying all receivers. /// /// This method fails if the channel is closed, which is the case when @@ -1077,7 +931,7 @@ } }; - self.shared.state.increment_version_while_locked(); + self.shared.state.increment_version(); // Release the write lock. // diff -Nru temporalio-1.3.0/vendor/tokio/src/task/local.rs temporalio-1.3.0/vendor/tokio/src/task/local.rs --- temporalio-1.3.0/vendor/tokio/src/task/local.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio/src/task/local.rs 2023-10-30 19:40:00.000000000 +0000 @@ -575,7 +575,6 @@ run_until.await } - #[track_caller] pub(in crate::task) fn spawn_named( &self, future: F, diff -Nru temporalio-1.3.0/vendor/tokio/src/task/spawn.rs temporalio-1.3.0/vendor/tokio/src/task/spawn.rs --- temporalio-1.3.0/vendor/tokio/src/task/spawn.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio/src/task/spawn.rs 2023-10-30 19:40:00.000000000 +0000 @@ -161,14 +161,14 @@ /// error[E0391]: cycle detected when processing `main` /// ``` #[track_caller] - pub fn spawn(future: F) -> JoinHandle + pub fn spawn(future: T) -> JoinHandle where - F: Future + Send + 'static, - F::Output: Send + 'static, + T: Future + Send + 'static, + T::Output: Send + 'static, { // preventing stack overflows on debug mode, by quickly sending the // task to the heap. - if cfg!(debug_assertions) && std::mem::size_of::() > 2048 { + if cfg!(debug_assertions) && std::mem::size_of::() > 2048 { spawn_inner(Box::pin(future), None) } else { spawn_inner(future, None) diff -Nru temporalio-1.3.0/vendor/tokio/src/time/error.rs temporalio-1.3.0/vendor/tokio/src/time/error.rs --- temporalio-1.3.0/vendor/tokio/src/time/error.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio/src/time/error.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,5 +1,6 @@ //! Time error types. +use self::Kind::*; use std::error; use std::fmt; @@ -56,7 +57,7 @@ impl Error { /// Creates an error representing a shutdown timer. pub fn shutdown() -> Error { - Error(Kind::Shutdown) + Error(Shutdown) } /// Returns `true` if the error was caused by the timer being shutdown. @@ -66,7 +67,7 @@ /// Creates an error representing a timer at capacity. pub fn at_capacity() -> Error { - Error(Kind::AtCapacity) + Error(AtCapacity) } /// Returns `true` if the error was caused by the timer being at capacity. @@ -76,7 +77,7 @@ /// Creates an error representing a misconfigured timer. pub fn invalid() -> Error { - Error(Kind::Invalid) + Error(Invalid) } /// Returns `true` if the error was caused by the timer being misconfigured. @@ -89,12 +90,11 @@ impl fmt::Display for Error { fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { + use self::Kind::*; let descr = match self.0 { - Kind::Shutdown => { - "the timer is shutdown, must be called from the context of Tokio runtime" - } - Kind::AtCapacity => "timer is at capacity and cannot create a new entry", - Kind::Invalid => "timer duration exceeds maximum duration", + Shutdown => "the timer is shutdown, must be called from the context of Tokio runtime", + AtCapacity => "timer is at capacity and cannot create a new entry", + Invalid => "timer duration exceeds maximum duration", }; write!(fmt, "{}", descr) } diff -Nru temporalio-1.3.0/vendor/tokio/src/util/cacheline.rs temporalio-1.3.0/vendor/tokio/src/util/cacheline.rs --- temporalio-1.3.0/vendor/tokio/src/util/cacheline.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio/src/util/cacheline.rs 2023-10-30 19:40:00.000000000 +0000 @@ -27,15 +27,21 @@ ), repr(align(128)) )] -// arm, mips and mips64 have 32-byte cache line size. +// arm, mips, mips64, and riscv64 have 32-byte cache line size. // // Sources: // - https://github.com/golang/go/blob/3dd58676054223962cd915bb0934d1f9f489d4d2/src/internal/cpu/cpu_arm.go#L7 // - https://github.com/golang/go/blob/3dd58676054223962cd915bb0934d1f9f489d4d2/src/internal/cpu/cpu_mips.go#L7 // - https://github.com/golang/go/blob/3dd58676054223962cd915bb0934d1f9f489d4d2/src/internal/cpu/cpu_mipsle.go#L7 // - https://github.com/golang/go/blob/3dd58676054223962cd915bb0934d1f9f489d4d2/src/internal/cpu/cpu_mips64x.go#L9 +// - https://github.com/golang/go/blob/3dd58676054223962cd915bb0934d1f9f489d4d2/src/internal/cpu/cpu_riscv64.go#L7 #[cfg_attr( - any(target_arch = "arm", target_arch = "mips", target_arch = "mips64",), + any( + target_arch = "arm", + target_arch = "mips", + target_arch = "mips64", + target_arch = "riscv64", + ), repr(align(32)) )] // s390x has 256-byte cache line size. @@ -43,12 +49,11 @@ // Sources: // - https://github.com/golang/go/blob/3dd58676054223962cd915bb0934d1f9f489d4d2/src/internal/cpu/cpu_s390x.go#L7 #[cfg_attr(target_arch = "s390x", repr(align(256)))] -// x86, riscv and wasm have 64-byte cache line size. +// x86 and wasm have 64-byte cache line size. // // Sources: // - https://github.com/golang/go/blob/dda2991c2ea0c5914714469c4defc2562a907230/src/internal/cpu/cpu_x86.go#L9 // - https://github.com/golang/go/blob/3dd58676054223962cd915bb0934d1f9f489d4d2/src/internal/cpu/cpu_wasm.go#L7 -// - https://github.com/torvalds/linux/blob/3516bd729358a2a9b090c1905bd2a3fa926e24c6/arch/riscv/include/asm/cache.h#L10 // // All others are assumed to have 64-byte cache line size. #[cfg_attr( @@ -59,6 +64,7 @@ target_arch = "arm", target_arch = "mips", target_arch = "mips64", + target_arch = "riscv64", target_arch = "s390x", )), repr(align(64)) diff -Nru temporalio-1.3.0/vendor/tokio/tests/dump.rs temporalio-1.3.0/vendor/tokio/tests/dump.rs --- temporalio-1.3.0/vendor/tokio/tests/dump.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio/tests/dump.rs 2023-10-30 19:40:00.000000000 +0000 @@ -97,60 +97,3 @@ ); }); } - -/// Regression tests for #6035. -/// -/// These tests ensure that dumping will not deadlock if a future completes -/// during a trace. -mod future_completes_during_trace { - use super::*; - - use core::future::{poll_fn, Future}; - - /// A future that completes only during a trace. - fn complete_during_trace() -> impl Future + Send { - use std::task::Poll; - poll_fn(|cx| { - if Handle::is_tracing() { - Poll::Ready(()) - } else { - cx.waker().wake_by_ref(); - Poll::Pending - } - }) - } - - #[test] - fn current_thread() { - let rt = runtime::Builder::new_current_thread() - .enable_all() - .build() - .unwrap(); - - async fn dump() { - let handle = Handle::current(); - let _dump = handle.dump().await; - } - - rt.block_on(async { - let _ = tokio::join!(tokio::spawn(complete_during_trace()), dump()); - }); - } - - #[test] - fn multi_thread() { - let rt = runtime::Builder::new_multi_thread() - .enable_all() - .build() - .unwrap(); - - async fn dump() { - let handle = Handle::current(); - let _dump = handle.dump().await; - } - - rt.block_on(async { - let _ = tokio::join!(tokio::spawn(complete_during_trace()), dump()); - }); - } -} diff -Nru temporalio-1.3.0/vendor/tokio/tests/duplex_stream.rs temporalio-1.3.0/vendor/tokio/tests/duplex_stream.rs --- temporalio-1.3.0/vendor/tokio/tests/duplex_stream.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio/tests/duplex_stream.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,47 +0,0 @@ -#![warn(rust_2018_idioms)] -#![cfg(feature = "full")] - -use std::io::IoSlice; -use tokio::io::{AsyncReadExt, AsyncWriteExt}; - -const HELLO: &[u8] = b"hello world..."; - -#[tokio::test] -async fn write_vectored() { - let (mut client, mut server) = tokio::io::duplex(64); - - let ret = client - .write_vectored(&[IoSlice::new(HELLO), IoSlice::new(HELLO)]) - .await - .unwrap(); - assert_eq!(ret, HELLO.len() * 2); - - client.flush().await.unwrap(); - drop(client); - - let mut buf = Vec::with_capacity(HELLO.len() * 2); - let bytes_read = server.read_to_end(&mut buf).await.unwrap(); - - assert_eq!(bytes_read, HELLO.len() * 2); - assert_eq!(buf, [HELLO, HELLO].concat()); -} - -#[tokio::test] -async fn write_vectored_and_shutdown() { - let (mut client, mut server) = tokio::io::duplex(64); - - let ret = client - .write_vectored(&[IoSlice::new(HELLO), IoSlice::new(HELLO)]) - .await - .unwrap(); - assert_eq!(ret, HELLO.len() * 2); - - client.shutdown().await.unwrap(); - drop(client); - - let mut buf = Vec::with_capacity(HELLO.len() * 2); - let bytes_read = server.read_to_end(&mut buf).await.unwrap(); - - assert_eq!(bytes_read, HELLO.len() * 2); - assert_eq!(buf, [HELLO, HELLO].concat()); -} diff -Nru temporalio-1.3.0/vendor/tokio/tests/fs_file.rs temporalio-1.3.0/vendor/tokio/tests/fs_file.rs --- temporalio-1.3.0/vendor/tokio/tests/fs_file.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio/tests/fs_file.rs 2023-10-30 19:40:00.000000000 +0000 @@ -2,7 +2,6 @@ #![cfg(all(feature = "full", not(target_os = "wasi")))] // WASI does not support all fs operations use std::io::prelude::*; -use std::io::IoSlice; use tempfile::NamedTempFile; use tokio::fs::File; use tokio::io::{AsyncReadExt, AsyncSeekExt, AsyncWriteExt, SeekFrom}; @@ -51,40 +50,6 @@ } #[tokio::test] -async fn write_vectored() { - let tempfile = tempfile(); - - let mut file = File::create(tempfile.path()).await.unwrap(); - - let ret = file - .write_vectored(&[IoSlice::new(HELLO), IoSlice::new(HELLO)]) - .await - .unwrap(); - assert_eq!(ret, HELLO.len() * 2); - file.flush().await.unwrap(); - - let file = std::fs::read(tempfile.path()).unwrap(); - assert_eq!(file, [HELLO, HELLO].concat()); -} - -#[tokio::test] -async fn write_vectored_and_shutdown() { - let tempfile = tempfile(); - - let mut file = File::create(tempfile.path()).await.unwrap(); - - let ret = file - .write_vectored(&[IoSlice::new(HELLO), IoSlice::new(HELLO)]) - .await - .unwrap(); - assert_eq!(ret, HELLO.len() * 2); - file.shutdown().await.unwrap(); - - let file = std::fs::read(tempfile.path()).unwrap(); - assert_eq!(file, [HELLO, HELLO].concat()); -} - -#[tokio::test] async fn rewind_seek_position() { let tempfile = tempfile(); diff -Nru temporalio-1.3.0/vendor/tokio/tests/rt_threaded.rs temporalio-1.3.0/vendor/tokio/tests/rt_threaded.rs --- temporalio-1.3.0/vendor/tokio/tests/rt_threaded.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio/tests/rt_threaded.rs 2023-10-30 19:40:00.000000000 +0000 @@ -746,34 +746,12 @@ #[test] fn test_disable_lifo_slot() { - use std::sync::mpsc::{channel, RecvTimeoutError}; - let rt = runtime::Builder::new_multi_thread() .disable_lifo_slot() .worker_threads(2) .build() .unwrap(); - // Spawn a background thread to poke the runtime periodically. - // - // This is necessary because we may end up triggering the issue in: - // - // - // Spawning a task will wake up the second worker, which will then steal - // the task. However, the steal will fail if the task is in the LIFO - // slot, because the LIFO slot cannot be stolen. - // - // Note that this only happens rarely. Most of the time, this thread is - // not necessary. - let (kill_bg_thread, recv) = channel::<()>(); - let handle = rt.handle().clone(); - let bg_thread = std::thread::spawn(move || { - let one_sec = std::time::Duration::from_secs(1); - while recv.recv_timeout(one_sec) == Err(RecvTimeoutError::Timeout) { - handle.spawn(async {}); - } - }); - rt.block_on(async { tokio::spawn(async { // Spawn another task and block the thread until completion. If the LIFO slot @@ -782,10 +760,7 @@ }) .await .unwrap(); - }); - - drop(kill_bg_thread); - bg_thread.join().unwrap(); + }) } #[test] diff -Nru temporalio-1.3.0/vendor/tokio/tests/sync_watch.rs temporalio-1.3.0/vendor/tokio/tests/sync_watch.rs --- temporalio-1.3.0/vendor/tokio/tests/sync_watch.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio/tests/sync_watch.rs 2023-10-30 19:40:00.000000000 +0000 @@ -45,64 +45,6 @@ } #[test] -fn rx_version_underflow() { - let (_tx, mut rx) = watch::channel("one"); - - // Version starts at 2, validate we do not underflow - rx.mark_changed(); - rx.mark_changed(); -} - -#[test] -fn rx_mark_changed() { - let (tx, mut rx) = watch::channel("one"); - - let mut rx2 = rx.clone(); - let mut rx3 = rx.clone(); - let mut rx4 = rx.clone(); - { - rx.mark_changed(); - assert!(rx.has_changed().unwrap()); - - let mut t = spawn(rx.changed()); - assert_ready_ok!(t.poll()); - } - - { - assert!(!rx2.has_changed().unwrap()); - - let mut t = spawn(rx2.changed()); - assert_pending!(t.poll()); - } - - { - rx3.mark_changed(); - assert_eq!(*rx3.borrow(), "one"); - - assert!(rx3.has_changed().unwrap()); - - assert_eq!(*rx3.borrow_and_update(), "one"); - - assert!(!rx3.has_changed().unwrap()); - - let mut t = spawn(rx3.changed()); - assert_pending!(t.poll()); - } - - { - tx.send("two").unwrap(); - assert!(rx4.has_changed().unwrap()); - assert_eq!(*rx4.borrow_and_update(), "two"); - - rx4.mark_changed(); - assert!(rx4.has_changed().unwrap()); - assert_eq!(*rx4.borrow_and_update(), "two") - } - - assert_eq!(*rx.borrow(), "two"); -} - -#[test] fn multi_rx() { let (tx, mut rx1) = watch::channel("one"); let mut rx2 = rx1.clone(); diff -Nru temporalio-1.3.0/vendor/tokio/tests/time_sleep.rs temporalio-1.3.0/vendor/tokio/tests/time_sleep.rs --- temporalio-1.3.0/vendor/tokio/tests/time_sleep.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio/tests/time_sleep.rs 2023-10-30 19:40:00.000000000 +0000 @@ -189,7 +189,7 @@ #[tokio::test] async fn short_sleeps() { - for _ in 0..1000 { + for _ in 0..10000 { tokio::time::sleep(std::time::Duration::from_millis(0)).await; } } diff -Nru temporalio-1.3.0/vendor/tokio-rustls-0.23.4/.cargo-checksum.json temporalio-1.3.0/vendor/tokio-rustls-0.23.4/.cargo-checksum.json --- temporalio-1.3.0/vendor/tokio-rustls-0.23.4/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio-rustls-0.23.4/.cargo-checksum.json 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -{"files":{"Cargo.toml":"253b21886ab842cb4dfc544cb60c858098731b11ab9b7ebfbee932c0720dbe8e","LICENSE-APACHE":"cc117d90b498b32b11a886f279b359da16a73c3b01efbb2f5cc004b20262334e","LICENSE-MIT":"e20fa2b8e0a2565f24a792b94b4bf4b6c2b9d36f781d8a9516e218a036e6677a","README.md":"09c50ae18cbfb631dd61c948a01c528c4ef16ebef9b47e4577cb4e3419b8db7b","src/client.rs":"2ed77ed6a36c37c681839544f7d7510261205da7ec91c88a85d2ed098a556589","src/common/handshake.rs":"351bd22a331d280b196fe22229a8a3d492b2d598bfc9650c22110ec413498d41","src/common/mod.rs":"d007e3bf2f60831e90be24445505148312683bea848d45e32a2bd7d1e5bebfa7","src/common/test_stream.rs":"c6b68cff6966f835705ae53df06df42991d3753a7143950a95226c77ac36bfc2","src/lib.rs":"9e0dbe7218d89229442d6ac88c8e26cedccf51cc52f559c23521ec83437329cb","src/server.rs":"2d4ef0249fe3693d115a9ebb976532db26b4cc25f1e2aafcbd4267060a714b24","tests/badssl.rs":"80efb4aefabaa869a54d2ba75777d087bb6860f0d02161ab0e6da4175296acf1","tests/early-data.rs":"c382b3ac4a625956bfc9a4d2387d98f34402a4add3efc06b65512199f95889a4","tests/end.cert":"7fe1fc3b62f0b8b9e8544897d1f4caf2873a92f9f4776c79eded074b9c9efbcb","tests/end.chain":"7d5dea00b3d5f16eb0e8c0d40aba1a3f835cbc9d5d55ae5129f8203bcff2a020","tests/end.rsa":"4ad4bb56749c408c20eba2365a9b4abd953011b05e42ace8244ba83995421088","tests/test.rs":"d59fda8f0c92e8e9bd0e4b09dd6957db23274c9562384127b8b76b3bfb4256c9","tests/utils.rs":"9f6884269a12aa10cb733c3c17b1247e98872e9d4e06ae929ad7e66b74122581"},"package":"c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/tokio-rustls-0.23.4/Cargo.toml temporalio-1.3.0/vendor/tokio-rustls-0.23.4/Cargo.toml --- temporalio-1.3.0/vendor/tokio-rustls-0.23.4/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio-rustls-0.23.4/Cargo.toml 1970-01-01 00:00:00.000000000 +0000 @@ -1,63 +0,0 @@ -# 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 = "tokio-rustls" -version = "0.23.4" -authors = ["quininer kel "] -description = "Asynchronous TLS/SSL streams for Tokio using Rustls." -homepage = "https://github.com/tokio-rs/tls" -documentation = "https://docs.rs/tokio-rustls" -readme = "README.md" -categories = [ - "asynchronous", - "cryptography", - "network-programming", -] -license = "MIT/Apache-2.0" -repository = "https://github.com/tokio-rs/tls" - -[dependencies.rustls] -version = "0.20" -default-features = false - -[dependencies.tokio] -version = "1.0" - -[dependencies.webpki] -version = "0.22" - -[dev-dependencies.futures-util] -version = "0.3.1" - -[dev-dependencies.lazy_static] -version = "1" - -[dev-dependencies.rustls-pemfile] -version = "0.2.1" - -[dev-dependencies.tokio] -version = "1.0" -features = ["full"] - -[dev-dependencies.webpki-roots] -version = "0.22" - -[features] -dangerous_configuration = ["rustls/dangerous_configuration"] -default = [ - "logging", - "tls12", -] -early-data = [] -logging = ["rustls/logging"] -tls12 = ["rustls/tls12"] diff -Nru temporalio-1.3.0/vendor/tokio-rustls-0.23.4/LICENSE-APACHE temporalio-1.3.0/vendor/tokio-rustls-0.23.4/LICENSE-APACHE --- temporalio-1.3.0/vendor/tokio-rustls-0.23.4/LICENSE-APACHE 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio-rustls-0.23.4/LICENSE-APACHE 1970-01-01 00:00:00.000000000 +0000 @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - -Copyright 2017 quininer kel - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff -Nru temporalio-1.3.0/vendor/tokio-rustls-0.23.4/LICENSE-MIT temporalio-1.3.0/vendor/tokio-rustls-0.23.4/LICENSE-MIT --- temporalio-1.3.0/vendor/tokio-rustls-0.23.4/LICENSE-MIT 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio-rustls-0.23.4/LICENSE-MIT 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -Copyright (c) 2017 quininer kel - -Permission is hereby granted, free of charge, to any -person obtaining a copy of this software and associated -documentation files (the "Software"), to deal in the -Software without restriction, including without -limitation the rights to use, copy, modify, merge, -publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software -is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice -shall be included in all copies or substantial portions -of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. diff -Nru temporalio-1.3.0/vendor/tokio-rustls-0.23.4/README.md temporalio-1.3.0/vendor/tokio-rustls-0.23.4/README.md --- temporalio-1.3.0/vendor/tokio-rustls-0.23.4/README.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio-rustls-0.23.4/README.md 1970-01-01 00:00:00.000000000 +0000 @@ -1,65 +0,0 @@ -# tokio-rustls -[![github actions](https://github.com/tokio-rs/tls/workflows/Rust/badge.svg)](https://github.com/tokio-rs/tls/actions) -[![crates](https://img.shields.io/crates/v/tokio-rustls.svg)](https://crates.io/crates/tokio-rustls) -[![license](https://img.shields.io/badge/License-MIT-blue.svg)](https://github.com/tokio-rs/tls/blob/master/tokio-rustls/LICENSE-MIT) -[![license](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://github.com/tokio-rs/tls/blob/master/tokio-rustls/LICENSE-APACHE) -[![docs.rs](https://docs.rs/tokio-rustls/badge.svg)](https://docs.rs/tokio-rustls/) - -Asynchronous TLS/SSL streams for [Tokio](https://tokio.rs/) using -[Rustls](https://github.com/ctz/rustls). - -### Basic Structure of a Client - -```rust -use webpki::DNSNameRef; -use tokio_rustls::{ TlsConnector, rustls::ClientConfig }; - -// ... - -let mut config = ClientConfig::new(); -config.root_store.add_server_trust_anchors(&webpki_roots::TLS_SERVER_ROOTS); -let config = TlsConnector::from(Arc::new(config)); -let dnsname = DNSNameRef::try_from_ascii_str("www.rust-lang.org").unwrap(); - -let stream = TcpStream::connect(&addr).await?; -let mut stream = config.connect(dnsname, stream).await?; - -// ... -``` - -### Client Example Program - -See [examples/client](examples/client/src/main.rs). You can run it with: - -```sh -cd examples/client -cargo run -- hsts.badssl.com -``` - -### Server Example Program - -See [examples/server](examples/server/src/main.rs). You can run it with: - -```sh -cd examples/server -cargo run -- 127.0.0.1:8000 --cert mycert.der --key mykey.der -``` - -### License & Origin - -This project is licensed under either of - - * Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or - http://www.apache.org/licenses/LICENSE-2.0) - * MIT license ([LICENSE-MIT](LICENSE-MIT) or - http://opensource.org/licenses/MIT) - -at your option. - -This started as a fork of [tokio-tls](https://github.com/tokio-rs/tokio-tls). - -### Contribution - -Unless you explicitly state otherwise, any contribution intentionally submitted -for inclusion in tokio-rustls by you, as defined in the Apache-2.0 license, shall be -dual licensed as above, without any additional terms or conditions. diff -Nru temporalio-1.3.0/vendor/tokio-rustls-0.23.4/src/client.rs temporalio-1.3.0/vendor/tokio-rustls-0.23.4/src/client.rs --- temporalio-1.3.0/vendor/tokio-rustls-0.23.4/src/client.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio-rustls-0.23.4/src/client.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,244 +0,0 @@ -use super::*; -use crate::common::IoSession; -#[cfg(unix)] -use std::os::unix::io::{AsRawFd, RawFd}; -#[cfg(windows)] -use std::os::windows::io::{AsRawSocket, RawSocket}; - -/// A wrapper around an underlying raw stream which implements the TLS or SSL -/// protocol. -#[derive(Debug)] -pub struct TlsStream { - pub(crate) io: IO, - pub(crate) session: ClientConnection, - pub(crate) state: TlsState, - - #[cfg(feature = "early-data")] - pub(crate) early_waker: Option, -} - -impl TlsStream { - #[inline] - pub fn get_ref(&self) -> (&IO, &ClientConnection) { - (&self.io, &self.session) - } - - #[inline] - pub fn get_mut(&mut self) -> (&mut IO, &mut ClientConnection) { - (&mut self.io, &mut self.session) - } - - #[inline] - pub fn into_inner(self) -> (IO, ClientConnection) { - (self.io, self.session) - } -} - -#[cfg(unix)] -impl AsRawFd for TlsStream -where - S: AsRawFd, -{ - fn as_raw_fd(&self) -> RawFd { - self.get_ref().0.as_raw_fd() - } -} - -#[cfg(windows)] -impl AsRawSocket for TlsStream -where - S: AsRawSocket, -{ - fn as_raw_socket(&self) -> RawSocket { - self.get_ref().0.as_raw_socket() - } -} - -impl IoSession for TlsStream { - type Io = IO; - type Session = ClientConnection; - - #[inline] - fn skip_handshake(&self) -> bool { - self.state.is_early_data() - } - - #[inline] - fn get_mut(&mut self) -> (&mut TlsState, &mut Self::Io, &mut Self::Session) { - (&mut self.state, &mut self.io, &mut self.session) - } - - #[inline] - fn into_io(self) -> Self::Io { - self.io - } -} - -impl AsyncRead for TlsStream -where - IO: AsyncRead + AsyncWrite + Unpin, -{ - fn poll_read( - self: Pin<&mut Self>, - cx: &mut Context<'_>, - buf: &mut ReadBuf<'_>, - ) -> Poll> { - match self.state { - #[cfg(feature = "early-data")] - TlsState::EarlyData(..) => { - let this = self.get_mut(); - - // In the EarlyData state, we have not really established a Tls connection. - // Before writing data through `AsyncWrite` and completing the tls handshake, - // we ignore read readiness and return to pending. - // - // In order to avoid event loss, - // we need to register a waker and wake it up after tls is connected. - if this - .early_waker - .as_ref() - .filter(|waker| cx.waker().will_wake(waker)) - .is_none() - { - this.early_waker = Some(cx.waker().clone()); - } - - Poll::Pending - } - TlsState::Stream | TlsState::WriteShutdown => { - let this = self.get_mut(); - let mut stream = - Stream::new(&mut this.io, &mut this.session).set_eof(!this.state.readable()); - let prev = buf.remaining(); - - match stream.as_mut_pin().poll_read(cx, buf) { - Poll::Ready(Ok(())) => { - if prev == buf.remaining() || stream.eof { - this.state.shutdown_read(); - } - - Poll::Ready(Ok(())) - } - Poll::Ready(Err(err)) if err.kind() == io::ErrorKind::ConnectionAborted => { - this.state.shutdown_read(); - Poll::Ready(Err(err)) - } - output => output, - } - } - TlsState::ReadShutdown | TlsState::FullyShutdown => Poll::Ready(Ok(())), - } - } -} - -impl AsyncWrite for TlsStream -where - IO: AsyncRead + AsyncWrite + Unpin, -{ - /// Note: that it does not guarantee the final data to be sent. - /// To be cautious, you must manually call `flush`. - fn poll_write( - self: Pin<&mut Self>, - cx: &mut Context<'_>, - buf: &[u8], - ) -> Poll> { - let this = self.get_mut(); - let mut stream = - Stream::new(&mut this.io, &mut this.session).set_eof(!this.state.readable()); - - #[allow(clippy::match_single_binding)] - match this.state { - #[cfg(feature = "early-data")] - TlsState::EarlyData(ref mut pos, ref mut data) => { - use std::io::Write; - - // write early data - if let Some(mut early_data) = stream.session.early_data() { - let len = match early_data.write(buf) { - Ok(n) => n, - Err(err) => return Poll::Ready(Err(err)), - }; - if len != 0 { - data.extend_from_slice(&buf[..len]); - return Poll::Ready(Ok(len)); - } - } - - // complete handshake - while stream.session.is_handshaking() { - ready!(stream.handshake(cx))?; - } - - // write early data (fallback) - if !stream.session.is_early_data_accepted() { - while *pos < data.len() { - let len = ready!(stream.as_mut_pin().poll_write(cx, &data[*pos..]))?; - *pos += len; - } - } - - // end - this.state = TlsState::Stream; - - if let Some(waker) = this.early_waker.take() { - waker.wake(); - } - - stream.as_mut_pin().poll_write(cx, buf) - } - _ => stream.as_mut_pin().poll_write(cx, buf), - } - } - - fn poll_flush(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { - let this = self.get_mut(); - let mut stream = - Stream::new(&mut this.io, &mut this.session).set_eof(!this.state.readable()); - - #[cfg(feature = "early-data")] - { - if let TlsState::EarlyData(ref mut pos, ref mut data) = this.state { - // complete handshake - while stream.session.is_handshaking() { - ready!(stream.handshake(cx))?; - } - - // write early data (fallback) - if !stream.session.is_early_data_accepted() { - while *pos < data.len() { - let len = ready!(stream.as_mut_pin().poll_write(cx, &data[*pos..]))?; - *pos += len; - } - } - - this.state = TlsState::Stream; - - if let Some(waker) = this.early_waker.take() { - waker.wake(); - } - } - } - - stream.as_mut_pin().poll_flush(cx) - } - - fn poll_shutdown(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { - #[cfg(feature = "early-data")] - { - // complete handshake - if matches!(self.state, TlsState::EarlyData(..)) { - ready!(self.as_mut().poll_flush(cx))?; - } - } - - if self.state.writeable() { - self.session.send_close_notify(); - self.state.shutdown_write(); - } - - let this = self.get_mut(); - let mut stream = - Stream::new(&mut this.io, &mut this.session).set_eof(!this.state.readable()); - stream.as_mut_pin().poll_shutdown(cx) - } -} diff -Nru temporalio-1.3.0/vendor/tokio-rustls-0.23.4/src/common/handshake.rs temporalio-1.3.0/vendor/tokio-rustls-0.23.4/src/common/handshake.rs --- temporalio-1.3.0/vendor/tokio-rustls-0.23.4/src/common/handshake.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio-rustls-0.23.4/src/common/handshake.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,70 +0,0 @@ -use crate::common::{Stream, TlsState}; -use rustls::{ConnectionCommon, SideData}; -use std::future::Future; -use std::ops::{Deref, DerefMut}; -use std::pin::Pin; -use std::task::{Context, Poll}; -use std::{io, mem}; -use tokio::io::{AsyncRead, AsyncWrite}; - -pub(crate) trait IoSession { - type Io; - type Session; - - fn skip_handshake(&self) -> bool; - fn get_mut(&mut self) -> (&mut TlsState, &mut Self::Io, &mut Self::Session); - fn into_io(self) -> Self::Io; -} - -pub(crate) enum MidHandshake { - Handshaking(IS), - End, - Error { io: IS::Io, error: io::Error }, -} - -impl Future for MidHandshake -where - IS: IoSession + Unpin, - IS::Io: AsyncRead + AsyncWrite + Unpin, - IS::Session: DerefMut + Deref> + Unpin, - SD: SideData, -{ - type Output = Result; - - fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { - let this = self.get_mut(); - - let mut stream = match mem::replace(this, MidHandshake::End) { - MidHandshake::Handshaking(stream) => stream, - // Starting the handshake returned an error; fail the future immediately. - MidHandshake::Error { io, error } => return Poll::Ready(Err((error, io))), - _ => panic!("unexpected polling after handshake"), - }; - - if !stream.skip_handshake() { - let (state, io, session) = stream.get_mut(); - let mut tls_stream = Stream::new(io, session).set_eof(!state.readable()); - - macro_rules! try_poll { - ( $e:expr ) => { - match $e { - Poll::Ready(Ok(_)) => (), - Poll::Ready(Err(err)) => return Poll::Ready(Err((err, stream.into_io()))), - Poll::Pending => { - *this = MidHandshake::Handshaking(stream); - return Poll::Pending; - } - } - }; - } - - while tls_stream.session.is_handshaking() { - try_poll!(tls_stream.handshake(cx)); - } - - try_poll!(Pin::new(&mut tls_stream).poll_flush(cx)); - } - - Poll::Ready(Ok(stream)) - } -} diff -Nru temporalio-1.3.0/vendor/tokio-rustls-0.23.4/src/common/mod.rs temporalio-1.3.0/vendor/tokio-rustls-0.23.4/src/common/mod.rs --- temporalio-1.3.0/vendor/tokio-rustls-0.23.4/src/common/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio-rustls-0.23.4/src/common/mod.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,363 +0,0 @@ -mod handshake; - -pub(crate) use handshake::{IoSession, MidHandshake}; -use rustls::{ConnectionCommon, SideData}; -use std::io::{self, IoSlice, Read, Write}; -use std::ops::{Deref, DerefMut}; -use std::pin::Pin; -use std::task::{Context, Poll}; -use tokio::io::{AsyncRead, AsyncWrite, ReadBuf}; - -#[derive(Debug)] -pub enum TlsState { - #[cfg(feature = "early-data")] - EarlyData(usize, Vec), - Stream, - ReadShutdown, - WriteShutdown, - FullyShutdown, -} - -impl TlsState { - #[inline] - pub fn shutdown_read(&mut self) { - match *self { - TlsState::WriteShutdown | TlsState::FullyShutdown => *self = TlsState::FullyShutdown, - _ => *self = TlsState::ReadShutdown, - } - } - - #[inline] - pub fn shutdown_write(&mut self) { - match *self { - TlsState::ReadShutdown | TlsState::FullyShutdown => *self = TlsState::FullyShutdown, - _ => *self = TlsState::WriteShutdown, - } - } - - #[inline] - pub fn writeable(&self) -> bool { - !matches!(*self, TlsState::WriteShutdown | TlsState::FullyShutdown) - } - - #[inline] - pub fn readable(&self) -> bool { - !matches!(*self, TlsState::ReadShutdown | TlsState::FullyShutdown) - } - - #[inline] - #[cfg(feature = "early-data")] - pub fn is_early_data(&self) -> bool { - matches!(self, TlsState::EarlyData(..)) - } - - #[inline] - #[cfg(not(feature = "early-data"))] - pub const fn is_early_data(&self) -> bool { - false - } -} - -pub struct Stream<'a, IO, C> { - pub io: &'a mut IO, - pub session: &'a mut C, - pub eof: bool, -} - -impl<'a, IO: AsyncRead + AsyncWrite + Unpin, C, SD> Stream<'a, IO, C> -where - C: DerefMut + Deref>, - SD: SideData, -{ - pub fn new(io: &'a mut IO, session: &'a mut C) -> Self { - Stream { - io, - session, - // The state so far is only used to detect EOF, so either Stream - // or EarlyData state should both be all right. - eof: false, - } - } - - pub fn set_eof(mut self, eof: bool) -> Self { - self.eof = eof; - self - } - - pub fn as_mut_pin(&mut self) -> Pin<&mut Self> { - Pin::new(self) - } - - pub fn read_io(&mut self, cx: &mut Context) -> Poll> { - let mut reader = SyncReadAdapter { io: self.io, cx }; - - let n = match self.session.read_tls(&mut reader) { - Ok(n) => n, - Err(ref err) if err.kind() == io::ErrorKind::WouldBlock => return Poll::Pending, - Err(err) => return Poll::Ready(Err(err)), - }; - - let stats = self.session.process_new_packets().map_err(|err| { - // In case we have an alert to send describing this error, - // try a last-gasp write -- but don't predate the primary - // error. - let _ = self.write_io(cx); - - io::Error::new(io::ErrorKind::InvalidData, err) - })?; - - if stats.peer_has_closed() && self.session.is_handshaking() { - return Poll::Ready(Err(io::Error::new( - io::ErrorKind::UnexpectedEof, - "tls handshake alert", - ))); - } - - Poll::Ready(Ok(n)) - } - - pub fn write_io(&mut self, cx: &mut Context) -> Poll> { - struct Writer<'a, 'b, T> { - io: &'a mut T, - cx: &'a mut Context<'b>, - } - - impl<'a, 'b, T: Unpin> Writer<'a, 'b, T> { - #[inline] - fn poll_with( - &mut self, - f: impl FnOnce(Pin<&mut T>, &mut Context<'_>) -> Poll>, - ) -> io::Result { - match f(Pin::new(self.io), self.cx) { - Poll::Ready(result) => result, - Poll::Pending => Err(io::ErrorKind::WouldBlock.into()), - } - } - } - - impl<'a, 'b, T: AsyncWrite + Unpin> Write for Writer<'a, 'b, T> { - #[inline] - fn write(&mut self, buf: &[u8]) -> io::Result { - self.poll_with(|io, cx| io.poll_write(cx, buf)) - } - - #[inline] - fn write_vectored(&mut self, bufs: &[IoSlice<'_>]) -> io::Result { - self.poll_with(|io, cx| io.poll_write_vectored(cx, bufs)) - } - - fn flush(&mut self) -> io::Result<()> { - self.poll_with(|io, cx| io.poll_flush(cx)) - } - } - - let mut writer = Writer { io: self.io, cx }; - - match self.session.write_tls(&mut writer) { - Err(ref err) if err.kind() == io::ErrorKind::WouldBlock => Poll::Pending, - result => Poll::Ready(result), - } - } - - pub fn handshake(&mut self, cx: &mut Context) -> Poll> { - let mut wrlen = 0; - let mut rdlen = 0; - - loop { - let mut write_would_block = false; - let mut read_would_block = false; - let mut need_flush = false; - - while self.session.wants_write() { - match self.write_io(cx) { - Poll::Ready(Ok(n)) => { - wrlen += n; - need_flush = true; - } - Poll::Pending => { - write_would_block = true; - break; - } - Poll::Ready(Err(err)) => return Poll::Ready(Err(err)), - } - } - - if need_flush { - match Pin::new(&mut self.io).poll_flush(cx) { - Poll::Ready(Ok(())) => (), - Poll::Ready(Err(err)) => return Poll::Ready(Err(err)), - Poll::Pending => write_would_block = true, - } - } - - while !self.eof && self.session.wants_read() { - match self.read_io(cx) { - Poll::Ready(Ok(0)) => self.eof = true, - Poll::Ready(Ok(n)) => rdlen += n, - Poll::Pending => { - read_would_block = true; - break; - } - Poll::Ready(Err(err)) => return Poll::Ready(Err(err)), - } - } - - return match (self.eof, self.session.is_handshaking()) { - (true, true) => { - let err = io::Error::new(io::ErrorKind::UnexpectedEof, "tls handshake eof"); - Poll::Ready(Err(err)) - } - (_, false) => Poll::Ready(Ok((rdlen, wrlen))), - (_, true) if write_would_block || read_would_block => { - if rdlen != 0 || wrlen != 0 { - Poll::Ready(Ok((rdlen, wrlen))) - } else { - Poll::Pending - } - } - (..) => continue, - }; - } - } -} - -impl<'a, IO: AsyncRead + AsyncWrite + Unpin, C, SD> AsyncRead for Stream<'a, IO, C> -where - C: DerefMut + Deref>, - SD: SideData, -{ - fn poll_read( - mut self: Pin<&mut Self>, - cx: &mut Context<'_>, - buf: &mut ReadBuf<'_>, - ) -> Poll> { - let mut io_pending = false; - - // read a packet - while !self.eof && self.session.wants_read() { - match self.read_io(cx) { - Poll::Ready(Ok(0)) => { - break; - } - Poll::Ready(Ok(_)) => (), - Poll::Pending => { - io_pending = true; - break; - } - Poll::Ready(Err(err)) => return Poll::Ready(Err(err)), - } - } - - match self.session.reader().read(buf.initialize_unfilled()) { - // If Rustls returns `Ok(0)` (while `buf` is non-empty), the peer closed the - // connection with a `CloseNotify` message and no more data will be forthcoming. - // - // Rustls yielded more data: advance the buffer, then see if more data is coming. - // - // We don't need to modify `self.eof` here, because it is only a temporary mark. - // rustls will only return 0 if is has received `CloseNotify`, - // in which case no additional processing is required. - Ok(n) => { - buf.advance(n); - Poll::Ready(Ok(())) - } - - // Rustls doesn't have more data to yield, but it believes the connection is open. - Err(ref err) if err.kind() == io::ErrorKind::WouldBlock => { - if !io_pending { - // If `wants_read()` is satisfied, rustls will not return `WouldBlock`. - // but if it does, we can try again. - // - // If the rustls state is abnormal, it may cause a cyclic wakeup. - // but tokio's cooperative budget will prevent infinite wakeup. - cx.waker().wake_by_ref(); - } - - Poll::Pending - } - - Err(err) => Poll::Ready(Err(err)), - } - } -} - -impl<'a, IO: AsyncRead + AsyncWrite + Unpin, C, SD> AsyncWrite for Stream<'a, IO, C> -where - C: DerefMut + Deref>, - SD: SideData, -{ - fn poll_write( - mut self: Pin<&mut Self>, - cx: &mut Context, - buf: &[u8], - ) -> Poll> { - let mut pos = 0; - - while pos != buf.len() { - let mut would_block = false; - - match self.session.writer().write(&buf[pos..]) { - Ok(n) => pos += n, - Err(err) => return Poll::Ready(Err(err)), - }; - - while self.session.wants_write() { - match self.write_io(cx) { - Poll::Ready(Ok(0)) | Poll::Pending => { - would_block = true; - break; - } - Poll::Ready(Ok(_)) => (), - Poll::Ready(Err(err)) => return Poll::Ready(Err(err)), - } - } - - return match (pos, would_block) { - (0, true) => Poll::Pending, - (n, true) => Poll::Ready(Ok(n)), - (_, false) => continue, - }; - } - - Poll::Ready(Ok(pos)) - } - - fn poll_flush(mut self: Pin<&mut Self>, cx: &mut Context) -> Poll> { - self.session.writer().flush()?; - while self.session.wants_write() { - ready!(self.write_io(cx))?; - } - Pin::new(&mut self.io).poll_flush(cx) - } - - fn poll_shutdown(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { - while self.session.wants_write() { - ready!(self.write_io(cx))?; - } - Pin::new(&mut self.io).poll_shutdown(cx) - } -} - -/// An adapter that implements a [`Read`] interface for [`AsyncRead`] types and an -/// associated [`Context`]. -/// -/// Turns `Poll::Pending` into `WouldBlock`. -pub struct SyncReadAdapter<'a, 'b, T> { - pub io: &'a mut T, - pub cx: &'a mut Context<'b>, -} - -impl<'a, 'b, T: AsyncRead + Unpin> Read for SyncReadAdapter<'a, 'b, T> { - #[inline] - fn read(&mut self, buf: &mut [u8]) -> io::Result { - let mut buf = ReadBuf::new(buf); - match Pin::new(&mut self.io).poll_read(self.cx, &mut buf) { - Poll::Ready(Ok(())) => Ok(buf.filled().len()), - Poll::Ready(Err(err)) => Err(err), - Poll::Pending => Err(io::ErrorKind::WouldBlock.into()), - } - } -} - -#[cfg(test)] -mod test_stream; diff -Nru temporalio-1.3.0/vendor/tokio-rustls-0.23.4/src/common/test_stream.rs temporalio-1.3.0/vendor/tokio-rustls-0.23.4/src/common/test_stream.rs --- temporalio-1.3.0/vendor/tokio-rustls-0.23.4/src/common/test_stream.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio-rustls-0.23.4/src/common/test_stream.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,315 +0,0 @@ -use super::Stream; -use futures_util::future::poll_fn; -use futures_util::task::noop_waker_ref; -use rustls::{ClientConnection, Connection, ServerConnection}; -use std::io::{self, Cursor, Read, Write}; -use std::pin::Pin; -use std::task::{Context, Poll}; -use tokio::io::{AsyncRead, AsyncReadExt, AsyncWrite, AsyncWriteExt, ReadBuf}; - -struct Good<'a>(&'a mut Connection); - -impl<'a> AsyncRead for Good<'a> { - fn poll_read( - mut self: Pin<&mut Self>, - _cx: &mut Context<'_>, - buf: &mut ReadBuf<'_>, - ) -> Poll> { - let mut buf2 = buf.initialize_unfilled(); - - Poll::Ready(match self.0.write_tls(buf2.by_ref()) { - Ok(n) => { - buf.advance(n); - Ok(()) - } - Err(err) => Err(err), - }) - } -} - -impl<'a> AsyncWrite for Good<'a> { - fn poll_write( - mut self: Pin<&mut Self>, - _cx: &mut Context<'_>, - mut buf: &[u8], - ) -> Poll> { - let len = self.0.read_tls(buf.by_ref())?; - self.0 - .process_new_packets() - .map_err(|err| io::Error::new(io::ErrorKind::InvalidData, err))?; - Poll::Ready(Ok(len)) - } - - fn poll_flush(mut self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll> { - self.0 - .process_new_packets() - .map_err(|err| io::Error::new(io::ErrorKind::InvalidData, err))?; - Poll::Ready(Ok(())) - } - - fn poll_shutdown(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { - self.0.send_close_notify(); - dbg!("sent close notify"); - self.poll_flush(cx) - } -} - -struct Pending; - -impl AsyncRead for Pending { - fn poll_read( - self: Pin<&mut Self>, - _cx: &mut Context<'_>, - _: &mut ReadBuf<'_>, - ) -> Poll> { - Poll::Pending - } -} - -impl AsyncWrite for Pending { - fn poll_write( - self: Pin<&mut Self>, - _cx: &mut Context<'_>, - _buf: &[u8], - ) -> Poll> { - Poll::Pending - } - - fn poll_flush(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll> { - Poll::Ready(Ok(())) - } - - fn poll_shutdown(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll> { - Poll::Ready(Ok(())) - } -} - -struct Expected(Cursor>); - -impl AsyncRead for Expected { - fn poll_read( - self: Pin<&mut Self>, - _cx: &mut Context<'_>, - buf: &mut ReadBuf<'_>, - ) -> Poll> { - let this = self.get_mut(); - let n = std::io::Read::read(&mut this.0, buf.initialize_unfilled())?; - buf.advance(n); - - Poll::Ready(Ok(())) - } -} - -impl AsyncWrite for Expected { - fn poll_write( - self: Pin<&mut Self>, - _cx: &mut Context<'_>, - buf: &[u8], - ) -> Poll> { - Poll::Ready(Ok(buf.len())) - } - - fn poll_flush(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll> { - Poll::Ready(Ok(())) - } - - fn poll_shutdown(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll> { - Poll::Ready(Ok(())) - } -} - -#[tokio::test] -async fn stream_good() -> io::Result<()> { - const FILE: &[u8] = include_bytes!("../../README.md"); - - let (server, mut client) = make_pair(); - let mut server = Connection::from(server); - poll_fn(|cx| do_handshake(&mut client, &mut server, cx)).await?; - - io::copy(&mut Cursor::new(FILE), &mut server.writer())?; - server.send_close_notify(); - - let mut server = Connection::from(server); - - { - let mut good = Good(&mut server); - let mut stream = Stream::new(&mut good, &mut client); - - let mut buf = Vec::new(); - dbg!(stream.read_to_end(&mut buf).await)?; - assert_eq!(buf, FILE); - - dbg!(stream.write_all(b"Hello World!").await)?; - stream.session.send_close_notify(); - - dbg!(stream.shutdown().await)?; - } - - let mut buf = String::new(); - dbg!(server.process_new_packets()).map_err(|e| io::Error::new(io::ErrorKind::Other, e))?; - dbg!(server.reader().read_to_string(&mut buf))?; - assert_eq!(buf, "Hello World!"); - - Ok(()) as io::Result<()> -} - -#[tokio::test] -async fn stream_bad() -> io::Result<()> { - let (server, mut client) = make_pair(); - let mut server = Connection::from(server); - poll_fn(|cx| do_handshake(&mut client, &mut server, cx)).await?; - client.set_buffer_limit(Some(1024)); - - let mut bad = Pending; - let mut stream = Stream::new(&mut bad, &mut client); - assert_eq!( - poll_fn(|cx| stream.as_mut_pin().poll_write(cx, &[0x42; 8])).await?, - 8 - ); - assert_eq!( - poll_fn(|cx| stream.as_mut_pin().poll_write(cx, &[0x42; 8])).await?, - 8 - ); - let r = poll_fn(|cx| stream.as_mut_pin().poll_write(cx, &[0x00; 1024])).await?; // fill buffer - assert!(r < 1024); - - let mut cx = Context::from_waker(noop_waker_ref()); - let ret = stream.as_mut_pin().poll_write(&mut cx, &[0x01]); - assert!(ret.is_pending()); - - Ok(()) as io::Result<()> -} - -#[tokio::test] -async fn stream_handshake() -> io::Result<()> { - let (server, mut client) = make_pair(); - let mut server = Connection::from(server); - - { - let mut good = Good(&mut server); - let mut stream = Stream::new(&mut good, &mut client); - let (r, w) = poll_fn(|cx| stream.handshake(cx)).await?; - - assert!(r > 0); - assert!(w > 0); - - poll_fn(|cx| stream.handshake(cx)).await?; // finish server handshake - } - - assert!(!server.is_handshaking()); - assert!(!client.is_handshaking()); - - Ok(()) as io::Result<()> -} - -#[tokio::test] -async fn stream_buffered_handshake() -> io::Result<()> { - use tokio::io::BufWriter; - - let (server, mut client) = make_pair(); - let mut server = Connection::from(server); - - { - let mut good = BufWriter::new(Good(&mut server)); - let mut stream = Stream::new(&mut good, &mut client); - let (r, w) = poll_fn(|cx| stream.handshake(cx)).await?; - - assert!(r > 0); - assert!(w > 0); - - poll_fn(|cx| stream.handshake(cx)).await?; // finish server handshake - } - - assert!(!server.is_handshaking()); - assert!(!client.is_handshaking()); - - Ok(()) as io::Result<()> -} - -#[tokio::test] -async fn stream_handshake_eof() -> io::Result<()> { - let (_, mut client) = make_pair(); - - let mut bad = Expected(Cursor::new(Vec::new())); - let mut stream = Stream::new(&mut bad, &mut client); - - let mut cx = Context::from_waker(noop_waker_ref()); - let r = stream.handshake(&mut cx); - assert_eq!( - r.map_err(|err| err.kind()), - Poll::Ready(Err(io::ErrorKind::UnexpectedEof)) - ); - - Ok(()) as io::Result<()> -} - -// see https://github.com/tokio-rs/tls/issues/77 -#[tokio::test] -async fn stream_handshake_regression_issues_77() -> io::Result<()> { - let (_, mut client) = make_pair(); - - let mut bad = Expected(Cursor::new(b"\x15\x03\x01\x00\x02\x02\x00".to_vec())); - let mut stream = Stream::new(&mut bad, &mut client); - - let mut cx = Context::from_waker(noop_waker_ref()); - let r = stream.handshake(&mut cx); - assert_eq!( - r.map_err(|err| err.kind()), - Poll::Ready(Err(io::ErrorKind::UnexpectedEof)) - ); - - Ok(()) as io::Result<()> -} - -#[tokio::test] -async fn stream_eof() -> io::Result<()> { - let (server, mut client) = make_pair(); - let mut server = Connection::from(server); - poll_fn(|cx| do_handshake(&mut client, &mut server, cx)).await?; - - let mut bad = Expected(Cursor::new(Vec::new())); - let mut stream = Stream::new(&mut bad, &mut client); - - let mut buf = Vec::new(); - let result = stream.read_to_end(&mut buf).await; - assert_eq!( - result.err().map(|e| e.kind()), - Some(io::ErrorKind::UnexpectedEof) - ); - - Ok(()) as io::Result<()> -} - -fn make_pair() -> (ServerConnection, ClientConnection) { - use std::convert::TryFrom; - - let (sconfig, cconfig) = utils::make_configs(); - let server = ServerConnection::new(sconfig).unwrap(); - - let domain = rustls::ServerName::try_from("localhost").unwrap(); - let client = ClientConnection::new(cconfig, domain).unwrap(); - - (server, client) -} - -fn do_handshake( - client: &mut ClientConnection, - server: &mut Connection, - cx: &mut Context<'_>, -) -> Poll> { - let mut good = Good(server); - let mut stream = Stream::new(&mut good, client); - - while stream.session.is_handshaking() { - ready!(stream.handshake(cx))?; - } - - while stream.session.wants_write() { - ready!(stream.write_io(cx))?; - } - - Poll::Ready(Ok(())) -} - -// Share `utils` module with integration tests -include!("../../tests/utils.rs"); diff -Nru temporalio-1.3.0/vendor/tokio-rustls-0.23.4/src/lib.rs temporalio-1.3.0/vendor/tokio-rustls-0.23.4/src/lib.rs --- temporalio-1.3.0/vendor/tokio-rustls-0.23.4/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio-rustls-0.23.4/src/lib.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,508 +0,0 @@ -//! Asynchronous TLS/SSL streams for Tokio using [Rustls](https://github.com/ctz/rustls). -//! -//! # Why do I need to call `poll_flush`? -//! -//! Most TLS implementations will have an internal buffer to improve throughput, -//! and rustls is no exception. -//! -//! When we write data to `TlsStream`, we always write rustls buffer first, -//! then take out rustls encrypted data packet, and write it to data channel (like TcpStream). -//! When data channel is pending, some data may remain in rustls buffer. -//! -//! `tokio-rustls` To keep it simple and correct, [TlsStream] will behave like `BufWriter`. -//! For `TlsStream`, this means that data written by `poll_write` is not guaranteed to be written to `TcpStream`. -//! You must call `poll_flush` to ensure that it is written to `TcpStream`. -//! -//! You should call `poll_flush` at the appropriate time, -//! such as when a period of `poll_write` write is complete and there is no more data to write. -//! -//! ## Why don't we write during `poll_read`? -//! -//! We did this in the early days of `tokio-rustls`, but it caused some bugs. -//! We can solve these bugs through some solutions, but this will cause performance degradation (reverse false wakeup). -//! -//! And reverse write will also prevent us implement full duplex in the future. -//! -//! see -//! -//! ## Why can't we handle it like `native-tls`? -//! -//! When data channel returns to pending, `native-tls` will falsely report the number of bytes it consumes. -//! This means that if data written by `poll_write` is not actually written to data channel, it will not return `Ready`. -//! Thus avoiding the call of `poll_flush`. -//! -//! but which does not conform to convention of `AsyncWrite` trait. -//! This means that if you give inconsistent data in two `poll_write`, it may cause unexpected behavior. -//! -//! see - -macro_rules! ready { - ( $e:expr ) => { - match $e { - std::task::Poll::Ready(t) => t, - std::task::Poll::Pending => return std::task::Poll::Pending, - } - }; -} - -pub mod client; -mod common; -pub mod server; - -use common::{MidHandshake, Stream, TlsState}; -use rustls::{ClientConfig, ClientConnection, CommonState, ServerConfig, ServerConnection}; -use std::future::Future; -use std::io; -#[cfg(unix)] -use std::os::unix::io::{AsRawFd, RawFd}; -#[cfg(windows)] -use std::os::windows::io::{AsRawSocket, RawSocket}; -use std::pin::Pin; -use std::sync::Arc; -use std::task::{Context, Poll}; -use tokio::io::{AsyncRead, AsyncWrite, ReadBuf}; - -pub use rustls; -pub use webpki; - -/// A wrapper around a `rustls::ClientConfig`, providing an async `connect` method. -#[derive(Clone)] -pub struct TlsConnector { - inner: Arc, - #[cfg(feature = "early-data")] - early_data: bool, -} - -/// A wrapper around a `rustls::ServerConfig`, providing an async `accept` method. -#[derive(Clone)] -pub struct TlsAcceptor { - inner: Arc, -} - -impl From> for TlsConnector { - fn from(inner: Arc) -> TlsConnector { - TlsConnector { - inner, - #[cfg(feature = "early-data")] - early_data: false, - } - } -} - -impl From> for TlsAcceptor { - fn from(inner: Arc) -> TlsAcceptor { - TlsAcceptor { inner } - } -} - -impl TlsConnector { - /// Enable 0-RTT. - /// - /// If you want to use 0-RTT, - /// You must also set `ClientConfig.enable_early_data` to `true`. - #[cfg(feature = "early-data")] - pub fn early_data(mut self, flag: bool) -> TlsConnector { - self.early_data = flag; - self - } - - #[inline] - pub fn connect(&self, domain: rustls::ServerName, stream: IO) -> Connect - where - IO: AsyncRead + AsyncWrite + Unpin, - { - self.connect_with(domain, stream, |_| ()) - } - - pub fn connect_with(&self, domain: rustls::ServerName, stream: IO, f: F) -> Connect - where - IO: AsyncRead + AsyncWrite + Unpin, - F: FnOnce(&mut ClientConnection), - { - let mut session = match ClientConnection::new(self.inner.clone(), domain) { - Ok(session) => session, - Err(error) => { - return Connect(MidHandshake::Error { - io: stream, - // TODO(eliza): should this really return an `io::Error`? - // Probably not... - error: io::Error::new(io::ErrorKind::Other, error), - }); - } - }; - f(&mut session); - - Connect(MidHandshake::Handshaking(client::TlsStream { - io: stream, - - #[cfg(not(feature = "early-data"))] - state: TlsState::Stream, - - #[cfg(feature = "early-data")] - state: if self.early_data && session.early_data().is_some() { - TlsState::EarlyData(0, Vec::new()) - } else { - TlsState::Stream - }, - - #[cfg(feature = "early-data")] - early_waker: None, - - session, - })) - } -} - -impl TlsAcceptor { - #[inline] - pub fn accept(&self, stream: IO) -> Accept - where - IO: AsyncRead + AsyncWrite + Unpin, - { - self.accept_with(stream, |_| ()) - } - - pub fn accept_with(&self, stream: IO, f: F) -> Accept - where - IO: AsyncRead + AsyncWrite + Unpin, - F: FnOnce(&mut ServerConnection), - { - let mut session = match ServerConnection::new(self.inner.clone()) { - Ok(session) => session, - Err(error) => { - return Accept(MidHandshake::Error { - io: stream, - // TODO(eliza): should this really return an `io::Error`? - // Probably not... - error: io::Error::new(io::ErrorKind::Other, error), - }); - } - }; - f(&mut session); - - Accept(MidHandshake::Handshaking(server::TlsStream { - session, - io: stream, - state: TlsState::Stream, - })) - } -} - -pub struct LazyConfigAcceptor { - acceptor: rustls::server::Acceptor, - io: Option, -} - -impl LazyConfigAcceptor -where - IO: AsyncRead + AsyncWrite + Unpin, -{ - #[inline] - pub fn new(acceptor: rustls::server::Acceptor, io: IO) -> Self { - Self { - acceptor, - io: Some(io), - } - } -} - -impl Future for LazyConfigAcceptor -where - IO: AsyncRead + AsyncWrite + Unpin, -{ - type Output = Result, io::Error>; - - fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { - let this = self.get_mut(); - loop { - let io = match this.io.as_mut() { - Some(io) => io, - None => { - return Poll::Ready(Err(io::Error::new( - io::ErrorKind::Other, - "acceptor cannot be polled after acceptance", - ))) - } - }; - - let mut reader = common::SyncReadAdapter { io, cx }; - match this.acceptor.read_tls(&mut reader) { - Ok(0) => return Err(io::ErrorKind::UnexpectedEof.into()).into(), - Ok(_) => {} - Err(e) if e.kind() == io::ErrorKind::WouldBlock => return Poll::Pending, - Err(e) => return Err(e).into(), - } - - match this.acceptor.accept() { - Ok(Some(accepted)) => { - let io = this.io.take().unwrap(); - return Poll::Ready(Ok(StartHandshake { accepted, io })); - } - Ok(None) => continue, - Err(err) => { - return Poll::Ready(Err(io::Error::new(io::ErrorKind::InvalidInput, err))) - } - } - } - } -} - -pub struct StartHandshake { - accepted: rustls::server::Accepted, - io: IO, -} - -impl StartHandshake -where - IO: AsyncRead + AsyncWrite + Unpin, -{ - pub fn client_hello(&self) -> rustls::server::ClientHello<'_> { - self.accepted.client_hello() - } - - pub fn into_stream(self, config: Arc) -> Accept { - self.into_stream_with(config, |_| ()) - } - - pub fn into_stream_with(self, config: Arc, f: F) -> Accept - where - F: FnOnce(&mut ServerConnection), - { - let mut conn = match self.accepted.into_connection(config) { - Ok(conn) => conn, - Err(error) => { - return Accept(MidHandshake::Error { - io: self.io, - // TODO(eliza): should this really return an `io::Error`? - // Probably not... - error: io::Error::new(io::ErrorKind::Other, error), - }); - } - }; - f(&mut conn); - - Accept(MidHandshake::Handshaking(server::TlsStream { - session: conn, - io: self.io, - state: TlsState::Stream, - })) - } -} - -/// Future returned from `TlsConnector::connect` which will resolve -/// once the connection handshake has finished. -pub struct Connect(MidHandshake>); - -/// Future returned from `TlsAcceptor::accept` which will resolve -/// once the accept handshake has finished. -pub struct Accept(MidHandshake>); - -/// Like [Connect], but returns `IO` on failure. -pub struct FallibleConnect(MidHandshake>); - -/// Like [Accept], but returns `IO` on failure. -pub struct FallibleAccept(MidHandshake>); - -impl Connect { - #[inline] - pub fn into_fallible(self) -> FallibleConnect { - FallibleConnect(self.0) - } - - pub fn get_ref(&self) -> Option<&IO> { - match &self.0 { - MidHandshake::Handshaking(sess) => Some(sess.get_ref().0), - MidHandshake::Error { io, .. } => Some(io), - MidHandshake::End => None, - } - } - - pub fn get_mut(&mut self) -> Option<&mut IO> { - match &mut self.0 { - MidHandshake::Handshaking(sess) => Some(sess.get_mut().0), - MidHandshake::Error { io, .. } => Some(io), - MidHandshake::End => None, - } - } -} - -impl Accept { - #[inline] - pub fn into_fallible(self) -> FallibleAccept { - FallibleAccept(self.0) - } - - pub fn get_ref(&self) -> Option<&IO> { - match &self.0 { - MidHandshake::Handshaking(sess) => Some(sess.get_ref().0), - MidHandshake::Error { io, .. } => Some(io), - MidHandshake::End => None, - } - } - - pub fn get_mut(&mut self) -> Option<&mut IO> { - match &mut self.0 { - MidHandshake::Handshaking(sess) => Some(sess.get_mut().0), - MidHandshake::Error { io, .. } => Some(io), - MidHandshake::End => None, - } - } -} - -impl Future for Connect { - type Output = io::Result>; - - #[inline] - fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { - Pin::new(&mut self.0).poll(cx).map_err(|(err, _)| err) - } -} - -impl Future for Accept { - type Output = io::Result>; - - #[inline] - fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { - Pin::new(&mut self.0).poll(cx).map_err(|(err, _)| err) - } -} - -impl Future for FallibleConnect { - type Output = Result, (io::Error, IO)>; - - #[inline] - fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { - Pin::new(&mut self.0).poll(cx) - } -} - -impl Future for FallibleAccept { - type Output = Result, (io::Error, IO)>; - - #[inline] - fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { - Pin::new(&mut self.0).poll(cx) - } -} - -/// Unified TLS stream type -/// -/// This abstracts over the inner `client::TlsStream` and `server::TlsStream`, so you can use -/// a single type to keep both client- and server-initiated TLS-encrypted connections. -#[derive(Debug)] -pub enum TlsStream { - Client(client::TlsStream), - Server(server::TlsStream), -} - -impl TlsStream { - pub fn get_ref(&self) -> (&T, &CommonState) { - use TlsStream::*; - match self { - Client(io) => { - let (io, session) = io.get_ref(); - (io, &*session) - } - Server(io) => { - let (io, session) = io.get_ref(); - (io, &*session) - } - } - } - - pub fn get_mut(&mut self) -> (&mut T, &mut CommonState) { - use TlsStream::*; - match self { - Client(io) => { - let (io, session) = io.get_mut(); - (io, &mut *session) - } - Server(io) => { - let (io, session) = io.get_mut(); - (io, &mut *session) - } - } - } -} - -impl From> for TlsStream { - fn from(s: client::TlsStream) -> Self { - Self::Client(s) - } -} - -impl From> for TlsStream { - fn from(s: server::TlsStream) -> Self { - Self::Server(s) - } -} - -#[cfg(unix)] -impl AsRawFd for TlsStream -where - S: AsRawFd, -{ - fn as_raw_fd(&self) -> RawFd { - self.get_ref().0.as_raw_fd() - } -} - -#[cfg(windows)] -impl AsRawSocket for TlsStream -where - S: AsRawSocket, -{ - fn as_raw_socket(&self) -> RawSocket { - self.get_ref().0.as_raw_socket() - } -} - -impl AsyncRead for TlsStream -where - T: AsyncRead + AsyncWrite + Unpin, -{ - #[inline] - fn poll_read( - self: Pin<&mut Self>, - cx: &mut Context<'_>, - buf: &mut ReadBuf<'_>, - ) -> Poll> { - match self.get_mut() { - TlsStream::Client(x) => Pin::new(x).poll_read(cx, buf), - TlsStream::Server(x) => Pin::new(x).poll_read(cx, buf), - } - } -} - -impl AsyncWrite for TlsStream -where - T: AsyncRead + AsyncWrite + Unpin, -{ - #[inline] - fn poll_write( - self: Pin<&mut Self>, - cx: &mut Context<'_>, - buf: &[u8], - ) -> Poll> { - match self.get_mut() { - TlsStream::Client(x) => Pin::new(x).poll_write(cx, buf), - TlsStream::Server(x) => Pin::new(x).poll_write(cx, buf), - } - } - - #[inline] - fn poll_flush(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { - match self.get_mut() { - TlsStream::Client(x) => Pin::new(x).poll_flush(cx), - TlsStream::Server(x) => Pin::new(x).poll_flush(cx), - } - } - - #[inline] - fn poll_shutdown(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { - match self.get_mut() { - TlsStream::Client(x) => Pin::new(x).poll_shutdown(cx), - TlsStream::Server(x) => Pin::new(x).poll_shutdown(cx), - } - } -} diff -Nru temporalio-1.3.0/vendor/tokio-rustls-0.23.4/src/server.rs temporalio-1.3.0/vendor/tokio-rustls-0.23.4/src/server.rs --- temporalio-1.3.0/vendor/tokio-rustls-0.23.4/src/server.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio-rustls-0.23.4/src/server.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,149 +0,0 @@ -#[cfg(unix)] -use std::os::unix::io::{AsRawFd, RawFd}; -#[cfg(windows)] -use std::os::windows::io::{AsRawSocket, RawSocket}; - -use super::*; -use crate::common::IoSession; - -/// A wrapper around an underlying raw stream which implements the TLS or SSL -/// protocol. -#[derive(Debug)] -pub struct TlsStream { - pub(crate) io: IO, - pub(crate) session: ServerConnection, - pub(crate) state: TlsState, -} - -impl TlsStream { - #[inline] - pub fn get_ref(&self) -> (&IO, &ServerConnection) { - (&self.io, &self.session) - } - - #[inline] - pub fn get_mut(&mut self) -> (&mut IO, &mut ServerConnection) { - (&mut self.io, &mut self.session) - } - - #[inline] - pub fn into_inner(self) -> (IO, ServerConnection) { - (self.io, self.session) - } -} - -impl IoSession for TlsStream { - type Io = IO; - type Session = ServerConnection; - - #[inline] - fn skip_handshake(&self) -> bool { - false - } - - #[inline] - fn get_mut(&mut self) -> (&mut TlsState, &mut Self::Io, &mut Self::Session) { - (&mut self.state, &mut self.io, &mut self.session) - } - - #[inline] - fn into_io(self) -> Self::Io { - self.io - } -} - -impl AsyncRead for TlsStream -where - IO: AsyncRead + AsyncWrite + Unpin, -{ - fn poll_read( - self: Pin<&mut Self>, - cx: &mut Context<'_>, - buf: &mut ReadBuf<'_>, - ) -> Poll> { - let this = self.get_mut(); - let mut stream = - Stream::new(&mut this.io, &mut this.session).set_eof(!this.state.readable()); - - match &this.state { - TlsState::Stream | TlsState::WriteShutdown => { - let prev = buf.remaining(); - - match stream.as_mut_pin().poll_read(cx, buf) { - Poll::Ready(Ok(())) => { - if prev == buf.remaining() || stream.eof { - this.state.shutdown_read(); - } - - Poll::Ready(Ok(())) - } - Poll::Ready(Err(err)) if err.kind() == io::ErrorKind::UnexpectedEof => { - this.state.shutdown_read(); - Poll::Ready(Err(err)) - } - output => output, - } - } - TlsState::ReadShutdown | TlsState::FullyShutdown => Poll::Ready(Ok(())), - #[cfg(feature = "early-data")] - s => unreachable!("server TLS can not hit this state: {:?}", s), - } - } -} - -impl AsyncWrite for TlsStream -where - IO: AsyncRead + AsyncWrite + Unpin, -{ - /// Note: that it does not guarantee the final data to be sent. - /// To be cautious, you must manually call `flush`. - fn poll_write( - self: Pin<&mut Self>, - cx: &mut Context<'_>, - buf: &[u8], - ) -> Poll> { - let this = self.get_mut(); - let mut stream = - Stream::new(&mut this.io, &mut this.session).set_eof(!this.state.readable()); - stream.as_mut_pin().poll_write(cx, buf) - } - - fn poll_flush(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { - let this = self.get_mut(); - let mut stream = - Stream::new(&mut this.io, &mut this.session).set_eof(!this.state.readable()); - stream.as_mut_pin().poll_flush(cx) - } - - fn poll_shutdown(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { - if self.state.writeable() { - self.session.send_close_notify(); - self.state.shutdown_write(); - } - - let this = self.get_mut(); - let mut stream = - Stream::new(&mut this.io, &mut this.session).set_eof(!this.state.readable()); - stream.as_mut_pin().poll_shutdown(cx) - } -} - -#[cfg(unix)] -impl AsRawFd for TlsStream -where - IO: AsRawFd, -{ - fn as_raw_fd(&self) -> RawFd { - self.get_ref().0.as_raw_fd() - } -} - -#[cfg(windows)] -impl AsRawSocket for TlsStream -where - IO: AsRawSocket, -{ - fn as_raw_socket(&self) -> RawSocket { - self.get_ref().0.as_raw_socket() - } -} diff -Nru temporalio-1.3.0/vendor/tokio-rustls-0.23.4/tests/badssl.rs temporalio-1.3.0/vendor/tokio-rustls-0.23.4/tests/badssl.rs --- temporalio-1.3.0/vendor/tokio-rustls-0.23.4/tests/badssl.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio-rustls-0.23.4/tests/badssl.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,97 +0,0 @@ -use std::convert::TryFrom; -use std::io; -use std::net::ToSocketAddrs; -use std::sync::Arc; -use tokio::io::{AsyncReadExt, AsyncWriteExt}; -use tokio::net::TcpStream; -use tokio_rustls::{ - client::TlsStream, - rustls::{self, ClientConfig, OwnedTrustAnchor}, - TlsConnector, -}; - -async fn get( - config: Arc, - domain: &str, - port: u16, -) -> io::Result<(TlsStream, String)> { - let connector = TlsConnector::from(config); - let input = format!("GET / HTTP/1.0\r\nHost: {}\r\n\r\n", domain); - - let addr = (domain, port).to_socket_addrs()?.next().unwrap(); - let domain = rustls::ServerName::try_from(domain).unwrap(); - let mut buf = Vec::new(); - - let stream = TcpStream::connect(&addr).await?; - let mut stream = connector.connect(domain, stream).await?; - stream.write_all(input.as_bytes()).await?; - stream.flush().await?; - stream.read_to_end(&mut buf).await?; - - Ok((stream, String::from_utf8(buf).unwrap())) -} - -#[tokio::test] -async fn test_tls12() -> io::Result<()> { - let mut root_store = rustls::RootCertStore::empty(); - root_store.add_server_trust_anchors(webpki_roots::TLS_SERVER_ROOTS.0.iter().map(|ta| { - OwnedTrustAnchor::from_subject_spki_name_constraints( - ta.subject, - ta.spki, - ta.name_constraints, - ) - })); - let config = rustls::ClientConfig::builder() - .with_safe_default_cipher_suites() - .with_safe_default_kx_groups() - .with_protocol_versions(&[&rustls::version::TLS12]) - .unwrap() - .with_root_certificates(root_store) - .with_no_client_auth(); - - let config = Arc::new(config); - let domain = "tls-v1-2.badssl.com"; - - let (_, output) = get(config.clone(), domain, 1012).await?; - assert!( - output.contains("tls-v1-2.badssl.com"), - "failed badssl test, output: {}", - output - ); - - Ok(()) -} - -#[ignore] -#[should_panic] -#[test] -fn test_tls13() { - unimplemented!("todo https://github.com/chromium/badssl.com/pull/373"); -} - -#[tokio::test] -async fn test_modern() -> io::Result<()> { - let mut root_store = rustls::RootCertStore::empty(); - root_store.add_server_trust_anchors(webpki_roots::TLS_SERVER_ROOTS.0.iter().map(|ta| { - OwnedTrustAnchor::from_subject_spki_name_constraints( - ta.subject, - ta.spki, - ta.name_constraints, - ) - })); - let config = rustls::ClientConfig::builder() - .with_safe_defaults() - .with_root_certificates(root_store) - .with_no_client_auth(); - let config = Arc::new(config); - let domain = "mozilla-modern.badssl.com"; - - let (_, output) = get(config.clone(), domain, 443).await?; - assert!( - output.contains("mozilla-modern.badssl.com"), - "failed badssl test, output: {}", - output - ); - - Ok(()) -} diff -Nru temporalio-1.3.0/vendor/tokio-rustls-0.23.4/tests/early-data.rs temporalio-1.3.0/vendor/tokio-rustls-0.23.4/tests/early-data.rs --- temporalio-1.3.0/vendor/tokio-rustls-0.23.4/tests/early-data.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio-rustls-0.23.4/tests/early-data.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,161 +0,0 @@ -#![cfg(feature = "early-data")] - -use futures_util::{future, future::Future, ready}; -use rustls::RootCertStore; -use std::convert::TryFrom; -use std::io::{self, BufRead, BufReader, Cursor}; -use std::net::SocketAddr; -use std::pin::Pin; -use std::process::{Child, Command, Stdio}; -use std::sync::Arc; -use std::task::{Context, Poll}; -use std::time::Duration; -use tokio::io::{split, AsyncRead, AsyncWriteExt, ReadBuf}; -use tokio::net::TcpStream; -use tokio::sync::oneshot; -use tokio::time::sleep; -use tokio_rustls::{ - client::TlsStream, - rustls::{self, ClientConfig, OwnedTrustAnchor}, - TlsConnector, -}; - -struct Read1(T); - -impl Future for Read1 { - type Output = io::Result<()>; - - fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { - let mut buf = [0]; - let mut buf = ReadBuf::new(&mut buf); - - ready!(Pin::new(&mut self.0).poll_read(cx, &mut buf))?; - - if buf.filled().is_empty() { - Poll::Ready(Ok(())) - } else { - Poll::Pending - } - } -} - -async fn send( - config: Arc, - addr: SocketAddr, - data: &[u8], -) -> io::Result> { - let connector = TlsConnector::from(config).early_data(true); - let stream = TcpStream::connect(&addr).await?; - let domain = rustls::ServerName::try_from("testserver.com").unwrap(); - - let stream = connector.connect(domain, stream).await?; - let (mut rd, mut wd) = split(stream); - let (notify, wait) = oneshot::channel(); - - let j = tokio::spawn(async move { - // read to eof - // - // see https://www.mail-archive.com/openssl-users@openssl.org/msg84451.html - let mut read_task = Read1(&mut rd); - let mut notify = Some(notify); - - // read once, then write - // - // this is a regression test, see https://github.com/tokio-rs/tls/issues/54 - future::poll_fn(|cx| { - let ret = Pin::new(&mut read_task).poll(cx)?; - assert_eq!(ret, Poll::Pending); - - notify.take().unwrap().send(()).unwrap(); - - Poll::Ready(Ok(())) as Poll> - }) - .await?; - - match read_task.await { - Ok(()) => (), - Err(ref err) if err.kind() == io::ErrorKind::UnexpectedEof => (), - Err(err) => return Err(err.into()), - } - - Ok(rd) as io::Result<_> - }); - - wait.await.unwrap(); - - wd.write_all(data).await?; - wd.flush().await?; - wd.shutdown().await?; - - let rd: tokio::io::ReadHalf<_> = j.await??; - - Ok(rd.unsplit(wd)) -} - -struct DropKill(Child); - -impl Drop for DropKill { - fn drop(&mut self) { - self.0.kill().unwrap(); - } -} - -#[tokio::test] -async fn test_0rtt() -> io::Result<()> { - let mut handle = Command::new("openssl") - .arg("s_server") - .arg("-early_data") - .arg("-tls1_3") - .args(&["-cert", "./tests/end.cert"]) - .args(&["-key", "./tests/end.rsa"]) - .args(&["-port", "12354"]) - .stdin(Stdio::piped()) - .stdout(Stdio::piped()) - .spawn() - .map(DropKill)?; - - // wait openssl server - sleep(Duration::from_secs(1)).await; - - let mut chain = BufReader::new(Cursor::new(include_str!("end.chain"))); - let certs = rustls_pemfile::certs(&mut chain).unwrap(); - let trust_anchors = certs - .iter() - .map(|cert| { - let ta = webpki::TrustAnchor::try_from_cert_der(&cert[..]).unwrap(); - OwnedTrustAnchor::from_subject_spki_name_constraints( - ta.subject, - ta.spki, - ta.name_constraints, - ) - }) - .collect::>(); - let mut root_store = RootCertStore::empty(); - root_store.add_server_trust_anchors(trust_anchors.into_iter()); - let mut config = rustls::ClientConfig::builder() - .with_safe_default_cipher_suites() - .with_safe_default_kx_groups() - .with_protocol_versions(&[&rustls::version::TLS13]) - .unwrap() - .with_root_certificates(root_store) - .with_no_client_auth(); - config.enable_early_data = true; - let config = Arc::new(config); - let addr = SocketAddr::from(([127, 0, 0, 1], 12354)); - - let io = send(config.clone(), addr, b"hello").await?; - assert!(!io.get_ref().1.is_early_data_accepted()); - - let io = send(config, addr, b"world!").await?; - assert!(io.get_ref().1.is_early_data_accepted()); - - let stdout = handle.0.stdout.as_mut().unwrap(); - let mut lines = BufReader::new(stdout).lines(); - - let has_msg1 = lines.by_ref().any(|line| line.unwrap().contains("hello")); - let has_msg2 = lines.by_ref().any(|line| line.unwrap().contains("world!")); - - assert!(has_msg1 && has_msg2); - - Ok(()) -} diff -Nru temporalio-1.3.0/vendor/tokio-rustls-0.23.4/tests/end.cert temporalio-1.3.0/vendor/tokio-rustls-0.23.4/tests/end.cert --- temporalio-1.3.0/vendor/tokio-rustls-0.23.4/tests/end.cert 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio-rustls-0.23.4/tests/end.cert 1970-01-01 00:00:00.000000000 +0000 @@ -1,24 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIEADCCAmigAwIBAgICAcgwDQYJKoZIhvcNAQELBQAwLDEqMCgGA1UEAwwhcG9u -eXRvd24gUlNBIGxldmVsIDIgaW50ZXJtZWRpYXRlMB4XDTE2MTIxMDE3NDIzM1oX -DTIyMDYwMjE3NDIzM1owGTEXMBUGA1UEAwwOdGVzdHNlcnZlci5jb20wggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC1YDz66+7VD4DL1+/sVHMQ+BbDRgmD -OQlX++mfW8D3QNQm/qDBEbu7T7qqdc9GKDar4WIzBN8SBkzM1EjMGwNnZPV/Tfz0 -qUAR1L/7Zzf1GaFZvWXgksyUpfwvmprH3Iy/dpkETwtPthpTPNlui3hZnm/5kkjR -RWg9HmID4O04Ld6SK313v2ZgrPZbkKvbqlqhUnYWjL3blKVGbpXIsuZzEU9Ph+gH -tPcEhZpFsM6eLe+2TVscIrycMEOTXqAAmO6zZ9sQWtfllu3CElm904H6+jA/9Leg -al72pMmkYr8wWniqDDuijXuCPlVx5EDFFyxBmW18UeDEQaKV3kNfelaTAgMBAAGj -gb4wgbswDAYDVR0TAQH/BAIwADALBgNVHQ8EBAMCBsAwHQYDVR0OBBYEFIYhJkVy -AAKT6cY/ruH1Eu+NNxteMEIGA1UdIwQ7MDmAFNwuPy4Do//Sm5CZDrocHWTrNr96 -oR6kHDAaMRgwFgYDVQQDDA9wb255dG93biBSU0EgQ0GCAXswOwYDVR0RBDQwMoIO -dGVzdHNlcnZlci5jb22CFXNlY29uZC50ZXN0c2VydmVyLmNvbYIJbG9jYWxob3N0 -MA0GCSqGSIb3DQEBCwUAA4IBgQCWV76jfQDZKtfmj45fTwZzoe/PxjWPRbAvSEnt -LRHrPhqQfpMLqpun8uu/w86mHiR/AmiAySMu3zivW6wfGzlRWLi/zCyO6r9LGsgH -bNk5CF642cdZFvn1SiSm1oGXQrolIpcyXu88nUpt74RnY4ETCC1dRQKqxsYufe5T -DOmTm3ChinNW4QRG3yvW6DVuyxVAgZvofyKJOsM3GO6oogIM41aBqZ3UTwmIwp6D -oISdiATslFOzYzjnyXNR8DG8OOkv1ehWuyb8x+hQCZAuogQOWYtCSd6k3kKgd0EM -4CWbt1XDV9ZJwBf2uxZeKuCu/KIy9auNtijAwPsUv9qxuzko018zhl3lWm5p2Sqw -O7fFshU3A6df8hMw7ST6/tgFY7geT88U4iJhfWMwr/CZSRSVMXhTyJgbLIXxKYZj -Ym5v4NAIQP6hI4HixzQaYgrhW6YX6myk+emMjQLRJHT8uHvmT7fuxMJVWWgsCkr1 -C75pRQEagykN/Uzr5e6Tm8sVu88= ------END CERTIFICATE----- diff -Nru temporalio-1.3.0/vendor/tokio-rustls-0.23.4/tests/end.chain temporalio-1.3.0/vendor/tokio-rustls-0.23.4/tests/end.chain --- temporalio-1.3.0/vendor/tokio-rustls-0.23.4/tests/end.chain 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio-rustls-0.23.4/tests/end.chain 1970-01-01 00:00:00.000000000 +0000 @@ -1,89 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIGnzCCAoegAwIBAgIBezANBgkqhkiG9w0BAQsFADAaMRgwFgYDVQQDDA9wb255 -dG93biBSU0EgQ0EwHhcNMTYxMjEwMTc0MjMzWhcNMjYxMjA4MTc0MjMzWjAsMSow -KAYDVQQDDCFwb255dG93biBSU0EgbGV2ZWwgMiBpbnRlcm1lZGlhdGUwggGiMA0G -CSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQDnfb7vaJbaHEyVTflswWhmHqx5W0NO -KyKbDp2zXEJwDO+NDJq6i1HGnFd/vO4LyjJBU1wUsKtE+m55cfRmUHVuZ2w4n/VF -p7Z7n+SNuvJNcrzDxyKVy4GIZ39zQePnniqtLqXh6eI8Ow6jiMgVxC/wbWcVLKv6 -4RM+2fLjJAC9b27QfjhOlMKVeMOEvPrrpjLSauaHAktQPhuzIAwzxM0+KnvDkWWy -NVqAV/lq6fSO/9vJRhM4E2nxo6yqi7qTdxVxMmKsNn7L6HvjQgx+FXziAUs55Qd9 -cP7etCmPmoefkcgdbxDOIKH8D+DvfacZwngqcnr/q96Ff4uJ13d2OzR1mWVSZ2hE -JQt/BbZBANciqu9OZf3dj6uOOXgFF705ak0GfLtpZpc29M+fVnknXPDSiKFqjzOO -KL+SRGyuNc9ZYjBKkXPJ1OToAs6JSvgDxfOfX0thuo2rslqfpj2qCFugsRIRAqvb -eyFwg+BPM/P/EfauXlAcQtBF04fOi7xN2okCAwEAAaNeMFwwHQYDVR0OBBYEFNwu -Py4Do//Sm5CZDrocHWTrNr96MCAGA1UdJQEB/wQWMBQGCCsGAQUFBwMBBggrBgEF -BQcDAjAMBgNVHRMEBTADAQH/MAsGA1UdDwQEAwIB/jANBgkqhkiG9w0BAQsFAAOC -BAEAMHZpBqDIUAVFZNw4XbuimXQ4K8q4uePrLGHLb4F/gHbr8kYrU4H+cy4l+xXf -2dlEBdZoqjSF7uXzQg5Fd8Ff3ZgutXd1xeUJnxo0VdpKIhqeaTPqhffC2X6FQQH5 -KrN7NVWQSnUhPNpBFELpmdpY1lHigFW7nytYj0C6VJ4QsbqhfW+n/t+Zgqtfh/Od -ZbclzxFwMM55zRA2HP6IwXS2+d61Jk/RpDHTzhWdjGH4906zGNNMa7slHpCTA9Ju -TrtjEAGt2PBSievBJOHZW80KVAoEX2n9B3ZABaz+uX0VVZG0D2FwhPpUeA57YiXu -qiktZR4Ankph3LabXp4IlAX16qpYsEW8TWE/HLreeqoM0WDoI6rF9qnTpV2KWqBf -ziMYkfSkT7hQ2bWc493lW+QwSxCsuBsDwlrCwAl6jFSf1+jEQx98/8n9rDNyD9dL -PvECmtF30WY98nwZ9/kO2DufQrd0mwSHcIT0pAwl5fimpkwTjj+TTbytO3M4jK5L -tuIzsViQ95BmJQ3XuLdkQ/Ug8rpECYRX5fQX1qXkkvl920ohpKqKyEji1OmfmJ0Z -tZChaEcu3Mp3U+gD4az2ogmle3i/Phz8ZEPFo4/21G5Qd72z0lBgaQIeyyCk5MHt -Yg0vA7X0/w4bz+OJv5tf7zJsPCYSprr+c/7YUJk9Fqu6+g9ZAavI99xFKdGhz4Og -w0trnKNCxYc6+NPopTDbXuY+fo4DK7C0CSae5sKs7013Ne6w4KvgfLKpvlemkGfg -ZA3+1FMXVfFIEH7Cw9cx6F02Sr3k1VrU68oM3wH5nvTUkELOf8nRMlzliQjVCpKB -yFSe9dzRVSFEbMDxChiEulGgNUHj/6wwpg0ZmCwPRHutppT3jkfEqizN5iHb69GH -k6kol6knJofkaL656Q3Oc9o0ZrMlFh1RwmOvAk5fVK0/CV88/phROz2Wdmy5Bz4a -t0vzqFWA54y6+9EEVoOk9SU0CYfpGtpX4URjLK1EUG/l+RR3366Uee6TPrtEZ9cg -56VQMxhSaRNAvJ6DfiSuscSCNJzwuXaMXSZydGYnnP9Tb9p6c1uy1sXdluZkBIcK -CgC+gdDMSNlDn9ghc4xZGkuA8bjzfAYuRuGKmfTt8uuklkjw2b9w3SHjC4/Cmd2W -cFRnzfg2oL6e78hNg2ZGgsLzvb6Lu6/5IhXCO7RitzYf2+HLBbc+YLFsnG3qeGe1 -28yGnXOQd97Cr4+IzFucVy/33gMQkesNUSDFJSq1gE/hGrMgTTMQJ7yC3PRqg0kG -tpqTyKNdM0g1adxlR1qfDPvpUBApkgBbySnMyWEr5+tBuoHUtH2m49oV9YD4odMJ -yJjlGxituO/YNN6O8oANlraG1Q== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIJBzCCBO+gAwIBAgIJAN7WS1mRS9A+MA0GCSqGSIb3DQEBCwUAMBoxGDAWBgNV -BAMMD3Bvbnl0b3duIFJTQSBDQTAeFw0xNjEyMTAxNzQyMzNaFw0yNjEyMDgxNzQy -MzNaMBoxGDAWBgNVBAMMD3Bvbnl0b3duIFJTQSBDQTCCBCIwDQYJKoZIhvcNAQEB -BQADggQPADCCBAoCggQBAMNEzJ7aNdD2JSk9+NF9Hh2za9OQnt1d/7j6DtE3ieoT -ms8mMSXzoImXZayZ9Glx3yx/RhEb2vmINyb0vRUM4I/GH+XHdOBcs9kaJNv/Mpw4 -Ggd4e1LUqV1pzNrhYwRrTQTKyaDiDX2WEBNfQaaYnHltmSmsfyt3Klj+IMc6CyqV -q8SOQ6Go414Vn++Jj7p3E6owdwuvSvO8ERLobiA6vYB+qrS7E48c4zRIAFIO4uwt -g4TiCJLLWc1fRSoqGGX7KS+LzQF8Pq67IOHVna4e9peSe6nQnm0LQZAmaosYHvF4 -AX0Bj6TLv9PXCAGtB7Pciev5Br0tRZEdVyYfmwiVKUWcp77TghV3W+VaJVhPh5LN -X91ktvpeYek3uglqv2ZHtSG2S1KkBtTkbMOD+a2BEUfq0c0+BIsj6jdvt4cvIfet -4gUOxCvYMBs4/dmNT1zoe/kJ0lf8YXYLsXwVWdIW3jEE8QdkLtLI9XfyU9OKLZuD -mmoAf7ezvv/T3nKLFqhcwUFGgGtCIX+oWC16XSbDPBcKDBwNZn8C49b7BLdxqAg3 -msfxwhYzSs9F1MXt/h2dh7FVmkCSxtgNDX3NJn5/yT6USws2y0AS5vXVP9hRf0NV -KfKn9XlmHCxnZExwm68uZkUUYHB05jSWFojbfWE+Mf9djUeQ4FuwusztZdbyQ4yS -mMtBXO0I6SQBmjCoOa1ySW3DTuw/eKCfq+PoxqWD434bYA9nUa+pE27MP7GLyjCS -6+ED3MACizSF0YxkcC9pWUo4L5FKp+DxnNbtzMIILnsDZTVHOvKUy/gjTyTWm/+7 -2t98l7vBE8gn3Aux0V5WFe2uZIZ07wIi/OThoBO8mpt9Bm5cJTG07JStKEXX/UH1 -nL7cDZ2V5qbf4hJdDy4qixxxIZtmf//1BRlVQ9iYTOsMoy+36DXWbc3vSmjRefW1 -YENt4zxOPe4LUq2Z+LXq1OgVQrHrVevux0vieys7Rr2gA1sH8FaaNwTr7Q8dq+Av -Evk+iOUH4FuYorU1HuGHPkAkvLWosVwlB+VhfEai0V6+PmttmaOnCJNHfFTu5wCu -B9CFJ1tdzTzAbrLwgtWmO70KV7CfZPHO7lMWhSvplU0i5T9WytxP91IoFtXwRSO8 -+Ghyu0ynB3HywCH2dez89Vy903P6PEU0qTnYWRz6D/wi5+yHHNrm9CilWurs/Qex -kyB7lLD7Cb1JJc8QIFTqT6vj+cids3xd245hUdpFyZTX99YbF6IkiB2zGi5wvUmP -f1GPvkTLb7eF7bne9OClEjEqvc0hVJ2abO2WXkqxlQFEYZHNofm+y6bnby/BZZJo -beaSFcLOCe2Z8iZvVnzfHBCeLyWE89gc94z784S3LEsCAwEAAaNQME4wHQYDVR0O -BBYEFNz2wEPCQbx9OdRCNE4eALwHJfIgMB8GA1UdIwQYMBaAFNz2wEPCQbx9OdRC -NE4eALwHJfIgMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQELBQADggQBACbm2YX7 -sBG0Aslj36gmVlCTTluNg2tuK2isHbK3YhNwujrH/o/o2OV7UeUkZkPwE4g4/SjC -OwDWYniRNyDKBOeD9Q0XxR5z5IZQO+pRVvXF8DXO6kygWCOJM9XheKxp9Uke0aDg -m8F02NslKLUdy7piGlLSz1sgdjiE3izIwFZRpZY7sMozNWWvSAmzprbkE78LghIm -VEydQzIQlr5soWqc65uFLNbEA6QBPoFc6dDW+mnzXf8nrZUM03CACxAsuq/YkjRp -OHgwgfdNRdlu4YhZtuQNak4BUvDmigTGxDC+aMJw0ldL1bLtqLG6BvQbyLNPOOfo -5S8lGh4y06gb//052xHaqtCh5Ax5sHUE5By6wKHAKbuJy26qyKfaRoc3Jigs4Fd5 -3CuoDWHbyXfkgKiU+sc+1mvCxQKFRJ2fpGEFP8iEcLvdUae7ZkRM4Kb0vST+QhQV -fDaFkM3Bwqtui5YaZ6cHHQVyXQdujCmfesoZXKil2yduQ3KWgePjewzRV+aDWMzk -qKaF+TRANSqWbBU6JTwwQ4veKQThU3ir7nS2ovdPbhNS/FnWoKodj6eaqXfdYuBh -XOXLewIF568MJsLOuBubeAO2a9LOlhnv6eLGp2P4M7vwEdN/LRRQtwBBmqq8C3h+ -ewrJP12B/ag0bJDi9vCgPhYtDEpjpfsnxZEIqVZwshJ/MqXykFp2kYk62ylyfDWq -veI/aHwpzT2k+4CI/XmPWXl9NlI50HPdpcwCBDy8xVHwb/x7stNgQdIhaj9tzmKa -S+eqitclc8Iqrbd523H//QDzm8yiqRZUdveNa9gioTMErR0ujCpK8tO8mVZcVfNX -i1/Vsar5++nXcPhxKsd1t8XV2dk3gUZIfMgzLLzs+KSiFg+bT3c7LkCd+I3w30Iv -fh9cxFBAyYO9giwxaCfJgoz7OYqaHOOtASF85UV7gK9ELT7/z+RAcS/UfY1xbd54 -hIi1vRZj8lfkAYNtnYlud44joi1BvW/GZGFCiJ13SSvfHNs9v/5xguyCSgyCc0qx -ZkN/fzj/5wFQbxSl3MPn/JrsvlH6wvJht1SA50uVdUvJ5e5V8EgLYfMqlJNNpTHP -wZcHF+Dw126oyu2KhUxD126Gusxp+tV6I0EEZnVwwduFQWq9xm/gT+qohpveeylf -Q2XGz56DF2udJJnSFGSqzQOl9XopNC/4ecBMwIzqdFSpaWgK3VNAcigyDajgoE4v -ZuiVDEiLhLowZvi1V8GOWzcka7R2BQBjhOLWByQGDcm8cOMS7w8oCSQCaYmJyHvE -tTHq7fX6/sXv0AJqM3ysSdU01IVBNahnr5WEkmQMaFF0DGvRfqkVdKcChwrKv7r2 -DLxargy39i2aQGg= ------END CERTIFICATE----- diff -Nru temporalio-1.3.0/vendor/tokio-rustls-0.23.4/tests/end.rsa temporalio-1.3.0/vendor/tokio-rustls-0.23.4/tests/end.rsa --- temporalio-1.3.0/vendor/tokio-rustls-0.23.4/tests/end.rsa 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio-rustls-0.23.4/tests/end.rsa 1970-01-01 00:00:00.000000000 +0000 @@ -1,27 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIIEogIBAAKCAQEAtWA8+uvu1Q+Ay9fv7FRzEPgWw0YJgzkJV/vpn1vA90DUJv6g -wRG7u0+6qnXPRig2q+FiMwTfEgZMzNRIzBsDZ2T1f0389KlAEdS/+2c39RmhWb1l -4JLMlKX8L5qax9yMv3aZBE8LT7YaUzzZbot4WZ5v+ZJI0UVoPR5iA+DtOC3ekit9 -d79mYKz2W5Cr26paoVJ2Foy925SlRm6VyLLmcxFPT4foB7T3BIWaRbDOni3vtk1b -HCK8nDBDk16gAJjus2fbEFrX5ZbtwhJZvdOB+vowP/S3oGpe9qTJpGK/MFp4qgw7 -oo17gj5VceRAxRcsQZltfFHgxEGild5DX3pWkwIDAQABAoIBAFDTazlSbGML/pRY -TTWeyIw2UkaA7npIr45C13BJfitw+1nJPK/tDCDDveZ6i3yzLPHZhV5A/HtWzWC1 -9R7nptOrnO83PNN2nPOVQFxzOe+ClXGdQkoagQp5EXHRTspj0WD9I+FUrDDAcOjJ -BAgMJPyi6zlnZAXGDVa3NGyQDoZqwU2k36L4rEsJIkG0NVurZhpiCexNkkf32495 -TOINQ0iKdfJ4iZoEYQ9G+x4NiuAJRCHuIcH76SNfT+Uv3wX0ut5EFPtflnvtdgcp -QVcoKwYdO0+mgO5xqWlBcsujSvgBdiNAGnAxKHWiEaacuIJi4+yYovyEebP6QI2X -Zg/U2wkCgYEA794dE5CPXLOmv6nioVC/ubOESk7vjSlEka/XFbKr4EY794YEqrB1 -8TUqg09Bn3396AS1e6P2shr3bxos5ybhOxDGSLnJ+aC0tRFjd1BPKnA80vZM7ggt -5cjmdD5Zp0tIQTIAAYU5bONQOwj0ej4PE7lny26eLa5vfvCwlrD+rM0CgYEAwZMN -W/5PA2A+EM08IaHic8my0dCunrNLF890ouZnDG99SbgMGvvEsGIcCP1sai702hNh -VgGDxCz6/HUy+4O4YNFVtjY7uGEpfIEcEI7CsLQRP2ggWEFxThZtnEtO8PbM3J/i -qcS6njHdE+0XuCjgZwGgva5xH2pkWFzw/AIpEN8CgYB2HOo2axWc8T2n3TCifI+c -EqCOsqXU3cBM+MgxgASQcCUxMkX0AuZguuxPMmS+85xmdoMi+c8NTqgOhlYcEJIR -sqXgw9OH3zF8g6513w7Md+4Ld4rUHyTypGWOUfF1pmVS7RsBpKdtTdWA7FzuIMbt -0HsiujqbheyTFlPuMAOH9QKBgBWS1gJSrWuq5j/pH7J/4EUXTZ6kq1F0mgHlVRJy -qzlvk38LzA2V0a32wTkfRV3wLcnALzDuqkjK2o4YYb42R+5CZlMQaEd8TKtbmE0g -HAKljuaKLFCpun8BcOXiXsHsP5i3GQPisQnAdOsrmWEk7R2NyORa9LCToutWMGVl -uD3xAoGAA183Vldm+m4KPsKS17t8MbwBryDXvowGzruh/Z+PGA0spr+ke4XxwT1y -kMMP1+5flzmjlAf4+W8LehKuVqvQoMlPn5UVHmSxQ7cGx/O/o6Gbn8Q25/6UT+sM -B1Y0rlLoKG62pnkeXp1O4I57gnClatWRg5qw11a8V8e3jvDKIYM= ------END RSA PRIVATE KEY----- diff -Nru temporalio-1.3.0/vendor/tokio-rustls-0.23.4/tests/test.rs temporalio-1.3.0/vendor/tokio-rustls-0.23.4/tests/test.rs --- temporalio-1.3.0/vendor/tokio-rustls-0.23.4/tests/test.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio-rustls-0.23.4/tests/test.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,225 +0,0 @@ -use futures_util::future::TryFutureExt; -use lazy_static::lazy_static; -use rustls::{ClientConfig, OwnedTrustAnchor}; -use rustls_pemfile::{certs, rsa_private_keys}; -use std::convert::TryFrom; -use std::io::{BufReader, Cursor, ErrorKind}; -use std::net::SocketAddr; -use std::sync::mpsc::channel; -use std::sync::Arc; -use std::time::Duration; -use std::{io, thread}; -use tokio::io::{copy, split, AsyncReadExt, AsyncWriteExt}; -use tokio::net::{TcpListener, TcpStream}; -use tokio::{runtime, time}; -use tokio_rustls::{LazyConfigAcceptor, TlsAcceptor, TlsConnector}; - -const CERT: &str = include_str!("end.cert"); -const CHAIN: &[u8] = include_bytes!("end.chain"); -const RSA: &str = include_str!("end.rsa"); - -lazy_static! { - static ref TEST_SERVER: (SocketAddr, &'static str, &'static [u8]) = { - let cert = certs(&mut BufReader::new(Cursor::new(CERT))) - .unwrap() - .drain(..) - .map(rustls::Certificate) - .collect(); - let mut keys = rsa_private_keys(&mut BufReader::new(Cursor::new(RSA))).unwrap(); - let mut keys = keys.drain(..).map(rustls::PrivateKey); - - let config = rustls::ServerConfig::builder() - .with_safe_defaults() - .with_no_client_auth() - .with_single_cert(cert, keys.next().unwrap()) - .unwrap(); - let acceptor = TlsAcceptor::from(Arc::new(config)); - - let (send, recv) = channel(); - - thread::spawn(move || { - let runtime = runtime::Builder::new_current_thread() - .enable_io() - .build() - .unwrap(); - let runtime = Arc::new(runtime); - let runtime2 = runtime.clone(); - - let done = async move { - let addr = SocketAddr::from(([127, 0, 0, 1], 0)); - let listener = TcpListener::bind(&addr).await?; - - send.send(listener.local_addr()?).unwrap(); - - loop { - let (stream, _) = listener.accept().await?; - - let acceptor = acceptor.clone(); - let fut = async move { - let stream = acceptor.accept(stream).await?; - - let (mut reader, mut writer) = split(stream); - copy(&mut reader, &mut writer).await?; - - Ok(()) as io::Result<()> - } - .unwrap_or_else(|err| eprintln!("server: {:?}", err)); - - runtime2.spawn(fut); - } - } - .unwrap_or_else(|err: io::Error| eprintln!("server: {:?}", err)); - - runtime.block_on(done); - }); - - let addr = recv.recv().unwrap(); - (addr, "testserver.com", CHAIN) - }; -} - -fn start_server() -> &'static (SocketAddr, &'static str, &'static [u8]) { - &*TEST_SERVER -} - -async fn start_client(addr: SocketAddr, domain: &str, config: Arc) -> io::Result<()> { - const FILE: &[u8] = include_bytes!("../README.md"); - - let domain = rustls::ServerName::try_from(domain).unwrap(); - let config = TlsConnector::from(config); - let mut buf = vec![0; FILE.len()]; - - let stream = TcpStream::connect(&addr).await?; - let mut stream = config.connect(domain, stream).await?; - stream.write_all(FILE).await?; - stream.flush().await?; - stream.read_exact(&mut buf).await?; - - assert_eq!(buf, FILE); - - Ok(()) -} - -#[tokio::test] -async fn pass() -> io::Result<()> { - let (addr, domain, chain) = start_server(); - - // TODO: not sure how to resolve this right now but since - // TcpStream::bind now returns a future it creates a race - // condition until its ready sometimes. - use std::time::*; - tokio::time::sleep(Duration::from_secs(1)).await; - - let chain = certs(&mut std::io::Cursor::new(*chain)).unwrap(); - let trust_anchors = chain - .iter() - .map(|cert| { - let ta = webpki::TrustAnchor::try_from_cert_der(&cert[..]).unwrap(); - OwnedTrustAnchor::from_subject_spki_name_constraints( - ta.subject, - ta.spki, - ta.name_constraints, - ) - }) - .collect::>(); - let mut root_store = rustls::RootCertStore::empty(); - root_store.add_server_trust_anchors(trust_anchors.into_iter()); - let config = rustls::ClientConfig::builder() - .with_safe_defaults() - .with_root_certificates(root_store) - .with_no_client_auth(); - let config = Arc::new(config); - - start_client(*addr, domain, config).await?; - - Ok(()) -} - -#[tokio::test] -async fn fail() -> io::Result<()> { - let (addr, domain, chain) = start_server(); - - let chain = certs(&mut std::io::Cursor::new(*chain)).unwrap(); - let trust_anchors = chain - .iter() - .map(|cert| { - let ta = webpki::TrustAnchor::try_from_cert_der(&cert[..]).unwrap(); - OwnedTrustAnchor::from_subject_spki_name_constraints( - ta.subject, - ta.spki, - ta.name_constraints, - ) - }) - .collect::>(); - let mut root_store = rustls::RootCertStore::empty(); - root_store.add_server_trust_anchors(trust_anchors.into_iter()); - let config = rustls::ClientConfig::builder() - .with_safe_defaults() - .with_root_certificates(root_store) - .with_no_client_auth(); - let config = Arc::new(config); - - assert_ne!(domain, &"google.com"); - let ret = start_client(*addr, "google.com", config).await; - assert!(ret.is_err()); - - Ok(()) -} - -#[tokio::test] -async fn test_lazy_config_acceptor() -> io::Result<()> { - let (sconfig, cconfig) = utils::make_configs(); - use std::convert::TryFrom; - - let (cstream, sstream) = tokio::io::duplex(1200); - let domain = rustls::ServerName::try_from("localhost").unwrap(); - tokio::spawn(async move { - let connector = crate::TlsConnector::from(cconfig); - let mut client = connector.connect(domain, cstream).await.unwrap(); - client.write_all(b"hello, world!").await.unwrap(); - - let mut buf = Vec::new(); - client.read_to_end(&mut buf).await.unwrap(); - }); - - let acceptor = LazyConfigAcceptor::new(rustls::server::Acceptor::new().unwrap(), sstream); - let start = acceptor.await.unwrap(); - let ch = start.client_hello(); - - assert_eq!(ch.server_name(), Some("localhost")); - assert_eq!( - ch.alpn() - .map(|protos| protos.collect::>()) - .unwrap_or(Vec::new()), - Vec::<&[u8]>::new() - ); - - let mut stream = start.into_stream(sconfig).await.unwrap(); - let mut buf = [0; 13]; - stream.read_exact(&mut buf).await.unwrap(); - assert_eq!(&buf[..], b"hello, world!"); - - stream.write_all(b"bye").await.unwrap(); - Ok(()) -} - -// This test is a follow-up from https://github.com/tokio-rs/tls/issues/85 -#[tokio::test] -async fn lazy_config_acceptor_eof() { - let buf = Cursor::new(Vec::new()); - let acceptor = LazyConfigAcceptor::new(rustls::server::Acceptor::new().unwrap(), buf); - - let accept_result = match time::timeout(Duration::from_secs(3), acceptor).await { - Ok(res) => res, - Err(_elapsed) => panic!("timeout"), - }; - - match accept_result { - Ok(_) => panic!("accepted a connection from zero bytes of data"), - Err(e) if e.kind() == ErrorKind::UnexpectedEof => {} - Err(e) => panic!("unexpected error: {:?}", e), - } -} - -// Include `utils` module -include!("utils.rs"); diff -Nru temporalio-1.3.0/vendor/tokio-rustls-0.23.4/tests/utils.rs temporalio-1.3.0/vendor/tokio-rustls-0.23.4/tests/utils.rs --- temporalio-1.3.0/vendor/tokio-rustls-0.23.4/tests/utils.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio-rustls-0.23.4/tests/utils.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,49 +0,0 @@ -mod utils { - use std::io::{BufReader, Cursor}; - use std::sync::Arc; - - use rustls::{ClientConfig, OwnedTrustAnchor, PrivateKey, RootCertStore, ServerConfig}; - use rustls_pemfile::{certs, rsa_private_keys}; - - #[allow(dead_code)] - pub fn make_configs() -> (Arc, Arc) { - const CERT: &str = include_str!("end.cert"); - const CHAIN: &str = include_str!("end.chain"); - const RSA: &str = include_str!("end.rsa"); - - let cert = certs(&mut BufReader::new(Cursor::new(CERT))) - .unwrap() - .drain(..) - .map(rustls::Certificate) - .collect(); - let mut keys = rsa_private_keys(&mut BufReader::new(Cursor::new(RSA))).unwrap(); - let mut keys = keys.drain(..).map(PrivateKey); - let sconfig = ServerConfig::builder() - .with_safe_defaults() - .with_no_client_auth() - .with_single_cert(cert, keys.next().unwrap()) - .unwrap(); - - let mut client_root_cert_store = RootCertStore::empty(); - let mut chain = BufReader::new(Cursor::new(CHAIN)); - let certs = certs(&mut chain).unwrap(); - let trust_anchors = certs - .iter() - .map(|cert| { - let ta = webpki::TrustAnchor::try_from_cert_der(&cert[..]).unwrap(); - OwnedTrustAnchor::from_subject_spki_name_constraints( - ta.subject, - ta.spki, - ta.name_constraints, - ) - }) - .collect::>(); - client_root_cert_store.add_server_trust_anchors(trust_anchors.into_iter()); - let cconfig = ClientConfig::builder() - .with_safe_defaults() - .with_root_certificates(client_root_cert_store) - .with_no_client_auth(); - - (Arc::new(sconfig), Arc::new(cconfig)) - } -} diff -Nru temporalio-1.3.0/vendor/tokio-util/.cargo-checksum.json temporalio-1.3.0/vendor/tokio-util/.cargo-checksum.json --- temporalio-1.3.0/vendor/tokio-util/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio-util/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"CHANGELOG.md":"80de2bb3ff688e2f0028bfab3d868688088c42d19949252909fd02eb36eb0252","Cargo.toml":"5c78756f4694814c097e87606dc9111a0110dd88a564116478abc7574721ebfd","LICENSE":"1a594f153f129c2de7b15f3262394bdca3dcc2da40058e3ea435c8473eb1f3a0","README.md":"91c8da557ba5fbfb5a9b6e58d5efd5fd1700dd836509cf017628155c249e192c","src/cfg.rs":"800248e35ac58cbff4327959990e83783cf0e6dd82fec4ccf3fd55038a92115c","src/codec/any_delimiter_codec.rs":"66a4c3aee5328ef8a8be20a58d6ce388bda2394bc70e4800cf52e95760a22e09","src/codec/bytes_codec.rs":"e8f14a93415768f5a8736cbcc0a1684742e3be6df1a6b60cb95bd146544eee74","src/codec/decoder.rs":"6fbff2ba49a0b82dcb6159e98a2c2d61914ee88dd462a406bec347db276bb58c","src/codec/encoder.rs":"e4544af47cdde075d1238ddee9555037912089bf25ce51cb4dd6f5d4f76ecf70","src/codec/framed.rs":"4ff6098906b964b68976fdceb75d77805ea02db9cf2bb1847f186d6e89e066b8","src/codec/framed_impl.rs":"d1ee46c00f6e5f8eb8a9ba1fa629be42ad7bb89289552045cfccc4efdc22c83c","src/codec/framed_read.rs":"367cc5517513c8fe256d8175b0497402f8b18dbf596aa19e6aa0c714772f0619","src/codec/framed_write.rs":"39f416786034f0f304abe4564cc74ad6483ff816687e8ab3e1bb8d4d380b3ee2","src/codec/length_delimited.rs":"d6281740a065da788c2819cf43bc06fb28b074f84cb1b6e719e397fe856f2f5d","src/codec/lines_codec.rs":"6696f39ea78111a2457e8a95953aa02ab31dc4c851784627e16dc7998df817a3","src/codec/mod.rs":"95a11e3018bb850ff5934ef48cbc5056bdf2758d130cfa357ad406f0531946ae","src/compat.rs":"67d839dc19381915b60a3e2db8ab98ff10c3aad0c99806ded1dbb1f0bd5dd261","src/context.rs":"45a23756c6ce6b834da0f1817f556cc5bdd16412ddfc1dc9082da8a56819741a","src/either.rs":"b0bc9737bf2915b75f68276a4d178e30a492b535d85f66a567035307c330516e","src/io/copy_to_bytes.rs":"6fc04baff3c89a76ce961ebd0cf7851042fa23f0a19adc6ab86554413cfa5afd","src/io/inspect.rs":"8efc0cb90d5b595de7f12184987bbc7c6e54a8c2286056b87cab7ad742345bfd","src/io/mod.rs":"316ddd0acc608d110cf3cf803f761da9025fdfb0deed6c2713c83671719dcd66","src/io/read_buf.rs":"7043c2fbec74e548395eb2f12073c41c1b30e2f2c283b30eddfb5a16125387d0","src/io/reader_stream.rs":"98d0819ef38f94d56d7085a82d29fd83bde92a9178bebfe73c4533d0022b3d94","src/io/sink_writer.rs":"ef5010f0e6c476f094790a2f2121e444b3d2ce74ec290b3bb66a64b36daf0d59","src/io/stream_reader.rs":"a2a3aaa166faf4ad0649dcea9b98e51a4ecc7160b6fb0e4a807637e0b23248a4","src/io/sync_bridge.rs":"740a19f8b156b6d53c5810ea20a374ee4cf5fdf3b45dcfc508b9cb0baca961cd","src/lib.rs":"2b40440ac4bea5ef423becce02d00260fb622ad7d3f51d4f7319d68b31db73e4","src/loom.rs":"9028ba504687ad5ec98f3c69387bc2424ec23324b1eed3df5082a9cf23c6502e","src/net/mod.rs":"a75736c1d71408b4f5fb0f0bdcb535cc113e430a2479e01e5fca733ef3fcb15b","src/net/unix/mod.rs":"d667dbb53d7003a15a4705ca0654b35be7165b56ac0d631a23e90d18027a1a90","src/sync/cancellation_token.rs":"352ca281cfedbb37b156044183e868bd80958ab683d1bc1706f4b6371f9b121d","src/sync/cancellation_token/guard.rs":"6582ba676c4126b4fa292221f94ddcb5fd6d3e0e2a794819fa424a8f661bff8a","src/sync/cancellation_token/tree_node.rs":"adb9c752be56a4e359d43cade75aa2b4e233c882221ee652a8e1b4c2ed1422dd","src/sync/mod.rs":"b84dcc8d561b847d1ba150061a0f3114bfe237f29cdfe6efbd344c541a5eccdd","src/sync/mpsc.rs":"9c872acb9897dcb49d3bfe7c00250e55d6835780ff99d8e71d2b6c439d572d54","src/sync/poll_semaphore.rs":"2a43f1404f2697fe1b374c5a915c4d812c64540571011ccaebcc081cad4325cc","src/sync/reusable_box.rs":"491fced798b9961b1aba8d1603110584e4657f5e8f6aed0336557e7bb8c240bc","src/sync/tests/loom_cancellation_token.rs":"689a734e2600eb37fce7afacb63abd27d82e6bfb29927f4924ba323ecff22b49","src/sync/tests/mod.rs":"01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b","src/task/join_map.rs":"8ea1319923a9e2597c8f638ec8b073df9823dd38551cc4dd7173f4ea60f966fe","src/task/mod.rs":"28afbcf0197fbb354e64159f47b843865759759e2322d3e310be1d8d0cd3962c","src/task/spawn_pinned.rs":"87e2de1dc75e1843b0ec0430175769b375ca2a0880c6c31bd3757ac659b029c3","src/task/task_tracker.rs":"0d7b0dbbb2944345a7a0a15ea85e13b451958094126b420b09404990a393b543","src/time/delay_queue.rs":"ed4f5f268dee32737f8b154893d2df73e14c9d5c12458572600999bc747d7335","src/time/mod.rs":"a76126419f30539dcceb72477251de79b38fe38278ef08b0743f1f716294fd9d","src/time/wheel/level.rs":"570b90de0bdb4d4aef43343fb4916a7a92a03bf51c300a089420700f099a404d","src/time/wheel/mod.rs":"22e69c084e3766dd333f9b6e05e4d23d4ee1bbb481a6035f1c437c0c2ec66356","src/time/wheel/stack.rs":"89e7667c1e204d6c5c4305118ace261f79bbfb2604dbe88ec1dd666695d8b469","src/udp/frame.rs":"7ca0c78acf6055a2ccecec6a4d176cdfd31baa334b8a55871df9aa1685e06c44","src/udp/mod.rs":"869302c0c15eb41f7079ef12ce03fa7c889a83152282ab0b7faf73d1c092ed4e","src/util/maybe_dangling.rs":"3ded8c0dd40d694ede4ac63ffcc1584f84bf401823833debf8edea04ae01bfe1","src/util/mod.rs":"e304438739aaa11a39f52a01fb646d1a611457dbbe2008b86433debea02f8cd7","src/util/poll_buf.rs":"302d5d3b68de72ee947eeffd1be83ea13c990cad875e69079467e0152beaea7a","tests/_require_full.rs":"f8dedb6ad88884209b074ff6f5faa4979528b32653b45ab8047d2ebb28e19122","tests/codecs.rs":"493df228f9dce98de69e0afa7be491d6fe4588e7a381a7910c28f248d2d038a6","tests/compat.rs":"e6bcf51881725214773a9255871f112c675ab56fcec2d9c419fa2e6af08a2749","tests/context.rs":"12780d99f343f57f66526dc81caa8183ff4a763f9be9d0197aa3ec04fea85c63","tests/framed.rs":"4e808fbc8d601138ff787b3603a377c23b3f42b4a7b882f9a1eb8cf1234c89e3","tests/framed_read.rs":"df41071388645518cc6b0700b75dd678219214b04de42605a0122f007f4ed281","tests/framed_stream.rs":"c3118fc5db62f225ad6d97f8b32ac03812b3b68cdab7a94d189f4a4d9337f13f","tests/framed_write.rs":"6334332e15f101f7a908824ffde6d36e0090dc97794475bd9fd3370cc2fb265b","tests/io_inspect.rs":"23b5760648641aca46815f486022455847690de914d18d6c4b6877dc9e682937","tests/io_reader_stream.rs":"1c9f79782c5574c5e489e86205bdb63b332fc0e8560fc4c2d602dfc2d2741a5e","tests/io_sink_writer.rs":"797657df0470db646249dd2ffae24e15a8c24eaeccd4718c9a6d54aeccdfb3f8","tests/io_stream_reader.rs":"d86e225eafbd196be3124147b1275bed384459e7ec3e8cb21775906253f75086","tests/io_sync_bridge.rs":"33ad93b28d2b4778c3c7c129236fdf9cb06ca4ae1e4af1e0f5de7177f48149b4","tests/length_delimited.rs":"42961048556ef955e222f5a154251dc2ff3de997fe324b79d23b1898d7f06650","tests/mpsc.rs":"8356ded38ddb7be0aa47dac13b3822ba8e23baea1e887ff8e150b2a951c265bd","tests/panic.rs":"349a9bb9b362371aabd3d61161082fd752ed03c13cd7e1790779e331fd22801a","tests/poll_semaphore.rs":"e970eac2e3ebd7835dd3e1b59dd8779a51bb24011593cd7456c1d905fce7fb6f","tests/reusable_box.rs":"e37643b1bfa28c7e769e95f973686a7c30ac659484fd37d758a14e96000fd548","tests/spawn_pinned.rs":"aea2409b5f03ae976409faca153a33aac27a7465b7d3c0e4bea7a27efde1f461","tests/sync_cancellation_token.rs":"8889b95ae5d2d60d97fad791be1dff142d06b47ecf89af99e8b24dcc93ed6d9f","tests/task_join_map.rs":"f72e6012944ed040ea298c869dac5cd0662a915b8ec832a55d08478e4cee1b49","tests/task_tracker.rs":"41c7d272fb1d96d11b98ecbeb0c101cb3c60c321c01f7172360444cb9c6fa5ec","tests/time_delay_queue.rs":"f5640181f2bf9d9708156efaf8e9d11f9f3bb15afac56ccfafab5c3da09cc092","tests/udp.rs":"77e44464d99f8ee79c31e675861a2958d4c31539de9be49444e2103547fdfcca"},"package":"5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15"} \ No newline at end of file +{"files":{"CHANGELOG.md":"d42b11287bcebc10b161b467daec9b03139e7eb1c9ada81e28eaa119f1ce2d9a","Cargo.toml":"6428aed7ac9f6a6bac7f6ccfcf53ae05e13c3e51763b05bacf2928f5426552cc","LICENSE":"1a594f153f129c2de7b15f3262394bdca3dcc2da40058e3ea435c8473eb1f3a0","README.md":"91c8da557ba5fbfb5a9b6e58d5efd5fd1700dd836509cf017628155c249e192c","src/cfg.rs":"800248e35ac58cbff4327959990e83783cf0e6dd82fec4ccf3fd55038a92115c","src/codec/any_delimiter_codec.rs":"66a4c3aee5328ef8a8be20a58d6ce388bda2394bc70e4800cf52e95760a22e09","src/codec/bytes_codec.rs":"e8f14a93415768f5a8736cbcc0a1684742e3be6df1a6b60cb95bd146544eee74","src/codec/decoder.rs":"6fbff2ba49a0b82dcb6159e98a2c2d61914ee88dd462a406bec347db276bb58c","src/codec/encoder.rs":"e4544af47cdde075d1238ddee9555037912089bf25ce51cb4dd6f5d4f76ecf70","src/codec/framed.rs":"4ff6098906b964b68976fdceb75d77805ea02db9cf2bb1847f186d6e89e066b8","src/codec/framed_impl.rs":"d1ee46c00f6e5f8eb8a9ba1fa629be42ad7bb89289552045cfccc4efdc22c83c","src/codec/framed_read.rs":"367cc5517513c8fe256d8175b0497402f8b18dbf596aa19e6aa0c714772f0619","src/codec/framed_write.rs":"39f416786034f0f304abe4564cc74ad6483ff816687e8ab3e1bb8d4d380b3ee2","src/codec/length_delimited.rs":"d6281740a065da788c2819cf43bc06fb28b074f84cb1b6e719e397fe856f2f5d","src/codec/lines_codec.rs":"912302c500ea224e9002936e50505a5a29911e13d8c615b74954553f22d59826","src/codec/mod.rs":"95a11e3018bb850ff5934ef48cbc5056bdf2758d130cfa357ad406f0531946ae","src/compat.rs":"719b3a4ee8534647ae72df2d1a7b4937c60a9ee41e018fa7305dc6d5b3b41ed6","src/context.rs":"45a23756c6ce6b834da0f1817f556cc5bdd16412ddfc1dc9082da8a56819741a","src/either.rs":"25e022d51a44490e175b525d4493dd9e6fa51bd03aa27b763be9509eb7c4c0ee","src/io/copy_to_bytes.rs":"808c2261516bb466a1d8fcf2c54a5374c009c6d69391a408dd524897457a425a","src/io/inspect.rs":"ec4b3d57ce90ffae69efa9192035fa49e23ac8f9964fc808cf8af2eaf0ca9fec","src/io/mod.rs":"316ddd0acc608d110cf3cf803f761da9025fdfb0deed6c2713c83671719dcd66","src/io/read_buf.rs":"7043c2fbec74e548395eb2f12073c41c1b30e2f2c283b30eddfb5a16125387d0","src/io/reader_stream.rs":"98d0819ef38f94d56d7085a82d29fd83bde92a9178bebfe73c4533d0022b3d94","src/io/sink_writer.rs":"b5eb0036e2dbcb36a319b29ad95753654c5dfe0be5fef9fee36a25fd71837956","src/io/stream_reader.rs":"39bb920170bc0d435e6e165e3b01d9b124426e130b97c8265d2bd790ba86c7d3","src/io/sync_bridge.rs":"ac558e248df8e8c7abc4316949345d518c858c582330cc4da6e34255cba23912","src/lib.rs":"a07d6cce1cf0e85bd440e684a7be417402710b35e1e5a74e88019f4a281e068e","src/loom.rs":"9028ba504687ad5ec98f3c69387bc2424ec23324b1eed3df5082a9cf23c6502e","src/net/mod.rs":"a75736c1d71408b4f5fb0f0bdcb535cc113e430a2479e01e5fca733ef3fcb15b","src/net/unix/mod.rs":"d667dbb53d7003a15a4705ca0654b35be7165b56ac0d631a23e90d18027a1a90","src/sync/cancellation_token.rs":"d46e179366141f5ebc6d354fe1d60d95ffae702a9f6a75330d121843d0d24c26","src/sync/cancellation_token/guard.rs":"6582ba676c4126b4fa292221f94ddcb5fd6d3e0e2a794819fa424a8f661bff8a","src/sync/cancellation_token/tree_node.rs":"1eab1e6e4fec8a3db850280d9bce7a14e6db10e140f8e509cbcabbc300166e14","src/sync/mod.rs":"b84dcc8d561b847d1ba150061a0f3114bfe237f29cdfe6efbd344c541a5eccdd","src/sync/mpsc.rs":"37585fb9f3419c28c7e621658726d7e05d7d6a28f4354b21ed44253359879c31","src/sync/poll_semaphore.rs":"c968d04ab4e0f79e060a108d9b3797fa6bb2c31e8c362610392bb3faa1f0084f","src/sync/reusable_box.rs":"fb1b8369c6c0d32405b5ea8370be768e5849524a9401258ecbfd776186f39b35","src/sync/tests/loom_cancellation_token.rs":"689a734e2600eb37fce7afacb63abd27d82e6bfb29927f4924ba323ecff22b49","src/sync/tests/mod.rs":"01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b","src/task/join_map.rs":"481c936423ed24eb0d8b3913adf752c5f3bd53c133d0c623716e9bd70f2d19ef","src/task/mod.rs":"4677a402becabd6ca0f123edbc4b25db0c7e02554e74cd34332e52c204d148cd","src/task/spawn_pinned.rs":"87e2de1dc75e1843b0ec0430175769b375ca2a0880c6c31bd3757ac659b029c3","src/time/delay_queue.rs":"ed4f5f268dee32737f8b154893d2df73e14c9d5c12458572600999bc747d7335","src/time/mod.rs":"a76126419f30539dcceb72477251de79b38fe38278ef08b0743f1f716294fd9d","src/time/wheel/level.rs":"570b90de0bdb4d4aef43343fb4916a7a92a03bf51c300a089420700f099a404d","src/time/wheel/mod.rs":"22e69c084e3766dd333f9b6e05e4d23d4ee1bbb481a6035f1c437c0c2ec66356","src/time/wheel/stack.rs":"89e7667c1e204d6c5c4305118ace261f79bbfb2604dbe88ec1dd666695d8b469","src/udp/frame.rs":"7ca0c78acf6055a2ccecec6a4d176cdfd31baa334b8a55871df9aa1685e06c44","src/udp/mod.rs":"869302c0c15eb41f7079ef12ce03fa7c889a83152282ab0b7faf73d1c092ed4e","tests/_require_full.rs":"f8dedb6ad88884209b074ff6f5faa4979528b32653b45ab8047d2ebb28e19122","tests/codecs.rs":"493df228f9dce98de69e0afa7be491d6fe4588e7a381a7910c28f248d2d038a6","tests/context.rs":"12780d99f343f57f66526dc81caa8183ff4a763f9be9d0197aa3ec04fea85c63","tests/framed.rs":"4e808fbc8d601138ff787b3603a377c23b3f42b4a7b882f9a1eb8cf1234c89e3","tests/framed_read.rs":"df41071388645518cc6b0700b75dd678219214b04de42605a0122f007f4ed281","tests/framed_stream.rs":"c3118fc5db62f225ad6d97f8b32ac03812b3b68cdab7a94d189f4a4d9337f13f","tests/framed_write.rs":"6334332e15f101f7a908824ffde6d36e0090dc97794475bd9fd3370cc2fb265b","tests/io_inspect.rs":"23b5760648641aca46815f486022455847690de914d18d6c4b6877dc9e682937","tests/io_reader_stream.rs":"1c9f79782c5574c5e489e86205bdb63b332fc0e8560fc4c2d602dfc2d2741a5e","tests/io_sink_writer.rs":"797657df0470db646249dd2ffae24e15a8c24eaeccd4718c9a6d54aeccdfb3f8","tests/io_stream_reader.rs":"d86e225eafbd196be3124147b1275bed384459e7ec3e8cb21775906253f75086","tests/io_sync_bridge.rs":"124ff2955283daacc4cdeb730769bfc0315077b60da45ff2fa49b59aeec26ff5","tests/length_delimited.rs":"6bb4714c29b8b76ccdaddb59b1ea51f73499e8e223e8b08a62107a9190af4ba5","tests/mpsc.rs":"4f4c4edaaa295cb61d05900408a463345b790aec9b228260ffab41d90fecc4b5","tests/panic.rs":"349a9bb9b362371aabd3d61161082fd752ed03c13cd7e1790779e331fd22801a","tests/poll_semaphore.rs":"e970eac2e3ebd7835dd3e1b59dd8779a51bb24011593cd7456c1d905fce7fb6f","tests/reusable_box.rs":"e37643b1bfa28c7e769e95f973686a7c30ac659484fd37d758a14e96000fd548","tests/spawn_pinned.rs":"aea2409b5f03ae976409faca153a33aac27a7465b7d3c0e4bea7a27efde1f461","tests/sync_cancellation_token.rs":"8889b95ae5d2d60d97fad791be1dff142d06b47ecf89af99e8b24dcc93ed6d9f","tests/task_join_map.rs":"4becc348dfd360608e2a5b609ccd7568a92e3ec850df4218dd8bb5876c83a2cb","tests/time_delay_queue.rs":"f5640181f2bf9d9708156efaf8e9d11f9f3bb15afac56ccfafab5c3da09cc092","tests/udp.rs":"f72aaac7884774df70c3aafd77e31fe412fbad426b2aa18c334525fefc614806"},"package":"806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/tokio-util/Cargo.toml temporalio-1.3.0/vendor/tokio-util/Cargo.toml --- temporalio-1.3.0/vendor/tokio-util/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio-util/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -13,7 +13,7 @@ edition = "2021" rust-version = "1.56" name = "tokio-util" -version = "0.7.10" +version = "0.7.8" authors = ["Tokio Contributors "] description = """ Additional utilities for working with Tokio. @@ -23,6 +23,7 @@ categories = ["asynchronous"] license = "MIT" repository = "https://github.com/tokio-rs/tokio" +resolver = "1" [package.metadata.docs.rs] all-features = true @@ -57,14 +58,14 @@ optional = true [dependencies.pin-project-lite] -version = "0.2.11" +version = "0.2.0" [dependencies.slab] version = "0.4.4" optional = true [dependencies.tokio] -version = "1.28.0" +version = "1.22.0" features = ["sync"] [dependencies.tracing] @@ -85,9 +86,6 @@ [dev-dependencies.parking_lot] version = "0.12.0" -[dev-dependencies.tempfile] -version = "3.1.0" - [dev-dependencies.tokio] version = "1.0.0" features = ["full"] @@ -130,5 +128,5 @@ ] [target."cfg(tokio_unstable)".dependencies.hashbrown] -version = "0.14.0" +version = "0.12.0" optional = true diff -Nru temporalio-1.3.0/vendor/tokio-util/CHANGELOG.md temporalio-1.3.0/vendor/tokio-util/CHANGELOG.md --- temporalio-1.3.0/vendor/tokio-util/CHANGELOG.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio-util/CHANGELOG.md 2023-10-30 19:40:00.000000000 +0000 @@ -1,48 +1,3 @@ -# 0.7.10 (October 24th, 2023) - -### Added - -- task: add `TaskTracker` ([#6033]) -- task: add `JoinMap::keys` ([#6046]) -- io: implement `Seek` for `SyncIoBridge` ([#6058]) - -### Changed - -- deps: update hashbrown to 0.14 ([#6102]) - -[#6033]: https://github.com/tokio-rs/tokio/pull/6033 -[#6046]: https://github.com/tokio-rs/tokio/pull/6046 -[#6058]: https://github.com/tokio-rs/tokio/pull/6058 -[#6102]: https://github.com/tokio-rs/tokio/pull/6102 - -# 0.7.9 (September 20th, 2023) - -### Added - -- io: add passthrough `AsyncRead`/`AsyncWrite` to `InspectWriter`/`InspectReader` ([#5739]) -- task: add spawn blocking methods to `JoinMap` ([#5797]) -- io: pass through traits for `StreamReader` and `SinkWriter` ([#5941]) -- io: add `SyncIoBridge::into_inner` ([#5971]) - -### Fixed - -- sync: handle possibly dangling reference safely ([#5812]) -- util: fix broken intra-doc link ([#5849]) -- compat: fix clippy warnings ([#5891]) - -### Documented - -- codec: Specify the line ending of `LinesCodec` ([#5982]) - -[#5739]: https://github.com/tokio-rs/tokio/pull/5739 -[#5797]: https://github.com/tokio-rs/tokio/pull/5797 -[#5941]: https://github.com/tokio-rs/tokio/pull/5941 -[#5971]: https://github.com/tokio-rs/tokio/pull/5971 -[#5812]: https://github.com/tokio-rs/tokio/pull/5812 -[#5849]: https://github.com/tokio-rs/tokio/pull/5849 -[#5891]: https://github.com/tokio-rs/tokio/pull/5891 -[#5982]: https://github.com/tokio-rs/tokio/pull/5982 - # 0.7.8 (April 25th, 2023) This release bumps the MSRV of tokio-util to 1.56. diff -Nru temporalio-1.3.0/vendor/tokio-util/src/codec/lines_codec.rs temporalio-1.3.0/vendor/tokio-util/src/codec/lines_codec.rs --- temporalio-1.3.0/vendor/tokio-util/src/codec/lines_codec.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio-util/src/codec/lines_codec.rs 2023-10-30 19:40:00.000000000 +0000 @@ -6,8 +6,6 @@ /// A simple [`Decoder`] and [`Encoder`] implementation that splits up data into lines. /// -/// This uses the `\n` character as the line ending on all platforms. -/// /// [`Decoder`]: crate::codec::Decoder /// [`Encoder`]: crate::codec::Encoder #[derive(Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)] diff -Nru temporalio-1.3.0/vendor/tokio-util/src/compat.rs temporalio-1.3.0/vendor/tokio-util/src/compat.rs --- temporalio-1.3.0/vendor/tokio-util/src/compat.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio-util/src/compat.rs 2023-10-30 19:40:00.000000000 +0000 @@ -227,14 +227,12 @@ pos: io::SeekFrom, ) -> Poll> { if self.seek_pos != Some(pos) { - // Ensure previous seeks have finished before starting a new one - ready!(self.as_mut().project().inner.poll_complete(cx))?; self.as_mut().project().inner.start_seek(pos)?; *self.as_mut().project().seek_pos = Some(pos); } let res = ready!(self.as_mut().project().inner.poll_complete(cx)); *self.as_mut().project().seek_pos = None; - Poll::Ready(res) + Poll::Ready(res.map(|p| p as u64)) } } @@ -257,7 +255,7 @@ }; let res = ready!(self.as_mut().project().inner.poll_seek(cx, pos)); *self.as_mut().project().seek_pos = None; - Poll::Ready(res) + Poll::Ready(res.map(|p| p as u64)) } } diff -Nru temporalio-1.3.0/vendor/tokio-util/src/either.rs temporalio-1.3.0/vendor/tokio-util/src/either.rs --- temporalio-1.3.0/vendor/tokio-util/src/either.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio-util/src/either.rs 2023-10-30 19:40:00.000000000 +0000 @@ -116,7 +116,7 @@ } fn consume(self: Pin<&mut Self>, amt: usize) { - delegate_call!(self.consume(amt)); + delegate_call!(self.consume(amt)) } } diff -Nru temporalio-1.3.0/vendor/tokio-util/src/io/copy_to_bytes.rs temporalio-1.3.0/vendor/tokio-util/src/io/copy_to_bytes.rs --- temporalio-1.3.0/vendor/tokio-util/src/io/copy_to_bytes.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio-util/src/io/copy_to_bytes.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,5 +1,4 @@ use bytes::Bytes; -use futures_core::stream::Stream; use futures_sink::Sink; use pin_project_lite::pin_project; use std::pin::Pin; @@ -67,10 +66,3 @@ self.project().inner.poll_close(cx) } } - -impl Stream for CopyToBytes { - type Item = S::Item; - fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { - self.project().inner.poll_next(cx) - } -} diff -Nru temporalio-1.3.0/vendor/tokio-util/src/io/inspect.rs temporalio-1.3.0/vendor/tokio-util/src/io/inspect.rs --- temporalio-1.3.0/vendor/tokio-util/src/io/inspect.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio-util/src/io/inspect.rs 2023-10-30 19:40:00.000000000 +0000 @@ -52,42 +52,6 @@ } } -impl AsyncWrite for InspectReader { - fn poll_write( - self: Pin<&mut Self>, - cx: &mut Context<'_>, - buf: &[u8], - ) -> Poll> { - self.project().reader.poll_write(cx, buf) - } - - fn poll_flush( - self: Pin<&mut Self>, - cx: &mut Context<'_>, - ) -> Poll> { - self.project().reader.poll_flush(cx) - } - - fn poll_shutdown( - self: Pin<&mut Self>, - cx: &mut Context<'_>, - ) -> Poll> { - self.project().reader.poll_shutdown(cx) - } - - fn poll_write_vectored( - self: Pin<&mut Self>, - cx: &mut Context<'_>, - bufs: &[IoSlice<'_>], - ) -> Poll> { - self.project().reader.poll_write_vectored(cx, bufs) - } - - fn is_write_vectored(&self) -> bool { - self.reader.is_write_vectored() - } -} - pin_project! { /// An adapter that lets you inspect the data that's being written. /// @@ -168,13 +132,3 @@ self.writer.is_write_vectored() } } - -impl AsyncRead for InspectWriter { - fn poll_read( - self: Pin<&mut Self>, - cx: &mut Context<'_>, - buf: &mut ReadBuf<'_>, - ) -> Poll> { - self.project().writer.poll_read(cx, buf) - } -} diff -Nru temporalio-1.3.0/vendor/tokio-util/src/io/sink_writer.rs temporalio-1.3.0/vendor/tokio-util/src/io/sink_writer.rs --- temporalio-1.3.0/vendor/tokio-util/src/io/sink_writer.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio-util/src/io/sink_writer.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,12 +1,11 @@ use futures_core::ready; use futures_sink::Sink; -use futures_core::stream::Stream; use pin_project_lite::pin_project; use std::io; use std::pin::Pin; use std::task::{Context, Poll}; -use tokio::io::{AsyncRead, AsyncWrite}; +use tokio::io::AsyncWrite; pin_project! { /// Convert a [`Sink`] of byte chunks into an [`AsyncWrite`]. @@ -60,7 +59,7 @@ /// [`CopyToBytes`]: crate::io::CopyToBytes /// [`Encoder`]: crate::codec::Encoder /// [`Sink`]: futures_sink::Sink - /// [`codec`]: crate::codec + /// [`codec`]: tokio_util::codec #[derive(Debug)] pub struct SinkWriter { #[pin] @@ -116,20 +115,3 @@ self.project().inner.poll_close(cx).map_err(Into::into) } } - -impl Stream for SinkWriter { - type Item = S::Item; - fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { - self.project().inner.poll_next(cx) - } -} - -impl AsyncRead for SinkWriter { - fn poll_read( - self: Pin<&mut Self>, - cx: &mut Context<'_>, - buf: &mut tokio::io::ReadBuf<'_>, - ) -> Poll> { - self.project().inner.poll_read(cx, buf) - } -} diff -Nru temporalio-1.3.0/vendor/tokio-util/src/io/stream_reader.rs temporalio-1.3.0/vendor/tokio-util/src/io/stream_reader.rs --- temporalio-1.3.0/vendor/tokio-util/src/io/stream_reader.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio-util/src/io/stream_reader.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,6 +1,5 @@ use bytes::Buf; use futures_core::stream::Stream; -use futures_sink::Sink; use std::io; use std::pin::Pin; use std::task::{Context, Poll}; @@ -166,7 +165,7 @@ B: Buf, E: Into, { - /// Convert a stream of byte chunks into an [`AsyncRead`]. + /// Convert a stream of byte chunks into an [`AsyncRead`](tokio::io::AsyncRead). /// /// The item should be a [`Result`] with the ok variant being something that /// implements the [`Buf`] trait (e.g. `Vec` or `Bytes`). The error @@ -325,22 +324,3 @@ } } } - -impl, E, T> Sink for StreamReader { - type Error = E; - fn poll_ready(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { - self.project().inner.poll_ready(cx) - } - - fn start_send(self: Pin<&mut Self>, item: T) -> Result<(), Self::Error> { - self.project().inner.start_send(item) - } - - fn poll_flush(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { - self.project().inner.poll_flush(cx) - } - - fn poll_close(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { - self.project().inner.poll_close(cx) - } -} diff -Nru temporalio-1.3.0/vendor/tokio-util/src/io/sync_bridge.rs temporalio-1.3.0/vendor/tokio-util/src/io/sync_bridge.rs --- temporalio-1.3.0/vendor/tokio-util/src/io/sync_bridge.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio-util/src/io/sync_bridge.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,7 +1,6 @@ -use std::io::{BufRead, Read, Seek, Write}; +use std::io::{BufRead, Read, Write}; use tokio::io::{ - AsyncBufRead, AsyncBufReadExt, AsyncRead, AsyncReadExt, AsyncSeek, AsyncSeekExt, AsyncWrite, - AsyncWriteExt, + AsyncBufRead, AsyncBufReadExt, AsyncRead, AsyncReadExt, AsyncWrite, AsyncWriteExt, }; /// Use a [`tokio::io::AsyncRead`] synchronously as a [`std::io::Read`] or @@ -80,13 +79,6 @@ } } -impl Seek for SyncIoBridge { - fn seek(&mut self, pos: std::io::SeekFrom) -> std::io::Result { - let src = &mut self.src; - self.rt.block_on(AsyncSeekExt::seek(src, pos)) - } -} - // Because https://doc.rust-lang.org/std/io/trait.Write.html#method.is_write_vectored is at the time // of this writing still unstable, we expose this as part of a standalone method. impl SyncIoBridge { @@ -148,9 +140,4 @@ pub fn new_with_handle(src: T, rt: tokio::runtime::Handle) -> Self { Self { src, rt } } - - /// Consume this bridge, returning the underlying stream. - pub fn into_inner(self) -> T { - self.src - } } diff -Nru temporalio-1.3.0/vendor/tokio-util/src/lib.rs temporalio-1.3.0/vendor/tokio-util/src/lib.rs --- temporalio-1.3.0/vendor/tokio-util/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio-util/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -55,6 +55,151 @@ pub mod either; -pub use bytes; +#[cfg(any(feature = "io", feature = "codec"))] +mod util { + use tokio::io::{AsyncRead, AsyncWrite, ReadBuf}; -mod util; + use bytes::{Buf, BufMut}; + use futures_core::ready; + use std::io::{self, IoSlice}; + use std::mem::MaybeUninit; + use std::pin::Pin; + use std::task::{Context, Poll}; + + /// Try to read data from an `AsyncRead` into an implementer of the [`BufMut`] trait. + /// + /// [`BufMut`]: bytes::Buf + /// + /// # Example + /// + /// ``` + /// use bytes::{Bytes, BytesMut}; + /// use tokio_stream as stream; + /// use tokio::io::Result; + /// use tokio_util::io::{StreamReader, poll_read_buf}; + /// use futures::future::poll_fn; + /// use std::pin::Pin; + /// # #[tokio::main] + /// # async fn main() -> std::io::Result<()> { + /// + /// // Create a reader from an iterator. This particular reader will always be + /// // ready. + /// let mut read = StreamReader::new(stream::iter(vec![Result::Ok(Bytes::from_static(&[0, 1, 2, 3]))])); + /// + /// let mut buf = BytesMut::new(); + /// let mut reads = 0; + /// + /// loop { + /// reads += 1; + /// let n = poll_fn(|cx| poll_read_buf(Pin::new(&mut read), cx, &mut buf)).await?; + /// + /// if n == 0 { + /// break; + /// } + /// } + /// + /// // one or more reads might be necessary. + /// assert!(reads >= 1); + /// assert_eq!(&buf[..], &[0, 1, 2, 3]); + /// # Ok(()) + /// # } + /// ``` + #[cfg_attr(not(feature = "io"), allow(unreachable_pub))] + pub fn poll_read_buf( + io: Pin<&mut T>, + cx: &mut Context<'_>, + buf: &mut B, + ) -> Poll> { + if !buf.has_remaining_mut() { + return Poll::Ready(Ok(0)); + } + + let n = { + let dst = buf.chunk_mut(); + + // Safety: `chunk_mut()` returns a `&mut UninitSlice`, and `UninitSlice` is a + // transparent wrapper around `[MaybeUninit]`. + let dst = unsafe { &mut *(dst as *mut _ as *mut [MaybeUninit]) }; + let mut buf = ReadBuf::uninit(dst); + let ptr = buf.filled().as_ptr(); + ready!(io.poll_read(cx, &mut buf)?); + + // Ensure the pointer does not change from under us + assert_eq!(ptr, buf.filled().as_ptr()); + buf.filled().len() + }; + + // Safety: This is guaranteed to be the number of initialized (and read) + // bytes due to the invariants provided by `ReadBuf::filled`. + unsafe { + buf.advance_mut(n); + } + + Poll::Ready(Ok(n)) + } + + /// Try to write data from an implementer of the [`Buf`] trait to an + /// [`AsyncWrite`], advancing the buffer's internal cursor. + /// + /// This function will use [vectored writes] when the [`AsyncWrite`] supports + /// vectored writes. + /// + /// # Examples + /// + /// [`File`] implements [`AsyncWrite`] and [`Cursor<&[u8]>`] implements + /// [`Buf`]: + /// + /// ```no_run + /// use tokio_util::io::poll_write_buf; + /// use tokio::io; + /// use tokio::fs::File; + /// + /// use bytes::Buf; + /// use std::io::Cursor; + /// use std::pin::Pin; + /// use futures::future::poll_fn; + /// + /// #[tokio::main] + /// async fn main() -> io::Result<()> { + /// let mut file = File::create("foo.txt").await?; + /// let mut buf = Cursor::new(b"data to write"); + /// + /// // Loop until the entire contents of the buffer are written to + /// // the file. + /// while buf.has_remaining() { + /// poll_fn(|cx| poll_write_buf(Pin::new(&mut file), cx, &mut buf)).await?; + /// } + /// + /// Ok(()) + /// } + /// ``` + /// + /// [`Buf`]: bytes::Buf + /// [`AsyncWrite`]: tokio::io::AsyncWrite + /// [`File`]: tokio::fs::File + /// [vectored writes]: tokio::io::AsyncWrite::poll_write_vectored + #[cfg_attr(not(feature = "io"), allow(unreachable_pub))] + pub fn poll_write_buf( + io: Pin<&mut T>, + cx: &mut Context<'_>, + buf: &mut B, + ) -> Poll> { + const MAX_BUFS: usize = 64; + + if !buf.has_remaining() { + return Poll::Ready(Ok(0)); + } + + let n = if io.is_write_vectored() { + let mut slices = [IoSlice::new(&[]); MAX_BUFS]; + let cnt = buf.chunks_vectored(&mut slices); + ready!(io.poll_write_vectored(cx, &slices[..cnt]))? + } else { + ready!(io.poll_write(cx, buf.chunk()))? + }; + + buf.advance(n); + + Poll::Ready(Ok(n)) + } +} diff -Nru temporalio-1.3.0/vendor/tokio-util/src/sync/cancellation_token/tree_node.rs temporalio-1.3.0/vendor/tokio-util/src/sync/cancellation_token/tree_node.rs --- temporalio-1.3.0/vendor/tokio-util/src/sync/cancellation_token/tree_node.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio-util/src/sync/cancellation_token/tree_node.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,12 +1,12 @@ //! This mod provides the logic for the inner tree structure of the CancellationToken. //! -//! CancellationTokens are only light handles with references to [`TreeNode`]. -//! All the logic is actually implemented in the [`TreeNode`]. +//! CancellationTokens are only light handles with references to TreeNode. +//! All the logic is actually implemented in the TreeNode. //! -//! A [`TreeNode`] is part of the cancellation tree and may have one parent and an arbitrary number of +//! A TreeNode is part of the cancellation tree and may have one parent and an arbitrary number of //! children. //! -//! A [`TreeNode`] can receive the request to perform a cancellation through a CancellationToken. +//! A TreeNode can receive the request to perform a cancellation through a CancellationToken. //! This cancellation request will cancel the node and all of its descendants. //! //! As soon as a node cannot get cancelled any more (because it was already cancelled or it has no diff -Nru temporalio-1.3.0/vendor/tokio-util/src/sync/cancellation_token.rs temporalio-1.3.0/vendor/tokio-util/src/sync/cancellation_token.rs --- temporalio-1.3.0/vendor/tokio-util/src/sync/cancellation_token.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio-util/src/sync/cancellation_token.rs 2023-10-30 19:40:00.000000000 +0000 @@ -4,7 +4,6 @@ mod tree_node; use crate::loom::sync::Arc; -use crate::util::MaybeDangling; use core::future::Future; use core::pin::Pin; use core::task::{Context, Poll}; @@ -78,23 +77,11 @@ /// [`CancellationToken`] by value instead of using a reference. #[must_use = "futures do nothing unless polled"] pub struct WaitForCancellationFutureOwned { - // This field internally has a reference to the cancellation token, but camouflages - // the relationship with `'static`. To avoid Undefined Behavior, we must ensure - // that the reference is only used while the cancellation token is still alive. To - // do that, we ensure that the future is the first field, so that it is dropped - // before the cancellation token. - // - // We use `MaybeDanglingFuture` here because without it, the compiler could assert - // the reference inside `future` to be valid even after the destructor of that - // field runs. (Specifically, when the `WaitForCancellationFutureOwned` is passed - // as an argument to a function, the reference can be asserted to be valid for the - // rest of that function.) To avoid that, we use `MaybeDangling` which tells the - // compiler that the reference stored inside it might not be valid. - // - // See - // for more info. + // Since `future` is the first field, it is dropped before the + // cancellation_token field. This ensures that the reference inside the + // `Notified` remains valid. #[pin] - future: MaybeDangling>, + future: tokio::sync::futures::Notified<'static>, cancellation_token: CancellationToken, } } @@ -133,7 +120,7 @@ } impl CancellationToken { - /// Creates a new `CancellationToken` in the non-cancelled state. + /// Creates a new CancellationToken in the non-cancelled state. pub fn new() -> CancellationToken { CancellationToken { inner: Arc::new(tree_node::TreeNode::new()), @@ -292,7 +279,7 @@ // # Safety // // cancellation_token is dropped after future due to the field ordering. - future: MaybeDangling::new(unsafe { Self::new_future(&cancellation_token) }), + future: unsafe { Self::new_future(&cancellation_token) }, cancellation_token, } } @@ -333,9 +320,8 @@ // # Safety // // cancellation_token is dropped after future due to the field ordering. - this.future.set(MaybeDangling::new(unsafe { - Self::new_future(this.cancellation_token) - })); + this.future + .set(unsafe { Self::new_future(this.cancellation_token) }); } } } diff -Nru temporalio-1.3.0/vendor/tokio-util/src/sync/mpsc.rs temporalio-1.3.0/vendor/tokio-util/src/sync/mpsc.rs --- temporalio-1.3.0/vendor/tokio-util/src/sync/mpsc.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio-util/src/sync/mpsc.rs 2023-10-30 19:40:00.000000000 +0000 @@ -44,7 +44,7 @@ pub struct PollSender { sender: Option>, state: State, - acquire: PollSenderFuture, + acquire: ReusableBoxFuture<'static, Result, PollSendError>>, } // Creates a future for acquiring a permit from the underlying channel. This is used to ensure @@ -64,56 +64,13 @@ } } -type InnerFuture<'a, T> = ReusableBoxFuture<'a, Result, PollSendError>>; - -#[derive(Debug)] -// TODO: This should be replace with a type_alias_impl_trait to eliminate `'static` and all the transmutes -struct PollSenderFuture(InnerFuture<'static, T>); - -impl PollSenderFuture { - /// Create with an empty inner future with no `Send` bound. - fn empty() -> Self { - // We don't use `make_acquire_future` here because our relaxed bounds on `T` are not - // compatible with the transitive bounds required by `Sender`. - Self(ReusableBoxFuture::new(async { unreachable!() })) - } -} - -impl PollSenderFuture { - /// Create with an empty inner future. - fn new() -> Self { - let v = InnerFuture::new(make_acquire_future(None)); - // This is safe because `make_acquire_future(None)` is actually `'static` - Self(unsafe { mem::transmute::, InnerFuture<'static, T>>(v) }) - } - - /// Poll the inner future. - fn poll(&mut self, cx: &mut Context<'_>) -> Poll, PollSendError>> { - self.0.poll(cx) - } - - /// Replace the inner future. - fn set(&mut self, sender: Option>) { - let inner: *mut InnerFuture<'static, T> = &mut self.0; - let inner: *mut InnerFuture<'_, T> = inner.cast(); - // SAFETY: The `make_acquire_future(sender)` future must not exist after the type `T` - // becomes invalid, and this casts away the type-level lifetime check for that. However, the - // inner future is never moved out of this `PollSenderFuture`, so the future will not - // live longer than the `PollSenderFuture` lives. A `PollSenderFuture` is guaranteed - // to not exist after the type `T` becomes invalid, because it is annotated with a `T`, so - // this is ok. - let inner = unsafe { &mut *inner }; - inner.set(make_acquire_future(sender)); - } -} - -impl PollSender { +impl PollSender { /// Creates a new `PollSender`. pub fn new(sender: Sender) -> Self { Self { sender: Some(sender.clone()), state: State::Idle(sender), - acquire: PollSenderFuture::new(), + acquire: ReusableBoxFuture::new(make_acquire_future(None)), } } @@ -140,7 +97,7 @@ State::Idle(sender) => { // Start trying to acquire a permit to reserve a slot for our send, and // immediately loop back around to poll it the first time. - self.acquire.set(Some(sender)); + self.acquire.set(make_acquire_future(Some(sender))); (None, State::Acquiring) } State::Acquiring => match self.acquire.poll(cx) { @@ -237,7 +194,7 @@ match self.state { State::Idle(_) => self.state = State::Closed, State::Acquiring => { - self.acquire.set(None); + self.acquire.set(make_acquire_future(None)); self.state = State::Closed; } _ => {} @@ -258,7 +215,7 @@ // We're currently trying to reserve a slot to send into. State::Acquiring => { // Replacing the future drops the in-flight one. - self.acquire.set(None); + self.acquire.set(make_acquire_future(None)); // If we haven't closed yet, we have to clone our stored sender since we have no way // to get it back from the acquire future we just dropped. @@ -298,7 +255,9 @@ Self { sender, state, - acquire: PollSenderFuture::empty(), + // We don't use `make_acquire_future` here because our relaxed bounds on `T` are not + // compatible with the transitive bounds required by `Sender`. + acquire: ReusableBoxFuture::new(async { unreachable!() }), } } } diff -Nru temporalio-1.3.0/vendor/tokio-util/src/sync/poll_semaphore.rs temporalio-1.3.0/vendor/tokio-util/src/sync/poll_semaphore.rs --- temporalio-1.3.0/vendor/tokio-util/src/sync/poll_semaphore.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio-util/src/sync/poll_semaphore.rs 2023-10-30 19:40:00.000000000 +0000 @@ -29,7 +29,7 @@ /// Closes the semaphore. pub fn close(&self) { - self.semaphore.close(); + self.semaphore.close() } /// Obtain a clone of the inner semaphore. diff -Nru temporalio-1.3.0/vendor/tokio-util/src/sync/reusable_box.rs temporalio-1.3.0/vendor/tokio-util/src/sync/reusable_box.rs --- temporalio-1.3.0/vendor/tokio-util/src/sync/reusable_box.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio-util/src/sync/reusable_box.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,6 +1,7 @@ use std::alloc::Layout; use std::fmt; -use std::future::{self, Future}; +use std::future::Future; +use std::marker::PhantomData; use std::mem::{self, ManuallyDrop}; use std::pin::Pin; use std::ptr; @@ -60,7 +61,7 @@ F: Future + Send + 'a, { // future::Pending is a ZST so this never allocates. - let boxed = mem::replace(&mut this.boxed, Box::pin(future::pending())); + let boxed = mem::replace(&mut this.boxed, Box::pin(Pending(PhantomData))); reuse_pin_box(boxed, future, |boxed| this.boxed = Pin::from(boxed)) } @@ -155,3 +156,16 @@ f(); } } + +/// The same as `std::future::Pending`; we can't use that type directly because on rustc +/// versions <1.60 it didn't unconditionally implement `Send`. +// FIXME: use `std::future::Pending` once the MSRV is >=1.60 +struct Pending(PhantomData T>); + +impl Future for Pending { + type Output = T; + + fn poll(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll { + Poll::Pending + } +} diff -Nru temporalio-1.3.0/vendor/tokio-util/src/task/join_map.rs temporalio-1.3.0/vendor/tokio-util/src/task/join_map.rs --- temporalio-1.3.0/vendor/tokio-util/src/task/join_map.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio-util/src/task/join_map.rs 2023-10-30 19:40:00.000000000 +0000 @@ -5,7 +5,6 @@ use std::fmt; use std::future::Future; use std::hash::{BuildHasher, Hash, Hasher}; -use std::marker::PhantomData; use tokio::runtime::Handle; use tokio::task::{AbortHandle, Id, JoinError, JoinSet, LocalSet}; @@ -317,60 +316,6 @@ self.insert(key, task); } - /// Spawn the blocking code on the blocking threadpool and store it in this `JoinMap` with the provided - /// key. - /// - /// If a task previously existed in the `JoinMap` for this key, that task - /// will be cancelled and replaced with the new one. The previous task will - /// be removed from the `JoinMap`; a subsequent call to [`join_next`] will - /// *not* return a cancelled [`JoinError`] for that task. - /// - /// Note that blocking tasks cannot be cancelled after execution starts. - /// Replaced blocking tasks will still run to completion if the task has begun - /// to execute when it is replaced. A blocking task which is replaced before - /// it has been scheduled on a blocking worker thread will be cancelled. - /// - /// # Panics - /// - /// This method panics if called outside of a Tokio runtime. - /// - /// [`join_next`]: Self::join_next - #[track_caller] - pub fn spawn_blocking(&mut self, key: K, f: F) - where - F: FnOnce() -> V, - F: Send + 'static, - V: Send, - { - let task = self.tasks.spawn_blocking(f); - self.insert(key, task) - } - - /// Spawn the blocking code on the blocking threadpool of the provided runtime and store it in this - /// `JoinMap` with the provided key. - /// - /// If a task previously existed in the `JoinMap` for this key, that task - /// will be cancelled and replaced with the new one. The previous task will - /// be removed from the `JoinMap`; a subsequent call to [`join_next`] will - /// *not* return a cancelled [`JoinError`] for that task. - /// - /// Note that blocking tasks cannot be cancelled after execution starts. - /// Replaced blocking tasks will still run to completion if the task has begun - /// to execute when it is replaced. A blocking task which is replaced before - /// it has been scheduled on a blocking worker thread will be cancelled. - /// - /// [`join_next`]: Self::join_next - #[track_caller] - pub fn spawn_blocking_on(&mut self, key: K, f: F, handle: &Handle) - where - F: FnOnce() -> V, - F: Send + 'static, - V: Send, - { - let task = self.tasks.spawn_blocking_on(f, handle); - self.insert(key, task); - } - /// Spawn the provided task on the current [`LocalSet`] and store it in this /// `JoinMap` with the provided key. /// @@ -627,19 +572,6 @@ } } - /// Returns an iterator visiting all keys in this `JoinMap` in arbitrary order. - /// - /// If a task has completed, but its output hasn't yet been consumed by a - /// call to [`join_next`], this method will still return its key. - /// - /// [`join_next`]: fn@Self::join_next - pub fn keys(&self) -> JoinMapKeys<'_, K, V> { - JoinMapKeys { - iter: self.tasks_by_key.keys(), - _value: PhantomData, - } - } - /// Returns `true` if this `JoinMap` contains a task for the provided key. /// /// If the task has completed, but its output hasn't yet been consumed by a @@ -873,32 +805,3 @@ } impl Eq for Key {} - -/// An iterator over the keys of a [`JoinMap`]. -#[derive(Debug, Clone)] -pub struct JoinMapKeys<'a, K, V> { - iter: hashbrown::hash_map::Keys<'a, Key, AbortHandle>, - /// To make it easier to change JoinMap in the future, keep V as a generic - /// parameter. - _value: PhantomData<&'a V>, -} - -impl<'a, K, V> Iterator for JoinMapKeys<'a, K, V> { - type Item = &'a K; - - fn next(&mut self) -> Option<&'a K> { - self.iter.next().map(|key| &key.key) - } - - fn size_hint(&self) -> (usize, Option) { - self.iter.size_hint() - } -} - -impl<'a, K, V> ExactSizeIterator for JoinMapKeys<'a, K, V> { - fn len(&self) -> usize { - self.iter.len() - } -} - -impl<'a, K, V> std::iter::FusedIterator for JoinMapKeys<'a, K, V> {} diff -Nru temporalio-1.3.0/vendor/tokio-util/src/task/mod.rs temporalio-1.3.0/vendor/tokio-util/src/task/mod.rs --- temporalio-1.3.0/vendor/tokio-util/src/task/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio-util/src/task/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -9,7 +9,4 @@ #[cfg(tokio_unstable)] #[cfg_attr(docsrs, doc(cfg(all(tokio_unstable, feature = "rt"))))] -pub use join_map::{JoinMap, JoinMapKeys}; - -pub mod task_tracker; -pub use task_tracker::TaskTracker; +pub use join_map::JoinMap; diff -Nru temporalio-1.3.0/vendor/tokio-util/src/task/task_tracker.rs temporalio-1.3.0/vendor/tokio-util/src/task/task_tracker.rs --- temporalio-1.3.0/vendor/tokio-util/src/task/task_tracker.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio-util/src/task/task_tracker.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,719 +0,0 @@ -//! Types related to the [`TaskTracker`] collection. -//! -//! See the documentation of [`TaskTracker`] for more information. - -use pin_project_lite::pin_project; -use std::fmt; -use std::future::Future; -use std::pin::Pin; -use std::sync::atomic::{AtomicUsize, Ordering}; -use std::sync::Arc; -use std::task::{Context, Poll}; -use tokio::sync::{futures::Notified, Notify}; - -#[cfg(feature = "rt")] -use tokio::{ - runtime::Handle, - task::{JoinHandle, LocalSet}, -}; - -/// A task tracker used for waiting until tasks exit. -/// -/// This is usually used together with [`CancellationToken`] to implement [graceful shutdown]. The -/// `CancellationToken` is used to signal to tasks that they should shut down, and the -/// `TaskTracker` is used to wait for them to finish shutting down. -/// -/// The `TaskTracker` will also keep track of a `closed` boolean. This is used to handle the case -/// where the `TaskTracker` is empty, but we don't want to shut down yet. This means that the -/// [`wait`] method will wait until *both* of the following happen at the same time: -/// -/// * The `TaskTracker` must be closed using the [`close`] method. -/// * The `TaskTracker` must be empty, that is, all tasks that it is tracking must have exited. -/// -/// When a call to [`wait`] returns, it is guaranteed that all tracked tasks have exited and that -/// the destructor of the future has finished running. However, there might be a short amount of -/// time where [`JoinHandle::is_finished`] returns false. -/// -/// # Comparison to `JoinSet` -/// -/// The main Tokio crate has a similar collection known as [`JoinSet`]. The `JoinSet` type has a -/// lot more features than `TaskTracker`, so `TaskTracker` should only be used when one of its -/// unique features is required: -/// -/// 1. When tasks exit, a `TaskTracker` will allow the task to immediately free its memory. -/// 2. By not closing the `TaskTracker`, [`wait`] will be prevented from from returning even if -/// the `TaskTracker` is empty. -/// 3. A `TaskTracker` does not require mutable access to insert tasks. -/// 4. A `TaskTracker` can be cloned to share it with many tasks. -/// -/// The first point is the most important one. A [`JoinSet`] keeps track of the return value of -/// every inserted task. This means that if the caller keeps inserting tasks and never calls -/// [`join_next`], then their return values will keep building up and consuming memory, _even if_ -/// most of the tasks have already exited. This can cause the process to run out of memory. With a -/// `TaskTracker`, this does not happen. Once tasks exit, they are immediately removed from the -/// `TaskTracker`. -/// -/// # Examples -/// -/// For more examples, please see the topic page on [graceful shutdown]. -/// -/// ## Spawn tasks and wait for them to exit -/// -/// This is a simple example. For this case, [`JoinSet`] should probably be used instead. -/// -/// ``` -/// use tokio_util::task::TaskTracker; -/// -/// #[tokio::main] -/// async fn main() { -/// let tracker = TaskTracker::new(); -/// -/// for i in 0..10 { -/// tracker.spawn(async move { -/// println!("Task {} is running!", i); -/// }); -/// } -/// // Once we spawned everything, we close the tracker. -/// tracker.close(); -/// -/// // Wait for everything to finish. -/// tracker.wait().await; -/// -/// println!("This is printed after all of the tasks."); -/// } -/// ``` -/// -/// ## Wait for tasks to exit -/// -/// This example shows the intended use-case of `TaskTracker`. It is used together with -/// [`CancellationToken`] to implement graceful shutdown. -/// ``` -/// use tokio_util::sync::CancellationToken; -/// use tokio_util::task::TaskTracker; -/// use tokio::time::{self, Duration}; -/// -/// async fn background_task(num: u64) { -/// for i in 0..10 { -/// time::sleep(Duration::from_millis(100*num)).await; -/// println!("Background task {} in iteration {}.", num, i); -/// } -/// } -/// -/// #[tokio::main] -/// # async fn _hidden() {} -/// # #[tokio::main(flavor = "current_thread", start_paused = true)] -/// async fn main() { -/// let tracker = TaskTracker::new(); -/// let token = CancellationToken::new(); -/// -/// for i in 0..10 { -/// let token = token.clone(); -/// tracker.spawn(async move { -/// // Use a `tokio::select!` to kill the background task if the token is -/// // cancelled. -/// tokio::select! { -/// () = background_task(i) => { -/// println!("Task {} exiting normally.", i); -/// }, -/// () = token.cancelled() => { -/// // Do some cleanup before we really exit. -/// time::sleep(Duration::from_millis(50)).await; -/// println!("Task {} finished cleanup.", i); -/// }, -/// } -/// }); -/// } -/// -/// // Spawn a background task that will send the shutdown signal. -/// { -/// let tracker = tracker.clone(); -/// tokio::spawn(async move { -/// // Normally you would use something like ctrl-c instead of -/// // sleeping. -/// time::sleep(Duration::from_secs(2)).await; -/// tracker.close(); -/// token.cancel(); -/// }); -/// } -/// -/// // Wait for all tasks to exit. -/// tracker.wait().await; -/// -/// println!("All tasks have exited now."); -/// } -/// ``` -/// -/// [`CancellationToken`]: crate::sync::CancellationToken -/// [`JoinHandle::is_finished`]: tokio::task::JoinHandle::is_finished -/// [`JoinSet`]: tokio::task::JoinSet -/// [`close`]: Self::close -/// [`join_next`]: tokio::task::JoinSet::join_next -/// [`wait`]: Self::wait -/// [graceful shutdown]: https://tokio.rs/tokio/topics/shutdown -pub struct TaskTracker { - inner: Arc, -} - -/// Represents a task tracked by a [`TaskTracker`]. -#[must_use] -#[derive(Debug)] -pub struct TaskTrackerToken { - task_tracker: TaskTracker, -} - -struct TaskTrackerInner { - /// Keeps track of the state. - /// - /// The lowest bit is whether the task tracker is closed. - /// - /// The rest of the bits count the number of tracked tasks. - state: AtomicUsize, - /// Used to notify when the last task exits. - on_last_exit: Notify, -} - -pin_project! { - /// A future that is tracked as a task by a [`TaskTracker`]. - /// - /// The associated [`TaskTracker`] cannot complete until this future is dropped. - /// - /// This future is returned by [`TaskTracker::track_future`]. - #[must_use = "futures do nothing unless polled"] - pub struct TrackedFuture { - #[pin] - future: F, - token: TaskTrackerToken, - } -} - -pin_project! { - /// A future that completes when the [`TaskTracker`] is empty and closed. - /// - /// This future is returned by [`TaskTracker::wait`]. - #[must_use = "futures do nothing unless polled"] - pub struct TaskTrackerWaitFuture<'a> { - #[pin] - future: Notified<'a>, - inner: Option<&'a TaskTrackerInner>, - } -} - -impl TaskTrackerInner { - #[inline] - fn new() -> Self { - Self { - state: AtomicUsize::new(0), - on_last_exit: Notify::new(), - } - } - - #[inline] - fn is_closed_and_empty(&self) -> bool { - // If empty and closed bit set, then we are done. - // - // The acquire load will synchronize with the release store of any previous call to - // `set_closed` and `drop_task`. - self.state.load(Ordering::Acquire) == 1 - } - - #[inline] - fn set_closed(&self) -> bool { - // The AcqRel ordering makes the closed bit behave like a `Mutex` for synchronization - // purposes. We do this because it makes the return value of `TaskTracker::{close,reopen}` - // more meaningful for the user. Without these orderings, this assert could fail: - // ``` - // // thread 1 - // some_other_atomic.store(true, Relaxed); - // tracker.close(); - // - // // thread 2 - // if tracker.reopen() { - // assert!(some_other_atomic.load(Relaxed)); - // } - // ``` - // However, with the AcqRel ordering, we establish a happens-before relationship from the - // call to `close` and the later call to `reopen` that returned true. - let state = self.state.fetch_or(1, Ordering::AcqRel); - - // If there are no tasks, and if it was not already closed: - if state == 0 { - self.notify_now(); - } - - (state & 1) == 0 - } - - #[inline] - fn set_open(&self) -> bool { - // See `set_closed` regarding the AcqRel ordering. - let state = self.state.fetch_and(!1, Ordering::AcqRel); - (state & 1) == 1 - } - - #[inline] - fn add_task(&self) { - self.state.fetch_add(2, Ordering::Relaxed); - } - - #[inline] - fn drop_task(&self) { - let state = self.state.fetch_sub(2, Ordering::Release); - - // If this was the last task and we are closed: - if state == 3 { - self.notify_now(); - } - } - - #[cold] - fn notify_now(&self) { - // Insert an acquire fence. This matters for `drop_task` but doesn't matter for - // `set_closed` since it already uses AcqRel. - // - // This synchronizes with the release store of any other call to `drop_task`, and with the - // release store in the call to `set_closed`. That ensures that everything that happened - // before those other calls to `drop_task` or `set_closed` will be visible after this load, - // and those things will also be visible to anything woken by the call to `notify_waiters`. - self.state.load(Ordering::Acquire); - - self.on_last_exit.notify_waiters(); - } -} - -impl TaskTracker { - /// Creates a new `TaskTracker`. - /// - /// The `TaskTracker` will start out as open. - #[must_use] - pub fn new() -> Self { - Self { - inner: Arc::new(TaskTrackerInner::new()), - } - } - - /// Waits until this `TaskTracker` is both closed and empty. - /// - /// If the `TaskTracker` is already closed and empty when this method is called, then it - /// returns immediately. - /// - /// The `wait` future is resistant against [ABA problems][aba]. That is, if the `TaskTracker` - /// becomes both closed and empty for a short amount of time, then it is guarantee that all - /// `wait` futures that were created before the short time interval will trigger, even if they - /// are not polled during that short time interval. - /// - /// # Cancel safety - /// - /// This method is cancel safe. - /// - /// However, the resistance against [ABA problems][aba] is lost when using `wait` as the - /// condition in a `tokio::select!` loop. - /// - /// [aba]: https://en.wikipedia.org/wiki/ABA_problem - #[inline] - pub fn wait(&self) -> TaskTrackerWaitFuture<'_> { - TaskTrackerWaitFuture { - future: self.inner.on_last_exit.notified(), - inner: if self.inner.is_closed_and_empty() { - None - } else { - Some(&self.inner) - }, - } - } - - /// Close this `TaskTracker`. - /// - /// This allows [`wait`] futures to complete. It does not prevent you from spawning new tasks. - /// - /// Returns `true` if this closed the `TaskTracker`, or `false` if it was already closed. - /// - /// [`wait`]: Self::wait - #[inline] - pub fn close(&self) -> bool { - self.inner.set_closed() - } - - /// Reopen this `TaskTracker`. - /// - /// This prevents [`wait`] futures from completing even if the `TaskTracker` is empty. - /// - /// Returns `true` if this reopened the `TaskTracker`, or `false` if it was already open. - /// - /// [`wait`]: Self::wait - #[inline] - pub fn reopen(&self) -> bool { - self.inner.set_open() - } - - /// Returns `true` if this `TaskTracker` is [closed](Self::close). - #[inline] - #[must_use] - pub fn is_closed(&self) -> bool { - (self.inner.state.load(Ordering::Acquire) & 1) != 0 - } - - /// Returns the number of tasks tracked by this `TaskTracker`. - #[inline] - #[must_use] - pub fn len(&self) -> usize { - self.inner.state.load(Ordering::Acquire) >> 1 - } - - /// Returns `true` if there are no tasks in this `TaskTracker`. - #[inline] - #[must_use] - pub fn is_empty(&self) -> bool { - self.inner.state.load(Ordering::Acquire) <= 1 - } - - /// Spawn the provided future on the current Tokio runtime, and track it in this `TaskTracker`. - /// - /// This is equivalent to `tokio::spawn(tracker.track_future(task))`. - #[inline] - #[track_caller] - #[cfg(feature = "rt")] - #[cfg_attr(docsrs, doc(cfg(feature = "rt")))] - pub fn spawn(&self, task: F) -> JoinHandle - where - F: Future + Send + 'static, - F::Output: Send + 'static, - { - tokio::task::spawn(self.track_future(task)) - } - - /// Spawn the provided future on the provided Tokio runtime, and track it in this `TaskTracker`. - /// - /// This is equivalent to `handle.spawn(tracker.track_future(task))`. - #[inline] - #[track_caller] - #[cfg(feature = "rt")] - #[cfg_attr(docsrs, doc(cfg(feature = "rt")))] - pub fn spawn_on(&self, task: F, handle: &Handle) -> JoinHandle - where - F: Future + Send + 'static, - F::Output: Send + 'static, - { - handle.spawn(self.track_future(task)) - } - - /// Spawn the provided future on the current [`LocalSet`], and track it in this `TaskTracker`. - /// - /// This is equivalent to `tokio::task::spawn_local(tracker.track_future(task))`. - /// - /// [`LocalSet`]: tokio::task::LocalSet - #[inline] - #[track_caller] - #[cfg(feature = "rt")] - #[cfg_attr(docsrs, doc(cfg(feature = "rt")))] - pub fn spawn_local(&self, task: F) -> JoinHandle - where - F: Future + 'static, - F::Output: 'static, - { - tokio::task::spawn_local(self.track_future(task)) - } - - /// Spawn the provided future on the provided [`LocalSet`], and track it in this `TaskTracker`. - /// - /// This is equivalent to `local_set.spawn_local(tracker.track_future(task))`. - /// - /// [`LocalSet`]: tokio::task::LocalSet - #[inline] - #[track_caller] - #[cfg(feature = "rt")] - #[cfg_attr(docsrs, doc(cfg(feature = "rt")))] - pub fn spawn_local_on(&self, task: F, local_set: &LocalSet) -> JoinHandle - where - F: Future + 'static, - F::Output: 'static, - { - local_set.spawn_local(self.track_future(task)) - } - - /// Spawn the provided blocking task on the current Tokio runtime, and track it in this `TaskTracker`. - /// - /// This is equivalent to `tokio::task::spawn_blocking(tracker.track_future(task))`. - #[inline] - #[track_caller] - #[cfg(feature = "rt")] - #[cfg(not(target_family = "wasm"))] - #[cfg_attr(docsrs, doc(cfg(feature = "rt")))] - pub fn spawn_blocking(&self, task: F) -> JoinHandle - where - F: FnOnce() -> T, - F: Send + 'static, - T: Send + 'static, - { - let token = self.token(); - tokio::task::spawn_blocking(move || { - let res = task(); - drop(token); - res - }) - } - - /// Spawn the provided blocking task on the provided Tokio runtime, and track it in this `TaskTracker`. - /// - /// This is equivalent to `handle.spawn_blocking(tracker.track_future(task))`. - #[inline] - #[track_caller] - #[cfg(feature = "rt")] - #[cfg(not(target_family = "wasm"))] - #[cfg_attr(docsrs, doc(cfg(feature = "rt")))] - pub fn spawn_blocking_on(&self, task: F, handle: &Handle) -> JoinHandle - where - F: FnOnce() -> T, - F: Send + 'static, - T: Send + 'static, - { - let token = self.token(); - handle.spawn_blocking(move || { - let res = task(); - drop(token); - res - }) - } - - /// Track the provided future. - /// - /// The returned [`TrackedFuture`] will count as a task tracked by this collection, and will - /// prevent calls to [`wait`] from returning until the task is dropped. - /// - /// The task is removed from the collection when it is dropped, not when [`poll`] returns - /// [`Poll::Ready`]. - /// - /// # Examples - /// - /// Track a future spawned with [`tokio::spawn`]. - /// - /// ``` - /// # async fn my_async_fn() {} - /// use tokio_util::task::TaskTracker; - /// - /// # #[tokio::main(flavor = "current_thread")] - /// # async fn main() { - /// let tracker = TaskTracker::new(); - /// - /// tokio::spawn(tracker.track_future(my_async_fn())); - /// # } - /// ``` - /// - /// Track a future spawned on a [`JoinSet`]. - /// ``` - /// # async fn my_async_fn() {} - /// use tokio::task::JoinSet; - /// use tokio_util::task::TaskTracker; - /// - /// # #[tokio::main(flavor = "current_thread")] - /// # async fn main() { - /// let tracker = TaskTracker::new(); - /// let mut join_set = JoinSet::new(); - /// - /// join_set.spawn(tracker.track_future(my_async_fn())); - /// # } - /// ``` - /// - /// [`JoinSet`]: tokio::task::JoinSet - /// [`Poll::Pending`]: std::task::Poll::Pending - /// [`poll`]: std::future::Future::poll - /// [`wait`]: Self::wait - #[inline] - pub fn track_future(&self, future: F) -> TrackedFuture { - TrackedFuture { - future, - token: self.token(), - } - } - - /// Creates a [`TaskTrackerToken`] representing a task tracked by this `TaskTracker`. - /// - /// This token is a lower-level utility than the spawn methods. Each token is considered to - /// correspond to a task. As long as the token exists, the `TaskTracker` cannot complete. - /// Furthermore, the count returned by the [`len`] method will include the tokens in the count. - /// - /// Dropping the token indicates to the `TaskTracker` that the task has exited. - /// - /// [`len`]: TaskTracker::len - #[inline] - pub fn token(&self) -> TaskTrackerToken { - self.inner.add_task(); - TaskTrackerToken { - task_tracker: self.clone(), - } - } - - /// Returns `true` if both task trackers correspond to the same set of tasks. - /// - /// # Examples - /// - /// ``` - /// use tokio_util::task::TaskTracker; - /// - /// let tracker_1 = TaskTracker::new(); - /// let tracker_2 = TaskTracker::new(); - /// let tracker_1_clone = tracker_1.clone(); - /// - /// assert!(TaskTracker::ptr_eq(&tracker_1, &tracker_1_clone)); - /// assert!(!TaskTracker::ptr_eq(&tracker_1, &tracker_2)); - /// ``` - #[inline] - #[must_use] - pub fn ptr_eq(left: &TaskTracker, right: &TaskTracker) -> bool { - Arc::ptr_eq(&left.inner, &right.inner) - } -} - -impl Default for TaskTracker { - /// Creates a new `TaskTracker`. - /// - /// The `TaskTracker` will start out as open. - #[inline] - fn default() -> TaskTracker { - TaskTracker::new() - } -} - -impl Clone for TaskTracker { - /// Returns a new `TaskTracker` that tracks the same set of tasks. - /// - /// Since the new `TaskTracker` shares the same set of tasks, changes to one set are visible in - /// all other clones. - /// - /// # Examples - /// - /// ``` - /// use tokio_util::task::TaskTracker; - /// - /// #[tokio::main] - /// # async fn _hidden() {} - /// # #[tokio::main(flavor = "current_thread")] - /// async fn main() { - /// let tracker = TaskTracker::new(); - /// let cloned = tracker.clone(); - /// - /// // Spawns on `tracker` are visible in `cloned`. - /// tracker.spawn(std::future::pending::<()>()); - /// assert_eq!(cloned.len(), 1); - /// - /// // Spawns on `cloned` are visible in `tracker`. - /// cloned.spawn(std::future::pending::<()>()); - /// assert_eq!(tracker.len(), 2); - /// - /// // Calling `close` is visible to `cloned`. - /// tracker.close(); - /// assert!(cloned.is_closed()); - /// - /// // Calling `reopen` is visible to `tracker`. - /// cloned.reopen(); - /// assert!(!tracker.is_closed()); - /// } - /// ``` - #[inline] - fn clone(&self) -> TaskTracker { - Self { - inner: self.inner.clone(), - } - } -} - -fn debug_inner(inner: &TaskTrackerInner, f: &mut fmt::Formatter<'_>) -> fmt::Result { - let state = inner.state.load(Ordering::Acquire); - let is_closed = (state & 1) != 0; - let len = state >> 1; - - f.debug_struct("TaskTracker") - .field("len", &len) - .field("is_closed", &is_closed) - .field("inner", &(inner as *const TaskTrackerInner)) - .finish() -} - -impl fmt::Debug for TaskTracker { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - debug_inner(&self.inner, f) - } -} - -impl TaskTrackerToken { - /// Returns the [`TaskTracker`] that this token is associated with. - #[inline] - #[must_use] - pub fn task_tracker(&self) -> &TaskTracker { - &self.task_tracker - } -} - -impl Clone for TaskTrackerToken { - /// Returns a new `TaskTrackerToken` associated with the same [`TaskTracker`]. - /// - /// This is equivalent to `token.task_tracker().token()`. - #[inline] - fn clone(&self) -> TaskTrackerToken { - self.task_tracker.token() - } -} - -impl Drop for TaskTrackerToken { - /// Dropping the token indicates to the [`TaskTracker`] that the task has exited. - #[inline] - fn drop(&mut self) { - self.task_tracker.inner.drop_task(); - } -} - -impl Future for TrackedFuture { - type Output = F::Output; - - #[inline] - fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { - self.project().future.poll(cx) - } -} - -impl fmt::Debug for TrackedFuture { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("TrackedFuture") - .field("future", &self.future) - .field("task_tracker", self.token.task_tracker()) - .finish() - } -} - -impl<'a> Future for TaskTrackerWaitFuture<'a> { - type Output = (); - - #[inline] - fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<()> { - let me = self.project(); - - let inner = match me.inner.as_ref() { - None => return Poll::Ready(()), - Some(inner) => inner, - }; - - let ready = inner.is_closed_and_empty() || me.future.poll(cx).is_ready(); - if ready { - *me.inner = None; - Poll::Ready(()) - } else { - Poll::Pending - } - } -} - -impl<'a> fmt::Debug for TaskTrackerWaitFuture<'a> { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - struct Helper<'a>(&'a TaskTrackerInner); - - impl fmt::Debug for Helper<'_> { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - debug_inner(self.0, f) - } - } - - f.debug_struct("TaskTrackerWaitFuture") - .field("future", &self.future) - .field("task_tracker", &self.inner.map(Helper)) - .finish() - } -} diff -Nru temporalio-1.3.0/vendor/tokio-util/src/util/maybe_dangling.rs temporalio-1.3.0/vendor/tokio-util/src/util/maybe_dangling.rs --- temporalio-1.3.0/vendor/tokio-util/src/util/maybe_dangling.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio-util/src/util/maybe_dangling.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,67 +0,0 @@ -use core::future::Future; -use core::mem::MaybeUninit; -use core::pin::Pin; -use core::task::{Context, Poll}; - -/// A wrapper type that tells the compiler that the contents might not be valid. -/// -/// This is necessary mainly when `T` contains a reference. In that case, the -/// compiler will sometimes assume that the reference is always valid; in some -/// cases it will assume this even after the destructor of `T` runs. For -/// example, when a reference is used as a function argument, then the compiler -/// will assume that the reference is valid until the function returns, even if -/// the reference is destroyed during the function. When the reference is used -/// as part of a self-referential struct, that assumption can be false. Wrapping -/// the reference in this type prevents the compiler from making that -/// assumption. -/// -/// # Invariants -/// -/// The `MaybeUninit` will always contain a valid value until the destructor runs. -// -// Reference -// See -// -// TODO: replace this with an official solution once RFC #3336 or similar is available. -// -#[repr(transparent)] -pub(crate) struct MaybeDangling(MaybeUninit); - -impl Drop for MaybeDangling { - fn drop(&mut self) { - // Safety: `0` is always initialized. - unsafe { core::ptr::drop_in_place(self.0.as_mut_ptr()) }; - } -} - -impl MaybeDangling { - pub(crate) fn new(inner: T) -> Self { - Self(MaybeUninit::new(inner)) - } -} - -impl Future for MaybeDangling { - type Output = F::Output; - - fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { - // Safety: `0` is always initialized. - let fut = unsafe { self.map_unchecked_mut(|this| this.0.assume_init_mut()) }; - fut.poll(cx) - } -} - -#[test] -fn maybedangling_runs_drop() { - struct SetOnDrop<'a>(&'a mut bool); - - impl Drop for SetOnDrop<'_> { - fn drop(&mut self) { - *self.0 = true; - } - } - - let mut success = false; - - drop(MaybeDangling::new(SetOnDrop(&mut success))); - assert!(success); -} diff -Nru temporalio-1.3.0/vendor/tokio-util/src/util/mod.rs temporalio-1.3.0/vendor/tokio-util/src/util/mod.rs --- temporalio-1.3.0/vendor/tokio-util/src/util/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio-util/src/util/mod.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,8 +0,0 @@ -mod maybe_dangling; -#[cfg(any(feature = "io", feature = "codec"))] -mod poll_buf; - -pub(crate) use maybe_dangling::MaybeDangling; -#[cfg(any(feature = "io", feature = "codec"))] -#[cfg_attr(not(feature = "io"), allow(unreachable_pub))] -pub use poll_buf::{poll_read_buf, poll_write_buf}; diff -Nru temporalio-1.3.0/vendor/tokio-util/src/util/poll_buf.rs temporalio-1.3.0/vendor/tokio-util/src/util/poll_buf.rs --- temporalio-1.3.0/vendor/tokio-util/src/util/poll_buf.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio-util/src/util/poll_buf.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,145 +0,0 @@ -use tokio::io::{AsyncRead, AsyncWrite, ReadBuf}; - -use bytes::{Buf, BufMut}; -use futures_core::ready; -use std::io::{self, IoSlice}; -use std::mem::MaybeUninit; -use std::pin::Pin; -use std::task::{Context, Poll}; - -/// Try to read data from an `AsyncRead` into an implementer of the [`BufMut`] trait. -/// -/// [`BufMut`]: bytes::Buf -/// -/// # Example -/// -/// ``` -/// use bytes::{Bytes, BytesMut}; -/// use tokio_stream as stream; -/// use tokio::io::Result; -/// use tokio_util::io::{StreamReader, poll_read_buf}; -/// use futures::future::poll_fn; -/// use std::pin::Pin; -/// # #[tokio::main] -/// # async fn main() -> std::io::Result<()> { -/// -/// // Create a reader from an iterator. This particular reader will always be -/// // ready. -/// let mut read = StreamReader::new(stream::iter(vec![Result::Ok(Bytes::from_static(&[0, 1, 2, 3]))])); -/// -/// let mut buf = BytesMut::new(); -/// let mut reads = 0; -/// -/// loop { -/// reads += 1; -/// let n = poll_fn(|cx| poll_read_buf(Pin::new(&mut read), cx, &mut buf)).await?; -/// -/// if n == 0 { -/// break; -/// } -/// } -/// -/// // one or more reads might be necessary. -/// assert!(reads >= 1); -/// assert_eq!(&buf[..], &[0, 1, 2, 3]); -/// # Ok(()) -/// # } -/// ``` -#[cfg_attr(not(feature = "io"), allow(unreachable_pub))] -pub fn poll_read_buf( - io: Pin<&mut T>, - cx: &mut Context<'_>, - buf: &mut B, -) -> Poll> { - if !buf.has_remaining_mut() { - return Poll::Ready(Ok(0)); - } - - let n = { - let dst = buf.chunk_mut(); - - // Safety: `chunk_mut()` returns a `&mut UninitSlice`, and `UninitSlice` is a - // transparent wrapper around `[MaybeUninit]`. - let dst = unsafe { &mut *(dst as *mut _ as *mut [MaybeUninit]) }; - let mut buf = ReadBuf::uninit(dst); - let ptr = buf.filled().as_ptr(); - ready!(io.poll_read(cx, &mut buf)?); - - // Ensure the pointer does not change from under us - assert_eq!(ptr, buf.filled().as_ptr()); - buf.filled().len() - }; - - // Safety: This is guaranteed to be the number of initialized (and read) - // bytes due to the invariants provided by `ReadBuf::filled`. - unsafe { - buf.advance_mut(n); - } - - Poll::Ready(Ok(n)) -} - -/// Try to write data from an implementer of the [`Buf`] trait to an -/// [`AsyncWrite`], advancing the buffer's internal cursor. -/// -/// This function will use [vectored writes] when the [`AsyncWrite`] supports -/// vectored writes. -/// -/// # Examples -/// -/// [`File`] implements [`AsyncWrite`] and [`Cursor<&[u8]>`] implements -/// [`Buf`]: -/// -/// ```no_run -/// use tokio_util::io::poll_write_buf; -/// use tokio::io; -/// use tokio::fs::File; -/// -/// use bytes::Buf; -/// use std::io::Cursor; -/// use std::pin::Pin; -/// use futures::future::poll_fn; -/// -/// #[tokio::main] -/// async fn main() -> io::Result<()> { -/// let mut file = File::create("foo.txt").await?; -/// let mut buf = Cursor::new(b"data to write"); -/// -/// // Loop until the entire contents of the buffer are written to -/// // the file. -/// while buf.has_remaining() { -/// poll_fn(|cx| poll_write_buf(Pin::new(&mut file), cx, &mut buf)).await?; -/// } -/// -/// Ok(()) -/// } -/// ``` -/// -/// [`Buf`]: bytes::Buf -/// [`AsyncWrite`]: tokio::io::AsyncWrite -/// [`File`]: tokio::fs::File -/// [vectored writes]: tokio::io::AsyncWrite::poll_write_vectored -#[cfg_attr(not(feature = "io"), allow(unreachable_pub))] -pub fn poll_write_buf( - io: Pin<&mut T>, - cx: &mut Context<'_>, - buf: &mut B, -) -> Poll> { - const MAX_BUFS: usize = 64; - - if !buf.has_remaining() { - return Poll::Ready(Ok(0)); - } - - let n = if io.is_write_vectored() { - let mut slices = [IoSlice::new(&[]); MAX_BUFS]; - let cnt = buf.chunks_vectored(&mut slices); - ready!(io.poll_write_vectored(cx, &slices[..cnt]))? - } else { - ready!(io.poll_write(cx, buf.chunk()))? - }; - - buf.advance(n); - - Poll::Ready(Ok(n)) -} diff -Nru temporalio-1.3.0/vendor/tokio-util/tests/compat.rs temporalio-1.3.0/vendor/tokio-util/tests/compat.rs --- temporalio-1.3.0/vendor/tokio-util/tests/compat.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio-util/tests/compat.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,43 +0,0 @@ -#![cfg(all(feature = "compat"))] -#![cfg(not(target_os = "wasi"))] // WASI does not support all fs operations -#![warn(rust_2018_idioms)] - -use futures_io::SeekFrom; -use futures_util::{AsyncReadExt, AsyncSeekExt, AsyncWriteExt}; -use tempfile::NamedTempFile; -use tokio::fs::OpenOptions; -use tokio_util::compat::TokioAsyncWriteCompatExt; - -#[tokio::test] -async fn compat_file_seek() -> futures_util::io::Result<()> { - let temp_file = NamedTempFile::new()?; - let mut file = OpenOptions::new() - .read(true) - .write(true) - .create(true) - .open(temp_file) - .await? - .compat_write(); - - file.write_all(&[0, 1, 2, 3, 4, 5]).await?; - file.write_all(&[6, 7]).await?; - - assert_eq!(file.stream_position().await?, 8); - - // Modify elements at position 2. - assert_eq!(file.seek(SeekFrom::Start(2)).await?, 2); - file.write_all(&[8, 9]).await?; - - file.flush().await?; - - // Verify we still have 8 elements. - assert_eq!(file.seek(SeekFrom::End(0)).await?, 8); - // Seek back to the start of the file to read and verify contents. - file.seek(SeekFrom::Start(0)).await?; - - let mut buf = Vec::new(); - let num_bytes = file.read_to_end(&mut buf).await?; - assert_eq!(&buf[..num_bytes], &[0, 1, 8, 9, 4, 5, 6, 7]); - - Ok(()) -} diff -Nru temporalio-1.3.0/vendor/tokio-util/tests/io_sync_bridge.rs temporalio-1.3.0/vendor/tokio-util/tests/io_sync_bridge.rs --- temporalio-1.3.0/vendor/tokio-util/tests/io_sync_bridge.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio-util/tests/io_sync_bridge.rs 2023-10-30 19:40:00.000000000 +0000 @@ -44,18 +44,6 @@ } #[tokio::test] -async fn test_into_inner() -> Result<(), Box> { - let mut buf = Vec::new(); - SyncIoBridge::new(tokio::io::empty()) - .into_inner() - .read_to_end(&mut buf) - .await - .unwrap(); - assert_eq!(buf.len(), 0); - Ok(()) -} - -#[tokio::test] async fn test_shutdown() -> Result<(), Box> { let (s1, mut s2) = tokio::io::duplex(1024); let (_rh, wh) = tokio::io::split(s1); diff -Nru temporalio-1.3.0/vendor/tokio-util/tests/length_delimited.rs temporalio-1.3.0/vendor/tokio-util/tests/length_delimited.rs --- temporalio-1.3.0/vendor/tokio-util/tests/length_delimited.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio-util/tests/length_delimited.rs 2023-10-30 19:40:00.000000000 +0000 @@ -12,6 +12,7 @@ use std::collections::VecDeque; use std::io; use std::pin::Pin; +use std::task::Poll::*; use std::task::{Context, Poll}; macro_rules! mock { @@ -38,10 +39,10 @@ macro_rules! assert_next_pending { ($io:ident) => {{ task::spawn(()).enter(|cx, _| match $io.as_mut().poll_next(cx) { - Poll::Ready(Some(Ok(v))) => panic!("value = {:?}", v), - Poll::Ready(Some(Err(e))) => panic!("error = {:?}", e), - Poll::Ready(None) => panic!("done"), - Poll::Pending => {} + Ready(Some(Ok(v))) => panic!("value = {:?}", v), + Ready(Some(Err(e))) => panic!("error = {:?}", e), + Ready(None) => panic!("done"), + Pending => {} }); }}; } @@ -49,10 +50,10 @@ macro_rules! assert_next_err { ($io:ident) => {{ task::spawn(()).enter(|cx, _| match $io.as_mut().poll_next(cx) { - Poll::Ready(Some(Ok(v))) => panic!("value = {:?}", v), - Poll::Ready(Some(Err(_))) => {} - Poll::Ready(None) => panic!("done"), - Poll::Pending => panic!("pending"), + Ready(Some(Ok(v))) => panic!("value = {:?}", v), + Ready(Some(Err(_))) => {} + Ready(None) => panic!("done"), + Pending => panic!("pending"), }); }}; } @@ -185,11 +186,11 @@ let io = FramedRead::new( mock! { data(b"\x00\x00"), - Poll::Pending, + Pending, data(b"\x00\x09abc"), - Poll::Pending, + Pending, data(b"defghi"), - Poll::Pending, + Pending, }, LengthDelimitedCodec::new(), ); @@ -207,15 +208,15 @@ let io = FramedRead::new( mock! { data(b"\x00\x00"), - Poll::Pending, + Pending, data(b"\x00\x09abc"), - Poll::Pending, + Pending, data(b"defghi"), - Poll::Pending, + Pending, data(b"\x00\x00\x00\x0312"), - Poll::Pending, + Pending, data(b"3\x00\x00\x00\x0bhello world"), - Poll::Pending, + Pending, }, LengthDelimitedCodec::new(), ); @@ -249,9 +250,9 @@ fn read_incomplete_head_multi() { let io = FramedRead::new( mock! { - Poll::Pending, + Pending, data(b"\x00"), - Poll::Pending, + Pending, }, LengthDelimitedCodec::new(), ); @@ -267,9 +268,9 @@ let io = FramedRead::new( mock! { data(b"\x00\x00\x00\x09ab"), - Poll::Pending, + Pending, data(b"cd"), - Poll::Pending, + Pending, }, LengthDelimitedCodec::new(), ); @@ -309,7 +310,7 @@ fn read_update_max_frame_len_in_flight() { let io = length_delimited::Builder::new().new_read(mock! { data(b"\x00\x00\x00\x09abcd"), - Poll::Pending, + Pending, data(b"efghi"), data(b"\x00\x00\x00\x09abcdefghi"), }); @@ -532,9 +533,9 @@ fn write_single_frame_would_block() { let io = FramedWrite::new( mock! { - Poll::Pending, + Pending, data(b"\x00\x00"), - Poll::Pending, + Pending, data(b"\x00\x09"), data(b"abcdefghi"), flush(), @@ -639,7 +640,7 @@ let io = length_delimited::Builder::new().new_write(mock! { data(b"\x00\x00\x00\x06"), data(b"ab"), - Poll::Pending, + Pending, data(b"cdef"), flush(), }); @@ -700,6 +701,8 @@ Flush, } +use self::Op::*; + impl AsyncRead for Mock { fn poll_read( mut self: Pin<&mut Self>, @@ -707,15 +710,15 @@ dst: &mut ReadBuf<'_>, ) -> Poll> { match self.calls.pop_front() { - Some(Poll::Ready(Ok(Op::Data(data)))) => { + Some(Ready(Ok(Op::Data(data)))) => { debug_assert!(dst.remaining() >= data.len()); dst.put_slice(&data); - Poll::Ready(Ok(())) + Ready(Ok(())) } - Some(Poll::Ready(Ok(_))) => panic!(), - Some(Poll::Ready(Err(e))) => Poll::Ready(Err(e)), - Some(Poll::Pending) => Poll::Pending, - None => Poll::Ready(Ok(())), + Some(Ready(Ok(_))) => panic!(), + Some(Ready(Err(e))) => Ready(Err(e)), + Some(Pending) => Pending, + None => Ready(Ok(())), } } } @@ -727,31 +730,31 @@ src: &[u8], ) -> Poll> { match self.calls.pop_front() { - Some(Poll::Ready(Ok(Op::Data(data)))) => { + Some(Ready(Ok(Op::Data(data)))) => { let len = data.len(); assert!(src.len() >= len, "expect={:?}; actual={:?}", data, src); assert_eq!(&data[..], &src[..len]); - Poll::Ready(Ok(len)) + Ready(Ok(len)) } - Some(Poll::Ready(Ok(_))) => panic!(), - Some(Poll::Ready(Err(e))) => Poll::Ready(Err(e)), - Some(Poll::Pending) => Poll::Pending, - None => Poll::Ready(Ok(0)), + Some(Ready(Ok(_))) => panic!(), + Some(Ready(Err(e))) => Ready(Err(e)), + Some(Pending) => Pending, + None => Ready(Ok(0)), } } fn poll_flush(mut self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll> { match self.calls.pop_front() { - Some(Poll::Ready(Ok(Op::Flush))) => Poll::Ready(Ok(())), - Some(Poll::Ready(Ok(_))) => panic!(), - Some(Poll::Ready(Err(e))) => Poll::Ready(Err(e)), - Some(Poll::Pending) => Poll::Pending, - None => Poll::Ready(Ok(())), + Some(Ready(Ok(Op::Flush))) => Ready(Ok(())), + Some(Ready(Ok(_))) => panic!(), + Some(Ready(Err(e))) => Ready(Err(e)), + Some(Pending) => Pending, + None => Ready(Ok(())), } } fn poll_shutdown(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll> { - Poll::Ready(Ok(())) + Ready(Ok(())) } } @@ -768,9 +771,9 @@ } fn data(bytes: &[u8]) -> Poll> { - Poll::Ready(Ok(bytes.into())) + Ready(Ok(bytes.into())) } fn flush() -> Poll> { - Poll::Ready(Ok(Op::Flush)) + Ready(Ok(Flush)) } diff -Nru temporalio-1.3.0/vendor/tokio-util/tests/mpsc.rs temporalio-1.3.0/vendor/tokio-util/tests/mpsc.rs --- temporalio-1.3.0/vendor/tokio-util/tests/mpsc.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio-util/tests/mpsc.rs 2023-10-30 19:40:00.000000000 +0000 @@ -28,29 +28,6 @@ } #[tokio::test] -async fn simple_ref() { - let v = vec![1, 2, 3i32]; - - let (send, mut recv) = channel(3); - let mut send = PollSender::new(send); - - for vi in v.iter() { - let mut reserve = spawn(poll_fn(|cx| send.poll_reserve(cx))); - assert_ready_ok!(reserve.poll()); - send.send_item(vi).unwrap(); - } - - let mut reserve = spawn(poll_fn(|cx| send.poll_reserve(cx))); - assert_pending!(reserve.poll()); - - assert_eq!(*recv.recv().await.unwrap(), 1); - assert!(reserve.is_woken()); - assert_ready_ok!(reserve.poll()); - drop(recv); - send.send_item(&42).unwrap(); -} - -#[tokio::test] async fn repeated_poll_reserve() { let (send, mut recv) = channel::(1); let mut send = PollSender::new(send); diff -Nru temporalio-1.3.0/vendor/tokio-util/tests/task_join_map.rs temporalio-1.3.0/vendor/tokio-util/tests/task_join_map.rs --- temporalio-1.3.0/vendor/tokio-util/tests/task_join_map.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio-util/tests/task_join_map.rs 2023-10-30 19:40:00.000000000 +0000 @@ -109,30 +109,6 @@ } } -#[tokio::test] -async fn test_keys() { - use std::collections::HashSet; - - let mut map = JoinMap::new(); - - assert_eq!(map.len(), 0); - map.spawn(1, async {}); - assert_eq!(map.len(), 1); - map.spawn(2, async {}); - assert_eq!(map.len(), 2); - - let keys = map.keys().collect::>(); - assert!(keys.contains(&1)); - assert!(keys.contains(&2)); - - let _ = map.join_next().await.unwrap(); - let _ = map.join_next().await.unwrap(); - - assert_eq!(map.len(), 0); - let keys = map.keys().collect::>(); - assert!(keys.is_empty()); -} - #[tokio::test(start_paused = true)] async fn abort_by_key() { let mut map = JoinMap::new(); diff -Nru temporalio-1.3.0/vendor/tokio-util/tests/task_tracker.rs temporalio-1.3.0/vendor/tokio-util/tests/task_tracker.rs --- temporalio-1.3.0/vendor/tokio-util/tests/task_tracker.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio-util/tests/task_tracker.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,178 +0,0 @@ -#![warn(rust_2018_idioms)] - -use tokio_test::{assert_pending, assert_ready, task}; -use tokio_util::task::TaskTracker; - -#[test] -fn open_close() { - let tracker = TaskTracker::new(); - assert!(!tracker.is_closed()); - assert!(tracker.is_empty()); - assert_eq!(tracker.len(), 0); - - tracker.close(); - assert!(tracker.is_closed()); - assert!(tracker.is_empty()); - assert_eq!(tracker.len(), 0); - - tracker.reopen(); - assert!(!tracker.is_closed()); - tracker.reopen(); - assert!(!tracker.is_closed()); - - assert!(tracker.is_empty()); - assert_eq!(tracker.len(), 0); - - tracker.close(); - assert!(tracker.is_closed()); - tracker.close(); - assert!(tracker.is_closed()); - - assert!(tracker.is_empty()); - assert_eq!(tracker.len(), 0); -} - -#[test] -fn token_len() { - let tracker = TaskTracker::new(); - - let mut tokens = Vec::new(); - for i in 0..10 { - assert_eq!(tracker.len(), i); - tokens.push(tracker.token()); - } - - assert!(!tracker.is_empty()); - assert_eq!(tracker.len(), 10); - - for (i, token) in tokens.into_iter().enumerate() { - drop(token); - assert_eq!(tracker.len(), 9 - i); - } -} - -#[test] -fn notify_immediately() { - let tracker = TaskTracker::new(); - tracker.close(); - - let mut wait = task::spawn(tracker.wait()); - assert_ready!(wait.poll()); -} - -#[test] -fn notify_immediately_on_reopen() { - let tracker = TaskTracker::new(); - tracker.close(); - - let mut wait = task::spawn(tracker.wait()); - tracker.reopen(); - assert_ready!(wait.poll()); -} - -#[test] -fn notify_on_close() { - let tracker = TaskTracker::new(); - - let mut wait = task::spawn(tracker.wait()); - - assert_pending!(wait.poll()); - tracker.close(); - assert_ready!(wait.poll()); -} - -#[test] -fn notify_on_close_reopen() { - let tracker = TaskTracker::new(); - - let mut wait = task::spawn(tracker.wait()); - - assert_pending!(wait.poll()); - tracker.close(); - tracker.reopen(); - assert_ready!(wait.poll()); -} - -#[test] -fn notify_on_last_task() { - let tracker = TaskTracker::new(); - tracker.close(); - let token = tracker.token(); - - let mut wait = task::spawn(tracker.wait()); - assert_pending!(wait.poll()); - drop(token); - assert_ready!(wait.poll()); -} - -#[test] -fn notify_on_last_task_respawn() { - let tracker = TaskTracker::new(); - tracker.close(); - let token = tracker.token(); - - let mut wait = task::spawn(tracker.wait()); - assert_pending!(wait.poll()); - drop(token); - let token2 = tracker.token(); - assert_ready!(wait.poll()); - drop(token2); -} - -#[test] -fn no_notify_on_respawn_if_open() { - let tracker = TaskTracker::new(); - let token = tracker.token(); - - let mut wait = task::spawn(tracker.wait()); - assert_pending!(wait.poll()); - drop(token); - let token2 = tracker.token(); - assert_pending!(wait.poll()); - drop(token2); -} - -#[test] -fn close_during_exit() { - const ITERS: usize = 5; - - for close_spot in 0..=ITERS { - let tracker = TaskTracker::new(); - let tokens: Vec<_> = (0..ITERS).map(|_| tracker.token()).collect(); - - let mut wait = task::spawn(tracker.wait()); - - for (i, token) in tokens.into_iter().enumerate() { - assert_pending!(wait.poll()); - if i == close_spot { - tracker.close(); - assert_pending!(wait.poll()); - } - drop(token); - } - - if close_spot == ITERS { - assert_pending!(wait.poll()); - tracker.close(); - } - - assert_ready!(wait.poll()); - } -} - -#[test] -fn notify_many() { - let tracker = TaskTracker::new(); - - let mut waits: Vec<_> = (0..10).map(|_| task::spawn(tracker.wait())).collect(); - - for wait in &mut waits { - assert_pending!(wait.poll()); - } - - tracker.close(); - - for wait in &mut waits { - assert_ready!(wait.poll()); - } -} diff -Nru temporalio-1.3.0/vendor/tokio-util/tests/udp.rs temporalio-1.3.0/vendor/tokio-util/tests/udp.rs --- temporalio-1.3.0/vendor/tokio-util/tests/udp.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tokio-util/tests/udp.rs 2023-10-30 19:40:00.000000000 +0000 @@ -13,10 +13,7 @@ use std::io; use std::sync::Arc; -#[cfg_attr( - any(target_os = "macos", target_os = "ios", target_os = "tvos"), - allow(unused_assignments) -)] +#[cfg_attr(any(target_os = "macos", target_os = "ios"), allow(unused_assignments))] #[tokio::test] async fn send_framed_byte_codec() -> std::io::Result<()> { let mut a_soc = UdpSocket::bind("127.0.0.1:0").await?; @@ -44,7 +41,7 @@ b_soc = b.into_inner(); } - #[cfg(not(any(target_os = "macos", target_os = "ios", target_os = "tvos")))] + #[cfg(not(any(target_os = "macos", target_os = "ios")))] // test sending & receiving an empty message { let mut a = UdpFramed::new(a_soc, ByteCodec); diff -Nru temporalio-1.3.0/vendor/tonic/benches/decode.rs temporalio-1.3.0/vendor/tonic/benches/decode.rs --- temporalio-1.3.0/vendor/tonic/benches/decode.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tonic/benches/decode.rs 2023-10-30 19:40:00.000000000 +0000 @@ -22,7 +22,7 @@ b.iter(|| { rt.block_on(async { let decoder = MockDecoder::new($message_size); - let mut stream = Streaming::new_request(decoder, body.clone(), None); + let mut stream = Streaming::new_request(decoder, body.clone(), None, None); let mut count = 0; while let Some(msg) = stream.message().await.unwrap() { diff -Nru temporalio-1.3.0/vendor/tonic/benches-disabled/benchmarks/compiled_protos/helloworld.rs temporalio-1.3.0/vendor/tonic/benches-disabled/benchmarks/compiled_protos/helloworld.rs --- temporalio-1.3.0/vendor/tonic/benches-disabled/benchmarks/compiled_protos/helloworld.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tonic/benches-disabled/benchmarks/compiled_protos/helloworld.rs 2023-10-30 19:40:00.000000000 +0000 @@ -22,7 +22,7 @@ #[doc = r" Attempt to create a new client by connecting to a given endpoint."] pub async fn connect(dst: D) -> Result where - D: std::convert::TryInto, + D: TryInto, D::Error: Into, { let conn = tonic::transport::Endpoint::new(dst)?.connect().await?; @@ -139,7 +139,7 @@ &mut self, request: tonic::Request, ) -> Self::Future { - let inner = self.0.clone(); + let inner = Arc::clone(&self.0); let fut = async move { inner.say_hello(request).await }; Box::pin(fut) } diff -Nru temporalio-1.3.0/vendor/tonic/.cargo-checksum.json temporalio-1.3.0/vendor/tonic/.cargo-checksum.json --- temporalio-1.3.0/vendor/tonic/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tonic/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"Cargo.toml":"bb15c69a3b73e402a57e35b3bff9fda24b9b86fb44cc1b2a7395e13f5fac0cd6","LICENSE":"4f38e3a425725eb447213c75c0d8ae9f0d1f2ebc4f3183e2106aaf07c23f4b20","benches-disabled/README.md":"e96b49b53ab1d02f426b837f0c98bf1b8722bc2115ae001b7e7b647c2ee7c52e","benches-disabled/bench_main.rs":"8f82376de4f916d17d8738036c964fa6cca240ccaf1262edfb4f526c2d2c25d6","benches-disabled/benchmarks/compiled_protos/diverse_types.rs":"2109a6f689b0d726ef3a6be377eda63a5fe4f17647f5579ba8162fba77535670","benches-disabled/benchmarks/compiled_protos/helloworld.rs":"96abc1fe9082948247004f3361c8690e61fc7074562364942bb6537836b44593","benches-disabled/benchmarks/compiled_protos/mod.rs":"1857aea8b5495e0f7554401dcc4701c477814d4b169bab1f03fe91582f6322ea","benches-disabled/benchmarks/mod.rs":"3f14e7149d164310462a6aeb9c053335b48d5627978f22ff374bb5dbc8e1867c","benches-disabled/benchmarks/request_response.rs":"8adff001d461cbd0d1661875850f592b65bd8d0f635f72f456c872cbcc56fc7a","benches-disabled/benchmarks/request_response_diverse_types.rs":"2cea67f00c29ad34ba8feeefa15686190764ffb7002f1c169acb6f8be752e896","benches-disabled/benchmarks/utils.rs":"9928d8815834336d9c32f6f9508ba57222c1c938d4115d62a0bd9958037421c1","benches-disabled/proto/diverse_types/diverse_types.proto":"273b80dfe1c6b3215cb808c9173a4d4aab9ef8361708f7f354533386dd8852d5","benches-disabled/proto/helloworld/helloworld.proto":"1b5052c8c38afc5e6d122a26f59f9c93a71470f1354f888c07f73e53dec011ee","benches/decode.rs":"48b7c6b244231a3c77a77d57ca721c5bdb76dee6d36e4b8ae95b051d78b97229","src/body.rs":"5709108054569bff75c5a37f718f89e3b77b6e9074f26e8eecb0cec39905670b","src/client/grpc.rs":"11d11e5a52fae8f0c88e2a96a53408651c5eeb68fb6f23997ccd418bf52ab6e6","src/client/mod.rs":"0b43aae7cea7b218d5195da89368fa160d409eb06d620ce12a48951968430353","src/client/service.rs":"04b8d55d03592c426b4eb10e7521b30d8438983dfdd63c01326f7582fe73df58","src/codec/buffer.rs":"64aa0db180ca5e4b8107767eb2dc7f72a9e420d73af9149de25b531d0ee24ab6","src/codec/compression.rs":"e3661c0170990b84c80d581c86e9fea15392dea1ec98518652eef665b58d029e","src/codec/decode.rs":"a6e80a01518ccea28eb00a151bf72bbe74c3051d83efa7d96cf460f28936b95f","src/codec/encode.rs":"ffd0b1642b702093c9aaca9662575a1c60e6898328f78b37e6206b2b81b19d4e","src/codec/mod.rs":"09cdf7a565f3999d65c0b5a114dad6893bf9f4c0f38221d9620b2984cc9e95e1","src/codec/prost.rs":"bc13d7f85f9c0a41819c6efc719d1497774bd0f2004e5e54c0b2b35a4ca98c89","src/codegen.rs":"1e55b6384b7376423fb9aca17be560d75ae7d2c2d8a66051191b9fb6d3842df4","src/extensions.rs":"cba642955ce0180a2ae5c0be5885b2ab305781914ad23a14a8e3d01a757f6959","src/lib.rs":"6212dc35341d3a1b102135a67bcadd2da5f36fc41d57d145a96682b85a7d65cf","src/macros.rs":"9f43c77e85e3d41707ffc654bd909e34c57108274403a8e44bfcf72ef1068648","src/metadata/encoding.rs":"67bd7b9ac083d33b3b70759b664ff7d315b0eb5a63e49a78fbddfd32620a34b9","src/metadata/key.rs":"8c06f18aa6ee7a8905193ffd0bb5b8b9aa3110d2dc31838562dce8ad29677474","src/metadata/map.rs":"e3d19d25c17aab298c3d17939bbb44b20bd9c7fb08adc4d990cd8d0a9a1ceef4","src/metadata/mod.rs":"880494bd1e4d6f6e08285a2aa652ae125b1534491361cc6584aac9e50877fe2f","src/metadata/value.rs":"943ea15e64c6ebfa5f2d0c96840a22be7e822c17e17e238ae921a85bccb8f143","src/request.rs":"8154ed88df542d0f3f46f062d0969f7bfb3a9989d7691a7431e7b4d467532801","src/response.rs":"dcef92d5f93e61a7d2acf1ae4f30dd09af98b9952fcc9358ccdfe73361cd99a9","src/server/grpc.rs":"c8bb8d48577484f78a4dc4a69b9c63a8d9205d744fd7bd1f801281a0139cc7a9","src/server/mod.rs":"93611db086a368345532777ffd87de7a8d6bd4a9782987469fa69bd1acb76013","src/server/service.rs":"68f49bbe8476f7fd1b6abef3e4af90345eae6a2d69b1897f7d30026f3f8e6f86","src/service/interceptor.rs":"64d24e3f70f75693accf4168019ba80f77789e8be1fa0b7d7446879de7427314","src/service/mod.rs":"b59ed230083eda71c914b43937c4193bc654db71eaae452e458efcc9c5e06fde","src/status.rs":"00627f5f01f9c3373f738b746cb8a1ecf35dd63488013b29c3f47af84ac990ed","src/transport/channel/endpoint.rs":"e40a6cbadbec94c1c47dc35a850ca0daf06aace2b24965bbcceda1ef36243729","src/transport/channel/mod.rs":"7f299c44db7013ef6f35d32480ac473a619fd0f0787b87fb00fd950d80bdcb7a","src/transport/channel/tls.rs":"1129a8027813746b7c4ebd52f96d166310c93ea98e6108de27bd04483f642351","src/transport/error.rs":"8ebb508bd1973a7af5736513fa11c933f4691198de9d9c2112ad2b6db1f29d80","src/transport/mod.rs":"98f1a871a282a4c5e5910df88661cdc4a2863df8507acd3ebd46228fac95d884","src/transport/server/conn.rs":"cc929ed4c7b72bb52b9aaaa732f5460c1dbc3fb213e74aac9fdc36dfeb1ffd0a","src/transport/server/incoming.rs":"538155eab460482d1d4016a5f57b57660982ed1b453627fdd9af795906f868e8","src/transport/server/mod.rs":"579762affa9641f984d026db6a5c14187632815e5556c94f1d574d3223cddf1f","src/transport/server/recover_error.rs":"b54719640e2158a42f4f80e4a0c18d341b946b63fdd40ce986ef8d993812cda1","src/transport/server/tls.rs":"02c7a08ca675faa783bcead9fbddbbb16a5e7d16ff5cac4faab4fdb07f3ed45a","src/transport/server/unix.rs":"6f27dc6bf362036551c6ccfa7f97a4948938f2360fbbc81e1a0541522c88a6af","src/transport/service/add_origin.rs":"cafcfbf49ac5e59d7eee18bb7a8d6e12f4d530bac9867763efa7906564a20209","src/transport/service/connection.rs":"67fac11c0519fd2edc381407bf2352a07956f541d8a2bf41669f61e596df3743","src/transport/service/connector.rs":"9a9d9b3654b444b43e483fa03298cccbe1841c88a2a59b96ab1e37818914a2e2","src/transport/service/discover.rs":"ac8d4d226e208b6fb93789a78be195dc6fa98430dece63549cf177df0ae31d39","src/transport/service/executor.rs":"d0b330b36c08517b780b42b5f30682396d1c0026b1b5f8d32c326a389860abde","src/transport/service/grpc_timeout.rs":"26bdabfa51cac7b76ca9f9cbe72c6b137fde55f9d1381b68df2b899e6f1450a5","src/transport/service/io.rs":"f4f75da2a396a54c1ab95a2cb51c7c2e0f10ae2580c90b86ae230a6a625950ce","src/transport/service/mod.rs":"4d53d1c0ffd4e5ea95c67db45297817e7f73579c92b9e2fe176749c00da74b5c","src/transport/service/reconnect.rs":"b2cb554372be7a7b0ba4c641cfc13f564e47dc26eb83d7fef7b421ae5721f6ac","src/transport/service/router.rs":"ef953b1ed40fdf6e32bad304cc4a8f0154031abfbf0dbcb81a0fe0eef816b204","src/transport/service/tls.rs":"5a70983a54a48be06899f4e85ddbb8699907f973fa6c80c1c37271bad5a7d2ba","src/transport/service/user_agent.rs":"9273ca8396175578c41909ac1f8cf3b68c94bc68bacdefc459421106e70f3238","src/transport/tls.rs":"9d2610b84e8cb4c148e271a8d5bf832d86a996e0cb23ed89b7fc8675781062c1","src/util.rs":"1fea02c56fc1d55186e5ec7eea5679453f9ac44f60cc38008a66fadb37ee84ce"},"package":"8f219fad3b929bef19b1f86fbc0358d35daed8f2cac972037ac0dc10bbb8d5fb"} \ No newline at end of file +{"files":{"Cargo.toml":"7d820d8b1734bdbbf19f4e2246f02100faec2f6871da8a564974e7b4d7305bd2","LICENSE":"4f38e3a425725eb447213c75c0d8ae9f0d1f2ebc4f3183e2106aaf07c23f4b20","benches-disabled/README.md":"e96b49b53ab1d02f426b837f0c98bf1b8722bc2115ae001b7e7b647c2ee7c52e","benches-disabled/bench_main.rs":"8f82376de4f916d17d8738036c964fa6cca240ccaf1262edfb4f526c2d2c25d6","benches-disabled/benchmarks/compiled_protos/diverse_types.rs":"2109a6f689b0d726ef3a6be377eda63a5fe4f17647f5579ba8162fba77535670","benches-disabled/benchmarks/compiled_protos/helloworld.rs":"b2a907786f10cffe8bd45b1866918a623e6b9b53ee5218c6b359ae23c14b249b","benches-disabled/benchmarks/compiled_protos/mod.rs":"1857aea8b5495e0f7554401dcc4701c477814d4b169bab1f03fe91582f6322ea","benches-disabled/benchmarks/mod.rs":"3f14e7149d164310462a6aeb9c053335b48d5627978f22ff374bb5dbc8e1867c","benches-disabled/benchmarks/request_response.rs":"8adff001d461cbd0d1661875850f592b65bd8d0f635f72f456c872cbcc56fc7a","benches-disabled/benchmarks/request_response_diverse_types.rs":"2cea67f00c29ad34ba8feeefa15686190764ffb7002f1c169acb6f8be752e896","benches-disabled/benchmarks/utils.rs":"9928d8815834336d9c32f6f9508ba57222c1c938d4115d62a0bd9958037421c1","benches-disabled/proto/diverse_types/diverse_types.proto":"273b80dfe1c6b3215cb808c9173a4d4aab9ef8361708f7f354533386dd8852d5","benches-disabled/proto/helloworld/helloworld.proto":"1b5052c8c38afc5e6d122a26f59f9c93a71470f1354f888c07f73e53dec011ee","benches/decode.rs":"b7bdf715f0d9b1cbf388e472034df79196dbf90859ce1f992a1eb04950f3ae6a","src/body.rs":"07258aa861ecc8bfc7a6a1d4216d8eb500b3df444fded66e609b4ee201993bd3","src/client/grpc.rs":"807be5faf1f811f80fdf486d19e73aa851518ec266065805ff4243d896d03746","src/client/mod.rs":"0b43aae7cea7b218d5195da89368fa160d409eb06d620ce12a48951968430353","src/client/service.rs":"04b8d55d03592c426b4eb10e7521b30d8438983dfdd63c01326f7582fe73df58","src/codec/buffer.rs":"64aa0db180ca5e4b8107767eb2dc7f72a9e420d73af9149de25b531d0ee24ab6","src/codec/compression.rs":"e3661c0170990b84c80d581c86e9fea15392dea1ec98518652eef665b58d029e","src/codec/decode.rs":"6cdf91f12b1ab4efd43c71a6cffaec7e6bf8a9d0dd46db592de11c973b6610c5","src/codec/encode.rs":"dc495a540d989676ee7de479c0b3d6cbc20a6189d6a6eaf727cc38c458ea50ad","src/codec/mod.rs":"f451fc3db459fabf7ec1b006e1337d3773672480e946d1c11342684df800d0b6","src/codec/prost.rs":"bb0cfcba9a08ba0f05128fc2e6cfbbe8e934cc2e95196dea77d02e51df002261","src/codegen.rs":"1cdba80e2a17739534770c6a460280095288bf0d3f0a14a1d95f1e62811e5d6e","src/extensions.rs":"1091c1b1e90d5bc14e21774c65e6f790f9894d797b3eb6407ee80990cadc3a95","src/lib.rs":"85d16f0e76b3b3e47e71fa3ebd89f2ecd0daa065d5f8610561caee66a11233cc","src/macros.rs":"9f43c77e85e3d41707ffc654bd909e34c57108274403a8e44bfcf72ef1068648","src/metadata/encoding.rs":"7d36b24fb7ea4dbab819e8b4b884fd560925811121824a627ea7ecec6dbaf233","src/metadata/key.rs":"f0269498b0ef457ab010cf5d5864023b83d3b488dd652aad83f114ec6e828727","src/metadata/map.rs":"889f4a2533a0f130b3473be39ec4ce2158d4aaea7af6fcdae481e466a8682fe6","src/metadata/mod.rs":"880494bd1e4d6f6e08285a2aa652ae125b1534491361cc6584aac9e50877fe2f","src/metadata/value.rs":"6cefe63962df53af311e855448af26f6b91ff7ca7decb41c33dbbbf4cc419beb","src/request.rs":"b20929c51a553963adfdbbace9ef2935242aced87cd6e98e81832a7eb3cc276c","src/response.rs":"3ba51789093ae175f7703d309fc679dfef53b1cec31e25acd086a710f9d2cb97","src/server/grpc.rs":"5e89013da406d0d1626fe192186135cf4dc89282e9f83968af982d038f649fcb","src/server/mod.rs":"93611db086a368345532777ffd87de7a8d6bd4a9782987469fa69bd1acb76013","src/server/service.rs":"68f49bbe8476f7fd1b6abef3e4af90345eae6a2d69b1897f7d30026f3f8e6f86","src/service/interceptor.rs":"bb1028f477b0b6829ede4b64acef2d8a1397ae75092785ff31f7090812852783","src/service/mod.rs":"b59ed230083eda71c914b43937c4193bc654db71eaae452e458efcc9c5e06fde","src/status.rs":"39174eff517b24432052bd2c4cdb65b55c87ed5bec4c028d8046687b4b938b78","src/transport/channel/endpoint.rs":"6d0818453767fb41d083c965b86b50d7683a7b855d36a31ba9a4d11f46538c1c","src/transport/channel/mod.rs":"7f299c44db7013ef6f35d32480ac473a619fd0f0787b87fb00fd950d80bdcb7a","src/transport/channel/tls.rs":"640e9a965cbd0fddfd6a8e6f94eee77393a54dc706dcea3ec4ede416e5cd77ab","src/transport/error.rs":"4c961c4b31d33d9d7d08d89e5c1d61d912286c52849c882174d3a284e71fc694","src/transport/mod.rs":"cd1c429946700dfcd0f4b72f3101b7ff083d7ecde4ad7e7b3f689802e411959e","src/transport/server/conn.rs":"3b46346fca7bf6de3e8ff254688dc35f943a42d41f1ab08656ce8eda86b03942","src/transport/server/incoming.rs":"7709643cea420c885e93d1fd1eb67f7cf7cab9d94265487d3b42f03242df9527","src/transport/server/mod.rs":"579762affa9641f984d026db6a5c14187632815e5556c94f1d574d3223cddf1f","src/transport/server/recover_error.rs":"b54719640e2158a42f4f80e4a0c18d341b946b63fdd40ce986ef8d993812cda1","src/transport/server/tls.rs":"ce4ed37b019184f11f3c76544e539489b646c278c4d94f0a48f654f82206d237","src/transport/server/unix.rs":"6f27dc6bf362036551c6ccfa7f97a4948938f2360fbbc81e1a0541522c88a6af","src/transport/service/add_origin.rs":"cafcfbf49ac5e59d7eee18bb7a8d6e12f4d530bac9867763efa7906564a20209","src/transport/service/connection.rs":"67fac11c0519fd2edc381407bf2352a07956f541d8a2bf41669f61e596df3743","src/transport/service/connector.rs":"067d56a0a8e9927bbd5f672e2a1ccc1d071cc487b2e75da77e5b2032979efcf5","src/transport/service/discover.rs":"e41ba812575747ffd584c068ee8ff430ff889d8f26b6d4ef8493a0d77f122e68","src/transport/service/executor.rs":"d0b330b36c08517b780b42b5f30682396d1c0026b1b5f8d32c326a389860abde","src/transport/service/grpc_timeout.rs":"26bdabfa51cac7b76ca9f9cbe72c6b137fde55f9d1381b68df2b899e6f1450a5","src/transport/service/io.rs":"e66fec3a6b134ca409e9230b933c58d55d5cc35b5263a8d5c562c20fa3ffbcd3","src/transport/service/mod.rs":"4d53d1c0ffd4e5ea95c67db45297817e7f73579c92b9e2fe176749c00da74b5c","src/transport/service/reconnect.rs":"b2cb554372be7a7b0ba4c641cfc13f564e47dc26eb83d7fef7b421ae5721f6ac","src/transport/service/router.rs":"54ce2741ced3ed9fede8c81c6c13990ebb6589042429418047339212647a33bb","src/transport/service/tls.rs":"a88eba0f20197d52525ffa26e0a97148354a947aee5a5a669a2f04ac845d0e98","src/transport/service/user_agent.rs":"9273ca8396175578c41909ac1f8cf3b68c94bc68bacdefc459421106e70f3238","src/transport/tls.rs":"9d2610b84e8cb4c148e271a8d5bf832d86a996e0cb23ed89b7fc8675781062c1","src/util.rs":"0145f073b7af94deb951cff3621928998edb3fd4fe826cf70d90fe69e13cb655"},"package":"3082666a3a6433f7f511c7192923fa1fe07c69332d3c6a2e6bb040b569199d5a"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/tonic/Cargo.toml temporalio-1.3.0/vendor/tonic/Cargo.toml --- temporalio-1.3.0/vendor/tonic/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tonic/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -10,15 +10,15 @@ # See Cargo.toml.orig for the original contents. [package] -edition = "2018" +edition = "2021" name = "tonic" -version = "0.8.3" +version = "0.9.2" authors = ["Lucio Franco "] description = """ A gRPC over HTTP/2 implementation focused on high performance, interoperability, and flexibility. """ homepage = "https://github.com/hyperium/tonic" -documentation = "https://docs.rs/tonic/0.8.2/tonic/" +documentation = "https://docs.rs/tonic/0.9.2" readme = "README.md" keywords = [ "rpc", @@ -48,18 +48,19 @@ [dependencies.async-stream] version = "0.3" +optional = true [dependencies.async-trait] version = "0.1.13" optional = true [dependencies.axum] -version = "0.6" +version = "0.6.9" optional = true default_features = false [dependencies.base64] -version = "0.13" +version = "0.21" [dependencies.bytes] version = "1.0" @@ -101,14 +102,11 @@ [dependencies.pin-project] version = "1.0.11" -[dependencies.prost-derive] -version = "0.11" -optional = true - -[dependencies.prost1] +[dependencies.prost] version = "0.11" +features = ["std"] optional = true -package = "prost" +default-features = false [dependencies.rustls-native-certs] version = "0.6.1" @@ -120,20 +118,20 @@ [dependencies.tokio] version = "1.0.1" -features = ["net"] +features = [ + "net", + "time", + "macros", +] optional = true [dependencies.tokio-rustls] -version = "0.23.1" +version = "0.24.0" optional = true [dependencies.tokio-stream] version = "0.1" -[dependencies.tokio-util] -version = "0.7" -features = ["codec"] - [dependencies.tower] version = "0.4.7" features = [ @@ -158,12 +156,8 @@ [dependencies.tracing] version = "0.1" -[dependencies.tracing-futures] -version = "0.2" -optional = true - [dependencies.webpki-roots] -version = "0.22.1" +version = "0.23.0" optional = true [dev-dependencies.bencher] @@ -194,41 +188,36 @@ [features] channel = [ - "h2", - "hyper", - "tokio", - "tower", - "tracing-futures", - "tokio/macros", - "tokio/time", - "hyper-timeout", + "dep:h2", + "dep:hyper", + "dep:tokio", + "dep:tower", + "dep:hyper-timeout", ] -codegen = ["async-trait"] +codegen = ["dep:async-trait"] default = [ "transport", "codegen", "prost", ] -gzip = ["flate2"] -prost = [ - "prost1", - "prost-derive", -] +gzip = ["dep:flate2"] +prost = ["dep:prost"] tls = [ - "rustls-pemfile", + "dep:rustls-pemfile", "transport", - "tokio-rustls", + "dep:tokio-rustls", + "dep:async-stream", ] tls-roots = [ "tls-roots-common", - "rustls-native-certs", + "dep:rustls-native-certs", ] tls-roots-common = ["tls"] tls-webpki-roots = [ "tls-roots-common", - "webpki-roots", + "dep:webpki-roots", ] transport = [ - "axum", + "dep:axum", "channel", ] diff -Nru temporalio-1.3.0/vendor/tonic/src/body.rs temporalio-1.3.0/vendor/tonic/src/body.rs --- temporalio-1.3.0/vendor/tonic/src/body.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tonic/src/body.rs 2023-10-30 19:40:00.000000000 +0000 @@ -14,8 +14,6 @@ body.map_err(crate::Status::map_error).boxed_unsync() } -// this also exists in `crate::codegen` but we need it here since `codegen` has -// `#[cfg(feature = "codegen")]`. /// Create an empty `BoxBody` pub fn empty_body() -> BoxBody { http_body::Empty::new() diff -Nru temporalio-1.3.0/vendor/tonic/src/client/grpc.rs temporalio-1.3.0/vendor/tonic/src/client/grpc.rs --- temporalio-1.3.0/vendor/tonic/src/client/grpc.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tonic/src/client/grpc.rs 2023-10-30 19:40:00.000000000 +0000 @@ -39,6 +39,10 @@ accept_compression_encodings: EnabledCompressionEncodings, /// The compression encoding that will be applied to requests. send_compression_encodings: Option, + /// Limits the maximum size of a decoded message. + max_decoding_message_size: Option, + /// Limits the maximum size of an encoded message. + max_encoding_message_size: Option, } impl Grpc { @@ -58,6 +62,8 @@ origin, send_compression_encodings: None, accept_compression_encodings: EnabledCompressionEncodings::default(), + max_decoding_message_size: None, + max_encoding_message_size: None, }, } } @@ -124,6 +130,66 @@ self } + /// Limits the maximum size of a decoded message. + /// + /// # Example + /// + /// The most common way of using this is through a client generated by tonic-build: + /// + /// ```rust + /// use tonic::transport::Channel; + /// # struct TestClient(T); + /// # impl TestClient { + /// # fn new(channel: T) -> Self { Self(channel) } + /// # fn max_decoding_message_size(self, _: usize) -> Self { self } + /// # } + /// + /// # async { + /// let channel = Channel::builder("127.0.0.1:3000".parse().unwrap()) + /// .connect() + /// .await + /// .unwrap(); + /// + /// // Set the limit to 2MB, Defaults to 4MB. + /// let limit = 2 * 1024 * 1024; + /// let client = TestClient::new(channel).max_decoding_message_size(limit); + /// # }; + /// ``` + pub fn max_decoding_message_size(mut self, limit: usize) -> Self { + self.config.max_decoding_message_size = Some(limit); + self + } + + /// Limits the maximum size of an ecoded message. + /// + /// # Example + /// + /// The most common way of using this is through a client generated by tonic-build: + /// + /// ```rust + /// use tonic::transport::Channel; + /// # struct TestClient(T); + /// # impl TestClient { + /// # fn new(channel: T) -> Self { Self(channel) } + /// # fn max_encoding_message_size(self, _: usize) -> Self { self } + /// # } + /// + /// # async { + /// let channel = Channel::builder("127.0.0.1:3000".parse().unwrap()) + /// .connect() + /// .await + /// .unwrap(); + /// + /// // Set the limit to 2MB, Defaults to 4MB. + /// let limit = 2 * 1024 * 1024; + /// let client = TestClient::new(channel).max_encoding_message_size(limit); + /// # }; + /// ``` + pub fn max_encoding_message_size(mut self, limit: usize) -> Self { + self.config.max_encoding_message_size = Some(limit); + self + } + /// Check if the inner [`GrpcService`] is able to accept a new request. /// /// This will call [`GrpcService::poll_ready`] until it returns ready or @@ -228,7 +294,14 @@ M2: Send + Sync + 'static, { let request = request - .map(|s| encode_client(codec.encoder(), s, self.config.send_compression_encodings)) + .map(|s| { + encode_client( + codec.encoder(), + s, + self.config.send_compression_encodings, + self.config.max_encoding_message_size, + ) + }) .map(BoxBody::new); let request = self.config.prepare_request(request, path); @@ -278,7 +351,13 @@ let response = response.map(|body| { if expect_additional_trailers { - Streaming::new_response(decoder, body, status_code, encoding) + Streaming::new_response( + decoder, + body, + status_code, + encoding, + self.config.max_decoding_message_size, + ) } else { Streaming::new_empty(decoder, body) } @@ -291,9 +370,9 @@ impl GrpcConfig { fn prepare_request( &self, - request: Request>, + request: Request, path: PathAndQuery, - ) -> http::Request> { + ) -> http::Request { let scheme = self.origin.scheme().cloned(); let authority = self.origin.authority().cloned(); @@ -350,6 +429,8 @@ origin: self.config.origin.clone(), send_compression_encodings: self.config.send_compression_encodings, accept_compression_encodings: self.config.accept_compression_encodings, + max_encoding_message_size: self.config.max_encoding_message_size, + max_decoding_message_size: self.config.max_decoding_message_size, }, } } @@ -373,6 +454,16 @@ &self.config.accept_compression_encodings, ); + f.field( + "max_decoding_message_size", + &self.config.max_decoding_message_size, + ); + + f.field( + "max_encoding_message_size", + &self.config.max_encoding_message_size, + ); + f.finish() } } diff -Nru temporalio-1.3.0/vendor/tonic/src/codec/decode.rs temporalio-1.3.0/vendor/tonic/src/codec/decode.rs --- temporalio-1.3.0/vendor/tonic/src/codec/decode.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tonic/src/codec/decode.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,5 +1,5 @@ use super::compression::{decompress, CompressionEncoding}; -use super::{DecodeBuf, Decoder, HEADER_SIZE}; +use super::{DecodeBuf, Decoder, DEFAULT_MAX_RECV_MESSAGE_SIZE, HEADER_SIZE}; use crate::{body::BoxBody, metadata::MetadataMap, Code, Status}; use bytes::{Buf, BufMut, BytesMut}; use futures_core::Stream; @@ -32,6 +32,7 @@ trailers: Option, decompress_buf: BytesMut, encoding: Option, + max_message_size: Option, } impl Unpin for Streaming {} @@ -46,7 +47,7 @@ Error, } -#[derive(Debug)] +#[derive(Debug, PartialEq, Eq)] enum Direction { Request, Response(StatusCode), @@ -59,13 +60,20 @@ body: B, status_code: StatusCode, encoding: Option, + max_message_size: Option, ) -> Self where B: Body + Send + 'static, B::Error: Into, D: Decoder + Send + 'static, { - Self::new(decoder, body, Direction::Response(status_code), encoding) + Self::new( + decoder, + body, + Direction::Response(status_code), + encoding, + max_message_size, + ) } pub(crate) fn new_empty(decoder: D, body: B) -> Self @@ -74,17 +82,28 @@ B::Error: Into, D: Decoder + Send + 'static, { - Self::new(decoder, body, Direction::EmptyResponse, None) + Self::new(decoder, body, Direction::EmptyResponse, None, None) } #[doc(hidden)] - pub fn new_request(decoder: D, body: B, encoding: Option) -> Self + pub fn new_request( + decoder: D, + body: B, + encoding: Option, + max_message_size: Option, + ) -> Self where B: Body + Send + 'static, B::Error: Into, D: Decoder + Send + 'static, { - Self::new(decoder, body, Direction::Request, encoding) + Self::new( + decoder, + body, + Direction::Request, + encoding, + max_message_size, + ) } fn new( @@ -92,6 +111,7 @@ body: B, direction: Direction, encoding: Option, + max_message_size: Option, ) -> Self where B: Body + Send + 'static, @@ -111,6 +131,7 @@ trailers: None, decompress_buf: BytesMut::new(), encoding, + max_message_size, }, } } @@ -151,7 +172,21 @@ return Err(Status::new(Code::Internal, message)); } }; + let len = self.buf.get_u32() as usize; + let limit = self + .max_message_size + .unwrap_or(DEFAULT_MAX_RECV_MESSAGE_SIZE); + if len > limit { + return Err(Status::new( + Code::OutOfRange, + format!( + "Error, message length too large: found {} bytes, the limit is: {} bytes", + len, limit + ), + )); + } + self.buf.reserve(len); self.state = State::ReadBody { @@ -199,6 +234,10 @@ let chunk = match ready!(Pin::new(&mut self.body).poll_data(cx)) { Some(Ok(d)) => Some(d), Some(Err(e)) => { + if self.direction == Direction::Request && e.code() == Code::Cancelled { + return Poll::Ready(Ok(None)); + } + let _ = std::mem::replace(&mut self.state, State::Error); let err: crate::Error = e.into(); debug!("decoder inner stream error: {:?}", err); diff -Nru temporalio-1.3.0/vendor/tonic/src/codec/encode.rs temporalio-1.3.0/vendor/tonic/src/codec/encode.rs --- temporalio-1.3.0/vendor/tonic/src/codec/encode.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tonic/src/codec/encode.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,5 +1,5 @@ use super::compression::{compress, CompressionEncoding, SingleMessageCompressionOverride}; -use super::{EncodeBuf, Encoder, HEADER_SIZE}; +use super::{EncodeBuf, Encoder, DEFAULT_MAX_SEND_MESSAGE_SIZE, HEADER_SIZE}; use crate::{Code, Status}; use bytes::{BufMut, Bytes, BytesMut}; use futures_core::{Stream, TryStream}; @@ -19,12 +19,20 @@ source: U, compression_encoding: Option, compression_override: SingleMessageCompressionOverride, + max_message_size: Option, ) -> EncodeBody>> where T: Encoder, U: Stream>, { - let stream = encode(encoder, source, compression_encoding, compression_override).into_stream(); + let stream = encode( + encoder, + source, + compression_encoding, + compression_override, + max_message_size, + ) + .into_stream(); EncodeBody::new_server(stream) } @@ -33,6 +41,7 @@ encoder: T, source: U, compression_encoding: Option, + max_message_size: Option, ) -> EncodeBody>> where T: Encoder, @@ -43,6 +52,7 @@ source.map(Ok), compression_encoding, SingleMessageCompressionOverride::default(), + max_message_size, ) .into_stream(); EncodeBody::new_client(stream) @@ -53,6 +63,7 @@ source: U, compression_encoding: Option, compression_override: SingleMessageCompressionOverride, + max_message_size: Option, ) -> impl TryStream where T: Encoder, @@ -81,6 +92,7 @@ &mut buf, &mut uncompression_buf, compression_encoding, + max_message_size, item, ) }) @@ -91,6 +103,7 @@ buf: &mut BytesMut, uncompression_buf: &mut BytesMut, compression_encoding: Option, + max_message_size: Option, item: T::Item, ) -> Result where @@ -119,14 +132,26 @@ } // now that we know length, we can write the header - finish_encoding(compression_encoding, buf) + finish_encoding(compression_encoding, max_message_size, buf) } fn finish_encoding( compression_encoding: Option, + max_message_size: Option, buf: &mut BytesMut, ) -> Result { let len = buf.len() - HEADER_SIZE; + let limit = max_message_size.unwrap_or(DEFAULT_MAX_SEND_MESSAGE_SIZE); + if len > limit { + return Err(Status::new( + Code::OutOfRange, + format!( + "Error, message length too large: found {} bytes, the limit is: {} bytes", + len, limit + ), + )); + } + if len > std::u32::MAX as usize { return Err(Status::resource_exhausted(format!( "Cannot return body with more than 4GB of data but got {len} bytes" diff -Nru temporalio-1.3.0/vendor/tonic/src/codec/mod.rs temporalio-1.3.0/vendor/tonic/src/codec/mod.rs --- temporalio-1.3.0/vendor/tonic/src/codec/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tonic/src/codec/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -29,6 +29,10 @@ // data length std::mem::size_of::(); +// The default maximum uncompressed size in bytes for a message. Defaults to 4MB. +const DEFAULT_MAX_RECV_MESSAGE_SIZE: usize = 4 * 1024 * 1024; +const DEFAULT_MAX_SEND_MESSAGE_SIZE: usize = usize::MAX; + /// Trait that knows how to encode and decode gRPC messages. pub trait Codec { /// The encodable message. diff -Nru temporalio-1.3.0/vendor/tonic/src/codec/prost.rs temporalio-1.3.0/vendor/tonic/src/codec/prost.rs --- temporalio-1.3.0/vendor/tonic/src/codec/prost.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tonic/src/codec/prost.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,7 +1,7 @@ use super::{Codec, DecodeBuf, Decoder, Encoder}; use crate::codec::EncodeBuf; use crate::{Code, Status}; -use prost1::Message; +use prost::Message; use std::marker::PhantomData; /// A [`Codec`] that implements `application/grpc+proto` via the prost library.. @@ -69,7 +69,7 @@ } } -fn from_decode_error(error: prost1::DecodeError) -> crate::Status { +fn from_decode_error(error: prost::DecodeError) -> crate::Status { // Map Protobuf parse errors to an INTERNAL status code, as per // https://github.com/grpc/grpc/blob/master/doc/statuscodes.md Status::new(Code::Internal, error.to_string()) @@ -81,11 +81,13 @@ use crate::codec::{ encode_server, DecodeBuf, Decoder, EncodeBuf, Encoder, Streaming, HEADER_SIZE, }; - use crate::Status; + use crate::{Code, Status}; use bytes::{Buf, BufMut, BytesMut}; use http_body::Body; const LEN: usize = 10000; + // The maximum uncompressed size in bytes for a message. Set to 2MB. + const MAX_MESSAGE_SIZE: usize = 2 * 1024 * 1024; #[tokio::test] async fn decode() { @@ -103,7 +105,7 @@ let body = body::MockBody::new(&buf[..], 10005, 0); - let mut stream = Streaming::new_request(decoder, body, None); + let mut stream = Streaming::new_request(decoder, body, None, None); let mut i = 0usize; while let Some(output_msg) = stream.message().await.unwrap() { @@ -114,6 +116,39 @@ } #[tokio::test] + async fn decode_max_message_size_exceeded() { + let decoder = MockDecoder::default(); + + let msg = vec![0u8; MAX_MESSAGE_SIZE + 1]; + + let mut buf = BytesMut::new(); + + buf.reserve(msg.len() + HEADER_SIZE); + buf.put_u8(0); + buf.put_u32(msg.len() as u32); + + buf.put(&msg[..]); + + let body = body::MockBody::new(&buf[..], MAX_MESSAGE_SIZE + HEADER_SIZE + 1, 0); + + let mut stream = Streaming::new_request(decoder, body, None, Some(MAX_MESSAGE_SIZE)); + + let actual = stream.message().await.unwrap_err(); + + let expected = Status::new( + Code::OutOfRange, + format!( + "Error, message length too large: found {} bytes, the limit is: {} bytes", + msg.len(), + MAX_MESSAGE_SIZE + ), + ); + + assert_eq!(actual.code(), expected.code()); + assert_eq!(actual.message(), expected.message()); + } + + #[tokio::test] async fn encode() { let encoder = MockEncoder::default(); @@ -127,6 +162,7 @@ source, None, SingleMessageCompressionOverride::default(), + None, ); futures_util::pin_mut!(body); @@ -136,6 +172,38 @@ } } + #[tokio::test] + async fn encode_max_message_size_exceeded() { + let encoder = MockEncoder::default(); + + let msg = vec![0u8; MAX_MESSAGE_SIZE + 1]; + + let messages = std::iter::once(Ok::<_, Status>(msg)); + let source = futures_util::stream::iter(messages); + + let body = encode_server( + encoder, + source, + None, + SingleMessageCompressionOverride::default(), + Some(MAX_MESSAGE_SIZE), + ); + + futures_util::pin_mut!(body); + + assert!(body.data().await.is_none()); + assert_eq!( + body.trailers() + .await + .expect("no error polling trailers") + .expect("some trailers") + .get("grpc-status") + .expect("grpc-status header"), + "11" + ); + assert!(body.is_end_stream()); + } + // skip on windows because CI stumbles over our 4GB allocation #[cfg(not(target_family = "windows"))] #[tokio::test] @@ -152,6 +220,7 @@ source, None, SingleMessageCompressionOverride::default(), + Some(usize::MAX), ); futures_util::pin_mut!(body); diff -Nru temporalio-1.3.0/vendor/tonic/src/codegen.rs temporalio-1.3.0/vendor/tonic/src/codegen.rs --- temporalio-1.3.0/vendor/tonic/src/codegen.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tonic/src/codegen.rs 2023-10-30 19:40:00.000000000 +0000 @@ -11,20 +11,14 @@ pub use tower_service::Service; pub type StdError = Box; pub use crate::codec::{CompressionEncoding, EnabledCompressionEncodings}; +pub use crate::extensions::GrpcMethod; pub use crate::service::interceptor::InterceptedService; pub use bytes::Bytes; +pub use http; pub use http_body::Body; pub type BoxFuture = self::Pin> + Send + 'static>>; pub type BoxStream = self::Pin> + Send + 'static>>; -pub mod http { - pub use http::*; -} - -pub fn empty_body() -> crate::body::BoxBody { - http_body::Empty::new() - .map_err(|err| match err {}) - .boxed_unsync() -} +pub use crate::body::empty_body; diff -Nru temporalio-1.3.0/vendor/tonic/src/extensions.rs temporalio-1.3.0/vendor/tonic/src/extensions.rs --- temporalio-1.3.0/vendor/tonic/src/extensions.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tonic/src/extensions.rs 2023-10-30 19:40:00.000000000 +0000 @@ -71,3 +71,27 @@ f.debug_struct("Extensions").finish() } } + +/// A gRPC Method info extension. +#[derive(Debug)] +pub struct GrpcMethod { + service: &'static str, + method: &'static str, +} + +impl GrpcMethod { + /// Create a new `GrpcMethod` extension. + #[doc(hidden)] + pub fn new(service: &'static str, method: &'static str) -> Self { + Self { service, method } + } + + /// gRPC service name + pub fn service(&self) -> &str { + self.service + } + /// gRPC method name + pub fn method(&self) -> &str { + self.method + } +} diff -Nru temporalio-1.3.0/vendor/tonic/src/lib.rs temporalio-1.3.0/vendor/tonic/src/lib.rs --- temporalio-1.3.0/vendor/tonic/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tonic/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -53,6 +53,14 @@ //! to build even more feature rich clients and servers. This module also provides the ability to //! enable TLS using [`rustls`], via the `tls` feature flag. //! +//! # Code generated client/server configuration +//! +//! ## Max Message Size +//! +//! Currently, both servers and clients can be configured to set the max message encoding and +//! decoding size. This will ensure that an incoming gRPC message will not exahust the systems +//! memory. By default, the decoding message limit is `4MB` and the encoding limit is `usize::MAX`. +//! //! [gRPC]: https://grpc.io //! [`tonic`]: https://github.com/hyperium/tonic //! [`tokio`]: https://docs.rs/tokio @@ -81,7 +89,7 @@ #![doc( html_logo_url = "https://raw.githubusercontent.com/tokio-rs/website/master/public/img/icons/tonic.svg" )] -#![doc(html_root_url = "https://docs.rs/tonic/0.8.3")] +#![doc(html_root_url = "https://docs.rs/tonic/0.9.2")] #![doc(issue_tracker_base_url = "https://github.com/hyperium/tonic/issues/")] #![doc(test(no_crate_inject, attr(deny(rust_2018_idioms))))] #![cfg_attr(docsrs, feature(doc_cfg))] @@ -111,7 +119,7 @@ #[doc(inline)] pub use codec::Streaming; -pub use extensions::Extensions; +pub use extensions::{Extensions, GrpcMethod}; pub use request::{IntoRequest, IntoStreamingRequest, Request}; pub use response::Response; pub use status::{Code, Status}; diff -Nru temporalio-1.3.0/vendor/tonic/src/metadata/encoding.rs temporalio-1.3.0/vendor/tonic/src/metadata/encoding.rs --- temporalio-1.3.0/vendor/tonic/src/metadata/encoding.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tonic/src/metadata/encoding.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,3 +1,4 @@ +use base64::Engine as _; use bytes::Bytes; use http::header::HeaderValue; use std::error::Error; @@ -127,7 +128,7 @@ } fn from_bytes(value: &[u8]) -> Result { - let encoded_value: String = base64::encode_config(value, base64::STANDARD_NO_PAD); + let encoded_value: String = crate::util::base64::STANDARD_NO_PAD.encode(value); HeaderValue::from_maybe_shared(Bytes::from(encoded_value)) .map_err(|_| InvalidMetadataValueBytes::new()) } @@ -137,7 +138,7 @@ } fn from_static(value: &'static str) -> HeaderValue { - if base64::decode(value).is_err() { + if crate::util::base64::STANDARD.decode(value).is_err() { panic!("Invalid base64 passed to from_static: {}", value); } unsafe { @@ -148,13 +149,14 @@ } fn decode(value: &[u8]) -> Result { - base64::decode(value) + crate::util::base64::STANDARD + .decode(value) .map(|bytes_vec| bytes_vec.into()) .map_err(|_| InvalidMetadataValueBytes::new()) } fn equals(a: &HeaderValue, b: &[u8]) -> bool { - if let Ok(decoded) = base64::decode(a.as_bytes()) { + if let Ok(decoded) = crate::util::base64::STANDARD.decode(a.as_bytes()) { decoded == b } else { a.as_bytes() == b diff -Nru temporalio-1.3.0/vendor/tonic/src/metadata/key.rs temporalio-1.3.0/vendor/tonic/src/metadata/key.rs --- temporalio-1.3.0/vendor/tonic/src/metadata/key.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tonic/src/metadata/key.rs 2023-10-30 19:40:00.000000000 +0000 @@ -42,7 +42,7 @@ match HeaderName::from_bytes(src) { Ok(name) => { if !VE::is_valid_key(name.as_str()) { - panic!("invalid metadata key") + return Err(InvalidMetadataKey::new()); } Ok(MetadataKey { @@ -247,7 +247,7 @@ /// ``` #[inline] fn eq(&self, other: &MetadataKey) -> bool { - (*other).inner == *self + other.inner == *self } } @@ -282,3 +282,30 @@ } impl Error for InvalidMetadataKey {} + +#[cfg(test)] +mod tests { + use super::{AsciiMetadataKey, BinaryMetadataKey}; + + #[test] + fn test_from_bytes_binary() { + assert!(BinaryMetadataKey::from_bytes(b"").is_err()); + assert!(BinaryMetadataKey::from_bytes(b"\xFF").is_err()); + assert!(BinaryMetadataKey::from_bytes(b"abc").is_err()); + assert_eq!( + BinaryMetadataKey::from_bytes(b"abc-bin").unwrap().as_str(), + "abc-bin" + ); + } + + #[test] + fn test_from_bytes_ascii() { + assert!(AsciiMetadataKey::from_bytes(b"").is_err()); + assert!(AsciiMetadataKey::from_bytes(b"\xFF").is_err()); + assert_eq!( + AsciiMetadataKey::from_bytes(b"abc").unwrap().as_str(), + "abc" + ); + assert!(AsciiMetadataKey::from_bytes(b"abc-bin").is_err()); + } +} diff -Nru temporalio-1.3.0/vendor/tonic/src/metadata/map.rs temporalio-1.3.0/vendor/tonic/src/metadata/map.rs --- temporalio-1.3.0/vendor/tonic/src/metadata/map.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tonic/src/metadata/map.rs 2023-10-30 19:40:00.000000000 +0000 @@ -958,7 +958,7 @@ /// use `insert_bin`. /// /// This method panics when the given key is a string and it cannot be - /// converted to a MetadataKey. + /// converted to a `MetadataKey`. /// /// If the map did not previously have this key present, then `None` is /// returned. @@ -1008,7 +1008,7 @@ /// Like insert, but for Binary keys (for example "trace-proto-bin"). /// /// This method panics when the given key is a string and it cannot be - /// converted to a MetadataKey. + /// converted to a `MetadataKey`. /// /// # Examples /// @@ -1050,7 +1050,7 @@ /// use `append_bin`. /// /// This method panics when the given key is a string and it cannot be - /// converted to a MetadataKey. + /// converted to a `MetadataKey`. /// /// If the map did not previously have this key present, then `false` is /// returned. @@ -1099,7 +1099,7 @@ /// Like append, but for binary keys (for example "trace-proto-bin"). /// /// This method panics when the given key is a string and it cannot be - /// converted to a MetadataKey. + /// converted to a `MetadataKey`. /// /// # Examples /// @@ -1362,7 +1362,7 @@ match self.inner { Some(ref mut inner) => inner .next() - .map(&MetadataValue::unchecked_from_header_value_ref), + .map(MetadataValue::unchecked_from_header_value_ref), None => None, } } @@ -1383,7 +1383,7 @@ match self.inner { Some(ref mut inner) => inner .next_back() - .map(&MetadataValue::unchecked_from_header_value_ref), + .map(MetadataValue::unchecked_from_header_value_ref), None => None, } } @@ -1400,7 +1400,7 @@ fn next(&mut self) -> Option { self.inner .next() - .map(&MetadataValue::unchecked_from_mut_header_value_ref) + .map(MetadataValue::unchecked_from_mut_header_value_ref) } } @@ -1411,7 +1411,7 @@ fn next_back(&mut self) -> Option { self.inner .next_back() - .map(&MetadataValue::unchecked_from_mut_header_value_ref) + .map(MetadataValue::unchecked_from_mut_header_value_ref) } } @@ -1992,7 +1992,7 @@ fn into_iter(self) -> ValueIter<'a, VE> { ValueIter { - inner: (&self.inner).as_ref().map(|inner| inner.into_iter()), + inner: self.inner.as_ref().map(|inner| inner.into_iter()), phantom: PhantomData, } } @@ -2037,7 +2037,7 @@ ) -> Option> { map.headers .insert(self.inner, val.inner) - .map(&MetadataValue::unchecked_from_header_value) + .map(MetadataValue::unchecked_from_header_value) } #[doc(hidden)] @@ -2059,7 +2059,7 @@ ) -> Option> { map.headers .insert(&self.inner, val.inner) - .map(&MetadataValue::unchecked_from_header_value) + .map(MetadataValue::unchecked_from_header_value) } #[doc(hidden)] #[inline] @@ -2083,7 +2083,7 @@ map.headers .insert(key.inner, val.inner) - .map(&MetadataValue::unchecked_from_header_value) + .map(MetadataValue::unchecked_from_header_value) } #[doc(hidden)] #[inline] @@ -2141,7 +2141,7 @@ fn get(self, map: &MetadataMap) -> Option<&MetadataValue> { map.headers .get(self.inner) - .map(&MetadataValue::unchecked_from_header_value_ref) + .map(MetadataValue::unchecked_from_header_value_ref) } #[doc(hidden)] @@ -2149,7 +2149,7 @@ fn get_mut(self, map: &mut MetadataMap) -> Option<&mut MetadataValue> { map.headers .get_mut(self.inner) - .map(&MetadataValue::unchecked_from_mut_header_value_ref) + .map(MetadataValue::unchecked_from_mut_header_value_ref) } #[doc(hidden)] @@ -2172,7 +2172,7 @@ fn remove(self, map: &mut MetadataMap) -> Option> { map.headers .remove(self.inner) - .map(&MetadataValue::unchecked_from_header_value) + .map(MetadataValue::unchecked_from_header_value) } } @@ -2184,7 +2184,7 @@ fn get(self, map: &MetadataMap) -> Option<&MetadataValue> { map.headers .get(&self.inner) - .map(&MetadataValue::unchecked_from_header_value_ref) + .map(MetadataValue::unchecked_from_header_value_ref) } #[doc(hidden)] @@ -2192,7 +2192,7 @@ fn get_mut(self, map: &mut MetadataMap) -> Option<&mut MetadataValue> { map.headers .get_mut(&self.inner) - .map(&MetadataValue::unchecked_from_mut_header_value_ref) + .map(MetadataValue::unchecked_from_mut_header_value_ref) } #[doc(hidden)] @@ -2215,7 +2215,7 @@ fn remove(self, map: &mut MetadataMap) -> Option> { map.headers .remove(&self.inner) - .map(&MetadataValue::unchecked_from_header_value) + .map(MetadataValue::unchecked_from_header_value) } } @@ -2230,7 +2230,7 @@ } map.headers .get(self) - .map(&MetadataValue::unchecked_from_header_value_ref) + .map(MetadataValue::unchecked_from_header_value_ref) } #[doc(hidden)] @@ -2241,7 +2241,7 @@ } map.headers .get_mut(self) - .map(&MetadataValue::unchecked_from_mut_header_value_ref) + .map(MetadataValue::unchecked_from_mut_header_value_ref) } #[doc(hidden)] @@ -2277,7 +2277,7 @@ } map.headers .remove(self) - .map(&MetadataValue::unchecked_from_header_value) + .map(MetadataValue::unchecked_from_header_value) } } @@ -2292,7 +2292,7 @@ } map.headers .get(self.as_str()) - .map(&MetadataValue::unchecked_from_header_value_ref) + .map(MetadataValue::unchecked_from_header_value_ref) } #[doc(hidden)] @@ -2303,7 +2303,7 @@ } map.headers .get_mut(self.as_str()) - .map(&MetadataValue::unchecked_from_mut_header_value_ref) + .map(MetadataValue::unchecked_from_mut_header_value_ref) } #[doc(hidden)] @@ -2338,7 +2338,7 @@ } map.headers .remove(self.as_str()) - .map(&MetadataValue::unchecked_from_header_value) + .map(MetadataValue::unchecked_from_header_value) } } @@ -2353,7 +2353,7 @@ } map.headers .get(self.as_str()) - .map(&MetadataValue::unchecked_from_header_value_ref) + .map(MetadataValue::unchecked_from_header_value_ref) } #[doc(hidden)] @@ -2364,7 +2364,7 @@ } map.headers .get_mut(self.as_str()) - .map(&MetadataValue::unchecked_from_mut_header_value_ref) + .map(MetadataValue::unchecked_from_mut_header_value_ref) } #[doc(hidden)] @@ -2399,7 +2399,7 @@ } map.headers .remove(self.as_str()) - .map(&MetadataValue::unchecked_from_header_value) + .map(MetadataValue::unchecked_from_header_value) } } @@ -2520,7 +2520,7 @@ let mut found_x_word = false; for key_and_value in map.iter() { - if let KeyAndValueRef::Ascii(ref key, ref _value) = key_and_value { + if let KeyAndValueRef::Ascii(key, _value) = key_and_value { if key.as_str() == "x-word" { found_x_word = true; } else { @@ -2540,7 +2540,7 @@ let mut found_x_word_bin = false; for key_and_value in map.iter() { - if let KeyAndValueRef::Binary(ref key, ref _value) = key_and_value { + if let KeyAndValueRef::Binary(key, _value) = key_and_value { if key.as_str() == "x-word-bin" { found_x_word_bin = true; } else { @@ -2561,7 +2561,7 @@ let mut found_x_word = false; for key_and_value in map.iter_mut() { - if let KeyAndMutValueRef::Ascii(ref key, ref _value) = key_and_value { + if let KeyAndMutValueRef::Ascii(key, _value) = key_and_value { if key.as_str() == "x-word" { found_x_word = true; } else { @@ -2581,7 +2581,7 @@ let mut found_x_word_bin = false; for key_and_value in map.iter_mut() { - if let KeyAndMutValueRef::Binary(ref key, ref _value) = key_and_value { + if let KeyAndMutValueRef::Binary(key, _value) = key_and_value { if key.as_str() == "x-word-bin" { found_x_word_bin = true; } else { diff -Nru temporalio-1.3.0/vendor/tonic/src/metadata/value.rs temporalio-1.3.0/vendor/tonic/src/metadata/value.rs --- temporalio-1.3.0/vendor/tonic/src/metadata/value.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tonic/src/metadata/value.rs 2023-10-30 19:40:00.000000000 +0000 @@ -7,7 +7,6 @@ use bytes::Bytes; use http::header::HeaderValue; -use std::convert::TryFrom; use std::error::Error; use std::hash::{Hash, Hasher}; use std::marker::PhantomData; @@ -125,7 +124,7 @@ } /// Convert a `Bytes` directly into a `MetadataValue` without validating. - /// For MetadataValue the provided parameter must be base64 + /// For `MetadataValue` the provided parameter must be base64 /// encoded without padding bytes at the end. /// /// # Safety @@ -286,7 +285,6 @@ /// /// ``` /// # use tonic::metadata::*; -/// # use std::convert::TryFrom; /// let val = AsciiMetadataValue::try_from(b"hello\xfa").unwrap(); /// assert_eq!(val, &b"hello\xfa"[..]); /// ``` @@ -295,7 +293,6 @@ /// /// ``` /// # use tonic::metadata::*; -/// # use std::convert::TryFrom; /// let val = AsciiMetadataValue::try_from(b"\n"); /// assert!(val.is_err()); /// ``` @@ -324,7 +321,6 @@ /// /// ``` /// # use tonic::metadata::*; -/// # use std::convert::TryFrom; /// let val = AsciiMetadataValue::try_from(b"hello\xfa").unwrap(); /// assert_eq!(val, &b"hello\xfa"[..]); /// ``` @@ -333,7 +329,6 @@ /// /// ``` /// # use tonic::metadata::*; -/// # use std::convert::TryFrom; /// let val = AsciiMetadataValue::try_from(b"\n"); /// assert!(val.is_err()); /// ``` @@ -464,7 +459,7 @@ src.parse() } - /// Converts a MetadataKey into a MetadataValue. + /// Converts a MetadataKey into a `MetadataValue`. /// /// Since every valid MetadataKey is a valid MetadataValue this is done /// infallibly. @@ -473,7 +468,6 @@ /// /// ``` /// # use tonic::metadata::*; - /// # use std::convert::TryFrom; /// let val = AsciiMetadataValue::from_key::("accept".parse().unwrap()); /// assert_eq!(val, AsciiMetadataValue::try_from(b"accept").unwrap()); /// ``` @@ -484,9 +478,9 @@ /// Returns the length of `self`, in bytes. /// - /// This method is not available for MetadataValue because that + /// This method is not available for `MetadataValue` because that /// cannot be implemented in constant time, which most people would probably - /// expect. To get the length of MetadataValue, convert it to a + /// expect. To get the length of `MetadataValue`, convert it to a /// Bytes value and measure its length. /// /// # Examples diff -Nru temporalio-1.3.0/vendor/tonic/src/request.rs temporalio-1.3.0/vendor/tonic/src/request.rs --- temporalio-1.3.0/vendor/tonic/src/request.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tonic/src/request.rs 2023-10-30 19:40:00.000000000 +0000 @@ -203,6 +203,40 @@ } } + /// Get the local address of this connection. + /// + /// This will return `None` if the `IO` type used + /// does not implement `Connected` or when using a unix domain socket. + /// This currently only works on the server side. + pub fn local_addr(&self) -> Option { + #[cfg(feature = "transport")] + { + #[cfg(feature = "tls")] + { + self.extensions() + .get::() + .and_then(|i| i.local_addr()) + .or_else(|| { + self.extensions() + .get::>() + .and_then(|i| i.get_ref().local_addr()) + }) + } + + #[cfg(not(feature = "tls"))] + { + self.extensions() + .get::() + .and_then(|i| i.local_addr()) + } + } + + #[cfg(not(feature = "transport"))] + { + None + } + } + /// Get the remote address of this connection. /// /// This will return `None` if the `IO` type used diff -Nru temporalio-1.3.0/vendor/tonic/src/response.rs temporalio-1.3.0/vendor/tonic/src/response.rs --- temporalio-1.3.0/vendor/tonic/src/response.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tonic/src/response.rs 2023-10-30 19:40:00.000000000 +0000 @@ -54,11 +54,13 @@ self.message } - pub(crate) fn into_parts(self) -> (MetadataMap, T, Extensions) { + /// Consumes `self` returning the parts of the response. + pub fn into_parts(self) -> (MetadataMap, T, Extensions) { (self.metadata, self.message, self.extensions) } - pub(crate) fn from_parts(metadata: MetadataMap, message: T, extensions: Extensions) -> Self { + /// Create a new gRPC response from metadata, message and extensions. + pub fn from_parts(metadata: MetadataMap, message: T, extensions: Extensions) -> Self { Self { metadata, message, diff -Nru temporalio-1.3.0/vendor/tonic/src/server/grpc.rs temporalio-1.3.0/vendor/tonic/src/server/grpc.rs --- temporalio-1.3.0/vendor/tonic/src/server/grpc.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tonic/src/server/grpc.rs 2023-10-30 19:40:00.000000000 +0000 @@ -36,6 +36,10 @@ accept_compression_encodings: EnabledCompressionEncodings, /// Which compression encodings might the server use for responses. send_compression_encodings: EnabledCompressionEncodings, + /// Limits the maximum size of a decoded message. + max_decoding_message_size: Option, + /// Limits the maximum size of an encoded message. + max_encoding_message_size: Option, } impl Grpc @@ -48,6 +52,8 @@ codec, accept_compression_encodings: EnabledCompressionEncodings::default(), send_compression_encodings: EnabledCompressionEncodings::default(), + max_decoding_message_size: None, + max_encoding_message_size: None, } } @@ -114,6 +120,66 @@ self } + /// Limits the maximum size of a decoded message. + /// + /// # Example + /// + /// The most common way of using this is through a server generated by tonic-build: + /// + /// ```rust + /// # struct Svc; + /// # struct ExampleServer(T); + /// # impl ExampleServer { + /// # fn new(svc: T) -> Self { Self(svc) } + /// # fn max_decoding_message_size(self, _: usize) -> Self { self } + /// # } + /// # #[tonic::async_trait] + /// # trait Example {} + /// + /// #[tonic::async_trait] + /// impl Example for Svc { + /// // ... + /// } + /// + /// // Set the limit to 2MB, Defaults to 4MB. + /// let limit = 2 * 1024 * 1024; + /// let service = ExampleServer::new(Svc).max_decoding_message_size(limit); + /// ``` + pub fn max_decoding_message_size(mut self, limit: usize) -> Self { + self.max_decoding_message_size = Some(limit); + self + } + + /// Limits the maximum size of a encoded message. + /// + /// # Example + /// + /// The most common way of using this is through a server generated by tonic-build: + /// + /// ```rust + /// # struct Svc; + /// # struct ExampleServer(T); + /// # impl ExampleServer { + /// # fn new(svc: T) -> Self { Self(svc) } + /// # fn max_encoding_message_size(self, _: usize) -> Self { self } + /// # } + /// # #[tonic::async_trait] + /// # trait Example {} + /// + /// #[tonic::async_trait] + /// impl Example for Svc { + /// // ... + /// } + /// + /// // Set the limit to 2MB, Defaults to 4MB. + /// let limit = 2 * 1024 * 1024; + /// let service = ExampleServer::new(Svc).max_encoding_message_size(limit); + /// ``` + pub fn max_encoding_message_size(mut self, limit: usize) -> Self { + self.max_encoding_message_size = Some(limit); + self + } + #[doc(hidden)] pub fn apply_compression_config( self, @@ -134,6 +200,24 @@ this } + #[doc(hidden)] + pub fn apply_max_message_size_config( + self, + max_decoding_message_size: Option, + max_encoding_message_size: Option, + ) -> Self { + let mut this = self; + + if let Some(limit) = max_decoding_message_size { + this = this.max_decoding_message_size(limit); + } + if let Some(limit) = max_encoding_message_size { + this = this.max_encoding_message_size(limit); + } + + this + } + /// Handle a single unary gRPC request. pub async fn unary( &mut self, @@ -158,6 +242,7 @@ Err(status), accept_encoding, SingleMessageCompressionOverride::default(), + self.max_encoding_message_size, ); } }; @@ -169,7 +254,12 @@ let compression_override = compression_override_from_response(&response); - self.map_response(response, accept_encoding, compression_override) + self.map_response( + response, + accept_encoding, + compression_override, + self.max_encoding_message_size, + ) } /// Handle a server side streaming request. @@ -196,6 +286,7 @@ Err(status), accept_encoding, SingleMessageCompressionOverride::default(), + self.max_encoding_message_size, ); } }; @@ -208,6 +299,7 @@ // disabling compression of individual stream items must be done on // the items themselves SingleMessageCompressionOverride::default(), + self.max_encoding_message_size, ) } @@ -236,7 +328,12 @@ let compression_override = compression_override_from_response(&response); - self.map_response(response, accept_encoding, compression_override) + self.map_response( + response, + accept_encoding, + compression_override, + self.max_encoding_message_size, + ) } /// Handle a bi-directional streaming gRPC request. @@ -264,6 +361,7 @@ response, accept_encoding, SingleMessageCompressionOverride::default(), + self.max_encoding_message_size, ) } @@ -279,8 +377,12 @@ let (parts, body) = request.into_parts(); - let stream = - Streaming::new_request(self.codec.decoder(), body, request_compression_encoding); + let stream = Streaming::new_request( + self.codec.decoder(), + body, + request_compression_encoding, + self.max_decoding_message_size, + ); futures_util::pin_mut!(stream); @@ -308,8 +410,14 @@ { let encoding = self.request_encoding_if_supported(&request)?; - let request = - request.map(|body| Streaming::new_request(self.codec.decoder(), body, encoding)); + let request = request.map(|body| { + Streaming::new_request( + self.codec.decoder(), + body, + encoding, + self.max_decoding_message_size, + ) + }); Ok(Request::from_http(request)) } @@ -319,6 +427,7 @@ response: Result, Status>, accept_encoding: Option, compression_override: SingleMessageCompressionOverride, + max_message_size: Option, ) -> http::Response where B: TryStream + Send + 'static, @@ -349,6 +458,7 @@ body.into_stream(), accept_encoding, compression_override, + max_message_size, ); http::Response::from_parts(parts, BoxBody::new(body)) diff -Nru temporalio-1.3.0/vendor/tonic/src/service/interceptor.rs temporalio-1.3.0/vendor/tonic/src/service/interceptor.rs --- temporalio-1.3.0/vendor/tonic/src/service/interceptor.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tonic/src/service/interceptor.rs 2023-10-30 19:40:00.000000000 +0000 @@ -189,10 +189,9 @@ } // required to use `InterceptedService` with `Router` -#[cfg(feature = "transport")] -impl crate::transport::NamedService for InterceptedService +impl crate::server::NamedService for InterceptedService where - S: crate::transport::NamedService, + S: crate::server::NamedService, { const NAME: &'static str = S::NAME; } @@ -349,7 +348,7 @@ Ok::<_, hyper::Error>(hyper::Response::new(hyper::Body::empty())) }); - let svc = InterceptedService::new(svc, |request: crate::Request<()>| Ok(request)); + let svc = InterceptedService::new(svc, Ok); let request = http::Request::builder() .method(http::Method::OPTIONS) diff -Nru temporalio-1.3.0/vendor/tonic/src/status.rs temporalio-1.3.0/vendor/tonic/src/status.rs --- temporalio-1.3.0/vendor/tonic/src/status.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tonic/src/status.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,5 +1,6 @@ use crate::body::BoxBody; use crate::metadata::MetadataMap; +use base64::Engine as _; use bytes::Bytes; use http::header::{HeaderMap, HeaderValue}; use percent_encoding::{percent_decode, percent_encode, AsciiSet, CONTROLS}; @@ -324,7 +325,14 @@ }) } - pub(crate) fn try_from_error( + /// Create a `Status` from various types of `Error`. + /// + /// Returns the error if a status could not be created. + /// + /// # Downcast stability + /// This function does not provide any stability guarantees around how it will downcast errors into + /// status codes. + pub fn try_from_error( err: Box, ) -> Result> { let err = match err.downcast::() { @@ -353,8 +361,17 @@ // FIXME: bubble this into `transport` and expose generic http2 reasons. #[cfg(feature = "transport")] fn from_h2_error(err: Box) -> Status { + let code = Self::code_from_h2(&err); + + let mut status = Self::new(code, format!("h2 protocol error: {}", err)); + status.source = Some(Arc::new(*err)); + status + } + + #[cfg(feature = "transport")] + fn code_from_h2(err: &h2::Error) -> Code { // See https://github.com/grpc/grpc/blob/3977c30/doc/PROTOCOL-HTTP2.md#errors - let code = match err.reason() { + match err.reason() { Some(h2::Reason::NO_ERROR) | Some(h2::Reason::PROTOCOL_ERROR) | Some(h2::Reason::INTERNAL_ERROR) @@ -368,11 +385,7 @@ Some(h2::Reason::INADEQUATE_SECURITY) => Code::PermissionDenied, _ => Code::Unknown, - }; - - let mut status = Self::new(code, format!("h2 protocol error: {}", err)); - status.source = Some(Arc::new(*err)); - status + } } #[cfg(feature = "transport")] @@ -408,6 +421,14 @@ if err.is_timeout() || err.is_connect() { return Some(Status::unavailable(err.to_string())); } + + if let Some(h2_err) = err.source().and_then(|e| e.downcast_ref::()) { + let code = Status::code_from_h2(h2_err); + let status = Self::new(code, format!("h2 protocol error: {}", err)); + + return Some(status); + } + None } @@ -435,7 +456,8 @@ let details = header_map .get(GRPC_STATUS_DETAILS_HEADER) .map(|h| { - base64::decode(h.as_bytes()) + crate::util::base64::STANDARD + .decode(h.as_bytes()) .expect("Invalid status header, expected base64 encoded value") }) .map(Bytes::from) @@ -499,7 +521,8 @@ Ok(header_map) } - pub(crate) fn add_header(&self, header_map: &mut HeaderMap) -> Result<(), Self> { + /// Add headers from this `Status` into `header_map`. + pub fn add_header(&self, header_map: &mut HeaderMap) -> Result<(), Self> { header_map.extend(self.metadata.clone().into_sanitized_headers()); header_map.insert(GRPC_STATUS_HEADER_CODE, self.code.to_header_value()); @@ -516,7 +539,7 @@ } if !self.details.is_empty() { - let details = base64::encode_config(&self.details[..], base64::STANDARD_NO_PAD); + let details = crate::util::base64::STANDARD_NO_PAD.encode(&self.details[..]); header_map.insert( GRPC_STATUS_DETAILS_HEADER, @@ -553,6 +576,12 @@ } } + /// Add a source error to this status. + pub fn set_source(&mut self, source: Arc) -> &mut Status { + self.source = Some(source); + self + } + #[allow(clippy::wrong_self_convention)] /// Build an `http::Response` from the given `Status`. pub fn to_http(self) -> http::Response { @@ -971,7 +1000,7 @@ let header_map = status.to_header_map().unwrap(); - let b64_details = base64::encode_config(DETAILS, base64::STANDARD_NO_PAD); + let b64_details = crate::util::base64::STANDARD_NO_PAD.encode(DETAILS); assert_eq!(header_map[super::GRPC_STATUS_DETAILS_HEADER], b64_details); diff -Nru temporalio-1.3.0/vendor/tonic/src/transport/channel/endpoint.rs temporalio-1.3.0/vendor/tonic/src/transport/channel/endpoint.rs --- temporalio-1.3.0/vendor/tonic/src/transport/channel/endpoint.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tonic/src/transport/channel/endpoint.rs 2023-10-30 19:40:00.000000000 +0000 @@ -7,14 +7,7 @@ use crate::transport::{service::SharedExec, Error, Executor}; use bytes::Bytes; use http::{uri::Uri, HeaderValue}; -use std::{ - convert::{TryFrom, TryInto}, - fmt, - future::Future, - pin::Pin, - str::FromStr, - time::Duration, -}; +use std::{fmt, future::Future, pin::Pin, str::FromStr, time::Duration}; use tower::make::MakeConnection; // use crate::transport::E diff -Nru temporalio-1.3.0/vendor/tonic/src/transport/channel/tls.rs temporalio-1.3.0/vendor/tonic/src/transport/channel/tls.rs --- temporalio-1.3.0/vendor/tonic/src/transport/channel/tls.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tonic/src/transport/channel/tls.rs 2023-10-30 19:40:00.000000000 +0000 @@ -7,8 +7,6 @@ use std::fmt; /// Configures TLS settings for endpoints. -#[cfg(feature = "tls")] -#[cfg_attr(docsrs, doc(cfg(feature = "tls")))] #[derive(Clone, Default)] pub struct ClientTlsConfig { domain: Option, @@ -16,7 +14,6 @@ identity: Option, } -#[cfg(feature = "tls")] impl fmt::Debug for ClientTlsConfig { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_struct("ClientTlsConfig") @@ -27,7 +24,6 @@ } } -#[cfg(feature = "tls")] impl ClientTlsConfig { /// Creates a new `ClientTlsConfig` using Rustls. pub fn new() -> Self { diff -Nru temporalio-1.3.0/vendor/tonic/src/transport/error.rs temporalio-1.3.0/vendor/tonic/src/transport/error.rs --- temporalio-1.3.0/vendor/tonic/src/transport/error.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tonic/src/transport/error.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,8 +1,3 @@ -// TODO: remove this when we use errors throughout, -// there are some that are only used under the TLS feature -// these probably should be scoped to a `TLSError` enum. -#![allow(dead_code)] - use std::{error::Error as StdError, fmt}; type Source = Box; diff -Nru temporalio-1.3.0/vendor/tonic/src/transport/mod.rs temporalio-1.3.0/vendor/tonic/src/transport/mod.rs --- temporalio-1.3.0/vendor/tonic/src/transport/mod.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tonic/src/transport/mod.rs 2023-10-30 19:40:00.000000000 +0000 @@ -63,7 +63,7 @@ //! # unimplemented!() //! # } //! # } -//! # impl tonic::transport::NamedService for Svc { +//! # impl tonic::server::NamedService for Svc { //! # const NAME: &'static str = "some_svc"; //! # } //! # let my_svc = Svc; @@ -99,10 +99,12 @@ pub use self::channel::{Channel, Endpoint}; pub use self::error::Error; #[doc(inline)] -pub use self::server::{NamedService, Server}; +pub use self::server::Server; #[doc(inline)] pub use self::service::grpc_timeout::TimeoutExpired; pub use self::tls::Certificate; +#[doc(inline)] +pub use crate::server::NamedService; pub use hyper::{Body, Uri}; pub(crate) use self::service::executor::Executor; diff -Nru temporalio-1.3.0/vendor/tonic/src/transport/server/conn.rs temporalio-1.3.0/vendor/tonic/src/transport/server/conn.rs --- temporalio-1.3.0/vendor/tonic/src/transport/server/conn.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tonic/src/transport/server/conn.rs 2023-10-30 19:40:00.000000000 +0000 @@ -68,10 +68,16 @@ /// [ext]: crate::Request::extensions #[derive(Debug, Clone)] pub struct TcpConnectInfo { + local_addr: Option, remote_addr: Option, } impl TcpConnectInfo { + /// Return the local address the IO resource is connected. + pub fn local_addr(&self) -> Option { + self.local_addr + } + /// Return the remote address the IO resource is connected too. pub fn remote_addr(&self) -> Option { self.remote_addr @@ -83,6 +89,7 @@ fn connect_info(&self) -> Self::ConnectInfo { TcpConnectInfo { + local_addr: Some(self.local_addr()), remote_addr: Some(self.remote_addr()), } } @@ -93,6 +100,7 @@ fn connect_info(&self) -> Self::ConnectInfo { TcpConnectInfo { + local_addr: self.local_addr().ok(), remote_addr: self.peer_addr().ok(), } } diff -Nru temporalio-1.3.0/vendor/tonic/src/transport/server/incoming.rs temporalio-1.3.0/vendor/tonic/src/transport/server/incoming.rs --- temporalio-1.3.0/vendor/tonic/src/transport/server/incoming.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tonic/src/transport/server/incoming.rs 2023-10-30 19:40:00.000000000 +0000 @@ -142,7 +142,7 @@ /// ```no_run /// # use tower_service::Service; /// # use http::{request::Request, response::Response}; - /// # use tonic::{body::BoxBody, transport::{Body, NamedService, Server, server::TcpIncoming}}; + /// # use tonic::{body::BoxBody, server::NamedService, transport::{Body, Server, server::TcpIncoming}}; /// # use core::convert::Infallible; /// # use std::error::Error; /// # fn main() { } // Cannot have type parameters, hence instead define: diff -Nru temporalio-1.3.0/vendor/tonic/src/transport/server/tls.rs temporalio-1.3.0/vendor/tonic/src/transport/server/tls.rs --- temporalio-1.3.0/vendor/tonic/src/transport/server/tls.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tonic/src/transport/server/tls.rs 2023-10-30 19:40:00.000000000 +0000 @@ -5,28 +5,26 @@ use std::fmt; /// Configures TLS settings for servers. -#[cfg(feature = "tls")] -#[cfg_attr(docsrs, doc(cfg(feature = "tls")))] #[derive(Clone, Default)] pub struct ServerTlsConfig { identity: Option, client_ca_root: Option, + client_auth_optional: bool, } -#[cfg(feature = "tls")] impl fmt::Debug for ServerTlsConfig { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_struct("ServerTlsConfig").finish() } } -#[cfg(feature = "tls")] impl ServerTlsConfig { /// Creates a new `ServerTlsConfig`. pub fn new() -> Self { ServerTlsConfig { identity: None, client_ca_root: None, + client_auth_optional: false, } } @@ -46,7 +44,24 @@ } } + /// Sets whether client certificate verification is optional. + /// + /// This option has effect only if CA certificate is set. + /// + /// # Default + /// By default, this option is set to `false`. + pub fn client_auth_optional(self, optional: bool) -> Self { + ServerTlsConfig { + client_auth_optional: optional, + ..self + } + } + pub(crate) fn tls_acceptor(&self) -> Result { - TlsAcceptor::new(self.identity.clone().unwrap(), self.client_ca_root.clone()) + TlsAcceptor::new( + self.identity.clone().unwrap(), + self.client_ca_root.clone(), + self.client_auth_optional, + ) } } diff -Nru temporalio-1.3.0/vendor/tonic/src/transport/service/connector.rs temporalio-1.3.0/vendor/tonic/src/transport/service/connector.rs --- temporalio-1.3.0/vendor/tonic/src/transport/service/connector.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tonic/src/transport/service/connector.rs 2023-10-30 19:40:00.000000000 +0000 @@ -3,8 +3,6 @@ #[cfg(feature = "tls")] use super::tls::TlsConnector; use http::Uri; -#[cfg(feature = "tls-roots-common")] -use std::convert::TryInto; use std::fmt; use std::task::{Context, Poll}; use tower::make::MakeConnection; diff -Nru temporalio-1.3.0/vendor/tonic/src/transport/service/discover.rs temporalio-1.3.0/vendor/tonic/src/transport/service/discover.rs --- temporalio-1.3.0/vendor/tonic/src/transport/service/discover.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tonic/src/transport/service/discover.rs 2023-10-30 19:40:00.000000000 +0000 @@ -36,6 +36,7 @@ let mut http = hyper::client::connect::HttpConnector::new(); http.set_nodelay(endpoint.tcp_nodelay); http.set_keepalive(endpoint.tcp_keepalive); + http.set_connect_timeout(endpoint.connect_timeout); http.enforce_http(false); #[cfg(feature = "tls")] let connector = service::connector(http, endpoint.tls.clone()); diff -Nru temporalio-1.3.0/vendor/tonic/src/transport/service/io.rs temporalio-1.3.0/vendor/tonic/src/transport/service/io.rs --- temporalio-1.3.0/vendor/tonic/src/transport/service/io.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tonic/src/transport/service/io.rs 2023-10-30 19:40:00.000000000 +0000 @@ -70,7 +70,7 @@ pub(crate) enum ServerIo { Io(IO), #[cfg(feature = "tls")] - TlsIo(TlsStream), + TlsIo(Box>), } use tower::util::Either; @@ -89,7 +89,7 @@ #[cfg(feature = "tls")] pub(in crate::transport) fn new_tls_io(io: TlsStream) -> Self { - Self::TlsIo(io) + Self::TlsIo(Box::new(io)) } #[cfg(feature = "tls")] diff -Nru temporalio-1.3.0/vendor/tonic/src/transport/service/router.rs temporalio-1.3.0/vendor/tonic/src/transport/service/router.rs --- temporalio-1.3.0/vendor/tonic/src/transport/service/router.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tonic/src/transport/service/router.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,6 +1,6 @@ use crate::{ body::{boxed, BoxBody}, - transport::NamedService, + server::NamedService, }; use http::{Request, Response}; use hyper::Body; diff -Nru temporalio-1.3.0/vendor/tonic/src/transport/service/tls.rs temporalio-1.3.0/vendor/tonic/src/transport/service/tls.rs --- temporalio-1.3.0/vendor/tonic/src/transport/service/tls.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tonic/src/transport/service/tls.rs 2023-10-30 19:40:00.000000000 +0000 @@ -5,27 +5,20 @@ }; #[cfg(feature = "tls-roots")] use rustls_native_certs; -#[cfg(feature = "tls")] -use std::convert::TryInto; use std::{fmt, sync::Arc}; use tokio::io::{AsyncRead, AsyncWrite}; -#[cfg(feature = "tls")] use tokio_rustls::{ rustls::{ClientConfig, RootCertStore, ServerConfig, ServerName}, TlsAcceptor as RustlsAcceptor, TlsConnector as RustlsConnector, }; /// h2 alpn in plain format for rustls. -#[cfg(feature = "tls")] const ALPN_H2: &str = "h2"; #[derive(Debug)] enum TlsError { - #[allow(dead_code)] H2NotNegotiated, - #[cfg(feature = "tls")] CertificateParseError, - #[cfg(feature = "tls")] PrivateKeyParseError, } @@ -36,7 +29,6 @@ } impl TlsConnector { - #[cfg(feature = "tls")] pub(crate) fn new( ca_cert: Option, identity: Option, @@ -123,20 +115,28 @@ } impl TlsAcceptor { - #[cfg(feature = "tls")] pub(crate) fn new( identity: Identity, client_ca_root: Option, + client_auth_optional: bool, ) -> Result { let builder = ServerConfig::builder().with_safe_defaults(); - let builder = match client_ca_root { - None => builder.with_no_client_auth(), - Some(cert) => { + let builder = match (client_ca_root, client_auth_optional) { + (None, _) => builder.with_no_client_auth(), + (Some(cert), true) => { + use tokio_rustls::rustls::server::AllowAnyAnonymousOrAuthenticatedClient; + let mut roots = RootCertStore::empty(); + rustls_keys::add_certs_from_pem(std::io::Cursor::new(&cert.pem[..]), &mut roots)?; + builder.with_client_cert_verifier( + AllowAnyAnonymousOrAuthenticatedClient::new(roots).boxed(), + ) + } + (Some(cert), false) => { use tokio_rustls::rustls::server::AllowAnyAuthenticatedClient; let mut roots = RootCertStore::empty(); rustls_keys::add_certs_from_pem(std::io::Cursor::new(&cert.pem[..]), &mut roots)?; - builder.with_client_cert_verifier(AllowAnyAuthenticatedClient::new(roots)) + builder.with_client_cert_verifier(AllowAnyAuthenticatedClient::new(roots).boxed()) } }; @@ -179,7 +179,6 @@ impl std::error::Error for TlsError {} -#[cfg(feature = "tls")] mod rustls_keys { use std::io::Cursor; @@ -188,21 +187,15 @@ use crate::transport::service::tls::TlsError; use crate::transport::Identity; - fn load_rustls_private_key( + pub(super) fn load_rustls_private_key( mut cursor: std::io::Cursor<&[u8]>, ) -> Result { - // First attempt to load the private key assuming it is PKCS8-encoded - if let Ok(mut keys) = rustls_pemfile::pkcs8_private_keys(&mut cursor) { - if let Some(key) = keys.pop() { - return Ok(PrivateKey(key)); - } - } - - // If it not, try loading the private key as an RSA key - cursor.set_position(0); - if let Ok(mut keys) = rustls_pemfile::rsa_private_keys(&mut cursor) { - if let Some(key) = keys.pop() { - return Ok(PrivateKey(key)); + while let Ok(Some(item)) = rustls_pemfile::read_one(&mut cursor) { + match item { + rustls_pemfile::Item::RSAKey(key) + | rustls_pemfile::Item::PKCS8Key(key) + | rustls_pemfile::Item::ECKey(key) => return Ok(PrivateKey(key)), + _ => continue, } } @@ -245,3 +238,78 @@ } } } + +#[cfg(test)] +mod tests { + use std::io::Cursor; + + // generated by: openssl ecparam -keygen -name 'prime256v1' + const SIMPLE_EC_KEY: &str = r#"-----BEGIN EC PARAMETERS----- +BggqhkjOPQMBBw== +-----END EC PARAMETERS----- +-----BEGIN EC PRIVATE KEY----- +MHcCAQEEICIDyh40kMVWGDAYr1gXnMfeMeO3zXYigOaWrg5SNB+zoAoGCCqGSM49 +AwEHoUQDQgAEacJyVg299dkPTzUaMbOmACUfF67yp+ZrDhXVjn/5WxBAgjcmFBHg +Tw8dfwpMzaJPXX5lWYzP276fcmbRO25CXw== +-----END EC PRIVATE KEY-----"#; + + // generated by: openssl genpkey -algorithm rsa + const SIMPLE_PKCS8_KEY: &str = r#"-----BEGIN PRIVATE KEY----- +MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAKHkX1YIvqOIAllD +5fKcIxu2kYjIxxAAQrOBRTloGZUKdPFQY1RANB4t/LEaI5/NJ6NK4915pTn35QAQ +zHJl+X4rNFMgVt+o/nY40PgrQxyyv5A0/URp+iS8Yn3GKt3q6p4zguiO9uNXhiiD +b+VKIFRDm4bHR2yM7pNJ0kMdoattAgMBAAECgYAMpw6UaMaNfVnBpD7agT11MwWY +zShRpdOQt++zFuG49kJBgejhcssf+LQhG0vhd2U7q+S3MISrTSaGpMl1v2aKR/nV +G7X4Bb6X8vrVSMrfze2loT0aNri9jKDZkD/muy6+9JkhRa03NOdhDdseokmcqF3L +xsU4BUOOFYb23ycoeQJBANOGxbZu/3BqsPJMQmXWo1CXuaviZ83lTczPtrz9mJVl +Zs/KmGnJ8I2Azu/dlYXsHRvbIbqA93l1M3GnsWl5IxsCQQDD7hKvOY6qzUNyj+R4 +vul/3xaqjiTj59f3jN7Fh6+9AY+WfvEkWfyUUAXY74z43wBgtORfMXnZnjFO96tJ +sswXAkBDYDtb19E/cox4MTg5DfwpMJrwmAYufCqi4Uq4uiI++/SanVKc57jaqbvA +hZkZ9lJzTAJbULcDFgTT3/FPwkkfAkEAqbSDMIzdGuox2n/x9/f8jcpweogmQdUl +xgCZUGSnfkFk2ojXW5Ip6Viqx+0toL6fOCRWjnFvRmPz958kGPCqPwJBAID4y7XV +peOO6Yadu0YbSmFNluRebia6410p5jR21LhG1ty2h22xVhlBWjOC+TyDuKwhmiYT +ed50S3LR1PWt4zE= +-----END PRIVATE KEY-----"#; + + // generated by: openssl genrsa + const SIMPLE_RSA_KEY: &str = r#"-----BEGIN RSA PRIVATE KEY----- +MIIEogIBAAKCAQEAoEILGds1/RGBHT7jM4R+EL24sQ6Bsn14GgTHc7WoZ7lainEH +H/n+DtHCYUXYyJnN5AMIi3pkigCP1hdXXBQga3zs3lXoi/mAMkT6vjuqQ7Xg5/95 +ABx5Ztyy25mZNaXm77glyAzSscKHxWYooXVJYG4C3SGuBJJ1zVjxen6Rkzse5Lpr +yZOUUeqeV3M6KbJ/dkR37HFQVwmlctQukFnb4kozFBQDDnkXi9jT/PH00g6JpW3z +YMzdMq2RMadJ0dzYv62OtdtqmQpVz0dRu/yODV4DkhrWwgPRj2uY4DnYthzILESB +x41gxHj+jqo6NW+C+0fr6uh2CXtD0p+ZVANtBQIDAQABAoIBAE7IaOCrLV1dr5WL +BvKancbpHdSdBxGSMOrJkqvFkCZ9ro8EhbYolcb/Q4nCZpInWlpPS3IWFzroj811 +6BJyKoXtAh1DKnE1lNohowrGFiv3S7uBkiCF3wC8Wokud20yQ9dxNdGkzCdrNIfM +cwj8ubfYHTxMhFnnDlaG9R98/V/dFy0FLxL37eMP/heMbcwKKm9P/G2FqvuCn8a4 +FoPbAfvaR64IGCybjoiTjUD7xMHIV4Gr5K07br2TzG2zVlFTacoqXyGBbVVy+ibt +QMh0sn+rMkAy+cFse+yCYZeAFa4FzwGz43sdFviU7uvLG7yXpvZ+uDACFzxlxUVg +v57r1cECgYEA1MMJEe6IunDUyuzRaFNTfQX16QcAv/xLN/1TtVB3HUX5p2bIZKDr +XEl0NCVOrCoz5RsYqbtGmp8B4Yxl3DeX+WeWeD9/f2ZTVGWyBx1N6dZ5hRsyfzG/ +xVBUqYxkChjXQ20cNtf8u7JKdnVjOJen9M92nXhFRTwgH83Id4gPp70CgYEAwNN8 +lvVJnd05ekyf1qIKOSyKiSGnGa5288PpqsjYMZisXy12y4n8cK2pX5Z5PICHeJVu +K99WdTtO7Q4ghCXRB1jR5pTd4/3/3089SQyDnWz9jlA3pGWcSLDTB1dBJXpMQ6yG +cR2dX5hPDNIdKsc+9Bl/OF5PScvGVUYv4SLF6ukCgYAVhh2WyNDgO6XrWYXdzgA2 +N7Im/uReh8F8So57W0aRmZCmFMnVFEp7LZsp41RQKnzRgqo+EYoU/l0MWk27t4wS +WR5pz9KwKsPnV9poydgl/eKRSq0THQ9PgM7v0BoWw2iTk6g1DCivPFw4G6wL/5uo +MozHZXFsjaaaUREktokO6QKBgC3Dg7RILtqaoIOYH+9OseJz4cU+CWyc7XpZKuHv +nO/YbkCAh8syyojrjmEzUz66umwx+t3KubhFBSxZx/nVB9EYkWiKOEdeBxY2tjLa +F3qLXXojK7GGtBrEbLE3UizU47jD/3xlLO59NXWzgFygwR4p1vnH2EWJaV7fs4lZ +OWPRAoGAL0nX0vZ0N9qPETiQan1uHjKYuuFiSP+cwRXVSUYIQM9qDRlKG9zjugwO +az+B6uiR4TrgbwG+faCQwcGk9B8QbcoIb8IigwrWe3XpVaEtcsqFORX0r+tJNDoY +I0O2DOQVPKSK2N5AZzXY4IkybWTV4Yxc7rdXEO3dOOpHGKbpwFQ= +-----END RSA PRIVATE KEY-----"#; + + #[test] + fn test_parse_ec_key() { + for (n, key) in [SIMPLE_EC_KEY, SIMPLE_PKCS8_KEY, SIMPLE_RSA_KEY] + .iter() + .enumerate() + { + let c = Cursor::new(key.as_bytes()); + let key = super::rustls_keys::load_rustls_private_key(c); + + assert!(key.is_ok(), "at the {}-th case", n); + } + } +} diff -Nru temporalio-1.3.0/vendor/tonic/src/util.rs temporalio-1.3.0/vendor/tonic/src/util.rs --- temporalio-1.3.0/vendor/tonic/src/util.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tonic/src/util.rs 2023-10-30 19:40:00.000000000 +0000 @@ -11,3 +11,27 @@ Some(#[pin] T), None, } + +pub(crate) mod base64 { + use base64::{ + alphabet, + engine::{ + general_purpose::{GeneralPurpose, GeneralPurposeConfig}, + DecodePaddingMode, + }, + }; + + pub(crate) const STANDARD: GeneralPurpose = GeneralPurpose::new( + &alphabet::STANDARD, + GeneralPurposeConfig::new() + .with_encode_padding(true) + .with_decode_padding_mode(DecodePaddingMode::Indifferent), + ); + + pub(crate) const STANDARD_NO_PAD: GeneralPurpose = GeneralPurpose::new( + &alphabet::STANDARD, + GeneralPurposeConfig::new() + .with_encode_padding(false) + .with_decode_padding_mode(DecodePaddingMode::Indifferent), + ); +} diff -Nru temporalio-1.3.0/vendor/tonic-build/.cargo-checksum.json temporalio-1.3.0/vendor/tonic-build/.cargo-checksum.json --- temporalio-1.3.0/vendor/tonic-build/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tonic-build/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"Cargo.toml":"a88265ae0bb8cf6ad6f18df73390bd3f89e7c81dea0f38c1e01acb26f6b48322","LICENSE":"4f38e3a425725eb447213c75c0d8ae9f0d1f2ebc4f3183e2106aaf07c23f4b20","README.md":"2e22fdf16304c74ddd10f988a0b2f651471b25ff7c8bc78664bbd4d0f1ea3e82","src/client.rs":"8a8f7293fa7761b16ed6242075b277223a2c10bcd5cf6d9da47442a32d6eea2f","src/code_gen.rs":"4bad4abc6675d1d05464d1b3c2c929269c5893ef3dc297b72d05c59fd55052bf","src/lib.rs":"f7e1c2783b43c39278aafeb8947effc4f5d037eb8a59d65548de80fbde7eaa38","src/manual.rs":"1684b149516126acd7d585c314866487e3d337ae07e6053cd0dd0eeefa73b3e0","src/prost.rs":"c57bf8124d37466fe9b1070b3bff6c973914bee1a1a7bd4122da989b953640df","src/server.rs":"fc40ba49b69c6f8abc1e67303718d590bbea67cb899b73b7d6cd2665eb172e11"},"package":"5bf5e9b9c0f7e0a7c027dcfaba7b2c60816c7049171f679d99ee2ff65d0de8c4"} \ No newline at end of file +{"files":{"Cargo.toml":"a4d90a5e76c17a284170817fd2e1a9199a73bfea742bfdf1b902c59e5a4360d4","LICENSE":"4f38e3a425725eb447213c75c0d8ae9f0d1f2ebc4f3183e2106aaf07c23f4b20","README.md":"2e22fdf16304c74ddd10f988a0b2f651471b25ff7c8bc78664bbd4d0f1ea3e82","src/client.rs":"4dd615d216a589d5564599b5d10d98c70489fd60b01426ed08c0538b4a467e84","src/code_gen.rs":"4bad4abc6675d1d05464d1b3c2c929269c5893ef3dc297b72d05c59fd55052bf","src/lib.rs":"ce403161bbeb18052debb40a35008a1c9b6f1962c7f9b61b91a302c3cc3eb19d","src/manual.rs":"1684b149516126acd7d585c314866487e3d337ae07e6053cd0dd0eeefa73b3e0","src/prost.rs":"149ae8a09c4e1c60e03eb05ce153770f9199de75430aee912fcc586bdc93933e","src/server.rs":"504a54a384aad8281d2c9a945abb7aad550b3e0fc516ddd84fd555fc01945302"},"package":"a6fdaae4c2c638bb70fe42803a26fbd6fc6ac8c72f5c59f67ecc2a2dcabf4b07"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/tonic-build/Cargo.toml temporalio-1.3.0/vendor/tonic-build/Cargo.toml --- temporalio-1.3.0/vendor/tonic-build/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tonic-build/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -10,15 +10,15 @@ # See Cargo.toml.orig for the original contents. [package] -edition = "2018" +edition = "2021" name = "tonic-build" -version = "0.8.4" +version = "0.9.2" authors = ["Lucio Franco "] description = """ Codegen module of `tonic` gRPC implementation. """ homepage = "https://github.com/hyperium/tonic" -documentation = "https://docs.rs/tonic-build/0.8.4/tonic_build/" +documentation = "https://docs.rs/tonic-build/0.9.2" readme = "README.md" keywords = [ "rpc", @@ -44,7 +44,7 @@ version = "1.0" [dependencies.prost-build] -version = "0.11.2" +version = "0.11.9" optional = true [dependencies.quote] diff -Nru temporalio-1.3.0/vendor/tonic-build/src/client.rs temporalio-1.3.0/vendor/tonic-build/src/client.rs --- temporalio-1.3.0/vendor/tonic-build/src/client.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tonic-build/src/client.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,7 +1,10 @@ use std::collections::HashSet; use super::{Attributes, Method, Service}; -use crate::{generate_doc_comments, naive_snake_case}; +use crate::{ + format_method_name, format_method_path, format_service_name, generate_doc_comments, + naive_snake_case, +}; use proc_macro2::TokenStream; use quote::{format_ident, quote}; @@ -51,21 +54,16 @@ let connect = generate_connect(&service_ident, build_transport); let package = if emit_package { service.package() } else { "" }; - let path = format!( - "{}{}{}", - package, - if package.is_empty() { "" } else { "." }, - service.identifier() - ); + let service_name = format_service_name(service, emit_package); - let service_doc = if disable_comments.contains(&path) { + let service_doc = if disable_comments.contains(&service_name) { TokenStream::new() } else { generate_doc_comments(service.comment()) }; let mod_attributes = attributes.for_mod(package); - let struct_attributes = attributes.for_struct(&path); + let struct_attributes = attributes.for_struct(&service_name); quote! { /// Generated client implementations. @@ -137,6 +135,24 @@ self } + /// Limits the maximum size of a decoded message. + /// + /// Default: `4MB` + #[must_use] + pub fn max_decoding_message_size(mut self, limit: usize) -> Self { + self.inner = self.inner.max_decoding_message_size(limit); + self + } + + /// Limits the maximum size of an encoded message. + /// + /// Default: `usize::MAX` + #[must_use] + pub fn max_encoding_message_size(mut self, limit: usize) -> Self { + self.inner = self.inner.max_encoding_message_size(limit); + self + } + #methods } } @@ -150,7 +166,7 @@ /// Attempt to create a new client by connecting to a given endpoint. pub async fn connect(dst: D) -> Result where - D: std::convert::TryInto, + D: TryInto, D::Error: Into, { let conn = tonic::transport::Endpoint::new(dst)?.connect().await?; @@ -179,36 +195,41 @@ disable_comments: &HashSet, ) -> TokenStream { let mut stream = TokenStream::new(); - let package = if emit_package { service.package() } else { "" }; for method in service.methods() { - let path = format!( - "/{}{}{}/{}", - package, - if package.is_empty() { "" } else { "." }, - service.identifier(), - method.identifier() - ); - - if !disable_comments.contains(&format!( - "{}{}{}.{}", - package, - if package.is_empty() { "" } else { "." }, - service.identifier(), - method.identifier() - )) { + if !disable_comments.contains(&format_method_name(service, method, emit_package)) { stream.extend(generate_doc_comments(method.comment())); } let method = match (method.client_streaming(), method.server_streaming()) { - (false, false) => generate_unary(method, proto_path, compile_well_known_types, path), - (false, true) => { - generate_server_streaming(method, proto_path, compile_well_known_types, path) - } - (true, false) => { - generate_client_streaming(method, proto_path, compile_well_known_types, path) - } - (true, true) => generate_streaming(method, proto_path, compile_well_known_types, path), + (false, false) => generate_unary( + service, + method, + emit_package, + proto_path, + compile_well_known_types, + ), + (false, true) => generate_server_streaming( + service, + method, + emit_package, + proto_path, + compile_well_known_types, + ), + (true, false) => generate_client_streaming( + service, + method, + emit_package, + proto_path, + compile_well_known_types, + ), + (true, true) => generate_streaming( + service, + method, + emit_package, + proto_path, + compile_well_known_types, + ), }; stream.extend(method); @@ -217,105 +238,126 @@ stream } -fn generate_unary( - method: &T, +fn generate_unary( + service: &T, + method: &T::Method, + emit_package: bool, proto_path: &str, compile_well_known_types: bool, - path: String, ) -> TokenStream { let codec_name = syn::parse_str::(method.codec_path()).unwrap(); let ident = format_ident!("{}", method.name()); let (request, response) = method.request_response_name(proto_path, compile_well_known_types); + let service_name = format_service_name(service, emit_package); + let path = format_method_path(service, method, emit_package); + let method_name = method.identifier(); quote! { pub async fn #ident( &mut self, request: impl tonic::IntoRequest<#request>, - ) -> Result, tonic::Status> { + ) -> std::result::Result, tonic::Status> { self.inner.ready().await.map_err(|e| { tonic::Status::new(tonic::Code::Unknown, format!("Service was not ready: {}", e.into())) })?; let codec = #codec_name::default(); let path = http::uri::PathAndQuery::from_static(#path); - self.inner.unary(request.into_request(), path, codec).await + let mut req = request.into_request(); + req.extensions_mut().insert(GrpcMethod::new(#service_name, #method_name)); + self.inner.unary(req, path, codec).await } } } -fn generate_server_streaming( - method: &T, +fn generate_server_streaming( + service: &T, + method: &T::Method, + emit_package: bool, proto_path: &str, compile_well_known_types: bool, - path: String, ) -> TokenStream { let codec_name = syn::parse_str::(method.codec_path()).unwrap(); let ident = format_ident!("{}", method.name()); - let (request, response) = method.request_response_name(proto_path, compile_well_known_types); + let service_name = format_service_name(service, emit_package); + let path = format_method_path(service, method, emit_package); + let method_name = method.identifier(); quote! { pub async fn #ident( &mut self, request: impl tonic::IntoRequest<#request>, - ) -> Result>, tonic::Status> { + ) -> std::result::Result>, tonic::Status> { self.inner.ready().await.map_err(|e| { tonic::Status::new(tonic::Code::Unknown, format!("Service was not ready: {}", e.into())) })?; let codec = #codec_name::default(); let path = http::uri::PathAndQuery::from_static(#path); - self.inner.server_streaming(request.into_request(), path, codec).await + let mut req = request.into_request(); + req.extensions_mut().insert(GrpcMethod::new(#service_name, #method_name)); + self.inner.server_streaming(req, path, codec).await } } } -fn generate_client_streaming( - method: &T, +fn generate_client_streaming( + service: &T, + method: &T::Method, + emit_package: bool, proto_path: &str, compile_well_known_types: bool, - path: String, ) -> TokenStream { let codec_name = syn::parse_str::(method.codec_path()).unwrap(); let ident = format_ident!("{}", method.name()); - let (request, response) = method.request_response_name(proto_path, compile_well_known_types); + let service_name = format_service_name(service, emit_package); + let path = format_method_path(service, method, emit_package); + let method_name = method.identifier(); quote! { pub async fn #ident( &mut self, request: impl tonic::IntoStreamingRequest - ) -> Result, tonic::Status> { + ) -> std::result::Result, tonic::Status> { self.inner.ready().await.map_err(|e| { tonic::Status::new(tonic::Code::Unknown, format!("Service was not ready: {}", e.into())) })?; let codec = #codec_name::default(); let path = http::uri::PathAndQuery::from_static(#path); - self.inner.client_streaming(request.into_streaming_request(), path, codec).await + let mut req = request.into_streaming_request(); + req.extensions_mut().insert(GrpcMethod::new(#service_name, #method_name)); + self.inner.client_streaming(req, path, codec).await } } } -fn generate_streaming( - method: &T, +fn generate_streaming( + service: &T, + method: &T::Method, + emit_package: bool, proto_path: &str, compile_well_known_types: bool, - path: String, ) -> TokenStream { let codec_name = syn::parse_str::(method.codec_path()).unwrap(); let ident = format_ident!("{}", method.name()); - let (request, response) = method.request_response_name(proto_path, compile_well_known_types); + let service_name = format_service_name(service, emit_package); + let path = format_method_path(service, method, emit_package); + let method_name = method.identifier(); quote! { pub async fn #ident( &mut self, request: impl tonic::IntoStreamingRequest - ) -> Result>, tonic::Status> { + ) -> std::result::Result>, tonic::Status> { self.inner.ready().await.map_err(|e| { tonic::Status::new(tonic::Code::Unknown, format!("Service was not ready: {}", e.into())) })?; let codec = #codec_name::default(); let path = http::uri::PathAndQuery::from_static(#path); - self.inner.streaming(request.into_streaming_request(), path, codec).await + let mut req = request.into_streaming_request(); + req.extensions_mut().insert(GrpcMethod::new(#service_name,#method_name)); + self.inner.streaming(req, path, codec).await } } } diff -Nru temporalio-1.3.0/vendor/tonic-build/src/lib.rs temporalio-1.3.0/vendor/tonic-build/src/lib.rs --- temporalio-1.3.0/vendor/tonic-build/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tonic-build/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -70,7 +70,7 @@ html_logo_url = "https://raw.githubusercontent.com/tokio-rs/website/master/public/img/icons/tonic.svg" )] #![deny(rustdoc::broken_intra_doc_links)] -#![doc(html_root_url = "https://docs.rs/tonic-build/0.8.4")] +#![doc(html_root_url = "https://docs.rs/tonic-build/0.9.2")] #![doc(issue_tracker_base_url = "https://github.com/hyperium/tonic/issues/")] #![doc(test(no_crate_inject, attr(deny(rust_2018_idioms))))] #![cfg_attr(docsrs, feature(doc_cfg))] @@ -197,6 +197,32 @@ } } +fn format_service_name(service: &T, emit_package: bool) -> String { + let package = if emit_package { service.package() } else { "" }; + format!( + "{}{}{}", + package, + if package.is_empty() { "" } else { "." }, + service.identifier(), + ) +} + +fn format_method_path(service: &T, method: &T::Method, emit_package: bool) -> String { + format!( + "/{}/{}", + format_service_name(service, emit_package), + method.identifier() + ) +} + +fn format_method_name(service: &T, method: &T::Method, emit_package: bool) -> String { + format!( + "{}.{}", + format_service_name(service, emit_package), + method.identifier() + ) +} + // Generates attributes given a list of (`pattern`, `attribute`) pairs. If `pattern` matches `name`, `attribute` will be included. fn generate_attributes<'a>( name: &str, @@ -218,7 +244,7 @@ fn generate_doc_comment>(comment: S) -> TokenStream { let comment = comment.as_ref(); - let comment = if !comment.starts_with(" ") { + let comment = if !comment.starts_with(' ') { format!(" {}", comment) } else { comment.to_string() diff -Nru temporalio-1.3.0/vendor/tonic-build/src/prost.rs temporalio-1.3.0/vendor/tonic-build/src/prost.rs --- temporalio-1.3.0/vendor/tonic-build/src/prost.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tonic-build/src/prost.rs 2023-10-30 19:40:00.000000000 +0000 @@ -20,10 +20,14 @@ build_server: true, build_transport: true, file_descriptor_set_path: None, + skip_protoc_run: false, out_dir: None, extern_path: Vec::new(), field_attributes: Vec::new(), + message_attributes: Vec::new(), + enum_attributes: Vec::new(), type_attributes: Vec::new(), + boxed: Vec::new(), server_attributes: Attributes::default(), client_attributes: Attributes::default(), proto_path: "super".to_string(), @@ -222,9 +226,13 @@ pub(crate) build_server: bool, pub(crate) build_transport: bool, pub(crate) file_descriptor_set_path: Option, + pub(crate) skip_protoc_run: bool, pub(crate) extern_path: Vec<(String, String)>, pub(crate) field_attributes: Vec<(String, String)>, pub(crate) type_attributes: Vec<(String, String)>, + pub(crate) message_attributes: Vec<(String, String)>, + pub(crate) enum_attributes: Vec<(String, String)>, + pub(crate) boxed: Vec, pub(crate) server_attributes: Attributes, pub(crate) client_attributes: Attributes, pub(crate) proto_path: String, @@ -267,6 +275,14 @@ self } + /// In combination with with file_descriptor_set_path, this can be used to provide a file + /// descriptor set as an input file, rather than having prost-build generate the file by + /// calling protoc. + pub fn skip_protoc_run(mut self) -> Self { + self.skip_protoc_run = true; + self + } + /// Set the output directory to generate code to. /// /// Defaults to the `OUT_DIR` environment variable. @@ -306,6 +322,36 @@ self } + /// Add additional attribute to matched messages. + /// + /// Passed directly to `prost_build::Config.message_attribute`. + pub fn message_attribute, A: AsRef>( + mut self, + path: P, + attribute: A, + ) -> Self { + self.message_attributes + .push((path.as_ref().to_string(), attribute.as_ref().to_string())); + self + } + + /// Add additional attribute to matched enums. + /// + /// Passed directly to `prost_build::Config.enum_attribute`. + pub fn enum_attribute, A: AsRef>(mut self, path: P, attribute: A) -> Self { + self.enum_attributes + .push((path.as_ref().to_string(), attribute.as_ref().to_string())); + self + } + + /// Add additional boxed fields. + /// + /// Passed directly to `prost_build::Config.boxed`. + pub fn boxed>(mut self, path: P) -> Self { + self.boxed.push(path.as_ref().to_string()); + self + } + /// Add additional attribute to matched server `mod`s. Matches on the package name. pub fn server_mod_attribute, A: AsRef>( mut self, @@ -438,6 +484,9 @@ if let Some(path) = self.file_descriptor_set_path.as_ref() { config.file_descriptor_set_path(path); } + if self.skip_protoc_run { + config.skip_protoc_run(); + } for (proto_path, rust_path) in self.extern_path.iter() { config.extern_path(proto_path, rust_path); } @@ -447,6 +496,15 @@ for (prost_path, attr) in self.type_attributes.iter() { config.type_attribute(prost_path, attr); } + for (prost_path, attr) in self.message_attributes.iter() { + config.message_attribute(prost_path, attr); + } + for (prost_path, attr) in self.enum_attributes.iter() { + config.enum_attribute(prost_path, attr); + } + for prost_path in self.boxed.iter() { + config.boxed(prost_path); + } if self.compile_well_known_types { config.compile_well_known_types(); } diff -Nru temporalio-1.3.0/vendor/tonic-build/src/server.rs temporalio-1.3.0/vendor/tonic-build/src/server.rs --- temporalio-1.3.0/vendor/tonic-build/src/server.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tonic-build/src/server.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,7 +1,10 @@ use std::collections::HashSet; use super::{Attributes, Method, Service}; -use crate::{generate_doc_comment, generate_doc_comments, naive_snake_case}; +use crate::{ + format_method_name, format_method_path, format_service_name, generate_doc_comment, + generate_doc_comments, naive_snake_case, +}; use proc_macro2::{Span, TokenStream}; use quote::quote; use syn::{Ident, Lit, LitStr}; @@ -36,7 +39,7 @@ attributes: &Attributes, disable_comments: &HashSet, ) -> TokenStream { - let methods = generate_methods(service, proto_path, compile_well_known_types); + let methods = generate_methods(service, emit_package, proto_path, compile_well_known_types); let server_service = quote::format_ident!("{}Server", service.name()); let server_trait = quote::format_ident!("{}", service.name()); @@ -51,22 +54,17 @@ ); let package = if emit_package { service.package() } else { "" }; // Transport based implementations - let path = format!( - "{}{}{}", - package, - if package.is_empty() { "" } else { "." }, - service.identifier() - ); + let service_name = format_service_name(service, emit_package); - let service_doc = if disable_comments.contains(&path) { + let service_doc = if disable_comments.contains(&service_name) { TokenStream::new() } else { generate_doc_comments(service.comment()) }; - let named = generate_named(&server_service, &server_trait, &path); + let named = generate_named(&server_service, &server_trait, &service_name); let mod_attributes = attributes.for_mod(package); - let struct_attributes = attributes.for_struct(&path); + let struct_attributes = attributes.for_struct(&service_name); let configure_compression_methods = quote! { /// Enable decompressing requests with the given encoding. @@ -84,6 +82,26 @@ } }; + let configure_max_message_size_methods = quote! { + /// Limits the maximum size of a decoded message. + /// + /// Default: `4MB` + #[must_use] + pub fn max_decoding_message_size(mut self, limit: usize) -> Self { + self.max_decoding_message_size = Some(limit); + self + } + + /// Limits the maximum size of an encoded message. + /// + /// Default: `usize::MAX` + #[must_use] + pub fn max_encoding_message_size(mut self, limit: usize) -> Self { + self.max_encoding_message_size = Some(limit); + self + } + }; + quote! { /// Generated server implementations. #(#mod_attributes)* @@ -106,6 +124,8 @@ inner: _Inner, accept_compression_encodings: EnabledCompressionEncodings, send_compression_encodings: EnabledCompressionEncodings, + max_decoding_message_size: Option, + max_encoding_message_size: Option, } struct _Inner(Arc); @@ -121,6 +141,8 @@ inner, accept_compression_encodings: Default::default(), send_compression_encodings: Default::default(), + max_decoding_message_size: None, + max_encoding_message_size: None, } } @@ -132,6 +154,8 @@ } #configure_compression_methods + + #configure_max_message_size_methods } impl tonic::codegen::Service> for #server_service @@ -144,7 +168,7 @@ type Error = std::convert::Infallible; type Future = BoxFuture; - fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll> { + fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll> { Poll::Ready(Ok(())) } @@ -173,13 +197,15 @@ inner, accept_compression_encodings: self.accept_compression_encodings, send_compression_encodings: self.send_compression_encodings, + max_decoding_message_size: self.max_decoding_message_size, + max_encoding_message_size: self.max_encoding_message_size, } } } impl Clone for _Inner { fn clone(&self) -> Self { - Self(self.0.clone()) + Self(Arc::clone(&self.0)) } } @@ -209,7 +235,7 @@ compile_well_known_types, disable_comments, ); - let trait_doc = generate_doc_comment(&format!( + let trait_doc = generate_doc_comment(format!( " Generated trait containing gRPC methods that should be implemented for use with {}Server.", service.name() )); @@ -232,70 +258,64 @@ ) -> TokenStream { let mut stream = TokenStream::new(); - let package = if emit_package { service.package() } else { "" }; for method in service.methods() { let name = quote::format_ident!("{}", method.name()); let (req_message, res_message) = method.request_response_name(proto_path, compile_well_known_types); - let method_doc = if disable_comments.contains(&format!( - "{}{}{}.{}", - package, - if package.is_empty() { "" } else { "." }, - service.identifier(), - method.identifier() - )) { - TokenStream::new() - } else { - generate_doc_comments(method.comment()) - }; + let method_doc = + if disable_comments.contains(&format_method_name(service, method, emit_package)) { + TokenStream::new() + } else { + generate_doc_comments(method.comment()) + }; let method = match (method.client_streaming(), method.server_streaming()) { (false, false) => { quote! { #method_doc async fn #name(&self, request: tonic::Request<#req_message>) - -> Result, tonic::Status>; + -> std::result::Result, tonic::Status>; } } (true, false) => { quote! { #method_doc async fn #name(&self, request: tonic::Request>) - -> Result, tonic::Status>; + -> std::result::Result, tonic::Status>; } } (false, true) => { let stream = quote::format_ident!("{}Stream", method.identifier()); - let stream_doc = generate_doc_comment(&format!( + let stream_doc = generate_doc_comment(format!( " Server streaming response type for the {} method.", method.identifier() )); quote! { #stream_doc - type #stream: futures_core::Stream> + Send + 'static; + type #stream: futures_core::Stream> + Send + 'static; #method_doc async fn #name(&self, request: tonic::Request<#req_message>) - -> Result, tonic::Status>; + -> std::result::Result, tonic::Status>; } } (true, true) => { let stream = quote::format_ident!("{}Stream", method.identifier()); - let stream_doc = generate_doc_comment(&format!( + let stream_doc = generate_doc_comment(format!( " Server streaming response type for the {} method.", method.identifier() )); quote! { #stream_doc - type #stream: futures_core::Stream> + Send + 'static; + type #stream: futures_core::Stream> + Send + 'static; #method_doc async fn #name(&self, request: tonic::Request>) - -> Result, tonic::Status>; + -> std::result::Result, tonic::Status>; } } }; @@ -322,23 +342,14 @@ fn generate_methods( service: &T, + emit_package: bool, proto_path: &str, compile_well_known_types: bool, ) -> TokenStream { let mut stream = TokenStream::new(); for method in service.methods() { - let path = format!( - "/{}{}{}/{}", - service.package(), - if service.package().is_empty() { - "" - } else { - "." - }, - service.identifier(), - method.identifier() - ); + let path = format_method_path(service, method, emit_package); let method_path = Lit::Str(LitStr::new(&path, Span::call_site())); let ident = quote::format_ident!("{}", method.name()); let server_trait = quote::format_ident!("{}", service.name()); @@ -409,7 +420,7 @@ type Future = BoxFuture, tonic::Status>; fn call(&mut self, request: tonic::Request<#request>) -> Self::Future { - let inner = self.0.clone(); + let inner = Arc::clone(&self.0); let fut = async move { (*inner).#method_ident(request).await }; @@ -419,6 +430,8 @@ let accept_compression_encodings = self.accept_compression_encodings; let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; let inner = self.inner.clone(); let fut = async move { let inner = inner.0; @@ -426,7 +439,8 @@ let codec = #codec_name::default(); let mut grpc = tonic::server::Grpc::new(codec) - .apply_compression_config(accept_compression_encodings, send_compression_encodings); + .apply_compression_config(accept_compression_encodings, send_compression_encodings) + .apply_max_message_size_config(max_decoding_message_size, max_encoding_message_size); let res = grpc.unary(method, req).await; Ok(res) @@ -461,7 +475,7 @@ type Future = BoxFuture, tonic::Status>; fn call(&mut self, request: tonic::Request<#request>) -> Self::Future { - let inner = self.0.clone(); + let inner = Arc::clone(&self.0); let fut = async move { (*inner).#method_ident(request).await }; @@ -471,6 +485,8 @@ let accept_compression_encodings = self.accept_compression_encodings; let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; let inner = self.inner.clone(); let fut = async move { let inner = inner.0; @@ -478,7 +494,8 @@ let codec = #codec_name::default(); let mut grpc = tonic::server::Grpc::new(codec) - .apply_compression_config(accept_compression_encodings, send_compression_encodings); + .apply_compression_config(accept_compression_encodings, send_compression_encodings) + .apply_max_message_size_config(max_decoding_message_size, max_encoding_message_size); let res = grpc.server_streaming(method, req).await; Ok(res) @@ -510,7 +527,7 @@ type Future = BoxFuture, tonic::Status>; fn call(&mut self, request: tonic::Request>) -> Self::Future { - let inner = self.0.clone(); + let inner = Arc::clone(&self.0); let fut = async move { (*inner).#method_ident(request).await @@ -521,6 +538,8 @@ let accept_compression_encodings = self.accept_compression_encodings; let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; let inner = self.inner.clone(); let fut = async move { let inner = inner.0; @@ -528,7 +547,8 @@ let codec = #codec_name::default(); let mut grpc = tonic::server::Grpc::new(codec) - .apply_compression_config(accept_compression_encodings, send_compression_encodings); + .apply_compression_config(accept_compression_encodings, send_compression_encodings) + .apply_max_message_size_config(max_decoding_message_size, max_encoding_message_size); let res = grpc.client_streaming(method, req).await; Ok(res) @@ -564,7 +584,7 @@ type Future = BoxFuture, tonic::Status>; fn call(&mut self, request: tonic::Request>) -> Self::Future { - let inner = self.0.clone(); + let inner = Arc::clone(&self.0); let fut = async move { (*inner).#method_ident(request).await }; @@ -574,6 +594,8 @@ let accept_compression_encodings = self.accept_compression_encodings; let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; let inner = self.inner.clone(); let fut = async move { let inner = inner.0; @@ -581,7 +603,8 @@ let codec = #codec_name::default(); let mut grpc = tonic::server::Grpc::new(codec) - .apply_compression_config(accept_compression_encodings, send_compression_encodings); + .apply_compression_config(accept_compression_encodings, send_compression_encodings) + .apply_max_message_size_config(max_decoding_message_size, max_encoding_message_size); let res = grpc.streaming(method, req).await; Ok(res) diff -Nru temporalio-1.3.0/vendor/tracing/.cargo-checksum.json temporalio-1.3.0/vendor/tracing/.cargo-checksum.json --- temporalio-1.3.0/vendor/tracing/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tracing/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"CHANGELOG.md":"8f2a5e3f70b90ef91e724b0089f511f6ce95cc6afaf1da30d3d486e30935c520","Cargo.toml":"e8262bfd368f8b9c2f902db368a71da88f446584167392a2611b8eb08e411175","LICENSE":"898b1ae9821e98daf8964c8d6c7f61641f5f5aa78ad500020771c0939ee0dea1","README.md":"baed1881843d68618241ccc57e2120993f6eb67c0e1987115b6855f7d328def3","benches/baseline.rs":"43a3e31b6c33dba2e6328052301b707b212487b83f0dcffc843061a9c48a2319","benches/dispatch_get_clone.rs":"866239abeb74a82440741c948a4e7e0a44e92e8cc87319ec57e3b057c9e8f5dd","benches/dispatch_get_ref.rs":"dd2803259a6784c256304e676bbce05de233e4c8451ac85863787213343e9be7","benches/empty_span.rs":"9f51cf376414ea751b2f50c357f2435a545d606118286f5b8b89f185e28aad8c","benches/enter_span.rs":"4410ec73d277e7b54e9f306c00ff3b79a150d1832966b7fc29984c8e3ad8d57c","benches/event.rs":"98de3c82ed18abe0a3cbe6eda9a4f9deec2b69bca42c3aac11dea4b608b85a67","benches/shared.rs":"2623311af7d153685064e664a5903d03e7dc3179754c324f3a76f29f060515e6","benches/span_fields.rs":"9166cd43ef2783e5419dd61ea57a02e48e8cc38aa1b357e9b79fa581929b60d8","benches/span_no_fields.rs":"79cc4befacf27d7ce728246087c4f06a6066f913e831d9043caeb7941f0193f6","benches/span_repeated.rs":"e4b3c99a7a9fc15d9042b8db399a56cf647b4eebd26f29d95325bb057b68330b","src/dispatcher.rs":"a8732392ffe56b1178f8fd3d6e6e02d40b51475c38bb4600abd9cd170df1bf6c","src/field.rs":"fe6c2eb36f92880254a707a465f873ca84510d93f06614b9b36ba20b48bf209d","src/instrument.rs":"034b1c7e46ab2fae331ea215a3d1b1a2211ef6b18d7e7113523e3ef5bf3ca9bb","src/level_filters.rs":"92aca5797a59b2f3c34adfb896260400c2602456eec0fe9c7d49204df37ff699","src/lib.rs":"54a1168ed65d746ce1cc6668a78931131af2afc7e0530391dcffcaa58a9f7971","src/macros.rs":"6ffcbea4b4b402b46e9e074f0808fb755b59ce2bb1c97aa4acdfdb31bb26bf4c","src/span.rs":"4efa37a8fc7604fcc3547eac488122c13bcb28e136f46381082480e0036217a0","src/stdlib.rs":"248514a9bae6106e436358aee44c92abf8e7f79022895c4a25136ddef211d198","src/subscriber.rs":"8933d8766439f929c0a98a0863d20aff37b221314b3825edd9058be511149968","tests/enabled.rs":"a80fd3c70be439b0d1d2509b46a2b9ca31748aab4341f67d0fa721f32c6a65a1","tests/event.rs":"d3c6d688fc1938516770a9fb486252bbe8e95f24b37097a2291e7119b6e78373","tests/filter_caching_is_lexically_scoped.rs":"5487a37db5fbdf3d57020ab1f01185d928c45d967d99d723ffc434540459d8dc","tests/filters_are_not_reevaluated_for_the_same_span.rs":"251abbc000dddd298448958a1f0e5be71da527ac6c1a368d57837c83a5467329","tests/filters_are_reevaluated_for_different_call_sites.rs":"e0fdd8e930c043674702831b4d96f331e63aba824576bbac50b3f53bb0241cc7","tests/filters_dont_leak.rs":"6c41d3209cf2a37a1656a8314399777022ceec556e44f5417f1f5a4cd24eb43a","tests/future_send.rs":"3e9c9193219d12e342c18bbedb2f6ec940334202feb3cffba91601d6001b8575","tests/instrument.rs":"e46cf30db3ff0174e4e0885720b97531c56cbe7d05bb4580e38790f272856b56","tests/macro_imports.rs":"d5de857162185d4a2384f3cb644bfcf76c7f5c1a3b5f72bfa0d2620ac6e3873c","tests/macros.rs":"acb6987a37be2035cde28c8a6b3cecbdbffffafebe6c007712cd145afbd1beb8","tests/macros_incompatible_concat.rs":"5f3bcbb65e4ae39db1cfc2def62fc913c20bab0fb769c8f731504e2615585ee5","tests/max_level_hint.rs":"39576a958df3ea215c49154ff72c3dd14c8b3be3fcdb849e7dd847c8c9fd09e2","tests/multiple_max_level_hints.rs":"28ead97a8424358a0632547dae987ddbddc5bb69cdcd996d20feb49a7f3ddc69","tests/no_subscriber.rs":"ca42d0d4a20eb3b4e0a342b5e0090c7ada8b5a157f3cddb7b5d051238cdc1202","tests/register_callsite_deadlock.rs":"c0b3142543e7a10065c7583a8ee0b6bc978ea4f3979599651101c5a28966e7c8","tests/scoped_clobbers_default.rs":"5fd48ff207df64b0e2ee443de75da0d8bd3b0817c6d9b003b0b00157ec244d7b","tests/span.rs":"2a5a8c666c8a2b51a1a1222e6046a1067690f039d15ef8b56d0e83bffa76f78d","tests/subscriber.rs":"ed3c02e8a75c6e4fc187a024fde6319e6d1ea95c993eda3fd9d559fd41fe7cce"},"package":"c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef"} \ No newline at end of file +{"files":{"CHANGELOG.md":"dc8a552611986799a0eebb56fd119ea8ae32c9b8da4be9914fe127627ad4f38a","Cargo.toml":"f8d12a05bc7ed5cfef787db206c05cc5ebcd2c165e6e629b613d1a3ff4f138de","LICENSE":"898b1ae9821e98daf8964c8d6c7f61641f5f5aa78ad500020771c0939ee0dea1","README.md":"6ff17749109fbe0855220188015846f40d3997bc2631c3163496c183c0bd50ce","benches/baseline.rs":"43a3e31b6c33dba2e6328052301b707b212487b83f0dcffc843061a9c48a2319","benches/dispatch_get_clone.rs":"866239abeb74a82440741c948a4e7e0a44e92e8cc87319ec57e3b057c9e8f5dd","benches/dispatch_get_ref.rs":"dd2803259a6784c256304e676bbce05de233e4c8451ac85863787213343e9be7","benches/empty_span.rs":"9f51cf376414ea751b2f50c357f2435a545d606118286f5b8b89f185e28aad8c","benches/enter_span.rs":"4410ec73d277e7b54e9f306c00ff3b79a150d1832966b7fc29984c8e3ad8d57c","benches/event.rs":"98de3c82ed18abe0a3cbe6eda9a4f9deec2b69bca42c3aac11dea4b608b85a67","benches/shared.rs":"2623311af7d153685064e664a5903d03e7dc3179754c324f3a76f29f060515e6","benches/span_fields.rs":"9166cd43ef2783e5419dd61ea57a02e48e8cc38aa1b357e9b79fa581929b60d8","benches/span_no_fields.rs":"79cc4befacf27d7ce728246087c4f06a6066f913e831d9043caeb7941f0193f6","benches/span_repeated.rs":"e4b3c99a7a9fc15d9042b8db399a56cf647b4eebd26f29d95325bb057b68330b","src/dispatcher.rs":"a8732392ffe56b1178f8fd3d6e6e02d40b51475c38bb4600abd9cd170df1bf6c","src/field.rs":"55c7a2798b9ad0269e7c738c3f15a5d0281bf34ac3a6196a3f0b15801e5278bd","src/instrument.rs":"1fe4de5c13b5ba048e9872d78d1fa4e85655f9f2ed10f79b72b5da881c9b8b45","src/level_filters.rs":"baae8e797897bae9cdd9ec64b8e9a3d71156e9c03261be17b5b18acba034e154","src/lib.rs":"325d0d9487ecd646a7e5e22617f5f291c4112e0e7e359e0033de1677217c5b22","src/macros.rs":"1b38906bcb32cad50b60d350c88f6f4f1fa4d46d99bf50318c44d75219760c42","src/span.rs":"372695b3eda8354a892316826d2598f821fcb835fb18e1e0271767bce730b7ad","src/stdlib.rs":"248514a9bae6106e436358aee44c92abf8e7f79022895c4a25136ddef211d198","src/subscriber.rs":"8933d8766439f929c0a98a0863d20aff37b221314b3825edd9058be511149968","tests/enabled.rs":"1333339aace87ea9d701f2f76a1985820cc513a75013a7ed89669f7a2c635479","tests/event.rs":"7678d1cc8a29ae8b716fbddb7cc4836422732ba3dce109ff511c8bb6100da606","tests/filter_caching_is_lexically_scoped.rs":"5487a37db5fbdf3d57020ab1f01185d928c45d967d99d723ffc434540459d8dc","tests/filters_are_not_reevaluated_for_the_same_span.rs":"251abbc000dddd298448958a1f0e5be71da527ac6c1a368d57837c83a5467329","tests/filters_are_reevaluated_for_different_call_sites.rs":"e0fdd8e930c043674702831b4d96f331e63aba824576bbac50b3f53bb0241cc7","tests/filters_dont_leak.rs":"d594266818a3461886da33bfcc76937d89a433ed6980226fc428706b216c093c","tests/future_send.rs":"3e9c9193219d12e342c18bbedb2f6ec940334202feb3cffba91601d6001b8575","tests/macro_imports.rs":"d5de857162185d4a2384f3cb644bfcf76c7f5c1a3b5f72bfa0d2620ac6e3873c","tests/macros.rs":"fa83397181d73d2cae09c16d9647a63d1e3bad0f2dbc5b3280f69f3d0180c488","tests/macros_incompatible_concat.rs":"5f3bcbb65e4ae39db1cfc2def62fc913c20bab0fb769c8f731504e2615585ee5","tests/macros_redefined_core.rs":"a6eac60522f71fe6c9a040b8b869d596f7eb9e907f5b49f4be4413a40c387676","tests/max_level_hint.rs":"9b366591d947ca0202fa0bdf797e1bb14534d3c896cf8b9674660cd2807c32ef","tests/multiple_max_level_hints.rs":"4d9ef0de9cccc787da8f5e3f6c233ac9db42a2a99cfe5e39997e1f4aa9df0c00","tests/no_subscriber.rs":"2f8f2ada5089d8e2e503394dfe8206598a11895907c53bf940b892f1e6afdd2f","tests/register_callsite_deadlock.rs":"c0b3142543e7a10065c7583a8ee0b6bc978ea4f3979599651101c5a28966e7c8","tests/scoped_clobbers_default.rs":"806480a74c15e4d68bb7576050662b1e53ee765fd583d003f8b349f17ea63a4b","tests/span.rs":"f84ead5b1dad9b91e5cec9d8378ab932a942936374ba928fb381e67fab52cda0","tests/subscriber.rs":"1617c098f4fa6abed174fe062111444c7b67fa0f377d2b342176998e572480e3"},"package":"8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/tracing/Cargo.toml temporalio-1.3.0/vendor/tracing/Cargo.toml --- temporalio-1.3.0/vendor/tracing/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tracing/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -11,9 +11,9 @@ [package] edition = "2018" -rust-version = "1.56.0" +rust-version = "1.49.0" name = "tracing" -version = "0.1.40" +version = "0.1.37" authors = [ "Eliza Weisman ", "Tokio Contributors ", @@ -40,16 +40,16 @@ [package.metadata.docs.rs] all-features = true -rustc-args = [ - "--cfg", - "tracing_unstable", -] rustdoc-args = [ "--cfg", "docsrs", "--cfg", "tracing_unstable", ] +rustc-args = [ + "--cfg", + "tracing_unstable", +] [[bench]] name = "baseline" @@ -87,6 +87,9 @@ name = "span_repeated" harness = false +[dependencies.cfg-if] +version = "1.0.0" + [dependencies.log] version = "0.4.17" optional = true @@ -95,20 +98,16 @@ version = "0.2.9" [dependencies.tracing-attributes] -version = "0.1.27" +version = "0.1.23" optional = true [dependencies.tracing-core] -version = "0.1.32" +version = "0.1.30" default-features = false [dev-dependencies.criterion] version = "0.3.6" -default_features = false - -[dev-dependencies.futures] -version = "0.3.21" -default_features = false +default-features = false [dev-dependencies.log] version = "0.4.17" diff -Nru temporalio-1.3.0/vendor/tracing/CHANGELOG.md temporalio-1.3.0/vendor/tracing/CHANGELOG.md --- temporalio-1.3.0/vendor/tracing/CHANGELOG.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tracing/CHANGELOG.md 2023-10-30 19:40:00.000000000 +0000 @@ -1,138 +1,3 @@ -# 0.1.40 - -This release fixes a potential stack use-after-free in the -`Instrument::into_inner` method. Only uses of this method are affected by this -bug. - -### Fixed - -- Use `mem::ManuallyDrop` instead of `mem::forget` in `Instrument::into_inner` - ([#2765]) - -[#2765]: https://github.com/tokio-rs/tracing/pull/2765 - -Thanks to @cramertj and @manishearth for finding and fixing this issue! - -# 0.1.39 (October 12, 2023) - -This release adds several additional features to the `tracing` macros. In -addition, it updates the `tracing-core` dependency to [v0.1.32][core-0.1.32] and -the `tracing-attributes` dependency to [v0.1.27][attrs-0.1.27]. - -### Added - -- Allow constant field names in macros ([#2617]) -- Allow setting event names in macros ([#2699]) -- **core**: Allow `ValueSet`s of any length ([#2508]) - -### Changed - -- `tracing-attributes`: updated to [0.1.27][attrs-0.1.27] -- `tracing-core`: updated to [0.1.32][core-0.1.32] -- **attributes**: Bump minimum version of proc-macro2 to 1.0.60 ([#2732]) -- **attributes**: Generate less dead code for async block return type hint ([#2709]) - -### Fixed - -- Use fully qualified names in macros for items exported from std prelude - ([#2621], [#2757]) -- **attributes**: Allow [`clippy::let_with_type_underscore`] in macro-generated - code ([#2609]) -- **attributes**: Allow `unknown_lints` in macro-generated code ([#2626]) -- **attributes**: Fix a compilation error in `#[instrument]` when the `"log"` - feature is enabled ([#2599]) - -### Documented - -- Add `axum-insights` to relevant crates. ([#2713]) -- Fix link to RAI pattern crate documentation ([#2612]) -- Fix docs typos and warnings ([#2581]) -- Add `clippy-tracing` to related crates ([#2628]) -- Add `tracing-cloudwatch` to related crates ([#2667]) -- Fix deadlink to `tracing-etw` repo ([#2602]) - -[#2617]: https://github.com/tokio-rs/tracing/pull/2617 -[#2699]: https://github.com/tokio-rs/tracing/pull/2699 -[#2508]: https://github.com/tokio-rs/tracing/pull/2508 -[#2621]: https://github.com/tokio-rs/tracing/pull/2621 -[#2713]: https://github.com/tokio-rs/tracing/pull/2713 -[#2581]: https://github.com/tokio-rs/tracing/pull/2581 -[#2628]: https://github.com/tokio-rs/tracing/pull/2628 -[#2667]: https://github.com/tokio-rs/tracing/pull/2667 -[#2602]: https://github.com/tokio-rs/tracing/pull/2602 -[#2626]: https://github.com/tokio-rs/tracing/pull/2626 -[#2757]: https://github.com/tokio-rs/tracing/pull/2757 -[#2732]: https://github.com/tokio-rs/tracing/pull/2732 -[#2709]: https://github.com/tokio-rs/tracing/pull/2709 -[#2599]: https://github.com/tokio-rs/tracing/pull/2599 -[`let_with_type_underscore`]: http://rust-lang.github.io/rust-clippy/rust-1.70.0/index.html#let_with_type_underscore -[attrs-0.1.27]: - https://github.com/tokio-rs/tracing/releases/tag/tracing-attributes-0.1.27 -[core-0.1.32]: - https://github.com/tokio-rs/tracing/releases/tag/tracing-core-0.1.32 - -# 0.1.38 (April 25th, 2023) - -This `tracing` release changes the `Drop` implementation for `Instrumented` -`Future`s so that the attached `Span` is entered when dropping the `Future`. This -means that events emitted by the `Future`'s `Drop` implementation will now be -recorded within its `Span`. It also adds `#[inline]` hints to methods called in -the `event!` macro's expansion, for an improvement in both binary size and -performance. - -Additionally, this release updates the `tracing-attributes` dependency to -[v0.1.24][attrs-0.1.24], which updates the [`syn`] dependency to v2.x.x. -`tracing-attributes` v0.1.24 also includes improvements to the `#[instrument]` -macro; see [the `tracing-attributes` 0.1.24 release notes][attrs-0.1.24] for -details. - -### Added - -- `Instrumented` futures will now enter the attached `Span` in their `Drop` - implementation, allowing events emitted when dropping the future to occur - within the span ([#2562]) -- `#[inline]` attributes for methods called by the `event!` macros, making - generated code smaller ([#2555]) -- **attributes**: `level` argument to `#[instrument(err)]` and - `#[instrument(ret)]` to override the level of - the generated return value event ([#2335]) -- **attributes**: Improved compiler error message when `#[instrument]` is added to a `const fn` - ([#2418]) - -### Changed - -- `tracing-attributes`: updated to [0.1.24][attrs-0.1.24] -- Removed unneeded `cfg-if` dependency ([#2553]) -- **attributes**: Updated [`syn`] dependency to 2.0 ([#2516]) - -### Fixed - -- **attributes**: Fix `clippy::unreachable` warnings in `#[instrument]`-generated code ([#2356]) -- **attributes**: Removed unused "visit" feature flag from `syn` dependency ([#2530]) - -### Documented - -- **attributes**: Documented default level for `#[instrument(err)]` ([#2433]) -- **attributes**: Improved documentation for levels in `#[instrument]` ([#2350]) - -Thanks to @nitnelave, @jsgf, @Abhicodes-crypto, @LukeMathWalker, @andrewpollack, -@quad, @klensy, @davidpdrsn, @dbidwell94, @ldm0, @NobodyXu, @ilsv, and @daxpedda -for contributing to this release! - -[`syn`]: https://crates.io/crates/syn -[attrs-0.1.24]: - https://github.com/tokio-rs/tracing/releases/tag/tracing-attributes-0.1.24 -[#2565]: https://github.com/tokio-rs/tracing/pull/2565 -[#2555]: https://github.com/tokio-rs/tracing/pull/2555 -[#2553]: https://github.com/tokio-rs/tracing/pull/2553 -[#2335]: https://github.com/tokio-rs/tracing/pull/2335 -[#2418]: https://github.com/tokio-rs/tracing/pull/2418 -[#2516]: https://github.com/tokio-rs/tracing/pull/2516 -[#2356]: https://github.com/tokio-rs/tracing/pull/2356 -[#2530]: https://github.com/tokio-rs/tracing/pull/2530 -[#2433]: https://github.com/tokio-rs/tracing/pull/2433 -[#2350]: https://github.com/tokio-rs/tracing/pull/2350 - # 0.1.37 (October 6, 2022) This release of `tracing` incorporates changes from `tracing-core` diff -Nru temporalio-1.3.0/vendor/tracing/README.md temporalio-1.3.0/vendor/tracing/README.md --- temporalio-1.3.0/vendor/tracing/README.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tracing/README.md 2023-10-30 19:40:00.000000000 +0000 @@ -47,7 +47,7 @@ The `tracing` crate provides the APIs necessary for instrumenting libraries and applications to emit trace data. -*Compiler support: [requires `rustc` 1.56+][msrv]* +*Compiler support: [requires `rustc` 1.49+][msrv]* [msrv]: #supported-rust-versions @@ -98,7 +98,7 @@ ```toml [dependencies] tracing = "0.1" -tracing-subscriber = "0.3.0" +tracing-subscriber = "0.2.0" ``` This subscriber will be used as the default in all threads for the remainder of the duration @@ -250,7 +250,7 @@ is as long as the future's. The second, and preferred, option is through the -[`#[instrument]`](https://docs.rs/tracing/0.1.38/tracing/attr.instrument.html) +[`#[instrument]`](https://docs.rs/tracing/0.1.37/tracing/attr.instrument.html) attribute: ```rust @@ -297,7 +297,7 @@ // Dropping the span will close it, indicating that it has ended. ``` -The [`#[instrument]`](https://docs.rs/tracing/0.1.38/tracing/attr.instrument.html) attribute macro +The [`#[instrument]`](https://docs.rs/tracing/0.1.37/tracing/attr.instrument.html) attribute macro can reduce some of this boilerplate: ```rust @@ -379,7 +379,6 @@ - [`tracing-distributed`] Provides a generic implementation of a layer that reports traces spanning multiple machines to some backend. - [`tracing-actix`] provides `tracing` integration for the `actix` actor framework. -- [`axum-insights`] provides `tracing` integration and Application insights export for the `axum` web framework. - [`tracing-gelf`] implements a subscriber for exporting traces in Greylog GELF format. - [`tracing-coz`] provides integration with the [coz] causal profiler @@ -408,7 +407,6 @@ [`tracing-distributed`]: https://crates.io/crates/tracing-distributed [honeycomb.io]: https://www.honeycomb.io/ [`tracing-actix`]: https://crates.io/crates/tracing-actix -[`axum-insights`]: https://crates.io/crates/axum-insights [`tracing-gelf`]: https://crates.io/crates/tracing-gelf [`tracing-coz`]: https://crates.io/crates/tracing-coz [coz]: https://github.com/plasma-umass/coz @@ -445,14 +443,14 @@ ## Supported Rust Versions Tracing is built against the latest stable release. The minimum supported -version is 1.56. The current Tracing version is not guaranteed to build on Rust +version is 1.49. The current Tracing version is not guaranteed to build on Rust versions earlier than the minimum supported version. Tracing follows the same compiler support policies as the rest of the Tokio project. The current stable Rust compiler and the three most recent minor versions before it will always be supported. For example, if the current stable -compiler version is 1.69, the minimum supported version will not be increased -past 1.66, three minor versions prior. Increasing the minimum supported compiler +compiler version is 1.45, the minimum supported version will not be increased +past 1.42, three minor versions prior. Increasing the minimum supported compiler version is not considered a semver breaking change as long as doing so complies with this policy. diff -Nru temporalio-1.3.0/vendor/tracing/src/field.rs temporalio-1.3.0/vendor/tracing/src/field.rs --- temporalio-1.3.0/vendor/tracing/src/field.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tracing/src/field.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,13 +1,13 @@ //! `Span` and `Event` key-value data. //! -//! Spans and events may be annotated with key-value data, referred to as _fields_. -//! These fields consist of a mapping from a key (corresponding to +//! Spans and events may be annotated with key-value data, referred to as known +//! as _fields_. These fields consist of a mapping from a key (corresponding to //! a `&str` but represented internally as an array index) to a [`Value`]. //! //! # `Value`s and `Subscriber`s //! //! `Subscriber`s consume `Value`s as fields attached to [span]s or [`Event`]s. -//! The set of field keys on a given span or event is defined on its [`Metadata`]. +//! The set of field keys on a given span or is defined on its [`Metadata`]. //! When a span is created, it provides [`Attributes`] to the `Subscriber`'s //! [`new_span`] method, containing any fields whose values were provided when //! the span was created; and may call the `Subscriber`'s [`record`] method diff -Nru temporalio-1.3.0/vendor/tracing/src/instrument.rs temporalio-1.3.0/vendor/tracing/src/instrument.rs --- temporalio-1.3.0/vendor/tracing/src/instrument.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tracing/src/instrument.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,14 +1,10 @@ +use crate::stdlib::pin::Pin; +use crate::stdlib::task::{Context, Poll}; +use crate::stdlib::{future::Future, marker::Sized}; use crate::{ dispatcher::{self, Dispatch}, span::Span, }; -use core::{ - future::Future, - marker::Sized, - mem::ManuallyDrop, - pin::Pin, - task::{Context, Poll}, -}; use pin_project_lite::pin_project; /// Attaches spans to a [`std::future::Future`]. @@ -22,7 +18,7 @@ /// `Instrumented` wrapper. /// /// The attached [`Span`] will be [entered] every time the instrumented - /// [`Future`] is polled or [`Drop`]ped. + /// [`Future`] is polled. /// /// # Examples /// @@ -84,17 +80,14 @@ /// [disabled]: super::Span::is_disabled() /// [`Future`]: std::future::Future fn instrument(self, span: Span) -> Instrumented { - Instrumented { - inner: ManuallyDrop::new(self), - span, - } + Instrumented { inner: self, span } } /// Instruments this type with the [current] [`Span`], returning an /// `Instrumented` wrapper. /// /// The attached [`Span`] will be [entered] every time the instrumented - /// [`Future`] is polled or [`Drop`]ped. + /// [`Future`] is polled. /// /// This can be used to propagate the current span when spawning a new future. /// @@ -259,55 +252,13 @@ /// /// [`Future`]: std::future::Future /// [`Span`]: crate::Span - #[project = InstrumentedProj] - #[project_ref = InstrumentedProjRef] #[derive(Debug, Clone)] #[must_use = "futures do nothing unless you `.await` or poll them"] pub struct Instrumented { - // `ManuallyDrop` is used here to to enter instrument `Drop` by entering - // `Span` and executing `ManuallyDrop::drop`. #[pin] - inner: ManuallyDrop, + inner: T, span: Span, } - - impl PinnedDrop for Instrumented { - fn drop(this: Pin<&mut Self>) { - let this = this.project(); - let _enter = this.span.enter(); - // SAFETY: 1. `Pin::get_unchecked_mut()` is safe, because this isn't - // different from wrapping `T` in `Option` and calling - // `Pin::set(&mut this.inner, None)`, except avoiding - // additional memory overhead. - // 2. `ManuallyDrop::drop()` is safe, because - // `PinnedDrop::drop()` is guaranteed to be called only - // once. - unsafe { ManuallyDrop::drop(this.inner.get_unchecked_mut()) } - } - } -} - -impl<'a, T> InstrumentedProj<'a, T> { - /// Get a mutable reference to the [`Span`] a pinned mutable reference to - /// the wrapped type. - fn span_and_inner_pin_mut(self) -> (&'a mut Span, Pin<&'a mut T>) { - // SAFETY: As long as `ManuallyDrop` does not move, `T` won't move - // and `inner` is valid, because `ManuallyDrop::drop` is called - // only inside `Drop` of the `Instrumented`. - let inner = unsafe { self.inner.map_unchecked_mut(|v| &mut **v) }; - (self.span, inner) - } -} - -impl<'a, T> InstrumentedProjRef<'a, T> { - /// Get a reference to the [`Span`] a pinned reference to the wrapped type. - fn span_and_inner_pin_ref(self) -> (&'a Span, Pin<&'a T>) { - // SAFETY: As long as `ManuallyDrop` does not move, `T` won't move - // and `inner` is valid, because `ManuallyDrop::drop` is called - // only inside `Drop` of the `Instrumented`. - let inner = unsafe { self.inner.map_unchecked(|v| &**v) }; - (self.span, inner) - } } // === impl Instrumented === @@ -316,9 +267,9 @@ type Output = T::Output; fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { - let (span, inner) = self.project().span_and_inner_pin_mut(); - let _enter = span.enter(); - inner.poll(cx) + let this = self.project(); + let _enter = this.span.enter(); + this.inner.poll(cx) } } @@ -347,29 +298,19 @@ /// Get a pinned reference to the wrapped type. pub fn inner_pin_ref(self: Pin<&Self>) -> Pin<&T> { - self.project_ref().span_and_inner_pin_ref().1 + self.project_ref().inner } /// Get a pinned mutable reference to the wrapped type. pub fn inner_pin_mut(self: Pin<&mut Self>) -> Pin<&mut T> { - self.project().span_and_inner_pin_mut().1 + self.project().inner } /// Consumes the `Instrumented`, returning the wrapped type. /// /// Note that this drops the span. pub fn into_inner(self) -> T { - // To manually destructure `Instrumented` without `Drop`, we - // move it into a ManuallyDrop and use pointers to its fields - let this = ManuallyDrop::new(self); - let span: *const Span = &this.span; - let inner: *const ManuallyDrop = &this.inner; - // SAFETY: Those pointers are valid for reads, because `Drop` didn't - // run, and properly aligned, because `Instrumented` isn't - // `#[repr(packed)]`. - let _span = unsafe { span.read() }; - let inner = unsafe { inner.read() }; - ManuallyDrop::into_inner(inner) + self.inner } } diff -Nru temporalio-1.3.0/vendor/tracing/src/level_filters.rs temporalio-1.3.0/vendor/tracing/src/level_filters.rs --- temporalio-1.3.0/vendor/tracing/src/level_filters.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tracing/src/level_filters.rs 2023-10-30 19:40:00.000000000 +0000 @@ -62,37 +62,33 @@ /// `Span` constructors should compare the level against this value to /// determine if those spans or events are enabled. /// -/// [module-level documentation]: self#compile-time-filters -pub const STATIC_MAX_LEVEL: LevelFilter = get_max_level_inner(); +/// [module-level documentation]: super#compile-time-filters +pub const STATIC_MAX_LEVEL: LevelFilter = MAX_LEVEL; -const fn get_max_level_inner() -> LevelFilter { - if cfg!(not(debug_assertions)) { - if cfg!(feature = "release_max_level_off") { - LevelFilter::OFF - } else if cfg!(feature = "release_max_level_error") { - LevelFilter::ERROR - } else if cfg!(feature = "release_max_level_warn") { - LevelFilter::WARN - } else if cfg!(feature = "release_max_level_info") { - LevelFilter::INFO - } else if cfg!(feature = "release_max_level_debug") { - LevelFilter::DEBUG - } else { - // Same as branch cfg!(feature = "release_max_level_trace") - LevelFilter::TRACE - } - } else if cfg!(feature = "max_level_off") { - LevelFilter::OFF - } else if cfg!(feature = "max_level_error") { - LevelFilter::ERROR - } else if cfg!(feature = "max_level_warn") { - LevelFilter::WARN - } else if cfg!(feature = "max_level_info") { - LevelFilter::INFO - } else if cfg!(feature = "max_level_debug") { - LevelFilter::DEBUG +cfg_if::cfg_if! { + if #[cfg(all(not(debug_assertions), feature = "release_max_level_off"))] { + const MAX_LEVEL: LevelFilter = LevelFilter::OFF; + } else if #[cfg(all(not(debug_assertions), feature = "release_max_level_error"))] { + const MAX_LEVEL: LevelFilter = LevelFilter::ERROR; + } else if #[cfg(all(not(debug_assertions), feature = "release_max_level_warn"))] { + const MAX_LEVEL: LevelFilter = LevelFilter::WARN; + } else if #[cfg(all(not(debug_assertions), feature = "release_max_level_info"))] { + const MAX_LEVEL: LevelFilter = LevelFilter::INFO; + } else if #[cfg(all(not(debug_assertions), feature = "release_max_level_debug"))] { + const MAX_LEVEL: LevelFilter = LevelFilter::DEBUG; + } else if #[cfg(all(not(debug_assertions), feature = "release_max_level_trace"))] { + const MAX_LEVEL: LevelFilter = LevelFilter::TRACE; + } else if #[cfg(feature = "max_level_off")] { + const MAX_LEVEL: LevelFilter = LevelFilter::OFF; + } else if #[cfg(feature = "max_level_error")] { + const MAX_LEVEL: LevelFilter = LevelFilter::ERROR; + } else if #[cfg(feature = "max_level_warn")] { + const MAX_LEVEL: LevelFilter = LevelFilter::WARN; + } else if #[cfg(feature = "max_level_info")] { + const MAX_LEVEL: LevelFilter = LevelFilter::INFO; + } else if #[cfg(feature = "max_level_debug")] { + const MAX_LEVEL: LevelFilter = LevelFilter::DEBUG; } else { - // Same as branch cfg!(feature = "max_level_trace") - LevelFilter::TRACE + const MAX_LEVEL: LevelFilter = LevelFilter::TRACE; } } diff -Nru temporalio-1.3.0/vendor/tracing/src/lib.rs temporalio-1.3.0/vendor/tracing/src/lib.rs --- temporalio-1.3.0/vendor/tracing/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/tracing/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -19,7 +19,7 @@ //! The `tracing` crate provides the APIs necessary for instrumenting libraries //! and applications to emit trace data. //! -//! *Compiler support: [requires `rustc` 1.56+][msrv]* +//! *Compiler support: [requires `rustc` 1.49+][msrv]* //! //! [msrv]: #supported-rust-versions //! # Core Concepts @@ -192,7 +192,7 @@ //! //! You can find more examples showing how to use this crate [here][examples]. //! -//! [RAII]: https://github.com/rust-unofficial/patterns/blob/main/src/patterns/behavioural/RAII.md +//! [RAII]: https://github.com/rust-unofficial/patterns/blob/master/patterns/behavioural/RAII.md //! [examples]: https://github.com/tokio-rs/tracing/tree/master/examples //! //! ### Events @@ -214,7 +214,7 @@ //! ### Configuring Attributes //! //! Both macros require a [`Level`] specifying the verbosity of the span or -//! event. Optionally, the, [target] and [parent span] may be overridden. If the +//! event. Optionally, the [target] and [parent span] may be overridden. If the //! target and parent span are not overridden, they will default to the //! module path where the macro was invoked and the current span (as determined //! by the subscriber), respectively. @@ -237,16 +237,7 @@ //! ``` //! //! The span macros also take a string literal after the level, to set the name -//! of the span (as above). In the case of the event macros, the name of the event can -//! be overridden (the default is `event file:line`) using the `name:` specifier. -//! -//! ``` -//! # use tracing::{span, event, Level}; -//! # fn main() { -//! span!(Level::TRACE, "my span"); -//! event!(name: "some_info", Level::INFO, "something has happened!"); -//! # } -//! ``` +//! of the span. //! //! ### Recording Fields //! @@ -319,19 +310,6 @@ //! # } //!``` //! -//! Constant expressions can also be used as field names. Constants -//! must be enclosed in curly braces (`{}`) to indicate that the *value* -//! of the constant is to be used as the field name, rather than the -//! constant's name. For example: -//! ``` -//! # use tracing::{span, Level}; -//! # fn main() { -//! const RESOURCE_NAME: &str = "foo"; -//! // this span will have the field `foo = "some_id"` -//! span!(Level::TRACE, "get", { RESOURCE_NAME } = "some_id"); -//! # } -//!``` -//! //! The `?` sigil is shorthand that specifies a field should be recorded using //! its [`fmt::Debug`] implementation: //! ``` @@ -408,6 +386,22 @@ //! span.record("parting", &"goodbye world!"); //! ``` //! +//! Note that a span may have up to 32 fields. The following will not compile: +//! +//! ```rust,compile_fail +//! # use tracing::Level; +//! # fn main() { +//! let bad_span = span!( +//! Level::TRACE, +//! "too many fields!", +//! a = 1, b = 2, c = 3, d = 4, e = 5, f = 6, g = 7, h = 8, i = 9, +//! j = 10, k = 11, l = 12, m = 13, n = 14, o = 15, p = 16, q = 17, +//! r = 18, s = 19, t = 20, u = 21, v = 22, w = 23, x = 24, y = 25, +//! z = 26, aa = 27, bb = 28, cc = 29, dd = 30, ee = 31, ff = 32, gg = 33 +//! ); +//! # } +//! ``` +//! //! Finally, events may also include human-readable messages, in the form of a //! [format string][fmt] and (optional) arguments, **after** the event's //! key-value fields. If a format string and arguments are provided, @@ -725,7 +719,6 @@ //! - [`tracing-actix-web`] provides `tracing` integration for the `actix-web` web framework. //! - [`tracing-actix`] provides `tracing` integration for the `actix` actor //! framework. -//! - [`axum-insights`] provides `tracing` integration and Application insights export for the `axum` web framework. //! - [`tracing-gelf`] implements a subscriber for exporting traces in Greylog //! GELF format. //! - [`tracing-coz`] provides integration with the [coz] causal profiler @@ -754,8 +747,6 @@ //! - [`tracing-loki`] provides a layer for shipping logs to [Grafana Loki]. //! - [`tracing-logfmt`] provides a layer that formats events and spans into the logfmt format. //! - [`reqwest-tracing`] provides a middleware to trace [`reqwest`] HTTP requests. -//! - [`tracing-cloudwatch`] provides a layer that sends events to AWS CloudWatch Logs. -//! - [`clippy-tracing`] provides a tool to add, remove and check for `tracing::instrument`. //! //! If you're the maintainer of a `tracing` ecosystem crate not listed above, //! please let us know! We'd love to add your project to the list! @@ -767,7 +758,6 @@ //! [honeycomb.io]: https://www.honeycomb.io/ //! [`tracing-actix-web`]: https://crates.io/crates/tracing-actix-web //! [`tracing-actix`]: https://crates.io/crates/tracing-actix -//! [`axum-insights`]: https://crates.io/crates/axum-insights //! [`tracing-gelf`]: https://crates.io/crates/tracing-gelf //! [`tracing-coz`]: https://crates.io/crates/tracing-coz //! [coz]: https://github.com/plasma-umass/coz @@ -786,7 +776,7 @@ //! [Tracy]: https://github.com/wolfpld/tracy //! [`tracing-elastic-apm`]: https://crates.io/crates/tracing-elastic-apm //! [Elastic APM]: https://www.elastic.co/apm -//! [`tracing-etw`]: https://github.com/microsoft/rust_win_etw/tree/main/win_etw_tracing +//! [`tracing-etw`]: https://github.com/microsoft/tracing-etw //! [ETW]: https://docs.microsoft.com/en-us/windows/win32/etw/about-event-tracing //! [`tracing-fluent-assertions`]: https://crates.io/crates/tracing-fluent-assertions //! [`sentry-tracing`]: https://crates.io/crates/sentry-tracing @@ -797,8 +787,6 @@ //! [`tracing-logfmt`]: https://crates.io/crates/tracing-logfmt //! [`reqwest-tracing`]: https://crates.io/crates/reqwest-tracing //! [`reqwest`]: https://crates.io/crates/reqwest -//! [`tracing-cloudwatch`]: https://crates.io/crates/tracing-cloudwatch -//! [`clippy-tracing`]: https://crates.io/crates/clippy-tracing //! //!
 //!     Note: Some of these ecosystem crates are currently
@@ -829,7 +817,7 @@
 //!
 //!   ```toml
 //!   [dependencies]
-//!   tracing = { version = "0.1.38", default-features = false }
+//!   tracing = { version = "0.1.37", default-features = false }
 //!   ```
 //!
 //! 
@@ -871,14 +859,14 @@
 //! ## Supported Rust Versions
 //!
 //! Tracing is built against the latest stable release. The minimum supported
-//! version is 1.56. The current Tracing version is not guaranteed to build on
+//! version is 1.49. The current Tracing version is not guaranteed to build on
 //! Rust versions earlier than the minimum supported version.
 //!
 //! Tracing follows the same compiler support policies as the rest of the Tokio
 //! project. The current stable Rust compiler and the three most recent minor
 //! versions before it will always be supported. For example, if the current
-//! stable compiler version is 1.69, the minimum supported version will not be
-//! increased past 1.66, three minor versions prior. Increasing the minimum
+//! stable compiler version is 1.45, the minimum supported version will not be
+//! increased past 1.42, three minor versions prior. Increasing the minimum
 //! supported compiler version is not considered a semver breaking change as
 //! long as doing so complies with this policy.
 //!
@@ -912,6 +900,7 @@
 //! [flags]: #crate-feature-flags
 #![cfg_attr(not(feature = "std"), no_std)]
 #![cfg_attr(docsrs, feature(doc_cfg), deny(rustdoc::broken_intra_doc_links))]
+#![doc(html_root_url = "https://docs.rs/tracing/0.1.37")]
 #![doc(
     html_logo_url = "https://raw.githubusercontent.com/tokio-rs/tracing/master/assets/logo-type.png",
     issue_tracker_base_url = "https://github.com/tokio-rs/tracing/issues/"
@@ -922,6 +911,7 @@
     rust_2018_idioms,
     unreachable_pub,
     bad_style,
+    const_err,
     dead_code,
     improper_ctypes,
     non_shorthand_field_patterns,
diff -Nru temporalio-1.3.0/vendor/tracing/src/macros.rs temporalio-1.3.0/vendor/tracing/src/macros.rs
--- temporalio-1.3.0/vendor/tracing/src/macros.rs	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/tracing/src/macros.rs	2023-10-30 19:40:00.000000000 +0000
@@ -24,7 +24,7 @@
     (target: $target:expr, parent: $parent:expr, $lvl:expr, $name:expr, $($fields:tt)*) => {
         {
             use $crate::__macro_support::Callsite as _;
-            static __CALLSITE: $crate::__macro_support::MacroCallsite = $crate::callsite2! {
+            static CALLSITE: $crate::callsite::DefaultCallsite = $crate::callsite2! {
                 name: $name,
                 kind: $crate::metadata::Kind::SPAN,
                 target: $target,
@@ -33,10 +33,10 @@
             };
             let mut interest = $crate::subscriber::Interest::never();
             if $crate::level_enabled!($lvl)
-                && { interest = __CALLSITE.interest(); !interest.is_never() }
-                && $crate::__macro_support::__is_enabled(__CALLSITE.metadata(), interest)
+                && { interest = CALLSITE.interest(); !interest.is_never() }
+                && $crate::__macro_support::__is_enabled(CALLSITE.metadata(), interest)
             {
-                let meta = __CALLSITE.metadata();
+                let meta = CALLSITE.metadata();
                 // span with explicit parent
                 $crate::Span::child_of(
                     $parent,
@@ -44,9 +44,9 @@
                     &$crate::valueset!(meta.fields(), $($fields)*),
                 )
             } else {
-                let span = $crate::__macro_support::__disabled_span(__CALLSITE.metadata());
+                let span = $crate::__macro_support::__disabled_span(CALLSITE.metadata());
                 $crate::if_log_enabled! { $lvl, {
-                    span.record_all(&$crate::valueset!(__CALLSITE.metadata().fields(), $($fields)*));
+                    span.record_all(&$crate::valueset!(CALLSITE.metadata().fields(), $($fields)*));
                 }};
                 span
             }
@@ -55,7 +55,7 @@
     (target: $target:expr, $lvl:expr, $name:expr, $($fields:tt)*) => {
         {
             use $crate::__macro_support::Callsite as _;
-            static __CALLSITE: $crate::callsite::DefaultCallsite = $crate::callsite2! {
+            static CALLSITE: $crate::callsite::DefaultCallsite = $crate::callsite2! {
                 name: $name,
                 kind: $crate::metadata::Kind::SPAN,
                 target: $target,
@@ -64,19 +64,19 @@
             };
             let mut interest = $crate::subscriber::Interest::never();
             if $crate::level_enabled!($lvl)
-                && { interest = __CALLSITE.interest(); !interest.is_never() }
-                && $crate::__macro_support::__is_enabled(__CALLSITE.metadata(), interest)
+                && { interest = CALLSITE.interest(); !interest.is_never() }
+                && $crate::__macro_support::__is_enabled(CALLSITE.metadata(), interest)
             {
-                let meta = __CALLSITE.metadata();
+                let meta = CALLSITE.metadata();
                 // span with contextual parent
                 $crate::Span::new(
                     meta,
                     &$crate::valueset!(meta.fields(), $($fields)*),
                 )
             } else {
-                let span = $crate::__macro_support::__disabled_span(__CALLSITE.metadata());
+                let span = $crate::__macro_support::__disabled_span(CALLSITE.metadata());
                 $crate::if_log_enabled! { $lvl, {
-                    span.record_all(&$crate::valueset!(__CALLSITE.metadata().fields(), $($fields)*));
+                    span.record_all(&$crate::valueset!(CALLSITE.metadata().fields(), $($fields)*));
                 }};
                 span
             }
@@ -564,7 +564,6 @@
 ///     "App warning: {}",
 ///     error
 /// );
-/// event!(name: "answer", Level::INFO, the_answer = data.0);
 /// event!(Level::INFO, the_answer = data.0);
 /// # }
 /// ```
@@ -583,115 +582,9 @@
 // /// ```
 #[macro_export]
 macro_rules! event {
-    // Name / target / parent.
-    (name: $name:expr, target: $target:expr, parent: $parent:expr, $lvl:expr, { $($fields:tt)* } )=> ({
-        use $crate::__macro_support::Callsite as _;
-        static __CALLSITE: $crate::__macro_support::MacroCallsite = $crate::callsite2! {
-            name: $name,
-            kind: $crate::metadata::Kind::EVENT,
-            target: $target,
-            level: $lvl,
-            fields: $($fields)*
-        };
-
-        let enabled = $crate::level_enabled!($lvl) && {
-            let interest = __CALLSITE.interest();
-            !interest.is_never() && $crate::__macro_support::__is_enabled(__CALLSITE.metadata(), interest)
-        };
-        if enabled {
-            (|value_set: $crate::field::ValueSet| {
-                $crate::__tracing_log!(
-                    $lvl,
-                    __CALLSITE,
-                    &value_set
-                );
-                let meta = __CALLSITE.metadata();
-                // event with explicit parent
-                $crate::Event::child_of(
-                    $parent,
-                    meta,
-                    &value_set
-                );
-            })($crate::valueset!(__CALLSITE.metadata().fields(), $($fields)*));
-        } else {
-            $crate::__tracing_log!(
-                $lvl,
-                __CALLSITE,
-                &$crate::valueset!(__CALLSITE.metadata().fields(), $($fields)*)
-            );
-        }
-    });
-    (name: $name:expr, target: $target:expr, parent: $parent:expr, $lvl:expr, { $($fields:tt)* }, $($arg:tt)+ ) => (
-        $crate::event!(
-            name: $name,
-            target: $target,
-            parent: $parent,
-            $lvl,
-            { message = ::core::format_args!($($arg)+), $($fields)* }
-        )
-    );
-    (name: $name:expr, target: $target:expr, parent: $parent:expr, $lvl:expr, $($k:ident).+ = $($fields:tt)* ) => (
-        $crate::event!(name: $name, target: $target, parent: $parent, $lvl, { $($k).+ = $($fields)* })
-    );
-    (name: $name:expr, target: $target:expr, parent: $parent:expr, $lvl:expr, $($arg:tt)+) => (
-        $crate::event!(name: $name, target: $target, parent: $parent, $lvl, { $($arg)+ })
-    );
-
-    // Name / target.
-    (name: $name:expr, target: $target:expr, $lvl:expr, { $($fields:tt)* } )=> ({
-        use $crate::__macro_support::Callsite as _;
-        static __CALLSITE: $crate::__macro_support::MacroCallsite = $crate::callsite2! {
-            name: $name,
-            kind: $crate::metadata::Kind::EVENT,
-            target: $target,
-            level: $lvl,
-            fields: $($fields)*
-        };
-        let enabled = $crate::level_enabled!($lvl) && {
-            let interest = __CALLSITE.interest();
-            !interest.is_never() && $crate::__macro_support::__is_enabled(__CALLSITE.metadata(), interest)
-        };
-        if enabled {
-            (|value_set: $crate::field::ValueSet| {
-                let meta = __CALLSITE.metadata();
-                // event with contextual parent
-                $crate::Event::dispatch(
-                    meta,
-                    &value_set
-                );
-                $crate::__tracing_log!(
-                    $lvl,
-                    __CALLSITE,
-                    &value_set
-                );
-            })($crate::valueset!(__CALLSITE.metadata().fields(), $($fields)*));
-        } else {
-            $crate::__tracing_log!(
-                $lvl,
-                __CALLSITE,
-                &$crate::valueset!(__CALLSITE.metadata().fields(), $($fields)*)
-            );
-        }
-    });
-    (name: $name:expr, target: $target:expr, $lvl:expr, { $($fields:tt)* }, $($arg:tt)+ ) => (
-        $crate::event!(
-            name: $name,
-            target: $target,
-            $lvl,
-            { message = ::core::format_args!($($arg)+), $($fields)* }
-        )
-    );
-    (name: $name:expr, target: $target:expr, $lvl:expr, $($k:ident).+ = $($fields:tt)* ) => (
-        $crate::event!(name: $name, target: $target, $lvl, { $($k).+ = $($fields)* })
-    );
-    (name: $name:expr, target: $target:expr, $lvl:expr, $($arg:tt)+) => (
-        $crate::event!(name: $name, target: $target, $lvl, { $($arg)+ })
-    );
-
-    // Target / parent.
     (target: $target:expr, parent: $parent:expr, $lvl:expr, { $($fields:tt)* } )=> ({
         use $crate::__macro_support::Callsite as _;
-        static __CALLSITE: $crate::callsite::DefaultCallsite = $crate::callsite2! {
+        static CALLSITE: $crate::callsite::DefaultCallsite = $crate::callsite2! {
             name: $crate::__macro_support::concat!(
                 "event ",
                 file!(),
@@ -705,38 +598,39 @@
         };
 
         let enabled = $crate::level_enabled!($lvl) && {
-            let interest = __CALLSITE.interest();
-            !interest.is_never() && $crate::__macro_support::__is_enabled(__CALLSITE.metadata(), interest)
+            let interest = CALLSITE.interest();
+            !interest.is_never() && $crate::__macro_support::__is_enabled(CALLSITE.metadata(), interest)
         };
         if enabled {
             (|value_set: $crate::field::ValueSet| {
                 $crate::__tracing_log!(
                     $lvl,
-                    __CALLSITE,
+                    CALLSITE,
                     &value_set
                 );
-                let meta = __CALLSITE.metadata();
+                let meta = CALLSITE.metadata();
                 // event with explicit parent
                 $crate::Event::child_of(
                     $parent,
                     meta,
                     &value_set
                 );
-            })($crate::valueset!(__CALLSITE.metadata().fields(), $($fields)*));
+            })($crate::valueset!(CALLSITE.metadata().fields(), $($fields)*));
         } else {
             $crate::__tracing_log!(
                 $lvl,
-                __CALLSITE,
-                &$crate::valueset!(__CALLSITE.metadata().fields(), $($fields)*)
+                CALLSITE,
+                &$crate::valueset!(CALLSITE.metadata().fields(), $($fields)*)
             );
         }
     });
+
     (target: $target:expr, parent: $parent:expr, $lvl:expr, { $($fields:tt)* }, $($arg:tt)+ ) => (
         $crate::event!(
             target: $target,
             parent: $parent,
             $lvl,
-            { message = ::core::format_args!($($arg)+), $($fields)* }
+            { message = format_args!($($arg)+), $($fields)* }
         )
     );
     (target: $target:expr, parent: $parent:expr, $lvl:expr, $($k:ident).+ = $($fields:tt)* ) => (
@@ -745,114 +639,9 @@
     (target: $target:expr, parent: $parent:expr, $lvl:expr, $($arg:tt)+) => (
         $crate::event!(target: $target, parent: $parent, $lvl, { $($arg)+ })
     );
-
-    // Name / parent.
-    (name: $name:expr, parent: $parent:expr, $lvl:expr, { $($fields:tt)* } )=> ({
-        use $crate::__macro_support::Callsite as _;
-        static __CALLSITE: $crate::__macro_support::MacroCallsite = $crate::callsite2! {
-            name: $name,
-            kind: $crate::metadata::Kind::EVENT,
-            target: module_path!(),
-            level: $lvl,
-            fields: $($fields)*
-        };
-
-        let enabled = $crate::level_enabled!($lvl) && {
-            let interest = __CALLSITE.interest();
-            !interest.is_never() && __CALLSITE.is_enabled(interest)
-        };
-        if enabled {
-            (|value_set: $crate::field::ValueSet| {
-                $crate::__tracing_log!(
-                    $lvl,
-                    __CALLSITE,
-                    &value_set
-                );
-                let meta = __CALLSITE.metadata();
-                // event with explicit parent
-                $crate::Event::child_of(
-                    $parent,
-                    meta,
-                    &value_set
-                );
-            })($crate::valueset!(__CALLSITE.metadata().fields(), $($fields)*));
-        } else {
-            $crate::__tracing_log!(
-                $lvl,
-                __CALLSITE,
-                &$crate::valueset!(__CALLSITE.metadata().fields(), $($fields)*)
-            );
-        }
-    });
-    (name: $name:expr, parent: $parent:expr, $lvl:expr, { $($fields:tt)* }, $($arg:tt)+ ) => (
-        $crate::event!(
-            name: $name,
-            parent: $parent,
-            $lvl,
-            { message = ::core::format_args!($($arg)+), $($fields)* }
-        )
-    );
-    (name: $name:expr, parent: $parent:expr, $lvl:expr, $($k:ident).+ = $($fields:tt)* ) => (
-        $crate::event!(name: $name, parent: $parent, $lvl, { $($k).+ = $($fields)* })
-    );
-    (name: $name:expr, parent: $parent:expr, $lvl:expr, $($arg:tt)+) => (
-        $crate::event!(name: $name, parent: $parent, $lvl, { $($arg)+ })
-    );
-
-    // Name.
-    (name: $name:expr, $lvl:expr, { $($fields:tt)* } )=> ({
-        use $crate::__macro_support::Callsite as _;
-        static __CALLSITE: $crate::__macro_support::MacroCallsite = $crate::callsite2! {
-            name: $name,
-            kind: $crate::metadata::Kind::EVENT,
-            target: module_path!(),
-            level: $lvl,
-            fields: $($fields)*
-        };
-        let enabled = $crate::level_enabled!($lvl) && {
-            let interest = __CALLSITE.interest();
-            !interest.is_never() && $crate::__macro_support::__is_enabled(__CALLSITE.metadata(), interest)
-        };
-        if enabled {
-            (|value_set: $crate::field::ValueSet| {
-                let meta = __CALLSITE.metadata();
-                // event with contextual parent
-                $crate::Event::dispatch(
-                    meta,
-                    &value_set
-                );
-                $crate::__tracing_log!(
-                    $lvl,
-                    __CALLSITE,
-                    &value_set
-                );
-            })($crate::valueset!(__CALLSITE.metadata().fields(), $($fields)*));
-        } else {
-            $crate::__tracing_log!(
-                $lvl,
-                __CALLSITE,
-                &$crate::valueset!(__CALLSITE.metadata().fields(), $($fields)*)
-            );
-        }
-    });
-    (name: $name:expr, $lvl:expr, { $($fields:tt)* }, $($arg:tt)+ ) => (
-        $crate::event!(
-            name: $name,
-            $lvl,
-            { message = ::core::format_args!($($arg)+), $($fields)* }
-        )
-    );
-    (name: $name:expr, $lvl:expr, $($k:ident).+ = $($fields:tt)* ) => (
-        $crate::event!(name: $name, $lvl, { $($k).+ = $($fields)* })
-    );
-    (name: $name:expr, $lvl:expr, $($arg:tt)+ ) => (
-        $crate::event!(name: $name, $lvl, { $($arg)+ })
-    );
-
-    // Target.
     (target: $target:expr, $lvl:expr, { $($fields:tt)* } )=> ({
         use $crate::__macro_support::Callsite as _;
-        static __CALLSITE: $crate::callsite::DefaultCallsite = $crate::callsite2! {
+        static CALLSITE: $crate::callsite::DefaultCallsite = $crate::callsite2! {
             name: $crate::__macro_support::concat!(
                 "event ",
                 file!(),
@@ -865,12 +654,12 @@
             fields: $($fields)*
         };
         let enabled = $crate::level_enabled!($lvl) && {
-            let interest = __CALLSITE.interest();
-            !interest.is_never() && $crate::__macro_support::__is_enabled(__CALLSITE.metadata(), interest)
+            let interest = CALLSITE.interest();
+            !interest.is_never() && $crate::__macro_support::__is_enabled(CALLSITE.metadata(), interest)
         };
         if enabled {
             (|value_set: $crate::field::ValueSet| {
-                let meta = __CALLSITE.metadata();
+                let meta = CALLSITE.metadata();
                 // event with contextual parent
                 $crate::Event::dispatch(
                     meta,
@@ -878,15 +667,15 @@
                 );
                 $crate::__tracing_log!(
                     $lvl,
-                    __CALLSITE,
+                    CALLSITE,
                     &value_set
                 );
-            })($crate::valueset!(__CALLSITE.metadata().fields(), $($fields)*));
+            })($crate::valueset!(CALLSITE.metadata().fields(), $($fields)*));
         } else {
             $crate::__tracing_log!(
                 $lvl,
-                __CALLSITE,
-                &$crate::valueset!(__CALLSITE.metadata().fields(), $($fields)*)
+                CALLSITE,
+                &$crate::valueset!(CALLSITE.metadata().fields(), $($fields)*)
             );
         }
     });
@@ -894,7 +683,7 @@
         $crate::event!(
             target: $target,
             $lvl,
-            { message = ::core::format_args!($($arg)+), $($fields)* }
+            { message = format_args!($($arg)+), $($fields)* }
         )
     );
     (target: $target:expr, $lvl:expr, $($k:ident).+ = $($fields:tt)* ) => (
@@ -903,14 +692,12 @@
     (target: $target:expr, $lvl:expr, $($arg:tt)+ ) => (
         $crate::event!(target: $target, $lvl, { $($arg)+ })
     );
-
-    // Parent.
     (parent: $parent:expr, $lvl:expr, { $($fields:tt)* }, $($arg:tt)+ ) => (
         $crate::event!(
             target: module_path!(),
             parent: $parent,
             $lvl,
-            { message = ::core::format_args!($($arg)+), $($fields)* }
+            { message = format_args!($($arg)+), $($fields)* }
         )
     );
     (parent: $parent:expr, $lvl:expr, $($k:ident).+ = $($field:tt)*) => (
@@ -964,13 +751,11 @@
     (parent: $parent:expr, $lvl:expr, $($arg:tt)+ ) => (
         $crate::event!(target: module_path!(), parent: $parent, $lvl, { $($arg)+ })
     );
-
-    // ...
     ( $lvl:expr, { $($fields:tt)* }, $($arg:tt)+ ) => (
         $crate::event!(
             target: module_path!(),
             $lvl,
-            { message = ::core::format_args!($($arg)+), $($fields)* }
+            { message = format_args!($($arg)+), $($fields)* }
         )
     );
     ( $lvl:expr, { $($fields:tt)* }, $($arg:tt)+ ) => (
@@ -1185,7 +970,7 @@
     (kind: $kind:expr, target: $target:expr, $lvl:expr, { $($fields:tt)* } )=> ({
         if $crate::level_enabled!($lvl) {
             use $crate::__macro_support::Callsite as _;
-            static __CALLSITE: $crate::callsite::DefaultCallsite = $crate::callsite2! {
+            static CALLSITE: $crate::callsite::DefaultCallsite = $crate::callsite2! {
                 name: $crate::__macro_support::concat!(
                     "enabled ",
                     file!(),
@@ -1197,9 +982,9 @@
                 level: $lvl,
                 fields: $($fields)*
             };
-            let interest = __CALLSITE.interest();
-            if !interest.is_never() && $crate::__macro_support::__is_enabled(__CALLSITE.metadata(), interest) {
-                let meta = __CALLSITE.metadata();
+            let interest = CALLSITE.interest();
+            if !interest.is_never() && $crate::__macro_support::__is_enabled(CALLSITE.metadata(), interest) {
+                let meta = CALLSITE.metadata();
                 $crate::dispatcher::get_default(|current| current.enabled(meta))
             } else {
                 false
@@ -1296,46 +1081,10 @@
 ///     if pos.x >= 0.0 { "positive" } else { "negative" },
 ///     if pos.y >= 0.0 { "positive" } else { "negative" }
 /// );
-/// trace!(name: "completed", position = ?pos);
 /// # }
 /// ```
 #[macro_export]
 macro_rules! trace {
-    // Name / target / parent.
-    (name: $name:expr, target: $target:expr, parent: $parent:expr, { $($field:tt)* }, $($arg:tt)* ) => (
-        $crate::event!(name: $name, target: $target, parent: $parent, $crate::Level::TRACE, { $($field)* }, $($arg)*)
-    );
-    (name: $name:expr, target: $target:expr, parent: $parent:expr, $($k:ident).+ $($field:tt)+ ) => (
-        $crate::event!(name: $name, target: $target, parent: $parent, $crate::Level::TRACE, { $($k).+ $($field)+ })
-    );
-    (name: $name:expr, target: $target:expr, parent: $parent:expr, ?$($k:ident).+ $($field:tt)+ ) => (
-        $crate::event!(name: $name, target: $target, parent: $parent, $crate::Level::TRACE, { $($k).+ $($field)+ })
-    );
-    (name: $name:expr, target: $target:expr, parent: $parent:expr, %$($k:ident).+ $($field:tt)+ ) => (
-        $crate::event!(name: $name, target: $target, parent: $parent, $crate::Level::TRACE, { $($k).+ $($field)+ })
-    );
-    (name: $name:expr, target: $target:expr, parent: $parent:expr, $($arg:tt)+ ) => (
-        $crate::event!(name: $name, target: $target, parent: $parent, $crate::Level::TRACE, {}, $($arg)+)
-    );
-
-    // Name / target.
-    (name: $name:expr, target: $target:expr, { $($field:tt)* }, $($arg:tt)* ) => (
-        $crate::event!(name: $name, target: $target, $crate::Level::TRACE, { $($field)* }, $($arg)*)
-    );
-    (name: $name:expr, target: $target:expr, $($k:ident).+ $($field:tt)+ ) => (
-        $crate::event!(name: $name, target: $target, $crate::Level::TRACE, { $($k).+ $($field)+ })
-    );
-    (name: $name:expr, target: $target:expr, ?$($k:ident).+ $($field:tt)+ ) => (
-        $crate::event!(name: $name, target: $target, $crate::Level::TRACE, { $($k).+ $($field)+ })
-    );
-    (name: $name:expr, target: $target:expr, %$($k:ident).+ $($field:tt)+ ) => (
-        $crate::event!(name: $name, target: $target, $crate::Level::TRACE, { $($k).+ $($field)+ })
-    );
-    (name: $name:expr, target: $target:expr, $($arg:tt)+ ) => (
-        $crate::event!(name: $name, target: $target, $crate::Level::TRACE, {}, $($arg)+)
-    );
-
-    // Target / parent.
     (target: $target:expr, parent: $parent:expr, { $($field:tt)* }, $($arg:tt)* ) => (
         $crate::event!(target: $target, parent: $parent, $crate::Level::TRACE, { $($field)* }, $($arg)*)
     );
@@ -1351,59 +1100,6 @@
     (target: $target:expr, parent: $parent:expr, $($arg:tt)+ ) => (
         $crate::event!(target: $target, parent: $parent, $crate::Level::TRACE, {}, $($arg)+)
     );
-
-    // Name / parent.
-    (name: $name:expr, parent: $parent:expr, { $($field:tt)* }, $($arg:tt)* ) => (
-        $crate::event!(name: $name, parent: $parent, $crate::Level::TRACE, { $($field)* }, $($arg)*)
-    );
-    (name: $name:expr, parent: $parent:expr, $($k:ident).+ $($field:tt)+ ) => (
-        $crate::event!(name: $name, parent: $parent, $crate::Level::TRACE, { $($k).+ $($field)+ })
-    );
-    (name: $name:expr, parent: $parent:expr, ?$($k:ident).+ $($field:tt)+ ) => (
-        $crate::event!(name: $name, parent: $parent, $crate::Level::TRACE, { $($k).+ $($field)+ })
-    );
-    (name: $name:expr, parent: $parent:expr, %$($k:ident).+ $($field:tt)+ ) => (
-        $crate::event!(name: $name, parent: $parent, $crate::Level::TRACE, { $($k).+ $($field)+ })
-    );
-    (name: $name:expr, parent: $parent:expr, $($arg:tt)+ ) => (
-        $crate::event!(name: $name, parent: $parent, $crate::Level::TRACE, {}, $($arg)+)
-    );
-
-    // Name.
-    (name: $name:expr, { $($field:tt)* }, $($arg:tt)* ) => (
-        $crate::event!(name: $name, $crate::Level::TRACE, { $($field)* }, $($arg)*)
-    );
-    (name: $name:expr, $($k:ident).+ $($field:tt)* ) => (
-        $crate::event!(name: $name, $crate::Level::TRACE, { $($k).+ $($field)* })
-    );
-    (name: $name:expr, ?$($k:ident).+ $($field:tt)* ) => (
-        $crate::event!(name: $name, $crate::Level::TRACE, { ?$($k).+ $($field)* })
-    );
-    (name: $name:expr, %$($k:ident).+ $($field:tt)* ) => (
-        $crate::event!(name: $name, $crate::Level::TRACE, { %$($k).+ $($field)* })
-    );
-    (name: $name:expr, $($arg:tt)+ ) => (
-        $crate::event!(name: $name, $crate::Level::TRACE, {}, $($arg)+)
-    );
-
-    // Target.
-    (target: $target:expr, { $($field:tt)* }, $($arg:tt)* ) => (
-        $crate::event!(target: $target, $crate::Level::TRACE, { $($field)* }, $($arg)*)
-    );
-    (target: $target:expr, $($k:ident).+ $($field:tt)* ) => (
-        $crate::event!(target: $target, $crate::Level::TRACE, { $($k).+ $($field)* })
-    );
-    (target: $target:expr, ?$($k:ident).+ $($field:tt)* ) => (
-        $crate::event!(target: $target, $crate::Level::TRACE, { ?$($k).+ $($field)* })
-    );
-    (target: $target:expr, %$($k:ident).+ $($field:tt)* ) => (
-        $crate::event!(target: $target, $crate::Level::TRACE, { %$($k).+ $($field)* })
-    );
-    (target: $target:expr, $($arg:tt)+ ) => (
-        $crate::event!(target: $target, $crate::Level::TRACE, {}, $($arg)+)
-    );
-
-    // Parent.
     (parent: $parent:expr, { $($field:tt)+ }, $($arg:tt)+ ) => (
         $crate::event!(
             target: module_path!(),
@@ -1470,8 +1166,21 @@
             $($arg)+
         )
     );
-
-    // ...
+    (target: $target:expr, { $($field:tt)* }, $($arg:tt)* ) => (
+        $crate::event!(target: $target, $crate::Level::TRACE, { $($field)* }, $($arg)*)
+    );
+    (target: $target:expr, $($k:ident).+ $($field:tt)* ) => (
+        $crate::event!(target: $target, $crate::Level::TRACE, { $($k).+ $($field)* })
+    );
+    (target: $target:expr, ?$($k:ident).+ $($field:tt)* ) => (
+        $crate::event!(target: $target, $crate::Level::TRACE, { ?$($k).+ $($field)* })
+    );
+    (target: $target:expr, %$($k:ident).+ $($field:tt)* ) => (
+        $crate::event!(target: $target, $crate::Level::TRACE, { %$($k).+ $($field)* })
+    );
+    (target: $target:expr, $($arg:tt)+ ) => (
+        $crate::event!(target: $target, $crate::Level::TRACE, {}, $($arg)+)
+    );
     ({ $($field:tt)+ }, $($arg:tt)+ ) => (
         $crate::event!(
             target: module_path!(),
@@ -1487,20 +1196,6 @@
             { $($k).+ = $($field)*}
         )
     );
-    (?$($k:ident).+ = $($field:tt)*) => (
-        $crate::event!(
-            target: module_path!(),
-            $crate::Level::TRACE,
-            { ?$($k).+ = $($field)*}
-        )
-    );
-    (%$($k:ident).+ = $($field:tt)*) => (
-        $crate::event!(
-            target: module_path!(),
-            $crate::Level::TRACE,
-            { %$($k).+ = $($field)*}
-        )
-    );
     ($($k:ident).+, $($field:tt)*) => (
         $crate::event!(
             target: module_path!(),
@@ -1573,46 +1268,10 @@
 ///
 /// debug!(?pos.x, ?pos.y);
 /// debug!(target: "app_events", position = ?pos, "New position");
-/// debug!(name: "completed", position = ?pos);
 /// # }
 /// ```
 #[macro_export]
 macro_rules! debug {
-    // Name / target / parent.
-    (name: $name:expr, target: $target:expr, parent: $parent:expr, { $($field:tt)* }, $($arg:tt)* ) => (
-        $crate::event!(name: $name, target: $target, parent: $parent, $crate::Level::DEBUG, { $($field)* }, $($arg)*)
-    );
-    (name: $name:expr, target: $target:expr, parent: $parent:expr, $($k:ident).+ $($field:tt)+ ) => (
-        $crate::event!(name: $name, target: $target, parent: $parent, $crate::Level::DEBUG, { $($k).+ $($field)+ })
-    );
-    (name: $name:expr, target: $target:expr, parent: $parent:expr, ?$($k:ident).+ $($field:tt)+ ) => (
-        $crate::event!(name: $name, target: $target, parent: $parent, $crate::Level::DEBUG, { $($k).+ $($field)+ })
-    );
-    (name: $name:expr, target: $target:expr, parent: $parent:expr, %$($k:ident).+ $($field:tt)+ ) => (
-        $crate::event!(name: $name, target: $target, parent: $parent, $crate::Level::DEBUG, { $($k).+ $($field)+ })
-    );
-    (name: $name:expr, target: $target:expr, parent: $parent:expr, $($arg:tt)+ ) => (
-        $crate::event!(name: $name, target: $target, parent: $parent, $crate::Level::DEBUG, {}, $($arg)+)
-    );
-
-    // Name / target.
-    (name: $name:expr, target: $target:expr, { $($field:tt)* }, $($arg:tt)* ) => (
-        $crate::event!(name: $name, target: $target, $crate::Level::DEBUG, { $($field)* }, $($arg)*)
-    );
-    (name: $name:expr, target: $target:expr, $($k:ident).+ $($field:tt)+ ) => (
-        $crate::event!(name: $name, target: $target, $crate::Level::DEBUG, { $($k).+ $($field)+ })
-    );
-    (name: $name:expr, target: $target:expr, ?$($k:ident).+ $($field:tt)+ ) => (
-        $crate::event!(name: $name, target: $target, $crate::Level::DEBUG, { $($k).+ $($field)+ })
-    );
-    (name: $name:expr, target: $target:expr, %$($k:ident).+ $($field:tt)+ ) => (
-        $crate::event!(name: $name, target: $target, $crate::Level::DEBUG, { $($k).+ $($field)+ })
-    );
-    (name: $name:expr, target: $target:expr, $($arg:tt)+ ) => (
-        $crate::event!(name: $name, target: $target, $crate::Level::DEBUG, {}, $($arg)+)
-    );
-
-    // Target / parent.
     (target: $target:expr, parent: $parent:expr, { $($field:tt)* }, $($arg:tt)* ) => (
         $crate::event!(target: $target, parent: $parent, $crate::Level::DEBUG, { $($field)* }, $($arg)*)
     );
@@ -1628,59 +1287,6 @@
     (target: $target:expr, parent: $parent:expr, $($arg:tt)+ ) => (
         $crate::event!(target: $target, parent: $parent, $crate::Level::DEBUG, {}, $($arg)+)
     );
-
-    // Name / parent.
-    (name: $name:expr, parent: $parent:expr, { $($field:tt)* }, $($arg:tt)* ) => (
-        $crate::event!(name: $name, parent: $parent, $crate::Level::DEBUG, { $($field)* }, $($arg)*)
-    );
-    (name: $name:expr, parent: $parent:expr, $($k:ident).+ $($field:tt)+ ) => (
-        $crate::event!(name: $name, parent: $parent, $crate::Level::DEBUG, { $($k).+ $($field)+ })
-    );
-    (name: $name:expr, parent: $parent:expr, ?$($k:ident).+ $($field:tt)+ ) => (
-        $crate::event!(name: $name, parent: $parent, $crate::Level::DEBUG, { $($k).+ $($field)+ })
-    );
-    (name: $name:expr, parent: $parent:expr, %$($k:ident).+ $($field:tt)+ ) => (
-        $crate::event!(name: $name, parent: $parent, $crate::Level::DEBUG, { $($k).+ $($field)+ })
-    );
-    (name: $name:expr, parent: $parent:expr, $($arg:tt)+ ) => (
-        $crate::event!(name: $name, parent: $parent, $crate::Level::DEBUG, {}, $($arg)+)
-    );
-
-    // Name.
-    (name: $name:expr, { $($field:tt)* }, $($arg:tt)* ) => (
-        $crate::event!(name: $name, $crate::Level::DEBUG, { $($field)* }, $($arg)*)
-    );
-    (name: $name:expr, $($k:ident).+ $($field:tt)* ) => (
-        $crate::event!(name: $name, $crate::Level::DEBUG, { $($k).+ $($field)* })
-    );
-    (name: $name:expr, ?$($k:ident).+ $($field:tt)* ) => (
-        $crate::event!(name: $name, $crate::Level::DEBUG, { ?$($k).+ $($field)* })
-    );
-    (name: $name:expr, %$($k:ident).+ $($field:tt)* ) => (
-        $crate::event!(name: $name, $crate::Level::DEBUG, { %$($k).+ $($field)* })
-    );
-    (name: $name:expr, $($arg:tt)+ ) => (
-        $crate::event!(name: $name, $crate::Level::DEBUG, {}, $($arg)+)
-    );
-
-    // Target.
-    (target: $target:expr, { $($field:tt)* }, $($arg:tt)* ) => (
-        $crate::event!(target: $target, $crate::Level::DEBUG, { $($field)* }, $($arg)*)
-    );
-    (target: $target:expr, $($k:ident).+ $($field:tt)* ) => (
-        $crate::event!(target: $target, $crate::Level::DEBUG, { $($k).+ $($field)* })
-    );
-    (target: $target:expr, ?$($k:ident).+ $($field:tt)* ) => (
-        $crate::event!(target: $target, $crate::Level::DEBUG, { ?$($k).+ $($field)* })
-    );
-    (target: $target:expr, %$($k:ident).+ $($field:tt)* ) => (
-        $crate::event!(target: $target, $crate::Level::DEBUG, { %$($k).+ $($field)* })
-    );
-    (target: $target:expr, $($arg:tt)+ ) => (
-        $crate::event!(target: $target, $crate::Level::DEBUG, {}, $($arg)+)
-    );
-
-    // Parent.
     (parent: $parent:expr, { $($field:tt)+ }, $($arg:tt)+ ) => (
         $crate::event!(
             target: module_path!(),
@@ -1747,8 +1353,21 @@
             $($arg)+
         )
     );
-
-    // ...
+    (target: $target:expr, { $($field:tt)* }, $($arg:tt)* ) => (
+        $crate::event!(target: $target, $crate::Level::DEBUG, { $($field)* }, $($arg)*)
+    );
+    (target: $target:expr, $($k:ident).+ $($field:tt)* ) => (
+        $crate::event!(target: $target, $crate::Level::DEBUG, { $($k).+ $($field)* })
+    );
+    (target: $target:expr, ?$($k:ident).+ $($field:tt)* ) => (
+        $crate::event!(target: $target, $crate::Level::DEBUG, { ?$($k).+ $($field)* })
+    );
+    (target: $target:expr, %$($k:ident).+ $($field:tt)* ) => (
+        $crate::event!(target: $target, $crate::Level::DEBUG, { %$($k).+ $($field)* })
+    );
+    (target: $target:expr, $($arg:tt)+ ) => (
+        $crate::event!(target: $target, $crate::Level::DEBUG, {}, $($arg)+)
+    );
     ({ $($field:tt)+ }, $($arg:tt)+ ) => (
         $crate::event!(
             target: module_path!(),
@@ -1861,47 +1480,11 @@
 ///     conn.port,
 ///     ?conn.speed,
 /// );
-/// info!(name: "completed", "completed connection to {:?}", addr);
 /// # }
 /// ```
 #[macro_export]
 macro_rules! info {
-    // Name / target / parent.
-    (name: $name:expr, target: $target:expr, parent: $parent:expr, { $($field:tt)* }, $($arg:tt)* ) => (
-        $crate::event!(name: $name, target: $target, parent: $parent, $crate::Level::INFO, { $($field)* }, $($arg)*)
-    );
-    (name: $name:expr, target: $target:expr, parent: $parent:expr, $($k:ident).+ $($field:tt)+ ) => (
-        $crate::event!(name: $name, target: $target, parent: $parent, $crate::Level::INFO, { $($k).+ $($field)+ })
-    );
-    (name: $name:expr, target: $target:expr, parent: $parent:expr, ?$($k:ident).+ $($field:tt)+ ) => (
-        $crate::event!(name: $name, target: $target, parent: $parent, $crate::Level::INFO, { $($k).+ $($field)+ })
-    );
-    (name: $name:expr, target: $target:expr, parent: $parent:expr, %$($k:ident).+ $($field:tt)+ ) => (
-        $crate::event!(name: $name, target: $target, parent: $parent, $crate::Level::INFO, { $($k).+ $($field)+ })
-    );
-    (name: $name:expr, target: $target:expr, parent: $parent:expr, $($arg:tt)+ ) => (
-        $crate::event!(name: $name, target: $target, parent: $parent, $crate::Level::INFO, {}, $($arg)+)
-    );
-
-    // Name / target.
-    (name: $name:expr, target: $target:expr, { $($field:tt)* }, $($arg:tt)* ) => (
-        $crate::event!(name: $name, target: $target, $crate::Level::INFO, { $($field)* }, $($arg)*)
-    );
-    (name: $name:expr, target: $target:expr, $($k:ident).+ $($field:tt)+ ) => (
-        $crate::event!(name: $name, target: $target, $crate::Level::INFO, { $($k).+ $($field)+ })
-    );
-    (name: $name:expr, target: $target:expr, ?$($k:ident).+ $($field:tt)+ ) => (
-        $crate::event!(name: $name, target: $target, $crate::Level::INFO, { $($k).+ $($field)+ })
-    );
-    (name: $name:expr, target: $target:expr, %$($k:ident).+ $($field:tt)+ ) => (
-        $crate::event!(name: $name, target: $target, $crate::Level::INFO, { $($k).+ $($field)+ })
-    );
-    (name: $name:expr, target: $target:expr, $($arg:tt)+ ) => (
-        $crate::event!(name: $name, target: $target, $crate::Level::INFO, {}, $($arg)+)
-    );
-
-    // Target / parent.
-    (target: $target:expr, parent: $parent:expr, { $($field:tt)* }, $($arg:tt)* ) => (
+     (target: $target:expr, parent: $parent:expr, { $($field:tt)* }, $($arg:tt)* ) => (
         $crate::event!(target: $target, parent: $parent, $crate::Level::INFO, { $($field)* }, $($arg)*)
     );
     (target: $target:expr, parent: $parent:expr, $($k:ident).+ $($field:tt)+ ) => (
@@ -1916,59 +1499,6 @@
     (target: $target:expr, parent: $parent:expr, $($arg:tt)+ ) => (
         $crate::event!(target: $target, parent: $parent, $crate::Level::INFO, {}, $($arg)+)
     );
-
-    // Name / parent.
-    (name: $name:expr, parent: $parent:expr, { $($field:tt)* }, $($arg:tt)* ) => (
-        $crate::event!(name: $name, parent: $parent, $crate::Level::INFO, { $($field)* }, $($arg)*)
-    );
-    (name: $name:expr, parent: $parent:expr, $($k:ident).+ $($field:tt)+ ) => (
-        $crate::event!(name: $name, parent: $parent, $crate::Level::INFO, { $($k).+ $($field)+ })
-    );
-    (name: $name:expr, parent: $parent:expr, ?$($k:ident).+ $($field:tt)+ ) => (
-        $crate::event!(name: $name, parent: $parent, $crate::Level::INFO, { $($k).+ $($field)+ })
-    );
-    (name: $name:expr, parent: $parent:expr, %$($k:ident).+ $($field:tt)+ ) => (
-        $crate::event!(name: $name, parent: $parent, $crate::Level::INFO, { $($k).+ $($field)+ })
-    );
-    (name: $name:expr, parent: $parent:expr, $($arg:tt)+ ) => (
-        $crate::event!(name: $name, parent: $parent, $crate::Level::INFO, {}, $($arg)+)
-    );
-
-    // Name.
-    (name: $name:expr, { $($field:tt)* }, $($arg:tt)* ) => (
-        $crate::event!(name: $name, $crate::Level::INFO, { $($field)* }, $($arg)*)
-    );
-    (name: $name:expr, $($k:ident).+ $($field:tt)* ) => (
-        $crate::event!(name: $name, $crate::Level::INFO, { $($k).+ $($field)* })
-    );
-    (name: $name:expr, ?$($k:ident).+ $($field:tt)* ) => (
-        $crate::event!(name: $name, $crate::Level::INFO, { ?$($k).+ $($field)* })
-    );
-    (name: $name:expr, %$($k:ident).+ $($field:tt)* ) => (
-        $crate::event!(name: $name, $crate::Level::INFO, { %$($k).+ $($field)* })
-    );
-    (name: $name:expr, $($arg:tt)+ ) => (
-        $crate::event!(name: $name, $crate::Level::INFO, {}, $($arg)+)
-    );
-
-    // Target.
-    (target: $target:expr, { $($field:tt)* }, $($arg:tt)* ) => (
-        $crate::event!(target: $target, $crate::Level::INFO, { $($field)* }, $($arg)*)
-    );
-    (target: $target:expr, $($k:ident).+ $($field:tt)* ) => (
-        $crate::event!(target: $target, $crate::Level::INFO, { $($k).+ $($field)* })
-    );
-    (target: $target:expr, ?$($k:ident).+ $($field:tt)* ) => (
-        $crate::event!(target: $target, $crate::Level::INFO, { ?$($k).+ $($field)* })
-    );
-    (target: $target:expr, %$($k:ident).+ $($field:tt)* ) => (
-        $crate::event!(target: $target, $crate::Level::INFO, { %$($k).+ $($field)* })
-    );
-    (target: $target:expr, $($arg:tt)+ ) => (
-        $crate::event!(target: $target, $crate::Level::INFO, {}, $($arg)+)
-    );
-
-    // Parent.
     (parent: $parent:expr, { $($field:tt)+ }, $($arg:tt)+ ) => (
         $crate::event!(
             target: module_path!(),
@@ -2035,8 +1565,21 @@
             $($arg)+
         )
     );
-
-    // ...
+    (target: $target:expr, { $($field:tt)* }, $($arg:tt)* ) => (
+        $crate::event!(target: $target, $crate::Level::INFO, { $($field)* }, $($arg)*)
+    );
+    (target: $target:expr, $($k:ident).+ $($field:tt)* ) => (
+        $crate::event!(target: $target, $crate::Level::INFO, { $($k).+ $($field)* })
+    );
+    (target: $target:expr, ?$($k:ident).+ $($field:tt)* ) => (
+        $crate::event!(target: $target, $crate::Level::INFO, { ?$($k).+ $($field)* })
+    );
+    (target: $target:expr, %$($k:ident).+ $($field:tt)* ) => (
+        $crate::event!(target: $target, $crate::Level::INFO, { $($k).+ $($field)* })
+    );
+    (target: $target:expr, $($arg:tt)+ ) => (
+        $crate::event!(target: $target, $crate::Level::INFO, {}, $($arg)+)
+    );
     ({ $($field:tt)+ }, $($arg:tt)+ ) => (
         $crate::event!(
             target: module_path!(),
@@ -2142,47 +1685,11 @@
 ///     warning = warn_description,
 ///     "Received warning for input: {:?}", input,
 /// );
-/// warn!(name: "invalid", ?input);
 /// # }
 /// ```
 #[macro_export]
 macro_rules! warn {
-    // Name / target / parent.
-    (name: $name:expr, target: $target:expr, parent: $parent:expr, { $($field:tt)* }, $($arg:tt)* ) => (
-        $crate::event!(name: $name, target: $target, parent: $parent, $crate::Level::WARN, { $($field)* }, $($arg)*)
-    );
-    (name: $name:expr, target: $target:expr, parent: $parent:expr, $($k:ident).+ $($field:tt)+ ) => (
-        $crate::event!(name: $name, target: $target, parent: $parent, $crate::Level::WARN, { $($k).+ $($field)+ })
-    );
-    (name: $name:expr, target: $target:expr, parent: $parent:expr, ?$($k:ident).+ $($field:tt)+ ) => (
-        $crate::event!(name: $name, target: $target, parent: $parent, $crate::Level::WARN, { $($k).+ $($field)+ })
-    );
-    (name: $name:expr, target: $target:expr, parent: $parent:expr, %$($k:ident).+ $($field:tt)+ ) => (
-        $crate::event!(name: $name, target: $target, parent: $parent, $crate::Level::WARN, { $($k).+ $($field)+ })
-    );
-    (name: $name:expr, target: $target:expr, parent: $parent:expr, $($arg:tt)+ ) => (
-        $crate::event!(name: $name, target: $target, parent: $parent, $crate::Level::WARN, {}, $($arg)+)
-    );
-
-    // Name / target.
-    (name: $name:expr, target: $target:expr, { $($field:tt)* }, $($arg:tt)* ) => (
-        $crate::event!(name: $name, target: $target, $crate::Level::WARN, { $($field)* }, $($arg)*)
-    );
-    (name: $name:expr, target: $target:expr, $($k:ident).+ $($field:tt)+ ) => (
-        $crate::event!(name: $name, target: $target, $crate::Level::WARN, { $($k).+ $($field)+ })
-    );
-    (name: $name:expr, target: $target:expr, ?$($k:ident).+ $($field:tt)+ ) => (
-        $crate::event!(name: $name, target: $target, $crate::Level::WARN, { $($k).+ $($field)+ })
-    );
-    (name: $name:expr, target: $target:expr, %$($k:ident).+ $($field:tt)+ ) => (
-        $crate::event!(name: $name, target: $target, $crate::Level::WARN, { $($k).+ $($field)+ })
-    );
-    (name: $name:expr, target: $target:expr, $($arg:tt)+ ) => (
-        $crate::event!(name: $name, target: $target, $crate::Level::WARN, {}, $($arg)+)
-    );
-
-    // Target / parent.
-    (target: $target:expr, parent: $parent:expr, { $($field:tt)* }, $($arg:tt)* ) => (
+     (target: $target:expr, parent: $parent:expr, { $($field:tt)* }, $($arg:tt)* ) => (
         $crate::event!(target: $target, parent: $parent, $crate::Level::WARN, { $($field)* }, $($arg)*)
     );
     (target: $target:expr, parent: $parent:expr, $($k:ident).+ $($field:tt)+ ) => (
@@ -2197,59 +1704,6 @@
     (target: $target:expr, parent: $parent:expr, $($arg:tt)+ ) => (
         $crate::event!(target: $target, parent: $parent, $crate::Level::WARN, {}, $($arg)+)
     );
-
-    // Name / parent.
-    (name: $name:expr, parent: $parent:expr, { $($field:tt)* }, $($arg:tt)* ) => (
-        $crate::event!(name: $name, parent: $parent, $crate::Level::WARN, { $($field)* }, $($arg)*)
-    );
-    (name: $name:expr, parent: $parent:expr, $($k:ident).+ $($field:tt)+ ) => (
-        $crate::event!(name: $name, parent: $parent, $crate::Level::WARN, { $($k).+ $($field)+ })
-    );
-    (name: $name:expr, parent: $parent:expr, ?$($k:ident).+ $($field:tt)+ ) => (
-        $crate::event!(name: $name, parent: $parent, $crate::Level::WARN, { $($k).+ $($field)+ })
-    );
-    (name: $name:expr, parent: $parent:expr, %$($k:ident).+ $($field:tt)+ ) => (
-        $crate::event!(name: $name, parent: $parent, $crate::Level::WARN, { $($k).+ $($field)+ })
-    );
-    (name: $name:expr, parent: $parent:expr, $($arg:tt)+ ) => (
-        $crate::event!(name: $name, parent: $parent, $crate::Level::WARN, {}, $($arg)+)
-    );
-
-    // Name.
-    (name: $name:expr, { $($field:tt)* }, $($arg:tt)* ) => (
-        $crate::event!(name: $name, $crate::Level::WARN, { $($field)* }, $($arg)*)
-    );
-    (name: $name:expr, $($k:ident).+ $($field:tt)* ) => (
-        $crate::event!(name: $name, $crate::Level::WARN, { $($k).+ $($field)* })
-    );
-    (name: $name:expr, ?$($k:ident).+ $($field:tt)* ) => (
-        $crate::event!(name: $name, $crate::Level::WARN, { ?$($k).+ $($field)* })
-    );
-    (name: $name:expr, %$($k:ident).+ $($field:tt)* ) => (
-        $crate::event!(name: $name, $crate::Level::WARN, { %$($k).+ $($field)* })
-    );
-    (name: $name:expr, $($arg:tt)+ ) => (
-        $crate::event!(name: $name, $crate::Level::WARN, {}, $($arg)+)
-    );
-
-    // Target.
-    (target: $target:expr, { $($field:tt)* }, $($arg:tt)* ) => (
-        $crate::event!(target: $target, $crate::Level::WARN, { $($field)* }, $($arg)*)
-    );
-    (target: $target:expr, $($k:ident).+ $($field:tt)* ) => (
-        $crate::event!(target: $target, $crate::Level::WARN, { $($k).+ $($field)* })
-    );
-    (target: $target:expr, ?$($k:ident).+ $($field:tt)* ) => (
-        $crate::event!(target: $target, $crate::Level::WARN, { ?$($k).+ $($field)* })
-    );
-    (target: $target:expr, %$($k:ident).+ $($field:tt)* ) => (
-        $crate::event!(target: $target, $crate::Level::WARN, { %$($k).+ $($field)* })
-    );
-    (target: $target:expr, $($arg:tt)+ ) => (
-        $crate::event!(target: $target, $crate::Level::WARN, {}, $($arg)+)
-    );
-
-    // Parent.
     (parent: $parent:expr, { $($field:tt)+ }, $($arg:tt)+ ) => (
         $crate::event!(
             target: module_path!(),
@@ -2316,8 +1770,21 @@
             $($arg)+
         )
     );
-
-    // ...
+    (target: $target:expr, { $($field:tt)* }, $($arg:tt)* ) => (
+        $crate::event!(target: $target, $crate::Level::WARN, { $($field)* }, $($arg)*)
+    );
+    (target: $target:expr, $($k:ident).+ $($field:tt)* ) => (
+        $crate::event!(target: $target, $crate::Level::WARN, { $($k).+ $($field)* })
+    );
+    (target: $target:expr, ?$($k:ident).+ $($field:tt)* ) => (
+        $crate::event!(target: $target, $crate::Level::WARN, { ?$($k).+ $($field)* })
+    );
+    (target: $target:expr, %$($k:ident).+ $($field:tt)* ) => (
+        $crate::event!(target: $target, $crate::Level::WARN, { %$($k).+ $($field)* })
+    );
+    (target: $target:expr, $($arg:tt)+ ) => (
+        $crate::event!(target: $target, $crate::Level::WARN, {}, $($arg)+)
+    );
     ({ $($field:tt)+ }, $($arg:tt)+ ) => (
         $crate::event!(
             target: module_path!(),
@@ -2419,47 +1886,11 @@
 /// error!(port, error = %err_info);
 /// error!(target: "app_events", "App Error: {}", err_info);
 /// error!({ info = err_info }, "error on port: {}", port);
-/// error!(name: "invalid_input", "Invalid input: {}", err_info);
 /// # }
 /// ```
 #[macro_export]
 macro_rules! error {
-    // Name / target / parent.
-    (name: $name:expr, target: $target:expr, parent: $parent:expr, { $($field:tt)* }, $($arg:tt)* ) => (
-        $crate::event!(name: $name, target: $target, parent: $parent, $crate::Level::ERROR, { $($field)* }, $($arg)*)
-    );
-    (name: $name:expr, target: $target:expr, parent: $parent:expr, $($k:ident).+ $($field:tt)+ ) => (
-        $crate::event!(name: $name, target: $target, parent: $parent, $crate::Level::ERROR, { $($k).+ $($field)+ })
-    );
-    (name: $name:expr, target: $target:expr, parent: $parent:expr, ?$($k:ident).+ $($field:tt)+ ) => (
-        $crate::event!(name: $name, target: $target, parent: $parent, $crate::Level::ERROR, { $($k).+ $($field)+ })
-    );
-    (name: $name:expr, target: $target:expr, parent: $parent:expr, %$($k:ident).+ $($field:tt)+ ) => (
-        $crate::event!(name: $name, target: $target, parent: $parent, $crate::Level::ERROR, { $($k).+ $($field)+ })
-    );
-    (name: $name:expr, target: $target:expr, parent: $parent:expr, $($arg:tt)+ ) => (
-        $crate::event!(name: $name, target: $target, parent: $parent, $crate::Level::ERROR, {}, $($arg)+)
-    );
-
-    // Name / target.
-    (name: $name:expr, target: $target:expr, { $($field:tt)* }, $($arg:tt)* ) => (
-        $crate::event!(name: $name, target: $target, $crate::Level::ERROR, { $($field)* }, $($arg)*)
-    );
-    (name: $name:expr, target: $target:expr, $($k:ident).+ $($field:tt)+ ) => (
-        $crate::event!(name: $name, target: $target, $crate::Level::ERROR, { $($k).+ $($field)+ })
-    );
-    (name: $name:expr, target: $target:expr, ?$($k:ident).+ $($field:tt)+ ) => (
-        $crate::event!(name: $name, target: $target, $crate::Level::ERROR, { $($k).+ $($field)+ })
-    );
-    (name: $name:expr, target: $target:expr, %$($k:ident).+ $($field:tt)+ ) => (
-        $crate::event!(name: $name, target: $target, $crate::Level::ERROR, { $($k).+ $($field)+ })
-    );
-    (name: $name:expr, target: $target:expr, $($arg:tt)+ ) => (
-        $crate::event!(name: $name, target: $target, $crate::Level::ERROR, {}, $($arg)+)
-    );
-
-    // Target / parent.
-    (target: $target:expr, parent: $parent:expr, { $($field:tt)* }, $($arg:tt)* ) => (
+     (target: $target:expr, parent: $parent:expr, { $($field:tt)* }, $($arg:tt)* ) => (
         $crate::event!(target: $target, parent: $parent, $crate::Level::ERROR, { $($field)* }, $($arg)*)
     );
     (target: $target:expr, parent: $parent:expr, $($k:ident).+ $($field:tt)+ ) => (
@@ -2474,59 +1905,6 @@
     (target: $target:expr, parent: $parent:expr, $($arg:tt)+ ) => (
         $crate::event!(target: $target, parent: $parent, $crate::Level::ERROR, {}, $($arg)+)
     );
-
-    // Name / parent.
-    (name: $name:expr, parent: $parent:expr, { $($field:tt)* }, $($arg:tt)* ) => (
-        $crate::event!(name: $name, parent: $parent, $crate::Level::ERROR, { $($field)* }, $($arg)*)
-    );
-    (name: $name:expr, parent: $parent:expr, $($k:ident).+ $($field:tt)+ ) => (
-        $crate::event!(name: $name, parent: $parent, $crate::Level::ERROR, { $($k).+ $($field)+ })
-    );
-    (name: $name:expr, parent: $parent:expr, ?$($k:ident).+ $($field:tt)+ ) => (
-        $crate::event!(name: $name, parent: $parent, $crate::Level::ERROR, { $($k).+ $($field)+ })
-    );
-    (name: $name:expr, parent: $parent:expr, %$($k:ident).+ $($field:tt)+ ) => (
-        $crate::event!(name: $name, parent: $parent, $crate::Level::ERROR, { $($k).+ $($field)+ })
-    );
-    (name: $name:expr, parent: $parent:expr, $($arg:tt)+ ) => (
-        $crate::event!(name: $name, parent: $parent, $crate::Level::ERROR, {}, $($arg)+)
-    );
-
-    // Name.
-    (name: $name:expr, { $($field:tt)* }, $($arg:tt)* ) => (
-        $crate::event!(name: $name, $crate::Level::ERROR, { $($field)* }, $($arg)*)
-    );
-    (name: $name:expr, $($k:ident).+ $($field:tt)* ) => (
-        $crate::event!(name: $name, $crate::Level::ERROR, { $($k).+ $($field)* })
-    );
-    (name: $name:expr, ?$($k:ident).+ $($field:tt)* ) => (
-        $crate::event!(name: $name, $crate::Level::ERROR, { ?$($k).+ $($field)* })
-    );
-    (name: $name:expr, %$($k:ident).+ $($field:tt)* ) => (
-        $crate::event!(name: $name, $crate::Level::ERROR, { %$($k).+ $($field)* })
-    );
-    (name: $name:expr, $($arg:tt)+ ) => (
-        $crate::event!(name: $name, $crate::Level::ERROR, {}, $($arg)+)
-    );
-
-    // Target.
-    (target: $target:expr, { $($field:tt)* }, $($arg:tt)* ) => (
-        $crate::event!(target: $target, $crate::Level::ERROR, { $($field)* }, $($arg)*)
-    );
-    (target: $target:expr, $($k:ident).+ $($field:tt)* ) => (
-        $crate::event!(target: $target, $crate::Level::ERROR, { $($k).+ $($field)* })
-    );
-    (target: $target:expr, ?$($k:ident).+ $($field:tt)* ) => (
-        $crate::event!(target: $target, $crate::Level::ERROR, { ?$($k).+ $($field)* })
-    );
-    (target: $target:expr, %$($k:ident).+ $($field:tt)* ) => (
-        $crate::event!(target: $target, $crate::Level::ERROR, { %$($k).+ $($field)* })
-    );
-    (target: $target:expr, $($arg:tt)+ ) => (
-        $crate::event!(target: $target, $crate::Level::ERROR, {}, $($arg)+)
-    );
-
-    // Parent.
     (parent: $parent:expr, { $($field:tt)+ }, $($arg:tt)+ ) => (
         $crate::event!(
             target: module_path!(),
@@ -2593,8 +1971,21 @@
             $($arg)+
         )
     );
-
-    // ...
+    (target: $target:expr, { $($field:tt)* }, $($arg:tt)* ) => (
+        $crate::event!(target: $target, $crate::Level::ERROR, { $($field)* }, $($arg)*)
+    );
+    (target: $target:expr, $($k:ident).+ $($field:tt)* ) => (
+        $crate::event!(target: $target, $crate::Level::ERROR, { $($k).+ $($field)* })
+    );
+    (target: $target:expr, ?$($k:ident).+ $($field:tt)* ) => (
+        $crate::event!(target: $target, $crate::Level::ERROR, { ?$($k).+ $($field)* })
+    );
+    (target: $target:expr, %$($k:ident).+ $($field:tt)* ) => (
+        $crate::event!(target: $target, $crate::Level::ERROR, { %$($k).+ $($field)* })
+    );
+    (target: $target:expr, $($arg:tt)+ ) => (
+        $crate::event!(target: $target, $crate::Level::ERROR, {}, $($arg)+)
+    );
     ({ $($field:tt)+ }, $($arg:tt)+ ) => (
         $crate::event!(
             target: module_path!(),
@@ -2716,13 +2107,13 @@
                 target: $target,
                 level: $lvl,
                 fields: $crate::fieldset!( $($fields)* ),
-                callsite: &__CALLSITE,
+                callsite: &CALLSITE,
                 kind: $kind,
             }
         };
-        static __CALLSITE: $crate::callsite::DefaultCallsite = $crate::callsite::DefaultCallsite::new(&META);
-        __CALLSITE.register();
-        &__CALLSITE
+        static CALLSITE: $crate::callsite::DefaultCallsite = $crate::callsite::DefaultCallsite::new(&META);
+        CALLSITE.register();
+        &CALLSITE
     }};
 }
 
@@ -2766,7 +2157,7 @@
                 target: $target,
                 level: $lvl,
                 fields: $crate::fieldset!( $($fields)* ),
-                callsite: &__CALLSITE,
+                callsite: &CALLSITE,
                 kind: $kind,
             }
         };
@@ -2802,79 +2193,79 @@
     // };
     (@ { $(,)* $($out:expr),* }, $next:expr, $($k:ident).+ = ?$val:expr, $($rest:tt)*) => {
         $crate::valueset!(
-            @ { $($out),*, (&$next, ::core::option::Option::Some(&debug(&$val) as &dyn Value)) },
+            @ { $($out),*, (&$next, Some(&debug(&$val) as &dyn Value)) },
             $next,
             $($rest)*
         )
     };
     (@ { $(,)* $($out:expr),* }, $next:expr, $($k:ident).+ = %$val:expr, $($rest:tt)*) => {
         $crate::valueset!(
-            @ { $($out),*, (&$next, ::core::option::Option::Some(&display(&$val) as &dyn Value)) },
+            @ { $($out),*, (&$next, Some(&display(&$val) as &dyn Value)) },
             $next,
             $($rest)*
         )
     };
     (@ { $(,)* $($out:expr),* }, $next:expr, $($k:ident).+ = $val:expr, $($rest:tt)*) => {
         $crate::valueset!(
-            @ { $($out),*, (&$next, ::core::option::Option::Some(&$val as &dyn Value)) },
+            @ { $($out),*, (&$next, Some(&$val as &dyn Value)) },
             $next,
             $($rest)*
         )
     };
     (@ { $(,)* $($out:expr),* }, $next:expr, $($k:ident).+, $($rest:tt)*) => {
         $crate::valueset!(
-            @ { $($out),*, (&$next, ::core::option::Option::Some(&$($k).+ as &dyn Value)) },
+            @ { $($out),*, (&$next, Some(&$($k).+ as &dyn Value)) },
             $next,
             $($rest)*
         )
     };
     (@ { $(,)* $($out:expr),* }, $next:expr, ?$($k:ident).+, $($rest:tt)*) => {
         $crate::valueset!(
-            @ { $($out),*, (&$next, ::core::option::Option::Some(&debug(&$($k).+) as &dyn Value)) },
+            @ { $($out),*, (&$next, Some(&debug(&$($k).+) as &dyn Value)) },
             $next,
             $($rest)*
         )
     };
     (@ { $(,)* $($out:expr),* }, $next:expr, %$($k:ident).+, $($rest:tt)*) => {
         $crate::valueset!(
-            @ { $($out),*, (&$next, ::core::option::Option::Some(&display(&$($k).+) as &dyn Value)) },
+            @ { $($out),*, (&$next, Some(&display(&$($k).+) as &dyn Value)) },
             $next,
             $($rest)*
         )
     };
     (@ { $(,)* $($out:expr),* }, $next:expr, $($k:ident).+ = ?$val:expr) => {
         $crate::valueset!(
-            @ { $($out),*, (&$next, ::core::option::Option::Some(&debug(&$val) as &dyn Value)) },
+            @ { $($out),*, (&$next, Some(&debug(&$val) as &dyn Value)) },
             $next,
         )
     };
     (@ { $(,)* $($out:expr),* }, $next:expr, $($k:ident).+ = %$val:expr) => {
         $crate::valueset!(
-            @ { $($out),*, (&$next, ::core::option::Option::Some(&display(&$val) as &dyn Value)) },
+            @ { $($out),*, (&$next, Some(&display(&$val) as &dyn Value)) },
             $next,
         )
     };
     (@ { $(,)* $($out:expr),* }, $next:expr, $($k:ident).+ = $val:expr) => {
         $crate::valueset!(
-            @ { $($out),*, (&$next, ::core::option::Option::Some(&$val as &dyn Value)) },
+            @ { $($out),*, (&$next, Some(&$val as &dyn Value)) },
             $next,
         )
     };
     (@ { $(,)* $($out:expr),* }, $next:expr, $($k:ident).+) => {
         $crate::valueset!(
-            @ { $($out),*, (&$next, ::core::option::Option::Some(&$($k).+ as &dyn Value)) },
+            @ { $($out),*, (&$next, Some(&$($k).+ as &dyn Value)) },
             $next,
         )
     };
     (@ { $(,)* $($out:expr),* }, $next:expr, ?$($k:ident).+) => {
         $crate::valueset!(
-            @ { $($out),*, (&$next, ::core::option::Option::Some(&debug(&$($k).+) as &dyn Value)) },
+            @ { $($out),*, (&$next, Some(&debug(&$($k).+) as &dyn Value)) },
             $next,
         )
     };
     (@ { $(,)* $($out:expr),* }, $next:expr, %$($k:ident).+) => {
         $crate::valueset!(
-            @ { $($out),*, (&$next, ::core::option::Option::Some(&display(&$($k).+) as &dyn Value)) },
+            @ { $($out),*, (&$next, Some(&display(&$($k).+) as &dyn Value)) },
             $next,
         )
     };
@@ -2882,88 +2273,47 @@
     // Handle literal names
     (@ { $(,)* $($out:expr),* }, $next:expr, $k:literal = ?$val:expr, $($rest:tt)*) => {
         $crate::valueset!(
-            @ { $($out),*, (&$next, ::core::option::Option::Some(&debug(&$val) as &dyn Value)) },
-            $next,
-            $($rest)*
-        )
-    };
-    (@ { $(,)* $($out:expr),* }, $next:expr, $k:literal = %$val:expr, $($rest:tt)*) => {
-        $crate::valueset!(
-            @ { $($out),*, (&$next, ::core::option::Option::Some(&display(&$val) as &dyn Value)) },
-            $next,
-            $($rest)*
-        )
-    };
-    (@ { $(,)* $($out:expr),* }, $next:expr, $k:literal = $val:expr, $($rest:tt)*) => {
-        $crate::valueset!(
-            @ { $($out),*, (&$next, ::core::option::Option::Some(&$val as &dyn Value)) },
-            $next,
-            $($rest)*
-        )
-    };
-    (@ { $(,)* $($out:expr),* }, $next:expr, $k:literal = ?$val:expr) => {
-        $crate::valueset!(
-            @ { $($out),*, (&$next, ::core::option::Option::Some(&debug(&$val) as &dyn Value)) },
-            $next,
-        )
-    };
-    (@ { $(,)* $($out:expr),* }, $next:expr, $k:literal = %$val:expr) => {
-        $crate::valueset!(
-            @ { $($out),*, (&$next, ::core::option::Option::Some(&display(&$val) as &dyn Value)) },
-            $next,
-        )
-    };
-    (@ { $(,)* $($out:expr),* }, $next:expr, $k:literal = $val:expr) => {
-        $crate::valueset!(
-            @ { $($out),*, (&$next, ::core::option::Option::Some(&$val as &dyn Value)) },
-            $next,
-        )
-    };
-
-    // Handle constant names
-    (@ { $(,)* $($out:expr),* }, $next:expr, { $k:expr } = ?$val:expr, $($rest:tt)*) => {
-        $crate::valueset!(
             @ { $($out),*, (&$next, Some(&debug(&$val) as &dyn Value)) },
             $next,
             $($rest)*
         )
     };
-    (@ { $(,)* $($out:expr),* }, $next:expr, { $k:expr } = %$val:expr, $($rest:tt)*) => {
+    (@ { $(,)* $($out:expr),* }, $next:expr, $k:literal = %$val:expr, $($rest:tt)*) => {
         $crate::valueset!(
             @ { $($out),*, (&$next, Some(&display(&$val) as &dyn Value)) },
             $next,
             $($rest)*
         )
     };
-    (@ { $(,)* $($out:expr),* }, $next:expr, { $k:expr } = $val:expr, $($rest:tt)*) => {
+    (@ { $(,)* $($out:expr),* }, $next:expr, $k:literal = $val:expr, $($rest:tt)*) => {
         $crate::valueset!(
             @ { $($out),*, (&$next, Some(&$val as &dyn Value)) },
             $next,
             $($rest)*
         )
     };
-    (@ { $(,)* $($out:expr),* }, $next:expr, { $k:expr } = ?$val:expr) => {
+    (@ { $(,)* $($out:expr),* }, $next:expr, $k:literal = ?$val:expr) => {
         $crate::valueset!(
             @ { $($out),*, (&$next, Some(&debug(&$val) as &dyn Value)) },
             $next,
         )
     };
-    (@ { $(,)* $($out:expr),* }, $next:expr, { $k:expr } = %$val:expr) => {
+    (@ { $(,)* $($out:expr),* }, $next:expr, $k:literal = %$val:expr) => {
         $crate::valueset!(
             @ { $($out),*, (&$next, Some(&display(&$val) as &dyn Value)) },
             $next,
         )
     };
-    (@ { $(,)* $($out:expr),* }, $next:expr, { $k:expr } = $val:expr) => {
+    (@ { $(,)* $($out:expr),* }, $next:expr, $k:literal = $val:expr) => {
         $crate::valueset!(
             @ { $($out),*, (&$next, Some(&$val as &dyn Value)) },
             $next,
         )
     };
 
-    // Remainder is unparsable, but exists --- must be format args!
+    // Remainder is unparseable, but exists --- must be format args!
     (@ { $(,)* $($out:expr),* }, $next:expr, $($rest:tt)+) => {
-        $crate::valueset!(@ { (&$next, ::core::option::Option::Some(&::core::format_args!($($rest)+) as &dyn Value)), $($out),* }, $next, )
+        $crate::valueset!(@ { (&$next, Some(&format_args!($($rest)+) as &dyn Value)), $($out),* }, $next, )
     };
 
     // === entry ===
@@ -2974,7 +2324,7 @@
             let mut iter = $fields.iter();
             $fields.value_set($crate::valueset!(
                 @ { },
-                ::core::iter::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
+                iter.next().expect("FieldSet corrupted (this is a bug)"),
                 $($kvs)+
             ))
         }
@@ -3030,17 +2380,6 @@
         $crate::fieldset!(@ { $($out),*, $k } $($rest)*)
     };
 
-    // Handle constant names
-    (@ { $(,)* $($out:expr),* } { $k:expr } = ?$val:expr, $($rest:tt)*) => {
-        $crate::fieldset!(@ { $($out),*, $k } $($rest)*)
-    };
-    (@ { $(,)* $($out:expr),* } { $k:expr } = %$val:expr, $($rest:tt)*) => {
-        $crate::fieldset!(@ { $($out),*, $k } $($rest)*)
-    };
-    (@ { $(,)* $($out:expr),* } { $k:expr } = $val:expr, $($rest:tt)*) => {
-        $crate::fieldset!(@ { $($out),*, $k } $($rest)*)
-    };
-
     // Remainder is unparseable, but exists --- must be format args!
     (@ { $(,)* $($out:expr),* } $($rest:tt)+) => {
         $crate::fieldset!(@ { "message", $($out),*, })
diff -Nru temporalio-1.3.0/vendor/tracing/src/span.rs temporalio-1.3.0/vendor/tracing/src/span.rs
--- temporalio-1.3.0/vendor/tracing/src/span.rs	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/tracing/src/span.rs	2023-10-30 19:40:00.000000000 +0000
@@ -22,7 +22,7 @@
 //!   override their default values.
 //! - The span's [verbosity level]
 //! - A string literal providing the span's name.
-//! - Finally, zero or more arbitrary key/value fields.
+//! - Finally, between zero and 32 arbitrary key/value fields.
 //!
 //! [`target`]: super::Metadata::target
 //!
@@ -824,7 +824,7 @@
     ///
     /// 
     ///     Note: The returned 
-    ///     EnteredSpan guard does not implement Send.
+    ///     EnteredSpan guard does not implement Send.
     ///     Dropping the guard will exit this span, and if the guard is sent
     ///     to another thread and dropped there, that thread may never have entered
     ///     this span. Thus, EnteredSpans should not be sent between threads.
@@ -1617,7 +1617,7 @@
 
     #[test]
     fn test_record_backwards_compat() {
-        Span::current().record("some-key", "some text");
-        Span::current().record("some-key", false);
+        Span::current().record("some-key", &"some text");
+        Span::current().record("some-key", &false);
     }
 }
diff -Nru temporalio-1.3.0/vendor/tracing/tests/enabled.rs temporalio-1.3.0/vendor/tracing/tests/enabled.rs
--- temporalio-1.3.0/vendor/tracing/tests/enabled.rs	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/tracing/tests/enabled.rs	2023-10-30 19:40:00.000000000 +0000
@@ -13,7 +13,7 @@
                 meta.level() <= &Level::INFO
             }
         })
-        .only()
+        .done()
         .run();
 
     let _guard = tracing::subscriber::set_default(subscriber);
@@ -38,7 +38,7 @@
                 meta.level() <= &Level::INFO
             }
         })
-        .only()
+        .done()
         .run();
 
     let _guard = tracing::subscriber::set_default(subscriber);
diff -Nru temporalio-1.3.0/vendor/tracing/tests/event.rs temporalio-1.3.0/vendor/tracing/tests/event.rs
--- temporalio-1.3.0/vendor/tracing/tests/event.rs	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/tracing/tests/event.rs	2023-10-30 19:40:00.000000000 +0000
@@ -22,17 +22,17 @@
         fn $name() {
             let (subscriber, handle) = subscriber::mock()
                 .event(
-                    expect::event().with_fields(
-                        expect::field("answer")
+                    event::mock().with_fields(
+                        field::mock("answer")
                             .with_value(&42)
                             .and(
-                                expect::field("to_question")
+                                field::mock("to_question")
                                     .with_value(&"life, the universe, and everything"),
                             )
                             .only(),
                     ),
                 )
-                .only()
+                .done()
                 .run_with_handle();
 
             with_default(subscriber, || {
@@ -57,19 +57,15 @@
 #[test]
 fn event_with_message() {
     let (subscriber, handle) = subscriber::mock()
-        .event(
-            expect::event().with_fields(expect::field("message").with_value(
-                &tracing::field::debug(format_args!(
-                    "hello from my tracing::event! yak shaved = {:?}",
-                    true
-                )),
-            )),
-        )
-        .only()
+        .event(event::msg(format_args!(
+            "hello from my event! yak shaved = {:?}",
+            true
+        )))
+        .done()
         .run_with_handle();
 
     with_default(subscriber, || {
-        debug!("hello from my tracing::event! yak shaved = {:?}", true);
+        debug!("hello from my event! yak shaved = {:?}", true);
     });
 
     handle.assert_finished();
@@ -80,12 +76,10 @@
 fn message_without_delims() {
     let (subscriber, handle) = subscriber::mock()
         .event(
-            expect::event().with_fields(
-                expect::field("answer")
+            event::mock().with_fields(
+                field::mock("answer")
                     .with_value(&42)
-                    .and(
-                        expect::field("question").with_value(&"life, the universe, and everything"),
-                    )
+                    .and(field::mock("question").with_value(&"life, the universe, and everything"))
                     .and(field::msg(format_args!(
                         "hello from my event! tricky? {:?}!",
                         true
@@ -93,7 +87,7 @@
                     .only(),
             ),
         )
-        .only()
+        .done()
         .run_with_handle();
 
     with_default(subscriber, || {
@@ -109,17 +103,15 @@
 fn string_message_without_delims() {
     let (subscriber, handle) = subscriber::mock()
         .event(
-            expect::event().with_fields(
-                expect::field("answer")
+            event::mock().with_fields(
+                field::mock("answer")
                     .with_value(&42)
-                    .and(
-                        expect::field("question").with_value(&"life, the universe, and everything"),
-                    )
+                    .and(field::mock("question").with_value(&"life, the universe, and everything"))
                     .and(field::msg(format_args!("hello from my event")))
                     .only(),
             ),
         )
-        .only()
+        .done()
         .run_with_handle();
 
     with_default(subscriber, || {
@@ -135,23 +127,23 @@
 fn one_with_everything() {
     let (subscriber, handle) = subscriber::mock()
         .event(
-            expect::event()
+            event::mock()
                 .with_fields(
-                    expect::field("message")
+                    field::mock("message")
                         .with_value(&tracing::field::debug(format_args!(
                             "{:#x} make me one with{what:.>20}",
                             4_277_009_102u64,
                             what = "everything"
                         )))
-                        .and(expect::field("foo").with_value(&666))
-                        .and(expect::field("bar").with_value(&false))
-                        .and(expect::field("like_a_butterfly").with_value(&42.0))
+                        .and(field::mock("foo").with_value(&666))
+                        .and(field::mock("bar").with_value(&false))
+                        .and(field::mock("like_a_butterfly").with_value(&42.0))
                         .only(),
                 )
                 .at_level(Level::ERROR)
                 .with_target("whatever"),
         )
-        .only()
+        .done()
         .run_with_handle();
 
     with_default(subscriber, || {
@@ -171,13 +163,13 @@
 fn moved_field() {
     let (subscriber, handle) = subscriber::mock()
         .event(
-            expect::event().with_fields(
-                expect::field("foo")
+            event::mock().with_fields(
+                field::mock("foo")
                     .with_value(&display("hello from my event"))
                     .only(),
             ),
         )
-        .only()
+        .done()
         .run_with_handle();
     with_default(subscriber, || {
         let from = "my event";
@@ -192,14 +184,14 @@
 fn dotted_field_name() {
     let (subscriber, handle) = subscriber::mock()
         .event(
-            expect::event().with_fields(
-                expect::field("foo.bar")
+            event::mock().with_fields(
+                field::mock("foo.bar")
                     .with_value(&true)
-                    .and(expect::field("foo.baz").with_value(&false))
+                    .and(field::mock("foo.baz").with_value(&false))
                     .only(),
             ),
         )
-        .only()
+        .done()
         .run_with_handle();
     with_default(subscriber, || {
         tracing::event!(Level::INFO, foo.bar = true, foo.baz = false);
@@ -213,13 +205,13 @@
 fn borrowed_field() {
     let (subscriber, handle) = subscriber::mock()
         .event(
-            expect::event().with_fields(
-                expect::field("foo")
+            event::mock().with_fields(
+                field::mock("foo")
                     .with_value(&display("hello from my event"))
                     .only(),
             ),
         )
-        .only()
+        .done()
         .run_with_handle();
     with_default(subscriber, || {
         let from = "my event";
@@ -250,15 +242,15 @@
     };
     let (subscriber, handle) = subscriber::mock()
         .event(
-            expect::event().with_fields(
-                expect::field("x")
+            event::mock().with_fields(
+                field::mock("x")
                     .with_value(&debug(3.234))
-                    .and(expect::field("y").with_value(&debug(-1.223)))
+                    .and(field::mock("y").with_value(&debug(-1.223)))
                     .only(),
             ),
         )
-        .event(expect::event().with_fields(expect::field("position").with_value(&debug(&pos))))
-        .only()
+        .event(event::mock().with_fields(field::mock("position").with_value(&debug(&pos))))
+        .done()
         .run_with_handle();
 
     with_default(subscriber, || {
@@ -277,13 +269,13 @@
 fn display_shorthand() {
     let (subscriber, handle) = subscriber::mock()
         .event(
-            expect::event().with_fields(
-                expect::field("my_field")
+            event::mock().with_fields(
+                field::mock("my_field")
                     .with_value(&display("hello world"))
                     .only(),
             ),
         )
-        .only()
+        .done()
         .run_with_handle();
     with_default(subscriber, || {
         tracing::event!(Level::TRACE, my_field = %"hello world");
@@ -297,13 +289,13 @@
 fn debug_shorthand() {
     let (subscriber, handle) = subscriber::mock()
         .event(
-            expect::event().with_fields(
-                expect::field("my_field")
+            event::mock().with_fields(
+                field::mock("my_field")
                     .with_value(&debug("hello world"))
                     .only(),
             ),
         )
-        .only()
+        .done()
         .run_with_handle();
     with_default(subscriber, || {
         tracing::event!(Level::TRACE, my_field = ?"hello world");
@@ -317,14 +309,14 @@
 fn both_shorthands() {
     let (subscriber, handle) = subscriber::mock()
         .event(
-            expect::event().with_fields(
-                expect::field("display_field")
+            event::mock().with_fields(
+                field::mock("display_field")
                     .with_value(&display("hello world"))
-                    .and(expect::field("debug_field").with_value(&debug("hello world")))
+                    .and(field::mock("debug_field").with_value(&debug("hello world")))
                     .only(),
             ),
         )
-        .only()
+        .done()
         .run_with_handle();
     with_default(subscriber, || {
         tracing::event!(Level::TRACE, display_field = %"hello world", debug_field = ?"hello world");
@@ -337,9 +329,9 @@
 #[test]
 fn explicit_child() {
     let (subscriber, handle) = subscriber::mock()
-        .new_span(expect::span().named("foo"))
-        .event(expect::event().with_explicit_parent(Some("foo")))
-        .only()
+        .new_span(span::mock().named("foo"))
+        .event(event::mock().with_explicit_parent(Some("foo")))
+        .done()
         .run_with_handle();
 
     with_default(subscriber, || {
@@ -354,13 +346,13 @@
 #[test]
 fn explicit_child_at_levels() {
     let (subscriber, handle) = subscriber::mock()
-        .new_span(expect::span().named("foo"))
-        .event(expect::event().with_explicit_parent(Some("foo")))
-        .event(expect::event().with_explicit_parent(Some("foo")))
-        .event(expect::event().with_explicit_parent(Some("foo")))
-        .event(expect::event().with_explicit_parent(Some("foo")))
-        .event(expect::event().with_explicit_parent(Some("foo")))
-        .only()
+        .new_span(span::mock().named("foo"))
+        .event(event::mock().with_explicit_parent(Some("foo")))
+        .event(event::mock().with_explicit_parent(Some("foo")))
+        .event(event::mock().with_explicit_parent(Some("foo")))
+        .event(event::mock().with_explicit_parent(Some("foo")))
+        .event(event::mock().with_explicit_parent(Some("foo")))
+        .done()
         .run_with_handle();
 
     with_default(subscriber, || {
@@ -380,15 +372,15 @@
 fn option_values() {
     let (subscriber, handle) = subscriber::mock()
         .event(
-            expect::event().with_fields(
-                expect::field("some_str")
+            event::mock().with_fields(
+                field::mock("some_str")
                     .with_value(&"yes")
-                    .and(expect::field("some_bool").with_value(&true))
-                    .and(expect::field("some_u64").with_value(&42_u64))
+                    .and(field::mock("some_bool").with_value(&true))
+                    .and(field::mock("some_u64").with_value(&42_u64))
                     .only(),
             ),
         )
-        .only()
+        .done()
         .run_with_handle();
 
     with_default(subscriber, || {
@@ -416,15 +408,15 @@
 fn option_ref_values() {
     let (subscriber, handle) = subscriber::mock()
         .event(
-            expect::event().with_fields(
-                expect::field("some_str")
+            event::mock().with_fields(
+                field::mock("some_str")
                     .with_value(&"yes")
-                    .and(expect::field("some_bool").with_value(&true))
-                    .and(expect::field("some_u64").with_value(&42_u64))
+                    .and(field::mock("some_bool").with_value(&true))
+                    .and(field::mock("some_u64").with_value(&42_u64))
                     .only(),
             ),
         )
-        .only()
+        .done()
         .run_with_handle();
 
     with_default(subscriber, || {
@@ -452,15 +444,15 @@
 fn option_ref_mut_values() {
     let (subscriber, handle) = subscriber::mock()
         .event(
-            expect::event().with_fields(
-                expect::field("some_str")
+            event::mock().with_fields(
+                field::mock("some_str")
                     .with_value(&"yes")
-                    .and(expect::field("some_bool").with_value(&true))
-                    .and(expect::field("some_u64").with_value(&42_u64))
+                    .and(field::mock("some_bool").with_value(&true))
+                    .and(field::mock("some_u64").with_value(&42_u64))
                     .only(),
             ),
         )
-        .only()
+        .done()
         .run_with_handle();
 
     with_default(subscriber, || {
@@ -487,15 +479,11 @@
 #[test]
 fn string_field() {
     let (subscriber, handle) = subscriber::mock()
-        .event(expect::event().with_fields(expect::field("my_string").with_value(&"hello").only()))
+        .event(event::mock().with_fields(field::mock("my_string").with_value(&"hello").only()))
         .event(
-            expect::event().with_fields(
-                expect::field("my_string")
-                    .with_value(&"hello world!")
-                    .only(),
-            ),
+            event::mock().with_fields(field::mock("my_string").with_value(&"hello world!").only()),
         )
-        .only()
+        .done()
         .run_with_handle();
     with_default(subscriber, || {
         let mut my_string = String::from("hello");
@@ -509,46 +497,4 @@
     });
 
     handle.assert_finished();
-}
-
-#[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
-#[test]
-fn constant_field_name() {
-    let expect_event = || {
-        expect::event().with_fields(
-            expect::field("foo")
-                .with_value(&"bar")
-                .and(expect::field("constant string").with_value(&"also works"))
-                .and(expect::field("foo.bar").with_value(&"baz"))
-                .and(expect::field("message").with_value(&debug(format_args!("quux"))))
-                .only(),
-        )
-    };
-    let (subscriber, handle) = subscriber::mock()
-        .event(expect_event())
-        .event(expect_event())
-        .only()
-        .run_with_handle();
-
-    with_default(subscriber, || {
-        const FOO: &str = "foo";
-        tracing::event!(
-            Level::INFO,
-            { std::convert::identity(FOO) } = "bar",
-            { "constant string" } = "also works",
-            foo.bar = "baz",
-            "quux"
-        );
-        tracing::event!(
-            Level::INFO,
-            {
-                { std::convert::identity(FOO) } = "bar",
-                { "constant string" } = "also works",
-                foo.bar = "baz",
-            },
-            "quux"
-        );
-    });
-
-    handle.assert_finished();
 }
diff -Nru temporalio-1.3.0/vendor/tracing/tests/filters_dont_leak.rs temporalio-1.3.0/vendor/tracing/tests/filters_dont_leak.rs
--- temporalio-1.3.0/vendor/tracing/tests/filters_dont_leak.rs	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/tracing/tests/filters_dont_leak.rs	2023-10-30 19:40:00.000000000 +0000
@@ -13,14 +13,14 @@
     let (subscriber, handle) = subscriber::mock()
         .named("spans/subscriber1")
         .with_filter(|_| false)
-        .only()
+        .done()
         .run_with_handle();
 
     let _guard = tracing::subscriber::set_default(subscriber);
 
     do_span();
 
-    let alice = expect::span().named("alice");
+    let alice = span::mock().named("alice");
     let (subscriber2, handle2) = subscriber::mock()
         .named("spans/subscriber2")
         .with_filter(|_| true)
@@ -28,7 +28,7 @@
         .enter(alice.clone())
         .exit(alice.clone())
         .drop_span(alice)
-        .only()
+        .done()
         .run_with_handle();
 
     tracing::subscriber::with_default(subscriber2, || {
@@ -53,7 +53,7 @@
     let (subscriber, handle) = subscriber::mock()
         .named("events/subscriber1")
         .with_filter(|_| false)
-        .only()
+        .done()
         .run_with_handle();
 
     let _guard = tracing::subscriber::set_default(subscriber);
@@ -63,8 +63,8 @@
     let (subscriber2, handle2) = subscriber::mock()
         .named("events/subscriber2")
         .with_filter(|_| true)
-        .event(expect::event())
-        .only()
+        .event(event::mock())
+        .done()
         .run_with_handle();
 
     tracing::subscriber::with_default(subscriber2, || {
diff -Nru temporalio-1.3.0/vendor/tracing/tests/instrument.rs temporalio-1.3.0/vendor/tracing/tests/instrument.rs
--- temporalio-1.3.0/vendor/tracing/tests/instrument.rs	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/tracing/tests/instrument.rs	1970-01-01 00:00:00.000000000 +0000
@@ -1,59 +0,0 @@
-// These tests require the thread-local scoped dispatcher, which only works when
-// we have a standard library. The behaviour being tested should be the same
-// with the standard lib disabled.
-#![cfg(feature = "std")]
-
-use std::{future::Future, pin::Pin, task};
-
-use futures::FutureExt as _;
-use tracing::{subscriber::with_default, Instrument as _, Level};
-use tracing_mock::*;
-
-#[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
-#[test]
-fn span_on_drop() {
-    #[derive(Clone, Debug)]
-    struct AssertSpanOnDrop;
-
-    impl Drop for AssertSpanOnDrop {
-        fn drop(&mut self) {
-            tracing::info!("Drop");
-        }
-    }
-
-    struct Fut(Option);
-
-    impl Future for Fut {
-        type Output = ();
-
-        fn poll(mut self: Pin<&mut Self>, _: &mut task::Context<'_>) -> task::Poll {
-            self.set(Fut(None));
-            task::Poll::Ready(())
-        }
-    }
-
-    let subscriber = subscriber::mock()
-        .enter(expect::span().named("foo"))
-        .event(expect::event().at_level(Level::INFO))
-        .exit(expect::span().named("foo"))
-        .enter(expect::span().named("foo"))
-        .exit(expect::span().named("foo"))
-        .drop_span(expect::span().named("foo"))
-        .enter(expect::span().named("bar"))
-        .event(expect::event().at_level(Level::INFO))
-        .exit(expect::span().named("bar"))
-        .drop_span(expect::span().named("bar"))
-        .only()
-        .run();
-
-    with_default(subscriber, || {
-        // polled once
-        Fut(Some(AssertSpanOnDrop))
-            .instrument(tracing::span!(Level::TRACE, "foo"))
-            .now_or_never()
-            .unwrap();
-
-        // never polled
-        drop(Fut(Some(AssertSpanOnDrop)).instrument(tracing::span!(Level::TRACE, "bar")));
-    });
-}
diff -Nru temporalio-1.3.0/vendor/tracing/tests/macros_redefined_core.rs temporalio-1.3.0/vendor/tracing/tests/macros_redefined_core.rs
--- temporalio-1.3.0/vendor/tracing/tests/macros_redefined_core.rs	1970-01-01 00:00:00.000000000 +0000
+++ temporalio-1.3.0/vendor/tracing/tests/macros_redefined_core.rs	2023-10-30 19:40:00.000000000 +0000
@@ -0,0 +1,18 @@
+extern crate self as core;
+
+use tracing::{enabled, event, span, Level};
+
+#[test]
+fn span() {
+    span!(Level::DEBUG, "foo");
+}
+
+#[test]
+fn event() {
+    event!(Level::DEBUG, "foo");
+}
+
+#[test]
+fn enabled() {
+    enabled!(Level::DEBUG);
+}
diff -Nru temporalio-1.3.0/vendor/tracing/tests/macros.rs temporalio-1.3.0/vendor/tracing/tests/macros.rs
--- temporalio-1.3.0/vendor/tracing/tests/macros.rs	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/tracing/tests/macros.rs	2023-10-30 19:40:00.000000000 +0000
@@ -1,14 +1,4 @@
 #![deny(warnings)]
-// We call all macros in this module with `no_implicit_prelude` to ensure they do not depend on the standard prelude.
-#![no_implicit_prelude]
-extern crate tracing;
-#[cfg(target_arch = "wasm32")]
-extern crate wasm_bindgen_test;
-
-// TODO: remove this once https://github.com/tokio-rs/tracing/pull/2675#issuecomment-1667628907 is resolved
-#[cfg(target_arch = "wasm32")]
-use ::core::option::Option::None;
-
 use tracing::{
     callsite, debug, debug_span, enabled, error, error_span, event, event_enabled, info, info_span,
     span, span_enabled, trace, trace_span, warn, warn_span, Level,
@@ -121,142 +111,80 @@
 #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
 #[test]
 fn span_root() {
-    span!(target: "foo_events", parent: ::core::option::Option::None, Level::TRACE, "foo", bar.baz = 2, quux = 3);
-    span!(target: "foo_events", parent: ::core::option::Option::None, Level::TRACE, "foo", bar.baz = 2, quux = 3);
-    span!(target: "foo_events", parent: ::core::option::Option::None, Level::TRACE, "foo", bar.baz = 2, quux = 4,);
-    span!(target: "foo_events", parent: ::core::option::Option::None, Level::TRACE, "foo");
-    span!(target: "foo_events", parent: ::core::option::Option::None, Level::TRACE, "bar",);
-    span!(
-        parent: ::core::option::Option::None,
-        Level::DEBUG,
-        "foo",
-        bar.baz = 2,
-        quux = 3
-    );
-    span!(
-        parent: ::core::option::Option::None,
-        Level::DEBUG,
-        "foo",
-        bar.baz = 2,
-        quux = 4,
-    );
-    span!(parent: ::core::option::Option::None, Level::DEBUG, "foo");
-    span!(parent: ::core::option::Option::None, Level::DEBUG, "bar",);
+    span!(target: "foo_events", parent: None, Level::TRACE, "foo", bar.baz = 2, quux = 3);
+    span!(target: "foo_events", parent: None, Level::TRACE, "foo", bar.baz = 2, quux = 3);
+    span!(target: "foo_events", parent: None, Level::TRACE, "foo", bar.baz = 2, quux = 4,);
+    span!(target: "foo_events", parent: None, Level::TRACE, "foo");
+    span!(target: "foo_events", parent: None, Level::TRACE, "bar",);
+    span!(parent: None, Level::DEBUG, "foo", bar.baz = 2, quux = 3);
+    span!(parent: None, Level::DEBUG, "foo", bar.baz = 2, quux = 4,);
+    span!(parent: None, Level::DEBUG, "foo");
+    span!(parent: None, Level::DEBUG, "bar",);
 }
 
 #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
 #[test]
 fn trace_span_root() {
-    trace_span!(target: "foo_events", parent: ::core::option::Option::None, "foo", bar.baz = 2, quux = 3);
-    trace_span!(target: "foo_events", parent: ::core::option::Option::None, "foo", bar.baz = 2, quux = 4,);
-    trace_span!(target: "foo_events", parent: ::core::option::Option::None, "foo");
-    trace_span!(target: "foo_events", parent: ::core::option::Option::None, "bar",);
-    trace_span!(
-        parent: ::core::option::Option::None,
-        "foo",
-        bar.baz = 2,
-        quux = 3
-    );
-    trace_span!(
-        parent: ::core::option::Option::None,
-        "foo",
-        bar.baz = 2,
-        quux = 4,
-    );
-    trace_span!(parent: ::core::option::Option::None, "foo");
-    trace_span!(parent: ::core::option::Option::None, "bar",);
+    trace_span!(target: "foo_events", parent: None, "foo", bar.baz = 2, quux = 3);
+    trace_span!(target: "foo_events", parent: None, "foo", bar.baz = 2, quux = 4,);
+    trace_span!(target: "foo_events", parent: None, "foo");
+    trace_span!(target: "foo_events", parent: None, "bar",);
+    trace_span!(parent: None, "foo", bar.baz = 2, quux = 3);
+    trace_span!(parent: None, "foo", bar.baz = 2, quux = 4,);
+    trace_span!(parent: None, "foo");
+    trace_span!(parent: None, "bar",);
 }
 
 #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
 #[test]
 fn debug_span_root() {
-    debug_span!(target: "foo_events", parent: ::core::option::Option::None, "foo", bar.baz = 2, quux = 3);
-    debug_span!(target: "foo_events", parent: ::core::option::Option::None, "foo", bar.baz = 2, quux = 4,);
-    debug_span!(target: "foo_events", parent: ::core::option::Option::None, "foo");
-    debug_span!(target: "foo_events", parent: ::core::option::Option::None, "bar",);
-    debug_span!(
-        parent: ::core::option::Option::None,
-        "foo",
-        bar.baz = 2,
-        quux = 3
-    );
-    debug_span!(
-        parent: ::core::option::Option::None,
-        "foo",
-        bar.baz = 2,
-        quux = 4,
-    );
-    debug_span!(parent: ::core::option::Option::None, "foo");
-    debug_span!(parent: ::core::option::Option::None, "bar",);
+    debug_span!(target: "foo_events", parent: None, "foo", bar.baz = 2, quux = 3);
+    debug_span!(target: "foo_events", parent: None, "foo", bar.baz = 2, quux = 4,);
+    debug_span!(target: "foo_events", parent: None, "foo");
+    debug_span!(target: "foo_events", parent: None, "bar",);
+    debug_span!(parent: None, "foo", bar.baz = 2, quux = 3);
+    debug_span!(parent: None, "foo", bar.baz = 2, quux = 4,);
+    debug_span!(parent: None, "foo");
+    debug_span!(parent: None, "bar",);
 }
 
 #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
 #[test]
 fn info_span_root() {
-    info_span!(target: "foo_events", parent: ::core::option::Option::None, "foo", bar.baz = 2, quux = 3);
-    info_span!(target: "foo_events", parent: ::core::option::Option::None, "foo", bar.baz = 2, quux = 4,);
-    info_span!(target: "foo_events", parent: ::core::option::Option::None, "foo");
-    info_span!(target: "foo_events", parent: ::core::option::Option::None, "bar",);
-    info_span!(
-        parent: ::core::option::Option::None,
-        "foo",
-        bar.baz = 2,
-        quux = 3
-    );
-    info_span!(
-        parent: ::core::option::Option::None,
-        "foo",
-        bar.baz = 2,
-        quux = 4,
-    );
-    info_span!(parent: ::core::option::Option::None, "foo");
-    info_span!(parent: ::core::option::Option::None, "bar",);
+    info_span!(target: "foo_events", parent: None, "foo", bar.baz = 2, quux = 3);
+    info_span!(target: "foo_events", parent: None, "foo", bar.baz = 2, quux = 4,);
+    info_span!(target: "foo_events", parent: None, "foo");
+    info_span!(target: "foo_events", parent: None, "bar",);
+    info_span!(parent: None, "foo", bar.baz = 2, quux = 3);
+    info_span!(parent: None, "foo", bar.baz = 2, quux = 4,);
+    info_span!(parent: None, "foo");
+    info_span!(parent: None, "bar",);
 }
 
 #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
 #[test]
 fn warn_span_root() {
-    warn_span!(target: "foo_events", parent: ::core::option::Option::None, "foo", bar.baz = 2, quux = 3);
-    warn_span!(target: "foo_events", parent: ::core::option::Option::None, "foo", bar.baz = 2, quux = 4,);
-    warn_span!(target: "foo_events", parent: ::core::option::Option::None, "foo");
-    warn_span!(target: "foo_events", parent: ::core::option::Option::None, "bar",);
-    warn_span!(
-        parent: ::core::option::Option::None,
-        "foo",
-        bar.baz = 2,
-        quux = 3
-    );
-    warn_span!(
-        parent: ::core::option::Option::None,
-        "foo",
-        bar.baz = 2,
-        quux = 4,
-    );
-    warn_span!(parent: ::core::option::Option::None, "foo");
-    warn_span!(parent: ::core::option::Option::None, "bar",);
+    warn_span!(target: "foo_events", parent: None, "foo", bar.baz = 2, quux = 3);
+    warn_span!(target: "foo_events", parent: None, "foo", bar.baz = 2, quux = 4,);
+    warn_span!(target: "foo_events", parent: None, "foo");
+    warn_span!(target: "foo_events", parent: None, "bar",);
+    warn_span!(parent: None, "foo", bar.baz = 2, quux = 3);
+    warn_span!(parent: None, "foo", bar.baz = 2, quux = 4,);
+    warn_span!(parent: None, "foo");
+    warn_span!(parent: None, "bar",);
 }
 
 #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
 #[test]
 fn error_span_root() {
-    error_span!(target: "foo_events", parent: ::core::option::Option::None, "foo", bar.baz = 2, quux = 3);
-    error_span!(target: "foo_events", parent: ::core::option::Option::None, "foo", bar.baz = 2, quux = 4,);
-    error_span!(target: "foo_events", parent: ::core::option::Option::None, "foo");
-    error_span!(target: "foo_events", parent: ::core::option::Option::None, "bar",);
-    error_span!(
-        parent: ::core::option::Option::None,
-        "foo",
-        bar.baz = 2,
-        quux = 3
-    );
-    error_span!(
-        parent: ::core::option::Option::None,
-        "foo",
-        bar.baz = 2,
-        quux = 4,
-    );
-    error_span!(parent: ::core::option::Option::None, "foo");
-    error_span!(parent: ::core::option::Option::None, "bar",);
+    error_span!(target: "foo_events", parent: None, "foo", bar.baz = 2, quux = 3);
+    error_span!(target: "foo_events", parent: None, "foo", bar.baz = 2, quux = 4,);
+    error_span!(target: "foo_events", parent: None, "foo");
+    error_span!(target: "foo_events", parent: None, "bar",);
+    error_span!(parent: None, "foo", bar.baz = 2, quux = 3);
+    error_span!(parent: None, "foo", bar.baz = 2, quux = 4,);
+    error_span!(parent: None, "foo");
+    error_span!(parent: None, "bar",);
 }
 
 #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
@@ -372,48 +300,6 @@
 
 #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
 #[test]
-fn large_span() {
-    span!(
-        Level::TRACE,
-        "spans with more than 32 fields have been supported since #2508",
-        a = 1,
-        b = 2,
-        c = 3,
-        d = 4,
-        e = 5,
-        f = 6,
-        g = 7,
-        h = 8,
-        i = 9,
-        j = 10,
-        k = 11,
-        l = 12,
-        m = 13,
-        n = 14,
-        o = 15,
-        p = 16,
-        q = 17,
-        r = 18,
-        s = 19,
-        t = 20,
-        u = 21,
-        v = 22,
-        w = 23,
-        x = 24,
-        y = 25,
-        z = 26,
-        aa = 27,
-        bb = 28,
-        cc = 29,
-        dd = 30,
-        ee = 31,
-        ff = 32,
-        gg = 33
-    );
-}
-
-#[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
-#[test]
 fn event() {
     event!(Level::DEBUG, foo = ?3, bar.baz = %2, quux = false);
     event!(Level::DEBUG, foo = 3, bar.baz = 2, quux = false);
@@ -514,13 +400,6 @@
     let private_data = "private";
     let error = "a bad error";
     event!(
-        name: "foo",
-        target: "app_events",
-        Level::WARN,
-        private_data,
-        ?data,
-    );
-    event!(
         target: "app_events",
         Level::WARN,
         private_data,
@@ -559,8 +438,6 @@
     trace!({ foo = 2, bar.baz = 79 }, "quux {:?}, {quux}", true, quux = false);
     trace!({ foo = 2, bar.baz = 78 }, "quux");
     trace!({ foo = ?2, bar.baz = %78 }, "quux");
-    trace!(name: "foo", foo = 3, bar.baz = 2, quux = false);
-    trace!(name: "foo", target: "foo_events", foo = 3, bar.baz = 2, quux = false);
     trace!(target: "foo_events", foo = 3, bar.baz = 2, quux = false);
     trace!(target: "foo_events", foo = 3, bar.baz = 3,);
     trace!(target: "foo_events", "foo");
@@ -573,12 +450,6 @@
     trace!(?foo);
     trace!(%foo);
     trace!(foo);
-    trace!(name: "foo", ?foo);
-    trace!(name: "foo", %foo);
-    trace!(name: "foo", foo);
-    trace!(name: "foo", ?foo, true, "message");
-    trace!(name: "foo", %foo, true, "message");
-    trace!(name: "foo", foo, true, "message");
     trace!(target: "foo_events", ?foo);
     trace!(target: "foo_events", %foo);
     trace!(target: "foo_events", foo);
@@ -603,8 +474,6 @@
     debug!({ foo = 2, bar.baz = 79 }, "quux {:?}, {quux}", true, quux = false);
     debug!({ foo = 2, bar.baz = 78 }, "quux");
     debug!({ foo = ?2, bar.baz = %78 }, "quux");
-    debug!(name: "foo", foo = 3, bar.baz = 2, quux = false);
-    debug!(name: "foo", target: "foo_events", foo = 3, bar.baz = 2, quux = false);
     debug!(target: "foo_events", foo = 3, bar.baz = 2, quux = false);
     debug!(target: "foo_events", foo = 3, bar.baz = 3,);
     debug!(target: "foo_events", "foo");
@@ -617,12 +486,6 @@
     debug!(?foo);
     debug!(%foo);
     debug!(foo);
-    debug!(name: "foo", ?foo);
-    debug!(name: "foo", %foo);
-    debug!(name: "foo", foo);
-    debug!(name: "foo", ?foo, true, "message");
-    debug!(name: "foo", %foo, true, "message");
-    debug!(name: "foo", foo, true, "message");
     debug!(target: "foo_events", ?foo);
     debug!(target: "foo_events", %foo);
     debug!(target: "foo_events", foo);
@@ -647,8 +510,6 @@
     info!({ foo = 2, bar.baz = 79 }, "quux {:?}, {quux}", true, quux = false);
     info!({ foo = 2, bar.baz = 78 }, "quux");
     info!({ foo = ?2, bar.baz = %78 }, "quux");
-    info!(name: "foo", foo = 3, bar.baz = 2, quux = false);
-    info!(name: "foo", target: "foo_events", foo = 3, bar.baz = 2, quux = false);
     info!(target: "foo_events", foo = 3, bar.baz = 2, quux = false);
     info!(target: "foo_events", foo = 3, bar.baz = 3,);
     info!(target: "foo_events", "foo");
@@ -661,12 +522,6 @@
     info!(?foo);
     info!(%foo);
     info!(foo);
-    info!(name: "foo", ?foo);
-    info!(name: "foo", %foo);
-    info!(name: "foo", foo);
-    info!(name: "foo", ?foo, true, "message");
-    info!(name: "foo", %foo, true, "message");
-    info!(name: "foo", foo, true, "message");
     info!(target: "foo_events", ?foo);
     info!(target: "foo_events", %foo);
     info!(target: "foo_events", foo);
@@ -691,8 +546,6 @@
     warn!({ foo = 2, bar.baz = 79 }, "quux {:?}, {quux}", true, quux = false);
     warn!({ foo = 2, bar.baz = 78 }, "quux");
     warn!({ foo = ?2, bar.baz = %78 }, "quux");
-    warn!(name: "foo", foo = 3, bar.baz = 2, quux = false);
-    warn!(name: "foo", target: "foo_events", foo = 3, bar.baz = 2, quux = false);
     warn!(target: "foo_events", foo = 3, bar.baz = 2, quux = false);
     warn!(target: "foo_events", foo = 3, bar.baz = 3,);
     warn!(target: "foo_events", "foo");
@@ -705,12 +558,6 @@
     warn!(?foo);
     warn!(%foo);
     warn!(foo);
-    warn!(name: "foo", ?foo);
-    warn!(name: "foo", %foo);
-    warn!(name: "foo", foo);
-    warn!(name: "foo", ?foo, true, "message");
-    warn!(name: "foo", %foo, true, "message");
-    warn!(name: "foo", foo, true, "message");
     warn!(target: "foo_events", ?foo);
     warn!(target: "foo_events", %foo);
     warn!(target: "foo_events", foo);
@@ -735,8 +582,6 @@
     error!({ foo = 2, bar.baz = 79 }, "quux {:?}, {quux}", true, quux = false);
     error!({ foo = 2, bar.baz = 78, }, "quux");
     error!({ foo = ?2, bar.baz = %78 }, "quux");
-    error!(name: "foo", foo = 3, bar.baz = 2, quux = false);
-    error!(name: "foo", target: "foo_events", foo = 3, bar.baz = 2, quux = false);
     error!(target: "foo_events", foo = 3, bar.baz = 2, quux = false);
     error!(target: "foo_events", foo = 3, bar.baz = 3,);
     error!(target: "foo_events", "foo");
@@ -749,12 +594,6 @@
     error!(?foo);
     error!(%foo);
     error!(foo);
-    error!(name: "foo", ?foo);
-    error!(name: "foo", %foo);
-    error!(name: "foo", foo);
-    error!(name: "foo", ?foo, true, "message");
-    error!(name: "foo", %foo, true, "message");
-    error!(name: "foo", foo, true, "message");
     error!(target: "foo_events", ?foo);
     error!(target: "foo_events", %foo);
     error!(target: "foo_events", foo);
@@ -766,227 +605,144 @@
 #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
 #[test]
 fn event_root() {
-    event!(parent: ::core::option::Option::None, Level::DEBUG, foo = ?3, bar.baz = %2, quux = false);
+    event!(parent: None, Level::DEBUG, foo = ?3, bar.baz = %2, quux = false);
     event!(
-        parent: ::core::option::Option::None,
+        parent: None,
         Level::DEBUG,
         foo = 3,
         bar.baz = 2,
         quux = false
     );
-    event!(
-        parent: ::core::option::Option::None,
-        Level::DEBUG,
-        foo = 3,
-        bar.baz = 3,
-    );
-    event!(parent: ::core::option::Option::None, Level::DEBUG, "foo");
-    event!(
-        parent: ::core::option::Option::None,
-        Level::DEBUG,
-        "foo: {}",
-        3
-    );
-    event!(parent: ::core::option::Option::None, Level::DEBUG, { foo = 3, bar.baz = 80 }, "quux");
-    event!(parent: ::core::option::Option::None, Level::DEBUG, { foo = 2, bar.baz = 79 }, "quux {:?}", true);
-    event!(parent: ::core::option::Option::None, Level::DEBUG, { foo = 2, bar.baz = 79 }, "quux {:?}, {quux}", true, quux = false);
-    event!(parent: ::core::option::Option::None, Level::DEBUG, { foo = ?2, bar.baz = %78 }, "quux");
-    event!(target: "foo_events", parent: ::core::option::Option::None, Level::DEBUG, foo = 3, bar.baz = 2, quux = false);
-    event!(target: "foo_events", parent: ::core::option::Option::None, Level::DEBUG, foo = 3, bar.baz = 3,);
-    event!(target: "foo_events", parent: ::core::option::Option::None, Level::DEBUG, "foo");
-    event!(target: "foo_events", parent: ::core::option::Option::None, Level::DEBUG, "foo: {}", 3);
-    event!(target: "foo_events", parent: ::core::option::Option::None, Level::DEBUG, { foo = 3, bar.baz = 80 }, "quux");
-    event!(target: "foo_events", parent: ::core::option::Option::None, Level::DEBUG, { foo = 2, bar.baz = 79 }, "quux {:?}", true);
-    event!(target: "foo_events", parent: ::core::option::Option::None, Level::DEBUG, { foo = 2, bar.baz = 79 }, "quux {:?}, {quux}", true, quux = false);
-    event!(target: "foo_events", parent: ::core::option::Option::None, Level::DEBUG, { foo = 2, bar.baz = 78, }, "quux");
-    event!(name: "foo", target: "foo_events", parent: ::core::option::Option::None, Level::DEBUG, foo = 3, bar.baz = 2, quux = false);
-    event!(name: "foo", target: "foo_events", parent: ::core::option::Option::None, Level::DEBUG, foo = 3, bar.baz = 3,);
-    event!(name: "foo", target: "foo_events", parent: ::core::option::Option::None, Level::DEBUG, "foo");
-    event!(name: "foo", target: "foo_events", parent: ::core::option::Option::None, Level::DEBUG, "foo: {}", 3);
-    event!(name: "foo", target: "foo_events", parent: ::core::option::Option::None, Level::DEBUG, { foo = 3, bar.baz = 80 }, "quux");
-    event!(name: "foo", target: "foo_events", parent: ::core::option::Option::None, Level::DEBUG, { foo = 2, bar.baz = 79 }, "quux {:?}", true);
-    event!(name: "foo", target: "foo_events", parent: ::core::option::Option::None, Level::DEBUG, { foo = 2, bar.baz = 79 }, "quux {:?}, {quux}", true, quux = false);
-    event!(name: "foo", target: "foo_events", parent: ::core::option::Option::None, Level::DEBUG, { foo = 2, bar.baz = 78, }, "quux");
+    event!(parent: None, Level::DEBUG, foo = 3, bar.baz = 3,);
+    event!(parent: None, Level::DEBUG, "foo");
+    event!(parent: None, Level::DEBUG, "foo: {}", 3);
+    event!(parent: None, Level::DEBUG, { foo = 3, bar.baz = 80 }, "quux");
+    event!(parent: None, Level::DEBUG, { foo = 2, bar.baz = 79 }, "quux {:?}", true);
+    event!(parent: None, Level::DEBUG, { foo = 2, bar.baz = 79 }, "quux {:?}, {quux}", true, quux = false);
+    event!(parent: None, Level::DEBUG, { foo = ?2, bar.baz = %78 }, "quux");
+    event!(target: "foo_events", parent: None, Level::DEBUG, foo = 3, bar.baz = 2, quux = false);
+    event!(target: "foo_events", parent: None, Level::DEBUG, foo = 3, bar.baz = 3,);
+    event!(target: "foo_events", parent: None, Level::DEBUG, "foo");
+    event!(target: "foo_events", parent: None, Level::DEBUG, "foo: {}", 3);
+    event!(target: "foo_events", parent: None, Level::DEBUG, { foo = 3, bar.baz = 80 }, "quux");
+    event!(target: "foo_events", parent: None, Level::DEBUG, { foo = 2, bar.baz = 79 }, "quux {:?}", true);
+    event!(target: "foo_events", parent: None, Level::DEBUG, { foo = 2, bar.baz = 79 }, "quux {:?}, {quux}", true, quux = false);
+    event!(target: "foo_events", parent: None, Level::DEBUG, { foo = 2, bar.baz = 78, }, "quux");
 }
 
 #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
 #[test]
 fn trace_root() {
-    trace!(parent: ::core::option::Option::None, foo = ?3, bar.baz = %2, quux = false);
-    trace!(
-        parent: ::core::option::Option::None,
-        foo = 3,
-        bar.baz = 2,
-        quux = false
-    );
-    trace!(parent: ::core::option::Option::None, foo = 3, bar.baz = 3,);
-    trace!(parent: ::core::option::Option::None, "foo");
-    trace!(parent: ::core::option::Option::None, "foo: {}", 3);
-    trace!(parent: ::core::option::Option::None, { foo = 3, bar.baz = 80 }, "quux");
-    trace!(parent: ::core::option::Option::None, { foo = 2, bar.baz = 79 }, "quux {:?}", true);
-    trace!(parent: ::core::option::Option::None, { foo = 2, bar.baz = 79 }, "quux {:?}, {quux}", true, quux = false);
-    trace!(parent: ::core::option::Option::None, { foo = 2, bar.baz = 78 }, "quux");
-    trace!(parent: ::core::option::Option::None, { foo = ?2, bar.baz = %78 }, "quux");
-    trace!(target: "foo_events", parent: ::core::option::Option::None, foo = 3, bar.baz = 2, quux = false);
-    trace!(target: "foo_events", parent: ::core::option::Option::None, foo = 3, bar.baz = 3,);
-    trace!(target: "foo_events", parent: ::core::option::Option::None, "foo");
-    trace!(target: "foo_events", parent: ::core::option::Option::None, "foo: {}", 3);
-    trace!(target: "foo_events", parent: ::core::option::Option::None, { foo = 3, bar.baz = 80 }, "quux");
-    trace!(target: "foo_events", parent: ::core::option::Option::None, { foo = 2, bar.baz = 79 }, "quux {:?}", true);
-    trace!(target: "foo_events", parent: ::core::option::Option::None, { foo = 2, bar.baz = 79 }, "quux {:?}, {quux}", true, quux = false);
-    trace!(target: "foo_events", parent: ::core::option::Option::None, { foo = 2, bar.baz = 78, }, "quux");
-    trace!(name: "foo", target: "foo_events", parent: ::core::option::Option::None, foo = 3, bar.baz = 2, quux = false);
-    trace!(name: "foo", target: "foo_events", parent: ::core::option::Option::None, foo = 3, bar.baz = 3,);
-    trace!(name: "foo", target: "foo_events", parent: ::core::option::Option::None, "foo");
-    trace!(name: "foo", target: "foo_events", parent: ::core::option::Option::None, "foo: {}", 3);
-    trace!(name: "foo", target: "foo_events", parent: ::core::option::Option::None, { foo = 3, bar.baz = 80 }, "quux");
-    trace!(name: "foo", target: "foo_events", parent: ::core::option::Option::None, { foo = 2, bar.baz = 79 }, "quux {:?}", true);
-    trace!(name: "foo", target: "foo_events", parent: ::core::option::Option::None, { foo = 2, bar.baz = 79 }, "quux {:?}, {quux}", true, quux = false);
-    trace!(name: "foo", target: "foo_events", parent: ::core::option::Option::None, { foo = 2, bar.baz = 78, }, "quux");
+    trace!(parent: None, foo = ?3, bar.baz = %2, quux = false);
+    trace!(parent: None, foo = 3, bar.baz = 2, quux = false);
+    trace!(parent: None, foo = 3, bar.baz = 3,);
+    trace!(parent: None, "foo");
+    trace!(parent: None, "foo: {}", 3);
+    trace!(parent: None, { foo = 3, bar.baz = 80 }, "quux");
+    trace!(parent: None, { foo = 2, bar.baz = 79 }, "quux {:?}", true);
+    trace!(parent: None, { foo = 2, bar.baz = 79 }, "quux {:?}, {quux}", true, quux = false);
+    trace!(parent: None, { foo = 2, bar.baz = 78 }, "quux");
+    trace!(parent: None, { foo = ?2, bar.baz = %78 }, "quux");
+    trace!(target: "foo_events", parent: None, foo = 3, bar.baz = 2, quux = false);
+    trace!(target: "foo_events", parent: None, foo = 3, bar.baz = 3,);
+    trace!(target: "foo_events", parent: None, "foo");
+    trace!(target: "foo_events", parent: None, "foo: {}", 3);
+    trace!(target: "foo_events", parent: None, { foo = 3, bar.baz = 80 }, "quux");
+    trace!(target: "foo_events", parent: None, { foo = 2, bar.baz = 79 }, "quux {:?}", true);
+    trace!(target: "foo_events", parent: None, { foo = 2, bar.baz = 79 }, "quux {:?}, {quux}", true, quux = false);
+    trace!(target: "foo_events", parent: None, { foo = 2, bar.baz = 78, }, "quux");
 }
 
 #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
 #[test]
 fn debug_root() {
-    debug!(parent: ::core::option::Option::None, foo = ?3, bar.baz = %2, quux = false);
-    debug!(
-        parent: ::core::option::Option::None,
-        foo = 3,
-        bar.baz = 2,
-        quux = false
-    );
-    debug!(parent: ::core::option::Option::None, foo = 3, bar.baz = 3,);
-    debug!(parent: ::core::option::Option::None, "foo");
-    debug!(parent: ::core::option::Option::None, "foo: {}", 3);
-    debug!(parent: ::core::option::Option::None, { foo = 3, bar.baz = 80 }, "quux");
-    debug!(parent: ::core::option::Option::None, { foo = 2, bar.baz = 79 }, "quux {:?}", true);
-    debug!(parent: ::core::option::Option::None, { foo = 2, bar.baz = 79 }, "quux {:?}, {quux}", true, quux = false);
-    debug!(parent: ::core::option::Option::None, { foo = 2, bar.baz = 78 }, "quux");
-    debug!(parent: ::core::option::Option::None, { foo = ?2, bar.baz = %78 }, "quux");
-    debug!(target: "foo_events", parent: ::core::option::Option::None, foo = 3, bar.baz = 2, quux = false);
-    debug!(target: "foo_events", parent: ::core::option::Option::None, foo = 3, bar.baz = 3,);
-    debug!(target: "foo_events", parent: ::core::option::Option::None, "foo");
-    debug!(target: "foo_events", parent: ::core::option::Option::None, "foo: {}", 3);
-    debug!(target: "foo_events", parent: ::core::option::Option::None, { foo = 3, bar.baz = 80 }, "quux");
-    debug!(target: "foo_events", parent: ::core::option::Option::None, { foo = 2, bar.baz = 79 }, "quux {:?}", true);
-    debug!(target: "foo_events", parent: ::core::option::Option::None, { foo = 2, bar.baz = 79 }, "quux {:?}, {quux}", true, quux = false);
-    debug!(target: "foo_events", parent: ::core::option::Option::None, { foo = 2, bar.baz = 78, }, "quux");
-    debug!(name: "foo", target: "foo_events", parent: ::core::option::Option::None, foo = 3, bar.baz = 2, quux = false);
-    debug!(name: "foo", target: "foo_events", parent: ::core::option::Option::None, foo = 3, bar.baz = 3,);
-    debug!(name: "foo", target: "foo_events", parent: ::core::option::Option::None, "foo");
-    debug!(name: "foo", target: "foo_events", parent: ::core::option::Option::None, "foo: {}", 3);
-    debug!(name: "foo", target: "foo_events", parent: ::core::option::Option::None, { foo = 3, bar.baz = 80 }, "quux");
-    debug!(name: "foo", target: "foo_events", parent: ::core::option::Option::None, { foo = 2, bar.baz = 79 }, "quux {:?}", true);
-    debug!(name: "foo", target: "foo_events", parent: ::core::option::Option::None, { foo = 2, bar.baz = 79 }, "quux {:?}, {quux}", true, quux = false);
-    debug!(name: "foo", target: "foo_events", parent: ::core::option::Option::None, { foo = 2, bar.baz = 78, }, "quux");
+    debug!(parent: None, foo = ?3, bar.baz = %2, quux = false);
+    debug!(parent: None, foo = 3, bar.baz = 2, quux = false);
+    debug!(parent: None, foo = 3, bar.baz = 3,);
+    debug!(parent: None, "foo");
+    debug!(parent: None, "foo: {}", 3);
+    debug!(parent: None, { foo = 3, bar.baz = 80 }, "quux");
+    debug!(parent: None, { foo = 2, bar.baz = 79 }, "quux {:?}", true);
+    debug!(parent: None, { foo = 2, bar.baz = 79 }, "quux {:?}, {quux}", true, quux = false);
+    debug!(parent: None, { foo = 2, bar.baz = 78 }, "quux");
+    debug!(parent: None, { foo = ?2, bar.baz = %78 }, "quux");
+    debug!(target: "foo_events", parent: None, foo = 3, bar.baz = 2, quux = false);
+    debug!(target: "foo_events", parent: None, foo = 3, bar.baz = 3,);
+    debug!(target: "foo_events", parent: None, "foo");
+    debug!(target: "foo_events", parent: None, "foo: {}", 3);
+    debug!(target: "foo_events", parent: None, { foo = 3, bar.baz = 80 }, "quux");
+    debug!(target: "foo_events", parent: None, { foo = 2, bar.baz = 79 }, "quux {:?}", true);
+    debug!(target: "foo_events", parent: None, { foo = 2, bar.baz = 79 }, "quux {:?}, {quux}", true, quux = false);
+    debug!(target: "foo_events", parent: None, { foo = 2, bar.baz = 78, }, "quux");
 }
 
 #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
 #[test]
 fn info_root() {
-    info!(parent: ::core::option::Option::None, foo = ?3, bar.baz = %2, quux = false);
-    info!(
-        parent: ::core::option::Option::None,
-        foo = 3,
-        bar.baz = 2,
-        quux = false
-    );
-    info!(parent: ::core::option::Option::None, foo = 3, bar.baz = 3,);
-    info!(parent: ::core::option::Option::None, "foo");
-    info!(parent: ::core::option::Option::None, "foo: {}", 3);
-    info!(parent: ::core::option::Option::None, { foo = 3, bar.baz = 80 }, "quux");
-    info!(parent: ::core::option::Option::None, { foo = 2, bar.baz = 79 }, "quux {:?}", true);
-    info!(parent: ::core::option::Option::None, { foo = 2, bar.baz = 79 }, "quux {:?}, {quux}", true, quux = false);
-    info!(parent: ::core::option::Option::None, { foo = 2, bar.baz = 78 }, "quux");
-    info!(parent: ::core::option::Option::None, { foo = ?2, bar.baz = %78 }, "quux");
-    info!(target: "foo_events", parent: ::core::option::Option::None, foo = 3, bar.baz = 2, quux = false);
-    info!(target: "foo_events", parent: ::core::option::Option::None, foo = 3, bar.baz = 3,);
-    info!(target: "foo_events", parent: ::core::option::Option::None, "foo");
-    info!(target: "foo_events", parent: ::core::option::Option::None, "foo: {}", 3);
-    info!(target: "foo_events", parent: ::core::option::Option::None, { foo = 3, bar.baz = 80 }, "quux");
-    info!(target: "foo_events", parent: ::core::option::Option::None, { foo = 2, bar.baz = 79 }, "quux {:?}", true);
-    info!(target: "foo_events", parent: ::core::option::Option::None, { foo = 2, bar.baz = 79 }, "quux {:?}, {quux}", true, quux = false);
-    info!(target: "foo_events", parent: ::core::option::Option::None, { foo = 2, bar.baz = 78, }, "quux");
-    info!(name: "foo", target: "foo_events", parent: ::core::option::Option::None, foo = 3, bar.baz = 2, quux = false);
-    info!(name: "foo", target: "foo_events", parent: ::core::option::Option::None, foo = 3, bar.baz = 3,);
-    info!(name: "foo", target: "foo_events", parent: ::core::option::Option::None, "foo");
-    info!(name: "foo", target: "foo_events", parent: ::core::option::Option::None, "foo: {}", 3);
-    info!(name: "foo", target: "foo_events", parent: ::core::option::Option::None, { foo = 3, bar.baz = 80 }, "quux");
-    info!(name: "foo", target: "foo_events", parent: ::core::option::Option::None, { foo = 2, bar.baz = 79 }, "quux {:?}", true);
-    info!(name: "foo", target: "foo_events", parent: ::core::option::Option::None, { foo = 2, bar.baz = 79 }, "quux {:?}, {quux}", true, quux = false);
-    info!(name: "foo", target: "foo_events", parent: ::core::option::Option::None, { foo = 2, bar.baz = 78, }, "quux");
+    info!(parent: None, foo = ?3, bar.baz = %2, quux = false);
+    info!(parent: None, foo = 3, bar.baz = 2, quux = false);
+    info!(parent: None, foo = 3, bar.baz = 3,);
+    info!(parent: None, "foo");
+    info!(parent: None, "foo: {}", 3);
+    info!(parent: None, { foo = 3, bar.baz = 80 }, "quux");
+    info!(parent: None, { foo = 2, bar.baz = 79 }, "quux {:?}", true);
+    info!(parent: None, { foo = 2, bar.baz = 79 }, "quux {:?}, {quux}", true, quux = false);
+    info!(parent: None, { foo = 2, bar.baz = 78 }, "quux");
+    info!(parent: None, { foo = ?2, bar.baz = %78 }, "quux");
+    info!(target: "foo_events", parent: None, foo = 3, bar.baz = 2, quux = false);
+    info!(target: "foo_events", parent: None, foo = 3, bar.baz = 3,);
+    info!(target: "foo_events", parent: None, "foo");
+    info!(target: "foo_events", parent: None, "foo: {}", 3);
+    info!(target: "foo_events", parent: None, { foo = 3, bar.baz = 80 }, "quux");
+    info!(target: "foo_events", parent: None, { foo = 2, bar.baz = 79 }, "quux {:?}", true);
+    info!(target: "foo_events", parent: None, { foo = 2, bar.baz = 79 }, "quux {:?}, {quux}", true, quux = false);
+    info!(target: "foo_events", parent: None, { foo = 2, bar.baz = 78, }, "quux");
 }
 
 #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
 #[test]
 fn warn_root() {
-    warn!(parent: ::core::option::Option::None, foo = ?3, bar.baz = %2, quux = false);
-    warn!(
-        parent: ::core::option::Option::None,
-        foo = 3,
-        bar.baz = 2,
-        quux = false
-    );
-    warn!(parent: ::core::option::Option::None, foo = 3, bar.baz = 3,);
-    warn!(parent: ::core::option::Option::None, "foo");
-    warn!(parent: ::core::option::Option::None, "foo: {}", 3);
-    warn!(parent: ::core::option::Option::None, { foo = 3, bar.baz = 80 }, "quux");
-    warn!(parent: ::core::option::Option::None, { foo = 2, bar.baz = 79 }, "quux {:?}", true);
-    warn!(parent: ::core::option::Option::None, { foo = 2, bar.baz = 79 }, "quux {:?}, {quux}", true, quux = false);
-    warn!(parent: ::core::option::Option::None, { foo = 2, bar.baz = 78 }, "quux");
-    warn!(parent: ::core::option::Option::None, { foo = ?2, bar.baz = %78 }, "quux");
-    warn!(target: "foo_events", parent: ::core::option::Option::None, foo = 3, bar.baz = 2, quux = false);
-    warn!(target: "foo_events", parent: ::core::option::Option::None, foo = 3, bar.baz = 3,);
-    warn!(target: "foo_events", parent: ::core::option::Option::None, "foo");
-    warn!(target: "foo_events", parent: ::core::option::Option::None, "foo: {}", 3);
-    warn!(target: "foo_events", parent: ::core::option::Option::None, { foo = 3, bar.baz = 80 }, "quux");
-    warn!(target: "foo_events", parent: ::core::option::Option::None, { foo = 2, bar.baz = 79 }, "quux {:?}", true);
-    warn!(target: "foo_events", parent: ::core::option::Option::None, { foo = 2, bar.baz = 79 }, "quux {:?}, {quux}", true, quux = false);
-    warn!(target: "foo_events", parent: ::core::option::Option::None, { foo = 2, bar.baz = 78, }, "quux");
-    warn!(name: "foo", target: "foo_events", parent: ::core::option::Option::None, foo = 3, bar.baz = 2, quux = false);
-    warn!(name: "foo", target: "foo_events", parent: ::core::option::Option::None, foo = 3, bar.baz = 3,);
-    warn!(name: "foo", target: "foo_events", parent: ::core::option::Option::None, "foo");
-    warn!(name: "foo", target: "foo_events", parent: ::core::option::Option::None, "foo: {}", 3);
-    warn!(name: "foo", target: "foo_events", parent: ::core::option::Option::None, { foo = 3, bar.baz = 80 }, "quux");
-    warn!(name: "foo", target: "foo_events", parent: ::core::option::Option::None, { foo = 2, bar.baz = 79 }, "quux {:?}", true);
-    warn!(name: "foo", target: "foo_events", parent: ::core::option::Option::None, { foo = 2, bar.baz = 79 }, "quux {:?}, {quux}", true, quux = false);
-    warn!(name: "foo", target: "foo_events", parent: ::core::option::Option::None, { foo = 2, bar.baz = 78, }, "quux");
+    warn!(parent: None, foo = ?3, bar.baz = %2, quux = false);
+    warn!(parent: None, foo = 3, bar.baz = 2, quux = false);
+    warn!(parent: None, foo = 3, bar.baz = 3,);
+    warn!(parent: None, "foo");
+    warn!(parent: None, "foo: {}", 3);
+    warn!(parent: None, { foo = 3, bar.baz = 80 }, "quux");
+    warn!(parent: None, { foo = 2, bar.baz = 79 }, "quux {:?}", true);
+    warn!(parent: None, { foo = 2, bar.baz = 79 }, "quux {:?}, {quux}", true, quux = false);
+    warn!(parent: None, { foo = 2, bar.baz = 78 }, "quux");
+    warn!(parent: None, { foo = ?2, bar.baz = %78 }, "quux");
+    warn!(target: "foo_events", parent: None, foo = 3, bar.baz = 2, quux = false);
+    warn!(target: "foo_events", parent: None, foo = 3, bar.baz = 3,);
+    warn!(target: "foo_events", parent: None, "foo");
+    warn!(target: "foo_events", parent: None, "foo: {}", 3);
+    warn!(target: "foo_events", parent: None, { foo = 3, bar.baz = 80 }, "quux");
+    warn!(target: "foo_events", parent: None, { foo = 2, bar.baz = 79 }, "quux {:?}", true);
+    warn!(target: "foo_events", parent: None, { foo = 2, bar.baz = 79 }, "quux {:?}, {quux}", true, quux = false);
+    warn!(target: "foo_events", parent: None, { foo = 2, bar.baz = 78, }, "quux");
 }
 
 #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
 #[test]
 fn error_root() {
-    error!(parent: ::core::option::Option::None, foo = ?3, bar.baz = %2, quux = false);
-    error!(
-        parent: ::core::option::Option::None,
-        foo = 3,
-        bar.baz = 2,
-        quux = false
-    );
-    error!(parent: ::core::option::Option::None, foo = 3, bar.baz = 3,);
-    error!(parent: ::core::option::Option::None, "foo");
-    error!(parent: ::core::option::Option::None, "foo: {}", 3);
-    error!(parent: ::core::option::Option::None, { foo = 3, bar.baz = 80 }, "quux");
-    error!(parent: ::core::option::Option::None, { foo = 2, bar.baz = 79 }, "quux {:?}", true);
-    error!(parent: ::core::option::Option::None, { foo = 2, bar.baz = 79 }, "quux {:?}, {quux}", true, quux = false);
-    error!(parent: ::core::option::Option::None, { foo = 2, bar.baz = 78 }, "quux");
-    error!(parent: ::core::option::Option::None, { foo = ?2, bar.baz = %78 }, "quux");
-    error!(target: "foo_events", parent: ::core::option::Option::None, foo = 3, bar.baz = 2, quux = false);
-    error!(target: "foo_events", parent: ::core::option::Option::None, foo = 3, bar.baz = 3,);
-    error!(target: "foo_events", parent: ::core::option::Option::None, "foo");
-    error!(target: "foo_events", parent: ::core::option::Option::None, "foo: {}", 3);
-    error!(target: "foo_events", parent: ::core::option::Option::None, { foo = 3, bar.baz = 80 }, "quux");
-    error!(target: "foo_events", parent: ::core::option::Option::None, { foo = 2, bar.baz = 79 }, "quux {:?}", true);
-    error!(target: "foo_events", parent: ::core::option::Option::None, { foo = 2, bar.baz = 79 }, "quux {:?}, {quux}", true, quux = false);
-    error!(target: "foo_events", parent: ::core::option::Option::None, { foo = 2, bar.baz = 78, }, "quux");
-    error!(name: "foo", target: "foo_events", parent: ::core::option::Option::None, foo = 3, bar.baz = 2, quux = false);
-    error!(name: "foo", target: "foo_events", parent: ::core::option::Option::None, foo = 3, bar.baz = 3,);
-    error!(name: "foo", target: "foo_events", parent: ::core::option::Option::None, "foo");
-    error!(name: "foo", target: "foo_events", parent: ::core::option::Option::None, "foo: {}", 3);
-    error!(name: "foo", target: "foo_events", parent: ::core::option::Option::None, { foo = 3, bar.baz = 80 }, "quux");
-    error!(name: "foo", target: "foo_events", parent: ::core::option::Option::None, { foo = 2, bar.baz = 79 }, "quux {:?}", true);
-    error!(name: "foo", target: "foo_events", parent: ::core::option::Option::None, { foo = 2, bar.baz = 79 }, "quux {:?}, {quux}", true, quux = false);
-    error!(name: "foo", target: "foo_events", parent: ::core::option::Option::None, { foo = 2, bar.baz = 78, }, "quux");
+    error!(parent: None, foo = ?3, bar.baz = %2, quux = false);
+    error!(parent: None, foo = 3, bar.baz = 2, quux = false);
+    error!(parent: None, foo = 3, bar.baz = 3,);
+    error!(parent: None, "foo");
+    error!(parent: None, "foo: {}", 3);
+    error!(parent: None, { foo = 3, bar.baz = 80 }, "quux");
+    error!(parent: None, { foo = 2, bar.baz = 79 }, "quux {:?}", true);
+    error!(parent: None, { foo = 2, bar.baz = 79 }, "quux {:?}, {quux}", true, quux = false);
+    error!(parent: None, { foo = 2, bar.baz = 78 }, "quux");
+    error!(parent: None, { foo = ?2, bar.baz = %78 }, "quux");
+    error!(target: "foo_events", parent: None, foo = 3, bar.baz = 2, quux = false);
+    error!(target: "foo_events", parent: None, foo = 3, bar.baz = 3,);
+    error!(target: "foo_events", parent: None, "foo");
+    error!(target: "foo_events", parent: None, "foo: {}", 3);
+    error!(target: "foo_events", parent: None, { foo = 3, bar.baz = 80 }, "quux");
+    error!(target: "foo_events", parent: None, { foo = 2, bar.baz = 79 }, "quux {:?}", true);
+    error!(target: "foo_events", parent: None, { foo = 2, bar.baz = 79 }, "quux {:?}, {quux}", true, quux = false);
+    error!(target: "foo_events", parent: None, { foo = 2, bar.baz = 78, }, "quux");
 }
 
 #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
@@ -1010,14 +766,6 @@
     event!(target: "foo_events", parent: &p, Level::DEBUG, { foo = 2, bar.baz = 79 }, "quux {:?}", true);
     event!(target: "foo_events", parent: &p, Level::DEBUG, { foo = 2, bar.baz = 79 }, "quux {:?}, {quux}", true, quux = false);
     event!(target: "foo_events", parent: &p, Level::DEBUG, { foo = 2, bar.baz = 78, }, "quux");
-    event!(name: "foo", target: "foo_events", parent: &p, Level::DEBUG, foo = 3, bar.baz = 2, quux = false);
-    event!(name: "foo", target: "foo_events", parent: &p, Level::DEBUG, foo = 3, bar.baz = 3,);
-    event!(name: "foo", target: "foo_events", parent: &p, Level::DEBUG, "foo");
-    event!(name: "foo", target: "foo_events", parent: &p, Level::DEBUG, "foo: {}", 3);
-    event!(name: "foo", target: "foo_events", parent: &p, Level::DEBUG, { foo = 3, bar.baz = 80 }, "quux");
-    event!(name: "foo", target: "foo_events", parent: &p, Level::DEBUG, { foo = 2, bar.baz = 79 }, "quux {:?}", true);
-    event!(name: "foo", target: "foo_events", parent: &p, Level::DEBUG, { foo = 2, bar.baz = 79 }, "quux {:?}, {quux}", true, quux = false);
-    event!(name: "foo", target: "foo_events", parent: &p, Level::DEBUG, { foo = 2, bar.baz = 78, }, "quux");
 }
 
 #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
@@ -1042,14 +790,6 @@
     trace!(target: "foo_events", parent: &p, { foo = 2, bar.baz = 79 }, "quux {:?}", true);
     trace!(target: "foo_events", parent: &p, { foo = 2, bar.baz = 79 }, "quux {:?}, {quux}", true, quux = false);
     trace!(target: "foo_events", parent: &p, { foo = 2, bar.baz = 78, }, "quux");
-    trace!(name: "foo", target: "foo_events", parent: &p, foo = 3, bar.baz = 2, quux = false);
-    trace!(name: "foo", target: "foo_events", parent: &p, foo = 3, bar.baz = 3,);
-    trace!(name: "foo", target: "foo_events", parent: &p, "foo");
-    trace!(name: "foo", target: "foo_events", parent: &p, "foo: {}", 3);
-    trace!(name: "foo", target: "foo_events", parent: &p, { foo = 3, bar.baz = 80 }, "quux");
-    trace!(name: "foo", target: "foo_events", parent: &p, { foo = 2, bar.baz = 79 }, "quux {:?}", true);
-    trace!(name: "foo", target: "foo_events", parent: &p, { foo = 2, bar.baz = 79 }, "quux {:?}, {quux}", true, quux = false);
-    trace!(name: "foo", target: "foo_events", parent: &p, { foo = 2, bar.baz = 78, }, "quux");
 }
 
 #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
@@ -1074,14 +814,6 @@
     debug!(target: "foo_events", parent: &p, { foo = 2, bar.baz = 79 }, "quux {:?}", true);
     debug!(target: "foo_events", parent: &p, { foo = 2, bar.baz = 79 }, "quux {:?}, {quux}", true, quux = false);
     debug!(target: "foo_events", parent: &p, { foo = 2, bar.baz = 78, }, "quux");
-    debug!(name: "foo", target: "foo_events", parent: &p, foo = 3, bar.baz = 2, quux = false);
-    debug!(name: "foo", target: "foo_events", parent: &p, foo = 3, bar.baz = 3,);
-    debug!(name: "foo", target: "foo_events", parent: &p, "foo");
-    debug!(name: "foo", target: "foo_events", parent: &p, "foo: {}", 3);
-    debug!(name: "foo", target: "foo_events", parent: &p, { foo = 3, bar.baz = 80 }, "quux");
-    debug!(name: "foo", target: "foo_events", parent: &p, { foo = 2, bar.baz = 79 }, "quux {:?}", true);
-    debug!(name: "foo", target: "foo_events", parent: &p, { foo = 2, bar.baz = 79 }, "quux {:?}, {quux}", true, quux = false);
-    debug!(name: "foo", target: "foo_events", parent: &p, { foo = 2, bar.baz = 78, }, "quux");
 }
 
 #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
@@ -1106,14 +838,6 @@
     info!(target: "foo_events", parent: &p, { foo = 2, bar.baz = 79 }, "quux {:?}", true);
     info!(target: "foo_events", parent: &p, { foo = 2, bar.baz = 79 }, "quux {:?}, {quux}", true, quux = false);
     info!(target: "foo_events", parent: &p, { foo = 2, bar.baz = 78, }, "quux");
-    info!(name: "foo", target: "foo_events", parent: &p, foo = 3, bar.baz = 2, quux = false);
-    info!(name: "foo", target: "foo_events", parent: &p, foo = 3, bar.baz = 3,);
-    info!(name: "foo", target: "foo_events", parent: &p, "foo");
-    info!(name: "foo", target: "foo_events", parent: &p, "foo: {}", 3);
-    info!(name: "foo", target: "foo_events", parent: &p, { foo = 3, bar.baz = 80 }, "quux");
-    info!(name: "foo", target: "foo_events", parent: &p, { foo = 2, bar.baz = 79 }, "quux {:?}", true);
-    info!(name: "foo", target: "foo_events", parent: &p, { foo = 2, bar.baz = 79 }, "quux {:?}, {quux}", true, quux = false);
-    info!(name: "foo", target: "foo_events", parent: &p, { foo = 2, bar.baz = 78, }, "quux");
 }
 
 #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
@@ -1138,14 +862,6 @@
     warn!(target: "foo_events", parent: &p, { foo = 2, bar.baz = 79 }, "quux {:?}", true);
     warn!(target: "foo_events", parent: &p, { foo = 2, bar.baz = 79 }, "quux {:?}, {quux}", true, quux = false);
     warn!(target: "foo_events", parent: &p, { foo = 2, bar.baz = 78, }, "quux");
-    warn!(name: "foo", target: "foo_events", parent: &p, foo = 3, bar.baz = 2, quux = false);
-    warn!(name: "foo", target: "foo_events", parent: &p, foo = 3, bar.baz = 3,);
-    warn!(name: "foo", target: "foo_events", parent: &p, "foo");
-    warn!(name: "foo", target: "foo_events", parent: &p, "foo: {}", 3);
-    warn!(name: "foo", target: "foo_events", parent: &p, { foo = 3, bar.baz = 80 }, "quux");
-    warn!(name: "foo", target: "foo_events", parent: &p, { foo = 2, bar.baz = 79 }, "quux {:?}", true);
-    warn!(name: "foo", target: "foo_events", parent: &p, { foo = 2, bar.baz = 79 }, "quux {:?}, {quux}", true, quux = false);
-    warn!(name: "foo", target: "foo_events", parent: &p, { foo = 2, bar.baz = 78, }, "quux");
 }
 
 #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
@@ -1170,14 +886,6 @@
     error!(target: "foo_events", parent: &p, { foo = 2, bar.baz = 79 }, "quux {:?}", true);
     error!(target: "foo_events", parent: &p, { foo = 2, bar.baz = 79 }, "quux {:?}, {quux}", true, quux = false);
     error!(target: "foo_events", parent: &p, { foo = 2, bar.baz = 78, }, "quux");
-    error!(name: "foo", target: "foo_events", parent: &p, foo = 3, bar.baz = 2, quux = false);
-    error!(name: "foo", target: "foo_events", parent: &p, foo = 3, bar.baz = 3,);
-    error!(name: "foo", target: "foo_events", parent: &p, "foo");
-    error!(name: "foo", target: "foo_events", parent: &p, "foo: {}", 3);
-    error!(name: "foo", target: "foo_events", parent: &p, { foo = 3, bar.baz = 80 }, "quux");
-    error!(name: "foo", target: "foo_events", parent: &p, { foo = 2, bar.baz = 79 }, "quux {:?}", true);
-    error!(name: "foo", target: "foo_events", parent: &p, { foo = 2, bar.baz = 79 }, "quux {:?}, {quux}", true, quux = false);
-    error!(name: "foo", target: "foo_events", parent: &p, { foo = 2, bar.baz = 78, }, "quux");
 }
 
 #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
@@ -1205,7 +913,7 @@
 #[test]
 fn borrow_val_events() {
     // Reproduces https://github.com/tokio-rs/tracing/issues/954
-    let mut foo = (::std::string::String::new(), ::std::string::String::new());
+    let mut foo = (String::new(), String::new());
     let zero = &mut foo.0;
     trace!(one = ?foo.1);
     debug!(one = ?foo.1);
@@ -1219,7 +927,7 @@
 #[test]
 fn borrow_val_spans() {
     // Reproduces https://github.com/tokio-rs/tracing/issues/954
-    let mut foo = (::std::string::String::new(), ::std::string::String::new());
+    let mut foo = (String::new(), String::new());
     let zero = &mut foo.0;
     let _span = trace_span!("span", one = ?foo.1);
     let _span = debug_span!("span", one = ?foo.1);
@@ -1253,19 +961,3 @@
         fields: foo,
     };
 }
-
-#[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
-#[test]
-fn format_args_already_defined() {
-    // Reproduces: https://github.com/tokio-rs/tracing/issues/2721
-    #[allow(unused)]
-    macro_rules! format_args {
-        ($i:expr) => {};
-    }
-    event!(Level::DEBUG, "foo: {}", 3);
-    trace!("foo: {}", 3);
-    debug!("foo: {}", 3);
-    info!("foo: {}", 3);
-    warn!("foo: {}", 3);
-    error!("foo: {}", 3);
-}
diff -Nru temporalio-1.3.0/vendor/tracing/tests/max_level_hint.rs temporalio-1.3.0/vendor/tracing/tests/max_level_hint.rs
--- temporalio-1.3.0/vendor/tracing/tests/max_level_hint.rs	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/tracing/tests/max_level_hint.rs	2023-10-30 19:40:00.000000000 +0000
@@ -20,10 +20,10 @@
             );
             true
         })
-        .event(expect::event().at_level(Level::INFO))
-        .event(expect::event().at_level(Level::WARN))
-        .event(expect::event().at_level(Level::ERROR))
-        .only()
+        .event(event::mock().at_level(Level::INFO))
+        .event(event::mock().at_level(Level::WARN))
+        .event(event::mock().at_level(Level::ERROR))
+        .done()
         .run_with_handle();
 
     tracing::subscriber::set_global_default(subscriber).unwrap();
diff -Nru temporalio-1.3.0/vendor/tracing/tests/multiple_max_level_hints.rs temporalio-1.3.0/vendor/tracing/tests/multiple_max_level_hints.rs
--- temporalio-1.3.0/vendor/tracing/tests/multiple_max_level_hints.rs	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/tracing/tests/multiple_max_level_hints.rs	2023-10-30 19:40:00.000000000 +0000
@@ -35,10 +35,10 @@
             );
             level <= &Level::INFO
         })
-        .event(expect::event().at_level(Level::INFO))
-        .event(expect::event().at_level(Level::WARN))
-        .event(expect::event().at_level(Level::ERROR))
-        .only()
+        .event(event::mock().at_level(Level::INFO))
+        .event(event::mock().at_level(Level::WARN))
+        .event(event::mock().at_level(Level::ERROR))
+        .done()
         .run_with_handle();
     let (subscriber2, handle2) = subscriber::mock()
         .named("subscriber2")
@@ -51,11 +51,11 @@
             );
             level <= &Level::DEBUG
         })
-        .event(expect::event().at_level(Level::INFO))
-        .event(expect::event().at_level(Level::DEBUG))
-        .event(expect::event().at_level(Level::WARN))
-        .event(expect::event().at_level(Level::ERROR))
-        .only()
+        .event(event::mock().at_level(Level::INFO))
+        .event(event::mock().at_level(Level::DEBUG))
+        .event(event::mock().at_level(Level::WARN))
+        .event(event::mock().at_level(Level::ERROR))
+        .done()
         .run_with_handle();
 
     let dispatch1 = tracing::Dispatch::new(subscriber1);
diff -Nru temporalio-1.3.0/vendor/tracing/tests/no_subscriber.rs temporalio-1.3.0/vendor/tracing/tests/no_subscriber.rs
--- temporalio-1.3.0/vendor/tracing/tests/no_subscriber.rs	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/tracing/tests/no_subscriber.rs	2023-10-30 19:40:00.000000000 +0000
@@ -1,15 +1,14 @@
 #![cfg(feature = "std")]
 
-use tracing_mock::subscriber;
+use tracing::subscriber::{self, NoSubscriber};
 
 #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
 #[test]
 fn no_subscriber_disables_global() {
     // Reproduces https://github.com/tokio-rs/tracing/issues/1999
-    let (subscriber, handle) = subscriber::mock().only().run_with_handle();
-    tracing::subscriber::set_global_default(subscriber)
-        .expect("setting global default must succeed");
-    tracing::subscriber::with_default(tracing::subscriber::NoSubscriber::default(), || {
+    let (subscriber, handle) = tracing_mock::subscriber::mock().done().run_with_handle();
+    subscriber::set_global_default(subscriber).expect("setting global default must succeed");
+    subscriber::with_default(NoSubscriber::default(), || {
         tracing::info!("this should not be recorded");
     });
     handle.assert_finished();
diff -Nru temporalio-1.3.0/vendor/tracing/tests/scoped_clobbers_default.rs temporalio-1.3.0/vendor/tracing/tests/scoped_clobbers_default.rs
--- temporalio-1.3.0/vendor/tracing/tests/scoped_clobbers_default.rs	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/tracing/tests/scoped_clobbers_default.rs	2023-10-30 19:40:00.000000000 +0000
@@ -8,12 +8,12 @@
     let (scoped, scoped_handle) = subscriber::mock()
         .event(event::msg("before global"))
         .event(event::msg("before drop"))
-        .only()
+        .done()
         .run_with_handle();
 
     let (global, global_handle) = subscriber::mock()
         .event(event::msg("after drop"))
-        .only()
+        .done()
         .run_with_handle();
 
     // Set a scoped default subscriber, returning a guard.
diff -Nru temporalio-1.3.0/vendor/tracing/tests/span.rs temporalio-1.3.0/vendor/tracing/tests/span.rs
--- temporalio-1.3.0/vendor/tracing/tests/span.rs	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/tracing/tests/span.rs	2023-10-30 19:40:00.000000000 +0000
@@ -21,12 +21,7 @@
     // expect to see any spans.
     with_default(subscriber::mock().run(), || {
         let foo1 = tracing::span!(Level::TRACE, "foo");
-
-        // The purpose of this test is to assert that two clones of the same
-        // span are equal, so the clone here is kind of the whole point :)
-        #[allow(clippy::redundant_clone)]
         let foo2 = foo1.clone();
-
         // Two handles that point to the same span are equal.
         assert_eq!(foo1, foo2);
     });
@@ -67,12 +62,12 @@
 #[test]
 fn spans_always_go_to_the_subscriber_that_tagged_them() {
     let subscriber1 = subscriber::mock()
-        .enter(expect::span().named("foo"))
-        .exit(expect::span().named("foo"))
-        .enter(expect::span().named("foo"))
-        .exit(expect::span().named("foo"))
-        .drop_span(expect::span().named("foo"))
-        .only()
+        .enter(span::mock().named("foo"))
+        .exit(span::mock().named("foo"))
+        .enter(span::mock().named("foo"))
+        .exit(span::mock().named("foo"))
+        .drop_span(span::mock().named("foo"))
+        .done()
         .run();
     let subscriber2 = subscriber::mock().run();
 
@@ -94,12 +89,12 @@
 #[test]
 fn spans_always_go_to_the_subscriber_that_tagged_them_even_across_threads() {
     let subscriber1 = subscriber::mock()
-        .enter(expect::span().named("foo"))
-        .exit(expect::span().named("foo"))
-        .enter(expect::span().named("foo"))
-        .exit(expect::span().named("foo"))
-        .drop_span(expect::span().named("foo"))
-        .only()
+        .enter(span::mock().named("foo"))
+        .exit(span::mock().named("foo"))
+        .enter(span::mock().named("foo"))
+        .exit(span::mock().named("foo"))
+        .drop_span(span::mock().named("foo"))
+        .done()
         .run();
     let foo = with_default(subscriber1, || {
         let foo = tracing::span!(Level::TRACE, "foo");
@@ -122,10 +117,10 @@
 #[test]
 fn dropping_a_span_calls_drop_span() {
     let (subscriber, handle) = subscriber::mock()
-        .enter(expect::span().named("foo"))
-        .exit(expect::span().named("foo"))
-        .drop_span(expect::span().named("foo"))
-        .only()
+        .enter(span::mock().named("foo"))
+        .exit(span::mock().named("foo"))
+        .drop_span(span::mock().named("foo"))
+        .done()
         .run_with_handle();
     with_default(subscriber, || {
         let span = tracing::span!(Level::TRACE, "foo");
@@ -140,11 +135,11 @@
 #[test]
 fn span_closes_after_event() {
     let (subscriber, handle) = subscriber::mock()
-        .enter(expect::span().named("foo"))
-        .event(expect::event())
-        .exit(expect::span().named("foo"))
-        .drop_span(expect::span().named("foo"))
-        .only()
+        .enter(span::mock().named("foo"))
+        .event(event::mock())
+        .exit(span::mock().named("foo"))
+        .drop_span(span::mock().named("foo"))
+        .done()
         .run_with_handle();
     with_default(subscriber, || {
         tracing::span!(Level::TRACE, "foo").in_scope(|| {
@@ -159,14 +154,14 @@
 #[test]
 fn new_span_after_event() {
     let (subscriber, handle) = subscriber::mock()
-        .enter(expect::span().named("foo"))
-        .event(expect::event())
-        .exit(expect::span().named("foo"))
-        .drop_span(expect::span().named("foo"))
-        .enter(expect::span().named("bar"))
-        .exit(expect::span().named("bar"))
-        .drop_span(expect::span().named("bar"))
-        .only()
+        .enter(span::mock().named("foo"))
+        .event(event::mock())
+        .exit(span::mock().named("foo"))
+        .drop_span(span::mock().named("foo"))
+        .enter(span::mock().named("bar"))
+        .exit(span::mock().named("bar"))
+        .drop_span(span::mock().named("bar"))
+        .done()
         .run_with_handle();
     with_default(subscriber, || {
         tracing::span!(Level::TRACE, "foo").in_scope(|| {
@@ -182,11 +177,11 @@
 #[test]
 fn event_outside_of_span() {
     let (subscriber, handle) = subscriber::mock()
-        .event(expect::event())
-        .enter(expect::span().named("foo"))
-        .exit(expect::span().named("foo"))
-        .drop_span(expect::span().named("foo"))
-        .only()
+        .event(event::mock())
+        .enter(span::mock().named("foo"))
+        .exit(span::mock().named("foo"))
+        .drop_span(span::mock().named("foo"))
+        .done()
         .run_with_handle();
     with_default(subscriber, || {
         tracing::debug!("my tracing::event!");
@@ -200,7 +195,7 @@
 #[test]
 fn cloning_a_span_calls_clone_span() {
     let (subscriber, handle) = subscriber::mock()
-        .clone_span(expect::span().named("foo"))
+        .clone_span(span::mock().named("foo"))
         .run_with_handle();
     with_default(subscriber, || {
         let span = tracing::span!(Level::TRACE, "foo");
@@ -216,9 +211,9 @@
 #[test]
 fn drop_span_when_exiting_dispatchers_context() {
     let (subscriber, handle) = subscriber::mock()
-        .clone_span(expect::span().named("foo"))
-        .drop_span(expect::span().named("foo"))
-        .drop_span(expect::span().named("foo"))
+        .clone_span(span::mock().named("foo"))
+        .drop_span(span::mock().named("foo"))
+        .drop_span(span::mock().named("foo"))
         .run_with_handle();
     with_default(subscriber, || {
         let span = tracing::span!(Level::TRACE, "foo");
@@ -233,15 +228,15 @@
 #[test]
 fn clone_and_drop_span_always_go_to_the_subscriber_that_tagged_the_span() {
     let (subscriber1, handle1) = subscriber::mock()
-        .enter(expect::span().named("foo"))
-        .exit(expect::span().named("foo"))
-        .clone_span(expect::span().named("foo"))
-        .enter(expect::span().named("foo"))
-        .exit(expect::span().named("foo"))
-        .drop_span(expect::span().named("foo"))
-        .drop_span(expect::span().named("foo"))
+        .enter(span::mock().named("foo"))
+        .exit(span::mock().named("foo"))
+        .clone_span(span::mock().named("foo"))
+        .enter(span::mock().named("foo"))
+        .exit(span::mock().named("foo"))
+        .drop_span(span::mock().named("foo"))
+        .drop_span(span::mock().named("foo"))
         .run_with_handle();
-    let subscriber2 = subscriber::mock().only().run();
+    let subscriber2 = subscriber::mock().done().run();
 
     let foo = with_default(subscriber1, || {
         let foo = tracing::span!(Level::TRACE, "foo");
@@ -264,10 +259,10 @@
 #[test]
 fn span_closes_when_exited() {
     let (subscriber, handle) = subscriber::mock()
-        .enter(expect::span().named("foo"))
-        .exit(expect::span().named("foo"))
-        .drop_span(expect::span().named("foo"))
-        .only()
+        .enter(span::mock().named("foo"))
+        .exit(span::mock().named("foo"))
+        .drop_span(span::mock().named("foo"))
+        .done()
         .run_with_handle();
     with_default(subscriber, || {
         let foo = tracing::span!(Level::TRACE, "foo");
@@ -284,11 +279,11 @@
 #[test]
 fn enter() {
     let (subscriber, handle) = subscriber::mock()
-        .enter(expect::span().named("foo"))
-        .event(expect::event())
-        .exit(expect::span().named("foo"))
-        .drop_span(expect::span().named("foo"))
-        .only()
+        .enter(span::mock().named("foo"))
+        .event(event::mock())
+        .exit(span::mock().named("foo"))
+        .drop_span(span::mock().named("foo"))
+        .done()
         .run_with_handle();
     with_default(subscriber, || {
         let foo = tracing::span!(Level::TRACE, "foo");
@@ -303,11 +298,11 @@
 #[test]
 fn entered() {
     let (subscriber, handle) = subscriber::mock()
-        .enter(expect::span().named("foo"))
-        .event(expect::event())
-        .exit(expect::span().named("foo"))
-        .drop_span(expect::span().named("foo"))
-        .only()
+        .enter(span::mock().named("foo"))
+        .event(event::mock())
+        .exit(span::mock().named("foo"))
+        .drop_span(span::mock().named("foo"))
+        .done()
         .run_with_handle();
     with_default(subscriber, || {
         let _span = tracing::span!(Level::TRACE, "foo").entered();
@@ -321,11 +316,11 @@
 #[test]
 fn entered_api() {
     let (subscriber, handle) = subscriber::mock()
-        .enter(expect::span().named("foo"))
-        .event(expect::event())
-        .exit(expect::span().named("foo"))
-        .drop_span(expect::span().named("foo"))
-        .only()
+        .enter(span::mock().named("foo"))
+        .event(event::mock())
+        .exit(span::mock().named("foo"))
+        .drop_span(span::mock().named("foo"))
+        .done()
         .run_with_handle();
     with_default(subscriber, || {
         let span = tracing::span!(Level::TRACE, "foo").entered();
@@ -342,16 +337,16 @@
 fn moved_field() {
     let (subscriber, handle) = subscriber::mock()
         .new_span(
-            expect::span().named("foo").with_field(
-                expect::field("bar")
+            span::mock().named("foo").with_field(
+                field::mock("bar")
                     .with_value(&display("hello from my span"))
                     .only(),
             ),
         )
-        .enter(expect::span().named("foo"))
-        .exit(expect::span().named("foo"))
-        .drop_span(expect::span().named("foo"))
-        .only()
+        .enter(span::mock().named("foo"))
+        .exit(span::mock().named("foo"))
+        .drop_span(span::mock().named("foo"))
+        .done()
         .run_with_handle();
     with_default(subscriber, || {
         let from = "my span";
@@ -371,11 +366,11 @@
 fn dotted_field_name() {
     let (subscriber, handle) = subscriber::mock()
         .new_span(
-            expect::span()
+            span::mock()
                 .named("foo")
-                .with_field(expect::field("fields.bar").with_value(&true).only()),
+                .with_field(field::mock("fields.bar").with_value(&true).only()),
         )
-        .only()
+        .done()
         .run_with_handle();
     with_default(subscriber, || {
         tracing::span!(Level::TRACE, "foo", fields.bar = true);
@@ -389,16 +384,16 @@
 fn borrowed_field() {
     let (subscriber, handle) = subscriber::mock()
         .new_span(
-            expect::span().named("foo").with_field(
-                expect::field("bar")
+            span::mock().named("foo").with_field(
+                field::mock("bar")
                     .with_value(&display("hello from my span"))
                     .only(),
             ),
         )
-        .enter(expect::span().named("foo"))
-        .exit(expect::span().named("foo"))
-        .drop_span(expect::span().named("foo"))
-        .only()
+        .enter(span::mock().named("foo"))
+        .exit(span::mock().named("foo"))
+        .drop_span(span::mock().named("foo"))
+        .done()
         .run_with_handle();
 
     with_default(subscriber, || {
@@ -432,17 +427,17 @@
     };
     let (subscriber, handle) = subscriber::mock()
         .new_span(
-            expect::span().named("foo").with_field(
-                expect::field("x")
+            span::mock().named("foo").with_field(
+                field::mock("x")
                     .with_value(&debug(3.234))
-                    .and(expect::field("y").with_value(&debug(-1.223)))
+                    .and(field::mock("y").with_value(&debug(-1.223)))
                     .only(),
             ),
         )
         .new_span(
-            expect::span()
+            span::mock()
                 .named("bar")
-                .with_field(expect::field("position").with_value(&debug(&pos)).only()),
+                .with_field(field::mock("position").with_value(&debug(&pos)).only()),
         )
         .run_with_handle();
 
@@ -465,10 +460,10 @@
 fn float_values() {
     let (subscriber, handle) = subscriber::mock()
         .new_span(
-            expect::span().named("foo").with_field(
-                expect::field("x")
+            span::mock().named("foo").with_field(
+                field::mock("x")
                     .with_value(&3.234)
-                    .and(expect::field("y").with_value(&-1.223))
+                    .and(field::mock("y").with_value(&-1.223))
                     .only(),
             ),
         )
@@ -490,19 +485,19 @@
 fn add_field_after_new_span() {
     let (subscriber, handle) = subscriber::mock()
         .new_span(
-            expect::span()
+            span::mock()
                 .named("foo")
-                .with_field(expect::field("bar").with_value(&5)
-                .and(expect::field("baz").with_value).only()),
+                .with_field(field::mock("bar").with_value(&5)
+                .and(field::mock("baz").with_value).only()),
         )
         .record(
-            expect::span().named("foo"),
-            field::expect("baz").with_value(&true).only(),
+            span::mock().named("foo"),
+            field::mock("baz").with_value(&true).only(),
         )
-        .enter(expect::span().named("foo"))
-        .exit(expect::span().named("foo"))
-        .drop_span(expect::span().named("foo"))
-        .only()
+        .enter(span::mock().named("foo"))
+        .exit(span::mock().named("foo"))
+        .drop_span(span::mock().named("foo"))
+        .done()
         .run_with_handle();
 
     with_default(subscriber, || {
@@ -518,19 +513,19 @@
 #[test]
 fn add_fields_only_after_new_span() {
     let (subscriber, handle) = subscriber::mock()
-        .new_span(expect::span().named("foo"))
+        .new_span(span::mock().named("foo"))
         .record(
-            expect::span().named("foo"),
-            field::expect("bar").with_value(&5).only(),
+            span::mock().named("foo"),
+            field::mock("bar").with_value(&5).only(),
         )
         .record(
-            expect::span().named("foo"),
-            field::expect("baz").with_value(&true).only(),
+            span::mock().named("foo"),
+            field::mock("baz").with_value(&true).only(),
         )
-        .enter(expect::span().named("foo"))
-        .exit(expect::span().named("foo"))
-        .drop_span(expect::span().named("foo"))
-        .only()
+        .enter(span::mock().named("foo"))
+        .exit(span::mock().named("foo"))
+        .drop_span(span::mock().named("foo"))
+        .done()
         .run_with_handle();
 
     with_default(subscriber, || {
@@ -549,26 +544,26 @@
 fn record_new_value_for_field() {
     let (subscriber, handle) = subscriber::mock()
         .new_span(
-            expect::span().named("foo").with_field(
-                expect::field("bar")
+            span::mock().named("foo").with_field(
+                field::mock("bar")
                     .with_value(&5)
-                    .and(expect::field("baz").with_value(&false))
+                    .and(field::mock("baz").with_value(&false))
                     .only(),
             ),
         )
         .record(
-            expect::span().named("foo"),
-            expect::field("baz").with_value(&true).only(),
+            span::mock().named("foo"),
+            field::mock("baz").with_value(&true).only(),
         )
-        .enter(expect::span().named("foo"))
-        .exit(expect::span().named("foo"))
-        .drop_span(expect::span().named("foo"))
-        .only()
+        .enter(span::mock().named("foo"))
+        .exit(span::mock().named("foo"))
+        .drop_span(span::mock().named("foo"))
+        .done()
         .run_with_handle();
 
     with_default(subscriber, || {
         let span = tracing::span!(Level::TRACE, "foo", bar = 5, baz = false);
-        span.record("baz", true);
+        span.record("baz", &true);
         span.in_scope(|| {})
     });
 
@@ -580,31 +575,31 @@
 fn record_new_values_for_fields() {
     let (subscriber, handle) = subscriber::mock()
         .new_span(
-            expect::span().named("foo").with_field(
-                expect::field("bar")
+            span::mock().named("foo").with_field(
+                field::mock("bar")
                     .with_value(&4)
-                    .and(expect::field("baz").with_value(&false))
+                    .and(field::mock("baz").with_value(&false))
                     .only(),
             ),
         )
         .record(
-            expect::span().named("foo"),
-            expect::field("bar").with_value(&5).only(),
+            span::mock().named("foo"),
+            field::mock("bar").with_value(&5).only(),
         )
         .record(
-            expect::span().named("foo"),
-            expect::field("baz").with_value(&true).only(),
+            span::mock().named("foo"),
+            field::mock("baz").with_value(&true).only(),
         )
-        .enter(expect::span().named("foo"))
-        .exit(expect::span().named("foo"))
-        .drop_span(expect::span().named("foo"))
-        .only()
+        .enter(span::mock().named("foo"))
+        .exit(span::mock().named("foo"))
+        .drop_span(span::mock().named("foo"))
+        .done()
         .run_with_handle();
 
     with_default(subscriber, || {
         let span = tracing::span!(Level::TRACE, "foo", bar = 4, baz = false);
-        span.record("bar", 5);
-        span.record("baz", true);
+        span.record("bar", &5);
+        span.record("baz", &true);
         span.in_scope(|| {})
     });
 
@@ -616,12 +611,12 @@
 fn new_span_with_target_and_log_level() {
     let (subscriber, handle) = subscriber::mock()
         .new_span(
-            expect::span()
+            span::mock()
                 .named("foo")
                 .with_target("app_span")
                 .at_level(Level::DEBUG),
         )
-        .only()
+        .done()
         .run_with_handle();
 
     with_default(subscriber, || {
@@ -635,8 +630,8 @@
 #[test]
 fn explicit_root_span_is_root() {
     let (subscriber, handle) = subscriber::mock()
-        .new_span(expect::span().named("foo").with_explicit_parent(None))
-        .only()
+        .new_span(span::mock().named("foo").with_explicit_parent(None))
+        .done()
         .run_with_handle();
 
     with_default(subscriber, || {
@@ -650,11 +645,11 @@
 #[test]
 fn explicit_root_span_is_root_regardless_of_ctx() {
     let (subscriber, handle) = subscriber::mock()
-        .new_span(expect::span().named("foo"))
-        .enter(expect::span().named("foo"))
-        .new_span(expect::span().named("bar").with_explicit_parent(None))
-        .exit(expect::span().named("foo"))
-        .only()
+        .new_span(span::mock().named("foo"))
+        .enter(span::mock().named("foo"))
+        .new_span(span::mock().named("bar").with_explicit_parent(None))
+        .exit(span::mock().named("foo"))
+        .done()
         .run_with_handle();
 
     with_default(subscriber, || {
@@ -670,13 +665,9 @@
 #[test]
 fn explicit_child() {
     let (subscriber, handle) = subscriber::mock()
-        .new_span(expect::span().named("foo"))
-        .new_span(
-            expect::span()
-                .named("bar")
-                .with_explicit_parent(Some("foo")),
-        )
-        .only()
+        .new_span(span::mock().named("foo"))
+        .new_span(span::mock().named("bar").with_explicit_parent(Some("foo")))
+        .done()
         .run_with_handle();
 
     with_default(subscriber, || {
@@ -691,13 +682,13 @@
 #[test]
 fn explicit_child_at_levels() {
     let (subscriber, handle) = subscriber::mock()
-        .new_span(expect::span().named("foo"))
-        .new_span(expect::span().named("a").with_explicit_parent(Some("foo")))
-        .new_span(expect::span().named("b").with_explicit_parent(Some("foo")))
-        .new_span(expect::span().named("c").with_explicit_parent(Some("foo")))
-        .new_span(expect::span().named("d").with_explicit_parent(Some("foo")))
-        .new_span(expect::span().named("e").with_explicit_parent(Some("foo")))
-        .only()
+        .new_span(span::mock().named("foo"))
+        .new_span(span::mock().named("a").with_explicit_parent(Some("foo")))
+        .new_span(span::mock().named("b").with_explicit_parent(Some("foo")))
+        .new_span(span::mock().named("c").with_explicit_parent(Some("foo")))
+        .new_span(span::mock().named("d").with_explicit_parent(Some("foo")))
+        .new_span(span::mock().named("e").with_explicit_parent(Some("foo")))
+        .done()
         .run_with_handle();
 
     with_default(subscriber, || {
@@ -716,16 +707,12 @@
 #[test]
 fn explicit_child_regardless_of_ctx() {
     let (subscriber, handle) = subscriber::mock()
-        .new_span(expect::span().named("foo"))
-        .new_span(expect::span().named("bar"))
-        .enter(expect::span().named("bar"))
-        .new_span(
-            expect::span()
-                .named("baz")
-                .with_explicit_parent(Some("foo")),
-        )
-        .exit(expect::span().named("bar"))
-        .only()
+        .new_span(span::mock().named("foo"))
+        .new_span(span::mock().named("bar"))
+        .enter(span::mock().named("bar"))
+        .new_span(span::mock().named("baz").with_explicit_parent(Some("foo")))
+        .exit(span::mock().named("bar"))
+        .done()
         .run_with_handle();
 
     with_default(subscriber, || {
@@ -741,8 +728,8 @@
 #[test]
 fn contextual_root() {
     let (subscriber, handle) = subscriber::mock()
-        .new_span(expect::span().named("foo").with_contextual_parent(None))
-        .only()
+        .new_span(span::mock().named("foo").with_contextual_parent(None))
+        .done()
         .run_with_handle();
 
     with_default(subscriber, || {
@@ -756,15 +743,15 @@
 #[test]
 fn contextual_child() {
     let (subscriber, handle) = subscriber::mock()
-        .new_span(expect::span().named("foo"))
-        .enter(expect::span().named("foo"))
+        .new_span(span::mock().named("foo"))
+        .enter(span::mock().named("foo"))
         .new_span(
-            expect::span()
+            span::mock()
                 .named("bar")
                 .with_contextual_parent(Some("foo")),
         )
-        .exit(expect::span().named("foo"))
-        .only()
+        .exit(span::mock().named("foo"))
+        .done()
         .run_with_handle();
 
     with_default(subscriber, || {
@@ -781,13 +768,13 @@
 fn display_shorthand() {
     let (subscriber, handle) = subscriber::mock()
         .new_span(
-            expect::span().named("my_span").with_field(
-                expect::field("my_field")
+            span::mock().named("my_span").with_field(
+                field::mock("my_field")
                     .with_value(&display("hello world"))
                     .only(),
             ),
         )
-        .only()
+        .done()
         .run_with_handle();
     with_default(subscriber, || {
         tracing::span!(Level::TRACE, "my_span", my_field = %"hello world");
@@ -801,13 +788,13 @@
 fn debug_shorthand() {
     let (subscriber, handle) = subscriber::mock()
         .new_span(
-            expect::span().named("my_span").with_field(
-                expect::field("my_field")
+            span::mock().named("my_span").with_field(
+                field::mock("my_field")
                     .with_value(&debug("hello world"))
                     .only(),
             ),
         )
-        .only()
+        .done()
         .run_with_handle();
     with_default(subscriber, || {
         tracing::span!(Level::TRACE, "my_span", my_field = ?"hello world");
@@ -821,48 +808,18 @@
 fn both_shorthands() {
     let (subscriber, handle) = subscriber::mock()
         .new_span(
-            expect::span().named("my_span").with_field(
-                expect::field("display_field")
+            span::mock().named("my_span").with_field(
+                field::mock("display_field")
                     .with_value(&display("hello world"))
-                    .and(expect::field("debug_field").with_value(&debug("hello world")))
+                    .and(field::mock("debug_field").with_value(&debug("hello world")))
                     .only(),
             ),
         )
-        .only()
+        .done()
         .run_with_handle();
     with_default(subscriber, || {
         tracing::span!(Level::TRACE, "my_span", display_field = %"hello world", debug_field = ?"hello world");
     });
 
     handle.assert_finished();
-}
-
-#[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
-#[test]
-fn constant_field_name() {
-    let (subscriber, handle) = subscriber::mock()
-        .new_span(
-            expect::span().named("my_span").with_field(
-                expect::field("foo")
-                    .with_value(&"bar")
-                    .and(expect::field("constant string").with_value(&"also works"))
-                    .and(expect::field("foo.bar").with_value(&"baz"))
-                    .only(),
-            ),
-        )
-        .only()
-        .run_with_handle();
-
-    with_default(subscriber, || {
-        const FOO: &str = "foo";
-        tracing::span!(
-            Level::TRACE,
-            "my_span",
-            { std::convert::identity(FOO) } = "bar",
-            { "constant string" } = "also works",
-            foo.bar = "baz",
-        );
-    });
-
-    handle.assert_finished();
 }
diff -Nru temporalio-1.3.0/vendor/tracing/tests/subscriber.rs temporalio-1.3.0/vendor/tracing/tests/subscriber.rs
--- temporalio-1.3.0/vendor/tracing/tests/subscriber.rs	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/tracing/tests/subscriber.rs	2023-10-30 19:40:00.000000000 +0000
@@ -11,7 +11,8 @@
     subscriber::{with_default, Interest, Subscriber},
     Event, Level, Metadata,
 };
-use tracing_mock::{expect, subscriber};
+
+use tracing_mock::*;
 
 #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
 #[test]
@@ -60,16 +61,16 @@
 fn boxed_subscriber() {
     let (subscriber, handle) = subscriber::mock()
         .new_span(
-            expect::span().named("foo").with_field(
-                expect::field("bar")
+            span::mock().named("foo").with_field(
+                field::mock("bar")
                     .with_value(&display("hello from my span"))
                     .only(),
             ),
         )
-        .enter(expect::span().named("foo"))
-        .exit(expect::span().named("foo"))
-        .drop_span(expect::span().named("foo"))
-        .only()
+        .enter(span::mock().named("foo"))
+        .exit(span::mock().named("foo"))
+        .drop_span(span::mock().named("foo"))
+        .done()
         .run_with_handle();
     let subscriber: Box = Box::new(subscriber);
 
@@ -93,20 +94,20 @@
 
     let (subscriber, handle) = subscriber::mock()
         .new_span(
-            expect::span().named("foo").with_field(
-                expect::field("bar")
+            span::mock().named("foo").with_field(
+                field::mock("bar")
                     .with_value(&display("hello from my span"))
                     .only(),
             ),
         )
-        .enter(expect::span().named("foo"))
-        .exit(expect::span().named("foo"))
-        .drop_span(expect::span().named("foo"))
+        .enter(span::mock().named("foo"))
+        .exit(span::mock().named("foo"))
+        .drop_span(span::mock().named("foo"))
         .event(
-            expect::event()
-                .with_fields(expect::field("message").with_value(&display("hello from my event"))),
+            event::mock()
+                .with_fields(field::mock("message").with_value(&display("hello from my event"))),
         )
-        .only()
+        .done()
         .run_with_handle();
     let subscriber: Arc = Arc::new(subscriber);
 
diff -Nru temporalio-1.3.0/vendor/tracing-attributes/.cargo-checksum.json temporalio-1.3.0/vendor/tracing-attributes/.cargo-checksum.json
--- temporalio-1.3.0/vendor/tracing-attributes/.cargo-checksum.json	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/tracing-attributes/.cargo-checksum.json	2023-10-30 19:40:00.000000000 +0000
@@ -1 +1 @@
-{"files":{"CHANGELOG.md":"e410a2cbd565bff62c52c66580bd3c7aa9bd81e4b73b5f4cdd0f7c5ab13b21de","Cargo.toml":"2cb782a6b7cb5412591a8457af156d081514ae846a81bec889a9f60f68a39dca","LICENSE":"898b1ae9821e98daf8964c8d6c7f61641f5f5aa78ad500020771c0939ee0dea1","README.md":"d878157a8f65779ef3d2e53d6772f99b5b79d7addccb6d04a2eb681ce1de99e1","src/attr.rs":"d0224a2a9be76743f039c86c1935622ca0b5b2e618b9323149855bf0e326fe48","src/expand.rs":"548b8d5fb5e92fe57a067bb656b88ceb403234521eed8bce4e0ec91b5fdacf78","src/lib.rs":"de2409d2cefba7a21739ac1021ea8e0dec892a342b1ecb46a81f66b782ea8f5b","tests/async_fn.rs":"66dab5e2a58119f588daae74efa47b5d8db0751cb99660856d792f352a3a263e","tests/destructuring.rs":"d920dca0b7db5b48697c1eb5a40ce676956760eb8bc2dcbe4c5ce1bc3631877b","tests/err.rs":"6b717be09a2447bcb0583a9b6a42b53361935b4a61093572c55f506f9d5f5cff","tests/fields.rs":"8babe90df46cfe9018caf20ef85060c90d611c5531b4d603f10f83a38744e7c2","tests/follows_from.rs":"d0478db45cb838d76f0d52f930847e8540b09456e2cd56591e56910c5e9985c6","tests/instrument.rs":"0c47bd9117858ecc585faab597115b7b49e2c79ae20172c32a6184674c8fd274","tests/levels.rs":"20483e9c7555991044b748f209def016d28da0a64eb9f85fabb489b0fb75a440","tests/names.rs":"2a67b33681cc7689c4d677de7a97b846df1817406a56a98ba91bf67b9f7d630a","tests/parents.rs":"95451328d8d7dba9020dc3eeb4ee56fc7f4591d5d38e793b815e621e73063da1","tests/ret.rs":"4628f562f8b0fb36a0dc13f488d70df8a545bd9b49422dfbf05fd2cab3870fc3","tests/targets.rs":"2065af7ff491be720c56d1b218b095a64e4573bf2586e49ce638c5ed4d639811","tests/ui.rs":"60ed69aba2cbf4b1a2f42b78703f7f21d8a69f62e39bb0509f6a2224cad9b9de","tests/ui/async_instrument.rs":"00fcde05841e8f9f6cc6f9434f8cc4baed5cf6e3ca73e8faddccbdace14e9485","tests/ui/async_instrument.stderr":"1d650a0914f0f59beeb88946a8ad6991feffe885016462ba917ea8e09792f866","tests/ui/const_instrument.rs":"253160848b023cbf73c3d1dece4969ff892ae9a3149e771159230733fa1cab1b","tests/ui/const_instrument.stderr":"86527fbc2410ceba8f051771fdb4bf71eb853e086a4e4d17353089c65b918c18"},"package":"34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7"}
\ No newline at end of file
+{"files":{"CHANGELOG.md":"51b693a78ec3115db6f20696605d5829a5928dc7270145810964f8edd4a5e574","Cargo.toml":"b8ad9f1020eeb1f1e495d7a693c825f7bdc3ee4bf29a72aeacbdef989870c61a","LICENSE":"898b1ae9821e98daf8964c8d6c7f61641f5f5aa78ad500020771c0939ee0dea1","README.md":"d878157a8f65779ef3d2e53d6772f99b5b79d7addccb6d04a2eb681ce1de99e1","src/attr.rs":"d0224a2a9be76743f039c86c1935622ca0b5b2e618b9323149855bf0e326fe48","src/expand.rs":"d2f3af4c987d79def03500d7a8cda1bd18c4da3e8395b500e37241968e38c7e0","src/lib.rs":"040047aa902ff3dc6d1b128a055de13d129d69fcd96b04f036223f4585d1fa1c","tests/async_fn.rs":"472a544e14b2141acd9d63e1cbe49f2610cfe8e924dff67b4d23c6a9121fc90f","tests/destructuring.rs":"26b9800678bad09e06512a113a54556e2fac3ecb15a18dcccefe105fb8911c26","tests/err.rs":"ef46724e62c4c307c2d0306e8689c1d4816df432709bfb7bbace7f8ceb67f86d","tests/fields.rs":"3882bd4e744d6b492f59beac7475e8bf4ff4ca8ad85c6951c305a22c78e75fae","tests/follows_from.rs":"f3cc336dac88533521b4cbe0b378fbcf1fb34e2d41a367b4726e98b49468309f","tests/instrument.rs":"dab616dac11043f82f91efbbb37c0dc5a375e51085449bf0b8d65c619f11166a","tests/levels.rs":"408a8eec7af33deba6a050ea9e59ed11e5e76a393f0a2549b11ddf683c0b785d","tests/names.rs":"5afd6c4d526588bcea3141c130a45a21872956495b6868a01b44ddff57749827","tests/parents.rs":"673d3f81eed6ba433f685ec53fd007c5dd957b97d32499d7ea1537e1f289cb2e","tests/ret.rs":"55473797667240c8f613b277360e68228e40047180b5f2828b13513873b9754e","tests/targets.rs":"95ce1ce1e2d29794062c5b3429d91c1bfaba5813251d5d8440c12cb2db6e11bf","tests/ui.rs":"60ed69aba2cbf4b1a2f42b78703f7f21d8a69f62e39bb0509f6a2224cad9b9de","tests/ui/async_instrument.rs":"00fcde05841e8f9f6cc6f9434f8cc4baed5cf6e3ca73e8faddccbdace14e9485","tests/ui/async_instrument.stderr":"1d650a0914f0f59beeb88946a8ad6991feffe885016462ba917ea8e09792f866","tests/ui/const_instrument.rs":"253160848b023cbf73c3d1dece4969ff892ae9a3149e771159230733fa1cab1b","tests/ui/const_instrument.stderr":"86527fbc2410ceba8f051771fdb4bf71eb853e086a4e4d17353089c65b918c18"},"package":"5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab"}
\ No newline at end of file
diff -Nru temporalio-1.3.0/vendor/tracing-attributes/Cargo.toml temporalio-1.3.0/vendor/tracing-attributes/Cargo.toml
--- temporalio-1.3.0/vendor/tracing-attributes/Cargo.toml	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/tracing-attributes/Cargo.toml	2023-10-30 19:40:00.000000000 +0000
@@ -13,7 +13,7 @@
 edition = "2018"
 rust-version = "1.56.0"
 name = "tracing-attributes"
-version = "0.1.27"
+version = "0.1.26"
 authors = [
     "Tokio Contributors ",
     "Eliza Weisman ",
@@ -43,7 +43,7 @@
 proc-macro = true
 
 [dependencies.proc-macro2]
-version = "1.0.60"
+version = "1.0.40"
 
 [dependencies.quote]
 version = "1.0.20"
diff -Nru temporalio-1.3.0/vendor/tracing-attributes/CHANGELOG.md temporalio-1.3.0/vendor/tracing-attributes/CHANGELOG.md
--- temporalio-1.3.0/vendor/tracing-attributes/CHANGELOG.md	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/tracing-attributes/CHANGELOG.md	2023-10-30 19:40:00.000000000 +0000
@@ -1,18 +1,3 @@
-# 0.1.27 (October 13, 2023)
-
-### Changed
-
-- Bump minimum version of proc-macro2 to 1.0.60 ([#2732])
-- Generate less dead code for async block return type hint ([#2709])
-
-### Fixed
-
-- Fix a compilation error in `#[instrument]` when the `"log"` feature is enabled ([#2599])
-
-[#2732]: https://github.com/tokio-rs/tracing/pull/2732
-[#2709]: https://github.com/tokio-rs/tracing/pull/2709
-[#2599]: https://github.com/tokio-rs/tracing/pull/2599
-
 # 0.1.26 (June 21th, 2023)
 
 This release of `tracing-attributes` fixes warnings due to `allow` attributes in
diff -Nru temporalio-1.3.0/vendor/tracing-attributes/src/expand.rs temporalio-1.3.0/vendor/tracing-attributes/src/expand.rs
--- temporalio-1.3.0/vendor/tracing-attributes/src/expand.rs	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/tracing-attributes/src/expand.rs	2023-10-30 19:40:00.000000000 +0000
@@ -66,11 +66,11 @@
     let fake_return_edge = quote_spanned! {return_span=>
         #[allow(
             unknown_lints, unreachable_code, clippy::diverging_sub_expression,
-            clippy::let_unit_value, clippy::unreachable, clippy::let_with_type_underscore,
-            clippy::empty_loop
+            clippy::let_unit_value, clippy::unreachable, clippy::let_with_type_underscore
         )]
         if false {
-            let __tracing_attr_fake_return: #return_type = loop {};
+            let __tracing_attr_fake_return: #return_type =
+                unreachable!("this is just for type inference, and is unreachable code");
             return __tracing_attr_fake_return;
         }
     };
@@ -343,7 +343,7 @@
         // regression in case the level is enabled.
         let __tracing_attr_span;
         let __tracing_attr_guard;
-        if tracing::level_enabled!(#level) || tracing::if_log_enabled!(#level, {true} else {false}) {
+        if tracing::level_enabled!(#level) {
             __tracing_attr_span = #span;
             #follows_from
             __tracing_attr_guard = __tracing_attr_span.enter();
diff -Nru temporalio-1.3.0/vendor/tracing-attributes/src/lib.rs temporalio-1.3.0/vendor/tracing-attributes/src/lib.rs
--- temporalio-1.3.0/vendor/tracing-attributes/src/lib.rs	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/tracing-attributes/src/lib.rs	2023-10-30 19:40:00.000000000 +0000
@@ -91,7 +91,7 @@
 /// Instruments a function to create and enter a `tracing` [span] every time
 /// the function is called.
 ///
-/// Unless overridden, a span with the [`INFO`] [level] will be generated.
+/// Unless overriden, a span with the [`INFO`] [level] will be generated.
 /// The generated span's name will be the name of the function.
 /// By default, all arguments to the function are included as fields on the
 /// span. Arguments that are `tracing` [primitive types] implementing the
diff -Nru temporalio-1.3.0/vendor/tracing-attributes/tests/async_fn.rs temporalio-1.3.0/vendor/tracing-attributes/tests/async_fn.rs
--- temporalio-1.3.0/vendor/tracing-attributes/tests/async_fn.rs	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/tracing-attributes/tests/async_fn.rs	2023-10-30 19:40:00.000000000 +0000
@@ -17,6 +17,7 @@
 #[allow(dead_code)] // this is just here to test whether it compiles.
 #[instrument]
 async fn test_ret_impl_trait(n: i32) -> Result, ()> {
+    let n = n;
     Ok((0..10).filter(move |x| *x < n))
 }
 
@@ -83,16 +84,16 @@
 #[test]
 fn async_fn_only_enters_for_polls() {
     let (subscriber, handle) = subscriber::mock()
-        .new_span(expect::span().named("test_async_fn"))
-        .enter(expect::span().named("test_async_fn"))
-        .event(expect::event().with_fields(expect::field("awaiting").with_value(&true)))
-        .exit(expect::span().named("test_async_fn"))
-        .enter(expect::span().named("test_async_fn"))
-        .exit(expect::span().named("test_async_fn"))
-        .enter(expect::span().named("test_async_fn"))
-        .exit(expect::span().named("test_async_fn"))
-        .drop_span(expect::span().named("test_async_fn"))
-        .only()
+        .new_span(span::mock().named("test_async_fn"))
+        .enter(span::mock().named("test_async_fn"))
+        .event(event::mock().with_fields(field::mock("awaiting").with_value(&true)))
+        .exit(span::mock().named("test_async_fn"))
+        .enter(span::mock().named("test_async_fn"))
+        .exit(span::mock().named("test_async_fn"))
+        .enter(span::mock().named("test_async_fn"))
+        .exit(span::mock().named("test_async_fn"))
+        .drop_span(span::mock().named("test_async_fn"))
+        .done()
         .run_with_handle();
     with_default(subscriber, || {
         block_on_future(async { test_async_fn(2).await }).unwrap();
@@ -112,14 +113,14 @@
         tracing::trace!(nested = true);
     }
 
-    let span = expect::span().named("test_async_fns_nested");
-    let span2 = expect::span().named("test_async_fns_nested_other");
+    let span = span::mock().named("test_async_fns_nested");
+    let span2 = span::mock().named("test_async_fns_nested_other");
     let (subscriber, handle) = subscriber::mock()
         .new_span(span.clone())
         .enter(span.clone())
         .new_span(span2.clone())
         .enter(span2.clone())
-        .event(expect::event().with_fields(expect::field("nested").with_value(&true)))
+        .event(event::mock().with_fields(field::mock("nested").with_value(&true)))
         .exit(span2.clone())
         .enter(span2.clone())
         .exit(span2.clone())
@@ -128,7 +129,7 @@
         .enter(span.clone())
         .exit(span.clone())
         .drop_span(span)
-        .only()
+        .done()
         .run_with_handle();
 
     with_default(subscriber, || {
@@ -190,26 +191,26 @@
         }
     }
 
-    let span = expect::span().named("foo");
-    let span2 = expect::span().named("bar");
-    let span3 = expect::span().named("baz");
+    let span = span::mock().named("foo");
+    let span2 = span::mock().named("bar");
+    let span3 = span::mock().named("baz");
     let (subscriber, handle) = subscriber::mock()
         .new_span(
             span.clone()
-                .with_field(expect::field("self"))
-                .with_field(expect::field("v")),
+                .with_field(field::mock("self"))
+                .with_field(field::mock("v")),
         )
         .enter(span.clone())
         .new_span(span3.clone())
         .enter(span3.clone())
-        .event(expect::event().with_fields(expect::field("val").with_value(&2u64)))
+        .event(event::mock().with_fields(field::mock("val").with_value(&2u64)))
         .exit(span3.clone())
         .enter(span3.clone())
         .exit(span3.clone())
         .drop_span(span3)
-        .new_span(span2.clone().with_field(expect::field("self")))
+        .new_span(span2.clone().with_field(field::mock("self")))
         .enter(span2.clone())
-        .event(expect::event().with_fields(expect::field("val").with_value(&5u64)))
+        .event(event::mock().with_fields(field::mock("val").with_value(&5u64)))
         .exit(span2.clone())
         .enter(span2.clone())
         .exit(span2.clone())
@@ -218,7 +219,7 @@
         .enter(span.clone())
         .exit(span.clone())
         .drop_span(span)
-        .only()
+        .done()
         .run_with_handle();
 
     with_default(subscriber, || {
@@ -254,15 +255,15 @@
         async fn call(&mut self, _v: usize) {}
     }
 
-    let span = expect::span().named("call");
+    let span = span::mock().named("call");
     let (subscriber, handle) = subscriber::mock()
         .new_span(
             span.clone().with_field(
-                expect::field("_v")
+                field::mock("_v")
                     .with_value(&5usize)
-                    .and(expect::field("test").with_value(&tracing::field::debug(10)))
-                    .and(expect::field("val").with_value(&42u64))
-                    .and(expect::field("val2").with_value(&42u64)),
+                    .and(field::mock("test").with_value(&tracing::field::debug(10)))
+                    .and(field::mock("val").with_value(&42u64))
+                    .and(field::mock("val2").with_value(&42u64)),
             ),
         )
         .enter(span.clone())
@@ -270,7 +271,7 @@
         .enter(span.clone())
         .exit(span.clone())
         .drop_span(span)
-        .only()
+        .done()
         .run_with_handle();
 
     with_default(subscriber, || {
@@ -322,26 +323,26 @@
     }
 
     //let span = span::mock().named("call");
-    let span2 = expect::span().named("call_with_self");
-    let span3 = expect::span().named("call_with_mut_self");
-    let span4 = expect::span().named("sync_fun");
+    let span2 = span::mock().named("call_with_self");
+    let span3 = span::mock().named("call_with_mut_self");
+    let span4 = span::mock().named("sync_fun");
     let (subscriber, handle) = subscriber::mock()
         /*.new_span(span.clone()
             .with_field(
-                expect::field("Self").with_value(&"TestImpler")))
+                field::mock("Self").with_value(&"TestImpler")))
         .enter(span.clone())
         .exit(span.clone())
         .drop_span(span)*/
         .new_span(
             span2
                 .clone()
-                .with_field(expect::field("Self").with_value(&std::any::type_name::())),
+                .with_field(field::mock("Self").with_value(&std::any::type_name::())),
         )
         .enter(span2.clone())
         .new_span(
             span4
                 .clone()
-                .with_field(expect::field("Self").with_value(&std::any::type_name::())),
+                .with_field(field::mock("Self").with_value(&std::any::type_name::())),
         )
         .enter(span4.clone())
         .exit(span4.clone())
@@ -354,14 +355,14 @@
         .new_span(
             span3
                 .clone()
-                .with_field(expect::field("Self").with_value(&std::any::type_name::())),
+                .with_field(field::mock("Self").with_value(&std::any::type_name::())),
         )
         .enter(span3.clone())
         .exit(span3.clone())
         .enter(span3.clone())
         .exit(span3.clone())
         .drop_span(span3)
-        .only()
+        .done()
         .run_with_handle();
 
     with_default(subscriber, || {
@@ -396,7 +397,7 @@
         }
     }
 
-    let span = expect::span().named("call");
+    let span = span::mock().named("call");
     let (subscriber, handle) = subscriber::mock()
         .new_span(span.clone())
         .enter(span.clone())
@@ -404,7 +405,7 @@
         .enter(span.clone())
         .exit(span.clone())
         .drop_span(span)
-        .only()
+        .done()
         .run_with_handle();
 
     with_default(subscriber, || {
@@ -429,8 +430,8 @@
         }
     }
 
-    let span = expect::span().named("manual_impl_future");
-    let poll_event = || expect::event().with_fields(expect::field("poll").with_value(&true));
+    let span = span::mock().named("manual_impl_future");
+    let poll_event = || event::mock().with_fields(field::mock("poll").with_value(&true));
 
     let (subscriber, handle) = subscriber::mock()
         // await manual_impl_future
@@ -441,7 +442,7 @@
         .enter(span.clone())
         .exit(span.clone())
         .drop_span(span)
-        .only()
+        .done()
         .run_with_handle();
 
     with_default(subscriber, || {
@@ -462,8 +463,8 @@
         })
     }
 
-    let span = expect::span().named("manual_box_pin");
-    let poll_event = || expect::event().with_fields(expect::field("poll").with_value(&true));
+    let span = span::mock().named("manual_box_pin");
+    let poll_event = || event::mock().with_fields(field::mock("poll").with_value(&true));
 
     let (subscriber, handle) = subscriber::mock()
         // await manual_box_pin
@@ -474,7 +475,7 @@
         .enter(span.clone())
         .exit(span.clone())
         .drop_span(span)
-        .only()
+        .done()
         .run_with_handle();
 
     with_default(subscriber, || {
diff -Nru temporalio-1.3.0/vendor/tracing-attributes/tests/destructuring.rs temporalio-1.3.0/vendor/tracing-attributes/tests/destructuring.rs
--- temporalio-1.3.0/vendor/tracing-attributes/tests/destructuring.rs	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/tracing-attributes/tests/destructuring.rs	2023-10-30 19:40:00.000000000 +0000
@@ -7,21 +7,21 @@
     #[instrument]
     fn my_fn((arg1, arg2): (usize, usize)) {}
 
-    let span = expect::span().named("my_fn");
+    let span = span::mock().named("my_fn");
 
     let (subscriber, handle) = subscriber::mock()
         .new_span(
             span.clone().with_field(
-                expect::field("arg1")
+                field::mock("arg1")
                     .with_value(&format_args!("1"))
-                    .and(expect::field("arg2").with_value(&format_args!("2")))
+                    .and(field::mock("arg2").with_value(&format_args!("2")))
                     .only(),
             ),
         )
         .enter(span.clone())
         .exit(span.clone())
         .drop_span(span)
-        .only()
+        .done()
         .run_with_handle();
 
     with_default(subscriber, || {
@@ -36,23 +36,23 @@
     #[instrument]
     fn my_fn(((arg1, arg2), (arg3, arg4)): ((usize, usize), (usize, usize))) {}
 
-    let span = expect::span().named("my_fn");
+    let span = span::mock().named("my_fn");
 
     let (subscriber, handle) = subscriber::mock()
         .new_span(
             span.clone().with_field(
-                expect::field("arg1")
+                field::mock("arg1")
                     .with_value(&format_args!("1"))
-                    .and(expect::field("arg2").with_value(&format_args!("2")))
-                    .and(expect::field("arg3").with_value(&format_args!("3")))
-                    .and(expect::field("arg4").with_value(&format_args!("4")))
+                    .and(field::mock("arg2").with_value(&format_args!("2")))
+                    .and(field::mock("arg3").with_value(&format_args!("3")))
+                    .and(field::mock("arg4").with_value(&format_args!("4")))
                     .only(),
             ),
         )
         .enter(span.clone())
         .exit(span.clone())
         .drop_span(span)
-        .only()
+        .done()
         .run_with_handle();
 
     with_default(subscriber, || {
@@ -67,17 +67,17 @@
     #[instrument]
     fn my_fn(&arg1: &usize) {}
 
-    let span = expect::span().named("my_fn");
+    let span = span::mock().named("my_fn");
 
     let (subscriber, handle) = subscriber::mock()
         .new_span(
             span.clone()
-                .with_field(expect::field("arg1").with_value(&1usize).only()),
+                .with_field(field::mock("arg1").with_value(&1usize).only()),
         )
         .enter(span.clone())
         .exit(span.clone())
         .drop_span(span)
-        .only()
+        .done()
         .run_with_handle();
 
     with_default(subscriber, || {
@@ -94,21 +94,21 @@
     #[instrument]
     fn my_fn(Foo(arg1, arg2): Foo) {}
 
-    let span = expect::span().named("my_fn");
+    let span = span::mock().named("my_fn");
 
     let (subscriber, handle) = subscriber::mock()
         .new_span(
             span.clone().with_field(
-                expect::field("arg1")
+                field::mock("arg1")
                     .with_value(&format_args!("1"))
-                    .and(expect::field("arg2").with_value(&format_args!("2")))
+                    .and(field::mock("arg2").with_value(&format_args!("2")))
                     .only(),
             ),
         )
         .enter(span.clone())
         .exit(span.clone())
         .drop_span(span)
-        .only()
+        .done()
         .run_with_handle();
 
     with_default(subscriber, || {
@@ -135,21 +135,21 @@
         let _ = (arg1, arg2);
     }
 
-    let span = expect::span().named("my_fn");
+    let span = span::mock().named("my_fn");
 
     let (subscriber, handle) = subscriber::mock()
         .new_span(
             span.clone().with_field(
-                expect::field("arg1")
+                field::mock("arg1")
                     .with_value(&format_args!("1"))
-                    .and(expect::field("arg2").with_value(&format_args!("2")))
+                    .and(field::mock("arg2").with_value(&format_args!("2")))
                     .only(),
             ),
         )
         .enter(span.clone())
         .exit(span.clone())
         .drop_span(span)
-        .only()
+        .done()
         .run_with_handle();
 
     with_default(subscriber, || {
@@ -180,23 +180,23 @@
         let _ = (arg1, arg2, arg3, arg4);
     }
 
-    let span = expect::span().named("my_fn");
+    let span = span::mock().named("my_fn");
 
     let (subscriber, handle) = subscriber::mock()
         .new_span(
             span.clone().with_field(
-                expect::field("arg1")
+                field::mock("arg1")
                     .with_value(&format_args!("1"))
-                    .and(expect::field("arg2").with_value(&format_args!("2")))
-                    .and(expect::field("arg3").with_value(&format_args!("3")))
-                    .and(expect::field("arg4").with_value(&format_args!("4")))
+                    .and(field::mock("arg2").with_value(&format_args!("2")))
+                    .and(field::mock("arg3").with_value(&format_args!("3")))
+                    .and(field::mock("arg4").with_value(&format_args!("4")))
                     .only(),
             ),
         )
         .enter(span.clone())
         .exit(span.clone())
         .drop_span(span)
-        .only()
+        .done()
         .run_with_handle();
 
     with_default(subscriber, || {
diff -Nru temporalio-1.3.0/vendor/tracing-attributes/tests/err.rs temporalio-1.3.0/vendor/tracing-attributes/tests/err.rs
--- temporalio-1.3.0/vendor/tracing-attributes/tests/err.rs	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/tracing-attributes/tests/err.rs	2023-10-30 19:40:00.000000000 +0000
@@ -21,41 +21,20 @@
 
 #[test]
 fn test() {
-    let span = expect::span().named("err");
+    let span = span::mock().named("err");
     let (subscriber, handle) = subscriber::mock()
         .new_span(span.clone())
         .enter(span.clone())
-        .event(expect::event().at_level(Level::ERROR))
+        .event(event::mock().at_level(Level::ERROR))
         .exit(span.clone())
         .drop_span(span)
-        .only()
+        .done()
         .run_with_handle();
     with_default(subscriber, || err().ok());
     handle.assert_finished();
 }
 
 #[instrument(err)]
-fn err_early_return() -> Result {
-    u8::try_from(1234)?;
-    Ok(5)
-}
-
-#[test]
-fn test_early_return() {
-    let span = expect::span().named("err_early_return");
-    let (subscriber, handle) = subscriber::mock()
-        .new_span(span.clone())
-        .enter(span.clone())
-        .event(expect::event().at_level(Level::ERROR))
-        .exit(span.clone())
-        .drop_span(span)
-        .only()
-        .run_with_handle();
-    with_default(subscriber, || err_early_return().ok());
-    handle.assert_finished();
-}
-
-#[instrument(err)]
 async fn err_async(polls: usize) -> Result {
     let future = PollN::new_ok(polls);
     tracing::trace!(awaiting = true);
@@ -65,23 +44,23 @@
 
 #[test]
 fn test_async() {
-    let span = expect::span().named("err_async");
+    let span = span::mock().named("err_async");
     let (subscriber, handle) = subscriber::mock()
         .new_span(span.clone())
         .enter(span.clone())
         .event(
-            expect::event()
-                .with_fields(expect::field("awaiting").with_value(&true))
+            event::mock()
+                .with_fields(field::mock("awaiting").with_value(&true))
                 .at_level(Level::TRACE),
         )
         .exit(span.clone())
         .enter(span.clone())
-        .event(expect::event().at_level(Level::ERROR))
+        .event(event::mock().at_level(Level::ERROR))
         .exit(span.clone())
         .enter(span.clone())
         .exit(span.clone())
         .drop_span(span)
-        .only()
+        .done()
         .run_with_handle();
     with_default(subscriber, || {
         block_on_future(async { err_async(2).await }).ok();
@@ -97,14 +76,14 @@
 
 #[test]
 fn test_mut() {
-    let span = expect::span().named("err_mut");
+    let span = span::mock().named("err_mut");
     let (subscriber, handle) = subscriber::mock()
         .new_span(span.clone())
         .enter(span.clone())
-        .event(expect::event().at_level(Level::ERROR))
+        .event(event::mock().at_level(Level::ERROR))
         .exit(span.clone())
         .drop_span(span)
-        .only()
+        .done()
         .run_with_handle();
     with_default(subscriber, || err_mut(&mut 0).ok());
     handle.assert_finished();
@@ -121,23 +100,23 @@
 
 #[test]
 fn test_mut_async() {
-    let span = expect::span().named("err_mut_async");
+    let span = span::mock().named("err_mut_async");
     let (subscriber, handle) = subscriber::mock()
         .new_span(span.clone())
         .enter(span.clone())
         .event(
-            expect::event()
-                .with_fields(expect::field("awaiting").with_value(&true))
+            event::mock()
+                .with_fields(field::mock("awaiting").with_value(&true))
                 .at_level(Level::TRACE),
         )
         .exit(span.clone())
         .enter(span.clone())
-        .event(expect::event().at_level(Level::ERROR))
+        .event(event::mock().at_level(Level::ERROR))
         .exit(span.clone())
         .enter(span.clone())
         .exit(span.clone())
         .drop_span(span)
-        .only()
+        .done()
         .run_with_handle();
     with_default(subscriber, || {
         block_on_future(async { err_mut_async(2, &mut 0).await }).ok();
@@ -154,17 +133,17 @@
         Ok(0..x)
     }
 
-    let span = expect::span().named("returns_impl_trait");
+    let span = span::mock().named("returns_impl_trait");
 
     let (subscriber, handle) = subscriber::mock()
         .new_span(
             span.clone()
-                .with_field(expect::field("x").with_value(&10usize).only()),
+                .with_field(field::mock("x").with_value(&10usize).only()),
         )
         .enter(span.clone())
         .exit(span.clone())
         .drop_span(span)
-        .only()
+        .done()
         .run_with_handle();
 
     with_default(subscriber, || {
@@ -183,13 +162,13 @@
 
 #[test]
 fn test_err_dbg() {
-    let span = expect::span().named("err_dbg");
+    let span = span::mock().named("err_dbg");
     let (subscriber, handle) = subscriber::mock()
         .new_span(span.clone())
         .enter(span.clone())
         .event(
-            expect::event().at_level(Level::ERROR).with_fields(
-                expect::field("error")
+            event::mock().at_level(Level::ERROR).with_fields(
+                field::mock("error")
                     // use the actual error value that will be emitted, so
                     // that this test doesn't break if the standard library
                     // changes the `fmt::Debug` output from the error type
@@ -199,7 +178,7 @@
         )
         .exit(span.clone())
         .drop_span(span)
-        .only()
+        .done()
         .run_with_handle();
     with_default(subscriber, || err_dbg().ok());
     handle.assert_finished();
@@ -207,20 +186,20 @@
 
 #[test]
 fn test_err_display_default() {
-    let span = expect::span().named("err");
+    let span = span::mock().named("err");
     let (subscriber, handle) = subscriber::mock()
         .new_span(span.clone())
         .enter(span.clone())
         .event(
-            expect::event().at_level(Level::ERROR).with_fields(
-                expect::field("error")
+            event::mock().at_level(Level::ERROR).with_fields(
+                field::mock("error")
                     // by default, errors will be emitted with their display values
                     .with_value(&tracing::field::display(u8::try_from(1234).unwrap_err())),
             ),
         )
         .exit(span.clone())
         .drop_span(span)
-        .only()
+        .done()
         .run_with_handle();
     with_default(subscriber, || err().ok());
     handle.assert_finished();
@@ -229,19 +208,19 @@
 #[test]
 fn test_err_custom_target() {
     let filter: EnvFilter = "my_target=error".parse().expect("filter should parse");
-    let span = expect::span().named("error_span").with_target("my_target");
+    let span = span::mock().named("error_span").with_target("my_target");
 
     let (subscriber, handle) = subscriber::mock()
         .new_span(span.clone())
         .enter(span.clone())
         .event(
-            expect::event()
+            event::mock()
                 .at_level(Level::ERROR)
                 .with_target("my_target"),
         )
         .exit(span.clone())
         .drop_span(span)
-        .only()
+        .done()
         .run_with_handle();
 
     let subscriber = subscriber.with(filter);
@@ -264,14 +243,14 @@
 
 #[test]
 fn test_err_info() {
-    let span = expect::span().named("err_info");
+    let span = span::mock().named("err_info");
     let (subscriber, handle) = subscriber::mock()
         .new_span(span.clone())
         .enter(span.clone())
-        .event(expect::event().at_level(Level::INFO))
+        .event(event::mock().at_level(Level::INFO))
         .exit(span.clone())
         .drop_span(span)
-        .only()
+        .done()
         .run_with_handle();
     with_default(subscriber, || err_info().ok());
     handle.assert_finished();
@@ -284,13 +263,13 @@
 
 #[test]
 fn test_err_dbg_info() {
-    let span = expect::span().named("err_dbg_info");
+    let span = span::mock().named("err_dbg_info");
     let (subscriber, handle) = subscriber::mock()
         .new_span(span.clone())
         .enter(span.clone())
         .event(
-            expect::event().at_level(Level::INFO).with_fields(
-                expect::field("error")
+            event::mock().at_level(Level::INFO).with_fields(
+                field::mock("error")
                     // use the actual error value that will be emitted, so
                     // that this test doesn't break if the standard library
                     // changes the `fmt::Debug` output from the error type
@@ -300,7 +279,7 @@
         )
         .exit(span.clone())
         .drop_span(span)
-        .only()
+        .done()
         .run_with_handle();
     with_default(subscriber, || err_dbg_info().ok());
     handle.assert_finished();
@@ -313,14 +292,14 @@
 
 #[test]
 fn test_err_warn_info() {
-    let span = expect::span().named("err_warn_info").at_level(Level::WARN);
+    let span = span::mock().named("err_warn_info").at_level(Level::WARN);
     let (subscriber, handle) = subscriber::mock()
         .new_span(span.clone())
         .enter(span.clone())
-        .event(expect::event().at_level(Level::INFO))
+        .event(event::mock().at_level(Level::INFO))
         .exit(span.clone())
         .drop_span(span)
-        .only()
+        .done()
         .run_with_handle();
     with_default(subscriber, || err_warn_info().ok());
     handle.assert_finished();
diff -Nru temporalio-1.3.0/vendor/tracing-attributes/tests/fields.rs temporalio-1.3.0/vendor/tracing-attributes/tests/fields.rs
--- temporalio-1.3.0/vendor/tracing-attributes/tests/fields.rs	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/tracing-attributes/tests/fields.rs	2023-10-30 19:40:00.000000000 +0000
@@ -1,6 +1,8 @@
 use tracing::subscriber::with_default;
 use tracing_attributes::instrument;
-use tracing_mock::{expect, span::NewSpan, subscriber};
+use tracing_mock::field::mock;
+use tracing_mock::span::NewSpan;
+use tracing_mock::*;
 
 #[instrument(fields(foo = "bar", dsa = true, num = 1))]
 fn fn_no_param() {}
@@ -46,11 +48,11 @@
 
 #[test]
 fn fields() {
-    let span = expect::span().with_field(
-        expect::field("foo")
+    let span = span::mock().with_field(
+        mock("foo")
             .with_value(&"bar")
-            .and(expect::field("dsa").with_value(&true))
-            .and(expect::field("num").with_value(&1))
+            .and(mock("dsa").with_value(&true))
+            .and(mock("num").with_value(&1))
             .only(),
     );
     run_test(span, || {
@@ -60,10 +62,10 @@
 
 #[test]
 fn expr_field() {
-    let span = expect::span().with_field(
-        expect::field("s")
+    let span = span::mock().with_field(
+        mock("s")
             .with_value(&"hello world")
-            .and(expect::field("len").with_value(&"hello world".len()))
+            .and(mock("len").with_value(&"hello world".len()))
             .only(),
     );
     run_test(span, || {
@@ -73,11 +75,11 @@
 
 #[test]
 fn two_expr_fields() {
-    let span = expect::span().with_field(
-        expect::field("s")
+    let span = span::mock().with_field(
+        mock("s")
             .with_value(&"hello world")
-            .and(expect::field("s.len").with_value(&"hello world".len()))
-            .and(expect::field("s.is_empty").with_value(&false))
+            .and(mock("s.len").with_value(&"hello world".len()))
+            .and(mock("s.is_empty").with_value(&false))
             .only(),
     );
     run_test(span, || {
@@ -87,19 +89,19 @@
 
 #[test]
 fn clashy_expr_field() {
-    let span = expect::span().with_field(
+    let span = span::mock().with_field(
         // Overriding the `s` field should record `s` as a `Display` value,
         // rather than as a `Debug` value.
-        expect::field("s")
+        mock("s")
             .with_value(&tracing::field::display("hello world"))
-            .and(expect::field("s.len").with_value(&"hello world".len()))
+            .and(mock("s.len").with_value(&"hello world".len()))
             .only(),
     );
     run_test(span, || {
         fn_clashy_expr_field("hello world");
     });
 
-    let span = expect::span().with_field(expect::field("s").with_value(&"s").only());
+    let span = span::mock().with_field(mock("s").with_value(&"s").only());
     run_test(span, || {
         fn_clashy_expr_field2("hello world");
     });
@@ -107,8 +109,7 @@
 
 #[test]
 fn self_expr_field() {
-    let span =
-        expect::span().with_field(expect::field("my_field").with_value(&"hello world").only());
+    let span = span::mock().with_field(mock("my_field").with_value(&"hello world").only());
     run_test(span, || {
         let has_field = HasField {
             my_field: "hello world",
@@ -119,10 +120,10 @@
 
 #[test]
 fn parameters_with_fields() {
-    let span = expect::span().with_field(
-        expect::field("foo")
+    let span = span::mock().with_field(
+        mock("foo")
             .with_value(&"bar")
-            .and(expect::field("param").with_value(&1u32))
+            .and(mock("param").with_value(&1u32))
             .only(),
     );
     run_test(span, || {
@@ -132,7 +133,7 @@
 
 #[test]
 fn empty_field() {
-    let span = expect::span().with_field(expect::field("foo").with_value(&"bar").only());
+    let span = span::mock().with_field(mock("foo").with_value(&"bar").only());
     run_test(span, || {
         fn_empty_field();
     });
@@ -140,7 +141,7 @@
 
 #[test]
 fn string_field() {
-    let span = expect::span().with_field(expect::field("s").with_value(&"hello world").only());
+    let span = span::mock().with_field(mock("s").with_value(&"hello world").only());
     run_test(span, || {
         fn_string(String::from("hello world"));
     });
@@ -149,9 +150,9 @@
 fn run_test T, T>(span: NewSpan, fun: F) {
     let (subscriber, handle) = subscriber::mock()
         .new_span(span)
-        .enter(expect::span())
-        .exit(expect::span())
-        .only()
+        .enter(span::mock())
+        .exit(span::mock())
+        .done()
         .run_with_handle();
 
     with_default(subscriber, fun);
diff -Nru temporalio-1.3.0/vendor/tracing-attributes/tests/follows_from.rs temporalio-1.3.0/vendor/tracing-attributes/tests/follows_from.rs
--- temporalio-1.3.0/vendor/tracing-attributes/tests/follows_from.rs	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/tracing-attributes/tests/follows_from.rs	2023-10-30 19:40:00.000000000 +0000
@@ -13,10 +13,10 @@
 
 #[test]
 fn follows_from_sync_test() {
-    let cause_a = expect::span().named("cause_a");
-    let cause_b = expect::span().named("cause_b");
-    let cause_c = expect::span().named("cause_c");
-    let consequence = expect::span().named("with_follows_from_sync");
+    let cause_a = span::mock().named("cause_a");
+    let cause_b = span::mock().named("cause_b");
+    let cause_c = span::mock().named("cause_c");
+    let consequence = span::mock().named("with_follows_from_sync");
 
     let (subscriber, handle) = subscriber::mock()
         .new_span(cause_a.clone())
@@ -28,7 +28,7 @@
         .follows_from(consequence.clone(), cause_c)
         .enter(consequence.clone())
         .exit(consequence)
-        .only()
+        .done()
         .run_with_handle();
 
     with_default(subscriber, || {
@@ -44,10 +44,10 @@
 
 #[test]
 fn follows_from_async_test() {
-    let cause_a = expect::span().named("cause_a");
-    let cause_b = expect::span().named("cause_b");
-    let cause_c = expect::span().named("cause_c");
-    let consequence = expect::span().named("with_follows_from_async");
+    let cause_a = span::mock().named("cause_a");
+    let cause_b = span::mock().named("cause_b");
+    let cause_c = span::mock().named("cause_c");
+    let consequence = span::mock().named("with_follows_from_async");
 
     let (subscriber, handle) = subscriber::mock()
         .new_span(cause_a.clone())
@@ -61,7 +61,7 @@
         .exit(consequence.clone())
         .enter(consequence.clone())
         .exit(consequence)
-        .only()
+        .done()
         .run_with_handle();
 
     with_default(subscriber, || {
@@ -79,8 +79,8 @@
 
 #[test]
 fn follows_from_current_test() {
-    let cause = expect::span().named("cause");
-    let consequence = expect::span().named("follows_from_current");
+    let cause = span::mock().named("cause");
+    let consequence = span::mock().named("follows_from_current");
 
     let (subscriber, handle) = subscriber::mock()
         .new_span(cause.clone())
@@ -90,7 +90,7 @@
         .enter(consequence.clone())
         .exit(consequence)
         .exit(cause)
-        .only()
+        .done()
         .run_with_handle();
 
     with_default(subscriber, || {
diff -Nru temporalio-1.3.0/vendor/tracing-attributes/tests/instrument.rs temporalio-1.3.0/vendor/tracing-attributes/tests/instrument.rs
--- temporalio-1.3.0/vendor/tracing-attributes/tests/instrument.rs	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/tracing-attributes/tests/instrument.rs	2023-10-30 19:40:00.000000000 +0000
@@ -20,11 +20,11 @@
     #[instrument(level = Level::DEBUG, target = "my_target")]
     fn my_other_fn() {}
 
-    let span = expect::span()
+    let span = span::mock()
         .named("my_fn")
         .at_level(Level::DEBUG)
         .with_target("my_target");
-    let span2 = expect::span()
+    let span2 = span::mock()
         .named("my_other_fn")
         .at_level(Level::DEBUG)
         .with_target("my_target");
@@ -37,7 +37,7 @@
         .enter(span2.clone())
         .exit(span2.clone())
         .drop_span(span2)
-        .only()
+        .done()
         .run_with_handle();
 
     with_default(subscriber, || {
@@ -53,21 +53,21 @@
     #[instrument(target = "my_target", level = "debug")]
     fn my_fn(arg1: usize, arg2: bool) {}
 
-    let span = expect::span()
+    let span = span::mock()
         .named("my_fn")
         .at_level(Level::DEBUG)
         .with_target("my_target");
 
-    let span2 = expect::span()
+    let span2 = span::mock()
         .named("my_fn")
         .at_level(Level::DEBUG)
         .with_target("my_target");
     let (subscriber, handle) = subscriber::mock()
         .new_span(
             span.clone().with_field(
-                expect::field("arg1")
+                field::mock("arg1")
                     .with_value(&2usize)
-                    .and(expect::field("arg2").with_value(&false))
+                    .and(field::mock("arg2").with_value(&false))
                     .only(),
             ),
         )
@@ -76,16 +76,16 @@
         .drop_span(span)
         .new_span(
             span2.clone().with_field(
-                expect::field("arg1")
+                field::mock("arg1")
                     .with_value(&3usize)
-                    .and(expect::field("arg2").with_value(&true))
+                    .and(field::mock("arg2").with_value(&true))
                     .only(),
             ),
         )
         .enter(span2.clone())
         .exit(span2.clone())
         .drop_span(span2)
-        .only()
+        .done()
         .run_with_handle();
 
     with_default(subscriber, || {
@@ -106,17 +106,17 @@
     #[instrument(target = "my_target", level = "debug", skip_all)]
     fn my_fn2(_arg1: usize, _arg2: UnDebug, _arg3: UnDebug) {}
 
-    let span = expect::span()
+    let span = span::mock()
         .named("my_fn")
         .at_level(Level::DEBUG)
         .with_target("my_target");
 
-    let span2 = expect::span()
+    let span2 = span::mock()
         .named("my_fn")
         .at_level(Level::DEBUG)
         .with_target("my_target");
 
-    let span3 = expect::span()
+    let span3 = span::mock()
         .named("my_fn2")
         .at_level(Level::DEBUG)
         .with_target("my_target");
@@ -124,7 +124,7 @@
     let (subscriber, handle) = subscriber::mock()
         .new_span(
             span.clone()
-                .with_field(expect::field("arg1").with_value(&2usize).only()),
+                .with_field(field::mock("arg1").with_value(&2usize).only()),
         )
         .enter(span.clone())
         .exit(span.clone())
@@ -132,7 +132,7 @@
         .new_span(
             span2
                 .clone()
-                .with_field(expect::field("arg1").with_value(&3usize).only()),
+                .with_field(field::mock("arg1").with_value(&3usize).only()),
         )
         .enter(span2.clone())
         .exit(span2.clone())
@@ -141,7 +141,7 @@
         .enter(span3.clone())
         .exit(span3.clone())
         .drop_span(span3)
-        .only()
+        .done()
         .run_with_handle();
 
     with_default(subscriber, || {
@@ -165,20 +165,20 @@
     {
     }
 
-    let span = expect::span().named("my_fn");
+    let span = span::mock().named("my_fn");
 
     let (subscriber, handle) = subscriber::mock()
         .new_span(
             span.clone().with_field(
-                expect::field("arg1")
+                field::mock("arg1")
                     .with_value(&format_args!("Foo"))
-                    .and(expect::field("arg2").with_value(&format_args!("false"))),
+                    .and(field::mock("arg2").with_value(&format_args!("false"))),
             ),
         )
         .enter(span.clone())
         .exit(span.clone())
         .drop_span(span)
-        .only()
+        .done()
         .run_with_handle();
 
     with_default(subscriber, || {
@@ -198,20 +198,20 @@
         fn my_fn(&self, arg1: usize) {}
     }
 
-    let span = expect::span().named("my_fn");
+    let span = span::mock().named("my_fn");
 
     let (subscriber, handle) = subscriber::mock()
         .new_span(
             span.clone().with_field(
-                expect::field("self")
+                field::mock("self")
                     .with_value(&format_args!("Foo"))
-                    .and(expect::field("arg1").with_value(&42usize)),
+                    .and(field::mock("arg1").with_value(&42usize)),
             ),
         )
         .enter(span.clone())
         .exit(span.clone())
         .drop_span(span)
-        .only()
+        .done()
         .run_with_handle();
 
     with_default(subscriber, || {
@@ -229,17 +229,17 @@
         0..x
     }
 
-    let span = expect::span().named("returns_impl_trait");
+    let span = span::mock().named("returns_impl_trait");
 
     let (subscriber, handle) = subscriber::mock()
         .new_span(
             span.clone()
-                .with_field(expect::field("x").with_value(&10usize).only()),
+                .with_field(field::mock("x").with_value(&10usize).only()),
         )
         .enter(span.clone())
         .exit(span.clone())
         .drop_span(span)
-        .only()
+        .done()
         .run_with_handle();
 
     with_default(subscriber, || {
diff -Nru temporalio-1.3.0/vendor/tracing-attributes/tests/levels.rs temporalio-1.3.0/vendor/tracing-attributes/tests/levels.rs
--- temporalio-1.3.0/vendor/tracing-attributes/tests/levels.rs	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/tracing-attributes/tests/levels.rs	2023-10-30 19:40:00.000000000 +0000
@@ -20,22 +20,22 @@
     #[instrument(level = "eRrOr")]
     fn error() {}
     let (subscriber, handle) = subscriber::mock()
-        .new_span(expect::span().named("trace").at_level(Level::TRACE))
-        .enter(expect::span().named("trace").at_level(Level::TRACE))
-        .exit(expect::span().named("trace").at_level(Level::TRACE))
-        .new_span(expect::span().named("debug").at_level(Level::DEBUG))
-        .enter(expect::span().named("debug").at_level(Level::DEBUG))
-        .exit(expect::span().named("debug").at_level(Level::DEBUG))
-        .new_span(expect::span().named("info").at_level(Level::INFO))
-        .enter(expect::span().named("info").at_level(Level::INFO))
-        .exit(expect::span().named("info").at_level(Level::INFO))
-        .new_span(expect::span().named("warn").at_level(Level::WARN))
-        .enter(expect::span().named("warn").at_level(Level::WARN))
-        .exit(expect::span().named("warn").at_level(Level::WARN))
-        .new_span(expect::span().named("error").at_level(Level::ERROR))
-        .enter(expect::span().named("error").at_level(Level::ERROR))
-        .exit(expect::span().named("error").at_level(Level::ERROR))
-        .only()
+        .new_span(span::mock().named("trace").at_level(Level::TRACE))
+        .enter(span::mock().named("trace").at_level(Level::TRACE))
+        .exit(span::mock().named("trace").at_level(Level::TRACE))
+        .new_span(span::mock().named("debug").at_level(Level::DEBUG))
+        .enter(span::mock().named("debug").at_level(Level::DEBUG))
+        .exit(span::mock().named("debug").at_level(Level::DEBUG))
+        .new_span(span::mock().named("info").at_level(Level::INFO))
+        .enter(span::mock().named("info").at_level(Level::INFO))
+        .exit(span::mock().named("info").at_level(Level::INFO))
+        .new_span(span::mock().named("warn").at_level(Level::WARN))
+        .enter(span::mock().named("warn").at_level(Level::WARN))
+        .exit(span::mock().named("warn").at_level(Level::WARN))
+        .new_span(span::mock().named("error").at_level(Level::ERROR))
+        .enter(span::mock().named("error").at_level(Level::ERROR))
+        .exit(span::mock().named("error").at_level(Level::ERROR))
+        .done()
         .run_with_handle();
 
     with_default(subscriber, || {
@@ -66,22 +66,22 @@
     #[instrument(level = 5)]
     fn error() {}
     let (subscriber, handle) = subscriber::mock()
-        .new_span(expect::span().named("trace").at_level(Level::TRACE))
-        .enter(expect::span().named("trace").at_level(Level::TRACE))
-        .exit(expect::span().named("trace").at_level(Level::TRACE))
-        .new_span(expect::span().named("debug").at_level(Level::DEBUG))
-        .enter(expect::span().named("debug").at_level(Level::DEBUG))
-        .exit(expect::span().named("debug").at_level(Level::DEBUG))
-        .new_span(expect::span().named("info").at_level(Level::INFO))
-        .enter(expect::span().named("info").at_level(Level::INFO))
-        .exit(expect::span().named("info").at_level(Level::INFO))
-        .new_span(expect::span().named("warn").at_level(Level::WARN))
-        .enter(expect::span().named("warn").at_level(Level::WARN))
-        .exit(expect::span().named("warn").at_level(Level::WARN))
-        .new_span(expect::span().named("error").at_level(Level::ERROR))
-        .enter(expect::span().named("error").at_level(Level::ERROR))
-        .exit(expect::span().named("error").at_level(Level::ERROR))
-        .only()
+        .new_span(span::mock().named("trace").at_level(Level::TRACE))
+        .enter(span::mock().named("trace").at_level(Level::TRACE))
+        .exit(span::mock().named("trace").at_level(Level::TRACE))
+        .new_span(span::mock().named("debug").at_level(Level::DEBUG))
+        .enter(span::mock().named("debug").at_level(Level::DEBUG))
+        .exit(span::mock().named("debug").at_level(Level::DEBUG))
+        .new_span(span::mock().named("info").at_level(Level::INFO))
+        .enter(span::mock().named("info").at_level(Level::INFO))
+        .exit(span::mock().named("info").at_level(Level::INFO))
+        .new_span(span::mock().named("warn").at_level(Level::WARN))
+        .enter(span::mock().named("warn").at_level(Level::WARN))
+        .exit(span::mock().named("warn").at_level(Level::WARN))
+        .new_span(span::mock().named("error").at_level(Level::ERROR))
+        .enter(span::mock().named("error").at_level(Level::ERROR))
+        .exit(span::mock().named("error").at_level(Level::ERROR))
+        .done()
         .run_with_handle();
 
     with_default(subscriber, || {
@@ -112,22 +112,22 @@
     #[instrument(level = Level::ERROR)]
     fn error() {}
     let (subscriber, handle) = subscriber::mock()
-        .new_span(expect::span().named("trace").at_level(Level::TRACE))
-        .enter(expect::span().named("trace").at_level(Level::TRACE))
-        .exit(expect::span().named("trace").at_level(Level::TRACE))
-        .new_span(expect::span().named("debug").at_level(Level::DEBUG))
-        .enter(expect::span().named("debug").at_level(Level::DEBUG))
-        .exit(expect::span().named("debug").at_level(Level::DEBUG))
-        .new_span(expect::span().named("info").at_level(Level::INFO))
-        .enter(expect::span().named("info").at_level(Level::INFO))
-        .exit(expect::span().named("info").at_level(Level::INFO))
-        .new_span(expect::span().named("warn").at_level(Level::WARN))
-        .enter(expect::span().named("warn").at_level(Level::WARN))
-        .exit(expect::span().named("warn").at_level(Level::WARN))
-        .new_span(expect::span().named("error").at_level(Level::ERROR))
-        .enter(expect::span().named("error").at_level(Level::ERROR))
-        .exit(expect::span().named("error").at_level(Level::ERROR))
-        .only()
+        .new_span(span::mock().named("trace").at_level(Level::TRACE))
+        .enter(span::mock().named("trace").at_level(Level::TRACE))
+        .exit(span::mock().named("trace").at_level(Level::TRACE))
+        .new_span(span::mock().named("debug").at_level(Level::DEBUG))
+        .enter(span::mock().named("debug").at_level(Level::DEBUG))
+        .exit(span::mock().named("debug").at_level(Level::DEBUG))
+        .new_span(span::mock().named("info").at_level(Level::INFO))
+        .enter(span::mock().named("info").at_level(Level::INFO))
+        .exit(span::mock().named("info").at_level(Level::INFO))
+        .new_span(span::mock().named("warn").at_level(Level::WARN))
+        .enter(span::mock().named("warn").at_level(Level::WARN))
+        .exit(span::mock().named("warn").at_level(Level::WARN))
+        .new_span(span::mock().named("error").at_level(Level::ERROR))
+        .enter(span::mock().named("error").at_level(Level::ERROR))
+        .exit(span::mock().named("error").at_level(Level::ERROR))
+        .done()
         .run_with_handle();
 
     with_default(subscriber, || {
diff -Nru temporalio-1.3.0/vendor/tracing-attributes/tests/names.rs temporalio-1.3.0/vendor/tracing-attributes/tests/names.rs
--- temporalio-1.3.0/vendor/tracing-attributes/tests/names.rs	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/tracing-attributes/tests/names.rs	2023-10-30 19:40:00.000000000 +0000
@@ -17,10 +17,10 @@
 #[test]
 fn default_name_test() {
     let (subscriber, handle) = subscriber::mock()
-        .new_span(expect::span().named("default_name"))
-        .enter(expect::span().named("default_name"))
-        .exit(expect::span().named("default_name"))
-        .only()
+        .new_span(span::mock().named("default_name"))
+        .enter(span::mock().named("default_name"))
+        .exit(span::mock().named("default_name"))
+        .done()
         .run_with_handle();
 
     with_default(subscriber, || {
@@ -33,10 +33,10 @@
 #[test]
 fn custom_name_test() {
     let (subscriber, handle) = subscriber::mock()
-        .new_span(expect::span().named("my_name"))
-        .enter(expect::span().named("my_name"))
-        .exit(expect::span().named("my_name"))
-        .only()
+        .new_span(span::mock().named("my_name"))
+        .enter(span::mock().named("my_name"))
+        .exit(span::mock().named("my_name"))
+        .done()
         .run_with_handle();
 
     with_default(subscriber, || {
@@ -49,10 +49,10 @@
 #[test]
 fn custom_name_no_equals_test() {
     let (subscriber, handle) = subscriber::mock()
-        .new_span(expect::span().named("my_other_name"))
-        .enter(expect::span().named("my_other_name"))
-        .exit(expect::span().named("my_other_name"))
-        .only()
+        .new_span(span::mock().named("my_other_name"))
+        .enter(span::mock().named("my_other_name"))
+        .exit(span::mock().named("my_other_name"))
+        .done()
         .run_with_handle();
 
     with_default(subscriber, || {
diff -Nru temporalio-1.3.0/vendor/tracing-attributes/tests/parents.rs temporalio-1.3.0/vendor/tracing-attributes/tests/parents.rs
--- temporalio-1.3.0/vendor/tracing-attributes/tests/parents.rs	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/tracing-attributes/tests/parents.rs	2023-10-30 19:40:00.000000000 +0000
@@ -14,8 +14,8 @@
 
 #[test]
 fn default_parent_test() {
-    let contextual_parent = expect::span().named("contextual_parent");
-    let child = expect::span().named("with_default_parent");
+    let contextual_parent = span::mock().named("contextual_parent");
+    let child = span::mock().named("with_default_parent");
 
     let (subscriber, handle) = subscriber::mock()
         .new_span(
@@ -42,7 +42,7 @@
         .enter(child.clone())
         .exit(child)
         .exit(contextual_parent)
-        .only()
+        .done()
         .run_with_handle();
 
     with_default(subscriber, || {
@@ -60,9 +60,9 @@
 
 #[test]
 fn explicit_parent_test() {
-    let contextual_parent = expect::span().named("contextual_parent");
-    let explicit_parent = expect::span().named("explicit_parent");
-    let child = expect::span().named("with_explicit_parent");
+    let contextual_parent = span::mock().named("contextual_parent");
+    let explicit_parent = span::mock().named("explicit_parent");
+    let child = span::mock().named("with_explicit_parent");
 
     let (subscriber, handle) = subscriber::mock()
         .new_span(
@@ -86,7 +86,7 @@
         .enter(child.clone())
         .exit(child)
         .exit(contextual_parent)
-        .only()
+        .done()
         .run_with_handle();
 
     with_default(subscriber, || {
diff -Nru temporalio-1.3.0/vendor/tracing-attributes/tests/ret.rs temporalio-1.3.0/vendor/tracing-attributes/tests/ret.rs
--- temporalio-1.3.0/vendor/tracing-attributes/tests/ret.rs	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/tracing-attributes/tests/ret.rs	2023-10-30 19:40:00.000000000 +0000
@@ -19,18 +19,18 @@
 
 #[test]
 fn test() {
-    let span = expect::span().named("ret");
+    let span = span::mock().named("ret");
     let (subscriber, handle) = subscriber::mock()
         .new_span(span.clone())
         .enter(span.clone())
         .event(
-            expect::event()
-                .with_fields(expect::field("return").with_value(&tracing::field::debug(42)))
+            event::mock()
+                .with_fields(field::mock("return").with_value(&tracing::field::debug(42)))
                 .at_level(Level::INFO),
         )
         .exit(span.clone())
         .drop_span(span)
-        .only()
+        .done()
         .run_with_handle();
 
     with_default(subscriber, ret);
@@ -40,7 +40,7 @@
 #[test]
 fn test_custom_target() {
     let filter: EnvFilter = "my_target=info".parse().expect("filter should parse");
-    let span = expect::span()
+    let span = span::mock()
         .named("ret_with_target")
         .with_target("my_target");
 
@@ -48,14 +48,14 @@
         .new_span(span.clone())
         .enter(span.clone())
         .event(
-            expect::event()
-                .with_fields(expect::field("return").with_value(&tracing::field::debug(42)))
+            event::mock()
+                .with_fields(field::mock("return").with_value(&tracing::field::debug(42)))
                 .at_level(Level::INFO)
                 .with_target("my_target"),
         )
         .exit(span.clone())
         .drop_span(span)
-        .only()
+        .done()
         .run_with_handle();
 
     let subscriber = subscriber.with(filter);
@@ -71,18 +71,18 @@
 
 #[test]
 fn test_warn() {
-    let span = expect::span().named("ret_warn");
+    let span = span::mock().named("ret_warn");
     let (subscriber, handle) = subscriber::mock()
         .new_span(span.clone())
         .enter(span.clone())
         .event(
-            expect::event()
-                .with_fields(expect::field("return").with_value(&tracing::field::debug(42)))
+            event::mock()
+                .with_fields(field::mock("return").with_value(&tracing::field::debug(42)))
                 .at_level(Level::WARN),
         )
         .exit(span.clone())
         .drop_span(span)
-        .only()
+        .done()
         .run_with_handle();
 
     with_default(subscriber, ret_warn);
@@ -98,23 +98,23 @@
 
 #[test]
 fn test_mut() {
-    let span = expect::span().named("ret_mut");
+    let span = span::mock().named("ret_mut");
     let (subscriber, handle) = subscriber::mock()
         .new_span(span.clone())
         .enter(span.clone())
         .event(
-            expect::event()
-                .with_fields(expect::field("a").with_value(&tracing::field::display(2)))
+            event::mock()
+                .with_fields(field::mock("a").with_value(&tracing::field::display(2)))
                 .at_level(Level::INFO),
         )
         .event(
-            expect::event()
-                .with_fields(expect::field("return").with_value(&tracing::field::debug(2)))
+            event::mock()
+                .with_fields(field::mock("return").with_value(&tracing::field::debug(2)))
                 .at_level(Level::INFO),
         )
         .exit(span.clone())
         .drop_span(span)
-        .only()
+        .done()
         .run_with_handle();
 
     with_default(subscriber, || ret_mut(&mut 1));
@@ -128,20 +128,20 @@
 
 #[test]
 fn test_async() {
-    let span = expect::span().named("ret_async");
+    let span = span::mock().named("ret_async");
     let (subscriber, handle) = subscriber::mock()
         .new_span(span.clone())
         .enter(span.clone())
         .event(
-            expect::event()
-                .with_fields(expect::field("return").with_value(&tracing::field::debug(42)))
+            event::mock()
+                .with_fields(field::mock("return").with_value(&tracing::field::debug(42)))
                 .at_level(Level::INFO),
         )
         .exit(span.clone())
         .enter(span.clone())
         .exit(span.clone())
         .drop_span(span)
-        .only()
+        .done()
         .run_with_handle();
 
     with_default(subscriber, || block_on_future(async { ret_async().await }));
@@ -155,18 +155,18 @@
 
 #[test]
 fn test_impl_type() {
-    let span = expect::span().named("ret_impl_type");
+    let span = span::mock().named("ret_impl_type");
     let (subscriber, handle) = subscriber::mock()
         .new_span(span.clone())
         .enter(span.clone())
         .event(
-            expect::event()
-                .with_fields(expect::field("return").with_value(&tracing::field::debug(42)))
+            event::mock()
+                .with_fields(field::mock("return").with_value(&tracing::field::debug(42)))
                 .at_level(Level::INFO),
         )
         .exit(span.clone())
         .drop_span(span)
-        .only()
+        .done()
         .run_with_handle();
 
     with_default(subscriber, ret_impl_type);
@@ -180,18 +180,18 @@
 
 #[test]
 fn test_dbg() {
-    let span = expect::span().named("ret_display");
+    let span = span::mock().named("ret_display");
     let (subscriber, handle) = subscriber::mock()
         .new_span(span.clone())
         .enter(span.clone())
         .event(
-            expect::event()
-                .with_fields(expect::field("return").with_value(&tracing::field::display(42)))
+            event::mock()
+                .with_fields(field::mock("return").with_value(&tracing::field::display(42)))
                 .at_level(Level::INFO),
         )
         .exit(span.clone())
         .drop_span(span)
-        .only()
+        .done()
         .run_with_handle();
 
     with_default(subscriber, ret_display);
@@ -205,14 +205,14 @@
 
 #[test]
 fn test_ret_and_err() {
-    let span = expect::span().named("ret_and_err");
+    let span = span::mock().named("ret_and_err");
     let (subscriber, handle) = subscriber::mock()
         .new_span(span.clone())
         .enter(span.clone())
         .event(
-            expect::event()
+            event::mock()
                 .with_fields(
-                    expect::field("error")
+                    field::mock("error")
                         .with_value(&tracing::field::display(u8::try_from(1234).unwrap_err()))
                         .only(),
                 )
@@ -220,7 +220,7 @@
         )
         .exit(span.clone())
         .drop_span(span)
-        .only()
+        .done()
         .run_with_handle();
 
     with_default(subscriber, || ret_and_err().ok());
@@ -234,14 +234,14 @@
 
 #[test]
 fn test_ret_and_ok() {
-    let span = expect::span().named("ret_and_ok");
+    let span = span::mock().named("ret_and_ok");
     let (subscriber, handle) = subscriber::mock()
         .new_span(span.clone())
         .enter(span.clone())
         .event(
-            expect::event()
+            event::mock()
                 .with_fields(
-                    expect::field("return")
+                    field::mock("return")
                         .with_value(&tracing::field::debug(u8::try_from(123).unwrap()))
                         .only(),
                 )
@@ -249,7 +249,7 @@
         )
         .exit(span.clone())
         .drop_span(span)
-        .only()
+        .done()
         .run_with_handle();
 
     with_default(subscriber, || ret_and_ok().ok());
@@ -263,18 +263,18 @@
 
 #[test]
 fn test_warn_info() {
-    let span = expect::span().named("ret_warn_info").at_level(Level::WARN);
+    let span = span::mock().named("ret_warn_info").at_level(Level::WARN);
     let (subscriber, handle) = subscriber::mock()
         .new_span(span.clone())
         .enter(span.clone())
         .event(
-            expect::event()
-                .with_fields(expect::field("return").with_value(&tracing::field::debug(42)))
+            event::mock()
+                .with_fields(field::mock("return").with_value(&tracing::field::debug(42)))
                 .at_level(Level::INFO),
         )
         .exit(span.clone())
         .drop_span(span)
-        .only()
+        .done()
         .run_with_handle();
 
     with_default(subscriber, ret_warn_info);
@@ -288,18 +288,18 @@
 
 #[test]
 fn test_dbg_warn() {
-    let span = expect::span().named("ret_dbg_warn").at_level(Level::INFO);
+    let span = span::mock().named("ret_dbg_warn").at_level(Level::INFO);
     let (subscriber, handle) = subscriber::mock()
         .new_span(span.clone())
         .enter(span.clone())
         .event(
-            expect::event()
-                .with_fields(expect::field("return").with_value(&tracing::field::debug(42)))
+            event::mock()
+                .with_fields(field::mock("return").with_value(&tracing::field::debug(42)))
                 .at_level(Level::WARN),
         )
         .exit(span.clone())
         .drop_span(span)
-        .only()
+        .done()
         .run_with_handle();
 
     with_default(subscriber, ret_dbg_warn);
diff -Nru temporalio-1.3.0/vendor/tracing-attributes/tests/targets.rs temporalio-1.3.0/vendor/tracing-attributes/tests/targets.rs
--- temporalio-1.3.0/vendor/tracing-attributes/tests/targets.rs	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/tracing-attributes/tests/targets.rs	2023-10-30 19:40:00.000000000 +0000
@@ -24,36 +24,36 @@
 fn default_targets() {
     let (subscriber, handle) = subscriber::mock()
         .new_span(
-            expect::span()
+            span::mock()
                 .named("default_target")
                 .with_target(module_path!()),
         )
         .enter(
-            expect::span()
+            span::mock()
                 .named("default_target")
                 .with_target(module_path!()),
         )
         .exit(
-            expect::span()
+            span::mock()
                 .named("default_target")
                 .with_target(module_path!()),
         )
         .new_span(
-            expect::span()
+            span::mock()
                 .named("default_target")
                 .with_target(my_mod::MODULE_PATH),
         )
         .enter(
-            expect::span()
+            span::mock()
                 .named("default_target")
                 .with_target(my_mod::MODULE_PATH),
         )
         .exit(
-            expect::span()
+            span::mock()
                 .named("default_target")
                 .with_target(my_mod::MODULE_PATH),
         )
-        .only()
+        .done()
         .run_with_handle();
 
     with_default(subscriber, || {
@@ -67,37 +67,25 @@
 #[test]
 fn custom_targets() {
     let (subscriber, handle) = subscriber::mock()
+        .new_span(span::mock().named("custom_target").with_target("my_target"))
+        .enter(span::mock().named("custom_target").with_target("my_target"))
+        .exit(span::mock().named("custom_target").with_target("my_target"))
         .new_span(
-            expect::span()
-                .named("custom_target")
-                .with_target("my_target"),
-        )
-        .enter(
-            expect::span()
-                .named("custom_target")
-                .with_target("my_target"),
-        )
-        .exit(
-            expect::span()
-                .named("custom_target")
-                .with_target("my_target"),
-        )
-        .new_span(
-            expect::span()
+            span::mock()
                 .named("custom_target")
                 .with_target("my_other_target"),
         )
         .enter(
-            expect::span()
+            span::mock()
                 .named("custom_target")
                 .with_target("my_other_target"),
         )
         .exit(
-            expect::span()
+            span::mock()
                 .named("custom_target")
                 .with_target("my_other_target"),
         )
-        .only()
+        .done()
         .run_with_handle();
 
     with_default(subscriber, || {
diff -Nru temporalio-1.3.0/vendor/tracing-core/.cargo-checksum.json temporalio-1.3.0/vendor/tracing-core/.cargo-checksum.json
--- temporalio-1.3.0/vendor/tracing-core/.cargo-checksum.json	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/tracing-core/.cargo-checksum.json	2023-10-30 19:40:00.000000000 +0000
@@ -1 +1 @@
-{"files":{"CHANGELOG.md":"5c72ced3c4b609b6121b0ca5f980f8292f8b542d3f11c7b97581f23fd6ab7e1b","Cargo.toml":"7ae6601ad9768415a61eba2be6c82e30c71c6d3c76561f230ce6eafa2e66255f","LICENSE":"898b1ae9821e98daf8964c8d6c7f61641f5f5aa78ad500020771c0939ee0dea1","README.md":"0ace2b660151cc4aa04d954daef0b60151c2f797d695dfb0b78d931f497c82ac","src/callsite.rs":"83789dd16601faa675e2c75e1bbfe1512c2d4b405b880bf99db2a6f6bbb15363","src/dispatcher.rs":"2a751f9256e8418105d1f7134fd80500f39b920c8a17b02eaf3dcd701d1737ad","src/event.rs":"f2673bf5d266972e567e521c9cd92fb33f28b0c7e010937e3bc2bf9eb483087f","src/field.rs":"0f7ec541d932beae7ee67d0fcb09cfeabacdcb4ee6310a7b20f9fb07a75e091f","src/lazy.rs":"318e3558e4446abf26294287167c0788e343044a28072f9217bd985929809087","src/lib.rs":"d0f56d6d890f721e1d769376f500dc3e80b7ac969330c98049c344fda47a107a","src/metadata.rs":"319e8a80804c7e927595e73d2139c027b2c4d58887af4a95ab2bb3411e7ab3d1","src/parent.rs":"5d5ad733343280a64a1feb6a008e186c39305ec554f14279012b8d7915821471","src/span.rs":"dcf2135e4ca158c1be45007f0be25426c375a4081f8f3c5a4d7f7382d8a950a4","src/spin/LICENSE":"58545fed1565e42d687aecec6897d35c6d37ccb71479a137c0deb2203e125c79","src/spin/mod.rs":"c458ce5e875acb7fbfb279f23254f4924d7c6d6fee419b740800d2e8087d1524","src/spin/mutex.rs":"4d30ff2b59b18fd7909f016e1abdf9aa0c04aa11d047a46e98cffe1319e32dad","src/spin/once.rs":"3781fd4eae0db04d80c03a039906c99b1e01d1583b29ac0144e6fbbd5a0fef0b","src/stdlib.rs":"698693062b8109cace3ffea02e9c2372b7d5b5d43c0b11cb4800b0e7b1a69971","src/subscriber.rs":"c7b6d52633e479bcad50fc30e1bf596339e575533761d269498cfc79e99020ef","tests/common/mod.rs":"0bbb217baa17df0f96cc1ff57dfa74ccc5a959e7f66b15bb7d25d5f43358a278","tests/dispatch.rs":"d3f000fab43734a854c82a7783142910c5e79f806cbd3f8ec5eded598c59ddb1","tests/global_dispatch.rs":"cdc05d77e448ee8b50bfb930abafa3f19b4c6f922b7bebc7797fa1dbdaa1d398","tests/local_dispatch_before_init.rs":"338846cd519e9a3a6895f958b11bd3f97e4350d08adb50f95b8552113a593b0d","tests/macros.rs":"b1603d888b349c8d103794deceec3b1ae4538b8d3eba805f3f561899e8ad0dd2"},"package":"c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54"}
\ No newline at end of file
+{"files":{"CHANGELOG.md":"1f044fab25d2edb95969e22142f9426e3749f5fb919689d837b4bd189d4ae96b","Cargo.toml":"9083a9bee87a9b05b524869863e8962b45fd4e4e2a271a24803b649d481c9d04","LICENSE":"898b1ae9821e98daf8964c8d6c7f61641f5f5aa78ad500020771c0939ee0dea1","README.md":"0ace2b660151cc4aa04d954daef0b60151c2f797d695dfb0b78d931f497c82ac","src/callsite.rs":"479f3b3809afff20ac2a4652f11ec1adc8dd59bd90c608e4e248de4a43c5a43c","src/dispatcher.rs":"5f1a4f6aeb67544710e4b2f38826cd6ec3924a5fcacf8a483ffd90726abed2ee","src/event.rs":"f2673bf5d266972e567e521c9cd92fb33f28b0c7e010937e3bc2bf9eb483087f","src/field.rs":"c18f60f4268f601f75b35a549ca7f50aed0a7a8752c22effaea30b6e32235760","src/lazy.rs":"318e3558e4446abf26294287167c0788e343044a28072f9217bd985929809087","src/lib.rs":"92744b1b632f57c99e08e6ccd68aa56dc8074586d5c46b3058e602364f5d047a","src/metadata.rs":"319e8a80804c7e927595e73d2139c027b2c4d58887af4a95ab2bb3411e7ab3d1","src/parent.rs":"5d5ad733343280a64a1feb6a008e186c39305ec554f14279012b8d7915821471","src/span.rs":"dcf2135e4ca158c1be45007f0be25426c375a4081f8f3c5a4d7f7382d8a950a4","src/spin/LICENSE":"58545fed1565e42d687aecec6897d35c6d37ccb71479a137c0deb2203e125c79","src/spin/mod.rs":"c458ce5e875acb7fbfb279f23254f4924d7c6d6fee419b740800d2e8087d1524","src/spin/mutex.rs":"4d30ff2b59b18fd7909f016e1abdf9aa0c04aa11d047a46e98cffe1319e32dad","src/spin/once.rs":"3781fd4eae0db04d80c03a039906c99b1e01d1583b29ac0144e6fbbd5a0fef0b","src/stdlib.rs":"698693062b8109cace3ffea02e9c2372b7d5b5d43c0b11cb4800b0e7b1a69971","src/subscriber.rs":"c7b6d52633e479bcad50fc30e1bf596339e575533761d269498cfc79e99020ef","tests/common/mod.rs":"0bbb217baa17df0f96cc1ff57dfa74ccc5a959e7f66b15bb7d25d5f43358a278","tests/dispatch.rs":"d3f000fab43734a854c82a7783142910c5e79f806cbd3f8ec5eded598c59ddb1","tests/global_dispatch.rs":"cdc05d77e448ee8b50bfb930abafa3f19b4c6f922b7bebc7797fa1dbdaa1d398","tests/local_dispatch_before_init.rs":"338846cd519e9a3a6895f958b11bd3f97e4350d08adb50f95b8552113a593b0d","tests/macros.rs":"b1603d888b349c8d103794deceec3b1ae4538b8d3eba805f3f561899e8ad0dd2"},"package":"0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a"}
\ No newline at end of file
diff -Nru temporalio-1.3.0/vendor/tracing-core/Cargo.toml temporalio-1.3.0/vendor/tracing-core/Cargo.toml
--- temporalio-1.3.0/vendor/tracing-core/Cargo.toml	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/tracing-core/Cargo.toml	2023-10-30 19:40:00.000000000 +0000
@@ -13,7 +13,7 @@
 edition = "2018"
 rust-version = "1.56.0"
 name = "tracing-core"
-version = "0.1.32"
+version = "0.1.31"
 authors = ["Tokio Contributors "]
 description = """
 Core primitives for application-level tracing.
diff -Nru temporalio-1.3.0/vendor/tracing-core/CHANGELOG.md temporalio-1.3.0/vendor/tracing-core/CHANGELOG.md
--- temporalio-1.3.0/vendor/tracing-core/CHANGELOG.md	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/tracing-core/CHANGELOG.md	2023-10-30 19:40:00.000000000 +0000
@@ -1,18 +1,3 @@
-# 0.1.32 (October 13, 2023)
-
-### Documented
-
-- Fix typo in `field` docs ([#2611])
-- Remove duplicate wording ([#2674])
-
-### Changed
-
-- Allow `ValueSet`s of any length ([#2508])
-
-[#2611]: https://github.com/tokio-rs/tracing/pull/2611
-[#2674]: https://github.com/tokio-rs/tracing/pull/2674
-[#2508]: https://github.com/tokio-rs/tracing/pull/2508
-
 # 0.1.31 (May 11, 2023)
 
 This release of `tracing-core` fixes a bug that caused threads which call
diff -Nru temporalio-1.3.0/vendor/tracing-core/src/callsite.rs temporalio-1.3.0/vendor/tracing-core/src/callsite.rs
--- temporalio-1.3.0/vendor/tracing-core/src/callsite.rs	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/tracing-core/src/callsite.rs	2023-10-30 19:40:00.000000000 +0000
@@ -9,7 +9,9 @@
 //! * Storing the span or event's [`Metadata`],
 //! * Uniquely [identifying](Identifier) the span or event definition,
 //! * Caching the subscriber's [`Interest`][^1] in that span or event, to avoid
-//!   re-evaluating filters.
+//!   re-evaluating filters,
+//! * Storing a [`Registration`] that allows the callsite to be part of a global
+//!   list of all callsites in the program.
 //!
 //! # Registering Callsites
 //!
diff -Nru temporalio-1.3.0/vendor/tracing-core/src/dispatcher.rs temporalio-1.3.0/vendor/tracing-core/src/dispatcher.rs
--- temporalio-1.3.0/vendor/tracing-core/src/dispatcher.rs	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/tracing-core/src/dispatcher.rs	2023-10-30 19:40:00.000000000 +0000
@@ -518,8 +518,8 @@
         }
     }
 
-    /// Registers a new callsite with this subscriber, returning whether or not
-    /// the subscriber is interested in being notified about the callsite.
+    /// Registers a new callsite with this collector, returning whether or not
+    /// the collector is interested in being notified about the callsite.
     ///
     /// This calls the [`register_callsite`] function on the [`Subscriber`]
     /// that this `Dispatch` forwards to.
diff -Nru temporalio-1.3.0/vendor/tracing-core/src/field.rs temporalio-1.3.0/vendor/tracing-core/src/field.rs
--- temporalio-1.3.0/vendor/tracing-core/src/field.rs	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/tracing-core/src/field.rs	2023-10-30 19:40:00.000000000 +0000
@@ -1,13 +1,13 @@
 //! `Span` and `Event` key-value data.
 //!
-//! Spans and events may be annotated with key-value data, known as _fields_.
-//! These fields consist of a mapping from a key (corresponding to a `&str` but
-//! represented internally as an array index) to a [`Value`].
+//! Spans and events may be annotated with key-value data, referred to as known
+//! as _fields_. These fields consist of a mapping from a key (corresponding to
+//! a `&str` but represented internally as an array index) to a [`Value`].
 //!
 //! # `Value`s and `Subscriber`s
 //!
 //! `Subscriber`s consume `Value`s as fields attached to [span]s or [`Event`]s.
-//! The set of field keys on a given span or event is defined on its [`Metadata`].
+//! The set of field keys on a given span or is defined on its [`Metadata`].
 //! When a span is created, it provides [`Attributes`] to the `Subscriber`'s
 //! [`new_span`] method, containing any fields whose values were provided when
 //! the span was created; and may call the `Subscriber`'s [`record`] method
@@ -470,10 +470,6 @@
         impl $crate::sealed::Sealed for $value_ty {}
         impl $crate::field::Value for $value_ty {
             fn record(&self, key: &$crate::field::Field, visitor: &mut dyn $crate::field::Visit) {
-                // `op` is always a function; the closure is used because
-                // sometimes there isn't a real function corresponding to that
-                // operation. the clippy warning is not that useful here.
-                #[allow(clippy::redundant_closure_call)]
                 visitor.$record(key, $op(*self))
             }
         }
@@ -489,10 +485,6 @@
         impl $crate::sealed::Sealed for ty_to_nonzero!($value_ty) {}
         impl $crate::field::Value for ty_to_nonzero!($value_ty) {
             fn record(&self, key: &$crate::field::Field, visitor: &mut dyn $crate::field::Visit) {
-                // `op` is always a function; the closure is used because
-                // sometimes there isn't a real function corresponding to that
-                // operation. the clippy warning is not that useful here.
-                #[allow(clippy::redundant_closure_call)]
                 visitor.$record(key, $op(self.get()))
             }
         }
@@ -879,6 +871,9 @@
     }
 
     /// Returns a new `ValueSet` with entries for this `FieldSet`'s values.
+    ///
+    /// Note that a `ValueSet` may not be constructed with arrays of over 32
+    /// elements.
     #[doc(hidden)]
     pub fn value_set<'v, V>(&'v self, values: &'v V) -> ValueSet<'v>
     where
@@ -1077,10 +1072,28 @@
 mod private {
     use super::*;
 
-    /// Restrictions on `ValueSet` lengths were removed in #2508 but this type remains for backwards compatibility.
+    /// Marker trait implemented by arrays which are of valid length to
+    /// construct a `ValueSet`.
+    ///
+    /// `ValueSet`s may only be constructed from arrays containing 32 or fewer
+    /// elements, to ensure the array is small enough to always be allocated on the
+    /// stack. This trait is only implemented by arrays of an appropriate length,
+    /// ensuring that the correct size arrays are used at compile-time.
     pub trait ValidLen<'a>: Borrow<[(&'a Field, Option<&'a (dyn Value + 'a)>)]> {}
+}
+
+macro_rules! impl_valid_len {
+    ( $( $len:tt ),+ ) => {
+        $(
+            impl<'a> private::ValidLen<'a> for
+                [(&'a Field, Option<&'a (dyn Value + 'a)>); $len] {}
+        )+
+    }
+}
 
-    impl<'a, const N: usize> ValidLen<'a> for [(&'a Field, Option<&'a (dyn Value + 'a)>); N] {}
+impl_valid_len! {
+    0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
+    21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32
 }
 
 #[cfg(test)]
@@ -1089,9 +1102,8 @@
     use crate::metadata::{Kind, Level, Metadata};
     use crate::stdlib::{borrow::ToOwned, string::String};
 
-    // Make sure TEST_CALLSITE_* have non-zero size, so they can't be located at the same address.
-    struct TestCallsite1(u8);
-    static TEST_CALLSITE_1: TestCallsite1 = TestCallsite1(0);
+    struct TestCallsite1;
+    static TEST_CALLSITE_1: TestCallsite1 = TestCallsite1;
     static TEST_META_1: Metadata<'static> = metadata! {
         name: "field_test1",
         target: module_path!(),
@@ -1111,8 +1123,8 @@
         }
     }
 
-    struct TestCallsite2(u8);
-    static TEST_CALLSITE_2: TestCallsite2 = TestCallsite2(0);
+    struct TestCallsite2;
+    static TEST_CALLSITE_2: TestCallsite2 = TestCallsite2;
     static TEST_META_2: Metadata<'static> = metadata! {
         name: "field_test2",
         target: module_path!(),
diff -Nru temporalio-1.3.0/vendor/tracing-core/src/lib.rs temporalio-1.3.0/vendor/tracing-core/src/lib.rs
--- temporalio-1.3.0/vendor/tracing-core/src/lib.rs	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/tracing-core/src/lib.rs	2023-10-30 19:40:00.000000000 +0000
@@ -243,9 +243,9 @@
             $name,
             $target,
             $level,
-            ::core::option::Option::Some(file!()),
-            ::core::option::Option::Some(line!()),
-            ::core::option::Option::Some(module_path!()),
+            Some(file!()),
+            Some(line!()),
+            Some(module_path!()),
             $crate::field::FieldSet::new($fields, $crate::identify_callsite!($callsite)),
             $kind,
         )
diff -Nru temporalio-1.3.0/vendor/tracing-log/.cargo-checksum.json temporalio-1.3.0/vendor/tracing-log/.cargo-checksum.json
--- temporalio-1.3.0/vendor/tracing-log/.cargo-checksum.json	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/tracing-log/.cargo-checksum.json	2023-10-30 19:40:00.000000000 +0000
@@ -1 +1 @@
-{"files":{"CHANGELOG.md":"83b53d51aeaec63647893233a14c28e824a8f40ceeae970bf776da1c3c1faeca","Cargo.toml":"fa83bed278ebebf05d5d2517dfe4e0443329d6670770af1646b030fcd9e95f4a","LICENSE":"898b1ae9821e98daf8964c8d6c7f61641f5f5aa78ad500020771c0939ee0dea1","README.md":"e427dcaa53677a7c2d28444a6eaabb98e93428a85e3af1fccd1066ba180df3ad","benches/logging.rs":"d4d0ceb4bf0fcf0c139c48bece64cad22c04b0c83fa2754983b5d4f141c817b5","src/env_logger.rs":"853d961ef431fcad924d07b90e4fc9f73413ed45e7bd7b9aaba95a1fdc28349a","src/interest_cache.rs":"90b516d5afc2e7000eaf3691fb37cd0e20f545cf08b7653b8f518cb207a19dc4","src/lib.rs":"95c310b338cbbd12905d6528c96aa1c1eb11261ca1e9d745d63008172fe4c1b0","src/log_tracer.rs":"679c0a84896598439bcb8a01bc49ae58148039df642f43c70fd665b9c687a05a","src/trace_logger.rs":"b1d58046a76bdad604072c7f969e19e02f90324d6881504403b7debc965845a6","tests/log_tracer.rs":"2d4725822b19c47c0cbcfaf2f9af3f939f55b4b0d9b3a2c5584af2b77453854b","tests/reexport_log_crate.rs":"1eb4672784ecda75743494b0662d90fd48b1252b44b68afa898fa0bec3699683"},"package":"f751112709b4e791d8ce53e32c4ed2d353565a795ce84da2285393f41557bdf2"}
\ No newline at end of file
+{"files":{"CHANGELOG.md":"d7cc8e83d800946b622f3392cbb5245d57dde70ef1b544fe82260371a90b39ec","Cargo.toml":"3e7cfde6270347998b817355e0b9bb7a59cfb458477f8a91045a15b5081900c7","LICENSE":"898b1ae9821e98daf8964c8d6c7f61641f5f5aa78ad500020771c0939ee0dea1","README.md":"f69a91df2fb2eb0b8a381acf6dc7d4fe611aece9a2ce9389743a00c6b1ca9dc9","benches/logging.rs":"d4d0ceb4bf0fcf0c139c48bece64cad22c04b0c83fa2754983b5d4f141c817b5","src/env_logger.rs":"853d961ef431fcad924d07b90e4fc9f73413ed45e7bd7b9aaba95a1fdc28349a","src/interest_cache.rs":"590437659a6f10f2ba53b640dbe2eb090c3fc7b364c2b7d8b6178d1a849454c2","src/lib.rs":"7f1b89dc2fbd8f4d8bc81fe5818fb175f44b4d91d789e5bf67f3463f46864d8d","src/log_tracer.rs":"679c0a84896598439bcb8a01bc49ae58148039df642f43c70fd665b9c687a05a","src/trace_logger.rs":"b1d58046a76bdad604072c7f969e19e02f90324d6881504403b7debc965845a6","tests/log_tracer.rs":"2d4725822b19c47c0cbcfaf2f9af3f939f55b4b0d9b3a2c5584af2b77453854b","tests/reexport_log_crate.rs":"1eb4672784ecda75743494b0662d90fd48b1252b44b68afa898fa0bec3699683"},"package":"78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922"}
\ No newline at end of file
diff -Nru temporalio-1.3.0/vendor/tracing-log/Cargo.toml temporalio-1.3.0/vendor/tracing-log/Cargo.toml
--- temporalio-1.3.0/vendor/tracing-log/Cargo.toml	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/tracing-log/Cargo.toml	2023-10-30 19:40:00.000000000 +0000
@@ -11,9 +11,9 @@
 
 [package]
 edition = "2018"
-rust-version = "1.56.0"
+rust-version = "1.49.0"
 name = "tracing-log"
-version = "0.1.4"
+version = "0.1.3"
 authors = ["Tokio Contributors "]
 description = """
 Provides compatibility between `tracing` and the `log` crate.
@@ -44,32 +44,32 @@
 harness = false
 
 [dependencies.ahash]
-version = "0.7.6"
+version = "0.7.4"
 optional = true
 
 [dependencies.env_logger]
-version = "0.8.4"
+version = "0.7"
 optional = true
 
+[dependencies.lazy_static]
+version = "1.3.0"
+
 [dependencies.log]
-version = "0.4.17"
+version = "0.4"
 
 [dependencies.lru]
-version = "0.7.7"
+version = "0.7.0"
 optional = true
 
-[dependencies.once_cell]
-version = "1.13.0"
-
 [dependencies.tracing-core]
-version = "0.1.28"
+version = "0.1.17"
 
 [dev-dependencies.criterion]
-version = "0.3.6"
-default-features = false
+version = "0.3"
+default_features = false
 
 [dev-dependencies.tracing]
-version = "0.1.35"
+version = "0.1"
 
 [features]
 default = [
diff -Nru temporalio-1.3.0/vendor/tracing-log/CHANGELOG.md temporalio-1.3.0/vendor/tracing-log/CHANGELOG.md
--- temporalio-1.3.0/vendor/tracing-log/CHANGELOG.md	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/tracing-log/CHANGELOG.md	2023-10-30 19:40:00.000000000 +0000
@@ -1,11 +1,3 @@
-# 0.1.4 (October 23rd, 2023)
-
-### Changes
-
-- Deprecated `env_logger` feature in favor of `tracing_subscriber::fmt::Subscriber` ([#2752])
-
-#[2752]: https://github.com/tokio-rs/tracing/pull/2752
-
 # 0.1.3 (April 21st, 2022)
 
 ### Added
diff -Nru temporalio-1.3.0/vendor/tracing-log/README.md temporalio-1.3.0/vendor/tracing-log/README.md
--- temporalio-1.3.0/vendor/tracing-log/README.md	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/tracing-log/README.md	2023-10-30 19:40:00.000000000 +0000
@@ -56,21 +56,21 @@
 [`tracing::Subscriber`]: https://docs.rs/tracing/latest/tracing/trait.Subscriber.html
 [`tracing::Event`]: https://docs.rs/tracing/latest/tracing/struct.Event.html
 
-*Compiler support: [requires `rustc` 1.56+][msrv]*
+*Compiler support: [requires `rustc` 1.49+][msrv]*
 
 [msrv]: #supported-rust-versions
 
 ## Supported Rust Versions
 
 Tracing is built against the latest stable release. The minimum supported
-version is 1.56. The current Tracing version is not guaranteed to build on Rust
+version is 1.49. The current Tracing version is not guaranteed to build on Rust
 versions earlier than the minimum supported version.
 
 Tracing follows the same compiler support policies as the rest of the Tokio
 project. The current stable Rust compiler and the three most recent minor
 versions before it will always be supported. For example, if the current stable
-compiler version is 1.69, the minimum supported version will not be increased
-past 1.66, three minor versions prior. Increasing the minimum supported compiler
+compiler version is 1.45, the minimum supported version will not be increased
+past 1.42, three minor versions prior. Increasing the minimum supported compiler
 version is not considered a semver breaking change as long as doing so complies
 with this policy.
 
diff -Nru temporalio-1.3.0/vendor/tracing-log/src/interest_cache.rs temporalio-1.3.0/vendor/tracing-log/src/interest_cache.rs
--- temporalio-1.3.0/vendor/tracing-log/src/interest_cache.rs	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/tracing-log/src/interest_cache.rs	2023-10-30 19:40:00.000000000 +0000
@@ -1,7 +1,6 @@
 use ahash::AHasher;
 use log::{Level, Metadata};
 use lru::LruCache;
-use once_cell::sync::Lazy;
 use std::cell::RefCell;
 use std::hash::Hasher;
 use std::sync::atomic::{AtomicUsize, Ordering};
@@ -141,10 +140,12 @@
     tracing_core::metadata::Kind::EVENT,
 );
 
-static CONFIG: Lazy> = Lazy::new(|| {
-    tracing_core::callsite::register(&SENTINEL_CALLSITE);
-    Mutex::new(InterestCacheConfig::disabled())
-});
+lazy_static::lazy_static! {
+    static ref CONFIG: Mutex = {
+        tracing_core::callsite::register(&SENTINEL_CALLSITE);
+        Mutex::new(InterestCacheConfig::disabled())
+    };
+}
 
 thread_local! {
     static STATE: RefCell = {
@@ -235,7 +236,10 @@
 
     fn lock_for_test() -> impl Drop {
         // We need to make sure only one test runs at a time.
-        static LOCK: Lazy> = Lazy::new(Mutex::new);
+
+        lazy_static::lazy_static! {
+            static ref LOCK: Mutex<()> = Mutex::new(());
+        }
 
         match LOCK.lock() {
             Ok(guard) => guard,
diff -Nru temporalio-1.3.0/vendor/tracing-log/src/lib.rs temporalio-1.3.0/vendor/tracing-log/src/lib.rs
--- temporalio-1.3.0/vendor/tracing-log/src/lib.rs	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/tracing-log/src/lib.rs	2023-10-30 19:40:00.000000000 +0000
@@ -16,7 +16,7 @@
 //! - An [`env_logger`] module, with helpers for using the [`env_logger` crate]
 //!   with `tracing` (optional, enabled by the `env-logger` feature).
 //!
-//! *Compiler support: [requires `rustc` 1.56+][msrv]*
+//! *Compiler support: [requires `rustc` 1.49+][msrv]*
 //!
 //! [msrv]: #supported-rust-versions
 //!
@@ -80,14 +80,14 @@
 //! ## Supported Rust Versions
 //!
 //! Tracing is built against the latest stable release. The minimum supported
-//! version is 1.56. The current Tracing version is not guaranteed to build on
+//! version is 1.49. The current Tracing version is not guaranteed to build on
 //! Rust versions earlier than the minimum supported version.
 //!
 //! Tracing follows the same compiler support policies as the rest of the Tokio
 //! project. The current stable Rust compiler and the three most recent minor
 //! versions before it will always be supported. For example, if the current
-//! stable compiler version is 1.69, the minimum supported version will not be
-//! increased past 1.66, three minor versions prior. Increasing the minimum
+//! stable compiler version is 1.45, the minimum supported version will not be
+//! increased past 1.42, three minor versions prior. Increasing the minimum
 //! supported compiler version is not considered a semver breaking change as
 //! long as doing so complies with this policy.
 //!
@@ -100,6 +100,7 @@
 //! [`tracing::Event`]: https://docs.rs/tracing/latest/tracing/struct.Event.html
 //! [flags]: https://docs.rs/tracing/latest/tracing/#crate-feature-flags
 //! [`Builder::with_interest_cache`]: log_tracer::Builder::with_interest_cache
+#![doc(html_root_url = "https://docs.rs/tracing-log/0.1.3")]
 #![doc(
     html_logo_url = "https://raw.githubusercontent.com/tokio-rs/tracing/master/assets/logo-type.png",
     issue_tracker_base_url = "https://github.com/tokio-rs/tracing/issues/"
@@ -111,6 +112,7 @@
     rust_2018_idioms,
     unreachable_pub,
     bad_style,
+    const_err,
     dead_code,
     improper_ctypes,
     non_shorthand_field_patterns,
@@ -126,7 +128,7 @@
     unused_parens,
     while_true
 )]
-use once_cell::sync::Lazy;
+use lazy_static::lazy_static;
 
 use std::{fmt, io};
 
@@ -164,10 +166,6 @@
 
 #[cfg(feature = "env_logger")]
 #[cfg_attr(docsrs, doc(cfg(feature = "env_logger")))]
-#[deprecated(
-    since = "0.1.4",
-    note = "use `tracing-subscriber`'s `fmt::Subscriber` instead"
-)]
 pub mod env_logger;
 
 pub use log;
@@ -311,9 +309,9 @@
             "log event",
             "log",
             $level,
-            ::core::option::Option::None,
-            ::core::option::Option::None,
-            ::core::option::Option::None,
+            None,
+            None,
+            None,
             field::FieldSet::new(FIELD_NAMES, identify_callsite!(&$cs)),
             Kind::EVENT,
         );
@@ -348,11 +346,13 @@
     ErrorCallsite
 );
 
-static TRACE_FIELDS: Lazy = Lazy::new(|| Fields::new(&TRACE_CS));
-static DEBUG_FIELDS: Lazy = Lazy::new(|| Fields::new(&DEBUG_CS));
-static INFO_FIELDS: Lazy = Lazy::new(|| Fields::new(&INFO_CS));
-static WARN_FIELDS: Lazy = Lazy::new(|| Fields::new(&WARN_CS));
-static ERROR_FIELDS: Lazy = Lazy::new(|| Fields::new(&ERROR_CS));
+lazy_static! {
+    static ref TRACE_FIELDS: Fields = Fields::new(&TRACE_CS);
+    static ref DEBUG_FIELDS: Fields = Fields::new(&DEBUG_CS);
+    static ref INFO_FIELDS: Fields = Fields::new(&INFO_CS);
+    static ref WARN_FIELDS: Fields = Fields::new(&WARN_CS);
+    static ref ERROR_FIELDS: Fields = Fields::new(&ERROR_CS);
+}
 
 fn level_to_cs(level: Level) -> (&'static dyn Callsite, &'static Fields) {
     match level {
diff -Nru temporalio-1.3.0/vendor/tracing-opentelemetry/benches/trace.rs temporalio-1.3.0/vendor/tracing-opentelemetry/benches/trace.rs
--- temporalio-1.3.0/vendor/tracing-opentelemetry/benches/trace.rs	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/tracing-opentelemetry/benches/trace.rs	1970-01-01 00:00:00.000000000 +0000
@@ -1,126 +0,0 @@
-use criterion::{criterion_group, criterion_main, Criterion};
-use opentelemetry::{
-    sdk::trace::{Tracer, TracerProvider},
-    trace::{SpanBuilder, Tracer as _, TracerProvider as _},
-    Context,
-};
-use std::time::SystemTime;
-use tracing::trace_span;
-use tracing_subscriber::prelude::*;
-
-fn many_children(c: &mut Criterion) {
-    let mut group = c.benchmark_group("otel_many_children");
-
-    group.bench_function("spec_baseline", |b| {
-        let provider = TracerProvider::default();
-        let tracer = provider.tracer("bench");
-        b.iter(|| {
-            fn dummy(tracer: &Tracer, cx: &Context) {
-                for _ in 0..99 {
-                    tracer.start_with_context("child", cx);
-                }
-            }
-
-            tracer.in_span("parent", |cx| dummy(&tracer, &cx));
-        });
-    });
-
-    {
-        let _subscriber = tracing_subscriber::registry()
-            .with(RegistryAccessLayer)
-            .set_default();
-        group.bench_function("no_data_baseline", |b| b.iter(tracing_harness));
-    }
-
-    {
-        let _subscriber = tracing_subscriber::registry()
-            .with(OtelDataLayer)
-            .set_default();
-        group.bench_function("data_only_baseline", |b| b.iter(tracing_harness));
-    }
-
-    {
-        let provider = TracerProvider::default();
-        let tracer = provider.tracer("bench");
-        let otel_layer = tracing_opentelemetry::layer()
-            .with_tracer(tracer)
-            .with_tracked_inactivity(false);
-        let _subscriber = tracing_subscriber::registry()
-            .with(otel_layer)
-            .set_default();
-
-        group.bench_function("full", |b| b.iter(tracing_harness));
-    }
-}
-
-struct NoDataSpan;
-struct RegistryAccessLayer;
-
-impl tracing_subscriber::Layer for RegistryAccessLayer
-where
-    S: tracing_core::Subscriber + for<'span> tracing_subscriber::registry::LookupSpan<'span>,
-{
-    fn on_new_span(
-        &self,
-        _attrs: &tracing_core::span::Attributes<'_>,
-        id: &tracing::span::Id,
-        ctx: tracing_subscriber::layer::Context<'_, S>,
-    ) {
-        let span = ctx.span(id).expect("Span not found, this is a bug");
-        let mut extensions = span.extensions_mut();
-        extensions.insert(NoDataSpan);
-    }
-
-    fn on_close(&self, id: tracing::span::Id, ctx: tracing_subscriber::layer::Context<'_, S>) {
-        let span = ctx.span(&id).expect("Span not found, this is a bug");
-        let mut extensions = span.extensions_mut();
-
-        extensions.remove::();
-    }
-}
-
-struct OtelDataLayer;
-
-impl tracing_subscriber::Layer for OtelDataLayer
-where
-    S: tracing_core::Subscriber + for<'span> tracing_subscriber::registry::LookupSpan<'span>,
-{
-    fn on_new_span(
-        &self,
-        attrs: &tracing_core::span::Attributes<'_>,
-        id: &tracing::span::Id,
-        ctx: tracing_subscriber::layer::Context<'_, S>,
-    ) {
-        let span = ctx.span(id).expect("Span not found, this is a bug");
-        let mut extensions = span.extensions_mut();
-        extensions.insert(
-            SpanBuilder::from_name(attrs.metadata().name()).with_start_time(SystemTime::now()),
-        );
-    }
-
-    fn on_close(&self, id: tracing::span::Id, ctx: tracing_subscriber::layer::Context<'_, S>) {
-        let span = ctx.span(&id).expect("Span not found, this is a bug");
-        let mut extensions = span.extensions_mut();
-
-        if let Some(builder) = extensions.remove::() {
-            builder.with_end_time(SystemTime::now());
-        }
-    }
-}
-
-fn tracing_harness() {
-    fn dummy() {
-        for _ in 0..99 {
-            let child = trace_span!("child");
-            let _enter = child.enter();
-        }
-    }
-
-    let parent = trace_span!("parent");
-    let _enter = parent.enter();
-
-    dummy();
-}
-
-criterion_group!(benches, many_children);
-criterion_main!(benches);
diff -Nru temporalio-1.3.0/vendor/tracing-opentelemetry/.cargo-checksum.json temporalio-1.3.0/vendor/tracing-opentelemetry/.cargo-checksum.json
--- temporalio-1.3.0/vendor/tracing-opentelemetry/.cargo-checksum.json	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/tracing-opentelemetry/.cargo-checksum.json	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-{"files":{"CHANGELOG.md":"c1e40382ebeed78e3235a66cbf7f7aedc82edbb35039a1ce39dd3f74ff049165","Cargo.toml":"84f1156414129815381991da4d5d1b32d191dd4987533cef87c1389a0dec97df","LICENSE":"898b1ae9821e98daf8964c8d6c7f61641f5f5aa78ad500020771c0939ee0dea1","README.md":"243abf7886e6f322960eb17a828ff74cb0c0de5cf419e25384ab11ea3e139799","benches/trace.rs":"0d50a8b2f8b75578ccea205151bb87ba4b299185a5933bcbca220bd19f3ba0d5","src/layer.rs":"771b72dcba1db8e34f6d28cc5edbb60ad07955b16e6be42131050ad837bb3ba3","src/lib.rs":"a397e84869176718569adb515ebc0ce5e0c11d94d7629145f04188dfe1e4e2b0","src/metrics.rs":"ffbd9eff1ecc181f9d966c8f252b5a4b19fc6460899d5b313101a50adc0d76b8","src/span_ext.rs":"5448dafe7ab4776ae8900b805f6654de5b752ec6841894f651fd79cd9885d7ea","src/tracer.rs":"2676d704d0aa2ab3552d4d54b19dbb200060953474b91c272d9cc2dab6e22a82","tests/metrics_publishing.rs":"adddb63fe2ddf026462a7c96379aae0a1ef386d61fd32306ef1ae667946a9e29","tests/trace_state_propagation.rs":"a4d28bd254c8fc6a1bdf2be9dccea3f54153c5b81059d4010d744966f28b2ef6","trace.png":"a9cac3b434069075e9369abfe862c4f0c41d6bdcf7ff94b641eae72393028a40"},"package":"21ebb87a95ea13271332df069020513ab70bdb5637ca42d6e492dc3bbbad48de"}
\ No newline at end of file
diff -Nru temporalio-1.3.0/vendor/tracing-opentelemetry/Cargo.toml temporalio-1.3.0/vendor/tracing-opentelemetry/Cargo.toml
--- temporalio-1.3.0/vendor/tracing-opentelemetry/Cargo.toml	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/tracing-opentelemetry/Cargo.toml	1970-01-01 00:00:00.000000000 +0000
@@ -1,116 +0,0 @@
-# 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"
-rust-version = "1.56.0"
-name = "tracing-opentelemetry"
-version = "0.18.0"
-authors = [
-    "Julian Tescher ",
-    "Tokio Contributors ",
-]
-description = "OpenTelemetry integration for tracing"
-homepage = "https://github.com/tokio-rs/tracing/tree/master/tracing-opentelemetry"
-readme = "README.md"
-keywords = [
-    "tracing",
-    "opentelemetry",
-    "jaeger",
-    "zipkin",
-    "async",
-]
-categories = [
-    "development-tools::debugging",
-    "development-tools::profiling",
-    "asynchronous",
-]
-license = "MIT"
-repository = "https://github.com/tokio-rs/tracing"
-
-[package.metadata.docs.rs]
-all-features = true
-rustdoc-args = [
-    "--cfg",
-    "docsrs",
-]
-
-[lib]
-bench = false
-
-[[bench]]
-name = "trace"
-harness = false
-
-[dependencies.async-trait]
-version = "0.1.56"
-optional = true
-
-[dependencies.once_cell]
-version = "1.13.0"
-
-[dependencies.opentelemetry]
-version = "0.18.0"
-features = ["trace"]
-default-features = false
-
-[dependencies.thiserror]
-version = "1.0.31"
-optional = true
-
-[dependencies.tracing]
-version = "0.1.35"
-features = ["std"]
-default-features = false
-
-[dependencies.tracing-core]
-version = "0.1.28"
-
-[dependencies.tracing-log]
-version = "0.1.3"
-optional = true
-default-features = false
-
-[dependencies.tracing-subscriber]
-version = "0.3.0"
-features = [
-    "registry",
-    "std",
-]
-default-features = false
-
-[dev-dependencies.async-trait]
-version = "0.1.56"
-
-[dev-dependencies.criterion]
-version = "0.3.6"
-default-features = false
-
-[dev-dependencies.futures-util]
-version = "0.3"
-default-features = false
-
-[dev-dependencies.opentelemetry-jaeger]
-version = "0.17.0"
-
-[dev-dependencies.tokio]
-version = "1"
-features = ["full"]
-
-[dev-dependencies.tokio-stream]
-version = "0.1"
-
-[features]
-default = [
-    "tracing-log",
-    "metrics",
-]
-metrics = ["opentelemetry/metrics"]
diff -Nru temporalio-1.3.0/vendor/tracing-opentelemetry/CHANGELOG.md temporalio-1.3.0/vendor/tracing-opentelemetry/CHANGELOG.md
--- temporalio-1.3.0/vendor/tracing-opentelemetry/CHANGELOG.md	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/tracing-opentelemetry/CHANGELOG.md	1970-01-01 00:00:00.000000000 +0000
@@ -1,310 +0,0 @@
-# 0.18.0 (September 18, 2022)
-
-### Breaking Changes
-
-- Upgrade to `v0.18.0` of `opentelemetry` ([#2303])
-  For list of breaking changes in OpenTelemetry, see the
-  [v0.18.0 changelog](https://github.com/open-telemetry/opentelemetry-rust/blob/main/opentelemetry/CHANGELOG.md#v0180).
-
-### Fixed
-
-- `on_event` respects event's explicit parent ([#2296])
-
-Thanks to @wprzytula for contributing to this release!
-
-[#2303]: https://github.com/tokio-rs/tracing/pull/2303
-[#2296]: https://github.com/tokio-rs/tracing/pull/2296
-
-# 0.17.4 (July 1, 2022)
-
-This release adds optional support for recording `std::error::Error`s using
-[OpenTelemetry's semantic conventions for exceptions][exn-semconv].
-
-### Added
-
-- `Layer::with_exception_fields` to enable emitting `exception.message` and
-  `exception.backtrace` semantic-convention fields when an `Error` is recorded
-  as a span or event field ([#2135])
-- `Layer::with_exception_field_propagation` to enable setting `exception.message` and
-  `exception.backtrace` semantic-convention fields on the current span when an
-  event with an `Error` field is recorded ([#2135])
-
-Thanks to @lilymara-onesignal for contributing to this release!
-
-[thread-semconv]: https://opentelemetry.io/docs/reference/specification/trace/semantic_conventions/exceptions/
-[#2135]: https://github.com/tokio-rs/tracing/pull/2135
-
-# 0.17.3 (June 7, 2022)
-
-This release adds support for emitting thread names and IDs to OpenTelemetry, as
-well as recording `std::error::Error` values in a structured manner with their
-source chain included. Additionally, this release fixes issues related to event
-and span source code locations.
-
-### Added
-
-- `Layer::with_threads` to enable recording thread names/IDs according to
-  [OpenTelemetry semantic conventions][thread-semconv] ([#2134])
-- `Error::source` chain when recording `std::error::Error` values ([#2122])
-- `Layer::with_location` method (replaces `Layer::with_event_location`)
-  ([#2124])
-
-### Changed
-
-- `std::error::Error` values are now recorded using `fmt::Display` rather than
-  `fmt::Debug` ([#2122])
-
-### Fixed
-
-- Fixed event source code locations overwriting the parent span's source
-  location ([#2099])
-- Fixed `Layer::with_event_location` not controlling whether locations are
-  emitted for spans as well as events ([#2124])
-
-### Deprecated
-
-- `Layer::with_event_location`: renamed to `Layer::with_location`, as it now
-  controls both span and event locations ([#2124])
-
-Thanks to new contributors @lilymara-onesignal, @hubertbudzynski, and @DevinCarr
-for contributing to this release!
-
-[thread-semconv]: https://opentelemetry.io/docs/reference/specification/trace/semantic_conventions/span-general/#source-code-attributes
-[#2134]: https://github.com/tokio-rs/tracing/pull/2134
-[#2122]: https://github.com/tokio-rs/tracing/pull/2122
-[#2124]: https://github.com/tokio-rs/tracing/pull/2124
-[#2099]: https://github.com/tokio-rs/tracing/pull/2099
-
-# 0.17.2 (February 21, 2022)
-
-This release fixes [an issue][#1944] introduced in v0.17.1 where
-`tracing-opentelemetry` could not be compiled with `default-features = false`.
-
-### Fixed
-
-- Compilation failure with `tracing-log` feature disabled ([#1949])
-
-[#1949]: https://github.com/tokio-rs/tracing/pull/1917
-[#1944]: https://github.com/tokio-rs/tracing/issues/1944
-
-# 0.17.1 (February 11, 2022) (YANKED)
-
-### Added
-
-- `OpenTelemetryLayer` can now add detailed location information to
-  forwarded events (defaults to on) ([#1911])
-- `OpenTelemetryLayer::with_event_location` to control whether source locations
-  are recorded ([#1911])
-### Changed
-
-- Avoid unnecessary allocations to improve performance when recording events
-  ([#1917])
-
-Thanks to @djc for contributing to this release!
-
-[#1917]: https://github.com/tokio-rs/tracing/pull/1917
-[#1911]: https://github.com/tokio-rs/tracing/pull/1911
-
-# 0.17.0 (February 3, 2022)
-
-### Breaking Changes
-
-- Upgrade to `v0.17.0` of `opentelemetry` (#1853)
-  For list of breaking changes in OpenTelemetry, see the
-  [v0.17.0 changelog](https://github.com/open-telemetry/opentelemetry-rust/blob/main/opentelemetry/CHANGELOG.md#v0170).
-
-# 0.16.1 (October 23, 2021)
-
-### Breaking Changes
-
-- Upgrade to `v0.3.0` of `tracing-subscriber` ([#1677])
-  For list of breaking changes in `tracing-subscriber`, see the
-  [v0.3.0 changelog].
-
-### Added
-
-- `OpenTelemetrySpanExt::add_link` method for adding a link between a `tracing`
-  span and a provided OpenTelemetry `Context` ([#1516])
-
-Thanks to @LehMaxence for contributing to this release!
-
-[v0.3.0 changelog]: https://github.com/tokio-rs/tracing/releases/tag/tracing-subscriber-0.3.0
-[#1516]: https://github.com/tokio-rs/tracing/pull/1516
-[#1677]: https://github.com/tokio-rs/tracing/pull/1677
-
-# 0.15.0 (August 7, 2021)
-
-### Breaking Changes
-
-- Upgrade to `v0.17.1` of `opentelemetry` (#1497)
-  For list of breaking changes in OpenTelemetry, see the
-  [v0.17.1 changelog](https://github.com/open-telemetry/opentelemetry-rust/blob/main/opentelemetry/CHANGELOG.md#v0160).
-
-# 0.14.0 (July 9, 2021)
-
-### Breaking Changes
-
-- Upgrade to `v0.15.0` of `opentelemetry` ([#1441])
-  For list of breaking changes in OpenTelemetry, see the
-  [v0.14.0 changelog](https://github.com/open-telemetry/opentelemetry-rust/blob/main/opentelemetry/CHANGELOG.md#v0140).
-
-### Added
-
-- Spans now include Opentelemetry `code.namespace`, `code.filepath`, and
-  `code.lineno` attributes ([#1411])
-
-### Changed
-
-- Improve performance by pre-allocating attribute `Vec`s ([#1327])
-
-Thanks to @Drevoed, @lilymara-onesignal, and @Folyd for contributing
-to this release!
-
-[#1441]: https://github.com/tokio-rs/tracing/pull/1441
-[#1411]: https://github.com/tokio-rs/tracing/pull/1411
-[#1327]: https://github.com/tokio-rs/tracing/pull/1327
-
-# 0.13.0 (May 15, 2021)
-
-### Breaking Changes
-
-- Upgrade to `v0.14.0` of `opentelemetry` (#1394)
-  For list of breaking changes in OpenTelemetry, see the
-  [v0.14.0 changelog](https://github.com/open-telemetry/opentelemetry-rust/blob/main/opentelemetry/CHANGELOG.md#v0140).
-
-# 0.12.0 (March 31, 2021)
-
-### Breaking Changes
-
-- Upgrade to `v0.13.0` of `opentelemetry` (#1322)
-  For list of breaking changes in OpenTelemetry, see the
-  [v0.13.0 changelog](https://github.com/open-telemetry/opentelemetry-rust/blob/main/opentelemetry/CHANGELOG.md#v0130).
-
-### Changed
-
-- Improve performance when tracked inactivity is disabled (#1315)
-
-# 0.11.0 (January 25, 2021)
-
-### Breaking Changes
-
-- Upgrade to `v0.12.0` of `opentelemetry` (#1200)
-  For list of breaking changes in OpenTelemetry, see the
-  [v0.12.0 changelog](https://github.com/open-telemetry/opentelemetry-rust/blob/main/opentelemetry/CHANGELOG.md#v0120).
-
-# 0.10.0 (December 30, 2020)
-
-### Breaking Changes
-
-- Upgrade to `v0.11.0` of `opentelemetry` (#1161)
-  For list of breaking changes in OpenTelemetry, see the
-  [v0.11.0 changelog](https://github.com/open-telemetry/opentelemetry-rust/blob/master/opentelemetry/CHANGELOG.md#v0110).
-- Update `OpenTelemetrySpanExt::set_parent` to take a context by value as it is
-  now stored and propagated. (#1161)
-- Rename `PreSampledTracer::sampled_span_context` to
-  `PreSampledTracer::sampled_context` as it now returns a full otel context. (#1161)
-
-# 0.9.0 (November 13, 2020)
-
-### Added
-
-- Track busy/idle timings as attributes via `with_tracked_inactivity` (#1096)
-
-### Breaking Changes
-
-- Upgrade to `v0.10.0` of `opentelemetry` (#1049)
-  For list of breaking changes in OpenTelemetry, see the
-  [v0.10.0 changelog](https://github.com/open-telemetry/opentelemetry-rust/blob/master/opentelemetry/CHANGELOG.md#v0100).
-
-# 0.8.0 (October 13, 2020)
-
-### Added
-
-- Implement additional record types (bool, i64, u64) (#1007)
-
-### Breaking changes
-
-- Add `PreSampledTracer` interface, removes need to specify sampler (#962)
-
-### Fixed
-
-- Connect external traces (#956)
-- Assign default ids if missing (#1027)
-
-# 0.7.0 (August 14, 2020)
-
-### Breaking Changes
-
-- Upgrade to `v0.8.0` of `opentelemetry` (#932)
-  For list of breaking changes in OpenTelemetry, see the
-  [v0.8.0 changelog](https://github.com/open-telemetry/opentelemetry-rust/blob/master/CHANGELOG.md#v080).
-
-# 0.6.0 (August 4, 2020)
-
-### Breaking Changes
-
-- Upgrade to `v0.7.0` of `opentelemetry` (#867)
-  For list of breaking changes in OpenTelemetry, see the
-  [v0.7.0 changelog](https://github.com/open-telemetry/opentelemetry-rust/blob/master/CHANGELOG.md#v070).
-
-# 0.5.0 (June 2, 2020)
-
-### Added
-
-- Support `tracing-log` special values (#735)
-- Support `Span::follows_from` creating otel span links (#723)
-- Dynamic otel span names via `otel.name` field (#732)
-
-### Breaking Changes
-
-- Upgrade to `v0.6.0` of `opentelemetry` (#745)
-
-### Fixed
-
-- Filter out invalid parent contexts when building span contexts (#743)
-
-# 0.4.0 (May 12, 2020)
-
-### Added
-
-- `tracing_opentelemetry::layer()` method to construct a default layer.
-- `OpenTelemetryLayer::with_sampler` method to configure the opentelemetry
-  sampling behavior.
-- `OpenTelemetryLayer::new` method to configure both the tracer and sampler.
-
-### Breaking Changes
-
-- `OpenTelemetrySpanExt::set_parent` now accepts a reference to an extracted
-  parent `Context` instead of a `SpanContext` to match propagators.
-- `OpenTelemetrySpanExt::context` now returns a `Context` instead of a
-  `SpanContext` to match propagators.
-- `OpenTelemetryLayer::with_tracer` now takes `&self` as a parameter
-- Upgrade to `v0.5.0` of `opentelemetry`.
-
-### Fixed
-
-- Fixes bug where child spans were always marked as sampled
-
-# 0.3.1 (April 19, 2020)
-
-### Added
-
-- Change span status code to unknown on error event
-
-# 0.3.0 (April 5, 2020)
-
-### Added
-
-- Span extension for injecting and extracting `opentelemetry` span contexts
-  into `tracing` spans
-
-### Removed
-
-- Disabled the `metrics` feature of the opentelemetry as it is unused.
-
-# 0.2.0 (February 7, 2020)
-
-### Changed
-
-- Update `tracing-subscriber` to 0.2.0 stable
-- Update to `opentelemetry` 0.2.0
diff -Nru temporalio-1.3.0/vendor/tracing-opentelemetry/LICENSE temporalio-1.3.0/vendor/tracing-opentelemetry/LICENSE
--- temporalio-1.3.0/vendor/tracing-opentelemetry/LICENSE	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/tracing-opentelemetry/LICENSE	1970-01-01 00:00:00.000000000 +0000
@@ -1,25 +0,0 @@
-Copyright (c) 2019 Tokio Contributors
-
-Permission is hereby granted, free of charge, to any
-person obtaining a copy of this software and associated
-documentation files (the "Software"), to deal in the
-Software without restriction, including without
-limitation the rights to use, copy, modify, merge,
-publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software
-is furnished to do so, subject to the following
-conditions:
-
-The above copyright notice and this permission notice
-shall be included in all copies or substantial portions
-of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
-ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
-TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
-SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
-IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
diff -Nru temporalio-1.3.0/vendor/tracing-opentelemetry/README.md temporalio-1.3.0/vendor/tracing-opentelemetry/README.md
--- temporalio-1.3.0/vendor/tracing-opentelemetry/README.md	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/tracing-opentelemetry/README.md	1970-01-01 00:00:00.000000000 +0000
@@ -1,132 +0,0 @@
-![Tracing — Structured, application-level diagnostics][splash]
-
-[splash]: https://raw.githubusercontent.com/tokio-rs/tracing/master/assets/splash.svg
-
-# Tracing OpenTelemetry
-
-Utilities for adding [OpenTelemetry] interoperability to [`tracing`].
-
-[![Crates.io][crates-badge]][crates-url]
-[![Documentation][docs-badge]][docs-url]
-[![Documentation (master)][docs-master-badge]][docs-master-url]
-[![MIT licensed][mit-badge]][mit-url]
-[![Build Status][actions-badge]][actions-url]
-[![Discord chat][discord-badge]][discord-url]
-![maintenance status][maint-badge]
-
-[Documentation][docs-url] | [Chat][discord-url]
-
-[crates-badge]: https://img.shields.io/crates/v/tracing-opentelemetry.svg
-[crates-url]: https://crates.io/crates/tracing-opentelemetry/0.18.0
-[docs-badge]: https://docs.rs/tracing-opentelemetry/badge.svg
-[docs-url]: https://docs.rs/tracing-opentelemetry/0.18.0/tracing_opentelemetry
-[docs-master-badge]: https://img.shields.io/badge/docs-master-blue
-[docs-master-url]: https://tracing-rs.netlify.com/tracing_opentelemetry
-[mit-badge]: https://img.shields.io/badge/license-MIT-blue.svg
-[mit-url]: LICENSE
-[actions-badge]: https://github.com/tokio-rs/tracing/workflows/CI/badge.svg
-[actions-url]:https://github.com/tokio-rs/tracing/actions?query=workflow%3ACI
-[discord-badge]: https://img.shields.io/discord/500028886025895936?logo=discord&label=discord&logoColor=white
-[discord-url]: https://discord.gg/EeF3cQw
-[maint-badge]: https://img.shields.io/badge/maintenance-actively--developed-brightgreen.svg
-
-## Overview
-
-[`tracing`] is a framework for instrumenting Rust programs to collect
-structured, event-based diagnostic information. This crate provides a
-subscriber that connects spans from multiple systems into a trace and
-emits them to [OpenTelemetry]-compatible distributed tracing systems
-for processing and visualization.
-
-The crate provides the following types:
-
-* [`OpenTelemetryLayer`] adds OpenTelemetry context to all `tracing` [span]s.
-* [`OpenTelemetrySpanExt`] allows OpenTelemetry parent trace information to be
-  injected and extracted from a `tracing` [span].
-
-[`OpenTelemetryLayer`]: https://docs.rs/tracing-opentelemetry/latest/tracing_opentelemetry/struct.OpenTelemetryLayer.html
-[`OpenTelemetrySpanExt`]: https://docs.rs/tracing-opentelemetry/latest/tracing_opentelemetry/trait.OpenTelemetrySpanExt.html
-[span]: https://docs.rs/tracing/latest/tracing/span/index.html
-[`tracing`]: https://crates.io/crates/tracing
-[OpenTelemetry]: https://opentelemetry.io/
-
-*Compiler support: [requires `rustc` 1.56+][msrv]*
-
-[msrv]: #supported-rust-versions
-
-## Examples
-
-### Basic Usage
-
-```rust
-use opentelemetry::sdk::export::trace::stdout;
-use tracing::{error, span};
-use tracing_subscriber::layer::SubscriberExt;
-use tracing_subscriber::Registry;
-
-fn main() {
-    // Install a new OpenTelemetry trace pipeline
-    let tracer = stdout::new_pipeline().install_simple();
-
-    // Create a tracing layer with the configured tracer
-    let telemetry = tracing_opentelemetry::layer().with_tracer(tracer);
-
-    // Use the tracing subscriber `Registry`, or any other subscriber
-    // that impls `LookupSpan`
-    let subscriber = Registry::default().with(telemetry);
-
-    // Trace executed code
-    tracing::subscriber::with_default(subscriber, || {
-        // Spans will be sent to the configured OpenTelemetry exporter
-        let root = span!(tracing::Level::TRACE, "app_start", work_units = 2);
-        let _enter = root.enter();
-
-        error!("This event will be logged in the root span.");
-    });
-}
-```
-
-### Visualization example
-
-```console
-# Run a supported collector like jaeger in the background
-$ docker run -d -p6831:6831/udp -p6832:6832/udp -p16686:16686 jaegertracing/all-in-one:latest
-
-# Run example to produce spans (from parent examples directory)
-$ cargo run --example opentelemetry
-
-# View spans (see the image below)
-$ firefox http://localhost:16686/
-```
-
-![Jaeger UI](trace.png)
-
-## Feature Flags
-
- - `metrics`: Enables the [`MetricsSubscriber`] type, a [subscriber] that
-   exports OpenTelemetry metrics from specifically-named events. This enables
-   the `metrics` feature flag on the `opentelemetry` crate.
-
-## Supported Rust Versions
-
-Tracing Opentelemetry is built against the latest stable release. The minimum
-supported version is 1.56. The current Tracing version is not guaranteed to
-build on Rust versions earlier than the minimum supported version.
-
-Tracing follows the same compiler support policies as the rest of the Tokio
-project. The current stable Rust compiler and the three most recent minor
-versions before it will always be supported. For example, if the current stable
-compiler version is 1.45, the minimum supported version will not be increased
-past 1.42, three minor versions prior. Increasing the minimum supported compiler
-version is not considered a semver breaking change as long as doing so complies
-with this policy.
-
-## License
-
-This project is licensed under the [MIT license](LICENSE).
-
-### Contribution
-
-Unless you explicitly state otherwise, any contribution intentionally submitted
-for inclusion in Tracing by you, shall be licensed as MIT, without any additional
-terms or conditions.
diff -Nru temporalio-1.3.0/vendor/tracing-opentelemetry/src/layer.rs temporalio-1.3.0/vendor/tracing-opentelemetry/src/layer.rs
--- temporalio-1.3.0/vendor/tracing-opentelemetry/src/layer.rs	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/tracing-opentelemetry/src/layer.rs	1970-01-01 00:00:00.000000000 +0000
@@ -1,1405 +0,0 @@
-use crate::{OtelData, PreSampledTracer};
-use once_cell::unsync;
-use opentelemetry::{
-    trace::{self as otel, noop, OrderMap, TraceContextExt},
-    Context as OtelContext, Key, KeyValue, StringValue, Value,
-};
-use std::any::TypeId;
-use std::fmt;
-use std::marker;
-use std::thread;
-use std::time::{Instant, SystemTime};
-use tracing_core::span::{self, Attributes, Id, Record};
-use tracing_core::{field, Event, Subscriber};
-#[cfg(feature = "tracing-log")]
-use tracing_log::NormalizeEvent;
-use tracing_subscriber::layer::Context;
-use tracing_subscriber::registry::LookupSpan;
-use tracing_subscriber::Layer;
-
-const SPAN_NAME_FIELD: &str = "otel.name";
-const SPAN_KIND_FIELD: &str = "otel.kind";
-const SPAN_STATUS_CODE_FIELD: &str = "otel.status_code";
-const SPAN_STATUS_MESSAGE_FIELD: &str = "otel.status_message";
-
-const FIELD_EXCEPTION_MESSAGE: &str = "exception.message";
-const FIELD_EXCEPTION_STACKTRACE: &str = "exception.stacktrace";
-
-/// An [OpenTelemetry] propagation layer for use in a project that uses
-/// [tracing].
-///
-/// [OpenTelemetry]: https://opentelemetry.io
-/// [tracing]: https://github.com/tokio-rs/tracing
-pub struct OpenTelemetryLayer {
-    tracer: T,
-    location: bool,
-    tracked_inactivity: bool,
-    with_threads: bool,
-    exception_config: ExceptionFieldConfig,
-    get_context: WithContext,
-    _registry: marker::PhantomData,
-}
-
-impl Default for OpenTelemetryLayer
-where
-    S: Subscriber + for<'span> LookupSpan<'span>,
-{
-    fn default() -> Self {
-        OpenTelemetryLayer::new(noop::NoopTracer::new())
-    }
-}
-
-/// Construct a layer to track spans via [OpenTelemetry].
-///
-/// [OpenTelemetry]: https://opentelemetry.io
-///
-/// # Examples
-///
-/// ```rust,no_run
-/// use tracing_subscriber::layer::SubscriberExt;
-/// use tracing_subscriber::Registry;
-///
-/// // Use the tracing subscriber `Registry`, or any other subscriber
-/// // that impls `LookupSpan`
-/// let subscriber = Registry::default().with(tracing_opentelemetry::layer());
-/// # drop(subscriber);
-/// ```
-pub fn layer() -> OpenTelemetryLayer
-where
-    S: Subscriber + for<'span> LookupSpan<'span>,
-{
-    OpenTelemetryLayer::default()
-}
-
-// this function "remembers" the types of the subscriber so that we
-// can downcast to something aware of them without knowing those
-// types at the callsite.
-//
-// See https://github.com/tokio-rs/tracing/blob/4dad420ee1d4607bad79270c1520673fa6266a3d/tracing-error/src/layer.rs
-pub(crate) struct WithContext(
-    fn(&tracing::Dispatch, &span::Id, f: &mut dyn FnMut(&mut OtelData, &dyn PreSampledTracer)),
-);
-
-impl WithContext {
-    // This function allows a function to be called in the context of the
-    // "remembered" subscriber.
-    pub(crate) fn with_context<'a>(
-        &self,
-        dispatch: &'a tracing::Dispatch,
-        id: &span::Id,
-        mut f: impl FnMut(&mut OtelData, &dyn PreSampledTracer),
-    ) {
-        (self.0)(dispatch, id, &mut f)
-    }
-}
-
-fn str_to_span_kind(s: &str) -> Option {
-    match s {
-        s if s.eq_ignore_ascii_case("server") => Some(otel::SpanKind::Server),
-        s if s.eq_ignore_ascii_case("client") => Some(otel::SpanKind::Client),
-        s if s.eq_ignore_ascii_case("producer") => Some(otel::SpanKind::Producer),
-        s if s.eq_ignore_ascii_case("consumer") => Some(otel::SpanKind::Consumer),
-        s if s.eq_ignore_ascii_case("internal") => Some(otel::SpanKind::Internal),
-        _ => None,
-    }
-}
-
-fn str_to_status(s: &str) -> otel::Status {
-    match s {
-        s if s.eq_ignore_ascii_case("ok") => otel::Status::Ok,
-        s if s.eq_ignore_ascii_case("error") => otel::Status::error(""),
-        _ => otel::Status::Unset,
-    }
-}
-
-struct SpanEventVisitor<'a, 'b> {
-    event_builder: &'a mut otel::Event,
-    span_builder: Option<&'b mut otel::SpanBuilder>,
-    exception_config: ExceptionFieldConfig,
-}
-
-impl<'a, 'b> field::Visit for SpanEventVisitor<'a, 'b> {
-    /// Record events on the underlying OpenTelemetry [`Span`] from `bool` values.
-    ///
-    /// [`Span`]: opentelemetry::trace::Span
-    fn record_bool(&mut self, field: &field::Field, value: bool) {
-        match field.name() {
-            "message" => self.event_builder.name = value.to_string().into(),
-            // Skip fields that are actually log metadata that have already been handled
-            #[cfg(feature = "tracing-log")]
-            name if name.starts_with("log.") => (),
-            name => {
-                self.event_builder
-                    .attributes
-                    .push(KeyValue::new(name, value));
-            }
-        }
-    }
-
-    /// Record events on the underlying OpenTelemetry [`Span`] from `f64` values.
-    ///
-    /// [`Span`]: opentelemetry::trace::Span
-    fn record_f64(&mut self, field: &field::Field, value: f64) {
-        match field.name() {
-            "message" => self.event_builder.name = value.to_string().into(),
-            // Skip fields that are actually log metadata that have already been handled
-            #[cfg(feature = "tracing-log")]
-            name if name.starts_with("log.") => (),
-            name => {
-                self.event_builder
-                    .attributes
-                    .push(KeyValue::new(name, value));
-            }
-        }
-    }
-
-    /// Record events on the underlying OpenTelemetry [`Span`] from `i64` values.
-    ///
-    /// [`Span`]: opentelemetry::trace::Span
-    fn record_i64(&mut self, field: &field::Field, value: i64) {
-        match field.name() {
-            "message" => self.event_builder.name = value.to_string().into(),
-            // Skip fields that are actually log metadata that have already been handled
-            #[cfg(feature = "tracing-log")]
-            name if name.starts_with("log.") => (),
-            name => {
-                self.event_builder
-                    .attributes
-                    .push(KeyValue::new(name, value));
-            }
-        }
-    }
-
-    /// Record events on the underlying OpenTelemetry [`Span`] from `&str` values.
-    ///
-    /// [`Span`]: opentelemetry::trace::Span
-    fn record_str(&mut self, field: &field::Field, value: &str) {
-        match field.name() {
-            "message" => self.event_builder.name = value.to_string().into(),
-            // Skip fields that are actually log metadata that have already been handled
-            #[cfg(feature = "tracing-log")]
-            name if name.starts_with("log.") => (),
-            name => {
-                self.event_builder
-                    .attributes
-                    .push(KeyValue::new(name, value.to_string()));
-            }
-        }
-    }
-
-    /// Record events on the underlying OpenTelemetry [`Span`] from values that
-    /// implement Debug.
-    ///
-    /// [`Span`]: opentelemetry::trace::Span
-    fn record_debug(&mut self, field: &field::Field, value: &dyn fmt::Debug) {
-        match field.name() {
-            "message" => self.event_builder.name = format!("{:?}", value).into(),
-            // Skip fields that are actually log metadata that have already been handled
-            #[cfg(feature = "tracing-log")]
-            name if name.starts_with("log.") => (),
-            name => {
-                self.event_builder
-                    .attributes
-                    .push(KeyValue::new(name, format!("{:?}", value)));
-            }
-        }
-    }
-
-    /// Set attributes on the underlying OpenTelemetry [`Span`] using a [`std::error::Error`]'s
-    /// [`std::fmt::Display`] implementation. Also adds the `source` chain as an extra field
-    ///
-    /// [`Span`]: opentelemetry::trace::Span
-    fn record_error(
-        &mut self,
-        field: &tracing_core::Field,
-        value: &(dyn std::error::Error + 'static),
-    ) {
-        let mut chain = Vec::new();
-        let mut next_err = value.source();
-
-        while let Some(err) = next_err {
-            chain.push(StringValue::from(err.to_string()));
-            next_err = err.source();
-        }
-
-        let error_msg = value.to_string();
-
-        if self.exception_config.record {
-            self.event_builder
-                .attributes
-                .push(Key::new(FIELD_EXCEPTION_MESSAGE).string(error_msg.clone()));
-
-            // NOTE: This is actually not the stacktrace of the exception. This is
-            // the "source chain". It represents the heirarchy of errors from the
-            // app level to the lowest level such as IO. It does not represent all
-            // of the callsites in the code that led to the error happening.
-            // `std::error::Error::backtrace` is a nightly-only API and cannot be
-            // used here until the feature is stabilized.
-            self.event_builder
-                .attributes
-                .push(Key::new(FIELD_EXCEPTION_STACKTRACE).array(chain.clone()));
-        }
-
-        if self.exception_config.propagate {
-            if let Some(span) = &mut self.span_builder {
-                if let Some(attrs) = span.attributes.as_mut() {
-                    attrs.insert(Key::new(FIELD_EXCEPTION_MESSAGE), error_msg.clone().into());
-
-                    // NOTE: This is actually not the stacktrace of the exception. This is
-                    // the "source chain". It represents the heirarchy of errors from the
-                    // app level to the lowest level such as IO. It does not represent all
-                    // of the callsites in the code that led to the error happening.
-                    // `std::error::Error::backtrace` is a nightly-only API and cannot be
-                    // used here until the feature is stabilized.
-                    attrs.insert(
-                        Key::new(FIELD_EXCEPTION_STACKTRACE),
-                        Value::Array(chain.clone().into()),
-                    );
-                }
-            }
-        }
-
-        self.event_builder
-            .attributes
-            .push(Key::new(field.name()).string(error_msg));
-        self.event_builder
-            .attributes
-            .push(Key::new(format!("{}.chain", field.name())).array(chain));
-    }
-}
-
-/// Control over opentelemetry conventional exception fields
-#[derive(Clone, Copy)]
-struct ExceptionFieldConfig {
-    /// If an error value is recorded on an event/span, should the otel fields
-    /// be added
-    record: bool,
-
-    /// If an error value is recorded on an event, should the otel fields be
-    /// added to the corresponding span
-    propagate: bool,
-}
-
-struct SpanAttributeVisitor<'a> {
-    span_builder: &'a mut otel::SpanBuilder,
-    exception_config: ExceptionFieldConfig,
-}
-
-impl<'a> SpanAttributeVisitor<'a> {
-    fn record(&mut self, attribute: KeyValue) {
-        debug_assert!(self.span_builder.attributes.is_some());
-        if let Some(v) = self.span_builder.attributes.as_mut() {
-            v.insert(attribute.key, attribute.value);
-        }
-    }
-}
-
-impl<'a> field::Visit for SpanAttributeVisitor<'a> {
-    /// Set attributes on the underlying OpenTelemetry [`Span`] from `bool` values.
-    ///
-    /// [`Span`]: opentelemetry::trace::Span
-    fn record_bool(&mut self, field: &field::Field, value: bool) {
-        self.record(KeyValue::new(field.name(), value));
-    }
-
-    /// Set attributes on the underlying OpenTelemetry [`Span`] from `f64` values.
-    ///
-    /// [`Span`]: opentelemetry::trace::Span
-    fn record_f64(&mut self, field: &field::Field, value: f64) {
-        self.record(KeyValue::new(field.name(), value));
-    }
-
-    /// Set attributes on the underlying OpenTelemetry [`Span`] from `i64` values.
-    ///
-    /// [`Span`]: opentelemetry::trace::Span
-    fn record_i64(&mut self, field: &field::Field, value: i64) {
-        self.record(KeyValue::new(field.name(), value));
-    }
-
-    /// Set attributes on the underlying OpenTelemetry [`Span`] from `&str` values.
-    ///
-    /// [`Span`]: opentelemetry::trace::Span
-    fn record_str(&mut self, field: &field::Field, value: &str) {
-        match field.name() {
-            SPAN_NAME_FIELD => self.span_builder.name = value.to_string().into(),
-            SPAN_KIND_FIELD => self.span_builder.span_kind = str_to_span_kind(value),
-            SPAN_STATUS_CODE_FIELD => self.span_builder.status = str_to_status(value),
-            SPAN_STATUS_MESSAGE_FIELD => {
-                self.span_builder.status = otel::Status::error(value.to_string())
-            }
-            _ => self.record(KeyValue::new(field.name(), value.to_string())),
-        }
-    }
-
-    /// Set attributes on the underlying OpenTelemetry [`Span`] from values that
-    /// implement Debug.
-    ///
-    /// [`Span`]: opentelemetry::trace::Span
-    fn record_debug(&mut self, field: &field::Field, value: &dyn fmt::Debug) {
-        match field.name() {
-            SPAN_NAME_FIELD => self.span_builder.name = format!("{:?}", value).into(),
-            SPAN_KIND_FIELD => {
-                self.span_builder.span_kind = str_to_span_kind(&format!("{:?}", value))
-            }
-            SPAN_STATUS_CODE_FIELD => {
-                self.span_builder.status = str_to_status(&format!("{:?}", value))
-            }
-            SPAN_STATUS_MESSAGE_FIELD => {
-                self.span_builder.status = otel::Status::error(format!("{:?}", value))
-            }
-            _ => self.record(Key::new(field.name()).string(format!("{:?}", value))),
-        }
-    }
-
-    /// Set attributes on the underlying OpenTelemetry [`Span`] using a [`std::error::Error`]'s
-    /// [`std::fmt::Display`] implementation. Also adds the `source` chain as an extra field
-    ///
-    /// [`Span`]: opentelemetry::trace::Span
-    fn record_error(
-        &mut self,
-        field: &tracing_core::Field,
-        value: &(dyn std::error::Error + 'static),
-    ) {
-        let mut chain = Vec::new();
-        let mut next_err = value.source();
-
-        while let Some(err) = next_err {
-            chain.push(StringValue::from(err.to_string()));
-            next_err = err.source();
-        }
-
-        let error_msg = value.to_string();
-
-        if self.exception_config.record {
-            self.record(Key::new(FIELD_EXCEPTION_MESSAGE).string(error_msg.clone()));
-
-            // NOTE: This is actually not the stacktrace of the exception. This is
-            // the "source chain". It represents the heirarchy of errors from the
-            // app level to the lowest level such as IO. It does not represent all
-            // of the callsites in the code that led to the error happening.
-            // `std::error::Error::backtrace` is a nightly-only API and cannot be
-            // used here until the feature is stabilized.
-            self.record(Key::new(FIELD_EXCEPTION_STACKTRACE).array(chain.clone()));
-        }
-
-        self.record(Key::new(field.name()).string(error_msg));
-        self.record(Key::new(format!("{}.chain", field.name())).array(chain));
-    }
-}
-
-impl OpenTelemetryLayer
-where
-    S: Subscriber + for<'span> LookupSpan<'span>,
-    T: otel::Tracer + PreSampledTracer + 'static,
-{
-    /// Set the [`Tracer`] that this layer will use to produce and track
-    /// OpenTelemetry [`Span`]s.
-    ///
-    /// [`Tracer`]: opentelemetry::trace::Tracer
-    /// [`Span`]: opentelemetry::trace::Span
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// use tracing_opentelemetry::OpenTelemetryLayer;
-    /// use tracing_subscriber::layer::SubscriberExt;
-    /// use tracing_subscriber::Registry;
-    ///
-    /// // Create a jaeger exporter pipeline for a `trace_demo` service.
-    /// let tracer = opentelemetry_jaeger::new_agent_pipeline()
-    ///     .with_service_name("trace_demo")
-    ///     .install_simple()
-    ///     .expect("Error initializing Jaeger exporter");
-    ///
-    /// // Create a layer with the configured tracer
-    /// let otel_layer = OpenTelemetryLayer::new(tracer);
-    ///
-    /// // Use the tracing subscriber `Registry`, or any other subscriber
-    /// // that impls `LookupSpan`
-    /// let subscriber = Registry::default().with(otel_layer);
-    /// # drop(subscriber);
-    /// ```
-    pub fn new(tracer: T) -> Self {
-        OpenTelemetryLayer {
-            tracer,
-            location: true,
-            tracked_inactivity: true,
-            with_threads: true,
-            exception_config: ExceptionFieldConfig {
-                record: false,
-                propagate: false,
-            },
-            get_context: WithContext(Self::get_context),
-            _registry: marker::PhantomData,
-        }
-    }
-
-    /// Set the [`Tracer`] that this layer will use to produce and track
-    /// OpenTelemetry [`Span`]s.
-    ///
-    /// [`Tracer`]: opentelemetry::trace::Tracer
-    /// [`Span`]: opentelemetry::trace::Span
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// use tracing_subscriber::layer::SubscriberExt;
-    /// use tracing_subscriber::Registry;
-    ///
-    /// // Create a jaeger exporter pipeline for a `trace_demo` service.
-    /// let tracer = opentelemetry_jaeger::new_agent_pipeline()
-    ///     .with_service_name("trace_demo")
-    ///     .install_simple()
-    ///     .expect("Error initializing Jaeger exporter");
-    ///
-    /// // Create a layer with the configured tracer
-    /// let otel_layer = tracing_opentelemetry::layer().with_tracer(tracer);
-    ///
-    /// // Use the tracing subscriber `Registry`, or any other subscriber
-    /// // that impls `LookupSpan`
-    /// let subscriber = Registry::default().with(otel_layer);
-    /// # drop(subscriber);
-    /// ```
-    pub fn with_tracer(self, tracer: Tracer) -> OpenTelemetryLayer
-    where
-        Tracer: otel::Tracer + PreSampledTracer + 'static,
-    {
-        OpenTelemetryLayer {
-            tracer,
-            location: self.location,
-            tracked_inactivity: self.tracked_inactivity,
-            with_threads: self.with_threads,
-            exception_config: self.exception_config,
-            get_context: WithContext(OpenTelemetryLayer::::get_context),
-            _registry: self._registry,
-        }
-    }
-
-    /// Sets whether or not span and event metadata should include OpenTelemetry
-    /// exception fields such as `exception.message` and `exception.backtrace`
-    /// when an `Error` value is recorded. If multiple error values are recorded
-    /// on the same span/event, only the most recently recorded error value will
-    /// show up under these fields.
-    ///
-    /// These attributes follow the [OpenTelemetry semantic conventions for
-    /// exceptions][conv].
-    ///
-    /// By default, these attributes are not recorded.
-    ///
-    /// [conv]: https://opentelemetry.io/docs/reference/specification/trace/semantic_conventions/exceptions/
-    pub fn with_exception_fields(self, exception_fields: bool) -> Self {
-        Self {
-            exception_config: ExceptionFieldConfig {
-                record: exception_fields,
-                ..self.exception_config
-            },
-            ..self
-        }
-    }
-
-    /// Sets whether or not reporting an `Error` value on an event will
-    /// propagate the OpenTelemetry exception fields such as `exception.message`
-    /// and `exception.backtrace` to the corresponding span. You do not need to
-    /// enable `with_exception_fields` in order to enable this. If multiple
-    /// error values are recorded on the same span/event, only the most recently
-    /// recorded error value will show up under these fields.
-    ///
-    /// These attributes follow the [OpenTelemetry semantic conventions for
-    /// exceptions][conv].
-    ///
-    /// By default, these attributes are not propagated to the span.
-    ///
-    /// [conv]: https://opentelemetry.io/docs/reference/specification/trace/semantic_conventions/exceptions/
-    pub fn with_exception_field_propagation(self, exception_field_propagation: bool) -> Self {
-        Self {
-            exception_config: ExceptionFieldConfig {
-                propagate: exception_field_propagation,
-                ..self.exception_config
-            },
-            ..self
-        }
-    }
-
-    /// Sets whether or not span and event metadata should include OpenTelemetry
-    /// attributes with location information, such as the file, module and line number.
-    ///
-    /// These attributes follow the [OpenTelemetry semantic conventions for
-    /// source locations][conv].
-    ///
-    /// By default, locations are enabled.
-    ///
-    /// [conv]: https://opentelemetry.io/docs/reference/specification/trace/semantic_conventions/span-general/#source-code-attributes
-    pub fn with_location(self, location: bool) -> Self {
-        Self { location, ..self }
-    }
-
-    /// Sets whether or not span and event metadata should include OpenTelemetry
-    /// attributes with location information, such as the file, module and line number.
-    ///
-    /// These attributes follow the [OpenTelemetry semantic conventions for
-    /// source locations][conv].
-    ///
-    /// By default, locations are enabled.
-    ///
-    /// [conv]: https://opentelemetry.io/docs/reference/specification/trace/semantic_conventions/span-general/#source-code-attributes
-    #[deprecated(
-        since = "0.17.3",
-        note = "renamed to `OpenTelemetrySubscriber::with_location`"
-    )]
-    pub fn with_event_location(self, event_location: bool) -> Self {
-        Self {
-            location: event_location,
-            ..self
-        }
-    }
-
-    /// Sets whether or not spans metadata should include the _busy time_
-    /// (total time for which it was entered), and _idle time_ (total time
-    /// the span existed but was not entered).
-    pub fn with_tracked_inactivity(self, tracked_inactivity: bool) -> Self {
-        Self {
-            tracked_inactivity,
-            ..self
-        }
-    }
-
-    /// Sets whether or not spans record additional attributes for the thread
-    /// name and thread ID of the thread they were created on, following the
-    /// [OpenTelemetry semantic conventions for threads][conv].
-    ///
-    /// By default, thread attributes are enabled.
-    ///
-    /// [conv]: https://opentelemetry.io/docs/reference/specification/trace/semantic_conventions/span-general/#general-thread-attributes
-    pub fn with_threads(self, threads: bool) -> Self {
-        Self {
-            with_threads: threads,
-            ..self
-        }
-    }
-
-    /// Retrieve the parent OpenTelemetry [`Context`] from the current tracing
-    /// [`span`] through the [`Registry`]. This [`Context`] links spans to their
-    /// parent for proper hierarchical visualization.
-    ///
-    /// [`Context`]: opentelemetry::Context
-    /// [`span`]: tracing::Span
-    /// [`Registry`]: tracing_subscriber::Registry
-    fn parent_context(&self, attrs: &Attributes<'_>, ctx: &Context<'_, S>) -> OtelContext {
-        // If a span is specified, it _should_ exist in the underlying `Registry`.
-        if let Some(parent) = attrs.parent() {
-            let span = ctx.span(parent).expect("Span not found, this is a bug");
-            let mut extensions = span.extensions_mut();
-            extensions
-                .get_mut::()
-                .map(|builder| self.tracer.sampled_context(builder))
-                .unwrap_or_default()
-        // Else if the span is inferred from context, look up any available current span.
-        } else if attrs.is_contextual() {
-            ctx.lookup_current()
-                .and_then(|span| {
-                    let mut extensions = span.extensions_mut();
-                    extensions
-                        .get_mut::()
-                        .map(|builder| self.tracer.sampled_context(builder))
-                })
-                .unwrap_or_else(OtelContext::current)
-        // Explicit root spans should have no parent context.
-        } else {
-            OtelContext::new()
-        }
-    }
-
-    fn get_context(
-        dispatch: &tracing::Dispatch,
-        id: &span::Id,
-        f: &mut dyn FnMut(&mut OtelData, &dyn PreSampledTracer),
-    ) {
-        let subscriber = dispatch
-            .downcast_ref::()
-            .expect("subscriber should downcast to expected type; this is a bug!");
-        let span = subscriber
-            .span(id)
-            .expect("registry should have a span for the current ID");
-        let layer = dispatch
-            .downcast_ref::>()
-            .expect("layer should downcast to expected type; this is a bug!");
-
-        let mut extensions = span.extensions_mut();
-        if let Some(builder) = extensions.get_mut::() {
-            f(builder, &layer.tracer);
-        }
-    }
-
-    fn extra_span_attrs(&self) -> usize {
-        let mut extra_attrs = 0;
-        if self.location {
-            extra_attrs += 3;
-        }
-        if self.with_threads {
-            extra_attrs += 2;
-        }
-        extra_attrs
-    }
-}
-
-thread_local! {
-    static THREAD_ID: unsync::Lazy = unsync::Lazy::new(|| {
-        // OpenTelemetry's semantic conventions require the thread ID to be
-        // recorded as an integer, but `std::thread::ThreadId` does not expose
-        // the integer value on stable, so we have to convert it to a `usize` by
-        // parsing it. Since this requires allocating a `String`, store it in a
-        // thread local so we only have to do this once.
-        // TODO(eliza): once `std::thread::ThreadId::as_u64` is stabilized
-        // (https://github.com/rust-lang/rust/issues/67939), just use that.
-        thread_id_integer(thread::current().id())
-    });
-}
-
-impl Layer for OpenTelemetryLayer
-where
-    S: Subscriber + for<'span> LookupSpan<'span>,
-    T: otel::Tracer + PreSampledTracer + 'static,
-{
-    /// Creates an [OpenTelemetry `Span`] for the corresponding [tracing `Span`].
-    ///
-    /// [OpenTelemetry `Span`]: opentelemetry::trace::Span
-    /// [tracing `Span`]: tracing::Span
-    fn on_new_span(&self, attrs: &Attributes<'_>, id: &span::Id, ctx: Context<'_, S>) {
-        let span = ctx.span(id).expect("Span not found, this is a bug");
-        let mut extensions = span.extensions_mut();
-
-        if self.tracked_inactivity && extensions.get_mut::().is_none() {
-            extensions.insert(Timings::new());
-        }
-
-        let parent_cx = self.parent_context(attrs, &ctx);
-        let mut builder = self
-            .tracer
-            .span_builder(attrs.metadata().name())
-            .with_start_time(SystemTime::now())
-            // Eagerly assign span id so children have stable parent id
-            .with_span_id(self.tracer.new_span_id());
-
-        // Record new trace id if there is no active parent span
-        if !parent_cx.has_active_span() {
-            builder.trace_id = Some(self.tracer.new_trace_id());
-        }
-
-        let builder_attrs = builder.attributes.get_or_insert(OrderMap::with_capacity(
-            attrs.fields().len() + self.extra_span_attrs(),
-        ));
-
-        if self.location {
-            let meta = attrs.metadata();
-
-            if let Some(filename) = meta.file() {
-                builder_attrs.insert("code.filepath".into(), filename.into());
-            }
-
-            if let Some(module) = meta.module_path() {
-                builder_attrs.insert("code.namespace".into(), module.into());
-            }
-
-            if let Some(line) = meta.line() {
-                builder_attrs.insert("code.lineno".into(), (line as i64).into());
-            }
-        }
-
-        if self.with_threads {
-            THREAD_ID.with(|id| builder_attrs.insert("thread.id".into(), (**id as i64).into()));
-            if let Some(name) = std::thread::current().name() {
-                // TODO(eliza): it's a bummer that we have to allocate here, but
-                // we can't easily get the string as a `static`. it would be
-                // nice if `opentelemetry` could also take `Arc`s as
-                // `String` values...
-                builder_attrs.insert("thread.name".into(), name.to_owned().into());
-            }
-        }
-
-        attrs.record(&mut SpanAttributeVisitor {
-            span_builder: &mut builder,
-            exception_config: self.exception_config,
-        });
-        extensions.insert(OtelData { builder, parent_cx });
-    }
-
-    fn on_enter(&self, id: &span::Id, ctx: Context<'_, S>) {
-        if !self.tracked_inactivity {
-            return;
-        }
-
-        let span = ctx.span(id).expect("Span not found, this is a bug");
-        let mut extensions = span.extensions_mut();
-
-        if let Some(timings) = extensions.get_mut::() {
-            let now = Instant::now();
-            timings.idle += (now - timings.last).as_nanos() as i64;
-            timings.last = now;
-        }
-    }
-
-    fn on_exit(&self, id: &span::Id, ctx: Context<'_, S>) {
-        if !self.tracked_inactivity {
-            return;
-        }
-
-        let span = ctx.span(id).expect("Span not found, this is a bug");
-        let mut extensions = span.extensions_mut();
-
-        if let Some(timings) = extensions.get_mut::() {
-            let now = Instant::now();
-            timings.busy += (now - timings.last).as_nanos() as i64;
-            timings.last = now;
-        }
-    }
-
-    /// Record OpenTelemetry [`attributes`] for the given values.
-    ///
-    /// [`attributes`]: opentelemetry::trace::SpanBuilder::attributes
-    fn on_record(&self, id: &Id, values: &Record<'_>, ctx: Context<'_, S>) {
-        let span = ctx.span(id).expect("Span not found, this is a bug");
-        let mut extensions = span.extensions_mut();
-        if let Some(data) = extensions.get_mut::() {
-            values.record(&mut SpanAttributeVisitor {
-                span_builder: &mut data.builder,
-                exception_config: self.exception_config,
-            });
-        }
-    }
-
-    fn on_follows_from(&self, id: &Id, follows: &Id, ctx: Context) {
-        let span = ctx.span(id).expect("Span not found, this is a bug");
-        let mut extensions = span.extensions_mut();
-        let data = extensions
-            .get_mut::()
-            .expect("Missing otel data span extensions");
-
-        let follows_span = ctx
-            .span(follows)
-            .expect("Span to follow not found, this is a bug");
-        let mut follows_extensions = follows_span.extensions_mut();
-        let follows_data = follows_extensions
-            .get_mut::()
-            .expect("Missing otel data span extensions");
-
-        let follows_context = self
-            .tracer
-            .sampled_context(follows_data)
-            .span()
-            .span_context()
-            .clone();
-        let follows_link = otel::Link::new(follows_context, Vec::new());
-        if let Some(ref mut links) = data.builder.links {
-            links.push(follows_link);
-        } else {
-            data.builder.links = Some(vec![follows_link]);
-        }
-    }
-
-    /// Records OpenTelemetry [`Event`] data on event.
-    ///
-    /// Note: an [`ERROR`]-level event will also set the OpenTelemetry span status code to
-    /// [`Error`], signaling that an error has occurred.
-    ///
-    /// [`Event`]: opentelemetry::trace::Event
-    /// [`ERROR`]: tracing::Level::ERROR
-    /// [`Error`]: opentelemetry::trace::StatusCode::Error
-    fn on_event(&self, event: &Event<'_>, ctx: Context<'_, S>) {
-        // Ignore events that have no explicit parent set *and* are not in the context of a span
-        if let Some(span) = ctx.event_span(event) {
-            // Performing read operations before getting a write lock to avoid a deadlock
-            // See https://github.com/tokio-rs/tracing/issues/763
-            #[cfg(feature = "tracing-log")]
-            let normalized_meta = event.normalized_metadata();
-            #[cfg(feature = "tracing-log")]
-            let meta = normalized_meta.as_ref().unwrap_or_else(|| event.metadata());
-            #[cfg(not(feature = "tracing-log"))]
-            let meta = event.metadata();
-
-            let target = Key::new("target");
-
-            #[cfg(feature = "tracing-log")]
-            let target = if normalized_meta.is_some() {
-                target.string(meta.target().to_owned())
-            } else {
-                target.string(event.metadata().target())
-            };
-
-            #[cfg(not(feature = "tracing-log"))]
-            let target = target.string(meta.target());
-
-            let mut extensions = span.extensions_mut();
-            let span_builder = extensions
-                .get_mut::()
-                .map(|data| &mut data.builder);
-
-            let mut otel_event = otel::Event::new(
-                String::new(),
-                SystemTime::now(),
-                vec![Key::new("level").string(meta.level().as_str()), target],
-                0,
-            );
-            event.record(&mut SpanEventVisitor {
-                event_builder: &mut otel_event,
-                span_builder,
-                exception_config: self.exception_config,
-            });
-
-            if let Some(OtelData { builder, .. }) = extensions.get_mut::() {
-                if builder.status == otel::Status::Unset
-                    && *meta.level() == tracing_core::Level::ERROR
-                {
-                    builder.status = otel::Status::error("")
-                }
-
-                if self.location {
-                    #[cfg(not(feature = "tracing-log"))]
-                    let normalized_meta: Option> = None;
-                    let (file, module) = match &normalized_meta {
-                        Some(meta) => (
-                            meta.file().map(|s| Value::from(s.to_owned())),
-                            meta.module_path().map(|s| Value::from(s.to_owned())),
-                        ),
-                        None => (
-                            event.metadata().file().map(Value::from),
-                            event.metadata().module_path().map(Value::from),
-                        ),
-                    };
-
-                    if let Some(file) = file {
-                        otel_event
-                            .attributes
-                            .push(KeyValue::new("code.filepath", file));
-                    }
-                    if let Some(module) = module {
-                        otel_event
-                            .attributes
-                            .push(KeyValue::new("code.namespace", module));
-                    }
-                    if let Some(line) = meta.line() {
-                        otel_event
-                            .attributes
-                            .push(KeyValue::new("code.lineno", line as i64));
-                    }
-                }
-
-                if let Some(ref mut events) = builder.events {
-                    events.push(otel_event);
-                } else {
-                    builder.events = Some(vec![otel_event]);
-                }
-            }
-        };
-    }
-
-    /// Exports an OpenTelemetry [`Span`] on close.
-    ///
-    /// [`Span`]: opentelemetry::trace::Span
-    fn on_close(&self, id: span::Id, ctx: Context<'_, S>) {
-        let span = ctx.span(&id).expect("Span not found, this is a bug");
-        let mut extensions = span.extensions_mut();
-
-        if let Some(OtelData {
-            mut builder,
-            parent_cx,
-        }) = extensions.remove::()
-        {
-            if self.tracked_inactivity {
-                // Append busy/idle timings when enabled.
-                if let Some(timings) = extensions.get_mut::() {
-                    let busy_ns = Key::new("busy_ns");
-                    let idle_ns = Key::new("idle_ns");
-
-                    let attributes = builder
-                        .attributes
-                        .get_or_insert_with(|| OrderMap::with_capacity(2));
-                    attributes.insert(busy_ns, timings.busy.into());
-                    attributes.insert(idle_ns, timings.idle.into());
-                }
-            }
-
-            // Assign end time, build and start span, drop span to export
-            builder
-                .with_end_time(SystemTime::now())
-                .start_with_context(&self.tracer, &parent_cx);
-        }
-    }
-
-    // SAFETY: this is safe because the `WithContext` function pointer is valid
-    // for the lifetime of `&self`.
-    unsafe fn downcast_raw(&self, id: TypeId) -> Option<*const ()> {
-        match id {
-            id if id == TypeId::of::() => Some(self as *const _ as *const ()),
-            id if id == TypeId::of::() => {
-                Some(&self.get_context as *const _ as *const ())
-            }
-            _ => None,
-        }
-    }
-}
-
-struct Timings {
-    idle: i64,
-    busy: i64,
-    last: Instant,
-}
-
-impl Timings {
-    fn new() -> Self {
-        Self {
-            idle: 0,
-            busy: 0,
-            last: Instant::now(),
-        }
-    }
-}
-
-fn thread_id_integer(id: thread::ThreadId) -> u64 {
-    let thread_id = format!("{:?}", id);
-    thread_id
-        .trim_start_matches("ThreadId(")
-        .trim_end_matches(')')
-        .parse::()
-        .expect("thread ID should parse as an integer")
-}
-
-#[cfg(test)]
-mod tests {
-    use super::*;
-    use crate::OtelData;
-    use opentelemetry::{
-        trace::{noop, TraceFlags},
-        StringValue,
-    };
-    use std::{
-        borrow::Cow,
-        collections::HashMap,
-        error::Error,
-        fmt::Display,
-        sync::{Arc, Mutex},
-        thread,
-        time::SystemTime,
-    };
-    use tracing_subscriber::prelude::*;
-
-    #[derive(Debug, Clone)]
-    struct TestTracer(Arc>>);
-    impl otel::Tracer for TestTracer {
-        type Span = noop::NoopSpan;
-        fn start_with_context(&self, _name: T, _context: &OtelContext) -> Self::Span
-        where
-            T: Into>,
-        {
-            noop::NoopSpan::new()
-        }
-        fn span_builder(&self, name: T) -> otel::SpanBuilder
-        where
-            T: Into>,
-        {
-            otel::SpanBuilder::from_name(name)
-        }
-        fn build_with_context(
-            &self,
-            builder: otel::SpanBuilder,
-            parent_cx: &OtelContext,
-        ) -> Self::Span {
-            *self.0.lock().unwrap() = Some(OtelData {
-                builder,
-                parent_cx: parent_cx.clone(),
-            });
-            noop::NoopSpan::new()
-        }
-    }
-
-    impl PreSampledTracer for TestTracer {
-        fn sampled_context(&self, _builder: &mut crate::OtelData) -> OtelContext {
-            OtelContext::new()
-        }
-        fn new_trace_id(&self) -> otel::TraceId {
-            otel::TraceId::INVALID
-        }
-        fn new_span_id(&self) -> otel::SpanId {
-            otel::SpanId::INVALID
-        }
-    }
-
-    impl TestTracer {
-        fn with_data(&self, f: impl FnOnce(&OtelData) -> T) -> T {
-            let lock = self.0.lock().unwrap();
-            let data = lock.as_ref().expect("no span data has been recorded yet");
-            f(data)
-        }
-    }
-
-    #[derive(Debug, Clone)]
-    struct TestSpan(otel::SpanContext);
-    impl otel::Span for TestSpan {
-        fn add_event_with_timestamp>>(
-            &mut self,
-            _: T,
-            _: SystemTime,
-            _: Vec,
-        ) {
-        }
-        fn span_context(&self) -> &otel::SpanContext {
-            &self.0
-        }
-        fn is_recording(&self) -> bool {
-            false
-        }
-        fn set_attribute(&mut self, _attribute: KeyValue) {}
-        fn set_status(&mut self, _status: otel::Status) {}
-        fn update_name>>(&mut self, _new_name: T) {}
-        fn end_with_timestamp(&mut self, _timestamp: SystemTime) {}
-    }
-
-    #[derive(Debug)]
-    struct TestDynError {
-        msg: &'static str,
-        source: Option>,
-    }
-    impl Display for TestDynError {
-        fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
-            write!(f, "{}", self.msg)
-        }
-    }
-    impl Error for TestDynError {
-        fn source(&self) -> Option<&(dyn Error + 'static)> {
-            match &self.source {
-                Some(source) => Some(source),
-                None => None,
-            }
-        }
-    }
-    impl TestDynError {
-        fn new(msg: &'static str) -> Self {
-            Self { msg, source: None }
-        }
-        fn with_parent(self, parent_msg: &'static str) -> Self {
-            Self {
-                msg: parent_msg,
-                source: Some(Box::new(self)),
-            }
-        }
-    }
-
-    #[test]
-    fn dynamic_span_names() {
-        let dynamic_name = "GET http://example.com".to_string();
-        let tracer = TestTracer(Arc::new(Mutex::new(None)));
-        let subscriber = tracing_subscriber::registry().with(layer().with_tracer(tracer.clone()));
-
-        tracing::subscriber::with_default(subscriber, || {
-            tracing::debug_span!("static_name", otel.name = dynamic_name.as_str());
-        });
-
-        let recorded_name = tracer
-            .0
-            .lock()
-            .unwrap()
-            .as_ref()
-            .map(|b| b.builder.name.clone());
-        assert_eq!(recorded_name, Some(dynamic_name.into()))
-    }
-
-    #[test]
-    fn span_kind() {
-        let tracer = TestTracer(Arc::new(Mutex::new(None)));
-        let subscriber = tracing_subscriber::registry().with(layer().with_tracer(tracer.clone()));
-
-        tracing::subscriber::with_default(subscriber, || {
-            tracing::debug_span!("request", otel.kind = "server");
-        });
-
-        let recorded_kind = tracer.with_data(|data| data.builder.span_kind.clone());
-        assert_eq!(recorded_kind, Some(otel::SpanKind::Server))
-    }
-
-    #[test]
-    fn span_status_code() {
-        let tracer = TestTracer(Arc::new(Mutex::new(None)));
-        let subscriber = tracing_subscriber::registry().with(layer().with_tracer(tracer.clone()));
-
-        tracing::subscriber::with_default(subscriber, || {
-            tracing::debug_span!("request", otel.status_code = ?otel::Status::Ok);
-        });
-        let recorded_status = tracer
-            .0
-            .lock()
-            .unwrap()
-            .as_ref()
-            .unwrap()
-            .builder
-            .status
-            .clone();
-
-        assert_eq!(recorded_status, otel::Status::Ok)
-    }
-
-    #[test]
-    fn span_status_message() {
-        let tracer = TestTracer(Arc::new(Mutex::new(None)));
-        let subscriber = tracing_subscriber::registry().with(layer().with_tracer(tracer.clone()));
-
-        let message = "message";
-
-        tracing::subscriber::with_default(subscriber, || {
-            tracing::debug_span!("request", otel.status_message = message);
-        });
-
-        let recorded_status_message = tracer
-            .0
-            .lock()
-            .unwrap()
-            .as_ref()
-            .unwrap()
-            .builder
-            .status
-            .clone();
-
-        assert_eq!(recorded_status_message, otel::Status::error(message))
-    }
-
-    #[test]
-    fn trace_id_from_existing_context() {
-        let tracer = TestTracer(Arc::new(Mutex::new(None)));
-        let subscriber = tracing_subscriber::registry().with(layer().with_tracer(tracer.clone()));
-        let trace_id = otel::TraceId::from(42u128.to_be_bytes());
-        let existing_cx = OtelContext::current_with_span(TestSpan(otel::SpanContext::new(
-            trace_id,
-            otel::SpanId::from(1u64.to_be_bytes()),
-            TraceFlags::default(),
-            false,
-            Default::default(),
-        )));
-        let _g = existing_cx.attach();
-
-        tracing::subscriber::with_default(subscriber, || {
-            tracing::debug_span!("request", otel.kind = "server");
-        });
-
-        let recorded_trace_id =
-            tracer.with_data(|data| data.parent_cx.span().span_context().trace_id());
-        assert_eq!(recorded_trace_id, trace_id)
-    }
-
-    #[test]
-    fn includes_timings() {
-        let tracer = TestTracer(Arc::new(Mutex::new(None)));
-        let subscriber = tracing_subscriber::registry().with(
-            layer()
-                .with_tracer(tracer.clone())
-                .with_tracked_inactivity(true),
-        );
-
-        tracing::subscriber::with_default(subscriber, || {
-            tracing::debug_span!("request");
-        });
-
-        let attributes = tracer.with_data(|data| data.builder.attributes.as_ref().unwrap().clone());
-        let keys = attributes
-            .iter()
-            .map(|(key, _)| key.as_str())
-            .collect::>();
-        assert!(keys.contains(&"idle_ns"));
-        assert!(keys.contains(&"busy_ns"));
-    }
-
-    #[test]
-    fn records_error_fields() {
-        let tracer = TestTracer(Arc::new(Mutex::new(None)));
-        let subscriber = tracing_subscriber::registry().with(
-            layer()
-                .with_tracer(tracer.clone())
-                .with_exception_fields(true),
-        );
-
-        let err = TestDynError::new("base error")
-            .with_parent("intermediate error")
-            .with_parent("user error");
-
-        tracing::subscriber::with_default(subscriber, || {
-            tracing::debug_span!(
-                "request",
-                error = &err as &(dyn std::error::Error + 'static)
-            );
-        });
-
-        let attributes = tracer
-            .0
-            .lock()
-            .unwrap()
-            .as_ref()
-            .unwrap()
-            .builder
-            .attributes
-            .as_ref()
-            .unwrap()
-            .clone();
-
-        let key_values = attributes
-            .into_iter()
-            .map(|(key, value)| (key.as_str().to_owned(), value))
-            .collect::>();
-
-        assert_eq!(key_values["error"].as_str(), "user error");
-        assert_eq!(
-            key_values["error.chain"],
-            Value::Array(
-                vec![
-                    StringValue::from("intermediate error"),
-                    StringValue::from("base error")
-                ]
-                .into()
-            )
-        );
-
-        assert_eq!(key_values[FIELD_EXCEPTION_MESSAGE].as_str(), "user error");
-        assert_eq!(
-            key_values[FIELD_EXCEPTION_STACKTRACE],
-            Value::Array(
-                vec![
-                    StringValue::from("intermediate error"),
-                    StringValue::from("base error")
-                ]
-                .into()
-            )
-        );
-    }
-
-    #[test]
-    fn includes_span_location() {
-        let tracer = TestTracer(Arc::new(Mutex::new(None)));
-        let subscriber = tracing_subscriber::registry()
-            .with(layer().with_tracer(tracer.clone()).with_location(true));
-
-        tracing::subscriber::with_default(subscriber, || {
-            tracing::debug_span!("request");
-        });
-
-        let attributes = tracer.with_data(|data| data.builder.attributes.as_ref().unwrap().clone());
-        let keys = attributes
-            .iter()
-            .map(|(key, _)| key.as_str())
-            .collect::>();
-        assert!(keys.contains(&"code.filepath"));
-        assert!(keys.contains(&"code.namespace"));
-        assert!(keys.contains(&"code.lineno"));
-    }
-
-    #[test]
-    fn excludes_span_location() {
-        let tracer = TestTracer(Arc::new(Mutex::new(None)));
-        let subscriber = tracing_subscriber::registry()
-            .with(layer().with_tracer(tracer.clone()).with_location(false));
-
-        tracing::subscriber::with_default(subscriber, || {
-            tracing::debug_span!("request");
-        });
-
-        let attributes = tracer.with_data(|data| data.builder.attributes.as_ref().unwrap().clone());
-        let keys = attributes
-            .iter()
-            .map(|(key, _)| key.as_str())
-            .collect::>();
-        assert!(!keys.contains(&"code.filepath"));
-        assert!(!keys.contains(&"code.namespace"));
-        assert!(!keys.contains(&"code.lineno"));
-    }
-
-    #[test]
-    fn includes_thread() {
-        let thread = thread::current();
-        let expected_name = thread
-            .name()
-            .map(|name| Value::String(name.to_owned().into()));
-        let expected_id = Value::I64(thread_id_integer(thread.id()) as i64);
-
-        let tracer = TestTracer(Arc::new(Mutex::new(None)));
-        let subscriber = tracing_subscriber::registry()
-            .with(layer().with_tracer(tracer.clone()).with_threads(true));
-
-        tracing::subscriber::with_default(subscriber, || {
-            tracing::debug_span!("request");
-        });
-
-        let attributes = tracer
-            .with_data(|data| data.builder.attributes.as_ref().unwrap().clone())
-            .drain(..)
-            .map(|(key, value)| (key.as_str().to_string(), value))
-            .collect::>();
-        assert_eq!(attributes.get("thread.name"), expected_name.as_ref());
-        assert_eq!(attributes.get("thread.id"), Some(&expected_id));
-    }
-
-    #[test]
-    fn excludes_thread() {
-        let tracer = TestTracer(Arc::new(Mutex::new(None)));
-        let subscriber = tracing_subscriber::registry()
-            .with(layer().with_tracer(tracer.clone()).with_threads(false));
-
-        tracing::subscriber::with_default(subscriber, || {
-            tracing::debug_span!("request");
-        });
-
-        let attributes = tracer.with_data(|data| data.builder.attributes.as_ref().unwrap().clone());
-        let keys = attributes
-            .iter()
-            .map(|(key, _)| key.as_str())
-            .collect::>();
-        assert!(!keys.contains(&"thread.name"));
-        assert!(!keys.contains(&"thread.id"));
-    }
-
-    #[test]
-    fn propagates_error_fields_from_event_to_span() {
-        let tracer = TestTracer(Arc::new(Mutex::new(None)));
-        let subscriber = tracing_subscriber::registry().with(
-            layer()
-                .with_tracer(tracer.clone())
-                .with_exception_field_propagation(true),
-        );
-
-        let err = TestDynError::new("base error")
-            .with_parent("intermediate error")
-            .with_parent("user error");
-
-        tracing::subscriber::with_default(subscriber, || {
-            let _guard = tracing::debug_span!("request",).entered();
-
-            tracing::error!(
-                error = &err as &(dyn std::error::Error + 'static),
-                "request error!"
-            )
-        });
-
-        let attributes = tracer
-            .0
-            .lock()
-            .unwrap()
-            .as_ref()
-            .unwrap()
-            .builder
-            .attributes
-            .as_ref()
-            .unwrap()
-            .clone();
-
-        let key_values = attributes
-            .into_iter()
-            .map(|(key, value)| (key.as_str().to_owned(), value))
-            .collect::>();
-
-        assert_eq!(key_values[FIELD_EXCEPTION_MESSAGE].as_str(), "user error");
-        assert_eq!(
-            key_values[FIELD_EXCEPTION_STACKTRACE],
-            Value::Array(
-                vec![
-                    StringValue::from("intermediate error"),
-                    StringValue::from("base error")
-                ]
-                .into()
-            )
-        );
-    }
-}
diff -Nru temporalio-1.3.0/vendor/tracing-opentelemetry/src/lib.rs temporalio-1.3.0/vendor/tracing-opentelemetry/src/lib.rs
--- temporalio-1.3.0/vendor/tracing-opentelemetry/src/lib.rs	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/tracing-opentelemetry/src/lib.rs	1970-01-01 00:00:00.000000000 +0000
@@ -1,146 +0,0 @@
-//! # Tracing OpenTelemetry
-//!
-//! [`tracing`] is a framework for instrumenting Rust programs to collect
-//! structured, event-based diagnostic information. This crate provides a layer
-//! that connects spans from multiple systems into a trace and emits them to
-//! [OpenTelemetry]-compatible distributed tracing systems for processing and
-//! visualization.
-//!
-//! [OpenTelemetry]: https://opentelemetry.io
-//! [`tracing`]: https://github.com/tokio-rs/tracing
-//!
-//! *Compiler support: [requires `rustc` 1.56+][msrv]*
-//!
-//! [msrv]: #supported-rust-versions
-//!
-//! ### Special Fields
-//!
-//! Fields with an `otel.` prefix are reserved for this crate and have specific
-//! meaning. They are treated as ordinary fields by other layers. The current
-//! special fields are:
-//!
-//! * `otel.name`: Override the span name sent to OpenTelemetry exporters.
-//! Setting this field is useful if you want to display non-static information
-//! in your span name.
-//! * `otel.kind`: Set the span kind to one of the supported OpenTelemetry [span kinds].
-//! * `otel.status_code`: Set the span status code to one of the supported OpenTelemetry [span status codes].
-//! * `otel.status_message`: Set the span status message.
-//!
-//! [span kinds]: opentelemetry::trace::SpanKind
-//! [span status codes]: opentelemetry::trace::StatusCode
-//!
-//! ### Semantic Conventions
-//!
-//! OpenTelemetry defines conventional names for attributes of common
-//! operations. These names can be assigned directly as fields, e.g.
-//! `trace_span!("request", "otel.kind" = %SpanKind::Client, "http.url" = ..)`, and they
-//! will be passed through to your configured OpenTelemetry exporter. You can
-//! find the full list of the operations and their expected field names in the
-//! [semantic conventions] spec.
-//!
-//! [semantic conventions]: https://github.com/open-telemetry/opentelemetry-specification/tree/master/specification/trace/semantic_conventions
-//!
-//! ### Stability Status
-//!
-//! The OpenTelemetry specification is currently in beta so some breaking
-//! changes may still occur on the path to 1.0. You can follow the changes via
-//! the [spec repository] to track progress toward stabilization.
-//!
-//! [spec repository]: https://github.com/open-telemetry/opentelemetry-specification
-//!
-//! ## Examples
-//!
-//! ```
-//! use opentelemetry::sdk::export::trace::stdout;
-//! use tracing::{error, span};
-//! use tracing_subscriber::layer::SubscriberExt;
-//! use tracing_subscriber::Registry;
-//!
-//! // Create a new OpenTelemetry pipeline
-//! let tracer = stdout::new_pipeline().install_simple();
-//!
-//! // Create a tracing layer with the configured tracer
-//! let telemetry = tracing_opentelemetry::layer().with_tracer(tracer);
-//!
-//! // Use the tracing subscriber `Registry`, or any other subscriber
-//! // that impls `LookupSpan`
-//! let subscriber = Registry::default().with(telemetry);
-//!
-//! // Trace executed code
-//! tracing::subscriber::with_default(subscriber, || {
-//!     // Spans will be sent to the configured OpenTelemetry exporter
-//!     let root = span!(tracing::Level::TRACE, "app_start", work_units = 2);
-//!     let _enter = root.enter();
-//!
-//!     error!("This event will be logged in the root span.");
-//! });
-//! ```
-//!
-//! ## Feature Flags
-//!
-//! - `metrics`: Enables the [`MetricsSubscriber`] type, a [subscriber] that
-//!   exports OpenTelemetry metrics from specifically-named events. This enables
-//!   the `metrics` feature flag on the `opentelemetry` crate.  *Enabled by
-//!   default*.
-//!
-//! ## Supported Rust Versions
-//!
-//! Tracing is built against the latest stable release. The minimum supported
-//! version is 1.56. The current Tracing version is not guaranteed to build on
-//! Rust versions earlier than the minimum supported version.
-//!
-//! Tracing follows the same compiler support policies as the rest of the Tokio
-//! project. The current stable Rust compiler and the three most recent minor
-//! versions before it will always be supported. For example, if the current
-//! stable compiler version is 1.45, the minimum supported version will not be
-//! increased past 1.42, three minor versions prior. Increasing the minimum
-//! supported compiler version is not considered a semver breaking change as
-//! long as doing so complies with this policy.
-//!
-//! [subscriber]: tracing_subscriber::subscribe
-#![deny(unreachable_pub)]
-#![cfg_attr(test, deny(warnings))]
-#![doc(html_root_url = "https://docs.rs/tracing-opentelemetry/0.18.0")]
-#![doc(
-    html_logo_url = "https://raw.githubusercontent.com/tokio-rs/tracing/master/assets/logo-type.png",
-    issue_tracker_base_url = "https://github.com/tokio-rs/tracing/issues/"
-)]
-#![cfg_attr(
-    docsrs,
-    // Allows displaying cfgs/feature flags in the documentation.
-    feature(doc_cfg, doc_auto_cfg),
-    // Allows adding traits to RustDoc's list of "notable traits"
-    feature(doc_notable_trait),
-    // Fail the docs build if any intra-docs links are broken
-    deny(rustdoc::broken_intra_doc_links),
-)]
-
-/// Implementation of the trace::Subscriber trait; publishes OpenTelemetry metrics.
-#[cfg(feature = "metrics")]
-mod metrics;
-
-/// Implementation of the trace::Layer as a source of OpenTelemetry data.
-mod layer;
-/// Span extension which enables OpenTelemetry context management.
-mod span_ext;
-/// Protocols for OpenTelemetry Tracers that are compatible with Tracing
-mod tracer;
-
-pub use layer::{layer, OpenTelemetryLayer};
-
-#[cfg(feature = "metrics")]
-pub use metrics::MetricsLayer;
-pub use span_ext::OpenTelemetrySpanExt;
-pub use tracer::PreSampledTracer;
-
-/// Per-span OpenTelemetry data tracked by this crate.
-///
-/// Useful for implementing [PreSampledTracer] in alternate otel SDKs.
-#[derive(Debug, Clone)]
-pub struct OtelData {
-    /// The parent otel `Context` for the current tracing span.
-    pub parent_cx: opentelemetry::Context,
-
-    /// The otel span data recorded during the current tracing span.
-    pub builder: opentelemetry::trace::SpanBuilder,
-}
diff -Nru temporalio-1.3.0/vendor/tracing-opentelemetry/src/metrics.rs temporalio-1.3.0/vendor/tracing-opentelemetry/src/metrics.rs
--- temporalio-1.3.0/vendor/tracing-opentelemetry/src/metrics.rs	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/tracing-opentelemetry/src/metrics.rs	1970-01-01 00:00:00.000000000 +0000
@@ -1,367 +0,0 @@
-use std::{collections::HashMap, fmt, sync::RwLock};
-use tracing::{field::Visit, Subscriber};
-use tracing_core::Field;
-
-use opentelemetry::{
-    metrics::{Counter, Histogram, Meter, MeterProvider, UpDownCounter},
-    sdk::metrics::controllers::BasicController,
-    Context as OtelContext,
-};
-use tracing_subscriber::{layer::Context, registry::LookupSpan, Layer};
-
-const CARGO_PKG_VERSION: &str = env!("CARGO_PKG_VERSION");
-const INSTRUMENTATION_LIBRARY_NAME: &str = "tracing/tracing-opentelemetry";
-
-const METRIC_PREFIX_MONOTONIC_COUNTER: &str = "monotonic_counter.";
-const METRIC_PREFIX_COUNTER: &str = "counter.";
-const METRIC_PREFIX_HISTOGRAM: &str = "histogram.";
-const I64_MAX: u64 = i64::MAX as u64;
-
-#[derive(Default)]
-pub(crate) struct Instruments {
-    u64_counter: MetricsMap>,
-    f64_counter: MetricsMap>,
-    i64_up_down_counter: MetricsMap>,
-    f64_up_down_counter: MetricsMap>,
-    u64_histogram: MetricsMap>,
-    i64_histogram: MetricsMap>,
-    f64_histogram: MetricsMap>,
-}
-
-type MetricsMap = RwLock>;
-
-#[derive(Copy, Clone, Debug)]
-pub(crate) enum InstrumentType {
-    CounterU64(u64),
-    CounterF64(f64),
-    UpDownCounterI64(i64),
-    UpDownCounterF64(f64),
-    HistogramU64(u64),
-    HistogramI64(i64),
-    HistogramF64(f64),
-}
-
-impl Instruments {
-    pub(crate) fn update_metric(
-        &self,
-        cx: &OtelContext,
-        meter: &Meter,
-        instrument_type: InstrumentType,
-        metric_name: &'static str,
-    ) {
-        fn update_or_insert(
-            map: &MetricsMap,
-            name: &'static str,
-            insert: impl FnOnce() -> T,
-            update: impl FnOnce(&T),
-        ) {
-            {
-                let lock = map.read().unwrap();
-                if let Some(metric) = lock.get(name) {
-                    update(metric);
-                    return;
-                }
-            }
-
-            // that metric did not already exist, so we have to acquire a write lock to
-            // create it.
-            let mut lock = map.write().unwrap();
-            // handle the case where the entry was created while we were waiting to
-            // acquire the write lock
-            let metric = lock.entry(name).or_insert_with(insert);
-            update(metric)
-        }
-
-        match instrument_type {
-            InstrumentType::CounterU64(value) => {
-                update_or_insert(
-                    &self.u64_counter,
-                    metric_name,
-                    || meter.u64_counter(metric_name).init(),
-                    |ctr| ctr.add(cx, value, &[]),
-                );
-            }
-            InstrumentType::CounterF64(value) => {
-                update_or_insert(
-                    &self.f64_counter,
-                    metric_name,
-                    || meter.f64_counter(metric_name).init(),
-                    |ctr| ctr.add(cx, value, &[]),
-                );
-            }
-            InstrumentType::UpDownCounterI64(value) => {
-                update_or_insert(
-                    &self.i64_up_down_counter,
-                    metric_name,
-                    || meter.i64_up_down_counter(metric_name).init(),
-                    |ctr| ctr.add(cx, value, &[]),
-                );
-            }
-            InstrumentType::UpDownCounterF64(value) => {
-                update_or_insert(
-                    &self.f64_up_down_counter,
-                    metric_name,
-                    || meter.f64_up_down_counter(metric_name).init(),
-                    |ctr| ctr.add(cx, value, &[]),
-                );
-            }
-            InstrumentType::HistogramU64(value) => {
-                update_or_insert(
-                    &self.u64_histogram,
-                    metric_name,
-                    || meter.u64_histogram(metric_name).init(),
-                    |rec| rec.record(cx, value, &[]),
-                );
-            }
-            InstrumentType::HistogramI64(value) => {
-                update_or_insert(
-                    &self.i64_histogram,
-                    metric_name,
-                    || meter.i64_histogram(metric_name).init(),
-                    |rec| rec.record(cx, value, &[]),
-                );
-            }
-            InstrumentType::HistogramF64(value) => {
-                update_or_insert(
-                    &self.f64_histogram,
-                    metric_name,
-                    || meter.f64_histogram(metric_name).init(),
-                    |rec| rec.record(cx, value, &[]),
-                );
-            }
-        };
-    }
-}
-
-pub(crate) struct MetricVisitor<'a> {
-    pub(crate) instruments: &'a Instruments,
-    pub(crate) meter: &'a Meter,
-}
-
-impl<'a> Visit for MetricVisitor<'a> {
-    fn record_debug(&mut self, _field: &Field, _value: &dyn fmt::Debug) {
-        // Do nothing
-    }
-
-    fn record_u64(&mut self, field: &Field, value: u64) {
-        let cx = OtelContext::current();
-        if let Some(metric_name) = field.name().strip_prefix(METRIC_PREFIX_MONOTONIC_COUNTER) {
-            self.instruments.update_metric(
-                &cx,
-                self.meter,
-                InstrumentType::CounterU64(value),
-                metric_name,
-            );
-        } else if let Some(metric_name) = field.name().strip_prefix(METRIC_PREFIX_COUNTER) {
-            if value <= I64_MAX {
-                self.instruments.update_metric(
-                    &cx,
-                    self.meter,
-                    InstrumentType::UpDownCounterI64(value as i64),
-                    metric_name,
-                );
-            } else {
-                eprintln!(
-                    "[tracing-opentelemetry]: Received Counter metric, but \
-                    provided u64: {} is greater than i64::MAX. Ignoring \
-                    this metric.",
-                    value
-                );
-            }
-        } else if let Some(metric_name) = field.name().strip_prefix(METRIC_PREFIX_HISTOGRAM) {
-            self.instruments.update_metric(
-                &cx,
-                self.meter,
-                InstrumentType::HistogramU64(value),
-                metric_name,
-            );
-        }
-    }
-
-    fn record_f64(&mut self, field: &Field, value: f64) {
-        let cx = OtelContext::current();
-        if let Some(metric_name) = field.name().strip_prefix(METRIC_PREFIX_MONOTONIC_COUNTER) {
-            self.instruments.update_metric(
-                &cx,
-                self.meter,
-                InstrumentType::CounterF64(value),
-                metric_name,
-            );
-        } else if let Some(metric_name) = field.name().strip_prefix(METRIC_PREFIX_COUNTER) {
-            self.instruments.update_metric(
-                &cx,
-                self.meter,
-                InstrumentType::UpDownCounterF64(value),
-                metric_name,
-            );
-        } else if let Some(metric_name) = field.name().strip_prefix(METRIC_PREFIX_HISTOGRAM) {
-            self.instruments.update_metric(
-                &cx,
-                self.meter,
-                InstrumentType::HistogramF64(value),
-                metric_name,
-            );
-        }
-    }
-
-    fn record_i64(&mut self, field: &Field, value: i64) {
-        let cx = OtelContext::current();
-        if let Some(metric_name) = field.name().strip_prefix(METRIC_PREFIX_MONOTONIC_COUNTER) {
-            self.instruments.update_metric(
-                &cx,
-                self.meter,
-                InstrumentType::CounterU64(value as u64),
-                metric_name,
-            );
-        } else if let Some(metric_name) = field.name().strip_prefix(METRIC_PREFIX_COUNTER) {
-            self.instruments.update_metric(
-                &cx,
-                self.meter,
-                InstrumentType::UpDownCounterI64(value),
-                metric_name,
-            );
-        } else if let Some(metric_name) = field.name().strip_prefix(METRIC_PREFIX_HISTOGRAM) {
-            self.instruments.update_metric(
-                &cx,
-                self.meter,
-                InstrumentType::HistogramI64(value),
-                metric_name,
-            );
-        }
-    }
-}
-
-/// A layer that publishes metrics via the OpenTelemetry SDK.
-///
-/// # Usage
-///
-/// No configuration is needed for this Layer, as it's only responsible for
-/// pushing data out to the `opentelemetry` family of crates. For example, when
-/// using `opentelemetry-otlp`, that crate will provide its own set of
-/// configuration options for setting up the duration metrics will be collected
-/// before exporting to the OpenTelemetry Collector, aggregation of data points,
-/// etc.
-///
-/// ```no_run
-/// use tracing_opentelemetry::MetricsLayer;
-/// use tracing_subscriber::layer::SubscriberExt;
-/// use tracing_subscriber::Registry;
-/// # use opentelemetry::sdk::metrics::controllers::BasicController;
-///
-/// // Constructing a BasicController is out-of-scope for the docs here, but there
-/// // are examples in the opentelemetry repository. See:
-/// // https://github.com/open-telemetry/opentelemetry-rust/blob/d4b9befea04bcc7fc19319a6ebf5b5070131c486/examples/basic-otlp/src/main.rs#L35-L52
-/// # let controller: BasicController = unimplemented!();
-///
-/// let opentelemetry_metrics =  MetricsLayer::new(controller);
-/// let subscriber = Registry::default().with(opentelemetry_metrics);
-/// tracing::subscriber::set_global_default(subscriber).unwrap();
-/// ```
-///
-/// To publish a new metric, add a key-value pair to your `tracing::Event` that
-/// contains following prefixes:
-/// - `monotonic_counter.` (non-negative numbers): Used when the counter should
-///   only ever increase
-/// - `counter.`: Used when the counter can go up or down
-/// - `value.`: Used for discrete data points (i.e., summing them does not make
-///   semantic sense)
-///
-/// Examples:
-/// ```
-/// # use tracing::info;
-/// info!(monotonic_counter.foo = 1);
-/// info!(monotonic_counter.bar = 1.1);
-///
-/// info!(counter.baz = 1);
-/// info!(counter.baz = -1);
-/// info!(counter.xyz = 1.1);
-///
-/// info!(value.qux = 1);
-/// info!(value.abc = -1);
-/// info!(value.def = 1.1);
-/// ```
-///
-/// # Mixing data types
-///
-/// ## Floating-point numbers
-///
-/// Do not mix floating point and non-floating point numbers for the same
-/// metric. If a floating point number will be used for a given metric, be sure
-/// to cast any other usages of that metric to a floating point number.
-///
-/// Do this:
-/// ```
-/// # use tracing::info;
-/// info!(monotonic_counter.foo = 1_f64);
-/// info!(monotonic_counter.foo = 1.1);
-/// ```
-///
-/// This is because all data published for a given metric name must be the same
-/// numeric type.
-///
-/// ## Integers
-///
-/// Positive and negative integers can be mixed freely. The instrumentation
-/// provided by `tracing` assumes that all integers are `i64` unless explicitly
-/// cast to something else. In the case that an integer *is* cast to `u64`, this
-/// subscriber will handle the conversion internally.
-///
-/// For example:
-/// ```
-/// # use tracing::info;
-/// // The subscriber receives an i64
-/// info!(counter.baz = 1);
-///
-/// // The subscriber receives an i64
-/// info!(counter.baz = -1);
-///
-/// // The subscriber receives a u64, but casts it to i64 internally
-/// info!(counter.baz = 1_u64);
-///
-/// // The subscriber receives a u64, but cannot cast it to i64 because of
-/// // overflow. An error is printed to stderr, and the metric is dropped.
-/// info!(counter.baz = (i64::MAX as u64) + 1)
-/// ```
-///
-/// # Implementation Details
-///
-/// `MetricsLayer` holds a set of maps, with each map corresponding to a
-/// type of metric supported by OpenTelemetry. These maps are populated lazily.
-/// The first time that a metric is emitted by the instrumentation, a `Metric`
-/// instance will be created and added to the corresponding map. This means that
-/// any time a metric is emitted by the instrumentation, one map lookup has to
-/// be performed.
-///
-/// In the future, this can be improved by associating each `Metric` instance to
-/// its callsite, eliminating the need for any maps.
-///
-#[cfg_attr(docsrs, doc(cfg(feature = "metrics")))]
-pub struct MetricsLayer {
-    meter: Meter,
-    instruments: Instruments,
-}
-
-impl MetricsLayer {
-    /// Create a new instance of MetricsLayer.
-    pub fn new(controller: BasicController) -> Self {
-        let meter =
-            controller.versioned_meter(INSTRUMENTATION_LIBRARY_NAME, Some(CARGO_PKG_VERSION), None);
-        MetricsLayer {
-            meter,
-            instruments: Default::default(),
-        }
-    }
-}
-
-impl Layer for MetricsLayer
-where
-    S: Subscriber + for<'span> LookupSpan<'span>,
-{
-    fn on_event(&self, event: &tracing::Event<'_>, _ctx: Context<'_, S>) {
-        let mut metric_visitor = MetricVisitor {
-            instruments: &self.instruments,
-            meter: &self.meter,
-        };
-        event.record(&mut metric_visitor);
-    }
-}
diff -Nru temporalio-1.3.0/vendor/tracing-opentelemetry/src/span_ext.rs temporalio-1.3.0/vendor/tracing-opentelemetry/src/span_ext.rs
--- temporalio-1.3.0/vendor/tracing-opentelemetry/src/span_ext.rs	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/tracing-opentelemetry/src/span_ext.rs	1970-01-01 00:00:00.000000000 +0000
@@ -1,170 +0,0 @@
-use crate::layer::WithContext;
-use opentelemetry::{trace::SpanContext, Context, KeyValue};
-
-/// Utility functions to allow tracing [`Span`]s to accept and return
-/// [OpenTelemetry] [`Context`]s.
-///
-/// [`Span`]: tracing::Span
-/// [OpenTelemetry]: https://opentelemetry.io
-/// [`Context`]: opentelemetry::Context
-pub trait OpenTelemetrySpanExt {
-    /// Associates `self` with a given OpenTelemetry trace, using the provided
-    /// parent [`Context`].
-    ///
-    /// [`Context`]: opentelemetry::Context
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// use opentelemetry::{propagation::TextMapPropagator, trace::TraceContextExt};
-    /// use opentelemetry::sdk::propagation::TraceContextPropagator;
-    /// use tracing_opentelemetry::OpenTelemetrySpanExt;
-    /// use std::collections::HashMap;
-    /// use tracing::Span;
-    ///
-    /// // Example carrier, could be a framework header map that impls otel's `Extractor`.
-    /// let mut carrier = HashMap::new();
-    ///
-    /// // Propagator can be swapped with b3 propagator, jaeger propagator, etc.
-    /// let propagator = TraceContextPropagator::new();
-    ///
-    /// // Extract otel parent context via the chosen propagator
-    /// let parent_context = propagator.extract(&carrier);
-    ///
-    /// // Generate a tracing span as usual
-    /// let app_root = tracing::span!(tracing::Level::INFO, "app_start");
-    ///
-    /// // Assign parent trace from external context
-    /// app_root.set_parent(parent_context.clone());
-    ///
-    /// // Or if the current span has been created elsewhere:
-    /// Span::current().set_parent(parent_context);
-    /// ```
-    fn set_parent(&self, cx: Context);
-
-    /// Associates `self` with a given OpenTelemetry trace, using the provided
-    /// followed span [`SpanContext`].
-    ///
-    /// [`SpanContext`]: opentelemetry::trace::SpanContext
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// use opentelemetry::{propagation::TextMapPropagator, trace::TraceContextExt};
-    /// use opentelemetry::sdk::propagation::TraceContextPropagator;
-    /// use tracing_opentelemetry::OpenTelemetrySpanExt;
-    /// use std::collections::HashMap;
-    /// use tracing::Span;
-    ///
-    /// // Example carrier, could be a framework header map that impls otel's `Extractor`.
-    /// let mut carrier = HashMap::new();
-    ///
-    /// // Propagator can be swapped with b3 propagator, jaeger propagator, etc.
-    /// let propagator = TraceContextPropagator::new();
-    ///
-    /// // Extract otel context of linked span via the chosen propagator
-    /// let linked_span_otel_context = propagator.extract(&carrier);
-    ///
-    /// // Extract the linked span context from the otel context
-    /// let linked_span_context = linked_span_otel_context.span().span_context().clone();
-    ///
-    /// // Generate a tracing span as usual
-    /// let app_root = tracing::span!(tracing::Level::INFO, "app_start");
-    ///
-    /// // Assign linked trace from external context
-    /// app_root.add_link(linked_span_context);
-    ///
-    /// // Or if the current span has been created elsewhere:
-    /// let linked_span_context = linked_span_otel_context.span().span_context().clone();
-    /// Span::current().add_link(linked_span_context);
-    /// ```
-    fn add_link(&self, cx: SpanContext);
-
-    /// Associates `self` with a given OpenTelemetry trace, using the provided
-    /// followed span [`SpanContext`] and attributes.
-    ///
-    /// [`SpanContext`]: opentelemetry::trace::SpanContext
-    fn add_link_with_attributes(&self, cx: SpanContext, attributes: Vec);
-
-    /// Extracts an OpenTelemetry [`Context`] from `self`.
-    ///
-    /// [`Context`]: opentelemetry::Context
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// use opentelemetry::Context;
-    /// use tracing_opentelemetry::OpenTelemetrySpanExt;
-    /// use tracing::Span;
-    ///
-    /// fn make_request(cx: Context) {
-    ///     // perform external request after injecting context
-    ///     // e.g. if the request's headers impl `opentelemetry::propagation::Injector`
-    ///     // then `propagator.inject_context(cx, request.headers_mut())`
-    /// }
-    ///
-    /// // Generate a tracing span as usual
-    /// let app_root = tracing::span!(tracing::Level::INFO, "app_start");
-    ///
-    /// // To include tracing context in client requests from _this_ app,
-    /// // extract the current OpenTelemetry context.
-    /// make_request(app_root.context());
-    ///
-    /// // Or if the current span has been created elsewhere:
-    /// make_request(Span::current().context())
-    /// ```
-    fn context(&self) -> Context;
-}
-
-impl OpenTelemetrySpanExt for tracing::Span {
-    fn set_parent(&self, cx: Context) {
-        let mut cx = Some(cx);
-        self.with_subscriber(move |(id, subscriber)| {
-            if let Some(get_context) = subscriber.downcast_ref::() {
-                get_context.with_context(subscriber, id, move |data, _tracer| {
-                    if let Some(cx) = cx.take() {
-                        data.parent_cx = cx;
-                    }
-                });
-            }
-        });
-    }
-
-    fn add_link(&self, cx: SpanContext) {
-        self.add_link_with_attributes(cx, Vec::new())
-    }
-
-    fn add_link_with_attributes(&self, cx: SpanContext, attributes: Vec) {
-        if cx.is_valid() {
-            let mut cx = Some(cx);
-            let mut att = Some(attributes);
-            self.with_subscriber(move |(id, subscriber)| {
-                if let Some(get_context) = subscriber.downcast_ref::() {
-                    get_context.with_context(subscriber, id, move |data, _tracer| {
-                        if let Some(cx) = cx.take() {
-                            let attr = att.take().unwrap_or_default();
-                            let follows_link = opentelemetry::trace::Link::new(cx, attr);
-                            data.builder
-                                .links
-                                .get_or_insert_with(|| Vec::with_capacity(1))
-                                .push(follows_link);
-                        }
-                    });
-                }
-            });
-        }
-    }
-
-    fn context(&self) -> Context {
-        let mut cx = None;
-        self.with_subscriber(|(id, subscriber)| {
-            if let Some(get_context) = subscriber.downcast_ref::() {
-                get_context.with_context(subscriber, id, |builder, tracer| {
-                    cx = Some(tracer.sampled_context(builder));
-                })
-            }
-        });
-
-        cx.unwrap_or_default()
-    }
-}
diff -Nru temporalio-1.3.0/vendor/tracing-opentelemetry/src/tracer.rs temporalio-1.3.0/vendor/tracing-opentelemetry/src/tracer.rs
--- temporalio-1.3.0/vendor/tracing-opentelemetry/src/tracer.rs	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/tracing-opentelemetry/src/tracer.rs	1970-01-01 00:00:00.000000000 +0000
@@ -1,234 +0,0 @@
-use opentelemetry::sdk::trace::{Tracer, TracerProvider};
-use opentelemetry::trace::OrderMap;
-use opentelemetry::{
-    trace as otel,
-    trace::{
-        noop, SamplingDecision, SamplingResult, SpanBuilder, SpanContext, SpanId, SpanKind,
-        TraceContextExt, TraceFlags, TraceId, TraceState,
-    },
-    Context as OtelContext,
-};
-
-/// An interface for authors of OpenTelemetry SDKs to build pre-sampled tracers.
-///
-/// The OpenTelemetry spec does not allow trace ids to be updated after a span
-/// has been created. In order to associate extracted parent trace ids with
-/// existing `tracing` spans, `tracing-opentelemetry` builds up otel span data
-/// using a [`SpanBuilder`] instead, and creates / exports full otel spans only
-/// when the associated `tracing` span is closed. However, in order to properly
-/// inject otel [`Context`] information to downstream requests, the sampling
-/// state must now be known _before_ the otel span has been created.
-///
-/// The logic for coming to a sampling decision and creating an injectable span
-/// context from a [`SpanBuilder`] is encapsulated in the
-/// [`PreSampledTracer::sampled_context`] method and has been implemented
-/// for the standard OpenTelemetry SDK, but this trait may be implemented by
-/// authors of alternate OpenTelemetry SDK implementations if they wish to have
-/// `tracing` compatibility.
-///
-/// See the [`OpenTelemetrySpanExt::set_parent`] and
-/// [`OpenTelemetrySpanExt::context`] methods for example usage.
-///
-/// [`Tracer`]: opentelemetry::trace::Tracer
-/// [`SpanBuilder`]: opentelemetry::trace::SpanBuilder
-/// [`PreSampledTracer::sampled_span_context`]: crate::PreSampledTracer::sampled_span_context
-/// [`OpenTelemetrySpanExt::set_parent`]: crate::OpenTelemetrySpanExt::set_parent
-/// [`OpenTelemetrySpanExt::context`]: crate::OpenTelemetrySpanExt::context
-/// [`Context`]: opentelemetry::Context
-pub trait PreSampledTracer {
-    /// Produce an otel context containing an active and pre-sampled span for
-    /// the given span builder data.
-    ///
-    /// The sampling decision, span context information, and parent context
-    /// values must match the values recorded when the tracing span is closed.
-    fn sampled_context(&self, data: &mut crate::OtelData) -> OtelContext;
-
-    /// Generate a new trace id.
-    fn new_trace_id(&self) -> otel::TraceId;
-
-    /// Generate a new span id.
-    fn new_span_id(&self) -> otel::SpanId;
-}
-
-impl PreSampledTracer for noop::NoopTracer {
-    fn sampled_context(&self, data: &mut crate::OtelData) -> OtelContext {
-        data.parent_cx.clone()
-    }
-
-    fn new_trace_id(&self) -> otel::TraceId {
-        otel::TraceId::INVALID
-    }
-
-    fn new_span_id(&self) -> otel::SpanId {
-        otel::SpanId::INVALID
-    }
-}
-
-impl PreSampledTracer for Tracer {
-    fn sampled_context(&self, data: &mut crate::OtelData) -> OtelContext {
-        // Ensure tracing pipeline is still installed.
-        if self.provider().is_none() {
-            return OtelContext::new();
-        }
-        let provider = self.provider().unwrap();
-        let parent_cx = &data.parent_cx;
-        let builder = &mut data.builder;
-
-        // Gather trace state
-        let (trace_id, parent_trace_flags) = current_trace_state(builder, parent_cx, &provider);
-
-        // Sample or defer to existing sampling decisions
-        let (flags, trace_state) = if let Some(result) = &builder.sampling_result {
-            process_sampling_result(result, parent_trace_flags)
-        } else {
-            builder.sampling_result = Some(provider.config().sampler.should_sample(
-                Some(parent_cx),
-                trace_id,
-                &builder.name,
-                builder.span_kind.as_ref().unwrap_or(&SpanKind::Internal),
-                builder.attributes.as_ref().unwrap_or(&OrderMap::default()),
-                builder.links.as_deref().unwrap_or(&[]),
-                self.instrumentation_library(),
-            ));
-
-            process_sampling_result(
-                builder.sampling_result.as_ref().unwrap(),
-                parent_trace_flags,
-            )
-        }
-        .unwrap_or_default();
-
-        let span_id = builder.span_id.unwrap_or(SpanId::INVALID);
-        let span_context = SpanContext::new(trace_id, span_id, flags, false, trace_state);
-        parent_cx.with_remote_span_context(span_context)
-    }
-
-    fn new_trace_id(&self) -> otel::TraceId {
-        self.provider()
-            .map(|provider| provider.config().id_generator.new_trace_id())
-            .unwrap_or(otel::TraceId::INVALID)
-    }
-
-    fn new_span_id(&self) -> otel::SpanId {
-        self.provider()
-            .map(|provider| provider.config().id_generator.new_span_id())
-            .unwrap_or(otel::SpanId::INVALID)
-    }
-}
-
-fn current_trace_state(
-    builder: &SpanBuilder,
-    parent_cx: &OtelContext,
-    provider: &TracerProvider,
-) -> (TraceId, TraceFlags) {
-    if parent_cx.has_active_span() {
-        let span = parent_cx.span();
-        let sc = span.span_context();
-        (sc.trace_id(), sc.trace_flags())
-    } else {
-        (
-            builder
-                .trace_id
-                .unwrap_or_else(|| provider.config().id_generator.new_trace_id()),
-            Default::default(),
-        )
-    }
-}
-
-fn process_sampling_result(
-    sampling_result: &SamplingResult,
-    trace_flags: TraceFlags,
-) -> Option<(TraceFlags, TraceState)> {
-    match sampling_result {
-        SamplingResult {
-            decision: SamplingDecision::Drop,
-            ..
-        } => None,
-        SamplingResult {
-            decision: SamplingDecision::RecordOnly,
-            trace_state,
-            ..
-        } => Some((trace_flags & !TraceFlags::SAMPLED, trace_state.clone())),
-        SamplingResult {
-            decision: SamplingDecision::RecordAndSample,
-            trace_state,
-            ..
-        } => Some((trace_flags | TraceFlags::SAMPLED, trace_state.clone())),
-    }
-}
-
-#[cfg(test)]
-mod tests {
-    use super::*;
-    use crate::OtelData;
-    use opentelemetry::sdk::trace::{config, Sampler, TracerProvider};
-    use opentelemetry::trace::{SpanBuilder, SpanId, TracerProvider as _};
-
-    #[test]
-    fn assigns_default_trace_id_if_missing() {
-        let provider = TracerProvider::default();
-        let tracer = provider.tracer("test");
-        let mut builder = SpanBuilder::from_name("empty".to_string());
-        builder.span_id = Some(SpanId::from(1u64.to_be_bytes()));
-        builder.trace_id = None;
-        let parent_cx = OtelContext::new();
-        let cx = tracer.sampled_context(&mut OtelData { builder, parent_cx });
-        let span = cx.span();
-        let span_context = span.span_context();
-
-        assert!(span_context.is_valid());
-    }
-
-    #[rustfmt::skip]
-    fn sampler_data() -> Vec<(&'static str, Sampler, OtelContext, Option, bool)> {
-        vec![
-            // No parent samples
-            ("empty_parent_cx_always_on", Sampler::AlwaysOn, OtelContext::new(), None, true),
-            ("empty_parent_cx_always_off", Sampler::AlwaysOff, OtelContext::new(), None, false),
-
-            // Remote parent samples
-            ("remote_parent_cx_always_on", Sampler::AlwaysOn, OtelContext::new().with_remote_span_context(span_context(TraceFlags::SAMPLED, true)), None, true),
-            ("remote_parent_cx_always_off", Sampler::AlwaysOff, OtelContext::new().with_remote_span_context(span_context(TraceFlags::SAMPLED, true)), None, false),
-            ("sampled_remote_parent_cx_parent_based", Sampler::ParentBased(Box::new(Sampler::AlwaysOff)), OtelContext::new().with_remote_span_context(span_context(TraceFlags::SAMPLED, true)), None, true),
-            ("unsampled_remote_parent_cx_parent_based", Sampler::ParentBased(Box::new(Sampler::AlwaysOn)), OtelContext::new().with_remote_span_context(span_context(TraceFlags::default(), true)), None, false),
-
-            // Existing sampling result defers
-            ("previous_drop_result_always_on", Sampler::AlwaysOn, OtelContext::new(), Some(SamplingResult { decision: SamplingDecision::Drop, attributes: vec![], trace_state: Default::default() }), false),
-            ("previous_record_and_sample_result_always_off", Sampler::AlwaysOff, OtelContext::new(), Some(SamplingResult { decision: SamplingDecision::RecordAndSample, attributes: vec![], trace_state: Default::default() }), true),
- 
-            // Existing local parent, defers
-            ("previous_drop_result_always_on", Sampler::AlwaysOn, OtelContext::new(), Some(SamplingResult { decision: SamplingDecision::Drop, attributes: vec![], trace_state: Default::default() }), false),
-            ("previous_record_and_sample_result_always_off", Sampler::AlwaysOff, OtelContext::new(), Some(SamplingResult { decision: SamplingDecision::RecordAndSample, attributes: vec![], trace_state: Default::default() }), true),
-        ]
-    }
-
-    #[test]
-    fn sampled_context() {
-        for (name, sampler, parent_cx, previous_sampling_result, is_sampled) in sampler_data() {
-            let provider = TracerProvider::builder()
-                .with_config(config().with_sampler(sampler))
-                .build();
-            let tracer = provider.tracer("test");
-            let mut builder = SpanBuilder::from_name("parent".to_string());
-            builder.sampling_result = previous_sampling_result;
-            let sampled = tracer.sampled_context(&mut OtelData { builder, parent_cx });
-
-            assert_eq!(
-                sampled.span().span_context().is_sampled(),
-                is_sampled,
-                "{}",
-                name
-            )
-        }
-    }
-
-    fn span_context(trace_flags: TraceFlags, is_remote: bool) -> SpanContext {
-        SpanContext::new(
-            TraceId::from(1u128.to_be_bytes()),
-            SpanId::from(1u64.to_be_bytes()),
-            trace_flags,
-            is_remote,
-            Default::default(),
-        )
-    }
-}
diff -Nru temporalio-1.3.0/vendor/tracing-opentelemetry/tests/metrics_publishing.rs temporalio-1.3.0/vendor/tracing-opentelemetry/tests/metrics_publishing.rs
--- temporalio-1.3.0/vendor/tracing-opentelemetry/tests/metrics_publishing.rs	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/tracing-opentelemetry/tests/metrics_publishing.rs	1970-01-01 00:00:00.000000000 +0000
@@ -1,282 +0,0 @@
-use opentelemetry::{
-    metrics::MetricsError,
-    sdk::{
-        export::metrics::{
-            aggregation::{self, Histogram, Sum, TemporalitySelector},
-            InstrumentationLibraryReader,
-        },
-        metrics::{
-            aggregators::{HistogramAggregator, SumAggregator},
-            controllers::BasicController,
-            processors,
-            sdk_api::{Descriptor, InstrumentKind, Number, NumberKind},
-            selectors,
-        },
-    },
-    Context,
-};
-use std::cmp::Ordering;
-use tracing::Subscriber;
-use tracing_opentelemetry::MetricsLayer;
-use tracing_subscriber::prelude::*;
-
-const CARGO_PKG_VERSION: &str = env!("CARGO_PKG_VERSION");
-const INSTRUMENTATION_LIBRARY_NAME: &str = "tracing/tracing-opentelemetry";
-
-#[tokio::test]
-async fn u64_counter_is_exported() {
-    let (subscriber, exporter) = init_subscriber(
-        "hello_world".to_string(),
-        InstrumentKind::Counter,
-        NumberKind::U64,
-        Number::from(1_u64),
-    );
-
-    tracing::subscriber::with_default(subscriber, || {
-        tracing::info!(monotonic_counter.hello_world = 1_u64);
-    });
-
-    exporter.export().unwrap();
-}
-
-#[tokio::test]
-async fn u64_counter_is_exported_i64_at_instrumentation_point() {
-    let (subscriber, exporter) = init_subscriber(
-        "hello_world2".to_string(),
-        InstrumentKind::Counter,
-        NumberKind::U64,
-        Number::from(1_u64),
-    );
-
-    tracing::subscriber::with_default(subscriber, || {
-        tracing::info!(monotonic_counter.hello_world2 = 1_i64);
-    });
-
-    exporter.export().unwrap();
-}
-
-#[tokio::test]
-async fn f64_counter_is_exported() {
-    let (subscriber, exporter) = init_subscriber(
-        "float_hello_world".to_string(),
-        InstrumentKind::Counter,
-        NumberKind::F64,
-        Number::from(1.000000123_f64),
-    );
-
-    tracing::subscriber::with_default(subscriber, || {
-        tracing::info!(monotonic_counter.float_hello_world = 1.000000123_f64);
-    });
-
-    exporter.export().unwrap();
-}
-
-#[tokio::test]
-async fn i64_up_down_counter_is_exported() {
-    let (subscriber, exporter) = init_subscriber(
-        "pebcak".to_string(),
-        InstrumentKind::UpDownCounter,
-        NumberKind::I64,
-        Number::from(-5_i64),
-    );
-
-    tracing::subscriber::with_default(subscriber, || {
-        tracing::info!(counter.pebcak = -5_i64);
-    });
-
-    exporter.export().unwrap();
-}
-
-#[tokio::test]
-async fn i64_up_down_counter_is_exported_u64_at_instrumentation_point() {
-    let (subscriber, exporter) = init_subscriber(
-        "pebcak2".to_string(),
-        InstrumentKind::UpDownCounter,
-        NumberKind::I64,
-        Number::from(5_i64),
-    );
-
-    tracing::subscriber::with_default(subscriber, || {
-        tracing::info!(counter.pebcak2 = 5_u64);
-    });
-
-    exporter.export().unwrap();
-}
-
-#[tokio::test]
-async fn f64_up_down_counter_is_exported() {
-    let (subscriber, exporter) = init_subscriber(
-        "pebcak_blah".to_string(),
-        InstrumentKind::UpDownCounter,
-        NumberKind::F64,
-        Number::from(99.123_f64),
-    );
-
-    tracing::subscriber::with_default(subscriber, || {
-        tracing::info!(counter.pebcak_blah = 99.123_f64);
-    });
-
-    exporter.export().unwrap();
-}
-
-#[tokio::test]
-async fn u64_histogram_is_exported() {
-    let (subscriber, exporter) = init_subscriber(
-        "abcdefg".to_string(),
-        InstrumentKind::Histogram,
-        NumberKind::U64,
-        Number::from(9_u64),
-    );
-
-    tracing::subscriber::with_default(subscriber, || {
-        tracing::info!(value.abcdefg = 9_u64);
-    });
-
-    exporter.export().unwrap();
-}
-
-#[tokio::test]
-async fn i64_histogram_is_exported() {
-    let (subscriber, exporter) = init_subscriber(
-        "abcdefg_auenatsou".to_string(),
-        InstrumentKind::Histogram,
-        NumberKind::I64,
-        Number::from(-19_i64),
-    );
-
-    tracing::subscriber::with_default(subscriber, || {
-        tracing::info!(value.abcdefg_auenatsou = -19_i64);
-    });
-
-    exporter.export().unwrap();
-}
-
-#[tokio::test]
-async fn f64_histogram_is_exported() {
-    let (subscriber, exporter) = init_subscriber(
-        "abcdefg_racecar".to_string(),
-        InstrumentKind::Histogram,
-        NumberKind::F64,
-        Number::from(777.0012_f64),
-    );
-
-    tracing::subscriber::with_default(subscriber, || {
-        tracing::info!(value.abcdefg_racecar = 777.0012_f64);
-    });
-
-    exporter.export().unwrap();
-}
-
-fn init_subscriber(
-    expected_metric_name: String,
-    expected_instrument_kind: InstrumentKind,
-    expected_number_kind: NumberKind,
-    expected_value: Number,
-) -> (impl Subscriber + 'static, TestExporter) {
-    let controller = opentelemetry::sdk::metrics::controllers::basic(processors::factory(
-        selectors::simple::histogram(vec![-10.0, 100.0]),
-        aggregation::cumulative_temporality_selector(),
-    ))
-    .build();
-
-    let exporter = TestExporter {
-        expected_metric_name,
-        expected_instrument_kind,
-        expected_number_kind,
-        expected_value,
-        controller: controller.clone(),
-    };
-
-    (
-        tracing_subscriber::registry().with(MetricsLayer::new(controller)),
-        exporter,
-    )
-}
-
-#[derive(Clone, Debug)]
-struct TestExporter {
-    expected_metric_name: String,
-    expected_instrument_kind: InstrumentKind,
-    expected_number_kind: NumberKind,
-    expected_value: Number,
-    controller: BasicController,
-}
-
-impl TestExporter {
-    fn export(&self) -> Result<(), MetricsError> {
-        self.controller.collect(&Context::current())?;
-        self.controller.try_for_each(&mut |library, reader| {
-            reader.try_for_each(self, &mut |record| {
-                assert_eq!(self.expected_metric_name, record.descriptor().name());
-                assert_eq!(
-                    self.expected_instrument_kind,
-                    *record.descriptor().instrument_kind()
-                );
-                assert_eq!(
-                    self.expected_number_kind,
-                    *record.descriptor().number_kind()
-                );
-                match self.expected_instrument_kind {
-                    InstrumentKind::Counter | InstrumentKind::UpDownCounter => {
-                        let number = record
-                            .aggregator()
-                            .unwrap()
-                            .as_any()
-                            .downcast_ref::()
-                            .unwrap()
-                            .sum()
-                            .unwrap();
-
-                        assert_eq!(
-                            Ordering::Equal,
-                            number
-                                .partial_cmp(&NumberKind::U64, &self.expected_value)
-                                .unwrap()
-                        );
-                    }
-                    InstrumentKind::Histogram => {
-                        let histogram = record
-                            .aggregator()
-                            .unwrap()
-                            .as_any()
-                            .downcast_ref::()
-                            .unwrap()
-                            .histogram()
-                            .unwrap();
-
-                        let counts = histogram.counts();
-                        if dbg!(self.expected_value.to_i64(&self.expected_number_kind)) > 100 {
-                            assert_eq!(counts, &[0.0, 0.0, 1.0]);
-                        } else if self.expected_value.to_i64(&self.expected_number_kind) > 0 {
-                            assert_eq!(counts, &[0.0, 1.0, 0.0]);
-                        } else {
-                            assert_eq!(counts, &[1.0, 0.0, 0.0]);
-                        }
-                    }
-                    _ => panic!(
-                        "InstrumentKind {:?} not currently supported!",
-                        self.expected_instrument_kind
-                    ),
-                };
-
-                // The following are the same regardless of the individual metric.
-                assert_eq!(INSTRUMENTATION_LIBRARY_NAME, library.name);
-                assert_eq!(CARGO_PKG_VERSION, library.version.as_ref().unwrap());
-
-                Ok(())
-            })
-        })
-    }
-}
-
-impl TemporalitySelector for TestExporter {
-    fn temporality_for(
-        &self,
-        _descriptor: &Descriptor,
-        _kind: &aggregation::AggregationKind,
-    ) -> aggregation::Temporality {
-        // I don't think the value here makes a difference since
-        // we are just testing a single metric.
-        aggregation::Temporality::Cumulative
-    }
-}
diff -Nru temporalio-1.3.0/vendor/tracing-opentelemetry/tests/trace_state_propagation.rs temporalio-1.3.0/vendor/tracing-opentelemetry/tests/trace_state_propagation.rs
--- temporalio-1.3.0/vendor/tracing-opentelemetry/tests/trace_state_propagation.rs	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/tracing-opentelemetry/tests/trace_state_propagation.rs	1970-01-01 00:00:00.000000000 +0000
@@ -1,171 +0,0 @@
-use futures_util::future::BoxFuture;
-use opentelemetry::{
-    propagation::TextMapPropagator,
-    sdk::{
-        export::trace::{ExportResult, SpanData, SpanExporter},
-        propagation::{BaggagePropagator, TextMapCompositePropagator, TraceContextPropagator},
-        trace::{Tracer, TracerProvider},
-    },
-    trace::{SpanContext, TraceContextExt, Tracer as _, TracerProvider as _},
-    Context,
-};
-use std::collections::{HashMap, HashSet};
-use std::sync::{Arc, Mutex};
-use tracing::Subscriber;
-use tracing_opentelemetry::{layer, OpenTelemetrySpanExt};
-use tracing_subscriber::prelude::*;
-
-#[test]
-fn trace_with_active_otel_context() {
-    let (cx, subscriber, exporter, provider) = build_sampled_context();
-    let attached = cx.attach();
-
-    tracing::subscriber::with_default(subscriber, || {
-        tracing::debug_span!("child");
-    });
-
-    drop(attached); // end implicit parent
-    drop(provider); // flush all spans
-
-    let spans = exporter.0.lock().unwrap();
-    assert_eq!(spans.len(), 2);
-    assert_shared_attrs_eq(&spans[0].span_context, &spans[1].span_context);
-}
-
-#[test]
-fn trace_with_assigned_otel_context() {
-    let (cx, subscriber, exporter, provider) = build_sampled_context();
-
-    tracing::subscriber::with_default(subscriber, || {
-        let child = tracing::debug_span!("child");
-        child.set_parent(cx);
-    });
-
-    drop(provider); // flush all spans
-    let spans = exporter.0.lock().unwrap();
-    assert_eq!(spans.len(), 2);
-    assert_shared_attrs_eq(&spans[0].span_context, &spans[1].span_context);
-}
-
-#[test]
-fn trace_root_with_children() {
-    let (_tracer, provider, exporter, subscriber) = test_tracer();
-
-    tracing::subscriber::with_default(subscriber, || {
-        // Propagate trace information through tracing parent -> child
-        let root = tracing::debug_span!("root");
-        root.in_scope(|| tracing::debug_span!("child"));
-    });
-
-    drop(provider); // flush all spans
-    let spans = exporter.0.lock().unwrap();
-    assert_eq!(spans.len(), 2);
-    assert_shared_attrs_eq(&spans[0].span_context, &spans[1].span_context);
-}
-
-#[test]
-fn inject_context_into_outgoing_requests() {
-    let (_tracer, _provider, _exporter, subscriber) = test_tracer();
-    let propagator = test_propagator();
-    let carrier = test_carrier();
-    let cx = propagator.extract(&carrier);
-    let mut outgoing_req_carrier = HashMap::new();
-
-    tracing::subscriber::with_default(subscriber, || {
-        let root = tracing::debug_span!("root");
-        root.set_parent(cx);
-        let _g = root.enter();
-        let child = tracing::debug_span!("child");
-        propagator.inject_context(&child.context(), &mut outgoing_req_carrier);
-    });
-
-    // Ensure all values that should be passed between services are preserved
-    assert_carrier_attrs_eq(&carrier, &outgoing_req_carrier);
-}
-
-fn assert_shared_attrs_eq(sc_a: &SpanContext, sc_b: &SpanContext) {
-    assert_eq!(sc_a.trace_id(), sc_b.trace_id());
-    assert_eq!(sc_a.trace_state(), sc_b.trace_state());
-}
-
-fn assert_carrier_attrs_eq(
-    carrier_a: &HashMap,
-    carrier_b: &HashMap,
-) {
-    // Match baggage unordered
-    assert_eq!(
-        carrier_a
-            .get("baggage")
-            .map(|b| b.split_terminator(',').collect::>()),
-        carrier_b
-            .get("baggage")
-            .map(|b| b.split_terminator(',').collect())
-    );
-    // match trace parent values, except span id
-    assert_eq!(
-        carrier_a.get("traceparent").unwrap()[0..36],
-        carrier_b.get("traceparent").unwrap()[0..36],
-    );
-    // match tracestate values
-    assert_eq!(carrier_a.get("tracestate"), carrier_b.get("tracestate"));
-}
-
-fn test_tracer() -> (Tracer, TracerProvider, TestExporter, impl Subscriber) {
-    let exporter = TestExporter::default();
-    let provider = TracerProvider::builder()
-        .with_simple_exporter(exporter.clone())
-        .build();
-    let tracer = provider.tracer("test");
-    let subscriber = tracing_subscriber::registry().with(layer().with_tracer(tracer.clone()));
-
-    (tracer, provider, exporter, subscriber)
-}
-
-fn test_propagator() -> TextMapCompositePropagator {
-    let baggage_propagator = BaggagePropagator::new();
-    let trace_context_propagator = TraceContextPropagator::new();
-
-    TextMapCompositePropagator::new(vec![
-        Box::new(baggage_propagator),
-        Box::new(trace_context_propagator),
-    ])
-}
-
-fn test_carrier() -> HashMap {
-    let mut carrier = HashMap::new();
-    carrier.insert(
-        "baggage".to_string(),
-        "key2=value2,key1=value1;property1;property2,key3=value3;propertyKey=propertyValue"
-            .to_string(),
-    );
-    carrier.insert("tracestate".to_string(), "test1=test2".to_string());
-    carrier.insert(
-        "traceparent".to_string(),
-        "00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01".to_string(),
-    );
-
-    carrier
-}
-
-fn build_sampled_context() -> (Context, impl Subscriber, TestExporter, TracerProvider) {
-    let (tracer, provider, exporter, subscriber) = test_tracer();
-    let span = tracer.start("sampled");
-    let cx = Context::current_with_span(span);
-
-    (cx, subscriber, exporter, provider)
-}
-
-#[derive(Clone, Default, Debug)]
-struct TestExporter(Arc>>);
-
-impl SpanExporter for TestExporter {
-    fn export(&mut self, mut batch: Vec) -> BoxFuture<'static, ExportResult> {
-        let spans = self.0.clone();
-        Box::pin(async move {
-            if let Ok(mut inner) = spans.lock() {
-                inner.append(&mut batch);
-            }
-            Ok(())
-        })
-    }
-}
Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/tracing-opentelemetry/trace.png and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/tracing-opentelemetry/trace.png differ
diff -Nru temporalio-1.3.0/vendor/typenum/build/generic_const_mappings.rs temporalio-1.3.0/vendor/typenum/build/generic_const_mappings.rs
--- temporalio-1.3.0/vendor/typenum/build/generic_const_mappings.rs	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/typenum/build/generic_const_mappings.rs	2023-10-30 19:40:00.000000000 +0000
@@ -3,6 +3,10 @@
 pub fn emit_impls() -> ::std::io::Result<()> {
     let out_dir = ::std::env::var("OUT_DIR").unwrap();
     let dest = ::std::path::Path::new(&out_dir).join("generic_const_mappings.rs");
+    println!(
+        "cargo:rustc-env=TYPENUM_BUILD_GENERIC_CONSTS={}",
+        dest.display()
+    );
     let mut f = ::std::fs::File::create(&dest).unwrap();
 
     #[allow(clippy::write_literal)]
@@ -18,7 +22,6 @@
 /// The main type to use here is [`U`], although [`Const`] and [`ToUInt`] may be needed
 /// in a generic context.
 #[allow(warnings)] // script-generated code
-#[cfg(feature = \"const-generics\")] // hints at doc_auto_cfg
 pub mod generic_const_mappings {
     use crate::*;
 
@@ -74,25 +77,15 @@
         write!(
             f,
             "
-    {cfg}
     impl ToUInt for Const<{uint}> {{
         type Output = U{uint};
     }}
 \
             ",
             uint = uint,
-            cfg = feature_gate_to_64_bit(uint),
         )?;
     }
     write!(f, "}}")?;
     f.flush()?;
     Ok(())
 }
-
-const fn feature_gate_to_64_bit(uint: u64) -> &'static str {
-    if uint > u32::MAX as u64 {
-        r#"#[cfg(target_pointer_width = "64")]"#
-    } else {
-        ""
-    }
-}
diff -Nru temporalio-1.3.0/vendor/typenum/build/main.rs temporalio-1.3.0/vendor/typenum/build/main.rs
--- temporalio-1.3.0/vendor/typenum/build/main.rs	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/typenum/build/main.rs	2023-10-30 19:40:00.000000000 +0000
@@ -77,15 +77,6 @@
 )]
 pub fn no_std() {}
 
-#[cfg_attr(
-    feature = "force_unix_path_separator",
-    deprecated(
-        since = "1.17.0",
-        note = "the `force_unix_path_separator` flag is no longer necessary and will be removed in the future"
-    )
-)]
-pub fn force_unix_path_separator() {}
-
 const HIGHEST: u64 = 1024;
 fn uints() -> impl Iterator {
     // Use hardcoded values to avoid issues with cross-compilation.
@@ -104,11 +95,12 @@
 
     let out_dir = env::var("OUT_DIR").unwrap();
     let dest = Path::new(&out_dir).join("consts.rs");
+    #[cfg(not(feature = "force_unix_path_separator"))]
+    println!("cargo:rustc-env=TYPENUM_BUILD_CONSTS={}", dest.display());
 
     let mut f = File::create(&dest).unwrap();
 
     no_std();
-    force_unix_path_separator();
 
     // Header stuff here!
     write!(
diff -Nru temporalio-1.3.0/vendor/typenum/build/op.rs temporalio-1.3.0/vendor/typenum/build/op.rs
--- temporalio-1.3.0/vendor/typenum/build/op.rs	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/typenum/build/op.rs	2023-10-30 19:40:00.000000000 +0000
@@ -18,6 +18,8 @@
 pub fn write_op_macro() -> ::std::io::Result<()> {
     let out_dir = ::std::env::var("OUT_DIR").unwrap();
     let dest = ::std::path::Path::new(&out_dir).join("op.rs");
+    #[cfg(not(feature = "force_unix_path_separator"))]
+    println!("cargo:rustc-env=TYPENUM_BUILD_OP={}", dest.display());
     let mut f = ::std::fs::File::create(&dest).unwrap();
 
     // Operator precedence is taken from
diff -Nru temporalio-1.3.0/vendor/typenum/.cargo-checksum.json temporalio-1.3.0/vendor/typenum/.cargo-checksum.json
--- temporalio-1.3.0/vendor/typenum/.cargo-checksum.json	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/typenum/.cargo-checksum.json	2023-10-30 19:40:00.000000000 +0000
@@ -1 +1 @@
-{"files":{"CHANGELOG.md":"2425bc9c5bd25aa4da8ccd1b86a38104e8ed179e73dec9615411df5819bf7cfe","Cargo.toml":"2a3f25a700cb4af300da02a9b7edbd59ed99815e108b75e112243e7a6df41f16","LICENSE":"db11fec9946737df39ca3898d9cd8c10ec6f6c3a884a6802b0ad0b81b4e8f23a","LICENSE-APACHE":"516b24e051bf5630880ebbd55c40a25ce9552ebaf8970a53e8976eb70e522406","LICENSE-MIT":"a825bd853ab71619a4923d7b4311221427848070ff44d990da39b0b274c1683f","README.md":"5108073f635aa3508ec8769ca0d9a65a62a7ce7aa491f130b2a8684c2779ace0","build/generic_const_mappings.rs":"ec66497bf1ee1c9b1a33e10b18b49e8f727f1b651522fafe3399ec81ea1b0a5c","build/main.rs":"a8b67aeb1767dd05d4a3d32d1d29bf5712a6fe93830a7fca85ead9fd90625205","build/op.rs":"291c798ff02c1c1150f13027e6e5aba9849b4d56f2a9003040f55d2dcd3c826b","build/tests.rs":"4e74a95412d9a7ad1dfba36cced27e3f723ab474a4b695d97c6adc30c5850d44","clippy.toml":"493258e6a4be8bbb66ecbc4236d8f4964f867d4bcddd5f13897aa655a206af7b","rustfmt.toml":"4953048a8d16fba8736c5cdb65ce418e462317a79793f16f79023f571f3fd5ce","src/array.rs":"89cc461b5fb76e551db5028085cf6a016ed07f12595b1833c984100377c3fe53","src/bit.rs":"a658ddf3b93db9eeb8fb3eb659f67356de40d1bccf544672d650ae7be1d8e215","src/int.rs":"4adaadb711694426a6af1e7fbb54f33d668992ac0a674b77f0894a1a2213fda8","src/lib.rs":"0c16481a1b72fd5261de7a6ec7a607edba599af8ace035d0636f0d0723f41906","src/marker_traits.rs":"5a58d16edc16853b4b793a6b46068d926911273aa9dc57fd9dc64df77986b7dd","src/operator_aliases.rs":"c190f5bcf9f674c2f2bb56886a45ff548e5acb9320b406cbc45204ef3bac46d5","src/private.rs":"e2ab0e29eacdedfe4182aa0567ac8e9cb53680dc04e1d75e197321b4e1446111","src/type_operators.rs":"2ec5e77be5b545a0ac982e948088e46c81b6a7bd5b57528917640b1faa2f8ee0","src/uint.rs":"dbcef84d261a044fdc5d7ec81bc5c2113fab4cc5232cab985a5c2809c7f153bc","tests/test.rs":"92139fa86ffcacc1dff60e6fc36420c850d70dc814bd21dc18e87857553c6cea"},"package":"42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825"}
\ No newline at end of file
+{"files":{"CHANGELOG.md":"9990a2e222cad7eff8e8eec1e74a57e9aeecdb831e4a54208e7d5efd7b95432e","Cargo.toml":"e03aa2d8e8102aacf33c0dd58c8006bf7101b335d079d6b862870a471e488a3c","LICENSE":"db11fec9946737df39ca3898d9cd8c10ec6f6c3a884a6802b0ad0b81b4e8f23a","LICENSE-APACHE":"516b24e051bf5630880ebbd55c40a25ce9552ebaf8970a53e8976eb70e522406","LICENSE-MIT":"a825bd853ab71619a4923d7b4311221427848070ff44d990da39b0b274c1683f","README.md":"ab1dc7cd2ee48283b3a511463785da5dd3a93b387a26beb89185442eb66c7471","build/generic_const_mappings.rs":"b71d125b1a6e9696c5c0b24520c92aeca45fa14aa1189f1eee53b317d74de54a","build/main.rs":"006693936308cb1eca0768f94212ccdfe52951c79f64fd18f5c58124c1448f20","build/op.rs":"64ced5cb4016b28daa788e9f74713f1cb432af98c645f60641b90425f10741ec","build/tests.rs":"4e74a95412d9a7ad1dfba36cced27e3f723ab474a4b695d97c6adc30c5850d44","clippy.toml":"493258e6a4be8bbb66ecbc4236d8f4964f867d4bcddd5f13897aa655a206af7b","rustfmt.toml":"4953048a8d16fba8736c5cdb65ce418e462317a79793f16f79023f571f3fd5ce","src/array.rs":"d86f463e1f24a49073afc3ad875ea9b69ccfa85dad4c2738e022031c006f1087","src/bit.rs":"a658ddf3b93db9eeb8fb3eb659f67356de40d1bccf544672d650ae7be1d8e215","src/int.rs":"4adaadb711694426a6af1e7fbb54f33d668992ac0a674b77f0894a1a2213fda8","src/lib.rs":"c4368d0aedecd6e2dfe0d4716d55474a7f17e5bd7a4e59efb7a9e0494c9a25bc","src/marker_traits.rs":"5a58d16edc16853b4b793a6b46068d926911273aa9dc57fd9dc64df77986b7dd","src/operator_aliases.rs":"c190f5bcf9f674c2f2bb56886a45ff548e5acb9320b406cbc45204ef3bac46d5","src/private.rs":"e2ab0e29eacdedfe4182aa0567ac8e9cb53680dc04e1d75e197321b4e1446111","src/type_operators.rs":"cf04a1a4601b2d486e9e737130f1bff3e0a750fefe32b9f11c3bed0dad2c1a10","src/uint.rs":"a8872e9337e77158ec0d1cdf723dd8fefec22b58676e765098206f6cb24ba5db","tests/test.rs":"92139fa86ffcacc1dff60e6fc36420c850d70dc814bd21dc18e87857553c6cea"},"package":"497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba"}
\ No newline at end of file
diff -Nru temporalio-1.3.0/vendor/typenum/Cargo.toml temporalio-1.3.0/vendor/typenum/Cargo.toml
--- temporalio-1.3.0/vendor/typenum/Cargo.toml	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/typenum/Cargo.toml	2023-10-30 19:40:00.000000000 +0000
@@ -13,7 +13,7 @@
 edition = "2018"
 rust-version = "1.37.0"
 name = "typenum"
-version = "1.17.0"
+version = "1.16.0"
 authors = [
     "Paho Lurie-Gregg ",
     "Andre Bogus ",
@@ -30,22 +30,6 @@
 license = "MIT OR Apache-2.0"
 repository = "https://github.com/paholg/typenum"
 
-[package.metadata.docs.rs]
-features = [
-    "i128",
-    "const-generics",
-]
-rustdoc-args = [
-    "--cfg",
-    "docsrs",
-]
-
-[package.metadata.playground]
-features = [
-    "i128",
-    "const-generics",
-]
-
 [lib]
 name = "typenum"
 
diff -Nru temporalio-1.3.0/vendor/typenum/CHANGELOG.md temporalio-1.3.0/vendor/typenum/CHANGELOG.md
--- temporalio-1.3.0/vendor/typenum/CHANGELOG.md	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/typenum/CHANGELOG.md	2023-10-30 19:40:00.000000000 +0000
@@ -6,13 +6,10 @@
 against this Rust version.
 
 ### Unreleased
-- [removed] Remove `force_unix_path_separator` feature, make it the default
-- [added] docs.rs metadata and cfg options
-- [added] Playground metadata
 
 ### 1.16.0 (2022-12-05)
 - [added] `const INT` field to the `ToInt` trait.
-- [added] `const-generics` field with `U` mapping where `N` is a const generic.
+- [added] `const-generics` field with `U` mapping wher `N` is a const generic.
 
 ### 1.15.0 (2021-12-25)
 - [fixed] Cross-compilation issue due to doing math in build script. (PR #177)
@@ -65,7 +62,7 @@
 - [added] Associated constants for `Bit`, `Unsigned`, and `Integer`.
 
 ### 1.9.0 (2017-05-14)
-- [added] The `Abs` type operator and corresponding `AbsVal` alias.
+- [added] The `Abs` type operater and corresponding `AbsVal` alias.
 - [added] The feature `i128` that enables creating 128-bit integers from
   typenums.
 - [added] The `assert_type!` and `assert_type_eq!` macros.
diff -Nru temporalio-1.3.0/vendor/typenum/README.md temporalio-1.3.0/vendor/typenum/README.md
--- temporalio-1.3.0/vendor/typenum/README.md	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/typenum/README.md	2023-10-30 19:40:00.000000000 +0000
@@ -17,8 +17,8 @@
 through the crate root, so you can import anything contained herein with `use
 typenum::whatever;`, ignoring the crate structure.
 
-You may also find it useful to treat the `consts` module as a prelude,
-performing a glob import.
+You may also find it useful to treat the `consts` module as a prelude, perfoming
+a glob import.
 
 ### Example
 
diff -Nru temporalio-1.3.0/vendor/typenum/src/array.rs temporalio-1.3.0/vendor/typenum/src/array.rs
--- temporalio-1.3.0/vendor/typenum/src/array.rs	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/typenum/src/array.rs	2023-10-30 19:40:00.000000000 +0000
@@ -28,7 +28,7 @@
 
 impl TypeArray for TArr {}
 
-/// Create a new type-level array. Only usable on Rust 1.13.0 or newer.
+/// Create a new type-level arrray. Only usable on Rust 1.13.0 or newer.
 ///
 /// There's not a whole lot you can do with it right now.
 ///
diff -Nru temporalio-1.3.0/vendor/typenum/src/lib.rs temporalio-1.3.0/vendor/typenum/src/lib.rs
--- temporalio-1.3.0/vendor/typenum/src/lib.rs	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/typenum/src/lib.rs	2023-10-30 19:40:00.000000000 +0000
@@ -59,8 +59,7 @@
     )
 )]
 #![cfg_attr(feature = "cargo-clippy", deny(clippy::missing_inline_in_public_items))]
-#![doc(html_root_url = "https://docs.rs/typenum/1.17.0")]
-#![cfg_attr(docsrs, feature(doc_auto_cfg, doc_cfg))]
+#![doc(html_root_url = "https://docs.rs/typenum/1.16.0")]
 
 // For debugging macros:
 // #![feature(trace_macros)]
@@ -68,14 +67,22 @@
 
 use core::cmp::Ordering;
 
+#[cfg(feature = "force_unix_path_separator")]
 mod generated {
     include!(concat!(env!("OUT_DIR"), "/op.rs"));
     include!(concat!(env!("OUT_DIR"), "/consts.rs"));
-
     #[cfg(feature = "const-generics")]
     include!(concat!(env!("OUT_DIR"), "/generic_const_mappings.rs"));
 }
 
+#[cfg(not(feature = "force_unix_path_separator"))]
+mod generated {
+    include!(env!("TYPENUM_BUILD_OP"));
+    include!(env!("TYPENUM_BUILD_CONSTS"));
+    #[cfg(feature = "const-generics")]
+    include!(env!("TYPENUM_BUILD_GENERIC_CONSTS"));
+}
+
 pub mod bit;
 pub mod int;
 pub mod marker_traits;
diff -Nru temporalio-1.3.0/vendor/typenum/src/type_operators.rs temporalio-1.3.0/vendor/typenum/src/type_operators.rs
--- temporalio-1.3.0/vendor/typenum/src/type_operators.rs	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/typenum/src/type_operators.rs	2023-10-30 19:40:00.000000000 +0000
@@ -189,8 +189,7 @@
 
 macro_rules! impl_pow_i {
     () => ();
-    ($(#[$meta:meta])*  $t: ty $(, $tail:tt)*) => (
-        $(#[$meta])*
+    ($t: ty $(, $tail:tt)*) => (
         impl Pow for $t {
             type Output = $t;
             #[inline]
@@ -199,7 +198,6 @@
             }
         }
 
-        $(#[$meta])*
         impl Pow> for $t {
             type Output = $t;
             #[inline]
@@ -208,7 +206,6 @@
             }
         }
 
-        $(#[$meta])*
         impl Pow for $t {
             type Output = $t;
             #[inline]
@@ -217,7 +214,6 @@
             }
         }
 
-        $(#[$meta])*
         impl Pow> for $t {
             type Output = $t;
             #[inline]
@@ -232,11 +228,7 @@
 
 impl_pow_i!(u8, u16, u32, u64, usize, i8, i16, i32, i64, isize);
 #[cfg(feature = "i128")]
-impl_pow_i!(
-    #[cfg_attr(docsrs, doc(cfg(feature = "i128")))]
-    u128,
-    i128
-);
+impl_pow_i!(u128, i128);
 
 #[test]
 fn pow_test() {
diff -Nru temporalio-1.3.0/vendor/typenum/src/uint.rs temporalio-1.3.0/vendor/typenum/src/uint.rs
--- temporalio-1.3.0/vendor/typenum/src/uint.rs	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/typenum/src/uint.rs	2023-10-30 19:40:00.000000000 +0000
@@ -1163,7 +1163,7 @@
 }
 
 /// Comparing non-terimal bits, with both having bit `B0`.
-/// These are `Equal`, so we propagate `SoFar`.
+/// These are `Equal`, so we propogate `SoFar`.
 impl PrivateCmp, SoFar> for UInt
 where
     Ul: Unsigned,
@@ -1180,7 +1180,7 @@
 }
 
 /// Comparing non-terimal bits, with both having bit `B1`.
-/// These are `Equal`, so we propagate `SoFar`.
+/// These are `Equal`, so we propogate `SoFar`.
 impl PrivateCmp, SoFar> for UInt
 where
     Ul: Unsigned,
diff -Nru temporalio-1.3.0/vendor/unicode-ident/.cargo-checksum.json temporalio-1.3.0/vendor/unicode-ident/.cargo-checksum.json
--- temporalio-1.3.0/vendor/unicode-ident/.cargo-checksum.json	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/unicode-ident/.cargo-checksum.json	2023-10-30 19:40:00.000000000 +0000
@@ -1 +1 @@
-{"files":{"Cargo.toml":"7b10355305359d5feefb120329396a8823ce903cd66612d7d27612d51e6ceced","LICENSE-APACHE":"62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","LICENSE-UNICODE":"68f5b9f5ea36881a0942ba02f558e9e1faf76cc09cb165ad801744c61b738844","README.md":"eff1f30712e93cc160101c25bf31738448c284b90636deb3e3a651cb9ad20dd1","benches/xid.rs":"a61f61ecc7d5124c759cdeb55ab74470ab69f2f3ca37613da65f16e0e5e33487","src/lib.rs":"2673969775cff349816e3fb30f62476a802523fe4940482288b75bd747cbe748","src/tables.rs":"ffe8e252eabccf261385865cb781b3d76c9f32f6f9503d00196a30fb92d80b29","tests/compare.rs":"62471ffb157744cac6faae1adafdbdf785349d7eb6dc2ff4b4941c9d618397f9","tests/fst/mod.rs":"69a3aaf59acd8bca962ecc6234be56be8c0934ab79b253162f10eb881523901f","tests/fst/xid_continue.fst":"41fc751514b8bde658544d5fe7e100115d299d41897af855934b9f4ebda9d3a2","tests/fst/xid_start.fst":"ffa5e2bfe7dd5f6738fbe4b7a3e6e2083c9777191c54f8291a80d558ec4e2dd2","tests/roaring/mod.rs":"784f65a48477fab7549620c7843c7ad6da533f69a18abca1172f6acb95045e53","tests/static_size.rs":"4524332c1e424cb987d7cee1f47a98aea9ed7b256303a3828eda5aa1d06da240","tests/tables/mod.rs":"e6949172d10fc4b2431ce7546269bfd4f9146454c8c3e31faf5e5d80c16a8ab6","tests/tables/tables.rs":"011404dab8a3958da6e18a1fe9406c191675e6f49bf30ce813e3d05f582e750b","tests/trie/mod.rs":"d4acbb716bcbaf80660039797f45e138ed8bbd66749fa3b19b1a971574679cc9","tests/trie/trie.rs":"3c1ca56062f1b3ffdf2ae2063d3fee8d362b90082778056181b5c95e2e242ad8"},"package":"3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"}
\ No newline at end of file
+{"files":{"Cargo.toml":"5110725cf18a82fdad338f5cf3f3f75c04355b57afab6efaa9068eb2ba883ced","LICENSE-APACHE":"62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","LICENSE-UNICODE":"68f5b9f5ea36881a0942ba02f558e9e1faf76cc09cb165ad801744c61b738844","README.md":"4e3b8b33ce66d038b932b0824e9c5f459893c2004ce68065fb8b68c98692d298","benches/xid.rs":"a61f61ecc7d5124c759cdeb55ab74470ab69f2f3ca37613da65f16e0e5e33487","src/lib.rs":"e04331ab9a0f586541685c9728d4c6380babf00137a5b763fc8cc55109fe6ea2","src/tables.rs":"b4609d6c2e2ba44fba8cdbcec271325ff196afba8001dee805be95424219f01b","tests/compare.rs":"89c4dc4f745064a9f734667b1d960596a10b8cb019a8ed1c5b9512678a866ad5","tests/fst/mod.rs":"69a3aaf59acd8bca962ecc6234be56be8c0934ab79b253162f10eb881523901f","tests/fst/xid_continue.fst":"0624500413ac318fee8424eecdad70397f911e3beae52231bfca295bb1bb9e04","tests/fst/xid_start.fst":"cc36f4f1149a4004ea7e2075cfb54756328b571946fda526be508cf5ed53dbdb","tests/roaring/mod.rs":"784f65a48477fab7549620c7843c7ad6da533f69a18abca1172f6acb95045e53","tests/static_size.rs":"8d9aff4d6e4e846aa18dc47b527753f7768fbc7d552d2d66450c4debe6c4466c","tests/tables/mod.rs":"e6949172d10fc4b2431ce7546269bfd4f9146454c8c3e31faf5e5d80c16a8ab6","tests/tables/tables.rs":"5194ac98137a3b61322213f2f8e8b83ff925ffcdd79e93a2ec414ef944dc63a3","tests/trie/mod.rs":"d4acbb716bcbaf80660039797f45e138ed8bbd66749fa3b19b1a971574679cc9","tests/trie/trie.rs":"dbd7de5fe601159643a4c6febed06793f812e8d71010b0ec78f2557353a976b2"},"package":"301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c"}
\ No newline at end of file
diff -Nru temporalio-1.3.0/vendor/unicode-ident/Cargo.toml temporalio-1.3.0/vendor/unicode-ident/Cargo.toml
--- temporalio-1.3.0/vendor/unicode-ident/Cargo.toml	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/unicode-ident/Cargo.toml	2023-10-30 19:40:00.000000000 +0000
@@ -13,7 +13,7 @@
 edition = "2018"
 rust-version = "1.31"
 name = "unicode-ident"
-version = "1.0.12"
+version = "1.0.11"
 authors = ["David Tolnay "]
 description = "Determine whether characters have the XID_Start or XID_Continue properties according to Unicode Standard Annex #31"
 documentation = "https://docs.rs/unicode-ident"
diff -Nru temporalio-1.3.0/vendor/unicode-ident/README.md temporalio-1.3.0/vendor/unicode-ident/README.md
--- temporalio-1.3.0/vendor/unicode-ident/README.md	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/unicode-ident/README.md	2023-10-30 19:40:00.000000000 +0000
@@ -41,10 +41,10 @@
 
 | | static storage | 0% nonascii | 1% | 10% | 100% nonascii |
 |---|---|---|---|---|---|
-| **`unicode-ident`** | 10.1 K | 0.96 ns | 0.95 ns | 1.09 ns | 1.55 ns |
+| **`unicode-ident`** | 10.0 K | 0.96 ns | 0.95 ns | 1.09 ns | 1.55 ns |
 | **`unicode-xid`** | 11.5 K | 1.88 ns | 2.14 ns | 3.48 ns | 15.63 ns |
 | **`ucd-trie`** | 10.2 K | 1.29 ns | 1.28 ns | 1.36 ns | 2.15 ns |
-| **`fst`** | 139 K | 55.1 ns | 54.9 ns | 53.2 ns | 28.5 ns |
+| **`fst`** | 138 K | 55.1 ns | 54.9 ns | 53.2 ns | 28.5 ns |
 | **`roaring`** | 66.1 K | 2.78 ns | 3.09 ns | 3.37 ns | 4.70 ns |
 
 Source code for the benchmark is provided in the *bench* directory of this repo
diff -Nru temporalio-1.3.0/vendor/unicode-ident/src/lib.rs temporalio-1.3.0/vendor/unicode-ident/src/lib.rs
--- temporalio-1.3.0/vendor/unicode-ident/src/lib.rs	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/unicode-ident/src/lib.rs	2023-10-30 19:40:00.000000000 +0000
@@ -43,10 +43,10 @@
 //!
 //! | | static storage | 0% nonascii | 1% | 10% | 100% nonascii |
 //! |---|---|---|---|---|---|
-//! | **`unicode-ident`** | 10.1 K | 0.96 ns | 0.95 ns | 1.09 ns | 1.55 ns |
-//! | **`unicode-xid`** | 11.5 K | 1.88 ns | 2.14 ns | 3.48 ns | 15.63 ns |
-//! | **`ucd-trie`** | 10.2 K | 1.29 ns | 1.28 ns | 1.36 ns | 2.15 ns |
-//! | **`fst`** | 139 K | 55.1 ns | 54.9 ns | 53.2 ns | 28.5 ns |
+//! | **`unicode-ident`** | 9.75 K | 0.96 ns | 0.95 ns | 1.09 ns | 1.55 ns |
+//! | **`unicode-xid`** | 11.34 K | 1.88 ns | 2.14 ns | 3.48 ns | 15.63 ns |
+//! | **`ucd-trie`** | 9.95 K | 1.29 ns | 1.28 ns | 1.36 ns | 2.15 ns |
+//! | **`fst`** | 133 K | 55.1 ns | 54.9 ns | 53.2 ns | 28.5 ns |
 //! | **`roaring`** | 66.1 K | 2.78 ns | 3.09 ns | 3.37 ns | 4.70 ns |
 //!
 //! Source code for the benchmark is provided in the *bench* directory of this
@@ -242,7 +242,7 @@
 //! this data structure is straight-line code with no need for branching.
 
 #![no_std]
-#![doc(html_root_url = "https://docs.rs/unicode-ident/1.0.12")]
+#![doc(html_root_url = "https://docs.rs/unicode-ident/1.0.11")]
 #![allow(clippy::doc_markdown, clippy::must_use_candidate)]
 
 #[rustfmt::skip]
diff -Nru temporalio-1.3.0/vendor/unicode-ident/src/tables.rs temporalio-1.3.0/vendor/unicode-ident/src/tables.rs
--- temporalio-1.3.0/vendor/unicode-ident/src/tables.rs	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/unicode-ident/src/tables.rs	2023-10-30 19:40:00.000000000 +0000
@@ -52,7 +52,7 @@
     0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
     0x05, 0x05, 0x05, 0xE0, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x52, 0xE3, 0x05, 0x05, 0x05,
     0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0xE6, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
-    0x05, 0x05, 0x05, 0x05, 0x05, 0xE1, 0x05, 0xE9, 0x00, 0x00, 0x00, 0x00, 0x05, 0xEB, 0x00, 0x00,
+    0x05, 0x05, 0x05, 0x05, 0x05, 0xE1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xE9, 0x00, 0x00,
     0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0xE4, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
     0x05, 0xE7,
 ]);
@@ -81,7 +81,7 @@
     0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
     0x05, 0x05, 0x05, 0xE0, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x52, 0xE3, 0x05, 0x05, 0x05,
     0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0xE6, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
-    0x05, 0x05, 0x05, 0x05, 0x05, 0xE1, 0x05, 0xE9, 0x00, 0x00, 0x00, 0x00, 0x05, 0xEB, 0x00, 0x00,
+    0x05, 0x05, 0x05, 0x05, 0x05, 0xE1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xE9, 0x00, 0x00,
     0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0xE4, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
     0x05, 0xE7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -173,7 +173,7 @@
     0xC2,
 ]);
 
-pub(crate) static LEAF: Align64<[u8; 7584]> = Align64([
+pub(crate) static LEAF: Align64<[u8; 7520]> = Align64([
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -316,7 +316,7 @@
     0x00, 0x00, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     0x84, 0xFC, 0x2F, 0x3F, 0x50, 0xFD, 0xFF, 0xF3, 0xE0, 0x43, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
     0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x10, 0x00, 0x00, 0x00, 0x02, 0x80,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x10, 0x00, 0x00, 0x00, 0x02, 0x80,
     0x00, 0x00, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x1F, 0xE2, 0xFF, 0x01, 0x00,
     0x84, 0xFC, 0x2F, 0x3F, 0x50, 0xFD, 0xFF, 0xF3, 0xE0, 0x43, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
     0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -333,7 +333,7 @@
     0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
     0xFF, 0x7F, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF,
     0xE0, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x3E, 0x1F, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-    0xFF, 0xFF, 0x7F, 0xE6, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+    0xFF, 0xFF, 0x7F, 0xE6, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7,
     0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
     0xFF, 0x7F, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF,
     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
@@ -384,7 +384,7 @@
     0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0x7F, 0xFC, 0xFC, 0xFC, 0x1C, 0x00, 0x00, 0x00, 0x00,
     0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x18, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x8A, 0xAA,
     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F,
-    0x00, 0x00, 0xFF, 0x03, 0xFE, 0xFF, 0xFF, 0x87, 0xFE, 0xFF, 0xFF, 0x07, 0xE0, 0xFF, 0xFF, 0xFF,
+    0x00, 0x00, 0xFF, 0x03, 0xFE, 0xFF, 0xFF, 0x87, 0xFE, 0xFF, 0xFF, 0x07, 0xC0, 0xFF, 0xFF, 0xFF,
     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFC, 0xFC, 0xFC, 0x1C, 0x00, 0x00, 0x00, 0x00,
     0xFF, 0xEF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xB7, 0xFF, 0x3F, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00,
     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07,
@@ -627,7 +627,7 @@
     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0xFF, 0xFF,
+    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00,
     0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
@@ -640,10 +640,6 @@
     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
diff -Nru temporalio-1.3.0/vendor/unicode-ident/tests/compare.rs temporalio-1.3.0/vendor/unicode-ident/tests/compare.rs
--- temporalio-1.3.0/vendor/unicode-ident/tests/compare.rs	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/unicode-ident/tests/compare.rs	2023-10-30 19:40:00.000000000 +0000
@@ -14,8 +14,6 @@
         let thought_to_be_continue = unicode_ident::is_xid_continue(ch);
 
         // unicode-xid
-        // FIXME: unicode-xid does not support Unicode 15.1.0 yet.
-        /*
         assert_eq!(
             thought_to_be_start,
             unicode_xid::UnicodeXID::is_xid_start(ch),
@@ -26,7 +24,6 @@
             unicode_xid::UnicodeXID::is_xid_continue(ch),
             "{ch:?}",
         );
-        */
 
         // ucd-trie
         assert_eq!(
Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/unicode-ident/tests/fst/xid_continue.fst and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/unicode-ident/tests/fst/xid_continue.fst differ
Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/unicode-ident/tests/fst/xid_start.fst and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/unicode-ident/tests/fst/xid_start.fst differ
diff -Nru temporalio-1.3.0/vendor/unicode-ident/tests/static_size.rs temporalio-1.3.0/vendor/unicode-ident/tests/static_size.rs
--- temporalio-1.3.0/vendor/unicode-ident/tests/static_size.rs	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/unicode-ident/tests/static_size.rs	2023-10-30 19:40:00.000000000 +0000
@@ -13,7 +13,7 @@
         + size_of_val(&tables::TRIE_START)
         + size_of_val(&tables::TRIE_CONTINUE)
         + size_of_val(&tables::LEAF);
-    assert_eq!(10080, size);
+    assert_eq!(10016, size);
 }
 
 #[test]
@@ -23,7 +23,7 @@
     mod tables;
 
     let size = size_of_val(tables::XID_START) + size_of_val(tables::XID_CONTINUE);
-    assert_eq!(11544, size);
+    assert_eq!(11528, size);
 
     let _ = tables::BY_NAME;
 }
@@ -70,7 +70,7 @@
         + size_of_val(tree3_level2)
         + size_of_val(tree3_level3);
 
-    assert_eq!(10200, start_size + continue_size);
+    assert_eq!(10208, start_size + continue_size);
 
     let _ = trie::BY_NAME;
 }
@@ -80,7 +80,7 @@
     let xid_start_fst = include_bytes!("fst/xid_start.fst");
     let xid_continue_fst = include_bytes!("fst/xid_continue.fst");
     let size = xid_start_fst.len() + xid_continue_fst.len();
-    assert_eq!(138736, size);
+    assert_eq!(137749, size);
 }
 
 #[test]
diff -Nru temporalio-1.3.0/vendor/unicode-ident/tests/tables/tables.rs temporalio-1.3.0/vendor/unicode-ident/tests/tables/tables.rs
--- temporalio-1.3.0/vendor/unicode-ident/tests/tables/tables.rs	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/unicode-ident/tests/tables/tables.rs	2023-10-30 19:40:00.000000000 +0000
@@ -2,9 +2,9 @@
 //
 //   ucd-generate property-bool UCD --include XID_Start,XID_Continue
 //
-// Unicode version: 15.1.0.
+// Unicode version: 15.0.0.
 //
-// ucd-generate 0.3.0 is available on crates.io.
+// ucd-generate 0.2.13 is available on crates.io.
 
 pub const BY_NAME: &'static [(&'static str, &'static [(u32, u32)])] = &[
   ("XID_Continue", XID_CONTINUE), ("XID_Start", XID_START),
@@ -70,123 +70,123 @@
   (8016, 8023), (8025, 8025), (8027, 8027), (8029, 8029), (8031, 8061),
   (8064, 8116), (8118, 8124), (8126, 8126), (8130, 8132), (8134, 8140),
   (8144, 8147), (8150, 8155), (8160, 8172), (8178, 8180), (8182, 8188),
-  (8204, 8205), (8255, 8256), (8276, 8276), (8305, 8305), (8319, 8319),
-  (8336, 8348), (8400, 8412), (8417, 8417), (8421, 8432), (8450, 8450),
-  (8455, 8455), (8458, 8467), (8469, 8469), (8472, 8477), (8484, 8484),
-  (8486, 8486), (8488, 8488), (8490, 8505), (8508, 8511), (8517, 8521),
-  (8526, 8526), (8544, 8584), (11264, 11492), (11499, 11507), (11520, 11557),
+  (8255, 8256), (8276, 8276), (8305, 8305), (8319, 8319), (8336, 8348),
+  (8400, 8412), (8417, 8417), (8421, 8432), (8450, 8450), (8455, 8455),
+  (8458, 8467), (8469, 8469), (8472, 8477), (8484, 8484), (8486, 8486),
+  (8488, 8488), (8490, 8505), (8508, 8511), (8517, 8521), (8526, 8526),
+  (8544, 8584), (11264, 11492), (11499, 11507), (11520, 11557),
   (11559, 11559), (11565, 11565), (11568, 11623), (11631, 11631),
   (11647, 11670), (11680, 11686), (11688, 11694), (11696, 11702),
   (11704, 11710), (11712, 11718), (11720, 11726), (11728, 11734),
   (11736, 11742), (11744, 11775), (12293, 12295), (12321, 12335),
   (12337, 12341), (12344, 12348), (12353, 12438), (12441, 12442),
-  (12445, 12447), (12449, 12543), (12549, 12591), (12593, 12686),
-  (12704, 12735), (12784, 12799), (13312, 19903), (19968, 42124),
-  (42192, 42237), (42240, 42508), (42512, 42539), (42560, 42607),
-  (42612, 42621), (42623, 42737), (42775, 42783), (42786, 42888),
-  (42891, 42954), (42960, 42961), (42963, 42963), (42965, 42969),
-  (42994, 43047), (43052, 43052), (43072, 43123), (43136, 43205),
-  (43216, 43225), (43232, 43255), (43259, 43259), (43261, 43309),
-  (43312, 43347), (43360, 43388), (43392, 43456), (43471, 43481),
-  (43488, 43518), (43520, 43574), (43584, 43597), (43600, 43609),
-  (43616, 43638), (43642, 43714), (43739, 43741), (43744, 43759),
-  (43762, 43766), (43777, 43782), (43785, 43790), (43793, 43798),
-  (43808, 43814), (43816, 43822), (43824, 43866), (43868, 43881),
-  (43888, 44010), (44012, 44013), (44016, 44025), (44032, 55203),
-  (55216, 55238), (55243, 55291), (63744, 64109), (64112, 64217),
-  (64256, 64262), (64275, 64279), (64285, 64296), (64298, 64310),
-  (64312, 64316), (64318, 64318), (64320, 64321), (64323, 64324),
-  (64326, 64433), (64467, 64605), (64612, 64829), (64848, 64911),
-  (64914, 64967), (65008, 65017), (65024, 65039), (65056, 65071),
-  (65075, 65076), (65101, 65103), (65137, 65137), (65139, 65139),
-  (65143, 65143), (65145, 65145), (65147, 65147), (65149, 65149),
-  (65151, 65276), (65296, 65305), (65313, 65338), (65343, 65343),
-  (65345, 65370), (65381, 65470), (65474, 65479), (65482, 65487),
-  (65490, 65495), (65498, 65500), (65536, 65547), (65549, 65574),
-  (65576, 65594), (65596, 65597), (65599, 65613), (65616, 65629),
-  (65664, 65786), (65856, 65908), (66045, 66045), (66176, 66204),
-  (66208, 66256), (66272, 66272), (66304, 66335), (66349, 66378),
-  (66384, 66426), (66432, 66461), (66464, 66499), (66504, 66511),
-  (66513, 66517), (66560, 66717), (66720, 66729), (66736, 66771),
-  (66776, 66811), (66816, 66855), (66864, 66915), (66928, 66938),
-  (66940, 66954), (66956, 66962), (66964, 66965), (66967, 66977),
-  (66979, 66993), (66995, 67001), (67003, 67004), (67072, 67382),
-  (67392, 67413), (67424, 67431), (67456, 67461), (67463, 67504),
-  (67506, 67514), (67584, 67589), (67592, 67592), (67594, 67637),
-  (67639, 67640), (67644, 67644), (67647, 67669), (67680, 67702),
-  (67712, 67742), (67808, 67826), (67828, 67829), (67840, 67861),
-  (67872, 67897), (67968, 68023), (68030, 68031), (68096, 68099),
-  (68101, 68102), (68108, 68115), (68117, 68119), (68121, 68149),
-  (68152, 68154), (68159, 68159), (68192, 68220), (68224, 68252),
-  (68288, 68295), (68297, 68326), (68352, 68405), (68416, 68437),
-  (68448, 68466), (68480, 68497), (68608, 68680), (68736, 68786),
-  (68800, 68850), (68864, 68903), (68912, 68921), (69248, 69289),
-  (69291, 69292), (69296, 69297), (69373, 69404), (69415, 69415),
-  (69424, 69456), (69488, 69509), (69552, 69572), (69600, 69622),
-  (69632, 69702), (69734, 69749), (69759, 69818), (69826, 69826),
-  (69840, 69864), (69872, 69881), (69888, 69940), (69942, 69951),
-  (69956, 69959), (69968, 70003), (70006, 70006), (70016, 70084),
-  (70089, 70092), (70094, 70106), (70108, 70108), (70144, 70161),
-  (70163, 70199), (70206, 70209), (70272, 70278), (70280, 70280),
-  (70282, 70285), (70287, 70301), (70303, 70312), (70320, 70378),
-  (70384, 70393), (70400, 70403), (70405, 70412), (70415, 70416),
-  (70419, 70440), (70442, 70448), (70450, 70451), (70453, 70457),
-  (70459, 70468), (70471, 70472), (70475, 70477), (70480, 70480),
-  (70487, 70487), (70493, 70499), (70502, 70508), (70512, 70516),
-  (70656, 70730), (70736, 70745), (70750, 70753), (70784, 70853),
-  (70855, 70855), (70864, 70873), (71040, 71093), (71096, 71104),
-  (71128, 71133), (71168, 71232), (71236, 71236), (71248, 71257),
-  (71296, 71352), (71360, 71369), (71424, 71450), (71453, 71467),
-  (71472, 71481), (71488, 71494), (71680, 71738), (71840, 71913),
-  (71935, 71942), (71945, 71945), (71948, 71955), (71957, 71958),
-  (71960, 71989), (71991, 71992), (71995, 72003), (72016, 72025),
-  (72096, 72103), (72106, 72151), (72154, 72161), (72163, 72164),
-  (72192, 72254), (72263, 72263), (72272, 72345), (72349, 72349),
-  (72368, 72440), (72704, 72712), (72714, 72758), (72760, 72768),
-  (72784, 72793), (72818, 72847), (72850, 72871), (72873, 72886),
-  (72960, 72966), (72968, 72969), (72971, 73014), (73018, 73018),
-  (73020, 73021), (73023, 73031), (73040, 73049), (73056, 73061),
-  (73063, 73064), (73066, 73102), (73104, 73105), (73107, 73112),
-  (73120, 73129), (73440, 73462), (73472, 73488), (73490, 73530),
-  (73534, 73538), (73552, 73561), (73648, 73648), (73728, 74649),
-  (74752, 74862), (74880, 75075), (77712, 77808), (77824, 78895),
-  (78912, 78933), (82944, 83526), (92160, 92728), (92736, 92766),
-  (92768, 92777), (92784, 92862), (92864, 92873), (92880, 92909),
-  (92912, 92916), (92928, 92982), (92992, 92995), (93008, 93017),
-  (93027, 93047), (93053, 93071), (93760, 93823), (93952, 94026),
-  (94031, 94087), (94095, 94111), (94176, 94177), (94179, 94180),
-  (94192, 94193), (94208, 100343), (100352, 101589), (101632, 101640),
-  (110576, 110579), (110581, 110587), (110589, 110590), (110592, 110882),
-  (110898, 110898), (110928, 110930), (110933, 110933), (110948, 110951),
-  (110960, 111355), (113664, 113770), (113776, 113788), (113792, 113800),
-  (113808, 113817), (113821, 113822), (118528, 118573), (118576, 118598),
-  (119141, 119145), (119149, 119154), (119163, 119170), (119173, 119179),
-  (119210, 119213), (119362, 119364), (119808, 119892), (119894, 119964),
-  (119966, 119967), (119970, 119970), (119973, 119974), (119977, 119980),
-  (119982, 119993), (119995, 119995), (119997, 120003), (120005, 120069),
-  (120071, 120074), (120077, 120084), (120086, 120092), (120094, 120121),
-  (120123, 120126), (120128, 120132), (120134, 120134), (120138, 120144),
-  (120146, 120485), (120488, 120512), (120514, 120538), (120540, 120570),
-  (120572, 120596), (120598, 120628), (120630, 120654), (120656, 120686),
-  (120688, 120712), (120714, 120744), (120746, 120770), (120772, 120779),
-  (120782, 120831), (121344, 121398), (121403, 121452), (121461, 121461),
-  (121476, 121476), (121499, 121503), (121505, 121519), (122624, 122654),
-  (122661, 122666), (122880, 122886), (122888, 122904), (122907, 122913),
-  (122915, 122916), (122918, 122922), (122928, 122989), (123023, 123023),
-  (123136, 123180), (123184, 123197), (123200, 123209), (123214, 123214),
-  (123536, 123566), (123584, 123641), (124112, 124153), (124896, 124902),
-  (124904, 124907), (124909, 124910), (124912, 124926), (124928, 125124),
-  (125136, 125142), (125184, 125259), (125264, 125273), (126464, 126467),
-  (126469, 126495), (126497, 126498), (126500, 126500), (126503, 126503),
-  (126505, 126514), (126516, 126519), (126521, 126521), (126523, 126523),
-  (126530, 126530), (126535, 126535), (126537, 126537), (126539, 126539),
-  (126541, 126543), (126545, 126546), (126548, 126548), (126551, 126551),
-  (126553, 126553), (126555, 126555), (126557, 126557), (126559, 126559),
-  (126561, 126562), (126564, 126564), (126567, 126570), (126572, 126578),
-  (126580, 126583), (126585, 126588), (126590, 126590), (126592, 126601),
-  (126603, 126619), (126625, 126627), (126629, 126633), (126635, 126651),
-  (130032, 130041), (131072, 173791), (173824, 177977), (177984, 178205),
-  (178208, 183969), (183984, 191456), (191472, 192093), (194560, 195101),
+  (12445, 12447), (12449, 12538), (12540, 12543), (12549, 12591),
+  (12593, 12686), (12704, 12735), (12784, 12799), (13312, 19903),
+  (19968, 42124), (42192, 42237), (42240, 42508), (42512, 42539),
+  (42560, 42607), (42612, 42621), (42623, 42737), (42775, 42783),
+  (42786, 42888), (42891, 42954), (42960, 42961), (42963, 42963),
+  (42965, 42969), (42994, 43047), (43052, 43052), (43072, 43123),
+  (43136, 43205), (43216, 43225), (43232, 43255), (43259, 43259),
+  (43261, 43309), (43312, 43347), (43360, 43388), (43392, 43456),
+  (43471, 43481), (43488, 43518), (43520, 43574), (43584, 43597),
+  (43600, 43609), (43616, 43638), (43642, 43714), (43739, 43741),
+  (43744, 43759), (43762, 43766), (43777, 43782), (43785, 43790),
+  (43793, 43798), (43808, 43814), (43816, 43822), (43824, 43866),
+  (43868, 43881), (43888, 44010), (44012, 44013), (44016, 44025),
+  (44032, 55203), (55216, 55238), (55243, 55291), (63744, 64109),
+  (64112, 64217), (64256, 64262), (64275, 64279), (64285, 64296),
+  (64298, 64310), (64312, 64316), (64318, 64318), (64320, 64321),
+  (64323, 64324), (64326, 64433), (64467, 64605), (64612, 64829),
+  (64848, 64911), (64914, 64967), (65008, 65017), (65024, 65039),
+  (65056, 65071), (65075, 65076), (65101, 65103), (65137, 65137),
+  (65139, 65139), (65143, 65143), (65145, 65145), (65147, 65147),
+  (65149, 65149), (65151, 65276), (65296, 65305), (65313, 65338),
+  (65343, 65343), (65345, 65370), (65382, 65470), (65474, 65479),
+  (65482, 65487), (65490, 65495), (65498, 65500), (65536, 65547),
+  (65549, 65574), (65576, 65594), (65596, 65597), (65599, 65613),
+  (65616, 65629), (65664, 65786), (65856, 65908), (66045, 66045),
+  (66176, 66204), (66208, 66256), (66272, 66272), (66304, 66335),
+  (66349, 66378), (66384, 66426), (66432, 66461), (66464, 66499),
+  (66504, 66511), (66513, 66517), (66560, 66717), (66720, 66729),
+  (66736, 66771), (66776, 66811), (66816, 66855), (66864, 66915),
+  (66928, 66938), (66940, 66954), (66956, 66962), (66964, 66965),
+  (66967, 66977), (66979, 66993), (66995, 67001), (67003, 67004),
+  (67072, 67382), (67392, 67413), (67424, 67431), (67456, 67461),
+  (67463, 67504), (67506, 67514), (67584, 67589), (67592, 67592),
+  (67594, 67637), (67639, 67640), (67644, 67644), (67647, 67669),
+  (67680, 67702), (67712, 67742), (67808, 67826), (67828, 67829),
+  (67840, 67861), (67872, 67897), (67968, 68023), (68030, 68031),
+  (68096, 68099), (68101, 68102), (68108, 68115), (68117, 68119),
+  (68121, 68149), (68152, 68154), (68159, 68159), (68192, 68220),
+  (68224, 68252), (68288, 68295), (68297, 68326), (68352, 68405),
+  (68416, 68437), (68448, 68466), (68480, 68497), (68608, 68680),
+  (68736, 68786), (68800, 68850), (68864, 68903), (68912, 68921),
+  (69248, 69289), (69291, 69292), (69296, 69297), (69373, 69404),
+  (69415, 69415), (69424, 69456), (69488, 69509), (69552, 69572),
+  (69600, 69622), (69632, 69702), (69734, 69749), (69759, 69818),
+  (69826, 69826), (69840, 69864), (69872, 69881), (69888, 69940),
+  (69942, 69951), (69956, 69959), (69968, 70003), (70006, 70006),
+  (70016, 70084), (70089, 70092), (70094, 70106), (70108, 70108),
+  (70144, 70161), (70163, 70199), (70206, 70209), (70272, 70278),
+  (70280, 70280), (70282, 70285), (70287, 70301), (70303, 70312),
+  (70320, 70378), (70384, 70393), (70400, 70403), (70405, 70412),
+  (70415, 70416), (70419, 70440), (70442, 70448), (70450, 70451),
+  (70453, 70457), (70459, 70468), (70471, 70472), (70475, 70477),
+  (70480, 70480), (70487, 70487), (70493, 70499), (70502, 70508),
+  (70512, 70516), (70656, 70730), (70736, 70745), (70750, 70753),
+  (70784, 70853), (70855, 70855), (70864, 70873), (71040, 71093),
+  (71096, 71104), (71128, 71133), (71168, 71232), (71236, 71236),
+  (71248, 71257), (71296, 71352), (71360, 71369), (71424, 71450),
+  (71453, 71467), (71472, 71481), (71488, 71494), (71680, 71738),
+  (71840, 71913), (71935, 71942), (71945, 71945), (71948, 71955),
+  (71957, 71958), (71960, 71989), (71991, 71992), (71995, 72003),
+  (72016, 72025), (72096, 72103), (72106, 72151), (72154, 72161),
+  (72163, 72164), (72192, 72254), (72263, 72263), (72272, 72345),
+  (72349, 72349), (72368, 72440), (72704, 72712), (72714, 72758),
+  (72760, 72768), (72784, 72793), (72818, 72847), (72850, 72871),
+  (72873, 72886), (72960, 72966), (72968, 72969), (72971, 73014),
+  (73018, 73018), (73020, 73021), (73023, 73031), (73040, 73049),
+  (73056, 73061), (73063, 73064), (73066, 73102), (73104, 73105),
+  (73107, 73112), (73120, 73129), (73440, 73462), (73472, 73488),
+  (73490, 73530), (73534, 73538), (73552, 73561), (73648, 73648),
+  (73728, 74649), (74752, 74862), (74880, 75075), (77712, 77808),
+  (77824, 78895), (78912, 78933), (82944, 83526), (92160, 92728),
+  (92736, 92766), (92768, 92777), (92784, 92862), (92864, 92873),
+  (92880, 92909), (92912, 92916), (92928, 92982), (92992, 92995),
+  (93008, 93017), (93027, 93047), (93053, 93071), (93760, 93823),
+  (93952, 94026), (94031, 94087), (94095, 94111), (94176, 94177),
+  (94179, 94180), (94192, 94193), (94208, 100343), (100352, 101589),
+  (101632, 101640), (110576, 110579), (110581, 110587), (110589, 110590),
+  (110592, 110882), (110898, 110898), (110928, 110930), (110933, 110933),
+  (110948, 110951), (110960, 111355), (113664, 113770), (113776, 113788),
+  (113792, 113800), (113808, 113817), (113821, 113822), (118528, 118573),
+  (118576, 118598), (119141, 119145), (119149, 119154), (119163, 119170),
+  (119173, 119179), (119210, 119213), (119362, 119364), (119808, 119892),
+  (119894, 119964), (119966, 119967), (119970, 119970), (119973, 119974),
+  (119977, 119980), (119982, 119993), (119995, 119995), (119997, 120003),
+  (120005, 120069), (120071, 120074), (120077, 120084), (120086, 120092),
+  (120094, 120121), (120123, 120126), (120128, 120132), (120134, 120134),
+  (120138, 120144), (120146, 120485), (120488, 120512), (120514, 120538),
+  (120540, 120570), (120572, 120596), (120598, 120628), (120630, 120654),
+  (120656, 120686), (120688, 120712), (120714, 120744), (120746, 120770),
+  (120772, 120779), (120782, 120831), (121344, 121398), (121403, 121452),
+  (121461, 121461), (121476, 121476), (121499, 121503), (121505, 121519),
+  (122624, 122654), (122661, 122666), (122880, 122886), (122888, 122904),
+  (122907, 122913), (122915, 122916), (122918, 122922), (122928, 122989),
+  (123023, 123023), (123136, 123180), (123184, 123197), (123200, 123209),
+  (123214, 123214), (123536, 123566), (123584, 123641), (124112, 124153),
+  (124896, 124902), (124904, 124907), (124909, 124910), (124912, 124926),
+  (124928, 125124), (125136, 125142), (125184, 125259), (125264, 125273),
+  (126464, 126467), (126469, 126495), (126497, 126498), (126500, 126500),
+  (126503, 126503), (126505, 126514), (126516, 126519), (126521, 126521),
+  (126523, 126523), (126530, 126530), (126535, 126535), (126537, 126537),
+  (126539, 126539), (126541, 126543), (126545, 126546), (126548, 126548),
+  (126551, 126551), (126553, 126553), (126555, 126555), (126557, 126557),
+  (126559, 126559), (126561, 126562), (126564, 126564), (126567, 126570),
+  (126572, 126578), (126580, 126583), (126585, 126588), (126590, 126590),
+  (126592, 126601), (126603, 126619), (126625, 126627), (126629, 126633),
+  (126635, 126651), (130032, 130041), (131072, 173791), (173824, 177977),
+  (177984, 178205), (178208, 183969), (183984, 191456), (194560, 195101),
   (196608, 201546), (201552, 205743), (917760, 917999),
 ];
 
@@ -342,6 +342,6 @@
   (126567, 126570), (126572, 126578), (126580, 126583), (126585, 126588),
   (126590, 126590), (126592, 126601), (126603, 126619), (126625, 126627),
   (126629, 126633), (126635, 126651), (131072, 173791), (173824, 177977),
-  (177984, 178205), (178208, 183969), (183984, 191456), (191472, 192093),
-  (194560, 195101), (196608, 201546), (201552, 205743),
+  (177984, 178205), (178208, 183969), (183984, 191456), (194560, 195101),
+  (196608, 201546), (201552, 205743),
 ];
diff -Nru temporalio-1.3.0/vendor/unicode-ident/tests/trie/trie.rs temporalio-1.3.0/vendor/unicode-ident/tests/trie/trie.rs
--- temporalio-1.3.0/vendor/unicode-ident/tests/trie/trie.rs	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/unicode-ident/tests/trie/trie.rs	2023-10-30 19:40:00.000000000 +0000
@@ -2,9 +2,9 @@
 //
 //   ucd-generate property-bool UCD --include XID_Start,XID_Continue --trie-set
 //
-// Unicode version: 15.1.0.
+// Unicode version: 15.0.0.
 //
-// ucd-generate 0.3.0 is available on crates.io.
+// ucd-generate 0.2.13 is available on crates.io.
 
 pub const BY_NAME: &'static [(&'static str, &'static ::ucd_trie::TrieSet)] = &[
   ("XID_Continue", XID_CONTINUE), ("XID_Start", XID_START),
@@ -33,7 +33,7 @@
     75, 76, 77, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
     78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
     78, 78, 78, 78, 78, 78, 78, 78, 4, 4, 4, 79, 80, 81, 82, 83, 78, 78, 78,
-    78, 78, 78, 78, 78, 84, 42, 85, 4, 86, 4, 87, 88, 78, 78, 78, 78, 78, 78,
+    78, 78, 78, 78, 78, 84, 42, 85, 86, 87, 4, 88, 89, 78, 78, 78, 78, 78, 78,
     78, 78, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
     4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
     4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
@@ -52,15 +52,15 @@
     4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
     4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
     4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
-    4, 4, 4, 4, 89, 90, 4, 4, 4, 4, 91, 92, 4, 93, 94, 4, 95, 96, 97, 62, 4,
-    98, 99, 100, 4, 101, 102, 103, 4, 104, 105, 106, 4, 107, 4, 4, 4, 4, 4, 4,
+    4, 4, 4, 4, 90, 91, 4, 4, 4, 4, 92, 93, 4, 94, 95, 4, 96, 97, 98, 62, 4,
+    99, 100, 101, 4, 102, 103, 104, 4, 105, 106, 107, 4, 108, 4, 4, 4, 4, 4,
     4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
     4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
     4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
     4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
     4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
     4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
-    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 108, 109, 78, 78,
+    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 109, 110, 78, 78,
     78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
     78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
     78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
@@ -68,8 +68,8 @@
     78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
     78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
     78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
-    78, 78, 78, 78, 4, 4, 4, 4, 4, 99, 4, 110, 111, 112, 93, 113, 4, 114, 4,
-    4, 115, 116, 117, 118, 119, 120, 4, 121, 122, 123, 124, 125,
+    78, 78, 78, 78, 4, 4, 4, 4, 4, 100, 4, 111, 112, 113, 94, 114, 4, 115, 4,
+    4, 116, 117, 118, 119, 120, 121, 4, 122, 123, 124, 125, 126,
   ],
   tree2_level2: &[
     0x3FFFFFFFFFFF, 0xFFFF07FF0FFFFFFF, 0xFFFFFFFFFF007EFF,
@@ -92,13 +92,13 @@
     0x7FFF, 0xFF80003FF1FFF, 0xFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFF,
     0x3FFFFFFFFFFFE3FF, 0xE7FFFFFFFFFF01FF, 0x7FFFFFFFFF70000,
     0xFFFFFFFF3F3FFFFF, 0x3FFFFFFFAAFF3F3F, 0x5FDFFFFFFFFFFFFF,
-    0x1FDC1FFF0FCF1FDC, 0x8000000000003000, 0x8002000000100001, 0x1FFF0000,
+    0x1FDC1FFF0FCF1FDC, 0x8000000000000000, 0x8002000000100001, 0x1FFF0000,
     0x1FFE21FFF0000, 0xF3FFFD503F2FFC84, 0xFFFFFFFF000043E0, 0x1FF, 0,
     0xFF81FFFFFFFFF, 0xFFFF20BFFFFFFFFF, 0x800080FFFFFFFFFF,
     0x7F7F7F7F007FFFFF, 0xFFFFFFFF7F7F7F7F, 0x1F3EFFFE000000E0,
-    0xFFFFFFFEE67FFFFF, 0xFFFEFFFFFFFFFFE0, 0xFFFFFFFF00007FFF,
-    0xFFFF000000000000, 0x1FFF, 0x3FFFFFFFFFFF0000, 0xFFFFFFF1FFF,
-    0xBFF0FFFFFFFFFFFF, 0x3FFFFFFFFFFFF, 0xFFFFFFFCFF800000,
+    0xFFFFFFFEE67FFFFF, 0xF7FFFFFFFFFFFFFF, 0xFFFEFFFFFFFFFFE0,
+    0xFFFFFFFF00007FFF, 0xFFFF000000000000, 0x1FFF, 0x3FFFFFFFFFFF0000,
+    0xFFFFFFF1FFF, 0xBFF0FFFFFFFFFFFF, 0x3FFFFFFFFFFFF, 0xFFFFFFFCFF800000,
     0xFFFFFFFFFFFFF9FF, 0xFFFC000003EB07FF, 0x10FFFFFFFFFF,
     0xE8FFFFFF03FF003F, 0xFFFF3FFFFFFFFFFF, 0x1FFFFFFF000FFFFF,
     0x7FFFFFFF03FF8001, 0x7FFFFFFFFFFFFF, 0xFC7FFFFF03FF3FFF,
@@ -108,7 +108,7 @@
     0xFFFFFFF03FFFFFFF, 0x3FFFFFFFFFFFFFFF, 0xFFFFFFFFFFFF0000,
     0xFFFFFFFFFFFCFFFF, 0x3FF0000000000FF, 0x18FFFF0000FFFF,
     0xAA8A00000000E000, 0x1FFFFFFFFFFFFFFF, 0x87FFFFFE03FF0000,
-    0xFFFFFFE007FFFFFE, 0x7FFFFFFFFFFFFFFF, 0x1CFCFCFC,
+    0xFFFFFFC007FFFFFE, 0x7FFFFFFFFFFFFFFF, 0x1CFCFCFC,
   ],
   tree3_level1: &[
     0, 1, 2, 3, 4, 5, 6, 7, 8, 5, 9, 10, 11, 12, 13, 14, 7, 7, 7, 7, 7, 7, 7,
@@ -174,18 +174,18 @@
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 138, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 139, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 140, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
-    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2,
-    2, 2, 2, 2, 140, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
-    4, 4, 4, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 141, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 139, 4, 4, 4,
+    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 2,
+    2, 2, 2, 140, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+    4, 4, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 141, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 87, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+    2, 2, 2, 2, 2, 2, 2, 87, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
     4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
-    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 87, 4, 4, 4, 4, 4, 4, 4,
+    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 87, 4, 4, 4, 4, 4, 4, 4, 4,
     4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
-    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
   ],
   tree3_level3: &[
     0xB7FFFF7FFFFFEFFF, 0x3FFF3FFF, 0xFFFFFFFFFFFFFFFF, 0x7FFFFFFFFFFFFFF, 0,
@@ -223,7 +223,7 @@
     0x3FFFFFFFFFFF, 0x8000, 0x3FFF1FFFFFFFFFFF, 0x43FF, 0x7FFFFFFF0000,
     0x3FFFFFFFFFFFFFF, 0x3FFFFFFFFFF0000, 0x7FFF6F7F00000000, 0x7F001F,
     0x3FF0FFF, 0xAF7FE96FFFFFFEF, 0x5EF7F796AA96EA84, 0xFFFFBEE0FFFFBFF,
-    0x3FF000000000000, 0xFFFFFFFF, 0xFFFF0003FFFFFFFF, 0xFFFF0001FFFFFFFF,
+    0x3FF000000000000, 0xFFFFFFFF, 0xFFFF0003FFFFFFFF, 0x1FFFFFFFF,
     0x3FFFFFFF, 0xFFFFFFFFFFFF07FF,
   ],
 };
@@ -397,16 +397,15 @@
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 128, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 129, 2, 2, 2, 2, 2, 2, 2, 2, 2, 130, 4,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 129, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
     4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
-    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 2, 2, 2, 2, 130, 4, 4, 4,
-    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 131, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 2, 2, 2, 2, 130, 4, 4, 4, 4,
+    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 2, 2,
+    2, 2, 2, 2, 2, 2, 2, 131, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    55, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 55,
     4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
-    4,
+    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
   ],
   tree3_level3: &[
     0xB7FFFF7FFFFFEFFF, 0x3FFF3FFF, 0xFFFFFFFFFFFFFFFF, 0x7FFFFFFFFFFFFFF, 0,
@@ -440,6 +439,6 @@
     0xFFFF000000000000, 0x3FFFFFFFFFFF, 0x3F801FFFFFFFFFFF, 0x4000,
     0xFFFFFFF0000, 0x7FFF6F7F00000000, 0x1F, 0x80F, 0xAF7FE96FFFFFFEF,
     0x5EF7F796AA96EA84, 0xFFFFBEE0FFFFBFF, 0xFFFFFFFF, 0x3FFFFFFFFFFFFFF,
-    0xFFFF0003FFFFFFFF, 0xFFFF0001FFFFFFFF, 0x3FFFFFFF, 0xFFFFFFFFFFFF07FF,
+    0xFFFF0003FFFFFFFF, 0x1FFFFFFFF, 0x3FFFFFFF, 0xFFFFFFFFFFFF07FF,
   ],
 };
diff -Nru temporalio-1.3.0/vendor/untrusted-0.7.1/.cargo-checksum.json temporalio-1.3.0/vendor/untrusted-0.7.1/.cargo-checksum.json
--- temporalio-1.3.0/vendor/untrusted-0.7.1/.cargo-checksum.json	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/untrusted-0.7.1/.cargo-checksum.json	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-{"files":{"Cargo.toml":"59bb105a246b4729fc4bd17a4c3d6a86baa93ff912d29832afeb1bbc4668ea82","LICENSE.txt":"7abd9b6960dcf7d4d0a48606a5b71bfe37d472db68d70637f3a58a56785f1621","README.md":"8ec7954c78b7bceecc1757f2af855045969c3197ad306c9a5d3a6e0c43a8a9cd","rustfmt.toml":"35224a8b085bf87a77b0c6ab0c58f5deae37d1bddfbf59df98f9155a796ab3a7","src/untrusted.rs":"0be77ed2066283297671ec1f9e7c0003a37364d40f9853d2cb1a0139edd0de1a","tests/tests.rs":"7ea1550681e427fa6bf88ba41b13ebd810afd46c50fca85b297cd4e6d9a02157"},"package":"a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a"}
\ No newline at end of file
diff -Nru temporalio-1.3.0/vendor/untrusted-0.7.1/Cargo.toml temporalio-1.3.0/vendor/untrusted-0.7.1/Cargo.toml
--- temporalio-1.3.0/vendor/untrusted-0.7.1/Cargo.toml	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/untrusted-0.7.1/Cargo.toml	1970-01-01 00:00:00.000000000 +0000
@@ -1,29 +0,0 @@
-# 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 believe there's an error in this file please file an
-# issue against the rust-lang/cargo repository. If you're
-# editing this file be aware that the upstream Cargo.toml
-# will likely look very different (and much more reasonable)
-
-[package]
-edition = "2018"
-name = "untrusted"
-version = "0.7.1"
-authors = ["Brian Smith "]
-description = "Safe, fast, zero-panic, zero-crashing, zero-allocation parsing of untrusted inputs in Rust."
-documentation = "https://briansmith.org/rustdoc/untrusted/"
-readme = "README.md"
-license = "ISC"
-repository = "https://github.com/briansmith/untrusted"
-[profile.bench]
-opt-level = 2
-lto = true
-
-[lib]
-name = "untrusted"
-path = "src/untrusted.rs"
diff -Nru temporalio-1.3.0/vendor/untrusted-0.7.1/LICENSE.txt temporalio-1.3.0/vendor/untrusted-0.7.1/LICENSE.txt
--- temporalio-1.3.0/vendor/untrusted-0.7.1/LICENSE.txt	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/untrusted-0.7.1/LICENSE.txt	1970-01-01 00:00:00.000000000 +0000
@@ -1,13 +0,0 @@
-// Copyright 2015-2016 Brian Smith.
-//
-// Permission to use, copy, modify, and/or distribute this software for any
-// purpose with or without fee is hereby granted, provided that the above
-// copyright notice and this permission notice appear in all copies.
-//
-// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES
-// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR
-// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff -Nru temporalio-1.3.0/vendor/untrusted-0.7.1/README.md temporalio-1.3.0/vendor/untrusted-0.7.1/README.md
--- temporalio-1.3.0/vendor/untrusted-0.7.1/README.md	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/untrusted-0.7.1/README.md	1970-01-01 00:00:00.000000000 +0000
@@ -1,109 +0,0 @@
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES WITH
-REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
-AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, DIRECT,
-INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
-LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
-OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
-PERFORMANCE OF THIS SOFTWARE.
-
-
-
-untrusted.rs
-============
-
-Safe, fast, zero-panic, zero-crashing, zero-allocation parsing of untrusted
-inputs in Rust.
-
-untrusted.rs is 100% Rust with no use of `unsafe`. It never uses the heap.
-No part of untrusted.rs's API will ever panic or cause a crash. It is
-`#![no_std]` and so it works perfectly with both libcore- and libstd- based
-projects. It does not depend on any crates other than libcore.
-
-untrusted.rs is intended to be used with the latest version of Rust Stable.
-It should usually work with the latest Rust Beta and Rust Nightly versions
-too. Using a version of untrusted.rs other than the latest release available
-on crates.io is not recommended.
-
-
-
-Documentation
--------------
-
-See the documentation at
-https://briansmith.org/rustdoc/untrusted/.
-
-To use untrusted.rs in your project, add a dependency to your
-Cargo.toml like this:
-
-```
-[dependencies]
-untrusted = "0.2"
-```
-
-
-
-Examples
---------
-
-[*ring*](https://github.com/briansmith/ring)'s parser for the subset of ASN.1
-DER it needs to understand,
-[`ring::der`](https://github.com/briansmith/ring/blob/master/src/der.rs), is
-built on top of untrusted.rs. *ring* also uses untrusted.rs to parse ECC public
-keys, RSA PKCS#1 1.5 padding, and everything else.
-
-All of [webpki](https://github.com/briansmith/webpki)'s parsing of X.509
-certificates (also ASN.1 DER) is done using untrusted.rs.
-
-
-
-Contributing
-------------
-
-Patches welcome!
-
-When contributing changes, state that you agree to license your contribution
-under the same terms as the existing code by putting this at the bottom of your
-commit message:
-
-```
-
-I agree to license my contributions to each file under the terms given
-at the top of each file I changed.
-```
-
-Currently, the biggest needs for this library are:
-
-* Unit tests.
-* Documentation.
-* More examples.
-* Static analysis and fuzzing.
-
-
-
-Online Automated Testing
-------------------------
-
-Travis CI is used for Android, Linux, and Mac OS X. The tests are run for the
-current release of each Rust channel (Stable, Beta, Nightly). Since
-untrusted.rs only depends on libcore and it only uses 100% cross-platform code
-without using `unsafe`, it should work anywhere as long as these platforms are
-passing.
-
-
-
-
-
-Bug Reporting
--------------
-
-Please report bugs either as pull requests or as issues in [the issue
-tracker](https://github.com/briansmith/untrusted/issues). untrusted.rs has a
-**full disclosure** vulnerability policy. **Please do NOT attempt to report
-any security vulnerability in this code privately to anybody.**
-
-
-
-License
--------
-
-See [LICENSE.txt](LICENSE.txt), an ISC-style (simplified MIT) license.
diff -Nru temporalio-1.3.0/vendor/untrusted-0.7.1/rustfmt.toml temporalio-1.3.0/vendor/untrusted-0.7.1/rustfmt.toml
--- temporalio-1.3.0/vendor/untrusted-0.7.1/rustfmt.toml	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/untrusted-0.7.1/rustfmt.toml	1970-01-01 00:00:00.000000000 +0000
@@ -1,13 +0,0 @@
-edition = "2018"
-fn_args_density = "Compressed"
-fn_single_line = true
-match_arm_blocks = false
-match_block_trailing_comma = true
-max_width = 100
-merge_imports = true
-newline_style = "Unix"
-reorder_imports = true
-trailing_comma = "Vertical"
-use_field_init_shorthand = true
-use_try_shorthand = true
-wrap_comments = true
diff -Nru temporalio-1.3.0/vendor/untrusted-0.7.1/src/untrusted.rs temporalio-1.3.0/vendor/untrusted-0.7.1/src/untrusted.rs
--- temporalio-1.3.0/vendor/untrusted-0.7.1/src/untrusted.rs	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/untrusted-0.7.1/src/untrusted.rs	1970-01-01 00:00:00.000000000 +0000
@@ -1,374 +0,0 @@
-// Copyright 2015-2016 Brian Smith.
-//
-// Permission to use, copy, modify, and/or distribute this software for any
-// purpose with or without fee is hereby granted, provided that the above
-// copyright notice and this permission notice appear in all copies.
-//
-// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES
-// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR
-// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-//! untrusted.rs: Safe, fast, zero-panic, zero-crashing, zero-allocation
-//! parsing of untrusted inputs in Rust.
-//!
-//! git clone https://github.com/briansmith/untrusted
-//!
-//! untrusted.rs goes beyond Rust's normal safety guarantees by  also
-//! guaranteeing that parsing will be panic-free, as long as
-//! `untrusted::Input::as_slice_less_safe()` is not used. It avoids copying
-//! data and heap allocation and strives to prevent common pitfalls such as
-//! accidentally parsing input bytes multiple times. In order to meet these
-//! goals, untrusted.rs is limited in functionality such that it works best for
-//! input languages with a small fixed amount of lookahead such as ASN.1, TLS,
-//! TCP/IP, and many other networking, IPC, and related protocols. Languages
-//! that require more lookahead and/or backtracking require some significant
-//! contortions to parse using this framework. It would not be realistic to use
-//! it for parsing programming language code, for example.
-//!
-//! The overall pattern for using untrusted.rs is:
-//!
-//! 1. Write a recursive-descent-style parser for the input language, where the
-//!    input data is given as a `&mut untrusted::Reader` parameter to each
-//!    function. Each function should have a return type of `Result` for
-//!    some value type `V` and some error type `E`, either or both of which may
-//!    be `()`. Functions for parsing the lowest-level language constructs
-//!    should be defined. Those lowest-level functions will parse their inputs
-//!    using `::read_byte()`, `Reader::peek()`, and similar functions.
-//!    Higher-level language constructs are then parsed by calling the
-//!    lower-level functions in sequence.
-//!
-//! 2. Wrap the top-most functions of your recursive-descent parser in
-//!    functions that take their input data as an `untrusted::Input`. The
-//!    wrapper functions should call the `Input`'s `read_all` (or a variant
-//!    thereof) method. The wrapper functions are the only ones that should be
-//!    exposed outside the parser's module.
-//!
-//! 3. After receiving the input data to parse, wrap it in an `untrusted::Input`
-//!    using `untrusted::Input::from()` as early as possible. Pass the
-//!    `untrusted::Input` to the wrapper functions when they need to be parsed.
-//!
-//! In general parsers built using `untrusted::Reader` do not need to explicitly
-//! check for end-of-input unless they are parsing optional constructs, because
-//! `Reader::read_byte()` will return `Err(EndOfInput)` on end-of-input.
-//! Similarly, parsers using `untrusted::Reader` generally don't need to check
-//! for extra junk at the end of the input as long as the parser's API uses the
-//! pattern described above, as `read_all` and its variants automatically check
-//! for trailing junk. `Reader::skip_to_end()` must be used when any remaining
-//! unread input should be ignored without triggering an error.
-//!
-//! untrusted.rs works best when all processing of the input data is done
-//! through the `untrusted::Input` and `untrusted::Reader` types. In
-//! particular, avoid trying to parse input data using functions that take
-//! byte slices. However, when you need to access a part of the input data as
-//! a slice to use a function that isn't written using untrusted.rs,
-//! `Input::as_slice_less_safe()` can be used.
-//!
-//! It is recommend to use `use untrusted;` and then `untrusted::Input`,
-//! `untrusted::Reader`, etc., instead of using `use untrusted::*`. Qualifying
-//! the names with `untrusted` helps remind the reader of the code that it is
-//! dealing with *untrusted* input.
-//!
-//! # Examples
-//!
-//! [*ring*](https://github.com/briansmith/ring)'s parser for the subset of
-//! ASN.1 DER it needs to understand,
-//! [`ring::der`](https://github.com/briansmith/ring/blob/master/src/der.rs),
-//! is built on top of untrusted.rs. *ring* also uses untrusted.rs to parse ECC
-//! public keys, RSA PKCS#1 1.5 padding, and for all other parsing it does.
-//!
-//! All of [webpki](https://github.com/briansmith/webpki)'s parsing of X.509
-//! certificates (also ASN.1 DER) is done using untrusted.rs.
-
-#![doc(html_root_url = "https://briansmith.org/rustdoc/")]
-// `#[derive(...)]` uses `#[allow(unused_qualifications)]` internally.
-#![deny(unused_qualifications)]
-#![forbid(
-    anonymous_parameters,
-    box_pointers,
-    missing_docs,
-    trivial_casts,
-    trivial_numeric_casts,
-    unsafe_code,
-    unstable_features,
-    unused_extern_crates,
-    unused_import_braces,
-    unused_results,
-    variant_size_differences,
-    warnings
-)]
-#![no_std]
-
-/// A wrapper around `&'a [u8]` that helps in writing panic-free code.
-///
-/// No methods of `Input` will ever panic.
-#[derive(Clone, Copy, Debug, Eq)]
-pub struct Input<'a> {
-    value: no_panic::Slice<'a>,
-}
-
-impl<'a> Input<'a> {
-    /// Construct a new `Input` for the given input `bytes`.
-    pub const fn from(bytes: &'a [u8]) -> Self {
-        // This limit is important for avoiding integer overflow. In particular,
-        // `Reader` assumes that an `i + 1 > i` if `input.value.get(i)` does
-        // not return `None`. According to the Rust language reference, the
-        // maximum object size is `core::isize::MAX`, and in practice it is
-        // impossible to create an object of size `core::usize::MAX` or larger.
-        Self {
-            value: no_panic::Slice::new(bytes),
-        }
-    }
-
-    /// Returns `true` if the input is empty and false otherwise.
-    #[inline]
-    pub fn is_empty(&self) -> bool { self.value.is_empty() }
-
-    /// Returns the length of the `Input`.
-    #[inline]
-    pub fn len(&self) -> usize { self.value.len() }
-
-    /// Calls `read` with the given input as a `Reader`, ensuring that `read`
-    /// consumed the entire input. If `read` does not consume the entire input,
-    /// `incomplete_read` is returned.
-    pub fn read_all(&self, incomplete_read: E, read: F) -> Result
-    where
-        F: FnOnce(&mut Reader<'a>) -> Result,
-    {
-        let mut input = Reader::new(*self);
-        let result = read(&mut input)?;
-        if input.at_end() {
-            Ok(result)
-        } else {
-            Err(incomplete_read)
-        }
-    }
-
-    /// Access the input as a slice so it can be processed by functions that
-    /// are not written using the Input/Reader framework.
-    #[inline]
-    pub fn as_slice_less_safe(&self) -> &'a [u8] { self.value.as_slice_less_safe() }
-}
-
-impl<'a> From<&'a [u8]> for Input<'a> {
-    #[inline]
-    fn from(value: &'a [u8]) -> Self { Self { value: no_panic::Slice::new(value)} }
-}
-
-// #[derive(PartialEq)] would result in lifetime bounds that are
-// unnecessarily restrictive; see
-// https://github.com/rust-lang/rust/issues/26925.
-impl PartialEq> for Input<'_> {
-    #[inline]
-    fn eq(&self, other: &Input) -> bool {
-        self.as_slice_less_safe() == other.as_slice_less_safe()
-    }
-}
-
-impl PartialEq<[u8]> for Input<'_> {
-    #[inline]
-    fn eq(&self, other: &[u8]) -> bool { self.as_slice_less_safe() == other }
-}
-
-impl PartialEq> for [u8] {
-    #[inline]
-    fn eq(&self, other: &Input) -> bool { other.as_slice_less_safe() == self }
-}
-
-/// Calls `read` with the given input as a `Reader`, ensuring that `read`
-/// consumed the entire input. When `input` is `None`, `read` will be
-/// called with `None`.
-pub fn read_all_optional<'a, F, R, E>(
-    input: Option>, incomplete_read: E, read: F,
-) -> Result
-where
-    F: FnOnce(Option<&mut Reader<'a>>) -> Result,
-{
-    match input {
-        Some(input) => {
-            let mut input = Reader::new(input);
-            let result = read(Some(&mut input))?;
-            if input.at_end() {
-                Ok(result)
-            } else {
-                Err(incomplete_read)
-            }
-        },
-        None => read(None),
-    }
-}
-
-/// A read-only, forward-only* cursor into the data in an `Input`.
-///
-/// Using `Reader` to parse input helps to ensure that no byte of the input
-/// will be accidentally processed more than once. Using `Reader` in
-/// conjunction with `read_all` and `read_all_optional` helps ensure that no
-/// byte of the input is accidentally left unprocessed. The methods of `Reader`
-/// never panic, so `Reader` also assists the writing of panic-free code.
-///
-/// \* `Reader` is not strictly forward-only because of the method
-/// `get_input_between_marks`, which is provided mainly to support calculating
-/// digests over parsed data.
-#[derive(Debug)]
-pub struct Reader<'a> {
-    input: no_panic::Slice<'a>,
-    i: usize,
-}
-
-/// An index into the already-parsed input of a `Reader`.
-pub struct Mark {
-    i: usize,
-}
-
-impl<'a> Reader<'a> {
-    /// Construct a new Reader for the given input. Use `read_all` or
-    /// `read_all_optional` instead of `Reader::new` whenever possible.
-    #[inline]
-    pub fn new(input: Input<'a>) -> Self {
-        Self {
-            input: input.value,
-            i: 0,
-        }
-    }
-
-    /// Returns `true` if the reader is at the end of the input, and `false`
-    /// otherwise.
-    #[inline]
-    pub fn at_end(&self) -> bool { self.i == self.input.len() }
-
-    /// Returns an `Input` for already-parsed input that has had its boundaries
-    /// marked using `mark`.
-    #[inline]
-    pub fn get_input_between_marks(
-        &self, mark1: Mark, mark2: Mark,
-    ) -> Result, EndOfInput> {
-        self.input
-            .subslice(mark1.i..mark2.i)
-            .map(|subslice| Input { value: subslice })
-            .ok_or(EndOfInput)
-    }
-
-    /// Return the current position of the `Reader` for future use in a call
-    /// to `get_input_between_marks`.
-    #[inline]
-    pub fn mark(&self) -> Mark { Mark { i: self.i } }
-
-    /// Returns `true` if there is at least one more byte in the input and that
-    /// byte is equal to `b`, and false otherwise.
-    #[inline]
-    pub fn peek(&self, b: u8) -> bool {
-        match self.input.get(self.i) {
-            Some(actual_b) => b == *actual_b,
-            None => false,
-        }
-    }
-
-    /// Reads the next input byte.
-    ///
-    /// Returns `Ok(b)` where `b` is the next input byte, or `Err(EndOfInput)`
-    /// if the `Reader` is at the end of the input.
-    #[inline]
-    pub fn read_byte(&mut self) -> Result {
-        match self.input.get(self.i) {
-            Some(b) => {
-                self.i += 1; // safe from overflow; see Input::from().
-                Ok(*b)
-            },
-            None => Err(EndOfInput),
-        }
-    }
-
-    /// Skips `num_bytes` of the input, returning the skipped input as an
-    /// `Input`.
-    ///
-    /// Returns `Ok(i)` if there are at least `num_bytes` of input remaining,
-    /// and `Err(EndOfInput)` otherwise.
-    #[inline]
-    pub fn read_bytes(&mut self, num_bytes: usize) -> Result, EndOfInput> {
-        let new_i = self.i.checked_add(num_bytes).ok_or(EndOfInput)?;
-        let ret = self
-            .input
-            .subslice(self.i..new_i)
-            .map(|subslice| Input { value: subslice })
-            .ok_or(EndOfInput)?;
-        self.i = new_i;
-        Ok(ret)
-    }
-
-    /// Skips the reader to the end of the input, returning the skipped input
-    /// as an `Input`.
-    #[inline]
-    pub fn read_bytes_to_end(&mut self) -> Input<'a> {
-        let to_skip = self.input.len() - self.i;
-        self.read_bytes(to_skip).unwrap()
-    }
-
-    /// Calls `read()` with the given input as a `Reader`. On success, returns a
-    /// pair `(bytes_read, r)` where `bytes_read` is what `read()` consumed and
-    /// `r` is `read()`'s return value.
-    pub fn read_partial(&mut self, read: F) -> Result<(Input<'a>, R), E>
-    where
-        F: FnOnce(&mut Reader<'a>) -> Result,
-    {
-        let start = self.i;
-        let r = read(self)?;
-        let bytes_read = Input {
-            value: self.input.subslice(start..self.i).unwrap()
-        };
-        Ok((bytes_read, r))
-    }
-
-    /// Skips `num_bytes` of the input.
-    ///
-    /// Returns `Ok(i)` if there are at least `num_bytes` of input remaining,
-    /// and `Err(EndOfInput)` otherwise.
-    #[inline]
-    pub fn skip(&mut self, num_bytes: usize) -> Result<(), EndOfInput> {
-        self.read_bytes(num_bytes).map(|_| ())
-    }
-
-    /// Skips the reader to the end of the input.
-    #[inline]
-    pub fn skip_to_end(&mut self) -> () { let _ = self.read_bytes_to_end(); }
-}
-
-/// The error type used to indicate the end of the input was reached before the
-/// operation could be completed.
-#[derive(Clone, Copy, Debug, Eq, PartialEq)]
-pub struct EndOfInput;
-
-mod no_panic {
-    use core;
-
-    /// A wrapper around a slice that exposes no functions that can panic.
-    #[derive(Clone, Copy, Debug, Eq, PartialEq)]
-    pub struct Slice<'a> {
-        bytes: &'a [u8],
-    }
-
-    impl<'a> Slice<'a> {
-        #[inline]
-        pub const fn new(bytes: &'a [u8]) -> Self { Self { bytes } }
-
-        #[inline]
-        pub fn get(&self, i: usize) -> Option<&u8> { self.bytes.get(i) }
-
-        #[inline]
-        pub fn subslice(&self, r: core::ops::Range) -> Option {
-            self.bytes.get(r).map(|bytes| Self { bytes })
-        }
-
-        #[inline]
-        pub fn is_empty(&self) -> bool { self.bytes.is_empty() }
-
-        #[inline]
-        pub fn len(&self) -> usize { self.bytes.len() }
-
-        #[inline]
-        pub fn as_slice_less_safe(&self) -> &'a [u8] { self.bytes }
-    }
-
-} // mod no_panic
diff -Nru temporalio-1.3.0/vendor/untrusted-0.7.1/tests/tests.rs temporalio-1.3.0/vendor/untrusted-0.7.1/tests/tests.rs
--- temporalio-1.3.0/vendor/untrusted-0.7.1/tests/tests.rs	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/untrusted-0.7.1/tests/tests.rs	1970-01-01 00:00:00.000000000 +0000
@@ -1,98 +0,0 @@
-// Copyright 2015-2019 Brian Smith.
-//
-// Permission to use, copy, modify, and/or distribute this software for any
-// purpose with or without fee is hereby granted, provided that the above
-// copyright notice and this permission notice appear in all copies.
-//
-// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES
-// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR
-// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-#[test]
-fn test_input_from() { let _ = untrusted::Input::from(b"foo"); }
-
-#[test]
-fn test_input_is_empty() {
-    let input = untrusted::Input::from(b"");
-    assert!(input.is_empty());
-    let input = untrusted::Input::from(b"foo");
-    assert!(!input.is_empty());
-}
-
-#[test]
-fn test_input_len() {
-    let input = untrusted::Input::from(b"foo");
-    assert_eq!(input.len(), 3);
-}
-
-#[test]
-fn test_input_read_all() {
-    let input = untrusted::Input::from(b"foo");
-    let result = input.read_all(untrusted::EndOfInput, |input| {
-        assert_eq!(b'f', input.read_byte()?);
-        assert_eq!(b'o', input.read_byte()?);
-        assert_eq!(b'o', input.read_byte()?);
-        assert!(input.at_end());
-        Ok(())
-    });
-    assert_eq!(result, Ok(()));
-}
-
-#[test]
-fn test_input_read_all_unconsume() {
-    let input = untrusted::Input::from(b"foo");
-    let result = input.read_all(untrusted::EndOfInput, |input| {
-        assert_eq!(b'f', input.read_byte()?);
-        assert!(!input.at_end());
-        Ok(())
-    });
-    assert_eq!(result, Err(untrusted::EndOfInput));
-}
-
-#[test]
-fn test_input_as_slice_less_safe() {
-    let slice = b"foo";
-    let input = untrusted::Input::from(slice);
-    assert_eq!(input.as_slice_less_safe(), slice);
-}
-
-#[test]
-fn using_reader_after_skip_and_get_error_returns_error_must_not_panic() {
-    let input = untrusted::Input::from(&[]);
-    let r = input.read_all(untrusted::EndOfInput, |input| {
-        let r = input.read_bytes(1);
-        assert_eq!(r, Err(untrusted::EndOfInput));
-        Ok(input.read_bytes_to_end())
-    });
-    let _ = r; // "Use" r. The value of `r` is undefined here.
-}
-
-#[test]
-fn size_assumptions() {
-    // Assume that a pointer can address any point in the address space, and
-    // infer that this implies that a byte slice will never be
-    // `core::usize::MAX` bytes long.
-    assert_eq!(core::mem::size_of::<*const u8>(), core::mem::size_of::());
-}
-
-#[test]
-fn const_fn() {
-    const _INPUT: untrusted::Input<'static> = untrusted::Input::from(&[]);
-}
-
-#[test]
-fn test_vec_into() {
-    extern crate std;
-    let vec = vec![0u8; 0];
-    let _x: untrusted::Input = (&vec[..]).into();
-}
-
-#[test]
-fn test_from_slice() {
-    let slice: &[u8] = &[0u8];
-    let _x: untrusted::Input = slice.into();
-}
\ No newline at end of file
diff -Nru temporalio-1.3.0/vendor/url/.cargo-checksum.json temporalio-1.3.0/vendor/url/.cargo-checksum.json
--- temporalio-1.3.0/vendor/url/.cargo-checksum.json	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/url/.cargo-checksum.json	2023-10-30 19:40:00.000000000 +0000
@@ -1 +1 @@
-{"files":{"Cargo.toml":"e8485127c0165af45af4d307166b2db764ee5e1299b9a2cb81c144376361614e","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"76e972ac0f4ddb116e86e10100132a783931a596e7b9872eaa31be15cd4d751d","src/host.rs":"5e25476aaec0153b64d35b53940a72a1ec58e29a0e1fde36944f52eeb945c5f6","src/lib.rs":"1491370cc37bcf7e86dcaa060e24fa83db5ee49c2b91637a188d1407caa1611e","src/origin.rs":"19a4b451e8615bfef7239d2fc719c489398fe5044edb0df7c84b54eef4ceba1b","src/parser.rs":"5427cd15caedc8e3c1418cc576a7263e96df26a51ad3ce88f8c32d3eb7d6dd2c","src/path_segments.rs":"29db87b6902da4ab1ae925b3874afdeff42b8ddfb46356af6a83b86f34e03b14","src/quirks.rs":"c9311e3dd6f701fb4b8e438b3e3960ff6f8c78a67ae763f3640b178f15c60e45","src/slicing.rs":"39f4e624adbdbf952b7da8bfe6abdfa6e344193d6e1bbca1b0ccbfc821573f10","tests/expected_failures.txt":"1afb47b036a9fd2a9db671f233ebfa2802b5cd27c4e65839b518ab0a24380ff2","tests/setters_tests.json":"a3a4cbd7b798bc2c4d9656dc50be7397a5a5ed1f0b52daa1da1ad654d38c1dcd","tests/unit.rs":"1abe0a410c5078e1ad9de8c93f2f2ae660ddb47b7efaac9047e952457b068ded","tests/urltestdata.json":"58d67bea710d5f46324fe6841df5fd82090fe4ec2d882bc0fc7c1784d4771884","tests/wpt.rs":"6302c008cde6e7c0df8626701cc825731363722d02e35804bb370c385b455145"},"package":"143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5"}
\ No newline at end of file
+{"files":{"Cargo.toml":"81ec036a51f251210a8469d004611867b1b18cc5e6a5e27abefa86c80b057d75","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"76e972ac0f4ddb116e86e10100132a783931a596e7b9872eaa31be15cd4d751d","README.md":"71b01ec6f2f4ce47235ee430ba0c41afac563403a9dbcda23a584c3e915395ac","src/host.rs":"5e25476aaec0153b64d35b53940a72a1ec58e29a0e1fde36944f52eeb945c5f6","src/lib.rs":"fe1a969023cf7fca36cbd58f72b6cdb988d0ac58c0555d8ecc376dfd78d19a69","src/origin.rs":"19a4b451e8615bfef7239d2fc719c489398fe5044edb0df7c84b54eef4ceba1b","src/parser.rs":"8a928f10387b39fefbba9b22048452b1b1ae9cb46b3c349dea2a59d169e7aed8","src/path_segments.rs":"dd6b637245b2ad77ce96221df3f80c8b4ad858cd52aecc86b97166dec386882a","src/quirks.rs":"82903ff9c95604409cded330e36ebba0ede91c469d1aa40fb646186e2bef0769","src/slicing.rs":"39f4e624adbdbf952b7da8bfe6abdfa6e344193d6e1bbca1b0ccbfc821573f10","tests/data.rs":"35c8f1ab545c3e20a3895712ef235aed07dd8226bf9be6e7b21674fc0125c2be","tests/debugger_visualizer.rs":"d3a9466c636ee80ec9181817a8d30ea3e0cee699776ee4b805175981e4775448","tests/setters_tests.json":"486f6d129960d0d0d99b533caf9bef21113b31adcdb83296dfc4a59cd8431715","tests/unit.rs":"ff61fd7640cc84f45f6dd73d8785576d070506a62c48475bcbf927e9ae97edfd","tests/urltestdata.json":"4df7b990a7624da4fd94bee862fe1c3c1ded59fc27fb1cdf08d4a20b655aa3b7"},"package":"50bff7831e19200a85b17131d085c25d7811bc4e186efdaf54bbd132994a88cb"}
\ No newline at end of file
diff -Nru temporalio-1.3.0/vendor/url/Cargo.toml temporalio-1.3.0/vendor/url/Cargo.toml
--- temporalio-1.3.0/vendor/url/Cargo.toml	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/url/Cargo.toml	2023-10-30 19:40:00.000000000 +0000
@@ -13,32 +13,46 @@
 edition = "2018"
 rust-version = "1.56"
 name = "url"
-version = "2.4.1"
+version = "2.4.0"
 authors = ["The rust-url developers"]
-include = ["src/**/*", "LICENSE-*", "README.md", "tests/**"]
+include = [
+    "src/**/*",
+    "LICENSE-*",
+    "README.md",
+    "tests/**",
+]
 description = "URL library for Rust, based on the WHATWG URL Standard"
 documentation = "https://docs.rs/url"
-readme = "../README.md"
-keywords = ["url", "parser"]
-categories = ["parser-implementations", "web-programming", "encoding"]
+readme = "README.md"
+keywords = [
+    "url",
+    "parser",
+]
+categories = [
+    "parser-implementations",
+    "web-programming",
+    "encoding",
+]
 license = "MIT OR Apache-2.0"
 repository = "https://github.com/servo/rust-url"
+
 [package.metadata.docs.rs]
 features = ["serde"]
-rustdoc-args = ["--generate-link-to-definition"]
 
 [package.metadata.playground]
 features = ["serde"]
 
 [[test]]
-name = "url_wpt"
-path = "tests/wpt.rs"
-harness = false
+name = "debugger_visualizer"
+path = "tests/debugger_visualizer.rs"
+test = false
+required-features = ["debugger_visualizer"]
 
 [[bench]]
 name = "parse_url"
 path = "benches/parse_url.rs"
 harness = false
+
 [dependencies.form_urlencoded]
 version = "1.2.0"
 
@@ -52,12 +66,15 @@
 version = "1.0"
 features = ["derive"]
 optional = true
+
 [dev-dependencies.bencher]
 version = "0.1"
 
-[dev-dependencies.serde]
-version = "1.0"
-features = ["derive"]
+[dev-dependencies.debugger_test]
+version = "0.1"
+
+[dev-dependencies.debugger_test_parser]
+version = "0.1"
 
 [dev-dependencies.serde_json]
 version = "1.0"
@@ -66,3 +83,9 @@
 debugger_visualizer = []
 default = []
 expose_internals = []
+
+[badges.appveyor]
+repository = "Manishearth/rust-url"
+
+[badges.travis-ci]
+repository = "servo/rust-url"
diff -Nru temporalio-1.3.0/vendor/url/README.md temporalio-1.3.0/vendor/url/README.md
--- temporalio-1.3.0/vendor/url/README.md	1970-01-01 00:00:00.000000000 +0000
+++ temporalio-1.3.0/vendor/url/README.md	2023-10-30 19:40:00.000000000 +0000
@@ -0,0 +1,14 @@
+rust-url
+========
+
+[![Build status](https://github.com/servo/rust-url/workflows/CI/badge.svg)](https://github.com/servo/rust-url/actions?query=workflow%3ACI)
+[![Coverage](https://codecov.io/gh/servo/rust-url/branch/master/graph/badge.svg)](https://codecov.io/gh/servo/rust-url)
+[![Chat](https://img.shields.io/badge/chat-%23rust--url:mozilla.org-%2346BC99?logo=Matrix)](https://matrix.to/#/#rust-url:mozilla.org)
+[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE-MIT)
+[![License: Apache 2.0](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](LICENSE-APACHE)
+
+URL library for Rust, based on the [URL Standard](https://url.spec.whatwg.org/).
+
+[Documentation](https://docs.rs/url/)
+
+Please see [UPGRADING.md](https://github.com/servo/rust-url/blob/master/UPGRADING.md) if you are upgrading from a previous version.
diff -Nru temporalio-1.3.0/vendor/url/src/lib.rs temporalio-1.3.0/vendor/url/src/lib.rs
--- temporalio-1.3.0/vendor/url/src/lib.rs	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/url/src/lib.rs	2023-10-30 19:40:00.000000000 +0000
@@ -119,24 +119,12 @@
 url = { version = "2", features = ["serde"] }
 ```
 
-# Feature: `debugger_visualizer`
-
-If you enable the `debugger_visualizer` feature, the `url` crate will include
-a [natvis file](https://docs.microsoft.com/en-us/visualstudio/debugger/create-custom-views-of-native-objects)
-for [Visual Studio](https://www.visualstudio.com/) that allows you to view
-[`Url`](struct.Url.html) objects in the debugger.
-
-This feature requires Rust 1.71 or later.
-
-```toml
-url = { version = "2", features = ["debugger_visualizer"] }
-```
-
 */
 
-#![doc(html_root_url = "https://docs.rs/url/2.4.1")]
+#![doc(html_root_url = "https://docs.rs/url/2.4.0")]
 #![cfg_attr(
     feature = "debugger_visualizer",
+    feature(debugger_visualizer),
     debugger_visualizer(natvis_file = "../../debug_metadata/url.natvis")
 )]
 
@@ -1498,7 +1486,7 @@
         if let Some(input) = fragment {
             self.fragment_start = Some(to_u32(self.serialization.len()).unwrap());
             self.serialization.push('#');
-            self.mutate(|parser| parser.parse_fragment(parser::Input::new_no_trim(input)))
+            self.mutate(|parser| parser.parse_fragment(parser::Input::no_trim(input)))
         } else {
             self.fragment_start = None;
             self.strip_trailing_spaces_from_opaque_path();
@@ -1561,7 +1549,7 @@
                 parser.parse_query(
                     scheme_type,
                     scheme_end,
-                    parser::Input::new_trim_tab_and_newlines(input, vfn),
+                    parser::Input::trim_tab_and_newlines(input, vfn),
                 )
             });
         } else {
@@ -1682,14 +1670,10 @@
                     parser.serialization.push_str("%2F");
                     path = &path[1..];
                 }
-                parser.parse_cannot_be_a_base_path(parser::Input::new_no_trim(path));
+                parser.parse_cannot_be_a_base_path(parser::Input::new(path));
             } else {
                 let mut has_host = true; // FIXME
-                parser.parse_path_start(
-                    scheme_type,
-                    &mut has_host,
-                    parser::Input::new_no_trim(path),
-                );
+                parser.parse_path_start(scheme_type, &mut has_host, parser::Input::new(path));
             }
         });
         self.restore_after_path(old_after_path_pos, &after_path);
@@ -2359,7 +2343,7 @@
     #[allow(clippy::result_unit_err, clippy::suspicious_operation_groupings)]
     pub fn set_scheme(&mut self, scheme: &str) -> Result<(), ()> {
         let mut parser = Parser::for_setter(String::new());
-        let remaining = parser.parse_scheme(parser::Input::new_no_trim(scheme))?;
+        let remaining = parser.parse_scheme(parser::Input::new(scheme))?;
         let new_scheme_type = SchemeType::from(&parser.serialization);
         let old_scheme_type = SchemeType::from(self.scheme());
         // If url’s scheme is a special scheme and buffer is not a special scheme, then return.
diff -Nru temporalio-1.3.0/vendor/url/src/parser.rs temporalio-1.3.0/vendor/url/src/parser.rs
--- temporalio-1.3.0/vendor/url/src/parser.rs	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/url/src/parser.rs	2023-10-30 19:40:00.000000000 +0000
@@ -184,13 +184,17 @@
 }
 
 impl<'i> Input<'i> {
-    pub fn new_no_trim(input: &'i str) -> Self {
+    pub fn new(input: &'i str) -> Self {
+        Input::with_log(input, None)
+    }
+
+    pub fn no_trim(input: &'i str) -> Self {
         Input {
             chars: input.chars(),
         }
     }
 
-    pub fn new_trim_tab_and_newlines(
+    pub fn trim_tab_and_newlines(
         original_input: &'i str,
         vfn: Option<&dyn Fn(SyntaxViolation)>,
     ) -> Self {
@@ -208,10 +212,7 @@
         }
     }
 
-    pub fn new_trim_c0_control_and_space(
-        original_input: &'i str,
-        vfn: Option<&dyn Fn(SyntaxViolation)>,
-    ) -> Self {
+    pub fn with_log(original_input: &'i str, vfn: Option<&dyn Fn(SyntaxViolation)>) -> Self {
         let input = original_input.trim_matches(c0_control_or_space);
         if let Some(vfn) = vfn {
             if input.len() < original_input.len() {
@@ -361,7 +362,7 @@
 
     /// https://url.spec.whatwg.org/#concept-basic-url-parser
     pub fn parse_url(mut self, input: &str) -> ParseResult {
-        let input = Input::new_trim_c0_control_and_space(input, self.violation_fn);
+        let input = Input::with_log(input, self.violation_fn);
         if let Ok(remaining) = self.parse_scheme(input.clone()) {
             return self.parse_with_scheme(remaining);
         }
@@ -1202,7 +1203,6 @@
                     _ => {
                         self.check_url_code_point(c, &input);
                         if scheme_type.is_file()
-                            && self.serialization.len() > path_start
                             && is_normalized_windows_drive_letter(
                                 &self.serialization[path_start + 1..],
                             )
diff -Nru temporalio-1.3.0/vendor/url/src/path_segments.rs temporalio-1.3.0/vendor/url/src/path_segments.rs
--- temporalio-1.3.0/vendor/url/src/path_segments.rs	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/url/src/path_segments.rs	2023-10-30 19:40:00.000000000 +0000
@@ -237,7 +237,7 @@
                     scheme_type,
                     &mut has_host,
                     path_start,
-                    parser::Input::new_no_trim(segment),
+                    parser::Input::new(segment),
                 );
             }
         });
diff -Nru temporalio-1.3.0/vendor/url/src/quirks.rs temporalio-1.3.0/vendor/url/src/quirks.rs
--- temporalio-1.3.0/vendor/url/src/quirks.rs	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/url/src/quirks.rs	2023-10-30 19:40:00.000000000 +0000
@@ -152,7 +152,7 @@
     }
     // Host parsing rules are strict,
     // We don't want to trim the input
-    let input = Input::new_no_trim(new_host);
+    let input = Input::no_trim(new_host);
     let host;
     let opt_port;
     {
@@ -203,7 +203,7 @@
         return Err(());
     }
     // Host parsing rules are strict we don't want to trim the input
-    let input = Input::new_no_trim(new_hostname);
+    let input = Input::no_trim(new_hostname);
     let scheme_type = SchemeType::from(url.scheme());
     if scheme_type == SchemeType::File && new_hostname.is_empty() {
         url.set_host_internal(Host::Domain(String::new()), None);
@@ -249,7 +249,7 @@
             return Err(());
         }
         result = Parser::parse_port(
-            Input::new_no_trim(new_port),
+            Input::new(new_port),
             || default_port(scheme),
             Context::Setter,
         )
diff -Nru temporalio-1.3.0/vendor/url/tests/data.rs temporalio-1.3.0/vendor/url/tests/data.rs
--- temporalio-1.3.0/vendor/url/tests/data.rs	1970-01-01 00:00:00.000000000 +0000
+++ temporalio-1.3.0/vendor/url/tests/data.rs	2023-10-30 19:40:00.000000000 +0000
@@ -0,0 +1,260 @@
+// Copyright 2013-2014 The rust-url developers.
+//
+// Licensed under the Apache License, Version 2.0  or the MIT license
+// , at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+//! Data-driven tests
+
+use std::str::FromStr;
+
+use serde_json::Value;
+use url::{quirks, Url};
+
+#[test]
+fn urltestdata() {
+    // Copied from https://github.com/web-platform-tests/wpt/blob/master/url/
+    let mut json = Value::from_str(include_str!("urltestdata.json"))
+        .expect("JSON parse error in urltestdata.json");
+
+    let mut passed = true;
+    let mut skip_next = false;
+    for entry in json.as_array_mut().unwrap() {
+        if entry.is_string() {
+            if entry.as_str().unwrap() == "skip next" {
+                skip_next = true;
+            }
+            continue; // ignore comments
+        }
+
+        if skip_next {
+            skip_next = false;
+            continue;
+        }
+
+        let maybe_base = entry
+            .take_key("base")
+            .expect("missing base key")
+            .maybe_string();
+        let input = entry.take_string("input");
+        let failure = entry.take_key("failure").is_some();
+
+        let res = if let Some(base) = maybe_base {
+            let base = match Url::parse(&base) {
+                Ok(base) => base,
+                Err(_) if failure => continue,
+                Err(message) => {
+                    eprint_failure(
+                        format!("  failed: error parsing base {:?}: {}", base, message),
+                        &format!("parse base for {:?}", input),
+                        None,
+                    );
+                    passed = false;
+                    continue;
+                }
+            };
+            base.join(&input)
+        } else {
+            Url::parse(&input)
+        };
+
+        let url = match (res, failure) {
+            (Ok(url), false) => url,
+            (Err(_), true) => continue,
+            (Err(message), false) => {
+                eprint_failure(
+                    format!("  failed: {}", message),
+                    &format!("parse URL for {:?}", input),
+                    None,
+                );
+                passed = false;
+                continue;
+            }
+            (Ok(_), true) => {
+                eprint_failure(
+                    format!("  failed: expected parse error for URL {:?}", input),
+                    &format!("parse URL for {:?}", input),
+                    None,
+                );
+                passed = false;
+                continue;
+            }
+        };
+
+        passed &= check_invariants(&url, &format!("invariants for {:?}", input), None);
+
+        for &attr in ATTRIBS {
+            passed &= test_eq_eprint(
+                entry.take_string(attr),
+                get(&url, attr),
+                &format!("{:?} - {}", input, attr),
+                None,
+            );
+        }
+
+        if let Some(expected_origin) = entry.take_key("origin").map(|s| s.string()) {
+            passed &= test_eq_eprint(
+                expected_origin,
+                &quirks::origin(&url),
+                &format!("origin for {:?}", input),
+                None,
+            );
+        }
+    }
+
+    assert!(passed)
+}
+
+#[test]
+fn setters_tests() {
+    let mut json = Value::from_str(include_str!("setters_tests.json"))
+        .expect("JSON parse error in setters_tests.json");
+
+    let mut passed = true;
+    for &attr in ATTRIBS {
+        if attr == "href" {
+            continue;
+        }
+
+        let mut tests = json.take_key(attr).unwrap();
+        for mut test in tests.as_array_mut().unwrap().drain(..) {
+            let comment = test.take_key("comment").map(|s| s.string());
+            {
+                if let Some(comment) = comment.as_ref() {
+                    if comment.starts_with("IDNA Nontransitional_Processing") {
+                        continue;
+                    }
+                }
+            }
+            let href = test.take_string("href");
+            let new_value = test.take_string("new_value");
+            let name = format!("{:?}.{} = {:?}", href, attr, new_value);
+            let mut expected = test.take_key("expected").unwrap();
+
+            let mut url = Url::parse(&href).unwrap();
+            let comment_ref = comment.as_deref();
+            passed &= check_invariants(&url, &name, comment_ref);
+            set(&mut url, attr, &new_value);
+
+            for attr in ATTRIBS {
+                if let Some(value) = expected.take_key(attr) {
+                    passed &= test_eq_eprint(value.string(), get(&url, attr), &name, comment_ref);
+                };
+            }
+
+            passed &= check_invariants(&url, &name, comment_ref);
+        }
+    }
+
+    assert!(passed);
+}
+
+fn check_invariants(url: &Url, name: &str, comment: Option<&str>) -> bool {
+    let mut passed = true;
+    if let Err(e) = url.check_invariants() {
+        passed = false;
+        eprint_failure(
+            format!("  failed: invariants checked -> {:?}", e),
+            name,
+            comment,
+        );
+    }
+
+    #[cfg(feature = "serde")]
+    {
+        let bytes = serde_json::to_vec(url).unwrap();
+        let new_url: Url = serde_json::from_slice(&bytes).unwrap();
+        passed &= test_eq_eprint(url.to_string(), &new_url.to_string(), name, comment);
+    }
+
+    passed
+}
+
+trait JsonExt {
+    fn take_key(&mut self, key: &str) -> Option;
+    fn string(self) -> String;
+    fn maybe_string(self) -> Option;
+    fn take_string(&mut self, key: &str) -> String;
+}
+
+impl JsonExt for Value {
+    fn take_key(&mut self, key: &str) -> Option {
+        self.as_object_mut().unwrap().remove(key)
+    }
+
+    fn string(self) -> String {
+        self.maybe_string().expect("")
+    }
+
+    fn maybe_string(self) -> Option {
+        match self {
+            Value::String(s) => Some(s),
+            Value::Null => None,
+            _ => panic!("Not a Value::String or Value::Null"),
+        }
+    }
+
+    fn take_string(&mut self, key: &str) -> String {
+        self.take_key(key).unwrap().string()
+    }
+}
+
+fn get<'a>(url: &'a Url, attr: &str) -> &'a str {
+    match attr {
+        "href" => quirks::href(url),
+        "protocol" => quirks::protocol(url),
+        "username" => quirks::username(url),
+        "password" => quirks::password(url),
+        "hostname" => quirks::hostname(url),
+        "host" => quirks::host(url),
+        "port" => quirks::port(url),
+        "pathname" => quirks::pathname(url),
+        "search" => quirks::search(url),
+        "hash" => quirks::hash(url),
+        _ => unreachable!(),
+    }
+}
+
+#[allow(clippy::unit_arg)]
+fn set(url: &mut Url, attr: &str, new: &str) {
+    let _ = match attr {
+        "protocol" => quirks::set_protocol(url, new),
+        "username" => quirks::set_username(url, new),
+        "password" => quirks::set_password(url, new),
+        "hostname" => quirks::set_hostname(url, new),
+        "host" => quirks::set_host(url, new),
+        "port" => quirks::set_port(url, new),
+        "pathname" => Ok(quirks::set_pathname(url, new)),
+        "search" => Ok(quirks::set_search(url, new)),
+        "hash" => Ok(quirks::set_hash(url, new)),
+        _ => unreachable!(),
+    };
+}
+
+fn test_eq_eprint(expected: String, actual: &str, name: &str, comment: Option<&str>) -> bool {
+    if expected == actual {
+        return true;
+    }
+    eprint_failure(
+        format!("expected: {}\n  actual: {}", expected, actual),
+        name,
+        comment,
+    );
+    false
+}
+
+fn eprint_failure(err: String, name: &str, comment: Option<&str>) {
+    eprintln!("    test: {}\n{}", name, err);
+    if let Some(comment) = comment {
+        eprintln!("{}\n", comment);
+    } else {
+        eprintln!();
+    }
+}
+
+const ATTRIBS: &[&str] = &[
+    "href", "protocol", "username", "password", "host", "hostname", "port", "pathname", "search",
+    "hash",
+];
diff -Nru temporalio-1.3.0/vendor/url/tests/debugger_visualizer.rs temporalio-1.3.0/vendor/url/tests/debugger_visualizer.rs
--- temporalio-1.3.0/vendor/url/tests/debugger_visualizer.rs	1970-01-01 00:00:00.000000000 +0000
+++ temporalio-1.3.0/vendor/url/tests/debugger_visualizer.rs	2023-10-30 19:40:00.000000000 +0000
@@ -0,0 +1,102 @@
+use debugger_test::debugger_test;
+use url::Url;
+
+#[inline(never)]
+fn __break() {}
+
+#[debugger_test(
+    debugger = "cdb",
+    commands = "
+    .nvlist
+
+    dx base_url
+
+    dx url_with_non_special_scheme
+
+    dx url_with_user_pass_port_query_fragments
+
+    dx url_blob
+
+    dx url_with_base
+
+    dx url_with_base_replaced
+
+    dx url_with_comma",
+    expected_statements = r#"
+    pattern:debugger_visualizer-.*\.exe \(embedded NatVis ".*-[0-9]+\.natvis"\)
+
+    base_url         : "http://example.org/foo/bar" [Type: url::Url]
+    []     [Type: url::Url]
+    [scheme]         : "http"
+    [host]           : "example.org"
+    [path]           : "/foo/bar"
+
+    url_with_non_special_scheme : "non-special://test/x" [Type: url::Url]
+    []     [Type: url::Url]
+    [scheme]         : "non-special"
+    [host]           : "test"
+    [path]           : "/x"
+
+    url_with_user_pass_port_query_fragments : "http://user:pass@foo:21/bar;par?b#c" [Type: url::Url]
+    []     [Type: url::Url]
+    [scheme]         : "http"
+    [username]       : "user"
+    [host]           : "foo"
+    [port]           : 21
+    [path]           : "/bar;par"
+    [query]          : "b"
+    [fragment]       : "c"
+
+    url_blob         : "blob:https://example.com:443/" [Type: url::Url]
+    []     [Type: url::Url]
+    [scheme]         : "blob"
+    [path]           : "https://example.com:443/"
+
+    url_with_base    : "http://example.org/a%2fc" [Type: url::Url]
+    []     [Type: url::Url]
+    [scheme]         : "http"
+    [host]           : "example.org"
+    [path]           : "/a%2fc"
+
+    url_with_base_replaced : "http://[::7f00:1]/" [Type: url::Url]
+    []     [Type: url::Url]
+    [scheme]         : "http"
+    [host]           : "[::7f00:1]"
+    [path]           : "/"
+
+    url_with_comma   : "data:text/html,test#test" [Type: url::Url]
+    []     [Type: url::Url]
+    [scheme]         : "data"
+    [path]           : "text/html,test"
+    [fragment]       : "test"
+    "#
+)]
+fn test_url_visualizer() {
+    // Copied from https://github.com/web-platform-tests/wpt/blob/master/url/
+    let base_url = Url::parse("http://example.org/foo/bar").unwrap();
+    assert_eq!(base_url.as_str(), "http://example.org/foo/bar");
+
+    let url_with_non_special_scheme = Url::parse("non-special://:@test/x").unwrap();
+    assert_eq!(url_with_non_special_scheme.as_str(), "non-special://test/x");
+
+    let url_with_user_pass_port_query_fragments =
+        Url::parse("http://user:pass@foo:21/bar;par?b#c").unwrap();
+    assert_eq!(
+        url_with_user_pass_port_query_fragments.as_str(),
+        "http://user:pass@foo:21/bar;par?b#c"
+    );
+
+    let url_blob = Url::parse("blob:https://example.com:443/").unwrap();
+    assert_eq!(url_blob.as_str(), "blob:https://example.com:443/");
+
+    let url_with_base = base_url.join("/a%2fc").unwrap();
+    assert_eq!(url_with_base.as_str(), "http://example.org/a%2fc");
+
+    let url_with_base_replaced = base_url.join("http://[::127.0.0.1]").unwrap();
+    assert_eq!(url_with_base_replaced.as_str(), "http://[::7f00:1]/");
+
+    let url_with_comma = base_url.join("data:text/html,test#test").unwrap();
+    assert_eq!(url_with_comma.as_str(), "data:text/html,test#test");
+
+    __break();
+}
diff -Nru temporalio-1.3.0/vendor/url/tests/expected_failures.txt temporalio-1.3.0/vendor/url/tests/expected_failures.txt
--- temporalio-1.3.0/vendor/url/tests/expected_failures.txt	2023-10-30 19:40:00.000000000 +0000
+++ temporalio-1.3.0/vendor/url/tests/expected_failures.txt	1970-01-01 00:00:00.000000000 +0000
@@ -1,53 +0,0 @@
- against 
-
-
-
-
-
-
-
-
- against 
-<\\/localhost//pig> against 
- against 
- against 
- against 
- against 
- against 
- against 
- against 
- against 
- against 
- against 
-
-
-
- against 
- against 
- against 
- against 
-
-
-
- against 
- against 
- against 
-
-
- set hostname to 
- set hostname to 
- set hostname to 
- set hostname to <>
- set pathname to <>
- set pathname to <>
- set port to 
- set href to 
- set search to <>
- set search to <>
- set pathname to <\\\\>
- set pathname to 
- set pathname to 
- set pathname to 
- set pathname to 
- set pathname to 
- set pathname to 

\ No newline at end of file diff -Nru temporalio-1.3.0/vendor/url/tests/setters_tests.json temporalio-1.3.0/vendor/url/tests/setters_tests.json --- temporalio-1.3.0/vendor/url/tests/setters_tests.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/url/tests/setters_tests.json 2023-10-30 19:40:00.000000000 +0000 @@ -1,6 +1,6 @@ { "comment": [ - "# Pulled from https://github.com/web-platform-tests/wpt/blob/befe66343e5f21dc464c8c772c6d20695936714f/url/resources/setters_tests.json", + "AS OF https://github.com/jsdom/whatwg-url/commit/35f04dfd3048cf6362f4398745bb13375c5020c2", "## Tests for setters of https://url.spec.whatwg.org/#urlutils-members", "", "This file contains a JSON object.", @@ -120,11 +120,11 @@ } }, { - "href": "https://example.net:1234", + "href": "gopher://example.net:1234", "new_value": "file", "expected": { - "href": "https://example.net:1234/", - "protocol": "https:" + "href": "gopher://example.net:1234", + "protocol": "gopher:" } }, { @@ -146,7 +146,7 @@ }, { "href": "file:///test", - "new_value": "https", + "new_value": "gopher", "expected": { "href": "file:///test", "protocol": "file:" @@ -270,57 +270,6 @@ "protocol": "https:", "port": "" } - }, - { - "comment": "Tab and newline are stripped", - "href": "http://test/", - "new_value": "h\u000D\u000Att\u0009ps", - "expected": { - "href": "https://test/", - "protocol": "https:", - "port": "" - } - }, - { - "href": "http://test/", - "new_value": "https\u000D", - "expected": { - "href": "https://test/", - "protocol": "https:" - } - }, - { - "comment": "Non-tab/newline C0 controls result in no-op", - "href": "http://test/", - "new_value": "https\u0000", - "expected": { - "href": "http://test/", - "protocol": "http:" - } - }, - { - "href": "http://test/", - "new_value": "https\u000C", - "expected": { - "href": "http://test/", - "protocol": "http:" - } - }, - { - "href": "http://test/", - "new_value": "https\u000E", - "expected": { - "href": "http://test/", - "protocol": "http:" - } - }, - { - "href": "http://test/", - "new_value": "https\u0020", - "expected": { - "href": "http://test/", - "protocol": "http:" - } } ], "username": [ @@ -1014,16 +963,6 @@ } }, { - "href": "file://hi/x", - "new_value": "", - "expected": { - "href": "file:///x", - "host": "", - "hostname": "", - "port": "" - } - }, - { "href": "sc://test@test/", "new_value": "", "expected": { @@ -1042,62 +981,6 @@ "hostname": "test", "port": "12" } - }, - { - "comment": "Leading / is not stripped", - "href": "http://example.com/", - "new_value": "///bad.com", - "expected": { - "href": "http://example.com/", - "host": "example.com", - "hostname": "example.com" - } - }, - { - "comment": "Leading / is not stripped", - "href": "sc://example.com/", - "new_value": "///bad.com", - "expected": { - "href": "sc:///", - "host": "", - "hostname": "" - } - }, - { - "href": "https://example.com/", - "new_value": "a%C2%ADb", - "expected": { - "href": "https://ab/", - "host": "ab", - "hostname": "ab" - } - }, - { - "href": "https://example.com/", - "new_value": "\u00AD", - "expected": { - "href": "https://example.com/", - "host": "example.com", - "hostname": "example.com" - } - }, - { - "href": "https://example.com/", - "new_value": "%C2%AD", - "expected": { - "href": "https://example.com/", - "host": "example.com", - "hostname": "example.com" - } - }, - { - "href": "https://example.com/", - "new_value": "xn--", - "expected": { - "href": "https://example.com/", - "host": "example.com", - "hostname": "example.com" - } } ], "hostname": [ @@ -1261,24 +1144,24 @@ } }, { - "comment": ": delimiter invalidates entire value", + "comment": "Stuff after a : delimiter is ignored", "href": "http://example.net/path", "new_value": "example.com:8080", "expected": { - "href": "http://example.net/path", - "host": "example.net", - "hostname": "example.net", + "href": "http://example.com/path", + "host": "example.com", + "hostname": "example.com", "port": "" } }, { - "comment": ": delimiter invalidates entire value", + "comment": "Stuff after a : delimiter is ignored", "href": "http://example.net:8080/path", "new_value": "example.com:", "expected": { - "href": "http://example.net:8080/path", - "host": "example.net:8080", - "hostname": "example.net", + "href": "http://example.com:8080/path", + "host": "example.com:8080", + "hostname": "example.com", "port": "8080" } }, @@ -1404,16 +1287,6 @@ } }, { - "href": "file://hi/x", - "new_value": "", - "expected": { - "href": "file:///x", - "host": "", - "hostname": "", - "port": "" - } - }, - { "href": "sc://test@test/", "new_value": "", "expected": { @@ -1432,83 +1305,6 @@ "hostname": "test", "port": "12" } - }, - { - "comment": "Drop /. from path", - "href": "non-spec:/.//p", - "new_value": "h", - "expected": { - "href": "non-spec://h//p", - "host": "h", - "hostname": "h", - "pathname": "//p" - } - }, - { - "href": "non-spec:/.//p", - "new_value": "", - "expected": { - "href": "non-spec:////p", - "host": "", - "hostname": "", - "pathname": "//p" - } - }, - { - "comment": "Leading / is not stripped", - "href": "http://example.com/", - "new_value": "///bad.com", - "expected": { - "href": "http://example.com/", - "host": "example.com", - "hostname": "example.com" - } - }, - { - "comment": "Leading / is not stripped", - "href": "sc://example.com/", - "new_value": "///bad.com", - "expected": { - "href": "sc:///", - "host": "", - "hostname": "" - } - }, - { - "href": "https://example.com/", - "new_value": "a%C2%ADb", - "expected": { - "href": "https://ab/", - "host": "ab", - "hostname": "ab" - } - }, - { - "href": "https://example.com/", - "new_value": "\u00AD", - "expected": { - "href": "https://example.com/", - "host": "example.com", - "hostname": "example.com" - } - }, - { - "href": "https://example.com/", - "new_value": "%C2%AD", - "expected": { - "href": "https://example.com/", - "host": "example.com", - "hostname": "example.com" - } - }, - { - "href": "https://example.com/", - "new_value": "xn--", - "expected": { - "href": "https://example.com/", - "host": "example.com", - "hostname": "example.com" - } } ], "port": [ @@ -1666,17 +1462,6 @@ } }, { - "comment": "Setting port to a string that doesn't parse as a number", - "href": "http://example.net:8080/path", - "new_value": "randomstring", - "expected": { - "href": "http://example.net:8080/path", - "host": "example.net:8080", - "hostname": "example.net", - "port": "8080" - } - }, - { "comment": "Port numbers are 16 bit integers, overflowing is an error", "href": "non-special://example.net:8080/path", "new_value": "65536", @@ -1734,35 +1519,11 @@ "href": "javascript://x:12/", "port": "12" } - }, - { - "comment": "Leading u0009 on special scheme", - "href": "https://domain.com:443", - "new_value": "\u00098080", - "expected": { - "port": "8080" - } - }, - { - "comment": "Leading u0009 on non-special scheme", - "href": "wpt++://domain.com:443", - "new_value": "\u00098080", - "expected": { - "port": "8080" - } - }, - { - "comment": "Should use all ascii prefixed characters as port", - "href": "https://www.google.com:4343", - "new_value": "4wpt", - "expected": { - "port": "4" - } } ], "pathname": [ { - "comment": "Opaque paths cannot be set", + "comment": "Cannot-be-a-base don’t have a path", "href": "mailto:me@example.net", "new_value": "/foo", "expected": { @@ -1771,67 +1532,6 @@ } }, { - "href": "data:original", - "new_value": "new value", - "expected": { - "href": "data:original", - "pathname": "original" - } - }, - { - "href": "sc:original", - "new_value": "new value", - "expected": { - "href": "sc:original", - "pathname": "original" - } - }, - { - "comment": "Special URLs cannot have their paths erased", - "href": "file:///some/path", - "new_value": "", - "expected": { - "href": "file:///", - "pathname": "/" - } - }, - { - "comment": "Non-special URLs can have their paths erased", - "href": "foo://somehost/some/path", - "new_value": "", - "expected": { - "href": "foo://somehost", - "pathname": "" - } - }, - { - "comment": "Non-special URLs with an empty host can have their paths erased", - "href": "foo:///some/path", - "new_value": "", - "expected": { - "href": "foo://", - "pathname": "" - } - }, - { - "comment": "Path-only URLs cannot have their paths erased", - "href": "foo:/some/path", - "new_value": "", - "expected": { - "href": "foo:/", - "pathname": "/" - } - }, - { - "comment": "Path-only URLs always have an initial slash", - "href": "foo:/some/path", - "new_value": "test", - "expected": { - "href": "foo:/test", - "pathname": "/test" - } - }, - { "href": "unix:/run/foo.socket?timeout=10", "new_value": "/var/log/../run/bar.socket", "expected": { @@ -1928,30 +1628,12 @@ } }, { - "comment": "? doesn't mess up encoding", - "href": "http://example.net", - "new_value": "/?é", - "expected": { - "href": "http://example.net/%3F%C3%A9", - "pathname": "/%3F%C3%A9" - } - }, - { - "comment": "# doesn't mess up encoding", - "href": "http://example.net", - "new_value": "/#é", - "expected": { - "href": "http://example.net/%23%C3%A9", - "pathname": "/%23%C3%A9" - } - }, - { "comment": "File URLs and (back)slashes", "href": "file://monkey/", "new_value": "\\\\", "expected": { - "href": "file://monkey//", - "pathname": "//" + "href": "file://monkey/", + "pathname": "/" } }, { @@ -1959,8 +1641,8 @@ "href": "file:///unicorn", "new_value": "//\\/", "expected": { - "href": "file://////", - "pathname": "////" + "href": "file:///", + "pathname": "/" } }, { @@ -1968,77 +1650,8 @@ "href": "file:///unicorn", "new_value": "//monkey/..//", "expected": { - "href": "file://///", - "pathname": "///" - } - }, - { - "comment": "Serialize /. in path", - "href": "non-spec:/", - "new_value": "/.//p", - "expected": { - "href": "non-spec:/.//p", - "pathname": "//p" - } - }, - { - "href": "non-spec:/", - "new_value": "/..//p", - "expected": { - "href": "non-spec:/.//p", - "pathname": "//p" - } - }, - { - "href": "non-spec:/", - "new_value": "//p", - "expected": { - "href": "non-spec:/.//p", - "pathname": "//p" - } - }, - { - "comment": "Drop /. from path", - "href": "non-spec:/.//", - "new_value": "p", - "expected": { - "href": "non-spec:/p", - "pathname": "/p" - } - }, - { - "comment": "Non-special URLs with non-opaque paths percent-encode U+0020", - "href": "data:/nospace", - "new_value": "space ", - "expected": { - "href": "data:/space%20", - "pathname": "/space%20" - } - }, - { - "href": "sc:/nospace", - "new_value": "space ", - "expected": { - "href": "sc:/space%20", - "pathname": "/space%20" - } - }, - { - "comment": "Trailing space should be encoded", - "href": "http://example.net", - "new_value": " ", - "expected": { - "href": "http://example.net/%20", - "pathname": "/%20" - } - }, - { - "comment": "Trailing C0 control should be encoded", - "href": "http://example.net", - "new_value": "\u0000", - "expected": { - "href": "http://example.net/%00", - "pathname": "/%00" + "href": "file:///", + "pathname": "/" } } ], @@ -2124,60 +1737,6 @@ "href": "http://example.net/?%c3%89t%C3%A9", "search": "?%c3%89t%C3%A9" } - }, - { - "comment": "Drop trailing spaces from trailing opaque paths", - "href": "data:space ?query", - "new_value": "", - "expected": { - "href": "data:space", - "pathname": "space", - "search": "" - } - }, - { - "href": "sc:space ?query", - "new_value": "", - "expected": { - "href": "sc:space", - "pathname": "space", - "search": "" - } - }, - { - "comment": "Do not drop trailing spaces from non-trailing opaque paths", - "href": "data:space ?query#fragment", - "new_value": "", - "expected": { - "href": "data:space #fragment", - "search": "" - } - }, - { - "href": "sc:space ?query#fragment", - "new_value": "", - "expected": { - "href": "sc:space #fragment", - "search": "" - } - }, - { - "comment": "Trailing space should be encoded", - "href": "http://example.net", - "new_value": " ", - "expected": { - "href": "http://example.net/?%20", - "search": "?%20" - } - }, - { - "comment": "Trailing C0 control should be encoded", - "href": "http://example.net", - "new_value": "\u0000", - "expected": { - "href": "http://example.net/?%00", - "search": "?%00" - } } ], "hash": [ @@ -2312,70 +1871,6 @@ "href": "javascript:alert(1)#castle", "hash": "#castle" } - }, - { - "comment": "Drop trailing spaces from trailing opaque paths", - "href": "data:space #fragment", - "new_value": "", - "expected": { - "href": "data:space", - "pathname": "space", - "hash": "" - } - }, - { - "href": "sc:space #fragment", - "new_value": "", - "expected": { - "href": "sc:space", - "pathname": "space", - "hash": "" - } - }, - { - "comment": "Do not drop trailing spaces from non-trailing opaque paths", - "href": "data:space ?query#fragment", - "new_value": "", - "expected": { - "href": "data:space ?query", - "hash": "" - } - }, - { - "href": "sc:space ?query#fragment", - "new_value": "", - "expected": { - "href": "sc:space ?query", - "hash": "" - } - }, - { - "comment": "Trailing space should be encoded", - "href": "http://example.net", - "new_value": " ", - "expected": { - "href": "http://example.net/#%20", - "hash": "#%20" - } - }, - { - "comment": "Trailing C0 control should be encoded", - "href": "http://example.net", - "new_value": "\u0000", - "expected": { - "href": "http://example.net/#%00", - "hash": "#%00" - } - } - ], - "href": [ - { - "href": "file:///var/log/system.log", - "new_value": "http://0300.168.0xF0", - "expected": { - "href": "http://192.168.0.240/", - "protocol": "http:" - } } ] } diff -Nru temporalio-1.3.0/vendor/url/tests/unit.rs temporalio-1.3.0/vendor/url/tests/unit.rs --- temporalio-1.3.0/vendor/url/tests/unit.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/url/tests/unit.rs 2023-10-30 19:40:00.000000000 +0000 @@ -472,7 +472,7 @@ fn extend_query_pairs_then_mutate() { let mut url: Url = "http://localhost:6767/foo/bar".parse().unwrap(); url.query_pairs_mut() - .extend_pairs(vec![("auth", "my-token")]); + .extend_pairs(vec![("auth", "my-token")].into_iter()); url.check_invariants().unwrap(); assert_eq!( url.to_string(), @@ -1298,11 +1298,3 @@ let url2 = url::Url::join(&url, s2).unwrap(); assert_eq!(url2.to_string(), "file:///p:/a"); } - -#[test] -fn issue_864() { - let mut url = url::Url::parse("file://").unwrap(); - dbg!(&url); - url.set_path("x"); - dbg!(&url); -} diff -Nru temporalio-1.3.0/vendor/url/tests/urltestdata.json temporalio-1.3.0/vendor/url/tests/urltestdata.json --- temporalio-1.3.0/vendor/url/tests/urltestdata.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/url/tests/urltestdata.json 2023-10-30 19:40:00.000000000 +0000 @@ -1,5 +1,5 @@ [ - "# Pulled from https://github.com/web-platform-tests/wpt/blob/befe66343e5f21dc464c8c772c6d20695936714f/url/resources/urltestdata.json", + "# Based on http://trac.webkit.org/browser/trunk/LayoutTests/fast/url/script-tests/segments.js", { "input": "http://example\t.\norg", "base": "http://example.org/foo/bar", @@ -32,7 +32,7 @@ }, { "input": "https://test:@test", - "base": null, + "base": "about:blank", "href": "https://test@test/", "origin": "https://test", "protocol": "https:", @@ -47,7 +47,7 @@ }, { "input": "https://:@test", - "base": null, + "base": "about:blank", "href": "https://test/", "origin": "https://test", "protocol": "https:", @@ -62,7 +62,7 @@ }, { "input": "non-special://test:@test/x", - "base": null, + "base": "about:blank", "href": "non-special://test@test/x", "origin": "null", "protocol": "non-special:", @@ -77,7 +77,7 @@ }, { "input": "non-special://:@test/x", - "base": null, + "base": "about:blank", "href": "non-special://test/x", "origin": "null", "protocol": "non-special:", @@ -167,7 +167,7 @@ }, { "input": "lolscheme:x x#x x", - "base": null, + "base": "about:blank", "href": "lolscheme:x x#x%20x", "protocol": "lolscheme:", "username": "", @@ -1075,22 +1075,22 @@ }, { "input": "file://example:1/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "file://example:test/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "file://example%/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "file://[example]/", - "base": null, + "base": "about:blank", "failure": true }, { @@ -1754,7 +1754,7 @@ "# Based on http://trac.webkit.org/browser/trunk/LayoutTests/fast/url/script-tests/path.js", { "input": "http://example.com/././foo", - "base": null, + "base": "about:blank", "href": "http://example.com/foo", "origin": "http://example.com", "protocol": "http:", @@ -1769,7 +1769,7 @@ }, { "input": "http://example.com/./.foo", - "base": null, + "base": "about:blank", "href": "http://example.com/.foo", "origin": "http://example.com", "protocol": "http:", @@ -1784,7 +1784,7 @@ }, { "input": "http://example.com/foo/.", - "base": null, + "base": "about:blank", "href": "http://example.com/foo/", "origin": "http://example.com", "protocol": "http:", @@ -1799,7 +1799,7 @@ }, { "input": "http://example.com/foo/./", - "base": null, + "base": "about:blank", "href": "http://example.com/foo/", "origin": "http://example.com", "protocol": "http:", @@ -1814,7 +1814,7 @@ }, { "input": "http://example.com/foo/bar/..", - "base": null, + "base": "about:blank", "href": "http://example.com/foo/", "origin": "http://example.com", "protocol": "http:", @@ -1829,7 +1829,7 @@ }, { "input": "http://example.com/foo/bar/../", - "base": null, + "base": "about:blank", "href": "http://example.com/foo/", "origin": "http://example.com", "protocol": "http:", @@ -1844,7 +1844,7 @@ }, { "input": "http://example.com/foo/..bar", - "base": null, + "base": "about:blank", "href": "http://example.com/foo/..bar", "origin": "http://example.com", "protocol": "http:", @@ -1859,7 +1859,7 @@ }, { "input": "http://example.com/foo/bar/../ton", - "base": null, + "base": "about:blank", "href": "http://example.com/foo/ton", "origin": "http://example.com", "protocol": "http:", @@ -1874,7 +1874,7 @@ }, { "input": "http://example.com/foo/bar/../ton/../../a", - "base": null, + "base": "about:blank", "href": "http://example.com/a", "origin": "http://example.com", "protocol": "http:", @@ -1889,7 +1889,7 @@ }, { "input": "http://example.com/foo/../../..", - "base": null, + "base": "about:blank", "href": "http://example.com/", "origin": "http://example.com", "protocol": "http:", @@ -1904,7 +1904,7 @@ }, { "input": "http://example.com/foo/../../../ton", - "base": null, + "base": "about:blank", "href": "http://example.com/ton", "origin": "http://example.com", "protocol": "http:", @@ -1919,7 +1919,7 @@ }, { "input": "http://example.com/foo/%2e", - "base": null, + "base": "about:blank", "href": "http://example.com/foo/", "origin": "http://example.com", "protocol": "http:", @@ -1934,7 +1934,7 @@ }, { "input": "http://example.com/foo/%2e%2", - "base": null, + "base": "about:blank", "href": "http://example.com/foo/%2e%2", "origin": "http://example.com", "protocol": "http:", @@ -1949,7 +1949,7 @@ }, { "input": "http://example.com/foo/%2e./%2e%2e/.%2e/%2e.bar", - "base": null, + "base": "about:blank", "href": "http://example.com/%2e.bar", "origin": "http://example.com", "protocol": "http:", @@ -1964,7 +1964,7 @@ }, { "input": "http://example.com////../..", - "base": null, + "base": "about:blank", "href": "http://example.com//", "origin": "http://example.com", "protocol": "http:", @@ -1979,7 +1979,7 @@ }, { "input": "http://example.com/foo/bar//../..", - "base": null, + "base": "about:blank", "href": "http://example.com/foo/", "origin": "http://example.com", "protocol": "http:", @@ -1994,7 +1994,7 @@ }, { "input": "http://example.com/foo/bar//..", - "base": null, + "base": "about:blank", "href": "http://example.com/foo/bar/", "origin": "http://example.com", "protocol": "http:", @@ -2009,7 +2009,7 @@ }, { "input": "http://example.com/foo", - "base": null, + "base": "about:blank", "href": "http://example.com/foo", "origin": "http://example.com", "protocol": "http:", @@ -2024,7 +2024,7 @@ }, { "input": "http://example.com/%20foo", - "base": null, + "base": "about:blank", "href": "http://example.com/%20foo", "origin": "http://example.com", "protocol": "http:", @@ -2039,7 +2039,7 @@ }, { "input": "http://example.com/foo%", - "base": null, + "base": "about:blank", "href": "http://example.com/foo%", "origin": "http://example.com", "protocol": "http:", @@ -2054,7 +2054,7 @@ }, { "input": "http://example.com/foo%2", - "base": null, + "base": "about:blank", "href": "http://example.com/foo%2", "origin": "http://example.com", "protocol": "http:", @@ -2069,7 +2069,7 @@ }, { "input": "http://example.com/foo%2zbar", - "base": null, + "base": "about:blank", "href": "http://example.com/foo%2zbar", "origin": "http://example.com", "protocol": "http:", @@ -2084,7 +2084,7 @@ }, { "input": "http://example.com/foo%2©zbar", - "base": null, + "base": "about:blank", "href": "http://example.com/foo%2%C3%82%C2%A9zbar", "origin": "http://example.com", "protocol": "http:", @@ -2099,7 +2099,7 @@ }, { "input": "http://example.com/foo%41%7a", - "base": null, + "base": "about:blank", "href": "http://example.com/foo%41%7a", "origin": "http://example.com", "protocol": "http:", @@ -2114,7 +2114,7 @@ }, { "input": "http://example.com/foo\t\u0091%91", - "base": null, + "base": "about:blank", "href": "http://example.com/foo%C2%91%91", "origin": "http://example.com", "protocol": "http:", @@ -2129,7 +2129,7 @@ }, { "input": "http://example.com/foo%00%51", - "base": null, + "base": "about:blank", "href": "http://example.com/foo%00%51", "origin": "http://example.com", "protocol": "http:", @@ -2144,7 +2144,7 @@ }, { "input": "http://example.com/(%28:%3A%29)", - "base": null, + "base": "about:blank", "href": "http://example.com/(%28:%3A%29)", "origin": "http://example.com", "protocol": "http:", @@ -2159,7 +2159,7 @@ }, { "input": "http://example.com/%3A%3a%3C%3c", - "base": null, + "base": "about:blank", "href": "http://example.com/%3A%3a%3C%3c", "origin": "http://example.com", "protocol": "http:", @@ -2174,7 +2174,7 @@ }, { "input": "http://example.com/foo\tbar", - "base": null, + "base": "about:blank", "href": "http://example.com/foobar", "origin": "http://example.com", "protocol": "http:", @@ -2189,7 +2189,7 @@ }, { "input": "http://example.com\\\\foo\\\\bar", - "base": null, + "base": "about:blank", "href": "http://example.com//foo//bar", "origin": "http://example.com", "protocol": "http:", @@ -2204,7 +2204,7 @@ }, { "input": "http://example.com/%7Ffp3%3Eju%3Dduvgw%3Dd", - "base": null, + "base": "about:blank", "href": "http://example.com/%7Ffp3%3Eju%3Dduvgw%3Dd", "origin": "http://example.com", "protocol": "http:", @@ -2219,7 +2219,7 @@ }, { "input": "http://example.com/@asdf%40", - "base": null, + "base": "about:blank", "href": "http://example.com/@asdf%40", "origin": "http://example.com", "protocol": "http:", @@ -2234,7 +2234,7 @@ }, { "input": "http://example.com/你好你好", - "base": null, + "base": "about:blank", "href": "http://example.com/%E4%BD%A0%E5%A5%BD%E4%BD%A0%E5%A5%BD", "origin": "http://example.com", "protocol": "http:", @@ -2249,7 +2249,7 @@ }, { "input": "http://example.com/‥/foo", - "base": null, + "base": "about:blank", "href": "http://example.com/%E2%80%A5/foo", "origin": "http://example.com", "protocol": "http:", @@ -2264,7 +2264,7 @@ }, { "input": "http://example.com//foo", - "base": null, + "base": "about:blank", "href": "http://example.com/%EF%BB%BF/foo", "origin": "http://example.com", "protocol": "http:", @@ -2279,7 +2279,7 @@ }, { "input": "http://example.com/‮/foo/‭/bar", - "base": null, + "base": "about:blank", "href": "http://example.com/%E2%80%AE/foo/%E2%80%AD/bar", "origin": "http://example.com", "protocol": "http:", @@ -2295,7 +2295,7 @@ "# Based on http://trac.webkit.org/browser/trunk/LayoutTests/fast/url/script-tests/relative.js", { "input": "http://www.google.com/foo?bar=baz#", - "base": null, + "base": "about:blank", "href": "http://www.google.com/foo?bar=baz#", "origin": "http://www.google.com", "protocol": "http:", @@ -2310,7 +2310,7 @@ }, { "input": "http://www.google.com/foo?bar=baz# »", - "base": null, + "base": "about:blank", "href": "http://www.google.com/foo?bar=baz#%20%C2%BB", "origin": "http://www.google.com", "protocol": "http:", @@ -2325,7 +2325,7 @@ }, { "input": "data:test# »", - "base": null, + "base": "about:blank", "href": "data:test#%20%C2%BB", "origin": "null", "protocol": "data:", @@ -2340,7 +2340,7 @@ }, { "input": "http://www.google.com", - "base": null, + "base": "about:blank", "href": "http://www.google.com/", "origin": "http://www.google.com", "protocol": "http:", @@ -2355,7 +2355,7 @@ }, { "input": "http://192.0x00A80001", - "base": null, + "base": "about:blank", "href": "http://192.168.0.1/", "origin": "http://192.168.0.1", "protocol": "http:", @@ -2370,7 +2370,7 @@ }, { "input": "http://www/foo%2Ehtml", - "base": null, + "base": "about:blank", "href": "http://www/foo%2Ehtml", "origin": "http://www", "protocol": "http:", @@ -2385,7 +2385,7 @@ }, { "input": "http://www/foo/%2E/html", - "base": null, + "base": "about:blank", "href": "http://www/foo/html", "origin": "http://www", "protocol": "http:", @@ -2400,12 +2400,12 @@ }, { "input": "http://user:pass@/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://%25DOMAIN:foobar@foodomain.com/", - "base": null, + "base": "about:blank", "href": "http://%25DOMAIN:foobar@foodomain.com/", "origin": "http://foodomain.com", "protocol": "http:", @@ -2420,7 +2420,7 @@ }, { "input": "http:\\\\www.google.com\\foo", - "base": null, + "base": "about:blank", "href": "http://www.google.com/foo", "origin": "http://www.google.com", "protocol": "http:", @@ -2435,7 +2435,7 @@ }, { "input": "http://foo:80/", - "base": null, + "base": "about:blank", "href": "http://foo/", "origin": "http://foo", "protocol": "http:", @@ -2450,7 +2450,7 @@ }, { "input": "http://foo:81/", - "base": null, + "base": "about:blank", "href": "http://foo:81/", "origin": "http://foo:81", "protocol": "http:", @@ -2465,7 +2465,7 @@ }, { "input": "httpa://foo:80/", - "base": null, + "base": "about:blank", "href": "httpa://foo:80/", "origin": "null", "protocol": "httpa:", @@ -2480,12 +2480,12 @@ }, { "input": "http://foo:-80/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "https://foo:443/", - "base": null, + "base": "about:blank", "href": "https://foo/", "origin": "https://foo", "protocol": "https:", @@ -2500,7 +2500,7 @@ }, { "input": "https://foo:80/", - "base": null, + "base": "about:blank", "href": "https://foo:80/", "origin": "https://foo:80", "protocol": "https:", @@ -2515,7 +2515,7 @@ }, { "input": "ftp://foo:21/", - "base": null, + "base": "about:blank", "href": "ftp://foo/", "origin": "ftp://foo", "protocol": "ftp:", @@ -2530,7 +2530,7 @@ }, { "input": "ftp://foo:80/", - "base": null, + "base": "about:blank", "href": "ftp://foo:80/", "origin": "ftp://foo:80", "protocol": "ftp:", @@ -2545,7 +2545,7 @@ }, { "input": "gopher://foo:70/", - "base": null, + "base": "about:blank", "href": "gopher://foo:70/", "origin": "null", "protocol": "gopher:", @@ -2560,7 +2560,7 @@ }, { "input": "gopher://foo:443/", - "base": null, + "base": "about:blank", "href": "gopher://foo:443/", "origin": "null", "protocol": "gopher:", @@ -2575,7 +2575,7 @@ }, { "input": "ws://foo:80/", - "base": null, + "base": "about:blank", "href": "ws://foo/", "origin": "ws://foo", "protocol": "ws:", @@ -2590,7 +2590,7 @@ }, { "input": "ws://foo:81/", - "base": null, + "base": "about:blank", "href": "ws://foo:81/", "origin": "ws://foo:81", "protocol": "ws:", @@ -2605,7 +2605,7 @@ }, { "input": "ws://foo:443/", - "base": null, + "base": "about:blank", "href": "ws://foo:443/", "origin": "ws://foo:443", "protocol": "ws:", @@ -2620,7 +2620,7 @@ }, { "input": "ws://foo:815/", - "base": null, + "base": "about:blank", "href": "ws://foo:815/", "origin": "ws://foo:815", "protocol": "ws:", @@ -2635,7 +2635,7 @@ }, { "input": "wss://foo:80/", - "base": null, + "base": "about:blank", "href": "wss://foo:80/", "origin": "wss://foo:80", "protocol": "wss:", @@ -2650,7 +2650,7 @@ }, { "input": "wss://foo:81/", - "base": null, + "base": "about:blank", "href": "wss://foo:81/", "origin": "wss://foo:81", "protocol": "wss:", @@ -2665,7 +2665,7 @@ }, { "input": "wss://foo:443/", - "base": null, + "base": "about:blank", "href": "wss://foo/", "origin": "wss://foo", "protocol": "wss:", @@ -2680,7 +2680,7 @@ }, { "input": "wss://foo:815/", - "base": null, + "base": "about:blank", "href": "wss://foo:815/", "origin": "wss://foo:815", "protocol": "wss:", @@ -2695,7 +2695,7 @@ }, { "input": "http:/example.com/", - "base": null, + "base": "about:blank", "href": "http://example.com/", "origin": "http://example.com", "protocol": "http:", @@ -2710,7 +2710,7 @@ }, { "input": "ftp:/example.com/", - "base": null, + "base": "about:blank", "href": "ftp://example.com/", "origin": "ftp://example.com", "protocol": "ftp:", @@ -2725,7 +2725,7 @@ }, { "input": "https:/example.com/", - "base": null, + "base": "about:blank", "href": "https://example.com/", "origin": "https://example.com", "protocol": "https:", @@ -2740,7 +2740,7 @@ }, { "input": "madeupscheme:/example.com/", - "base": null, + "base": "about:blank", "href": "madeupscheme:/example.com/", "origin": "null", "protocol": "madeupscheme:", @@ -2755,7 +2755,7 @@ }, { "input": "file:/example.com/", - "base": null, + "base": "about:blank", "href": "file:///example.com/", "protocol": "file:", "username": "", @@ -2769,7 +2769,7 @@ }, { "input": "ftps:/example.com/", - "base": null, + "base": "about:blank", "href": "ftps:/example.com/", "origin": "null", "protocol": "ftps:", @@ -2784,7 +2784,7 @@ }, { "input": "gopher:/example.com/", - "base": null, + "base": "about:blank", "href": "gopher:/example.com/", "origin": "null", "protocol": "gopher:", @@ -2799,7 +2799,7 @@ }, { "input": "ws:/example.com/", - "base": null, + "base": "about:blank", "href": "ws://example.com/", "origin": "ws://example.com", "protocol": "ws:", @@ -2814,7 +2814,7 @@ }, { "input": "wss:/example.com/", - "base": null, + "base": "about:blank", "href": "wss://example.com/", "origin": "wss://example.com", "protocol": "wss:", @@ -2829,7 +2829,7 @@ }, { "input": "data:/example.com/", - "base": null, + "base": "about:blank", "href": "data:/example.com/", "origin": "null", "protocol": "data:", @@ -2844,7 +2844,7 @@ }, { "input": "javascript:/example.com/", - "base": null, + "base": "about:blank", "href": "javascript:/example.com/", "origin": "null", "protocol": "javascript:", @@ -2859,7 +2859,7 @@ }, { "input": "mailto:/example.com/", - "base": null, + "base": "about:blank", "href": "mailto:/example.com/", "origin": "null", "protocol": "mailto:", @@ -2874,7 +2874,7 @@ }, { "input": "http:example.com/", - "base": null, + "base": "about:blank", "href": "http://example.com/", "origin": "http://example.com", "protocol": "http:", @@ -2889,7 +2889,7 @@ }, { "input": "ftp:example.com/", - "base": null, + "base": "about:blank", "href": "ftp://example.com/", "origin": "ftp://example.com", "protocol": "ftp:", @@ -2904,7 +2904,7 @@ }, { "input": "https:example.com/", - "base": null, + "base": "about:blank", "href": "https://example.com/", "origin": "https://example.com", "protocol": "https:", @@ -2919,7 +2919,7 @@ }, { "input": "madeupscheme:example.com/", - "base": null, + "base": "about:blank", "href": "madeupscheme:example.com/", "origin": "null", "protocol": "madeupscheme:", @@ -2934,7 +2934,7 @@ }, { "input": "ftps:example.com/", - "base": null, + "base": "about:blank", "href": "ftps:example.com/", "origin": "null", "protocol": "ftps:", @@ -2949,7 +2949,7 @@ }, { "input": "gopher:example.com/", - "base": null, + "base": "about:blank", "href": "gopher:example.com/", "origin": "null", "protocol": "gopher:", @@ -2964,7 +2964,7 @@ }, { "input": "ws:example.com/", - "base": null, + "base": "about:blank", "href": "ws://example.com/", "origin": "ws://example.com", "protocol": "ws:", @@ -2979,7 +2979,7 @@ }, { "input": "wss:example.com/", - "base": null, + "base": "about:blank", "href": "wss://example.com/", "origin": "wss://example.com", "protocol": "wss:", @@ -2994,7 +2994,7 @@ }, { "input": "data:example.com/", - "base": null, + "base": "about:blank", "href": "data:example.com/", "origin": "null", "protocol": "data:", @@ -3009,7 +3009,7 @@ }, { "input": "javascript:example.com/", - "base": null, + "base": "about:blank", "href": "javascript:example.com/", "origin": "null", "protocol": "javascript:", @@ -3024,7 +3024,7 @@ }, { "input": "mailto:example.com/", - "base": null, + "base": "about:blank", "href": "mailto:example.com/", "origin": "null", "protocol": "mailto:", @@ -3040,7 +3040,7 @@ "# Based on http://trac.webkit.org/browser/trunk/LayoutTests/fast/url/segments-userinfo-vs-host.html", { "input": "http:@www.example.com", - "base": null, + "base": "about:blank", "href": "http://www.example.com/", "origin": "http://www.example.com", "protocol": "http:", @@ -3055,7 +3055,7 @@ }, { "input": "http:/@www.example.com", - "base": null, + "base": "about:blank", "href": "http://www.example.com/", "origin": "http://www.example.com", "protocol": "http:", @@ -3070,7 +3070,7 @@ }, { "input": "http://@www.example.com", - "base": null, + "base": "about:blank", "href": "http://www.example.com/", "origin": "http://www.example.com", "protocol": "http:", @@ -3085,7 +3085,7 @@ }, { "input": "http:a:b@www.example.com", - "base": null, + "base": "about:blank", "href": "http://a:b@www.example.com/", "origin": "http://www.example.com", "protocol": "http:", @@ -3100,7 +3100,7 @@ }, { "input": "http:/a:b@www.example.com", - "base": null, + "base": "about:blank", "href": "http://a:b@www.example.com/", "origin": "http://www.example.com", "protocol": "http:", @@ -3115,7 +3115,7 @@ }, { "input": "http://a:b@www.example.com", - "base": null, + "base": "about:blank", "href": "http://a:b@www.example.com/", "origin": "http://www.example.com", "protocol": "http:", @@ -3130,7 +3130,7 @@ }, { "input": "http://@pple.com", - "base": null, + "base": "about:blank", "href": "http://pple.com/", "origin": "http://pple.com", "protocol": "http:", @@ -3145,7 +3145,7 @@ }, { "input": "http::b@www.example.com", - "base": null, + "base": "about:blank", "href": "http://:b@www.example.com/", "origin": "http://www.example.com", "protocol": "http:", @@ -3160,7 +3160,7 @@ }, { "input": "http:/:b@www.example.com", - "base": null, + "base": "about:blank", "href": "http://:b@www.example.com/", "origin": "http://www.example.com", "protocol": "http:", @@ -3175,7 +3175,7 @@ }, { "input": "http://:b@www.example.com", - "base": null, + "base": "about:blank", "href": "http://:b@www.example.com/", "origin": "http://www.example.com", "protocol": "http:", @@ -3190,64 +3190,64 @@ }, { "input": "http:/:@/www.example.com", - "base": null, + "base": "about:blank", "failure": true, - "relativeTo": "non-opaque-path-base" + "inputCanBeRelative": true }, { "input": "http://user@/www.example.com", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http:@/www.example.com", - "base": null, + "base": "about:blank", "failure": true, - "relativeTo": "non-opaque-path-base" + "inputCanBeRelative": true }, { "input": "http:/@/www.example.com", - "base": null, + "base": "about:blank", "failure": true, - "relativeTo": "non-opaque-path-base" + "inputCanBeRelative": true }, { "input": "http://@/www.example.com", - "base": null, + "base": "about:blank", "failure": true }, { "input": "https:@/www.example.com", - "base": null, + "base": "about:blank", "failure": true, - "relativeTo": "non-opaque-path-base" + "inputCanBeRelative": true }, { "input": "http:a:b@/www.example.com", - "base": null, + "base": "about:blank", "failure": true, - "relativeTo": "non-opaque-path-base" + "inputCanBeRelative": true }, { "input": "http:/a:b@/www.example.com", - "base": null, + "base": "about:blank", "failure": true, - "relativeTo": "non-opaque-path-base" + "inputCanBeRelative": true }, { "input": "http://a:b@/www.example.com", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http::@/www.example.com", - "base": null, + "base": "about:blank", "failure": true, - "relativeTo": "non-opaque-path-base" + "inputCanBeRelative": true }, { "input": "http:a:@www.example.com", - "base": null, + "base": "about:blank", "href": "http://a@www.example.com/", "origin": "http://www.example.com", "protocol": "http:", @@ -3262,7 +3262,7 @@ }, { "input": "http:/a:@www.example.com", - "base": null, + "base": "about:blank", "href": "http://a@www.example.com/", "origin": "http://www.example.com", "protocol": "http:", @@ -3277,7 +3277,7 @@ }, { "input": "http://a:@www.example.com", - "base": null, + "base": "about:blank", "href": "http://a@www.example.com/", "origin": "http://www.example.com", "protocol": "http:", @@ -3292,7 +3292,7 @@ }, { "input": "http://www.@pple.com", - "base": null, + "base": "about:blank", "href": "http://www.@pple.com/", "origin": "http://pple.com", "protocol": "http:", @@ -3307,24 +3307,24 @@ }, { "input": "http:@:www.example.com", - "base": null, + "base": "about:blank", "failure": true, - "relativeTo": "non-opaque-path-base" + "inputCanBeRelative": true }, { "input": "http:/@:www.example.com", - "base": null, + "base": "about:blank", "failure": true, - "relativeTo": "non-opaque-path-base" + "inputCanBeRelative": true }, { "input": "http://@:www.example.com", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://:@www.example.com", - "base": null, + "base": "about:blank", "href": "http://www.example.com/", "origin": "http://www.example.com", "protocol": "http:", @@ -3622,7 +3622,7 @@ "Leading and trailing C0 control or space", { "input": "\u0000\u001b\u0004\u0012 http://example.com/\u001f \u000d ", - "base": null, + "base": "about:blank", "href": "http://example.com/", "origin": "http://example.com", "protocol": "http:", @@ -3666,17 +3666,17 @@ "U+FFFD", { "input": "https://\ufffd", - "base": null, + "base": "about:blank", "failure": true }, { "input": "https://%EF%BF%BD", - "base": null, + "base": "about:blank", "failure": true }, { "input": "https://x/\ufffd?\ufffd#\ufffd", - "base": null, + "base": "about:blank", "href": "https://x/%EF%BF%BD?%EF%BF%BD#%EF%BF%BD", "origin": "https://x", "protocol": "https:", @@ -3692,33 +3692,33 @@ "Domain is ASCII, but a label is invalid IDNA", { "input": "http://a.b.c.xn--pokxncvks", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://10.0.0.xn--pokxncvks", - "base": null, + "base": "about:blank", "failure": true }, "IDNA labels should be matched case-insensitively", { "input": "http://a.b.c.XN--pokxncvks", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://a.b.c.Xn--pokxncvks", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://10.0.0.XN--pokxncvks", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://10.0.0.xN--pokxncvks", - "base": null, + "base": "about:blank", "failure": true }, "Test name prepping, fullwidth input should be converted to ASCII and NOT IDN-ized. This is 'Go' in fullwidth UTF-8/UTF-16.", @@ -3777,7 +3777,7 @@ }, { "input": "https://faß.ExAmPlE/", - "base": null, + "base": "about:blank", "href": "https://xn--fa-hia.example/", "origin": "https://xn--fa-hia.example", "protocol": "https:", @@ -3792,7 +3792,7 @@ }, { "input": "sc://faß.ExAmPlE/", - "base": null, + "base": "about:blank", "href": "sc://fa%C3%9F.ExAmPlE/", "origin": "null", "protocol": "sc:", @@ -3872,7 +3872,7 @@ }, { "input": "https://x x:12", - "base": null, + "base": "about:blank", "failure": true }, "Fullwidth and escaped UTF-8 fullwidth should still be treated as IP", @@ -3894,7 +3894,7 @@ "Domains with empty labels", { "input": "http://./", - "base": null, + "base": "about:blank", "href": "http://./", "origin": "http://.", "protocol": "http:", @@ -3909,7 +3909,7 @@ }, { "input": "http://../", - "base": null, + "base": "about:blank", "href": "http://../", "origin": "http://..", "protocol": "http:", @@ -3925,7 +3925,7 @@ "Non-special domains with empty labels", { "input": "h://.", - "base": null, + "base": "about:blank", "href": "h://.", "origin": "null", "protocol": "h:", @@ -3941,7 +3941,7 @@ "Broken IPv6", { "input": "http://[www.google.com]/", - "base": null, + "base": "about:blank", "failure": true }, { @@ -4067,21 +4067,6 @@ "hash": "#x" }, { - "input": "#x:y", - "base": "about:blank", - "href": "about:blank#x:y", - "origin": "null", - "protocol": "about:", - "username": "", - "password": "", - "host": "", - "hostname": "", - "port": "", - "pathname": "blank", - "search": "", - "hash": "#x:y" - }, - { "input": "#", "base": "test:test?test", "href": "test:test?test#", @@ -4146,7 +4131,7 @@ "byte is ' and url is special", { "input": "http://host/?'", - "base": null, + "base": "about:blank", "href": "http://host/?%27", "origin": "http://host", "protocol": "http:", @@ -4161,7 +4146,7 @@ }, { "input": "notspecial://host/?'", - "base": null, + "base": "about:blank", "href": "notspecial://host/?'", "origin": "null", "protocol": "notspecial:", @@ -4519,7 +4504,7 @@ "# make sure that relative URL logic works on known typically non-relative schemes too", { "input": "about:/../", - "base": null, + "base": "about:blank", "href": "about:/", "origin": "null", "protocol": "about:", @@ -4534,7 +4519,7 @@ }, { "input": "data:/../", - "base": null, + "base": "about:blank", "href": "data:/", "origin": "null", "protocol": "data:", @@ -4549,7 +4534,7 @@ }, { "input": "javascript:/../", - "base": null, + "base": "about:blank", "href": "javascript:/", "origin": "null", "protocol": "javascript:", @@ -4564,7 +4549,7 @@ }, { "input": "mailto:/../", - "base": null, + "base": "about:blank", "href": "mailto:/", "origin": "null", "protocol": "mailto:", @@ -4580,7 +4565,7 @@ "# unknown schemes and their hosts", { "input": "sc://ñ.test/", - "base": null, + "base": "about:blank", "href": "sc://%C3%B1.test/", "origin": "null", "protocol": "sc:", @@ -4595,7 +4580,7 @@ }, { "input": "sc://%/", - "base": null, + "base": "about:blank", "href": "sc://%/", "protocol": "sc:", "username": "", @@ -4609,22 +4594,22 @@ }, { "input": "sc://@/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "sc://te@s:t@/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "sc://:/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "sc://:12/", - "base": null, + "base": "about:blank", "failure": true }, { @@ -4645,7 +4630,7 @@ "# unknown schemes and backslashes", { "input": "sc:\\../", - "base": null, + "base": "about:blank", "href": "sc:\\../", "origin": "null", "protocol": "sc:", @@ -4661,7 +4646,7 @@ "# unknown scheme with path looking like a password", { "input": "sc::a@example.net", - "base": null, + "base": "about:blank", "href": "sc::a@example.net", "origin": "null", "protocol": "sc:", @@ -4677,7 +4662,7 @@ "# unknown scheme with bogus percent-encoding", { "input": "wow:%NBD", - "base": null, + "base": "about:blank", "href": "wow:%NBD", "origin": "null", "protocol": "wow:", @@ -4692,7 +4677,7 @@ }, { "input": "wow:%1G", - "base": null, + "base": "about:blank", "href": "wow:%1G", "origin": "null", "protocol": "wow:", @@ -4708,7 +4693,7 @@ "# unknown scheme with non-URL characters", { "input": "wow:\uFFFF", - "base": null, + "base": "about:blank", "href": "wow:%EF%BF%BF", "origin": "null", "protocol": "wow:", @@ -4724,53 +4709,53 @@ "Forbidden host code points", { "input": "sc://a\u0000b/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "sc://a b/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "sc://ab", - "base": null, + "base": "about:blank", "failure": true }, { "input": "sc://a[b/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "sc://a\\b/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "sc://a]b/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "sc://a^b", - "base": null, + "base": "about:blank", "failure": true }, { "input": "sc://a|b/", - "base": null, + "base": "about:blank", "failure": true }, "Forbidden host codepoints: tabs and newlines are removed during preprocessing", { "input": "foo://ho\u0009st/", - "base": null, + "base": "about:blank", "hash": "", "host": "host", "hostname": "host", @@ -4784,7 +4769,7 @@ }, { "input": "foo://ho\u000Ast/", - "base": null, + "base": "about:blank", "hash": "", "host": "host", "hostname": "host", @@ -4798,7 +4783,7 @@ }, { "input": "foo://ho\u000Dst/", - "base": null, + "base": "about:blank", "hash": "", "host": "host", "hostname": "host", @@ -4813,198 +4798,198 @@ "Forbidden domain code-points", { "input": "http://a\u0000b/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://a\u0001b/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://a\u0002b/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://a\u0003b/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://a\u0004b/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://a\u0005b/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://a\u0006b/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://a\u0007b/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://a\u0008b/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://a\u000Bb/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://a\u000Cb/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://a\u000Eb/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://a\u000Fb/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://a\u0010b/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://a\u0011b/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://a\u0012b/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://a\u0013b/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://a\u0014b/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://a\u0015b/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://a\u0016b/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://a\u0017b/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://a\u0018b/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://a\u0019b/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://a\u001Ab/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://a\u001Bb/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://a\u001Cb/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://a\u001Db/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://a\u001Eb/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://a\u001Fb/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://a b/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://a%b/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://ab", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://a[b/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://a]b/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://a^b", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://a|b/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://a\u007Fb/", - "base": null, + "base": "about:blank", "failure": true }, "Forbidden domain codepoints: tabs and newlines are removed during preprocessing", { "input": "http://ho\u0009st/", - "base": null, + "base": "about:blank", "hash": "", "host": "host", "hostname": "host", @@ -5018,7 +5003,7 @@ }, { "input": "http://ho\u000Ast/", - "base": null, + "base": "about:blank", "hash": "", "host": "host", "hostname": "host", @@ -5032,7 +5017,7 @@ }, { "input": "http://ho\u000Dst/", - "base": null, + "base": "about:blank", "hash": "", "host": "host", "hostname": "host", @@ -5047,238 +5032,238 @@ "Encoded forbidden domain codepoints in special URLs", { "input": "http://ho%00st/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://ho%01st/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://ho%02st/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://ho%03st/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://ho%04st/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://ho%05st/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://ho%06st/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://ho%07st/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://ho%08st/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://ho%09st/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://ho%0Ast/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://ho%0Bst/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://ho%0Cst/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://ho%0Dst/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://ho%0Est/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://ho%0Fst/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://ho%10st/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://ho%11st/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://ho%12st/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://ho%13st/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://ho%14st/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://ho%15st/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://ho%16st/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://ho%17st/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://ho%18st/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://ho%19st/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://ho%1Ast/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://ho%1Bst/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://ho%1Cst/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://ho%1Dst/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://ho%1Est/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://ho%1Fst/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://ho%20st/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://ho%23st/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://ho%25st/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://ho%2Fst/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://ho%3Ast/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://ho%3Cst/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://ho%3Est/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://ho%3Fst/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://ho%40st/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://ho%5Bst/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://ho%5Cst/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://ho%5Dst/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://ho%7Cst/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://ho%7Fst/", - "base": null, + "base": "about:blank", "failure": true }, "Allowed host/domain code points", { "input": "http://!\"$&'()*+,-.;=_`{}~/", - "base": null, + "base": "about:blank", "href": "http://!\"$&'()*+,-.;=_`{}~/", "origin": "http://!\"$&'()*+,-.;=_`{}~", "protocol": "http:", @@ -5293,7 +5278,7 @@ }, { "input": "sc://\u0001\u0002\u0003\u0004\u0005\u0006\u0007\u0008\u000B\u000C\u000E\u000F\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001A\u001B\u001C\u001D\u001E\u001F\u007F!\"$%&'()*+,-.;=_`{}~/", - "base": null, + "base": "about:blank", "href": "sc://%01%02%03%04%05%06%07%08%0B%0C%0E%0F%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F%7F!\"$%&'()*+,-.;=_`{}~/", "origin": "null", "protocol": "sc:", @@ -5309,27 +5294,27 @@ "# Hosts and percent-encoding", { "input": "ftp://example.com%80/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "ftp://example.com%A0/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "https://example.com%80/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "https://example.com%A0/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "ftp://%e2%98%83", - "base": null, + "base": "about:blank", "href": "ftp://xn--n3h/", "origin": "ftp://xn--n3h", "protocol": "ftp:", @@ -5344,7 +5329,7 @@ }, { "input": "https://%e2%98%83", - "base": null, + "base": "about:blank", "href": "https://xn--n3h/", "origin": "https://xn--n3h", "protocol": "https:", @@ -5360,7 +5345,7 @@ "# tests from jsdom/whatwg-url designed for code coverage", { "input": "http://127.0.0.1:10100/relative_import.html", - "base": null, + "base": "about:blank", "href": "http://127.0.0.1:10100/relative_import.html", "origin": "http://127.0.0.1:10100", "protocol": "http:", @@ -5375,7 +5360,7 @@ }, { "input": "http://facebook.com/?foo=%7B%22abc%22", - "base": null, + "base": "about:blank", "href": "http://facebook.com/?foo=%7B%22abc%22", "origin": "http://facebook.com", "protocol": "http:", @@ -5390,7 +5375,7 @@ }, { "input": "https://localhost:3000/jqueryui@1.2.3", - "base": null, + "base": "about:blank", "href": "https://localhost:3000/jqueryui@1.2.3", "origin": "https://localhost:3000", "protocol": "https:", @@ -5406,7 +5391,7 @@ "# tab/LF/CR", { "input": "h\tt\nt\rp://h\to\ns\rt:9\t0\n0\r0/p\ta\nt\rh?q\tu\ne\rry#f\tr\na\rg", - "base": null, + "base": "about:blank", "href": "http://host:9000/path?query#frag", "origin": "http://host:9000", "protocol": "http:", @@ -5493,7 +5478,7 @@ "# Percent encoding of fragments", { "input": "http://foo.bar/baz?qux#foo\bbar", - "base": null, + "base": "about:blank", "href": "http://foo.bar/baz?qux#foo%08bar", "origin": "http://foo.bar", "protocol": "http:", @@ -5509,7 +5494,7 @@ }, { "input": "http://foo.bar/baz?qux#foo\"bar", - "base": null, + "base": "about:blank", "href": "http://foo.bar/baz?qux#foo%22bar", "origin": "http://foo.bar", "protocol": "http:", @@ -5525,7 +5510,7 @@ }, { "input": "http://foo.bar/baz?qux#foobar", - "base": null, + "base": "about:blank", "href": "http://foo.bar/baz?qux#foo%3Ebar", "origin": "http://foo.bar", "protocol": "http:", @@ -5557,7 +5542,7 @@ }, { "input": "http://foo.bar/baz?qux#foo`bar", - "base": null, + "base": "about:blank", "href": "http://foo.bar/baz?qux#foo%60bar", "origin": "http://foo.bar", "protocol": "http:", @@ -5789,7 +5774,7 @@ }, { "input": "https://0x.0x.0", - "base": null, + "base": "about:blank", "href": "https://0.0.0.0/", "origin": "https://0.0.0.0", "protocol": "https:", @@ -5805,18 +5790,18 @@ "More IPv4 parsing (via https://github.com/jsdom/whatwg-url/issues/92)", { "input": "https://0x100000000/test", - "base": null, + "base": "about:blank", "failure": true }, { "input": "https://256.0.0.1/test", - "base": null, + "base": "about:blank", "failure": true }, "# file URLs containing percent-encoded Windows drive letters (shouldn't work)", { "input": "file:///C%3A/", - "base": null, + "base": "about:blank", "href": "file:///C%3A/", "protocol": "file:", "username": "", @@ -5830,7 +5815,7 @@ }, { "input": "file:///C%7C/", - "base": null, + "base": "about:blank", "href": "file:///C%7C/", "protocol": "file:", "username": "", @@ -5844,42 +5829,42 @@ }, { "input": "file://%43%3A", - "base": null, + "base": "about:blank", "failure": true }, { "input": "file://%43%7C", - "base": null, + "base": "about:blank", "failure": true }, { "input": "file://%43|", - "base": null, + "base": "about:blank", "failure": true }, { "input": "file://C%7C", - "base": null, + "base": "about:blank", "failure": true }, { "input": "file://%43%7C/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "https://%43%7C/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "asdf://%43|/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "asdf://%43%7C/", - "base": null, + "base": "about:blank", "href": "asdf://%43%7C/", "origin": "null", "protocol": "asdf:", @@ -5950,6 +5935,7 @@ "search": "", "hash": "" }, + "skip next", { "input": "/", "base": "file://h/C:/a/b", @@ -6119,9 +6105,10 @@ "hash": "#x" }, "# File URLs and many (back)slashes", + "skip next", { "input": "file:\\\\//", - "base": null, + "base": "about:blank", "href": "file:////", "protocol": "file:", "username": "", @@ -6133,9 +6120,10 @@ "search": "", "hash": "" }, + "skip next", { "input": "file:\\\\\\\\", - "base": null, + "base": "about:blank", "href": "file:////", "protocol": "file:", "username": "", @@ -6147,9 +6135,10 @@ "search": "", "hash": "" }, + "skip next", { "input": "file:\\\\\\\\?fox", - "base": null, + "base": "about:blank", "href": "file:////?fox", "protocol": "file:", "username": "", @@ -6161,9 +6150,10 @@ "search": "?fox", "hash": "" }, + "skip next", { "input": "file:\\\\\\\\#guppy", - "base": null, + "base": "about:blank", "href": "file:////#guppy", "protocol": "file:", "username": "", @@ -6175,9 +6165,10 @@ "search": "", "hash": "#guppy" }, + "skip next", { "input": "file://spider///", - "base": null, + "base": "about:blank", "href": "file://spider///", "protocol": "file:", "username": "", @@ -6189,9 +6180,10 @@ "search": "", "hash": "" }, + "skip next", { "input": "file:\\\\localhost//", - "base": null, + "base": "about:blank", "href": "file:////", "protocol": "file:", "username": "", @@ -6205,7 +6197,7 @@ }, { "input": "file:///localhost//cat", - "base": null, + "base": "about:blank", "href": "file:///localhost//cat", "protocol": "file:", "username": "", @@ -6217,9 +6209,10 @@ "search": "", "hash": "" }, + "skip next", { "input": "file://\\/localhost//cat", - "base": null, + "base": "about:blank", "href": "file:////localhost//cat", "protocol": "file:", "username": "", @@ -6231,9 +6224,10 @@ "search": "", "hash": "" }, + "skip next", { "input": "file://localhost//a//../..//", - "base": null, + "base": "about:blank", "href": "file://///", "protocol": "file:", "username": "", @@ -6245,6 +6239,7 @@ "search": "", "hash": "" }, + "skip next", { "input": "/////mouse", "base": "file:///elephant", @@ -6273,6 +6268,7 @@ "search": "", "hash": "" }, + "skip next", { "input": "\\/localhost//pig", "base": "file://lion/", @@ -6287,6 +6283,7 @@ "search": "", "hash": "" }, + "skip next", { "input": "//localhost//pig", "base": "file://lion/", @@ -6301,6 +6298,7 @@ "search": "", "hash": "" }, + "skip next", { "input": "/..//localhost//pig", "base": "file://lion/", @@ -6359,6 +6357,7 @@ "hash": "" }, "# Windows drive letter handling with the 'file:' base URL", + "skip next", { "input": "C|", "base": "file://host/dir/file", @@ -6373,6 +6372,7 @@ "search": "", "hash": "" }, + "skip next", { "input": "C|", "base": "file://host/D:/dir1/dir2/file", @@ -6387,6 +6387,7 @@ "search": "", "hash": "" }, + "skip next", { "input": "C|#", "base": "file://host/dir/file", @@ -6401,6 +6402,7 @@ "search": "", "hash": "" }, + "skip next", { "input": "C|?", "base": "file://host/dir/file", @@ -6415,6 +6417,7 @@ "search": "", "hash": "" }, + "skip next", { "input": "C|/", "base": "file://host/dir/file", @@ -6429,6 +6432,7 @@ "search": "", "hash": "" }, + "skip next", { "input": "C|\n/", "base": "file://host/dir/file", @@ -6443,6 +6447,7 @@ "search": "", "hash": "" }, + "skip next", { "input": "C|\\", "base": "file://host/dir/file", @@ -6528,6 +6533,7 @@ "search": "", "hash": "" }, + "skip next", { "input": "/c:/foo/bar", "base": "file://host/path", @@ -6543,9 +6549,10 @@ "hash": "" }, "# Do not drop the host in the presence of a drive letter", + "skip next", { "input": "file://example.net/C:/", - "base": null, + "base": "about:blank", "href": "file://example.net/C:/", "protocol": "file:", "username": "", @@ -6557,9 +6564,10 @@ "search": "", "hash": "" }, + "skip next", { "input": "file://1.2.3.4/C:/", - "base": null, + "base": "about:blank", "href": "file://1.2.3.4/C:/", "protocol": "file:", "username": "", @@ -6571,9 +6579,10 @@ "search": "", "hash": "" }, + "skip next", { "input": "file://[1::8]/C:/", - "base": null, + "base": "about:blank", "href": "file://[1::8]/C:/", "protocol": "file:", "username": "", @@ -6586,6 +6595,7 @@ "hash": "" }, "# Copy the host from the base URL in the following cases", + "skip next", { "input": "C|/", "base": "file://host/", @@ -6600,6 +6610,7 @@ "search": "", "hash": "" }, + "skip next", { "input": "/C:/", "base": "file://host/", @@ -6614,6 +6625,7 @@ "search": "", "hash": "" }, + "skip next", { "input": "file:C:/", "base": "file://host/", @@ -6628,6 +6640,7 @@ "search": "", "hash": "" }, + "skip next", { "input": "file:/C:/", "base": "file://host/", @@ -6643,6 +6656,7 @@ "hash": "" }, "# Copy the empty host from the input in the following cases", + "skip next", { "input": "//C:/", "base": "file://host/", @@ -6702,7 +6716,7 @@ "# Windows drive letter quirk (no host)", { "input": "file:/C|/", - "base": null, + "base": "about:blank", "href": "file:///C:/", "protocol": "file:", "username": "", @@ -6716,7 +6730,7 @@ }, { "input": "file://C|/", - "base": null, + "base": "about:blank", "href": "file:///C:/", "protocol": "file:", "username": "", @@ -6731,7 +6745,7 @@ "# file URLs without base URL by Rimas MiseviÄius", { "input": "file:", - "base": null, + "base": "about:blank", "href": "file:///", "protocol": "file:", "username": "", @@ -6745,7 +6759,7 @@ }, { "input": "file:?q=v", - "base": null, + "base": "about:blank", "href": "file:///?q=v", "protocol": "file:", "username": "", @@ -6759,7 +6773,7 @@ }, { "input": "file:#frag", - "base": null, + "base": "about:blank", "href": "file:///#frag", "protocol": "file:", "username": "", @@ -6774,7 +6788,7 @@ "# file: drive letter cases from https://crbug.com/1078698", { "input": "file:///Y:", - "base": null, + "base": "about:blank", "href": "file:///Y:", "protocol": "file:", "username": "", @@ -6788,7 +6802,7 @@ }, { "input": "file:///Y:/", - "base": null, + "base": "about:blank", "href": "file:///Y:/", "protocol": "file:", "username": "", @@ -6802,7 +6816,7 @@ }, { "input": "file:///./Y", - "base": null, + "base": "about:blank", "href": "file:///Y", "protocol": "file:", "username": "", @@ -6816,7 +6830,7 @@ }, { "input": "file:///./Y:", - "base": null, + "base": "about:blank", "href": "file:///Y:", "protocol": "file:", "username": "", @@ -6830,14 +6844,14 @@ }, { "input": "\\\\\\.\\Y:", - "base": null, + "base": "about:blank", "failure": true, - "relativeTo": "non-opaque-path-base" + "inputCanBeRelative": true }, "# file: drive letter cases from https://crbug.com/1078698 but lowercased", { "input": "file:///y:", - "base": null, + "base": "about:blank", "href": "file:///y:", "protocol": "file:", "username": "", @@ -6851,7 +6865,7 @@ }, { "input": "file:///y:/", - "base": null, + "base": "about:blank", "href": "file:///y:/", "protocol": "file:", "username": "", @@ -6865,7 +6879,7 @@ }, { "input": "file:///./y", - "base": null, + "base": "about:blank", "href": "file:///y", "protocol": "file:", "username": "", @@ -6879,7 +6893,7 @@ }, { "input": "file:///./y:", - "base": null, + "base": "about:blank", "href": "file:///y:", "protocol": "file:", "username": "", @@ -6893,14 +6907,15 @@ }, { "input": "\\\\\\.\\y:", - "base": null, + "base": "about:blank", "failure": true, - "relativeTo": "non-opaque-path-base" + "inputCanBeRelative": true }, "# Additional file URL tests for (https://github.com/whatwg/url/issues/405)", + "skip next", { "input": "file://localhost//a//../..//foo", - "base": null, + "base": "about:blank", "href": "file://///foo", "protocol": "file:", "username": "", @@ -6912,9 +6927,10 @@ "search": "", "hash": "" }, + "skip next", { "input": "file://localhost////foo", - "base": null, + "base": "about:blank", "href": "file://////foo", "protocol": "file:", "username": "", @@ -6926,9 +6942,10 @@ "search": "", "hash": "" }, + "skip next", { "input": "file:////foo", - "base": null, + "base": "about:blank", "href": "file:////foo", "protocol": "file:", "username": "", @@ -6954,6 +6971,7 @@ "search": "", "hash": "" }, + "skip next", { "input": "file:////one/two", "base": "file:///", @@ -6996,6 +7014,7 @@ "search": "", "hash": "" }, + "skip next", { "input": "////one/two", "base": "file:///", @@ -7010,6 +7029,7 @@ "search": "", "hash": "" }, + "skip next", { "input": "file:///.//", "base": "file:////", @@ -7025,9 +7045,10 @@ "hash": "" }, "File URL tests for https://github.com/whatwg/url/issues/549", + "skip next", { "input": "file:.//p", - "base": null, + "base": "about:blank", "href": "file:////p", "protocol": "file:", "username": "", @@ -7039,9 +7060,10 @@ "search": "", "hash": "" }, + "skip next", { "input": "file:/.//p", - "base": null, + "base": "about:blank", "href": "file:////p", "protocol": "file:", "username": "", @@ -7076,48 +7098,48 @@ }, { "input": "https://[0::0::0]", - "base": null, + "base": "about:blank", "failure": true }, { "input": "https://[0:.0]", - "base": null, + "base": "about:blank", "failure": true }, { "input": "https://[0:0:]", - "base": null, + "base": "about:blank", "failure": true }, { "input": "https://[0:1:2:3:4:5:6:7.0.0.0.1]", - "base": null, + "base": "about:blank", "failure": true }, { "input": "https://[0:1.00.0.0.0]", - "base": null, + "base": "about:blank", "failure": true }, { "input": "https://[0:1.290.0.0.0]", - "base": null, + "base": "about:blank", "failure": true }, { "input": "https://[0:1.23.23]", - "base": null, + "base": "about:blank", "failure": true }, "# Empty host", { "input": "http://?", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://#", - "base": null, + "base": "about:blank", "failure": true }, "Port overflow (2^32 + 81)", @@ -7141,7 +7163,7 @@ "# Non-special-URL path tests", { "input": "sc://ñ", - "base": null, + "base": "about:blank", "href": "sc://%C3%B1", "origin": "null", "protocol": "sc:", @@ -7156,7 +7178,7 @@ }, { "input": "sc://ñ?x", - "base": null, + "base": "about:blank", "href": "sc://%C3%B1?x", "origin": "null", "protocol": "sc:", @@ -7171,7 +7193,7 @@ }, { "input": "sc://ñ#x", - "base": null, + "base": "about:blank", "href": "sc://%C3%B1#x", "origin": "null", "protocol": "sc:", @@ -7216,7 +7238,7 @@ }, { "input": "sc://?", - "base": null, + "base": "about:blank", "href": "sc://?", "protocol": "sc:", "username": "", @@ -7230,7 +7252,7 @@ }, { "input": "sc://#", - "base": null, + "base": "about:blank", "href": "sc://#", "protocol": "sc:", "username": "", @@ -7286,7 +7308,7 @@ }, { "input": "tftp://foobar.com/someconfig;mode=netascii", - "base": null, + "base": "about:blank", "href": "tftp://foobar.com/someconfig;mode=netascii", "origin": "null", "protocol": "tftp:", @@ -7301,7 +7323,7 @@ }, { "input": "telnet://user:pass@foobar.com:23/", - "base": null, + "base": "about:blank", "href": "telnet://user:pass@foobar.com:23/", "origin": "null", "protocol": "telnet:", @@ -7316,7 +7338,7 @@ }, { "input": "ut2004://10.10.10.10:7777/Index.ut2", - "base": null, + "base": "about:blank", "href": "ut2004://10.10.10.10:7777/Index.ut2", "origin": "null", "protocol": "ut2004:", @@ -7331,7 +7353,7 @@ }, { "input": "redis://foo:bar@somehost:6379/0?baz=bam&qux=baz", - "base": null, + "base": "about:blank", "href": "redis://foo:bar@somehost:6379/0?baz=bam&qux=baz", "origin": "null", "protocol": "redis:", @@ -7346,7 +7368,7 @@ }, { "input": "rsync://foo@host:911/sup", - "base": null, + "base": "about:blank", "href": "rsync://foo@host:911/sup", "origin": "null", "protocol": "rsync:", @@ -7361,7 +7383,7 @@ }, { "input": "git://github.com/foo/bar.git", - "base": null, + "base": "about:blank", "href": "git://github.com/foo/bar.git", "origin": "null", "protocol": "git:", @@ -7376,7 +7398,7 @@ }, { "input": "irc://myserver.com:6999/channel?passwd", - "base": null, + "base": "about:blank", "href": "irc://myserver.com:6999/channel?passwd", "origin": "null", "protocol": "irc:", @@ -7391,7 +7413,7 @@ }, { "input": "dns://fw.example.org:9999/foo.bar.org?type=TXT", - "base": null, + "base": "about:blank", "href": "dns://fw.example.org:9999/foo.bar.org?type=TXT", "origin": "null", "protocol": "dns:", @@ -7406,7 +7428,7 @@ }, { "input": "ldap://localhost:389/ou=People,o=JNDITutorial", - "base": null, + "base": "about:blank", "href": "ldap://localhost:389/ou=People,o=JNDITutorial", "origin": "null", "protocol": "ldap:", @@ -7421,7 +7443,7 @@ }, { "input": "git+https://github.com/foo/bar", - "base": null, + "base": "about:blank", "href": "git+https://github.com/foo/bar", "origin": "null", "protocol": "git+https:", @@ -7436,7 +7458,7 @@ }, { "input": "urn:ietf:rfc:2648", - "base": null, + "base": "about:blank", "href": "urn:ietf:rfc:2648", "origin": "null", "protocol": "urn:", @@ -7451,7 +7473,7 @@ }, { "input": "tag:joe@example.org,2001:foo/bar", - "base": null, + "base": "about:blank", "href": "tag:joe@example.org,2001:foo/bar", "origin": "null", "protocol": "tag:", @@ -7467,7 +7489,7 @@ "Serialize /. in path", { "input": "non-spec:/.//", - "base": null, + "base": "about:blank", "href": "non-spec:/.//", "protocol": "non-spec:", "username": "", @@ -7481,7 +7503,7 @@ }, { "input": "non-spec:/..//", - "base": null, + "base": "about:blank", "href": "non-spec:/.//", "protocol": "non-spec:", "username": "", @@ -7495,7 +7517,7 @@ }, { "input": "non-spec:/a/..//", - "base": null, + "base": "about:blank", "href": "non-spec:/.//", "protocol": "non-spec:", "username": "", @@ -7509,7 +7531,7 @@ }, { "input": "non-spec:/.//path", - "base": null, + "base": "about:blank", "href": "non-spec:/.//path", "protocol": "non-spec:", "username": "", @@ -7523,7 +7545,7 @@ }, { "input": "non-spec:/..//path", - "base": null, + "base": "about:blank", "href": "non-spec:/.//path", "protocol": "non-spec:", "username": "", @@ -7537,7 +7559,7 @@ }, { "input": "non-spec:/a/..//path", - "base": null, + "base": "about:blank", "href": "non-spec:/.//path", "protocol": "non-spec:", "username": "", @@ -7549,6 +7571,7 @@ "search": "", "hash": "" }, + "skip next", { "input": "/.//path", "base": "non-spec:/p", @@ -7651,7 +7674,7 @@ "# percent encoded hosts in non-special-URLs", { "input": "non-special://%E2%80%A0/", - "base": null, + "base": "about:blank", "href": "non-special://%E2%80%A0/", "protocol": "non-special:", "username": "", @@ -7665,7 +7688,7 @@ }, { "input": "non-special://H%4fSt/path", - "base": null, + "base": "about:blank", "href": "non-special://H%4fSt/path", "protocol": "non-special:", "username": "", @@ -7680,7 +7703,7 @@ "# IPv6 in non-special-URLs", { "input": "non-special://[1:2:0:0:5:0:0:0]/", - "base": null, + "base": "about:blank", "href": "non-special://[1:2:0:0:5::]/", "protocol": "non-special:", "username": "", @@ -7694,7 +7717,7 @@ }, { "input": "non-special://[1:2:0:0:0:0:0:3]/", - "base": null, + "base": "about:blank", "href": "non-special://[1:2::3]/", "protocol": "non-special:", "username": "", @@ -7708,7 +7731,7 @@ }, { "input": "non-special://[1:2::3]:80/", - "base": null, + "base": "about:blank", "href": "non-special://[1:2::3]:80/", "protocol": "non-special:", "username": "", @@ -7722,12 +7745,12 @@ }, { "input": "non-special://[:80/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "blob:https://example.com:443/", - "base": null, + "base": "about:blank", "href": "blob:https://example.com:443/", "origin": "https://example.com", "protocol": "blob:", @@ -7741,23 +7764,8 @@ "hash": "" }, { - "input": "blob:http://example.org:88/", - "base": null, - "href": "blob:http://example.org:88/", - "origin": "http://example.org:88", - "protocol": "blob:", - "username": "", - "password": "", - "host": "", - "hostname": "", - "port": "", - "pathname": "http://example.org:88/", - "search": "", - "hash": "" - }, - { "input": "blob:d3958f5c-0777-0845-9dcf-2cb28783acaf", - "base": null, + "base": "about:blank", "href": "blob:d3958f5c-0777-0845-9dcf-2cb28783acaf", "origin": "null", "protocol": "blob:", @@ -7772,7 +7780,7 @@ }, { "input": "blob:", - "base": null, + "base": "about:blank", "href": "blob:", "origin": "null", "protocol": "blob:", @@ -7785,168 +7793,45 @@ "search": "", "hash": "" }, - "blob: in blob:", + "Invalid IPv4 radix digits", { - "input": "blob:blob:", - "base": null, - "href": "blob:blob:", - "origin": "null", - "protocol": "blob:", + "input": "http://0x7f.0.0.0x7g", + "base": "about:blank", + "href": "http://0x7f.0.0.0x7g/", + "protocol": "http:", "username": "", "password": "", - "host": "", - "hostname": "", + "host": "0x7f.0.0.0x7g", + "hostname": "0x7f.0.0.0x7g", "port": "", - "pathname": "blob:", + "pathname": "/", "search": "", "hash": "" }, { - "input": "blob:blob:https://example.org/", - "base": null, - "href": "blob:blob:https://example.org/", - "origin": "null", - "protocol": "blob:", + "input": "http://0X7F.0.0.0X7G", + "base": "about:blank", + "href": "http://0x7f.0.0.0x7g/", + "protocol": "http:", "username": "", "password": "", - "host": "", - "hostname": "", + "host": "0x7f.0.0.0x7g", + "hostname": "0x7f.0.0.0x7g", "port": "", - "pathname": "blob:https://example.org/", - "search": "", - "hash": "" - }, - "Non-http(s): in blob:", - { - "input": "blob:about:blank", - "base": null, - "href": "blob:about:blank", - "origin": "null", - "protocol": "blob:", - "username": "", - "password": "", - "host": "", - "hostname": "", - "port": "", - "pathname": "about:blank", - "search": "", - "hash": "" - }, - { - "input": "blob:file://host/path", - "base": null, - "href": "blob:file://host/path", - "origin": "null", - "protocol": "blob:", - "username": "", - "password": "", - "host": "", - "hostname": "", - "port": "", - "pathname": "file://host/path", - "search": "", - "hash": "" - }, - { - "input": "blob:ftp://host/path", - "base": null, - "href": "blob:ftp://host/path", - "origin": "null", - "protocol": "blob:", - "username": "", - "password": "", - "host": "", - "hostname": "", - "port": "", - "pathname": "ftp://host/path", - "search": "", - "hash": "" - }, - { - "input": "blob:ws://example.org/", - "base": null, - "href": "blob:ws://example.org/", - "origin": "null", - "protocol": "blob:", - "username": "", - "password": "", - "host": "", - "hostname": "", - "port": "", - "pathname": "ws://example.org/", - "search": "", - "hash": "" - }, - { - "input": "blob:wss://example.org/", - "base": null, - "href": "blob:wss://example.org/", - "origin": "null", - "protocol": "blob:", - "username": "", - "password": "", - "host": "", - "hostname": "", - "port": "", - "pathname": "wss://example.org/", - "search": "", - "hash": "" - }, - "Percent-encoded http: in blob:", - { - "input": "blob:http%3a//example.org/", - "base": null, - "href": "blob:http%3a//example.org/", - "origin": "null", - "protocol": "blob:", - "username": "", - "password": "", - "host": "", - "hostname": "", - "port": "", - "pathname": "http%3a//example.org/", - "search": "", - "hash": "" - }, - "Invalid IPv4 radix digits", - { - "input": "http://0x7f.0.0.0x7g", - "base": null, - "href": "http://0x7f.0.0.0x7g/", - "protocol": "http:", - "username": "", - "password": "", - "host": "0x7f.0.0.0x7g", - "hostname": "0x7f.0.0.0x7g", - "port": "", - "pathname": "/", - "search": "", - "hash": "" - }, - { - "input": "http://0X7F.0.0.0X7G", - "base": null, - "href": "http://0x7f.0.0.0x7g/", - "protocol": "http:", - "username": "", - "password": "", - "host": "0x7f.0.0.0x7g", - "hostname": "0x7f.0.0.0x7g", - "port": "", - "pathname": "/", + "pathname": "/", "search": "", "hash": "" }, "Invalid IPv4 portion of IPv6 address", { "input": "http://[::127.0.0.0.1]", - "base": null, + "base": "about:blank", "failure": true }, "Uncompressed IPv6 addresses with 0", { "input": "http://[0:1:0:1:0:1:0:1]", - "base": null, + "base": "about:blank", "href": "http://[0:1:0:1:0:1:0:1]/", "protocol": "http:", "username": "", @@ -7960,7 +7845,7 @@ }, { "input": "http://[1:0:1:0:1:0:1:0]", - "base": null, + "base": "about:blank", "href": "http://[1:0:1:0:1:0:1:0]/", "protocol": "http:", "username": "", @@ -7975,7 +7860,7 @@ "Percent-encoded query and fragment", { "input": "http://example.org/test?\u0022", - "base": null, + "base": "about:blank", "href": "http://example.org/test?%22", "protocol": "http:", "username": "", @@ -7989,7 +7874,7 @@ }, { "input": "http://example.org/test?\u0023", - "base": null, + "base": "about:blank", "href": "http://example.org/test?#", "protocol": "http:", "username": "", @@ -8003,7 +7888,7 @@ }, { "input": "http://example.org/test?\u003C", - "base": null, + "base": "about:blank", "href": "http://example.org/test?%3C", "protocol": "http:", "username": "", @@ -8017,7 +7902,7 @@ }, { "input": "http://example.org/test?\u003E", - "base": null, + "base": "about:blank", "href": "http://example.org/test?%3E", "protocol": "http:", "username": "", @@ -8031,7 +7916,7 @@ }, { "input": "http://example.org/test?\u2323", - "base": null, + "base": "about:blank", "href": "http://example.org/test?%E2%8C%A3", "protocol": "http:", "username": "", @@ -8045,7 +7930,7 @@ }, { "input": "http://example.org/test?%23%23", - "base": null, + "base": "about:blank", "href": "http://example.org/test?%23%23", "protocol": "http:", "username": "", @@ -8059,7 +7944,7 @@ }, { "input": "http://example.org/test?%GH", - "base": null, + "base": "about:blank", "href": "http://example.org/test?%GH", "protocol": "http:", "username": "", @@ -8073,7 +7958,7 @@ }, { "input": "http://example.org/test?a#%EF", - "base": null, + "base": "about:blank", "href": "http://example.org/test?a#%EF", "protocol": "http:", "username": "", @@ -8087,7 +7972,7 @@ }, { "input": "http://example.org/test?a#%GH", - "base": null, + "base": "about:blank", "href": "http://example.org/test?a#%GH", "protocol": "http:", "username": "", @@ -8102,21 +7987,21 @@ "URLs that require a non-about:blank base. (Also serve as invalid base tests.)", { "input": "a", - "base": null, + "base": "about:blank", "failure": true, - "relativeTo": "non-opaque-path-base" + "inputCanBeRelative": true }, { "input": "a/", - "base": null, + "base": "about:blank", "failure": true, - "relativeTo": "non-opaque-path-base" + "inputCanBeRelative": true }, { "input": "a//", - "base": null, + "base": "about:blank", "failure": true, - "relativeTo": "non-opaque-path-base" + "inputCanBeRelative": true }, "Bases that don't fail to parse but fail to be bases", { @@ -8189,7 +8074,7 @@ "Null code point in fragment", { "input": "http://example.org/test?a#b\u0000c", - "base": null, + "base": "about:blank", "href": "http://example.org/test?a#b%00c", "protocol": "http:", "username": "", @@ -8203,7 +8088,7 @@ }, { "input": "non-spec://example.org/test?a#b\u0000c", - "base": null, + "base": "about:blank", "href": "non-spec://example.org/test?a#b%00c", "protocol": "non-spec:", "username": "", @@ -8217,7 +8102,7 @@ }, { "input": "non-spec:/test?a#b\u0000c", - "base": null, + "base": "about:blank", "href": "non-spec:/test?a#b%00c", "protocol": "non-spec:", "username": "", @@ -8277,7 +8162,7 @@ "IDNA ignored code points in file URLs hosts", { "input": "file://a\u00ADb/p", - "base": null, + "base": "about:blank", "href": "file://ab/p", "protocol": "file:", "username": "", @@ -8291,7 +8176,7 @@ }, { "input": "file://a%C2%ADb/p", - "base": null, + "base": "about:blank", "href": "file://ab/p", "protocol": "file:", "username": "", @@ -8306,7 +8191,7 @@ "IDNA hostnames which get mapped to 'localhost'", { "input": "file://loCð€ð‹ð‡ð¨ð¬ð­/usr/bin", - "base": null, + "base": "about:blank", "href": "file:///usr/bin", "protocol": "file:", "username": "", @@ -8321,17 +8206,17 @@ "Empty host after the domain to ASCII", { "input": "file://\u00ad/p", - "base": null, + "base": "about:blank", "failure": true }, { "input": "file://%C2%AD/p", - "base": null, + "base": "about:blank", "failure": true }, { "input": "file://xn--/p", - "base": null, + "base": "about:blank", "failure": true }, "https://bugzilla.mozilla.org/show_bug.cgi?id=1647058", @@ -8352,7 +8237,7 @@ "UTF-8 percent-encode of C0 control percent-encode set and supersets", { "input": "non-special:cannot-be-a-base-url-\u0000\u0001\u001F\u001E\u007E\u007F\u0080", - "base": null, + "base": "about:blank", "hash": "", "host": "", "hostname": "", @@ -8367,7 +8252,7 @@ }, { "input": "https://www.example.com/path{\u007Fpath.html?query'\u007F=query#fragment<\u007Ffragment", - "base": null, + "base": "about:blank", "hash": "#fragment%3C%7Ffragment", "host": "www.example.com", "hostname": "www.example.com", @@ -8398,7 +8283,7 @@ "Tests for the distinct percent-encode sets", { "input": "foo:// !\"$%&'()*+,-.;<=>@[\\]^_`{|}~@host/", - "base": null, + "base": "about:blank", "hash": "", "host": "host", "hostname": "host", @@ -8413,7 +8298,7 @@ }, { "input": "wss:// !\"$%&'()*+,-.;<=>@[]^_`{|}~@host/", - "base": null, + "base": "about:blank", "hash": "", "host": "host", "hostname": "host", @@ -8428,7 +8313,7 @@ }, { "input": "foo://joe: !\"$%&'()*+,-.:;<=>@[\\]^_`{|}~@host/", - "base": null, + "base": "about:blank", "hash": "", "host": "host", "hostname": "host", @@ -8443,7 +8328,7 @@ }, { "input": "wss://joe: !\"$%&'()*+,-.:;<=>@[]^_`{|}~@host/", - "base": null, + "base": "about:blank", "hash": "", "host": "host", "hostname": "host", @@ -8458,7 +8343,7 @@ }, { "input": "foo://!\"$%&'()*+,-.;=_`{}~/", - "base": null, + "base": "about:blank", "hash": "", "host": "!\"$%&'()*+,-.;=_`{}~", "hostname": "!\"$%&'()*+,-.;=_`{}~", @@ -8473,7 +8358,7 @@ }, { "input": "wss://!\"$&'()*+,-.;=_`{}~/", - "base": null, + "base": "about:blank", "hash": "", "host": "!\"$&'()*+,-.;=_`{}~", "hostname": "!\"$&'()*+,-.;=_`{}~", @@ -8488,7 +8373,7 @@ }, { "input": "foo://host/ !\"$%&'()*+,-./:;<=>@[\\]^_`{|}~", - "base": null, + "base": "about:blank", "hash": "", "host": "host", "hostname": "host", @@ -8503,7 +8388,7 @@ }, { "input": "wss://host/ !\"$%&'()*+,-./:;<=>@[\\]^_`{|}~", - "base": null, + "base": "about:blank", "hash": "", "host": "host", "hostname": "host", @@ -8518,7 +8403,7 @@ }, { "input": "foo://host/dir/? !\"$%&'()*+,-./:;<=>?@[\\]^_`{|}~", - "base": null, + "base": "about:blank", "hash": "", "host": "host", "hostname": "host", @@ -8533,7 +8418,7 @@ }, { "input": "wss://host/dir/? !\"$%&'()*+,-./:;<=>?@[\\]^_`{|}~", - "base": null, + "base": "about:blank", "hash": "", "host": "host", "hostname": "host", @@ -8548,7 +8433,7 @@ }, { "input": "foo://host/dir/# !\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~", - "base": null, + "base": "about:blank", "hash": "#%20!%22#$%&'()*+,-./:;%3C=%3E?@[\\]^_%60{|}~", "host": "host", "hostname": "host", @@ -8563,7 +8448,7 @@ }, { "input": "wss://host/dir/# !\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~", - "base": null, + "base": "about:blank", "hash": "#%20!%22#$%&'()*+,-./:;%3C=%3E?@[\\]^_%60{|}~", "host": "host", "hostname": "host", @@ -8637,14 +8522,12 @@ { "input": "#", "base": null, - "failure": true, - "relativeTo": "any-base" + "failure": true }, { "input": "?", "base": null, - "failure": true, - "relativeTo": "non-opaque-path-base" + "failure": true }, "Last component looks like a number, but not valid IPv4", { @@ -8659,12 +8542,12 @@ }, { "input": "http://0..0x300/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://0..0x300./", - "base": null, + "base": "about:blank", "failure": true }, { @@ -8679,102 +8562,102 @@ }, { "input": "http://1.2.3.08", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://1.2.3.08.", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://1.2.3.09", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://09.2.3.4", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://09.2.3.4.", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://01.2.3.4.5", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://01.2.3.4.5.", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://0x100.2.3.4", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://0x100.2.3.4.", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://0x1.2.3.4.5", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://0x1.2.3.4.5.", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://foo.1.2.3.4", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://foo.1.2.3.4.", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://foo.2.3.4", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://foo.2.3.4.", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://foo.09", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://foo.09.", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://foo.0x4", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://foo.0x4.", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://foo.09..", - "base": null, + "base": "about:blank", "hash": "", "host": "foo.09..", "hostname": "foo.09..", @@ -8788,33 +8671,33 @@ }, { "input": "http://0999999999999999999/", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://foo.0x", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://foo.0XFfFfFfFfFfFfFfFfFfAcE123", - "base": null, + "base": "about:blank", "failure": true }, { "input": "http://💩.123/", - "base": null, + "base": "about:blank", "failure": true }, "U+0000 and U+FFFF in various places", { "input": "https://\u0000y", - "base": null, + "base": "about:blank", "failure": true }, { "input": "https://x/\u0000y", - "base": null, + "base": "about:blank", "hash": "", "host": "x", "hostname": "x", @@ -8828,7 +8711,7 @@ }, { "input": "https://x/?\u0000y", - "base": null, + "base": "about:blank", "hash": "", "host": "x", "hostname": "x", @@ -8842,7 +8725,7 @@ }, { "input": "https://x/?#\u0000y", - "base": null, + "base": "about:blank", "hash": "#%00y", "host": "x", "hostname": "x", @@ -8856,12 +8739,12 @@ }, { "input": "https://\uFFFFy", - "base": null, + "base": "about:blank", "failure": true }, { "input": "https://x/\uFFFFy", - "base": null, + "base": "about:blank", "hash": "", "host": "x", "hostname": "x", @@ -8875,7 +8758,7 @@ }, { "input": "https://x/?\uFFFFy", - "base": null, + "base": "about:blank", "hash": "", "host": "x", "hostname": "x", @@ -8889,7 +8772,7 @@ }, { "input": "https://x/?#\uFFFFy", - "base": null, + "base": "about:blank", "hash": "#%EF%BF%BFy", "host": "x", "hostname": "x", @@ -8903,7 +8786,7 @@ }, { "input": "non-special:\u0000y", - "base": null, + "base": "about:blank", "hash": "", "host": "", "hostname": "", @@ -8917,7 +8800,7 @@ }, { "input": "non-special:x/\u0000y", - "base": null, + "base": "about:blank", "hash": "", "host": "", "hostname": "", @@ -8931,7 +8814,7 @@ }, { "input": "non-special:x/?\u0000y", - "base": null, + "base": "about:blank", "hash": "", "host": "", "hostname": "", @@ -8945,7 +8828,7 @@ }, { "input": "non-special:x/?#\u0000y", - "base": null, + "base": "about:blank", "hash": "#%00y", "host": "", "hostname": "", @@ -8959,7 +8842,7 @@ }, { "input": "non-special:\uFFFFy", - "base": null, + "base": "about:blank", "hash": "", "host": "", "hostname": "", @@ -8973,7 +8856,7 @@ }, { "input": "non-special:x/\uFFFFy", - "base": null, + "base": "about:blank", "hash": "", "host": "", "hostname": "", @@ -8987,7 +8870,7 @@ }, { "input": "non-special:x/?\uFFFFy", - "base": null, + "base": "about:blank", "hash": "", "host": "", "hostname": "", @@ -9001,7 +8884,7 @@ }, { "input": "non-special:x/?#\uFFFFy", - "base": null, + "base": "about:blank", "hash": "#%EF%BF%BFy", "host": "", "hostname": "", @@ -9015,13 +8898,12 @@ }, { "input": "", - "base": null, - "failure": true, - "relativeTo": "non-opaque-path-base" + "base": "about:blank", + "failure": true }, { "input": "https://example.com/\"quoted\"", - "base": null, + "base": "about:blank", "hash": "", "host": "example.com", "hostname": "example.com", @@ -9033,487 +8915,5 @@ "protocol": "https:", "search": "", "username": "" - }, - { - "input": "https://a%C2%ADb/", - "base": null, - "hash": "", - "host": "ab", - "hostname": "ab", - "href": "https://ab/", - "origin": "https://ab", - "password": "", - "pathname": "/", - "port": "", - "protocol": "https:", - "search": "", - "username": "" - }, - { - "comment": "Empty host after domain to ASCII", - "input": "https://\u00AD/", - "base": null, - "failure": true - }, - { - "input": "https://%C2%AD/", - "base": null, - "failure": true - }, - { - "input": "https://xn--/", - "base": null, - "failure": true - }, - "Non-special schemes that some implementations might incorrectly treat as special", - { - "input": "data://example.com:8080/pathname?search#hash", - "base": null, - "href": "data://example.com:8080/pathname?search#hash", - "origin": "null", - "protocol": "data:", - "username": "", - "password": "", - "host": "example.com:8080", - "hostname": "example.com", - "port": "8080", - "pathname": "/pathname", - "search": "?search", - "hash": "#hash" - }, - { - "input": "data:///test", - "base": null, - "href": "data:///test", - "origin": "null", - "protocol": "data:", - "username": "", - "password": "", - "host": "", - "hostname": "", - "port": "", - "pathname": "/test", - "search": "", - "hash": "" - }, - { - "input": "data://test/a/../b", - "base": null, - "href": "data://test/b", - "origin": "null", - "protocol": "data:", - "username": "", - "password": "", - "host": "test", - "hostname": "test", - "port": "", - "pathname": "/b", - "search": "", - "hash": "" - }, - { - "input": "data://:443", - "base": null, - "failure": true - }, - { - "input": "data://test:test", - "base": null, - "failure": true - }, - { - "input": "data://[:1]", - "base": null, - "failure": true - }, - { - "input": "javascript://example.com:8080/pathname?search#hash", - "base": null, - "href": "javascript://example.com:8080/pathname?search#hash", - "origin": "null", - "protocol": "javascript:", - "username": "", - "password": "", - "host": "example.com:8080", - "hostname": "example.com", - "port": "8080", - "pathname": "/pathname", - "search": "?search", - "hash": "#hash" - }, - { - "input": "javascript:///test", - "base": null, - "href": "javascript:///test", - "origin": "null", - "protocol": "javascript:", - "username": "", - "password": "", - "host": "", - "hostname": "", - "port": "", - "pathname": "/test", - "search": "", - "hash": "" - }, - { - "input": "javascript://test/a/../b", - "base": null, - "href": "javascript://test/b", - "origin": "null", - "protocol": "javascript:", - "username": "", - "password": "", - "host": "test", - "hostname": "test", - "port": "", - "pathname": "/b", - "search": "", - "hash": "" - }, - { - "input": "javascript://:443", - "base": null, - "failure": true - }, - { - "input": "javascript://test:test", - "base": null, - "failure": true - }, - { - "input": "javascript://[:1]", - "base": null, - "failure": true - }, - { - "input": "mailto://example.com:8080/pathname?search#hash", - "base": null, - "href": "mailto://example.com:8080/pathname?search#hash", - "origin": "null", - "protocol": "mailto:", - "username": "", - "password": "", - "host": "example.com:8080", - "hostname": "example.com", - "port": "8080", - "pathname": "/pathname", - "search": "?search", - "hash": "#hash" - }, - { - "input": "mailto:///test", - "base": null, - "href": "mailto:///test", - "origin": "null", - "protocol": "mailto:", - "username": "", - "password": "", - "host": "", - "hostname": "", - "port": "", - "pathname": "/test", - "search": "", - "hash": "" - }, - { - "input": "mailto://test/a/../b", - "base": null, - "href": "mailto://test/b", - "origin": "null", - "protocol": "mailto:", - "username": "", - "password": "", - "host": "test", - "hostname": "test", - "port": "", - "pathname": "/b", - "search": "", - "hash": "" - }, - { - "input": "mailto://:443", - "base": null, - "failure": true - }, - { - "input": "mailto://test:test", - "base": null, - "failure": true - }, - { - "input": "mailto://[:1]", - "base": null, - "failure": true - }, - { - "input": "intent://example.com:8080/pathname?search#hash", - "base": null, - "href": "intent://example.com:8080/pathname?search#hash", - "origin": "null", - "protocol": "intent:", - "username": "", - "password": "", - "host": "example.com:8080", - "hostname": "example.com", - "port": "8080", - "pathname": "/pathname", - "search": "?search", - "hash": "#hash" - }, - { - "input": "intent:///test", - "base": null, - "href": "intent:///test", - "origin": "null", - "protocol": "intent:", - "username": "", - "password": "", - "host": "", - "hostname": "", - "port": "", - "pathname": "/test", - "search": "", - "hash": "" - }, - { - "input": "intent://test/a/../b", - "base": null, - "href": "intent://test/b", - "origin": "null", - "protocol": "intent:", - "username": "", - "password": "", - "host": "test", - "hostname": "test", - "port": "", - "pathname": "/b", - "search": "", - "hash": "" - }, - { - "input": "intent://:443", - "base": null, - "failure": true - }, - { - "input": "intent://test:test", - "base": null, - "failure": true - }, - { - "input": "intent://[:1]", - "base": null, - "failure": true - }, - { - "input": "urn://example.com:8080/pathname?search#hash", - "base": null, - "href": "urn://example.com:8080/pathname?search#hash", - "origin": "null", - "protocol": "urn:", - "username": "", - "password": "", - "host": "example.com:8080", - "hostname": "example.com", - "port": "8080", - "pathname": "/pathname", - "search": "?search", - "hash": "#hash" - }, - { - "input": "urn:///test", - "base": null, - "href": "urn:///test", - "origin": "null", - "protocol": "urn:", - "username": "", - "password": "", - "host": "", - "hostname": "", - "port": "", - "pathname": "/test", - "search": "", - "hash": "" - }, - { - "input": "urn://test/a/../b", - "base": null, - "href": "urn://test/b", - "origin": "null", - "protocol": "urn:", - "username": "", - "password": "", - "host": "test", - "hostname": "test", - "port": "", - "pathname": "/b", - "search": "", - "hash": "" - }, - { - "input": "urn://:443", - "base": null, - "failure": true - }, - { - "input": "urn://test:test", - "base": null, - "failure": true - }, - { - "input": "urn://[:1]", - "base": null, - "failure": true - }, - { - "input": "turn://example.com:8080/pathname?search#hash", - "base": null, - "href": "turn://example.com:8080/pathname?search#hash", - "origin": "null", - "protocol": "turn:", - "username": "", - "password": "", - "host": "example.com:8080", - "hostname": "example.com", - "port": "8080", - "pathname": "/pathname", - "search": "?search", - "hash": "#hash" - }, - { - "input": "turn:///test", - "base": null, - "href": "turn:///test", - "origin": "null", - "protocol": "turn:", - "username": "", - "password": "", - "host": "", - "hostname": "", - "port": "", - "pathname": "/test", - "search": "", - "hash": "" - }, - { - "input": "turn://test/a/../b", - "base": null, - "href": "turn://test/b", - "origin": "null", - "protocol": "turn:", - "username": "", - "password": "", - "host": "test", - "hostname": "test", - "port": "", - "pathname": "/b", - "search": "", - "hash": "" - }, - { - "input": "turn://:443", - "base": null, - "failure": true - }, - { - "input": "turn://test:test", - "base": null, - "failure": true - }, - { - "input": "turn://[:1]", - "base": null, - "failure": true - }, - { - "input": "stun://example.com:8080/pathname?search#hash", - "base": null, - "href": "stun://example.com:8080/pathname?search#hash", - "origin": "null", - "protocol": "stun:", - "username": "", - "password": "", - "host": "example.com:8080", - "hostname": "example.com", - "port": "8080", - "pathname": "/pathname", - "search": "?search", - "hash": "#hash" - }, - { - "input": "stun:///test", - "base": null, - "href": "stun:///test", - "origin": "null", - "protocol": "stun:", - "username": "", - "password": "", - "host": "", - "hostname": "", - "port": "", - "pathname": "/test", - "search": "", - "hash": "" - }, - { - "input": "stun://test/a/../b", - "base": null, - "href": "stun://test/b", - "origin": "null", - "protocol": "stun:", - "username": "", - "password": "", - "host": "test", - "hostname": "test", - "port": "", - "pathname": "/b", - "search": "", - "hash": "" - }, - { - "input": "stun://:443", - "base": null, - "failure": true - }, - { - "input": "stun://test:test", - "base": null, - "failure": true - }, - { - "input": "stun://[:1]", - "base": null, - "failure": true - }, - { - "input": "w://x:0", - "base": null, - "href": "w://x:0", - "origin": "null", - "protocol": "w:", - "username": "", - "password": "", - "host": "x:0", - "hostname": "x", - "port": "0", - "pathname": "", - "search": "", - "hash": "" - }, - { - "input": "west://x:0", - "base": null, - "href": "west://x:0", - "origin": "null", - "protocol": "west:", - "username": "", - "password": "", - "host": "x:0", - "hostname": "x", - "port": "0", - "pathname": "", - "search": "", - "hash": "" } ] diff -Nru temporalio-1.3.0/vendor/url/tests/wpt.rs temporalio-1.3.0/vendor/url/tests/wpt.rs --- temporalio-1.3.0/vendor/url/tests/wpt.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/url/tests/wpt.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,477 +0,0 @@ -// Copyright 2013-2014 The rust-url developers. -// -// Licensed under the Apache License, Version 2.0 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -//! Data-driven tests imported from web-platform-tests - -use std::collections::HashMap; -use std::fmt::Write; -use std::panic; - -use serde_json::Value; -use url::Url; - -#[derive(Debug, serde::Deserialize)] -struct UrlTest { - input: String, - base: Option, - #[serde(flatten)] - result: UrlTestResult, -} - -#[derive(Debug, serde::Deserialize)] -#[serde(untagged)] -#[allow(clippy::large_enum_variant)] -enum UrlTestResult { - Ok(UrlTestOk), - Fail(UrlTestFail), -} - -#[derive(Debug, serde::Deserialize)] -struct UrlTestOk { - href: String, - protocol: String, - username: String, - password: String, - host: String, - hostname: String, - port: String, - pathname: String, - search: String, - hash: String, -} - -#[derive(Debug, serde::Deserialize)] -struct UrlTestFail { - failure: bool, -} - -#[derive(Debug, serde::Deserialize)] -struct SetterTest { - href: String, - new_value: String, - expected: SetterTestExpected, -} - -#[derive(Debug, serde::Deserialize)] -struct SetterTestExpected { - href: Option, - protocol: Option, - username: Option, - password: Option, - host: Option, - hostname: Option, - port: Option, - pathname: Option, - search: Option, - hash: Option, -} - -fn main() { - let mut filter = None; - let mut args = std::env::args().skip(1); - while filter.is_none() { - if let Some(arg) = args.next() { - if arg == "--test-threads" { - args.next(); - continue; - } - filter = Some(arg); - } else { - break; - } - } - - let mut expected_failures = include_str!("expected_failures.txt") - .lines() - .collect::>(); - - let mut errors = vec![]; - - // Copied from https://github.com/web-platform-tests/wpt/blob/master/url/ - let url_json: Vec = serde_json::from_str(include_str!("urltestdata.json")) - .expect("JSON parse error in urltestdata.json"); - let url_tests = url_json - .into_iter() - .filter(|val| val.is_object()) - .map(|val| serde_json::from_value::(val).expect("parsing failed")) - .collect::>(); - - let setter_json: HashMap = - serde_json::from_str(include_str!("setters_tests.json")) - .expect("JSON parse error in setters_tests.json"); - let setter_tests = setter_json - .into_iter() - .filter(|(k, _)| k != "comment") - .map(|(k, v)| { - let test = serde_json::from_value::>(v).expect("parsing failed"); - (k, test) - }) - .collect::>(); - - for url_test in url_tests { - let mut name = format!("<{}>", url_test.input.escape_default()); - if let Some(base) = &url_test.base { - write!(&mut name, " against <{}>", base.escape_default()).unwrap(); - } - if should_skip(&name, filter.as_deref()) { - continue; - } - print!("{} ... ", name); - - let res = run_url_test(url_test); - report(name, res, &mut errors, &mut expected_failures); - } - - for (kind, tests) in setter_tests { - for test in tests { - let name = format!( - "<{}> set {} to <{}>", - test.href.escape_default(), - kind, - test.new_value.escape_default() - ); - if should_skip(&name, filter.as_deref()) { - continue; - } - - print!("{} ... ", name); - - let res = run_setter_test(&kind, test); - report(name, res, &mut errors, &mut expected_failures); - } - } - - println!(); - println!("===================="); - println!(); - - if !errors.is_empty() { - println!("errors:"); - println!(); - - for (name, err) in errors { - println!(" name: {}", name); - println!(" err: {}", err); - println!(); - } - - std::process::exit(1); - } else { - println!("all tests passed"); - } - - if !expected_failures.is_empty() && filter.is_none() { - println!(); - println!("===================="); - println!(); - println!("tests were expected to fail but did not run:"); - println!(); - - for name in expected_failures { - println!(" {}", name); - } - - println!(); - println!("if these tests were removed, update expected_failures.txt"); - println!(); - - std::process::exit(1); - } -} - -fn should_skip(name: &str, filter: Option<&str>) -> bool { - match filter { - Some(filter) => !name.contains(filter), - None => false, - } -} - -fn report( - name: String, - res: Result<(), String>, - errors: &mut Vec<(String, String)>, - expected_failures: &mut Vec<&str>, -) { - let expected_failure = expected_failures.contains(&&*name); - expected_failures.retain(|&s| s != &*name); - match res { - Ok(()) => { - if expected_failure { - println!("🟠 (unexpected success)"); - errors.push((name, "unexpected success".to_string())); - } else { - println!("✅"); - } - } - Err(err) => { - if expected_failure { - println!("✅ (expected fail)"); - } else { - println!("âŒ"); - errors.push((name, err)); - } - } - } -} - -fn run_url_test( - UrlTest { - base, - input, - result, - }: UrlTest, -) -> Result<(), String> { - let base = match base { - Some(base) => { - let base = panic::catch_unwind(|| Url::parse(&base)) - .map_err(|_| "panicked while parsing base".to_string())? - .map_err(|e| format!("errored while parsing base: {}", e))?; - Some(base) - } - None => None, - }; - - let res = panic::catch_unwind(move || Url::options().base_url(base.as_ref()).parse(&input)) - .map_err(|_| "panicked while parsing input".to_string())? - .map_err(|e| format!("errored while parsing input: {}", e)); - - match result { - UrlTestResult::Ok(ok) => check_url_ok(res, ok), - UrlTestResult::Fail(fail) => { - assert!(fail.failure); - if res.is_ok() { - return Err("expected failure, but parsed successfully".to_string()); - } - - Ok(()) - } - } -} - -fn check_url_ok(res: Result, ok: UrlTestOk) -> Result<(), String> { - let url = match res { - Ok(url) => url, - Err(err) => { - return Err(format!("expected success, but errored: {:?}", err)); - } - }; - - let href = url::quirks::href(&url); - if href != ok.href { - return Err(format!("expected href {:?}, but got {:?}", ok.href, href)); - } - - let protocol = url::quirks::protocol(&url); - if protocol != ok.protocol { - return Err(format!( - "expected protocol {:?}, but got {:?}", - ok.protocol, protocol - )); - } - - let username = url::quirks::username(&url); - if username != ok.username { - return Err(format!( - "expected username {:?}, but got {:?}", - ok.username, username - )); - } - - let password = url::quirks::password(&url); - if password != ok.password { - return Err(format!( - "expected password {:?}, but got {:?}", - ok.password, password - )); - } - - let host = url::quirks::host(&url); - if host != ok.host { - return Err(format!("expected host {:?}, but got {:?}", ok.host, host)); - } - - let hostname = url::quirks::hostname(&url); - if hostname != ok.hostname { - return Err(format!( - "expected hostname {:?}, but got {:?}", - ok.hostname, hostname - )); - } - - let port = url::quirks::port(&url); - if port != ok.port { - return Err(format!("expected port {:?}, but got {:?}", ok.port, port)); - } - - let pathname = url::quirks::pathname(&url); - if pathname != ok.pathname { - return Err(format!( - "expected pathname {:?}, but got {:?}", - ok.pathname, pathname - )); - } - - let search = url::quirks::search(&url); - if search != ok.search { - return Err(format!( - "expected search {:?}, but got {:?}", - ok.search, search - )); - } - - let hash = url::quirks::hash(&url); - if hash != ok.hash { - return Err(format!("expected hash {:?}, but got {:?}", ok.hash, hash)); - } - - Ok(()) -} - -fn run_setter_test( - kind: &str, - SetterTest { - href, - new_value, - expected, - }: SetterTest, -) -> Result<(), String> { - let mut url = panic::catch_unwind(|| Url::parse(&href)) - .map_err(|_| "panicked while parsing href".to_string())? - .map_err(|e| format!("errored while parsing href: {}", e))?; - - let url = panic::catch_unwind(move || { - match kind { - "protocol" => { - url::quirks::set_protocol(&mut url, &new_value).ok(); - } - "username" => { - url::quirks::set_username(&mut url, &new_value).ok(); - } - "password" => { - url::quirks::set_password(&mut url, &new_value).ok(); - } - "host" => { - url::quirks::set_host(&mut url, &new_value).ok(); - } - "hostname" => { - url::quirks::set_hostname(&mut url, &new_value).ok(); - } - "port" => { - url::quirks::set_port(&mut url, &new_value).ok(); - } - "pathname" => url::quirks::set_pathname(&mut url, &new_value), - "search" => url::quirks::set_search(&mut url, &new_value), - "hash" => url::quirks::set_hash(&mut url, &new_value), - _ => panic!("unknown setter kind: {:?}", kind), - }; - url - }) - .map_err(|_| "panicked while setting value".to_string())?; - - if let Some(expected_href) = expected.href { - let href = url::quirks::href(&url); - if href != expected_href { - return Err(format!( - "expected href {:?}, but got {:?}", - expected_href, href - )); - } - } - - if let Some(expected_protocol) = expected.protocol { - let protocol = url::quirks::protocol(&url); - if protocol != expected_protocol { - return Err(format!( - "expected protocol {:?}, but got {:?}", - expected_protocol, protocol - )); - } - } - - if let Some(expected_username) = expected.username { - let username = url::quirks::username(&url); - if username != expected_username { - return Err(format!( - "expected username {:?}, but got {:?}", - expected_username, username - )); - } - } - - if let Some(expected_password) = expected.password { - let password = url::quirks::password(&url); - if password != expected_password { - return Err(format!( - "expected password {:?}, but got {:?}", - expected_password, password - )); - } - } - - if let Some(expected_host) = expected.host { - let host = url::quirks::host(&url); - if host != expected_host { - return Err(format!( - "expected host {:?}, but got {:?}", - expected_host, host - )); - } - } - - if let Some(expected_hostname) = expected.hostname { - let hostname = url::quirks::hostname(&url); - if hostname != expected_hostname { - return Err(format!( - "expected hostname {:?}, but got {:?}", - expected_hostname, hostname - )); - } - } - - if let Some(expected_port) = expected.port { - let port = url::quirks::port(&url); - if port != expected_port { - return Err(format!( - "expected port {:?}, but got {:?}", - expected_port, port - )); - } - } - - if let Some(expected_pathname) = expected.pathname { - let pathname = url::quirks::pathname(&url); - if pathname != expected_pathname { - return Err(format!( - "expected pathname {:?}, but got {:?}", - expected_pathname, pathname - )); - } - } - - if let Some(expected_search) = expected.search { - let search = url::quirks::search(&url); - if search != expected_search { - return Err(format!( - "expected search {:?}, but got {:?}", - expected_search, search - )); - } - } - - if let Some(expected_hash) = expected.hash { - let hash = url::quirks::hash(&url); - if hash != expected_hash { - return Err(format!( - "expected hash {:?}, but got {:?}", - expected_hash, hash - )); - } - } - - Ok(()) -} diff -Nru temporalio-1.3.0/vendor/urlencoding/benches/bench.rs temporalio-1.3.0/vendor/urlencoding/benches/bench.rs --- temporalio-1.3.0/vendor/urlencoding/benches/bench.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/urlencoding/benches/bench.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,65 @@ +#![feature(test)] +extern crate test; + +use urlencoding::*; +use test::Bencher; + +#[bench] +fn bench_enc_nop_short(b: &mut Bencher) { + b.iter(|| { + encode("hello") + }) +} +#[bench] +fn bench_enc_nop_long(b: &mut Bencher) { + b.iter(|| { + encode("Lorem-ipsum-dolor-sit-amet-consectetur-adipisicing-elit-sed-do-eiusmod-tempor-incididunt-ut-labore-et-dolore-magna-aliqua.Ut-enim-ad-minim-veniam-quis-nostrud\ + -exercitation-ullamco-laboris-nisi-ut-aliquip-ex-ea-commodo-consequat.Duis-aute-irure-dolor-in-reprehenderit-in-voluptate-velit-esse-cillum-dolore-eu-fugiat-nulla\ + -pariatur.Excepteur-sint-occaecat-cupidatat-non-proident-sunt-in-culpa-qui-officia-deserunt-mollit-anim-id-est-laborum.") + }) +} + +#[bench] +fn bench_dec_nop_short(b: &mut Bencher) { + b.iter(|| { + decode("hello") + }) +} +#[bench] +fn bench_dec_nop_long(b: &mut Bencher) { + b.iter(|| { + decode("Lorem-ipsum-dolor-sit-amet-consectetur-adipisicing-elit-sed-do-eiusmod-tempor-incididunt-ut-labore-et-dolore-magna-aliqua.Ut-enim-ad-minim-veniam-quis-nostrud\ + -exercitation-ullamco-laboris-nisi-ut-aliquip-ex-ea-commodo-consequat.Duis-aute-irure-dolor-in-reprehenderit-in-voluptate-velit-esse-cillum-dolore-eu-fugiat-nulla\ + -pariatur.Excepteur-sint-occaecat-cupidatat-non-proident-sunt-in-culpa-qui-officia-deserunt-mollit-anim-id-est-laborum.") + }) +} + +#[bench] +fn bench_enc_chg_short(b: &mut Bencher) { + b.iter(|| { + encode("he!!o") + }) +} +#[bench] +fn bench_enc_chg_long(b: &mut Bencher) { + b.iter(|| { + encode("Lorem ipsum dolor sit amet consectetur adipisicing elit sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.Ut enim ad minim veniam quis nostrud\ + exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla\ + pariatur. Excepteur sint occaecat cupidatat non proident sunt in culpa qui officia deserunt mollit anim id est laborum.") + }) +} + +#[bench] +fn bench_dec_chg_short(b: &mut Bencher) { + b.iter(|| { + decode("he%26%26o") + }) +} +#[bench] +fn bench_dec_chg_long(b: &mut Bencher) { + b.iter(|| { + decode("Lorem%20ipsum%20dolor%20sit%20amet%20consectetur%20adipisicing%20elit%20sed%20do%20eiusmod%20tempor%20incididunt%20ut%20labore%20et%20dolore%20magna%20aliqua.Ut%20enim%20ad%20minim%20veniam%20quis%20nostrud\ + %20exercitation%20ullamco%20laboris%20nisi%20ut%20aliquip%20ex%20ea%20commodo%20consequat.Duis%20aute%20irure%20dolor%20in%20reprehenderit%20in%20voluptate%20velit%20esse%20cillum%20dolore%20eu%20fugiat%20nulla\ + %20pariatur.Excepteur%20sint%20occaecat%20cupidatat%20non%20proident%20sunt%20in%20culpa%20qui%20officia%20deserunt%20mollit%20anim%20id%20est%20laborum.") + }) +} diff -Nru temporalio-1.3.0/vendor/urlencoding/.cargo-checksum.json temporalio-1.3.0/vendor/urlencoding/.cargo-checksum.json --- temporalio-1.3.0/vendor/urlencoding/.cargo-checksum.json 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/urlencoding/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1 @@ +{"files":{"Cargo.toml":"7336fe00c121d144202b7e1787fbed8fed38898b160b94bba3e82ab90d31e2a9","LICENSE":"5a952e4a62a3022a7f39e9f0eb8d0638addd3efffb3f4092890923668152296e","README.md":"aef1306cb06344947dfb4e5e0d980303f31500fe95c7526c8bd3247f9cfcc78f","benches/bench.rs":"20a525b93dbe07cec14c29ded08af5df5b73655d5a244d42271a4547a59f90ab","src/dec.rs":"27f7a50d426fd295e88e440358e084bb1b2d54283c6cbbbc99ddce7383bb37a5","src/enc.rs":"50242a4f6b63deb98e016b6a6ebc122f519c4bead7c2c36ccce24d2268541ec8","src/lib.rs":"8be9baf406ede16922deb1947601a6e5405579521fa74fea41d1d3095dfe13de"},"package":"daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/urlencoding/Cargo.toml temporalio-1.3.0/vendor/urlencoding/Cargo.toml --- temporalio-1.3.0/vendor/urlencoding/Cargo.toml 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/urlencoding/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,41 @@ +# 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 = "2021" +name = "urlencoding" +version = "2.1.3" +authors = [ + "Kornel ", + "Bertram Truong ", +] +description = "A Rust library for doing URL percentage encoding." +homepage = "https://lib.rs/urlencoding" +readme = "README.md" +keywords = [ + "url", + "percent", + "escape", + "urlencode", + "urldecode", +] +categories = [ + "encoding", + "web-programming", +] +license = "MIT" +repository = "https://github.com/kornelski/rust_urlencoding" + +[package.metadata.docs.rs] +targets = ["x86_64-unknown-linux-gnu"] + +[badges.maintenance] +status = "looking-for-maintainer" diff -Nru temporalio-1.3.0/vendor/urlencoding/LICENSE temporalio-1.3.0/vendor/urlencoding/LICENSE --- temporalio-1.3.0/vendor/urlencoding/LICENSE 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/urlencoding/LICENSE 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,20 @@ +© 2016 Bertram Truong +© 2021 Kornel LesiÅ„ski + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff -Nru temporalio-1.3.0/vendor/urlencoding/README.md temporalio-1.3.0/vendor/urlencoding/README.md --- temporalio-1.3.0/vendor/urlencoding/README.md 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/urlencoding/README.md 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,44 @@ +# urlencoding + +[![Latest Version](https://img.shields.io/crates/v/urlencoding.svg)](https://lib.rs/crates/urlencoding) + +A tiny Rust library for doing URL percentage encoding and decoding. It percent-encodes everything except alphanumerics and `-`, `_`, `.`, `~`. + +When decoding `+` is not treated as a space. Error recovery from incomplete percent-escapes follows the [WHATWG URL standard](https://url.spec.whatwg.org/). + +## Usage + +To encode a string, do the following: + +```rust +use urlencoding::encode; + +let encoded = encode("This string will be URL encoded."); +println!("{}", encoded); +// This%20string%20will%20be%20URL%20encoded. +``` + +To decode a string, it's only slightly different: + +```rust +use urlencoding::decode; + +let decoded = decode("%F0%9F%91%BE%20Exterminate%21")?; +println!("{}", decoded); +// 👾 Exterminate! +``` + +To decode allowing arbitrary bytes and invalid UTF-8: + +```rust +use urlencoding::decode_binary; + +let binary = decode_binary(b"%F1%F2%F3%C0%C1%C2"); +let decoded = String::from_utf8_lossy(&binary); +``` + +This library returns [`Cow`](https://doc.rust-lang.org/stable/std/borrow/enum.Cow.html) to avoid allocating when decoding/encoding is not needed. Call `.into_owned()` on the `Cow` to get a `Vec` or `String`. + +## License + +This project is licensed under the MIT license. For more information see the `LICENSE` file. diff -Nru temporalio-1.3.0/vendor/urlencoding/src/dec.rs temporalio-1.3.0/vendor/urlencoding/src/dec.rs --- temporalio-1.3.0/vendor/urlencoding/src/dec.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/urlencoding/src/dec.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,109 @@ +use std::borrow::Cow; +use std::string::FromUtf8Error; + +#[inline] +pub(crate) fn from_hex_digit(digit: u8) -> Option { + match digit { + b'0'..=b'9' => Some(digit - b'0'), + b'A'..=b'F' => Some(digit - b'A' + 10), + b'a'..=b'f' => Some(digit - b'a' + 10), + _ => None, + } +} + +/// Decode percent-encoded string assuming UTF-8 encoding. +/// +/// If you need a `String`, call `.into_owned()` (not `.to_owned()`). +/// +/// Unencoded `+` is preserved literally, and _not_ changed to a space. +pub fn decode(data: &str) -> Result, FromUtf8Error> { + match decode_binary(data.as_bytes()) { + Cow::Borrowed(_) => Ok(Cow::Borrowed(data)), + Cow::Owned(s) => Ok(Cow::Owned(String::from_utf8(s)?)), + } +} + +/// Decode percent-encoded string as binary data, in any encoding. +/// +/// Unencoded `+` is preserved literally, and _not_ changed to a space. +pub fn decode_binary(data: &[u8]) -> Cow<[u8]> { + let offset = data.iter().take_while(|&&c| c != b'%').count(); + if offset >= data.len() { + return Cow::Borrowed(data) + } + + let mut decoded: Vec = Vec::with_capacity(data.len()); + let mut out = NeverRealloc(&mut decoded); + + let (ascii, mut data) = data.split_at(offset); + out.extend_from_slice(ascii); + + loop { + let mut parts = data.splitn(2, |&c| c == b'%'); + // first the decoded non-% part + let non_escaped_part = parts.next().unwrap(); + let rest = parts.next(); + if rest.is_none() && out.0.is_empty() { + // if empty there were no '%' in the string + return data.into(); + } + out.extend_from_slice(non_escaped_part); + + // then decode one %xx + match rest { + Some(rest) => match rest.get(0..2) { + Some(&[first, second]) => match from_hex_digit(first) { + Some(first_val) => match from_hex_digit(second) { + Some(second_val) => { + out.push((first_val << 4) | second_val); + data = &rest[2..]; + }, + None => { + out.extend_from_slice(&[b'%', first]); + data = &rest[1..]; + }, + }, + None => { + out.push(b'%'); + data = rest; + }, + }, + _ => { + // too short + out.push(b'%'); + out.extend_from_slice(rest); + break; + }, + }, + None => break, + } + } + Cow::Owned(decoded) +} + + +struct NeverRealloc<'a, T>(pub &'a mut Vec); + +impl NeverRealloc<'_, T> { + #[inline] + pub fn push(&mut self, val: T) { + // these branches only exist to remove redundant reallocation code + // (the capacity is always sufficient) + if self.0.len() != self.0.capacity() { + self.0.push(val); + } + } + #[inline] + pub fn extend_from_slice(&mut self, val: &[T]) where T: Clone { + if self.0.capacity() - self.0.len() >= val.len() { + self.0.extend_from_slice(val); + } + } +} + +#[test] +fn dec_borrows() { + assert!(matches!(decode("hello"), Ok(Cow::Borrowed("hello")))); + assert!(matches!(decode("hello%20"), Ok(Cow::Owned(s)) if s == "hello ")); + assert!(matches!(decode("%20hello"), Ok(Cow::Owned(s)) if s == " hello")); +} diff -Nru temporalio-1.3.0/vendor/urlencoding/src/enc.rs temporalio-1.3.0/vendor/urlencoding/src/enc.rs --- temporalio-1.3.0/vendor/urlencoding/src/enc.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/urlencoding/src/enc.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,139 @@ +use std::borrow::Cow; +use std::fmt; +use std::io; +use std::str; + +/// Wrapper type that implements `Display`. Encodes on the fly, without allocating. +/// Percent-encodes every byte except alphanumerics and `-`, `_`, `.`, `~`. Assumes UTF-8 encoding. +/// +/// ```rust +/// use urlencoding::Encoded; +/// format!("{}", Encoded("hello!")); +/// ``` +#[derive(Copy, Clone, Debug, Eq, PartialEq, Hash, Ord, PartialOrd)] +#[repr(transparent)] +pub struct Encoded(pub Str); + +impl> Encoded { + /// Long way of writing `Encoded(data)` + /// + /// Takes any string-like type or a slice of bytes, either owned or borrowed. + #[inline(always)] + pub fn new(string: Str) -> Self { + Self(string) + } + + #[inline(always)] + pub fn to_str(&self) -> Cow { + encode_binary(self.0.as_ref()) + } + + /// Perform urlencoding to a string + #[inline] + #[allow(clippy::inherent_to_string_shadow_display)] + pub fn to_string(&self) -> String { + self.to_str().into_owned() + } + + /// Perform urlencoding into a writer + #[inline] + pub fn write(&self, writer: &mut W) -> io::Result<()> { + encode_into(self.0.as_ref(), false, |s| writer.write_all(s.as_bytes()))?; + Ok(()) + } + + /// Perform urlencoding into a string + #[inline] + pub fn append_to(&self, string: &mut String) { + append_string(self.0.as_ref(), string, false); + } +} + +impl<'a> Encoded<&'a str> { + /// Same as new, but hints a more specific type, so you can avoid errors about `AsRef<[u8]>` not implemented + /// on references-to-references. + #[inline(always)] + pub fn str(string: &'a str) -> Self { + Self(string) + } +} + +impl> fmt::Display for Encoded { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + encode_into(self.0.as_ref(), false, |s| f.write_str(s))?; + Ok(()) + } +} + +/// Percent-encodes every byte except alphanumerics and `-`, `_`, `.`, `~`. Assumes UTF-8 encoding. +/// +/// Call `.into_owned()` if you need a `String` +#[inline(always)] +pub fn encode(data: &str) -> Cow { + encode_binary(data.as_bytes()) +} + +/// Percent-encodes every byte except alphanumerics and `-`, `_`, `.`, `~`. +#[inline] +pub fn encode_binary(data: &[u8]) -> Cow { + // add maybe extra capacity, but try not to exceed allocator's bucket size + let mut escaped = String::with_capacity(data.len() | 15); + let unmodified = append_string(data, &mut escaped, true); + if unmodified { + return Cow::Borrowed(unsafe { + // encode_into has checked it's ASCII + str::from_utf8_unchecked(data) + }); + } + Cow::Owned(escaped) +} + +fn append_string(data: &[u8], escaped: &mut String, may_skip: bool) -> bool { + encode_into(data, may_skip, |s| { + escaped.push_str(s); + Ok::<_, std::convert::Infallible>(()) + }).unwrap() +} + +fn encode_into(mut data: &[u8], may_skip_write: bool, mut push_str: impl FnMut(&str) -> Result<(), E>) -> Result { + let mut pushed = false; + loop { + // Fast path to skip over safe chars at the beginning of the remaining string + let ascii_len = data.iter() + .take_while(|&&c| matches!(c, b'0'..=b'9' | b'A'..=b'Z' | b'a'..=b'z' | b'-' | b'.' | b'_' | b'~')).count(); + + let (safe, rest) = if ascii_len >= data.len() { + if !pushed && may_skip_write { + return Ok(true); + } + (data, &[][..]) // redundatnt to optimize out a panic in split_at + } else { + data.split_at(ascii_len) + }; + pushed = true; + if !safe.is_empty() { + push_str(unsafe { str::from_utf8_unchecked(safe) })?; + } + if rest.is_empty() { + break; + } + + match rest.split_first() { + Some((byte, rest)) => { + let enc = &[b'%', to_hex_digit(byte >> 4), to_hex_digit(byte & 15)]; + push_str(unsafe { str::from_utf8_unchecked(enc) })?; + data = rest; + } + None => break, + }; + } + Ok(false) +} + +#[inline] +fn to_hex_digit(digit: u8) -> u8 { + match digit { + 0..=9 => b'0' + digit, + 10..=255 => b'A' - 10 + digit, + } +} diff -Nru temporalio-1.3.0/vendor/urlencoding/src/lib.rs temporalio-1.3.0/vendor/urlencoding/src/lib.rs --- temporalio-1.3.0/vendor/urlencoding/src/lib.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/urlencoding/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,133 @@ +//! To encode a string, do the following: +//! +//! ```rust +//! use urlencoding::encode; +//! +//! let encoded = encode("This string will be URL encoded."); +//! println!("{}", encoded); +//! // This%20string%20will%20be%20URL%20encoded. +//! ``` +//! +//! To decode a string, it's only slightly different: +//! +//! ```rust +//! use urlencoding::decode; +//! +//! let decoded = decode("%F0%9F%91%BE%20Exterminate%21").expect("UTF-8"); +//! println!("{}", decoded); +//! // 👾 Exterminate! +//! ``` +//! +//! To decode allowing arbitrary bytes and invalid UTF-8: +//! +//! ```rust +//! use urlencoding::decode_binary; +//! +//! let binary = decode_binary(b"%F1%F2%F3%C0%C1%C2"); +//! let decoded = String::from_utf8_lossy(&binary); +//! ``` +//! +//! This library returns [`Cow`](https://doc.rust-lang.org/stable/std/borrow/enum.Cow.html) to avoid allocating when decoding/encoding is not needed. Call `.into_owned()` on the `Cow` to get a `Vec` or `String`. + +mod enc; +pub use enc::encode; +pub use enc::encode_binary; +pub use enc::Encoded; + +mod dec; +pub use dec::decode; +pub use dec::decode_binary; + +#[cfg(test)] +mod tests { + use super::*; + use crate::dec::from_hex_digit; + + #[test] + fn it_encodes_successfully() { + let expected = "this%20that"; + assert_eq!(expected, encode("this that")); + } + + #[test] + fn it_encodes_successfully_emoji() { + let emoji_string = "👾 Exterminate!"; + let expected = "%F0%9F%91%BE%20Exterminate%21"; + assert_eq!(expected, encode(emoji_string)); + } + + #[test] + fn it_decodes_successfully() { + let expected = String::from("this that"); + let encoded = "this%20that"; + assert_eq!(expected, decode(encoded).unwrap()); + } + + #[test] + fn it_decodes_successfully_emoji() { + let expected = String::from("👾 Exterminate!"); + let encoded = "%F0%9F%91%BE%20Exterminate%21"; + assert_eq!(expected, decode(encoded).unwrap()); + } + + #[test] + fn it_decodes_unsuccessfully_emoji() { + let bad_encoded_string = "👾 Exterminate!"; + + assert_eq!(bad_encoded_string, decode(bad_encoded_string).unwrap()); + } + + + #[test] + fn misc() { + assert_eq!(3, from_hex_digit(b'3').unwrap()); + assert_eq!(10, from_hex_digit(b'a').unwrap()); + assert_eq!(15, from_hex_digit(b'F').unwrap()); + assert_eq!(None, from_hex_digit(b'G')); + assert_eq!(None, from_hex_digit(9)); + + assert_eq!("pureascii", encode("pureascii")); + assert_eq!("pureascii", decode("pureascii").unwrap()); + assert_eq!("", encode("")); + assert_eq!("", decode("").unwrap()); + assert_eq!("%26a%25b%21c.d%3Fe", encode("&a%b!c.d?e")); + assert_eq!("%00", encode("\0")); + assert_eq!("%00x", encode("\0x")); + assert_eq!("x%00", encode("x\0")); + assert_eq!("x%00x", encode("x\0x")); + assert_eq!("aa%00%00bb", encode("aa\0\0bb")); + assert_eq!("\0", decode("\0").unwrap()); + assert!(decode("%F0%0F%91%BE%20Hello%21").is_err()); + assert_eq!("this that", decode("this%20that").unwrap()); + assert_eq!("this that%", decode("this%20that%").unwrap()); + assert_eq!("this that%2", decode("this%20that%2").unwrap()); + assert_eq!("this that%%", decode("this%20that%%").unwrap()); + assert_eq!("this that%2%", decode("this%20that%2%").unwrap()); + assert_eq!("this%2that", decode("this%2that").unwrap()); + assert_eq!("this%%2that", decode("this%%2that").unwrap()); + assert_eq!("this%2x&that", decode("this%2x%26that").unwrap()); + // assert_eq!("this%2&that", decode("this%2%26that").unwrap()); + } + + #[test] + fn lazy_writer() { + let mut s = "he".to_string(); + Encoded("llo").append_to(&mut s); + assert_eq!("hello", s); + + assert_eq!("hello", Encoded("hello").to_string()); + assert_eq!("hello", format!("{}", Encoded("hello"))); + assert_eq!("hello", Encoded("hello").to_str()); + assert!(matches!(Encoded("hello").to_str(), std::borrow::Cow::Borrowed(_))); + } + + #[test] + fn whatwg_examples() { + assert_eq!(*decode_binary(b"%25%s%1G"), b"%%s%1G"[..]); + assert_eq!(*decode_binary("‽%25%2E".as_bytes()), b"\xE2\x80\xBD\x25\x2E"[..]); + assert_eq!(encode("≡"), "%E2%89%A1"); + assert_eq!(encode("‽"), "%E2%80%BD"); + assert_eq!(encode("Say what‽"), "Say%20what%E2%80%BD"); + } + +} diff -Nru temporalio-1.3.0/vendor/uuid/.cargo-checksum.json temporalio-1.3.0/vendor/uuid/.cargo-checksum.json --- temporalio-1.3.0/vendor/uuid/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/uuid/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"CODE_OF_CONDUCT.md":"b360d72c37ca9eee599c13d4f7f4b95707c6414634e67befc6a63c1d430d299c","CONTRIBUTING.md":"6d9f750f7dca0ca8012d13b4a72f05ec52981fd9fab374087cefb7a4d4dcff51","COPYRIGHT":"b4b2c0de2a05de3372d5c828128413ce82bb7dba2272487b7729f09cc3d3519d","Cargo.lock":"5e7c8fed1ed631f7ccd3b7e0883f48a1c0be83251f7f2dc0765e904d083af546","Cargo.toml":"e6def5146d48b02ba6dd93746d6bf3e7cac1aca592d0cc1049cadb5f14c962c2","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"436bc5a105d8e57dcd8778730f3754f7bf39c14d2f530e4cde4bd2d17a83ec3d","README.md":"c24796f721374a83e7a1bf2036f4940bb12fdabf5690758f5c533b924c99d990","SECURITY.md":"64b91c6b5c428c9623d99a825c7e513965de3695bfa0105a348deaa8c678d767","benches/format_str.rs":"f1320973392ce1cd0f0988747c6b4253d3b4ce34cf742dd558efad86f88a81e5","benches/parse_str.rs":"4e9e2f881c609ccdce502a6490e6b5f06cd8954e44f8a1b98d6c0e22f53a15d5","benches/v4.rs":"f59d7180882e12cb09761d941d7bece9690a97f7f29181e2692b38012b6363d7","examples/random_uuid.rs":"11c4cb0c9b04bb5512a5b34be50ae6a3cbe25d4a1052443f9b6a55484e0962e5","examples/sortable_uuid.rs":"290cfb07320ff8c966df30cbd505b62b491d43c0290e9db606d2850bf916da1c","examples/uuid_macro.rs":"75178c9756da545f94e31f9d322e9a97d8f76a08326f26f2d014088cb42e4ebf","examples/windows_guid.rs":"2e2a21779aec9772a7f0c9ec475b5dc44835640cb104352134986e809f0f7f59","src/builder.rs":"3207748200742242e54a0c4028d0a3549f03757acc52d9b552e8c991b8bc5a02","src/error.rs":"621799694111aab9d6e570290f4d1b341fe6be58d2b3425fa7891ada7575cab7","src/external.rs":"0f85a2ab77744b692c7a87cda1a92663678994c777fdfb036aa4a2a1fd1b7419","src/external/arbitrary_support.rs":"7e7fbcc4b8af5878b71858a1f5fa31e85d84fc2fd159614f8d450ba1fe06ac28","src/external/borsh_support.rs":"8ce22418e304ee6aab4b6f30ddaaffa6f8f4b6146e1435e8623718a87cccb3b3","src/external/serde_support.rs":"1263176b9916bf61fe3ab32140c22e2e757ea29ffff6f5459b1b720acbe2ed9d","src/external/slog_support.rs":"53c6251e424bdc9b6ba35defb4c723d4d34d44053badbf98e1c7c3e7c83fbb5e","src/fmt.rs":"3bf88d68d838bef81380a1e669a86eee46f24a8113effbd7b4e92da714ec97c7","src/lib.rs":"1a1f747188dc9ef8d6804332580c0ff6e95eb38e5d2cd7c7a48f9b2560505096","src/macros.rs":"e80c03a203da5d0ef5172a7c7aae1510af8c2b6830fda2dc82292a75dce60dc3","src/md5.rs":"227a753edc428499108e6f25074bbeb6a80d55f52e18c717a1d88831ae77066a","src/parser.rs":"06c4bfdd6b74db9469a516f7015d328b1f1bd2750f609423c47e308bf98e8706","src/rng.rs":"b9f69610560aa5b5d9b2eaa16fb2239515bd163da126cf5c392e5fb9b0296c3e","src/sha1.rs":"e1a9657e11f1ed1ede33c0655f9c2641059b7c24f17be4ac425c930cc216e019","src/timestamp.rs":"0d3a44bf928141388ce8fe6c13fd6b5018ea5f1cf07ecc35102153e47f774f9e","src/v1.rs":"123c4b23d0458e77e6c3ed6235e0c786436e53f53d1c8074cf80d77c2ae40611","src/v3.rs":"b7d605c4d2f56a9e57bfe779ef2488fa612c7cb28568f68252093f48ac2edef4","src/v4.rs":"4f06567460871348df0ff2825e9faad9d950a9337e409cb2b568c86118addb97","src/v5.rs":"64e3feb673c8411954f930188e756803b90b57d13ec36652cd2c669e81654333","src/v6.rs":"5989c5baeed2888bb91c4544d33a788ba206b0623fc23f276792e523d7bd4265","src/v7.rs":"e46924c0c9c9b1ac6746180d78cd3531920fbd8379f1629abdcec7914bae36c8","src/v8.rs":"8705405fef52e4706c7cf99f7ed231dde733b7cd08ced79be9e29c949be2280f","tests/macros.rs":"5dc3b4a3f0fdcedb47f680f0534d4074bab3a4b26257d8a4f89e9eaad3e6bca7","tests/ui/compile_fail/invalid_parse.rs":"eb81a6a1be99bcce58afa15e2cacab3e7d64f628d3eb31897d2a13feffb2032f","tests/ui/compile_fail/invalid_parse.stderr":"a0d2f080cf64a965028b2044f775d4f75fc541f560ec75baf783231590cd429e","tests/ui/compile_pass/hygiene.rs":"4cab37cb46a3e7b97ee1ca35d6e76f137f5a2d4e6159e33f16f469ad8e285e83","tests/ui/compile_pass/renamed.rs":"f2bd73151e605035051d3aaf572133861457e6d199d0ff7ede748fc6c0f44c7b","tests/ui/compile_pass/valid.rs":"a0cfeeae38dc78151ecc21ad801e56d61993a7e393e0943a6b06f2811e004135"},"package":"88ad59a7560b41a70d191093a945f0b87bc1deeda46fb237479708a1d6b6cdfc"} \ No newline at end of file +{"files":{"CODE_OF_CONDUCT.md":"b360d72c37ca9eee599c13d4f7f4b95707c6414634e67befc6a63c1d430d299c","CONTRIBUTING.md":"be72ea4c22c397964f6f44b10562c4ad485dc1cc24b3dcca951e49907439d9ac","COPYRIGHT":"b4b2c0de2a05de3372d5c828128413ce82bb7dba2272487b7729f09cc3d3519d","Cargo.lock":"a7c3dd7428600ba86c28d4a6888f766b236ebef0bbe7dd52c2eca9f15a96ccb5","Cargo.toml":"562655f2569e03da35fabd2a79c6f65339a3416ddb8918e060598c79e545b93c","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"436bc5a105d8e57dcd8778730f3754f7bf39c14d2f530e4cde4bd2d17a83ec3d","README.md":"1f4d9b619fab32f9ebefc9ae2372f21f5be4d802bdbfda1c5ecc72134d618730","SECURITY.md":"64b91c6b5c428c9623d99a825c7e513965de3695bfa0105a348deaa8c678d767","benches/format_str.rs":"f1320973392ce1cd0f0988747c6b4253d3b4ce34cf742dd558efad86f88a81e5","benches/parse_str.rs":"4e9e2f881c609ccdce502a6490e6b5f06cd8954e44f8a1b98d6c0e22f53a15d5","benches/v4.rs":"f59d7180882e12cb09761d941d7bece9690a97f7f29181e2692b38012b6363d7","examples/random_uuid.rs":"11c4cb0c9b04bb5512a5b34be50ae6a3cbe25d4a1052443f9b6a55484e0962e5","examples/sortable_uuid.rs":"290cfb07320ff8c966df30cbd505b62b491d43c0290e9db606d2850bf916da1c","examples/uuid_macro.rs":"75178c9756da545f94e31f9d322e9a97d8f76a08326f26f2d014088cb42e4ebf","examples/windows_guid.rs":"2e2a21779aec9772a7f0c9ec475b5dc44835640cb104352134986e809f0f7f59","src/builder.rs":"3207748200742242e54a0c4028d0a3549f03757acc52d9b552e8c991b8bc5a02","src/error.rs":"621799694111aab9d6e570290f4d1b341fe6be58d2b3425fa7891ada7575cab7","src/external.rs":"0f85a2ab77744b692c7a87cda1a92663678994c777fdfb036aa4a2a1fd1b7419","src/external/arbitrary_support.rs":"7e7fbcc4b8af5878b71858a1f5fa31e85d84fc2fd159614f8d450ba1fe06ac28","src/external/borsh_support.rs":"8ce22418e304ee6aab4b6f30ddaaffa6f8f4b6146e1435e8623718a87cccb3b3","src/external/serde_support.rs":"1263176b9916bf61fe3ab32140c22e2e757ea29ffff6f5459b1b720acbe2ed9d","src/external/slog_support.rs":"53c6251e424bdc9b6ba35defb4c723d4d34d44053badbf98e1c7c3e7c83fbb5e","src/fmt.rs":"d66a735d72a4c94629dbd18327e7b9c31aa26c0f0017ed67787b3291413f4f8f","src/lib.rs":"d77c1180d75c240447ba53308ac6b3ac8ce9d13092fa3d4147d95dbeceb57a17","src/macros.rs":"e80c03a203da5d0ef5172a7c7aae1510af8c2b6830fda2dc82292a75dce60dc3","src/md5.rs":"227a753edc428499108e6f25074bbeb6a80d55f52e18c717a1d88831ae77066a","src/parser.rs":"06c4bfdd6b74db9469a516f7015d328b1f1bd2750f609423c47e308bf98e8706","src/rng.rs":"b9f69610560aa5b5d9b2eaa16fb2239515bd163da126cf5c392e5fb9b0296c3e","src/sha1.rs":"e1a9657e11f1ed1ede33c0655f9c2641059b7c24f17be4ac425c930cc216e019","src/timestamp.rs":"69966d6bf19820a0513cfd75b0163804842e8444a43b64665166a7366498f448","src/v1.rs":"d56d323df879d6526fa3cd5ff329b8ea1a306cd880474ad4b2e017659b7662ec","src/v3.rs":"b7d605c4d2f56a9e57bfe779ef2488fa612c7cb28568f68252093f48ac2edef4","src/v4.rs":"4f06567460871348df0ff2825e9faad9d950a9337e409cb2b568c86118addb97","src/v5.rs":"64e3feb673c8411954f930188e756803b90b57d13ec36652cd2c669e81654333","src/v6.rs":"9f7e41470629c4f011625896421bfcc4e6eedc85e0959af0808a5ac34381ab84","src/v7.rs":"e46924c0c9c9b1ac6746180d78cd3531920fbd8379f1629abdcec7914bae36c8","src/v8.rs":"8705405fef52e4706c7cf99f7ed231dde733b7cd08ced79be9e29c949be2280f","tests/macros.rs":"5dc3b4a3f0fdcedb47f680f0534d4074bab3a4b26257d8a4f89e9eaad3e6bca7","tests/ui/compile_fail/invalid_parse.rs":"eb81a6a1be99bcce58afa15e2cacab3e7d64f628d3eb31897d2a13feffb2032f","tests/ui/compile_fail/invalid_parse.stderr":"a0d2f080cf64a965028b2044f775d4f75fc541f560ec75baf783231590cd429e","tests/ui/compile_pass/hygiene.rs":"4cab37cb46a3e7b97ee1ca35d6e76f137f5a2d4e6159e33f16f469ad8e285e83","tests/ui/compile_pass/renamed.rs":"f2bd73151e605035051d3aaf572133861457e6d199d0ff7ede748fc6c0f44c7b","tests/ui/compile_pass/valid.rs":"a0cfeeae38dc78151ecc21ad801e56d61993a7e393e0943a6b06f2811e004135"},"package":"79daa5ed5740825c40b389c5e50312b9c86df53fccd33f281df655642b43869d"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/uuid/Cargo.lock temporalio-1.3.0/vendor/uuid/Cargo.lock --- temporalio-1.3.0/vendor/uuid/Cargo.lock 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/uuid/Cargo.lock 2023-10-30 19:40:00.000000000 +0000 @@ -15,9 +15,9 @@ [[package]] name = "arbitrary" -version = "1.3.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2e1373abdaa212b704512ec2bd8b26bd0b7d5c3f70117411a5d9a451383c859" +checksum = "e2d098ff73c1ca148721f37baad5ea6a465a13f9573aba8641fbbbae8164a54e" [[package]] name = "atomic" @@ -99,35 +99,15 @@ [[package]] name = "bumpalo" -version = "3.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" - -[[package]] -name = "bytemuck" -version = "1.14.0" +version = "3.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "374d28ec25809ee0e23827c2ab573d729e293f281dfe393500e7ad618baa61c6" -dependencies = [ - "bytemuck_derive", -] - -[[package]] -name = "bytemuck_derive" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "965ab7eb5f8f97d2a083c799f3a1b994fc397b2fe2da5d1da1626ce15a39f2b1" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.38", -] +checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" [[package]] name = "byteorder" -version = "1.5.0" +version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" [[package]] name = "cfg-if" @@ -220,23 +200,22 @@ [[package]] name = "libc" -version = "0.2.149" +version = "0.2.147" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a08173bc88b7955d1b3145aa561539096c421ac8debde8cbc3612ec635fee29b" +checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" [[package]] name = "log" -version = "0.4.20" +version = "0.4.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" [[package]] name = "md-5" -version = "0.10.6" +version = "0.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +checksum = "6365506850d44bff6e2fbcb5176cf63650e48bd45ef2fe2665ae1570e0f4b9ca" dependencies = [ - "cfg-if", "digest", ] @@ -263,18 +242,18 @@ [[package]] name = "proc-macro2" -version = "1.0.69" +version = "1.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da" +checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.33" +version = "1.0.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +checksum = "5fe8a65d69dd0808184ebb5f836ab526bb259db23c657efa38711b1072ee47f0" dependencies = [ "proc-macro2", ] @@ -329,29 +308,26 @@ [[package]] name = "serde" -version = "1.0.189" +version = "1.0.171" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e422a44e74ad4001bdc8eede9a4570ab52f71190e9c076d14369f38b9200537" -dependencies = [ - "serde_derive", -] +checksum = "30e27d1e4fd7659406c492fd6cfaf2066ba8773de45ca75e855590f856dc34a9" [[package]] name = "serde_derive" -version = "1.0.189" +version = "1.0.171" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e48d1f918009ce3145511378cf68d613e3b3d9137d67272562080d68a2b32d5" +checksum = "389894603bd18c46fa56231694f8d827779c0951a667087194cf9de94ed24682" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.26", ] [[package]] name = "serde_json" -version = "1.0.107" +version = "1.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b420ce6e3d8bd882e9b243c6eed35dbc9a6110c9769e74b584e0d68d1f20c65" +checksum = "d03b412469450d4404fe8499a268edd7f8b79fecb074b0d812ad64ca21f4031b" dependencies = [ "itoa", "ryu", @@ -360,9 +336,9 @@ [[package]] name = "serde_test" -version = "1.0.176" +version = "1.0.171" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a2f49ace1498612d14f7e0b8245519584db8299541dfe31a06374a828d620ab" +checksum = "b6480a2f4e1449ec9757ea143362ad5cea79bc7f1cb7711c06e1c5d03b6b5a3a" dependencies = [ "serde", ] @@ -392,9 +368,9 @@ [[package]] name = "syn" -version = "2.0.38" +version = "2.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e96b79aaa137db8f61e26363a0c9b47d8b4ec75da28b7d1d614c2303e232408b" +checksum = "45c3457aacde3c65315de5031ec191ce46604304d2446e803d71ade03308d970" dependencies = [ "proc-macro2", "quote", @@ -403,9 +379,9 @@ [[package]] name = "termcolor" -version = "1.3.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6093bad37da69aab9d123a8091e4be0aa4a03e4d601ec641c327398315f62b64" +checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" dependencies = [ "winapi-util", ] @@ -421,9 +397,9 @@ [[package]] name = "trybuild" -version = "1.0.85" +version = "1.0.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "196a58260a906cedb9bf6d8034b6379d0c11f552416960452f267402ceeddff1" +checksum = "04366e99ff743345622cd00af2af01d711dc2d1ef59250d7347698d21b546729" dependencies = [ "basic-toml", "glob", @@ -436,25 +412,24 @@ [[package]] name = "typenum" -version = "1.17.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" [[package]] name = "uuid" -version = "1.5.0" +version = "1.4.1" dependencies = [ "arbitrary", "atomic", "bincode", "borsh", - "bytemuck", "getrandom", "md-5", "rand", @@ -475,13 +450,13 @@ [[package]] name = "uuid-macro-internal" -version = "1.5.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d8c6bba9b149ee82950daefc9623b32bb1dacbfb1890e352f6b887bd582adaf" +checksum = "f7e1ba1f333bd65ce3c9f27de592fcbc256dafe3af2717f56d7c87761fbaccf4" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.26", ] [[package]] @@ -517,7 +492,7 @@ "once_cell", "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.26", "wasm-bindgen-shared", ] @@ -551,7 +526,7 @@ dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.26", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -614,9 +589,9 @@ [[package]] name = "winapi-util" -version = "0.1.6" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" dependencies = [ "winapi", ] @@ -638,9 +613,9 @@ [[package]] name = "windows-targets" -version = "0.48.5" +version = "0.48.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" dependencies = [ "windows_aarch64_gnullvm", "windows_aarch64_msvc", @@ -653,51 +628,51 @@ [[package]] name = "windows_aarch64_gnullvm" -version = "0.48.5" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" +checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" [[package]] name = "windows_aarch64_msvc" -version = "0.48.5" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" +checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" [[package]] name = "windows_i686_gnu" -version = "0.48.5" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" +checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" [[package]] name = "windows_i686_msvc" -version = "0.48.5" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" +checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" [[package]] name = "windows_x86_64_gnu" -version = "0.48.5" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" +checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" [[package]] name = "windows_x86_64_gnullvm" -version = "0.48.5" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" +checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" [[package]] name = "windows_x86_64_msvc" -version = "0.48.5" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" +checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" [[package]] name = "zerocopy" -version = "0.6.4" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20707b61725734c595e840fb3704378a0cd2b9c74cc9e6e20724838fc6a1e2f9" +checksum = "332f188cc1bcf1fe1064b8c58d150f497e697f49774aa846f2dc949d9a25f236" dependencies = [ "byteorder", "zerocopy-derive", @@ -705,11 +680,11 @@ [[package]] name = "zerocopy-derive" -version = "0.6.4" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56097d5b91d711293a42be9289403896b68654625021732067eac7a4ca388a1f" +checksum = "6505e6815af7de1746a08f69c69606bb45695a17149517680f3b2149713b19a3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 1.0.109", ] diff -Nru temporalio-1.3.0/vendor/uuid/Cargo.toml temporalio-1.3.0/vendor/uuid/Cargo.toml --- temporalio-1.3.0/vendor/uuid/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/uuid/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -11,9 +11,8 @@ [package] edition = "2018" -rust-version = "1.57.0" name = "uuid" -version = "1.5.0" +version = "1.4.1" authors = [ "Ashley Mannix", "Christopher Armstrong", @@ -89,11 +88,6 @@ version = "0.10.3" optional = true -[dependencies.bytemuck] -version = "1.14.0" -features = ["derive"] -optional = true - [dependencies.getrandom] version = "0.2" optional = true @@ -126,7 +120,7 @@ optional = true [dependencies.uuid-macro-internal] -version = "1.5.0" +version = "1.4.1" optional = true package = "uuid-macro-internal" diff -Nru temporalio-1.3.0/vendor/uuid/CONTRIBUTING.md temporalio-1.3.0/vendor/uuid/CONTRIBUTING.md --- temporalio-1.3.0/vendor/uuid/CONTRIBUTING.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/uuid/CONTRIBUTING.md 2023-10-30 19:40:00.000000000 +0000 @@ -60,6 +60,9 @@ File your issue with a descriptive title, as this helps others find your issue. +Reporting a bug is as easy as following [this link][Bug Report Link] and +filling it in. + Sometimes a backtrace may be needed. In that case, set `RUST_BACKTRACE` environment variable to `1`. For example: @@ -70,6 +73,8 @@ > We welcome pull requests for your own bug reports, provided they have been discussed. +[Bug Report Link]: https://github.com/uuid-rs/uuid/issues/new?template=Bug_report.md + # Pull Requests [Pull Requests]: #pull-requests diff -Nru temporalio-1.3.0/vendor/uuid/README.md temporalio-1.3.0/vendor/uuid/README.md --- temporalio-1.3.0/vendor/uuid/README.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/uuid/README.md 2023-10-30 19:40:00.000000000 +0000 @@ -1,6 +1,7 @@ # `uuid` [![Latest Version](https://img.shields.io/crates/v/uuid.svg)](https://crates.io/crates/uuid) +![Minimum rustc version](https://img.shields.io/badge/rustc-1.46.0+-yellow.svg) [![Continuous integration](https://github.com/uuid-rs/uuid/actions/workflows/ci.yml/badge.svg)](https://github.com/uuid-rs/uuid/actions/workflows/ci.yml) Here's an example of a UUID: @@ -28,7 +29,7 @@ ```toml [dependencies.uuid] -version = "1.5.0" +version = "1.4.1" features = [ "v4", # Lets you generate random UUIDs "fast-rng", # Use a faster (but still sufficiently random) RNG @@ -65,11 +66,16 @@ If you'd like to parse UUIDs _really_ fast, check out the [`uuid-simd`](https://github.com/nugine/uuid-simd) library. -For more details on using `uuid`, [see the library documentation](https://docs.rs/uuid/1.5.0/uuid). +For more details on using `uuid`, [see the library documentation](https://docs.rs/uuid/1.4.1/uuid). + +## Minimum Supported Rust Version (MSRV) + +The minimum supported Rust version for `uuid` is documented in +CI. It may be bumped in minor releases as necessary. ## References -* [`uuid` library docs](https://docs.rs/uuid/1.5.0/uuid). +* [`uuid` library docs](https://docs.rs/uuid/1.4.1/uuid). * [Wikipedia: Universally Unique Identifier](http://en.wikipedia.org/wiki/Universally_unique_identifier). * [RFC4122: A Universally Unique IDentifier (UUID) URN Namespace](http://tools.ietf.org/html/rfc4122). @@ -90,4 +96,4 @@ Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall -be dual licensed as above, without any additional terms or conditions. +be dual licensed as above, without any additional terms or conditions. \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/uuid/src/fmt.rs temporalio-1.3.0/vendor/uuid/src/fmt.rs --- temporalio-1.3.0/vendor/uuid/src/fmt.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/uuid/src/fmt.rs 2023-10-30 19:40:00.000000000 +0000 @@ -16,9 +16,6 @@ Uuid, Variant, }; -#[cfg(feature = "std")] -use crate::std::string::{String, ToString}; - impl std::fmt::Debug for Uuid { #[inline] fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { @@ -32,13 +29,6 @@ } } -#[cfg(feature = "std")] -impl From for String { - fn from(uuid: Uuid) -> Self { - uuid.to_string() - } -} - impl fmt::Display for Variant { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match *self { diff -Nru temporalio-1.3.0/vendor/uuid/src/lib.rs temporalio-1.3.0/vendor/uuid/src/lib.rs --- temporalio-1.3.0/vendor/uuid/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/uuid/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -39,7 +39,7 @@ //! //! ```toml //! [dependencies.uuid] -//! version = "1.5.0" +//! version = "1.4.1" //! features = [ //! "v4", # Lets you generate random UUIDs //! "fast-rng", # Use a faster (but still sufficiently random) RNG @@ -108,7 +108,6 @@ //! * `fast-rng` - uses a faster algorithm for generating random UUIDs. //! This feature requires more dependencies to compile, but is just as suitable for //! UUIDs as the default algorithm. -//! * `bytemuck` - adds a `Pod` trait implementation to `Uuid` for byte manipulation //! //! # Unstable features //! @@ -141,7 +140,7 @@ //! //! ```toml //! [dependencies.uuid] -//! version = "1.5.0" +//! version = "1.4.1" //! features = [ //! "v4", //! "v7", @@ -156,7 +155,7 @@ //! //! ```toml //! [dependencies.uuid] -//! version = "1.5.0" +//! version = "1.4.1" //! default-features = false //! ``` //! @@ -214,7 +213,7 @@ #![doc( html_logo_url = "https://www.rust-lang.org/logos/rust-logo-128x128-blk-v2.png", html_favicon_url = "https://www.rust-lang.org/favicon.ico", - html_root_url = "https://docs.rs/uuid/1.5.0" + html_root_url = "https://docs.rs/uuid/1.4.1" )] #[cfg(any(feature = "std", test))] @@ -448,10 +447,6 @@ derive(borsh::BorshDeserialize, borsh::BorshSerialize) )] #[repr(transparent)] -#[cfg_attr( - feature = "bytemuck", - derive(bytemuck::Zeroable, bytemuck::Pod, bytemuck::TransparentWrapper) -)] pub struct Uuid(Bytes); impl Uuid { @@ -950,22 +945,6 @@ } } -#[cfg(feature = "std")] -impl From for std::vec::Vec { - fn from(value: Uuid) -> Self { - value.0.to_vec() - } -} - -#[cfg(feature = "std")] -impl std::convert::TryFrom> for Uuid { - type Error = Error; - - fn try_from(value: std::vec::Vec) -> Result { - Uuid::from_slice(&value) - } -} - #[cfg(feature = "serde")] pub mod serde { //! Adapters for alternative `serde` formats. @@ -1766,31 +1745,6 @@ } #[test] - #[cfg(feature = "std")] - #[cfg_attr( - all( - target_arch = "wasm32", - target_vendor = "unknown", - target_os = "unknown" - ), - wasm_bindgen_test - )] - fn test_convert_vec() { - use crate::std::{convert::TryInto, vec::Vec}; - - let u = new(); - let ub = u.as_ref(); - - let v: Vec = u.into(); - - assert_eq!(&v, ub); - - let uv: Uuid = v.try_into().unwrap(); - - assert_eq!(uv, u); - } - - #[test] #[cfg_attr( all( target_arch = "wasm32", diff -Nru temporalio-1.3.0/vendor/uuid/src/timestamp.rs temporalio-1.3.0/vendor/uuid/src/timestamp.rs --- temporalio-1.3.0/vendor/uuid/src/timestamp.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/uuid/src/timestamp.rs 2023-10-30 19:40:00.000000000 +0000 @@ -145,9 +145,11 @@ #[cfg(any(feature = "v1", feature = "v6"))] const fn unix_to_rfc4122_ticks(seconds: u64, nanos: u32) -> u64 { - UUID_TICKS_BETWEEN_EPOCHS + let ticks = UUID_TICKS_BETWEEN_EPOCHS .wrapping_add(seconds.wrapping_mul(10_000_000)) - .wrapping_add(nanos as u64 / 100) + .wrapping_add(nanos as u64 / 100); + + ticks } const fn rfc4122_to_unix(ticks: u64) -> (u64, u32) { @@ -436,7 +438,7 @@ // increment the clock sequence we want to wrap once it becomes larger // than what we can represent in a "u14". Otherwise there'd be patches // where the clock sequence doesn't change regardless of the timestamp - self.count.fetch_add(1, Ordering::AcqRel) & (u16::MAX >> 2) + self.count.fetch_add(1, Ordering::AcqRel) % (u16::MAX >> 2) } } } diff -Nru temporalio-1.3.0/vendor/uuid/src/v1.rs temporalio-1.3.0/vendor/uuid/src/v1.rs --- temporalio-1.3.0/vendor/uuid/src/v1.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/uuid/src/v1.rs 2023-10-30 19:40:00.000000000 +0000 @@ -178,7 +178,7 @@ let node = [1, 2, 3, 4, 5, 6]; // This context will wrap - let context = Context::new(u16::MAX >> 2); + let context = Context::new((u16::MAX >> 2) - 1); let uuid1 = Uuid::new_v1(Timestamp::from_unix(&context, time, time_fraction), &node); @@ -186,7 +186,7 @@ let uuid2 = Uuid::new_v1(Timestamp::from_unix(&context, time, time_fraction), &node); - assert_eq!(uuid1.get_timestamp().unwrap().to_rfc4122().1, 16383); + assert_eq!(uuid1.get_timestamp().unwrap().to_rfc4122().1, 16382); assert_eq!(uuid2.get_timestamp().unwrap().to_rfc4122().1, 0); let time = 1_496_854_535; diff -Nru temporalio-1.3.0/vendor/uuid/src/v6.rs temporalio-1.3.0/vendor/uuid/src/v6.rs --- temporalio-1.3.0/vendor/uuid/src/v6.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/uuid/src/v6.rs 2023-10-30 19:40:00.000000000 +0000 @@ -180,7 +180,7 @@ let node = [1, 2, 3, 4, 5, 6]; // This context will wrap - let context = Context::new(u16::MAX >> 2); + let context = Context::new((u16::MAX >> 2) - 1); let uuid1 = Uuid::new_v6(Timestamp::from_unix(&context, time, time_fraction), &node); @@ -188,7 +188,7 @@ let uuid2 = Uuid::new_v6(Timestamp::from_unix(&context, time, time_fraction), &node); - assert_eq!(uuid1.get_timestamp().unwrap().to_rfc4122().1, 16383); + assert_eq!(uuid1.get_timestamp().unwrap().to_rfc4122().1, 16382); assert_eq!(uuid2.get_timestamp().unwrap().to_rfc4122().1, 0); let time = 1_496_854_535; diff -Nru temporalio-1.3.0/vendor/wasi-0.10.2+wasi-snapshot-preview1/.cargo-checksum.json temporalio-1.3.0/vendor/wasi-0.10.2+wasi-snapshot-preview1/.cargo-checksum.json --- temporalio-1.3.0/vendor/wasi-0.10.2+wasi-snapshot-preview1/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/wasi-0.10.2+wasi-snapshot-preview1/.cargo-checksum.json 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -{"files":{"CODE_OF_CONDUCT.md":"a13aaaf393818bd91207c618724d3fb74944ca5161201822a84af951bcf655ef","CONTRIBUTING.md":"2c908a3e263dc35dfed131c02ff907cd72fafb2c2096e4ba9b1e0cbb7a1b76df","Cargo.toml":"946b521f577983feb92abbad62bd85932fe4fe26b7a61dcaba4030d242667885","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-Apache-2.0_WITH_LLVM-exception":"268872b9816f90fd8e85db5a28d33f8150ebb8dd016653fb39ef1f94f2686bc5","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","ORG_CODE_OF_CONDUCT.md":"a62b69bf86e605ee1bcbb2f0a12ba79e4cebb6983a7b6491949750aecc4f2178","README.md":"c021f687a5a61d9c308581401e7aa4454585a30c418abdd02e3a1ef71daa035f","SECURITY.md":"4d75afb09dd28eb5982e3a1f768ee398d90204669ceef3240a16b31dcf04148a","src/error.rs":"270ec14e103130ac5981997ddfa616851cb596fecd48ea7212a7a59dcb110c7f","src/lib.rs":"ce2e7ee6a6e4d5900f3835568b168afc70870d601b2bb94f1a6b9ddd2f046c3a","src/lib_generated.rs":"f92f8c522904454c5909843bc2db4c34af48ca2eae8634cc77dc51d89fa5eae2"},"package":"fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/wasi-0.10.2+wasi-snapshot-preview1/Cargo.toml temporalio-1.3.0/vendor/wasi-0.10.2+wasi-snapshot-preview1/Cargo.toml --- temporalio-1.3.0/vendor/wasi-0.10.2+wasi-snapshot-preview1/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/wasi-0.10.2+wasi-snapshot-preview1/Cargo.toml 1970-01-01 00:00:00.000000000 +0000 @@ -1,43 +0,0 @@ -# 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 believe there's an error in this file please file an -# issue against the rust-lang/cargo repository. If you're -# editing this file be aware that the upstream Cargo.toml -# will likely look very different (and much more reasonable) - -[package] -edition = "2018" -name = "wasi" -version = "0.10.2+wasi-snapshot-preview1" -authors = ["The Cranelift Project Developers"] -description = "Experimental WASI API bindings for Rust" -documentation = "https://docs.rs/wasi" -readme = "README.md" -keywords = ["webassembly", "wasm"] -categories = ["no-std", "wasm"] -license = "Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT" -repository = "https://github.com/bytecodealliance/wasi" -[dependencies.compiler_builtins] -version = "0.1" -optional = true - -[dependencies.core] -version = "1.0" -optional = true -package = "rustc-std-workspace-core" - -[dependencies.rustc-std-workspace-alloc] -version = "1.0" -optional = true - -[features] -default = ["std"] -rustc-dep-of-std = ["compiler_builtins", "core", "rustc-std-workspace-alloc"] -std = [] -[badges.maintenance] -status = "experimental" diff -Nru temporalio-1.3.0/vendor/wasi-0.10.2+wasi-snapshot-preview1/CODE_OF_CONDUCT.md temporalio-1.3.0/vendor/wasi-0.10.2+wasi-snapshot-preview1/CODE_OF_CONDUCT.md --- temporalio-1.3.0/vendor/wasi-0.10.2+wasi-snapshot-preview1/CODE_OF_CONDUCT.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/wasi-0.10.2+wasi-snapshot-preview1/CODE_OF_CONDUCT.md 1970-01-01 00:00:00.000000000 +0000 @@ -1,49 +0,0 @@ -# Contributor Covenant Code of Conduct - -*Note*: this Code of Conduct pertains to individuals' behavior. Please also see the [Organizational Code of Conduct][OCoC]. - -## Our Pledge - -In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. - -## Our Standards - -Examples of behavior that contributes to creating a positive environment include: - -* Using welcoming and inclusive language -* Being respectful of differing viewpoints and experiences -* Gracefully accepting constructive criticism -* Focusing on what is best for the community -* Showing empathy towards other community members - -Examples of unacceptable behavior by participants include: - -* The use of sexualized language or imagery and unwelcome sexual attention or advances -* Trolling, insulting/derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or electronic address, without explicit permission -* Other conduct which could reasonably be considered inappropriate in a professional setting - -## Our Responsibilities - -Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. - -Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. - -## Scope - -This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. - -## Enforcement - -Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the Bytecode Alliance CoC team at [report@bytecodealliance.org](mailto:report@bytecodealliance.org). The CoC team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The CoC team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. - -Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the Bytecode Alliance's leadership. - -## Attribution - -This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] - -[OCoC]: ORG_CODE_OF_CONDUCT.md -[homepage]: https://www.contributor-covenant.org -[version]: https://www.contributor-covenant.org/version/1/4/ diff -Nru temporalio-1.3.0/vendor/wasi-0.10.2+wasi-snapshot-preview1/CONTRIBUTING.md temporalio-1.3.0/vendor/wasi-0.10.2+wasi-snapshot-preview1/CONTRIBUTING.md --- temporalio-1.3.0/vendor/wasi-0.10.2+wasi-snapshot-preview1/CONTRIBUTING.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/wasi-0.10.2+wasi-snapshot-preview1/CONTRIBUTING.md 1970-01-01 00:00:00.000000000 +0000 @@ -1,8 +0,0 @@ -# Contributing to wasi-core - -wasi-core follows the same development style as Cranelift, so checkout -[Cranelift's CONTRIBUTING.md]. Of course, for wasi-core-specific issues, please -use the [wasi-core issue tracker]. - -[Cranelift's CONTRIBUTING.md]: https://github.com/CraneStation/cranelift/blob/master/CONTRIBUTING.md -[wasi-core issue tracker]: https://github.com/CraneStation/wasi-core/issues/new diff -Nru temporalio-1.3.0/vendor/wasi-0.10.2+wasi-snapshot-preview1/LICENSE-APACHE temporalio-1.3.0/vendor/wasi-0.10.2+wasi-snapshot-preview1/LICENSE-APACHE --- temporalio-1.3.0/vendor/wasi-0.10.2+wasi-snapshot-preview1/LICENSE-APACHE 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/wasi-0.10.2+wasi-snapshot-preview1/LICENSE-APACHE 1970-01-01 00:00:00.000000000 +0000 @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - -Copyright [yyyy] [name of copyright owner] - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff -Nru temporalio-1.3.0/vendor/wasi-0.10.2+wasi-snapshot-preview1/LICENSE-Apache-2.0_WITH_LLVM-exception temporalio-1.3.0/vendor/wasi-0.10.2+wasi-snapshot-preview1/LICENSE-Apache-2.0_WITH_LLVM-exception --- temporalio-1.3.0/vendor/wasi-0.10.2+wasi-snapshot-preview1/LICENSE-Apache-2.0_WITH_LLVM-exception 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/wasi-0.10.2+wasi-snapshot-preview1/LICENSE-Apache-2.0_WITH_LLVM-exception 1970-01-01 00:00:00.000000000 +0000 @@ -1,220 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - ---- LLVM Exceptions to the Apache 2.0 License ---- - -As an exception, if, as a result of your compiling your source code, portions -of this Software are embedded into an Object form of such source code, you -may redistribute such embedded portions in such Object form without complying -with the conditions of Sections 4(a), 4(b) and 4(d) of the License. - -In addition, if you combine or link compiled forms of this Software with -software that is licensed under the GPLv2 ("Combined Software") and if a -court of competent jurisdiction determines that the patent provision (Section -3), the indemnity provision (Section 9) or other Section of the License -conflicts with the conditions of the GPLv2, you may retroactively and -prospectively choose to deem waived or otherwise exclude such Section(s) of -the License, but only in their entirety and only with respect to the Combined -Software. - diff -Nru temporalio-1.3.0/vendor/wasi-0.10.2+wasi-snapshot-preview1/LICENSE-MIT temporalio-1.3.0/vendor/wasi-0.10.2+wasi-snapshot-preview1/LICENSE-MIT --- temporalio-1.3.0/vendor/wasi-0.10.2+wasi-snapshot-preview1/LICENSE-MIT 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/wasi-0.10.2+wasi-snapshot-preview1/LICENSE-MIT 1970-01-01 00:00:00.000000000 +0000 @@ -1,23 +0,0 @@ -Permission is hereby granted, free of charge, to any -person obtaining a copy of this software and associated -documentation files (the "Software"), to deal in the -Software without restriction, including without -limitation the rights to use, copy, modify, merge, -publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software -is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice -shall be included in all copies or substantial portions -of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. diff -Nru temporalio-1.3.0/vendor/wasi-0.10.2+wasi-snapshot-preview1/ORG_CODE_OF_CONDUCT.md temporalio-1.3.0/vendor/wasi-0.10.2+wasi-snapshot-preview1/ORG_CODE_OF_CONDUCT.md --- temporalio-1.3.0/vendor/wasi-0.10.2+wasi-snapshot-preview1/ORG_CODE_OF_CONDUCT.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/wasi-0.10.2+wasi-snapshot-preview1/ORG_CODE_OF_CONDUCT.md 1970-01-01 00:00:00.000000000 +0000 @@ -1,143 +0,0 @@ -# Bytecode Alliance Organizational Code of Conduct (OCoC) - -*Note*: this Code of Conduct pertains to organizations' behavior. Please also see the [Individual Code of Conduct](CODE_OF_CONDUCT.md). - -## Preamble - -The Bytecode Alliance (BA) welcomes involvement from organizations, -including commercial organizations. This document is an -*organizational* code of conduct, intended particularly to provide -guidance to commercial organizations. It is distinct from the -[Individual Code of Conduct (ICoC)](CODE_OF_CONDUCT.md), and does not -replace the ICoC. This OCoC applies to any group of people acting in -concert as a BA member or as a participant in BA activities, whether -or not that group is formally incorporated in some jurisdiction. - -The code of conduct described below is not a set of rigid rules, and -we did not write it to encompass every conceivable scenario that might -arise. For example, it is theoretically possible there would be times -when asserting patents is in the best interest of the BA community as -a whole. In such instances, consult with the BA, strive for -consensus, and interpret these rules with an intent that is generous -to the community the BA serves. - -While we may revise these guidelines from time to time based on -real-world experience, overall they are based on a simple principle: - -*Bytecode Alliance members should observe the distinction between - public community functions and private functions — especially - commercial ones — and should ensure that the latter support, or at - least do not harm, the former.* - -## Guidelines - - * **Do not cause confusion about Wasm standards or interoperability.** - - Having an interoperable WebAssembly core is a high priority for - the BA, and members should strive to preserve that core. It is fine - to develop additional non-standard features or APIs, but they - should always be clearly distinguished from the core interoperable - Wasm. - - Treat the WebAssembly name and any BA-associated names with - respect, and follow BA trademark and branding guidelines. If you - distribute a customized version of software originally produced by - the BA, or if you build a product or service using BA-derived - software, use names that clearly distinguish your work from the - original. (You should still provide proper attribution to the - original, of course, wherever such attribution would normally be - given.) - - Further, do not use the WebAssembly name or BA-associated names in - other public namespaces in ways that could cause confusion, e.g., - in company names, names of commercial service offerings, domain - names, publicly-visible social media accounts or online service - accounts, etc. It may sometimes be reasonable, however, to - register such a name in a new namespace and then immediately donate - control of that account to the BA, because that would help the project - maintain its identity. - - For further guidance, see the BA Trademark and Branding Policy - [TODO: create policy, then insert link]. - - * **Do not restrict contributors.** If your company requires - employees or contractors to sign non-compete agreements, those - agreements must not prevent people from participating in the BA or - contributing to related projects. - - This does not mean that all non-compete agreements are incompatible - with this code of conduct. For example, a company may restrict an - employee's ability to solicit the company's customers. However, an - agreement must not block any form of technical or social - participation in BA activities, including but not limited to the - implementation of particular features. - - The accumulation of experience and expertise in individual persons, - who are ultimately free to direct their energy and attention as - they decide, is one of the most important drivers of progress in - open source projects. A company that limits this freedom may hinder - the success of the BA's efforts. - - * **Do not use patents as offensive weapons.** If any BA participant - prevents the adoption or development of BA technologies by - asserting its patents, that undermines the purpose of the - coalition. The collaboration fostered by the BA cannot include - members who act to undermine its work. - - * **Practice responsible disclosure** for security vulnerabilities. - Use designated, non-public reporting channels to disclose technical - vulnerabilities, and give the project a reasonable period to - respond, remediate, and patch. [TODO: optionally include the - security vulnerability reporting URL here.] - - Vulnerability reporters may patch their company's own offerings, as - long as that patching does not significantly delay the reporting of - the vulnerability. Vulnerability information should never be used - for unilateral commercial advantage. Vendors may legitimately - compete on the speed and reliability with which they deploy - security fixes, but withholding vulnerability information damages - everyone in the long run by risking harm to the BA project's - reputation and to the security of all users. - - * **Respect the letter and spirit of open source practice.** While - there is not space to list here all possible aspects of standard - open source practice, some examples will help show what we mean: - - * Abide by all applicable open source license terms. Do not engage - in copyright violation or misattribution of any kind. - - * Do not claim others' ideas or designs as your own. - - * When others engage in publicly visible work (e.g., an upcoming - demo that is coordinated in a public issue tracker), do not - unilaterally announce early releases or early demonstrations of - that work ahead of their schedule in order to secure private - advantage (such as marketplace advantage) for yourself. - - The BA reserves the right to determine what constitutes good open - source practices and to take action as it deems appropriate to - encourage, and if necessary enforce, such practices. - -## Enforcement - -Instances of organizational behavior in violation of the OCoC may -be reported by contacting the Bytecode Alliance CoC team at -[report@bytecodealliance.org](mailto:report@bytecodealliance.org). The -CoC team will review and investigate all complaints, and will respond -in a way that it deems appropriate to the circumstances. The CoC team -is obligated to maintain confidentiality with regard to the reporter of -an incident. Further details of specific enforcement policies may be -posted separately. - -When the BA deems an organization in violation of this OCoC, the BA -will, at its sole discretion, determine what action to take. The BA -will decide what type, degree, and duration of corrective action is -needed, if any, before a violating organization can be considered for -membership (if it was not already a member) or can have its membership -reinstated (if it was a member and the BA canceled its membership due -to the violation). - -In practice, the BA's first approach will be to start a conversation, -with punitive enforcement used only as a last resort. Violations -often turn out to be unintentional and swiftly correctable with all -parties acting in good faith. diff -Nru temporalio-1.3.0/vendor/wasi-0.10.2+wasi-snapshot-preview1/README.md temporalio-1.3.0/vendor/wasi-0.10.2+wasi-snapshot-preview1/README.md --- temporalio-1.3.0/vendor/wasi-0.10.2+wasi-snapshot-preview1/README.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/wasi-0.10.2+wasi-snapshot-preview1/README.md 1970-01-01 00:00:00.000000000 +0000 @@ -1,94 +0,0 @@ -

-

wasi

- -A Bytecode Alliance project - -

- WASI API Bindings for Rust -

- -

- Crates.io version - Download - docs.rs docs -

-
- -This crate contains API bindings for [WASI](https://github.com/WebAssembly/WASI) -system calls in Rust, and currently reflects the `wasi_snapshot_preview1` -module. This crate is quite low-level and provides conceptually a "system call" -interface. In most settings, it's better to use the Rust standard library, which -has WASI support. - -The `wasi` crate is also entirely procedurally generated from the `*.witx` files -describing the WASI apis. While some conveniences are provided the bindings here -are intentionally low-level! - -# Usage - -First you can depend on this crate via `Cargo.toml`: - -```toml -[dependencies] -wasi = "0.8.0" -``` - -Next you can use the APIs in the root of the module like so: - -```rust -fn main() { - let stdout = 1; - let message = "Hello, World!\n"; - let data = [wasi::Ciovec { - buf: message.as_ptr(), - buf_len: message.len(), - }]; - wasi::fd_write(stdout, &data).unwrap(); -} -``` - -Next you can use a tool like [`cargo -wasi`](https://github.com/bytecodealliance/cargo-wasi) to compile and run your -project: - -To compile Rust projects to wasm using WASI, use the `wasm32-wasi` target, -like this: - -``` -$ cargo wasi run - Compiling wasi v0.8.0+wasi-snapshot-preview1 - Compiling wut v0.1.0 (/code) - Finished dev [unoptimized + debuginfo] target(s) in 0.34s - Running `/.cargo/bin/cargo-wasi target/wasm32-wasi/debug/wut.wasm` - Running `target/wasm32-wasi/debug/wut.wasm` -Hello, World! -``` - -# Development - -The bulk of the `wasi` crate is generated by the `witx-bindgen` tool, which lives at -`crates/witx-bindgen` and is part of the cargo workspace. - -The `src/lib_generated.rs` file can be re-generated with the following -command: - -``` -cargo run -p witx-bindgen -- crates/witx-bindgen/WASI/phases/snapshot/witx/wasi_snapshot_preview1.witx > src/lib_generated.rs -``` - -Note that this uses the WASI standard repository as a submodule. If you do not -have this submodule present in your source tree, run: -``` -git submodule update --init -``` - -# License - -This project is licensed under the Apache 2.0 license with the LLVM exception. -See [LICENSE](LICENSE) for more details. - -### Contribution - -Unless you explicitly state otherwise, any contribution intentionally submitted -for inclusion in this project by you, as defined in the Apache-2.0 license, -shall be licensed as above, without any additional terms or conditions. diff -Nru temporalio-1.3.0/vendor/wasi-0.10.2+wasi-snapshot-preview1/SECURITY.md temporalio-1.3.0/vendor/wasi-0.10.2+wasi-snapshot-preview1/SECURITY.md --- temporalio-1.3.0/vendor/wasi-0.10.2+wasi-snapshot-preview1/SECURITY.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/wasi-0.10.2+wasi-snapshot-preview1/SECURITY.md 1970-01-01 00:00:00.000000000 +0000 @@ -1,29 +0,0 @@ -# Security Policy - -Building secure foundations for software development is at the core of what we do in the Bytecode Alliance. Contributions of external security researchers are a vital part of that. - -## Scope - -If you believe you've found a security issue in any website, service, or software owned or operated by the Bytecode Alliance, we encourage you to notify us. - -## How to Submit a Report - -To submit a vulnerability report to the Bytecode Alliance, please contact us at [security@bytecodealliance.org](mailto:security@bytecodealliance.org). Your submission will be reviewed and validated by a member of our security team. - -## Safe Harbor - -The Bytecode Alliance supports safe harbor for security researchers who: - -* Make a good faith effort to avoid privacy violations, destruction of data, and interruption or degradation of our services. -* Only interact with accounts you own or with explicit permission of the account holder. If you do encounter Personally Identifiable Information (PII) contact us immediately, do not proceed with access, and immediately purge any local information. -* Provide us with a reasonable amount of time to resolve vulnerabilities prior to any disclosure to the public or a third-party. - -We will consider activities conducted consistent with this policy to constitute "authorized" conduct and will not pursue civil action or initiate a complaint to law enforcement. We will help to the extent we can if legal action is initiated by a third party against you. - -Please submit a report to us before engaging in conduct that may be inconsistent with or unaddressed by this policy. - -## Preferences - -* Please provide detailed reports with reproducible steps and a clearly defined impact. -* Submit one vulnerability per report. -* Social engineering (e.g. phishing, vishing, smishing) is prohibited. diff -Nru temporalio-1.3.0/vendor/wasi-0.10.2+wasi-snapshot-preview1/src/error.rs temporalio-1.3.0/vendor/wasi-0.10.2+wasi-snapshot-preview1/src/error.rs --- temporalio-1.3.0/vendor/wasi-0.10.2+wasi-snapshot-preview1/src/error.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/wasi-0.10.2+wasi-snapshot-preview1/src/error.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,52 +0,0 @@ -use super::Errno; -use core::fmt; -use core::num::NonZeroU16; - -/// A raw error returned by wasi APIs, internally containing a 16-bit error -/// code. -#[derive(Copy, Clone, PartialEq, Eq, Ord, PartialOrd)] -pub struct Error { - code: NonZeroU16, -} - -impl Error { - /// Constructs a new error from a raw error code, returning `None` if the - /// error code is zero (which means success). - pub fn from_raw_error(error: Errno) -> Option { - Some(Error { - code: NonZeroU16::new(error)?, - }) - } - - /// Returns the raw error code that this error represents. - pub fn raw_error(&self) -> u16 { - self.code.get() - } -} - -impl fmt::Display for Error { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!( - f, - "{} (error {})", - super::errno_name(self.code.get()), - self.code - )?; - Ok(()) - } -} - -impl fmt::Debug for Error { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("Error") - .field("code", &self.code) - .field("name", &super::errno_name(self.code.get())) - .field("message", &super::errno_docs(self.code.get())) - .finish() - } -} - -#[cfg(feature = "std")] -extern crate std; -#[cfg(feature = "std")] -impl std::error::Error for Error {} diff -Nru temporalio-1.3.0/vendor/wasi-0.10.2+wasi-snapshot-preview1/src/lib_generated.rs temporalio-1.3.0/vendor/wasi-0.10.2+wasi-snapshot-preview1/src/lib_generated.rs --- temporalio-1.3.0/vendor/wasi-0.10.2+wasi-snapshot-preview1/src/lib_generated.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/wasi-0.10.2+wasi-snapshot-preview1/src/lib_generated.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,1940 +0,0 @@ -// This file is automatically generated, DO NOT EDIT -// -// To regenerate this file run the `crates/witx-bindgen` command - -use core::mem::MaybeUninit; - -pub use crate::error::Error; -pub type Result = core::result::Result; -pub type Size = usize; -pub type Filesize = u64; -pub type Timestamp = u64; -pub type Clockid = u32; -/// The clock measuring real time. Time value zero corresponds with -/// 1970-01-01T00:00:00Z. -pub const CLOCKID_REALTIME: Clockid = 0; -/// The store-wide monotonic clock, which is defined as a clock measuring -/// real time, whose value cannot be adjusted and which cannot have negative -/// clock jumps. The epoch of this clock is undefined. The absolute time -/// value of this clock therefore has no meaning. -pub const CLOCKID_MONOTONIC: Clockid = 1; -/// The CPU-time clock associated with the current process. -pub const CLOCKID_PROCESS_CPUTIME_ID: Clockid = 2; -/// The CPU-time clock associated with the current thread. -pub const CLOCKID_THREAD_CPUTIME_ID: Clockid = 3; -pub type Errno = u16; -/// No error occurred. System call completed successfully. -pub const ERRNO_SUCCESS: Errno = 0; -/// Argument list too long. -pub const ERRNO_2BIG: Errno = 1; -/// Permission denied. -pub const ERRNO_ACCES: Errno = 2; -/// Address in use. -pub const ERRNO_ADDRINUSE: Errno = 3; -/// Address not available. -pub const ERRNO_ADDRNOTAVAIL: Errno = 4; -/// Address family not supported. -pub const ERRNO_AFNOSUPPORT: Errno = 5; -/// Resource unavailable, or operation would block. -pub const ERRNO_AGAIN: Errno = 6; -/// Connection already in progress. -pub const ERRNO_ALREADY: Errno = 7; -/// Bad file descriptor. -pub const ERRNO_BADF: Errno = 8; -/// Bad message. -pub const ERRNO_BADMSG: Errno = 9; -/// Device or resource busy. -pub const ERRNO_BUSY: Errno = 10; -/// Operation canceled. -pub const ERRNO_CANCELED: Errno = 11; -/// No child processes. -pub const ERRNO_CHILD: Errno = 12; -/// Connection aborted. -pub const ERRNO_CONNABORTED: Errno = 13; -/// Connection refused. -pub const ERRNO_CONNREFUSED: Errno = 14; -/// Connection reset. -pub const ERRNO_CONNRESET: Errno = 15; -/// Resource deadlock would occur. -pub const ERRNO_DEADLK: Errno = 16; -/// Destination address required. -pub const ERRNO_DESTADDRREQ: Errno = 17; -/// Mathematics argument out of domain of function. -pub const ERRNO_DOM: Errno = 18; -/// Reserved. -pub const ERRNO_DQUOT: Errno = 19; -/// File exists. -pub const ERRNO_EXIST: Errno = 20; -/// Bad address. -pub const ERRNO_FAULT: Errno = 21; -/// File too large. -pub const ERRNO_FBIG: Errno = 22; -/// Host is unreachable. -pub const ERRNO_HOSTUNREACH: Errno = 23; -/// Identifier removed. -pub const ERRNO_IDRM: Errno = 24; -/// Illegal byte sequence. -pub const ERRNO_ILSEQ: Errno = 25; -/// Operation in progress. -pub const ERRNO_INPROGRESS: Errno = 26; -/// Interrupted function. -pub const ERRNO_INTR: Errno = 27; -/// Invalid argument. -pub const ERRNO_INVAL: Errno = 28; -/// I/O error. -pub const ERRNO_IO: Errno = 29; -/// Socket is connected. -pub const ERRNO_ISCONN: Errno = 30; -/// Is a directory. -pub const ERRNO_ISDIR: Errno = 31; -/// Too many levels of symbolic links. -pub const ERRNO_LOOP: Errno = 32; -/// File descriptor value too large. -pub const ERRNO_MFILE: Errno = 33; -/// Too many links. -pub const ERRNO_MLINK: Errno = 34; -/// Message too large. -pub const ERRNO_MSGSIZE: Errno = 35; -/// Reserved. -pub const ERRNO_MULTIHOP: Errno = 36; -/// Filename too long. -pub const ERRNO_NAMETOOLONG: Errno = 37; -/// Network is down. -pub const ERRNO_NETDOWN: Errno = 38; -/// Connection aborted by network. -pub const ERRNO_NETRESET: Errno = 39; -/// Network unreachable. -pub const ERRNO_NETUNREACH: Errno = 40; -/// Too many files open in system. -pub const ERRNO_NFILE: Errno = 41; -/// No buffer space available. -pub const ERRNO_NOBUFS: Errno = 42; -/// No such device. -pub const ERRNO_NODEV: Errno = 43; -/// No such file or directory. -pub const ERRNO_NOENT: Errno = 44; -/// Executable file format error. -pub const ERRNO_NOEXEC: Errno = 45; -/// No locks available. -pub const ERRNO_NOLCK: Errno = 46; -/// Reserved. -pub const ERRNO_NOLINK: Errno = 47; -/// Not enough space. -pub const ERRNO_NOMEM: Errno = 48; -/// No message of the desired type. -pub const ERRNO_NOMSG: Errno = 49; -/// Protocol not available. -pub const ERRNO_NOPROTOOPT: Errno = 50; -/// No space left on device. -pub const ERRNO_NOSPC: Errno = 51; -/// Function not supported. -pub const ERRNO_NOSYS: Errno = 52; -/// The socket is not connected. -pub const ERRNO_NOTCONN: Errno = 53; -/// Not a directory or a symbolic link to a directory. -pub const ERRNO_NOTDIR: Errno = 54; -/// Directory not empty. -pub const ERRNO_NOTEMPTY: Errno = 55; -/// State not recoverable. -pub const ERRNO_NOTRECOVERABLE: Errno = 56; -/// Not a socket. -pub const ERRNO_NOTSOCK: Errno = 57; -/// Not supported, or operation not supported on socket. -pub const ERRNO_NOTSUP: Errno = 58; -/// Inappropriate I/O control operation. -pub const ERRNO_NOTTY: Errno = 59; -/// No such device or address. -pub const ERRNO_NXIO: Errno = 60; -/// Value too large to be stored in data type. -pub const ERRNO_OVERFLOW: Errno = 61; -/// Previous owner died. -pub const ERRNO_OWNERDEAD: Errno = 62; -/// Operation not permitted. -pub const ERRNO_PERM: Errno = 63; -/// Broken pipe. -pub const ERRNO_PIPE: Errno = 64; -/// Protocol error. -pub const ERRNO_PROTO: Errno = 65; -/// Protocol not supported. -pub const ERRNO_PROTONOSUPPORT: Errno = 66; -/// Protocol wrong type for socket. -pub const ERRNO_PROTOTYPE: Errno = 67; -/// Result too large. -pub const ERRNO_RANGE: Errno = 68; -/// Read-only file system. -pub const ERRNO_ROFS: Errno = 69; -/// Invalid seek. -pub const ERRNO_SPIPE: Errno = 70; -/// No such process. -pub const ERRNO_SRCH: Errno = 71; -/// Reserved. -pub const ERRNO_STALE: Errno = 72; -/// Connection timed out. -pub const ERRNO_TIMEDOUT: Errno = 73; -/// Text file busy. -pub const ERRNO_TXTBSY: Errno = 74; -/// Cross-device link. -pub const ERRNO_XDEV: Errno = 75; -/// Extension: Capabilities insufficient. -pub const ERRNO_NOTCAPABLE: Errno = 76; -pub fn errno_name(code: u16) -> &'static str { - match code { - ERRNO_SUCCESS => "SUCCESS", - ERRNO_2BIG => "2BIG", - ERRNO_ACCES => "ACCES", - ERRNO_ADDRINUSE => "ADDRINUSE", - ERRNO_ADDRNOTAVAIL => "ADDRNOTAVAIL", - ERRNO_AFNOSUPPORT => "AFNOSUPPORT", - ERRNO_AGAIN => "AGAIN", - ERRNO_ALREADY => "ALREADY", - ERRNO_BADF => "BADF", - ERRNO_BADMSG => "BADMSG", - ERRNO_BUSY => "BUSY", - ERRNO_CANCELED => "CANCELED", - ERRNO_CHILD => "CHILD", - ERRNO_CONNABORTED => "CONNABORTED", - ERRNO_CONNREFUSED => "CONNREFUSED", - ERRNO_CONNRESET => "CONNRESET", - ERRNO_DEADLK => "DEADLK", - ERRNO_DESTADDRREQ => "DESTADDRREQ", - ERRNO_DOM => "DOM", - ERRNO_DQUOT => "DQUOT", - ERRNO_EXIST => "EXIST", - ERRNO_FAULT => "FAULT", - ERRNO_FBIG => "FBIG", - ERRNO_HOSTUNREACH => "HOSTUNREACH", - ERRNO_IDRM => "IDRM", - ERRNO_ILSEQ => "ILSEQ", - ERRNO_INPROGRESS => "INPROGRESS", - ERRNO_INTR => "INTR", - ERRNO_INVAL => "INVAL", - ERRNO_IO => "IO", - ERRNO_ISCONN => "ISCONN", - ERRNO_ISDIR => "ISDIR", - ERRNO_LOOP => "LOOP", - ERRNO_MFILE => "MFILE", - ERRNO_MLINK => "MLINK", - ERRNO_MSGSIZE => "MSGSIZE", - ERRNO_MULTIHOP => "MULTIHOP", - ERRNO_NAMETOOLONG => "NAMETOOLONG", - ERRNO_NETDOWN => "NETDOWN", - ERRNO_NETRESET => "NETRESET", - ERRNO_NETUNREACH => "NETUNREACH", - ERRNO_NFILE => "NFILE", - ERRNO_NOBUFS => "NOBUFS", - ERRNO_NODEV => "NODEV", - ERRNO_NOENT => "NOENT", - ERRNO_NOEXEC => "NOEXEC", - ERRNO_NOLCK => "NOLCK", - ERRNO_NOLINK => "NOLINK", - ERRNO_NOMEM => "NOMEM", - ERRNO_NOMSG => "NOMSG", - ERRNO_NOPROTOOPT => "NOPROTOOPT", - ERRNO_NOSPC => "NOSPC", - ERRNO_NOSYS => "NOSYS", - ERRNO_NOTCONN => "NOTCONN", - ERRNO_NOTDIR => "NOTDIR", - ERRNO_NOTEMPTY => "NOTEMPTY", - ERRNO_NOTRECOVERABLE => "NOTRECOVERABLE", - ERRNO_NOTSOCK => "NOTSOCK", - ERRNO_NOTSUP => "NOTSUP", - ERRNO_NOTTY => "NOTTY", - ERRNO_NXIO => "NXIO", - ERRNO_OVERFLOW => "OVERFLOW", - ERRNO_OWNERDEAD => "OWNERDEAD", - ERRNO_PERM => "PERM", - ERRNO_PIPE => "PIPE", - ERRNO_PROTO => "PROTO", - ERRNO_PROTONOSUPPORT => "PROTONOSUPPORT", - ERRNO_PROTOTYPE => "PROTOTYPE", - ERRNO_RANGE => "RANGE", - ERRNO_ROFS => "ROFS", - ERRNO_SPIPE => "SPIPE", - ERRNO_SRCH => "SRCH", - ERRNO_STALE => "STALE", - ERRNO_TIMEDOUT => "TIMEDOUT", - ERRNO_TXTBSY => "TXTBSY", - ERRNO_XDEV => "XDEV", - ERRNO_NOTCAPABLE => "NOTCAPABLE", - _ => "Unknown error.", - } -} -pub fn errno_docs(code: u16) -> &'static str { - match code { - ERRNO_SUCCESS => "No error occurred. System call completed successfully.", - ERRNO_2BIG => "Argument list too long.", - ERRNO_ACCES => "Permission denied.", - ERRNO_ADDRINUSE => "Address in use.", - ERRNO_ADDRNOTAVAIL => "Address not available.", - ERRNO_AFNOSUPPORT => "Address family not supported.", - ERRNO_AGAIN => "Resource unavailable, or operation would block.", - ERRNO_ALREADY => "Connection already in progress.", - ERRNO_BADF => "Bad file descriptor.", - ERRNO_BADMSG => "Bad message.", - ERRNO_BUSY => "Device or resource busy.", - ERRNO_CANCELED => "Operation canceled.", - ERRNO_CHILD => "No child processes.", - ERRNO_CONNABORTED => "Connection aborted.", - ERRNO_CONNREFUSED => "Connection refused.", - ERRNO_CONNRESET => "Connection reset.", - ERRNO_DEADLK => "Resource deadlock would occur.", - ERRNO_DESTADDRREQ => "Destination address required.", - ERRNO_DOM => "Mathematics argument out of domain of function.", - ERRNO_DQUOT => "Reserved.", - ERRNO_EXIST => "File exists.", - ERRNO_FAULT => "Bad address.", - ERRNO_FBIG => "File too large.", - ERRNO_HOSTUNREACH => "Host is unreachable.", - ERRNO_IDRM => "Identifier removed.", - ERRNO_ILSEQ => "Illegal byte sequence.", - ERRNO_INPROGRESS => "Operation in progress.", - ERRNO_INTR => "Interrupted function.", - ERRNO_INVAL => "Invalid argument.", - ERRNO_IO => "I/O error.", - ERRNO_ISCONN => "Socket is connected.", - ERRNO_ISDIR => "Is a directory.", - ERRNO_LOOP => "Too many levels of symbolic links.", - ERRNO_MFILE => "File descriptor value too large.", - ERRNO_MLINK => "Too many links.", - ERRNO_MSGSIZE => "Message too large.", - ERRNO_MULTIHOP => "Reserved.", - ERRNO_NAMETOOLONG => "Filename too long.", - ERRNO_NETDOWN => "Network is down.", - ERRNO_NETRESET => "Connection aborted by network.", - ERRNO_NETUNREACH => "Network unreachable.", - ERRNO_NFILE => "Too many files open in system.", - ERRNO_NOBUFS => "No buffer space available.", - ERRNO_NODEV => "No such device.", - ERRNO_NOENT => "No such file or directory.", - ERRNO_NOEXEC => "Executable file format error.", - ERRNO_NOLCK => "No locks available.", - ERRNO_NOLINK => "Reserved.", - ERRNO_NOMEM => "Not enough space.", - ERRNO_NOMSG => "No message of the desired type.", - ERRNO_NOPROTOOPT => "Protocol not available.", - ERRNO_NOSPC => "No space left on device.", - ERRNO_NOSYS => "Function not supported.", - ERRNO_NOTCONN => "The socket is not connected.", - ERRNO_NOTDIR => "Not a directory or a symbolic link to a directory.", - ERRNO_NOTEMPTY => "Directory not empty.", - ERRNO_NOTRECOVERABLE => "State not recoverable.", - ERRNO_NOTSOCK => "Not a socket.", - ERRNO_NOTSUP => "Not supported, or operation not supported on socket.", - ERRNO_NOTTY => "Inappropriate I/O control operation.", - ERRNO_NXIO => "No such device or address.", - ERRNO_OVERFLOW => "Value too large to be stored in data type.", - ERRNO_OWNERDEAD => "Previous owner died.", - ERRNO_PERM => "Operation not permitted.", - ERRNO_PIPE => "Broken pipe.", - ERRNO_PROTO => "Protocol error.", - ERRNO_PROTONOSUPPORT => "Protocol not supported.", - ERRNO_PROTOTYPE => "Protocol wrong type for socket.", - ERRNO_RANGE => "Result too large.", - ERRNO_ROFS => "Read-only file system.", - ERRNO_SPIPE => "Invalid seek.", - ERRNO_SRCH => "No such process.", - ERRNO_STALE => "Reserved.", - ERRNO_TIMEDOUT => "Connection timed out.", - ERRNO_TXTBSY => "Text file busy.", - ERRNO_XDEV => "Cross-device link.", - ERRNO_NOTCAPABLE => "Extension: Capabilities insufficient.", - _ => "Unknown error.", - } -} -pub type Rights = u64; -/// The right to invoke `fd_datasync`. -/// If `path_open` is set, includes the right to invoke -/// `path_open` with `fdflags::dsync`. -pub const RIGHTS_FD_DATASYNC: Rights = 0x1; -/// The right to invoke `fd_read` and `sock_recv`. -/// If `rights::fd_seek` is set, includes the right to invoke `fd_pread`. -pub const RIGHTS_FD_READ: Rights = 0x2; -/// The right to invoke `fd_seek`. This flag implies `rights::fd_tell`. -pub const RIGHTS_FD_SEEK: Rights = 0x4; -/// The right to invoke `fd_fdstat_set_flags`. -pub const RIGHTS_FD_FDSTAT_SET_FLAGS: Rights = 0x8; -/// The right to invoke `fd_sync`. -/// If `path_open` is set, includes the right to invoke -/// `path_open` with `fdflags::rsync` and `fdflags::dsync`. -pub const RIGHTS_FD_SYNC: Rights = 0x10; -/// The right to invoke `fd_seek` in such a way that the file offset -/// remains unaltered (i.e., `whence::cur` with offset zero), or to -/// invoke `fd_tell`. -pub const RIGHTS_FD_TELL: Rights = 0x20; -/// The right to invoke `fd_write` and `sock_send`. -/// If `rights::fd_seek` is set, includes the right to invoke `fd_pwrite`. -pub const RIGHTS_FD_WRITE: Rights = 0x40; -/// The right to invoke `fd_advise`. -pub const RIGHTS_FD_ADVISE: Rights = 0x80; -/// The right to invoke `fd_allocate`. -pub const RIGHTS_FD_ALLOCATE: Rights = 0x100; -/// The right to invoke `path_create_directory`. -pub const RIGHTS_PATH_CREATE_DIRECTORY: Rights = 0x200; -/// If `path_open` is set, the right to invoke `path_open` with `oflags::creat`. -pub const RIGHTS_PATH_CREATE_FILE: Rights = 0x400; -/// The right to invoke `path_link` with the file descriptor as the -/// source directory. -pub const RIGHTS_PATH_LINK_SOURCE: Rights = 0x800; -/// The right to invoke `path_link` with the file descriptor as the -/// target directory. -pub const RIGHTS_PATH_LINK_TARGET: Rights = 0x1000; -/// The right to invoke `path_open`. -pub const RIGHTS_PATH_OPEN: Rights = 0x2000; -/// The right to invoke `fd_readdir`. -pub const RIGHTS_FD_READDIR: Rights = 0x4000; -/// The right to invoke `path_readlink`. -pub const RIGHTS_PATH_READLINK: Rights = 0x8000; -/// The right to invoke `path_rename` with the file descriptor as the source directory. -pub const RIGHTS_PATH_RENAME_SOURCE: Rights = 0x10000; -/// The right to invoke `path_rename` with the file descriptor as the target directory. -pub const RIGHTS_PATH_RENAME_TARGET: Rights = 0x20000; -/// The right to invoke `path_filestat_get`. -pub const RIGHTS_PATH_FILESTAT_GET: Rights = 0x40000; -/// The right to change a file's size (there is no `path_filestat_set_size`). -/// If `path_open` is set, includes the right to invoke `path_open` with `oflags::trunc`. -pub const RIGHTS_PATH_FILESTAT_SET_SIZE: Rights = 0x80000; -/// The right to invoke `path_filestat_set_times`. -pub const RIGHTS_PATH_FILESTAT_SET_TIMES: Rights = 0x100000; -/// The right to invoke `fd_filestat_get`. -pub const RIGHTS_FD_FILESTAT_GET: Rights = 0x200000; -/// The right to invoke `fd_filestat_set_size`. -pub const RIGHTS_FD_FILESTAT_SET_SIZE: Rights = 0x400000; -/// The right to invoke `fd_filestat_set_times`. -pub const RIGHTS_FD_FILESTAT_SET_TIMES: Rights = 0x800000; -/// The right to invoke `path_symlink`. -pub const RIGHTS_PATH_SYMLINK: Rights = 0x1000000; -/// The right to invoke `path_remove_directory`. -pub const RIGHTS_PATH_REMOVE_DIRECTORY: Rights = 0x2000000; -/// The right to invoke `path_unlink_file`. -pub const RIGHTS_PATH_UNLINK_FILE: Rights = 0x4000000; -/// If `rights::fd_read` is set, includes the right to invoke `poll_oneoff` to subscribe to `eventtype::fd_read`. -/// If `rights::fd_write` is set, includes the right to invoke `poll_oneoff` to subscribe to `eventtype::fd_write`. -pub const RIGHTS_POLL_FD_READWRITE: Rights = 0x8000000; -/// The right to invoke `sock_shutdown`. -pub const RIGHTS_SOCK_SHUTDOWN: Rights = 0x10000000; -pub type Fd = u32; -#[repr(C)] -#[derive(Copy, Clone, Debug)] -pub struct Iovec { - /// The address of the buffer to be filled. - pub buf: *mut u8, - /// The length of the buffer to be filled. - pub buf_len: Size, -} -#[repr(C)] -#[derive(Copy, Clone, Debug)] -pub struct Ciovec { - /// The address of the buffer to be written. - pub buf: *const u8, - /// The length of the buffer to be written. - pub buf_len: Size, -} -pub type IovecArray<'a> = &'a [Iovec]; -pub type CiovecArray<'a> = &'a [Ciovec]; -pub type Filedelta = i64; -pub type Whence = u8; -/// Seek relative to start-of-file. -pub const WHENCE_SET: Whence = 0; -/// Seek relative to current position. -pub const WHENCE_CUR: Whence = 1; -/// Seek relative to end-of-file. -pub const WHENCE_END: Whence = 2; -pub type Dircookie = u64; -pub type Dirnamlen = u32; -pub type Inode = u64; -pub type Filetype = u8; -/// The type of the file descriptor or file is unknown or is different from any of the other types specified. -pub const FILETYPE_UNKNOWN: Filetype = 0; -/// The file descriptor or file refers to a block device inode. -pub const FILETYPE_BLOCK_DEVICE: Filetype = 1; -/// The file descriptor or file refers to a character device inode. -pub const FILETYPE_CHARACTER_DEVICE: Filetype = 2; -/// The file descriptor or file refers to a directory inode. -pub const FILETYPE_DIRECTORY: Filetype = 3; -/// The file descriptor or file refers to a regular file inode. -pub const FILETYPE_REGULAR_FILE: Filetype = 4; -/// The file descriptor or file refers to a datagram socket. -pub const FILETYPE_SOCKET_DGRAM: Filetype = 5; -/// The file descriptor or file refers to a byte-stream socket. -pub const FILETYPE_SOCKET_STREAM: Filetype = 6; -/// The file refers to a symbolic link inode. -pub const FILETYPE_SYMBOLIC_LINK: Filetype = 7; -#[repr(C)] -#[derive(Copy, Clone, Debug)] -pub struct Dirent { - /// The offset of the next directory entry stored in this directory. - pub d_next: Dircookie, - /// The serial number of the file referred to by this directory entry. - pub d_ino: Inode, - /// The length of the name of the directory entry. - pub d_namlen: Dirnamlen, - /// The type of the file referred to by this directory entry. - pub d_type: Filetype, -} -pub type Advice = u8; -/// The application has no advice to give on its behavior with respect to the specified data. -pub const ADVICE_NORMAL: Advice = 0; -/// The application expects to access the specified data sequentially from lower offsets to higher offsets. -pub const ADVICE_SEQUENTIAL: Advice = 1; -/// The application expects to access the specified data in a random order. -pub const ADVICE_RANDOM: Advice = 2; -/// The application expects to access the specified data in the near future. -pub const ADVICE_WILLNEED: Advice = 3; -/// The application expects that it will not access the specified data in the near future. -pub const ADVICE_DONTNEED: Advice = 4; -/// The application expects to access the specified data once and then not reuse it thereafter. -pub const ADVICE_NOREUSE: Advice = 5; -pub type Fdflags = u16; -/// Append mode: Data written to the file is always appended to the file's end. -pub const FDFLAGS_APPEND: Fdflags = 0x1; -/// Write according to synchronized I/O data integrity completion. Only the data stored in the file is synchronized. -pub const FDFLAGS_DSYNC: Fdflags = 0x2; -/// Non-blocking mode. -pub const FDFLAGS_NONBLOCK: Fdflags = 0x4; -/// Synchronized read I/O operations. -pub const FDFLAGS_RSYNC: Fdflags = 0x8; -/// Write according to synchronized I/O file integrity completion. In -/// addition to synchronizing the data stored in the file, the implementation -/// may also synchronously update the file's metadata. -pub const FDFLAGS_SYNC: Fdflags = 0x10; -#[repr(C)] -#[derive(Copy, Clone, Debug)] -pub struct Fdstat { - /// File type. - pub fs_filetype: Filetype, - /// File descriptor flags. - pub fs_flags: Fdflags, - /// Rights that apply to this file descriptor. - pub fs_rights_base: Rights, - /// Maximum set of rights that may be installed on new file descriptors that - /// are created through this file descriptor, e.g., through `path_open`. - pub fs_rights_inheriting: Rights, -} -pub type Device = u64; -pub type Fstflags = u16; -/// Adjust the last data access timestamp to the value stored in `filestat::atim`. -pub const FSTFLAGS_ATIM: Fstflags = 0x1; -/// Adjust the last data access timestamp to the time of clock `clockid::realtime`. -pub const FSTFLAGS_ATIM_NOW: Fstflags = 0x2; -/// Adjust the last data modification timestamp to the value stored in `filestat::mtim`. -pub const FSTFLAGS_MTIM: Fstflags = 0x4; -/// Adjust the last data modification timestamp to the time of clock `clockid::realtime`. -pub const FSTFLAGS_MTIM_NOW: Fstflags = 0x8; -pub type Lookupflags = u32; -/// As long as the resolved path corresponds to a symbolic link, it is expanded. -pub const LOOKUPFLAGS_SYMLINK_FOLLOW: Lookupflags = 0x1; -pub type Oflags = u16; -/// Create file if it does not exist. -pub const OFLAGS_CREAT: Oflags = 0x1; -/// Fail if not a directory. -pub const OFLAGS_DIRECTORY: Oflags = 0x2; -/// Fail if file already exists. -pub const OFLAGS_EXCL: Oflags = 0x4; -/// Truncate file to size 0. -pub const OFLAGS_TRUNC: Oflags = 0x8; -pub type Linkcount = u64; -#[repr(C)] -#[derive(Copy, Clone, Debug)] -pub struct Filestat { - /// Device ID of device containing the file. - pub dev: Device, - /// File serial number. - pub ino: Inode, - /// File type. - pub filetype: Filetype, - /// Number of hard links to the file. - pub nlink: Linkcount, - /// For regular files, the file size in bytes. For symbolic links, the length in bytes of the pathname contained in the symbolic link. - pub size: Filesize, - /// Last data access timestamp. - pub atim: Timestamp, - /// Last data modification timestamp. - pub mtim: Timestamp, - /// Last file status change timestamp. - pub ctim: Timestamp, -} -pub type Userdata = u64; -pub type Eventtype = u8; -/// The time value of clock `subscription_clock::id` has -/// reached timestamp `subscription_clock::timeout`. -pub const EVENTTYPE_CLOCK: Eventtype = 0; -/// File descriptor `subscription_fd_readwrite::file_descriptor` has data -/// available for reading. This event always triggers for regular files. -pub const EVENTTYPE_FD_READ: Eventtype = 1; -/// File descriptor `subscription_fd_readwrite::file_descriptor` has capacity -/// available for writing. This event always triggers for regular files. -pub const EVENTTYPE_FD_WRITE: Eventtype = 2; -pub type Eventrwflags = u16; -/// The peer of this socket has closed or disconnected. -pub const EVENTRWFLAGS_FD_READWRITE_HANGUP: Eventrwflags = 0x1; -#[repr(C)] -#[derive(Copy, Clone, Debug)] -pub struct EventFdReadwrite { - /// The number of bytes available for reading or writing. - pub nbytes: Filesize, - /// The state of the file descriptor. - pub flags: Eventrwflags, -} -#[repr(C)] -#[derive(Copy, Clone, Debug)] -pub struct Event { - /// User-provided value that got attached to `subscription::userdata`. - pub userdata: Userdata, - /// If non-zero, an error that occurred while processing the subscription request. - pub error: Errno, - /// The type of event that occured - pub r#type: Eventtype, - /// The contents of the event, if it is an `eventtype::fd_read` or - /// `eventtype::fd_write`. `eventtype::clock` events ignore this field. - pub fd_readwrite: EventFdReadwrite, -} -pub type Subclockflags = u16; -/// If set, treat the timestamp provided in -/// `subscription_clock::timeout` as an absolute timestamp of clock -/// `subscription_clock::id`. If clear, treat the timestamp -/// provided in `subscription_clock::timeout` relative to the -/// current time value of clock `subscription_clock::id`. -pub const SUBCLOCKFLAGS_SUBSCRIPTION_CLOCK_ABSTIME: Subclockflags = 0x1; -#[repr(C)] -#[derive(Copy, Clone, Debug)] -pub struct SubscriptionClock { - /// The clock against which to compare the timestamp. - pub id: Clockid, - /// The absolute or relative timestamp. - pub timeout: Timestamp, - /// The amount of time that the implementation may wait additionally - /// to coalesce with other events. - pub precision: Timestamp, - /// Flags specifying whether the timeout is absolute or relative - pub flags: Subclockflags, -} -#[repr(C)] -#[derive(Copy, Clone, Debug)] -pub struct SubscriptionFdReadwrite { - /// The file descriptor on which to wait for it to become ready for reading or writing. - pub file_descriptor: Fd, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union SubscriptionUU { - pub clock: SubscriptionClock, - pub fd_read: SubscriptionFdReadwrite, - pub fd_write: SubscriptionFdReadwrite, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct SubscriptionU { - pub tag: Eventtype, - pub u: SubscriptionUU, -} - -#[repr(C)] -#[derive(Copy, Clone)] -pub struct Subscription { - /// User-provided value that is attached to the subscription in the - /// implementation and returned through `event::userdata`. - pub userdata: Userdata, - /// The type of the event to which to subscribe, and its contents - pub u: SubscriptionU, -} -pub type Exitcode = u32; -pub type Signal = u8; -/// No signal. Note that POSIX has special semantics for `kill(pid, 0)`, -/// so this value is reserved. -pub const SIGNAL_NONE: Signal = 0; -/// Hangup. -/// Action: Terminates the process. -pub const SIGNAL_HUP: Signal = 1; -/// Terminate interrupt signal. -/// Action: Terminates the process. -pub const SIGNAL_INT: Signal = 2; -/// Terminal quit signal. -/// Action: Terminates the process. -pub const SIGNAL_QUIT: Signal = 3; -/// Illegal instruction. -/// Action: Terminates the process. -pub const SIGNAL_ILL: Signal = 4; -/// Trace/breakpoint trap. -/// Action: Terminates the process. -pub const SIGNAL_TRAP: Signal = 5; -/// Process abort signal. -/// Action: Terminates the process. -pub const SIGNAL_ABRT: Signal = 6; -/// Access to an undefined portion of a memory object. -/// Action: Terminates the process. -pub const SIGNAL_BUS: Signal = 7; -/// Erroneous arithmetic operation. -/// Action: Terminates the process. -pub const SIGNAL_FPE: Signal = 8; -/// Kill. -/// Action: Terminates the process. -pub const SIGNAL_KILL: Signal = 9; -/// User-defined signal 1. -/// Action: Terminates the process. -pub const SIGNAL_USR1: Signal = 10; -/// Invalid memory reference. -/// Action: Terminates the process. -pub const SIGNAL_SEGV: Signal = 11; -/// User-defined signal 2. -/// Action: Terminates the process. -pub const SIGNAL_USR2: Signal = 12; -/// Write on a pipe with no one to read it. -/// Action: Ignored. -pub const SIGNAL_PIPE: Signal = 13; -/// Alarm clock. -/// Action: Terminates the process. -pub const SIGNAL_ALRM: Signal = 14; -/// Termination signal. -/// Action: Terminates the process. -pub const SIGNAL_TERM: Signal = 15; -/// Child process terminated, stopped, or continued. -/// Action: Ignored. -pub const SIGNAL_CHLD: Signal = 16; -/// Continue executing, if stopped. -/// Action: Continues executing, if stopped. -pub const SIGNAL_CONT: Signal = 17; -/// Stop executing. -/// Action: Stops executing. -pub const SIGNAL_STOP: Signal = 18; -/// Terminal stop signal. -/// Action: Stops executing. -pub const SIGNAL_TSTP: Signal = 19; -/// Background process attempting read. -/// Action: Stops executing. -pub const SIGNAL_TTIN: Signal = 20; -/// Background process attempting write. -/// Action: Stops executing. -pub const SIGNAL_TTOU: Signal = 21; -/// High bandwidth data is available at a socket. -/// Action: Ignored. -pub const SIGNAL_URG: Signal = 22; -/// CPU time limit exceeded. -/// Action: Terminates the process. -pub const SIGNAL_XCPU: Signal = 23; -/// File size limit exceeded. -/// Action: Terminates the process. -pub const SIGNAL_XFSZ: Signal = 24; -/// Virtual timer expired. -/// Action: Terminates the process. -pub const SIGNAL_VTALRM: Signal = 25; -/// Profiling timer expired. -/// Action: Terminates the process. -pub const SIGNAL_PROF: Signal = 26; -/// Window changed. -/// Action: Ignored. -pub const SIGNAL_WINCH: Signal = 27; -/// I/O possible. -/// Action: Terminates the process. -pub const SIGNAL_POLL: Signal = 28; -/// Power failure. -/// Action: Terminates the process. -pub const SIGNAL_PWR: Signal = 29; -/// Bad system call. -/// Action: Terminates the process. -pub const SIGNAL_SYS: Signal = 30; -pub type Riflags = u16; -/// Returns the message without removing it from the socket's receive queue. -pub const RIFLAGS_RECV_PEEK: Riflags = 0x1; -/// On byte-stream sockets, block until the full amount of data can be returned. -pub const RIFLAGS_RECV_WAITALL: Riflags = 0x2; -pub type Roflags = u16; -/// Returned by `sock_recv`: Message data has been truncated. -pub const ROFLAGS_RECV_DATA_TRUNCATED: Roflags = 0x1; -pub type Siflags = u16; -pub type Sdflags = u8; -/// Disables further receive operations. -pub const SDFLAGS_RD: Sdflags = 0x1; -/// Disables further send operations. -pub const SDFLAGS_WR: Sdflags = 0x2; -pub type Preopentype = u8; -/// A pre-opened directory. -pub const PREOPENTYPE_DIR: Preopentype = 0; -#[repr(C)] -#[derive(Copy, Clone, Debug)] -pub struct PrestatDir { - /// The length of the directory name for use with `fd_prestat_dir_name`. - pub pr_name_len: Size, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union PrestatU { - pub dir: PrestatDir, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct Prestat { - pub tag: Preopentype, - pub u: PrestatU, -} - -/// Read command-line argument data. -/// The size of the array should match that returned by `args_sizes_get` -pub unsafe fn args_get(argv: *mut *mut u8, argv_buf: *mut u8) -> Result<()> { - let rc = wasi_snapshot_preview1::args_get(argv, argv_buf); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(()) - } -} - -/// Return command-line argument data sizes. -/// -/// ## Return -/// -/// * `argc` - The number of arguments. -/// * `argv_buf_size` - The size of the argument string data. -pub unsafe fn args_sizes_get() -> Result<(Size, Size)> { - let mut argc = MaybeUninit::uninit(); - let mut argv_buf_size = MaybeUninit::uninit(); - let rc = wasi_snapshot_preview1::args_sizes_get(argc.as_mut_ptr(), argv_buf_size.as_mut_ptr()); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok((argc.assume_init(), argv_buf_size.assume_init())) - } -} - -/// Read environment variable data. -/// The sizes of the buffers should match that returned by `environ_sizes_get`. -pub unsafe fn environ_get(environ: *mut *mut u8, environ_buf: *mut u8) -> Result<()> { - let rc = wasi_snapshot_preview1::environ_get(environ, environ_buf); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(()) - } -} - -/// Return environment variable data sizes. -/// -/// ## Return -/// -/// * `environc` - The number of environment variable arguments. -/// * `environ_buf_size` - The size of the environment variable data. -pub unsafe fn environ_sizes_get() -> Result<(Size, Size)> { - let mut environc = MaybeUninit::uninit(); - let mut environ_buf_size = MaybeUninit::uninit(); - let rc = wasi_snapshot_preview1::environ_sizes_get( - environc.as_mut_ptr(), - environ_buf_size.as_mut_ptr(), - ); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok((environc.assume_init(), environ_buf_size.assume_init())) - } -} - -/// Return the resolution of a clock. -/// Implementations are required to provide a non-zero value for supported clocks. For unsupported clocks, -/// return `errno::inval`. -/// Note: This is similar to `clock_getres` in POSIX. -/// -/// ## Parameters -/// -/// * `id` - The clock for which to return the resolution. -/// -/// ## Return -/// -/// * `resolution` - The resolution of the clock. -pub unsafe fn clock_res_get(id: Clockid) -> Result { - let mut resolution = MaybeUninit::uninit(); - let rc = wasi_snapshot_preview1::clock_res_get(id, resolution.as_mut_ptr()); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(resolution.assume_init()) - } -} - -/// Return the time value of a clock. -/// Note: This is similar to `clock_gettime` in POSIX. -/// -/// ## Parameters -/// -/// * `id` - The clock for which to return the time. -/// * `precision` - The maximum lag (exclusive) that the returned time value may have, compared to its actual value. -/// -/// ## Return -/// -/// * `time` - The time value of the clock. -pub unsafe fn clock_time_get(id: Clockid, precision: Timestamp) -> Result { - let mut time = MaybeUninit::uninit(); - let rc = wasi_snapshot_preview1::clock_time_get(id, precision, time.as_mut_ptr()); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(time.assume_init()) - } -} - -/// Provide file advisory information on a file descriptor. -/// Note: This is similar to `posix_fadvise` in POSIX. -/// -/// ## Parameters -/// -/// * `offset` - The offset within the file to which the advisory applies. -/// * `len` - The length of the region to which the advisory applies. -/// * `advice` - The advice. -pub unsafe fn fd_advise(fd: Fd, offset: Filesize, len: Filesize, advice: Advice) -> Result<()> { - let rc = wasi_snapshot_preview1::fd_advise(fd, offset, len, advice); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(()) - } -} - -/// Force the allocation of space in a file. -/// Note: This is similar to `posix_fallocate` in POSIX. -/// -/// ## Parameters -/// -/// * `offset` - The offset at which to start the allocation. -/// * `len` - The length of the area that is allocated. -pub unsafe fn fd_allocate(fd: Fd, offset: Filesize, len: Filesize) -> Result<()> { - let rc = wasi_snapshot_preview1::fd_allocate(fd, offset, len); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(()) - } -} - -/// Close a file descriptor. -/// Note: This is similar to `close` in POSIX. -pub unsafe fn fd_close(fd: Fd) -> Result<()> { - let rc = wasi_snapshot_preview1::fd_close(fd); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(()) - } -} - -/// Synchronize the data of a file to disk. -/// Note: This is similar to `fdatasync` in POSIX. -pub unsafe fn fd_datasync(fd: Fd) -> Result<()> { - let rc = wasi_snapshot_preview1::fd_datasync(fd); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(()) - } -} - -/// Get the attributes of a file descriptor. -/// Note: This returns similar flags to `fsync(fd, F_GETFL)` in POSIX, as well as additional fields. -/// -/// ## Return -/// -/// * `stat` - The buffer where the file descriptor's attributes are stored. -pub unsafe fn fd_fdstat_get(fd: Fd) -> Result { - let mut stat = MaybeUninit::uninit(); - let rc = wasi_snapshot_preview1::fd_fdstat_get(fd, stat.as_mut_ptr()); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(stat.assume_init()) - } -} - -/// Adjust the flags associated with a file descriptor. -/// Note: This is similar to `fcntl(fd, F_SETFL, flags)` in POSIX. -/// -/// ## Parameters -/// -/// * `flags` - The desired values of the file descriptor flags. -pub unsafe fn fd_fdstat_set_flags(fd: Fd, flags: Fdflags) -> Result<()> { - let rc = wasi_snapshot_preview1::fd_fdstat_set_flags(fd, flags); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(()) - } -} - -/// Adjust the rights associated with a file descriptor. -/// This can only be used to remove rights, and returns `errno::notcapable` if called in a way that would attempt to add rights -/// -/// ## Parameters -/// -/// * `fs_rights_base` - The desired rights of the file descriptor. -pub unsafe fn fd_fdstat_set_rights( - fd: Fd, - fs_rights_base: Rights, - fs_rights_inheriting: Rights, -) -> Result<()> { - let rc = wasi_snapshot_preview1::fd_fdstat_set_rights(fd, fs_rights_base, fs_rights_inheriting); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(()) - } -} - -/// Return the attributes of an open file. -/// -/// ## Return -/// -/// * `buf` - The buffer where the file's attributes are stored. -pub unsafe fn fd_filestat_get(fd: Fd) -> Result { - let mut buf = MaybeUninit::uninit(); - let rc = wasi_snapshot_preview1::fd_filestat_get(fd, buf.as_mut_ptr()); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(buf.assume_init()) - } -} - -/// Adjust the size of an open file. If this increases the file's size, the extra bytes are filled with zeros. -/// Note: This is similar to `ftruncate` in POSIX. -/// -/// ## Parameters -/// -/// * `size` - The desired file size. -pub unsafe fn fd_filestat_set_size(fd: Fd, size: Filesize) -> Result<()> { - let rc = wasi_snapshot_preview1::fd_filestat_set_size(fd, size); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(()) - } -} - -/// Adjust the timestamps of an open file or directory. -/// Note: This is similar to `futimens` in POSIX. -/// -/// ## Parameters -/// -/// * `atim` - The desired values of the data access timestamp. -/// * `mtim` - The desired values of the data modification timestamp. -/// * `fst_flags` - A bitmask indicating which timestamps to adjust. -pub unsafe fn fd_filestat_set_times( - fd: Fd, - atim: Timestamp, - mtim: Timestamp, - fst_flags: Fstflags, -) -> Result<()> { - let rc = wasi_snapshot_preview1::fd_filestat_set_times(fd, atim, mtim, fst_flags); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(()) - } -} - -/// Read from a file descriptor, without using and updating the file descriptor's offset. -/// Note: This is similar to `preadv` in POSIX. -/// -/// ## Parameters -/// -/// * `iovs` - List of scatter/gather vectors in which to store data. -/// * `offset` - The offset within the file at which to read. -/// -/// ## Return -/// -/// * `nread` - The number of bytes read. -pub unsafe fn fd_pread(fd: Fd, iovs: IovecArray<'_>, offset: Filesize) -> Result { - let mut nread = MaybeUninit::uninit(); - let rc = - wasi_snapshot_preview1::fd_pread(fd, iovs.as_ptr(), iovs.len(), offset, nread.as_mut_ptr()); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(nread.assume_init()) - } -} - -/// Return a description of the given preopened file descriptor. -/// -/// ## Return -/// -/// * `buf` - The buffer where the description is stored. -pub unsafe fn fd_prestat_get(fd: Fd) -> Result { - let mut buf = MaybeUninit::uninit(); - let rc = wasi_snapshot_preview1::fd_prestat_get(fd, buf.as_mut_ptr()); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(buf.assume_init()) - } -} - -/// Return a description of the given preopened file descriptor. -/// -/// ## Parameters -/// -/// * `path` - A buffer into which to write the preopened directory name. -pub unsafe fn fd_prestat_dir_name(fd: Fd, path: *mut u8, path_len: Size) -> Result<()> { - let rc = wasi_snapshot_preview1::fd_prestat_dir_name(fd, path, path_len); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(()) - } -} - -/// Write to a file descriptor, without using and updating the file descriptor's offset. -/// Note: This is similar to `pwritev` in POSIX. -/// -/// ## Parameters -/// -/// * `iovs` - List of scatter/gather vectors from which to retrieve data. -/// * `offset` - The offset within the file at which to write. -/// -/// ## Return -/// -/// * `nwritten` - The number of bytes written. -pub unsafe fn fd_pwrite(fd: Fd, iovs: CiovecArray<'_>, offset: Filesize) -> Result { - let mut nwritten = MaybeUninit::uninit(); - let rc = wasi_snapshot_preview1::fd_pwrite( - fd, - iovs.as_ptr(), - iovs.len(), - offset, - nwritten.as_mut_ptr(), - ); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(nwritten.assume_init()) - } -} - -/// Read from a file descriptor. -/// Note: This is similar to `readv` in POSIX. -/// -/// ## Parameters -/// -/// * `iovs` - List of scatter/gather vectors to which to store data. -/// -/// ## Return -/// -/// * `nread` - The number of bytes read. -pub unsafe fn fd_read(fd: Fd, iovs: IovecArray<'_>) -> Result { - let mut nread = MaybeUninit::uninit(); - let rc = wasi_snapshot_preview1::fd_read(fd, iovs.as_ptr(), iovs.len(), nread.as_mut_ptr()); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(nread.assume_init()) - } -} - -/// Read directory entries from a directory. -/// When successful, the contents of the output buffer consist of a sequence of -/// directory entries. Each directory entry consists of a `dirent` object, -/// followed by `dirent::d_namlen` bytes holding the name of the directory -/// entry. -/// This function fills the output buffer as much as possible, potentially -/// truncating the last directory entry. This allows the caller to grow its -/// read buffer size in case it's too small to fit a single large directory -/// entry, or skip the oversized directory entry. -/// -/// ## Parameters -/// -/// * `buf` - The buffer where directory entries are stored -/// * `cookie` - The location within the directory to start reading -/// -/// ## Return -/// -/// * `bufused` - The number of bytes stored in the read buffer. If less than the size of the read buffer, the end of the directory has been reached. -pub unsafe fn fd_readdir(fd: Fd, buf: *mut u8, buf_len: Size, cookie: Dircookie) -> Result { - let mut bufused = MaybeUninit::uninit(); - let rc = wasi_snapshot_preview1::fd_readdir(fd, buf, buf_len, cookie, bufused.as_mut_ptr()); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(bufused.assume_init()) - } -} - -/// Atomically replace a file descriptor by renumbering another file descriptor. -/// Due to the strong focus on thread safety, this environment does not provide -/// a mechanism to duplicate or renumber a file descriptor to an arbitrary -/// number, like `dup2()`. This would be prone to race conditions, as an actual -/// file descriptor with the same number could be allocated by a different -/// thread at the same time. -/// This function provides a way to atomically renumber file descriptors, which -/// would disappear if `dup2()` were to be removed entirely. -/// -/// ## Parameters -/// -/// * `to` - The file descriptor to overwrite. -pub unsafe fn fd_renumber(fd: Fd, to: Fd) -> Result<()> { - let rc = wasi_snapshot_preview1::fd_renumber(fd, to); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(()) - } -} - -/// Move the offset of a file descriptor. -/// Note: This is similar to `lseek` in POSIX. -/// -/// ## Parameters -/// -/// * `offset` - The number of bytes to move. -/// * `whence` - The base from which the offset is relative. -/// -/// ## Return -/// -/// * `newoffset` - The new offset of the file descriptor, relative to the start of the file. -pub unsafe fn fd_seek(fd: Fd, offset: Filedelta, whence: Whence) -> Result { - let mut newoffset = MaybeUninit::uninit(); - let rc = wasi_snapshot_preview1::fd_seek(fd, offset, whence, newoffset.as_mut_ptr()); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(newoffset.assume_init()) - } -} - -/// Synchronize the data and metadata of a file to disk. -/// Note: This is similar to `fsync` in POSIX. -pub unsafe fn fd_sync(fd: Fd) -> Result<()> { - let rc = wasi_snapshot_preview1::fd_sync(fd); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(()) - } -} - -/// Return the current offset of a file descriptor. -/// Note: This is similar to `lseek(fd, 0, SEEK_CUR)` in POSIX. -/// -/// ## Return -/// -/// * `offset` - The current offset of the file descriptor, relative to the start of the file. -pub unsafe fn fd_tell(fd: Fd) -> Result { - let mut offset = MaybeUninit::uninit(); - let rc = wasi_snapshot_preview1::fd_tell(fd, offset.as_mut_ptr()); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(offset.assume_init()) - } -} - -/// Write to a file descriptor. -/// Note: This is similar to `writev` in POSIX. -/// -/// ## Parameters -/// -/// * `iovs` - List of scatter/gather vectors from which to retrieve data. -/// -/// ## Return -/// -/// * `nwritten` - The number of bytes written. -pub unsafe fn fd_write(fd: Fd, iovs: CiovecArray<'_>) -> Result { - let mut nwritten = MaybeUninit::uninit(); - let rc = wasi_snapshot_preview1::fd_write(fd, iovs.as_ptr(), iovs.len(), nwritten.as_mut_ptr()); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(nwritten.assume_init()) - } -} - -/// Create a directory. -/// Note: This is similar to `mkdirat` in POSIX. -/// -/// ## Parameters -/// -/// * `path` - The path at which to create the directory. -pub unsafe fn path_create_directory(fd: Fd, path: &str) -> Result<()> { - let rc = wasi_snapshot_preview1::path_create_directory(fd, path.as_ptr(), path.len()); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(()) - } -} - -/// Return the attributes of a file or directory. -/// Note: This is similar to `stat` in POSIX. -/// -/// ## Parameters -/// -/// * `flags` - Flags determining the method of how the path is resolved. -/// * `path` - The path of the file or directory to inspect. -/// -/// ## Return -/// -/// * `buf` - The buffer where the file's attributes are stored. -pub unsafe fn path_filestat_get(fd: Fd, flags: Lookupflags, path: &str) -> Result { - let mut buf = MaybeUninit::uninit(); - let rc = wasi_snapshot_preview1::path_filestat_get( - fd, - flags, - path.as_ptr(), - path.len(), - buf.as_mut_ptr(), - ); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(buf.assume_init()) - } -} - -/// Adjust the timestamps of a file or directory. -/// Note: This is similar to `utimensat` in POSIX. -/// -/// ## Parameters -/// -/// * `flags` - Flags determining the method of how the path is resolved. -/// * `path` - The path of the file or directory to operate on. -/// * `atim` - The desired values of the data access timestamp. -/// * `mtim` - The desired values of the data modification timestamp. -/// * `fst_flags` - A bitmask indicating which timestamps to adjust. -pub unsafe fn path_filestat_set_times( - fd: Fd, - flags: Lookupflags, - path: &str, - atim: Timestamp, - mtim: Timestamp, - fst_flags: Fstflags, -) -> Result<()> { - let rc = wasi_snapshot_preview1::path_filestat_set_times( - fd, - flags, - path.as_ptr(), - path.len(), - atim, - mtim, - fst_flags, - ); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(()) - } -} - -/// Create a hard link. -/// Note: This is similar to `linkat` in POSIX. -/// -/// ## Parameters -/// -/// * `old_flags` - Flags determining the method of how the path is resolved. -/// * `old_path` - The source path from which to link. -/// * `new_fd` - The working directory at which the resolution of the new path starts. -/// * `new_path` - The destination path at which to create the hard link. -pub unsafe fn path_link( - old_fd: Fd, - old_flags: Lookupflags, - old_path: &str, - new_fd: Fd, - new_path: &str, -) -> Result<()> { - let rc = wasi_snapshot_preview1::path_link( - old_fd, - old_flags, - old_path.as_ptr(), - old_path.len(), - new_fd, - new_path.as_ptr(), - new_path.len(), - ); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(()) - } -} - -/// Open a file or directory. -/// The returned file descriptor is not guaranteed to be the lowest-numbered -/// file descriptor not currently open; it is randomized to prevent -/// applications from depending on making assumptions about indexes, since this -/// is error-prone in multi-threaded contexts. The returned file descriptor is -/// guaranteed to be less than 2**31. -/// Note: This is similar to `openat` in POSIX. -/// -/// ## Parameters -/// -/// * `dirflags` - Flags determining the method of how the path is resolved. -/// * `path` - The relative path of the file or directory to open, relative to the -/// `path_open::fd` directory. -/// * `oflags` - The method by which to open the file. -/// * `fs_rights_base` - The initial rights of the newly created file descriptor. The -/// implementation is allowed to return a file descriptor with fewer rights -/// than specified, if and only if those rights do not apply to the type of -/// file being opened. -/// The *base* rights are rights that will apply to operations using the file -/// descriptor itself, while the *inheriting* rights are rights that apply to -/// file descriptors derived from it. -/// -/// ## Return -/// -/// * `opened_fd` - The file descriptor of the file that has been opened. -pub unsafe fn path_open( - fd: Fd, - dirflags: Lookupflags, - path: &str, - oflags: Oflags, - fs_rights_base: Rights, - fs_rights_inheriting: Rights, - fdflags: Fdflags, -) -> Result { - let mut opened_fd = MaybeUninit::uninit(); - let rc = wasi_snapshot_preview1::path_open( - fd, - dirflags, - path.as_ptr(), - path.len(), - oflags, - fs_rights_base, - fs_rights_inheriting, - fdflags, - opened_fd.as_mut_ptr(), - ); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(opened_fd.assume_init()) - } -} - -/// Read the contents of a symbolic link. -/// Note: This is similar to `readlinkat` in POSIX. -/// -/// ## Parameters -/// -/// * `path` - The path of the symbolic link from which to read. -/// * `buf` - The buffer to which to write the contents of the symbolic link. -/// -/// ## Return -/// -/// * `bufused` - The number of bytes placed in the buffer. -pub unsafe fn path_readlink(fd: Fd, path: &str, buf: *mut u8, buf_len: Size) -> Result { - let mut bufused = MaybeUninit::uninit(); - let rc = wasi_snapshot_preview1::path_readlink( - fd, - path.as_ptr(), - path.len(), - buf, - buf_len, - bufused.as_mut_ptr(), - ); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(bufused.assume_init()) - } -} - -/// Remove a directory. -/// Return `errno::notempty` if the directory is not empty. -/// Note: This is similar to `unlinkat(fd, path, AT_REMOVEDIR)` in POSIX. -/// -/// ## Parameters -/// -/// * `path` - The path to a directory to remove. -pub unsafe fn path_remove_directory(fd: Fd, path: &str) -> Result<()> { - let rc = wasi_snapshot_preview1::path_remove_directory(fd, path.as_ptr(), path.len()); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(()) - } -} - -/// Rename a file or directory. -/// Note: This is similar to `renameat` in POSIX. -/// -/// ## Parameters -/// -/// * `old_path` - The source path of the file or directory to rename. -/// * `new_fd` - The working directory at which the resolution of the new path starts. -/// * `new_path` - The destination path to which to rename the file or directory. -pub unsafe fn path_rename(fd: Fd, old_path: &str, new_fd: Fd, new_path: &str) -> Result<()> { - let rc = wasi_snapshot_preview1::path_rename( - fd, - old_path.as_ptr(), - old_path.len(), - new_fd, - new_path.as_ptr(), - new_path.len(), - ); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(()) - } -} - -/// Create a symbolic link. -/// Note: This is similar to `symlinkat` in POSIX. -/// -/// ## Parameters -/// -/// * `old_path` - The contents of the symbolic link. -/// * `new_path` - The destination path at which to create the symbolic link. -pub unsafe fn path_symlink(old_path: &str, fd: Fd, new_path: &str) -> Result<()> { - let rc = wasi_snapshot_preview1::path_symlink( - old_path.as_ptr(), - old_path.len(), - fd, - new_path.as_ptr(), - new_path.len(), - ); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(()) - } -} - -/// Unlink a file. -/// Return `errno::isdir` if the path refers to a directory. -/// Note: This is similar to `unlinkat(fd, path, 0)` in POSIX. -/// -/// ## Parameters -/// -/// * `path` - The path to a file to unlink. -pub unsafe fn path_unlink_file(fd: Fd, path: &str) -> Result<()> { - let rc = wasi_snapshot_preview1::path_unlink_file(fd, path.as_ptr(), path.len()); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(()) - } -} - -/// Concurrently poll for the occurrence of a set of events. -/// -/// ## Parameters -/// -/// * `r#in` - The events to which to subscribe. -/// * `out` - The events that have occurred. -/// * `nsubscriptions` - Both the number of subscriptions and events. -/// -/// ## Return -/// -/// * `nevents` - The number of events stored. -pub unsafe fn poll_oneoff( - r#in: *const Subscription, - out: *mut Event, - nsubscriptions: Size, -) -> Result { - let mut nevents = MaybeUninit::uninit(); - let rc = wasi_snapshot_preview1::poll_oneoff(r#in, out, nsubscriptions, nevents.as_mut_ptr()); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(nevents.assume_init()) - } -} - -/// Terminate the process normally. An exit code of 0 indicates successful -/// termination of the program. The meanings of other values is dependent on -/// the environment. -/// -/// ## Parameters -/// -/// * `rval` - The exit code returned by the process. -pub unsafe fn proc_exit(rval: Exitcode) { - wasi_snapshot_preview1::proc_exit(rval); -} - -/// Send a signal to the process of the calling thread. -/// Note: This is similar to `raise` in POSIX. -/// -/// ## Parameters -/// -/// * `sig` - The signal condition to trigger. -pub unsafe fn proc_raise(sig: Signal) -> Result<()> { - let rc = wasi_snapshot_preview1::proc_raise(sig); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(()) - } -} - -/// Temporarily yield execution of the calling thread. -/// Note: This is similar to `sched_yield` in POSIX. -pub unsafe fn sched_yield() -> Result<()> { - let rc = wasi_snapshot_preview1::sched_yield(); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(()) - } -} - -/// Write high-quality random data into a buffer. -/// This function blocks when the implementation is unable to immediately -/// provide sufficient high-quality random data. -/// This function may execute slowly, so when large mounts of random data are -/// required, it's advisable to use this function to seed a pseudo-random -/// number generator, rather than to provide the random data directly. -/// -/// ## Parameters -/// -/// * `buf` - The buffer to fill with random data. -pub unsafe fn random_get(buf: *mut u8, buf_len: Size) -> Result<()> { - let rc = wasi_snapshot_preview1::random_get(buf, buf_len); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(()) - } -} - -/// Receive a message from a socket. -/// Note: This is similar to `recv` in POSIX, though it also supports reading -/// the data into multiple buffers in the manner of `readv`. -/// -/// ## Parameters -/// -/// * `ri_data` - List of scatter/gather vectors to which to store data. -/// * `ri_flags` - Message flags. -/// -/// ## Return -/// -/// * `ro_datalen` - Number of bytes stored in ri_data. -/// * `ro_flags` - Message flags. -pub unsafe fn sock_recv( - fd: Fd, - ri_data: IovecArray<'_>, - ri_flags: Riflags, -) -> Result<(Size, Roflags)> { - let mut ro_datalen = MaybeUninit::uninit(); - let mut ro_flags = MaybeUninit::uninit(); - let rc = wasi_snapshot_preview1::sock_recv( - fd, - ri_data.as_ptr(), - ri_data.len(), - ri_flags, - ro_datalen.as_mut_ptr(), - ro_flags.as_mut_ptr(), - ); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok((ro_datalen.assume_init(), ro_flags.assume_init())) - } -} - -/// Send a message on a socket. -/// Note: This is similar to `send` in POSIX, though it also supports writing -/// the data from multiple buffers in the manner of `writev`. -/// -/// ## Parameters -/// -/// * `si_data` - List of scatter/gather vectors to which to retrieve data -/// * `si_flags` - Message flags. -/// -/// ## Return -/// -/// * `so_datalen` - Number of bytes transmitted. -pub unsafe fn sock_send(fd: Fd, si_data: CiovecArray<'_>, si_flags: Siflags) -> Result { - let mut so_datalen = MaybeUninit::uninit(); - let rc = wasi_snapshot_preview1::sock_send( - fd, - si_data.as_ptr(), - si_data.len(), - si_flags, - so_datalen.as_mut_ptr(), - ); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(so_datalen.assume_init()) - } -} - -/// Shut down socket send and receive channels. -/// Note: This is similar to `shutdown` in POSIX. -/// -/// ## Parameters -/// -/// * `how` - Which channels on the socket to shut down. -pub unsafe fn sock_shutdown(fd: Fd, how: Sdflags) -> Result<()> { - let rc = wasi_snapshot_preview1::sock_shutdown(fd, how); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(()) - } -} - -pub mod wasi_snapshot_preview1 { - use super::*; - #[link(wasm_import_module = "wasi_snapshot_preview1")] - extern "C" { - /// Read command-line argument data. - /// The size of the array should match that returned by `args_sizes_get` - pub fn args_get(argv: *mut *mut u8, argv_buf: *mut u8) -> Errno; - /// Return command-line argument data sizes. - pub fn args_sizes_get(argc: *mut Size, argv_buf_size: *mut Size) -> Errno; - /// Read environment variable data. - /// The sizes of the buffers should match that returned by `environ_sizes_get`. - pub fn environ_get(environ: *mut *mut u8, environ_buf: *mut u8) -> Errno; - /// Return environment variable data sizes. - pub fn environ_sizes_get(environc: *mut Size, environ_buf_size: *mut Size) -> Errno; - /// Return the resolution of a clock. - /// Implementations are required to provide a non-zero value for supported clocks. For unsupported clocks, - /// return `errno::inval`. - /// Note: This is similar to `clock_getres` in POSIX. - pub fn clock_res_get(id: Clockid, resolution: *mut Timestamp) -> Errno; - /// Return the time value of a clock. - /// Note: This is similar to `clock_gettime` in POSIX. - pub fn clock_time_get(id: Clockid, precision: Timestamp, time: *mut Timestamp) -> Errno; - /// Provide file advisory information on a file descriptor. - /// Note: This is similar to `posix_fadvise` in POSIX. - pub fn fd_advise(fd: Fd, offset: Filesize, len: Filesize, advice: Advice) -> Errno; - /// Force the allocation of space in a file. - /// Note: This is similar to `posix_fallocate` in POSIX. - pub fn fd_allocate(fd: Fd, offset: Filesize, len: Filesize) -> Errno; - /// Close a file descriptor. - /// Note: This is similar to `close` in POSIX. - pub fn fd_close(fd: Fd) -> Errno; - /// Synchronize the data of a file to disk. - /// Note: This is similar to `fdatasync` in POSIX. - pub fn fd_datasync(fd: Fd) -> Errno; - /// Get the attributes of a file descriptor. - /// Note: This returns similar flags to `fsync(fd, F_GETFL)` in POSIX, as well as additional fields. - pub fn fd_fdstat_get(fd: Fd, stat: *mut Fdstat) -> Errno; - /// Adjust the flags associated with a file descriptor. - /// Note: This is similar to `fcntl(fd, F_SETFL, flags)` in POSIX. - pub fn fd_fdstat_set_flags(fd: Fd, flags: Fdflags) -> Errno; - /// Adjust the rights associated with a file descriptor. - /// This can only be used to remove rights, and returns `errno::notcapable` if called in a way that would attempt to add rights - pub fn fd_fdstat_set_rights( - fd: Fd, - fs_rights_base: Rights, - fs_rights_inheriting: Rights, - ) -> Errno; - /// Return the attributes of an open file. - pub fn fd_filestat_get(fd: Fd, buf: *mut Filestat) -> Errno; - /// Adjust the size of an open file. If this increases the file's size, the extra bytes are filled with zeros. - /// Note: This is similar to `ftruncate` in POSIX. - pub fn fd_filestat_set_size(fd: Fd, size: Filesize) -> Errno; - /// Adjust the timestamps of an open file or directory. - /// Note: This is similar to `futimens` in POSIX. - pub fn fd_filestat_set_times( - fd: Fd, - atim: Timestamp, - mtim: Timestamp, - fst_flags: Fstflags, - ) -> Errno; - /// Read from a file descriptor, without using and updating the file descriptor's offset. - /// Note: This is similar to `preadv` in POSIX. - pub fn fd_pread( - fd: Fd, - iovs_ptr: *const Iovec, - iovs_len: usize, - offset: Filesize, - nread: *mut Size, - ) -> Errno; - /// Return a description of the given preopened file descriptor. - pub fn fd_prestat_get(fd: Fd, buf: *mut Prestat) -> Errno; - /// Return a description of the given preopened file descriptor. - pub fn fd_prestat_dir_name(fd: Fd, path: *mut u8, path_len: Size) -> Errno; - /// Write to a file descriptor, without using and updating the file descriptor's offset. - /// Note: This is similar to `pwritev` in POSIX. - pub fn fd_pwrite( - fd: Fd, - iovs_ptr: *const Ciovec, - iovs_len: usize, - offset: Filesize, - nwritten: *mut Size, - ) -> Errno; - /// Read from a file descriptor. - /// Note: This is similar to `readv` in POSIX. - pub fn fd_read(fd: Fd, iovs_ptr: *const Iovec, iovs_len: usize, nread: *mut Size) -> Errno; - /// Read directory entries from a directory. - /// When successful, the contents of the output buffer consist of a sequence of - /// directory entries. Each directory entry consists of a `dirent` object, - /// followed by `dirent::d_namlen` bytes holding the name of the directory - /// entry. - /// This function fills the output buffer as much as possible, potentially - /// truncating the last directory entry. This allows the caller to grow its - /// read buffer size in case it's too small to fit a single large directory - /// entry, or skip the oversized directory entry. - pub fn fd_readdir( - fd: Fd, - buf: *mut u8, - buf_len: Size, - cookie: Dircookie, - bufused: *mut Size, - ) -> Errno; - /// Atomically replace a file descriptor by renumbering another file descriptor. - /// Due to the strong focus on thread safety, this environment does not provide - /// a mechanism to duplicate or renumber a file descriptor to an arbitrary - /// number, like `dup2()`. This would be prone to race conditions, as an actual - /// file descriptor with the same number could be allocated by a different - /// thread at the same time. - /// This function provides a way to atomically renumber file descriptors, which - /// would disappear if `dup2()` were to be removed entirely. - pub fn fd_renumber(fd: Fd, to: Fd) -> Errno; - /// Move the offset of a file descriptor. - /// Note: This is similar to `lseek` in POSIX. - pub fn fd_seek( - fd: Fd, - offset: Filedelta, - whence: Whence, - newoffset: *mut Filesize, - ) -> Errno; - /// Synchronize the data and metadata of a file to disk. - /// Note: This is similar to `fsync` in POSIX. - pub fn fd_sync(fd: Fd) -> Errno; - /// Return the current offset of a file descriptor. - /// Note: This is similar to `lseek(fd, 0, SEEK_CUR)` in POSIX. - pub fn fd_tell(fd: Fd, offset: *mut Filesize) -> Errno; - /// Write to a file descriptor. - /// Note: This is similar to `writev` in POSIX. - pub fn fd_write( - fd: Fd, - iovs_ptr: *const Ciovec, - iovs_len: usize, - nwritten: *mut Size, - ) -> Errno; - /// Create a directory. - /// Note: This is similar to `mkdirat` in POSIX. - pub fn path_create_directory(fd: Fd, path_ptr: *const u8, path_len: usize) -> Errno; - /// Return the attributes of a file or directory. - /// Note: This is similar to `stat` in POSIX. - pub fn path_filestat_get( - fd: Fd, - flags: Lookupflags, - path_ptr: *const u8, - path_len: usize, - buf: *mut Filestat, - ) -> Errno; - /// Adjust the timestamps of a file or directory. - /// Note: This is similar to `utimensat` in POSIX. - pub fn path_filestat_set_times( - fd: Fd, - flags: Lookupflags, - path_ptr: *const u8, - path_len: usize, - atim: Timestamp, - mtim: Timestamp, - fst_flags: Fstflags, - ) -> Errno; - /// Create a hard link. - /// Note: This is similar to `linkat` in POSIX. - pub fn path_link( - old_fd: Fd, - old_flags: Lookupflags, - old_path_ptr: *const u8, - old_path_len: usize, - new_fd: Fd, - new_path_ptr: *const u8, - new_path_len: usize, - ) -> Errno; - /// Open a file or directory. - /// The returned file descriptor is not guaranteed to be the lowest-numbered - /// file descriptor not currently open; it is randomized to prevent - /// applications from depending on making assumptions about indexes, since this - /// is error-prone in multi-threaded contexts. The returned file descriptor is - /// guaranteed to be less than 2**31. - /// Note: This is similar to `openat` in POSIX. - pub fn path_open( - fd: Fd, - dirflags: Lookupflags, - path_ptr: *const u8, - path_len: usize, - oflags: Oflags, - fs_rights_base: Rights, - fs_rights_inheriting: Rights, - fdflags: Fdflags, - opened_fd: *mut Fd, - ) -> Errno; - /// Read the contents of a symbolic link. - /// Note: This is similar to `readlinkat` in POSIX. - pub fn path_readlink( - fd: Fd, - path_ptr: *const u8, - path_len: usize, - buf: *mut u8, - buf_len: Size, - bufused: *mut Size, - ) -> Errno; - /// Remove a directory. - /// Return `errno::notempty` if the directory is not empty. - /// Note: This is similar to `unlinkat(fd, path, AT_REMOVEDIR)` in POSIX. - pub fn path_remove_directory(fd: Fd, path_ptr: *const u8, path_len: usize) -> Errno; - /// Rename a file or directory. - /// Note: This is similar to `renameat` in POSIX. - pub fn path_rename( - fd: Fd, - old_path_ptr: *const u8, - old_path_len: usize, - new_fd: Fd, - new_path_ptr: *const u8, - new_path_len: usize, - ) -> Errno; - /// Create a symbolic link. - /// Note: This is similar to `symlinkat` in POSIX. - pub fn path_symlink( - old_path_ptr: *const u8, - old_path_len: usize, - fd: Fd, - new_path_ptr: *const u8, - new_path_len: usize, - ) -> Errno; - /// Unlink a file. - /// Return `errno::isdir` if the path refers to a directory. - /// Note: This is similar to `unlinkat(fd, path, 0)` in POSIX. - pub fn path_unlink_file(fd: Fd, path_ptr: *const u8, path_len: usize) -> Errno; - /// Concurrently poll for the occurrence of a set of events. - pub fn poll_oneoff( - r#in: *const Subscription, - out: *mut Event, - nsubscriptions: Size, - nevents: *mut Size, - ) -> Errno; - /// Terminate the process normally. An exit code of 0 indicates successful - /// termination of the program. The meanings of other values is dependent on - /// the environment. - pub fn proc_exit(rval: Exitcode) -> !; - /// Send a signal to the process of the calling thread. - /// Note: This is similar to `raise` in POSIX. - pub fn proc_raise(sig: Signal) -> Errno; - /// Temporarily yield execution of the calling thread. - /// Note: This is similar to `sched_yield` in POSIX. - pub fn sched_yield() -> Errno; - /// Write high-quality random data into a buffer. - /// This function blocks when the implementation is unable to immediately - /// provide sufficient high-quality random data. - /// This function may execute slowly, so when large mounts of random data are - /// required, it's advisable to use this function to seed a pseudo-random - /// number generator, rather than to provide the random data directly. - pub fn random_get(buf: *mut u8, buf_len: Size) -> Errno; - /// Receive a message from a socket. - /// Note: This is similar to `recv` in POSIX, though it also supports reading - /// the data into multiple buffers in the manner of `readv`. - pub fn sock_recv( - fd: Fd, - ri_data_ptr: *const Iovec, - ri_data_len: usize, - ri_flags: Riflags, - ro_datalen: *mut Size, - ro_flags: *mut Roflags, - ) -> Errno; - /// Send a message on a socket. - /// Note: This is similar to `send` in POSIX, though it also supports writing - /// the data from multiple buffers in the manner of `writev`. - pub fn sock_send( - fd: Fd, - si_data_ptr: *const Ciovec, - si_data_len: usize, - si_flags: Siflags, - so_datalen: *mut Size, - ) -> Errno; - /// Shut down socket send and receive channels. - /// Note: This is similar to `shutdown` in POSIX. - pub fn sock_shutdown(fd: Fd, how: Sdflags) -> Errno; - } -} diff -Nru temporalio-1.3.0/vendor/wasi-0.10.2+wasi-snapshot-preview1/src/lib.rs temporalio-1.3.0/vendor/wasi-0.10.2+wasi-snapshot-preview1/src/lib.rs --- temporalio-1.3.0/vendor/wasi-0.10.2+wasi-snapshot-preview1/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/wasi-0.10.2+wasi-snapshot-preview1/src/lib.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,48 +0,0 @@ -//! Raw API bindings to the WebAssembly System Interface (WASI) -//! -//! This crate provides Rust API bindings to WASI APIs. All WASI APIs are -//! exported from this crate and provided with the appropriate type signatures. -//! This crate is entirely procedurally generated from the `*.witx` files that -//! describe the WASI API. -//! -//! # WASI API Version -//! -//! The WASI API is evolving over time. It is both gaining new features as well -//! as tweaking the ABI of existing features. As a result it's important to -//! understand what version of this crate you're using and how it relates to -//! the WASI version of the spec. -//! -//! The WASI specification is organized into phases where there is a snapshot -//! at any one point in time describing the current state of the specification. -//! This crate implements a particular snapshot. You can find the snapshot -//! version implemented in this crate in the build metadata of the crate -//! version number. For example something like `0.9.0+wasi-snapshot-preview1` -//! means that this crate's own personal version is 0.9.0 and it implements the -//! `wasi-snapshot-preview1` snapshot. A major release of this crate (i.e. -//! bumping the "0.9.0") is expected whenever the generated code changes -//! or a new WASI snapshot is used. -//! -//! # Crate Features -//! -//! This crate supports one feature, `std`, which implements the standard -//! `Error` trait for the exported [`Error`] type in this crate. This is -//! enabled by default but can be disabled to make the library `no_std` -//! compatible. - -#![no_std] - -mod error; -mod lib_generated; -pub use lib_generated::*; - -/// Special `Dircookie` value indicating the start of a directory. -pub const DIRCOOKIE_START: Dircookie = 0; - -/// The "standard input" descriptor number. -pub const FD_STDIN: Fd = 0; - -/// The "standard output" descriptor number. -pub const FD_STDOUT: Fd = 1; - -/// The "standard error" descriptor number. -pub const FD_STDERR: Fd = 2; diff -Nru temporalio-1.3.0/vendor/webpki/.cargo-checksum.json temporalio-1.3.0/vendor/webpki/.cargo-checksum.json --- temporalio-1.3.0/vendor/webpki/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/webpki/.cargo-checksum.json 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -{"files":{"Cargo.toml":"78d344e8110d5c32828dba68cc11f8b0af043858586ff9ffb22c62398e180398","LICENSE":"5b698ca13897be3afdb7174256fa1574f8c6892b8bea1a66dd6469d3fe27885a","README.md":"87d46581bccb893db159eb6d646ff6ed2bb00404a0b1aad0a8695c3f304dfdf7","src/budget.rs":"2e25e7b52f440a0869b96f5739f63e75a1977dd8a35e8a596a85a9ac3998a53b","src/calendar.rs":"3a6055dae96bb6ac870bb3a56afe4a4c0f4daed92543621dd3b9229857d7873e","src/cert.rs":"b686e1de3e8976731e359ab7b2e9344941afa2b946403b3a51f11e630abdc085","src/data/README.md":"d11d9e6adfe7c9e84d9c5956e5257eb656640f817aab391d3eef4878a73aeb20","src/data/alg-ecdsa-p256.der":"431ab0da5859f972141d7a6b17bfff1006ec2465878890eecacf4764748f999a","src/data/alg-ecdsa-p384.der":"a6307e2efeff1b4db45622b626b9a0f2b6395be5dd4024a899c057e512a0207e","src/data/alg-ecdsa-sha256.der":"8748ad98184c8f81b5db874ef1b7d3599afe05e2f92dac215a77f45e9b0699bc","src/data/alg-ecdsa-sha384.der":"5f6e0dc69f6930ca890ebcafaf7677254640b931439cd5bcad7688b1a06aaf92","src/data/alg-ed25519.der":"0b6d661fe75a1ce7a832d515b39b504032f1a6cbb67a5113fa74d635d038f4d9","src/data/alg-rsa-encryption.der":"7bc023427767a2f2e156f8ae030d06d19f862e326b952116649b423c3ff7110e","src/data/alg-rsa-pkcs1-sha256.der":"c0d1c5108d05adfdf58c73697af5c4e644d1a09fb2e4a76361c048eb0ec7a219","src/data/alg-rsa-pkcs1-sha384.der":"d3e50513620bac7e02f5c1821c569cf4fc2ca5a891fd1103e36574c77e6a888a","src/data/alg-rsa-pkcs1-sha512.der":"3705399877ad5d5bb559e5b5ed3cd80b352166511c2fd2b8f8959e1176ed72f8","src/data/alg-rsa-pss-sha256.der":"6eeb65499d8c64c3ef3e74305f2daaca0d947e7fca735ad072b5581392d73068","src/data/alg-rsa-pss-sha384.der":"b6e27adae679feb8f49925f4457da316657a6b7a55a1bfd164c66eec59d7d090","src/data/alg-rsa-pss-sha512.der":"60cea04c0dcb23c248eb644fe036d1b6b883004f73c68785895c885c8fa5d688","src/der.rs":"3cbb15c8503fc7597a543ea1f2d167a7a375cf3c8fbf8404088e123092c76e4a","src/end_entity.rs":"23a103e48ad09e23448754b1c7151bc194d20589da02f153aeede512ab190c0b","src/error.rs":"6188eac0b7390461429b91e642554ebe0e3612a355378a4843dc53da1d24ca5d","src/lib.rs":"d27f7af213c3db80d66a6a205005c42633b0e01baf6ff77faf1a3a7d8e2ed342","src/name.rs":"765b83112277f6bca6f6a46d55ea8beeb2c8cc32c2f44b03a40b665582e5aba8","src/name/dns_name.rs":"29368d38dbc1788d2516d4097ef7b607fc2c7200f0b676f4f097b517fbbf3532","src/name/ip_address.rs":"7a2b1c618d5a58addd1255cf836794478e24fcd8c0e0536f4da61823f466b270","src/name/verify.rs":"955b69df1b61ae4479c60aa1d3af616dbbe856dc3558b01626425fd663fc036f","src/signed_data.rs":"0c091475becad59e926f3c8b09556d7caee77c28c24bcc780d08eab81b43009b","src/time.rs":"1534f96f964acaf7dcaf6fee974f216241d39a52ff28779b264b79f1f949b072","src/trust_anchor.rs":"10920d313c4cc3ffa4eaea745b53c87d126e0e4b4888a9bde935b2820cd1d77c","src/verify_cert.rs":"007a2f4c176ec646c19dd8b94febca54653e23463bfc4d32196eb381790ea167","tests/dns_name_tests.rs":"9836ea648dcbd278680c9d32203fbd7925653baac4edb0f5d69eebd9605f8cc8","tests/ed25519/ca.der":"57c4b8e513e17954a5e0e4e11a63937c52507d1ffd36436e2b76e9b789ff1a2b","tests/ed25519/ee.der":"f32db7607b3c15ca3203d1c93064a47c5977288c5b2faa6ca2b11bf22b02911a","tests/integration.rs":"fd79e2e8a2637ddaf153c8532d394705b72d50490d26bbcc0779c9fc27c6a31c","tests/misc/serial_neg.der":"88497f01602f3154246ae28c4d5aef10f1d87ebb76626f4ae0b7f95ba7968799","tests/misc/serial_zero.der":"c3846bf24b9e93ca64274c0ec67c1ecc5e024ffcacd2d74019350e81fe546ae4","tests/netflix/ca.der":"eb04cf5eb1f39afa762f2bb120f296cba520c1b97db1589565b81cb9a17b7244","tests/netflix/ee.der":"d58b0dcbd15594693041633bbc788af700df3f8f243a1e09afe8cc585010322c","tests/netflix/inter.der":"564dbc6a76550fd2d4f4bac6448a1157b33cbd8e0b3fd76d72107540964a85b5","third-party/bettertls/LICENSE":"0cec06e0e55fbc3dc5cee4fca9b607f66cb8f4e4dbcf3b3c013594dd156732e9","third-party/bettertls/README.md":"4270e6ccb626095d638cb1f8c880d3c7cad7a85cc0d39525dee6aed22aeb48e1","third-party/chromium/LICENSE":"845022e0c1db1abb41a6ba4cd3c4b674ec290f3359d9d3c78ae558d4c0ed9308","third-party/chromium/data/verify_signed_data/README":"ca567fd754630fc28d0c8d1c84e0ef4e3f24169d82a913ed5f2e93b6531b36b0","third-party/chromium/data/verify_signed_data/ecdsa-prime256v1-sha512-spki-params-null.pem":"6ac6f5033fa11fd1a7c6a4df5f7ee790e3e572dac0a43c1f85d767ddc5683c21","third-party/chromium/data/verify_signed_data/ecdsa-prime256v1-sha512-unused-bits-signature.pem":"da3d8e9b8dddff9581c9218be447538e01cf84d629dab8b310a4c48e59689110","third-party/chromium/data/verify_signed_data/ecdsa-prime256v1-sha512-using-ecdh-key.pem":"0ace58a75dcb69766e8ca5ef1e2ef936f4b54d2e3430db5bd1fa99745799af77","third-party/chromium/data/verify_signed_data/ecdsa-prime256v1-sha512-using-ecmqv-key.pem":"2b5f1f423e3483d6747d9c1bbf5ccb27db830cbb24635fa235da9ee7ffa007f6","third-party/chromium/data/verify_signed_data/ecdsa-prime256v1-sha512-using-rsa-algorithm.pem":"45cd7e8bcc1e98498e6bdf16c57dcf3067525e3767113ed1ce1e2fb9d0d01ce0","third-party/chromium/data/verify_signed_data/ecdsa-prime256v1-sha512-wrong-signature-format.pem":"cb3bfe67be334ce01968aa760138f02324105524516438d8610cbd2fe2360425","third-party/chromium/data/verify_signed_data/ecdsa-prime256v1-sha512.pem":"111a3dc873ba1a8dd1a9c931b82ce34f0039a08ff919e2cdd528501e58270ad9","third-party/chromium/data/verify_signed_data/ecdsa-secp384r1-sha256-corrupted-data.pem":"143d020b5588b2af8fbe18e65589057c732982b6885d4bf9dc5dd14edf142768","third-party/chromium/data/verify_signed_data/ecdsa-secp384r1-sha256.pem":"96a6d3c113baa699e0187b0819cce1426523765f41d2287bd7f0902445d55878","third-party/chromium/data/verify_signed_data/ecdsa-using-rsa-key.pem":"ce2c52394c03f95f3a121b18185d99069f3a108f9dd3bc7c66426afecf3a1b47","third-party/chromium/data/verify_signed_data/ours/make-pss.py":"d479969c331b4de04f58b1ff618942c718b582836d75db19cc062dcd4a7f68a8","third-party/chromium/data/verify_signed_data/ours/priv.pem":"0516362bfad16242368004f46677589ecc37ff85152a3a7d3e665102e60bbb0b","third-party/chromium/data/verify_signed_data/ours/pub.pem":"5844c42bdef22e6d81621ebff836623241fbfca893a00ea3c6b8de4e0c05e7b5","third-party/chromium/data/verify_signed_data/ours/rsa-pss-sha256-salt32-corrupted-data.pem":"8b5c942f19ae52eee1847515d4dd4970809768a7fcbcad691113e08ba90c6787","third-party/chromium/data/verify_signed_data/ours/rsa-pss-sha256-salt32.pem":"3e68c625cfa80c7dd1aee27e0336892249e00b5f3604d5141e317f4416cef728","third-party/chromium/data/verify_signed_data/ours/rsa-pss-sha384-salt48-corrupted-data.pem":"f624bc417b404cf6ebafd82cff02a611b3975af1217eca0aa88d37e0e8824b5a","third-party/chromium/data/verify_signed_data/ours/rsa-pss-sha384-salt48.pem":"3673206911aa4bd8b4da9e951e37bbe6258f718d5521dc01da21936a9c92d172","third-party/chromium/data/verify_signed_data/ours/rsa-pss-sha512-salt64-corrupted-data.pem":"bdcbfdc14c1d6adf01a86b8e7803be9a76dceb788fbf029ac2f67e482c277483","third-party/chromium/data/verify_signed_data/ours/rsa-pss-sha512-salt64.pem":"1a817548b4dc518a09eba5365787dc49fe30d643b21d24bf905284f6d2713ae8","third-party/chromium/data/verify_signed_data/rsa-pkcs1-sha1-bad-key-der-length.pem":"d1b50934145834a4a7dedaf0a95ec557279721a2e7b91bd14fb2ba64393e8d32","third-party/chromium/data/verify_signed_data/rsa-pkcs1-sha1-bad-key-der-null.pem":"0c983dbd426b12b939e78c2149da2089250bac97af4b883aaae9bd27b01b761a","third-party/chromium/data/verify_signed_data/rsa-pkcs1-sha1-key-params-absent.pem":"8f85c6ed8b3d8414b11c2881ac2945d59aab762671c847614a26d824110589c8","third-party/chromium/data/verify_signed_data/rsa-pkcs1-sha1-using-pss-key-no-params.pem":"773165ba6b867a71f88373a34b9dba676677ff5268b1ebd7e42f80ba323115de","third-party/chromium/data/verify_signed_data/rsa-pkcs1-sha1-wrong-algorithm.pem":"bf0ca6fe4176e3ec0198d60d37def6b836a74bfd96efd2122fb1d1703320d9e3","third-party/chromium/data/verify_signed_data/rsa-pkcs1-sha1.pem":"f2a649b1d73ce1de006a1f2f11650e5ddb90ccf7de73bb19a57c157af34316a2","third-party/chromium/data/verify_signed_data/rsa-pkcs1-sha256-key-encoded-ber.pem":"df9b7c8cc7087a834dc2dd20431ceebf92aaf0e0c635ef367f116c39ca0e7a5b","third-party/chromium/data/verify_signed_data/rsa-pkcs1-sha256-spki-non-null-params.pem":"1534fe211f08e732c202e65e674bef2606b3b638add7300b6f7df8417e5404dc","third-party/chromium/data/verify_signed_data/rsa-pkcs1-sha256-using-ecdsa-algorithm.pem":"766d5e41e89bd69ef0cc804ef0de8bb7dc2cb99dca0b9b411a92b338ca5ea16e","third-party/chromium/data/verify_signed_data/rsa-pkcs1-sha256-using-id-ea-rsa.pem":"5457122a67150f0418d81fe2210cd6f4feedd59af243ef0ab196f808817f9446","third-party/chromium/data/verify_signed_data/rsa-pkcs1-sha256.pem":"34238a932aae2aa81968830f95f1669183286a29e0d9a04000d224b2e4285c62","third-party/chromium/data/verify_signed_data/rsa-pss-sha1-salt20-using-pss-key-no-params.pem":"57c4b6652b6fc13f0f32265997a9fcb51fb873726fb97e1fc29d26593dfcd4c2","third-party/chromium/data/verify_signed_data/rsa-pss-sha1-salt20-using-pss-key-with-null-params.pem":"67ee8e6f97d7f65f1af0ed4a53cbeb500e5cc156d44490efab0330f8af7ed7a2","third-party/chromium/data/verify_signed_data/rsa-pss-sha1-salt20.pem":"94966ed94d5a59bbd47a06b33b716dd555a71b51bfc237d0ff45c3363cf21218","third-party/chromium/data/verify_signed_data/rsa-pss-sha1-wrong-salt.pem":"5583063ebca55b61a3f5f09d186dd250f8e8a29ce0beb7783f80ff5f77e1d9bb","third-party/chromium/data/verify_signed_data/rsa-pss-sha256-mgf1-sha512-salt33.pem":"7cb052b2cb306518397e227e53da76cc781a700b732b275e491cda9bd5844cd7","third-party/chromium/data/verify_signed_data/rsa-pss-sha256-salt10-using-pss-key-with-params.pem":"4fd718a3ea88df68dfb384f7dc48c110dadca642f6265c997945fe2231fda422","third-party/chromium/data/verify_signed_data/rsa-pss-sha256-salt10-using-pss-key-with-wrong-params.pem":"346695e766c3003c4d62a9a73016f8cab064b71bbde543cae904e4625dfa8b3b","third-party/chromium/data/verify_signed_data/rsa-pss-sha256-salt10.pem":"1c3ee38f92a74a85a5a5563211431c0ec0f240ebbc803fbc19272b0469ac016b","third-party/chromium/data/verify_signed_data/rsa-using-ec-key.pem":"6ef47d55e423c0e4e942388cd09aab942dc33f0bc522249118a9857470c5dce2","third-party/chromium/data/verify_signed_data/rsa2048-pkcs1-sha512.pem":"4428f1b0ab076129bf728ae690b3b4469f9746f2e310911d89c2bba2942cd87d"},"package":"ed63aea5ce73d0ff405984102c42de94fc55a6b75765d621c65262469b3c9b53"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/webpki/Cargo.toml temporalio-1.3.0/vendor/webpki/Cargo.toml --- temporalio-1.3.0/vendor/webpki/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/webpki/Cargo.toml 1970-01-01 00:00:00.000000000 +0000 @@ -1,85 +0,0 @@ -# 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" -rust-version = "1.61.0" -name = "webpki" -version = "0.22.4" -authors = ["Brian Smith "] -include = [ - "Cargo.toml", - "LICENSE", - "README.md", - "src/**/*.rs", - "src/data/**/*", - "tests/dns_name_tests.rs", - "tests/integration.rs", - "tests/misc/serial_neg.der", - "tests/misc/serial_zero.der", - "tests/netflix/ca.der", - "tests/netflix/ee.der", - "tests/netflix/inter.der", - "tests/ed25519/ca.der", - "tests/ed25519/ee.der", - "third-party/chromium/**/*", -] -description = "Web PKI X.509 Certificate Verification." -readme = "README.md" -categories = [ - "cryptography", - "no-std", -] -license-file = "LICENSE" -repository = "https://github.com/briansmith/webpki" - -[package.metadata.docs.rs] -all-features = true - -[profile.bench] -opt-level = 3 -lto = true -codegen-units = 1 -debug = 0 -debug-assertions = false -rpath = false - -[profile.release] -opt-level = 3 -lto = true -codegen-units = 1 -debug = 0 -debug-assertions = false -rpath = false - -[lib] -name = "webpki" - -[dependencies.ring] -version = "0.17.2" -default-features = false - -[dependencies.untrusted] -version = "0.9" - -[dev-dependencies.base64] -version = "0.9.1" - -[dev-dependencies.serde] -version = "1.0" -features = ["derive"] - -[dev-dependencies.serde_json] -version = "1.0" - -[features] -alloc = ["ring/alloc"] -std = ["alloc"] diff -Nru temporalio-1.3.0/vendor/webpki/LICENSE temporalio-1.3.0/vendor/webpki/LICENSE --- temporalio-1.3.0/vendor/webpki/LICENSE 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/webpki/LICENSE 1970-01-01 00:00:00.000000000 +0000 @@ -1,19 +0,0 @@ -Except as otherwise noted, this project is licensed under the following -(ISC-style) terms: - -Copyright 2015 Brian Smith. - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -The files under third-party/chromium are licensed as described in -third-party/chromium/LICENSE. diff -Nru temporalio-1.3.0/vendor/webpki/README.md temporalio-1.3.0/vendor/webpki/README.md --- temporalio-1.3.0/vendor/webpki/README.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/webpki/README.md 1970-01-01 00:00:00.000000000 +0000 @@ -1,78 +0,0 @@ -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - - -What is webpki? -================== - -webpki is a library that validates Web PKI (TLS/SSL) certificates. webpki -is designed to provide a **full** implementation of the client side of the -**Web PKI** to a diverse range of applications and devices, -including embedded (IoT) applications, mobile apps, desktop applications, and -server infrastructure. webpki is intended to not only be the best -implementation of the Web PKI, but to also *precisely define* what the Web PKI -is. - -webpki is written in [Rust](https://www.rust-lang.org/) and uses -[*ring*](https://github.com/briansmith/ring) for signature verification. - -webpki is strongly influenced by -[mozilla::pkix](https://github.com/briansmith/mozillapkix). You can read a -little about the ideas underlying both mozilla::pkix and webpki in -[insanity::pkix: A New Certificate Path Building & Validation -Library](https://briansmith.org/insanity-pkix). - -The Rust compiler statically guarantees there are no buffer overflows, -uses-after-free, double-frees, data races, etc. in webpki. webpki takes -advantage of Rust's borrow checker to ensure that its **zero-copy parsing** -strategy is safe and efficient. webpki *never* allocates memory on the heap, -and it maintains a tight bound on the amount of stack memory it uses. webpki -avoids all superfluous PKIX features in order to keep its object code size -small. Further reducing the code size of webpki is an important goal. - -This release is the very first prototype. Lots of improvements are planned, -including: - -* An extensive automated test suite. -* Key pinning. -* Certificate Transparency support. -* Short-lived certificate, OCSP stapling, and CRLSet support. -* Customization of the supported algorithms, key sizes, and elliptic curves - allowed during a validation. -* A C language wrapper interface to allow using webpki in non-Rust - applications. -* A specification of precisely what the Web PKI is. - - - -Demo -==== - -See https://github.com/ctz/rustls#example-code for an example of using -webpki. - - - -License -======= - -See [LICENSE](LICENSE). This project happily accepts pull requests without any -formal copyright/contributor license agreement. Pull requests must explicitly -indicate who owns the copyright to the code being contributed and that the code -is being licensed under the same terms as the existing webpki code. - - - -Bug Reporting -============= - -Please report bugs either as pull requests or as issues in [the issue -tracker](https://github.com/briansmith/webpki/issues). webpki has a -**full disclosure** vulnerability policy. **Please do NOT attempt to report -any security vulnerability in this code privately to anybody.** diff -Nru temporalio-1.3.0/vendor/webpki/src/budget.rs temporalio-1.3.0/vendor/webpki/src/budget.rs --- temporalio-1.3.0/vendor/webpki/src/budget.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/webpki/src/budget.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,60 +0,0 @@ -// Copyright 2015 Brian Smith. -// Portions Copyright 2033 Daniel McCarney. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR -// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -use crate::ErrorExt; - -pub(super) struct Budget { - signatures: usize, - build_chain_calls: usize, -} - -impl Budget { - #[inline] - pub fn consume_signature(&mut self) -> Result<(), ErrorExt> { - checked_sub( - &mut self.signatures, - ErrorExt::MaximumSignatureChecksExceeded, - ) - } - - #[inline] - pub fn consume_build_chain_call(&mut self) -> Result<(), ErrorExt> { - checked_sub( - &mut self.build_chain_calls, - ErrorExt::MaximumPathBuildCallsExceeded, - ) - } -} - -fn checked_sub(value: &mut usize, underflow_error: ErrorExt) -> Result<(), ErrorExt> { - *value = value.checked_sub(1).ok_or(underflow_error)?; - Ok(()) -} - -impl Default for Budget { - fn default() -> Self { - Self { - // This limit is taken from the remediation for golang CVE-2018-16875. However, - // note that golang subsequently implemented AKID matching due to this limit - // being hit in real applications (see ). - // So this may actually be too aggressive. - signatures: 100, - - // This limit is taken from mozilla::pkix, see: - // - build_chain_calls: 200_000, - } - } -} diff -Nru temporalio-1.3.0/vendor/webpki/src/calendar.rs temporalio-1.3.0/vendor/webpki/src/calendar.rs --- temporalio-1.3.0/vendor/webpki/src/calendar.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/webpki/src/calendar.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,162 +0,0 @@ -// Copyright 2015-2016 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR -// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -use super::{time::Time, Error}; - -pub fn time_from_ymdhms_utc( - year: u64, - month: u64, - day_of_month: u64, - hours: u64, - minutes: u64, - seconds: u64, -) -> Result { - let days_before_year_since_unix_epoch = days_before_year_since_unix_epoch(year)?; - - const JAN: u64 = 31; - let feb = days_in_feb(year); - const MAR: u64 = 31; - const APR: u64 = 30; - const MAY: u64 = 31; - const JUN: u64 = 30; - const JUL: u64 = 31; - const AUG: u64 = 31; - const SEP: u64 = 30; - const OCT: u64 = 31; - const NOV: u64 = 30; - let days_before_month_in_year = match month { - 1 => 0, - 2 => JAN, - 3 => JAN + feb, - 4 => JAN + feb + MAR, - 5 => JAN + feb + MAR + APR, - 6 => JAN + feb + MAR + APR + MAY, - 7 => JAN + feb + MAR + APR + MAY + JUN, - 8 => JAN + feb + MAR + APR + MAY + JUN + JUL, - 9 => JAN + feb + MAR + APR + MAY + JUN + JUL + AUG, - 10 => JAN + feb + MAR + APR + MAY + JUN + JUL + AUG + SEP, - 11 => JAN + feb + MAR + APR + MAY + JUN + JUL + AUG + SEP + OCT, - 12 => JAN + feb + MAR + APR + MAY + JUN + JUL + AUG + SEP + OCT + NOV, - _ => unreachable!(), // `read_two_digits` already bounds-checked it. - }; - - let days_before = - days_before_year_since_unix_epoch + days_before_month_in_year + day_of_month - 1; - - let seconds_since_unix_epoch = - (days_before * 24 * 60 * 60) + (hours * 60 * 60) + (minutes * 60) + seconds; - - Ok(Time::from_seconds_since_unix_epoch( - seconds_since_unix_epoch, - )) -} - -fn days_before_year_since_unix_epoch(year: u64) -> Result { - // We don't support dates before January 1, 1970 because that is the - // Unix epoch. It is likely that other software won't deal well with - // certificates that have dates before the epoch. - if year < 1970 { - return Err(Error::BadDerTime); - } - let days_before_year_ad = days_before_year_ad(year); - debug_assert!(days_before_year_ad >= DAYS_BEFORE_UNIX_EPOCH_AD); - Ok(days_before_year_ad - DAYS_BEFORE_UNIX_EPOCH_AD) -} - -fn days_before_year_ad(year: u64) -> u64 { - ((year - 1) * 365) - + ((year - 1) / 4) // leap years are every 4 years, - - ((year - 1) / 100) // except years divisible by 100, - + ((year - 1) / 400) // except years divisible by 400. -} - -pub fn days_in_month(year: u64, month: u64) -> u64 { - match month { - 1 | 3 | 5 | 7 | 8 | 10 | 12 => 31, - 4 | 6 | 9 | 11 => 30, - 2 => days_in_feb(year), - _ => unreachable!(), // `read_two_digits` already bounds-checked it. - } -} - -fn days_in_feb(year: u64) -> u64 { - if (year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 0)) { - 29 - } else { - 28 - } -} - -#[allow(clippy::unreadable_literal)] // TODO: Make this clear. -const DAYS_BEFORE_UNIX_EPOCH_AD: u64 = 719162; - -#[cfg(test)] -mod tests { - #[test] - fn test_days_before_unix_epoch() { - use super::{days_before_year_ad, DAYS_BEFORE_UNIX_EPOCH_AD}; - assert_eq!(DAYS_BEFORE_UNIX_EPOCH_AD, days_before_year_ad(1970)); - } - - #[test] - fn test_days_in_month() { - use super::days_in_month; - assert_eq!(days_in_month(2017, 1), 31); - assert_eq!(days_in_month(2017, 2), 28); - assert_eq!(days_in_month(2017, 3), 31); - assert_eq!(days_in_month(2017, 4), 30); - assert_eq!(days_in_month(2017, 5), 31); - assert_eq!(days_in_month(2017, 6), 30); - assert_eq!(days_in_month(2017, 7), 31); - assert_eq!(days_in_month(2017, 8), 31); - assert_eq!(days_in_month(2017, 9), 30); - assert_eq!(days_in_month(2017, 10), 31); - assert_eq!(days_in_month(2017, 11), 30); - assert_eq!(days_in_month(2017, 12), 31); - - // leap cases - assert_eq!(days_in_month(2000, 2), 29); - assert_eq!(days_in_month(2004, 2), 29); - assert_eq!(days_in_month(2016, 2), 29); - assert_eq!(days_in_month(2100, 2), 28); - } - - #[allow(clippy::unreadable_literal)] // TODO: Make this clear. - #[test] - fn test_time_from_ymdhms_utc() { - use super::{time_from_ymdhms_utc, Time}; - - // year boundary - assert_eq!( - Time::from_seconds_since_unix_epoch(1483228799), - time_from_ymdhms_utc(2016, 12, 31, 23, 59, 59).unwrap() - ); - assert_eq!( - Time::from_seconds_since_unix_epoch(1483228800), - time_from_ymdhms_utc(2017, 1, 1, 0, 0, 0).unwrap() - ); - - // not a leap year - assert_eq!( - Time::from_seconds_since_unix_epoch(1492449162), - time_from_ymdhms_utc(2017, 4, 17, 17, 12, 42).unwrap() - ); - - // leap year, post-feb - assert_eq!( - Time::from_seconds_since_unix_epoch(1460913162), - time_from_ymdhms_utc(2016, 4, 17, 17, 12, 42).unwrap() - ); - } -} diff -Nru temporalio-1.3.0/vendor/webpki/src/cert.rs temporalio-1.3.0/vendor/webpki/src/cert.rs --- temporalio-1.3.0/vendor/webpki/src/cert.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/webpki/src/cert.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,226 +0,0 @@ -// Copyright 2015 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR -// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -use crate::{der, equal, signed_data, Error}; - -pub enum EndEntityOrCa<'a> { - EndEntity, - Ca(&'a Cert<'a>), -} - -pub struct Cert<'a> { - pub ee_or_ca: EndEntityOrCa<'a>, - - pub signed_data: signed_data::SignedData<'a>, - pub issuer: untrusted::Input<'a>, - pub validity: untrusted::Input<'a>, - pub subject: untrusted::Input<'a>, - pub spki: der::Value<'a>, - - pub basic_constraints: Option>, - pub eku: Option>, - pub name_constraints: Option>, - pub subject_alt_name: Option>, -} - -pub fn parse_cert<'a>( - cert_der: untrusted::Input<'a>, - ee_or_ca: EndEntityOrCa<'a>, -) -> Result, Error> { - parse_cert_internal(cert_der, ee_or_ca, certificate_serial_number) -} - -/// Used by `parse_cert` for regular certificates (end-entity and intermediate) -/// and by `cert_der_as_trust_anchor` for trust anchors encoded as -/// certificates. -pub(crate) fn parse_cert_internal<'a>( - cert_der: untrusted::Input<'a>, - ee_or_ca: EndEntityOrCa<'a>, - serial_number: fn(input: &mut untrusted::Reader<'_>) -> Result<(), Error>, -) -> Result, Error> { - let (tbs, signed_data) = cert_der.read_all(Error::BadDer, |cert_der| { - der::nested( - cert_der, - der::Tag::Sequence, - Error::BadDer, - signed_data::parse_signed_data, - ) - })?; - - tbs.read_all(Error::BadDer, |tbs| { - version3(tbs)?; - serial_number(tbs)?; - - let signature = der::expect_tag_and_get_value(tbs, der::Tag::Sequence)?; - // TODO: In mozilla::pkix, the comparison is done based on the - // normalized value (ignoring whether or not there is an optional NULL - // parameter for RSA-based algorithms), so this may be too strict. - if !equal(signature, signed_data.algorithm) { - return Err(Error::SignatureAlgorithmMismatch); - } - - let issuer = der::expect_tag_and_get_value(tbs, der::Tag::Sequence)?; - let validity = der::expect_tag_and_get_value(tbs, der::Tag::Sequence)?; - let subject = der::expect_tag_and_get_value(tbs, der::Tag::Sequence)?; - let spki = der::expect_tag(tbs, der::Tag::Sequence)?; - - // In theory there could be fields [1] issuerUniqueID and [2] - // subjectUniqueID, but in practice there never are, and to keep the - // code small and simple we don't accept any certificates that do - // contain them. - - let mut cert = Cert { - ee_or_ca, - - signed_data, - issuer, - validity, - subject, - spki, - - basic_constraints: None, - eku: None, - name_constraints: None, - subject_alt_name: None, - }; - - // mozilla::pkix allows the extensions to be omitted. However, since - // the subjectAltName extension is mandatory, the extensions are - // mandatory too, and we enforce that. Also, mozilla::pkix includes - // special logic for handling critical Netscape Cert Type extensions. - // That has been intentionally omitted. - - der::nested( - tbs, - der::Tag::ContextSpecificConstructed3, - Error::MissingOrMalformedExtensions, - |tagged| { - der::nested_of_mut( - tagged, - der::Tag::Sequence, - der::Tag::Sequence, - Error::BadDer, - |extension| { - let extn_id = der::expect_tag_and_get_value(extension, der::Tag::OID)?; - let critical = der::optional_boolean(extension)?; - let extn_value = - der::expect_tag_and_get_value(extension, der::Tag::OctetString)?; - match remember_extension(&mut cert, extn_id, extn_value)? { - Understood::No if critical => Err(Error::UnsupportedCriticalExtension), - _ => Ok(()), - } - }, - ) - }, - )?; - - Ok(cert) - }) -} - -// mozilla::pkix supports v1, v2, v3, and v4, including both the implicit -// (correct) and explicit (incorrect) encoding of v1. We allow only v3. -fn version3(input: &mut untrusted::Reader) -> Result<(), Error> { - der::nested( - input, - der::Tag::ContextSpecificConstructed0, - Error::UnsupportedCertVersion, - |input| { - let version = der::small_nonnegative_integer(input)?; - if version != 2 { - // v3 - return Err(Error::UnsupportedCertVersion); - } - Ok(()) - }, - ) -} - -pub fn certificate_serial_number(input: &mut untrusted::Reader) -> Result<(), Error> { - // https://tools.ietf.org/html/rfc5280#section-4.1.2.2: - // * Conforming CAs MUST NOT use serialNumber values longer than 20 octets." - // * "The serial number MUST be a positive integer [...]" - - let value = der::positive_integer(input)?; - if value.big_endian_without_leading_zero().len() > 20 { - return Err(Error::BadDer); - } - Ok(()) -} - -enum Understood { - Yes, - No, -} - -fn remember_extension<'a>( - cert: &mut Cert<'a>, - extn_id: untrusted::Input, - value: untrusted::Input<'a>, -) -> Result { - // We don't do anything with certificate policies so we can safely ignore - // all policy-related stuff. We assume that the policy-related extensions - // are not marked critical. - - // id-ce 2.5.29 - static ID_CE: [u8; 2] = oid![2, 5, 29]; - - if extn_id.len() != ID_CE.len() + 1 || !extn_id.as_slice_less_safe().starts_with(&ID_CE) { - return Ok(Understood::No); - } - - let out = match *extn_id.as_slice_less_safe().last().unwrap() { - // id-ce-keyUsage 2.5.29.15. We ignore the KeyUsage extension. For CA - // certificates, BasicConstraints.cA makes KeyUsage redundant. Firefox - // and other common browsers do not check KeyUsage for end-entities, - // though it would be kind of nice to ensure that a KeyUsage without - // the keyEncipherment bit could not be used for RSA key exchange. - 15 => { - return Ok(Understood::Yes); - } - - // id-ce-subjectAltName 2.5.29.17 - 17 => &mut cert.subject_alt_name, - - // id-ce-basicConstraints 2.5.29.19 - 19 => &mut cert.basic_constraints, - - // id-ce-nameConstraints 2.5.29.30 - 30 => &mut cert.name_constraints, - - // id-ce-extKeyUsage 2.5.29.37 - 37 => &mut cert.eku, - - _ => { - return Ok(Understood::No); - } - }; - - match *out { - Some(..) => { - // The certificate contains more than one instance of this - // extension. - return Err(Error::ExtensionValueInvalid); - } - None => { - // All the extensions that we care about are wrapped in a SEQUENCE. - let sequence_value = value.read_all(Error::BadDer, |value| { - der::expect_tag_and_get_value(value, der::Tag::Sequence) - })?; - *out = Some(sequence_value); - } - } - - Ok(Understood::Yes) -} diff -Nru temporalio-1.3.0/vendor/webpki/src/data/alg-ecdsa-p256.der temporalio-1.3.0/vendor/webpki/src/data/alg-ecdsa-p256.der --- temporalio-1.3.0/vendor/webpki/src/data/alg-ecdsa-p256.der 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/webpki/src/data/alg-ecdsa-p256.der 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -*†HÎ=*†HÎ= \ No newline at end of file Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/webpki/src/data/alg-ecdsa-p384.der and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/webpki/src/data/alg-ecdsa-p384.der differ diff -Nru temporalio-1.3.0/vendor/webpki/src/data/alg-ecdsa-sha256.der temporalio-1.3.0/vendor/webpki/src/data/alg-ecdsa-sha256.der --- temporalio-1.3.0/vendor/webpki/src/data/alg-ecdsa-sha256.der 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/webpki/src/data/alg-ecdsa-sha256.der 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -*†HÎ= \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/webpki/src/data/alg-ecdsa-sha384.der temporalio-1.3.0/vendor/webpki/src/data/alg-ecdsa-sha384.der --- temporalio-1.3.0/vendor/webpki/src/data/alg-ecdsa-sha384.der 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/webpki/src/data/alg-ecdsa-sha384.der 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -*†HÎ= \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/webpki/src/data/alg-ed25519.der temporalio-1.3.0/vendor/webpki/src/data/alg-ed25519.der --- temporalio-1.3.0/vendor/webpki/src/data/alg-ed25519.der 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/webpki/src/data/alg-ed25519.der 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -+ep \ No newline at end of file Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/webpki/src/data/alg-rsa-encryption.der and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/webpki/src/data/alg-rsa-encryption.der differ Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/webpki/src/data/alg-rsa-pkcs1-sha256.der and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/webpki/src/data/alg-rsa-pkcs1-sha256.der differ Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/webpki/src/data/alg-rsa-pkcs1-sha384.der and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/webpki/src/data/alg-rsa-pkcs1-sha384.der differ Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/webpki/src/data/alg-rsa-pkcs1-sha512.der and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/webpki/src/data/alg-rsa-pkcs1-sha512.der differ Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/webpki/src/data/alg-rsa-pss-sha256.der and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/webpki/src/data/alg-rsa-pss-sha256.der differ Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/webpki/src/data/alg-rsa-pss-sha384.der and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/webpki/src/data/alg-rsa-pss-sha384.der differ Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/webpki/src/data/alg-rsa-pss-sha512.der and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/webpki/src/data/alg-rsa-pss-sha512.der differ diff -Nru temporalio-1.3.0/vendor/webpki/src/data/README.md temporalio-1.3.0/vendor/webpki/src/data/README.md --- temporalio-1.3.0/vendor/webpki/src/data/README.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/webpki/src/data/README.md 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -These files contain the binary DER encoding of the *values* of some -ASN.1 [`AlgorithmIdentifier`]s, without the outer `SEQUENCE` tag or the outer -length component. - -These files were encoded with the help of [der-ascii]. They can be decoded -using: - -```sh -go get github.com/google/der-ascii/cmd/der2ascii -der2ascii -i -o .ascii -``` - -New or modified der-ascii files can be encoded using: - -```sh -go get github.com/google/der-ascii/cmd/ascii2der -ascii2der i .ascii -o -``` - -[`AlgorithmIdentifier`]: https://tools.ietf.org/html/rfc5280#section-4.1.1.2] -[der-ascii]: https://github.com/google/der-ascii diff -Nru temporalio-1.3.0/vendor/webpki/src/der.rs temporalio-1.3.0/vendor/webpki/src/der.rs --- temporalio-1.3.0/vendor/webpki/src/der.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/webpki/src/der.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,173 +0,0 @@ -// Copyright 2015 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR -// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -use crate::{calendar, time, Error}; -pub use ring::io::{ - der::{nested, Tag, CONSTRUCTED}, - Positive, -}; - -#[inline(always)] -pub fn expect_tag_and_get_value<'a>( - input: &mut untrusted::Reader<'a>, - tag: Tag, -) -> Result, Error> { - ring::io::der::expect_tag_and_get_value(input, tag).map_err(|_| Error::BadDer) -} - -pub struct Value<'a> { - value: untrusted::Input<'a>, -} - -impl<'a> Value<'a> { - pub fn value(&self) -> untrusted::Input<'a> { - self.value - } -} - -pub fn expect_tag<'a>(input: &mut untrusted::Reader<'a>, tag: Tag) -> Result, Error> { - let (actual_tag, value) = read_tag_and_get_value(input)?; - if usize::from(tag) != usize::from(actual_tag) { - return Err(Error::BadDer); - } - - Ok(Value { value }) -} - -#[inline(always)] -pub fn read_tag_and_get_value<'a>( - input: &mut untrusted::Reader<'a>, -) -> Result<(u8, untrusted::Input<'a>), Error> { - ring::io::der::read_tag_and_get_value(input).map_err(|_| Error::BadDer) -} - -// TODO: investigate taking decoder as a reference to reduce generated code -// size. -pub fn nested_of_mut<'a, E>( - input: &mut untrusted::Reader<'a>, - outer_tag: Tag, - inner_tag: Tag, - error: E, - mut decoder: impl FnMut(&mut untrusted::Reader<'a>) -> Result<(), E>, -) -> Result<(), E> -where - E: Copy, -{ - nested(input, outer_tag, error, |outer| { - loop { - nested(outer, inner_tag, error, |inner| decoder(inner))?; - if outer.at_end() { - break; - } - } - Ok(()) - }) -} - -pub fn bit_string_with_no_unused_bits<'a>( - input: &mut untrusted::Reader<'a>, -) -> Result, Error> { - nested(input, Tag::BitString, Error::BadDer, |value| { - let unused_bits_at_end = value.read_byte().map_err(|_| Error::BadDer)?; - if unused_bits_at_end != 0 { - return Err(Error::BadDer); - } - Ok(value.read_bytes_to_end()) - }) -} - -// Like mozilla::pkix, we accept the nonconformant explicit encoding of -// the default value (false) for compatibility with real-world certificates. -pub fn optional_boolean(input: &mut untrusted::Reader) -> Result { - if !input.peek(Tag::Boolean.into()) { - return Ok(false); - } - nested(input, Tag::Boolean, Error::BadDer, |input| { - match input.read_byte() { - Ok(0xff) => Ok(true), - Ok(0x00) => Ok(false), - _ => Err(Error::BadDer), - } - }) -} - -pub fn positive_integer<'a>(input: &'a mut untrusted::Reader) -> Result, Error> { - ring::io::der::positive_integer(input).map_err(|_| Error::BadDer) -} - -pub fn small_nonnegative_integer(input: &mut untrusted::Reader) -> Result { - ring::io::der::small_nonnegative_integer(input).map_err(|_| Error::BadDer) -} - -pub fn time_choice(input: &mut untrusted::Reader) -> Result { - let is_utc_time = input.peek(Tag::UTCTime.into()); - let expected_tag = if is_utc_time { - Tag::UTCTime - } else { - Tag::GeneralizedTime - }; - - fn read_digit(inner: &mut untrusted::Reader) -> Result { - const DIGIT: core::ops::RangeInclusive = b'0'..=b'9'; - let b = inner.read_byte().map_err(|_| Error::BadDerTime)?; - if DIGIT.contains(&b) { - return Ok(u64::from(b - DIGIT.start())); - } - Err(Error::BadDerTime) - } - - fn read_two_digits(inner: &mut untrusted::Reader, min: u64, max: u64) -> Result { - let hi = read_digit(inner)?; - let lo = read_digit(inner)?; - let value = (hi * 10) + lo; - if value < min || value > max { - return Err(Error::BadDerTime); - } - Ok(value) - } - - nested(input, expected_tag, Error::BadDer, |value| { - let (year_hi, year_lo) = if is_utc_time { - let lo = read_two_digits(value, 0, 99)?; - let hi = if lo >= 50 { 19 } else { 20 }; - (hi, lo) - } else { - let hi = read_two_digits(value, 0, 99)?; - let lo = read_two_digits(value, 0, 99)?; - (hi, lo) - }; - - let year = (year_hi * 100) + year_lo; - let month = read_two_digits(value, 1, 12)?; - let days_in_month = calendar::days_in_month(year, month); - let day_of_month = read_two_digits(value, 1, days_in_month)?; - let hours = read_two_digits(value, 0, 23)?; - let minutes = read_two_digits(value, 0, 59)?; - let seconds = read_two_digits(value, 0, 59)?; - - let time_zone = value.read_byte().map_err(|_| Error::BadDerTime)?; - if time_zone != b'Z' { - return Err(Error::BadDerTime); - } - - calendar::time_from_ymdhms_utc(year, month, day_of_month, hours, minutes, seconds) - }) -} - -macro_rules! oid { - ( $first:expr, $second:expr, $( $tail:expr ),* ) => - ( - [(40 * $first) + $second, $( $tail ),*] - ) -} diff -Nru temporalio-1.3.0/vendor/webpki/src/end_entity.rs temporalio-1.3.0/vendor/webpki/src/end_entity.rs --- temporalio-1.3.0/vendor/webpki/src/end_entity.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/webpki/src/end_entity.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,242 +0,0 @@ -// Copyright 2015-2021 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR -// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -use crate::{ - cert, name, signed_data, verify_cert, DnsNameRef, Error, ErrorExt, SignatureAlgorithm, Time, - TlsClientTrustAnchors, TlsServerTrustAnchors, -}; - -#[cfg(feature = "alloc")] -use alloc::vec::Vec; - -/// An end-entity certificate. -/// -/// Server certificate processing in a TLS connection consists of several -/// steps. All of these steps are necessary: -/// -/// * `EndEntityCert.verify_is_valid_tls_server_cert`: Verify that the server's -/// certificate is currently valid *for use by a TLS server*. -/// * `EndEntityCert.verify_is_valid_for_dns_name`: Verify that the server's -/// certificate is valid for the host that is being connected to. -/// * `EndEntityCert.verify_signature`: Verify that the signature of server's -/// `ServerKeyExchange` message is valid for the server's certificate. -/// -/// Client certificate processing in a TLS connection consists of analogous -/// steps. All of these steps are necessary: -/// -/// * `EndEntityCert.verify_is_valid_tls_client_cert`: Verify that the client's -/// certificate is currently valid *for use by a TLS client*. -/// * `EndEntityCert.verify_is_valid_for_dns_name` or -/// `EndEntityCert.verify_is_valid_for_at_least_one_dns_name`: Verify that the -/// client's certificate is valid for the identity or identities used to -/// identify the client. (Currently client authentication only works when the -/// client is identified by one or more DNS hostnames.) -/// * `EndEntityCert.verify_signature`: Verify that the client's signature in -/// its `CertificateVerify` message is valid using the public key from the -/// client's certificate. -/// -/// Although it would be less error-prone to combine all these steps into a -/// single function call, some significant optimizations are possible if the -/// three steps are processed separately (in parallel). It does not matter much -/// which order the steps are done in, but **all of these steps must completed -/// before application data is sent and before received application data is -/// processed**. `EndEntityCert::from` is an inexpensive operation and is -/// deterministic, so if these tasks are done in multiple threads, it is -/// probably best to just call `EndEntityCert::from` multiple times (before each -/// operation) for the same DER-encoded ASN.1 certificate bytes. -pub struct EndEntityCert<'a> { - inner: cert::Cert<'a>, -} - -impl<'a> core::convert::TryFrom<&'a [u8]> for EndEntityCert<'a> { - type Error = Error; - - /// Parse the ASN.1 DER-encoded X.509 encoding of the certificate - /// `cert_der`. - fn try_from(cert_der: &'a [u8]) -> Result { - Ok(Self { - inner: cert::parse_cert( - untrusted::Input::from(cert_der), - cert::EndEntityOrCa::EndEntity, - )?, - }) - } -} - -impl<'a> EndEntityCert<'a> { - pub(super) fn inner(&self) -> &cert::Cert { - &self.inner - } - - /// Backward-SemVer-compatible wrapper around `verify_is_valid_tls_server_cert_ext`. - /// - /// Errors that aren't representable as an `Error` are mapped to `Error::UnknownIssuer`. - pub fn verify_is_valid_tls_server_cert( - &self, - supported_sig_algs: &[&SignatureAlgorithm], - trust_anchors: &TlsServerTrustAnchors, - intermediate_certs: &[&[u8]], - time: Time, - ) -> Result<(), Error> { - self.verify_is_valid_tls_server_cert_ext( - supported_sig_algs, - trust_anchors, - intermediate_certs, - time, - ) - .map_err(ErrorExt::into_error_lossy) - } - - /// Verifies that the end-entity certificate is valid for use by a TLS - /// server. - /// - /// `supported_sig_algs` is the list of signature algorithms that are - /// trusted for use in certificate signatures; the end-entity certificate's - /// public key is not validated against this list. `trust_anchors` is the - /// list of root CAs to trust. `intermediate_certs` is the sequence of - /// intermediate certificates that the server sent in the TLS handshake. - /// `time` is the time for which the validation is effective (usually the - /// current time). - pub fn verify_is_valid_tls_server_cert_ext( - &self, - supported_sig_algs: &[&SignatureAlgorithm], - &TlsServerTrustAnchors(trust_anchors): &TlsServerTrustAnchors, - intermediate_certs: &[&[u8]], - time: Time, - ) -> Result<(), ErrorExt> { - verify_cert::build_chain( - verify_cert::EKU_SERVER_AUTH, - supported_sig_algs, - trust_anchors, - intermediate_certs, - &self.inner, - time, - ) - } - - /// Backward-SemVer-compatible wrapper around `verify_is_valid_tls_client_cert_ext`. - /// - /// Errors that aren't representable as an `Error` are mapped to `Error::UnknownIssuer`. - pub fn verify_is_valid_tls_client_cert( - &self, - supported_sig_algs: &[&SignatureAlgorithm], - trust_anchors: &TlsClientTrustAnchors, - intermediate_certs: &[&[u8]], - time: Time, - ) -> Result<(), Error> { - self.verify_is_valid_tls_client_cert_ext( - supported_sig_algs, - trust_anchors, - intermediate_certs, - time, - ) - .map_err(ErrorExt::into_error_lossy) - } - - /// Verifies that the end-entity certificate is valid for use by a TLS - /// client. - /// - /// If the certificate is not valid for any of the given names then this - /// fails with `Error::CertNotValidForName`. - /// - /// `supported_sig_algs` is the list of signature algorithms that are - /// trusted for use in certificate signatures; the end-entity certificate's - /// public key is not validated against this list. `trust_anchors` is the - /// list of root CAs to trust. `intermediate_certs` is the sequence of - /// intermediate certificates that the client sent in the TLS handshake. - /// `cert` is the purported end-entity certificate of the client. `time` is - /// the time for which the validation is effective (usually the current - /// time). - pub fn verify_is_valid_tls_client_cert_ext( - &self, - supported_sig_algs: &[&SignatureAlgorithm], - &TlsClientTrustAnchors(trust_anchors): &TlsClientTrustAnchors, - intermediate_certs: &[&[u8]], - time: Time, - ) -> Result<(), ErrorExt> { - verify_cert::build_chain( - verify_cert::EKU_CLIENT_AUTH, - supported_sig_algs, - trust_anchors, - intermediate_certs, - &self.inner, - time, - ) - } - - /// Verifies that the certificate is valid for the given DNS host name. - pub fn verify_is_valid_for_dns_name(&self, dns_name: DnsNameRef) -> Result<(), Error> { - name::verify_cert_dns_name(self, dns_name) - } - - /// Verifies that the certificate is valid for at least one of the given DNS - /// host names. - /// - /// If the certificate is not valid for any of the given names then this - /// fails with `Error::CertNotValidForName`. Otherwise the DNS names for - /// which the certificate is valid are returned. - /// - /// Requires the `alloc` default feature; i.e. this isn't available in - /// `#![no_std]` configurations. - #[cfg(feature = "alloc")] - pub fn verify_is_valid_for_at_least_one_dns_name<'names, Names>( - &self, - dns_names: Names, - ) -> Result>, Error> - where - Names: Iterator>, - { - let result: Vec> = dns_names - .filter(|n| self.verify_is_valid_for_dns_name(*n).is_ok()) - .collect(); - if result.is_empty() { - return Err(Error::CertNotValidForName); - } - Ok(result) - } - - /// Verifies the signature `signature` of message `msg` using the - /// certificate's public key. - /// - /// `signature_alg` is the algorithm to use to - /// verify the signature; the certificate's public key is verified to be - /// compatible with this algorithm. - /// - /// For TLS 1.2, `signature` corresponds to TLS's - /// `DigitallySigned.signature` and `signature_alg` corresponds to TLS's - /// `DigitallySigned.algorithm` of TLS type `SignatureAndHashAlgorithm`. In - /// TLS 1.2 a single `SignatureAndHashAlgorithm` may map to multiple - /// `SignatureAlgorithm`s. For example, a TLS 1.2 - /// `SignatureAndHashAlgorithm` of (ECDSA, SHA-256) may map to any or all - /// of {`ECDSA_P256_SHA256`, `ECDSA_P384_SHA256`}, depending on how the TLS - /// implementation is configured. - /// - /// For current TLS 1.3 drafts, `signature_alg` corresponds to TLS's - /// `algorithm` fields of type `SignatureScheme`. There is (currently) a - /// one-to-one correspondence between TLS 1.3's `SignatureScheme` and - /// `SignatureAlgorithm`. - pub fn verify_signature( - &self, - signature_alg: &SignatureAlgorithm, - msg: &[u8], - signature: &[u8], - ) -> Result<(), Error> { - signed_data::verify_signature( - signature_alg, - self.inner.spki.value(), - untrusted::Input::from(msg), - untrusted::Input::from(signature), - ) - } -} diff -Nru temporalio-1.3.0/vendor/webpki/src/error.rs temporalio-1.3.0/vendor/webpki/src/error.rs --- temporalio-1.3.0/vendor/webpki/src/error.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/webpki/src/error.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,144 +0,0 @@ -// Copyright 2015 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR -// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -use core::fmt; - -/// An error that occurs during certificate validation or name validation. -#[derive(Clone, Copy, Debug, PartialEq)] -pub enum Error { - /// The encoding of some ASN.1 DER-encoded item is invalid. - BadDer, - - /// The encoding of an ASN.1 DER-encoded time is invalid. - BadDerTime, - - /// A CA certificate is being used as an end-entity certificate. - CaUsedAsEndEntity, - - /// The certificate is expired; i.e. the time it is being validated for is - /// later than the certificate's notAfter time. - CertExpired, - - /// The certificate is not valid for the name it is being validated for. - CertNotValidForName, - - /// The certificate is not valid yet; i.e. the time it is being validated - /// for is earlier than the certificate's notBefore time. - CertNotValidYet, - - /// An end-entity certificate is being used as a CA certificate. - EndEntityUsedAsCa, - - /// An X.509 extension is invalid. - ExtensionValueInvalid, - - /// The certificate validity period (notBefore, notAfter) is invalid; e.g. - /// the notAfter time is earlier than the notBefore time. - InvalidCertValidity, - - /// The signature is invalid for the given public key. - InvalidSignatureForPublicKey, - - /// The certificate violates one or more name constraints. - NameConstraintViolation, - - /// The certificate violates one or more path length constraints. - PathLenConstraintViolated, - - /// The algorithm in the TBSCertificate "signature" field of a certificate - /// does not match the algorithm in the signature of the certificate. - SignatureAlgorithmMismatch, - - /// The certificate is not valid for the Extended Key Usage for which it is - /// being validated. - RequiredEkuNotFound, - - /// A valid issuer for the certificate could not be found. - UnknownIssuer, - - /// The certificate is not a v3 X.509 certificate. - /// - /// This error may be also reported if the certificate version field - /// is malformed. - UnsupportedCertVersion, - - /// The certificate extensions are missing or malformed. - /// - /// In particular, webpki requires the DNS name(s) be in the subjectAltName - /// extension as required by the CA/Browser Forum Baseline Requirements - /// and as recommended by RFC6125. - MissingOrMalformedExtensions, - - /// The certificate contains an unsupported critical extension. - UnsupportedCriticalExtension, - - /// The signature's algorithm does not match the algorithm of the public - /// key it is being validated for. This may be because the public key - /// algorithm's OID isn't recognized (e.g. DSA), or the public key - /// algorithm's parameters don't match the supported parameters for that - /// algorithm (e.g. ECC keys for unsupported curves), or the public key - /// algorithm and the signature algorithm simply don't match (e.g. - /// verifying an RSA signature with an ECC public key). - UnsupportedSignatureAlgorithmForPublicKey, - - /// The signature algorithm for a signature is not in the set of supported - /// signature algorithms given. - UnsupportedSignatureAlgorithm, -} - -impl fmt::Display for Error { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "{:?}", self) - } -} - -/// Requires the `std` feature. -#[cfg(feature = "std")] -impl ::std::error::Error for Error {} - -/// An error that occurs during certificate validation or name validation. -/// -/// `ErrorExt` effectively extends `Error` to support reporting new errors. Because `Error` is not -/// declared `#[non_exhaustive]` it could not be directly extended in a backward-compatible way. -#[non_exhaustive] -pub enum ErrorExt { - Error(Error), - MaximumSignatureChecksExceeded, - /// The maximum number of internal path building calls has been reached. Path complexity is too great. - MaximumPathBuildCallsExceeded, -} - -impl ErrorExt { - pub(crate) fn is_fatal(&self) -> bool { - match self { - Self::Error(_) => false, - Self::MaximumSignatureChecksExceeded | Self::MaximumPathBuildCallsExceeded => true, - } - } - - pub(crate) fn into_error_lossy(self) -> Error { - match self { - Self::Error(e) => e, - Self::MaximumSignatureChecksExceeded | Self::MaximumPathBuildCallsExceeded => { - Error::UnknownIssuer - } - } - } -} - -impl From for ErrorExt { - fn from(error: Error) -> Self { - Self::Error(error) - } -} diff -Nru temporalio-1.3.0/vendor/webpki/src/lib.rs temporalio-1.3.0/vendor/webpki/src/lib.rs --- temporalio-1.3.0/vendor/webpki/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/webpki/src/lib.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,103 +0,0 @@ -// Copyright 2015 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR -// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -//! webpki: Web PKI X.509 Certificate Validation. -//! -//! See `EndEntityCert`'s documentation for a description of the certificate -//! processing steps necessary for a TLS connection. -//! -//! # Features -//! -//! | Feature | Description | -//! | ------- | ----------- | -//! | `alloc` | Enable features that require use of the heap. Currently all RSA signature algorithms require this feature. | -//! | `std` | Enable features that require libstd. Implies `alloc`. | - -#![cfg_attr(not(feature = "std"), no_std)] -#![allow( - clippy::doc_markdown, - clippy::if_not_else, - clippy::inline_always, - clippy::items_after_statements, - clippy::missing_errors_doc, - clippy::module_name_repetitions, - clippy::single_match, - clippy::single_match_else -)] -#![deny(clippy::as_conversions)] - -#[cfg(any(test, feature = "alloc"))] -#[cfg_attr(test, macro_use)] -extern crate alloc; - -mod budget; - -#[macro_use] -mod der; - -mod calendar; -mod cert; -mod end_entity; -mod error; -mod name; -mod signed_data; -mod time; -mod trust_anchor; - -mod verify_cert; - -pub use { - end_entity::EndEntityCert, - error::{Error, ErrorExt}, - name::{DnsNameRef, InvalidDnsNameError}, - signed_data::{ - SignatureAlgorithm, ECDSA_P256_SHA256, ECDSA_P256_SHA384, ECDSA_P384_SHA256, - ECDSA_P384_SHA384, ED25519, - }, - time::Time, - trust_anchor::{TlsClientTrustAnchors, TlsServerTrustAnchors, TrustAnchor}, -}; - -#[cfg(feature = "alloc")] -pub use { - name::DnsName, - signed_data::{ - RSA_PKCS1_2048_8192_SHA256, RSA_PKCS1_2048_8192_SHA384, RSA_PKCS1_2048_8192_SHA512, - RSA_PKCS1_3072_8192_SHA384, RSA_PSS_2048_8192_SHA256_LEGACY_KEY, - RSA_PSS_2048_8192_SHA384_LEGACY_KEY, RSA_PSS_2048_8192_SHA512_LEGACY_KEY, - }, -}; - -#[cfg(feature = "alloc")] -#[allow(unknown_lints, clippy::upper_case_acronyms)] -#[deprecated(note = "Use DnsName")] -pub type DNSName = DnsName; - -#[deprecated(note = "use DnsNameRef")] -#[allow(unknown_lints, clippy::upper_case_acronyms)] -pub type DNSNameRef<'a> = DnsNameRef<'a>; - -#[deprecated(note = "use TlsServerTrustAnchors")] -#[allow(unknown_lints, clippy::upper_case_acronyms)] -pub type TLSServerTrustAnchors<'a> = TlsServerTrustAnchors<'a>; - -#[deprecated(note = "use TlsClientTrustAnchors")] -#[allow(unknown_lints, clippy::upper_case_acronyms)] -pub type TLSClientTrustAnchors<'a> = TlsClientTrustAnchors<'a>; - -// We don't operate on secret data so a convenient comparison function is warranted. -#[must_use] -fn equal(a: untrusted::Input, b: untrusted::Input) -> bool { - a.as_slice_less_safe() == b.as_slice_less_safe() -} diff -Nru temporalio-1.3.0/vendor/webpki/src/name/dns_name.rs temporalio-1.3.0/vendor/webpki/src/name/dns_name.rs --- temporalio-1.3.0/vendor/webpki/src/name/dns_name.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/webpki/src/name/dns_name.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,796 +0,0 @@ -// Copyright 2015-2020 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR -// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -#[cfg(feature = "alloc")] -use alloc::string::String; - -/// A DNS Name suitable for use in the TLS Server Name Indication (SNI) -/// extension and/or for use as the reference hostname for which to verify a -/// certificate. -/// -/// A `DnsName` is guaranteed to be syntactically valid. The validity rules are -/// specified in [RFC 5280 Section 7.2], except that underscores are also -/// allowed. -/// -/// `DnsName` stores a copy of the input it was constructed from in a `String` -/// and so it is only available when the `std` default feature is enabled. -/// -/// `Eq`, `PartialEq`, etc. are not implemented because name comparison -/// frequently should be done case-insensitively and/or with other caveats that -/// depend on the specific circumstances in which the comparison is done. -/// -/// [RFC 5280 Section 7.2]: https://tools.ietf.org/html/rfc5280#section-7.2 -/// -/// Requires the `alloc` feature. -#[cfg(feature = "alloc")] -#[derive(Clone, Debug, Eq, PartialEq, Hash)] -pub struct DnsName(String); - -/// Requires the `alloc` feature. -#[cfg(feature = "alloc")] -impl DnsName { - /// Returns a `DnsNameRef` that refers to this `DnsName`. - pub fn as_ref(&self) -> DnsNameRef { - DnsNameRef(self.0.as_bytes()) - } -} - -/// Requires the `alloc` feature. -#[cfg(feature = "alloc")] -impl AsRef for DnsName { - fn as_ref(&self) -> &str { - self.0.as_ref() - } -} - -/// Requires the `alloc` feature. -// Deprecated -#[cfg(feature = "alloc")] -impl From> for DnsName { - fn from(dns_name: DnsNameRef) -> Self { - dns_name.to_owned() - } -} - -/// A reference to a DNS Name suitable for use in the TLS Server Name Indication -/// (SNI) extension and/or for use as the reference hostname for which to verify -/// a certificate. -/// -/// A `DnsNameRef` is guaranteed to be syntactically valid. The validity rules -/// are specified in [RFC 5280 Section 7.2], except that underscores are also -/// allowed. -/// -/// `Eq`, `PartialEq`, etc. are not implemented because name comparison -/// frequently should be done case-insensitively and/or with other caveats that -/// depend on the specific circumstances in which the comparison is done. -/// -/// [RFC 5280 Section 7.2]: https://tools.ietf.org/html/rfc5280#section-7.2 -#[derive(Clone, Copy)] -pub struct DnsNameRef<'a>(&'a [u8]); - -impl AsRef<[u8]> for DnsNameRef<'_> { - #[inline] - fn as_ref(&self) -> &[u8] { - self.0 - } -} - -/// An error indicating that a `DnsNameRef` could not built because the input -/// is not a syntactically-valid DNS Name. -#[derive(Clone, Copy, Debug, Eq, PartialEq)] -pub struct InvalidDnsNameError; - -impl core::fmt::Display for InvalidDnsNameError { - fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result { - write!(f, "{:?}", self) - } -} - -/// Requires the `std` feature. -#[cfg(feature = "std")] -impl ::std::error::Error for InvalidDnsNameError {} - -impl<'a> DnsNameRef<'a> { - /// Constructs a `DnsNameRef` from the given input if the input is a - /// syntactically-valid DNS name. - pub fn try_from_ascii(dns_name: &'a [u8]) -> Result { - if !is_valid_reference_dns_id(untrusted::Input::from(dns_name)) { - return Err(InvalidDnsNameError); - } - - Ok(Self(dns_name)) - } - - /// Constructs a `DnsNameRef` from the given input if the input is a - /// syntactically-valid DNS name. - pub fn try_from_ascii_str(dns_name: &'a str) -> Result { - Self::try_from_ascii(dns_name.as_bytes()) - } - - /// Constructs a `DnsName` from this `DnsNameRef` - /// - /// Requires the `alloc` feature. - #[cfg(feature = "alloc")] - pub fn to_owned(&self) -> DnsName { - // DnsNameRef is already guaranteed to be valid ASCII, which is a - // subset of UTF-8. - let s: &str = (*self).into(); - DnsName(s.to_ascii_lowercase()) - } -} - -/// Requires the `alloc` feature. -#[cfg(feature = "alloc")] -impl core::fmt::Debug for DnsNameRef<'_> { - fn fmt(&self, f: &mut core::fmt::Formatter) -> Result<(), core::fmt::Error> { - let lowercase = self.clone().to_owned(); - f.debug_tuple("DnsNameRef").field(&lowercase.0).finish() - } -} - -impl<'a> From> for &'a str { - fn from(DnsNameRef(d): DnsNameRef<'a>) -> Self { - // The unwrap won't fail because DnsNameRefs are guaranteed to be ASCII - // and ASCII is a subset of UTF-8. - core::str::from_utf8(d).unwrap() - } -} - -pub(super) fn presented_id_matches_reference_id( - presented_dns_id: untrusted::Input, - reference_dns_id: untrusted::Input, -) -> Option { - presented_id_matches_reference_id_internal( - presented_dns_id, - IdRole::Reference, - reference_dns_id, - ) -} - -pub(super) fn presented_id_matches_constraint( - presented_dns_id: untrusted::Input, - reference_dns_id: untrusted::Input, -) -> Option { - presented_id_matches_reference_id_internal( - presented_dns_id, - IdRole::NameConstraint, - reference_dns_id, - ) -} - -// We do not distinguish between a syntactically-invalid presented_dns_id and -// one that is syntactically valid but does not match reference_dns_id; in both -// cases, the result is false. -// -// We assume that both presented_dns_id and reference_dns_id are encoded in -// such a way that US-ASCII (7-bit) characters are encoded in one byte and no -// encoding of a non-US-ASCII character contains a code point in the range -// 0-127. For example, UTF-8 is OK but UTF-16 is not. -// -// RFC6125 says that a wildcard label may be of the form *., where -// and/or may be empty. However, NSS requires to be empty, and we -// follow NSS's stricter policy by accepting wildcards only of the form -// *., where may be empty. -// -// An relative presented DNS ID matches both an absolute reference ID and a -// relative reference ID. Absolute presented DNS IDs are not supported: -// -// Presented ID Reference ID Result -// ------------------------------------- -// example.com example.com Match -// example.com. example.com Mismatch -// example.com example.com. Match -// example.com. example.com. Mismatch -// -// There are more subtleties documented inline in the code. -// -// Name constraints /////////////////////////////////////////////////////////// -// -// This is all RFC 5280 has to say about dNSName constraints: -// -// DNS name restrictions are expressed as host.example.com. Any DNS -// name that can be constructed by simply adding zero or more labels to -// the left-hand side of the name satisfies the name constraint. For -// example, www.host.example.com would satisfy the constraint but -// host1.example.com would not. -// -// This lack of specificity has lead to a lot of uncertainty regarding -// subdomain matching. In particular, the following questions have been -// raised and answered: -// -// Q: Does a presented identifier equal (case insensitive) to the name -// constraint match the constraint? For example, does the presented -// ID "host.example.com" match a "host.example.com" constraint? -// A: Yes. RFC5280 says "by simply adding zero or more labels" and this -// is the case of adding zero labels. -// -// Q: When the name constraint does not start with ".", do subdomain -// presented identifiers match it? For example, does the presented -// ID "www.host.example.com" match a "host.example.com" constraint? -// A: Yes. RFC5280 says "by simply adding zero or more labels" and this -// is the case of adding more than zero labels. The example is the -// one from RFC 5280. -// -// Q: When the name constraint does not start with ".", does a -// non-subdomain prefix match it? For example, does "bigfoo.bar.com" -// match "foo.bar.com"? [4] -// A: No. We interpret RFC 5280's language of "adding zero or more labels" -// to mean that whole labels must be prefixed. -// -// (Note that the above three scenarios are the same as the RFC 6265 -// domain matching rules [0].) -// -// Q: Is a name constraint that starts with "." valid, and if so, what -// semantics does it have? For example, does a presented ID of -// "www.example.com" match a constraint of ".example.com"? Does a -// presented ID of "example.com" match a constraint of ".example.com"? -// A: This implementation, NSS[1], and SChannel[2] all support a -// leading ".", but OpenSSL[3] does not yet. Amongst the -// implementations that support it, a leading "." is legal and means -// the same thing as when the "." is omitted, EXCEPT that a -// presented identifier equal (case insensitive) to the name -// constraint is not matched; i.e. presented dNSName identifiers -// must be subdomains. Some CAs in Mozilla's CA program (e.g. HARICA) -// have name constraints with the leading "." in their root -// certificates. The name constraints imposed on DCISS by Mozilla also -// have the it, so supporting this is a requirement for backward -// compatibility, even if it is not yet standardized. So, for example, a -// presented ID of "www.example.com" matches a constraint of -// ".example.com" but a presented ID of "example.com" does not. -// -// Q: Is there a way to prevent subdomain matches? -// A: Yes. -// -// Some people have proposed that dNSName constraints that do not -// start with a "." should be restricted to exact (case insensitive) -// matches. However, such a change of semantics from what RFC5280 -// specifies would be a non-backward-compatible change in the case of -// permittedSubtrees constraints, and it would be a security issue for -// excludedSubtrees constraints. -// -// However, it can be done with a combination of permittedSubtrees and -// excludedSubtrees, e.g. "example.com" in permittedSubtrees and -// ".example.com" in excludedSubtrees. -// -// Q: Are name constraints allowed to be specified as absolute names? -// For example, does a presented ID of "example.com" match a name -// constraint of "example.com." and vice versa. -// A: Absolute names are not supported as presented IDs or name -// constraints. Only reference IDs may be absolute. -// -// Q: Is "" a valid dNSName constraint? If so, what does it mean? -// A: Yes. Any valid presented dNSName can be formed "by simply adding zero -// or more labels to the left-hand side" of "". In particular, an -// excludedSubtrees dNSName constraint of "" forbids all dNSNames. -// -// Q: Is "." a valid dNSName constraint? If so, what does it mean? -// A: No, because absolute names are not allowed (see above). -// -// [0] RFC 6265 (Cookies) Domain Matching rules: -// http://tools.ietf.org/html/rfc6265#section-5.1.3 -// [1] NSS source code: -// https://mxr.mozilla.org/nss/source/lib/certdb/genname.c?rev=2a7348f013cb#1209 -// [2] Description of SChannel's behavior from Microsoft: -// http://www.imc.org/ietf-pkix/mail-archive/msg04668.html -// [3] Proposal to add such support to OpenSSL: -// http://www.mail-archive.com/openssl-dev%40openssl.org/msg36204.html -// https://rt.openssl.org/Ticket/Display.html?id=3562 -// [4] Feedback on the lack of clarify in the definition that never got -// incorporated into the spec: -// https://www.ietf.org/mail-archive/web/pkix/current/msg21192.html -fn presented_id_matches_reference_id_internal( - presented_dns_id: untrusted::Input, - reference_dns_id_role: IdRole, - reference_dns_id: untrusted::Input, -) -> Option { - if !is_valid_dns_id(presented_dns_id, IdRole::Presented, AllowWildcards::Yes) { - return None; - } - - if !is_valid_dns_id(reference_dns_id, reference_dns_id_role, AllowWildcards::No) { - return None; - } - - let mut presented = untrusted::Reader::new(presented_dns_id); - let mut reference = untrusted::Reader::new(reference_dns_id); - - match reference_dns_id_role { - IdRole::Reference => (), - - IdRole::NameConstraint if presented_dns_id.len() > reference_dns_id.len() => { - if reference_dns_id.is_empty() { - // An empty constraint matches everything. - return Some(true); - } - - // If the reference ID starts with a dot then skip the prefix of - // the presented ID and start the comparison at the position of - // that dot. Examples: - // - // Matches Doesn't Match - // ----------------------------------------------------------- - // original presented ID: www.example.com badexample.com - // skipped: www ba - // presented ID w/o prefix: .example.com dexample.com - // reference ID: .example.com .example.com - // - // If the reference ID does not start with a dot then we skip - // the prefix of the presented ID but also verify that the - // prefix ends with a dot. Examples: - // - // Matches Doesn't Match - // ----------------------------------------------------------- - // original presented ID: www.example.com badexample.com - // skipped: www ba - // must be '.': . d - // presented ID w/o prefix: example.com example.com - // reference ID: example.com example.com - // - if reference.peek(b'.') { - if presented - .skip(presented_dns_id.len() - reference_dns_id.len()) - .is_err() - { - unreachable!(); - } - } else { - if presented - .skip(presented_dns_id.len() - reference_dns_id.len() - 1) - .is_err() - { - unreachable!(); - } - if presented.read_byte() != Ok(b'.') { - return Some(false); - } - } - } - - IdRole::NameConstraint => (), - - IdRole::Presented => unreachable!(), - } - - // Only allow wildcard labels that consist only of '*'. - if presented.peek(b'*') { - if presented.skip(1).is_err() { - unreachable!(); - } - - loop { - if reference.read_byte().is_err() { - return Some(false); - } - if reference.peek(b'.') { - break; - } - } - } - - loop { - let presented_byte = match (presented.read_byte(), reference.read_byte()) { - (Ok(p), Ok(r)) if ascii_lower(p) == ascii_lower(r) => p, - _ => { - return Some(false); - } - }; - - if presented.at_end() { - // Don't allow presented IDs to be absolute. - if presented_byte == b'.' { - return None; - } - break; - } - } - - // Allow a relative presented DNS ID to match an absolute reference DNS ID, - // unless we're matching a name constraint. - if !reference.at_end() { - if reference_dns_id_role != IdRole::NameConstraint { - match reference.read_byte() { - Ok(b'.') => (), - _ => { - return Some(false); - } - }; - } - if !reference.at_end() { - return Some(false); - } - } - - assert!(presented.at_end()); - assert!(reference.at_end()); - - Some(true) -} - -#[inline] -fn ascii_lower(b: u8) -> u8 { - match b { - b'A'..=b'Z' => b + b'a' - b'A', - _ => b, - } -} - -#[derive(Clone, Copy, PartialEq)] -enum AllowWildcards { - No, - Yes, -} - -#[derive(Clone, Copy, PartialEq)] -enum IdRole { - Reference, - Presented, - NameConstraint, -} - -fn is_valid_reference_dns_id(hostname: untrusted::Input) -> bool { - is_valid_dns_id(hostname, IdRole::Reference, AllowWildcards::No) -} - -// https://tools.ietf.org/html/rfc5280#section-4.2.1.6: -// -// When the subjectAltName extension contains a domain name system -// label, the domain name MUST be stored in the dNSName (an IA5String). -// The name MUST be in the "preferred name syntax", as specified by -// Section 3.5 of [RFC1034] and as modified by Section 2.1 of -// [RFC1123]. -// -// https://bugzilla.mozilla.org/show_bug.cgi?id=1136616: As an exception to the -// requirement above, underscores are also allowed in names for compatibility. -fn is_valid_dns_id( - hostname: untrusted::Input, - id_role: IdRole, - allow_wildcards: AllowWildcards, -) -> bool { - // https://blogs.msdn.microsoft.com/oldnewthing/20120412-00/?p=7873/ - if hostname.len() > 253 { - return false; - } - - let mut input = untrusted::Reader::new(hostname); - - if id_role == IdRole::NameConstraint && input.at_end() { - return true; - } - - let mut dot_count = 0; - let mut label_length = 0; - let mut label_is_all_numeric = false; - let mut label_ends_with_hyphen = false; - - // Only presented IDs are allowed to have wildcard labels. And, like - // Chromium, be stricter than RFC 6125 requires by insisting that a - // wildcard label consist only of '*'. - let is_wildcard = allow_wildcards == AllowWildcards::Yes && input.peek(b'*'); - let mut is_first_byte = !is_wildcard; - if is_wildcard { - if input.read_byte() != Ok(b'*') || input.read_byte() != Ok(b'.') { - return false; - } - dot_count += 1; - } - - loop { - const MAX_LABEL_LENGTH: usize = 63; - - match input.read_byte() { - Ok(b'-') => { - if label_length == 0 { - return false; // Labels must not start with a hyphen. - } - label_is_all_numeric = false; - label_ends_with_hyphen = true; - label_length += 1; - if label_length > MAX_LABEL_LENGTH { - return false; - } - } - - Ok(b'0'..=b'9') => { - if label_length == 0 { - label_is_all_numeric = true; - } - label_ends_with_hyphen = false; - label_length += 1; - if label_length > MAX_LABEL_LENGTH { - return false; - } - } - - Ok(b'a'..=b'z') | Ok(b'A'..=b'Z') | Ok(b'_') => { - label_is_all_numeric = false; - label_ends_with_hyphen = false; - label_length += 1; - if label_length > MAX_LABEL_LENGTH { - return false; - } - } - - Ok(b'.') => { - dot_count += 1; - if label_length == 0 && (id_role != IdRole::NameConstraint || !is_first_byte) { - return false; - } - if label_ends_with_hyphen { - return false; // Labels must not end with a hyphen. - } - label_length = 0; - } - - _ => { - return false; - } - } - is_first_byte = false; - - if input.at_end() { - break; - } - } - - // Only reference IDs, not presented IDs or name constraints, may be - // absolute. - if label_length == 0 && id_role != IdRole::Reference { - return false; - } - - if label_ends_with_hyphen { - return false; // Labels must not end with a hyphen. - } - - if label_is_all_numeric { - return false; // Last label must not be all numeric. - } - - if is_wildcard { - // If the DNS ID ends with a dot, the last dot signifies an absolute ID. - let label_count = if label_length == 0 { - dot_count - } else { - dot_count + 1 - }; - - // Like NSS, require at least two labels to follow the wildcard label. - // TODO: Allow the TrustDomain to control this on a per-eTLD+1 basis, - // similar to Chromium. Even then, it might be better to still enforce - // that there are at least two labels after the wildcard. - if label_count < 3 { - return false; - } - } - - true -} - -#[cfg(test)] -mod tests { - use super::*; - - const PRESENTED_MATCHES_REFERENCE: &[(&[u8], &[u8], Option)] = &[ - (b"", b"a", None), - (b"a", b"a", Some(true)), - (b"b", b"a", Some(false)), - (b"*.b.a", b"c.b.a", Some(true)), - (b"*.b.a", b"b.a", Some(false)), - (b"*.b.a", b"b.a.", Some(false)), - // Wildcard not in leftmost label - (b"d.c.b.a", b"d.c.b.a", Some(true)), - (b"d.*.b.a", b"d.c.b.a", None), - (b"d.c*.b.a", b"d.c.b.a", None), - (b"d.c*.b.a", b"d.cc.b.a", None), - // case sensitivity - ( - b"abcdefghijklmnopqrstuvwxyz", - b"ABCDEFGHIJKLMNOPQRSTUVWXYZ", - Some(true), - ), - ( - b"ABCDEFGHIJKLMNOPQRSTUVWXYZ", - b"abcdefghijklmnopqrstuvwxyz", - Some(true), - ), - (b"aBc", b"Abc", Some(true)), - // digits - (b"a1", b"a1", Some(true)), - // A trailing dot indicates an absolute name, and absolute names can match - // relative names, and vice-versa. - (b"example", b"example", Some(true)), - (b"example.", b"example.", None), - (b"example", b"example.", Some(true)), - (b"example.", b"example", None), - (b"example.com", b"example.com", Some(true)), - (b"example.com.", b"example.com.", None), - (b"example.com", b"example.com.", Some(true)), - (b"example.com.", b"example.com", None), - (b"example.com..", b"example.com.", None), - (b"example.com..", b"example.com", None), - (b"example.com...", b"example.com.", None), - // xn-- IDN prefix - (b"x*.b.a", b"xa.b.a", None), - (b"x*.b.a", b"xna.b.a", None), - (b"x*.b.a", b"xn-a.b.a", None), - (b"x*.b.a", b"xn--a.b.a", None), - (b"xn*.b.a", b"xn--a.b.a", None), - (b"xn-*.b.a", b"xn--a.b.a", None), - (b"xn--*.b.a", b"xn--a.b.a", None), - (b"xn*.b.a", b"xn--a.b.a", None), - (b"xn-*.b.a", b"xn--a.b.a", None), - (b"xn--*.b.a", b"xn--a.b.a", None), - (b"xn---*.b.a", b"xn--a.b.a", None), - // "*" cannot expand to nothing. - (b"c*.b.a", b"c.b.a", None), - // -------------------------------------------------------------------------- - // The rest of these are test cases adapted from Chromium's - // x509_certificate_unittest.cc. The parameter order is the opposite in - // Chromium's tests. Also, they some tests were modified to fit into this - // framework or due to intentional differences between mozilla::pkix and - // Chromium. - (b"foo.com", b"foo.com", Some(true)), - (b"f", b"f", Some(true)), - (b"i", b"h", Some(false)), - (b"*.foo.com", b"bar.foo.com", Some(true)), - (b"*.test.fr", b"www.test.fr", Some(true)), - (b"*.test.FR", b"wwW.tESt.fr", Some(true)), - (b".uk", b"f.uk", None), - (b"?.bar.foo.com", b"w.bar.foo.com", None), - (b"(www|ftp).foo.com", b"www.foo.com", None), // regex! - (b"www.foo.com\0", b"www.foo.com", None), - (b"www.foo.com\0*.foo.com", b"www.foo.com", None), - (b"ww.house.example", b"www.house.example", Some(false)), - (b"www.test.org", b"test.org", Some(false)), - (b"*.test.org", b"test.org", Some(false)), - (b"*.org", b"test.org", None), - // '*' must be the only character in the wildcard label - (b"w*.bar.foo.com", b"w.bar.foo.com", None), - (b"ww*ww.bar.foo.com", b"www.bar.foo.com", None), - (b"ww*ww.bar.foo.com", b"wwww.bar.foo.com", None), - (b"w*w.bar.foo.com", b"wwww.bar.foo.com", None), - (b"w*w.bar.foo.c0m", b"wwww.bar.foo.com", None), - (b"wa*.bar.foo.com", b"WALLY.bar.foo.com", None), - (b"*Ly.bar.foo.com", b"wally.bar.foo.com", None), - // Chromium does URL decoding of the reference ID, but we don't, and we also - // require that the reference ID is valid, so we can't test these two. - // (b"www.foo.com", b"ww%57.foo.com", Some(true)), - // (b"www&.foo.com", b"www%26.foo.com", Some(true)), - (b"*.test.de", b"www.test.co.jp", Some(false)), - (b"*.jp", b"www.test.co.jp", None), - (b"www.test.co.uk", b"www.test.co.jp", Some(false)), - (b"www.*.co.jp", b"www.test.co.jp", None), - (b"www.bar.foo.com", b"www.bar.foo.com", Some(true)), - (b"*.foo.com", b"www.bar.foo.com", Some(false)), - (b"*.*.foo.com", b"www.bar.foo.com", None), - // Our matcher requires the reference ID to be a valid DNS name, so we cannot - // test this case. - // (b"*.*.bar.foo.com", b"*..bar.foo.com", Some(false)), - (b"www.bath.org", b"www.bath.org", Some(true)), - // Our matcher requires the reference ID to be a valid DNS name, so we cannot - // test these cases. - // DNS_ID_MISMATCH("www.bath.org", ""), - // (b"www.bath.org", b"20.30.40.50", Some(false)), - // (b"www.bath.org", b"66.77.88.99", Some(false)), - - // IDN tests - ( - b"xn--poema-9qae5a.com.br", - b"xn--poema-9qae5a.com.br", - Some(true), - ), - ( - b"*.xn--poema-9qae5a.com.br", - b"www.xn--poema-9qae5a.com.br", - Some(true), - ), - ( - b"*.xn--poema-9qae5a.com.br", - b"xn--poema-9qae5a.com.br", - Some(false), - ), - (b"xn--poema-*.com.br", b"xn--poema-9qae5a.com.br", None), - (b"xn--*-9qae5a.com.br", b"xn--poema-9qae5a.com.br", None), - (b"*--poema-9qae5a.com.br", b"xn--poema-9qae5a.com.br", None), - // The following are adapted from the examples quoted from - // http://tools.ietf.org/html/rfc6125#section-6.4.3 - // (e.g., *.example.com would match foo.example.com but - // not bar.foo.example.com or example.com). - (b"*.example.com", b"foo.example.com", Some(true)), - (b"*.example.com", b"bar.foo.example.com", Some(false)), - (b"*.example.com", b"example.com", Some(false)), - (b"baz*.example.net", b"baz1.example.net", None), - (b"*baz.example.net", b"foobaz.example.net", None), - (b"b*z.example.net", b"buzz.example.net", None), - // Wildcards should not be valid for public registry controlled domains, - // and unknown/unrecognized domains, at least three domain components must - // be present. For mozilla::pkix and NSS, there must always be at least two - // labels after the wildcard label. - (b"*.test.example", b"www.test.example", Some(true)), - (b"*.example.co.uk", b"test.example.co.uk", Some(true)), - (b"*.example", b"test.example", None), - // The result is different than Chromium, because Chromium takes into account - // the additional knowledge it has that "co.uk" is a TLD. mozilla::pkix does - // not know that. - (b"*.co.uk", b"example.co.uk", Some(true)), - (b"*.com", b"foo.com", None), - (b"*.us", b"foo.us", None), - (b"*", b"foo", None), - // IDN variants of wildcards and registry controlled domains. - ( - b"*.xn--poema-9qae5a.com.br", - b"www.xn--poema-9qae5a.com.br", - Some(true), - ), - ( - b"*.example.xn--mgbaam7a8h", - b"test.example.xn--mgbaam7a8h", - Some(true), - ), - // RFC6126 allows this, and NSS accepts it, but Chromium disallows it. - // TODO: File bug against Chromium. - (b"*.com.br", b"xn--poema-9qae5a.com.br", Some(true)), - (b"*.xn--mgbaam7a8h", b"example.xn--mgbaam7a8h", None), - // Wildcards should be permissible for 'private' registry-controlled - // domains. (In mozilla::pkix, we do not know if it is a private registry- - // controlled domain or not.) - (b"*.appspot.com", b"www.appspot.com", Some(true)), - (b"*.s3.amazonaws.com", b"foo.s3.amazonaws.com", Some(true)), - // Multiple wildcards are not valid. - (b"*.*.com", b"foo.example.com", None), - (b"*.bar.*.com", b"foo.bar.example.com", None), - // Absolute vs relative DNS name tests. Although not explicitly specified - // in RFC 6125, absolute reference names (those ending in a .) should - // match either absolute or relative presented names. - // TODO: File errata against RFC 6125 about this. - (b"foo.com.", b"foo.com", None), - (b"foo.com", b"foo.com.", Some(true)), - (b"foo.com.", b"foo.com.", None), - (b"f.", b"f", None), - (b"f", b"f.", Some(true)), - (b"f.", b"f.", None), - (b"*.bar.foo.com.", b"www-3.bar.foo.com", None), - (b"*.bar.foo.com", b"www-3.bar.foo.com.", Some(true)), - (b"*.bar.foo.com.", b"www-3.bar.foo.com.", None), - // We require the reference ID to be a valid DNS name, so we cannot test this - // case. - // (b".", b".", Some(false)), - (b"*.com.", b"example.com", None), - (b"*.com", b"example.com.", None), - (b"*.com.", b"example.com.", None), - (b"*.", b"foo.", None), - (b"*.", b"foo", None), - // The result is different than Chromium because we don't know that co.uk is - // a TLD. - (b"*.co.uk.", b"foo.co.uk", None), - (b"*.co.uk.", b"foo.co.uk.", None), - ]; - - #[test] - fn presented_matches_reference_test() { - for &(presented, reference, expected_result) in PRESENTED_MATCHES_REFERENCE { - let actual_result = presented_id_matches_reference_id( - untrusted::Input::from(presented), - untrusted::Input::from(reference), - ); - assert_eq!( - actual_result, - expected_result, - "presented_dns_id_matches_reference_dns_id(\"{:?}\", IDRole::ReferenceID, \"{:?}\")", - presented, - reference - ); - } - } -} diff -Nru temporalio-1.3.0/vendor/webpki/src/name/ip_address.rs temporalio-1.3.0/vendor/webpki/src/name/ip_address.rs --- temporalio-1.3.0/vendor/webpki/src/name/ip_address.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/webpki/src/name/ip_address.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,64 +0,0 @@ -// Copyright 2015-2020 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR -// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -use crate::Error; - -// https://tools.ietf.org/html/rfc5280#section-4.2.1.10 says: -// -// For IPv4 addresses, the iPAddress field of GeneralName MUST contain -// eight (8) octets, encoded in the style of RFC 4632 (CIDR) to represent -// an address range [RFC4632]. For IPv6 addresses, the iPAddress field -// MUST contain 32 octets similarly encoded. For example, a name -// constraint for "class C" subnet 192.0.2.0 is represented as the -// octets C0 00 02 00 FF FF FF 00, representing the CIDR notation -// 192.0.2.0/24 (mask 255.255.255.0). -pub(super) fn presented_id_matches_constraint( - name: untrusted::Input, - constraint: untrusted::Input, -) -> Result { - if name.len() != 4 && name.len() != 16 { - return Err(Error::BadDer); - } - if constraint.len() != 8 && constraint.len() != 32 { - return Err(Error::BadDer); - } - - // an IPv4 address never matches an IPv6 constraint, and vice versa. - if name.len() * 2 != constraint.len() { - return Ok(false); - } - - let (constraint_address, constraint_mask) = constraint.read_all(Error::BadDer, |value| { - let address = value.read_bytes(constraint.len() / 2).unwrap(); - let mask = value.read_bytes(constraint.len() / 2).unwrap(); - Ok((address, mask)) - })?; - - let mut name = untrusted::Reader::new(name); - let mut constraint_address = untrusted::Reader::new(constraint_address); - let mut constraint_mask = untrusted::Reader::new(constraint_mask); - loop { - let name_byte = name.read_byte().unwrap(); - let constraint_address_byte = constraint_address.read_byte().unwrap(); - let constraint_mask_byte = constraint_mask.read_byte().unwrap(); - if ((name_byte ^ constraint_address_byte) & constraint_mask_byte) != 0 { - return Ok(false); - } - if name.at_end() { - break; - } - } - - Ok(true) -} diff -Nru temporalio-1.3.0/vendor/webpki/src/name/verify.rs temporalio-1.3.0/vendor/webpki/src/name/verify.rs --- temporalio-1.3.0/vendor/webpki/src/name/verify.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/webpki/src/name/verify.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,328 +0,0 @@ -// Copyright 2015 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR -// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -use super::{ - dns_name::{self, DnsNameRef}, - ip_address, -}; -use crate::{ - cert::{Cert, EndEntityOrCa}, - der, equal, Error, -}; - -pub fn verify_cert_dns_name( - cert: &crate::EndEntityCert, - dns_name: DnsNameRef, -) -> Result<(), Error> { - let cert = cert.inner(); - let dns_name = untrusted::Input::from(dns_name.as_ref()); - iterate_names( - cert.subject, - cert.subject_alt_name, - Err(Error::CertNotValidForName), - &|name| { - match name { - GeneralName::DnsName(presented_id) => { - match dns_name::presented_id_matches_reference_id(presented_id, dns_name) { - Some(true) => { - return NameIteration::Stop(Ok(())); - } - Some(false) => (), - None => { - return NameIteration::Stop(Err(Error::BadDer)); - } - } - } - _ => (), - } - NameIteration::KeepGoing - }, - ) -} - -// https://tools.ietf.org/html/rfc5280#section-4.2.1.10 -pub fn check_name_constraints( - input: Option<&mut untrusted::Reader>, - subordinate_certs: &Cert, -) -> Result<(), Error> { - let input = match input { - Some(input) => input, - None => { - return Ok(()); - } - }; - - fn parse_subtrees<'b>( - inner: &mut untrusted::Reader<'b>, - subtrees_tag: der::Tag, - ) -> Result>, Error> { - if !inner.peek(subtrees_tag.into()) { - return Ok(None); - } - let subtrees = der::nested(inner, subtrees_tag, Error::BadDer, |tagged| { - der::expect_tag_and_get_value(tagged, der::Tag::Sequence) - })?; - Ok(Some(subtrees)) - } - - let permitted_subtrees = parse_subtrees(input, der::Tag::ContextSpecificConstructed0)?; - let excluded_subtrees = parse_subtrees(input, der::Tag::ContextSpecificConstructed1)?; - - let mut child = subordinate_certs; - loop { - iterate_names(child.subject, child.subject_alt_name, Ok(()), &|name| { - check_presented_id_conforms_to_constraints(name, permitted_subtrees, excluded_subtrees) - })?; - - child = match child.ee_or_ca { - EndEntityOrCa::Ca(child_cert) => child_cert, - EndEntityOrCa::EndEntity => { - break; - } - }; - } - - Ok(()) -} - -fn check_presented_id_conforms_to_constraints( - name: GeneralName, - permitted_subtrees: Option, - excluded_subtrees: Option, -) -> NameIteration { - match check_presented_id_conforms_to_constraints_in_subtree( - name, - Subtrees::PermittedSubtrees, - permitted_subtrees, - ) { - stop @ NameIteration::Stop(..) => { - return stop; - } - NameIteration::KeepGoing => (), - }; - - check_presented_id_conforms_to_constraints_in_subtree( - name, - Subtrees::ExcludedSubtrees, - excluded_subtrees, - ) -} - -#[derive(Clone, Copy)] -enum Subtrees { - PermittedSubtrees, - ExcludedSubtrees, -} - -fn check_presented_id_conforms_to_constraints_in_subtree( - name: GeneralName, - subtrees: Subtrees, - constraints: Option, -) -> NameIteration { - let mut constraints = match constraints { - Some(constraints) => untrusted::Reader::new(constraints), - None => { - return NameIteration::KeepGoing; - } - }; - - let mut has_permitted_subtrees_match = false; - let mut has_permitted_subtrees_mismatch = false; - - loop { - // http://tools.ietf.org/html/rfc5280#section-4.2.1.10: "Within this - // profile, the minimum and maximum fields are not used with any name - // forms, thus, the minimum MUST be zero, and maximum MUST be absent." - // - // Since the default value isn't allowed to be encoded according to the - // DER encoding rules for DEFAULT, this is equivalent to saying that - // neither minimum or maximum must be encoded. - fn general_subtree<'b>( - input: &mut untrusted::Reader<'b>, - ) -> Result, Error> { - let general_subtree = der::expect_tag_and_get_value(input, der::Tag::Sequence)?; - general_subtree.read_all(Error::BadDer, general_name) - } - - let base = match general_subtree(&mut constraints) { - Ok(base) => base, - Err(err) => { - return NameIteration::Stop(Err(err)); - } - }; - - let matches = match (name, base) { - (GeneralName::DnsName(name), GeneralName::DnsName(base)) => { - dns_name::presented_id_matches_constraint(name, base).ok_or(Error::BadDer) - } - - (GeneralName::DirectoryName(name), GeneralName::DirectoryName(base)) => Ok( - presented_directory_name_matches_constraint(name, base, subtrees), - ), - - (GeneralName::IpAddress(name), GeneralName::IpAddress(base)) => { - ip_address::presented_id_matches_constraint(name, base) - } - - // RFC 4280 says "If a name constraints extension that is marked as - // critical imposes constraints on a particular name form, and an - // instance of that name form appears in the subject field or - // subjectAltName extension of a subsequent certificate, then the - // application MUST either process the constraint or reject the - // certificate." Later, the CABForum agreed to support non-critical - // constraints, so it is important to reject the cert without - // considering whether the name constraint it critical. - (GeneralName::Unsupported(name_tag), GeneralName::Unsupported(base_tag)) - if name_tag == base_tag => - { - Err(Error::NameConstraintViolation) - } - - _ => Ok(false), - }; - - match (subtrees, matches) { - (Subtrees::PermittedSubtrees, Ok(true)) => { - has_permitted_subtrees_match = true; - } - - (Subtrees::PermittedSubtrees, Ok(false)) => { - has_permitted_subtrees_mismatch = true; - } - - (Subtrees::ExcludedSubtrees, Ok(true)) => { - return NameIteration::Stop(Err(Error::NameConstraintViolation)); - } - - (Subtrees::ExcludedSubtrees, Ok(false)) => (), - - (_, Err(err)) => { - return NameIteration::Stop(Err(err)); - } - } - - if constraints.at_end() { - break; - } - } - - if has_permitted_subtrees_mismatch && !has_permitted_subtrees_match { - // If there was any entry of the given type in permittedSubtrees, then - // it required that at least one of them must match. Since none of them - // did, we have a failure. - NameIteration::Stop(Err(Error::NameConstraintViolation)) - } else { - NameIteration::KeepGoing - } -} - -// TODO: document this. -fn presented_directory_name_matches_constraint( - name: untrusted::Input, - constraint: untrusted::Input, - subtrees: Subtrees, -) -> bool { - match subtrees { - Subtrees::PermittedSubtrees => equal(name, constraint), - Subtrees::ExcludedSubtrees => true, - } -} - -#[derive(Clone, Copy)] -enum NameIteration { - KeepGoing, - Stop(Result<(), Error>), -} - -fn iterate_names( - subject: untrusted::Input, - subject_alt_name: Option, - result_if_never_stopped_early: Result<(), Error>, - f: &dyn Fn(GeneralName) -> NameIteration, -) -> Result<(), Error> { - match subject_alt_name { - Some(subject_alt_name) => { - let mut subject_alt_name = untrusted::Reader::new(subject_alt_name); - // https://bugzilla.mozilla.org/show_bug.cgi?id=1143085: An empty - // subjectAltName is not legal, but some certificates have an empty - // subjectAltName. Since we don't support CN-IDs, the certificate - // will be rejected either way, but checking `at_end` before - // attempting to parse the first entry allows us to return a better - // error code. - while !subject_alt_name.at_end() { - let name = general_name(&mut subject_alt_name)?; - match f(name) { - NameIteration::Stop(result) => { - return result; - } - NameIteration::KeepGoing => (), - } - } - } - None => (), - } - - match f(GeneralName::DirectoryName(subject)) { - NameIteration::Stop(result) => result, - NameIteration::KeepGoing => result_if_never_stopped_early, - } -} - -// It is *not* valid to derive `Eq`, `PartialEq, etc. for this type. In -// particular, for the types of `GeneralName`s that we don't understand, we -// don't even store the value. Also, the meaning of a `GeneralName` in a name -// constraint is different than the meaning of the identically-represented -// `GeneralName` in other contexts. -#[derive(Clone, Copy)] -enum GeneralName<'a> { - DnsName(untrusted::Input<'a>), - DirectoryName(untrusted::Input<'a>), - IpAddress(untrusted::Input<'a>), - - // The value is the `tag & ~(der::CONTEXT_SPECIFIC | der::CONSTRUCTED)` so - // that the name constraint checking matches tags regardless of whether - // those bits are set. - Unsupported(u8), -} - -fn general_name<'a>(input: &mut untrusted::Reader<'a>) -> Result, Error> { - use ring::io::der::{CONSTRUCTED, CONTEXT_SPECIFIC}; - #[allow(clippy::identity_op)] - const OTHER_NAME_TAG: u8 = CONTEXT_SPECIFIC | CONSTRUCTED | 0; - const RFC822_NAME_TAG: u8 = CONTEXT_SPECIFIC | 1; - const DNS_NAME_TAG: u8 = CONTEXT_SPECIFIC | 2; - const X400_ADDRESS_TAG: u8 = CONTEXT_SPECIFIC | CONSTRUCTED | 3; - const DIRECTORY_NAME_TAG: u8 = CONTEXT_SPECIFIC | CONSTRUCTED | 4; - const EDI_PARTY_NAME_TAG: u8 = CONTEXT_SPECIFIC | CONSTRUCTED | 5; - const UNIFORM_RESOURCE_IDENTIFIER_TAG: u8 = CONTEXT_SPECIFIC | 6; - const IP_ADDRESS_TAG: u8 = CONTEXT_SPECIFIC | 7; - const REGISTERED_ID_TAG: u8 = CONTEXT_SPECIFIC | 8; - - let (tag, value) = der::read_tag_and_get_value(input)?; - let name = match tag { - DNS_NAME_TAG => GeneralName::DnsName(value), - DIRECTORY_NAME_TAG => GeneralName::DirectoryName(value), - IP_ADDRESS_TAG => GeneralName::IpAddress(value), - - OTHER_NAME_TAG - | RFC822_NAME_TAG - | X400_ADDRESS_TAG - | EDI_PARTY_NAME_TAG - | UNIFORM_RESOURCE_IDENTIFIER_TAG - | REGISTERED_ID_TAG => GeneralName::Unsupported(tag & !(CONTEXT_SPECIFIC | CONSTRUCTED)), - - _ => return Err(Error::BadDer), - }; - Ok(name) -} diff -Nru temporalio-1.3.0/vendor/webpki/src/name.rs temporalio-1.3.0/vendor/webpki/src/name.rs --- temporalio-1.3.0/vendor/webpki/src/name.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/webpki/src/name.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -// Copyright 2015-2020 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR -// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -mod dns_name; -pub use dns_name::{DnsNameRef, InvalidDnsNameError}; - -/// Requires the `alloc` feature. -#[cfg(feature = "alloc")] -pub use dns_name::DnsName; - -mod ip_address; - -mod verify; -pub(super) use verify::{check_name_constraints, verify_cert_dns_name}; diff -Nru temporalio-1.3.0/vendor/webpki/src/signed_data.rs temporalio-1.3.0/vendor/webpki/src/signed_data.rs --- temporalio-1.3.0/vendor/webpki/src/signed_data.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/webpki/src/signed_data.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,792 +0,0 @@ -// Copyright 2015 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR -// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -use crate::{der, equal, Error}; -use ring::signature; - -/// X.509 certificates and related items that are signed are almost always -/// encoded in the format "tbs||signatureAlgorithm||signature". This structure -/// captures this pattern. -pub struct SignedData<'a> { - /// The signed data. This would be `tbsCertificate` in the case of an X.509 - /// certificate, `tbsResponseData` in the case of an OCSP response, and the - /// data nested in the `digitally-signed` construct for TLS 1.2 signed - /// data. - data: untrusted::Input<'a>, - - /// The value of the `AlgorithmIdentifier`. This would be - /// `signatureAlgorithm` in the case of an X.509 certificate or OCSP - /// response. This would have to be synthesized in the case of TLS 1.2 - /// signed data, since TLS does not identify algorithms by ASN.1 OIDs. - pub(crate) algorithm: untrusted::Input<'a>, - - /// The value of the signature. This would be `signature` in an X.509 - /// certificate or OCSP response. This would be the value of - /// `DigitallySigned.signature` for TLS 1.2 signed data. - signature: untrusted::Input<'a>, -} - -/// Parses the concatenation of "tbs||signatureAlgorithm||signature" that -/// is common in the X.509 certificate and OCSP response syntaxes. -/// -/// X.509 Certificates (RFC 5280) look like this: -/// -/// ```ASN.1 -/// Certificate (SEQUENCE) { -/// tbsCertificate TBSCertificate, -/// signatureAlgorithm AlgorithmIdentifier, -/// signatureValue BIT STRING -/// } -/// ``` -/// -/// OCSP responses (RFC 6960) look like this: -/// ```ASN.1 -/// BasicOCSPResponse { -/// tbsResponseData ResponseData, -/// signatureAlgorithm AlgorithmIdentifier, -/// signature BIT STRING, -/// certs [0] EXPLICIT SEQUENCE OF Certificate OPTIONAL -/// } -/// ``` -/// -/// Note that this function does NOT parse the outermost `SEQUENCE` or the -/// `certs` value. -/// -/// The return value's first component is the contents of -/// `tbsCertificate`/`tbsResponseData`; the second component is a `SignedData` -/// structure that can be passed to `verify_signed_data`. -pub(crate) fn parse_signed_data<'a>( - der: &mut untrusted::Reader<'a>, -) -> Result<(untrusted::Input<'a>, SignedData<'a>), Error> { - let (data, tbs) = - der.read_partial(|input| der::expect_tag_and_get_value(input, der::Tag::Sequence))?; - let algorithm = der::expect_tag_and_get_value(der, der::Tag::Sequence)?; - let signature = der::bit_string_with_no_unused_bits(der)?; - - Ok(( - tbs, - SignedData { - data, - algorithm, - signature, - }, - )) -} - -/// Verify `signed_data` using the public key in the DER-encoded -/// SubjectPublicKeyInfo `spki` using one of the algorithms in -/// `supported_algorithms`. -/// -/// The algorithm is chosen based on the algorithm information encoded in the -/// algorithm identifiers in `public_key` and `signed_data.algorithm`. The -/// ordering of the algorithms in `supported_algorithms` does not really matter, -/// but generally more common algorithms should go first, as it is scanned -/// linearly for matches. -pub(crate) fn verify_signed_data( - supported_algorithms: &[&SignatureAlgorithm], - spki_value: untrusted::Input, - signed_data: &SignedData, -) -> Result<(), Error> { - // We need to verify the signature in `signed_data` using the public key - // in `public_key`. In order to know which *ring* signature verification - // algorithm to use, we need to know the public key algorithm (ECDSA, - // RSA PKCS#1, etc.), the curve (if applicable), and the digest algorithm. - // `signed_data` identifies only the public key algorithm and the digest - // algorithm, and `public_key` identifies only the public key algorithm and - // the curve (if any). Thus, we have to combine information from both - // inputs to figure out which `ring::signature::VerificationAlgorithm` to - // use to verify the signature. - // - // This is all further complicated by the fact that we don't have any - // implicit knowledge about any algorithms or identifiers, since all of - // that information is encoded in `supported_algorithms.` In particular, we - // avoid hard-coding any of that information so that (link-time) dead code - // elimination will work effectively in eliminating code for unused - // algorithms. - - // Parse the signature. - // - let mut found_signature_alg_match = false; - for supported_alg in supported_algorithms.iter().filter(|alg| { - alg.signature_alg_id - .matches_algorithm_id_value(signed_data.algorithm) - }) { - match verify_signature( - supported_alg, - spki_value, - signed_data.data, - signed_data.signature, - ) { - Err(Error::UnsupportedSignatureAlgorithmForPublicKey) => { - found_signature_alg_match = true; - continue; - } - result => { - return result; - } - } - } - - if found_signature_alg_match { - Err(Error::UnsupportedSignatureAlgorithmForPublicKey) - } else { - Err(Error::UnsupportedSignatureAlgorithm) - } -} - -pub(crate) fn verify_signature( - signature_alg: &SignatureAlgorithm, - spki_value: untrusted::Input, - msg: untrusted::Input, - signature: untrusted::Input, -) -> Result<(), Error> { - let spki = parse_spki_value(spki_value)?; - if !signature_alg - .public_key_alg_id - .matches_algorithm_id_value(spki.algorithm_id_value) - { - return Err(Error::UnsupportedSignatureAlgorithmForPublicKey); - } - signature::UnparsedPublicKey::new( - signature_alg.verification_alg, - spki.key_value.as_slice_less_safe(), - ) - .verify(msg.as_slice_less_safe(), signature.as_slice_less_safe()) - .map_err(|_| Error::InvalidSignatureForPublicKey) -} - -struct SubjectPublicKeyInfo<'a> { - algorithm_id_value: untrusted::Input<'a>, - key_value: untrusted::Input<'a>, -} - -// Parse the public key into an algorithm OID, an optional curve OID, and the -// key value. The caller needs to check whether these match the -// `PublicKeyAlgorithm` for the `SignatureAlgorithm` that is matched when -// parsing the signature. -fn parse_spki_value(input: untrusted::Input) -> Result { - input.read_all(Error::BadDer, |input| { - let algorithm_id_value = der::expect_tag_and_get_value(input, der::Tag::Sequence)?; - let key_value = der::bit_string_with_no_unused_bits(input)?; - Ok(SubjectPublicKeyInfo { - algorithm_id_value, - key_value, - }) - }) -} - -/// A signature algorithm. -pub struct SignatureAlgorithm { - public_key_alg_id: AlgorithmIdentifier, - signature_alg_id: AlgorithmIdentifier, - verification_alg: &'static dyn signature::VerificationAlgorithm, -} - -/// ECDSA signatures using the P-256 curve and SHA-256. -pub static ECDSA_P256_SHA256: SignatureAlgorithm = SignatureAlgorithm { - public_key_alg_id: ECDSA_P256, - signature_alg_id: ECDSA_SHA256, - verification_alg: &signature::ECDSA_P256_SHA256_ASN1, -}; - -/// ECDSA signatures using the P-256 curve and SHA-384. Deprecated. -pub static ECDSA_P256_SHA384: SignatureAlgorithm = SignatureAlgorithm { - public_key_alg_id: ECDSA_P256, - signature_alg_id: ECDSA_SHA384, - verification_alg: &signature::ECDSA_P256_SHA384_ASN1, -}; - -/// ECDSA signatures using the P-384 curve and SHA-256. Deprecated. -pub static ECDSA_P384_SHA256: SignatureAlgorithm = SignatureAlgorithm { - public_key_alg_id: ECDSA_P384, - signature_alg_id: ECDSA_SHA256, - verification_alg: &signature::ECDSA_P384_SHA256_ASN1, -}; - -/// ECDSA signatures using the P-384 curve and SHA-384. -pub static ECDSA_P384_SHA384: SignatureAlgorithm = SignatureAlgorithm { - public_key_alg_id: ECDSA_P384, - signature_alg_id: ECDSA_SHA384, - verification_alg: &signature::ECDSA_P384_SHA384_ASN1, -}; - -/// RSA PKCS#1 1.5 signatures using SHA-256 for keys of 2048-8192 bits. -/// -/// Requires the `alloc` feature. -#[cfg(feature = "alloc")] -pub static RSA_PKCS1_2048_8192_SHA256: SignatureAlgorithm = SignatureAlgorithm { - public_key_alg_id: RSA_ENCRYPTION, - signature_alg_id: RSA_PKCS1_SHA256, - verification_alg: &signature::RSA_PKCS1_2048_8192_SHA256, -}; - -/// RSA PKCS#1 1.5 signatures using SHA-384 for keys of 2048-8192 bits. -/// -/// Requires the `alloc` feature. -#[cfg(feature = "alloc")] -pub static RSA_PKCS1_2048_8192_SHA384: SignatureAlgorithm = SignatureAlgorithm { - public_key_alg_id: RSA_ENCRYPTION, - signature_alg_id: RSA_PKCS1_SHA384, - verification_alg: &signature::RSA_PKCS1_2048_8192_SHA384, -}; - -/// RSA PKCS#1 1.5 signatures using SHA-512 for keys of 2048-8192 bits. -/// -/// Requires the `alloc` feature. -#[cfg(feature = "alloc")] -pub static RSA_PKCS1_2048_8192_SHA512: SignatureAlgorithm = SignatureAlgorithm { - public_key_alg_id: RSA_ENCRYPTION, - signature_alg_id: RSA_PKCS1_SHA512, - verification_alg: &signature::RSA_PKCS1_2048_8192_SHA512, -}; - -/// RSA PKCS#1 1.5 signatures using SHA-384 for keys of 3072-8192 bits. -/// -/// Requires the `alloc` feature. -#[cfg(feature = "alloc")] -pub static RSA_PKCS1_3072_8192_SHA384: SignatureAlgorithm = SignatureAlgorithm { - public_key_alg_id: RSA_ENCRYPTION, - signature_alg_id: RSA_PKCS1_SHA384, - verification_alg: &signature::RSA_PKCS1_3072_8192_SHA384, -}; - -/// RSA PSS signatures using SHA-256 for keys of 2048-8192 bits and of -/// type rsaEncryption; see [RFC 4055 Section 1.2]. -/// -/// [RFC 4055 Section 1.2]: https://tools.ietf.org/html/rfc4055#section-1.2 -/// -/// Requires the `alloc` feature. -#[cfg(feature = "alloc")] -pub static RSA_PSS_2048_8192_SHA256_LEGACY_KEY: SignatureAlgorithm = SignatureAlgorithm { - public_key_alg_id: RSA_ENCRYPTION, - signature_alg_id: RSA_PSS_SHA256, - verification_alg: &signature::RSA_PSS_2048_8192_SHA256, -}; - -/// RSA PSS signatures using SHA-384 for keys of 2048-8192 bits and of -/// type rsaEncryption; see [RFC 4055 Section 1.2]. -/// -/// [RFC 4055 Section 1.2]: https://tools.ietf.org/html/rfc4055#section-1.2 -/// -/// Requires the `alloc` feature. -#[cfg(feature = "alloc")] -pub static RSA_PSS_2048_8192_SHA384_LEGACY_KEY: SignatureAlgorithm = SignatureAlgorithm { - public_key_alg_id: RSA_ENCRYPTION, - signature_alg_id: RSA_PSS_SHA384, - verification_alg: &signature::RSA_PSS_2048_8192_SHA384, -}; - -/// RSA PSS signatures using SHA-512 for keys of 2048-8192 bits and of -/// type rsaEncryption; see [RFC 4055 Section 1.2]. -/// -/// [RFC 4055 Section 1.2]: https://tools.ietf.org/html/rfc4055#section-1.2 -/// -/// Requires the `alloc` feature. -#[cfg(feature = "alloc")] -pub static RSA_PSS_2048_8192_SHA512_LEGACY_KEY: SignatureAlgorithm = SignatureAlgorithm { - public_key_alg_id: RSA_ENCRYPTION, - signature_alg_id: RSA_PSS_SHA512, - verification_alg: &signature::RSA_PSS_2048_8192_SHA512, -}; - -/// ED25519 signatures according to RFC 8410 -pub static ED25519: SignatureAlgorithm = SignatureAlgorithm { - public_key_alg_id: ED_25519, - signature_alg_id: ED_25519, - verification_alg: &signature::ED25519, -}; - -struct AlgorithmIdentifier { - asn1_id_value: untrusted::Input<'static>, -} - -impl AlgorithmIdentifier { - fn matches_algorithm_id_value(&self, encoded: untrusted::Input) -> bool { - equal(encoded, self.asn1_id_value) - } -} - -// See src/data/README.md. - -const ECDSA_P256: AlgorithmIdentifier = AlgorithmIdentifier { - asn1_id_value: untrusted::Input::from(include_bytes!("data/alg-ecdsa-p256.der")), -}; - -const ECDSA_P384: AlgorithmIdentifier = AlgorithmIdentifier { - asn1_id_value: untrusted::Input::from(include_bytes!("data/alg-ecdsa-p384.der")), -}; - -const ECDSA_SHA256: AlgorithmIdentifier = AlgorithmIdentifier { - asn1_id_value: untrusted::Input::from(include_bytes!("data/alg-ecdsa-sha256.der")), -}; - -const ECDSA_SHA384: AlgorithmIdentifier = AlgorithmIdentifier { - asn1_id_value: untrusted::Input::from(include_bytes!("data/alg-ecdsa-sha384.der")), -}; - -#[cfg(feature = "alloc")] -const RSA_ENCRYPTION: AlgorithmIdentifier = AlgorithmIdentifier { - asn1_id_value: untrusted::Input::from(include_bytes!("data/alg-rsa-encryption.der")), -}; - -#[cfg(feature = "alloc")] -const RSA_PKCS1_SHA256: AlgorithmIdentifier = AlgorithmIdentifier { - asn1_id_value: untrusted::Input::from(include_bytes!("data/alg-rsa-pkcs1-sha256.der")), -}; - -#[cfg(feature = "alloc")] -const RSA_PKCS1_SHA384: AlgorithmIdentifier = AlgorithmIdentifier { - asn1_id_value: untrusted::Input::from(include_bytes!("data/alg-rsa-pkcs1-sha384.der")), -}; - -#[cfg(feature = "alloc")] -const RSA_PKCS1_SHA512: AlgorithmIdentifier = AlgorithmIdentifier { - asn1_id_value: untrusted::Input::from(include_bytes!("data/alg-rsa-pkcs1-sha512.der")), -}; - -#[cfg(feature = "alloc")] -const RSA_PSS_SHA256: AlgorithmIdentifier = AlgorithmIdentifier { - asn1_id_value: untrusted::Input::from(include_bytes!("data/alg-rsa-pss-sha256.der")), -}; - -#[cfg(feature = "alloc")] -const RSA_PSS_SHA384: AlgorithmIdentifier = AlgorithmIdentifier { - asn1_id_value: untrusted::Input::from(include_bytes!("data/alg-rsa-pss-sha384.der")), -}; - -#[cfg(feature = "alloc")] -const RSA_PSS_SHA512: AlgorithmIdentifier = AlgorithmIdentifier { - asn1_id_value: untrusted::Input::from(include_bytes!("data/alg-rsa-pss-sha512.der")), -}; - -const ED_25519: AlgorithmIdentifier = AlgorithmIdentifier { - asn1_id_value: untrusted::Input::from(include_bytes!("data/alg-ed25519.der")), -}; - -#[cfg(test)] -mod tests { - use crate::{der, signed_data, Error}; - use alloc::{string::String, vec::Vec}; - - macro_rules! test_file_bytes { - ( $file_name:expr ) => { - include_bytes!(concat!( - "../third-party/chromium/data/verify_signed_data/", - $file_name - )) - }; - } - - // TODO: The expected results need to be modified for SHA-1 deprecation. - - macro_rules! test_verify_signed_data { - ($fn_name:ident, $file_name:expr, $expected_result:expr) => { - #[test] - fn $fn_name() { - test_verify_signed_data(test_file_bytes!($file_name), $expected_result); - } - }; - } - - fn test_verify_signed_data(file_contents: &[u8], expected_result: Result<(), Error>) { - let tsd = parse_test_signed_data(file_contents); - let spki_value = untrusted::Input::from(&tsd.spki); - let spki_value = spki_value - .read_all(Error::BadDer, |input| { - der::expect_tag_and_get_value(input, der::Tag::Sequence) - }) - .unwrap(); - - // we can't use `parse_signed_data` because it requires `data` - // to be an ASN.1 SEQUENCE, and that isn't the case with - // Chromium's test data. TODO: The test data set should be - // expanded with SEQUENCE-wrapped data so that we can actually - // test `parse_signed_data`. - - let algorithm = untrusted::Input::from(&tsd.algorithm); - let algorithm = algorithm - .read_all(Error::BadDer, |input| { - der::expect_tag_and_get_value(input, der::Tag::Sequence) - }) - .unwrap(); - - let signature = untrusted::Input::from(&tsd.signature); - let signature = signature - .read_all(Error::BadDer, |input| { - der::bit_string_with_no_unused_bits(input) - }) - .unwrap(); - - let signed_data = signed_data::SignedData { - data: untrusted::Input::from(&tsd.data), - algorithm, - signature, - }; - - assert_eq!( - expected_result, - signed_data::verify_signed_data( - SUPPORTED_ALGORITHMS_IN_TESTS, - spki_value, - &signed_data - ) - ); - } - - // XXX: This is testing code that isn't even in this module. - macro_rules! test_verify_signed_data_signature_outer { - ($fn_name:ident, $file_name:expr, $expected_result:expr) => { - #[test] - fn $fn_name() { - test_verify_signed_data_signature_outer( - test_file_bytes!($file_name), - $expected_result, - ); - } - }; - } - - fn test_verify_signed_data_signature_outer(file_contents: &[u8], expected_error: Error) { - let tsd = parse_test_signed_data(file_contents); - let signature = untrusted::Input::from(&tsd.signature); - assert_eq!( - expected_error, - signature - .read_all(Error::BadDer, |input| { - der::bit_string_with_no_unused_bits(input) - }) - .unwrap_err() - ); - } - - // XXX: This is testing code that is not even in this module. - macro_rules! test_parse_spki_bad_outer { - ($fn_name:ident, $file_name:expr, $error:expr) => { - #[test] - fn $fn_name() { - test_parse_spki_bad_outer(test_file_bytes!($file_name), $error) - } - }; - } - - fn test_parse_spki_bad_outer(file_contents: &[u8], expected_error: Error) { - let tsd = parse_test_signed_data(file_contents); - let spki = untrusted::Input::from(&tsd.spki); - assert_eq!( - expected_error, - spki.read_all(Error::BadDer, |input| { - der::expect_tag_and_get_value(input, der::Tag::Sequence) - }) - .unwrap_err() - ); - } - - const UNSUPPORTED_SIGNATURE_ALGORITHM_FOR_RSA_KEY: Error = if cfg!(feature = "alloc") { - Error::UnsupportedSignatureAlgorithmForPublicKey - } else { - Error::UnsupportedSignatureAlgorithm - }; - - const INVALID_SIGNATURE_FOR_RSA_KEY: Error = if cfg!(feature = "alloc") { - Error::InvalidSignatureForPublicKey - } else { - Error::UnsupportedSignatureAlgorithm - }; - - const OK_IF_RSA_AVAILABLE: Result<(), Error> = if cfg!(feature = "alloc") { - Ok(()) - } else { - Err(Error::UnsupportedSignatureAlgorithm) - }; - - // XXX: Some of the BadDER tests should have better error codes, maybe? - - // XXX: We should have a variant of this test with a SHA-256 digest that gives - // `Error::UnsupportedSignatureAlgorithmForPublicKey`. - test_verify_signed_data!( - test_ecdsa_prime256v1_sha512_spki_params_null, - "ecdsa-prime256v1-sha512-spki-params-null.pem", - Err(Error::UnsupportedSignatureAlgorithm) - ); - test_verify_signed_data_signature_outer!( - test_ecdsa_prime256v1_sha512_unused_bits_signature, - "ecdsa-prime256v1-sha512-unused-bits-signature.pem", - Error::BadDer - ); - // XXX: We should have a variant of this test with a SHA-256 digest that gives - // `Error::UnsupportedSignatureAlgorithmForPublicKey`. - test_verify_signed_data!( - test_ecdsa_prime256v1_sha512_using_ecdh_key, - "ecdsa-prime256v1-sha512-using-ecdh-key.pem", - Err(Error::UnsupportedSignatureAlgorithm) - ); - // XXX: We should have a variant of this test with a SHA-256 digest that gives - // `Error::UnsupportedSignatureAlgorithmForPublicKey`. - test_verify_signed_data!( - test_ecdsa_prime256v1_sha512_using_ecmqv_key, - "ecdsa-prime256v1-sha512-using-ecmqv-key.pem", - Err(Error::UnsupportedSignatureAlgorithm) - ); - test_verify_signed_data!( - test_ecdsa_prime256v1_sha512_using_rsa_algorithm, - "ecdsa-prime256v1-sha512-using-rsa-algorithm.pem", - Err(UNSUPPORTED_SIGNATURE_ALGORITHM_FOR_RSA_KEY) - ); - // XXX: We should have a variant of this test with a SHA-256 digest that gives - // `Error::InvalidSignatureForPublicKey`. - test_verify_signed_data!( - test_ecdsa_prime256v1_sha512_wrong_signature_format, - "ecdsa-prime256v1-sha512-wrong-signature-format.pem", - Err(Error::UnsupportedSignatureAlgorithm) - ); - // Differs from Chromium because we don't support P-256 with SHA-512. - test_verify_signed_data!( - test_ecdsa_prime256v1_sha512, - "ecdsa-prime256v1-sha512.pem", - Err(Error::UnsupportedSignatureAlgorithm) - ); - test_verify_signed_data!( - test_ecdsa_secp384r1_sha256_corrupted_data, - "ecdsa-secp384r1-sha256-corrupted-data.pem", - Err(Error::InvalidSignatureForPublicKey) - ); - test_verify_signed_data!( - test_ecdsa_secp384r1_sha256, - "ecdsa-secp384r1-sha256.pem", - Ok(()) - ); - test_verify_signed_data!( - test_ecdsa_using_rsa_key, - "ecdsa-using-rsa-key.pem", - Err(Error::UnsupportedSignatureAlgorithmForPublicKey) - ); - - test_parse_spki_bad_outer!( - test_rsa_pkcs1_sha1_bad_key_der_length, - "rsa-pkcs1-sha1-bad-key-der-length.pem", - Error::BadDer - ); - test_parse_spki_bad_outer!( - test_rsa_pkcs1_sha1_bad_key_der_null, - "rsa-pkcs1-sha1-bad-key-der-null.pem", - Error::BadDer - ); - test_verify_signed_data!( - test_rsa_pkcs1_sha1_key_params_absent, - "rsa-pkcs1-sha1-key-params-absent.pem", - Err(Error::UnsupportedSignatureAlgorithm) - ); - test_verify_signed_data!( - test_rsa_pkcs1_sha1_using_pss_key_no_params, - "rsa-pkcs1-sha1-using-pss-key-no-params.pem", - Err(Error::UnsupportedSignatureAlgorithm) - ); - test_verify_signed_data!( - test_rsa_pkcs1_sha1_wrong_algorithm, - "rsa-pkcs1-sha1-wrong-algorithm.pem", - Err(INVALID_SIGNATURE_FOR_RSA_KEY) - ); - test_verify_signed_data!( - test_rsa_pkcs1_sha1, - "rsa-pkcs1-sha1.pem", - Err(Error::UnsupportedSignatureAlgorithm) - ); - // XXX: RSA PKCS#1 with SHA-1 is a supported algorithm, but we only accept - // 2048-8192 bit keys, and this test file is using a 1024 bit key. Thus, - // our results differ from Chromium's. TODO: this means we need a 2048+ bit - // version of this test. - test_verify_signed_data!( - test_rsa_pkcs1_sha256, - "rsa-pkcs1-sha256.pem", - Err(INVALID_SIGNATURE_FOR_RSA_KEY) - ); - test_parse_spki_bad_outer!( - test_rsa_pkcs1_sha256_key_encoded_ber, - "rsa-pkcs1-sha256-key-encoded-ber.pem", - Error::BadDer - ); - test_verify_signed_data!( - test_rsa_pkcs1_sha256_spki_non_null_params, - "rsa-pkcs1-sha256-spki-non-null-params.pem", - Err(UNSUPPORTED_SIGNATURE_ALGORITHM_FOR_RSA_KEY) - ); - test_verify_signed_data!( - test_rsa_pkcs1_sha256_using_ecdsa_algorithm, - "rsa-pkcs1-sha256-using-ecdsa-algorithm.pem", - Err(Error::UnsupportedSignatureAlgorithmForPublicKey) - ); - test_verify_signed_data!( - test_rsa_pkcs1_sha256_using_id_ea_rsa, - "rsa-pkcs1-sha256-using-id-ea-rsa.pem", - Err(UNSUPPORTED_SIGNATURE_ALGORITHM_FOR_RSA_KEY) - ); - - // Chromium's PSS test are for parameter combinations we don't support. - test_verify_signed_data!( - test_rsa_pss_sha1_salt20_using_pss_key_no_params, - "rsa-pss-sha1-salt20-using-pss-key-no-params.pem", - Err(Error::UnsupportedSignatureAlgorithm) - ); - test_verify_signed_data!( - test_rsa_pss_sha1_salt20_using_pss_key_with_null_params, - "rsa-pss-sha1-salt20-using-pss-key-with-null-params.pem", - Err(Error::UnsupportedSignatureAlgorithm) - ); - test_verify_signed_data!( - test_rsa_pss_sha1_salt20, - "rsa-pss-sha1-salt20.pem", - Err(Error::UnsupportedSignatureAlgorithm) - ); - test_verify_signed_data!( - test_rsa_pss_sha1_wrong_salt, - "rsa-pss-sha1-wrong-salt.pem", - Err(Error::UnsupportedSignatureAlgorithm) - ); - test_verify_signed_data!( - test_rsa_pss_sha256_mgf1_sha512_salt33, - "rsa-pss-sha256-mgf1-sha512-salt33.pem", - Err(Error::UnsupportedSignatureAlgorithm) - ); - test_verify_signed_data!( - test_rsa_pss_sha256_salt10_using_pss_key_with_params, - "rsa-pss-sha256-salt10-using-pss-key-with-params.pem", - Err(Error::UnsupportedSignatureAlgorithm) - ); - test_verify_signed_data!( - test_rsa_pss_sha256_salt10_using_pss_key_with_wrong_params, - "rsa-pss-sha256-salt10-using-pss-key-with-wrong-params.pem", - Err(Error::UnsupportedSignatureAlgorithm) - ); - test_verify_signed_data!( - test_rsa_pss_sha256_salt10, - "rsa-pss-sha256-salt10.pem", - Err(Error::UnsupportedSignatureAlgorithm) - ); - - // Our PSS tests that should work. - test_verify_signed_data!( - test_rsa_pss_sha256_salt32, - "ours/rsa-pss-sha256-salt32.pem", - OK_IF_RSA_AVAILABLE - ); - test_verify_signed_data!( - test_rsa_pss_sha384_salt48, - "ours/rsa-pss-sha384-salt48.pem", - OK_IF_RSA_AVAILABLE - ); - test_verify_signed_data!( - test_rsa_pss_sha512_salt64, - "ours/rsa-pss-sha512-salt64.pem", - OK_IF_RSA_AVAILABLE - ); - test_verify_signed_data!( - test_rsa_pss_sha256_salt32_corrupted_data, - "ours/rsa-pss-sha256-salt32-corrupted-data.pem", - Err(INVALID_SIGNATURE_FOR_RSA_KEY) - ); - test_verify_signed_data!( - test_rsa_pss_sha384_salt48_corrupted_data, - "ours/rsa-pss-sha384-salt48-corrupted-data.pem", - Err(INVALID_SIGNATURE_FOR_RSA_KEY) - ); - test_verify_signed_data!( - test_rsa_pss_sha512_salt64_corrupted_data, - "ours/rsa-pss-sha512-salt64-corrupted-data.pem", - Err(INVALID_SIGNATURE_FOR_RSA_KEY) - ); - - test_verify_signed_data!( - test_rsa_using_ec_key, - "rsa-using-ec-key.pem", - Err(UNSUPPORTED_SIGNATURE_ALGORITHM_FOR_RSA_KEY) - ); - test_verify_signed_data!( - test_rsa2048_pkcs1_sha512, - "rsa2048-pkcs1-sha512.pem", - OK_IF_RSA_AVAILABLE - ); - - struct TestSignedData { - spki: Vec, - data: Vec, - algorithm: Vec, - signature: Vec, - } - - fn parse_test_signed_data(file_contents: &[u8]) -> TestSignedData { - let mut lines = core::str::from_utf8(file_contents).unwrap().lines(); - let spki = read_pem_section(&mut lines, "PUBLIC KEY"); - let algorithm = read_pem_section(&mut lines, "ALGORITHM"); - let data = read_pem_section(&mut lines, "DATA"); - let signature = read_pem_section(&mut lines, "SIGNATURE"); - - TestSignedData { - spki, - data, - algorithm, - signature, - } - } - - use alloc::str::Lines; - - fn read_pem_section(lines: &mut Lines, section_name: &str) -> Vec { - // Skip comments and header - let begin_section = format!("-----BEGIN {}-----", section_name); - loop { - let line = lines.next().unwrap(); - if line == begin_section { - break; - } - } - - let mut base64 = String::new(); - - let end_section = format!("-----END {}-----", section_name); - loop { - let line = lines.next().unwrap(); - if line == end_section { - break; - } - base64.push_str(line); - } - - base64::decode(&base64).unwrap() - } - - static SUPPORTED_ALGORITHMS_IN_TESTS: &[&signed_data::SignatureAlgorithm] = &[ - // Reasonable algorithms. - &signed_data::ECDSA_P256_SHA256, - &signed_data::ECDSA_P384_SHA384, - &signed_data::ED25519, - #[cfg(feature = "alloc")] - &signed_data::RSA_PKCS1_2048_8192_SHA256, - #[cfg(feature = "alloc")] - &signed_data::RSA_PKCS1_2048_8192_SHA384, - #[cfg(feature = "alloc")] - &signed_data::RSA_PKCS1_2048_8192_SHA512, - #[cfg(feature = "alloc")] - &signed_data::RSA_PKCS1_3072_8192_SHA384, - #[cfg(feature = "alloc")] - &signed_data::RSA_PSS_2048_8192_SHA256_LEGACY_KEY, - #[cfg(feature = "alloc")] - &signed_data::RSA_PSS_2048_8192_SHA384_LEGACY_KEY, - #[cfg(feature = "alloc")] - &signed_data::RSA_PSS_2048_8192_SHA512_LEGACY_KEY, - // Algorithms deprecated because they are annoying (P-521) or because - // they are nonsensical combinations. - &signed_data::ECDSA_P256_SHA384, // Truncates digest. - &signed_data::ECDSA_P384_SHA256, // Digest is unnecessarily short. - ]; -} diff -Nru temporalio-1.3.0/vendor/webpki/src/time.rs temporalio-1.3.0/vendor/webpki/src/time.rs --- temporalio-1.3.0/vendor/webpki/src/time.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/webpki/src/time.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,65 +0,0 @@ -// Copyright 2015-2016 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR -// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -//! Conversions into the library's time type. - -/// The time type. -/// -/// Internally this is merely a UNIX timestamp: a count of non-leap -/// seconds since the start of 1970. This type exists to assist -/// unit-of-measure correctness. -#[derive(Debug, Clone, Copy, PartialEq, PartialOrd)] -pub struct Time(u64); - -impl Time { - /// Create a `webpki::Time` from a unix timestamp. - /// - /// It is usually better to use the less error-prone - /// `webpki::Time::try_from(time: std::time::SystemTime)` instead when - /// `std::time::SystemTime` is available (when `#![no_std]` isn't being - /// used). - #[allow(clippy::must_use_candidate)] - pub fn from_seconds_since_unix_epoch(secs: u64) -> Self { - Self(secs) - } -} - -#[cfg(feature = "std")] -impl core::convert::TryFrom for Time { - type Error = std::time::SystemTimeError; - - /// Create a `webpki::Time` from a `std::time::SystemTime`. - /// - /// # Example: - /// - /// Construct a `webpki::Time` from the current system time: - /// - /// ``` - /// # extern crate ring; - /// # extern crate webpki; - /// # - /// #![cfg(feature = "std")] - /// use std::{convert::TryFrom, time::{SystemTime, SystemTimeError}}; - /// - /// # fn foo() -> Result<(), SystemTimeError> { - /// let time = webpki::Time::try_from(SystemTime::now())?; - /// # Ok(()) - /// # } - /// ``` - fn try_from(value: std::time::SystemTime) -> Result { - value - .duration_since(std::time::UNIX_EPOCH) - .map(|d| Self::from_seconds_since_unix_epoch(d.as_secs())) - } -} diff -Nru temporalio-1.3.0/vendor/webpki/src/trust_anchor.rs temporalio-1.3.0/vendor/webpki/src/trust_anchor.rs --- temporalio-1.3.0/vendor/webpki/src/trust_anchor.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/webpki/src/trust_anchor.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,119 +0,0 @@ -use crate::cert::{certificate_serial_number, Cert}; -use crate::{ - cert::{parse_cert_internal, EndEntityOrCa}, - der, Error, -}; - -/// A trust anchor (a.k.a. root CA). -/// -/// Traditionally, certificate verification libraries have represented trust -/// anchors as full X.509 root certificates. However, those certificates -/// contain a lot more data than is needed for verifying certificates. The -/// `TrustAnchor` representation allows an application to store just the -/// essential elements of trust anchors. The `webpki::trust_anchor_util` module -/// provides functions for converting X.509 certificates to to the minimized -/// `TrustAnchor` representation, either at runtime or in a build script. -#[derive(Debug)] -pub struct TrustAnchor<'a> { - /// The value of the `subject` field of the trust anchor. - pub subject: &'a [u8], - - /// The value of the `subjectPublicKeyInfo` field of the trust anchor. - pub spki: &'a [u8], - - /// The value of a DER-encoded NameConstraints, containing name - /// constraints to apply to the trust anchor, if any. - pub name_constraints: Option<&'a [u8]>, -} - -/// Trust anchors which may be used for authenticating servers. -#[derive(Debug)] -pub struct TlsServerTrustAnchors<'a>(pub &'a [TrustAnchor<'a>]); - -/// Trust anchors which may be used for authenticating clients. -#[derive(Debug)] -pub struct TlsClientTrustAnchors<'a>(pub &'a [TrustAnchor<'a>]); - -impl<'a> TrustAnchor<'a> { - /// Interprets the given DER-encoded certificate as a `TrustAnchor`. The - /// certificate is not validated. In particular, there is no check that the - /// certificate is self-signed or even that the certificate has the cA basic - /// constraint. - pub fn try_from_cert_der(cert_der: &'a [u8]) -> Result { - let cert_der = untrusted::Input::from(cert_der); - - // XXX: `EndEntityOrCA::EndEntity` is used instead of `EndEntityOrCA::CA` - // because we don't have a reference to a child cert, which is needed for - // `EndEntityOrCA::CA`. For this purpose, it doesn't matter. - // - // v1 certificates will result in `Error::BadDER` because `parse_cert` will - // expect a version field that isn't there. In that case, try to parse the - // certificate using a special parser for v1 certificates. Notably, that - // parser doesn't allow extensions, so there's no need to worry about - // embedded name constraints in a v1 certificate. - match parse_cert_internal( - cert_der, - EndEntityOrCa::EndEntity, - possibly_invalid_certificate_serial_number, - ) { - Ok(cert) => Ok(Self::from(cert)), - Err(Error::UnsupportedCertVersion) => parse_cert_v1(cert_der).or(Err(Error::BadDer)), - Err(err) => Err(err), - } - } -} - -fn possibly_invalid_certificate_serial_number(input: &mut untrusted::Reader) -> Result<(), Error> { - // https://tools.ietf.org/html/rfc5280#section-4.1.2.2: - // * Conforming CAs MUST NOT use serialNumber values longer than 20 octets." - // * "The serial number MUST be a positive integer [...]" - // - // However, we don't enforce these constraints on trust anchors, as there - // are widely-deployed trust anchors that violate these constraints. - skip(input, der::Tag::Integer) -} - -impl<'a> From> for TrustAnchor<'a> { - fn from(cert: Cert<'a>) -> Self { - Self { - subject: cert.subject.as_slice_less_safe(), - spki: cert.spki.value().as_slice_less_safe(), - name_constraints: cert.name_constraints.map(|nc| nc.as_slice_less_safe()), - } - } -} - -/// Parses a v1 certificate directly into a TrustAnchor. -fn parse_cert_v1(cert_der: untrusted::Input) -> Result { - // X.509 Certificate: https://tools.ietf.org/html/rfc5280#section-4.1. - cert_der.read_all(Error::BadDer, |cert_der| { - der::nested(cert_der, der::Tag::Sequence, Error::BadDer, |cert_der| { - let anchor = der::nested(cert_der, der::Tag::Sequence, Error::BadDer, |tbs| { - // The version number field does not appear in v1 certificates. - certificate_serial_number(tbs)?; - - skip(tbs, der::Tag::Sequence)?; // signature. - skip(tbs, der::Tag::Sequence)?; // issuer. - skip(tbs, der::Tag::Sequence)?; // validity. - let subject = der::expect_tag_and_get_value(tbs, der::Tag::Sequence)?; - let spki = der::expect_tag_and_get_value(tbs, der::Tag::Sequence)?; - - Ok(TrustAnchor { - subject: subject.as_slice_less_safe(), - spki: spki.as_slice_less_safe(), - name_constraints: None, - }) - }); - - // read and discard signatureAlgorithm + signature - skip(cert_der, der::Tag::Sequence)?; - skip(cert_der, der::Tag::BitString)?; - - anchor - }) - }) -} - -fn skip(input: &mut untrusted::Reader, tag: der::Tag) -> Result<(), Error> { - der::expect_tag_and_get_value(input, tag).map(|_| ()) -} diff -Nru temporalio-1.3.0/vendor/webpki/src/verify_cert.rs temporalio-1.3.0/vendor/webpki/src/verify_cert.rs --- temporalio-1.3.0/vendor/webpki/src/verify_cert.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/webpki/src/verify_cert.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,410 +0,0 @@ -// Copyright 2015 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR -// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -use core::default::Default; - -use crate::{ - budget::Budget, - cert::{self, Cert, EndEntityOrCa}, - der, equal, - error::ErrorExt, - name, signed_data, time, Error, SignatureAlgorithm, TrustAnchor, -}; - -pub fn build_chain( - required_eku_if_present: KeyPurposeId, - supported_sig_algs: &[&SignatureAlgorithm], - trust_anchors: &[TrustAnchor], - intermediate_certs: &[&[u8]], - cert: &Cert, - time: time::Time, -) -> Result<(), ErrorExt> { - build_chain_inner( - required_eku_if_present, - supported_sig_algs, - trust_anchors, - intermediate_certs, - cert, - time, - 0, - &mut Budget::default(), - ) -} - -#[allow(clippy::too_many_arguments)] -fn build_chain_inner( - required_eku_if_present: KeyPurposeId, - supported_sig_algs: &[&SignatureAlgorithm], - trust_anchors: &[TrustAnchor], - intermediate_certs: &[&[u8]], - cert: &Cert, - time: time::Time, - sub_ca_count: usize, - budget: &mut Budget, -) -> Result<(), ErrorExt> { - let used_as_ca = used_as_ca(&cert.ee_or_ca); - - check_issuer_independent_properties( - cert, - time, - used_as_ca, - sub_ca_count, - required_eku_if_present, - )?; - - // TODO: HPKP checks. - - match used_as_ca { - UsedAsCa::Yes => { - const MAX_SUB_CA_COUNT: usize = 6; - - if sub_ca_count >= MAX_SUB_CA_COUNT { - return Err(Error::UnknownIssuer.into()); - } - } - UsedAsCa::No => { - assert_eq!(0, sub_ca_count); - } - } - - // TODO: revocation. - - match loop_while_non_fatal_error(trust_anchors, |trust_anchor: &TrustAnchor| { - let trust_anchor_subject = untrusted::Input::from(trust_anchor.subject); - if !equal(cert.issuer, trust_anchor_subject) { - return Err(Error::UnknownIssuer.into()); - } - - let trust_anchor_spki = untrusted::Input::from(trust_anchor.spki); - - // TODO: check_distrust(trust_anchor_subject, trust_anchor_spki)?; - - check_signatures(supported_sig_algs, cert, trust_anchor_spki, budget)?; - - check_signed_chain_name_constraints(cert, trust_anchor)?; - - Ok(()) - }) { - Ok(()) => { - return Ok(()); - } - Err(e) => { - if e.is_fatal() { - return Err(e); - } - // If the error is not fatal, then keep going. - } - } - - loop_while_non_fatal_error(intermediate_certs, |cert_der| { - let potential_issuer = - cert::parse_cert(untrusted::Input::from(cert_der), EndEntityOrCa::Ca(cert))?; - - if !equal(potential_issuer.subject, cert.issuer) { - return Err(Error::UnknownIssuer.into()); - } - - // Prevent loops; see RFC 4158 section 5.2. - let mut prev = cert; - loop { - if equal(potential_issuer.spki.value(), prev.spki.value()) - && equal(potential_issuer.subject, prev.subject) - { - return Err(Error::UnknownIssuer.into()); - } - match &prev.ee_or_ca { - EndEntityOrCa::EndEntity => { - break; - } - EndEntityOrCa::Ca(child_cert) => { - prev = child_cert; - } - } - } - - let next_sub_ca_count = match used_as_ca { - UsedAsCa::No => sub_ca_count, - UsedAsCa::Yes => sub_ca_count + 1, - }; - - budget.consume_build_chain_call()?; - build_chain_inner( - required_eku_if_present, - supported_sig_algs, - trust_anchors, - intermediate_certs, - &potential_issuer, - time, - next_sub_ca_count, - budget, - ) - }) -} - -fn check_signatures( - supported_sig_algs: &[&SignatureAlgorithm], - cert_chain: &Cert, - trust_anchor_key: untrusted::Input, - budget: &mut Budget, -) -> Result<(), ErrorExt> { - let mut spki_value = trust_anchor_key; - let mut cert = cert_chain; - loop { - budget.consume_signature()?; - signed_data::verify_signed_data(supported_sig_algs, spki_value, &cert.signed_data)?; - - // TODO: check revocation - - match &cert.ee_or_ca { - EndEntityOrCa::Ca(child_cert) => { - spki_value = cert.spki.value(); - cert = child_cert; - } - EndEntityOrCa::EndEntity => { - break; - } - } - } - - Ok(()) -} - -fn check_signed_chain_name_constraints( - cert_chain: &Cert, - trust_anchor: &TrustAnchor, -) -> Result<(), Error> { - let mut cert = cert_chain; - let mut name_constraints = trust_anchor.name_constraints.map(untrusted::Input::from); - - loop { - untrusted::read_all_optional(name_constraints, Error::BadDer, |value| { - name::check_name_constraints(value, cert) - })?; - - match &cert.ee_or_ca { - EndEntityOrCa::Ca(child_cert) => { - name_constraints = cert.name_constraints; - cert = child_cert; - } - EndEntityOrCa::EndEntity => { - break; - } - } - } - - Ok(()) -} - -fn check_issuer_independent_properties( - cert: &Cert, - time: time::Time, - used_as_ca: UsedAsCa, - sub_ca_count: usize, - required_eku_if_present: KeyPurposeId, -) -> Result<(), Error> { - // TODO: check_distrust(trust_anchor_subject, trust_anchor_spki)?; - // TODO: Check signature algorithm like mozilla::pkix. - // TODO: Check SPKI like mozilla::pkix. - // TODO: check for active distrust like mozilla::pkix. - - // See the comment in `remember_extension` for why we don't check the - // KeyUsage extension. - - cert.validity - .read_all(Error::BadDer, |value| check_validity(value, time))?; - untrusted::read_all_optional(cert.basic_constraints, Error::BadDer, |value| { - check_basic_constraints(value, used_as_ca, sub_ca_count) - })?; - untrusted::read_all_optional(cert.eku, Error::BadDer, |value| { - check_eku(value, required_eku_if_present) - })?; - - Ok(()) -} - -// https://tools.ietf.org/html/rfc5280#section-4.1.2.5 -fn check_validity(input: &mut untrusted::Reader, time: time::Time) -> Result<(), Error> { - let not_before = der::time_choice(input)?; - let not_after = der::time_choice(input)?; - - if not_before > not_after { - return Err(Error::InvalidCertValidity); - } - if time < not_before { - return Err(Error::CertNotValidYet); - } - if time > not_after { - return Err(Error::CertExpired); - } - - // TODO: mozilla::pkix allows the TrustDomain to check not_before and - // not_after, to enforce things like a maximum validity period. We should - // do something similar. - - Ok(()) -} - -#[derive(Clone, Copy)] -enum UsedAsCa { - Yes, - No, -} - -fn used_as_ca(ee_or_ca: &EndEntityOrCa) -> UsedAsCa { - match ee_or_ca { - EndEntityOrCa::EndEntity => UsedAsCa::No, - EndEntityOrCa::Ca(..) => UsedAsCa::Yes, - } -} - -// https://tools.ietf.org/html/rfc5280#section-4.2.1.9 -fn check_basic_constraints( - input: Option<&mut untrusted::Reader>, - used_as_ca: UsedAsCa, - sub_ca_count: usize, -) -> Result<(), Error> { - let (is_ca, path_len_constraint) = match input { - Some(input) => { - let is_ca = der::optional_boolean(input)?; - - // https://bugzilla.mozilla.org/show_bug.cgi?id=985025: RFC 5280 - // says that a certificate must not have pathLenConstraint unless - // it is a CA certificate, but some real-world end-entity - // certificates have pathLenConstraint. - let path_len_constraint = if !input.at_end() { - let value = der::small_nonnegative_integer(input)?; - Some(usize::from(value)) - } else { - None - }; - - (is_ca, path_len_constraint) - } - None => (false, None), - }; - - match (used_as_ca, is_ca, path_len_constraint) { - (UsedAsCa::No, true, _) => Err(Error::CaUsedAsEndEntity), - (UsedAsCa::Yes, false, _) => Err(Error::EndEntityUsedAsCa), - (UsedAsCa::Yes, true, Some(len)) if sub_ca_count > len => { - Err(Error::PathLenConstraintViolated) - } - _ => Ok(()), - } -} - -#[derive(Clone, Copy)] -pub struct KeyPurposeId { - oid_value: untrusted::Input<'static>, -} - -// id-pkix OBJECT IDENTIFIER ::= { 1 3 6 1 5 5 7 } -// id-kp OBJECT IDENTIFIER ::= { id-pkix 3 } - -// id-kp-serverAuth OBJECT IDENTIFIER ::= { id-kp 1 } -#[allow(clippy::identity_op)] // TODO: Make this clearer -pub static EKU_SERVER_AUTH: KeyPurposeId = KeyPurposeId { - oid_value: untrusted::Input::from(&[(40 * 1) + 3, 6, 1, 5, 5, 7, 3, 1]), -}; - -// id-kp-clientAuth OBJECT IDENTIFIER ::= { id-kp 2 } -#[allow(clippy::identity_op)] // TODO: Make this clearer -pub static EKU_CLIENT_AUTH: KeyPurposeId = KeyPurposeId { - oid_value: untrusted::Input::from(&[(40 * 1) + 3, 6, 1, 5, 5, 7, 3, 2]), -}; - -// id-kp-OCSPSigning OBJECT IDENTIFIER ::= { id-kp 9 } -#[allow(clippy::identity_op)] // TODO: Make this clearer -pub static EKU_OCSP_SIGNING: KeyPurposeId = KeyPurposeId { - oid_value: untrusted::Input::from(&[(40 * 1) + 3, 6, 1, 5, 5, 7, 3, 9]), -}; - -// https://tools.ietf.org/html/rfc5280#section-4.2.1.12 -// -// Notable Differences from RFC 5280: -// -// * We follow the convention established by Microsoft's implementation and -// mozilla::pkix of treating the EKU extension in a CA certificate as a -// restriction on the allowable EKUs for certificates issued by that CA. RFC -// 5280 doesn't prescribe any meaning to the EKU extension when a certificate -// is being used as a CA certificate. -// -// * We do not recognize anyExtendedKeyUsage. NSS and mozilla::pkix do not -// recognize it either. -// -// * We treat id-Netscape-stepUp as being equivalent to id-kp-serverAuth in CA -// certificates (only). Comodo has issued certificates that require this -// behavior that don't expire until June 2020. See https://bugzilla.mozilla.org/show_bug.cgi?id=982292. -fn check_eku( - input: Option<&mut untrusted::Reader>, - required_eku_if_present: KeyPurposeId, -) -> Result<(), Error> { - match input { - Some(input) => { - loop { - let value = der::expect_tag_and_get_value(input, der::Tag::OID)?; - if equal(value, required_eku_if_present.oid_value) { - input.skip_to_end(); - break; - } - if input.at_end() { - return Err(Error::RequiredEkuNotFound); - } - } - Ok(()) - } - None => { - // http://tools.ietf.org/html/rfc6960#section-4.2.2.2: - // "OCSP signing delegation SHALL be designated by the inclusion of - // id-kp-OCSPSigning in an extended key usage certificate extension - // included in the OCSP response signer's certificate." - // - // A missing EKU extension generally means "any EKU", but it is - // important that id-kp-OCSPSigning is explicit so that a normal - // end-entity certificate isn't able to sign trusted OCSP responses - // for itself or for other certificates issued by its issuing CA. - if equal( - required_eku_if_present.oid_value, - EKU_OCSP_SIGNING.oid_value, - ) { - return Err(Error::RequiredEkuNotFound); - } - - Ok(()) - } - } -} - -fn loop_while_non_fatal_error( - values: V, - mut f: impl FnMut(V::Item) -> Result<(), ErrorExt>, -) -> Result<(), ErrorExt> -where - V: IntoIterator, -{ - for v in values { - match f(v) { - Ok(()) => { - return Ok(()); - } - Err(e) => { - if e.is_fatal() { - return Err(e); - } - // If the error is not fatal, then keep going. - } - } - } - Err(Error::UnknownIssuer.into()) -} diff -Nru temporalio-1.3.0/vendor/webpki/tests/dns_name_tests.rs temporalio-1.3.0/vendor/webpki/tests/dns_name_tests.rs --- temporalio-1.3.0/vendor/webpki/tests/dns_name_tests.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/webpki/tests/dns_name_tests.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,408 +0,0 @@ -// Copyright 2014-2017 Brian Smith. - -// (name, is_valid) -static DNS_NAME_VALIDITY: &[(&[u8], bool)] = &[ - (b"a", true), - (b"a.b", true), - (b"a.b.c", true), - (b"a.b.c.d", true), - - // Hyphens, one component. - (b"-", false), - (b"-a", false), - (b"a-", false), - (b"a-b", true), - - // Hyphens, last component. - (b"a.-", false), - (b"a.-a", false), - (b"a.a-", false), - (b"a.a-b", true), - - // Hyphens, not last component. - (b"-.a", false), - (b"-a.a", false), - (b"a-.a", false), - (b"a-b.a", true), - - // Underscores, one component. - (b"_", true), // TODO: Perhaps this should be rejected for '_' being sole character?. - (b"_a", true), // TODO: Perhaps this should be rejected for '_' being 1st? - (b"a_", true), - (b"a_b", true), - - // Underscores, last component. - (b"a._", true), // TODO: Perhaps this should be rejected for '_' being sole character?. - (b"a._a", true), // TODO: Perhaps this should be rejected for '_' being 1st? - (b"a.a_", true), - (b"a.a_b", true), - - // Underscores, not last component. - (b"_.a", true), // TODO: Perhaps this should be rejected for '_' being sole character?. - (b"_a.a", true), - (b"a_.a", true), - (b"a_b.a", true), - - // empty labels - (b"", false), - (b".", false), - (b"a", true), - (b".a", false), - (b".a.b", false), - (b"..a", false), - (b"a..b", false), - (b"a...b", false), - (b"a..b.c", false), - (b"a.b..c", false), - (b".a.b.c.", false), - - // absolute names - (b"a.", true), - (b"a.b.", true), - (b"a.b.c.", true), - - // absolute names with empty label at end - (b"a..", false), - (b"a.b..", false), - (b"a.b.c..", false), - (b"a...", false), - - // Punycode - (b"xn--", false), - (b"xn--.", false), - (b"xn--.a", false), - (b"a.xn--", false), - (b"a.xn--.", false), - (b"a.xn--.b", false), - (b"a.xn--.b", false), - (b"a.xn--\0.b", false), - (b"a.xn--a.b", true), - (b"xn--a", true), - (b"a.xn--a", true), - (b"a.xn--a.a", true), - (b"\xc4\x95.com", false), // UTF-8 Ä• - (b"xn--jea.com", true), // punycode Ä• - (b"xn--\xc4\x95.com", false), // UTF-8 Ä•, malformed punycode + UTF-8 mashup - - // Surprising punycode - (b"xn--google.com", true), // 䕮䕵䕶䕱.com - (b"xn--citibank.com", true), // å²å²Šå²Šå²…岉岎.com - (b"xn--cnn.com", true), // ä¾.com - (b"a.xn--cnn", true), // a.ä¾ - (b"a.xn--cnn.com", true), // a.ä¾.com - - (b"1.2.3.4", false), // IPv4 address - (b"1::2", false), // IPV6 address - - // whitespace not allowed anywhere. - (b" ", false), - (b" a", false), - (b"a ", false), - (b"a b", false), - (b"a.b 1", false), - (b"a\t", false), - - // Nulls not allowed - (b"\0", false), - (b"a\0", false), - (b"example.org\0.example.com", false), // Hi Moxie! - (b"\0a", false), - (b"xn--\0", false), - - // Allowed character set - (b"a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z", true), - (b"A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z", true), - (b"0.1.2.3.4.5.6.7.8.9.a", true), // "a" needed to avoid numeric last label - (b"a-b", true), // hyphen (a label cannot start or end with a hyphen) - - // An invalid character in various positions - (b"!", false), - (b"!a", false), - (b"a!", false), - (b"a!b", false), - (b"a.!", false), - (b"a.a!", false), - (b"a.!a", false), - (b"a.a!a", false), - (b"a.!a.a", false), - (b"a.a!.a", false), - (b"a.a!a.a", false), - - // Various other invalid characters - (b"a!", false), - (b"a@", false), - (b"a#", false), - (b"a$", false), - (b"a%", false), - (b"a^", false), - (b"a&", false), - (b"a*", false), - (b"a(", false), - (b"a)", false), - - // last label can't be fully numeric - (b"1", false), - (b"a.1", false), - - // other labels can be fully numeric - (b"1.a", true), - (b"1.2.a", true), - (b"1.2.3.a", true), - - // last label can be *partly* numeric - (b"1a", true), - (b"1.1a", true), - (b"1-1", true), - (b"a.1-1", true), - (b"a.1-a", true), - - // labels cannot start with a hyphen - (b"-", false), - (b"-1", false), - - // labels cannot end with a hyphen - (b"1-", false), - (b"1-.a", false), - (b"a-", false), - (b"a-.a", false), - (b"a.1-.a", false), - (b"a.a-.a", false), - - // labels can contain a hyphen in the middle - (b"a-b", true), - (b"1-2", true), - (b"a.a-1", true), - - // multiple consecutive hyphens allowed - (b"a--1", true), - (b"1---a", true), - (b"a-----------------b", true), - - // Wildcard specifications are not valid reference names. - (b"*.a", false), - (b"a*", false), - (b"a*.", false), - (b"a*.a", false), - (b"a*.a.", false), - (b"*.a.b", false), - (b"*.a.b.", false), - (b"a*.b.c", false), - (b"*.a.b.c", false), - (b"a*.b.c.d", false), - - // Multiple wildcards. - (b"a**.b.c", false), - (b"a*b*.c.d", false), - (b"a*.b*.c", false), - - // Wildcards not in the first label. - (b"a.*", false), - (b"a.*.b", false), - (b"a.b.*", false), - (b"a.b*.c", false), - (b"*.b*.c", false), - (b".*.a.b", false), - (b".a*.b.c", false), - - // Wildcards not at the end of the first label. - (b"*a.b.c", false), - (b"a*b.c.d", false), - - // Wildcards and IDNA prefix. - (b"x*.a.b", false), - (b"xn*.a.b", false), - (b"xn-*.a.b", false), - (b"xn--*.a.b", false), - (b"xn--w*.a.b", false), - - // Redacted labels from RFC6962bis draft 4 - // https://tools.ietf.org/html/draft-ietf-trans-rfc6962-bis-04#section-3.2.2 - (b"(PRIVATE).foo", false), - - // maximum label length is 63 characters - (b"123456789012345678901234567890123456789012345678901234567890abc", true), - (b"123456789012345678901234567890123456789012345678901234567890abcd", false), - - // maximum total length is 253 characters - (b"12345678901234567890123456789012345678901234567890.12345678901234567890123456789012345678901234567890.12345678901234567890123456789012345678901234567890.12345678901234567890123456789012345678901234567890.123456789012345678901234567890123456789012345678a", - true), - (b"12345678901234567890123456789012345678901234567890.12345678901234567890123456789012345678901234567890.12345678901234567890123456789012345678901234567890.12345678901234567890123456789012345678901234567890.1234567890123456789012345678901234567890123456789a", - false), -]; - -// (IP address, is valid DNS name). The comments here refer to the validity of -// the string as an IP address, not as a DNS name validity. -static IP_ADDRESS_DNS_VALIDITY: &[(&[u8], bool)] = &[ - (b"", false), - (b"1", false), - (b"1.2", false), - (b"1.2.3", false), - (b"1.2.3.4", false), - (b"1.2.3.4.5", false), - (b"1.2.3.4a", true), // a DNS name! - (b"a.2.3.4", false), // not even a DNS name! - (b"1::2", false), // IPv6 address - // Whitespace not allowed - (b" 1.2.3.4", false), - (b"1.2.3.4 ", false), - (b"1 .2.3.4", false), - (b"\n1.2.3.4", false), - (b"1.2.3.4\n", false), - // Nulls not allowed - (b"\0", false), - (b"\x001.2.3.4", false), - (b"1.2.3.4\0", false), - (b"1.2.3.4\0.5", false), - // Range - (b"0.0.0.0", false), - (b"255.255.255.255", false), - (b"256.0.0.0", false), - (b"0.256.0.0", false), - (b"0.0.256.0", false), - (b"0.0.0.256", false), - (b"999.0.0.0", false), - (b"9999999999999999999.0.0.0", false), - // All digits allowed - (b"0.1.2.3", false), - (b"4.5.6.7", false), - (b"8.9.0.1", false), - // Leading zeros not allowed - (b"01.2.3.4", false), - (b"001.2.3.4", false), - (b"00000000001.2.3.4", false), - (b"010.2.3.4", false), - (b"1.02.3.4", false), - (b"1.2.03.4", false), - (b"1.2.3.04", false), - // Empty components - (b".2.3.4", false), - (b"1..3.4", false), - (b"1.2..4", false), - (b"1.2.3.", false), - // Too many components - (b"1.2.3.4.5", false), - (b"1.2.3.4.5.6", false), - (b"0.1.2.3.4", false), - (b"1.2.3.4.0", false), - // Leading/trailing dot - (b".1.2.3.4", false), - (b"1.2.3.4.", false), - // Other common forms of IPv4 address - // http://en.wikipedia.org/wiki/IPv4#Address_representations - (b"192.0.2.235", false), // dotted decimal (control value) - (b"0xC0.0x00.0x02.0xEB", true), // dotted hex - actually a DNS name! - (b"0301.0000.0002.0353", false), // dotted octal - (b"0xC00002EB", true), // non-dotted hex, actually a DNS name! - (b"3221226219", false), // non-dotted decimal - (b"030000001353", false), // non-dotted octal - (b"192.0.0002.0xEB", true), // mixed, actually a DNS name! - (b"1234", false), - (b"1234:5678", false), - (b"1234:5678:9abc", false), - (b"1234:5678:9abc:def0", false), - (b"1234:5678:9abc:def0:1234:", false), - (b"1234:5678:9abc:def0:1234:5678:", false), - (b"1234:5678:9abc:def0:1234:5678:9abc:", false), - (b"1234:5678:9abc:def0:1234:5678:9abc:def0", false), - (b"1234:5678:9abc:def0:1234:5678:9abc:def0:", false), - (b":1234:5678:9abc:def0:1234:5678:9abc:def0", false), - (b"1234:5678:9abc:def0:1234:5678:9abc:def0:0000", false), - // Valid contractions - (b"::1", false), - (b"::1234", false), - (b"1234::", false), - (b"1234::5678", false), - (b"1234:5678::abcd", false), - (b"1234:5678:9abc:def0:1234:5678:9abc::", false), - // Contraction in full IPv6 addresses not allowed - (b"::1234:5678:9abc:def0:1234:5678:9abc:def0", false), // start - (b"1234:5678:9abc:def0:1234:5678:9abc:def0::", false), // end - (b"1234:5678::9abc:def0:1234:5678:9abc:def0", false), // interior - // Multiple contractions not allowed - (b"::1::", false), - (b"::1::2", false), - (b"1::2::", false), - // Colon madness! - (b":", false), - (b"::", false), - (b":::", false), - (b"::::", false), - (b":::1", false), - (b"::::1", false), - (b"1:::2", false), - (b"1::::2", false), - (b"1:2:::", false), - (b"1:2::::", false), - (b"::1234:", false), - (b":1234::", false), - (b"01234::", false), // too many digits, even if zero - (b"12345678::", false), // too many digits or missing colon - // uppercase - (b"ABCD:EFAB::", false), - // miXeD CAse - (b"aBcd:eFAb::", false), - // IPv4-style - (b"::2.3.4.5", false), - (b"1234::2.3.4.5", false), - (b"::abcd:2.3.4.5", false), - (b"1234:5678:9abc:def0:1234:5678:252.253.254.255", false), - (b"1234:5678:9abc:def0:1234::252.253.254.255", false), - (b"1234::252.253.254", false), - (b"::252.253.254", false), - (b"::252.253.254.300", false), - (b"1234::252.253.254.255:", false), - (b"1234::252.253.254.255:5678", false), - // Contractions that don't contract - (b"::1234:5678:9abc:def0:1234:5678:9abc:def0", false), - (b"1234:5678:9abc:def0:1234:5678:9abc:def0::", false), - (b"1234:5678:9abc:def0::1234:5678:9abc:def0", false), - (b"1234:5678:9abc:def0:1234:5678::252.253.254.255", false), - // With and without leading zeros - (b"::123", false), - (b"::0123", false), - (b"::012", false), - (b"::0012", false), - (b"::01", false), - (b"::001", false), - (b"::0001", false), - (b"::0", false), - (b"::00", false), - (b"::000", false), - (b"::0000", false), - (b"::01234", false), - (b"::00123", false), - (b"::000123", false), - // Trailing zero - (b"::12340", false), - // Whitespace - (b" 1234:5678:9abc:def0:1234:5678:9abc:def0", false), - (b"\t1234:5678:9abc:def0:1234:5678:9abc:def0", false), - (b"\t1234:5678:9abc:def0:1234:5678:9abc:def0\n", false), - (b"1234 :5678:9abc:def0:1234:5678:9abc:def0", false), - (b"1234: 5678:9abc:def0:1234:5678:9abc:def0", false), - (b":: 2.3.4.5", false), - (b"1234::252.253.254.255 ", false), - (b"1234::252.253.254.255\n", false), - (b"1234::252.253. 254.255", false), - // Nulls - (b"\0", false), - (b"::1\0:2", false), - (b"::1\0", false), - (b"::1.2.3.4\0", false), - (b"::1.2\x002.3.4", false), -]; - -#[test] -fn dns_name_ref_try_from_ascii_test() { - for &(s, is_valid) in DNS_NAME_VALIDITY - .iter() - .chain(IP_ADDRESS_DNS_VALIDITY.iter()) - { - assert_eq!( - webpki::DnsNameRef::try_from_ascii(s).is_ok(), - is_valid, - "DnsNameRef::try_from_ascii_str failed for \"{:?}\"", - s - ); - } -} Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/webpki/tests/ed25519/ca.der and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/webpki/tests/ed25519/ca.der differ Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/webpki/tests/ed25519/ee.der and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/webpki/tests/ed25519/ee.der differ diff -Nru temporalio-1.3.0/vendor/webpki/tests/integration.rs temporalio-1.3.0/vendor/webpki/tests/integration.rs --- temporalio-1.3.0/vendor/webpki/tests/integration.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/webpki/tests/integration.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,91 +0,0 @@ -// Copyright 2016 Joseph Birr-Pixton. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR -// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -use core::convert::TryFrom; -extern crate webpki; - -static ALL_SIGALGS: &[&webpki::SignatureAlgorithm] = &[ - &webpki::ECDSA_P256_SHA256, - &webpki::ECDSA_P256_SHA384, - &webpki::ECDSA_P384_SHA256, - &webpki::ECDSA_P384_SHA384, - &webpki::ED25519, - #[cfg(feature = "alloc")] - &webpki::RSA_PKCS1_2048_8192_SHA256, - #[cfg(feature = "alloc")] - &webpki::RSA_PKCS1_2048_8192_SHA384, - #[cfg(feature = "alloc")] - &webpki::RSA_PKCS1_2048_8192_SHA512, - #[cfg(feature = "alloc")] - &webpki::RSA_PKCS1_3072_8192_SHA384, -]; - -/* Checks we can verify netflix's cert chain. This is notable - * because they're rooted at a Verisign v1 root. */ -#[cfg(feature = "alloc")] -#[test] -pub fn netflix() { - let ee: &[u8] = include_bytes!("netflix/ee.der"); - let inter = include_bytes!("netflix/inter.der"); - let ca = include_bytes!("netflix/ca.der"); - - let anchors = vec![webpki::TrustAnchor::try_from_cert_der(ca).unwrap()]; - let anchors = webpki::TlsServerTrustAnchors(&anchors); - - #[allow(clippy::unreadable_literal)] // TODO: Make this clear. - let time = webpki::Time::from_seconds_since_unix_epoch(1492441716); - - let cert = webpki::EndEntityCert::try_from(ee).unwrap(); - assert_eq!( - Ok(()), - cert.verify_is_valid_tls_server_cert(ALL_SIGALGS, &anchors, &[inter], time) - ); -} - -#[test] -pub fn ed25519() { - let ee: &[u8] = include_bytes!("ed25519/ee.der"); - let ca = include_bytes!("ed25519/ca.der"); - - let anchors = vec![webpki::TrustAnchor::try_from_cert_der(ca).unwrap()]; - let anchors = webpki::TlsServerTrustAnchors(&anchors); - - #[allow(clippy::unreadable_literal)] // TODO: Make this clear. - let time = webpki::Time::from_seconds_since_unix_epoch(1547363522); - - let cert = webpki::EndEntityCert::try_from(ee).unwrap(); - assert_eq!( - Ok(()), - cert.verify_is_valid_tls_server_cert(ALL_SIGALGS, &anchors, &[], time) - ); -} - -#[test] -fn read_root_with_zero_serial() { - let ca = include_bytes!("misc/serial_zero.der"); - let _ = - webpki::TrustAnchor::try_from_cert_der(ca).expect("godaddy cert should parse as anchor"); -} - -#[test] -fn read_root_with_neg_serial() { - let ca = include_bytes!("misc/serial_neg.der"); - let _ = webpki::TrustAnchor::try_from_cert_der(ca).expect("idcat cert should parse as anchor"); -} - -#[cfg(feature = "std")] -#[test] -fn time_constructor() { - let _ = webpki::Time::try_from(std::time::SystemTime::now()).unwrap(); -} Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/webpki/tests/misc/serial_neg.der and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/webpki/tests/misc/serial_neg.der differ Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/webpki/tests/misc/serial_zero.der and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/webpki/tests/misc/serial_zero.der differ Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/webpki/tests/netflix/ca.der and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/webpki/tests/netflix/ca.der differ Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/webpki/tests/netflix/ee.der and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/webpki/tests/netflix/ee.der differ Binary files /tmp/tmp66ddg7xu/WvmZhUXfO6/temporalio-1.3.0/vendor/webpki/tests/netflix/inter.der and /tmp/tmp66ddg7xu/4oRoUnOkOM/temporalio-1.3.0/vendor/webpki/tests/netflix/inter.der differ diff -Nru temporalio-1.3.0/vendor/webpki/third-party/bettertls/LICENSE temporalio-1.3.0/vendor/webpki/third-party/bettertls/LICENSE --- temporalio-1.3.0/vendor/webpki/third-party/bettertls/LICENSE 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/webpki/third-party/bettertls/LICENSE 1970-01-01 00:00:00.000000000 +0000 @@ -1,177 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/webpki/third-party/bettertls/README.md temporalio-1.3.0/vendor/webpki/third-party/bettertls/README.md --- temporalio-1.3.0/vendor/webpki/third-party/bettertls/README.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/webpki/third-party/bettertls/README.md 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -# BetterTLS Test Suite - -Generated using the Netflix [bettertls] project. - -[bettertls]: https://github.com/Netflix/bettertls - -## Pathbuilding - -To regenerate pathbuilding test data: - -1. Install Go -2. Generate the JSON testdata export for the path building suite: - -```bash -GOBIN=$PWD go install github.com/Netflix/bettertls/test-suites/cmd/bettertls@latest -./bettertls export-tests --suite pathbuilding --out ./pathbuilding.tests.json -``` diff -Nru temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ecdsa-prime256v1-sha512.pem temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ecdsa-prime256v1-sha512.pem --- temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ecdsa-prime256v1-sha512.pem 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ecdsa-prime256v1-sha512.pem 1970-01-01 00:00:00.000000000 +0000 @@ -1,49 +0,0 @@ -The key, message, and signature come from: -http://csrc.nist.gov/groups/STM/cavp/documents/dss/186-3ecdsatestvectors.zip (SigVer.rsp) - -The algorithm DER was synthesized to match, and the signature (provided as an r -and s tuple) was encoded into a Ecdsa-Sig-Value and then a BIT STRING. - -It uses ECDSA verification, using curve prime256v1 and SHA-512 - - - ------BEGIN PUBLIC KEY----- -MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEnLDPaTA9r8dh1ORoe07PA55tNKuWSvgIENjVWKS -o1vctUSM6F4iSCobuCKGWLHnvoxf7eHnil9rSFG25lfoceA== ------END PUBLIC KEY----- - -$ openssl asn1parse -i < [PUBLIC KEY] - 0:d=0 hl=2 l= 89 cons: SEQUENCE - 2:d=1 hl=2 l= 19 cons: SEQUENCE - 4:d=2 hl=2 l= 7 prim: OBJECT :id-ecPublicKey - 13:d=2 hl=2 l= 8 prim: OBJECT :prime256v1 - 23:d=1 hl=2 l= 66 prim: BIT STRING - - - ------BEGIN ALGORITHM----- -MAoGCCqGSM49BAME ------END ALGORITHM----- - -$ openssl asn1parse -i < [ALGORITHM] - 0:d=0 hl=2 l= 10 cons: SEQUENCE - 2:d=1 hl=2 l= 8 prim: OBJECT :ecdsa-with-SHA512 - - - ------BEGIN DATA----- -bikyFTMBpO72gOZCiSmtrpiMEI1mijH/VdBImUfXX/gaRr+J6E1kAfAjvm6HaI+814TXhcqEZzV -SSstS0ARSyEBApHnnzDMJNkQdk7vnIqlDKm4dsRK1yUA7ECcssTR/1hnUY/ep0iOtdv3gbYpog1 -APuEMjWr/5jiQb37VTjD4= ------END DATA----- - - - ------BEGIN SIGNATURE----- -A0cAMEQCIEufkeQoUocmGh0ckjz2Gc1SwXXP5/G+YKUljGEDSLo9AiAoxF+QHXHEGymGOOwNaoX -X/LDDO7/sWpyBCEa2OSiahA== ------END SIGNATURE----- - -$ openssl asn1parse -i < [SIGNATURE] - 0:d=0 hl=2 l= 71 prim: BIT STRING diff -Nru temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ecdsa-prime256v1-sha512-spki-params-null.pem temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ecdsa-prime256v1-sha512-spki-params-null.pem --- temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ecdsa-prime256v1-sha512-spki-params-null.pem 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ecdsa-prime256v1-sha512-spki-params-null.pem 1970-01-01 00:00:00.000000000 +0000 @@ -1,45 +0,0 @@ -This is the same test as ecdsa-prime256v1-sha512.pem except the public key's -algorithm has been tampered with. The parameters for ecPublicKey should be a -namedCurve, but here they have been replaced by NULL. - - - ------BEGIN PUBLIC KEY----- -MFEwCwYHKoZIzj0CAQUAA0IABJywz2kwPa/HYdTkaHtOzwOebTSrlkr4CBDY1VikqNb3LVEjOhe -IkgqG7gihlix576MX+3h54pfa0hRtuZX6HHg= ------END PUBLIC KEY----- - -$ openssl asn1parse -i < [PUBLIC KEY] - 0:d=0 hl=2 l= 81 cons: SEQUENCE - 2:d=1 hl=2 l= 11 cons: SEQUENCE - 4:d=2 hl=2 l= 7 prim: OBJECT :id-ecPublicKey - 13:d=2 hl=2 l= 0 prim: NULL - 15:d=1 hl=2 l= 66 prim: BIT STRING - - - ------BEGIN ALGORITHM----- -MAoGCCqGSM49BAME ------END ALGORITHM----- - -$ openssl asn1parse -i < [ALGORITHM] - 0:d=0 hl=2 l= 10 cons: SEQUENCE - 2:d=1 hl=2 l= 8 prim: OBJECT :ecdsa-with-SHA512 - - - ------BEGIN DATA----- -bikyFTMBpO72gOZCiSmtrpiMEI1mijH/VdBImUfXX/gaRr+J6E1kAfAjvm6HaI+814TXhcqEZzV -SSstS0ARSyEBApHnnzDMJNkQdk7vnIqlDKm4dsRK1yUA7ECcssTR/1hnUY/ep0iOtdv3gbYpog1 -APuEMjWr/5jiQb37VTjD4= ------END DATA----- - - - ------BEGIN SIGNATURE----- -A0cAMEQCIEufkeQoUocmGh0ckjz2Gc1SwXXP5/G+YKUljGEDSLo9AiAoxF+QHXHEGymGOOwNaoX -X/LDDO7/sWpyBCEa2OSiahA== ------END SIGNATURE----- - -$ openssl asn1parse -i < [SIGNATURE] - 0:d=0 hl=2 l= 71 prim: BIT STRING diff -Nru temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ecdsa-prime256v1-sha512-unused-bits-signature.pem temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ecdsa-prime256v1-sha512-unused-bits-signature.pem --- temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ecdsa-prime256v1-sha512-unused-bits-signature.pem 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ecdsa-prime256v1-sha512-unused-bits-signature.pem 1970-01-01 00:00:00.000000000 +0000 @@ -1,53 +0,0 @@ -This is the same test as ecdsa-prime256v1-sha512.pem, however the SIGNATURE has -been changed to a (valid) BIT STRING containing two unused bits. - -Note that the last two bits of the original signature were 0, so the -DER-encoded bytes portion of the mutated BIT STRING remains the same. All that -changes is the octet at the start which indicates the number of unused bits. - -In other words SIGNATURE changes from: - 03 47 00 30 ... 84 -To: - 03 47 02 30 ... 84 - - - ------BEGIN PUBLIC KEY----- -MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEnLDPaTA9r8dh1ORoe07PA55tNKuWSvgIENjVWKS -o1vctUSM6F4iSCobuCKGWLHnvoxf7eHnil9rSFG25lfoceA== ------END PUBLIC KEY----- - -$ openssl asn1parse -i < [PUBLIC KEY] - 0:d=0 hl=2 l= 89 cons: SEQUENCE - 2:d=1 hl=2 l= 19 cons: SEQUENCE - 4:d=2 hl=2 l= 7 prim: OBJECT :id-ecPublicKey - 13:d=2 hl=2 l= 8 prim: OBJECT :prime256v1 - 23:d=1 hl=2 l= 66 prim: BIT STRING - - - ------BEGIN ALGORITHM----- -MAoGCCqGSM49BAME ------END ALGORITHM----- - -$ openssl asn1parse -i < [ALGORITHM] - 0:d=0 hl=2 l= 10 cons: SEQUENCE - 2:d=1 hl=2 l= 8 prim: OBJECT :ecdsa-with-SHA512 - - - ------BEGIN DATA----- -bikyFTMBpO72gOZCiSmtrpiMEI1mijH/VdBImUfXX/gaRr+J6E1kAfAjvm6HaI+814TXhcqEZzV -SSstS0ARSyEBApHnnzDMJNkQdk7vnIqlDKm4dsRK1yUA7ECcssTR/1hnUY/ep0iOtdv3gbYpog1 -APuEMjWr/5jiQb37VTjD4= ------END DATA----- - - - ------BEGIN SIGNATURE----- -A0cCMEQCIEufkeQoUocmGh0ckjz2Gc1SwXXP5/G+YKUljGEDSLo9AiAoxF+QHXHEGymGOOwNaoX -X/LDDO7/sWpyBCEa2OSiahA== ------END SIGNATURE----- - -$ openssl asn1parse -i < [SIGNATURE] - 0:d=0 hl=2 l= 71 prim: BIT STRING diff -Nru temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ecdsa-prime256v1-sha512-using-ecdh-key.pem temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ecdsa-prime256v1-sha512-using-ecdh-key.pem --- temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ecdsa-prime256v1-sha512-using-ecdh-key.pem 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ecdsa-prime256v1-sha512-using-ecdh-key.pem 1970-01-01 00:00:00.000000000 +0000 @@ -1,48 +0,0 @@ -This uses the same test data as ecdsa-prime256v1-sha512.pem, HOWEVER the -algorithm OID for the public key has been changed from id-ecPublicKey -(1.2.840.10045.2.1) to id-ecDH (1.3.132.1.12) - -This test should fail because the public key's algorithm does not match that of -the signature algorithm. - - - ------BEGIN PUBLIC KEY----- -MFcwEQYFK4EEAQwGCCqGSM49AwEHA0IABJywz2kwPa/HYdTkaHtOzwOebTSrlkr4CBDY1VikqNb -3LVEjOheIkgqG7gihlix576MX+3h54pfa0hRtuZX6HHg= ------END PUBLIC KEY----- - -$ openssl asn1parse -i < [PUBLIC KEY] - 0:d=0 hl=2 l= 87 cons: SEQUENCE - 2:d=1 hl=2 l= 17 cons: SEQUENCE - 4:d=2 hl=2 l= 5 prim: OBJECT :1.3.132.1.12 - 11:d=2 hl=2 l= 8 prim: OBJECT :prime256v1 - 21:d=1 hl=2 l= 66 prim: BIT STRING - - - ------BEGIN ALGORITHM----- -MAoGCCqGSM49BAME ------END ALGORITHM----- - -$ openssl asn1parse -i < [ALGORITHM] - 0:d=0 hl=2 l= 10 cons: SEQUENCE - 2:d=1 hl=2 l= 8 prim: OBJECT :ecdsa-with-SHA512 - - - ------BEGIN DATA----- -bikyFTMBpO72gOZCiSmtrpiMEI1mijH/VdBImUfXX/gaRr+J6E1kAfAjvm6HaI+814TXhcqEZzV -SSstS0ARSyEBApHnnzDMJNkQdk7vnIqlDKm4dsRK1yUA7ECcssTR/1hnUY/ep0iOtdv3gbYpog1 -APuEMjWr/5jiQb37VTjD4= ------END DATA----- - - - ------BEGIN SIGNATURE----- -A0cAMEQCIEufkeQoUocmGh0ckjz2Gc1SwXXP5/G+YKUljGEDSLo9AiAoxF+QHXHEGymGOOwNaoX -X/LDDO7/sWpyBCEa2OSiahA== ------END SIGNATURE----- - -$ openssl asn1parse -i < [SIGNATURE] - 0:d=0 hl=2 l= 71 prim: BIT STRING diff -Nru temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ecdsa-prime256v1-sha512-using-ecmqv-key.pem temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ecdsa-prime256v1-sha512-using-ecmqv-key.pem --- temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ecdsa-prime256v1-sha512-using-ecmqv-key.pem 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ecdsa-prime256v1-sha512-using-ecmqv-key.pem 1970-01-01 00:00:00.000000000 +0000 @@ -1,48 +0,0 @@ -This uses the same test data as ecdsa-prime256v1-sha512.pem, HOWEVER the -algorithm OID for the public key has been changed from id-ecPublicKey -(1.2.840.10045.2.1) to id-ecMQV (1.3.132.1.13) - -This test should fail because the public key's algorithm does not match that of -the signature algorithm. - - - ------BEGIN PUBLIC KEY----- -MFcwEQYFK4EEAQ0GCCqGSM49AwEHA0IABJywz2kwPa/HYdTkaHtOzwOebTSrlkr4CBDY1VikqNb -3LVEjOheIkgqG7gihlix576MX+3h54pfa0hRtuZX6HHg= ------END PUBLIC KEY----- - -$ openssl asn1parse -i < [PUBLIC KEY] - 0:d=0 hl=2 l= 87 cons: SEQUENCE - 2:d=1 hl=2 l= 17 cons: SEQUENCE - 4:d=2 hl=2 l= 5 prim: OBJECT :1.3.132.1.13 - 11:d=2 hl=2 l= 8 prim: OBJECT :prime256v1 - 21:d=1 hl=2 l= 66 prim: BIT STRING - - - ------BEGIN ALGORITHM----- -MAoGCCqGSM49BAME ------END ALGORITHM----- - -$ openssl asn1parse -i < [ALGORITHM] - 0:d=0 hl=2 l= 10 cons: SEQUENCE - 2:d=1 hl=2 l= 8 prim: OBJECT :ecdsa-with-SHA512 - - - ------BEGIN DATA----- -bikyFTMBpO72gOZCiSmtrpiMEI1mijH/VdBImUfXX/gaRr+J6E1kAfAjvm6HaI+814TXhcqEZzV -SSstS0ARSyEBApHnnzDMJNkQdk7vnIqlDKm4dsRK1yUA7ECcssTR/1hnUY/ep0iOtdv3gbYpog1 -APuEMjWr/5jiQb37VTjD4= ------END DATA----- - - - ------BEGIN SIGNATURE----- -A0cAMEQCIEufkeQoUocmGh0ckjz2Gc1SwXXP5/G+YKUljGEDSLo9AiAoxF+QHXHEGymGOOwNaoX -X/LDDO7/sWpyBCEa2OSiahA== ------END SIGNATURE----- - -$ openssl asn1parse -i < [SIGNATURE] - 0:d=0 hl=2 l= 71 prim: BIT STRING diff -Nru temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ecdsa-prime256v1-sha512-using-rsa-algorithm.pem temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ecdsa-prime256v1-sha512-using-rsa-algorithm.pem --- temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ecdsa-prime256v1-sha512-using-rsa-algorithm.pem 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ecdsa-prime256v1-sha512-using-rsa-algorithm.pem 1970-01-01 00:00:00.000000000 +0000 @@ -1,48 +0,0 @@ -This test specified a valid ECDSA signature and EC key (the same as ecdsa-prime256v1-sha512.pem) - -The problem however is the signature algorithm is indicated as being RSA PKCS#1 v1.5. - -Signature verification consequently should fail. - - - ------BEGIN PUBLIC KEY----- -MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEnLDPaTA9r8dh1ORoe07PA55tNKuWSvgIENjVWKS -o1vctUSM6F4iSCobuCKGWLHnvoxf7eHnil9rSFG25lfoceA== ------END PUBLIC KEY----- - -$ openssl asn1parse -i < [PUBLIC KEY] - 0:d=0 hl=2 l= 89 cons: SEQUENCE - 2:d=1 hl=2 l= 19 cons: SEQUENCE - 4:d=2 hl=2 l= 7 prim: OBJECT :id-ecPublicKey - 13:d=2 hl=2 l= 8 prim: OBJECT :prime256v1 - 23:d=1 hl=2 l= 66 prim: BIT STRING - - - ------BEGIN ALGORITHM----- -MA0GCSqGSIb3DQEBDQUA ------END ALGORITHM----- - -$ openssl asn1parse -i < [ALGORITHM] - 0:d=0 hl=2 l= 13 cons: SEQUENCE - 2:d=1 hl=2 l= 9 prim: OBJECT :sha512WithRSAEncryption - 13:d=1 hl=2 l= 0 prim: NULL - - - ------BEGIN DATA----- -bikyFTMBpO72gOZCiSmtrpiMEI1mijH/VdBImUfXX/gaRr+J6E1kAfAjvm6HaI+814TXhcqEZzV -SSstS0ARSyEBApHnnzDMJNkQdk7vnIqlDKm4dsRK1yUA7ECcssTR/1hnUY/ep0iOtdv3gbYpog1 -APuEMjWr/5jiQb37VTjD4= ------END DATA----- - - - ------BEGIN SIGNATURE----- -A0cAMEQCIEufkeQoUocmGh0ckjz2Gc1SwXXP5/G+YKUljGEDSLo9AiAoxF+QHXHEGymGOOwNaoX -X/LDDO7/sWpyBCEa2OSiahA== ------END SIGNATURE----- - -$ openssl asn1parse -i < [SIGNATURE] - 0:d=0 hl=2 l= 71 prim: BIT STRING diff -Nru temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ecdsa-prime256v1-sha512-wrong-signature-format.pem temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ecdsa-prime256v1-sha512-wrong-signature-format.pem --- temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ecdsa-prime256v1-sha512-wrong-signature-format.pem 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ecdsa-prime256v1-sha512-wrong-signature-format.pem 1970-01-01 00:00:00.000000000 +0000 @@ -1,47 +0,0 @@ -This is the same as ecdsa-prime256v1-sha512.pem, except the signature is wrong. - -Rather than encoding the signature into a DER-encoded Ecdsa-Sig-Value, it is a -concatenation of the r and s values. This is the format that WebCrypto uses for -ECDSA signature, but not what is used for digital signatures. - - - ------BEGIN PUBLIC KEY----- -MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEnLDPaTA9r8dh1ORoe07PA55tNKuWSvgIENjVWKS -o1vctUSM6F4iSCobuCKGWLHnvoxf7eHnil9rSFG25lfoceA== ------END PUBLIC KEY----- - -$ openssl asn1parse -i < [PUBLIC KEY] - 0:d=0 hl=2 l= 89 cons: SEQUENCE - 2:d=1 hl=2 l= 19 cons: SEQUENCE - 4:d=2 hl=2 l= 7 prim: OBJECT :id-ecPublicKey - 13:d=2 hl=2 l= 8 prim: OBJECT :prime256v1 - 23:d=1 hl=2 l= 66 prim: BIT STRING - - - ------BEGIN ALGORITHM----- -MAoGCCqGSM49BAME ------END ALGORITHM----- - -$ openssl asn1parse -i < [ALGORITHM] - 0:d=0 hl=2 l= 10 cons: SEQUENCE - 2:d=1 hl=2 l= 8 prim: OBJECT :ecdsa-with-SHA512 - - - ------BEGIN DATA----- -bikyFTMBpO72gOZCiSmtrpiMEI1mijH/VdBImUfXX/gaRr+J6E1kAfAjvm6HaI+814TXhcqEZzV -SSstS0ARSyEBApHnnzDMJNkQdk7vnIqlDKm4dsRK1yUA7ECcssTR/1hnUY/ep0iOtdv3gbYpog1 -APuEMjWr/5jiQb37VTjD4= ------END DATA----- - - - ------BEGIN SIGNATURE----- -A0EAS5+R5ChShyYaHRySPPYZzVLBdc/n8b5gpSWMYQNIuj0oxF+QHXHEGymGOOwNaoXX/LDDO7/ -sWpyBCEa2OSiahA== ------END SIGNATURE----- - -$ openssl asn1parse -i < [SIGNATURE] - 0:d=0 hl=2 l= 65 prim: BIT STRING diff -Nru temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ecdsa-secp384r1-sha256-corrupted-data.pem temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ecdsa-secp384r1-sha256-corrupted-data.pem --- temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ecdsa-secp384r1-sha256-corrupted-data.pem 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ecdsa-secp384r1-sha256-corrupted-data.pem 1970-01-01 00:00:00.000000000 +0000 @@ -1,53 +0,0 @@ -This is the same test as ecdsa-secp384r1-sha256.pem, except the DATA section -has been corrupted. The third byte has been set to 0. - -This signature should NOT verify successfully. - - - ------BEGIN PUBLIC KEY----- -MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEXFhBi+WKXuxeK9yCbC9jqEchwjCNsQ4RXAsJ07oHZ+Q -qz55cNIY5BAhcQ0QYY5jv9BimGL9SuhUuOSuS3Pn9rrsIFGcFsihy4kDr8rq5+7RbN8bV057gW5 -emYjLtvDsQ ------END PUBLIC KEY----- - -$ openssl asn1parse -i < [PUBLIC KEY] - 0:d=0 hl=2 l= 118 cons: SEQUENCE - 2:d=1 hl=2 l= 16 cons: SEQUENCE - 4:d=2 hl=2 l= 7 prim: OBJECT :id-ecPublicKey - 13:d=2 hl=2 l= 5 prim: OBJECT :secp384r1 - 20:d=1 hl=2 l= 98 prim: BIT STRING - - - ------BEGIN ALGORITHM----- -MAoGCCqGSM49BAMC ------END ALGORITHM----- - -$ openssl asn1parse -i < [ALGORITHM] - 0:d=0 hl=2 l= 10 cons: SEQUENCE - 2:d=1 hl=2 l= 8 prim: OBJECT :ecdsa-with-SHA256 - - - ------BEGIN DATA----- -MIIA6KADAgECAgkAtUVxft6/Vc0wCgYIKoZIzj0EAwIwbzELMAkGA1UEBhMCQVUxEzARBgNVBAg -MClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEMMAoGA1UEAw -wDYWhhMRowGAYJKoZIhvcNAQkBFgtzdXBAZm9vLmNvbTAeFw0xNTA3MDIwMDM4MTRaFw0xNjA3M -DEwMDM4MTRaMG8xCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJ -bnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQxDDAKBgNVBAMMA2FoYTEaMBgGCSqGSIb3DQEJARYLc3V -wQGZvby5jb20wdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARcWEGL5Ype7F4r3IJsL2OoRyHCMI2xDh -FcCwnTugdn5CrPnlw0hjkECFxDRBhjmO/0GKYYv1K6FS45K5Lc+f2uuwgUZwWyKHLiQOvyurn7t -Fs3xtXTnuBbl6ZiMu28OxCjUDBOMB0GA1UdDgQWBBR6nDgtPalG2JvSlWzdGRCi/Cu7NjAfBgNV -HSMEGDAWgBR6nDgtPalG2JvSlWzdGRCi/Cu7NjAMBgNVHRMEBTADAQH/ ------END DATA----- - - - ------BEGIN SIGNATURE----- -A2kAMGYCMQCDwMSZVJZ8qThiNTV7VX57m8fdNnNS6cXIjRYoh4SozlYWmWGh87nhmJJCeD16jVM -CMQDkroAY8oNi8RxLUor+LozhhVgu24tu6lcp4MP8H3Zy8bBea5HerAd1AqJp3Ox7KDU= ------END SIGNATURE----- - -$ openssl asn1parse -i < [SIGNATURE] - 0:d=0 hl=2 l= 105 prim: BIT STRING diff -Nru temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ecdsa-secp384r1-sha256.pem temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ecdsa-secp384r1-sha256.pem --- temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ecdsa-secp384r1-sha256.pem 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ecdsa-secp384r1-sha256.pem 1970-01-01 00:00:00.000000000 +0000 @@ -1,84 +0,0 @@ -This test data was produced by creating a self-signed EC cert using OpenSSL, -and then extracting the relevant fields. - -It uses ECDSA with curve secp384r1 an SHA-256. - -(1) Generate self-signed certificate - - openssl ecparam -out ec_key.pem -name secp384r1 -genkey - openssl req -new -key ec_key.pem -x509 -nodes -days 365 -out cert.pem - -(2) Extract public key - - openssl x509 -in cert.pem -pubkey -noout > pubkey.pem - cat pubkey.pem - -(3) Extract signed data (tbsCertificate) - - openssl asn1parse -in cert.pem -out tbs -noout -strparse 4 - base64 tbs - -(4) Extract signature algorithm - - # Find the offset of the signature algorithm near the end (496 in this case) - openssl asn1parse -in cert.pem - - openssl asn1parse -in cert.pem -out alg -noout -strparse 496 - base64 alg - -(5) Extract the signature - - # Find the final offset of BIT STRING (508 in this case) - openssl asn1parse -in cert.pem - - openssl asn1parse -in cert.pem -out sig -noout -strparse 508 - base64 sig - - - ------BEGIN PUBLIC KEY----- -MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEXFhBi+WKXuxeK9yCbC9jqEchwjCNsQ4RXAsJ07oHZ+Q -qz55cNIY5BAhcQ0QYY5jv9BimGL9SuhUuOSuS3Pn9rrsIFGcFsihy4kDr8rq5+7RbN8bV057gW5 -emYjLtvDsQ ------END PUBLIC KEY----- - -$ openssl asn1parse -i < [PUBLIC KEY] - 0:d=0 hl=2 l= 118 cons: SEQUENCE - 2:d=1 hl=2 l= 16 cons: SEQUENCE - 4:d=2 hl=2 l= 7 prim: OBJECT :id-ecPublicKey - 13:d=2 hl=2 l= 5 prim: OBJECT :secp384r1 - 20:d=1 hl=2 l= 98 prim: BIT STRING - - - ------BEGIN ALGORITHM----- -MAoGCCqGSM49BAMC ------END ALGORITHM----- - -$ openssl asn1parse -i < [ALGORITHM] - 0:d=0 hl=2 l= 10 cons: SEQUENCE - 2:d=1 hl=2 l= 8 prim: OBJECT :ecdsa-with-SHA256 - - - ------BEGIN DATA----- -MIIB6KADAgECAgkAtUVxft6/Vc0wCgYIKoZIzj0EAwIwbzELMAkGA1UEBhMCQVUxEzARBgNVBAg -MClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEMMAoGA1UEAw -wDYWhhMRowGAYJKoZIhvcNAQkBFgtzdXBAZm9vLmNvbTAeFw0xNTA3MDIwMDM4MTRaFw0xNjA3M -DEwMDM4MTRaMG8xCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJ -bnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQxDDAKBgNVBAMMA2FoYTEaMBgGCSqGSIb3DQEJARYLc3V -wQGZvby5jb20wdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARcWEGL5Ype7F4r3IJsL2OoRyHCMI2xDh -FcCwnTugdn5CrPnlw0hjkECFxDRBhjmO/0GKYYv1K6FS45K5Lc+f2uuwgUZwWyKHLiQOvyurn7t -Fs3xtXTnuBbl6ZiMu28OxCjUDBOMB0GA1UdDgQWBBR6nDgtPalG2JvSlWzdGRCi/Cu7NjAfBgNV -HSMEGDAWgBR6nDgtPalG2JvSlWzdGRCi/Cu7NjAMBgNVHRMEBTADAQH/ ------END DATA----- - - - ------BEGIN SIGNATURE----- -A2kAMGYCMQCDwMSZVJZ8qThiNTV7VX57m8fdNnNS6cXIjRYoh4SozlYWmWGh87nhmJJCeD16jVM -CMQDkroAY8oNi8RxLUor+LozhhVgu24tu6lcp4MP8H3Zy8bBea5HerAd1AqJp3Ox7KDU= ------END SIGNATURE----- - -$ openssl asn1parse -i < [SIGNATURE] - 0:d=0 hl=2 l= 105 prim: BIT STRING diff -Nru temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ecdsa-using-rsa-key.pem temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ecdsa-using-rsa-key.pem --- temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ecdsa-using-rsa-key.pem 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ecdsa-using-rsa-key.pem 1970-01-01 00:00:00.000000000 +0000 @@ -1,51 +0,0 @@ -This test specifies an ECDSA signature algorithm (and a valid ecdsa signature), -HOWEVER it provides an RSA key. Verification should fail. - - - ------BEGIN PUBLIC KEY----- -MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQClbkoOcBAXWJpRh9x+qEHRVvLsDjatUqRN/rH -mH3rZkdjFEFb/7bFitMDyg6EqiKOU3/Umq3KRy7MHzqv84LHf1c2VCAltWyuLbfXWce9jd8CSHL -I8Jwpw4lmOb/idGfEFrMLT8Ms18pKA4Thrb2TE7yLh4fINDOjP+yJJvZohNwIDAQAB ------END PUBLIC KEY----- - -$ openssl asn1parse -i < [PUBLIC KEY] - 0:d=0 hl=3 l= 159 cons: SEQUENCE - 3:d=1 hl=2 l= 13 cons: SEQUENCE - 5:d=2 hl=2 l= 9 prim: OBJECT :rsaEncryption - 16:d=2 hl=2 l= 0 prim: NULL - 18:d=1 hl=3 l= 141 prim: BIT STRING - - - ------BEGIN ALGORITHM----- -MAoGCCqGSM49BAMC ------END ALGORITHM----- - -$ openssl asn1parse -i < [ALGORITHM] - 0:d=0 hl=2 l= 10 cons: SEQUENCE - 2:d=1 hl=2 l= 8 prim: OBJECT :ecdsa-with-SHA256 - - - ------BEGIN DATA----- -MIIB6KADAgECAgkAtUVxft6/Vc0wCgYIKoZIzj0EAwIwbzELMAkGA1UEBhMCQVUxEzARBgNVBAg -MClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEMMAoGA1UEAw -wDYWhhMRowGAYJKoZIhvcNAQkBFgtzdXBAZm9vLmNvbTAeFw0xNTA3MDIwMDM4MTRaFw0xNjA3M -DEwMDM4MTRaMG8xCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJ -bnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQxDDAKBgNVBAMMA2FoYTEaMBgGCSqGSIb3DQEJARYLc3V -wQGZvby5jb20wdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARcWEGL5Ype7F4r3IJsL2OoRyHCMI2xDh -FcCwnTugdn5CrPnlw0hjkECFxDRBhjmO/0GKYYv1K6FS45K5Lc+f2uuwgUZwWyKHLiQOvyurn7t -Fs3xtXTnuBbl6ZiMu28OxCjUDBOMB0GA1UdDgQWBBR6nDgtPalG2JvSlWzdGRCi/Cu7NjAfBgNV -HSMEGDAWgBR6nDgtPalG2JvSlWzdGRCi/Cu7NjAMBgNVHRMEBTADAQH/ ------END DATA----- - - - ------BEGIN SIGNATURE----- -A2kAMGYCMQCDwMSZVJZ8qThiNTV7VX57m8fdNnNS6cXIjRYoh4SozlYWmWGh87nhmJJCeD16jVM -CMQDkroAY8oNi8RxLUor+LozhhVgu24tu6lcp4MP8H3Zy8bBea5HerAd1AqJp3Ox7KDU= ------END SIGNATURE----- - -$ openssl asn1parse -i < [SIGNATURE] - 0:d=0 hl=2 l= 105 prim: BIT STRING diff -Nru temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ours/make-pss.py temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ours/make-pss.py --- temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ours/make-pss.py 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ours/make-pss.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,59 +0,0 @@ -# Copyright 2016 Joseph Birr-Pixton. -# -# Permission to use, copy, modify, and/or distribute this software for any -# purpose with or without fee is hereby granted, provided that the above -# copyright notice and this permission notice appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import subprocess -import glob -import hashlib -import os - -TOP = '../../../../../' - -def dump(bin, type): - return '-----BEGIN %s-----\n%s-----END %s-----\n' % \ - (type, bin.encode('base64'), type) - -def gen(outfile, paramfile, hashfn): - param = open(paramfile).read() - - rand = os.urandom(64) - hash = getattr(hashlib, hashfn)(rand).digest() - - proc = subprocess.Popen(['openssl', 'pkeyutl', - '-inkey', 'priv.pem', - '-sign', - '-pkeyopt', 'rsa_padding_mode:pss', - '-pkeyopt', 'rsa_pss_saltlen:-1', - '-pkeyopt', 'digest:%s' % hashfn - ], - stdout = subprocess.PIPE, - stdin = subprocess.PIPE) - - sig, _ = proc.communicate(hash) - - with open(outfile, 'w') as f: - print >>f, dump(open('pub.der').read(), 'PUBLIC KEY') - print >>f, dump(param, 'ALGORITHM') - print >>f, dump(rand, 'DATA') - - assert len(sig) == 256 # only works with 2048-bit keys - # turn it into a DER bitstring - print >>f, dump('\x03\x82\x01\x01\x00' + sig, 'SIGNATURE') - -if __name__ == '__main__': - subprocess.check_call('openssl genrsa -out priv.pem 2048', shell = True) - subprocess.check_call('openssl rsa -pubout -out pub.pem -in priv.pem', shell = True) - subprocess.check_call('openssl asn1parse -inform pem -in pub.pem -out pub.der', shell = True) - gen('rsa-pss-sha256-salt32.pem', TOP + 'src/data/alg-pss-sha256.der', 'sha256') - gen('rsa-pss-sha384-salt48.pem', TOP + 'src/data/alg-pss-sha384.der', 'sha384') - gen('rsa-pss-sha512-salt64.pem', TOP + 'src/data/alg-pss-sha512.der', 'sha512') diff -Nru temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ours/priv.pem temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ours/priv.pem --- temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ours/priv.pem 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ours/priv.pem 1970-01-01 00:00:00.000000000 +0000 @@ -1,27 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIIEpAIBAAKCAQEAtVDcg1BMqPneiNBL5+mjEB5mxjJzgkmClZR5z1jNht+As6+M -lgflni0bB8LjhWbIt+dZ6Bt4cSHOnAOnkMDOFwtrxJE6Eg1GQ2ux9nDVNvrQkoOL -znXrxMh/af0pcSo8kItDmkqbV/fi3Q7agpbcWc/4wTZOfO6lns4nb5s08oaUv3uF -5Wc0sktNr6he6R3zSQ6YK5KZFzQdnEtGc4gwHWXZ9xt4JeANht3m4RNpMY89qZsZ -xmqoewYHuXQUAfl7W0DC3hoxOoLwSqL2bt2zMMeR8WAo51YY0cJnzAEETcnWIM6e -alb5Osj3iSEknxRTley47SsODQ0maUUWj8wEjwIDAQABAoIBAFBAVQmt7fBQgAWQ -JDimeWz198k7pVKCVND94Zg7luReYmmlhpUVM7V6A1/BC9EMuERlmq6YEgwIyZjW -KUFxhQZAINfk64334CSRMzh/om9uPgjLPoMIQG1dzL9NtR0Ic7wKV8afxPf/mKL9 -Iwvv1+HMoi5qafzz58xNNLk6OgopdZ6H2aX0QtHy/jkMfpE3od7W6Xc+lSVUO7HG -zmN3pHaM5K5n59cX9jpg/K+a0loceY5vmqUfXyh6IP6h1XyAb2NTpU04klDEFEnU -tyaYtxL4ZMZzefoeVXVbCl7qeOE7KGIz7gcvsqL7T8dkK+uYf6mLENeyUvkCKiTG -QAqon0kCgYEA6pLLAYpRo9JbLYlYNt9iTFwIU+R8RcxzZrltm7OUqztmaVq4pOek -cPw/2sCMvqeEWuGhv+bbeIsDUWADU9NFkWySlVRKEFKGb3ECv3A07yfP2K22exOZ -/SglNZKB/ycvpOMcNKnJD5folRrh0actdVG8vOf/sN+887vE77u0f6sCgYEAxeC0 -/6831k/EWYzQf+OfeLqx4ABgkgqxvMXO3YCp44+DD4l8TVWfP4Ahfj5p0zCbXIv3 -5OcxdVwjNljZw4Y5vDNwcDK7vKwp9ne+H9xJB7Yedfr7oyJbqIvJ1nd6jmXoL7GA -dX9xSxJ1CucD7RAY99MS77y8xm0sTbFoI6SvOq0CgYEApeQihXhYvE6sBMw5ArWA -QxhjG1FfQc2RX3iLt62M2nwrtR5frt/TP8RlNEMwRjUaOVuQlLKjS+Cj/Ay2zbWA -YZQzJkByEJEMWgvGMbUc+nVhXI+dmfUG1i5qAjUWkmgYHbgv3l6kvs5jwe88/JQK -ZgnkPISmI2RXsNd+MzzALfkCgYB/56HXa/ERzHnE0KqtH/si1LrJajUB8Xu14761 -msc12rwCvQHmEyRerXn42msZIeAq0CaqhW6Ix8fTB1erdQW4yx8wxvpnGHn/YKM6 -gO+L1oKWDGe/qSPKLKGIya4kgWa1/Wxlhr06o3GYXH9DKxaYio1A/aSgNk1e4v/H -mlnR+QKBgQDd2cdhBTXIo5FZSONip5GG2Ku9m60qGSyPTCqxLNWBfYE/fu0aFCUU -GemqA2ygxFnyCG1Af0SDWwQFH8W7BJ6H1geJVcwVKLrZokKOul8kdwXCxz1J2XGe -gskT4Dsd9K8TSU3J09XVKhC5SrF0vDjdXOE6rtFSqa/bs7B2JcfNwQ== ------END RSA PRIVATE KEY----- diff -Nru temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ours/pub.pem temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ours/pub.pem --- temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ours/pub.pem 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ours/pub.pem 1970-01-01 00:00:00.000000000 +0000 @@ -1,9 +0,0 @@ ------BEGIN PUBLIC KEY----- -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtVDcg1BMqPneiNBL5+mj -EB5mxjJzgkmClZR5z1jNht+As6+Mlgflni0bB8LjhWbIt+dZ6Bt4cSHOnAOnkMDO -FwtrxJE6Eg1GQ2ux9nDVNvrQkoOLznXrxMh/af0pcSo8kItDmkqbV/fi3Q7agpbc -Wc/4wTZOfO6lns4nb5s08oaUv3uF5Wc0sktNr6he6R3zSQ6YK5KZFzQdnEtGc4gw -HWXZ9xt4JeANht3m4RNpMY89qZsZxmqoewYHuXQUAfl7W0DC3hoxOoLwSqL2bt2z -MMeR8WAo51YY0cJnzAEETcnWIM6ealb5Osj3iSEknxRTley47SsODQ0maUUWj8wE -jwIDAQAB ------END PUBLIC KEY----- diff -Nru temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ours/rsa-pss-sha256-salt32-corrupted-data.pem temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ours/rsa-pss-sha256-salt32-corrupted-data.pem --- temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ours/rsa-pss-sha256-salt32-corrupted-data.pem 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ours/rsa-pss-sha256-salt32-corrupted-data.pem 1970-01-01 00:00:00.000000000 +0000 @@ -1,63 +0,0 @@ -This has had DATA corrupted, so the signature is not valid. - - - ------BEGIN PUBLIC KEY----- -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtVDcg1BMqPneiNBL5+mjEB5mxjJzgkm -ClZR5z1jNht+As6+Mlgflni0bB8LjhWbIt+dZ6Bt4cSHOnAOnkMDOFwtrxJE6Eg1GQ2ux9nDVNv -rQkoOLznXrxMh/af0pcSo8kItDmkqbV/fi3Q7agpbcWc/4wTZOfO6lns4nb5s08oaUv3uF5Wc0s -ktNr6he6R3zSQ6YK5KZFzQdnEtGc4gwHWXZ9xt4JeANht3m4RNpMY89qZsZxmqoewYHuXQUAfl7 -W0DC3hoxOoLwSqL2bt2zMMeR8WAo51YY0cJnzAEETcnWIM6ealb5Osj3iSEknxRTley47SsODQ0 -maUUWj8wEjwIDAQAB ------END PUBLIC KEY----- - -$ openssl asn1parse -i < [PUBLIC KEY] - 0:d=0 hl=4 l= 290 cons: SEQUENCE - 4:d=1 hl=2 l= 13 cons: SEQUENCE - 6:d=2 hl=2 l= 9 prim: OBJECT :rsaEncryption - 17:d=2 hl=2 l= 0 prim: NULL - 19:d=1 hl=4 l= 271 prim: BIT STRING - - - ------BEGIN ALGORITHM----- -MEEGCSqGSIb3DQEBCjA0oA8wDQYJYIZIAWUDBAIBBQChHDAaBgkqhkiG9w0BAQgwDQYJYIZIAWU -DBAIBBQCiAwIBIA== ------END ALGORITHM----- - -$ openssl asn1parse -i < [ALGORITHM] - 0:d=0 hl=2 l= 65 cons: SEQUENCE - 2:d=1 hl=2 l= 9 prim: OBJECT :rsassaPss - 13:d=1 hl=2 l= 52 cons: SEQUENCE - 15:d=2 hl=2 l= 15 cons: cont [ 0 ] - 17:d=3 hl=2 l= 13 cons: SEQUENCE - 19:d=4 hl=2 l= 9 prim: OBJECT :sha256 - 30:d=4 hl=2 l= 0 prim: NULL - 32:d=2 hl=2 l= 28 cons: cont [ 1 ] - 34:d=3 hl=2 l= 26 cons: SEQUENCE - 36:d=4 hl=2 l= 9 prim: OBJECT :mgf1 - 47:d=4 hl=2 l= 13 cons: SEQUENCE - 49:d=5 hl=2 l= 9 prim: OBJECT :sha256 - 60:d=5 hl=2 l= 0 prim: NULL - 62:d=2 hl=2 l= 3 cons: cont [ 2 ] - 64:d=3 hl=2 l= 1 prim: INTEGER :20 - - - ------BEGIN DATA----- -K6BCjy4hCNAZBmRT+wS4h5wDg7pO67oHFabDt5cXNp8X6sLNH2vjICLtO2niPwZ/Yk2ySxC8MgO -/+U9sdSXxqA== ------END DATA----- - - - ------BEGIN SIGNATURE----- -A4IBAQCZqlXJhviFKOKHe1ssbm0ThtAnAbcuP3ACBZyfpBjfYlxAgltNzBnmEtxjsbZQPMXHDHy -Y+fdEXwK2vboCz7BzIRXcrcJGzjsBc2zPeNZlmhaadIoa5d8jy3kxnT+f3YVjKGZBqwDaqE5Kie -jhV0laTK+cNGFXo9a3ylICok+s4jVN2Y7qE+ImgyANbZyn1d6W6VnFf4GVvin2hFwTCcZnKA6Db -NYnArbbNmHmMB2S+1Kw9dAklnzZmwWgNSRirtTpUHTBIWYq3B0hPL8IzwKk89/iKDaY2fpV/Wnt -oL2mgM7oa/7+oQWa27BGYftYZmDpIQtNbUeO4VBnaeqGgA5f ------END SIGNATURE----- - -$ openssl asn1parse -i < [SIGNATURE] - 0:d=0 hl=4 l= 257 prim: BIT STRING diff -Nru temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ours/rsa-pss-sha256-salt32.pem temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ours/rsa-pss-sha256-salt32.pem --- temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ours/rsa-pss-sha256-salt32.pem 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ours/rsa-pss-sha256-salt32.pem 1970-01-01 00:00:00.000000000 +0000 @@ -1,63 +0,0 @@ - - - - ------BEGIN PUBLIC KEY----- -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtVDcg1BMqPneiNBL5+mjEB5mxjJzgkm -ClZR5z1jNht+As6+Mlgflni0bB8LjhWbIt+dZ6Bt4cSHOnAOnkMDOFwtrxJE6Eg1GQ2ux9nDVNv -rQkoOLznXrxMh/af0pcSo8kItDmkqbV/fi3Q7agpbcWc/4wTZOfO6lns4nb5s08oaUv3uF5Wc0s -ktNr6he6R3zSQ6YK5KZFzQdnEtGc4gwHWXZ9xt4JeANht3m4RNpMY89qZsZxmqoewYHuXQUAfl7 -W0DC3hoxOoLwSqL2bt2zMMeR8WAo51YY0cJnzAEETcnWIM6ealb5Osj3iSEknxRTley47SsODQ0 -maUUWj8wEjwIDAQAB ------END PUBLIC KEY----- - -$ openssl asn1parse -i < [PUBLIC KEY] - 0:d=0 hl=4 l= 290 cons: SEQUENCE - 4:d=1 hl=2 l= 13 cons: SEQUENCE - 6:d=2 hl=2 l= 9 prim: OBJECT :rsaEncryption - 17:d=2 hl=2 l= 0 prim: NULL - 19:d=1 hl=4 l= 271 prim: BIT STRING - - - ------BEGIN ALGORITHM----- -MEEGCSqGSIb3DQEBCjA0oA8wDQYJYIZIAWUDBAIBBQChHDAaBgkqhkiG9w0BAQgwDQYJYIZIAWU -DBAIBBQCiAwIBIA== ------END ALGORITHM----- - -$ openssl asn1parse -i < [ALGORITHM] - 0:d=0 hl=2 l= 65 cons: SEQUENCE - 2:d=1 hl=2 l= 9 prim: OBJECT :rsassaPss - 13:d=1 hl=2 l= 52 cons: SEQUENCE - 15:d=2 hl=2 l= 15 cons: cont [ 0 ] - 17:d=3 hl=2 l= 13 cons: SEQUENCE - 19:d=4 hl=2 l= 9 prim: OBJECT :sha256 - 30:d=4 hl=2 l= 0 prim: NULL - 32:d=2 hl=2 l= 28 cons: cont [ 1 ] - 34:d=3 hl=2 l= 26 cons: SEQUENCE - 36:d=4 hl=2 l= 9 prim: OBJECT :mgf1 - 47:d=4 hl=2 l= 13 cons: SEQUENCE - 49:d=5 hl=2 l= 9 prim: OBJECT :sha256 - 60:d=5 hl=2 l= 0 prim: NULL - 62:d=2 hl=2 l= 3 cons: cont [ 2 ] - 64:d=3 hl=2 l= 1 prim: INTEGER :20 - - - ------BEGIN DATA----- -K5BCjy4hCNAZBmRT+wS4h5wDg7pO67oHFabDt5cXNp8X6sLNH2vjICLtO2niPwZ/Yk2ySxC8MgO -/+U9sdSXxqA== ------END DATA----- - - - ------BEGIN SIGNATURE----- -A4IBAQCZqlXJhviFKOKHe1ssbm0ThtAnAbcuP3ACBZyfpBjfYlxAgltNzBnmEtxjsbZQPMXHDHy -Y+fdEXwK2vboCz7BzIRXcrcJGzjsBc2zPeNZlmhaadIoa5d8jy3kxnT+f3YVjKGZBqwDaqE5Kie -jhV0laTK+cNGFXo9a3ylICok+s4jVN2Y7qE+ImgyANbZyn1d6W6VnFf4GVvin2hFwTCcZnKA6Db -NYnArbbNmHmMB2S+1Kw9dAklnzZmwWgNSRirtTpUHTBIWYq3B0hPL8IzwKk89/iKDaY2fpV/Wnt -oL2mgM7oa/7+oQWa27BGYftYZmDpIQtNbUeO4VBnaeqGgA5f ------END SIGNATURE----- - -$ openssl asn1parse -i < [SIGNATURE] - 0:d=0 hl=4 l= 257 prim: BIT STRING diff -Nru temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ours/rsa-pss-sha384-salt48-corrupted-data.pem temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ours/rsa-pss-sha384-salt48-corrupted-data.pem --- temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ours/rsa-pss-sha384-salt48-corrupted-data.pem 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ours/rsa-pss-sha384-salt48-corrupted-data.pem 1970-01-01 00:00:00.000000000 +0000 @@ -1,63 +0,0 @@ -This has had DATA corrupted, so the signature is not valid. - - - ------BEGIN PUBLIC KEY----- -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtVDcg1BMqPneiNBL5+mjEB5mxjJzgkm -ClZR5z1jNht+As6+Mlgflni0bB8LjhWbIt+dZ6Bt4cSHOnAOnkMDOFwtrxJE6Eg1GQ2ux9nDVNv -rQkoOLznXrxMh/af0pcSo8kItDmkqbV/fi3Q7agpbcWc/4wTZOfO6lns4nb5s08oaUv3uF5Wc0s -ktNr6he6R3zSQ6YK5KZFzQdnEtGc4gwHWXZ9xt4JeANht3m4RNpMY89qZsZxmqoewYHuXQUAfl7 -W0DC3hoxOoLwSqL2bt2zMMeR8WAo51YY0cJnzAEETcnWIM6ealb5Osj3iSEknxRTley47SsODQ0 -maUUWj8wEjwIDAQAB ------END PUBLIC KEY----- - -$ openssl asn1parse -i < [PUBLIC KEY] - 0:d=0 hl=4 l= 290 cons: SEQUENCE - 4:d=1 hl=2 l= 13 cons: SEQUENCE - 6:d=2 hl=2 l= 9 prim: OBJECT :rsaEncryption - 17:d=2 hl=2 l= 0 prim: NULL - 19:d=1 hl=4 l= 271 prim: BIT STRING - - - ------BEGIN ALGORITHM----- -MEEGCSqGSIb3DQEBCjA0oA8wDQYJYIZIAWUDBAICBQChHDAaBgkqhkiG9w0BAQgwDQYJYIZIAWU -DBAICBQCiAwIBMA== ------END ALGORITHM----- - -$ openssl asn1parse -i < [ALGORITHM] - 0:d=0 hl=2 l= 65 cons: SEQUENCE - 2:d=1 hl=2 l= 9 prim: OBJECT :rsassaPss - 13:d=1 hl=2 l= 52 cons: SEQUENCE - 15:d=2 hl=2 l= 15 cons: cont [ 0 ] - 17:d=3 hl=2 l= 13 cons: SEQUENCE - 19:d=4 hl=2 l= 9 prim: OBJECT :sha384 - 30:d=4 hl=2 l= 0 prim: NULL - 32:d=2 hl=2 l= 28 cons: cont [ 1 ] - 34:d=3 hl=2 l= 26 cons: SEQUENCE - 36:d=4 hl=2 l= 9 prim: OBJECT :mgf1 - 47:d=4 hl=2 l= 13 cons: SEQUENCE - 49:d=5 hl=2 l= 9 prim: OBJECT :sha384 - 60:d=5 hl=2 l= 0 prim: NULL - 62:d=2 hl=2 l= 3 cons: cont [ 2 ] - 64:d=3 hl=2 l= 1 prim: INTEGER :30 - - - ------BEGIN DATA----- -TDrlz5dKOqfOQhirwHj00bsVlf+0WEe2qMe9l6SVr9SHB4Eow26r+aU7+pGZFp774O041xIeU2g -ZHYzNWBjGZQ== ------END DATA----- - - - ------BEGIN SIGNATURE----- -A4IBAQBvlL4AuwL3hEobMolBzR/0gzuJ9u4ATWEPO5uTiBtdJ5Nx9O6gFCrtZMwfEU9q4bzazKV -yWRSpn23GZjlmNYhFCNlfY3l6IlhxGEVz/YeOglrBR8hFbA17835jTmcCR09G6SZ7Wwm8NV7riw -woW15A1N2axuaAAcCxf9T48uehAmXrfApJygl2PWeKzzATUAuGzLLmQ0hNGVvUraxCJfiehtnMl -kWUiSZgjvmXKv6N2JtN8dHMHVEzPTBou4a25ozQIRAIGFvZYcDm5DW4CNJqFM1mTv2BEeOCW5hw -Bt60xm8kXOX4OGwgEyB/aHttWHPdAiFUoODo5j4MtcvajuWt ------END SIGNATURE----- - -$ openssl asn1parse -i < [SIGNATURE] - 0:d=0 hl=4 l= 257 prim: BIT STRING diff -Nru temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ours/rsa-pss-sha384-salt48.pem temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ours/rsa-pss-sha384-salt48.pem --- temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ours/rsa-pss-sha384-salt48.pem 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ours/rsa-pss-sha384-salt48.pem 1970-01-01 00:00:00.000000000 +0000 @@ -1,63 +0,0 @@ - - - - ------BEGIN PUBLIC KEY----- -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtVDcg1BMqPneiNBL5+mjEB5mxjJzgkm -ClZR5z1jNht+As6+Mlgflni0bB8LjhWbIt+dZ6Bt4cSHOnAOnkMDOFwtrxJE6Eg1GQ2ux9nDVNv -rQkoOLznXrxMh/af0pcSo8kItDmkqbV/fi3Q7agpbcWc/4wTZOfO6lns4nb5s08oaUv3uF5Wc0s -ktNr6he6R3zSQ6YK5KZFzQdnEtGc4gwHWXZ9xt4JeANht3m4RNpMY89qZsZxmqoewYHuXQUAfl7 -W0DC3hoxOoLwSqL2bt2zMMeR8WAo51YY0cJnzAEETcnWIM6ealb5Osj3iSEknxRTley47SsODQ0 -maUUWj8wEjwIDAQAB ------END PUBLIC KEY----- - -$ openssl asn1parse -i < [PUBLIC KEY] - 0:d=0 hl=4 l= 290 cons: SEQUENCE - 4:d=1 hl=2 l= 13 cons: SEQUENCE - 6:d=2 hl=2 l= 9 prim: OBJECT :rsaEncryption - 17:d=2 hl=2 l= 0 prim: NULL - 19:d=1 hl=4 l= 271 prim: BIT STRING - - - ------BEGIN ALGORITHM----- -MEEGCSqGSIb3DQEBCjA0oA8wDQYJYIZIAWUDBAICBQChHDAaBgkqhkiG9w0BAQgwDQYJYIZIAWU -DBAICBQCiAwIBMA== ------END ALGORITHM----- - -$ openssl asn1parse -i < [ALGORITHM] - 0:d=0 hl=2 l= 65 cons: SEQUENCE - 2:d=1 hl=2 l= 9 prim: OBJECT :rsassaPss - 13:d=1 hl=2 l= 52 cons: SEQUENCE - 15:d=2 hl=2 l= 15 cons: cont [ 0 ] - 17:d=3 hl=2 l= 13 cons: SEQUENCE - 19:d=4 hl=2 l= 9 prim: OBJECT :sha384 - 30:d=4 hl=2 l= 0 prim: NULL - 32:d=2 hl=2 l= 28 cons: cont [ 1 ] - 34:d=3 hl=2 l= 26 cons: SEQUENCE - 36:d=4 hl=2 l= 9 prim: OBJECT :mgf1 - 47:d=4 hl=2 l= 13 cons: SEQUENCE - 49:d=5 hl=2 l= 9 prim: OBJECT :sha384 - 60:d=5 hl=2 l= 0 prim: NULL - 62:d=2 hl=2 l= 3 cons: cont [ 2 ] - 64:d=3 hl=2 l= 1 prim: INTEGER :30 - - - ------BEGIN DATA----- -TDRlz5dKOqfOQhirwHj00bsVlf+0WEe2qMe9l6SVr9SHB4Eow26r+aU7+pGZFp774O041xIeU2g -ZHYzNWBjGZQ== ------END DATA----- - - - ------BEGIN SIGNATURE----- -A4IBAQBvlL4AuwL3hEobMolBzR/0gzuJ9u4ATWEPO5uTiBtdJ5Nx9O6gFCrtZMwfEU9q4bzazKV -yWRSpn23GZjlmNYhFCNlfY3l6IlhxGEVz/YeOglrBR8hFbA17835jTmcCR09G6SZ7Wwm8NV7riw -woW15A1N2axuaAAcCxf9T48uehAmXrfApJygl2PWeKzzATUAuGzLLmQ0hNGVvUraxCJfiehtnMl -kWUiSZgjvmXKv6N2JtN8dHMHVEzPTBou4a25ozQIRAIGFvZYcDm5DW4CNJqFM1mTv2BEeOCW5hw -Bt60xm8kXOX4OGwgEyB/aHttWHPdAiFUoODo5j4MtcvajuWt ------END SIGNATURE----- - -$ openssl asn1parse -i < [SIGNATURE] - 0:d=0 hl=4 l= 257 prim: BIT STRING diff -Nru temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ours/rsa-pss-sha512-salt64-corrupted-data.pem temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ours/rsa-pss-sha512-salt64-corrupted-data.pem --- temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ours/rsa-pss-sha512-salt64-corrupted-data.pem 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ours/rsa-pss-sha512-salt64-corrupted-data.pem 1970-01-01 00:00:00.000000000 +0000 @@ -1,63 +0,0 @@ -This has had DATA corrupted, so the signature is not valid. - - - ------BEGIN PUBLIC KEY----- -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtVDcg1BMqPneiNBL5+mjEB5mxjJzgkm -ClZR5z1jNht+As6+Mlgflni0bB8LjhWbIt+dZ6Bt4cSHOnAOnkMDOFwtrxJE6Eg1GQ2ux9nDVNv -rQkoOLznXrxMh/af0pcSo8kItDmkqbV/fi3Q7agpbcWc/4wTZOfO6lns4nb5s08oaUv3uF5Wc0s -ktNr6he6R3zSQ6YK5KZFzQdnEtGc4gwHWXZ9xt4JeANht3m4RNpMY89qZsZxmqoewYHuXQUAfl7 -W0DC3hoxOoLwSqL2bt2zMMeR8WAo51YY0cJnzAEETcnWIM6ealb5Osj3iSEknxRTley47SsODQ0 -maUUWj8wEjwIDAQAB ------END PUBLIC KEY----- - -$ openssl asn1parse -i < [PUBLIC KEY] - 0:d=0 hl=4 l= 290 cons: SEQUENCE - 4:d=1 hl=2 l= 13 cons: SEQUENCE - 6:d=2 hl=2 l= 9 prim: OBJECT :rsaEncryption - 17:d=2 hl=2 l= 0 prim: NULL - 19:d=1 hl=4 l= 271 prim: BIT STRING - - - ------BEGIN ALGORITHM----- -MEEGCSqGSIb3DQEBCjA0oA8wDQYJYIZIAWUDBAIDBQChHDAaBgkqhkiG9w0BAQgwDQYJYIZIAWU -DBAIDBQCiAwIBQA== ------END ALGORITHM----- - -$ openssl asn1parse -i < [ALGORITHM] - 0:d=0 hl=2 l= 65 cons: SEQUENCE - 2:d=1 hl=2 l= 9 prim: OBJECT :rsassaPss - 13:d=1 hl=2 l= 52 cons: SEQUENCE - 15:d=2 hl=2 l= 15 cons: cont [ 0 ] - 17:d=3 hl=2 l= 13 cons: SEQUENCE - 19:d=4 hl=2 l= 9 prim: OBJECT :sha512 - 30:d=4 hl=2 l= 0 prim: NULL - 32:d=2 hl=2 l= 28 cons: cont [ 1 ] - 34:d=3 hl=2 l= 26 cons: SEQUENCE - 36:d=4 hl=2 l= 9 prim: OBJECT :mgf1 - 47:d=4 hl=2 l= 13 cons: SEQUENCE - 49:d=5 hl=2 l= 9 prim: OBJECT :sha512 - 60:d=5 hl=2 l= 0 prim: NULL - 62:d=2 hl=2 l= 3 cons: cont [ 2 ] - 64:d=3 hl=2 l= 1 prim: INTEGER :40 - - - ------BEGIN DATA----- -BENGYY+GrDsvawb08kP/OZ0iWbG5yBlJpCIJ1YLPfTCjEouvBzwAkWpUEsI3zk0N8+xcMyJ3qOi -pIsX4YnFfPw== ------END DATA----- - - - ------BEGIN SIGNATURE----- -A4IBAQBPA1K787NaEycdAHDfil1/F2imI9PcVD5ZuloBz9Qj1q4ZfdZ9PMagunDBVRQoBr1VDhI -6VkDfyQvhKebIbSsfk/qJoNZGCZtsKhXcGm5ZI2+fUbbMW7EwlKle8SqXCHRAIICND/qwundcqp -kLNHOqOK8GRUYHnJcMmQbMCBUx9aw3IRu2LRp6FtBwA16stpSat/NlX+aH79f1B/uoFpDVzG7Kw -oqmAuv81vOVQSCNTn4MrCyxmJTLqbk6frXN7nRF+SQOPksUwXXYgpzGyFhrwgUHwkc3skNx/jOT -fpWnvjOUVbi80Sa9i7EIOcmt4IP4a3BRPWT/MTYDDPADIgVf ------END SIGNATURE----- - -$ openssl asn1parse -i < [SIGNATURE] - 0:d=0 hl=4 l= 257 prim: BIT STRING diff -Nru temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ours/rsa-pss-sha512-salt64.pem temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ours/rsa-pss-sha512-salt64.pem --- temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ours/rsa-pss-sha512-salt64.pem 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/ours/rsa-pss-sha512-salt64.pem 1970-01-01 00:00:00.000000000 +0000 @@ -1,63 +0,0 @@ - - - - ------BEGIN PUBLIC KEY----- -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtVDcg1BMqPneiNBL5+mjEB5mxjJzgkm -ClZR5z1jNht+As6+Mlgflni0bB8LjhWbIt+dZ6Bt4cSHOnAOnkMDOFwtrxJE6Eg1GQ2ux9nDVNv -rQkoOLznXrxMh/af0pcSo8kItDmkqbV/fi3Q7agpbcWc/4wTZOfO6lns4nb5s08oaUv3uF5Wc0s -ktNr6he6R3zSQ6YK5KZFzQdnEtGc4gwHWXZ9xt4JeANht3m4RNpMY89qZsZxmqoewYHuXQUAfl7 -W0DC3hoxOoLwSqL2bt2zMMeR8WAo51YY0cJnzAEETcnWIM6ealb5Osj3iSEknxRTley47SsODQ0 -maUUWj8wEjwIDAQAB ------END PUBLIC KEY----- - -$ openssl asn1parse -i < [PUBLIC KEY] - 0:d=0 hl=4 l= 290 cons: SEQUENCE - 4:d=1 hl=2 l= 13 cons: SEQUENCE - 6:d=2 hl=2 l= 9 prim: OBJECT :rsaEncryption - 17:d=2 hl=2 l= 0 prim: NULL - 19:d=1 hl=4 l= 271 prim: BIT STRING - - - ------BEGIN ALGORITHM----- -MEEGCSqGSIb3DQEBCjA0oA8wDQYJYIZIAWUDBAIDBQChHDAaBgkqhkiG9w0BAQgwDQYJYIZIAWU -DBAIDBQCiAwIBQA== ------END ALGORITHM----- - -$ openssl asn1parse -i < [ALGORITHM] - 0:d=0 hl=2 l= 65 cons: SEQUENCE - 2:d=1 hl=2 l= 9 prim: OBJECT :rsassaPss - 13:d=1 hl=2 l= 52 cons: SEQUENCE - 15:d=2 hl=2 l= 15 cons: cont [ 0 ] - 17:d=3 hl=2 l= 13 cons: SEQUENCE - 19:d=4 hl=2 l= 9 prim: OBJECT :sha512 - 30:d=4 hl=2 l= 0 prim: NULL - 32:d=2 hl=2 l= 28 cons: cont [ 1 ] - 34:d=3 hl=2 l= 26 cons: SEQUENCE - 36:d=4 hl=2 l= 9 prim: OBJECT :mgf1 - 47:d=4 hl=2 l= 13 cons: SEQUENCE - 49:d=5 hl=2 l= 9 prim: OBJECT :sha512 - 60:d=5 hl=2 l= 0 prim: NULL - 62:d=2 hl=2 l= 3 cons: cont [ 2 ] - 64:d=3 hl=2 l= 1 prim: INTEGER :40 - - - ------BEGIN DATA----- -BEnGYY+GrDsvawb08kP/OZ0iWbG5yBlJpCIJ1YLPfTCjEouvBzwAkWpUEsI3zk0N8+xcMyJ3qOi -pIsX4YnFfPw== ------END DATA----- - - - ------BEGIN SIGNATURE----- -A4IBAQBPA1K787NaEycdAHDfil1/F2imI9PcVD5ZuloBz9Qj1q4ZfdZ9PMagunDBVRQoBr1VDhI -6VkDfyQvhKebIbSsfk/qJoNZGCZtsKhXcGm5ZI2+fUbbMW7EwlKle8SqXCHRAIICND/qwundcqp -kLNHOqOK8GRUYHnJcMmQbMCBUx9aw3IRu2LRp6FtBwA16stpSat/NlX+aH79f1B/uoFpDVzG7Kw -oqmAuv81vOVQSCNTn4MrCyxmJTLqbk6frXN7nRF+SQOPksUwXXYgpzGyFhrwgUHwkc3skNx/jOT -fpWnvjOUVbi80Sa9i7EIOcmt4IP4a3BRPWT/MTYDDPADIgVf ------END SIGNATURE----- - -$ openssl asn1parse -i < [SIGNATURE] - 0:d=0 hl=4 l= 257 prim: BIT STRING diff -Nru temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/README temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/README --- temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/README 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/README 1970-01-01 00:00:00.000000000 +0000 @@ -1,35 +0,0 @@ -This directory contains test data for testing net::VerifySignedData(). - -When adding or changing test data, run the script - $ python annotate_test_data.py - -This script will apply a uniform formatting. For instance it will add a -comment showing what the parsed ASN.1 looks like, and reformat the base64 to -have consistent line breaks. - -The general format for the test files is as follows: - - - - - -----BEGIN PUBLIC KEY----- - - -----END PUBLIC KEY----- - - -----BEGIN ALGORITHM----- - - -----END ALGORITHM----- - - -----BEGIN DATA----- - - -----END DATA----- - - -----BEGIN SIGNATURE----- - - -----END SIGNATURE----- - - -Comments for a PEM block should be placed immediately below that block. -The script will also insert a comment after the block describing its parsed -ASN.1 structure (your extra comments need to be above the script-generated -comments or they will be stripped). diff -Nru temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa2048-pkcs1-sha512.pem temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa2048-pkcs1-sha512.pem --- temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa2048-pkcs1-sha512.pem 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa2048-pkcs1-sha512.pem 1970-01-01 00:00:00.000000000 +0000 @@ -1,93 +0,0 @@ -This test data was produced by creating a self-signed RSA cert using OpenSSL, -and then extracting the relevant fields. - -It uses RSA PKCS#1 v1.5 with SHA-512 and a 2048-bit key. - -(1) Generate self-signed certificate - - openssl genrsa -out rsa_key.pem 2048 - openssl req -new -key rsa_key.pem -x509 -nodes -days 365 -sha512 -out cert.pem - -(2) Extract public key - - openssl x509 -in cert.pem -pubkey -noout > pubkey.pem - cat pubkey.pem - -(3) Extract signed data (tbsCertificate) - - openssl asn1parse -in cert.pem -out tbs -noout -strparse 4 - base64 tbs - -(4) Extract signature algorithm - - # Find the offset of the signature algorithm near the end (589 in this case) - openssl asn1parse -in cert.pem - - openssl asn1parse -in cert.pem -out alg -noout -strparse 589 - base64 alg - -(5) Extract the signature - - # Find the final offset of BIT STRING (506 in this case) - openssl asn1parse -in cert.pem - - openssl asn1parse -in cert.pem -out sig -noout -strparse 506 - base64 sig - - - ------BEGIN PUBLIC KEY----- -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzcu2shJRrXFAwMkf30y2AY1zIg9VF/h -egYcejzdR2AzUb8vU2TXld2i8pp44l+DrvtqmzS7G+yxx3uOx+zsoqBaUT0c9HfkbE+IRmcLkQF -vYpSpm6Eu8OS14CSmEtiR91Et8LR0+bd0Gn3pgmb+epFJBaBPeDSiI/smqKCs7yP04+tS4Q4r47 -G04LhSp4/hmqH32b4Gcm9nsihHV9FfPfVdxDQUEJp3AgyBPwhPZEAyhoQS73TjjxXHqJRSz37Sl -ueMVPuNncqbT4nAMKz25J1CtRlQh21uZzfY2QRP3m6rAZquQUos1febC6A7qmhQljWKKmXtfVY+ -fAamstdHrWwIDAQAB ------END PUBLIC KEY----- - -$ openssl asn1parse -i < [PUBLIC KEY] - 0:d=0 hl=4 l= 290 cons: SEQUENCE - 4:d=1 hl=2 l= 13 cons: SEQUENCE - 6:d=2 hl=2 l= 9 prim: OBJECT :rsaEncryption - 17:d=2 hl=2 l= 0 prim: NULL - 19:d=1 hl=4 l= 271 prim: BIT STRING - - - ------BEGIN ALGORITHM----- -MA0GCSqGSIb3DQEBDQUA ------END ALGORITHM----- - -$ openssl asn1parse -i < [ALGORITHM] - 0:d=0 hl=2 l= 13 cons: SEQUENCE - 2:d=1 hl=2 l= 9 prim: OBJECT :sha512WithRSAEncryption - 13:d=1 hl=2 l= 0 prim: NULL - - - ------BEGIN DATA----- -MIICRaADAgECAgkA7jWRLkwHvHswDQYJKoZIhvcNAQENBQAwRTELMAkGA1UEBhMCQVUxEzARBgN -VBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0xNT -A3MjgwMjIyMzFaFw0xNjA3MjcwMjIyMzFaMEUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lL -VN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwggEiMA0GCSqGSIb3DQEB -AQUAA4IBDwAwggEKAoIBAQDNy7ayElGtcUDAyR/fTLYBjXMiD1UX+F6Bhx6PN1HYDNRvy9TZNeV -3aLymnjiX4Ou+2qbNLsb7LHHe47H7OyioFpRPRz0d+RsT4hGZwuRAW9ilKmboS7w5LXgJKYS2JH -3US3wtHT5t3QafemCZv56kUkFoE94NKIj+yaooKzvI/Tj61LhDivjsbTguFKnj+GaoffZvgZyb2 -eyKEdX0V899V3ENBQQmncCDIE/CE9kQDKGhBLvdOOPFceolFLPftKW54xU+42dyptPicAwrPbkn -UK1GVCHbW5nN9jZBE/ebqsBmq5BSizV95sLoDuqaFCWNYoqZe19Vj58Bqay10etbAgMBAAGjUDB -OMB0GA1UdDgQWBBRsCPajkEscZM6SpLbNTa/7dY5azzAfBgNVHSMEGDAWgBRsCPajkEscZM6SpL -bNTa/7dY5azzAMBgNVHRMEBTADAQH/ ------END DATA----- - - - ------BEGIN SIGNATURE----- -A4IBAQAhKSNq+X/CfzhtNsMo6MJpTBjJBV5fhHerIZr6e3ozCTBCR29vYsVnJ4/6i5lL1pNeOhM -ldthnuSlMzTS1Zme1OqRWB3U8QmwCFwhDxW/i4fdT8kxDAmELNp4z0GcXbe27V895PE0R/m8P47 -B6xbra+SQlEMW12K1EndUqrO6vgLbobV14mveWdgc0KIOnDKgsTHV8NTV1w3qtp1ujfvizYfBZu -yyMOA1yZPDpREZtClro7lufwDQ7+LgSdtNLMDAMzapfIjAEPVNVLmJzMgzaHqMsZM8gP8vWAdfc -R4mCmWXVotrM6d1rjJGdRADAONYCC4/+d1IMkVGoVfpaej6I ------END SIGNATURE----- - -$ openssl asn1parse -i < [SIGNATURE] - 0:d=0 hl=4 l= 257 prim: BIT STRING diff -Nru temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pkcs1-sha1-bad-key-der-length.pem temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pkcs1-sha1-bad-key-der-length.pem --- temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pkcs1-sha1-bad-key-der-length.pem 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pkcs1-sha1-bad-key-der-length.pem 1970-01-01 00:00:00.000000000 +0000 @@ -1,44 +0,0 @@ -Same test as rsa-pkcs1-sha1.pem except the length of the first SEQUENCE has -been increased by 2 (which makes it invalid). - - - ------BEGIN PUBLIC KEY----- -MIOfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQClbkoOcBAXWJpRh9x+qEHRVvLsDjatUqRN/rH -mH3rZkdjFEFb/7bFitMDyg6EqiKOU3/Umq3KRy7MHzqv84LHf1c2VCAltWyuLbfXWce9jd8CSHL -I8Jwpw4lmOb/idGfEFrMLT8Ms18pKA4Thrb2TE7yLh4fINDOjP+yJJvZohNwIDAQAB ------END PUBLIC KEY----- - -$ openssl asn1parse -i < [PUBLIC KEY] -Error in encoding - - - ------BEGIN ALGORITHM----- -MA0GCSqGSIb3DQEBBQUA ------END ALGORITHM----- - -$ openssl asn1parse -i < [ALGORITHM] - 0:d=0 hl=2 l= 13 cons: SEQUENCE - 2:d=1 hl=2 l= 9 prim: OBJECT :sha1WithRSAEncryption - 13:d=1 hl=2 l= 0 prim: NULL - - - ------BEGIN DATA----- -zch9oiPXht87ReC7vHITJtHuKvgGzDFUdcxvDZxm4bYjcdRc4jkuGskoRMMQEC8Vag2NUsH0xAu -jqmUJV4bLdpdXplY7qVj+0LzJhOi1F6PV9RWyO4pB50qoZ2k/kN+wYabobfqu5kRywA5fIJRXKc -vr538Gznjgj0CY+6QfnWGTwDF+i2DUtghKy0LSnjgIo7w3LYXjMRcPy/fMctC3HClmSLOk0Q9BY -pXQgHqmJcqydE/Z6o/SI8QlNwKYKL0WvgJUbxMP0uM7k20mduCK7RtzMYt1CgFn0A== ------END DATA----- - - - ------BEGIN SIGNATURE----- -A4GBAGvDoGZWhCkwokfjDVhktNgZI2unxollhirX28TiSvKOhrtTHwM1i+X7dHd8YIb4UMrviT8 -Nb8wtDJHsATaTtOoAuAzUmqxOy1+JEa/lOa2kqPOCPR0T5HLRSQVHxlnHYX89JAh9228rcglhZ/ -wJfKsY6aRY/LY0zc6O41iUxITX ------END SIGNATURE----- - -$ openssl asn1parse -i < [SIGNATURE] - 0:d=0 hl=3 l= 129 prim: BIT STRING diff -Nru temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pkcs1-sha1-bad-key-der-null.pem temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pkcs1-sha1-bad-key-der-null.pem --- temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pkcs1-sha1-bad-key-der-null.pem 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pkcs1-sha1-bad-key-der-null.pem 1970-01-01 00:00:00.000000000 +0000 @@ -1,52 +0,0 @@ -Same test as rsa-pkcs1-sha1.pem except an extra NULL (0x05, 0x00) has been -appended to the SPKI. - -The DER can still be parsed, however it should fail due to the unconsumed data -at the end. - - - ------BEGIN PUBLIC KEY----- -MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQClbkoOcBAXWJpRh9x+qEHRVvLsDjatUqRN/rH -mH3rZkdjFEFb/7bFitMDyg6EqiKOU3/Umq3KRy7MHzqv84LHf1c2VCAltWyuLbfXWce9jd8CSHL -I8Jwpw4lmOb/idGfEFrMLT8Ms18pKA4Thrb2TE7yLh4fINDOjP+yJJvZohNwIDAQABBQA= ------END PUBLIC KEY----- - -$ openssl asn1parse -i < [PUBLIC KEY] - 0:d=0 hl=3 l= 159 cons: SEQUENCE - 3:d=1 hl=2 l= 13 cons: SEQUENCE - 5:d=2 hl=2 l= 9 prim: OBJECT :rsaEncryption - 16:d=2 hl=2 l= 0 prim: NULL - 18:d=1 hl=3 l= 141 prim: BIT STRING - 162:d=0 hl=2 l= 0 prim: NULL - - - ------BEGIN ALGORITHM----- -MA0GCSqGSIb3DQEBBQUA ------END ALGORITHM----- - -$ openssl asn1parse -i < [ALGORITHM] - 0:d=0 hl=2 l= 13 cons: SEQUENCE - 2:d=1 hl=2 l= 9 prim: OBJECT :sha1WithRSAEncryption - 13:d=1 hl=2 l= 0 prim: NULL - - - ------BEGIN DATA----- -zch9oiPXht87ReC7vHITJtHuKvgGzDFUdcxvDZxm4bYjcdRc4jkuGskoRMMQEC8Vag2NUsH0xAu -jqmUJV4bLdpdXplY7qVj+0LzJhOi1F6PV9RWyO4pB50qoZ2k/kN+wYabobfqu5kRywA5fIJRXKc -vr538Gznjgj0CY+6QfnWGTwDF+i2DUtghKy0LSnjgIo7w3LYXjMRcPy/fMctC3HClmSLOk0Q9BY -pXQgHqmJcqydE/Z6o/SI8QlNwKYKL0WvgJUbxMP0uM7k20mduCK7RtzMYt1CgFn0A== ------END DATA----- - - - ------BEGIN SIGNATURE----- -A4GBAGvDoGZWhCkwokfjDVhktNgZI2unxollhirX28TiSvKOhrtTHwM1i+X7dHd8YIb4UMrviT8 -Nb8wtDJHsATaTtOoAuAzUmqxOy1+JEa/lOa2kqPOCPR0T5HLRSQVHxlnHYX89JAh9228rcglhZ/ -wJfKsY6aRY/LY0zc6O41iUxITX ------END SIGNATURE----- - -$ openssl asn1parse -i < [SIGNATURE] - 0:d=0 hl=3 l= 129 prim: BIT STRING diff -Nru temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pkcs1-sha1-key-params-absent.pem temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pkcs1-sha1-key-params-absent.pem --- temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pkcs1-sha1-key-params-absent.pem 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pkcs1-sha1-key-params-absent.pem 1970-01-01 00:00:00.000000000 +0000 @@ -1,49 +0,0 @@ -Same test as rsa-pkcs1-sha1.pem, except the SPKI has been modified so the -algorithm parameters are absent rather than NULL. - -This should fail because RFC 3279 says the parameters MUST be NULL. - - - ------BEGIN PUBLIC KEY----- -MIGdMAsGCSqGSIb3DQEBAQOBjQAwgYkCgYEApW5KDnAQF1iaUYfcfqhB0Vby7A42rVKkTf6x5h9 -62ZHYxRBW/+2xYrTA8oOhKoijlN/1JqtykcuzB86r/OCx39XNlQgJbVsri2311nHvY3fAkhyyPC -cKcOJZjm/4nRnxBazC0/DLNfKSgOE4a29kxO8i4eHyDQzoz/siSb2aITcCAwEAAQ== ------END PUBLIC KEY----- - -$ openssl asn1parse -i < [PUBLIC KEY] - 0:d=0 hl=3 l= 157 cons: SEQUENCE - 3:d=1 hl=2 l= 11 cons: SEQUENCE - 5:d=2 hl=2 l= 9 prim: OBJECT :rsaEncryption - 16:d=1 hl=3 l= 141 prim: BIT STRING - - - ------BEGIN ALGORITHM----- -MA0GCSqGSIb3DQEBBQUA ------END ALGORITHM----- - -$ openssl asn1parse -i < [ALGORITHM] - 0:d=0 hl=2 l= 13 cons: SEQUENCE - 2:d=1 hl=2 l= 9 prim: OBJECT :sha1WithRSAEncryption - 13:d=1 hl=2 l= 0 prim: NULL - - - ------BEGIN DATA----- -zch9oiPXht87ReC7vHITJtHuKvgGzDFUdcxvDZxm4bYjcdRc4jkuGskoRMMQEC8Vag2NUsH0xAu -jqmUJV4bLdpdXplY7qVj+0LzJhOi1F6PV9RWyO4pB50qoZ2k/kN+wYabobfqu5kRywA5fIJRXKc -vr538Gznjgj0CY+6QfnWGTwDF+i2DUtghKy0LSnjgIo7w3LYXjMRcPy/fMctC3HClmSLOk0Q9BY -pXQgHqmJcqydE/Z6o/SI8QlNwKYKL0WvgJUbxMP0uM7k20mduCK7RtzMYt1CgFn0A== ------END DATA----- - - - ------BEGIN SIGNATURE----- -A4GBAGvDoGZWhCkwokfjDVhktNgZI2unxollhirX28TiSvKOhrtTHwM1i+X7dHd8YIb4UMrviT8 -Nb8wtDJHsATaTtOoAuAzUmqxOy1+JEa/lOa2kqPOCPR0T5HLRSQVHxlnHYX89JAh9228rcglhZ/ -wJfKsY6aRY/LY0zc6O41iUxITX ------END SIGNATURE----- - -$ openssl asn1parse -i < [SIGNATURE] - 0:d=0 hl=3 l= 129 prim: BIT STRING diff -Nru temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pkcs1-sha1.pem temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pkcs1-sha1.pem --- temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pkcs1-sha1.pem 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pkcs1-sha1.pem 1970-01-01 00:00:00.000000000 +0000 @@ -1,53 +0,0 @@ -The key, message, and signature come from Example 1 of: -ftp://ftp.rsa.com/pub/rsalabs/tmp/pkcs1v15sign-vectors.txt - -(The algorithm DER was synthesized to match, and the signature enclosed in a BIT STRING). - -It uses an RSA key with modulus length of 1024 bits, PKCS#1 v1.5 padding, and -SHA-1 as the digest. - - - ------BEGIN PUBLIC KEY----- -MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQClbkoOcBAXWJpRh9x+qEHRVvLsDjatUqRN/rH -mH3rZkdjFEFb/7bFitMDyg6EqiKOU3/Umq3KRy7MHzqv84LHf1c2VCAltWyuLbfXWce9jd8CSHL -I8Jwpw4lmOb/idGfEFrMLT8Ms18pKA4Thrb2TE7yLh4fINDOjP+yJJvZohNwIDAQAB ------END PUBLIC KEY----- - -$ openssl asn1parse -i < [PUBLIC KEY] - 0:d=0 hl=3 l= 159 cons: SEQUENCE - 3:d=1 hl=2 l= 13 cons: SEQUENCE - 5:d=2 hl=2 l= 9 prim: OBJECT :rsaEncryption - 16:d=2 hl=2 l= 0 prim: NULL - 18:d=1 hl=3 l= 141 prim: BIT STRING - - - ------BEGIN ALGORITHM----- -MA0GCSqGSIb3DQEBBQUA ------END ALGORITHM----- - -$ openssl asn1parse -i < [ALGORITHM] - 0:d=0 hl=2 l= 13 cons: SEQUENCE - 2:d=1 hl=2 l= 9 prim: OBJECT :sha1WithRSAEncryption - 13:d=1 hl=2 l= 0 prim: NULL - - - ------BEGIN DATA----- -zch9oiPXht87ReC7vHITJtHuKvgGzDFUdcxvDZxm4bYjcdRc4jkuGskoRMMQEC8Vag2NUsH0xAu -jqmUJV4bLdpdXplY7qVj+0LzJhOi1F6PV9RWyO4pB50qoZ2k/kN+wYabobfqu5kRywA5fIJRXKc -vr538Gznjgj0CY+6QfnWGTwDF+i2DUtghKy0LSnjgIo7w3LYXjMRcPy/fMctC3HClmSLOk0Q9BY -pXQgHqmJcqydE/Z6o/SI8QlNwKYKL0WvgJUbxMP0uM7k20mduCK7RtzMYt1CgFn0A== ------END DATA----- - - - ------BEGIN SIGNATURE----- -A4GBAGvDoGZWhCkwokfjDVhktNgZI2unxollhirX28TiSvKOhrtTHwM1i+X7dHd8YIb4UMrviT8 -Nb8wtDJHsATaTtOoAuAzUmqxOy1+JEa/lOa2kqPOCPR0T5HLRSQVHxlnHYX89JAh9228rcglhZ/ -wJfKsY6aRY/LY0zc6O41iUxITX ------END SIGNATURE----- - -$ openssl asn1parse -i < [SIGNATURE] - 0:d=0 hl=3 l= 129 prim: BIT STRING diff -Nru temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pkcs1-sha1-using-pss-key-no-params.pem temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pkcs1-sha1-using-pss-key-no-params.pem --- temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pkcs1-sha1-using-pss-key-no-params.pem 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pkcs1-sha1-using-pss-key-no-params.pem 1970-01-01 00:00:00.000000000 +0000 @@ -1,51 +0,0 @@ -This is the same test as rsa-pkcs1-sha1.pem, except the SPKI has been modified -so that the key algorithm is rsaPss (1.2.840.113549.1.1.10) with absent -parameters. - -Subsequently this should fail, as a PSS key should not be used with a signature -algorithm for PKCS#1 v1.5. - - - ------BEGIN PUBLIC KEY----- -MIGdMAsGCSqGSIb3DQEBCgOBjQAwgYkCgYEApW5KDnAQF1iaUYfcfqhB0Vby7A42rVKkTf6x5h9 -62ZHYxRBW/+2xYrTA8oOhKoijlN/1JqtykcuzB86r/OCx39XNlQgJbVsri2311nHvY3fAkhyyPC -cKcOJZjm/4nRnxBazC0/DLNfKSgOE4a29kxO8i4eHyDQzoz/siSb2aITcCAwEAAQ== ------END PUBLIC KEY----- - -$ openssl asn1parse -i < [PUBLIC KEY] - 0:d=0 hl=3 l= 157 cons: SEQUENCE - 3:d=1 hl=2 l= 11 cons: SEQUENCE - 5:d=2 hl=2 l= 9 prim: OBJECT :rsassaPss - 16:d=1 hl=3 l= 141 prim: BIT STRING - - - ------BEGIN ALGORITHM----- -MA0GCSqGSIb3DQEBBQUA ------END ALGORITHM----- - -$ openssl asn1parse -i < [ALGORITHM] - 0:d=0 hl=2 l= 13 cons: SEQUENCE - 2:d=1 hl=2 l= 9 prim: OBJECT :sha1WithRSAEncryption - 13:d=1 hl=2 l= 0 prim: NULL - - - ------BEGIN DATA----- -zch9oiPXht87ReC7vHITJtHuKvgGzDFUdcxvDZxm4bYjcdRc4jkuGskoRMMQEC8Vag2NUsH0xAu -jqmUJV4bLdpdXplY7qVj+0LzJhOi1F6PV9RWyO4pB50qoZ2k/kN+wYabobfqu5kRywA5fIJRXKc -vr538Gznjgj0CY+6QfnWGTwDF+i2DUtghKy0LSnjgIo7w3LYXjMRcPy/fMctC3HClmSLOk0Q9BY -pXQgHqmJcqydE/Z6o/SI8QlNwKYKL0WvgJUbxMP0uM7k20mduCK7RtzMYt1CgFn0A== ------END DATA----- - - - ------BEGIN SIGNATURE----- -A4GBAGvDoGZWhCkwokfjDVhktNgZI2unxollhirX28TiSvKOhrtTHwM1i+X7dHd8YIb4UMrviT8 -Nb8wtDJHsATaTtOoAuAzUmqxOy1+JEa/lOa2kqPOCPR0T5HLRSQVHxlnHYX89JAh9228rcglhZ/ -wJfKsY6aRY/LY0zc6O41iUxITX ------END SIGNATURE----- - -$ openssl asn1parse -i < [SIGNATURE] - 0:d=0 hl=3 l= 129 prim: BIT STRING diff -Nru temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pkcs1-sha1-wrong-algorithm.pem temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pkcs1-sha1-wrong-algorithm.pem --- temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pkcs1-sha1-wrong-algorithm.pem 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pkcs1-sha1-wrong-algorithm.pem 1970-01-01 00:00:00.000000000 +0000 @@ -1,48 +0,0 @@ -This is the same as rsa-pkcs1-sha1.pem, however the ALGORITHM has been change -to have SHA256 instead of SHA1. Using this algorithm verification should fail. - - - ------BEGIN PUBLIC KEY----- -MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQClbkoOcBAXWJpRh9x+qEHRVvLsDjatUqRN/rH -mH3rZkdjFEFb/7bFitMDyg6EqiKOU3/Umq3KRy7MHzqv84LHf1c2VCAltWyuLbfXWce9jd8CSHL -I8Jwpw4lmOb/idGfEFrMLT8Ms18pKA4Thrb2TE7yLh4fINDOjP+yJJvZohNwIDAQAB ------END PUBLIC KEY----- - -$ openssl asn1parse -i < [PUBLIC KEY] - 0:d=0 hl=3 l= 159 cons: SEQUENCE - 3:d=1 hl=2 l= 13 cons: SEQUENCE - 5:d=2 hl=2 l= 9 prim: OBJECT :rsaEncryption - 16:d=2 hl=2 l= 0 prim: NULL - 18:d=1 hl=3 l= 141 prim: BIT STRING - - - ------BEGIN ALGORITHM----- -MA0GCSqGSIb3DQEBCwUA ------END ALGORITHM----- - -$ openssl asn1parse -i < [ALGORITHM] - 0:d=0 hl=2 l= 13 cons: SEQUENCE - 2:d=1 hl=2 l= 9 prim: OBJECT :sha256WithRSAEncryption - 13:d=1 hl=2 l= 0 prim: NULL - - - ------BEGIN DATA----- -zch9oiPXht87ReC7vHITJtHuKvgGzDFUdcxvDZxm4bYjcdRc4jkuGskoRMMQEC8Vag2NUsH0xAu -jqmUJV4bLdpdXplY7qVj+0LzJhOi1F6PV9RWyO4pB50qoZ2k/kN+wYabobfqu5kRywA5fIJRXKc -vr538Gznjgj0CY+6QfnWGTwDF+i2DUtghKy0LSnjgIo7w3LYXjMRcPy/fMctC3HClmSLOk0Q9BY -pXQgHqmJcqydE/Z6o/SI8QlNwKYKL0WvgJUbxMP0uM7k20mduCK7RtzMYt1CgFn0A== ------END DATA----- - - - ------BEGIN SIGNATURE----- -A4GBAGvDoGZWhCkwokfjDVhktNgZI2unxollhirX28TiSvKOhrtTHwM1i+X7dHd8YIb4UMrviT8 -Nb8wtDJHsATaTtOoAuAzUmqxOy1+JEa/lOa2kqPOCPR0T5HLRSQVHxlnHYX89JAh9228rcglhZ/ -wJfKsY6aRY/LY0zc6O41iUxITX ------END SIGNATURE----- - -$ openssl asn1parse -i < [SIGNATURE] - 0:d=0 hl=3 l= 129 prim: BIT STRING diff -Nru temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pkcs1-sha256-key-encoded-ber.pem temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pkcs1-sha256-key-encoded-ber.pem --- temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pkcs1-sha256-key-encoded-ber.pem 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pkcs1-sha256-key-encoded-ber.pem 1970-01-01 00:00:00.000000000 +0000 @@ -1,62 +0,0 @@ -This is the same test as rsa-pkcs1-sha256.pem except the SPKI has been encoded -using a non-minimal length for the outtermost SEQUENCE. - -Under DER, the tag-length-value encodings should be minimal and hence this should fail. - -Specifically the SPKI start was changed from: - 30 81 9f -To: - 30 82 00 9f - -(the length of 0x9F is being expressed using 2 bytes instead of 1) - - - ------BEGIN PUBLIC KEY----- -MIIAnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAqkfgdjI9YqzadSZ2Ns0CEEUD8+8m7OplIx0 -94X+QD8mooNrunwT04asbLIINGL4qiI/+9IVSvyV3Kj9c4EeQIbANGoJ8AI3wf6MOBB/txxGFed -qqcTffKVMQvtZdoYFbZ/MQkvyRsoyvunb/pWcN4sSaF9kY1bXSeP3J99fBIYUCAwEAAQ== ------END PUBLIC KEY----- - -$ openssl asn1parse -i < [PUBLIC KEY] - 0:d=0 hl=4 l= 159 cons: SEQUENCE - 4:d=1 hl=2 l= 13 cons: SEQUENCE - 6:d=2 hl=2 l= 9 prim: OBJECT :rsaEncryption - 17:d=2 hl=2 l= 0 prim: NULL - 19:d=1 hl=3 l= 141 prim: BIT STRING - - - ------BEGIN ALGORITHM----- -MA0GCSqGSIb3DQEBCwUA ------END ALGORITHM----- - -$ openssl asn1parse -i < [ALGORITHM] - 0:d=0 hl=2 l= 13 cons: SEQUENCE - 2:d=1 hl=2 l= 9 prim: OBJECT :sha256WithRSAEncryption - 13:d=1 hl=2 l= 0 prim: NULL - - - ------BEGIN DATA----- -MIIB46ADAgECAgkA3l4tFOVii0UwDQYJKoZIhvcNAQELBQAwVjELMAkGA1UEBhMCQVUxEzARBgN -VBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEPMA0GA1 -UEAwwGTXkga2V5MB4XDTE1MDcwMjE3MDYzOVoXDTE2MDcwMTE3MDYzOVowVjELMAkGA1UEBhMCQ -VUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0 -ZDEPMA0GA1UEAwwGTXkga2V5MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCqR+B2Mj1irNp -1JnY2zQIQRQPz7ybs6mUjHT3hf5APyaig2u6fBPThqxssgg0YviqIj/70hVK/JXcqP1zgR5AhsA -0agnwAjfB/ow4EH+3HEYV52qpxN98pUxC+1l2hgVtn8xCS/JGyjK+6dv+lZw3ixJoX2RjVtdJ4/ -cn318EhhQIDAQABo1AwTjAdBgNVHQ4EFgQUzQBVKTEknyLndWd2HTsBdTKvyikwHwYDVR0jBBgw -FoAUzQBVKTEknyLndWd2HTsBdTKvyikwDAYDVR0TBAUwAwEB/w== ------END DATA----- - - - ------BEGIN SIGNATURE----- -A4GBADrHSmFSJw/Gv7hs5PNzpaJwAri/sitarIZfzN/SjR+n8L8yeTEoiDb1+BkxlFvXvPHTaOK -oO3WlslNNOxh1W5/JkYYGOUkCcyIjnln6qS560imcr3VNjomT/M8M2Iss+rJiKau1TRuaP7H8i6 -+Gqf3saGdr8/LnvFAdNQvkalQt ------END SIGNATURE----- - -$ openssl asn1parse -i < [SIGNATURE] - 0:d=0 hl=3 l= 129 prim: BIT STRING diff -Nru temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pkcs1-sha256.pem temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pkcs1-sha256.pem --- temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pkcs1-sha256.pem 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pkcs1-sha256.pem 1970-01-01 00:00:00.000000000 +0000 @@ -1,86 +0,0 @@ -This test data was produced by creating a self-signed EC cert using OpenSSL, -and then extracting the relevant fields. - -It uses RSA PKCS#1 v1.5 with SHA-256 and a 1024-bit key. - -(1) Generate self-signed certificate - - openssl genrsa -out rsa_key.pem 1024 - openssl req -new -key rsa_key.pem -x509 -nodes -days 365 -out cert.pem - -(2) Extract public key - - openssl x509 -in cert.pem -pubkey -noout > pubkey.pem - cat pubkey.pem - -(3) Extract signed data (tbsCertificate) - - openssl asn1parse -in cert.pem -out tbs -noout -strparse 4 - base64 tbs - -(4) Extract signature algorithm - - # Find the offset of the signature algorithm near the end (491 in this case) - openssl asn1parse -in cert.pem - - openssl asn1parse -in cert.pem -out alg -noout -strparse 491 - base64 alg - -(5) Extract the signature - - # Find the final offset of BIT STRING (506 in this case) - openssl asn1parse -in cert.pem - - openssl asn1parse -in cert.pem -out sig -noout -strparse 506 - base64 sig - - - ------BEGIN PUBLIC KEY----- -MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCqR+B2Mj1irNp1JnY2zQIQRQPz7ybs6mUjHT3 -hf5APyaig2u6fBPThqxssgg0YviqIj/70hVK/JXcqP1zgR5AhsA0agnwAjfB/ow4EH+3HEYV52q -pxN98pUxC+1l2hgVtn8xCS/JGyjK+6dv+lZw3ixJoX2RjVtdJ4/cn318EhhQIDAQAB ------END PUBLIC KEY----- - -$ openssl asn1parse -i < [PUBLIC KEY] - 0:d=0 hl=3 l= 159 cons: SEQUENCE - 3:d=1 hl=2 l= 13 cons: SEQUENCE - 5:d=2 hl=2 l= 9 prim: OBJECT :rsaEncryption - 16:d=2 hl=2 l= 0 prim: NULL - 18:d=1 hl=3 l= 141 prim: BIT STRING - - - ------BEGIN ALGORITHM----- -MA0GCSqGSIb3DQEBCwUA ------END ALGORITHM----- - -$ openssl asn1parse -i < [ALGORITHM] - 0:d=0 hl=2 l= 13 cons: SEQUENCE - 2:d=1 hl=2 l= 9 prim: OBJECT :sha256WithRSAEncryption - 13:d=1 hl=2 l= 0 prim: NULL - - - ------BEGIN DATA----- -MIIB46ADAgECAgkA3l4tFOVii0UwDQYJKoZIhvcNAQELBQAwVjELMAkGA1UEBhMCQVUxEzARBgN -VBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEPMA0GA1 -UEAwwGTXkga2V5MB4XDTE1MDcwMjE3MDYzOVoXDTE2MDcwMTE3MDYzOVowVjELMAkGA1UEBhMCQ -VUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0 -ZDEPMA0GA1UEAwwGTXkga2V5MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCqR+B2Mj1irNp -1JnY2zQIQRQPz7ybs6mUjHT3hf5APyaig2u6fBPThqxssgg0YviqIj/70hVK/JXcqP1zgR5AhsA -0agnwAjfB/ow4EH+3HEYV52qpxN98pUxC+1l2hgVtn8xCS/JGyjK+6dv+lZw3ixJoX2RjVtdJ4/ -cn318EhhQIDAQABo1AwTjAdBgNVHQ4EFgQUzQBVKTEknyLndWd2HTsBdTKvyikwHwYDVR0jBBgw -FoAUzQBVKTEknyLndWd2HTsBdTKvyikwDAYDVR0TBAUwAwEB/w== ------END DATA----- - - - ------BEGIN SIGNATURE----- -A4GBADrHSmFSJw/Gv7hs5PNzpaJwAri/sitarIZfzN/SjR+n8L8yeTEoiDb1+BkxlFvXvPHTaOK -oO3WlslNNOxh1W5/JkYYGOUkCcyIjnln6qS560imcr3VNjomT/M8M2Iss+rJiKau1TRuaP7H8i6 -+Gqf3saGdr8/LnvFAdNQvkalQt ------END SIGNATURE----- - -$ openssl asn1parse -i < [SIGNATURE] - 0:d=0 hl=3 l= 129 prim: BIT STRING diff -Nru temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pkcs1-sha256-spki-non-null-params.pem temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pkcs1-sha256-spki-non-null-params.pem --- temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pkcs1-sha256-spki-non-null-params.pem 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pkcs1-sha256-spki-non-null-params.pem 1970-01-01 00:00:00.000000000 +0000 @@ -1,59 +0,0 @@ -This is the same test as rsa-pkcs1-sha256.pem except the SPKI has been tampered -with. The parameters have been changed from NULL to an INTEGER. - -This was done by changing: - - 05 00 (NULL) -To: - 02 00 (INTEGER) - - - ------BEGIN PUBLIC KEY----- -MIGfMA0GCSqGSIb3DQEBAQIAA4GNADCBiQKBgQCqR+B2Mj1irNp1JnY2zQIQRQPz7ybs6mUjHT3 -hf5APyaig2u6fBPThqxssgg0YviqIj/70hVK/JXcqP1zgR5AhsA0agnwAjfB/ow4EH+3HEYV52q -pxN98pUxC+1l2hgVtn8xCS/JGyjK+6dv+lZw3ixJoX2RjVtdJ4/cn318EhhQIDAQAB ------END PUBLIC KEY----- - -$ openssl asn1parse -i < [PUBLIC KEY] - 0:d=0 hl=3 l= 159 cons: SEQUENCE - 3:d=1 hl=2 l= 13 cons: SEQUENCE - 5:d=2 hl=2 l= 9 prim: OBJECT :rsaEncryption - 16:d=2 hl=2 l= 0 prim: INTEGER :00 - 18:d=1 hl=3 l= 141 prim: BIT STRING - - - ------BEGIN ALGORITHM----- -MA0GCSqGSIb3DQEBCwUA ------END ALGORITHM----- - -$ openssl asn1parse -i < [ALGORITHM] - 0:d=0 hl=2 l= 13 cons: SEQUENCE - 2:d=1 hl=2 l= 9 prim: OBJECT :sha256WithRSAEncryption - 13:d=1 hl=2 l= 0 prim: NULL - - - ------BEGIN DATA----- -MIIB46ADAgECAgkA3l4tFOVii0UwDQYJKoZIhvcNAQELBQAwVjELMAkGA1UEBhMCQVUxEzARBgN -VBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEPMA0GA1 -UEAwwGTXkga2V5MB4XDTE1MDcwMjE3MDYzOVoXDTE2MDcwMTE3MDYzOVowVjELMAkGA1UEBhMCQ -VUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0 -ZDEPMA0GA1UEAwwGTXkga2V5MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCqR+B2Mj1irNp -1JnY2zQIQRQPz7ybs6mUjHT3hf5APyaig2u6fBPThqxssgg0YviqIj/70hVK/JXcqP1zgR5AhsA -0agnwAjfB/ow4EH+3HEYV52qpxN98pUxC+1l2hgVtn8xCS/JGyjK+6dv+lZw3ixJoX2RjVtdJ4/ -cn318EhhQIDAQABo1AwTjAdBgNVHQ4EFgQUzQBVKTEknyLndWd2HTsBdTKvyikwHwYDVR0jBBgw -FoAUzQBVKTEknyLndWd2HTsBdTKvyikwDAYDVR0TBAUwAwEB/w== ------END DATA----- - - - ------BEGIN SIGNATURE----- -A4GBADrHSmFSJw/Gv7hs5PNzpaJwAri/sitarIZfzN/SjR+n8L8yeTEoiDb1+BkxlFvXvPHTaOK -oO3WlslNNOxh1W5/JkYYGOUkCcyIjnln6qS560imcr3VNjomT/M8M2Iss+rJiKau1TRuaP7H8i6 -+Gqf3saGdr8/LnvFAdNQvkalQt ------END SIGNATURE----- - -$ openssl asn1parse -i < [SIGNATURE] - 0:d=0 hl=3 l= 129 prim: BIT STRING diff -Nru temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pkcs1-sha256-using-ecdsa-algorithm.pem temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pkcs1-sha256-using-ecdsa-algorithm.pem --- temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pkcs1-sha256-using-ecdsa-algorithm.pem 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pkcs1-sha256-using-ecdsa-algorithm.pem 1970-01-01 00:00:00.000000000 +0000 @@ -1,55 +0,0 @@ -This test specified a valid RSA PKCS#1 v.1.5 signature and RSA key (the same as rsa-pkcs1-sha256.pem). - -The problem however is the signature algorithm is indicated as being ECDSA. - -Signature verification consequently should fail. - - - ------BEGIN PUBLIC KEY----- -MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCqR+B2Mj1irNp1JnY2zQIQRQPz7ybs6mUjHT3 -hf5APyaig2u6fBPThqxssgg0YviqIj/70hVK/JXcqP1zgR5AhsA0agnwAjfB/ow4EH+3HEYV52q -pxN98pUxC+1l2hgVtn8xCS/JGyjK+6dv+lZw3ixJoX2RjVtdJ4/cn318EhhQIDAQAB ------END PUBLIC KEY----- - -$ openssl asn1parse -i < [PUBLIC KEY] - 0:d=0 hl=3 l= 159 cons: SEQUENCE - 3:d=1 hl=2 l= 13 cons: SEQUENCE - 5:d=2 hl=2 l= 9 prim: OBJECT :rsaEncryption - 16:d=2 hl=2 l= 0 prim: NULL - 18:d=1 hl=3 l= 141 prim: BIT STRING - - - ------BEGIN ALGORITHM----- -MAoGCCqGSM49BAMC ------END ALGORITHM----- - -$ openssl asn1parse -i < [ALGORITHM] - 0:d=0 hl=2 l= 10 cons: SEQUENCE - 2:d=1 hl=2 l= 8 prim: OBJECT :ecdsa-with-SHA256 - - - ------BEGIN DATA----- -MIIB46ADAgECAgkA3l4tFOVii0UwDQYJKoZIhvcNAQELBQAwVjELMAkGA1UEBhMCQVUxEzARBgN -VBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEPMA0GA1 -UEAwwGTXkga2V5MB4XDTE1MDcwMjE3MDYzOVoXDTE2MDcwMTE3MDYzOVowVjELMAkGA1UEBhMCQ -VUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0 -ZDEPMA0GA1UEAwwGTXkga2V5MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCqR+B2Mj1irNp -1JnY2zQIQRQPz7ybs6mUjHT3hf5APyaig2u6fBPThqxssgg0YviqIj/70hVK/JXcqP1zgR5AhsA -0agnwAjfB/ow4EH+3HEYV52qpxN98pUxC+1l2hgVtn8xCS/JGyjK+6dv+lZw3ixJoX2RjVtdJ4/ -cn318EhhQIDAQABo1AwTjAdBgNVHQ4EFgQUzQBVKTEknyLndWd2HTsBdTKvyikwHwYDVR0jBBgw -FoAUzQBVKTEknyLndWd2HTsBdTKvyikwDAYDVR0TBAUwAwEB/w== ------END DATA----- - - - ------BEGIN SIGNATURE----- -A4GBADrHSmFSJw/Gv7hs5PNzpaJwAri/sitarIZfzN/SjR+n8L8yeTEoiDb1+BkxlFvXvPHTaOK -oO3WlslNNOxh1W5/JkYYGOUkCcyIjnln6qS560imcr3VNjomT/M8M2Iss+rJiKau1TRuaP7H8i6 -+Gqf3saGdr8/LnvFAdNQvkalQt ------END SIGNATURE----- - -$ openssl asn1parse -i < [SIGNATURE] - 0:d=0 hl=3 l= 129 prim: BIT STRING diff -Nru temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pkcs1-sha256-using-id-ea-rsa.pem temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pkcs1-sha256-using-id-ea-rsa.pem --- temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pkcs1-sha256-using-id-ea-rsa.pem 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pkcs1-sha256-using-id-ea-rsa.pem 1970-01-01 00:00:00.000000000 +0000 @@ -1,54 +0,0 @@ -This is the same test as rsa-pkcs1-sha256.pem except the SPKI has been tampered -with. Rather than using an rsaEncryption OID for the key's algorithm, it uses -id-ea-rsa (2.5.8.1.1). - - - ------BEGIN PUBLIC KEY----- -MIGaMAgGBFUIAQEFAAOBjQAwgYkCgYEAqkfgdjI9YqzadSZ2Ns0CEEUD8+8m7OplIx094X+QD8m -ooNrunwT04asbLIINGL4qiI/+9IVSvyV3Kj9c4EeQIbANGoJ8AI3wf6MOBB/txxGFedqqcTffKV -MQvtZdoYFbZ/MQkvyRsoyvunb/pWcN4sSaF9kY1bXSeP3J99fBIYUCAwEAAQ== ------END PUBLIC KEY----- - -$ openssl asn1parse -i < [PUBLIC KEY] - 0:d=0 hl=3 l= 154 cons: SEQUENCE - 3:d=1 hl=2 l= 8 cons: SEQUENCE - 5:d=2 hl=2 l= 4 prim: OBJECT :rsa - 11:d=2 hl=2 l= 0 prim: NULL - 13:d=1 hl=3 l= 141 prim: BIT STRING - - - ------BEGIN ALGORITHM----- -MA0GCSqGSIb3DQEBCwUA ------END ALGORITHM----- - -$ openssl asn1parse -i < [ALGORITHM] - 0:d=0 hl=2 l= 13 cons: SEQUENCE - 2:d=1 hl=2 l= 9 prim: OBJECT :sha256WithRSAEncryption - 13:d=1 hl=2 l= 0 prim: NULL - - - ------BEGIN DATA----- -MIIB46ADAgECAgkA3l4tFOVii0UwDQYJKoZIhvcNAQELBQAwVjELMAkGA1UEBhMCQVUxEzARBgN -VBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEPMA0GA1 -UEAwwGTXkga2V5MB4XDTE1MDcwMjE3MDYzOVoXDTE2MDcwMTE3MDYzOVowVjELMAkGA1UEBhMCQ -VUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0 -ZDEPMA0GA1UEAwwGTXkga2V5MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCqR+B2Mj1irNp -1JnY2zQIQRQPz7ybs6mUjHT3hf5APyaig2u6fBPThqxssgg0YviqIj/70hVK/JXcqP1zgR5AhsA -0agnwAjfB/ow4EH+3HEYV52qpxN98pUxC+1l2hgVtn8xCS/JGyjK+6dv+lZw3ixJoX2RjVtdJ4/ -cn318EhhQIDAQABo1AwTjAdBgNVHQ4EFgQUzQBVKTEknyLndWd2HTsBdTKvyikwHwYDVR0jBBgw -FoAUzQBVKTEknyLndWd2HTsBdTKvyikwDAYDVR0TBAUwAwEB/w== ------END DATA----- - - - ------BEGIN SIGNATURE----- -A4GBADrHSmFSJw/Gv7hs5PNzpaJwAri/sitarIZfzN/SjR+n8L8yeTEoiDb1+BkxlFvXvPHTaOK -oO3WlslNNOxh1W5/JkYYGOUkCcyIjnln6qS560imcr3VNjomT/M8M2Iss+rJiKau1TRuaP7H8i6 -+Gqf3saGdr8/LnvFAdNQvkalQt ------END SIGNATURE----- - -$ openssl asn1parse -i < [SIGNATURE] - 0:d=0 hl=3 l= 129 prim: BIT STRING diff -Nru temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pss-sha1-salt20.pem temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pss-sha1-salt20.pem --- temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pss-sha1-salt20.pem 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pss-sha1-salt20.pem 1970-01-01 00:00:00.000000000 +0000 @@ -1,53 +0,0 @@ -The key, message, and signature come from Example 1.1 of: -ftp://ftp.rsasecurity.com/pub/pkcs/pkcs-1/pkcs-1v2-1-vec.zip (pss-vect.txt) - -(The algorithm DER was synthesized to match, and the signature enclosed in a BIT STRING). - -It uses an RSA key with modulus length of 1024 bits, PSS padding, -SHA-1 as the digest, MGF1 with SHA-1, and salt length of 20. - - - ------BEGIN PUBLIC KEY----- -MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQClbkoOcBAXWJpRh9x+qEHRVvLsDjatUqRN/rH -mH3rZkdjFEFb/7bFitMDyg6EqiKOU3/Umq3KRy7MHzqv84LHf1c2VCAltWyuLbfXWce9jd8CSHL -I8Jwpw4lmOb/idGfEFrMLT8Ms18pKA4Thrb2TE7yLh4fINDOjP+yJJvZohNwIDAQAB ------END PUBLIC KEY----- - -$ openssl asn1parse -i < [PUBLIC KEY] - 0:d=0 hl=3 l= 159 cons: SEQUENCE - 3:d=1 hl=2 l= 13 cons: SEQUENCE - 5:d=2 hl=2 l= 9 prim: OBJECT :rsaEncryption - 16:d=2 hl=2 l= 0 prim: NULL - 18:d=1 hl=3 l= 141 prim: BIT STRING - - - ------BEGIN ALGORITHM----- -MA0GCSqGSIb3DQEBCjAA ------END ALGORITHM----- - -$ openssl asn1parse -i < [ALGORITHM] - 0:d=0 hl=2 l= 13 cons: SEQUENCE - 2:d=1 hl=2 l= 9 prim: OBJECT :rsassaPss - 13:d=1 hl=2 l= 0 cons: SEQUENCE - - - ------BEGIN DATA----- -zch9oiPXht87ReC7vHITJtHuKvgGzDFUdcxvDZxm4bYjcdRc4jkuGskoRMMQEC8Vag2NUsH0xAu -jqmUJV4bLdpdXplY7qVj+0LzJhOi1F6PV9RWyO4pB50qoZ2k/kN+wYabobfqu5kRywA5fIJRXKc -vr538Gznjgj0CY+6QfnWGTwDF+i2DUtghKy0LSnjgIo7w3LYXjMRcPy/fMctC3HClmSLOk0Q9BY -pXQgHqmJcqydE/Z6o/SI8QlNwKYKL0WvgJUbxMP0uM7k20mduCK7RtzMYt1CgFn0A== ------END DATA----- - - - ------BEGIN SIGNATURE----- -A4GBAJB0MI+1mOlwGyKUOI5S+XH6rCtgpRRa8YXfUoe17SiH5Xzn/UTchjTkB8jg5DYLwibz7CJ -/nZ5UY46NMfUFEhXfbrucL5V5qndZijj5FLW5wb2DxOL584Kg0Ko1Qv/uZZhKYBvGnrKN6yfcoS -yCwtTD9mzVAPH/K5lNik4wy7M8 ------END SIGNATURE----- - -$ openssl asn1parse -i < [SIGNATURE] - 0:d=0 hl=3 l= 129 prim: BIT STRING diff -Nru temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pss-sha1-salt20-using-pss-key-no-params.pem temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pss-sha1-salt20-using-pss-key-no-params.pem --- temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pss-sha1-salt20-using-pss-key-no-params.pem 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pss-sha1-salt20-using-pss-key-no-params.pem 1970-01-01 00:00:00.000000000 +0000 @@ -1,48 +0,0 @@ -This is the same test as rsa-pss-sha1-salt20.pem, except the public key's -algorithm identifier has been changed from rsaEncryption (1.2.840.113549.1.1.1) -to rsaPss (1.2.840.113549.1.1.10). - - - ------BEGIN PUBLIC KEY----- -MIGdMAsGCSqGSIb3DQEBCgOBjQAwgYkCgYEApW5KDnAQF1iaUYfcfqhB0Vby7A42rVKkTf6x5h9 -62ZHYxRBW/+2xYrTA8oOhKoijlN/1JqtykcuzB86r/OCx39XNlQgJbVsri2311nHvY3fAkhyyPC -cKcOJZjm/4nRnxBazC0/DLNfKSgOE4a29kxO8i4eHyDQzoz/siSb2aITcCAwEAAQ== ------END PUBLIC KEY----- - -$ openssl asn1parse -i < [PUBLIC KEY] - 0:d=0 hl=3 l= 157 cons: SEQUENCE - 3:d=1 hl=2 l= 11 cons: SEQUENCE - 5:d=2 hl=2 l= 9 prim: OBJECT :rsassaPss - 16:d=1 hl=3 l= 141 prim: BIT STRING - - - ------BEGIN ALGORITHM----- -MA0GCSqGSIb3DQEBCjAA ------END ALGORITHM----- - -$ openssl asn1parse -i < [ALGORITHM] - 0:d=0 hl=2 l= 13 cons: SEQUENCE - 2:d=1 hl=2 l= 9 prim: OBJECT :rsassaPss - 13:d=1 hl=2 l= 0 cons: SEQUENCE - - - ------BEGIN DATA----- -zch9oiPXht87ReC7vHITJtHuKvgGzDFUdcxvDZxm4bYjcdRc4jkuGskoRMMQEC8Vag2NUsH0xAu -jqmUJV4bLdpdXplY7qVj+0LzJhOi1F6PV9RWyO4pB50qoZ2k/kN+wYabobfqu5kRywA5fIJRXKc -vr538Gznjgj0CY+6QfnWGTwDF+i2DUtghKy0LSnjgIo7w3LYXjMRcPy/fMctC3HClmSLOk0Q9BY -pXQgHqmJcqydE/Z6o/SI8QlNwKYKL0WvgJUbxMP0uM7k20mduCK7RtzMYt1CgFn0A== ------END DATA----- - - - ------BEGIN SIGNATURE----- -A4GBAJB0MI+1mOlwGyKUOI5S+XH6rCtgpRRa8YXfUoe17SiH5Xzn/UTchjTkB8jg5DYLwibz7CJ -/nZ5UY46NMfUFEhXfbrucL5V5qndZijj5FLW5wb2DxOL584Kg0Ko1Qv/uZZhKYBvGnrKN6yfcoS -yCwtTD9mzVAPH/K5lNik4wy7M8 ------END SIGNATURE----- - -$ openssl asn1parse -i < [SIGNATURE] - 0:d=0 hl=3 l= 129 prim: BIT STRING diff -Nru temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pss-sha1-salt20-using-pss-key-with-null-params.pem temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pss-sha1-salt20-using-pss-key-with-null-params.pem --- temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pss-sha1-salt20-using-pss-key-with-null-params.pem 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pss-sha1-salt20-using-pss-key-with-null-params.pem 1970-01-01 00:00:00.000000000 +0000 @@ -1,50 +0,0 @@ -This is the same test as rsa-pss-sha1-salt20.pem, except the public key's -algorithm identifier has been changed from rsaEncryption (1.2.840.113549.1.1.1) -to rsaPss (1.2.840.113549.1.1.10). Note that the PSS parameters have been -encoded as NULL which is incorrect. - - - ------BEGIN PUBLIC KEY----- -MIGfMA0GCSqGSIb3DQEBCgUAA4GNADCBiQKBgQClbkoOcBAXWJpRh9x+qEHRVvLsDjatUqRN/rH -mH3rZkdjFEFb/7bFitMDyg6EqiKOU3/Umq3KRy7MHzqv84LHf1c2VCAltWyuLbfXWce9jd8CSHL -I8Jwpw4lmOb/idGfEFrMLT8Ms18pKA4Thrb2TE7yLh4fINDOjP+yJJvZohNwIDAQAB ------END PUBLIC KEY----- - -$ openssl asn1parse -i < [PUBLIC KEY] - 0:d=0 hl=3 l= 159 cons: SEQUENCE - 3:d=1 hl=2 l= 13 cons: SEQUENCE - 5:d=2 hl=2 l= 9 prim: OBJECT :rsassaPss - 16:d=2 hl=2 l= 0 prim: NULL - 18:d=1 hl=3 l= 141 prim: BIT STRING - - - ------BEGIN ALGORITHM----- -MA0GCSqGSIb3DQEBCjAA ------END ALGORITHM----- - -$ openssl asn1parse -i < [ALGORITHM] - 0:d=0 hl=2 l= 13 cons: SEQUENCE - 2:d=1 hl=2 l= 9 prim: OBJECT :rsassaPss - 13:d=1 hl=2 l= 0 cons: SEQUENCE - - - ------BEGIN DATA----- -zch9oiPXht87ReC7vHITJtHuKvgGzDFUdcxvDZxm4bYjcdRc4jkuGskoRMMQEC8Vag2NUsH0xAu -jqmUJV4bLdpdXplY7qVj+0LzJhOi1F6PV9RWyO4pB50qoZ2k/kN+wYabobfqu5kRywA5fIJRXKc -vr538Gznjgj0CY+6QfnWGTwDF+i2DUtghKy0LSnjgIo7w3LYXjMRcPy/fMctC3HClmSLOk0Q9BY -pXQgHqmJcqydE/Z6o/SI8QlNwKYKL0WvgJUbxMP0uM7k20mduCK7RtzMYt1CgFn0A== ------END DATA----- - - - ------BEGIN SIGNATURE----- -A4GBAJB0MI+1mOlwGyKUOI5S+XH6rCtgpRRa8YXfUoe17SiH5Xzn/UTchjTkB8jg5DYLwibz7CJ -/nZ5UY46NMfUFEhXfbrucL5V5qndZijj5FLW5wb2DxOL584Kg0Ko1Qv/uZZhKYBvGnrKN6yfcoS -yCwtTD9mzVAPH/K5lNik4wy7M8 ------END SIGNATURE----- - -$ openssl asn1parse -i < [SIGNATURE] - 0:d=0 hl=3 l= 129 prim: BIT STRING diff -Nru temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pss-sha1-wrong-salt.pem temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pss-sha1-wrong-salt.pem --- temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pss-sha1-wrong-salt.pem 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pss-sha1-wrong-salt.pem 1970-01-01 00:00:00.000000000 +0000 @@ -1,51 +0,0 @@ -Same as rsa-pss-sha1-wrong-salt.pem except the ALGORITHM has been changed to -have a salt of 23. When verified using this algorithm it will fail, however if -the default salt of 20 were used it would succeed. - - - ------BEGIN PUBLIC KEY----- -MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQClbkoOcBAXWJpRh9x+qEHRVvLsDjatUqRN/rH -mH3rZkdjFEFb/7bFitMDyg6EqiKOU3/Umq3KRy7MHzqv84LHf1c2VCAltWyuLbfXWce9jd8CSHL -I8Jwpw4lmOb/idGfEFrMLT8Ms18pKA4Thrb2TE7yLh4fINDOjP+yJJvZohNwIDAQAB ------END PUBLIC KEY----- - -$ openssl asn1parse -i < [PUBLIC KEY] - 0:d=0 hl=3 l= 159 cons: SEQUENCE - 3:d=1 hl=2 l= 13 cons: SEQUENCE - 5:d=2 hl=2 l= 9 prim: OBJECT :rsaEncryption - 16:d=2 hl=2 l= 0 prim: NULL - 18:d=1 hl=3 l= 141 prim: BIT STRING - - - ------BEGIN ALGORITHM----- -MBIGCSqGSIb3DQEBCjAFogMCARc= ------END ALGORITHM----- - -$ openssl asn1parse -i < [ALGORITHM] - 0:d=0 hl=2 l= 18 cons: SEQUENCE - 2:d=1 hl=2 l= 9 prim: OBJECT :rsassaPss - 13:d=1 hl=2 l= 5 cons: SEQUENCE - 15:d=2 hl=2 l= 3 cons: cont [ 2 ] - 17:d=3 hl=2 l= 1 prim: INTEGER :17 - - - ------BEGIN DATA----- -zch9oiPXht87ReC7vHITJtHuKvgGzDFUdcxvDZxm4bYjcdRc4jkuGskoRMMQEC8Vag2NUsH0xAu -jqmUJV4bLdpdXplY7qVj+0LzJhOi1F6PV9RWyO4pB50qoZ2k/kN+wYabobfqu5kRywA5fIJRXKc -vr538Gznjgj0CY+6QfnWGTwDF+i2DUtghKy0LSnjgIo7w3LYXjMRcPy/fMctC3HClmSLOk0Q9BY -pXQgHqmJcqydE/Z6o/SI8QlNwKYKL0WvgJUbxMP0uM7k20mduCK7RtzMYt1CgFn0A== ------END DATA----- - - - ------BEGIN SIGNATURE----- -A4GBAJB0MI+1mOlwGyKUOI5S+XH6rCtgpRRa8YXfUoe17SiH5Xzn/UTchjTkB8jg5DYLwibz7CJ -/nZ5UY46NMfUFEhXfbrucL5V5qndZijj5FLW5wb2DxOL584Kg0Ko1Qv/uZZhKYBvGnrKN6yfcoS -yCwtTD9mzVAPH/K5lNik4wy7M8 ------END SIGNATURE----- - -$ openssl asn1parse -i < [SIGNATURE] - 0:d=0 hl=3 l= 129 prim: BIT STRING diff -Nru temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pss-sha256-mgf1-sha512-salt33.pem temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pss-sha256-mgf1-sha512-salt33.pem --- temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pss-sha256-mgf1-sha512-salt33.pem 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pss-sha256-mgf1-sha512-salt33.pem 1970-01-01 00:00:00.000000000 +0000 @@ -1,67 +0,0 @@ -This test exercises using a different hash function parameter to the mask gen -function (SHA-256 for the hash, but SHA-512 for the MGF1 hash). - -This test data was constructed manually by calling signing functions from -OpenSSL code. - -It constructs an RSASSA-PSS signature using: - * Key with modulus 1024 bit - * Salt length 33 bytes - * Digest function of SHA-256 - * Mask gen function of MGF1 with SHA-512 - - - ------BEGIN PUBLIC KEY----- -MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQClbkoOcBAXWJpRh9x+qEHRVvLsDjatUqRN/rH -mH3rZkdjFEFb/7bFitMDyg6EqiKOU3/Umq3KRy7MHzqv84LHf1c2VCAltWyuLbfXWce9jd8CSHL -I8Jwpw4lmOb/idGfEFrMLT8Ms18pKA4Thrb2TE7yLh4fINDOjP+yJJvZohNwIDAQAB ------END PUBLIC KEY----- - -$ openssl asn1parse -i < [PUBLIC KEY] - 0:d=0 hl=3 l= 159 cons: SEQUENCE - 3:d=1 hl=2 l= 13 cons: SEQUENCE - 5:d=2 hl=2 l= 9 prim: OBJECT :rsaEncryption - 16:d=2 hl=2 l= 0 prim: NULL - 18:d=1 hl=3 l= 141 prim: BIT STRING - - - ------BEGIN ALGORITHM----- -MEEGCSqGSIb3DQEBCjA0oA8wDQYJYIZIAWUDBAIBBQChHDAaBgkqhkiG9w0BAQgwDQYJYIZIAWU -DBAIDBQCiAwIBIQ== ------END ALGORITHM----- - -$ openssl asn1parse -i < [ALGORITHM] - 0:d=0 hl=2 l= 65 cons: SEQUENCE - 2:d=1 hl=2 l= 9 prim: OBJECT :rsassaPss - 13:d=1 hl=2 l= 52 cons: SEQUENCE - 15:d=2 hl=2 l= 15 cons: cont [ 0 ] - 17:d=3 hl=2 l= 13 cons: SEQUENCE - 19:d=4 hl=2 l= 9 prim: OBJECT :sha256 - 30:d=4 hl=2 l= 0 prim: NULL - 32:d=2 hl=2 l= 28 cons: cont [ 1 ] - 34:d=3 hl=2 l= 26 cons: SEQUENCE - 36:d=4 hl=2 l= 9 prim: OBJECT :mgf1 - 47:d=4 hl=2 l= 13 cons: SEQUENCE - 49:d=5 hl=2 l= 9 prim: OBJECT :sha512 - 60:d=5 hl=2 l= 0 prim: NULL - 62:d=2 hl=2 l= 3 cons: cont [ 2 ] - 64:d=3 hl=2 l= 1 prim: INTEGER :21 - - - ------BEGIN DATA----- -VGVzdCBtZXNzYWdlIHRvIGJlIHNpZ25lZC4uLg== ------END DATA----- - - - ------BEGIN SIGNATURE----- -A4GBAFob0HSC5uuTqKu4J/lj+5bDa+Hhij4H3klWnvt6Yc+wwPza7/UC4lgGGyvZqD32RUEdt7v -Z14qqYNk53b5aj4C2gBMvLzV7Pay4mmQM4DSWa5JHMxTILqE3DDqihrbMcBw2q3XAsLcjeqLWQ9 -yp8tfnV21h98qsCLtErrxZWHRr ------END SIGNATURE----- - -$ openssl asn1parse -i < [SIGNATURE] - 0:d=0 hl=3 l= 129 prim: BIT STRING diff -Nru temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pss-sha256-salt10.pem temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pss-sha256-salt10.pem --- temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pss-sha256-salt10.pem 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pss-sha256-salt10.pem 1970-01-01 00:00:00.000000000 +0000 @@ -1,65 +0,0 @@ -The key, message, and signature come from: -http://csrc.nist.gov/groups/STM/cavp/documents/dss/186-2rsatestvectors.zip (SigVerPSS_186-3.rsp) - -(The algorithm DER was synthesized to match, and the signature wrapped in a BIT STRING). - -It uses an RSA key with modulus length of 1024 bits, PSS padding, -SHA-256 as the digest, MGF1 with SHA-256, and salt length of 10. - - - ------BEGIN PUBLIC KEY----- -MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQC+SZtefwbIP6ApPjFGXI62tYr5ILrlKntbm/6 -3qnLbEmQRLrP9Qx0xoqflCUFWaSlJSg6JHtVhORi0tRsNH7l3g7Jqz30POEz7NfTSgk9d04BiOi -a/GAtjlhxhnc2yDK5AbyL24nbICjcllJDP63LBpxqE8YRtMwh3uj4xAeycewIBEQ== ------END PUBLIC KEY----- - -$ openssl asn1parse -i < [PUBLIC KEY] - 0:d=0 hl=3 l= 157 cons: SEQUENCE - 3:d=1 hl=2 l= 13 cons: SEQUENCE - 5:d=2 hl=2 l= 9 prim: OBJECT :rsaEncryption - 16:d=2 hl=2 l= 0 prim: NULL - 18:d=1 hl=3 l= 139 prim: BIT STRING - - - ------BEGIN ALGORITHM----- -MEEGCSqGSIb3DQEBCjA0oA8wDQYJYIZIAWUDBAIBBQChHDAaBgkqhkiG9w0BAQgwDQYJYIZIAWU -DBAIBBQCiAwIBCg== ------END ALGORITHM----- - -$ openssl asn1parse -i < [ALGORITHM] - 0:d=0 hl=2 l= 65 cons: SEQUENCE - 2:d=1 hl=2 l= 9 prim: OBJECT :rsassaPss - 13:d=1 hl=2 l= 52 cons: SEQUENCE - 15:d=2 hl=2 l= 15 cons: cont [ 0 ] - 17:d=3 hl=2 l= 13 cons: SEQUENCE - 19:d=4 hl=2 l= 9 prim: OBJECT :sha256 - 30:d=4 hl=2 l= 0 prim: NULL - 32:d=2 hl=2 l= 28 cons: cont [ 1 ] - 34:d=3 hl=2 l= 26 cons: SEQUENCE - 36:d=4 hl=2 l= 9 prim: OBJECT :mgf1 - 47:d=4 hl=2 l= 13 cons: SEQUENCE - 49:d=5 hl=2 l= 9 prim: OBJECT :sha256 - 60:d=5 hl=2 l= 0 prim: NULL - 62:d=2 hl=2 l= 3 cons: cont [ 2 ] - 64:d=3 hl=2 l= 1 prim: INTEGER :0A - - - ------BEGIN DATA----- -x/UnD8pyX5vRn1GajXzKPMXAeQJAKfO65RD5sCFA/iOJCOT2wY8HqJxofIaEZpsfHbK6+SUaPIK -frMtJMIThbsnijViGgHSl1iIWZ91uUo0W/iyfPbTPr2xNzoyEOa84zqqqnOLsrnvI9KWlXjv5bf -nNV1xPnLMnlRuM3+QIcWg= ------END DATA----- - - - ------BEGIN SIGNATURE----- -A4GBABHhafL9QLB2Qbl2iiqxmWX7bCfxD88DI/zG0S608cBrMw3aoepQRAevop3p6+A3T+nR59D -/vV/Bzzo0RuQUVBXSqyT3ibNGTFxDola7wdaSz38EgB2sW7QBpKA6t9VyioYMGeGk3Hl8pULIID -zsLmAesMUfVn8u2gIrC5693u76 ------END SIGNATURE----- - -$ openssl asn1parse -i < [SIGNATURE] - 0:d=0 hl=3 l= 129 prim: BIT STRING diff -Nru temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pss-sha256-salt10-using-pss-key-with-params.pem temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pss-sha256-salt10-using-pss-key-with-params.pem --- temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pss-sha256-salt10-using-pss-key-with-params.pem 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pss-sha256-salt10-using-pss-key-with-params.pem 1970-01-01 00:00:00.000000000 +0000 @@ -1,74 +0,0 @@ -This is the same test as rsa-pss-sha256-salt10.pem except instead of specifying -the SPKI using rsaEncryption it is specified using rsaPss along with -parameters that match those of the signature algorithm. - - - ------BEGIN PUBLIC KEY----- -MIHRMEEGCSqGSIb3DQEBCjA0oA8wDQYJYIZIAWUDBAIBBQChHDAaBgkqhkiG9w0BAQgwDQYJYIZ -IAWUDBAIBBQCiAwIBCgOBiwAwgYcCgYEAvkmbXn8GyD+gKT4xRlyOtrWK+SC65Sp7W5v+t6py2x -JkES6z/UMdMaKn5QlBVmkpSUoOiR7VYTkYtLUbDR+5d4Oyas99DzhM+zX00oJPXdOAYjomvxgLY -5YcYZ3NsgyuQG8i9uJ2yAo3JZSQz+tywacahPGEbTMId7o+MQHsnHsCARE= ------END PUBLIC KEY----- - -$ openssl asn1parse -i < [PUBLIC KEY] - 0:d=0 hl=3 l= 209 cons: SEQUENCE - 3:d=1 hl=2 l= 65 cons: SEQUENCE - 5:d=2 hl=2 l= 9 prim: OBJECT :rsassaPss - 16:d=2 hl=2 l= 52 cons: SEQUENCE - 18:d=3 hl=2 l= 15 cons: cont [ 0 ] - 20:d=4 hl=2 l= 13 cons: SEQUENCE - 22:d=5 hl=2 l= 9 prim: OBJECT :sha256 - 33:d=5 hl=2 l= 0 prim: NULL - 35:d=3 hl=2 l= 28 cons: cont [ 1 ] - 37:d=4 hl=2 l= 26 cons: SEQUENCE - 39:d=5 hl=2 l= 9 prim: OBJECT :mgf1 - 50:d=5 hl=2 l= 13 cons: SEQUENCE - 52:d=6 hl=2 l= 9 prim: OBJECT :sha256 - 63:d=6 hl=2 l= 0 prim: NULL - 65:d=3 hl=2 l= 3 cons: cont [ 2 ] - 67:d=4 hl=2 l= 1 prim: INTEGER :0A - 70:d=1 hl=3 l= 139 prim: BIT STRING - - - ------BEGIN ALGORITHM----- -MEEGCSqGSIb3DQEBCjA0oA8wDQYJYIZIAWUDBAIBBQChHDAaBgkqhkiG9w0BAQgwDQYJYIZIAWU -DBAIBBQCiAwIBCg== ------END ALGORITHM----- - -$ openssl asn1parse -i < [ALGORITHM] - 0:d=0 hl=2 l= 65 cons: SEQUENCE - 2:d=1 hl=2 l= 9 prim: OBJECT :rsassaPss - 13:d=1 hl=2 l= 52 cons: SEQUENCE - 15:d=2 hl=2 l= 15 cons: cont [ 0 ] - 17:d=3 hl=2 l= 13 cons: SEQUENCE - 19:d=4 hl=2 l= 9 prim: OBJECT :sha256 - 30:d=4 hl=2 l= 0 prim: NULL - 32:d=2 hl=2 l= 28 cons: cont [ 1 ] - 34:d=3 hl=2 l= 26 cons: SEQUENCE - 36:d=4 hl=2 l= 9 prim: OBJECT :mgf1 - 47:d=4 hl=2 l= 13 cons: SEQUENCE - 49:d=5 hl=2 l= 9 prim: OBJECT :sha256 - 60:d=5 hl=2 l= 0 prim: NULL - 62:d=2 hl=2 l= 3 cons: cont [ 2 ] - 64:d=3 hl=2 l= 1 prim: INTEGER :0A - - - ------BEGIN DATA----- -x/UnD8pyX5vRn1GajXzKPMXAeQJAKfO65RD5sCFA/iOJCOT2wY8HqJxofIaEZpsfHbK6+SUaPIK -frMtJMIThbsnijViGgHSl1iIWZ91uUo0W/iyfPbTPr2xNzoyEOa84zqqqnOLsrnvI9KWlXjv5bf -nNV1xPnLMnlRuM3+QIcWg= ------END DATA----- - - - ------BEGIN SIGNATURE----- -A4GBABHhafL9QLB2Qbl2iiqxmWX7bCfxD88DI/zG0S608cBrMw3aoepQRAevop3p6+A3T+nR59D -/vV/Bzzo0RuQUVBXSqyT3ibNGTFxDola7wdaSz38EgB2sW7QBpKA6t9VyioYMGeGk3Hl8pULIID -zsLmAesMUfVn8u2gIrC5693u76 ------END SIGNATURE----- - -$ openssl asn1parse -i < [SIGNATURE] - 0:d=0 hl=3 l= 129 prim: BIT STRING diff -Nru temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pss-sha256-salt10-using-pss-key-with-wrong-params.pem temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pss-sha256-salt10-using-pss-key-with-wrong-params.pem --- temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pss-sha256-salt10-using-pss-key-with-wrong-params.pem 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-pss-sha256-salt10-using-pss-key-with-wrong-params.pem 1970-01-01 00:00:00.000000000 +0000 @@ -1,74 +0,0 @@ -This is the same test as rsa-pss-sha256-salt10-using-pss-key-with-params.pem -except the hash in the PSS key's parameters has been changed from SHA-256 to -SHA-384. - - - ------BEGIN PUBLIC KEY----- -MIHRMEEGCSqGSIb3DQEBCjA0oA8wDQYJYIZIAWUDBAICBQChHDAaBgkqhkiG9w0BAQgwDQYJYIZ -IAWUDBAIBBQCiAwIBCgOBiwAwgYcCgYEAvkmbXn8GyD+gKT4xRlyOtrWK+SC65Sp7W5v+t6py2x -JkES6z/UMdMaKn5QlBVmkpSUoOiR7VYTkYtLUbDR+5d4Oyas99DzhM+zX00oJPXdOAYjomvxgLY -5YcYZ3NsgyuQG8i9uJ2yAo3JZSQz+tywacahPGEbTMId7o+MQHsnHsCARE= ------END PUBLIC KEY----- - -$ openssl asn1parse -i < [PUBLIC KEY] - 0:d=0 hl=3 l= 209 cons: SEQUENCE - 3:d=1 hl=2 l= 65 cons: SEQUENCE - 5:d=2 hl=2 l= 9 prim: OBJECT :rsassaPss - 16:d=2 hl=2 l= 52 cons: SEQUENCE - 18:d=3 hl=2 l= 15 cons: cont [ 0 ] - 20:d=4 hl=2 l= 13 cons: SEQUENCE - 22:d=5 hl=2 l= 9 prim: OBJECT :sha384 - 33:d=5 hl=2 l= 0 prim: NULL - 35:d=3 hl=2 l= 28 cons: cont [ 1 ] - 37:d=4 hl=2 l= 26 cons: SEQUENCE - 39:d=5 hl=2 l= 9 prim: OBJECT :mgf1 - 50:d=5 hl=2 l= 13 cons: SEQUENCE - 52:d=6 hl=2 l= 9 prim: OBJECT :sha256 - 63:d=6 hl=2 l= 0 prim: NULL - 65:d=3 hl=2 l= 3 cons: cont [ 2 ] - 67:d=4 hl=2 l= 1 prim: INTEGER :0A - 70:d=1 hl=3 l= 139 prim: BIT STRING - - - ------BEGIN ALGORITHM----- -MEEGCSqGSIb3DQEBCjA0oA8wDQYJYIZIAWUDBAIBBQChHDAaBgkqhkiG9w0BAQgwDQYJYIZIAWU -DBAIBBQCiAwIBCg== ------END ALGORITHM----- - -$ openssl asn1parse -i < [ALGORITHM] - 0:d=0 hl=2 l= 65 cons: SEQUENCE - 2:d=1 hl=2 l= 9 prim: OBJECT :rsassaPss - 13:d=1 hl=2 l= 52 cons: SEQUENCE - 15:d=2 hl=2 l= 15 cons: cont [ 0 ] - 17:d=3 hl=2 l= 13 cons: SEQUENCE - 19:d=4 hl=2 l= 9 prim: OBJECT :sha256 - 30:d=4 hl=2 l= 0 prim: NULL - 32:d=2 hl=2 l= 28 cons: cont [ 1 ] - 34:d=3 hl=2 l= 26 cons: SEQUENCE - 36:d=4 hl=2 l= 9 prim: OBJECT :mgf1 - 47:d=4 hl=2 l= 13 cons: SEQUENCE - 49:d=5 hl=2 l= 9 prim: OBJECT :sha256 - 60:d=5 hl=2 l= 0 prim: NULL - 62:d=2 hl=2 l= 3 cons: cont [ 2 ] - 64:d=3 hl=2 l= 1 prim: INTEGER :0A - - - ------BEGIN DATA----- -x/UnD8pyX5vRn1GajXzKPMXAeQJAKfO65RD5sCFA/iOJCOT2wY8HqJxofIaEZpsfHbK6+SUaPIK -frMtJMIThbsnijViGgHSl1iIWZ91uUo0W/iyfPbTPr2xNzoyEOa84zqqqnOLsrnvI9KWlXjv5bf -nNV1xPnLMnlRuM3+QIcWg= ------END DATA----- - - - ------BEGIN SIGNATURE----- -A4GBABHhafL9QLB2Qbl2iiqxmWX7bCfxD88DI/zG0S608cBrMw3aoepQRAevop3p6+A3T+nR59D -/vV/Bzzo0RuQUVBXSqyT3ibNGTFxDola7wdaSz38EgB2sW7QBpKA6t9VyioYMGeGk3Hl8pULIID -zsLmAesMUfVn8u2gIrC5693u76 ------END SIGNATURE----- - -$ openssl asn1parse -i < [SIGNATURE] - 0:d=0 hl=3 l= 129 prim: BIT STRING diff -Nru temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-using-ec-key.pem temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-using-ec-key.pem --- temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-using-ec-key.pem 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/webpki/third-party/chromium/data/verify_signed_data/rsa-using-ec-key.pem 1970-01-01 00:00:00.000000000 +0000 @@ -1,52 +0,0 @@ -This test specifies an RSA PKCS#1 v1.5 signature algorithm (and a valid RSA -signature), HOWEVER it provides an EC key. Verification should fail. - - - ------BEGIN PUBLIC KEY----- -MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEnLDPaTA9r8dh1ORoe07PA55tNKuWSvgIENjVWKS -o1vctUSM6F4iSCobuCKGWLHnvoxf7eHnil9rSFG25lfoceA== ------END PUBLIC KEY----- - -$ openssl asn1parse -i < [PUBLIC KEY] - 0:d=0 hl=2 l= 89 cons: SEQUENCE - 2:d=1 hl=2 l= 19 cons: SEQUENCE - 4:d=2 hl=2 l= 7 prim: OBJECT :id-ecPublicKey - 13:d=2 hl=2 l= 8 prim: OBJECT :prime256v1 - 23:d=1 hl=2 l= 66 prim: BIT STRING - - - ------BEGIN ALGORITHM----- -MA0GCSqGSIb3DQEBCwUA ------END ALGORITHM----- - -$ openssl asn1parse -i < [ALGORITHM] - 0:d=0 hl=2 l= 13 cons: SEQUENCE - 2:d=1 hl=2 l= 9 prim: OBJECT :sha256WithRSAEncryption - 13:d=1 hl=2 l= 0 prim: NULL - - - ------BEGIN DATA----- -MIIB46ADAgECAgkA3l4tFOVii0UwDQYJKoZIhvcNAQELBQAwVjELMAkGA1UEBhMCQVUxEzARBgN -VBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEPMA0GA1 -UEAwwGTXkga2V5MB4XDTE1MDcwMjE3MDYzOVoXDTE2MDcwMTE3MDYzOVowVjELMAkGA1UEBhMCQ -VUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0 -ZDEPMA0GA1UEAwwGTXkga2V5MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCqR+B2Mj1irNp -1JnY2zQIQRQPz7ybs6mUjHT3hf5APyaig2u6fBPThqxssgg0YviqIj/70hVK/JXcqP1zgR5AhsA -0agnwAjfB/ow4EH+3HEYV52qpxN98pUxC+1l2hgVtn8xCS/JGyjK+6dv+lZw3ixJoX2RjVtdJ4/ -cn318EhhQIDAQABo1AwTjAdBgNVHQ4EFgQUzQBVKTEknyLndWd2HTsBdTKvyikwHwYDVR0jBBgw -FoAUzQBVKTEknyLndWd2HTsBdTKvyikwDAYDVR0TBAUwAwEB/w== ------END DATA----- - - - ------BEGIN SIGNATURE----- -A4GBADrHSmFSJw/Gv7hs5PNzpaJwAri/sitarIZfzN/SjR+n8L8yeTEoiDb1+BkxlFvXvPHTaOK -oO3WlslNNOxh1W5/JkYYGOUkCcyIjnln6qS560imcr3VNjomT/M8M2Iss+rJiKau1TRuaP7H8i6 -+Gqf3saGdr8/LnvFAdNQvkalQt ------END SIGNATURE----- - -$ openssl asn1parse -i < [SIGNATURE] - 0:d=0 hl=3 l= 129 prim: BIT STRING diff -Nru temporalio-1.3.0/vendor/webpki/third-party/chromium/LICENSE temporalio-1.3.0/vendor/webpki/third-party/chromium/LICENSE --- temporalio-1.3.0/vendor/webpki/third-party/chromium/LICENSE 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/webpki/third-party/chromium/LICENSE 1970-01-01 00:00:00.000000000 +0000 @@ -1,27 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff -Nru temporalio-1.3.0/vendor/which/.cargo-checksum.json temporalio-1.3.0/vendor/which/.cargo-checksum.json --- temporalio-1.3.0/vendor/which/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/which/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"CHANGELOG.md":"66b8ad6c0bd9e6fcad662bd8784d0b92bcfc6b57cdf1df63d985c925b821516a","Cargo.toml":"5e158650a21b22c6ba2ce18abe79103b5042d78860396ce4d00c31ad36b25df8","LICENSE.txt":"0041560f5d419c30e1594567f3b7ac2bc078ff6a68f437e0348ba85d9cf99112","README.md":"1fbcd4bacd07328f84265715a825cd6811930117bb129e22625b020d12f47b45","deny.toml":"4e30f727201c8bb41500a57ca14a80f15bb29793b8c7fa6b815b5412f17af58c","src/checker.rs":"35ca1342931df0ac0b84e2c677ca1af3d74ade995c6aa0deeb9e4c3114f476b0","src/error.rs":"00315874353628366851cd0817a60059cb2c784fd315407a2c30f38021b18dc6","src/finder.rs":"dfd444a84353b5e0d3efceccff394f8c86bfc64bf56891bda406450e148100d8","src/helper.rs":"42cf60a98c017fcbf96d8cbf5880398b4f191c4b2445c43028c35ad57a1b846a","src/lib.rs":"0962694a7b8a1f66c3ac2871e484ffa1641cf93947fd9c668848f789bebf94ab","tests/basic.rs":"d3c9f35073b4c4f6ad977baaeb3d8668c170253d005cfc258749a0cbe8429512"},"package":"87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7"} \ No newline at end of file +{"files":{"Cargo.toml":"52b2c35d7270c5db75872052c2f8e56740f3c4ccf48b4a17be7b600c57bf24a0","LICENSE.txt":"0041560f5d419c30e1594567f3b7ac2bc078ff6a68f437e0348ba85d9cf99112","README.md":"8b16d6a129cb05c3b6ed15e5eacbd7ca488a5005f3d22d3376cc75157996f1dc","src/checker.rs":"e17ca8bcccedfba17ba027e86de970a01d6d207ba442174184952966eeaba140","src/error.rs":"00315874353628366851cd0817a60059cb2c784fd315407a2c30f38021b18dc6","src/finder.rs":"71d09b164ebf51e70dc67b6e4db78bc1c10afedc6473b1edb795d36bd3a3c83b","src/helper.rs":"42cf60a98c017fcbf96d8cbf5880398b4f191c4b2445c43028c35ad57a1b846a","src/lib.rs":"53926af5cadb33966a6d7e0bdd87a48470ac703f144da77212edbedf88bb0692","tests/basic.rs":"90e2c26bc1402fea996e91342f0c299cc91fb54e82445b0bb46715a77660059b"},"package":"2441c784c52b289a054b7201fc93253e288f094e2f4be9058343127c4226a269"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/which/Cargo.toml temporalio-1.3.0/vendor/which/Cargo.toml --- temporalio-1.3.0/vendor/which/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/which/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -10,10 +10,9 @@ # See Cargo.toml.orig for the original contents. [package] -edition = "2021" -rust-version = "1.63" +edition = "2018" name = "which" -version = "4.4.2" +version = "4.4.0" authors = ["Harry Fei "] description = "A Rust equivalent of Unix command \"which\". Locate installed executable in cross platforms." documentation = "https://docs.rs/which/" @@ -37,23 +36,15 @@ [dependencies.either] version = "1.6.1" +[dependencies.libc] +version = "0.2.121" + [dependencies.regex] version = "1.5.5" optional = true -[dependencies.rustix] -version = "0.38.10" -features = [ - "fs", - "std", -] -default-features = false - [dev-dependencies.tempfile] version = "3.3.0" -[target."cfg(any(windows, unix, target_os = \"redox\"))".dependencies.home] -version = "0.5.5" - [target."cfg(windows)".dependencies.once_cell] version = "1" diff -Nru temporalio-1.3.0/vendor/which/CHANGELOG.md temporalio-1.3.0/vendor/which/CHANGELOG.md --- temporalio-1.3.0/vendor/which/CHANGELOG.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/which/CHANGELOG.md 1970-01-01 00:00:00.000000000 +0000 @@ -1,10 +0,0 @@ -# CHANGELOG - -## 4.4.2 - -- Remove dependency on `dirs` crate due to MPL licensing in its tree. Use `home` crate instead. (@Xaeroxe) - -## 4.4.1 - -- Add tilde expansion for home directory (@Xaeroxe) -- Swap out libc for rustix, forbid unsafe (@notgull) diff -Nru temporalio-1.3.0/vendor/which/deny.toml temporalio-1.3.0/vendor/which/deny.toml --- temporalio-1.3.0/vendor/which/deny.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/which/deny.toml 1970-01-01 00:00:00.000000000 +0000 @@ -1,270 +0,0 @@ -# This template contains all of the possible sections and their default values - -# Note that all fields that take a lint level have these possible values: -# * deny - An error will be produced and the check will fail -# * warn - A warning will be produced, but the check will not fail -# * allow - No warning or error will be produced, though in some cases a note -# will be - -# The values provided in this template are the default values that will be used -# when any section or field is not specified in your own configuration - -# Root options - -# If 1 or more target triples (and optionally, target_features) are specified, -# only the specified targets will be checked when running `cargo deny check`. -# This means, if a particular package is only ever used as a target specific -# dependency, such as, for example, the `nix` crate only being used via the -# `target_family = "unix"` configuration, that only having windows targets in -# this list would mean the nix crate, as well as any of its exclusive -# dependencies not shared by any other crates, would be ignored, as the target -# list here is effectively saying which targets you are building for. -targets = [ - # The triple can be any string, but only the target triples built in to - # rustc (as of 1.40) can be checked against actual config expressions - #{ triple = "x86_64-unknown-linux-musl" }, - # You can also specify which target_features you promise are enabled for a - # particular target. target_features are currently not validated against - # the actual valid features supported by the target architecture. - #{ triple = "wasm32-unknown-unknown", features = ["atomics"] }, -] -# When creating the dependency graph used as the source of truth when checks are -# executed, this field can be used to prune crates from the graph, removing them -# from the view of cargo-deny. This is an extremely heavy hammer, as if a crate -# is pruned from the graph, all of its dependencies will also be pruned unless -# they are connected to another crate in the graph that hasn't been pruned, -# so it should be used with care. The identifiers are [Package ID Specifications] -# (https://doc.rust-lang.org/cargo/reference/pkgid-spec.html) -#exclude = [] -# If true, metadata will be collected with `--all-features`. Note that this can't -# be toggled off if true, if you want to conditionally enable `--all-features` it -# is recommended to pass `--all-features` on the cmd line instead -all-features = false -# If true, metadata will be collected with `--no-default-features`. The same -# caveat with `all-features` applies -no-default-features = false -# If set, these feature will be enabled when collecting metadata. If `--features` -# is specified on the cmd line they will take precedence over this option. -#features = [] -# When outputting inclusion graphs in diagnostics that include features, this -# option can be used to specify the depth at which feature edges will be added. -# This option is included since the graphs can be quite large and the addition -# of features from the crate(s) to all of the graph roots can be far too verbose. -# This option can be overridden via `--feature-depth` on the cmd line -feature-depth = 1 - -# This section is considered when running `cargo deny check advisories` -# More documentation for the advisories section can be found here: -# https://embarkstudios.github.io/cargo-deny/checks/advisories/cfg.html -[advisories] -# The path where the advisory database is cloned/fetched into -db-path = "~/.cargo/advisory-db" -# The url(s) of the advisory databases to use -db-urls = ["https://github.com/rustsec/advisory-db"] -# The lint level for security vulnerabilities -vulnerability = "deny" -# The lint level for unmaintained crates -unmaintained = "warn" -# The lint level for crates that have been yanked from their source registry -yanked = "warn" -# The lint level for crates with security notices. Note that as of -# 2019-12-17 there are no security notice advisories in -# https://github.com/rustsec/advisory-db -notice = "warn" -# A list of advisory IDs to ignore. Note that ignored advisories will still -# output a note when they are encountered. -ignore = [ - #"RUSTSEC-0000-0000", -] -# Threshold for security vulnerabilities, any vulnerability with a CVSS score -# lower than the range specified will be ignored. Note that ignored advisories -# will still output a note when they are encountered. -# * None - CVSS Score 0.0 -# * Low - CVSS Score 0.1 - 3.9 -# * Medium - CVSS Score 4.0 - 6.9 -# * High - CVSS Score 7.0 - 8.9 -# * Critical - CVSS Score 9.0 - 10.0 -#severity-threshold = - -# If this is true, then cargo deny will use the git executable to fetch advisory database. -# If this is false, then it uses a built-in git library. -# Setting this to true can be helpful if you have special authentication requirements that cargo-deny does not support. -# See Git Authentication for more information about setting up git authentication. -#git-fetch-with-cli = true - -# This section is considered when running `cargo deny check licenses` -# More documentation for the licenses section can be found here: -# https://embarkstudios.github.io/cargo-deny/checks/licenses/cfg.html -[licenses] -# The lint level for crates which do not have a detectable license -unlicensed = "deny" -# List of explicitly allowed licenses -# See https://spdx.org/licenses/ for list of possible licenses -# [possible values: any SPDX 3.11 short identifier (+ optional exception)]. -allow = [ - "MIT", - "Apache-2.0", -] -# List of explicitly disallowed licenses -# See https://spdx.org/licenses/ for list of possible licenses -# [possible values: any SPDX 3.11 short identifier (+ optional exception)]. -deny = [ - #"Nokia", -] -# Lint level for licenses considered copyleft -copyleft = "deny" -# Blanket approval or denial for OSI-approved or FSF Free/Libre licenses -# * both - The license will be approved if it is both OSI-approved *AND* FSF -# * either - The license will be approved if it is either OSI-approved *OR* FSF -# * osi - The license will be approved if it is OSI approved -# * fsf - The license will be approved if it is FSF Free -# * osi-only - The license will be approved if it is OSI-approved *AND NOT* FSF -# * fsf-only - The license will be approved if it is FSF *AND NOT* OSI-approved -# * neither - This predicate is ignored and the default lint level is used -allow-osi-fsf-free = "neither" -# Lint level used when no other predicates are matched -# 1. License isn't in the allow or deny lists -# 2. License isn't copyleft -# 3. License isn't OSI/FSF, or allow-osi-fsf-free = "neither" -default = "deny" -# The confidence threshold for detecting a license from license text. -# The higher the value, the more closely the license text must be to the -# canonical license text of a valid SPDX license file. -# [possible values: any between 0.0 and 1.0]. -confidence-threshold = 0.8 -# Allow 1 or more licenses on a per-crate basis, so that particular licenses -# aren't accepted for every possible crate as with the normal allow list -exceptions = [ - # Each entry is the crate and version constraint, and its specific allow - # list - #{ allow = ["Zlib"], name = "adler32", version = "*" }, -] - -# Some crates don't have (easily) machine readable licensing information, -# adding a clarification entry for it allows you to manually specify the -# licensing information -#[[licenses.clarify]] -# The name of the crate the clarification applies to -#name = "ring" -# The optional version constraint for the crate -#version = "*" -# The SPDX expression for the license requirements of the crate -#expression = "MIT AND ISC AND OpenSSL" -# One or more files in the crate's source used as the "source of truth" for -# the license expression. If the contents match, the clarification will be used -# when running the license check, otherwise the clarification will be ignored -# and the crate will be checked normally, which may produce warnings or errors -# depending on the rest of your configuration -#license-files = [ - # Each entry is a crate relative path, and the (opaque) hash of its contents - #{ path = "LICENSE", hash = 0xbd0eed23 } -#] - -[licenses.private] -# If true, ignores workspace crates that aren't published, or are only -# published to private registries. -# To see how to mark a crate as unpublished (to the official registry), -# visit https://doc.rust-lang.org/cargo/reference/manifest.html#the-publish-field. -ignore = false -# One or more private registries that you might publish crates to, if a crate -# is only published to private registries, and ignore is true, the crate will -# not have its license(s) checked -registries = [ - #"https://sekretz.com/registry -] - -# This section is considered when running `cargo deny check bans`. -# More documentation about the 'bans' section can be found here: -# https://embarkstudios.github.io/cargo-deny/checks/bans/cfg.html -[bans] -# Lint level for when multiple versions of the same crate are detected -multiple-versions = "warn" -# Lint level for when a crate version requirement is `*` -wildcards = "allow" -# The graph highlighting used when creating dotgraphs for crates -# with multiple versions -# * lowest-version - The path to the lowest versioned duplicate is highlighted -# * simplest-path - The path to the version with the fewest edges is highlighted -# * all - Both lowest-version and simplest-path are used -highlight = "all" -# The default lint level for `default` features for crates that are members of -# the workspace that is being checked. This can be overridden by allowing/denying -# `default` on a crate-by-crate basis if desired. -workspace-default-features = "allow" -# The default lint level for `default` features for external crates that are not -# members of the workspace. This can be overridden by allowing/denying `default` -# on a crate-by-crate basis if desired. -external-default-features = "allow" -# List of crates that are allowed. Use with care! -allow = [ - #{ name = "ansi_term", version = "=0.11.0" }, -] -# List of crates to deny -deny = [ - # Each entry the name of a crate and a version range. If version is - # not specified, all versions will be matched. - #{ name = "ansi_term", version = "=0.11.0" }, - # - # Wrapper crates can optionally be specified to allow the crate when it - # is a direct dependency of the otherwise banned crate - #{ name = "ansi_term", version = "=0.11.0", wrappers = [] }, -] - -# List of features to allow/deny -# Each entry the name of a crate and a version range. If version is -# not specified, all versions will be matched. -#[[bans.features]] -#name = "reqwest" -# Features to not allow -#deny = ["json"] -# Features to allow -#allow = [ -# "rustls", -# "__rustls", -# "__tls", -# "hyper-rustls", -# "rustls", -# "rustls-pemfile", -# "rustls-tls-webpki-roots", -# "tokio-rustls", -# "webpki-roots", -#] -# If true, the allowed features must exactly match the enabled feature set. If -# this is set there is no point setting `deny` -#exact = true - -# Certain crates/versions that will be skipped when doing duplicate detection. -skip = [ - #{ name = "ansi_term", version = "=0.11.0" }, -] -# Similarly to `skip` allows you to skip certain crates during duplicate -# detection. Unlike skip, it also includes the entire tree of transitive -# dependencies starting at the specified crate, up to a certain depth, which is -# by default infinite. -skip-tree = [ - #{ name = "ansi_term", version = "=0.11.0", depth = 20 }, -] - -# This section is considered when running `cargo deny check sources`. -# More documentation about the 'sources' section can be found here: -# https://embarkstudios.github.io/cargo-deny/checks/sources/cfg.html -[sources] -# Lint level for what to happen when a crate from a crate registry that is not -# in the allow list is encountered -unknown-registry = "warn" -# Lint level for what to happen when a crate from a git repository that is not -# in the allow list is encountered -unknown-git = "warn" -# List of URLs for allowed crate registries. Defaults to the crates.io index -# if not specified. If it is specified but empty, no registries are allowed. -allow-registry = ["https://github.com/rust-lang/crates.io-index"] -# List of URLs for allowed Git repositories -allow-git = [] - -[sources.allow-org] -# 1 or more github.com organizations to allow git sources for -github = [] -# 1 or more gitlab.com organizations to allow git sources for -gitlab = [] -# 1 or more bitbucket.org organizations to allow git sources for -bitbucket = [] diff -Nru temporalio-1.3.0/vendor/which/README.md temporalio-1.3.0/vendor/which/README.md --- temporalio-1.3.0/vendor/which/README.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/which/README.md 2023-10-30 19:40:00.000000000 +0000 @@ -30,10 +30,6 @@ .for_each(|pth| println!("{}", pth.to_string_lossy())); ``` -## MSRV - -This crate currently has an MSRV of Rust 1.63. Increasing the MSRV is considered a breaking change and thus requires a major version bump. - ## Documentation The documentation is [available online](https://docs.rs/which/). diff -Nru temporalio-1.3.0/vendor/which/src/checker.rs temporalio-1.3.0/vendor/which/src/checker.rs --- temporalio-1.3.0/vendor/which/src/checker.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/which/src/checker.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,5 +1,9 @@ use crate::finder::Checker; +#[cfg(unix)] +use std::ffi::CString; use std::fs; +#[cfg(unix)] +use std::os::unix::ffi::OsStrExt; use std::path::Path; pub struct ExecutableChecker; @@ -11,10 +15,11 @@ } impl Checker for ExecutableChecker { - #[cfg(any(unix, target_os = "wasi"))] + #[cfg(unix)] fn is_valid(&self, path: &Path) -> bool { - use rustix::fs as rfs; - rfs::access(path, rfs::Access::EXEC_OK).is_ok() + CString::new(path.as_os_str().as_bytes()) + .map(|c| unsafe { libc::access(c.as_ptr(), libc::X_OK) == 0 }) + .unwrap_or(false) } #[cfg(windows)] diff -Nru temporalio-1.3.0/vendor/which/src/finder.rs temporalio-1.3.0/vendor/which/src/finder.rs --- temporalio-1.3.0/vendor/which/src/finder.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/which/src/finder.rs 2023-10-30 19:40:00.000000000 +0000 @@ -7,22 +7,12 @@ use regex::Regex; #[cfg(feature = "regex")] use std::borrow::Borrow; -use std::borrow::Cow; use std::env; use std::ffi::OsStr; #[cfg(any(feature = "regex", target_os = "windows"))] use std::fs; use std::iter; -use std::path::{Component, Path, PathBuf}; - -// Home dir shim, use home crate when possible. Otherwise, return None -#[cfg(any(windows, unix, target_os = "redox"))] -use home::home_dir; - -#[cfg(not(any(windows, unix, target_os = "redox")))] -fn home_dir() -> Option { - None -} +use std::path::{Path, PathBuf}; pub trait Checker { fn is_valid(&self, path: &Path) -> bool; @@ -145,14 +135,12 @@ where P: IntoIterator, { - let new_paths = paths - .into_iter() - .map(move |p| tilde_expansion(&p).join(binary_name.clone())); + let new_paths = paths.into_iter().map(move |p| p.join(binary_name.clone())); Self::append_extension(new_paths) } - #[cfg(not(windows))] + #[cfg(unix)] fn append_extension

(paths: P) -> impl IntoIterator where P: IntoIterator, @@ -222,21 +210,6 @@ } } -fn tilde_expansion(p: &PathBuf) -> Cow<'_, PathBuf> { - let mut component_iter = p.components(); - if let Some(Component::Normal(o)) = component_iter.next() { - if o == "~" { - let mut new_path = home_dir().unwrap_or_default(); - new_path.extend(component_iter); - Cow::Owned(new_path) - } else { - Cow::Borrowed(p) - } - } else { - Cow::Borrowed(p) - } -} - #[cfg(target_os = "windows")] fn correct_casing(mut p: PathBuf) -> PathBuf { if let (Some(parent), Some(file_name)) = (p.parent(), p.file_name()) { diff -Nru temporalio-1.3.0/vendor/which/src/lib.rs temporalio-1.3.0/vendor/which/src/lib.rs --- temporalio-1.3.0/vendor/which/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/which/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -14,8 +14,6 @@ //! //! ``` -#![forbid(unsafe_code)] - mod checker; mod error; mod finder; @@ -307,7 +305,6 @@ /// `cwd` (aka current working directory) or `binary_name` was set previously, this will panic, as those options /// are incompatible with `regex`. #[allow(unused_variables)] - #[allow(unused_mut)] pub fn regex(mut self, regex: Regex) -> Self { #[cfg(not(feature = "regex"))] { diff -Nru temporalio-1.3.0/vendor/which/tests/basic.rs temporalio-1.3.0/vendor/which/tests/basic.rs --- temporalio-1.3.0/vendor/which/tests/basic.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/which/tests/basic.rs 2023-10-30 19:40:00.000000000 +0000 @@ -9,7 +9,6 @@ use std::{env, vec}; use tempfile::TempDir; -#[derive(Debug)] struct TestFixture { /// Temp directory. pub tempdir: TempDir, @@ -22,19 +21,14 @@ const SUBDIRS: &[&str] = &["a", "b", "c"]; const BIN_NAME: &str = "bin"; -#[allow(clippy::unnecessary_cast)] #[cfg(unix)] fn mk_bin(dir: &Path, path: &str, extension: &str) -> io::Result { use std::os::unix::fs::OpenOptionsExt; let bin = dir.join(path).with_extension(extension); - - #[cfg(any(target_os = "macos", target_os = "linux"))] - let mode = rustix::fs::Mode::XUSR.bits() as u32; - let mode = 0o666 | mode; fs::OpenOptions::new() .write(true) .create(true) - .mode(mode) + .mode(0o666 | (libc::S_IXUSR as u32)) .open(&bin) .and_then(|_f| bin.canonicalize()) } @@ -84,33 +78,6 @@ } } - #[cfg(unix)] - pub fn new_with_tilde_path() -> TestFixture { - let tempdir = tempfile::tempdir().unwrap(); - let mut builder = fs::DirBuilder::new(); - builder.recursive(true); - let mut paths = vec![]; - let mut bins = vec![]; - for d in SUBDIRS.iter() { - let p = PathBuf::from("~").join(d); - let p_bin = tempdir.path().join(d); - builder.create(&p_bin).unwrap(); - bins.push(mk_bin(&p_bin, BIN_NAME, "").unwrap()); - bins.push(mk_bin(&p_bin, BIN_NAME, "exe").unwrap()); - bins.push(mk_bin(&p_bin, BIN_NAME, "cmd").unwrap()); - paths.push(p); - } - let p = tempdir.path().join("win-bin"); - builder.create(&p).unwrap(); - bins.push(mk_bin(&p, "win-bin", "exe").unwrap()); - paths.push(p); - TestFixture { - tempdir, - paths: env::join_paths(paths).unwrap(), - bins, - } - } - #[allow(dead_code)] pub fn touch(&self, path: &str, extension: &str) -> io::Result { touch(self.tempdir.path(), path, extension) @@ -153,36 +120,16 @@ #[cfg(unix)] fn test_which() { let f = TestFixture::new(); - assert_eq!(_which(&f, BIN_NAME).unwrap(), f.bins[0]) + assert_eq!(_which(&f, &BIN_NAME).unwrap(), f.bins[0]) } #[test] #[cfg(windows)] fn test_which() { let f = TestFixture::new(); - assert_eq!(_which(&f, BIN_NAME).unwrap(), f.bins[1]) -} - -#[test] -#[cfg(unix)] -fn test_which_tilde() { - let old_home = env::var_os("HOME"); - let f = TestFixture::new_with_tilde_path(); - env::set_var("HOME", f.tempdir.path().as_os_str()); - assert_eq!(_which(&f, BIN_NAME).unwrap(), f.bins[0]); - if let Some(old_home) = old_home { - env::set_var("HOME", old_home); - } else { - env::remove_var("HOME"); - } + assert_eq!(_which(&f, &BIN_NAME).unwrap(), f.bins[1]) } -// Windows test_which_tilde intentionally omitted because -// we don't want to pollute the home directory. -// It's non-trivial to adjust which directory Windows thinks -// is the home directory. At this time, tilde expansion has -// no Windows specific behavior. It works as normal on Windows. - #[test] #[cfg(all(unix, feature = "regex"))] fn test_which_re_in_with_matches() { @@ -191,7 +138,10 @@ f.mk_bin("b/bin_1", "").unwrap(); let re = Regex::new(r"bin_\d").unwrap(); - let result: Vec = which::which_re_in(re, Some(f.paths)).unwrap().collect(); + let result: Vec = which::which_re_in(re, Some(f.paths)) + .unwrap() + .into_iter() + .collect(); let temp = f.tempdir; @@ -207,7 +157,10 @@ let f = TestFixture::new(); let re = Regex::new(r"bi[^n]").unwrap(); - let result: Vec = which::which_re_in(re, Some(f.paths)).unwrap().collect(); + let result: Vec = which::which_re_in(re, Some(f.paths)) + .unwrap() + .into_iter() + .collect(); assert_eq!(result, Vec::::new()) } @@ -234,7 +187,7 @@ fn test_which_extension() { let f = TestFixture::new(); let b = Path::new(&BIN_NAME).with_extension(""); - assert_eq!(_which(&f, b).unwrap(), f.bins[0]) + assert_eq!(_which(&f, &b).unwrap(), f.bins[0]) } #[test] @@ -242,7 +195,7 @@ fn test_which_extension() { let f = TestFixture::new(); let b = Path::new(&BIN_NAME).with_extension("cmd"); - assert_eq!(_which(&f, b).unwrap(), f.bins[2]) + assert_eq!(_which(&f, &b).unwrap(), f.bins[2]) } #[test] @@ -250,7 +203,7 @@ fn test_which_no_extension() { let f = TestFixture::new(); let b = Path::new("win-bin"); - let which_result = which::which_in(b, Some(&f.paths), ".").unwrap(); + let which_result = which::which_in(&b, Some(&f.paths), ".").unwrap(); // Make sure the extension is the correct case. assert_eq!(which_result.extension(), f.bins[9].extension()); assert_eq!(fs::canonicalize(&which_result).unwrap(), f.bins[9]) @@ -320,7 +273,7 @@ // is accepted. let f = TestFixture::new(); let p = &f.bins[4]; - assert_eq!(_which(&f, p).unwrap(), f.bins[4].canonicalize().unwrap()); + assert_eq!(_which(&f, &p).unwrap(), f.bins[4].canonicalize().unwrap()); } #[test] @@ -328,8 +281,8 @@ fn test_which_absolute_extension() { let f = TestFixture::new(); // Don't append EXE_EXTENSION here. - let b = f.bins[3].parent().unwrap().join(BIN_NAME); - assert_eq!(_which(&f, b).unwrap(), f.bins[3].canonicalize().unwrap()); + let b = f.bins[3].parent().unwrap().join(&BIN_NAME); + assert_eq!(_which(&f, &b).unwrap(), f.bins[3].canonicalize().unwrap()); } #[test] @@ -337,8 +290,8 @@ fn test_which_absolute_extension() { let f = TestFixture::new(); // Don't append EXE_EXTENSION here. - let b = f.bins[4].parent().unwrap().join(BIN_NAME); - assert_eq!(_which(&f, b).unwrap(), f.bins[4].canonicalize().unwrap()); + let b = f.bins[4].parent().unwrap().join(&BIN_NAME); + assert_eq!(_which(&f, &b).unwrap(), f.bins[4].canonicalize().unwrap()); } #[test] @@ -368,7 +321,7 @@ // so test a relative path with an extension here. let f = TestFixture::new(); let b = Path::new("b/bin").with_extension(env::consts::EXE_EXTENSION); - assert_eq!(_which(&f, b).unwrap(), f.bins[3].canonicalize().unwrap()); + assert_eq!(_which(&f, &b).unwrap(), f.bins[3].canonicalize().unwrap()); } #[test] @@ -378,7 +331,7 @@ // so test a relative path with an extension here. let f = TestFixture::new(); let b = Path::new("b/bin").with_extension("cmd"); - assert_eq!(_which(&f, b).unwrap(), f.bins[5].canonicalize().unwrap()); + assert_eq!(_which(&f, &b).unwrap(), f.bins[5].canonicalize().unwrap()); } #[test] @@ -388,7 +341,7 @@ // is accepted. let f = TestFixture::new(); let b = Path::new("b/bin").with_extension("EXE"); - assert_eq!(_which(&f, b).unwrap(), f.bins[4].canonicalize().unwrap()); + assert_eq!(_which(&f, &b).unwrap(), f.bins[4].canonicalize().unwrap()); } #[test] @@ -426,7 +379,7 @@ // Shouldn't return non-executable files, even if given an absolute path. let f = TestFixture::new(); let b = f.touch("b/another", "").unwrap(); - assert!(_which(&f, b).is_err()); + assert!(_which(&f, &b).is_err()); } #[test] diff -Nru temporalio-1.3.0/vendor/zerocopy/.cargo-checksum.json temporalio-1.3.0/vendor/zerocopy/.cargo-checksum.json --- temporalio-1.3.0/vendor/zerocopy/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/.cargo-checksum.json 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -{"files":{"CONTRIBUTING.md":"47968395d4bee21ffd1f4e665625ba6c89b841a71dc92d0cac432aafbcbfe027","Cargo.toml":"f7b2d0358ca375c7b87b38e26edb249e0561f9fd0a14e748d2c196c184749268","INTERNAL.md":"d6f3929776cd6b195d926dda36b7db287f92fa17ed8dabb0c9c12eb6f945bd61","LICENSE-APACHE":"9d185ac6703c4b0453974c0d85e9eee43e6941009296bb1f5eb0b54e2329e9f3","LICENSE-BSD":"83c1763356e822adde0a2cae748d938a73fdc263849ccff6b27776dff213bd32","LICENSE-MIT":"1a2f5c12ddc934d58956aa5dbdd3255fe55fd957633ab7d0d39e4f0daa73f7df","POLICIES.md":"86009ace06a9e3525141e8b022b79be7113af83396f84c594aa7600959269cc4","README.md":"c3a723c453ebe1206129d14423f4979d2e48dbb1ff595957b53645a3e8f708f1","cargo.sh":"b561b46332d399104d439db179f7e95014e1a490296e32ac92fa9b07ebfe7d22","clippy.toml":"df67a6131fff2fe52309e797d2dfad080fc8cbdfcb1baa7f14415b3e397c291c","generate-readme.sh":"0b86377c6ca87971154b8f461e71d72727ecb65e550d2f96729d8949e5264155","rustfmt.toml":"33a21d11175200d203fcdb803c61a24fc461661bf8a2de7c9189af7ecee123c2","src/byteorder.rs":"1fe45a93aefe6ecaa08217c7203ee94d93ae3fcd57113025cf789d26953f12e8","src/lib.rs":"dd75d8a9dc6b52e017a36a6c75de66e759e615918a2e8e93089678ab92b3d03d","src/macro_util.rs":"0298c4e9d59e1dad9b827c726e230219c4870150e176a9f930aa7148efa2ebcf","src/macros.rs":"4d77b8eddb0a87ab1fc70e8aabe9e6d1e2fdb9a378e765f5cfb78cd79fbecdde","src/third_party/rust/LICENSE-APACHE":"62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a","src/third_party/rust/LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","src/third_party/rust/README.fuchsia":"5dc26ec369c273eb99679b43c5de4c41c82797e8800c3926c4c76912e9596ecf","src/third_party/rust/layout.rs":"9a14bc18d7ef893d31ca3cae5bed28882e8f33ead8c78ca3e3376be828d69143","src/util.rs":"85b496656910177394034c832fc30c2432edca9e46d0b8fe06b785885d136a07","src/wrappers.rs":"598520c9f56a1c6dff65f615cb386b95a02b131de72afd8b70dcdb2eabe993f1","testdata/include_value/data":"88d4266fd4e6338d13b845fcf289579d209c897823b9217da3e161936f031589","tests/trybuild.rs":"8b77ed684725d2e99fd7806d8f361cd2495b388cc463be3ff2fae25bcbe34c56","tests/ui-msrv/include_value_not_from_bytes.rs":"ea2a419e0c7ce12b4febe6139523184cba2b2c54c879177e0c58a5f78f0ec340","tests/ui-msrv/include_value_not_from_bytes.stderr":"57d634cea8f0906b08e7eea056d09b02364f2a656623116c29fdc706b5393926","tests/ui-msrv/include_value_wrong_size.rs":"418e8c86ebf5a28ee50bd6ae00550f62a7a0ef3a7e7fda965b3d2337b64f2c66","tests/ui-msrv/include_value_wrong_size.stderr":"40bcc6c0172b530cda18bf60d35550e219254a71c0a1e4b16417b17db6d18829","tests/ui-msrv/invalid-impls/invalid-impls.rs":"474d843ad40f3936adcd3ff592d815d8169813962ab9d99a68348b4b91aef10e","tests/ui-msrv/invalid-impls/invalid-impls.stderr":"ddc7a15d675f91b8b838c5c1b8e0d3973d981b11ce956e0f50d4880f0ff0e408","tests/ui-msrv/transmute-dst-not-frombytes.rs":"e00251eae67cdf8267a4963f212857a2a51de640a6f856c4b8df2a953caad25a","tests/ui-msrv/transmute-dst-not-frombytes.stderr":"537111d0377c9a255bb9cd43fa12646a901f0b8cf6b1fb5842fb5f0d41ea86e8","tests/ui-msrv/transmute-mut-alignment-increase.rs":"ba83c9cf01acf11352f7ee5b54cd73a451394fd78b8ddeb0637931c87adfd6ae","tests/ui-msrv/transmute-mut-alignment-increase.stderr":"9e879881032ab5ba28f8cc6a240bf96150c4a7fb3e55b1de0c808dc5e0b1179d","tests/ui-msrv/transmute-mut-const.rs":"4227f4c0dda6d6128f41b209ecc2bf941c7659c8de84cc0e418862d279baa78f","tests/ui-msrv/transmute-mut-const.stderr":"3c8dcb20b8cffd73f3b330b0199c5912ff015b51fce6d3acf684e388abb70a9c","tests/ui-msrv/transmute-mut-dst-generic.rs":"aa015679b75dac0c37d5c43782b5e9522257f6ba34a10a89d0c1eba524a7af5c","tests/ui-msrv/transmute-mut-dst-generic.stderr":"d19ae09a138d21aa64da708da85fd09b9b98a70c76cf397f5cbe7866ccbddbed","tests/ui-msrv/transmute-mut-dst-not-a-reference.rs":"5d784ab588f081bfc304501f811a85ea2662f88fff8274ccbd53172ec255212c","tests/ui-msrv/transmute-mut-dst-not-a-reference.stderr":"1cca08728f4b93b78757224420090f4ec0a2014043e9b1d86ffafe9fcc8f1faa","tests/ui-msrv/transmute-mut-dst-not-asbytes.rs":"b1f986b3433980d7572a80511ca5a758c91e0c761d01c50bc73ed025d45698a6","tests/ui-msrv/transmute-mut-dst-not-asbytes.stderr":"fd4a28b880eebd3d4f4b1f0388a26b372b07fd8186979970e2ea881379bf007b","tests/ui-msrv/transmute-mut-dst-not-frombytes.rs":"a4353eeb67b4701908e694738c5c4ce965afe4432f14e00e740684352f5ddd30","tests/ui-msrv/transmute-mut-dst-not-frombytes.stderr":"fd9e4c396c995be82b4bda2a28565f5d427d9733ae85f56cfb3922b1130fa06a","tests/ui-msrv/transmute-mut-dst-unsized.rs":"58c3423c07dd06ca98e61439f318ba5f3f7fc68ca9cb59371ebc482ad54709db","tests/ui-msrv/transmute-mut-dst-unsized.stderr":"b0c443b692859195ade80fb3650d51b4a01c2dd8b523322db84acfc3845b154d","tests/ui-msrv/transmute-mut-illegal-lifetime.rs":"ec18bf7b3d9bd2674b43d0e04fc0545227473d43b07e2bbccc19c2068df33673","tests/ui-msrv/transmute-mut-illegal-lifetime.stderr":"ff5965b190242ce05735d7c072c11565c5bd8609261c83dd06396ae8416dfbaa","tests/ui-msrv/transmute-mut-size-decrease.rs":"51aa423ec51a3c5579bbd7bac33adac8040629adc94eec3fb84825ef4f84f7bb","tests/ui-msrv/transmute-mut-size-decrease.stderr":"ae0c86cfbd85107ea908218c5389218a64a46ccf53a0bc553b9c17b48f475e0f","tests/ui-msrv/transmute-mut-size-increase.rs":"ecc34f87b2ec668338672be6bac82b4056ebe35d98fd5d9a210f43f7e866b8e1","tests/ui-msrv/transmute-mut-size-increase.stderr":"d8f4c9f85c59cf24f88e08b3e67796d1218a512e0082100bb63fe38a69186484","tests/ui-msrv/transmute-mut-src-dst-generic.rs":"613e00a353d1b359b57450bb408da585528f84b7eaf039a0c8d86bde1803395f","tests/ui-msrv/transmute-mut-src-dst-generic.stderr":"ec064415b76e341316de3886f3222ab826c2621ea641eb62285b1814369f48c2","tests/ui-msrv/transmute-mut-src-dst-not-references.rs":"0b73d42fbcecba3483e24d4e9296d24d551de18822b45120e225356c5ccefad8","tests/ui-msrv/transmute-mut-src-dst-not-references.stderr":"fc2740d55afdb07bdde457ac259f48ef5b3e13503968299e51791576328b207d","tests/ui-msrv/transmute-mut-src-dst-unsized.rs":"8ccf11a1990dbfd7ed7180c5e73e3a278f072f0a86eb2810f1b2c737ece76c57","tests/ui-msrv/transmute-mut-src-dst-unsized.stderr":"a47a39be560a9a80a31ebd6ee30178f2e375e9450c61a86effb3611f654e302c","tests/ui-msrv/transmute-mut-src-generic.rs":"2cfe526643436df07247cc2583e1d097b247411185952132433127a159527669","tests/ui-msrv/transmute-mut-src-generic.stderr":"a7588c104a34936839fdef78029fdc3929f08f6befac2a94ef5fce5364cd89ca","tests/ui-msrv/transmute-mut-src-immutable.rs":"606aba0c01726255c9be7e67a032ce854209c62dffec16d5dd2c8f484e19979a","tests/ui-msrv/transmute-mut-src-immutable.stderr":"6854b18881116cecf0c716eac01aac312bfe43a295a797c4ad01ac8b7ea7d81c","tests/ui-msrv/transmute-mut-src-not-a-reference.rs":"e627a60c6f6d1b398bdcfc9307dbc57b268cc784b4967d1afaceed7eebd5db47","tests/ui-msrv/transmute-mut-src-not-a-reference.stderr":"538af460b18f588b6075307de50ba1307f98189d2f2aea74346a77ad8b64710c","tests/ui-msrv/transmute-mut-src-not-asbytes.rs":"d0a6ddcfe31ac34ccc550090b80a67a010202bee12a39c230dd4374ef81a520c","tests/ui-msrv/transmute-mut-src-not-asbytes.stderr":"446ab2326cedeae89bd951561206dddcb546684629b12e46e3de1025caa7c894","tests/ui-msrv/transmute-mut-src-not-frombytes.rs":"5866e7d74baf3efb500338ba91a76f221e4a2479376e6921ec831fa284c9b3db","tests/ui-msrv/transmute-mut-src-not-frombytes.stderr":"659915278b39092444f82347fbd62d4bd0c12cecb1d5976159b3fd90c8b995f2","tests/ui-msrv/transmute-mut-src-unsized.rs":"6676d8f29f0a32418f86d4423c464f4e0fdb8fe9ee8aa87f86c5fcdf8bd5e197","tests/ui-msrv/transmute-mut-src-unsized.stderr":"7f9a60f0bafa5d59403e49f2a6b68a56fa2be6c2a62d785fe4cb51bc056159cc","tests/ui-msrv/transmute-ptr-to-usize.rs":"ea33dc39115509988d9abd6ac6536d88d82082417b21da9f9bc8cf8369c69618","tests/ui-msrv/transmute-ptr-to-usize.stderr":"e8713417a977f07158a58aec6690c3a79b49cf5edb9e66f6c1d218a1a55f47eb","tests/ui-msrv/transmute-ref-alignment-increase.rs":"a5028469f90ca572ec1c73131f9a8a0a1cbca47de0dcb9003ba98de378def783","tests/ui-msrv/transmute-ref-alignment-increase.stderr":"2c56277ab280ac4477ccd3ca4c48ac60e096a95579bfea58da81d9082d8ab499","tests/ui-msrv/transmute-ref-dst-generic.rs":"4a6b56491fd59646d1d1d8edbcc9d7de0dc69a9e6e4779f3cfd90e287f11557c","tests/ui-msrv/transmute-ref-dst-generic.stderr":"8f47f9eabb44e8d5c561359237e79d42a998b615b526666e16db325b9cea8a09","tests/ui-msrv/transmute-ref-dst-mutable.rs":"1c48caae9912f70dec5f5a99a0c880fe6a3022f11fd412438b8a1576803e5f73","tests/ui-msrv/transmute-ref-dst-mutable.stderr":"289e040b3e725546081dfd07640e499a5622915954f12c871708d3f46ff43d7a","tests/ui-msrv/transmute-ref-dst-not-a-reference.rs":"c4b8a6c1970e30390d0a301e2dbe718b9eeef743299f7e91cd12c582ec203af7","tests/ui-msrv/transmute-ref-dst-not-a-reference.stderr":"b6c1f2aede85cce47f5ca379b9ae5a77c777e7c60de6590578c47432ebacae88","tests/ui-msrv/transmute-ref-dst-not-frombytes.rs":"42aab9630fbab93f400713a1730d6dd6a89f821b0fa4dd5347aabe5e78b13aff","tests/ui-msrv/transmute-ref-dst-not-frombytes.stderr":"00b6c3472c0f84f4e32217c1c839c0eab1bf449abbc8bb8f60878ce62c360c8b","tests/ui-msrv/transmute-ref-dst-unsized.rs":"c374df8d00541fd34fff37e231e341501a427961f60d88ad3e3c375085cc060d","tests/ui-msrv/transmute-ref-dst-unsized.stderr":"73636b1d142730f1330753c3fa14c88a32a23bf1c0741503b99610a506a8f66b","tests/ui-msrv/transmute-ref-illegal-lifetime.rs":"6812bbf7ec851a8591464f10864dbd1f225e65ed5793b6f6375cbe8a9db50b14","tests/ui-msrv/transmute-ref-illegal-lifetime.stderr":"4f2a3e71cda94564f2343ca9ff23de3eca0d2ff465cedacab187151183813092","tests/ui-msrv/transmute-ref-size-decrease.rs":"939fb562e4678368e59fdafb3a597fd54a661fd09d9ecb23c6e626ff59b45384","tests/ui-msrv/transmute-ref-size-decrease.stderr":"686597597e9f87e717b702bf6b8b6a52d14c5612ec267d48a01b442ab14648e1","tests/ui-msrv/transmute-ref-size-increase.rs":"f66ab294f7618abfac5c503570137759afceb0dd26c8802bb1786b8873fe5670","tests/ui-msrv/transmute-ref-size-increase.stderr":"f1ad62609362a24b5cf47761e30e2cf0a35db82682e041faf251b2a1f822da7c","tests/ui-msrv/transmute-ref-src-dst-generic.rs":"96a6f6580307e6a397af8ca688a8a65144dff5240372203bd9f02bad6a41fd1e","tests/ui-msrv/transmute-ref-src-dst-generic.stderr":"ca3c1493cbab64b5af7c3c4ea88ca16f6bb2478865b0dbe9d4a28d3b11d5fad1","tests/ui-msrv/transmute-ref-src-dst-not-references.rs":"7311602a0153b260d819e9608e8e66ef5904919a2349a95187919d8211e48e23","tests/ui-msrv/transmute-ref-src-dst-not-references.stderr":"003bb1ccb5cf8322416e00e0fa5645f94d76aad875e60d281daae9625eb583a4","tests/ui-msrv/transmute-ref-src-dst-unsized.rs":"f83e0225e824b7526d7732ef5d759b32358e5db50c3c6a318d2b5dcc2eb3c707","tests/ui-msrv/transmute-ref-src-dst-unsized.stderr":"558be2a5b90f3b3a304d5ae94ed3f7cd369e1e0ad03991ff57500913232ea8de","tests/ui-msrv/transmute-ref-src-generic.rs":"ac1699aeca61c82aff5dac51d387a4ef7522faf2b2dfc56af398a2dc9d53745b","tests/ui-msrv/transmute-ref-src-generic.stderr":"2ba4f5f66b2a2eae90f2cb4b28bb92b066fcaf17412ca777e7d9823697d64736","tests/ui-msrv/transmute-ref-src-not-a-reference.rs":"a921f168fa6cb3c6a19894cecdb118bc3164275746672a916aa5194b92f2fb57","tests/ui-msrv/transmute-ref-src-not-a-reference.stderr":"5a8d829089820ec79d9cd8d9ffac7dbde430914fdad691d46edcd96414d5cad0","tests/ui-msrv/transmute-ref-src-not-asbytes.rs":"09aabae9e4634a5432bf7225240954d7b0592994c97a927e0469e27854588232","tests/ui-msrv/transmute-ref-src-not-asbytes.stderr":"bbd65ef7225a7a39f8c53362a1f137a6b294227b0d2b658fa8082742cda4a8bf","tests/ui-msrv/transmute-ref-src-unsized.rs":"d7797488f0ab5db89944ac7db25625c63aef72e6e4ed481d00a083449050b813","tests/ui-msrv/transmute-ref-src-unsized.stderr":"68537a0c14f72addd12d9e2a75f1a965e730a7ee8da04303402ecd69fe6de95e","tests/ui-msrv/transmute-size-decrease.rs":"c63dd10ddab58e282b033132d79fd21e80edb0c654f856679237977f62ced1ed","tests/ui-msrv/transmute-size-decrease.stderr":"978a9600a42a75fb33e46d10ac1485ef7c0a26054d15e52ec7e13023780d919e","tests/ui-msrv/transmute-size-increase.rs":"9413442e6e3c574bd7e36e8d4242000c1513624a4edc97567695a81b5851c491","tests/ui-msrv/transmute-size-increase.stderr":"168c9bb1045d125b069859d88132b7855a161e1353e1ff3d3f0bfcb70a831128","tests/ui-msrv/transmute-src-not-asbytes.rs":"8e2a76d99734c0502ba9daa8c7c2e34ca830ffd6024d3f7f29363d4263e89f74","tests/ui-msrv/transmute-src-not-asbytes.stderr":"e5913ff39e19e7f38b7aebe19f1930810c898d34fb7e7815c1404eff715f0414","tests/ui-nightly/include_value_not_from_bytes.rs":"ea2a419e0c7ce12b4febe6139523184cba2b2c54c879177e0c58a5f78f0ec340","tests/ui-nightly/include_value_not_from_bytes.stderr":"ca8e43f83feaf9210369fe37b2d31cacac7839e9bdd073aa6bcdc4bf11a88354","tests/ui-nightly/include_value_wrong_size.rs":"418e8c86ebf5a28ee50bd6ae00550f62a7a0ef3a7e7fda965b3d2337b64f2c66","tests/ui-nightly/include_value_wrong_size.stderr":"2b340b79ab4de286609aa5bf561c550ac3f30818df34bc659b54a58f4565501b","tests/ui-nightly/invalid-impls/invalid-impls.rs":"474d843ad40f3936adcd3ff592d815d8169813962ab9d99a68348b4b91aef10e","tests/ui-nightly/invalid-impls/invalid-impls.stderr":"0666e32657fa5f7292c62f34c0178c8dc442c53cf6f4d795894684b3e7b3e570","tests/ui-nightly/transmute-dst-not-frombytes.rs":"e00251eae67cdf8267a4963f212857a2a51de640a6f856c4b8df2a953caad25a","tests/ui-nightly/transmute-dst-not-frombytes.stderr":"046d7e096f089ede594d360a36a9c1ab9f6e456576218fee3c9781169bf3adc4","tests/ui-nightly/transmute-mut-alignment-increase.rs":"ba83c9cf01acf11352f7ee5b54cd73a451394fd78b8ddeb0637931c87adfd6ae","tests/ui-nightly/transmute-mut-alignment-increase.stderr":"db521ff9c180434136b0e8421823435be8ed23c7ac85d9a83c479ad1b8153281","tests/ui-nightly/transmute-mut-const.rs":"4227f4c0dda6d6128f41b209ecc2bf941c7659c8de84cc0e418862d279baa78f","tests/ui-nightly/transmute-mut-const.stderr":"3d84712235a0e819e0286ddfccbf771cf3d4b03c944eb2794b75555499b3295f","tests/ui-nightly/transmute-mut-dst-generic.rs":"aa015679b75dac0c37d5c43782b5e9522257f6ba34a10a89d0c1eba524a7af5c","tests/ui-nightly/transmute-mut-dst-generic.stderr":"d012039fa54f3d7cc8ee7275637964e7d83f8067545260676326b571bca46617","tests/ui-nightly/transmute-mut-dst-not-a-reference.rs":"5d784ab588f081bfc304501f811a85ea2662f88fff8274ccbd53172ec255212c","tests/ui-nightly/transmute-mut-dst-not-a-reference.stderr":"9d21ae45aff909bf6e6feca6c60fae8db1e4318935aede558bee1e243ede59f8","tests/ui-nightly/transmute-mut-dst-not-asbytes.rs":"b1f986b3433980d7572a80511ca5a758c91e0c761d01c50bc73ed025d45698a6","tests/ui-nightly/transmute-mut-dst-not-asbytes.stderr":"5d77d9085413d8cea2572b574e882b7894898c2ec771059ff2b0e5f6acd11ca7","tests/ui-nightly/transmute-mut-dst-not-frombytes.rs":"a4353eeb67b4701908e694738c5c4ce965afe4432f14e00e740684352f5ddd30","tests/ui-nightly/transmute-mut-dst-not-frombytes.stderr":"6d4f31f9698099bf52e45debdbaafd4ae85fb74c353d3d76c20fdb6414ea7a9b","tests/ui-nightly/transmute-mut-dst-unsized.rs":"58c3423c07dd06ca98e61439f318ba5f3f7fc68ca9cb59371ebc482ad54709db","tests/ui-nightly/transmute-mut-dst-unsized.stderr":"0df79b2009b5f8d237d81957b5fbaa04181de59306ba2fe77027081592f4c6d9","tests/ui-nightly/transmute-mut-illegal-lifetime.rs":"ec18bf7b3d9bd2674b43d0e04fc0545227473d43b07e2bbccc19c2068df33673","tests/ui-nightly/transmute-mut-illegal-lifetime.stderr":"b0379252732ca51314077fa20d3fb4bfcbee61f486229547c807ed0d7dede9c8","tests/ui-nightly/transmute-mut-size-decrease.rs":"51aa423ec51a3c5579bbd7bac33adac8040629adc94eec3fb84825ef4f84f7bb","tests/ui-nightly/transmute-mut-size-decrease.stderr":"9294c2562503924704673967f93afbfd4b1d84abbf76318636105acdc3f37a63","tests/ui-nightly/transmute-mut-size-increase.rs":"ecc34f87b2ec668338672be6bac82b4056ebe35d98fd5d9a210f43f7e866b8e1","tests/ui-nightly/transmute-mut-size-increase.stderr":"6858e39d6238843faa0ec4bf199f88d5013f1b50a811f5e882837f01eea00f93","tests/ui-nightly/transmute-mut-src-dst-generic.rs":"613e00a353d1b359b57450bb408da585528f84b7eaf039a0c8d86bde1803395f","tests/ui-nightly/transmute-mut-src-dst-generic.stderr":"f6a7bb45e58bf80a25a4e694e881f9c38f2a5d33817d9337d41a6d2c2aef93e8","tests/ui-nightly/transmute-mut-src-dst-not-references.rs":"0b73d42fbcecba3483e24d4e9296d24d551de18822b45120e225356c5ccefad8","tests/ui-nightly/transmute-mut-src-dst-not-references.stderr":"0e1e17242ec0b1e9052087b18ccdde9fa117e430a3675b624c49d36eb933ee88","tests/ui-nightly/transmute-mut-src-dst-unsized.rs":"8ccf11a1990dbfd7ed7180c5e73e3a278f072f0a86eb2810f1b2c737ece76c57","tests/ui-nightly/transmute-mut-src-dst-unsized.stderr":"608ed4e9d52c8c52773afea6565c42e30d8c6791c8a8d929235eb0bdcd9db1a6","tests/ui-nightly/transmute-mut-src-generic.rs":"2cfe526643436df07247cc2583e1d097b247411185952132433127a159527669","tests/ui-nightly/transmute-mut-src-generic.stderr":"3c54bad3b3ab88b5c046bfb6ef79e0162ec7228447a1ba8321d9da754d536f20","tests/ui-nightly/transmute-mut-src-immutable.rs":"606aba0c01726255c9be7e67a032ce854209c62dffec16d5dd2c8f484e19979a","tests/ui-nightly/transmute-mut-src-immutable.stderr":"d99fc596f5732e5a4b193028812e047ba0c748017a94fd55d4f7802849159359","tests/ui-nightly/transmute-mut-src-not-a-reference.rs":"e627a60c6f6d1b398bdcfc9307dbc57b268cc784b4967d1afaceed7eebd5db47","tests/ui-nightly/transmute-mut-src-not-a-reference.stderr":"3085a0120d3dcbc1d01d226e0b4235fe39da9a956444aabdedac9ec938aca609","tests/ui-nightly/transmute-mut-src-not-asbytes.rs":"d0a6ddcfe31ac34ccc550090b80a67a010202bee12a39c230dd4374ef81a520c","tests/ui-nightly/transmute-mut-src-not-asbytes.stderr":"7cd91c207adb2b3bc9d2f3f5eaa2409f6290c429eb393533676f9f7628420623","tests/ui-nightly/transmute-mut-src-not-frombytes.rs":"5866e7d74baf3efb500338ba91a76f221e4a2479376e6921ec831fa284c9b3db","tests/ui-nightly/transmute-mut-src-not-frombytes.stderr":"95f362f717bbed7501d9e328b6369a76a4b10c167e062272e64a1b8887669114","tests/ui-nightly/transmute-mut-src-unsized.rs":"6676d8f29f0a32418f86d4423c464f4e0fdb8fe9ee8aa87f86c5fcdf8bd5e197","tests/ui-nightly/transmute-mut-src-unsized.stderr":"9ac64e0b1c4afe6fe4bc20e63f7c22e89d596377212ac3c3ebf87ea12096818a","tests/ui-nightly/transmute-ptr-to-usize.rs":"ea33dc39115509988d9abd6ac6536d88d82082417b21da9f9bc8cf8369c69618","tests/ui-nightly/transmute-ptr-to-usize.stderr":"f05ba5ad01e235eed456686a1ee5b7a668495c38054155965846d2bd613bd7d8","tests/ui-nightly/transmute-ref-alignment-increase.rs":"a5028469f90ca572ec1c73131f9a8a0a1cbca47de0dcb9003ba98de378def783","tests/ui-nightly/transmute-ref-alignment-increase.stderr":"aef92964ba843b890ce6c6b0924726dd89e1b9d6513f2148c269fe8fa203adac","tests/ui-nightly/transmute-ref-dst-generic.rs":"4a6b56491fd59646d1d1d8edbcc9d7de0dc69a9e6e4779f3cfd90e287f11557c","tests/ui-nightly/transmute-ref-dst-generic.stderr":"06b9fcf8e0443f997c0ef5f8e2659afcb65f095b11162ea69488f89788b337a7","tests/ui-nightly/transmute-ref-dst-mutable.rs":"1c48caae9912f70dec5f5a99a0c880fe6a3022f11fd412438b8a1576803e5f73","tests/ui-nightly/transmute-ref-dst-mutable.stderr":"96d38ce9a807ad7b60a846a8f5558c447da0d6cbe9225a077df4997712424d9a","tests/ui-nightly/transmute-ref-dst-not-a-reference.rs":"c4b8a6c1970e30390d0a301e2dbe718b9eeef743299f7e91cd12c582ec203af7","tests/ui-nightly/transmute-ref-dst-not-a-reference.stderr":"8ed2540877865fcdfca6e150465996a8f2872eb122ed5d647825e9181ae64754","tests/ui-nightly/transmute-ref-dst-not-frombytes.rs":"42aab9630fbab93f400713a1730d6dd6a89f821b0fa4dd5347aabe5e78b13aff","tests/ui-nightly/transmute-ref-dst-not-frombytes.stderr":"ab474a92c39a0810796d51228db2340a4d52915ddbae72a77ac4962e8bf9604e","tests/ui-nightly/transmute-ref-dst-unsized.rs":"c374df8d00541fd34fff37e231e341501a427961f60d88ad3e3c375085cc060d","tests/ui-nightly/transmute-ref-dst-unsized.stderr":"fc2579bc6b9f6fff8b2092fff88d617c98e218ae1399b39dea80d9d71c6112f7","tests/ui-nightly/transmute-ref-illegal-lifetime.rs":"6812bbf7ec851a8591464f10864dbd1f225e65ed5793b6f6375cbe8a9db50b14","tests/ui-nightly/transmute-ref-illegal-lifetime.stderr":"cb98c1b304334e58fc61be1c4b7782e68ab92d90a44c9627326d94d14a44cc38","tests/ui-nightly/transmute-ref-size-decrease.rs":"939fb562e4678368e59fdafb3a597fd54a661fd09d9ecb23c6e626ff59b45384","tests/ui-nightly/transmute-ref-size-decrease.stderr":"14f6ea48e66c484e94f47c3af0983de06869a884cda19b2201548aadc2378758","tests/ui-nightly/transmute-ref-size-increase.rs":"f66ab294f7618abfac5c503570137759afceb0dd26c8802bb1786b8873fe5670","tests/ui-nightly/transmute-ref-size-increase.stderr":"d5777c69b0ee36b6dcaf7699abb3ea03e1a8bac17bb5a1d4059ae28ff5f4357f","tests/ui-nightly/transmute-ref-src-dst-generic.rs":"96a6f6580307e6a397af8ca688a8a65144dff5240372203bd9f02bad6a41fd1e","tests/ui-nightly/transmute-ref-src-dst-generic.stderr":"ebffb5c5318798ff84f1da69c3ba732b9af2ad3688ebd7b4b2770e2b201afccb","tests/ui-nightly/transmute-ref-src-dst-not-references.rs":"7311602a0153b260d819e9608e8e66ef5904919a2349a95187919d8211e48e23","tests/ui-nightly/transmute-ref-src-dst-not-references.stderr":"ca5b956d99998df493f7c72df6bd315b8cd6f1f9b113a45416b0088f1e368900","tests/ui-nightly/transmute-ref-src-dst-unsized.rs":"f83e0225e824b7526d7732ef5d759b32358e5db50c3c6a318d2b5dcc2eb3c707","tests/ui-nightly/transmute-ref-src-dst-unsized.stderr":"35f3ce0a3c11aa4ac6eb65a48089e0025e85fc016ae81566be57e4a1152dac2f","tests/ui-nightly/transmute-ref-src-generic.rs":"ac1699aeca61c82aff5dac51d387a4ef7522faf2b2dfc56af398a2dc9d53745b","tests/ui-nightly/transmute-ref-src-generic.stderr":"b53a09eca6226647cf53ee9bd0388e558def3bd1f8009b6ec74cc26e4db13d1c","tests/ui-nightly/transmute-ref-src-not-a-reference.rs":"a921f168fa6cb3c6a19894cecdb118bc3164275746672a916aa5194b92f2fb57","tests/ui-nightly/transmute-ref-src-not-a-reference.stderr":"f7b51be513a0603070e218bdd1ca2c47a94c58151ab5649f68877ea3d83268f4","tests/ui-nightly/transmute-ref-src-not-asbytes.rs":"09aabae9e4634a5432bf7225240954d7b0592994c97a927e0469e27854588232","tests/ui-nightly/transmute-ref-src-not-asbytes.stderr":"fdc888ef7f049c957bd000c321979f9b61008a1b1ba8dabf323e33676f7de030","tests/ui-nightly/transmute-ref-src-unsized.rs":"d7797488f0ab5db89944ac7db25625c63aef72e6e4ed481d00a083449050b813","tests/ui-nightly/transmute-ref-src-unsized.stderr":"7e874cb32d41946e2e49627fd64b6e0103d65c955a44ccf18edf184312edb68b","tests/ui-nightly/transmute-size-decrease.rs":"c63dd10ddab58e282b033132d79fd21e80edb0c654f856679237977f62ced1ed","tests/ui-nightly/transmute-size-decrease.stderr":"4e014a129866804cf91cc3ff7a8ad1044ae1e3a6aad3b6ff8839605ab1b1df77","tests/ui-nightly/transmute-size-increase.rs":"9413442e6e3c574bd7e36e8d4242000c1513624a4edc97567695a81b5851c491","tests/ui-nightly/transmute-size-increase.stderr":"c307d7a2ae3d18e016be5d77e720bcf7023d03b10bb3ff3190e4d934eb9fc6a7","tests/ui-nightly/transmute-src-not-asbytes.rs":"8e2a76d99734c0502ba9daa8c7c2e34ca830ffd6024d3f7f29363d4263e89f74","tests/ui-nightly/transmute-src-not-asbytes.stderr":"71938c61511f4746a919b7656dc6181e7f0367e9a97b3693563dc9b53302cb8c","tests/ui-stable/include_value_not_from_bytes.rs":"ea2a419e0c7ce12b4febe6139523184cba2b2c54c879177e0c58a5f78f0ec340","tests/ui-stable/include_value_not_from_bytes.stderr":"5aa78f38cdbd69c99a77cc68331fd0bd4bb0a07fd35e807b2aa35dd4c56e56ee","tests/ui-stable/include_value_wrong_size.rs":"418e8c86ebf5a28ee50bd6ae00550f62a7a0ef3a7e7fda965b3d2337b64f2c66","tests/ui-stable/include_value_wrong_size.stderr":"b4fdeefd36bb2343f4e6cfae39c821fcfefd0671ea59205ffeea48318ce4fac7","tests/ui-stable/invalid-impls/invalid-impls.rs":"474d843ad40f3936adcd3ff592d815d8169813962ab9d99a68348b4b91aef10e","tests/ui-stable/invalid-impls/invalid-impls.stderr":"8310e42b17407faecee6c53a357037485f496783d80d40f5faebbb4b6f8483e8","tests/ui-stable/transmute-dst-not-frombytes.rs":"e00251eae67cdf8267a4963f212857a2a51de640a6f856c4b8df2a953caad25a","tests/ui-stable/transmute-dst-not-frombytes.stderr":"95f850609dfc88c2e47c6667601da35099a6588a939c8f9ea7f5bd3e2d03d20f","tests/ui-stable/transmute-mut-alignment-increase.rs":"ba83c9cf01acf11352f7ee5b54cd73a451394fd78b8ddeb0637931c87adfd6ae","tests/ui-stable/transmute-mut-alignment-increase.stderr":"92f1cda35d0c41a93f93152ad5c77fcd2c9ae17a7f2b4d54a311d434aa586400","tests/ui-stable/transmute-mut-const.rs":"4227f4c0dda6d6128f41b209ecc2bf941c7659c8de84cc0e418862d279baa78f","tests/ui-stable/transmute-mut-const.stderr":"d27b218da464aee431665618ffb4902e4d1a65e4153d25f05591538bf22cd623","tests/ui-stable/transmute-mut-dst-generic.rs":"aa015679b75dac0c37d5c43782b5e9522257f6ba34a10a89d0c1eba524a7af5c","tests/ui-stable/transmute-mut-dst-generic.stderr":"f2c60a1aae05ad780802b0290989c546abe35adcbcacf83a2264446a40ceb5dd","tests/ui-stable/transmute-mut-dst-not-a-reference.rs":"5d784ab588f081bfc304501f811a85ea2662f88fff8274ccbd53172ec255212c","tests/ui-stable/transmute-mut-dst-not-a-reference.stderr":"16a9cf4e0f90772d19c132f50dd0a85e60ecd929a6aa0820fbf568c7f6183d74","tests/ui-stable/transmute-mut-dst-not-asbytes.rs":"b1f986b3433980d7572a80511ca5a758c91e0c761d01c50bc73ed025d45698a6","tests/ui-stable/transmute-mut-dst-not-asbytes.stderr":"aa3615c19ef50b855a4c2feafa09d7af6e7603649df0337e29ca12d352306452","tests/ui-stable/transmute-mut-dst-not-frombytes.rs":"a4353eeb67b4701908e694738c5c4ce965afe4432f14e00e740684352f5ddd30","tests/ui-stable/transmute-mut-dst-not-frombytes.stderr":"5625f642d278fd6617472ba06aa8dda9a78899223ff3b04734060996d5dd67f2","tests/ui-stable/transmute-mut-dst-unsized.rs":"58c3423c07dd06ca98e61439f318ba5f3f7fc68ca9cb59371ebc482ad54709db","tests/ui-stable/transmute-mut-dst-unsized.stderr":"8cad3c8812e78b21667b6b885c3e4c5da025a154ea519f5539e9688802bb2ec4","tests/ui-stable/transmute-mut-illegal-lifetime.rs":"ec18bf7b3d9bd2674b43d0e04fc0545227473d43b07e2bbccc19c2068df33673","tests/ui-stable/transmute-mut-illegal-lifetime.stderr":"3a43e0be32ef3589fe3fa713d387bd3976bd8c75813f9641bbf7c539e10bed41","tests/ui-stable/transmute-mut-size-decrease.rs":"51aa423ec51a3c5579bbd7bac33adac8040629adc94eec3fb84825ef4f84f7bb","tests/ui-stable/transmute-mut-size-decrease.stderr":"b63870c4361917d4cd19fbaba433a9389b806135c9576ae8997c86f3b763fe3c","tests/ui-stable/transmute-mut-size-increase.rs":"ecc34f87b2ec668338672be6bac82b4056ebe35d98fd5d9a210f43f7e866b8e1","tests/ui-stable/transmute-mut-size-increase.stderr":"cb086ebcc60c4e17f8897c62c5b36b110b259c6e970825953798daf37144af47","tests/ui-stable/transmute-mut-src-dst-generic.rs":"613e00a353d1b359b57450bb408da585528f84b7eaf039a0c8d86bde1803395f","tests/ui-stable/transmute-mut-src-dst-generic.stderr":"ff7758361ba41d2bc3a49e9942e9f1f1b76d245f19a5391e45b9a066b8d0f6f4","tests/ui-stable/transmute-mut-src-dst-not-references.rs":"0b73d42fbcecba3483e24d4e9296d24d551de18822b45120e225356c5ccefad8","tests/ui-stable/transmute-mut-src-dst-not-references.stderr":"830581700736527e224bd923da3cd9c215e68556d2379c678174c08eff1501d6","tests/ui-stable/transmute-mut-src-dst-unsized.rs":"8ccf11a1990dbfd7ed7180c5e73e3a278f072f0a86eb2810f1b2c737ece76c57","tests/ui-stable/transmute-mut-src-dst-unsized.stderr":"b8a4632d0ba4229231cd30e8af07bb25dfc3cf1235ebbeb7a62e2ec71ebbef3a","tests/ui-stable/transmute-mut-src-generic.rs":"2cfe526643436df07247cc2583e1d097b247411185952132433127a159527669","tests/ui-stable/transmute-mut-src-generic.stderr":"de709f4435bf09ce98a6a9b19ac69560f85c43b665277ef60c9e62169e4a001f","tests/ui-stable/transmute-mut-src-immutable.rs":"606aba0c01726255c9be7e67a032ce854209c62dffec16d5dd2c8f484e19979a","tests/ui-stable/transmute-mut-src-immutable.stderr":"7c24d82d943695955b3ec1f0a53a349645fd3de1d549f3be989532e3774279bf","tests/ui-stable/transmute-mut-src-not-a-reference.rs":"e627a60c6f6d1b398bdcfc9307dbc57b268cc784b4967d1afaceed7eebd5db47","tests/ui-stable/transmute-mut-src-not-a-reference.stderr":"29b09aea59cfdb4b6535c5d33ec803539f28e53cce81938767ea0c22a1b1ce7d","tests/ui-stable/transmute-mut-src-not-asbytes.rs":"d0a6ddcfe31ac34ccc550090b80a67a010202bee12a39c230dd4374ef81a520c","tests/ui-stable/transmute-mut-src-not-asbytes.stderr":"51daf0724583595017b758d5881e10af3a07f07ce4b03754a909849561125509","tests/ui-stable/transmute-mut-src-not-frombytes.rs":"5866e7d74baf3efb500338ba91a76f221e4a2479376e6921ec831fa284c9b3db","tests/ui-stable/transmute-mut-src-not-frombytes.stderr":"83d60a22c5df81aef9a02033c5a4f097acc0338bde8b380dc053cc422333f8ba","tests/ui-stable/transmute-mut-src-unsized.rs":"6676d8f29f0a32418f86d4423c464f4e0fdb8fe9ee8aa87f86c5fcdf8bd5e197","tests/ui-stable/transmute-mut-src-unsized.stderr":"af53ab7b9b5edd17c9857459cbaf9636a2363196820fc998c4de81ede75ec441","tests/ui-stable/transmute-ptr-to-usize.rs":"ea33dc39115509988d9abd6ac6536d88d82082417b21da9f9bc8cf8369c69618","tests/ui-stable/transmute-ptr-to-usize.stderr":"cba0e2d85a961b56d8fc2566bc555082b52f762ac36b9745e319bb5d1e726514","tests/ui-stable/transmute-ref-alignment-increase.rs":"a5028469f90ca572ec1c73131f9a8a0a1cbca47de0dcb9003ba98de378def783","tests/ui-stable/transmute-ref-alignment-increase.stderr":"514c5254a0e84051cb34bd700c08163a98195730b87e67acda8907d401311b6c","tests/ui-stable/transmute-ref-dst-generic.rs":"4a6b56491fd59646d1d1d8edbcc9d7de0dc69a9e6e4779f3cfd90e287f11557c","tests/ui-stable/transmute-ref-dst-generic.stderr":"0fa2e50dd2f259260511ae3534334420e4384d542daa8532c7d3a625652c2ada","tests/ui-stable/transmute-ref-dst-mutable.rs":"1c48caae9912f70dec5f5a99a0c880fe6a3022f11fd412438b8a1576803e5f73","tests/ui-stable/transmute-ref-dst-mutable.stderr":"fc83b5283cb5319fd7a2b79f94ed0a49f16bce5b222f7e1cc5ce5a879f3de650","tests/ui-stable/transmute-ref-dst-not-a-reference.rs":"c4b8a6c1970e30390d0a301e2dbe718b9eeef743299f7e91cd12c582ec203af7","tests/ui-stable/transmute-ref-dst-not-a-reference.stderr":"e8a126f4832344b8a69591fcc25e22bbbb29f2078b809a47f8afa40ac1087a1f","tests/ui-stable/transmute-ref-dst-not-frombytes.rs":"42aab9630fbab93f400713a1730d6dd6a89f821b0fa4dd5347aabe5e78b13aff","tests/ui-stable/transmute-ref-dst-not-frombytes.stderr":"fb34ebeba63588a4f81763ea0363d4c5501b2dc1452bd5e8334c8fe009b420ae","tests/ui-stable/transmute-ref-dst-unsized.rs":"c374df8d00541fd34fff37e231e341501a427961f60d88ad3e3c375085cc060d","tests/ui-stable/transmute-ref-dst-unsized.stderr":"6024b682bfe79f7d972094f4f77bda7f8ed40f8949e14594a1d20f1fb8389c42","tests/ui-stable/transmute-ref-illegal-lifetime.rs":"6812bbf7ec851a8591464f10864dbd1f225e65ed5793b6f6375cbe8a9db50b14","tests/ui-stable/transmute-ref-illegal-lifetime.stderr":"45ab741d710dc5a01a21ab64f99927e7da5593328b2037b9bc82a87bc0969136","tests/ui-stable/transmute-ref-size-decrease.rs":"939fb562e4678368e59fdafb3a597fd54a661fd09d9ecb23c6e626ff59b45384","tests/ui-stable/transmute-ref-size-decrease.stderr":"fec5ab0e3d885bbb8e7ab82d6d58b9b4ee35a1802502fbc494bafa086d4132cf","tests/ui-stable/transmute-ref-size-increase.rs":"f66ab294f7618abfac5c503570137759afceb0dd26c8802bb1786b8873fe5670","tests/ui-stable/transmute-ref-size-increase.stderr":"720e2150c9ed538cf00d7525124ab0cee6ac53e91582470e09c140db783fc2be","tests/ui-stable/transmute-ref-src-dst-generic.rs":"96a6f6580307e6a397af8ca688a8a65144dff5240372203bd9f02bad6a41fd1e","tests/ui-stable/transmute-ref-src-dst-generic.stderr":"25f15e5316df34cd4a438548090c287228f86062f7e2ef59ea17fb727b868a19","tests/ui-stable/transmute-ref-src-dst-not-references.rs":"7311602a0153b260d819e9608e8e66ef5904919a2349a95187919d8211e48e23","tests/ui-stable/transmute-ref-src-dst-not-references.stderr":"2bff9f290ec40458939a1633f850853b3486220cfd40bc24c4e52635b7455742","tests/ui-stable/transmute-ref-src-dst-unsized.rs":"f83e0225e824b7526d7732ef5d759b32358e5db50c3c6a318d2b5dcc2eb3c707","tests/ui-stable/transmute-ref-src-dst-unsized.stderr":"80f9b39173dee338d3d7997d1283772b963e211dd6f14cfe37affc23520f7263","tests/ui-stable/transmute-ref-src-generic.rs":"ac1699aeca61c82aff5dac51d387a4ef7522faf2b2dfc56af398a2dc9d53745b","tests/ui-stable/transmute-ref-src-generic.stderr":"f3f8a7ee67ebec21169e1284c9eeaedcfa7b93c05f4e42c504cbd06508f34f9f","tests/ui-stable/transmute-ref-src-not-a-reference.rs":"a921f168fa6cb3c6a19894cecdb118bc3164275746672a916aa5194b92f2fb57","tests/ui-stable/transmute-ref-src-not-a-reference.stderr":"52efb101d85126138395fbed84c7cb911f86ea4457b991d91b2b6ec66521bcff","tests/ui-stable/transmute-ref-src-not-asbytes.rs":"09aabae9e4634a5432bf7225240954d7b0592994c97a927e0469e27854588232","tests/ui-stable/transmute-ref-src-not-asbytes.stderr":"543d5e4cced8f4d9f702a95d039579e121137ae2abfe2dad3da4692b8a43c1f0","tests/ui-stable/transmute-ref-src-unsized.rs":"d7797488f0ab5db89944ac7db25625c63aef72e6e4ed481d00a083449050b813","tests/ui-stable/transmute-ref-src-unsized.stderr":"228c5e4531cb5b8e33602dc58e9e0356a04de2946e17fbb206624f187ec86730","tests/ui-stable/transmute-size-decrease.rs":"c63dd10ddab58e282b033132d79fd21e80edb0c654f856679237977f62ced1ed","tests/ui-stable/transmute-size-decrease.stderr":"685acfb1b758f9854a5b36565f0b26cc1ef35322ee25387f05733187de1864d1","tests/ui-stable/transmute-size-increase.rs":"9413442e6e3c574bd7e36e8d4242000c1513624a4edc97567695a81b5851c491","tests/ui-stable/transmute-size-increase.stderr":"54cf03066a5d10ab7caa4741fe9d40df491a9a3fb81b6425a40bf04e21a6910e","tests/ui-stable/transmute-src-not-asbytes.rs":"8e2a76d99734c0502ba9daa8c7c2e34ca830ffd6024d3f7f29363d4263e89f74","tests/ui-stable/transmute-src-not-asbytes.stderr":"022dbcfa9950fe0576a26aecb6b8047740dd580f15491a754e9b95e16e1938da"},"package":"dd66a62464e3ffd4e37bd09950c2b9dd6c4f8767380fabba0d523f9a775bc85a"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/zerocopy/cargo.sh temporalio-1.3.0/vendor/zerocopy/cargo.sh --- temporalio-1.3.0/vendor/zerocopy/cargo.sh 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/cargo.sh 1970-01-01 00:00:00.000000000 +0000 @@ -1,89 +0,0 @@ -#!/bin/bash -# -# Copyright 2023 The Fuchsia Authors -# -# Licensed under a BSD-style license , Apache License, Version 2.0 -# , or the MIT -# license , at your option. -# This file may not be copied, modified, or distributed except according to -# those terms. - -# This script is a thin wrapper around Cargo that provides human-friendly -# toolchain names which are automatically translated to the toolchain versions -# we have pinned in CI. -# -# cargo.sh --version # looks up the version for the named toolchain -# cargo.sh + [...] # runs cargo commands with the named toolchain -# cargo.sh +all [...] # runs cargo commands with each toolchain -# -# The meta-toolchain "all" instructs this script to run the provided command -# once for each toolchain (msrv, stable, nightly). -# -# A common task that is especially annoying to perform by hand is to update -# trybuild's stderr files. Using this script: -# -# TRYBUILD=overwrite ./cargo.sh +all test --workspace - -set -eo pipefail - -function print-usage-and-exit { - echo "Usage:" >&2 - echo " $0 --version " >&2 - echo " $0 + [...]" >&2 - echo " $0 +all [...]" >&2 - exit 1 -} - -[[ $# -gt 0 ]] || print-usage-and-exit - -function pkg-meta { - cargo metadata --format-version 1 | jq -r ".packages[] | select(.name == \"zerocopy\").$1" -} - -function lookup-version { - VERSION="$1" - case "$VERSION" in - msrv) - pkg-meta rust_version - ;; - stable) - pkg-meta 'metadata.ci."pinned-stable"' - ;; - nightly) - pkg-meta 'metadata.ci."pinned-nightly"' - ;; - *) - echo "Unrecognized toolchain name: '$VERSION' (options are 'msrv', 'stable', 'nightly')" >&2 - return 1 - ;; - esac -} - -function get-rustflags { - [ "$1" == nightly ] && echo "--cfg __INTERNAL_USE_ONLY_NIGHLTY_FEATURES_IN_TESTS" -} - -case "$1" in - # cargo.sh --version - --version) - [[ $# -eq 2 ]] || print-usage-and-exit - lookup-version "$2" - ;; - # cargo.sh +all [...] - +all) - echo "[cargo.sh] warning: running the same command for each toolchain (msrv, stable, nightly)" >&2 - for toolchain in msrv stable nightly; do - echo "[cargo.sh] running with toolchain: $toolchain" >&2 - $0 "+$toolchain" ${@:2} - done - exit 0 - ;; - # cargo.sh + [...] - +*) - TOOLCHAIN="$(lookup-version ${1:1})" - RUSTFLAGS="$(get-rustflags ${1:1}) $RUSTFLAGS" cargo "+$TOOLCHAIN" ${@:2} - ;; - *) - print-usage-and-exit - ;; -esac diff -Nru temporalio-1.3.0/vendor/zerocopy/Cargo.toml temporalio-1.3.0/vendor/zerocopy/Cargo.toml --- temporalio-1.3.0/vendor/zerocopy/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/Cargo.toml 1970-01-01 00:00:00.000000000 +0000 @@ -1,76 +0,0 @@ -# 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" -rust-version = "1.60.0" -name = "zerocopy" -version = "0.7.20" -authors = ["Joshua Liebow-Feeser "] -exclude = [".*"] -description = "Utilities for zero-copy parsing and serialization" -readme = "README.md" -license = "BSD-2-Clause OR Apache-2.0 OR MIT" -repository = "https://github.com/google/zerocopy" - -[package.metadata.ci] -pinned-nightly = "nightly-2023-10-28" -pinned-stable = "1.73.0" - -[package.metadata.docs.rs] -all-features = true - -[dependencies.byteorder] -version = "1.3" -optional = true -default-features = false - -[dependencies.zerocopy-derive] -version = "=0.7.20" -optional = true - -[dev-dependencies.assert_matches] -version = "1.5" - -[dev-dependencies.itertools] -version = "0.11" - -[dev-dependencies.rand] -version = "0.8.5" -features = ["small_rng"] - -[dev-dependencies.rustversion] -version = "1.0" - -[dev-dependencies.static_assertions] -version = "1.1" - -[dev-dependencies.trybuild] -version = "=1.0.85" -features = ["diff"] - -[dev-dependencies.zerocopy-derive] -version = "=0.7.20" - -[features] -__internal_use_only_features_that_work_on_stable = [ - "alloc", - "derive", - "simd", -] -alloc = [] -default = ["byteorder"] -derive = ["zerocopy-derive"] -simd = [] -simd-nightly = ["simd"] - -[target."cfg(any())".dependencies.zerocopy-derive] -version = "=0.7.20" diff -Nru temporalio-1.3.0/vendor/zerocopy/clippy.toml temporalio-1.3.0/vendor/zerocopy/clippy.toml --- temporalio-1.3.0/vendor/zerocopy/clippy.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/clippy.toml 1970-01-01 00:00:00.000000000 +0000 @@ -1,10 +0,0 @@ -# Copyright 2023 The Fuchsia Authors -# -# Licensed under a BSD-style license , Apache License, Version 2.0 -# , or the MIT -# license , at your option. -# This file may not be copied, modified, or distributed except according to -# those terms. - -accept-comment-above-statement = true -accept-comment-above-attributes = true diff -Nru temporalio-1.3.0/vendor/zerocopy/CONTRIBUTING.md temporalio-1.3.0/vendor/zerocopy/CONTRIBUTING.md --- temporalio-1.3.0/vendor/zerocopy/CONTRIBUTING.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/CONTRIBUTING.md 1970-01-01 00:00:00.000000000 +0000 @@ -1,215 +0,0 @@ - - -# How to Contribute - -We'd love to accept your patches and contributions to zerocopy. There are just a -few small guidelines you need to follow. - -Once you've read the rest of this doc, check out our [good-first-issue -label][good-first-issue] for some good issues you can use to get your toes wet! - -## Contributor License Agreement - -Contributions to this project must be accompanied by a Contributor License -Agreement. You (or your employer) retain the copyright to your contribution; -this simply gives us permission to use and redistribute your contributions as -part of the project. Head over to to see -your current agreements on file or to sign a new one. - -You generally only need to submit a CLA once, so if you've already submitted one -(even if it was for a different project), you probably don't need to do it -again. - -## Code Reviews - -All submissions, including submissions by project members, require review. We -use GitHub pull requests for this purpose. Consult [GitHub -Help][about_pull_requests] for more information on using pull requests. - -## Code Guidelines - -### Philosophy - -This section is inspired by [Flutter's style guide][flutter_philosophy], which -contains many general principles that you should apply to all your programming -work. Read it. The below calls out specific aspects that we feel are -particularly important. - -#### Dogfood Your Features - -In non-library code, it's often advised to only implement features you need. -After all, it's hard to correctly design code without a concrete use case to -guide its design. Since zerocopy is a library, this advice is not as applicable; -we want our API surface to be featureful and complete even if not every feature -or method has a known use case. However, the observation that unused code is -hard to design still holds. - -Thus, when designing external-facing features, try to make use of them somehow. -This could be by using them to implement other features, or it could be by -writing prototype code which won't actually be checked in anywhere. If you're -feeling ambitious, you could even add (and check in) a [Cargo -example][cargo_example] that exercises the new feature. - -#### Go Down the Rabbit Hole - -You will occasionally encounter behavior that surprises you or seems wrong. It -probably is! Invest the time to find the root cause - you will either learn -something, or fix something, and both are worth your time. Do not work around -behavior you don't understand. - -### Avoid Duplication - -Avoid duplicating code whenever possible. In cases where existing code is not -exposed in a manner suitable to your needs, prefer to extract the necessary -parts into a common dependency. - -### Comments - -When writing comments, take a moment to consider the future reader of your -comment. Ensure that your comments are complete sentences with proper grammar -and punctuation. Note that adding more comments or more verbose comments is not -always better; for example, avoid comments that repeat the code they're anchored -on. - -Documentation comments should be self-contained; in other words, do not assume -that the reader is aware of documentation in adjacent files or on adjacent -structures. Avoid documentation comments on types which describe _instances_ of -the type; for example, `AddressSet is a set of client addresses.` is a comment -that describes a field of type `AddressSet`, but the type may be used to hold -any kind of `Address`, not just a client's. - -Phrase your comments to avoid references that might become stale; for example: -do not mention a variable or type by name when possible (certain doc comments -are necessary exceptions). Also avoid references to past or future versions of -or past or future work surrounding the item being documented; explain things -from first principles rather than making external references (including past -revisions). - -When writing TODOs: - -1. Include an issue reference using the format `TODO(#123):` -1. Phrase the text as an action that is to be taken; it should be possible for - another contributor to pick up the TODO without consulting any external - sources, including the referenced issue. - -### Tests - -Much of the code in zerocopy has the property that, if it is buggy, those bugs -may not cause user code to fail. This makes it extra important to write thorough -tests, but it also makes it harder to write those tests correctly. Here are some -guidelines on how to test code in zerocopy: -1. All code added to zerocopy must include tests that exercise it completely. -1. Tests must be deterministic. Threaded or time-dependent code, random number - generators (RNGs), and communication with external processes are common - sources of nondeterminism. See [Write reproducible, deterministic - tests][determinism] for tips. -1. Avoid [change detector tests][change_detector_tests]; tests that are - unnecessarily sensitive to changes, especially ones external to the code - under test, can hamper feature development and refactoring. -1. Since we run tests in [Miri][miri], make sure that tests exist which exercise - any potential [undefined behavior][undefined_behavior] so that Miri can catch - it. -1. If there's some user code that should be impossible to compile, add a - [trybuild test][trybuild] to ensure that it's properly rejected. - -### Source Control Best Practices - -Commits should be arranged for ease of reading; that is, incidental changes -such as code movement or formatting changes should be committed separately from -actual code changes. - -Commits should always be focused. For example, a commit could add a feature, -fix a bug, or refactor code, but not a mixture. - -Commits should be thoughtfully sized; avoid overly large or complex commits -which can be logically separated, but also avoid overly separated commits that -require code reviews to load multiple commits into their mental working memory -in order to properly understand how the various pieces fit together. - -#### Commit Messages - -Commit messages should be _concise_ but self-contained (avoid relying on issue -references as explanations for changes) and written such that they are helpful -to people reading in the future (include rationale and any necessary context). - -Avoid superfluous details or narrative. - -Commit messages should consist of a brief subject line and a separate -explanatory paragraph in accordance with the following: - -1. [Separate subject from body with a blank line](https://chris.beams.io/posts/git-commit/#separate) -1. [Limit the subject line to 50 characters](https://chris.beams.io/posts/git-commit/#limit-50) -1. [Capitalize the subject line](https://chris.beams.io/posts/git-commit/#capitalize) -1. [Do not end the subject line with a period](https://chris.beams.io/posts/git-commit/#end) -1. [Use the imperative mood in the subject line](https://chris.beams.io/posts/git-commit/#imperative) -1. [Wrap the body at 72 characters](https://chris.beams.io/posts/git-commit/#wrap-72) -1. [Use the body to explain what and why vs. how](https://chris.beams.io/posts/git-commit/#why-not-how) - -If the code affects a particular subsystem, prefix the subject line with the -name of that subsystem in square brackets, omitting any "zerocopy" prefix -(that's implicit). For example, for a commit adding a feature to the -zerocopy-derive crate: - -```text -[derive] Support AsBytes on types with parameters -``` - -The body may be omitted if the subject is self-explanatory; e.g. when fixing a -typo. The git book contains a [Commit Guidelines][commit_guidelines] section -with much of the same advice, and the list above is part of a [blog -post][beams_git_commit] by [Chris Beams][chris_beams]. - -Commit messages should make use of issue integration. Including an issue -reference like `#123` will cause the GitHub UI to link the text of that -reference to the referenced issue, and will also make it so that the referenced -issue back-links to the commit. Use "Closes", "Fixes", or "Resolves" on its own -line to automatically close an issue when your commit is merged: - -```text -Closes #123 -Fixes #123 -Resolves #123 -``` - -When using issue integration, don't omit necessary context that may also be -included in the relevant issue (see "Commit messages should be _concise_ but -self-contained" above). Git history is more likely to be retained indefinitely -than issue history (for example, if this repository is migrated away from GitHub -at some point in the future). - -Commit messages should never contain references to any of: - -1. Relative moments in time -1. Non-public URLs -1. Individuals -1. Hosted code reviews (such as on https://github.com/google/zerocopy/pulls) - + Refer to commits in this repository by their SHA-1 hash - + Refer to commits in other repositories by public web address (such as - https://github.com/google/zerocopy/commit/789b3deb) -1. Other entities which may not make sense to arbitrary future readers - -## Community Guidelines - -This project follows [Google's Open Source Community -Guidelines][google_open_source_guidelines]. - -[about_pull_requests]: https://help.github.com/articles/about-pull-requests/ -[beams_git_commit]: https://chris.beams.io/posts/git-commit/ -[cargo_example]: http://xion.io/post/code/rust-examples.html -[change_detector_tests]: https://testing.googleblog.com/2015/01/testing-on-toilet-change-detector-tests.html -[chris_beams]: https://chris.beams.io/ -[commit_guidelines]: https://www.git-scm.com/book/en/v2/Distributed-Git-Contributing-to-a-Project#_commit_guidelines -[determinism]: https://fuchsia.dev/fuchsia-src/contribute/testing/best-practices#write_reproducible_deterministic_tests -[flutter_philosophy]: https://github.com/flutter/flutter/wiki/Style-guide-for-Flutter-repo#philosophy -[good-first-issue]: https://github.com/google/zerocopy/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22 -[google_open_source_guidelines]: https://opensource.google/conduct/ -[magic_number]: https://en.wikipedia.org/wiki/Magic_number_(programming) -[miri]: https://github.com/rust-lang/miri -[trybuild]: https://crates.io/crates/trybuild -[undefined_behavior]: https://raphlinus.github.io/programming/rust/2018/08/17/undefined-behavior.html diff -Nru temporalio-1.3.0/vendor/zerocopy/generate-readme.sh temporalio-1.3.0/vendor/zerocopy/generate-readme.sh --- temporalio-1.3.0/vendor/zerocopy/generate-readme.sh 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/generate-readme.sh 1970-01-01 00:00:00.000000000 +0000 @@ -1,50 +0,0 @@ -#!/bin/bash -# -# Copyright 2022 The Fuchsia Authors -# -# Licensed under a BSD-style license , Apache License, Version 2.0 -# , or the MIT -# license , at your option. -# This file may not be copied, modified, or distributed except according to -# those terms. - -set -eo pipefail - -COPYRIGHT_HEADER=$(mktemp) -BODY=$(mktemp) -DISCLAIMER_FOOTER=$(mktemp) - -cat > $COPYRIGHT_HEADER <<'EOF' - - -EOF - -# This uses the `cargo readme` tool, which you can install via `cargo install -# cargo-readme --version 3.2.0`. -# -# The `sed` command is used to strip code links like: -# -# /// Here is a link to [`Vec`]. -# -# These links don't work in a Markdown file, and so we remove the `[` and `]` -# characters to convert them to non-link code snippets. -cargo readme --no-license | sed 's/\[\(`[^`]*`\)]/\1/g' > $BODY - -cat > $DISCLAIMER_FOOTER <<'EOF' - -## Disclaimer - -Disclaimer: Zerocopy is not an officially supported Google product. -EOF - -cat $COPYRIGHT_HEADER $BODY $DISCLAIMER_FOOTER diff -Nru temporalio-1.3.0/vendor/zerocopy/INTERNAL.md temporalio-1.3.0/vendor/zerocopy/INTERNAL.md --- temporalio-1.3.0/vendor/zerocopy/INTERNAL.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/INTERNAL.md 1970-01-01 00:00:00.000000000 +0000 @@ -1,44 +0,0 @@ - - -# Internal details - -This file documents various internal details of zerocopy and its infrastructure -that consumers don't need to be concerned about. It focuses on details that -affect multiple files, and allows each affected code location to reference this -document rather than requiring us to repeat the same explanation in multiple -locations. - -## CI and toolchain versions - -In CI (`.github/workflows/ci.yml`), we pin to specific versions or dates of the -stable and nightly toolchains. The reason is twofold: First, our UI tests (see -`tests/trybuild.rs` and `zerocopy-derive/tests/trybuild.rs`) depend on the -format of rustc's error messages, and that format can change between toolchain -versions (we also maintain multiple copies of our UI tests - one for each -toolchain version pinned in CI - for this reason). Second, not all nightlies -have a working Miri, so we need to pin to one that does (see -https://rust-lang.github.io/rustup-components-history/). - -Updating the versions pinned in CI may cause the UI tests to break. In order to -fix UI tests after a version update, run: - -``` -$ TRYBUILD=overwrite ./cargo.sh +all test -``` - -## Crate versions - -We ensure that the crate versions of zerocopy and zerocopy-derive are always the -same in-tree, and that zerocopy depends upon zerocopy-derive using an exact -version match to the current version in-tree. This has the result that, even -when published on crates.io, both crates effectively constitute a single atomic -version. So long as the code in zerocopy is compatible with the code in -zerocopy-derive in the same Git commit, then publishing them both is fine. This -frees us from the normal task of reasoning about compatibility with a range of -semver-compatible versions of different crates. diff -Nru temporalio-1.3.0/vendor/zerocopy/LICENSE-APACHE temporalio-1.3.0/vendor/zerocopy/LICENSE-APACHE --- temporalio-1.3.0/vendor/zerocopy/LICENSE-APACHE 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/LICENSE-APACHE 1970-01-01 00:00:00.000000000 +0000 @@ -1,202 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2023 The Fuchsia Authors - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - diff -Nru temporalio-1.3.0/vendor/zerocopy/LICENSE-BSD temporalio-1.3.0/vendor/zerocopy/LICENSE-BSD --- temporalio-1.3.0/vendor/zerocopy/LICENSE-BSD 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/LICENSE-BSD 1970-01-01 00:00:00.000000000 +0000 @@ -1,24 +0,0 @@ -Copyright 2019 The Fuchsia Authors. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff -Nru temporalio-1.3.0/vendor/zerocopy/LICENSE-MIT temporalio-1.3.0/vendor/zerocopy/LICENSE-MIT --- temporalio-1.3.0/vendor/zerocopy/LICENSE-MIT 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/LICENSE-MIT 1970-01-01 00:00:00.000000000 +0000 @@ -1,26 +0,0 @@ -Copyright 2023 The Fuchsia Authors - -Permission is hereby granted, free of charge, to any -person obtaining a copy of this software and associated -documentation files (the "Software"), to deal in the -Software without restriction, including without -limitation the rights to use, copy, modify, merge, -publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software -is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice -shall be included in all copies or substantial portions -of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. - diff -Nru temporalio-1.3.0/vendor/zerocopy/POLICIES.md temporalio-1.3.0/vendor/zerocopy/POLICIES.md --- temporalio-1.3.0/vendor/zerocopy/POLICIES.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/POLICIES.md 1970-01-01 00:00:00.000000000 +0000 @@ -1,95 +0,0 @@ - - -# Zerocopy's Policies - -## Soundness - -Zerocopy is expressly designed for use in security-critical contexts. It is used -in hardware security firmware, cryptographic implementations, hypervisors, and -more. We understand that software in these contexts has a very high bar for -correctness, and we take our responsibility to meet that bar very seriously. - -This section describes policies which are designed to ensure the correctness and -soundness of our code and prevent regressions. - -### Forwards-compatibility - -Rust does not currently have a formal memory model. As such, while Rust provides -guarantees about the semantics of some operations, the semantics of many -operations is up in the air and subject to change. - -Zerocopy strives to ensure that our code - and code emitted by our custom -derives - is sound under any version of Rust as early as our MSRV, and will -continue to be sound under any future version of Rust. The policies in this -section are designed to help ensure that we live up to this goal. - -### Safety comments - -Each non-test `unsafe` block must be annotated with a "safety comment" which -provides a rationale for its soundness. In order to ensure that our soundness is -forwards-compatible, safety comments must satisfy the following criteria: -- Safety comments must constitute a (possibly informal) proof that all of Rust's - soundness rules are upheld. -- Safety comments must only rely for their correctness on statements which - appear in the stable versions of the [Rust Reference] or standard library - documentation (ie, the docs for [core], [alloc], and [std]); arguments which - rely on text from the beta or nightly versions of these documents are not - considered complete. -- All statements from the Reference or standard library documentation which are - relied upon for soundness must be quoted in the safety comment. This ensures - that there is no ambiguity as to what aspect of the text is being cited. This - is especially important in cases where the text of these documents changes in - the future. Such changes are of course required to be backwards-compatible, - but may change the manner in which a particular guarantee is explained. - -We use the [`clippy::undocumented_unsafe_blocks`] lint to ensure that `unsafe` -blocks cannot be added without a safety comment. Note that there are a few -outstanding uncommented `unsafe` blocks which are tracked in [#429]. Our goal is -to reach 100% safety comment coverage and not regress once we've reached it. - -[Rust Reference]: https://doc.rust-lang.org/reference/ -[core]: https://doc.rust-lang.org/stable/core/ -[alloc]: https://doc.rust-lang.org/stable/alloc/ -[std]: https://doc.rust-lang.org/stable/std/ -[`clippy::undocumented_unsafe_blocks`]: https://rust-lang.github.io/rust-clippy/master/index.html#/undocumented_unsafe_blocks -[#429]: https://github.com/google/zerocopy/issues/429 - -#### Exceptions to our safety comment policy - -In rare circumstances, the soundness of an `unsafe` block may depend upon -semantics which are widely agreed upon but not formally guaranteed. In order to -avoid slowing down zerocopy's development to an unreasonable degree, a safety -comment may violate our safety comment policy so long as all of the following -hold: -- The safety comment's correctness may rely on semantics which are not - guaranteed in official Rust documentation *so long as* a member of the Rust - team has articulated in an official communication (e.g. a comment on a Rust - GitHub repo) that Rust intends to guarantee particular semantics. -- There exists an active effort to formalize the guarantee in Rust's official - documentation. - -### Target architecture support - -Zerocopy bases its soundness on guarantees made about the semantics of Rust -which appear in the Rust Reference or standard library documentation; zerocopy -is sound so long as these guarantees hold. There are known cases in which these -guarantees do not hold on certain target architectures (see -[rust-lang/unsafe-code-guidelines#461]); on such target architectures, zerocopy -may be unsound. We consider it outside of zerocopy's scope to reason about these -cases. Zerocopy makes no effort maintain soundness in cases where Rust's -documented guarantees do not hold. - -[rust-lang/unsafe-code-guidelines#461]: https://github.com/rust-lang/unsafe-code-guidelines/issues/461 - -## MSRV - -Our minimum supported Rust version (MSRV) is encoded in our `Cargo.toml` file. -We consider an increase in MSRV to be a semver-breaking change, and will only -increase our MSRV during semver-breaking version changes (e.g., 0.1 -> 0.2, 1.0 --> 2.0, etc). diff -Nru temporalio-1.3.0/vendor/zerocopy/README.md temporalio-1.3.0/vendor/zerocopy/README.md --- temporalio-1.3.0/vendor/zerocopy/README.md 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/README.md 1970-01-01 00:00:00.000000000 +0000 @@ -1,148 +0,0 @@ - - -# zerocopy - -*Want to help improve zerocopy? -Fill out our [user survey][user-survey]!* - -***Fast, safe, compile error. Pick two.*** - -Zerocopy makes zero-cost memory manipulation effortless. We write `unsafe` -so you don't have to. - -## Overview - -Zerocopy provides four core marker traits, each of which can be derived -(e.g., `#[derive(FromZeroes)]`): -- `FromZeroes` indicates that a sequence of zero bytes represents a valid - instance of a type -- `FromBytes` indicates that a type may safely be converted from an - arbitrary byte sequence -- `AsBytes` indicates that a type may safely be converted *to* a byte - sequence -- `Unaligned` indicates that a type's alignment requirement is 1 - -Types which implement a subset of these traits can then be converted to/from -byte sequences with little to no runtime overhead. - -Zerocopy also provides byte-order aware integer types that support these -conversions; see the `byteorder` module. These types are especially useful -for network parsing. - -[user-survey]: https://docs.google.com/forms/d/e/1FAIpQLSdzBNTN9tzwsmtyZxRFNL02K36IWCdHWW2ZBckyQS2xiO3i8Q/viewform?usp=published_options - -## Cargo Features - -- **`alloc`** - By default, `zerocopy` is `no_std`. When the `alloc` feature is enabled, - the `alloc` crate is added as a dependency, and some allocation-related - functionality is added. - -- **`byteorder`** (enabled by default) - Adds the `byteorder` module and a dependency on the `byteorder` crate. - The `byteorder` module provides byte order-aware equivalents of the - multi-byte primitive numerical types. Unlike their primitive equivalents, - the types in this module have no alignment requirement and support byte - order conversions. This can be useful in handling file formats, network - packet layouts, etc which don't provide alignment guarantees and which may - use a byte order different from that of the execution platform. - -- **`derive`** - Provides derives for the core marker traits via the `zerocopy-derive` - crate. These derives are re-exported from `zerocopy`, so it is not - necessary to depend on `zerocopy-derive` directly. - - However, you may experience better compile times if you instead directly - depend on both `zerocopy` and `zerocopy-derive` in your `Cargo.toml`, - since doing so will allow Rust to compile these crates in parallel. To do - so, do *not* enable the `derive` feature, and list both dependencies in - your `Cargo.toml` with the same leading non-zero version number; e.g: - - ```toml - [dependencies] - zerocopy = "0.X" - zerocopy-derive = "0.X" - ``` - -- **`simd`** - When the `simd` feature is enabled, `FromZeroes`, `FromBytes`, and - `AsBytes` impls are emitted for all stable SIMD types which exist on the - target platform. Note that the layout of SIMD types is not yet stabilized, - so these impls may be removed in the future if layout changes make them - invalid. For more information, see the Unsafe Code Guidelines Reference - page on the [layout of packed SIMD vectors][simd-layout]. - -- **`simd-nightly`** - Enables the `simd` feature and adds support for SIMD types which are only - available on nightly. Since these types are unstable, support for any type - may be removed at any point in the future. - -[simd-layout]: https://rust-lang.github.io/unsafe-code-guidelines/layout/packed-simd-vectors.html - -## Security Ethos - -Zerocopy is expressly designed for use in security-critical contexts. We -strive to ensure that that zerocopy code is sound under Rust's current -memory model, and *any future memory model*. We ensure this by: -- **...not 'guessing' about Rust's semantics.** - We annotate `unsafe` code with a precise rationale for its soundness that - cites a relevant section of Rust's official documentation. When Rust's - documented semantics are unclear, we work with the Rust Operational - Semantics Team to clarify Rust's documentation. -- **...rigorously testing our implementation.** - We run tests using [Miri], ensuring that zerocopy is sound across a wide - array of supported target platforms of varying endianness and pointer - width, and across both current and experimental memory models of Rust. -- **...formally proving the correctness of our implementation.** - We apply formal verification tools like [Kani][kani] to prove zerocopy's - correctness. - -For more information, see our full [soundness policy]. - -[Miri]: https://github.com/rust-lang/miri -[Kani]: https://github.com/model-checking/kani -[soundness policy]: https://github.com/google/zerocopy/blob/main/POLICIES.md#soundness - -## Relationship to Project Safe Transmute - -[Project Safe Transmute] is an official initiative of the Rust Project to -develop language-level support for safer transmutation. The Project consults -with crates like zerocopy to identify aspects of safer transmutation that -would benefit from compiler support, and has developed an [experimental, -compiler-supported analysis][mcp-transmutability] which determines whether, -for a given type, any value of that type may be soundly transmuted into -another type. Once this functionality is sufficiently mature, zerocopy -intends to replace its internal transmutability analysis (implemented by our -custom derives) with the compiler-supported one. This change will likely be -an implementation detail that is invisible to zerocopy's users. - -Project Safe Transmute will not replace the need for most of zerocopy's -higher-level abstractions. The experimental compiler analysis is a tool for -checking the soundness of `unsafe` code, not a tool to avoid writing -`unsafe` code altogether. For the foreseeable future, crates like zerocopy -will still be required in order to provide higher-level abstractions on top -of the building block provided by Project Safe Transmute. - -[Project Safe Transmute]: https://rust-lang.github.io/rfcs/2835-project-safe-transmute.html -[mcp-transmutability]: https://github.com/rust-lang/compiler-team/issues/411 - -## MSRV - -See our [MSRV policy]. - -[MSRV policy]: https://github.com/google/zerocopy/blob/main/POLICIES.md#msrv - -## Disclaimer - -Disclaimer: Zerocopy is not an officially supported Google product. diff -Nru temporalio-1.3.0/vendor/zerocopy/rustfmt.toml temporalio-1.3.0/vendor/zerocopy/rustfmt.toml --- temporalio-1.3.0/vendor/zerocopy/rustfmt.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/rustfmt.toml 1970-01-01 00:00:00.000000000 +0000 @@ -1,19 +0,0 @@ -# Copyright 2022 The Fuchsia Authors -# -# Licensed under a BSD-style license , Apache License, Version 2.0 -# , or the MIT -# license , at your option. -# This file may not be copied, modified, or distributed except according to -# those terms. - -edition = "2021" - -# The "Default" setting has a heuristic which splits lines too aggresively. -# We are willing to revisit this setting in future versions of rustfmt. -# Bugs: -# * https://github.com/rust-lang/rustfmt/issues/3119 -# * https://github.com/rust-lang/rustfmt/issues/3120 -use_small_heuristics = "Max" - -# Prevent carriage returns -newline_style = "Unix" diff -Nru temporalio-1.3.0/vendor/zerocopy/src/byteorder.rs temporalio-1.3.0/vendor/zerocopy/src/byteorder.rs --- temporalio-1.3.0/vendor/zerocopy/src/byteorder.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/src/byteorder.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,1075 +0,0 @@ -// Copyright 2019 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -//! Byte order-aware numeric primitives. -//! -//! This module contains equivalents of the native multi-byte integer types with -//! no alignment requirement and supporting byte order conversions. -//! -//! For each native multi-byte integer type - `u16`, `i16`, `u32`, etc - and -//! floating point type - `f32` and `f64` - an equivalent type is defined by -//! this module - [`U16`], [`I16`], [`U32`], [`F64`], etc. Unlike their native -//! counterparts, these types have alignment 1, and take a type parameter -//! specifying the byte order in which the bytes are stored in memory. Each type -//! implements the [`FromBytes`], [`AsBytes`], and [`Unaligned`] traits. -//! -//! These two properties, taken together, make these types useful for defining -//! data structures whose memory layout matches a wire format such as that of a -//! network protocol or a file format. Such formats often have multi-byte values -//! at offsets that do not respect the alignment requirements of the equivalent -//! native types, and stored in a byte order not necessarily the same as that of -//! the target platform. -//! -//! Type aliases are provided for common byte orders in the [`big_endian`], -//! [`little_endian`], [`network_endian`], and [`native_endian`] submodules. -//! -//! # Example -//! -//! One use of these types is for representing network packet formats, such as -//! UDP: -//! -//! ```rust,edition2021 -//! # #[cfg(feature = "derive")] { // This example uses derives, and won't compile without them -//! use zerocopy::{AsBytes, ByteSlice, FromBytes, FromZeroes, Ref, Unaligned}; -//! use zerocopy::byteorder::network_endian::U16; -//! -//! #[derive(FromZeroes, FromBytes, AsBytes, Unaligned)] -//! #[repr(C)] -//! struct UdpHeader { -//! src_port: U16, -//! dst_port: U16, -//! length: U16, -//! checksum: U16, -//! } -//! -//! struct UdpPacket { -//! header: Ref, -//! body: B, -//! } -//! -//! impl UdpPacket { -//! fn parse(bytes: B) -> Option> { -//! let (header, body) = Ref::new_from_prefix(bytes)?; -//! Some(UdpPacket { header, body }) -//! } -//! -//! fn src_port(&self) -> u16 { -//! self.header.src_port.get() -//! } -//! -//! // more getters... -//! } -//! # } -//! ``` - -use core::{ - convert::{TryFrom, TryInto}, - fmt::{self, Binary, Debug, Display, Formatter, LowerHex, Octal, UpperHex}, - marker::PhantomData, - num::TryFromIntError, -}; - -// We don't reexport `WriteBytesExt` or `ReadBytesExt` because those are only -// available with the `std` feature enabled, and zerocopy is `no_std` by -// default. -pub use ::byteorder::{BigEndian, ByteOrder, LittleEndian, NativeEndian, NetworkEndian, BE, LE}; - -use super::*; - -macro_rules! impl_fmt_trait { - ($name:ident, $native:ident, $trait:ident) => { - impl $trait for $name { - #[inline(always)] - fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { - $trait::fmt(&self.get(), f) - } - } - }; -} - -macro_rules! impl_fmt_traits { - ($name:ident, $native:ident, "floating point number") => { - impl_fmt_trait!($name, $native, Display); - }; - ($name:ident, $native:ident, "unsigned integer") => { - impl_fmt_traits!($name, $native, @all_types); - }; - ($name:ident, $native:ident, "signed integer") => { - impl_fmt_traits!($name, $native, @all_types); - }; - ($name:ident, $native:ident, @all_types) => { - impl_fmt_trait!($name, $native, Display); - impl_fmt_trait!($name, $native, Octal); - impl_fmt_trait!($name, $native, LowerHex); - impl_fmt_trait!($name, $native, UpperHex); - impl_fmt_trait!($name, $native, Binary); - }; -} - -macro_rules! impl_ops_traits { - ($name:ident, $native:ident, "floating point number") => { - impl_ops_traits!($name, $native, @all_types); - impl_ops_traits!($name, $native, @signed_integer_floating_point); - }; - ($name:ident, $native:ident, "unsigned integer") => { - impl_ops_traits!($name, $native, @signed_unsigned_integer); - impl_ops_traits!($name, $native, @all_types); - }; - ($name:ident, $native:ident, "signed integer") => { - impl_ops_traits!($name, $native, @signed_unsigned_integer); - impl_ops_traits!($name, $native, @signed_integer_floating_point); - impl_ops_traits!($name, $native, @all_types); - }; - ($name:ident, $native:ident, @signed_unsigned_integer) => { - impl_ops_traits!(@without_byteorder_swap $name, $native, BitAnd, bitand, BitAndAssign, bitand_assign); - impl_ops_traits!(@without_byteorder_swap $name, $native, BitOr, bitor, BitOrAssign, bitor_assign); - impl_ops_traits!(@without_byteorder_swap $name, $native, BitXor, bitxor, BitXorAssign, bitxor_assign); - impl_ops_traits!(@with_byteorder_swap $name, $native, Shl, shl, ShlAssign, shl_assign); - impl_ops_traits!(@with_byteorder_swap $name, $native, Shr, shr, ShrAssign, shr_assign); - - impl core::ops::Not for $name { - type Output = $name; - - #[inline(always)] - fn not(self) -> $name { - let self_native = $native::from_ne_bytes(self.0); - $name((!self_native).to_ne_bytes(), PhantomData) - } - } - }; - ($name:ident, $native:ident, @signed_integer_floating_point) => { - impl core::ops::Neg for $name { - type Output = $name; - - #[inline(always)] - fn neg(self) -> $name { - let self_native: $native = self.get(); - #[allow(clippy::arithmetic_side_effects)] - $name::::new(-self_native) - } - } - }; - ($name:ident, $native:ident, @all_types) => { - impl_ops_traits!(@with_byteorder_swap $name, $native, Add, add, AddAssign, add_assign); - impl_ops_traits!(@with_byteorder_swap $name, $native, Div, div, DivAssign, div_assign); - impl_ops_traits!(@with_byteorder_swap $name, $native, Mul, mul, MulAssign, mul_assign); - impl_ops_traits!(@with_byteorder_swap $name, $native, Rem, rem, RemAssign, rem_assign); - impl_ops_traits!(@with_byteorder_swap $name, $native, Sub, sub, SubAssign, sub_assign); - }; - (@with_byteorder_swap $name:ident, $native:ident, $trait:ident, $method:ident, $trait_assign:ident, $method_assign:ident) => { - impl core::ops::$trait for $name { - type Output = $name; - - #[inline(always)] - fn $method(self, rhs: $name) -> $name { - let self_native: $native = self.get(); - let rhs_native: $native = rhs.get(); - let result_native = core::ops::$trait::$method(self_native, rhs_native); - $name::::new(result_native) - } - } - - impl core::ops::$trait_assign for $name { - #[inline(always)] - fn $method_assign(&mut self, rhs: $name) { - *self = core::ops::$trait::$method(*self, rhs); - } - } - }; - // Implement traits in terms of the same trait on the native type, but - // without performing a byte order swap. This only works for bitwise - // operations like `&`, `|`, etc. - (@without_byteorder_swap $name:ident, $native:ident, $trait:ident, $method:ident, $trait_assign:ident, $method_assign:ident) => { - impl core::ops::$trait for $name { - type Output = $name; - - #[inline(always)] - fn $method(self, rhs: $name) -> $name { - let self_native = $native::from_ne_bytes(self.0); - let rhs_native = $native::from_ne_bytes(rhs.0); - let result_native = core::ops::$trait::$method(self_native, rhs_native); - $name(result_native.to_ne_bytes(), PhantomData) - } - } - - impl core::ops::$trait_assign for $name { - #[inline(always)] - fn $method_assign(&mut self, rhs: $name) { - *self = core::ops::$trait::$method(*self, rhs); - } - } - }; -} - -macro_rules! doc_comment { - ($x:expr, $($tt:tt)*) => { - #[doc = $x] - $($tt)* - }; -} - -macro_rules! define_max_value_constant { - ($name:ident, $bytes:expr, "unsigned integer") => { - /// The maximum value. - /// - /// This constant should be preferred to constructing a new value using - /// `new`, as `new` may perform an endianness swap depending on the - /// endianness `O` and the endianness of the platform. - pub const MAX_VALUE: $name = $name([0xFFu8; $bytes], PhantomData); - }; - // We don't provide maximum and minimum value constants for signed values - // and floats because there's no way to do it generically - it would require - // a different value depending on the value of the `ByteOrder` type - // parameter. Currently, one workaround would be to provide implementations - // for concrete implementations of that trait. In the long term, if we are - // ever able to make the `new` constructor a const fn, we could use that - // instead. - ($name:ident, $bytes:expr, "signed integer") => {}; - ($name:ident, $bytes:expr, "floating point number") => {}; -} - -macro_rules! define_type { - ($article:ident, - $name:ident, - $native:ident, - $bits:expr, - $bytes:expr, - $read_method:ident, - $write_method:ident, - $number_kind:tt, - [$($larger_native:ty),*], - [$($larger_native_try:ty),*], - [$($larger_byteorder:ident),*], - [$($larger_byteorder_try:ident),*]) => { - doc_comment! { - concat!("A ", stringify!($bits), "-bit ", $number_kind, - " stored in a given byte order. - -`", stringify!($name), "` is like the native `", stringify!($native), "` type with -two major differences: First, it has no alignment requirement (its alignment is 1). -Second, the endianness of its memory layout is given by the type parameter `O`, -which can be any type which implements [`ByteOrder`]. In particular, this refers -to [`BigEndian`], [`LittleEndian`], [`NativeEndian`], and [`NetworkEndian`]. - -", stringify!($article), " `", stringify!($name), "` can be constructed using -the [`new`] method, and its contained value can be obtained as a native -`",stringify!($native), "` using the [`get`] method, or updated in place with -the [`set`] method. In all cases, if the endianness `O` is not the same as the -endianness of the current platform, an endianness swap will be performed in -order to uphold the invariants that a) the layout of `", stringify!($name), "` -has endianness `O` and that, b) the layout of `", stringify!($native), "` has -the platform's native endianness. - -`", stringify!($name), "` implements [`FromBytes`], [`AsBytes`], and [`Unaligned`], -making it useful for parsing and serialization. See the module documentation for an -example of how it can be used for parsing UDP packets. - -[`new`]: crate::byteorder::", stringify!($name), "::new -[`get`]: crate::byteorder::", stringify!($name), "::get -[`set`]: crate::byteorder::", stringify!($name), "::set -[`FromBytes`]: crate::FromBytes -[`AsBytes`]: crate::AsBytes -[`Unaligned`]: crate::Unaligned"), - #[derive(Copy, Clone, Eq, PartialEq, Hash)] - #[cfg_attr(any(feature = "derive", test), derive(KnownLayout, FromZeroes, FromBytes, AsBytes, Unaligned))] - #[repr(transparent)] - pub struct $name([u8; $bytes], PhantomData); - } - - #[cfg(not(any(feature = "derive", test)))] - impl_known_layout!(O => $name); - - safety_comment! { - /// SAFETY: - /// `$name` is `repr(transparent)`, and so it has the same layout - /// as its only non-zero field, which is a `u8` array. `u8` arrays - /// are `FromZeroes`, `FromBytes`, `AsBytes`, and `Unaligned`. - impl_or_verify!(O => FromZeroes for $name); - impl_or_verify!(O => FromBytes for $name); - impl_or_verify!(O => AsBytes for $name); - impl_or_verify!(O => Unaligned for $name); - } - - impl Default for $name { - #[inline(always)] - fn default() -> $name { - $name::ZERO - } - } - - impl $name { - /// The value zero. - /// - /// This constant should be preferred to constructing a new value - /// using `new`, as `new` may perform an endianness swap depending - /// on the endianness and platform. - pub const ZERO: $name = $name([0u8; $bytes], PhantomData); - - define_max_value_constant!($name, $bytes, $number_kind); - - /// Constructs a new value from bytes which are already in the - /// endianness `O`. - #[inline(always)] - pub const fn from_bytes(bytes: [u8; $bytes]) -> $name { - $name(bytes, PhantomData) - } - } - - impl $name { - // TODO(joshlf): Make these const fns if the `ByteOrder` methods - // ever become const fns. - - /// Constructs a new value, possibly performing an endianness swap - /// to guarantee that the returned value has endianness `O`. - #[inline(always)] - pub fn new(n: $native) -> $name { - let mut out = $name::default(); - O::$write_method(&mut out.0[..], n); - out - } - - /// Returns the value as a primitive type, possibly performing an - /// endianness swap to guarantee that the return value has the - /// endianness of the native platform. - #[inline(always)] - pub fn get(self) -> $native { - O::$read_method(&self.0[..]) - } - - /// Updates the value in place as a primitive type, possibly - /// performing an endianness swap to guarantee that the stored value - /// has the endianness `O`. - #[inline(always)] - pub fn set(&mut self, n: $native) { - O::$write_method(&mut self.0[..], n); - } - } - - // The reasoning behind which traits to implement here is to only - // implement traits which won't cause inference issues. Notably, - // comparison traits like PartialEq and PartialOrd tend to cause - // inference issues. - - impl From<$name> for [u8; $bytes] { - #[inline(always)] - fn from(x: $name) -> [u8; $bytes] { - x.0 - } - } - - impl From<[u8; $bytes]> for $name { - #[inline(always)] - fn from(bytes: [u8; $bytes]) -> $name { - $name(bytes, PhantomData) - } - } - - impl From<$name> for $native { - #[inline(always)] - fn from(x: $name) -> $native { - x.get() - } - } - - impl From<$native> for $name { - #[inline(always)] - fn from(x: $native) -> $name { - $name::new(x) - } - } - - $( - impl From<$name> for $larger_native { - #[inline(always)] - fn from(x: $name) -> $larger_native { - x.get().into() - } - } - )* - - $( - impl TryFrom<$larger_native_try> for $name { - type Error = TryFromIntError; - #[inline(always)] - fn try_from(x: $larger_native_try) -> Result<$name, TryFromIntError> { - $native::try_from(x).map($name::new) - } - } - )* - - $( - impl From<$name> for $larger_byteorder

{ - #[inline(always)] - fn from(x: $name) -> $larger_byteorder

{ - $larger_byteorder::new(x.get().into()) - } - } - )* - - $( - impl TryFrom<$larger_byteorder_try

> for $name { - type Error = TryFromIntError; - #[inline(always)] - fn try_from(x: $larger_byteorder_try

) -> Result<$name, TryFromIntError> { - x.get().try_into().map($name::new) - } - } - )* - - impl AsRef<[u8; $bytes]> for $name { - #[inline(always)] - fn as_ref(&self) -> &[u8; $bytes] { - &self.0 - } - } - - impl AsMut<[u8; $bytes]> for $name { - #[inline(always)] - fn as_mut(&mut self) -> &mut [u8; $bytes] { - &mut self.0 - } - } - - impl PartialEq<$name> for [u8; $bytes] { - #[inline(always)] - fn eq(&self, other: &$name) -> bool { - self.eq(&other.0) - } - } - - impl PartialEq<[u8; $bytes]> for $name { - #[inline(always)] - fn eq(&self, other: &[u8; $bytes]) -> bool { - self.0.eq(other) - } - } - - impl_fmt_traits!($name, $native, $number_kind); - impl_ops_traits!($name, $native, $number_kind); - - impl Debug for $name { - #[inline] - fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { - // This results in a format like "U16(42)". - f.debug_tuple(stringify!($name)).field(&self.get()).finish() - } - } - }; -} - -define_type!( - A, - U16, - u16, - 16, - 2, - read_u16, - write_u16, - "unsigned integer", - [u32, u64, u128, usize], - [u32, u64, u128, usize], - [U32, U64, U128], - [U32, U64, U128] -); -define_type!( - A, - U32, - u32, - 32, - 4, - read_u32, - write_u32, - "unsigned integer", - [u64, u128], - [u64, u128], - [U64, U128], - [U64, U128] -); -define_type!( - A, - U64, - u64, - 64, - 8, - read_u64, - write_u64, - "unsigned integer", - [u128], - [u128], - [U128], - [U128] -); -define_type!(A, U128, u128, 128, 16, read_u128, write_u128, "unsigned integer", [], [], [], []); -define_type!( - An, - I16, - i16, - 16, - 2, - read_i16, - write_i16, - "signed integer", - [i32, i64, i128, isize], - [i32, i64, i128, isize], - [I32, I64, I128], - [I32, I64, I128] -); -define_type!( - An, - I32, - i32, - 32, - 4, - read_i32, - write_i32, - "signed integer", - [i64, i128], - [i64, i128], - [I64, I128], - [I64, I128] -); -define_type!( - An, - I64, - i64, - 64, - 8, - read_i64, - write_i64, - "signed integer", - [i128], - [i128], - [I128], - [I128] -); -define_type!(An, I128, i128, 128, 16, read_i128, write_i128, "signed integer", [], [], [], []); -define_type!( - An, - F32, - f32, - 32, - 4, - read_f32, - write_f32, - "floating point number", - [f64], - [], - [F64], - [] -); -define_type!(An, F64, f64, 64, 8, read_f64, write_f64, "floating point number", [], [], [], []); - -macro_rules! module { - ($name:ident, $trait:ident, $endianness_str:expr) => { - /// Numeric primitives stored in - #[doc = $endianness_str] - /// byte order. - pub mod $name { - use byteorder::$trait; - - module!(@ty U16, $trait, "16-bit unsigned integer", $endianness_str); - module!(@ty U32, $trait, "32-bit unsigned integer", $endianness_str); - module!(@ty U64, $trait, "64-bit unsigned integer", $endianness_str); - module!(@ty U128, $trait, "128-bit unsigned integer", $endianness_str); - module!(@ty I16, $trait, "16-bit signed integer", $endianness_str); - module!(@ty I32, $trait, "32-bit signed integer", $endianness_str); - module!(@ty I64, $trait, "64-bit signed integer", $endianness_str); - module!(@ty I128, $trait, "128-bit signed integer", $endianness_str); - module!(@ty F32, $trait, "32-bit floating point number", $endianness_str); - module!(@ty F64, $trait, "64-bit floating point number", $endianness_str); - } - }; - (@ty $ty:ident, $trait:ident, $desc_str:expr, $endianness_str:expr) => { - /// A - #[doc = $desc_str] - /// stored in - #[doc = $endianness_str] - /// byte order. - pub type $ty = crate::byteorder::$ty<$trait>; - }; -} - -module!(big_endian, BigEndian, "big-endian"); -module!(little_endian, LittleEndian, "little-endian"); -module!(network_endian, NetworkEndian, "network-endian"); -module!(native_endian, NativeEndian, "native-endian"); - -#[cfg(any(test, kani))] -mod tests { - use ::byteorder::NativeEndian; - - use { - super::*, - crate::{AsBytes, FromBytes, Unaligned}, - }; - - #[cfg(not(kani))] - mod compatibility { - pub(super) use rand::{ - distributions::{Distribution, Standard}, - rngs::SmallRng, - Rng, SeedableRng, - }; - - pub(crate) trait Arbitrary {} - - impl Arbitrary for T {} - } - - #[cfg(kani)] - mod compatibility { - pub(crate) use kani::Arbitrary; - - pub(crate) struct SmallRng; - - impl SmallRng { - pub(crate) fn seed_from_u64(_state: u64) -> Self { - Self - } - } - - pub(crate) trait Rng { - fn sample>(&mut self, _distr: D) -> T - where - T: Arbitrary, - { - kani::any() - } - } - - impl Rng for SmallRng {} - - pub(crate) trait Distribution {} - impl Distribution for U {} - - pub(crate) struct Standard; - } - - use compatibility::*; - - // A native integer type (u16, i32, etc). - trait Native: Arbitrary + FromBytes + AsBytes + Copy + PartialEq + Debug { - const ZERO: Self; - const MAX_VALUE: Self; - - type Distribution: Distribution; - const DIST: Self::Distribution; - - fn rand(rng: &mut R) -> Self { - rng.sample(Self::DIST) - } - - #[cfg(kani)] - fn any() -> Self { - kani::any() - } - - fn checked_add(self, rhs: Self) -> Option; - fn checked_div(self, rhs: Self) -> Option; - fn checked_mul(self, rhs: Self) -> Option; - fn checked_rem(self, rhs: Self) -> Option; - fn checked_sub(self, rhs: Self) -> Option; - fn checked_shl(self, rhs: Self) -> Option; - fn checked_shr(self, rhs: Self) -> Option; - - fn is_nan(self) -> bool; - - /// For `f32` and `f64`, NaN values are not considered equal to - /// themselves. This method is like `assert_eq!`, but it treats NaN - /// values as equal. - fn assert_eq_or_nan(self, other: Self) { - let slf = (!self.is_nan()).then(|| self); - let other = (!other.is_nan()).then(|| other); - assert_eq!(slf, other); - } - } - - trait ByteArray: - FromBytes + AsBytes + Copy + AsRef<[u8]> + AsMut<[u8]> + Debug + Default + Eq - { - /// Invert the order of the bytes in the array. - fn invert(self) -> Self; - } - - trait ByteOrderType: FromBytes + AsBytes + Unaligned + Copy + Eq + Debug { - type Native: Native; - type ByteArray: ByteArray; - - const ZERO: Self; - - fn new(native: Self::Native) -> Self; - fn get(self) -> Self::Native; - fn set(&mut self, native: Self::Native); - fn from_bytes(bytes: Self::ByteArray) -> Self; - fn into_bytes(self) -> Self::ByteArray; - - /// For `f32` and `f64`, NaN values are not considered equal to - /// themselves. This method is like `assert_eq!`, but it treats NaN - /// values as equal. - fn assert_eq_or_nan(self, other: Self) { - let slf = (!self.get().is_nan()).then(|| self); - let other = (!other.get().is_nan()).then(|| other); - assert_eq!(slf, other); - } - } - - trait ByteOrderTypeUnsigned: ByteOrderType { - const MAX_VALUE: Self; - } - - macro_rules! impl_byte_array { - ($bytes:expr) => { - impl ByteArray for [u8; $bytes] { - fn invert(mut self) -> [u8; $bytes] { - self.reverse(); - self - } - } - }; - } - - impl_byte_array!(2); - impl_byte_array!(4); - impl_byte_array!(8); - impl_byte_array!(16); - - macro_rules! impl_byte_order_type_unsigned { - ($name:ident, unsigned) => { - impl ByteOrderTypeUnsigned for $name { - const MAX_VALUE: $name = $name::MAX_VALUE; - } - }; - ($name:ident, signed) => {}; - } - - macro_rules! impl_traits { - ($name:ident, $native:ident, $bytes:expr, $sign:ident $(, @$float:ident)?) => { - impl Native for $native { - // For some types, `0 as $native` is required (for example, when - // `$native` is a floating-point type; `0` is an integer), but - // for other types, it's a trivial cast. In all cases, Clippy - // thinks it's dangerous. - #[allow(trivial_numeric_casts, clippy::as_conversions)] - const ZERO: $native = 0 as $native; - const MAX_VALUE: $native = $native::MAX; - - type Distribution = Standard; - const DIST: Standard = Standard; - - impl_traits!(@float_dependent_methods $(@$float)?); - } - - impl ByteOrderType for $name { - type Native = $native; - type ByteArray = [u8; $bytes]; - - const ZERO: $name = $name::ZERO; - - fn new(native: $native) -> $name { - $name::new(native) - } - - fn get(self) -> $native { - $name::get(self) - } - - fn set(&mut self, native: $native) { - $name::set(self, native) - } - - fn from_bytes(bytes: [u8; $bytes]) -> $name { - $name::from(bytes) - } - - fn into_bytes(self) -> [u8; $bytes] { - <[u8; $bytes]>::from(self) - } - } - - impl_byte_order_type_unsigned!($name, $sign); - }; - (@float_dependent_methods) => { - fn checked_add(self, rhs: Self) -> Option { self.checked_add(rhs) } - fn checked_div(self, rhs: Self) -> Option { self.checked_div(rhs) } - fn checked_mul(self, rhs: Self) -> Option { self.checked_mul(rhs) } - fn checked_rem(self, rhs: Self) -> Option { self.checked_rem(rhs) } - fn checked_sub(self, rhs: Self) -> Option { self.checked_sub(rhs) } - fn checked_shl(self, rhs: Self) -> Option { self.checked_shl(rhs.try_into().unwrap_or(u32::MAX)) } - fn checked_shr(self, rhs: Self) -> Option { self.checked_shr(rhs.try_into().unwrap_or(u32::MAX)) } - fn is_nan(self) -> bool { false } - }; - (@float_dependent_methods @float) => { - fn checked_add(self, rhs: Self) -> Option { Some(self + rhs) } - fn checked_div(self, rhs: Self) -> Option { Some(self / rhs) } - fn checked_mul(self, rhs: Self) -> Option { Some(self * rhs) } - fn checked_rem(self, rhs: Self) -> Option { Some(self % rhs) } - fn checked_sub(self, rhs: Self) -> Option { Some(self - rhs) } - fn checked_shl(self, _rhs: Self) -> Option { unimplemented!() } - fn checked_shr(self, _rhs: Self) -> Option { unimplemented!() } - fn is_nan(self) -> bool { self.is_nan() } - }; - } - - impl_traits!(U16, u16, 2, unsigned); - impl_traits!(U32, u32, 4, unsigned); - impl_traits!(U64, u64, 8, unsigned); - impl_traits!(U128, u128, 16, unsigned); - impl_traits!(I16, i16, 2, signed); - impl_traits!(I32, i32, 4, signed); - impl_traits!(I64, i64, 8, signed); - impl_traits!(I128, i128, 16, signed); - impl_traits!(F32, f32, 4, signed, @float); - impl_traits!(F64, f64, 8, signed, @float); - - macro_rules! call_for_unsigned_types { - ($fn:ident, $byteorder:ident) => { - $fn::>(); - $fn::>(); - $fn::>(); - $fn::>(); - }; - } - - macro_rules! call_for_signed_types { - ($fn:ident, $byteorder:ident) => { - $fn::>(); - $fn::>(); - $fn::>(); - $fn::>(); - }; - } - - macro_rules! call_for_float_types { - ($fn:ident, $byteorder:ident) => { - $fn::>(); - $fn::>(); - }; - } - - macro_rules! call_for_all_types { - ($fn:ident, $byteorder:ident) => { - call_for_unsigned_types!($fn, $byteorder); - call_for_signed_types!($fn, $byteorder); - call_for_float_types!($fn, $byteorder); - }; - } - - #[cfg(target_endian = "big")] - type NonNativeEndian = LittleEndian; - #[cfg(target_endian = "little")] - type NonNativeEndian = BigEndian; - - // We use a `u64` seed so that we can use `SeedableRng::seed_from_u64`. - // `SmallRng`'s `SeedableRng::Seed` differs by platform, so if we wanted to - // call `SeedableRng::from_seed`, which takes a `Seed`, we would need - // conditional compilation by `target_pointer_width`. - const RNG_SEED: u64 = 0x7A03CAE2F32B5B8F; - - const RAND_ITERS: usize = if cfg!(any(miri, kani)) { - // The tests below which use this constant used to take a very long time - // on Miri, which slows down local development and CI jobs. We're not - // using Miri to check for the correctness of our code, but rather its - // soundness, and at least in the context of these particular tests, a - // single loop iteration is just as good for surfacing UB as multiple - // iterations are. - // - // As of the writing of this comment, here's one set of measurements: - // - // $ # RAND_ITERS == 1 - // $ cargo miri test -- -Z unstable-options --report-time endian - // test byteorder::tests::test_native_endian ... ok <0.049s> - // test byteorder::tests::test_non_native_endian ... ok <0.061s> - // - // $ # RAND_ITERS == 1024 - // $ cargo miri test -- -Z unstable-options --report-time endian - // test byteorder::tests::test_native_endian ... ok <25.716s> - // test byteorder::tests::test_non_native_endian ... ok <38.127s> - 1 - } else { - 1024 - }; - - #[cfg_attr(test, test)] - #[cfg_attr(kani, kani::proof)] - fn test_zero() { - fn test_zero() { - assert_eq!(T::ZERO.get(), T::Native::ZERO); - } - - call_for_all_types!(test_zero, NativeEndian); - call_for_all_types!(test_zero, NonNativeEndian); - } - - #[cfg_attr(test, test)] - #[cfg_attr(kani, kani::proof)] - fn test_max_value() { - fn test_max_value() { - assert_eq!(T::MAX_VALUE.get(), T::Native::MAX_VALUE); - } - - call_for_unsigned_types!(test_max_value, NativeEndian); - call_for_unsigned_types!(test_max_value, NonNativeEndian); - } - - #[cfg_attr(test, test)] - #[cfg_attr(kani, kani::proof)] - fn test_endian() { - fn test(invert: bool) { - let mut r = SmallRng::seed_from_u64(RNG_SEED); - for _ in 0..RAND_ITERS { - let native = T::Native::rand(&mut r); - let mut bytes = T::ByteArray::default(); - bytes.as_bytes_mut().copy_from_slice(native.as_bytes()); - if invert { - bytes = bytes.invert(); - } - let mut from_native = T::new(native); - let from_bytes = T::from_bytes(bytes); - - from_native.assert_eq_or_nan(from_bytes); - from_native.get().assert_eq_or_nan(native); - from_bytes.get().assert_eq_or_nan(native); - - assert_eq!(from_native.into_bytes(), bytes); - assert_eq!(from_bytes.into_bytes(), bytes); - - let updated = T::Native::rand(&mut r); - from_native.set(updated); - from_native.get().assert_eq_or_nan(updated); - } - } - - fn test_native() { - test::(false); - } - - fn test_non_native() { - test::(true); - } - - call_for_all_types!(test_native, NativeEndian); - call_for_all_types!(test_non_native, NonNativeEndian); - } - - #[test] - fn test_ops_impls() { - // Test implementations of traits in `core::ops`. Some of these are - // fairly banal, but some are optimized to perform the operation without - // swapping byte order (namely, bit-wise operations which are identical - // regardless of byte order). These are important to test, and while - // we're testing those anyway, it's trivial to test all of the impls. - - fn test(op: F, op_native: G, op_native_checked: Option) - where - T: ByteOrderType, - F: Fn(T, T) -> T, - G: Fn(T::Native, T::Native) -> T::Native, - H: Fn(T::Native, T::Native) -> Option, - { - let mut r = SmallRng::seed_from_u64(RNG_SEED); - for _ in 0..RAND_ITERS { - let n0 = T::Native::rand(&mut r); - let n1 = T::Native::rand(&mut r); - let t0 = T::new(n0); - let t1 = T::new(n1); - - // If this operation would overflow/underflow, skip it rather - // than attempt to catch and recover from panics. - if matches!(&op_native_checked, Some(checked) if checked(n0, n1).is_none()) { - continue; - } - - let n_res = op_native(n0, n1); - let t_res = op(t0, t1); - - // For `f32` and `f64`, NaN values are not considered equal to - // themselves. We store `Option`/`Option` and store - // NaN as `None` so they can still be compared. - let n_res = (!T::Native::is_nan(n_res)).then(|| n_res); - let t_res = (!T::Native::is_nan(t_res.get())).then(|| t_res.get()); - assert_eq!(n_res, t_res); - } - } - - macro_rules! test { - (@binary $trait:ident, $method:ident $([$checked_method:ident])?, $($call_for_macros:ident),*) => {{ - test!( - @inner $trait, - core::ops::$trait::$method, - core::ops::$trait::$method, - { - #[allow(unused_mut, unused_assignments)] - let mut op_native_checked = None:: Option>; - $( - op_native_checked = Some(T::Native::$checked_method); - )? - op_native_checked - }, - $($call_for_macros),* - ); - }}; - (@unary $trait:ident, $method:ident $([$checked_method:ident])?, $($call_for_macros:ident),*) => {{ - test!( - @inner $trait, - |slf, _rhs| core::ops::$trait::$method(slf), - |slf, _rhs| core::ops::$trait::$method(slf), - { - #[allow(unused_mut, unused_assignments)] - let mut op_native_checked = None:: Option>; - $( - op_native_checked = Some(|slf, _rhs| T::Native::$checked_method(slf)); - )? - op_native_checked - }, - $($call_for_macros),* - ); - }}; - (@inner $trait:ident, $op:expr, $op_native:expr, $op_native_checked:expr, $($call_for_macros:ident),*) => {{ - fn t>() - where - T::Native: core::ops::$trait, - { - test::( - $op, - $op_native, - $op_native_checked, - ); - } - - $( - $call_for_macros!(t, NativeEndian); - $call_for_macros!(t, NonNativeEndian); - )* - }}; - } - - test!(@binary Add, add[checked_add], call_for_all_types); - test!(@binary Div, div[checked_div], call_for_all_types); - test!(@binary Mul, mul[checked_mul], call_for_all_types); - test!(@binary Rem, rem[checked_rem], call_for_all_types); - test!(@binary Sub, sub[checked_sub], call_for_all_types); - - test!(@binary BitAnd, bitand, call_for_unsigned_types, call_for_signed_types); - test!(@binary BitOr, bitor, call_for_unsigned_types, call_for_signed_types); - test!(@binary BitXor, bitxor, call_for_unsigned_types, call_for_signed_types); - test!(@binary Shl, shl[checked_shl], call_for_unsigned_types, call_for_signed_types); - test!(@binary Shr, shr[checked_shr], call_for_unsigned_types, call_for_signed_types); - - test!(@unary Not, not, call_for_signed_types, call_for_unsigned_types); - test!(@unary Neg, neg, call_for_signed_types, call_for_float_types); - } - - #[test] - fn test_debug_impl() { - // Ensure that Debug applies format options to the inner value. - let val = U16::::new(10); - assert_eq!(format!("{:?}", val), "U16(10)"); - assert_eq!(format!("{:03?}", val), "U16(010)"); - assert_eq!(format!("{:x?}", val), "U16(a)"); - } -} diff -Nru temporalio-1.3.0/vendor/zerocopy/src/lib.rs temporalio-1.3.0/vendor/zerocopy/src/lib.rs --- temporalio-1.3.0/vendor/zerocopy/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/src/lib.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,5434 +0,0 @@ -// Copyright 2018 The Fuchsia Authors -// -// Licensed under the 2-Clause BSD License , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -// After updating the following doc comment, make sure to run the following -// command to update `README.md` based on its contents: -// -// ./generate-readme.sh > README.md - -//! *Want to help improve zerocopy? -//! Fill out our [user survey][user-survey]!* -//! -//! ***Fast, safe, compile error. Pick two.*** -//! -//! Zerocopy makes zero-cost memory manipulation effortless. We write `unsafe` -//! so you don't have to. -//! -//! # Overview -//! -//! Zerocopy provides four core marker traits, each of which can be derived -//! (e.g., `#[derive(FromZeroes)]`): -//! - [`FromZeroes`] indicates that a sequence of zero bytes represents a valid -//! instance of a type -//! - [`FromBytes`] indicates that a type may safely be converted from an -//! arbitrary byte sequence -//! - [`AsBytes`] indicates that a type may safely be converted *to* a byte -//! sequence -//! - [`Unaligned`] indicates that a type's alignment requirement is 1 -//! -//! Types which implement a subset of these traits can then be converted to/from -//! byte sequences with little to no runtime overhead. -//! -//! Zerocopy also provides byte-order aware integer types that support these -//! conversions; see the [`byteorder`] module. These types are especially useful -//! for network parsing. -//! -//! [user-survey]: https://docs.google.com/forms/d/e/1FAIpQLSdzBNTN9tzwsmtyZxRFNL02K36IWCdHWW2ZBckyQS2xiO3i8Q/viewform?usp=published_options -//! -//! # Cargo Features -//! -//! - **`alloc`** -//! By default, `zerocopy` is `no_std`. When the `alloc` feature is enabled, -//! the `alloc` crate is added as a dependency, and some allocation-related -//! functionality is added. -//! -//! - **`byteorder`** (enabled by default) -//! Adds the [`byteorder`] module and a dependency on the `byteorder` crate. -//! The `byteorder` module provides byte order-aware equivalents of the -//! multi-byte primitive numerical types. Unlike their primitive equivalents, -//! the types in this module have no alignment requirement and support byte -//! order conversions. This can be useful in handling file formats, network -//! packet layouts, etc which don't provide alignment guarantees and which may -//! use a byte order different from that of the execution platform. -//! -//! - **`derive`** -//! Provides derives for the core marker traits via the `zerocopy-derive` -//! crate. These derives are re-exported from `zerocopy`, so it is not -//! necessary to depend on `zerocopy-derive` directly. -//! -//! However, you may experience better compile times if you instead directly -//! depend on both `zerocopy` and `zerocopy-derive` in your `Cargo.toml`, -//! since doing so will allow Rust to compile these crates in parallel. To do -//! so, do *not* enable the `derive` feature, and list both dependencies in -//! your `Cargo.toml` with the same leading non-zero version number; e.g: -//! -//! ```toml -//! [dependencies] -//! zerocopy = "0.X" -//! zerocopy-derive = "0.X" -//! ``` -//! -//! - **`simd`** -//! When the `simd` feature is enabled, `FromZeroes`, `FromBytes`, and -//! `AsBytes` impls are emitted for all stable SIMD types which exist on the -//! target platform. Note that the layout of SIMD types is not yet stabilized, -//! so these impls may be removed in the future if layout changes make them -//! invalid. For more information, see the Unsafe Code Guidelines Reference -//! page on the [layout of packed SIMD vectors][simd-layout]. -//! -//! - **`simd-nightly`** -//! Enables the `simd` feature and adds support for SIMD types which are only -//! available on nightly. Since these types are unstable, support for any type -//! may be removed at any point in the future. -//! -//! [simd-layout]: https://rust-lang.github.io/unsafe-code-guidelines/layout/packed-simd-vectors.html -//! -//! # Security Ethos -//! -//! Zerocopy is expressly designed for use in security-critical contexts. We -//! strive to ensure that that zerocopy code is sound under Rust's current -//! memory model, and *any future memory model*. We ensure this by: -//! - **...not 'guessing' about Rust's semantics.** -//! We annotate `unsafe` code with a precise rationale for its soundness that -//! cites a relevant section of Rust's official documentation. When Rust's -//! documented semantics are unclear, we work with the Rust Operational -//! Semantics Team to clarify Rust's documentation. -//! - **...rigorously testing our implementation.** -//! We run tests using [Miri], ensuring that zerocopy is sound across a wide -//! array of supported target platforms of varying endianness and pointer -//! width, and across both current and experimental memory models of Rust. -//! - **...formally proving the correctness of our implementation.** -//! We apply formal verification tools like [Kani][kani] to prove zerocopy's -//! correctness. -//! -//! For more information, see our full [soundness policy]. -//! -//! [Miri]: https://github.com/rust-lang/miri -//! [Kani]: https://github.com/model-checking/kani -//! [soundness policy]: https://github.com/google/zerocopy/blob/main/POLICIES.md#soundness -//! -//! # Relationship to Project Safe Transmute -//! -//! [Project Safe Transmute] is an official initiative of the Rust Project to -//! develop language-level support for safer transmutation. The Project consults -//! with crates like zerocopy to identify aspects of safer transmutation that -//! would benefit from compiler support, and has developed an [experimental, -//! compiler-supported analysis][mcp-transmutability] which determines whether, -//! for a given type, any value of that type may be soundly transmuted into -//! another type. Once this functionality is sufficiently mature, zerocopy -//! intends to replace its internal transmutability analysis (implemented by our -//! custom derives) with the compiler-supported one. This change will likely be -//! an implementation detail that is invisible to zerocopy's users. -//! -//! Project Safe Transmute will not replace the need for most of zerocopy's -//! higher-level abstractions. The experimental compiler analysis is a tool for -//! checking the soundness of `unsafe` code, not a tool to avoid writing -//! `unsafe` code altogether. For the foreseeable future, crates like zerocopy -//! will still be required in order to provide higher-level abstractions on top -//! of the building block provided by Project Safe Transmute. -//! -//! [Project Safe Transmute]: https://rust-lang.github.io/rfcs/2835-project-safe-transmute.html -//! [mcp-transmutability]: https://github.com/rust-lang/compiler-team/issues/411 -//! -//! # MSRV -//! -//! See our [MSRV policy]. -//! -//! [MSRV policy]: https://github.com/google/zerocopy/blob/main/POLICIES.md#msrv - -// Sometimes we want to use lints which were added after our MSRV. -// `unknown_lints` is `warn` by default and we deny warnings in CI, so without -// this attribute, any unknown lint would cause a CI failure when testing with -// our MSRV. -#![allow(unknown_lints)] -#![deny(renamed_and_removed_lints)] -#![deny( - anonymous_parameters, - deprecated_in_future, - illegal_floating_point_literal_pattern, - late_bound_lifetime_arguments, - missing_copy_implementations, - missing_debug_implementations, - missing_docs, - path_statements, - patterns_in_fns_without_body, - rust_2018_idioms, - trivial_numeric_casts, - unreachable_pub, - unsafe_op_in_unsafe_fn, - unused_extern_crates, - unused_qualifications, - variant_size_differences -)] -#![deny( - clippy::all, - clippy::alloc_instead_of_core, - clippy::arithmetic_side_effects, - clippy::as_underscore, - clippy::assertions_on_result_states, - clippy::as_conversions, - clippy::correctness, - clippy::dbg_macro, - clippy::decimal_literal_representation, - clippy::get_unwrap, - clippy::indexing_slicing, - clippy::missing_inline_in_public_items, - clippy::missing_safety_doc, - clippy::obfuscated_if_else, - clippy::perf, - clippy::print_stdout, - clippy::std_instead_of_core, - clippy::style, - clippy::suspicious, - clippy::todo, - clippy::undocumented_unsafe_blocks, - clippy::unimplemented, - clippy::unnested_or_patterns, - clippy::unwrap_used, - clippy::use_debug -)] -#![deny( - rustdoc::bare_urls, - rustdoc::broken_intra_doc_links, - rustdoc::invalid_codeblock_attributes, - rustdoc::invalid_html_tags, - rustdoc::invalid_rust_codeblocks, - rustdoc::missing_crate_level_docs, - rustdoc::private_intra_doc_links -)] -// In test code, it makes sense to weight more heavily towards concise, readable -// code over correct or debuggable code. -#![cfg_attr(any(test, kani), allow( - // In tests, you get line numbers and have access to source code, so panic - // messages are less important. You also often unwrap a lot, which would - // make expect'ing instead very verbose. - clippy::unwrap_used, - // In tests, there's no harm to "panic risks" - the worst that can happen is - // that your test will fail, and you'll fix it. By contrast, panic risks in - // production code introduce the possibly of code panicking unexpectedly "in - // the field". - clippy::arithmetic_side_effects, - clippy::indexing_slicing, -))] -#![cfg_attr(not(test), no_std)] -#![cfg_attr(feature = "simd-nightly", feature(stdsimd))] -#![cfg_attr( - __INTERNAL_USE_ONLY_NIGHLTY_FEATURES_IN_TESTS, - feature(layout_for_ptr, strict_provenance) -)] -#[macro_use] -mod macros; - -#[cfg(feature = "byteorder")] -pub mod byteorder; -#[doc(hidden)] -pub mod macro_util; -mod util; -// TODO(#252): If we make this pub, come up with a better name. -mod wrappers; - -#[cfg(feature = "byteorder")] -pub use crate::byteorder::*; -pub use crate::wrappers::*; -#[cfg(any(feature = "derive", test))] -pub use zerocopy_derive::*; - -use core::{ - cell::{self, RefMut}, - cmp::Ordering, - fmt::{self, Debug, Display, Formatter}, - hash::Hasher, - marker::PhantomData, - mem::{self, ManuallyDrop, MaybeUninit}, - num::{ - NonZeroI128, NonZeroI16, NonZeroI32, NonZeroI64, NonZeroI8, NonZeroIsize, NonZeroU128, - NonZeroU16, NonZeroU32, NonZeroU64, NonZeroU8, NonZeroUsize, Wrapping, - }, - ops::{Deref, DerefMut}, - ptr::{self, NonNull}, - slice, -}; - -#[cfg(feature = "alloc")] -extern crate alloc; -#[cfg(feature = "alloc")] -use { - alloc::{boxed::Box, vec::Vec}, - core::alloc::Layout, -}; - -// For each polyfill, as soon as the corresponding feature is stable, the -// polyfill import will be unused because method/function resolution will prefer -// the inherent method/function over a trait method/function. Thus, we suppress -// the `unused_imports` warning. -// -// See the documentation on `util::polyfills` for more information. -#[allow(unused_imports)] -use crate::util::polyfills::NonNullExt as _; - -// This is a hack to allow zerocopy-derive derives to work in this crate. They -// assume that zerocopy is linked as an extern crate, so they access items from -// it as `zerocopy::Xxx`. This makes that still work. -#[cfg(any(feature = "derive", test))] -mod zerocopy { - pub(crate) use crate::*; -} - -#[rustversion::nightly] -#[cfg(all(test, not(__INTERNAL_USE_ONLY_NIGHLTY_FEATURES_IN_TESTS)))] -const _: () = { - #[deprecated = "some tests may be skipped due to missing RUSTFLAGS=\"--cfg __INTERNAL_USE_ONLY_NIGHLTY_FEATURES_IN_TESTS\""] - const _WARNING: () = (); - #[warn(deprecated)] - _WARNING -}; - -/// The layout of a type which might be dynamically-sized. -/// -/// `DstLayout` describes the layout of sized types, slice types, and "slice -/// DSTs" - ie, those that are known by the type system to have a trailing slice -/// (as distinguished from `dyn Trait` types - such types *might* have a -/// trailing slice type, but the type system isn't aware of it). -/// -/// # Safety -/// -/// Unlike [`core::alloc::Layout`], `DstLayout` is only used to describe full -/// Rust types - ie, those that satisfy the layout requirements outlined by -/// [the reference]. Callers may assume that an instance of `DstLayout` -/// satisfies any conditions imposed on Rust types by the reference. -/// -/// If `layout: DstLayout` describes a type, `T`, then it is guaranteed that: -/// - `layout.align` is equal to `T`'s alignment -/// - If `layout.size_info` is `SizeInfo::Sized { size }`, then `T: Sized` and -/// `size_of::() == size` -/// - If `layout.size_info` is `SizeInfo::SliceDst(slice_layout)`, then -/// - `T` is a slice DST -/// - The `size` of an instance of `T` with `elems` trailing slice elements is -/// equal to `slice_layout.offset + slice_layout.elem_size * elems` rounded up -/// to the nearest multiple of `layout.align`. Any bytes in the range -/// `[slice_layout.offset + slice_layout.elem_size * elems, size)` are padding -/// and must not be assumed to be initialized. -/// -/// [the reference]: https://doc.rust-lang.org/reference/type-layout.html -#[doc(hidden)] -#[allow(missing_debug_implementations, missing_copy_implementations)] -#[cfg_attr(test, derive(Copy, Clone, Debug, PartialEq, Eq))] -pub struct DstLayout { - _align: NonZeroUsize, - _size_info: SizeInfo, -} - -#[cfg_attr(test, derive(Copy, Clone, Debug, PartialEq, Eq))] -enum SizeInfo { - Sized { _size: usize }, - SliceDst(TrailingSliceLayout), -} - -#[cfg_attr(test, derive(Copy, Clone, Debug, PartialEq, Eq))] -struct TrailingSliceLayout { - // The offset of the first byte of the trailing slice field. Note that this - // is NOT the same as the minimum size of the type. For example, consider - // the following type: - // - // struct Foo { - // a: u16, - // b: u8, - // c: [u8], - // } - // - // In `Foo`, `c` is at byte offset 3. When `c.len() == 0`, `c` is followed - // by a padding byte. - _offset: usize, - // The size of the element type of the trailing slice field. - _elem_size: E, -} - -impl SizeInfo { - /// Attempts to create a `SizeInfo` from `Self` in which `elem_size` is a - /// `NonZeroUsize`. If `elem_size` is 0, returns `None`. - const fn _try_to_nonzero_elem_size(&self) -> Option> { - Some(match *self { - SizeInfo::Sized { _size } => SizeInfo::Sized { _size }, - SizeInfo::SliceDst(TrailingSliceLayout { _offset, _elem_size }) => { - if let Some(_elem_size) = NonZeroUsize::new(_elem_size) { - SizeInfo::SliceDst(TrailingSliceLayout { _offset, _elem_size }) - } else { - return None; - } - } - }) - } -} - -#[doc(hidden)] -#[derive(Copy, Clone)] -#[cfg_attr(test, derive(Debug))] -#[allow(missing_debug_implementations)] -pub enum _CastType { - _Prefix, - _Suffix, -} - -impl DstLayout { - /// Constructs a `DstLayout` which describes `T`. - /// - /// # Safety - /// - /// Unsafe code may assume that `DstLayout` is the correct layout for `T`. - #[doc(hidden)] - #[inline] - pub const fn for_type() -> DstLayout { - // SAFETY: `align` is correct by construction. `T: Sized`, and so it is - // sound to initialize `size_info` to `SizeInfo::Sized { size }`; the - // `size` field is also correct by construction. - DstLayout { - _align: match NonZeroUsize::new(mem::align_of::()) { - Some(align) => align, - None => unreachable!(), - }, - _size_info: SizeInfo::Sized { _size: mem::size_of::() }, - } - } - - /// Constructs a `DstLayout` which describes `[T]`. - /// - /// # Safety - /// - /// Unsafe code may assume that `DstLayout` is the correct layout for `[T]`. - const fn for_slice() -> DstLayout { - // SAFETY: The alignment of a slice is equal to the alignment of its - // element type, and so `align` is initialized correctly. - // - // Since this is just a slice type, there is no offset between the - // beginning of the type and the beginning of the slice, so it is - // correct to set `offset: 0`. The `elem_size` is correct by - // construction. Since `[T]` is a (degenerate case of a) slice DST, it - // is correct to initialize `size_info` to `SizeInfo::SliceDst`. - DstLayout { - _align: match NonZeroUsize::new(mem::align_of::()) { - Some(align) => align, - None => unreachable!(), - }, - _size_info: SizeInfo::SliceDst(TrailingSliceLayout { - _offset: 0, - _elem_size: mem::size_of::(), - }), - } - } - - /// Validates that a cast is sound from a layout perspective. - /// - /// Validates that the size and alignment requirements of a type with the - /// layout described in `self` would not be violated by performing a - /// `cast_type` cast from a pointer with address `addr` which refers to a - /// memory region of size `bytes_len`. - /// - /// If the cast is valid, `validate_cast_and_convert_metadata` returns - /// `(elems, split_at)`. If `self` describes a dynamically-sized type, then - /// `elems` is the maximum number of trailing slice elements for which a - /// cast would be valid (for sized types, `elem` is meaningless and should - /// be ignored). `split_at` is the index at which to split the memory region - /// in order for the prefix (suffix) to contain the result of the cast, and - /// in order for the remaining suffix (prefix) to contain the leftover - /// bytes. - /// - /// There are three conditions under which a cast can fail: - /// - The smallest possible value for the type is larger than the provided - /// memory region - /// - A prefix cast is requested, and `addr` does not satisfy `self`'s - /// alignment requirement - /// - A suffix cast is requested, and `addr + bytes_len` does not satisfy - /// `self`'s alignment requirement (as a consequence, since all instances - /// of the type are a multiple of its alignment, no size for the type will - /// result in a starting address which is properly aligned) - /// - /// # Safety - /// - /// The caller may assume that this implementation is correct, and may rely - /// on that assumption for the soundness of their code. In particular, the - /// caller may assume that, if `validate_cast_and_convert_metadata` returns - /// `Some((elems, split_at))`, then: - /// - A pointer to the type (for dynamically sized types, this includes - /// `elems` as its pointer metadata) describes an object of size `size <= - /// bytes_len` - /// - If this is a prefix cast: - /// - `addr` satisfies `self`'s alignment - /// - `size == split_at` - /// - If this is a suffix cast: - /// - `split_at == bytes_len - size` - /// - `addr + split_at` satisfies `self`'s alignment - /// - /// Note that this method does *not* ensure that a pointer constructed from - /// its return values will be a valid pointer. In particular, this method - /// does not reason about `isize` overflow, which is a requirement of many - /// Rust pointer APIs, and may at some point be determined to be a validity - /// invariant of pointer types themselves. This should never be a problem so - /// long as the arguments to this method are derived from a known-valid - /// pointer (e.g., one derived from a safe Rust reference), but it is - /// nonetheless the caller's responsibility to justify that pointer - /// arithmetic will not overflow based on a safety argument *other than* the - /// mere fact that this method returned successfully. - /// - /// # Panics - /// - /// `validate_cast_and_convert_metadata` will panic if `self` describes a - /// DST whose trailing slice element is zero-sized. - /// - /// If `addr + bytes_len` overflows `usize`, - /// `validate_cast_and_convert_metadata` may panic, or it may return - /// incorrect results. No guarantees are made about when - /// `validate_cast_and_convert_metadata` will panic. The caller should not - /// rely on `validate_cast_and_convert_metadata` panicking in any particular - /// condition, even if `debug_assertions` are enabled. - const fn _validate_cast_and_convert_metadata( - &self, - addr: usize, - bytes_len: usize, - cast_type: _CastType, - ) -> Option<(usize, usize)> { - // `debug_assert!`, but with `#[allow(clippy::arithmetic_side_effects)]`. - macro_rules! __debug_assert { - ($e:expr $(, $msg:expr)?) => { - debug_assert!({ - #[allow(clippy::arithmetic_side_effects)] - let e = $e; - e - } $(, $msg)?); - }; - } - - // Note that, in practice, `self` is always a compile-time constant. We - // do this check earlier than needed to ensure that we always panic as a - // result of bugs in the program (such as calling this function on an - // invalid type) instead of allowing this panic to be hidden if the cast - // would have failed anyway for runtime reasons (such as a too-small - // memory region). - // - // TODO(#67): Once our MSRV is 1.65, use let-else: - // https://blog.rust-lang.org/2022/11/03/Rust-1.65.0.html#let-else-statements - let size_info = match self._size_info._try_to_nonzero_elem_size() { - Some(size_info) => size_info, - None => panic!("attempted to cast to slice type with zero-sized element"), - }; - - // Precondition - __debug_assert!(addr.checked_add(bytes_len).is_some(), "`addr` + `bytes_len` > usize::MAX"); - - // Alignment checks go in their own block to avoid introducing variables - // into the top-level scope. - { - // We check alignment for `addr` (for prefix casts) or `addr + - // bytes_len` (for suffix casts). For a prefix cast, the correctness - // of this check is trivial - `addr` is the address the object will - // live at. - // - // For a suffix cast, we know that all valid sizes for the type are - // a multiple of the alignment (and by safety precondition, we know - // `DstLayout` may only describe valid Rust types). Thus, a - // validly-sized instance which lives at a validly-aligned address - // must also end at a validly-aligned address. Thus, if the end - // address for a suffix cast (`addr + bytes_len`) is not aligned, - // then no valid start address will be aligned either. - let offset = match cast_type { - _CastType::_Prefix => 0, - _CastType::_Suffix => bytes_len, - }; - - // Addition is guaranteed not to overflow because `offset <= - // bytes_len`, and `addr + bytes_len <= usize::MAX` is a - // precondition of this method. Modulus is guaranteed not to divide - // by 0 because `align` is non-zero. - #[allow(clippy::arithmetic_side_effects)] - if (addr + offset) % self._align.get() != 0 { - return None; - } - } - - let (elems, self_bytes) = match size_info { - SizeInfo::Sized { _size: size } => { - if size > bytes_len { - return None; - } - (0, size) - } - SizeInfo::SliceDst(TrailingSliceLayout { _offset: offset, _elem_size: elem_size }) => { - // Calculate the maximum number of bytes that could be consumed - // - any number of bytes larger than this will either not be a - // multiple of the alignment, or will be larger than - // `bytes_len`. - let max_total_bytes = - util::_round_down_to_next_multiple_of_alignment(bytes_len, self._align); - // Calculate the maximum number of bytes that could be consumed - // by the trailing slice. - // - // TODO(#67): Once our MSRV is 1.65, use let-else: - // https://blog.rust-lang.org/2022/11/03/Rust-1.65.0.html#let-else-statements - let max_slice_and_padding_bytes = match max_total_bytes.checked_sub(offset) { - Some(max) => max, - // `bytes_len` too small even for 0 trailing slice elements. - None => return None, - }; - - // Calculate the number of elements that fit in - // `max_slice_and_padding_bytes`; any remaining bytes will be - // considered padding. - // - // Guaranteed not to divide by zero: `elem_size` is non-zero. - #[allow(clippy::arithmetic_side_effects)] - let elems = max_slice_and_padding_bytes / elem_size.get(); - // Guaranteed not to overflow on multiplication: `usize::MAX >= - // max_slice_and_padding_bytes >= (max_slice_and_padding_bytes / - // elem_size) * elem_size`. - // - // Guaranteed not to overflow on addition: - // - max_slice_and_padding_bytes == max_total_bytes - offset - // - elems * elem_size <= max_slice_and_padding_bytes == max_total_bytes - offset - // - elems * elem_size + offset <= max_total_bytes <= usize::MAX - #[allow(clippy::arithmetic_side_effects)] - let without_padding = offset + elems * elem_size.get(); - // `self_bytes` is equal to the offset bytes plus the bytes - // consumed by the trailing slice plus any padding bytes - // required to satisfy the alignment. Note that we have computed - // the maximum number of trailing slice elements that could fit - // in `self_bytes`, so any padding is guaranteed to be less than - // the size of an extra element. - // - // Guaranteed not to overflow: - // - By previous comment: without_padding == elems * elem_size + - // offset <= max_total_bytes - // - By construction, `max_total_bytes` is a multiple of - // `self._align`. - // - At most, adding padding needed to round `without_padding` - // up to the next multiple of the alignment will bring - // `self_bytes` up to `max_total_bytes`. - #[allow(clippy::arithmetic_side_effects)] - let self_bytes = without_padding - + util::core_layout::_padding_needed_for(without_padding, self._align); - (elems, self_bytes) - } - }; - - __debug_assert!(self_bytes <= bytes_len); - - let split_at = match cast_type { - _CastType::_Prefix => self_bytes, - // Guaranteed not to underflow: - // - In the `Sized` branch, only returns `size` if `size <= - // bytes_len`. - // - In the `SliceDst` branch, calculates `self_bytes <= - // max_toatl_bytes`, which is upper-bounded by `bytes_len`. - #[allow(clippy::arithmetic_side_effects)] - _CastType::_Suffix => bytes_len - self_bytes, - }; - - Some((elems, split_at)) - } -} - -/// A trait which carries information about a type's layout that is used by the -/// internals of this crate. -/// -/// This trait is not meant for consumption by code outside of this crate. While -/// the normal semver stability guarantees apply with respect to which types -/// implement this trait and which trait implementations are implied by this -/// trait, no semver stability guarantees are made regarding its internals; they -/// may change at any time, and code which makes use of them may break. -/// -/// # Safety -/// -/// This trait does not convey any safety guarantees to code outside this crate. -#[doc(hidden)] // TODO: Remove this once KnownLayout is used by other APIs -pub unsafe trait KnownLayout { - // The `Self: Sized` bound makes it so that `KnownLayout` can still be - // object safe. It's not currently object safe thanks to `const LAYOUT`, and - // it likely won't be in the future, but there's no reason not to be - // forwards-compatible with object safety. - #[doc(hidden)] - fn only_derive_is_allowed_to_implement_this_trait() - where - Self: Sized; - - #[doc(hidden)] - const LAYOUT: DstLayout; - - /// SAFETY: The returned pointer has the same address and provenance as - /// `bytes`. If `Self` is a DST, the returned pointer's referent has `elems` - /// elements in its trailing slice. If `Self` is sized, `elems` is ignored. - #[doc(hidden)] - fn raw_from_ptr_len(bytes: NonNull, elems: usize) -> NonNull; -} - -// SAFETY: Delegates safety to `DstLayout::for_slice`. -unsafe impl KnownLayout for [T] { - #[allow(clippy::missing_inline_in_public_items)] - fn only_derive_is_allowed_to_implement_this_trait() - where - Self: Sized, - { - } - const LAYOUT: DstLayout = DstLayout::for_slice::(); - - // SAFETY: `.cast` preserves address and provenance. The returned pointer - // refers to an object with `elems` elements by construction. - #[inline(always)] - fn raw_from_ptr_len(data: NonNull, elems: usize) -> NonNull { - // TODO(#67): Remove this allow. See NonNullExt for more details. - #[allow(unstable_name_collisions)] - NonNull::slice_from_raw_parts(data.cast::(), elems) - } -} - -#[rustfmt::skip] -impl_known_layout!( - (), - u8, i8, u16, i16, u32, i32, u64, i64, u128, i128, usize, isize, f32, f64, - bool, char, - NonZeroU8, NonZeroI8, NonZeroU16, NonZeroI16, NonZeroU32, NonZeroI32, - NonZeroU64, NonZeroI64, NonZeroU128, NonZeroI128, NonZeroUsize, NonZeroIsize -); -#[rustfmt::skip] -impl_known_layout!( - T => Option, - T: ?Sized => PhantomData, - T => Wrapping, - T => MaybeUninit, -); -impl_known_layout!(const N: usize, T => [T; N]); - -safety_comment! { - /// SAFETY: - /// `str` and `ManuallyDrop<[T]>` [1] have the same representations as - /// `[u8]` and `[T]` repsectively. `str` has different bit validity than - /// `[u8]`, but that doesn't affect the soundness of this impl. - /// - /// [1] Per https://doc.rust-lang.org/nightly/core/mem/struct.ManuallyDrop.html: - /// - /// `ManuallyDrop` is guaranteed to have the same layout and bit - /// validity as `T` - /// - /// TODO(#429): Once this text (added in - /// https://github.com/rust-lang/rust/pull/115522) is available on stable, - /// quote the stable docs instead of the nightly docs. - unsafe_impl_known_layout!(#[repr([u8])] str); - unsafe_impl_known_layout!(T: ?Sized + KnownLayout => #[repr(T)] ManuallyDrop); -} - -/// Analyzes whether a type is [`FromZeroes`]. -/// -/// This derive analyzes, at compile time, whether the annotated type satisfies -/// the [safety conditions] of `FromZeroes` and implements `FromZeroes` if it is -/// sound to do so. This derive can be applied to structs, enums, and unions; -/// e.g.: -/// -/// ``` -/// # use zerocopy_derive::FromZeroes; -/// #[derive(FromZeroes)] -/// struct MyStruct { -/// # /* -/// ... -/// # */ -/// } -/// -/// #[derive(FromZeroes)] -/// #[repr(u8)] -/// enum MyEnum { -/// # Variant0, -/// # /* -/// ... -/// # */ -/// } -/// -/// #[derive(FromZeroes)] -/// union MyUnion { -/// # variant: u8, -/// # /* -/// ... -/// # */ -/// } -/// ``` -/// -/// [safety conditions]: trait@FromZeroes#safety -/// -/// # Analysis -/// -/// *This section describes, roughly, the analysis performed by this derive to -/// determine whether it is sound to implement `FromZeroes` for a given type. -/// Unless you are modifying the implementation of this derive, or attempting to -/// manually implement `FromZeroes` for a type yourself, you don't need to read -/// this section.* -/// -/// If a type has the following properties, then this derive can implement -/// `FromZeroes` for that type: -/// -/// - If the type is a struct, all of its fields must be `FromZeroes`. -/// - If the type is an enum, it must be C-like (meaning that all variants have -/// no fields) and it must have a variant with a discriminant of `0`. See [the -/// reference] for a description of how discriminant values are chosen. -/// - The type must not contain any [`UnsafeCell`]s (this is required in order -/// for it to be sound to construct a `&[u8]` and a `&T` to the same region of -/// memory). The type may contain references or pointers to `UnsafeCell`s so -/// long as those values can themselves be initialized from zeroes -/// (`FromZeroes` is not currently implemented for, e.g., -/// `Option<&UnsafeCell<_>>`, but it could be one day). -/// -/// This analysis is subject to change. Unsafe code may *only* rely on the -/// documented [safety conditions] of `FromZeroes`, and must *not* rely on the -/// implementation details of this derive. -/// -/// [the reference]: https://doc.rust-lang.org/reference/items/enumerations.html#custom-discriminant-values-for-fieldless-enumerations -/// [`UnsafeCell`]: core::cell::UnsafeCell -/// -/// ## Why isn't an explicit representation required for structs? -/// -/// Neither this derive, nor the [safety conditions] of `FromZeroes`, requires -/// that structs are marked with `#[repr(C)]`. -/// -/// Per the [Rust reference](reference), -/// -/// > The representation of a type can change the padding between fields, but -/// does not change the layout of the fields themselves. -/// -/// [reference]: https://doc.rust-lang.org/reference/type-layout.html#representations -/// -/// Since the layout of structs only consists of padding bytes and field bytes, -/// a struct is soundly `FromZeroes` if: -/// 1. its padding is soundly `FromZeroes`, and -/// 2. its fields are soundly `FromZeroes`. -/// -/// The answer to the first question is always yes: padding bytes do not have -/// any validity constraints. A [discussion] of this question in the Unsafe Code -/// Guidelines Working Group concluded that it would be virtually unimaginable -/// for future versions of rustc to add validity constraints to padding bytes. -/// -/// [discussion]: https://github.com/rust-lang/unsafe-code-guidelines/issues/174 -/// -/// Whether a struct is soundly `FromZeroes` therefore solely depends on whether -/// its fields are `FromZeroes`. -// TODO(#146): Document why we don't require an enum to have an explicit `repr` -// attribute. -#[cfg(any(feature = "derive", test))] -pub use zerocopy_derive::FromZeroes; - -/// Types for which a sequence of bytes all set to zero represents a valid -/// instance of the type. -/// -/// Any memory region of the appropriate length which is guaranteed to contain -/// only zero bytes can be viewed as any `FromZeroes` type with no runtime -/// overhead. This is useful whenever memory is known to be in a zeroed state, -/// such memory returned from some allocation routines. -/// -/// # Implementation -/// -/// **Do not implement this trait yourself!** Instead, use -/// [`#[derive(FromZeroes)]`][derive] (requires the `derive` Cargo feature); -/// e.g.: -/// -/// ``` -/// # use zerocopy_derive::FromZeroes; -/// #[derive(FromZeroes)] -/// struct MyStruct { -/// # /* -/// ... -/// # */ -/// } -/// -/// #[derive(FromZeroes)] -/// #[repr(u8)] -/// enum MyEnum { -/// # Variant0, -/// # /* -/// ... -/// # */ -/// } -/// -/// #[derive(FromZeroes)] -/// union MyUnion { -/// # variant: u8, -/// # /* -/// ... -/// # */ -/// } -/// ``` -/// -/// This derive performs a sophisticated, compile-time safety analysis to -/// determine whether a type is `FromZeroes`. -/// -/// # Safety -/// -/// *This section describes what is required in order for `T: FromZeroes`, and -/// what unsafe code may assume of such types. If you don't plan on implementing -/// `FromZeroes` manually, and you don't plan on writing unsafe code that -/// operates on `FromZeroes` types, then you don't need to read this section.* -/// -/// If `T: FromZeroes`, then unsafe code may assume that: -/// - It is sound to treat any initialized sequence of zero bytes of length -/// `size_of::()` as a `T`. -/// - Given `b: &[u8]` where `b.len() == size_of::()`, `b` is aligned to -/// `align_of::()`, and `b` contains only zero bytes, it is sound to -/// construct a `t: &T` at the same address as `b`, and it is sound for both -/// `b` and `t` to be live at the same time. -/// -/// If a type is marked as `FromZeroes` which violates this contract, it may -/// cause undefined behavior. -/// -/// `#[derive(FromZeroes)]` only permits [types which satisfy these requirements][derive-analysis]. -/// -#[cfg_attr( - feature = "derive", - doc = "[derive]: zerocopy_derive::FromZeroes", - doc = "[derive-analysis]: zerocopy_derive::FromZeroes#analysis" -)] -#[cfg_attr( - not(feature = "derive"), - doc = concat!("[derive]: https://docs.rs/zerocopy/", env!("CARGO_PKG_VERSION"), "/zerocopy/derive.FromZeroes.html"), - doc = concat!("[derive-analysis]: https://docs.rs/zerocopy/", env!("CARGO_PKG_VERSION"), "/zerocopy/derive.FromZeroes.html#analysis"), -)] -pub unsafe trait FromZeroes { - // The `Self: Sized` bound makes it so that `FromZeroes` is still object - // safe. - #[doc(hidden)] - fn only_derive_is_allowed_to_implement_this_trait() - where - Self: Sized; - - /// Overwrites `self` with zeroes. - /// - /// Sets every byte in `self` to 0. While this is similar to doing `*self = - /// Self::new_zeroed()`, it differs in that `zero` does not semantically - /// drop the current value and replace it with a new one - it simply - /// modifies the bytes of the existing value. - /// - /// # Examples - /// - /// ``` - /// # use zerocopy::FromZeroes; - /// # use zerocopy_derive::*; - /// # - /// #[derive(FromZeroes)] - /// #[repr(C)] - /// struct PacketHeader { - /// src_port: [u8; 2], - /// dst_port: [u8; 2], - /// length: [u8; 2], - /// checksum: [u8; 2], - /// } - /// - /// let mut header = PacketHeader { - /// src_port: 100u16.to_be_bytes(), - /// dst_port: 200u16.to_be_bytes(), - /// length: 300u16.to_be_bytes(), - /// checksum: 400u16.to_be_bytes(), - /// }; - /// - /// header.zero(); - /// - /// assert_eq!(header.src_port, [0, 0]); - /// assert_eq!(header.dst_port, [0, 0]); - /// assert_eq!(header.length, [0, 0]); - /// assert_eq!(header.checksum, [0, 0]); - /// ``` - #[inline(always)] - fn zero(&mut self) { - let slf: *mut Self = self; - let len = mem::size_of_val(self); - // SAFETY: - // - `self` is guaranteed by the type system to be valid for writes of - // size `size_of_val(self)`. - // - `u8`'s alignment is 1, and thus `self` is guaranteed to be aligned - // as required by `u8`. - // - Since `Self: FromZeroes`, the all-zeroes instance is a valid - // instance of `Self.` - unsafe { ptr::write_bytes(slf.cast::(), 0, len) }; - } - - /// Creates an instance of `Self` from zeroed bytes. - /// - /// # Examples - /// - /// ``` - /// # use zerocopy::FromZeroes; - /// # use zerocopy_derive::*; - /// # - /// #[derive(FromZeroes)] - /// #[repr(C)] - /// struct PacketHeader { - /// src_port: [u8; 2], - /// dst_port: [u8; 2], - /// length: [u8; 2], - /// checksum: [u8; 2], - /// } - /// - /// let header: PacketHeader = FromZeroes::new_zeroed(); - /// - /// assert_eq!(header.src_port, [0, 0]); - /// assert_eq!(header.dst_port, [0, 0]); - /// assert_eq!(header.length, [0, 0]); - /// assert_eq!(header.checksum, [0, 0]); - /// ``` - #[inline(always)] - fn new_zeroed() -> Self - where - Self: Sized, - { - // SAFETY: `FromZeroes` says that the all-zeroes bit pattern is legal. - unsafe { mem::zeroed() } - } - - /// Creates a `Box` from zeroed bytes. - /// - /// This function is useful for allocating large values on the heap and - /// zero-initializing them, without ever creating a temporary instance of - /// `Self` on the stack. For example, `<[u8; 1048576]>::new_box_zeroed()` - /// will allocate `[u8; 1048576]` directly on the heap; it does not require - /// storing `[u8; 1048576]` in a temporary variable on the stack. - /// - /// On systems that use a heap implementation that supports allocating from - /// pre-zeroed memory, using `new_box_zeroed` (or related functions) may - /// have performance benefits. - /// - /// Note that `Box` can be converted to `Arc` and other - /// container types without reallocation. - /// - /// # Panics - /// - /// Panics if allocation of `size_of::()` bytes fails. - #[cfg(feature = "alloc")] - #[inline] - fn new_box_zeroed() -> Box - where - Self: Sized, - { - // If `T` is a ZST, then return a proper boxed instance of it. There is - // no allocation, but `Box` does require a correct dangling pointer. - let layout = Layout::new::(); - if layout.size() == 0 { - return Box::new(Self::new_zeroed()); - } - - // TODO(#429): Add a "SAFETY" comment and remove this `allow`. - #[allow(clippy::undocumented_unsafe_blocks)] - let ptr = unsafe { alloc::alloc::alloc_zeroed(layout).cast::() }; - if ptr.is_null() { - alloc::alloc::handle_alloc_error(layout); - } - // TODO(#429): Add a "SAFETY" comment and remove this `allow`. - #[allow(clippy::undocumented_unsafe_blocks)] - unsafe { - Box::from_raw(ptr) - } - } - - /// Creates a `Box<[Self]>` (a boxed slice) from zeroed bytes. - /// - /// This function is useful for allocating large values of `[Self]` on the - /// heap and zero-initializing them, without ever creating a temporary - /// instance of `[Self; _]` on the stack. For example, - /// `u8::new_box_slice_zeroed(1048576)` will allocate the slice directly on - /// the heap; it does not require storing the slice on the stack. - /// - /// On systems that use a heap implementation that supports allocating from - /// pre-zeroed memory, using `new_box_slice_zeroed` may have performance - /// benefits. - /// - /// If `Self` is a zero-sized type, then this function will return a - /// `Box<[Self]>` that has the correct `len`. Such a box cannot contain any - /// actual information, but its `len()` property will report the correct - /// value. - /// - /// # Panics - /// - /// * Panics if `size_of::() * len` overflows. - /// * Panics if allocation of `size_of::() * len` bytes fails. - #[cfg(feature = "alloc")] - #[inline] - fn new_box_slice_zeroed(len: usize) -> Box<[Self]> - where - Self: Sized, - { - let size = mem::size_of::() - .checked_mul(len) - .expect("mem::size_of::() * len overflows `usize`"); - let align = mem::align_of::(); - // On stable Rust versions <= 1.64.0, `Layout::from_size_align` has a - // bug in which sufficiently-large allocations (those which, when - // rounded up to the alignment, overflow `isize`) are not rejected, - // which can cause undefined behavior. See #64 for details. - // - // TODO(#67): Once our MSRV is > 1.64.0, remove this assertion. - #[allow(clippy::as_conversions)] - let max_alloc = (isize::MAX as usize).saturating_sub(align); - assert!(size <= max_alloc); - // TODO(https://github.com/rust-lang/rust/issues/55724): Use - // `Layout::repeat` once it's stabilized. - let layout = - Layout::from_size_align(size, align).expect("total allocation size overflows `isize`"); - - let ptr = if layout.size() != 0 { - // TODO(#429): Add a "SAFETY" comment and remove this `allow`. - #[allow(clippy::undocumented_unsafe_blocks)] - let ptr = unsafe { alloc::alloc::alloc_zeroed(layout).cast::() }; - if ptr.is_null() { - alloc::alloc::handle_alloc_error(layout); - } - ptr - } else { - // `Box<[T]>` does not allocate when `T` is zero-sized or when `len` - // is zero, but it does require a non-null dangling pointer for its - // allocation. - NonNull::::dangling().as_ptr() - }; - - // TODO(#429): Add a "SAFETY" comment and remove this `allow`. - #[allow(clippy::undocumented_unsafe_blocks)] - unsafe { - Box::from_raw(slice::from_raw_parts_mut(ptr, len)) - } - } - - /// Creates a `Vec` from zeroed bytes. - /// - /// This function is useful for allocating large values of `Vec`s and - /// zero-initializing them, without ever creating a temporary instance of - /// `[Self; _]` (or many temporary instances of `Self`) on the stack. For - /// example, `u8::new_vec_zeroed(1048576)` will allocate directly on the - /// heap; it does not require storing intermediate values on the stack. - /// - /// On systems that use a heap implementation that supports allocating from - /// pre-zeroed memory, using `new_vec_zeroed` may have performance benefits. - /// - /// If `Self` is a zero-sized type, then this function will return a - /// `Vec` that has the correct `len`. Such a `Vec` cannot contain any - /// actual information, but its `len()` property will report the correct - /// value. - /// - /// # Panics - /// - /// * Panics if `size_of::() * len` overflows. - /// * Panics if allocation of `size_of::() * len` bytes fails. - #[cfg(feature = "alloc")] - #[inline(always)] - fn new_vec_zeroed(len: usize) -> Vec - where - Self: Sized, - { - Self::new_box_slice_zeroed(len).into() - } -} - -/// Types for which any byte pattern is valid. -/// -/// WARNING: Do not implement this trait yourself! Instead, use -/// `#[derive(FromBytes)]` (requires the `derive` Cargo feature). -/// -/// `FromBytes` types can safely be deserialized from an untrusted sequence of -/// bytes because any byte sequence corresponds to a valid instance of the type. -/// -/// `FromBytes` is ignorant of byte order. For byte order-aware types, see the -/// [`byteorder`] module. -/// -/// # Safety -/// -/// *This section describes what is required in order for `T: FromBytes`, and -/// what unsafe code may assume of such types. `#[derive(FromBytes)]` only -/// permits types which satisfy these requirements. If you don't plan on -/// implementing `FromBytes` manually, and you don't plan on writing unsafe code -/// that operates on `FromBytes` types, then you don't need to read this -/// section.* -/// -/// If `T: FromBytes`, then unsafe code may assume that: -/// - It is sound to treat any initialized sequence of bytes of length -/// `size_of::()` as a `T`. -/// - Given `b: &[u8]` where `b.len() == size_of::()` and `b` is aligned to -/// `align_of::()`, it is sound to construct a `t: &T` at the same address -/// as `b`, and it is sound for both `b` and `t` to be live at the same time. -/// -/// If a type is marked as `FromBytes` which violates this contract, it may -/// cause undefined behavior. -/// -/// If a type has the following properties, then it is sound to implement -/// `FromBytes` for that type: -/// - If the type is a struct, all of its fields must satisfy the requirements -/// to be `FromBytes` (they do not actually have to be `FromBytes`) -/// - If the type is an enum: -/// - It must be a C-like enum (meaning that all variants have no fields). -/// - It must have a defined representation (`repr`s `C`, `u8`, `u16`, `u32`, -/// `u64`, `usize`, `i8`, `i16`, `i32`, `i64`, or `isize`). -/// - The maximum number of discriminants must be used (so that every possible -/// bit pattern is a valid one). Be very careful when using the `C`, -/// `usize`, or `isize` representations, as their size is -/// platform-dependent. -/// - The type must not contain any [`UnsafeCell`]s (this is required in order -/// for it to be sound to construct a `&[u8]` and a `&T` to the same region of -/// memory). The type may contain references or pointers to `UnsafeCell`s so -/// long as those values can themselves be initialized from zeroes -/// (`FromBytes` is not currently implemented for, e.g., `Option<*const -/// UnsafeCell<_>>`, but it could be one day). -/// -/// [`UnsafeCell`]: core::cell::UnsafeCell -/// -/// # Rationale -/// -/// ## Why isn't an explicit representation required for structs? -/// -/// Per the [Rust reference](reference), -/// -/// > The representation of a type can change the padding between fields, but -/// does not change the layout of the fields themselves. -/// -/// [reference]: https://doc.rust-lang.org/reference/type-layout.html#representations -/// -/// Since the layout of structs only consists of padding bytes and field bytes, -/// a struct is soundly `FromBytes` if: -/// 1. its padding is soundly `FromBytes`, and -/// 2. its fields are soundly `FromBytes`. -/// -/// The answer to the first question is always yes: padding bytes do not have -/// any validity constraints. A [discussion] of this question in the Unsafe Code -/// Guidelines Working Group concluded that it would be virtually unimaginable -/// for future versions of rustc to add validity constraints to padding bytes. -/// -/// [discussion]: https://github.com/rust-lang/unsafe-code-guidelines/issues/174 -/// -/// Whether a struct is soundly `FromBytes` therefore solely depends on whether -/// its fields are `FromBytes`. -pub unsafe trait FromBytes: FromZeroes { - // The `Self: Sized` bound makes it so that `FromBytes` is still object - // safe. - #[doc(hidden)] - fn only_derive_is_allowed_to_implement_this_trait() - where - Self: Sized; - - /// Interprets the given `bytes` as a `&Self` without copying. - /// - /// If `bytes.len() != size_of::()` or `bytes` is not aligned to - /// `align_of::()`, this returns `None`. - #[inline] - fn ref_from(bytes: &[u8]) -> Option<&Self> - where - Self: Sized, - { - Ref::<&[u8], Self>::new(bytes).map(Ref::into_ref) - } - - /// Interprets the prefix of the given `bytes` as a `&Self` without copying. - /// - /// `ref_from_prefix` returns a reference to the first `size_of::()` - /// bytes of `bytes`. If `bytes.len() < size_of::()` or `bytes` is not - /// aligned to `align_of::()`, this returns `None`. - /// - /// To also access the prefix bytes, use [`Ref::new_from_prefix`]. Then, - /// use [`Ref::into_ref`] to get a `&Self` with the same lifetime. - #[inline] - fn ref_from_prefix(bytes: &[u8]) -> Option<&Self> - where - Self: Sized, - { - Ref::<&[u8], Self>::new_from_prefix(bytes).map(|(r, _)| r.into_ref()) - } - - /// Interprets the suffix of the given `bytes` as a `&Self` without copying. - /// - /// `ref_from_suffix` returns a reference to the last `size_of::()` - /// bytes of `bytes`. If `bytes.len() < size_of::()` or the suffix of - /// `bytes` is not aligned to `align_of::()`, this returns `None`. - /// - /// To also access the suffix bytes, use [`Ref::new_from_suffix`]. Then, - /// use [`Ref::into_ref`] to get a `&Self` with the same lifetime. - #[inline] - fn ref_from_suffix(bytes: &[u8]) -> Option<&Self> - where - Self: Sized, - { - Ref::<&[u8], Self>::new_from_suffix(bytes).map(|(_, r)| r.into_ref()) - } - - /// Interprets the given `bytes` as a `&mut Self` without copying. - /// - /// If `bytes.len() != size_of::()` or `bytes` is not aligned to - /// `align_of::()`, this returns `None`. - #[inline] - fn mut_from(bytes: &mut [u8]) -> Option<&mut Self> - where - Self: Sized + AsBytes, - { - Ref::<&mut [u8], Self>::new(bytes).map(Ref::into_mut) - } - - /// Interprets the prefix of the given `bytes` as a `&mut Self` without copying. - /// - /// `mut_from_prefix` returns a reference to the first `size_of::()` - /// bytes of `bytes`. If `bytes.len() < size_of::()` or `bytes` is not - /// aligned to `align_of::()`, this returns `None`. - /// - /// To also access the prefix bytes, use [`Ref::new_from_prefix`]. Then, - /// use [`Ref::into_mut`] to get a `&mut Self` with the same lifetime. - #[inline] - fn mut_from_prefix(bytes: &mut [u8]) -> Option<&mut Self> - where - Self: Sized + AsBytes, - { - Ref::<&mut [u8], Self>::new_from_prefix(bytes).map(|(r, _)| r.into_mut()) - } - - /// Interprets the suffix of the given `bytes` as a `&mut Self` without copying. - /// - /// `mut_from_suffix` returns a reference to the last `size_of::()` - /// bytes of `bytes`. If `bytes.len() < size_of::()` or the suffix of - /// `bytes` is not aligned to `align_of::()`, this returns `None`. - /// - /// To also access the suffix bytes, use [`Ref::new_from_suffix`]. Then, - /// use [`Ref::into_mut`] to get a `&mut Self` with the same lifetime. - #[inline] - fn mut_from_suffix(bytes: &mut [u8]) -> Option<&mut Self> - where - Self: Sized + AsBytes, - { - Ref::<&mut [u8], Self>::new_from_suffix(bytes).map(|(_, r)| r.into_mut()) - } - - /// Reads a copy of `Self` from `bytes`. - /// - /// If `bytes.len() != size_of::()`, `read_from` returns `None`. - #[inline] - fn read_from(bytes: &[u8]) -> Option - where - Self: Sized, - { - Ref::<_, Unalign>::new_unaligned(bytes).map(|r| r.read().into_inner()) - } - - /// Reads a copy of `Self` from the prefix of `bytes`. - /// - /// `read_from_prefix` reads a `Self` from the first `size_of::()` - /// bytes of `bytes`. If `bytes.len() < size_of::()`, it returns - /// `None`. - #[inline] - fn read_from_prefix(bytes: &[u8]) -> Option - where - Self: Sized, - { - Ref::<_, Unalign>::new_unaligned_from_prefix(bytes) - .map(|(r, _)| r.read().into_inner()) - } - - /// Reads a copy of `Self` from the suffix of `bytes`. - /// - /// `read_from_suffix` reads a `Self` from the last `size_of::()` - /// bytes of `bytes`. If `bytes.len() < size_of::()`, it returns - /// `None`. - #[inline] - fn read_from_suffix(bytes: &[u8]) -> Option - where - Self: Sized, - { - Ref::<_, Unalign>::new_unaligned_from_suffix(bytes) - .map(|(_, r)| r.read().into_inner()) - } -} - -/// Types which are safe to treat as an immutable byte slice. -/// -/// WARNING: Do not implement this trait yourself! Instead, use -/// `#[derive(AsBytes)]` (requires the `derive` Cargo feature). -/// -/// `AsBytes` types can be safely viewed as a slice of bytes. In particular, -/// this means that, in any valid instance of the type, none of the bytes of the -/// instance are uninitialized. This precludes the following types: -/// - Structs with internal padding -/// - Unions in which not all variants have the same length -/// -/// `AsBytes` is ignorant of byte order. For byte order-aware types, see the -/// [`byteorder`] module. -/// -/// # Custom Derive Errors -/// -/// Due to the way that the custom derive for `AsBytes` is implemented, you may -/// get an error like this: -/// -/// ```text -/// error[E0277]: the trait bound `HasPadding: ShouldBe` is not satisfied -/// --> lib.rs:23:10 -/// | -/// 1 | #[derive(AsBytes)] -/// | ^^^^^^^ the trait `ShouldBe` is not implemented for `HasPadding` -/// | -/// = help: the trait `ShouldBe` is implemented for `HasPadding` -/// ``` -/// -/// This error indicates that the type being annotated has padding bytes, which -/// is illegal for `AsBytes` types. Consider reducing the alignment of some -/// fields by using types in the [`byteorder`] module, adding explicit struct -/// fields where those padding bytes would be, or using `#[repr(packed)]`. See -/// the Rust Reference's page on [type layout] for more information -/// about type layout and padding. -/// -/// # Safety -/// -/// *This section describes what is required in order for `T: AsBytes`, and what -/// unsafe code may assume of such types. `#[derive(AsBytes)]` only permits -/// types which satisfy these requirements. If you don't plan on implementing -/// `AsBytes` manually, and you don't plan on writing unsafe code that operates -/// on `AsBytes` types, then you don't need to read this section.* -/// -/// If `T: AsBytes`, then unsafe code may assume that: -/// - It is sound to treat any `t: T` as an immutable `[u8]` of length -/// `size_of_val(t)`. -/// - Given `t: &T`, it is sound to construct a `b: &[u8]` where `b.len() == -/// size_of_val(t)` at the same address as `t`, and it is sound for both `b` -/// and `t` to be live at the same time. -/// -/// If a type is marked as `AsBytes` which violates this contract, it may cause -/// undefined behavior. -/// -/// If a type has the following properties, then it is sound to implement -/// `AsBytes` for that type: -/// - If the type is a struct: -/// - It must have a defined representation (`repr(C)`, `repr(transparent)`, -/// or `repr(packed)`). -/// - All of its fields must satisfy the requirements to be `AsBytes` (they do -/// not actually have to be `AsBytes`). -/// - Its layout must have no padding. This is always true for -/// `repr(transparent)` and `repr(packed)`. For `repr(C)`, see the layout -/// algorithm described in the [Rust Reference]. -/// - If the type is an enum: -/// - It must be a C-like enum (meaning that all variants have no fields). -/// - It must have a defined representation (`repr`s `C`, `u8`, `u16`, `u32`, -/// `u64`, `usize`, `i8`, `i16`, `i32`, `i64`, or `isize`). -/// - The type must not contain any [`UnsafeCell`]s (this is required in order -/// for it to be sound to construct a `&[u8]` and a `&T` to the same region of -/// memory). The type may contain references or pointers to `UnsafeCell`s so -/// long as those values can themselves be initialized from zeroes (`AsBytes` -/// is not currently implemented for, e.g., `Option<&UnsafeCell<_>>`, but it -/// could be one day). -/// -/// [type layout]: https://doc.rust-lang.org/reference/type-layout.html -/// [Rust Reference]: https://doc.rust-lang.org/reference/type-layout.html -/// [`UnsafeCell`]: core::cell::UnsafeCell -pub unsafe trait AsBytes { - // The `Self: Sized` bound makes it so that this function doesn't prevent - // `AsBytes` from being object safe. Note that other `AsBytes` methods - // prevent object safety, but those provide a benefit in exchange for object - // safety. If at some point we remove those methods, change their type - // signatures, or move them out of this trait so that `AsBytes` is object - // safe again, it's important that this function not prevent object safety. - #[doc(hidden)] - fn only_derive_is_allowed_to_implement_this_trait() - where - Self: Sized; - - /// Gets the bytes of this value. - /// - /// `as_bytes` provides access to the bytes of this value as an immutable - /// byte slice. - #[inline(always)] - fn as_bytes(&self) -> &[u8] { - // Note that this method does not have a `Self: Sized` bound; - // `size_of_val` works for unsized values too. - let len = mem::size_of_val(self); - let slf: *const Self = self; - - // SAFETY: - // - `slf.cast::()` is valid for reads for `len * - // mem::size_of::()` many bytes because... - // - `slf` is the same pointer as `self`, and `self` is a reference - // which points to an object whose size is `len`. Thus... - // - The entire region of `len` bytes starting at `slf` is contained - // within a single allocation. - // - `slf` is non-null. - // - `slf` is trivially aligned to `align_of::() == 1`. - // - `Self: AsBytes` ensures that all of the bytes of `slf` are - // initialized. - // - Since `slf` is derived from `self`, and `self` is an immutable - // reference, the only other references to this memory region that - // could exist are other immutable references, and those don't allow - // mutation. `AsBytes` prohibits types which contain `UnsafeCell`s, - // which are the only types for which this rule wouldn't be sufficient. - // - The total size of the resulting slice is no larger than - // `isize::MAX` because no allocation produced by safe code can be - // larger than `isize::MAX`. - unsafe { slice::from_raw_parts(slf.cast::(), len) } - } - - /// Gets the bytes of this value mutably. - /// - /// `as_bytes_mut` provides access to the bytes of this value as a mutable - /// byte slice. - #[inline(always)] - fn as_bytes_mut(&mut self) -> &mut [u8] - where - Self: FromBytes, - { - // Note that this method does not have a `Self: Sized` bound; - // `size_of_val` works for unsized values too. - let len = mem::size_of_val(self); - let slf: *mut Self = self; - - // SAFETY: - // - `slf.cast::()` is valid for reads and writes for `len * - // mem::size_of::()` many bytes because... - // - `slf` is the same pointer as `self`, and `self` is a reference - // which points to an object whose size is `len`. Thus... - // - The entire region of `len` bytes starting at `slf` is contained - // within a single allocation. - // - `slf` is non-null. - // - `slf` is trivially aligned to `align_of::() == 1`. - // - `Self: AsBytes` ensures that all of the bytes of `slf` are - // initialized. - // - `Self: FromBytes` ensures that no write to this memory region - // could result in it containing an invalid `Self`. - // - Since `slf` is derived from `self`, and `self` is a mutable - // reference, no other references to this memory region can exist. - // - The total size of the resulting slice is no larger than - // `isize::MAX` because no allocation produced by safe code can be - // larger than `isize::MAX`. - unsafe { slice::from_raw_parts_mut(slf.cast::(), len) } - } - - /// Writes a copy of `self` to `bytes`. - /// - /// If `bytes.len() != size_of_val(self)`, `write_to` returns `None`. - #[inline] - fn write_to(&self, bytes: &mut [u8]) -> Option<()> { - if bytes.len() != mem::size_of_val(self) { - return None; - } - - bytes.copy_from_slice(self.as_bytes()); - Some(()) - } - - /// Writes a copy of `self` to the prefix of `bytes`. - /// - /// `write_to_prefix` writes `self` to the first `size_of_val(self)` bytes - /// of `bytes`. If `bytes.len() < size_of_val(self)`, it returns `None`. - #[inline] - fn write_to_prefix(&self, bytes: &mut [u8]) -> Option<()> { - let size = mem::size_of_val(self); - bytes.get_mut(..size)?.copy_from_slice(self.as_bytes()); - Some(()) - } - - /// Writes a copy of `self` to the suffix of `bytes`. - /// - /// `write_to_suffix` writes `self` to the last `size_of_val(self)` bytes of - /// `bytes`. If `bytes.len() < size_of_val(self)`, it returns `None`. - #[inline] - fn write_to_suffix(&self, bytes: &mut [u8]) -> Option<()> { - let start = bytes.len().checked_sub(mem::size_of_val(self))?; - bytes - .get_mut(start..) - .expect("`start` should be in-bounds of `bytes`") - .copy_from_slice(self.as_bytes()); - Some(()) - } -} - -/// Types with no alignment requirement. -/// -/// WARNING: Do not implement this trait yourself! Instead, use -/// `#[derive(Unaligned)]` (requires the `derive` Cargo feature). -/// -/// If `T: Unaligned`, then `align_of::() == 1`. -/// -/// # Safety -/// -/// *This section describes what is required in order for `T: Unaligned`, and -/// what unsafe code may assume of such types. `#[derive(Unaligned)]` only -/// permits types which satisfy these requirements. If you don't plan on -/// implementing `Unaligned` manually, and you don't plan on writing unsafe code -/// that operates on `Unaligned` types, then you don't need to read this -/// section.* -/// -/// If `T: Unaligned`, then unsafe code may assume that it is sound to produce a -/// reference to `T` at any memory location regardless of alignment. If a type -/// is marked as `Unaligned` which violates this contract, it may cause -/// undefined behavior. -pub unsafe trait Unaligned { - // The `Self: Sized` bound makes it so that `Unaligned` is still object - // safe. - #[doc(hidden)] - fn only_derive_is_allowed_to_implement_this_trait() - where - Self: Sized; -} - -safety_comment! { - /// SAFETY: - /// Per the reference [1], "the unit tuple (`()`) ... is guaranteed as a - /// zero-sized type to have a size of 0 and an alignment of 1." - /// - `FromZeroes`, `FromBytes`: There is only one possible sequence of 0 - /// bytes, and `()` is inhabited. - /// - `AsBytes`: Since `()` has size 0, it contains no padding bytes. - /// - `Unaligned`: `()` has alignment 1. - /// - /// [1] https://doc.rust-lang.org/reference/type-layout.html#tuple-layout - unsafe_impl!((): FromZeroes, FromBytes, AsBytes, Unaligned); - assert_unaligned!(()); -} - -safety_comment! { - /// SAFETY: - /// - `FromZeroes`, `FromBytes`: all bit patterns are valid for integers [1] - /// - `AsBytes`: integers have no padding bytes [1] - /// - `Unaligned` (`u8` and `i8` only): The reference [2] specifies the size - /// of `u8` and `i8` as 1 byte. We also know that: - /// - Alignment is >= 1 - /// - Size is an integer multiple of alignment - /// - The only value >= 1 for which 1 is an integer multiple is 1 - /// Therefore, the only possible alignment for `u8` and `i8` is 1. - /// - /// [1] TODO(https://github.com/rust-lang/reference/issues/1291): Once the - /// reference explicitly guarantees these properties, cite it. - /// [2] https://doc.rust-lang.org/reference/type-layout.html#primitive-data-layout - unsafe_impl!(u8: FromZeroes, FromBytes, AsBytes, Unaligned); - unsafe_impl!(i8: FromZeroes, FromBytes, AsBytes, Unaligned); - assert_unaligned!(u8, i8); - unsafe_impl!(u16: FromZeroes, FromBytes, AsBytes); - unsafe_impl!(i16: FromZeroes, FromBytes, AsBytes); - unsafe_impl!(u32: FromZeroes, FromBytes, AsBytes); - unsafe_impl!(i32: FromZeroes, FromBytes, AsBytes); - unsafe_impl!(u64: FromZeroes, FromBytes, AsBytes); - unsafe_impl!(i64: FromZeroes, FromBytes, AsBytes); - unsafe_impl!(u128: FromZeroes, FromBytes, AsBytes); - unsafe_impl!(i128: FromZeroes, FromBytes, AsBytes); - unsafe_impl!(usize: FromZeroes, FromBytes, AsBytes); - unsafe_impl!(isize: FromZeroes, FromBytes, AsBytes); -} - -safety_comment! { - /// SAFETY: - /// - `FromZeroes`, `FromBytes`: the `{f32,f64}::from_bits` constructors' - /// documentation [1,2] states that they are currently equivalent to - /// `transmute`. [3] - /// - `AsBytes`: the `{f32,f64}::to_bits` methods' documentation [4,5] - /// states that they are currently equivalent to `transmute`. [3] - /// - /// TODO: Make these arguments more precisely in terms of the documentation. - /// - /// [1] https://doc.rust-lang.org/nightly/std/primitive.f32.html#method.from_bits - /// [2] https://doc.rust-lang.org/nightly/std/primitive.f64.html#method.from_bits - /// [3] TODO(https://github.com/rust-lang/reference/issues/1291): Once the - /// reference explicitly guarantees these properties, cite it. - /// [4] https://doc.rust-lang.org/nightly/std/primitive.f32.html#method.to_bits - /// [5] https://doc.rust-lang.org/nightly/std/primitive.f64.html#method.to_bits - unsafe_impl!(f32: FromZeroes, FromBytes, AsBytes); - unsafe_impl!(f64: FromZeroes, FromBytes, AsBytes); -} - -safety_comment! { - /// SAFETY: - /// - `FromZeroes`: Per the reference [1], 0x00 is a valid bit pattern for - /// `bool`. - /// - `AsBytes`: Per the reference [1], `bool` always has a size of 1 with - /// valid bit patterns 0x01 and 0x00, so the only byte of the bool is - /// always initialized - /// - `Unaligned`: Per the reference [1], "[a]n object with the boolean type - /// has a size and alignment of 1 each." - /// - /// [1] https://doc.rust-lang.org/reference/types/boolean.html - unsafe_impl!(bool: FromZeroes, AsBytes, Unaligned); - assert_unaligned!(bool); -} -safety_comment! { - /// SAFETY: - /// - `FromZeroes`: Per the reference [1], 0x0000 is a valid bit pattern for - /// `char`. - /// - `AsBytes`: `char` is represented as a 32-bit unsigned word (`u32`) - /// [1], which is `AsBytes`. Note that unlike `u32`, not all bit patterns - /// are valid for `char`. - /// - /// [1] https://doc.rust-lang.org/reference/types/textual.html - unsafe_impl!(char: FromZeroes, AsBytes); -} -safety_comment! { - /// SAFETY: - /// - `FromZeroes`, `AsBytes`, `Unaligned`: Per the reference [1], `str` has - /// the same layout as `[u8]`, and `[u8]` is `FromZeroes`, `AsBytes`, and - /// `Unaligned`. - /// - /// Note that we don't `assert_unaligned!(str)` because `assert_unaligned!` - /// uses `align_of`, which only works for `Sized` types. - /// - /// [1] https://doc.rust-lang.org/reference/type-layout.html#str-layout - unsafe_impl!(str: FromZeroes, AsBytes, Unaligned); -} - -safety_comment! { - // `NonZeroXxx` is `AsBytes`, but not `FromZeroes` or `FromBytes`. - // - /// SAFETY: - /// - `AsBytes`: `NonZeroXxx` has the same layout as its associated - /// primitive. Since it is the same size, this guarantees it has no - /// padding - integers have no padding, and there's no room for padding - /// if it can represent all of the same values except 0. - /// - `Unaligned`: `NonZeroU8` and `NonZeroI8` document that - /// `Option` and `Option` both have size 1. [1] [2] - /// This is worded in a way that makes it unclear whether it's meant as a - /// guarantee, but given the purpose of those types, it's virtually - /// unthinkable that that would ever change. `Option` cannot be smaller - /// than its contained type, which implies that, and `NonZeroX8` are of - /// size 1 or 0. `NonZeroX8` can represent multiple states, so they cannot - /// be 0 bytes, which means that they must be 1 byte. The only valid - /// alignment for a 1-byte type is 1. - /// - /// [1] https://doc.rust-lang.org/stable/std/num/struct.NonZeroU8.html - /// [2] https://doc.rust-lang.org/stable/std/num/struct.NonZeroI8.html - /// TODO(https://github.com/rust-lang/rust/pull/104082): Cite documentation - /// that layout is the same as primitive layout. - unsafe_impl!(NonZeroU8: AsBytes, Unaligned); - unsafe_impl!(NonZeroI8: AsBytes, Unaligned); - assert_unaligned!(NonZeroU8, NonZeroI8); - unsafe_impl!(NonZeroU16: AsBytes); - unsafe_impl!(NonZeroI16: AsBytes); - unsafe_impl!(NonZeroU32: AsBytes); - unsafe_impl!(NonZeroI32: AsBytes); - unsafe_impl!(NonZeroU64: AsBytes); - unsafe_impl!(NonZeroI64: AsBytes); - unsafe_impl!(NonZeroU128: AsBytes); - unsafe_impl!(NonZeroI128: AsBytes); - unsafe_impl!(NonZeroUsize: AsBytes); - unsafe_impl!(NonZeroIsize: AsBytes); -} -safety_comment! { - /// SAFETY: - /// - `FromZeroes`, `FromBytes`, `AsBytes`: The Rust compiler reuses `0` - /// value to represent `None`, so `size_of::>() == - /// size_of::()`; see `NonZeroXxx` documentation. - /// - `Unaligned`: `NonZeroU8` and `NonZeroI8` document that - /// `Option` and `Option` both have size 1. [1] [2] - /// This is worded in a way that makes it unclear whether it's meant as a - /// guarantee, but given the purpose of those types, it's virtually - /// unthinkable that that would ever change. The only valid alignment for - /// a 1-byte type is 1. - /// - /// [1] https://doc.rust-lang.org/stable/std/num/struct.NonZeroU8.html - /// [2] https://doc.rust-lang.org/stable/std/num/struct.NonZeroI8.html - /// - /// TODO(https://github.com/rust-lang/rust/pull/104082): Cite documentation - /// for layout guarantees. - unsafe_impl!(Option: FromZeroes, FromBytes, AsBytes, Unaligned); - unsafe_impl!(Option: FromZeroes, FromBytes, AsBytes, Unaligned); - assert_unaligned!(Option, Option); - unsafe_impl!(Option: FromZeroes, FromBytes, AsBytes); - unsafe_impl!(Option: FromZeroes, FromBytes, AsBytes); - unsafe_impl!(Option: FromZeroes, FromBytes, AsBytes); - unsafe_impl!(Option: FromZeroes, FromBytes, AsBytes); - unsafe_impl!(Option: FromZeroes, FromBytes, AsBytes); - unsafe_impl!(Option: FromZeroes, FromBytes, AsBytes); - unsafe_impl!(Option: FromZeroes, FromBytes, AsBytes); - unsafe_impl!(Option: FromZeroes, FromBytes, AsBytes); - unsafe_impl!(Option: FromZeroes, FromBytes, AsBytes); - unsafe_impl!(Option: FromZeroes, FromBytes, AsBytes); -} - -safety_comment! { - /// SAFETY: - /// For all `T`, `PhantomData` has size 0 and alignment 1. [1] - /// - `FromZeroes`, `FromBytes`: There is only one possible sequence of 0 - /// bytes, and `PhantomData` is inhabited. - /// - `AsBytes`: Since `PhantomData` has size 0, it contains no padding - /// bytes. - /// - `Unaligned`: Per the preceding reference, `PhantomData` has alignment - /// 1. - /// - /// [1] https://doc.rust-lang.org/std/marker/struct.PhantomData.html#layout-1 - unsafe_impl!(T: ?Sized => FromZeroes for PhantomData); - unsafe_impl!(T: ?Sized => FromBytes for PhantomData); - unsafe_impl!(T: ?Sized => AsBytes for PhantomData); - unsafe_impl!(T: ?Sized => Unaligned for PhantomData); - assert_unaligned!(PhantomData<()>, PhantomData, PhantomData); -} -safety_comment! { - /// SAFETY: - /// `Wrapping` is guaranteed by its docs [1] to have the same layout as - /// `T`. Also, `Wrapping` is `#[repr(transparent)]`, and has a single - /// field, which is `pub`. Per the reference [2], this means that the - /// `#[repr(transparent)]` attribute is "considered part of the public ABI". - /// - /// [1] https://doc.rust-lang.org/nightly/core/num/struct.Wrapping.html#layout-1 - /// [2] https://doc.rust-lang.org/nomicon/other-reprs.html#reprtransparent - unsafe_impl!(T: FromZeroes => FromZeroes for Wrapping); - unsafe_impl!(T: FromBytes => FromBytes for Wrapping); - unsafe_impl!(T: AsBytes => AsBytes for Wrapping); - unsafe_impl!(T: Unaligned => Unaligned for Wrapping); - assert_unaligned!(Wrapping<()>, Wrapping); -} -safety_comment! { - // `MaybeUninit` is `FromZeroes` and `FromBytes`, but never `AsBytes` - // since it may contain uninitialized bytes. - // - /// SAFETY: - /// - `FromZeroes`, `FromBytes`: `MaybeUninit` has no restrictions on its - /// contents. Unfortunately, in addition to bit validity, `FromZeroes` and - /// `FromBytes` also require that implementers contain no `UnsafeCell`s. - /// Thus, we require `T: FromZeroes` and `T: FromBytes` in order to ensure - /// that `T` - and thus `MaybeUninit` - contains to `UnsafeCell`s. - /// Thus, requiring that `T` implement each of these traits is sufficient - /// - `Unaligned`: `MaybeUninit` is guaranteed by its documentation [1] - /// to have the same alignment as `T`. - /// - /// [1] - /// https://doc.rust-lang.org/nightly/core/mem/union.MaybeUninit.html#layout-1 - /// - /// TODO(https://github.com/google/zerocopy/issues/251): If we split - /// `FromBytes` and `RefFromBytes`, or if we introduce a separate - /// `NoCell`/`Freeze` trait, we can relax the trait bounds for `FromZeroes` - /// and `FromBytes`. - unsafe_impl!(T: FromZeroes => FromZeroes for MaybeUninit); - unsafe_impl!(T: FromBytes => FromBytes for MaybeUninit); - unsafe_impl!(T: Unaligned => Unaligned for MaybeUninit); - assert_unaligned!(MaybeUninit<()>, MaybeUninit); -} -safety_comment! { - /// SAFETY: - /// `ManuallyDrop` has the same layout and bit validity as `T` [1], and - /// accessing the inner value is safe (meaning that it's unsound to leave - /// the inner value uninitialized while exposing the `ManuallyDrop` to safe - /// code). - /// - `FromZeroes`, `FromBytes`: Since it has the same layout as `T`, any - /// valid `T` is a valid `ManuallyDrop`. If `T: FromZeroes`, a sequence - /// of zero bytes is a valid `T`, and thus a valid `ManuallyDrop`. If - /// `T: FromBytes`, any sequence of bytes is a valid `T`, and thus a valid - /// `ManuallyDrop`. - /// - `AsBytes`: Since it has the same layout as `T`, and since it's unsound - /// to let safe code access a `ManuallyDrop` whose inner value is - /// uninitialized, safe code can only ever access a `ManuallyDrop` whose - /// contents are a valid `T`. Since `T: AsBytes`, this means that safe - /// code can only ever access a `ManuallyDrop` with all initialized bytes. - /// - `Unaligned`: `ManuallyDrop` has the same layout (and thus alignment) - /// as `T`, and `T: Unaligned` guarantees that that alignment is 1. - /// - /// [1] Per https://doc.rust-lang.org/nightly/core/mem/struct.ManuallyDrop.html: - /// - /// `ManuallyDrop` is guaranteed to have the same layout and bit - /// validity as `T` - /// - /// TODO(#429): Once this text (added in - /// https://github.com/rust-lang/rust/pull/115522) is available on stable, - /// quote the stable docs instead of the nightly docs. - unsafe_impl!(T: ?Sized + FromZeroes => FromZeroes for ManuallyDrop); - unsafe_impl!(T: ?Sized + FromBytes => FromBytes for ManuallyDrop); - unsafe_impl!(T: ?Sized + AsBytes => AsBytes for ManuallyDrop); - unsafe_impl!(T: ?Sized + Unaligned => Unaligned for ManuallyDrop); - assert_unaligned!(ManuallyDrop<()>, ManuallyDrop); -} -safety_comment! { - /// SAFETY: - /// Per the reference [1]: - /// - /// An array of `[T; N]` has a size of `size_of::() * N` and the same - /// alignment of `T`. Arrays are laid out so that the zero-based `nth` - /// element of the array is offset from the start of the array by `n * - /// size_of::()` bytes. - /// - /// ... - /// - /// Slices have the same layout as the section of the array they slice. - /// - /// In other words, the layout of a `[T]` or `[T; N]` is a sequence of `T`s - /// laid out back-to-back with no bytes in between. Therefore, `[T]` or `[T; - /// N]` are `FromZeroes`, `FromBytes`, and `AsBytes` if `T` is - /// (respectively). Furthermore, since an array/slice has "the same - /// alignment of `T`", `[T]` and `[T; N]` are `Unaligned` if `T` is. - /// - /// Note that we don't `assert_unaligned!` for slice types because - /// `assert_unaligned!` uses `align_of`, which only works for `Sized` types. - /// - /// [1] https://doc.rust-lang.org/reference/type-layout.html#array-layout - unsafe_impl!(const N: usize, T: FromZeroes => FromZeroes for [T; N]); - unsafe_impl!(const N: usize, T: FromBytes => FromBytes for [T; N]); - unsafe_impl!(const N: usize, T: AsBytes => AsBytes for [T; N]); - unsafe_impl!(const N: usize, T: Unaligned => Unaligned for [T; N]); - assert_unaligned!([(); 0], [(); 1], [u8; 0], [u8; 1]); - unsafe_impl!(T: FromZeroes => FromZeroes for [T]); - unsafe_impl!(T: FromBytes => FromBytes for [T]); - unsafe_impl!(T: AsBytes => AsBytes for [T]); - unsafe_impl!(T: Unaligned => Unaligned for [T]); -} - -// SIMD support -// -// Per the Unsafe Code Guidelines Reference [1]: -// -// Packed SIMD vector types are `repr(simd)` homogeneous tuple-structs -// containing `N` elements of type `T` where `N` is a power-of-two and the -// size and alignment requirements of `T` are equal: -// -// ```rust -// #[repr(simd)] -// struct Vector(T_0, ..., T_(N - 1)); -// ``` -// -// ... -// -// The size of `Vector` is `N * size_of::()` and its alignment is an -// implementation-defined function of `T` and `N` greater than or equal to -// `align_of::()`. -// -// ... -// -// Vector elements are laid out in source field order, enabling random access -// to vector elements by reinterpreting the vector as an array: -// -// ```rust -// union U { -// vec: Vector, -// arr: [T; N] -// } -// -// assert_eq!(size_of::>(), size_of::<[T; N]>()); -// assert!(align_of::>() >= align_of::<[T; N]>()); -// -// unsafe { -// let u = U { vec: Vector(t_0, ..., t_(N - 1)) }; -// -// assert_eq!(u.vec.0, u.arr[0]); -// // ... -// assert_eq!(u.vec.(N - 1), u.arr[N - 1]); -// } -// ``` -// -// Given this background, we can observe that: -// - The size and bit pattern requirements of a SIMD type are equivalent to the -// equivalent array type. Thus, for any SIMD type whose primitive `T` is -// `FromZeroes`, `FromBytes`, or `AsBytes`, that SIMD type is also -// `FromZeroes`, `FromBytes`, or `AsBytes` respectively. -// - Since no upper bound is placed on the alignment, no SIMD type can be -// guaranteed to be `Unaligned`. -// -// Also per [1]: -// -// This chapter represents the consensus from issue #38. The statements in -// here are not (yet) "guaranteed" not to change until an RFC ratifies them. -// -// See issue #38 [2]. While this behavior is not technically guaranteed, the -// likelihood that the behavior will change such that SIMD types are no longer -// `FromZeroes`, `FromBytes`, or `AsBytes` is next to zero, as that would defeat -// the entire purpose of SIMD types. Nonetheless, we put this behavior behind -// the `simd` Cargo feature, which requires consumers to opt into this stability -// hazard. -// -// [1] https://rust-lang.github.io/unsafe-code-guidelines/layout/packed-simd-vectors.html -// [2] https://github.com/rust-lang/unsafe-code-guidelines/issues/38 -#[cfg(feature = "simd")] -mod simd { - /// Defines a module which implements `FromZeroes`, `FromBytes`, and - /// `AsBytes` for a set of types from a module in `core::arch`. - /// - /// `$arch` is both the name of the defined module and the name of the - /// module in `core::arch`, and `$typ` is the list of items from that module - /// to implement `FromZeroes`, `FromBytes`, and `AsBytes` for. - #[allow(unused_macros)] // `allow(unused_macros)` is needed because some - // target/feature combinations don't emit any impls - // and thus don't use this macro. - macro_rules! simd_arch_mod { - ($arch:ident, $mod:ident, $($typ:ident),*) => { - mod $mod { - use core::arch::$arch::{$($typ),*}; - - use crate::*; - impl_known_layout!($($typ),*); - safety_comment! { - /// SAFETY: - /// See comment on module definition for justification. - $( unsafe_impl!($typ: FromZeroes, FromBytes, AsBytes); )* - } - } - }; - } - - #[cfg(target_arch = "x86")] - simd_arch_mod!(x86, x86, __m128, __m128d, __m128i, __m256, __m256d, __m256i); - #[cfg(all(feature = "simd-nightly", target_arch = "x86"))] - simd_arch_mod!(x86, x86_nightly, __m512bh, __m512, __m512d, __m512i); - #[cfg(target_arch = "x86_64")] - simd_arch_mod!(x86_64, x86_64, __m128, __m128d, __m128i, __m256, __m256d, __m256i); - #[cfg(all(feature = "simd-nightly", target_arch = "x86_64"))] - simd_arch_mod!(x86_64, x86_64_nightly, __m512bh, __m512, __m512d, __m512i); - #[cfg(target_arch = "wasm32")] - simd_arch_mod!(wasm32, wasm32, v128); - #[cfg(all(feature = "simd-nightly", target_arch = "powerpc"))] - simd_arch_mod!( - powerpc, - powerpc, - vector_bool_long, - vector_double, - vector_signed_long, - vector_unsigned_long - ); - #[cfg(all(feature = "simd-nightly", target_arch = "powerpc64"))] - simd_arch_mod!( - powerpc64, - powerpc64, - vector_bool_long, - vector_double, - vector_signed_long, - vector_unsigned_long - ); - #[cfg(target_arch = "aarch64")] - #[rustfmt::skip] - simd_arch_mod!( - aarch64, aarch64, float32x2_t, float32x4_t, float64x1_t, float64x2_t, int8x8_t, int8x8x2_t, - int8x8x3_t, int8x8x4_t, int8x16_t, int8x16x2_t, int8x16x3_t, int8x16x4_t, int16x4_t, - int16x8_t, int32x2_t, int32x4_t, int64x1_t, int64x2_t, poly8x8_t, poly8x8x2_t, poly8x8x3_t, - poly8x8x4_t, poly8x16_t, poly8x16x2_t, poly8x16x3_t, poly8x16x4_t, poly16x4_t, poly16x8_t, - poly64x1_t, poly64x2_t, uint8x8_t, uint8x8x2_t, uint8x8x3_t, uint8x8x4_t, uint8x16_t, - uint8x16x2_t, uint8x16x3_t, uint8x16x4_t, uint16x4_t, uint16x8_t, uint32x2_t, uint32x4_t, - uint64x1_t, uint64x2_t - ); - #[cfg(all(feature = "simd-nightly", target_arch = "arm"))] - #[rustfmt::skip] - simd_arch_mod!(arm, arm, int8x4_t, uint8x4_t); -} - -/// Safely transmutes a value of one type to a value of another type of the same -/// size. -/// -/// The expression `$e` must have a concrete type, `T`, which implements -/// `AsBytes`. The `transmute!` expression must also have a concrete type, `U` -/// (`U` is inferred from the calling context), and `U` must implement -/// `FromBytes`. -/// -/// Note that the `T` produced by the expression `$e` will *not* be dropped. -/// Semantically, its bits will be copied into a new value of type `U`, the -/// original `T` will be forgotten, and the value of type `U` will be returned. -#[macro_export] -macro_rules! transmute { - ($e:expr) => {{ - // NOTE: This must be a macro (rather than a function with trait bounds) - // because there's no way, in a generic context, to enforce that two - // types have the same size. `core::mem::transmute` uses compiler magic - // to enforce this so long as the types are concrete. - - let e = $e; - if false { - // This branch, though never taken, ensures that the type of `e` is - // `AsBytes` and that the type of this macro invocation expression - // is `FromBytes`. - - struct AssertIsAsBytes(T); - let _ = AssertIsAsBytes(e); - - struct AssertIsFromBytes(U); - #[allow(unused, unreachable_code)] - let u = AssertIsFromBytes(loop {}); - u.0 - } else { - // SAFETY: `core::mem::transmute` ensures that the type of `e` and - // the type of this macro invocation expression have the same size. - // We know this transmute is safe thanks to the `AsBytes` and - // `FromBytes` bounds enforced by the `false` branch. - // - // We use this reexport of `core::mem::transmute` because we know it - // will always be available for crates which are using the 2015 - // edition of Rust. By contrast, if we were to use - // `std::mem::transmute`, this macro would not work for such crates - // in `no_std` contexts, and if we were to use - // `core::mem::transmute`, this macro would not work in `std` - // contexts in which `core` was not manually imported. This is not a - // problem for 2018 edition crates. - unsafe { - // Clippy: It's okay to transmute a type to itself. - #[allow(clippy::useless_transmute)] - $crate::macro_util::core_reexport::mem::transmute(e) - } - } - }} -} - -/// Safely transmutes a mutable or immutable reference of one type to an -/// immutable reference of another type of the same size. -/// -/// The expression `$e` must have a concrete type, `&T` or `&mut T`, where `T: -/// Sized + AsBytes`. The `transmute_ref!` expression must also have a concrete -/// type, `&U` (`U` is inferred from the calling context), where `U: Sized + -/// FromBytes`. It must be the case that `align_of::() >= align_of::()`. -/// -/// The lifetime of the input type, `&T` or `&mut T`, must be the same as or -/// outlive the lifetime of the output type, `&U`. -/// -/// # Alignment increase error message -/// -/// Because of limitations on macros, the error message generated when -/// `transmute_ref!` is used to transmute from a type of lower alignment to a -/// type of higher alignment is somewhat confusing. For example, the following -/// code: -/// -/// ```compile_fail -/// const INCREASE_ALIGNMENT: &u16 = zerocopy::transmute_ref!(&[0u8; 2]); -/// ``` -/// -/// ...generates the following error: -/// -/// ```text -/// error[E0512]: cannot transmute between types of different sizes, or dependently-sized types -/// --> src/lib.rs:1524:34 -/// | -/// 5 | const INCREASE_ALIGNMENT: &u16 = zerocopy::transmute_ref!(&[0u8; 2]); -/// | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -/// | -/// = note: source type: `AlignOf<[u8; 2]>` (8 bits) -/// = note: target type: `MaxAlignsOf<[u8; 2], u16>` (16 bits) -/// = note: this error originates in the macro `$crate::assert_align_gt_eq` which comes from the expansion of the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) -/// ``` -/// -/// This is saying that `max(align_of::(), align_of::()) != -/// align_of::()`, which is equivalent to `align_of::() < -/// align_of::()`. -#[macro_export] -macro_rules! transmute_ref { - ($e:expr) => {{ - // NOTE: This must be a macro (rather than a function with trait bounds) - // because there's no way, in a generic context, to enforce that two - // types have the same size or alignment. - - // Ensure that the source type is a reference or a mutable reference - // (note that mutable references are implicitly reborrowed here). - let e: &_ = $e; - - #[allow(unused, clippy::diverging_sub_expression)] - if false { - // This branch, though never taken, ensures that the type of `e` is - // `&T` where `T: 't + Sized + AsBytes`, that the type of this macro - // expression is `&U` where `U: 'u + Sized + FromBytes`, and that - // `'t` outlives `'u`. - - struct AssertIsAsBytes<'a, T: ::core::marker::Sized + $crate::AsBytes>(&'a T); - let _ = AssertIsAsBytes(e); - - struct AssertIsFromBytes<'a, U: ::core::marker::Sized + $crate::FromBytes>(&'a U); - #[allow(unused, unreachable_code)] - let u = AssertIsFromBytes(loop {}); - u.0 - } else if false { - // This branch, though never taken, ensures that `size_of::() == - // size_of::()` and that that `align_of::() >= - // align_of::()`. - - // `t` is inferred to have type `T` because it's assigned to `e` (of - // type `&T`) as `&t`. - let mut t = unreachable!(); - e = &t; - - // `u` is inferred to have type `U` because it's used as `&u` as the - // value returned from this branch. - let u; - - $crate::assert_size_eq!(t, u); - $crate::assert_align_gt_eq!(t, u); - - &u - } else { - // SAFETY: For source type `Src` and destination type `Dst`: - // - We know that `Src: AsBytes` and `Dst: FromBytes` thanks to the - // uses of `AssertIsAsBytes` and `AssertIsFromBytes` above. - // - We know that `size_of::() == size_of::()` thanks to - // the use of `assert_size_eq!` above. - // - We know that `align_of::() >= align_of::()` thanks to - // the use of `assert_align_gt_eq!` above. - unsafe { $crate::macro_util::transmute_ref(e) } - } - }} -} - -/// Safely transmutes a mutable reference of one type to an mutable reference of -/// another type of the same size. -/// -/// The expression `$e` must have a concrete type, `&mut T`, where `T: Sized + -/// AsBytes`. The `transmute_mut!` expression must also have a concrete type, -/// `&mut U` (`U` is inferred from the calling context), where `U: Sized + -/// FromBytes`. It must be the case that `align_of::() >= align_of::()`. -/// -/// The lifetime of the input type, `&mut T`, must be the same as or outlive the -/// lifetime of the output type, `&mut U`. -/// -/// # Alignment increase error message -/// -/// Because of limitations on macros, the error message generated when -/// `transmute_mut!` is used to transmute from a type of lower alignment to a -/// type of higher alignment is somewhat confusing. For example, the following -/// code: -/// -/// ```compile_fail -/// const INCREASE_ALIGNMENT: &mut u16 = zerocopy::transmute_mut!(&mut [0u8; 2]); -/// ``` -/// -/// ...generates the following error: -/// -/// ```text -/// error[E0512]: cannot transmute between types of different sizes, or dependently-sized types -/// --> src/lib.rs:1524:34 -/// | -/// 5 | const INCREASE_ALIGNMENT: &mut u16 = zerocopy::transmute_mut!(&mut [0u8; 2]); -/// | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -/// | -/// = note: source type: `AlignOf<[u8; 2]>` (8 bits) -/// = note: target type: `MaxAlignsOf<[u8; 2], u16>` (16 bits) -/// = note: this error originates in the macro `$crate::assert_align_gt_eq` which comes from the expansion of the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) -/// ``` -/// -/// This is saying that `max(align_of::(), align_of::()) != -/// align_of::()`, which is equivalent to `align_of::() < -/// align_of::()`. -#[macro_export] -macro_rules! transmute_mut { - ($e:expr) => {{ - // NOTE: This must be a macro (rather than a function with trait bounds) - // because there's no way, in a generic context, to enforce that two - // types have the same size or alignment. - - // Ensure that the source type is a mutable reference. - let e: &mut _ = $e; - - #[allow(unused, clippy::diverging_sub_expression)] - if false { - // This branch, though never taken, ensures that the type of `e` is - // `&mut T` where `T: 't + Sized + FromBytes + AsBytes`, that the - // type of this macro expression is `&mut U` where `U: 'u + Sized + - // FromBytes + AsBytes`. - - // We use immutable references here rather than mutable so that, if - // this macro is used in a const context (in which, as of this - // writing, mutable references are banned), the error message - // appears to originate in the user's code rather than in the - // internals of this macro. - struct AssertSrcIsFromBytes<'a, T: ::core::marker::Sized + $crate::FromBytes>(&'a T); - struct AssertSrcIsAsBytes<'a, T: ::core::marker::Sized + $crate::AsBytes>(&'a T); - struct AssertDstIsFromBytes<'a, T: ::core::marker::Sized + $crate::FromBytes>(&'a T); - struct AssertDstIsAsBytes<'a, T: ::core::marker::Sized + $crate::AsBytes>(&'a T); - - if true { - let _ = AssertSrcIsFromBytes(&*e); - } else { - let _ = AssertSrcIsAsBytes(&*e); - } - - if true { - #[allow(unused, unreachable_code)] - let u = AssertDstIsFromBytes(loop {}); - &mut *u.0 - } else { - #[allow(unused, unreachable_code)] - let u = AssertDstIsAsBytes(loop {}); - &mut *u.0 - } - } else if false { - // This branch, though never taken, ensures that `size_of::() == - // size_of::()` and that that `align_of::() >= - // align_of::()`. - - // `t` is inferred to have type `T` because it's assigned to `e` (of - // type `&mut T`) as `&mut t`. - let mut t = unreachable!(); - e = &mut t; - - // `u` is inferred to have type `U` because it's used as `&mut u` as - // the value returned from this branch. - let u; - - $crate::assert_size_eq!(t, u); - $crate::assert_align_gt_eq!(t, u); - - &mut u - } else { - // SAFETY: For source type `Src` and destination type `Dst`: - // - We know that `Src: FromBytes + AsBytes` and `Dst: FromBytes + - // AsBytes` thanks to the uses of `AssertSrcIsFromBytes`, - // `AssertSrcIsAsBytes`, `AssertDstIsFromBytes`, and - // `AssertDstIsAsBytes` above. - // - We know that `size_of::() == size_of::()` thanks to - // the use of `assert_size_eq!` above. - // - We know that `align_of::() >= align_of::()` thanks to - // the use of `assert_align_gt_eq!` above. - unsafe { $crate::macro_util::transmute_mut(e) } - } - }} -} - -/// Includes a file and safely transmutes it to a value of an arbitrary type. -/// -/// The file will be included as a byte array, `[u8; N]`, which will be -/// transmuted to another type, `T`. `T` is inferred from the calling context, -/// and must implement [`FromBytes`]. -/// -/// The file is located relative to the current file (similarly to how modules -/// are found). The provided path is interpreted in a platform-specific way at -/// compile time. So, for instance, an invocation with a Windows path containing -/// backslashes `\` would not compile correctly on Unix. -/// -/// `include_bytes!` is ignorant of byte order. For byte order-aware types, see -/// the [`byteorder`] module. -/// -/// # Examples -/// -/// Assume there are two files in the same directory with the following -/// contents: -/// -/// File `data` (no trailing newline): -/// -/// ```text -/// abcd -/// ``` -/// -/// File `main.rs`: -/// -/// ```rust -/// use zerocopy::include_value; -/// # macro_rules! include_value { -/// # ($file:expr) => { zerocopy::include_value!(concat!("../testdata/include_value/", $file)) }; -/// # } -/// -/// fn main() { -/// let as_u32: u32 = include_value!("data"); -/// assert_eq!(as_u32, u32::from_ne_bytes([b'a', b'b', b'c', b'd'])); -/// let as_i32: i32 = include_value!("data"); -/// assert_eq!(as_i32, i32::from_ne_bytes([b'a', b'b', b'c', b'd'])); -/// } -/// ``` -#[doc(alias("include_bytes", "include_data", "include_type"))] -#[macro_export] -macro_rules! include_value { - ($file:expr $(,)?) => { - $crate::transmute!(*::core::include_bytes!($file)) - }; -} - -/// A typed reference derived from a byte slice. -/// -/// A `Ref` is a reference to a `T` which is stored in a byte slice, `B`. -/// Unlike a native reference (`&T` or `&mut T`), `Ref` has the same -/// mutability as the byte slice it was constructed from (`B`). -/// -/// # Examples -/// -/// `Ref` can be used to treat a sequence of bytes as a structured type, and to -/// read and write the fields of that type as if the byte slice reference were -/// simply a reference to that type. -/// -/// ```rust -/// # #[cfg(feature = "derive")] { // This example uses derives, and won't compile without them -/// use zerocopy::{AsBytes, ByteSlice, ByteSliceMut, FromBytes, FromZeroes, Ref, Unaligned}; -/// -/// #[derive(FromZeroes, FromBytes, AsBytes, Unaligned)] -/// #[repr(C)] -/// struct UdpHeader { -/// src_port: [u8; 2], -/// dst_port: [u8; 2], -/// length: [u8; 2], -/// checksum: [u8; 2], -/// } -/// -/// struct UdpPacket { -/// header: Ref, -/// body: B, -/// } -/// -/// impl UdpPacket { -/// pub fn parse(bytes: B) -> Option> { -/// let (header, body) = Ref::new_unaligned_from_prefix(bytes)?; -/// Some(UdpPacket { header, body }) -/// } -/// -/// pub fn get_src_port(&self) -> [u8; 2] { -/// self.header.src_port -/// } -/// } -/// -/// impl UdpPacket { -/// pub fn set_src_port(&mut self, src_port: [u8; 2]) { -/// self.header.src_port = src_port; -/// } -/// } -/// # } -/// ``` -pub struct Ref(B, PhantomData); - -/// Deprecated: prefer [`Ref`] instead. -#[deprecated(since = "0.7.0", note = "LayoutVerified has been renamed to Ref")] -#[doc(hidden)] -pub type LayoutVerified = Ref; - -impl Ref -where - B: ByteSlice, -{ - /// Constructs a new `Ref`. - /// - /// `new` verifies that `bytes.len() == size_of::()` and that `bytes` is - /// aligned to `align_of::()`, and constructs a new `Ref`. If either of - /// these checks fail, it returns `None`. - #[inline] - pub fn new(bytes: B) -> Option> { - if bytes.len() != mem::size_of::() || !util::aligned_to::<_, T>(bytes.deref()) { - return None; - } - Some(Ref(bytes, PhantomData)) - } - - /// Constructs a new `Ref` from the prefix of a byte slice. - /// - /// `new_from_prefix` verifies that `bytes.len() >= size_of::()` and that - /// `bytes` is aligned to `align_of::()`. It consumes the first - /// `size_of::()` bytes from `bytes` to construct a `Ref`, and returns - /// the remaining bytes to the caller. If either the length or alignment - /// checks fail, it returns `None`. - #[inline] - pub fn new_from_prefix(bytes: B) -> Option<(Ref, B)> { - if bytes.len() < mem::size_of::() || !util::aligned_to::<_, T>(bytes.deref()) { - return None; - } - let (bytes, suffix) = bytes.split_at(mem::size_of::()); - Some((Ref(bytes, PhantomData), suffix)) - } - - /// Constructs a new `Ref` from the suffix of a byte slice. - /// - /// `new_from_suffix` verifies that `bytes.len() >= size_of::()` and that - /// the last `size_of::()` bytes of `bytes` are aligned to - /// `align_of::()`. It consumes the last `size_of::()` bytes from - /// `bytes` to construct a `Ref`, and returns the preceding bytes to the - /// caller. If either the length or alignment checks fail, it returns - /// `None`. - #[inline] - pub fn new_from_suffix(bytes: B) -> Option<(B, Ref)> { - let bytes_len = bytes.len(); - let split_at = bytes_len.checked_sub(mem::size_of::())?; - let (prefix, bytes) = bytes.split_at(split_at); - if !util::aligned_to::<_, T>(bytes.deref()) { - return None; - } - Some((prefix, Ref(bytes, PhantomData))) - } -} - -impl Ref -where - B: ByteSlice, -{ - /// Constructs a new `Ref` of a slice type. - /// - /// `new_slice` verifies that `bytes.len()` is a multiple of - /// `size_of::()` and that `bytes` is aligned to `align_of::()`, and - /// constructs a new `Ref`. If either of these checks fail, it returns - /// `None`. - /// - /// # Panics - /// - /// `new_slice` panics if `T` is a zero-sized type. - #[inline] - pub fn new_slice(bytes: B) -> Option> { - let remainder = bytes - .len() - .checked_rem(mem::size_of::()) - .expect("Ref::new_slice called on a zero-sized type"); - if remainder != 0 || !util::aligned_to::<_, T>(bytes.deref()) { - return None; - } - Some(Ref(bytes, PhantomData)) - } - - /// Constructs a new `Ref` of a slice type from the prefix of a byte slice. - /// - /// `new_slice_from_prefix` verifies that `bytes.len() >= size_of::() * - /// count` and that `bytes` is aligned to `align_of::()`. It consumes the - /// first `size_of::() * count` bytes from `bytes` to construct a `Ref`, - /// and returns the remaining bytes to the caller. It also ensures that - /// `sizeof::() * count` does not overflow a `usize`. If any of the - /// length, alignment, or overflow checks fail, it returns `None`. - /// - /// # Panics - /// - /// `new_slice_from_prefix` panics if `T` is a zero-sized type. - #[inline] - pub fn new_slice_from_prefix(bytes: B, count: usize) -> Option<(Ref, B)> { - let expected_len = match mem::size_of::().checked_mul(count) { - Some(len) => len, - None => return None, - }; - if bytes.len() < expected_len { - return None; - } - let (prefix, bytes) = bytes.split_at(expected_len); - Self::new_slice(prefix).map(move |l| (l, bytes)) - } - - /// Constructs a new `Ref` of a slice type from the suffix of a byte slice. - /// - /// `new_slice_from_suffix` verifies that `bytes.len() >= size_of::() * - /// count` and that `bytes` is aligned to `align_of::()`. It consumes the - /// last `size_of::() * count` bytes from `bytes` to construct a `Ref`, - /// and returns the preceding bytes to the caller. It also ensures that - /// `sizeof::() * count` does not overflow a `usize`. If any of the - /// length, alignment, or overflow checks fail, it returns `None`. - /// - /// # Panics - /// - /// `new_slice_from_suffix` panics if `T` is a zero-sized type. - #[inline] - pub fn new_slice_from_suffix(bytes: B, count: usize) -> Option<(B, Ref)> { - let expected_len = match mem::size_of::().checked_mul(count) { - Some(len) => len, - None => return None, - }; - let split_at = bytes.len().checked_sub(expected_len)?; - let (bytes, suffix) = bytes.split_at(split_at); - Self::new_slice(suffix).map(move |l| (bytes, l)) - } -} - -fn map_zeroed(opt: Option>) -> Option> { - match opt { - Some(mut r) => { - r.0.fill(0); - Some(r) - } - None => None, - } -} - -fn map_prefix_tuple_zeroed( - opt: Option<(Ref, B)>, -) -> Option<(Ref, B)> { - match opt { - Some((mut r, rest)) => { - r.0.fill(0); - Some((r, rest)) - } - None => None, - } -} - -fn map_suffix_tuple_zeroed( - opt: Option<(B, Ref)>, -) -> Option<(B, Ref)> { - map_prefix_tuple_zeroed(opt.map(|(a, b)| (b, a))).map(|(a, b)| (b, a)) -} - -impl Ref -where - B: ByteSliceMut, -{ - /// Constructs a new `Ref` after zeroing the bytes. - /// - /// `new_zeroed` verifies that `bytes.len() == size_of::()` and that - /// `bytes` is aligned to `align_of::()`, and constructs a new `Ref`. If - /// either of these checks fail, it returns `None`. - /// - /// If the checks succeed, then `bytes` will be initialized to zero. This - /// can be useful when re-using buffers to ensure that sensitive data - /// previously stored in the buffer is not leaked. - #[inline(always)] - pub fn new_zeroed(bytes: B) -> Option> { - map_zeroed(Self::new(bytes)) - } - - /// Constructs a new `Ref` from the prefix of a byte slice, zeroing the - /// prefix. - /// - /// `new_from_prefix_zeroed` verifies that `bytes.len() >= size_of::()` - /// and that `bytes` is aligned to `align_of::()`. It consumes the first - /// `size_of::()` bytes from `bytes` to construct a `Ref`, and returns - /// the remaining bytes to the caller. If either the length or alignment - /// checks fail, it returns `None`. - /// - /// If the checks succeed, then the prefix which is consumed will be - /// initialized to zero. This can be useful when re-using buffers to ensure - /// that sensitive data previously stored in the buffer is not leaked. - #[inline(always)] - pub fn new_from_prefix_zeroed(bytes: B) -> Option<(Ref, B)> { - map_prefix_tuple_zeroed(Self::new_from_prefix(bytes)) - } - - /// Constructs a new `Ref` from the suffix of a byte slice, zeroing the - /// suffix. - /// - /// `new_from_suffix_zeroed` verifies that `bytes.len() >= size_of::()` - /// and that the last `size_of::()` bytes of `bytes` are aligned to - /// `align_of::()`. It consumes the last `size_of::()` bytes from - /// `bytes` to construct a `Ref`, and returns the preceding bytes to the - /// caller. If either the length or alignment checks fail, it returns - /// `None`. - /// - /// If the checks succeed, then the suffix which is consumed will be - /// initialized to zero. This can be useful when re-using buffers to ensure - /// that sensitive data previously stored in the buffer is not leaked. - #[inline(always)] - pub fn new_from_suffix_zeroed(bytes: B) -> Option<(B, Ref)> { - map_suffix_tuple_zeroed(Self::new_from_suffix(bytes)) - } -} - -impl Ref -where - B: ByteSliceMut, -{ - /// Constructs a new `Ref` of a slice type after zeroing the bytes. - /// - /// `new_slice_zeroed` verifies that `bytes.len()` is a multiple of - /// `size_of::()` and that `bytes` is aligned to `align_of::()`, and - /// constructs a new `Ref`. If either of these checks fail, it returns - /// `None`. - /// - /// If the checks succeed, then `bytes` will be initialized to zero. This - /// can be useful when re-using buffers to ensure that sensitive data - /// previously stored in the buffer is not leaked. - /// - /// # Panics - /// - /// `new_slice` panics if `T` is a zero-sized type. - #[inline(always)] - pub fn new_slice_zeroed(bytes: B) -> Option> { - map_zeroed(Self::new_slice(bytes)) - } - - /// Constructs a new `Ref` of a slice type from the prefix of a byte slice, - /// after zeroing the bytes. - /// - /// `new_slice_from_prefix` verifies that `bytes.len() >= size_of::() * - /// count` and that `bytes` is aligned to `align_of::()`. It consumes the - /// first `size_of::() * count` bytes from `bytes` to construct a `Ref`, - /// and returns the remaining bytes to the caller. It also ensures that - /// `sizeof::() * count` does not overflow a `usize`. If any of the - /// length, alignment, or overflow checks fail, it returns `None`. - /// - /// If the checks succeed, then the suffix which is consumed will be - /// initialized to zero. This can be useful when re-using buffers to ensure - /// that sensitive data previously stored in the buffer is not leaked. - /// - /// # Panics - /// - /// `new_slice_from_prefix_zeroed` panics if `T` is a zero-sized type. - #[inline(always)] - pub fn new_slice_from_prefix_zeroed(bytes: B, count: usize) -> Option<(Ref, B)> { - map_prefix_tuple_zeroed(Self::new_slice_from_prefix(bytes, count)) - } - - /// Constructs a new `Ref` of a slice type from the prefix of a byte slice, - /// after zeroing the bytes. - /// - /// `new_slice_from_suffix` verifies that `bytes.len() >= size_of::() * - /// count` and that `bytes` is aligned to `align_of::()`. It consumes the - /// last `size_of::() * count` bytes from `bytes` to construct a `Ref`, - /// and returns the preceding bytes to the caller. It also ensures that - /// `sizeof::() * count` does not overflow a `usize`. If any of the - /// length, alignment, or overflow checks fail, it returns `None`. - /// - /// If the checks succeed, then the consumed suffix will be initialized to - /// zero. This can be useful when re-using buffers to ensure that sensitive - /// data previously stored in the buffer is not leaked. - /// - /// # Panics - /// - /// `new_slice_from_suffix_zeroed` panics if `T` is a zero-sized type. - #[inline(always)] - pub fn new_slice_from_suffix_zeroed(bytes: B, count: usize) -> Option<(B, Ref)> { - map_suffix_tuple_zeroed(Self::new_slice_from_suffix(bytes, count)) - } -} - -impl Ref -where - B: ByteSlice, - T: Unaligned, -{ - /// Constructs a new `Ref` for a type with no alignment requirement. - /// - /// `new_unaligned` verifies that `bytes.len() == size_of::()` and - /// constructs a new `Ref`. If the check fails, it returns `None`. - #[inline(always)] - pub fn new_unaligned(bytes: B) -> Option> { - Ref::new(bytes) - } - - /// Constructs a new `Ref` from the prefix of a byte slice for a type with - /// no alignment requirement. - /// - /// `new_unaligned_from_prefix` verifies that `bytes.len() >= - /// size_of::()`. It consumes the first `size_of::()` bytes from - /// `bytes` to construct a `Ref`, and returns the remaining bytes to the - /// caller. If the length check fails, it returns `None`. - #[inline(always)] - pub fn new_unaligned_from_prefix(bytes: B) -> Option<(Ref, B)> { - Ref::new_from_prefix(bytes) - } - - /// Constructs a new `Ref` from the suffix of a byte slice for a type with - /// no alignment requirement. - /// - /// `new_unaligned_from_suffix` verifies that `bytes.len() >= - /// size_of::()`. It consumes the last `size_of::()` bytes from - /// `bytes` to construct a `Ref`, and returns the preceding bytes to the - /// caller. If the length check fails, it returns `None`. - #[inline(always)] - pub fn new_unaligned_from_suffix(bytes: B) -> Option<(B, Ref)> { - Ref::new_from_suffix(bytes) - } -} - -impl Ref -where - B: ByteSlice, - T: Unaligned, -{ - /// Constructs a new `Ref` of a slice type with no alignment requirement. - /// - /// `new_slice_unaligned` verifies that `bytes.len()` is a multiple of - /// `size_of::()` and constructs a new `Ref`. If the check fails, it - /// returns `None`. - /// - /// # Panics - /// - /// `new_slice` panics if `T` is a zero-sized type. - #[inline(always)] - pub fn new_slice_unaligned(bytes: B) -> Option> { - Ref::new_slice(bytes) - } - - /// Constructs a new `Ref` of a slice type with no alignment requirement - /// from the prefix of a byte slice. - /// - /// `new_slice_from_prefix` verifies that `bytes.len() >= size_of::() * - /// count`. It consumes the first `size_of::() * count` bytes from - /// `bytes` to construct a `Ref`, and returns the remaining bytes to the - /// caller. It also ensures that `sizeof::() * count` does not overflow a - /// `usize`. If either the length, or overflow checks fail, it returns - /// `None`. - /// - /// # Panics - /// - /// `new_slice_unaligned_from_prefix` panics if `T` is a zero-sized type. - #[inline(always)] - pub fn new_slice_unaligned_from_prefix(bytes: B, count: usize) -> Option<(Ref, B)> { - Ref::new_slice_from_prefix(bytes, count) - } - - /// Constructs a new `Ref` of a slice type with no alignment requirement - /// from the suffix of a byte slice. - /// - /// `new_slice_from_suffix` verifies that `bytes.len() >= size_of::() * - /// count`. It consumes the last `size_of::() * count` bytes from `bytes` - /// to construct a `Ref`, and returns the remaining bytes to the caller. It - /// also ensures that `sizeof::() * count` does not overflow a `usize`. - /// If either the length, or overflow checks fail, it returns `None`. - /// - /// # Panics - /// - /// `new_slice_unaligned_from_suffix` panics if `T` is a zero-sized type. - #[inline(always)] - pub fn new_slice_unaligned_from_suffix(bytes: B, count: usize) -> Option<(B, Ref)> { - Ref::new_slice_from_suffix(bytes, count) - } -} - -impl Ref -where - B: ByteSliceMut, - T: Unaligned, -{ - /// Constructs a new `Ref` for a type with no alignment requirement, zeroing - /// the bytes. - /// - /// `new_unaligned_zeroed` verifies that `bytes.len() == size_of::()` and - /// constructs a new `Ref`. If the check fails, it returns `None`. - /// - /// If the check succeeds, then `bytes` will be initialized to zero. This - /// can be useful when re-using buffers to ensure that sensitive data - /// previously stored in the buffer is not leaked. - #[inline(always)] - pub fn new_unaligned_zeroed(bytes: B) -> Option> { - map_zeroed(Self::new_unaligned(bytes)) - } - - /// Constructs a new `Ref` from the prefix of a byte slice for a type with - /// no alignment requirement, zeroing the prefix. - /// - /// `new_unaligned_from_prefix_zeroed` verifies that `bytes.len() >= - /// size_of::()`. It consumes the first `size_of::()` bytes from - /// `bytes` to construct a `Ref`, and returns the remaining bytes to the - /// caller. If the length check fails, it returns `None`. - /// - /// If the check succeeds, then the prefix which is consumed will be - /// initialized to zero. This can be useful when re-using buffers to ensure - /// that sensitive data previously stored in the buffer is not leaked. - #[inline(always)] - pub fn new_unaligned_from_prefix_zeroed(bytes: B) -> Option<(Ref, B)> { - map_prefix_tuple_zeroed(Self::new_unaligned_from_prefix(bytes)) - } - - /// Constructs a new `Ref` from the suffix of a byte slice for a type with - /// no alignment requirement, zeroing the suffix. - /// - /// `new_unaligned_from_suffix_zeroed` verifies that `bytes.len() >= - /// size_of::()`. It consumes the last `size_of::()` bytes from - /// `bytes` to construct a `Ref`, and returns the preceding bytes to the - /// caller. If the length check fails, it returns `None`. - /// - /// If the check succeeds, then the suffix which is consumed will be - /// initialized to zero. This can be useful when re-using buffers to ensure - /// that sensitive data previously stored in the buffer is not leaked. - #[inline(always)] - pub fn new_unaligned_from_suffix_zeroed(bytes: B) -> Option<(B, Ref)> { - map_suffix_tuple_zeroed(Self::new_unaligned_from_suffix(bytes)) - } -} - -impl Ref -where - B: ByteSliceMut, - T: Unaligned, -{ - /// Constructs a new `Ref` for a slice type with no alignment requirement, - /// zeroing the bytes. - /// - /// `new_slice_unaligned_zeroed` verifies that `bytes.len()` is a multiple - /// of `size_of::()` and constructs a new `Ref`. If the check fails, it - /// returns `None`. - /// - /// If the check succeeds, then `bytes` will be initialized to zero. This - /// can be useful when re-using buffers to ensure that sensitive data - /// previously stored in the buffer is not leaked. - /// - /// # Panics - /// - /// `new_slice` panics if `T` is a zero-sized type. - #[inline(always)] - pub fn new_slice_unaligned_zeroed(bytes: B) -> Option> { - map_zeroed(Self::new_slice_unaligned(bytes)) - } - - /// Constructs a new `Ref` of a slice type with no alignment requirement - /// from the prefix of a byte slice, after zeroing the bytes. - /// - /// `new_slice_from_prefix` verifies that `bytes.len() >= size_of::() * - /// count`. It consumes the first `size_of::() * count` bytes from - /// `bytes` to construct a `Ref`, and returns the remaining bytes to the - /// caller. It also ensures that `sizeof::() * count` does not overflow a - /// `usize`. If either the length, or overflow checks fail, it returns - /// `None`. - /// - /// If the checks succeed, then the prefix will be initialized to zero. This - /// can be useful when re-using buffers to ensure that sensitive data - /// previously stored in the buffer is not leaked. - /// - /// # Panics - /// - /// `new_slice_unaligned_from_prefix_zeroed` panics if `T` is a zero-sized - /// type. - #[inline(always)] - pub fn new_slice_unaligned_from_prefix_zeroed( - bytes: B, - count: usize, - ) -> Option<(Ref, B)> { - map_prefix_tuple_zeroed(Self::new_slice_unaligned_from_prefix(bytes, count)) - } - - /// Constructs a new `Ref` of a slice type with no alignment requirement - /// from the suffix of a byte slice, after zeroing the bytes. - /// - /// `new_slice_from_suffix` verifies that `bytes.len() >= size_of::() * - /// count`. It consumes the last `size_of::() * count` bytes from `bytes` - /// to construct a `Ref`, and returns the remaining bytes to the caller. It - /// also ensures that `sizeof::() * count` does not overflow a `usize`. - /// If either the length, or overflow checks fail, it returns `None`. - /// - /// If the checks succeed, then the suffix will be initialized to zero. This - /// can be useful when re-using buffers to ensure that sensitive data - /// previously stored in the buffer is not leaked. - /// - /// # Panics - /// - /// `new_slice_unaligned_from_suffix_zeroed` panics if `T` is a zero-sized - /// type. - #[inline(always)] - pub fn new_slice_unaligned_from_suffix_zeroed( - bytes: B, - count: usize, - ) -> Option<(B, Ref)> { - map_suffix_tuple_zeroed(Self::new_slice_unaligned_from_suffix(bytes, count)) - } -} - -impl<'a, B, T> Ref -where - B: 'a + ByteSlice, - T: FromBytes, -{ - /// Converts this `Ref` into a reference. - /// - /// `into_ref` consumes the `Ref`, and returns a reference to `T`. - #[inline(always)] - pub fn into_ref(self) -> &'a T { - // SAFETY: This is sound because `B` is guaranteed to live for the - // lifetime `'a`, meaning that a) the returned reference cannot outlive - // the `B` from which `self` was constructed and, b) no mutable methods - // on that `B` can be called during the lifetime of the returned - // reference. See the documentation on `deref_helper` for what - // invariants we are required to uphold. - unsafe { self.deref_helper() } - } -} - -impl<'a, B, T> Ref -where - B: 'a + ByteSliceMut, - T: FromBytes + AsBytes, -{ - /// Converts this `Ref` into a mutable reference. - /// - /// `into_mut` consumes the `Ref`, and returns a mutable reference to `T`. - #[inline(always)] - pub fn into_mut(mut self) -> &'a mut T { - // SAFETY: This is sound because `B` is guaranteed to live for the - // lifetime `'a`, meaning that a) the returned reference cannot outlive - // the `B` from which `self` was constructed and, b) no other methods - - // mutable or immutable - on that `B` can be called during the lifetime - // of the returned reference. See the documentation on - // `deref_mut_helper` for what invariants we are required to uphold. - unsafe { self.deref_mut_helper() } - } -} - -impl<'a, B, T> Ref -where - B: 'a + ByteSlice, - T: FromBytes, -{ - /// Converts this `Ref` into a slice reference. - /// - /// `into_slice` consumes the `Ref`, and returns a reference to `[T]`. - #[inline(always)] - pub fn into_slice(self) -> &'a [T] { - // SAFETY: This is sound because `B` is guaranteed to live for the - // lifetime `'a`, meaning that a) the returned reference cannot outlive - // the `B` from which `self` was constructed and, b) no mutable methods - // on that `B` can be called during the lifetime of the returned - // reference. See the documentation on `deref_slice_helper` for what - // invariants we are required to uphold. - unsafe { self.deref_slice_helper() } - } -} - -impl<'a, B, T> Ref -where - B: 'a + ByteSliceMut, - T: FromBytes + AsBytes, -{ - /// Converts this `Ref` into a mutable slice reference. - /// - /// `into_mut_slice` consumes the `Ref`, and returns a mutable reference to - /// `[T]`. - #[inline(always)] - pub fn into_mut_slice(mut self) -> &'a mut [T] { - // SAFETY: This is sound because `B` is guaranteed to live for the - // lifetime `'a`, meaning that a) the returned reference cannot outlive - // the `B` from which `self` was constructed and, b) no other methods - - // mutable or immutable - on that `B` can be called during the lifetime - // of the returned reference. See the documentation on - // `deref_mut_slice_helper` for what invariants we are required to - // uphold. - unsafe { self.deref_mut_slice_helper() } - } -} - -impl Ref -where - B: ByteSlice, - T: FromBytes, -{ - /// Creates an immutable reference to `T` with a specific lifetime. - /// - /// # Safety - /// - /// The type bounds on this method guarantee that it is safe to create an - /// immutable reference to `T` from `self`. However, since the lifetime `'a` - /// is not required to be shorter than the lifetime of the reference to - /// `self`, the caller must guarantee that the lifetime `'a` is valid for - /// this reference. In particular, the referent must exist for all of `'a`, - /// and no mutable references to the same memory may be constructed during - /// `'a`. - unsafe fn deref_helper<'a>(&self) -> &'a T { - // TODO(#429): Add a "SAFETY" comment and remove this `allow`. - #[allow(clippy::undocumented_unsafe_blocks)] - unsafe { - &*self.0.as_ptr().cast::() - } - } -} - -impl Ref -where - B: ByteSliceMut, - T: FromBytes + AsBytes, -{ - /// Creates a mutable reference to `T` with a specific lifetime. - /// - /// # Safety - /// - /// The type bounds on this method guarantee that it is safe to create a - /// mutable reference to `T` from `self`. However, since the lifetime `'a` - /// is not required to be shorter than the lifetime of the reference to - /// `self`, the caller must guarantee that the lifetime `'a` is valid for - /// this reference. In particular, the referent must exist for all of `'a`, - /// and no other references - mutable or immutable - to the same memory may - /// be constructed during `'a`. - unsafe fn deref_mut_helper<'a>(&mut self) -> &'a mut T { - // TODO(#429): Add a "SAFETY" comment and remove this `allow`. - #[allow(clippy::undocumented_unsafe_blocks)] - unsafe { - &mut *self.0.as_mut_ptr().cast::() - } - } -} - -impl Ref -where - B: ByteSlice, - T: FromBytes, -{ - /// Creates an immutable reference to `[T]` with a specific lifetime. - /// - /// # Safety - /// - /// `deref_slice_helper` has the same safety requirements as `deref_helper`. - unsafe fn deref_slice_helper<'a>(&self) -> &'a [T] { - let len = self.0.len(); - let elem_size = mem::size_of::(); - debug_assert_ne!(elem_size, 0); - // `Ref<_, [T]>` maintains the invariant that `size_of::() > 0`. - // Thus, neither the mod nor division operations here can panic. - #[allow(clippy::arithmetic_side_effects)] - let elems = { - debug_assert_eq!(len % elem_size, 0); - len / elem_size - }; - // TODO(#429): Add a "SAFETY" comment and remove this `allow`. - #[allow(clippy::undocumented_unsafe_blocks)] - unsafe { - slice::from_raw_parts(self.0.as_ptr().cast::(), elems) - } - } -} - -impl Ref -where - B: ByteSliceMut, - T: FromBytes + AsBytes, -{ - /// Creates a mutable reference to `[T]` with a specific lifetime. - /// - /// # Safety - /// - /// `deref_mut_slice_helper` has the same safety requirements as - /// `deref_mut_helper`. - unsafe fn deref_mut_slice_helper<'a>(&mut self) -> &'a mut [T] { - let len = self.0.len(); - let elem_size = mem::size_of::(); - debug_assert_ne!(elem_size, 0); - // `Ref<_, [T]>` maintains the invariant that `size_of::() > 0`. - // Thus, neither the mod nor division operations here can panic. - #[allow(clippy::arithmetic_side_effects)] - let elems = { - debug_assert_eq!(len % elem_size, 0); - len / elem_size - }; - // TODO(#429): Add a "SAFETY" comment and remove this `allow`. - #[allow(clippy::undocumented_unsafe_blocks)] - unsafe { - slice::from_raw_parts_mut(self.0.as_mut_ptr().cast::(), elems) - } - } -} - -impl Ref -where - B: ByteSlice, - T: ?Sized, -{ - /// Gets the underlying bytes. - #[inline] - pub fn bytes(&self) -> &[u8] { - &self.0 - } -} - -impl Ref -where - B: ByteSliceMut, - T: ?Sized, -{ - /// Gets the underlying bytes mutably. - #[inline] - pub fn bytes_mut(&mut self) -> &mut [u8] { - &mut self.0 - } -} - -impl Ref -where - B: ByteSlice, - T: FromBytes, -{ - /// Reads a copy of `T`. - #[inline] - pub fn read(&self) -> T { - // SAFETY: Because of the invariants on `Ref`, we know that `self.0` is - // at least `size_of::()` bytes long, and that it is at least as - // aligned as `align_of::()`. Because `T: FromBytes`, it is sound to - // interpret these bytes as a `T`. - unsafe { ptr::read(self.0.as_ptr().cast::()) } - } -} - -impl Ref -where - B: ByteSliceMut, - T: AsBytes, -{ - /// Writes the bytes of `t` and then forgets `t`. - #[inline] - pub fn write(&mut self, t: T) { - // SAFETY: Because of the invariants on `Ref`, we know that `self.0` is - // at least `size_of::()` bytes long, and that it is at least as - // aligned as `align_of::()`. Writing `t` to the buffer will allow - // all of the bytes of `t` to be accessed as a `[u8]`, but because `T: - // AsBytes`, we know this is sound. - unsafe { ptr::write(self.0.as_mut_ptr().cast::(), t) } - } -} - -impl Deref for Ref -where - B: ByteSlice, - T: FromBytes, -{ - type Target = T; - #[inline] - fn deref(&self) -> &T { - // SAFETY: This is sound because the lifetime of `self` is the same as - // the lifetime of the return value, meaning that a) the returned - // reference cannot outlive `self` and, b) no mutable methods on `self` - // can be called during the lifetime of the returned reference. See the - // documentation on `deref_helper` for what invariants we are required - // to uphold. - unsafe { self.deref_helper() } - } -} - -impl DerefMut for Ref -where - B: ByteSliceMut, - T: FromBytes + AsBytes, -{ - #[inline] - fn deref_mut(&mut self) -> &mut T { - // SAFETY: This is sound because the lifetime of `self` is the same as - // the lifetime of the return value, meaning that a) the returned - // reference cannot outlive `self` and, b) no other methods on `self` - // can be called during the lifetime of the returned reference. See the - // documentation on `deref_mut_helper` for what invariants we are - // required to uphold. - unsafe { self.deref_mut_helper() } - } -} - -impl Deref for Ref -where - B: ByteSlice, - T: FromBytes, -{ - type Target = [T]; - #[inline] - fn deref(&self) -> &[T] { - // SAFETY: This is sound because the lifetime of `self` is the same as - // the lifetime of the return value, meaning that a) the returned - // reference cannot outlive `self` and, b) no mutable methods on `self` - // can be called during the lifetime of the returned reference. See the - // documentation on `deref_slice_helper` for what invariants we are - // required to uphold. - unsafe { self.deref_slice_helper() } - } -} - -impl DerefMut for Ref -where - B: ByteSliceMut, - T: FromBytes + AsBytes, -{ - #[inline] - fn deref_mut(&mut self) -> &mut [T] { - // SAFETY: This is sound because the lifetime of `self` is the same as - // the lifetime of the return value, meaning that a) the returned - // reference cannot outlive `self` and, b) no other methods on `self` - // can be called during the lifetime of the returned reference. See the - // documentation on `deref_mut_slice_helper` for what invariants we are - // required to uphold. - unsafe { self.deref_mut_slice_helper() } - } -} - -impl Display for Ref -where - B: ByteSlice, - T: FromBytes + Display, -{ - #[inline] - fn fmt(&self, fmt: &mut Formatter<'_>) -> fmt::Result { - let inner: &T = self; - inner.fmt(fmt) - } -} - -impl Display for Ref -where - B: ByteSlice, - T: FromBytes, - [T]: Display, -{ - #[inline] - fn fmt(&self, fmt: &mut Formatter<'_>) -> fmt::Result { - let inner: &[T] = self; - inner.fmt(fmt) - } -} - -impl Debug for Ref -where - B: ByteSlice, - T: FromBytes + Debug, -{ - #[inline] - fn fmt(&self, fmt: &mut Formatter<'_>) -> fmt::Result { - let inner: &T = self; - fmt.debug_tuple("Ref").field(&inner).finish() - } -} - -impl Debug for Ref -where - B: ByteSlice, - T: FromBytes + Debug, -{ - #[inline] - fn fmt(&self, fmt: &mut Formatter<'_>) -> fmt::Result { - let inner: &[T] = self; - fmt.debug_tuple("Ref").field(&inner).finish() - } -} - -impl Eq for Ref -where - B: ByteSlice, - T: FromBytes + Eq, -{ -} - -impl Eq for Ref -where - B: ByteSlice, - T: FromBytes + Eq, -{ -} - -impl PartialEq for Ref -where - B: ByteSlice, - T: FromBytes + PartialEq, -{ - #[inline] - fn eq(&self, other: &Self) -> bool { - self.deref().eq(other.deref()) - } -} - -impl PartialEq for Ref -where - B: ByteSlice, - T: FromBytes + PartialEq, -{ - #[inline] - fn eq(&self, other: &Self) -> bool { - self.deref().eq(other.deref()) - } -} - -impl Ord for Ref -where - B: ByteSlice, - T: FromBytes + Ord, -{ - #[inline] - fn cmp(&self, other: &Self) -> Ordering { - let inner: &T = self; - let other_inner: &T = other; - inner.cmp(other_inner) - } -} - -impl Ord for Ref -where - B: ByteSlice, - T: FromBytes + Ord, -{ - #[inline] - fn cmp(&self, other: &Self) -> Ordering { - let inner: &[T] = self; - let other_inner: &[T] = other; - inner.cmp(other_inner) - } -} - -impl PartialOrd for Ref -where - B: ByteSlice, - T: FromBytes + PartialOrd, -{ - #[inline] - fn partial_cmp(&self, other: &Self) -> Option { - let inner: &T = self; - let other_inner: &T = other; - inner.partial_cmp(other_inner) - } -} - -impl PartialOrd for Ref -where - B: ByteSlice, - T: FromBytes + PartialOrd, -{ - #[inline] - fn partial_cmp(&self, other: &Self) -> Option { - let inner: &[T] = self; - let other_inner: &[T] = other; - inner.partial_cmp(other_inner) - } -} - -mod sealed { - pub trait ByteSliceSealed {} -} - -// ByteSlice and ByteSliceMut abstract over [u8] references (&[u8], &mut [u8], -// Ref<[u8]>, RefMut<[u8]>, etc). We rely on various behaviors of these -// references such as that a given reference will never changes its length -// between calls to deref() or deref_mut(), and that split_at() works as -// expected. If ByteSlice or ByteSliceMut were not sealed, consumers could -// implement them in a way that violated these behaviors, and would break our -// unsafe code. Thus, we seal them and implement it only for known-good -// reference types. For the same reason, they're unsafe traits. - -#[allow(clippy::missing_safety_doc)] // TODO(fxbug.dev/99068) -/// A mutable or immutable reference to a byte slice. -/// -/// `ByteSlice` abstracts over the mutability of a byte slice reference, and is -/// implemented for various special reference types such as `Ref<[u8]>` and -/// `RefMut<[u8]>`. -/// -/// Note that, while it would be technically possible, `ByteSlice` is not -/// implemented for [`Vec`], as the only way to implement the [`split_at`] -/// method would involve reallocation, and `split_at` must be a very cheap -/// operation in order for the utilities in this crate to perform as designed. -/// -/// [`split_at`]: crate::ByteSlice::split_at -// It may seem overkill to go to this length to ensure that this doc link never -// breaks. We do this because it simplifies CI - it means that generating docs -// always succeeds, so we don't need special logic to only generate docs under -// certain features. -#[cfg_attr(feature = "alloc", doc = "[`Vec`]: alloc::vec::Vec")] -#[cfg_attr( - not(feature = "alloc"), - doc = "[`Vec`]: https://doc.rust-lang.org/std/vec/struct.Vec.html" -)] -pub unsafe trait ByteSlice: - Deref + Sized + self::sealed::ByteSliceSealed -{ - /// Gets a raw pointer to the first byte in the slice. - #[inline] - fn as_ptr(&self) -> *const u8 { - <[u8]>::as_ptr(self) - } - - /// Splits the slice at the midpoint. - /// - /// `x.split_at(mid)` returns `x[..mid]` and `x[mid..]`. - /// - /// # Panics - /// - /// `x.split_at(mid)` panics if `mid > x.len()`. - fn split_at(self, mid: usize) -> (Self, Self); -} - -#[allow(clippy::missing_safety_doc)] // TODO(fxbug.dev/99068) -/// A mutable reference to a byte slice. -/// -/// `ByteSliceMut` abstracts over various ways of storing a mutable reference to -/// a byte slice, and is implemented for various special reference types such as -/// `RefMut<[u8]>`. -pub unsafe trait ByteSliceMut: ByteSlice + DerefMut { - /// Gets a mutable raw pointer to the first byte in the slice. - #[inline] - fn as_mut_ptr(&mut self) -> *mut u8 { - <[u8]>::as_mut_ptr(self) - } -} - -impl<'a> sealed::ByteSliceSealed for &'a [u8] {} -// TODO(#429): Add a "SAFETY" comment and remove this `allow`. -#[allow(clippy::undocumented_unsafe_blocks)] -unsafe impl<'a> ByteSlice for &'a [u8] { - #[inline] - fn split_at(self, mid: usize) -> (Self, Self) { - <[u8]>::split_at(self, mid) - } -} - -impl<'a> sealed::ByteSliceSealed for &'a mut [u8] {} -// TODO(#429): Add a "SAFETY" comment and remove this `allow`. -#[allow(clippy::undocumented_unsafe_blocks)] -unsafe impl<'a> ByteSlice for &'a mut [u8] { - #[inline] - fn split_at(self, mid: usize) -> (Self, Self) { - <[u8]>::split_at_mut(self, mid) - } -} - -impl<'a> sealed::ByteSliceSealed for cell::Ref<'a, [u8]> {} -// TODO(#429): Add a "SAFETY" comment and remove this `allow`. -#[allow(clippy::undocumented_unsafe_blocks)] -unsafe impl<'a> ByteSlice for cell::Ref<'a, [u8]> { - #[inline] - fn split_at(self, mid: usize) -> (Self, Self) { - cell::Ref::map_split(self, |slice| <[u8]>::split_at(slice, mid)) - } -} - -impl<'a> sealed::ByteSliceSealed for RefMut<'a, [u8]> {} -// TODO(#429): Add a "SAFETY" comment and remove this `allow`. -#[allow(clippy::undocumented_unsafe_blocks)] -unsafe impl<'a> ByteSlice for RefMut<'a, [u8]> { - #[inline] - fn split_at(self, mid: usize) -> (Self, Self) { - RefMut::map_split(self, |slice| <[u8]>::split_at_mut(slice, mid)) - } -} - -// TODO(#429): Add a "SAFETY" comment and remove this `allow`. -#[allow(clippy::undocumented_unsafe_blocks)] -unsafe impl<'a> ByteSliceMut for &'a mut [u8] {} - -// TODO(#429): Add a "SAFETY" comment and remove this `allow`. -#[allow(clippy::undocumented_unsafe_blocks)] -unsafe impl<'a> ByteSliceMut for RefMut<'a, [u8]> {} - -#[cfg(feature = "alloc")] -mod alloc_support { - use alloc::vec::Vec; - - use super::*; - - /// Extends a `Vec` by pushing `additional` new items onto the end of the - /// vector. The new items are initialized with zeroes. - /// - /// # Panics - /// - /// Panics if `Vec::reserve(additional)` fails to reserve enough memory. - #[inline(always)] - pub fn extend_vec_zeroed(v: &mut Vec, additional: usize) { - insert_vec_zeroed(v, v.len(), additional); - } - - /// Inserts `additional` new items into `Vec` at `position`. - /// The new items are initialized with zeroes. - /// - /// # Panics - /// - /// * Panics if `position > v.len()`. - /// * Panics if `Vec::reserve(additional)` fails to reserve enough memory. - #[inline] - pub fn insert_vec_zeroed(v: &mut Vec, position: usize, additional: usize) { - assert!(position <= v.len()); - v.reserve(additional); - // SAFETY: The `reserve` call guarantees that these cannot overflow: - // * `ptr.add(position)` - // * `position + additional` - // * `v.len() + additional` - // - // `v.len() - position` cannot overflow because we asserted that - // `position <= v.len()`. - unsafe { - // This is a potentially overlapping copy. - let ptr = v.as_mut_ptr(); - #[allow(clippy::arithmetic_side_effects)] - ptr.add(position).copy_to(ptr.add(position + additional), v.len() - position); - ptr.add(position).write_bytes(0, additional); - #[allow(clippy::arithmetic_side_effects)] - v.set_len(v.len() + additional); - } - } - - #[cfg(test)] - mod tests { - use core::convert::TryFrom as _; - - use super::*; - - #[test] - fn test_extend_vec_zeroed() { - // Test extending when there is an existing allocation. - let mut v = vec![100u64, 200, 300]; - extend_vec_zeroed(&mut v, 3); - assert_eq!(v.len(), 6); - assert_eq!(&*v, &[100, 200, 300, 0, 0, 0]); - drop(v); - - // Test extending when there is no existing allocation. - let mut v: Vec = Vec::new(); - extend_vec_zeroed(&mut v, 3); - assert_eq!(v.len(), 3); - assert_eq!(&*v, &[0, 0, 0]); - drop(v); - } - - #[test] - fn test_extend_vec_zeroed_zst() { - // Test extending when there is an existing (fake) allocation. - let mut v = vec![(), (), ()]; - extend_vec_zeroed(&mut v, 3); - assert_eq!(v.len(), 6); - assert_eq!(&*v, &[(), (), (), (), (), ()]); - drop(v); - - // Test extending when there is no existing (fake) allocation. - let mut v: Vec<()> = Vec::new(); - extend_vec_zeroed(&mut v, 3); - assert_eq!(&*v, &[(), (), ()]); - drop(v); - } - - #[test] - fn test_insert_vec_zeroed() { - // Insert at start (no existing allocation). - let mut v: Vec = Vec::new(); - insert_vec_zeroed(&mut v, 0, 2); - assert_eq!(v.len(), 2); - assert_eq!(&*v, &[0, 0]); - drop(v); - - // Insert at start. - let mut v = vec![100u64, 200, 300]; - insert_vec_zeroed(&mut v, 0, 2); - assert_eq!(v.len(), 5); - assert_eq!(&*v, &[0, 0, 100, 200, 300]); - drop(v); - - // Insert at middle. - let mut v = vec![100u64, 200, 300]; - insert_vec_zeroed(&mut v, 1, 1); - assert_eq!(v.len(), 4); - assert_eq!(&*v, &[100, 0, 200, 300]); - drop(v); - - // Insert at end. - let mut v = vec![100u64, 200, 300]; - insert_vec_zeroed(&mut v, 3, 1); - assert_eq!(v.len(), 4); - assert_eq!(&*v, &[100, 200, 300, 0]); - drop(v); - } - - #[test] - fn test_insert_vec_zeroed_zst() { - // Insert at start (no existing fake allocation). - let mut v: Vec<()> = Vec::new(); - insert_vec_zeroed(&mut v, 0, 2); - assert_eq!(v.len(), 2); - assert_eq!(&*v, &[(), ()]); - drop(v); - - // Insert at start. - let mut v = vec![(), (), ()]; - insert_vec_zeroed(&mut v, 0, 2); - assert_eq!(v.len(), 5); - assert_eq!(&*v, &[(), (), (), (), ()]); - drop(v); - - // Insert at middle. - let mut v = vec![(), (), ()]; - insert_vec_zeroed(&mut v, 1, 1); - assert_eq!(v.len(), 4); - assert_eq!(&*v, &[(), (), (), ()]); - drop(v); - - // Insert at end. - let mut v = vec![(), (), ()]; - insert_vec_zeroed(&mut v, 3, 1); - assert_eq!(v.len(), 4); - assert_eq!(&*v, &[(), (), (), ()]); - drop(v); - } - - #[test] - fn test_new_box_zeroed() { - assert_eq!(*u64::new_box_zeroed(), 0); - } - - #[test] - fn test_new_box_zeroed_array() { - drop(<[u32; 0x1000]>::new_box_zeroed()); - } - - #[test] - fn test_new_box_zeroed_zst() { - // This test exists in order to exercise unsafe code, especially - // when running under Miri. - #[allow(clippy::unit_cmp)] - { - assert_eq!(*<()>::new_box_zeroed(), ()); - } - } - - #[test] - fn test_new_box_slice_zeroed() { - let mut s: Box<[u64]> = u64::new_box_slice_zeroed(3); - assert_eq!(s.len(), 3); - assert_eq!(&*s, &[0, 0, 0]); - s[1] = 3; - assert_eq!(&*s, &[0, 3, 0]); - } - - #[test] - fn test_new_box_slice_zeroed_empty() { - let s: Box<[u64]> = u64::new_box_slice_zeroed(0); - assert_eq!(s.len(), 0); - } - - #[test] - fn test_new_box_slice_zeroed_zst() { - let mut s: Box<[()]> = <()>::new_box_slice_zeroed(3); - assert_eq!(s.len(), 3); - assert!(s.get(10).is_none()); - // This test exists in order to exercise unsafe code, especially - // when running under Miri. - #[allow(clippy::unit_cmp)] - { - assert_eq!(s[1], ()); - } - s[2] = (); - } - - #[test] - fn test_new_box_slice_zeroed_zst_empty() { - let s: Box<[()]> = <()>::new_box_slice_zeroed(0); - assert_eq!(s.len(), 0); - } - - #[test] - #[should_panic(expected = "mem::size_of::() * len overflows `usize`")] - fn test_new_box_slice_zeroed_panics_mul_overflow() { - let _ = u16::new_box_slice_zeroed(usize::MAX); - } - - #[test] - #[should_panic(expected = "assertion failed: size <= max_alloc")] - fn test_new_box_slice_zeroed_panics_isize_overflow() { - let max = usize::try_from(isize::MAX).unwrap(); - let _ = u16::new_box_slice_zeroed((max / mem::size_of::()) + 1); - } - } -} - -#[cfg(feature = "alloc")] -#[doc(inline)] -pub use alloc_support::*; - -#[cfg(test)] -mod tests { - #![allow(clippy::unreadable_literal)] - - use core::{convert::TryInto as _, ops::Deref}; - - use static_assertions::assert_impl_all; - - use super::*; - use crate::util::testutil::*; - - // An unsized type. - // - // This is used to test the custom derives of our traits. The `[u8]` type - // gets a hand-rolled impl, so it doesn't exercise our custom derives. - #[derive(Debug, Eq, PartialEq, FromZeroes, FromBytes, AsBytes, Unaligned)] - #[repr(transparent)] - struct Unsized([u8]); - - impl Unsized { - fn from_mut_slice(slc: &mut [u8]) -> &mut Unsized { - // SAFETY: This *probably* sound - since the layouts of `[u8]` and - // `Unsized` are the same, so are the layouts of `&mut [u8]` and - // `&mut Unsized`. [1] Even if it turns out that this isn't actually - // guaranteed by the language spec, we can just change this since - // it's in test code. - // - // [1] https://github.com/rust-lang/unsafe-code-guidelines/issues/375 - unsafe { mem::transmute(slc) } - } - } - - // This test takes a long time when running under Miri, so we skip it in - // that case. This is acceptable because this is a logic test that doesn't - // attempt to expose UB. - #[test] - #[cfg_attr(miri, ignore)] - fn test_validate_cast_and_convert_metadata() { - impl From for SizeInfo { - fn from(_size: usize) -> SizeInfo { - SizeInfo::Sized { _size } - } - } - - impl From<(usize, usize)> for SizeInfo { - fn from((_offset, _elem_size): (usize, usize)) -> SizeInfo { - SizeInfo::SliceDst(TrailingSliceLayout { _offset, _elem_size }) - } - } - - fn layout>(s: S, align: usize) -> DstLayout { - DstLayout { _size_info: s.into(), _align: NonZeroUsize::new(align).unwrap() } - } - - /// This macro accepts arguments in the form of: - /// - /// layout(_, _, _).validate(_, _, _), Ok(Some((_, _))) - /// | | | | | | | | - /// base_size ----+ | | | | | | | - /// align -----------+ | | | | | | - /// trailing_size ------+ | | | | | - /// addr ---------------------------+ | | | | - /// bytes_len -------------------------+ | | | - /// cast_type ----------------------------+ | | - /// elems ---------------------------------------------+ | - /// split_at ---------------------------------------------+ - /// - /// `.validate` is shorthand for `.validate_cast_and_convert_metadata` - /// for brevity. - /// - /// Each argument can either be an iterator or a wildcard. Each - /// wildcarded variable is implicitly replaced by an iterator over a - /// representative sample of values for that variable. Each `test!` - /// invocation iterates over every combination of values provided by - /// each variable's iterator (ie, the cartesian product) and validates - /// that the results are expected. - /// - /// The final argument uses the same syntax, but it has a different - /// meaning: - /// - If it is `Ok(pat)`, then the pattern `pat` is supplied to - /// `assert_matches!` to validate the computed result for each - /// combination of input values. - /// - If it is `Err(msg)`, then `test!` validates that the call to - /// `validate_cast_and_convert_metadata` panics with the given panic - /// message. - /// - /// Note that the meta-variables that match these variables have the - /// `tt` type, and some valid expressions are not valid `tt`s (such as - /// `a..b`). In this case, wrap the expression in parentheses, and it - /// will become valid `tt`. - macro_rules! test { - ($(:$sizes:expr =>)? - layout($size:tt, $align:tt) - .validate($addr:tt, $bytes_len:tt, $cast_type:tt), $expect:pat $(,)? - ) => { - itertools::iproduct!( - test!(@generate_size $size), - test!(@generate_align $align), - test!(@generate_usize $addr), - test!(@generate_usize $bytes_len), - test!(@generate_cast_type $cast_type) - ).for_each(|(size_info, align, addr, bytes_len, cast_type)| { - // Temporarily disable the panic hook installed by the test - // harness. If we don't do this, all panic messages will be - // kept in an internal log. On its own, this isn't a - // problem, but if a non-caught panic ever happens (ie, in - // code later in this test not in this macro), all of the - // previously-buffered messages will be dumped, hiding the - // real culprit. - let previous_hook = std::panic::take_hook(); - // I don't understand why, but this seems to be required in - // addition to the previous line. - std::panic::set_hook(Box::new(|_| {})); - let actual = std::panic::catch_unwind(|| { - layout(size_info, align)._validate_cast_and_convert_metadata(addr, bytes_len, cast_type) - }).map_err(|d| { - *d.downcast::<&'static str>().expect("expected string panic message").as_ref() - }); - std::panic::set_hook(previous_hook); - - assert_matches::assert_matches!( - actual, $expect, - "layout({size_info:?}, {align}).validate_cast_and_convert_metadata({addr}, {bytes_len}, {cast_type:?})", - ); - }); - }; - (@generate_usize _) => { 0..8 }; - // Generate sizes for both Sized and !Sized types. - (@generate_size _) => { - test!(@generate_size (_)).chain(test!(@generate_size (_, _))) - }; - // Generate sizes for both Sized and !Sized types by chaining - // specified iterators for each. - (@generate_size ($sized_sizes:tt | $unsized_sizes:tt)) => { - test!(@generate_size ($sized_sizes)).chain(test!(@generate_size $unsized_sizes)) - }; - // Generate sizes for Sized types. - (@generate_size (_)) => { test!(@generate_size (0..8)) }; - (@generate_size ($sizes:expr)) => { $sizes.into_iter().map(Into::::into) }; - // Generate sizes for !Sized types. - (@generate_size ($min_sizes:tt, $elem_sizes:tt)) => { - itertools::iproduct!( - test!(@generate_min_size $min_sizes), - test!(@generate_elem_size $elem_sizes) - ).map(Into::::into) - }; - (@generate_fixed_size _) => { (0..8).into_iter().map(Into::::into) }; - (@generate_min_size _) => { 0..8 }; - (@generate_elem_size _) => { 1..8 }; - (@generate_align _) => { [1, 2, 4, 8, 16] }; - (@generate_opt_usize _) => { [None].into_iter().chain((0..8).map(Some).into_iter()) }; - (@generate_cast_type _) => { [_CastType::_Prefix, _CastType::_Suffix] }; - (@generate_cast_type $variant:ident) => { [_CastType::$variant] }; - // Some expressions need to be wrapped in parentheses in order to be - // valid `tt`s (required by the top match pattern). See the comment - // below for more details. This arm removes these parentheses to - // avoid generating an `unused_parens` warning. - (@$_:ident ($vals:expr)) => { $vals }; - (@$_:ident $vals:expr) => { $vals }; - } - - const EVENS: [usize; 8] = [0, 2, 4, 6, 8, 10, 12, 14]; - const ODDS: [usize; 8] = [1, 3, 5, 7, 9, 11, 13, 15]; - - // base_size is too big for the memory region. - test!(layout(((1..8) | ((1..8), (1..8))), _).validate(_, [0], _), Ok(None)); - test!(layout(((2..8) | ((2..8), (2..8))), _).validate(_, [1], _), Ok(None)); - - // addr is unaligned for prefix cast - test!(layout(_, [2]).validate(ODDS, _, _Prefix), Ok(None)); - test!(layout(_, [2]).validate(ODDS, _, _Prefix), Ok(None)); - - // addr is aligned, but end of buffer is unaligned for suffix cast - test!(layout(_, [2]).validate(EVENS, ODDS, _Suffix), Ok(None)); - test!(layout(_, [2]).validate(EVENS, ODDS, _Suffix), Ok(None)); - - // Unfortunately, these constants cannot easily be used in the - // implementation of `validate_cast_and_convert_metadata`, since - // `panic!` consumes a string literal, not an expression. - // - // It's important that these messages be in a separate module. If they - // were at the function's top level, we'd pass them to `test!` as, e.g., - // `Err(TRAILING)`, which would run into a subtle Rust footgun - the - // `TRAILING` identifier would be treated as a pattern to match rather - // than a value to check for equality. - mod msgs { - pub(super) const TRAILING: &str = - "attempted to cast to slice type with zero-sized element"; - pub(super) const OVERFLOW: &str = "`addr` + `bytes_len` > usize::MAX"; - } - - // casts with ZST trailing element types are unsupported - test!(layout((_, [0]), _).validate(_, _, _), Err(msgs::TRAILING),); - - // addr + bytes_len must not overflow usize - test!(layout(_, _).validate([usize::MAX], (1..100), _), Err(msgs::OVERFLOW)); - test!(layout(_, _).validate((1..100), [usize::MAX], _), Err(msgs::OVERFLOW)); - test!( - layout(_, _).validate( - [usize::MAX / 2 + 1, usize::MAX], - [usize::MAX / 2 + 1, usize::MAX], - _ - ), - Err(msgs::OVERFLOW) - ); - - // Validates that `validate_cast_and_convert_metadata` satisfies its own - // documented safety postconditions, and also a few other properties - // that aren't documented but we want to guarantee anyway. - fn validate_behavior( - (layout, addr, bytes_len, cast_type): (DstLayout, usize, usize, _CastType), - ) { - if let Some((elems, split_at)) = - layout._validate_cast_and_convert_metadata(addr, bytes_len, cast_type) - { - let (size_info, align) = (layout._size_info, layout._align); - let debug_str = format!( - "layout({size_info:?}, {align}).validate_cast_and_convert_metadata({addr}, {bytes_len}, {cast_type:?}) => ({elems}, {split_at})", - ); - - // If this is a sized type (no trailing slice), then `elems` is - // meaningless, but in practice we set it to 0. Callers are not - // allowed to rely on this, but a lot of math is nicer if - // they're able to, and some callers might accidentally do that. - let sized = matches!(layout._size_info, SizeInfo::Sized { .. }); - assert!(!(sized && elems != 0), "{}", debug_str); - - let resulting_size = match layout._size_info { - SizeInfo::Sized { _size } => _size, - SizeInfo::SliceDst(TrailingSliceLayout { - _offset: offset, - _elem_size: elem_size, - }) => { - let padded_size = |elems| { - let without_padding = offset + elems * elem_size; - without_padding - + util::core_layout::_padding_needed_for(without_padding, align) - }; - - let resulting_size = padded_size(elems); - // Test that `validate_cast_and_convert_metadata` - // computed the largest possible value that fits in the - // given range. - assert!(padded_size(elems + 1) > bytes_len, "{}", debug_str); - resulting_size - } - }; - - // Test safety postconditions guaranteed by - // `validate_cast_and_convert_metadata`. - assert!(resulting_size <= bytes_len, "{}", debug_str); - match cast_type { - _CastType::_Prefix => { - assert_eq!(addr % align, 0, "{}", debug_str); - assert_eq!(resulting_size, split_at, "{}", debug_str); - } - _CastType::_Suffix => { - assert_eq!(split_at, bytes_len - resulting_size, "{}", debug_str); - assert_eq!((addr + split_at) % align, 0, "{}", debug_str); - } - } - } else { - let min_size = match layout._size_info { - SizeInfo::Sized { _size } => _size, - SizeInfo::SliceDst(TrailingSliceLayout { _offset, .. }) => { - _offset + util::core_layout::_padding_needed_for(_offset, layout._align) - } - }; - - // If a cast is invalid, it is either because... - // 1. there are insufficent bytes at the given region for type: - let insufficient_bytes = bytes_len < min_size; - // 2. performing the cast would misalign type: - let base = match cast_type { - _CastType::_Prefix => 0, - _CastType::_Suffix => bytes_len, - }; - let misaligned = (base + addr) % layout._align != 0; - - assert!(insufficient_bytes || misaligned); - } - } - - let sizes = 0..8; - let elem_sizes = 1..8; - let size_infos = sizes - .clone() - .map(Into::::into) - .chain(itertools::iproduct!(sizes, elem_sizes).map(Into::::into)); - let layouts = itertools::iproduct!(size_infos, [1, 2, 4, 8, 16, 32]) - .filter(|(size_info, align)| !matches!(size_info, SizeInfo::Sized { _size } if _size % align != 0)) - .map(|(size_info, align)| layout(size_info, align)); - itertools::iproduct!(layouts, 0..8, 0..8, [_CastType::_Prefix, _CastType::_Suffix]) - .for_each(validate_behavior); - } - - #[test] - #[cfg(__INTERNAL_USE_ONLY_NIGHLTY_FEATURES_IN_TESTS)] - fn test_validate_rust_layout() { - use core::ptr::NonNull; - - // This test synthesizes pointers with various metadata and uses Rust's - // built-in APIs to confirm that Rust makes decisions about type layout - // which are consistent with what we believe is guaranteed by the - // language. If this test fails, it doesn't just mean our code is wrong - // - it means we're misunderstanding the language's guarantees. - - #[derive(Debug)] - struct MacroArgs { - offset: usize, - align: NonZeroUsize, - elem_size: Option, - } - - /// # Safety - /// - /// `test` promises to only call `addr_of_slice_field` on a `NonNull` - /// which points to a valid `T`. - /// - /// `with_elems` must produce a pointer which points to a valid `T`. - fn test NonNull>( - args: MacroArgs, - with_elems: W, - addr_of_slice_field: Option) -> NonNull>, - ) { - let dst = args.elem_size.is_some(); - let layout = { - let size_info = match args.elem_size { - Some(elem_size) => SizeInfo::SliceDst(TrailingSliceLayout { - _offset: args.offset, - _elem_size: elem_size, - }), - None => SizeInfo::Sized { - // Rust only supports types whose sizes are a multiple - // of their alignment. If the macro created a type like - // this: - // - // #[repr(C, align(2))] - // struct Foo([u8; 1]); - // - // ...then Rust will automatically round the type's size - // up to 2. - _size: args.offset - + util::core_layout::_padding_needed_for(args.offset, args.align), - }, - }; - DstLayout { _size_info: size_info, _align: args.align } - }; - - for elems in 0..128 { - let ptr = with_elems(elems); - - if let Some(addr_of_slice_field) = addr_of_slice_field { - let slc_field_ptr = addr_of_slice_field(ptr).as_ptr(); - // SAFETY: Both `slc_field_ptr` and `ptr` are pointers to - // the same valid Rust object. - let offset: usize = - unsafe { slc_field_ptr.byte_offset_from(ptr.as_ptr()).try_into().unwrap() }; - assert_eq!(offset, args.offset); - } - - // SAFETY: `ptr` points to a valid `T`. - let (size, align) = unsafe { - (mem::size_of_val_raw(ptr.as_ptr()), mem::align_of_val_raw(ptr.as_ptr())) - }; - - // Avoid expensive allocation when running under Miri. - let assert_msg = if !cfg!(miri) { - format!("\n{args:?}\nsize:{size}, align:{align}") - } else { - String::new() - }; - - let without_padding = - args.offset + args.elem_size.map(|elem_size| elems * elem_size).unwrap_or(0); - assert!(size >= without_padding, "{}", assert_msg); - assert_eq!(align, args.align.get(), "{}", assert_msg); - - // This encodes the most important part of the test: our - // understanding of how Rust determines the layout of repr(C) - // types. Sized repr(C) types are trivial, but DST types have - // some subtlety. Note that: - // - For sized types, `without_padding` is just the size of the - // type that we constructed for `Foo`. Since we may have - // requested a larger alignment, `Foo` may actually be larger - // than this, hence `padding_needed_for`. - // - For unsized types, `without_padding` is dynamically - // computed from the offset, the element size, and element - // count. We expect that the size of the object should be - // `offset + elem_size * elems` rounded up to the next - // alignment. - let expected_size = without_padding - + util::core_layout::_padding_needed_for(without_padding, args.align); - assert_eq!(expected_size, size, "{}", assert_msg); - - // For zero-sized element types, - // `validate_cast_and_convert_metadata` just panics, so we skip - // testing those types. - if args.elem_size.map(|elem_size| elem_size > 0).unwrap_or(true) { - let addr = ptr.addr().get(); - let (got_elems, got_split_at) = layout - ._validate_cast_and_convert_metadata(addr, size, _CastType::_Prefix) - .unwrap(); - // Avoid expensive allocation when running under Miri. - let assert_msg = if !cfg!(miri) { - format!( - "{}\nvalidate_cast_and_convert_metadata({addr}, {size})", - assert_msg - ) - } else { - String::new() - }; - assert_eq!(got_split_at, size, "{}", assert_msg); - if dst { - assert!(got_elems >= elems, "{}", assert_msg); - if got_elems != elems { - // If `validate_cast_and_convert_metadata` - // returned more elements than `elems`, that - // means that `elems` is not the maximum number - // of elements that can fit in `size` - in other - // words, there is enough padding at the end of - // the value to fit at least one more element. - // If we use this metadata to synthesize a - // pointer, despite having a different element - // count, we still expect it to have the same - // size. - let got_ptr = with_elems(got_elems); - // SAFETY: `got_ptr` is a pointer to a valid `T`. - let size_of_got_ptr = unsafe { mem::size_of_val_raw(got_ptr.as_ptr()) }; - assert_eq!(size_of_got_ptr, size, "{}", assert_msg); - } - } else { - // For sized casts, the returned element value is - // technically meaningless, and we don't guarantee any - // particular value. In practice, it's always zero. - assert_eq!(got_elems, 0, "{}", assert_msg) - } - } - } - } - - macro_rules! validate_against_rust { - ($offset:literal, $align:literal $(, $elem_size:literal)?) => {{ - #[repr(C, align($align))] - struct Foo([u8; $offset]$(, [[u8; $elem_size]])?); - - let args = MacroArgs { - offset: $offset, - align: $align.try_into().unwrap(), - elem_size: { - #[allow(unused)] - let ret = None::; - $(let ret = Some($elem_size);)? - ret - } - }; - - #[repr(C, align($align))] - struct FooAlign; - // Create an aligned buffer to use in order to synthesize - // pointers to `Foo`. We don't ever load values from these - // pointers - we just do arithmetic on them - so having a "real" - // block of memory as opposed to a validly-aligned-but-dangling - // pointer is only necessary to make Miri happy since we run it - // with "strict provenance" checking enabled. - let aligned_buf = Align::<_, FooAlign>::new([0u8; 1024]); - let with_elems = |elems| { - let slc = NonNull::slice_from_raw_parts(NonNull::from(&aligned_buf.t), elems); - #[allow(clippy::as_conversions)] - NonNull::new(slc.as_ptr() as *mut Foo).unwrap() - }; - let addr_of_slice_field = { - #[allow(unused)] - let f = None::) -> NonNull>; - $( - // SAFETY: `test` promises to only call `f` with a `ptr` - // to a valid `Foo`. - let f: Option) -> NonNull> = Some(|ptr: NonNull| unsafe { - NonNull::new(ptr::addr_of_mut!((*ptr.as_ptr()).1)).unwrap().cast::() - }); - let _ = $elem_size; - )? - f - }; - - test::(args, with_elems, addr_of_slice_field); - }}; - } - - // Every permutation of: - // - offset in [0, 4] - // - align in [1, 16] - // - elem_size in [0, 4] (plus no elem_size) - validate_against_rust!(0, 1); - validate_against_rust!(0, 1, 0); - validate_against_rust!(0, 1, 1); - validate_against_rust!(0, 1, 2); - validate_against_rust!(0, 1, 3); - validate_against_rust!(0, 1, 4); - validate_against_rust!(0, 2); - validate_against_rust!(0, 2, 0); - validate_against_rust!(0, 2, 1); - validate_against_rust!(0, 2, 2); - validate_against_rust!(0, 2, 3); - validate_against_rust!(0, 2, 4); - validate_against_rust!(0, 4); - validate_against_rust!(0, 4, 0); - validate_against_rust!(0, 4, 1); - validate_against_rust!(0, 4, 2); - validate_against_rust!(0, 4, 3); - validate_against_rust!(0, 4, 4); - validate_against_rust!(0, 8); - validate_against_rust!(0, 8, 0); - validate_against_rust!(0, 8, 1); - validate_against_rust!(0, 8, 2); - validate_against_rust!(0, 8, 3); - validate_against_rust!(0, 8, 4); - validate_against_rust!(0, 16); - validate_against_rust!(0, 16, 0); - validate_against_rust!(0, 16, 1); - validate_against_rust!(0, 16, 2); - validate_against_rust!(0, 16, 3); - validate_against_rust!(0, 16, 4); - validate_against_rust!(1, 1); - validate_against_rust!(1, 1, 0); - validate_against_rust!(1, 1, 1); - validate_against_rust!(1, 1, 2); - validate_against_rust!(1, 1, 3); - validate_against_rust!(1, 1, 4); - validate_against_rust!(1, 2); - validate_against_rust!(1, 2, 0); - validate_against_rust!(1, 2, 1); - validate_against_rust!(1, 2, 2); - validate_against_rust!(1, 2, 3); - validate_against_rust!(1, 2, 4); - validate_against_rust!(1, 4); - validate_against_rust!(1, 4, 0); - validate_against_rust!(1, 4, 1); - validate_against_rust!(1, 4, 2); - validate_against_rust!(1, 4, 3); - validate_against_rust!(1, 4, 4); - validate_against_rust!(1, 8); - validate_against_rust!(1, 8, 0); - validate_against_rust!(1, 8, 1); - validate_against_rust!(1, 8, 2); - validate_against_rust!(1, 8, 3); - validate_against_rust!(1, 8, 4); - validate_against_rust!(1, 16); - validate_against_rust!(1, 16, 0); - validate_against_rust!(1, 16, 1); - validate_against_rust!(1, 16, 2); - validate_against_rust!(1, 16, 3); - validate_against_rust!(1, 16, 4); - validate_against_rust!(2, 1); - validate_against_rust!(2, 1, 0); - validate_against_rust!(2, 1, 1); - validate_against_rust!(2, 1, 2); - validate_against_rust!(2, 1, 3); - validate_against_rust!(2, 1, 4); - validate_against_rust!(2, 2); - validate_against_rust!(2, 2, 0); - validate_against_rust!(2, 2, 1); - validate_against_rust!(2, 2, 2); - validate_against_rust!(2, 2, 3); - validate_against_rust!(2, 2, 4); - validate_against_rust!(2, 4); - validate_against_rust!(2, 4, 0); - validate_against_rust!(2, 4, 1); - validate_against_rust!(2, 4, 2); - validate_against_rust!(2, 4, 3); - validate_against_rust!(2, 4, 4); - validate_against_rust!(2, 8); - validate_against_rust!(2, 8, 0); - validate_against_rust!(2, 8, 1); - validate_against_rust!(2, 8, 2); - validate_against_rust!(2, 8, 3); - validate_against_rust!(2, 8, 4); - validate_against_rust!(2, 16); - validate_against_rust!(2, 16, 0); - validate_against_rust!(2, 16, 1); - validate_against_rust!(2, 16, 2); - validate_against_rust!(2, 16, 3); - validate_against_rust!(2, 16, 4); - validate_against_rust!(3, 1); - validate_against_rust!(3, 1, 0); - validate_against_rust!(3, 1, 1); - validate_against_rust!(3, 1, 2); - validate_against_rust!(3, 1, 3); - validate_against_rust!(3, 1, 4); - validate_against_rust!(3, 2); - validate_against_rust!(3, 2, 0); - validate_against_rust!(3, 2, 1); - validate_against_rust!(3, 2, 2); - validate_against_rust!(3, 2, 3); - validate_against_rust!(3, 2, 4); - validate_against_rust!(3, 4); - validate_against_rust!(3, 4, 0); - validate_against_rust!(3, 4, 1); - validate_against_rust!(3, 4, 2); - validate_against_rust!(3, 4, 3); - validate_against_rust!(3, 4, 4); - validate_against_rust!(3, 8); - validate_against_rust!(3, 8, 0); - validate_against_rust!(3, 8, 1); - validate_against_rust!(3, 8, 2); - validate_against_rust!(3, 8, 3); - validate_against_rust!(3, 8, 4); - validate_against_rust!(3, 16); - validate_against_rust!(3, 16, 0); - validate_against_rust!(3, 16, 1); - validate_against_rust!(3, 16, 2); - validate_against_rust!(3, 16, 3); - validate_against_rust!(3, 16, 4); - validate_against_rust!(4, 1); - validate_against_rust!(4, 1, 0); - validate_against_rust!(4, 1, 1); - validate_against_rust!(4, 1, 2); - validate_against_rust!(4, 1, 3); - validate_against_rust!(4, 1, 4); - validate_against_rust!(4, 2); - validate_against_rust!(4, 2, 0); - validate_against_rust!(4, 2, 1); - validate_against_rust!(4, 2, 2); - validate_against_rust!(4, 2, 3); - validate_against_rust!(4, 2, 4); - validate_against_rust!(4, 4); - validate_against_rust!(4, 4, 0); - validate_against_rust!(4, 4, 1); - validate_against_rust!(4, 4, 2); - validate_against_rust!(4, 4, 3); - validate_against_rust!(4, 4, 4); - validate_against_rust!(4, 8); - validate_against_rust!(4, 8, 0); - validate_against_rust!(4, 8, 1); - validate_against_rust!(4, 8, 2); - validate_against_rust!(4, 8, 3); - validate_against_rust!(4, 8, 4); - validate_against_rust!(4, 16); - validate_against_rust!(4, 16, 0); - validate_against_rust!(4, 16, 1); - validate_against_rust!(4, 16, 2); - validate_against_rust!(4, 16, 3); - validate_against_rust!(4, 16, 4); - } - - #[test] - fn test_known_layout() { - // Test that `$ty` and `ManuallyDrop<$ty>` have the expected layout. - // Test that `PhantomData<$ty>` has the same layout as `()` regardless - // of `$ty`. - macro_rules! test { - ($ty:ty, $expect:expr) => { - let expect = $expect; - assert_eq!(<$ty as KnownLayout>::LAYOUT, expect); - assert_eq!( as KnownLayout>::LAYOUT, expect); - assert_eq!( as KnownLayout>::LAYOUT, <() as KnownLayout>::LAYOUT); - }; - } - - let layout = |offset, align, _trailing_slice_elem_size| DstLayout { - _align: NonZeroUsize::new(align).unwrap(), - _size_info: match _trailing_slice_elem_size { - None => SizeInfo::Sized { _size: offset }, - Some(elem_size) => SizeInfo::SliceDst(TrailingSliceLayout { - _offset: offset, - _elem_size: elem_size, - }), - }, - }; - - test!((), layout(0, 1, None)); - test!(u8, layout(1, 1, None)); - // Use `align_of` because `u64` alignment may be smaller than 8 on some - // platforms. - test!(u64, layout(8, mem::align_of::(), None)); - test!(AU64, layout(8, 8, None)); - - test!(Option<&'static ()>, usize::LAYOUT); - - test!([()], layout(0, 1, Some(0))); - test!([u8], layout(0, 1, Some(1))); - test!(str, layout(0, 1, Some(1))); - } - - #[test] - fn test_object_safety() { - fn _takes_from_zeroes(_: &dyn FromZeroes) {} - fn _takes_from_bytes(_: &dyn FromBytes) {} - fn _takes_unaligned(_: &dyn Unaligned) {} - } - - #[test] - fn test_from_zeroes_only() { - // Test types that implement `FromZeroes` but not `FromBytes`. - - assert!(!bool::new_zeroed()); - assert_eq!(char::new_zeroed(), '\0'); - - #[cfg(feature = "alloc")] - { - assert_eq!(bool::new_box_zeroed(), Box::new(false)); - assert_eq!(char::new_box_zeroed(), Box::new('\0')); - - assert_eq!(bool::new_box_slice_zeroed(3).as_ref(), [false, false, false]); - assert_eq!(char::new_box_slice_zeroed(3).as_ref(), ['\0', '\0', '\0']); - - assert_eq!(bool::new_vec_zeroed(3).as_ref(), [false, false, false]); - assert_eq!(char::new_vec_zeroed(3).as_ref(), ['\0', '\0', '\0']); - } - - let mut string = "hello".to_string(); - let s: &mut str = string.as_mut(); - assert_eq!(s, "hello"); - s.zero(); - assert_eq!(s, "\0\0\0\0\0"); - } - - #[test] - fn test_read_write() { - const VAL: u64 = 0x12345678; - #[cfg(target_endian = "big")] - const VAL_BYTES: [u8; 8] = VAL.to_be_bytes(); - #[cfg(target_endian = "little")] - const VAL_BYTES: [u8; 8] = VAL.to_le_bytes(); - - // Test `FromBytes::{read_from, read_from_prefix, read_from_suffix}`. - - assert_eq!(u64::read_from(&VAL_BYTES[..]), Some(VAL)); - // The first 8 bytes are from `VAL_BYTES` and the second 8 bytes are all - // zeroes. - let bytes_with_prefix: [u8; 16] = transmute!([VAL_BYTES, [0; 8]]); - assert_eq!(u64::read_from_prefix(&bytes_with_prefix[..]), Some(VAL)); - assert_eq!(u64::read_from_suffix(&bytes_with_prefix[..]), Some(0)); - // The first 8 bytes are all zeroes and the second 8 bytes are from - // `VAL_BYTES` - let bytes_with_suffix: [u8; 16] = transmute!([[0; 8], VAL_BYTES]); - assert_eq!(u64::read_from_prefix(&bytes_with_suffix[..]), Some(0)); - assert_eq!(u64::read_from_suffix(&bytes_with_suffix[..]), Some(VAL)); - - // Test `AsBytes::{write_to, write_to_prefix, write_to_suffix}`. - - let mut bytes = [0u8; 8]; - assert_eq!(VAL.write_to(&mut bytes[..]), Some(())); - assert_eq!(bytes, VAL_BYTES); - let mut bytes = [0u8; 16]; - assert_eq!(VAL.write_to_prefix(&mut bytes[..]), Some(())); - let want: [u8; 16] = transmute!([VAL_BYTES, [0; 8]]); - assert_eq!(bytes, want); - let mut bytes = [0u8; 16]; - assert_eq!(VAL.write_to_suffix(&mut bytes[..]), Some(())); - let want: [u8; 16] = transmute!([[0; 8], VAL_BYTES]); - assert_eq!(bytes, want); - } - - #[test] - fn test_transmute() { - // Test that memory is transmuted as expected. - let array_of_u8s = [0u8, 1, 2, 3, 4, 5, 6, 7]; - let array_of_arrays = [[0, 1], [2, 3], [4, 5], [6, 7]]; - let x: [[u8; 2]; 4] = transmute!(array_of_u8s); - assert_eq!(x, array_of_arrays); - let x: [u8; 8] = transmute!(array_of_arrays); - assert_eq!(x, array_of_u8s); - - // Test that the source expression's value is forgotten rather than - // dropped. - #[derive(AsBytes)] - #[repr(transparent)] - struct PanicOnDrop(()); - impl Drop for PanicOnDrop { - fn drop(&mut self) { - panic!("PanicOnDrop::drop"); - } - } - #[allow(clippy::let_unit_value)] - let _: () = transmute!(PanicOnDrop(())); - - // Test that `transmute!` is legal in a const context. - const ARRAY_OF_U8S: [u8; 8] = [0u8, 1, 2, 3, 4, 5, 6, 7]; - const ARRAY_OF_ARRAYS: [[u8; 2]; 4] = [[0, 1], [2, 3], [4, 5], [6, 7]]; - const X: [[u8; 2]; 4] = transmute!(ARRAY_OF_U8S); - assert_eq!(X, ARRAY_OF_ARRAYS); - } - - #[test] - fn test_transmute_ref() { - // Test that memory is transmuted as expected. - let array_of_u8s = [0u8, 1, 2, 3, 4, 5, 6, 7]; - let array_of_arrays = [[0, 1], [2, 3], [4, 5], [6, 7]]; - let x: &[[u8; 2]; 4] = transmute_ref!(&array_of_u8s); - assert_eq!(*x, array_of_arrays); - let x: &[u8; 8] = transmute_ref!(&array_of_arrays); - assert_eq!(*x, array_of_u8s); - - // Test that `transmute_ref!` is legal in a const context. - const ARRAY_OF_U8S: [u8; 8] = [0u8, 1, 2, 3, 4, 5, 6, 7]; - const ARRAY_OF_ARRAYS: [[u8; 2]; 4] = [[0, 1], [2, 3], [4, 5], [6, 7]]; - #[allow(clippy::redundant_static_lifetimes)] - const X: &'static [[u8; 2]; 4] = transmute_ref!(&ARRAY_OF_U8S); - assert_eq!(*X, ARRAY_OF_ARRAYS); - - // Test that it's legal to transmute a reference while shrinking the - // lifetime (note that `X` has the lifetime `'static`). - let x: &[u8; 8] = transmute_ref!(X); - assert_eq!(*x, ARRAY_OF_U8S); - - // Test that `transmute_ref!` supports decreasing alignment. - let u = AU64(0); - let array = [0, 0, 0, 0, 0, 0, 0, 0]; - let x: &[u8; 8] = transmute_ref!(&u); - assert_eq!(*x, array); - - // Test that a mutable reference can be turned into an immutable one. - let mut x = 0u8; - #[allow(clippy::useless_transmute)] - let y: &u8 = transmute_ref!(&mut x); - assert_eq!(*y, 0); - } - - #[test] - fn test_transmute_mut() { - // Test that memory is transmuted as expected. - let mut array_of_u8s = [0u8, 1, 2, 3, 4, 5, 6, 7]; - let mut array_of_arrays = [[0, 1], [2, 3], [4, 5], [6, 7]]; - let x: &mut [[u8; 2]; 4] = transmute_mut!(&mut array_of_u8s); - assert_eq!(*x, array_of_arrays); - let x: &mut [u8; 8] = transmute_mut!(&mut array_of_arrays); - assert_eq!(*x, array_of_u8s); - - { - // Test that it's legal to transmute a reference while shrinking the - // lifetime. - let x: &mut [u8; 8] = transmute_mut!(&mut array_of_arrays); - assert_eq!(*x, array_of_u8s); - } - // Test that `transmute_mut!` supports decreasing alignment. - let mut u = AU64(0); - let array = [0, 0, 0, 0, 0, 0, 0, 0]; - let x: &[u8; 8] = transmute_mut!(&mut u); - assert_eq!(*x, array); - - // Test that a mutable reference can be turned into an immutable one. - let mut x = 0u8; - #[allow(clippy::useless_transmute)] - let y: &u8 = transmute_mut!(&mut x); - assert_eq!(*y, 0); - } - - #[test] - fn test_macros_evaluate_args_once() { - let mut ctr = 0; - let _: usize = transmute!({ - ctr += 1; - 0usize - }); - assert_eq!(ctr, 1); - - let mut ctr = 0; - let _: &usize = transmute_ref!({ - ctr += 1; - &0usize - }); - assert_eq!(ctr, 1); - } - - #[test] - fn test_include_value() { - const AS_U32: u32 = include_value!("../testdata/include_value/data"); - assert_eq!(AS_U32, u32::from_ne_bytes([b'a', b'b', b'c', b'd'])); - const AS_I32: i32 = include_value!("../testdata/include_value/data"); - assert_eq!(AS_I32, i32::from_ne_bytes([b'a', b'b', b'c', b'd'])); - } - - #[test] - fn test_address() { - // Test that the `Deref` and `DerefMut` implementations return a - // reference which points to the right region of memory. - - let buf = [0]; - let r = Ref::<_, u8>::new(&buf[..]).unwrap(); - let buf_ptr = buf.as_ptr(); - let deref_ptr: *const u8 = r.deref(); - assert_eq!(buf_ptr, deref_ptr); - - let buf = [0]; - let r = Ref::<_, [u8]>::new_slice(&buf[..]).unwrap(); - let buf_ptr = buf.as_ptr(); - let deref_ptr = r.deref().as_ptr(); - assert_eq!(buf_ptr, deref_ptr); - } - - // Verify that values written to a `Ref` are properly shared between the - // typed and untyped representations, that reads via `deref` and `read` - // behave the same, and that writes via `deref_mut` and `write` behave the - // same. - fn test_new_helper(mut r: Ref<&mut [u8], AU64>) { - // assert that the value starts at 0 - assert_eq!(*r, AU64(0)); - assert_eq!(r.read(), AU64(0)); - - // Assert that values written to the typed value are reflected in the - // byte slice. - const VAL1: AU64 = AU64(0xFF00FF00FF00FF00); - *r = VAL1; - assert_eq!(r.bytes(), &VAL1.to_bytes()); - *r = AU64(0); - r.write(VAL1); - assert_eq!(r.bytes(), &VAL1.to_bytes()); - - // Assert that values written to the byte slice are reflected in the - // typed value. - const VAL2: AU64 = AU64(!VAL1.0); // different from `VAL1` - r.bytes_mut().copy_from_slice(&VAL2.to_bytes()[..]); - assert_eq!(*r, VAL2); - assert_eq!(r.read(), VAL2); - } - - // Verify that values written to a `Ref` are properly shared between the - // typed and untyped representations; pass a value with `typed_len` `AU64`s - // backed by an array of `typed_len * 8` bytes. - fn test_new_helper_slice(mut r: Ref<&mut [u8], [AU64]>, typed_len: usize) { - // Assert that the value starts out zeroed. - assert_eq!(&*r, vec![AU64(0); typed_len].as_slice()); - - // Check the backing storage is the exact same slice. - let untyped_len = typed_len * 8; - assert_eq!(r.bytes().len(), untyped_len); - assert_eq!(r.bytes().as_ptr(), r.as_ptr().cast::()); - - // Assert that values written to the typed value are reflected in the - // byte slice. - const VAL1: AU64 = AU64(0xFF00FF00FF00FF00); - for typed in &mut *r { - *typed = VAL1; - } - assert_eq!(r.bytes(), VAL1.0.to_ne_bytes().repeat(typed_len).as_slice()); - - // Assert that values written to the byte slice are reflected in the - // typed value. - const VAL2: AU64 = AU64(!VAL1.0); // different from VAL1 - r.bytes_mut().copy_from_slice(&VAL2.0.to_ne_bytes().repeat(typed_len)); - assert!(r.iter().copied().all(|x| x == VAL2)); - } - - // Verify that values written to a `Ref` are properly shared between the - // typed and untyped representations, that reads via `deref` and `read` - // behave the same, and that writes via `deref_mut` and `write` behave the - // same. - fn test_new_helper_unaligned(mut r: Ref<&mut [u8], [u8; 8]>) { - // assert that the value starts at 0 - assert_eq!(*r, [0; 8]); - assert_eq!(r.read(), [0; 8]); - - // Assert that values written to the typed value are reflected in the - // byte slice. - const VAL1: [u8; 8] = [0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00]; - *r = VAL1; - assert_eq!(r.bytes(), &VAL1); - *r = [0; 8]; - r.write(VAL1); - assert_eq!(r.bytes(), &VAL1); - - // Assert that values written to the byte slice are reflected in the - // typed value. - const VAL2: [u8; 8] = [0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF]; // different from VAL1 - r.bytes_mut().copy_from_slice(&VAL2[..]); - assert_eq!(*r, VAL2); - assert_eq!(r.read(), VAL2); - } - - // Verify that values written to a `Ref` are properly shared between the - // typed and untyped representations; pass a value with `len` `u8`s backed - // by an array of `len` bytes. - fn test_new_helper_slice_unaligned(mut r: Ref<&mut [u8], [u8]>, len: usize) { - // Assert that the value starts out zeroed. - assert_eq!(&*r, vec![0u8; len].as_slice()); - - // Check the backing storage is the exact same slice. - assert_eq!(r.bytes().len(), len); - assert_eq!(r.bytes().as_ptr(), r.as_ptr()); - - // Assert that values written to the typed value are reflected in the - // byte slice. - let mut expected_bytes = [0xFF, 0x00].iter().copied().cycle().take(len).collect::>(); - r.copy_from_slice(&expected_bytes); - assert_eq!(r.bytes(), expected_bytes.as_slice()); - - // Assert that values written to the byte slice are reflected in the - // typed value. - for byte in &mut expected_bytes { - *byte = !*byte; // different from `expected_len` - } - r.bytes_mut().copy_from_slice(&expected_bytes); - assert_eq!(&*r, expected_bytes.as_slice()); - } - - #[test] - fn test_new_aligned_sized() { - // Test that a properly-aligned, properly-sized buffer works for new, - // new_from_prefix, and new_from_suffix, and that new_from_prefix and - // new_from_suffix return empty slices. Test that a properly-aligned - // buffer whose length is a multiple of the element size works for - // new_slice. Test that xxx_zeroed behaves the same, and zeroes the - // memory. - - // A buffer with an alignment of 8. - let mut buf = Align::<[u8; 8], AU64>::default(); - // `buf.t` should be aligned to 8, so this should always succeed. - test_new_helper(Ref::<_, AU64>::new(&mut buf.t[..]).unwrap()); - let ascending: [u8; 8] = (0..8).collect::>().try_into().unwrap(); - buf.t = ascending; - test_new_helper(Ref::<_, AU64>::new_zeroed(&mut buf.t[..]).unwrap()); - { - // In a block so that `r` and `suffix` don't live too long. - buf.set_default(); - let (r, suffix) = Ref::<_, AU64>::new_from_prefix(&mut buf.t[..]).unwrap(); - assert!(suffix.is_empty()); - test_new_helper(r); - } - { - buf.t = ascending; - let (r, suffix) = Ref::<_, AU64>::new_from_prefix_zeroed(&mut buf.t[..]).unwrap(); - assert!(suffix.is_empty()); - test_new_helper(r); - } - { - buf.set_default(); - let (prefix, r) = Ref::<_, AU64>::new_from_suffix(&mut buf.t[..]).unwrap(); - assert!(prefix.is_empty()); - test_new_helper(r); - } - { - buf.t = ascending; - let (prefix, r) = Ref::<_, AU64>::new_from_suffix_zeroed(&mut buf.t[..]).unwrap(); - assert!(prefix.is_empty()); - test_new_helper(r); - } - - // A buffer with alignment 8 and length 24. We choose this length very - // intentionally: if we instead used length 16, then the prefix and - // suffix lengths would be identical. In the past, we used length 16, - // which resulted in this test failing to discover the bug uncovered in - // #506. - let mut buf = Align::<[u8; 24], AU64>::default(); - // `buf.t` should be aligned to 8 and have a length which is a multiple - // of `size_of::()`, so this should always succeed. - test_new_helper_slice(Ref::<_, [AU64]>::new_slice(&mut buf.t[..]).unwrap(), 3); - let ascending: [u8; 24] = (0..24).collect::>().try_into().unwrap(); - // 16 ascending bytes followed by 8 zeros. - let mut ascending_prefix = ascending; - ascending_prefix[16..].copy_from_slice(&[0, 0, 0, 0, 0, 0, 0, 0]); - // 8 zeros followed by 16 ascending bytes. - let mut ascending_suffix = ascending; - ascending_suffix[..8].copy_from_slice(&[0, 0, 0, 0, 0, 0, 0, 0]); - test_new_helper_slice(Ref::<_, [AU64]>::new_slice_zeroed(&mut buf.t[..]).unwrap(), 3); - - { - buf.t = ascending_suffix; - let (r, suffix) = Ref::<_, [AU64]>::new_slice_from_prefix(&mut buf.t[..], 1).unwrap(); - assert_eq!(suffix, &ascending[8..]); - test_new_helper_slice(r, 1); - } - { - buf.t = ascending_suffix; - let (r, suffix) = - Ref::<_, [AU64]>::new_slice_from_prefix_zeroed(&mut buf.t[..], 1).unwrap(); - assert_eq!(suffix, &ascending[8..]); - test_new_helper_slice(r, 1); - } - { - buf.t = ascending_prefix; - let (prefix, r) = Ref::<_, [AU64]>::new_slice_from_suffix(&mut buf.t[..], 1).unwrap(); - assert_eq!(prefix, &ascending[..16]); - test_new_helper_slice(r, 1); - } - { - buf.t = ascending_prefix; - let (prefix, r) = - Ref::<_, [AU64]>::new_slice_from_suffix_zeroed(&mut buf.t[..], 1).unwrap(); - assert_eq!(prefix, &ascending[..16]); - test_new_helper_slice(r, 1); - } - } - - #[test] - fn test_new_unaligned_sized() { - // Test that an unaligned, properly-sized buffer works for - // `new_unaligned`, `new_unaligned_from_prefix`, and - // `new_unaligned_from_suffix`, and that `new_unaligned_from_prefix` - // `new_unaligned_from_suffix` return empty slices. Test that an - // unaligned buffer whose length is a multiple of the element size works - // for `new_slice`. Test that `xxx_zeroed` behaves the same, and zeroes - // the memory. - - let mut buf = [0u8; 8]; - test_new_helper_unaligned(Ref::<_, [u8; 8]>::new_unaligned(&mut buf[..]).unwrap()); - buf = [0xFFu8; 8]; - test_new_helper_unaligned(Ref::<_, [u8; 8]>::new_unaligned_zeroed(&mut buf[..]).unwrap()); - { - // In a block so that `r` and `suffix` don't live too long. - buf = [0u8; 8]; - let (r, suffix) = Ref::<_, [u8; 8]>::new_unaligned_from_prefix(&mut buf[..]).unwrap(); - assert!(suffix.is_empty()); - test_new_helper_unaligned(r); - } - { - buf = [0xFFu8; 8]; - let (r, suffix) = - Ref::<_, [u8; 8]>::new_unaligned_from_prefix_zeroed(&mut buf[..]).unwrap(); - assert!(suffix.is_empty()); - test_new_helper_unaligned(r); - } - { - buf = [0u8; 8]; - let (prefix, r) = Ref::<_, [u8; 8]>::new_unaligned_from_suffix(&mut buf[..]).unwrap(); - assert!(prefix.is_empty()); - test_new_helper_unaligned(r); - } - { - buf = [0xFFu8; 8]; - let (prefix, r) = - Ref::<_, [u8; 8]>::new_unaligned_from_suffix_zeroed(&mut buf[..]).unwrap(); - assert!(prefix.is_empty()); - test_new_helper_unaligned(r); - } - - let mut buf = [0u8; 16]; - // `buf.t` should be aligned to 8 and have a length which is a multiple - // of `size_of::AU64>()`, so this should always succeed. - test_new_helper_slice_unaligned( - Ref::<_, [u8]>::new_slice_unaligned(&mut buf[..]).unwrap(), - 16, - ); - buf = [0xFFu8; 16]; - test_new_helper_slice_unaligned( - Ref::<_, [u8]>::new_slice_unaligned_zeroed(&mut buf[..]).unwrap(), - 16, - ); - - { - buf = [0u8; 16]; - let (r, suffix) = - Ref::<_, [u8]>::new_slice_unaligned_from_prefix(&mut buf[..], 8).unwrap(); - assert_eq!(suffix, [0; 8]); - test_new_helper_slice_unaligned(r, 8); - } - { - buf = [0xFFu8; 16]; - let (r, suffix) = - Ref::<_, [u8]>::new_slice_unaligned_from_prefix_zeroed(&mut buf[..], 8).unwrap(); - assert_eq!(suffix, [0xFF; 8]); - test_new_helper_slice_unaligned(r, 8); - } - { - buf = [0u8; 16]; - let (prefix, r) = - Ref::<_, [u8]>::new_slice_unaligned_from_suffix(&mut buf[..], 8).unwrap(); - assert_eq!(prefix, [0; 8]); - test_new_helper_slice_unaligned(r, 8); - } - { - buf = [0xFFu8; 16]; - let (prefix, r) = - Ref::<_, [u8]>::new_slice_unaligned_from_suffix_zeroed(&mut buf[..], 8).unwrap(); - assert_eq!(prefix, [0xFF; 8]); - test_new_helper_slice_unaligned(r, 8); - } - } - - #[test] - fn test_new_oversized() { - // Test that a properly-aligned, overly-sized buffer works for - // `new_from_prefix` and `new_from_suffix`, and that they return the - // remainder and prefix of the slice respectively. Test that - // `xxx_zeroed` behaves the same, and zeroes the memory. - - let mut buf = Align::<[u8; 16], AU64>::default(); - { - // In a block so that `r` and `suffix` don't live too long. `buf.t` - // should be aligned to 8, so this should always succeed. - let (r, suffix) = Ref::<_, AU64>::new_from_prefix(&mut buf.t[..]).unwrap(); - assert_eq!(suffix.len(), 8); - test_new_helper(r); - } - { - buf.t = [0xFFu8; 16]; - // `buf.t` should be aligned to 8, so this should always succeed. - let (r, suffix) = Ref::<_, AU64>::new_from_prefix_zeroed(&mut buf.t[..]).unwrap(); - // Assert that the suffix wasn't zeroed. - assert_eq!(suffix, &[0xFFu8; 8]); - test_new_helper(r); - } - { - buf.set_default(); - // `buf.t` should be aligned to 8, so this should always succeed. - let (prefix, r) = Ref::<_, AU64>::new_from_suffix(&mut buf.t[..]).unwrap(); - assert_eq!(prefix.len(), 8); - test_new_helper(r); - } - { - buf.t = [0xFFu8; 16]; - // `buf.t` should be aligned to 8, so this should always succeed. - let (prefix, r) = Ref::<_, AU64>::new_from_suffix_zeroed(&mut buf.t[..]).unwrap(); - // Assert that the prefix wasn't zeroed. - assert_eq!(prefix, &[0xFFu8; 8]); - test_new_helper(r); - } - } - - #[test] - fn test_new_unaligned_oversized() { - // Test than an unaligned, overly-sized buffer works for - // `new_unaligned_from_prefix` and `new_unaligned_from_suffix`, and that - // they return the remainder and prefix of the slice respectively. Test - // that `xxx_zeroed` behaves the same, and zeroes the memory. - - let mut buf = [0u8; 16]; - { - // In a block so that `r` and `suffix` don't live too long. - let (r, suffix) = Ref::<_, [u8; 8]>::new_unaligned_from_prefix(&mut buf[..]).unwrap(); - assert_eq!(suffix.len(), 8); - test_new_helper_unaligned(r); - } - { - buf = [0xFFu8; 16]; - let (r, suffix) = - Ref::<_, [u8; 8]>::new_unaligned_from_prefix_zeroed(&mut buf[..]).unwrap(); - // Assert that the suffix wasn't zeroed. - assert_eq!(suffix, &[0xFF; 8]); - test_new_helper_unaligned(r); - } - { - buf = [0u8; 16]; - let (prefix, r) = Ref::<_, [u8; 8]>::new_unaligned_from_suffix(&mut buf[..]).unwrap(); - assert_eq!(prefix.len(), 8); - test_new_helper_unaligned(r); - } - { - buf = [0xFFu8; 16]; - let (prefix, r) = - Ref::<_, [u8; 8]>::new_unaligned_from_suffix_zeroed(&mut buf[..]).unwrap(); - // Assert that the prefix wasn't zeroed. - assert_eq!(prefix, &[0xFF; 8]); - test_new_helper_unaligned(r); - } - } - - #[test] - fn test_ref_from_mut_from() { - // Test `FromBytes::{ref_from, mut_from}{,_prefix,_suffix}` success cases - // Exhaustive coverage for these methods is covered by the `Ref` tests above, - // which these helper methods defer to. - - let mut buf = - Align::<[u8; 16], AU64>::new([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]); - - assert_eq!( - AU64::ref_from(&buf.t[8..]).unwrap().0.to_ne_bytes(), - [8, 9, 10, 11, 12, 13, 14, 15] - ); - let suffix = AU64::mut_from(&mut buf.t[8..]).unwrap(); - suffix.0 = 0x0101010101010101; - // The `[u8:9]` is a non-half size of the full buffer, which would catch - // `from_prefix` having the same implementation as `from_suffix` (issues #506, #511). - assert_eq!(<[u8; 9]>::ref_from_suffix(&buf.t[..]).unwrap(), &[7u8, 1, 1, 1, 1, 1, 1, 1, 1]); - let suffix = AU64::mut_from_suffix(&mut buf.t[1..]).unwrap(); - suffix.0 = 0x0202020202020202; - <[u8; 10]>::mut_from_suffix(&mut buf.t[..]).unwrap()[0] = 42; - assert_eq!(<[u8; 9]>::ref_from_prefix(&buf.t[..]).unwrap(), &[0, 1, 2, 3, 4, 5, 42, 7, 2]); - <[u8; 2]>::mut_from_prefix(&mut buf.t[..]).unwrap()[1] = 30; - assert_eq!(buf.t, [0, 30, 2, 3, 4, 5, 42, 7, 2, 2, 2, 2, 2, 2, 2, 2]); - } - - #[test] - fn test_ref_from_mut_from_error() { - // Test `FromBytes::{ref_from, mut_from}{,_prefix,_suffix}` error cases. - - // Fail because the buffer is too large. - let mut buf = Align::<[u8; 16], AU64>::default(); - // `buf.t` should be aligned to 8, so only the length check should fail. - assert!(AU64::ref_from(&buf.t[..]).is_none()); - assert!(AU64::mut_from(&mut buf.t[..]).is_none()); - assert!(<[u8; 8]>::ref_from(&buf.t[..]).is_none()); - assert!(<[u8; 8]>::mut_from(&mut buf.t[..]).is_none()); - - // Fail because the buffer is too small. - let mut buf = Align::<[u8; 4], AU64>::default(); - assert!(AU64::ref_from(&buf.t[..]).is_none()); - assert!(AU64::mut_from(&mut buf.t[..]).is_none()); - assert!(<[u8; 8]>::ref_from(&buf.t[..]).is_none()); - assert!(<[u8; 8]>::mut_from(&mut buf.t[..]).is_none()); - assert!(AU64::ref_from_prefix(&buf.t[..]).is_none()); - assert!(AU64::mut_from_prefix(&mut buf.t[..]).is_none()); - assert!(AU64::ref_from_suffix(&buf.t[..]).is_none()); - assert!(AU64::mut_from_suffix(&mut buf.t[..]).is_none()); - assert!(<[u8; 8]>::ref_from_prefix(&buf.t[..]).is_none()); - assert!(<[u8; 8]>::mut_from_prefix(&mut buf.t[..]).is_none()); - assert!(<[u8; 8]>::ref_from_suffix(&buf.t[..]).is_none()); - assert!(<[u8; 8]>::mut_from_suffix(&mut buf.t[..]).is_none()); - - // Fail because the alignment is insufficient. - let mut buf = Align::<[u8; 13], AU64>::default(); - assert!(AU64::ref_from(&buf.t[1..]).is_none()); - assert!(AU64::mut_from(&mut buf.t[1..]).is_none()); - assert!(AU64::ref_from(&buf.t[1..]).is_none()); - assert!(AU64::mut_from(&mut buf.t[1..]).is_none()); - assert!(AU64::ref_from_prefix(&buf.t[1..]).is_none()); - assert!(AU64::mut_from_prefix(&mut buf.t[1..]).is_none()); - assert!(AU64::ref_from_suffix(&buf.t[..]).is_none()); - assert!(AU64::mut_from_suffix(&mut buf.t[..]).is_none()); - } - - #[test] - #[allow(clippy::cognitive_complexity)] - fn test_new_error() { - // Fail because the buffer is too large. - - // A buffer with an alignment of 8. - let mut buf = Align::<[u8; 16], AU64>::default(); - // `buf.t` should be aligned to 8, so only the length check should fail. - assert!(Ref::<_, AU64>::new(&buf.t[..]).is_none()); - assert!(Ref::<_, AU64>::new_zeroed(&mut buf.t[..]).is_none()); - assert!(Ref::<_, [u8; 8]>::new_unaligned(&buf.t[..]).is_none()); - assert!(Ref::<_, [u8; 8]>::new_unaligned_zeroed(&mut buf.t[..]).is_none()); - - // Fail because the buffer is too small. - - // A buffer with an alignment of 8. - let mut buf = Align::<[u8; 4], AU64>::default(); - // `buf.t` should be aligned to 8, so only the length check should fail. - assert!(Ref::<_, AU64>::new(&buf.t[..]).is_none()); - assert!(Ref::<_, AU64>::new_zeroed(&mut buf.t[..]).is_none()); - assert!(Ref::<_, [u8; 8]>::new_unaligned(&buf.t[..]).is_none()); - assert!(Ref::<_, [u8; 8]>::new_unaligned_zeroed(&mut buf.t[..]).is_none()); - assert!(Ref::<_, AU64>::new_from_prefix(&buf.t[..]).is_none()); - assert!(Ref::<_, AU64>::new_from_prefix_zeroed(&mut buf.t[..]).is_none()); - assert!(Ref::<_, AU64>::new_from_suffix(&buf.t[..]).is_none()); - assert!(Ref::<_, AU64>::new_from_suffix_zeroed(&mut buf.t[..]).is_none()); - assert!(Ref::<_, [u8; 8]>::new_unaligned_from_prefix(&buf.t[..]).is_none()); - assert!(Ref::<_, [u8; 8]>::new_unaligned_from_prefix_zeroed(&mut buf.t[..]).is_none()); - assert!(Ref::<_, [u8; 8]>::new_unaligned_from_suffix(&buf.t[..]).is_none()); - assert!(Ref::<_, [u8; 8]>::new_unaligned_from_suffix_zeroed(&mut buf.t[..]).is_none()); - - // Fail because the length is not a multiple of the element size. - - let mut buf = Align::<[u8; 12], AU64>::default(); - // `buf.t` has length 12, but element size is 8. - assert!(Ref::<_, [AU64]>::new_slice(&buf.t[..]).is_none()); - assert!(Ref::<_, [AU64]>::new_slice_zeroed(&mut buf.t[..]).is_none()); - assert!(Ref::<_, [[u8; 8]]>::new_slice_unaligned(&buf.t[..]).is_none()); - assert!(Ref::<_, [[u8; 8]]>::new_slice_unaligned_zeroed(&mut buf.t[..]).is_none()); - - // Fail because the buffer is too short. - let mut buf = Align::<[u8; 12], AU64>::default(); - // `buf.t` has length 12, but the element size is 8 (and we're expecting - // two of them). - assert!(Ref::<_, [AU64]>::new_slice_from_prefix(&buf.t[..], 2).is_none()); - assert!(Ref::<_, [AU64]>::new_slice_from_prefix_zeroed(&mut buf.t[..], 2).is_none()); - assert!(Ref::<_, [AU64]>::new_slice_from_suffix(&buf.t[..], 2).is_none()); - assert!(Ref::<_, [AU64]>::new_slice_from_suffix_zeroed(&mut buf.t[..], 2).is_none()); - assert!(Ref::<_, [[u8; 8]]>::new_slice_unaligned_from_prefix(&buf.t[..], 2).is_none()); - assert!(Ref::<_, [[u8; 8]]>::new_slice_unaligned_from_prefix_zeroed(&mut buf.t[..], 2) - .is_none()); - assert!(Ref::<_, [[u8; 8]]>::new_slice_unaligned_from_suffix(&buf.t[..], 2).is_none()); - assert!(Ref::<_, [[u8; 8]]>::new_slice_unaligned_from_suffix_zeroed(&mut buf.t[..], 2) - .is_none()); - - // Fail because the alignment is insufficient. - - // A buffer with an alignment of 8. An odd buffer size is chosen so that - // the last byte of the buffer has odd alignment. - let mut buf = Align::<[u8; 13], AU64>::default(); - // Slicing from 1, we get a buffer with size 12 (so the length check - // should succeed) but an alignment of only 1, which is insufficient. - assert!(Ref::<_, AU64>::new(&buf.t[1..]).is_none()); - assert!(Ref::<_, AU64>::new_zeroed(&mut buf.t[1..]).is_none()); - assert!(Ref::<_, AU64>::new_from_prefix(&buf.t[1..]).is_none()); - assert!(Ref::<_, AU64>::new_from_prefix_zeroed(&mut buf.t[1..]).is_none()); - assert!(Ref::<_, [AU64]>::new_slice(&buf.t[1..]).is_none()); - assert!(Ref::<_, [AU64]>::new_slice_zeroed(&mut buf.t[1..]).is_none()); - assert!(Ref::<_, [AU64]>::new_slice_from_prefix(&buf.t[1..], 1).is_none()); - assert!(Ref::<_, [AU64]>::new_slice_from_prefix_zeroed(&mut buf.t[1..], 1).is_none()); - assert!(Ref::<_, [AU64]>::new_slice_from_suffix(&buf.t[1..], 1).is_none()); - assert!(Ref::<_, [AU64]>::new_slice_from_suffix_zeroed(&mut buf.t[1..], 1).is_none()); - // Slicing is unnecessary here because `new_from_suffix[_zeroed]` use - // the suffix of the slice, which has odd alignment. - assert!(Ref::<_, AU64>::new_from_suffix(&buf.t[..]).is_none()); - assert!(Ref::<_, AU64>::new_from_suffix_zeroed(&mut buf.t[..]).is_none()); - - // Fail due to arithmetic overflow. - - let mut buf = Align::<[u8; 16], AU64>::default(); - let unreasonable_len = usize::MAX / mem::size_of::() + 1; - assert!(Ref::<_, [AU64]>::new_slice_from_prefix(&buf.t[..], unreasonable_len).is_none()); - assert!(Ref::<_, [AU64]>::new_slice_from_prefix_zeroed(&mut buf.t[..], unreasonable_len) - .is_none()); - assert!(Ref::<_, [AU64]>::new_slice_from_suffix(&buf.t[..], unreasonable_len).is_none()); - assert!(Ref::<_, [AU64]>::new_slice_from_suffix_zeroed(&mut buf.t[..], unreasonable_len) - .is_none()); - assert!(Ref::<_, [[u8; 8]]>::new_slice_unaligned_from_prefix(&buf.t[..], unreasonable_len) - .is_none()); - assert!(Ref::<_, [[u8; 8]]>::new_slice_unaligned_from_prefix_zeroed( - &mut buf.t[..], - unreasonable_len - ) - .is_none()); - assert!(Ref::<_, [[u8; 8]]>::new_slice_unaligned_from_suffix(&buf.t[..], unreasonable_len) - .is_none()); - assert!(Ref::<_, [[u8; 8]]>::new_slice_unaligned_from_suffix_zeroed( - &mut buf.t[..], - unreasonable_len - ) - .is_none()); - } - - // Tests for ensuring that, if a ZST is passed into a slice-like function, - // we always panic. Since these tests need to be separate per-function, and - // they tend to take up a lot of space, we generate them using a macro in a - // submodule instead. The submodule ensures that we can just re-use the name - // of the function under test for the name of the test itself. - mod test_zst_panics { - macro_rules! zst_test { - ($name:ident($($tt:tt)*), $constructor_in_panic_msg:tt) => { - #[test] - #[should_panic = concat!("Ref::", $constructor_in_panic_msg, " called on a zero-sized type")] - fn $name() { - let mut buffer = [0u8]; - let r = $crate::Ref::<_, [()]>::$name(&mut buffer[..], $($tt)*); - unreachable!("should have panicked, got {:?}", r); - } - } - } - zst_test!(new_slice(), "new_slice"); - zst_test!(new_slice_zeroed(), "new_slice"); - zst_test!(new_slice_from_prefix(1), "new_slice"); - zst_test!(new_slice_from_prefix_zeroed(1), "new_slice"); - zst_test!(new_slice_from_suffix(1), "new_slice"); - zst_test!(new_slice_from_suffix_zeroed(1), "new_slice"); - zst_test!(new_slice_unaligned(), "new_slice_unaligned"); - zst_test!(new_slice_unaligned_zeroed(), "new_slice_unaligned"); - zst_test!(new_slice_unaligned_from_prefix(1), "new_slice_unaligned"); - zst_test!(new_slice_unaligned_from_prefix_zeroed(1), "new_slice_unaligned"); - zst_test!(new_slice_unaligned_from_suffix(1), "new_slice_unaligned"); - zst_test!(new_slice_unaligned_from_suffix_zeroed(1), "new_slice_unaligned"); - } - - #[test] - fn test_as_bytes_methods() { - /// Run a series of tests by calling `AsBytes` methods on `t`. - /// - /// `bytes` is the expected byte sequence returned from `t.as_bytes()` - /// before `t` has been modified. `post_mutation` is the expected - /// sequence returned from `t.as_bytes()` after `t.as_bytes_mut()[0]` - /// has had its bits flipped (by applying `^= 0xFF`). - /// - /// `N` is the size of `t` in bytes. - fn test( - t: &mut T, - bytes: &[u8], - post_mutation: &T, - ) { - // Test that we can access the underlying bytes, and that we get the - // right bytes and the right number of bytes. - assert_eq!(t.as_bytes(), bytes); - - // Test that changes to the underlying byte slices are reflected in - // the original object. - t.as_bytes_mut()[0] ^= 0xFF; - assert_eq!(t, post_mutation); - t.as_bytes_mut()[0] ^= 0xFF; - - // `write_to` rejects slices that are too small or too large. - assert_eq!(t.write_to(&mut vec![0; N - 1][..]), None); - assert_eq!(t.write_to(&mut vec![0; N + 1][..]), None); - - // `write_to` works as expected. - let mut bytes = [0; N]; - assert_eq!(t.write_to(&mut bytes[..]), Some(())); - assert_eq!(bytes, t.as_bytes()); - - // `write_to_prefix` rejects slices that are too small. - assert_eq!(t.write_to_prefix(&mut vec![0; N - 1][..]), None); - - // `write_to_prefix` works with exact-sized slices. - let mut bytes = [0; N]; - assert_eq!(t.write_to_prefix(&mut bytes[..]), Some(())); - assert_eq!(bytes, t.as_bytes()); - - // `write_to_prefix` works with too-large slices, and any bytes past - // the prefix aren't modified. - let mut too_many_bytes = vec![0; N + 1]; - too_many_bytes[N] = 123; - assert_eq!(t.write_to_prefix(&mut too_many_bytes[..]), Some(())); - assert_eq!(&too_many_bytes[..N], t.as_bytes()); - assert_eq!(too_many_bytes[N], 123); - - // `write_to_suffix` rejects slices that are too small. - assert_eq!(t.write_to_suffix(&mut vec![0; N - 1][..]), None); - - // `write_to_suffix` works with exact-sized slices. - let mut bytes = [0; N]; - assert_eq!(t.write_to_suffix(&mut bytes[..]), Some(())); - assert_eq!(bytes, t.as_bytes()); - - // `write_to_suffix` works with too-large slices, and any bytes - // before the suffix aren't modified. - let mut too_many_bytes = vec![0; N + 1]; - too_many_bytes[0] = 123; - assert_eq!(t.write_to_suffix(&mut too_many_bytes[..]), Some(())); - assert_eq!(&too_many_bytes[1..], t.as_bytes()); - assert_eq!(too_many_bytes[0], 123); - } - - #[derive(Debug, Eq, PartialEq, FromZeroes, FromBytes, AsBytes)] - #[repr(C)] - struct Foo { - a: u32, - b: Wrapping, - c: Option, - } - - let expected_bytes: Vec = if cfg!(target_endian = "little") { - vec![1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0] - } else { - vec![0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0] - }; - let post_mutation_expected_a = - if cfg!(target_endian = "little") { 0x00_00_00_FE } else { 0xFF_00_00_01 }; - test::<_, 12>( - &mut Foo { a: 1, b: Wrapping(2), c: None }, - expected_bytes.as_bytes(), - &Foo { a: post_mutation_expected_a, b: Wrapping(2), c: None }, - ); - test::<_, 3>( - Unsized::from_mut_slice(&mut [1, 2, 3]), - &[1, 2, 3], - Unsized::from_mut_slice(&mut [0xFE, 2, 3]), - ); - } - - #[test] - fn test_array() { - #[derive(FromZeroes, FromBytes, AsBytes)] - #[repr(C)] - struct Foo { - a: [u16; 33], - } - - let foo = Foo { a: [0xFFFF; 33] }; - let expected = [0xFFu8; 66]; - assert_eq!(foo.as_bytes(), &expected[..]); - } - - #[test] - fn test_display_debug() { - let buf = Align::<[u8; 8], u64>::default(); - let r = Ref::<_, u64>::new(&buf.t[..]).unwrap(); - assert_eq!(format!("{}", r), "0"); - assert_eq!(format!("{:?}", r), "Ref(0)"); - - let buf = Align::<[u8; 8], u64>::default(); - let r = Ref::<_, [u64]>::new_slice(&buf.t[..]).unwrap(); - assert_eq!(format!("{:?}", r), "Ref([0])"); - } - - #[test] - fn test_eq() { - let buf1 = 0_u64; - let r1 = Ref::<_, u64>::new(buf1.as_bytes()).unwrap(); - let buf2 = 0_u64; - let r2 = Ref::<_, u64>::new(buf2.as_bytes()).unwrap(); - assert_eq!(r1, r2); - } - - #[test] - fn test_ne() { - let buf1 = 0_u64; - let r1 = Ref::<_, u64>::new(buf1.as_bytes()).unwrap(); - let buf2 = 1_u64; - let r2 = Ref::<_, u64>::new(buf2.as_bytes()).unwrap(); - assert_ne!(r1, r2); - } - - #[test] - fn test_ord() { - let buf1 = 0_u64; - let r1 = Ref::<_, u64>::new(buf1.as_bytes()).unwrap(); - let buf2 = 1_u64; - let r2 = Ref::<_, u64>::new(buf2.as_bytes()).unwrap(); - assert!(r1 < r2); - } - - #[test] - fn test_new_zeroed() { - assert!(!bool::new_zeroed()); - assert_eq!(u64::new_zeroed(), 0); - // This test exists in order to exercise unsafe code, especially when - // running under Miri. - #[allow(clippy::unit_cmp)] - { - assert_eq!(<()>::new_zeroed(), ()); - } - } - - #[test] - fn test_transparent_packed_generic_struct() { - #[derive(AsBytes, FromZeroes, FromBytes, Unaligned)] - #[repr(transparent)] - struct Foo { - _t: T, - _phantom: PhantomData<()>, - } - - assert_impl_all!(Foo: FromZeroes, FromBytes, AsBytes); - assert_impl_all!(Foo: Unaligned); - - #[derive(AsBytes, FromZeroes, FromBytes, Unaligned)] - #[repr(packed)] - struct Bar { - _t: T, - _u: U, - } - - assert_impl_all!(Bar: FromZeroes, FromBytes, AsBytes, Unaligned); - } - - #[test] - fn test_impls() { - // Asserts that `$ty` implements any `$trait` and doesn't implement any - // `!$trait`. Note that all `$trait`s must come before any `!$trait`s. - macro_rules! assert_impls { - ($ty:ty: $trait:ident) => { - #[allow(dead_code)] - const _: () = { static_assertions::assert_impl_all!($ty: $trait); }; - }; - ($ty:ty: !$trait:ident) => { - #[allow(dead_code)] - const _: () = { static_assertions::assert_not_impl_any!($ty: $trait); }; - }; - ($ty:ty: $($trait:ident),* $(,)? $(!$negative_trait:ident),*) => { - $( - assert_impls!($ty: $trait); - )* - - $( - assert_impls!($ty: !$negative_trait); - )* - }; - } - - assert_impls!((): KnownLayout, FromZeroes, FromBytes, AsBytes, Unaligned); - assert_impls!(u8: KnownLayout, FromZeroes, FromBytes, AsBytes, Unaligned); - assert_impls!(i8: KnownLayout, FromZeroes, FromBytes, AsBytes, Unaligned); - assert_impls!(u16: KnownLayout, FromZeroes, FromBytes, AsBytes, !Unaligned); - assert_impls!(i16: KnownLayout, FromZeroes, FromBytes, AsBytes, !Unaligned); - assert_impls!(u32: KnownLayout, FromZeroes, FromBytes, AsBytes, !Unaligned); - assert_impls!(i32: KnownLayout, FromZeroes, FromBytes, AsBytes, !Unaligned); - assert_impls!(u64: KnownLayout, FromZeroes, FromBytes, AsBytes, !Unaligned); - assert_impls!(i64: KnownLayout, FromZeroes, FromBytes, AsBytes, !Unaligned); - assert_impls!(u128: KnownLayout, FromZeroes, FromBytes, AsBytes, !Unaligned); - assert_impls!(i128: KnownLayout, FromZeroes, FromBytes, AsBytes, !Unaligned); - assert_impls!(usize: KnownLayout, FromZeroes, FromBytes, AsBytes, !Unaligned); - assert_impls!(isize: KnownLayout, FromZeroes, FromBytes, AsBytes, !Unaligned); - assert_impls!(f32: KnownLayout, FromZeroes, FromBytes, AsBytes, !Unaligned); - assert_impls!(f64: KnownLayout, FromZeroes, FromBytes, AsBytes, !Unaligned); - - assert_impls!(bool: KnownLayout, FromZeroes, AsBytes, Unaligned, !FromBytes); - assert_impls!(char: KnownLayout, FromZeroes, AsBytes, !FromBytes, !Unaligned); - assert_impls!(str: KnownLayout, FromZeroes, AsBytes, Unaligned, !FromBytes); - - assert_impls!(NonZeroU8: KnownLayout, AsBytes, Unaligned, !FromZeroes, !FromBytes); - assert_impls!(NonZeroI8: KnownLayout, AsBytes, Unaligned, !FromZeroes, !FromBytes); - assert_impls!(NonZeroU16: KnownLayout, AsBytes, !FromZeroes, !FromBytes, !Unaligned); - assert_impls!(NonZeroI16: KnownLayout, AsBytes, !FromZeroes, !FromBytes, !Unaligned); - assert_impls!(NonZeroU32: KnownLayout, AsBytes, !FromZeroes, !FromBytes, !Unaligned); - assert_impls!(NonZeroI32: KnownLayout, AsBytes, !FromZeroes, !FromBytes, !Unaligned); - assert_impls!(NonZeroU64: KnownLayout, AsBytes, !FromZeroes, !FromBytes, !Unaligned); - assert_impls!(NonZeroI64: KnownLayout, AsBytes, !FromZeroes, !FromBytes, !Unaligned); - assert_impls!(NonZeroU128: KnownLayout, AsBytes, !FromZeroes, !FromBytes, !Unaligned); - assert_impls!(NonZeroI128: KnownLayout, AsBytes, !FromZeroes, !FromBytes, !Unaligned); - assert_impls!(NonZeroUsize: KnownLayout, AsBytes, !FromZeroes, !FromBytes, !Unaligned); - assert_impls!(NonZeroIsize: KnownLayout, AsBytes, !FromZeroes, !FromBytes, !Unaligned); - - assert_impls!(Option: KnownLayout, FromZeroes, FromBytes, AsBytes, Unaligned); - assert_impls!(Option: KnownLayout, FromZeroes, FromBytes, AsBytes, Unaligned); - assert_impls!(Option: KnownLayout, FromZeroes, FromBytes, AsBytes, !Unaligned); - assert_impls!(Option: KnownLayout, FromZeroes, FromBytes, AsBytes, !Unaligned); - assert_impls!(Option: KnownLayout, FromZeroes, FromBytes, AsBytes, !Unaligned); - assert_impls!(Option: KnownLayout, FromZeroes, FromBytes, AsBytes, !Unaligned); - assert_impls!(Option: KnownLayout, FromZeroes, FromBytes, AsBytes, !Unaligned); - assert_impls!(Option: KnownLayout, FromZeroes, FromBytes, AsBytes, !Unaligned); - assert_impls!(Option: KnownLayout, FromZeroes, FromBytes, AsBytes, !Unaligned); - assert_impls!(Option: KnownLayout, FromZeroes, FromBytes, AsBytes, !Unaligned); - assert_impls!(Option: KnownLayout, FromZeroes, FromBytes, AsBytes, !Unaligned); - assert_impls!(Option: KnownLayout, FromZeroes, FromBytes, AsBytes, !Unaligned); - - // Implements none of the ZC traits. - struct NotZerocopy; - - assert_impls!(PhantomData: KnownLayout, FromZeroes, FromBytes, AsBytes, Unaligned); - assert_impls!(PhantomData<[u8]>: KnownLayout, FromZeroes, FromBytes, AsBytes, Unaligned); - - assert_impls!(ManuallyDrop: KnownLayout, FromZeroes, FromBytes, AsBytes, Unaligned); - assert_impls!(ManuallyDrop<[u8]>: KnownLayout, FromZeroes, FromBytes, AsBytes, Unaligned); - assert_impls!(ManuallyDrop: !KnownLayout, !FromZeroes, !FromBytes, !AsBytes, !Unaligned); - assert_impls!(ManuallyDrop<[NotZerocopy]>: !KnownLayout, !FromZeroes, !FromBytes, !AsBytes, !Unaligned); - - assert_impls!(MaybeUninit: KnownLayout, FromZeroes, FromBytes, Unaligned, !AsBytes); - assert_impls!(MaybeUninit: KnownLayout, !FromZeroes, !FromBytes, !AsBytes, !Unaligned); - - assert_impls!(Wrapping: KnownLayout, FromZeroes, FromBytes, AsBytes, Unaligned); - assert_impls!(Wrapping: KnownLayout, !FromZeroes, !FromBytes, !AsBytes, !Unaligned); - - assert_impls!(Unalign: KnownLayout, FromZeroes, FromBytes, AsBytes, Unaligned); - assert_impls!(Unalign: KnownLayout, Unaligned, !FromZeroes, !FromBytes, !AsBytes); - - assert_impls!([u8]: KnownLayout, FromZeroes, FromBytes, AsBytes, Unaligned); - assert_impls!([NotZerocopy]: !KnownLayout, !FromZeroes, !FromBytes, !AsBytes, !Unaligned); - assert_impls!([u8; 0]: KnownLayout, FromZeroes, FromBytes, AsBytes, Unaligned); - assert_impls!([NotZerocopy; 0]: KnownLayout, !FromZeroes, !FromBytes, !AsBytes, !Unaligned); - assert_impls!([u8; 1]: KnownLayout, FromZeroes, FromBytes, AsBytes, Unaligned); - assert_impls!([NotZerocopy; 1]: KnownLayout, !FromZeroes, !FromBytes, !AsBytes, !Unaligned); - - #[cfg(feature = "simd")] - { - #[allow(unused_macros)] - macro_rules! test_simd_arch_mod { - ($arch:ident, $($typ:ident),*) => { - { - use core::arch::$arch::{$($typ),*}; - use crate::*; - $( assert_impls!($typ: KnownLayout, FromZeroes, FromBytes, AsBytes, !Unaligned); )* - } - }; - } - #[cfg(target_arch = "x86")] - test_simd_arch_mod!(x86, __m128, __m128d, __m128i, __m256, __m256d, __m256i); - - #[cfg(all(feature = "simd-nightly", target_arch = "x86"))] - test_simd_arch_mod!(x86, __m512bh, __m512, __m512d, __m512i); - - #[cfg(target_arch = "x86_64")] - test_simd_arch_mod!(x86_64, __m128, __m128d, __m128i, __m256, __m256d, __m256i); - - #[cfg(all(feature = "simd-nightly", target_arch = "x86_64"))] - test_simd_arch_mod!(x86_64, __m512bh, __m512, __m512d, __m512i); - - #[cfg(target_arch = "wasm32")] - test_simd_arch_mod!(wasm32, v128); - - #[cfg(all(feature = "simd-nightly", target_arch = "powerpc"))] - test_simd_arch_mod!( - powerpc, - vector_bool_long, - vector_double, - vector_signed_long, - vector_unsigned_long - ); - - #[cfg(all(feature = "simd-nightly", target_arch = "powerpc64"))] - test_simd_arch_mod!( - powerpc64, - vector_bool_long, - vector_double, - vector_signed_long, - vector_unsigned_long - ); - #[cfg(target_arch = "aarch64")] - #[rustfmt::skip] - test_simd_arch_mod!( - aarch64, float32x2_t, float32x4_t, float64x1_t, float64x2_t, int8x8_t, int8x8x2_t, - int8x8x3_t, int8x8x4_t, int8x16_t, int8x16x2_t, int8x16x3_t, int8x16x4_t, int16x4_t, - int16x8_t, int32x2_t, int32x4_t, int64x1_t, int64x2_t, poly8x8_t, poly8x8x2_t, poly8x8x3_t, - poly8x8x4_t, poly8x16_t, poly8x16x2_t, poly8x16x3_t, poly8x16x4_t, poly16x4_t, poly16x8_t, - poly64x1_t, poly64x2_t, uint8x8_t, uint8x8x2_t, uint8x8x3_t, uint8x8x4_t, uint8x16_t, - uint8x16x2_t, uint8x16x3_t, uint8x16x4_t, uint16x4_t, uint16x8_t, uint32x2_t, uint32x4_t, - uint64x1_t, uint64x2_t - ); - #[cfg(all(feature = "simd-nightly", target_arch = "arm"))] - #[rustfmt::skip] - test_simd_arch_mod!(arm, int8x4_t, uint8x4_t); - } - } -} diff -Nru temporalio-1.3.0/vendor/zerocopy/src/macros.rs temporalio-1.3.0/vendor/zerocopy/src/macros.rs --- temporalio-1.3.0/vendor/zerocopy/src/macros.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/src/macros.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,289 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -/// Documents multiple unsafe blocks with a single safety comment. -/// -/// Invoked as: -/// -/// ```rust,ignore -/// safety_comment! { -/// // Non-doc comments come first. -/// /// SAFETY: -/// /// Safety comment starts on its own line. -/// macro_1!(args); -/// macro_2! { args }; -/// /// SAFETY: -/// /// Subsequent safety comments are allowed but not required. -/// macro_3! { args }; -/// } -/// ``` -/// -/// The macro invocations are emitted, each decorated with the following -/// attribute: `#[allow(clippy::undocumented_unsafe_blocks)]`. -macro_rules! safety_comment { - (#[doc = r" SAFETY:"] $($(#[doc = $_doc:literal])* $macro:ident!$args:tt;)*) => { - #[allow(clippy::undocumented_unsafe_blocks)] - const _: () = { $($macro!$args;)* }; - } -} - -/// Unsafely implements trait(s) for a type. -macro_rules! unsafe_impl { - // Implement `$trait` for `$ty` with no bounds. - ($ty:ty: $trait:ty) => { - unsafe impl $trait for $ty { #[allow(clippy::missing_inline_in_public_items)] fn only_derive_is_allowed_to_implement_this_trait() {} } - }; - // Implement all `$traits` for `$ty` with no bounds. - ($ty:ty: $($traits:ty),*) => { - $( unsafe_impl!($ty: $traits); )* - }; - // This arm is identical to the following one, except it contains a - // preceding `const`. If we attempt to handle these with a single arm, there - // is an inherent ambiguity between `const` (the keyword) and `const` (the - // ident match for `$tyvar:ident`). - // - // To explain how this works, consider the following invocation: - // - // unsafe_impl!(const N: usize, T: ?Sized + Copy => Clone for Foo); - // - // In this invocation, here are the assignments to meta-variables: - // - // |---------------|------------| - // | Meta-variable | Assignment | - // |---------------|------------| - // | $constname | N | - // | $constty | usize | - // | $tyvar | T | - // | $optbound | Sized | - // | $bound | Copy | - // | $trait | Clone | - // | $ty | Foo | - // |---------------|------------| - // - // The following arm has the same behavior with the exception of the lack of - // support for a leading `const` parameter. - ( - const $constname:ident : $constty:ident $(,)? - $($tyvar:ident $(: $(? $optbound:ident $(+)?)* $($bound:ident $(+)?)* )?),* - => $trait:ident for $ty:ty - ) => { - unsafe_impl!( - @inner - @const $constname: $constty, - $($tyvar $(: $(? $optbound +)* + $($bound +)*)?,)* - => $trait for $ty - ); - }; - ( - $($tyvar:ident $(: $(? $optbound:ident $(+)?)* $($bound:ident $(+)?)* )?),* - => $trait:ident for $ty:ty - ) => { - unsafe_impl!( - @inner - $($tyvar $(: $(? $optbound +)* + $($bound +)*)?,)* - => $trait for $ty - ); - }; - ( - @inner - $(@const $constname:ident : $constty:ident,)* - $($tyvar:ident $(: $(? $optbound:ident +)* + $($bound:ident +)* )?,)* - => $trait:ident for $ty:ty - ) => { - unsafe impl<$(const $constname: $constty,)* $($tyvar $(: $(? $optbound +)* $($bound +)*)?),*> $trait for $ty { - #[allow(clippy::missing_inline_in_public_items)] - fn only_derive_is_allowed_to_implement_this_trait() {} - } - }; -} - -/// Implements trait(s) for a type or verifies the given implementation by -/// referencing an existing (derived) implementation. -/// -/// This macro exists so that we can provide zerocopy-derive as an optional -/// dependency and still get the benefit of using its derives to validate that -/// our trait impls are sound. -/// -/// When compiling without `--cfg 'feature = "derive"` and without `--cfg test`, -/// `impl_or_verify!` emits the provided trait impl. When compiling with either -/// of those cfgs, it is expected that the type in question is deriving the -/// traits instead. In this case, `impl_or_verify!` emits code which validates -/// that the given trait impl is at least as restrictive as the the impl emitted -/// by the custom derive. This has the effect of confirming that the impl which -/// is emitted when the `derive` feature is disabled is actually sound (on the -/// assumption that the impl emitted by the custom derive is sound). -/// -/// The caller is still required to provide a safety comment (e.g. using the -/// `safety_comment!` macro) . The reason for this restriction is that, while -/// `impl_or_verify!` can guarantee that the provided impl is sound when it is -/// compiled with the appropriate cfgs, there is no way to guarantee that it is -/// ever compiled with those cfgs. In particular, it would be possible to -/// accidentally place an `impl_or_verify!` call in a context that is only ever -/// compiled when the `derive` feature is disabled. If that were to happen, -/// there would be nothing to prevent an unsound trait impl from being emitted. -/// Requiring a safety comment reduces the likelihood of emitting an unsound -/// impl in this case, and also provides useful documentation for readers of the -/// code. -/// -/// ## Example -/// -/// ```rust,ignore -/// // Note that these derives are gated by `feature = "derive"` -/// #[cfg_attr(any(feature = "derive", test), derive(FromZeroes, FromBytes, AsBytes, Unaligned))] -/// #[repr(transparent)] -/// struct Wrapper(T); -/// -/// safety_comment! { -/// /// SAFETY: -/// /// `Wrapper` is `repr(transparent)`, so it is sound to implement any -/// /// zerocopy trait if `T` implements that trait. -/// impl_or_verify!(T: FromZeroes => FromZeroes for Wrapper); -/// impl_or_verify!(T: FromBytes => FromBytes for Wrapper); -/// impl_or_verify!(T: AsBytes => AsBytes for Wrapper); -/// impl_or_verify!(T: Unaligned => Unaligned for Wrapper); -/// } -/// ``` -macro_rules! impl_or_verify { - // The following two match arms follow the same pattern as their - // counterparts in `unsafe_impl!`; see the documentation on those arms for - // more details. - ( - const $constname:ident : $constty:ident $(,)? - $($tyvar:ident $(: $(? $optbound:ident $(+)?)* $($bound:ident $(+)?)* )?),* - => $trait:ident for $ty:ty - ) => { - impl_or_verify!(@impl { unsafe_impl!( - const $constname: $constty, $($tyvar $(: $(? $optbound +)* $($bound +)*)?),* => $trait for $ty - ); }); - impl_or_verify!(@verify $trait, { - impl Subtrait for $ty {} - }); - }; - ( - $($tyvar:ident $(: $(? $optbound:ident $(+)?)* $($bound:ident $(+)?)* )?),* - => $trait:ident for $ty:ty - ) => { - impl_or_verify!(@impl { unsafe_impl!( - $($tyvar $(: $(? $optbound +)* $($bound +)*)?),* => $trait for $ty - ); }); - impl_or_verify!(@verify $trait, { - impl<$($tyvar $(: $(? $optbound +)* $($bound +)*)?),*> Subtrait for $ty {} - }); - }; - ( - $($tyvar:ident $(: $(? $optbound:ident $(+)?)* $($bound:ident $(+)?)* )?),* - => $trait:ident for $ty:ty - ) => { - unsafe_impl!( - @inner - $($tyvar $(: $(? $optbound +)* + $($bound +)*)?,)* - => $trait for $ty - ); - }; - (@impl $impl_block:tt) => { - #[cfg(not(any(feature = "derive", test)))] - const _: () = { $impl_block }; - }; - (@verify $trait:ident, $impl_block:tt) => { - #[cfg(any(feature = "derive", test))] - const _: () = { - trait Subtrait: $trait {} - $impl_block - }; - }; -} - -/// Implements `KnownLayout` for a sized type. -macro_rules! impl_known_layout { - ($(const $constvar:ident : $constty:ty, $tyvar:ident $(: ?$optbound:ident)? => $ty:ty),* $(,)?) => { - $(impl_known_layout!(@inner const $constvar: $constty, $tyvar $(: ?$optbound)? => $ty);)* - }; - ($($tyvar:ident $(: ?$optbound:ident)? => $ty:ty),* $(,)?) => { - $(impl_known_layout!(@inner , $tyvar $(: ?$optbound)? => $ty);)* - }; - ($($ty:ty),*) => { $(impl_known_layout!(@inner , => $ty);)* }; - (@inner $(const $constvar:ident : $constty:ty)? , $($tyvar:ident $(: ?$optbound:ident)?)? => $ty:ty) => { - const _: () = { - use core::ptr::NonNull; - - // SAFETY: Delegates safety to `DstLayout::for_type`. - unsafe impl<$(const $constvar : $constty,)? $($tyvar $(: ?$optbound)?)?> KnownLayout for $ty { - #[allow(clippy::missing_inline_in_public_items)] - fn only_derive_is_allowed_to_implement_this_trait() where Self: Sized {} - - const LAYOUT: DstLayout = DstLayout::for_type::<$ty>(); - - // SAFETY: `.cast` preserves address and provenance. - // - // TODO(#429): Add documentation to `.cast` that promises that - // it preserves provenance. - #[inline(always)] - fn raw_from_ptr_len(bytes: NonNull, _elems: usize) -> NonNull { - bytes.cast::() - } - } - }; - }; -} - -/// Implements `KnownLayout` for a type in terms of the implementation of -/// another type with the same representation. -/// -/// # Safety -/// -/// - `$ty` and `$repr` must have the same: -/// - Fixed prefix size -/// - Alignment -/// - (For DSTs) trailing slice element size -/// - It must be valid to perform an `as` cast from `*mut $repr` to `*mut $ty`, -/// and this operation must preserve referent size (ie, `size_of_val_raw`). -macro_rules! unsafe_impl_known_layout { - ($($tyvar:ident: ?Sized + KnownLayout =>)? #[repr($repr:ty)] $ty:ty) => { - const _: () = { - use core::ptr::NonNull; - - unsafe impl<$($tyvar: ?Sized + KnownLayout)?> KnownLayout for $ty { - #[allow(clippy::missing_inline_in_public_items)] - fn only_derive_is_allowed_to_implement_this_trait() {} - - const LAYOUT: DstLayout = <$repr as KnownLayout>::LAYOUT; - - // SAFETY: All operations preserve address and provenance. - // Caller has promised that the `as` cast preserves size. - // - // TODO(#429): Add documentation to `NonNull::new_unchecked` - // that it preserves provenance. - #[inline(always)] - #[allow(unused_qualifications)] // for `core::ptr::NonNull` - fn raw_from_ptr_len(bytes: NonNull, elems: usize) -> NonNull { - #[allow(clippy::as_conversions)] - let ptr = <$repr>::raw_from_ptr_len(bytes, elems).as_ptr() as *mut Self; - // SAFETY: `ptr` was converted from `bytes`, which is non-null. - unsafe { NonNull::new_unchecked(ptr) } - } - } - }; - }; -} - -/// Uses `align_of` to confirm that a type or set of types have alignment 1. -/// -/// Note that `align_of` requires `T: Sized`, so this macro doesn't work for -/// unsized types. -macro_rules! assert_unaligned { - ($ty:ty) => { - // We only compile this assertion under `cfg(test)` to avoid taking an - // extra non-dev dependency (and making this crate more expensive to - // compile for our dependents). - #[cfg(test)] - static_assertions::const_assert_eq!(core::mem::align_of::<$ty>(), 1); - }; - ($($ty:ty),*) => { - $(assert_unaligned!($ty);)* - }; -} diff -Nru temporalio-1.3.0/vendor/zerocopy/src/macro_util.rs temporalio-1.3.0/vendor/zerocopy/src/macro_util.rs --- temporalio-1.3.0/vendor/zerocopy/src/macro_util.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/src/macro_util.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,336 +0,0 @@ -// Copyright 2022 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -//! Utilities used by macros and by `zerocopy-derive`. -//! -//! These are defined here `zerocopy` rather than in code generated by macros or -//! by `zerocopy-derive` so that they can be compiled once rather than -//! recompiled for every invocation (e.g., if they were defined in generated -//! code, then deriving `AsBytes` and `FromBytes` on three different types would -//! result in the code in question being emitted and compiled six different -//! times). - -#![allow(missing_debug_implementations)] - -use core::{marker::PhantomData, mem::ManuallyDrop}; - -/// A compile-time check that should be one particular value. -pub trait ShouldBe {} - -/// A struct for checking whether `T` contains padding. -pub struct HasPadding(PhantomData); - -impl ShouldBe for HasPadding {} - -/// A type whose size is equal to `align_of::()`. -#[repr(C)] -pub struct AlignOf { - // This field ensures that: - // - The size is always at least 1 (the minimum possible alignment). - // - If the alignment is greater than 1, Rust has to round up to the next - // multiple of it in order to make sure that `Align`'s size is a multiple - // of that alignment. Without this field, its size could be 0, which is a - // valid multiple of any alignment. - _u: u8, - _a: [T; 0], -} - -impl AlignOf { - #[inline(never)] // Make `missing_inline_in_public_items` happy. - pub fn into_t(self) -> T { - unreachable!() - } -} - -/// A type whose size is equal to `max(align_of::(), align_of::())`. -#[repr(C)] -pub union MaxAlignsOf { - _t: ManuallyDrop>, - _u: ManuallyDrop>, -} - -impl MaxAlignsOf { - #[inline(never)] // Make `missing_inline_in_public_items` happy. - pub fn new(_t: T, _u: U) -> MaxAlignsOf { - unreachable!() - } -} - -/// Does the struct type `$t` have padding? -/// -/// `$ts` is the list of the type of every field in `$t`. `$t` must be a -/// struct type, or else `struct_has_padding!`'s result may be meaningless. -/// -/// Note that `struct_has_padding!`'s results are independent of `repr` since -/// they only consider the size of the type and the sizes of the fields. -/// Whatever the repr, the size of the type already takes into account any -/// padding that the compiler has decided to add. Structs with well-defined -/// representations (such as `repr(C)`) can use this macro to check for padding. -/// Note that while this may yield some consistent value for some `repr(Rust)` -/// structs, it is not guaranteed across platforms or compilations. -#[doc(hidden)] // `#[macro_export]` bypasses this module's `#[doc(hidden)]`. -#[macro_export] -macro_rules! struct_has_padding { - ($t:ty, $($ts:ty),*) => { - core::mem::size_of::<$t>() > 0 $(+ core::mem::size_of::<$ts>())* - }; -} - -/// Does the union type `$t` have padding? -/// -/// `$ts` is the list of the type of every field in `$t`. `$t` must be a -/// union type, or else `union_has_padding!`'s result may be meaningless. -/// -/// Note that `union_has_padding!`'s results are independent of `repr` since -/// they only consider the size of the type and the sizes of the fields. -/// Whatever the repr, the size of the type already takes into account any -/// padding that the compiler has decided to add. Unions with well-defined -/// representations (such as `repr(C)`) can use this macro to check for padding. -/// Note that while this may yield some consistent value for some `repr(Rust)` -/// unions, it is not guaranteed across platforms or compilations. -#[doc(hidden)] // `#[macro_export]` bypasses this module's `#[doc(hidden)]`. -#[macro_export] -macro_rules! union_has_padding { - ($t:ty, $($ts:ty),*) => { - false $(|| core::mem::size_of::<$t>() != core::mem::size_of::<$ts>())* - }; -} - -/// Does `t` have alignment greater than or equal to `u`? If not, this macro -/// produces a compile error. It must be invoked in a dead codepath. This is -/// used in `transmute_ref!` and `transmute_mut!`. -#[doc(hidden)] // `#[macro_export]` bypasses this module's `#[doc(hidden)]`. -#[macro_export] -macro_rules! assert_align_gt_eq { - ($t:ident, $u: ident) => {{ - // The comments here should be read in the context of this macro's - // invocations in `transmute_ref!` and `transmute_mut!`. - if false { - // The type wildcard in this bound is inferred to be `T` because - // `align_of.into_t()` is assigned to `t` (which has type `T`). - let align_of: $crate::macro_util::AlignOf<_> = unreachable!(); - $t = align_of.into_t(); - // `max_aligns` is inferred to have type `MaxAlignsOf` because - // of the inferred types of `t` and `u`. - let mut max_aligns = $crate::macro_util::MaxAlignsOf::new($t, $u); - - // This transmute will only compile successfully if - // `align_of::() == max(align_of::(), align_of::())` - in - // other words, if `align_of::() >= align_of::()`. - // - // SAFETY: This code is never run. - max_aligns = unsafe { $crate::macro_util::core_reexport::mem::transmute(align_of) }; - } else { - loop {} - } - }}; -} - -/// Do `t` and `u` have the same size? If not, this macro produces a compile -/// error. It must be invoked in a dead codepath. This is used in -/// `transmute_ref!` and `transmute_mut!`. -#[doc(hidden)] // `#[macro_export]` bypasses this module's `#[doc(hidden)]`. -#[macro_export] -macro_rules! assert_size_eq { - ($t:ident, $u: ident) => {{ - // The comments here should be read in the context of this macro's - // invocations in `transmute_ref!` and `transmute_mut!`. - if false { - // SAFETY: This code is never run. - $u = unsafe { - // Clippy: It's okay to transmute a type to itself. - #[allow(clippy::useless_transmute)] - $crate::macro_util::core_reexport::mem::transmute($t) - }; - } else { - loop {} - } - }}; -} - -/// Transmutes a reference of one type to a reference of another type. -/// -/// # Safety -/// -/// The caller must guarantee that: -/// - `Src: AsBytes` -/// - `Dst: FromBytes` -/// - `size_of::() == size_of::()` -/// - `align_of::() >= align_of::()` -#[inline(always)] -pub const unsafe fn transmute_ref<'dst, 'src: 'dst, Src: 'src, Dst: 'dst>( - src: &'src Src, -) -> &'dst Dst { - let src: *const Src = src; - let dst = src.cast::(); - // SAFETY: - // - We know that it is sound to view the target type of the input reference - // (`Src`) as the target type of the output reference (`Dst`) because the - // caller has guaranteed that `Src: AsBytes`, `Dst: FromBytes`, and - // `size_of::() == size_of::()`. - // - We know that there are no `UnsafeCell`s, and thus we don't have to - // worry about `UnsafeCell` overlap, because `Src: AsBytes` and `Dst: - // FromBytes` both forbid `UnsafeCell`s. - // - The caller has guaranteed that alignment is not increased. - // - We know that the returned lifetime will not outlive the input lifetime - // thanks to the lifetime bounds on this function. - unsafe { &*dst } -} - -/// Transmutes a mutable reference of one type to a mutable reference of another -/// type. -/// -/// # Safety -/// -/// The caller must guarantee that: -/// - `Src: FromBytes + AsBytes` -/// - `Dst: FromBytes + AsBytes` -/// - `size_of::() == size_of::()` -/// - `align_of::() >= align_of::()` -#[inline(always)] -pub unsafe fn transmute_mut<'dst, 'src: 'dst, Src: 'src, Dst: 'dst>( - src: &'src mut Src, -) -> &'dst mut Dst { - let src: *mut Src = src; - let dst = src.cast::(); - // SAFETY: - // - We know that it is sound to view the target type of the input reference - // (`Src`) as the target type of the output reference (`Dst`) and - // vice-versa because the caller has guaranteed that `Src: FromBytes + - // AsBytes`, `Dst: FromBytes + AsBytes`, and `size_of::() == - // size_of::()`. - // - We know that there are no `UnsafeCell`s, and thus we don't have to - // worry about `UnsafeCell` overlap, because `Src: FromBytes + AsBytes` - // and `Dst: FromBytes + AsBytes` forbid `UnsafeCell`s. - // - The caller has guaranteed that alignment is not increased. - // - We know that the returned lifetime will not outlive the input lifetime - // thanks to the lifetime bounds on this function. - unsafe { &mut *dst } -} - -pub mod core_reexport { - pub mod mem { - pub use core::mem::transmute; - } -} - -#[cfg(test)] -mod tests { - use core::mem; - - use super::*; - use crate::util::testutil::*; - - #[test] - fn test_align_of() { - macro_rules! test { - ($ty:ty) => { - assert_eq!(mem::size_of::>(), mem::align_of::<$ty>()); - }; - } - - test!(()); - test!(u8); - test!(AU64); - test!([AU64; 2]); - } - - #[test] - fn test_max_aligns_of() { - macro_rules! test { - ($t:ty, $u:ty) => { - assert_eq!( - mem::size_of::>(), - core::cmp::max(mem::align_of::<$t>(), mem::align_of::<$u>()) - ); - }; - } - - test!(u8, u8); - test!(u8, AU64); - test!(AU64, u8); - } - - #[test] - fn test_typed_align_check() { - // Test that the type-based alignment check used in - // `assert_align_gt_eq!` behaves as expected. - - macro_rules! assert_t_align_gteq_u_align { - ($t:ty, $u:ty, $gteq:expr) => { - assert_eq!( - mem::size_of::>() == mem::size_of::>(), - $gteq - ); - }; - } - - assert_t_align_gteq_u_align!(u8, u8, true); - assert_t_align_gteq_u_align!(AU64, AU64, true); - assert_t_align_gteq_u_align!(AU64, u8, true); - assert_t_align_gteq_u_align!(u8, AU64, false); - } - - #[test] - fn test_struct_has_padding() { - // Test that, for each provided repr, `struct_has_padding!` reports the - // expected value. - macro_rules! test { - (#[$cfg:meta] ($($ts:ty),*) => $expect:expr) => {{ - #[$cfg] - struct Test($($ts),*); - assert_eq!(struct_has_padding!(Test, $($ts),*), $expect); - }}; - (#[$cfg:meta] $(#[$cfgs:meta])* ($($ts:ty),*) => $expect:expr) => { - test!(#[$cfg] ($($ts),*) => $expect); - test!($(#[$cfgs])* ($($ts),*) => $expect); - }; - } - - test!(#[repr(C)] #[repr(transparent)] #[repr(packed)] () => false); - test!(#[repr(C)] #[repr(transparent)] #[repr(packed)] (u8) => false); - test!(#[repr(C)] #[repr(transparent)] #[repr(packed)] (u8, ()) => false); - test!(#[repr(C)] #[repr(packed)] (u8, u8) => false); - - test!(#[repr(C)] (u8, AU64) => true); - // Rust won't let you put `#[repr(packed)]` on a type which contains a - // `#[repr(align(n > 1))]` type (`AU64`), so we have to use `u64` here. - // It's not ideal, but it definitely has align > 1 on /some/ of our CI - // targets, and this isn't a particularly complex macro we're testing - // anyway. - test!(#[repr(packed)] (u8, u64) => false); - } - - #[test] - fn test_union_has_padding() { - // Test that, for each provided repr, `union_has_padding!` reports the - // expected value. - macro_rules! test { - (#[$cfg:meta] {$($fs:ident: $ts:ty),*} => $expect:expr) => {{ - #[$cfg] - #[allow(unused)] // fields are never read - union Test{ $($fs: $ts),* } - assert_eq!(union_has_padding!(Test, $($ts),*), $expect); - }}; - (#[$cfg:meta] $(#[$cfgs:meta])* {$($fs:ident: $ts:ty),*} => $expect:expr) => { - test!(#[$cfg] {$($fs: $ts),*} => $expect); - test!($(#[$cfgs])* {$($fs: $ts),*} => $expect); - }; - } - - test!(#[repr(C)] #[repr(packed)] {a: u8} => false); - test!(#[repr(C)] #[repr(packed)] {a: u8, b: u8} => false); - - // Rust won't let you put `#[repr(packed)]` on a type which contains a - // `#[repr(align(n > 1))]` type (`AU64`), so we have to use `u64` here. - // It's not ideal, but it definitely has align > 1 on /some/ of our CI - // targets, and this isn't a particularly complex macro we're testing - // anyway. - test!(#[repr(C)] #[repr(packed)] {a: u8, b: u64} => true); - } -} diff -Nru temporalio-1.3.0/vendor/zerocopy/src/third_party/rust/layout.rs temporalio-1.3.0/vendor/zerocopy/src/third_party/rust/layout.rs --- temporalio-1.3.0/vendor/zerocopy/src/third_party/rust/layout.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/src/third_party/rust/layout.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,44 +0,0 @@ -use core::num::NonZeroUsize; - -/// Returns the amount of padding we must insert after `len` bytes to ensure -/// that the following address will satisfy `align` (measured in bytes). -/// -/// e.g., if `len` is 9, then `padding_needed_for(len, 4)` returns 3, because -/// that is the minimum number of bytes of padding required to get a 4-aligned -/// address (assuming that the corresponding memory block starts at a 4-aligned -/// address). -/// -/// The return value of this function has no meaning if `align` is not a -/// power-of-two. -/// -/// # Panics -/// -/// May panic if `align` is not a power of two. -// -// TODO(#419): Replace `len` with a witness type for region size. -#[inline(always)] -pub(crate) const fn _padding_needed_for(len: usize, align: NonZeroUsize) -> usize { - // Rounded up value is: - // len_rounded_up = (len + align - 1) & !(align - 1); - // and then we return the padding difference: `len_rounded_up - len`. - // - // We use modular arithmetic throughout: - // - // 1. align is guaranteed to be > 0, so align - 1 is always - // valid. - // - // 2. `len + align - 1` can overflow by at most `align - 1`, - // so the &-mask with `!(align - 1)` will ensure that in the - // case of overflow, `len_rounded_up` will itself be 0. - // Thus the returned padding, when added to `len`, yields 0, - // which trivially satisfies the alignment `align`. - // - // (Of course, attempts to allocate blocks of memory whose - // size and padding overflow in the above manner should cause - // the allocator to yield an error anyway.) - - let align = align.get(); - debug_assert!(align.is_power_of_two()); - let len_rounded_up = len.wrapping_add(align).wrapping_sub(1) & !align.wrapping_sub(1); - len_rounded_up.wrapping_sub(len) -} diff -Nru temporalio-1.3.0/vendor/zerocopy/src/third_party/rust/LICENSE-APACHE temporalio-1.3.0/vendor/zerocopy/src/third_party/rust/LICENSE-APACHE --- temporalio-1.3.0/vendor/zerocopy/src/third_party/rust/LICENSE-APACHE 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/src/third_party/rust/LICENSE-APACHE 1970-01-01 00:00:00.000000000 +0000 @@ -1,176 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS diff -Nru temporalio-1.3.0/vendor/zerocopy/src/third_party/rust/LICENSE-MIT temporalio-1.3.0/vendor/zerocopy/src/third_party/rust/LICENSE-MIT --- temporalio-1.3.0/vendor/zerocopy/src/third_party/rust/LICENSE-MIT 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/src/third_party/rust/LICENSE-MIT 1970-01-01 00:00:00.000000000 +0000 @@ -1,23 +0,0 @@ -Permission is hereby granted, free of charge, to any -person obtaining a copy of this software and associated -documentation files (the "Software"), to deal in the -Software without restriction, including without -limitation the rights to use, copy, modify, merge, -publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software -is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice -shall be included in all copies or substantial portions -of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. diff -Nru temporalio-1.3.0/vendor/zerocopy/src/third_party/rust/README.fuchsia temporalio-1.3.0/vendor/zerocopy/src/third_party/rust/README.fuchsia --- temporalio-1.3.0/vendor/zerocopy/src/third_party/rust/README.fuchsia 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/src/third_party/rust/README.fuchsia 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ -Name: rust -License File: LICENSE-APACHE -License File: LICENSE-MIT -Description: - -See https://github.com/google/zerocopy/pull/492 for an explanation of why this -file exists. diff -Nru temporalio-1.3.0/vendor/zerocopy/src/util.rs temporalio-1.3.0/vendor/zerocopy/src/util.rs --- temporalio-1.3.0/vendor/zerocopy/src/util.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/src/util.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,675 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -#[path = "third_party/rust/layout.rs"] -pub(crate) mod core_layout; - -use core::{mem, num::NonZeroUsize}; - -pub(crate) mod ptr { - use core::{ - fmt::{Debug, Formatter}, - marker::PhantomData, - mem, - ptr::NonNull, - }; - - use crate::{util::AsAddress, KnownLayout, _CastType}; - - /// A raw pointer with more restrictions. - /// - /// `Ptr` is similar to `NonNull`, but it is more restrictive in the - /// following ways: - /// - It must derive from a valid allocation - /// - It must reference a byte range which is contained inside the - /// allocation from which it derives - /// - As a consequence, the byte range it references must have a size - /// which does not overflow `isize` - /// - It must satisfy `T`'s alignment requirement - /// - /// Thanks to these restrictions, it is easier to prove the soundness of - /// some operations using `Ptr`s. - /// - /// `Ptr<'a, T>` is [covariant] in `'a` and `T`. - /// - /// [covariant]: https://doc.rust-lang.org/reference/subtyping.html - pub(crate) struct Ptr<'a, T: 'a + ?Sized> { - // INVARIANTS: - // - `ptr` is derived from some valid Rust allocation, `A` - // - `ptr` has the same provenance as `A` - // - `ptr` addresses a byte range of length `bytes_len` which is - // entirely contained in `A` - // - `bytes_len <= isize::MAX` - // - `ptr` addresses a byte range which does not wrap around the address - // space - // - `ptr` is validly-aligned for `T` - // - `A` is guaranteed to live for at least `'a` - // - `T: 'a` - ptr: NonNull, - // TODO(https://github.com/rust-lang/reference/pull/1417): Once the - // behavior of slice DST-to-slice DST raw pointer casts is guaranteed, - // we can use it to calculate the length of the memory region from - // `ptr`, and we don't need to store in separately. We can do it like - // this: - // - // let slc = ptr.as_ptr() as *const [()]; - // // SAFETY: - // // - `()` has alignment 1, so `slc` is trivially aligned - // // - `slc` was derived from a non-null pointer - // // - the size is 0 regardless of the length, so it is sound to - // // materialize a reference regardless of location - // // - pointer provenance may be an issue, but we never dereference - // let slc = unsafe { &*slc }; - // slc.len() - _bytes_len: usize, - _lifetime: PhantomData<&'a ()>, - } - - impl<'a, T: ?Sized> Copy for Ptr<'a, T> {} - impl<'a, T: ?Sized> Clone for Ptr<'a, T> { - fn clone(&self) -> Self { - *self - } - } - - impl<'a, T: ?Sized> Ptr<'a, T> { - /// Returns a shared reference to the value. - /// - /// # Safety - /// - /// TODO(#29), TODO(#429): What is the right way to articulate the - /// safety invariant here? I can see two possible approaches: - /// - Mimic the invariants on [`NonNull::as_ref`] so that it's easy to - /// write the safety comment on the inner call to `self.ptr.as_ref()`. - /// - Simply say that it's the caller's responsibility to ensure that - /// the resulting reference is valid. - /// - /// These two approaches should in principle be equivalent, but since - /// our memory model is undefined, there are some subtleties here. See, - /// e.g.: - /// - /// - /// # Old draft of Safety section - /// - /// - The referenced memory must contain a validly-initialized `T` for - /// the duration of `'a`. Note that this requires that any interior - /// mutation (i.e. via [`UnsafeCell`]) performed after this method - /// call leave the memory region always containing a valid `T`. - /// - The referenced memory must not also by referenced by any mutable - /// references during the lifetime `'a`. - /// - There must not exist any references to the same memory region - /// which contain `UnsafeCell`s at byte ranges which are not identical - /// to the byte ranges at which `T` contains `UnsafeCell`s. - /// - /// TODO: What about reads/mutation via raw pointers? Presumably these - /// can happen under the following conditions: - /// - Mutation only occurs inside `UnsafeCell`s - /// - Reads only happen using `UnsafeCell`s in places where there are - /// `UnsafeCell`s in `T` (otherwise, those reads could be unsound due - /// to assuming no concurrent mutation) - /// - /// [`UnsafeCell`]: core::cell::UnsafeCell - pub(crate) unsafe fn _as_ref(&self) -> &'a T { - // TODO(#429): Add a safety comment. This will depend on how we - // resolve the question about how to define the safety invariants on - // this method. - // - // Old draft of safety comment: - // - By invariant, `self.ptr` is properly-aligned for `T`. - // - By invariant, `self.ptr` is "dereferenceable" in that it points - // to a single allocation - // - By invariant, the allocation is live for `'a` - // - The caller promises that no mutable references exist to this - // region during `'a` - // - The caller promises that `UnsafeCell`s match exactly - // - The caller promises that the memory region contains a - // validly-intialized `T` - #[allow(clippy::undocumented_unsafe_blocks)] - unsafe { - self.ptr.as_ref() - } - } - } - - impl<'a> Ptr<'a, [u8]> { - /// Attempts to cast `self` to a `U` using the given cast type. - /// - /// Returns `None` if the resulting `U` would be invalidly-aligned or if - /// no `U` can fit in `self`. On success, returns a pointer to the - /// largest-possible `U` which fits in `self`. - /// - /// # Safety - /// - /// The caller may assume that this implementation is correct, and may - /// rely on that assumption for the soundness of their code. In - /// particular, the caller may assume that, if `try_cast_into` returns - /// `Some((ptr, split_at))`, then: - /// - If this is a prefix cast, `ptr` refers to the byte range `[0, - /// split_at)` in `self`. - /// - If this is a suffix cast, `ptr` refers to the byte range - /// `[split_at, self.len())` in `self`. - /// - /// # Panics - /// - /// Panics if `U` is a DST whose trailing slice element is zero-sized. - pub(crate) fn _try_cast_into( - &self, - cast_type: _CastType, - ) -> Option<(Ptr<'a, U>, usize)> { - // PANICS: By invariant, the byte range addressed by `self.ptr` does - // not wrap around the address space. This implies that the sum of - // the address (represented as a `usize`) and length do not overflow - // `usize`, as required by `validate_cast_and_convert_metadata`. - // Thus, this call to `validate_cast_and_convert_metadata` won't - // panic. - let (elems, split_at) = U::LAYOUT._validate_cast_and_convert_metadata( - AsAddress::addr(self.ptr.as_ptr()), - self._bytes_len, - cast_type, - )?; - let (offset, ret_len) = match cast_type { - _CastType::_Prefix => (0, split_at), - // Guaranteed not to underflow: - // `validate_cast_and_convert_metadata` promises that `split_at` - // is in the range `[0, bytes_len]`. - #[allow(clippy::arithmetic_side_effects)] - _CastType::_Suffix => (split_at, self._bytes_len - split_at), - }; - - let ptr = self.ptr.cast::().as_ptr(); - // SAFETY: `offset` is either `0` or `split_at`. - // `validate_cast_and_convert_metadata` promises that `split_at` is - // in the range `[0, bytes_len]`. Thus, in both cases, `offset` is - // in `[0, bytes_len]`. Thus: - // - The resulting pointer is in or one byte past the end of the - // same byte range as `self.ptr`. Since, by invariant, `self.ptr` - // addresses a byte range entirely contained within a single - // allocation, the pointer resulting from this operation is within - // or one byte past the end of that same allocation. - // - By invariant, `bytes_len <= isize::MAX`. Since `offset <= - // bytes_len`, `offset <= isize::MAX`. - // - By invariant, `self.ptr` addresses a byte range which does not - // wrap around the address space. This means that the base pointer - // plus the `bytes_len` does not overflow `usize`. Since `offset - // <= bytes_len`, this addition does not overflow `usize`. - let base = unsafe { ptr.add(offset) }; - // SAFETY: Since `add` is not allowed to wrap around, the preceding line - // produces a pointer whose address is greater than or equal to that of - // `ptr`. Since `ptr` is a `NonNull`, `base` is also non-null. - let base = unsafe { NonNull::new_unchecked(base) }; - let ptr = U::raw_from_ptr_len(base, elems); - // SAFETY: - // - By invariant, `self.ptr` is derived from some valid Rust - // allocation, `A`, and has the same provenance as `A`. All - // operations performed on `self.ptr` and values derived from it - // in this method preserve provenance, so: - // - `ptr` is derived from a valid Rust allocation, `A`. - // - `ptr` has the same provenance as `A`. - // - `validate_cast_and_convert_metadata` promises that the object - // described by `elems` and `split_at` lives at a byte range which - // is a subset of the input byte range. Thus: - // - Since, by invariant, `self.ptr` addresses a byte range - // entirely contained in `A`, so does `ptr`. - // - Since, by invariant, `self.ptr` addresses a range of length - // `self.bytes_len`, which is not longer than `isize::MAX` - // bytes, so does `ptr`. - // - `ret_len` is either `split_at` or `self.bytes_len - - // split_at`. `validate_cast_and_convert_metadata` promises that - // `split_at` is in the range `[0, self.bytes_len]`. Thus, in - // both cases, `ret_len <= self.bytes_len <= isize::MAX`. - // - Since, by invariant, `self.ptr` addresses a range which does - // not wrap around the address space, so does `ptr`. - // - `validate_cast_and_convert_metadata` promises that the object - // described by `split_at` is validly-aligned for `U`. - // - By invariant on `self`, `A` is guaranteed to live for at least - // `'a`. - // - `U: 'a` by trait bound. - Some((Ptr { ptr, _bytes_len: ret_len, _lifetime: PhantomData }, split_at)) - } - - /// Attempts to cast `self` into a `U`, failing if all of the bytes of - /// `self` cannot be treated as a `U`. - /// - /// In particular, this method fails if `self` is not validly-aligned - /// for `U` or if `self`'s size is not a valid size for `U`. - /// - /// # Safety - /// - /// On success, the caller may assume that the returned pointer - /// references the same byte range as `self`. - #[doc(hidden)] - #[inline(always)] - pub(crate) fn _try_cast_into_no_leftover( - &self, - ) -> Option> { - // TODO(#67): Remove this allow. See NonNulSlicelExt for more - // details. - #[allow(unstable_name_collisions)] - match self._try_cast_into(_CastType::_Prefix) { - Some((slf, split_at)) if split_at == self._bytes_len => Some(slf), - Some(_) | None => None, - } - } - } - - impl<'a, T: 'a + ?Sized> From<&'a T> for Ptr<'a, T> { - #[inline(always)] - fn from(t: &'a T) -> Ptr<'a, T> { - // SAFETY: `t` points to a valid Rust allocation, `A`, by - // construction. Thus: - // - `ptr` is derived from `A` - // - Since we use `NonNull::from`, which preserves provenance, `ptr` - // has the same provenance as `A` - // - Since `NonNull::from` creates a pointer which addresses the - // same bytes as `t`, `ptr` addresses a byte range entirely - // contained in (in this case, identical to) `A` of length - // `mem::size_of_val(t)` - // - Since `t: &T`, it addresses no more than `isize::MAX` bytes [1] - // - Since `t: &T`, it addresses a byte range which does not wrap - // around the address space [2] - // - Since it is constructed from a valid `&T`, `ptr` is - // validly-aligned for `T` - // - Since `t: &'a T`, the allocation `A` is guaranteed to live for - // at least `'a` - // - `T: 'a` by trait bound - // - // TODO(#429), - // TODO(https://github.com/rust-lang/rust/issues/116181): Once it's - // documented, reference the guarantee that `NonNull::from` - // preserves provenance. - // - // TODO(#429), - // TODO(https://github.com/rust-lang/unsafe-code-guidelines/issues/465): - // - [1] Where does the reference document that allocations fit in - // `isize`? - // - [2] Where does the reference document that allocations don't - // wrap around the address space? - Ptr { ptr: NonNull::from(t), _bytes_len: mem::size_of_val(t), _lifetime: PhantomData } - } - } - - impl<'a, T: 'a + ?Sized> Debug for Ptr<'a, T> { - fn fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result { - self.ptr.fmt(f) - } - } - - #[cfg(test)] - mod tests { - use core::mem::MaybeUninit; - - use super::*; - use crate::{util::testutil::AU64, FromBytes}; - - #[test] - fn test_ptr_try_cast_into_soundness() { - // This test is designed so that if `Ptr::try_cast_into_xxx` are - // buggy, it will manifest as unsoundness that Miri can detect. - - // - If `size_of::() == 0`, `N == 4` - // - Else, `N == 4 * size_of::()` - fn test() { - let mut bytes = [MaybeUninit::::uninit(); N]; - let initialized = [MaybeUninit::new(0u8); N]; - for start in 0..=bytes.len() { - for end in start..=bytes.len() { - // Set all bytes to uninitialized other than those in - // the range we're going to pass to `try_cast_from`. - // This allows Miri to detect out-of-bounds reads - // because they read uninitialized memory. Without this, - // some out-of-bounds reads would still be in-bounds of - // `bytes`, and so might spuriously be accepted. - bytes = [MaybeUninit::::uninit(); N]; - let bytes = &mut bytes[start..end]; - // Initialize only the byte range we're going to pass to - // `try_cast_from`. - bytes.copy_from_slice(&initialized[start..end]); - - let bytes = { - let bytes: *const [MaybeUninit] = bytes; - #[allow(clippy::as_conversions)] - let bytes = bytes as *const [u8]; - // SAFETY: We just initialized these bytes to valid - // `u8`s. - unsafe { &*bytes } - }; - - /// # Safety - /// - /// - `slf` must reference a byte range which is - /// entirely initialized. - /// - `slf` must reference a byte range which is only - /// referenced by shared references which do not - /// contain `UnsafeCell`s during its lifetime. - unsafe fn validate_and_get_len( - slf: Ptr<'_, T>, - ) -> usize { - // TODO(#429): Update this safety comment once - // `as_ref`'s safety invariants are well-defined. - // - // Old draft safety comment: - // - The caller has promised that all bytes - // referenced by `slf` are initialized. Since `T: - // FromBytes`, those bytes constitute a valid `T`. - // - The caller has promised that no mutable - // references exist to the same memory during the - // duration of this function call. - // - The caller has promised that no `UnsafeCell` - // references exist to the same memory during the - // duration of this function call. - #[allow(clippy::undocumented_unsafe_blocks)] - let t = unsafe { slf._as_ref() }; - - let bytes = { - let len = mem::size_of_val(t); - let t: *const T = t; - // SAFETY: - // - We know `t`'s bytes are all initialized - // because we just read it from `slf`, which - // points to an initialized range of bytes. If - // there's a bug and this doesn't hold, then - // that's exactly what we're hoping Miri will - // catch! - // - Since `T: FromBytes`, `T` doesn't contain - // any `UnsafeCell`s, so it's okay for `t: T` - // and a `&[u8]` to the same memory to be - // alive concurrently. - unsafe { core::slice::from_raw_parts(t.cast::(), len) } - }; - - // This assertion ensures that `t`'s bytes are read - // and compared to another value, which in turn - // ensures that Miri gets a chance to notice if any - // of `t`'s bytes are uninitialized, which they - // shouldn't be (see the comment above). - assert_eq!(bytes, vec![0u8; bytes.len()]); - - mem::size_of_val(t) - } - - for cast_type in [_CastType::_Prefix, _CastType::_Suffix] { - if let Some((slf, split_at)) = - Ptr::from(bytes)._try_cast_into::(cast_type) - { - // SAFETY: All bytes in `bytes` have been - // initialized. - let len = unsafe { validate_and_get_len(slf) }; - match cast_type { - _CastType::_Prefix => assert_eq!(split_at, len), - _CastType::_Suffix => assert_eq!(split_at, bytes.len() - len), - } - } - } - - if let Some(slf) = Ptr::from(bytes)._try_cast_into_no_leftover::() { - // SAFETY: All bytes in `bytes` have been - // initialized. - let len = unsafe { validate_and_get_len(slf) }; - assert_eq!(len, bytes.len()); - } - } - } - } - - macro_rules! test { - ($($ty:ty),*) => { - $({ - const S: usize = core::mem::size_of::<$ty>(); - const N: usize = if S == 0 { 4 } else { S * 4 }; - test::(); - // We don't support casting into DSTs whose trailing slice - // element is a ZST. - if S > 0 { - test::(); - } - // TODO: Test with a slice DST once we have any that - // implement `KnownLayout + FromBytes`. - })* - }; - } - - test!(()); - test!(u8, u16, u32, u64, u128, usize, AU64); - test!(i8, i16, i32, i64, i128, isize); - test!(f32, f64); - } - } -} - -pub(crate) trait AsAddress { - fn addr(self) -> usize; -} - -impl<'a, T: ?Sized> AsAddress for &'a T { - #[inline(always)] - fn addr(self) -> usize { - let ptr: *const T = self; - AsAddress::addr(ptr) - } -} - -impl<'a, T: ?Sized> AsAddress for &'a mut T { - #[inline(always)] - fn addr(self) -> usize { - let ptr: *const T = self; - AsAddress::addr(ptr) - } -} - -impl AsAddress for *const T { - #[inline(always)] - fn addr(self) -> usize { - // TODO(https://github.com/rust-lang/rust/issues/95228): Use `.addr()` - // instead of `as usize` once it's stable, and get rid of this `allow`. - // Currently, `as usize` is the only way to accomplish this. - #[allow(clippy::as_conversions)] - return self.cast::<()>() as usize; - } -} - -impl AsAddress for *mut T { - #[inline(always)] - fn addr(self) -> usize { - let ptr: *const T = self; - AsAddress::addr(ptr) - } -} - -/// Is `t` aligned to `mem::align_of::()`? -#[inline(always)] -pub(crate) fn aligned_to(t: T) -> bool { - // `mem::align_of::()` is guaranteed to return a non-zero value, which in - // turn guarantees that this mod operation will not panic. - #[allow(clippy::arithmetic_side_effects)] - let remainder = t.addr() % mem::align_of::(); - remainder == 0 -} - -/// Round `n` down to the largest value `m` such that `m <= n` and `m % align == -/// 0`. -/// -/// # Panics -/// -/// May panic if `align` is not a power of two. Even if it doesn't panic in this -/// case, it will produce nonsense results. -#[inline(always)] -pub(crate) const fn _round_down_to_next_multiple_of_alignment( - n: usize, - align: NonZeroUsize, -) -> usize { - let align = align.get(); - debug_assert!(align.is_power_of_two()); - - // Subtraction can't underflow because `align.get() >= 1`. - #[allow(clippy::arithmetic_side_effects)] - let mask = !(align - 1); - n & mask -} - -/// Since we support multiple versions of Rust, there are often features which -/// have been stabilized in the most recent stable release which do not yet -/// exist (stably) on our MSRV. This module provides polyfills for those -/// features so that we can write more "modern" code, and just remove the -/// polyfill once our MSRV supports the corresponding feature. Without this, -/// we'd have to write worse/more verbose code and leave TODO comments sprinkled -/// throughout the codebase to update to the new pattern once it's stabilized. -/// -/// Each trait is imported as `_` at the crate root; each polyfill should "just -/// work" at usage sites. -pub(crate) mod polyfills { - use core::ptr::{self, NonNull}; - - // A polyfill for `NonNull::slice_from_raw_parts` that we can use before our - // MSRV is 1.70, when that function was stabilized. - // - // TODO(#67): Once our MSRV is 1.70, remove this. - pub(crate) trait NonNullExt { - fn slice_from_raw_parts(data: Self, len: usize) -> NonNull<[T]>; - } - - impl NonNullExt for NonNull { - #[inline(always)] - fn slice_from_raw_parts(data: Self, len: usize) -> NonNull<[T]> { - let ptr = ptr::slice_from_raw_parts_mut(data.as_ptr(), len); - // SAFETY: `ptr` is converted from `data`, which is non-null. - unsafe { NonNull::new_unchecked(ptr) } - } - } -} - -#[cfg(test)] -pub(crate) mod testutil { - use core::fmt::{self, Display, Formatter}; - - use crate::*; - - /// A `T` which is aligned to at least `align_of::()`. - #[derive(Default)] - pub(crate) struct Align { - pub(crate) t: T, - _a: [A; 0], - } - - impl Align { - pub(crate) fn set_default(&mut self) { - self.t = T::default(); - } - } - - impl Align { - pub(crate) const fn new(t: T) -> Align { - Align { t, _a: [] } - } - } - - // A `u64` with alignment 8. - // - // Though `u64` has alignment 8 on some platforms, it's not guaranteed. - // By contrast, `AU64` is guaranteed to have alignment 8. - #[derive( - KnownLayout, - FromZeroes, - FromBytes, - AsBytes, - Eq, - PartialEq, - Ord, - PartialOrd, - Default, - Debug, - Copy, - Clone, - )] - #[repr(C, align(8))] - pub(crate) struct AU64(pub(crate) u64); - - impl AU64 { - // Converts this `AU64` to bytes using this platform's endianness. - pub(crate) fn to_bytes(self) -> [u8; 8] { - crate::transmute!(self) - } - } - - impl Display for AU64 { - fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { - Display::fmt(&self.0, f) - } - } -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn test_round_down_to_next_multiple_of_alignment() { - fn alt_impl(n: usize, align: NonZeroUsize) -> usize { - let mul = n / align.get(); - mul * align.get() - } - - for align in [1, 2, 4, 8, 16] { - for n in 0..256 { - let align = NonZeroUsize::new(align).unwrap(); - let want = alt_impl(n, align); - let got = _round_down_to_next_multiple_of_alignment(n, align); - assert_eq!(got, want, "round_down_to_next_multiple_of_alignment({n}, {align})"); - } - } - } -} - -#[cfg(kani)] -mod proofs { - use super::*; - - #[kani::proof] - fn prove_round_down_to_next_multiple_of_alignment() { - fn model_impl(n: usize, align: NonZeroUsize) -> usize { - assert!(align.get().is_power_of_two()); - let mul = n / align.get(); - mul * align.get() - } - - let align: NonZeroUsize = kani::any(); - kani::assume(align.get().is_power_of_two()); - let n: usize = kani::any(); - - let expected = model_impl(n, align); - let actual = _round_down_to_next_multiple_of_alignment(n, align); - assert_eq!(expected, actual, "round_down_to_next_multiple_of_alignment({n}, {align})"); - } - - // Restricted to nightly since we use the unstable `usize::next_multiple_of` - // in our model implementation. - #[cfg(__INTERNAL_USE_ONLY_NIGHLTY_FEATURES_IN_TESTS)] - #[kani::proof] - fn prove_padding_needed_for() { - fn model_impl(len: usize, align: NonZeroUsize) -> usize { - let padded = len.next_multiple_of(align.get()); - let padding = padded - len; - padding - } - - let align: NonZeroUsize = kani::any(); - kani::assume(align.get().is_power_of_two()); - let len: usize = kani::any(); - // Constrain `len` to valid Rust lengths, since our model implementation - // isn't robust to overflow. - kani::assume(len <= isize::MAX as usize); - kani::assume(align.get() < 1 << 29); - - let expected = model_impl(len, align); - let actual = core_layout::_padding_needed_for(len, align); - assert_eq!(expected, actual, "padding_needed_for({len}, {align})"); - - let padded_len = actual + len; - assert_eq!(padded_len % align, 0); - assert!(padded_len / align >= len / align); - } -} diff -Nru temporalio-1.3.0/vendor/zerocopy/src/wrappers.rs temporalio-1.3.0/vendor/zerocopy/src/wrappers.rs --- temporalio-1.3.0/vendor/zerocopy/src/wrappers.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/src/wrappers.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,503 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -use core::{ - cmp::Ordering, - fmt::{self, Debug, Display, Formatter}, - hash::Hash, - mem::{self, ManuallyDrop}, - ops::{Deref, DerefMut}, - ptr, -}; - -use super::*; - -/// A type with no alignment requirement. -/// -/// An `Unalign` wraps a `T`, removing any alignment requirement. `Unalign` -/// has the same size and bit validity as `T`, but not necessarily the same -/// alignment [or ABI]. This is useful if a type with an alignment requirement -/// needs to be read from a chunk of memory which provides no alignment -/// guarantees. -/// -/// Since `Unalign` has no alignment requirement, the inner `T` may not be -/// properly aligned in memory. There are five ways to access the inner `T`: -/// - by value, using [`get`] or [`into_inner`] -/// - by reference inside of a callback, using [`update`] -/// - fallibly by reference, using [`try_deref`] or [`try_deref_mut`]; these can -/// fail if the `Unalign` does not satisfy `T`'s alignment requirement at -/// runtime -/// - unsafely by reference, using [`deref_unchecked`] or -/// [`deref_mut_unchecked`]; it is the caller's responsibility to ensure that -/// the `Unalign` satisfies `T`'s alignment requirement -/// - (where `T: Unaligned`) infallibly by reference, using [`Deref::deref`] or -/// [`DerefMut::deref_mut`] -/// -/// [or ABI]: https://github.com/google/zerocopy/issues/164 -/// [`get`]: Unalign::get -/// [`into_inner`]: Unalign::into_inner -/// [`update`]: Unalign::update -/// [`try_deref`]: Unalign::try_deref -/// [`try_deref_mut`]: Unalign::try_deref_mut -/// [`deref_unchecked`]: Unalign::deref_unchecked -/// [`deref_mut_unchecked`]: Unalign::deref_mut_unchecked -// NOTE: This type is sound to use with types that need to be dropped. The -// reason is that the compiler-generated drop code automatically moves all -// values to aligned memory slots before dropping them in-place. This is not -// well-documented, but it's hinted at in places like [1] and [2]. However, this -// also means that `T` must be `Sized`; unless something changes, we can never -// support unsized `T`. [3] -// -// [1] https://github.com/rust-lang/rust/issues/54148#issuecomment-420529646 -// [2] https://github.com/google/zerocopy/pull/126#discussion_r1018512323 -// [3] https://github.com/google/zerocopy/issues/209 -#[allow(missing_debug_implementations)] -#[derive(Default, Copy)] -#[cfg_attr( - any(feature = "derive", test), - derive(KnownLayout, FromZeroes, FromBytes, AsBytes, Unaligned) -)] -#[repr(C, packed)] -pub struct Unalign(T); - -#[cfg(not(any(feature = "derive", test)))] -impl_known_layout!(T => Unalign); - -safety_comment! { - /// SAFETY: - /// - `Unalign` is `repr(packed)`, so it is unaligned regardless of the - /// alignment of `T`, and so we don't require that `T: Unaligned` - /// - `Unalign` has the same bit validity as `T`, and so it is - /// `FromZeroes`, `FromBytes`, or `AsBytes` exactly when `T` is as well. - impl_or_verify!(T => Unaligned for Unalign); - impl_or_verify!(T: FromZeroes => FromZeroes for Unalign); - impl_or_verify!(T: FromBytes => FromBytes for Unalign); - impl_or_verify!(T: AsBytes => AsBytes for Unalign); -} - -// Note that `Unalign: Clone` only if `T: Copy`. Since the inner `T` may not be -// aligned, there's no way to safely call `T::clone`, and so a `T: Clone` bound -// is not sufficient to implement `Clone` for `Unalign`. -impl Clone for Unalign { - #[inline(always)] - fn clone(&self) -> Unalign { - *self - } -} - -impl Unalign { - /// Constructs a new `Unalign`. - #[inline(always)] - pub const fn new(val: T) -> Unalign { - Unalign(val) - } - - /// Consumes `self`, returning the inner `T`. - #[inline(always)] - pub const fn into_inner(self) -> T { - // Use this instead of `mem::transmute` since the latter can't tell - // that `Unalign` and `T` have the same size. - #[repr(C)] - union Transmute { - u: ManuallyDrop>, - t: ManuallyDrop, - } - - // SAFETY: Since `Unalign` is `#[repr(C, packed)]`, it has the same - // layout as `T`. `ManuallyDrop` is guaranteed to have the same - // layout as `U`, and so `ManuallyDrop>` has the same layout - // as `ManuallyDrop`. Since `Transmute` is `#[repr(C)]`, its `t` - // and `u` fields both start at the same offset (namely, 0) within the - // union. - // - // We do this instead of just destructuring in order to prevent - // `Unalign`'s `Drop::drop` from being run, since dropping is not - // supported in `const fn`s. - // - // TODO(https://github.com/rust-lang/rust/issues/73255): Destructure - // instead of using unsafe. - unsafe { ManuallyDrop::into_inner(Transmute { u: ManuallyDrop::new(self) }.t) } - } - - /// Attempts to return a reference to the wrapped `T`, failing if `self` is - /// not properly aligned. - /// - /// If `self` does not satisfy `mem::align_of::()`, then it is unsound to - /// return a reference to the wrapped `T`, and `try_deref` returns `None`. - /// - /// If `T: Unaligned`, then `Unalign` implements [`Deref`], and callers - /// may prefer [`Deref::deref`], which is infallible. - #[inline(always)] - pub fn try_deref(&self) -> Option<&T> { - if !crate::util::aligned_to::<_, T>(self) { - return None; - } - - // SAFETY: `deref_unchecked`'s safety requirement is that `self` is - // aligned to `align_of::()`, which we just checked. - unsafe { Some(self.deref_unchecked()) } - } - - /// Attempts to return a mutable reference to the wrapped `T`, failing if - /// `self` is not properly aligned. - /// - /// If `self` does not satisfy `mem::align_of::()`, then it is unsound to - /// return a reference to the wrapped `T`, and `try_deref_mut` returns - /// `None`. - /// - /// If `T: Unaligned`, then `Unalign` implements [`DerefMut`], and - /// callers may prefer [`DerefMut::deref_mut`], which is infallible. - #[inline(always)] - pub fn try_deref_mut(&mut self) -> Option<&mut T> { - if !crate::util::aligned_to::<_, T>(&*self) { - return None; - } - - // SAFETY: `deref_mut_unchecked`'s safety requirement is that `self` is - // aligned to `align_of::()`, which we just checked. - unsafe { Some(self.deref_mut_unchecked()) } - } - - /// Returns a reference to the wrapped `T` without checking alignment. - /// - /// If `T: Unaligned`, then `Unalign` implements[ `Deref`], and callers - /// may prefer [`Deref::deref`], which is safe. - /// - /// # Safety - /// - /// If `self` does not satisfy `mem::align_of::()`, then - /// `self.deref_unchecked()` may cause undefined behavior. - #[inline(always)] - pub const unsafe fn deref_unchecked(&self) -> &T { - // SAFETY: `Unalign` is `repr(transparent)`, so there is a valid `T` - // at the same memory location as `self`. It has no alignment guarantee, - // but the caller has promised that `self` is properly aligned, so we - // know that it is sound to create a reference to `T` at this memory - // location. - // - // We use `mem::transmute` instead of `&*self.get_ptr()` because - // dereferencing pointers is not stable in `const` on our current MSRV - // (1.56 as of this writing). - unsafe { mem::transmute(self) } - } - - /// Returns a mutable reference to the wrapped `T` without checking - /// alignment. - /// - /// If `T: Unaligned`, then `Unalign` implements[ `DerefMut`], and - /// callers may prefer [`DerefMut::deref_mut`], which is safe. - /// - /// # Safety - /// - /// If `self` does not satisfy `mem::align_of::()`, then - /// `self.deref_mut_unchecked()` may cause undefined behavior. - #[inline(always)] - pub unsafe fn deref_mut_unchecked(&mut self) -> &mut T { - // SAFETY: `self.get_mut_ptr()` returns a raw pointer to a valid `T` at - // the same memory location as `self`. It has no alignment guarantee, - // but the caller has promised that `self` is properly aligned, so we - // know that the pointer itself is aligned, and thus that it is sound to - // create a reference to a `T` at this memory location. - unsafe { &mut *self.get_mut_ptr() } - } - - /// Gets an unaligned raw pointer to the inner `T`. - /// - /// # Safety - /// - /// The returned raw pointer is not necessarily aligned to - /// `align_of::()`. Most functions which operate on raw pointers require - /// those pointers to be aligned, so calling those functions with the result - /// of `get_ptr` will be undefined behavior if alignment is not guaranteed - /// using some out-of-band mechanism. In general, the only functions which - /// are safe to call with this pointer are those which are explicitly - /// documented as being sound to use with an unaligned pointer, such as - /// [`read_unaligned`]. - /// - /// [`read_unaligned`]: core::ptr::read_unaligned - #[inline(always)] - pub const fn get_ptr(&self) -> *const T { - ptr::addr_of!(self.0) - } - - /// Gets an unaligned mutable raw pointer to the inner `T`. - /// - /// # Safety - /// - /// The returned raw pointer is not necessarily aligned to - /// `align_of::()`. Most functions which operate on raw pointers require - /// those pointers to be aligned, so calling those functions with the result - /// of `get_ptr` will be undefined behavior if alignment is not guaranteed - /// using some out-of-band mechanism. In general, the only functions which - /// are safe to call with this pointer are those which are explicitly - /// documented as being sound to use with an unaligned pointer, such as - /// [`read_unaligned`]. - /// - /// [`read_unaligned`]: core::ptr::read_unaligned - // TODO(https://github.com/rust-lang/rust/issues/57349): Make this `const`. - #[inline(always)] - pub fn get_mut_ptr(&mut self) -> *mut T { - ptr::addr_of_mut!(self.0) - } - - /// Sets the inner `T`, dropping the previous value. - // TODO(https://github.com/rust-lang/rust/issues/57349): Make this `const`. - #[inline(always)] - pub fn set(&mut self, t: T) { - *self = Unalign::new(t); - } - - /// Updates the inner `T` by calling a function on it. - /// - /// If [`T: Unaligned`], then `Unalign` implements [`DerefMut`], and that - /// impl should be preferred over this method when performing updates, as it - /// will usually be faster and more ergonomic. - /// - /// For large types, this method may be expensive, as it requires copying - /// `2 * size_of::()` bytes. \[1\] - /// - /// \[1\] Since the inner `T` may not be aligned, it would not be sound to - /// invoke `f` on it directly. Instead, `update` moves it into a - /// properly-aligned location in the local stack frame, calls `f` on it, and - /// then moves it back to its original location in `self`. - /// - /// [`T: Unaligned`]: Unaligned - #[inline] - pub fn update O>(&mut self, f: F) -> O { - // On drop, this moves `copy` out of itself and uses `ptr::write` to - // overwrite `slf`. - struct WriteBackOnDrop { - copy: ManuallyDrop, - slf: *mut Unalign, - } - - impl Drop for WriteBackOnDrop { - fn drop(&mut self) { - // SAFETY: We never use `copy` again as required by - // `ManuallyDrop::take`. - let copy = unsafe { ManuallyDrop::take(&mut self.copy) }; - // SAFETY: `slf` is the raw pointer value of `self`. We know it - // is valid for writes and properly aligned because `self` is a - // mutable reference, which guarantees both of these properties. - unsafe { ptr::write(self.slf, Unalign::new(copy)) }; - } - } - - // SAFETY: We know that `self` is valid for reads, properly aligned, and - // points to an initialized `Unalign` because it is a mutable - // reference, which guarantees all of these properties. - // - // Since `T: !Copy`, it would be unsound in the general case to allow - // both the original `Unalign` and the copy to be used by safe code. - // We guarantee that the copy is used to overwrite the original in the - // `Drop::drop` impl of `WriteBackOnDrop`. So long as this `drop` is - // called before any other safe code executes, soundness is upheld. - // While this method can terminate in two ways (by returning normally or - // by unwinding due to a panic in `f`), in both cases, `write_back` is - // dropped - and its `drop` called - before any other safe code can - // execute. - let copy = unsafe { ptr::read(self) }.into_inner(); - let mut write_back = WriteBackOnDrop { copy: ManuallyDrop::new(copy), slf: self }; - - let ret = f(&mut write_back.copy); - - drop(write_back); - ret - } -} - -impl Unalign { - /// Gets a copy of the inner `T`. - // TODO(https://github.com/rust-lang/rust/issues/57349): Make this `const`. - #[inline(always)] - pub fn get(&self) -> T { - let Unalign(val) = *self; - val - } -} - -impl Deref for Unalign { - type Target = T; - - #[inline(always)] - fn deref(&self) -> &T { - // SAFETY: `deref_unchecked`'s safety requirement is that `self` is - // aligned to `align_of::()`. `T: Unaligned` guarantees that - // `align_of::() == 1`, and all pointers are one-aligned because all - // addresses are divisible by 1. - unsafe { self.deref_unchecked() } - } -} - -impl DerefMut for Unalign { - #[inline(always)] - fn deref_mut(&mut self) -> &mut T { - // SAFETY: `deref_mut_unchecked`'s safety requirement is that `self` is - // aligned to `align_of::()`. `T: Unaligned` guarantees that - // `align_of::() == 1`, and all pointers are one-aligned because all - // addresses are divisible by 1. - unsafe { self.deref_mut_unchecked() } - } -} - -impl PartialOrd> for Unalign { - #[inline(always)] - fn partial_cmp(&self, other: &Unalign) -> Option { - PartialOrd::partial_cmp(self.deref(), other.deref()) - } -} - -impl Ord for Unalign { - #[inline(always)] - fn cmp(&self, other: &Unalign) -> Ordering { - Ord::cmp(self.deref(), other.deref()) - } -} - -impl PartialEq> for Unalign { - #[inline(always)] - fn eq(&self, other: &Unalign) -> bool { - PartialEq::eq(self.deref(), other.deref()) - } -} - -impl Eq for Unalign {} - -impl Hash for Unalign { - #[inline(always)] - fn hash(&self, state: &mut H) - where - H: Hasher, - { - self.deref().hash(state); - } -} - -impl Debug for Unalign { - #[inline(always)] - fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { - Debug::fmt(self.deref(), f) - } -} - -impl Display for Unalign { - #[inline(always)] - fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { - Display::fmt(self.deref(), f) - } -} - -#[cfg(test)] -mod tests { - use core::panic::AssertUnwindSafe; - - use super::*; - use crate::util::testutil::*; - - /// A `T` which is guaranteed not to satisfy `align_of::()`. - /// - /// It must be the case that `align_of::() < align_of::()` in order - /// fot this type to work properly. - #[repr(C)] - struct ForceUnalign { - // The outer struct is aligned to `A`, and, thanks to `repr(C)`, `t` is - // placed at the minimum offset that guarantees its alignment. If - // `align_of::() < align_of::()`, then that offset will be - // guaranteed *not* to satisfy `align_of::()`. - _u: u8, - t: T, - _a: [A; 0], - } - - impl ForceUnalign { - const fn new(t: T) -> ForceUnalign { - ForceUnalign { _u: 0, t, _a: [] } - } - } - - #[test] - fn test_unalign() { - // Test methods that don't depend on alignment. - let mut u = Unalign::new(AU64(123)); - assert_eq!(u.get(), AU64(123)); - assert_eq!(u.into_inner(), AU64(123)); - assert_eq!(u.get_ptr(), <*const _>::cast::(&u)); - assert_eq!(u.get_mut_ptr(), <*mut _>::cast::(&mut u)); - u.set(AU64(321)); - assert_eq!(u.get(), AU64(321)); - - // Test methods that depend on alignment (when alignment is satisfied). - let mut u: Align<_, AU64> = Align::new(Unalign::new(AU64(123))); - assert_eq!(u.t.try_deref(), Some(&AU64(123))); - assert_eq!(u.t.try_deref_mut(), Some(&mut AU64(123))); - // SAFETY: The `Align<_, AU64>` guarantees proper alignment. - assert_eq!(unsafe { u.t.deref_unchecked() }, &AU64(123)); - // SAFETY: The `Align<_, AU64>` guarantees proper alignment. - assert_eq!(unsafe { u.t.deref_mut_unchecked() }, &mut AU64(123)); - *u.t.try_deref_mut().unwrap() = AU64(321); - assert_eq!(u.t.get(), AU64(321)); - - // Test methods that depend on alignment (when alignment is not - // satisfied). - let mut u: ForceUnalign<_, AU64> = ForceUnalign::new(Unalign::new(AU64(123))); - assert_eq!(u.t.try_deref(), None); - assert_eq!(u.t.try_deref_mut(), None); - - // Test methods that depend on `T: Unaligned`. - let mut u = Unalign::new(123u8); - assert_eq!(u.try_deref(), Some(&123)); - assert_eq!(u.try_deref_mut(), Some(&mut 123)); - assert_eq!(u.deref(), &123); - assert_eq!(u.deref_mut(), &mut 123); - *u = 21; - assert_eq!(u.get(), 21); - - // Test that some `Unalign` functions and methods are `const`. - const _UNALIGN: Unalign = Unalign::new(0); - const _UNALIGN_PTR: *const u64 = _UNALIGN.get_ptr(); - const _U64: u64 = _UNALIGN.into_inner(); - // Make sure all code is considered "used". - // - // TODO(https://github.com/rust-lang/rust/issues/104084): Remove this - // attribute. - #[allow(dead_code)] - const _: () = { - let x: Align<_, AU64> = Align::new(Unalign::new(AU64(123))); - // Make sure that `deref_unchecked` is `const`. - // - // SAFETY: The `Align<_, AU64>` guarantees proper alignment. - let au64 = unsafe { x.t.deref_unchecked() }; - match au64 { - AU64(123) => {} - _ => unreachable!(), - } - }; - } - - #[test] - fn test_unalign_update() { - let mut u = Unalign::new(AU64(123)); - u.update(|a| a.0 += 1); - assert_eq!(u.get(), AU64(124)); - - // Test that, even if the callback panics, the original is still - // correctly overwritten. Use a `Box` so that Miri is more likely to - // catch any unsoundness (which would likely result in two `Box`es for - // the same heap object, which is the sort of thing that Miri would - // probably catch). - let mut u = Unalign::new(Box::new(AU64(123))); - let res = std::panic::catch_unwind(AssertUnwindSafe(|| { - u.update(|a| { - a.0 += 1; - panic!(); - }) - })); - assert!(res.is_err()); - assert_eq!(u.into_inner(), Box::new(AU64(124))); - } -} diff -Nru temporalio-1.3.0/vendor/zerocopy/testdata/include_value/data temporalio-1.3.0/vendor/zerocopy/testdata/include_value/data --- temporalio-1.3.0/vendor/zerocopy/testdata/include_value/data 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/testdata/include_value/data 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -abcd \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/trybuild.rs temporalio-1.3.0/vendor/zerocopy/tests/trybuild.rs --- temporalio-1.3.0/vendor/zerocopy/tests/trybuild.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/trybuild.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,41 +0,0 @@ -// Copyright 2019 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -use testutil::ToolchainVersion; - -#[test] -#[cfg_attr(miri, ignore)] -fn ui() { - let version = ToolchainVersion::extract_from_pwd().unwrap(); - // See the doc comment on this method for an explanation of what this does - // and why we store source files in different directories. - let source_files_dirname = version.get_ui_source_files_dirname_and_maybe_print_warning(); - - let t = trybuild::TestCases::new(); - t.compile_fail(format!("tests/{source_files_dirname}/*.rs")); -} - -// The file `invalid-impls.rs` directly includes `src/macros.rs` in order to -// test the `impl_or_verify!` macro which is defined in that file. Specifically, -// it tests the verification portion of that macro, which is enabled when -// `cfg(any(feature = "derive", test))`. While `--cfg test` is of course passed -// to the code in the file you're reading right now, `trybuild` does not pass -// `--cfg test` when it invokes Cargo. As a result, this `trybuild` test only -// tests the correct behavior when the "derive" feature is enabled. -#[cfg(feature = "derive")] -#[test] -#[cfg_attr(miri, ignore)] -fn ui_invalid_impls() { - let version = ToolchainVersion::extract_from_pwd().unwrap(); - // See the doc comment on this method for an explanation of what this does - // and why we store source files in different directories. - let source_files_dirname = version.get_ui_source_files_dirname_and_maybe_print_warning(); - - let t = trybuild::TestCases::new(); - t.compile_fail(format!("tests/{source_files_dirname}/invalid-impls/*.rs")); -} diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/include_value_not_from_bytes.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/include_value_not_from_bytes.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/include_value_not_from_bytes.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/include_value_not_from_bytes.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,12 +0,0 @@ -// Copyright 2022 The Fuchsia Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#[macro_use] -extern crate zerocopy; - -fn main() {} - -// Should fail because `UnsafeCell: !FromBytes`. -const NOT_FROM_BYTES: core::cell::UnsafeCell = - include_value!("../../testdata/include_value/data"); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/include_value_not_from_bytes.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/include_value_not_from_bytes.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/include_value_not_from_bytes.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/include_value_not_from_bytes.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,12 +0,0 @@ -error[E0277]: the trait bound `UnsafeCell: FromBytes` is not satisfied - --> tests/ui-msrv/include_value_not_from_bytes.rs:12:5 - | -12 | include_value!("../../testdata/include_value/data"); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `FromBytes` is not implemented for `UnsafeCell` - | -note: required by a bound in `AssertIsFromBytes` - --> tests/ui-msrv/include_value_not_from_bytes.rs:12:5 - | -12 | include_value!("../../testdata/include_value/data"); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertIsFromBytes` - = note: this error originates in the macro `$crate::transmute` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/include_value_wrong_size.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/include_value_wrong_size.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/include_value_wrong_size.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/include_value_wrong_size.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,11 +0,0 @@ -// Copyright 2022 The Fuchsia Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#[macro_use] -extern crate zerocopy; - -fn main() {} - -// Should fail because the file is 4 bytes long, not 8. -const WRONG_SIZE: u64 = include_value!("../../testdata/include_value/data"); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/include_value_wrong_size.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/include_value_wrong_size.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/include_value_wrong_size.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/include_value_wrong_size.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,9 +0,0 @@ -error[E0512]: cannot transmute between types of different sizes, or dependently-sized types - --> tests/ui-msrv/include_value_wrong_size.rs:11:25 - | -11 | const WRONG_SIZE: u64 = include_value!("../../testdata/include_value/data"); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: source type: `[u8; 4]` (32 bits) - = note: target type: `u64` (64 bits) - = note: this error originates in the macro `$crate::transmute` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/invalid-impls/invalid-impls.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/invalid-impls/invalid-impls.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/invalid-impls/invalid-impls.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/invalid-impls/invalid-impls.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,29 +0,0 @@ -// Copyright 2022 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -// Since some macros from `macros.rs` are unused. -#![allow(unused)] - -extern crate zerocopy; -extern crate zerocopy_derive; - -include!("../../../src/macros.rs"); - -use zerocopy::*; -use zerocopy_derive::*; - -fn main() {} - -#[derive(FromZeroes, FromBytes, AsBytes, Unaligned)] -#[repr(transparent)] -struct Foo(T); - -impl_or_verify!(T => FromZeroes for Foo); -impl_or_verify!(T => FromBytes for Foo); -impl_or_verify!(T => AsBytes for Foo); -impl_or_verify!(T => Unaligned for Foo); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/invalid-impls/invalid-impls.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/invalid-impls/invalid-impls.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/invalid-impls/invalid-impls.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/invalid-impls/invalid-impls.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,127 +0,0 @@ -error[E0277]: the trait bound `T: zerocopy::FromZeroes` is not satisfied - --> tests/ui-msrv/invalid-impls/../../../src/macros.rs - | - | impl<$($tyvar $(: $(? $optbound +)* $($bound +)*)?),*> Subtrait for $ty {} - | ^^^^^^^^ the trait `zerocopy::FromZeroes` is not implemented for `T` - | - ::: tests/ui-msrv/invalid-impls/invalid-impls.rs:26:1 - | -26 | impl_or_verify!(T => FromZeroes for Foo); - | ------------------------------------------- in this macro invocation - | -note: required because of the requirements on the impl of `zerocopy::FromZeroes` for `Foo` - --> tests/ui-msrv/invalid-impls/invalid-impls.rs:22:10 - | -22 | #[derive(FromZeroes, FromBytes, AsBytes, Unaligned)] - | ^^^^^^^^^^ -note: required by a bound in `_::Subtrait` - --> tests/ui-msrv/invalid-impls/../../../src/macros.rs - | - | trait Subtrait: $trait {} - | ^^^^^^ required by this bound in `_::Subtrait` - | - ::: tests/ui-msrv/invalid-impls/invalid-impls.rs:26:1 - | -26 | impl_or_verify!(T => FromZeroes for Foo); - | ------------------------------------------- in this macro invocation - = note: this error originates in the macro `impl_or_verify` (in Nightly builds, run with -Z macro-backtrace for more info) -help: consider restricting type parameter `T` - | -26 | impl_or_verify!(T: zerocopy::FromZeroes => FromZeroes for Foo); - | ++++++++++++++++++++++ - -error[E0277]: the trait bound `T: zerocopy::FromBytes` is not satisfied - --> tests/ui-msrv/invalid-impls/../../../src/macros.rs - | - | impl<$($tyvar $(: $(? $optbound +)* $($bound +)*)?),*> Subtrait for $ty {} - | ^^^^^^^^ the trait `zerocopy::FromBytes` is not implemented for `T` - | - ::: tests/ui-msrv/invalid-impls/invalid-impls.rs:27:1 - | -27 | impl_or_verify!(T => FromBytes for Foo); - | ------------------------------------------ in this macro invocation - | -note: required because of the requirements on the impl of `zerocopy::FromBytes` for `Foo` - --> tests/ui-msrv/invalid-impls/invalid-impls.rs:22:22 - | -22 | #[derive(FromZeroes, FromBytes, AsBytes, Unaligned)] - | ^^^^^^^^^ -note: required by a bound in `_::Subtrait` - --> tests/ui-msrv/invalid-impls/../../../src/macros.rs - | - | trait Subtrait: $trait {} - | ^^^^^^ required by this bound in `_::Subtrait` - | - ::: tests/ui-msrv/invalid-impls/invalid-impls.rs:27:1 - | -27 | impl_or_verify!(T => FromBytes for Foo); - | ------------------------------------------ in this macro invocation - = note: this error originates in the macro `impl_or_verify` (in Nightly builds, run with -Z macro-backtrace for more info) -help: consider restricting type parameter `T` - | -27 | impl_or_verify!(T: zerocopy::FromBytes => FromBytes for Foo); - | +++++++++++++++++++++ - -error[E0277]: the trait bound `T: zerocopy::AsBytes` is not satisfied - --> tests/ui-msrv/invalid-impls/../../../src/macros.rs - | - | impl<$($tyvar $(: $(? $optbound +)* $($bound +)*)?),*> Subtrait for $ty {} - | ^^^^^^^^ the trait `zerocopy::AsBytes` is not implemented for `T` - | - ::: tests/ui-msrv/invalid-impls/invalid-impls.rs:28:1 - | -28 | impl_or_verify!(T => AsBytes for Foo); - | ---------------------------------------- in this macro invocation - | -note: required because of the requirements on the impl of `zerocopy::AsBytes` for `Foo` - --> tests/ui-msrv/invalid-impls/invalid-impls.rs:22:33 - | -22 | #[derive(FromZeroes, FromBytes, AsBytes, Unaligned)] - | ^^^^^^^ -note: required by a bound in `_::Subtrait` - --> tests/ui-msrv/invalid-impls/../../../src/macros.rs - | - | trait Subtrait: $trait {} - | ^^^^^^ required by this bound in `_::Subtrait` - | - ::: tests/ui-msrv/invalid-impls/invalid-impls.rs:28:1 - | -28 | impl_or_verify!(T => AsBytes for Foo); - | ---------------------------------------- in this macro invocation - = note: this error originates in the macro `impl_or_verify` (in Nightly builds, run with -Z macro-backtrace for more info) -help: consider restricting type parameter `T` - | -28 | impl_or_verify!(T: zerocopy::AsBytes => AsBytes for Foo); - | +++++++++++++++++++ - -error[E0277]: the trait bound `T: zerocopy::Unaligned` is not satisfied - --> tests/ui-msrv/invalid-impls/../../../src/macros.rs - | - | impl<$($tyvar $(: $(? $optbound +)* $($bound +)*)?),*> Subtrait for $ty {} - | ^^^^^^^^ the trait `zerocopy::Unaligned` is not implemented for `T` - | - ::: tests/ui-msrv/invalid-impls/invalid-impls.rs:29:1 - | -29 | impl_or_verify!(T => Unaligned for Foo); - | ------------------------------------------ in this macro invocation - | -note: required because of the requirements on the impl of `zerocopy::Unaligned` for `Foo` - --> tests/ui-msrv/invalid-impls/invalid-impls.rs:22:42 - | -22 | #[derive(FromZeroes, FromBytes, AsBytes, Unaligned)] - | ^^^^^^^^^ -note: required by a bound in `_::Subtrait` - --> tests/ui-msrv/invalid-impls/../../../src/macros.rs - | - | trait Subtrait: $trait {} - | ^^^^^^ required by this bound in `_::Subtrait` - | - ::: tests/ui-msrv/invalid-impls/invalid-impls.rs:29:1 - | -29 | impl_or_verify!(T => Unaligned for Foo); - | ------------------------------------------ in this macro invocation - = note: this error originates in the macro `impl_or_verify` (in Nightly builds, run with -Z macro-backtrace for more info) -help: consider restricting type parameter `T` - | -29 | impl_or_verify!(T: zerocopy::Unaligned => Unaligned for Foo); - | +++++++++++++++++++++ diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-dst-not-frombytes.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-dst-not-frombytes.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-dst-not-frombytes.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-dst-not-frombytes.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -// Copyright 2022 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -include!("../../zerocopy-derive/tests/util.rs"); - -extern crate zerocopy; - -use zerocopy::transmute; - -fn main() {} - -// `transmute` requires that the destination type implements `FromBytes` -const DST_NOT_FROM_BYTES: NotZerocopy = transmute!(AU16(0)); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-dst-not-frombytes.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-dst-not-frombytes.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-dst-not-frombytes.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-dst-not-frombytes.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,12 +0,0 @@ -error[E0277]: the trait bound `NotZerocopy: FromBytes` is not satisfied - --> tests/ui-msrv/transmute-dst-not-frombytes.rs:18:41 - | -18 | const DST_NOT_FROM_BYTES: NotZerocopy = transmute!(AU16(0)); - | ^^^^^^^^^^^^^^^^^^^ the trait `FromBytes` is not implemented for `NotZerocopy` - | -note: required by a bound in `AssertIsFromBytes` - --> tests/ui-msrv/transmute-dst-not-frombytes.rs:18:41 - | -18 | const DST_NOT_FROM_BYTES: NotZerocopy = transmute!(AU16(0)); - | ^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertIsFromBytes` - = note: this error originates in the macro `transmute` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-alignment-increase.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-alignment-increase.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-alignment-increase.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-alignment-increase.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,19 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -include!("../../zerocopy-derive/tests/util.rs"); - -extern crate zerocopy; - -use zerocopy::transmute_mut; - -fn main() {} - -// `transmute_mut!` does not support transmuting from a type of smaller -// alignment to one of larger alignment. -const INCREASE_ALIGNMENT: &mut AU16 = transmute_mut!(&mut [0u8; 2]); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-alignment-increase.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-alignment-increase.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-alignment-increase.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-alignment-increase.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,36 +0,0 @@ -error[E0512]: cannot transmute between types of different sizes, or dependently-sized types - --> tests/ui-msrv/transmute-mut-alignment-increase.rs:19:39 - | -19 | const INCREASE_ALIGNMENT: &mut AU16 = transmute_mut!(&mut [0u8; 2]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: source type: `AlignOf<[u8; 2]>` (8 bits) - = note: target type: `MaxAlignsOf<[u8; 2], AU16>` (16 bits) - = note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0658]: mutable references are not allowed in constants - --> tests/ui-msrv/transmute-mut-alignment-increase.rs:19:54 - | -19 | const INCREASE_ALIGNMENT: &mut AU16 = transmute_mut!(&mut [0u8; 2]); - | ^^^^^^^^^^^^^ - | - = note: see issue #57349 for more information - -error[E0015]: cannot call non-const fn `transmute_mut::<[u8; 2], AU16>` in constants - --> tests/ui-msrv/transmute-mut-alignment-increase.rs:19:39 - | -19 | const INCREASE_ALIGNMENT: &mut AU16 = transmute_mut!(&mut [0u8; 2]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: calls in constants are limited to constant functions, tuple structs and tuple variants - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0716]: temporary value dropped while borrowed - --> tests/ui-msrv/transmute-mut-alignment-increase.rs:19:59 - | -19 | const INCREASE_ALIGNMENT: &mut AU16 = transmute_mut!(&mut [0u8; 2]); - | --------------------^^^^^^^^- - | | | - | | creates a temporary which is freed while still in use - | temporary value is freed at the end of this statement - | using this value as a constant requires that borrow lasts for `'static` diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-const.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-const.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-const.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-const.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,20 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -include!("../../zerocopy-derive/tests/util.rs"); - -extern crate zerocopy; - -use zerocopy::transmute_mut; - -fn main() {} - -const ARRAY_OF_U8S: [u8; 2] = [0u8; 2]; - -// `transmute_mut!` cannot, generally speaking, be used in const contexts. -const CONST_CONTEXT: &mut [u8; 2] = transmute_mut!(&mut ARRAY_OF_U8S); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-const.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-const.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-const.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-const.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,41 +0,0 @@ -warning: taking a mutable reference to a `const` item - --> tests/ui-msrv/transmute-mut-const.rs:20:52 - | -20 | const CONST_CONTEXT: &mut [u8; 2] = transmute_mut!(&mut ARRAY_OF_U8S); - | ^^^^^^^^^^^^^^^^^ - | - = note: `#[warn(const_item_mutation)]` on by default - = note: each usage of a `const` item creates a new temporary - = note: the mutable reference will refer to this temporary, not the original `const` item -note: `const` item defined here - --> tests/ui-msrv/transmute-mut-const.rs:17:1 - | -17 | const ARRAY_OF_U8S: [u8; 2] = [0u8; 2]; - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -error[E0658]: mutable references are not allowed in constants - --> tests/ui-msrv/transmute-mut-const.rs:20:52 - | -20 | const CONST_CONTEXT: &mut [u8; 2] = transmute_mut!(&mut ARRAY_OF_U8S); - | ^^^^^^^^^^^^^^^^^ - | - = note: see issue #57349 for more information - -error[E0015]: cannot call non-const fn `transmute_mut::<[u8; 2], [u8; 2]>` in constants - --> tests/ui-msrv/transmute-mut-const.rs:20:37 - | -20 | const CONST_CONTEXT: &mut [u8; 2] = transmute_mut!(&mut ARRAY_OF_U8S); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: calls in constants are limited to constant functions, tuple structs and tuple variants - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0716]: temporary value dropped while borrowed - --> tests/ui-msrv/transmute-mut-const.rs:20:57 - | -20 | const CONST_CONTEXT: &mut [u8; 2] = transmute_mut!(&mut ARRAY_OF_U8S); - | --------------------^^^^^^^^^^^^- - | | | - | | creates a temporary which is freed while still in use - | temporary value is freed at the end of this statement - | using this value as a constant requires that borrow lasts for `'static` diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-dst-generic.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-dst-generic.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-dst-generic.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-dst-generic.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::{transmute_mut, AsBytes, FromBytes}; - -fn main() {} - -fn transmute_mut(u: &mut u8) -> &mut T { - // `transmute_mut!` requires the destination type to be concrete. - transmute_mut!(u) -} diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-dst-generic.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-dst-generic.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-dst-generic.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-dst-generic.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,19 +0,0 @@ -error[E0512]: cannot transmute between types of different sizes, or dependently-sized types - --> tests/ui-msrv/transmute-mut-dst-generic.rs:17:5 - | -17 | transmute_mut!(u) - | ^^^^^^^^^^^^^^^^^ - | - = note: source type: `u8` (8 bits) - = note: target type: `T` (this type does not have a fixed size) - = note: this error originates in the macro `$crate::assert_size_eq` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0512]: cannot transmute between types of different sizes, or dependently-sized types - --> tests/ui-msrv/transmute-mut-dst-generic.rs:17:5 - | -17 | transmute_mut!(u) - | ^^^^^^^^^^^^^^^^^ - | - = note: source type: `AlignOf` (8 bits) - = note: target type: `MaxAlignsOf` (size can vary because of T) - = note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-dst-not-a-reference.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-dst-not-a-reference.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-dst-not-a-reference.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-dst-not-a-reference.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::transmute_mut; - -fn main() {} - -// `transmute_mut!` does not support transmuting into a non-reference -// destination type. -const DST_NOT_A_REFERENCE: usize = transmute_mut!(&mut 0u8); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-dst-not-a-reference.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-dst-not-a-reference.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-dst-not-a-reference.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-dst-not-a-reference.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,39 +0,0 @@ -error[E0308]: mismatched types - --> tests/ui-msrv/transmute-mut-dst-not-a-reference.rs:17:36 - | -17 | const DST_NOT_A_REFERENCE: usize = transmute_mut!(&mut 0u8); - | ^^^^^^^^^^^^^^^^^^^^^^^^ expected `usize`, found `&mut _` - | - = note: expected type `usize` - found mutable reference `&mut _` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0308]: mismatched types - --> tests/ui-msrv/transmute-mut-dst-not-a-reference.rs:17:36 - | -17 | const DST_NOT_A_REFERENCE: usize = transmute_mut!(&mut 0u8); - | ^^^^^^^^^^^^^^^^^^^^^^^^ expected `usize`, found `&mut _` - | - = note: expected type `usize` - found mutable reference `&mut _` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0308]: mismatched types - --> tests/ui-msrv/transmute-mut-dst-not-a-reference.rs:17:36 - | -17 | const DST_NOT_A_REFERENCE: usize = transmute_mut!(&mut 0u8); - | ^^^^^^^^^^^^^^^^^^^^^^^^ expected `usize`, found `&mut _` - | - = note: expected type `usize` - found mutable reference `&mut _` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0308]: mismatched types - --> tests/ui-msrv/transmute-mut-dst-not-a-reference.rs:17:36 - | -17 | const DST_NOT_A_REFERENCE: usize = transmute_mut!(&mut 0u8); - | ^^^^^^^^^^^^^^^^^^^^^^^^ expected `usize`, found `&mut _` - | - = note: expected type `usize` - found mutable reference `&mut _` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-dst-not-asbytes.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-dst-not-asbytes.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-dst-not-asbytes.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-dst-not-asbytes.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,24 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::transmute_mut; - -fn main() {} - -#[derive(zerocopy::FromZeroes, zerocopy::FromBytes, zerocopy::AsBytes)] -#[repr(C)] -struct Src; - -#[derive(zerocopy::FromZeroes, zerocopy::FromBytes)] -#[repr(C)] -struct Dst; - -// `transmute_mut` requires that the destination type implements `AsBytes` -const DST_NOT_AS_BYTES: &mut Dst = transmute_mut!(&mut Src); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-dst-not-asbytes.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-dst-not-asbytes.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-dst-not-asbytes.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-dst-not-asbytes.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,12 +0,0 @@ -error[E0277]: the trait bound `Dst: AsBytes` is not satisfied - --> tests/ui-msrv/transmute-mut-dst-not-asbytes.rs:24:36 - | -24 | const DST_NOT_AS_BYTES: &mut Dst = transmute_mut!(&mut Src); - | ^^^^^^^^^^^^^^^^^^^^^^^^ the trait `AsBytes` is not implemented for `Dst` - | -note: required by a bound in `AssertDstIsAsBytes` - --> tests/ui-msrv/transmute-mut-dst-not-asbytes.rs:24:36 - | -24 | const DST_NOT_AS_BYTES: &mut Dst = transmute_mut!(&mut Src); - | ^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertDstIsAsBytes` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-dst-not-frombytes.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-dst-not-frombytes.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-dst-not-frombytes.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-dst-not-frombytes.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,24 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::transmute_mut; - -fn main() {} - -#[derive(zerocopy::FromZeroes, zerocopy::FromBytes, zerocopy::AsBytes)] -#[repr(C)] -struct Src; - -#[derive(zerocopy::AsBytes)] -#[repr(C)] -struct Dst; - -// `transmute_mut` requires that the destination type implements `FromBytes` -const DST_NOT_FROM_BYTES: &mut Dst = transmute_mut!(&mut Src); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-dst-not-frombytes.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-dst-not-frombytes.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-dst-not-frombytes.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-dst-not-frombytes.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,12 +0,0 @@ -error[E0277]: the trait bound `Dst: FromBytes` is not satisfied - --> tests/ui-msrv/transmute-mut-dst-not-frombytes.rs:24:38 - | -24 | const DST_NOT_FROM_BYTES: &mut Dst = transmute_mut!(&mut Src); - | ^^^^^^^^^^^^^^^^^^^^^^^^ the trait `FromBytes` is not implemented for `Dst` - | -note: required by a bound in `AssertDstIsFromBytes` - --> tests/ui-msrv/transmute-mut-dst-not-frombytes.rs:24:38 - | -24 | const DST_NOT_FROM_BYTES: &mut Dst = transmute_mut!(&mut Src); - | ^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertDstIsFromBytes` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-dst-unsized.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-dst-unsized.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-dst-unsized.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-dst-unsized.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::transmute_mut; - -fn main() {} - -// `transmute_mut!` does not support transmuting into an unsized destination -// type. -const DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8; 1]); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-dst-unsized.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-dst-unsized.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-dst-unsized.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-dst-unsized.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,108 +0,0 @@ -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-mut-dst-unsized.rs:17:32 - | -17 | const DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8; 1]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AssertDstIsFromBytes` - --> tests/ui-msrv/transmute-mut-dst-unsized.rs:17:32 - | -17 | const DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8; 1]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertDstIsFromBytes` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-mut-dst-unsized.rs:17:32 - | -17 | const DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8; 1]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AssertDstIsAsBytes` - --> tests/ui-msrv/transmute-mut-dst-unsized.rs:17:32 - | -17 | const DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8; 1]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertDstIsAsBytes` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-mut-dst-unsized.rs:17:32 - | -17 | const DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8; 1]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` - = note: all local variables must have a statically known size - = help: unsized locals are gated as an unstable feature - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-mut-dst-unsized.rs:17:32 - | -17 | const DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8; 1]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `MaxAlignsOf` - --> src/macro_util.rs - | - | pub union MaxAlignsOf { - | ^ required by this bound in `MaxAlignsOf` - = note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-mut-dst-unsized.rs:17:32 - | -17 | const DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8; 1]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `transmute` - --> $RUST/core/src/intrinsics.rs - | - | pub fn transmute(e: T) -> U; - | ^ required by this bound in `transmute` - = note: this error originates in the macro `$crate::assert_size_eq` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-mut-dst-unsized.rs:17:32 - | -17 | const DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8; 1]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `MaxAlignsOf::::new` - --> src/macro_util.rs - | - | impl MaxAlignsOf { - | ^ required by this bound in `MaxAlignsOf::::new` - = note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-mut-dst-unsized.rs:17:32 - | -17 | const DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8; 1]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `MaxAlignsOf` - --> src/macro_util.rs - | - | pub union MaxAlignsOf { - | ^ required by this bound in `MaxAlignsOf` - = note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-mut-dst-unsized.rs:17:32 - | -17 | const DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8; 1]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `transmute_mut` - --> src/macro_util.rs - | - | pub unsafe fn transmute_mut<'dst, 'src: 'dst, Src: 'src, Dst: 'dst>( - | ^^^ required by this bound in `transmute_mut` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-illegal-lifetime.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-illegal-lifetime.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-illegal-lifetime.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-illegal-lifetime.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -fn main() {} - -fn increase_lifetime() { - let mut x = 0u64; - // It is illegal to increase the lifetime scope. - let _: &'static mut u64 = zerocopy::transmute_mut!(&mut x); -} diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-illegal-lifetime.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-illegal-lifetime.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-illegal-lifetime.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-illegal-lifetime.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,9 +0,0 @@ -error[E0597]: `x` does not live long enough - --> tests/ui-msrv/transmute-mut-illegal-lifetime.rs:14:56 - | -14 | let _: &'static mut u64 = zerocopy::transmute_mut!(&mut x); - | ---------------- ^^^^^^ borrowed value does not live long enough - | | - | type annotation requires that `x` is borrowed for `'static` -15 | } - | - `x` dropped here while still borrowed diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-size-decrease.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-size-decrease.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-size-decrease.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-size-decrease.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::transmute_mut; - -fn main() {} - -// We require that the size of the destination type is not smaller than the size -// of the source type. -const DECREASE_SIZE: &mut u8 = transmute_mut!(&mut [0u8; 2]); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-size-decrease.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-size-decrease.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-size-decrease.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-size-decrease.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,36 +0,0 @@ -error[E0512]: cannot transmute between types of different sizes, or dependently-sized types - --> tests/ui-msrv/transmute-mut-size-decrease.rs:17:32 - | -17 | const DECREASE_SIZE: &mut u8 = transmute_mut!(&mut [0u8; 2]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: source type: `[u8; 2]` (16 bits) - = note: target type: `u8` (8 bits) - = note: this error originates in the macro `$crate::assert_size_eq` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0658]: mutable references are not allowed in constants - --> tests/ui-msrv/transmute-mut-size-decrease.rs:17:47 - | -17 | const DECREASE_SIZE: &mut u8 = transmute_mut!(&mut [0u8; 2]); - | ^^^^^^^^^^^^^ - | - = note: see issue #57349 for more information - -error[E0015]: cannot call non-const fn `transmute_mut::<[u8; 2], u8>` in constants - --> tests/ui-msrv/transmute-mut-size-decrease.rs:17:32 - | -17 | const DECREASE_SIZE: &mut u8 = transmute_mut!(&mut [0u8; 2]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: calls in constants are limited to constant functions, tuple structs and tuple variants - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0716]: temporary value dropped while borrowed - --> tests/ui-msrv/transmute-mut-size-decrease.rs:17:52 - | -17 | const DECREASE_SIZE: &mut u8 = transmute_mut!(&mut [0u8; 2]); - | --------------------^^^^^^^^- - | | | - | | creates a temporary which is freed while still in use - | temporary value is freed at the end of this statement - | using this value as a constant requires that borrow lasts for `'static` diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-size-increase.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-size-increase.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-size-increase.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-size-increase.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::transmute_mut; - -fn main() {} - -// `transmute_mut!` does not support transmuting from a smaller type to a larger -// one. -const INCREASE_SIZE: &mut [u8; 2] = transmute_mut!(&mut 0u8); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-size-increase.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-size-increase.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-size-increase.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-size-increase.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,36 +0,0 @@ -error[E0512]: cannot transmute between types of different sizes, or dependently-sized types - --> tests/ui-msrv/transmute-mut-size-increase.rs:17:37 - | -17 | const INCREASE_SIZE: &mut [u8; 2] = transmute_mut!(&mut 0u8); - | ^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: source type: `u8` (8 bits) - = note: target type: `[u8; 2]` (16 bits) - = note: this error originates in the macro `$crate::assert_size_eq` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0658]: mutable references are not allowed in constants - --> tests/ui-msrv/transmute-mut-size-increase.rs:17:52 - | -17 | const INCREASE_SIZE: &mut [u8; 2] = transmute_mut!(&mut 0u8); - | ^^^^^^^^ - | - = note: see issue #57349 for more information - -error[E0015]: cannot call non-const fn `transmute_mut::` in constants - --> tests/ui-msrv/transmute-mut-size-increase.rs:17:37 - | -17 | const INCREASE_SIZE: &mut [u8; 2] = transmute_mut!(&mut 0u8); - | ^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: calls in constants are limited to constant functions, tuple structs and tuple variants - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0716]: temporary value dropped while borrowed - --> tests/ui-msrv/transmute-mut-size-increase.rs:17:57 - | -17 | const INCREASE_SIZE: &mut [u8; 2] = transmute_mut!(&mut 0u8); - | --------------------^^^- - | | | - | | creates a temporary which is freed while still in use - | temporary value is freed at the end of this statement - | using this value as a constant requires that borrow lasts for `'static` diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-dst-generic.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-dst-generic.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-dst-generic.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-dst-generic.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,19 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::{transmute_mut, AsBytes, FromBytes}; - -fn main() {} - -fn transmute_mut(t: &mut T) -> &mut U { - // `transmute_mut!` requires the source and destination types to be - // concrete. - transmute_mut!(t) -} diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-dst-generic.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-dst-generic.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-dst-generic.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-dst-generic.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,19 +0,0 @@ -error[E0512]: cannot transmute between types of different sizes, or dependently-sized types - --> tests/ui-msrv/transmute-mut-src-dst-generic.rs:18:5 - | -18 | transmute_mut!(t) - | ^^^^^^^^^^^^^^^^^ - | - = note: source type: `T` (this type does not have a fixed size) - = note: target type: `U` (this type does not have a fixed size) - = note: this error originates in the macro `$crate::assert_size_eq` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0512]: cannot transmute between types of different sizes, or dependently-sized types - --> tests/ui-msrv/transmute-mut-src-dst-generic.rs:18:5 - | -18 | transmute_mut!(t) - | ^^^^^^^^^^^^^^^^^ - | - = note: source type: `AlignOf` (size can vary because of T) - = note: target type: `MaxAlignsOf` (size can vary because of T) - = note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-dst-not-references.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-dst-not-references.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-dst-not-references.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-dst-not-references.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::transmute_mut; - -fn main() {} - -// `transmute_mut!` does not support transmuting between non-reference source -// and destination types. -const SRC_DST_NOT_REFERENCES: &mut usize = transmute_mut!(0usize); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-dst-not-references.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-dst-not-references.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-dst-not-references.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-dst-not-references.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,12 +0,0 @@ -error[E0308]: mismatched types - --> tests/ui-msrv/transmute-mut-src-dst-not-references.rs:17:59 - | -17 | const SRC_DST_NOT_REFERENCES: &mut usize = transmute_mut!(0usize); - | ---------------^^^^^^- - | | | - | | expected `&mut _`, found `usize` - | | help: consider mutably borrowing here: `&mut 0usize` - | expected due to this - | - = note: expected mutable reference `&mut _` - found type `usize` diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-dst-unsized.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-dst-unsized.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-dst-unsized.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-dst-unsized.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::transmute_mut; - -fn main() {} - -// `transmute_mut!` does not support transmuting between unsized source and -// destination types. -const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-dst-unsized.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-dst-unsized.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-dst-unsized.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-dst-unsized.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,237 +0,0 @@ -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-mut-src-dst-unsized.rs:17:36 - | -17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AssertSrcIsFromBytes` - --> tests/ui-msrv/transmute-mut-src-dst-unsized.rs:17:36 - | -17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertSrcIsFromBytes` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-mut-src-dst-unsized.rs:17:36 - | -17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AssertSrcIsFromBytes` - --> tests/ui-msrv/transmute-mut-src-dst-unsized.rs:17:36 - | -17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertSrcIsFromBytes` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-mut-src-dst-unsized.rs:17:36 - | -17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AssertSrcIsAsBytes` - --> tests/ui-msrv/transmute-mut-src-dst-unsized.rs:17:36 - | -17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertSrcIsAsBytes` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-mut-src-dst-unsized.rs:17:36 - | -17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AssertSrcIsAsBytes` - --> tests/ui-msrv/transmute-mut-src-dst-unsized.rs:17:36 - | -17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertSrcIsAsBytes` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-mut-src-dst-unsized.rs:17:36 - | -17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AssertDstIsFromBytes` - --> tests/ui-msrv/transmute-mut-src-dst-unsized.rs:17:36 - | -17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertDstIsFromBytes` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-mut-src-dst-unsized.rs:17:36 - | -17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AssertDstIsAsBytes` - --> tests/ui-msrv/transmute-mut-src-dst-unsized.rs:17:36 - | -17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertDstIsAsBytes` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-mut-src-dst-unsized.rs:17:36 - | -17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` - = note: all local variables must have a statically known size - = help: unsized locals are gated as an unstable feature - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-mut-src-dst-unsized.rs:17:36 - | -17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `transmute` - --> $RUST/core/src/intrinsics.rs - | - | pub fn transmute(e: T) -> U; - | ^ required by this bound in `transmute` - = note: this error originates in the macro `$crate::assert_size_eq` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-mut-src-dst-unsized.rs:17:36 - | -17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AlignOf::::into_t` - --> src/macro_util.rs - | - | impl AlignOf { - | ^ required by this bound in `AlignOf::::into_t` - = note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-mut-src-dst-unsized.rs:17:36 - | -17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` - = note: the left-hand-side of an assignment must have a statically known size - = note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-mut-src-dst-unsized.rs:17:36 - | -17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AlignOf` - --> src/macro_util.rs - | - | pub struct AlignOf { - | ^ required by this bound in `AlignOf` - = note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-mut-src-dst-unsized.rs:17:36 - | -17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `MaxAlignsOf::::new` - --> src/macro_util.rs - | - | impl MaxAlignsOf { - | ^ required by this bound in `MaxAlignsOf::::new` - = note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-mut-src-dst-unsized.rs:17:36 - | -17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `MaxAlignsOf` - --> src/macro_util.rs - | - | pub union MaxAlignsOf { - | ^ required by this bound in `MaxAlignsOf` - = note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-mut-src-dst-unsized.rs:17:36 - | -17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `MaxAlignsOf` - --> src/macro_util.rs - | - | pub union MaxAlignsOf { - | ^ required by this bound in `MaxAlignsOf` - = note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-mut-src-dst-unsized.rs:17:36 - | -17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AlignOf` - --> src/macro_util.rs - | - | pub struct AlignOf { - | ^ required by this bound in `AlignOf` - = note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-mut-src-dst-unsized.rs:17:36 - | -17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` - = note: all local variables must have a statically known size - = help: unsized locals are gated as an unstable feature - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-mut-src-dst-unsized.rs:17:36 - | -17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `transmute_mut` - --> src/macro_util.rs - | - | pub unsafe fn transmute_mut<'dst, 'src: 'dst, Src: 'src, Dst: 'dst>( - | ^^^ required by this bound in `transmute_mut` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-mut-src-dst-unsized.rs:17:36 - | -17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` - = note: all function arguments must have a statically known size - = note: this error originates in the macro `$crate::assert_size_eq` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-generic.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-generic.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-generic.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-generic.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::{transmute_mut, AsBytes}; - -fn main() {} - -fn transmute_mut(t: &mut T) -> &mut u8 { - // `transmute_mut!` requires the source type to be concrete. - transmute_mut!(t) -} diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-generic.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-generic.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-generic.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-generic.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,10 +0,0 @@ -error[E0405]: cannot find trait `FromBytes` in this scope - --> tests/ui-msrv/transmute-mut-src-generic.rs:15:31 - | -15 | fn transmute_mut(t: &mut T) -> &mut u8 { - | ^^^^^^^^^ not found in this scope - | -help: consider importing this trait - | -11 | use zerocopy::FromBytes; - | diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-immutable.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-immutable.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-immutable.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-immutable.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::transmute_mut; - -fn main() {} - -fn ref_src_immutable() { - // `transmute_mut!` requires that its source type be a mutable reference. - let _: &mut u8 = transmute_mut!(&0u8); -} diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-immutable.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-immutable.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-immutable.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-immutable.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,11 +0,0 @@ -error[E0308]: mismatched types - --> tests/ui-msrv/transmute-mut-src-immutable.rs:17:37 - | -17 | let _: &mut u8 = transmute_mut!(&0u8); - | ---------------^^^^- - | | | - | | types differ in mutability - | expected due to this - | - = note: expected mutable reference `&mut _` - found reference `&u8` diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-not-a-reference.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-not-a-reference.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-not-a-reference.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-not-a-reference.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::transmute_mut; - -fn main() {} - -// `transmute_mut!` does not support transmuting from a non-reference source -// type. -const SRC_NOT_A_REFERENCE: &mut u8 = transmute_mut!(0usize); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-not-a-reference.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-not-a-reference.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-not-a-reference.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-not-a-reference.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,12 +0,0 @@ -error[E0308]: mismatched types - --> tests/ui-msrv/transmute-mut-src-not-a-reference.rs:17:53 - | -17 | const SRC_NOT_A_REFERENCE: &mut u8 = transmute_mut!(0usize); - | ---------------^^^^^^- - | | | - | | expected `&mut _`, found `usize` - | | help: consider mutably borrowing here: `&mut 0usize` - | expected due to this - | - = note: expected mutable reference `&mut _` - found type `usize` diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-not-asbytes.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-not-asbytes.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-not-asbytes.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-not-asbytes.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,24 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::transmute_mut; - -fn main() {} - -#[derive(zerocopy::FromZeroes, zerocopy::FromBytes)] -#[repr(C)] -struct Src; - -#[derive(zerocopy::FromZeroes, zerocopy::FromBytes, zerocopy::AsBytes)] -#[repr(C)] -struct Dst; - -// `transmute_mut` requires that the source type implements `AsBytes` -const SRC_NOT_AS_BYTES: &mut Dst = transmute_mut!(&mut Src); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-not-asbytes.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-not-asbytes.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-not-asbytes.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-not-asbytes.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -error[E0277]: the trait bound `Src: AsBytes` is not satisfied - --> tests/ui-msrv/transmute-mut-src-not-asbytes.rs:24:36 - | -24 | const SRC_NOT_AS_BYTES: &mut Dst = transmute_mut!(&mut Src); - | ^^^^^^^^^^^^^^^^^^^^^^^^ the trait `AsBytes` is not implemented for `Src` - | -note: required by a bound in `AssertSrcIsAsBytes` - --> tests/ui-msrv/transmute-mut-src-not-asbytes.rs:24:36 - | -24 | const SRC_NOT_AS_BYTES: &mut Dst = transmute_mut!(&mut Src); - | ^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertSrcIsAsBytes` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the trait bound `Src: AsBytes` is not satisfied - --> tests/ui-msrv/transmute-mut-src-not-asbytes.rs:24:36 - | -24 | const SRC_NOT_AS_BYTES: &mut Dst = transmute_mut!(&mut Src); - | ^^^^^^^^^^^^^^^^^^^^^^^^ the trait `AsBytes` is not implemented for `Src` - | -note: required by a bound in `AssertSrcIsAsBytes` - --> tests/ui-msrv/transmute-mut-src-not-asbytes.rs:24:36 - | -24 | const SRC_NOT_AS_BYTES: &mut Dst = transmute_mut!(&mut Src); - | ^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertSrcIsAsBytes` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-not-frombytes.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-not-frombytes.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-not-frombytes.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-not-frombytes.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,24 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::transmute_mut; - -fn main() {} - -#[derive(zerocopy::AsBytes)] -#[repr(C)] -struct Src; - -#[derive(zerocopy::FromZeroes, zerocopy::FromBytes, zerocopy::AsBytes)] -#[repr(C)] -struct Dst; - -// `transmute_mut` requires that the source type implements `FromBytes` -const SRC_NOT_FROM_BYTES: &mut Dst = transmute_mut!(&mut Src); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-not-frombytes.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-not-frombytes.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-not-frombytes.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-not-frombytes.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -error[E0277]: the trait bound `Src: FromBytes` is not satisfied - --> tests/ui-msrv/transmute-mut-src-not-frombytes.rs:24:38 - | -24 | const SRC_NOT_FROM_BYTES: &mut Dst = transmute_mut!(&mut Src); - | ^^^^^^^^^^^^^^^^^^^^^^^^ the trait `FromBytes` is not implemented for `Src` - | -note: required by a bound in `AssertSrcIsFromBytes` - --> tests/ui-msrv/transmute-mut-src-not-frombytes.rs:24:38 - | -24 | const SRC_NOT_FROM_BYTES: &mut Dst = transmute_mut!(&mut Src); - | ^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertSrcIsFromBytes` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the trait bound `Src: FromBytes` is not satisfied - --> tests/ui-msrv/transmute-mut-src-not-frombytes.rs:24:38 - | -24 | const SRC_NOT_FROM_BYTES: &mut Dst = transmute_mut!(&mut Src); - | ^^^^^^^^^^^^^^^^^^^^^^^^ the trait `FromBytes` is not implemented for `Src` - | -note: required by a bound in `AssertSrcIsFromBytes` - --> tests/ui-msrv/transmute-mut-src-not-frombytes.rs:24:38 - | -24 | const SRC_NOT_FROM_BYTES: &mut Dst = transmute_mut!(&mut Src); - | ^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertSrcIsFromBytes` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-unsized.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-unsized.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-unsized.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-unsized.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,16 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::transmute_mut; - -fn main() {} - -// `transmute_mut!` does not support transmuting from an unsized source type. -const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-unsized.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-unsized.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-unsized.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-unsized.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,198 +0,0 @@ -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-mut-src-unsized.rs:16:35 - | -16 | const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AssertSrcIsFromBytes` - --> tests/ui-msrv/transmute-mut-src-unsized.rs:16:35 - | -16 | const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertSrcIsFromBytes` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-mut-src-unsized.rs:16:35 - | -16 | const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AssertSrcIsFromBytes` - --> tests/ui-msrv/transmute-mut-src-unsized.rs:16:35 - | -16 | const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertSrcIsFromBytes` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-mut-src-unsized.rs:16:35 - | -16 | const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AssertSrcIsAsBytes` - --> tests/ui-msrv/transmute-mut-src-unsized.rs:16:35 - | -16 | const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertSrcIsAsBytes` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-mut-src-unsized.rs:16:35 - | -16 | const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AssertSrcIsAsBytes` - --> tests/ui-msrv/transmute-mut-src-unsized.rs:16:35 - | -16 | const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertSrcIsAsBytes` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-mut-src-unsized.rs:16:35 - | -16 | const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` - = note: all local variables must have a statically known size - = help: unsized locals are gated as an unstable feature - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-mut-src-unsized.rs:16:35 - | -16 | const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `transmute` - --> $RUST/core/src/intrinsics.rs - | - | pub fn transmute(e: T) -> U; - | ^ required by this bound in `transmute` - = note: this error originates in the macro `$crate::assert_size_eq` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-mut-src-unsized.rs:16:35 - | -16 | const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AlignOf::::into_t` - --> src/macro_util.rs - | - | impl AlignOf { - | ^ required by this bound in `AlignOf::::into_t` - = note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-mut-src-unsized.rs:16:35 - | -16 | const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` - = note: the left-hand-side of an assignment must have a statically known size - = note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-mut-src-unsized.rs:16:35 - | -16 | const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AlignOf` - --> src/macro_util.rs - | - | pub struct AlignOf { - | ^ required by this bound in `AlignOf` - = note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-mut-src-unsized.rs:16:35 - | -16 | const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `MaxAlignsOf::::new` - --> src/macro_util.rs - | - | impl MaxAlignsOf { - | ^ required by this bound in `MaxAlignsOf::::new` - = note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-mut-src-unsized.rs:16:35 - | -16 | const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `MaxAlignsOf` - --> src/macro_util.rs - | - | pub union MaxAlignsOf { - | ^ required by this bound in `MaxAlignsOf` - = note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-mut-src-unsized.rs:16:35 - | -16 | const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `MaxAlignsOf` - --> src/macro_util.rs - | - | pub union MaxAlignsOf { - | ^ required by this bound in `MaxAlignsOf` - = note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-mut-src-unsized.rs:16:35 - | -16 | const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AlignOf` - --> src/macro_util.rs - | - | pub struct AlignOf { - | ^ required by this bound in `AlignOf` - = note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-mut-src-unsized.rs:16:35 - | -16 | const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `transmute_mut` - --> src/macro_util.rs - | - | pub unsafe fn transmute_mut<'dst, 'src: 'dst, Src: 'src, Dst: 'dst>( - | ^^^ required by this bound in `transmute_mut` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-mut-src-unsized.rs:16:35 - | -16 | const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` - = note: all function arguments must have a statically known size - = note: this error originates in the macro `$crate::assert_size_eq` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ptr-to-usize.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ptr-to-usize.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ptr-to-usize.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ptr-to-usize.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,20 +0,0 @@ -// Copyright 2022 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::transmute; - -fn main() {} - -// It is unclear whether we can or should support this transmutation, especially -// in a const context. This test ensures that even if such a transmutation -// becomes valid due to the requisite implementations of `FromBytes` being -// added, that we re-examine whether it should specifically be valid in a const -// context. -const POINTER_VALUE: usize = transmute!(&0usize as *const usize); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ptr-to-usize.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ptr-to-usize.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ptr-to-usize.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ptr-to-usize.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,37 +0,0 @@ -error[E0277]: the trait bound `*const usize: AsBytes` is not satisfied - --> tests/ui-msrv/transmute-ptr-to-usize.rs:20:30 - | -20 | const POINTER_VALUE: usize = transmute!(&0usize as *const usize); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `AsBytes` is not implemented for `*const usize` - | - = help: the following implementations were found: - - - - - and $N others -note: required by a bound in `AssertIsAsBytes` - --> tests/ui-msrv/transmute-ptr-to-usize.rs:20:30 - | -20 | const POINTER_VALUE: usize = transmute!(&0usize as *const usize); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertIsAsBytes` - = note: this error originates in the macro `transmute` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the trait bound `*const usize: AsBytes` is not satisfied - --> tests/ui-msrv/transmute-ptr-to-usize.rs:20:30 - | -20 | const POINTER_VALUE: usize = transmute!(&0usize as *const usize); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `AsBytes` is not implemented for `*const usize` - | - = help: the following implementations were found: - - - - - and $N others -note: required by a bound in `AssertIsAsBytes` - --> tests/ui-msrv/transmute-ptr-to-usize.rs:20:30 - | -20 | const POINTER_VALUE: usize = transmute!(&0usize as *const usize); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertIsAsBytes` - = note: this error originates in the macro `transmute` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-alignment-increase.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-alignment-increase.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-alignment-increase.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-alignment-increase.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,19 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -include!("../../zerocopy-derive/tests/util.rs"); - -extern crate zerocopy; - -use zerocopy::transmute_ref; - -fn main() {} - -// `transmute_ref!` does not support transmuting from a type of smaller -// alignment to one of larger alignment. -const INCREASE_ALIGNMENT: &AU16 = transmute_ref!(&[0u8; 2]); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-alignment-increase.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-alignment-increase.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-alignment-increase.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-alignment-increase.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,9 +0,0 @@ -error[E0512]: cannot transmute between types of different sizes, or dependently-sized types - --> tests/ui-msrv/transmute-ref-alignment-increase.rs:19:35 - | -19 | const INCREASE_ALIGNMENT: &AU16 = transmute_ref!(&[0u8; 2]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: source type: `AlignOf<[u8; 2]>` (8 bits) - = note: target type: `MaxAlignsOf<[u8; 2], AU16>` (16 bits) - = note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-dst-generic.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-dst-generic.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-dst-generic.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-dst-generic.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::{transmute_ref, FromBytes}; - -fn main() {} - -fn transmute_ref(u: &u8) -> &T { - // `transmute_ref!` requires the destination type to be concrete. - transmute_ref!(u) -} diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-dst-generic.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-dst-generic.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-dst-generic.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-dst-generic.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,19 +0,0 @@ -error[E0512]: cannot transmute between types of different sizes, or dependently-sized types - --> tests/ui-msrv/transmute-ref-dst-generic.rs:17:5 - | -17 | transmute_ref!(u) - | ^^^^^^^^^^^^^^^^^ - | - = note: source type: `u8` (8 bits) - = note: target type: `T` (this type does not have a fixed size) - = note: this error originates in the macro `$crate::assert_size_eq` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0512]: cannot transmute between types of different sizes, or dependently-sized types - --> tests/ui-msrv/transmute-ref-dst-generic.rs:17:5 - | -17 | transmute_ref!(u) - | ^^^^^^^^^^^^^^^^^ - | - = note: source type: `AlignOf` (8 bits) - = note: target type: `MaxAlignsOf` (size can vary because of T) - = note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-dst-mutable.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-dst-mutable.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-dst-mutable.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-dst-mutable.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,19 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::transmute_ref; - -fn main() {} - -fn ref_dst_mutable() { - // `transmute_ref!` requires that its destination type be an immutable - // reference. - let _: &mut u8 = transmute_ref!(&0u8); -} diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-dst-mutable.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-dst-mutable.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-dst-mutable.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-dst-mutable.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,29 +0,0 @@ -error[E0308]: mismatched types - --> tests/ui-msrv/transmute-ref-dst-mutable.rs:18:22 - | -18 | let _: &mut u8 = transmute_ref!(&0u8); - | ^^^^^^^^^^^^^^^^^^^^ types differ in mutability - | - = note: expected mutable reference `&mut u8` - found reference `&_` - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0308]: mismatched types - --> tests/ui-msrv/transmute-ref-dst-mutable.rs:18:22 - | -18 | let _: &mut u8 = transmute_ref!(&0u8); - | ^^^^^^^^^^^^^^^^^^^^ types differ in mutability - | - = note: expected mutable reference `&mut u8` - found reference `&_` - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0308]: mismatched types - --> tests/ui-msrv/transmute-ref-dst-mutable.rs:18:22 - | -18 | let _: &mut u8 = transmute_ref!(&0u8); - | ^^^^^^^^^^^^^^^^^^^^ types differ in mutability - | - = note: expected mutable reference `&mut u8` - found reference `&_` - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-dst-not-a-reference.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-dst-not-a-reference.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-dst-not-a-reference.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-dst-not-a-reference.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::transmute_ref; - -fn main() {} - -// `transmute_ref!` does not support transmuting into a non-reference -// destination type. -const DST_NOT_A_REFERENCE: usize = transmute_ref!(&0u8); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-dst-not-a-reference.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-dst-not-a-reference.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-dst-not-a-reference.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-dst-not-a-reference.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,29 +0,0 @@ -error[E0308]: mismatched types - --> tests/ui-msrv/transmute-ref-dst-not-a-reference.rs:17:36 - | -17 | const DST_NOT_A_REFERENCE: usize = transmute_ref!(&0u8); - | ^^^^^^^^^^^^^^^^^^^^ expected `usize`, found reference - | - = note: expected type `usize` - found reference `&_` - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0308]: mismatched types - --> tests/ui-msrv/transmute-ref-dst-not-a-reference.rs:17:36 - | -17 | const DST_NOT_A_REFERENCE: usize = transmute_ref!(&0u8); - | ^^^^^^^^^^^^^^^^^^^^ expected `usize`, found reference - | - = note: expected type `usize` - found reference `&_` - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0308]: mismatched types - --> tests/ui-msrv/transmute-ref-dst-not-a-reference.rs:17:36 - | -17 | const DST_NOT_A_REFERENCE: usize = transmute_ref!(&0u8); - | ^^^^^^^^^^^^^^^^^^^^ expected `usize`, found reference - | - = note: expected type `usize` - found reference `&_` - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-dst-not-frombytes.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-dst-not-frombytes.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-dst-not-frombytes.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-dst-not-frombytes.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -include!("../../zerocopy-derive/tests/util.rs"); - -extern crate zerocopy; - -use zerocopy::transmute_ref; - -fn main() {} - -// `transmute_ref` requires that the destination type implements `FromBytes` -const DST_NOT_FROM_BYTES: &NotZerocopy = transmute_ref!(&AU16(0)); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-dst-not-frombytes.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-dst-not-frombytes.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-dst-not-frombytes.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-dst-not-frombytes.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,12 +0,0 @@ -error[E0277]: the trait bound `NotZerocopy: FromBytes` is not satisfied - --> tests/ui-msrv/transmute-ref-dst-not-frombytes.rs:18:42 - | -18 | const DST_NOT_FROM_BYTES: &NotZerocopy = transmute_ref!(&AU16(0)); - | ^^^^^^^^^^^^^^^^^^^^^^^^ the trait `FromBytes` is not implemented for `NotZerocopy` - | -note: required by a bound in `AssertIsFromBytes` - --> tests/ui-msrv/transmute-ref-dst-not-frombytes.rs:18:42 - | -18 | const DST_NOT_FROM_BYTES: &NotZerocopy = transmute_ref!(&AU16(0)); - | ^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertIsFromBytes` - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-dst-unsized.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-dst-unsized.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-dst-unsized.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-dst-unsized.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::transmute_ref; - -fn main() {} - -// `transmute_ref!` does not support transmuting into an unsized destination -// type. -const DST_UNSIZED: &[u8] = transmute_ref!(&[0u8; 1]); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-dst-unsized.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-dst-unsized.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-dst-unsized.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-dst-unsized.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,94 +0,0 @@ -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-ref-dst-unsized.rs:17:28 - | -17 | const DST_UNSIZED: &[u8] = transmute_ref!(&[0u8; 1]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AssertIsFromBytes` - --> tests/ui-msrv/transmute-ref-dst-unsized.rs:17:28 - | -17 | const DST_UNSIZED: &[u8] = transmute_ref!(&[0u8; 1]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertIsFromBytes` - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-ref-dst-unsized.rs:17:28 - | -17 | const DST_UNSIZED: &[u8] = transmute_ref!(&[0u8; 1]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` - = note: all local variables must have a statically known size - = help: unsized locals are gated as an unstable feature - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-ref-dst-unsized.rs:17:28 - | -17 | const DST_UNSIZED: &[u8] = transmute_ref!(&[0u8; 1]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `MaxAlignsOf` - --> src/macro_util.rs - | - | pub union MaxAlignsOf { - | ^ required by this bound in `MaxAlignsOf` - = note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-ref-dst-unsized.rs:17:28 - | -17 | const DST_UNSIZED: &[u8] = transmute_ref!(&[0u8; 1]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `transmute` - --> $RUST/core/src/intrinsics.rs - | - | pub fn transmute(e: T) -> U; - | ^ required by this bound in `transmute` - = note: this error originates in the macro `$crate::assert_size_eq` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-ref-dst-unsized.rs:17:28 - | -17 | const DST_UNSIZED: &[u8] = transmute_ref!(&[0u8; 1]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `MaxAlignsOf::::new` - --> src/macro_util.rs - | - | impl MaxAlignsOf { - | ^ required by this bound in `MaxAlignsOf::::new` - = note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-ref-dst-unsized.rs:17:28 - | -17 | const DST_UNSIZED: &[u8] = transmute_ref!(&[0u8; 1]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `MaxAlignsOf` - --> src/macro_util.rs - | - | pub union MaxAlignsOf { - | ^ required by this bound in `MaxAlignsOf` - = note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-ref-dst-unsized.rs:17:28 - | -17 | const DST_UNSIZED: &[u8] = transmute_ref!(&[0u8; 1]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `transmute_ref` - --> src/macro_util.rs - | - | pub const unsafe fn transmute_ref<'dst, 'src: 'dst, Src: 'src, Dst: 'dst>( - | ^^^ required by this bound in `transmute_ref` - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-illegal-lifetime.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-illegal-lifetime.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-illegal-lifetime.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-illegal-lifetime.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -fn main() {} - -fn increase_lifetime() { - let x = 0u64; - // It is illegal to increase the lifetime scope. - let _: &'static u64 = zerocopy::transmute_ref!(&x); -} diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-illegal-lifetime.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-illegal-lifetime.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-illegal-lifetime.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-illegal-lifetime.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,9 +0,0 @@ -error[E0597]: `x` does not live long enough - --> tests/ui-msrv/transmute-ref-illegal-lifetime.rs:14:52 - | -14 | let _: &'static u64 = zerocopy::transmute_ref!(&x); - | ------------ ^^ borrowed value does not live long enough - | | - | type annotation requires that `x` is borrowed for `'static` -15 | } - | - `x` dropped here while still borrowed diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-size-decrease.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-size-decrease.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-size-decrease.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-size-decrease.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::transmute_ref; - -fn main() {} - -// Although this is not a soundness requirement, we currently require that the -// size of the destination type is not smaller than the size of the source type. -const DECREASE_SIZE: &u8 = transmute_ref!(&[0u8; 2]); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-size-decrease.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-size-decrease.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-size-decrease.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-size-decrease.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,9 +0,0 @@ -error[E0512]: cannot transmute between types of different sizes, or dependently-sized types - --> tests/ui-msrv/transmute-ref-size-decrease.rs:17:28 - | -17 | const DECREASE_SIZE: &u8 = transmute_ref!(&[0u8; 2]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: source type: `[u8; 2]` (16 bits) - = note: target type: `u8` (8 bits) - = note: this error originates in the macro `$crate::assert_size_eq` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-size-increase.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-size-increase.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-size-increase.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-size-increase.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::transmute_ref; - -fn main() {} - -// `transmute_ref!` does not support transmuting from a smaller type to a larger -// one. -const INCREASE_SIZE: &[u8; 2] = transmute_ref!(&0u8); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-size-increase.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-size-increase.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-size-increase.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-size-increase.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,9 +0,0 @@ -error[E0512]: cannot transmute between types of different sizes, or dependently-sized types - --> tests/ui-msrv/transmute-ref-size-increase.rs:17:33 - | -17 | const INCREASE_SIZE: &[u8; 2] = transmute_ref!(&0u8); - | ^^^^^^^^^^^^^^^^^^^^ - | - = note: source type: `u8` (8 bits) - = note: target type: `[u8; 2]` (16 bits) - = note: this error originates in the macro `$crate::assert_size_eq` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-src-dst-generic.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-src-dst-generic.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-src-dst-generic.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-src-dst-generic.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,19 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::{transmute_ref, AsBytes, FromBytes}; - -fn main() {} - -fn transmute_ref(t: &T) -> &U { - // `transmute_ref!` requires the source and destination types to be - // concrete. - transmute_ref!(t) -} diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-src-dst-generic.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-src-dst-generic.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-src-dst-generic.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-src-dst-generic.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,19 +0,0 @@ -error[E0512]: cannot transmute between types of different sizes, or dependently-sized types - --> tests/ui-msrv/transmute-ref-src-dst-generic.rs:18:5 - | -18 | transmute_ref!(t) - | ^^^^^^^^^^^^^^^^^ - | - = note: source type: `T` (this type does not have a fixed size) - = note: target type: `U` (this type does not have a fixed size) - = note: this error originates in the macro `$crate::assert_size_eq` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0512]: cannot transmute between types of different sizes, or dependently-sized types - --> tests/ui-msrv/transmute-ref-src-dst-generic.rs:18:5 - | -18 | transmute_ref!(t) - | ^^^^^^^^^^^^^^^^^ - | - = note: source type: `AlignOf` (size can vary because of T) - = note: target type: `MaxAlignsOf` (size can vary because of T) - = note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-src-dst-not-references.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-src-dst-not-references.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-src-dst-not-references.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-src-dst-not-references.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::transmute_ref; - -fn main() {} - -// `transmute_ref!` does not support transmuting between non-reference source -// and destination types. -const SRC_DST_NOT_REFERENCES: usize = transmute_ref!(0usize); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-src-dst-not-references.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-src-dst-not-references.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-src-dst-not-references.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-src-dst-not-references.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,42 +0,0 @@ -error[E0308]: mismatched types - --> tests/ui-msrv/transmute-ref-src-dst-not-references.rs:17:54 - | -17 | const SRC_DST_NOT_REFERENCES: usize = transmute_ref!(0usize); - | ---------------^^^^^^- - | | | - | | expected reference, found `usize` - | | help: consider borrowing here: `&0usize` - | expected due to this - | - = note: expected reference `&_` - found type `usize` - -error[E0308]: mismatched types - --> tests/ui-msrv/transmute-ref-src-dst-not-references.rs:17:39 - | -17 | const SRC_DST_NOT_REFERENCES: usize = transmute_ref!(0usize); - | ^^^^^^^^^^^^^^^^^^^^^^ expected `usize`, found reference - | - = note: expected type `usize` - found reference `&_` - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0308]: mismatched types - --> tests/ui-msrv/transmute-ref-src-dst-not-references.rs:17:39 - | -17 | const SRC_DST_NOT_REFERENCES: usize = transmute_ref!(0usize); - | ^^^^^^^^^^^^^^^^^^^^^^ expected `usize`, found reference - | - = note: expected type `usize` - found reference `&_` - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0308]: mismatched types - --> tests/ui-msrv/transmute-ref-src-dst-not-references.rs:17:39 - | -17 | const SRC_DST_NOT_REFERENCES: usize = transmute_ref!(0usize); - | ^^^^^^^^^^^^^^^^^^^^^^ expected `usize`, found reference - | - = note: expected type `usize` - found reference `&_` - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-src-dst-unsized.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-src-dst-unsized.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-src-dst-unsized.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-src-dst-unsized.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::transmute_ref; - -fn main() {} - -// `transmute_ref!` does not support transmuting between unsized source and -// destination types. -const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-src-dst-unsized.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-src-dst-unsized.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-src-dst-unsized.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-src-dst-unsized.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,195 +0,0 @@ -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-ref-src-dst-unsized.rs:17:32 - | -17 | const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AssertIsAsBytes` - --> tests/ui-msrv/transmute-ref-src-dst-unsized.rs:17:32 - | -17 | const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertIsAsBytes` - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-ref-src-dst-unsized.rs:17:32 - | -17 | const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AssertIsAsBytes` - --> tests/ui-msrv/transmute-ref-src-dst-unsized.rs:17:32 - | -17 | const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertIsAsBytes` - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-ref-src-dst-unsized.rs:17:32 - | -17 | const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AssertIsFromBytes` - --> tests/ui-msrv/transmute-ref-src-dst-unsized.rs:17:32 - | -17 | const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertIsFromBytes` - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-ref-src-dst-unsized.rs:17:32 - | -17 | const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` - = note: all local variables must have a statically known size - = help: unsized locals are gated as an unstable feature - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-ref-src-dst-unsized.rs:17:32 - | -17 | const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `transmute` - --> $RUST/core/src/intrinsics.rs - | - | pub fn transmute(e: T) -> U; - | ^ required by this bound in `transmute` - = note: this error originates in the macro `$crate::assert_size_eq` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-ref-src-dst-unsized.rs:17:32 - | -17 | const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AlignOf::::into_t` - --> src/macro_util.rs - | - | impl AlignOf { - | ^ required by this bound in `AlignOf::::into_t` - = note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-ref-src-dst-unsized.rs:17:32 - | -17 | const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` - = note: the left-hand-side of an assignment must have a statically known size - = note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-ref-src-dst-unsized.rs:17:32 - | -17 | const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AlignOf` - --> src/macro_util.rs - | - | pub struct AlignOf { - | ^ required by this bound in `AlignOf` - = note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-ref-src-dst-unsized.rs:17:32 - | -17 | const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `MaxAlignsOf::::new` - --> src/macro_util.rs - | - | impl MaxAlignsOf { - | ^ required by this bound in `MaxAlignsOf::::new` - = note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-ref-src-dst-unsized.rs:17:32 - | -17 | const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `MaxAlignsOf` - --> src/macro_util.rs - | - | pub union MaxAlignsOf { - | ^ required by this bound in `MaxAlignsOf` - = note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-ref-src-dst-unsized.rs:17:32 - | -17 | const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `MaxAlignsOf` - --> src/macro_util.rs - | - | pub union MaxAlignsOf { - | ^ required by this bound in `MaxAlignsOf` - = note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-ref-src-dst-unsized.rs:17:32 - | -17 | const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AlignOf` - --> src/macro_util.rs - | - | pub struct AlignOf { - | ^ required by this bound in `AlignOf` - = note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-ref-src-dst-unsized.rs:17:32 - | -17 | const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` - = note: all local variables must have a statically known size - = help: unsized locals are gated as an unstable feature - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-ref-src-dst-unsized.rs:17:32 - | -17 | const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `transmute_ref` - --> src/macro_util.rs - | - | pub const unsafe fn transmute_ref<'dst, 'src: 'dst, Src: 'src, Dst: 'dst>( - | ^^^ required by this bound in `transmute_ref` - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-ref-src-dst-unsized.rs:17:32 - | -17 | const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` - = note: all function arguments must have a statically known size - = note: this error originates in the macro `$crate::assert_size_eq` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-src-generic.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-src-generic.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-src-generic.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-src-generic.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::{transmute_ref, AsBytes}; - -fn main() {} - -fn transmute_ref(t: &T) -> &u8 { - // `transmute_ref!` requires the source type to be concrete. - transmute_ref!(t) -} diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-src-generic.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-src-generic.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-src-generic.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-src-generic.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,19 +0,0 @@ -error[E0512]: cannot transmute between types of different sizes, or dependently-sized types - --> tests/ui-msrv/transmute-ref-src-generic.rs:17:5 - | -17 | transmute_ref!(t) - | ^^^^^^^^^^^^^^^^^ - | - = note: source type: `T` (this type does not have a fixed size) - = note: target type: `u8` (8 bits) - = note: this error originates in the macro `$crate::assert_size_eq` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0512]: cannot transmute between types of different sizes, or dependently-sized types - --> tests/ui-msrv/transmute-ref-src-generic.rs:17:5 - | -17 | transmute_ref!(t) - | ^^^^^^^^^^^^^^^^^ - | - = note: source type: `AlignOf` (size can vary because of T) - = note: target type: `MaxAlignsOf` (size can vary because of T) - = note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-src-not-a-reference.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-src-not-a-reference.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-src-not-a-reference.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-src-not-a-reference.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::transmute_ref; - -fn main() {} - -// `transmute_ref!` does not support transmuting from a non-reference source -// type. -const SRC_NOT_A_REFERENCE: &u8 = transmute_ref!(0usize); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-src-not-a-reference.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-src-not-a-reference.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-src-not-a-reference.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-src-not-a-reference.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,12 +0,0 @@ -error[E0308]: mismatched types - --> tests/ui-msrv/transmute-ref-src-not-a-reference.rs:17:49 - | -17 | const SRC_NOT_A_REFERENCE: &u8 = transmute_ref!(0usize); - | ---------------^^^^^^- - | | | - | | expected reference, found `usize` - | | help: consider borrowing here: `&0usize` - | expected due to this - | - = note: expected reference `&_` - found type `usize` diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-src-not-asbytes.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-src-not-asbytes.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-src-not-asbytes.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-src-not-asbytes.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -include!("../../zerocopy-derive/tests/util.rs"); - -extern crate zerocopy; - -use zerocopy::transmute_ref; - -fn main() {} - -// `transmute_ref` requires that the source type implements `AsBytes` -const SRC_NOT_AS_BYTES: &AU16 = transmute_ref!(&NotZerocopy(AU16(0))); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-src-not-asbytes.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-src-not-asbytes.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-src-not-asbytes.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-src-not-asbytes.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -error[E0277]: the trait bound `NotZerocopy: AsBytes` is not satisfied - --> tests/ui-msrv/transmute-ref-src-not-asbytes.rs:18:33 - | -18 | const SRC_NOT_AS_BYTES: &AU16 = transmute_ref!(&NotZerocopy(AU16(0))); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `AsBytes` is not implemented for `NotZerocopy` - | -note: required by a bound in `AssertIsAsBytes` - --> tests/ui-msrv/transmute-ref-src-not-asbytes.rs:18:33 - | -18 | const SRC_NOT_AS_BYTES: &AU16 = transmute_ref!(&NotZerocopy(AU16(0))); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertIsAsBytes` - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the trait bound `NotZerocopy: AsBytes` is not satisfied - --> tests/ui-msrv/transmute-ref-src-not-asbytes.rs:18:33 - | -18 | const SRC_NOT_AS_BYTES: &AU16 = transmute_ref!(&NotZerocopy(AU16(0))); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `AsBytes` is not implemented for `NotZerocopy` - | -note: required by a bound in `AssertIsAsBytes` - --> tests/ui-msrv/transmute-ref-src-not-asbytes.rs:18:33 - | -18 | const SRC_NOT_AS_BYTES: &AU16 = transmute_ref!(&NotZerocopy(AU16(0))); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertIsAsBytes` - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-src-unsized.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-src-unsized.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-src-unsized.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-src-unsized.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,16 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::transmute_ref; - -fn main() {} - -// `transmute_ref!` does not support transmuting from an unsized source type. -const SRC_UNSIZED: &[u8; 1] = transmute_ref!(&[0u8][..]); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-src-unsized.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-src-unsized.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-src-unsized.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-ref-src-unsized.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,170 +0,0 @@ -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-ref-src-unsized.rs:16:31 - | -16 | const SRC_UNSIZED: &[u8; 1] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AssertIsAsBytes` - --> tests/ui-msrv/transmute-ref-src-unsized.rs:16:31 - | -16 | const SRC_UNSIZED: &[u8; 1] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertIsAsBytes` - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-ref-src-unsized.rs:16:31 - | -16 | const SRC_UNSIZED: &[u8; 1] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AssertIsAsBytes` - --> tests/ui-msrv/transmute-ref-src-unsized.rs:16:31 - | -16 | const SRC_UNSIZED: &[u8; 1] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertIsAsBytes` - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-ref-src-unsized.rs:16:31 - | -16 | const SRC_UNSIZED: &[u8; 1] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` - = note: all local variables must have a statically known size - = help: unsized locals are gated as an unstable feature - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-ref-src-unsized.rs:16:31 - | -16 | const SRC_UNSIZED: &[u8; 1] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `transmute` - --> $RUST/core/src/intrinsics.rs - | - | pub fn transmute(e: T) -> U; - | ^ required by this bound in `transmute` - = note: this error originates in the macro `$crate::assert_size_eq` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-ref-src-unsized.rs:16:31 - | -16 | const SRC_UNSIZED: &[u8; 1] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AlignOf::::into_t` - --> src/macro_util.rs - | - | impl AlignOf { - | ^ required by this bound in `AlignOf::::into_t` - = note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-ref-src-unsized.rs:16:31 - | -16 | const SRC_UNSIZED: &[u8; 1] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` - = note: the left-hand-side of an assignment must have a statically known size - = note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-ref-src-unsized.rs:16:31 - | -16 | const SRC_UNSIZED: &[u8; 1] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AlignOf` - --> src/macro_util.rs - | - | pub struct AlignOf { - | ^ required by this bound in `AlignOf` - = note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-ref-src-unsized.rs:16:31 - | -16 | const SRC_UNSIZED: &[u8; 1] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `MaxAlignsOf::::new` - --> src/macro_util.rs - | - | impl MaxAlignsOf { - | ^ required by this bound in `MaxAlignsOf::::new` - = note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-ref-src-unsized.rs:16:31 - | -16 | const SRC_UNSIZED: &[u8; 1] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `MaxAlignsOf` - --> src/macro_util.rs - | - | pub union MaxAlignsOf { - | ^ required by this bound in `MaxAlignsOf` - = note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-ref-src-unsized.rs:16:31 - | -16 | const SRC_UNSIZED: &[u8; 1] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `MaxAlignsOf` - --> src/macro_util.rs - | - | pub union MaxAlignsOf { - | ^ required by this bound in `MaxAlignsOf` - = note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-ref-src-unsized.rs:16:31 - | -16 | const SRC_UNSIZED: &[u8; 1] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AlignOf` - --> src/macro_util.rs - | - | pub struct AlignOf { - | ^ required by this bound in `AlignOf` - = note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-ref-src-unsized.rs:16:31 - | -16 | const SRC_UNSIZED: &[u8; 1] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `transmute_ref` - --> src/macro_util.rs - | - | pub const unsafe fn transmute_ref<'dst, 'src: 'dst, Src: 'src, Dst: 'dst>( - | ^^^ required by this bound in `transmute_ref` - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-msrv/transmute-ref-src-unsized.rs:16:31 - | -16 | const SRC_UNSIZED: &[u8; 1] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` - = note: all function arguments must have a statically known size - = note: this error originates in the macro `$crate::assert_size_eq` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-size-decrease.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-size-decrease.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-size-decrease.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-size-decrease.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,19 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -include!("../../zerocopy-derive/tests/util.rs"); - -extern crate zerocopy; - -use zerocopy::transmute; - -fn main() {} - -// Although this is not a soundness requirement, we currently require that the -// size of the destination type is not smaller than the size of the source type. -const DECREASE_SIZE: u8 = transmute!(AU16(0)); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-size-decrease.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-size-decrease.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-size-decrease.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-size-decrease.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,9 +0,0 @@ -error[E0512]: cannot transmute between types of different sizes, or dependently-sized types - --> tests/ui-msrv/transmute-size-decrease.rs:19:27 - | -19 | const DECREASE_SIZE: u8 = transmute!(AU16(0)); - | ^^^^^^^^^^^^^^^^^^^ - | - = note: source type: `AU16` (16 bits) - = note: target type: `u8` (8 bits) - = note: this error originates in the macro `transmute` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-size-increase.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-size-increase.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-size-increase.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-size-increase.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,19 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -include!("../../zerocopy-derive/tests/util.rs"); - -extern crate zerocopy; - -use zerocopy::transmute; - -fn main() {} - -// `transmute!` does not support transmuting from a smaller type to a larger -// one. -const INCREASE_SIZE: AU16 = transmute!(0u8); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-size-increase.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-size-increase.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-size-increase.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-size-increase.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,9 +0,0 @@ -error[E0512]: cannot transmute between types of different sizes, or dependently-sized types - --> tests/ui-msrv/transmute-size-increase.rs:19:29 - | -19 | const INCREASE_SIZE: AU16 = transmute!(0u8); - | ^^^^^^^^^^^^^^^ - | - = note: source type: `u8` (8 bits) - = note: target type: `AU16` (16 bits) - = note: this error originates in the macro `transmute` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-src-not-asbytes.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-src-not-asbytes.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-src-not-asbytes.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-src-not-asbytes.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -include!("../../zerocopy-derive/tests/util.rs"); - -extern crate zerocopy; - -use zerocopy::transmute; - -fn main() {} - -// `transmute` requires that the source type implements `AsBytes` -const SRC_NOT_AS_BYTES: AU16 = transmute!(NotZerocopy(AU16(0))); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-src-not-asbytes.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-src-not-asbytes.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-src-not-asbytes.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-msrv/transmute-src-not-asbytes.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -error[E0277]: the trait bound `NotZerocopy: AsBytes` is not satisfied - --> tests/ui-msrv/transmute-src-not-asbytes.rs:18:32 - | -18 | const SRC_NOT_AS_BYTES: AU16 = transmute!(NotZerocopy(AU16(0))); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `AsBytes` is not implemented for `NotZerocopy` - | -note: required by a bound in `AssertIsAsBytes` - --> tests/ui-msrv/transmute-src-not-asbytes.rs:18:32 - | -18 | const SRC_NOT_AS_BYTES: AU16 = transmute!(NotZerocopy(AU16(0))); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertIsAsBytes` - = note: this error originates in the macro `transmute` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the trait bound `NotZerocopy: AsBytes` is not satisfied - --> tests/ui-msrv/transmute-src-not-asbytes.rs:18:32 - | -18 | const SRC_NOT_AS_BYTES: AU16 = transmute!(NotZerocopy(AU16(0))); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `AsBytes` is not implemented for `NotZerocopy` - | -note: required by a bound in `AssertIsAsBytes` - --> tests/ui-msrv/transmute-src-not-asbytes.rs:18:32 - | -18 | const SRC_NOT_AS_BYTES: AU16 = transmute!(NotZerocopy(AU16(0))); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertIsAsBytes` - = note: this error originates in the macro `transmute` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/include_value_not_from_bytes.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/include_value_not_from_bytes.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/include_value_not_from_bytes.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/include_value_not_from_bytes.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,12 +0,0 @@ -// Copyright 2022 The Fuchsia Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#[macro_use] -extern crate zerocopy; - -fn main() {} - -// Should fail because `UnsafeCell: !FromBytes`. -const NOT_FROM_BYTES: core::cell::UnsafeCell = - include_value!("../../testdata/include_value/data"); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/include_value_not_from_bytes.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/include_value_not_from_bytes.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/include_value_not_from_bytes.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/include_value_not_from_bytes.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -error[E0277]: the trait bound `UnsafeCell: FromBytes` is not satisfied - --> tests/ui-nightly/include_value_not_from_bytes.rs:12:5 - | -12 | include_value!("../../testdata/include_value/data"); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | the trait `FromBytes` is not implemented for `UnsafeCell` - | required by a bound introduced by this call - | - = help: the following other types implement trait `FromBytes`: - isize - i8 - i16 - i32 - i64 - i128 - usize - u8 - and $N others -note: required by a bound in `AssertIsFromBytes` - --> tests/ui-nightly/include_value_not_from_bytes.rs:12:5 - | -12 | include_value!("../../testdata/include_value/data"); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertIsFromBytes` - = note: this error originates in the macro `$crate::transmute` which comes from the expansion of the macro `include_value` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/include_value_wrong_size.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/include_value_wrong_size.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/include_value_wrong_size.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/include_value_wrong_size.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,11 +0,0 @@ -// Copyright 2022 The Fuchsia Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#[macro_use] -extern crate zerocopy; - -fn main() {} - -// Should fail because the file is 4 bytes long, not 8. -const WRONG_SIZE: u64 = include_value!("../../testdata/include_value/data"); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/include_value_wrong_size.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/include_value_wrong_size.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/include_value_wrong_size.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/include_value_wrong_size.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,9 +0,0 @@ -error[E0512]: cannot transmute between types of different sizes, or dependently-sized types - --> tests/ui-nightly/include_value_wrong_size.rs:11:25 - | -11 | const WRONG_SIZE: u64 = include_value!("../../testdata/include_value/data"); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: source type: `[u8; 4]` (32 bits) - = note: target type: `u64` (64 bits) - = note: this error originates in the macro `$crate::transmute` which comes from the expansion of the macro `include_value` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/invalid-impls/invalid-impls.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/invalid-impls/invalid-impls.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/invalid-impls/invalid-impls.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/invalid-impls/invalid-impls.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,29 +0,0 @@ -// Copyright 2022 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -// Since some macros from `macros.rs` are unused. -#![allow(unused)] - -extern crate zerocopy; -extern crate zerocopy_derive; - -include!("../../../src/macros.rs"); - -use zerocopy::*; -use zerocopy_derive::*; - -fn main() {} - -#[derive(FromZeroes, FromBytes, AsBytes, Unaligned)] -#[repr(transparent)] -struct Foo(T); - -impl_or_verify!(T => FromZeroes for Foo); -impl_or_verify!(T => FromBytes for Foo); -impl_or_verify!(T => AsBytes for Foo); -impl_or_verify!(T => Unaligned for Foo); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/invalid-impls/invalid-impls.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/invalid-impls/invalid-impls.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/invalid-impls/invalid-impls.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/invalid-impls/invalid-impls.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,107 +0,0 @@ -error[E0277]: the trait bound `T: zerocopy::FromZeroes` is not satisfied - --> tests/ui-nightly/invalid-impls/invalid-impls.rs:26:37 - | -26 | impl_or_verify!(T => FromZeroes for Foo); - | ^^^^^^ the trait `zerocopy::FromZeroes` is not implemented for `T` - | -note: required for `Foo` to implement `zerocopy::FromZeroes` - --> tests/ui-nightly/invalid-impls/invalid-impls.rs:22:10 - | -22 | #[derive(FromZeroes, FromBytes, AsBytes, Unaligned)] - | ^^^^^^^^^^ unsatisfied trait bound introduced in this `derive` macro -note: required by a bound in `_::Subtrait` - --> tests/ui-nightly/invalid-impls/../../../src/macros.rs - | - | trait Subtrait: $trait {} - | ^^^^^^ required by this bound in `Subtrait` - | - ::: tests/ui-nightly/invalid-impls/invalid-impls.rs:26:1 - | -26 | impl_or_verify!(T => FromZeroes for Foo); - | ------------------------------------------- in this macro invocation - = note: this error originates in the derive macro `FromZeroes` which comes from the expansion of the macro `impl_or_verify` (in Nightly builds, run with -Z macro-backtrace for more info) -help: consider restricting type parameter `T` - | -26 | impl_or_verify!(T: zerocopy::FromZeroes => FromZeroes for Foo); - | ++++++++++++++++++++++ - -error[E0277]: the trait bound `T: zerocopy::FromBytes` is not satisfied - --> tests/ui-nightly/invalid-impls/invalid-impls.rs:27:36 - | -27 | impl_or_verify!(T => FromBytes for Foo); - | ^^^^^^ the trait `zerocopy::FromBytes` is not implemented for `T` - | -note: required for `Foo` to implement `zerocopy::FromBytes` - --> tests/ui-nightly/invalid-impls/invalid-impls.rs:22:22 - | -22 | #[derive(FromZeroes, FromBytes, AsBytes, Unaligned)] - | ^^^^^^^^^ unsatisfied trait bound introduced in this `derive` macro -note: required by a bound in `_::Subtrait` - --> tests/ui-nightly/invalid-impls/../../../src/macros.rs - | - | trait Subtrait: $trait {} - | ^^^^^^ required by this bound in `Subtrait` - | - ::: tests/ui-nightly/invalid-impls/invalid-impls.rs:27:1 - | -27 | impl_or_verify!(T => FromBytes for Foo); - | ------------------------------------------ in this macro invocation - = note: this error originates in the derive macro `FromBytes` which comes from the expansion of the macro `impl_or_verify` (in Nightly builds, run with -Z macro-backtrace for more info) -help: consider restricting type parameter `T` - | -27 | impl_or_verify!(T: zerocopy::FromBytes => FromBytes for Foo); - | +++++++++++++++++++++ - -error[E0277]: the trait bound `T: zerocopy::AsBytes` is not satisfied - --> tests/ui-nightly/invalid-impls/invalid-impls.rs:28:34 - | -28 | impl_or_verify!(T => AsBytes for Foo); - | ^^^^^^ the trait `zerocopy::AsBytes` is not implemented for `T` - | -note: required for `Foo` to implement `zerocopy::AsBytes` - --> tests/ui-nightly/invalid-impls/invalid-impls.rs:22:33 - | -22 | #[derive(FromZeroes, FromBytes, AsBytes, Unaligned)] - | ^^^^^^^ unsatisfied trait bound introduced in this `derive` macro -note: required by a bound in `_::Subtrait` - --> tests/ui-nightly/invalid-impls/../../../src/macros.rs - | - | trait Subtrait: $trait {} - | ^^^^^^ required by this bound in `Subtrait` - | - ::: tests/ui-nightly/invalid-impls/invalid-impls.rs:28:1 - | -28 | impl_or_verify!(T => AsBytes for Foo); - | ---------------------------------------- in this macro invocation - = note: this error originates in the derive macro `AsBytes` which comes from the expansion of the macro `impl_or_verify` (in Nightly builds, run with -Z macro-backtrace for more info) -help: consider restricting type parameter `T` - | -28 | impl_or_verify!(T: zerocopy::AsBytes => AsBytes for Foo); - | +++++++++++++++++++ - -error[E0277]: the trait bound `T: zerocopy::Unaligned` is not satisfied - --> tests/ui-nightly/invalid-impls/invalid-impls.rs:29:36 - | -29 | impl_or_verify!(T => Unaligned for Foo); - | ^^^^^^ the trait `zerocopy::Unaligned` is not implemented for `T` - | -note: required for `Foo` to implement `zerocopy::Unaligned` - --> tests/ui-nightly/invalid-impls/invalid-impls.rs:22:42 - | -22 | #[derive(FromZeroes, FromBytes, AsBytes, Unaligned)] - | ^^^^^^^^^ unsatisfied trait bound introduced in this `derive` macro -note: required by a bound in `_::Subtrait` - --> tests/ui-nightly/invalid-impls/../../../src/macros.rs - | - | trait Subtrait: $trait {} - | ^^^^^^ required by this bound in `Subtrait` - | - ::: tests/ui-nightly/invalid-impls/invalid-impls.rs:29:1 - | -29 | impl_or_verify!(T => Unaligned for Foo); - | ------------------------------------------ in this macro invocation - = note: this error originates in the derive macro `Unaligned` which comes from the expansion of the macro `impl_or_verify` (in Nightly builds, run with -Z macro-backtrace for more info) -help: consider restricting type parameter `T` - | -29 | impl_or_verify!(T: zerocopy::Unaligned => Unaligned for Foo); - | +++++++++++++++++++++ diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-dst-not-frombytes.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-dst-not-frombytes.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-dst-not-frombytes.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-dst-not-frombytes.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -// Copyright 2022 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -include!("../../zerocopy-derive/tests/util.rs"); - -extern crate zerocopy; - -use zerocopy::transmute; - -fn main() {} - -// `transmute` requires that the destination type implements `FromBytes` -const DST_NOT_FROM_BYTES: NotZerocopy = transmute!(AU16(0)); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-dst-not-frombytes.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-dst-not-frombytes.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-dst-not-frombytes.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-dst-not-frombytes.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -error[E0277]: the trait bound `NotZerocopy: FromBytes` is not satisfied - --> tests/ui-nightly/transmute-dst-not-frombytes.rs:18:41 - | -18 | const DST_NOT_FROM_BYTES: NotZerocopy = transmute!(AU16(0)); - | ^^^^^^^^^^^^^^^^^^^ - | | - | the trait `FromBytes` is not implemented for `NotZerocopy` - | required by a bound introduced by this call - | - = help: the following other types implement trait `FromBytes`: - isize - i8 - i16 - i32 - i64 - i128 - usize - u8 - and $N others -note: required by a bound in `AssertIsFromBytes` - --> tests/ui-nightly/transmute-dst-not-frombytes.rs:18:41 - | -18 | const DST_NOT_FROM_BYTES: NotZerocopy = transmute!(AU16(0)); - | ^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertIsFromBytes` - = note: this error originates in the macro `transmute` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-alignment-increase.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-alignment-increase.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-alignment-increase.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-alignment-increase.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,19 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -include!("../../zerocopy-derive/tests/util.rs"); - -extern crate zerocopy; - -use zerocopy::transmute_mut; - -fn main() {} - -// `transmute_mut!` does not support transmuting from a type of smaller -// alignment to one of larger alignment. -const INCREASE_ALIGNMENT: &mut AU16 = transmute_mut!(&mut [0u8; 2]); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-alignment-increase.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-alignment-increase.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-alignment-increase.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-alignment-increase.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,9 +0,0 @@ -error[E0512]: cannot transmute between types of different sizes, or dependently-sized types - --> tests/ui-nightly/transmute-mut-alignment-increase.rs:19:39 - | -19 | const INCREASE_ALIGNMENT: &mut AU16 = transmute_mut!(&mut [0u8; 2]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: source type: `AlignOf<[u8; 2]>` (8 bits) - = note: target type: `MaxAlignsOf<[u8; 2], AU16>` (16 bits) - = note: this error originates in the macro `$crate::assert_align_gt_eq` which comes from the expansion of the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-const.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-const.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-const.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-const.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,20 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -include!("../../zerocopy-derive/tests/util.rs"); - -extern crate zerocopy; - -use zerocopy::transmute_mut; - -fn main() {} - -const ARRAY_OF_U8S: [u8; 2] = [0u8; 2]; - -// `transmute_mut!` cannot, generally speaking, be used in const contexts. -const CONST_CONTEXT: &mut [u8; 2] = transmute_mut!(&mut ARRAY_OF_U8S); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-const.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-const.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-const.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-const.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,42 +0,0 @@ -warning: taking a mutable reference to a `const` item - --> tests/ui-nightly/transmute-mut-const.rs:20:52 - | -20 | const CONST_CONTEXT: &mut [u8; 2] = transmute_mut!(&mut ARRAY_OF_U8S); - | ^^^^^^^^^^^^^^^^^ - | - = note: each usage of a `const` item creates a new temporary - = note: the mutable reference will refer to this temporary, not the original `const` item -note: `const` item defined here - --> tests/ui-nightly/transmute-mut-const.rs:17:1 - | -17 | const ARRAY_OF_U8S: [u8; 2] = [0u8; 2]; - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ - = note: `#[warn(const_item_mutation)]` on by default - -error[E0658]: mutable references are not allowed in constants - --> tests/ui-nightly/transmute-mut-const.rs:20:52 - | -20 | const CONST_CONTEXT: &mut [u8; 2] = transmute_mut!(&mut ARRAY_OF_U8S); - | ^^^^^^^^^^^^^^^^^ - | - = note: see issue #57349 for more information - = help: add `#![feature(const_mut_refs)]` to the crate attributes to enable - -error[E0015]: cannot call non-const fn `transmute_mut::<'_, '_, [u8; 2], [u8; 2]>` in constants - --> tests/ui-nightly/transmute-mut-const.rs:20:37 - | -20 | const CONST_CONTEXT: &mut [u8; 2] = transmute_mut!(&mut ARRAY_OF_U8S); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: calls in constants are limited to constant functions, tuple structs and tuple variants - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0716]: temporary value dropped while borrowed - --> tests/ui-nightly/transmute-mut-const.rs:20:57 - | -20 | const CONST_CONTEXT: &mut [u8; 2] = transmute_mut!(&mut ARRAY_OF_U8S); - | --------------------^^^^^^^^^^^^- - | | | - | | creates a temporary value which is freed while still in use - | temporary value is freed at the end of this statement - | using this value as a constant requires that borrow lasts for `'static` diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-dst-generic.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-dst-generic.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-dst-generic.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-dst-generic.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::{transmute_mut, AsBytes, FromBytes}; - -fn main() {} - -fn transmute_mut(u: &mut u8) -> &mut T { - // `transmute_mut!` requires the destination type to be concrete. - transmute_mut!(u) -} diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-dst-generic.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-dst-generic.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-dst-generic.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-dst-generic.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,19 +0,0 @@ -error[E0512]: cannot transmute between types of different sizes, or dependently-sized types - --> tests/ui-nightly/transmute-mut-dst-generic.rs:17:5 - | -17 | transmute_mut!(u) - | ^^^^^^^^^^^^^^^^^ - | - = note: source type: `u8` (8 bits) - = note: target type: `T` (this type does not have a fixed size) - = note: this error originates in the macro `$crate::assert_size_eq` which comes from the expansion of the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0512]: cannot transmute between types of different sizes, or dependently-sized types - --> tests/ui-nightly/transmute-mut-dst-generic.rs:17:5 - | -17 | transmute_mut!(u) - | ^^^^^^^^^^^^^^^^^ - | - = note: source type: `AlignOf` (8 bits) - = note: target type: `MaxAlignsOf` (size can vary because of T) - = note: this error originates in the macro `$crate::assert_align_gt_eq` which comes from the expansion of the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-dst-not-a-reference.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-dst-not-a-reference.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-dst-not-a-reference.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-dst-not-a-reference.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::transmute_mut; - -fn main() {} - -// `transmute_mut!` does not support transmuting into a non-reference -// destination type. -const DST_NOT_A_REFERENCE: usize = transmute_mut!(&mut 0u8); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-dst-not-a-reference.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-dst-not-a-reference.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-dst-not-a-reference.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-dst-not-a-reference.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,39 +0,0 @@ -error[E0308]: mismatched types - --> tests/ui-nightly/transmute-mut-dst-not-a-reference.rs:17:36 - | -17 | const DST_NOT_A_REFERENCE: usize = transmute_mut!(&mut 0u8); - | ^^^^^^^^^^^^^^^^^^^^^^^^ expected `usize`, found `&mut _` - | - = note: expected type `usize` - found mutable reference `&mut _` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0308]: mismatched types - --> tests/ui-nightly/transmute-mut-dst-not-a-reference.rs:17:36 - | -17 | const DST_NOT_A_REFERENCE: usize = transmute_mut!(&mut 0u8); - | ^^^^^^^^^^^^^^^^^^^^^^^^ expected `usize`, found `&mut _` - | - = note: expected type `usize` - found mutable reference `&mut _` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0308]: mismatched types - --> tests/ui-nightly/transmute-mut-dst-not-a-reference.rs:17:36 - | -17 | const DST_NOT_A_REFERENCE: usize = transmute_mut!(&mut 0u8); - | ^^^^^^^^^^^^^^^^^^^^^^^^ expected `usize`, found `&mut _` - | - = note: expected type `usize` - found mutable reference `&mut _` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0308]: mismatched types - --> tests/ui-nightly/transmute-mut-dst-not-a-reference.rs:17:36 - | -17 | const DST_NOT_A_REFERENCE: usize = transmute_mut!(&mut 0u8); - | ^^^^^^^^^^^^^^^^^^^^^^^^ expected `usize`, found `&mut _` - | - = note: expected type `usize` - found mutable reference `&mut _` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-dst-not-asbytes.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-dst-not-asbytes.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-dst-not-asbytes.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-dst-not-asbytes.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,24 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::transmute_mut; - -fn main() {} - -#[derive(zerocopy::FromZeroes, zerocopy::FromBytes, zerocopy::AsBytes)] -#[repr(C)] -struct Src; - -#[derive(zerocopy::FromZeroes, zerocopy::FromBytes)] -#[repr(C)] -struct Dst; - -// `transmute_mut` requires that the destination type implements `AsBytes` -const DST_NOT_AS_BYTES: &mut Dst = transmute_mut!(&mut Src); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-dst-not-asbytes.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-dst-not-asbytes.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-dst-not-asbytes.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-dst-not-asbytes.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -error[E0277]: the trait bound `Dst: AsBytes` is not satisfied - --> tests/ui-nightly/transmute-mut-dst-not-asbytes.rs:24:36 - | -24 | const DST_NOT_AS_BYTES: &mut Dst = transmute_mut!(&mut Src); - | ^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | the trait `AsBytes` is not implemented for `Dst` - | required by a bound introduced by this call - | - = help: the following other types implement trait `AsBytes`: - bool - char - isize - i8 - i16 - i32 - i64 - i128 - and $N others -note: required by a bound in `AssertDstIsAsBytes` - --> tests/ui-nightly/transmute-mut-dst-not-asbytes.rs:24:36 - | -24 | const DST_NOT_AS_BYTES: &mut Dst = transmute_mut!(&mut Src); - | ^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertDstIsAsBytes` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-dst-not-frombytes.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-dst-not-frombytes.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-dst-not-frombytes.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-dst-not-frombytes.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,24 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::transmute_mut; - -fn main() {} - -#[derive(zerocopy::FromZeroes, zerocopy::FromBytes, zerocopy::AsBytes)] -#[repr(C)] -struct Src; - -#[derive(zerocopy::AsBytes)] -#[repr(C)] -struct Dst; - -// `transmute_mut` requires that the destination type implements `FromBytes` -const DST_NOT_FROM_BYTES: &mut Dst = transmute_mut!(&mut Src); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-dst-not-frombytes.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-dst-not-frombytes.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-dst-not-frombytes.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-dst-not-frombytes.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -error[E0277]: the trait bound `Dst: FromBytes` is not satisfied - --> tests/ui-nightly/transmute-mut-dst-not-frombytes.rs:24:38 - | -24 | const DST_NOT_FROM_BYTES: &mut Dst = transmute_mut!(&mut Src); - | ^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | the trait `FromBytes` is not implemented for `Dst` - | required by a bound introduced by this call - | - = help: the following other types implement trait `FromBytes`: - isize - i8 - i16 - i32 - i64 - i128 - usize - u8 - and $N others -note: required by a bound in `AssertDstIsFromBytes` - --> tests/ui-nightly/transmute-mut-dst-not-frombytes.rs:24:38 - | -24 | const DST_NOT_FROM_BYTES: &mut Dst = transmute_mut!(&mut Src); - | ^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertDstIsFromBytes` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-dst-unsized.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-dst-unsized.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-dst-unsized.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-dst-unsized.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::transmute_mut; - -fn main() {} - -// `transmute_mut!` does not support transmuting into an unsized destination -// type. -const DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8; 1]); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-dst-unsized.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-dst-unsized.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-dst-unsized.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-dst-unsized.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,86 +0,0 @@ -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-nightly/transmute-mut-dst-unsized.rs:17:32 - | -17 | const DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8; 1]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | doesn't have a size known at compile-time - | required by a bound introduced by this call - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AssertDstIsFromBytes` - --> tests/ui-nightly/transmute-mut-dst-unsized.rs:17:32 - | -17 | const DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8; 1]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertDstIsFromBytes` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-nightly/transmute-mut-dst-unsized.rs:17:32 - | -17 | const DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8; 1]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | doesn't have a size known at compile-time - | required by a bound introduced by this call - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AssertDstIsAsBytes` - --> tests/ui-nightly/transmute-mut-dst-unsized.rs:17:32 - | -17 | const DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8; 1]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertDstIsAsBytes` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-nightly/transmute-mut-dst-unsized.rs:17:32 - | -17 | const DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8; 1]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` - = note: all local variables must have a statically known size - = help: unsized locals are gated as an unstable feature - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-nightly/transmute-mut-dst-unsized.rs:17:32 - | -17 | const DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8; 1]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `MaxAlignsOf` - --> src/macro_util.rs - | - | pub union MaxAlignsOf { - | ^ required by this bound in `MaxAlignsOf` - = note: this error originates in the macro `$crate::assert_align_gt_eq` which comes from the expansion of the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-nightly/transmute-mut-dst-unsized.rs:17:32 - | -17 | const DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8; 1]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `transmute` - --> $RUST/core/src/intrinsics.rs - | - | pub fn transmute(src: Src) -> Dst; - | ^^^ required by this bound in `transmute` - = note: this error originates in the macro `$crate::assert_size_eq` which comes from the expansion of the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-nightly/transmute-mut-dst-unsized.rs:17:32 - | -17 | const DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8; 1]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `transmute_mut` - --> src/macro_util.rs - | - | pub unsafe fn transmute_mut<'dst, 'src: 'dst, Src: 'src, Dst: 'dst>( - | ^^^ required by this bound in `transmute_mut` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-illegal-lifetime.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-illegal-lifetime.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-illegal-lifetime.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-illegal-lifetime.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -fn main() {} - -fn increase_lifetime() { - let mut x = 0u64; - // It is illegal to increase the lifetime scope. - let _: &'static mut u64 = zerocopy::transmute_mut!(&mut x); -} diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-illegal-lifetime.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-illegal-lifetime.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-illegal-lifetime.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-illegal-lifetime.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,12 +0,0 @@ -error[E0597]: `x` does not live long enough - --> tests/ui-nightly/transmute-mut-illegal-lifetime.rs:14:56 - | -12 | let mut x = 0u64; - | ----- binding `x` declared here -13 | // It is illegal to increase the lifetime scope. -14 | let _: &'static mut u64 = zerocopy::transmute_mut!(&mut x); - | ---------------- ^^^^^^ borrowed value does not live long enough - | | - | type annotation requires that `x` is borrowed for `'static` -15 | } - | - `x` dropped here while still borrowed diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-size-decrease.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-size-decrease.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-size-decrease.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-size-decrease.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::transmute_mut; - -fn main() {} - -// We require that the size of the destination type is not smaller than the size -// of the source type. -const DECREASE_SIZE: &mut u8 = transmute_mut!(&mut [0u8; 2]); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-size-decrease.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-size-decrease.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-size-decrease.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-size-decrease.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,9 +0,0 @@ -error[E0512]: cannot transmute between types of different sizes, or dependently-sized types - --> tests/ui-nightly/transmute-mut-size-decrease.rs:17:32 - | -17 | const DECREASE_SIZE: &mut u8 = transmute_mut!(&mut [0u8; 2]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: source type: `[u8; 2]` (16 bits) - = note: target type: `u8` (8 bits) - = note: this error originates in the macro `$crate::assert_size_eq` which comes from the expansion of the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-size-increase.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-size-increase.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-size-increase.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-size-increase.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::transmute_mut; - -fn main() {} - -// `transmute_mut!` does not support transmuting from a smaller type to a larger -// one. -const INCREASE_SIZE: &mut [u8; 2] = transmute_mut!(&mut 0u8); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-size-increase.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-size-increase.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-size-increase.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-size-increase.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,9 +0,0 @@ -error[E0512]: cannot transmute between types of different sizes, or dependently-sized types - --> tests/ui-nightly/transmute-mut-size-increase.rs:17:37 - | -17 | const INCREASE_SIZE: &mut [u8; 2] = transmute_mut!(&mut 0u8); - | ^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: source type: `u8` (8 bits) - = note: target type: `[u8; 2]` (16 bits) - = note: this error originates in the macro `$crate::assert_size_eq` which comes from the expansion of the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-dst-generic.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-dst-generic.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-dst-generic.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-dst-generic.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,19 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::{transmute_mut, AsBytes, FromBytes}; - -fn main() {} - -fn transmute_mut(t: &mut T) -> &mut U { - // `transmute_mut!` requires the source and destination types to be - // concrete. - transmute_mut!(t) -} diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-dst-generic.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-dst-generic.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-dst-generic.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-dst-generic.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,19 +0,0 @@ -error[E0512]: cannot transmute between types of different sizes, or dependently-sized types - --> tests/ui-nightly/transmute-mut-src-dst-generic.rs:18:5 - | -18 | transmute_mut!(t) - | ^^^^^^^^^^^^^^^^^ - | - = note: source type: `T` (this type does not have a fixed size) - = note: target type: `U` (this type does not have a fixed size) - = note: this error originates in the macro `$crate::assert_size_eq` which comes from the expansion of the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0512]: cannot transmute between types of different sizes, or dependently-sized types - --> tests/ui-nightly/transmute-mut-src-dst-generic.rs:18:5 - | -18 | transmute_mut!(t) - | ^^^^^^^^^^^^^^^^^ - | - = note: source type: `AlignOf` (size can vary because of T) - = note: target type: `MaxAlignsOf` (size can vary because of T) - = note: this error originates in the macro `$crate::assert_align_gt_eq` which comes from the expansion of the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-dst-not-references.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-dst-not-references.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-dst-not-references.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-dst-not-references.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::transmute_mut; - -fn main() {} - -// `transmute_mut!` does not support transmuting between non-reference source -// and destination types. -const SRC_DST_NOT_REFERENCES: &mut usize = transmute_mut!(0usize); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-dst-not-references.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-dst-not-references.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-dst-not-references.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-dst-not-references.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ -error[E0308]: mismatched types - --> tests/ui-nightly/transmute-mut-src-dst-not-references.rs:17:59 - | -17 | const SRC_DST_NOT_REFERENCES: &mut usize = transmute_mut!(0usize); - | ---------------^^^^^^- - | | | - | | expected `&mut _`, found `usize` - | expected due to this - | - = note: expected mutable reference `&mut _` - found type `usize` -help: consider mutably borrowing here - | -17 | const SRC_DST_NOT_REFERENCES: &mut usize = transmute_mut!(&mut 0usize); - | ++++ diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-dst-unsized.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-dst-unsized.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-dst-unsized.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-dst-unsized.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::transmute_mut; - -fn main() {} - -// `transmute_mut!` does not support transmuting between unsized source and -// destination types. -const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-dst-unsized.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-dst-unsized.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-dst-unsized.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-dst-unsized.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,231 +0,0 @@ -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-nightly/transmute-mut-src-dst-unsized.rs:17:36 - | -17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | doesn't have a size known at compile-time - | required by a bound introduced by this call - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AssertSrcIsFromBytes` - --> tests/ui-nightly/transmute-mut-src-dst-unsized.rs:17:36 - | -17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertSrcIsFromBytes` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-nightly/transmute-mut-src-dst-unsized.rs:17:36 - | -17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AssertSrcIsFromBytes` - --> tests/ui-nightly/transmute-mut-src-dst-unsized.rs:17:36 - | -17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertSrcIsFromBytes` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-nightly/transmute-mut-src-dst-unsized.rs:17:36 - | -17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | doesn't have a size known at compile-time - | required by a bound introduced by this call - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AssertSrcIsAsBytes` - --> tests/ui-nightly/transmute-mut-src-dst-unsized.rs:17:36 - | -17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertSrcIsAsBytes` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-nightly/transmute-mut-src-dst-unsized.rs:17:36 - | -17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AssertSrcIsAsBytes` - --> tests/ui-nightly/transmute-mut-src-dst-unsized.rs:17:36 - | -17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertSrcIsAsBytes` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-nightly/transmute-mut-src-dst-unsized.rs:17:36 - | -17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | doesn't have a size known at compile-time - | required by a bound introduced by this call - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AssertDstIsFromBytes` - --> tests/ui-nightly/transmute-mut-src-dst-unsized.rs:17:36 - | -17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertDstIsFromBytes` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-nightly/transmute-mut-src-dst-unsized.rs:17:36 - | -17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | doesn't have a size known at compile-time - | required by a bound introduced by this call - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AssertDstIsAsBytes` - --> tests/ui-nightly/transmute-mut-src-dst-unsized.rs:17:36 - | -17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertDstIsAsBytes` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-nightly/transmute-mut-src-dst-unsized.rs:17:36 - | -17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` - = note: all local variables must have a statically known size - = help: unsized locals are gated as an unstable feature - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-nightly/transmute-mut-src-dst-unsized.rs:17:36 - | -17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AlignOf::::into_t` - --> src/macro_util.rs - | - | impl AlignOf { - | ^ required by this bound in `AlignOf::::into_t` - | #[inline(never)] // Make `missing_inline_in_public_items` happy. - | pub fn into_t(self) -> T { - | ------ required by a bound in this associated function - = note: this error originates in the macro `$crate::assert_align_gt_eq` which comes from the expansion of the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-nightly/transmute-mut-src-dst-unsized.rs:17:36 - | -17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` - = note: the left-hand-side of an assignment must have a statically known size - = note: this error originates in the macro `$crate::assert_align_gt_eq` which comes from the expansion of the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-nightly/transmute-mut-src-dst-unsized.rs:17:36 - | -17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AlignOf` - --> src/macro_util.rs - | - | pub struct AlignOf { - | ^ required by this bound in `AlignOf` - = note: this error originates in the macro `$crate::assert_align_gt_eq` which comes from the expansion of the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-nightly/transmute-mut-src-dst-unsized.rs:17:36 - | -17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `MaxAlignsOf` - --> src/macro_util.rs - | - | pub union MaxAlignsOf { - | ^ required by this bound in `MaxAlignsOf` - = note: this error originates in the macro `$crate::assert_align_gt_eq` which comes from the expansion of the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-nightly/transmute-mut-src-dst-unsized.rs:17:36 - | -17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AlignOf` - --> src/macro_util.rs - | - | pub struct AlignOf { - | ^ required by this bound in `AlignOf` - = note: this error originates in the macro `$crate::assert_align_gt_eq` which comes from the expansion of the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-nightly/transmute-mut-src-dst-unsized.rs:17:36 - | -17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` - = note: all local variables must have a statically known size - = help: unsized locals are gated as an unstable feature - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-nightly/transmute-mut-src-dst-unsized.rs:17:36 - | -17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `transmute` - --> $RUST/core/src/intrinsics.rs - | - | pub fn transmute(src: Src) -> Dst; - | ^^^ required by this bound in `transmute` - = note: this error originates in the macro `$crate::assert_size_eq` which comes from the expansion of the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-nightly/transmute-mut-src-dst-unsized.rs:17:36 - | -17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | doesn't have a size known at compile-time - | required by a bound introduced by this call - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `transmute_mut` - --> src/macro_util.rs - | - | pub unsafe fn transmute_mut<'dst, 'src: 'dst, Src: 'src, Dst: 'dst>( - | ^^^ required by this bound in `transmute_mut` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-nightly/transmute-mut-src-dst-unsized.rs:17:36 - | -17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `transmute_mut` - --> src/macro_util.rs - | - | pub unsafe fn transmute_mut<'dst, 'src: 'dst, Src: 'src, Dst: 'dst>( - | ^^^ required by this bound in `transmute_mut` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-generic.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-generic.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-generic.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-generic.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::{transmute_mut, AsBytes}; - -fn main() {} - -fn transmute_mut(t: &mut T) -> &mut u8 { - // `transmute_mut!` requires the source type to be concrete. - transmute_mut!(t) -} diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-generic.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-generic.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-generic.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-generic.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,10 +0,0 @@ -error[E0405]: cannot find trait `FromBytes` in this scope - --> tests/ui-nightly/transmute-mut-src-generic.rs:15:31 - | -15 | fn transmute_mut(t: &mut T) -> &mut u8 { - | ^^^^^^^^^ not found in this scope - | -help: consider importing this trait - | -11 + use zerocopy::FromBytes; - | diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-immutable.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-immutable.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-immutable.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-immutable.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::transmute_mut; - -fn main() {} - -fn ref_src_immutable() { - // `transmute_mut!` requires that its source type be a mutable reference. - let _: &mut u8 = transmute_mut!(&0u8); -} diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-immutable.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-immutable.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-immutable.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-immutable.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,11 +0,0 @@ -error[E0308]: mismatched types - --> tests/ui-nightly/transmute-mut-src-immutable.rs:17:37 - | -17 | let _: &mut u8 = transmute_mut!(&0u8); - | ---------------^^^^- - | | | - | | types differ in mutability - | expected due to this - | - = note: expected mutable reference `&mut _` - found reference `&u8` diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-not-a-reference.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-not-a-reference.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-not-a-reference.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-not-a-reference.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::transmute_mut; - -fn main() {} - -// `transmute_mut!` does not support transmuting from a non-reference source -// type. -const SRC_NOT_A_REFERENCE: &mut u8 = transmute_mut!(0usize); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-not-a-reference.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-not-a-reference.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-not-a-reference.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-not-a-reference.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ -error[E0308]: mismatched types - --> tests/ui-nightly/transmute-mut-src-not-a-reference.rs:17:53 - | -17 | const SRC_NOT_A_REFERENCE: &mut u8 = transmute_mut!(0usize); - | ---------------^^^^^^- - | | | - | | expected `&mut _`, found `usize` - | expected due to this - | - = note: expected mutable reference `&mut _` - found type `usize` -help: consider mutably borrowing here - | -17 | const SRC_NOT_A_REFERENCE: &mut u8 = transmute_mut!(&mut 0usize); - | ++++ diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-not-asbytes.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-not-asbytes.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-not-asbytes.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-not-asbytes.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,24 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::transmute_mut; - -fn main() {} - -#[derive(zerocopy::FromZeroes, zerocopy::FromBytes)] -#[repr(C)] -struct Src; - -#[derive(zerocopy::FromZeroes, zerocopy::FromBytes, zerocopy::AsBytes)] -#[repr(C)] -struct Dst; - -// `transmute_mut` requires that the source type implements `AsBytes` -const SRC_NOT_AS_BYTES: &mut Dst = transmute_mut!(&mut Src); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-not-asbytes.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-not-asbytes.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-not-asbytes.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-not-asbytes.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,48 +0,0 @@ -error[E0277]: the trait bound `Src: AsBytes` is not satisfied - --> tests/ui-nightly/transmute-mut-src-not-asbytes.rs:24:36 - | -24 | const SRC_NOT_AS_BYTES: &mut Dst = transmute_mut!(&mut Src); - | ^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | the trait `AsBytes` is not implemented for `Src` - | required by a bound introduced by this call - | - = help: the following other types implement trait `AsBytes`: - bool - char - isize - i8 - i16 - i32 - i64 - i128 - and $N others -note: required by a bound in `AssertSrcIsAsBytes` - --> tests/ui-nightly/transmute-mut-src-not-asbytes.rs:24:36 - | -24 | const SRC_NOT_AS_BYTES: &mut Dst = transmute_mut!(&mut Src); - | ^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertSrcIsAsBytes` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the trait bound `Src: AsBytes` is not satisfied - --> tests/ui-nightly/transmute-mut-src-not-asbytes.rs:24:36 - | -24 | const SRC_NOT_AS_BYTES: &mut Dst = transmute_mut!(&mut Src); - | ^^^^^^^^^^^^^^^^^^^^^^^^ the trait `AsBytes` is not implemented for `Src` - | - = help: the following other types implement trait `AsBytes`: - bool - char - isize - i8 - i16 - i32 - i64 - i128 - and $N others -note: required by a bound in `AssertSrcIsAsBytes` - --> tests/ui-nightly/transmute-mut-src-not-asbytes.rs:24:36 - | -24 | const SRC_NOT_AS_BYTES: &mut Dst = transmute_mut!(&mut Src); - | ^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertSrcIsAsBytes` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-not-frombytes.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-not-frombytes.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-not-frombytes.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-not-frombytes.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,24 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::transmute_mut; - -fn main() {} - -#[derive(zerocopy::AsBytes)] -#[repr(C)] -struct Src; - -#[derive(zerocopy::FromZeroes, zerocopy::FromBytes, zerocopy::AsBytes)] -#[repr(C)] -struct Dst; - -// `transmute_mut` requires that the source type implements `FromBytes` -const SRC_NOT_FROM_BYTES: &mut Dst = transmute_mut!(&mut Src); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-not-frombytes.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-not-frombytes.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-not-frombytes.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-not-frombytes.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,48 +0,0 @@ -error[E0277]: the trait bound `Src: FromBytes` is not satisfied - --> tests/ui-nightly/transmute-mut-src-not-frombytes.rs:24:38 - | -24 | const SRC_NOT_FROM_BYTES: &mut Dst = transmute_mut!(&mut Src); - | ^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | the trait `FromBytes` is not implemented for `Src` - | required by a bound introduced by this call - | - = help: the following other types implement trait `FromBytes`: - isize - i8 - i16 - i32 - i64 - i128 - usize - u8 - and $N others -note: required by a bound in `AssertSrcIsFromBytes` - --> tests/ui-nightly/transmute-mut-src-not-frombytes.rs:24:38 - | -24 | const SRC_NOT_FROM_BYTES: &mut Dst = transmute_mut!(&mut Src); - | ^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertSrcIsFromBytes` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the trait bound `Src: FromBytes` is not satisfied - --> tests/ui-nightly/transmute-mut-src-not-frombytes.rs:24:38 - | -24 | const SRC_NOT_FROM_BYTES: &mut Dst = transmute_mut!(&mut Src); - | ^^^^^^^^^^^^^^^^^^^^^^^^ the trait `FromBytes` is not implemented for `Src` - | - = help: the following other types implement trait `FromBytes`: - isize - i8 - i16 - i32 - i64 - i128 - usize - u8 - and $N others -note: required by a bound in `AssertSrcIsFromBytes` - --> tests/ui-nightly/transmute-mut-src-not-frombytes.rs:24:38 - | -24 | const SRC_NOT_FROM_BYTES: &mut Dst = transmute_mut!(&mut Src); - | ^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertSrcIsFromBytes` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-unsized.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-unsized.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-unsized.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-unsized.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,16 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::transmute_mut; - -fn main() {} - -// `transmute_mut!` does not support transmuting from an unsized source type. -const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-unsized.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-unsized.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-unsized.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-mut-src-unsized.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,158 +0,0 @@ -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-nightly/transmute-mut-src-unsized.rs:16:35 - | -16 | const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | doesn't have a size known at compile-time - | required by a bound introduced by this call - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AssertSrcIsFromBytes` - --> tests/ui-nightly/transmute-mut-src-unsized.rs:16:35 - | -16 | const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertSrcIsFromBytes` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-nightly/transmute-mut-src-unsized.rs:16:35 - | -16 | const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AssertSrcIsFromBytes` - --> tests/ui-nightly/transmute-mut-src-unsized.rs:16:35 - | -16 | const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertSrcIsFromBytes` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-nightly/transmute-mut-src-unsized.rs:16:35 - | -16 | const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | doesn't have a size known at compile-time - | required by a bound introduced by this call - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AssertSrcIsAsBytes` - --> tests/ui-nightly/transmute-mut-src-unsized.rs:16:35 - | -16 | const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertSrcIsAsBytes` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-nightly/transmute-mut-src-unsized.rs:16:35 - | -16 | const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AssertSrcIsAsBytes` - --> tests/ui-nightly/transmute-mut-src-unsized.rs:16:35 - | -16 | const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertSrcIsAsBytes` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-nightly/transmute-mut-src-unsized.rs:16:35 - | -16 | const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` - = note: all local variables must have a statically known size - = help: unsized locals are gated as an unstable feature - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-nightly/transmute-mut-src-unsized.rs:16:35 - | -16 | const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AlignOf::::into_t` - --> src/macro_util.rs - | - | impl AlignOf { - | ^ required by this bound in `AlignOf::::into_t` - | #[inline(never)] // Make `missing_inline_in_public_items` happy. - | pub fn into_t(self) -> T { - | ------ required by a bound in this associated function - = note: this error originates in the macro `$crate::assert_align_gt_eq` which comes from the expansion of the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-nightly/transmute-mut-src-unsized.rs:16:35 - | -16 | const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` - = note: the left-hand-side of an assignment must have a statically known size - = note: this error originates in the macro `$crate::assert_align_gt_eq` which comes from the expansion of the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-nightly/transmute-mut-src-unsized.rs:16:35 - | -16 | const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AlignOf` - --> src/macro_util.rs - | - | pub struct AlignOf { - | ^ required by this bound in `AlignOf` - = note: this error originates in the macro `$crate::assert_align_gt_eq` which comes from the expansion of the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-nightly/transmute-mut-src-unsized.rs:16:35 - | -16 | const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `MaxAlignsOf` - --> src/macro_util.rs - | - | pub union MaxAlignsOf { - | ^ required by this bound in `MaxAlignsOf` - = note: this error originates in the macro `$crate::assert_align_gt_eq` which comes from the expansion of the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-nightly/transmute-mut-src-unsized.rs:16:35 - | -16 | const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AlignOf` - --> src/macro_util.rs - | - | pub struct AlignOf { - | ^ required by this bound in `AlignOf` - = note: this error originates in the macro `$crate::assert_align_gt_eq` which comes from the expansion of the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-nightly/transmute-mut-src-unsized.rs:16:35 - | -16 | const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | doesn't have a size known at compile-time - | required by a bound introduced by this call - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `transmute_mut` - --> src/macro_util.rs - | - | pub unsafe fn transmute_mut<'dst, 'src: 'dst, Src: 'src, Dst: 'dst>( - | ^^^ required by this bound in `transmute_mut` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ptr-to-usize.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ptr-to-usize.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ptr-to-usize.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ptr-to-usize.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,20 +0,0 @@ -// Copyright 2022 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::transmute; - -fn main() {} - -// It is unclear whether we can or should support this transmutation, especially -// in a const context. This test ensures that even if such a transmutation -// becomes valid due to the requisite implementations of `FromBytes` being -// added, that we re-examine whether it should specifically be valid in a const -// context. -const POINTER_VALUE: usize = transmute!(&0usize as *const usize); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ptr-to-usize.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ptr-to-usize.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ptr-to-usize.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ptr-to-usize.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,30 +0,0 @@ -error[E0277]: the trait bound `*const usize: AsBytes` is not satisfied - --> tests/ui-nightly/transmute-ptr-to-usize.rs:20:30 - | -20 | const POINTER_VALUE: usize = transmute!(&0usize as *const usize); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | the trait `AsBytes` is not implemented for `*const usize` - | required by a bound introduced by this call - | - = help: the trait `AsBytes` is implemented for `usize` -note: required by a bound in `AssertIsAsBytes` - --> tests/ui-nightly/transmute-ptr-to-usize.rs:20:30 - | -20 | const POINTER_VALUE: usize = transmute!(&0usize as *const usize); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertIsAsBytes` - = note: this error originates in the macro `transmute` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the trait bound `*const usize: AsBytes` is not satisfied - --> tests/ui-nightly/transmute-ptr-to-usize.rs:20:30 - | -20 | const POINTER_VALUE: usize = transmute!(&0usize as *const usize); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `AsBytes` is not implemented for `*const usize` - | - = help: the trait `AsBytes` is implemented for `usize` -note: required by a bound in `AssertIsAsBytes` - --> tests/ui-nightly/transmute-ptr-to-usize.rs:20:30 - | -20 | const POINTER_VALUE: usize = transmute!(&0usize as *const usize); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertIsAsBytes` - = note: this error originates in the macro `transmute` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-alignment-increase.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-alignment-increase.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-alignment-increase.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-alignment-increase.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,19 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -include!("../../zerocopy-derive/tests/util.rs"); - -extern crate zerocopy; - -use zerocopy::transmute_ref; - -fn main() {} - -// `transmute_ref!` does not support transmuting from a type of smaller -// alignment to one of larger alignment. -const INCREASE_ALIGNMENT: &AU16 = transmute_ref!(&[0u8; 2]); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-alignment-increase.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-alignment-increase.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-alignment-increase.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-alignment-increase.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,9 +0,0 @@ -error[E0512]: cannot transmute between types of different sizes, or dependently-sized types - --> tests/ui-nightly/transmute-ref-alignment-increase.rs:19:35 - | -19 | const INCREASE_ALIGNMENT: &AU16 = transmute_ref!(&[0u8; 2]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: source type: `AlignOf<[u8; 2]>` (8 bits) - = note: target type: `MaxAlignsOf<[u8; 2], AU16>` (16 bits) - = note: this error originates in the macro `$crate::assert_align_gt_eq` which comes from the expansion of the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-dst-generic.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-dst-generic.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-dst-generic.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-dst-generic.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::{transmute_ref, FromBytes}; - -fn main() {} - -fn transmute_ref(u: &u8) -> &T { - // `transmute_ref!` requires the destination type to be concrete. - transmute_ref!(u) -} diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-dst-generic.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-dst-generic.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-dst-generic.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-dst-generic.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,19 +0,0 @@ -error[E0512]: cannot transmute between types of different sizes, or dependently-sized types - --> tests/ui-nightly/transmute-ref-dst-generic.rs:17:5 - | -17 | transmute_ref!(u) - | ^^^^^^^^^^^^^^^^^ - | - = note: source type: `u8` (8 bits) - = note: target type: `T` (this type does not have a fixed size) - = note: this error originates in the macro `$crate::assert_size_eq` which comes from the expansion of the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0512]: cannot transmute between types of different sizes, or dependently-sized types - --> tests/ui-nightly/transmute-ref-dst-generic.rs:17:5 - | -17 | transmute_ref!(u) - | ^^^^^^^^^^^^^^^^^ - | - = note: source type: `AlignOf` (8 bits) - = note: target type: `MaxAlignsOf` (size can vary because of T) - = note: this error originates in the macro `$crate::assert_align_gt_eq` which comes from the expansion of the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-dst-mutable.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-dst-mutable.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-dst-mutable.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-dst-mutable.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,19 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::transmute_ref; - -fn main() {} - -fn ref_dst_mutable() { - // `transmute_ref!` requires that its destination type be an immutable - // reference. - let _: &mut u8 = transmute_ref!(&0u8); -} diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-dst-mutable.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-dst-mutable.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-dst-mutable.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-dst-mutable.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,29 +0,0 @@ -error[E0308]: mismatched types - --> tests/ui-nightly/transmute-ref-dst-mutable.rs:18:22 - | -18 | let _: &mut u8 = transmute_ref!(&0u8); - | ^^^^^^^^^^^^^^^^^^^^ types differ in mutability - | - = note: expected mutable reference `&mut u8` - found reference `&_` - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0308]: mismatched types - --> tests/ui-nightly/transmute-ref-dst-mutable.rs:18:22 - | -18 | let _: &mut u8 = transmute_ref!(&0u8); - | ^^^^^^^^^^^^^^^^^^^^ types differ in mutability - | - = note: expected mutable reference `&mut u8` - found reference `&_` - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0308]: mismatched types - --> tests/ui-nightly/transmute-ref-dst-mutable.rs:18:22 - | -18 | let _: &mut u8 = transmute_ref!(&0u8); - | ^^^^^^^^^^^^^^^^^^^^ types differ in mutability - | - = note: expected mutable reference `&mut u8` - found reference `&_` - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-dst-not-a-reference.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-dst-not-a-reference.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-dst-not-a-reference.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-dst-not-a-reference.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::transmute_ref; - -fn main() {} - -// `transmute_ref!` does not support transmuting into a non-reference -// destination type. -const DST_NOT_A_REFERENCE: usize = transmute_ref!(&0u8); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-dst-not-a-reference.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-dst-not-a-reference.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-dst-not-a-reference.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-dst-not-a-reference.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,29 +0,0 @@ -error[E0308]: mismatched types - --> tests/ui-nightly/transmute-ref-dst-not-a-reference.rs:17:36 - | -17 | const DST_NOT_A_REFERENCE: usize = transmute_ref!(&0u8); - | ^^^^^^^^^^^^^^^^^^^^ expected `usize`, found `&_` - | - = note: expected type `usize` - found reference `&_` - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0308]: mismatched types - --> tests/ui-nightly/transmute-ref-dst-not-a-reference.rs:17:36 - | -17 | const DST_NOT_A_REFERENCE: usize = transmute_ref!(&0u8); - | ^^^^^^^^^^^^^^^^^^^^ expected `usize`, found `&_` - | - = note: expected type `usize` - found reference `&_` - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0308]: mismatched types - --> tests/ui-nightly/transmute-ref-dst-not-a-reference.rs:17:36 - | -17 | const DST_NOT_A_REFERENCE: usize = transmute_ref!(&0u8); - | ^^^^^^^^^^^^^^^^^^^^ expected `usize`, found `&_` - | - = note: expected type `usize` - found reference `&_` - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-dst-not-frombytes.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-dst-not-frombytes.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-dst-not-frombytes.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-dst-not-frombytes.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -include!("../../zerocopy-derive/tests/util.rs"); - -extern crate zerocopy; - -use zerocopy::transmute_ref; - -fn main() {} - -// `transmute_ref` requires that the destination type implements `FromBytes` -const DST_NOT_FROM_BYTES: &NotZerocopy = transmute_ref!(&AU16(0)); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-dst-not-frombytes.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-dst-not-frombytes.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-dst-not-frombytes.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-dst-not-frombytes.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -error[E0277]: the trait bound `NotZerocopy: FromBytes` is not satisfied - --> tests/ui-nightly/transmute-ref-dst-not-frombytes.rs:18:42 - | -18 | const DST_NOT_FROM_BYTES: &NotZerocopy = transmute_ref!(&AU16(0)); - | ^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | the trait `FromBytes` is not implemented for `NotZerocopy` - | required by a bound introduced by this call - | - = help: the following other types implement trait `FromBytes`: - isize - i8 - i16 - i32 - i64 - i128 - usize - u8 - and $N others -note: required by a bound in `AssertIsFromBytes` - --> tests/ui-nightly/transmute-ref-dst-not-frombytes.rs:18:42 - | -18 | const DST_NOT_FROM_BYTES: &NotZerocopy = transmute_ref!(&AU16(0)); - | ^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertIsFromBytes` - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-dst-unsized.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-dst-unsized.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-dst-unsized.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-dst-unsized.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::transmute_ref; - -fn main() {} - -// `transmute_ref!` does not support transmuting into an unsized destination -// type. -const DST_UNSIZED: &[u8] = transmute_ref!(&[0u8; 1]); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-dst-unsized.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-dst-unsized.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-dst-unsized.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-dst-unsized.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,69 +0,0 @@ -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-nightly/transmute-ref-dst-unsized.rs:17:28 - | -17 | const DST_UNSIZED: &[u8] = transmute_ref!(&[0u8; 1]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | doesn't have a size known at compile-time - | required by a bound introduced by this call - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AssertIsFromBytes` - --> tests/ui-nightly/transmute-ref-dst-unsized.rs:17:28 - | -17 | const DST_UNSIZED: &[u8] = transmute_ref!(&[0u8; 1]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertIsFromBytes` - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-nightly/transmute-ref-dst-unsized.rs:17:28 - | -17 | const DST_UNSIZED: &[u8] = transmute_ref!(&[0u8; 1]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` - = note: all local variables must have a statically known size - = help: unsized locals are gated as an unstable feature - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-nightly/transmute-ref-dst-unsized.rs:17:28 - | -17 | const DST_UNSIZED: &[u8] = transmute_ref!(&[0u8; 1]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `MaxAlignsOf` - --> src/macro_util.rs - | - | pub union MaxAlignsOf { - | ^ required by this bound in `MaxAlignsOf` - = note: this error originates in the macro `$crate::assert_align_gt_eq` which comes from the expansion of the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-nightly/transmute-ref-dst-unsized.rs:17:28 - | -17 | const DST_UNSIZED: &[u8] = transmute_ref!(&[0u8; 1]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `transmute` - --> $RUST/core/src/intrinsics.rs - | - | pub fn transmute(src: Src) -> Dst; - | ^^^ required by this bound in `transmute` - = note: this error originates in the macro `$crate::assert_size_eq` which comes from the expansion of the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-nightly/transmute-ref-dst-unsized.rs:17:28 - | -17 | const DST_UNSIZED: &[u8] = transmute_ref!(&[0u8; 1]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `transmute_ref` - --> src/macro_util.rs - | - | pub const unsafe fn transmute_ref<'dst, 'src: 'dst, Src: 'src, Dst: 'dst>( - | ^^^ required by this bound in `transmute_ref` - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-illegal-lifetime.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-illegal-lifetime.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-illegal-lifetime.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-illegal-lifetime.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -fn main() {} - -fn increase_lifetime() { - let x = 0u64; - // It is illegal to increase the lifetime scope. - let _: &'static u64 = zerocopy::transmute_ref!(&x); -} diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-illegal-lifetime.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-illegal-lifetime.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-illegal-lifetime.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-illegal-lifetime.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,12 +0,0 @@ -error[E0597]: `x` does not live long enough - --> tests/ui-nightly/transmute-ref-illegal-lifetime.rs:14:52 - | -12 | let x = 0u64; - | - binding `x` declared here -13 | // It is illegal to increase the lifetime scope. -14 | let _: &'static u64 = zerocopy::transmute_ref!(&x); - | ------------ ^^ borrowed value does not live long enough - | | - | type annotation requires that `x` is borrowed for `'static` -15 | } - | - `x` dropped here while still borrowed diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-size-decrease.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-size-decrease.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-size-decrease.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-size-decrease.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::transmute_ref; - -fn main() {} - -// Although this is not a soundness requirement, we currently require that the -// size of the destination type is not smaller than the size of the source type. -const DECREASE_SIZE: &u8 = transmute_ref!(&[0u8; 2]); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-size-decrease.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-size-decrease.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-size-decrease.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-size-decrease.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,9 +0,0 @@ -error[E0512]: cannot transmute between types of different sizes, or dependently-sized types - --> tests/ui-nightly/transmute-ref-size-decrease.rs:17:28 - | -17 | const DECREASE_SIZE: &u8 = transmute_ref!(&[0u8; 2]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: source type: `[u8; 2]` (16 bits) - = note: target type: `u8` (8 bits) - = note: this error originates in the macro `$crate::assert_size_eq` which comes from the expansion of the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-size-increase.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-size-increase.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-size-increase.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-size-increase.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::transmute_ref; - -fn main() {} - -// `transmute_ref!` does not support transmuting from a smaller type to a larger -// one. -const INCREASE_SIZE: &[u8; 2] = transmute_ref!(&0u8); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-size-increase.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-size-increase.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-size-increase.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-size-increase.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,9 +0,0 @@ -error[E0512]: cannot transmute between types of different sizes, or dependently-sized types - --> tests/ui-nightly/transmute-ref-size-increase.rs:17:33 - | -17 | const INCREASE_SIZE: &[u8; 2] = transmute_ref!(&0u8); - | ^^^^^^^^^^^^^^^^^^^^ - | - = note: source type: `u8` (8 bits) - = note: target type: `[u8; 2]` (16 bits) - = note: this error originates in the macro `$crate::assert_size_eq` which comes from the expansion of the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-src-dst-generic.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-src-dst-generic.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-src-dst-generic.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-src-dst-generic.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,19 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::{transmute_ref, AsBytes, FromBytes}; - -fn main() {} - -fn transmute_ref(t: &T) -> &U { - // `transmute_ref!` requires the source and destination types to be - // concrete. - transmute_ref!(t) -} diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-src-dst-generic.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-src-dst-generic.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-src-dst-generic.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-src-dst-generic.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,19 +0,0 @@ -error[E0512]: cannot transmute between types of different sizes, or dependently-sized types - --> tests/ui-nightly/transmute-ref-src-dst-generic.rs:18:5 - | -18 | transmute_ref!(t) - | ^^^^^^^^^^^^^^^^^ - | - = note: source type: `T` (this type does not have a fixed size) - = note: target type: `U` (this type does not have a fixed size) - = note: this error originates in the macro `$crate::assert_size_eq` which comes from the expansion of the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0512]: cannot transmute between types of different sizes, or dependently-sized types - --> tests/ui-nightly/transmute-ref-src-dst-generic.rs:18:5 - | -18 | transmute_ref!(t) - | ^^^^^^^^^^^^^^^^^ - | - = note: source type: `AlignOf` (size can vary because of T) - = note: target type: `MaxAlignsOf` (size can vary because of T) - = note: this error originates in the macro `$crate::assert_align_gt_eq` which comes from the expansion of the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-src-dst-not-references.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-src-dst-not-references.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-src-dst-not-references.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-src-dst-not-references.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::transmute_ref; - -fn main() {} - -// `transmute_ref!` does not support transmuting between non-reference source -// and destination types. -const SRC_DST_NOT_REFERENCES: usize = transmute_ref!(0usize); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-src-dst-not-references.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-src-dst-not-references.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-src-dst-not-references.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-src-dst-not-references.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,45 +0,0 @@ -error[E0308]: mismatched types - --> tests/ui-nightly/transmute-ref-src-dst-not-references.rs:17:54 - | -17 | const SRC_DST_NOT_REFERENCES: usize = transmute_ref!(0usize); - | ---------------^^^^^^- - | | | - | | expected `&_`, found `usize` - | expected due to this - | - = note: expected reference `&_` - found type `usize` -help: consider borrowing here - | -17 | const SRC_DST_NOT_REFERENCES: usize = transmute_ref!(&0usize); - | + - -error[E0308]: mismatched types - --> tests/ui-nightly/transmute-ref-src-dst-not-references.rs:17:39 - | -17 | const SRC_DST_NOT_REFERENCES: usize = transmute_ref!(0usize); - | ^^^^^^^^^^^^^^^^^^^^^^ expected `usize`, found `&_` - | - = note: expected type `usize` - found reference `&_` - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0308]: mismatched types - --> tests/ui-nightly/transmute-ref-src-dst-not-references.rs:17:39 - | -17 | const SRC_DST_NOT_REFERENCES: usize = transmute_ref!(0usize); - | ^^^^^^^^^^^^^^^^^^^^^^ expected `usize`, found `&_` - | - = note: expected type `usize` - found reference `&_` - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0308]: mismatched types - --> tests/ui-nightly/transmute-ref-src-dst-not-references.rs:17:39 - | -17 | const SRC_DST_NOT_REFERENCES: usize = transmute_ref!(0usize); - | ^^^^^^^^^^^^^^^^^^^^^^ expected `usize`, found `&_` - | - = note: expected type `usize` - found reference `&_` - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-src-dst-unsized.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-src-dst-unsized.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-src-dst-unsized.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-src-dst-unsized.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::transmute_ref; - -fn main() {} - -// `transmute_ref!` does not support transmuting between unsized source and -// destination types. -const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-src-dst-unsized.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-src-dst-unsized.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-src-dst-unsized.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-src-dst-unsized.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,183 +0,0 @@ -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-nightly/transmute-ref-src-dst-unsized.rs:17:32 - | -17 | const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | doesn't have a size known at compile-time - | required by a bound introduced by this call - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AssertIsAsBytes` - --> tests/ui-nightly/transmute-ref-src-dst-unsized.rs:17:32 - | -17 | const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertIsAsBytes` - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-nightly/transmute-ref-src-dst-unsized.rs:17:32 - | -17 | const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AssertIsAsBytes` - --> tests/ui-nightly/transmute-ref-src-dst-unsized.rs:17:32 - | -17 | const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertIsAsBytes` - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-nightly/transmute-ref-src-dst-unsized.rs:17:32 - | -17 | const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | doesn't have a size known at compile-time - | required by a bound introduced by this call - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AssertIsFromBytes` - --> tests/ui-nightly/transmute-ref-src-dst-unsized.rs:17:32 - | -17 | const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertIsFromBytes` - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-nightly/transmute-ref-src-dst-unsized.rs:17:32 - | -17 | const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` - = note: all local variables must have a statically known size - = help: unsized locals are gated as an unstable feature - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-nightly/transmute-ref-src-dst-unsized.rs:17:32 - | -17 | const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AlignOf::::into_t` - --> src/macro_util.rs - | - | impl AlignOf { - | ^ required by this bound in `AlignOf::::into_t` - | #[inline(never)] // Make `missing_inline_in_public_items` happy. - | pub fn into_t(self) -> T { - | ------ required by a bound in this associated function - = note: this error originates in the macro `$crate::assert_align_gt_eq` which comes from the expansion of the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-nightly/transmute-ref-src-dst-unsized.rs:17:32 - | -17 | const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` - = note: the left-hand-side of an assignment must have a statically known size - = note: this error originates in the macro `$crate::assert_align_gt_eq` which comes from the expansion of the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-nightly/transmute-ref-src-dst-unsized.rs:17:32 - | -17 | const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AlignOf` - --> src/macro_util.rs - | - | pub struct AlignOf { - | ^ required by this bound in `AlignOf` - = note: this error originates in the macro `$crate::assert_align_gt_eq` which comes from the expansion of the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-nightly/transmute-ref-src-dst-unsized.rs:17:32 - | -17 | const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `MaxAlignsOf` - --> src/macro_util.rs - | - | pub union MaxAlignsOf { - | ^ required by this bound in `MaxAlignsOf` - = note: this error originates in the macro `$crate::assert_align_gt_eq` which comes from the expansion of the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-nightly/transmute-ref-src-dst-unsized.rs:17:32 - | -17 | const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AlignOf` - --> src/macro_util.rs - | - | pub struct AlignOf { - | ^ required by this bound in `AlignOf` - = note: this error originates in the macro `$crate::assert_align_gt_eq` which comes from the expansion of the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-nightly/transmute-ref-src-dst-unsized.rs:17:32 - | -17 | const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` - = note: all local variables must have a statically known size - = help: unsized locals are gated as an unstable feature - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-nightly/transmute-ref-src-dst-unsized.rs:17:32 - | -17 | const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `transmute` - --> $RUST/core/src/intrinsics.rs - | - | pub fn transmute(src: Src) -> Dst; - | ^^^ required by this bound in `transmute` - = note: this error originates in the macro `$crate::assert_size_eq` which comes from the expansion of the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-nightly/transmute-ref-src-dst-unsized.rs:17:32 - | -17 | const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | doesn't have a size known at compile-time - | required by a bound introduced by this call - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `transmute_ref` - --> src/macro_util.rs - | - | pub const unsafe fn transmute_ref<'dst, 'src: 'dst, Src: 'src, Dst: 'dst>( - | ^^^ required by this bound in `transmute_ref` - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-nightly/transmute-ref-src-dst-unsized.rs:17:32 - | -17 | const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `transmute_ref` - --> src/macro_util.rs - | - | pub const unsafe fn transmute_ref<'dst, 'src: 'dst, Src: 'src, Dst: 'dst>( - | ^^^ required by this bound in `transmute_ref` - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-src-generic.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-src-generic.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-src-generic.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-src-generic.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::{transmute_ref, AsBytes}; - -fn main() {} - -fn transmute_ref(t: &T) -> &u8 { - // `transmute_ref!` requires the source type to be concrete. - transmute_ref!(t) -} diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-src-generic.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-src-generic.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-src-generic.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-src-generic.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,19 +0,0 @@ -error[E0512]: cannot transmute between types of different sizes, or dependently-sized types - --> tests/ui-nightly/transmute-ref-src-generic.rs:17:5 - | -17 | transmute_ref!(t) - | ^^^^^^^^^^^^^^^^^ - | - = note: source type: `T` (this type does not have a fixed size) - = note: target type: `u8` (8 bits) - = note: this error originates in the macro `$crate::assert_size_eq` which comes from the expansion of the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0512]: cannot transmute between types of different sizes, or dependently-sized types - --> tests/ui-nightly/transmute-ref-src-generic.rs:17:5 - | -17 | transmute_ref!(t) - | ^^^^^^^^^^^^^^^^^ - | - = note: source type: `AlignOf` (size can vary because of T) - = note: target type: `MaxAlignsOf` (size can vary because of T) - = note: this error originates in the macro `$crate::assert_align_gt_eq` which comes from the expansion of the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-src-not-a-reference.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-src-not-a-reference.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-src-not-a-reference.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-src-not-a-reference.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::transmute_ref; - -fn main() {} - -// `transmute_ref!` does not support transmuting from a non-reference source -// type. -const SRC_NOT_A_REFERENCE: &u8 = transmute_ref!(0usize); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-src-not-a-reference.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-src-not-a-reference.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-src-not-a-reference.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-src-not-a-reference.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ -error[E0308]: mismatched types - --> tests/ui-nightly/transmute-ref-src-not-a-reference.rs:17:49 - | -17 | const SRC_NOT_A_REFERENCE: &u8 = transmute_ref!(0usize); - | ---------------^^^^^^- - | | | - | | expected `&_`, found `usize` - | expected due to this - | - = note: expected reference `&_` - found type `usize` -help: consider borrowing here - | -17 | const SRC_NOT_A_REFERENCE: &u8 = transmute_ref!(&0usize); - | + diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-src-not-asbytes.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-src-not-asbytes.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-src-not-asbytes.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-src-not-asbytes.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -include!("../../zerocopy-derive/tests/util.rs"); - -extern crate zerocopy; - -use zerocopy::transmute_ref; - -fn main() {} - -// `transmute_ref` requires that the source type implements `AsBytes` -const SRC_NOT_AS_BYTES: &AU16 = transmute_ref!(&NotZerocopy(AU16(0))); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-src-not-asbytes.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-src-not-asbytes.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-src-not-asbytes.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-src-not-asbytes.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,48 +0,0 @@ -error[E0277]: the trait bound `NotZerocopy: AsBytes` is not satisfied - --> tests/ui-nightly/transmute-ref-src-not-asbytes.rs:18:33 - | -18 | const SRC_NOT_AS_BYTES: &AU16 = transmute_ref!(&NotZerocopy(AU16(0))); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | the trait `AsBytes` is not implemented for `NotZerocopy` - | required by a bound introduced by this call - | - = help: the following other types implement trait `AsBytes`: - bool - char - isize - i8 - i16 - i32 - i64 - i128 - and $N others -note: required by a bound in `AssertIsAsBytes` - --> tests/ui-nightly/transmute-ref-src-not-asbytes.rs:18:33 - | -18 | const SRC_NOT_AS_BYTES: &AU16 = transmute_ref!(&NotZerocopy(AU16(0))); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertIsAsBytes` - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the trait bound `NotZerocopy: AsBytes` is not satisfied - --> tests/ui-nightly/transmute-ref-src-not-asbytes.rs:18:33 - | -18 | const SRC_NOT_AS_BYTES: &AU16 = transmute_ref!(&NotZerocopy(AU16(0))); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `AsBytes` is not implemented for `NotZerocopy` - | - = help: the following other types implement trait `AsBytes`: - bool - char - isize - i8 - i16 - i32 - i64 - i128 - and $N others -note: required by a bound in `AssertIsAsBytes` - --> tests/ui-nightly/transmute-ref-src-not-asbytes.rs:18:33 - | -18 | const SRC_NOT_AS_BYTES: &AU16 = transmute_ref!(&NotZerocopy(AU16(0))); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertIsAsBytes` - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-src-unsized.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-src-unsized.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-src-unsized.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-src-unsized.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,16 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::transmute_ref; - -fn main() {} - -// `transmute_ref!` does not support transmuting from an unsized source type. -const SRC_UNSIZED: &[u8; 1] = transmute_ref!(&[0u8][..]); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-src-unsized.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-src-unsized.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-src-unsized.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-ref-src-unsized.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,127 +0,0 @@ -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-nightly/transmute-ref-src-unsized.rs:16:31 - | -16 | const SRC_UNSIZED: &[u8; 1] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | doesn't have a size known at compile-time - | required by a bound introduced by this call - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AssertIsAsBytes` - --> tests/ui-nightly/transmute-ref-src-unsized.rs:16:31 - | -16 | const SRC_UNSIZED: &[u8; 1] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertIsAsBytes` - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-nightly/transmute-ref-src-unsized.rs:16:31 - | -16 | const SRC_UNSIZED: &[u8; 1] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AssertIsAsBytes` - --> tests/ui-nightly/transmute-ref-src-unsized.rs:16:31 - | -16 | const SRC_UNSIZED: &[u8; 1] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertIsAsBytes` - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-nightly/transmute-ref-src-unsized.rs:16:31 - | -16 | const SRC_UNSIZED: &[u8; 1] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` - = note: all local variables must have a statically known size - = help: unsized locals are gated as an unstable feature - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-nightly/transmute-ref-src-unsized.rs:16:31 - | -16 | const SRC_UNSIZED: &[u8; 1] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AlignOf::::into_t` - --> src/macro_util.rs - | - | impl AlignOf { - | ^ required by this bound in `AlignOf::::into_t` - | #[inline(never)] // Make `missing_inline_in_public_items` happy. - | pub fn into_t(self) -> T { - | ------ required by a bound in this associated function - = note: this error originates in the macro `$crate::assert_align_gt_eq` which comes from the expansion of the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-nightly/transmute-ref-src-unsized.rs:16:31 - | -16 | const SRC_UNSIZED: &[u8; 1] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` - = note: the left-hand-side of an assignment must have a statically known size - = note: this error originates in the macro `$crate::assert_align_gt_eq` which comes from the expansion of the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-nightly/transmute-ref-src-unsized.rs:16:31 - | -16 | const SRC_UNSIZED: &[u8; 1] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AlignOf` - --> src/macro_util.rs - | - | pub struct AlignOf { - | ^ required by this bound in `AlignOf` - = note: this error originates in the macro `$crate::assert_align_gt_eq` which comes from the expansion of the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-nightly/transmute-ref-src-unsized.rs:16:31 - | -16 | const SRC_UNSIZED: &[u8; 1] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `MaxAlignsOf` - --> src/macro_util.rs - | - | pub union MaxAlignsOf { - | ^ required by this bound in `MaxAlignsOf` - = note: this error originates in the macro `$crate::assert_align_gt_eq` which comes from the expansion of the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-nightly/transmute-ref-src-unsized.rs:16:31 - | -16 | const SRC_UNSIZED: &[u8; 1] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AlignOf` - --> src/macro_util.rs - | - | pub struct AlignOf { - | ^ required by this bound in `AlignOf` - = note: this error originates in the macro `$crate::assert_align_gt_eq` which comes from the expansion of the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-nightly/transmute-ref-src-unsized.rs:16:31 - | -16 | const SRC_UNSIZED: &[u8; 1] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | doesn't have a size known at compile-time - | required by a bound introduced by this call - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `transmute_ref` - --> src/macro_util.rs - | - | pub const unsafe fn transmute_ref<'dst, 'src: 'dst, Src: 'src, Dst: 'dst>( - | ^^^ required by this bound in `transmute_ref` - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-size-decrease.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-size-decrease.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-size-decrease.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-size-decrease.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,19 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -include!("../../zerocopy-derive/tests/util.rs"); - -extern crate zerocopy; - -use zerocopy::transmute; - -fn main() {} - -// Although this is not a soundness requirement, we currently require that the -// size of the destination type is not smaller than the size of the source type. -const DECREASE_SIZE: u8 = transmute!(AU16(0)); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-size-decrease.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-size-decrease.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-size-decrease.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-size-decrease.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,9 +0,0 @@ -error[E0512]: cannot transmute between types of different sizes, or dependently-sized types - --> tests/ui-nightly/transmute-size-decrease.rs:19:27 - | -19 | const DECREASE_SIZE: u8 = transmute!(AU16(0)); - | ^^^^^^^^^^^^^^^^^^^ - | - = note: source type: `AU16` (16 bits) - = note: target type: `u8` (8 bits) - = note: this error originates in the macro `transmute` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-size-increase.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-size-increase.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-size-increase.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-size-increase.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,19 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -include!("../../zerocopy-derive/tests/util.rs"); - -extern crate zerocopy; - -use zerocopy::transmute; - -fn main() {} - -// `transmute!` does not support transmuting from a smaller type to a larger -// one. -const INCREASE_SIZE: AU16 = transmute!(0u8); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-size-increase.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-size-increase.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-size-increase.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-size-increase.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,9 +0,0 @@ -error[E0512]: cannot transmute between types of different sizes, or dependently-sized types - --> tests/ui-nightly/transmute-size-increase.rs:19:29 - | -19 | const INCREASE_SIZE: AU16 = transmute!(0u8); - | ^^^^^^^^^^^^^^^ - | - = note: source type: `u8` (8 bits) - = note: target type: `AU16` (16 bits) - = note: this error originates in the macro `transmute` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-src-not-asbytes.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-src-not-asbytes.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-src-not-asbytes.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-src-not-asbytes.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -include!("../../zerocopy-derive/tests/util.rs"); - -extern crate zerocopy; - -use zerocopy::transmute; - -fn main() {} - -// `transmute` requires that the source type implements `AsBytes` -const SRC_NOT_AS_BYTES: AU16 = transmute!(NotZerocopy(AU16(0))); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-src-not-asbytes.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-src-not-asbytes.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-src-not-asbytes.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-nightly/transmute-src-not-asbytes.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,48 +0,0 @@ -error[E0277]: the trait bound `NotZerocopy: AsBytes` is not satisfied - --> tests/ui-nightly/transmute-src-not-asbytes.rs:18:32 - | -18 | const SRC_NOT_AS_BYTES: AU16 = transmute!(NotZerocopy(AU16(0))); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | the trait `AsBytes` is not implemented for `NotZerocopy` - | required by a bound introduced by this call - | - = help: the following other types implement trait `AsBytes`: - bool - char - isize - i8 - i16 - i32 - i64 - i128 - and $N others -note: required by a bound in `AssertIsAsBytes` - --> tests/ui-nightly/transmute-src-not-asbytes.rs:18:32 - | -18 | const SRC_NOT_AS_BYTES: AU16 = transmute!(NotZerocopy(AU16(0))); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertIsAsBytes` - = note: this error originates in the macro `transmute` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the trait bound `NotZerocopy: AsBytes` is not satisfied - --> tests/ui-nightly/transmute-src-not-asbytes.rs:18:32 - | -18 | const SRC_NOT_AS_BYTES: AU16 = transmute!(NotZerocopy(AU16(0))); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `AsBytes` is not implemented for `NotZerocopy` - | - = help: the following other types implement trait `AsBytes`: - bool - char - isize - i8 - i16 - i32 - i64 - i128 - and $N others -note: required by a bound in `AssertIsAsBytes` - --> tests/ui-nightly/transmute-src-not-asbytes.rs:18:32 - | -18 | const SRC_NOT_AS_BYTES: AU16 = transmute!(NotZerocopy(AU16(0))); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertIsAsBytes` - = note: this error originates in the macro `transmute` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/include_value_not_from_bytes.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/include_value_not_from_bytes.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/include_value_not_from_bytes.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/include_value_not_from_bytes.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,12 +0,0 @@ -// Copyright 2022 The Fuchsia Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#[macro_use] -extern crate zerocopy; - -fn main() {} - -// Should fail because `UnsafeCell: !FromBytes`. -const NOT_FROM_BYTES: core::cell::UnsafeCell = - include_value!("../../testdata/include_value/data"); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/include_value_not_from_bytes.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/include_value_not_from_bytes.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/include_value_not_from_bytes.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/include_value_not_from_bytes.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -error[E0277]: the trait bound `UnsafeCell: FromBytes` is not satisfied - --> tests/ui-stable/include_value_not_from_bytes.rs:12:5 - | -12 | include_value!("../../testdata/include_value/data"); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | the trait `FromBytes` is not implemented for `UnsafeCell` - | required by a bound introduced by this call - | - = help: the following other types implement trait `FromBytes`: - isize - i8 - i16 - i32 - i64 - i128 - usize - u8 - and $N others -note: required by a bound in `AssertIsFromBytes` - --> tests/ui-stable/include_value_not_from_bytes.rs:12:5 - | -12 | include_value!("../../testdata/include_value/data"); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertIsFromBytes` - = note: this error originates in the macro `$crate::transmute` which comes from the expansion of the macro `include_value` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/include_value_wrong_size.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/include_value_wrong_size.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/include_value_wrong_size.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/include_value_wrong_size.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,11 +0,0 @@ -// Copyright 2022 The Fuchsia Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#[macro_use] -extern crate zerocopy; - -fn main() {} - -// Should fail because the file is 4 bytes long, not 8. -const WRONG_SIZE: u64 = include_value!("../../testdata/include_value/data"); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/include_value_wrong_size.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/include_value_wrong_size.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/include_value_wrong_size.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/include_value_wrong_size.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,9 +0,0 @@ -error[E0512]: cannot transmute between types of different sizes, or dependently-sized types - --> tests/ui-stable/include_value_wrong_size.rs:11:25 - | -11 | const WRONG_SIZE: u64 = include_value!("../../testdata/include_value/data"); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: source type: `[u8; 4]` (32 bits) - = note: target type: `u64` (64 bits) - = note: this error originates in the macro `$crate::transmute` which comes from the expansion of the macro `include_value` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/invalid-impls/invalid-impls.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/invalid-impls/invalid-impls.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/invalid-impls/invalid-impls.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/invalid-impls/invalid-impls.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,29 +0,0 @@ -// Copyright 2022 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -// Since some macros from `macros.rs` are unused. -#![allow(unused)] - -extern crate zerocopy; -extern crate zerocopy_derive; - -include!("../../../src/macros.rs"); - -use zerocopy::*; -use zerocopy_derive::*; - -fn main() {} - -#[derive(FromZeroes, FromBytes, AsBytes, Unaligned)] -#[repr(transparent)] -struct Foo(T); - -impl_or_verify!(T => FromZeroes for Foo); -impl_or_verify!(T => FromBytes for Foo); -impl_or_verify!(T => AsBytes for Foo); -impl_or_verify!(T => Unaligned for Foo); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/invalid-impls/invalid-impls.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/invalid-impls/invalid-impls.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/invalid-impls/invalid-impls.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/invalid-impls/invalid-impls.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,107 +0,0 @@ -error[E0277]: the trait bound `T: zerocopy::FromZeroes` is not satisfied - --> tests/ui-stable/invalid-impls/invalid-impls.rs:26:37 - | -26 | impl_or_verify!(T => FromZeroes for Foo); - | ^^^^^^ the trait `zerocopy::FromZeroes` is not implemented for `T` - | -note: required for `Foo` to implement `zerocopy::FromZeroes` - --> tests/ui-stable/invalid-impls/invalid-impls.rs:22:10 - | -22 | #[derive(FromZeroes, FromBytes, AsBytes, Unaligned)] - | ^^^^^^^^^^ unsatisfied trait bound introduced in this `derive` macro -note: required by a bound in `_::Subtrait` - --> tests/ui-stable/invalid-impls/../../../src/macros.rs - | - | trait Subtrait: $trait {} - | ^^^^^^ required by this bound in `Subtrait` - | - ::: tests/ui-stable/invalid-impls/invalid-impls.rs:26:1 - | -26 | impl_or_verify!(T => FromZeroes for Foo); - | ------------------------------------------- in this macro invocation - = note: this error originates in the derive macro `FromZeroes` which comes from the expansion of the macro `impl_or_verify` (in Nightly builds, run with -Z macro-backtrace for more info) -help: consider restricting type parameter `T` - | -26 | impl_or_verify!(T: zerocopy::FromZeroes => FromZeroes for Foo); - | ++++++++++++++++++++++ - -error[E0277]: the trait bound `T: zerocopy::FromBytes` is not satisfied - --> tests/ui-stable/invalid-impls/invalid-impls.rs:27:36 - | -27 | impl_or_verify!(T => FromBytes for Foo); - | ^^^^^^ the trait `zerocopy::FromBytes` is not implemented for `T` - | -note: required for `Foo` to implement `zerocopy::FromBytes` - --> tests/ui-stable/invalid-impls/invalid-impls.rs:22:22 - | -22 | #[derive(FromZeroes, FromBytes, AsBytes, Unaligned)] - | ^^^^^^^^^ unsatisfied trait bound introduced in this `derive` macro -note: required by a bound in `_::Subtrait` - --> tests/ui-stable/invalid-impls/../../../src/macros.rs - | - | trait Subtrait: $trait {} - | ^^^^^^ required by this bound in `Subtrait` - | - ::: tests/ui-stable/invalid-impls/invalid-impls.rs:27:1 - | -27 | impl_or_verify!(T => FromBytes for Foo); - | ------------------------------------------ in this macro invocation - = note: this error originates in the derive macro `FromBytes` which comes from the expansion of the macro `impl_or_verify` (in Nightly builds, run with -Z macro-backtrace for more info) -help: consider restricting type parameter `T` - | -27 | impl_or_verify!(T: zerocopy::FromBytes => FromBytes for Foo); - | +++++++++++++++++++++ - -error[E0277]: the trait bound `T: zerocopy::AsBytes` is not satisfied - --> tests/ui-stable/invalid-impls/invalid-impls.rs:28:34 - | -28 | impl_or_verify!(T => AsBytes for Foo); - | ^^^^^^ the trait `zerocopy::AsBytes` is not implemented for `T` - | -note: required for `Foo` to implement `zerocopy::AsBytes` - --> tests/ui-stable/invalid-impls/invalid-impls.rs:22:33 - | -22 | #[derive(FromZeroes, FromBytes, AsBytes, Unaligned)] - | ^^^^^^^ unsatisfied trait bound introduced in this `derive` macro -note: required by a bound in `_::Subtrait` - --> tests/ui-stable/invalid-impls/../../../src/macros.rs - | - | trait Subtrait: $trait {} - | ^^^^^^ required by this bound in `Subtrait` - | - ::: tests/ui-stable/invalid-impls/invalid-impls.rs:28:1 - | -28 | impl_or_verify!(T => AsBytes for Foo); - | ---------------------------------------- in this macro invocation - = note: this error originates in the derive macro `AsBytes` which comes from the expansion of the macro `impl_or_verify` (in Nightly builds, run with -Z macro-backtrace for more info) -help: consider restricting type parameter `T` - | -28 | impl_or_verify!(T: zerocopy::AsBytes => AsBytes for Foo); - | +++++++++++++++++++ - -error[E0277]: the trait bound `T: zerocopy::Unaligned` is not satisfied - --> tests/ui-stable/invalid-impls/invalid-impls.rs:29:36 - | -29 | impl_or_verify!(T => Unaligned for Foo); - | ^^^^^^ the trait `zerocopy::Unaligned` is not implemented for `T` - | -note: required for `Foo` to implement `zerocopy::Unaligned` - --> tests/ui-stable/invalid-impls/invalid-impls.rs:22:42 - | -22 | #[derive(FromZeroes, FromBytes, AsBytes, Unaligned)] - | ^^^^^^^^^ unsatisfied trait bound introduced in this `derive` macro -note: required by a bound in `_::Subtrait` - --> tests/ui-stable/invalid-impls/../../../src/macros.rs - | - | trait Subtrait: $trait {} - | ^^^^^^ required by this bound in `Subtrait` - | - ::: tests/ui-stable/invalid-impls/invalid-impls.rs:29:1 - | -29 | impl_or_verify!(T => Unaligned for Foo); - | ------------------------------------------ in this macro invocation - = note: this error originates in the derive macro `Unaligned` which comes from the expansion of the macro `impl_or_verify` (in Nightly builds, run with -Z macro-backtrace for more info) -help: consider restricting type parameter `T` - | -29 | impl_or_verify!(T: zerocopy::Unaligned => Unaligned for Foo); - | +++++++++++++++++++++ diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-dst-not-frombytes.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-dst-not-frombytes.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-dst-not-frombytes.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-dst-not-frombytes.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -// Copyright 2022 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -include!("../../zerocopy-derive/tests/util.rs"); - -extern crate zerocopy; - -use zerocopy::transmute; - -fn main() {} - -// `transmute` requires that the destination type implements `FromBytes` -const DST_NOT_FROM_BYTES: NotZerocopy = transmute!(AU16(0)); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-dst-not-frombytes.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-dst-not-frombytes.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-dst-not-frombytes.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-dst-not-frombytes.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -error[E0277]: the trait bound `NotZerocopy: FromBytes` is not satisfied - --> tests/ui-stable/transmute-dst-not-frombytes.rs:18:41 - | -18 | const DST_NOT_FROM_BYTES: NotZerocopy = transmute!(AU16(0)); - | ^^^^^^^^^^^^^^^^^^^ - | | - | the trait `FromBytes` is not implemented for `NotZerocopy` - | required by a bound introduced by this call - | - = help: the following other types implement trait `FromBytes`: - isize - i8 - i16 - i32 - i64 - i128 - usize - u8 - and $N others -note: required by a bound in `AssertIsFromBytes` - --> tests/ui-stable/transmute-dst-not-frombytes.rs:18:41 - | -18 | const DST_NOT_FROM_BYTES: NotZerocopy = transmute!(AU16(0)); - | ^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertIsFromBytes` - = note: this error originates in the macro `transmute` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-alignment-increase.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-alignment-increase.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-alignment-increase.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-alignment-increase.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,19 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -include!("../../zerocopy-derive/tests/util.rs"); - -extern crate zerocopy; - -use zerocopy::transmute_mut; - -fn main() {} - -// `transmute_mut!` does not support transmuting from a type of smaller -// alignment to one of larger alignment. -const INCREASE_ALIGNMENT: &mut AU16 = transmute_mut!(&mut [0u8; 2]); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-alignment-increase.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-alignment-increase.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-alignment-increase.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-alignment-increase.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,9 +0,0 @@ -error[E0512]: cannot transmute between types of different sizes, or dependently-sized types - --> tests/ui-stable/transmute-mut-alignment-increase.rs:19:39 - | -19 | const INCREASE_ALIGNMENT: &mut AU16 = transmute_mut!(&mut [0u8; 2]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: source type: `AlignOf<[u8; 2]>` (8 bits) - = note: target type: `MaxAlignsOf<[u8; 2], AU16>` (16 bits) - = note: this error originates in the macro `$crate::assert_align_gt_eq` which comes from the expansion of the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-const.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-const.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-const.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-const.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,20 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -include!("../../zerocopy-derive/tests/util.rs"); - -extern crate zerocopy; - -use zerocopy::transmute_mut; - -fn main() {} - -const ARRAY_OF_U8S: [u8; 2] = [0u8; 2]; - -// `transmute_mut!` cannot, generally speaking, be used in const contexts. -const CONST_CONTEXT: &mut [u8; 2] = transmute_mut!(&mut ARRAY_OF_U8S); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-const.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-const.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-const.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-const.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,41 +0,0 @@ -warning: taking a mutable reference to a `const` item - --> tests/ui-stable/transmute-mut-const.rs:20:52 - | -20 | const CONST_CONTEXT: &mut [u8; 2] = transmute_mut!(&mut ARRAY_OF_U8S); - | ^^^^^^^^^^^^^^^^^ - | - = note: each usage of a `const` item creates a new temporary - = note: the mutable reference will refer to this temporary, not the original `const` item -note: `const` item defined here - --> tests/ui-stable/transmute-mut-const.rs:17:1 - | -17 | const ARRAY_OF_U8S: [u8; 2] = [0u8; 2]; - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ - = note: `#[warn(const_item_mutation)]` on by default - -error[E0658]: mutable references are not allowed in constants - --> tests/ui-stable/transmute-mut-const.rs:20:52 - | -20 | const CONST_CONTEXT: &mut [u8; 2] = transmute_mut!(&mut ARRAY_OF_U8S); - | ^^^^^^^^^^^^^^^^^ - | - = note: see issue #57349 for more information - -error[E0015]: cannot call non-const fn `transmute_mut::<'_, '_, [u8; 2], [u8; 2]>` in constants - --> tests/ui-stable/transmute-mut-const.rs:20:37 - | -20 | const CONST_CONTEXT: &mut [u8; 2] = transmute_mut!(&mut ARRAY_OF_U8S); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: calls in constants are limited to constant functions, tuple structs and tuple variants - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0716]: temporary value dropped while borrowed - --> tests/ui-stable/transmute-mut-const.rs:20:57 - | -20 | const CONST_CONTEXT: &mut [u8; 2] = transmute_mut!(&mut ARRAY_OF_U8S); - | --------------------^^^^^^^^^^^^- - | | | - | | creates a temporary value which is freed while still in use - | temporary value is freed at the end of this statement - | using this value as a constant requires that borrow lasts for `'static` diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-dst-generic.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-dst-generic.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-dst-generic.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-dst-generic.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::{transmute_mut, AsBytes, FromBytes}; - -fn main() {} - -fn transmute_mut(u: &mut u8) -> &mut T { - // `transmute_mut!` requires the destination type to be concrete. - transmute_mut!(u) -} diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-dst-generic.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-dst-generic.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-dst-generic.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-dst-generic.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,19 +0,0 @@ -error[E0512]: cannot transmute between types of different sizes, or dependently-sized types - --> tests/ui-stable/transmute-mut-dst-generic.rs:17:5 - | -17 | transmute_mut!(u) - | ^^^^^^^^^^^^^^^^^ - | - = note: source type: `u8` (8 bits) - = note: target type: `T` (this type does not have a fixed size) - = note: this error originates in the macro `$crate::assert_size_eq` which comes from the expansion of the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0512]: cannot transmute between types of different sizes, or dependently-sized types - --> tests/ui-stable/transmute-mut-dst-generic.rs:17:5 - | -17 | transmute_mut!(u) - | ^^^^^^^^^^^^^^^^^ - | - = note: source type: `AlignOf` (8 bits) - = note: target type: `MaxAlignsOf` (size can vary because of T) - = note: this error originates in the macro `$crate::assert_align_gt_eq` which comes from the expansion of the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-dst-not-a-reference.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-dst-not-a-reference.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-dst-not-a-reference.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-dst-not-a-reference.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::transmute_mut; - -fn main() {} - -// `transmute_mut!` does not support transmuting into a non-reference -// destination type. -const DST_NOT_A_REFERENCE: usize = transmute_mut!(&mut 0u8); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-dst-not-a-reference.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-dst-not-a-reference.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-dst-not-a-reference.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-dst-not-a-reference.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,39 +0,0 @@ -error[E0308]: mismatched types - --> tests/ui-stable/transmute-mut-dst-not-a-reference.rs:17:36 - | -17 | const DST_NOT_A_REFERENCE: usize = transmute_mut!(&mut 0u8); - | ^^^^^^^^^^^^^^^^^^^^^^^^ expected `usize`, found `&mut _` - | - = note: expected type `usize` - found mutable reference `&mut _` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0308]: mismatched types - --> tests/ui-stable/transmute-mut-dst-not-a-reference.rs:17:36 - | -17 | const DST_NOT_A_REFERENCE: usize = transmute_mut!(&mut 0u8); - | ^^^^^^^^^^^^^^^^^^^^^^^^ expected `usize`, found `&mut _` - | - = note: expected type `usize` - found mutable reference `&mut _` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0308]: mismatched types - --> tests/ui-stable/transmute-mut-dst-not-a-reference.rs:17:36 - | -17 | const DST_NOT_A_REFERENCE: usize = transmute_mut!(&mut 0u8); - | ^^^^^^^^^^^^^^^^^^^^^^^^ expected `usize`, found `&mut _` - | - = note: expected type `usize` - found mutable reference `&mut _` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0308]: mismatched types - --> tests/ui-stable/transmute-mut-dst-not-a-reference.rs:17:36 - | -17 | const DST_NOT_A_REFERENCE: usize = transmute_mut!(&mut 0u8); - | ^^^^^^^^^^^^^^^^^^^^^^^^ expected `usize`, found `&mut _` - | - = note: expected type `usize` - found mutable reference `&mut _` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-dst-not-asbytes.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-dst-not-asbytes.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-dst-not-asbytes.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-dst-not-asbytes.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,24 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::transmute_mut; - -fn main() {} - -#[derive(zerocopy::FromZeroes, zerocopy::FromBytes, zerocopy::AsBytes)] -#[repr(C)] -struct Src; - -#[derive(zerocopy::FromZeroes, zerocopy::FromBytes)] -#[repr(C)] -struct Dst; - -// `transmute_mut` requires that the destination type implements `AsBytes` -const DST_NOT_AS_BYTES: &mut Dst = transmute_mut!(&mut Src); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-dst-not-asbytes.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-dst-not-asbytes.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-dst-not-asbytes.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-dst-not-asbytes.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -error[E0277]: the trait bound `Dst: AsBytes` is not satisfied - --> tests/ui-stable/transmute-mut-dst-not-asbytes.rs:24:36 - | -24 | const DST_NOT_AS_BYTES: &mut Dst = transmute_mut!(&mut Src); - | ^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | the trait `AsBytes` is not implemented for `Dst` - | required by a bound introduced by this call - | - = help: the following other types implement trait `AsBytes`: - bool - char - isize - i8 - i16 - i32 - i64 - i128 - and $N others -note: required by a bound in `AssertDstIsAsBytes` - --> tests/ui-stable/transmute-mut-dst-not-asbytes.rs:24:36 - | -24 | const DST_NOT_AS_BYTES: &mut Dst = transmute_mut!(&mut Src); - | ^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertDstIsAsBytes` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-dst-not-frombytes.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-dst-not-frombytes.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-dst-not-frombytes.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-dst-not-frombytes.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,24 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::transmute_mut; - -fn main() {} - -#[derive(zerocopy::FromZeroes, zerocopy::FromBytes, zerocopy::AsBytes)] -#[repr(C)] -struct Src; - -#[derive(zerocopy::AsBytes)] -#[repr(C)] -struct Dst; - -// `transmute_mut` requires that the destination type implements `FromBytes` -const DST_NOT_FROM_BYTES: &mut Dst = transmute_mut!(&mut Src); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-dst-not-frombytes.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-dst-not-frombytes.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-dst-not-frombytes.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-dst-not-frombytes.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -error[E0277]: the trait bound `Dst: FromBytes` is not satisfied - --> tests/ui-stable/transmute-mut-dst-not-frombytes.rs:24:38 - | -24 | const DST_NOT_FROM_BYTES: &mut Dst = transmute_mut!(&mut Src); - | ^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | the trait `FromBytes` is not implemented for `Dst` - | required by a bound introduced by this call - | - = help: the following other types implement trait `FromBytes`: - isize - i8 - i16 - i32 - i64 - i128 - usize - u8 - and $N others -note: required by a bound in `AssertDstIsFromBytes` - --> tests/ui-stable/transmute-mut-dst-not-frombytes.rs:24:38 - | -24 | const DST_NOT_FROM_BYTES: &mut Dst = transmute_mut!(&mut Src); - | ^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertDstIsFromBytes` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-dst-unsized.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-dst-unsized.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-dst-unsized.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-dst-unsized.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::transmute_mut; - -fn main() {} - -// `transmute_mut!` does not support transmuting into an unsized destination -// type. -const DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8; 1]); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-dst-unsized.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-dst-unsized.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-dst-unsized.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-dst-unsized.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,106 +0,0 @@ -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-mut-dst-unsized.rs:17:32 - | -17 | const DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8; 1]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | doesn't have a size known at compile-time - | required by a bound introduced by this call - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AssertDstIsFromBytes` - --> tests/ui-stable/transmute-mut-dst-unsized.rs:17:32 - | -17 | const DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8; 1]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertDstIsFromBytes` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-mut-dst-unsized.rs:17:32 - | -17 | const DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8; 1]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | doesn't have a size known at compile-time - | required by a bound introduced by this call - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AssertDstIsAsBytes` - --> tests/ui-stable/transmute-mut-dst-unsized.rs:17:32 - | -17 | const DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8; 1]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertDstIsAsBytes` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-mut-dst-unsized.rs:17:32 - | -17 | const DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8; 1]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` - = note: all local variables must have a statically known size - = help: unsized locals are gated as an unstable feature - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-mut-dst-unsized.rs:17:32 - | -17 | const DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8; 1]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `MaxAlignsOf` - --> src/macro_util.rs - | - | pub union MaxAlignsOf { - | ^ required by this bound in `MaxAlignsOf` - = note: this error originates in the macro `$crate::assert_align_gt_eq` which comes from the expansion of the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-mut-dst-unsized.rs:17:32 - | -17 | const DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8; 1]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `transmute` - --> $RUST/core/src/intrinsics.rs - | - | pub fn transmute(src: Src) -> Dst; - | ^^^ required by this bound in `transmute` - = note: this error originates in the macro `$crate::assert_size_eq` which comes from the expansion of the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-mut-dst-unsized.rs:17:32 - | -17 | const DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8; 1]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | doesn't have a size known at compile-time - | required by a bound introduced by this call - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `MaxAlignsOf::::new` - --> src/macro_util.rs - | - | impl MaxAlignsOf { - | ^ required by this bound in `MaxAlignsOf::::new` - | #[inline(never)] // Make `missing_inline_in_public_items` happy. - | pub fn new(_t: T, _u: U) -> MaxAlignsOf { - | --- required by a bound in this associated function - = note: this error originates in the macro `$crate::assert_align_gt_eq` which comes from the expansion of the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-mut-dst-unsized.rs:17:32 - | -17 | const DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8; 1]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `transmute_mut` - --> src/macro_util.rs - | - | pub unsafe fn transmute_mut<'dst, 'src: 'dst, Src: 'src, Dst: 'dst>( - | ^^^ required by this bound in `transmute_mut` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-illegal-lifetime.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-illegal-lifetime.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-illegal-lifetime.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-illegal-lifetime.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -fn main() {} - -fn increase_lifetime() { - let mut x = 0u64; - // It is illegal to increase the lifetime scope. - let _: &'static mut u64 = zerocopy::transmute_mut!(&mut x); -} diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-illegal-lifetime.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-illegal-lifetime.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-illegal-lifetime.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-illegal-lifetime.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,12 +0,0 @@ -error[E0597]: `x` does not live long enough - --> tests/ui-stable/transmute-mut-illegal-lifetime.rs:14:56 - | -12 | let mut x = 0u64; - | ----- binding `x` declared here -13 | // It is illegal to increase the lifetime scope. -14 | let _: &'static mut u64 = zerocopy::transmute_mut!(&mut x); - | ---------------- ^^^^^^ borrowed value does not live long enough - | | - | type annotation requires that `x` is borrowed for `'static` -15 | } - | - `x` dropped here while still borrowed diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-size-decrease.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-size-decrease.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-size-decrease.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-size-decrease.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::transmute_mut; - -fn main() {} - -// We require that the size of the destination type is not smaller than the size -// of the source type. -const DECREASE_SIZE: &mut u8 = transmute_mut!(&mut [0u8; 2]); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-size-decrease.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-size-decrease.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-size-decrease.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-size-decrease.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,9 +0,0 @@ -error[E0512]: cannot transmute between types of different sizes, or dependently-sized types - --> tests/ui-stable/transmute-mut-size-decrease.rs:17:32 - | -17 | const DECREASE_SIZE: &mut u8 = transmute_mut!(&mut [0u8; 2]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: source type: `[u8; 2]` (16 bits) - = note: target type: `u8` (8 bits) - = note: this error originates in the macro `$crate::assert_size_eq` which comes from the expansion of the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-size-increase.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-size-increase.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-size-increase.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-size-increase.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::transmute_mut; - -fn main() {} - -// `transmute_mut!` does not support transmuting from a smaller type to a larger -// one. -const INCREASE_SIZE: &mut [u8; 2] = transmute_mut!(&mut 0u8); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-size-increase.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-size-increase.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-size-increase.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-size-increase.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,9 +0,0 @@ -error[E0512]: cannot transmute between types of different sizes, or dependently-sized types - --> tests/ui-stable/transmute-mut-size-increase.rs:17:37 - | -17 | const INCREASE_SIZE: &mut [u8; 2] = transmute_mut!(&mut 0u8); - | ^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: source type: `u8` (8 bits) - = note: target type: `[u8; 2]` (16 bits) - = note: this error originates in the macro `$crate::assert_size_eq` which comes from the expansion of the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-dst-generic.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-dst-generic.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-dst-generic.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-dst-generic.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,19 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::{transmute_mut, AsBytes, FromBytes}; - -fn main() {} - -fn transmute_mut(t: &mut T) -> &mut U { - // `transmute_mut!` requires the source and destination types to be - // concrete. - transmute_mut!(t) -} diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-dst-generic.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-dst-generic.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-dst-generic.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-dst-generic.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,19 +0,0 @@ -error[E0512]: cannot transmute between types of different sizes, or dependently-sized types - --> tests/ui-stable/transmute-mut-src-dst-generic.rs:18:5 - | -18 | transmute_mut!(t) - | ^^^^^^^^^^^^^^^^^ - | - = note: source type: `T` (this type does not have a fixed size) - = note: target type: `U` (this type does not have a fixed size) - = note: this error originates in the macro `$crate::assert_size_eq` which comes from the expansion of the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0512]: cannot transmute between types of different sizes, or dependently-sized types - --> tests/ui-stable/transmute-mut-src-dst-generic.rs:18:5 - | -18 | transmute_mut!(t) - | ^^^^^^^^^^^^^^^^^ - | - = note: source type: `AlignOf` (size can vary because of T) - = note: target type: `MaxAlignsOf` (size can vary because of T) - = note: this error originates in the macro `$crate::assert_align_gt_eq` which comes from the expansion of the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-dst-not-references.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-dst-not-references.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-dst-not-references.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-dst-not-references.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::transmute_mut; - -fn main() {} - -// `transmute_mut!` does not support transmuting between non-reference source -// and destination types. -const SRC_DST_NOT_REFERENCES: &mut usize = transmute_mut!(0usize); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-dst-not-references.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-dst-not-references.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-dst-not-references.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-dst-not-references.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ -error[E0308]: mismatched types - --> tests/ui-stable/transmute-mut-src-dst-not-references.rs:17:59 - | -17 | const SRC_DST_NOT_REFERENCES: &mut usize = transmute_mut!(0usize); - | ---------------^^^^^^- - | | | - | | expected `&mut _`, found `usize` - | expected due to this - | - = note: expected mutable reference `&mut _` - found type `usize` -help: consider mutably borrowing here - | -17 | const SRC_DST_NOT_REFERENCES: &mut usize = transmute_mut!(&mut 0usize); - | ++++ diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-dst-unsized.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-dst-unsized.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-dst-unsized.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-dst-unsized.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::transmute_mut; - -fn main() {} - -// `transmute_mut!` does not support transmuting between unsized source and -// destination types. -const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-dst-unsized.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-dst-unsized.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-dst-unsized.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-dst-unsized.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,288 +0,0 @@ -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-mut-src-dst-unsized.rs:17:36 - | -17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | doesn't have a size known at compile-time - | required by a bound introduced by this call - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AssertSrcIsFromBytes` - --> tests/ui-stable/transmute-mut-src-dst-unsized.rs:17:36 - | -17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertSrcIsFromBytes` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-mut-src-dst-unsized.rs:17:36 - | -17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AssertSrcIsFromBytes` - --> tests/ui-stable/transmute-mut-src-dst-unsized.rs:17:36 - | -17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertSrcIsFromBytes` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-mut-src-dst-unsized.rs:17:36 - | -17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | doesn't have a size known at compile-time - | required by a bound introduced by this call - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AssertSrcIsAsBytes` - --> tests/ui-stable/transmute-mut-src-dst-unsized.rs:17:36 - | -17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertSrcIsAsBytes` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-mut-src-dst-unsized.rs:17:36 - | -17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AssertSrcIsAsBytes` - --> tests/ui-stable/transmute-mut-src-dst-unsized.rs:17:36 - | -17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertSrcIsAsBytes` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-mut-src-dst-unsized.rs:17:36 - | -17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | doesn't have a size known at compile-time - | required by a bound introduced by this call - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AssertDstIsFromBytes` - --> tests/ui-stable/transmute-mut-src-dst-unsized.rs:17:36 - | -17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertDstIsFromBytes` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-mut-src-dst-unsized.rs:17:36 - | -17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | doesn't have a size known at compile-time - | required by a bound introduced by this call - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AssertDstIsAsBytes` - --> tests/ui-stable/transmute-mut-src-dst-unsized.rs:17:36 - | -17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertDstIsAsBytes` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-mut-src-dst-unsized.rs:17:36 - | -17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` - = note: all local variables must have a statically known size - = help: unsized locals are gated as an unstable feature - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-mut-src-dst-unsized.rs:17:36 - | -17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | doesn't have a size known at compile-time - | required by a bound introduced by this call - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `transmute` - --> $RUST/core/src/intrinsics.rs - | - | pub fn transmute(src: Src) -> Dst; - | ^^^ required by this bound in `transmute` - = note: this error originates in the macro `$crate::assert_size_eq` which comes from the expansion of the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-mut-src-dst-unsized.rs:17:36 - | -17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AlignOf::::into_t` - --> src/macro_util.rs - | - | impl AlignOf { - | ^ required by this bound in `AlignOf::::into_t` - | #[inline(never)] // Make `missing_inline_in_public_items` happy. - | pub fn into_t(self) -> T { - | ------ required by a bound in this associated function - = note: this error originates in the macro `$crate::assert_align_gt_eq` which comes from the expansion of the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-mut-src-dst-unsized.rs:17:36 - | -17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` - = note: the left-hand-side of an assignment must have a statically known size - = note: this error originates in the macro `$crate::assert_align_gt_eq` which comes from the expansion of the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-mut-src-dst-unsized.rs:17:36 - | -17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AlignOf` - --> src/macro_util.rs - | - | pub struct AlignOf { - | ^ required by this bound in `AlignOf` - = note: this error originates in the macro `$crate::assert_align_gt_eq` which comes from the expansion of the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-mut-src-dst-unsized.rs:17:36 - | -17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | doesn't have a size known at compile-time - | required by a bound introduced by this call - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `MaxAlignsOf::::new` - --> src/macro_util.rs - | - | impl MaxAlignsOf { - | ^ required by this bound in `MaxAlignsOf::::new` - | #[inline(never)] // Make `missing_inline_in_public_items` happy. - | pub fn new(_t: T, _u: U) -> MaxAlignsOf { - | --- required by a bound in this associated function - = note: this error originates in the macro `$crate::assert_align_gt_eq` which comes from the expansion of the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-mut-src-dst-unsized.rs:17:36 - | -17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `MaxAlignsOf` - --> src/macro_util.rs - | - | pub union MaxAlignsOf { - | ^ required by this bound in `MaxAlignsOf` - = note: this error originates in the macro `$crate::assert_align_gt_eq` which comes from the expansion of the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-mut-src-dst-unsized.rs:17:36 - | -17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AlignOf` - --> src/macro_util.rs - | - | pub struct AlignOf { - | ^ required by this bound in `AlignOf` - = note: this error originates in the macro `$crate::assert_align_gt_eq` which comes from the expansion of the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-mut-src-dst-unsized.rs:17:36 - | -17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` - = note: all local variables must have a statically known size - = help: unsized locals are gated as an unstable feature - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-mut-src-dst-unsized.rs:17:36 - | -17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `transmute` - --> $RUST/core/src/intrinsics.rs - | - | pub fn transmute(src: Src) -> Dst; - | ^^^ required by this bound in `transmute` - = note: this error originates in the macro `$crate::assert_size_eq` which comes from the expansion of the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-mut-src-dst-unsized.rs:17:36 - | -17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | doesn't have a size known at compile-time - | required by a bound introduced by this call - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `MaxAlignsOf::::new` - --> src/macro_util.rs - | - | impl MaxAlignsOf { - | ^ required by this bound in `MaxAlignsOf::::new` - | #[inline(never)] // Make `missing_inline_in_public_items` happy. - | pub fn new(_t: T, _u: U) -> MaxAlignsOf { - | --- required by a bound in this associated function - = note: this error originates in the macro `$crate::assert_align_gt_eq` which comes from the expansion of the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-mut-src-dst-unsized.rs:17:36 - | -17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | doesn't have a size known at compile-time - | required by a bound introduced by this call - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `transmute_mut` - --> src/macro_util.rs - | - | pub unsafe fn transmute_mut<'dst, 'src: 'dst, Src: 'src, Dst: 'dst>( - | ^^^ required by this bound in `transmute_mut` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-mut-src-dst-unsized.rs:17:36 - | -17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `transmute_mut` - --> src/macro_util.rs - | - | pub unsafe fn transmute_mut<'dst, 'src: 'dst, Src: 'src, Dst: 'dst>( - | ^^^ required by this bound in `transmute_mut` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-generic.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-generic.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-generic.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-generic.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::{transmute_mut, AsBytes}; - -fn main() {} - -fn transmute_mut(t: &mut T) -> &mut u8 { - // `transmute_mut!` requires the source type to be concrete. - transmute_mut!(t) -} diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-generic.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-generic.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-generic.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-generic.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,10 +0,0 @@ -error[E0405]: cannot find trait `FromBytes` in this scope - --> tests/ui-stable/transmute-mut-src-generic.rs:15:31 - | -15 | fn transmute_mut(t: &mut T) -> &mut u8 { - | ^^^^^^^^^ not found in this scope - | -help: consider importing this trait - | -11 + use zerocopy::FromBytes; - | diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-immutable.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-immutable.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-immutable.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-immutable.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::transmute_mut; - -fn main() {} - -fn ref_src_immutable() { - // `transmute_mut!` requires that its source type be a mutable reference. - let _: &mut u8 = transmute_mut!(&0u8); -} diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-immutable.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-immutable.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-immutable.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-immutable.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,11 +0,0 @@ -error[E0308]: mismatched types - --> tests/ui-stable/transmute-mut-src-immutable.rs:17:37 - | -17 | let _: &mut u8 = transmute_mut!(&0u8); - | ---------------^^^^- - | | | - | | types differ in mutability - | expected due to this - | - = note: expected mutable reference `&mut _` - found reference `&u8` diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-not-a-reference.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-not-a-reference.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-not-a-reference.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-not-a-reference.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::transmute_mut; - -fn main() {} - -// `transmute_mut!` does not support transmuting from a non-reference source -// type. -const SRC_NOT_A_REFERENCE: &mut u8 = transmute_mut!(0usize); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-not-a-reference.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-not-a-reference.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-not-a-reference.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-not-a-reference.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ -error[E0308]: mismatched types - --> tests/ui-stable/transmute-mut-src-not-a-reference.rs:17:53 - | -17 | const SRC_NOT_A_REFERENCE: &mut u8 = transmute_mut!(0usize); - | ---------------^^^^^^- - | | | - | | expected `&mut _`, found `usize` - | expected due to this - | - = note: expected mutable reference `&mut _` - found type `usize` -help: consider mutably borrowing here - | -17 | const SRC_NOT_A_REFERENCE: &mut u8 = transmute_mut!(&mut 0usize); - | ++++ diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-not-asbytes.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-not-asbytes.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-not-asbytes.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-not-asbytes.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,24 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::transmute_mut; - -fn main() {} - -#[derive(zerocopy::FromZeroes, zerocopy::FromBytes)] -#[repr(C)] -struct Src; - -#[derive(zerocopy::FromZeroes, zerocopy::FromBytes, zerocopy::AsBytes)] -#[repr(C)] -struct Dst; - -// `transmute_mut` requires that the source type implements `AsBytes` -const SRC_NOT_AS_BYTES: &mut Dst = transmute_mut!(&mut Src); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-not-asbytes.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-not-asbytes.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-not-asbytes.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-not-asbytes.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,48 +0,0 @@ -error[E0277]: the trait bound `Src: AsBytes` is not satisfied - --> tests/ui-stable/transmute-mut-src-not-asbytes.rs:24:36 - | -24 | const SRC_NOT_AS_BYTES: &mut Dst = transmute_mut!(&mut Src); - | ^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | the trait `AsBytes` is not implemented for `Src` - | required by a bound introduced by this call - | - = help: the following other types implement trait `AsBytes`: - bool - char - isize - i8 - i16 - i32 - i64 - i128 - and $N others -note: required by a bound in `AssertSrcIsAsBytes` - --> tests/ui-stable/transmute-mut-src-not-asbytes.rs:24:36 - | -24 | const SRC_NOT_AS_BYTES: &mut Dst = transmute_mut!(&mut Src); - | ^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertSrcIsAsBytes` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the trait bound `Src: AsBytes` is not satisfied - --> tests/ui-stable/transmute-mut-src-not-asbytes.rs:24:36 - | -24 | const SRC_NOT_AS_BYTES: &mut Dst = transmute_mut!(&mut Src); - | ^^^^^^^^^^^^^^^^^^^^^^^^ the trait `AsBytes` is not implemented for `Src` - | - = help: the following other types implement trait `AsBytes`: - bool - char - isize - i8 - i16 - i32 - i64 - i128 - and $N others -note: required by a bound in `AssertSrcIsAsBytes` - --> tests/ui-stable/transmute-mut-src-not-asbytes.rs:24:36 - | -24 | const SRC_NOT_AS_BYTES: &mut Dst = transmute_mut!(&mut Src); - | ^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertSrcIsAsBytes` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-not-frombytes.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-not-frombytes.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-not-frombytes.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-not-frombytes.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,24 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::transmute_mut; - -fn main() {} - -#[derive(zerocopy::AsBytes)] -#[repr(C)] -struct Src; - -#[derive(zerocopy::FromZeroes, zerocopy::FromBytes, zerocopy::AsBytes)] -#[repr(C)] -struct Dst; - -// `transmute_mut` requires that the source type implements `FromBytes` -const SRC_NOT_FROM_BYTES: &mut Dst = transmute_mut!(&mut Src); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-not-frombytes.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-not-frombytes.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-not-frombytes.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-not-frombytes.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,48 +0,0 @@ -error[E0277]: the trait bound `Src: FromBytes` is not satisfied - --> tests/ui-stable/transmute-mut-src-not-frombytes.rs:24:38 - | -24 | const SRC_NOT_FROM_BYTES: &mut Dst = transmute_mut!(&mut Src); - | ^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | the trait `FromBytes` is not implemented for `Src` - | required by a bound introduced by this call - | - = help: the following other types implement trait `FromBytes`: - isize - i8 - i16 - i32 - i64 - i128 - usize - u8 - and $N others -note: required by a bound in `AssertSrcIsFromBytes` - --> tests/ui-stable/transmute-mut-src-not-frombytes.rs:24:38 - | -24 | const SRC_NOT_FROM_BYTES: &mut Dst = transmute_mut!(&mut Src); - | ^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertSrcIsFromBytes` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the trait bound `Src: FromBytes` is not satisfied - --> tests/ui-stable/transmute-mut-src-not-frombytes.rs:24:38 - | -24 | const SRC_NOT_FROM_BYTES: &mut Dst = transmute_mut!(&mut Src); - | ^^^^^^^^^^^^^^^^^^^^^^^^ the trait `FromBytes` is not implemented for `Src` - | - = help: the following other types implement trait `FromBytes`: - isize - i8 - i16 - i32 - i64 - i128 - usize - u8 - and $N others -note: required by a bound in `AssertSrcIsFromBytes` - --> tests/ui-stable/transmute-mut-src-not-frombytes.rs:24:38 - | -24 | const SRC_NOT_FROM_BYTES: &mut Dst = transmute_mut!(&mut Src); - | ^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertSrcIsFromBytes` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-unsized.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-unsized.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-unsized.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-unsized.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,16 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::transmute_mut; - -fn main() {} - -// `transmute_mut!` does not support transmuting from an unsized source type. -const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-unsized.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-unsized.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-unsized.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-mut-src-unsized.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,195 +0,0 @@ -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-mut-src-unsized.rs:16:35 - | -16 | const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | doesn't have a size known at compile-time - | required by a bound introduced by this call - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AssertSrcIsFromBytes` - --> tests/ui-stable/transmute-mut-src-unsized.rs:16:35 - | -16 | const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertSrcIsFromBytes` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-mut-src-unsized.rs:16:35 - | -16 | const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AssertSrcIsFromBytes` - --> tests/ui-stable/transmute-mut-src-unsized.rs:16:35 - | -16 | const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertSrcIsFromBytes` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-mut-src-unsized.rs:16:35 - | -16 | const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | doesn't have a size known at compile-time - | required by a bound introduced by this call - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AssertSrcIsAsBytes` - --> tests/ui-stable/transmute-mut-src-unsized.rs:16:35 - | -16 | const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertSrcIsAsBytes` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-mut-src-unsized.rs:16:35 - | -16 | const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AssertSrcIsAsBytes` - --> tests/ui-stable/transmute-mut-src-unsized.rs:16:35 - | -16 | const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertSrcIsAsBytes` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-mut-src-unsized.rs:16:35 - | -16 | const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` - = note: all local variables must have a statically known size - = help: unsized locals are gated as an unstable feature - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-mut-src-unsized.rs:16:35 - | -16 | const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | doesn't have a size known at compile-time - | required by a bound introduced by this call - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `transmute` - --> $RUST/core/src/intrinsics.rs - | - | pub fn transmute(src: Src) -> Dst; - | ^^^ required by this bound in `transmute` - = note: this error originates in the macro `$crate::assert_size_eq` which comes from the expansion of the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-mut-src-unsized.rs:16:35 - | -16 | const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AlignOf::::into_t` - --> src/macro_util.rs - | - | impl AlignOf { - | ^ required by this bound in `AlignOf::::into_t` - | #[inline(never)] // Make `missing_inline_in_public_items` happy. - | pub fn into_t(self) -> T { - | ------ required by a bound in this associated function - = note: this error originates in the macro `$crate::assert_align_gt_eq` which comes from the expansion of the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-mut-src-unsized.rs:16:35 - | -16 | const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` - = note: the left-hand-side of an assignment must have a statically known size - = note: this error originates in the macro `$crate::assert_align_gt_eq` which comes from the expansion of the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-mut-src-unsized.rs:16:35 - | -16 | const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AlignOf` - --> src/macro_util.rs - | - | pub struct AlignOf { - | ^ required by this bound in `AlignOf` - = note: this error originates in the macro `$crate::assert_align_gt_eq` which comes from the expansion of the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-mut-src-unsized.rs:16:35 - | -16 | const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | doesn't have a size known at compile-time - | required by a bound introduced by this call - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `MaxAlignsOf::::new` - --> src/macro_util.rs - | - | impl MaxAlignsOf { - | ^ required by this bound in `MaxAlignsOf::::new` - | #[inline(never)] // Make `missing_inline_in_public_items` happy. - | pub fn new(_t: T, _u: U) -> MaxAlignsOf { - | --- required by a bound in this associated function - = note: this error originates in the macro `$crate::assert_align_gt_eq` which comes from the expansion of the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-mut-src-unsized.rs:16:35 - | -16 | const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `MaxAlignsOf` - --> src/macro_util.rs - | - | pub union MaxAlignsOf { - | ^ required by this bound in `MaxAlignsOf` - = note: this error originates in the macro `$crate::assert_align_gt_eq` which comes from the expansion of the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-mut-src-unsized.rs:16:35 - | -16 | const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AlignOf` - --> src/macro_util.rs - | - | pub struct AlignOf { - | ^ required by this bound in `AlignOf` - = note: this error originates in the macro `$crate::assert_align_gt_eq` which comes from the expansion of the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-mut-src-unsized.rs:16:35 - | -16 | const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | doesn't have a size known at compile-time - | required by a bound introduced by this call - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `transmute_mut` - --> src/macro_util.rs - | - | pub unsafe fn transmute_mut<'dst, 'src: 'dst, Src: 'src, Dst: 'dst>( - | ^^^ required by this bound in `transmute_mut` - = note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ptr-to-usize.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ptr-to-usize.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ptr-to-usize.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ptr-to-usize.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,20 +0,0 @@ -// Copyright 2022 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::transmute; - -fn main() {} - -// It is unclear whether we can or should support this transmutation, especially -// in a const context. This test ensures that even if such a transmutation -// becomes valid due to the requisite implementations of `FromBytes` being -// added, that we re-examine whether it should specifically be valid in a const -// context. -const POINTER_VALUE: usize = transmute!(&0usize as *const usize); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ptr-to-usize.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ptr-to-usize.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ptr-to-usize.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ptr-to-usize.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,30 +0,0 @@ -error[E0277]: the trait bound `*const usize: AsBytes` is not satisfied - --> tests/ui-stable/transmute-ptr-to-usize.rs:20:30 - | -20 | const POINTER_VALUE: usize = transmute!(&0usize as *const usize); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | the trait `AsBytes` is not implemented for `*const usize` - | required by a bound introduced by this call - | - = help: the trait `AsBytes` is implemented for `usize` -note: required by a bound in `AssertIsAsBytes` - --> tests/ui-stable/transmute-ptr-to-usize.rs:20:30 - | -20 | const POINTER_VALUE: usize = transmute!(&0usize as *const usize); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertIsAsBytes` - = note: this error originates in the macro `transmute` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the trait bound `*const usize: AsBytes` is not satisfied - --> tests/ui-stable/transmute-ptr-to-usize.rs:20:30 - | -20 | const POINTER_VALUE: usize = transmute!(&0usize as *const usize); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `AsBytes` is not implemented for `*const usize` - | - = help: the trait `AsBytes` is implemented for `usize` -note: required by a bound in `AssertIsAsBytes` - --> tests/ui-stable/transmute-ptr-to-usize.rs:20:30 - | -20 | const POINTER_VALUE: usize = transmute!(&0usize as *const usize); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertIsAsBytes` - = note: this error originates in the macro `transmute` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-alignment-increase.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-alignment-increase.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-alignment-increase.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-alignment-increase.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,19 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -include!("../../zerocopy-derive/tests/util.rs"); - -extern crate zerocopy; - -use zerocopy::transmute_ref; - -fn main() {} - -// `transmute_ref!` does not support transmuting from a type of smaller -// alignment to one of larger alignment. -const INCREASE_ALIGNMENT: &AU16 = transmute_ref!(&[0u8; 2]); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-alignment-increase.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-alignment-increase.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-alignment-increase.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-alignment-increase.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,9 +0,0 @@ -error[E0512]: cannot transmute between types of different sizes, or dependently-sized types - --> tests/ui-stable/transmute-ref-alignment-increase.rs:19:35 - | -19 | const INCREASE_ALIGNMENT: &AU16 = transmute_ref!(&[0u8; 2]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: source type: `AlignOf<[u8; 2]>` (8 bits) - = note: target type: `MaxAlignsOf<[u8; 2], AU16>` (16 bits) - = note: this error originates in the macro `$crate::assert_align_gt_eq` which comes from the expansion of the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-dst-generic.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-dst-generic.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-dst-generic.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-dst-generic.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::{transmute_ref, FromBytes}; - -fn main() {} - -fn transmute_ref(u: &u8) -> &T { - // `transmute_ref!` requires the destination type to be concrete. - transmute_ref!(u) -} diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-dst-generic.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-dst-generic.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-dst-generic.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-dst-generic.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,19 +0,0 @@ -error[E0512]: cannot transmute between types of different sizes, or dependently-sized types - --> tests/ui-stable/transmute-ref-dst-generic.rs:17:5 - | -17 | transmute_ref!(u) - | ^^^^^^^^^^^^^^^^^ - | - = note: source type: `u8` (8 bits) - = note: target type: `T` (this type does not have a fixed size) - = note: this error originates in the macro `$crate::assert_size_eq` which comes from the expansion of the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0512]: cannot transmute between types of different sizes, or dependently-sized types - --> tests/ui-stable/transmute-ref-dst-generic.rs:17:5 - | -17 | transmute_ref!(u) - | ^^^^^^^^^^^^^^^^^ - | - = note: source type: `AlignOf` (8 bits) - = note: target type: `MaxAlignsOf` (size can vary because of T) - = note: this error originates in the macro `$crate::assert_align_gt_eq` which comes from the expansion of the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-dst-mutable.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-dst-mutable.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-dst-mutable.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-dst-mutable.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,19 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::transmute_ref; - -fn main() {} - -fn ref_dst_mutable() { - // `transmute_ref!` requires that its destination type be an immutable - // reference. - let _: &mut u8 = transmute_ref!(&0u8); -} diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-dst-mutable.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-dst-mutable.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-dst-mutable.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-dst-mutable.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,29 +0,0 @@ -error[E0308]: mismatched types - --> tests/ui-stable/transmute-ref-dst-mutable.rs:18:22 - | -18 | let _: &mut u8 = transmute_ref!(&0u8); - | ^^^^^^^^^^^^^^^^^^^^ types differ in mutability - | - = note: expected mutable reference `&mut u8` - found reference `&_` - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0308]: mismatched types - --> tests/ui-stable/transmute-ref-dst-mutable.rs:18:22 - | -18 | let _: &mut u8 = transmute_ref!(&0u8); - | ^^^^^^^^^^^^^^^^^^^^ types differ in mutability - | - = note: expected mutable reference `&mut u8` - found reference `&_` - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0308]: mismatched types - --> tests/ui-stable/transmute-ref-dst-mutable.rs:18:22 - | -18 | let _: &mut u8 = transmute_ref!(&0u8); - | ^^^^^^^^^^^^^^^^^^^^ types differ in mutability - | - = note: expected mutable reference `&mut u8` - found reference `&_` - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-dst-not-a-reference.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-dst-not-a-reference.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-dst-not-a-reference.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-dst-not-a-reference.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::transmute_ref; - -fn main() {} - -// `transmute_ref!` does not support transmuting into a non-reference -// destination type. -const DST_NOT_A_REFERENCE: usize = transmute_ref!(&0u8); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-dst-not-a-reference.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-dst-not-a-reference.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-dst-not-a-reference.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-dst-not-a-reference.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,29 +0,0 @@ -error[E0308]: mismatched types - --> tests/ui-stable/transmute-ref-dst-not-a-reference.rs:17:36 - | -17 | const DST_NOT_A_REFERENCE: usize = transmute_ref!(&0u8); - | ^^^^^^^^^^^^^^^^^^^^ expected `usize`, found `&_` - | - = note: expected type `usize` - found reference `&_` - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0308]: mismatched types - --> tests/ui-stable/transmute-ref-dst-not-a-reference.rs:17:36 - | -17 | const DST_NOT_A_REFERENCE: usize = transmute_ref!(&0u8); - | ^^^^^^^^^^^^^^^^^^^^ expected `usize`, found `&_` - | - = note: expected type `usize` - found reference `&_` - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0308]: mismatched types - --> tests/ui-stable/transmute-ref-dst-not-a-reference.rs:17:36 - | -17 | const DST_NOT_A_REFERENCE: usize = transmute_ref!(&0u8); - | ^^^^^^^^^^^^^^^^^^^^ expected `usize`, found `&_` - | - = note: expected type `usize` - found reference `&_` - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-dst-not-frombytes.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-dst-not-frombytes.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-dst-not-frombytes.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-dst-not-frombytes.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -include!("../../zerocopy-derive/tests/util.rs"); - -extern crate zerocopy; - -use zerocopy::transmute_ref; - -fn main() {} - -// `transmute_ref` requires that the destination type implements `FromBytes` -const DST_NOT_FROM_BYTES: &NotZerocopy = transmute_ref!(&AU16(0)); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-dst-not-frombytes.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-dst-not-frombytes.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-dst-not-frombytes.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-dst-not-frombytes.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -error[E0277]: the trait bound `NotZerocopy: FromBytes` is not satisfied - --> tests/ui-stable/transmute-ref-dst-not-frombytes.rs:18:42 - | -18 | const DST_NOT_FROM_BYTES: &NotZerocopy = transmute_ref!(&AU16(0)); - | ^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | the trait `FromBytes` is not implemented for `NotZerocopy` - | required by a bound introduced by this call - | - = help: the following other types implement trait `FromBytes`: - isize - i8 - i16 - i32 - i64 - i128 - usize - u8 - and $N others -note: required by a bound in `AssertIsFromBytes` - --> tests/ui-stable/transmute-ref-dst-not-frombytes.rs:18:42 - | -18 | const DST_NOT_FROM_BYTES: &NotZerocopy = transmute_ref!(&AU16(0)); - | ^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertIsFromBytes` - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-dst-unsized.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-dst-unsized.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-dst-unsized.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-dst-unsized.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::transmute_ref; - -fn main() {} - -// `transmute_ref!` does not support transmuting into an unsized destination -// type. -const DST_UNSIZED: &[u8] = transmute_ref!(&[0u8; 1]); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-dst-unsized.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-dst-unsized.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-dst-unsized.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-dst-unsized.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,89 +0,0 @@ -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-ref-dst-unsized.rs:17:28 - | -17 | const DST_UNSIZED: &[u8] = transmute_ref!(&[0u8; 1]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | doesn't have a size known at compile-time - | required by a bound introduced by this call - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AssertIsFromBytes` - --> tests/ui-stable/transmute-ref-dst-unsized.rs:17:28 - | -17 | const DST_UNSIZED: &[u8] = transmute_ref!(&[0u8; 1]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertIsFromBytes` - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-ref-dst-unsized.rs:17:28 - | -17 | const DST_UNSIZED: &[u8] = transmute_ref!(&[0u8; 1]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` - = note: all local variables must have a statically known size - = help: unsized locals are gated as an unstable feature - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-ref-dst-unsized.rs:17:28 - | -17 | const DST_UNSIZED: &[u8] = transmute_ref!(&[0u8; 1]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `MaxAlignsOf` - --> src/macro_util.rs - | - | pub union MaxAlignsOf { - | ^ required by this bound in `MaxAlignsOf` - = note: this error originates in the macro `$crate::assert_align_gt_eq` which comes from the expansion of the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-ref-dst-unsized.rs:17:28 - | -17 | const DST_UNSIZED: &[u8] = transmute_ref!(&[0u8; 1]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `transmute` - --> $RUST/core/src/intrinsics.rs - | - | pub fn transmute(src: Src) -> Dst; - | ^^^ required by this bound in `transmute` - = note: this error originates in the macro `$crate::assert_size_eq` which comes from the expansion of the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-ref-dst-unsized.rs:17:28 - | -17 | const DST_UNSIZED: &[u8] = transmute_ref!(&[0u8; 1]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | doesn't have a size known at compile-time - | required by a bound introduced by this call - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `MaxAlignsOf::::new` - --> src/macro_util.rs - | - | impl MaxAlignsOf { - | ^ required by this bound in `MaxAlignsOf::::new` - | #[inline(never)] // Make `missing_inline_in_public_items` happy. - | pub fn new(_t: T, _u: U) -> MaxAlignsOf { - | --- required by a bound in this associated function - = note: this error originates in the macro `$crate::assert_align_gt_eq` which comes from the expansion of the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-ref-dst-unsized.rs:17:28 - | -17 | const DST_UNSIZED: &[u8] = transmute_ref!(&[0u8; 1]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `transmute_ref` - --> src/macro_util.rs - | - | pub const unsafe fn transmute_ref<'dst, 'src: 'dst, Src: 'src, Dst: 'dst>( - | ^^^ required by this bound in `transmute_ref` - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-illegal-lifetime.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-illegal-lifetime.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-illegal-lifetime.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-illegal-lifetime.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -fn main() {} - -fn increase_lifetime() { - let x = 0u64; - // It is illegal to increase the lifetime scope. - let _: &'static u64 = zerocopy::transmute_ref!(&x); -} diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-illegal-lifetime.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-illegal-lifetime.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-illegal-lifetime.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-illegal-lifetime.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,12 +0,0 @@ -error[E0597]: `x` does not live long enough - --> tests/ui-stable/transmute-ref-illegal-lifetime.rs:14:52 - | -12 | let x = 0u64; - | - binding `x` declared here -13 | // It is illegal to increase the lifetime scope. -14 | let _: &'static u64 = zerocopy::transmute_ref!(&x); - | ------------ ^^ borrowed value does not live long enough - | | - | type annotation requires that `x` is borrowed for `'static` -15 | } - | - `x` dropped here while still borrowed diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-size-decrease.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-size-decrease.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-size-decrease.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-size-decrease.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::transmute_ref; - -fn main() {} - -// Although this is not a soundness requirement, we currently require that the -// size of the destination type is not smaller than the size of the source type. -const DECREASE_SIZE: &u8 = transmute_ref!(&[0u8; 2]); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-size-decrease.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-size-decrease.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-size-decrease.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-size-decrease.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,9 +0,0 @@ -error[E0512]: cannot transmute between types of different sizes, or dependently-sized types - --> tests/ui-stable/transmute-ref-size-decrease.rs:17:28 - | -17 | const DECREASE_SIZE: &u8 = transmute_ref!(&[0u8; 2]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: source type: `[u8; 2]` (16 bits) - = note: target type: `u8` (8 bits) - = note: this error originates in the macro `$crate::assert_size_eq` which comes from the expansion of the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-size-increase.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-size-increase.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-size-increase.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-size-increase.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::transmute_ref; - -fn main() {} - -// `transmute_ref!` does not support transmuting from a smaller type to a larger -// one. -const INCREASE_SIZE: &[u8; 2] = transmute_ref!(&0u8); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-size-increase.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-size-increase.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-size-increase.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-size-increase.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,9 +0,0 @@ -error[E0512]: cannot transmute between types of different sizes, or dependently-sized types - --> tests/ui-stable/transmute-ref-size-increase.rs:17:33 - | -17 | const INCREASE_SIZE: &[u8; 2] = transmute_ref!(&0u8); - | ^^^^^^^^^^^^^^^^^^^^ - | - = note: source type: `u8` (8 bits) - = note: target type: `[u8; 2]` (16 bits) - = note: this error originates in the macro `$crate::assert_size_eq` which comes from the expansion of the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-src-dst-generic.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-src-dst-generic.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-src-dst-generic.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-src-dst-generic.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,19 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::{transmute_ref, AsBytes, FromBytes}; - -fn main() {} - -fn transmute_ref(t: &T) -> &U { - // `transmute_ref!` requires the source and destination types to be - // concrete. - transmute_ref!(t) -} diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-src-dst-generic.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-src-dst-generic.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-src-dst-generic.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-src-dst-generic.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,19 +0,0 @@ -error[E0512]: cannot transmute between types of different sizes, or dependently-sized types - --> tests/ui-stable/transmute-ref-src-dst-generic.rs:18:5 - | -18 | transmute_ref!(t) - | ^^^^^^^^^^^^^^^^^ - | - = note: source type: `T` (this type does not have a fixed size) - = note: target type: `U` (this type does not have a fixed size) - = note: this error originates in the macro `$crate::assert_size_eq` which comes from the expansion of the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0512]: cannot transmute between types of different sizes, or dependently-sized types - --> tests/ui-stable/transmute-ref-src-dst-generic.rs:18:5 - | -18 | transmute_ref!(t) - | ^^^^^^^^^^^^^^^^^ - | - = note: source type: `AlignOf` (size can vary because of T) - = note: target type: `MaxAlignsOf` (size can vary because of T) - = note: this error originates in the macro `$crate::assert_align_gt_eq` which comes from the expansion of the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-src-dst-not-references.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-src-dst-not-references.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-src-dst-not-references.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-src-dst-not-references.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::transmute_ref; - -fn main() {} - -// `transmute_ref!` does not support transmuting between non-reference source -// and destination types. -const SRC_DST_NOT_REFERENCES: usize = transmute_ref!(0usize); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-src-dst-not-references.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-src-dst-not-references.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-src-dst-not-references.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-src-dst-not-references.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,45 +0,0 @@ -error[E0308]: mismatched types - --> tests/ui-stable/transmute-ref-src-dst-not-references.rs:17:54 - | -17 | const SRC_DST_NOT_REFERENCES: usize = transmute_ref!(0usize); - | ---------------^^^^^^- - | | | - | | expected `&_`, found `usize` - | expected due to this - | - = note: expected reference `&_` - found type `usize` -help: consider borrowing here - | -17 | const SRC_DST_NOT_REFERENCES: usize = transmute_ref!(&0usize); - | + - -error[E0308]: mismatched types - --> tests/ui-stable/transmute-ref-src-dst-not-references.rs:17:39 - | -17 | const SRC_DST_NOT_REFERENCES: usize = transmute_ref!(0usize); - | ^^^^^^^^^^^^^^^^^^^^^^ expected `usize`, found `&_` - | - = note: expected type `usize` - found reference `&_` - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0308]: mismatched types - --> tests/ui-stable/transmute-ref-src-dst-not-references.rs:17:39 - | -17 | const SRC_DST_NOT_REFERENCES: usize = transmute_ref!(0usize); - | ^^^^^^^^^^^^^^^^^^^^^^ expected `usize`, found `&_` - | - = note: expected type `usize` - found reference `&_` - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0308]: mismatched types - --> tests/ui-stable/transmute-ref-src-dst-not-references.rs:17:39 - | -17 | const SRC_DST_NOT_REFERENCES: usize = transmute_ref!(0usize); - | ^^^^^^^^^^^^^^^^^^^^^^ expected `usize`, found `&_` - | - = note: expected type `usize` - found reference `&_` - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-src-dst-unsized.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-src-dst-unsized.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-src-dst-unsized.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-src-dst-unsized.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::transmute_ref; - -fn main() {} - -// `transmute_ref!` does not support transmuting between unsized source and -// destination types. -const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-src-dst-unsized.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-src-dst-unsized.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-src-dst-unsized.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-src-dst-unsized.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,240 +0,0 @@ -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-ref-src-dst-unsized.rs:17:32 - | -17 | const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | doesn't have a size known at compile-time - | required by a bound introduced by this call - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AssertIsAsBytes` - --> tests/ui-stable/transmute-ref-src-dst-unsized.rs:17:32 - | -17 | const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertIsAsBytes` - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-ref-src-dst-unsized.rs:17:32 - | -17 | const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AssertIsAsBytes` - --> tests/ui-stable/transmute-ref-src-dst-unsized.rs:17:32 - | -17 | const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertIsAsBytes` - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-ref-src-dst-unsized.rs:17:32 - | -17 | const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | doesn't have a size known at compile-time - | required by a bound introduced by this call - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AssertIsFromBytes` - --> tests/ui-stable/transmute-ref-src-dst-unsized.rs:17:32 - | -17 | const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertIsFromBytes` - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-ref-src-dst-unsized.rs:17:32 - | -17 | const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` - = note: all local variables must have a statically known size - = help: unsized locals are gated as an unstable feature - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-ref-src-dst-unsized.rs:17:32 - | -17 | const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | doesn't have a size known at compile-time - | required by a bound introduced by this call - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `transmute` - --> $RUST/core/src/intrinsics.rs - | - | pub fn transmute(src: Src) -> Dst; - | ^^^ required by this bound in `transmute` - = note: this error originates in the macro `$crate::assert_size_eq` which comes from the expansion of the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-ref-src-dst-unsized.rs:17:32 - | -17 | const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AlignOf::::into_t` - --> src/macro_util.rs - | - | impl AlignOf { - | ^ required by this bound in `AlignOf::::into_t` - | #[inline(never)] // Make `missing_inline_in_public_items` happy. - | pub fn into_t(self) -> T { - | ------ required by a bound in this associated function - = note: this error originates in the macro `$crate::assert_align_gt_eq` which comes from the expansion of the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-ref-src-dst-unsized.rs:17:32 - | -17 | const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` - = note: the left-hand-side of an assignment must have a statically known size - = note: this error originates in the macro `$crate::assert_align_gt_eq` which comes from the expansion of the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-ref-src-dst-unsized.rs:17:32 - | -17 | const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AlignOf` - --> src/macro_util.rs - | - | pub struct AlignOf { - | ^ required by this bound in `AlignOf` - = note: this error originates in the macro `$crate::assert_align_gt_eq` which comes from the expansion of the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-ref-src-dst-unsized.rs:17:32 - | -17 | const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | doesn't have a size known at compile-time - | required by a bound introduced by this call - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `MaxAlignsOf::::new` - --> src/macro_util.rs - | - | impl MaxAlignsOf { - | ^ required by this bound in `MaxAlignsOf::::new` - | #[inline(never)] // Make `missing_inline_in_public_items` happy. - | pub fn new(_t: T, _u: U) -> MaxAlignsOf { - | --- required by a bound in this associated function - = note: this error originates in the macro `$crate::assert_align_gt_eq` which comes from the expansion of the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-ref-src-dst-unsized.rs:17:32 - | -17 | const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `MaxAlignsOf` - --> src/macro_util.rs - | - | pub union MaxAlignsOf { - | ^ required by this bound in `MaxAlignsOf` - = note: this error originates in the macro `$crate::assert_align_gt_eq` which comes from the expansion of the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-ref-src-dst-unsized.rs:17:32 - | -17 | const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AlignOf` - --> src/macro_util.rs - | - | pub struct AlignOf { - | ^ required by this bound in `AlignOf` - = note: this error originates in the macro `$crate::assert_align_gt_eq` which comes from the expansion of the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-ref-src-dst-unsized.rs:17:32 - | -17 | const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` - = note: all local variables must have a statically known size - = help: unsized locals are gated as an unstable feature - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-ref-src-dst-unsized.rs:17:32 - | -17 | const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `transmute` - --> $RUST/core/src/intrinsics.rs - | - | pub fn transmute(src: Src) -> Dst; - | ^^^ required by this bound in `transmute` - = note: this error originates in the macro `$crate::assert_size_eq` which comes from the expansion of the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-ref-src-dst-unsized.rs:17:32 - | -17 | const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | doesn't have a size known at compile-time - | required by a bound introduced by this call - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `MaxAlignsOf::::new` - --> src/macro_util.rs - | - | impl MaxAlignsOf { - | ^ required by this bound in `MaxAlignsOf::::new` - | #[inline(never)] // Make `missing_inline_in_public_items` happy. - | pub fn new(_t: T, _u: U) -> MaxAlignsOf { - | --- required by a bound in this associated function - = note: this error originates in the macro `$crate::assert_align_gt_eq` which comes from the expansion of the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-ref-src-dst-unsized.rs:17:32 - | -17 | const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | doesn't have a size known at compile-time - | required by a bound introduced by this call - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `transmute_ref` - --> src/macro_util.rs - | - | pub const unsafe fn transmute_ref<'dst, 'src: 'dst, Src: 'src, Dst: 'dst>( - | ^^^ required by this bound in `transmute_ref` - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-ref-src-dst-unsized.rs:17:32 - | -17 | const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `transmute_ref` - --> src/macro_util.rs - | - | pub const unsafe fn transmute_ref<'dst, 'src: 'dst, Src: 'src, Dst: 'dst>( - | ^^^ required by this bound in `transmute_ref` - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-src-generic.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-src-generic.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-src-generic.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-src-generic.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::{transmute_ref, AsBytes}; - -fn main() {} - -fn transmute_ref(t: &T) -> &u8 { - // `transmute_ref!` requires the source type to be concrete. - transmute_ref!(t) -} diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-src-generic.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-src-generic.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-src-generic.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-src-generic.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,19 +0,0 @@ -error[E0512]: cannot transmute between types of different sizes, or dependently-sized types - --> tests/ui-stable/transmute-ref-src-generic.rs:17:5 - | -17 | transmute_ref!(t) - | ^^^^^^^^^^^^^^^^^ - | - = note: source type: `T` (this type does not have a fixed size) - = note: target type: `u8` (8 bits) - = note: this error originates in the macro `$crate::assert_size_eq` which comes from the expansion of the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0512]: cannot transmute between types of different sizes, or dependently-sized types - --> tests/ui-stable/transmute-ref-src-generic.rs:17:5 - | -17 | transmute_ref!(t) - | ^^^^^^^^^^^^^^^^^ - | - = note: source type: `AlignOf` (size can vary because of T) - = note: target type: `MaxAlignsOf` (size can vary because of T) - = note: this error originates in the macro `$crate::assert_align_gt_eq` which comes from the expansion of the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-src-not-a-reference.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-src-not-a-reference.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-src-not-a-reference.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-src-not-a-reference.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::transmute_ref; - -fn main() {} - -// `transmute_ref!` does not support transmuting from a non-reference source -// type. -const SRC_NOT_A_REFERENCE: &u8 = transmute_ref!(0usize); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-src-not-a-reference.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-src-not-a-reference.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-src-not-a-reference.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-src-not-a-reference.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ -error[E0308]: mismatched types - --> tests/ui-stable/transmute-ref-src-not-a-reference.rs:17:49 - | -17 | const SRC_NOT_A_REFERENCE: &u8 = transmute_ref!(0usize); - | ---------------^^^^^^- - | | | - | | expected `&_`, found `usize` - | expected due to this - | - = note: expected reference `&_` - found type `usize` -help: consider borrowing here - | -17 | const SRC_NOT_A_REFERENCE: &u8 = transmute_ref!(&0usize); - | + diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-src-not-asbytes.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-src-not-asbytes.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-src-not-asbytes.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-src-not-asbytes.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -include!("../../zerocopy-derive/tests/util.rs"); - -extern crate zerocopy; - -use zerocopy::transmute_ref; - -fn main() {} - -// `transmute_ref` requires that the source type implements `AsBytes` -const SRC_NOT_AS_BYTES: &AU16 = transmute_ref!(&NotZerocopy(AU16(0))); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-src-not-asbytes.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-src-not-asbytes.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-src-not-asbytes.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-src-not-asbytes.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,48 +0,0 @@ -error[E0277]: the trait bound `NotZerocopy: AsBytes` is not satisfied - --> tests/ui-stable/transmute-ref-src-not-asbytes.rs:18:33 - | -18 | const SRC_NOT_AS_BYTES: &AU16 = transmute_ref!(&NotZerocopy(AU16(0))); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | the trait `AsBytes` is not implemented for `NotZerocopy` - | required by a bound introduced by this call - | - = help: the following other types implement trait `AsBytes`: - bool - char - isize - i8 - i16 - i32 - i64 - i128 - and $N others -note: required by a bound in `AssertIsAsBytes` - --> tests/ui-stable/transmute-ref-src-not-asbytes.rs:18:33 - | -18 | const SRC_NOT_AS_BYTES: &AU16 = transmute_ref!(&NotZerocopy(AU16(0))); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertIsAsBytes` - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the trait bound `NotZerocopy: AsBytes` is not satisfied - --> tests/ui-stable/transmute-ref-src-not-asbytes.rs:18:33 - | -18 | const SRC_NOT_AS_BYTES: &AU16 = transmute_ref!(&NotZerocopy(AU16(0))); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `AsBytes` is not implemented for `NotZerocopy` - | - = help: the following other types implement trait `AsBytes`: - bool - char - isize - i8 - i16 - i32 - i64 - i128 - and $N others -note: required by a bound in `AssertIsAsBytes` - --> tests/ui-stable/transmute-ref-src-not-asbytes.rs:18:33 - | -18 | const SRC_NOT_AS_BYTES: &AU16 = transmute_ref!(&NotZerocopy(AU16(0))); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertIsAsBytes` - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-src-unsized.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-src-unsized.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-src-unsized.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-src-unsized.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,16 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -use zerocopy::transmute_ref; - -fn main() {} - -// `transmute_ref!` does not support transmuting from an unsized source type. -const SRC_UNSIZED: &[u8; 1] = transmute_ref!(&[0u8][..]); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-src-unsized.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-src-unsized.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-src-unsized.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-ref-src-unsized.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,164 +0,0 @@ -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-ref-src-unsized.rs:16:31 - | -16 | const SRC_UNSIZED: &[u8; 1] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | doesn't have a size known at compile-time - | required by a bound introduced by this call - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AssertIsAsBytes` - --> tests/ui-stable/transmute-ref-src-unsized.rs:16:31 - | -16 | const SRC_UNSIZED: &[u8; 1] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertIsAsBytes` - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-ref-src-unsized.rs:16:31 - | -16 | const SRC_UNSIZED: &[u8; 1] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AssertIsAsBytes` - --> tests/ui-stable/transmute-ref-src-unsized.rs:16:31 - | -16 | const SRC_UNSIZED: &[u8; 1] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertIsAsBytes` - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-ref-src-unsized.rs:16:31 - | -16 | const SRC_UNSIZED: &[u8; 1] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` - = note: all local variables must have a statically known size - = help: unsized locals are gated as an unstable feature - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-ref-src-unsized.rs:16:31 - | -16 | const SRC_UNSIZED: &[u8; 1] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | doesn't have a size known at compile-time - | required by a bound introduced by this call - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `transmute` - --> $RUST/core/src/intrinsics.rs - | - | pub fn transmute(src: Src) -> Dst; - | ^^^ required by this bound in `transmute` - = note: this error originates in the macro `$crate::assert_size_eq` which comes from the expansion of the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-ref-src-unsized.rs:16:31 - | -16 | const SRC_UNSIZED: &[u8; 1] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AlignOf::::into_t` - --> src/macro_util.rs - | - | impl AlignOf { - | ^ required by this bound in `AlignOf::::into_t` - | #[inline(never)] // Make `missing_inline_in_public_items` happy. - | pub fn into_t(self) -> T { - | ------ required by a bound in this associated function - = note: this error originates in the macro `$crate::assert_align_gt_eq` which comes from the expansion of the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-ref-src-unsized.rs:16:31 - | -16 | const SRC_UNSIZED: &[u8; 1] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` - = note: the left-hand-side of an assignment must have a statically known size - = note: this error originates in the macro `$crate::assert_align_gt_eq` which comes from the expansion of the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-ref-src-unsized.rs:16:31 - | -16 | const SRC_UNSIZED: &[u8; 1] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AlignOf` - --> src/macro_util.rs - | - | pub struct AlignOf { - | ^ required by this bound in `AlignOf` - = note: this error originates in the macro `$crate::assert_align_gt_eq` which comes from the expansion of the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-ref-src-unsized.rs:16:31 - | -16 | const SRC_UNSIZED: &[u8; 1] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | doesn't have a size known at compile-time - | required by a bound introduced by this call - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `MaxAlignsOf::::new` - --> src/macro_util.rs - | - | impl MaxAlignsOf { - | ^ required by this bound in `MaxAlignsOf::::new` - | #[inline(never)] // Make `missing_inline_in_public_items` happy. - | pub fn new(_t: T, _u: U) -> MaxAlignsOf { - | --- required by a bound in this associated function - = note: this error originates in the macro `$crate::assert_align_gt_eq` which comes from the expansion of the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-ref-src-unsized.rs:16:31 - | -16 | const SRC_UNSIZED: &[u8; 1] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `MaxAlignsOf` - --> src/macro_util.rs - | - | pub union MaxAlignsOf { - | ^ required by this bound in `MaxAlignsOf` - = note: this error originates in the macro `$crate::assert_align_gt_eq` which comes from the expansion of the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-ref-src-unsized.rs:16:31 - | -16 | const SRC_UNSIZED: &[u8; 1] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `AlignOf` - --> src/macro_util.rs - | - | pub struct AlignOf { - | ^ required by this bound in `AlignOf` - = note: this error originates in the macro `$crate::assert_align_gt_eq` which comes from the expansion of the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> tests/ui-stable/transmute-ref-src-unsized.rs:16:31 - | -16 | const SRC_UNSIZED: &[u8; 1] = transmute_ref!(&[0u8][..]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | doesn't have a size known at compile-time - | required by a bound introduced by this call - | - = help: the trait `Sized` is not implemented for `[u8]` -note: required by a bound in `transmute_ref` - --> src/macro_util.rs - | - | pub const unsafe fn transmute_ref<'dst, 'src: 'dst, Src: 'src, Dst: 'dst>( - | ^^^ required by this bound in `transmute_ref` - = note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-size-decrease.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-size-decrease.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-size-decrease.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-size-decrease.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,19 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -include!("../../zerocopy-derive/tests/util.rs"); - -extern crate zerocopy; - -use zerocopy::transmute; - -fn main() {} - -// Although this is not a soundness requirement, we currently require that the -// size of the destination type is not smaller than the size of the source type. -const DECREASE_SIZE: u8 = transmute!(AU16(0)); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-size-decrease.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-size-decrease.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-size-decrease.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-size-decrease.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,9 +0,0 @@ -error[E0512]: cannot transmute between types of different sizes, or dependently-sized types - --> tests/ui-stable/transmute-size-decrease.rs:19:27 - | -19 | const DECREASE_SIZE: u8 = transmute!(AU16(0)); - | ^^^^^^^^^^^^^^^^^^^ - | - = note: source type: `AU16` (16 bits) - = note: target type: `u8` (8 bits) - = note: this error originates in the macro `transmute` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-size-increase.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-size-increase.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-size-increase.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-size-increase.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,19 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -include!("../../zerocopy-derive/tests/util.rs"); - -extern crate zerocopy; - -use zerocopy::transmute; - -fn main() {} - -// `transmute!` does not support transmuting from a smaller type to a larger -// one. -const INCREASE_SIZE: AU16 = transmute!(0u8); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-size-increase.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-size-increase.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-size-increase.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-size-increase.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,9 +0,0 @@ -error[E0512]: cannot transmute between types of different sizes, or dependently-sized types - --> tests/ui-stable/transmute-size-increase.rs:19:29 - | -19 | const INCREASE_SIZE: AU16 = transmute!(0u8); - | ^^^^^^^^^^^^^^^ - | - = note: source type: `u8` (8 bits) - = note: target type: `AU16` (16 bits) - = note: this error originates in the macro `transmute` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-src-not-asbytes.rs temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-src-not-asbytes.rs --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-src-not-asbytes.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-src-not-asbytes.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -// Copyright 2023 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -include!("../../zerocopy-derive/tests/util.rs"); - -extern crate zerocopy; - -use zerocopy::transmute; - -fn main() {} - -// `transmute` requires that the source type implements `AsBytes` -const SRC_NOT_AS_BYTES: AU16 = transmute!(NotZerocopy(AU16(0))); diff -Nru temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-src-not-asbytes.stderr temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-src-not-asbytes.stderr --- temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-src-not-asbytes.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy/tests/ui-stable/transmute-src-not-asbytes.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,48 +0,0 @@ -error[E0277]: the trait bound `NotZerocopy: AsBytes` is not satisfied - --> tests/ui-stable/transmute-src-not-asbytes.rs:18:32 - | -18 | const SRC_NOT_AS_BYTES: AU16 = transmute!(NotZerocopy(AU16(0))); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | the trait `AsBytes` is not implemented for `NotZerocopy` - | required by a bound introduced by this call - | - = help: the following other types implement trait `AsBytes`: - bool - char - isize - i8 - i16 - i32 - i64 - i128 - and $N others -note: required by a bound in `AssertIsAsBytes` - --> tests/ui-stable/transmute-src-not-asbytes.rs:18:32 - | -18 | const SRC_NOT_AS_BYTES: AU16 = transmute!(NotZerocopy(AU16(0))); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertIsAsBytes` - = note: this error originates in the macro `transmute` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the trait bound `NotZerocopy: AsBytes` is not satisfied - --> tests/ui-stable/transmute-src-not-asbytes.rs:18:32 - | -18 | const SRC_NOT_AS_BYTES: AU16 = transmute!(NotZerocopy(AU16(0))); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `AsBytes` is not implemented for `NotZerocopy` - | - = help: the following other types implement trait `AsBytes`: - bool - char - isize - i8 - i16 - i32 - i64 - i128 - and $N others -note: required by a bound in `AssertIsAsBytes` - --> tests/ui-stable/transmute-src-not-asbytes.rs:18:32 - | -18 | const SRC_NOT_AS_BYTES: AU16 = transmute!(NotZerocopy(AU16(0))); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertIsAsBytes` - = note: this error originates in the macro `transmute` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy-derive/.cargo-checksum.json temporalio-1.3.0/vendor/zerocopy-derive/.cargo-checksum.json --- temporalio-1.3.0/vendor/zerocopy-derive/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy-derive/.cargo-checksum.json 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -{"files":{"Cargo.toml":"48f47e613c6e6f87ada8a90f9abaea34e26a19d703587a8df853606a60eff684","LICENSE-APACHE":"9d185ac6703c4b0453974c0d85e9eee43e6941009296bb1f5eb0b54e2329e9f3","LICENSE-BSD":"83c1763356e822adde0a2cae748d938a73fdc263849ccff6b27776dff213bd32","LICENSE-MIT":"1a2f5c12ddc934d58956aa5dbdd3255fe55fd957633ab7d0d39e4f0daa73f7df","src/ext.rs":"d741f6132fca552676b132a38b6431362054aec0c86dcf1c281bca51d5decad2","src/lib.rs":"63696265405341c602cf03f4e27dfa8d7f322be74364facf79aa5193dba180f8","src/repr.rs":"9e2af99cf0f1b4aa8e6922e5ea26295c75d665c5d1df64d5b66e17043c97881f","tests/enum_as_bytes.rs":"2e11daa46c6b922d748321e9a47c3b355e2a9e3b48af95a699c39186b7783711","tests/enum_from_bytes.rs":"cfe02b01ee4929b8964dcb876b2980ef875745fe31bead626597822373b30155","tests/enum_from_zeroes.rs":"32ca3d0dc9085ef8eb9597b5e057ff0b3a0e92b6da44fac3326b2a124010ba4b","tests/enum_known_layout.rs":"b340be92b37fee5d2c6368982eba91b836117f6dd39ca6be3d2d26075de7f815","tests/enum_unaligned.rs":"0c42281098047c6a106c2eae2ee792b893b4f295e8147cf56eaf826888be5fbf","tests/hygiene.rs":"24f6fb3e4f1aa313753d3f16d9285105b836392f9d68de77ea436a9b24443102","tests/paths_and_modules.rs":"4218b6ac5d1aeb2d3b199af5f64eea45ab1117fc135e9d30588ff761e98b0f10","tests/priv_in_pub.rs":"57ff0106151dc34f2e14be90ca73c1c7e6791215683b28fc68abd2deed90fedb","tests/struct_as_bytes.rs":"405f87de554e977481cdc8981f147bf039492d01e0f617072b3f142977588522","tests/struct_from_bytes.rs":"f81f099cd3e36f3b18df7fc92015c6ad1ffa547fbbef34b594bbdec04c020682","tests/struct_from_zeroes.rs":"bbcdfc326061765c3f6684db8dceb82347bb6db5c1f2c2c7f9a2944a7d551cc3","tests/struct_known_layout.rs":"3e940b27b01b81e0b8787de966dc16e34952f0aea0462d6a0c471a61bbf63314","tests/struct_unaligned.rs":"f60ce8de560b997ac9e3a0c7292afc2e951b755ede3604de24f79233e8ad0a29","tests/trybuild.rs":"0954299d2c50d06259a628fa828131e9f0e8953dfcc2cf0d52d6d9ff40c969d5","tests/ui-msrv/derive_transparent.rs":"9f15bf0bf22c8e47c3d645f99239462eae6a875bd469510ad41838d9ae4ed1f8","tests/ui-msrv/derive_transparent.stderr":"b8a66f15647fa8ef3ab5ab371710f36943b42af8f3d2d088509c05f029ad7b8d","tests/ui-msrv/enum.rs":"7eb4f7f912f91c9a040536882b398ac4f07153fd8dbcc49a30603c6eb8107899","tests/ui-msrv/enum.stderr":"321e41c161804d3918fd15214845862c5ca346581e88cf0260073e3c6203cc21","tests/ui-msrv/enum_from_bytes_u8_too_few.rs":"afbec6f24a4bfca472f2929abc5125d8f5b305a0a1b472a1215ad7739ed63100","tests/ui-msrv/enum_from_bytes_u8_too_few.stderr":"a5ab2757166ef9dfa51a09d3dbddd5e9e2b1a46bd3d4b8d175b33a90747878d7","tests/ui-msrv/late_compile_pass.rs":"cb93c4906560957a272b1a73ccbeb650ac846dbfa951e3c1589721919bdeb4cb","tests/ui-msrv/late_compile_pass.stderr":"b146a91530f2125ec62b8ace76b1d8516cf7948678c34e453baac228aeca53bd","tests/ui-msrv/struct.rs":"23c7aa66973ee346e97a342e454c0f67d6799a221f94c2b2708ace44d2a771fc","tests/ui-msrv/struct.stderr":"b946834aac4a1c24ebad849ae8f7bdc6d92de67ab822a6d395264561557f6ff2","tests/ui-msrv/union.rs":"0661431d493e5690653ba0ed076fba14ab03fff81471d572369269aa58bde5a0","tests/ui-msrv/union.stderr":"a75b425e50af3759dfe4d2bf832b4cb650ddbaf6b5c8853aa904be98685f1e53","tests/ui-nightly/derive_transparent.rs":"9f15bf0bf22c8e47c3d645f99239462eae6a875bd469510ad41838d9ae4ed1f8","tests/ui-nightly/derive_transparent.stderr":"8feb1939943dfa984b301d806844fe0d95ea4830690dd636643c80c81d827d46","tests/ui-nightly/enum.rs":"7eb4f7f912f91c9a040536882b398ac4f07153fd8dbcc49a30603c6eb8107899","tests/ui-nightly/enum.stderr":"9b4d965632beb995022209f0f4ca5d875725f33149916a963402b1901e1dbf14","tests/ui-nightly/enum_from_bytes_u16_too_few.rs.disabled":"4fc90a84a19f4f7488ea9b611e3461132629b7564364cd843fa200bc8b4fc48b","tests/ui-nightly/enum_from_bytes_u8_too_few.rs":"afbec6f24a4bfca472f2929abc5125d8f5b305a0a1b472a1215ad7739ed63100","tests/ui-nightly/enum_from_bytes_u8_too_few.stderr":"28a493e1057279ea8e20df49ff0c02dfa132027a86bb6f5fe50e250c14e62572","tests/ui-nightly/late_compile_pass.rs":"cb93c4906560957a272b1a73ccbeb650ac846dbfa951e3c1589721919bdeb4cb","tests/ui-nightly/late_compile_pass.stderr":"fe626f310fd413660cfe71b16cd59b47605a05f55f4047dea92f4f37f2efd4e5","tests/ui-nightly/struct.rs":"23c7aa66973ee346e97a342e454c0f67d6799a221f94c2b2708ace44d2a771fc","tests/ui-nightly/struct.stderr":"d2b085178ab7fd4672740d0eda87f7a6d9ca681da7ee0787daf9117e4514c763","tests/ui-nightly/union.rs":"0661431d493e5690653ba0ed076fba14ab03fff81471d572369269aa58bde5a0","tests/ui-nightly/union.stderr":"98209cdba5ae46d190d66ba9a6c882aff43b5c584cefc156c5fd24db177f377f","tests/ui-stable/derive_transparent.rs":"9f15bf0bf22c8e47c3d645f99239462eae6a875bd469510ad41838d9ae4ed1f8","tests/ui-stable/derive_transparent.stderr":"7563c87d050d46b7b02f175da358ff03415e729af09bfcef048744569068d7fb","tests/ui-stable/enum.rs":"7eb4f7f912f91c9a040536882b398ac4f07153fd8dbcc49a30603c6eb8107899","tests/ui-stable/enum.stderr":"404cc7e69fd8439ff399dae5595c64e25d2f9284a6945bbd49c682e412642537","tests/ui-stable/enum_from_bytes_u8_too_few.rs":"afbec6f24a4bfca472f2929abc5125d8f5b305a0a1b472a1215ad7739ed63100","tests/ui-stable/enum_from_bytes_u8_too_few.stderr":"b3edb381f968f6f2ad9ab4810132df5962b0650460e07f77af818ababf124fe7","tests/ui-stable/late_compile_pass.rs":"cb93c4906560957a272b1a73ccbeb650ac846dbfa951e3c1589721919bdeb4cb","tests/ui-stable/late_compile_pass.stderr":"0e3c70b08a140fe8352d7dda90edf8b64aea4e342766f13549fe9255edbe663f","tests/ui-stable/struct.rs":"23c7aa66973ee346e97a342e454c0f67d6799a221f94c2b2708ace44d2a771fc","tests/ui-stable/struct.stderr":"d134edc83862c733bdf1c1559100a890b93b36872ecd0b9e1abf1108bb77df58","tests/ui-stable/union.rs":"0661431d493e5690653ba0ed076fba14ab03fff81471d572369269aa58bde5a0","tests/ui-stable/union.stderr":"0a2012e5f32634fc3beb033f07b66fc043737623f630f5f957864e72e9dd3ef6","tests/union_as_bytes.rs":"57e69981ed7bb8eebbb2ea2be160532074e32aa4cec6543e9e3af0f5e3767fd8","tests/union_from_bytes.rs":"9c3200a41c6a9a8cdfe1a011daa397bd329c136a18574962f800b3b147a5e3bb","tests/union_from_zeroes.rs":"0571083d5261e630b46ff26d839caa909d083429567b7f88e4967a94f5165148","tests/union_known_layout.rs":"8f4a8216ead6533bae58ed8d04c620aa5741c0ee433e41a5463ab10607c72e34","tests/union_unaligned.rs":"c8a0458226645063805b9653c2148048e7b93b273b93e7959a969f15e167fa57","tests/util.rs":"8d0cfb435e4b154a3702511f3d10331d6b01bcd90f0d70d4a094778813e9e387"},"package":"255c4596d41e6916ced49cfafea18727b24d67878fa180ddfd69b9df34fd1726"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/zerocopy-derive/Cargo.toml temporalio-1.3.0/vendor/zerocopy-derive/Cargo.toml --- temporalio-1.3.0/vendor/zerocopy-derive/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy-derive/Cargo.toml 1970-01-01 00:00:00.000000000 +0000 @@ -1,40 +0,0 @@ -# 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" -rust-version = "1.60.0" -name = "zerocopy-derive" -version = "0.7.20" -authors = ["Joshua Liebow-Feeser "] -exclude = [".*"] -description = "Custom derive for traits from the zerocopy crate" -license = "BSD-2-Clause OR Apache-2.0 OR MIT" -repository = "https://github.com/google/zerocopy" - -[lib] -proc-macro = true - -[dependencies.proc-macro2] -version = "1.0.1" - -[dependencies.quote] -version = "1.0.10" - -[dependencies.syn] -version = "2.0.31" - -[dev-dependencies.static_assertions] -version = "1.1" - -[dev-dependencies.trybuild] -version = "=1.0.85" -features = ["diff"] diff -Nru temporalio-1.3.0/vendor/zerocopy-derive/LICENSE-APACHE temporalio-1.3.0/vendor/zerocopy-derive/LICENSE-APACHE --- temporalio-1.3.0/vendor/zerocopy-derive/LICENSE-APACHE 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy-derive/LICENSE-APACHE 1970-01-01 00:00:00.000000000 +0000 @@ -1,202 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2023 The Fuchsia Authors - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - diff -Nru temporalio-1.3.0/vendor/zerocopy-derive/LICENSE-BSD temporalio-1.3.0/vendor/zerocopy-derive/LICENSE-BSD --- temporalio-1.3.0/vendor/zerocopy-derive/LICENSE-BSD 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy-derive/LICENSE-BSD 1970-01-01 00:00:00.000000000 +0000 @@ -1,24 +0,0 @@ -Copyright 2019 The Fuchsia Authors. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff -Nru temporalio-1.3.0/vendor/zerocopy-derive/LICENSE-MIT temporalio-1.3.0/vendor/zerocopy-derive/LICENSE-MIT --- temporalio-1.3.0/vendor/zerocopy-derive/LICENSE-MIT 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy-derive/LICENSE-MIT 1970-01-01 00:00:00.000000000 +0000 @@ -1,26 +0,0 @@ -Copyright 2023 The Fuchsia Authors - -Permission is hereby granted, free of charge, to any -person obtaining a copy of this software and associated -documentation files (the "Software"), to deal in the -Software without restriction, including without -limitation the rights to use, copy, modify, merge, -publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software -is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice -shall be included in all copies or substantial portions -of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. - diff -Nru temporalio-1.3.0/vendor/zerocopy-derive/src/ext.rs temporalio-1.3.0/vendor/zerocopy-derive/src/ext.rs --- temporalio-1.3.0/vendor/zerocopy-derive/src/ext.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy-derive/src/ext.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,53 +0,0 @@ -// Copyright 2019 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -use syn::{Data, DataEnum, DataStruct, DataUnion, Type}; - -pub trait DataExt { - /// Extract the types of all fields. For enums, extract the types of fields - /// from each variant. - fn field_types(&self) -> Vec<&Type>; -} - -impl DataExt for Data { - fn field_types(&self) -> Vec<&Type> { - match self { - Data::Struct(strc) => strc.field_types(), - Data::Enum(enm) => enm.field_types(), - Data::Union(un) => un.field_types(), - } - } -} - -impl DataExt for DataStruct { - fn field_types(&self) -> Vec<&Type> { - self.fields.iter().map(|f| &f.ty).collect() - } -} - -impl DataExt for DataEnum { - fn field_types(&self) -> Vec<&Type> { - self.variants.iter().flat_map(|var| &var.fields).map(|f| &f.ty).collect() - } -} - -impl DataExt for DataUnion { - fn field_types(&self) -> Vec<&Type> { - self.fields.named.iter().map(|f| &f.ty).collect() - } -} - -pub trait EnumExt { - fn is_c_like(&self) -> bool; -} - -impl EnumExt for DataEnum { - fn is_c_like(&self) -> bool { - self.field_types().is_empty() - } -} diff -Nru temporalio-1.3.0/vendor/zerocopy-derive/src/lib.rs temporalio-1.3.0/vendor/zerocopy-derive/src/lib.rs --- temporalio-1.3.0/vendor/zerocopy-derive/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy-derive/src/lib.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,705 +0,0 @@ -// Copyright 2019 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -//! Derive macros for [zerocopy]'s traits. -//! -//! [zerocopy]: https://docs.rs/zerocopy - -// Sometimes we want to use lints which were added after our MSRV. -// `unknown_lints` is `warn` by default and we deny warnings in CI, so without -// this attribute, any unknown lint would cause a CI failure when testing with -// our MSRV. -#![allow(unknown_lints)] -#![deny(renamed_and_removed_lints)] -#![deny(clippy::all, clippy::missing_safety_doc, clippy::undocumented_unsafe_blocks)] -#![deny( - rustdoc::bare_urls, - rustdoc::broken_intra_doc_links, - rustdoc::invalid_codeblock_attributes, - rustdoc::invalid_html_tags, - rustdoc::invalid_rust_codeblocks, - rustdoc::missing_crate_level_docs, - rustdoc::private_intra_doc_links -)] -#![recursion_limit = "128"] - -mod ext; -mod repr; - -use { - proc_macro2::Span, - quote::quote, - syn::{ - parse_quote, Data, DataEnum, DataStruct, DataUnion, DeriveInput, Error, Expr, ExprLit, - GenericParam, Ident, Lit, - }, -}; - -use {crate::ext::*, crate::repr::*}; - -// TODO(https://github.com/rust-lang/rust/issues/54140): Some errors could be -// made better if we could add multiple lines of error output like this: -// -// error: unsupported representation -// --> enum.rs:28:8 -// | -// 28 | #[repr(transparent)] -// | -// help: required by the derive of FromBytes -// -// Instead, we have more verbose error messages like "unsupported representation -// for deriving FromZeroes, FromBytes, AsBytes, or Unaligned on an enum" -// -// This will probably require Span::error -// (https://doc.rust-lang.org/nightly/proc_macro/struct.Span.html#method.error), -// which is currently unstable. Revisit this once it's stable. - -#[proc_macro_derive(KnownLayout)] -pub fn derive_known_layout(ts: proc_macro::TokenStream) -> proc_macro::TokenStream { - let ast = syn::parse_macro_input!(ts as DeriveInput); - match &ast.data { - Data::Struct(strct) => impl_block(&ast, strct, Trait::KnownLayout, false, None), - Data::Enum(enm) => impl_block(&ast, enm, Trait::KnownLayout, false, None), - Data::Union(unn) => impl_block(&ast, unn, Trait::KnownLayout, false, None), - } - .into() -} - -#[proc_macro_derive(FromZeroes)] -pub fn derive_from_zeroes(ts: proc_macro::TokenStream) -> proc_macro::TokenStream { - let ast = syn::parse_macro_input!(ts as DeriveInput); - match &ast.data { - Data::Struct(strct) => derive_from_zeroes_struct(&ast, strct), - Data::Enum(enm) => derive_from_zeroes_enum(&ast, enm), - Data::Union(unn) => derive_from_zeroes_union(&ast, unn), - } - .into() -} - -#[proc_macro_derive(FromBytes)] -pub fn derive_from_bytes(ts: proc_macro::TokenStream) -> proc_macro::TokenStream { - let ast = syn::parse_macro_input!(ts as DeriveInput); - match &ast.data { - Data::Struct(strct) => derive_from_bytes_struct(&ast, strct), - Data::Enum(enm) => derive_from_bytes_enum(&ast, enm), - Data::Union(unn) => derive_from_bytes_union(&ast, unn), - } - .into() -} - -#[proc_macro_derive(AsBytes)] -pub fn derive_as_bytes(ts: proc_macro::TokenStream) -> proc_macro::TokenStream { - let ast = syn::parse_macro_input!(ts as DeriveInput); - match &ast.data { - Data::Struct(strct) => derive_as_bytes_struct(&ast, strct), - Data::Enum(enm) => derive_as_bytes_enum(&ast, enm), - Data::Union(unn) => derive_as_bytes_union(&ast, unn), - } - .into() -} - -#[proc_macro_derive(Unaligned)] -pub fn derive_unaligned(ts: proc_macro::TokenStream) -> proc_macro::TokenStream { - let ast = syn::parse_macro_input!(ts as DeriveInput); - match &ast.data { - Data::Struct(strct) => derive_unaligned_struct(&ast, strct), - Data::Enum(enm) => derive_unaligned_enum(&ast, enm), - Data::Union(unn) => derive_unaligned_union(&ast, unn), - } - .into() -} - -// Unwraps a `Result<_, Vec>`, converting any `Err` value into a -// `TokenStream` and returning it. -macro_rules! try_or_print { - ($e:expr) => { - match $e { - Ok(x) => x, - Err(errors) => return print_all_errors(errors), - } - }; -} - -const STRUCT_UNION_ALLOWED_REPR_COMBINATIONS: &[&[StructRepr]] = &[ - &[StructRepr::C], - &[StructRepr::Transparent], - &[StructRepr::Packed], - &[StructRepr::C, StructRepr::Packed], -]; - -// A struct is `FromZeroes` if: -// - all fields are `FromZeroes` - -fn derive_from_zeroes_struct(ast: &DeriveInput, strct: &DataStruct) -> proc_macro2::TokenStream { - impl_block(ast, strct, Trait::FromZeroes, true, None) -} - -// An enum is `FromZeroes` if: -// - all of its variants are fieldless -// - one of the variants has a discriminant of `0` - -fn derive_from_zeroes_enum(ast: &DeriveInput, enm: &DataEnum) -> proc_macro2::TokenStream { - if !enm.is_c_like() { - return Error::new_spanned(ast, "only C-like enums can implement FromZeroes") - .to_compile_error(); - } - - let has_explicit_zero_discriminant = - enm.variants.iter().filter_map(|v| v.discriminant.as_ref()).any(|(_, e)| { - if let Expr::Lit(ExprLit { lit: Lit::Int(i), .. }) = e { - i.base10_parse::().ok() == Some(0) - } else { - false - } - }); - // If the first variant of an enum does not specify its discriminant, it is set to zero: - // https://doc.rust-lang.org/reference/items/enumerations.html#custom-discriminant-values-for-fieldless-enumerations - let has_implicit_zero_discriminant = - enm.variants.iter().next().map(|v| v.discriminant.is_none()) == Some(true); - - if !has_explicit_zero_discriminant && !has_implicit_zero_discriminant { - return Error::new_spanned( - ast, - "FromZeroes only supported on enums with a variant that has a discriminant of `0`", - ) - .to_compile_error(); - } - - impl_block(ast, enm, Trait::FromZeroes, true, None) -} - -// Like structs, unions are `FromZeroes` if -// - all fields are `FromZeroes` - -fn derive_from_zeroes_union(ast: &DeriveInput, unn: &DataUnion) -> proc_macro2::TokenStream { - impl_block(ast, unn, Trait::FromZeroes, true, None) -} - -// A struct is `FromBytes` if: -// - all fields are `FromBytes` - -fn derive_from_bytes_struct(ast: &DeriveInput, strct: &DataStruct) -> proc_macro2::TokenStream { - impl_block(ast, strct, Trait::FromBytes, true, None) -} - -// An enum is `FromBytes` if: -// - Every possible bit pattern must be valid, which means that every bit -// pattern must correspond to a different enum variant. Thus, for an enum -// whose layout takes up N bytes, there must be 2^N variants. -// - Since we must know N, only representations which guarantee the layout's -// size are allowed. These are `repr(uN)` and `repr(iN)` (`repr(C)` implies an -// implementation-defined size). `usize` and `isize` technically guarantee the -// layout's size, but would require us to know how large those are on the -// target platform. This isn't terribly difficult - we could emit a const -// expression that could call `core::mem::size_of` in order to determine the -// size and check against the number of enum variants, but a) this would be -// platform-specific and, b) even on Rust's smallest bit width platform (32), -// this would require ~4 billion enum variants, which obviously isn't a thing. - -fn derive_from_bytes_enum(ast: &DeriveInput, enm: &DataEnum) -> proc_macro2::TokenStream { - if !enm.is_c_like() { - return Error::new_spanned(ast, "only C-like enums can implement FromBytes") - .to_compile_error(); - } - - let reprs = try_or_print!(ENUM_FROM_BYTES_CFG.validate_reprs(ast)); - - let variants_required = match reprs.as_slice() { - [EnumRepr::U8] | [EnumRepr::I8] => 1usize << 8, - [EnumRepr::U16] | [EnumRepr::I16] => 1usize << 16, - // `validate_reprs` has already validated that it's one of the preceding - // patterns. - _ => unreachable!(), - }; - if enm.variants.len() != variants_required { - return Error::new_spanned( - ast, - format!( - "FromBytes only supported on {} enum with {} variants", - reprs[0], variants_required - ), - ) - .to_compile_error(); - } - - impl_block(ast, enm, Trait::FromBytes, true, None) -} - -#[rustfmt::skip] -const ENUM_FROM_BYTES_CFG: Config = { - use EnumRepr::*; - Config { - allowed_combinations_message: r#"FromBytes requires repr of "u8", "u16", "i8", or "i16""#, - derive_unaligned: false, - allowed_combinations: &[ - &[U8], - &[U16], - &[I8], - &[I16], - ], - disallowed_but_legal_combinations: &[ - &[C], - &[U32], - &[I32], - &[U64], - &[I64], - &[Usize], - &[Isize], - ], - } -}; - -// Like structs, unions are `FromBytes` if -// - all fields are `FromBytes` - -fn derive_from_bytes_union(ast: &DeriveInput, unn: &DataUnion) -> proc_macro2::TokenStream { - impl_block(ast, unn, Trait::FromBytes, true, None) -} - -// A struct is `AsBytes` if: -// - all fields are `AsBytes` -// - `repr(C)` or `repr(transparent)` and -// - no padding (size of struct equals sum of size of field types) -// - `repr(packed)` - -fn derive_as_bytes_struct(ast: &DeriveInput, strct: &DataStruct) -> proc_macro2::TokenStream { - let reprs = try_or_print!(STRUCT_UNION_AS_BYTES_CFG.validate_reprs(ast)); - let is_transparent = reprs.contains(&StructRepr::Transparent); - let is_packed = reprs.contains(&StructRepr::Packed); - - // TODO(#10): Support type parameters for non-transparent, non-packed - // structs. - if !ast.generics.params.is_empty() && !is_transparent && !is_packed { - return Error::new( - Span::call_site(), - "unsupported on generic structs that are not repr(transparent) or repr(packed)", - ) - .to_compile_error(); - } - - // We don't need a padding check if the struct is repr(transparent) or - // repr(packed). - // - repr(transparent): The layout and ABI of the whole struct is the same - // as its only non-ZST field (meaning there's no padding outside of that - // field) and we require that field to be `AsBytes` (meaning there's no - // padding in that field). - // - repr(packed): Any inter-field padding bytes are removed, meaning that - // any padding bytes would need to come from the fields, all of which - // we require to be `AsBytes` (meaning they don't have any padding). - let padding_check = if is_transparent || is_packed { None } else { Some(PaddingCheck::Struct) }; - impl_block(ast, strct, Trait::AsBytes, true, padding_check) -} - -const STRUCT_UNION_AS_BYTES_CFG: Config = Config { - // Since `disallowed_but_legal_combinations` is empty, this message will - // never actually be emitted. - allowed_combinations_message: r#"AsBytes requires either a) repr "C" or "transparent" with all fields implementing AsBytes or, b) repr "packed""#, - derive_unaligned: false, - allowed_combinations: STRUCT_UNION_ALLOWED_REPR_COMBINATIONS, - disallowed_but_legal_combinations: &[], -}; - -// An enum is `AsBytes` if it is C-like and has a defined repr. - -fn derive_as_bytes_enum(ast: &DeriveInput, enm: &DataEnum) -> proc_macro2::TokenStream { - if !enm.is_c_like() { - return Error::new_spanned(ast, "only C-like enums can implement AsBytes") - .to_compile_error(); - } - - // We don't care what the repr is; we only care that it is one of the - // allowed ones. - let _: Vec = try_or_print!(ENUM_AS_BYTES_CFG.validate_reprs(ast)); - impl_block(ast, enm, Trait::AsBytes, false, None) -} - -#[rustfmt::skip] -const ENUM_AS_BYTES_CFG: Config = { - use EnumRepr::*; - Config { - // Since `disallowed_but_legal_combinations` is empty, this message will - // never actually be emitted. - allowed_combinations_message: r#"AsBytes requires repr of "C", "u8", "u16", "u32", "u64", "usize", "i8", "i16", "i32", "i64", or "isize""#, - derive_unaligned: false, - allowed_combinations: &[ - &[C], - &[U8], - &[U16], - &[I8], - &[I16], - &[U32], - &[I32], - &[U64], - &[I64], - &[Usize], - &[Isize], - ], - disallowed_but_legal_combinations: &[], - } -}; - -// A union is `AsBytes` if: -// - all fields are `AsBytes` -// - `repr(C)`, `repr(transparent)`, or `repr(packed)` -// - no padding (size of union equals size of each field type) - -fn derive_as_bytes_union(ast: &DeriveInput, unn: &DataUnion) -> proc_macro2::TokenStream { - // TODO(#10): Support type parameters. - if !ast.generics.params.is_empty() { - return Error::new(Span::call_site(), "unsupported on types with type parameters") - .to_compile_error(); - } - - try_or_print!(STRUCT_UNION_AS_BYTES_CFG.validate_reprs(ast)); - - impl_block(ast, unn, Trait::AsBytes, true, Some(PaddingCheck::Union)) -} - -// A struct is `Unaligned` if: -// - `repr(align)` is no more than 1 and either -// - `repr(C)` or `repr(transparent)` and -// - all fields `Unaligned` -// - `repr(packed)` - -fn derive_unaligned_struct(ast: &DeriveInput, strct: &DataStruct) -> proc_macro2::TokenStream { - let reprs = try_or_print!(STRUCT_UNION_UNALIGNED_CFG.validate_reprs(ast)); - let require_trait_bounds_on_field_types = !reprs.contains(&StructRepr::Packed); - - impl_block(ast, strct, Trait::Unaligned, require_trait_bounds_on_field_types, None) -} - -const STRUCT_UNION_UNALIGNED_CFG: Config = Config { - // Since `disallowed_but_legal_combinations` is empty, this message will - // never actually be emitted. - allowed_combinations_message: r#"Unaligned requires either a) repr "C" or "transparent" with all fields implementing Unaligned or, b) repr "packed""#, - derive_unaligned: true, - allowed_combinations: STRUCT_UNION_ALLOWED_REPR_COMBINATIONS, - disallowed_but_legal_combinations: &[], -}; - -// An enum is `Unaligned` if: -// - No `repr(align(N > 1))` -// - `repr(u8)` or `repr(i8)` - -fn derive_unaligned_enum(ast: &DeriveInput, enm: &DataEnum) -> proc_macro2::TokenStream { - if !enm.is_c_like() { - return Error::new_spanned(ast, "only C-like enums can implement Unaligned") - .to_compile_error(); - } - - // The only valid reprs are `u8` and `i8`, and optionally `align(1)`. We - // don't actually care what the reprs are so long as they satisfy that - // requirement. - let _: Vec = try_or_print!(ENUM_UNALIGNED_CFG.validate_reprs(ast)); - - // C-like enums cannot currently have type parameters, so this value of true - // for `require_trait_bound_on_field_types` doesn't really do anything. But - // it's marginally more future-proof in case that restriction is lifted in - // the future. - impl_block(ast, enm, Trait::Unaligned, true, None) -} - -#[rustfmt::skip] -const ENUM_UNALIGNED_CFG: Config = { - use EnumRepr::*; - Config { - allowed_combinations_message: - r#"Unaligned requires repr of "u8" or "i8", and no alignment (i.e., repr(align(N > 1)))"#, - derive_unaligned: true, - allowed_combinations: &[ - &[U8], - &[I8], - ], - disallowed_but_legal_combinations: &[ - &[C], - &[U16], - &[U32], - &[U64], - &[Usize], - &[I16], - &[I32], - &[I64], - &[Isize], - ], - } -}; - -// Like structs, a union is `Unaligned` if: -// - `repr(align)` is no more than 1 and either -// - `repr(C)` or `repr(transparent)` and -// - all fields `Unaligned` -// - `repr(packed)` - -fn derive_unaligned_union(ast: &DeriveInput, unn: &DataUnion) -> proc_macro2::TokenStream { - let reprs = try_or_print!(STRUCT_UNION_UNALIGNED_CFG.validate_reprs(ast)); - let require_trait_bound_on_field_types = !reprs.contains(&StructRepr::Packed); - - impl_block(ast, unn, Trait::Unaligned, require_trait_bound_on_field_types, None) -} - -// This enum describes what kind of padding check needs to be generated for the -// associated impl. -enum PaddingCheck { - // Check that the sum of the fields' sizes exactly equals the struct's size. - Struct, - // Check that the size of each field exactly equals the union's size. - Union, -} - -impl PaddingCheck { - /// Returns the ident of the macro to call in order to validate that a type - /// passes the padding check encoded by `PaddingCheck`. - fn validator_macro_ident(&self) -> Ident { - let s = match self { - PaddingCheck::Struct => "struct_has_padding", - PaddingCheck::Union => "union_has_padding", - }; - - Ident::new(s, Span::call_site()) - } -} - -#[derive(Debug, Eq, PartialEq)] -enum Trait { - KnownLayout, - FromZeroes, - FromBytes, - AsBytes, - Unaligned, -} - -impl Trait { - fn ident(&self) -> Ident { - Ident::new(format!("{:?}", self).as_str(), Span::call_site()) - } -} - -fn impl_block( - input: &DeriveInput, - data: &D, - trt: Trait, - require_trait_bound_on_field_types: bool, - padding_check: Option, -) -> proc_macro2::TokenStream { - // In this documentation, we will refer to this hypothetical struct: - // - // #[derive(FromBytes)] - // struct Foo - // where - // T: Copy, - // I: Clone, - // I::Item: Clone, - // { - // a: u8, - // b: T, - // c: I::Item, - // } - // - // We extract the field types, which in this case are `u8`, `T`, and - // `I::Item`. We re-use the existing parameters and where clauses. If - // `require_trait_bound == true` (as it is for `FromBytes), we add where - // bounds for each field's type: - // - // impl FromBytes for Foo - // where - // T: Copy, - // I: Clone, - // I::Item: Clone, - // T: FromBytes, - // I::Item: FromBytes, - // { - // } - // - // NOTE: It is standard practice to only emit bounds for the type parameters - // themselves, not for field types based on those parameters (e.g., `T` vs - // `T::Foo`). For a discussion of why this is standard practice, see - // https://github.com/rust-lang/rust/issues/26925. - // - // The reason we diverge from this standard is that doing it that way for us - // would be unsound. E.g., consider a type, `T` where `T: FromBytes` but - // `T::Foo: !FromBytes`. It would not be sound for us to accept a type with - // a `T::Foo` field as `FromBytes` simply because `T: FromBytes`. - // - // While there's no getting around this requirement for us, it does have the - // pretty serious downside that, when lifetimes are involved, the trait - // solver ties itself in knots: - // - // #[derive(Unaligned)] - // #[repr(C)] - // struct Dup<'a, 'b> { - // a: PhantomData<&'a u8>, - // b: PhantomData<&'b u8>, - // } - // - // error[E0283]: type annotations required: cannot resolve `core::marker::PhantomData<&'a u8>: zerocopy::Unaligned` - // --> src/main.rs:6:10 - // | - // 6 | #[derive(Unaligned)] - // | ^^^^^^^^^ - // | - // = note: required by `zerocopy::Unaligned` - - let type_ident = &input.ident; - let trait_ident = trt.ident(); - let field_types = data.field_types(); - - let field_type_bounds = require_trait_bound_on_field_types - .then(|| field_types.iter().map(|ty| parse_quote!(#ty: zerocopy::#trait_ident))) - .into_iter() - .flatten() - .collect::>(); - - // Don't bother emitting a padding check if there are no fields. - #[allow(unstable_name_collisions)] // See `BoolExt` below - let padding_check_bound = padding_check.and_then(|check| (!field_types.is_empty()).then_some(check)).map(|check| { - let fields = field_types.iter(); - let validator_macro = check.validator_macro_ident(); - parse_quote!( - zerocopy::macro_util::HasPadding<#type_ident, {zerocopy::#validator_macro!(#type_ident, #(#fields),*)}>: - zerocopy::macro_util::ShouldBe - ) - }); - - let bounds = input - .generics - .where_clause - .as_ref() - .map(|where_clause| where_clause.predicates.iter()) - .into_iter() - .flatten() - .chain(field_type_bounds.iter()) - .chain(padding_check_bound.iter()); - - let layout_extras = if trt == Trait::KnownLayout { - // We currently only support deriving for sized types; this code will - // fail to compile for unsized types. - Some(quote!( - const LAYOUT: zerocopy::DstLayout = zerocopy::DstLayout::for_type::(); - - // SAFETY: `.cast` preserves address and provenance. - // - // TODO(#429): Add documentation to `.cast` that promises that - // it preserves provenance. - #[inline(always)] - fn raw_from_ptr_len( - bytes: ::core::ptr::NonNull, - _elems: usize, - ) -> ::core::ptr::NonNull { - bytes.cast::() - } - )) - } else { - None - }; - - // The parameters with trait bounds, but without type defaults. - let params = input.generics.params.clone().into_iter().map(|mut param| { - match &mut param { - GenericParam::Type(ty) => ty.default = None, - GenericParam::Const(cnst) => cnst.default = None, - GenericParam::Lifetime(_) => {} - } - quote!(#param) - }); - // The identifiers of the parameters without trait bounds or type defaults. - let param_idents = input.generics.params.iter().map(|param| match param { - GenericParam::Type(ty) => { - let ident = &ty.ident; - quote!(#ident) - } - GenericParam::Lifetime(l) => quote!(#l), - GenericParam::Const(cnst) => quote!(#cnst), - }); - - quote! { - // TODO(#553): Add a test that generates a warning when - // `#[allow(deprecated)]` isn't present. - #[allow(deprecated)] - unsafe impl < #(#params),* > zerocopy::#trait_ident for #type_ident < #(#param_idents),* > - where - #(#bounds,)* - { - fn only_derive_is_allowed_to_implement_this_trait() {} - - #layout_extras - } - } -} - -fn print_all_errors(errors: Vec) -> proc_macro2::TokenStream { - errors.iter().map(Error::to_compile_error).collect() -} - -// A polyfill for `Option::then_some`, which was added after our MSRV. -// -// TODO(#67): Remove this once our MSRV is >= 1.62. -trait BoolExt { - fn then_some(self, t: T) -> Option; -} - -impl BoolExt for bool { - fn then_some(self, t: T) -> Option { - if self { - Some(t) - } else { - None - } - } -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn test_config_repr_orderings() { - // Validate that the repr lists in the various configs are in the - // canonical order. If they aren't, then our algorithm to look up in - // those lists won't work. - - // TODO(https://github.com/rust-lang/rust/issues/53485): Remove once - // `Vec::is_sorted` is stabilized. - fn is_sorted_and_deduped(ts: &[T]) -> bool { - let mut sorted = ts.to_vec(); - sorted.sort(); - sorted.dedup(); - ts == sorted.as_slice() - } - - fn elements_are_sorted_and_deduped(lists: &[&[T]]) -> bool { - lists.iter().all(|list| is_sorted_and_deduped(list)) - } - - fn config_is_sorted(config: &Config) -> bool { - elements_are_sorted_and_deduped(config.allowed_combinations) - && elements_are_sorted_and_deduped(config.disallowed_but_legal_combinations) - } - - assert!(config_is_sorted(&STRUCT_UNION_UNALIGNED_CFG)); - assert!(config_is_sorted(&ENUM_FROM_BYTES_CFG)); - assert!(config_is_sorted(&ENUM_UNALIGNED_CFG)); - } - - #[test] - fn test_config_repr_no_overlap() { - // Validate that no set of reprs appears in both the - // `allowed_combinations` and `disallowed_but_legal_combinations` lists. - - fn overlap(a: &[T], b: &[T]) -> bool { - a.iter().any(|elem| b.contains(elem)) - } - - fn config_overlaps(config: &Config) -> bool { - overlap(config.allowed_combinations, config.disallowed_but_legal_combinations) - } - - assert!(!config_overlaps(&STRUCT_UNION_UNALIGNED_CFG)); - assert!(!config_overlaps(&ENUM_FROM_BYTES_CFG)); - assert!(!config_overlaps(&ENUM_UNALIGNED_CFG)); - } -} diff -Nru temporalio-1.3.0/vendor/zerocopy-derive/src/repr.rs temporalio-1.3.0/vendor/zerocopy-derive/src/repr.rs --- temporalio-1.3.0/vendor/zerocopy-derive/src/repr.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy-derive/src/repr.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,286 +0,0 @@ -// Copyright 2019 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -use core::fmt::{self, Display, Formatter}; - -use { - proc_macro2::Span, - syn::punctuated::Punctuated, - syn::spanned::Spanned, - syn::token::Comma, - syn::{Attribute, DeriveInput, Error, LitInt, Meta}, -}; - -pub struct Config { - // A human-readable message describing what combinations of representations - // are allowed. This will be printed to the user if they use an invalid - // combination. - pub allowed_combinations_message: &'static str, - // Whether we're checking as part of `derive(Unaligned)`. If not, we can - // ignore `repr(align)`, which makes the code (and the list of valid repr - // combinations we have to enumerate) somewhat simpler. If we're checking - // for `Unaligned`, then in addition to checking against illegal - // combinations, we also check to see if there exists a `repr(align(N > 1))` - // attribute. - pub derive_unaligned: bool, - // Combinations which are valid for the trait. - pub allowed_combinations: &'static [&'static [Repr]], - // Combinations which are not valid for the trait, but are legal according - // to Rust. Any combination not in this or `allowed_combinations` is either - // illegal according to Rust or the behavior is unspecified. If the behavior - // is unspecified, it might become specified in the future, and that - // specification might not play nicely with our requirements. Thus, we - // reject combinations with unspecified behavior in addition to illegal - // combinations. - pub disallowed_but_legal_combinations: &'static [&'static [Repr]], -} - -impl Config { - /// Validate that `input`'s representation attributes conform to the - /// requirements specified by this `Config`. - /// - /// `validate_reprs` extracts the `repr` attributes, validates that they - /// conform to the requirements of `self`, and returns them. Regardless of - /// whether `align` attributes are considered during validation, they are - /// stripped out of the returned value since no callers care about them. - pub fn validate_reprs(&self, input: &DeriveInput) -> Result, Vec> { - let mut metas_reprs = reprs(&input.attrs)?; - metas_reprs.sort_by(|a: &(_, R), b| a.1.partial_cmp(&b.1).unwrap()); - - if self.derive_unaligned { - if let Some((meta, _)) = - metas_reprs.iter().find(|&repr: &&(_, R)| repr.1.is_align_gt_one()) - { - return Err(vec![Error::new_spanned( - meta, - "cannot derive Unaligned with repr(align(N > 1))", - )]); - } - } - - let mut metas = Vec::new(); - let mut reprs = Vec::new(); - metas_reprs.into_iter().filter(|(_, repr)| !repr.is_align()).for_each(|(meta, repr)| { - metas.push(meta); - reprs.push(repr) - }); - - if reprs.is_empty() { - // Use `Span::call_site` to report this error on the - // `#[derive(...)]` itself. - return Err(vec![Error::new(Span::call_site(), "must have a non-align #[repr(...)] attribute in order to guarantee this type's memory layout")]); - } - - let initial_sp = metas[0].span(); - let err_span = metas.iter().skip(1).try_fold(initial_sp, |sp, meta| sp.join(meta.span())); - - if self.allowed_combinations.contains(&reprs.as_slice()) { - Ok(reprs) - } else if self.disallowed_but_legal_combinations.contains(&reprs.as_slice()) { - Err(vec![Error::new( - err_span.unwrap_or_else(|| input.span()), - self.allowed_combinations_message, - )]) - } else { - Err(vec![Error::new( - err_span.unwrap_or_else(|| input.span()), - "conflicting representation hints", - )]) - } - } -} - -// The type of valid reprs for a particular kind (enum, struct, union). -pub trait KindRepr: 'static + Sized + Ord { - fn is_align(&self) -> bool; - fn is_align_gt_one(&self) -> bool; - fn parse(meta: &Meta) -> syn::Result; -} - -// Defines an enum for reprs which are valid for a given kind (structs, enums, -// etc), and provide implementations of `KindRepr`, `Ord`, and `Display`, and -// those traits' super-traits. -macro_rules! define_kind_specific_repr { - ($type_name:expr, $repr_name:ident, $($repr_variant:ident),*) => { - #[derive(Copy, Clone, Debug, Eq, PartialEq)] - pub enum $repr_name { - $($repr_variant,)* - Align(u64), - } - - impl KindRepr for $repr_name { - fn is_align(&self) -> bool { - match self { - $repr_name::Align(_) => true, - _ => false, - } - } - - fn is_align_gt_one(&self) -> bool { - match self { - $repr_name::Align(n) => n > &1, - _ => false, - } - } - - fn parse(meta: &Meta) -> syn::Result<$repr_name> { - match Repr::from_meta(meta)? { - $(Repr::$repr_variant => Ok($repr_name::$repr_variant),)* - Repr::Align(u) => Ok($repr_name::Align(u)), - _ => Err(Error::new_spanned(meta, concat!("unsupported representation for deriving FromBytes, AsBytes, or Unaligned on ", $type_name))) - } - } - } - - // Define a stable ordering so we can canonicalize lists of reprs. The - // ordering itself doesn't matter so long as it's stable. - impl PartialOrd for $repr_name { - fn partial_cmp(&self, other: &Self) -> Option { - Some(self.cmp(other)) - } - } - - impl Ord for $repr_name { - fn cmp(&self, other: &Self) -> core::cmp::Ordering { - format!("{:?}", self).cmp(&format!("{:?}", other)) - } - } - - impl core::fmt::Display for $repr_name { - fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { - match self { - $($repr_name::$repr_variant => Repr::$repr_variant,)* - $repr_name::Align(u) => Repr::Align(*u), - }.fmt(f) - } - } - } -} - -define_kind_specific_repr!("a struct", StructRepr, C, Transparent, Packed); -define_kind_specific_repr!( - "an enum", EnumRepr, C, U8, U16, U32, U64, Usize, I8, I16, I32, I64, Isize -); - -// All representations known to Rust. -#[derive(Copy, Clone, Eq, PartialEq)] -pub enum Repr { - U8, - U16, - U32, - U64, - Usize, - I8, - I16, - I32, - I64, - Isize, - C, - Transparent, - Packed, - Align(u64), -} - -impl Repr { - fn from_meta(meta: &Meta) -> Result { - match meta { - Meta::Path(path) => { - let ident = path - .get_ident() - .ok_or_else(|| Error::new_spanned(meta, "unrecognized representation hint"))?; - match format!("{}", ident).as_str() { - "u8" => return Ok(Repr::U8), - "u16" => return Ok(Repr::U16), - "u32" => return Ok(Repr::U32), - "u64" => return Ok(Repr::U64), - "usize" => return Ok(Repr::Usize), - "i8" => return Ok(Repr::I8), - "i16" => return Ok(Repr::I16), - "i32" => return Ok(Repr::I32), - "i64" => return Ok(Repr::I64), - "isize" => return Ok(Repr::Isize), - "C" => return Ok(Repr::C), - "transparent" => return Ok(Repr::Transparent), - "packed" => return Ok(Repr::Packed), - _ => {} - } - } - Meta::List(list) => { - return Ok(Repr::Align(list.parse_args::()?.base10_parse::()?)) - } - _ => {} - } - - Err(Error::new_spanned(meta, "unrecognized representation hint")) - } -} - -impl Display for Repr { - fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), fmt::Error> { - if let Repr::Align(n) = self { - return write!(f, "repr(align({}))", n); - } - write!( - f, - "repr({})", - match self { - Repr::U8 => "u8", - Repr::U16 => "u16", - Repr::U32 => "u32", - Repr::U64 => "u64", - Repr::Usize => "usize", - Repr::I8 => "i8", - Repr::I16 => "i16", - Repr::I32 => "i32", - Repr::I64 => "i64", - Repr::Isize => "isize", - Repr::C => "C", - Repr::Transparent => "transparent", - Repr::Packed => "packed", - _ => unreachable!(), - } - ) - } -} - -fn reprs(attrs: &[Attribute]) -> Result, Vec> { - let mut reprs = Vec::new(); - let mut errors = Vec::new(); - for attr in attrs { - // Ignore documentation attributes. - if attr.path().is_ident("doc") { - continue; - } - if let Meta::List(ref meta_list) = attr.meta { - if meta_list.path.is_ident("repr") { - let parsed: Punctuated = - match meta_list.parse_args_with(Punctuated::parse_terminated) { - Ok(parsed) => parsed, - Err(_) => { - errors.push(Error::new_spanned( - &meta_list.tokens, - "unrecognized representation hint", - )); - continue; - } - }; - for meta in parsed { - match R::parse(&meta) { - Ok(repr) => reprs.push((meta, repr)), - Err(err) => errors.push(err), - } - } - } - } - } - - if !errors.is_empty() { - return Err(errors); - } - Ok(reprs) -} diff -Nru temporalio-1.3.0/vendor/zerocopy-derive/tests/enum_as_bytes.rs temporalio-1.3.0/vendor/zerocopy-derive/tests/enum_as_bytes.rs --- temporalio-1.3.0/vendor/zerocopy-derive/tests/enum_as_bytes.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy-derive/tests/enum_as_bytes.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,101 +0,0 @@ -// Copyright 2019 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -#![allow(warnings)] - -use {static_assertions::assert_impl_all, zerocopy::AsBytes}; - -// An enum is `AsBytes` if if has a defined repr. - -#[derive(AsBytes)] -#[repr(C)] -enum C { - A, -} - -assert_impl_all!(C: AsBytes); - -#[derive(AsBytes)] -#[repr(u8)] -enum U8 { - A, -} - -assert_impl_all!(U8: AsBytes); - -#[derive(AsBytes)] -#[repr(u16)] -enum U16 { - A, -} - -assert_impl_all!(U16: AsBytes); - -#[derive(AsBytes)] -#[repr(u32)] -enum U32 { - A, -} - -assert_impl_all!(U32: AsBytes); - -#[derive(AsBytes)] -#[repr(u64)] -enum U64 { - A, -} - -assert_impl_all!(U64: AsBytes); - -#[derive(AsBytes)] -#[repr(usize)] -enum Usize { - A, -} - -assert_impl_all!(Usize: AsBytes); - -#[derive(AsBytes)] -#[repr(i8)] -enum I8 { - A, -} - -assert_impl_all!(I8: AsBytes); - -#[derive(AsBytes)] -#[repr(i16)] -enum I16 { - A, -} - -assert_impl_all!(I16: AsBytes); - -#[derive(AsBytes)] -#[repr(i32)] -enum I32 { - A, -} - -assert_impl_all!(I32: AsBytes); - -#[derive(AsBytes)] -#[repr(i64)] -enum I64 { - A, -} - -assert_impl_all!(I64: AsBytes); - -#[derive(AsBytes)] -#[repr(isize)] -enum Isize { - A, -} - -assert_impl_all!(Isize: AsBytes); diff -Nru temporalio-1.3.0/vendor/zerocopy-derive/tests/enum_from_bytes.rs temporalio-1.3.0/vendor/zerocopy-derive/tests/enum_from_bytes.rs --- temporalio-1.3.0/vendor/zerocopy-derive/tests/enum_from_bytes.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy-derive/tests/enum_from_bytes.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,132171 +0,0 @@ -// Copyright 2019 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -#![allow(warnings)] - -mod util; - -use { - static_assertions::assert_impl_all, - zerocopy::{FromBytes, FromZeroes}, -}; - -// An enum is `FromBytes` if: -// - `repr(uN)` or `repr(iN)` -// - 2^N variants - -// Summary since it's hard to scan this file quickly: -// - An enum with `repr(u8)` and 256 variants -// - An enum with `repr(i8)` and 256 variants -// - An enum with `repr(u8)`, 256 variants, and `repr(align(2))` -// - An enum with `repr(i8)`, 256 variants, and `repr(align(2))` -// - An enum with `repr(u16)` and 65536 variants -// - An enum with `repr(i16)` and 65536 variants -// -// For the `i8` and `i16` enums, we have to explicitly set the descriminant of -// the first variant whose discriminant needs to be negative (e.g., `FooI8`'s -// `Variant128` has a discriminant of -128) since Rust won't automatically wrap -// a signed discriminant around without you explicitly telling it to. - -#[derive(FromZeroes, FromBytes)] -#[repr(u8)] -enum FooU8 { - Variant0, - Variant1, - Variant2, - Variant3, - Variant4, - Variant5, - Variant6, - Variant7, - Variant8, - Variant9, - Variant10, - Variant11, - Variant12, - Variant13, - Variant14, - Variant15, - Variant16, - Variant17, - Variant18, - Variant19, - Variant20, - Variant21, - Variant22, - Variant23, - Variant24, - Variant25, - Variant26, - Variant27, - Variant28, - Variant29, - Variant30, - Variant31, - Variant32, - Variant33, - Variant34, - Variant35, - Variant36, - Variant37, - Variant38, - Variant39, - Variant40, - Variant41, - Variant42, - Variant43, - Variant44, - Variant45, - Variant46, - Variant47, - Variant48, - Variant49, - Variant50, - Variant51, - Variant52, - Variant53, - Variant54, - Variant55, - Variant56, - Variant57, - Variant58, - Variant59, - Variant60, - Variant61, - Variant62, - Variant63, - Variant64, - Variant65, - Variant66, - Variant67, - Variant68, - Variant69, - Variant70, - Variant71, - Variant72, - Variant73, - Variant74, - Variant75, - Variant76, - Variant77, - Variant78, - Variant79, - Variant80, - Variant81, - Variant82, - Variant83, - Variant84, - Variant85, - Variant86, - Variant87, - Variant88, - Variant89, - Variant90, - Variant91, - Variant92, - Variant93, - Variant94, - Variant95, - Variant96, - Variant97, - Variant98, - Variant99, - Variant100, - Variant101, - Variant102, - Variant103, - Variant104, - Variant105, - Variant106, - Variant107, - Variant108, - Variant109, - Variant110, - Variant111, - Variant112, - Variant113, - Variant114, - Variant115, - Variant116, - Variant117, - Variant118, - Variant119, - Variant120, - Variant121, - Variant122, - Variant123, - Variant124, - Variant125, - Variant126, - Variant127, - Variant128, - Variant129, - Variant130, - Variant131, - Variant132, - Variant133, - Variant134, - Variant135, - Variant136, - Variant137, - Variant138, - Variant139, - Variant140, - Variant141, - Variant142, - Variant143, - Variant144, - Variant145, - Variant146, - Variant147, - Variant148, - Variant149, - Variant150, - Variant151, - Variant152, - Variant153, - Variant154, - Variant155, - Variant156, - Variant157, - Variant158, - Variant159, - Variant160, - Variant161, - Variant162, - Variant163, - Variant164, - Variant165, - Variant166, - Variant167, - Variant168, - Variant169, - Variant170, - Variant171, - Variant172, - Variant173, - Variant174, - Variant175, - Variant176, - Variant177, - Variant178, - Variant179, - Variant180, - Variant181, - Variant182, - Variant183, - Variant184, - Variant185, - Variant186, - Variant187, - Variant188, - Variant189, - Variant190, - Variant191, - Variant192, - Variant193, - Variant194, - Variant195, - Variant196, - Variant197, - Variant198, - Variant199, - Variant200, - Variant201, - Variant202, - Variant203, - Variant204, - Variant205, - Variant206, - Variant207, - Variant208, - Variant209, - Variant210, - Variant211, - Variant212, - Variant213, - Variant214, - Variant215, - Variant216, - Variant217, - Variant218, - Variant219, - Variant220, - Variant221, - Variant222, - Variant223, - Variant224, - Variant225, - Variant226, - Variant227, - Variant228, - Variant229, - Variant230, - Variant231, - Variant232, - Variant233, - Variant234, - Variant235, - Variant236, - Variant237, - Variant238, - Variant239, - Variant240, - Variant241, - Variant242, - Variant243, - Variant244, - Variant245, - Variant246, - Variant247, - Variant248, - Variant249, - Variant250, - Variant251, - Variant252, - Variant253, - Variant254, - Variant255, -} - -assert_impl_all!(FooU8: FromBytes); - -#[derive(FromZeroes, FromBytes)] -#[repr(i8)] -enum FooI8 { - Variant0, - Variant1, - Variant2, - Variant3, - Variant4, - Variant5, - Variant6, - Variant7, - Variant8, - Variant9, - Variant10, - Variant11, - Variant12, - Variant13, - Variant14, - Variant15, - Variant16, - Variant17, - Variant18, - Variant19, - Variant20, - Variant21, - Variant22, - Variant23, - Variant24, - Variant25, - Variant26, - Variant27, - Variant28, - Variant29, - Variant30, - Variant31, - Variant32, - Variant33, - Variant34, - Variant35, - Variant36, - Variant37, - Variant38, - Variant39, - Variant40, - Variant41, - Variant42, - Variant43, - Variant44, - Variant45, - Variant46, - Variant47, - Variant48, - Variant49, - Variant50, - Variant51, - Variant52, - Variant53, - Variant54, - Variant55, - Variant56, - Variant57, - Variant58, - Variant59, - Variant60, - Variant61, - Variant62, - Variant63, - Variant64, - Variant65, - Variant66, - Variant67, - Variant68, - Variant69, - Variant70, - Variant71, - Variant72, - Variant73, - Variant74, - Variant75, - Variant76, - Variant77, - Variant78, - Variant79, - Variant80, - Variant81, - Variant82, - Variant83, - Variant84, - Variant85, - Variant86, - Variant87, - Variant88, - Variant89, - Variant90, - Variant91, - Variant92, - Variant93, - Variant94, - Variant95, - Variant96, - Variant97, - Variant98, - Variant99, - Variant100, - Variant101, - Variant102, - Variant103, - Variant104, - Variant105, - Variant106, - Variant107, - Variant108, - Variant109, - Variant110, - Variant111, - Variant112, - Variant113, - Variant114, - Variant115, - Variant116, - Variant117, - Variant118, - Variant119, - Variant120, - Variant121, - Variant122, - Variant123, - Variant124, - Variant125, - Variant126, - Variant127, - Variant128 = -128i8, - Variant129, - Variant130, - Variant131, - Variant132, - Variant133, - Variant134, - Variant135, - Variant136, - Variant137, - Variant138, - Variant139, - Variant140, - Variant141, - Variant142, - Variant143, - Variant144, - Variant145, - Variant146, - Variant147, - Variant148, - Variant149, - Variant150, - Variant151, - Variant152, - Variant153, - Variant154, - Variant155, - Variant156, - Variant157, - Variant158, - Variant159, - Variant160, - Variant161, - Variant162, - Variant163, - Variant164, - Variant165, - Variant166, - Variant167, - Variant168, - Variant169, - Variant170, - Variant171, - Variant172, - Variant173, - Variant174, - Variant175, - Variant176, - Variant177, - Variant178, - Variant179, - Variant180, - Variant181, - Variant182, - Variant183, - Variant184, - Variant185, - Variant186, - Variant187, - Variant188, - Variant189, - Variant190, - Variant191, - Variant192, - Variant193, - Variant194, - Variant195, - Variant196, - Variant197, - Variant198, - Variant199, - Variant200, - Variant201, - Variant202, - Variant203, - Variant204, - Variant205, - Variant206, - Variant207, - Variant208, - Variant209, - Variant210, - Variant211, - Variant212, - Variant213, - Variant214, - Variant215, - Variant216, - Variant217, - Variant218, - Variant219, - Variant220, - Variant221, - Variant222, - Variant223, - Variant224, - Variant225, - Variant226, - Variant227, - Variant228, - Variant229, - Variant230, - Variant231, - Variant232, - Variant233, - Variant234, - Variant235, - Variant236, - Variant237, - Variant238, - Variant239, - Variant240, - Variant241, - Variant242, - Variant243, - Variant244, - Variant245, - Variant246, - Variant247, - Variant248, - Variant249, - Variant250, - Variant251, - Variant252, - Variant253, - Variant254, - Variant255, -} - -assert_impl_all!(FooI8: FromBytes); - -#[derive(FromZeroes, FromBytes)] -#[repr(u8, align(2))] -enum FooU8Align { - Variant0, - Variant1, - Variant2, - Variant3, - Variant4, - Variant5, - Variant6, - Variant7, - Variant8, - Variant9, - Variant10, - Variant11, - Variant12, - Variant13, - Variant14, - Variant15, - Variant16, - Variant17, - Variant18, - Variant19, - Variant20, - Variant21, - Variant22, - Variant23, - Variant24, - Variant25, - Variant26, - Variant27, - Variant28, - Variant29, - Variant30, - Variant31, - Variant32, - Variant33, - Variant34, - Variant35, - Variant36, - Variant37, - Variant38, - Variant39, - Variant40, - Variant41, - Variant42, - Variant43, - Variant44, - Variant45, - Variant46, - Variant47, - Variant48, - Variant49, - Variant50, - Variant51, - Variant52, - Variant53, - Variant54, - Variant55, - Variant56, - Variant57, - Variant58, - Variant59, - Variant60, - Variant61, - Variant62, - Variant63, - Variant64, - Variant65, - Variant66, - Variant67, - Variant68, - Variant69, - Variant70, - Variant71, - Variant72, - Variant73, - Variant74, - Variant75, - Variant76, - Variant77, - Variant78, - Variant79, - Variant80, - Variant81, - Variant82, - Variant83, - Variant84, - Variant85, - Variant86, - Variant87, - Variant88, - Variant89, - Variant90, - Variant91, - Variant92, - Variant93, - Variant94, - Variant95, - Variant96, - Variant97, - Variant98, - Variant99, - Variant100, - Variant101, - Variant102, - Variant103, - Variant104, - Variant105, - Variant106, - Variant107, - Variant108, - Variant109, - Variant110, - Variant111, - Variant112, - Variant113, - Variant114, - Variant115, - Variant116, - Variant117, - Variant118, - Variant119, - Variant120, - Variant121, - Variant122, - Variant123, - Variant124, - Variant125, - Variant126, - Variant127, - Variant128, - Variant129, - Variant130, - Variant131, - Variant132, - Variant133, - Variant134, - Variant135, - Variant136, - Variant137, - Variant138, - Variant139, - Variant140, - Variant141, - Variant142, - Variant143, - Variant144, - Variant145, - Variant146, - Variant147, - Variant148, - Variant149, - Variant150, - Variant151, - Variant152, - Variant153, - Variant154, - Variant155, - Variant156, - Variant157, - Variant158, - Variant159, - Variant160, - Variant161, - Variant162, - Variant163, - Variant164, - Variant165, - Variant166, - Variant167, - Variant168, - Variant169, - Variant170, - Variant171, - Variant172, - Variant173, - Variant174, - Variant175, - Variant176, - Variant177, - Variant178, - Variant179, - Variant180, - Variant181, - Variant182, - Variant183, - Variant184, - Variant185, - Variant186, - Variant187, - Variant188, - Variant189, - Variant190, - Variant191, - Variant192, - Variant193, - Variant194, - Variant195, - Variant196, - Variant197, - Variant198, - Variant199, - Variant200, - Variant201, - Variant202, - Variant203, - Variant204, - Variant205, - Variant206, - Variant207, - Variant208, - Variant209, - Variant210, - Variant211, - Variant212, - Variant213, - Variant214, - Variant215, - Variant216, - Variant217, - Variant218, - Variant219, - Variant220, - Variant221, - Variant222, - Variant223, - Variant224, - Variant225, - Variant226, - Variant227, - Variant228, - Variant229, - Variant230, - Variant231, - Variant232, - Variant233, - Variant234, - Variant235, - Variant236, - Variant237, - Variant238, - Variant239, - Variant240, - Variant241, - Variant242, - Variant243, - Variant244, - Variant245, - Variant246, - Variant247, - Variant248, - Variant249, - Variant250, - Variant251, - Variant252, - Variant253, - Variant254, - Variant255, -} - -assert_impl_all!(FooU8Align: FromBytes); - -#[derive(FromZeroes, FromBytes)] -#[repr(i8, align(2))] -enum FooI8Align { - Variant0, - Variant1, - Variant2, - Variant3, - Variant4, - Variant5, - Variant6, - Variant7, - Variant8, - Variant9, - Variant10, - Variant11, - Variant12, - Variant13, - Variant14, - Variant15, - Variant16, - Variant17, - Variant18, - Variant19, - Variant20, - Variant21, - Variant22, - Variant23, - Variant24, - Variant25, - Variant26, - Variant27, - Variant28, - Variant29, - Variant30, - Variant31, - Variant32, - Variant33, - Variant34, - Variant35, - Variant36, - Variant37, - Variant38, - Variant39, - Variant40, - Variant41, - Variant42, - Variant43, - Variant44, - Variant45, - Variant46, - Variant47, - Variant48, - Variant49, - Variant50, - Variant51, - Variant52, - Variant53, - Variant54, - Variant55, - Variant56, - Variant57, - Variant58, - Variant59, - Variant60, - Variant61, - Variant62, - Variant63, - Variant64, - Variant65, - Variant66, - Variant67, - Variant68, - Variant69, - Variant70, - Variant71, - Variant72, - Variant73, - Variant74, - Variant75, - Variant76, - Variant77, - Variant78, - Variant79, - Variant80, - Variant81, - Variant82, - Variant83, - Variant84, - Variant85, - Variant86, - Variant87, - Variant88, - Variant89, - Variant90, - Variant91, - Variant92, - Variant93, - Variant94, - Variant95, - Variant96, - Variant97, - Variant98, - Variant99, - Variant100, - Variant101, - Variant102, - Variant103, - Variant104, - Variant105, - Variant106, - Variant107, - Variant108, - Variant109, - Variant110, - Variant111, - Variant112, - Variant113, - Variant114, - Variant115, - Variant116, - Variant117, - Variant118, - Variant119, - Variant120, - Variant121, - Variant122, - Variant123, - Variant124, - Variant125, - Variant126, - Variant127, - Variant128 = -128i8, - Variant129, - Variant130, - Variant131, - Variant132, - Variant133, - Variant134, - Variant135, - Variant136, - Variant137, - Variant138, - Variant139, - Variant140, - Variant141, - Variant142, - Variant143, - Variant144, - Variant145, - Variant146, - Variant147, - Variant148, - Variant149, - Variant150, - Variant151, - Variant152, - Variant153, - Variant154, - Variant155, - Variant156, - Variant157, - Variant158, - Variant159, - Variant160, - Variant161, - Variant162, - Variant163, - Variant164, - Variant165, - Variant166, - Variant167, - Variant168, - Variant169, - Variant170, - Variant171, - Variant172, - Variant173, - Variant174, - Variant175, - Variant176, - Variant177, - Variant178, - Variant179, - Variant180, - Variant181, - Variant182, - Variant183, - Variant184, - Variant185, - Variant186, - Variant187, - Variant188, - Variant189, - Variant190, - Variant191, - Variant192, - Variant193, - Variant194, - Variant195, - Variant196, - Variant197, - Variant198, - Variant199, - Variant200, - Variant201, - Variant202, - Variant203, - Variant204, - Variant205, - Variant206, - Variant207, - Variant208, - Variant209, - Variant210, - Variant211, - Variant212, - Variant213, - Variant214, - Variant215, - Variant216, - Variant217, - Variant218, - Variant219, - Variant220, - Variant221, - Variant222, - Variant223, - Variant224, - Variant225, - Variant226, - Variant227, - Variant228, - Variant229, - Variant230, - Variant231, - Variant232, - Variant233, - Variant234, - Variant235, - Variant236, - Variant237, - Variant238, - Variant239, - Variant240, - Variant241, - Variant242, - Variant243, - Variant244, - Variant245, - Variant246, - Variant247, - Variant248, - Variant249, - Variant250, - Variant251, - Variant252, - Variant253, - Variant254, - Variant255, -} - -assert_impl_all!(FooI8Align: FromBytes); - -#[derive(FromZeroes, FromBytes)] -#[repr(u16)] -enum FooU16 { - Variant0, - Variant1, - Variant2, - Variant3, - Variant4, - Variant5, - Variant6, - Variant7, - Variant8, - Variant9, - Variant10, - Variant11, - Variant12, - Variant13, - Variant14, - Variant15, - Variant16, - Variant17, - Variant18, - Variant19, - Variant20, - Variant21, - Variant22, - Variant23, - Variant24, - Variant25, - Variant26, - Variant27, - Variant28, - Variant29, - Variant30, - Variant31, - Variant32, - Variant33, - Variant34, - Variant35, - Variant36, - Variant37, - Variant38, - Variant39, - Variant40, - Variant41, - Variant42, - Variant43, - Variant44, - Variant45, - Variant46, - Variant47, - Variant48, - Variant49, - Variant50, - Variant51, - Variant52, - Variant53, - Variant54, - Variant55, - Variant56, - Variant57, - Variant58, - Variant59, - Variant60, - Variant61, - Variant62, - Variant63, - Variant64, - Variant65, - Variant66, - Variant67, - Variant68, - Variant69, - Variant70, - Variant71, - Variant72, - Variant73, - Variant74, - Variant75, - Variant76, - Variant77, - Variant78, - Variant79, - Variant80, - Variant81, - Variant82, - Variant83, - Variant84, - Variant85, - Variant86, - Variant87, - Variant88, - Variant89, - Variant90, - Variant91, - Variant92, - Variant93, - Variant94, - Variant95, - Variant96, - Variant97, - Variant98, - Variant99, - Variant100, - Variant101, - Variant102, - Variant103, - Variant104, - Variant105, - Variant106, - Variant107, - Variant108, - Variant109, - Variant110, - Variant111, - Variant112, - Variant113, - Variant114, - Variant115, - Variant116, - Variant117, - Variant118, - Variant119, - Variant120, - Variant121, - Variant122, - Variant123, - Variant124, - Variant125, - Variant126, - Variant127, - Variant128, - Variant129, - Variant130, - Variant131, - Variant132, - Variant133, - Variant134, - Variant135, - Variant136, - Variant137, - Variant138, - Variant139, - Variant140, - Variant141, - Variant142, - Variant143, - Variant144, - Variant145, - Variant146, - Variant147, - Variant148, - Variant149, - Variant150, - Variant151, - Variant152, - Variant153, - Variant154, - Variant155, - Variant156, - Variant157, - Variant158, - Variant159, - Variant160, - Variant161, - Variant162, - Variant163, - Variant164, - Variant165, - Variant166, - Variant167, - Variant168, - Variant169, - Variant170, - Variant171, - Variant172, - Variant173, - Variant174, - Variant175, - Variant176, - Variant177, - Variant178, - Variant179, - Variant180, - Variant181, - Variant182, - Variant183, - Variant184, - Variant185, - Variant186, - Variant187, - Variant188, - Variant189, - Variant190, - Variant191, - Variant192, - Variant193, - Variant194, - Variant195, - Variant196, - Variant197, - Variant198, - Variant199, - Variant200, - Variant201, - Variant202, - Variant203, - Variant204, - Variant205, - Variant206, - Variant207, - Variant208, - Variant209, - Variant210, - Variant211, - Variant212, - Variant213, - Variant214, - Variant215, - Variant216, - Variant217, - Variant218, - Variant219, - Variant220, - Variant221, - Variant222, - Variant223, - Variant224, - Variant225, - Variant226, - Variant227, - Variant228, - Variant229, - Variant230, - Variant231, - Variant232, - Variant233, - Variant234, - Variant235, - Variant236, - Variant237, - Variant238, - Variant239, - Variant240, - Variant241, - Variant242, - Variant243, - Variant244, - Variant245, - Variant246, - Variant247, - Variant248, - Variant249, - Variant250, - Variant251, - Variant252, - Variant253, - Variant254, - Variant255, - Variant256, - Variant257, - Variant258, - Variant259, - Variant260, - Variant261, - Variant262, - Variant263, - Variant264, - Variant265, - Variant266, - Variant267, - Variant268, - Variant269, - Variant270, - Variant271, - Variant272, - Variant273, - Variant274, - Variant275, - Variant276, - Variant277, - Variant278, - Variant279, - Variant280, - Variant281, - Variant282, - Variant283, - Variant284, - Variant285, - Variant286, - Variant287, - Variant288, - Variant289, - Variant290, - Variant291, - Variant292, - Variant293, - Variant294, - Variant295, - Variant296, - Variant297, - Variant298, - Variant299, - Variant300, - Variant301, - Variant302, - Variant303, - Variant304, - Variant305, - Variant306, - Variant307, - Variant308, - Variant309, - Variant310, - Variant311, - Variant312, - Variant313, - Variant314, - Variant315, - Variant316, - Variant317, - Variant318, - Variant319, - Variant320, - Variant321, - Variant322, - Variant323, - Variant324, - Variant325, - Variant326, - Variant327, - Variant328, - Variant329, - Variant330, - Variant331, - Variant332, - Variant333, - Variant334, - Variant335, - Variant336, - Variant337, - Variant338, - Variant339, - Variant340, - Variant341, - Variant342, - Variant343, - Variant344, - Variant345, - Variant346, - Variant347, - Variant348, - Variant349, - Variant350, - Variant351, - Variant352, - Variant353, - Variant354, - Variant355, - Variant356, - Variant357, - Variant358, - Variant359, - Variant360, - Variant361, - Variant362, - Variant363, - Variant364, - Variant365, - Variant366, - Variant367, - Variant368, - Variant369, - Variant370, - Variant371, - Variant372, - Variant373, - Variant374, - Variant375, - Variant376, - Variant377, - Variant378, - Variant379, - Variant380, - Variant381, - Variant382, - Variant383, - Variant384, - Variant385, - Variant386, - Variant387, - Variant388, - Variant389, - Variant390, - Variant391, - Variant392, - Variant393, - Variant394, - Variant395, - Variant396, - Variant397, - Variant398, - Variant399, - Variant400, - Variant401, - Variant402, - Variant403, - Variant404, - Variant405, - Variant406, - Variant407, - Variant408, - Variant409, - Variant410, - Variant411, - Variant412, - Variant413, - Variant414, - Variant415, - Variant416, - Variant417, - Variant418, - Variant419, - Variant420, - Variant421, - Variant422, - Variant423, - Variant424, - Variant425, - Variant426, - Variant427, - Variant428, - Variant429, - Variant430, - Variant431, - Variant432, - Variant433, - Variant434, - Variant435, - Variant436, - Variant437, - Variant438, - Variant439, - Variant440, - Variant441, - Variant442, - Variant443, - Variant444, - Variant445, - Variant446, - Variant447, - Variant448, - Variant449, - Variant450, - Variant451, - Variant452, - Variant453, - Variant454, - Variant455, - Variant456, - Variant457, - Variant458, - Variant459, - Variant460, - Variant461, - Variant462, - Variant463, - Variant464, - Variant465, - Variant466, - Variant467, - Variant468, - Variant469, - Variant470, - Variant471, - Variant472, - Variant473, - Variant474, - Variant475, - Variant476, - Variant477, - Variant478, - Variant479, - Variant480, - Variant481, - Variant482, - Variant483, - Variant484, - Variant485, - Variant486, - Variant487, - Variant488, - Variant489, - Variant490, - Variant491, - Variant492, - Variant493, - Variant494, - Variant495, - Variant496, - Variant497, - Variant498, - Variant499, - Variant500, - Variant501, - Variant502, - Variant503, - Variant504, - Variant505, - Variant506, - Variant507, - Variant508, - Variant509, - Variant510, - Variant511, - Variant512, - Variant513, - Variant514, - Variant515, - Variant516, - Variant517, - Variant518, - Variant519, - Variant520, - Variant521, - Variant522, - Variant523, - Variant524, - Variant525, - Variant526, - Variant527, - Variant528, - Variant529, - Variant530, - Variant531, - Variant532, - Variant533, - Variant534, - Variant535, - Variant536, - Variant537, - Variant538, - Variant539, - Variant540, - Variant541, - Variant542, - Variant543, - Variant544, - Variant545, - Variant546, - Variant547, - Variant548, - Variant549, - Variant550, - Variant551, - Variant552, - Variant553, - Variant554, - Variant555, - Variant556, - Variant557, - Variant558, - Variant559, - Variant560, - Variant561, - Variant562, - Variant563, - Variant564, - Variant565, - Variant566, - Variant567, - Variant568, - Variant569, - Variant570, - Variant571, - Variant572, - Variant573, - Variant574, - Variant575, - Variant576, - Variant577, - Variant578, - Variant579, - Variant580, - Variant581, - Variant582, - Variant583, - Variant584, - Variant585, - Variant586, - Variant587, - Variant588, - Variant589, - Variant590, - Variant591, - Variant592, - Variant593, - Variant594, - Variant595, - Variant596, - Variant597, - Variant598, - Variant599, - Variant600, - Variant601, - Variant602, - Variant603, - Variant604, - Variant605, - Variant606, - Variant607, - Variant608, - Variant609, - Variant610, - Variant611, - Variant612, - Variant613, - Variant614, - Variant615, - Variant616, - Variant617, - Variant618, - Variant619, - Variant620, - Variant621, - Variant622, - Variant623, - Variant624, - Variant625, - Variant626, - Variant627, - Variant628, - Variant629, - Variant630, - Variant631, - Variant632, - Variant633, - Variant634, - Variant635, - Variant636, - Variant637, - Variant638, - Variant639, - Variant640, - Variant641, - Variant642, - Variant643, - Variant644, - Variant645, - Variant646, - Variant647, - Variant648, - Variant649, - Variant650, - Variant651, - Variant652, - Variant653, - Variant654, - Variant655, - Variant656, - Variant657, - Variant658, - Variant659, - Variant660, - Variant661, - Variant662, - Variant663, - Variant664, - Variant665, - Variant666, - Variant667, - Variant668, - Variant669, - Variant670, - Variant671, - Variant672, - Variant673, - Variant674, - Variant675, - Variant676, - Variant677, - Variant678, - Variant679, - Variant680, - Variant681, - Variant682, - Variant683, - Variant684, - Variant685, - Variant686, - Variant687, - Variant688, - Variant689, - Variant690, - Variant691, - Variant692, - Variant693, - Variant694, - Variant695, - Variant696, - Variant697, - Variant698, - Variant699, - Variant700, - Variant701, - Variant702, - Variant703, - Variant704, - Variant705, - Variant706, - Variant707, - Variant708, - Variant709, - Variant710, - Variant711, - Variant712, - Variant713, - Variant714, - Variant715, - Variant716, - Variant717, - Variant718, - Variant719, - Variant720, - Variant721, - Variant722, - Variant723, - Variant724, - Variant725, - Variant726, - Variant727, - Variant728, - Variant729, - Variant730, - Variant731, - Variant732, - Variant733, - Variant734, - Variant735, - Variant736, - Variant737, - Variant738, - Variant739, - Variant740, - Variant741, - Variant742, - Variant743, - Variant744, - Variant745, - Variant746, - Variant747, - Variant748, - Variant749, - Variant750, - Variant751, - Variant752, - Variant753, - Variant754, - Variant755, - Variant756, - Variant757, - Variant758, - Variant759, - Variant760, - Variant761, - Variant762, - Variant763, - Variant764, - Variant765, - Variant766, - Variant767, - Variant768, - Variant769, - Variant770, - Variant771, - Variant772, - Variant773, - Variant774, - Variant775, - Variant776, - Variant777, - Variant778, - Variant779, - Variant780, - Variant781, - Variant782, - Variant783, - Variant784, - Variant785, - Variant786, - Variant787, - Variant788, - Variant789, - Variant790, - Variant791, - Variant792, - Variant793, - Variant794, - Variant795, - Variant796, - Variant797, - Variant798, - Variant799, - Variant800, - Variant801, - Variant802, - Variant803, - Variant804, - Variant805, - Variant806, - Variant807, - Variant808, - Variant809, - Variant810, - Variant811, - Variant812, - Variant813, - Variant814, - Variant815, - Variant816, - Variant817, - Variant818, - Variant819, - Variant820, - Variant821, - Variant822, - Variant823, - Variant824, - Variant825, - Variant826, - Variant827, - Variant828, - Variant829, - Variant830, - Variant831, - Variant832, - Variant833, - Variant834, - Variant835, - Variant836, - Variant837, - Variant838, - Variant839, - Variant840, - Variant841, - Variant842, - Variant843, - Variant844, - Variant845, - Variant846, - Variant847, - Variant848, - Variant849, - Variant850, - Variant851, - Variant852, - Variant853, - Variant854, - Variant855, - Variant856, - Variant857, - Variant858, - Variant859, - Variant860, - Variant861, - Variant862, - Variant863, - Variant864, - Variant865, - Variant866, - Variant867, - Variant868, - Variant869, - Variant870, - Variant871, - Variant872, - Variant873, - Variant874, - Variant875, - Variant876, - Variant877, - Variant878, - Variant879, - Variant880, - Variant881, - Variant882, - Variant883, - Variant884, - Variant885, - Variant886, - Variant887, - Variant888, - Variant889, - Variant890, - Variant891, - Variant892, - Variant893, - Variant894, - Variant895, - Variant896, - Variant897, - Variant898, - Variant899, - Variant900, - Variant901, - Variant902, - Variant903, - Variant904, - Variant905, - Variant906, - Variant907, - Variant908, - Variant909, - Variant910, - Variant911, - Variant912, - Variant913, - Variant914, - Variant915, - Variant916, - Variant917, - Variant918, - Variant919, - Variant920, - Variant921, - Variant922, - Variant923, - Variant924, - Variant925, - Variant926, - Variant927, - Variant928, - Variant929, - Variant930, - Variant931, - Variant932, - Variant933, - Variant934, - Variant935, - Variant936, - Variant937, - Variant938, - Variant939, - Variant940, - Variant941, - Variant942, - Variant943, - Variant944, - Variant945, - Variant946, - Variant947, - Variant948, - Variant949, - Variant950, - Variant951, - Variant952, - Variant953, - Variant954, - Variant955, - Variant956, - Variant957, - Variant958, - Variant959, - Variant960, - Variant961, - Variant962, - Variant963, - Variant964, - Variant965, - Variant966, - Variant967, - Variant968, - Variant969, - Variant970, - Variant971, - Variant972, - Variant973, - Variant974, - Variant975, - Variant976, - Variant977, - Variant978, - Variant979, - Variant980, - Variant981, - Variant982, - Variant983, - Variant984, - Variant985, - Variant986, - Variant987, - Variant988, - Variant989, - Variant990, - Variant991, - Variant992, - Variant993, - Variant994, - Variant995, - Variant996, - Variant997, - Variant998, - Variant999, - Variant1000, - Variant1001, - Variant1002, - Variant1003, - Variant1004, - Variant1005, - Variant1006, - Variant1007, - Variant1008, - Variant1009, - Variant1010, - Variant1011, - Variant1012, - Variant1013, - Variant1014, - Variant1015, - Variant1016, - Variant1017, - Variant1018, - Variant1019, - Variant1020, - Variant1021, - Variant1022, - Variant1023, - Variant1024, - Variant1025, - Variant1026, - Variant1027, - Variant1028, - Variant1029, - Variant1030, - Variant1031, - Variant1032, - Variant1033, - Variant1034, - Variant1035, - Variant1036, - Variant1037, - Variant1038, - Variant1039, - Variant1040, - Variant1041, - Variant1042, - Variant1043, - Variant1044, - Variant1045, - Variant1046, - Variant1047, - Variant1048, - Variant1049, - Variant1050, - Variant1051, - Variant1052, - Variant1053, - Variant1054, - Variant1055, - Variant1056, - Variant1057, - Variant1058, - Variant1059, - Variant1060, - Variant1061, - Variant1062, - Variant1063, - Variant1064, - Variant1065, - Variant1066, - Variant1067, - Variant1068, - Variant1069, - Variant1070, - Variant1071, - Variant1072, - Variant1073, - Variant1074, - Variant1075, - Variant1076, - Variant1077, - Variant1078, - Variant1079, - Variant1080, - Variant1081, - Variant1082, - Variant1083, - Variant1084, - Variant1085, - Variant1086, - Variant1087, - Variant1088, - Variant1089, - Variant1090, - Variant1091, - Variant1092, - Variant1093, - Variant1094, - Variant1095, - Variant1096, - Variant1097, - Variant1098, - Variant1099, - Variant1100, - Variant1101, - Variant1102, - Variant1103, - Variant1104, - Variant1105, - Variant1106, - Variant1107, - Variant1108, - Variant1109, - Variant1110, - Variant1111, - Variant1112, - Variant1113, - Variant1114, - Variant1115, - Variant1116, - Variant1117, - Variant1118, - Variant1119, - Variant1120, - Variant1121, - Variant1122, - Variant1123, - Variant1124, - Variant1125, - Variant1126, - Variant1127, - Variant1128, - Variant1129, - Variant1130, - Variant1131, - Variant1132, - Variant1133, - Variant1134, - Variant1135, - Variant1136, - Variant1137, - Variant1138, - Variant1139, - Variant1140, - Variant1141, - Variant1142, - Variant1143, - Variant1144, - Variant1145, - Variant1146, - Variant1147, - Variant1148, - Variant1149, - Variant1150, - Variant1151, - Variant1152, - Variant1153, - Variant1154, - Variant1155, - Variant1156, - Variant1157, - Variant1158, - Variant1159, - Variant1160, - Variant1161, - Variant1162, - Variant1163, - Variant1164, - Variant1165, - Variant1166, - Variant1167, - Variant1168, - Variant1169, - Variant1170, - Variant1171, - Variant1172, - Variant1173, - Variant1174, - Variant1175, - Variant1176, - Variant1177, - Variant1178, - Variant1179, - Variant1180, - Variant1181, - Variant1182, - Variant1183, - Variant1184, - Variant1185, - Variant1186, - Variant1187, - Variant1188, - Variant1189, - Variant1190, - Variant1191, - Variant1192, - Variant1193, - Variant1194, - Variant1195, - Variant1196, - Variant1197, - Variant1198, - Variant1199, - Variant1200, - Variant1201, - Variant1202, - Variant1203, - Variant1204, - Variant1205, - Variant1206, - Variant1207, - Variant1208, - Variant1209, - Variant1210, - Variant1211, - Variant1212, - Variant1213, - Variant1214, - Variant1215, - Variant1216, - Variant1217, - Variant1218, - Variant1219, - Variant1220, - Variant1221, - Variant1222, - Variant1223, - Variant1224, - Variant1225, - Variant1226, - Variant1227, - Variant1228, - Variant1229, - Variant1230, - Variant1231, - Variant1232, - Variant1233, - Variant1234, - Variant1235, - Variant1236, - Variant1237, - Variant1238, - Variant1239, - Variant1240, - Variant1241, - Variant1242, - Variant1243, - Variant1244, - Variant1245, - Variant1246, - Variant1247, - Variant1248, - Variant1249, - Variant1250, - Variant1251, - Variant1252, - Variant1253, - Variant1254, - Variant1255, - Variant1256, - Variant1257, - Variant1258, - Variant1259, - Variant1260, - Variant1261, - Variant1262, - Variant1263, - Variant1264, - Variant1265, - Variant1266, - Variant1267, - Variant1268, - Variant1269, - Variant1270, - Variant1271, - Variant1272, - Variant1273, - Variant1274, - Variant1275, - Variant1276, - Variant1277, - Variant1278, - Variant1279, - Variant1280, - Variant1281, - Variant1282, - Variant1283, - Variant1284, - Variant1285, - Variant1286, - Variant1287, - Variant1288, - Variant1289, - Variant1290, - Variant1291, - Variant1292, - Variant1293, - Variant1294, - Variant1295, - Variant1296, - Variant1297, - Variant1298, - Variant1299, - Variant1300, - Variant1301, - Variant1302, - Variant1303, - Variant1304, - Variant1305, - Variant1306, - Variant1307, - Variant1308, - Variant1309, - Variant1310, - Variant1311, - Variant1312, - Variant1313, - Variant1314, - Variant1315, - Variant1316, - Variant1317, - Variant1318, - Variant1319, - Variant1320, - Variant1321, - Variant1322, - Variant1323, - Variant1324, - Variant1325, - Variant1326, - Variant1327, - Variant1328, - Variant1329, - Variant1330, - Variant1331, - Variant1332, - Variant1333, - Variant1334, - Variant1335, - Variant1336, - Variant1337, - Variant1338, - Variant1339, - Variant1340, - Variant1341, - Variant1342, - Variant1343, - Variant1344, - Variant1345, - Variant1346, - Variant1347, - Variant1348, - Variant1349, - Variant1350, - Variant1351, - Variant1352, - Variant1353, - Variant1354, - Variant1355, - Variant1356, - Variant1357, - Variant1358, - Variant1359, - Variant1360, - Variant1361, - Variant1362, - Variant1363, - Variant1364, - Variant1365, - Variant1366, - Variant1367, - Variant1368, - Variant1369, - Variant1370, - Variant1371, - Variant1372, - Variant1373, - Variant1374, - Variant1375, - Variant1376, - Variant1377, - Variant1378, - Variant1379, - Variant1380, - Variant1381, - Variant1382, - Variant1383, - Variant1384, - Variant1385, - Variant1386, - Variant1387, - Variant1388, - Variant1389, - Variant1390, - Variant1391, - Variant1392, - Variant1393, - Variant1394, - Variant1395, - Variant1396, - Variant1397, - Variant1398, - Variant1399, - Variant1400, - Variant1401, - Variant1402, - Variant1403, - Variant1404, - Variant1405, - Variant1406, - Variant1407, - Variant1408, - Variant1409, - Variant1410, - Variant1411, - Variant1412, - Variant1413, - Variant1414, - Variant1415, - Variant1416, - Variant1417, - Variant1418, - Variant1419, - Variant1420, - Variant1421, - Variant1422, - Variant1423, - Variant1424, - Variant1425, - Variant1426, - Variant1427, - Variant1428, - Variant1429, - Variant1430, - Variant1431, - Variant1432, - Variant1433, - Variant1434, - Variant1435, - Variant1436, - Variant1437, - Variant1438, - Variant1439, - Variant1440, - Variant1441, - Variant1442, - Variant1443, - Variant1444, - Variant1445, - Variant1446, - Variant1447, - Variant1448, - Variant1449, - Variant1450, - Variant1451, - Variant1452, - Variant1453, - Variant1454, - Variant1455, - Variant1456, - Variant1457, - Variant1458, - Variant1459, - Variant1460, - Variant1461, - Variant1462, - Variant1463, - Variant1464, - Variant1465, - Variant1466, - Variant1467, - Variant1468, - Variant1469, - Variant1470, - Variant1471, - Variant1472, - Variant1473, - Variant1474, - Variant1475, - Variant1476, - Variant1477, - Variant1478, - Variant1479, - Variant1480, - Variant1481, - Variant1482, - Variant1483, - Variant1484, - Variant1485, - Variant1486, - Variant1487, - Variant1488, - Variant1489, - Variant1490, - Variant1491, - Variant1492, - Variant1493, - Variant1494, - Variant1495, - Variant1496, - Variant1497, - Variant1498, - Variant1499, - Variant1500, - Variant1501, - Variant1502, - Variant1503, - Variant1504, - Variant1505, - Variant1506, - Variant1507, - Variant1508, - Variant1509, - Variant1510, - Variant1511, - Variant1512, - Variant1513, - Variant1514, - Variant1515, - Variant1516, - Variant1517, - Variant1518, - Variant1519, - Variant1520, - Variant1521, - Variant1522, - Variant1523, - Variant1524, - Variant1525, - Variant1526, - Variant1527, - Variant1528, - Variant1529, - Variant1530, - Variant1531, - Variant1532, - Variant1533, - Variant1534, - Variant1535, - Variant1536, - Variant1537, - Variant1538, - Variant1539, - Variant1540, - Variant1541, - Variant1542, - Variant1543, - Variant1544, - Variant1545, - Variant1546, - Variant1547, - Variant1548, - Variant1549, - Variant1550, - Variant1551, - Variant1552, - Variant1553, - Variant1554, - Variant1555, - Variant1556, - Variant1557, - Variant1558, - Variant1559, - Variant1560, - Variant1561, - Variant1562, - Variant1563, - Variant1564, - Variant1565, - Variant1566, - Variant1567, - Variant1568, - Variant1569, - Variant1570, - Variant1571, - Variant1572, - Variant1573, - Variant1574, - Variant1575, - Variant1576, - Variant1577, - Variant1578, - Variant1579, - Variant1580, - Variant1581, - Variant1582, - Variant1583, - Variant1584, - Variant1585, - Variant1586, - Variant1587, - Variant1588, - Variant1589, - Variant1590, - Variant1591, - Variant1592, - Variant1593, - Variant1594, - Variant1595, - Variant1596, - Variant1597, - Variant1598, - Variant1599, - Variant1600, - Variant1601, - Variant1602, - Variant1603, - Variant1604, - Variant1605, - Variant1606, - Variant1607, - Variant1608, - Variant1609, - Variant1610, - Variant1611, - Variant1612, - Variant1613, - Variant1614, - Variant1615, - Variant1616, - Variant1617, - Variant1618, - Variant1619, - Variant1620, - Variant1621, - Variant1622, - Variant1623, - Variant1624, - Variant1625, - Variant1626, - Variant1627, - Variant1628, - Variant1629, - Variant1630, - Variant1631, - Variant1632, - Variant1633, - Variant1634, - Variant1635, - Variant1636, - Variant1637, - Variant1638, - Variant1639, - Variant1640, - Variant1641, - Variant1642, - Variant1643, - Variant1644, - Variant1645, - Variant1646, - Variant1647, - Variant1648, - Variant1649, - Variant1650, - Variant1651, - Variant1652, - Variant1653, - Variant1654, - Variant1655, - Variant1656, - Variant1657, - Variant1658, - Variant1659, - Variant1660, - Variant1661, - Variant1662, - Variant1663, - Variant1664, - Variant1665, - Variant1666, - Variant1667, - Variant1668, - Variant1669, - Variant1670, - Variant1671, - Variant1672, - Variant1673, - Variant1674, - Variant1675, - Variant1676, - Variant1677, - Variant1678, - Variant1679, - Variant1680, - Variant1681, - Variant1682, - Variant1683, - Variant1684, - Variant1685, - Variant1686, - Variant1687, - Variant1688, - Variant1689, - Variant1690, - Variant1691, - Variant1692, - Variant1693, - Variant1694, - Variant1695, - Variant1696, - Variant1697, - Variant1698, - Variant1699, - Variant1700, - Variant1701, - Variant1702, - Variant1703, - Variant1704, - Variant1705, - Variant1706, - Variant1707, - Variant1708, - Variant1709, - Variant1710, - Variant1711, - Variant1712, - Variant1713, - Variant1714, - Variant1715, - Variant1716, - Variant1717, - Variant1718, - Variant1719, - Variant1720, - Variant1721, - Variant1722, - Variant1723, - Variant1724, - Variant1725, - Variant1726, - Variant1727, - Variant1728, - Variant1729, - Variant1730, - Variant1731, - Variant1732, - Variant1733, - Variant1734, - Variant1735, - Variant1736, - Variant1737, - Variant1738, - Variant1739, - Variant1740, - Variant1741, - Variant1742, - Variant1743, - Variant1744, - Variant1745, - Variant1746, - Variant1747, - Variant1748, - Variant1749, - Variant1750, - Variant1751, - Variant1752, - Variant1753, - Variant1754, - Variant1755, - Variant1756, - Variant1757, - Variant1758, - Variant1759, - Variant1760, - Variant1761, - Variant1762, - Variant1763, - Variant1764, - Variant1765, - Variant1766, - Variant1767, - Variant1768, - Variant1769, - Variant1770, - Variant1771, - Variant1772, - Variant1773, - Variant1774, - Variant1775, - Variant1776, - Variant1777, - Variant1778, - Variant1779, - Variant1780, - Variant1781, - Variant1782, - Variant1783, - Variant1784, - Variant1785, - Variant1786, - Variant1787, - Variant1788, - Variant1789, - Variant1790, - Variant1791, - Variant1792, - Variant1793, - Variant1794, - Variant1795, - Variant1796, - Variant1797, - Variant1798, - Variant1799, - Variant1800, - Variant1801, - Variant1802, - Variant1803, - Variant1804, - Variant1805, - Variant1806, - Variant1807, - Variant1808, - Variant1809, - Variant1810, - Variant1811, - Variant1812, - Variant1813, - Variant1814, - Variant1815, - Variant1816, - Variant1817, - Variant1818, - Variant1819, - Variant1820, - Variant1821, - Variant1822, - Variant1823, - Variant1824, - Variant1825, - Variant1826, - Variant1827, - Variant1828, - Variant1829, - Variant1830, - Variant1831, - Variant1832, - Variant1833, - Variant1834, - Variant1835, - Variant1836, - Variant1837, - Variant1838, - Variant1839, - Variant1840, - Variant1841, - Variant1842, - Variant1843, - Variant1844, - Variant1845, - Variant1846, - Variant1847, - Variant1848, - Variant1849, - Variant1850, - Variant1851, - Variant1852, - Variant1853, - Variant1854, - Variant1855, - Variant1856, - Variant1857, - Variant1858, - Variant1859, - Variant1860, - Variant1861, - Variant1862, - Variant1863, - Variant1864, - Variant1865, - Variant1866, - Variant1867, - Variant1868, - Variant1869, - Variant1870, - Variant1871, - Variant1872, - Variant1873, - Variant1874, - Variant1875, - Variant1876, - Variant1877, - Variant1878, - Variant1879, - Variant1880, - Variant1881, - Variant1882, - Variant1883, - Variant1884, - Variant1885, - Variant1886, - Variant1887, - Variant1888, - Variant1889, - Variant1890, - Variant1891, - Variant1892, - Variant1893, - Variant1894, - Variant1895, - Variant1896, - Variant1897, - Variant1898, - Variant1899, - Variant1900, - Variant1901, - Variant1902, - Variant1903, - Variant1904, - Variant1905, - Variant1906, - Variant1907, - Variant1908, - Variant1909, - Variant1910, - Variant1911, - Variant1912, - Variant1913, - Variant1914, - Variant1915, - Variant1916, - Variant1917, - Variant1918, - Variant1919, - Variant1920, - Variant1921, - Variant1922, - Variant1923, - Variant1924, - Variant1925, - Variant1926, - Variant1927, - Variant1928, - Variant1929, - Variant1930, - Variant1931, - Variant1932, - Variant1933, - Variant1934, - Variant1935, - Variant1936, - Variant1937, - Variant1938, - Variant1939, - Variant1940, - Variant1941, - Variant1942, - Variant1943, - Variant1944, - Variant1945, - Variant1946, - Variant1947, - Variant1948, - Variant1949, - Variant1950, - Variant1951, - Variant1952, - Variant1953, - Variant1954, - Variant1955, - Variant1956, - Variant1957, - Variant1958, - Variant1959, - Variant1960, - Variant1961, - Variant1962, - Variant1963, - Variant1964, - Variant1965, - Variant1966, - Variant1967, - Variant1968, - Variant1969, - Variant1970, - Variant1971, - Variant1972, - Variant1973, - Variant1974, - Variant1975, - Variant1976, - Variant1977, - Variant1978, - Variant1979, - Variant1980, - Variant1981, - Variant1982, - Variant1983, - Variant1984, - Variant1985, - Variant1986, - Variant1987, - Variant1988, - Variant1989, - Variant1990, - Variant1991, - Variant1992, - Variant1993, - Variant1994, - Variant1995, - Variant1996, - Variant1997, - Variant1998, - Variant1999, - Variant2000, - Variant2001, - Variant2002, - Variant2003, - Variant2004, - Variant2005, - Variant2006, - Variant2007, - Variant2008, - Variant2009, - Variant2010, - Variant2011, - Variant2012, - Variant2013, - Variant2014, - Variant2015, - Variant2016, - Variant2017, - Variant2018, - Variant2019, - Variant2020, - Variant2021, - Variant2022, - Variant2023, - Variant2024, - Variant2025, - Variant2026, - Variant2027, - Variant2028, - Variant2029, - Variant2030, - Variant2031, - Variant2032, - Variant2033, - Variant2034, - Variant2035, - Variant2036, - Variant2037, - Variant2038, - Variant2039, - Variant2040, - Variant2041, - Variant2042, - Variant2043, - Variant2044, - Variant2045, - Variant2046, - Variant2047, - Variant2048, - Variant2049, - Variant2050, - Variant2051, - Variant2052, - Variant2053, - Variant2054, - Variant2055, - Variant2056, - Variant2057, - Variant2058, - Variant2059, - Variant2060, - Variant2061, - Variant2062, - Variant2063, - Variant2064, - Variant2065, - Variant2066, - Variant2067, - Variant2068, - Variant2069, - Variant2070, - Variant2071, - Variant2072, - Variant2073, - Variant2074, - Variant2075, - Variant2076, - Variant2077, - Variant2078, - Variant2079, - Variant2080, - Variant2081, - Variant2082, - Variant2083, - Variant2084, - Variant2085, - Variant2086, - Variant2087, - Variant2088, - Variant2089, - Variant2090, - Variant2091, - Variant2092, - Variant2093, - Variant2094, - Variant2095, - Variant2096, - Variant2097, - Variant2098, - Variant2099, - Variant2100, - Variant2101, - Variant2102, - Variant2103, - Variant2104, - Variant2105, - Variant2106, - Variant2107, - Variant2108, - Variant2109, - Variant2110, - Variant2111, - Variant2112, - Variant2113, - Variant2114, - Variant2115, - Variant2116, - Variant2117, - Variant2118, - Variant2119, - Variant2120, - Variant2121, - Variant2122, - Variant2123, - Variant2124, - Variant2125, - Variant2126, - Variant2127, - Variant2128, - Variant2129, - Variant2130, - Variant2131, - Variant2132, - Variant2133, - Variant2134, - Variant2135, - Variant2136, - Variant2137, - Variant2138, - Variant2139, - Variant2140, - Variant2141, - Variant2142, - Variant2143, - Variant2144, - Variant2145, - Variant2146, - Variant2147, - Variant2148, - Variant2149, - Variant2150, - Variant2151, - Variant2152, - Variant2153, - Variant2154, - Variant2155, - Variant2156, - Variant2157, - Variant2158, - Variant2159, - Variant2160, - Variant2161, - Variant2162, - Variant2163, - Variant2164, - Variant2165, - Variant2166, - Variant2167, - Variant2168, - Variant2169, - Variant2170, - Variant2171, - Variant2172, - Variant2173, - Variant2174, - Variant2175, - Variant2176, - Variant2177, - Variant2178, - Variant2179, - Variant2180, - Variant2181, - Variant2182, - Variant2183, - Variant2184, - Variant2185, - Variant2186, - Variant2187, - Variant2188, - Variant2189, - Variant2190, - Variant2191, - Variant2192, - Variant2193, - Variant2194, - Variant2195, - Variant2196, - Variant2197, - Variant2198, - Variant2199, - Variant2200, - Variant2201, - Variant2202, - Variant2203, - Variant2204, - Variant2205, - Variant2206, - Variant2207, - Variant2208, - Variant2209, - Variant2210, - Variant2211, - Variant2212, - Variant2213, - Variant2214, - Variant2215, - Variant2216, - Variant2217, - Variant2218, - Variant2219, - Variant2220, - Variant2221, - Variant2222, - Variant2223, - Variant2224, - Variant2225, - Variant2226, - Variant2227, - Variant2228, - Variant2229, - Variant2230, - Variant2231, - Variant2232, - Variant2233, - Variant2234, - Variant2235, - Variant2236, - Variant2237, - Variant2238, - Variant2239, - Variant2240, - Variant2241, - Variant2242, - Variant2243, - Variant2244, - Variant2245, - Variant2246, - Variant2247, - Variant2248, - Variant2249, - Variant2250, - Variant2251, - Variant2252, - Variant2253, - Variant2254, - Variant2255, - Variant2256, - Variant2257, - Variant2258, - Variant2259, - Variant2260, - Variant2261, - Variant2262, - Variant2263, - Variant2264, - Variant2265, - Variant2266, - Variant2267, - Variant2268, - Variant2269, - Variant2270, - Variant2271, - Variant2272, - Variant2273, - Variant2274, - Variant2275, - Variant2276, - Variant2277, - Variant2278, - Variant2279, - Variant2280, - Variant2281, - Variant2282, - Variant2283, - Variant2284, - Variant2285, - Variant2286, - Variant2287, - Variant2288, - Variant2289, - Variant2290, - Variant2291, - Variant2292, - Variant2293, - Variant2294, - Variant2295, - Variant2296, - Variant2297, - Variant2298, - Variant2299, - Variant2300, - Variant2301, - Variant2302, - Variant2303, - Variant2304, - Variant2305, - Variant2306, - Variant2307, - Variant2308, - Variant2309, - Variant2310, - Variant2311, - Variant2312, - Variant2313, - Variant2314, - Variant2315, - Variant2316, - Variant2317, - Variant2318, - Variant2319, - Variant2320, - Variant2321, - Variant2322, - Variant2323, - Variant2324, - Variant2325, - Variant2326, - Variant2327, - Variant2328, - Variant2329, - Variant2330, - Variant2331, - Variant2332, - Variant2333, - Variant2334, - Variant2335, - Variant2336, - Variant2337, - Variant2338, - Variant2339, - Variant2340, - Variant2341, - Variant2342, - Variant2343, - Variant2344, - Variant2345, - Variant2346, - Variant2347, - Variant2348, - Variant2349, - Variant2350, - Variant2351, - Variant2352, - Variant2353, - Variant2354, - Variant2355, - Variant2356, - Variant2357, - Variant2358, - Variant2359, - Variant2360, - Variant2361, - Variant2362, - Variant2363, - Variant2364, - Variant2365, - Variant2366, - Variant2367, - Variant2368, - Variant2369, - Variant2370, - Variant2371, - Variant2372, - Variant2373, - Variant2374, - Variant2375, - Variant2376, - Variant2377, - Variant2378, - Variant2379, - Variant2380, - Variant2381, - Variant2382, - Variant2383, - Variant2384, - Variant2385, - Variant2386, - Variant2387, - Variant2388, - Variant2389, - Variant2390, - Variant2391, - Variant2392, - Variant2393, - Variant2394, - Variant2395, - Variant2396, - Variant2397, - Variant2398, - Variant2399, - Variant2400, - Variant2401, - Variant2402, - Variant2403, - Variant2404, - Variant2405, - Variant2406, - Variant2407, - Variant2408, - Variant2409, - Variant2410, - Variant2411, - Variant2412, - Variant2413, - Variant2414, - Variant2415, - Variant2416, - Variant2417, - Variant2418, - Variant2419, - Variant2420, - Variant2421, - Variant2422, - Variant2423, - Variant2424, - Variant2425, - Variant2426, - Variant2427, - Variant2428, - Variant2429, - Variant2430, - Variant2431, - Variant2432, - Variant2433, - Variant2434, - Variant2435, - Variant2436, - Variant2437, - Variant2438, - Variant2439, - Variant2440, - Variant2441, - Variant2442, - Variant2443, - Variant2444, - Variant2445, - Variant2446, - Variant2447, - Variant2448, - Variant2449, - Variant2450, - Variant2451, - Variant2452, - Variant2453, - Variant2454, - Variant2455, - Variant2456, - Variant2457, - Variant2458, - Variant2459, - Variant2460, - Variant2461, - Variant2462, - Variant2463, - Variant2464, - Variant2465, - Variant2466, - Variant2467, - Variant2468, - Variant2469, - Variant2470, - Variant2471, - Variant2472, - Variant2473, - Variant2474, - Variant2475, - Variant2476, - Variant2477, - Variant2478, - Variant2479, - Variant2480, - Variant2481, - Variant2482, - Variant2483, - Variant2484, - Variant2485, - Variant2486, - Variant2487, - Variant2488, - Variant2489, - Variant2490, - Variant2491, - Variant2492, - Variant2493, - Variant2494, - Variant2495, - Variant2496, - Variant2497, - Variant2498, - Variant2499, - Variant2500, - Variant2501, - Variant2502, - Variant2503, - Variant2504, - Variant2505, - Variant2506, - Variant2507, - Variant2508, - Variant2509, - Variant2510, - Variant2511, - Variant2512, - Variant2513, - Variant2514, - Variant2515, - Variant2516, - Variant2517, - Variant2518, - Variant2519, - Variant2520, - Variant2521, - Variant2522, - Variant2523, - Variant2524, - Variant2525, - Variant2526, - Variant2527, - Variant2528, - Variant2529, - Variant2530, - Variant2531, - Variant2532, - Variant2533, - Variant2534, - Variant2535, - Variant2536, - Variant2537, - Variant2538, - Variant2539, - Variant2540, - Variant2541, - Variant2542, - Variant2543, - Variant2544, - Variant2545, - Variant2546, - Variant2547, - Variant2548, - Variant2549, - Variant2550, - Variant2551, - Variant2552, - Variant2553, - Variant2554, - Variant2555, - Variant2556, - Variant2557, - Variant2558, - Variant2559, - Variant2560, - Variant2561, - Variant2562, - Variant2563, - Variant2564, - Variant2565, - Variant2566, - Variant2567, - Variant2568, - Variant2569, - Variant2570, - Variant2571, - Variant2572, - Variant2573, - Variant2574, - Variant2575, - Variant2576, - Variant2577, - Variant2578, - Variant2579, - Variant2580, - Variant2581, - Variant2582, - Variant2583, - Variant2584, - Variant2585, - Variant2586, - Variant2587, - Variant2588, - Variant2589, - Variant2590, - Variant2591, - Variant2592, - Variant2593, - Variant2594, - Variant2595, - Variant2596, - Variant2597, - Variant2598, - Variant2599, - Variant2600, - Variant2601, - Variant2602, - Variant2603, - Variant2604, - Variant2605, - Variant2606, - Variant2607, - Variant2608, - Variant2609, - Variant2610, - Variant2611, - Variant2612, - Variant2613, - Variant2614, - Variant2615, - Variant2616, - Variant2617, - Variant2618, - Variant2619, - Variant2620, - Variant2621, - Variant2622, - Variant2623, - Variant2624, - Variant2625, - Variant2626, - Variant2627, - Variant2628, - Variant2629, - Variant2630, - Variant2631, - Variant2632, - Variant2633, - Variant2634, - Variant2635, - Variant2636, - Variant2637, - Variant2638, - Variant2639, - Variant2640, - Variant2641, - Variant2642, - Variant2643, - Variant2644, - Variant2645, - Variant2646, - Variant2647, - Variant2648, - Variant2649, - Variant2650, - Variant2651, - Variant2652, - Variant2653, - Variant2654, - Variant2655, - Variant2656, - Variant2657, - Variant2658, - Variant2659, - Variant2660, - Variant2661, - Variant2662, - Variant2663, - Variant2664, - Variant2665, - Variant2666, - Variant2667, - Variant2668, - Variant2669, - Variant2670, - Variant2671, - Variant2672, - Variant2673, - Variant2674, - Variant2675, - Variant2676, - Variant2677, - Variant2678, - Variant2679, - Variant2680, - Variant2681, - Variant2682, - Variant2683, - Variant2684, - Variant2685, - Variant2686, - Variant2687, - Variant2688, - Variant2689, - Variant2690, - Variant2691, - Variant2692, - Variant2693, - Variant2694, - Variant2695, - Variant2696, - Variant2697, - Variant2698, - Variant2699, - Variant2700, - Variant2701, - Variant2702, - Variant2703, - Variant2704, - Variant2705, - Variant2706, - Variant2707, - Variant2708, - Variant2709, - Variant2710, - Variant2711, - Variant2712, - Variant2713, - Variant2714, - Variant2715, - Variant2716, - Variant2717, - Variant2718, - Variant2719, - Variant2720, - Variant2721, - Variant2722, - Variant2723, - Variant2724, - Variant2725, - Variant2726, - Variant2727, - Variant2728, - Variant2729, - Variant2730, - Variant2731, - Variant2732, - Variant2733, - Variant2734, - Variant2735, - Variant2736, - Variant2737, - Variant2738, - Variant2739, - Variant2740, - Variant2741, - Variant2742, - Variant2743, - Variant2744, - Variant2745, - Variant2746, - Variant2747, - Variant2748, - Variant2749, - Variant2750, - Variant2751, - Variant2752, - Variant2753, - Variant2754, - Variant2755, - Variant2756, - Variant2757, - Variant2758, - Variant2759, - Variant2760, - Variant2761, - Variant2762, - Variant2763, - Variant2764, - Variant2765, - Variant2766, - Variant2767, - Variant2768, - Variant2769, - Variant2770, - Variant2771, - Variant2772, - Variant2773, - Variant2774, - Variant2775, - Variant2776, - Variant2777, - Variant2778, - Variant2779, - Variant2780, - Variant2781, - Variant2782, - Variant2783, - Variant2784, - Variant2785, - Variant2786, - Variant2787, - Variant2788, - Variant2789, - Variant2790, - Variant2791, - Variant2792, - Variant2793, - Variant2794, - Variant2795, - Variant2796, - Variant2797, - Variant2798, - Variant2799, - Variant2800, - Variant2801, - Variant2802, - Variant2803, - Variant2804, - Variant2805, - Variant2806, - Variant2807, - Variant2808, - Variant2809, - Variant2810, - Variant2811, - Variant2812, - Variant2813, - Variant2814, - Variant2815, - Variant2816, - Variant2817, - Variant2818, - Variant2819, - Variant2820, - Variant2821, - Variant2822, - Variant2823, - Variant2824, - Variant2825, - Variant2826, - Variant2827, - Variant2828, - Variant2829, - Variant2830, - Variant2831, - Variant2832, - Variant2833, - Variant2834, - Variant2835, - Variant2836, - Variant2837, - Variant2838, - Variant2839, - Variant2840, - Variant2841, - Variant2842, - Variant2843, - Variant2844, - Variant2845, - Variant2846, - Variant2847, - Variant2848, - Variant2849, - Variant2850, - Variant2851, - Variant2852, - Variant2853, - Variant2854, - Variant2855, - Variant2856, - Variant2857, - Variant2858, - Variant2859, - Variant2860, - Variant2861, - Variant2862, - Variant2863, - Variant2864, - Variant2865, - Variant2866, - Variant2867, - Variant2868, - Variant2869, - Variant2870, - Variant2871, - Variant2872, - Variant2873, - Variant2874, - Variant2875, - Variant2876, - Variant2877, - Variant2878, - Variant2879, - Variant2880, - Variant2881, - Variant2882, - Variant2883, - Variant2884, - Variant2885, - Variant2886, - Variant2887, - Variant2888, - Variant2889, - Variant2890, - Variant2891, - Variant2892, - Variant2893, - Variant2894, - Variant2895, - Variant2896, - Variant2897, - Variant2898, - Variant2899, - Variant2900, - Variant2901, - Variant2902, - Variant2903, - Variant2904, - Variant2905, - Variant2906, - Variant2907, - Variant2908, - Variant2909, - Variant2910, - Variant2911, - Variant2912, - Variant2913, - Variant2914, - Variant2915, - Variant2916, - Variant2917, - Variant2918, - Variant2919, - Variant2920, - Variant2921, - Variant2922, - Variant2923, - Variant2924, - Variant2925, - Variant2926, - Variant2927, - Variant2928, - Variant2929, - Variant2930, - Variant2931, - Variant2932, - Variant2933, - Variant2934, - Variant2935, - Variant2936, - Variant2937, - Variant2938, - Variant2939, - Variant2940, - Variant2941, - Variant2942, - Variant2943, - Variant2944, - Variant2945, - Variant2946, - Variant2947, - Variant2948, - Variant2949, - Variant2950, - Variant2951, - Variant2952, - Variant2953, - Variant2954, - Variant2955, - Variant2956, - Variant2957, - Variant2958, - Variant2959, - Variant2960, - Variant2961, - Variant2962, - Variant2963, - Variant2964, - Variant2965, - Variant2966, - Variant2967, - Variant2968, - Variant2969, - Variant2970, - Variant2971, - Variant2972, - Variant2973, - Variant2974, - Variant2975, - Variant2976, - Variant2977, - Variant2978, - Variant2979, - Variant2980, - Variant2981, - Variant2982, - Variant2983, - Variant2984, - Variant2985, - Variant2986, - Variant2987, - Variant2988, - Variant2989, - Variant2990, - Variant2991, - Variant2992, - Variant2993, - Variant2994, - Variant2995, - Variant2996, - Variant2997, - Variant2998, - Variant2999, - Variant3000, - Variant3001, - Variant3002, - Variant3003, - Variant3004, - Variant3005, - Variant3006, - Variant3007, - Variant3008, - Variant3009, - Variant3010, - Variant3011, - Variant3012, - Variant3013, - Variant3014, - Variant3015, - Variant3016, - Variant3017, - Variant3018, - Variant3019, - Variant3020, - Variant3021, - Variant3022, - Variant3023, - Variant3024, - Variant3025, - Variant3026, - Variant3027, - Variant3028, - Variant3029, - Variant3030, - Variant3031, - Variant3032, - Variant3033, - Variant3034, - Variant3035, - Variant3036, - Variant3037, - Variant3038, - Variant3039, - Variant3040, - Variant3041, - Variant3042, - Variant3043, - Variant3044, - Variant3045, - Variant3046, - Variant3047, - Variant3048, - Variant3049, - Variant3050, - Variant3051, - Variant3052, - Variant3053, - Variant3054, - Variant3055, - Variant3056, - Variant3057, - Variant3058, - Variant3059, - Variant3060, - Variant3061, - Variant3062, - Variant3063, - Variant3064, - Variant3065, - Variant3066, - Variant3067, - Variant3068, - Variant3069, - Variant3070, - Variant3071, - Variant3072, - Variant3073, - Variant3074, - Variant3075, - Variant3076, - Variant3077, - Variant3078, - Variant3079, - Variant3080, - Variant3081, - Variant3082, - Variant3083, - Variant3084, - Variant3085, - Variant3086, - Variant3087, - Variant3088, - Variant3089, - Variant3090, - Variant3091, - Variant3092, - Variant3093, - Variant3094, - Variant3095, - Variant3096, - Variant3097, - Variant3098, - Variant3099, - Variant3100, - Variant3101, - Variant3102, - Variant3103, - Variant3104, - Variant3105, - Variant3106, - Variant3107, - Variant3108, - Variant3109, - Variant3110, - Variant3111, - Variant3112, - Variant3113, - Variant3114, - Variant3115, - Variant3116, - Variant3117, - Variant3118, - Variant3119, - Variant3120, - Variant3121, - Variant3122, - Variant3123, - Variant3124, - Variant3125, - Variant3126, - Variant3127, - Variant3128, - Variant3129, - Variant3130, - Variant3131, - Variant3132, - Variant3133, - Variant3134, - Variant3135, - Variant3136, - Variant3137, - Variant3138, - Variant3139, - Variant3140, - Variant3141, - Variant3142, - Variant3143, - Variant3144, - Variant3145, - Variant3146, - Variant3147, - Variant3148, - Variant3149, - Variant3150, - Variant3151, - Variant3152, - Variant3153, - Variant3154, - Variant3155, - Variant3156, - Variant3157, - Variant3158, - Variant3159, - Variant3160, - Variant3161, - Variant3162, - Variant3163, - Variant3164, - Variant3165, - Variant3166, - Variant3167, - Variant3168, - Variant3169, - Variant3170, - Variant3171, - Variant3172, - Variant3173, - Variant3174, - Variant3175, - Variant3176, - Variant3177, - Variant3178, - Variant3179, - Variant3180, - Variant3181, - Variant3182, - Variant3183, - Variant3184, - Variant3185, - Variant3186, - Variant3187, - Variant3188, - Variant3189, - Variant3190, - Variant3191, - Variant3192, - Variant3193, - Variant3194, - Variant3195, - Variant3196, - Variant3197, - Variant3198, - Variant3199, - Variant3200, - Variant3201, - Variant3202, - Variant3203, - Variant3204, - Variant3205, - Variant3206, - Variant3207, - Variant3208, - Variant3209, - Variant3210, - Variant3211, - Variant3212, - Variant3213, - Variant3214, - Variant3215, - Variant3216, - Variant3217, - Variant3218, - Variant3219, - Variant3220, - Variant3221, - Variant3222, - Variant3223, - Variant3224, - Variant3225, - Variant3226, - Variant3227, - Variant3228, - Variant3229, - Variant3230, - Variant3231, - Variant3232, - Variant3233, - Variant3234, - Variant3235, - Variant3236, - Variant3237, - Variant3238, - Variant3239, - Variant3240, - Variant3241, - Variant3242, - Variant3243, - Variant3244, - Variant3245, - Variant3246, - Variant3247, - Variant3248, - Variant3249, - Variant3250, - Variant3251, - Variant3252, - Variant3253, - Variant3254, - Variant3255, - Variant3256, - Variant3257, - Variant3258, - Variant3259, - Variant3260, - Variant3261, - Variant3262, - Variant3263, - Variant3264, - Variant3265, - Variant3266, - Variant3267, - Variant3268, - Variant3269, - Variant3270, - Variant3271, - Variant3272, - Variant3273, - Variant3274, - Variant3275, - Variant3276, - Variant3277, - Variant3278, - Variant3279, - Variant3280, - Variant3281, - Variant3282, - Variant3283, - Variant3284, - Variant3285, - Variant3286, - Variant3287, - Variant3288, - Variant3289, - Variant3290, - Variant3291, - Variant3292, - Variant3293, - Variant3294, - Variant3295, - Variant3296, - Variant3297, - Variant3298, - Variant3299, - Variant3300, - Variant3301, - Variant3302, - Variant3303, - Variant3304, - Variant3305, - Variant3306, - Variant3307, - Variant3308, - Variant3309, - Variant3310, - Variant3311, - Variant3312, - Variant3313, - Variant3314, - Variant3315, - Variant3316, - Variant3317, - Variant3318, - Variant3319, - Variant3320, - Variant3321, - Variant3322, - Variant3323, - Variant3324, - Variant3325, - Variant3326, - Variant3327, - Variant3328, - Variant3329, - Variant3330, - Variant3331, - Variant3332, - Variant3333, - Variant3334, - Variant3335, - Variant3336, - Variant3337, - Variant3338, - Variant3339, - Variant3340, - Variant3341, - Variant3342, - Variant3343, - Variant3344, - Variant3345, - Variant3346, - Variant3347, - Variant3348, - Variant3349, - Variant3350, - Variant3351, - Variant3352, - Variant3353, - Variant3354, - Variant3355, - Variant3356, - Variant3357, - Variant3358, - Variant3359, - Variant3360, - Variant3361, - Variant3362, - Variant3363, - Variant3364, - Variant3365, - Variant3366, - Variant3367, - Variant3368, - Variant3369, - Variant3370, - Variant3371, - Variant3372, - Variant3373, - Variant3374, - Variant3375, - Variant3376, - Variant3377, - Variant3378, - Variant3379, - Variant3380, - Variant3381, - Variant3382, - Variant3383, - Variant3384, - Variant3385, - Variant3386, - Variant3387, - Variant3388, - Variant3389, - Variant3390, - Variant3391, - Variant3392, - Variant3393, - Variant3394, - Variant3395, - Variant3396, - Variant3397, - Variant3398, - Variant3399, - Variant3400, - Variant3401, - Variant3402, - Variant3403, - Variant3404, - Variant3405, - Variant3406, - Variant3407, - Variant3408, - Variant3409, - Variant3410, - Variant3411, - Variant3412, - Variant3413, - Variant3414, - Variant3415, - Variant3416, - Variant3417, - Variant3418, - Variant3419, - Variant3420, - Variant3421, - Variant3422, - Variant3423, - Variant3424, - Variant3425, - Variant3426, - Variant3427, - Variant3428, - Variant3429, - Variant3430, - Variant3431, - Variant3432, - Variant3433, - Variant3434, - Variant3435, - Variant3436, - Variant3437, - Variant3438, - Variant3439, - Variant3440, - Variant3441, - Variant3442, - Variant3443, - Variant3444, - Variant3445, - Variant3446, - Variant3447, - Variant3448, - Variant3449, - Variant3450, - Variant3451, - Variant3452, - Variant3453, - Variant3454, - Variant3455, - Variant3456, - Variant3457, - Variant3458, - Variant3459, - Variant3460, - Variant3461, - Variant3462, - Variant3463, - Variant3464, - Variant3465, - Variant3466, - Variant3467, - Variant3468, - Variant3469, - Variant3470, - Variant3471, - Variant3472, - Variant3473, - Variant3474, - Variant3475, - Variant3476, - Variant3477, - Variant3478, - Variant3479, - Variant3480, - Variant3481, - Variant3482, - Variant3483, - Variant3484, - Variant3485, - Variant3486, - Variant3487, - Variant3488, - Variant3489, - Variant3490, - Variant3491, - Variant3492, - Variant3493, - Variant3494, - Variant3495, - Variant3496, - Variant3497, - Variant3498, - Variant3499, - Variant3500, - Variant3501, - Variant3502, - Variant3503, - Variant3504, - Variant3505, - Variant3506, - Variant3507, - Variant3508, - Variant3509, - Variant3510, - Variant3511, - Variant3512, - Variant3513, - Variant3514, - Variant3515, - Variant3516, - Variant3517, - Variant3518, - Variant3519, - Variant3520, - Variant3521, - Variant3522, - Variant3523, - Variant3524, - Variant3525, - Variant3526, - Variant3527, - Variant3528, - Variant3529, - Variant3530, - Variant3531, - Variant3532, - Variant3533, - Variant3534, - Variant3535, - Variant3536, - Variant3537, - Variant3538, - Variant3539, - Variant3540, - Variant3541, - Variant3542, - Variant3543, - Variant3544, - Variant3545, - Variant3546, - Variant3547, - Variant3548, - Variant3549, - Variant3550, - Variant3551, - Variant3552, - Variant3553, - Variant3554, - Variant3555, - Variant3556, - Variant3557, - Variant3558, - Variant3559, - Variant3560, - Variant3561, - Variant3562, - Variant3563, - Variant3564, - Variant3565, - Variant3566, - Variant3567, - Variant3568, - Variant3569, - Variant3570, - Variant3571, - Variant3572, - Variant3573, - Variant3574, - Variant3575, - Variant3576, - Variant3577, - Variant3578, - Variant3579, - Variant3580, - Variant3581, - Variant3582, - Variant3583, - Variant3584, - Variant3585, - Variant3586, - Variant3587, - Variant3588, - Variant3589, - Variant3590, - Variant3591, - Variant3592, - Variant3593, - Variant3594, - Variant3595, - Variant3596, - Variant3597, - Variant3598, - Variant3599, - Variant3600, - Variant3601, - Variant3602, - Variant3603, - Variant3604, - Variant3605, - Variant3606, - Variant3607, - Variant3608, - Variant3609, - Variant3610, - Variant3611, - Variant3612, - Variant3613, - Variant3614, - Variant3615, - Variant3616, - Variant3617, - Variant3618, - Variant3619, - Variant3620, - Variant3621, - Variant3622, - Variant3623, - Variant3624, - Variant3625, - Variant3626, - Variant3627, - Variant3628, - Variant3629, - Variant3630, - Variant3631, - Variant3632, - Variant3633, - Variant3634, - Variant3635, - Variant3636, - Variant3637, - Variant3638, - Variant3639, - Variant3640, - Variant3641, - Variant3642, - Variant3643, - Variant3644, - Variant3645, - Variant3646, - Variant3647, - Variant3648, - Variant3649, - Variant3650, - Variant3651, - Variant3652, - Variant3653, - Variant3654, - Variant3655, - Variant3656, - Variant3657, - Variant3658, - Variant3659, - Variant3660, - Variant3661, - Variant3662, - Variant3663, - Variant3664, - Variant3665, - Variant3666, - Variant3667, - Variant3668, - Variant3669, - Variant3670, - Variant3671, - Variant3672, - Variant3673, - Variant3674, - Variant3675, - Variant3676, - Variant3677, - Variant3678, - Variant3679, - Variant3680, - Variant3681, - Variant3682, - Variant3683, - Variant3684, - Variant3685, - Variant3686, - Variant3687, - Variant3688, - Variant3689, - Variant3690, - Variant3691, - Variant3692, - Variant3693, - Variant3694, - Variant3695, - Variant3696, - Variant3697, - Variant3698, - Variant3699, - Variant3700, - Variant3701, - Variant3702, - Variant3703, - Variant3704, - Variant3705, - Variant3706, - Variant3707, - Variant3708, - Variant3709, - Variant3710, - Variant3711, - Variant3712, - Variant3713, - Variant3714, - Variant3715, - Variant3716, - Variant3717, - Variant3718, - Variant3719, - Variant3720, - Variant3721, - Variant3722, - Variant3723, - Variant3724, - Variant3725, - Variant3726, - Variant3727, - Variant3728, - Variant3729, - Variant3730, - Variant3731, - Variant3732, - Variant3733, - Variant3734, - Variant3735, - Variant3736, - Variant3737, - Variant3738, - Variant3739, - Variant3740, - Variant3741, - Variant3742, - Variant3743, - Variant3744, - Variant3745, - Variant3746, - Variant3747, - Variant3748, - Variant3749, - Variant3750, - Variant3751, - Variant3752, - Variant3753, - Variant3754, - Variant3755, - Variant3756, - Variant3757, - Variant3758, - Variant3759, - Variant3760, - Variant3761, - Variant3762, - Variant3763, - Variant3764, - Variant3765, - Variant3766, - Variant3767, - Variant3768, - Variant3769, - Variant3770, - Variant3771, - Variant3772, - Variant3773, - Variant3774, - Variant3775, - Variant3776, - Variant3777, - Variant3778, - Variant3779, - Variant3780, - Variant3781, - Variant3782, - Variant3783, - Variant3784, - Variant3785, - Variant3786, - Variant3787, - Variant3788, - Variant3789, - Variant3790, - Variant3791, - Variant3792, - Variant3793, - Variant3794, - Variant3795, - Variant3796, - Variant3797, - Variant3798, - Variant3799, - Variant3800, - Variant3801, - Variant3802, - Variant3803, - Variant3804, - Variant3805, - Variant3806, - Variant3807, - Variant3808, - Variant3809, - Variant3810, - Variant3811, - Variant3812, - Variant3813, - Variant3814, - Variant3815, - Variant3816, - Variant3817, - Variant3818, - Variant3819, - Variant3820, - Variant3821, - Variant3822, - Variant3823, - Variant3824, - Variant3825, - Variant3826, - Variant3827, - Variant3828, - Variant3829, - Variant3830, - Variant3831, - Variant3832, - Variant3833, - Variant3834, - Variant3835, - Variant3836, - Variant3837, - Variant3838, - Variant3839, - Variant3840, - Variant3841, - Variant3842, - Variant3843, - Variant3844, - Variant3845, - Variant3846, - Variant3847, - Variant3848, - Variant3849, - Variant3850, - Variant3851, - Variant3852, - Variant3853, - Variant3854, - Variant3855, - Variant3856, - Variant3857, - Variant3858, - Variant3859, - Variant3860, - Variant3861, - Variant3862, - Variant3863, - Variant3864, - Variant3865, - Variant3866, - Variant3867, - Variant3868, - Variant3869, - Variant3870, - Variant3871, - Variant3872, - Variant3873, - Variant3874, - Variant3875, - Variant3876, - Variant3877, - Variant3878, - Variant3879, - Variant3880, - Variant3881, - Variant3882, - Variant3883, - Variant3884, - Variant3885, - Variant3886, - Variant3887, - Variant3888, - Variant3889, - Variant3890, - Variant3891, - Variant3892, - Variant3893, - Variant3894, - Variant3895, - Variant3896, - Variant3897, - Variant3898, - Variant3899, - Variant3900, - Variant3901, - Variant3902, - Variant3903, - Variant3904, - Variant3905, - Variant3906, - Variant3907, - Variant3908, - Variant3909, - Variant3910, - Variant3911, - Variant3912, - Variant3913, - Variant3914, - Variant3915, - Variant3916, - Variant3917, - Variant3918, - Variant3919, - Variant3920, - Variant3921, - Variant3922, - Variant3923, - Variant3924, - Variant3925, - Variant3926, - Variant3927, - Variant3928, - Variant3929, - Variant3930, - Variant3931, - Variant3932, - Variant3933, - Variant3934, - Variant3935, - Variant3936, - Variant3937, - Variant3938, - Variant3939, - Variant3940, - Variant3941, - Variant3942, - Variant3943, - Variant3944, - Variant3945, - Variant3946, - Variant3947, - Variant3948, - Variant3949, - Variant3950, - Variant3951, - Variant3952, - Variant3953, - Variant3954, - Variant3955, - Variant3956, - Variant3957, - Variant3958, - Variant3959, - Variant3960, - Variant3961, - Variant3962, - Variant3963, - Variant3964, - Variant3965, - Variant3966, - Variant3967, - Variant3968, - Variant3969, - Variant3970, - Variant3971, - Variant3972, - Variant3973, - Variant3974, - Variant3975, - Variant3976, - Variant3977, - Variant3978, - Variant3979, - Variant3980, - Variant3981, - Variant3982, - Variant3983, - Variant3984, - Variant3985, - Variant3986, - Variant3987, - Variant3988, - Variant3989, - Variant3990, - Variant3991, - Variant3992, - Variant3993, - Variant3994, - Variant3995, - Variant3996, - Variant3997, - Variant3998, - Variant3999, - Variant4000, - Variant4001, - Variant4002, - Variant4003, - Variant4004, - Variant4005, - Variant4006, - Variant4007, - Variant4008, - Variant4009, - Variant4010, - Variant4011, - Variant4012, - Variant4013, - Variant4014, - Variant4015, - Variant4016, - Variant4017, - Variant4018, - Variant4019, - Variant4020, - Variant4021, - Variant4022, - Variant4023, - Variant4024, - Variant4025, - Variant4026, - Variant4027, - Variant4028, - Variant4029, - Variant4030, - Variant4031, - Variant4032, - Variant4033, - Variant4034, - Variant4035, - Variant4036, - Variant4037, - Variant4038, - Variant4039, - Variant4040, - Variant4041, - Variant4042, - Variant4043, - Variant4044, - Variant4045, - Variant4046, - Variant4047, - Variant4048, - Variant4049, - Variant4050, - Variant4051, - Variant4052, - Variant4053, - Variant4054, - Variant4055, - Variant4056, - Variant4057, - Variant4058, - Variant4059, - Variant4060, - Variant4061, - Variant4062, - Variant4063, - Variant4064, - Variant4065, - Variant4066, - Variant4067, - Variant4068, - Variant4069, - Variant4070, - Variant4071, - Variant4072, - Variant4073, - Variant4074, - Variant4075, - Variant4076, - Variant4077, - Variant4078, - Variant4079, - Variant4080, - Variant4081, - Variant4082, - Variant4083, - Variant4084, - Variant4085, - Variant4086, - Variant4087, - Variant4088, - Variant4089, - Variant4090, - Variant4091, - Variant4092, - Variant4093, - Variant4094, - Variant4095, - Variant4096, - Variant4097, - Variant4098, - Variant4099, - Variant4100, - Variant4101, - Variant4102, - Variant4103, - Variant4104, - Variant4105, - Variant4106, - Variant4107, - Variant4108, - Variant4109, - Variant4110, - Variant4111, - Variant4112, - Variant4113, - Variant4114, - Variant4115, - Variant4116, - Variant4117, - Variant4118, - Variant4119, - Variant4120, - Variant4121, - Variant4122, - Variant4123, - Variant4124, - Variant4125, - Variant4126, - Variant4127, - Variant4128, - Variant4129, - Variant4130, - Variant4131, - Variant4132, - Variant4133, - Variant4134, - Variant4135, - Variant4136, - Variant4137, - Variant4138, - Variant4139, - Variant4140, - Variant4141, - Variant4142, - Variant4143, - Variant4144, - Variant4145, - Variant4146, - Variant4147, - Variant4148, - Variant4149, - Variant4150, - Variant4151, - Variant4152, - Variant4153, - Variant4154, - Variant4155, - Variant4156, - Variant4157, - Variant4158, - Variant4159, - Variant4160, - Variant4161, - Variant4162, - Variant4163, - Variant4164, - Variant4165, - Variant4166, - Variant4167, - Variant4168, - Variant4169, - Variant4170, - Variant4171, - Variant4172, - Variant4173, - Variant4174, - Variant4175, - Variant4176, - Variant4177, - Variant4178, - Variant4179, - Variant4180, - Variant4181, - Variant4182, - Variant4183, - Variant4184, - Variant4185, - Variant4186, - Variant4187, - Variant4188, - Variant4189, - Variant4190, - Variant4191, - Variant4192, - Variant4193, - Variant4194, - Variant4195, - Variant4196, - Variant4197, - Variant4198, - Variant4199, - Variant4200, - Variant4201, - Variant4202, - Variant4203, - Variant4204, - Variant4205, - Variant4206, - Variant4207, - Variant4208, - Variant4209, - Variant4210, - Variant4211, - Variant4212, - Variant4213, - Variant4214, - Variant4215, - Variant4216, - Variant4217, - Variant4218, - Variant4219, - Variant4220, - Variant4221, - Variant4222, - Variant4223, - Variant4224, - Variant4225, - Variant4226, - Variant4227, - Variant4228, - Variant4229, - Variant4230, - Variant4231, - Variant4232, - Variant4233, - Variant4234, - Variant4235, - Variant4236, - Variant4237, - Variant4238, - Variant4239, - Variant4240, - Variant4241, - Variant4242, - Variant4243, - Variant4244, - Variant4245, - Variant4246, - Variant4247, - Variant4248, - Variant4249, - Variant4250, - Variant4251, - Variant4252, - Variant4253, - Variant4254, - Variant4255, - Variant4256, - Variant4257, - Variant4258, - Variant4259, - Variant4260, - Variant4261, - Variant4262, - Variant4263, - Variant4264, - Variant4265, - Variant4266, - Variant4267, - Variant4268, - Variant4269, - Variant4270, - Variant4271, - Variant4272, - Variant4273, - Variant4274, - Variant4275, - Variant4276, - Variant4277, - Variant4278, - Variant4279, - Variant4280, - Variant4281, - Variant4282, - Variant4283, - Variant4284, - Variant4285, - Variant4286, - Variant4287, - Variant4288, - Variant4289, - Variant4290, - Variant4291, - Variant4292, - Variant4293, - Variant4294, - Variant4295, - Variant4296, - Variant4297, - Variant4298, - Variant4299, - Variant4300, - Variant4301, - Variant4302, - Variant4303, - Variant4304, - Variant4305, - Variant4306, - Variant4307, - Variant4308, - Variant4309, - Variant4310, - Variant4311, - Variant4312, - Variant4313, - Variant4314, - Variant4315, - Variant4316, - Variant4317, - Variant4318, - Variant4319, - Variant4320, - Variant4321, - Variant4322, - Variant4323, - Variant4324, - Variant4325, - Variant4326, - Variant4327, - Variant4328, - Variant4329, - Variant4330, - Variant4331, - Variant4332, - Variant4333, - Variant4334, - Variant4335, - Variant4336, - Variant4337, - Variant4338, - Variant4339, - Variant4340, - Variant4341, - Variant4342, - Variant4343, - Variant4344, - Variant4345, - Variant4346, - Variant4347, - Variant4348, - Variant4349, - Variant4350, - Variant4351, - Variant4352, - Variant4353, - Variant4354, - Variant4355, - Variant4356, - Variant4357, - Variant4358, - Variant4359, - Variant4360, - Variant4361, - Variant4362, - Variant4363, - Variant4364, - Variant4365, - Variant4366, - Variant4367, - Variant4368, - Variant4369, - Variant4370, - Variant4371, - Variant4372, - Variant4373, - Variant4374, - Variant4375, - Variant4376, - Variant4377, - Variant4378, - Variant4379, - Variant4380, - Variant4381, - Variant4382, - Variant4383, - Variant4384, - Variant4385, - Variant4386, - Variant4387, - Variant4388, - Variant4389, - Variant4390, - Variant4391, - Variant4392, - Variant4393, - Variant4394, - Variant4395, - Variant4396, - Variant4397, - Variant4398, - Variant4399, - Variant4400, - Variant4401, - Variant4402, - Variant4403, - Variant4404, - Variant4405, - Variant4406, - Variant4407, - Variant4408, - Variant4409, - Variant4410, - Variant4411, - Variant4412, - Variant4413, - Variant4414, - Variant4415, - Variant4416, - Variant4417, - Variant4418, - Variant4419, - Variant4420, - Variant4421, - Variant4422, - Variant4423, - Variant4424, - Variant4425, - Variant4426, - Variant4427, - Variant4428, - Variant4429, - Variant4430, - Variant4431, - Variant4432, - Variant4433, - Variant4434, - Variant4435, - Variant4436, - Variant4437, - Variant4438, - Variant4439, - Variant4440, - Variant4441, - Variant4442, - Variant4443, - Variant4444, - Variant4445, - Variant4446, - Variant4447, - Variant4448, - Variant4449, - Variant4450, - Variant4451, - Variant4452, - Variant4453, - Variant4454, - Variant4455, - Variant4456, - Variant4457, - Variant4458, - Variant4459, - Variant4460, - Variant4461, - Variant4462, - Variant4463, - Variant4464, - Variant4465, - Variant4466, - Variant4467, - Variant4468, - Variant4469, - Variant4470, - Variant4471, - Variant4472, - Variant4473, - Variant4474, - Variant4475, - Variant4476, - Variant4477, - Variant4478, - Variant4479, - Variant4480, - Variant4481, - Variant4482, - Variant4483, - Variant4484, - Variant4485, - Variant4486, - Variant4487, - Variant4488, - Variant4489, - Variant4490, - Variant4491, - Variant4492, - Variant4493, - Variant4494, - Variant4495, - Variant4496, - Variant4497, - Variant4498, - Variant4499, - Variant4500, - Variant4501, - Variant4502, - Variant4503, - Variant4504, - Variant4505, - Variant4506, - Variant4507, - Variant4508, - Variant4509, - Variant4510, - Variant4511, - Variant4512, - Variant4513, - Variant4514, - Variant4515, - Variant4516, - Variant4517, - Variant4518, - Variant4519, - Variant4520, - Variant4521, - Variant4522, - Variant4523, - Variant4524, - Variant4525, - Variant4526, - Variant4527, - Variant4528, - Variant4529, - Variant4530, - Variant4531, - Variant4532, - Variant4533, - Variant4534, - Variant4535, - Variant4536, - Variant4537, - Variant4538, - Variant4539, - Variant4540, - Variant4541, - Variant4542, - Variant4543, - Variant4544, - Variant4545, - Variant4546, - Variant4547, - Variant4548, - Variant4549, - Variant4550, - Variant4551, - Variant4552, - Variant4553, - Variant4554, - Variant4555, - Variant4556, - Variant4557, - Variant4558, - Variant4559, - Variant4560, - Variant4561, - Variant4562, - Variant4563, - Variant4564, - Variant4565, - Variant4566, - Variant4567, - Variant4568, - Variant4569, - Variant4570, - Variant4571, - Variant4572, - Variant4573, - Variant4574, - Variant4575, - Variant4576, - Variant4577, - Variant4578, - Variant4579, - Variant4580, - Variant4581, - Variant4582, - Variant4583, - Variant4584, - Variant4585, - Variant4586, - Variant4587, - Variant4588, - Variant4589, - Variant4590, - Variant4591, - Variant4592, - Variant4593, - Variant4594, - Variant4595, - Variant4596, - Variant4597, - Variant4598, - Variant4599, - Variant4600, - Variant4601, - Variant4602, - Variant4603, - Variant4604, - Variant4605, - Variant4606, - Variant4607, - Variant4608, - Variant4609, - Variant4610, - Variant4611, - Variant4612, - Variant4613, - Variant4614, - Variant4615, - Variant4616, - Variant4617, - Variant4618, - Variant4619, - Variant4620, - Variant4621, - Variant4622, - Variant4623, - Variant4624, - Variant4625, - Variant4626, - Variant4627, - Variant4628, - Variant4629, - Variant4630, - Variant4631, - Variant4632, - Variant4633, - Variant4634, - Variant4635, - Variant4636, - Variant4637, - Variant4638, - Variant4639, - Variant4640, - Variant4641, - Variant4642, - Variant4643, - Variant4644, - Variant4645, - Variant4646, - Variant4647, - Variant4648, - Variant4649, - Variant4650, - Variant4651, - Variant4652, - Variant4653, - Variant4654, - Variant4655, - Variant4656, - Variant4657, - Variant4658, - Variant4659, - Variant4660, - Variant4661, - Variant4662, - Variant4663, - Variant4664, - Variant4665, - Variant4666, - Variant4667, - Variant4668, - Variant4669, - Variant4670, - Variant4671, - Variant4672, - Variant4673, - Variant4674, - Variant4675, - Variant4676, - Variant4677, - Variant4678, - Variant4679, - Variant4680, - Variant4681, - Variant4682, - Variant4683, - Variant4684, - Variant4685, - Variant4686, - Variant4687, - Variant4688, - Variant4689, - Variant4690, - Variant4691, - Variant4692, - Variant4693, - Variant4694, - Variant4695, - Variant4696, - Variant4697, - Variant4698, - Variant4699, - Variant4700, - Variant4701, - Variant4702, - Variant4703, - Variant4704, - Variant4705, - Variant4706, - Variant4707, - Variant4708, - Variant4709, - Variant4710, - Variant4711, - Variant4712, - Variant4713, - Variant4714, - Variant4715, - Variant4716, - Variant4717, - Variant4718, - Variant4719, - Variant4720, - Variant4721, - Variant4722, - Variant4723, - Variant4724, - Variant4725, - Variant4726, - Variant4727, - Variant4728, - Variant4729, - Variant4730, - Variant4731, - Variant4732, - Variant4733, - Variant4734, - Variant4735, - Variant4736, - Variant4737, - Variant4738, - Variant4739, - Variant4740, - Variant4741, - Variant4742, - Variant4743, - Variant4744, - Variant4745, - Variant4746, - Variant4747, - Variant4748, - Variant4749, - Variant4750, - Variant4751, - Variant4752, - Variant4753, - Variant4754, - Variant4755, - Variant4756, - Variant4757, - Variant4758, - Variant4759, - Variant4760, - Variant4761, - Variant4762, - Variant4763, - Variant4764, - Variant4765, - Variant4766, - Variant4767, - Variant4768, - Variant4769, - Variant4770, - Variant4771, - Variant4772, - Variant4773, - Variant4774, - Variant4775, - Variant4776, - Variant4777, - Variant4778, - Variant4779, - Variant4780, - Variant4781, - Variant4782, - Variant4783, - Variant4784, - Variant4785, - Variant4786, - Variant4787, - Variant4788, - Variant4789, - Variant4790, - Variant4791, - Variant4792, - Variant4793, - Variant4794, - Variant4795, - Variant4796, - Variant4797, - Variant4798, - Variant4799, - Variant4800, - Variant4801, - Variant4802, - Variant4803, - Variant4804, - Variant4805, - Variant4806, - Variant4807, - Variant4808, - Variant4809, - Variant4810, - Variant4811, - Variant4812, - Variant4813, - Variant4814, - Variant4815, - Variant4816, - Variant4817, - Variant4818, - Variant4819, - Variant4820, - Variant4821, - Variant4822, - Variant4823, - Variant4824, - Variant4825, - Variant4826, - Variant4827, - Variant4828, - Variant4829, - Variant4830, - Variant4831, - Variant4832, - Variant4833, - Variant4834, - Variant4835, - Variant4836, - Variant4837, - Variant4838, - Variant4839, - Variant4840, - Variant4841, - Variant4842, - Variant4843, - Variant4844, - Variant4845, - Variant4846, - Variant4847, - Variant4848, - Variant4849, - Variant4850, - Variant4851, - Variant4852, - Variant4853, - Variant4854, - Variant4855, - Variant4856, - Variant4857, - Variant4858, - Variant4859, - Variant4860, - Variant4861, - Variant4862, - Variant4863, - Variant4864, - Variant4865, - Variant4866, - Variant4867, - Variant4868, - Variant4869, - Variant4870, - Variant4871, - Variant4872, - Variant4873, - Variant4874, - Variant4875, - Variant4876, - Variant4877, - Variant4878, - Variant4879, - Variant4880, - Variant4881, - Variant4882, - Variant4883, - Variant4884, - Variant4885, - Variant4886, - Variant4887, - Variant4888, - Variant4889, - Variant4890, - Variant4891, - Variant4892, - Variant4893, - Variant4894, - Variant4895, - Variant4896, - Variant4897, - Variant4898, - Variant4899, - Variant4900, - Variant4901, - Variant4902, - Variant4903, - Variant4904, - Variant4905, - Variant4906, - Variant4907, - Variant4908, - Variant4909, - Variant4910, - Variant4911, - Variant4912, - Variant4913, - Variant4914, - Variant4915, - Variant4916, - Variant4917, - Variant4918, - Variant4919, - Variant4920, - Variant4921, - Variant4922, - Variant4923, - Variant4924, - Variant4925, - Variant4926, - Variant4927, - Variant4928, - Variant4929, - Variant4930, - Variant4931, - Variant4932, - Variant4933, - Variant4934, - Variant4935, - Variant4936, - Variant4937, - Variant4938, - Variant4939, - Variant4940, - Variant4941, - Variant4942, - Variant4943, - Variant4944, - Variant4945, - Variant4946, - Variant4947, - Variant4948, - Variant4949, - Variant4950, - Variant4951, - Variant4952, - Variant4953, - Variant4954, - Variant4955, - Variant4956, - Variant4957, - Variant4958, - Variant4959, - Variant4960, - Variant4961, - Variant4962, - Variant4963, - Variant4964, - Variant4965, - Variant4966, - Variant4967, - Variant4968, - Variant4969, - Variant4970, - Variant4971, - Variant4972, - Variant4973, - Variant4974, - Variant4975, - Variant4976, - Variant4977, - Variant4978, - Variant4979, - Variant4980, - Variant4981, - Variant4982, - Variant4983, - Variant4984, - Variant4985, - Variant4986, - Variant4987, - Variant4988, - Variant4989, - Variant4990, - Variant4991, - Variant4992, - Variant4993, - Variant4994, - Variant4995, - Variant4996, - Variant4997, - Variant4998, - Variant4999, - Variant5000, - Variant5001, - Variant5002, - Variant5003, - Variant5004, - Variant5005, - Variant5006, - Variant5007, - Variant5008, - Variant5009, - Variant5010, - Variant5011, - Variant5012, - Variant5013, - Variant5014, - Variant5015, - Variant5016, - Variant5017, - Variant5018, - Variant5019, - Variant5020, - Variant5021, - Variant5022, - Variant5023, - Variant5024, - Variant5025, - Variant5026, - Variant5027, - Variant5028, - Variant5029, - Variant5030, - Variant5031, - Variant5032, - Variant5033, - Variant5034, - Variant5035, - Variant5036, - Variant5037, - Variant5038, - Variant5039, - Variant5040, - Variant5041, - Variant5042, - Variant5043, - Variant5044, - Variant5045, - Variant5046, - Variant5047, - Variant5048, - Variant5049, - Variant5050, - Variant5051, - Variant5052, - Variant5053, - Variant5054, - Variant5055, - Variant5056, - Variant5057, - Variant5058, - Variant5059, - Variant5060, - Variant5061, - Variant5062, - Variant5063, - Variant5064, - Variant5065, - Variant5066, - Variant5067, - Variant5068, - Variant5069, - Variant5070, - Variant5071, - Variant5072, - Variant5073, - Variant5074, - Variant5075, - Variant5076, - Variant5077, - Variant5078, - Variant5079, - Variant5080, - Variant5081, - Variant5082, - Variant5083, - Variant5084, - Variant5085, - Variant5086, - Variant5087, - Variant5088, - Variant5089, - Variant5090, - Variant5091, - Variant5092, - Variant5093, - Variant5094, - Variant5095, - Variant5096, - Variant5097, - Variant5098, - Variant5099, - Variant5100, - Variant5101, - Variant5102, - Variant5103, - Variant5104, - Variant5105, - Variant5106, - Variant5107, - Variant5108, - Variant5109, - Variant5110, - Variant5111, - Variant5112, - Variant5113, - Variant5114, - Variant5115, - Variant5116, - Variant5117, - Variant5118, - Variant5119, - Variant5120, - Variant5121, - Variant5122, - Variant5123, - Variant5124, - Variant5125, - Variant5126, - Variant5127, - Variant5128, - Variant5129, - Variant5130, - Variant5131, - Variant5132, - Variant5133, - Variant5134, - Variant5135, - Variant5136, - Variant5137, - Variant5138, - Variant5139, - Variant5140, - Variant5141, - Variant5142, - Variant5143, - Variant5144, - Variant5145, - Variant5146, - Variant5147, - Variant5148, - Variant5149, - Variant5150, - Variant5151, - Variant5152, - Variant5153, - Variant5154, - Variant5155, - Variant5156, - Variant5157, - Variant5158, - Variant5159, - Variant5160, - Variant5161, - Variant5162, - Variant5163, - Variant5164, - Variant5165, - Variant5166, - Variant5167, - Variant5168, - Variant5169, - Variant5170, - Variant5171, - Variant5172, - Variant5173, - Variant5174, - Variant5175, - Variant5176, - Variant5177, - Variant5178, - Variant5179, - Variant5180, - Variant5181, - Variant5182, - Variant5183, - Variant5184, - Variant5185, - Variant5186, - Variant5187, - Variant5188, - Variant5189, - Variant5190, - Variant5191, - Variant5192, - Variant5193, - Variant5194, - Variant5195, - Variant5196, - Variant5197, - Variant5198, - Variant5199, - Variant5200, - Variant5201, - Variant5202, - Variant5203, - Variant5204, - Variant5205, - Variant5206, - Variant5207, - Variant5208, - Variant5209, - Variant5210, - Variant5211, - Variant5212, - Variant5213, - Variant5214, - Variant5215, - Variant5216, - Variant5217, - Variant5218, - Variant5219, - Variant5220, - Variant5221, - Variant5222, - Variant5223, - Variant5224, - Variant5225, - Variant5226, - Variant5227, - Variant5228, - Variant5229, - Variant5230, - Variant5231, - Variant5232, - Variant5233, - Variant5234, - Variant5235, - Variant5236, - Variant5237, - Variant5238, - Variant5239, - Variant5240, - Variant5241, - Variant5242, - Variant5243, - Variant5244, - Variant5245, - Variant5246, - Variant5247, - Variant5248, - Variant5249, - Variant5250, - Variant5251, - Variant5252, - Variant5253, - Variant5254, - Variant5255, - Variant5256, - Variant5257, - Variant5258, - Variant5259, - Variant5260, - Variant5261, - Variant5262, - Variant5263, - Variant5264, - Variant5265, - Variant5266, - Variant5267, - Variant5268, - Variant5269, - Variant5270, - Variant5271, - Variant5272, - Variant5273, - Variant5274, - Variant5275, - Variant5276, - Variant5277, - Variant5278, - Variant5279, - Variant5280, - Variant5281, - Variant5282, - Variant5283, - Variant5284, - Variant5285, - Variant5286, - Variant5287, - Variant5288, - Variant5289, - Variant5290, - Variant5291, - Variant5292, - Variant5293, - Variant5294, - Variant5295, - Variant5296, - Variant5297, - Variant5298, - Variant5299, - Variant5300, - Variant5301, - Variant5302, - Variant5303, - Variant5304, - Variant5305, - Variant5306, - Variant5307, - Variant5308, - Variant5309, - Variant5310, - Variant5311, - Variant5312, - Variant5313, - Variant5314, - Variant5315, - Variant5316, - Variant5317, - Variant5318, - Variant5319, - Variant5320, - Variant5321, - Variant5322, - Variant5323, - Variant5324, - Variant5325, - Variant5326, - Variant5327, - Variant5328, - Variant5329, - Variant5330, - Variant5331, - Variant5332, - Variant5333, - Variant5334, - Variant5335, - Variant5336, - Variant5337, - Variant5338, - Variant5339, - Variant5340, - Variant5341, - Variant5342, - Variant5343, - Variant5344, - Variant5345, - Variant5346, - Variant5347, - Variant5348, - Variant5349, - Variant5350, - Variant5351, - Variant5352, - Variant5353, - Variant5354, - Variant5355, - Variant5356, - Variant5357, - Variant5358, - Variant5359, - Variant5360, - Variant5361, - Variant5362, - Variant5363, - Variant5364, - Variant5365, - Variant5366, - Variant5367, - Variant5368, - Variant5369, - Variant5370, - Variant5371, - Variant5372, - Variant5373, - Variant5374, - Variant5375, - Variant5376, - Variant5377, - Variant5378, - Variant5379, - Variant5380, - Variant5381, - Variant5382, - Variant5383, - Variant5384, - Variant5385, - Variant5386, - Variant5387, - Variant5388, - Variant5389, - Variant5390, - Variant5391, - Variant5392, - Variant5393, - Variant5394, - Variant5395, - Variant5396, - Variant5397, - Variant5398, - Variant5399, - Variant5400, - Variant5401, - Variant5402, - Variant5403, - Variant5404, - Variant5405, - Variant5406, - Variant5407, - Variant5408, - Variant5409, - Variant5410, - Variant5411, - Variant5412, - Variant5413, - Variant5414, - Variant5415, - Variant5416, - Variant5417, - Variant5418, - Variant5419, - Variant5420, - Variant5421, - Variant5422, - Variant5423, - Variant5424, - Variant5425, - Variant5426, - Variant5427, - Variant5428, - Variant5429, - Variant5430, - Variant5431, - Variant5432, - Variant5433, - Variant5434, - Variant5435, - Variant5436, - Variant5437, - Variant5438, - Variant5439, - Variant5440, - Variant5441, - Variant5442, - Variant5443, - Variant5444, - Variant5445, - Variant5446, - Variant5447, - Variant5448, - Variant5449, - Variant5450, - Variant5451, - Variant5452, - Variant5453, - Variant5454, - Variant5455, - Variant5456, - Variant5457, - Variant5458, - Variant5459, - Variant5460, - Variant5461, - Variant5462, - Variant5463, - Variant5464, - Variant5465, - Variant5466, - Variant5467, - Variant5468, - Variant5469, - Variant5470, - Variant5471, - Variant5472, - Variant5473, - Variant5474, - Variant5475, - Variant5476, - Variant5477, - Variant5478, - Variant5479, - Variant5480, - Variant5481, - Variant5482, - Variant5483, - Variant5484, - Variant5485, - Variant5486, - Variant5487, - Variant5488, - Variant5489, - Variant5490, - Variant5491, - Variant5492, - Variant5493, - Variant5494, - Variant5495, - Variant5496, - Variant5497, - Variant5498, - Variant5499, - Variant5500, - Variant5501, - Variant5502, - Variant5503, - Variant5504, - Variant5505, - Variant5506, - Variant5507, - Variant5508, - Variant5509, - Variant5510, - Variant5511, - Variant5512, - Variant5513, - Variant5514, - Variant5515, - Variant5516, - Variant5517, - Variant5518, - Variant5519, - Variant5520, - Variant5521, - Variant5522, - Variant5523, - Variant5524, - Variant5525, - Variant5526, - Variant5527, - Variant5528, - Variant5529, - Variant5530, - Variant5531, - Variant5532, - Variant5533, - Variant5534, - Variant5535, - Variant5536, - Variant5537, - Variant5538, - Variant5539, - Variant5540, - Variant5541, - Variant5542, - Variant5543, - Variant5544, - Variant5545, - Variant5546, - Variant5547, - Variant5548, - Variant5549, - Variant5550, - Variant5551, - Variant5552, - Variant5553, - Variant5554, - Variant5555, - Variant5556, - Variant5557, - Variant5558, - Variant5559, - Variant5560, - Variant5561, - Variant5562, - Variant5563, - Variant5564, - Variant5565, - Variant5566, - Variant5567, - Variant5568, - Variant5569, - Variant5570, - Variant5571, - Variant5572, - Variant5573, - Variant5574, - Variant5575, - Variant5576, - Variant5577, - Variant5578, - Variant5579, - Variant5580, - Variant5581, - Variant5582, - Variant5583, - Variant5584, - Variant5585, - Variant5586, - Variant5587, - Variant5588, - Variant5589, - Variant5590, - Variant5591, - Variant5592, - Variant5593, - Variant5594, - Variant5595, - Variant5596, - Variant5597, - Variant5598, - Variant5599, - Variant5600, - Variant5601, - Variant5602, - Variant5603, - Variant5604, - Variant5605, - Variant5606, - Variant5607, - Variant5608, - Variant5609, - Variant5610, - Variant5611, - Variant5612, - Variant5613, - Variant5614, - Variant5615, - Variant5616, - Variant5617, - Variant5618, - Variant5619, - Variant5620, - Variant5621, - Variant5622, - Variant5623, - Variant5624, - Variant5625, - Variant5626, - Variant5627, - Variant5628, - Variant5629, - Variant5630, - Variant5631, - Variant5632, - Variant5633, - Variant5634, - Variant5635, - Variant5636, - Variant5637, - Variant5638, - Variant5639, - Variant5640, - Variant5641, - Variant5642, - Variant5643, - Variant5644, - Variant5645, - Variant5646, - Variant5647, - Variant5648, - Variant5649, - Variant5650, - Variant5651, - Variant5652, - Variant5653, - Variant5654, - Variant5655, - Variant5656, - Variant5657, - Variant5658, - Variant5659, - Variant5660, - Variant5661, - Variant5662, - Variant5663, - Variant5664, - Variant5665, - Variant5666, - Variant5667, - Variant5668, - Variant5669, - Variant5670, - Variant5671, - Variant5672, - Variant5673, - Variant5674, - Variant5675, - Variant5676, - Variant5677, - Variant5678, - Variant5679, - Variant5680, - Variant5681, - Variant5682, - Variant5683, - Variant5684, - Variant5685, - Variant5686, - Variant5687, - Variant5688, - Variant5689, - Variant5690, - Variant5691, - Variant5692, - Variant5693, - Variant5694, - Variant5695, - Variant5696, - Variant5697, - Variant5698, - Variant5699, - Variant5700, - Variant5701, - Variant5702, - Variant5703, - Variant5704, - Variant5705, - Variant5706, - Variant5707, - Variant5708, - Variant5709, - Variant5710, - Variant5711, - Variant5712, - Variant5713, - Variant5714, - Variant5715, - Variant5716, - Variant5717, - Variant5718, - Variant5719, - Variant5720, - Variant5721, - Variant5722, - Variant5723, - Variant5724, - Variant5725, - Variant5726, - Variant5727, - Variant5728, - Variant5729, - Variant5730, - Variant5731, - Variant5732, - Variant5733, - Variant5734, - Variant5735, - Variant5736, - Variant5737, - Variant5738, - Variant5739, - Variant5740, - Variant5741, - Variant5742, - Variant5743, - Variant5744, - Variant5745, - Variant5746, - Variant5747, - Variant5748, - Variant5749, - Variant5750, - Variant5751, - Variant5752, - Variant5753, - Variant5754, - Variant5755, - Variant5756, - Variant5757, - Variant5758, - Variant5759, - Variant5760, - Variant5761, - Variant5762, - Variant5763, - Variant5764, - Variant5765, - Variant5766, - Variant5767, - Variant5768, - Variant5769, - Variant5770, - Variant5771, - Variant5772, - Variant5773, - Variant5774, - Variant5775, - Variant5776, - Variant5777, - Variant5778, - Variant5779, - Variant5780, - Variant5781, - Variant5782, - Variant5783, - Variant5784, - Variant5785, - Variant5786, - Variant5787, - Variant5788, - Variant5789, - Variant5790, - Variant5791, - Variant5792, - Variant5793, - Variant5794, - Variant5795, - Variant5796, - Variant5797, - Variant5798, - Variant5799, - Variant5800, - Variant5801, - Variant5802, - Variant5803, - Variant5804, - Variant5805, - Variant5806, - Variant5807, - Variant5808, - Variant5809, - Variant5810, - Variant5811, - Variant5812, - Variant5813, - Variant5814, - Variant5815, - Variant5816, - Variant5817, - Variant5818, - Variant5819, - Variant5820, - Variant5821, - Variant5822, - Variant5823, - Variant5824, - Variant5825, - Variant5826, - Variant5827, - Variant5828, - Variant5829, - Variant5830, - Variant5831, - Variant5832, - Variant5833, - Variant5834, - Variant5835, - Variant5836, - Variant5837, - Variant5838, - Variant5839, - Variant5840, - Variant5841, - Variant5842, - Variant5843, - Variant5844, - Variant5845, - Variant5846, - Variant5847, - Variant5848, - Variant5849, - Variant5850, - Variant5851, - Variant5852, - Variant5853, - Variant5854, - Variant5855, - Variant5856, - Variant5857, - Variant5858, - Variant5859, - Variant5860, - Variant5861, - Variant5862, - Variant5863, - Variant5864, - Variant5865, - Variant5866, - Variant5867, - Variant5868, - Variant5869, - Variant5870, - Variant5871, - Variant5872, - Variant5873, - Variant5874, - Variant5875, - Variant5876, - Variant5877, - Variant5878, - Variant5879, - Variant5880, - Variant5881, - Variant5882, - Variant5883, - Variant5884, - Variant5885, - Variant5886, - Variant5887, - Variant5888, - Variant5889, - Variant5890, - Variant5891, - Variant5892, - Variant5893, - Variant5894, - Variant5895, - Variant5896, - Variant5897, - Variant5898, - Variant5899, - Variant5900, - Variant5901, - Variant5902, - Variant5903, - Variant5904, - Variant5905, - Variant5906, - Variant5907, - Variant5908, - Variant5909, - Variant5910, - Variant5911, - Variant5912, - Variant5913, - Variant5914, - Variant5915, - Variant5916, - Variant5917, - Variant5918, - Variant5919, - Variant5920, - Variant5921, - Variant5922, - Variant5923, - Variant5924, - Variant5925, - Variant5926, - Variant5927, - Variant5928, - Variant5929, - Variant5930, - Variant5931, - Variant5932, - Variant5933, - Variant5934, - Variant5935, - Variant5936, - Variant5937, - Variant5938, - Variant5939, - Variant5940, - Variant5941, - Variant5942, - Variant5943, - Variant5944, - Variant5945, - Variant5946, - Variant5947, - Variant5948, - Variant5949, - Variant5950, - Variant5951, - Variant5952, - Variant5953, - Variant5954, - Variant5955, - Variant5956, - Variant5957, - Variant5958, - Variant5959, - Variant5960, - Variant5961, - Variant5962, - Variant5963, - Variant5964, - Variant5965, - Variant5966, - Variant5967, - Variant5968, - Variant5969, - Variant5970, - Variant5971, - Variant5972, - Variant5973, - Variant5974, - Variant5975, - Variant5976, - Variant5977, - Variant5978, - Variant5979, - Variant5980, - Variant5981, - Variant5982, - Variant5983, - Variant5984, - Variant5985, - Variant5986, - Variant5987, - Variant5988, - Variant5989, - Variant5990, - Variant5991, - Variant5992, - Variant5993, - Variant5994, - Variant5995, - Variant5996, - Variant5997, - Variant5998, - Variant5999, - Variant6000, - Variant6001, - Variant6002, - Variant6003, - Variant6004, - Variant6005, - Variant6006, - Variant6007, - Variant6008, - Variant6009, - Variant6010, - Variant6011, - Variant6012, - Variant6013, - Variant6014, - Variant6015, - Variant6016, - Variant6017, - Variant6018, - Variant6019, - Variant6020, - Variant6021, - Variant6022, - Variant6023, - Variant6024, - Variant6025, - Variant6026, - Variant6027, - Variant6028, - Variant6029, - Variant6030, - Variant6031, - Variant6032, - Variant6033, - Variant6034, - Variant6035, - Variant6036, - Variant6037, - Variant6038, - Variant6039, - Variant6040, - Variant6041, - Variant6042, - Variant6043, - Variant6044, - Variant6045, - Variant6046, - Variant6047, - Variant6048, - Variant6049, - Variant6050, - Variant6051, - Variant6052, - Variant6053, - Variant6054, - Variant6055, - Variant6056, - Variant6057, - Variant6058, - Variant6059, - Variant6060, - Variant6061, - Variant6062, - Variant6063, - Variant6064, - Variant6065, - Variant6066, - Variant6067, - Variant6068, - Variant6069, - Variant6070, - Variant6071, - Variant6072, - Variant6073, - Variant6074, - Variant6075, - Variant6076, - Variant6077, - Variant6078, - Variant6079, - Variant6080, - Variant6081, - Variant6082, - Variant6083, - Variant6084, - Variant6085, - Variant6086, - Variant6087, - Variant6088, - Variant6089, - Variant6090, - Variant6091, - Variant6092, - Variant6093, - Variant6094, - Variant6095, - Variant6096, - Variant6097, - Variant6098, - Variant6099, - Variant6100, - Variant6101, - Variant6102, - Variant6103, - Variant6104, - Variant6105, - Variant6106, - Variant6107, - Variant6108, - Variant6109, - Variant6110, - Variant6111, - Variant6112, - Variant6113, - Variant6114, - Variant6115, - Variant6116, - Variant6117, - Variant6118, - Variant6119, - Variant6120, - Variant6121, - Variant6122, - Variant6123, - Variant6124, - Variant6125, - Variant6126, - Variant6127, - Variant6128, - Variant6129, - Variant6130, - Variant6131, - Variant6132, - Variant6133, - Variant6134, - Variant6135, - Variant6136, - Variant6137, - Variant6138, - Variant6139, - Variant6140, - Variant6141, - Variant6142, - Variant6143, - Variant6144, - Variant6145, - Variant6146, - Variant6147, - Variant6148, - Variant6149, - Variant6150, - Variant6151, - Variant6152, - Variant6153, - Variant6154, - Variant6155, - Variant6156, - Variant6157, - Variant6158, - Variant6159, - Variant6160, - Variant6161, - Variant6162, - Variant6163, - Variant6164, - Variant6165, - Variant6166, - Variant6167, - Variant6168, - Variant6169, - Variant6170, - Variant6171, - Variant6172, - Variant6173, - Variant6174, - Variant6175, - Variant6176, - Variant6177, - Variant6178, - Variant6179, - Variant6180, - Variant6181, - Variant6182, - Variant6183, - Variant6184, - Variant6185, - Variant6186, - Variant6187, - Variant6188, - Variant6189, - Variant6190, - Variant6191, - Variant6192, - Variant6193, - Variant6194, - Variant6195, - Variant6196, - Variant6197, - Variant6198, - Variant6199, - Variant6200, - Variant6201, - Variant6202, - Variant6203, - Variant6204, - Variant6205, - Variant6206, - Variant6207, - Variant6208, - Variant6209, - Variant6210, - Variant6211, - Variant6212, - Variant6213, - Variant6214, - Variant6215, - Variant6216, - Variant6217, - Variant6218, - Variant6219, - Variant6220, - Variant6221, - Variant6222, - Variant6223, - Variant6224, - Variant6225, - Variant6226, - Variant6227, - Variant6228, - Variant6229, - Variant6230, - Variant6231, - Variant6232, - Variant6233, - Variant6234, - Variant6235, - Variant6236, - Variant6237, - Variant6238, - Variant6239, - Variant6240, - Variant6241, - Variant6242, - Variant6243, - Variant6244, - Variant6245, - Variant6246, - Variant6247, - Variant6248, - Variant6249, - Variant6250, - Variant6251, - Variant6252, - Variant6253, - Variant6254, - Variant6255, - Variant6256, - Variant6257, - Variant6258, - Variant6259, - Variant6260, - Variant6261, - Variant6262, - Variant6263, - Variant6264, - Variant6265, - Variant6266, - Variant6267, - Variant6268, - Variant6269, - Variant6270, - Variant6271, - Variant6272, - Variant6273, - Variant6274, - Variant6275, - Variant6276, - Variant6277, - Variant6278, - Variant6279, - Variant6280, - Variant6281, - Variant6282, - Variant6283, - Variant6284, - Variant6285, - Variant6286, - Variant6287, - Variant6288, - Variant6289, - Variant6290, - Variant6291, - Variant6292, - Variant6293, - Variant6294, - Variant6295, - Variant6296, - Variant6297, - Variant6298, - Variant6299, - Variant6300, - Variant6301, - Variant6302, - Variant6303, - Variant6304, - Variant6305, - Variant6306, - Variant6307, - Variant6308, - Variant6309, - Variant6310, - Variant6311, - Variant6312, - Variant6313, - Variant6314, - Variant6315, - Variant6316, - Variant6317, - Variant6318, - Variant6319, - Variant6320, - Variant6321, - Variant6322, - Variant6323, - Variant6324, - Variant6325, - Variant6326, - Variant6327, - Variant6328, - Variant6329, - Variant6330, - Variant6331, - Variant6332, - Variant6333, - Variant6334, - Variant6335, - Variant6336, - Variant6337, - Variant6338, - Variant6339, - Variant6340, - Variant6341, - Variant6342, - Variant6343, - Variant6344, - Variant6345, - Variant6346, - Variant6347, - Variant6348, - Variant6349, - Variant6350, - Variant6351, - Variant6352, - Variant6353, - Variant6354, - Variant6355, - Variant6356, - Variant6357, - Variant6358, - Variant6359, - Variant6360, - Variant6361, - Variant6362, - Variant6363, - Variant6364, - Variant6365, - Variant6366, - Variant6367, - Variant6368, - Variant6369, - Variant6370, - Variant6371, - Variant6372, - Variant6373, - Variant6374, - Variant6375, - Variant6376, - Variant6377, - Variant6378, - Variant6379, - Variant6380, - Variant6381, - Variant6382, - Variant6383, - Variant6384, - Variant6385, - Variant6386, - Variant6387, - Variant6388, - Variant6389, - Variant6390, - Variant6391, - Variant6392, - Variant6393, - Variant6394, - Variant6395, - Variant6396, - Variant6397, - Variant6398, - Variant6399, - Variant6400, - Variant6401, - Variant6402, - Variant6403, - Variant6404, - Variant6405, - Variant6406, - Variant6407, - Variant6408, - Variant6409, - Variant6410, - Variant6411, - Variant6412, - Variant6413, - Variant6414, - Variant6415, - Variant6416, - Variant6417, - Variant6418, - Variant6419, - Variant6420, - Variant6421, - Variant6422, - Variant6423, - Variant6424, - Variant6425, - Variant6426, - Variant6427, - Variant6428, - Variant6429, - Variant6430, - Variant6431, - Variant6432, - Variant6433, - Variant6434, - Variant6435, - Variant6436, - Variant6437, - Variant6438, - Variant6439, - Variant6440, - Variant6441, - Variant6442, - Variant6443, - Variant6444, - Variant6445, - Variant6446, - Variant6447, - Variant6448, - Variant6449, - Variant6450, - Variant6451, - Variant6452, - Variant6453, - Variant6454, - Variant6455, - Variant6456, - Variant6457, - Variant6458, - Variant6459, - Variant6460, - Variant6461, - Variant6462, - Variant6463, - Variant6464, - Variant6465, - Variant6466, - Variant6467, - Variant6468, - Variant6469, - Variant6470, - Variant6471, - Variant6472, - Variant6473, - Variant6474, - Variant6475, - Variant6476, - Variant6477, - Variant6478, - Variant6479, - Variant6480, - Variant6481, - Variant6482, - Variant6483, - Variant6484, - Variant6485, - Variant6486, - Variant6487, - Variant6488, - Variant6489, - Variant6490, - Variant6491, - Variant6492, - Variant6493, - Variant6494, - Variant6495, - Variant6496, - Variant6497, - Variant6498, - Variant6499, - Variant6500, - Variant6501, - Variant6502, - Variant6503, - Variant6504, - Variant6505, - Variant6506, - Variant6507, - Variant6508, - Variant6509, - Variant6510, - Variant6511, - Variant6512, - Variant6513, - Variant6514, - Variant6515, - Variant6516, - Variant6517, - Variant6518, - Variant6519, - Variant6520, - Variant6521, - Variant6522, - Variant6523, - Variant6524, - Variant6525, - Variant6526, - Variant6527, - Variant6528, - Variant6529, - Variant6530, - Variant6531, - Variant6532, - Variant6533, - Variant6534, - Variant6535, - Variant6536, - Variant6537, - Variant6538, - Variant6539, - Variant6540, - Variant6541, - Variant6542, - Variant6543, - Variant6544, - Variant6545, - Variant6546, - Variant6547, - Variant6548, - Variant6549, - Variant6550, - Variant6551, - Variant6552, - Variant6553, - Variant6554, - Variant6555, - Variant6556, - Variant6557, - Variant6558, - Variant6559, - Variant6560, - Variant6561, - Variant6562, - Variant6563, - Variant6564, - Variant6565, - Variant6566, - Variant6567, - Variant6568, - Variant6569, - Variant6570, - Variant6571, - Variant6572, - Variant6573, - Variant6574, - Variant6575, - Variant6576, - Variant6577, - Variant6578, - Variant6579, - Variant6580, - Variant6581, - Variant6582, - Variant6583, - Variant6584, - Variant6585, - Variant6586, - Variant6587, - Variant6588, - Variant6589, - Variant6590, - Variant6591, - Variant6592, - Variant6593, - Variant6594, - Variant6595, - Variant6596, - Variant6597, - Variant6598, - Variant6599, - Variant6600, - Variant6601, - Variant6602, - Variant6603, - Variant6604, - Variant6605, - Variant6606, - Variant6607, - Variant6608, - Variant6609, - Variant6610, - Variant6611, - Variant6612, - Variant6613, - Variant6614, - Variant6615, - Variant6616, - Variant6617, - Variant6618, - Variant6619, - Variant6620, - Variant6621, - Variant6622, - Variant6623, - Variant6624, - Variant6625, - Variant6626, - Variant6627, - Variant6628, - Variant6629, - Variant6630, - Variant6631, - Variant6632, - Variant6633, - Variant6634, - Variant6635, - Variant6636, - Variant6637, - Variant6638, - Variant6639, - Variant6640, - Variant6641, - Variant6642, - Variant6643, - Variant6644, - Variant6645, - Variant6646, - Variant6647, - Variant6648, - Variant6649, - Variant6650, - Variant6651, - Variant6652, - Variant6653, - Variant6654, - Variant6655, - Variant6656, - Variant6657, - Variant6658, - Variant6659, - Variant6660, - Variant6661, - Variant6662, - Variant6663, - Variant6664, - Variant6665, - Variant6666, - Variant6667, - Variant6668, - Variant6669, - Variant6670, - Variant6671, - Variant6672, - Variant6673, - Variant6674, - Variant6675, - Variant6676, - Variant6677, - Variant6678, - Variant6679, - Variant6680, - Variant6681, - Variant6682, - Variant6683, - Variant6684, - Variant6685, - Variant6686, - Variant6687, - Variant6688, - Variant6689, - Variant6690, - Variant6691, - Variant6692, - Variant6693, - Variant6694, - Variant6695, - Variant6696, - Variant6697, - Variant6698, - Variant6699, - Variant6700, - Variant6701, - Variant6702, - Variant6703, - Variant6704, - Variant6705, - Variant6706, - Variant6707, - Variant6708, - Variant6709, - Variant6710, - Variant6711, - Variant6712, - Variant6713, - Variant6714, - Variant6715, - Variant6716, - Variant6717, - Variant6718, - Variant6719, - Variant6720, - Variant6721, - Variant6722, - Variant6723, - Variant6724, - Variant6725, - Variant6726, - Variant6727, - Variant6728, - Variant6729, - Variant6730, - Variant6731, - Variant6732, - Variant6733, - Variant6734, - Variant6735, - Variant6736, - Variant6737, - Variant6738, - Variant6739, - Variant6740, - Variant6741, - Variant6742, - Variant6743, - Variant6744, - Variant6745, - Variant6746, - Variant6747, - Variant6748, - Variant6749, - Variant6750, - Variant6751, - Variant6752, - Variant6753, - Variant6754, - Variant6755, - Variant6756, - Variant6757, - Variant6758, - Variant6759, - Variant6760, - Variant6761, - Variant6762, - Variant6763, - Variant6764, - Variant6765, - Variant6766, - Variant6767, - Variant6768, - Variant6769, - Variant6770, - Variant6771, - Variant6772, - Variant6773, - Variant6774, - Variant6775, - Variant6776, - Variant6777, - Variant6778, - Variant6779, - Variant6780, - Variant6781, - Variant6782, - Variant6783, - Variant6784, - Variant6785, - Variant6786, - Variant6787, - Variant6788, - Variant6789, - Variant6790, - Variant6791, - Variant6792, - Variant6793, - Variant6794, - Variant6795, - Variant6796, - Variant6797, - Variant6798, - Variant6799, - Variant6800, - Variant6801, - Variant6802, - Variant6803, - Variant6804, - Variant6805, - Variant6806, - Variant6807, - Variant6808, - Variant6809, - Variant6810, - Variant6811, - Variant6812, - Variant6813, - Variant6814, - Variant6815, - Variant6816, - Variant6817, - Variant6818, - Variant6819, - Variant6820, - Variant6821, - Variant6822, - Variant6823, - Variant6824, - Variant6825, - Variant6826, - Variant6827, - Variant6828, - Variant6829, - Variant6830, - Variant6831, - Variant6832, - Variant6833, - Variant6834, - Variant6835, - Variant6836, - Variant6837, - Variant6838, - Variant6839, - Variant6840, - Variant6841, - Variant6842, - Variant6843, - Variant6844, - Variant6845, - Variant6846, - Variant6847, - Variant6848, - Variant6849, - Variant6850, - Variant6851, - Variant6852, - Variant6853, - Variant6854, - Variant6855, - Variant6856, - Variant6857, - Variant6858, - Variant6859, - Variant6860, - Variant6861, - Variant6862, - Variant6863, - Variant6864, - Variant6865, - Variant6866, - Variant6867, - Variant6868, - Variant6869, - Variant6870, - Variant6871, - Variant6872, - Variant6873, - Variant6874, - Variant6875, - Variant6876, - Variant6877, - Variant6878, - Variant6879, - Variant6880, - Variant6881, - Variant6882, - Variant6883, - Variant6884, - Variant6885, - Variant6886, - Variant6887, - Variant6888, - Variant6889, - Variant6890, - Variant6891, - Variant6892, - Variant6893, - Variant6894, - Variant6895, - Variant6896, - Variant6897, - Variant6898, - Variant6899, - Variant6900, - Variant6901, - Variant6902, - Variant6903, - Variant6904, - Variant6905, - Variant6906, - Variant6907, - Variant6908, - Variant6909, - Variant6910, - Variant6911, - Variant6912, - Variant6913, - Variant6914, - Variant6915, - Variant6916, - Variant6917, - Variant6918, - Variant6919, - Variant6920, - Variant6921, - Variant6922, - Variant6923, - Variant6924, - Variant6925, - Variant6926, - Variant6927, - Variant6928, - Variant6929, - Variant6930, - Variant6931, - Variant6932, - Variant6933, - Variant6934, - Variant6935, - Variant6936, - Variant6937, - Variant6938, - Variant6939, - Variant6940, - Variant6941, - Variant6942, - Variant6943, - Variant6944, - Variant6945, - Variant6946, - Variant6947, - Variant6948, - Variant6949, - Variant6950, - Variant6951, - Variant6952, - Variant6953, - Variant6954, - Variant6955, - Variant6956, - Variant6957, - Variant6958, - Variant6959, - Variant6960, - Variant6961, - Variant6962, - Variant6963, - Variant6964, - Variant6965, - Variant6966, - Variant6967, - Variant6968, - Variant6969, - Variant6970, - Variant6971, - Variant6972, - Variant6973, - Variant6974, - Variant6975, - Variant6976, - Variant6977, - Variant6978, - Variant6979, - Variant6980, - Variant6981, - Variant6982, - Variant6983, - Variant6984, - Variant6985, - Variant6986, - Variant6987, - Variant6988, - Variant6989, - Variant6990, - Variant6991, - Variant6992, - Variant6993, - Variant6994, - Variant6995, - Variant6996, - Variant6997, - Variant6998, - Variant6999, - Variant7000, - Variant7001, - Variant7002, - Variant7003, - Variant7004, - Variant7005, - Variant7006, - Variant7007, - Variant7008, - Variant7009, - Variant7010, - Variant7011, - Variant7012, - Variant7013, - Variant7014, - Variant7015, - Variant7016, - Variant7017, - Variant7018, - Variant7019, - Variant7020, - Variant7021, - Variant7022, - Variant7023, - Variant7024, - Variant7025, - Variant7026, - Variant7027, - Variant7028, - Variant7029, - Variant7030, - Variant7031, - Variant7032, - Variant7033, - Variant7034, - Variant7035, - Variant7036, - Variant7037, - Variant7038, - Variant7039, - Variant7040, - Variant7041, - Variant7042, - Variant7043, - Variant7044, - Variant7045, - Variant7046, - Variant7047, - Variant7048, - Variant7049, - Variant7050, - Variant7051, - Variant7052, - Variant7053, - Variant7054, - Variant7055, - Variant7056, - Variant7057, - Variant7058, - Variant7059, - Variant7060, - Variant7061, - Variant7062, - Variant7063, - Variant7064, - Variant7065, - Variant7066, - Variant7067, - Variant7068, - Variant7069, - Variant7070, - Variant7071, - Variant7072, - Variant7073, - Variant7074, - Variant7075, - Variant7076, - Variant7077, - Variant7078, - Variant7079, - Variant7080, - Variant7081, - Variant7082, - Variant7083, - Variant7084, - Variant7085, - Variant7086, - Variant7087, - Variant7088, - Variant7089, - Variant7090, - Variant7091, - Variant7092, - Variant7093, - Variant7094, - Variant7095, - Variant7096, - Variant7097, - Variant7098, - Variant7099, - Variant7100, - Variant7101, - Variant7102, - Variant7103, - Variant7104, - Variant7105, - Variant7106, - Variant7107, - Variant7108, - Variant7109, - Variant7110, - Variant7111, - Variant7112, - Variant7113, - Variant7114, - Variant7115, - Variant7116, - Variant7117, - Variant7118, - Variant7119, - Variant7120, - Variant7121, - Variant7122, - Variant7123, - Variant7124, - Variant7125, - Variant7126, - Variant7127, - Variant7128, - Variant7129, - Variant7130, - Variant7131, - Variant7132, - Variant7133, - Variant7134, - Variant7135, - Variant7136, - Variant7137, - Variant7138, - Variant7139, - Variant7140, - Variant7141, - Variant7142, - Variant7143, - Variant7144, - Variant7145, - Variant7146, - Variant7147, - Variant7148, - Variant7149, - Variant7150, - Variant7151, - Variant7152, - Variant7153, - Variant7154, - Variant7155, - Variant7156, - Variant7157, - Variant7158, - Variant7159, - Variant7160, - Variant7161, - Variant7162, - Variant7163, - Variant7164, - Variant7165, - Variant7166, - Variant7167, - Variant7168, - Variant7169, - Variant7170, - Variant7171, - Variant7172, - Variant7173, - Variant7174, - Variant7175, - Variant7176, - Variant7177, - Variant7178, - Variant7179, - Variant7180, - Variant7181, - Variant7182, - Variant7183, - Variant7184, - Variant7185, - Variant7186, - Variant7187, - Variant7188, - Variant7189, - Variant7190, - Variant7191, - Variant7192, - Variant7193, - Variant7194, - Variant7195, - Variant7196, - Variant7197, - Variant7198, - Variant7199, - Variant7200, - Variant7201, - Variant7202, - Variant7203, - Variant7204, - Variant7205, - Variant7206, - Variant7207, - Variant7208, - Variant7209, - Variant7210, - Variant7211, - Variant7212, - Variant7213, - Variant7214, - Variant7215, - Variant7216, - Variant7217, - Variant7218, - Variant7219, - Variant7220, - Variant7221, - Variant7222, - Variant7223, - Variant7224, - Variant7225, - Variant7226, - Variant7227, - Variant7228, - Variant7229, - Variant7230, - Variant7231, - Variant7232, - Variant7233, - Variant7234, - Variant7235, - Variant7236, - Variant7237, - Variant7238, - Variant7239, - Variant7240, - Variant7241, - Variant7242, - Variant7243, - Variant7244, - Variant7245, - Variant7246, - Variant7247, - Variant7248, - Variant7249, - Variant7250, - Variant7251, - Variant7252, - Variant7253, - Variant7254, - Variant7255, - Variant7256, - Variant7257, - Variant7258, - Variant7259, - Variant7260, - Variant7261, - Variant7262, - Variant7263, - Variant7264, - Variant7265, - Variant7266, - Variant7267, - Variant7268, - Variant7269, - Variant7270, - Variant7271, - Variant7272, - Variant7273, - Variant7274, - Variant7275, - Variant7276, - Variant7277, - Variant7278, - Variant7279, - Variant7280, - Variant7281, - Variant7282, - Variant7283, - Variant7284, - Variant7285, - Variant7286, - Variant7287, - Variant7288, - Variant7289, - Variant7290, - Variant7291, - Variant7292, - Variant7293, - Variant7294, - Variant7295, - Variant7296, - Variant7297, - Variant7298, - Variant7299, - Variant7300, - Variant7301, - Variant7302, - Variant7303, - Variant7304, - Variant7305, - Variant7306, - Variant7307, - Variant7308, - Variant7309, - Variant7310, - Variant7311, - Variant7312, - Variant7313, - Variant7314, - Variant7315, - Variant7316, - Variant7317, - Variant7318, - Variant7319, - Variant7320, - Variant7321, - Variant7322, - Variant7323, - Variant7324, - Variant7325, - Variant7326, - Variant7327, - Variant7328, - Variant7329, - Variant7330, - Variant7331, - Variant7332, - Variant7333, - Variant7334, - Variant7335, - Variant7336, - Variant7337, - Variant7338, - Variant7339, - Variant7340, - Variant7341, - Variant7342, - Variant7343, - Variant7344, - Variant7345, - Variant7346, - Variant7347, - Variant7348, - Variant7349, - Variant7350, - Variant7351, - Variant7352, - Variant7353, - Variant7354, - Variant7355, - Variant7356, - Variant7357, - Variant7358, - Variant7359, - Variant7360, - Variant7361, - Variant7362, - Variant7363, - Variant7364, - Variant7365, - Variant7366, - Variant7367, - Variant7368, - Variant7369, - Variant7370, - Variant7371, - Variant7372, - Variant7373, - Variant7374, - Variant7375, - Variant7376, - Variant7377, - Variant7378, - Variant7379, - Variant7380, - Variant7381, - Variant7382, - Variant7383, - Variant7384, - Variant7385, - Variant7386, - Variant7387, - Variant7388, - Variant7389, - Variant7390, - Variant7391, - Variant7392, - Variant7393, - Variant7394, - Variant7395, - Variant7396, - Variant7397, - Variant7398, - Variant7399, - Variant7400, - Variant7401, - Variant7402, - Variant7403, - Variant7404, - Variant7405, - Variant7406, - Variant7407, - Variant7408, - Variant7409, - Variant7410, - Variant7411, - Variant7412, - Variant7413, - Variant7414, - Variant7415, - Variant7416, - Variant7417, - Variant7418, - Variant7419, - Variant7420, - Variant7421, - Variant7422, - Variant7423, - Variant7424, - Variant7425, - Variant7426, - Variant7427, - Variant7428, - Variant7429, - Variant7430, - Variant7431, - Variant7432, - Variant7433, - Variant7434, - Variant7435, - Variant7436, - Variant7437, - Variant7438, - Variant7439, - Variant7440, - Variant7441, - Variant7442, - Variant7443, - Variant7444, - Variant7445, - Variant7446, - Variant7447, - Variant7448, - Variant7449, - Variant7450, - Variant7451, - Variant7452, - Variant7453, - Variant7454, - Variant7455, - Variant7456, - Variant7457, - Variant7458, - Variant7459, - Variant7460, - Variant7461, - Variant7462, - Variant7463, - Variant7464, - Variant7465, - Variant7466, - Variant7467, - Variant7468, - Variant7469, - Variant7470, - Variant7471, - Variant7472, - Variant7473, - Variant7474, - Variant7475, - Variant7476, - Variant7477, - Variant7478, - Variant7479, - Variant7480, - Variant7481, - Variant7482, - Variant7483, - Variant7484, - Variant7485, - Variant7486, - Variant7487, - Variant7488, - Variant7489, - Variant7490, - Variant7491, - Variant7492, - Variant7493, - Variant7494, - Variant7495, - Variant7496, - Variant7497, - Variant7498, - Variant7499, - Variant7500, - Variant7501, - Variant7502, - Variant7503, - Variant7504, - Variant7505, - Variant7506, - Variant7507, - Variant7508, - Variant7509, - Variant7510, - Variant7511, - Variant7512, - Variant7513, - Variant7514, - Variant7515, - Variant7516, - Variant7517, - Variant7518, - Variant7519, - Variant7520, - Variant7521, - Variant7522, - Variant7523, - Variant7524, - Variant7525, - Variant7526, - Variant7527, - Variant7528, - Variant7529, - Variant7530, - Variant7531, - Variant7532, - Variant7533, - Variant7534, - Variant7535, - Variant7536, - Variant7537, - Variant7538, - Variant7539, - Variant7540, - Variant7541, - Variant7542, - Variant7543, - Variant7544, - Variant7545, - Variant7546, - Variant7547, - Variant7548, - Variant7549, - Variant7550, - Variant7551, - Variant7552, - Variant7553, - Variant7554, - Variant7555, - Variant7556, - Variant7557, - Variant7558, - Variant7559, - Variant7560, - Variant7561, - Variant7562, - Variant7563, - Variant7564, - Variant7565, - Variant7566, - Variant7567, - Variant7568, - Variant7569, - Variant7570, - Variant7571, - Variant7572, - Variant7573, - Variant7574, - Variant7575, - Variant7576, - Variant7577, - Variant7578, - Variant7579, - Variant7580, - Variant7581, - Variant7582, - Variant7583, - Variant7584, - Variant7585, - Variant7586, - Variant7587, - Variant7588, - Variant7589, - Variant7590, - Variant7591, - Variant7592, - Variant7593, - Variant7594, - Variant7595, - Variant7596, - Variant7597, - Variant7598, - Variant7599, - Variant7600, - Variant7601, - Variant7602, - Variant7603, - Variant7604, - Variant7605, - Variant7606, - Variant7607, - Variant7608, - Variant7609, - Variant7610, - Variant7611, - Variant7612, - Variant7613, - Variant7614, - Variant7615, - Variant7616, - Variant7617, - Variant7618, - Variant7619, - Variant7620, - Variant7621, - Variant7622, - Variant7623, - Variant7624, - Variant7625, - Variant7626, - Variant7627, - Variant7628, - Variant7629, - Variant7630, - Variant7631, - Variant7632, - Variant7633, - Variant7634, - Variant7635, - Variant7636, - Variant7637, - Variant7638, - Variant7639, - Variant7640, - Variant7641, - Variant7642, - Variant7643, - Variant7644, - Variant7645, - Variant7646, - Variant7647, - Variant7648, - Variant7649, - Variant7650, - Variant7651, - Variant7652, - Variant7653, - Variant7654, - Variant7655, - Variant7656, - Variant7657, - Variant7658, - Variant7659, - Variant7660, - Variant7661, - Variant7662, - Variant7663, - Variant7664, - Variant7665, - Variant7666, - Variant7667, - Variant7668, - Variant7669, - Variant7670, - Variant7671, - Variant7672, - Variant7673, - Variant7674, - Variant7675, - Variant7676, - Variant7677, - Variant7678, - Variant7679, - Variant7680, - Variant7681, - Variant7682, - Variant7683, - Variant7684, - Variant7685, - Variant7686, - Variant7687, - Variant7688, - Variant7689, - Variant7690, - Variant7691, - Variant7692, - Variant7693, - Variant7694, - Variant7695, - Variant7696, - Variant7697, - Variant7698, - Variant7699, - Variant7700, - Variant7701, - Variant7702, - Variant7703, - Variant7704, - Variant7705, - Variant7706, - Variant7707, - Variant7708, - Variant7709, - Variant7710, - Variant7711, - Variant7712, - Variant7713, - Variant7714, - Variant7715, - Variant7716, - Variant7717, - Variant7718, - Variant7719, - Variant7720, - Variant7721, - Variant7722, - Variant7723, - Variant7724, - Variant7725, - Variant7726, - Variant7727, - Variant7728, - Variant7729, - Variant7730, - Variant7731, - Variant7732, - Variant7733, - Variant7734, - Variant7735, - Variant7736, - Variant7737, - Variant7738, - Variant7739, - Variant7740, - Variant7741, - Variant7742, - Variant7743, - Variant7744, - Variant7745, - Variant7746, - Variant7747, - Variant7748, - Variant7749, - Variant7750, - Variant7751, - Variant7752, - Variant7753, - Variant7754, - Variant7755, - Variant7756, - Variant7757, - Variant7758, - Variant7759, - Variant7760, - Variant7761, - Variant7762, - Variant7763, - Variant7764, - Variant7765, - Variant7766, - Variant7767, - Variant7768, - Variant7769, - Variant7770, - Variant7771, - Variant7772, - Variant7773, - Variant7774, - Variant7775, - Variant7776, - Variant7777, - Variant7778, - Variant7779, - Variant7780, - Variant7781, - Variant7782, - Variant7783, - Variant7784, - Variant7785, - Variant7786, - Variant7787, - Variant7788, - Variant7789, - Variant7790, - Variant7791, - Variant7792, - Variant7793, - Variant7794, - Variant7795, - Variant7796, - Variant7797, - Variant7798, - Variant7799, - Variant7800, - Variant7801, - Variant7802, - Variant7803, - Variant7804, - Variant7805, - Variant7806, - Variant7807, - Variant7808, - Variant7809, - Variant7810, - Variant7811, - Variant7812, - Variant7813, - Variant7814, - Variant7815, - Variant7816, - Variant7817, - Variant7818, - Variant7819, - Variant7820, - Variant7821, - Variant7822, - Variant7823, - Variant7824, - Variant7825, - Variant7826, - Variant7827, - Variant7828, - Variant7829, - Variant7830, - Variant7831, - Variant7832, - Variant7833, - Variant7834, - Variant7835, - Variant7836, - Variant7837, - Variant7838, - Variant7839, - Variant7840, - Variant7841, - Variant7842, - Variant7843, - Variant7844, - Variant7845, - Variant7846, - Variant7847, - Variant7848, - Variant7849, - Variant7850, - Variant7851, - Variant7852, - Variant7853, - Variant7854, - Variant7855, - Variant7856, - Variant7857, - Variant7858, - Variant7859, - Variant7860, - Variant7861, - Variant7862, - Variant7863, - Variant7864, - Variant7865, - Variant7866, - Variant7867, - Variant7868, - Variant7869, - Variant7870, - Variant7871, - Variant7872, - Variant7873, - Variant7874, - Variant7875, - Variant7876, - Variant7877, - Variant7878, - Variant7879, - Variant7880, - Variant7881, - Variant7882, - Variant7883, - Variant7884, - Variant7885, - Variant7886, - Variant7887, - Variant7888, - Variant7889, - Variant7890, - Variant7891, - Variant7892, - Variant7893, - Variant7894, - Variant7895, - Variant7896, - Variant7897, - Variant7898, - Variant7899, - Variant7900, - Variant7901, - Variant7902, - Variant7903, - Variant7904, - Variant7905, - Variant7906, - Variant7907, - Variant7908, - Variant7909, - Variant7910, - Variant7911, - Variant7912, - Variant7913, - Variant7914, - Variant7915, - Variant7916, - Variant7917, - Variant7918, - Variant7919, - Variant7920, - Variant7921, - Variant7922, - Variant7923, - Variant7924, - Variant7925, - Variant7926, - Variant7927, - Variant7928, - Variant7929, - Variant7930, - Variant7931, - Variant7932, - Variant7933, - Variant7934, - Variant7935, - Variant7936, - Variant7937, - Variant7938, - Variant7939, - Variant7940, - Variant7941, - Variant7942, - Variant7943, - Variant7944, - Variant7945, - Variant7946, - Variant7947, - Variant7948, - Variant7949, - Variant7950, - Variant7951, - Variant7952, - Variant7953, - Variant7954, - Variant7955, - Variant7956, - Variant7957, - Variant7958, - Variant7959, - Variant7960, - Variant7961, - Variant7962, - Variant7963, - Variant7964, - Variant7965, - Variant7966, - Variant7967, - Variant7968, - Variant7969, - Variant7970, - Variant7971, - Variant7972, - Variant7973, - Variant7974, - Variant7975, - Variant7976, - Variant7977, - Variant7978, - Variant7979, - Variant7980, - Variant7981, - Variant7982, - Variant7983, - Variant7984, - Variant7985, - Variant7986, - Variant7987, - Variant7988, - Variant7989, - Variant7990, - Variant7991, - Variant7992, - Variant7993, - Variant7994, - Variant7995, - Variant7996, - Variant7997, - Variant7998, - Variant7999, - Variant8000, - Variant8001, - Variant8002, - Variant8003, - Variant8004, - Variant8005, - Variant8006, - Variant8007, - Variant8008, - Variant8009, - Variant8010, - Variant8011, - Variant8012, - Variant8013, - Variant8014, - Variant8015, - Variant8016, - Variant8017, - Variant8018, - Variant8019, - Variant8020, - Variant8021, - Variant8022, - Variant8023, - Variant8024, - Variant8025, - Variant8026, - Variant8027, - Variant8028, - Variant8029, - Variant8030, - Variant8031, - Variant8032, - Variant8033, - Variant8034, - Variant8035, - Variant8036, - Variant8037, - Variant8038, - Variant8039, - Variant8040, - Variant8041, - Variant8042, - Variant8043, - Variant8044, - Variant8045, - Variant8046, - Variant8047, - Variant8048, - Variant8049, - Variant8050, - Variant8051, - Variant8052, - Variant8053, - Variant8054, - Variant8055, - Variant8056, - Variant8057, - Variant8058, - Variant8059, - Variant8060, - Variant8061, - Variant8062, - Variant8063, - Variant8064, - Variant8065, - Variant8066, - Variant8067, - Variant8068, - Variant8069, - Variant8070, - Variant8071, - Variant8072, - Variant8073, - Variant8074, - Variant8075, - Variant8076, - Variant8077, - Variant8078, - Variant8079, - Variant8080, - Variant8081, - Variant8082, - Variant8083, - Variant8084, - Variant8085, - Variant8086, - Variant8087, - Variant8088, - Variant8089, - Variant8090, - Variant8091, - Variant8092, - Variant8093, - Variant8094, - Variant8095, - Variant8096, - Variant8097, - Variant8098, - Variant8099, - Variant8100, - Variant8101, - Variant8102, - Variant8103, - Variant8104, - Variant8105, - Variant8106, - Variant8107, - Variant8108, - Variant8109, - Variant8110, - Variant8111, - Variant8112, - Variant8113, - Variant8114, - Variant8115, - Variant8116, - Variant8117, - Variant8118, - Variant8119, - Variant8120, - Variant8121, - Variant8122, - Variant8123, - Variant8124, - Variant8125, - Variant8126, - Variant8127, - Variant8128, - Variant8129, - Variant8130, - Variant8131, - Variant8132, - Variant8133, - Variant8134, - Variant8135, - Variant8136, - Variant8137, - Variant8138, - Variant8139, - Variant8140, - Variant8141, - Variant8142, - Variant8143, - Variant8144, - Variant8145, - Variant8146, - Variant8147, - Variant8148, - Variant8149, - Variant8150, - Variant8151, - Variant8152, - Variant8153, - Variant8154, - Variant8155, - Variant8156, - Variant8157, - Variant8158, - Variant8159, - Variant8160, - Variant8161, - Variant8162, - Variant8163, - Variant8164, - Variant8165, - Variant8166, - Variant8167, - Variant8168, - Variant8169, - Variant8170, - Variant8171, - Variant8172, - Variant8173, - Variant8174, - Variant8175, - Variant8176, - Variant8177, - Variant8178, - Variant8179, - Variant8180, - Variant8181, - Variant8182, - Variant8183, - Variant8184, - Variant8185, - Variant8186, - Variant8187, - Variant8188, - Variant8189, - Variant8190, - Variant8191, - Variant8192, - Variant8193, - Variant8194, - Variant8195, - Variant8196, - Variant8197, - Variant8198, - Variant8199, - Variant8200, - Variant8201, - Variant8202, - Variant8203, - Variant8204, - Variant8205, - Variant8206, - Variant8207, - Variant8208, - Variant8209, - Variant8210, - Variant8211, - Variant8212, - Variant8213, - Variant8214, - Variant8215, - Variant8216, - Variant8217, - Variant8218, - Variant8219, - Variant8220, - Variant8221, - Variant8222, - Variant8223, - Variant8224, - Variant8225, - Variant8226, - Variant8227, - Variant8228, - Variant8229, - Variant8230, - Variant8231, - Variant8232, - Variant8233, - Variant8234, - Variant8235, - Variant8236, - Variant8237, - Variant8238, - Variant8239, - Variant8240, - Variant8241, - Variant8242, - Variant8243, - Variant8244, - Variant8245, - Variant8246, - Variant8247, - Variant8248, - Variant8249, - Variant8250, - Variant8251, - Variant8252, - Variant8253, - Variant8254, - Variant8255, - Variant8256, - Variant8257, - Variant8258, - Variant8259, - Variant8260, - Variant8261, - Variant8262, - Variant8263, - Variant8264, - Variant8265, - Variant8266, - Variant8267, - Variant8268, - Variant8269, - Variant8270, - Variant8271, - Variant8272, - Variant8273, - Variant8274, - Variant8275, - Variant8276, - Variant8277, - Variant8278, - Variant8279, - Variant8280, - Variant8281, - Variant8282, - Variant8283, - Variant8284, - Variant8285, - Variant8286, - Variant8287, - Variant8288, - Variant8289, - Variant8290, - Variant8291, - Variant8292, - Variant8293, - Variant8294, - Variant8295, - Variant8296, - Variant8297, - Variant8298, - Variant8299, - Variant8300, - Variant8301, - Variant8302, - Variant8303, - Variant8304, - Variant8305, - Variant8306, - Variant8307, - Variant8308, - Variant8309, - Variant8310, - Variant8311, - Variant8312, - Variant8313, - Variant8314, - Variant8315, - Variant8316, - Variant8317, - Variant8318, - Variant8319, - Variant8320, - Variant8321, - Variant8322, - Variant8323, - Variant8324, - Variant8325, - Variant8326, - Variant8327, - Variant8328, - Variant8329, - Variant8330, - Variant8331, - Variant8332, - Variant8333, - Variant8334, - Variant8335, - Variant8336, - Variant8337, - Variant8338, - Variant8339, - Variant8340, - Variant8341, - Variant8342, - Variant8343, - Variant8344, - Variant8345, - Variant8346, - Variant8347, - Variant8348, - Variant8349, - Variant8350, - Variant8351, - Variant8352, - Variant8353, - Variant8354, - Variant8355, - Variant8356, - Variant8357, - Variant8358, - Variant8359, - Variant8360, - Variant8361, - Variant8362, - Variant8363, - Variant8364, - Variant8365, - Variant8366, - Variant8367, - Variant8368, - Variant8369, - Variant8370, - Variant8371, - Variant8372, - Variant8373, - Variant8374, - Variant8375, - Variant8376, - Variant8377, - Variant8378, - Variant8379, - Variant8380, - Variant8381, - Variant8382, - Variant8383, - Variant8384, - Variant8385, - Variant8386, - Variant8387, - Variant8388, - Variant8389, - Variant8390, - Variant8391, - Variant8392, - Variant8393, - Variant8394, - Variant8395, - Variant8396, - Variant8397, - Variant8398, - Variant8399, - Variant8400, - Variant8401, - Variant8402, - Variant8403, - Variant8404, - Variant8405, - Variant8406, - Variant8407, - Variant8408, - Variant8409, - Variant8410, - Variant8411, - Variant8412, - Variant8413, - Variant8414, - Variant8415, - Variant8416, - Variant8417, - Variant8418, - Variant8419, - Variant8420, - Variant8421, - Variant8422, - Variant8423, - Variant8424, - Variant8425, - Variant8426, - Variant8427, - Variant8428, - Variant8429, - Variant8430, - Variant8431, - Variant8432, - Variant8433, - Variant8434, - Variant8435, - Variant8436, - Variant8437, - Variant8438, - Variant8439, - Variant8440, - Variant8441, - Variant8442, - Variant8443, - Variant8444, - Variant8445, - Variant8446, - Variant8447, - Variant8448, - Variant8449, - Variant8450, - Variant8451, - Variant8452, - Variant8453, - Variant8454, - Variant8455, - Variant8456, - Variant8457, - Variant8458, - Variant8459, - Variant8460, - Variant8461, - Variant8462, - Variant8463, - Variant8464, - Variant8465, - Variant8466, - Variant8467, - Variant8468, - Variant8469, - Variant8470, - Variant8471, - Variant8472, - Variant8473, - Variant8474, - Variant8475, - Variant8476, - Variant8477, - Variant8478, - Variant8479, - Variant8480, - Variant8481, - Variant8482, - Variant8483, - Variant8484, - Variant8485, - Variant8486, - Variant8487, - Variant8488, - Variant8489, - Variant8490, - Variant8491, - Variant8492, - Variant8493, - Variant8494, - Variant8495, - Variant8496, - Variant8497, - Variant8498, - Variant8499, - Variant8500, - Variant8501, - Variant8502, - Variant8503, - Variant8504, - Variant8505, - Variant8506, - Variant8507, - Variant8508, - Variant8509, - Variant8510, - Variant8511, - Variant8512, - Variant8513, - Variant8514, - Variant8515, - Variant8516, - Variant8517, - Variant8518, - Variant8519, - Variant8520, - Variant8521, - Variant8522, - Variant8523, - Variant8524, - Variant8525, - Variant8526, - Variant8527, - Variant8528, - Variant8529, - Variant8530, - Variant8531, - Variant8532, - Variant8533, - Variant8534, - Variant8535, - Variant8536, - Variant8537, - Variant8538, - Variant8539, - Variant8540, - Variant8541, - Variant8542, - Variant8543, - Variant8544, - Variant8545, - Variant8546, - Variant8547, - Variant8548, - Variant8549, - Variant8550, - Variant8551, - Variant8552, - Variant8553, - Variant8554, - Variant8555, - Variant8556, - Variant8557, - Variant8558, - Variant8559, - Variant8560, - Variant8561, - Variant8562, - Variant8563, - Variant8564, - Variant8565, - Variant8566, - Variant8567, - Variant8568, - Variant8569, - Variant8570, - Variant8571, - Variant8572, - Variant8573, - Variant8574, - Variant8575, - Variant8576, - Variant8577, - Variant8578, - Variant8579, - Variant8580, - Variant8581, - Variant8582, - Variant8583, - Variant8584, - Variant8585, - Variant8586, - Variant8587, - Variant8588, - Variant8589, - Variant8590, - Variant8591, - Variant8592, - Variant8593, - Variant8594, - Variant8595, - Variant8596, - Variant8597, - Variant8598, - Variant8599, - Variant8600, - Variant8601, - Variant8602, - Variant8603, - Variant8604, - Variant8605, - Variant8606, - Variant8607, - Variant8608, - Variant8609, - Variant8610, - Variant8611, - Variant8612, - Variant8613, - Variant8614, - Variant8615, - Variant8616, - Variant8617, - Variant8618, - Variant8619, - Variant8620, - Variant8621, - Variant8622, - Variant8623, - Variant8624, - Variant8625, - Variant8626, - Variant8627, - Variant8628, - Variant8629, - Variant8630, - Variant8631, - Variant8632, - Variant8633, - Variant8634, - Variant8635, - Variant8636, - Variant8637, - Variant8638, - Variant8639, - Variant8640, - Variant8641, - Variant8642, - Variant8643, - Variant8644, - Variant8645, - Variant8646, - Variant8647, - Variant8648, - Variant8649, - Variant8650, - Variant8651, - Variant8652, - Variant8653, - Variant8654, - Variant8655, - Variant8656, - Variant8657, - Variant8658, - Variant8659, - Variant8660, - Variant8661, - Variant8662, - Variant8663, - Variant8664, - Variant8665, - Variant8666, - Variant8667, - Variant8668, - Variant8669, - Variant8670, - Variant8671, - Variant8672, - Variant8673, - Variant8674, - Variant8675, - Variant8676, - Variant8677, - Variant8678, - Variant8679, - Variant8680, - Variant8681, - Variant8682, - Variant8683, - Variant8684, - Variant8685, - Variant8686, - Variant8687, - Variant8688, - Variant8689, - Variant8690, - Variant8691, - Variant8692, - Variant8693, - Variant8694, - Variant8695, - Variant8696, - Variant8697, - Variant8698, - Variant8699, - Variant8700, - Variant8701, - Variant8702, - Variant8703, - Variant8704, - Variant8705, - Variant8706, - Variant8707, - Variant8708, - Variant8709, - Variant8710, - Variant8711, - Variant8712, - Variant8713, - Variant8714, - Variant8715, - Variant8716, - Variant8717, - Variant8718, - Variant8719, - Variant8720, - Variant8721, - Variant8722, - Variant8723, - Variant8724, - Variant8725, - Variant8726, - Variant8727, - Variant8728, - Variant8729, - Variant8730, - Variant8731, - Variant8732, - Variant8733, - Variant8734, - Variant8735, - Variant8736, - Variant8737, - Variant8738, - Variant8739, - Variant8740, - Variant8741, - Variant8742, - Variant8743, - Variant8744, - Variant8745, - Variant8746, - Variant8747, - Variant8748, - Variant8749, - Variant8750, - Variant8751, - Variant8752, - Variant8753, - Variant8754, - Variant8755, - Variant8756, - Variant8757, - Variant8758, - Variant8759, - Variant8760, - Variant8761, - Variant8762, - Variant8763, - Variant8764, - Variant8765, - Variant8766, - Variant8767, - Variant8768, - Variant8769, - Variant8770, - Variant8771, - Variant8772, - Variant8773, - Variant8774, - Variant8775, - Variant8776, - Variant8777, - Variant8778, - Variant8779, - Variant8780, - Variant8781, - Variant8782, - Variant8783, - Variant8784, - Variant8785, - Variant8786, - Variant8787, - Variant8788, - Variant8789, - Variant8790, - Variant8791, - Variant8792, - Variant8793, - Variant8794, - Variant8795, - Variant8796, - Variant8797, - Variant8798, - Variant8799, - Variant8800, - Variant8801, - Variant8802, - Variant8803, - Variant8804, - Variant8805, - Variant8806, - Variant8807, - Variant8808, - Variant8809, - Variant8810, - Variant8811, - Variant8812, - Variant8813, - Variant8814, - Variant8815, - Variant8816, - Variant8817, - Variant8818, - Variant8819, - Variant8820, - Variant8821, - Variant8822, - Variant8823, - Variant8824, - Variant8825, - Variant8826, - Variant8827, - Variant8828, - Variant8829, - Variant8830, - Variant8831, - Variant8832, - Variant8833, - Variant8834, - Variant8835, - Variant8836, - Variant8837, - Variant8838, - Variant8839, - Variant8840, - Variant8841, - Variant8842, - Variant8843, - Variant8844, - Variant8845, - Variant8846, - Variant8847, - Variant8848, - Variant8849, - Variant8850, - Variant8851, - Variant8852, - Variant8853, - Variant8854, - Variant8855, - Variant8856, - Variant8857, - Variant8858, - Variant8859, - Variant8860, - Variant8861, - Variant8862, - Variant8863, - Variant8864, - Variant8865, - Variant8866, - Variant8867, - Variant8868, - Variant8869, - Variant8870, - Variant8871, - Variant8872, - Variant8873, - Variant8874, - Variant8875, - Variant8876, - Variant8877, - Variant8878, - Variant8879, - Variant8880, - Variant8881, - Variant8882, - Variant8883, - Variant8884, - Variant8885, - Variant8886, - Variant8887, - Variant8888, - Variant8889, - Variant8890, - Variant8891, - Variant8892, - Variant8893, - Variant8894, - Variant8895, - Variant8896, - Variant8897, - Variant8898, - Variant8899, - Variant8900, - Variant8901, - Variant8902, - Variant8903, - Variant8904, - Variant8905, - Variant8906, - Variant8907, - Variant8908, - Variant8909, - Variant8910, - Variant8911, - Variant8912, - Variant8913, - Variant8914, - Variant8915, - Variant8916, - Variant8917, - Variant8918, - Variant8919, - Variant8920, - Variant8921, - Variant8922, - Variant8923, - Variant8924, - Variant8925, - Variant8926, - Variant8927, - Variant8928, - Variant8929, - Variant8930, - Variant8931, - Variant8932, - Variant8933, - Variant8934, - Variant8935, - Variant8936, - Variant8937, - Variant8938, - Variant8939, - Variant8940, - Variant8941, - Variant8942, - Variant8943, - Variant8944, - Variant8945, - Variant8946, - Variant8947, - Variant8948, - Variant8949, - Variant8950, - Variant8951, - Variant8952, - Variant8953, - Variant8954, - Variant8955, - Variant8956, - Variant8957, - Variant8958, - Variant8959, - Variant8960, - Variant8961, - Variant8962, - Variant8963, - Variant8964, - Variant8965, - Variant8966, - Variant8967, - Variant8968, - Variant8969, - Variant8970, - Variant8971, - Variant8972, - Variant8973, - Variant8974, - Variant8975, - Variant8976, - Variant8977, - Variant8978, - Variant8979, - Variant8980, - Variant8981, - Variant8982, - Variant8983, - Variant8984, - Variant8985, - Variant8986, - Variant8987, - Variant8988, - Variant8989, - Variant8990, - Variant8991, - Variant8992, - Variant8993, - Variant8994, - Variant8995, - Variant8996, - Variant8997, - Variant8998, - Variant8999, - Variant9000, - Variant9001, - Variant9002, - Variant9003, - Variant9004, - Variant9005, - Variant9006, - Variant9007, - Variant9008, - Variant9009, - Variant9010, - Variant9011, - Variant9012, - Variant9013, - Variant9014, - Variant9015, - Variant9016, - Variant9017, - Variant9018, - Variant9019, - Variant9020, - Variant9021, - Variant9022, - Variant9023, - Variant9024, - Variant9025, - Variant9026, - Variant9027, - Variant9028, - Variant9029, - Variant9030, - Variant9031, - Variant9032, - Variant9033, - Variant9034, - Variant9035, - Variant9036, - Variant9037, - Variant9038, - Variant9039, - Variant9040, - Variant9041, - Variant9042, - Variant9043, - Variant9044, - Variant9045, - Variant9046, - Variant9047, - Variant9048, - Variant9049, - Variant9050, - Variant9051, - Variant9052, - Variant9053, - Variant9054, - Variant9055, - Variant9056, - Variant9057, - Variant9058, - Variant9059, - Variant9060, - Variant9061, - Variant9062, - Variant9063, - Variant9064, - Variant9065, - Variant9066, - Variant9067, - Variant9068, - Variant9069, - Variant9070, - Variant9071, - Variant9072, - Variant9073, - Variant9074, - Variant9075, - Variant9076, - Variant9077, - Variant9078, - Variant9079, - Variant9080, - Variant9081, - Variant9082, - Variant9083, - Variant9084, - Variant9085, - Variant9086, - Variant9087, - Variant9088, - Variant9089, - Variant9090, - Variant9091, - Variant9092, - Variant9093, - Variant9094, - Variant9095, - Variant9096, - Variant9097, - Variant9098, - Variant9099, - Variant9100, - Variant9101, - Variant9102, - Variant9103, - Variant9104, - Variant9105, - Variant9106, - Variant9107, - Variant9108, - Variant9109, - Variant9110, - Variant9111, - Variant9112, - Variant9113, - Variant9114, - Variant9115, - Variant9116, - Variant9117, - Variant9118, - Variant9119, - Variant9120, - Variant9121, - Variant9122, - Variant9123, - Variant9124, - Variant9125, - Variant9126, - Variant9127, - Variant9128, - Variant9129, - Variant9130, - Variant9131, - Variant9132, - Variant9133, - Variant9134, - Variant9135, - Variant9136, - Variant9137, - Variant9138, - Variant9139, - Variant9140, - Variant9141, - Variant9142, - Variant9143, - Variant9144, - Variant9145, - Variant9146, - Variant9147, - Variant9148, - Variant9149, - Variant9150, - Variant9151, - Variant9152, - Variant9153, - Variant9154, - Variant9155, - Variant9156, - Variant9157, - Variant9158, - Variant9159, - Variant9160, - Variant9161, - Variant9162, - Variant9163, - Variant9164, - Variant9165, - Variant9166, - Variant9167, - Variant9168, - Variant9169, - Variant9170, - Variant9171, - Variant9172, - Variant9173, - Variant9174, - Variant9175, - Variant9176, - Variant9177, - Variant9178, - Variant9179, - Variant9180, - Variant9181, - Variant9182, - Variant9183, - Variant9184, - Variant9185, - Variant9186, - Variant9187, - Variant9188, - Variant9189, - Variant9190, - Variant9191, - Variant9192, - Variant9193, - Variant9194, - Variant9195, - Variant9196, - Variant9197, - Variant9198, - Variant9199, - Variant9200, - Variant9201, - Variant9202, - Variant9203, - Variant9204, - Variant9205, - Variant9206, - Variant9207, - Variant9208, - Variant9209, - Variant9210, - Variant9211, - Variant9212, - Variant9213, - Variant9214, - Variant9215, - Variant9216, - Variant9217, - Variant9218, - Variant9219, - Variant9220, - Variant9221, - Variant9222, - Variant9223, - Variant9224, - Variant9225, - Variant9226, - Variant9227, - Variant9228, - Variant9229, - Variant9230, - Variant9231, - Variant9232, - Variant9233, - Variant9234, - Variant9235, - Variant9236, - Variant9237, - Variant9238, - Variant9239, - Variant9240, - Variant9241, - Variant9242, - Variant9243, - Variant9244, - Variant9245, - Variant9246, - Variant9247, - Variant9248, - Variant9249, - Variant9250, - Variant9251, - Variant9252, - Variant9253, - Variant9254, - Variant9255, - Variant9256, - Variant9257, - Variant9258, - Variant9259, - Variant9260, - Variant9261, - Variant9262, - Variant9263, - Variant9264, - Variant9265, - Variant9266, - Variant9267, - Variant9268, - Variant9269, - Variant9270, - Variant9271, - Variant9272, - Variant9273, - Variant9274, - Variant9275, - Variant9276, - Variant9277, - Variant9278, - Variant9279, - Variant9280, - Variant9281, - Variant9282, - Variant9283, - Variant9284, - Variant9285, - Variant9286, - Variant9287, - Variant9288, - Variant9289, - Variant9290, - Variant9291, - Variant9292, - Variant9293, - Variant9294, - Variant9295, - Variant9296, - Variant9297, - Variant9298, - Variant9299, - Variant9300, - Variant9301, - Variant9302, - Variant9303, - Variant9304, - Variant9305, - Variant9306, - Variant9307, - Variant9308, - Variant9309, - Variant9310, - Variant9311, - Variant9312, - Variant9313, - Variant9314, - Variant9315, - Variant9316, - Variant9317, - Variant9318, - Variant9319, - Variant9320, - Variant9321, - Variant9322, - Variant9323, - Variant9324, - Variant9325, - Variant9326, - Variant9327, - Variant9328, - Variant9329, - Variant9330, - Variant9331, - Variant9332, - Variant9333, - Variant9334, - Variant9335, - Variant9336, - Variant9337, - Variant9338, - Variant9339, - Variant9340, - Variant9341, - Variant9342, - Variant9343, - Variant9344, - Variant9345, - Variant9346, - Variant9347, - Variant9348, - Variant9349, - Variant9350, - Variant9351, - Variant9352, - Variant9353, - Variant9354, - Variant9355, - Variant9356, - Variant9357, - Variant9358, - Variant9359, - Variant9360, - Variant9361, - Variant9362, - Variant9363, - Variant9364, - Variant9365, - Variant9366, - Variant9367, - Variant9368, - Variant9369, - Variant9370, - Variant9371, - Variant9372, - Variant9373, - Variant9374, - Variant9375, - Variant9376, - Variant9377, - Variant9378, - Variant9379, - Variant9380, - Variant9381, - Variant9382, - Variant9383, - Variant9384, - Variant9385, - Variant9386, - Variant9387, - Variant9388, - Variant9389, - Variant9390, - Variant9391, - Variant9392, - Variant9393, - Variant9394, - Variant9395, - Variant9396, - Variant9397, - Variant9398, - Variant9399, - Variant9400, - Variant9401, - Variant9402, - Variant9403, - Variant9404, - Variant9405, - Variant9406, - Variant9407, - Variant9408, - Variant9409, - Variant9410, - Variant9411, - Variant9412, - Variant9413, - Variant9414, - Variant9415, - Variant9416, - Variant9417, - Variant9418, - Variant9419, - Variant9420, - Variant9421, - Variant9422, - Variant9423, - Variant9424, - Variant9425, - Variant9426, - Variant9427, - Variant9428, - Variant9429, - Variant9430, - Variant9431, - Variant9432, - Variant9433, - Variant9434, - Variant9435, - Variant9436, - Variant9437, - Variant9438, - Variant9439, - Variant9440, - Variant9441, - Variant9442, - Variant9443, - Variant9444, - Variant9445, - Variant9446, - Variant9447, - Variant9448, - Variant9449, - Variant9450, - Variant9451, - Variant9452, - Variant9453, - Variant9454, - Variant9455, - Variant9456, - Variant9457, - Variant9458, - Variant9459, - Variant9460, - Variant9461, - Variant9462, - Variant9463, - Variant9464, - Variant9465, - Variant9466, - Variant9467, - Variant9468, - Variant9469, - Variant9470, - Variant9471, - Variant9472, - Variant9473, - Variant9474, - Variant9475, - Variant9476, - Variant9477, - Variant9478, - Variant9479, - Variant9480, - Variant9481, - Variant9482, - Variant9483, - Variant9484, - Variant9485, - Variant9486, - Variant9487, - Variant9488, - Variant9489, - Variant9490, - Variant9491, - Variant9492, - Variant9493, - Variant9494, - Variant9495, - Variant9496, - Variant9497, - Variant9498, - Variant9499, - Variant9500, - Variant9501, - Variant9502, - Variant9503, - Variant9504, - Variant9505, - Variant9506, - Variant9507, - Variant9508, - Variant9509, - Variant9510, - Variant9511, - Variant9512, - Variant9513, - Variant9514, - Variant9515, - Variant9516, - Variant9517, - Variant9518, - Variant9519, - Variant9520, - Variant9521, - Variant9522, - Variant9523, - Variant9524, - Variant9525, - Variant9526, - Variant9527, - Variant9528, - Variant9529, - Variant9530, - Variant9531, - Variant9532, - Variant9533, - Variant9534, - Variant9535, - Variant9536, - Variant9537, - Variant9538, - Variant9539, - Variant9540, - Variant9541, - Variant9542, - Variant9543, - Variant9544, - Variant9545, - Variant9546, - Variant9547, - Variant9548, - Variant9549, - Variant9550, - Variant9551, - Variant9552, - Variant9553, - Variant9554, - Variant9555, - Variant9556, - Variant9557, - Variant9558, - Variant9559, - Variant9560, - Variant9561, - Variant9562, - Variant9563, - Variant9564, - Variant9565, - Variant9566, - Variant9567, - Variant9568, - Variant9569, - Variant9570, - Variant9571, - Variant9572, - Variant9573, - Variant9574, - Variant9575, - Variant9576, - Variant9577, - Variant9578, - Variant9579, - Variant9580, - Variant9581, - Variant9582, - Variant9583, - Variant9584, - Variant9585, - Variant9586, - Variant9587, - Variant9588, - Variant9589, - Variant9590, - Variant9591, - Variant9592, - Variant9593, - Variant9594, - Variant9595, - Variant9596, - Variant9597, - Variant9598, - Variant9599, - Variant9600, - Variant9601, - Variant9602, - Variant9603, - Variant9604, - Variant9605, - Variant9606, - Variant9607, - Variant9608, - Variant9609, - Variant9610, - Variant9611, - Variant9612, - Variant9613, - Variant9614, - Variant9615, - Variant9616, - Variant9617, - Variant9618, - Variant9619, - Variant9620, - Variant9621, - Variant9622, - Variant9623, - Variant9624, - Variant9625, - Variant9626, - Variant9627, - Variant9628, - Variant9629, - Variant9630, - Variant9631, - Variant9632, - Variant9633, - Variant9634, - Variant9635, - Variant9636, - Variant9637, - Variant9638, - Variant9639, - Variant9640, - Variant9641, - Variant9642, - Variant9643, - Variant9644, - Variant9645, - Variant9646, - Variant9647, - Variant9648, - Variant9649, - Variant9650, - Variant9651, - Variant9652, - Variant9653, - Variant9654, - Variant9655, - Variant9656, - Variant9657, - Variant9658, - Variant9659, - Variant9660, - Variant9661, - Variant9662, - Variant9663, - Variant9664, - Variant9665, - Variant9666, - Variant9667, - Variant9668, - Variant9669, - Variant9670, - Variant9671, - Variant9672, - Variant9673, - Variant9674, - Variant9675, - Variant9676, - Variant9677, - Variant9678, - Variant9679, - Variant9680, - Variant9681, - Variant9682, - Variant9683, - Variant9684, - Variant9685, - Variant9686, - Variant9687, - Variant9688, - Variant9689, - Variant9690, - Variant9691, - Variant9692, - Variant9693, - Variant9694, - Variant9695, - Variant9696, - Variant9697, - Variant9698, - Variant9699, - Variant9700, - Variant9701, - Variant9702, - Variant9703, - Variant9704, - Variant9705, - Variant9706, - Variant9707, - Variant9708, - Variant9709, - Variant9710, - Variant9711, - Variant9712, - Variant9713, - Variant9714, - Variant9715, - Variant9716, - Variant9717, - Variant9718, - Variant9719, - Variant9720, - Variant9721, - Variant9722, - Variant9723, - Variant9724, - Variant9725, - Variant9726, - Variant9727, - Variant9728, - Variant9729, - Variant9730, - Variant9731, - Variant9732, - Variant9733, - Variant9734, - Variant9735, - Variant9736, - Variant9737, - Variant9738, - Variant9739, - Variant9740, - Variant9741, - Variant9742, - Variant9743, - Variant9744, - Variant9745, - Variant9746, - Variant9747, - Variant9748, - Variant9749, - Variant9750, - Variant9751, - Variant9752, - Variant9753, - Variant9754, - Variant9755, - Variant9756, - Variant9757, - Variant9758, - Variant9759, - Variant9760, - Variant9761, - Variant9762, - Variant9763, - Variant9764, - Variant9765, - Variant9766, - Variant9767, - Variant9768, - Variant9769, - Variant9770, - Variant9771, - Variant9772, - Variant9773, - Variant9774, - Variant9775, - Variant9776, - Variant9777, - Variant9778, - Variant9779, - Variant9780, - Variant9781, - Variant9782, - Variant9783, - Variant9784, - Variant9785, - Variant9786, - Variant9787, - Variant9788, - Variant9789, - Variant9790, - Variant9791, - Variant9792, - Variant9793, - Variant9794, - Variant9795, - Variant9796, - Variant9797, - Variant9798, - Variant9799, - Variant9800, - Variant9801, - Variant9802, - Variant9803, - Variant9804, - Variant9805, - Variant9806, - Variant9807, - Variant9808, - Variant9809, - Variant9810, - Variant9811, - Variant9812, - Variant9813, - Variant9814, - Variant9815, - Variant9816, - Variant9817, - Variant9818, - Variant9819, - Variant9820, - Variant9821, - Variant9822, - Variant9823, - Variant9824, - Variant9825, - Variant9826, - Variant9827, - Variant9828, - Variant9829, - Variant9830, - Variant9831, - Variant9832, - Variant9833, - Variant9834, - Variant9835, - Variant9836, - Variant9837, - Variant9838, - Variant9839, - Variant9840, - Variant9841, - Variant9842, - Variant9843, - Variant9844, - Variant9845, - Variant9846, - Variant9847, - Variant9848, - Variant9849, - Variant9850, - Variant9851, - Variant9852, - Variant9853, - Variant9854, - Variant9855, - Variant9856, - Variant9857, - Variant9858, - Variant9859, - Variant9860, - Variant9861, - Variant9862, - Variant9863, - Variant9864, - Variant9865, - Variant9866, - Variant9867, - Variant9868, - Variant9869, - Variant9870, - Variant9871, - Variant9872, - Variant9873, - Variant9874, - Variant9875, - Variant9876, - Variant9877, - Variant9878, - Variant9879, - Variant9880, - Variant9881, - Variant9882, - Variant9883, - Variant9884, - Variant9885, - Variant9886, - Variant9887, - Variant9888, - Variant9889, - Variant9890, - Variant9891, - Variant9892, - Variant9893, - Variant9894, - Variant9895, - Variant9896, - Variant9897, - Variant9898, - Variant9899, - Variant9900, - Variant9901, - Variant9902, - Variant9903, - Variant9904, - Variant9905, - Variant9906, - Variant9907, - Variant9908, - Variant9909, - Variant9910, - Variant9911, - Variant9912, - Variant9913, - Variant9914, - Variant9915, - Variant9916, - Variant9917, - Variant9918, - Variant9919, - Variant9920, - Variant9921, - Variant9922, - Variant9923, - Variant9924, - Variant9925, - Variant9926, - Variant9927, - Variant9928, - Variant9929, - Variant9930, - Variant9931, - Variant9932, - Variant9933, - Variant9934, - Variant9935, - Variant9936, - Variant9937, - Variant9938, - Variant9939, - Variant9940, - Variant9941, - Variant9942, - Variant9943, - Variant9944, - Variant9945, - Variant9946, - Variant9947, - Variant9948, - Variant9949, - Variant9950, - Variant9951, - Variant9952, - Variant9953, - Variant9954, - Variant9955, - Variant9956, - Variant9957, - Variant9958, - Variant9959, - Variant9960, - Variant9961, - Variant9962, - Variant9963, - Variant9964, - Variant9965, - Variant9966, - Variant9967, - Variant9968, - Variant9969, - Variant9970, - Variant9971, - Variant9972, - Variant9973, - Variant9974, - Variant9975, - Variant9976, - Variant9977, - Variant9978, - Variant9979, - Variant9980, - Variant9981, - Variant9982, - Variant9983, - Variant9984, - Variant9985, - Variant9986, - Variant9987, - Variant9988, - Variant9989, - Variant9990, - Variant9991, - Variant9992, - Variant9993, - Variant9994, - Variant9995, - Variant9996, - Variant9997, - Variant9998, - Variant9999, - Variant10000, - Variant10001, - Variant10002, - Variant10003, - Variant10004, - Variant10005, - Variant10006, - Variant10007, - Variant10008, - Variant10009, - Variant10010, - Variant10011, - Variant10012, - Variant10013, - Variant10014, - Variant10015, - Variant10016, - Variant10017, - Variant10018, - Variant10019, - Variant10020, - Variant10021, - Variant10022, - Variant10023, - Variant10024, - Variant10025, - Variant10026, - Variant10027, - Variant10028, - Variant10029, - Variant10030, - Variant10031, - Variant10032, - Variant10033, - Variant10034, - Variant10035, - Variant10036, - Variant10037, - Variant10038, - Variant10039, - Variant10040, - Variant10041, - Variant10042, - Variant10043, - Variant10044, - Variant10045, - Variant10046, - Variant10047, - Variant10048, - Variant10049, - Variant10050, - Variant10051, - Variant10052, - Variant10053, - Variant10054, - Variant10055, - Variant10056, - Variant10057, - Variant10058, - Variant10059, - Variant10060, - Variant10061, - Variant10062, - Variant10063, - Variant10064, - Variant10065, - Variant10066, - Variant10067, - Variant10068, - Variant10069, - Variant10070, - Variant10071, - Variant10072, - Variant10073, - Variant10074, - Variant10075, - Variant10076, - Variant10077, - Variant10078, - Variant10079, - Variant10080, - Variant10081, - Variant10082, - Variant10083, - Variant10084, - Variant10085, - Variant10086, - Variant10087, - Variant10088, - Variant10089, - Variant10090, - Variant10091, - Variant10092, - Variant10093, - Variant10094, - Variant10095, - Variant10096, - Variant10097, - Variant10098, - Variant10099, - Variant10100, - Variant10101, - Variant10102, - Variant10103, - Variant10104, - Variant10105, - Variant10106, - Variant10107, - Variant10108, - Variant10109, - Variant10110, - Variant10111, - Variant10112, - Variant10113, - Variant10114, - Variant10115, - Variant10116, - Variant10117, - Variant10118, - Variant10119, - Variant10120, - Variant10121, - Variant10122, - Variant10123, - Variant10124, - Variant10125, - Variant10126, - Variant10127, - Variant10128, - Variant10129, - Variant10130, - Variant10131, - Variant10132, - Variant10133, - Variant10134, - Variant10135, - Variant10136, - Variant10137, - Variant10138, - Variant10139, - Variant10140, - Variant10141, - Variant10142, - Variant10143, - Variant10144, - Variant10145, - Variant10146, - Variant10147, - Variant10148, - Variant10149, - Variant10150, - Variant10151, - Variant10152, - Variant10153, - Variant10154, - Variant10155, - Variant10156, - Variant10157, - Variant10158, - Variant10159, - Variant10160, - Variant10161, - Variant10162, - Variant10163, - Variant10164, - Variant10165, - Variant10166, - Variant10167, - Variant10168, - Variant10169, - Variant10170, - Variant10171, - Variant10172, - Variant10173, - Variant10174, - Variant10175, - Variant10176, - Variant10177, - Variant10178, - Variant10179, - Variant10180, - Variant10181, - Variant10182, - Variant10183, - Variant10184, - Variant10185, - Variant10186, - Variant10187, - Variant10188, - Variant10189, - Variant10190, - Variant10191, - Variant10192, - Variant10193, - Variant10194, - Variant10195, - Variant10196, - Variant10197, - Variant10198, - Variant10199, - Variant10200, - Variant10201, - Variant10202, - Variant10203, - Variant10204, - Variant10205, - Variant10206, - Variant10207, - Variant10208, - Variant10209, - Variant10210, - Variant10211, - Variant10212, - Variant10213, - Variant10214, - Variant10215, - Variant10216, - Variant10217, - Variant10218, - Variant10219, - Variant10220, - Variant10221, - Variant10222, - Variant10223, - Variant10224, - Variant10225, - Variant10226, - Variant10227, - Variant10228, - Variant10229, - Variant10230, - Variant10231, - Variant10232, - Variant10233, - Variant10234, - Variant10235, - Variant10236, - Variant10237, - Variant10238, - Variant10239, - Variant10240, - Variant10241, - Variant10242, - Variant10243, - Variant10244, - Variant10245, - Variant10246, - Variant10247, - Variant10248, - Variant10249, - Variant10250, - Variant10251, - Variant10252, - Variant10253, - Variant10254, - Variant10255, - Variant10256, - Variant10257, - Variant10258, - Variant10259, - Variant10260, - Variant10261, - Variant10262, - Variant10263, - Variant10264, - Variant10265, - Variant10266, - Variant10267, - Variant10268, - Variant10269, - Variant10270, - Variant10271, - Variant10272, - Variant10273, - Variant10274, - Variant10275, - Variant10276, - Variant10277, - Variant10278, - Variant10279, - Variant10280, - Variant10281, - Variant10282, - Variant10283, - Variant10284, - Variant10285, - Variant10286, - Variant10287, - Variant10288, - Variant10289, - Variant10290, - Variant10291, - Variant10292, - Variant10293, - Variant10294, - Variant10295, - Variant10296, - Variant10297, - Variant10298, - Variant10299, - Variant10300, - Variant10301, - Variant10302, - Variant10303, - Variant10304, - Variant10305, - Variant10306, - Variant10307, - Variant10308, - Variant10309, - Variant10310, - Variant10311, - Variant10312, - Variant10313, - Variant10314, - Variant10315, - Variant10316, - Variant10317, - Variant10318, - Variant10319, - Variant10320, - Variant10321, - Variant10322, - Variant10323, - Variant10324, - Variant10325, - Variant10326, - Variant10327, - Variant10328, - Variant10329, - Variant10330, - Variant10331, - Variant10332, - Variant10333, - Variant10334, - Variant10335, - Variant10336, - Variant10337, - Variant10338, - Variant10339, - Variant10340, - Variant10341, - Variant10342, - Variant10343, - Variant10344, - Variant10345, - Variant10346, - Variant10347, - Variant10348, - Variant10349, - Variant10350, - Variant10351, - Variant10352, - Variant10353, - Variant10354, - Variant10355, - Variant10356, - Variant10357, - Variant10358, - Variant10359, - Variant10360, - Variant10361, - Variant10362, - Variant10363, - Variant10364, - Variant10365, - Variant10366, - Variant10367, - Variant10368, - Variant10369, - Variant10370, - Variant10371, - Variant10372, - Variant10373, - Variant10374, - Variant10375, - Variant10376, - Variant10377, - Variant10378, - Variant10379, - Variant10380, - Variant10381, - Variant10382, - Variant10383, - Variant10384, - Variant10385, - Variant10386, - Variant10387, - Variant10388, - Variant10389, - Variant10390, - Variant10391, - Variant10392, - Variant10393, - Variant10394, - Variant10395, - Variant10396, - Variant10397, - Variant10398, - Variant10399, - Variant10400, - Variant10401, - Variant10402, - Variant10403, - Variant10404, - Variant10405, - Variant10406, - Variant10407, - Variant10408, - Variant10409, - Variant10410, - Variant10411, - Variant10412, - Variant10413, - Variant10414, - Variant10415, - Variant10416, - Variant10417, - Variant10418, - Variant10419, - Variant10420, - Variant10421, - Variant10422, - Variant10423, - Variant10424, - Variant10425, - Variant10426, - Variant10427, - Variant10428, - Variant10429, - Variant10430, - Variant10431, - Variant10432, - Variant10433, - Variant10434, - Variant10435, - Variant10436, - Variant10437, - Variant10438, - Variant10439, - Variant10440, - Variant10441, - Variant10442, - Variant10443, - Variant10444, - Variant10445, - Variant10446, - Variant10447, - Variant10448, - Variant10449, - Variant10450, - Variant10451, - Variant10452, - Variant10453, - Variant10454, - Variant10455, - Variant10456, - Variant10457, - Variant10458, - Variant10459, - Variant10460, - Variant10461, - Variant10462, - Variant10463, - Variant10464, - Variant10465, - Variant10466, - Variant10467, - Variant10468, - Variant10469, - Variant10470, - Variant10471, - Variant10472, - Variant10473, - Variant10474, - Variant10475, - Variant10476, - Variant10477, - Variant10478, - Variant10479, - Variant10480, - Variant10481, - Variant10482, - Variant10483, - Variant10484, - Variant10485, - Variant10486, - Variant10487, - Variant10488, - Variant10489, - Variant10490, - Variant10491, - Variant10492, - Variant10493, - Variant10494, - Variant10495, - Variant10496, - Variant10497, - Variant10498, - Variant10499, - Variant10500, - Variant10501, - Variant10502, - Variant10503, - Variant10504, - Variant10505, - Variant10506, - Variant10507, - Variant10508, - Variant10509, - Variant10510, - Variant10511, - Variant10512, - Variant10513, - Variant10514, - Variant10515, - Variant10516, - Variant10517, - Variant10518, - Variant10519, - Variant10520, - Variant10521, - Variant10522, - Variant10523, - Variant10524, - Variant10525, - Variant10526, - Variant10527, - Variant10528, - Variant10529, - Variant10530, - Variant10531, - Variant10532, - Variant10533, - Variant10534, - Variant10535, - Variant10536, - Variant10537, - Variant10538, - Variant10539, - Variant10540, - Variant10541, - Variant10542, - Variant10543, - Variant10544, - Variant10545, - Variant10546, - Variant10547, - Variant10548, - Variant10549, - Variant10550, - Variant10551, - Variant10552, - Variant10553, - Variant10554, - Variant10555, - Variant10556, - Variant10557, - Variant10558, - Variant10559, - Variant10560, - Variant10561, - Variant10562, - Variant10563, - Variant10564, - Variant10565, - Variant10566, - Variant10567, - Variant10568, - Variant10569, - Variant10570, - Variant10571, - Variant10572, - Variant10573, - Variant10574, - Variant10575, - Variant10576, - Variant10577, - Variant10578, - Variant10579, - Variant10580, - Variant10581, - Variant10582, - Variant10583, - Variant10584, - Variant10585, - Variant10586, - Variant10587, - Variant10588, - Variant10589, - Variant10590, - Variant10591, - Variant10592, - Variant10593, - Variant10594, - Variant10595, - Variant10596, - Variant10597, - Variant10598, - Variant10599, - Variant10600, - Variant10601, - Variant10602, - Variant10603, - Variant10604, - Variant10605, - Variant10606, - Variant10607, - Variant10608, - Variant10609, - Variant10610, - Variant10611, - Variant10612, - Variant10613, - Variant10614, - Variant10615, - Variant10616, - Variant10617, - Variant10618, - Variant10619, - Variant10620, - Variant10621, - Variant10622, - Variant10623, - Variant10624, - Variant10625, - Variant10626, - Variant10627, - Variant10628, - Variant10629, - Variant10630, - Variant10631, - Variant10632, - Variant10633, - Variant10634, - Variant10635, - Variant10636, - Variant10637, - Variant10638, - Variant10639, - Variant10640, - Variant10641, - Variant10642, - Variant10643, - Variant10644, - Variant10645, - Variant10646, - Variant10647, - Variant10648, - Variant10649, - Variant10650, - Variant10651, - Variant10652, - Variant10653, - Variant10654, - Variant10655, - Variant10656, - Variant10657, - Variant10658, - Variant10659, - Variant10660, - Variant10661, - Variant10662, - Variant10663, - Variant10664, - Variant10665, - Variant10666, - Variant10667, - Variant10668, - Variant10669, - Variant10670, - Variant10671, - Variant10672, - Variant10673, - Variant10674, - Variant10675, - Variant10676, - Variant10677, - Variant10678, - Variant10679, - Variant10680, - Variant10681, - Variant10682, - Variant10683, - Variant10684, - Variant10685, - Variant10686, - Variant10687, - Variant10688, - Variant10689, - Variant10690, - Variant10691, - Variant10692, - Variant10693, - Variant10694, - Variant10695, - Variant10696, - Variant10697, - Variant10698, - Variant10699, - Variant10700, - Variant10701, - Variant10702, - Variant10703, - Variant10704, - Variant10705, - Variant10706, - Variant10707, - Variant10708, - Variant10709, - Variant10710, - Variant10711, - Variant10712, - Variant10713, - Variant10714, - Variant10715, - Variant10716, - Variant10717, - Variant10718, - Variant10719, - Variant10720, - Variant10721, - Variant10722, - Variant10723, - Variant10724, - Variant10725, - Variant10726, - Variant10727, - Variant10728, - Variant10729, - Variant10730, - Variant10731, - Variant10732, - Variant10733, - Variant10734, - Variant10735, - Variant10736, - Variant10737, - Variant10738, - Variant10739, - Variant10740, - Variant10741, - Variant10742, - Variant10743, - Variant10744, - Variant10745, - Variant10746, - Variant10747, - Variant10748, - Variant10749, - Variant10750, - Variant10751, - Variant10752, - Variant10753, - Variant10754, - Variant10755, - Variant10756, - Variant10757, - Variant10758, - Variant10759, - Variant10760, - Variant10761, - Variant10762, - Variant10763, - Variant10764, - Variant10765, - Variant10766, - Variant10767, - Variant10768, - Variant10769, - Variant10770, - Variant10771, - Variant10772, - Variant10773, - Variant10774, - Variant10775, - Variant10776, - Variant10777, - Variant10778, - Variant10779, - Variant10780, - Variant10781, - Variant10782, - Variant10783, - Variant10784, - Variant10785, - Variant10786, - Variant10787, - Variant10788, - Variant10789, - Variant10790, - Variant10791, - Variant10792, - Variant10793, - Variant10794, - Variant10795, - Variant10796, - Variant10797, - Variant10798, - Variant10799, - Variant10800, - Variant10801, - Variant10802, - Variant10803, - Variant10804, - Variant10805, - Variant10806, - Variant10807, - Variant10808, - Variant10809, - Variant10810, - Variant10811, - Variant10812, - Variant10813, - Variant10814, - Variant10815, - Variant10816, - Variant10817, - Variant10818, - Variant10819, - Variant10820, - Variant10821, - Variant10822, - Variant10823, - Variant10824, - Variant10825, - Variant10826, - Variant10827, - Variant10828, - Variant10829, - Variant10830, - Variant10831, - Variant10832, - Variant10833, - Variant10834, - Variant10835, - Variant10836, - Variant10837, - Variant10838, - Variant10839, - Variant10840, - Variant10841, - Variant10842, - Variant10843, - Variant10844, - Variant10845, - Variant10846, - Variant10847, - Variant10848, - Variant10849, - Variant10850, - Variant10851, - Variant10852, - Variant10853, - Variant10854, - Variant10855, - Variant10856, - Variant10857, - Variant10858, - Variant10859, - Variant10860, - Variant10861, - Variant10862, - Variant10863, - Variant10864, - Variant10865, - Variant10866, - Variant10867, - Variant10868, - Variant10869, - Variant10870, - Variant10871, - Variant10872, - Variant10873, - Variant10874, - Variant10875, - Variant10876, - Variant10877, - Variant10878, - Variant10879, - Variant10880, - Variant10881, - Variant10882, - Variant10883, - Variant10884, - Variant10885, - Variant10886, - Variant10887, - Variant10888, - Variant10889, - Variant10890, - Variant10891, - Variant10892, - Variant10893, - Variant10894, - Variant10895, - Variant10896, - Variant10897, - Variant10898, - Variant10899, - Variant10900, - Variant10901, - Variant10902, - Variant10903, - Variant10904, - Variant10905, - Variant10906, - Variant10907, - Variant10908, - Variant10909, - Variant10910, - Variant10911, - Variant10912, - Variant10913, - Variant10914, - Variant10915, - Variant10916, - Variant10917, - Variant10918, - Variant10919, - Variant10920, - Variant10921, - Variant10922, - Variant10923, - Variant10924, - Variant10925, - Variant10926, - Variant10927, - Variant10928, - Variant10929, - Variant10930, - Variant10931, - Variant10932, - Variant10933, - Variant10934, - Variant10935, - Variant10936, - Variant10937, - Variant10938, - Variant10939, - Variant10940, - Variant10941, - Variant10942, - Variant10943, - Variant10944, - Variant10945, - Variant10946, - Variant10947, - Variant10948, - Variant10949, - Variant10950, - Variant10951, - Variant10952, - Variant10953, - Variant10954, - Variant10955, - Variant10956, - Variant10957, - Variant10958, - Variant10959, - Variant10960, - Variant10961, - Variant10962, - Variant10963, - Variant10964, - Variant10965, - Variant10966, - Variant10967, - Variant10968, - Variant10969, - Variant10970, - Variant10971, - Variant10972, - Variant10973, - Variant10974, - Variant10975, - Variant10976, - Variant10977, - Variant10978, - Variant10979, - Variant10980, - Variant10981, - Variant10982, - Variant10983, - Variant10984, - Variant10985, - Variant10986, - Variant10987, - Variant10988, - Variant10989, - Variant10990, - Variant10991, - Variant10992, - Variant10993, - Variant10994, - Variant10995, - Variant10996, - Variant10997, - Variant10998, - Variant10999, - Variant11000, - Variant11001, - Variant11002, - Variant11003, - Variant11004, - Variant11005, - Variant11006, - Variant11007, - Variant11008, - Variant11009, - Variant11010, - Variant11011, - Variant11012, - Variant11013, - Variant11014, - Variant11015, - Variant11016, - Variant11017, - Variant11018, - Variant11019, - Variant11020, - Variant11021, - Variant11022, - Variant11023, - Variant11024, - Variant11025, - Variant11026, - Variant11027, - Variant11028, - Variant11029, - Variant11030, - Variant11031, - Variant11032, - Variant11033, - Variant11034, - Variant11035, - Variant11036, - Variant11037, - Variant11038, - Variant11039, - Variant11040, - Variant11041, - Variant11042, - Variant11043, - Variant11044, - Variant11045, - Variant11046, - Variant11047, - Variant11048, - Variant11049, - Variant11050, - Variant11051, - Variant11052, - Variant11053, - Variant11054, - Variant11055, - Variant11056, - Variant11057, - Variant11058, - Variant11059, - Variant11060, - Variant11061, - Variant11062, - Variant11063, - Variant11064, - Variant11065, - Variant11066, - Variant11067, - Variant11068, - Variant11069, - Variant11070, - Variant11071, - Variant11072, - Variant11073, - Variant11074, - Variant11075, - Variant11076, - Variant11077, - Variant11078, - Variant11079, - Variant11080, - Variant11081, - Variant11082, - Variant11083, - Variant11084, - Variant11085, - Variant11086, - Variant11087, - Variant11088, - Variant11089, - Variant11090, - Variant11091, - Variant11092, - Variant11093, - Variant11094, - Variant11095, - Variant11096, - Variant11097, - Variant11098, - Variant11099, - Variant11100, - Variant11101, - Variant11102, - Variant11103, - Variant11104, - Variant11105, - Variant11106, - Variant11107, - Variant11108, - Variant11109, - Variant11110, - Variant11111, - Variant11112, - Variant11113, - Variant11114, - Variant11115, - Variant11116, - Variant11117, - Variant11118, - Variant11119, - Variant11120, - Variant11121, - Variant11122, - Variant11123, - Variant11124, - Variant11125, - Variant11126, - Variant11127, - Variant11128, - Variant11129, - Variant11130, - Variant11131, - Variant11132, - Variant11133, - Variant11134, - Variant11135, - Variant11136, - Variant11137, - Variant11138, - Variant11139, - Variant11140, - Variant11141, - Variant11142, - Variant11143, - Variant11144, - Variant11145, - Variant11146, - Variant11147, - Variant11148, - Variant11149, - Variant11150, - Variant11151, - Variant11152, - Variant11153, - Variant11154, - Variant11155, - Variant11156, - Variant11157, - Variant11158, - Variant11159, - Variant11160, - Variant11161, - Variant11162, - Variant11163, - Variant11164, - Variant11165, - Variant11166, - Variant11167, - Variant11168, - Variant11169, - Variant11170, - Variant11171, - Variant11172, - Variant11173, - Variant11174, - Variant11175, - Variant11176, - Variant11177, - Variant11178, - Variant11179, - Variant11180, - Variant11181, - Variant11182, - Variant11183, - Variant11184, - Variant11185, - Variant11186, - Variant11187, - Variant11188, - Variant11189, - Variant11190, - Variant11191, - Variant11192, - Variant11193, - Variant11194, - Variant11195, - Variant11196, - Variant11197, - Variant11198, - Variant11199, - Variant11200, - Variant11201, - Variant11202, - Variant11203, - Variant11204, - Variant11205, - Variant11206, - Variant11207, - Variant11208, - Variant11209, - Variant11210, - Variant11211, - Variant11212, - Variant11213, - Variant11214, - Variant11215, - Variant11216, - Variant11217, - Variant11218, - Variant11219, - Variant11220, - Variant11221, - Variant11222, - Variant11223, - Variant11224, - Variant11225, - Variant11226, - Variant11227, - Variant11228, - Variant11229, - Variant11230, - Variant11231, - Variant11232, - Variant11233, - Variant11234, - Variant11235, - Variant11236, - Variant11237, - Variant11238, - Variant11239, - Variant11240, - Variant11241, - Variant11242, - Variant11243, - Variant11244, - Variant11245, - Variant11246, - Variant11247, - Variant11248, - Variant11249, - Variant11250, - Variant11251, - Variant11252, - Variant11253, - Variant11254, - Variant11255, - Variant11256, - Variant11257, - Variant11258, - Variant11259, - Variant11260, - Variant11261, - Variant11262, - Variant11263, - Variant11264, - Variant11265, - Variant11266, - Variant11267, - Variant11268, - Variant11269, - Variant11270, - Variant11271, - Variant11272, - Variant11273, - Variant11274, - Variant11275, - Variant11276, - Variant11277, - Variant11278, - Variant11279, - Variant11280, - Variant11281, - Variant11282, - Variant11283, - Variant11284, - Variant11285, - Variant11286, - Variant11287, - Variant11288, - Variant11289, - Variant11290, - Variant11291, - Variant11292, - Variant11293, - Variant11294, - Variant11295, - Variant11296, - Variant11297, - Variant11298, - Variant11299, - Variant11300, - Variant11301, - Variant11302, - Variant11303, - Variant11304, - Variant11305, - Variant11306, - Variant11307, - Variant11308, - Variant11309, - Variant11310, - Variant11311, - Variant11312, - Variant11313, - Variant11314, - Variant11315, - Variant11316, - Variant11317, - Variant11318, - Variant11319, - Variant11320, - Variant11321, - Variant11322, - Variant11323, - Variant11324, - Variant11325, - Variant11326, - Variant11327, - Variant11328, - Variant11329, - Variant11330, - Variant11331, - Variant11332, - Variant11333, - Variant11334, - Variant11335, - Variant11336, - Variant11337, - Variant11338, - Variant11339, - Variant11340, - Variant11341, - Variant11342, - Variant11343, - Variant11344, - Variant11345, - Variant11346, - Variant11347, - Variant11348, - Variant11349, - Variant11350, - Variant11351, - Variant11352, - Variant11353, - Variant11354, - Variant11355, - Variant11356, - Variant11357, - Variant11358, - Variant11359, - Variant11360, - Variant11361, - Variant11362, - Variant11363, - Variant11364, - Variant11365, - Variant11366, - Variant11367, - Variant11368, - Variant11369, - Variant11370, - Variant11371, - Variant11372, - Variant11373, - Variant11374, - Variant11375, - Variant11376, - Variant11377, - Variant11378, - Variant11379, - Variant11380, - Variant11381, - Variant11382, - Variant11383, - Variant11384, - Variant11385, - Variant11386, - Variant11387, - Variant11388, - Variant11389, - Variant11390, - Variant11391, - Variant11392, - Variant11393, - Variant11394, - Variant11395, - Variant11396, - Variant11397, - Variant11398, - Variant11399, - Variant11400, - Variant11401, - Variant11402, - Variant11403, - Variant11404, - Variant11405, - Variant11406, - Variant11407, - Variant11408, - Variant11409, - Variant11410, - Variant11411, - Variant11412, - Variant11413, - Variant11414, - Variant11415, - Variant11416, - Variant11417, - Variant11418, - Variant11419, - Variant11420, - Variant11421, - Variant11422, - Variant11423, - Variant11424, - Variant11425, - Variant11426, - Variant11427, - Variant11428, - Variant11429, - Variant11430, - Variant11431, - Variant11432, - Variant11433, - Variant11434, - Variant11435, - Variant11436, - Variant11437, - Variant11438, - Variant11439, - Variant11440, - Variant11441, - Variant11442, - Variant11443, - Variant11444, - Variant11445, - Variant11446, - Variant11447, - Variant11448, - Variant11449, - Variant11450, - Variant11451, - Variant11452, - Variant11453, - Variant11454, - Variant11455, - Variant11456, - Variant11457, - Variant11458, - Variant11459, - Variant11460, - Variant11461, - Variant11462, - Variant11463, - Variant11464, - Variant11465, - Variant11466, - Variant11467, - Variant11468, - Variant11469, - Variant11470, - Variant11471, - Variant11472, - Variant11473, - Variant11474, - Variant11475, - Variant11476, - Variant11477, - Variant11478, - Variant11479, - Variant11480, - Variant11481, - Variant11482, - Variant11483, - Variant11484, - Variant11485, - Variant11486, - Variant11487, - Variant11488, - Variant11489, - Variant11490, - Variant11491, - Variant11492, - Variant11493, - Variant11494, - Variant11495, - Variant11496, - Variant11497, - Variant11498, - Variant11499, - Variant11500, - Variant11501, - Variant11502, - Variant11503, - Variant11504, - Variant11505, - Variant11506, - Variant11507, - Variant11508, - Variant11509, - Variant11510, - Variant11511, - Variant11512, - Variant11513, - Variant11514, - Variant11515, - Variant11516, - Variant11517, - Variant11518, - Variant11519, - Variant11520, - Variant11521, - Variant11522, - Variant11523, - Variant11524, - Variant11525, - Variant11526, - Variant11527, - Variant11528, - Variant11529, - Variant11530, - Variant11531, - Variant11532, - Variant11533, - Variant11534, - Variant11535, - Variant11536, - Variant11537, - Variant11538, - Variant11539, - Variant11540, - Variant11541, - Variant11542, - Variant11543, - Variant11544, - Variant11545, - Variant11546, - Variant11547, - Variant11548, - Variant11549, - Variant11550, - Variant11551, - Variant11552, - Variant11553, - Variant11554, - Variant11555, - Variant11556, - Variant11557, - Variant11558, - Variant11559, - Variant11560, - Variant11561, - Variant11562, - Variant11563, - Variant11564, - Variant11565, - Variant11566, - Variant11567, - Variant11568, - Variant11569, - Variant11570, - Variant11571, - Variant11572, - Variant11573, - Variant11574, - Variant11575, - Variant11576, - Variant11577, - Variant11578, - Variant11579, - Variant11580, - Variant11581, - Variant11582, - Variant11583, - Variant11584, - Variant11585, - Variant11586, - Variant11587, - Variant11588, - Variant11589, - Variant11590, - Variant11591, - Variant11592, - Variant11593, - Variant11594, - Variant11595, - Variant11596, - Variant11597, - Variant11598, - Variant11599, - Variant11600, - Variant11601, - Variant11602, - Variant11603, - Variant11604, - Variant11605, - Variant11606, - Variant11607, - Variant11608, - Variant11609, - Variant11610, - Variant11611, - Variant11612, - Variant11613, - Variant11614, - Variant11615, - Variant11616, - Variant11617, - Variant11618, - Variant11619, - Variant11620, - Variant11621, - Variant11622, - Variant11623, - Variant11624, - Variant11625, - Variant11626, - Variant11627, - Variant11628, - Variant11629, - Variant11630, - Variant11631, - Variant11632, - Variant11633, - Variant11634, - Variant11635, - Variant11636, - Variant11637, - Variant11638, - Variant11639, - Variant11640, - Variant11641, - Variant11642, - Variant11643, - Variant11644, - Variant11645, - Variant11646, - Variant11647, - Variant11648, - Variant11649, - Variant11650, - Variant11651, - Variant11652, - Variant11653, - Variant11654, - Variant11655, - Variant11656, - Variant11657, - Variant11658, - Variant11659, - Variant11660, - Variant11661, - Variant11662, - Variant11663, - Variant11664, - Variant11665, - Variant11666, - Variant11667, - Variant11668, - Variant11669, - Variant11670, - Variant11671, - Variant11672, - Variant11673, - Variant11674, - Variant11675, - Variant11676, - Variant11677, - Variant11678, - Variant11679, - Variant11680, - Variant11681, - Variant11682, - Variant11683, - Variant11684, - Variant11685, - Variant11686, - Variant11687, - Variant11688, - Variant11689, - Variant11690, - Variant11691, - Variant11692, - Variant11693, - Variant11694, - Variant11695, - Variant11696, - Variant11697, - Variant11698, - Variant11699, - Variant11700, - Variant11701, - Variant11702, - Variant11703, - Variant11704, - Variant11705, - Variant11706, - Variant11707, - Variant11708, - Variant11709, - Variant11710, - Variant11711, - Variant11712, - Variant11713, - Variant11714, - Variant11715, - Variant11716, - Variant11717, - Variant11718, - Variant11719, - Variant11720, - Variant11721, - Variant11722, - Variant11723, - Variant11724, - Variant11725, - Variant11726, - Variant11727, - Variant11728, - Variant11729, - Variant11730, - Variant11731, - Variant11732, - Variant11733, - Variant11734, - Variant11735, - Variant11736, - Variant11737, - Variant11738, - Variant11739, - Variant11740, - Variant11741, - Variant11742, - Variant11743, - Variant11744, - Variant11745, - Variant11746, - Variant11747, - Variant11748, - Variant11749, - Variant11750, - Variant11751, - Variant11752, - Variant11753, - Variant11754, - Variant11755, - Variant11756, - Variant11757, - Variant11758, - Variant11759, - Variant11760, - Variant11761, - Variant11762, - Variant11763, - Variant11764, - Variant11765, - Variant11766, - Variant11767, - Variant11768, - Variant11769, - Variant11770, - Variant11771, - Variant11772, - Variant11773, - Variant11774, - Variant11775, - Variant11776, - Variant11777, - Variant11778, - Variant11779, - Variant11780, - Variant11781, - Variant11782, - Variant11783, - Variant11784, - Variant11785, - Variant11786, - Variant11787, - Variant11788, - Variant11789, - Variant11790, - Variant11791, - Variant11792, - Variant11793, - Variant11794, - Variant11795, - Variant11796, - Variant11797, - Variant11798, - Variant11799, - Variant11800, - Variant11801, - Variant11802, - Variant11803, - Variant11804, - Variant11805, - Variant11806, - Variant11807, - Variant11808, - Variant11809, - Variant11810, - Variant11811, - Variant11812, - Variant11813, - Variant11814, - Variant11815, - Variant11816, - Variant11817, - Variant11818, - Variant11819, - Variant11820, - Variant11821, - Variant11822, - Variant11823, - Variant11824, - Variant11825, - Variant11826, - Variant11827, - Variant11828, - Variant11829, - Variant11830, - Variant11831, - Variant11832, - Variant11833, - Variant11834, - Variant11835, - Variant11836, - Variant11837, - Variant11838, - Variant11839, - Variant11840, - Variant11841, - Variant11842, - Variant11843, - Variant11844, - Variant11845, - Variant11846, - Variant11847, - Variant11848, - Variant11849, - Variant11850, - Variant11851, - Variant11852, - Variant11853, - Variant11854, - Variant11855, - Variant11856, - Variant11857, - Variant11858, - Variant11859, - Variant11860, - Variant11861, - Variant11862, - Variant11863, - Variant11864, - Variant11865, - Variant11866, - Variant11867, - Variant11868, - Variant11869, - Variant11870, - Variant11871, - Variant11872, - Variant11873, - Variant11874, - Variant11875, - Variant11876, - Variant11877, - Variant11878, - Variant11879, - Variant11880, - Variant11881, - Variant11882, - Variant11883, - Variant11884, - Variant11885, - Variant11886, - Variant11887, - Variant11888, - Variant11889, - Variant11890, - Variant11891, - Variant11892, - Variant11893, - Variant11894, - Variant11895, - Variant11896, - Variant11897, - Variant11898, - Variant11899, - Variant11900, - Variant11901, - Variant11902, - Variant11903, - Variant11904, - Variant11905, - Variant11906, - Variant11907, - Variant11908, - Variant11909, - Variant11910, - Variant11911, - Variant11912, - Variant11913, - Variant11914, - Variant11915, - Variant11916, - Variant11917, - Variant11918, - Variant11919, - Variant11920, - Variant11921, - Variant11922, - Variant11923, - Variant11924, - Variant11925, - Variant11926, - Variant11927, - Variant11928, - Variant11929, - Variant11930, - Variant11931, - Variant11932, - Variant11933, - Variant11934, - Variant11935, - Variant11936, - Variant11937, - Variant11938, - Variant11939, - Variant11940, - Variant11941, - Variant11942, - Variant11943, - Variant11944, - Variant11945, - Variant11946, - Variant11947, - Variant11948, - Variant11949, - Variant11950, - Variant11951, - Variant11952, - Variant11953, - Variant11954, - Variant11955, - Variant11956, - Variant11957, - Variant11958, - Variant11959, - Variant11960, - Variant11961, - Variant11962, - Variant11963, - Variant11964, - Variant11965, - Variant11966, - Variant11967, - Variant11968, - Variant11969, - Variant11970, - Variant11971, - Variant11972, - Variant11973, - Variant11974, - Variant11975, - Variant11976, - Variant11977, - Variant11978, - Variant11979, - Variant11980, - Variant11981, - Variant11982, - Variant11983, - Variant11984, - Variant11985, - Variant11986, - Variant11987, - Variant11988, - Variant11989, - Variant11990, - Variant11991, - Variant11992, - Variant11993, - Variant11994, - Variant11995, - Variant11996, - Variant11997, - Variant11998, - Variant11999, - Variant12000, - Variant12001, - Variant12002, - Variant12003, - Variant12004, - Variant12005, - Variant12006, - Variant12007, - Variant12008, - Variant12009, - Variant12010, - Variant12011, - Variant12012, - Variant12013, - Variant12014, - Variant12015, - Variant12016, - Variant12017, - Variant12018, - Variant12019, - Variant12020, - Variant12021, - Variant12022, - Variant12023, - Variant12024, - Variant12025, - Variant12026, - Variant12027, - Variant12028, - Variant12029, - Variant12030, - Variant12031, - Variant12032, - Variant12033, - Variant12034, - Variant12035, - Variant12036, - Variant12037, - Variant12038, - Variant12039, - Variant12040, - Variant12041, - Variant12042, - Variant12043, - Variant12044, - Variant12045, - Variant12046, - Variant12047, - Variant12048, - Variant12049, - Variant12050, - Variant12051, - Variant12052, - Variant12053, - Variant12054, - Variant12055, - Variant12056, - Variant12057, - Variant12058, - Variant12059, - Variant12060, - Variant12061, - Variant12062, - Variant12063, - Variant12064, - Variant12065, - Variant12066, - Variant12067, - Variant12068, - Variant12069, - Variant12070, - Variant12071, - Variant12072, - Variant12073, - Variant12074, - Variant12075, - Variant12076, - Variant12077, - Variant12078, - Variant12079, - Variant12080, - Variant12081, - Variant12082, - Variant12083, - Variant12084, - Variant12085, - Variant12086, - Variant12087, - Variant12088, - Variant12089, - Variant12090, - Variant12091, - Variant12092, - Variant12093, - Variant12094, - Variant12095, - Variant12096, - Variant12097, - Variant12098, - Variant12099, - Variant12100, - Variant12101, - Variant12102, - Variant12103, - Variant12104, - Variant12105, - Variant12106, - Variant12107, - Variant12108, - Variant12109, - Variant12110, - Variant12111, - Variant12112, - Variant12113, - Variant12114, - Variant12115, - Variant12116, - Variant12117, - Variant12118, - Variant12119, - Variant12120, - Variant12121, - Variant12122, - Variant12123, - Variant12124, - Variant12125, - Variant12126, - Variant12127, - Variant12128, - Variant12129, - Variant12130, - Variant12131, - Variant12132, - Variant12133, - Variant12134, - Variant12135, - Variant12136, - Variant12137, - Variant12138, - Variant12139, - Variant12140, - Variant12141, - Variant12142, - Variant12143, - Variant12144, - Variant12145, - Variant12146, - Variant12147, - Variant12148, - Variant12149, - Variant12150, - Variant12151, - Variant12152, - Variant12153, - Variant12154, - Variant12155, - Variant12156, - Variant12157, - Variant12158, - Variant12159, - Variant12160, - Variant12161, - Variant12162, - Variant12163, - Variant12164, - Variant12165, - Variant12166, - Variant12167, - Variant12168, - Variant12169, - Variant12170, - Variant12171, - Variant12172, - Variant12173, - Variant12174, - Variant12175, - Variant12176, - Variant12177, - Variant12178, - Variant12179, - Variant12180, - Variant12181, - Variant12182, - Variant12183, - Variant12184, - Variant12185, - Variant12186, - Variant12187, - Variant12188, - Variant12189, - Variant12190, - Variant12191, - Variant12192, - Variant12193, - Variant12194, - Variant12195, - Variant12196, - Variant12197, - Variant12198, - Variant12199, - Variant12200, - Variant12201, - Variant12202, - Variant12203, - Variant12204, - Variant12205, - Variant12206, - Variant12207, - Variant12208, - Variant12209, - Variant12210, - Variant12211, - Variant12212, - Variant12213, - Variant12214, - Variant12215, - Variant12216, - Variant12217, - Variant12218, - Variant12219, - Variant12220, - Variant12221, - Variant12222, - Variant12223, - Variant12224, - Variant12225, - Variant12226, - Variant12227, - Variant12228, - Variant12229, - Variant12230, - Variant12231, - Variant12232, - Variant12233, - Variant12234, - Variant12235, - Variant12236, - Variant12237, - Variant12238, - Variant12239, - Variant12240, - Variant12241, - Variant12242, - Variant12243, - Variant12244, - Variant12245, - Variant12246, - Variant12247, - Variant12248, - Variant12249, - Variant12250, - Variant12251, - Variant12252, - Variant12253, - Variant12254, - Variant12255, - Variant12256, - Variant12257, - Variant12258, - Variant12259, - Variant12260, - Variant12261, - Variant12262, - Variant12263, - Variant12264, - Variant12265, - Variant12266, - Variant12267, - Variant12268, - Variant12269, - Variant12270, - Variant12271, - Variant12272, - Variant12273, - Variant12274, - Variant12275, - Variant12276, - Variant12277, - Variant12278, - Variant12279, - Variant12280, - Variant12281, - Variant12282, - Variant12283, - Variant12284, - Variant12285, - Variant12286, - Variant12287, - Variant12288, - Variant12289, - Variant12290, - Variant12291, - Variant12292, - Variant12293, - Variant12294, - Variant12295, - Variant12296, - Variant12297, - Variant12298, - Variant12299, - Variant12300, - Variant12301, - Variant12302, - Variant12303, - Variant12304, - Variant12305, - Variant12306, - Variant12307, - Variant12308, - Variant12309, - Variant12310, - Variant12311, - Variant12312, - Variant12313, - Variant12314, - Variant12315, - Variant12316, - Variant12317, - Variant12318, - Variant12319, - Variant12320, - Variant12321, - Variant12322, - Variant12323, - Variant12324, - Variant12325, - Variant12326, - Variant12327, - Variant12328, - Variant12329, - Variant12330, - Variant12331, - Variant12332, - Variant12333, - Variant12334, - Variant12335, - Variant12336, - Variant12337, - Variant12338, - Variant12339, - Variant12340, - Variant12341, - Variant12342, - Variant12343, - Variant12344, - Variant12345, - Variant12346, - Variant12347, - Variant12348, - Variant12349, - Variant12350, - Variant12351, - Variant12352, - Variant12353, - Variant12354, - Variant12355, - Variant12356, - Variant12357, - Variant12358, - Variant12359, - Variant12360, - Variant12361, - Variant12362, - Variant12363, - Variant12364, - Variant12365, - Variant12366, - Variant12367, - Variant12368, - Variant12369, - Variant12370, - Variant12371, - Variant12372, - Variant12373, - Variant12374, - Variant12375, - Variant12376, - Variant12377, - Variant12378, - Variant12379, - Variant12380, - Variant12381, - Variant12382, - Variant12383, - Variant12384, - Variant12385, - Variant12386, - Variant12387, - Variant12388, - Variant12389, - Variant12390, - Variant12391, - Variant12392, - Variant12393, - Variant12394, - Variant12395, - Variant12396, - Variant12397, - Variant12398, - Variant12399, - Variant12400, - Variant12401, - Variant12402, - Variant12403, - Variant12404, - Variant12405, - Variant12406, - Variant12407, - Variant12408, - Variant12409, - Variant12410, - Variant12411, - Variant12412, - Variant12413, - Variant12414, - Variant12415, - Variant12416, - Variant12417, - Variant12418, - Variant12419, - Variant12420, - Variant12421, - Variant12422, - Variant12423, - Variant12424, - Variant12425, - Variant12426, - Variant12427, - Variant12428, - Variant12429, - Variant12430, - Variant12431, - Variant12432, - Variant12433, - Variant12434, - Variant12435, - Variant12436, - Variant12437, - Variant12438, - Variant12439, - Variant12440, - Variant12441, - Variant12442, - Variant12443, - Variant12444, - Variant12445, - Variant12446, - Variant12447, - Variant12448, - Variant12449, - Variant12450, - Variant12451, - Variant12452, - Variant12453, - Variant12454, - Variant12455, - Variant12456, - Variant12457, - Variant12458, - Variant12459, - Variant12460, - Variant12461, - Variant12462, - Variant12463, - Variant12464, - Variant12465, - Variant12466, - Variant12467, - Variant12468, - Variant12469, - Variant12470, - Variant12471, - Variant12472, - Variant12473, - Variant12474, - Variant12475, - Variant12476, - Variant12477, - Variant12478, - Variant12479, - Variant12480, - Variant12481, - Variant12482, - Variant12483, - Variant12484, - Variant12485, - Variant12486, - Variant12487, - Variant12488, - Variant12489, - Variant12490, - Variant12491, - Variant12492, - Variant12493, - Variant12494, - Variant12495, - Variant12496, - Variant12497, - Variant12498, - Variant12499, - Variant12500, - Variant12501, - Variant12502, - Variant12503, - Variant12504, - Variant12505, - Variant12506, - Variant12507, - Variant12508, - Variant12509, - Variant12510, - Variant12511, - Variant12512, - Variant12513, - Variant12514, - Variant12515, - Variant12516, - Variant12517, - Variant12518, - Variant12519, - Variant12520, - Variant12521, - Variant12522, - Variant12523, - Variant12524, - Variant12525, - Variant12526, - Variant12527, - Variant12528, - Variant12529, - Variant12530, - Variant12531, - Variant12532, - Variant12533, - Variant12534, - Variant12535, - Variant12536, - Variant12537, - Variant12538, - Variant12539, - Variant12540, - Variant12541, - Variant12542, - Variant12543, - Variant12544, - Variant12545, - Variant12546, - Variant12547, - Variant12548, - Variant12549, - Variant12550, - Variant12551, - Variant12552, - Variant12553, - Variant12554, - Variant12555, - Variant12556, - Variant12557, - Variant12558, - Variant12559, - Variant12560, - Variant12561, - Variant12562, - Variant12563, - Variant12564, - Variant12565, - Variant12566, - Variant12567, - Variant12568, - Variant12569, - Variant12570, - Variant12571, - Variant12572, - Variant12573, - Variant12574, - Variant12575, - Variant12576, - Variant12577, - Variant12578, - Variant12579, - Variant12580, - Variant12581, - Variant12582, - Variant12583, - Variant12584, - Variant12585, - Variant12586, - Variant12587, - Variant12588, - Variant12589, - Variant12590, - Variant12591, - Variant12592, - Variant12593, - Variant12594, - Variant12595, - Variant12596, - Variant12597, - Variant12598, - Variant12599, - Variant12600, - Variant12601, - Variant12602, - Variant12603, - Variant12604, - Variant12605, - Variant12606, - Variant12607, - Variant12608, - Variant12609, - Variant12610, - Variant12611, - Variant12612, - Variant12613, - Variant12614, - Variant12615, - Variant12616, - Variant12617, - Variant12618, - Variant12619, - Variant12620, - Variant12621, - Variant12622, - Variant12623, - Variant12624, - Variant12625, - Variant12626, - Variant12627, - Variant12628, - Variant12629, - Variant12630, - Variant12631, - Variant12632, - Variant12633, - Variant12634, - Variant12635, - Variant12636, - Variant12637, - Variant12638, - Variant12639, - Variant12640, - Variant12641, - Variant12642, - Variant12643, - Variant12644, - Variant12645, - Variant12646, - Variant12647, - Variant12648, - Variant12649, - Variant12650, - Variant12651, - Variant12652, - Variant12653, - Variant12654, - Variant12655, - Variant12656, - Variant12657, - Variant12658, - Variant12659, - Variant12660, - Variant12661, - Variant12662, - Variant12663, - Variant12664, - Variant12665, - Variant12666, - Variant12667, - Variant12668, - Variant12669, - Variant12670, - Variant12671, - Variant12672, - Variant12673, - Variant12674, - Variant12675, - Variant12676, - Variant12677, - Variant12678, - Variant12679, - Variant12680, - Variant12681, - Variant12682, - Variant12683, - Variant12684, - Variant12685, - Variant12686, - Variant12687, - Variant12688, - Variant12689, - Variant12690, - Variant12691, - Variant12692, - Variant12693, - Variant12694, - Variant12695, - Variant12696, - Variant12697, - Variant12698, - Variant12699, - Variant12700, - Variant12701, - Variant12702, - Variant12703, - Variant12704, - Variant12705, - Variant12706, - Variant12707, - Variant12708, - Variant12709, - Variant12710, - Variant12711, - Variant12712, - Variant12713, - Variant12714, - Variant12715, - Variant12716, - Variant12717, - Variant12718, - Variant12719, - Variant12720, - Variant12721, - Variant12722, - Variant12723, - Variant12724, - Variant12725, - Variant12726, - Variant12727, - Variant12728, - Variant12729, - Variant12730, - Variant12731, - Variant12732, - Variant12733, - Variant12734, - Variant12735, - Variant12736, - Variant12737, - Variant12738, - Variant12739, - Variant12740, - Variant12741, - Variant12742, - Variant12743, - Variant12744, - Variant12745, - Variant12746, - Variant12747, - Variant12748, - Variant12749, - Variant12750, - Variant12751, - Variant12752, - Variant12753, - Variant12754, - Variant12755, - Variant12756, - Variant12757, - Variant12758, - Variant12759, - Variant12760, - Variant12761, - Variant12762, - Variant12763, - Variant12764, - Variant12765, - Variant12766, - Variant12767, - Variant12768, - Variant12769, - Variant12770, - Variant12771, - Variant12772, - Variant12773, - Variant12774, - Variant12775, - Variant12776, - Variant12777, - Variant12778, - Variant12779, - Variant12780, - Variant12781, - Variant12782, - Variant12783, - Variant12784, - Variant12785, - Variant12786, - Variant12787, - Variant12788, - Variant12789, - Variant12790, - Variant12791, - Variant12792, - Variant12793, - Variant12794, - Variant12795, - Variant12796, - Variant12797, - Variant12798, - Variant12799, - Variant12800, - Variant12801, - Variant12802, - Variant12803, - Variant12804, - Variant12805, - Variant12806, - Variant12807, - Variant12808, - Variant12809, - Variant12810, - Variant12811, - Variant12812, - Variant12813, - Variant12814, - Variant12815, - Variant12816, - Variant12817, - Variant12818, - Variant12819, - Variant12820, - Variant12821, - Variant12822, - Variant12823, - Variant12824, - Variant12825, - Variant12826, - Variant12827, - Variant12828, - Variant12829, - Variant12830, - Variant12831, - Variant12832, - Variant12833, - Variant12834, - Variant12835, - Variant12836, - Variant12837, - Variant12838, - Variant12839, - Variant12840, - Variant12841, - Variant12842, - Variant12843, - Variant12844, - Variant12845, - Variant12846, - Variant12847, - Variant12848, - Variant12849, - Variant12850, - Variant12851, - Variant12852, - Variant12853, - Variant12854, - Variant12855, - Variant12856, - Variant12857, - Variant12858, - Variant12859, - Variant12860, - Variant12861, - Variant12862, - Variant12863, - Variant12864, - Variant12865, - Variant12866, - Variant12867, - Variant12868, - Variant12869, - Variant12870, - Variant12871, - Variant12872, - Variant12873, - Variant12874, - Variant12875, - Variant12876, - Variant12877, - Variant12878, - Variant12879, - Variant12880, - Variant12881, - Variant12882, - Variant12883, - Variant12884, - Variant12885, - Variant12886, - Variant12887, - Variant12888, - Variant12889, - Variant12890, - Variant12891, - Variant12892, - Variant12893, - Variant12894, - Variant12895, - Variant12896, - Variant12897, - Variant12898, - Variant12899, - Variant12900, - Variant12901, - Variant12902, - Variant12903, - Variant12904, - Variant12905, - Variant12906, - Variant12907, - Variant12908, - Variant12909, - Variant12910, - Variant12911, - Variant12912, - Variant12913, - Variant12914, - Variant12915, - Variant12916, - Variant12917, - Variant12918, - Variant12919, - Variant12920, - Variant12921, - Variant12922, - Variant12923, - Variant12924, - Variant12925, - Variant12926, - Variant12927, - Variant12928, - Variant12929, - Variant12930, - Variant12931, - Variant12932, - Variant12933, - Variant12934, - Variant12935, - Variant12936, - Variant12937, - Variant12938, - Variant12939, - Variant12940, - Variant12941, - Variant12942, - Variant12943, - Variant12944, - Variant12945, - Variant12946, - Variant12947, - Variant12948, - Variant12949, - Variant12950, - Variant12951, - Variant12952, - Variant12953, - Variant12954, - Variant12955, - Variant12956, - Variant12957, - Variant12958, - Variant12959, - Variant12960, - Variant12961, - Variant12962, - Variant12963, - Variant12964, - Variant12965, - Variant12966, - Variant12967, - Variant12968, - Variant12969, - Variant12970, - Variant12971, - Variant12972, - Variant12973, - Variant12974, - Variant12975, - Variant12976, - Variant12977, - Variant12978, - Variant12979, - Variant12980, - Variant12981, - Variant12982, - Variant12983, - Variant12984, - Variant12985, - Variant12986, - Variant12987, - Variant12988, - Variant12989, - Variant12990, - Variant12991, - Variant12992, - Variant12993, - Variant12994, - Variant12995, - Variant12996, - Variant12997, - Variant12998, - Variant12999, - Variant13000, - Variant13001, - Variant13002, - Variant13003, - Variant13004, - Variant13005, - Variant13006, - Variant13007, - Variant13008, - Variant13009, - Variant13010, - Variant13011, - Variant13012, - Variant13013, - Variant13014, - Variant13015, - Variant13016, - Variant13017, - Variant13018, - Variant13019, - Variant13020, - Variant13021, - Variant13022, - Variant13023, - Variant13024, - Variant13025, - Variant13026, - Variant13027, - Variant13028, - Variant13029, - Variant13030, - Variant13031, - Variant13032, - Variant13033, - Variant13034, - Variant13035, - Variant13036, - Variant13037, - Variant13038, - Variant13039, - Variant13040, - Variant13041, - Variant13042, - Variant13043, - Variant13044, - Variant13045, - Variant13046, - Variant13047, - Variant13048, - Variant13049, - Variant13050, - Variant13051, - Variant13052, - Variant13053, - Variant13054, - Variant13055, - Variant13056, - Variant13057, - Variant13058, - Variant13059, - Variant13060, - Variant13061, - Variant13062, - Variant13063, - Variant13064, - Variant13065, - Variant13066, - Variant13067, - Variant13068, - Variant13069, - Variant13070, - Variant13071, - Variant13072, - Variant13073, - Variant13074, - Variant13075, - Variant13076, - Variant13077, - Variant13078, - Variant13079, - Variant13080, - Variant13081, - Variant13082, - Variant13083, - Variant13084, - Variant13085, - Variant13086, - Variant13087, - Variant13088, - Variant13089, - Variant13090, - Variant13091, - Variant13092, - Variant13093, - Variant13094, - Variant13095, - Variant13096, - Variant13097, - Variant13098, - Variant13099, - Variant13100, - Variant13101, - Variant13102, - Variant13103, - Variant13104, - Variant13105, - Variant13106, - Variant13107, - Variant13108, - Variant13109, - Variant13110, - Variant13111, - Variant13112, - Variant13113, - Variant13114, - Variant13115, - Variant13116, - Variant13117, - Variant13118, - Variant13119, - Variant13120, - Variant13121, - Variant13122, - Variant13123, - Variant13124, - Variant13125, - Variant13126, - Variant13127, - Variant13128, - Variant13129, - Variant13130, - Variant13131, - Variant13132, - Variant13133, - Variant13134, - Variant13135, - Variant13136, - Variant13137, - Variant13138, - Variant13139, - Variant13140, - Variant13141, - Variant13142, - Variant13143, - Variant13144, - Variant13145, - Variant13146, - Variant13147, - Variant13148, - Variant13149, - Variant13150, - Variant13151, - Variant13152, - Variant13153, - Variant13154, - Variant13155, - Variant13156, - Variant13157, - Variant13158, - Variant13159, - Variant13160, - Variant13161, - Variant13162, - Variant13163, - Variant13164, - Variant13165, - Variant13166, - Variant13167, - Variant13168, - Variant13169, - Variant13170, - Variant13171, - Variant13172, - Variant13173, - Variant13174, - Variant13175, - Variant13176, - Variant13177, - Variant13178, - Variant13179, - Variant13180, - Variant13181, - Variant13182, - Variant13183, - Variant13184, - Variant13185, - Variant13186, - Variant13187, - Variant13188, - Variant13189, - Variant13190, - Variant13191, - Variant13192, - Variant13193, - Variant13194, - Variant13195, - Variant13196, - Variant13197, - Variant13198, - Variant13199, - Variant13200, - Variant13201, - Variant13202, - Variant13203, - Variant13204, - Variant13205, - Variant13206, - Variant13207, - Variant13208, - Variant13209, - Variant13210, - Variant13211, - Variant13212, - Variant13213, - Variant13214, - Variant13215, - Variant13216, - Variant13217, - Variant13218, - Variant13219, - Variant13220, - Variant13221, - Variant13222, - Variant13223, - Variant13224, - Variant13225, - Variant13226, - Variant13227, - Variant13228, - Variant13229, - Variant13230, - Variant13231, - Variant13232, - Variant13233, - Variant13234, - Variant13235, - Variant13236, - Variant13237, - Variant13238, - Variant13239, - Variant13240, - Variant13241, - Variant13242, - Variant13243, - Variant13244, - Variant13245, - Variant13246, - Variant13247, - Variant13248, - Variant13249, - Variant13250, - Variant13251, - Variant13252, - Variant13253, - Variant13254, - Variant13255, - Variant13256, - Variant13257, - Variant13258, - Variant13259, - Variant13260, - Variant13261, - Variant13262, - Variant13263, - Variant13264, - Variant13265, - Variant13266, - Variant13267, - Variant13268, - Variant13269, - Variant13270, - Variant13271, - Variant13272, - Variant13273, - Variant13274, - Variant13275, - Variant13276, - Variant13277, - Variant13278, - Variant13279, - Variant13280, - Variant13281, - Variant13282, - Variant13283, - Variant13284, - Variant13285, - Variant13286, - Variant13287, - Variant13288, - Variant13289, - Variant13290, - Variant13291, - Variant13292, - Variant13293, - Variant13294, - Variant13295, - Variant13296, - Variant13297, - Variant13298, - Variant13299, - Variant13300, - Variant13301, - Variant13302, - Variant13303, - Variant13304, - Variant13305, - Variant13306, - Variant13307, - Variant13308, - Variant13309, - Variant13310, - Variant13311, - Variant13312, - Variant13313, - Variant13314, - Variant13315, - Variant13316, - Variant13317, - Variant13318, - Variant13319, - Variant13320, - Variant13321, - Variant13322, - Variant13323, - Variant13324, - Variant13325, - Variant13326, - Variant13327, - Variant13328, - Variant13329, - Variant13330, - Variant13331, - Variant13332, - Variant13333, - Variant13334, - Variant13335, - Variant13336, - Variant13337, - Variant13338, - Variant13339, - Variant13340, - Variant13341, - Variant13342, - Variant13343, - Variant13344, - Variant13345, - Variant13346, - Variant13347, - Variant13348, - Variant13349, - Variant13350, - Variant13351, - Variant13352, - Variant13353, - Variant13354, - Variant13355, - Variant13356, - Variant13357, - Variant13358, - Variant13359, - Variant13360, - Variant13361, - Variant13362, - Variant13363, - Variant13364, - Variant13365, - Variant13366, - Variant13367, - Variant13368, - Variant13369, - Variant13370, - Variant13371, - Variant13372, - Variant13373, - Variant13374, - Variant13375, - Variant13376, - Variant13377, - Variant13378, - Variant13379, - Variant13380, - Variant13381, - Variant13382, - Variant13383, - Variant13384, - Variant13385, - Variant13386, - Variant13387, - Variant13388, - Variant13389, - Variant13390, - Variant13391, - Variant13392, - Variant13393, - Variant13394, - Variant13395, - Variant13396, - Variant13397, - Variant13398, - Variant13399, - Variant13400, - Variant13401, - Variant13402, - Variant13403, - Variant13404, - Variant13405, - Variant13406, - Variant13407, - Variant13408, - Variant13409, - Variant13410, - Variant13411, - Variant13412, - Variant13413, - Variant13414, - Variant13415, - Variant13416, - Variant13417, - Variant13418, - Variant13419, - Variant13420, - Variant13421, - Variant13422, - Variant13423, - Variant13424, - Variant13425, - Variant13426, - Variant13427, - Variant13428, - Variant13429, - Variant13430, - Variant13431, - Variant13432, - Variant13433, - Variant13434, - Variant13435, - Variant13436, - Variant13437, - Variant13438, - Variant13439, - Variant13440, - Variant13441, - Variant13442, - Variant13443, - Variant13444, - Variant13445, - Variant13446, - Variant13447, - Variant13448, - Variant13449, - Variant13450, - Variant13451, - Variant13452, - Variant13453, - Variant13454, - Variant13455, - Variant13456, - Variant13457, - Variant13458, - Variant13459, - Variant13460, - Variant13461, - Variant13462, - Variant13463, - Variant13464, - Variant13465, - Variant13466, - Variant13467, - Variant13468, - Variant13469, - Variant13470, - Variant13471, - Variant13472, - Variant13473, - Variant13474, - Variant13475, - Variant13476, - Variant13477, - Variant13478, - Variant13479, - Variant13480, - Variant13481, - Variant13482, - Variant13483, - Variant13484, - Variant13485, - Variant13486, - Variant13487, - Variant13488, - Variant13489, - Variant13490, - Variant13491, - Variant13492, - Variant13493, - Variant13494, - Variant13495, - Variant13496, - Variant13497, - Variant13498, - Variant13499, - Variant13500, - Variant13501, - Variant13502, - Variant13503, - Variant13504, - Variant13505, - Variant13506, - Variant13507, - Variant13508, - Variant13509, - Variant13510, - Variant13511, - Variant13512, - Variant13513, - Variant13514, - Variant13515, - Variant13516, - Variant13517, - Variant13518, - Variant13519, - Variant13520, - Variant13521, - Variant13522, - Variant13523, - Variant13524, - Variant13525, - Variant13526, - Variant13527, - Variant13528, - Variant13529, - Variant13530, - Variant13531, - Variant13532, - Variant13533, - Variant13534, - Variant13535, - Variant13536, - Variant13537, - Variant13538, - Variant13539, - Variant13540, - Variant13541, - Variant13542, - Variant13543, - Variant13544, - Variant13545, - Variant13546, - Variant13547, - Variant13548, - Variant13549, - Variant13550, - Variant13551, - Variant13552, - Variant13553, - Variant13554, - Variant13555, - Variant13556, - Variant13557, - Variant13558, - Variant13559, - Variant13560, - Variant13561, - Variant13562, - Variant13563, - Variant13564, - Variant13565, - Variant13566, - Variant13567, - Variant13568, - Variant13569, - Variant13570, - Variant13571, - Variant13572, - Variant13573, - Variant13574, - Variant13575, - Variant13576, - Variant13577, - Variant13578, - Variant13579, - Variant13580, - Variant13581, - Variant13582, - Variant13583, - Variant13584, - Variant13585, - Variant13586, - Variant13587, - Variant13588, - Variant13589, - Variant13590, - Variant13591, - Variant13592, - Variant13593, - Variant13594, - Variant13595, - Variant13596, - Variant13597, - Variant13598, - Variant13599, - Variant13600, - Variant13601, - Variant13602, - Variant13603, - Variant13604, - Variant13605, - Variant13606, - Variant13607, - Variant13608, - Variant13609, - Variant13610, - Variant13611, - Variant13612, - Variant13613, - Variant13614, - Variant13615, - Variant13616, - Variant13617, - Variant13618, - Variant13619, - Variant13620, - Variant13621, - Variant13622, - Variant13623, - Variant13624, - Variant13625, - Variant13626, - Variant13627, - Variant13628, - Variant13629, - Variant13630, - Variant13631, - Variant13632, - Variant13633, - Variant13634, - Variant13635, - Variant13636, - Variant13637, - Variant13638, - Variant13639, - Variant13640, - Variant13641, - Variant13642, - Variant13643, - Variant13644, - Variant13645, - Variant13646, - Variant13647, - Variant13648, - Variant13649, - Variant13650, - Variant13651, - Variant13652, - Variant13653, - Variant13654, - Variant13655, - Variant13656, - Variant13657, - Variant13658, - Variant13659, - Variant13660, - Variant13661, - Variant13662, - Variant13663, - Variant13664, - Variant13665, - Variant13666, - Variant13667, - Variant13668, - Variant13669, - Variant13670, - Variant13671, - Variant13672, - Variant13673, - Variant13674, - Variant13675, - Variant13676, - Variant13677, - Variant13678, - Variant13679, - Variant13680, - Variant13681, - Variant13682, - Variant13683, - Variant13684, - Variant13685, - Variant13686, - Variant13687, - Variant13688, - Variant13689, - Variant13690, - Variant13691, - Variant13692, - Variant13693, - Variant13694, - Variant13695, - Variant13696, - Variant13697, - Variant13698, - Variant13699, - Variant13700, - Variant13701, - Variant13702, - Variant13703, - Variant13704, - Variant13705, - Variant13706, - Variant13707, - Variant13708, - Variant13709, - Variant13710, - Variant13711, - Variant13712, - Variant13713, - Variant13714, - Variant13715, - Variant13716, - Variant13717, - Variant13718, - Variant13719, - Variant13720, - Variant13721, - Variant13722, - Variant13723, - Variant13724, - Variant13725, - Variant13726, - Variant13727, - Variant13728, - Variant13729, - Variant13730, - Variant13731, - Variant13732, - Variant13733, - Variant13734, - Variant13735, - Variant13736, - Variant13737, - Variant13738, - Variant13739, - Variant13740, - Variant13741, - Variant13742, - Variant13743, - Variant13744, - Variant13745, - Variant13746, - Variant13747, - Variant13748, - Variant13749, - Variant13750, - Variant13751, - Variant13752, - Variant13753, - Variant13754, - Variant13755, - Variant13756, - Variant13757, - Variant13758, - Variant13759, - Variant13760, - Variant13761, - Variant13762, - Variant13763, - Variant13764, - Variant13765, - Variant13766, - Variant13767, - Variant13768, - Variant13769, - Variant13770, - Variant13771, - Variant13772, - Variant13773, - Variant13774, - Variant13775, - Variant13776, - Variant13777, - Variant13778, - Variant13779, - Variant13780, - Variant13781, - Variant13782, - Variant13783, - Variant13784, - Variant13785, - Variant13786, - Variant13787, - Variant13788, - Variant13789, - Variant13790, - Variant13791, - Variant13792, - Variant13793, - Variant13794, - Variant13795, - Variant13796, - Variant13797, - Variant13798, - Variant13799, - Variant13800, - Variant13801, - Variant13802, - Variant13803, - Variant13804, - Variant13805, - Variant13806, - Variant13807, - Variant13808, - Variant13809, - Variant13810, - Variant13811, - Variant13812, - Variant13813, - Variant13814, - Variant13815, - Variant13816, - Variant13817, - Variant13818, - Variant13819, - Variant13820, - Variant13821, - Variant13822, - Variant13823, - Variant13824, - Variant13825, - Variant13826, - Variant13827, - Variant13828, - Variant13829, - Variant13830, - Variant13831, - Variant13832, - Variant13833, - Variant13834, - Variant13835, - Variant13836, - Variant13837, - Variant13838, - Variant13839, - Variant13840, - Variant13841, - Variant13842, - Variant13843, - Variant13844, - Variant13845, - Variant13846, - Variant13847, - Variant13848, - Variant13849, - Variant13850, - Variant13851, - Variant13852, - Variant13853, - Variant13854, - Variant13855, - Variant13856, - Variant13857, - Variant13858, - Variant13859, - Variant13860, - Variant13861, - Variant13862, - Variant13863, - Variant13864, - Variant13865, - Variant13866, - Variant13867, - Variant13868, - Variant13869, - Variant13870, - Variant13871, - Variant13872, - Variant13873, - Variant13874, - Variant13875, - Variant13876, - Variant13877, - Variant13878, - Variant13879, - Variant13880, - Variant13881, - Variant13882, - Variant13883, - Variant13884, - Variant13885, - Variant13886, - Variant13887, - Variant13888, - Variant13889, - Variant13890, - Variant13891, - Variant13892, - Variant13893, - Variant13894, - Variant13895, - Variant13896, - Variant13897, - Variant13898, - Variant13899, - Variant13900, - Variant13901, - Variant13902, - Variant13903, - Variant13904, - Variant13905, - Variant13906, - Variant13907, - Variant13908, - Variant13909, - Variant13910, - Variant13911, - Variant13912, - Variant13913, - Variant13914, - Variant13915, - Variant13916, - Variant13917, - Variant13918, - Variant13919, - Variant13920, - Variant13921, - Variant13922, - Variant13923, - Variant13924, - Variant13925, - Variant13926, - Variant13927, - Variant13928, - Variant13929, - Variant13930, - Variant13931, - Variant13932, - Variant13933, - Variant13934, - Variant13935, - Variant13936, - Variant13937, - Variant13938, - Variant13939, - Variant13940, - Variant13941, - Variant13942, - Variant13943, - Variant13944, - Variant13945, - Variant13946, - Variant13947, - Variant13948, - Variant13949, - Variant13950, - Variant13951, - Variant13952, - Variant13953, - Variant13954, - Variant13955, - Variant13956, - Variant13957, - Variant13958, - Variant13959, - Variant13960, - Variant13961, - Variant13962, - Variant13963, - Variant13964, - Variant13965, - Variant13966, - Variant13967, - Variant13968, - Variant13969, - Variant13970, - Variant13971, - Variant13972, - Variant13973, - Variant13974, - Variant13975, - Variant13976, - Variant13977, - Variant13978, - Variant13979, - Variant13980, - Variant13981, - Variant13982, - Variant13983, - Variant13984, - Variant13985, - Variant13986, - Variant13987, - Variant13988, - Variant13989, - Variant13990, - Variant13991, - Variant13992, - Variant13993, - Variant13994, - Variant13995, - Variant13996, - Variant13997, - Variant13998, - Variant13999, - Variant14000, - Variant14001, - Variant14002, - Variant14003, - Variant14004, - Variant14005, - Variant14006, - Variant14007, - Variant14008, - Variant14009, - Variant14010, - Variant14011, - Variant14012, - Variant14013, - Variant14014, - Variant14015, - Variant14016, - Variant14017, - Variant14018, - Variant14019, - Variant14020, - Variant14021, - Variant14022, - Variant14023, - Variant14024, - Variant14025, - Variant14026, - Variant14027, - Variant14028, - Variant14029, - Variant14030, - Variant14031, - Variant14032, - Variant14033, - Variant14034, - Variant14035, - Variant14036, - Variant14037, - Variant14038, - Variant14039, - Variant14040, - Variant14041, - Variant14042, - Variant14043, - Variant14044, - Variant14045, - Variant14046, - Variant14047, - Variant14048, - Variant14049, - Variant14050, - Variant14051, - Variant14052, - Variant14053, - Variant14054, - Variant14055, - Variant14056, - Variant14057, - Variant14058, - Variant14059, - Variant14060, - Variant14061, - Variant14062, - Variant14063, - Variant14064, - Variant14065, - Variant14066, - Variant14067, - Variant14068, - Variant14069, - Variant14070, - Variant14071, - Variant14072, - Variant14073, - Variant14074, - Variant14075, - Variant14076, - Variant14077, - Variant14078, - Variant14079, - Variant14080, - Variant14081, - Variant14082, - Variant14083, - Variant14084, - Variant14085, - Variant14086, - Variant14087, - Variant14088, - Variant14089, - Variant14090, - Variant14091, - Variant14092, - Variant14093, - Variant14094, - Variant14095, - Variant14096, - Variant14097, - Variant14098, - Variant14099, - Variant14100, - Variant14101, - Variant14102, - Variant14103, - Variant14104, - Variant14105, - Variant14106, - Variant14107, - Variant14108, - Variant14109, - Variant14110, - Variant14111, - Variant14112, - Variant14113, - Variant14114, - Variant14115, - Variant14116, - Variant14117, - Variant14118, - Variant14119, - Variant14120, - Variant14121, - Variant14122, - Variant14123, - Variant14124, - Variant14125, - Variant14126, - Variant14127, - Variant14128, - Variant14129, - Variant14130, - Variant14131, - Variant14132, - Variant14133, - Variant14134, - Variant14135, - Variant14136, - Variant14137, - Variant14138, - Variant14139, - Variant14140, - Variant14141, - Variant14142, - Variant14143, - Variant14144, - Variant14145, - Variant14146, - Variant14147, - Variant14148, - Variant14149, - Variant14150, - Variant14151, - Variant14152, - Variant14153, - Variant14154, - Variant14155, - Variant14156, - Variant14157, - Variant14158, - Variant14159, - Variant14160, - Variant14161, - Variant14162, - Variant14163, - Variant14164, - Variant14165, - Variant14166, - Variant14167, - Variant14168, - Variant14169, - Variant14170, - Variant14171, - Variant14172, - Variant14173, - Variant14174, - Variant14175, - Variant14176, - Variant14177, - Variant14178, - Variant14179, - Variant14180, - Variant14181, - Variant14182, - Variant14183, - Variant14184, - Variant14185, - Variant14186, - Variant14187, - Variant14188, - Variant14189, - Variant14190, - Variant14191, - Variant14192, - Variant14193, - Variant14194, - Variant14195, - Variant14196, - Variant14197, - Variant14198, - Variant14199, - Variant14200, - Variant14201, - Variant14202, - Variant14203, - Variant14204, - Variant14205, - Variant14206, - Variant14207, - Variant14208, - Variant14209, - Variant14210, - Variant14211, - Variant14212, - Variant14213, - Variant14214, - Variant14215, - Variant14216, - Variant14217, - Variant14218, - Variant14219, - Variant14220, - Variant14221, - Variant14222, - Variant14223, - Variant14224, - Variant14225, - Variant14226, - Variant14227, - Variant14228, - Variant14229, - Variant14230, - Variant14231, - Variant14232, - Variant14233, - Variant14234, - Variant14235, - Variant14236, - Variant14237, - Variant14238, - Variant14239, - Variant14240, - Variant14241, - Variant14242, - Variant14243, - Variant14244, - Variant14245, - Variant14246, - Variant14247, - Variant14248, - Variant14249, - Variant14250, - Variant14251, - Variant14252, - Variant14253, - Variant14254, - Variant14255, - Variant14256, - Variant14257, - Variant14258, - Variant14259, - Variant14260, - Variant14261, - Variant14262, - Variant14263, - Variant14264, - Variant14265, - Variant14266, - Variant14267, - Variant14268, - Variant14269, - Variant14270, - Variant14271, - Variant14272, - Variant14273, - Variant14274, - Variant14275, - Variant14276, - Variant14277, - Variant14278, - Variant14279, - Variant14280, - Variant14281, - Variant14282, - Variant14283, - Variant14284, - Variant14285, - Variant14286, - Variant14287, - Variant14288, - Variant14289, - Variant14290, - Variant14291, - Variant14292, - Variant14293, - Variant14294, - Variant14295, - Variant14296, - Variant14297, - Variant14298, - Variant14299, - Variant14300, - Variant14301, - Variant14302, - Variant14303, - Variant14304, - Variant14305, - Variant14306, - Variant14307, - Variant14308, - Variant14309, - Variant14310, - Variant14311, - Variant14312, - Variant14313, - Variant14314, - Variant14315, - Variant14316, - Variant14317, - Variant14318, - Variant14319, - Variant14320, - Variant14321, - Variant14322, - Variant14323, - Variant14324, - Variant14325, - Variant14326, - Variant14327, - Variant14328, - Variant14329, - Variant14330, - Variant14331, - Variant14332, - Variant14333, - Variant14334, - Variant14335, - Variant14336, - Variant14337, - Variant14338, - Variant14339, - Variant14340, - Variant14341, - Variant14342, - Variant14343, - Variant14344, - Variant14345, - Variant14346, - Variant14347, - Variant14348, - Variant14349, - Variant14350, - Variant14351, - Variant14352, - Variant14353, - Variant14354, - Variant14355, - Variant14356, - Variant14357, - Variant14358, - Variant14359, - Variant14360, - Variant14361, - Variant14362, - Variant14363, - Variant14364, - Variant14365, - Variant14366, - Variant14367, - Variant14368, - Variant14369, - Variant14370, - Variant14371, - Variant14372, - Variant14373, - Variant14374, - Variant14375, - Variant14376, - Variant14377, - Variant14378, - Variant14379, - Variant14380, - Variant14381, - Variant14382, - Variant14383, - Variant14384, - Variant14385, - Variant14386, - Variant14387, - Variant14388, - Variant14389, - Variant14390, - Variant14391, - Variant14392, - Variant14393, - Variant14394, - Variant14395, - Variant14396, - Variant14397, - Variant14398, - Variant14399, - Variant14400, - Variant14401, - Variant14402, - Variant14403, - Variant14404, - Variant14405, - Variant14406, - Variant14407, - Variant14408, - Variant14409, - Variant14410, - Variant14411, - Variant14412, - Variant14413, - Variant14414, - Variant14415, - Variant14416, - Variant14417, - Variant14418, - Variant14419, - Variant14420, - Variant14421, - Variant14422, - Variant14423, - Variant14424, - Variant14425, - Variant14426, - Variant14427, - Variant14428, - Variant14429, - Variant14430, - Variant14431, - Variant14432, - Variant14433, - Variant14434, - Variant14435, - Variant14436, - Variant14437, - Variant14438, - Variant14439, - Variant14440, - Variant14441, - Variant14442, - Variant14443, - Variant14444, - Variant14445, - Variant14446, - Variant14447, - Variant14448, - Variant14449, - Variant14450, - Variant14451, - Variant14452, - Variant14453, - Variant14454, - Variant14455, - Variant14456, - Variant14457, - Variant14458, - Variant14459, - Variant14460, - Variant14461, - Variant14462, - Variant14463, - Variant14464, - Variant14465, - Variant14466, - Variant14467, - Variant14468, - Variant14469, - Variant14470, - Variant14471, - Variant14472, - Variant14473, - Variant14474, - Variant14475, - Variant14476, - Variant14477, - Variant14478, - Variant14479, - Variant14480, - Variant14481, - Variant14482, - Variant14483, - Variant14484, - Variant14485, - Variant14486, - Variant14487, - Variant14488, - Variant14489, - Variant14490, - Variant14491, - Variant14492, - Variant14493, - Variant14494, - Variant14495, - Variant14496, - Variant14497, - Variant14498, - Variant14499, - Variant14500, - Variant14501, - Variant14502, - Variant14503, - Variant14504, - Variant14505, - Variant14506, - Variant14507, - Variant14508, - Variant14509, - Variant14510, - Variant14511, - Variant14512, - Variant14513, - Variant14514, - Variant14515, - Variant14516, - Variant14517, - Variant14518, - Variant14519, - Variant14520, - Variant14521, - Variant14522, - Variant14523, - Variant14524, - Variant14525, - Variant14526, - Variant14527, - Variant14528, - Variant14529, - Variant14530, - Variant14531, - Variant14532, - Variant14533, - Variant14534, - Variant14535, - Variant14536, - Variant14537, - Variant14538, - Variant14539, - Variant14540, - Variant14541, - Variant14542, - Variant14543, - Variant14544, - Variant14545, - Variant14546, - Variant14547, - Variant14548, - Variant14549, - Variant14550, - Variant14551, - Variant14552, - Variant14553, - Variant14554, - Variant14555, - Variant14556, - Variant14557, - Variant14558, - Variant14559, - Variant14560, - Variant14561, - Variant14562, - Variant14563, - Variant14564, - Variant14565, - Variant14566, - Variant14567, - Variant14568, - Variant14569, - Variant14570, - Variant14571, - Variant14572, - Variant14573, - Variant14574, - Variant14575, - Variant14576, - Variant14577, - Variant14578, - Variant14579, - Variant14580, - Variant14581, - Variant14582, - Variant14583, - Variant14584, - Variant14585, - Variant14586, - Variant14587, - Variant14588, - Variant14589, - Variant14590, - Variant14591, - Variant14592, - Variant14593, - Variant14594, - Variant14595, - Variant14596, - Variant14597, - Variant14598, - Variant14599, - Variant14600, - Variant14601, - Variant14602, - Variant14603, - Variant14604, - Variant14605, - Variant14606, - Variant14607, - Variant14608, - Variant14609, - Variant14610, - Variant14611, - Variant14612, - Variant14613, - Variant14614, - Variant14615, - Variant14616, - Variant14617, - Variant14618, - Variant14619, - Variant14620, - Variant14621, - Variant14622, - Variant14623, - Variant14624, - Variant14625, - Variant14626, - Variant14627, - Variant14628, - Variant14629, - Variant14630, - Variant14631, - Variant14632, - Variant14633, - Variant14634, - Variant14635, - Variant14636, - Variant14637, - Variant14638, - Variant14639, - Variant14640, - Variant14641, - Variant14642, - Variant14643, - Variant14644, - Variant14645, - Variant14646, - Variant14647, - Variant14648, - Variant14649, - Variant14650, - Variant14651, - Variant14652, - Variant14653, - Variant14654, - Variant14655, - Variant14656, - Variant14657, - Variant14658, - Variant14659, - Variant14660, - Variant14661, - Variant14662, - Variant14663, - Variant14664, - Variant14665, - Variant14666, - Variant14667, - Variant14668, - Variant14669, - Variant14670, - Variant14671, - Variant14672, - Variant14673, - Variant14674, - Variant14675, - Variant14676, - Variant14677, - Variant14678, - Variant14679, - Variant14680, - Variant14681, - Variant14682, - Variant14683, - Variant14684, - Variant14685, - Variant14686, - Variant14687, - Variant14688, - Variant14689, - Variant14690, - Variant14691, - Variant14692, - Variant14693, - Variant14694, - Variant14695, - Variant14696, - Variant14697, - Variant14698, - Variant14699, - Variant14700, - Variant14701, - Variant14702, - Variant14703, - Variant14704, - Variant14705, - Variant14706, - Variant14707, - Variant14708, - Variant14709, - Variant14710, - Variant14711, - Variant14712, - Variant14713, - Variant14714, - Variant14715, - Variant14716, - Variant14717, - Variant14718, - Variant14719, - Variant14720, - Variant14721, - Variant14722, - Variant14723, - Variant14724, - Variant14725, - Variant14726, - Variant14727, - Variant14728, - Variant14729, - Variant14730, - Variant14731, - Variant14732, - Variant14733, - Variant14734, - Variant14735, - Variant14736, - Variant14737, - Variant14738, - Variant14739, - Variant14740, - Variant14741, - Variant14742, - Variant14743, - Variant14744, - Variant14745, - Variant14746, - Variant14747, - Variant14748, - Variant14749, - Variant14750, - Variant14751, - Variant14752, - Variant14753, - Variant14754, - Variant14755, - Variant14756, - Variant14757, - Variant14758, - Variant14759, - Variant14760, - Variant14761, - Variant14762, - Variant14763, - Variant14764, - Variant14765, - Variant14766, - Variant14767, - Variant14768, - Variant14769, - Variant14770, - Variant14771, - Variant14772, - Variant14773, - Variant14774, - Variant14775, - Variant14776, - Variant14777, - Variant14778, - Variant14779, - Variant14780, - Variant14781, - Variant14782, - Variant14783, - Variant14784, - Variant14785, - Variant14786, - Variant14787, - Variant14788, - Variant14789, - Variant14790, - Variant14791, - Variant14792, - Variant14793, - Variant14794, - Variant14795, - Variant14796, - Variant14797, - Variant14798, - Variant14799, - Variant14800, - Variant14801, - Variant14802, - Variant14803, - Variant14804, - Variant14805, - Variant14806, - Variant14807, - Variant14808, - Variant14809, - Variant14810, - Variant14811, - Variant14812, - Variant14813, - Variant14814, - Variant14815, - Variant14816, - Variant14817, - Variant14818, - Variant14819, - Variant14820, - Variant14821, - Variant14822, - Variant14823, - Variant14824, - Variant14825, - Variant14826, - Variant14827, - Variant14828, - Variant14829, - Variant14830, - Variant14831, - Variant14832, - Variant14833, - Variant14834, - Variant14835, - Variant14836, - Variant14837, - Variant14838, - Variant14839, - Variant14840, - Variant14841, - Variant14842, - Variant14843, - Variant14844, - Variant14845, - Variant14846, - Variant14847, - Variant14848, - Variant14849, - Variant14850, - Variant14851, - Variant14852, - Variant14853, - Variant14854, - Variant14855, - Variant14856, - Variant14857, - Variant14858, - Variant14859, - Variant14860, - Variant14861, - Variant14862, - Variant14863, - Variant14864, - Variant14865, - Variant14866, - Variant14867, - Variant14868, - Variant14869, - Variant14870, - Variant14871, - Variant14872, - Variant14873, - Variant14874, - Variant14875, - Variant14876, - Variant14877, - Variant14878, - Variant14879, - Variant14880, - Variant14881, - Variant14882, - Variant14883, - Variant14884, - Variant14885, - Variant14886, - Variant14887, - Variant14888, - Variant14889, - Variant14890, - Variant14891, - Variant14892, - Variant14893, - Variant14894, - Variant14895, - Variant14896, - Variant14897, - Variant14898, - Variant14899, - Variant14900, - Variant14901, - Variant14902, - Variant14903, - Variant14904, - Variant14905, - Variant14906, - Variant14907, - Variant14908, - Variant14909, - Variant14910, - Variant14911, - Variant14912, - Variant14913, - Variant14914, - Variant14915, - Variant14916, - Variant14917, - Variant14918, - Variant14919, - Variant14920, - Variant14921, - Variant14922, - Variant14923, - Variant14924, - Variant14925, - Variant14926, - Variant14927, - Variant14928, - Variant14929, - Variant14930, - Variant14931, - Variant14932, - Variant14933, - Variant14934, - Variant14935, - Variant14936, - Variant14937, - Variant14938, - Variant14939, - Variant14940, - Variant14941, - Variant14942, - Variant14943, - Variant14944, - Variant14945, - Variant14946, - Variant14947, - Variant14948, - Variant14949, - Variant14950, - Variant14951, - Variant14952, - Variant14953, - Variant14954, - Variant14955, - Variant14956, - Variant14957, - Variant14958, - Variant14959, - Variant14960, - Variant14961, - Variant14962, - Variant14963, - Variant14964, - Variant14965, - Variant14966, - Variant14967, - Variant14968, - Variant14969, - Variant14970, - Variant14971, - Variant14972, - Variant14973, - Variant14974, - Variant14975, - Variant14976, - Variant14977, - Variant14978, - Variant14979, - Variant14980, - Variant14981, - Variant14982, - Variant14983, - Variant14984, - Variant14985, - Variant14986, - Variant14987, - Variant14988, - Variant14989, - Variant14990, - Variant14991, - Variant14992, - Variant14993, - Variant14994, - Variant14995, - Variant14996, - Variant14997, - Variant14998, - Variant14999, - Variant15000, - Variant15001, - Variant15002, - Variant15003, - Variant15004, - Variant15005, - Variant15006, - Variant15007, - Variant15008, - Variant15009, - Variant15010, - Variant15011, - Variant15012, - Variant15013, - Variant15014, - Variant15015, - Variant15016, - Variant15017, - Variant15018, - Variant15019, - Variant15020, - Variant15021, - Variant15022, - Variant15023, - Variant15024, - Variant15025, - Variant15026, - Variant15027, - Variant15028, - Variant15029, - Variant15030, - Variant15031, - Variant15032, - Variant15033, - Variant15034, - Variant15035, - Variant15036, - Variant15037, - Variant15038, - Variant15039, - Variant15040, - Variant15041, - Variant15042, - Variant15043, - Variant15044, - Variant15045, - Variant15046, - Variant15047, - Variant15048, - Variant15049, - Variant15050, - Variant15051, - Variant15052, - Variant15053, - Variant15054, - Variant15055, - Variant15056, - Variant15057, - Variant15058, - Variant15059, - Variant15060, - Variant15061, - Variant15062, - Variant15063, - Variant15064, - Variant15065, - Variant15066, - Variant15067, - Variant15068, - Variant15069, - Variant15070, - Variant15071, - Variant15072, - Variant15073, - Variant15074, - Variant15075, - Variant15076, - Variant15077, - Variant15078, - Variant15079, - Variant15080, - Variant15081, - Variant15082, - Variant15083, - Variant15084, - Variant15085, - Variant15086, - Variant15087, - Variant15088, - Variant15089, - Variant15090, - Variant15091, - Variant15092, - Variant15093, - Variant15094, - Variant15095, - Variant15096, - Variant15097, - Variant15098, - Variant15099, - Variant15100, - Variant15101, - Variant15102, - Variant15103, - Variant15104, - Variant15105, - Variant15106, - Variant15107, - Variant15108, - Variant15109, - Variant15110, - Variant15111, - Variant15112, - Variant15113, - Variant15114, - Variant15115, - Variant15116, - Variant15117, - Variant15118, - Variant15119, - Variant15120, - Variant15121, - Variant15122, - Variant15123, - Variant15124, - Variant15125, - Variant15126, - Variant15127, - Variant15128, - Variant15129, - Variant15130, - Variant15131, - Variant15132, - Variant15133, - Variant15134, - Variant15135, - Variant15136, - Variant15137, - Variant15138, - Variant15139, - Variant15140, - Variant15141, - Variant15142, - Variant15143, - Variant15144, - Variant15145, - Variant15146, - Variant15147, - Variant15148, - Variant15149, - Variant15150, - Variant15151, - Variant15152, - Variant15153, - Variant15154, - Variant15155, - Variant15156, - Variant15157, - Variant15158, - Variant15159, - Variant15160, - Variant15161, - Variant15162, - Variant15163, - Variant15164, - Variant15165, - Variant15166, - Variant15167, - Variant15168, - Variant15169, - Variant15170, - Variant15171, - Variant15172, - Variant15173, - Variant15174, - Variant15175, - Variant15176, - Variant15177, - Variant15178, - Variant15179, - Variant15180, - Variant15181, - Variant15182, - Variant15183, - Variant15184, - Variant15185, - Variant15186, - Variant15187, - Variant15188, - Variant15189, - Variant15190, - Variant15191, - Variant15192, - Variant15193, - Variant15194, - Variant15195, - Variant15196, - Variant15197, - Variant15198, - Variant15199, - Variant15200, - Variant15201, - Variant15202, - Variant15203, - Variant15204, - Variant15205, - Variant15206, - Variant15207, - Variant15208, - Variant15209, - Variant15210, - Variant15211, - Variant15212, - Variant15213, - Variant15214, - Variant15215, - Variant15216, - Variant15217, - Variant15218, - Variant15219, - Variant15220, - Variant15221, - Variant15222, - Variant15223, - Variant15224, - Variant15225, - Variant15226, - Variant15227, - Variant15228, - Variant15229, - Variant15230, - Variant15231, - Variant15232, - Variant15233, - Variant15234, - Variant15235, - Variant15236, - Variant15237, - Variant15238, - Variant15239, - Variant15240, - Variant15241, - Variant15242, - Variant15243, - Variant15244, - Variant15245, - Variant15246, - Variant15247, - Variant15248, - Variant15249, - Variant15250, - Variant15251, - Variant15252, - Variant15253, - Variant15254, - Variant15255, - Variant15256, - Variant15257, - Variant15258, - Variant15259, - Variant15260, - Variant15261, - Variant15262, - Variant15263, - Variant15264, - Variant15265, - Variant15266, - Variant15267, - Variant15268, - Variant15269, - Variant15270, - Variant15271, - Variant15272, - Variant15273, - Variant15274, - Variant15275, - Variant15276, - Variant15277, - Variant15278, - Variant15279, - Variant15280, - Variant15281, - Variant15282, - Variant15283, - Variant15284, - Variant15285, - Variant15286, - Variant15287, - Variant15288, - Variant15289, - Variant15290, - Variant15291, - Variant15292, - Variant15293, - Variant15294, - Variant15295, - Variant15296, - Variant15297, - Variant15298, - Variant15299, - Variant15300, - Variant15301, - Variant15302, - Variant15303, - Variant15304, - Variant15305, - Variant15306, - Variant15307, - Variant15308, - Variant15309, - Variant15310, - Variant15311, - Variant15312, - Variant15313, - Variant15314, - Variant15315, - Variant15316, - Variant15317, - Variant15318, - Variant15319, - Variant15320, - Variant15321, - Variant15322, - Variant15323, - Variant15324, - Variant15325, - Variant15326, - Variant15327, - Variant15328, - Variant15329, - Variant15330, - Variant15331, - Variant15332, - Variant15333, - Variant15334, - Variant15335, - Variant15336, - Variant15337, - Variant15338, - Variant15339, - Variant15340, - Variant15341, - Variant15342, - Variant15343, - Variant15344, - Variant15345, - Variant15346, - Variant15347, - Variant15348, - Variant15349, - Variant15350, - Variant15351, - Variant15352, - Variant15353, - Variant15354, - Variant15355, - Variant15356, - Variant15357, - Variant15358, - Variant15359, - Variant15360, - Variant15361, - Variant15362, - Variant15363, - Variant15364, - Variant15365, - Variant15366, - Variant15367, - Variant15368, - Variant15369, - Variant15370, - Variant15371, - Variant15372, - Variant15373, - Variant15374, - Variant15375, - Variant15376, - Variant15377, - Variant15378, - Variant15379, - Variant15380, - Variant15381, - Variant15382, - Variant15383, - Variant15384, - Variant15385, - Variant15386, - Variant15387, - Variant15388, - Variant15389, - Variant15390, - Variant15391, - Variant15392, - Variant15393, - Variant15394, - Variant15395, - Variant15396, - Variant15397, - Variant15398, - Variant15399, - Variant15400, - Variant15401, - Variant15402, - Variant15403, - Variant15404, - Variant15405, - Variant15406, - Variant15407, - Variant15408, - Variant15409, - Variant15410, - Variant15411, - Variant15412, - Variant15413, - Variant15414, - Variant15415, - Variant15416, - Variant15417, - Variant15418, - Variant15419, - Variant15420, - Variant15421, - Variant15422, - Variant15423, - Variant15424, - Variant15425, - Variant15426, - Variant15427, - Variant15428, - Variant15429, - Variant15430, - Variant15431, - Variant15432, - Variant15433, - Variant15434, - Variant15435, - Variant15436, - Variant15437, - Variant15438, - Variant15439, - Variant15440, - Variant15441, - Variant15442, - Variant15443, - Variant15444, - Variant15445, - Variant15446, - Variant15447, - Variant15448, - Variant15449, - Variant15450, - Variant15451, - Variant15452, - Variant15453, - Variant15454, - Variant15455, - Variant15456, - Variant15457, - Variant15458, - Variant15459, - Variant15460, - Variant15461, - Variant15462, - Variant15463, - Variant15464, - Variant15465, - Variant15466, - Variant15467, - Variant15468, - Variant15469, - Variant15470, - Variant15471, - Variant15472, - Variant15473, - Variant15474, - Variant15475, - Variant15476, - Variant15477, - Variant15478, - Variant15479, - Variant15480, - Variant15481, - Variant15482, - Variant15483, - Variant15484, - Variant15485, - Variant15486, - Variant15487, - Variant15488, - Variant15489, - Variant15490, - Variant15491, - Variant15492, - Variant15493, - Variant15494, - Variant15495, - Variant15496, - Variant15497, - Variant15498, - Variant15499, - Variant15500, - Variant15501, - Variant15502, - Variant15503, - Variant15504, - Variant15505, - Variant15506, - Variant15507, - Variant15508, - Variant15509, - Variant15510, - Variant15511, - Variant15512, - Variant15513, - Variant15514, - Variant15515, - Variant15516, - Variant15517, - Variant15518, - Variant15519, - Variant15520, - Variant15521, - Variant15522, - Variant15523, - Variant15524, - Variant15525, - Variant15526, - Variant15527, - Variant15528, - Variant15529, - Variant15530, - Variant15531, - Variant15532, - Variant15533, - Variant15534, - Variant15535, - Variant15536, - Variant15537, - Variant15538, - Variant15539, - Variant15540, - Variant15541, - Variant15542, - Variant15543, - Variant15544, - Variant15545, - Variant15546, - Variant15547, - Variant15548, - Variant15549, - Variant15550, - Variant15551, - Variant15552, - Variant15553, - Variant15554, - Variant15555, - Variant15556, - Variant15557, - Variant15558, - Variant15559, - Variant15560, - Variant15561, - Variant15562, - Variant15563, - Variant15564, - Variant15565, - Variant15566, - Variant15567, - Variant15568, - Variant15569, - Variant15570, - Variant15571, - Variant15572, - Variant15573, - Variant15574, - Variant15575, - Variant15576, - Variant15577, - Variant15578, - Variant15579, - Variant15580, - Variant15581, - Variant15582, - Variant15583, - Variant15584, - Variant15585, - Variant15586, - Variant15587, - Variant15588, - Variant15589, - Variant15590, - Variant15591, - Variant15592, - Variant15593, - Variant15594, - Variant15595, - Variant15596, - Variant15597, - Variant15598, - Variant15599, - Variant15600, - Variant15601, - Variant15602, - Variant15603, - Variant15604, - Variant15605, - Variant15606, - Variant15607, - Variant15608, - Variant15609, - Variant15610, - Variant15611, - Variant15612, - Variant15613, - Variant15614, - Variant15615, - Variant15616, - Variant15617, - Variant15618, - Variant15619, - Variant15620, - Variant15621, - Variant15622, - Variant15623, - Variant15624, - Variant15625, - Variant15626, - Variant15627, - Variant15628, - Variant15629, - Variant15630, - Variant15631, - Variant15632, - Variant15633, - Variant15634, - Variant15635, - Variant15636, - Variant15637, - Variant15638, - Variant15639, - Variant15640, - Variant15641, - Variant15642, - Variant15643, - Variant15644, - Variant15645, - Variant15646, - Variant15647, - Variant15648, - Variant15649, - Variant15650, - Variant15651, - Variant15652, - Variant15653, - Variant15654, - Variant15655, - Variant15656, - Variant15657, - Variant15658, - Variant15659, - Variant15660, - Variant15661, - Variant15662, - Variant15663, - Variant15664, - Variant15665, - Variant15666, - Variant15667, - Variant15668, - Variant15669, - Variant15670, - Variant15671, - Variant15672, - Variant15673, - Variant15674, - Variant15675, - Variant15676, - Variant15677, - Variant15678, - Variant15679, - Variant15680, - Variant15681, - Variant15682, - Variant15683, - Variant15684, - Variant15685, - Variant15686, - Variant15687, - Variant15688, - Variant15689, - Variant15690, - Variant15691, - Variant15692, - Variant15693, - Variant15694, - Variant15695, - Variant15696, - Variant15697, - Variant15698, - Variant15699, - Variant15700, - Variant15701, - Variant15702, - Variant15703, - Variant15704, - Variant15705, - Variant15706, - Variant15707, - Variant15708, - Variant15709, - Variant15710, - Variant15711, - Variant15712, - Variant15713, - Variant15714, - Variant15715, - Variant15716, - Variant15717, - Variant15718, - Variant15719, - Variant15720, - Variant15721, - Variant15722, - Variant15723, - Variant15724, - Variant15725, - Variant15726, - Variant15727, - Variant15728, - Variant15729, - Variant15730, - Variant15731, - Variant15732, - Variant15733, - Variant15734, - Variant15735, - Variant15736, - Variant15737, - Variant15738, - Variant15739, - Variant15740, - Variant15741, - Variant15742, - Variant15743, - Variant15744, - Variant15745, - Variant15746, - Variant15747, - Variant15748, - Variant15749, - Variant15750, - Variant15751, - Variant15752, - Variant15753, - Variant15754, - Variant15755, - Variant15756, - Variant15757, - Variant15758, - Variant15759, - Variant15760, - Variant15761, - Variant15762, - Variant15763, - Variant15764, - Variant15765, - Variant15766, - Variant15767, - Variant15768, - Variant15769, - Variant15770, - Variant15771, - Variant15772, - Variant15773, - Variant15774, - Variant15775, - Variant15776, - Variant15777, - Variant15778, - Variant15779, - Variant15780, - Variant15781, - Variant15782, - Variant15783, - Variant15784, - Variant15785, - Variant15786, - Variant15787, - Variant15788, - Variant15789, - Variant15790, - Variant15791, - Variant15792, - Variant15793, - Variant15794, - Variant15795, - Variant15796, - Variant15797, - Variant15798, - Variant15799, - Variant15800, - Variant15801, - Variant15802, - Variant15803, - Variant15804, - Variant15805, - Variant15806, - Variant15807, - Variant15808, - Variant15809, - Variant15810, - Variant15811, - Variant15812, - Variant15813, - Variant15814, - Variant15815, - Variant15816, - Variant15817, - Variant15818, - Variant15819, - Variant15820, - Variant15821, - Variant15822, - Variant15823, - Variant15824, - Variant15825, - Variant15826, - Variant15827, - Variant15828, - Variant15829, - Variant15830, - Variant15831, - Variant15832, - Variant15833, - Variant15834, - Variant15835, - Variant15836, - Variant15837, - Variant15838, - Variant15839, - Variant15840, - Variant15841, - Variant15842, - Variant15843, - Variant15844, - Variant15845, - Variant15846, - Variant15847, - Variant15848, - Variant15849, - Variant15850, - Variant15851, - Variant15852, - Variant15853, - Variant15854, - Variant15855, - Variant15856, - Variant15857, - Variant15858, - Variant15859, - Variant15860, - Variant15861, - Variant15862, - Variant15863, - Variant15864, - Variant15865, - Variant15866, - Variant15867, - Variant15868, - Variant15869, - Variant15870, - Variant15871, - Variant15872, - Variant15873, - Variant15874, - Variant15875, - Variant15876, - Variant15877, - Variant15878, - Variant15879, - Variant15880, - Variant15881, - Variant15882, - Variant15883, - Variant15884, - Variant15885, - Variant15886, - Variant15887, - Variant15888, - Variant15889, - Variant15890, - Variant15891, - Variant15892, - Variant15893, - Variant15894, - Variant15895, - Variant15896, - Variant15897, - Variant15898, - Variant15899, - Variant15900, - Variant15901, - Variant15902, - Variant15903, - Variant15904, - Variant15905, - Variant15906, - Variant15907, - Variant15908, - Variant15909, - Variant15910, - Variant15911, - Variant15912, - Variant15913, - Variant15914, - Variant15915, - Variant15916, - Variant15917, - Variant15918, - Variant15919, - Variant15920, - Variant15921, - Variant15922, - Variant15923, - Variant15924, - Variant15925, - Variant15926, - Variant15927, - Variant15928, - Variant15929, - Variant15930, - Variant15931, - Variant15932, - Variant15933, - Variant15934, - Variant15935, - Variant15936, - Variant15937, - Variant15938, - Variant15939, - Variant15940, - Variant15941, - Variant15942, - Variant15943, - Variant15944, - Variant15945, - Variant15946, - Variant15947, - Variant15948, - Variant15949, - Variant15950, - Variant15951, - Variant15952, - Variant15953, - Variant15954, - Variant15955, - Variant15956, - Variant15957, - Variant15958, - Variant15959, - Variant15960, - Variant15961, - Variant15962, - Variant15963, - Variant15964, - Variant15965, - Variant15966, - Variant15967, - Variant15968, - Variant15969, - Variant15970, - Variant15971, - Variant15972, - Variant15973, - Variant15974, - Variant15975, - Variant15976, - Variant15977, - Variant15978, - Variant15979, - Variant15980, - Variant15981, - Variant15982, - Variant15983, - Variant15984, - Variant15985, - Variant15986, - Variant15987, - Variant15988, - Variant15989, - Variant15990, - Variant15991, - Variant15992, - Variant15993, - Variant15994, - Variant15995, - Variant15996, - Variant15997, - Variant15998, - Variant15999, - Variant16000, - Variant16001, - Variant16002, - Variant16003, - Variant16004, - Variant16005, - Variant16006, - Variant16007, - Variant16008, - Variant16009, - Variant16010, - Variant16011, - Variant16012, - Variant16013, - Variant16014, - Variant16015, - Variant16016, - Variant16017, - Variant16018, - Variant16019, - Variant16020, - Variant16021, - Variant16022, - Variant16023, - Variant16024, - Variant16025, - Variant16026, - Variant16027, - Variant16028, - Variant16029, - Variant16030, - Variant16031, - Variant16032, - Variant16033, - Variant16034, - Variant16035, - Variant16036, - Variant16037, - Variant16038, - Variant16039, - Variant16040, - Variant16041, - Variant16042, - Variant16043, - Variant16044, - Variant16045, - Variant16046, - Variant16047, - Variant16048, - Variant16049, - Variant16050, - Variant16051, - Variant16052, - Variant16053, - Variant16054, - Variant16055, - Variant16056, - Variant16057, - Variant16058, - Variant16059, - Variant16060, - Variant16061, - Variant16062, - Variant16063, - Variant16064, - Variant16065, - Variant16066, - Variant16067, - Variant16068, - Variant16069, - Variant16070, - Variant16071, - Variant16072, - Variant16073, - Variant16074, - Variant16075, - Variant16076, - Variant16077, - Variant16078, - Variant16079, - Variant16080, - Variant16081, - Variant16082, - Variant16083, - Variant16084, - Variant16085, - Variant16086, - Variant16087, - Variant16088, - Variant16089, - Variant16090, - Variant16091, - Variant16092, - Variant16093, - Variant16094, - Variant16095, - Variant16096, - Variant16097, - Variant16098, - Variant16099, - Variant16100, - Variant16101, - Variant16102, - Variant16103, - Variant16104, - Variant16105, - Variant16106, - Variant16107, - Variant16108, - Variant16109, - Variant16110, - Variant16111, - Variant16112, - Variant16113, - Variant16114, - Variant16115, - Variant16116, - Variant16117, - Variant16118, - Variant16119, - Variant16120, - Variant16121, - Variant16122, - Variant16123, - Variant16124, - Variant16125, - Variant16126, - Variant16127, - Variant16128, - Variant16129, - Variant16130, - Variant16131, - Variant16132, - Variant16133, - Variant16134, - Variant16135, - Variant16136, - Variant16137, - Variant16138, - Variant16139, - Variant16140, - Variant16141, - Variant16142, - Variant16143, - Variant16144, - Variant16145, - Variant16146, - Variant16147, - Variant16148, - Variant16149, - Variant16150, - Variant16151, - Variant16152, - Variant16153, - Variant16154, - Variant16155, - Variant16156, - Variant16157, - Variant16158, - Variant16159, - Variant16160, - Variant16161, - Variant16162, - Variant16163, - Variant16164, - Variant16165, - Variant16166, - Variant16167, - Variant16168, - Variant16169, - Variant16170, - Variant16171, - Variant16172, - Variant16173, - Variant16174, - Variant16175, - Variant16176, - Variant16177, - Variant16178, - Variant16179, - Variant16180, - Variant16181, - Variant16182, - Variant16183, - Variant16184, - Variant16185, - Variant16186, - Variant16187, - Variant16188, - Variant16189, - Variant16190, - Variant16191, - Variant16192, - Variant16193, - Variant16194, - Variant16195, - Variant16196, - Variant16197, - Variant16198, - Variant16199, - Variant16200, - Variant16201, - Variant16202, - Variant16203, - Variant16204, - Variant16205, - Variant16206, - Variant16207, - Variant16208, - Variant16209, - Variant16210, - Variant16211, - Variant16212, - Variant16213, - Variant16214, - Variant16215, - Variant16216, - Variant16217, - Variant16218, - Variant16219, - Variant16220, - Variant16221, - Variant16222, - Variant16223, - Variant16224, - Variant16225, - Variant16226, - Variant16227, - Variant16228, - Variant16229, - Variant16230, - Variant16231, - Variant16232, - Variant16233, - Variant16234, - Variant16235, - Variant16236, - Variant16237, - Variant16238, - Variant16239, - Variant16240, - Variant16241, - Variant16242, - Variant16243, - Variant16244, - Variant16245, - Variant16246, - Variant16247, - Variant16248, - Variant16249, - Variant16250, - Variant16251, - Variant16252, - Variant16253, - Variant16254, - Variant16255, - Variant16256, - Variant16257, - Variant16258, - Variant16259, - Variant16260, - Variant16261, - Variant16262, - Variant16263, - Variant16264, - Variant16265, - Variant16266, - Variant16267, - Variant16268, - Variant16269, - Variant16270, - Variant16271, - Variant16272, - Variant16273, - Variant16274, - Variant16275, - Variant16276, - Variant16277, - Variant16278, - Variant16279, - Variant16280, - Variant16281, - Variant16282, - Variant16283, - Variant16284, - Variant16285, - Variant16286, - Variant16287, - Variant16288, - Variant16289, - Variant16290, - Variant16291, - Variant16292, - Variant16293, - Variant16294, - Variant16295, - Variant16296, - Variant16297, - Variant16298, - Variant16299, - Variant16300, - Variant16301, - Variant16302, - Variant16303, - Variant16304, - Variant16305, - Variant16306, - Variant16307, - Variant16308, - Variant16309, - Variant16310, - Variant16311, - Variant16312, - Variant16313, - Variant16314, - Variant16315, - Variant16316, - Variant16317, - Variant16318, - Variant16319, - Variant16320, - Variant16321, - Variant16322, - Variant16323, - Variant16324, - Variant16325, - Variant16326, - Variant16327, - Variant16328, - Variant16329, - Variant16330, - Variant16331, - Variant16332, - Variant16333, - Variant16334, - Variant16335, - Variant16336, - Variant16337, - Variant16338, - Variant16339, - Variant16340, - Variant16341, - Variant16342, - Variant16343, - Variant16344, - Variant16345, - Variant16346, - Variant16347, - Variant16348, - Variant16349, - Variant16350, - Variant16351, - Variant16352, - Variant16353, - Variant16354, - Variant16355, - Variant16356, - Variant16357, - Variant16358, - Variant16359, - Variant16360, - Variant16361, - Variant16362, - Variant16363, - Variant16364, - Variant16365, - Variant16366, - Variant16367, - Variant16368, - Variant16369, - Variant16370, - Variant16371, - Variant16372, - Variant16373, - Variant16374, - Variant16375, - Variant16376, - Variant16377, - Variant16378, - Variant16379, - Variant16380, - Variant16381, - Variant16382, - Variant16383, - Variant16384, - Variant16385, - Variant16386, - Variant16387, - Variant16388, - Variant16389, - Variant16390, - Variant16391, - Variant16392, - Variant16393, - Variant16394, - Variant16395, - Variant16396, - Variant16397, - Variant16398, - Variant16399, - Variant16400, - Variant16401, - Variant16402, - Variant16403, - Variant16404, - Variant16405, - Variant16406, - Variant16407, - Variant16408, - Variant16409, - Variant16410, - Variant16411, - Variant16412, - Variant16413, - Variant16414, - Variant16415, - Variant16416, - Variant16417, - Variant16418, - Variant16419, - Variant16420, - Variant16421, - Variant16422, - Variant16423, - Variant16424, - Variant16425, - Variant16426, - Variant16427, - Variant16428, - Variant16429, - Variant16430, - Variant16431, - Variant16432, - Variant16433, - Variant16434, - Variant16435, - Variant16436, - Variant16437, - Variant16438, - Variant16439, - Variant16440, - Variant16441, - Variant16442, - Variant16443, - Variant16444, - Variant16445, - Variant16446, - Variant16447, - Variant16448, - Variant16449, - Variant16450, - Variant16451, - Variant16452, - Variant16453, - Variant16454, - Variant16455, - Variant16456, - Variant16457, - Variant16458, - Variant16459, - Variant16460, - Variant16461, - Variant16462, - Variant16463, - Variant16464, - Variant16465, - Variant16466, - Variant16467, - Variant16468, - Variant16469, - Variant16470, - Variant16471, - Variant16472, - Variant16473, - Variant16474, - Variant16475, - Variant16476, - Variant16477, - Variant16478, - Variant16479, - Variant16480, - Variant16481, - Variant16482, - Variant16483, - Variant16484, - Variant16485, - Variant16486, - Variant16487, - Variant16488, - Variant16489, - Variant16490, - Variant16491, - Variant16492, - Variant16493, - Variant16494, - Variant16495, - Variant16496, - Variant16497, - Variant16498, - Variant16499, - Variant16500, - Variant16501, - Variant16502, - Variant16503, - Variant16504, - Variant16505, - Variant16506, - Variant16507, - Variant16508, - Variant16509, - Variant16510, - Variant16511, - Variant16512, - Variant16513, - Variant16514, - Variant16515, - Variant16516, - Variant16517, - Variant16518, - Variant16519, - Variant16520, - Variant16521, - Variant16522, - Variant16523, - Variant16524, - Variant16525, - Variant16526, - Variant16527, - Variant16528, - Variant16529, - Variant16530, - Variant16531, - Variant16532, - Variant16533, - Variant16534, - Variant16535, - Variant16536, - Variant16537, - Variant16538, - Variant16539, - Variant16540, - Variant16541, - Variant16542, - Variant16543, - Variant16544, - Variant16545, - Variant16546, - Variant16547, - Variant16548, - Variant16549, - Variant16550, - Variant16551, - Variant16552, - Variant16553, - Variant16554, - Variant16555, - Variant16556, - Variant16557, - Variant16558, - Variant16559, - Variant16560, - Variant16561, - Variant16562, - Variant16563, - Variant16564, - Variant16565, - Variant16566, - Variant16567, - Variant16568, - Variant16569, - Variant16570, - Variant16571, - Variant16572, - Variant16573, - Variant16574, - Variant16575, - Variant16576, - Variant16577, - Variant16578, - Variant16579, - Variant16580, - Variant16581, - Variant16582, - Variant16583, - Variant16584, - Variant16585, - Variant16586, - Variant16587, - Variant16588, - Variant16589, - Variant16590, - Variant16591, - Variant16592, - Variant16593, - Variant16594, - Variant16595, - Variant16596, - Variant16597, - Variant16598, - Variant16599, - Variant16600, - Variant16601, - Variant16602, - Variant16603, - Variant16604, - Variant16605, - Variant16606, - Variant16607, - Variant16608, - Variant16609, - Variant16610, - Variant16611, - Variant16612, - Variant16613, - Variant16614, - Variant16615, - Variant16616, - Variant16617, - Variant16618, - Variant16619, - Variant16620, - Variant16621, - Variant16622, - Variant16623, - Variant16624, - Variant16625, - Variant16626, - Variant16627, - Variant16628, - Variant16629, - Variant16630, - Variant16631, - Variant16632, - Variant16633, - Variant16634, - Variant16635, - Variant16636, - Variant16637, - Variant16638, - Variant16639, - Variant16640, - Variant16641, - Variant16642, - Variant16643, - Variant16644, - Variant16645, - Variant16646, - Variant16647, - Variant16648, - Variant16649, - Variant16650, - Variant16651, - Variant16652, - Variant16653, - Variant16654, - Variant16655, - Variant16656, - Variant16657, - Variant16658, - Variant16659, - Variant16660, - Variant16661, - Variant16662, - Variant16663, - Variant16664, - Variant16665, - Variant16666, - Variant16667, - Variant16668, - Variant16669, - Variant16670, - Variant16671, - Variant16672, - Variant16673, - Variant16674, - Variant16675, - Variant16676, - Variant16677, - Variant16678, - Variant16679, - Variant16680, - Variant16681, - Variant16682, - Variant16683, - Variant16684, - Variant16685, - Variant16686, - Variant16687, - Variant16688, - Variant16689, - Variant16690, - Variant16691, - Variant16692, - Variant16693, - Variant16694, - Variant16695, - Variant16696, - Variant16697, - Variant16698, - Variant16699, - Variant16700, - Variant16701, - Variant16702, - Variant16703, - Variant16704, - Variant16705, - Variant16706, - Variant16707, - Variant16708, - Variant16709, - Variant16710, - Variant16711, - Variant16712, - Variant16713, - Variant16714, - Variant16715, - Variant16716, - Variant16717, - Variant16718, - Variant16719, - Variant16720, - Variant16721, - Variant16722, - Variant16723, - Variant16724, - Variant16725, - Variant16726, - Variant16727, - Variant16728, - Variant16729, - Variant16730, - Variant16731, - Variant16732, - Variant16733, - Variant16734, - Variant16735, - Variant16736, - Variant16737, - Variant16738, - Variant16739, - Variant16740, - Variant16741, - Variant16742, - Variant16743, - Variant16744, - Variant16745, - Variant16746, - Variant16747, - Variant16748, - Variant16749, - Variant16750, - Variant16751, - Variant16752, - Variant16753, - Variant16754, - Variant16755, - Variant16756, - Variant16757, - Variant16758, - Variant16759, - Variant16760, - Variant16761, - Variant16762, - Variant16763, - Variant16764, - Variant16765, - Variant16766, - Variant16767, - Variant16768, - Variant16769, - Variant16770, - Variant16771, - Variant16772, - Variant16773, - Variant16774, - Variant16775, - Variant16776, - Variant16777, - Variant16778, - Variant16779, - Variant16780, - Variant16781, - Variant16782, - Variant16783, - Variant16784, - Variant16785, - Variant16786, - Variant16787, - Variant16788, - Variant16789, - Variant16790, - Variant16791, - Variant16792, - Variant16793, - Variant16794, - Variant16795, - Variant16796, - Variant16797, - Variant16798, - Variant16799, - Variant16800, - Variant16801, - Variant16802, - Variant16803, - Variant16804, - Variant16805, - Variant16806, - Variant16807, - Variant16808, - Variant16809, - Variant16810, - Variant16811, - Variant16812, - Variant16813, - Variant16814, - Variant16815, - Variant16816, - Variant16817, - Variant16818, - Variant16819, - Variant16820, - Variant16821, - Variant16822, - Variant16823, - Variant16824, - Variant16825, - Variant16826, - Variant16827, - Variant16828, - Variant16829, - Variant16830, - Variant16831, - Variant16832, - Variant16833, - Variant16834, - Variant16835, - Variant16836, - Variant16837, - Variant16838, - Variant16839, - Variant16840, - Variant16841, - Variant16842, - Variant16843, - Variant16844, - Variant16845, - Variant16846, - Variant16847, - Variant16848, - Variant16849, - Variant16850, - Variant16851, - Variant16852, - Variant16853, - Variant16854, - Variant16855, - Variant16856, - Variant16857, - Variant16858, - Variant16859, - Variant16860, - Variant16861, - Variant16862, - Variant16863, - Variant16864, - Variant16865, - Variant16866, - Variant16867, - Variant16868, - Variant16869, - Variant16870, - Variant16871, - Variant16872, - Variant16873, - Variant16874, - Variant16875, - Variant16876, - Variant16877, - Variant16878, - Variant16879, - Variant16880, - Variant16881, - Variant16882, - Variant16883, - Variant16884, - Variant16885, - Variant16886, - Variant16887, - Variant16888, - Variant16889, - Variant16890, - Variant16891, - Variant16892, - Variant16893, - Variant16894, - Variant16895, - Variant16896, - Variant16897, - Variant16898, - Variant16899, - Variant16900, - Variant16901, - Variant16902, - Variant16903, - Variant16904, - Variant16905, - Variant16906, - Variant16907, - Variant16908, - Variant16909, - Variant16910, - Variant16911, - Variant16912, - Variant16913, - Variant16914, - Variant16915, - Variant16916, - Variant16917, - Variant16918, - Variant16919, - Variant16920, - Variant16921, - Variant16922, - Variant16923, - Variant16924, - Variant16925, - Variant16926, - Variant16927, - Variant16928, - Variant16929, - Variant16930, - Variant16931, - Variant16932, - Variant16933, - Variant16934, - Variant16935, - Variant16936, - Variant16937, - Variant16938, - Variant16939, - Variant16940, - Variant16941, - Variant16942, - Variant16943, - Variant16944, - Variant16945, - Variant16946, - Variant16947, - Variant16948, - Variant16949, - Variant16950, - Variant16951, - Variant16952, - Variant16953, - Variant16954, - Variant16955, - Variant16956, - Variant16957, - Variant16958, - Variant16959, - Variant16960, - Variant16961, - Variant16962, - Variant16963, - Variant16964, - Variant16965, - Variant16966, - Variant16967, - Variant16968, - Variant16969, - Variant16970, - Variant16971, - Variant16972, - Variant16973, - Variant16974, - Variant16975, - Variant16976, - Variant16977, - Variant16978, - Variant16979, - Variant16980, - Variant16981, - Variant16982, - Variant16983, - Variant16984, - Variant16985, - Variant16986, - Variant16987, - Variant16988, - Variant16989, - Variant16990, - Variant16991, - Variant16992, - Variant16993, - Variant16994, - Variant16995, - Variant16996, - Variant16997, - Variant16998, - Variant16999, - Variant17000, - Variant17001, - Variant17002, - Variant17003, - Variant17004, - Variant17005, - Variant17006, - Variant17007, - Variant17008, - Variant17009, - Variant17010, - Variant17011, - Variant17012, - Variant17013, - Variant17014, - Variant17015, - Variant17016, - Variant17017, - Variant17018, - Variant17019, - Variant17020, - Variant17021, - Variant17022, - Variant17023, - Variant17024, - Variant17025, - Variant17026, - Variant17027, - Variant17028, - Variant17029, - Variant17030, - Variant17031, - Variant17032, - Variant17033, - Variant17034, - Variant17035, - Variant17036, - Variant17037, - Variant17038, - Variant17039, - Variant17040, - Variant17041, - Variant17042, - Variant17043, - Variant17044, - Variant17045, - Variant17046, - Variant17047, - Variant17048, - Variant17049, - Variant17050, - Variant17051, - Variant17052, - Variant17053, - Variant17054, - Variant17055, - Variant17056, - Variant17057, - Variant17058, - Variant17059, - Variant17060, - Variant17061, - Variant17062, - Variant17063, - Variant17064, - Variant17065, - Variant17066, - Variant17067, - Variant17068, - Variant17069, - Variant17070, - Variant17071, - Variant17072, - Variant17073, - Variant17074, - Variant17075, - Variant17076, - Variant17077, - Variant17078, - Variant17079, - Variant17080, - Variant17081, - Variant17082, - Variant17083, - Variant17084, - Variant17085, - Variant17086, - Variant17087, - Variant17088, - Variant17089, - Variant17090, - Variant17091, - Variant17092, - Variant17093, - Variant17094, - Variant17095, - Variant17096, - Variant17097, - Variant17098, - Variant17099, - Variant17100, - Variant17101, - Variant17102, - Variant17103, - Variant17104, - Variant17105, - Variant17106, - Variant17107, - Variant17108, - Variant17109, - Variant17110, - Variant17111, - Variant17112, - Variant17113, - Variant17114, - Variant17115, - Variant17116, - Variant17117, - Variant17118, - Variant17119, - Variant17120, - Variant17121, - Variant17122, - Variant17123, - Variant17124, - Variant17125, - Variant17126, - Variant17127, - Variant17128, - Variant17129, - Variant17130, - Variant17131, - Variant17132, - Variant17133, - Variant17134, - Variant17135, - Variant17136, - Variant17137, - Variant17138, - Variant17139, - Variant17140, - Variant17141, - Variant17142, - Variant17143, - Variant17144, - Variant17145, - Variant17146, - Variant17147, - Variant17148, - Variant17149, - Variant17150, - Variant17151, - Variant17152, - Variant17153, - Variant17154, - Variant17155, - Variant17156, - Variant17157, - Variant17158, - Variant17159, - Variant17160, - Variant17161, - Variant17162, - Variant17163, - Variant17164, - Variant17165, - Variant17166, - Variant17167, - Variant17168, - Variant17169, - Variant17170, - Variant17171, - Variant17172, - Variant17173, - Variant17174, - Variant17175, - Variant17176, - Variant17177, - Variant17178, - Variant17179, - Variant17180, - Variant17181, - Variant17182, - Variant17183, - Variant17184, - Variant17185, - Variant17186, - Variant17187, - Variant17188, - Variant17189, - Variant17190, - Variant17191, - Variant17192, - Variant17193, - Variant17194, - Variant17195, - Variant17196, - Variant17197, - Variant17198, - Variant17199, - Variant17200, - Variant17201, - Variant17202, - Variant17203, - Variant17204, - Variant17205, - Variant17206, - Variant17207, - Variant17208, - Variant17209, - Variant17210, - Variant17211, - Variant17212, - Variant17213, - Variant17214, - Variant17215, - Variant17216, - Variant17217, - Variant17218, - Variant17219, - Variant17220, - Variant17221, - Variant17222, - Variant17223, - Variant17224, - Variant17225, - Variant17226, - Variant17227, - Variant17228, - Variant17229, - Variant17230, - Variant17231, - Variant17232, - Variant17233, - Variant17234, - Variant17235, - Variant17236, - Variant17237, - Variant17238, - Variant17239, - Variant17240, - Variant17241, - Variant17242, - Variant17243, - Variant17244, - Variant17245, - Variant17246, - Variant17247, - Variant17248, - Variant17249, - Variant17250, - Variant17251, - Variant17252, - Variant17253, - Variant17254, - Variant17255, - Variant17256, - Variant17257, - Variant17258, - Variant17259, - Variant17260, - Variant17261, - Variant17262, - Variant17263, - Variant17264, - Variant17265, - Variant17266, - Variant17267, - Variant17268, - Variant17269, - Variant17270, - Variant17271, - Variant17272, - Variant17273, - Variant17274, - Variant17275, - Variant17276, - Variant17277, - Variant17278, - Variant17279, - Variant17280, - Variant17281, - Variant17282, - Variant17283, - Variant17284, - Variant17285, - Variant17286, - Variant17287, - Variant17288, - Variant17289, - Variant17290, - Variant17291, - Variant17292, - Variant17293, - Variant17294, - Variant17295, - Variant17296, - Variant17297, - Variant17298, - Variant17299, - Variant17300, - Variant17301, - Variant17302, - Variant17303, - Variant17304, - Variant17305, - Variant17306, - Variant17307, - Variant17308, - Variant17309, - Variant17310, - Variant17311, - Variant17312, - Variant17313, - Variant17314, - Variant17315, - Variant17316, - Variant17317, - Variant17318, - Variant17319, - Variant17320, - Variant17321, - Variant17322, - Variant17323, - Variant17324, - Variant17325, - Variant17326, - Variant17327, - Variant17328, - Variant17329, - Variant17330, - Variant17331, - Variant17332, - Variant17333, - Variant17334, - Variant17335, - Variant17336, - Variant17337, - Variant17338, - Variant17339, - Variant17340, - Variant17341, - Variant17342, - Variant17343, - Variant17344, - Variant17345, - Variant17346, - Variant17347, - Variant17348, - Variant17349, - Variant17350, - Variant17351, - Variant17352, - Variant17353, - Variant17354, - Variant17355, - Variant17356, - Variant17357, - Variant17358, - Variant17359, - Variant17360, - Variant17361, - Variant17362, - Variant17363, - Variant17364, - Variant17365, - Variant17366, - Variant17367, - Variant17368, - Variant17369, - Variant17370, - Variant17371, - Variant17372, - Variant17373, - Variant17374, - Variant17375, - Variant17376, - Variant17377, - Variant17378, - Variant17379, - Variant17380, - Variant17381, - Variant17382, - Variant17383, - Variant17384, - Variant17385, - Variant17386, - Variant17387, - Variant17388, - Variant17389, - Variant17390, - Variant17391, - Variant17392, - Variant17393, - Variant17394, - Variant17395, - Variant17396, - Variant17397, - Variant17398, - Variant17399, - Variant17400, - Variant17401, - Variant17402, - Variant17403, - Variant17404, - Variant17405, - Variant17406, - Variant17407, - Variant17408, - Variant17409, - Variant17410, - Variant17411, - Variant17412, - Variant17413, - Variant17414, - Variant17415, - Variant17416, - Variant17417, - Variant17418, - Variant17419, - Variant17420, - Variant17421, - Variant17422, - Variant17423, - Variant17424, - Variant17425, - Variant17426, - Variant17427, - Variant17428, - Variant17429, - Variant17430, - Variant17431, - Variant17432, - Variant17433, - Variant17434, - Variant17435, - Variant17436, - Variant17437, - Variant17438, - Variant17439, - Variant17440, - Variant17441, - Variant17442, - Variant17443, - Variant17444, - Variant17445, - Variant17446, - Variant17447, - Variant17448, - Variant17449, - Variant17450, - Variant17451, - Variant17452, - Variant17453, - Variant17454, - Variant17455, - Variant17456, - Variant17457, - Variant17458, - Variant17459, - Variant17460, - Variant17461, - Variant17462, - Variant17463, - Variant17464, - Variant17465, - Variant17466, - Variant17467, - Variant17468, - Variant17469, - Variant17470, - Variant17471, - Variant17472, - Variant17473, - Variant17474, - Variant17475, - Variant17476, - Variant17477, - Variant17478, - Variant17479, - Variant17480, - Variant17481, - Variant17482, - Variant17483, - Variant17484, - Variant17485, - Variant17486, - Variant17487, - Variant17488, - Variant17489, - Variant17490, - Variant17491, - Variant17492, - Variant17493, - Variant17494, - Variant17495, - Variant17496, - Variant17497, - Variant17498, - Variant17499, - Variant17500, - Variant17501, - Variant17502, - Variant17503, - Variant17504, - Variant17505, - Variant17506, - Variant17507, - Variant17508, - Variant17509, - Variant17510, - Variant17511, - Variant17512, - Variant17513, - Variant17514, - Variant17515, - Variant17516, - Variant17517, - Variant17518, - Variant17519, - Variant17520, - Variant17521, - Variant17522, - Variant17523, - Variant17524, - Variant17525, - Variant17526, - Variant17527, - Variant17528, - Variant17529, - Variant17530, - Variant17531, - Variant17532, - Variant17533, - Variant17534, - Variant17535, - Variant17536, - Variant17537, - Variant17538, - Variant17539, - Variant17540, - Variant17541, - Variant17542, - Variant17543, - Variant17544, - Variant17545, - Variant17546, - Variant17547, - Variant17548, - Variant17549, - Variant17550, - Variant17551, - Variant17552, - Variant17553, - Variant17554, - Variant17555, - Variant17556, - Variant17557, - Variant17558, - Variant17559, - Variant17560, - Variant17561, - Variant17562, - Variant17563, - Variant17564, - Variant17565, - Variant17566, - Variant17567, - Variant17568, - Variant17569, - Variant17570, - Variant17571, - Variant17572, - Variant17573, - Variant17574, - Variant17575, - Variant17576, - Variant17577, - Variant17578, - Variant17579, - Variant17580, - Variant17581, - Variant17582, - Variant17583, - Variant17584, - Variant17585, - Variant17586, - Variant17587, - Variant17588, - Variant17589, - Variant17590, - Variant17591, - Variant17592, - Variant17593, - Variant17594, - Variant17595, - Variant17596, - Variant17597, - Variant17598, - Variant17599, - Variant17600, - Variant17601, - Variant17602, - Variant17603, - Variant17604, - Variant17605, - Variant17606, - Variant17607, - Variant17608, - Variant17609, - Variant17610, - Variant17611, - Variant17612, - Variant17613, - Variant17614, - Variant17615, - Variant17616, - Variant17617, - Variant17618, - Variant17619, - Variant17620, - Variant17621, - Variant17622, - Variant17623, - Variant17624, - Variant17625, - Variant17626, - Variant17627, - Variant17628, - Variant17629, - Variant17630, - Variant17631, - Variant17632, - Variant17633, - Variant17634, - Variant17635, - Variant17636, - Variant17637, - Variant17638, - Variant17639, - Variant17640, - Variant17641, - Variant17642, - Variant17643, - Variant17644, - Variant17645, - Variant17646, - Variant17647, - Variant17648, - Variant17649, - Variant17650, - Variant17651, - Variant17652, - Variant17653, - Variant17654, - Variant17655, - Variant17656, - Variant17657, - Variant17658, - Variant17659, - Variant17660, - Variant17661, - Variant17662, - Variant17663, - Variant17664, - Variant17665, - Variant17666, - Variant17667, - Variant17668, - Variant17669, - Variant17670, - Variant17671, - Variant17672, - Variant17673, - Variant17674, - Variant17675, - Variant17676, - Variant17677, - Variant17678, - Variant17679, - Variant17680, - Variant17681, - Variant17682, - Variant17683, - Variant17684, - Variant17685, - Variant17686, - Variant17687, - Variant17688, - Variant17689, - Variant17690, - Variant17691, - Variant17692, - Variant17693, - Variant17694, - Variant17695, - Variant17696, - Variant17697, - Variant17698, - Variant17699, - Variant17700, - Variant17701, - Variant17702, - Variant17703, - Variant17704, - Variant17705, - Variant17706, - Variant17707, - Variant17708, - Variant17709, - Variant17710, - Variant17711, - Variant17712, - Variant17713, - Variant17714, - Variant17715, - Variant17716, - Variant17717, - Variant17718, - Variant17719, - Variant17720, - Variant17721, - Variant17722, - Variant17723, - Variant17724, - Variant17725, - Variant17726, - Variant17727, - Variant17728, - Variant17729, - Variant17730, - Variant17731, - Variant17732, - Variant17733, - Variant17734, - Variant17735, - Variant17736, - Variant17737, - Variant17738, - Variant17739, - Variant17740, - Variant17741, - Variant17742, - Variant17743, - Variant17744, - Variant17745, - Variant17746, - Variant17747, - Variant17748, - Variant17749, - Variant17750, - Variant17751, - Variant17752, - Variant17753, - Variant17754, - Variant17755, - Variant17756, - Variant17757, - Variant17758, - Variant17759, - Variant17760, - Variant17761, - Variant17762, - Variant17763, - Variant17764, - Variant17765, - Variant17766, - Variant17767, - Variant17768, - Variant17769, - Variant17770, - Variant17771, - Variant17772, - Variant17773, - Variant17774, - Variant17775, - Variant17776, - Variant17777, - Variant17778, - Variant17779, - Variant17780, - Variant17781, - Variant17782, - Variant17783, - Variant17784, - Variant17785, - Variant17786, - Variant17787, - Variant17788, - Variant17789, - Variant17790, - Variant17791, - Variant17792, - Variant17793, - Variant17794, - Variant17795, - Variant17796, - Variant17797, - Variant17798, - Variant17799, - Variant17800, - Variant17801, - Variant17802, - Variant17803, - Variant17804, - Variant17805, - Variant17806, - Variant17807, - Variant17808, - Variant17809, - Variant17810, - Variant17811, - Variant17812, - Variant17813, - Variant17814, - Variant17815, - Variant17816, - Variant17817, - Variant17818, - Variant17819, - Variant17820, - Variant17821, - Variant17822, - Variant17823, - Variant17824, - Variant17825, - Variant17826, - Variant17827, - Variant17828, - Variant17829, - Variant17830, - Variant17831, - Variant17832, - Variant17833, - Variant17834, - Variant17835, - Variant17836, - Variant17837, - Variant17838, - Variant17839, - Variant17840, - Variant17841, - Variant17842, - Variant17843, - Variant17844, - Variant17845, - Variant17846, - Variant17847, - Variant17848, - Variant17849, - Variant17850, - Variant17851, - Variant17852, - Variant17853, - Variant17854, - Variant17855, - Variant17856, - Variant17857, - Variant17858, - Variant17859, - Variant17860, - Variant17861, - Variant17862, - Variant17863, - Variant17864, - Variant17865, - Variant17866, - Variant17867, - Variant17868, - Variant17869, - Variant17870, - Variant17871, - Variant17872, - Variant17873, - Variant17874, - Variant17875, - Variant17876, - Variant17877, - Variant17878, - Variant17879, - Variant17880, - Variant17881, - Variant17882, - Variant17883, - Variant17884, - Variant17885, - Variant17886, - Variant17887, - Variant17888, - Variant17889, - Variant17890, - Variant17891, - Variant17892, - Variant17893, - Variant17894, - Variant17895, - Variant17896, - Variant17897, - Variant17898, - Variant17899, - Variant17900, - Variant17901, - Variant17902, - Variant17903, - Variant17904, - Variant17905, - Variant17906, - Variant17907, - Variant17908, - Variant17909, - Variant17910, - Variant17911, - Variant17912, - Variant17913, - Variant17914, - Variant17915, - Variant17916, - Variant17917, - Variant17918, - Variant17919, - Variant17920, - Variant17921, - Variant17922, - Variant17923, - Variant17924, - Variant17925, - Variant17926, - Variant17927, - Variant17928, - Variant17929, - Variant17930, - Variant17931, - Variant17932, - Variant17933, - Variant17934, - Variant17935, - Variant17936, - Variant17937, - Variant17938, - Variant17939, - Variant17940, - Variant17941, - Variant17942, - Variant17943, - Variant17944, - Variant17945, - Variant17946, - Variant17947, - Variant17948, - Variant17949, - Variant17950, - Variant17951, - Variant17952, - Variant17953, - Variant17954, - Variant17955, - Variant17956, - Variant17957, - Variant17958, - Variant17959, - Variant17960, - Variant17961, - Variant17962, - Variant17963, - Variant17964, - Variant17965, - Variant17966, - Variant17967, - Variant17968, - Variant17969, - Variant17970, - Variant17971, - Variant17972, - Variant17973, - Variant17974, - Variant17975, - Variant17976, - Variant17977, - Variant17978, - Variant17979, - Variant17980, - Variant17981, - Variant17982, - Variant17983, - Variant17984, - Variant17985, - Variant17986, - Variant17987, - Variant17988, - Variant17989, - Variant17990, - Variant17991, - Variant17992, - Variant17993, - Variant17994, - Variant17995, - Variant17996, - Variant17997, - Variant17998, - Variant17999, - Variant18000, - Variant18001, - Variant18002, - Variant18003, - Variant18004, - Variant18005, - Variant18006, - Variant18007, - Variant18008, - Variant18009, - Variant18010, - Variant18011, - Variant18012, - Variant18013, - Variant18014, - Variant18015, - Variant18016, - Variant18017, - Variant18018, - Variant18019, - Variant18020, - Variant18021, - Variant18022, - Variant18023, - Variant18024, - Variant18025, - Variant18026, - Variant18027, - Variant18028, - Variant18029, - Variant18030, - Variant18031, - Variant18032, - Variant18033, - Variant18034, - Variant18035, - Variant18036, - Variant18037, - Variant18038, - Variant18039, - Variant18040, - Variant18041, - Variant18042, - Variant18043, - Variant18044, - Variant18045, - Variant18046, - Variant18047, - Variant18048, - Variant18049, - Variant18050, - Variant18051, - Variant18052, - Variant18053, - Variant18054, - Variant18055, - Variant18056, - Variant18057, - Variant18058, - Variant18059, - Variant18060, - Variant18061, - Variant18062, - Variant18063, - Variant18064, - Variant18065, - Variant18066, - Variant18067, - Variant18068, - Variant18069, - Variant18070, - Variant18071, - Variant18072, - Variant18073, - Variant18074, - Variant18075, - Variant18076, - Variant18077, - Variant18078, - Variant18079, - Variant18080, - Variant18081, - Variant18082, - Variant18083, - Variant18084, - Variant18085, - Variant18086, - Variant18087, - Variant18088, - Variant18089, - Variant18090, - Variant18091, - Variant18092, - Variant18093, - Variant18094, - Variant18095, - Variant18096, - Variant18097, - Variant18098, - Variant18099, - Variant18100, - Variant18101, - Variant18102, - Variant18103, - Variant18104, - Variant18105, - Variant18106, - Variant18107, - Variant18108, - Variant18109, - Variant18110, - Variant18111, - Variant18112, - Variant18113, - Variant18114, - Variant18115, - Variant18116, - Variant18117, - Variant18118, - Variant18119, - Variant18120, - Variant18121, - Variant18122, - Variant18123, - Variant18124, - Variant18125, - Variant18126, - Variant18127, - Variant18128, - Variant18129, - Variant18130, - Variant18131, - Variant18132, - Variant18133, - Variant18134, - Variant18135, - Variant18136, - Variant18137, - Variant18138, - Variant18139, - Variant18140, - Variant18141, - Variant18142, - Variant18143, - Variant18144, - Variant18145, - Variant18146, - Variant18147, - Variant18148, - Variant18149, - Variant18150, - Variant18151, - Variant18152, - Variant18153, - Variant18154, - Variant18155, - Variant18156, - Variant18157, - Variant18158, - Variant18159, - Variant18160, - Variant18161, - Variant18162, - Variant18163, - Variant18164, - Variant18165, - Variant18166, - Variant18167, - Variant18168, - Variant18169, - Variant18170, - Variant18171, - Variant18172, - Variant18173, - Variant18174, - Variant18175, - Variant18176, - Variant18177, - Variant18178, - Variant18179, - Variant18180, - Variant18181, - Variant18182, - Variant18183, - Variant18184, - Variant18185, - Variant18186, - Variant18187, - Variant18188, - Variant18189, - Variant18190, - Variant18191, - Variant18192, - Variant18193, - Variant18194, - Variant18195, - Variant18196, - Variant18197, - Variant18198, - Variant18199, - Variant18200, - Variant18201, - Variant18202, - Variant18203, - Variant18204, - Variant18205, - Variant18206, - Variant18207, - Variant18208, - Variant18209, - Variant18210, - Variant18211, - Variant18212, - Variant18213, - Variant18214, - Variant18215, - Variant18216, - Variant18217, - Variant18218, - Variant18219, - Variant18220, - Variant18221, - Variant18222, - Variant18223, - Variant18224, - Variant18225, - Variant18226, - Variant18227, - Variant18228, - Variant18229, - Variant18230, - Variant18231, - Variant18232, - Variant18233, - Variant18234, - Variant18235, - Variant18236, - Variant18237, - Variant18238, - Variant18239, - Variant18240, - Variant18241, - Variant18242, - Variant18243, - Variant18244, - Variant18245, - Variant18246, - Variant18247, - Variant18248, - Variant18249, - Variant18250, - Variant18251, - Variant18252, - Variant18253, - Variant18254, - Variant18255, - Variant18256, - Variant18257, - Variant18258, - Variant18259, - Variant18260, - Variant18261, - Variant18262, - Variant18263, - Variant18264, - Variant18265, - Variant18266, - Variant18267, - Variant18268, - Variant18269, - Variant18270, - Variant18271, - Variant18272, - Variant18273, - Variant18274, - Variant18275, - Variant18276, - Variant18277, - Variant18278, - Variant18279, - Variant18280, - Variant18281, - Variant18282, - Variant18283, - Variant18284, - Variant18285, - Variant18286, - Variant18287, - Variant18288, - Variant18289, - Variant18290, - Variant18291, - Variant18292, - Variant18293, - Variant18294, - Variant18295, - Variant18296, - Variant18297, - Variant18298, - Variant18299, - Variant18300, - Variant18301, - Variant18302, - Variant18303, - Variant18304, - Variant18305, - Variant18306, - Variant18307, - Variant18308, - Variant18309, - Variant18310, - Variant18311, - Variant18312, - Variant18313, - Variant18314, - Variant18315, - Variant18316, - Variant18317, - Variant18318, - Variant18319, - Variant18320, - Variant18321, - Variant18322, - Variant18323, - Variant18324, - Variant18325, - Variant18326, - Variant18327, - Variant18328, - Variant18329, - Variant18330, - Variant18331, - Variant18332, - Variant18333, - Variant18334, - Variant18335, - Variant18336, - Variant18337, - Variant18338, - Variant18339, - Variant18340, - Variant18341, - Variant18342, - Variant18343, - Variant18344, - Variant18345, - Variant18346, - Variant18347, - Variant18348, - Variant18349, - Variant18350, - Variant18351, - Variant18352, - Variant18353, - Variant18354, - Variant18355, - Variant18356, - Variant18357, - Variant18358, - Variant18359, - Variant18360, - Variant18361, - Variant18362, - Variant18363, - Variant18364, - Variant18365, - Variant18366, - Variant18367, - Variant18368, - Variant18369, - Variant18370, - Variant18371, - Variant18372, - Variant18373, - Variant18374, - Variant18375, - Variant18376, - Variant18377, - Variant18378, - Variant18379, - Variant18380, - Variant18381, - Variant18382, - Variant18383, - Variant18384, - Variant18385, - Variant18386, - Variant18387, - Variant18388, - Variant18389, - Variant18390, - Variant18391, - Variant18392, - Variant18393, - Variant18394, - Variant18395, - Variant18396, - Variant18397, - Variant18398, - Variant18399, - Variant18400, - Variant18401, - Variant18402, - Variant18403, - Variant18404, - Variant18405, - Variant18406, - Variant18407, - Variant18408, - Variant18409, - Variant18410, - Variant18411, - Variant18412, - Variant18413, - Variant18414, - Variant18415, - Variant18416, - Variant18417, - Variant18418, - Variant18419, - Variant18420, - Variant18421, - Variant18422, - Variant18423, - Variant18424, - Variant18425, - Variant18426, - Variant18427, - Variant18428, - Variant18429, - Variant18430, - Variant18431, - Variant18432, - Variant18433, - Variant18434, - Variant18435, - Variant18436, - Variant18437, - Variant18438, - Variant18439, - Variant18440, - Variant18441, - Variant18442, - Variant18443, - Variant18444, - Variant18445, - Variant18446, - Variant18447, - Variant18448, - Variant18449, - Variant18450, - Variant18451, - Variant18452, - Variant18453, - Variant18454, - Variant18455, - Variant18456, - Variant18457, - Variant18458, - Variant18459, - Variant18460, - Variant18461, - Variant18462, - Variant18463, - Variant18464, - Variant18465, - Variant18466, - Variant18467, - Variant18468, - Variant18469, - Variant18470, - Variant18471, - Variant18472, - Variant18473, - Variant18474, - Variant18475, - Variant18476, - Variant18477, - Variant18478, - Variant18479, - Variant18480, - Variant18481, - Variant18482, - Variant18483, - Variant18484, - Variant18485, - Variant18486, - Variant18487, - Variant18488, - Variant18489, - Variant18490, - Variant18491, - Variant18492, - Variant18493, - Variant18494, - Variant18495, - Variant18496, - Variant18497, - Variant18498, - Variant18499, - Variant18500, - Variant18501, - Variant18502, - Variant18503, - Variant18504, - Variant18505, - Variant18506, - Variant18507, - Variant18508, - Variant18509, - Variant18510, - Variant18511, - Variant18512, - Variant18513, - Variant18514, - Variant18515, - Variant18516, - Variant18517, - Variant18518, - Variant18519, - Variant18520, - Variant18521, - Variant18522, - Variant18523, - Variant18524, - Variant18525, - Variant18526, - Variant18527, - Variant18528, - Variant18529, - Variant18530, - Variant18531, - Variant18532, - Variant18533, - Variant18534, - Variant18535, - Variant18536, - Variant18537, - Variant18538, - Variant18539, - Variant18540, - Variant18541, - Variant18542, - Variant18543, - Variant18544, - Variant18545, - Variant18546, - Variant18547, - Variant18548, - Variant18549, - Variant18550, - Variant18551, - Variant18552, - Variant18553, - Variant18554, - Variant18555, - Variant18556, - Variant18557, - Variant18558, - Variant18559, - Variant18560, - Variant18561, - Variant18562, - Variant18563, - Variant18564, - Variant18565, - Variant18566, - Variant18567, - Variant18568, - Variant18569, - Variant18570, - Variant18571, - Variant18572, - Variant18573, - Variant18574, - Variant18575, - Variant18576, - Variant18577, - Variant18578, - Variant18579, - Variant18580, - Variant18581, - Variant18582, - Variant18583, - Variant18584, - Variant18585, - Variant18586, - Variant18587, - Variant18588, - Variant18589, - Variant18590, - Variant18591, - Variant18592, - Variant18593, - Variant18594, - Variant18595, - Variant18596, - Variant18597, - Variant18598, - Variant18599, - Variant18600, - Variant18601, - Variant18602, - Variant18603, - Variant18604, - Variant18605, - Variant18606, - Variant18607, - Variant18608, - Variant18609, - Variant18610, - Variant18611, - Variant18612, - Variant18613, - Variant18614, - Variant18615, - Variant18616, - Variant18617, - Variant18618, - Variant18619, - Variant18620, - Variant18621, - Variant18622, - Variant18623, - Variant18624, - Variant18625, - Variant18626, - Variant18627, - Variant18628, - Variant18629, - Variant18630, - Variant18631, - Variant18632, - Variant18633, - Variant18634, - Variant18635, - Variant18636, - Variant18637, - Variant18638, - Variant18639, - Variant18640, - Variant18641, - Variant18642, - Variant18643, - Variant18644, - Variant18645, - Variant18646, - Variant18647, - Variant18648, - Variant18649, - Variant18650, - Variant18651, - Variant18652, - Variant18653, - Variant18654, - Variant18655, - Variant18656, - Variant18657, - Variant18658, - Variant18659, - Variant18660, - Variant18661, - Variant18662, - Variant18663, - Variant18664, - Variant18665, - Variant18666, - Variant18667, - Variant18668, - Variant18669, - Variant18670, - Variant18671, - Variant18672, - Variant18673, - Variant18674, - Variant18675, - Variant18676, - Variant18677, - Variant18678, - Variant18679, - Variant18680, - Variant18681, - Variant18682, - Variant18683, - Variant18684, - Variant18685, - Variant18686, - Variant18687, - Variant18688, - Variant18689, - Variant18690, - Variant18691, - Variant18692, - Variant18693, - Variant18694, - Variant18695, - Variant18696, - Variant18697, - Variant18698, - Variant18699, - Variant18700, - Variant18701, - Variant18702, - Variant18703, - Variant18704, - Variant18705, - Variant18706, - Variant18707, - Variant18708, - Variant18709, - Variant18710, - Variant18711, - Variant18712, - Variant18713, - Variant18714, - Variant18715, - Variant18716, - Variant18717, - Variant18718, - Variant18719, - Variant18720, - Variant18721, - Variant18722, - Variant18723, - Variant18724, - Variant18725, - Variant18726, - Variant18727, - Variant18728, - Variant18729, - Variant18730, - Variant18731, - Variant18732, - Variant18733, - Variant18734, - Variant18735, - Variant18736, - Variant18737, - Variant18738, - Variant18739, - Variant18740, - Variant18741, - Variant18742, - Variant18743, - Variant18744, - Variant18745, - Variant18746, - Variant18747, - Variant18748, - Variant18749, - Variant18750, - Variant18751, - Variant18752, - Variant18753, - Variant18754, - Variant18755, - Variant18756, - Variant18757, - Variant18758, - Variant18759, - Variant18760, - Variant18761, - Variant18762, - Variant18763, - Variant18764, - Variant18765, - Variant18766, - Variant18767, - Variant18768, - Variant18769, - Variant18770, - Variant18771, - Variant18772, - Variant18773, - Variant18774, - Variant18775, - Variant18776, - Variant18777, - Variant18778, - Variant18779, - Variant18780, - Variant18781, - Variant18782, - Variant18783, - Variant18784, - Variant18785, - Variant18786, - Variant18787, - Variant18788, - Variant18789, - Variant18790, - Variant18791, - Variant18792, - Variant18793, - Variant18794, - Variant18795, - Variant18796, - Variant18797, - Variant18798, - Variant18799, - Variant18800, - Variant18801, - Variant18802, - Variant18803, - Variant18804, - Variant18805, - Variant18806, - Variant18807, - Variant18808, - Variant18809, - Variant18810, - Variant18811, - Variant18812, - Variant18813, - Variant18814, - Variant18815, - Variant18816, - Variant18817, - Variant18818, - Variant18819, - Variant18820, - Variant18821, - Variant18822, - Variant18823, - Variant18824, - Variant18825, - Variant18826, - Variant18827, - Variant18828, - Variant18829, - Variant18830, - Variant18831, - Variant18832, - Variant18833, - Variant18834, - Variant18835, - Variant18836, - Variant18837, - Variant18838, - Variant18839, - Variant18840, - Variant18841, - Variant18842, - Variant18843, - Variant18844, - Variant18845, - Variant18846, - Variant18847, - Variant18848, - Variant18849, - Variant18850, - Variant18851, - Variant18852, - Variant18853, - Variant18854, - Variant18855, - Variant18856, - Variant18857, - Variant18858, - Variant18859, - Variant18860, - Variant18861, - Variant18862, - Variant18863, - Variant18864, - Variant18865, - Variant18866, - Variant18867, - Variant18868, - Variant18869, - Variant18870, - Variant18871, - Variant18872, - Variant18873, - Variant18874, - Variant18875, - Variant18876, - Variant18877, - Variant18878, - Variant18879, - Variant18880, - Variant18881, - Variant18882, - Variant18883, - Variant18884, - Variant18885, - Variant18886, - Variant18887, - Variant18888, - Variant18889, - Variant18890, - Variant18891, - Variant18892, - Variant18893, - Variant18894, - Variant18895, - Variant18896, - Variant18897, - Variant18898, - Variant18899, - Variant18900, - Variant18901, - Variant18902, - Variant18903, - Variant18904, - Variant18905, - Variant18906, - Variant18907, - Variant18908, - Variant18909, - Variant18910, - Variant18911, - Variant18912, - Variant18913, - Variant18914, - Variant18915, - Variant18916, - Variant18917, - Variant18918, - Variant18919, - Variant18920, - Variant18921, - Variant18922, - Variant18923, - Variant18924, - Variant18925, - Variant18926, - Variant18927, - Variant18928, - Variant18929, - Variant18930, - Variant18931, - Variant18932, - Variant18933, - Variant18934, - Variant18935, - Variant18936, - Variant18937, - Variant18938, - Variant18939, - Variant18940, - Variant18941, - Variant18942, - Variant18943, - Variant18944, - Variant18945, - Variant18946, - Variant18947, - Variant18948, - Variant18949, - Variant18950, - Variant18951, - Variant18952, - Variant18953, - Variant18954, - Variant18955, - Variant18956, - Variant18957, - Variant18958, - Variant18959, - Variant18960, - Variant18961, - Variant18962, - Variant18963, - Variant18964, - Variant18965, - Variant18966, - Variant18967, - Variant18968, - Variant18969, - Variant18970, - Variant18971, - Variant18972, - Variant18973, - Variant18974, - Variant18975, - Variant18976, - Variant18977, - Variant18978, - Variant18979, - Variant18980, - Variant18981, - Variant18982, - Variant18983, - Variant18984, - Variant18985, - Variant18986, - Variant18987, - Variant18988, - Variant18989, - Variant18990, - Variant18991, - Variant18992, - Variant18993, - Variant18994, - Variant18995, - Variant18996, - Variant18997, - Variant18998, - Variant18999, - Variant19000, - Variant19001, - Variant19002, - Variant19003, - Variant19004, - Variant19005, - Variant19006, - Variant19007, - Variant19008, - Variant19009, - Variant19010, - Variant19011, - Variant19012, - Variant19013, - Variant19014, - Variant19015, - Variant19016, - Variant19017, - Variant19018, - Variant19019, - Variant19020, - Variant19021, - Variant19022, - Variant19023, - Variant19024, - Variant19025, - Variant19026, - Variant19027, - Variant19028, - Variant19029, - Variant19030, - Variant19031, - Variant19032, - Variant19033, - Variant19034, - Variant19035, - Variant19036, - Variant19037, - Variant19038, - Variant19039, - Variant19040, - Variant19041, - Variant19042, - Variant19043, - Variant19044, - Variant19045, - Variant19046, - Variant19047, - Variant19048, - Variant19049, - Variant19050, - Variant19051, - Variant19052, - Variant19053, - Variant19054, - Variant19055, - Variant19056, - Variant19057, - Variant19058, - Variant19059, - Variant19060, - Variant19061, - Variant19062, - Variant19063, - Variant19064, - Variant19065, - Variant19066, - Variant19067, - Variant19068, - Variant19069, - Variant19070, - Variant19071, - Variant19072, - Variant19073, - Variant19074, - Variant19075, - Variant19076, - Variant19077, - Variant19078, - Variant19079, - Variant19080, - Variant19081, - Variant19082, - Variant19083, - Variant19084, - Variant19085, - Variant19086, - Variant19087, - Variant19088, - Variant19089, - Variant19090, - Variant19091, - Variant19092, - Variant19093, - Variant19094, - Variant19095, - Variant19096, - Variant19097, - Variant19098, - Variant19099, - Variant19100, - Variant19101, - Variant19102, - Variant19103, - Variant19104, - Variant19105, - Variant19106, - Variant19107, - Variant19108, - Variant19109, - Variant19110, - Variant19111, - Variant19112, - Variant19113, - Variant19114, - Variant19115, - Variant19116, - Variant19117, - Variant19118, - Variant19119, - Variant19120, - Variant19121, - Variant19122, - Variant19123, - Variant19124, - Variant19125, - Variant19126, - Variant19127, - Variant19128, - Variant19129, - Variant19130, - Variant19131, - Variant19132, - Variant19133, - Variant19134, - Variant19135, - Variant19136, - Variant19137, - Variant19138, - Variant19139, - Variant19140, - Variant19141, - Variant19142, - Variant19143, - Variant19144, - Variant19145, - Variant19146, - Variant19147, - Variant19148, - Variant19149, - Variant19150, - Variant19151, - Variant19152, - Variant19153, - Variant19154, - Variant19155, - Variant19156, - Variant19157, - Variant19158, - Variant19159, - Variant19160, - Variant19161, - Variant19162, - Variant19163, - Variant19164, - Variant19165, - Variant19166, - Variant19167, - Variant19168, - Variant19169, - Variant19170, - Variant19171, - Variant19172, - Variant19173, - Variant19174, - Variant19175, - Variant19176, - Variant19177, - Variant19178, - Variant19179, - Variant19180, - Variant19181, - Variant19182, - Variant19183, - Variant19184, - Variant19185, - Variant19186, - Variant19187, - Variant19188, - Variant19189, - Variant19190, - Variant19191, - Variant19192, - Variant19193, - Variant19194, - Variant19195, - Variant19196, - Variant19197, - Variant19198, - Variant19199, - Variant19200, - Variant19201, - Variant19202, - Variant19203, - Variant19204, - Variant19205, - Variant19206, - Variant19207, - Variant19208, - Variant19209, - Variant19210, - Variant19211, - Variant19212, - Variant19213, - Variant19214, - Variant19215, - Variant19216, - Variant19217, - Variant19218, - Variant19219, - Variant19220, - Variant19221, - Variant19222, - Variant19223, - Variant19224, - Variant19225, - Variant19226, - Variant19227, - Variant19228, - Variant19229, - Variant19230, - Variant19231, - Variant19232, - Variant19233, - Variant19234, - Variant19235, - Variant19236, - Variant19237, - Variant19238, - Variant19239, - Variant19240, - Variant19241, - Variant19242, - Variant19243, - Variant19244, - Variant19245, - Variant19246, - Variant19247, - Variant19248, - Variant19249, - Variant19250, - Variant19251, - Variant19252, - Variant19253, - Variant19254, - Variant19255, - Variant19256, - Variant19257, - Variant19258, - Variant19259, - Variant19260, - Variant19261, - Variant19262, - Variant19263, - Variant19264, - Variant19265, - Variant19266, - Variant19267, - Variant19268, - Variant19269, - Variant19270, - Variant19271, - Variant19272, - Variant19273, - Variant19274, - Variant19275, - Variant19276, - Variant19277, - Variant19278, - Variant19279, - Variant19280, - Variant19281, - Variant19282, - Variant19283, - Variant19284, - Variant19285, - Variant19286, - Variant19287, - Variant19288, - Variant19289, - Variant19290, - Variant19291, - Variant19292, - Variant19293, - Variant19294, - Variant19295, - Variant19296, - Variant19297, - Variant19298, - Variant19299, - Variant19300, - Variant19301, - Variant19302, - Variant19303, - Variant19304, - Variant19305, - Variant19306, - Variant19307, - Variant19308, - Variant19309, - Variant19310, - Variant19311, - Variant19312, - Variant19313, - Variant19314, - Variant19315, - Variant19316, - Variant19317, - Variant19318, - Variant19319, - Variant19320, - Variant19321, - Variant19322, - Variant19323, - Variant19324, - Variant19325, - Variant19326, - Variant19327, - Variant19328, - Variant19329, - Variant19330, - Variant19331, - Variant19332, - Variant19333, - Variant19334, - Variant19335, - Variant19336, - Variant19337, - Variant19338, - Variant19339, - Variant19340, - Variant19341, - Variant19342, - Variant19343, - Variant19344, - Variant19345, - Variant19346, - Variant19347, - Variant19348, - Variant19349, - Variant19350, - Variant19351, - Variant19352, - Variant19353, - Variant19354, - Variant19355, - Variant19356, - Variant19357, - Variant19358, - Variant19359, - Variant19360, - Variant19361, - Variant19362, - Variant19363, - Variant19364, - Variant19365, - Variant19366, - Variant19367, - Variant19368, - Variant19369, - Variant19370, - Variant19371, - Variant19372, - Variant19373, - Variant19374, - Variant19375, - Variant19376, - Variant19377, - Variant19378, - Variant19379, - Variant19380, - Variant19381, - Variant19382, - Variant19383, - Variant19384, - Variant19385, - Variant19386, - Variant19387, - Variant19388, - Variant19389, - Variant19390, - Variant19391, - Variant19392, - Variant19393, - Variant19394, - Variant19395, - Variant19396, - Variant19397, - Variant19398, - Variant19399, - Variant19400, - Variant19401, - Variant19402, - Variant19403, - Variant19404, - Variant19405, - Variant19406, - Variant19407, - Variant19408, - Variant19409, - Variant19410, - Variant19411, - Variant19412, - Variant19413, - Variant19414, - Variant19415, - Variant19416, - Variant19417, - Variant19418, - Variant19419, - Variant19420, - Variant19421, - Variant19422, - Variant19423, - Variant19424, - Variant19425, - Variant19426, - Variant19427, - Variant19428, - Variant19429, - Variant19430, - Variant19431, - Variant19432, - Variant19433, - Variant19434, - Variant19435, - Variant19436, - Variant19437, - Variant19438, - Variant19439, - Variant19440, - Variant19441, - Variant19442, - Variant19443, - Variant19444, - Variant19445, - Variant19446, - Variant19447, - Variant19448, - Variant19449, - Variant19450, - Variant19451, - Variant19452, - Variant19453, - Variant19454, - Variant19455, - Variant19456, - Variant19457, - Variant19458, - Variant19459, - Variant19460, - Variant19461, - Variant19462, - Variant19463, - Variant19464, - Variant19465, - Variant19466, - Variant19467, - Variant19468, - Variant19469, - Variant19470, - Variant19471, - Variant19472, - Variant19473, - Variant19474, - Variant19475, - Variant19476, - Variant19477, - Variant19478, - Variant19479, - Variant19480, - Variant19481, - Variant19482, - Variant19483, - Variant19484, - Variant19485, - Variant19486, - Variant19487, - Variant19488, - Variant19489, - Variant19490, - Variant19491, - Variant19492, - Variant19493, - Variant19494, - Variant19495, - Variant19496, - Variant19497, - Variant19498, - Variant19499, - Variant19500, - Variant19501, - Variant19502, - Variant19503, - Variant19504, - Variant19505, - Variant19506, - Variant19507, - Variant19508, - Variant19509, - Variant19510, - Variant19511, - Variant19512, - Variant19513, - Variant19514, - Variant19515, - Variant19516, - Variant19517, - Variant19518, - Variant19519, - Variant19520, - Variant19521, - Variant19522, - Variant19523, - Variant19524, - Variant19525, - Variant19526, - Variant19527, - Variant19528, - Variant19529, - Variant19530, - Variant19531, - Variant19532, - Variant19533, - Variant19534, - Variant19535, - Variant19536, - Variant19537, - Variant19538, - Variant19539, - Variant19540, - Variant19541, - Variant19542, - Variant19543, - Variant19544, - Variant19545, - Variant19546, - Variant19547, - Variant19548, - Variant19549, - Variant19550, - Variant19551, - Variant19552, - Variant19553, - Variant19554, - Variant19555, - Variant19556, - Variant19557, - Variant19558, - Variant19559, - Variant19560, - Variant19561, - Variant19562, - Variant19563, - Variant19564, - Variant19565, - Variant19566, - Variant19567, - Variant19568, - Variant19569, - Variant19570, - Variant19571, - Variant19572, - Variant19573, - Variant19574, - Variant19575, - Variant19576, - Variant19577, - Variant19578, - Variant19579, - Variant19580, - Variant19581, - Variant19582, - Variant19583, - Variant19584, - Variant19585, - Variant19586, - Variant19587, - Variant19588, - Variant19589, - Variant19590, - Variant19591, - Variant19592, - Variant19593, - Variant19594, - Variant19595, - Variant19596, - Variant19597, - Variant19598, - Variant19599, - Variant19600, - Variant19601, - Variant19602, - Variant19603, - Variant19604, - Variant19605, - Variant19606, - Variant19607, - Variant19608, - Variant19609, - Variant19610, - Variant19611, - Variant19612, - Variant19613, - Variant19614, - Variant19615, - Variant19616, - Variant19617, - Variant19618, - Variant19619, - Variant19620, - Variant19621, - Variant19622, - Variant19623, - Variant19624, - Variant19625, - Variant19626, - Variant19627, - Variant19628, - Variant19629, - Variant19630, - Variant19631, - Variant19632, - Variant19633, - Variant19634, - Variant19635, - Variant19636, - Variant19637, - Variant19638, - Variant19639, - Variant19640, - Variant19641, - Variant19642, - Variant19643, - Variant19644, - Variant19645, - Variant19646, - Variant19647, - Variant19648, - Variant19649, - Variant19650, - Variant19651, - Variant19652, - Variant19653, - Variant19654, - Variant19655, - Variant19656, - Variant19657, - Variant19658, - Variant19659, - Variant19660, - Variant19661, - Variant19662, - Variant19663, - Variant19664, - Variant19665, - Variant19666, - Variant19667, - Variant19668, - Variant19669, - Variant19670, - Variant19671, - Variant19672, - Variant19673, - Variant19674, - Variant19675, - Variant19676, - Variant19677, - Variant19678, - Variant19679, - Variant19680, - Variant19681, - Variant19682, - Variant19683, - Variant19684, - Variant19685, - Variant19686, - Variant19687, - Variant19688, - Variant19689, - Variant19690, - Variant19691, - Variant19692, - Variant19693, - Variant19694, - Variant19695, - Variant19696, - Variant19697, - Variant19698, - Variant19699, - Variant19700, - Variant19701, - Variant19702, - Variant19703, - Variant19704, - Variant19705, - Variant19706, - Variant19707, - Variant19708, - Variant19709, - Variant19710, - Variant19711, - Variant19712, - Variant19713, - Variant19714, - Variant19715, - Variant19716, - Variant19717, - Variant19718, - Variant19719, - Variant19720, - Variant19721, - Variant19722, - Variant19723, - Variant19724, - Variant19725, - Variant19726, - Variant19727, - Variant19728, - Variant19729, - Variant19730, - Variant19731, - Variant19732, - Variant19733, - Variant19734, - Variant19735, - Variant19736, - Variant19737, - Variant19738, - Variant19739, - Variant19740, - Variant19741, - Variant19742, - Variant19743, - Variant19744, - Variant19745, - Variant19746, - Variant19747, - Variant19748, - Variant19749, - Variant19750, - Variant19751, - Variant19752, - Variant19753, - Variant19754, - Variant19755, - Variant19756, - Variant19757, - Variant19758, - Variant19759, - Variant19760, - Variant19761, - Variant19762, - Variant19763, - Variant19764, - Variant19765, - Variant19766, - Variant19767, - Variant19768, - Variant19769, - Variant19770, - Variant19771, - Variant19772, - Variant19773, - Variant19774, - Variant19775, - Variant19776, - Variant19777, - Variant19778, - Variant19779, - Variant19780, - Variant19781, - Variant19782, - Variant19783, - Variant19784, - Variant19785, - Variant19786, - Variant19787, - Variant19788, - Variant19789, - Variant19790, - Variant19791, - Variant19792, - Variant19793, - Variant19794, - Variant19795, - Variant19796, - Variant19797, - Variant19798, - Variant19799, - Variant19800, - Variant19801, - Variant19802, - Variant19803, - Variant19804, - Variant19805, - Variant19806, - Variant19807, - Variant19808, - Variant19809, - Variant19810, - Variant19811, - Variant19812, - Variant19813, - Variant19814, - Variant19815, - Variant19816, - Variant19817, - Variant19818, - Variant19819, - Variant19820, - Variant19821, - Variant19822, - Variant19823, - Variant19824, - Variant19825, - Variant19826, - Variant19827, - Variant19828, - Variant19829, - Variant19830, - Variant19831, - Variant19832, - Variant19833, - Variant19834, - Variant19835, - Variant19836, - Variant19837, - Variant19838, - Variant19839, - Variant19840, - Variant19841, - Variant19842, - Variant19843, - Variant19844, - Variant19845, - Variant19846, - Variant19847, - Variant19848, - Variant19849, - Variant19850, - Variant19851, - Variant19852, - Variant19853, - Variant19854, - Variant19855, - Variant19856, - Variant19857, - Variant19858, - Variant19859, - Variant19860, - Variant19861, - Variant19862, - Variant19863, - Variant19864, - Variant19865, - Variant19866, - Variant19867, - Variant19868, - Variant19869, - Variant19870, - Variant19871, - Variant19872, - Variant19873, - Variant19874, - Variant19875, - Variant19876, - Variant19877, - Variant19878, - Variant19879, - Variant19880, - Variant19881, - Variant19882, - Variant19883, - Variant19884, - Variant19885, - Variant19886, - Variant19887, - Variant19888, - Variant19889, - Variant19890, - Variant19891, - Variant19892, - Variant19893, - Variant19894, - Variant19895, - Variant19896, - Variant19897, - Variant19898, - Variant19899, - Variant19900, - Variant19901, - Variant19902, - Variant19903, - Variant19904, - Variant19905, - Variant19906, - Variant19907, - Variant19908, - Variant19909, - Variant19910, - Variant19911, - Variant19912, - Variant19913, - Variant19914, - Variant19915, - Variant19916, - Variant19917, - Variant19918, - Variant19919, - Variant19920, - Variant19921, - Variant19922, - Variant19923, - Variant19924, - Variant19925, - Variant19926, - Variant19927, - Variant19928, - Variant19929, - Variant19930, - Variant19931, - Variant19932, - Variant19933, - Variant19934, - Variant19935, - Variant19936, - Variant19937, - Variant19938, - Variant19939, - Variant19940, - Variant19941, - Variant19942, - Variant19943, - Variant19944, - Variant19945, - Variant19946, - Variant19947, - Variant19948, - Variant19949, - Variant19950, - Variant19951, - Variant19952, - Variant19953, - Variant19954, - Variant19955, - Variant19956, - Variant19957, - Variant19958, - Variant19959, - Variant19960, - Variant19961, - Variant19962, - Variant19963, - Variant19964, - Variant19965, - Variant19966, - Variant19967, - Variant19968, - Variant19969, - Variant19970, - Variant19971, - Variant19972, - Variant19973, - Variant19974, - Variant19975, - Variant19976, - Variant19977, - Variant19978, - Variant19979, - Variant19980, - Variant19981, - Variant19982, - Variant19983, - Variant19984, - Variant19985, - Variant19986, - Variant19987, - Variant19988, - Variant19989, - Variant19990, - Variant19991, - Variant19992, - Variant19993, - Variant19994, - Variant19995, - Variant19996, - Variant19997, - Variant19998, - Variant19999, - Variant20000, - Variant20001, - Variant20002, - Variant20003, - Variant20004, - Variant20005, - Variant20006, - Variant20007, - Variant20008, - Variant20009, - Variant20010, - Variant20011, - Variant20012, - Variant20013, - Variant20014, - Variant20015, - Variant20016, - Variant20017, - Variant20018, - Variant20019, - Variant20020, - Variant20021, - Variant20022, - Variant20023, - Variant20024, - Variant20025, - Variant20026, - Variant20027, - Variant20028, - Variant20029, - Variant20030, - Variant20031, - Variant20032, - Variant20033, - Variant20034, - Variant20035, - Variant20036, - Variant20037, - Variant20038, - Variant20039, - Variant20040, - Variant20041, - Variant20042, - Variant20043, - Variant20044, - Variant20045, - Variant20046, - Variant20047, - Variant20048, - Variant20049, - Variant20050, - Variant20051, - Variant20052, - Variant20053, - Variant20054, - Variant20055, - Variant20056, - Variant20057, - Variant20058, - Variant20059, - Variant20060, - Variant20061, - Variant20062, - Variant20063, - Variant20064, - Variant20065, - Variant20066, - Variant20067, - Variant20068, - Variant20069, - Variant20070, - Variant20071, - Variant20072, - Variant20073, - Variant20074, - Variant20075, - Variant20076, - Variant20077, - Variant20078, - Variant20079, - Variant20080, - Variant20081, - Variant20082, - Variant20083, - Variant20084, - Variant20085, - Variant20086, - Variant20087, - Variant20088, - Variant20089, - Variant20090, - Variant20091, - Variant20092, - Variant20093, - Variant20094, - Variant20095, - Variant20096, - Variant20097, - Variant20098, - Variant20099, - Variant20100, - Variant20101, - Variant20102, - Variant20103, - Variant20104, - Variant20105, - Variant20106, - Variant20107, - Variant20108, - Variant20109, - Variant20110, - Variant20111, - Variant20112, - Variant20113, - Variant20114, - Variant20115, - Variant20116, - Variant20117, - Variant20118, - Variant20119, - Variant20120, - Variant20121, - Variant20122, - Variant20123, - Variant20124, - Variant20125, - Variant20126, - Variant20127, - Variant20128, - Variant20129, - Variant20130, - Variant20131, - Variant20132, - Variant20133, - Variant20134, - Variant20135, - Variant20136, - Variant20137, - Variant20138, - Variant20139, - Variant20140, - Variant20141, - Variant20142, - Variant20143, - Variant20144, - Variant20145, - Variant20146, - Variant20147, - Variant20148, - Variant20149, - Variant20150, - Variant20151, - Variant20152, - Variant20153, - Variant20154, - Variant20155, - Variant20156, - Variant20157, - Variant20158, - Variant20159, - Variant20160, - Variant20161, - Variant20162, - Variant20163, - Variant20164, - Variant20165, - Variant20166, - Variant20167, - Variant20168, - Variant20169, - Variant20170, - Variant20171, - Variant20172, - Variant20173, - Variant20174, - Variant20175, - Variant20176, - Variant20177, - Variant20178, - Variant20179, - Variant20180, - Variant20181, - Variant20182, - Variant20183, - Variant20184, - Variant20185, - Variant20186, - Variant20187, - Variant20188, - Variant20189, - Variant20190, - Variant20191, - Variant20192, - Variant20193, - Variant20194, - Variant20195, - Variant20196, - Variant20197, - Variant20198, - Variant20199, - Variant20200, - Variant20201, - Variant20202, - Variant20203, - Variant20204, - Variant20205, - Variant20206, - Variant20207, - Variant20208, - Variant20209, - Variant20210, - Variant20211, - Variant20212, - Variant20213, - Variant20214, - Variant20215, - Variant20216, - Variant20217, - Variant20218, - Variant20219, - Variant20220, - Variant20221, - Variant20222, - Variant20223, - Variant20224, - Variant20225, - Variant20226, - Variant20227, - Variant20228, - Variant20229, - Variant20230, - Variant20231, - Variant20232, - Variant20233, - Variant20234, - Variant20235, - Variant20236, - Variant20237, - Variant20238, - Variant20239, - Variant20240, - Variant20241, - Variant20242, - Variant20243, - Variant20244, - Variant20245, - Variant20246, - Variant20247, - Variant20248, - Variant20249, - Variant20250, - Variant20251, - Variant20252, - Variant20253, - Variant20254, - Variant20255, - Variant20256, - Variant20257, - Variant20258, - Variant20259, - Variant20260, - Variant20261, - Variant20262, - Variant20263, - Variant20264, - Variant20265, - Variant20266, - Variant20267, - Variant20268, - Variant20269, - Variant20270, - Variant20271, - Variant20272, - Variant20273, - Variant20274, - Variant20275, - Variant20276, - Variant20277, - Variant20278, - Variant20279, - Variant20280, - Variant20281, - Variant20282, - Variant20283, - Variant20284, - Variant20285, - Variant20286, - Variant20287, - Variant20288, - Variant20289, - Variant20290, - Variant20291, - Variant20292, - Variant20293, - Variant20294, - Variant20295, - Variant20296, - Variant20297, - Variant20298, - Variant20299, - Variant20300, - Variant20301, - Variant20302, - Variant20303, - Variant20304, - Variant20305, - Variant20306, - Variant20307, - Variant20308, - Variant20309, - Variant20310, - Variant20311, - Variant20312, - Variant20313, - Variant20314, - Variant20315, - Variant20316, - Variant20317, - Variant20318, - Variant20319, - Variant20320, - Variant20321, - Variant20322, - Variant20323, - Variant20324, - Variant20325, - Variant20326, - Variant20327, - Variant20328, - Variant20329, - Variant20330, - Variant20331, - Variant20332, - Variant20333, - Variant20334, - Variant20335, - Variant20336, - Variant20337, - Variant20338, - Variant20339, - Variant20340, - Variant20341, - Variant20342, - Variant20343, - Variant20344, - Variant20345, - Variant20346, - Variant20347, - Variant20348, - Variant20349, - Variant20350, - Variant20351, - Variant20352, - Variant20353, - Variant20354, - Variant20355, - Variant20356, - Variant20357, - Variant20358, - Variant20359, - Variant20360, - Variant20361, - Variant20362, - Variant20363, - Variant20364, - Variant20365, - Variant20366, - Variant20367, - Variant20368, - Variant20369, - Variant20370, - Variant20371, - Variant20372, - Variant20373, - Variant20374, - Variant20375, - Variant20376, - Variant20377, - Variant20378, - Variant20379, - Variant20380, - Variant20381, - Variant20382, - Variant20383, - Variant20384, - Variant20385, - Variant20386, - Variant20387, - Variant20388, - Variant20389, - Variant20390, - Variant20391, - Variant20392, - Variant20393, - Variant20394, - Variant20395, - Variant20396, - Variant20397, - Variant20398, - Variant20399, - Variant20400, - Variant20401, - Variant20402, - Variant20403, - Variant20404, - Variant20405, - Variant20406, - Variant20407, - Variant20408, - Variant20409, - Variant20410, - Variant20411, - Variant20412, - Variant20413, - Variant20414, - Variant20415, - Variant20416, - Variant20417, - Variant20418, - Variant20419, - Variant20420, - Variant20421, - Variant20422, - Variant20423, - Variant20424, - Variant20425, - Variant20426, - Variant20427, - Variant20428, - Variant20429, - Variant20430, - Variant20431, - Variant20432, - Variant20433, - Variant20434, - Variant20435, - Variant20436, - Variant20437, - Variant20438, - Variant20439, - Variant20440, - Variant20441, - Variant20442, - Variant20443, - Variant20444, - Variant20445, - Variant20446, - Variant20447, - Variant20448, - Variant20449, - Variant20450, - Variant20451, - Variant20452, - Variant20453, - Variant20454, - Variant20455, - Variant20456, - Variant20457, - Variant20458, - Variant20459, - Variant20460, - Variant20461, - Variant20462, - Variant20463, - Variant20464, - Variant20465, - Variant20466, - Variant20467, - Variant20468, - Variant20469, - Variant20470, - Variant20471, - Variant20472, - Variant20473, - Variant20474, - Variant20475, - Variant20476, - Variant20477, - Variant20478, - Variant20479, - Variant20480, - Variant20481, - Variant20482, - Variant20483, - Variant20484, - Variant20485, - Variant20486, - Variant20487, - Variant20488, - Variant20489, - Variant20490, - Variant20491, - Variant20492, - Variant20493, - Variant20494, - Variant20495, - Variant20496, - Variant20497, - Variant20498, - Variant20499, - Variant20500, - Variant20501, - Variant20502, - Variant20503, - Variant20504, - Variant20505, - Variant20506, - Variant20507, - Variant20508, - Variant20509, - Variant20510, - Variant20511, - Variant20512, - Variant20513, - Variant20514, - Variant20515, - Variant20516, - Variant20517, - Variant20518, - Variant20519, - Variant20520, - Variant20521, - Variant20522, - Variant20523, - Variant20524, - Variant20525, - Variant20526, - Variant20527, - Variant20528, - Variant20529, - Variant20530, - Variant20531, - Variant20532, - Variant20533, - Variant20534, - Variant20535, - Variant20536, - Variant20537, - Variant20538, - Variant20539, - Variant20540, - Variant20541, - Variant20542, - Variant20543, - Variant20544, - Variant20545, - Variant20546, - Variant20547, - Variant20548, - Variant20549, - Variant20550, - Variant20551, - Variant20552, - Variant20553, - Variant20554, - Variant20555, - Variant20556, - Variant20557, - Variant20558, - Variant20559, - Variant20560, - Variant20561, - Variant20562, - Variant20563, - Variant20564, - Variant20565, - Variant20566, - Variant20567, - Variant20568, - Variant20569, - Variant20570, - Variant20571, - Variant20572, - Variant20573, - Variant20574, - Variant20575, - Variant20576, - Variant20577, - Variant20578, - Variant20579, - Variant20580, - Variant20581, - Variant20582, - Variant20583, - Variant20584, - Variant20585, - Variant20586, - Variant20587, - Variant20588, - Variant20589, - Variant20590, - Variant20591, - Variant20592, - Variant20593, - Variant20594, - Variant20595, - Variant20596, - Variant20597, - Variant20598, - Variant20599, - Variant20600, - Variant20601, - Variant20602, - Variant20603, - Variant20604, - Variant20605, - Variant20606, - Variant20607, - Variant20608, - Variant20609, - Variant20610, - Variant20611, - Variant20612, - Variant20613, - Variant20614, - Variant20615, - Variant20616, - Variant20617, - Variant20618, - Variant20619, - Variant20620, - Variant20621, - Variant20622, - Variant20623, - Variant20624, - Variant20625, - Variant20626, - Variant20627, - Variant20628, - Variant20629, - Variant20630, - Variant20631, - Variant20632, - Variant20633, - Variant20634, - Variant20635, - Variant20636, - Variant20637, - Variant20638, - Variant20639, - Variant20640, - Variant20641, - Variant20642, - Variant20643, - Variant20644, - Variant20645, - Variant20646, - Variant20647, - Variant20648, - Variant20649, - Variant20650, - Variant20651, - Variant20652, - Variant20653, - Variant20654, - Variant20655, - Variant20656, - Variant20657, - Variant20658, - Variant20659, - Variant20660, - Variant20661, - Variant20662, - Variant20663, - Variant20664, - Variant20665, - Variant20666, - Variant20667, - Variant20668, - Variant20669, - Variant20670, - Variant20671, - Variant20672, - Variant20673, - Variant20674, - Variant20675, - Variant20676, - Variant20677, - Variant20678, - Variant20679, - Variant20680, - Variant20681, - Variant20682, - Variant20683, - Variant20684, - Variant20685, - Variant20686, - Variant20687, - Variant20688, - Variant20689, - Variant20690, - Variant20691, - Variant20692, - Variant20693, - Variant20694, - Variant20695, - Variant20696, - Variant20697, - Variant20698, - Variant20699, - Variant20700, - Variant20701, - Variant20702, - Variant20703, - Variant20704, - Variant20705, - Variant20706, - Variant20707, - Variant20708, - Variant20709, - Variant20710, - Variant20711, - Variant20712, - Variant20713, - Variant20714, - Variant20715, - Variant20716, - Variant20717, - Variant20718, - Variant20719, - Variant20720, - Variant20721, - Variant20722, - Variant20723, - Variant20724, - Variant20725, - Variant20726, - Variant20727, - Variant20728, - Variant20729, - Variant20730, - Variant20731, - Variant20732, - Variant20733, - Variant20734, - Variant20735, - Variant20736, - Variant20737, - Variant20738, - Variant20739, - Variant20740, - Variant20741, - Variant20742, - Variant20743, - Variant20744, - Variant20745, - Variant20746, - Variant20747, - Variant20748, - Variant20749, - Variant20750, - Variant20751, - Variant20752, - Variant20753, - Variant20754, - Variant20755, - Variant20756, - Variant20757, - Variant20758, - Variant20759, - Variant20760, - Variant20761, - Variant20762, - Variant20763, - Variant20764, - Variant20765, - Variant20766, - Variant20767, - Variant20768, - Variant20769, - Variant20770, - Variant20771, - Variant20772, - Variant20773, - Variant20774, - Variant20775, - Variant20776, - Variant20777, - Variant20778, - Variant20779, - Variant20780, - Variant20781, - Variant20782, - Variant20783, - Variant20784, - Variant20785, - Variant20786, - Variant20787, - Variant20788, - Variant20789, - Variant20790, - Variant20791, - Variant20792, - Variant20793, - Variant20794, - Variant20795, - Variant20796, - Variant20797, - Variant20798, - Variant20799, - Variant20800, - Variant20801, - Variant20802, - Variant20803, - Variant20804, - Variant20805, - Variant20806, - Variant20807, - Variant20808, - Variant20809, - Variant20810, - Variant20811, - Variant20812, - Variant20813, - Variant20814, - Variant20815, - Variant20816, - Variant20817, - Variant20818, - Variant20819, - Variant20820, - Variant20821, - Variant20822, - Variant20823, - Variant20824, - Variant20825, - Variant20826, - Variant20827, - Variant20828, - Variant20829, - Variant20830, - Variant20831, - Variant20832, - Variant20833, - Variant20834, - Variant20835, - Variant20836, - Variant20837, - Variant20838, - Variant20839, - Variant20840, - Variant20841, - Variant20842, - Variant20843, - Variant20844, - Variant20845, - Variant20846, - Variant20847, - Variant20848, - Variant20849, - Variant20850, - Variant20851, - Variant20852, - Variant20853, - Variant20854, - Variant20855, - Variant20856, - Variant20857, - Variant20858, - Variant20859, - Variant20860, - Variant20861, - Variant20862, - Variant20863, - Variant20864, - Variant20865, - Variant20866, - Variant20867, - Variant20868, - Variant20869, - Variant20870, - Variant20871, - Variant20872, - Variant20873, - Variant20874, - Variant20875, - Variant20876, - Variant20877, - Variant20878, - Variant20879, - Variant20880, - Variant20881, - Variant20882, - Variant20883, - Variant20884, - Variant20885, - Variant20886, - Variant20887, - Variant20888, - Variant20889, - Variant20890, - Variant20891, - Variant20892, - Variant20893, - Variant20894, - Variant20895, - Variant20896, - Variant20897, - Variant20898, - Variant20899, - Variant20900, - Variant20901, - Variant20902, - Variant20903, - Variant20904, - Variant20905, - Variant20906, - Variant20907, - Variant20908, - Variant20909, - Variant20910, - Variant20911, - Variant20912, - Variant20913, - Variant20914, - Variant20915, - Variant20916, - Variant20917, - Variant20918, - Variant20919, - Variant20920, - Variant20921, - Variant20922, - Variant20923, - Variant20924, - Variant20925, - Variant20926, - Variant20927, - Variant20928, - Variant20929, - Variant20930, - Variant20931, - Variant20932, - Variant20933, - Variant20934, - Variant20935, - Variant20936, - Variant20937, - Variant20938, - Variant20939, - Variant20940, - Variant20941, - Variant20942, - Variant20943, - Variant20944, - Variant20945, - Variant20946, - Variant20947, - Variant20948, - Variant20949, - Variant20950, - Variant20951, - Variant20952, - Variant20953, - Variant20954, - Variant20955, - Variant20956, - Variant20957, - Variant20958, - Variant20959, - Variant20960, - Variant20961, - Variant20962, - Variant20963, - Variant20964, - Variant20965, - Variant20966, - Variant20967, - Variant20968, - Variant20969, - Variant20970, - Variant20971, - Variant20972, - Variant20973, - Variant20974, - Variant20975, - Variant20976, - Variant20977, - Variant20978, - Variant20979, - Variant20980, - Variant20981, - Variant20982, - Variant20983, - Variant20984, - Variant20985, - Variant20986, - Variant20987, - Variant20988, - Variant20989, - Variant20990, - Variant20991, - Variant20992, - Variant20993, - Variant20994, - Variant20995, - Variant20996, - Variant20997, - Variant20998, - Variant20999, - Variant21000, - Variant21001, - Variant21002, - Variant21003, - Variant21004, - Variant21005, - Variant21006, - Variant21007, - Variant21008, - Variant21009, - Variant21010, - Variant21011, - Variant21012, - Variant21013, - Variant21014, - Variant21015, - Variant21016, - Variant21017, - Variant21018, - Variant21019, - Variant21020, - Variant21021, - Variant21022, - Variant21023, - Variant21024, - Variant21025, - Variant21026, - Variant21027, - Variant21028, - Variant21029, - Variant21030, - Variant21031, - Variant21032, - Variant21033, - Variant21034, - Variant21035, - Variant21036, - Variant21037, - Variant21038, - Variant21039, - Variant21040, - Variant21041, - Variant21042, - Variant21043, - Variant21044, - Variant21045, - Variant21046, - Variant21047, - Variant21048, - Variant21049, - Variant21050, - Variant21051, - Variant21052, - Variant21053, - Variant21054, - Variant21055, - Variant21056, - Variant21057, - Variant21058, - Variant21059, - Variant21060, - Variant21061, - Variant21062, - Variant21063, - Variant21064, - Variant21065, - Variant21066, - Variant21067, - Variant21068, - Variant21069, - Variant21070, - Variant21071, - Variant21072, - Variant21073, - Variant21074, - Variant21075, - Variant21076, - Variant21077, - Variant21078, - Variant21079, - Variant21080, - Variant21081, - Variant21082, - Variant21083, - Variant21084, - Variant21085, - Variant21086, - Variant21087, - Variant21088, - Variant21089, - Variant21090, - Variant21091, - Variant21092, - Variant21093, - Variant21094, - Variant21095, - Variant21096, - Variant21097, - Variant21098, - Variant21099, - Variant21100, - Variant21101, - Variant21102, - Variant21103, - Variant21104, - Variant21105, - Variant21106, - Variant21107, - Variant21108, - Variant21109, - Variant21110, - Variant21111, - Variant21112, - Variant21113, - Variant21114, - Variant21115, - Variant21116, - Variant21117, - Variant21118, - Variant21119, - Variant21120, - Variant21121, - Variant21122, - Variant21123, - Variant21124, - Variant21125, - Variant21126, - Variant21127, - Variant21128, - Variant21129, - Variant21130, - Variant21131, - Variant21132, - Variant21133, - Variant21134, - Variant21135, - Variant21136, - Variant21137, - Variant21138, - Variant21139, - Variant21140, - Variant21141, - Variant21142, - Variant21143, - Variant21144, - Variant21145, - Variant21146, - Variant21147, - Variant21148, - Variant21149, - Variant21150, - Variant21151, - Variant21152, - Variant21153, - Variant21154, - Variant21155, - Variant21156, - Variant21157, - Variant21158, - Variant21159, - Variant21160, - Variant21161, - Variant21162, - Variant21163, - Variant21164, - Variant21165, - Variant21166, - Variant21167, - Variant21168, - Variant21169, - Variant21170, - Variant21171, - Variant21172, - Variant21173, - Variant21174, - Variant21175, - Variant21176, - Variant21177, - Variant21178, - Variant21179, - Variant21180, - Variant21181, - Variant21182, - Variant21183, - Variant21184, - Variant21185, - Variant21186, - Variant21187, - Variant21188, - Variant21189, - Variant21190, - Variant21191, - Variant21192, - Variant21193, - Variant21194, - Variant21195, - Variant21196, - Variant21197, - Variant21198, - Variant21199, - Variant21200, - Variant21201, - Variant21202, - Variant21203, - Variant21204, - Variant21205, - Variant21206, - Variant21207, - Variant21208, - Variant21209, - Variant21210, - Variant21211, - Variant21212, - Variant21213, - Variant21214, - Variant21215, - Variant21216, - Variant21217, - Variant21218, - Variant21219, - Variant21220, - Variant21221, - Variant21222, - Variant21223, - Variant21224, - Variant21225, - Variant21226, - Variant21227, - Variant21228, - Variant21229, - Variant21230, - Variant21231, - Variant21232, - Variant21233, - Variant21234, - Variant21235, - Variant21236, - Variant21237, - Variant21238, - Variant21239, - Variant21240, - Variant21241, - Variant21242, - Variant21243, - Variant21244, - Variant21245, - Variant21246, - Variant21247, - Variant21248, - Variant21249, - Variant21250, - Variant21251, - Variant21252, - Variant21253, - Variant21254, - Variant21255, - Variant21256, - Variant21257, - Variant21258, - Variant21259, - Variant21260, - Variant21261, - Variant21262, - Variant21263, - Variant21264, - Variant21265, - Variant21266, - Variant21267, - Variant21268, - Variant21269, - Variant21270, - Variant21271, - Variant21272, - Variant21273, - Variant21274, - Variant21275, - Variant21276, - Variant21277, - Variant21278, - Variant21279, - Variant21280, - Variant21281, - Variant21282, - Variant21283, - Variant21284, - Variant21285, - Variant21286, - Variant21287, - Variant21288, - Variant21289, - Variant21290, - Variant21291, - Variant21292, - Variant21293, - Variant21294, - Variant21295, - Variant21296, - Variant21297, - Variant21298, - Variant21299, - Variant21300, - Variant21301, - Variant21302, - Variant21303, - Variant21304, - Variant21305, - Variant21306, - Variant21307, - Variant21308, - Variant21309, - Variant21310, - Variant21311, - Variant21312, - Variant21313, - Variant21314, - Variant21315, - Variant21316, - Variant21317, - Variant21318, - Variant21319, - Variant21320, - Variant21321, - Variant21322, - Variant21323, - Variant21324, - Variant21325, - Variant21326, - Variant21327, - Variant21328, - Variant21329, - Variant21330, - Variant21331, - Variant21332, - Variant21333, - Variant21334, - Variant21335, - Variant21336, - Variant21337, - Variant21338, - Variant21339, - Variant21340, - Variant21341, - Variant21342, - Variant21343, - Variant21344, - Variant21345, - Variant21346, - Variant21347, - Variant21348, - Variant21349, - Variant21350, - Variant21351, - Variant21352, - Variant21353, - Variant21354, - Variant21355, - Variant21356, - Variant21357, - Variant21358, - Variant21359, - Variant21360, - Variant21361, - Variant21362, - Variant21363, - Variant21364, - Variant21365, - Variant21366, - Variant21367, - Variant21368, - Variant21369, - Variant21370, - Variant21371, - Variant21372, - Variant21373, - Variant21374, - Variant21375, - Variant21376, - Variant21377, - Variant21378, - Variant21379, - Variant21380, - Variant21381, - Variant21382, - Variant21383, - Variant21384, - Variant21385, - Variant21386, - Variant21387, - Variant21388, - Variant21389, - Variant21390, - Variant21391, - Variant21392, - Variant21393, - Variant21394, - Variant21395, - Variant21396, - Variant21397, - Variant21398, - Variant21399, - Variant21400, - Variant21401, - Variant21402, - Variant21403, - Variant21404, - Variant21405, - Variant21406, - Variant21407, - Variant21408, - Variant21409, - Variant21410, - Variant21411, - Variant21412, - Variant21413, - Variant21414, - Variant21415, - Variant21416, - Variant21417, - Variant21418, - Variant21419, - Variant21420, - Variant21421, - Variant21422, - Variant21423, - Variant21424, - Variant21425, - Variant21426, - Variant21427, - Variant21428, - Variant21429, - Variant21430, - Variant21431, - Variant21432, - Variant21433, - Variant21434, - Variant21435, - Variant21436, - Variant21437, - Variant21438, - Variant21439, - Variant21440, - Variant21441, - Variant21442, - Variant21443, - Variant21444, - Variant21445, - Variant21446, - Variant21447, - Variant21448, - Variant21449, - Variant21450, - Variant21451, - Variant21452, - Variant21453, - Variant21454, - Variant21455, - Variant21456, - Variant21457, - Variant21458, - Variant21459, - Variant21460, - Variant21461, - Variant21462, - Variant21463, - Variant21464, - Variant21465, - Variant21466, - Variant21467, - Variant21468, - Variant21469, - Variant21470, - Variant21471, - Variant21472, - Variant21473, - Variant21474, - Variant21475, - Variant21476, - Variant21477, - Variant21478, - Variant21479, - Variant21480, - Variant21481, - Variant21482, - Variant21483, - Variant21484, - Variant21485, - Variant21486, - Variant21487, - Variant21488, - Variant21489, - Variant21490, - Variant21491, - Variant21492, - Variant21493, - Variant21494, - Variant21495, - Variant21496, - Variant21497, - Variant21498, - Variant21499, - Variant21500, - Variant21501, - Variant21502, - Variant21503, - Variant21504, - Variant21505, - Variant21506, - Variant21507, - Variant21508, - Variant21509, - Variant21510, - Variant21511, - Variant21512, - Variant21513, - Variant21514, - Variant21515, - Variant21516, - Variant21517, - Variant21518, - Variant21519, - Variant21520, - Variant21521, - Variant21522, - Variant21523, - Variant21524, - Variant21525, - Variant21526, - Variant21527, - Variant21528, - Variant21529, - Variant21530, - Variant21531, - Variant21532, - Variant21533, - Variant21534, - Variant21535, - Variant21536, - Variant21537, - Variant21538, - Variant21539, - Variant21540, - Variant21541, - Variant21542, - Variant21543, - Variant21544, - Variant21545, - Variant21546, - Variant21547, - Variant21548, - Variant21549, - Variant21550, - Variant21551, - Variant21552, - Variant21553, - Variant21554, - Variant21555, - Variant21556, - Variant21557, - Variant21558, - Variant21559, - Variant21560, - Variant21561, - Variant21562, - Variant21563, - Variant21564, - Variant21565, - Variant21566, - Variant21567, - Variant21568, - Variant21569, - Variant21570, - Variant21571, - Variant21572, - Variant21573, - Variant21574, - Variant21575, - Variant21576, - Variant21577, - Variant21578, - Variant21579, - Variant21580, - Variant21581, - Variant21582, - Variant21583, - Variant21584, - Variant21585, - Variant21586, - Variant21587, - Variant21588, - Variant21589, - Variant21590, - Variant21591, - Variant21592, - Variant21593, - Variant21594, - Variant21595, - Variant21596, - Variant21597, - Variant21598, - Variant21599, - Variant21600, - Variant21601, - Variant21602, - Variant21603, - Variant21604, - Variant21605, - Variant21606, - Variant21607, - Variant21608, - Variant21609, - Variant21610, - Variant21611, - Variant21612, - Variant21613, - Variant21614, - Variant21615, - Variant21616, - Variant21617, - Variant21618, - Variant21619, - Variant21620, - Variant21621, - Variant21622, - Variant21623, - Variant21624, - Variant21625, - Variant21626, - Variant21627, - Variant21628, - Variant21629, - Variant21630, - Variant21631, - Variant21632, - Variant21633, - Variant21634, - Variant21635, - Variant21636, - Variant21637, - Variant21638, - Variant21639, - Variant21640, - Variant21641, - Variant21642, - Variant21643, - Variant21644, - Variant21645, - Variant21646, - Variant21647, - Variant21648, - Variant21649, - Variant21650, - Variant21651, - Variant21652, - Variant21653, - Variant21654, - Variant21655, - Variant21656, - Variant21657, - Variant21658, - Variant21659, - Variant21660, - Variant21661, - Variant21662, - Variant21663, - Variant21664, - Variant21665, - Variant21666, - Variant21667, - Variant21668, - Variant21669, - Variant21670, - Variant21671, - Variant21672, - Variant21673, - Variant21674, - Variant21675, - Variant21676, - Variant21677, - Variant21678, - Variant21679, - Variant21680, - Variant21681, - Variant21682, - Variant21683, - Variant21684, - Variant21685, - Variant21686, - Variant21687, - Variant21688, - Variant21689, - Variant21690, - Variant21691, - Variant21692, - Variant21693, - Variant21694, - Variant21695, - Variant21696, - Variant21697, - Variant21698, - Variant21699, - Variant21700, - Variant21701, - Variant21702, - Variant21703, - Variant21704, - Variant21705, - Variant21706, - Variant21707, - Variant21708, - Variant21709, - Variant21710, - Variant21711, - Variant21712, - Variant21713, - Variant21714, - Variant21715, - Variant21716, - Variant21717, - Variant21718, - Variant21719, - Variant21720, - Variant21721, - Variant21722, - Variant21723, - Variant21724, - Variant21725, - Variant21726, - Variant21727, - Variant21728, - Variant21729, - Variant21730, - Variant21731, - Variant21732, - Variant21733, - Variant21734, - Variant21735, - Variant21736, - Variant21737, - Variant21738, - Variant21739, - Variant21740, - Variant21741, - Variant21742, - Variant21743, - Variant21744, - Variant21745, - Variant21746, - Variant21747, - Variant21748, - Variant21749, - Variant21750, - Variant21751, - Variant21752, - Variant21753, - Variant21754, - Variant21755, - Variant21756, - Variant21757, - Variant21758, - Variant21759, - Variant21760, - Variant21761, - Variant21762, - Variant21763, - Variant21764, - Variant21765, - Variant21766, - Variant21767, - Variant21768, - Variant21769, - Variant21770, - Variant21771, - Variant21772, - Variant21773, - Variant21774, - Variant21775, - Variant21776, - Variant21777, - Variant21778, - Variant21779, - Variant21780, - Variant21781, - Variant21782, - Variant21783, - Variant21784, - Variant21785, - Variant21786, - Variant21787, - Variant21788, - Variant21789, - Variant21790, - Variant21791, - Variant21792, - Variant21793, - Variant21794, - Variant21795, - Variant21796, - Variant21797, - Variant21798, - Variant21799, - Variant21800, - Variant21801, - Variant21802, - Variant21803, - Variant21804, - Variant21805, - Variant21806, - Variant21807, - Variant21808, - Variant21809, - Variant21810, - Variant21811, - Variant21812, - Variant21813, - Variant21814, - Variant21815, - Variant21816, - Variant21817, - Variant21818, - Variant21819, - Variant21820, - Variant21821, - Variant21822, - Variant21823, - Variant21824, - Variant21825, - Variant21826, - Variant21827, - Variant21828, - Variant21829, - Variant21830, - Variant21831, - Variant21832, - Variant21833, - Variant21834, - Variant21835, - Variant21836, - Variant21837, - Variant21838, - Variant21839, - Variant21840, - Variant21841, - Variant21842, - Variant21843, - Variant21844, - Variant21845, - Variant21846, - Variant21847, - Variant21848, - Variant21849, - Variant21850, - Variant21851, - Variant21852, - Variant21853, - Variant21854, - Variant21855, - Variant21856, - Variant21857, - Variant21858, - Variant21859, - Variant21860, - Variant21861, - Variant21862, - Variant21863, - Variant21864, - Variant21865, - Variant21866, - Variant21867, - Variant21868, - Variant21869, - Variant21870, - Variant21871, - Variant21872, - Variant21873, - Variant21874, - Variant21875, - Variant21876, - Variant21877, - Variant21878, - Variant21879, - Variant21880, - Variant21881, - Variant21882, - Variant21883, - Variant21884, - Variant21885, - Variant21886, - Variant21887, - Variant21888, - Variant21889, - Variant21890, - Variant21891, - Variant21892, - Variant21893, - Variant21894, - Variant21895, - Variant21896, - Variant21897, - Variant21898, - Variant21899, - Variant21900, - Variant21901, - Variant21902, - Variant21903, - Variant21904, - Variant21905, - Variant21906, - Variant21907, - Variant21908, - Variant21909, - Variant21910, - Variant21911, - Variant21912, - Variant21913, - Variant21914, - Variant21915, - Variant21916, - Variant21917, - Variant21918, - Variant21919, - Variant21920, - Variant21921, - Variant21922, - Variant21923, - Variant21924, - Variant21925, - Variant21926, - Variant21927, - Variant21928, - Variant21929, - Variant21930, - Variant21931, - Variant21932, - Variant21933, - Variant21934, - Variant21935, - Variant21936, - Variant21937, - Variant21938, - Variant21939, - Variant21940, - Variant21941, - Variant21942, - Variant21943, - Variant21944, - Variant21945, - Variant21946, - Variant21947, - Variant21948, - Variant21949, - Variant21950, - Variant21951, - Variant21952, - Variant21953, - Variant21954, - Variant21955, - Variant21956, - Variant21957, - Variant21958, - Variant21959, - Variant21960, - Variant21961, - Variant21962, - Variant21963, - Variant21964, - Variant21965, - Variant21966, - Variant21967, - Variant21968, - Variant21969, - Variant21970, - Variant21971, - Variant21972, - Variant21973, - Variant21974, - Variant21975, - Variant21976, - Variant21977, - Variant21978, - Variant21979, - Variant21980, - Variant21981, - Variant21982, - Variant21983, - Variant21984, - Variant21985, - Variant21986, - Variant21987, - Variant21988, - Variant21989, - Variant21990, - Variant21991, - Variant21992, - Variant21993, - Variant21994, - Variant21995, - Variant21996, - Variant21997, - Variant21998, - Variant21999, - Variant22000, - Variant22001, - Variant22002, - Variant22003, - Variant22004, - Variant22005, - Variant22006, - Variant22007, - Variant22008, - Variant22009, - Variant22010, - Variant22011, - Variant22012, - Variant22013, - Variant22014, - Variant22015, - Variant22016, - Variant22017, - Variant22018, - Variant22019, - Variant22020, - Variant22021, - Variant22022, - Variant22023, - Variant22024, - Variant22025, - Variant22026, - Variant22027, - Variant22028, - Variant22029, - Variant22030, - Variant22031, - Variant22032, - Variant22033, - Variant22034, - Variant22035, - Variant22036, - Variant22037, - Variant22038, - Variant22039, - Variant22040, - Variant22041, - Variant22042, - Variant22043, - Variant22044, - Variant22045, - Variant22046, - Variant22047, - Variant22048, - Variant22049, - Variant22050, - Variant22051, - Variant22052, - Variant22053, - Variant22054, - Variant22055, - Variant22056, - Variant22057, - Variant22058, - Variant22059, - Variant22060, - Variant22061, - Variant22062, - Variant22063, - Variant22064, - Variant22065, - Variant22066, - Variant22067, - Variant22068, - Variant22069, - Variant22070, - Variant22071, - Variant22072, - Variant22073, - Variant22074, - Variant22075, - Variant22076, - Variant22077, - Variant22078, - Variant22079, - Variant22080, - Variant22081, - Variant22082, - Variant22083, - Variant22084, - Variant22085, - Variant22086, - Variant22087, - Variant22088, - Variant22089, - Variant22090, - Variant22091, - Variant22092, - Variant22093, - Variant22094, - Variant22095, - Variant22096, - Variant22097, - Variant22098, - Variant22099, - Variant22100, - Variant22101, - Variant22102, - Variant22103, - Variant22104, - Variant22105, - Variant22106, - Variant22107, - Variant22108, - Variant22109, - Variant22110, - Variant22111, - Variant22112, - Variant22113, - Variant22114, - Variant22115, - Variant22116, - Variant22117, - Variant22118, - Variant22119, - Variant22120, - Variant22121, - Variant22122, - Variant22123, - Variant22124, - Variant22125, - Variant22126, - Variant22127, - Variant22128, - Variant22129, - Variant22130, - Variant22131, - Variant22132, - Variant22133, - Variant22134, - Variant22135, - Variant22136, - Variant22137, - Variant22138, - Variant22139, - Variant22140, - Variant22141, - Variant22142, - Variant22143, - Variant22144, - Variant22145, - Variant22146, - Variant22147, - Variant22148, - Variant22149, - Variant22150, - Variant22151, - Variant22152, - Variant22153, - Variant22154, - Variant22155, - Variant22156, - Variant22157, - Variant22158, - Variant22159, - Variant22160, - Variant22161, - Variant22162, - Variant22163, - Variant22164, - Variant22165, - Variant22166, - Variant22167, - Variant22168, - Variant22169, - Variant22170, - Variant22171, - Variant22172, - Variant22173, - Variant22174, - Variant22175, - Variant22176, - Variant22177, - Variant22178, - Variant22179, - Variant22180, - Variant22181, - Variant22182, - Variant22183, - Variant22184, - Variant22185, - Variant22186, - Variant22187, - Variant22188, - Variant22189, - Variant22190, - Variant22191, - Variant22192, - Variant22193, - Variant22194, - Variant22195, - Variant22196, - Variant22197, - Variant22198, - Variant22199, - Variant22200, - Variant22201, - Variant22202, - Variant22203, - Variant22204, - Variant22205, - Variant22206, - Variant22207, - Variant22208, - Variant22209, - Variant22210, - Variant22211, - Variant22212, - Variant22213, - Variant22214, - Variant22215, - Variant22216, - Variant22217, - Variant22218, - Variant22219, - Variant22220, - Variant22221, - Variant22222, - Variant22223, - Variant22224, - Variant22225, - Variant22226, - Variant22227, - Variant22228, - Variant22229, - Variant22230, - Variant22231, - Variant22232, - Variant22233, - Variant22234, - Variant22235, - Variant22236, - Variant22237, - Variant22238, - Variant22239, - Variant22240, - Variant22241, - Variant22242, - Variant22243, - Variant22244, - Variant22245, - Variant22246, - Variant22247, - Variant22248, - Variant22249, - Variant22250, - Variant22251, - Variant22252, - Variant22253, - Variant22254, - Variant22255, - Variant22256, - Variant22257, - Variant22258, - Variant22259, - Variant22260, - Variant22261, - Variant22262, - Variant22263, - Variant22264, - Variant22265, - Variant22266, - Variant22267, - Variant22268, - Variant22269, - Variant22270, - Variant22271, - Variant22272, - Variant22273, - Variant22274, - Variant22275, - Variant22276, - Variant22277, - Variant22278, - Variant22279, - Variant22280, - Variant22281, - Variant22282, - Variant22283, - Variant22284, - Variant22285, - Variant22286, - Variant22287, - Variant22288, - Variant22289, - Variant22290, - Variant22291, - Variant22292, - Variant22293, - Variant22294, - Variant22295, - Variant22296, - Variant22297, - Variant22298, - Variant22299, - Variant22300, - Variant22301, - Variant22302, - Variant22303, - Variant22304, - Variant22305, - Variant22306, - Variant22307, - Variant22308, - Variant22309, - Variant22310, - Variant22311, - Variant22312, - Variant22313, - Variant22314, - Variant22315, - Variant22316, - Variant22317, - Variant22318, - Variant22319, - Variant22320, - Variant22321, - Variant22322, - Variant22323, - Variant22324, - Variant22325, - Variant22326, - Variant22327, - Variant22328, - Variant22329, - Variant22330, - Variant22331, - Variant22332, - Variant22333, - Variant22334, - Variant22335, - Variant22336, - Variant22337, - Variant22338, - Variant22339, - Variant22340, - Variant22341, - Variant22342, - Variant22343, - Variant22344, - Variant22345, - Variant22346, - Variant22347, - Variant22348, - Variant22349, - Variant22350, - Variant22351, - Variant22352, - Variant22353, - Variant22354, - Variant22355, - Variant22356, - Variant22357, - Variant22358, - Variant22359, - Variant22360, - Variant22361, - Variant22362, - Variant22363, - Variant22364, - Variant22365, - Variant22366, - Variant22367, - Variant22368, - Variant22369, - Variant22370, - Variant22371, - Variant22372, - Variant22373, - Variant22374, - Variant22375, - Variant22376, - Variant22377, - Variant22378, - Variant22379, - Variant22380, - Variant22381, - Variant22382, - Variant22383, - Variant22384, - Variant22385, - Variant22386, - Variant22387, - Variant22388, - Variant22389, - Variant22390, - Variant22391, - Variant22392, - Variant22393, - Variant22394, - Variant22395, - Variant22396, - Variant22397, - Variant22398, - Variant22399, - Variant22400, - Variant22401, - Variant22402, - Variant22403, - Variant22404, - Variant22405, - Variant22406, - Variant22407, - Variant22408, - Variant22409, - Variant22410, - Variant22411, - Variant22412, - Variant22413, - Variant22414, - Variant22415, - Variant22416, - Variant22417, - Variant22418, - Variant22419, - Variant22420, - Variant22421, - Variant22422, - Variant22423, - Variant22424, - Variant22425, - Variant22426, - Variant22427, - Variant22428, - Variant22429, - Variant22430, - Variant22431, - Variant22432, - Variant22433, - Variant22434, - Variant22435, - Variant22436, - Variant22437, - Variant22438, - Variant22439, - Variant22440, - Variant22441, - Variant22442, - Variant22443, - Variant22444, - Variant22445, - Variant22446, - Variant22447, - Variant22448, - Variant22449, - Variant22450, - Variant22451, - Variant22452, - Variant22453, - Variant22454, - Variant22455, - Variant22456, - Variant22457, - Variant22458, - Variant22459, - Variant22460, - Variant22461, - Variant22462, - Variant22463, - Variant22464, - Variant22465, - Variant22466, - Variant22467, - Variant22468, - Variant22469, - Variant22470, - Variant22471, - Variant22472, - Variant22473, - Variant22474, - Variant22475, - Variant22476, - Variant22477, - Variant22478, - Variant22479, - Variant22480, - Variant22481, - Variant22482, - Variant22483, - Variant22484, - Variant22485, - Variant22486, - Variant22487, - Variant22488, - Variant22489, - Variant22490, - Variant22491, - Variant22492, - Variant22493, - Variant22494, - Variant22495, - Variant22496, - Variant22497, - Variant22498, - Variant22499, - Variant22500, - Variant22501, - Variant22502, - Variant22503, - Variant22504, - Variant22505, - Variant22506, - Variant22507, - Variant22508, - Variant22509, - Variant22510, - Variant22511, - Variant22512, - Variant22513, - Variant22514, - Variant22515, - Variant22516, - Variant22517, - Variant22518, - Variant22519, - Variant22520, - Variant22521, - Variant22522, - Variant22523, - Variant22524, - Variant22525, - Variant22526, - Variant22527, - Variant22528, - Variant22529, - Variant22530, - Variant22531, - Variant22532, - Variant22533, - Variant22534, - Variant22535, - Variant22536, - Variant22537, - Variant22538, - Variant22539, - Variant22540, - Variant22541, - Variant22542, - Variant22543, - Variant22544, - Variant22545, - Variant22546, - Variant22547, - Variant22548, - Variant22549, - Variant22550, - Variant22551, - Variant22552, - Variant22553, - Variant22554, - Variant22555, - Variant22556, - Variant22557, - Variant22558, - Variant22559, - Variant22560, - Variant22561, - Variant22562, - Variant22563, - Variant22564, - Variant22565, - Variant22566, - Variant22567, - Variant22568, - Variant22569, - Variant22570, - Variant22571, - Variant22572, - Variant22573, - Variant22574, - Variant22575, - Variant22576, - Variant22577, - Variant22578, - Variant22579, - Variant22580, - Variant22581, - Variant22582, - Variant22583, - Variant22584, - Variant22585, - Variant22586, - Variant22587, - Variant22588, - Variant22589, - Variant22590, - Variant22591, - Variant22592, - Variant22593, - Variant22594, - Variant22595, - Variant22596, - Variant22597, - Variant22598, - Variant22599, - Variant22600, - Variant22601, - Variant22602, - Variant22603, - Variant22604, - Variant22605, - Variant22606, - Variant22607, - Variant22608, - Variant22609, - Variant22610, - Variant22611, - Variant22612, - Variant22613, - Variant22614, - Variant22615, - Variant22616, - Variant22617, - Variant22618, - Variant22619, - Variant22620, - Variant22621, - Variant22622, - Variant22623, - Variant22624, - Variant22625, - Variant22626, - Variant22627, - Variant22628, - Variant22629, - Variant22630, - Variant22631, - Variant22632, - Variant22633, - Variant22634, - Variant22635, - Variant22636, - Variant22637, - Variant22638, - Variant22639, - Variant22640, - Variant22641, - Variant22642, - Variant22643, - Variant22644, - Variant22645, - Variant22646, - Variant22647, - Variant22648, - Variant22649, - Variant22650, - Variant22651, - Variant22652, - Variant22653, - Variant22654, - Variant22655, - Variant22656, - Variant22657, - Variant22658, - Variant22659, - Variant22660, - Variant22661, - Variant22662, - Variant22663, - Variant22664, - Variant22665, - Variant22666, - Variant22667, - Variant22668, - Variant22669, - Variant22670, - Variant22671, - Variant22672, - Variant22673, - Variant22674, - Variant22675, - Variant22676, - Variant22677, - Variant22678, - Variant22679, - Variant22680, - Variant22681, - Variant22682, - Variant22683, - Variant22684, - Variant22685, - Variant22686, - Variant22687, - Variant22688, - Variant22689, - Variant22690, - Variant22691, - Variant22692, - Variant22693, - Variant22694, - Variant22695, - Variant22696, - Variant22697, - Variant22698, - Variant22699, - Variant22700, - Variant22701, - Variant22702, - Variant22703, - Variant22704, - Variant22705, - Variant22706, - Variant22707, - Variant22708, - Variant22709, - Variant22710, - Variant22711, - Variant22712, - Variant22713, - Variant22714, - Variant22715, - Variant22716, - Variant22717, - Variant22718, - Variant22719, - Variant22720, - Variant22721, - Variant22722, - Variant22723, - Variant22724, - Variant22725, - Variant22726, - Variant22727, - Variant22728, - Variant22729, - Variant22730, - Variant22731, - Variant22732, - Variant22733, - Variant22734, - Variant22735, - Variant22736, - Variant22737, - Variant22738, - Variant22739, - Variant22740, - Variant22741, - Variant22742, - Variant22743, - Variant22744, - Variant22745, - Variant22746, - Variant22747, - Variant22748, - Variant22749, - Variant22750, - Variant22751, - Variant22752, - Variant22753, - Variant22754, - Variant22755, - Variant22756, - Variant22757, - Variant22758, - Variant22759, - Variant22760, - Variant22761, - Variant22762, - Variant22763, - Variant22764, - Variant22765, - Variant22766, - Variant22767, - Variant22768, - Variant22769, - Variant22770, - Variant22771, - Variant22772, - Variant22773, - Variant22774, - Variant22775, - Variant22776, - Variant22777, - Variant22778, - Variant22779, - Variant22780, - Variant22781, - Variant22782, - Variant22783, - Variant22784, - Variant22785, - Variant22786, - Variant22787, - Variant22788, - Variant22789, - Variant22790, - Variant22791, - Variant22792, - Variant22793, - Variant22794, - Variant22795, - Variant22796, - Variant22797, - Variant22798, - Variant22799, - Variant22800, - Variant22801, - Variant22802, - Variant22803, - Variant22804, - Variant22805, - Variant22806, - Variant22807, - Variant22808, - Variant22809, - Variant22810, - Variant22811, - Variant22812, - Variant22813, - Variant22814, - Variant22815, - Variant22816, - Variant22817, - Variant22818, - Variant22819, - Variant22820, - Variant22821, - Variant22822, - Variant22823, - Variant22824, - Variant22825, - Variant22826, - Variant22827, - Variant22828, - Variant22829, - Variant22830, - Variant22831, - Variant22832, - Variant22833, - Variant22834, - Variant22835, - Variant22836, - Variant22837, - Variant22838, - Variant22839, - Variant22840, - Variant22841, - Variant22842, - Variant22843, - Variant22844, - Variant22845, - Variant22846, - Variant22847, - Variant22848, - Variant22849, - Variant22850, - Variant22851, - Variant22852, - Variant22853, - Variant22854, - Variant22855, - Variant22856, - Variant22857, - Variant22858, - Variant22859, - Variant22860, - Variant22861, - Variant22862, - Variant22863, - Variant22864, - Variant22865, - Variant22866, - Variant22867, - Variant22868, - Variant22869, - Variant22870, - Variant22871, - Variant22872, - Variant22873, - Variant22874, - Variant22875, - Variant22876, - Variant22877, - Variant22878, - Variant22879, - Variant22880, - Variant22881, - Variant22882, - Variant22883, - Variant22884, - Variant22885, - Variant22886, - Variant22887, - Variant22888, - Variant22889, - Variant22890, - Variant22891, - Variant22892, - Variant22893, - Variant22894, - Variant22895, - Variant22896, - Variant22897, - Variant22898, - Variant22899, - Variant22900, - Variant22901, - Variant22902, - Variant22903, - Variant22904, - Variant22905, - Variant22906, - Variant22907, - Variant22908, - Variant22909, - Variant22910, - Variant22911, - Variant22912, - Variant22913, - Variant22914, - Variant22915, - Variant22916, - Variant22917, - Variant22918, - Variant22919, - Variant22920, - Variant22921, - Variant22922, - Variant22923, - Variant22924, - Variant22925, - Variant22926, - Variant22927, - Variant22928, - Variant22929, - Variant22930, - Variant22931, - Variant22932, - Variant22933, - Variant22934, - Variant22935, - Variant22936, - Variant22937, - Variant22938, - Variant22939, - Variant22940, - Variant22941, - Variant22942, - Variant22943, - Variant22944, - Variant22945, - Variant22946, - Variant22947, - Variant22948, - Variant22949, - Variant22950, - Variant22951, - Variant22952, - Variant22953, - Variant22954, - Variant22955, - Variant22956, - Variant22957, - Variant22958, - Variant22959, - Variant22960, - Variant22961, - Variant22962, - Variant22963, - Variant22964, - Variant22965, - Variant22966, - Variant22967, - Variant22968, - Variant22969, - Variant22970, - Variant22971, - Variant22972, - Variant22973, - Variant22974, - Variant22975, - Variant22976, - Variant22977, - Variant22978, - Variant22979, - Variant22980, - Variant22981, - Variant22982, - Variant22983, - Variant22984, - Variant22985, - Variant22986, - Variant22987, - Variant22988, - Variant22989, - Variant22990, - Variant22991, - Variant22992, - Variant22993, - Variant22994, - Variant22995, - Variant22996, - Variant22997, - Variant22998, - Variant22999, - Variant23000, - Variant23001, - Variant23002, - Variant23003, - Variant23004, - Variant23005, - Variant23006, - Variant23007, - Variant23008, - Variant23009, - Variant23010, - Variant23011, - Variant23012, - Variant23013, - Variant23014, - Variant23015, - Variant23016, - Variant23017, - Variant23018, - Variant23019, - Variant23020, - Variant23021, - Variant23022, - Variant23023, - Variant23024, - Variant23025, - Variant23026, - Variant23027, - Variant23028, - Variant23029, - Variant23030, - Variant23031, - Variant23032, - Variant23033, - Variant23034, - Variant23035, - Variant23036, - Variant23037, - Variant23038, - Variant23039, - Variant23040, - Variant23041, - Variant23042, - Variant23043, - Variant23044, - Variant23045, - Variant23046, - Variant23047, - Variant23048, - Variant23049, - Variant23050, - Variant23051, - Variant23052, - Variant23053, - Variant23054, - Variant23055, - Variant23056, - Variant23057, - Variant23058, - Variant23059, - Variant23060, - Variant23061, - Variant23062, - Variant23063, - Variant23064, - Variant23065, - Variant23066, - Variant23067, - Variant23068, - Variant23069, - Variant23070, - Variant23071, - Variant23072, - Variant23073, - Variant23074, - Variant23075, - Variant23076, - Variant23077, - Variant23078, - Variant23079, - Variant23080, - Variant23081, - Variant23082, - Variant23083, - Variant23084, - Variant23085, - Variant23086, - Variant23087, - Variant23088, - Variant23089, - Variant23090, - Variant23091, - Variant23092, - Variant23093, - Variant23094, - Variant23095, - Variant23096, - Variant23097, - Variant23098, - Variant23099, - Variant23100, - Variant23101, - Variant23102, - Variant23103, - Variant23104, - Variant23105, - Variant23106, - Variant23107, - Variant23108, - Variant23109, - Variant23110, - Variant23111, - Variant23112, - Variant23113, - Variant23114, - Variant23115, - Variant23116, - Variant23117, - Variant23118, - Variant23119, - Variant23120, - Variant23121, - Variant23122, - Variant23123, - Variant23124, - Variant23125, - Variant23126, - Variant23127, - Variant23128, - Variant23129, - Variant23130, - Variant23131, - Variant23132, - Variant23133, - Variant23134, - Variant23135, - Variant23136, - Variant23137, - Variant23138, - Variant23139, - Variant23140, - Variant23141, - Variant23142, - Variant23143, - Variant23144, - Variant23145, - Variant23146, - Variant23147, - Variant23148, - Variant23149, - Variant23150, - Variant23151, - Variant23152, - Variant23153, - Variant23154, - Variant23155, - Variant23156, - Variant23157, - Variant23158, - Variant23159, - Variant23160, - Variant23161, - Variant23162, - Variant23163, - Variant23164, - Variant23165, - Variant23166, - Variant23167, - Variant23168, - Variant23169, - Variant23170, - Variant23171, - Variant23172, - Variant23173, - Variant23174, - Variant23175, - Variant23176, - Variant23177, - Variant23178, - Variant23179, - Variant23180, - Variant23181, - Variant23182, - Variant23183, - Variant23184, - Variant23185, - Variant23186, - Variant23187, - Variant23188, - Variant23189, - Variant23190, - Variant23191, - Variant23192, - Variant23193, - Variant23194, - Variant23195, - Variant23196, - Variant23197, - Variant23198, - Variant23199, - Variant23200, - Variant23201, - Variant23202, - Variant23203, - Variant23204, - Variant23205, - Variant23206, - Variant23207, - Variant23208, - Variant23209, - Variant23210, - Variant23211, - Variant23212, - Variant23213, - Variant23214, - Variant23215, - Variant23216, - Variant23217, - Variant23218, - Variant23219, - Variant23220, - Variant23221, - Variant23222, - Variant23223, - Variant23224, - Variant23225, - Variant23226, - Variant23227, - Variant23228, - Variant23229, - Variant23230, - Variant23231, - Variant23232, - Variant23233, - Variant23234, - Variant23235, - Variant23236, - Variant23237, - Variant23238, - Variant23239, - Variant23240, - Variant23241, - Variant23242, - Variant23243, - Variant23244, - Variant23245, - Variant23246, - Variant23247, - Variant23248, - Variant23249, - Variant23250, - Variant23251, - Variant23252, - Variant23253, - Variant23254, - Variant23255, - Variant23256, - Variant23257, - Variant23258, - Variant23259, - Variant23260, - Variant23261, - Variant23262, - Variant23263, - Variant23264, - Variant23265, - Variant23266, - Variant23267, - Variant23268, - Variant23269, - Variant23270, - Variant23271, - Variant23272, - Variant23273, - Variant23274, - Variant23275, - Variant23276, - Variant23277, - Variant23278, - Variant23279, - Variant23280, - Variant23281, - Variant23282, - Variant23283, - Variant23284, - Variant23285, - Variant23286, - Variant23287, - Variant23288, - Variant23289, - Variant23290, - Variant23291, - Variant23292, - Variant23293, - Variant23294, - Variant23295, - Variant23296, - Variant23297, - Variant23298, - Variant23299, - Variant23300, - Variant23301, - Variant23302, - Variant23303, - Variant23304, - Variant23305, - Variant23306, - Variant23307, - Variant23308, - Variant23309, - Variant23310, - Variant23311, - Variant23312, - Variant23313, - Variant23314, - Variant23315, - Variant23316, - Variant23317, - Variant23318, - Variant23319, - Variant23320, - Variant23321, - Variant23322, - Variant23323, - Variant23324, - Variant23325, - Variant23326, - Variant23327, - Variant23328, - Variant23329, - Variant23330, - Variant23331, - Variant23332, - Variant23333, - Variant23334, - Variant23335, - Variant23336, - Variant23337, - Variant23338, - Variant23339, - Variant23340, - Variant23341, - Variant23342, - Variant23343, - Variant23344, - Variant23345, - Variant23346, - Variant23347, - Variant23348, - Variant23349, - Variant23350, - Variant23351, - Variant23352, - Variant23353, - Variant23354, - Variant23355, - Variant23356, - Variant23357, - Variant23358, - Variant23359, - Variant23360, - Variant23361, - Variant23362, - Variant23363, - Variant23364, - Variant23365, - Variant23366, - Variant23367, - Variant23368, - Variant23369, - Variant23370, - Variant23371, - Variant23372, - Variant23373, - Variant23374, - Variant23375, - Variant23376, - Variant23377, - Variant23378, - Variant23379, - Variant23380, - Variant23381, - Variant23382, - Variant23383, - Variant23384, - Variant23385, - Variant23386, - Variant23387, - Variant23388, - Variant23389, - Variant23390, - Variant23391, - Variant23392, - Variant23393, - Variant23394, - Variant23395, - Variant23396, - Variant23397, - Variant23398, - Variant23399, - Variant23400, - Variant23401, - Variant23402, - Variant23403, - Variant23404, - Variant23405, - Variant23406, - Variant23407, - Variant23408, - Variant23409, - Variant23410, - Variant23411, - Variant23412, - Variant23413, - Variant23414, - Variant23415, - Variant23416, - Variant23417, - Variant23418, - Variant23419, - Variant23420, - Variant23421, - Variant23422, - Variant23423, - Variant23424, - Variant23425, - Variant23426, - Variant23427, - Variant23428, - Variant23429, - Variant23430, - Variant23431, - Variant23432, - Variant23433, - Variant23434, - Variant23435, - Variant23436, - Variant23437, - Variant23438, - Variant23439, - Variant23440, - Variant23441, - Variant23442, - Variant23443, - Variant23444, - Variant23445, - Variant23446, - Variant23447, - Variant23448, - Variant23449, - Variant23450, - Variant23451, - Variant23452, - Variant23453, - Variant23454, - Variant23455, - Variant23456, - Variant23457, - Variant23458, - Variant23459, - Variant23460, - Variant23461, - Variant23462, - Variant23463, - Variant23464, - Variant23465, - Variant23466, - Variant23467, - Variant23468, - Variant23469, - Variant23470, - Variant23471, - Variant23472, - Variant23473, - Variant23474, - Variant23475, - Variant23476, - Variant23477, - Variant23478, - Variant23479, - Variant23480, - Variant23481, - Variant23482, - Variant23483, - Variant23484, - Variant23485, - Variant23486, - Variant23487, - Variant23488, - Variant23489, - Variant23490, - Variant23491, - Variant23492, - Variant23493, - Variant23494, - Variant23495, - Variant23496, - Variant23497, - Variant23498, - Variant23499, - Variant23500, - Variant23501, - Variant23502, - Variant23503, - Variant23504, - Variant23505, - Variant23506, - Variant23507, - Variant23508, - Variant23509, - Variant23510, - Variant23511, - Variant23512, - Variant23513, - Variant23514, - Variant23515, - Variant23516, - Variant23517, - Variant23518, - Variant23519, - Variant23520, - Variant23521, - Variant23522, - Variant23523, - Variant23524, - Variant23525, - Variant23526, - Variant23527, - Variant23528, - Variant23529, - Variant23530, - Variant23531, - Variant23532, - Variant23533, - Variant23534, - Variant23535, - Variant23536, - Variant23537, - Variant23538, - Variant23539, - Variant23540, - Variant23541, - Variant23542, - Variant23543, - Variant23544, - Variant23545, - Variant23546, - Variant23547, - Variant23548, - Variant23549, - Variant23550, - Variant23551, - Variant23552, - Variant23553, - Variant23554, - Variant23555, - Variant23556, - Variant23557, - Variant23558, - Variant23559, - Variant23560, - Variant23561, - Variant23562, - Variant23563, - Variant23564, - Variant23565, - Variant23566, - Variant23567, - Variant23568, - Variant23569, - Variant23570, - Variant23571, - Variant23572, - Variant23573, - Variant23574, - Variant23575, - Variant23576, - Variant23577, - Variant23578, - Variant23579, - Variant23580, - Variant23581, - Variant23582, - Variant23583, - Variant23584, - Variant23585, - Variant23586, - Variant23587, - Variant23588, - Variant23589, - Variant23590, - Variant23591, - Variant23592, - Variant23593, - Variant23594, - Variant23595, - Variant23596, - Variant23597, - Variant23598, - Variant23599, - Variant23600, - Variant23601, - Variant23602, - Variant23603, - Variant23604, - Variant23605, - Variant23606, - Variant23607, - Variant23608, - Variant23609, - Variant23610, - Variant23611, - Variant23612, - Variant23613, - Variant23614, - Variant23615, - Variant23616, - Variant23617, - Variant23618, - Variant23619, - Variant23620, - Variant23621, - Variant23622, - Variant23623, - Variant23624, - Variant23625, - Variant23626, - Variant23627, - Variant23628, - Variant23629, - Variant23630, - Variant23631, - Variant23632, - Variant23633, - Variant23634, - Variant23635, - Variant23636, - Variant23637, - Variant23638, - Variant23639, - Variant23640, - Variant23641, - Variant23642, - Variant23643, - Variant23644, - Variant23645, - Variant23646, - Variant23647, - Variant23648, - Variant23649, - Variant23650, - Variant23651, - Variant23652, - Variant23653, - Variant23654, - Variant23655, - Variant23656, - Variant23657, - Variant23658, - Variant23659, - Variant23660, - Variant23661, - Variant23662, - Variant23663, - Variant23664, - Variant23665, - Variant23666, - Variant23667, - Variant23668, - Variant23669, - Variant23670, - Variant23671, - Variant23672, - Variant23673, - Variant23674, - Variant23675, - Variant23676, - Variant23677, - Variant23678, - Variant23679, - Variant23680, - Variant23681, - Variant23682, - Variant23683, - Variant23684, - Variant23685, - Variant23686, - Variant23687, - Variant23688, - Variant23689, - Variant23690, - Variant23691, - Variant23692, - Variant23693, - Variant23694, - Variant23695, - Variant23696, - Variant23697, - Variant23698, - Variant23699, - Variant23700, - Variant23701, - Variant23702, - Variant23703, - Variant23704, - Variant23705, - Variant23706, - Variant23707, - Variant23708, - Variant23709, - Variant23710, - Variant23711, - Variant23712, - Variant23713, - Variant23714, - Variant23715, - Variant23716, - Variant23717, - Variant23718, - Variant23719, - Variant23720, - Variant23721, - Variant23722, - Variant23723, - Variant23724, - Variant23725, - Variant23726, - Variant23727, - Variant23728, - Variant23729, - Variant23730, - Variant23731, - Variant23732, - Variant23733, - Variant23734, - Variant23735, - Variant23736, - Variant23737, - Variant23738, - Variant23739, - Variant23740, - Variant23741, - Variant23742, - Variant23743, - Variant23744, - Variant23745, - Variant23746, - Variant23747, - Variant23748, - Variant23749, - Variant23750, - Variant23751, - Variant23752, - Variant23753, - Variant23754, - Variant23755, - Variant23756, - Variant23757, - Variant23758, - Variant23759, - Variant23760, - Variant23761, - Variant23762, - Variant23763, - Variant23764, - Variant23765, - Variant23766, - Variant23767, - Variant23768, - Variant23769, - Variant23770, - Variant23771, - Variant23772, - Variant23773, - Variant23774, - Variant23775, - Variant23776, - Variant23777, - Variant23778, - Variant23779, - Variant23780, - Variant23781, - Variant23782, - Variant23783, - Variant23784, - Variant23785, - Variant23786, - Variant23787, - Variant23788, - Variant23789, - Variant23790, - Variant23791, - Variant23792, - Variant23793, - Variant23794, - Variant23795, - Variant23796, - Variant23797, - Variant23798, - Variant23799, - Variant23800, - Variant23801, - Variant23802, - Variant23803, - Variant23804, - Variant23805, - Variant23806, - Variant23807, - Variant23808, - Variant23809, - Variant23810, - Variant23811, - Variant23812, - Variant23813, - Variant23814, - Variant23815, - Variant23816, - Variant23817, - Variant23818, - Variant23819, - Variant23820, - Variant23821, - Variant23822, - Variant23823, - Variant23824, - Variant23825, - Variant23826, - Variant23827, - Variant23828, - Variant23829, - Variant23830, - Variant23831, - Variant23832, - Variant23833, - Variant23834, - Variant23835, - Variant23836, - Variant23837, - Variant23838, - Variant23839, - Variant23840, - Variant23841, - Variant23842, - Variant23843, - Variant23844, - Variant23845, - Variant23846, - Variant23847, - Variant23848, - Variant23849, - Variant23850, - Variant23851, - Variant23852, - Variant23853, - Variant23854, - Variant23855, - Variant23856, - Variant23857, - Variant23858, - Variant23859, - Variant23860, - Variant23861, - Variant23862, - Variant23863, - Variant23864, - Variant23865, - Variant23866, - Variant23867, - Variant23868, - Variant23869, - Variant23870, - Variant23871, - Variant23872, - Variant23873, - Variant23874, - Variant23875, - Variant23876, - Variant23877, - Variant23878, - Variant23879, - Variant23880, - Variant23881, - Variant23882, - Variant23883, - Variant23884, - Variant23885, - Variant23886, - Variant23887, - Variant23888, - Variant23889, - Variant23890, - Variant23891, - Variant23892, - Variant23893, - Variant23894, - Variant23895, - Variant23896, - Variant23897, - Variant23898, - Variant23899, - Variant23900, - Variant23901, - Variant23902, - Variant23903, - Variant23904, - Variant23905, - Variant23906, - Variant23907, - Variant23908, - Variant23909, - Variant23910, - Variant23911, - Variant23912, - Variant23913, - Variant23914, - Variant23915, - Variant23916, - Variant23917, - Variant23918, - Variant23919, - Variant23920, - Variant23921, - Variant23922, - Variant23923, - Variant23924, - Variant23925, - Variant23926, - Variant23927, - Variant23928, - Variant23929, - Variant23930, - Variant23931, - Variant23932, - Variant23933, - Variant23934, - Variant23935, - Variant23936, - Variant23937, - Variant23938, - Variant23939, - Variant23940, - Variant23941, - Variant23942, - Variant23943, - Variant23944, - Variant23945, - Variant23946, - Variant23947, - Variant23948, - Variant23949, - Variant23950, - Variant23951, - Variant23952, - Variant23953, - Variant23954, - Variant23955, - Variant23956, - Variant23957, - Variant23958, - Variant23959, - Variant23960, - Variant23961, - Variant23962, - Variant23963, - Variant23964, - Variant23965, - Variant23966, - Variant23967, - Variant23968, - Variant23969, - Variant23970, - Variant23971, - Variant23972, - Variant23973, - Variant23974, - Variant23975, - Variant23976, - Variant23977, - Variant23978, - Variant23979, - Variant23980, - Variant23981, - Variant23982, - Variant23983, - Variant23984, - Variant23985, - Variant23986, - Variant23987, - Variant23988, - Variant23989, - Variant23990, - Variant23991, - Variant23992, - Variant23993, - Variant23994, - Variant23995, - Variant23996, - Variant23997, - Variant23998, - Variant23999, - Variant24000, - Variant24001, - Variant24002, - Variant24003, - Variant24004, - Variant24005, - Variant24006, - Variant24007, - Variant24008, - Variant24009, - Variant24010, - Variant24011, - Variant24012, - Variant24013, - Variant24014, - Variant24015, - Variant24016, - Variant24017, - Variant24018, - Variant24019, - Variant24020, - Variant24021, - Variant24022, - Variant24023, - Variant24024, - Variant24025, - Variant24026, - Variant24027, - Variant24028, - Variant24029, - Variant24030, - Variant24031, - Variant24032, - Variant24033, - Variant24034, - Variant24035, - Variant24036, - Variant24037, - Variant24038, - Variant24039, - Variant24040, - Variant24041, - Variant24042, - Variant24043, - Variant24044, - Variant24045, - Variant24046, - Variant24047, - Variant24048, - Variant24049, - Variant24050, - Variant24051, - Variant24052, - Variant24053, - Variant24054, - Variant24055, - Variant24056, - Variant24057, - Variant24058, - Variant24059, - Variant24060, - Variant24061, - Variant24062, - Variant24063, - Variant24064, - Variant24065, - Variant24066, - Variant24067, - Variant24068, - Variant24069, - Variant24070, - Variant24071, - Variant24072, - Variant24073, - Variant24074, - Variant24075, - Variant24076, - Variant24077, - Variant24078, - Variant24079, - Variant24080, - Variant24081, - Variant24082, - Variant24083, - Variant24084, - Variant24085, - Variant24086, - Variant24087, - Variant24088, - Variant24089, - Variant24090, - Variant24091, - Variant24092, - Variant24093, - Variant24094, - Variant24095, - Variant24096, - Variant24097, - Variant24098, - Variant24099, - Variant24100, - Variant24101, - Variant24102, - Variant24103, - Variant24104, - Variant24105, - Variant24106, - Variant24107, - Variant24108, - Variant24109, - Variant24110, - Variant24111, - Variant24112, - Variant24113, - Variant24114, - Variant24115, - Variant24116, - Variant24117, - Variant24118, - Variant24119, - Variant24120, - Variant24121, - Variant24122, - Variant24123, - Variant24124, - Variant24125, - Variant24126, - Variant24127, - Variant24128, - Variant24129, - Variant24130, - Variant24131, - Variant24132, - Variant24133, - Variant24134, - Variant24135, - Variant24136, - Variant24137, - Variant24138, - Variant24139, - Variant24140, - Variant24141, - Variant24142, - Variant24143, - Variant24144, - Variant24145, - Variant24146, - Variant24147, - Variant24148, - Variant24149, - Variant24150, - Variant24151, - Variant24152, - Variant24153, - Variant24154, - Variant24155, - Variant24156, - Variant24157, - Variant24158, - Variant24159, - Variant24160, - Variant24161, - Variant24162, - Variant24163, - Variant24164, - Variant24165, - Variant24166, - Variant24167, - Variant24168, - Variant24169, - Variant24170, - Variant24171, - Variant24172, - Variant24173, - Variant24174, - Variant24175, - Variant24176, - Variant24177, - Variant24178, - Variant24179, - Variant24180, - Variant24181, - Variant24182, - Variant24183, - Variant24184, - Variant24185, - Variant24186, - Variant24187, - Variant24188, - Variant24189, - Variant24190, - Variant24191, - Variant24192, - Variant24193, - Variant24194, - Variant24195, - Variant24196, - Variant24197, - Variant24198, - Variant24199, - Variant24200, - Variant24201, - Variant24202, - Variant24203, - Variant24204, - Variant24205, - Variant24206, - Variant24207, - Variant24208, - Variant24209, - Variant24210, - Variant24211, - Variant24212, - Variant24213, - Variant24214, - Variant24215, - Variant24216, - Variant24217, - Variant24218, - Variant24219, - Variant24220, - Variant24221, - Variant24222, - Variant24223, - Variant24224, - Variant24225, - Variant24226, - Variant24227, - Variant24228, - Variant24229, - Variant24230, - Variant24231, - Variant24232, - Variant24233, - Variant24234, - Variant24235, - Variant24236, - Variant24237, - Variant24238, - Variant24239, - Variant24240, - Variant24241, - Variant24242, - Variant24243, - Variant24244, - Variant24245, - Variant24246, - Variant24247, - Variant24248, - Variant24249, - Variant24250, - Variant24251, - Variant24252, - Variant24253, - Variant24254, - Variant24255, - Variant24256, - Variant24257, - Variant24258, - Variant24259, - Variant24260, - Variant24261, - Variant24262, - Variant24263, - Variant24264, - Variant24265, - Variant24266, - Variant24267, - Variant24268, - Variant24269, - Variant24270, - Variant24271, - Variant24272, - Variant24273, - Variant24274, - Variant24275, - Variant24276, - Variant24277, - Variant24278, - Variant24279, - Variant24280, - Variant24281, - Variant24282, - Variant24283, - Variant24284, - Variant24285, - Variant24286, - Variant24287, - Variant24288, - Variant24289, - Variant24290, - Variant24291, - Variant24292, - Variant24293, - Variant24294, - Variant24295, - Variant24296, - Variant24297, - Variant24298, - Variant24299, - Variant24300, - Variant24301, - Variant24302, - Variant24303, - Variant24304, - Variant24305, - Variant24306, - Variant24307, - Variant24308, - Variant24309, - Variant24310, - Variant24311, - Variant24312, - Variant24313, - Variant24314, - Variant24315, - Variant24316, - Variant24317, - Variant24318, - Variant24319, - Variant24320, - Variant24321, - Variant24322, - Variant24323, - Variant24324, - Variant24325, - Variant24326, - Variant24327, - Variant24328, - Variant24329, - Variant24330, - Variant24331, - Variant24332, - Variant24333, - Variant24334, - Variant24335, - Variant24336, - Variant24337, - Variant24338, - Variant24339, - Variant24340, - Variant24341, - Variant24342, - Variant24343, - Variant24344, - Variant24345, - Variant24346, - Variant24347, - Variant24348, - Variant24349, - Variant24350, - Variant24351, - Variant24352, - Variant24353, - Variant24354, - Variant24355, - Variant24356, - Variant24357, - Variant24358, - Variant24359, - Variant24360, - Variant24361, - Variant24362, - Variant24363, - Variant24364, - Variant24365, - Variant24366, - Variant24367, - Variant24368, - Variant24369, - Variant24370, - Variant24371, - Variant24372, - Variant24373, - Variant24374, - Variant24375, - Variant24376, - Variant24377, - Variant24378, - Variant24379, - Variant24380, - Variant24381, - Variant24382, - Variant24383, - Variant24384, - Variant24385, - Variant24386, - Variant24387, - Variant24388, - Variant24389, - Variant24390, - Variant24391, - Variant24392, - Variant24393, - Variant24394, - Variant24395, - Variant24396, - Variant24397, - Variant24398, - Variant24399, - Variant24400, - Variant24401, - Variant24402, - Variant24403, - Variant24404, - Variant24405, - Variant24406, - Variant24407, - Variant24408, - Variant24409, - Variant24410, - Variant24411, - Variant24412, - Variant24413, - Variant24414, - Variant24415, - Variant24416, - Variant24417, - Variant24418, - Variant24419, - Variant24420, - Variant24421, - Variant24422, - Variant24423, - Variant24424, - Variant24425, - Variant24426, - Variant24427, - Variant24428, - Variant24429, - Variant24430, - Variant24431, - Variant24432, - Variant24433, - Variant24434, - Variant24435, - Variant24436, - Variant24437, - Variant24438, - Variant24439, - Variant24440, - Variant24441, - Variant24442, - Variant24443, - Variant24444, - Variant24445, - Variant24446, - Variant24447, - Variant24448, - Variant24449, - Variant24450, - Variant24451, - Variant24452, - Variant24453, - Variant24454, - Variant24455, - Variant24456, - Variant24457, - Variant24458, - Variant24459, - Variant24460, - Variant24461, - Variant24462, - Variant24463, - Variant24464, - Variant24465, - Variant24466, - Variant24467, - Variant24468, - Variant24469, - Variant24470, - Variant24471, - Variant24472, - Variant24473, - Variant24474, - Variant24475, - Variant24476, - Variant24477, - Variant24478, - Variant24479, - Variant24480, - Variant24481, - Variant24482, - Variant24483, - Variant24484, - Variant24485, - Variant24486, - Variant24487, - Variant24488, - Variant24489, - Variant24490, - Variant24491, - Variant24492, - Variant24493, - Variant24494, - Variant24495, - Variant24496, - Variant24497, - Variant24498, - Variant24499, - Variant24500, - Variant24501, - Variant24502, - Variant24503, - Variant24504, - Variant24505, - Variant24506, - Variant24507, - Variant24508, - Variant24509, - Variant24510, - Variant24511, - Variant24512, - Variant24513, - Variant24514, - Variant24515, - Variant24516, - Variant24517, - Variant24518, - Variant24519, - Variant24520, - Variant24521, - Variant24522, - Variant24523, - Variant24524, - Variant24525, - Variant24526, - Variant24527, - Variant24528, - Variant24529, - Variant24530, - Variant24531, - Variant24532, - Variant24533, - Variant24534, - Variant24535, - Variant24536, - Variant24537, - Variant24538, - Variant24539, - Variant24540, - Variant24541, - Variant24542, - Variant24543, - Variant24544, - Variant24545, - Variant24546, - Variant24547, - Variant24548, - Variant24549, - Variant24550, - Variant24551, - Variant24552, - Variant24553, - Variant24554, - Variant24555, - Variant24556, - Variant24557, - Variant24558, - Variant24559, - Variant24560, - Variant24561, - Variant24562, - Variant24563, - Variant24564, - Variant24565, - Variant24566, - Variant24567, - Variant24568, - Variant24569, - Variant24570, - Variant24571, - Variant24572, - Variant24573, - Variant24574, - Variant24575, - Variant24576, - Variant24577, - Variant24578, - Variant24579, - Variant24580, - Variant24581, - Variant24582, - Variant24583, - Variant24584, - Variant24585, - Variant24586, - Variant24587, - Variant24588, - Variant24589, - Variant24590, - Variant24591, - Variant24592, - Variant24593, - Variant24594, - Variant24595, - Variant24596, - Variant24597, - Variant24598, - Variant24599, - Variant24600, - Variant24601, - Variant24602, - Variant24603, - Variant24604, - Variant24605, - Variant24606, - Variant24607, - Variant24608, - Variant24609, - Variant24610, - Variant24611, - Variant24612, - Variant24613, - Variant24614, - Variant24615, - Variant24616, - Variant24617, - Variant24618, - Variant24619, - Variant24620, - Variant24621, - Variant24622, - Variant24623, - Variant24624, - Variant24625, - Variant24626, - Variant24627, - Variant24628, - Variant24629, - Variant24630, - Variant24631, - Variant24632, - Variant24633, - Variant24634, - Variant24635, - Variant24636, - Variant24637, - Variant24638, - Variant24639, - Variant24640, - Variant24641, - Variant24642, - Variant24643, - Variant24644, - Variant24645, - Variant24646, - Variant24647, - Variant24648, - Variant24649, - Variant24650, - Variant24651, - Variant24652, - Variant24653, - Variant24654, - Variant24655, - Variant24656, - Variant24657, - Variant24658, - Variant24659, - Variant24660, - Variant24661, - Variant24662, - Variant24663, - Variant24664, - Variant24665, - Variant24666, - Variant24667, - Variant24668, - Variant24669, - Variant24670, - Variant24671, - Variant24672, - Variant24673, - Variant24674, - Variant24675, - Variant24676, - Variant24677, - Variant24678, - Variant24679, - Variant24680, - Variant24681, - Variant24682, - Variant24683, - Variant24684, - Variant24685, - Variant24686, - Variant24687, - Variant24688, - Variant24689, - Variant24690, - Variant24691, - Variant24692, - Variant24693, - Variant24694, - Variant24695, - Variant24696, - Variant24697, - Variant24698, - Variant24699, - Variant24700, - Variant24701, - Variant24702, - Variant24703, - Variant24704, - Variant24705, - Variant24706, - Variant24707, - Variant24708, - Variant24709, - Variant24710, - Variant24711, - Variant24712, - Variant24713, - Variant24714, - Variant24715, - Variant24716, - Variant24717, - Variant24718, - Variant24719, - Variant24720, - Variant24721, - Variant24722, - Variant24723, - Variant24724, - Variant24725, - Variant24726, - Variant24727, - Variant24728, - Variant24729, - Variant24730, - Variant24731, - Variant24732, - Variant24733, - Variant24734, - Variant24735, - Variant24736, - Variant24737, - Variant24738, - Variant24739, - Variant24740, - Variant24741, - Variant24742, - Variant24743, - Variant24744, - Variant24745, - Variant24746, - Variant24747, - Variant24748, - Variant24749, - Variant24750, - Variant24751, - Variant24752, - Variant24753, - Variant24754, - Variant24755, - Variant24756, - Variant24757, - Variant24758, - Variant24759, - Variant24760, - Variant24761, - Variant24762, - Variant24763, - Variant24764, - Variant24765, - Variant24766, - Variant24767, - Variant24768, - Variant24769, - Variant24770, - Variant24771, - Variant24772, - Variant24773, - Variant24774, - Variant24775, - Variant24776, - Variant24777, - Variant24778, - Variant24779, - Variant24780, - Variant24781, - Variant24782, - Variant24783, - Variant24784, - Variant24785, - Variant24786, - Variant24787, - Variant24788, - Variant24789, - Variant24790, - Variant24791, - Variant24792, - Variant24793, - Variant24794, - Variant24795, - Variant24796, - Variant24797, - Variant24798, - Variant24799, - Variant24800, - Variant24801, - Variant24802, - Variant24803, - Variant24804, - Variant24805, - Variant24806, - Variant24807, - Variant24808, - Variant24809, - Variant24810, - Variant24811, - Variant24812, - Variant24813, - Variant24814, - Variant24815, - Variant24816, - Variant24817, - Variant24818, - Variant24819, - Variant24820, - Variant24821, - Variant24822, - Variant24823, - Variant24824, - Variant24825, - Variant24826, - Variant24827, - Variant24828, - Variant24829, - Variant24830, - Variant24831, - Variant24832, - Variant24833, - Variant24834, - Variant24835, - Variant24836, - Variant24837, - Variant24838, - Variant24839, - Variant24840, - Variant24841, - Variant24842, - Variant24843, - Variant24844, - Variant24845, - Variant24846, - Variant24847, - Variant24848, - Variant24849, - Variant24850, - Variant24851, - Variant24852, - Variant24853, - Variant24854, - Variant24855, - Variant24856, - Variant24857, - Variant24858, - Variant24859, - Variant24860, - Variant24861, - Variant24862, - Variant24863, - Variant24864, - Variant24865, - Variant24866, - Variant24867, - Variant24868, - Variant24869, - Variant24870, - Variant24871, - Variant24872, - Variant24873, - Variant24874, - Variant24875, - Variant24876, - Variant24877, - Variant24878, - Variant24879, - Variant24880, - Variant24881, - Variant24882, - Variant24883, - Variant24884, - Variant24885, - Variant24886, - Variant24887, - Variant24888, - Variant24889, - Variant24890, - Variant24891, - Variant24892, - Variant24893, - Variant24894, - Variant24895, - Variant24896, - Variant24897, - Variant24898, - Variant24899, - Variant24900, - Variant24901, - Variant24902, - Variant24903, - Variant24904, - Variant24905, - Variant24906, - Variant24907, - Variant24908, - Variant24909, - Variant24910, - Variant24911, - Variant24912, - Variant24913, - Variant24914, - Variant24915, - Variant24916, - Variant24917, - Variant24918, - Variant24919, - Variant24920, - Variant24921, - Variant24922, - Variant24923, - Variant24924, - Variant24925, - Variant24926, - Variant24927, - Variant24928, - Variant24929, - Variant24930, - Variant24931, - Variant24932, - Variant24933, - Variant24934, - Variant24935, - Variant24936, - Variant24937, - Variant24938, - Variant24939, - Variant24940, - Variant24941, - Variant24942, - Variant24943, - Variant24944, - Variant24945, - Variant24946, - Variant24947, - Variant24948, - Variant24949, - Variant24950, - Variant24951, - Variant24952, - Variant24953, - Variant24954, - Variant24955, - Variant24956, - Variant24957, - Variant24958, - Variant24959, - Variant24960, - Variant24961, - Variant24962, - Variant24963, - Variant24964, - Variant24965, - Variant24966, - Variant24967, - Variant24968, - Variant24969, - Variant24970, - Variant24971, - Variant24972, - Variant24973, - Variant24974, - Variant24975, - Variant24976, - Variant24977, - Variant24978, - Variant24979, - Variant24980, - Variant24981, - Variant24982, - Variant24983, - Variant24984, - Variant24985, - Variant24986, - Variant24987, - Variant24988, - Variant24989, - Variant24990, - Variant24991, - Variant24992, - Variant24993, - Variant24994, - Variant24995, - Variant24996, - Variant24997, - Variant24998, - Variant24999, - Variant25000, - Variant25001, - Variant25002, - Variant25003, - Variant25004, - Variant25005, - Variant25006, - Variant25007, - Variant25008, - Variant25009, - Variant25010, - Variant25011, - Variant25012, - Variant25013, - Variant25014, - Variant25015, - Variant25016, - Variant25017, - Variant25018, - Variant25019, - Variant25020, - Variant25021, - Variant25022, - Variant25023, - Variant25024, - Variant25025, - Variant25026, - Variant25027, - Variant25028, - Variant25029, - Variant25030, - Variant25031, - Variant25032, - Variant25033, - Variant25034, - Variant25035, - Variant25036, - Variant25037, - Variant25038, - Variant25039, - Variant25040, - Variant25041, - Variant25042, - Variant25043, - Variant25044, - Variant25045, - Variant25046, - Variant25047, - Variant25048, - Variant25049, - Variant25050, - Variant25051, - Variant25052, - Variant25053, - Variant25054, - Variant25055, - Variant25056, - Variant25057, - Variant25058, - Variant25059, - Variant25060, - Variant25061, - Variant25062, - Variant25063, - Variant25064, - Variant25065, - Variant25066, - Variant25067, - Variant25068, - Variant25069, - Variant25070, - Variant25071, - Variant25072, - Variant25073, - Variant25074, - Variant25075, - Variant25076, - Variant25077, - Variant25078, - Variant25079, - Variant25080, - Variant25081, - Variant25082, - Variant25083, - Variant25084, - Variant25085, - Variant25086, - Variant25087, - Variant25088, - Variant25089, - Variant25090, - Variant25091, - Variant25092, - Variant25093, - Variant25094, - Variant25095, - Variant25096, - Variant25097, - Variant25098, - Variant25099, - Variant25100, - Variant25101, - Variant25102, - Variant25103, - Variant25104, - Variant25105, - Variant25106, - Variant25107, - Variant25108, - Variant25109, - Variant25110, - Variant25111, - Variant25112, - Variant25113, - Variant25114, - Variant25115, - Variant25116, - Variant25117, - Variant25118, - Variant25119, - Variant25120, - Variant25121, - Variant25122, - Variant25123, - Variant25124, - Variant25125, - Variant25126, - Variant25127, - Variant25128, - Variant25129, - Variant25130, - Variant25131, - Variant25132, - Variant25133, - Variant25134, - Variant25135, - Variant25136, - Variant25137, - Variant25138, - Variant25139, - Variant25140, - Variant25141, - Variant25142, - Variant25143, - Variant25144, - Variant25145, - Variant25146, - Variant25147, - Variant25148, - Variant25149, - Variant25150, - Variant25151, - Variant25152, - Variant25153, - Variant25154, - Variant25155, - Variant25156, - Variant25157, - Variant25158, - Variant25159, - Variant25160, - Variant25161, - Variant25162, - Variant25163, - Variant25164, - Variant25165, - Variant25166, - Variant25167, - Variant25168, - Variant25169, - Variant25170, - Variant25171, - Variant25172, - Variant25173, - Variant25174, - Variant25175, - Variant25176, - Variant25177, - Variant25178, - Variant25179, - Variant25180, - Variant25181, - Variant25182, - Variant25183, - Variant25184, - Variant25185, - Variant25186, - Variant25187, - Variant25188, - Variant25189, - Variant25190, - Variant25191, - Variant25192, - Variant25193, - Variant25194, - Variant25195, - Variant25196, - Variant25197, - Variant25198, - Variant25199, - Variant25200, - Variant25201, - Variant25202, - Variant25203, - Variant25204, - Variant25205, - Variant25206, - Variant25207, - Variant25208, - Variant25209, - Variant25210, - Variant25211, - Variant25212, - Variant25213, - Variant25214, - Variant25215, - Variant25216, - Variant25217, - Variant25218, - Variant25219, - Variant25220, - Variant25221, - Variant25222, - Variant25223, - Variant25224, - Variant25225, - Variant25226, - Variant25227, - Variant25228, - Variant25229, - Variant25230, - Variant25231, - Variant25232, - Variant25233, - Variant25234, - Variant25235, - Variant25236, - Variant25237, - Variant25238, - Variant25239, - Variant25240, - Variant25241, - Variant25242, - Variant25243, - Variant25244, - Variant25245, - Variant25246, - Variant25247, - Variant25248, - Variant25249, - Variant25250, - Variant25251, - Variant25252, - Variant25253, - Variant25254, - Variant25255, - Variant25256, - Variant25257, - Variant25258, - Variant25259, - Variant25260, - Variant25261, - Variant25262, - Variant25263, - Variant25264, - Variant25265, - Variant25266, - Variant25267, - Variant25268, - Variant25269, - Variant25270, - Variant25271, - Variant25272, - Variant25273, - Variant25274, - Variant25275, - Variant25276, - Variant25277, - Variant25278, - Variant25279, - Variant25280, - Variant25281, - Variant25282, - Variant25283, - Variant25284, - Variant25285, - Variant25286, - Variant25287, - Variant25288, - Variant25289, - Variant25290, - Variant25291, - Variant25292, - Variant25293, - Variant25294, - Variant25295, - Variant25296, - Variant25297, - Variant25298, - Variant25299, - Variant25300, - Variant25301, - Variant25302, - Variant25303, - Variant25304, - Variant25305, - Variant25306, - Variant25307, - Variant25308, - Variant25309, - Variant25310, - Variant25311, - Variant25312, - Variant25313, - Variant25314, - Variant25315, - Variant25316, - Variant25317, - Variant25318, - Variant25319, - Variant25320, - Variant25321, - Variant25322, - Variant25323, - Variant25324, - Variant25325, - Variant25326, - Variant25327, - Variant25328, - Variant25329, - Variant25330, - Variant25331, - Variant25332, - Variant25333, - Variant25334, - Variant25335, - Variant25336, - Variant25337, - Variant25338, - Variant25339, - Variant25340, - Variant25341, - Variant25342, - Variant25343, - Variant25344, - Variant25345, - Variant25346, - Variant25347, - Variant25348, - Variant25349, - Variant25350, - Variant25351, - Variant25352, - Variant25353, - Variant25354, - Variant25355, - Variant25356, - Variant25357, - Variant25358, - Variant25359, - Variant25360, - Variant25361, - Variant25362, - Variant25363, - Variant25364, - Variant25365, - Variant25366, - Variant25367, - Variant25368, - Variant25369, - Variant25370, - Variant25371, - Variant25372, - Variant25373, - Variant25374, - Variant25375, - Variant25376, - Variant25377, - Variant25378, - Variant25379, - Variant25380, - Variant25381, - Variant25382, - Variant25383, - Variant25384, - Variant25385, - Variant25386, - Variant25387, - Variant25388, - Variant25389, - Variant25390, - Variant25391, - Variant25392, - Variant25393, - Variant25394, - Variant25395, - Variant25396, - Variant25397, - Variant25398, - Variant25399, - Variant25400, - Variant25401, - Variant25402, - Variant25403, - Variant25404, - Variant25405, - Variant25406, - Variant25407, - Variant25408, - Variant25409, - Variant25410, - Variant25411, - Variant25412, - Variant25413, - Variant25414, - Variant25415, - Variant25416, - Variant25417, - Variant25418, - Variant25419, - Variant25420, - Variant25421, - Variant25422, - Variant25423, - Variant25424, - Variant25425, - Variant25426, - Variant25427, - Variant25428, - Variant25429, - Variant25430, - Variant25431, - Variant25432, - Variant25433, - Variant25434, - Variant25435, - Variant25436, - Variant25437, - Variant25438, - Variant25439, - Variant25440, - Variant25441, - Variant25442, - Variant25443, - Variant25444, - Variant25445, - Variant25446, - Variant25447, - Variant25448, - Variant25449, - Variant25450, - Variant25451, - Variant25452, - Variant25453, - Variant25454, - Variant25455, - Variant25456, - Variant25457, - Variant25458, - Variant25459, - Variant25460, - Variant25461, - Variant25462, - Variant25463, - Variant25464, - Variant25465, - Variant25466, - Variant25467, - Variant25468, - Variant25469, - Variant25470, - Variant25471, - Variant25472, - Variant25473, - Variant25474, - Variant25475, - Variant25476, - Variant25477, - Variant25478, - Variant25479, - Variant25480, - Variant25481, - Variant25482, - Variant25483, - Variant25484, - Variant25485, - Variant25486, - Variant25487, - Variant25488, - Variant25489, - Variant25490, - Variant25491, - Variant25492, - Variant25493, - Variant25494, - Variant25495, - Variant25496, - Variant25497, - Variant25498, - Variant25499, - Variant25500, - Variant25501, - Variant25502, - Variant25503, - Variant25504, - Variant25505, - Variant25506, - Variant25507, - Variant25508, - Variant25509, - Variant25510, - Variant25511, - Variant25512, - Variant25513, - Variant25514, - Variant25515, - Variant25516, - Variant25517, - Variant25518, - Variant25519, - Variant25520, - Variant25521, - Variant25522, - Variant25523, - Variant25524, - Variant25525, - Variant25526, - Variant25527, - Variant25528, - Variant25529, - Variant25530, - Variant25531, - Variant25532, - Variant25533, - Variant25534, - Variant25535, - Variant25536, - Variant25537, - Variant25538, - Variant25539, - Variant25540, - Variant25541, - Variant25542, - Variant25543, - Variant25544, - Variant25545, - Variant25546, - Variant25547, - Variant25548, - Variant25549, - Variant25550, - Variant25551, - Variant25552, - Variant25553, - Variant25554, - Variant25555, - Variant25556, - Variant25557, - Variant25558, - Variant25559, - Variant25560, - Variant25561, - Variant25562, - Variant25563, - Variant25564, - Variant25565, - Variant25566, - Variant25567, - Variant25568, - Variant25569, - Variant25570, - Variant25571, - Variant25572, - Variant25573, - Variant25574, - Variant25575, - Variant25576, - Variant25577, - Variant25578, - Variant25579, - Variant25580, - Variant25581, - Variant25582, - Variant25583, - Variant25584, - Variant25585, - Variant25586, - Variant25587, - Variant25588, - Variant25589, - Variant25590, - Variant25591, - Variant25592, - Variant25593, - Variant25594, - Variant25595, - Variant25596, - Variant25597, - Variant25598, - Variant25599, - Variant25600, - Variant25601, - Variant25602, - Variant25603, - Variant25604, - Variant25605, - Variant25606, - Variant25607, - Variant25608, - Variant25609, - Variant25610, - Variant25611, - Variant25612, - Variant25613, - Variant25614, - Variant25615, - Variant25616, - Variant25617, - Variant25618, - Variant25619, - Variant25620, - Variant25621, - Variant25622, - Variant25623, - Variant25624, - Variant25625, - Variant25626, - Variant25627, - Variant25628, - Variant25629, - Variant25630, - Variant25631, - Variant25632, - Variant25633, - Variant25634, - Variant25635, - Variant25636, - Variant25637, - Variant25638, - Variant25639, - Variant25640, - Variant25641, - Variant25642, - Variant25643, - Variant25644, - Variant25645, - Variant25646, - Variant25647, - Variant25648, - Variant25649, - Variant25650, - Variant25651, - Variant25652, - Variant25653, - Variant25654, - Variant25655, - Variant25656, - Variant25657, - Variant25658, - Variant25659, - Variant25660, - Variant25661, - Variant25662, - Variant25663, - Variant25664, - Variant25665, - Variant25666, - Variant25667, - Variant25668, - Variant25669, - Variant25670, - Variant25671, - Variant25672, - Variant25673, - Variant25674, - Variant25675, - Variant25676, - Variant25677, - Variant25678, - Variant25679, - Variant25680, - Variant25681, - Variant25682, - Variant25683, - Variant25684, - Variant25685, - Variant25686, - Variant25687, - Variant25688, - Variant25689, - Variant25690, - Variant25691, - Variant25692, - Variant25693, - Variant25694, - Variant25695, - Variant25696, - Variant25697, - Variant25698, - Variant25699, - Variant25700, - Variant25701, - Variant25702, - Variant25703, - Variant25704, - Variant25705, - Variant25706, - Variant25707, - Variant25708, - Variant25709, - Variant25710, - Variant25711, - Variant25712, - Variant25713, - Variant25714, - Variant25715, - Variant25716, - Variant25717, - Variant25718, - Variant25719, - Variant25720, - Variant25721, - Variant25722, - Variant25723, - Variant25724, - Variant25725, - Variant25726, - Variant25727, - Variant25728, - Variant25729, - Variant25730, - Variant25731, - Variant25732, - Variant25733, - Variant25734, - Variant25735, - Variant25736, - Variant25737, - Variant25738, - Variant25739, - Variant25740, - Variant25741, - Variant25742, - Variant25743, - Variant25744, - Variant25745, - Variant25746, - Variant25747, - Variant25748, - Variant25749, - Variant25750, - Variant25751, - Variant25752, - Variant25753, - Variant25754, - Variant25755, - Variant25756, - Variant25757, - Variant25758, - Variant25759, - Variant25760, - Variant25761, - Variant25762, - Variant25763, - Variant25764, - Variant25765, - Variant25766, - Variant25767, - Variant25768, - Variant25769, - Variant25770, - Variant25771, - Variant25772, - Variant25773, - Variant25774, - Variant25775, - Variant25776, - Variant25777, - Variant25778, - Variant25779, - Variant25780, - Variant25781, - Variant25782, - Variant25783, - Variant25784, - Variant25785, - Variant25786, - Variant25787, - Variant25788, - Variant25789, - Variant25790, - Variant25791, - Variant25792, - Variant25793, - Variant25794, - Variant25795, - Variant25796, - Variant25797, - Variant25798, - Variant25799, - Variant25800, - Variant25801, - Variant25802, - Variant25803, - Variant25804, - Variant25805, - Variant25806, - Variant25807, - Variant25808, - Variant25809, - Variant25810, - Variant25811, - Variant25812, - Variant25813, - Variant25814, - Variant25815, - Variant25816, - Variant25817, - Variant25818, - Variant25819, - Variant25820, - Variant25821, - Variant25822, - Variant25823, - Variant25824, - Variant25825, - Variant25826, - Variant25827, - Variant25828, - Variant25829, - Variant25830, - Variant25831, - Variant25832, - Variant25833, - Variant25834, - Variant25835, - Variant25836, - Variant25837, - Variant25838, - Variant25839, - Variant25840, - Variant25841, - Variant25842, - Variant25843, - Variant25844, - Variant25845, - Variant25846, - Variant25847, - Variant25848, - Variant25849, - Variant25850, - Variant25851, - Variant25852, - Variant25853, - Variant25854, - Variant25855, - Variant25856, - Variant25857, - Variant25858, - Variant25859, - Variant25860, - Variant25861, - Variant25862, - Variant25863, - Variant25864, - Variant25865, - Variant25866, - Variant25867, - Variant25868, - Variant25869, - Variant25870, - Variant25871, - Variant25872, - Variant25873, - Variant25874, - Variant25875, - Variant25876, - Variant25877, - Variant25878, - Variant25879, - Variant25880, - Variant25881, - Variant25882, - Variant25883, - Variant25884, - Variant25885, - Variant25886, - Variant25887, - Variant25888, - Variant25889, - Variant25890, - Variant25891, - Variant25892, - Variant25893, - Variant25894, - Variant25895, - Variant25896, - Variant25897, - Variant25898, - Variant25899, - Variant25900, - Variant25901, - Variant25902, - Variant25903, - Variant25904, - Variant25905, - Variant25906, - Variant25907, - Variant25908, - Variant25909, - Variant25910, - Variant25911, - Variant25912, - Variant25913, - Variant25914, - Variant25915, - Variant25916, - Variant25917, - Variant25918, - Variant25919, - Variant25920, - Variant25921, - Variant25922, - Variant25923, - Variant25924, - Variant25925, - Variant25926, - Variant25927, - Variant25928, - Variant25929, - Variant25930, - Variant25931, - Variant25932, - Variant25933, - Variant25934, - Variant25935, - Variant25936, - Variant25937, - Variant25938, - Variant25939, - Variant25940, - Variant25941, - Variant25942, - Variant25943, - Variant25944, - Variant25945, - Variant25946, - Variant25947, - Variant25948, - Variant25949, - Variant25950, - Variant25951, - Variant25952, - Variant25953, - Variant25954, - Variant25955, - Variant25956, - Variant25957, - Variant25958, - Variant25959, - Variant25960, - Variant25961, - Variant25962, - Variant25963, - Variant25964, - Variant25965, - Variant25966, - Variant25967, - Variant25968, - Variant25969, - Variant25970, - Variant25971, - Variant25972, - Variant25973, - Variant25974, - Variant25975, - Variant25976, - Variant25977, - Variant25978, - Variant25979, - Variant25980, - Variant25981, - Variant25982, - Variant25983, - Variant25984, - Variant25985, - Variant25986, - Variant25987, - Variant25988, - Variant25989, - Variant25990, - Variant25991, - Variant25992, - Variant25993, - Variant25994, - Variant25995, - Variant25996, - Variant25997, - Variant25998, - Variant25999, - Variant26000, - Variant26001, - Variant26002, - Variant26003, - Variant26004, - Variant26005, - Variant26006, - Variant26007, - Variant26008, - Variant26009, - Variant26010, - Variant26011, - Variant26012, - Variant26013, - Variant26014, - Variant26015, - Variant26016, - Variant26017, - Variant26018, - Variant26019, - Variant26020, - Variant26021, - Variant26022, - Variant26023, - Variant26024, - Variant26025, - Variant26026, - Variant26027, - Variant26028, - Variant26029, - Variant26030, - Variant26031, - Variant26032, - Variant26033, - Variant26034, - Variant26035, - Variant26036, - Variant26037, - Variant26038, - Variant26039, - Variant26040, - Variant26041, - Variant26042, - Variant26043, - Variant26044, - Variant26045, - Variant26046, - Variant26047, - Variant26048, - Variant26049, - Variant26050, - Variant26051, - Variant26052, - Variant26053, - Variant26054, - Variant26055, - Variant26056, - Variant26057, - Variant26058, - Variant26059, - Variant26060, - Variant26061, - Variant26062, - Variant26063, - Variant26064, - Variant26065, - Variant26066, - Variant26067, - Variant26068, - Variant26069, - Variant26070, - Variant26071, - Variant26072, - Variant26073, - Variant26074, - Variant26075, - Variant26076, - Variant26077, - Variant26078, - Variant26079, - Variant26080, - Variant26081, - Variant26082, - Variant26083, - Variant26084, - Variant26085, - Variant26086, - Variant26087, - Variant26088, - Variant26089, - Variant26090, - Variant26091, - Variant26092, - Variant26093, - Variant26094, - Variant26095, - Variant26096, - Variant26097, - Variant26098, - Variant26099, - Variant26100, - Variant26101, - Variant26102, - Variant26103, - Variant26104, - Variant26105, - Variant26106, - Variant26107, - Variant26108, - Variant26109, - Variant26110, - Variant26111, - Variant26112, - Variant26113, - Variant26114, - Variant26115, - Variant26116, - Variant26117, - Variant26118, - Variant26119, - Variant26120, - Variant26121, - Variant26122, - Variant26123, - Variant26124, - Variant26125, - Variant26126, - Variant26127, - Variant26128, - Variant26129, - Variant26130, - Variant26131, - Variant26132, - Variant26133, - Variant26134, - Variant26135, - Variant26136, - Variant26137, - Variant26138, - Variant26139, - Variant26140, - Variant26141, - Variant26142, - Variant26143, - Variant26144, - Variant26145, - Variant26146, - Variant26147, - Variant26148, - Variant26149, - Variant26150, - Variant26151, - Variant26152, - Variant26153, - Variant26154, - Variant26155, - Variant26156, - Variant26157, - Variant26158, - Variant26159, - Variant26160, - Variant26161, - Variant26162, - Variant26163, - Variant26164, - Variant26165, - Variant26166, - Variant26167, - Variant26168, - Variant26169, - Variant26170, - Variant26171, - Variant26172, - Variant26173, - Variant26174, - Variant26175, - Variant26176, - Variant26177, - Variant26178, - Variant26179, - Variant26180, - Variant26181, - Variant26182, - Variant26183, - Variant26184, - Variant26185, - Variant26186, - Variant26187, - Variant26188, - Variant26189, - Variant26190, - Variant26191, - Variant26192, - Variant26193, - Variant26194, - Variant26195, - Variant26196, - Variant26197, - Variant26198, - Variant26199, - Variant26200, - Variant26201, - Variant26202, - Variant26203, - Variant26204, - Variant26205, - Variant26206, - Variant26207, - Variant26208, - Variant26209, - Variant26210, - Variant26211, - Variant26212, - Variant26213, - Variant26214, - Variant26215, - Variant26216, - Variant26217, - Variant26218, - Variant26219, - Variant26220, - Variant26221, - Variant26222, - Variant26223, - Variant26224, - Variant26225, - Variant26226, - Variant26227, - Variant26228, - Variant26229, - Variant26230, - Variant26231, - Variant26232, - Variant26233, - Variant26234, - Variant26235, - Variant26236, - Variant26237, - Variant26238, - Variant26239, - Variant26240, - Variant26241, - Variant26242, - Variant26243, - Variant26244, - Variant26245, - Variant26246, - Variant26247, - Variant26248, - Variant26249, - Variant26250, - Variant26251, - Variant26252, - Variant26253, - Variant26254, - Variant26255, - Variant26256, - Variant26257, - Variant26258, - Variant26259, - Variant26260, - Variant26261, - Variant26262, - Variant26263, - Variant26264, - Variant26265, - Variant26266, - Variant26267, - Variant26268, - Variant26269, - Variant26270, - Variant26271, - Variant26272, - Variant26273, - Variant26274, - Variant26275, - Variant26276, - Variant26277, - Variant26278, - Variant26279, - Variant26280, - Variant26281, - Variant26282, - Variant26283, - Variant26284, - Variant26285, - Variant26286, - Variant26287, - Variant26288, - Variant26289, - Variant26290, - Variant26291, - Variant26292, - Variant26293, - Variant26294, - Variant26295, - Variant26296, - Variant26297, - Variant26298, - Variant26299, - Variant26300, - Variant26301, - Variant26302, - Variant26303, - Variant26304, - Variant26305, - Variant26306, - Variant26307, - Variant26308, - Variant26309, - Variant26310, - Variant26311, - Variant26312, - Variant26313, - Variant26314, - Variant26315, - Variant26316, - Variant26317, - Variant26318, - Variant26319, - Variant26320, - Variant26321, - Variant26322, - Variant26323, - Variant26324, - Variant26325, - Variant26326, - Variant26327, - Variant26328, - Variant26329, - Variant26330, - Variant26331, - Variant26332, - Variant26333, - Variant26334, - Variant26335, - Variant26336, - Variant26337, - Variant26338, - Variant26339, - Variant26340, - Variant26341, - Variant26342, - Variant26343, - Variant26344, - Variant26345, - Variant26346, - Variant26347, - Variant26348, - Variant26349, - Variant26350, - Variant26351, - Variant26352, - Variant26353, - Variant26354, - Variant26355, - Variant26356, - Variant26357, - Variant26358, - Variant26359, - Variant26360, - Variant26361, - Variant26362, - Variant26363, - Variant26364, - Variant26365, - Variant26366, - Variant26367, - Variant26368, - Variant26369, - Variant26370, - Variant26371, - Variant26372, - Variant26373, - Variant26374, - Variant26375, - Variant26376, - Variant26377, - Variant26378, - Variant26379, - Variant26380, - Variant26381, - Variant26382, - Variant26383, - Variant26384, - Variant26385, - Variant26386, - Variant26387, - Variant26388, - Variant26389, - Variant26390, - Variant26391, - Variant26392, - Variant26393, - Variant26394, - Variant26395, - Variant26396, - Variant26397, - Variant26398, - Variant26399, - Variant26400, - Variant26401, - Variant26402, - Variant26403, - Variant26404, - Variant26405, - Variant26406, - Variant26407, - Variant26408, - Variant26409, - Variant26410, - Variant26411, - Variant26412, - Variant26413, - Variant26414, - Variant26415, - Variant26416, - Variant26417, - Variant26418, - Variant26419, - Variant26420, - Variant26421, - Variant26422, - Variant26423, - Variant26424, - Variant26425, - Variant26426, - Variant26427, - Variant26428, - Variant26429, - Variant26430, - Variant26431, - Variant26432, - Variant26433, - Variant26434, - Variant26435, - Variant26436, - Variant26437, - Variant26438, - Variant26439, - Variant26440, - Variant26441, - Variant26442, - Variant26443, - Variant26444, - Variant26445, - Variant26446, - Variant26447, - Variant26448, - Variant26449, - Variant26450, - Variant26451, - Variant26452, - Variant26453, - Variant26454, - Variant26455, - Variant26456, - Variant26457, - Variant26458, - Variant26459, - Variant26460, - Variant26461, - Variant26462, - Variant26463, - Variant26464, - Variant26465, - Variant26466, - Variant26467, - Variant26468, - Variant26469, - Variant26470, - Variant26471, - Variant26472, - Variant26473, - Variant26474, - Variant26475, - Variant26476, - Variant26477, - Variant26478, - Variant26479, - Variant26480, - Variant26481, - Variant26482, - Variant26483, - Variant26484, - Variant26485, - Variant26486, - Variant26487, - Variant26488, - Variant26489, - Variant26490, - Variant26491, - Variant26492, - Variant26493, - Variant26494, - Variant26495, - Variant26496, - Variant26497, - Variant26498, - Variant26499, - Variant26500, - Variant26501, - Variant26502, - Variant26503, - Variant26504, - Variant26505, - Variant26506, - Variant26507, - Variant26508, - Variant26509, - Variant26510, - Variant26511, - Variant26512, - Variant26513, - Variant26514, - Variant26515, - Variant26516, - Variant26517, - Variant26518, - Variant26519, - Variant26520, - Variant26521, - Variant26522, - Variant26523, - Variant26524, - Variant26525, - Variant26526, - Variant26527, - Variant26528, - Variant26529, - Variant26530, - Variant26531, - Variant26532, - Variant26533, - Variant26534, - Variant26535, - Variant26536, - Variant26537, - Variant26538, - Variant26539, - Variant26540, - Variant26541, - Variant26542, - Variant26543, - Variant26544, - Variant26545, - Variant26546, - Variant26547, - Variant26548, - Variant26549, - Variant26550, - Variant26551, - Variant26552, - Variant26553, - Variant26554, - Variant26555, - Variant26556, - Variant26557, - Variant26558, - Variant26559, - Variant26560, - Variant26561, - Variant26562, - Variant26563, - Variant26564, - Variant26565, - Variant26566, - Variant26567, - Variant26568, - Variant26569, - Variant26570, - Variant26571, - Variant26572, - Variant26573, - Variant26574, - Variant26575, - Variant26576, - Variant26577, - Variant26578, - Variant26579, - Variant26580, - Variant26581, - Variant26582, - Variant26583, - Variant26584, - Variant26585, - Variant26586, - Variant26587, - Variant26588, - Variant26589, - Variant26590, - Variant26591, - Variant26592, - Variant26593, - Variant26594, - Variant26595, - Variant26596, - Variant26597, - Variant26598, - Variant26599, - Variant26600, - Variant26601, - Variant26602, - Variant26603, - Variant26604, - Variant26605, - Variant26606, - Variant26607, - Variant26608, - Variant26609, - Variant26610, - Variant26611, - Variant26612, - Variant26613, - Variant26614, - Variant26615, - Variant26616, - Variant26617, - Variant26618, - Variant26619, - Variant26620, - Variant26621, - Variant26622, - Variant26623, - Variant26624, - Variant26625, - Variant26626, - Variant26627, - Variant26628, - Variant26629, - Variant26630, - Variant26631, - Variant26632, - Variant26633, - Variant26634, - Variant26635, - Variant26636, - Variant26637, - Variant26638, - Variant26639, - Variant26640, - Variant26641, - Variant26642, - Variant26643, - Variant26644, - Variant26645, - Variant26646, - Variant26647, - Variant26648, - Variant26649, - Variant26650, - Variant26651, - Variant26652, - Variant26653, - Variant26654, - Variant26655, - Variant26656, - Variant26657, - Variant26658, - Variant26659, - Variant26660, - Variant26661, - Variant26662, - Variant26663, - Variant26664, - Variant26665, - Variant26666, - Variant26667, - Variant26668, - Variant26669, - Variant26670, - Variant26671, - Variant26672, - Variant26673, - Variant26674, - Variant26675, - Variant26676, - Variant26677, - Variant26678, - Variant26679, - Variant26680, - Variant26681, - Variant26682, - Variant26683, - Variant26684, - Variant26685, - Variant26686, - Variant26687, - Variant26688, - Variant26689, - Variant26690, - Variant26691, - Variant26692, - Variant26693, - Variant26694, - Variant26695, - Variant26696, - Variant26697, - Variant26698, - Variant26699, - Variant26700, - Variant26701, - Variant26702, - Variant26703, - Variant26704, - Variant26705, - Variant26706, - Variant26707, - Variant26708, - Variant26709, - Variant26710, - Variant26711, - Variant26712, - Variant26713, - Variant26714, - Variant26715, - Variant26716, - Variant26717, - Variant26718, - Variant26719, - Variant26720, - Variant26721, - Variant26722, - Variant26723, - Variant26724, - Variant26725, - Variant26726, - Variant26727, - Variant26728, - Variant26729, - Variant26730, - Variant26731, - Variant26732, - Variant26733, - Variant26734, - Variant26735, - Variant26736, - Variant26737, - Variant26738, - Variant26739, - Variant26740, - Variant26741, - Variant26742, - Variant26743, - Variant26744, - Variant26745, - Variant26746, - Variant26747, - Variant26748, - Variant26749, - Variant26750, - Variant26751, - Variant26752, - Variant26753, - Variant26754, - Variant26755, - Variant26756, - Variant26757, - Variant26758, - Variant26759, - Variant26760, - Variant26761, - Variant26762, - Variant26763, - Variant26764, - Variant26765, - Variant26766, - Variant26767, - Variant26768, - Variant26769, - Variant26770, - Variant26771, - Variant26772, - Variant26773, - Variant26774, - Variant26775, - Variant26776, - Variant26777, - Variant26778, - Variant26779, - Variant26780, - Variant26781, - Variant26782, - Variant26783, - Variant26784, - Variant26785, - Variant26786, - Variant26787, - Variant26788, - Variant26789, - Variant26790, - Variant26791, - Variant26792, - Variant26793, - Variant26794, - Variant26795, - Variant26796, - Variant26797, - Variant26798, - Variant26799, - Variant26800, - Variant26801, - Variant26802, - Variant26803, - Variant26804, - Variant26805, - Variant26806, - Variant26807, - Variant26808, - Variant26809, - Variant26810, - Variant26811, - Variant26812, - Variant26813, - Variant26814, - Variant26815, - Variant26816, - Variant26817, - Variant26818, - Variant26819, - Variant26820, - Variant26821, - Variant26822, - Variant26823, - Variant26824, - Variant26825, - Variant26826, - Variant26827, - Variant26828, - Variant26829, - Variant26830, - Variant26831, - Variant26832, - Variant26833, - Variant26834, - Variant26835, - Variant26836, - Variant26837, - Variant26838, - Variant26839, - Variant26840, - Variant26841, - Variant26842, - Variant26843, - Variant26844, - Variant26845, - Variant26846, - Variant26847, - Variant26848, - Variant26849, - Variant26850, - Variant26851, - Variant26852, - Variant26853, - Variant26854, - Variant26855, - Variant26856, - Variant26857, - Variant26858, - Variant26859, - Variant26860, - Variant26861, - Variant26862, - Variant26863, - Variant26864, - Variant26865, - Variant26866, - Variant26867, - Variant26868, - Variant26869, - Variant26870, - Variant26871, - Variant26872, - Variant26873, - Variant26874, - Variant26875, - Variant26876, - Variant26877, - Variant26878, - Variant26879, - Variant26880, - Variant26881, - Variant26882, - Variant26883, - Variant26884, - Variant26885, - Variant26886, - Variant26887, - Variant26888, - Variant26889, - Variant26890, - Variant26891, - Variant26892, - Variant26893, - Variant26894, - Variant26895, - Variant26896, - Variant26897, - Variant26898, - Variant26899, - Variant26900, - Variant26901, - Variant26902, - Variant26903, - Variant26904, - Variant26905, - Variant26906, - Variant26907, - Variant26908, - Variant26909, - Variant26910, - Variant26911, - Variant26912, - Variant26913, - Variant26914, - Variant26915, - Variant26916, - Variant26917, - Variant26918, - Variant26919, - Variant26920, - Variant26921, - Variant26922, - Variant26923, - Variant26924, - Variant26925, - Variant26926, - Variant26927, - Variant26928, - Variant26929, - Variant26930, - Variant26931, - Variant26932, - Variant26933, - Variant26934, - Variant26935, - Variant26936, - Variant26937, - Variant26938, - Variant26939, - Variant26940, - Variant26941, - Variant26942, - Variant26943, - Variant26944, - Variant26945, - Variant26946, - Variant26947, - Variant26948, - Variant26949, - Variant26950, - Variant26951, - Variant26952, - Variant26953, - Variant26954, - Variant26955, - Variant26956, - Variant26957, - Variant26958, - Variant26959, - Variant26960, - Variant26961, - Variant26962, - Variant26963, - Variant26964, - Variant26965, - Variant26966, - Variant26967, - Variant26968, - Variant26969, - Variant26970, - Variant26971, - Variant26972, - Variant26973, - Variant26974, - Variant26975, - Variant26976, - Variant26977, - Variant26978, - Variant26979, - Variant26980, - Variant26981, - Variant26982, - Variant26983, - Variant26984, - Variant26985, - Variant26986, - Variant26987, - Variant26988, - Variant26989, - Variant26990, - Variant26991, - Variant26992, - Variant26993, - Variant26994, - Variant26995, - Variant26996, - Variant26997, - Variant26998, - Variant26999, - Variant27000, - Variant27001, - Variant27002, - Variant27003, - Variant27004, - Variant27005, - Variant27006, - Variant27007, - Variant27008, - Variant27009, - Variant27010, - Variant27011, - Variant27012, - Variant27013, - Variant27014, - Variant27015, - Variant27016, - Variant27017, - Variant27018, - Variant27019, - Variant27020, - Variant27021, - Variant27022, - Variant27023, - Variant27024, - Variant27025, - Variant27026, - Variant27027, - Variant27028, - Variant27029, - Variant27030, - Variant27031, - Variant27032, - Variant27033, - Variant27034, - Variant27035, - Variant27036, - Variant27037, - Variant27038, - Variant27039, - Variant27040, - Variant27041, - Variant27042, - Variant27043, - Variant27044, - Variant27045, - Variant27046, - Variant27047, - Variant27048, - Variant27049, - Variant27050, - Variant27051, - Variant27052, - Variant27053, - Variant27054, - Variant27055, - Variant27056, - Variant27057, - Variant27058, - Variant27059, - Variant27060, - Variant27061, - Variant27062, - Variant27063, - Variant27064, - Variant27065, - Variant27066, - Variant27067, - Variant27068, - Variant27069, - Variant27070, - Variant27071, - Variant27072, - Variant27073, - Variant27074, - Variant27075, - Variant27076, - Variant27077, - Variant27078, - Variant27079, - Variant27080, - Variant27081, - Variant27082, - Variant27083, - Variant27084, - Variant27085, - Variant27086, - Variant27087, - Variant27088, - Variant27089, - Variant27090, - Variant27091, - Variant27092, - Variant27093, - Variant27094, - Variant27095, - Variant27096, - Variant27097, - Variant27098, - Variant27099, - Variant27100, - Variant27101, - Variant27102, - Variant27103, - Variant27104, - Variant27105, - Variant27106, - Variant27107, - Variant27108, - Variant27109, - Variant27110, - Variant27111, - Variant27112, - Variant27113, - Variant27114, - Variant27115, - Variant27116, - Variant27117, - Variant27118, - Variant27119, - Variant27120, - Variant27121, - Variant27122, - Variant27123, - Variant27124, - Variant27125, - Variant27126, - Variant27127, - Variant27128, - Variant27129, - Variant27130, - Variant27131, - Variant27132, - Variant27133, - Variant27134, - Variant27135, - Variant27136, - Variant27137, - Variant27138, - Variant27139, - Variant27140, - Variant27141, - Variant27142, - Variant27143, - Variant27144, - Variant27145, - Variant27146, - Variant27147, - Variant27148, - Variant27149, - Variant27150, - Variant27151, - Variant27152, - Variant27153, - Variant27154, - Variant27155, - Variant27156, - Variant27157, - Variant27158, - Variant27159, - Variant27160, - Variant27161, - Variant27162, - Variant27163, - Variant27164, - Variant27165, - Variant27166, - Variant27167, - Variant27168, - Variant27169, - Variant27170, - Variant27171, - Variant27172, - Variant27173, - Variant27174, - Variant27175, - Variant27176, - Variant27177, - Variant27178, - Variant27179, - Variant27180, - Variant27181, - Variant27182, - Variant27183, - Variant27184, - Variant27185, - Variant27186, - Variant27187, - Variant27188, - Variant27189, - Variant27190, - Variant27191, - Variant27192, - Variant27193, - Variant27194, - Variant27195, - Variant27196, - Variant27197, - Variant27198, - Variant27199, - Variant27200, - Variant27201, - Variant27202, - Variant27203, - Variant27204, - Variant27205, - Variant27206, - Variant27207, - Variant27208, - Variant27209, - Variant27210, - Variant27211, - Variant27212, - Variant27213, - Variant27214, - Variant27215, - Variant27216, - Variant27217, - Variant27218, - Variant27219, - Variant27220, - Variant27221, - Variant27222, - Variant27223, - Variant27224, - Variant27225, - Variant27226, - Variant27227, - Variant27228, - Variant27229, - Variant27230, - Variant27231, - Variant27232, - Variant27233, - Variant27234, - Variant27235, - Variant27236, - Variant27237, - Variant27238, - Variant27239, - Variant27240, - Variant27241, - Variant27242, - Variant27243, - Variant27244, - Variant27245, - Variant27246, - Variant27247, - Variant27248, - Variant27249, - Variant27250, - Variant27251, - Variant27252, - Variant27253, - Variant27254, - Variant27255, - Variant27256, - Variant27257, - Variant27258, - Variant27259, - Variant27260, - Variant27261, - Variant27262, - Variant27263, - Variant27264, - Variant27265, - Variant27266, - Variant27267, - Variant27268, - Variant27269, - Variant27270, - Variant27271, - Variant27272, - Variant27273, - Variant27274, - Variant27275, - Variant27276, - Variant27277, - Variant27278, - Variant27279, - Variant27280, - Variant27281, - Variant27282, - Variant27283, - Variant27284, - Variant27285, - Variant27286, - Variant27287, - Variant27288, - Variant27289, - Variant27290, - Variant27291, - Variant27292, - Variant27293, - Variant27294, - Variant27295, - Variant27296, - Variant27297, - Variant27298, - Variant27299, - Variant27300, - Variant27301, - Variant27302, - Variant27303, - Variant27304, - Variant27305, - Variant27306, - Variant27307, - Variant27308, - Variant27309, - Variant27310, - Variant27311, - Variant27312, - Variant27313, - Variant27314, - Variant27315, - Variant27316, - Variant27317, - Variant27318, - Variant27319, - Variant27320, - Variant27321, - Variant27322, - Variant27323, - Variant27324, - Variant27325, - Variant27326, - Variant27327, - Variant27328, - Variant27329, - Variant27330, - Variant27331, - Variant27332, - Variant27333, - Variant27334, - Variant27335, - Variant27336, - Variant27337, - Variant27338, - Variant27339, - Variant27340, - Variant27341, - Variant27342, - Variant27343, - Variant27344, - Variant27345, - Variant27346, - Variant27347, - Variant27348, - Variant27349, - Variant27350, - Variant27351, - Variant27352, - Variant27353, - Variant27354, - Variant27355, - Variant27356, - Variant27357, - Variant27358, - Variant27359, - Variant27360, - Variant27361, - Variant27362, - Variant27363, - Variant27364, - Variant27365, - Variant27366, - Variant27367, - Variant27368, - Variant27369, - Variant27370, - Variant27371, - Variant27372, - Variant27373, - Variant27374, - Variant27375, - Variant27376, - Variant27377, - Variant27378, - Variant27379, - Variant27380, - Variant27381, - Variant27382, - Variant27383, - Variant27384, - Variant27385, - Variant27386, - Variant27387, - Variant27388, - Variant27389, - Variant27390, - Variant27391, - Variant27392, - Variant27393, - Variant27394, - Variant27395, - Variant27396, - Variant27397, - Variant27398, - Variant27399, - Variant27400, - Variant27401, - Variant27402, - Variant27403, - Variant27404, - Variant27405, - Variant27406, - Variant27407, - Variant27408, - Variant27409, - Variant27410, - Variant27411, - Variant27412, - Variant27413, - Variant27414, - Variant27415, - Variant27416, - Variant27417, - Variant27418, - Variant27419, - Variant27420, - Variant27421, - Variant27422, - Variant27423, - Variant27424, - Variant27425, - Variant27426, - Variant27427, - Variant27428, - Variant27429, - Variant27430, - Variant27431, - Variant27432, - Variant27433, - Variant27434, - Variant27435, - Variant27436, - Variant27437, - Variant27438, - Variant27439, - Variant27440, - Variant27441, - Variant27442, - Variant27443, - Variant27444, - Variant27445, - Variant27446, - Variant27447, - Variant27448, - Variant27449, - Variant27450, - Variant27451, - Variant27452, - Variant27453, - Variant27454, - Variant27455, - Variant27456, - Variant27457, - Variant27458, - Variant27459, - Variant27460, - Variant27461, - Variant27462, - Variant27463, - Variant27464, - Variant27465, - Variant27466, - Variant27467, - Variant27468, - Variant27469, - Variant27470, - Variant27471, - Variant27472, - Variant27473, - Variant27474, - Variant27475, - Variant27476, - Variant27477, - Variant27478, - Variant27479, - Variant27480, - Variant27481, - Variant27482, - Variant27483, - Variant27484, - Variant27485, - Variant27486, - Variant27487, - Variant27488, - Variant27489, - Variant27490, - Variant27491, - Variant27492, - Variant27493, - Variant27494, - Variant27495, - Variant27496, - Variant27497, - Variant27498, - Variant27499, - Variant27500, - Variant27501, - Variant27502, - Variant27503, - Variant27504, - Variant27505, - Variant27506, - Variant27507, - Variant27508, - Variant27509, - Variant27510, - Variant27511, - Variant27512, - Variant27513, - Variant27514, - Variant27515, - Variant27516, - Variant27517, - Variant27518, - Variant27519, - Variant27520, - Variant27521, - Variant27522, - Variant27523, - Variant27524, - Variant27525, - Variant27526, - Variant27527, - Variant27528, - Variant27529, - Variant27530, - Variant27531, - Variant27532, - Variant27533, - Variant27534, - Variant27535, - Variant27536, - Variant27537, - Variant27538, - Variant27539, - Variant27540, - Variant27541, - Variant27542, - Variant27543, - Variant27544, - Variant27545, - Variant27546, - Variant27547, - Variant27548, - Variant27549, - Variant27550, - Variant27551, - Variant27552, - Variant27553, - Variant27554, - Variant27555, - Variant27556, - Variant27557, - Variant27558, - Variant27559, - Variant27560, - Variant27561, - Variant27562, - Variant27563, - Variant27564, - Variant27565, - Variant27566, - Variant27567, - Variant27568, - Variant27569, - Variant27570, - Variant27571, - Variant27572, - Variant27573, - Variant27574, - Variant27575, - Variant27576, - Variant27577, - Variant27578, - Variant27579, - Variant27580, - Variant27581, - Variant27582, - Variant27583, - Variant27584, - Variant27585, - Variant27586, - Variant27587, - Variant27588, - Variant27589, - Variant27590, - Variant27591, - Variant27592, - Variant27593, - Variant27594, - Variant27595, - Variant27596, - Variant27597, - Variant27598, - Variant27599, - Variant27600, - Variant27601, - Variant27602, - Variant27603, - Variant27604, - Variant27605, - Variant27606, - Variant27607, - Variant27608, - Variant27609, - Variant27610, - Variant27611, - Variant27612, - Variant27613, - Variant27614, - Variant27615, - Variant27616, - Variant27617, - Variant27618, - Variant27619, - Variant27620, - Variant27621, - Variant27622, - Variant27623, - Variant27624, - Variant27625, - Variant27626, - Variant27627, - Variant27628, - Variant27629, - Variant27630, - Variant27631, - Variant27632, - Variant27633, - Variant27634, - Variant27635, - Variant27636, - Variant27637, - Variant27638, - Variant27639, - Variant27640, - Variant27641, - Variant27642, - Variant27643, - Variant27644, - Variant27645, - Variant27646, - Variant27647, - Variant27648, - Variant27649, - Variant27650, - Variant27651, - Variant27652, - Variant27653, - Variant27654, - Variant27655, - Variant27656, - Variant27657, - Variant27658, - Variant27659, - Variant27660, - Variant27661, - Variant27662, - Variant27663, - Variant27664, - Variant27665, - Variant27666, - Variant27667, - Variant27668, - Variant27669, - Variant27670, - Variant27671, - Variant27672, - Variant27673, - Variant27674, - Variant27675, - Variant27676, - Variant27677, - Variant27678, - Variant27679, - Variant27680, - Variant27681, - Variant27682, - Variant27683, - Variant27684, - Variant27685, - Variant27686, - Variant27687, - Variant27688, - Variant27689, - Variant27690, - Variant27691, - Variant27692, - Variant27693, - Variant27694, - Variant27695, - Variant27696, - Variant27697, - Variant27698, - Variant27699, - Variant27700, - Variant27701, - Variant27702, - Variant27703, - Variant27704, - Variant27705, - Variant27706, - Variant27707, - Variant27708, - Variant27709, - Variant27710, - Variant27711, - Variant27712, - Variant27713, - Variant27714, - Variant27715, - Variant27716, - Variant27717, - Variant27718, - Variant27719, - Variant27720, - Variant27721, - Variant27722, - Variant27723, - Variant27724, - Variant27725, - Variant27726, - Variant27727, - Variant27728, - Variant27729, - Variant27730, - Variant27731, - Variant27732, - Variant27733, - Variant27734, - Variant27735, - Variant27736, - Variant27737, - Variant27738, - Variant27739, - Variant27740, - Variant27741, - Variant27742, - Variant27743, - Variant27744, - Variant27745, - Variant27746, - Variant27747, - Variant27748, - Variant27749, - Variant27750, - Variant27751, - Variant27752, - Variant27753, - Variant27754, - Variant27755, - Variant27756, - Variant27757, - Variant27758, - Variant27759, - Variant27760, - Variant27761, - Variant27762, - Variant27763, - Variant27764, - Variant27765, - Variant27766, - Variant27767, - Variant27768, - Variant27769, - Variant27770, - Variant27771, - Variant27772, - Variant27773, - Variant27774, - Variant27775, - Variant27776, - Variant27777, - Variant27778, - Variant27779, - Variant27780, - Variant27781, - Variant27782, - Variant27783, - Variant27784, - Variant27785, - Variant27786, - Variant27787, - Variant27788, - Variant27789, - Variant27790, - Variant27791, - Variant27792, - Variant27793, - Variant27794, - Variant27795, - Variant27796, - Variant27797, - Variant27798, - Variant27799, - Variant27800, - Variant27801, - Variant27802, - Variant27803, - Variant27804, - Variant27805, - Variant27806, - Variant27807, - Variant27808, - Variant27809, - Variant27810, - Variant27811, - Variant27812, - Variant27813, - Variant27814, - Variant27815, - Variant27816, - Variant27817, - Variant27818, - Variant27819, - Variant27820, - Variant27821, - Variant27822, - Variant27823, - Variant27824, - Variant27825, - Variant27826, - Variant27827, - Variant27828, - Variant27829, - Variant27830, - Variant27831, - Variant27832, - Variant27833, - Variant27834, - Variant27835, - Variant27836, - Variant27837, - Variant27838, - Variant27839, - Variant27840, - Variant27841, - Variant27842, - Variant27843, - Variant27844, - Variant27845, - Variant27846, - Variant27847, - Variant27848, - Variant27849, - Variant27850, - Variant27851, - Variant27852, - Variant27853, - Variant27854, - Variant27855, - Variant27856, - Variant27857, - Variant27858, - Variant27859, - Variant27860, - Variant27861, - Variant27862, - Variant27863, - Variant27864, - Variant27865, - Variant27866, - Variant27867, - Variant27868, - Variant27869, - Variant27870, - Variant27871, - Variant27872, - Variant27873, - Variant27874, - Variant27875, - Variant27876, - Variant27877, - Variant27878, - Variant27879, - Variant27880, - Variant27881, - Variant27882, - Variant27883, - Variant27884, - Variant27885, - Variant27886, - Variant27887, - Variant27888, - Variant27889, - Variant27890, - Variant27891, - Variant27892, - Variant27893, - Variant27894, - Variant27895, - Variant27896, - Variant27897, - Variant27898, - Variant27899, - Variant27900, - Variant27901, - Variant27902, - Variant27903, - Variant27904, - Variant27905, - Variant27906, - Variant27907, - Variant27908, - Variant27909, - Variant27910, - Variant27911, - Variant27912, - Variant27913, - Variant27914, - Variant27915, - Variant27916, - Variant27917, - Variant27918, - Variant27919, - Variant27920, - Variant27921, - Variant27922, - Variant27923, - Variant27924, - Variant27925, - Variant27926, - Variant27927, - Variant27928, - Variant27929, - Variant27930, - Variant27931, - Variant27932, - Variant27933, - Variant27934, - Variant27935, - Variant27936, - Variant27937, - Variant27938, - Variant27939, - Variant27940, - Variant27941, - Variant27942, - Variant27943, - Variant27944, - Variant27945, - Variant27946, - Variant27947, - Variant27948, - Variant27949, - Variant27950, - Variant27951, - Variant27952, - Variant27953, - Variant27954, - Variant27955, - Variant27956, - Variant27957, - Variant27958, - Variant27959, - Variant27960, - Variant27961, - Variant27962, - Variant27963, - Variant27964, - Variant27965, - Variant27966, - Variant27967, - Variant27968, - Variant27969, - Variant27970, - Variant27971, - Variant27972, - Variant27973, - Variant27974, - Variant27975, - Variant27976, - Variant27977, - Variant27978, - Variant27979, - Variant27980, - Variant27981, - Variant27982, - Variant27983, - Variant27984, - Variant27985, - Variant27986, - Variant27987, - Variant27988, - Variant27989, - Variant27990, - Variant27991, - Variant27992, - Variant27993, - Variant27994, - Variant27995, - Variant27996, - Variant27997, - Variant27998, - Variant27999, - Variant28000, - Variant28001, - Variant28002, - Variant28003, - Variant28004, - Variant28005, - Variant28006, - Variant28007, - Variant28008, - Variant28009, - Variant28010, - Variant28011, - Variant28012, - Variant28013, - Variant28014, - Variant28015, - Variant28016, - Variant28017, - Variant28018, - Variant28019, - Variant28020, - Variant28021, - Variant28022, - Variant28023, - Variant28024, - Variant28025, - Variant28026, - Variant28027, - Variant28028, - Variant28029, - Variant28030, - Variant28031, - Variant28032, - Variant28033, - Variant28034, - Variant28035, - Variant28036, - Variant28037, - Variant28038, - Variant28039, - Variant28040, - Variant28041, - Variant28042, - Variant28043, - Variant28044, - Variant28045, - Variant28046, - Variant28047, - Variant28048, - Variant28049, - Variant28050, - Variant28051, - Variant28052, - Variant28053, - Variant28054, - Variant28055, - Variant28056, - Variant28057, - Variant28058, - Variant28059, - Variant28060, - Variant28061, - Variant28062, - Variant28063, - Variant28064, - Variant28065, - Variant28066, - Variant28067, - Variant28068, - Variant28069, - Variant28070, - Variant28071, - Variant28072, - Variant28073, - Variant28074, - Variant28075, - Variant28076, - Variant28077, - Variant28078, - Variant28079, - Variant28080, - Variant28081, - Variant28082, - Variant28083, - Variant28084, - Variant28085, - Variant28086, - Variant28087, - Variant28088, - Variant28089, - Variant28090, - Variant28091, - Variant28092, - Variant28093, - Variant28094, - Variant28095, - Variant28096, - Variant28097, - Variant28098, - Variant28099, - Variant28100, - Variant28101, - Variant28102, - Variant28103, - Variant28104, - Variant28105, - Variant28106, - Variant28107, - Variant28108, - Variant28109, - Variant28110, - Variant28111, - Variant28112, - Variant28113, - Variant28114, - Variant28115, - Variant28116, - Variant28117, - Variant28118, - Variant28119, - Variant28120, - Variant28121, - Variant28122, - Variant28123, - Variant28124, - Variant28125, - Variant28126, - Variant28127, - Variant28128, - Variant28129, - Variant28130, - Variant28131, - Variant28132, - Variant28133, - Variant28134, - Variant28135, - Variant28136, - Variant28137, - Variant28138, - Variant28139, - Variant28140, - Variant28141, - Variant28142, - Variant28143, - Variant28144, - Variant28145, - Variant28146, - Variant28147, - Variant28148, - Variant28149, - Variant28150, - Variant28151, - Variant28152, - Variant28153, - Variant28154, - Variant28155, - Variant28156, - Variant28157, - Variant28158, - Variant28159, - Variant28160, - Variant28161, - Variant28162, - Variant28163, - Variant28164, - Variant28165, - Variant28166, - Variant28167, - Variant28168, - Variant28169, - Variant28170, - Variant28171, - Variant28172, - Variant28173, - Variant28174, - Variant28175, - Variant28176, - Variant28177, - Variant28178, - Variant28179, - Variant28180, - Variant28181, - Variant28182, - Variant28183, - Variant28184, - Variant28185, - Variant28186, - Variant28187, - Variant28188, - Variant28189, - Variant28190, - Variant28191, - Variant28192, - Variant28193, - Variant28194, - Variant28195, - Variant28196, - Variant28197, - Variant28198, - Variant28199, - Variant28200, - Variant28201, - Variant28202, - Variant28203, - Variant28204, - Variant28205, - Variant28206, - Variant28207, - Variant28208, - Variant28209, - Variant28210, - Variant28211, - Variant28212, - Variant28213, - Variant28214, - Variant28215, - Variant28216, - Variant28217, - Variant28218, - Variant28219, - Variant28220, - Variant28221, - Variant28222, - Variant28223, - Variant28224, - Variant28225, - Variant28226, - Variant28227, - Variant28228, - Variant28229, - Variant28230, - Variant28231, - Variant28232, - Variant28233, - Variant28234, - Variant28235, - Variant28236, - Variant28237, - Variant28238, - Variant28239, - Variant28240, - Variant28241, - Variant28242, - Variant28243, - Variant28244, - Variant28245, - Variant28246, - Variant28247, - Variant28248, - Variant28249, - Variant28250, - Variant28251, - Variant28252, - Variant28253, - Variant28254, - Variant28255, - Variant28256, - Variant28257, - Variant28258, - Variant28259, - Variant28260, - Variant28261, - Variant28262, - Variant28263, - Variant28264, - Variant28265, - Variant28266, - Variant28267, - Variant28268, - Variant28269, - Variant28270, - Variant28271, - Variant28272, - Variant28273, - Variant28274, - Variant28275, - Variant28276, - Variant28277, - Variant28278, - Variant28279, - Variant28280, - Variant28281, - Variant28282, - Variant28283, - Variant28284, - Variant28285, - Variant28286, - Variant28287, - Variant28288, - Variant28289, - Variant28290, - Variant28291, - Variant28292, - Variant28293, - Variant28294, - Variant28295, - Variant28296, - Variant28297, - Variant28298, - Variant28299, - Variant28300, - Variant28301, - Variant28302, - Variant28303, - Variant28304, - Variant28305, - Variant28306, - Variant28307, - Variant28308, - Variant28309, - Variant28310, - Variant28311, - Variant28312, - Variant28313, - Variant28314, - Variant28315, - Variant28316, - Variant28317, - Variant28318, - Variant28319, - Variant28320, - Variant28321, - Variant28322, - Variant28323, - Variant28324, - Variant28325, - Variant28326, - Variant28327, - Variant28328, - Variant28329, - Variant28330, - Variant28331, - Variant28332, - Variant28333, - Variant28334, - Variant28335, - Variant28336, - Variant28337, - Variant28338, - Variant28339, - Variant28340, - Variant28341, - Variant28342, - Variant28343, - Variant28344, - Variant28345, - Variant28346, - Variant28347, - Variant28348, - Variant28349, - Variant28350, - Variant28351, - Variant28352, - Variant28353, - Variant28354, - Variant28355, - Variant28356, - Variant28357, - Variant28358, - Variant28359, - Variant28360, - Variant28361, - Variant28362, - Variant28363, - Variant28364, - Variant28365, - Variant28366, - Variant28367, - Variant28368, - Variant28369, - Variant28370, - Variant28371, - Variant28372, - Variant28373, - Variant28374, - Variant28375, - Variant28376, - Variant28377, - Variant28378, - Variant28379, - Variant28380, - Variant28381, - Variant28382, - Variant28383, - Variant28384, - Variant28385, - Variant28386, - Variant28387, - Variant28388, - Variant28389, - Variant28390, - Variant28391, - Variant28392, - Variant28393, - Variant28394, - Variant28395, - Variant28396, - Variant28397, - Variant28398, - Variant28399, - Variant28400, - Variant28401, - Variant28402, - Variant28403, - Variant28404, - Variant28405, - Variant28406, - Variant28407, - Variant28408, - Variant28409, - Variant28410, - Variant28411, - Variant28412, - Variant28413, - Variant28414, - Variant28415, - Variant28416, - Variant28417, - Variant28418, - Variant28419, - Variant28420, - Variant28421, - Variant28422, - Variant28423, - Variant28424, - Variant28425, - Variant28426, - Variant28427, - Variant28428, - Variant28429, - Variant28430, - Variant28431, - Variant28432, - Variant28433, - Variant28434, - Variant28435, - Variant28436, - Variant28437, - Variant28438, - Variant28439, - Variant28440, - Variant28441, - Variant28442, - Variant28443, - Variant28444, - Variant28445, - Variant28446, - Variant28447, - Variant28448, - Variant28449, - Variant28450, - Variant28451, - Variant28452, - Variant28453, - Variant28454, - Variant28455, - Variant28456, - Variant28457, - Variant28458, - Variant28459, - Variant28460, - Variant28461, - Variant28462, - Variant28463, - Variant28464, - Variant28465, - Variant28466, - Variant28467, - Variant28468, - Variant28469, - Variant28470, - Variant28471, - Variant28472, - Variant28473, - Variant28474, - Variant28475, - Variant28476, - Variant28477, - Variant28478, - Variant28479, - Variant28480, - Variant28481, - Variant28482, - Variant28483, - Variant28484, - Variant28485, - Variant28486, - Variant28487, - Variant28488, - Variant28489, - Variant28490, - Variant28491, - Variant28492, - Variant28493, - Variant28494, - Variant28495, - Variant28496, - Variant28497, - Variant28498, - Variant28499, - Variant28500, - Variant28501, - Variant28502, - Variant28503, - Variant28504, - Variant28505, - Variant28506, - Variant28507, - Variant28508, - Variant28509, - Variant28510, - Variant28511, - Variant28512, - Variant28513, - Variant28514, - Variant28515, - Variant28516, - Variant28517, - Variant28518, - Variant28519, - Variant28520, - Variant28521, - Variant28522, - Variant28523, - Variant28524, - Variant28525, - Variant28526, - Variant28527, - Variant28528, - Variant28529, - Variant28530, - Variant28531, - Variant28532, - Variant28533, - Variant28534, - Variant28535, - Variant28536, - Variant28537, - Variant28538, - Variant28539, - Variant28540, - Variant28541, - Variant28542, - Variant28543, - Variant28544, - Variant28545, - Variant28546, - Variant28547, - Variant28548, - Variant28549, - Variant28550, - Variant28551, - Variant28552, - Variant28553, - Variant28554, - Variant28555, - Variant28556, - Variant28557, - Variant28558, - Variant28559, - Variant28560, - Variant28561, - Variant28562, - Variant28563, - Variant28564, - Variant28565, - Variant28566, - Variant28567, - Variant28568, - Variant28569, - Variant28570, - Variant28571, - Variant28572, - Variant28573, - Variant28574, - Variant28575, - Variant28576, - Variant28577, - Variant28578, - Variant28579, - Variant28580, - Variant28581, - Variant28582, - Variant28583, - Variant28584, - Variant28585, - Variant28586, - Variant28587, - Variant28588, - Variant28589, - Variant28590, - Variant28591, - Variant28592, - Variant28593, - Variant28594, - Variant28595, - Variant28596, - Variant28597, - Variant28598, - Variant28599, - Variant28600, - Variant28601, - Variant28602, - Variant28603, - Variant28604, - Variant28605, - Variant28606, - Variant28607, - Variant28608, - Variant28609, - Variant28610, - Variant28611, - Variant28612, - Variant28613, - Variant28614, - Variant28615, - Variant28616, - Variant28617, - Variant28618, - Variant28619, - Variant28620, - Variant28621, - Variant28622, - Variant28623, - Variant28624, - Variant28625, - Variant28626, - Variant28627, - Variant28628, - Variant28629, - Variant28630, - Variant28631, - Variant28632, - Variant28633, - Variant28634, - Variant28635, - Variant28636, - Variant28637, - Variant28638, - Variant28639, - Variant28640, - Variant28641, - Variant28642, - Variant28643, - Variant28644, - Variant28645, - Variant28646, - Variant28647, - Variant28648, - Variant28649, - Variant28650, - Variant28651, - Variant28652, - Variant28653, - Variant28654, - Variant28655, - Variant28656, - Variant28657, - Variant28658, - Variant28659, - Variant28660, - Variant28661, - Variant28662, - Variant28663, - Variant28664, - Variant28665, - Variant28666, - Variant28667, - Variant28668, - Variant28669, - Variant28670, - Variant28671, - Variant28672, - Variant28673, - Variant28674, - Variant28675, - Variant28676, - Variant28677, - Variant28678, - Variant28679, - Variant28680, - Variant28681, - Variant28682, - Variant28683, - Variant28684, - Variant28685, - Variant28686, - Variant28687, - Variant28688, - Variant28689, - Variant28690, - Variant28691, - Variant28692, - Variant28693, - Variant28694, - Variant28695, - Variant28696, - Variant28697, - Variant28698, - Variant28699, - Variant28700, - Variant28701, - Variant28702, - Variant28703, - Variant28704, - Variant28705, - Variant28706, - Variant28707, - Variant28708, - Variant28709, - Variant28710, - Variant28711, - Variant28712, - Variant28713, - Variant28714, - Variant28715, - Variant28716, - Variant28717, - Variant28718, - Variant28719, - Variant28720, - Variant28721, - Variant28722, - Variant28723, - Variant28724, - Variant28725, - Variant28726, - Variant28727, - Variant28728, - Variant28729, - Variant28730, - Variant28731, - Variant28732, - Variant28733, - Variant28734, - Variant28735, - Variant28736, - Variant28737, - Variant28738, - Variant28739, - Variant28740, - Variant28741, - Variant28742, - Variant28743, - Variant28744, - Variant28745, - Variant28746, - Variant28747, - Variant28748, - Variant28749, - Variant28750, - Variant28751, - Variant28752, - Variant28753, - Variant28754, - Variant28755, - Variant28756, - Variant28757, - Variant28758, - Variant28759, - Variant28760, - Variant28761, - Variant28762, - Variant28763, - Variant28764, - Variant28765, - Variant28766, - Variant28767, - Variant28768, - Variant28769, - Variant28770, - Variant28771, - Variant28772, - Variant28773, - Variant28774, - Variant28775, - Variant28776, - Variant28777, - Variant28778, - Variant28779, - Variant28780, - Variant28781, - Variant28782, - Variant28783, - Variant28784, - Variant28785, - Variant28786, - Variant28787, - Variant28788, - Variant28789, - Variant28790, - Variant28791, - Variant28792, - Variant28793, - Variant28794, - Variant28795, - Variant28796, - Variant28797, - Variant28798, - Variant28799, - Variant28800, - Variant28801, - Variant28802, - Variant28803, - Variant28804, - Variant28805, - Variant28806, - Variant28807, - Variant28808, - Variant28809, - Variant28810, - Variant28811, - Variant28812, - Variant28813, - Variant28814, - Variant28815, - Variant28816, - Variant28817, - Variant28818, - Variant28819, - Variant28820, - Variant28821, - Variant28822, - Variant28823, - Variant28824, - Variant28825, - Variant28826, - Variant28827, - Variant28828, - Variant28829, - Variant28830, - Variant28831, - Variant28832, - Variant28833, - Variant28834, - Variant28835, - Variant28836, - Variant28837, - Variant28838, - Variant28839, - Variant28840, - Variant28841, - Variant28842, - Variant28843, - Variant28844, - Variant28845, - Variant28846, - Variant28847, - Variant28848, - Variant28849, - Variant28850, - Variant28851, - Variant28852, - Variant28853, - Variant28854, - Variant28855, - Variant28856, - Variant28857, - Variant28858, - Variant28859, - Variant28860, - Variant28861, - Variant28862, - Variant28863, - Variant28864, - Variant28865, - Variant28866, - Variant28867, - Variant28868, - Variant28869, - Variant28870, - Variant28871, - Variant28872, - Variant28873, - Variant28874, - Variant28875, - Variant28876, - Variant28877, - Variant28878, - Variant28879, - Variant28880, - Variant28881, - Variant28882, - Variant28883, - Variant28884, - Variant28885, - Variant28886, - Variant28887, - Variant28888, - Variant28889, - Variant28890, - Variant28891, - Variant28892, - Variant28893, - Variant28894, - Variant28895, - Variant28896, - Variant28897, - Variant28898, - Variant28899, - Variant28900, - Variant28901, - Variant28902, - Variant28903, - Variant28904, - Variant28905, - Variant28906, - Variant28907, - Variant28908, - Variant28909, - Variant28910, - Variant28911, - Variant28912, - Variant28913, - Variant28914, - Variant28915, - Variant28916, - Variant28917, - Variant28918, - Variant28919, - Variant28920, - Variant28921, - Variant28922, - Variant28923, - Variant28924, - Variant28925, - Variant28926, - Variant28927, - Variant28928, - Variant28929, - Variant28930, - Variant28931, - Variant28932, - Variant28933, - Variant28934, - Variant28935, - Variant28936, - Variant28937, - Variant28938, - Variant28939, - Variant28940, - Variant28941, - Variant28942, - Variant28943, - Variant28944, - Variant28945, - Variant28946, - Variant28947, - Variant28948, - Variant28949, - Variant28950, - Variant28951, - Variant28952, - Variant28953, - Variant28954, - Variant28955, - Variant28956, - Variant28957, - Variant28958, - Variant28959, - Variant28960, - Variant28961, - Variant28962, - Variant28963, - Variant28964, - Variant28965, - Variant28966, - Variant28967, - Variant28968, - Variant28969, - Variant28970, - Variant28971, - Variant28972, - Variant28973, - Variant28974, - Variant28975, - Variant28976, - Variant28977, - Variant28978, - Variant28979, - Variant28980, - Variant28981, - Variant28982, - Variant28983, - Variant28984, - Variant28985, - Variant28986, - Variant28987, - Variant28988, - Variant28989, - Variant28990, - Variant28991, - Variant28992, - Variant28993, - Variant28994, - Variant28995, - Variant28996, - Variant28997, - Variant28998, - Variant28999, - Variant29000, - Variant29001, - Variant29002, - Variant29003, - Variant29004, - Variant29005, - Variant29006, - Variant29007, - Variant29008, - Variant29009, - Variant29010, - Variant29011, - Variant29012, - Variant29013, - Variant29014, - Variant29015, - Variant29016, - Variant29017, - Variant29018, - Variant29019, - Variant29020, - Variant29021, - Variant29022, - Variant29023, - Variant29024, - Variant29025, - Variant29026, - Variant29027, - Variant29028, - Variant29029, - Variant29030, - Variant29031, - Variant29032, - Variant29033, - Variant29034, - Variant29035, - Variant29036, - Variant29037, - Variant29038, - Variant29039, - Variant29040, - Variant29041, - Variant29042, - Variant29043, - Variant29044, - Variant29045, - Variant29046, - Variant29047, - Variant29048, - Variant29049, - Variant29050, - Variant29051, - Variant29052, - Variant29053, - Variant29054, - Variant29055, - Variant29056, - Variant29057, - Variant29058, - Variant29059, - Variant29060, - Variant29061, - Variant29062, - Variant29063, - Variant29064, - Variant29065, - Variant29066, - Variant29067, - Variant29068, - Variant29069, - Variant29070, - Variant29071, - Variant29072, - Variant29073, - Variant29074, - Variant29075, - Variant29076, - Variant29077, - Variant29078, - Variant29079, - Variant29080, - Variant29081, - Variant29082, - Variant29083, - Variant29084, - Variant29085, - Variant29086, - Variant29087, - Variant29088, - Variant29089, - Variant29090, - Variant29091, - Variant29092, - Variant29093, - Variant29094, - Variant29095, - Variant29096, - Variant29097, - Variant29098, - Variant29099, - Variant29100, - Variant29101, - Variant29102, - Variant29103, - Variant29104, - Variant29105, - Variant29106, - Variant29107, - Variant29108, - Variant29109, - Variant29110, - Variant29111, - Variant29112, - Variant29113, - Variant29114, - Variant29115, - Variant29116, - Variant29117, - Variant29118, - Variant29119, - Variant29120, - Variant29121, - Variant29122, - Variant29123, - Variant29124, - Variant29125, - Variant29126, - Variant29127, - Variant29128, - Variant29129, - Variant29130, - Variant29131, - Variant29132, - Variant29133, - Variant29134, - Variant29135, - Variant29136, - Variant29137, - Variant29138, - Variant29139, - Variant29140, - Variant29141, - Variant29142, - Variant29143, - Variant29144, - Variant29145, - Variant29146, - Variant29147, - Variant29148, - Variant29149, - Variant29150, - Variant29151, - Variant29152, - Variant29153, - Variant29154, - Variant29155, - Variant29156, - Variant29157, - Variant29158, - Variant29159, - Variant29160, - Variant29161, - Variant29162, - Variant29163, - Variant29164, - Variant29165, - Variant29166, - Variant29167, - Variant29168, - Variant29169, - Variant29170, - Variant29171, - Variant29172, - Variant29173, - Variant29174, - Variant29175, - Variant29176, - Variant29177, - Variant29178, - Variant29179, - Variant29180, - Variant29181, - Variant29182, - Variant29183, - Variant29184, - Variant29185, - Variant29186, - Variant29187, - Variant29188, - Variant29189, - Variant29190, - Variant29191, - Variant29192, - Variant29193, - Variant29194, - Variant29195, - Variant29196, - Variant29197, - Variant29198, - Variant29199, - Variant29200, - Variant29201, - Variant29202, - Variant29203, - Variant29204, - Variant29205, - Variant29206, - Variant29207, - Variant29208, - Variant29209, - Variant29210, - Variant29211, - Variant29212, - Variant29213, - Variant29214, - Variant29215, - Variant29216, - Variant29217, - Variant29218, - Variant29219, - Variant29220, - Variant29221, - Variant29222, - Variant29223, - Variant29224, - Variant29225, - Variant29226, - Variant29227, - Variant29228, - Variant29229, - Variant29230, - Variant29231, - Variant29232, - Variant29233, - Variant29234, - Variant29235, - Variant29236, - Variant29237, - Variant29238, - Variant29239, - Variant29240, - Variant29241, - Variant29242, - Variant29243, - Variant29244, - Variant29245, - Variant29246, - Variant29247, - Variant29248, - Variant29249, - Variant29250, - Variant29251, - Variant29252, - Variant29253, - Variant29254, - Variant29255, - Variant29256, - Variant29257, - Variant29258, - Variant29259, - Variant29260, - Variant29261, - Variant29262, - Variant29263, - Variant29264, - Variant29265, - Variant29266, - Variant29267, - Variant29268, - Variant29269, - Variant29270, - Variant29271, - Variant29272, - Variant29273, - Variant29274, - Variant29275, - Variant29276, - Variant29277, - Variant29278, - Variant29279, - Variant29280, - Variant29281, - Variant29282, - Variant29283, - Variant29284, - Variant29285, - Variant29286, - Variant29287, - Variant29288, - Variant29289, - Variant29290, - Variant29291, - Variant29292, - Variant29293, - Variant29294, - Variant29295, - Variant29296, - Variant29297, - Variant29298, - Variant29299, - Variant29300, - Variant29301, - Variant29302, - Variant29303, - Variant29304, - Variant29305, - Variant29306, - Variant29307, - Variant29308, - Variant29309, - Variant29310, - Variant29311, - Variant29312, - Variant29313, - Variant29314, - Variant29315, - Variant29316, - Variant29317, - Variant29318, - Variant29319, - Variant29320, - Variant29321, - Variant29322, - Variant29323, - Variant29324, - Variant29325, - Variant29326, - Variant29327, - Variant29328, - Variant29329, - Variant29330, - Variant29331, - Variant29332, - Variant29333, - Variant29334, - Variant29335, - Variant29336, - Variant29337, - Variant29338, - Variant29339, - Variant29340, - Variant29341, - Variant29342, - Variant29343, - Variant29344, - Variant29345, - Variant29346, - Variant29347, - Variant29348, - Variant29349, - Variant29350, - Variant29351, - Variant29352, - Variant29353, - Variant29354, - Variant29355, - Variant29356, - Variant29357, - Variant29358, - Variant29359, - Variant29360, - Variant29361, - Variant29362, - Variant29363, - Variant29364, - Variant29365, - Variant29366, - Variant29367, - Variant29368, - Variant29369, - Variant29370, - Variant29371, - Variant29372, - Variant29373, - Variant29374, - Variant29375, - Variant29376, - Variant29377, - Variant29378, - Variant29379, - Variant29380, - Variant29381, - Variant29382, - Variant29383, - Variant29384, - Variant29385, - Variant29386, - Variant29387, - Variant29388, - Variant29389, - Variant29390, - Variant29391, - Variant29392, - Variant29393, - Variant29394, - Variant29395, - Variant29396, - Variant29397, - Variant29398, - Variant29399, - Variant29400, - Variant29401, - Variant29402, - Variant29403, - Variant29404, - Variant29405, - Variant29406, - Variant29407, - Variant29408, - Variant29409, - Variant29410, - Variant29411, - Variant29412, - Variant29413, - Variant29414, - Variant29415, - Variant29416, - Variant29417, - Variant29418, - Variant29419, - Variant29420, - Variant29421, - Variant29422, - Variant29423, - Variant29424, - Variant29425, - Variant29426, - Variant29427, - Variant29428, - Variant29429, - Variant29430, - Variant29431, - Variant29432, - Variant29433, - Variant29434, - Variant29435, - Variant29436, - Variant29437, - Variant29438, - Variant29439, - Variant29440, - Variant29441, - Variant29442, - Variant29443, - Variant29444, - Variant29445, - Variant29446, - Variant29447, - Variant29448, - Variant29449, - Variant29450, - Variant29451, - Variant29452, - Variant29453, - Variant29454, - Variant29455, - Variant29456, - Variant29457, - Variant29458, - Variant29459, - Variant29460, - Variant29461, - Variant29462, - Variant29463, - Variant29464, - Variant29465, - Variant29466, - Variant29467, - Variant29468, - Variant29469, - Variant29470, - Variant29471, - Variant29472, - Variant29473, - Variant29474, - Variant29475, - Variant29476, - Variant29477, - Variant29478, - Variant29479, - Variant29480, - Variant29481, - Variant29482, - Variant29483, - Variant29484, - Variant29485, - Variant29486, - Variant29487, - Variant29488, - Variant29489, - Variant29490, - Variant29491, - Variant29492, - Variant29493, - Variant29494, - Variant29495, - Variant29496, - Variant29497, - Variant29498, - Variant29499, - Variant29500, - Variant29501, - Variant29502, - Variant29503, - Variant29504, - Variant29505, - Variant29506, - Variant29507, - Variant29508, - Variant29509, - Variant29510, - Variant29511, - Variant29512, - Variant29513, - Variant29514, - Variant29515, - Variant29516, - Variant29517, - Variant29518, - Variant29519, - Variant29520, - Variant29521, - Variant29522, - Variant29523, - Variant29524, - Variant29525, - Variant29526, - Variant29527, - Variant29528, - Variant29529, - Variant29530, - Variant29531, - Variant29532, - Variant29533, - Variant29534, - Variant29535, - Variant29536, - Variant29537, - Variant29538, - Variant29539, - Variant29540, - Variant29541, - Variant29542, - Variant29543, - Variant29544, - Variant29545, - Variant29546, - Variant29547, - Variant29548, - Variant29549, - Variant29550, - Variant29551, - Variant29552, - Variant29553, - Variant29554, - Variant29555, - Variant29556, - Variant29557, - Variant29558, - Variant29559, - Variant29560, - Variant29561, - Variant29562, - Variant29563, - Variant29564, - Variant29565, - Variant29566, - Variant29567, - Variant29568, - Variant29569, - Variant29570, - Variant29571, - Variant29572, - Variant29573, - Variant29574, - Variant29575, - Variant29576, - Variant29577, - Variant29578, - Variant29579, - Variant29580, - Variant29581, - Variant29582, - Variant29583, - Variant29584, - Variant29585, - Variant29586, - Variant29587, - Variant29588, - Variant29589, - Variant29590, - Variant29591, - Variant29592, - Variant29593, - Variant29594, - Variant29595, - Variant29596, - Variant29597, - Variant29598, - Variant29599, - Variant29600, - Variant29601, - Variant29602, - Variant29603, - Variant29604, - Variant29605, - Variant29606, - Variant29607, - Variant29608, - Variant29609, - Variant29610, - Variant29611, - Variant29612, - Variant29613, - Variant29614, - Variant29615, - Variant29616, - Variant29617, - Variant29618, - Variant29619, - Variant29620, - Variant29621, - Variant29622, - Variant29623, - Variant29624, - Variant29625, - Variant29626, - Variant29627, - Variant29628, - Variant29629, - Variant29630, - Variant29631, - Variant29632, - Variant29633, - Variant29634, - Variant29635, - Variant29636, - Variant29637, - Variant29638, - Variant29639, - Variant29640, - Variant29641, - Variant29642, - Variant29643, - Variant29644, - Variant29645, - Variant29646, - Variant29647, - Variant29648, - Variant29649, - Variant29650, - Variant29651, - Variant29652, - Variant29653, - Variant29654, - Variant29655, - Variant29656, - Variant29657, - Variant29658, - Variant29659, - Variant29660, - Variant29661, - Variant29662, - Variant29663, - Variant29664, - Variant29665, - Variant29666, - Variant29667, - Variant29668, - Variant29669, - Variant29670, - Variant29671, - Variant29672, - Variant29673, - Variant29674, - Variant29675, - Variant29676, - Variant29677, - Variant29678, - Variant29679, - Variant29680, - Variant29681, - Variant29682, - Variant29683, - Variant29684, - Variant29685, - Variant29686, - Variant29687, - Variant29688, - Variant29689, - Variant29690, - Variant29691, - Variant29692, - Variant29693, - Variant29694, - Variant29695, - Variant29696, - Variant29697, - Variant29698, - Variant29699, - Variant29700, - Variant29701, - Variant29702, - Variant29703, - Variant29704, - Variant29705, - Variant29706, - Variant29707, - Variant29708, - Variant29709, - Variant29710, - Variant29711, - Variant29712, - Variant29713, - Variant29714, - Variant29715, - Variant29716, - Variant29717, - Variant29718, - Variant29719, - Variant29720, - Variant29721, - Variant29722, - Variant29723, - Variant29724, - Variant29725, - Variant29726, - Variant29727, - Variant29728, - Variant29729, - Variant29730, - Variant29731, - Variant29732, - Variant29733, - Variant29734, - Variant29735, - Variant29736, - Variant29737, - Variant29738, - Variant29739, - Variant29740, - Variant29741, - Variant29742, - Variant29743, - Variant29744, - Variant29745, - Variant29746, - Variant29747, - Variant29748, - Variant29749, - Variant29750, - Variant29751, - Variant29752, - Variant29753, - Variant29754, - Variant29755, - Variant29756, - Variant29757, - Variant29758, - Variant29759, - Variant29760, - Variant29761, - Variant29762, - Variant29763, - Variant29764, - Variant29765, - Variant29766, - Variant29767, - Variant29768, - Variant29769, - Variant29770, - Variant29771, - Variant29772, - Variant29773, - Variant29774, - Variant29775, - Variant29776, - Variant29777, - Variant29778, - Variant29779, - Variant29780, - Variant29781, - Variant29782, - Variant29783, - Variant29784, - Variant29785, - Variant29786, - Variant29787, - Variant29788, - Variant29789, - Variant29790, - Variant29791, - Variant29792, - Variant29793, - Variant29794, - Variant29795, - Variant29796, - Variant29797, - Variant29798, - Variant29799, - Variant29800, - Variant29801, - Variant29802, - Variant29803, - Variant29804, - Variant29805, - Variant29806, - Variant29807, - Variant29808, - Variant29809, - Variant29810, - Variant29811, - Variant29812, - Variant29813, - Variant29814, - Variant29815, - Variant29816, - Variant29817, - Variant29818, - Variant29819, - Variant29820, - Variant29821, - Variant29822, - Variant29823, - Variant29824, - Variant29825, - Variant29826, - Variant29827, - Variant29828, - Variant29829, - Variant29830, - Variant29831, - Variant29832, - Variant29833, - Variant29834, - Variant29835, - Variant29836, - Variant29837, - Variant29838, - Variant29839, - Variant29840, - Variant29841, - Variant29842, - Variant29843, - Variant29844, - Variant29845, - Variant29846, - Variant29847, - Variant29848, - Variant29849, - Variant29850, - Variant29851, - Variant29852, - Variant29853, - Variant29854, - Variant29855, - Variant29856, - Variant29857, - Variant29858, - Variant29859, - Variant29860, - Variant29861, - Variant29862, - Variant29863, - Variant29864, - Variant29865, - Variant29866, - Variant29867, - Variant29868, - Variant29869, - Variant29870, - Variant29871, - Variant29872, - Variant29873, - Variant29874, - Variant29875, - Variant29876, - Variant29877, - Variant29878, - Variant29879, - Variant29880, - Variant29881, - Variant29882, - Variant29883, - Variant29884, - Variant29885, - Variant29886, - Variant29887, - Variant29888, - Variant29889, - Variant29890, - Variant29891, - Variant29892, - Variant29893, - Variant29894, - Variant29895, - Variant29896, - Variant29897, - Variant29898, - Variant29899, - Variant29900, - Variant29901, - Variant29902, - Variant29903, - Variant29904, - Variant29905, - Variant29906, - Variant29907, - Variant29908, - Variant29909, - Variant29910, - Variant29911, - Variant29912, - Variant29913, - Variant29914, - Variant29915, - Variant29916, - Variant29917, - Variant29918, - Variant29919, - Variant29920, - Variant29921, - Variant29922, - Variant29923, - Variant29924, - Variant29925, - Variant29926, - Variant29927, - Variant29928, - Variant29929, - Variant29930, - Variant29931, - Variant29932, - Variant29933, - Variant29934, - Variant29935, - Variant29936, - Variant29937, - Variant29938, - Variant29939, - Variant29940, - Variant29941, - Variant29942, - Variant29943, - Variant29944, - Variant29945, - Variant29946, - Variant29947, - Variant29948, - Variant29949, - Variant29950, - Variant29951, - Variant29952, - Variant29953, - Variant29954, - Variant29955, - Variant29956, - Variant29957, - Variant29958, - Variant29959, - Variant29960, - Variant29961, - Variant29962, - Variant29963, - Variant29964, - Variant29965, - Variant29966, - Variant29967, - Variant29968, - Variant29969, - Variant29970, - Variant29971, - Variant29972, - Variant29973, - Variant29974, - Variant29975, - Variant29976, - Variant29977, - Variant29978, - Variant29979, - Variant29980, - Variant29981, - Variant29982, - Variant29983, - Variant29984, - Variant29985, - Variant29986, - Variant29987, - Variant29988, - Variant29989, - Variant29990, - Variant29991, - Variant29992, - Variant29993, - Variant29994, - Variant29995, - Variant29996, - Variant29997, - Variant29998, - Variant29999, - Variant30000, - Variant30001, - Variant30002, - Variant30003, - Variant30004, - Variant30005, - Variant30006, - Variant30007, - Variant30008, - Variant30009, - Variant30010, - Variant30011, - Variant30012, - Variant30013, - Variant30014, - Variant30015, - Variant30016, - Variant30017, - Variant30018, - Variant30019, - Variant30020, - Variant30021, - Variant30022, - Variant30023, - Variant30024, - Variant30025, - Variant30026, - Variant30027, - Variant30028, - Variant30029, - Variant30030, - Variant30031, - Variant30032, - Variant30033, - Variant30034, - Variant30035, - Variant30036, - Variant30037, - Variant30038, - Variant30039, - Variant30040, - Variant30041, - Variant30042, - Variant30043, - Variant30044, - Variant30045, - Variant30046, - Variant30047, - Variant30048, - Variant30049, - Variant30050, - Variant30051, - Variant30052, - Variant30053, - Variant30054, - Variant30055, - Variant30056, - Variant30057, - Variant30058, - Variant30059, - Variant30060, - Variant30061, - Variant30062, - Variant30063, - Variant30064, - Variant30065, - Variant30066, - Variant30067, - Variant30068, - Variant30069, - Variant30070, - Variant30071, - Variant30072, - Variant30073, - Variant30074, - Variant30075, - Variant30076, - Variant30077, - Variant30078, - Variant30079, - Variant30080, - Variant30081, - Variant30082, - Variant30083, - Variant30084, - Variant30085, - Variant30086, - Variant30087, - Variant30088, - Variant30089, - Variant30090, - Variant30091, - Variant30092, - Variant30093, - Variant30094, - Variant30095, - Variant30096, - Variant30097, - Variant30098, - Variant30099, - Variant30100, - Variant30101, - Variant30102, - Variant30103, - Variant30104, - Variant30105, - Variant30106, - Variant30107, - Variant30108, - Variant30109, - Variant30110, - Variant30111, - Variant30112, - Variant30113, - Variant30114, - Variant30115, - Variant30116, - Variant30117, - Variant30118, - Variant30119, - Variant30120, - Variant30121, - Variant30122, - Variant30123, - Variant30124, - Variant30125, - Variant30126, - Variant30127, - Variant30128, - Variant30129, - Variant30130, - Variant30131, - Variant30132, - Variant30133, - Variant30134, - Variant30135, - Variant30136, - Variant30137, - Variant30138, - Variant30139, - Variant30140, - Variant30141, - Variant30142, - Variant30143, - Variant30144, - Variant30145, - Variant30146, - Variant30147, - Variant30148, - Variant30149, - Variant30150, - Variant30151, - Variant30152, - Variant30153, - Variant30154, - Variant30155, - Variant30156, - Variant30157, - Variant30158, - Variant30159, - Variant30160, - Variant30161, - Variant30162, - Variant30163, - Variant30164, - Variant30165, - Variant30166, - Variant30167, - Variant30168, - Variant30169, - Variant30170, - Variant30171, - Variant30172, - Variant30173, - Variant30174, - Variant30175, - Variant30176, - Variant30177, - Variant30178, - Variant30179, - Variant30180, - Variant30181, - Variant30182, - Variant30183, - Variant30184, - Variant30185, - Variant30186, - Variant30187, - Variant30188, - Variant30189, - Variant30190, - Variant30191, - Variant30192, - Variant30193, - Variant30194, - Variant30195, - Variant30196, - Variant30197, - Variant30198, - Variant30199, - Variant30200, - Variant30201, - Variant30202, - Variant30203, - Variant30204, - Variant30205, - Variant30206, - Variant30207, - Variant30208, - Variant30209, - Variant30210, - Variant30211, - Variant30212, - Variant30213, - Variant30214, - Variant30215, - Variant30216, - Variant30217, - Variant30218, - Variant30219, - Variant30220, - Variant30221, - Variant30222, - Variant30223, - Variant30224, - Variant30225, - Variant30226, - Variant30227, - Variant30228, - Variant30229, - Variant30230, - Variant30231, - Variant30232, - Variant30233, - Variant30234, - Variant30235, - Variant30236, - Variant30237, - Variant30238, - Variant30239, - Variant30240, - Variant30241, - Variant30242, - Variant30243, - Variant30244, - Variant30245, - Variant30246, - Variant30247, - Variant30248, - Variant30249, - Variant30250, - Variant30251, - Variant30252, - Variant30253, - Variant30254, - Variant30255, - Variant30256, - Variant30257, - Variant30258, - Variant30259, - Variant30260, - Variant30261, - Variant30262, - Variant30263, - Variant30264, - Variant30265, - Variant30266, - Variant30267, - Variant30268, - Variant30269, - Variant30270, - Variant30271, - Variant30272, - Variant30273, - Variant30274, - Variant30275, - Variant30276, - Variant30277, - Variant30278, - Variant30279, - Variant30280, - Variant30281, - Variant30282, - Variant30283, - Variant30284, - Variant30285, - Variant30286, - Variant30287, - Variant30288, - Variant30289, - Variant30290, - Variant30291, - Variant30292, - Variant30293, - Variant30294, - Variant30295, - Variant30296, - Variant30297, - Variant30298, - Variant30299, - Variant30300, - Variant30301, - Variant30302, - Variant30303, - Variant30304, - Variant30305, - Variant30306, - Variant30307, - Variant30308, - Variant30309, - Variant30310, - Variant30311, - Variant30312, - Variant30313, - Variant30314, - Variant30315, - Variant30316, - Variant30317, - Variant30318, - Variant30319, - Variant30320, - Variant30321, - Variant30322, - Variant30323, - Variant30324, - Variant30325, - Variant30326, - Variant30327, - Variant30328, - Variant30329, - Variant30330, - Variant30331, - Variant30332, - Variant30333, - Variant30334, - Variant30335, - Variant30336, - Variant30337, - Variant30338, - Variant30339, - Variant30340, - Variant30341, - Variant30342, - Variant30343, - Variant30344, - Variant30345, - Variant30346, - Variant30347, - Variant30348, - Variant30349, - Variant30350, - Variant30351, - Variant30352, - Variant30353, - Variant30354, - Variant30355, - Variant30356, - Variant30357, - Variant30358, - Variant30359, - Variant30360, - Variant30361, - Variant30362, - Variant30363, - Variant30364, - Variant30365, - Variant30366, - Variant30367, - Variant30368, - Variant30369, - Variant30370, - Variant30371, - Variant30372, - Variant30373, - Variant30374, - Variant30375, - Variant30376, - Variant30377, - Variant30378, - Variant30379, - Variant30380, - Variant30381, - Variant30382, - Variant30383, - Variant30384, - Variant30385, - Variant30386, - Variant30387, - Variant30388, - Variant30389, - Variant30390, - Variant30391, - Variant30392, - Variant30393, - Variant30394, - Variant30395, - Variant30396, - Variant30397, - Variant30398, - Variant30399, - Variant30400, - Variant30401, - Variant30402, - Variant30403, - Variant30404, - Variant30405, - Variant30406, - Variant30407, - Variant30408, - Variant30409, - Variant30410, - Variant30411, - Variant30412, - Variant30413, - Variant30414, - Variant30415, - Variant30416, - Variant30417, - Variant30418, - Variant30419, - Variant30420, - Variant30421, - Variant30422, - Variant30423, - Variant30424, - Variant30425, - Variant30426, - Variant30427, - Variant30428, - Variant30429, - Variant30430, - Variant30431, - Variant30432, - Variant30433, - Variant30434, - Variant30435, - Variant30436, - Variant30437, - Variant30438, - Variant30439, - Variant30440, - Variant30441, - Variant30442, - Variant30443, - Variant30444, - Variant30445, - Variant30446, - Variant30447, - Variant30448, - Variant30449, - Variant30450, - Variant30451, - Variant30452, - Variant30453, - Variant30454, - Variant30455, - Variant30456, - Variant30457, - Variant30458, - Variant30459, - Variant30460, - Variant30461, - Variant30462, - Variant30463, - Variant30464, - Variant30465, - Variant30466, - Variant30467, - Variant30468, - Variant30469, - Variant30470, - Variant30471, - Variant30472, - Variant30473, - Variant30474, - Variant30475, - Variant30476, - Variant30477, - Variant30478, - Variant30479, - Variant30480, - Variant30481, - Variant30482, - Variant30483, - Variant30484, - Variant30485, - Variant30486, - Variant30487, - Variant30488, - Variant30489, - Variant30490, - Variant30491, - Variant30492, - Variant30493, - Variant30494, - Variant30495, - Variant30496, - Variant30497, - Variant30498, - Variant30499, - Variant30500, - Variant30501, - Variant30502, - Variant30503, - Variant30504, - Variant30505, - Variant30506, - Variant30507, - Variant30508, - Variant30509, - Variant30510, - Variant30511, - Variant30512, - Variant30513, - Variant30514, - Variant30515, - Variant30516, - Variant30517, - Variant30518, - Variant30519, - Variant30520, - Variant30521, - Variant30522, - Variant30523, - Variant30524, - Variant30525, - Variant30526, - Variant30527, - Variant30528, - Variant30529, - Variant30530, - Variant30531, - Variant30532, - Variant30533, - Variant30534, - Variant30535, - Variant30536, - Variant30537, - Variant30538, - Variant30539, - Variant30540, - Variant30541, - Variant30542, - Variant30543, - Variant30544, - Variant30545, - Variant30546, - Variant30547, - Variant30548, - Variant30549, - Variant30550, - Variant30551, - Variant30552, - Variant30553, - Variant30554, - Variant30555, - Variant30556, - Variant30557, - Variant30558, - Variant30559, - Variant30560, - Variant30561, - Variant30562, - Variant30563, - Variant30564, - Variant30565, - Variant30566, - Variant30567, - Variant30568, - Variant30569, - Variant30570, - Variant30571, - Variant30572, - Variant30573, - Variant30574, - Variant30575, - Variant30576, - Variant30577, - Variant30578, - Variant30579, - Variant30580, - Variant30581, - Variant30582, - Variant30583, - Variant30584, - Variant30585, - Variant30586, - Variant30587, - Variant30588, - Variant30589, - Variant30590, - Variant30591, - Variant30592, - Variant30593, - Variant30594, - Variant30595, - Variant30596, - Variant30597, - Variant30598, - Variant30599, - Variant30600, - Variant30601, - Variant30602, - Variant30603, - Variant30604, - Variant30605, - Variant30606, - Variant30607, - Variant30608, - Variant30609, - Variant30610, - Variant30611, - Variant30612, - Variant30613, - Variant30614, - Variant30615, - Variant30616, - Variant30617, - Variant30618, - Variant30619, - Variant30620, - Variant30621, - Variant30622, - Variant30623, - Variant30624, - Variant30625, - Variant30626, - Variant30627, - Variant30628, - Variant30629, - Variant30630, - Variant30631, - Variant30632, - Variant30633, - Variant30634, - Variant30635, - Variant30636, - Variant30637, - Variant30638, - Variant30639, - Variant30640, - Variant30641, - Variant30642, - Variant30643, - Variant30644, - Variant30645, - Variant30646, - Variant30647, - Variant30648, - Variant30649, - Variant30650, - Variant30651, - Variant30652, - Variant30653, - Variant30654, - Variant30655, - Variant30656, - Variant30657, - Variant30658, - Variant30659, - Variant30660, - Variant30661, - Variant30662, - Variant30663, - Variant30664, - Variant30665, - Variant30666, - Variant30667, - Variant30668, - Variant30669, - Variant30670, - Variant30671, - Variant30672, - Variant30673, - Variant30674, - Variant30675, - Variant30676, - Variant30677, - Variant30678, - Variant30679, - Variant30680, - Variant30681, - Variant30682, - Variant30683, - Variant30684, - Variant30685, - Variant30686, - Variant30687, - Variant30688, - Variant30689, - Variant30690, - Variant30691, - Variant30692, - Variant30693, - Variant30694, - Variant30695, - Variant30696, - Variant30697, - Variant30698, - Variant30699, - Variant30700, - Variant30701, - Variant30702, - Variant30703, - Variant30704, - Variant30705, - Variant30706, - Variant30707, - Variant30708, - Variant30709, - Variant30710, - Variant30711, - Variant30712, - Variant30713, - Variant30714, - Variant30715, - Variant30716, - Variant30717, - Variant30718, - Variant30719, - Variant30720, - Variant30721, - Variant30722, - Variant30723, - Variant30724, - Variant30725, - Variant30726, - Variant30727, - Variant30728, - Variant30729, - Variant30730, - Variant30731, - Variant30732, - Variant30733, - Variant30734, - Variant30735, - Variant30736, - Variant30737, - Variant30738, - Variant30739, - Variant30740, - Variant30741, - Variant30742, - Variant30743, - Variant30744, - Variant30745, - Variant30746, - Variant30747, - Variant30748, - Variant30749, - Variant30750, - Variant30751, - Variant30752, - Variant30753, - Variant30754, - Variant30755, - Variant30756, - Variant30757, - Variant30758, - Variant30759, - Variant30760, - Variant30761, - Variant30762, - Variant30763, - Variant30764, - Variant30765, - Variant30766, - Variant30767, - Variant30768, - Variant30769, - Variant30770, - Variant30771, - Variant30772, - Variant30773, - Variant30774, - Variant30775, - Variant30776, - Variant30777, - Variant30778, - Variant30779, - Variant30780, - Variant30781, - Variant30782, - Variant30783, - Variant30784, - Variant30785, - Variant30786, - Variant30787, - Variant30788, - Variant30789, - Variant30790, - Variant30791, - Variant30792, - Variant30793, - Variant30794, - Variant30795, - Variant30796, - Variant30797, - Variant30798, - Variant30799, - Variant30800, - Variant30801, - Variant30802, - Variant30803, - Variant30804, - Variant30805, - Variant30806, - Variant30807, - Variant30808, - Variant30809, - Variant30810, - Variant30811, - Variant30812, - Variant30813, - Variant30814, - Variant30815, - Variant30816, - Variant30817, - Variant30818, - Variant30819, - Variant30820, - Variant30821, - Variant30822, - Variant30823, - Variant30824, - Variant30825, - Variant30826, - Variant30827, - Variant30828, - Variant30829, - Variant30830, - Variant30831, - Variant30832, - Variant30833, - Variant30834, - Variant30835, - Variant30836, - Variant30837, - Variant30838, - Variant30839, - Variant30840, - Variant30841, - Variant30842, - Variant30843, - Variant30844, - Variant30845, - Variant30846, - Variant30847, - Variant30848, - Variant30849, - Variant30850, - Variant30851, - Variant30852, - Variant30853, - Variant30854, - Variant30855, - Variant30856, - Variant30857, - Variant30858, - Variant30859, - Variant30860, - Variant30861, - Variant30862, - Variant30863, - Variant30864, - Variant30865, - Variant30866, - Variant30867, - Variant30868, - Variant30869, - Variant30870, - Variant30871, - Variant30872, - Variant30873, - Variant30874, - Variant30875, - Variant30876, - Variant30877, - Variant30878, - Variant30879, - Variant30880, - Variant30881, - Variant30882, - Variant30883, - Variant30884, - Variant30885, - Variant30886, - Variant30887, - Variant30888, - Variant30889, - Variant30890, - Variant30891, - Variant30892, - Variant30893, - Variant30894, - Variant30895, - Variant30896, - Variant30897, - Variant30898, - Variant30899, - Variant30900, - Variant30901, - Variant30902, - Variant30903, - Variant30904, - Variant30905, - Variant30906, - Variant30907, - Variant30908, - Variant30909, - Variant30910, - Variant30911, - Variant30912, - Variant30913, - Variant30914, - Variant30915, - Variant30916, - Variant30917, - Variant30918, - Variant30919, - Variant30920, - Variant30921, - Variant30922, - Variant30923, - Variant30924, - Variant30925, - Variant30926, - Variant30927, - Variant30928, - Variant30929, - Variant30930, - Variant30931, - Variant30932, - Variant30933, - Variant30934, - Variant30935, - Variant30936, - Variant30937, - Variant30938, - Variant30939, - Variant30940, - Variant30941, - Variant30942, - Variant30943, - Variant30944, - Variant30945, - Variant30946, - Variant30947, - Variant30948, - Variant30949, - Variant30950, - Variant30951, - Variant30952, - Variant30953, - Variant30954, - Variant30955, - Variant30956, - Variant30957, - Variant30958, - Variant30959, - Variant30960, - Variant30961, - Variant30962, - Variant30963, - Variant30964, - Variant30965, - Variant30966, - Variant30967, - Variant30968, - Variant30969, - Variant30970, - Variant30971, - Variant30972, - Variant30973, - Variant30974, - Variant30975, - Variant30976, - Variant30977, - Variant30978, - Variant30979, - Variant30980, - Variant30981, - Variant30982, - Variant30983, - Variant30984, - Variant30985, - Variant30986, - Variant30987, - Variant30988, - Variant30989, - Variant30990, - Variant30991, - Variant30992, - Variant30993, - Variant30994, - Variant30995, - Variant30996, - Variant30997, - Variant30998, - Variant30999, - Variant31000, - Variant31001, - Variant31002, - Variant31003, - Variant31004, - Variant31005, - Variant31006, - Variant31007, - Variant31008, - Variant31009, - Variant31010, - Variant31011, - Variant31012, - Variant31013, - Variant31014, - Variant31015, - Variant31016, - Variant31017, - Variant31018, - Variant31019, - Variant31020, - Variant31021, - Variant31022, - Variant31023, - Variant31024, - Variant31025, - Variant31026, - Variant31027, - Variant31028, - Variant31029, - Variant31030, - Variant31031, - Variant31032, - Variant31033, - Variant31034, - Variant31035, - Variant31036, - Variant31037, - Variant31038, - Variant31039, - Variant31040, - Variant31041, - Variant31042, - Variant31043, - Variant31044, - Variant31045, - Variant31046, - Variant31047, - Variant31048, - Variant31049, - Variant31050, - Variant31051, - Variant31052, - Variant31053, - Variant31054, - Variant31055, - Variant31056, - Variant31057, - Variant31058, - Variant31059, - Variant31060, - Variant31061, - Variant31062, - Variant31063, - Variant31064, - Variant31065, - Variant31066, - Variant31067, - Variant31068, - Variant31069, - Variant31070, - Variant31071, - Variant31072, - Variant31073, - Variant31074, - Variant31075, - Variant31076, - Variant31077, - Variant31078, - Variant31079, - Variant31080, - Variant31081, - Variant31082, - Variant31083, - Variant31084, - Variant31085, - Variant31086, - Variant31087, - Variant31088, - Variant31089, - Variant31090, - Variant31091, - Variant31092, - Variant31093, - Variant31094, - Variant31095, - Variant31096, - Variant31097, - Variant31098, - Variant31099, - Variant31100, - Variant31101, - Variant31102, - Variant31103, - Variant31104, - Variant31105, - Variant31106, - Variant31107, - Variant31108, - Variant31109, - Variant31110, - Variant31111, - Variant31112, - Variant31113, - Variant31114, - Variant31115, - Variant31116, - Variant31117, - Variant31118, - Variant31119, - Variant31120, - Variant31121, - Variant31122, - Variant31123, - Variant31124, - Variant31125, - Variant31126, - Variant31127, - Variant31128, - Variant31129, - Variant31130, - Variant31131, - Variant31132, - Variant31133, - Variant31134, - Variant31135, - Variant31136, - Variant31137, - Variant31138, - Variant31139, - Variant31140, - Variant31141, - Variant31142, - Variant31143, - Variant31144, - Variant31145, - Variant31146, - Variant31147, - Variant31148, - Variant31149, - Variant31150, - Variant31151, - Variant31152, - Variant31153, - Variant31154, - Variant31155, - Variant31156, - Variant31157, - Variant31158, - Variant31159, - Variant31160, - Variant31161, - Variant31162, - Variant31163, - Variant31164, - Variant31165, - Variant31166, - Variant31167, - Variant31168, - Variant31169, - Variant31170, - Variant31171, - Variant31172, - Variant31173, - Variant31174, - Variant31175, - Variant31176, - Variant31177, - Variant31178, - Variant31179, - Variant31180, - Variant31181, - Variant31182, - Variant31183, - Variant31184, - Variant31185, - Variant31186, - Variant31187, - Variant31188, - Variant31189, - Variant31190, - Variant31191, - Variant31192, - Variant31193, - Variant31194, - Variant31195, - Variant31196, - Variant31197, - Variant31198, - Variant31199, - Variant31200, - Variant31201, - Variant31202, - Variant31203, - Variant31204, - Variant31205, - Variant31206, - Variant31207, - Variant31208, - Variant31209, - Variant31210, - Variant31211, - Variant31212, - Variant31213, - Variant31214, - Variant31215, - Variant31216, - Variant31217, - Variant31218, - Variant31219, - Variant31220, - Variant31221, - Variant31222, - Variant31223, - Variant31224, - Variant31225, - Variant31226, - Variant31227, - Variant31228, - Variant31229, - Variant31230, - Variant31231, - Variant31232, - Variant31233, - Variant31234, - Variant31235, - Variant31236, - Variant31237, - Variant31238, - Variant31239, - Variant31240, - Variant31241, - Variant31242, - Variant31243, - Variant31244, - Variant31245, - Variant31246, - Variant31247, - Variant31248, - Variant31249, - Variant31250, - Variant31251, - Variant31252, - Variant31253, - Variant31254, - Variant31255, - Variant31256, - Variant31257, - Variant31258, - Variant31259, - Variant31260, - Variant31261, - Variant31262, - Variant31263, - Variant31264, - Variant31265, - Variant31266, - Variant31267, - Variant31268, - Variant31269, - Variant31270, - Variant31271, - Variant31272, - Variant31273, - Variant31274, - Variant31275, - Variant31276, - Variant31277, - Variant31278, - Variant31279, - Variant31280, - Variant31281, - Variant31282, - Variant31283, - Variant31284, - Variant31285, - Variant31286, - Variant31287, - Variant31288, - Variant31289, - Variant31290, - Variant31291, - Variant31292, - Variant31293, - Variant31294, - Variant31295, - Variant31296, - Variant31297, - Variant31298, - Variant31299, - Variant31300, - Variant31301, - Variant31302, - Variant31303, - Variant31304, - Variant31305, - Variant31306, - Variant31307, - Variant31308, - Variant31309, - Variant31310, - Variant31311, - Variant31312, - Variant31313, - Variant31314, - Variant31315, - Variant31316, - Variant31317, - Variant31318, - Variant31319, - Variant31320, - Variant31321, - Variant31322, - Variant31323, - Variant31324, - Variant31325, - Variant31326, - Variant31327, - Variant31328, - Variant31329, - Variant31330, - Variant31331, - Variant31332, - Variant31333, - Variant31334, - Variant31335, - Variant31336, - Variant31337, - Variant31338, - Variant31339, - Variant31340, - Variant31341, - Variant31342, - Variant31343, - Variant31344, - Variant31345, - Variant31346, - Variant31347, - Variant31348, - Variant31349, - Variant31350, - Variant31351, - Variant31352, - Variant31353, - Variant31354, - Variant31355, - Variant31356, - Variant31357, - Variant31358, - Variant31359, - Variant31360, - Variant31361, - Variant31362, - Variant31363, - Variant31364, - Variant31365, - Variant31366, - Variant31367, - Variant31368, - Variant31369, - Variant31370, - Variant31371, - Variant31372, - Variant31373, - Variant31374, - Variant31375, - Variant31376, - Variant31377, - Variant31378, - Variant31379, - Variant31380, - Variant31381, - Variant31382, - Variant31383, - Variant31384, - Variant31385, - Variant31386, - Variant31387, - Variant31388, - Variant31389, - Variant31390, - Variant31391, - Variant31392, - Variant31393, - Variant31394, - Variant31395, - Variant31396, - Variant31397, - Variant31398, - Variant31399, - Variant31400, - Variant31401, - Variant31402, - Variant31403, - Variant31404, - Variant31405, - Variant31406, - Variant31407, - Variant31408, - Variant31409, - Variant31410, - Variant31411, - Variant31412, - Variant31413, - Variant31414, - Variant31415, - Variant31416, - Variant31417, - Variant31418, - Variant31419, - Variant31420, - Variant31421, - Variant31422, - Variant31423, - Variant31424, - Variant31425, - Variant31426, - Variant31427, - Variant31428, - Variant31429, - Variant31430, - Variant31431, - Variant31432, - Variant31433, - Variant31434, - Variant31435, - Variant31436, - Variant31437, - Variant31438, - Variant31439, - Variant31440, - Variant31441, - Variant31442, - Variant31443, - Variant31444, - Variant31445, - Variant31446, - Variant31447, - Variant31448, - Variant31449, - Variant31450, - Variant31451, - Variant31452, - Variant31453, - Variant31454, - Variant31455, - Variant31456, - Variant31457, - Variant31458, - Variant31459, - Variant31460, - Variant31461, - Variant31462, - Variant31463, - Variant31464, - Variant31465, - Variant31466, - Variant31467, - Variant31468, - Variant31469, - Variant31470, - Variant31471, - Variant31472, - Variant31473, - Variant31474, - Variant31475, - Variant31476, - Variant31477, - Variant31478, - Variant31479, - Variant31480, - Variant31481, - Variant31482, - Variant31483, - Variant31484, - Variant31485, - Variant31486, - Variant31487, - Variant31488, - Variant31489, - Variant31490, - Variant31491, - Variant31492, - Variant31493, - Variant31494, - Variant31495, - Variant31496, - Variant31497, - Variant31498, - Variant31499, - Variant31500, - Variant31501, - Variant31502, - Variant31503, - Variant31504, - Variant31505, - Variant31506, - Variant31507, - Variant31508, - Variant31509, - Variant31510, - Variant31511, - Variant31512, - Variant31513, - Variant31514, - Variant31515, - Variant31516, - Variant31517, - Variant31518, - Variant31519, - Variant31520, - Variant31521, - Variant31522, - Variant31523, - Variant31524, - Variant31525, - Variant31526, - Variant31527, - Variant31528, - Variant31529, - Variant31530, - Variant31531, - Variant31532, - Variant31533, - Variant31534, - Variant31535, - Variant31536, - Variant31537, - Variant31538, - Variant31539, - Variant31540, - Variant31541, - Variant31542, - Variant31543, - Variant31544, - Variant31545, - Variant31546, - Variant31547, - Variant31548, - Variant31549, - Variant31550, - Variant31551, - Variant31552, - Variant31553, - Variant31554, - Variant31555, - Variant31556, - Variant31557, - Variant31558, - Variant31559, - Variant31560, - Variant31561, - Variant31562, - Variant31563, - Variant31564, - Variant31565, - Variant31566, - Variant31567, - Variant31568, - Variant31569, - Variant31570, - Variant31571, - Variant31572, - Variant31573, - Variant31574, - Variant31575, - Variant31576, - Variant31577, - Variant31578, - Variant31579, - Variant31580, - Variant31581, - Variant31582, - Variant31583, - Variant31584, - Variant31585, - Variant31586, - Variant31587, - Variant31588, - Variant31589, - Variant31590, - Variant31591, - Variant31592, - Variant31593, - Variant31594, - Variant31595, - Variant31596, - Variant31597, - Variant31598, - Variant31599, - Variant31600, - Variant31601, - Variant31602, - Variant31603, - Variant31604, - Variant31605, - Variant31606, - Variant31607, - Variant31608, - Variant31609, - Variant31610, - Variant31611, - Variant31612, - Variant31613, - Variant31614, - Variant31615, - Variant31616, - Variant31617, - Variant31618, - Variant31619, - Variant31620, - Variant31621, - Variant31622, - Variant31623, - Variant31624, - Variant31625, - Variant31626, - Variant31627, - Variant31628, - Variant31629, - Variant31630, - Variant31631, - Variant31632, - Variant31633, - Variant31634, - Variant31635, - Variant31636, - Variant31637, - Variant31638, - Variant31639, - Variant31640, - Variant31641, - Variant31642, - Variant31643, - Variant31644, - Variant31645, - Variant31646, - Variant31647, - Variant31648, - Variant31649, - Variant31650, - Variant31651, - Variant31652, - Variant31653, - Variant31654, - Variant31655, - Variant31656, - Variant31657, - Variant31658, - Variant31659, - Variant31660, - Variant31661, - Variant31662, - Variant31663, - Variant31664, - Variant31665, - Variant31666, - Variant31667, - Variant31668, - Variant31669, - Variant31670, - Variant31671, - Variant31672, - Variant31673, - Variant31674, - Variant31675, - Variant31676, - Variant31677, - Variant31678, - Variant31679, - Variant31680, - Variant31681, - Variant31682, - Variant31683, - Variant31684, - Variant31685, - Variant31686, - Variant31687, - Variant31688, - Variant31689, - Variant31690, - Variant31691, - Variant31692, - Variant31693, - Variant31694, - Variant31695, - Variant31696, - Variant31697, - Variant31698, - Variant31699, - Variant31700, - Variant31701, - Variant31702, - Variant31703, - Variant31704, - Variant31705, - Variant31706, - Variant31707, - Variant31708, - Variant31709, - Variant31710, - Variant31711, - Variant31712, - Variant31713, - Variant31714, - Variant31715, - Variant31716, - Variant31717, - Variant31718, - Variant31719, - Variant31720, - Variant31721, - Variant31722, - Variant31723, - Variant31724, - Variant31725, - Variant31726, - Variant31727, - Variant31728, - Variant31729, - Variant31730, - Variant31731, - Variant31732, - Variant31733, - Variant31734, - Variant31735, - Variant31736, - Variant31737, - Variant31738, - Variant31739, - Variant31740, - Variant31741, - Variant31742, - Variant31743, - Variant31744, - Variant31745, - Variant31746, - Variant31747, - Variant31748, - Variant31749, - Variant31750, - Variant31751, - Variant31752, - Variant31753, - Variant31754, - Variant31755, - Variant31756, - Variant31757, - Variant31758, - Variant31759, - Variant31760, - Variant31761, - Variant31762, - Variant31763, - Variant31764, - Variant31765, - Variant31766, - Variant31767, - Variant31768, - Variant31769, - Variant31770, - Variant31771, - Variant31772, - Variant31773, - Variant31774, - Variant31775, - Variant31776, - Variant31777, - Variant31778, - Variant31779, - Variant31780, - Variant31781, - Variant31782, - Variant31783, - Variant31784, - Variant31785, - Variant31786, - Variant31787, - Variant31788, - Variant31789, - Variant31790, - Variant31791, - Variant31792, - Variant31793, - Variant31794, - Variant31795, - Variant31796, - Variant31797, - Variant31798, - Variant31799, - Variant31800, - Variant31801, - Variant31802, - Variant31803, - Variant31804, - Variant31805, - Variant31806, - Variant31807, - Variant31808, - Variant31809, - Variant31810, - Variant31811, - Variant31812, - Variant31813, - Variant31814, - Variant31815, - Variant31816, - Variant31817, - Variant31818, - Variant31819, - Variant31820, - Variant31821, - Variant31822, - Variant31823, - Variant31824, - Variant31825, - Variant31826, - Variant31827, - Variant31828, - Variant31829, - Variant31830, - Variant31831, - Variant31832, - Variant31833, - Variant31834, - Variant31835, - Variant31836, - Variant31837, - Variant31838, - Variant31839, - Variant31840, - Variant31841, - Variant31842, - Variant31843, - Variant31844, - Variant31845, - Variant31846, - Variant31847, - Variant31848, - Variant31849, - Variant31850, - Variant31851, - Variant31852, - Variant31853, - Variant31854, - Variant31855, - Variant31856, - Variant31857, - Variant31858, - Variant31859, - Variant31860, - Variant31861, - Variant31862, - Variant31863, - Variant31864, - Variant31865, - Variant31866, - Variant31867, - Variant31868, - Variant31869, - Variant31870, - Variant31871, - Variant31872, - Variant31873, - Variant31874, - Variant31875, - Variant31876, - Variant31877, - Variant31878, - Variant31879, - Variant31880, - Variant31881, - Variant31882, - Variant31883, - Variant31884, - Variant31885, - Variant31886, - Variant31887, - Variant31888, - Variant31889, - Variant31890, - Variant31891, - Variant31892, - Variant31893, - Variant31894, - Variant31895, - Variant31896, - Variant31897, - Variant31898, - Variant31899, - Variant31900, - Variant31901, - Variant31902, - Variant31903, - Variant31904, - Variant31905, - Variant31906, - Variant31907, - Variant31908, - Variant31909, - Variant31910, - Variant31911, - Variant31912, - Variant31913, - Variant31914, - Variant31915, - Variant31916, - Variant31917, - Variant31918, - Variant31919, - Variant31920, - Variant31921, - Variant31922, - Variant31923, - Variant31924, - Variant31925, - Variant31926, - Variant31927, - Variant31928, - Variant31929, - Variant31930, - Variant31931, - Variant31932, - Variant31933, - Variant31934, - Variant31935, - Variant31936, - Variant31937, - Variant31938, - Variant31939, - Variant31940, - Variant31941, - Variant31942, - Variant31943, - Variant31944, - Variant31945, - Variant31946, - Variant31947, - Variant31948, - Variant31949, - Variant31950, - Variant31951, - Variant31952, - Variant31953, - Variant31954, - Variant31955, - Variant31956, - Variant31957, - Variant31958, - Variant31959, - Variant31960, - Variant31961, - Variant31962, - Variant31963, - Variant31964, - Variant31965, - Variant31966, - Variant31967, - Variant31968, - Variant31969, - Variant31970, - Variant31971, - Variant31972, - Variant31973, - Variant31974, - Variant31975, - Variant31976, - Variant31977, - Variant31978, - Variant31979, - Variant31980, - Variant31981, - Variant31982, - Variant31983, - Variant31984, - Variant31985, - Variant31986, - Variant31987, - Variant31988, - Variant31989, - Variant31990, - Variant31991, - Variant31992, - Variant31993, - Variant31994, - Variant31995, - Variant31996, - Variant31997, - Variant31998, - Variant31999, - Variant32000, - Variant32001, - Variant32002, - Variant32003, - Variant32004, - Variant32005, - Variant32006, - Variant32007, - Variant32008, - Variant32009, - Variant32010, - Variant32011, - Variant32012, - Variant32013, - Variant32014, - Variant32015, - Variant32016, - Variant32017, - Variant32018, - Variant32019, - Variant32020, - Variant32021, - Variant32022, - Variant32023, - Variant32024, - Variant32025, - Variant32026, - Variant32027, - Variant32028, - Variant32029, - Variant32030, - Variant32031, - Variant32032, - Variant32033, - Variant32034, - Variant32035, - Variant32036, - Variant32037, - Variant32038, - Variant32039, - Variant32040, - Variant32041, - Variant32042, - Variant32043, - Variant32044, - Variant32045, - Variant32046, - Variant32047, - Variant32048, - Variant32049, - Variant32050, - Variant32051, - Variant32052, - Variant32053, - Variant32054, - Variant32055, - Variant32056, - Variant32057, - Variant32058, - Variant32059, - Variant32060, - Variant32061, - Variant32062, - Variant32063, - Variant32064, - Variant32065, - Variant32066, - Variant32067, - Variant32068, - Variant32069, - Variant32070, - Variant32071, - Variant32072, - Variant32073, - Variant32074, - Variant32075, - Variant32076, - Variant32077, - Variant32078, - Variant32079, - Variant32080, - Variant32081, - Variant32082, - Variant32083, - Variant32084, - Variant32085, - Variant32086, - Variant32087, - Variant32088, - Variant32089, - Variant32090, - Variant32091, - Variant32092, - Variant32093, - Variant32094, - Variant32095, - Variant32096, - Variant32097, - Variant32098, - Variant32099, - Variant32100, - Variant32101, - Variant32102, - Variant32103, - Variant32104, - Variant32105, - Variant32106, - Variant32107, - Variant32108, - Variant32109, - Variant32110, - Variant32111, - Variant32112, - Variant32113, - Variant32114, - Variant32115, - Variant32116, - Variant32117, - Variant32118, - Variant32119, - Variant32120, - Variant32121, - Variant32122, - Variant32123, - Variant32124, - Variant32125, - Variant32126, - Variant32127, - Variant32128, - Variant32129, - Variant32130, - Variant32131, - Variant32132, - Variant32133, - Variant32134, - Variant32135, - Variant32136, - Variant32137, - Variant32138, - Variant32139, - Variant32140, - Variant32141, - Variant32142, - Variant32143, - Variant32144, - Variant32145, - Variant32146, - Variant32147, - Variant32148, - Variant32149, - Variant32150, - Variant32151, - Variant32152, - Variant32153, - Variant32154, - Variant32155, - Variant32156, - Variant32157, - Variant32158, - Variant32159, - Variant32160, - Variant32161, - Variant32162, - Variant32163, - Variant32164, - Variant32165, - Variant32166, - Variant32167, - Variant32168, - Variant32169, - Variant32170, - Variant32171, - Variant32172, - Variant32173, - Variant32174, - Variant32175, - Variant32176, - Variant32177, - Variant32178, - Variant32179, - Variant32180, - Variant32181, - Variant32182, - Variant32183, - Variant32184, - Variant32185, - Variant32186, - Variant32187, - Variant32188, - Variant32189, - Variant32190, - Variant32191, - Variant32192, - Variant32193, - Variant32194, - Variant32195, - Variant32196, - Variant32197, - Variant32198, - Variant32199, - Variant32200, - Variant32201, - Variant32202, - Variant32203, - Variant32204, - Variant32205, - Variant32206, - Variant32207, - Variant32208, - Variant32209, - Variant32210, - Variant32211, - Variant32212, - Variant32213, - Variant32214, - Variant32215, - Variant32216, - Variant32217, - Variant32218, - Variant32219, - Variant32220, - Variant32221, - Variant32222, - Variant32223, - Variant32224, - Variant32225, - Variant32226, - Variant32227, - Variant32228, - Variant32229, - Variant32230, - Variant32231, - Variant32232, - Variant32233, - Variant32234, - Variant32235, - Variant32236, - Variant32237, - Variant32238, - Variant32239, - Variant32240, - Variant32241, - Variant32242, - Variant32243, - Variant32244, - Variant32245, - Variant32246, - Variant32247, - Variant32248, - Variant32249, - Variant32250, - Variant32251, - Variant32252, - Variant32253, - Variant32254, - Variant32255, - Variant32256, - Variant32257, - Variant32258, - Variant32259, - Variant32260, - Variant32261, - Variant32262, - Variant32263, - Variant32264, - Variant32265, - Variant32266, - Variant32267, - Variant32268, - Variant32269, - Variant32270, - Variant32271, - Variant32272, - Variant32273, - Variant32274, - Variant32275, - Variant32276, - Variant32277, - Variant32278, - Variant32279, - Variant32280, - Variant32281, - Variant32282, - Variant32283, - Variant32284, - Variant32285, - Variant32286, - Variant32287, - Variant32288, - Variant32289, - Variant32290, - Variant32291, - Variant32292, - Variant32293, - Variant32294, - Variant32295, - Variant32296, - Variant32297, - Variant32298, - Variant32299, - Variant32300, - Variant32301, - Variant32302, - Variant32303, - Variant32304, - Variant32305, - Variant32306, - Variant32307, - Variant32308, - Variant32309, - Variant32310, - Variant32311, - Variant32312, - Variant32313, - Variant32314, - Variant32315, - Variant32316, - Variant32317, - Variant32318, - Variant32319, - Variant32320, - Variant32321, - Variant32322, - Variant32323, - Variant32324, - Variant32325, - Variant32326, - Variant32327, - Variant32328, - Variant32329, - Variant32330, - Variant32331, - Variant32332, - Variant32333, - Variant32334, - Variant32335, - Variant32336, - Variant32337, - Variant32338, - Variant32339, - Variant32340, - Variant32341, - Variant32342, - Variant32343, - Variant32344, - Variant32345, - Variant32346, - Variant32347, - Variant32348, - Variant32349, - Variant32350, - Variant32351, - Variant32352, - Variant32353, - Variant32354, - Variant32355, - Variant32356, - Variant32357, - Variant32358, - Variant32359, - Variant32360, - Variant32361, - Variant32362, - Variant32363, - Variant32364, - Variant32365, - Variant32366, - Variant32367, - Variant32368, - Variant32369, - Variant32370, - Variant32371, - Variant32372, - Variant32373, - Variant32374, - Variant32375, - Variant32376, - Variant32377, - Variant32378, - Variant32379, - Variant32380, - Variant32381, - Variant32382, - Variant32383, - Variant32384, - Variant32385, - Variant32386, - Variant32387, - Variant32388, - Variant32389, - Variant32390, - Variant32391, - Variant32392, - Variant32393, - Variant32394, - Variant32395, - Variant32396, - Variant32397, - Variant32398, - Variant32399, - Variant32400, - Variant32401, - Variant32402, - Variant32403, - Variant32404, - Variant32405, - Variant32406, - Variant32407, - Variant32408, - Variant32409, - Variant32410, - Variant32411, - Variant32412, - Variant32413, - Variant32414, - Variant32415, - Variant32416, - Variant32417, - Variant32418, - Variant32419, - Variant32420, - Variant32421, - Variant32422, - Variant32423, - Variant32424, - Variant32425, - Variant32426, - Variant32427, - Variant32428, - Variant32429, - Variant32430, - Variant32431, - Variant32432, - Variant32433, - Variant32434, - Variant32435, - Variant32436, - Variant32437, - Variant32438, - Variant32439, - Variant32440, - Variant32441, - Variant32442, - Variant32443, - Variant32444, - Variant32445, - Variant32446, - Variant32447, - Variant32448, - Variant32449, - Variant32450, - Variant32451, - Variant32452, - Variant32453, - Variant32454, - Variant32455, - Variant32456, - Variant32457, - Variant32458, - Variant32459, - Variant32460, - Variant32461, - Variant32462, - Variant32463, - Variant32464, - Variant32465, - Variant32466, - Variant32467, - Variant32468, - Variant32469, - Variant32470, - Variant32471, - Variant32472, - Variant32473, - Variant32474, - Variant32475, - Variant32476, - Variant32477, - Variant32478, - Variant32479, - Variant32480, - Variant32481, - Variant32482, - Variant32483, - Variant32484, - Variant32485, - Variant32486, - Variant32487, - Variant32488, - Variant32489, - Variant32490, - Variant32491, - Variant32492, - Variant32493, - Variant32494, - Variant32495, - Variant32496, - Variant32497, - Variant32498, - Variant32499, - Variant32500, - Variant32501, - Variant32502, - Variant32503, - Variant32504, - Variant32505, - Variant32506, - Variant32507, - Variant32508, - Variant32509, - Variant32510, - Variant32511, - Variant32512, - Variant32513, - Variant32514, - Variant32515, - Variant32516, - Variant32517, - Variant32518, - Variant32519, - Variant32520, - Variant32521, - Variant32522, - Variant32523, - Variant32524, - Variant32525, - Variant32526, - Variant32527, - Variant32528, - Variant32529, - Variant32530, - Variant32531, - Variant32532, - Variant32533, - Variant32534, - Variant32535, - Variant32536, - Variant32537, - Variant32538, - Variant32539, - Variant32540, - Variant32541, - Variant32542, - Variant32543, - Variant32544, - Variant32545, - Variant32546, - Variant32547, - Variant32548, - Variant32549, - Variant32550, - Variant32551, - Variant32552, - Variant32553, - Variant32554, - Variant32555, - Variant32556, - Variant32557, - Variant32558, - Variant32559, - Variant32560, - Variant32561, - Variant32562, - Variant32563, - Variant32564, - Variant32565, - Variant32566, - Variant32567, - Variant32568, - Variant32569, - Variant32570, - Variant32571, - Variant32572, - Variant32573, - Variant32574, - Variant32575, - Variant32576, - Variant32577, - Variant32578, - Variant32579, - Variant32580, - Variant32581, - Variant32582, - Variant32583, - Variant32584, - Variant32585, - Variant32586, - Variant32587, - Variant32588, - Variant32589, - Variant32590, - Variant32591, - Variant32592, - Variant32593, - Variant32594, - Variant32595, - Variant32596, - Variant32597, - Variant32598, - Variant32599, - Variant32600, - Variant32601, - Variant32602, - Variant32603, - Variant32604, - Variant32605, - Variant32606, - Variant32607, - Variant32608, - Variant32609, - Variant32610, - Variant32611, - Variant32612, - Variant32613, - Variant32614, - Variant32615, - Variant32616, - Variant32617, - Variant32618, - Variant32619, - Variant32620, - Variant32621, - Variant32622, - Variant32623, - Variant32624, - Variant32625, - Variant32626, - Variant32627, - Variant32628, - Variant32629, - Variant32630, - Variant32631, - Variant32632, - Variant32633, - Variant32634, - Variant32635, - Variant32636, - Variant32637, - Variant32638, - Variant32639, - Variant32640, - Variant32641, - Variant32642, - Variant32643, - Variant32644, - Variant32645, - Variant32646, - Variant32647, - Variant32648, - Variant32649, - Variant32650, - Variant32651, - Variant32652, - Variant32653, - Variant32654, - Variant32655, - Variant32656, - Variant32657, - Variant32658, - Variant32659, - Variant32660, - Variant32661, - Variant32662, - Variant32663, - Variant32664, - Variant32665, - Variant32666, - Variant32667, - Variant32668, - Variant32669, - Variant32670, - Variant32671, - Variant32672, - Variant32673, - Variant32674, - Variant32675, - Variant32676, - Variant32677, - Variant32678, - Variant32679, - Variant32680, - Variant32681, - Variant32682, - Variant32683, - Variant32684, - Variant32685, - Variant32686, - Variant32687, - Variant32688, - Variant32689, - Variant32690, - Variant32691, - Variant32692, - Variant32693, - Variant32694, - Variant32695, - Variant32696, - Variant32697, - Variant32698, - Variant32699, - Variant32700, - Variant32701, - Variant32702, - Variant32703, - Variant32704, - Variant32705, - Variant32706, - Variant32707, - Variant32708, - Variant32709, - Variant32710, - Variant32711, - Variant32712, - Variant32713, - Variant32714, - Variant32715, - Variant32716, - Variant32717, - Variant32718, - Variant32719, - Variant32720, - Variant32721, - Variant32722, - Variant32723, - Variant32724, - Variant32725, - Variant32726, - Variant32727, - Variant32728, - Variant32729, - Variant32730, - Variant32731, - Variant32732, - Variant32733, - Variant32734, - Variant32735, - Variant32736, - Variant32737, - Variant32738, - Variant32739, - Variant32740, - Variant32741, - Variant32742, - Variant32743, - Variant32744, - Variant32745, - Variant32746, - Variant32747, - Variant32748, - Variant32749, - Variant32750, - Variant32751, - Variant32752, - Variant32753, - Variant32754, - Variant32755, - Variant32756, - Variant32757, - Variant32758, - Variant32759, - Variant32760, - Variant32761, - Variant32762, - Variant32763, - Variant32764, - Variant32765, - Variant32766, - Variant32767, - Variant32768, - Variant32769, - Variant32770, - Variant32771, - Variant32772, - Variant32773, - Variant32774, - Variant32775, - Variant32776, - Variant32777, - Variant32778, - Variant32779, - Variant32780, - Variant32781, - Variant32782, - Variant32783, - Variant32784, - Variant32785, - Variant32786, - Variant32787, - Variant32788, - Variant32789, - Variant32790, - Variant32791, - Variant32792, - Variant32793, - Variant32794, - Variant32795, - Variant32796, - Variant32797, - Variant32798, - Variant32799, - Variant32800, - Variant32801, - Variant32802, - Variant32803, - Variant32804, - Variant32805, - Variant32806, - Variant32807, - Variant32808, - Variant32809, - Variant32810, - Variant32811, - Variant32812, - Variant32813, - Variant32814, - Variant32815, - Variant32816, - Variant32817, - Variant32818, - Variant32819, - Variant32820, - Variant32821, - Variant32822, - Variant32823, - Variant32824, - Variant32825, - Variant32826, - Variant32827, - Variant32828, - Variant32829, - Variant32830, - Variant32831, - Variant32832, - Variant32833, - Variant32834, - Variant32835, - Variant32836, - Variant32837, - Variant32838, - Variant32839, - Variant32840, - Variant32841, - Variant32842, - Variant32843, - Variant32844, - Variant32845, - Variant32846, - Variant32847, - Variant32848, - Variant32849, - Variant32850, - Variant32851, - Variant32852, - Variant32853, - Variant32854, - Variant32855, - Variant32856, - Variant32857, - Variant32858, - Variant32859, - Variant32860, - Variant32861, - Variant32862, - Variant32863, - Variant32864, - Variant32865, - Variant32866, - Variant32867, - Variant32868, - Variant32869, - Variant32870, - Variant32871, - Variant32872, - Variant32873, - Variant32874, - Variant32875, - Variant32876, - Variant32877, - Variant32878, - Variant32879, - Variant32880, - Variant32881, - Variant32882, - Variant32883, - Variant32884, - Variant32885, - Variant32886, - Variant32887, - Variant32888, - Variant32889, - Variant32890, - Variant32891, - Variant32892, - Variant32893, - Variant32894, - Variant32895, - Variant32896, - Variant32897, - Variant32898, - Variant32899, - Variant32900, - Variant32901, - Variant32902, - Variant32903, - Variant32904, - Variant32905, - Variant32906, - Variant32907, - Variant32908, - Variant32909, - Variant32910, - Variant32911, - Variant32912, - Variant32913, - Variant32914, - Variant32915, - Variant32916, - Variant32917, - Variant32918, - Variant32919, - Variant32920, - Variant32921, - Variant32922, - Variant32923, - Variant32924, - Variant32925, - Variant32926, - Variant32927, - Variant32928, - Variant32929, - Variant32930, - Variant32931, - Variant32932, - Variant32933, - Variant32934, - Variant32935, - Variant32936, - Variant32937, - Variant32938, - Variant32939, - Variant32940, - Variant32941, - Variant32942, - Variant32943, - Variant32944, - Variant32945, - Variant32946, - Variant32947, - Variant32948, - Variant32949, - Variant32950, - Variant32951, - Variant32952, - Variant32953, - Variant32954, - Variant32955, - Variant32956, - Variant32957, - Variant32958, - Variant32959, - Variant32960, - Variant32961, - Variant32962, - Variant32963, - Variant32964, - Variant32965, - Variant32966, - Variant32967, - Variant32968, - Variant32969, - Variant32970, - Variant32971, - Variant32972, - Variant32973, - Variant32974, - Variant32975, - Variant32976, - Variant32977, - Variant32978, - Variant32979, - Variant32980, - Variant32981, - Variant32982, - Variant32983, - Variant32984, - Variant32985, - Variant32986, - Variant32987, - Variant32988, - Variant32989, - Variant32990, - Variant32991, - Variant32992, - Variant32993, - Variant32994, - Variant32995, - Variant32996, - Variant32997, - Variant32998, - Variant32999, - Variant33000, - Variant33001, - Variant33002, - Variant33003, - Variant33004, - Variant33005, - Variant33006, - Variant33007, - Variant33008, - Variant33009, - Variant33010, - Variant33011, - Variant33012, - Variant33013, - Variant33014, - Variant33015, - Variant33016, - Variant33017, - Variant33018, - Variant33019, - Variant33020, - Variant33021, - Variant33022, - Variant33023, - Variant33024, - Variant33025, - Variant33026, - Variant33027, - Variant33028, - Variant33029, - Variant33030, - Variant33031, - Variant33032, - Variant33033, - Variant33034, - Variant33035, - Variant33036, - Variant33037, - Variant33038, - Variant33039, - Variant33040, - Variant33041, - Variant33042, - Variant33043, - Variant33044, - Variant33045, - Variant33046, - Variant33047, - Variant33048, - Variant33049, - Variant33050, - Variant33051, - Variant33052, - Variant33053, - Variant33054, - Variant33055, - Variant33056, - Variant33057, - Variant33058, - Variant33059, - Variant33060, - Variant33061, - Variant33062, - Variant33063, - Variant33064, - Variant33065, - Variant33066, - Variant33067, - Variant33068, - Variant33069, - Variant33070, - Variant33071, - Variant33072, - Variant33073, - Variant33074, - Variant33075, - Variant33076, - Variant33077, - Variant33078, - Variant33079, - Variant33080, - Variant33081, - Variant33082, - Variant33083, - Variant33084, - Variant33085, - Variant33086, - Variant33087, - Variant33088, - Variant33089, - Variant33090, - Variant33091, - Variant33092, - Variant33093, - Variant33094, - Variant33095, - Variant33096, - Variant33097, - Variant33098, - Variant33099, - Variant33100, - Variant33101, - Variant33102, - Variant33103, - Variant33104, - Variant33105, - Variant33106, - Variant33107, - Variant33108, - Variant33109, - Variant33110, - Variant33111, - Variant33112, - Variant33113, - Variant33114, - Variant33115, - Variant33116, - Variant33117, - Variant33118, - Variant33119, - Variant33120, - Variant33121, - Variant33122, - Variant33123, - Variant33124, - Variant33125, - Variant33126, - Variant33127, - Variant33128, - Variant33129, - Variant33130, - Variant33131, - Variant33132, - Variant33133, - Variant33134, - Variant33135, - Variant33136, - Variant33137, - Variant33138, - Variant33139, - Variant33140, - Variant33141, - Variant33142, - Variant33143, - Variant33144, - Variant33145, - Variant33146, - Variant33147, - Variant33148, - Variant33149, - Variant33150, - Variant33151, - Variant33152, - Variant33153, - Variant33154, - Variant33155, - Variant33156, - Variant33157, - Variant33158, - Variant33159, - Variant33160, - Variant33161, - Variant33162, - Variant33163, - Variant33164, - Variant33165, - Variant33166, - Variant33167, - Variant33168, - Variant33169, - Variant33170, - Variant33171, - Variant33172, - Variant33173, - Variant33174, - Variant33175, - Variant33176, - Variant33177, - Variant33178, - Variant33179, - Variant33180, - Variant33181, - Variant33182, - Variant33183, - Variant33184, - Variant33185, - Variant33186, - Variant33187, - Variant33188, - Variant33189, - Variant33190, - Variant33191, - Variant33192, - Variant33193, - Variant33194, - Variant33195, - Variant33196, - Variant33197, - Variant33198, - Variant33199, - Variant33200, - Variant33201, - Variant33202, - Variant33203, - Variant33204, - Variant33205, - Variant33206, - Variant33207, - Variant33208, - Variant33209, - Variant33210, - Variant33211, - Variant33212, - Variant33213, - Variant33214, - Variant33215, - Variant33216, - Variant33217, - Variant33218, - Variant33219, - Variant33220, - Variant33221, - Variant33222, - Variant33223, - Variant33224, - Variant33225, - Variant33226, - Variant33227, - Variant33228, - Variant33229, - Variant33230, - Variant33231, - Variant33232, - Variant33233, - Variant33234, - Variant33235, - Variant33236, - Variant33237, - Variant33238, - Variant33239, - Variant33240, - Variant33241, - Variant33242, - Variant33243, - Variant33244, - Variant33245, - Variant33246, - Variant33247, - Variant33248, - Variant33249, - Variant33250, - Variant33251, - Variant33252, - Variant33253, - Variant33254, - Variant33255, - Variant33256, - Variant33257, - Variant33258, - Variant33259, - Variant33260, - Variant33261, - Variant33262, - Variant33263, - Variant33264, - Variant33265, - Variant33266, - Variant33267, - Variant33268, - Variant33269, - Variant33270, - Variant33271, - Variant33272, - Variant33273, - Variant33274, - Variant33275, - Variant33276, - Variant33277, - Variant33278, - Variant33279, - Variant33280, - Variant33281, - Variant33282, - Variant33283, - Variant33284, - Variant33285, - Variant33286, - Variant33287, - Variant33288, - Variant33289, - Variant33290, - Variant33291, - Variant33292, - Variant33293, - Variant33294, - Variant33295, - Variant33296, - Variant33297, - Variant33298, - Variant33299, - Variant33300, - Variant33301, - Variant33302, - Variant33303, - Variant33304, - Variant33305, - Variant33306, - Variant33307, - Variant33308, - Variant33309, - Variant33310, - Variant33311, - Variant33312, - Variant33313, - Variant33314, - Variant33315, - Variant33316, - Variant33317, - Variant33318, - Variant33319, - Variant33320, - Variant33321, - Variant33322, - Variant33323, - Variant33324, - Variant33325, - Variant33326, - Variant33327, - Variant33328, - Variant33329, - Variant33330, - Variant33331, - Variant33332, - Variant33333, - Variant33334, - Variant33335, - Variant33336, - Variant33337, - Variant33338, - Variant33339, - Variant33340, - Variant33341, - Variant33342, - Variant33343, - Variant33344, - Variant33345, - Variant33346, - Variant33347, - Variant33348, - Variant33349, - Variant33350, - Variant33351, - Variant33352, - Variant33353, - Variant33354, - Variant33355, - Variant33356, - Variant33357, - Variant33358, - Variant33359, - Variant33360, - Variant33361, - Variant33362, - Variant33363, - Variant33364, - Variant33365, - Variant33366, - Variant33367, - Variant33368, - Variant33369, - Variant33370, - Variant33371, - Variant33372, - Variant33373, - Variant33374, - Variant33375, - Variant33376, - Variant33377, - Variant33378, - Variant33379, - Variant33380, - Variant33381, - Variant33382, - Variant33383, - Variant33384, - Variant33385, - Variant33386, - Variant33387, - Variant33388, - Variant33389, - Variant33390, - Variant33391, - Variant33392, - Variant33393, - Variant33394, - Variant33395, - Variant33396, - Variant33397, - Variant33398, - Variant33399, - Variant33400, - Variant33401, - Variant33402, - Variant33403, - Variant33404, - Variant33405, - Variant33406, - Variant33407, - Variant33408, - Variant33409, - Variant33410, - Variant33411, - Variant33412, - Variant33413, - Variant33414, - Variant33415, - Variant33416, - Variant33417, - Variant33418, - Variant33419, - Variant33420, - Variant33421, - Variant33422, - Variant33423, - Variant33424, - Variant33425, - Variant33426, - Variant33427, - Variant33428, - Variant33429, - Variant33430, - Variant33431, - Variant33432, - Variant33433, - Variant33434, - Variant33435, - Variant33436, - Variant33437, - Variant33438, - Variant33439, - Variant33440, - Variant33441, - Variant33442, - Variant33443, - Variant33444, - Variant33445, - Variant33446, - Variant33447, - Variant33448, - Variant33449, - Variant33450, - Variant33451, - Variant33452, - Variant33453, - Variant33454, - Variant33455, - Variant33456, - Variant33457, - Variant33458, - Variant33459, - Variant33460, - Variant33461, - Variant33462, - Variant33463, - Variant33464, - Variant33465, - Variant33466, - Variant33467, - Variant33468, - Variant33469, - Variant33470, - Variant33471, - Variant33472, - Variant33473, - Variant33474, - Variant33475, - Variant33476, - Variant33477, - Variant33478, - Variant33479, - Variant33480, - Variant33481, - Variant33482, - Variant33483, - Variant33484, - Variant33485, - Variant33486, - Variant33487, - Variant33488, - Variant33489, - Variant33490, - Variant33491, - Variant33492, - Variant33493, - Variant33494, - Variant33495, - Variant33496, - Variant33497, - Variant33498, - Variant33499, - Variant33500, - Variant33501, - Variant33502, - Variant33503, - Variant33504, - Variant33505, - Variant33506, - Variant33507, - Variant33508, - Variant33509, - Variant33510, - Variant33511, - Variant33512, - Variant33513, - Variant33514, - Variant33515, - Variant33516, - Variant33517, - Variant33518, - Variant33519, - Variant33520, - Variant33521, - Variant33522, - Variant33523, - Variant33524, - Variant33525, - Variant33526, - Variant33527, - Variant33528, - Variant33529, - Variant33530, - Variant33531, - Variant33532, - Variant33533, - Variant33534, - Variant33535, - Variant33536, - Variant33537, - Variant33538, - Variant33539, - Variant33540, - Variant33541, - Variant33542, - Variant33543, - Variant33544, - Variant33545, - Variant33546, - Variant33547, - Variant33548, - Variant33549, - Variant33550, - Variant33551, - Variant33552, - Variant33553, - Variant33554, - Variant33555, - Variant33556, - Variant33557, - Variant33558, - Variant33559, - Variant33560, - Variant33561, - Variant33562, - Variant33563, - Variant33564, - Variant33565, - Variant33566, - Variant33567, - Variant33568, - Variant33569, - Variant33570, - Variant33571, - Variant33572, - Variant33573, - Variant33574, - Variant33575, - Variant33576, - Variant33577, - Variant33578, - Variant33579, - Variant33580, - Variant33581, - Variant33582, - Variant33583, - Variant33584, - Variant33585, - Variant33586, - Variant33587, - Variant33588, - Variant33589, - Variant33590, - Variant33591, - Variant33592, - Variant33593, - Variant33594, - Variant33595, - Variant33596, - Variant33597, - Variant33598, - Variant33599, - Variant33600, - Variant33601, - Variant33602, - Variant33603, - Variant33604, - Variant33605, - Variant33606, - Variant33607, - Variant33608, - Variant33609, - Variant33610, - Variant33611, - Variant33612, - Variant33613, - Variant33614, - Variant33615, - Variant33616, - Variant33617, - Variant33618, - Variant33619, - Variant33620, - Variant33621, - Variant33622, - Variant33623, - Variant33624, - Variant33625, - Variant33626, - Variant33627, - Variant33628, - Variant33629, - Variant33630, - Variant33631, - Variant33632, - Variant33633, - Variant33634, - Variant33635, - Variant33636, - Variant33637, - Variant33638, - Variant33639, - Variant33640, - Variant33641, - Variant33642, - Variant33643, - Variant33644, - Variant33645, - Variant33646, - Variant33647, - Variant33648, - Variant33649, - Variant33650, - Variant33651, - Variant33652, - Variant33653, - Variant33654, - Variant33655, - Variant33656, - Variant33657, - Variant33658, - Variant33659, - Variant33660, - Variant33661, - Variant33662, - Variant33663, - Variant33664, - Variant33665, - Variant33666, - Variant33667, - Variant33668, - Variant33669, - Variant33670, - Variant33671, - Variant33672, - Variant33673, - Variant33674, - Variant33675, - Variant33676, - Variant33677, - Variant33678, - Variant33679, - Variant33680, - Variant33681, - Variant33682, - Variant33683, - Variant33684, - Variant33685, - Variant33686, - Variant33687, - Variant33688, - Variant33689, - Variant33690, - Variant33691, - Variant33692, - Variant33693, - Variant33694, - Variant33695, - Variant33696, - Variant33697, - Variant33698, - Variant33699, - Variant33700, - Variant33701, - Variant33702, - Variant33703, - Variant33704, - Variant33705, - Variant33706, - Variant33707, - Variant33708, - Variant33709, - Variant33710, - Variant33711, - Variant33712, - Variant33713, - Variant33714, - Variant33715, - Variant33716, - Variant33717, - Variant33718, - Variant33719, - Variant33720, - Variant33721, - Variant33722, - Variant33723, - Variant33724, - Variant33725, - Variant33726, - Variant33727, - Variant33728, - Variant33729, - Variant33730, - Variant33731, - Variant33732, - Variant33733, - Variant33734, - Variant33735, - Variant33736, - Variant33737, - Variant33738, - Variant33739, - Variant33740, - Variant33741, - Variant33742, - Variant33743, - Variant33744, - Variant33745, - Variant33746, - Variant33747, - Variant33748, - Variant33749, - Variant33750, - Variant33751, - Variant33752, - Variant33753, - Variant33754, - Variant33755, - Variant33756, - Variant33757, - Variant33758, - Variant33759, - Variant33760, - Variant33761, - Variant33762, - Variant33763, - Variant33764, - Variant33765, - Variant33766, - Variant33767, - Variant33768, - Variant33769, - Variant33770, - Variant33771, - Variant33772, - Variant33773, - Variant33774, - Variant33775, - Variant33776, - Variant33777, - Variant33778, - Variant33779, - Variant33780, - Variant33781, - Variant33782, - Variant33783, - Variant33784, - Variant33785, - Variant33786, - Variant33787, - Variant33788, - Variant33789, - Variant33790, - Variant33791, - Variant33792, - Variant33793, - Variant33794, - Variant33795, - Variant33796, - Variant33797, - Variant33798, - Variant33799, - Variant33800, - Variant33801, - Variant33802, - Variant33803, - Variant33804, - Variant33805, - Variant33806, - Variant33807, - Variant33808, - Variant33809, - Variant33810, - Variant33811, - Variant33812, - Variant33813, - Variant33814, - Variant33815, - Variant33816, - Variant33817, - Variant33818, - Variant33819, - Variant33820, - Variant33821, - Variant33822, - Variant33823, - Variant33824, - Variant33825, - Variant33826, - Variant33827, - Variant33828, - Variant33829, - Variant33830, - Variant33831, - Variant33832, - Variant33833, - Variant33834, - Variant33835, - Variant33836, - Variant33837, - Variant33838, - Variant33839, - Variant33840, - Variant33841, - Variant33842, - Variant33843, - Variant33844, - Variant33845, - Variant33846, - Variant33847, - Variant33848, - Variant33849, - Variant33850, - Variant33851, - Variant33852, - Variant33853, - Variant33854, - Variant33855, - Variant33856, - Variant33857, - Variant33858, - Variant33859, - Variant33860, - Variant33861, - Variant33862, - Variant33863, - Variant33864, - Variant33865, - Variant33866, - Variant33867, - Variant33868, - Variant33869, - Variant33870, - Variant33871, - Variant33872, - Variant33873, - Variant33874, - Variant33875, - Variant33876, - Variant33877, - Variant33878, - Variant33879, - Variant33880, - Variant33881, - Variant33882, - Variant33883, - Variant33884, - Variant33885, - Variant33886, - Variant33887, - Variant33888, - Variant33889, - Variant33890, - Variant33891, - Variant33892, - Variant33893, - Variant33894, - Variant33895, - Variant33896, - Variant33897, - Variant33898, - Variant33899, - Variant33900, - Variant33901, - Variant33902, - Variant33903, - Variant33904, - Variant33905, - Variant33906, - Variant33907, - Variant33908, - Variant33909, - Variant33910, - Variant33911, - Variant33912, - Variant33913, - Variant33914, - Variant33915, - Variant33916, - Variant33917, - Variant33918, - Variant33919, - Variant33920, - Variant33921, - Variant33922, - Variant33923, - Variant33924, - Variant33925, - Variant33926, - Variant33927, - Variant33928, - Variant33929, - Variant33930, - Variant33931, - Variant33932, - Variant33933, - Variant33934, - Variant33935, - Variant33936, - Variant33937, - Variant33938, - Variant33939, - Variant33940, - Variant33941, - Variant33942, - Variant33943, - Variant33944, - Variant33945, - Variant33946, - Variant33947, - Variant33948, - Variant33949, - Variant33950, - Variant33951, - Variant33952, - Variant33953, - Variant33954, - Variant33955, - Variant33956, - Variant33957, - Variant33958, - Variant33959, - Variant33960, - Variant33961, - Variant33962, - Variant33963, - Variant33964, - Variant33965, - Variant33966, - Variant33967, - Variant33968, - Variant33969, - Variant33970, - Variant33971, - Variant33972, - Variant33973, - Variant33974, - Variant33975, - Variant33976, - Variant33977, - Variant33978, - Variant33979, - Variant33980, - Variant33981, - Variant33982, - Variant33983, - Variant33984, - Variant33985, - Variant33986, - Variant33987, - Variant33988, - Variant33989, - Variant33990, - Variant33991, - Variant33992, - Variant33993, - Variant33994, - Variant33995, - Variant33996, - Variant33997, - Variant33998, - Variant33999, - Variant34000, - Variant34001, - Variant34002, - Variant34003, - Variant34004, - Variant34005, - Variant34006, - Variant34007, - Variant34008, - Variant34009, - Variant34010, - Variant34011, - Variant34012, - Variant34013, - Variant34014, - Variant34015, - Variant34016, - Variant34017, - Variant34018, - Variant34019, - Variant34020, - Variant34021, - Variant34022, - Variant34023, - Variant34024, - Variant34025, - Variant34026, - Variant34027, - Variant34028, - Variant34029, - Variant34030, - Variant34031, - Variant34032, - Variant34033, - Variant34034, - Variant34035, - Variant34036, - Variant34037, - Variant34038, - Variant34039, - Variant34040, - Variant34041, - Variant34042, - Variant34043, - Variant34044, - Variant34045, - Variant34046, - Variant34047, - Variant34048, - Variant34049, - Variant34050, - Variant34051, - Variant34052, - Variant34053, - Variant34054, - Variant34055, - Variant34056, - Variant34057, - Variant34058, - Variant34059, - Variant34060, - Variant34061, - Variant34062, - Variant34063, - Variant34064, - Variant34065, - Variant34066, - Variant34067, - Variant34068, - Variant34069, - Variant34070, - Variant34071, - Variant34072, - Variant34073, - Variant34074, - Variant34075, - Variant34076, - Variant34077, - Variant34078, - Variant34079, - Variant34080, - Variant34081, - Variant34082, - Variant34083, - Variant34084, - Variant34085, - Variant34086, - Variant34087, - Variant34088, - Variant34089, - Variant34090, - Variant34091, - Variant34092, - Variant34093, - Variant34094, - Variant34095, - Variant34096, - Variant34097, - Variant34098, - Variant34099, - Variant34100, - Variant34101, - Variant34102, - Variant34103, - Variant34104, - Variant34105, - Variant34106, - Variant34107, - Variant34108, - Variant34109, - Variant34110, - Variant34111, - Variant34112, - Variant34113, - Variant34114, - Variant34115, - Variant34116, - Variant34117, - Variant34118, - Variant34119, - Variant34120, - Variant34121, - Variant34122, - Variant34123, - Variant34124, - Variant34125, - Variant34126, - Variant34127, - Variant34128, - Variant34129, - Variant34130, - Variant34131, - Variant34132, - Variant34133, - Variant34134, - Variant34135, - Variant34136, - Variant34137, - Variant34138, - Variant34139, - Variant34140, - Variant34141, - Variant34142, - Variant34143, - Variant34144, - Variant34145, - Variant34146, - Variant34147, - Variant34148, - Variant34149, - Variant34150, - Variant34151, - Variant34152, - Variant34153, - Variant34154, - Variant34155, - Variant34156, - Variant34157, - Variant34158, - Variant34159, - Variant34160, - Variant34161, - Variant34162, - Variant34163, - Variant34164, - Variant34165, - Variant34166, - Variant34167, - Variant34168, - Variant34169, - Variant34170, - Variant34171, - Variant34172, - Variant34173, - Variant34174, - Variant34175, - Variant34176, - Variant34177, - Variant34178, - Variant34179, - Variant34180, - Variant34181, - Variant34182, - Variant34183, - Variant34184, - Variant34185, - Variant34186, - Variant34187, - Variant34188, - Variant34189, - Variant34190, - Variant34191, - Variant34192, - Variant34193, - Variant34194, - Variant34195, - Variant34196, - Variant34197, - Variant34198, - Variant34199, - Variant34200, - Variant34201, - Variant34202, - Variant34203, - Variant34204, - Variant34205, - Variant34206, - Variant34207, - Variant34208, - Variant34209, - Variant34210, - Variant34211, - Variant34212, - Variant34213, - Variant34214, - Variant34215, - Variant34216, - Variant34217, - Variant34218, - Variant34219, - Variant34220, - Variant34221, - Variant34222, - Variant34223, - Variant34224, - Variant34225, - Variant34226, - Variant34227, - Variant34228, - Variant34229, - Variant34230, - Variant34231, - Variant34232, - Variant34233, - Variant34234, - Variant34235, - Variant34236, - Variant34237, - Variant34238, - Variant34239, - Variant34240, - Variant34241, - Variant34242, - Variant34243, - Variant34244, - Variant34245, - Variant34246, - Variant34247, - Variant34248, - Variant34249, - Variant34250, - Variant34251, - Variant34252, - Variant34253, - Variant34254, - Variant34255, - Variant34256, - Variant34257, - Variant34258, - Variant34259, - Variant34260, - Variant34261, - Variant34262, - Variant34263, - Variant34264, - Variant34265, - Variant34266, - Variant34267, - Variant34268, - Variant34269, - Variant34270, - Variant34271, - Variant34272, - Variant34273, - Variant34274, - Variant34275, - Variant34276, - Variant34277, - Variant34278, - Variant34279, - Variant34280, - Variant34281, - Variant34282, - Variant34283, - Variant34284, - Variant34285, - Variant34286, - Variant34287, - Variant34288, - Variant34289, - Variant34290, - Variant34291, - Variant34292, - Variant34293, - Variant34294, - Variant34295, - Variant34296, - Variant34297, - Variant34298, - Variant34299, - Variant34300, - Variant34301, - Variant34302, - Variant34303, - Variant34304, - Variant34305, - Variant34306, - Variant34307, - Variant34308, - Variant34309, - Variant34310, - Variant34311, - Variant34312, - Variant34313, - Variant34314, - Variant34315, - Variant34316, - Variant34317, - Variant34318, - Variant34319, - Variant34320, - Variant34321, - Variant34322, - Variant34323, - Variant34324, - Variant34325, - Variant34326, - Variant34327, - Variant34328, - Variant34329, - Variant34330, - Variant34331, - Variant34332, - Variant34333, - Variant34334, - Variant34335, - Variant34336, - Variant34337, - Variant34338, - Variant34339, - Variant34340, - Variant34341, - Variant34342, - Variant34343, - Variant34344, - Variant34345, - Variant34346, - Variant34347, - Variant34348, - Variant34349, - Variant34350, - Variant34351, - Variant34352, - Variant34353, - Variant34354, - Variant34355, - Variant34356, - Variant34357, - Variant34358, - Variant34359, - Variant34360, - Variant34361, - Variant34362, - Variant34363, - Variant34364, - Variant34365, - Variant34366, - Variant34367, - Variant34368, - Variant34369, - Variant34370, - Variant34371, - Variant34372, - Variant34373, - Variant34374, - Variant34375, - Variant34376, - Variant34377, - Variant34378, - Variant34379, - Variant34380, - Variant34381, - Variant34382, - Variant34383, - Variant34384, - Variant34385, - Variant34386, - Variant34387, - Variant34388, - Variant34389, - Variant34390, - Variant34391, - Variant34392, - Variant34393, - Variant34394, - Variant34395, - Variant34396, - Variant34397, - Variant34398, - Variant34399, - Variant34400, - Variant34401, - Variant34402, - Variant34403, - Variant34404, - Variant34405, - Variant34406, - Variant34407, - Variant34408, - Variant34409, - Variant34410, - Variant34411, - Variant34412, - Variant34413, - Variant34414, - Variant34415, - Variant34416, - Variant34417, - Variant34418, - Variant34419, - Variant34420, - Variant34421, - Variant34422, - Variant34423, - Variant34424, - Variant34425, - Variant34426, - Variant34427, - Variant34428, - Variant34429, - Variant34430, - Variant34431, - Variant34432, - Variant34433, - Variant34434, - Variant34435, - Variant34436, - Variant34437, - Variant34438, - Variant34439, - Variant34440, - Variant34441, - Variant34442, - Variant34443, - Variant34444, - Variant34445, - Variant34446, - Variant34447, - Variant34448, - Variant34449, - Variant34450, - Variant34451, - Variant34452, - Variant34453, - Variant34454, - Variant34455, - Variant34456, - Variant34457, - Variant34458, - Variant34459, - Variant34460, - Variant34461, - Variant34462, - Variant34463, - Variant34464, - Variant34465, - Variant34466, - Variant34467, - Variant34468, - Variant34469, - Variant34470, - Variant34471, - Variant34472, - Variant34473, - Variant34474, - Variant34475, - Variant34476, - Variant34477, - Variant34478, - Variant34479, - Variant34480, - Variant34481, - Variant34482, - Variant34483, - Variant34484, - Variant34485, - Variant34486, - Variant34487, - Variant34488, - Variant34489, - Variant34490, - Variant34491, - Variant34492, - Variant34493, - Variant34494, - Variant34495, - Variant34496, - Variant34497, - Variant34498, - Variant34499, - Variant34500, - Variant34501, - Variant34502, - Variant34503, - Variant34504, - Variant34505, - Variant34506, - Variant34507, - Variant34508, - Variant34509, - Variant34510, - Variant34511, - Variant34512, - Variant34513, - Variant34514, - Variant34515, - Variant34516, - Variant34517, - Variant34518, - Variant34519, - Variant34520, - Variant34521, - Variant34522, - Variant34523, - Variant34524, - Variant34525, - Variant34526, - Variant34527, - Variant34528, - Variant34529, - Variant34530, - Variant34531, - Variant34532, - Variant34533, - Variant34534, - Variant34535, - Variant34536, - Variant34537, - Variant34538, - Variant34539, - Variant34540, - Variant34541, - Variant34542, - Variant34543, - Variant34544, - Variant34545, - Variant34546, - Variant34547, - Variant34548, - Variant34549, - Variant34550, - Variant34551, - Variant34552, - Variant34553, - Variant34554, - Variant34555, - Variant34556, - Variant34557, - Variant34558, - Variant34559, - Variant34560, - Variant34561, - Variant34562, - Variant34563, - Variant34564, - Variant34565, - Variant34566, - Variant34567, - Variant34568, - Variant34569, - Variant34570, - Variant34571, - Variant34572, - Variant34573, - Variant34574, - Variant34575, - Variant34576, - Variant34577, - Variant34578, - Variant34579, - Variant34580, - Variant34581, - Variant34582, - Variant34583, - Variant34584, - Variant34585, - Variant34586, - Variant34587, - Variant34588, - Variant34589, - Variant34590, - Variant34591, - Variant34592, - Variant34593, - Variant34594, - Variant34595, - Variant34596, - Variant34597, - Variant34598, - Variant34599, - Variant34600, - Variant34601, - Variant34602, - Variant34603, - Variant34604, - Variant34605, - Variant34606, - Variant34607, - Variant34608, - Variant34609, - Variant34610, - Variant34611, - Variant34612, - Variant34613, - Variant34614, - Variant34615, - Variant34616, - Variant34617, - Variant34618, - Variant34619, - Variant34620, - Variant34621, - Variant34622, - Variant34623, - Variant34624, - Variant34625, - Variant34626, - Variant34627, - Variant34628, - Variant34629, - Variant34630, - Variant34631, - Variant34632, - Variant34633, - Variant34634, - Variant34635, - Variant34636, - Variant34637, - Variant34638, - Variant34639, - Variant34640, - Variant34641, - Variant34642, - Variant34643, - Variant34644, - Variant34645, - Variant34646, - Variant34647, - Variant34648, - Variant34649, - Variant34650, - Variant34651, - Variant34652, - Variant34653, - Variant34654, - Variant34655, - Variant34656, - Variant34657, - Variant34658, - Variant34659, - Variant34660, - Variant34661, - Variant34662, - Variant34663, - Variant34664, - Variant34665, - Variant34666, - Variant34667, - Variant34668, - Variant34669, - Variant34670, - Variant34671, - Variant34672, - Variant34673, - Variant34674, - Variant34675, - Variant34676, - Variant34677, - Variant34678, - Variant34679, - Variant34680, - Variant34681, - Variant34682, - Variant34683, - Variant34684, - Variant34685, - Variant34686, - Variant34687, - Variant34688, - Variant34689, - Variant34690, - Variant34691, - Variant34692, - Variant34693, - Variant34694, - Variant34695, - Variant34696, - Variant34697, - Variant34698, - Variant34699, - Variant34700, - Variant34701, - Variant34702, - Variant34703, - Variant34704, - Variant34705, - Variant34706, - Variant34707, - Variant34708, - Variant34709, - Variant34710, - Variant34711, - Variant34712, - Variant34713, - Variant34714, - Variant34715, - Variant34716, - Variant34717, - Variant34718, - Variant34719, - Variant34720, - Variant34721, - Variant34722, - Variant34723, - Variant34724, - Variant34725, - Variant34726, - Variant34727, - Variant34728, - Variant34729, - Variant34730, - Variant34731, - Variant34732, - Variant34733, - Variant34734, - Variant34735, - Variant34736, - Variant34737, - Variant34738, - Variant34739, - Variant34740, - Variant34741, - Variant34742, - Variant34743, - Variant34744, - Variant34745, - Variant34746, - Variant34747, - Variant34748, - Variant34749, - Variant34750, - Variant34751, - Variant34752, - Variant34753, - Variant34754, - Variant34755, - Variant34756, - Variant34757, - Variant34758, - Variant34759, - Variant34760, - Variant34761, - Variant34762, - Variant34763, - Variant34764, - Variant34765, - Variant34766, - Variant34767, - Variant34768, - Variant34769, - Variant34770, - Variant34771, - Variant34772, - Variant34773, - Variant34774, - Variant34775, - Variant34776, - Variant34777, - Variant34778, - Variant34779, - Variant34780, - Variant34781, - Variant34782, - Variant34783, - Variant34784, - Variant34785, - Variant34786, - Variant34787, - Variant34788, - Variant34789, - Variant34790, - Variant34791, - Variant34792, - Variant34793, - Variant34794, - Variant34795, - Variant34796, - Variant34797, - Variant34798, - Variant34799, - Variant34800, - Variant34801, - Variant34802, - Variant34803, - Variant34804, - Variant34805, - Variant34806, - Variant34807, - Variant34808, - Variant34809, - Variant34810, - Variant34811, - Variant34812, - Variant34813, - Variant34814, - Variant34815, - Variant34816, - Variant34817, - Variant34818, - Variant34819, - Variant34820, - Variant34821, - Variant34822, - Variant34823, - Variant34824, - Variant34825, - Variant34826, - Variant34827, - Variant34828, - Variant34829, - Variant34830, - Variant34831, - Variant34832, - Variant34833, - Variant34834, - Variant34835, - Variant34836, - Variant34837, - Variant34838, - Variant34839, - Variant34840, - Variant34841, - Variant34842, - Variant34843, - Variant34844, - Variant34845, - Variant34846, - Variant34847, - Variant34848, - Variant34849, - Variant34850, - Variant34851, - Variant34852, - Variant34853, - Variant34854, - Variant34855, - Variant34856, - Variant34857, - Variant34858, - Variant34859, - Variant34860, - Variant34861, - Variant34862, - Variant34863, - Variant34864, - Variant34865, - Variant34866, - Variant34867, - Variant34868, - Variant34869, - Variant34870, - Variant34871, - Variant34872, - Variant34873, - Variant34874, - Variant34875, - Variant34876, - Variant34877, - Variant34878, - Variant34879, - Variant34880, - Variant34881, - Variant34882, - Variant34883, - Variant34884, - Variant34885, - Variant34886, - Variant34887, - Variant34888, - Variant34889, - Variant34890, - Variant34891, - Variant34892, - Variant34893, - Variant34894, - Variant34895, - Variant34896, - Variant34897, - Variant34898, - Variant34899, - Variant34900, - Variant34901, - Variant34902, - Variant34903, - Variant34904, - Variant34905, - Variant34906, - Variant34907, - Variant34908, - Variant34909, - Variant34910, - Variant34911, - Variant34912, - Variant34913, - Variant34914, - Variant34915, - Variant34916, - Variant34917, - Variant34918, - Variant34919, - Variant34920, - Variant34921, - Variant34922, - Variant34923, - Variant34924, - Variant34925, - Variant34926, - Variant34927, - Variant34928, - Variant34929, - Variant34930, - Variant34931, - Variant34932, - Variant34933, - Variant34934, - Variant34935, - Variant34936, - Variant34937, - Variant34938, - Variant34939, - Variant34940, - Variant34941, - Variant34942, - Variant34943, - Variant34944, - Variant34945, - Variant34946, - Variant34947, - Variant34948, - Variant34949, - Variant34950, - Variant34951, - Variant34952, - Variant34953, - Variant34954, - Variant34955, - Variant34956, - Variant34957, - Variant34958, - Variant34959, - Variant34960, - Variant34961, - Variant34962, - Variant34963, - Variant34964, - Variant34965, - Variant34966, - Variant34967, - Variant34968, - Variant34969, - Variant34970, - Variant34971, - Variant34972, - Variant34973, - Variant34974, - Variant34975, - Variant34976, - Variant34977, - Variant34978, - Variant34979, - Variant34980, - Variant34981, - Variant34982, - Variant34983, - Variant34984, - Variant34985, - Variant34986, - Variant34987, - Variant34988, - Variant34989, - Variant34990, - Variant34991, - Variant34992, - Variant34993, - Variant34994, - Variant34995, - Variant34996, - Variant34997, - Variant34998, - Variant34999, - Variant35000, - Variant35001, - Variant35002, - Variant35003, - Variant35004, - Variant35005, - Variant35006, - Variant35007, - Variant35008, - Variant35009, - Variant35010, - Variant35011, - Variant35012, - Variant35013, - Variant35014, - Variant35015, - Variant35016, - Variant35017, - Variant35018, - Variant35019, - Variant35020, - Variant35021, - Variant35022, - Variant35023, - Variant35024, - Variant35025, - Variant35026, - Variant35027, - Variant35028, - Variant35029, - Variant35030, - Variant35031, - Variant35032, - Variant35033, - Variant35034, - Variant35035, - Variant35036, - Variant35037, - Variant35038, - Variant35039, - Variant35040, - Variant35041, - Variant35042, - Variant35043, - Variant35044, - Variant35045, - Variant35046, - Variant35047, - Variant35048, - Variant35049, - Variant35050, - Variant35051, - Variant35052, - Variant35053, - Variant35054, - Variant35055, - Variant35056, - Variant35057, - Variant35058, - Variant35059, - Variant35060, - Variant35061, - Variant35062, - Variant35063, - Variant35064, - Variant35065, - Variant35066, - Variant35067, - Variant35068, - Variant35069, - Variant35070, - Variant35071, - Variant35072, - Variant35073, - Variant35074, - Variant35075, - Variant35076, - Variant35077, - Variant35078, - Variant35079, - Variant35080, - Variant35081, - Variant35082, - Variant35083, - Variant35084, - Variant35085, - Variant35086, - Variant35087, - Variant35088, - Variant35089, - Variant35090, - Variant35091, - Variant35092, - Variant35093, - Variant35094, - Variant35095, - Variant35096, - Variant35097, - Variant35098, - Variant35099, - Variant35100, - Variant35101, - Variant35102, - Variant35103, - Variant35104, - Variant35105, - Variant35106, - Variant35107, - Variant35108, - Variant35109, - Variant35110, - Variant35111, - Variant35112, - Variant35113, - Variant35114, - Variant35115, - Variant35116, - Variant35117, - Variant35118, - Variant35119, - Variant35120, - Variant35121, - Variant35122, - Variant35123, - Variant35124, - Variant35125, - Variant35126, - Variant35127, - Variant35128, - Variant35129, - Variant35130, - Variant35131, - Variant35132, - Variant35133, - Variant35134, - Variant35135, - Variant35136, - Variant35137, - Variant35138, - Variant35139, - Variant35140, - Variant35141, - Variant35142, - Variant35143, - Variant35144, - Variant35145, - Variant35146, - Variant35147, - Variant35148, - Variant35149, - Variant35150, - Variant35151, - Variant35152, - Variant35153, - Variant35154, - Variant35155, - Variant35156, - Variant35157, - Variant35158, - Variant35159, - Variant35160, - Variant35161, - Variant35162, - Variant35163, - Variant35164, - Variant35165, - Variant35166, - Variant35167, - Variant35168, - Variant35169, - Variant35170, - Variant35171, - Variant35172, - Variant35173, - Variant35174, - Variant35175, - Variant35176, - Variant35177, - Variant35178, - Variant35179, - Variant35180, - Variant35181, - Variant35182, - Variant35183, - Variant35184, - Variant35185, - Variant35186, - Variant35187, - Variant35188, - Variant35189, - Variant35190, - Variant35191, - Variant35192, - Variant35193, - Variant35194, - Variant35195, - Variant35196, - Variant35197, - Variant35198, - Variant35199, - Variant35200, - Variant35201, - Variant35202, - Variant35203, - Variant35204, - Variant35205, - Variant35206, - Variant35207, - Variant35208, - Variant35209, - Variant35210, - Variant35211, - Variant35212, - Variant35213, - Variant35214, - Variant35215, - Variant35216, - Variant35217, - Variant35218, - Variant35219, - Variant35220, - Variant35221, - Variant35222, - Variant35223, - Variant35224, - Variant35225, - Variant35226, - Variant35227, - Variant35228, - Variant35229, - Variant35230, - Variant35231, - Variant35232, - Variant35233, - Variant35234, - Variant35235, - Variant35236, - Variant35237, - Variant35238, - Variant35239, - Variant35240, - Variant35241, - Variant35242, - Variant35243, - Variant35244, - Variant35245, - Variant35246, - Variant35247, - Variant35248, - Variant35249, - Variant35250, - Variant35251, - Variant35252, - Variant35253, - Variant35254, - Variant35255, - Variant35256, - Variant35257, - Variant35258, - Variant35259, - Variant35260, - Variant35261, - Variant35262, - Variant35263, - Variant35264, - Variant35265, - Variant35266, - Variant35267, - Variant35268, - Variant35269, - Variant35270, - Variant35271, - Variant35272, - Variant35273, - Variant35274, - Variant35275, - Variant35276, - Variant35277, - Variant35278, - Variant35279, - Variant35280, - Variant35281, - Variant35282, - Variant35283, - Variant35284, - Variant35285, - Variant35286, - Variant35287, - Variant35288, - Variant35289, - Variant35290, - Variant35291, - Variant35292, - Variant35293, - Variant35294, - Variant35295, - Variant35296, - Variant35297, - Variant35298, - Variant35299, - Variant35300, - Variant35301, - Variant35302, - Variant35303, - Variant35304, - Variant35305, - Variant35306, - Variant35307, - Variant35308, - Variant35309, - Variant35310, - Variant35311, - Variant35312, - Variant35313, - Variant35314, - Variant35315, - Variant35316, - Variant35317, - Variant35318, - Variant35319, - Variant35320, - Variant35321, - Variant35322, - Variant35323, - Variant35324, - Variant35325, - Variant35326, - Variant35327, - Variant35328, - Variant35329, - Variant35330, - Variant35331, - Variant35332, - Variant35333, - Variant35334, - Variant35335, - Variant35336, - Variant35337, - Variant35338, - Variant35339, - Variant35340, - Variant35341, - Variant35342, - Variant35343, - Variant35344, - Variant35345, - Variant35346, - Variant35347, - Variant35348, - Variant35349, - Variant35350, - Variant35351, - Variant35352, - Variant35353, - Variant35354, - Variant35355, - Variant35356, - Variant35357, - Variant35358, - Variant35359, - Variant35360, - Variant35361, - Variant35362, - Variant35363, - Variant35364, - Variant35365, - Variant35366, - Variant35367, - Variant35368, - Variant35369, - Variant35370, - Variant35371, - Variant35372, - Variant35373, - Variant35374, - Variant35375, - Variant35376, - Variant35377, - Variant35378, - Variant35379, - Variant35380, - Variant35381, - Variant35382, - Variant35383, - Variant35384, - Variant35385, - Variant35386, - Variant35387, - Variant35388, - Variant35389, - Variant35390, - Variant35391, - Variant35392, - Variant35393, - Variant35394, - Variant35395, - Variant35396, - Variant35397, - Variant35398, - Variant35399, - Variant35400, - Variant35401, - Variant35402, - Variant35403, - Variant35404, - Variant35405, - Variant35406, - Variant35407, - Variant35408, - Variant35409, - Variant35410, - Variant35411, - Variant35412, - Variant35413, - Variant35414, - Variant35415, - Variant35416, - Variant35417, - Variant35418, - Variant35419, - Variant35420, - Variant35421, - Variant35422, - Variant35423, - Variant35424, - Variant35425, - Variant35426, - Variant35427, - Variant35428, - Variant35429, - Variant35430, - Variant35431, - Variant35432, - Variant35433, - Variant35434, - Variant35435, - Variant35436, - Variant35437, - Variant35438, - Variant35439, - Variant35440, - Variant35441, - Variant35442, - Variant35443, - Variant35444, - Variant35445, - Variant35446, - Variant35447, - Variant35448, - Variant35449, - Variant35450, - Variant35451, - Variant35452, - Variant35453, - Variant35454, - Variant35455, - Variant35456, - Variant35457, - Variant35458, - Variant35459, - Variant35460, - Variant35461, - Variant35462, - Variant35463, - Variant35464, - Variant35465, - Variant35466, - Variant35467, - Variant35468, - Variant35469, - Variant35470, - Variant35471, - Variant35472, - Variant35473, - Variant35474, - Variant35475, - Variant35476, - Variant35477, - Variant35478, - Variant35479, - Variant35480, - Variant35481, - Variant35482, - Variant35483, - Variant35484, - Variant35485, - Variant35486, - Variant35487, - Variant35488, - Variant35489, - Variant35490, - Variant35491, - Variant35492, - Variant35493, - Variant35494, - Variant35495, - Variant35496, - Variant35497, - Variant35498, - Variant35499, - Variant35500, - Variant35501, - Variant35502, - Variant35503, - Variant35504, - Variant35505, - Variant35506, - Variant35507, - Variant35508, - Variant35509, - Variant35510, - Variant35511, - Variant35512, - Variant35513, - Variant35514, - Variant35515, - Variant35516, - Variant35517, - Variant35518, - Variant35519, - Variant35520, - Variant35521, - Variant35522, - Variant35523, - Variant35524, - Variant35525, - Variant35526, - Variant35527, - Variant35528, - Variant35529, - Variant35530, - Variant35531, - Variant35532, - Variant35533, - Variant35534, - Variant35535, - Variant35536, - Variant35537, - Variant35538, - Variant35539, - Variant35540, - Variant35541, - Variant35542, - Variant35543, - Variant35544, - Variant35545, - Variant35546, - Variant35547, - Variant35548, - Variant35549, - Variant35550, - Variant35551, - Variant35552, - Variant35553, - Variant35554, - Variant35555, - Variant35556, - Variant35557, - Variant35558, - Variant35559, - Variant35560, - Variant35561, - Variant35562, - Variant35563, - Variant35564, - Variant35565, - Variant35566, - Variant35567, - Variant35568, - Variant35569, - Variant35570, - Variant35571, - Variant35572, - Variant35573, - Variant35574, - Variant35575, - Variant35576, - Variant35577, - Variant35578, - Variant35579, - Variant35580, - Variant35581, - Variant35582, - Variant35583, - Variant35584, - Variant35585, - Variant35586, - Variant35587, - Variant35588, - Variant35589, - Variant35590, - Variant35591, - Variant35592, - Variant35593, - Variant35594, - Variant35595, - Variant35596, - Variant35597, - Variant35598, - Variant35599, - Variant35600, - Variant35601, - Variant35602, - Variant35603, - Variant35604, - Variant35605, - Variant35606, - Variant35607, - Variant35608, - Variant35609, - Variant35610, - Variant35611, - Variant35612, - Variant35613, - Variant35614, - Variant35615, - Variant35616, - Variant35617, - Variant35618, - Variant35619, - Variant35620, - Variant35621, - Variant35622, - Variant35623, - Variant35624, - Variant35625, - Variant35626, - Variant35627, - Variant35628, - Variant35629, - Variant35630, - Variant35631, - Variant35632, - Variant35633, - Variant35634, - Variant35635, - Variant35636, - Variant35637, - Variant35638, - Variant35639, - Variant35640, - Variant35641, - Variant35642, - Variant35643, - Variant35644, - Variant35645, - Variant35646, - Variant35647, - Variant35648, - Variant35649, - Variant35650, - Variant35651, - Variant35652, - Variant35653, - Variant35654, - Variant35655, - Variant35656, - Variant35657, - Variant35658, - Variant35659, - Variant35660, - Variant35661, - Variant35662, - Variant35663, - Variant35664, - Variant35665, - Variant35666, - Variant35667, - Variant35668, - Variant35669, - Variant35670, - Variant35671, - Variant35672, - Variant35673, - Variant35674, - Variant35675, - Variant35676, - Variant35677, - Variant35678, - Variant35679, - Variant35680, - Variant35681, - Variant35682, - Variant35683, - Variant35684, - Variant35685, - Variant35686, - Variant35687, - Variant35688, - Variant35689, - Variant35690, - Variant35691, - Variant35692, - Variant35693, - Variant35694, - Variant35695, - Variant35696, - Variant35697, - Variant35698, - Variant35699, - Variant35700, - Variant35701, - Variant35702, - Variant35703, - Variant35704, - Variant35705, - Variant35706, - Variant35707, - Variant35708, - Variant35709, - Variant35710, - Variant35711, - Variant35712, - Variant35713, - Variant35714, - Variant35715, - Variant35716, - Variant35717, - Variant35718, - Variant35719, - Variant35720, - Variant35721, - Variant35722, - Variant35723, - Variant35724, - Variant35725, - Variant35726, - Variant35727, - Variant35728, - Variant35729, - Variant35730, - Variant35731, - Variant35732, - Variant35733, - Variant35734, - Variant35735, - Variant35736, - Variant35737, - Variant35738, - Variant35739, - Variant35740, - Variant35741, - Variant35742, - Variant35743, - Variant35744, - Variant35745, - Variant35746, - Variant35747, - Variant35748, - Variant35749, - Variant35750, - Variant35751, - Variant35752, - Variant35753, - Variant35754, - Variant35755, - Variant35756, - Variant35757, - Variant35758, - Variant35759, - Variant35760, - Variant35761, - Variant35762, - Variant35763, - Variant35764, - Variant35765, - Variant35766, - Variant35767, - Variant35768, - Variant35769, - Variant35770, - Variant35771, - Variant35772, - Variant35773, - Variant35774, - Variant35775, - Variant35776, - Variant35777, - Variant35778, - Variant35779, - Variant35780, - Variant35781, - Variant35782, - Variant35783, - Variant35784, - Variant35785, - Variant35786, - Variant35787, - Variant35788, - Variant35789, - Variant35790, - Variant35791, - Variant35792, - Variant35793, - Variant35794, - Variant35795, - Variant35796, - Variant35797, - Variant35798, - Variant35799, - Variant35800, - Variant35801, - Variant35802, - Variant35803, - Variant35804, - Variant35805, - Variant35806, - Variant35807, - Variant35808, - Variant35809, - Variant35810, - Variant35811, - Variant35812, - Variant35813, - Variant35814, - Variant35815, - Variant35816, - Variant35817, - Variant35818, - Variant35819, - Variant35820, - Variant35821, - Variant35822, - Variant35823, - Variant35824, - Variant35825, - Variant35826, - Variant35827, - Variant35828, - Variant35829, - Variant35830, - Variant35831, - Variant35832, - Variant35833, - Variant35834, - Variant35835, - Variant35836, - Variant35837, - Variant35838, - Variant35839, - Variant35840, - Variant35841, - Variant35842, - Variant35843, - Variant35844, - Variant35845, - Variant35846, - Variant35847, - Variant35848, - Variant35849, - Variant35850, - Variant35851, - Variant35852, - Variant35853, - Variant35854, - Variant35855, - Variant35856, - Variant35857, - Variant35858, - Variant35859, - Variant35860, - Variant35861, - Variant35862, - Variant35863, - Variant35864, - Variant35865, - Variant35866, - Variant35867, - Variant35868, - Variant35869, - Variant35870, - Variant35871, - Variant35872, - Variant35873, - Variant35874, - Variant35875, - Variant35876, - Variant35877, - Variant35878, - Variant35879, - Variant35880, - Variant35881, - Variant35882, - Variant35883, - Variant35884, - Variant35885, - Variant35886, - Variant35887, - Variant35888, - Variant35889, - Variant35890, - Variant35891, - Variant35892, - Variant35893, - Variant35894, - Variant35895, - Variant35896, - Variant35897, - Variant35898, - Variant35899, - Variant35900, - Variant35901, - Variant35902, - Variant35903, - Variant35904, - Variant35905, - Variant35906, - Variant35907, - Variant35908, - Variant35909, - Variant35910, - Variant35911, - Variant35912, - Variant35913, - Variant35914, - Variant35915, - Variant35916, - Variant35917, - Variant35918, - Variant35919, - Variant35920, - Variant35921, - Variant35922, - Variant35923, - Variant35924, - Variant35925, - Variant35926, - Variant35927, - Variant35928, - Variant35929, - Variant35930, - Variant35931, - Variant35932, - Variant35933, - Variant35934, - Variant35935, - Variant35936, - Variant35937, - Variant35938, - Variant35939, - Variant35940, - Variant35941, - Variant35942, - Variant35943, - Variant35944, - Variant35945, - Variant35946, - Variant35947, - Variant35948, - Variant35949, - Variant35950, - Variant35951, - Variant35952, - Variant35953, - Variant35954, - Variant35955, - Variant35956, - Variant35957, - Variant35958, - Variant35959, - Variant35960, - Variant35961, - Variant35962, - Variant35963, - Variant35964, - Variant35965, - Variant35966, - Variant35967, - Variant35968, - Variant35969, - Variant35970, - Variant35971, - Variant35972, - Variant35973, - Variant35974, - Variant35975, - Variant35976, - Variant35977, - Variant35978, - Variant35979, - Variant35980, - Variant35981, - Variant35982, - Variant35983, - Variant35984, - Variant35985, - Variant35986, - Variant35987, - Variant35988, - Variant35989, - Variant35990, - Variant35991, - Variant35992, - Variant35993, - Variant35994, - Variant35995, - Variant35996, - Variant35997, - Variant35998, - Variant35999, - Variant36000, - Variant36001, - Variant36002, - Variant36003, - Variant36004, - Variant36005, - Variant36006, - Variant36007, - Variant36008, - Variant36009, - Variant36010, - Variant36011, - Variant36012, - Variant36013, - Variant36014, - Variant36015, - Variant36016, - Variant36017, - Variant36018, - Variant36019, - Variant36020, - Variant36021, - Variant36022, - Variant36023, - Variant36024, - Variant36025, - Variant36026, - Variant36027, - Variant36028, - Variant36029, - Variant36030, - Variant36031, - Variant36032, - Variant36033, - Variant36034, - Variant36035, - Variant36036, - Variant36037, - Variant36038, - Variant36039, - Variant36040, - Variant36041, - Variant36042, - Variant36043, - Variant36044, - Variant36045, - Variant36046, - Variant36047, - Variant36048, - Variant36049, - Variant36050, - Variant36051, - Variant36052, - Variant36053, - Variant36054, - Variant36055, - Variant36056, - Variant36057, - Variant36058, - Variant36059, - Variant36060, - Variant36061, - Variant36062, - Variant36063, - Variant36064, - Variant36065, - Variant36066, - Variant36067, - Variant36068, - Variant36069, - Variant36070, - Variant36071, - Variant36072, - Variant36073, - Variant36074, - Variant36075, - Variant36076, - Variant36077, - Variant36078, - Variant36079, - Variant36080, - Variant36081, - Variant36082, - Variant36083, - Variant36084, - Variant36085, - Variant36086, - Variant36087, - Variant36088, - Variant36089, - Variant36090, - Variant36091, - Variant36092, - Variant36093, - Variant36094, - Variant36095, - Variant36096, - Variant36097, - Variant36098, - Variant36099, - Variant36100, - Variant36101, - Variant36102, - Variant36103, - Variant36104, - Variant36105, - Variant36106, - Variant36107, - Variant36108, - Variant36109, - Variant36110, - Variant36111, - Variant36112, - Variant36113, - Variant36114, - Variant36115, - Variant36116, - Variant36117, - Variant36118, - Variant36119, - Variant36120, - Variant36121, - Variant36122, - Variant36123, - Variant36124, - Variant36125, - Variant36126, - Variant36127, - Variant36128, - Variant36129, - Variant36130, - Variant36131, - Variant36132, - Variant36133, - Variant36134, - Variant36135, - Variant36136, - Variant36137, - Variant36138, - Variant36139, - Variant36140, - Variant36141, - Variant36142, - Variant36143, - Variant36144, - Variant36145, - Variant36146, - Variant36147, - Variant36148, - Variant36149, - Variant36150, - Variant36151, - Variant36152, - Variant36153, - Variant36154, - Variant36155, - Variant36156, - Variant36157, - Variant36158, - Variant36159, - Variant36160, - Variant36161, - Variant36162, - Variant36163, - Variant36164, - Variant36165, - Variant36166, - Variant36167, - Variant36168, - Variant36169, - Variant36170, - Variant36171, - Variant36172, - Variant36173, - Variant36174, - Variant36175, - Variant36176, - Variant36177, - Variant36178, - Variant36179, - Variant36180, - Variant36181, - Variant36182, - Variant36183, - Variant36184, - Variant36185, - Variant36186, - Variant36187, - Variant36188, - Variant36189, - Variant36190, - Variant36191, - Variant36192, - Variant36193, - Variant36194, - Variant36195, - Variant36196, - Variant36197, - Variant36198, - Variant36199, - Variant36200, - Variant36201, - Variant36202, - Variant36203, - Variant36204, - Variant36205, - Variant36206, - Variant36207, - Variant36208, - Variant36209, - Variant36210, - Variant36211, - Variant36212, - Variant36213, - Variant36214, - Variant36215, - Variant36216, - Variant36217, - Variant36218, - Variant36219, - Variant36220, - Variant36221, - Variant36222, - Variant36223, - Variant36224, - Variant36225, - Variant36226, - Variant36227, - Variant36228, - Variant36229, - Variant36230, - Variant36231, - Variant36232, - Variant36233, - Variant36234, - Variant36235, - Variant36236, - Variant36237, - Variant36238, - Variant36239, - Variant36240, - Variant36241, - Variant36242, - Variant36243, - Variant36244, - Variant36245, - Variant36246, - Variant36247, - Variant36248, - Variant36249, - Variant36250, - Variant36251, - Variant36252, - Variant36253, - Variant36254, - Variant36255, - Variant36256, - Variant36257, - Variant36258, - Variant36259, - Variant36260, - Variant36261, - Variant36262, - Variant36263, - Variant36264, - Variant36265, - Variant36266, - Variant36267, - Variant36268, - Variant36269, - Variant36270, - Variant36271, - Variant36272, - Variant36273, - Variant36274, - Variant36275, - Variant36276, - Variant36277, - Variant36278, - Variant36279, - Variant36280, - Variant36281, - Variant36282, - Variant36283, - Variant36284, - Variant36285, - Variant36286, - Variant36287, - Variant36288, - Variant36289, - Variant36290, - Variant36291, - Variant36292, - Variant36293, - Variant36294, - Variant36295, - Variant36296, - Variant36297, - Variant36298, - Variant36299, - Variant36300, - Variant36301, - Variant36302, - Variant36303, - Variant36304, - Variant36305, - Variant36306, - Variant36307, - Variant36308, - Variant36309, - Variant36310, - Variant36311, - Variant36312, - Variant36313, - Variant36314, - Variant36315, - Variant36316, - Variant36317, - Variant36318, - Variant36319, - Variant36320, - Variant36321, - Variant36322, - Variant36323, - Variant36324, - Variant36325, - Variant36326, - Variant36327, - Variant36328, - Variant36329, - Variant36330, - Variant36331, - Variant36332, - Variant36333, - Variant36334, - Variant36335, - Variant36336, - Variant36337, - Variant36338, - Variant36339, - Variant36340, - Variant36341, - Variant36342, - Variant36343, - Variant36344, - Variant36345, - Variant36346, - Variant36347, - Variant36348, - Variant36349, - Variant36350, - Variant36351, - Variant36352, - Variant36353, - Variant36354, - Variant36355, - Variant36356, - Variant36357, - Variant36358, - Variant36359, - Variant36360, - Variant36361, - Variant36362, - Variant36363, - Variant36364, - Variant36365, - Variant36366, - Variant36367, - Variant36368, - Variant36369, - Variant36370, - Variant36371, - Variant36372, - Variant36373, - Variant36374, - Variant36375, - Variant36376, - Variant36377, - Variant36378, - Variant36379, - Variant36380, - Variant36381, - Variant36382, - Variant36383, - Variant36384, - Variant36385, - Variant36386, - Variant36387, - Variant36388, - Variant36389, - Variant36390, - Variant36391, - Variant36392, - Variant36393, - Variant36394, - Variant36395, - Variant36396, - Variant36397, - Variant36398, - Variant36399, - Variant36400, - Variant36401, - Variant36402, - Variant36403, - Variant36404, - Variant36405, - Variant36406, - Variant36407, - Variant36408, - Variant36409, - Variant36410, - Variant36411, - Variant36412, - Variant36413, - Variant36414, - Variant36415, - Variant36416, - Variant36417, - Variant36418, - Variant36419, - Variant36420, - Variant36421, - Variant36422, - Variant36423, - Variant36424, - Variant36425, - Variant36426, - Variant36427, - Variant36428, - Variant36429, - Variant36430, - Variant36431, - Variant36432, - Variant36433, - Variant36434, - Variant36435, - Variant36436, - Variant36437, - Variant36438, - Variant36439, - Variant36440, - Variant36441, - Variant36442, - Variant36443, - Variant36444, - Variant36445, - Variant36446, - Variant36447, - Variant36448, - Variant36449, - Variant36450, - Variant36451, - Variant36452, - Variant36453, - Variant36454, - Variant36455, - Variant36456, - Variant36457, - Variant36458, - Variant36459, - Variant36460, - Variant36461, - Variant36462, - Variant36463, - Variant36464, - Variant36465, - Variant36466, - Variant36467, - Variant36468, - Variant36469, - Variant36470, - Variant36471, - Variant36472, - Variant36473, - Variant36474, - Variant36475, - Variant36476, - Variant36477, - Variant36478, - Variant36479, - Variant36480, - Variant36481, - Variant36482, - Variant36483, - Variant36484, - Variant36485, - Variant36486, - Variant36487, - Variant36488, - Variant36489, - Variant36490, - Variant36491, - Variant36492, - Variant36493, - Variant36494, - Variant36495, - Variant36496, - Variant36497, - Variant36498, - Variant36499, - Variant36500, - Variant36501, - Variant36502, - Variant36503, - Variant36504, - Variant36505, - Variant36506, - Variant36507, - Variant36508, - Variant36509, - Variant36510, - Variant36511, - Variant36512, - Variant36513, - Variant36514, - Variant36515, - Variant36516, - Variant36517, - Variant36518, - Variant36519, - Variant36520, - Variant36521, - Variant36522, - Variant36523, - Variant36524, - Variant36525, - Variant36526, - Variant36527, - Variant36528, - Variant36529, - Variant36530, - Variant36531, - Variant36532, - Variant36533, - Variant36534, - Variant36535, - Variant36536, - Variant36537, - Variant36538, - Variant36539, - Variant36540, - Variant36541, - Variant36542, - Variant36543, - Variant36544, - Variant36545, - Variant36546, - Variant36547, - Variant36548, - Variant36549, - Variant36550, - Variant36551, - Variant36552, - Variant36553, - Variant36554, - Variant36555, - Variant36556, - Variant36557, - Variant36558, - Variant36559, - Variant36560, - Variant36561, - Variant36562, - Variant36563, - Variant36564, - Variant36565, - Variant36566, - Variant36567, - Variant36568, - Variant36569, - Variant36570, - Variant36571, - Variant36572, - Variant36573, - Variant36574, - Variant36575, - Variant36576, - Variant36577, - Variant36578, - Variant36579, - Variant36580, - Variant36581, - Variant36582, - Variant36583, - Variant36584, - Variant36585, - Variant36586, - Variant36587, - Variant36588, - Variant36589, - Variant36590, - Variant36591, - Variant36592, - Variant36593, - Variant36594, - Variant36595, - Variant36596, - Variant36597, - Variant36598, - Variant36599, - Variant36600, - Variant36601, - Variant36602, - Variant36603, - Variant36604, - Variant36605, - Variant36606, - Variant36607, - Variant36608, - Variant36609, - Variant36610, - Variant36611, - Variant36612, - Variant36613, - Variant36614, - Variant36615, - Variant36616, - Variant36617, - Variant36618, - Variant36619, - Variant36620, - Variant36621, - Variant36622, - Variant36623, - Variant36624, - Variant36625, - Variant36626, - Variant36627, - Variant36628, - Variant36629, - Variant36630, - Variant36631, - Variant36632, - Variant36633, - Variant36634, - Variant36635, - Variant36636, - Variant36637, - Variant36638, - Variant36639, - Variant36640, - Variant36641, - Variant36642, - Variant36643, - Variant36644, - Variant36645, - Variant36646, - Variant36647, - Variant36648, - Variant36649, - Variant36650, - Variant36651, - Variant36652, - Variant36653, - Variant36654, - Variant36655, - Variant36656, - Variant36657, - Variant36658, - Variant36659, - Variant36660, - Variant36661, - Variant36662, - Variant36663, - Variant36664, - Variant36665, - Variant36666, - Variant36667, - Variant36668, - Variant36669, - Variant36670, - Variant36671, - Variant36672, - Variant36673, - Variant36674, - Variant36675, - Variant36676, - Variant36677, - Variant36678, - Variant36679, - Variant36680, - Variant36681, - Variant36682, - Variant36683, - Variant36684, - Variant36685, - Variant36686, - Variant36687, - Variant36688, - Variant36689, - Variant36690, - Variant36691, - Variant36692, - Variant36693, - Variant36694, - Variant36695, - Variant36696, - Variant36697, - Variant36698, - Variant36699, - Variant36700, - Variant36701, - Variant36702, - Variant36703, - Variant36704, - Variant36705, - Variant36706, - Variant36707, - Variant36708, - Variant36709, - Variant36710, - Variant36711, - Variant36712, - Variant36713, - Variant36714, - Variant36715, - Variant36716, - Variant36717, - Variant36718, - Variant36719, - Variant36720, - Variant36721, - Variant36722, - Variant36723, - Variant36724, - Variant36725, - Variant36726, - Variant36727, - Variant36728, - Variant36729, - Variant36730, - Variant36731, - Variant36732, - Variant36733, - Variant36734, - Variant36735, - Variant36736, - Variant36737, - Variant36738, - Variant36739, - Variant36740, - Variant36741, - Variant36742, - Variant36743, - Variant36744, - Variant36745, - Variant36746, - Variant36747, - Variant36748, - Variant36749, - Variant36750, - Variant36751, - Variant36752, - Variant36753, - Variant36754, - Variant36755, - Variant36756, - Variant36757, - Variant36758, - Variant36759, - Variant36760, - Variant36761, - Variant36762, - Variant36763, - Variant36764, - Variant36765, - Variant36766, - Variant36767, - Variant36768, - Variant36769, - Variant36770, - Variant36771, - Variant36772, - Variant36773, - Variant36774, - Variant36775, - Variant36776, - Variant36777, - Variant36778, - Variant36779, - Variant36780, - Variant36781, - Variant36782, - Variant36783, - Variant36784, - Variant36785, - Variant36786, - Variant36787, - Variant36788, - Variant36789, - Variant36790, - Variant36791, - Variant36792, - Variant36793, - Variant36794, - Variant36795, - Variant36796, - Variant36797, - Variant36798, - Variant36799, - Variant36800, - Variant36801, - Variant36802, - Variant36803, - Variant36804, - Variant36805, - Variant36806, - Variant36807, - Variant36808, - Variant36809, - Variant36810, - Variant36811, - Variant36812, - Variant36813, - Variant36814, - Variant36815, - Variant36816, - Variant36817, - Variant36818, - Variant36819, - Variant36820, - Variant36821, - Variant36822, - Variant36823, - Variant36824, - Variant36825, - Variant36826, - Variant36827, - Variant36828, - Variant36829, - Variant36830, - Variant36831, - Variant36832, - Variant36833, - Variant36834, - Variant36835, - Variant36836, - Variant36837, - Variant36838, - Variant36839, - Variant36840, - Variant36841, - Variant36842, - Variant36843, - Variant36844, - Variant36845, - Variant36846, - Variant36847, - Variant36848, - Variant36849, - Variant36850, - Variant36851, - Variant36852, - Variant36853, - Variant36854, - Variant36855, - Variant36856, - Variant36857, - Variant36858, - Variant36859, - Variant36860, - Variant36861, - Variant36862, - Variant36863, - Variant36864, - Variant36865, - Variant36866, - Variant36867, - Variant36868, - Variant36869, - Variant36870, - Variant36871, - Variant36872, - Variant36873, - Variant36874, - Variant36875, - Variant36876, - Variant36877, - Variant36878, - Variant36879, - Variant36880, - Variant36881, - Variant36882, - Variant36883, - Variant36884, - Variant36885, - Variant36886, - Variant36887, - Variant36888, - Variant36889, - Variant36890, - Variant36891, - Variant36892, - Variant36893, - Variant36894, - Variant36895, - Variant36896, - Variant36897, - Variant36898, - Variant36899, - Variant36900, - Variant36901, - Variant36902, - Variant36903, - Variant36904, - Variant36905, - Variant36906, - Variant36907, - Variant36908, - Variant36909, - Variant36910, - Variant36911, - Variant36912, - Variant36913, - Variant36914, - Variant36915, - Variant36916, - Variant36917, - Variant36918, - Variant36919, - Variant36920, - Variant36921, - Variant36922, - Variant36923, - Variant36924, - Variant36925, - Variant36926, - Variant36927, - Variant36928, - Variant36929, - Variant36930, - Variant36931, - Variant36932, - Variant36933, - Variant36934, - Variant36935, - Variant36936, - Variant36937, - Variant36938, - Variant36939, - Variant36940, - Variant36941, - Variant36942, - Variant36943, - Variant36944, - Variant36945, - Variant36946, - Variant36947, - Variant36948, - Variant36949, - Variant36950, - Variant36951, - Variant36952, - Variant36953, - Variant36954, - Variant36955, - Variant36956, - Variant36957, - Variant36958, - Variant36959, - Variant36960, - Variant36961, - Variant36962, - Variant36963, - Variant36964, - Variant36965, - Variant36966, - Variant36967, - Variant36968, - Variant36969, - Variant36970, - Variant36971, - Variant36972, - Variant36973, - Variant36974, - Variant36975, - Variant36976, - Variant36977, - Variant36978, - Variant36979, - Variant36980, - Variant36981, - Variant36982, - Variant36983, - Variant36984, - Variant36985, - Variant36986, - Variant36987, - Variant36988, - Variant36989, - Variant36990, - Variant36991, - Variant36992, - Variant36993, - Variant36994, - Variant36995, - Variant36996, - Variant36997, - Variant36998, - Variant36999, - Variant37000, - Variant37001, - Variant37002, - Variant37003, - Variant37004, - Variant37005, - Variant37006, - Variant37007, - Variant37008, - Variant37009, - Variant37010, - Variant37011, - Variant37012, - Variant37013, - Variant37014, - Variant37015, - Variant37016, - Variant37017, - Variant37018, - Variant37019, - Variant37020, - Variant37021, - Variant37022, - Variant37023, - Variant37024, - Variant37025, - Variant37026, - Variant37027, - Variant37028, - Variant37029, - Variant37030, - Variant37031, - Variant37032, - Variant37033, - Variant37034, - Variant37035, - Variant37036, - Variant37037, - Variant37038, - Variant37039, - Variant37040, - Variant37041, - Variant37042, - Variant37043, - Variant37044, - Variant37045, - Variant37046, - Variant37047, - Variant37048, - Variant37049, - Variant37050, - Variant37051, - Variant37052, - Variant37053, - Variant37054, - Variant37055, - Variant37056, - Variant37057, - Variant37058, - Variant37059, - Variant37060, - Variant37061, - Variant37062, - Variant37063, - Variant37064, - Variant37065, - Variant37066, - Variant37067, - Variant37068, - Variant37069, - Variant37070, - Variant37071, - Variant37072, - Variant37073, - Variant37074, - Variant37075, - Variant37076, - Variant37077, - Variant37078, - Variant37079, - Variant37080, - Variant37081, - Variant37082, - Variant37083, - Variant37084, - Variant37085, - Variant37086, - Variant37087, - Variant37088, - Variant37089, - Variant37090, - Variant37091, - Variant37092, - Variant37093, - Variant37094, - Variant37095, - Variant37096, - Variant37097, - Variant37098, - Variant37099, - Variant37100, - Variant37101, - Variant37102, - Variant37103, - Variant37104, - Variant37105, - Variant37106, - Variant37107, - Variant37108, - Variant37109, - Variant37110, - Variant37111, - Variant37112, - Variant37113, - Variant37114, - Variant37115, - Variant37116, - Variant37117, - Variant37118, - Variant37119, - Variant37120, - Variant37121, - Variant37122, - Variant37123, - Variant37124, - Variant37125, - Variant37126, - Variant37127, - Variant37128, - Variant37129, - Variant37130, - Variant37131, - Variant37132, - Variant37133, - Variant37134, - Variant37135, - Variant37136, - Variant37137, - Variant37138, - Variant37139, - Variant37140, - Variant37141, - Variant37142, - Variant37143, - Variant37144, - Variant37145, - Variant37146, - Variant37147, - Variant37148, - Variant37149, - Variant37150, - Variant37151, - Variant37152, - Variant37153, - Variant37154, - Variant37155, - Variant37156, - Variant37157, - Variant37158, - Variant37159, - Variant37160, - Variant37161, - Variant37162, - Variant37163, - Variant37164, - Variant37165, - Variant37166, - Variant37167, - Variant37168, - Variant37169, - Variant37170, - Variant37171, - Variant37172, - Variant37173, - Variant37174, - Variant37175, - Variant37176, - Variant37177, - Variant37178, - Variant37179, - Variant37180, - Variant37181, - Variant37182, - Variant37183, - Variant37184, - Variant37185, - Variant37186, - Variant37187, - Variant37188, - Variant37189, - Variant37190, - Variant37191, - Variant37192, - Variant37193, - Variant37194, - Variant37195, - Variant37196, - Variant37197, - Variant37198, - Variant37199, - Variant37200, - Variant37201, - Variant37202, - Variant37203, - Variant37204, - Variant37205, - Variant37206, - Variant37207, - Variant37208, - Variant37209, - Variant37210, - Variant37211, - Variant37212, - Variant37213, - Variant37214, - Variant37215, - Variant37216, - Variant37217, - Variant37218, - Variant37219, - Variant37220, - Variant37221, - Variant37222, - Variant37223, - Variant37224, - Variant37225, - Variant37226, - Variant37227, - Variant37228, - Variant37229, - Variant37230, - Variant37231, - Variant37232, - Variant37233, - Variant37234, - Variant37235, - Variant37236, - Variant37237, - Variant37238, - Variant37239, - Variant37240, - Variant37241, - Variant37242, - Variant37243, - Variant37244, - Variant37245, - Variant37246, - Variant37247, - Variant37248, - Variant37249, - Variant37250, - Variant37251, - Variant37252, - Variant37253, - Variant37254, - Variant37255, - Variant37256, - Variant37257, - Variant37258, - Variant37259, - Variant37260, - Variant37261, - Variant37262, - Variant37263, - Variant37264, - Variant37265, - Variant37266, - Variant37267, - Variant37268, - Variant37269, - Variant37270, - Variant37271, - Variant37272, - Variant37273, - Variant37274, - Variant37275, - Variant37276, - Variant37277, - Variant37278, - Variant37279, - Variant37280, - Variant37281, - Variant37282, - Variant37283, - Variant37284, - Variant37285, - Variant37286, - Variant37287, - Variant37288, - Variant37289, - Variant37290, - Variant37291, - Variant37292, - Variant37293, - Variant37294, - Variant37295, - Variant37296, - Variant37297, - Variant37298, - Variant37299, - Variant37300, - Variant37301, - Variant37302, - Variant37303, - Variant37304, - Variant37305, - Variant37306, - Variant37307, - Variant37308, - Variant37309, - Variant37310, - Variant37311, - Variant37312, - Variant37313, - Variant37314, - Variant37315, - Variant37316, - Variant37317, - Variant37318, - Variant37319, - Variant37320, - Variant37321, - Variant37322, - Variant37323, - Variant37324, - Variant37325, - Variant37326, - Variant37327, - Variant37328, - Variant37329, - Variant37330, - Variant37331, - Variant37332, - Variant37333, - Variant37334, - Variant37335, - Variant37336, - Variant37337, - Variant37338, - Variant37339, - Variant37340, - Variant37341, - Variant37342, - Variant37343, - Variant37344, - Variant37345, - Variant37346, - Variant37347, - Variant37348, - Variant37349, - Variant37350, - Variant37351, - Variant37352, - Variant37353, - Variant37354, - Variant37355, - Variant37356, - Variant37357, - Variant37358, - Variant37359, - Variant37360, - Variant37361, - Variant37362, - Variant37363, - Variant37364, - Variant37365, - Variant37366, - Variant37367, - Variant37368, - Variant37369, - Variant37370, - Variant37371, - Variant37372, - Variant37373, - Variant37374, - Variant37375, - Variant37376, - Variant37377, - Variant37378, - Variant37379, - Variant37380, - Variant37381, - Variant37382, - Variant37383, - Variant37384, - Variant37385, - Variant37386, - Variant37387, - Variant37388, - Variant37389, - Variant37390, - Variant37391, - Variant37392, - Variant37393, - Variant37394, - Variant37395, - Variant37396, - Variant37397, - Variant37398, - Variant37399, - Variant37400, - Variant37401, - Variant37402, - Variant37403, - Variant37404, - Variant37405, - Variant37406, - Variant37407, - Variant37408, - Variant37409, - Variant37410, - Variant37411, - Variant37412, - Variant37413, - Variant37414, - Variant37415, - Variant37416, - Variant37417, - Variant37418, - Variant37419, - Variant37420, - Variant37421, - Variant37422, - Variant37423, - Variant37424, - Variant37425, - Variant37426, - Variant37427, - Variant37428, - Variant37429, - Variant37430, - Variant37431, - Variant37432, - Variant37433, - Variant37434, - Variant37435, - Variant37436, - Variant37437, - Variant37438, - Variant37439, - Variant37440, - Variant37441, - Variant37442, - Variant37443, - Variant37444, - Variant37445, - Variant37446, - Variant37447, - Variant37448, - Variant37449, - Variant37450, - Variant37451, - Variant37452, - Variant37453, - Variant37454, - Variant37455, - Variant37456, - Variant37457, - Variant37458, - Variant37459, - Variant37460, - Variant37461, - Variant37462, - Variant37463, - Variant37464, - Variant37465, - Variant37466, - Variant37467, - Variant37468, - Variant37469, - Variant37470, - Variant37471, - Variant37472, - Variant37473, - Variant37474, - Variant37475, - Variant37476, - Variant37477, - Variant37478, - Variant37479, - Variant37480, - Variant37481, - Variant37482, - Variant37483, - Variant37484, - Variant37485, - Variant37486, - Variant37487, - Variant37488, - Variant37489, - Variant37490, - Variant37491, - Variant37492, - Variant37493, - Variant37494, - Variant37495, - Variant37496, - Variant37497, - Variant37498, - Variant37499, - Variant37500, - Variant37501, - Variant37502, - Variant37503, - Variant37504, - Variant37505, - Variant37506, - Variant37507, - Variant37508, - Variant37509, - Variant37510, - Variant37511, - Variant37512, - Variant37513, - Variant37514, - Variant37515, - Variant37516, - Variant37517, - Variant37518, - Variant37519, - Variant37520, - Variant37521, - Variant37522, - Variant37523, - Variant37524, - Variant37525, - Variant37526, - Variant37527, - Variant37528, - Variant37529, - Variant37530, - Variant37531, - Variant37532, - Variant37533, - Variant37534, - Variant37535, - Variant37536, - Variant37537, - Variant37538, - Variant37539, - Variant37540, - Variant37541, - Variant37542, - Variant37543, - Variant37544, - Variant37545, - Variant37546, - Variant37547, - Variant37548, - Variant37549, - Variant37550, - Variant37551, - Variant37552, - Variant37553, - Variant37554, - Variant37555, - Variant37556, - Variant37557, - Variant37558, - Variant37559, - Variant37560, - Variant37561, - Variant37562, - Variant37563, - Variant37564, - Variant37565, - Variant37566, - Variant37567, - Variant37568, - Variant37569, - Variant37570, - Variant37571, - Variant37572, - Variant37573, - Variant37574, - Variant37575, - Variant37576, - Variant37577, - Variant37578, - Variant37579, - Variant37580, - Variant37581, - Variant37582, - Variant37583, - Variant37584, - Variant37585, - Variant37586, - Variant37587, - Variant37588, - Variant37589, - Variant37590, - Variant37591, - Variant37592, - Variant37593, - Variant37594, - Variant37595, - Variant37596, - Variant37597, - Variant37598, - Variant37599, - Variant37600, - Variant37601, - Variant37602, - Variant37603, - Variant37604, - Variant37605, - Variant37606, - Variant37607, - Variant37608, - Variant37609, - Variant37610, - Variant37611, - Variant37612, - Variant37613, - Variant37614, - Variant37615, - Variant37616, - Variant37617, - Variant37618, - Variant37619, - Variant37620, - Variant37621, - Variant37622, - Variant37623, - Variant37624, - Variant37625, - Variant37626, - Variant37627, - Variant37628, - Variant37629, - Variant37630, - Variant37631, - Variant37632, - Variant37633, - Variant37634, - Variant37635, - Variant37636, - Variant37637, - Variant37638, - Variant37639, - Variant37640, - Variant37641, - Variant37642, - Variant37643, - Variant37644, - Variant37645, - Variant37646, - Variant37647, - Variant37648, - Variant37649, - Variant37650, - Variant37651, - Variant37652, - Variant37653, - Variant37654, - Variant37655, - Variant37656, - Variant37657, - Variant37658, - Variant37659, - Variant37660, - Variant37661, - Variant37662, - Variant37663, - Variant37664, - Variant37665, - Variant37666, - Variant37667, - Variant37668, - Variant37669, - Variant37670, - Variant37671, - Variant37672, - Variant37673, - Variant37674, - Variant37675, - Variant37676, - Variant37677, - Variant37678, - Variant37679, - Variant37680, - Variant37681, - Variant37682, - Variant37683, - Variant37684, - Variant37685, - Variant37686, - Variant37687, - Variant37688, - Variant37689, - Variant37690, - Variant37691, - Variant37692, - Variant37693, - Variant37694, - Variant37695, - Variant37696, - Variant37697, - Variant37698, - Variant37699, - Variant37700, - Variant37701, - Variant37702, - Variant37703, - Variant37704, - Variant37705, - Variant37706, - Variant37707, - Variant37708, - Variant37709, - Variant37710, - Variant37711, - Variant37712, - Variant37713, - Variant37714, - Variant37715, - Variant37716, - Variant37717, - Variant37718, - Variant37719, - Variant37720, - Variant37721, - Variant37722, - Variant37723, - Variant37724, - Variant37725, - Variant37726, - Variant37727, - Variant37728, - Variant37729, - Variant37730, - Variant37731, - Variant37732, - Variant37733, - Variant37734, - Variant37735, - Variant37736, - Variant37737, - Variant37738, - Variant37739, - Variant37740, - Variant37741, - Variant37742, - Variant37743, - Variant37744, - Variant37745, - Variant37746, - Variant37747, - Variant37748, - Variant37749, - Variant37750, - Variant37751, - Variant37752, - Variant37753, - Variant37754, - Variant37755, - Variant37756, - Variant37757, - Variant37758, - Variant37759, - Variant37760, - Variant37761, - Variant37762, - Variant37763, - Variant37764, - Variant37765, - Variant37766, - Variant37767, - Variant37768, - Variant37769, - Variant37770, - Variant37771, - Variant37772, - Variant37773, - Variant37774, - Variant37775, - Variant37776, - Variant37777, - Variant37778, - Variant37779, - Variant37780, - Variant37781, - Variant37782, - Variant37783, - Variant37784, - Variant37785, - Variant37786, - Variant37787, - Variant37788, - Variant37789, - Variant37790, - Variant37791, - Variant37792, - Variant37793, - Variant37794, - Variant37795, - Variant37796, - Variant37797, - Variant37798, - Variant37799, - Variant37800, - Variant37801, - Variant37802, - Variant37803, - Variant37804, - Variant37805, - Variant37806, - Variant37807, - Variant37808, - Variant37809, - Variant37810, - Variant37811, - Variant37812, - Variant37813, - Variant37814, - Variant37815, - Variant37816, - Variant37817, - Variant37818, - Variant37819, - Variant37820, - Variant37821, - Variant37822, - Variant37823, - Variant37824, - Variant37825, - Variant37826, - Variant37827, - Variant37828, - Variant37829, - Variant37830, - Variant37831, - Variant37832, - Variant37833, - Variant37834, - Variant37835, - Variant37836, - Variant37837, - Variant37838, - Variant37839, - Variant37840, - Variant37841, - Variant37842, - Variant37843, - Variant37844, - Variant37845, - Variant37846, - Variant37847, - Variant37848, - Variant37849, - Variant37850, - Variant37851, - Variant37852, - Variant37853, - Variant37854, - Variant37855, - Variant37856, - Variant37857, - Variant37858, - Variant37859, - Variant37860, - Variant37861, - Variant37862, - Variant37863, - Variant37864, - Variant37865, - Variant37866, - Variant37867, - Variant37868, - Variant37869, - Variant37870, - Variant37871, - Variant37872, - Variant37873, - Variant37874, - Variant37875, - Variant37876, - Variant37877, - Variant37878, - Variant37879, - Variant37880, - Variant37881, - Variant37882, - Variant37883, - Variant37884, - Variant37885, - Variant37886, - Variant37887, - Variant37888, - Variant37889, - Variant37890, - Variant37891, - Variant37892, - Variant37893, - Variant37894, - Variant37895, - Variant37896, - Variant37897, - Variant37898, - Variant37899, - Variant37900, - Variant37901, - Variant37902, - Variant37903, - Variant37904, - Variant37905, - Variant37906, - Variant37907, - Variant37908, - Variant37909, - Variant37910, - Variant37911, - Variant37912, - Variant37913, - Variant37914, - Variant37915, - Variant37916, - Variant37917, - Variant37918, - Variant37919, - Variant37920, - Variant37921, - Variant37922, - Variant37923, - Variant37924, - Variant37925, - Variant37926, - Variant37927, - Variant37928, - Variant37929, - Variant37930, - Variant37931, - Variant37932, - Variant37933, - Variant37934, - Variant37935, - Variant37936, - Variant37937, - Variant37938, - Variant37939, - Variant37940, - Variant37941, - Variant37942, - Variant37943, - Variant37944, - Variant37945, - Variant37946, - Variant37947, - Variant37948, - Variant37949, - Variant37950, - Variant37951, - Variant37952, - Variant37953, - Variant37954, - Variant37955, - Variant37956, - Variant37957, - Variant37958, - Variant37959, - Variant37960, - Variant37961, - Variant37962, - Variant37963, - Variant37964, - Variant37965, - Variant37966, - Variant37967, - Variant37968, - Variant37969, - Variant37970, - Variant37971, - Variant37972, - Variant37973, - Variant37974, - Variant37975, - Variant37976, - Variant37977, - Variant37978, - Variant37979, - Variant37980, - Variant37981, - Variant37982, - Variant37983, - Variant37984, - Variant37985, - Variant37986, - Variant37987, - Variant37988, - Variant37989, - Variant37990, - Variant37991, - Variant37992, - Variant37993, - Variant37994, - Variant37995, - Variant37996, - Variant37997, - Variant37998, - Variant37999, - Variant38000, - Variant38001, - Variant38002, - Variant38003, - Variant38004, - Variant38005, - Variant38006, - Variant38007, - Variant38008, - Variant38009, - Variant38010, - Variant38011, - Variant38012, - Variant38013, - Variant38014, - Variant38015, - Variant38016, - Variant38017, - Variant38018, - Variant38019, - Variant38020, - Variant38021, - Variant38022, - Variant38023, - Variant38024, - Variant38025, - Variant38026, - Variant38027, - Variant38028, - Variant38029, - Variant38030, - Variant38031, - Variant38032, - Variant38033, - Variant38034, - Variant38035, - Variant38036, - Variant38037, - Variant38038, - Variant38039, - Variant38040, - Variant38041, - Variant38042, - Variant38043, - Variant38044, - Variant38045, - Variant38046, - Variant38047, - Variant38048, - Variant38049, - Variant38050, - Variant38051, - Variant38052, - Variant38053, - Variant38054, - Variant38055, - Variant38056, - Variant38057, - Variant38058, - Variant38059, - Variant38060, - Variant38061, - Variant38062, - Variant38063, - Variant38064, - Variant38065, - Variant38066, - Variant38067, - Variant38068, - Variant38069, - Variant38070, - Variant38071, - Variant38072, - Variant38073, - Variant38074, - Variant38075, - Variant38076, - Variant38077, - Variant38078, - Variant38079, - Variant38080, - Variant38081, - Variant38082, - Variant38083, - Variant38084, - Variant38085, - Variant38086, - Variant38087, - Variant38088, - Variant38089, - Variant38090, - Variant38091, - Variant38092, - Variant38093, - Variant38094, - Variant38095, - Variant38096, - Variant38097, - Variant38098, - Variant38099, - Variant38100, - Variant38101, - Variant38102, - Variant38103, - Variant38104, - Variant38105, - Variant38106, - Variant38107, - Variant38108, - Variant38109, - Variant38110, - Variant38111, - Variant38112, - Variant38113, - Variant38114, - Variant38115, - Variant38116, - Variant38117, - Variant38118, - Variant38119, - Variant38120, - Variant38121, - Variant38122, - Variant38123, - Variant38124, - Variant38125, - Variant38126, - Variant38127, - Variant38128, - Variant38129, - Variant38130, - Variant38131, - Variant38132, - Variant38133, - Variant38134, - Variant38135, - Variant38136, - Variant38137, - Variant38138, - Variant38139, - Variant38140, - Variant38141, - Variant38142, - Variant38143, - Variant38144, - Variant38145, - Variant38146, - Variant38147, - Variant38148, - Variant38149, - Variant38150, - Variant38151, - Variant38152, - Variant38153, - Variant38154, - Variant38155, - Variant38156, - Variant38157, - Variant38158, - Variant38159, - Variant38160, - Variant38161, - Variant38162, - Variant38163, - Variant38164, - Variant38165, - Variant38166, - Variant38167, - Variant38168, - Variant38169, - Variant38170, - Variant38171, - Variant38172, - Variant38173, - Variant38174, - Variant38175, - Variant38176, - Variant38177, - Variant38178, - Variant38179, - Variant38180, - Variant38181, - Variant38182, - Variant38183, - Variant38184, - Variant38185, - Variant38186, - Variant38187, - Variant38188, - Variant38189, - Variant38190, - Variant38191, - Variant38192, - Variant38193, - Variant38194, - Variant38195, - Variant38196, - Variant38197, - Variant38198, - Variant38199, - Variant38200, - Variant38201, - Variant38202, - Variant38203, - Variant38204, - Variant38205, - Variant38206, - Variant38207, - Variant38208, - Variant38209, - Variant38210, - Variant38211, - Variant38212, - Variant38213, - Variant38214, - Variant38215, - Variant38216, - Variant38217, - Variant38218, - Variant38219, - Variant38220, - Variant38221, - Variant38222, - Variant38223, - Variant38224, - Variant38225, - Variant38226, - Variant38227, - Variant38228, - Variant38229, - Variant38230, - Variant38231, - Variant38232, - Variant38233, - Variant38234, - Variant38235, - Variant38236, - Variant38237, - Variant38238, - Variant38239, - Variant38240, - Variant38241, - Variant38242, - Variant38243, - Variant38244, - Variant38245, - Variant38246, - Variant38247, - Variant38248, - Variant38249, - Variant38250, - Variant38251, - Variant38252, - Variant38253, - Variant38254, - Variant38255, - Variant38256, - Variant38257, - Variant38258, - Variant38259, - Variant38260, - Variant38261, - Variant38262, - Variant38263, - Variant38264, - Variant38265, - Variant38266, - Variant38267, - Variant38268, - Variant38269, - Variant38270, - Variant38271, - Variant38272, - Variant38273, - Variant38274, - Variant38275, - Variant38276, - Variant38277, - Variant38278, - Variant38279, - Variant38280, - Variant38281, - Variant38282, - Variant38283, - Variant38284, - Variant38285, - Variant38286, - Variant38287, - Variant38288, - Variant38289, - Variant38290, - Variant38291, - Variant38292, - Variant38293, - Variant38294, - Variant38295, - Variant38296, - Variant38297, - Variant38298, - Variant38299, - Variant38300, - Variant38301, - Variant38302, - Variant38303, - Variant38304, - Variant38305, - Variant38306, - Variant38307, - Variant38308, - Variant38309, - Variant38310, - Variant38311, - Variant38312, - Variant38313, - Variant38314, - Variant38315, - Variant38316, - Variant38317, - Variant38318, - Variant38319, - Variant38320, - Variant38321, - Variant38322, - Variant38323, - Variant38324, - Variant38325, - Variant38326, - Variant38327, - Variant38328, - Variant38329, - Variant38330, - Variant38331, - Variant38332, - Variant38333, - Variant38334, - Variant38335, - Variant38336, - Variant38337, - Variant38338, - Variant38339, - Variant38340, - Variant38341, - Variant38342, - Variant38343, - Variant38344, - Variant38345, - Variant38346, - Variant38347, - Variant38348, - Variant38349, - Variant38350, - Variant38351, - Variant38352, - Variant38353, - Variant38354, - Variant38355, - Variant38356, - Variant38357, - Variant38358, - Variant38359, - Variant38360, - Variant38361, - Variant38362, - Variant38363, - Variant38364, - Variant38365, - Variant38366, - Variant38367, - Variant38368, - Variant38369, - Variant38370, - Variant38371, - Variant38372, - Variant38373, - Variant38374, - Variant38375, - Variant38376, - Variant38377, - Variant38378, - Variant38379, - Variant38380, - Variant38381, - Variant38382, - Variant38383, - Variant38384, - Variant38385, - Variant38386, - Variant38387, - Variant38388, - Variant38389, - Variant38390, - Variant38391, - Variant38392, - Variant38393, - Variant38394, - Variant38395, - Variant38396, - Variant38397, - Variant38398, - Variant38399, - Variant38400, - Variant38401, - Variant38402, - Variant38403, - Variant38404, - Variant38405, - Variant38406, - Variant38407, - Variant38408, - Variant38409, - Variant38410, - Variant38411, - Variant38412, - Variant38413, - Variant38414, - Variant38415, - Variant38416, - Variant38417, - Variant38418, - Variant38419, - Variant38420, - Variant38421, - Variant38422, - Variant38423, - Variant38424, - Variant38425, - Variant38426, - Variant38427, - Variant38428, - Variant38429, - Variant38430, - Variant38431, - Variant38432, - Variant38433, - Variant38434, - Variant38435, - Variant38436, - Variant38437, - Variant38438, - Variant38439, - Variant38440, - Variant38441, - Variant38442, - Variant38443, - Variant38444, - Variant38445, - Variant38446, - Variant38447, - Variant38448, - Variant38449, - Variant38450, - Variant38451, - Variant38452, - Variant38453, - Variant38454, - Variant38455, - Variant38456, - Variant38457, - Variant38458, - Variant38459, - Variant38460, - Variant38461, - Variant38462, - Variant38463, - Variant38464, - Variant38465, - Variant38466, - Variant38467, - Variant38468, - Variant38469, - Variant38470, - Variant38471, - Variant38472, - Variant38473, - Variant38474, - Variant38475, - Variant38476, - Variant38477, - Variant38478, - Variant38479, - Variant38480, - Variant38481, - Variant38482, - Variant38483, - Variant38484, - Variant38485, - Variant38486, - Variant38487, - Variant38488, - Variant38489, - Variant38490, - Variant38491, - Variant38492, - Variant38493, - Variant38494, - Variant38495, - Variant38496, - Variant38497, - Variant38498, - Variant38499, - Variant38500, - Variant38501, - Variant38502, - Variant38503, - Variant38504, - Variant38505, - Variant38506, - Variant38507, - Variant38508, - Variant38509, - Variant38510, - Variant38511, - Variant38512, - Variant38513, - Variant38514, - Variant38515, - Variant38516, - Variant38517, - Variant38518, - Variant38519, - Variant38520, - Variant38521, - Variant38522, - Variant38523, - Variant38524, - Variant38525, - Variant38526, - Variant38527, - Variant38528, - Variant38529, - Variant38530, - Variant38531, - Variant38532, - Variant38533, - Variant38534, - Variant38535, - Variant38536, - Variant38537, - Variant38538, - Variant38539, - Variant38540, - Variant38541, - Variant38542, - Variant38543, - Variant38544, - Variant38545, - Variant38546, - Variant38547, - Variant38548, - Variant38549, - Variant38550, - Variant38551, - Variant38552, - Variant38553, - Variant38554, - Variant38555, - Variant38556, - Variant38557, - Variant38558, - Variant38559, - Variant38560, - Variant38561, - Variant38562, - Variant38563, - Variant38564, - Variant38565, - Variant38566, - Variant38567, - Variant38568, - Variant38569, - Variant38570, - Variant38571, - Variant38572, - Variant38573, - Variant38574, - Variant38575, - Variant38576, - Variant38577, - Variant38578, - Variant38579, - Variant38580, - Variant38581, - Variant38582, - Variant38583, - Variant38584, - Variant38585, - Variant38586, - Variant38587, - Variant38588, - Variant38589, - Variant38590, - Variant38591, - Variant38592, - Variant38593, - Variant38594, - Variant38595, - Variant38596, - Variant38597, - Variant38598, - Variant38599, - Variant38600, - Variant38601, - Variant38602, - Variant38603, - Variant38604, - Variant38605, - Variant38606, - Variant38607, - Variant38608, - Variant38609, - Variant38610, - Variant38611, - Variant38612, - Variant38613, - Variant38614, - Variant38615, - Variant38616, - Variant38617, - Variant38618, - Variant38619, - Variant38620, - Variant38621, - Variant38622, - Variant38623, - Variant38624, - Variant38625, - Variant38626, - Variant38627, - Variant38628, - Variant38629, - Variant38630, - Variant38631, - Variant38632, - Variant38633, - Variant38634, - Variant38635, - Variant38636, - Variant38637, - Variant38638, - Variant38639, - Variant38640, - Variant38641, - Variant38642, - Variant38643, - Variant38644, - Variant38645, - Variant38646, - Variant38647, - Variant38648, - Variant38649, - Variant38650, - Variant38651, - Variant38652, - Variant38653, - Variant38654, - Variant38655, - Variant38656, - Variant38657, - Variant38658, - Variant38659, - Variant38660, - Variant38661, - Variant38662, - Variant38663, - Variant38664, - Variant38665, - Variant38666, - Variant38667, - Variant38668, - Variant38669, - Variant38670, - Variant38671, - Variant38672, - Variant38673, - Variant38674, - Variant38675, - Variant38676, - Variant38677, - Variant38678, - Variant38679, - Variant38680, - Variant38681, - Variant38682, - Variant38683, - Variant38684, - Variant38685, - Variant38686, - Variant38687, - Variant38688, - Variant38689, - Variant38690, - Variant38691, - Variant38692, - Variant38693, - Variant38694, - Variant38695, - Variant38696, - Variant38697, - Variant38698, - Variant38699, - Variant38700, - Variant38701, - Variant38702, - Variant38703, - Variant38704, - Variant38705, - Variant38706, - Variant38707, - Variant38708, - Variant38709, - Variant38710, - Variant38711, - Variant38712, - Variant38713, - Variant38714, - Variant38715, - Variant38716, - Variant38717, - Variant38718, - Variant38719, - Variant38720, - Variant38721, - Variant38722, - Variant38723, - Variant38724, - Variant38725, - Variant38726, - Variant38727, - Variant38728, - Variant38729, - Variant38730, - Variant38731, - Variant38732, - Variant38733, - Variant38734, - Variant38735, - Variant38736, - Variant38737, - Variant38738, - Variant38739, - Variant38740, - Variant38741, - Variant38742, - Variant38743, - Variant38744, - Variant38745, - Variant38746, - Variant38747, - Variant38748, - Variant38749, - Variant38750, - Variant38751, - Variant38752, - Variant38753, - Variant38754, - Variant38755, - Variant38756, - Variant38757, - Variant38758, - Variant38759, - Variant38760, - Variant38761, - Variant38762, - Variant38763, - Variant38764, - Variant38765, - Variant38766, - Variant38767, - Variant38768, - Variant38769, - Variant38770, - Variant38771, - Variant38772, - Variant38773, - Variant38774, - Variant38775, - Variant38776, - Variant38777, - Variant38778, - Variant38779, - Variant38780, - Variant38781, - Variant38782, - Variant38783, - Variant38784, - Variant38785, - Variant38786, - Variant38787, - Variant38788, - Variant38789, - Variant38790, - Variant38791, - Variant38792, - Variant38793, - Variant38794, - Variant38795, - Variant38796, - Variant38797, - Variant38798, - Variant38799, - Variant38800, - Variant38801, - Variant38802, - Variant38803, - Variant38804, - Variant38805, - Variant38806, - Variant38807, - Variant38808, - Variant38809, - Variant38810, - Variant38811, - Variant38812, - Variant38813, - Variant38814, - Variant38815, - Variant38816, - Variant38817, - Variant38818, - Variant38819, - Variant38820, - Variant38821, - Variant38822, - Variant38823, - Variant38824, - Variant38825, - Variant38826, - Variant38827, - Variant38828, - Variant38829, - Variant38830, - Variant38831, - Variant38832, - Variant38833, - Variant38834, - Variant38835, - Variant38836, - Variant38837, - Variant38838, - Variant38839, - Variant38840, - Variant38841, - Variant38842, - Variant38843, - Variant38844, - Variant38845, - Variant38846, - Variant38847, - Variant38848, - Variant38849, - Variant38850, - Variant38851, - Variant38852, - Variant38853, - Variant38854, - Variant38855, - Variant38856, - Variant38857, - Variant38858, - Variant38859, - Variant38860, - Variant38861, - Variant38862, - Variant38863, - Variant38864, - Variant38865, - Variant38866, - Variant38867, - Variant38868, - Variant38869, - Variant38870, - Variant38871, - Variant38872, - Variant38873, - Variant38874, - Variant38875, - Variant38876, - Variant38877, - Variant38878, - Variant38879, - Variant38880, - Variant38881, - Variant38882, - Variant38883, - Variant38884, - Variant38885, - Variant38886, - Variant38887, - Variant38888, - Variant38889, - Variant38890, - Variant38891, - Variant38892, - Variant38893, - Variant38894, - Variant38895, - Variant38896, - Variant38897, - Variant38898, - Variant38899, - Variant38900, - Variant38901, - Variant38902, - Variant38903, - Variant38904, - Variant38905, - Variant38906, - Variant38907, - Variant38908, - Variant38909, - Variant38910, - Variant38911, - Variant38912, - Variant38913, - Variant38914, - Variant38915, - Variant38916, - Variant38917, - Variant38918, - Variant38919, - Variant38920, - Variant38921, - Variant38922, - Variant38923, - Variant38924, - Variant38925, - Variant38926, - Variant38927, - Variant38928, - Variant38929, - Variant38930, - Variant38931, - Variant38932, - Variant38933, - Variant38934, - Variant38935, - Variant38936, - Variant38937, - Variant38938, - Variant38939, - Variant38940, - Variant38941, - Variant38942, - Variant38943, - Variant38944, - Variant38945, - Variant38946, - Variant38947, - Variant38948, - Variant38949, - Variant38950, - Variant38951, - Variant38952, - Variant38953, - Variant38954, - Variant38955, - Variant38956, - Variant38957, - Variant38958, - Variant38959, - Variant38960, - Variant38961, - Variant38962, - Variant38963, - Variant38964, - Variant38965, - Variant38966, - Variant38967, - Variant38968, - Variant38969, - Variant38970, - Variant38971, - Variant38972, - Variant38973, - Variant38974, - Variant38975, - Variant38976, - Variant38977, - Variant38978, - Variant38979, - Variant38980, - Variant38981, - Variant38982, - Variant38983, - Variant38984, - Variant38985, - Variant38986, - Variant38987, - Variant38988, - Variant38989, - Variant38990, - Variant38991, - Variant38992, - Variant38993, - Variant38994, - Variant38995, - Variant38996, - Variant38997, - Variant38998, - Variant38999, - Variant39000, - Variant39001, - Variant39002, - Variant39003, - Variant39004, - Variant39005, - Variant39006, - Variant39007, - Variant39008, - Variant39009, - Variant39010, - Variant39011, - Variant39012, - Variant39013, - Variant39014, - Variant39015, - Variant39016, - Variant39017, - Variant39018, - Variant39019, - Variant39020, - Variant39021, - Variant39022, - Variant39023, - Variant39024, - Variant39025, - Variant39026, - Variant39027, - Variant39028, - Variant39029, - Variant39030, - Variant39031, - Variant39032, - Variant39033, - Variant39034, - Variant39035, - Variant39036, - Variant39037, - Variant39038, - Variant39039, - Variant39040, - Variant39041, - Variant39042, - Variant39043, - Variant39044, - Variant39045, - Variant39046, - Variant39047, - Variant39048, - Variant39049, - Variant39050, - Variant39051, - Variant39052, - Variant39053, - Variant39054, - Variant39055, - Variant39056, - Variant39057, - Variant39058, - Variant39059, - Variant39060, - Variant39061, - Variant39062, - Variant39063, - Variant39064, - Variant39065, - Variant39066, - Variant39067, - Variant39068, - Variant39069, - Variant39070, - Variant39071, - Variant39072, - Variant39073, - Variant39074, - Variant39075, - Variant39076, - Variant39077, - Variant39078, - Variant39079, - Variant39080, - Variant39081, - Variant39082, - Variant39083, - Variant39084, - Variant39085, - Variant39086, - Variant39087, - Variant39088, - Variant39089, - Variant39090, - Variant39091, - Variant39092, - Variant39093, - Variant39094, - Variant39095, - Variant39096, - Variant39097, - Variant39098, - Variant39099, - Variant39100, - Variant39101, - Variant39102, - Variant39103, - Variant39104, - Variant39105, - Variant39106, - Variant39107, - Variant39108, - Variant39109, - Variant39110, - Variant39111, - Variant39112, - Variant39113, - Variant39114, - Variant39115, - Variant39116, - Variant39117, - Variant39118, - Variant39119, - Variant39120, - Variant39121, - Variant39122, - Variant39123, - Variant39124, - Variant39125, - Variant39126, - Variant39127, - Variant39128, - Variant39129, - Variant39130, - Variant39131, - Variant39132, - Variant39133, - Variant39134, - Variant39135, - Variant39136, - Variant39137, - Variant39138, - Variant39139, - Variant39140, - Variant39141, - Variant39142, - Variant39143, - Variant39144, - Variant39145, - Variant39146, - Variant39147, - Variant39148, - Variant39149, - Variant39150, - Variant39151, - Variant39152, - Variant39153, - Variant39154, - Variant39155, - Variant39156, - Variant39157, - Variant39158, - Variant39159, - Variant39160, - Variant39161, - Variant39162, - Variant39163, - Variant39164, - Variant39165, - Variant39166, - Variant39167, - Variant39168, - Variant39169, - Variant39170, - Variant39171, - Variant39172, - Variant39173, - Variant39174, - Variant39175, - Variant39176, - Variant39177, - Variant39178, - Variant39179, - Variant39180, - Variant39181, - Variant39182, - Variant39183, - Variant39184, - Variant39185, - Variant39186, - Variant39187, - Variant39188, - Variant39189, - Variant39190, - Variant39191, - Variant39192, - Variant39193, - Variant39194, - Variant39195, - Variant39196, - Variant39197, - Variant39198, - Variant39199, - Variant39200, - Variant39201, - Variant39202, - Variant39203, - Variant39204, - Variant39205, - Variant39206, - Variant39207, - Variant39208, - Variant39209, - Variant39210, - Variant39211, - Variant39212, - Variant39213, - Variant39214, - Variant39215, - Variant39216, - Variant39217, - Variant39218, - Variant39219, - Variant39220, - Variant39221, - Variant39222, - Variant39223, - Variant39224, - Variant39225, - Variant39226, - Variant39227, - Variant39228, - Variant39229, - Variant39230, - Variant39231, - Variant39232, - Variant39233, - Variant39234, - Variant39235, - Variant39236, - Variant39237, - Variant39238, - Variant39239, - Variant39240, - Variant39241, - Variant39242, - Variant39243, - Variant39244, - Variant39245, - Variant39246, - Variant39247, - Variant39248, - Variant39249, - Variant39250, - Variant39251, - Variant39252, - Variant39253, - Variant39254, - Variant39255, - Variant39256, - Variant39257, - Variant39258, - Variant39259, - Variant39260, - Variant39261, - Variant39262, - Variant39263, - Variant39264, - Variant39265, - Variant39266, - Variant39267, - Variant39268, - Variant39269, - Variant39270, - Variant39271, - Variant39272, - Variant39273, - Variant39274, - Variant39275, - Variant39276, - Variant39277, - Variant39278, - Variant39279, - Variant39280, - Variant39281, - Variant39282, - Variant39283, - Variant39284, - Variant39285, - Variant39286, - Variant39287, - Variant39288, - Variant39289, - Variant39290, - Variant39291, - Variant39292, - Variant39293, - Variant39294, - Variant39295, - Variant39296, - Variant39297, - Variant39298, - Variant39299, - Variant39300, - Variant39301, - Variant39302, - Variant39303, - Variant39304, - Variant39305, - Variant39306, - Variant39307, - Variant39308, - Variant39309, - Variant39310, - Variant39311, - Variant39312, - Variant39313, - Variant39314, - Variant39315, - Variant39316, - Variant39317, - Variant39318, - Variant39319, - Variant39320, - Variant39321, - Variant39322, - Variant39323, - Variant39324, - Variant39325, - Variant39326, - Variant39327, - Variant39328, - Variant39329, - Variant39330, - Variant39331, - Variant39332, - Variant39333, - Variant39334, - Variant39335, - Variant39336, - Variant39337, - Variant39338, - Variant39339, - Variant39340, - Variant39341, - Variant39342, - Variant39343, - Variant39344, - Variant39345, - Variant39346, - Variant39347, - Variant39348, - Variant39349, - Variant39350, - Variant39351, - Variant39352, - Variant39353, - Variant39354, - Variant39355, - Variant39356, - Variant39357, - Variant39358, - Variant39359, - Variant39360, - Variant39361, - Variant39362, - Variant39363, - Variant39364, - Variant39365, - Variant39366, - Variant39367, - Variant39368, - Variant39369, - Variant39370, - Variant39371, - Variant39372, - Variant39373, - Variant39374, - Variant39375, - Variant39376, - Variant39377, - Variant39378, - Variant39379, - Variant39380, - Variant39381, - Variant39382, - Variant39383, - Variant39384, - Variant39385, - Variant39386, - Variant39387, - Variant39388, - Variant39389, - Variant39390, - Variant39391, - Variant39392, - Variant39393, - Variant39394, - Variant39395, - Variant39396, - Variant39397, - Variant39398, - Variant39399, - Variant39400, - Variant39401, - Variant39402, - Variant39403, - Variant39404, - Variant39405, - Variant39406, - Variant39407, - Variant39408, - Variant39409, - Variant39410, - Variant39411, - Variant39412, - Variant39413, - Variant39414, - Variant39415, - Variant39416, - Variant39417, - Variant39418, - Variant39419, - Variant39420, - Variant39421, - Variant39422, - Variant39423, - Variant39424, - Variant39425, - Variant39426, - Variant39427, - Variant39428, - Variant39429, - Variant39430, - Variant39431, - Variant39432, - Variant39433, - Variant39434, - Variant39435, - Variant39436, - Variant39437, - Variant39438, - Variant39439, - Variant39440, - Variant39441, - Variant39442, - Variant39443, - Variant39444, - Variant39445, - Variant39446, - Variant39447, - Variant39448, - Variant39449, - Variant39450, - Variant39451, - Variant39452, - Variant39453, - Variant39454, - Variant39455, - Variant39456, - Variant39457, - Variant39458, - Variant39459, - Variant39460, - Variant39461, - Variant39462, - Variant39463, - Variant39464, - Variant39465, - Variant39466, - Variant39467, - Variant39468, - Variant39469, - Variant39470, - Variant39471, - Variant39472, - Variant39473, - Variant39474, - Variant39475, - Variant39476, - Variant39477, - Variant39478, - Variant39479, - Variant39480, - Variant39481, - Variant39482, - Variant39483, - Variant39484, - Variant39485, - Variant39486, - Variant39487, - Variant39488, - Variant39489, - Variant39490, - Variant39491, - Variant39492, - Variant39493, - Variant39494, - Variant39495, - Variant39496, - Variant39497, - Variant39498, - Variant39499, - Variant39500, - Variant39501, - Variant39502, - Variant39503, - Variant39504, - Variant39505, - Variant39506, - Variant39507, - Variant39508, - Variant39509, - Variant39510, - Variant39511, - Variant39512, - Variant39513, - Variant39514, - Variant39515, - Variant39516, - Variant39517, - Variant39518, - Variant39519, - Variant39520, - Variant39521, - Variant39522, - Variant39523, - Variant39524, - Variant39525, - Variant39526, - Variant39527, - Variant39528, - Variant39529, - Variant39530, - Variant39531, - Variant39532, - Variant39533, - Variant39534, - Variant39535, - Variant39536, - Variant39537, - Variant39538, - Variant39539, - Variant39540, - Variant39541, - Variant39542, - Variant39543, - Variant39544, - Variant39545, - Variant39546, - Variant39547, - Variant39548, - Variant39549, - Variant39550, - Variant39551, - Variant39552, - Variant39553, - Variant39554, - Variant39555, - Variant39556, - Variant39557, - Variant39558, - Variant39559, - Variant39560, - Variant39561, - Variant39562, - Variant39563, - Variant39564, - Variant39565, - Variant39566, - Variant39567, - Variant39568, - Variant39569, - Variant39570, - Variant39571, - Variant39572, - Variant39573, - Variant39574, - Variant39575, - Variant39576, - Variant39577, - Variant39578, - Variant39579, - Variant39580, - Variant39581, - Variant39582, - Variant39583, - Variant39584, - Variant39585, - Variant39586, - Variant39587, - Variant39588, - Variant39589, - Variant39590, - Variant39591, - Variant39592, - Variant39593, - Variant39594, - Variant39595, - Variant39596, - Variant39597, - Variant39598, - Variant39599, - Variant39600, - Variant39601, - Variant39602, - Variant39603, - Variant39604, - Variant39605, - Variant39606, - Variant39607, - Variant39608, - Variant39609, - Variant39610, - Variant39611, - Variant39612, - Variant39613, - Variant39614, - Variant39615, - Variant39616, - Variant39617, - Variant39618, - Variant39619, - Variant39620, - Variant39621, - Variant39622, - Variant39623, - Variant39624, - Variant39625, - Variant39626, - Variant39627, - Variant39628, - Variant39629, - Variant39630, - Variant39631, - Variant39632, - Variant39633, - Variant39634, - Variant39635, - Variant39636, - Variant39637, - Variant39638, - Variant39639, - Variant39640, - Variant39641, - Variant39642, - Variant39643, - Variant39644, - Variant39645, - Variant39646, - Variant39647, - Variant39648, - Variant39649, - Variant39650, - Variant39651, - Variant39652, - Variant39653, - Variant39654, - Variant39655, - Variant39656, - Variant39657, - Variant39658, - Variant39659, - Variant39660, - Variant39661, - Variant39662, - Variant39663, - Variant39664, - Variant39665, - Variant39666, - Variant39667, - Variant39668, - Variant39669, - Variant39670, - Variant39671, - Variant39672, - Variant39673, - Variant39674, - Variant39675, - Variant39676, - Variant39677, - Variant39678, - Variant39679, - Variant39680, - Variant39681, - Variant39682, - Variant39683, - Variant39684, - Variant39685, - Variant39686, - Variant39687, - Variant39688, - Variant39689, - Variant39690, - Variant39691, - Variant39692, - Variant39693, - Variant39694, - Variant39695, - Variant39696, - Variant39697, - Variant39698, - Variant39699, - Variant39700, - Variant39701, - Variant39702, - Variant39703, - Variant39704, - Variant39705, - Variant39706, - Variant39707, - Variant39708, - Variant39709, - Variant39710, - Variant39711, - Variant39712, - Variant39713, - Variant39714, - Variant39715, - Variant39716, - Variant39717, - Variant39718, - Variant39719, - Variant39720, - Variant39721, - Variant39722, - Variant39723, - Variant39724, - Variant39725, - Variant39726, - Variant39727, - Variant39728, - Variant39729, - Variant39730, - Variant39731, - Variant39732, - Variant39733, - Variant39734, - Variant39735, - Variant39736, - Variant39737, - Variant39738, - Variant39739, - Variant39740, - Variant39741, - Variant39742, - Variant39743, - Variant39744, - Variant39745, - Variant39746, - Variant39747, - Variant39748, - Variant39749, - Variant39750, - Variant39751, - Variant39752, - Variant39753, - Variant39754, - Variant39755, - Variant39756, - Variant39757, - Variant39758, - Variant39759, - Variant39760, - Variant39761, - Variant39762, - Variant39763, - Variant39764, - Variant39765, - Variant39766, - Variant39767, - Variant39768, - Variant39769, - Variant39770, - Variant39771, - Variant39772, - Variant39773, - Variant39774, - Variant39775, - Variant39776, - Variant39777, - Variant39778, - Variant39779, - Variant39780, - Variant39781, - Variant39782, - Variant39783, - Variant39784, - Variant39785, - Variant39786, - Variant39787, - Variant39788, - Variant39789, - Variant39790, - Variant39791, - Variant39792, - Variant39793, - Variant39794, - Variant39795, - Variant39796, - Variant39797, - Variant39798, - Variant39799, - Variant39800, - Variant39801, - Variant39802, - Variant39803, - Variant39804, - Variant39805, - Variant39806, - Variant39807, - Variant39808, - Variant39809, - Variant39810, - Variant39811, - Variant39812, - Variant39813, - Variant39814, - Variant39815, - Variant39816, - Variant39817, - Variant39818, - Variant39819, - Variant39820, - Variant39821, - Variant39822, - Variant39823, - Variant39824, - Variant39825, - Variant39826, - Variant39827, - Variant39828, - Variant39829, - Variant39830, - Variant39831, - Variant39832, - Variant39833, - Variant39834, - Variant39835, - Variant39836, - Variant39837, - Variant39838, - Variant39839, - Variant39840, - Variant39841, - Variant39842, - Variant39843, - Variant39844, - Variant39845, - Variant39846, - Variant39847, - Variant39848, - Variant39849, - Variant39850, - Variant39851, - Variant39852, - Variant39853, - Variant39854, - Variant39855, - Variant39856, - Variant39857, - Variant39858, - Variant39859, - Variant39860, - Variant39861, - Variant39862, - Variant39863, - Variant39864, - Variant39865, - Variant39866, - Variant39867, - Variant39868, - Variant39869, - Variant39870, - Variant39871, - Variant39872, - Variant39873, - Variant39874, - Variant39875, - Variant39876, - Variant39877, - Variant39878, - Variant39879, - Variant39880, - Variant39881, - Variant39882, - Variant39883, - Variant39884, - Variant39885, - Variant39886, - Variant39887, - Variant39888, - Variant39889, - Variant39890, - Variant39891, - Variant39892, - Variant39893, - Variant39894, - Variant39895, - Variant39896, - Variant39897, - Variant39898, - Variant39899, - Variant39900, - Variant39901, - Variant39902, - Variant39903, - Variant39904, - Variant39905, - Variant39906, - Variant39907, - Variant39908, - Variant39909, - Variant39910, - Variant39911, - Variant39912, - Variant39913, - Variant39914, - Variant39915, - Variant39916, - Variant39917, - Variant39918, - Variant39919, - Variant39920, - Variant39921, - Variant39922, - Variant39923, - Variant39924, - Variant39925, - Variant39926, - Variant39927, - Variant39928, - Variant39929, - Variant39930, - Variant39931, - Variant39932, - Variant39933, - Variant39934, - Variant39935, - Variant39936, - Variant39937, - Variant39938, - Variant39939, - Variant39940, - Variant39941, - Variant39942, - Variant39943, - Variant39944, - Variant39945, - Variant39946, - Variant39947, - Variant39948, - Variant39949, - Variant39950, - Variant39951, - Variant39952, - Variant39953, - Variant39954, - Variant39955, - Variant39956, - Variant39957, - Variant39958, - Variant39959, - Variant39960, - Variant39961, - Variant39962, - Variant39963, - Variant39964, - Variant39965, - Variant39966, - Variant39967, - Variant39968, - Variant39969, - Variant39970, - Variant39971, - Variant39972, - Variant39973, - Variant39974, - Variant39975, - Variant39976, - Variant39977, - Variant39978, - Variant39979, - Variant39980, - Variant39981, - Variant39982, - Variant39983, - Variant39984, - Variant39985, - Variant39986, - Variant39987, - Variant39988, - Variant39989, - Variant39990, - Variant39991, - Variant39992, - Variant39993, - Variant39994, - Variant39995, - Variant39996, - Variant39997, - Variant39998, - Variant39999, - Variant40000, - Variant40001, - Variant40002, - Variant40003, - Variant40004, - Variant40005, - Variant40006, - Variant40007, - Variant40008, - Variant40009, - Variant40010, - Variant40011, - Variant40012, - Variant40013, - Variant40014, - Variant40015, - Variant40016, - Variant40017, - Variant40018, - Variant40019, - Variant40020, - Variant40021, - Variant40022, - Variant40023, - Variant40024, - Variant40025, - Variant40026, - Variant40027, - Variant40028, - Variant40029, - Variant40030, - Variant40031, - Variant40032, - Variant40033, - Variant40034, - Variant40035, - Variant40036, - Variant40037, - Variant40038, - Variant40039, - Variant40040, - Variant40041, - Variant40042, - Variant40043, - Variant40044, - Variant40045, - Variant40046, - Variant40047, - Variant40048, - Variant40049, - Variant40050, - Variant40051, - Variant40052, - Variant40053, - Variant40054, - Variant40055, - Variant40056, - Variant40057, - Variant40058, - Variant40059, - Variant40060, - Variant40061, - Variant40062, - Variant40063, - Variant40064, - Variant40065, - Variant40066, - Variant40067, - Variant40068, - Variant40069, - Variant40070, - Variant40071, - Variant40072, - Variant40073, - Variant40074, - Variant40075, - Variant40076, - Variant40077, - Variant40078, - Variant40079, - Variant40080, - Variant40081, - Variant40082, - Variant40083, - Variant40084, - Variant40085, - Variant40086, - Variant40087, - Variant40088, - Variant40089, - Variant40090, - Variant40091, - Variant40092, - Variant40093, - Variant40094, - Variant40095, - Variant40096, - Variant40097, - Variant40098, - Variant40099, - Variant40100, - Variant40101, - Variant40102, - Variant40103, - Variant40104, - Variant40105, - Variant40106, - Variant40107, - Variant40108, - Variant40109, - Variant40110, - Variant40111, - Variant40112, - Variant40113, - Variant40114, - Variant40115, - Variant40116, - Variant40117, - Variant40118, - Variant40119, - Variant40120, - Variant40121, - Variant40122, - Variant40123, - Variant40124, - Variant40125, - Variant40126, - Variant40127, - Variant40128, - Variant40129, - Variant40130, - Variant40131, - Variant40132, - Variant40133, - Variant40134, - Variant40135, - Variant40136, - Variant40137, - Variant40138, - Variant40139, - Variant40140, - Variant40141, - Variant40142, - Variant40143, - Variant40144, - Variant40145, - Variant40146, - Variant40147, - Variant40148, - Variant40149, - Variant40150, - Variant40151, - Variant40152, - Variant40153, - Variant40154, - Variant40155, - Variant40156, - Variant40157, - Variant40158, - Variant40159, - Variant40160, - Variant40161, - Variant40162, - Variant40163, - Variant40164, - Variant40165, - Variant40166, - Variant40167, - Variant40168, - Variant40169, - Variant40170, - Variant40171, - Variant40172, - Variant40173, - Variant40174, - Variant40175, - Variant40176, - Variant40177, - Variant40178, - Variant40179, - Variant40180, - Variant40181, - Variant40182, - Variant40183, - Variant40184, - Variant40185, - Variant40186, - Variant40187, - Variant40188, - Variant40189, - Variant40190, - Variant40191, - Variant40192, - Variant40193, - Variant40194, - Variant40195, - Variant40196, - Variant40197, - Variant40198, - Variant40199, - Variant40200, - Variant40201, - Variant40202, - Variant40203, - Variant40204, - Variant40205, - Variant40206, - Variant40207, - Variant40208, - Variant40209, - Variant40210, - Variant40211, - Variant40212, - Variant40213, - Variant40214, - Variant40215, - Variant40216, - Variant40217, - Variant40218, - Variant40219, - Variant40220, - Variant40221, - Variant40222, - Variant40223, - Variant40224, - Variant40225, - Variant40226, - Variant40227, - Variant40228, - Variant40229, - Variant40230, - Variant40231, - Variant40232, - Variant40233, - Variant40234, - Variant40235, - Variant40236, - Variant40237, - Variant40238, - Variant40239, - Variant40240, - Variant40241, - Variant40242, - Variant40243, - Variant40244, - Variant40245, - Variant40246, - Variant40247, - Variant40248, - Variant40249, - Variant40250, - Variant40251, - Variant40252, - Variant40253, - Variant40254, - Variant40255, - Variant40256, - Variant40257, - Variant40258, - Variant40259, - Variant40260, - Variant40261, - Variant40262, - Variant40263, - Variant40264, - Variant40265, - Variant40266, - Variant40267, - Variant40268, - Variant40269, - Variant40270, - Variant40271, - Variant40272, - Variant40273, - Variant40274, - Variant40275, - Variant40276, - Variant40277, - Variant40278, - Variant40279, - Variant40280, - Variant40281, - Variant40282, - Variant40283, - Variant40284, - Variant40285, - Variant40286, - Variant40287, - Variant40288, - Variant40289, - Variant40290, - Variant40291, - Variant40292, - Variant40293, - Variant40294, - Variant40295, - Variant40296, - Variant40297, - Variant40298, - Variant40299, - Variant40300, - Variant40301, - Variant40302, - Variant40303, - Variant40304, - Variant40305, - Variant40306, - Variant40307, - Variant40308, - Variant40309, - Variant40310, - Variant40311, - Variant40312, - Variant40313, - Variant40314, - Variant40315, - Variant40316, - Variant40317, - Variant40318, - Variant40319, - Variant40320, - Variant40321, - Variant40322, - Variant40323, - Variant40324, - Variant40325, - Variant40326, - Variant40327, - Variant40328, - Variant40329, - Variant40330, - Variant40331, - Variant40332, - Variant40333, - Variant40334, - Variant40335, - Variant40336, - Variant40337, - Variant40338, - Variant40339, - Variant40340, - Variant40341, - Variant40342, - Variant40343, - Variant40344, - Variant40345, - Variant40346, - Variant40347, - Variant40348, - Variant40349, - Variant40350, - Variant40351, - Variant40352, - Variant40353, - Variant40354, - Variant40355, - Variant40356, - Variant40357, - Variant40358, - Variant40359, - Variant40360, - Variant40361, - Variant40362, - Variant40363, - Variant40364, - Variant40365, - Variant40366, - Variant40367, - Variant40368, - Variant40369, - Variant40370, - Variant40371, - Variant40372, - Variant40373, - Variant40374, - Variant40375, - Variant40376, - Variant40377, - Variant40378, - Variant40379, - Variant40380, - Variant40381, - Variant40382, - Variant40383, - Variant40384, - Variant40385, - Variant40386, - Variant40387, - Variant40388, - Variant40389, - Variant40390, - Variant40391, - Variant40392, - Variant40393, - Variant40394, - Variant40395, - Variant40396, - Variant40397, - Variant40398, - Variant40399, - Variant40400, - Variant40401, - Variant40402, - Variant40403, - Variant40404, - Variant40405, - Variant40406, - Variant40407, - Variant40408, - Variant40409, - Variant40410, - Variant40411, - Variant40412, - Variant40413, - Variant40414, - Variant40415, - Variant40416, - Variant40417, - Variant40418, - Variant40419, - Variant40420, - Variant40421, - Variant40422, - Variant40423, - Variant40424, - Variant40425, - Variant40426, - Variant40427, - Variant40428, - Variant40429, - Variant40430, - Variant40431, - Variant40432, - Variant40433, - Variant40434, - Variant40435, - Variant40436, - Variant40437, - Variant40438, - Variant40439, - Variant40440, - Variant40441, - Variant40442, - Variant40443, - Variant40444, - Variant40445, - Variant40446, - Variant40447, - Variant40448, - Variant40449, - Variant40450, - Variant40451, - Variant40452, - Variant40453, - Variant40454, - Variant40455, - Variant40456, - Variant40457, - Variant40458, - Variant40459, - Variant40460, - Variant40461, - Variant40462, - Variant40463, - Variant40464, - Variant40465, - Variant40466, - Variant40467, - Variant40468, - Variant40469, - Variant40470, - Variant40471, - Variant40472, - Variant40473, - Variant40474, - Variant40475, - Variant40476, - Variant40477, - Variant40478, - Variant40479, - Variant40480, - Variant40481, - Variant40482, - Variant40483, - Variant40484, - Variant40485, - Variant40486, - Variant40487, - Variant40488, - Variant40489, - Variant40490, - Variant40491, - Variant40492, - Variant40493, - Variant40494, - Variant40495, - Variant40496, - Variant40497, - Variant40498, - Variant40499, - Variant40500, - Variant40501, - Variant40502, - Variant40503, - Variant40504, - Variant40505, - Variant40506, - Variant40507, - Variant40508, - Variant40509, - Variant40510, - Variant40511, - Variant40512, - Variant40513, - Variant40514, - Variant40515, - Variant40516, - Variant40517, - Variant40518, - Variant40519, - Variant40520, - Variant40521, - Variant40522, - Variant40523, - Variant40524, - Variant40525, - Variant40526, - Variant40527, - Variant40528, - Variant40529, - Variant40530, - Variant40531, - Variant40532, - Variant40533, - Variant40534, - Variant40535, - Variant40536, - Variant40537, - Variant40538, - Variant40539, - Variant40540, - Variant40541, - Variant40542, - Variant40543, - Variant40544, - Variant40545, - Variant40546, - Variant40547, - Variant40548, - Variant40549, - Variant40550, - Variant40551, - Variant40552, - Variant40553, - Variant40554, - Variant40555, - Variant40556, - Variant40557, - Variant40558, - Variant40559, - Variant40560, - Variant40561, - Variant40562, - Variant40563, - Variant40564, - Variant40565, - Variant40566, - Variant40567, - Variant40568, - Variant40569, - Variant40570, - Variant40571, - Variant40572, - Variant40573, - Variant40574, - Variant40575, - Variant40576, - Variant40577, - Variant40578, - Variant40579, - Variant40580, - Variant40581, - Variant40582, - Variant40583, - Variant40584, - Variant40585, - Variant40586, - Variant40587, - Variant40588, - Variant40589, - Variant40590, - Variant40591, - Variant40592, - Variant40593, - Variant40594, - Variant40595, - Variant40596, - Variant40597, - Variant40598, - Variant40599, - Variant40600, - Variant40601, - Variant40602, - Variant40603, - Variant40604, - Variant40605, - Variant40606, - Variant40607, - Variant40608, - Variant40609, - Variant40610, - Variant40611, - Variant40612, - Variant40613, - Variant40614, - Variant40615, - Variant40616, - Variant40617, - Variant40618, - Variant40619, - Variant40620, - Variant40621, - Variant40622, - Variant40623, - Variant40624, - Variant40625, - Variant40626, - Variant40627, - Variant40628, - Variant40629, - Variant40630, - Variant40631, - Variant40632, - Variant40633, - Variant40634, - Variant40635, - Variant40636, - Variant40637, - Variant40638, - Variant40639, - Variant40640, - Variant40641, - Variant40642, - Variant40643, - Variant40644, - Variant40645, - Variant40646, - Variant40647, - Variant40648, - Variant40649, - Variant40650, - Variant40651, - Variant40652, - Variant40653, - Variant40654, - Variant40655, - Variant40656, - Variant40657, - Variant40658, - Variant40659, - Variant40660, - Variant40661, - Variant40662, - Variant40663, - Variant40664, - Variant40665, - Variant40666, - Variant40667, - Variant40668, - Variant40669, - Variant40670, - Variant40671, - Variant40672, - Variant40673, - Variant40674, - Variant40675, - Variant40676, - Variant40677, - Variant40678, - Variant40679, - Variant40680, - Variant40681, - Variant40682, - Variant40683, - Variant40684, - Variant40685, - Variant40686, - Variant40687, - Variant40688, - Variant40689, - Variant40690, - Variant40691, - Variant40692, - Variant40693, - Variant40694, - Variant40695, - Variant40696, - Variant40697, - Variant40698, - Variant40699, - Variant40700, - Variant40701, - Variant40702, - Variant40703, - Variant40704, - Variant40705, - Variant40706, - Variant40707, - Variant40708, - Variant40709, - Variant40710, - Variant40711, - Variant40712, - Variant40713, - Variant40714, - Variant40715, - Variant40716, - Variant40717, - Variant40718, - Variant40719, - Variant40720, - Variant40721, - Variant40722, - Variant40723, - Variant40724, - Variant40725, - Variant40726, - Variant40727, - Variant40728, - Variant40729, - Variant40730, - Variant40731, - Variant40732, - Variant40733, - Variant40734, - Variant40735, - Variant40736, - Variant40737, - Variant40738, - Variant40739, - Variant40740, - Variant40741, - Variant40742, - Variant40743, - Variant40744, - Variant40745, - Variant40746, - Variant40747, - Variant40748, - Variant40749, - Variant40750, - Variant40751, - Variant40752, - Variant40753, - Variant40754, - Variant40755, - Variant40756, - Variant40757, - Variant40758, - Variant40759, - Variant40760, - Variant40761, - Variant40762, - Variant40763, - Variant40764, - Variant40765, - Variant40766, - Variant40767, - Variant40768, - Variant40769, - Variant40770, - Variant40771, - Variant40772, - Variant40773, - Variant40774, - Variant40775, - Variant40776, - Variant40777, - Variant40778, - Variant40779, - Variant40780, - Variant40781, - Variant40782, - Variant40783, - Variant40784, - Variant40785, - Variant40786, - Variant40787, - Variant40788, - Variant40789, - Variant40790, - Variant40791, - Variant40792, - Variant40793, - Variant40794, - Variant40795, - Variant40796, - Variant40797, - Variant40798, - Variant40799, - Variant40800, - Variant40801, - Variant40802, - Variant40803, - Variant40804, - Variant40805, - Variant40806, - Variant40807, - Variant40808, - Variant40809, - Variant40810, - Variant40811, - Variant40812, - Variant40813, - Variant40814, - Variant40815, - Variant40816, - Variant40817, - Variant40818, - Variant40819, - Variant40820, - Variant40821, - Variant40822, - Variant40823, - Variant40824, - Variant40825, - Variant40826, - Variant40827, - Variant40828, - Variant40829, - Variant40830, - Variant40831, - Variant40832, - Variant40833, - Variant40834, - Variant40835, - Variant40836, - Variant40837, - Variant40838, - Variant40839, - Variant40840, - Variant40841, - Variant40842, - Variant40843, - Variant40844, - Variant40845, - Variant40846, - Variant40847, - Variant40848, - Variant40849, - Variant40850, - Variant40851, - Variant40852, - Variant40853, - Variant40854, - Variant40855, - Variant40856, - Variant40857, - Variant40858, - Variant40859, - Variant40860, - Variant40861, - Variant40862, - Variant40863, - Variant40864, - Variant40865, - Variant40866, - Variant40867, - Variant40868, - Variant40869, - Variant40870, - Variant40871, - Variant40872, - Variant40873, - Variant40874, - Variant40875, - Variant40876, - Variant40877, - Variant40878, - Variant40879, - Variant40880, - Variant40881, - Variant40882, - Variant40883, - Variant40884, - Variant40885, - Variant40886, - Variant40887, - Variant40888, - Variant40889, - Variant40890, - Variant40891, - Variant40892, - Variant40893, - Variant40894, - Variant40895, - Variant40896, - Variant40897, - Variant40898, - Variant40899, - Variant40900, - Variant40901, - Variant40902, - Variant40903, - Variant40904, - Variant40905, - Variant40906, - Variant40907, - Variant40908, - Variant40909, - Variant40910, - Variant40911, - Variant40912, - Variant40913, - Variant40914, - Variant40915, - Variant40916, - Variant40917, - Variant40918, - Variant40919, - Variant40920, - Variant40921, - Variant40922, - Variant40923, - Variant40924, - Variant40925, - Variant40926, - Variant40927, - Variant40928, - Variant40929, - Variant40930, - Variant40931, - Variant40932, - Variant40933, - Variant40934, - Variant40935, - Variant40936, - Variant40937, - Variant40938, - Variant40939, - Variant40940, - Variant40941, - Variant40942, - Variant40943, - Variant40944, - Variant40945, - Variant40946, - Variant40947, - Variant40948, - Variant40949, - Variant40950, - Variant40951, - Variant40952, - Variant40953, - Variant40954, - Variant40955, - Variant40956, - Variant40957, - Variant40958, - Variant40959, - Variant40960, - Variant40961, - Variant40962, - Variant40963, - Variant40964, - Variant40965, - Variant40966, - Variant40967, - Variant40968, - Variant40969, - Variant40970, - Variant40971, - Variant40972, - Variant40973, - Variant40974, - Variant40975, - Variant40976, - Variant40977, - Variant40978, - Variant40979, - Variant40980, - Variant40981, - Variant40982, - Variant40983, - Variant40984, - Variant40985, - Variant40986, - Variant40987, - Variant40988, - Variant40989, - Variant40990, - Variant40991, - Variant40992, - Variant40993, - Variant40994, - Variant40995, - Variant40996, - Variant40997, - Variant40998, - Variant40999, - Variant41000, - Variant41001, - Variant41002, - Variant41003, - Variant41004, - Variant41005, - Variant41006, - Variant41007, - Variant41008, - Variant41009, - Variant41010, - Variant41011, - Variant41012, - Variant41013, - Variant41014, - Variant41015, - Variant41016, - Variant41017, - Variant41018, - Variant41019, - Variant41020, - Variant41021, - Variant41022, - Variant41023, - Variant41024, - Variant41025, - Variant41026, - Variant41027, - Variant41028, - Variant41029, - Variant41030, - Variant41031, - Variant41032, - Variant41033, - Variant41034, - Variant41035, - Variant41036, - Variant41037, - Variant41038, - Variant41039, - Variant41040, - Variant41041, - Variant41042, - Variant41043, - Variant41044, - Variant41045, - Variant41046, - Variant41047, - Variant41048, - Variant41049, - Variant41050, - Variant41051, - Variant41052, - Variant41053, - Variant41054, - Variant41055, - Variant41056, - Variant41057, - Variant41058, - Variant41059, - Variant41060, - Variant41061, - Variant41062, - Variant41063, - Variant41064, - Variant41065, - Variant41066, - Variant41067, - Variant41068, - Variant41069, - Variant41070, - Variant41071, - Variant41072, - Variant41073, - Variant41074, - Variant41075, - Variant41076, - Variant41077, - Variant41078, - Variant41079, - Variant41080, - Variant41081, - Variant41082, - Variant41083, - Variant41084, - Variant41085, - Variant41086, - Variant41087, - Variant41088, - Variant41089, - Variant41090, - Variant41091, - Variant41092, - Variant41093, - Variant41094, - Variant41095, - Variant41096, - Variant41097, - Variant41098, - Variant41099, - Variant41100, - Variant41101, - Variant41102, - Variant41103, - Variant41104, - Variant41105, - Variant41106, - Variant41107, - Variant41108, - Variant41109, - Variant41110, - Variant41111, - Variant41112, - Variant41113, - Variant41114, - Variant41115, - Variant41116, - Variant41117, - Variant41118, - Variant41119, - Variant41120, - Variant41121, - Variant41122, - Variant41123, - Variant41124, - Variant41125, - Variant41126, - Variant41127, - Variant41128, - Variant41129, - Variant41130, - Variant41131, - Variant41132, - Variant41133, - Variant41134, - Variant41135, - Variant41136, - Variant41137, - Variant41138, - Variant41139, - Variant41140, - Variant41141, - Variant41142, - Variant41143, - Variant41144, - Variant41145, - Variant41146, - Variant41147, - Variant41148, - Variant41149, - Variant41150, - Variant41151, - Variant41152, - Variant41153, - Variant41154, - Variant41155, - Variant41156, - Variant41157, - Variant41158, - Variant41159, - Variant41160, - Variant41161, - Variant41162, - Variant41163, - Variant41164, - Variant41165, - Variant41166, - Variant41167, - Variant41168, - Variant41169, - Variant41170, - Variant41171, - Variant41172, - Variant41173, - Variant41174, - Variant41175, - Variant41176, - Variant41177, - Variant41178, - Variant41179, - Variant41180, - Variant41181, - Variant41182, - Variant41183, - Variant41184, - Variant41185, - Variant41186, - Variant41187, - Variant41188, - Variant41189, - Variant41190, - Variant41191, - Variant41192, - Variant41193, - Variant41194, - Variant41195, - Variant41196, - Variant41197, - Variant41198, - Variant41199, - Variant41200, - Variant41201, - Variant41202, - Variant41203, - Variant41204, - Variant41205, - Variant41206, - Variant41207, - Variant41208, - Variant41209, - Variant41210, - Variant41211, - Variant41212, - Variant41213, - Variant41214, - Variant41215, - Variant41216, - Variant41217, - Variant41218, - Variant41219, - Variant41220, - Variant41221, - Variant41222, - Variant41223, - Variant41224, - Variant41225, - Variant41226, - Variant41227, - Variant41228, - Variant41229, - Variant41230, - Variant41231, - Variant41232, - Variant41233, - Variant41234, - Variant41235, - Variant41236, - Variant41237, - Variant41238, - Variant41239, - Variant41240, - Variant41241, - Variant41242, - Variant41243, - Variant41244, - Variant41245, - Variant41246, - Variant41247, - Variant41248, - Variant41249, - Variant41250, - Variant41251, - Variant41252, - Variant41253, - Variant41254, - Variant41255, - Variant41256, - Variant41257, - Variant41258, - Variant41259, - Variant41260, - Variant41261, - Variant41262, - Variant41263, - Variant41264, - Variant41265, - Variant41266, - Variant41267, - Variant41268, - Variant41269, - Variant41270, - Variant41271, - Variant41272, - Variant41273, - Variant41274, - Variant41275, - Variant41276, - Variant41277, - Variant41278, - Variant41279, - Variant41280, - Variant41281, - Variant41282, - Variant41283, - Variant41284, - Variant41285, - Variant41286, - Variant41287, - Variant41288, - Variant41289, - Variant41290, - Variant41291, - Variant41292, - Variant41293, - Variant41294, - Variant41295, - Variant41296, - Variant41297, - Variant41298, - Variant41299, - Variant41300, - Variant41301, - Variant41302, - Variant41303, - Variant41304, - Variant41305, - Variant41306, - Variant41307, - Variant41308, - Variant41309, - Variant41310, - Variant41311, - Variant41312, - Variant41313, - Variant41314, - Variant41315, - Variant41316, - Variant41317, - Variant41318, - Variant41319, - Variant41320, - Variant41321, - Variant41322, - Variant41323, - Variant41324, - Variant41325, - Variant41326, - Variant41327, - Variant41328, - Variant41329, - Variant41330, - Variant41331, - Variant41332, - Variant41333, - Variant41334, - Variant41335, - Variant41336, - Variant41337, - Variant41338, - Variant41339, - Variant41340, - Variant41341, - Variant41342, - Variant41343, - Variant41344, - Variant41345, - Variant41346, - Variant41347, - Variant41348, - Variant41349, - Variant41350, - Variant41351, - Variant41352, - Variant41353, - Variant41354, - Variant41355, - Variant41356, - Variant41357, - Variant41358, - Variant41359, - Variant41360, - Variant41361, - Variant41362, - Variant41363, - Variant41364, - Variant41365, - Variant41366, - Variant41367, - Variant41368, - Variant41369, - Variant41370, - Variant41371, - Variant41372, - Variant41373, - Variant41374, - Variant41375, - Variant41376, - Variant41377, - Variant41378, - Variant41379, - Variant41380, - Variant41381, - Variant41382, - Variant41383, - Variant41384, - Variant41385, - Variant41386, - Variant41387, - Variant41388, - Variant41389, - Variant41390, - Variant41391, - Variant41392, - Variant41393, - Variant41394, - Variant41395, - Variant41396, - Variant41397, - Variant41398, - Variant41399, - Variant41400, - Variant41401, - Variant41402, - Variant41403, - Variant41404, - Variant41405, - Variant41406, - Variant41407, - Variant41408, - Variant41409, - Variant41410, - Variant41411, - Variant41412, - Variant41413, - Variant41414, - Variant41415, - Variant41416, - Variant41417, - Variant41418, - Variant41419, - Variant41420, - Variant41421, - Variant41422, - Variant41423, - Variant41424, - Variant41425, - Variant41426, - Variant41427, - Variant41428, - Variant41429, - Variant41430, - Variant41431, - Variant41432, - Variant41433, - Variant41434, - Variant41435, - Variant41436, - Variant41437, - Variant41438, - Variant41439, - Variant41440, - Variant41441, - Variant41442, - Variant41443, - Variant41444, - Variant41445, - Variant41446, - Variant41447, - Variant41448, - Variant41449, - Variant41450, - Variant41451, - Variant41452, - Variant41453, - Variant41454, - Variant41455, - Variant41456, - Variant41457, - Variant41458, - Variant41459, - Variant41460, - Variant41461, - Variant41462, - Variant41463, - Variant41464, - Variant41465, - Variant41466, - Variant41467, - Variant41468, - Variant41469, - Variant41470, - Variant41471, - Variant41472, - Variant41473, - Variant41474, - Variant41475, - Variant41476, - Variant41477, - Variant41478, - Variant41479, - Variant41480, - Variant41481, - Variant41482, - Variant41483, - Variant41484, - Variant41485, - Variant41486, - Variant41487, - Variant41488, - Variant41489, - Variant41490, - Variant41491, - Variant41492, - Variant41493, - Variant41494, - Variant41495, - Variant41496, - Variant41497, - Variant41498, - Variant41499, - Variant41500, - Variant41501, - Variant41502, - Variant41503, - Variant41504, - Variant41505, - Variant41506, - Variant41507, - Variant41508, - Variant41509, - Variant41510, - Variant41511, - Variant41512, - Variant41513, - Variant41514, - Variant41515, - Variant41516, - Variant41517, - Variant41518, - Variant41519, - Variant41520, - Variant41521, - Variant41522, - Variant41523, - Variant41524, - Variant41525, - Variant41526, - Variant41527, - Variant41528, - Variant41529, - Variant41530, - Variant41531, - Variant41532, - Variant41533, - Variant41534, - Variant41535, - Variant41536, - Variant41537, - Variant41538, - Variant41539, - Variant41540, - Variant41541, - Variant41542, - Variant41543, - Variant41544, - Variant41545, - Variant41546, - Variant41547, - Variant41548, - Variant41549, - Variant41550, - Variant41551, - Variant41552, - Variant41553, - Variant41554, - Variant41555, - Variant41556, - Variant41557, - Variant41558, - Variant41559, - Variant41560, - Variant41561, - Variant41562, - Variant41563, - Variant41564, - Variant41565, - Variant41566, - Variant41567, - Variant41568, - Variant41569, - Variant41570, - Variant41571, - Variant41572, - Variant41573, - Variant41574, - Variant41575, - Variant41576, - Variant41577, - Variant41578, - Variant41579, - Variant41580, - Variant41581, - Variant41582, - Variant41583, - Variant41584, - Variant41585, - Variant41586, - Variant41587, - Variant41588, - Variant41589, - Variant41590, - Variant41591, - Variant41592, - Variant41593, - Variant41594, - Variant41595, - Variant41596, - Variant41597, - Variant41598, - Variant41599, - Variant41600, - Variant41601, - Variant41602, - Variant41603, - Variant41604, - Variant41605, - Variant41606, - Variant41607, - Variant41608, - Variant41609, - Variant41610, - Variant41611, - Variant41612, - Variant41613, - Variant41614, - Variant41615, - Variant41616, - Variant41617, - Variant41618, - Variant41619, - Variant41620, - Variant41621, - Variant41622, - Variant41623, - Variant41624, - Variant41625, - Variant41626, - Variant41627, - Variant41628, - Variant41629, - Variant41630, - Variant41631, - Variant41632, - Variant41633, - Variant41634, - Variant41635, - Variant41636, - Variant41637, - Variant41638, - Variant41639, - Variant41640, - Variant41641, - Variant41642, - Variant41643, - Variant41644, - Variant41645, - Variant41646, - Variant41647, - Variant41648, - Variant41649, - Variant41650, - Variant41651, - Variant41652, - Variant41653, - Variant41654, - Variant41655, - Variant41656, - Variant41657, - Variant41658, - Variant41659, - Variant41660, - Variant41661, - Variant41662, - Variant41663, - Variant41664, - Variant41665, - Variant41666, - Variant41667, - Variant41668, - Variant41669, - Variant41670, - Variant41671, - Variant41672, - Variant41673, - Variant41674, - Variant41675, - Variant41676, - Variant41677, - Variant41678, - Variant41679, - Variant41680, - Variant41681, - Variant41682, - Variant41683, - Variant41684, - Variant41685, - Variant41686, - Variant41687, - Variant41688, - Variant41689, - Variant41690, - Variant41691, - Variant41692, - Variant41693, - Variant41694, - Variant41695, - Variant41696, - Variant41697, - Variant41698, - Variant41699, - Variant41700, - Variant41701, - Variant41702, - Variant41703, - Variant41704, - Variant41705, - Variant41706, - Variant41707, - Variant41708, - Variant41709, - Variant41710, - Variant41711, - Variant41712, - Variant41713, - Variant41714, - Variant41715, - Variant41716, - Variant41717, - Variant41718, - Variant41719, - Variant41720, - Variant41721, - Variant41722, - Variant41723, - Variant41724, - Variant41725, - Variant41726, - Variant41727, - Variant41728, - Variant41729, - Variant41730, - Variant41731, - Variant41732, - Variant41733, - Variant41734, - Variant41735, - Variant41736, - Variant41737, - Variant41738, - Variant41739, - Variant41740, - Variant41741, - Variant41742, - Variant41743, - Variant41744, - Variant41745, - Variant41746, - Variant41747, - Variant41748, - Variant41749, - Variant41750, - Variant41751, - Variant41752, - Variant41753, - Variant41754, - Variant41755, - Variant41756, - Variant41757, - Variant41758, - Variant41759, - Variant41760, - Variant41761, - Variant41762, - Variant41763, - Variant41764, - Variant41765, - Variant41766, - Variant41767, - Variant41768, - Variant41769, - Variant41770, - Variant41771, - Variant41772, - Variant41773, - Variant41774, - Variant41775, - Variant41776, - Variant41777, - Variant41778, - Variant41779, - Variant41780, - Variant41781, - Variant41782, - Variant41783, - Variant41784, - Variant41785, - Variant41786, - Variant41787, - Variant41788, - Variant41789, - Variant41790, - Variant41791, - Variant41792, - Variant41793, - Variant41794, - Variant41795, - Variant41796, - Variant41797, - Variant41798, - Variant41799, - Variant41800, - Variant41801, - Variant41802, - Variant41803, - Variant41804, - Variant41805, - Variant41806, - Variant41807, - Variant41808, - Variant41809, - Variant41810, - Variant41811, - Variant41812, - Variant41813, - Variant41814, - Variant41815, - Variant41816, - Variant41817, - Variant41818, - Variant41819, - Variant41820, - Variant41821, - Variant41822, - Variant41823, - Variant41824, - Variant41825, - Variant41826, - Variant41827, - Variant41828, - Variant41829, - Variant41830, - Variant41831, - Variant41832, - Variant41833, - Variant41834, - Variant41835, - Variant41836, - Variant41837, - Variant41838, - Variant41839, - Variant41840, - Variant41841, - Variant41842, - Variant41843, - Variant41844, - Variant41845, - Variant41846, - Variant41847, - Variant41848, - Variant41849, - Variant41850, - Variant41851, - Variant41852, - Variant41853, - Variant41854, - Variant41855, - Variant41856, - Variant41857, - Variant41858, - Variant41859, - Variant41860, - Variant41861, - Variant41862, - Variant41863, - Variant41864, - Variant41865, - Variant41866, - Variant41867, - Variant41868, - Variant41869, - Variant41870, - Variant41871, - Variant41872, - Variant41873, - Variant41874, - Variant41875, - Variant41876, - Variant41877, - Variant41878, - Variant41879, - Variant41880, - Variant41881, - Variant41882, - Variant41883, - Variant41884, - Variant41885, - Variant41886, - Variant41887, - Variant41888, - Variant41889, - Variant41890, - Variant41891, - Variant41892, - Variant41893, - Variant41894, - Variant41895, - Variant41896, - Variant41897, - Variant41898, - Variant41899, - Variant41900, - Variant41901, - Variant41902, - Variant41903, - Variant41904, - Variant41905, - Variant41906, - Variant41907, - Variant41908, - Variant41909, - Variant41910, - Variant41911, - Variant41912, - Variant41913, - Variant41914, - Variant41915, - Variant41916, - Variant41917, - Variant41918, - Variant41919, - Variant41920, - Variant41921, - Variant41922, - Variant41923, - Variant41924, - Variant41925, - Variant41926, - Variant41927, - Variant41928, - Variant41929, - Variant41930, - Variant41931, - Variant41932, - Variant41933, - Variant41934, - Variant41935, - Variant41936, - Variant41937, - Variant41938, - Variant41939, - Variant41940, - Variant41941, - Variant41942, - Variant41943, - Variant41944, - Variant41945, - Variant41946, - Variant41947, - Variant41948, - Variant41949, - Variant41950, - Variant41951, - Variant41952, - Variant41953, - Variant41954, - Variant41955, - Variant41956, - Variant41957, - Variant41958, - Variant41959, - Variant41960, - Variant41961, - Variant41962, - Variant41963, - Variant41964, - Variant41965, - Variant41966, - Variant41967, - Variant41968, - Variant41969, - Variant41970, - Variant41971, - Variant41972, - Variant41973, - Variant41974, - Variant41975, - Variant41976, - Variant41977, - Variant41978, - Variant41979, - Variant41980, - Variant41981, - Variant41982, - Variant41983, - Variant41984, - Variant41985, - Variant41986, - Variant41987, - Variant41988, - Variant41989, - Variant41990, - Variant41991, - Variant41992, - Variant41993, - Variant41994, - Variant41995, - Variant41996, - Variant41997, - Variant41998, - Variant41999, - Variant42000, - Variant42001, - Variant42002, - Variant42003, - Variant42004, - Variant42005, - Variant42006, - Variant42007, - Variant42008, - Variant42009, - Variant42010, - Variant42011, - Variant42012, - Variant42013, - Variant42014, - Variant42015, - Variant42016, - Variant42017, - Variant42018, - Variant42019, - Variant42020, - Variant42021, - Variant42022, - Variant42023, - Variant42024, - Variant42025, - Variant42026, - Variant42027, - Variant42028, - Variant42029, - Variant42030, - Variant42031, - Variant42032, - Variant42033, - Variant42034, - Variant42035, - Variant42036, - Variant42037, - Variant42038, - Variant42039, - Variant42040, - Variant42041, - Variant42042, - Variant42043, - Variant42044, - Variant42045, - Variant42046, - Variant42047, - Variant42048, - Variant42049, - Variant42050, - Variant42051, - Variant42052, - Variant42053, - Variant42054, - Variant42055, - Variant42056, - Variant42057, - Variant42058, - Variant42059, - Variant42060, - Variant42061, - Variant42062, - Variant42063, - Variant42064, - Variant42065, - Variant42066, - Variant42067, - Variant42068, - Variant42069, - Variant42070, - Variant42071, - Variant42072, - Variant42073, - Variant42074, - Variant42075, - Variant42076, - Variant42077, - Variant42078, - Variant42079, - Variant42080, - Variant42081, - Variant42082, - Variant42083, - Variant42084, - Variant42085, - Variant42086, - Variant42087, - Variant42088, - Variant42089, - Variant42090, - Variant42091, - Variant42092, - Variant42093, - Variant42094, - Variant42095, - Variant42096, - Variant42097, - Variant42098, - Variant42099, - Variant42100, - Variant42101, - Variant42102, - Variant42103, - Variant42104, - Variant42105, - Variant42106, - Variant42107, - Variant42108, - Variant42109, - Variant42110, - Variant42111, - Variant42112, - Variant42113, - Variant42114, - Variant42115, - Variant42116, - Variant42117, - Variant42118, - Variant42119, - Variant42120, - Variant42121, - Variant42122, - Variant42123, - Variant42124, - Variant42125, - Variant42126, - Variant42127, - Variant42128, - Variant42129, - Variant42130, - Variant42131, - Variant42132, - Variant42133, - Variant42134, - Variant42135, - Variant42136, - Variant42137, - Variant42138, - Variant42139, - Variant42140, - Variant42141, - Variant42142, - Variant42143, - Variant42144, - Variant42145, - Variant42146, - Variant42147, - Variant42148, - Variant42149, - Variant42150, - Variant42151, - Variant42152, - Variant42153, - Variant42154, - Variant42155, - Variant42156, - Variant42157, - Variant42158, - Variant42159, - Variant42160, - Variant42161, - Variant42162, - Variant42163, - Variant42164, - Variant42165, - Variant42166, - Variant42167, - Variant42168, - Variant42169, - Variant42170, - Variant42171, - Variant42172, - Variant42173, - Variant42174, - Variant42175, - Variant42176, - Variant42177, - Variant42178, - Variant42179, - Variant42180, - Variant42181, - Variant42182, - Variant42183, - Variant42184, - Variant42185, - Variant42186, - Variant42187, - Variant42188, - Variant42189, - Variant42190, - Variant42191, - Variant42192, - Variant42193, - Variant42194, - Variant42195, - Variant42196, - Variant42197, - Variant42198, - Variant42199, - Variant42200, - Variant42201, - Variant42202, - Variant42203, - Variant42204, - Variant42205, - Variant42206, - Variant42207, - Variant42208, - Variant42209, - Variant42210, - Variant42211, - Variant42212, - Variant42213, - Variant42214, - Variant42215, - Variant42216, - Variant42217, - Variant42218, - Variant42219, - Variant42220, - Variant42221, - Variant42222, - Variant42223, - Variant42224, - Variant42225, - Variant42226, - Variant42227, - Variant42228, - Variant42229, - Variant42230, - Variant42231, - Variant42232, - Variant42233, - Variant42234, - Variant42235, - Variant42236, - Variant42237, - Variant42238, - Variant42239, - Variant42240, - Variant42241, - Variant42242, - Variant42243, - Variant42244, - Variant42245, - Variant42246, - Variant42247, - Variant42248, - Variant42249, - Variant42250, - Variant42251, - Variant42252, - Variant42253, - Variant42254, - Variant42255, - Variant42256, - Variant42257, - Variant42258, - Variant42259, - Variant42260, - Variant42261, - Variant42262, - Variant42263, - Variant42264, - Variant42265, - Variant42266, - Variant42267, - Variant42268, - Variant42269, - Variant42270, - Variant42271, - Variant42272, - Variant42273, - Variant42274, - Variant42275, - Variant42276, - Variant42277, - Variant42278, - Variant42279, - Variant42280, - Variant42281, - Variant42282, - Variant42283, - Variant42284, - Variant42285, - Variant42286, - Variant42287, - Variant42288, - Variant42289, - Variant42290, - Variant42291, - Variant42292, - Variant42293, - Variant42294, - Variant42295, - Variant42296, - Variant42297, - Variant42298, - Variant42299, - Variant42300, - Variant42301, - Variant42302, - Variant42303, - Variant42304, - Variant42305, - Variant42306, - Variant42307, - Variant42308, - Variant42309, - Variant42310, - Variant42311, - Variant42312, - Variant42313, - Variant42314, - Variant42315, - Variant42316, - Variant42317, - Variant42318, - Variant42319, - Variant42320, - Variant42321, - Variant42322, - Variant42323, - Variant42324, - Variant42325, - Variant42326, - Variant42327, - Variant42328, - Variant42329, - Variant42330, - Variant42331, - Variant42332, - Variant42333, - Variant42334, - Variant42335, - Variant42336, - Variant42337, - Variant42338, - Variant42339, - Variant42340, - Variant42341, - Variant42342, - Variant42343, - Variant42344, - Variant42345, - Variant42346, - Variant42347, - Variant42348, - Variant42349, - Variant42350, - Variant42351, - Variant42352, - Variant42353, - Variant42354, - Variant42355, - Variant42356, - Variant42357, - Variant42358, - Variant42359, - Variant42360, - Variant42361, - Variant42362, - Variant42363, - Variant42364, - Variant42365, - Variant42366, - Variant42367, - Variant42368, - Variant42369, - Variant42370, - Variant42371, - Variant42372, - Variant42373, - Variant42374, - Variant42375, - Variant42376, - Variant42377, - Variant42378, - Variant42379, - Variant42380, - Variant42381, - Variant42382, - Variant42383, - Variant42384, - Variant42385, - Variant42386, - Variant42387, - Variant42388, - Variant42389, - Variant42390, - Variant42391, - Variant42392, - Variant42393, - Variant42394, - Variant42395, - Variant42396, - Variant42397, - Variant42398, - Variant42399, - Variant42400, - Variant42401, - Variant42402, - Variant42403, - Variant42404, - Variant42405, - Variant42406, - Variant42407, - Variant42408, - Variant42409, - Variant42410, - Variant42411, - Variant42412, - Variant42413, - Variant42414, - Variant42415, - Variant42416, - Variant42417, - Variant42418, - Variant42419, - Variant42420, - Variant42421, - Variant42422, - Variant42423, - Variant42424, - Variant42425, - Variant42426, - Variant42427, - Variant42428, - Variant42429, - Variant42430, - Variant42431, - Variant42432, - Variant42433, - Variant42434, - Variant42435, - Variant42436, - Variant42437, - Variant42438, - Variant42439, - Variant42440, - Variant42441, - Variant42442, - Variant42443, - Variant42444, - Variant42445, - Variant42446, - Variant42447, - Variant42448, - Variant42449, - Variant42450, - Variant42451, - Variant42452, - Variant42453, - Variant42454, - Variant42455, - Variant42456, - Variant42457, - Variant42458, - Variant42459, - Variant42460, - Variant42461, - Variant42462, - Variant42463, - Variant42464, - Variant42465, - Variant42466, - Variant42467, - Variant42468, - Variant42469, - Variant42470, - Variant42471, - Variant42472, - Variant42473, - Variant42474, - Variant42475, - Variant42476, - Variant42477, - Variant42478, - Variant42479, - Variant42480, - Variant42481, - Variant42482, - Variant42483, - Variant42484, - Variant42485, - Variant42486, - Variant42487, - Variant42488, - Variant42489, - Variant42490, - Variant42491, - Variant42492, - Variant42493, - Variant42494, - Variant42495, - Variant42496, - Variant42497, - Variant42498, - Variant42499, - Variant42500, - Variant42501, - Variant42502, - Variant42503, - Variant42504, - Variant42505, - Variant42506, - Variant42507, - Variant42508, - Variant42509, - Variant42510, - Variant42511, - Variant42512, - Variant42513, - Variant42514, - Variant42515, - Variant42516, - Variant42517, - Variant42518, - Variant42519, - Variant42520, - Variant42521, - Variant42522, - Variant42523, - Variant42524, - Variant42525, - Variant42526, - Variant42527, - Variant42528, - Variant42529, - Variant42530, - Variant42531, - Variant42532, - Variant42533, - Variant42534, - Variant42535, - Variant42536, - Variant42537, - Variant42538, - Variant42539, - Variant42540, - Variant42541, - Variant42542, - Variant42543, - Variant42544, - Variant42545, - Variant42546, - Variant42547, - Variant42548, - Variant42549, - Variant42550, - Variant42551, - Variant42552, - Variant42553, - Variant42554, - Variant42555, - Variant42556, - Variant42557, - Variant42558, - Variant42559, - Variant42560, - Variant42561, - Variant42562, - Variant42563, - Variant42564, - Variant42565, - Variant42566, - Variant42567, - Variant42568, - Variant42569, - Variant42570, - Variant42571, - Variant42572, - Variant42573, - Variant42574, - Variant42575, - Variant42576, - Variant42577, - Variant42578, - Variant42579, - Variant42580, - Variant42581, - Variant42582, - Variant42583, - Variant42584, - Variant42585, - Variant42586, - Variant42587, - Variant42588, - Variant42589, - Variant42590, - Variant42591, - Variant42592, - Variant42593, - Variant42594, - Variant42595, - Variant42596, - Variant42597, - Variant42598, - Variant42599, - Variant42600, - Variant42601, - Variant42602, - Variant42603, - Variant42604, - Variant42605, - Variant42606, - Variant42607, - Variant42608, - Variant42609, - Variant42610, - Variant42611, - Variant42612, - Variant42613, - Variant42614, - Variant42615, - Variant42616, - Variant42617, - Variant42618, - Variant42619, - Variant42620, - Variant42621, - Variant42622, - Variant42623, - Variant42624, - Variant42625, - Variant42626, - Variant42627, - Variant42628, - Variant42629, - Variant42630, - Variant42631, - Variant42632, - Variant42633, - Variant42634, - Variant42635, - Variant42636, - Variant42637, - Variant42638, - Variant42639, - Variant42640, - Variant42641, - Variant42642, - Variant42643, - Variant42644, - Variant42645, - Variant42646, - Variant42647, - Variant42648, - Variant42649, - Variant42650, - Variant42651, - Variant42652, - Variant42653, - Variant42654, - Variant42655, - Variant42656, - Variant42657, - Variant42658, - Variant42659, - Variant42660, - Variant42661, - Variant42662, - Variant42663, - Variant42664, - Variant42665, - Variant42666, - Variant42667, - Variant42668, - Variant42669, - Variant42670, - Variant42671, - Variant42672, - Variant42673, - Variant42674, - Variant42675, - Variant42676, - Variant42677, - Variant42678, - Variant42679, - Variant42680, - Variant42681, - Variant42682, - Variant42683, - Variant42684, - Variant42685, - Variant42686, - Variant42687, - Variant42688, - Variant42689, - Variant42690, - Variant42691, - Variant42692, - Variant42693, - Variant42694, - Variant42695, - Variant42696, - Variant42697, - Variant42698, - Variant42699, - Variant42700, - Variant42701, - Variant42702, - Variant42703, - Variant42704, - Variant42705, - Variant42706, - Variant42707, - Variant42708, - Variant42709, - Variant42710, - Variant42711, - Variant42712, - Variant42713, - Variant42714, - Variant42715, - Variant42716, - Variant42717, - Variant42718, - Variant42719, - Variant42720, - Variant42721, - Variant42722, - Variant42723, - Variant42724, - Variant42725, - Variant42726, - Variant42727, - Variant42728, - Variant42729, - Variant42730, - Variant42731, - Variant42732, - Variant42733, - Variant42734, - Variant42735, - Variant42736, - Variant42737, - Variant42738, - Variant42739, - Variant42740, - Variant42741, - Variant42742, - Variant42743, - Variant42744, - Variant42745, - Variant42746, - Variant42747, - Variant42748, - Variant42749, - Variant42750, - Variant42751, - Variant42752, - Variant42753, - Variant42754, - Variant42755, - Variant42756, - Variant42757, - Variant42758, - Variant42759, - Variant42760, - Variant42761, - Variant42762, - Variant42763, - Variant42764, - Variant42765, - Variant42766, - Variant42767, - Variant42768, - Variant42769, - Variant42770, - Variant42771, - Variant42772, - Variant42773, - Variant42774, - Variant42775, - Variant42776, - Variant42777, - Variant42778, - Variant42779, - Variant42780, - Variant42781, - Variant42782, - Variant42783, - Variant42784, - Variant42785, - Variant42786, - Variant42787, - Variant42788, - Variant42789, - Variant42790, - Variant42791, - Variant42792, - Variant42793, - Variant42794, - Variant42795, - Variant42796, - Variant42797, - Variant42798, - Variant42799, - Variant42800, - Variant42801, - Variant42802, - Variant42803, - Variant42804, - Variant42805, - Variant42806, - Variant42807, - Variant42808, - Variant42809, - Variant42810, - Variant42811, - Variant42812, - Variant42813, - Variant42814, - Variant42815, - Variant42816, - Variant42817, - Variant42818, - Variant42819, - Variant42820, - Variant42821, - Variant42822, - Variant42823, - Variant42824, - Variant42825, - Variant42826, - Variant42827, - Variant42828, - Variant42829, - Variant42830, - Variant42831, - Variant42832, - Variant42833, - Variant42834, - Variant42835, - Variant42836, - Variant42837, - Variant42838, - Variant42839, - Variant42840, - Variant42841, - Variant42842, - Variant42843, - Variant42844, - Variant42845, - Variant42846, - Variant42847, - Variant42848, - Variant42849, - Variant42850, - Variant42851, - Variant42852, - Variant42853, - Variant42854, - Variant42855, - Variant42856, - Variant42857, - Variant42858, - Variant42859, - Variant42860, - Variant42861, - Variant42862, - Variant42863, - Variant42864, - Variant42865, - Variant42866, - Variant42867, - Variant42868, - Variant42869, - Variant42870, - Variant42871, - Variant42872, - Variant42873, - Variant42874, - Variant42875, - Variant42876, - Variant42877, - Variant42878, - Variant42879, - Variant42880, - Variant42881, - Variant42882, - Variant42883, - Variant42884, - Variant42885, - Variant42886, - Variant42887, - Variant42888, - Variant42889, - Variant42890, - Variant42891, - Variant42892, - Variant42893, - Variant42894, - Variant42895, - Variant42896, - Variant42897, - Variant42898, - Variant42899, - Variant42900, - Variant42901, - Variant42902, - Variant42903, - Variant42904, - Variant42905, - Variant42906, - Variant42907, - Variant42908, - Variant42909, - Variant42910, - Variant42911, - Variant42912, - Variant42913, - Variant42914, - Variant42915, - Variant42916, - Variant42917, - Variant42918, - Variant42919, - Variant42920, - Variant42921, - Variant42922, - Variant42923, - Variant42924, - Variant42925, - Variant42926, - Variant42927, - Variant42928, - Variant42929, - Variant42930, - Variant42931, - Variant42932, - Variant42933, - Variant42934, - Variant42935, - Variant42936, - Variant42937, - Variant42938, - Variant42939, - Variant42940, - Variant42941, - Variant42942, - Variant42943, - Variant42944, - Variant42945, - Variant42946, - Variant42947, - Variant42948, - Variant42949, - Variant42950, - Variant42951, - Variant42952, - Variant42953, - Variant42954, - Variant42955, - Variant42956, - Variant42957, - Variant42958, - Variant42959, - Variant42960, - Variant42961, - Variant42962, - Variant42963, - Variant42964, - Variant42965, - Variant42966, - Variant42967, - Variant42968, - Variant42969, - Variant42970, - Variant42971, - Variant42972, - Variant42973, - Variant42974, - Variant42975, - Variant42976, - Variant42977, - Variant42978, - Variant42979, - Variant42980, - Variant42981, - Variant42982, - Variant42983, - Variant42984, - Variant42985, - Variant42986, - Variant42987, - Variant42988, - Variant42989, - Variant42990, - Variant42991, - Variant42992, - Variant42993, - Variant42994, - Variant42995, - Variant42996, - Variant42997, - Variant42998, - Variant42999, - Variant43000, - Variant43001, - Variant43002, - Variant43003, - Variant43004, - Variant43005, - Variant43006, - Variant43007, - Variant43008, - Variant43009, - Variant43010, - Variant43011, - Variant43012, - Variant43013, - Variant43014, - Variant43015, - Variant43016, - Variant43017, - Variant43018, - Variant43019, - Variant43020, - Variant43021, - Variant43022, - Variant43023, - Variant43024, - Variant43025, - Variant43026, - Variant43027, - Variant43028, - Variant43029, - Variant43030, - Variant43031, - Variant43032, - Variant43033, - Variant43034, - Variant43035, - Variant43036, - Variant43037, - Variant43038, - Variant43039, - Variant43040, - Variant43041, - Variant43042, - Variant43043, - Variant43044, - Variant43045, - Variant43046, - Variant43047, - Variant43048, - Variant43049, - Variant43050, - Variant43051, - Variant43052, - Variant43053, - Variant43054, - Variant43055, - Variant43056, - Variant43057, - Variant43058, - Variant43059, - Variant43060, - Variant43061, - Variant43062, - Variant43063, - Variant43064, - Variant43065, - Variant43066, - Variant43067, - Variant43068, - Variant43069, - Variant43070, - Variant43071, - Variant43072, - Variant43073, - Variant43074, - Variant43075, - Variant43076, - Variant43077, - Variant43078, - Variant43079, - Variant43080, - Variant43081, - Variant43082, - Variant43083, - Variant43084, - Variant43085, - Variant43086, - Variant43087, - Variant43088, - Variant43089, - Variant43090, - Variant43091, - Variant43092, - Variant43093, - Variant43094, - Variant43095, - Variant43096, - Variant43097, - Variant43098, - Variant43099, - Variant43100, - Variant43101, - Variant43102, - Variant43103, - Variant43104, - Variant43105, - Variant43106, - Variant43107, - Variant43108, - Variant43109, - Variant43110, - Variant43111, - Variant43112, - Variant43113, - Variant43114, - Variant43115, - Variant43116, - Variant43117, - Variant43118, - Variant43119, - Variant43120, - Variant43121, - Variant43122, - Variant43123, - Variant43124, - Variant43125, - Variant43126, - Variant43127, - Variant43128, - Variant43129, - Variant43130, - Variant43131, - Variant43132, - Variant43133, - Variant43134, - Variant43135, - Variant43136, - Variant43137, - Variant43138, - Variant43139, - Variant43140, - Variant43141, - Variant43142, - Variant43143, - Variant43144, - Variant43145, - Variant43146, - Variant43147, - Variant43148, - Variant43149, - Variant43150, - Variant43151, - Variant43152, - Variant43153, - Variant43154, - Variant43155, - Variant43156, - Variant43157, - Variant43158, - Variant43159, - Variant43160, - Variant43161, - Variant43162, - Variant43163, - Variant43164, - Variant43165, - Variant43166, - Variant43167, - Variant43168, - Variant43169, - Variant43170, - Variant43171, - Variant43172, - Variant43173, - Variant43174, - Variant43175, - Variant43176, - Variant43177, - Variant43178, - Variant43179, - Variant43180, - Variant43181, - Variant43182, - Variant43183, - Variant43184, - Variant43185, - Variant43186, - Variant43187, - Variant43188, - Variant43189, - Variant43190, - Variant43191, - Variant43192, - Variant43193, - Variant43194, - Variant43195, - Variant43196, - Variant43197, - Variant43198, - Variant43199, - Variant43200, - Variant43201, - Variant43202, - Variant43203, - Variant43204, - Variant43205, - Variant43206, - Variant43207, - Variant43208, - Variant43209, - Variant43210, - Variant43211, - Variant43212, - Variant43213, - Variant43214, - Variant43215, - Variant43216, - Variant43217, - Variant43218, - Variant43219, - Variant43220, - Variant43221, - Variant43222, - Variant43223, - Variant43224, - Variant43225, - Variant43226, - Variant43227, - Variant43228, - Variant43229, - Variant43230, - Variant43231, - Variant43232, - Variant43233, - Variant43234, - Variant43235, - Variant43236, - Variant43237, - Variant43238, - Variant43239, - Variant43240, - Variant43241, - Variant43242, - Variant43243, - Variant43244, - Variant43245, - Variant43246, - Variant43247, - Variant43248, - Variant43249, - Variant43250, - Variant43251, - Variant43252, - Variant43253, - Variant43254, - Variant43255, - Variant43256, - Variant43257, - Variant43258, - Variant43259, - Variant43260, - Variant43261, - Variant43262, - Variant43263, - Variant43264, - Variant43265, - Variant43266, - Variant43267, - Variant43268, - Variant43269, - Variant43270, - Variant43271, - Variant43272, - Variant43273, - Variant43274, - Variant43275, - Variant43276, - Variant43277, - Variant43278, - Variant43279, - Variant43280, - Variant43281, - Variant43282, - Variant43283, - Variant43284, - Variant43285, - Variant43286, - Variant43287, - Variant43288, - Variant43289, - Variant43290, - Variant43291, - Variant43292, - Variant43293, - Variant43294, - Variant43295, - Variant43296, - Variant43297, - Variant43298, - Variant43299, - Variant43300, - Variant43301, - Variant43302, - Variant43303, - Variant43304, - Variant43305, - Variant43306, - Variant43307, - Variant43308, - Variant43309, - Variant43310, - Variant43311, - Variant43312, - Variant43313, - Variant43314, - Variant43315, - Variant43316, - Variant43317, - Variant43318, - Variant43319, - Variant43320, - Variant43321, - Variant43322, - Variant43323, - Variant43324, - Variant43325, - Variant43326, - Variant43327, - Variant43328, - Variant43329, - Variant43330, - Variant43331, - Variant43332, - Variant43333, - Variant43334, - Variant43335, - Variant43336, - Variant43337, - Variant43338, - Variant43339, - Variant43340, - Variant43341, - Variant43342, - Variant43343, - Variant43344, - Variant43345, - Variant43346, - Variant43347, - Variant43348, - Variant43349, - Variant43350, - Variant43351, - Variant43352, - Variant43353, - Variant43354, - Variant43355, - Variant43356, - Variant43357, - Variant43358, - Variant43359, - Variant43360, - Variant43361, - Variant43362, - Variant43363, - Variant43364, - Variant43365, - Variant43366, - Variant43367, - Variant43368, - Variant43369, - Variant43370, - Variant43371, - Variant43372, - Variant43373, - Variant43374, - Variant43375, - Variant43376, - Variant43377, - Variant43378, - Variant43379, - Variant43380, - Variant43381, - Variant43382, - Variant43383, - Variant43384, - Variant43385, - Variant43386, - Variant43387, - Variant43388, - Variant43389, - Variant43390, - Variant43391, - Variant43392, - Variant43393, - Variant43394, - Variant43395, - Variant43396, - Variant43397, - Variant43398, - Variant43399, - Variant43400, - Variant43401, - Variant43402, - Variant43403, - Variant43404, - Variant43405, - Variant43406, - Variant43407, - Variant43408, - Variant43409, - Variant43410, - Variant43411, - Variant43412, - Variant43413, - Variant43414, - Variant43415, - Variant43416, - Variant43417, - Variant43418, - Variant43419, - Variant43420, - Variant43421, - Variant43422, - Variant43423, - Variant43424, - Variant43425, - Variant43426, - Variant43427, - Variant43428, - Variant43429, - Variant43430, - Variant43431, - Variant43432, - Variant43433, - Variant43434, - Variant43435, - Variant43436, - Variant43437, - Variant43438, - Variant43439, - Variant43440, - Variant43441, - Variant43442, - Variant43443, - Variant43444, - Variant43445, - Variant43446, - Variant43447, - Variant43448, - Variant43449, - Variant43450, - Variant43451, - Variant43452, - Variant43453, - Variant43454, - Variant43455, - Variant43456, - Variant43457, - Variant43458, - Variant43459, - Variant43460, - Variant43461, - Variant43462, - Variant43463, - Variant43464, - Variant43465, - Variant43466, - Variant43467, - Variant43468, - Variant43469, - Variant43470, - Variant43471, - Variant43472, - Variant43473, - Variant43474, - Variant43475, - Variant43476, - Variant43477, - Variant43478, - Variant43479, - Variant43480, - Variant43481, - Variant43482, - Variant43483, - Variant43484, - Variant43485, - Variant43486, - Variant43487, - Variant43488, - Variant43489, - Variant43490, - Variant43491, - Variant43492, - Variant43493, - Variant43494, - Variant43495, - Variant43496, - Variant43497, - Variant43498, - Variant43499, - Variant43500, - Variant43501, - Variant43502, - Variant43503, - Variant43504, - Variant43505, - Variant43506, - Variant43507, - Variant43508, - Variant43509, - Variant43510, - Variant43511, - Variant43512, - Variant43513, - Variant43514, - Variant43515, - Variant43516, - Variant43517, - Variant43518, - Variant43519, - Variant43520, - Variant43521, - Variant43522, - Variant43523, - Variant43524, - Variant43525, - Variant43526, - Variant43527, - Variant43528, - Variant43529, - Variant43530, - Variant43531, - Variant43532, - Variant43533, - Variant43534, - Variant43535, - Variant43536, - Variant43537, - Variant43538, - Variant43539, - Variant43540, - Variant43541, - Variant43542, - Variant43543, - Variant43544, - Variant43545, - Variant43546, - Variant43547, - Variant43548, - Variant43549, - Variant43550, - Variant43551, - Variant43552, - Variant43553, - Variant43554, - Variant43555, - Variant43556, - Variant43557, - Variant43558, - Variant43559, - Variant43560, - Variant43561, - Variant43562, - Variant43563, - Variant43564, - Variant43565, - Variant43566, - Variant43567, - Variant43568, - Variant43569, - Variant43570, - Variant43571, - Variant43572, - Variant43573, - Variant43574, - Variant43575, - Variant43576, - Variant43577, - Variant43578, - Variant43579, - Variant43580, - Variant43581, - Variant43582, - Variant43583, - Variant43584, - Variant43585, - Variant43586, - Variant43587, - Variant43588, - Variant43589, - Variant43590, - Variant43591, - Variant43592, - Variant43593, - Variant43594, - Variant43595, - Variant43596, - Variant43597, - Variant43598, - Variant43599, - Variant43600, - Variant43601, - Variant43602, - Variant43603, - Variant43604, - Variant43605, - Variant43606, - Variant43607, - Variant43608, - Variant43609, - Variant43610, - Variant43611, - Variant43612, - Variant43613, - Variant43614, - Variant43615, - Variant43616, - Variant43617, - Variant43618, - Variant43619, - Variant43620, - Variant43621, - Variant43622, - Variant43623, - Variant43624, - Variant43625, - Variant43626, - Variant43627, - Variant43628, - Variant43629, - Variant43630, - Variant43631, - Variant43632, - Variant43633, - Variant43634, - Variant43635, - Variant43636, - Variant43637, - Variant43638, - Variant43639, - Variant43640, - Variant43641, - Variant43642, - Variant43643, - Variant43644, - Variant43645, - Variant43646, - Variant43647, - Variant43648, - Variant43649, - Variant43650, - Variant43651, - Variant43652, - Variant43653, - Variant43654, - Variant43655, - Variant43656, - Variant43657, - Variant43658, - Variant43659, - Variant43660, - Variant43661, - Variant43662, - Variant43663, - Variant43664, - Variant43665, - Variant43666, - Variant43667, - Variant43668, - Variant43669, - Variant43670, - Variant43671, - Variant43672, - Variant43673, - Variant43674, - Variant43675, - Variant43676, - Variant43677, - Variant43678, - Variant43679, - Variant43680, - Variant43681, - Variant43682, - Variant43683, - Variant43684, - Variant43685, - Variant43686, - Variant43687, - Variant43688, - Variant43689, - Variant43690, - Variant43691, - Variant43692, - Variant43693, - Variant43694, - Variant43695, - Variant43696, - Variant43697, - Variant43698, - Variant43699, - Variant43700, - Variant43701, - Variant43702, - Variant43703, - Variant43704, - Variant43705, - Variant43706, - Variant43707, - Variant43708, - Variant43709, - Variant43710, - Variant43711, - Variant43712, - Variant43713, - Variant43714, - Variant43715, - Variant43716, - Variant43717, - Variant43718, - Variant43719, - Variant43720, - Variant43721, - Variant43722, - Variant43723, - Variant43724, - Variant43725, - Variant43726, - Variant43727, - Variant43728, - Variant43729, - Variant43730, - Variant43731, - Variant43732, - Variant43733, - Variant43734, - Variant43735, - Variant43736, - Variant43737, - Variant43738, - Variant43739, - Variant43740, - Variant43741, - Variant43742, - Variant43743, - Variant43744, - Variant43745, - Variant43746, - Variant43747, - Variant43748, - Variant43749, - Variant43750, - Variant43751, - Variant43752, - Variant43753, - Variant43754, - Variant43755, - Variant43756, - Variant43757, - Variant43758, - Variant43759, - Variant43760, - Variant43761, - Variant43762, - Variant43763, - Variant43764, - Variant43765, - Variant43766, - Variant43767, - Variant43768, - Variant43769, - Variant43770, - Variant43771, - Variant43772, - Variant43773, - Variant43774, - Variant43775, - Variant43776, - Variant43777, - Variant43778, - Variant43779, - Variant43780, - Variant43781, - Variant43782, - Variant43783, - Variant43784, - Variant43785, - Variant43786, - Variant43787, - Variant43788, - Variant43789, - Variant43790, - Variant43791, - Variant43792, - Variant43793, - Variant43794, - Variant43795, - Variant43796, - Variant43797, - Variant43798, - Variant43799, - Variant43800, - Variant43801, - Variant43802, - Variant43803, - Variant43804, - Variant43805, - Variant43806, - Variant43807, - Variant43808, - Variant43809, - Variant43810, - Variant43811, - Variant43812, - Variant43813, - Variant43814, - Variant43815, - Variant43816, - Variant43817, - Variant43818, - Variant43819, - Variant43820, - Variant43821, - Variant43822, - Variant43823, - Variant43824, - Variant43825, - Variant43826, - Variant43827, - Variant43828, - Variant43829, - Variant43830, - Variant43831, - Variant43832, - Variant43833, - Variant43834, - Variant43835, - Variant43836, - Variant43837, - Variant43838, - Variant43839, - Variant43840, - Variant43841, - Variant43842, - Variant43843, - Variant43844, - Variant43845, - Variant43846, - Variant43847, - Variant43848, - Variant43849, - Variant43850, - Variant43851, - Variant43852, - Variant43853, - Variant43854, - Variant43855, - Variant43856, - Variant43857, - Variant43858, - Variant43859, - Variant43860, - Variant43861, - Variant43862, - Variant43863, - Variant43864, - Variant43865, - Variant43866, - Variant43867, - Variant43868, - Variant43869, - Variant43870, - Variant43871, - Variant43872, - Variant43873, - Variant43874, - Variant43875, - Variant43876, - Variant43877, - Variant43878, - Variant43879, - Variant43880, - Variant43881, - Variant43882, - Variant43883, - Variant43884, - Variant43885, - Variant43886, - Variant43887, - Variant43888, - Variant43889, - Variant43890, - Variant43891, - Variant43892, - Variant43893, - Variant43894, - Variant43895, - Variant43896, - Variant43897, - Variant43898, - Variant43899, - Variant43900, - Variant43901, - Variant43902, - Variant43903, - Variant43904, - Variant43905, - Variant43906, - Variant43907, - Variant43908, - Variant43909, - Variant43910, - Variant43911, - Variant43912, - Variant43913, - Variant43914, - Variant43915, - Variant43916, - Variant43917, - Variant43918, - Variant43919, - Variant43920, - Variant43921, - Variant43922, - Variant43923, - Variant43924, - Variant43925, - Variant43926, - Variant43927, - Variant43928, - Variant43929, - Variant43930, - Variant43931, - Variant43932, - Variant43933, - Variant43934, - Variant43935, - Variant43936, - Variant43937, - Variant43938, - Variant43939, - Variant43940, - Variant43941, - Variant43942, - Variant43943, - Variant43944, - Variant43945, - Variant43946, - Variant43947, - Variant43948, - Variant43949, - Variant43950, - Variant43951, - Variant43952, - Variant43953, - Variant43954, - Variant43955, - Variant43956, - Variant43957, - Variant43958, - Variant43959, - Variant43960, - Variant43961, - Variant43962, - Variant43963, - Variant43964, - Variant43965, - Variant43966, - Variant43967, - Variant43968, - Variant43969, - Variant43970, - Variant43971, - Variant43972, - Variant43973, - Variant43974, - Variant43975, - Variant43976, - Variant43977, - Variant43978, - Variant43979, - Variant43980, - Variant43981, - Variant43982, - Variant43983, - Variant43984, - Variant43985, - Variant43986, - Variant43987, - Variant43988, - Variant43989, - Variant43990, - Variant43991, - Variant43992, - Variant43993, - Variant43994, - Variant43995, - Variant43996, - Variant43997, - Variant43998, - Variant43999, - Variant44000, - Variant44001, - Variant44002, - Variant44003, - Variant44004, - Variant44005, - Variant44006, - Variant44007, - Variant44008, - Variant44009, - Variant44010, - Variant44011, - Variant44012, - Variant44013, - Variant44014, - Variant44015, - Variant44016, - Variant44017, - Variant44018, - Variant44019, - Variant44020, - Variant44021, - Variant44022, - Variant44023, - Variant44024, - Variant44025, - Variant44026, - Variant44027, - Variant44028, - Variant44029, - Variant44030, - Variant44031, - Variant44032, - Variant44033, - Variant44034, - Variant44035, - Variant44036, - Variant44037, - Variant44038, - Variant44039, - Variant44040, - Variant44041, - Variant44042, - Variant44043, - Variant44044, - Variant44045, - Variant44046, - Variant44047, - Variant44048, - Variant44049, - Variant44050, - Variant44051, - Variant44052, - Variant44053, - Variant44054, - Variant44055, - Variant44056, - Variant44057, - Variant44058, - Variant44059, - Variant44060, - Variant44061, - Variant44062, - Variant44063, - Variant44064, - Variant44065, - Variant44066, - Variant44067, - Variant44068, - Variant44069, - Variant44070, - Variant44071, - Variant44072, - Variant44073, - Variant44074, - Variant44075, - Variant44076, - Variant44077, - Variant44078, - Variant44079, - Variant44080, - Variant44081, - Variant44082, - Variant44083, - Variant44084, - Variant44085, - Variant44086, - Variant44087, - Variant44088, - Variant44089, - Variant44090, - Variant44091, - Variant44092, - Variant44093, - Variant44094, - Variant44095, - Variant44096, - Variant44097, - Variant44098, - Variant44099, - Variant44100, - Variant44101, - Variant44102, - Variant44103, - Variant44104, - Variant44105, - Variant44106, - Variant44107, - Variant44108, - Variant44109, - Variant44110, - Variant44111, - Variant44112, - Variant44113, - Variant44114, - Variant44115, - Variant44116, - Variant44117, - Variant44118, - Variant44119, - Variant44120, - Variant44121, - Variant44122, - Variant44123, - Variant44124, - Variant44125, - Variant44126, - Variant44127, - Variant44128, - Variant44129, - Variant44130, - Variant44131, - Variant44132, - Variant44133, - Variant44134, - Variant44135, - Variant44136, - Variant44137, - Variant44138, - Variant44139, - Variant44140, - Variant44141, - Variant44142, - Variant44143, - Variant44144, - Variant44145, - Variant44146, - Variant44147, - Variant44148, - Variant44149, - Variant44150, - Variant44151, - Variant44152, - Variant44153, - Variant44154, - Variant44155, - Variant44156, - Variant44157, - Variant44158, - Variant44159, - Variant44160, - Variant44161, - Variant44162, - Variant44163, - Variant44164, - Variant44165, - Variant44166, - Variant44167, - Variant44168, - Variant44169, - Variant44170, - Variant44171, - Variant44172, - Variant44173, - Variant44174, - Variant44175, - Variant44176, - Variant44177, - Variant44178, - Variant44179, - Variant44180, - Variant44181, - Variant44182, - Variant44183, - Variant44184, - Variant44185, - Variant44186, - Variant44187, - Variant44188, - Variant44189, - Variant44190, - Variant44191, - Variant44192, - Variant44193, - Variant44194, - Variant44195, - Variant44196, - Variant44197, - Variant44198, - Variant44199, - Variant44200, - Variant44201, - Variant44202, - Variant44203, - Variant44204, - Variant44205, - Variant44206, - Variant44207, - Variant44208, - Variant44209, - Variant44210, - Variant44211, - Variant44212, - Variant44213, - Variant44214, - Variant44215, - Variant44216, - Variant44217, - Variant44218, - Variant44219, - Variant44220, - Variant44221, - Variant44222, - Variant44223, - Variant44224, - Variant44225, - Variant44226, - Variant44227, - Variant44228, - Variant44229, - Variant44230, - Variant44231, - Variant44232, - Variant44233, - Variant44234, - Variant44235, - Variant44236, - Variant44237, - Variant44238, - Variant44239, - Variant44240, - Variant44241, - Variant44242, - Variant44243, - Variant44244, - Variant44245, - Variant44246, - Variant44247, - Variant44248, - Variant44249, - Variant44250, - Variant44251, - Variant44252, - Variant44253, - Variant44254, - Variant44255, - Variant44256, - Variant44257, - Variant44258, - Variant44259, - Variant44260, - Variant44261, - Variant44262, - Variant44263, - Variant44264, - Variant44265, - Variant44266, - Variant44267, - Variant44268, - Variant44269, - Variant44270, - Variant44271, - Variant44272, - Variant44273, - Variant44274, - Variant44275, - Variant44276, - Variant44277, - Variant44278, - Variant44279, - Variant44280, - Variant44281, - Variant44282, - Variant44283, - Variant44284, - Variant44285, - Variant44286, - Variant44287, - Variant44288, - Variant44289, - Variant44290, - Variant44291, - Variant44292, - Variant44293, - Variant44294, - Variant44295, - Variant44296, - Variant44297, - Variant44298, - Variant44299, - Variant44300, - Variant44301, - Variant44302, - Variant44303, - Variant44304, - Variant44305, - Variant44306, - Variant44307, - Variant44308, - Variant44309, - Variant44310, - Variant44311, - Variant44312, - Variant44313, - Variant44314, - Variant44315, - Variant44316, - Variant44317, - Variant44318, - Variant44319, - Variant44320, - Variant44321, - Variant44322, - Variant44323, - Variant44324, - Variant44325, - Variant44326, - Variant44327, - Variant44328, - Variant44329, - Variant44330, - Variant44331, - Variant44332, - Variant44333, - Variant44334, - Variant44335, - Variant44336, - Variant44337, - Variant44338, - Variant44339, - Variant44340, - Variant44341, - Variant44342, - Variant44343, - Variant44344, - Variant44345, - Variant44346, - Variant44347, - Variant44348, - Variant44349, - Variant44350, - Variant44351, - Variant44352, - Variant44353, - Variant44354, - Variant44355, - Variant44356, - Variant44357, - Variant44358, - Variant44359, - Variant44360, - Variant44361, - Variant44362, - Variant44363, - Variant44364, - Variant44365, - Variant44366, - Variant44367, - Variant44368, - Variant44369, - Variant44370, - Variant44371, - Variant44372, - Variant44373, - Variant44374, - Variant44375, - Variant44376, - Variant44377, - Variant44378, - Variant44379, - Variant44380, - Variant44381, - Variant44382, - Variant44383, - Variant44384, - Variant44385, - Variant44386, - Variant44387, - Variant44388, - Variant44389, - Variant44390, - Variant44391, - Variant44392, - Variant44393, - Variant44394, - Variant44395, - Variant44396, - Variant44397, - Variant44398, - Variant44399, - Variant44400, - Variant44401, - Variant44402, - Variant44403, - Variant44404, - Variant44405, - Variant44406, - Variant44407, - Variant44408, - Variant44409, - Variant44410, - Variant44411, - Variant44412, - Variant44413, - Variant44414, - Variant44415, - Variant44416, - Variant44417, - Variant44418, - Variant44419, - Variant44420, - Variant44421, - Variant44422, - Variant44423, - Variant44424, - Variant44425, - Variant44426, - Variant44427, - Variant44428, - Variant44429, - Variant44430, - Variant44431, - Variant44432, - Variant44433, - Variant44434, - Variant44435, - Variant44436, - Variant44437, - Variant44438, - Variant44439, - Variant44440, - Variant44441, - Variant44442, - Variant44443, - Variant44444, - Variant44445, - Variant44446, - Variant44447, - Variant44448, - Variant44449, - Variant44450, - Variant44451, - Variant44452, - Variant44453, - Variant44454, - Variant44455, - Variant44456, - Variant44457, - Variant44458, - Variant44459, - Variant44460, - Variant44461, - Variant44462, - Variant44463, - Variant44464, - Variant44465, - Variant44466, - Variant44467, - Variant44468, - Variant44469, - Variant44470, - Variant44471, - Variant44472, - Variant44473, - Variant44474, - Variant44475, - Variant44476, - Variant44477, - Variant44478, - Variant44479, - Variant44480, - Variant44481, - Variant44482, - Variant44483, - Variant44484, - Variant44485, - Variant44486, - Variant44487, - Variant44488, - Variant44489, - Variant44490, - Variant44491, - Variant44492, - Variant44493, - Variant44494, - Variant44495, - Variant44496, - Variant44497, - Variant44498, - Variant44499, - Variant44500, - Variant44501, - Variant44502, - Variant44503, - Variant44504, - Variant44505, - Variant44506, - Variant44507, - Variant44508, - Variant44509, - Variant44510, - Variant44511, - Variant44512, - Variant44513, - Variant44514, - Variant44515, - Variant44516, - Variant44517, - Variant44518, - Variant44519, - Variant44520, - Variant44521, - Variant44522, - Variant44523, - Variant44524, - Variant44525, - Variant44526, - Variant44527, - Variant44528, - Variant44529, - Variant44530, - Variant44531, - Variant44532, - Variant44533, - Variant44534, - Variant44535, - Variant44536, - Variant44537, - Variant44538, - Variant44539, - Variant44540, - Variant44541, - Variant44542, - Variant44543, - Variant44544, - Variant44545, - Variant44546, - Variant44547, - Variant44548, - Variant44549, - Variant44550, - Variant44551, - Variant44552, - Variant44553, - Variant44554, - Variant44555, - Variant44556, - Variant44557, - Variant44558, - Variant44559, - Variant44560, - Variant44561, - Variant44562, - Variant44563, - Variant44564, - Variant44565, - Variant44566, - Variant44567, - Variant44568, - Variant44569, - Variant44570, - Variant44571, - Variant44572, - Variant44573, - Variant44574, - Variant44575, - Variant44576, - Variant44577, - Variant44578, - Variant44579, - Variant44580, - Variant44581, - Variant44582, - Variant44583, - Variant44584, - Variant44585, - Variant44586, - Variant44587, - Variant44588, - Variant44589, - Variant44590, - Variant44591, - Variant44592, - Variant44593, - Variant44594, - Variant44595, - Variant44596, - Variant44597, - Variant44598, - Variant44599, - Variant44600, - Variant44601, - Variant44602, - Variant44603, - Variant44604, - Variant44605, - Variant44606, - Variant44607, - Variant44608, - Variant44609, - Variant44610, - Variant44611, - Variant44612, - Variant44613, - Variant44614, - Variant44615, - Variant44616, - Variant44617, - Variant44618, - Variant44619, - Variant44620, - Variant44621, - Variant44622, - Variant44623, - Variant44624, - Variant44625, - Variant44626, - Variant44627, - Variant44628, - Variant44629, - Variant44630, - Variant44631, - Variant44632, - Variant44633, - Variant44634, - Variant44635, - Variant44636, - Variant44637, - Variant44638, - Variant44639, - Variant44640, - Variant44641, - Variant44642, - Variant44643, - Variant44644, - Variant44645, - Variant44646, - Variant44647, - Variant44648, - Variant44649, - Variant44650, - Variant44651, - Variant44652, - Variant44653, - Variant44654, - Variant44655, - Variant44656, - Variant44657, - Variant44658, - Variant44659, - Variant44660, - Variant44661, - Variant44662, - Variant44663, - Variant44664, - Variant44665, - Variant44666, - Variant44667, - Variant44668, - Variant44669, - Variant44670, - Variant44671, - Variant44672, - Variant44673, - Variant44674, - Variant44675, - Variant44676, - Variant44677, - Variant44678, - Variant44679, - Variant44680, - Variant44681, - Variant44682, - Variant44683, - Variant44684, - Variant44685, - Variant44686, - Variant44687, - Variant44688, - Variant44689, - Variant44690, - Variant44691, - Variant44692, - Variant44693, - Variant44694, - Variant44695, - Variant44696, - Variant44697, - Variant44698, - Variant44699, - Variant44700, - Variant44701, - Variant44702, - Variant44703, - Variant44704, - Variant44705, - Variant44706, - Variant44707, - Variant44708, - Variant44709, - Variant44710, - Variant44711, - Variant44712, - Variant44713, - Variant44714, - Variant44715, - Variant44716, - Variant44717, - Variant44718, - Variant44719, - Variant44720, - Variant44721, - Variant44722, - Variant44723, - Variant44724, - Variant44725, - Variant44726, - Variant44727, - Variant44728, - Variant44729, - Variant44730, - Variant44731, - Variant44732, - Variant44733, - Variant44734, - Variant44735, - Variant44736, - Variant44737, - Variant44738, - Variant44739, - Variant44740, - Variant44741, - Variant44742, - Variant44743, - Variant44744, - Variant44745, - Variant44746, - Variant44747, - Variant44748, - Variant44749, - Variant44750, - Variant44751, - Variant44752, - Variant44753, - Variant44754, - Variant44755, - Variant44756, - Variant44757, - Variant44758, - Variant44759, - Variant44760, - Variant44761, - Variant44762, - Variant44763, - Variant44764, - Variant44765, - Variant44766, - Variant44767, - Variant44768, - Variant44769, - Variant44770, - Variant44771, - Variant44772, - Variant44773, - Variant44774, - Variant44775, - Variant44776, - Variant44777, - Variant44778, - Variant44779, - Variant44780, - Variant44781, - Variant44782, - Variant44783, - Variant44784, - Variant44785, - Variant44786, - Variant44787, - Variant44788, - Variant44789, - Variant44790, - Variant44791, - Variant44792, - Variant44793, - Variant44794, - Variant44795, - Variant44796, - Variant44797, - Variant44798, - Variant44799, - Variant44800, - Variant44801, - Variant44802, - Variant44803, - Variant44804, - Variant44805, - Variant44806, - Variant44807, - Variant44808, - Variant44809, - Variant44810, - Variant44811, - Variant44812, - Variant44813, - Variant44814, - Variant44815, - Variant44816, - Variant44817, - Variant44818, - Variant44819, - Variant44820, - Variant44821, - Variant44822, - Variant44823, - Variant44824, - Variant44825, - Variant44826, - Variant44827, - Variant44828, - Variant44829, - Variant44830, - Variant44831, - Variant44832, - Variant44833, - Variant44834, - Variant44835, - Variant44836, - Variant44837, - Variant44838, - Variant44839, - Variant44840, - Variant44841, - Variant44842, - Variant44843, - Variant44844, - Variant44845, - Variant44846, - Variant44847, - Variant44848, - Variant44849, - Variant44850, - Variant44851, - Variant44852, - Variant44853, - Variant44854, - Variant44855, - Variant44856, - Variant44857, - Variant44858, - Variant44859, - Variant44860, - Variant44861, - Variant44862, - Variant44863, - Variant44864, - Variant44865, - Variant44866, - Variant44867, - Variant44868, - Variant44869, - Variant44870, - Variant44871, - Variant44872, - Variant44873, - Variant44874, - Variant44875, - Variant44876, - Variant44877, - Variant44878, - Variant44879, - Variant44880, - Variant44881, - Variant44882, - Variant44883, - Variant44884, - Variant44885, - Variant44886, - Variant44887, - Variant44888, - Variant44889, - Variant44890, - Variant44891, - Variant44892, - Variant44893, - Variant44894, - Variant44895, - Variant44896, - Variant44897, - Variant44898, - Variant44899, - Variant44900, - Variant44901, - Variant44902, - Variant44903, - Variant44904, - Variant44905, - Variant44906, - Variant44907, - Variant44908, - Variant44909, - Variant44910, - Variant44911, - Variant44912, - Variant44913, - Variant44914, - Variant44915, - Variant44916, - Variant44917, - Variant44918, - Variant44919, - Variant44920, - Variant44921, - Variant44922, - Variant44923, - Variant44924, - Variant44925, - Variant44926, - Variant44927, - Variant44928, - Variant44929, - Variant44930, - Variant44931, - Variant44932, - Variant44933, - Variant44934, - Variant44935, - Variant44936, - Variant44937, - Variant44938, - Variant44939, - Variant44940, - Variant44941, - Variant44942, - Variant44943, - Variant44944, - Variant44945, - Variant44946, - Variant44947, - Variant44948, - Variant44949, - Variant44950, - Variant44951, - Variant44952, - Variant44953, - Variant44954, - Variant44955, - Variant44956, - Variant44957, - Variant44958, - Variant44959, - Variant44960, - Variant44961, - Variant44962, - Variant44963, - Variant44964, - Variant44965, - Variant44966, - Variant44967, - Variant44968, - Variant44969, - Variant44970, - Variant44971, - Variant44972, - Variant44973, - Variant44974, - Variant44975, - Variant44976, - Variant44977, - Variant44978, - Variant44979, - Variant44980, - Variant44981, - Variant44982, - Variant44983, - Variant44984, - Variant44985, - Variant44986, - Variant44987, - Variant44988, - Variant44989, - Variant44990, - Variant44991, - Variant44992, - Variant44993, - Variant44994, - Variant44995, - Variant44996, - Variant44997, - Variant44998, - Variant44999, - Variant45000, - Variant45001, - Variant45002, - Variant45003, - Variant45004, - Variant45005, - Variant45006, - Variant45007, - Variant45008, - Variant45009, - Variant45010, - Variant45011, - Variant45012, - Variant45013, - Variant45014, - Variant45015, - Variant45016, - Variant45017, - Variant45018, - Variant45019, - Variant45020, - Variant45021, - Variant45022, - Variant45023, - Variant45024, - Variant45025, - Variant45026, - Variant45027, - Variant45028, - Variant45029, - Variant45030, - Variant45031, - Variant45032, - Variant45033, - Variant45034, - Variant45035, - Variant45036, - Variant45037, - Variant45038, - Variant45039, - Variant45040, - Variant45041, - Variant45042, - Variant45043, - Variant45044, - Variant45045, - Variant45046, - Variant45047, - Variant45048, - Variant45049, - Variant45050, - Variant45051, - Variant45052, - Variant45053, - Variant45054, - Variant45055, - Variant45056, - Variant45057, - Variant45058, - Variant45059, - Variant45060, - Variant45061, - Variant45062, - Variant45063, - Variant45064, - Variant45065, - Variant45066, - Variant45067, - Variant45068, - Variant45069, - Variant45070, - Variant45071, - Variant45072, - Variant45073, - Variant45074, - Variant45075, - Variant45076, - Variant45077, - Variant45078, - Variant45079, - Variant45080, - Variant45081, - Variant45082, - Variant45083, - Variant45084, - Variant45085, - Variant45086, - Variant45087, - Variant45088, - Variant45089, - Variant45090, - Variant45091, - Variant45092, - Variant45093, - Variant45094, - Variant45095, - Variant45096, - Variant45097, - Variant45098, - Variant45099, - Variant45100, - Variant45101, - Variant45102, - Variant45103, - Variant45104, - Variant45105, - Variant45106, - Variant45107, - Variant45108, - Variant45109, - Variant45110, - Variant45111, - Variant45112, - Variant45113, - Variant45114, - Variant45115, - Variant45116, - Variant45117, - Variant45118, - Variant45119, - Variant45120, - Variant45121, - Variant45122, - Variant45123, - Variant45124, - Variant45125, - Variant45126, - Variant45127, - Variant45128, - Variant45129, - Variant45130, - Variant45131, - Variant45132, - Variant45133, - Variant45134, - Variant45135, - Variant45136, - Variant45137, - Variant45138, - Variant45139, - Variant45140, - Variant45141, - Variant45142, - Variant45143, - Variant45144, - Variant45145, - Variant45146, - Variant45147, - Variant45148, - Variant45149, - Variant45150, - Variant45151, - Variant45152, - Variant45153, - Variant45154, - Variant45155, - Variant45156, - Variant45157, - Variant45158, - Variant45159, - Variant45160, - Variant45161, - Variant45162, - Variant45163, - Variant45164, - Variant45165, - Variant45166, - Variant45167, - Variant45168, - Variant45169, - Variant45170, - Variant45171, - Variant45172, - Variant45173, - Variant45174, - Variant45175, - Variant45176, - Variant45177, - Variant45178, - Variant45179, - Variant45180, - Variant45181, - Variant45182, - Variant45183, - Variant45184, - Variant45185, - Variant45186, - Variant45187, - Variant45188, - Variant45189, - Variant45190, - Variant45191, - Variant45192, - Variant45193, - Variant45194, - Variant45195, - Variant45196, - Variant45197, - Variant45198, - Variant45199, - Variant45200, - Variant45201, - Variant45202, - Variant45203, - Variant45204, - Variant45205, - Variant45206, - Variant45207, - Variant45208, - Variant45209, - Variant45210, - Variant45211, - Variant45212, - Variant45213, - Variant45214, - Variant45215, - Variant45216, - Variant45217, - Variant45218, - Variant45219, - Variant45220, - Variant45221, - Variant45222, - Variant45223, - Variant45224, - Variant45225, - Variant45226, - Variant45227, - Variant45228, - Variant45229, - Variant45230, - Variant45231, - Variant45232, - Variant45233, - Variant45234, - Variant45235, - Variant45236, - Variant45237, - Variant45238, - Variant45239, - Variant45240, - Variant45241, - Variant45242, - Variant45243, - Variant45244, - Variant45245, - Variant45246, - Variant45247, - Variant45248, - Variant45249, - Variant45250, - Variant45251, - Variant45252, - Variant45253, - Variant45254, - Variant45255, - Variant45256, - Variant45257, - Variant45258, - Variant45259, - Variant45260, - Variant45261, - Variant45262, - Variant45263, - Variant45264, - Variant45265, - Variant45266, - Variant45267, - Variant45268, - Variant45269, - Variant45270, - Variant45271, - Variant45272, - Variant45273, - Variant45274, - Variant45275, - Variant45276, - Variant45277, - Variant45278, - Variant45279, - Variant45280, - Variant45281, - Variant45282, - Variant45283, - Variant45284, - Variant45285, - Variant45286, - Variant45287, - Variant45288, - Variant45289, - Variant45290, - Variant45291, - Variant45292, - Variant45293, - Variant45294, - Variant45295, - Variant45296, - Variant45297, - Variant45298, - Variant45299, - Variant45300, - Variant45301, - Variant45302, - Variant45303, - Variant45304, - Variant45305, - Variant45306, - Variant45307, - Variant45308, - Variant45309, - Variant45310, - Variant45311, - Variant45312, - Variant45313, - Variant45314, - Variant45315, - Variant45316, - Variant45317, - Variant45318, - Variant45319, - Variant45320, - Variant45321, - Variant45322, - Variant45323, - Variant45324, - Variant45325, - Variant45326, - Variant45327, - Variant45328, - Variant45329, - Variant45330, - Variant45331, - Variant45332, - Variant45333, - Variant45334, - Variant45335, - Variant45336, - Variant45337, - Variant45338, - Variant45339, - Variant45340, - Variant45341, - Variant45342, - Variant45343, - Variant45344, - Variant45345, - Variant45346, - Variant45347, - Variant45348, - Variant45349, - Variant45350, - Variant45351, - Variant45352, - Variant45353, - Variant45354, - Variant45355, - Variant45356, - Variant45357, - Variant45358, - Variant45359, - Variant45360, - Variant45361, - Variant45362, - Variant45363, - Variant45364, - Variant45365, - Variant45366, - Variant45367, - Variant45368, - Variant45369, - Variant45370, - Variant45371, - Variant45372, - Variant45373, - Variant45374, - Variant45375, - Variant45376, - Variant45377, - Variant45378, - Variant45379, - Variant45380, - Variant45381, - Variant45382, - Variant45383, - Variant45384, - Variant45385, - Variant45386, - Variant45387, - Variant45388, - Variant45389, - Variant45390, - Variant45391, - Variant45392, - Variant45393, - Variant45394, - Variant45395, - Variant45396, - Variant45397, - Variant45398, - Variant45399, - Variant45400, - Variant45401, - Variant45402, - Variant45403, - Variant45404, - Variant45405, - Variant45406, - Variant45407, - Variant45408, - Variant45409, - Variant45410, - Variant45411, - Variant45412, - Variant45413, - Variant45414, - Variant45415, - Variant45416, - Variant45417, - Variant45418, - Variant45419, - Variant45420, - Variant45421, - Variant45422, - Variant45423, - Variant45424, - Variant45425, - Variant45426, - Variant45427, - Variant45428, - Variant45429, - Variant45430, - Variant45431, - Variant45432, - Variant45433, - Variant45434, - Variant45435, - Variant45436, - Variant45437, - Variant45438, - Variant45439, - Variant45440, - Variant45441, - Variant45442, - Variant45443, - Variant45444, - Variant45445, - Variant45446, - Variant45447, - Variant45448, - Variant45449, - Variant45450, - Variant45451, - Variant45452, - Variant45453, - Variant45454, - Variant45455, - Variant45456, - Variant45457, - Variant45458, - Variant45459, - Variant45460, - Variant45461, - Variant45462, - Variant45463, - Variant45464, - Variant45465, - Variant45466, - Variant45467, - Variant45468, - Variant45469, - Variant45470, - Variant45471, - Variant45472, - Variant45473, - Variant45474, - Variant45475, - Variant45476, - Variant45477, - Variant45478, - Variant45479, - Variant45480, - Variant45481, - Variant45482, - Variant45483, - Variant45484, - Variant45485, - Variant45486, - Variant45487, - Variant45488, - Variant45489, - Variant45490, - Variant45491, - Variant45492, - Variant45493, - Variant45494, - Variant45495, - Variant45496, - Variant45497, - Variant45498, - Variant45499, - Variant45500, - Variant45501, - Variant45502, - Variant45503, - Variant45504, - Variant45505, - Variant45506, - Variant45507, - Variant45508, - Variant45509, - Variant45510, - Variant45511, - Variant45512, - Variant45513, - Variant45514, - Variant45515, - Variant45516, - Variant45517, - Variant45518, - Variant45519, - Variant45520, - Variant45521, - Variant45522, - Variant45523, - Variant45524, - Variant45525, - Variant45526, - Variant45527, - Variant45528, - Variant45529, - Variant45530, - Variant45531, - Variant45532, - Variant45533, - Variant45534, - Variant45535, - Variant45536, - Variant45537, - Variant45538, - Variant45539, - Variant45540, - Variant45541, - Variant45542, - Variant45543, - Variant45544, - Variant45545, - Variant45546, - Variant45547, - Variant45548, - Variant45549, - Variant45550, - Variant45551, - Variant45552, - Variant45553, - Variant45554, - Variant45555, - Variant45556, - Variant45557, - Variant45558, - Variant45559, - Variant45560, - Variant45561, - Variant45562, - Variant45563, - Variant45564, - Variant45565, - Variant45566, - Variant45567, - Variant45568, - Variant45569, - Variant45570, - Variant45571, - Variant45572, - Variant45573, - Variant45574, - Variant45575, - Variant45576, - Variant45577, - Variant45578, - Variant45579, - Variant45580, - Variant45581, - Variant45582, - Variant45583, - Variant45584, - Variant45585, - Variant45586, - Variant45587, - Variant45588, - Variant45589, - Variant45590, - Variant45591, - Variant45592, - Variant45593, - Variant45594, - Variant45595, - Variant45596, - Variant45597, - Variant45598, - Variant45599, - Variant45600, - Variant45601, - Variant45602, - Variant45603, - Variant45604, - Variant45605, - Variant45606, - Variant45607, - Variant45608, - Variant45609, - Variant45610, - Variant45611, - Variant45612, - Variant45613, - Variant45614, - Variant45615, - Variant45616, - Variant45617, - Variant45618, - Variant45619, - Variant45620, - Variant45621, - Variant45622, - Variant45623, - Variant45624, - Variant45625, - Variant45626, - Variant45627, - Variant45628, - Variant45629, - Variant45630, - Variant45631, - Variant45632, - Variant45633, - Variant45634, - Variant45635, - Variant45636, - Variant45637, - Variant45638, - Variant45639, - Variant45640, - Variant45641, - Variant45642, - Variant45643, - Variant45644, - Variant45645, - Variant45646, - Variant45647, - Variant45648, - Variant45649, - Variant45650, - Variant45651, - Variant45652, - Variant45653, - Variant45654, - Variant45655, - Variant45656, - Variant45657, - Variant45658, - Variant45659, - Variant45660, - Variant45661, - Variant45662, - Variant45663, - Variant45664, - Variant45665, - Variant45666, - Variant45667, - Variant45668, - Variant45669, - Variant45670, - Variant45671, - Variant45672, - Variant45673, - Variant45674, - Variant45675, - Variant45676, - Variant45677, - Variant45678, - Variant45679, - Variant45680, - Variant45681, - Variant45682, - Variant45683, - Variant45684, - Variant45685, - Variant45686, - Variant45687, - Variant45688, - Variant45689, - Variant45690, - Variant45691, - Variant45692, - Variant45693, - Variant45694, - Variant45695, - Variant45696, - Variant45697, - Variant45698, - Variant45699, - Variant45700, - Variant45701, - Variant45702, - Variant45703, - Variant45704, - Variant45705, - Variant45706, - Variant45707, - Variant45708, - Variant45709, - Variant45710, - Variant45711, - Variant45712, - Variant45713, - Variant45714, - Variant45715, - Variant45716, - Variant45717, - Variant45718, - Variant45719, - Variant45720, - Variant45721, - Variant45722, - Variant45723, - Variant45724, - Variant45725, - Variant45726, - Variant45727, - Variant45728, - Variant45729, - Variant45730, - Variant45731, - Variant45732, - Variant45733, - Variant45734, - Variant45735, - Variant45736, - Variant45737, - Variant45738, - Variant45739, - Variant45740, - Variant45741, - Variant45742, - Variant45743, - Variant45744, - Variant45745, - Variant45746, - Variant45747, - Variant45748, - Variant45749, - Variant45750, - Variant45751, - Variant45752, - Variant45753, - Variant45754, - Variant45755, - Variant45756, - Variant45757, - Variant45758, - Variant45759, - Variant45760, - Variant45761, - Variant45762, - Variant45763, - Variant45764, - Variant45765, - Variant45766, - Variant45767, - Variant45768, - Variant45769, - Variant45770, - Variant45771, - Variant45772, - Variant45773, - Variant45774, - Variant45775, - Variant45776, - Variant45777, - Variant45778, - Variant45779, - Variant45780, - Variant45781, - Variant45782, - Variant45783, - Variant45784, - Variant45785, - Variant45786, - Variant45787, - Variant45788, - Variant45789, - Variant45790, - Variant45791, - Variant45792, - Variant45793, - Variant45794, - Variant45795, - Variant45796, - Variant45797, - Variant45798, - Variant45799, - Variant45800, - Variant45801, - Variant45802, - Variant45803, - Variant45804, - Variant45805, - Variant45806, - Variant45807, - Variant45808, - Variant45809, - Variant45810, - Variant45811, - Variant45812, - Variant45813, - Variant45814, - Variant45815, - Variant45816, - Variant45817, - Variant45818, - Variant45819, - Variant45820, - Variant45821, - Variant45822, - Variant45823, - Variant45824, - Variant45825, - Variant45826, - Variant45827, - Variant45828, - Variant45829, - Variant45830, - Variant45831, - Variant45832, - Variant45833, - Variant45834, - Variant45835, - Variant45836, - Variant45837, - Variant45838, - Variant45839, - Variant45840, - Variant45841, - Variant45842, - Variant45843, - Variant45844, - Variant45845, - Variant45846, - Variant45847, - Variant45848, - Variant45849, - Variant45850, - Variant45851, - Variant45852, - Variant45853, - Variant45854, - Variant45855, - Variant45856, - Variant45857, - Variant45858, - Variant45859, - Variant45860, - Variant45861, - Variant45862, - Variant45863, - Variant45864, - Variant45865, - Variant45866, - Variant45867, - Variant45868, - Variant45869, - Variant45870, - Variant45871, - Variant45872, - Variant45873, - Variant45874, - Variant45875, - Variant45876, - Variant45877, - Variant45878, - Variant45879, - Variant45880, - Variant45881, - Variant45882, - Variant45883, - Variant45884, - Variant45885, - Variant45886, - Variant45887, - Variant45888, - Variant45889, - Variant45890, - Variant45891, - Variant45892, - Variant45893, - Variant45894, - Variant45895, - Variant45896, - Variant45897, - Variant45898, - Variant45899, - Variant45900, - Variant45901, - Variant45902, - Variant45903, - Variant45904, - Variant45905, - Variant45906, - Variant45907, - Variant45908, - Variant45909, - Variant45910, - Variant45911, - Variant45912, - Variant45913, - Variant45914, - Variant45915, - Variant45916, - Variant45917, - Variant45918, - Variant45919, - Variant45920, - Variant45921, - Variant45922, - Variant45923, - Variant45924, - Variant45925, - Variant45926, - Variant45927, - Variant45928, - Variant45929, - Variant45930, - Variant45931, - Variant45932, - Variant45933, - Variant45934, - Variant45935, - Variant45936, - Variant45937, - Variant45938, - Variant45939, - Variant45940, - Variant45941, - Variant45942, - Variant45943, - Variant45944, - Variant45945, - Variant45946, - Variant45947, - Variant45948, - Variant45949, - Variant45950, - Variant45951, - Variant45952, - Variant45953, - Variant45954, - Variant45955, - Variant45956, - Variant45957, - Variant45958, - Variant45959, - Variant45960, - Variant45961, - Variant45962, - Variant45963, - Variant45964, - Variant45965, - Variant45966, - Variant45967, - Variant45968, - Variant45969, - Variant45970, - Variant45971, - Variant45972, - Variant45973, - Variant45974, - Variant45975, - Variant45976, - Variant45977, - Variant45978, - Variant45979, - Variant45980, - Variant45981, - Variant45982, - Variant45983, - Variant45984, - Variant45985, - Variant45986, - Variant45987, - Variant45988, - Variant45989, - Variant45990, - Variant45991, - Variant45992, - Variant45993, - Variant45994, - Variant45995, - Variant45996, - Variant45997, - Variant45998, - Variant45999, - Variant46000, - Variant46001, - Variant46002, - Variant46003, - Variant46004, - Variant46005, - Variant46006, - Variant46007, - Variant46008, - Variant46009, - Variant46010, - Variant46011, - Variant46012, - Variant46013, - Variant46014, - Variant46015, - Variant46016, - Variant46017, - Variant46018, - Variant46019, - Variant46020, - Variant46021, - Variant46022, - Variant46023, - Variant46024, - Variant46025, - Variant46026, - Variant46027, - Variant46028, - Variant46029, - Variant46030, - Variant46031, - Variant46032, - Variant46033, - Variant46034, - Variant46035, - Variant46036, - Variant46037, - Variant46038, - Variant46039, - Variant46040, - Variant46041, - Variant46042, - Variant46043, - Variant46044, - Variant46045, - Variant46046, - Variant46047, - Variant46048, - Variant46049, - Variant46050, - Variant46051, - Variant46052, - Variant46053, - Variant46054, - Variant46055, - Variant46056, - Variant46057, - Variant46058, - Variant46059, - Variant46060, - Variant46061, - Variant46062, - Variant46063, - Variant46064, - Variant46065, - Variant46066, - Variant46067, - Variant46068, - Variant46069, - Variant46070, - Variant46071, - Variant46072, - Variant46073, - Variant46074, - Variant46075, - Variant46076, - Variant46077, - Variant46078, - Variant46079, - Variant46080, - Variant46081, - Variant46082, - Variant46083, - Variant46084, - Variant46085, - Variant46086, - Variant46087, - Variant46088, - Variant46089, - Variant46090, - Variant46091, - Variant46092, - Variant46093, - Variant46094, - Variant46095, - Variant46096, - Variant46097, - Variant46098, - Variant46099, - Variant46100, - Variant46101, - Variant46102, - Variant46103, - Variant46104, - Variant46105, - Variant46106, - Variant46107, - Variant46108, - Variant46109, - Variant46110, - Variant46111, - Variant46112, - Variant46113, - Variant46114, - Variant46115, - Variant46116, - Variant46117, - Variant46118, - Variant46119, - Variant46120, - Variant46121, - Variant46122, - Variant46123, - Variant46124, - Variant46125, - Variant46126, - Variant46127, - Variant46128, - Variant46129, - Variant46130, - Variant46131, - Variant46132, - Variant46133, - Variant46134, - Variant46135, - Variant46136, - Variant46137, - Variant46138, - Variant46139, - Variant46140, - Variant46141, - Variant46142, - Variant46143, - Variant46144, - Variant46145, - Variant46146, - Variant46147, - Variant46148, - Variant46149, - Variant46150, - Variant46151, - Variant46152, - Variant46153, - Variant46154, - Variant46155, - Variant46156, - Variant46157, - Variant46158, - Variant46159, - Variant46160, - Variant46161, - Variant46162, - Variant46163, - Variant46164, - Variant46165, - Variant46166, - Variant46167, - Variant46168, - Variant46169, - Variant46170, - Variant46171, - Variant46172, - Variant46173, - Variant46174, - Variant46175, - Variant46176, - Variant46177, - Variant46178, - Variant46179, - Variant46180, - Variant46181, - Variant46182, - Variant46183, - Variant46184, - Variant46185, - Variant46186, - Variant46187, - Variant46188, - Variant46189, - Variant46190, - Variant46191, - Variant46192, - Variant46193, - Variant46194, - Variant46195, - Variant46196, - Variant46197, - Variant46198, - Variant46199, - Variant46200, - Variant46201, - Variant46202, - Variant46203, - Variant46204, - Variant46205, - Variant46206, - Variant46207, - Variant46208, - Variant46209, - Variant46210, - Variant46211, - Variant46212, - Variant46213, - Variant46214, - Variant46215, - Variant46216, - Variant46217, - Variant46218, - Variant46219, - Variant46220, - Variant46221, - Variant46222, - Variant46223, - Variant46224, - Variant46225, - Variant46226, - Variant46227, - Variant46228, - Variant46229, - Variant46230, - Variant46231, - Variant46232, - Variant46233, - Variant46234, - Variant46235, - Variant46236, - Variant46237, - Variant46238, - Variant46239, - Variant46240, - Variant46241, - Variant46242, - Variant46243, - Variant46244, - Variant46245, - Variant46246, - Variant46247, - Variant46248, - Variant46249, - Variant46250, - Variant46251, - Variant46252, - Variant46253, - Variant46254, - Variant46255, - Variant46256, - Variant46257, - Variant46258, - Variant46259, - Variant46260, - Variant46261, - Variant46262, - Variant46263, - Variant46264, - Variant46265, - Variant46266, - Variant46267, - Variant46268, - Variant46269, - Variant46270, - Variant46271, - Variant46272, - Variant46273, - Variant46274, - Variant46275, - Variant46276, - Variant46277, - Variant46278, - Variant46279, - Variant46280, - Variant46281, - Variant46282, - Variant46283, - Variant46284, - Variant46285, - Variant46286, - Variant46287, - Variant46288, - Variant46289, - Variant46290, - Variant46291, - Variant46292, - Variant46293, - Variant46294, - Variant46295, - Variant46296, - Variant46297, - Variant46298, - Variant46299, - Variant46300, - Variant46301, - Variant46302, - Variant46303, - Variant46304, - Variant46305, - Variant46306, - Variant46307, - Variant46308, - Variant46309, - Variant46310, - Variant46311, - Variant46312, - Variant46313, - Variant46314, - Variant46315, - Variant46316, - Variant46317, - Variant46318, - Variant46319, - Variant46320, - Variant46321, - Variant46322, - Variant46323, - Variant46324, - Variant46325, - Variant46326, - Variant46327, - Variant46328, - Variant46329, - Variant46330, - Variant46331, - Variant46332, - Variant46333, - Variant46334, - Variant46335, - Variant46336, - Variant46337, - Variant46338, - Variant46339, - Variant46340, - Variant46341, - Variant46342, - Variant46343, - Variant46344, - Variant46345, - Variant46346, - Variant46347, - Variant46348, - Variant46349, - Variant46350, - Variant46351, - Variant46352, - Variant46353, - Variant46354, - Variant46355, - Variant46356, - Variant46357, - Variant46358, - Variant46359, - Variant46360, - Variant46361, - Variant46362, - Variant46363, - Variant46364, - Variant46365, - Variant46366, - Variant46367, - Variant46368, - Variant46369, - Variant46370, - Variant46371, - Variant46372, - Variant46373, - Variant46374, - Variant46375, - Variant46376, - Variant46377, - Variant46378, - Variant46379, - Variant46380, - Variant46381, - Variant46382, - Variant46383, - Variant46384, - Variant46385, - Variant46386, - Variant46387, - Variant46388, - Variant46389, - Variant46390, - Variant46391, - Variant46392, - Variant46393, - Variant46394, - Variant46395, - Variant46396, - Variant46397, - Variant46398, - Variant46399, - Variant46400, - Variant46401, - Variant46402, - Variant46403, - Variant46404, - Variant46405, - Variant46406, - Variant46407, - Variant46408, - Variant46409, - Variant46410, - Variant46411, - Variant46412, - Variant46413, - Variant46414, - Variant46415, - Variant46416, - Variant46417, - Variant46418, - Variant46419, - Variant46420, - Variant46421, - Variant46422, - Variant46423, - Variant46424, - Variant46425, - Variant46426, - Variant46427, - Variant46428, - Variant46429, - Variant46430, - Variant46431, - Variant46432, - Variant46433, - Variant46434, - Variant46435, - Variant46436, - Variant46437, - Variant46438, - Variant46439, - Variant46440, - Variant46441, - Variant46442, - Variant46443, - Variant46444, - Variant46445, - Variant46446, - Variant46447, - Variant46448, - Variant46449, - Variant46450, - Variant46451, - Variant46452, - Variant46453, - Variant46454, - Variant46455, - Variant46456, - Variant46457, - Variant46458, - Variant46459, - Variant46460, - Variant46461, - Variant46462, - Variant46463, - Variant46464, - Variant46465, - Variant46466, - Variant46467, - Variant46468, - Variant46469, - Variant46470, - Variant46471, - Variant46472, - Variant46473, - Variant46474, - Variant46475, - Variant46476, - Variant46477, - Variant46478, - Variant46479, - Variant46480, - Variant46481, - Variant46482, - Variant46483, - Variant46484, - Variant46485, - Variant46486, - Variant46487, - Variant46488, - Variant46489, - Variant46490, - Variant46491, - Variant46492, - Variant46493, - Variant46494, - Variant46495, - Variant46496, - Variant46497, - Variant46498, - Variant46499, - Variant46500, - Variant46501, - Variant46502, - Variant46503, - Variant46504, - Variant46505, - Variant46506, - Variant46507, - Variant46508, - Variant46509, - Variant46510, - Variant46511, - Variant46512, - Variant46513, - Variant46514, - Variant46515, - Variant46516, - Variant46517, - Variant46518, - Variant46519, - Variant46520, - Variant46521, - Variant46522, - Variant46523, - Variant46524, - Variant46525, - Variant46526, - Variant46527, - Variant46528, - Variant46529, - Variant46530, - Variant46531, - Variant46532, - Variant46533, - Variant46534, - Variant46535, - Variant46536, - Variant46537, - Variant46538, - Variant46539, - Variant46540, - Variant46541, - Variant46542, - Variant46543, - Variant46544, - Variant46545, - Variant46546, - Variant46547, - Variant46548, - Variant46549, - Variant46550, - Variant46551, - Variant46552, - Variant46553, - Variant46554, - Variant46555, - Variant46556, - Variant46557, - Variant46558, - Variant46559, - Variant46560, - Variant46561, - Variant46562, - Variant46563, - Variant46564, - Variant46565, - Variant46566, - Variant46567, - Variant46568, - Variant46569, - Variant46570, - Variant46571, - Variant46572, - Variant46573, - Variant46574, - Variant46575, - Variant46576, - Variant46577, - Variant46578, - Variant46579, - Variant46580, - Variant46581, - Variant46582, - Variant46583, - Variant46584, - Variant46585, - Variant46586, - Variant46587, - Variant46588, - Variant46589, - Variant46590, - Variant46591, - Variant46592, - Variant46593, - Variant46594, - Variant46595, - Variant46596, - Variant46597, - Variant46598, - Variant46599, - Variant46600, - Variant46601, - Variant46602, - Variant46603, - Variant46604, - Variant46605, - Variant46606, - Variant46607, - Variant46608, - Variant46609, - Variant46610, - Variant46611, - Variant46612, - Variant46613, - Variant46614, - Variant46615, - Variant46616, - Variant46617, - Variant46618, - Variant46619, - Variant46620, - Variant46621, - Variant46622, - Variant46623, - Variant46624, - Variant46625, - Variant46626, - Variant46627, - Variant46628, - Variant46629, - Variant46630, - Variant46631, - Variant46632, - Variant46633, - Variant46634, - Variant46635, - Variant46636, - Variant46637, - Variant46638, - Variant46639, - Variant46640, - Variant46641, - Variant46642, - Variant46643, - Variant46644, - Variant46645, - Variant46646, - Variant46647, - Variant46648, - Variant46649, - Variant46650, - Variant46651, - Variant46652, - Variant46653, - Variant46654, - Variant46655, - Variant46656, - Variant46657, - Variant46658, - Variant46659, - Variant46660, - Variant46661, - Variant46662, - Variant46663, - Variant46664, - Variant46665, - Variant46666, - Variant46667, - Variant46668, - Variant46669, - Variant46670, - Variant46671, - Variant46672, - Variant46673, - Variant46674, - Variant46675, - Variant46676, - Variant46677, - Variant46678, - Variant46679, - Variant46680, - Variant46681, - Variant46682, - Variant46683, - Variant46684, - Variant46685, - Variant46686, - Variant46687, - Variant46688, - Variant46689, - Variant46690, - Variant46691, - Variant46692, - Variant46693, - Variant46694, - Variant46695, - Variant46696, - Variant46697, - Variant46698, - Variant46699, - Variant46700, - Variant46701, - Variant46702, - Variant46703, - Variant46704, - Variant46705, - Variant46706, - Variant46707, - Variant46708, - Variant46709, - Variant46710, - Variant46711, - Variant46712, - Variant46713, - Variant46714, - Variant46715, - Variant46716, - Variant46717, - Variant46718, - Variant46719, - Variant46720, - Variant46721, - Variant46722, - Variant46723, - Variant46724, - Variant46725, - Variant46726, - Variant46727, - Variant46728, - Variant46729, - Variant46730, - Variant46731, - Variant46732, - Variant46733, - Variant46734, - Variant46735, - Variant46736, - Variant46737, - Variant46738, - Variant46739, - Variant46740, - Variant46741, - Variant46742, - Variant46743, - Variant46744, - Variant46745, - Variant46746, - Variant46747, - Variant46748, - Variant46749, - Variant46750, - Variant46751, - Variant46752, - Variant46753, - Variant46754, - Variant46755, - Variant46756, - Variant46757, - Variant46758, - Variant46759, - Variant46760, - Variant46761, - Variant46762, - Variant46763, - Variant46764, - Variant46765, - Variant46766, - Variant46767, - Variant46768, - Variant46769, - Variant46770, - Variant46771, - Variant46772, - Variant46773, - Variant46774, - Variant46775, - Variant46776, - Variant46777, - Variant46778, - Variant46779, - Variant46780, - Variant46781, - Variant46782, - Variant46783, - Variant46784, - Variant46785, - Variant46786, - Variant46787, - Variant46788, - Variant46789, - Variant46790, - Variant46791, - Variant46792, - Variant46793, - Variant46794, - Variant46795, - Variant46796, - Variant46797, - Variant46798, - Variant46799, - Variant46800, - Variant46801, - Variant46802, - Variant46803, - Variant46804, - Variant46805, - Variant46806, - Variant46807, - Variant46808, - Variant46809, - Variant46810, - Variant46811, - Variant46812, - Variant46813, - Variant46814, - Variant46815, - Variant46816, - Variant46817, - Variant46818, - Variant46819, - Variant46820, - Variant46821, - Variant46822, - Variant46823, - Variant46824, - Variant46825, - Variant46826, - Variant46827, - Variant46828, - Variant46829, - Variant46830, - Variant46831, - Variant46832, - Variant46833, - Variant46834, - Variant46835, - Variant46836, - Variant46837, - Variant46838, - Variant46839, - Variant46840, - Variant46841, - Variant46842, - Variant46843, - Variant46844, - Variant46845, - Variant46846, - Variant46847, - Variant46848, - Variant46849, - Variant46850, - Variant46851, - Variant46852, - Variant46853, - Variant46854, - Variant46855, - Variant46856, - Variant46857, - Variant46858, - Variant46859, - Variant46860, - Variant46861, - Variant46862, - Variant46863, - Variant46864, - Variant46865, - Variant46866, - Variant46867, - Variant46868, - Variant46869, - Variant46870, - Variant46871, - Variant46872, - Variant46873, - Variant46874, - Variant46875, - Variant46876, - Variant46877, - Variant46878, - Variant46879, - Variant46880, - Variant46881, - Variant46882, - Variant46883, - Variant46884, - Variant46885, - Variant46886, - Variant46887, - Variant46888, - Variant46889, - Variant46890, - Variant46891, - Variant46892, - Variant46893, - Variant46894, - Variant46895, - Variant46896, - Variant46897, - Variant46898, - Variant46899, - Variant46900, - Variant46901, - Variant46902, - Variant46903, - Variant46904, - Variant46905, - Variant46906, - Variant46907, - Variant46908, - Variant46909, - Variant46910, - Variant46911, - Variant46912, - Variant46913, - Variant46914, - Variant46915, - Variant46916, - Variant46917, - Variant46918, - Variant46919, - Variant46920, - Variant46921, - Variant46922, - Variant46923, - Variant46924, - Variant46925, - Variant46926, - Variant46927, - Variant46928, - Variant46929, - Variant46930, - Variant46931, - Variant46932, - Variant46933, - Variant46934, - Variant46935, - Variant46936, - Variant46937, - Variant46938, - Variant46939, - Variant46940, - Variant46941, - Variant46942, - Variant46943, - Variant46944, - Variant46945, - Variant46946, - Variant46947, - Variant46948, - Variant46949, - Variant46950, - Variant46951, - Variant46952, - Variant46953, - Variant46954, - Variant46955, - Variant46956, - Variant46957, - Variant46958, - Variant46959, - Variant46960, - Variant46961, - Variant46962, - Variant46963, - Variant46964, - Variant46965, - Variant46966, - Variant46967, - Variant46968, - Variant46969, - Variant46970, - Variant46971, - Variant46972, - Variant46973, - Variant46974, - Variant46975, - Variant46976, - Variant46977, - Variant46978, - Variant46979, - Variant46980, - Variant46981, - Variant46982, - Variant46983, - Variant46984, - Variant46985, - Variant46986, - Variant46987, - Variant46988, - Variant46989, - Variant46990, - Variant46991, - Variant46992, - Variant46993, - Variant46994, - Variant46995, - Variant46996, - Variant46997, - Variant46998, - Variant46999, - Variant47000, - Variant47001, - Variant47002, - Variant47003, - Variant47004, - Variant47005, - Variant47006, - Variant47007, - Variant47008, - Variant47009, - Variant47010, - Variant47011, - Variant47012, - Variant47013, - Variant47014, - Variant47015, - Variant47016, - Variant47017, - Variant47018, - Variant47019, - Variant47020, - Variant47021, - Variant47022, - Variant47023, - Variant47024, - Variant47025, - Variant47026, - Variant47027, - Variant47028, - Variant47029, - Variant47030, - Variant47031, - Variant47032, - Variant47033, - Variant47034, - Variant47035, - Variant47036, - Variant47037, - Variant47038, - Variant47039, - Variant47040, - Variant47041, - Variant47042, - Variant47043, - Variant47044, - Variant47045, - Variant47046, - Variant47047, - Variant47048, - Variant47049, - Variant47050, - Variant47051, - Variant47052, - Variant47053, - Variant47054, - Variant47055, - Variant47056, - Variant47057, - Variant47058, - Variant47059, - Variant47060, - Variant47061, - Variant47062, - Variant47063, - Variant47064, - Variant47065, - Variant47066, - Variant47067, - Variant47068, - Variant47069, - Variant47070, - Variant47071, - Variant47072, - Variant47073, - Variant47074, - Variant47075, - Variant47076, - Variant47077, - Variant47078, - Variant47079, - Variant47080, - Variant47081, - Variant47082, - Variant47083, - Variant47084, - Variant47085, - Variant47086, - Variant47087, - Variant47088, - Variant47089, - Variant47090, - Variant47091, - Variant47092, - Variant47093, - Variant47094, - Variant47095, - Variant47096, - Variant47097, - Variant47098, - Variant47099, - Variant47100, - Variant47101, - Variant47102, - Variant47103, - Variant47104, - Variant47105, - Variant47106, - Variant47107, - Variant47108, - Variant47109, - Variant47110, - Variant47111, - Variant47112, - Variant47113, - Variant47114, - Variant47115, - Variant47116, - Variant47117, - Variant47118, - Variant47119, - Variant47120, - Variant47121, - Variant47122, - Variant47123, - Variant47124, - Variant47125, - Variant47126, - Variant47127, - Variant47128, - Variant47129, - Variant47130, - Variant47131, - Variant47132, - Variant47133, - Variant47134, - Variant47135, - Variant47136, - Variant47137, - Variant47138, - Variant47139, - Variant47140, - Variant47141, - Variant47142, - Variant47143, - Variant47144, - Variant47145, - Variant47146, - Variant47147, - Variant47148, - Variant47149, - Variant47150, - Variant47151, - Variant47152, - Variant47153, - Variant47154, - Variant47155, - Variant47156, - Variant47157, - Variant47158, - Variant47159, - Variant47160, - Variant47161, - Variant47162, - Variant47163, - Variant47164, - Variant47165, - Variant47166, - Variant47167, - Variant47168, - Variant47169, - Variant47170, - Variant47171, - Variant47172, - Variant47173, - Variant47174, - Variant47175, - Variant47176, - Variant47177, - Variant47178, - Variant47179, - Variant47180, - Variant47181, - Variant47182, - Variant47183, - Variant47184, - Variant47185, - Variant47186, - Variant47187, - Variant47188, - Variant47189, - Variant47190, - Variant47191, - Variant47192, - Variant47193, - Variant47194, - Variant47195, - Variant47196, - Variant47197, - Variant47198, - Variant47199, - Variant47200, - Variant47201, - Variant47202, - Variant47203, - Variant47204, - Variant47205, - Variant47206, - Variant47207, - Variant47208, - Variant47209, - Variant47210, - Variant47211, - Variant47212, - Variant47213, - Variant47214, - Variant47215, - Variant47216, - Variant47217, - Variant47218, - Variant47219, - Variant47220, - Variant47221, - Variant47222, - Variant47223, - Variant47224, - Variant47225, - Variant47226, - Variant47227, - Variant47228, - Variant47229, - Variant47230, - Variant47231, - Variant47232, - Variant47233, - Variant47234, - Variant47235, - Variant47236, - Variant47237, - Variant47238, - Variant47239, - Variant47240, - Variant47241, - Variant47242, - Variant47243, - Variant47244, - Variant47245, - Variant47246, - Variant47247, - Variant47248, - Variant47249, - Variant47250, - Variant47251, - Variant47252, - Variant47253, - Variant47254, - Variant47255, - Variant47256, - Variant47257, - Variant47258, - Variant47259, - Variant47260, - Variant47261, - Variant47262, - Variant47263, - Variant47264, - Variant47265, - Variant47266, - Variant47267, - Variant47268, - Variant47269, - Variant47270, - Variant47271, - Variant47272, - Variant47273, - Variant47274, - Variant47275, - Variant47276, - Variant47277, - Variant47278, - Variant47279, - Variant47280, - Variant47281, - Variant47282, - Variant47283, - Variant47284, - Variant47285, - Variant47286, - Variant47287, - Variant47288, - Variant47289, - Variant47290, - Variant47291, - Variant47292, - Variant47293, - Variant47294, - Variant47295, - Variant47296, - Variant47297, - Variant47298, - Variant47299, - Variant47300, - Variant47301, - Variant47302, - Variant47303, - Variant47304, - Variant47305, - Variant47306, - Variant47307, - Variant47308, - Variant47309, - Variant47310, - Variant47311, - Variant47312, - Variant47313, - Variant47314, - Variant47315, - Variant47316, - Variant47317, - Variant47318, - Variant47319, - Variant47320, - Variant47321, - Variant47322, - Variant47323, - Variant47324, - Variant47325, - Variant47326, - Variant47327, - Variant47328, - Variant47329, - Variant47330, - Variant47331, - Variant47332, - Variant47333, - Variant47334, - Variant47335, - Variant47336, - Variant47337, - Variant47338, - Variant47339, - Variant47340, - Variant47341, - Variant47342, - Variant47343, - Variant47344, - Variant47345, - Variant47346, - Variant47347, - Variant47348, - Variant47349, - Variant47350, - Variant47351, - Variant47352, - Variant47353, - Variant47354, - Variant47355, - Variant47356, - Variant47357, - Variant47358, - Variant47359, - Variant47360, - Variant47361, - Variant47362, - Variant47363, - Variant47364, - Variant47365, - Variant47366, - Variant47367, - Variant47368, - Variant47369, - Variant47370, - Variant47371, - Variant47372, - Variant47373, - Variant47374, - Variant47375, - Variant47376, - Variant47377, - Variant47378, - Variant47379, - Variant47380, - Variant47381, - Variant47382, - Variant47383, - Variant47384, - Variant47385, - Variant47386, - Variant47387, - Variant47388, - Variant47389, - Variant47390, - Variant47391, - Variant47392, - Variant47393, - Variant47394, - Variant47395, - Variant47396, - Variant47397, - Variant47398, - Variant47399, - Variant47400, - Variant47401, - Variant47402, - Variant47403, - Variant47404, - Variant47405, - Variant47406, - Variant47407, - Variant47408, - Variant47409, - Variant47410, - Variant47411, - Variant47412, - Variant47413, - Variant47414, - Variant47415, - Variant47416, - Variant47417, - Variant47418, - Variant47419, - Variant47420, - Variant47421, - Variant47422, - Variant47423, - Variant47424, - Variant47425, - Variant47426, - Variant47427, - Variant47428, - Variant47429, - Variant47430, - Variant47431, - Variant47432, - Variant47433, - Variant47434, - Variant47435, - Variant47436, - Variant47437, - Variant47438, - Variant47439, - Variant47440, - Variant47441, - Variant47442, - Variant47443, - Variant47444, - Variant47445, - Variant47446, - Variant47447, - Variant47448, - Variant47449, - Variant47450, - Variant47451, - Variant47452, - Variant47453, - Variant47454, - Variant47455, - Variant47456, - Variant47457, - Variant47458, - Variant47459, - Variant47460, - Variant47461, - Variant47462, - Variant47463, - Variant47464, - Variant47465, - Variant47466, - Variant47467, - Variant47468, - Variant47469, - Variant47470, - Variant47471, - Variant47472, - Variant47473, - Variant47474, - Variant47475, - Variant47476, - Variant47477, - Variant47478, - Variant47479, - Variant47480, - Variant47481, - Variant47482, - Variant47483, - Variant47484, - Variant47485, - Variant47486, - Variant47487, - Variant47488, - Variant47489, - Variant47490, - Variant47491, - Variant47492, - Variant47493, - Variant47494, - Variant47495, - Variant47496, - Variant47497, - Variant47498, - Variant47499, - Variant47500, - Variant47501, - Variant47502, - Variant47503, - Variant47504, - Variant47505, - Variant47506, - Variant47507, - Variant47508, - Variant47509, - Variant47510, - Variant47511, - Variant47512, - Variant47513, - Variant47514, - Variant47515, - Variant47516, - Variant47517, - Variant47518, - Variant47519, - Variant47520, - Variant47521, - Variant47522, - Variant47523, - Variant47524, - Variant47525, - Variant47526, - Variant47527, - Variant47528, - Variant47529, - Variant47530, - Variant47531, - Variant47532, - Variant47533, - Variant47534, - Variant47535, - Variant47536, - Variant47537, - Variant47538, - Variant47539, - Variant47540, - Variant47541, - Variant47542, - Variant47543, - Variant47544, - Variant47545, - Variant47546, - Variant47547, - Variant47548, - Variant47549, - Variant47550, - Variant47551, - Variant47552, - Variant47553, - Variant47554, - Variant47555, - Variant47556, - Variant47557, - Variant47558, - Variant47559, - Variant47560, - Variant47561, - Variant47562, - Variant47563, - Variant47564, - Variant47565, - Variant47566, - Variant47567, - Variant47568, - Variant47569, - Variant47570, - Variant47571, - Variant47572, - Variant47573, - Variant47574, - Variant47575, - Variant47576, - Variant47577, - Variant47578, - Variant47579, - Variant47580, - Variant47581, - Variant47582, - Variant47583, - Variant47584, - Variant47585, - Variant47586, - Variant47587, - Variant47588, - Variant47589, - Variant47590, - Variant47591, - Variant47592, - Variant47593, - Variant47594, - Variant47595, - Variant47596, - Variant47597, - Variant47598, - Variant47599, - Variant47600, - Variant47601, - Variant47602, - Variant47603, - Variant47604, - Variant47605, - Variant47606, - Variant47607, - Variant47608, - Variant47609, - Variant47610, - Variant47611, - Variant47612, - Variant47613, - Variant47614, - Variant47615, - Variant47616, - Variant47617, - Variant47618, - Variant47619, - Variant47620, - Variant47621, - Variant47622, - Variant47623, - Variant47624, - Variant47625, - Variant47626, - Variant47627, - Variant47628, - Variant47629, - Variant47630, - Variant47631, - Variant47632, - Variant47633, - Variant47634, - Variant47635, - Variant47636, - Variant47637, - Variant47638, - Variant47639, - Variant47640, - Variant47641, - Variant47642, - Variant47643, - Variant47644, - Variant47645, - Variant47646, - Variant47647, - Variant47648, - Variant47649, - Variant47650, - Variant47651, - Variant47652, - Variant47653, - Variant47654, - Variant47655, - Variant47656, - Variant47657, - Variant47658, - Variant47659, - Variant47660, - Variant47661, - Variant47662, - Variant47663, - Variant47664, - Variant47665, - Variant47666, - Variant47667, - Variant47668, - Variant47669, - Variant47670, - Variant47671, - Variant47672, - Variant47673, - Variant47674, - Variant47675, - Variant47676, - Variant47677, - Variant47678, - Variant47679, - Variant47680, - Variant47681, - Variant47682, - Variant47683, - Variant47684, - Variant47685, - Variant47686, - Variant47687, - Variant47688, - Variant47689, - Variant47690, - Variant47691, - Variant47692, - Variant47693, - Variant47694, - Variant47695, - Variant47696, - Variant47697, - Variant47698, - Variant47699, - Variant47700, - Variant47701, - Variant47702, - Variant47703, - Variant47704, - Variant47705, - Variant47706, - Variant47707, - Variant47708, - Variant47709, - Variant47710, - Variant47711, - Variant47712, - Variant47713, - Variant47714, - Variant47715, - Variant47716, - Variant47717, - Variant47718, - Variant47719, - Variant47720, - Variant47721, - Variant47722, - Variant47723, - Variant47724, - Variant47725, - Variant47726, - Variant47727, - Variant47728, - Variant47729, - Variant47730, - Variant47731, - Variant47732, - Variant47733, - Variant47734, - Variant47735, - Variant47736, - Variant47737, - Variant47738, - Variant47739, - Variant47740, - Variant47741, - Variant47742, - Variant47743, - Variant47744, - Variant47745, - Variant47746, - Variant47747, - Variant47748, - Variant47749, - Variant47750, - Variant47751, - Variant47752, - Variant47753, - Variant47754, - Variant47755, - Variant47756, - Variant47757, - Variant47758, - Variant47759, - Variant47760, - Variant47761, - Variant47762, - Variant47763, - Variant47764, - Variant47765, - Variant47766, - Variant47767, - Variant47768, - Variant47769, - Variant47770, - Variant47771, - Variant47772, - Variant47773, - Variant47774, - Variant47775, - Variant47776, - Variant47777, - Variant47778, - Variant47779, - Variant47780, - Variant47781, - Variant47782, - Variant47783, - Variant47784, - Variant47785, - Variant47786, - Variant47787, - Variant47788, - Variant47789, - Variant47790, - Variant47791, - Variant47792, - Variant47793, - Variant47794, - Variant47795, - Variant47796, - Variant47797, - Variant47798, - Variant47799, - Variant47800, - Variant47801, - Variant47802, - Variant47803, - Variant47804, - Variant47805, - Variant47806, - Variant47807, - Variant47808, - Variant47809, - Variant47810, - Variant47811, - Variant47812, - Variant47813, - Variant47814, - Variant47815, - Variant47816, - Variant47817, - Variant47818, - Variant47819, - Variant47820, - Variant47821, - Variant47822, - Variant47823, - Variant47824, - Variant47825, - Variant47826, - Variant47827, - Variant47828, - Variant47829, - Variant47830, - Variant47831, - Variant47832, - Variant47833, - Variant47834, - Variant47835, - Variant47836, - Variant47837, - Variant47838, - Variant47839, - Variant47840, - Variant47841, - Variant47842, - Variant47843, - Variant47844, - Variant47845, - Variant47846, - Variant47847, - Variant47848, - Variant47849, - Variant47850, - Variant47851, - Variant47852, - Variant47853, - Variant47854, - Variant47855, - Variant47856, - Variant47857, - Variant47858, - Variant47859, - Variant47860, - Variant47861, - Variant47862, - Variant47863, - Variant47864, - Variant47865, - Variant47866, - Variant47867, - Variant47868, - Variant47869, - Variant47870, - Variant47871, - Variant47872, - Variant47873, - Variant47874, - Variant47875, - Variant47876, - Variant47877, - Variant47878, - Variant47879, - Variant47880, - Variant47881, - Variant47882, - Variant47883, - Variant47884, - Variant47885, - Variant47886, - Variant47887, - Variant47888, - Variant47889, - Variant47890, - Variant47891, - Variant47892, - Variant47893, - Variant47894, - Variant47895, - Variant47896, - Variant47897, - Variant47898, - Variant47899, - Variant47900, - Variant47901, - Variant47902, - Variant47903, - Variant47904, - Variant47905, - Variant47906, - Variant47907, - Variant47908, - Variant47909, - Variant47910, - Variant47911, - Variant47912, - Variant47913, - Variant47914, - Variant47915, - Variant47916, - Variant47917, - Variant47918, - Variant47919, - Variant47920, - Variant47921, - Variant47922, - Variant47923, - Variant47924, - Variant47925, - Variant47926, - Variant47927, - Variant47928, - Variant47929, - Variant47930, - Variant47931, - Variant47932, - Variant47933, - Variant47934, - Variant47935, - Variant47936, - Variant47937, - Variant47938, - Variant47939, - Variant47940, - Variant47941, - Variant47942, - Variant47943, - Variant47944, - Variant47945, - Variant47946, - Variant47947, - Variant47948, - Variant47949, - Variant47950, - Variant47951, - Variant47952, - Variant47953, - Variant47954, - Variant47955, - Variant47956, - Variant47957, - Variant47958, - Variant47959, - Variant47960, - Variant47961, - Variant47962, - Variant47963, - Variant47964, - Variant47965, - Variant47966, - Variant47967, - Variant47968, - Variant47969, - Variant47970, - Variant47971, - Variant47972, - Variant47973, - Variant47974, - Variant47975, - Variant47976, - Variant47977, - Variant47978, - Variant47979, - Variant47980, - Variant47981, - Variant47982, - Variant47983, - Variant47984, - Variant47985, - Variant47986, - Variant47987, - Variant47988, - Variant47989, - Variant47990, - Variant47991, - Variant47992, - Variant47993, - Variant47994, - Variant47995, - Variant47996, - Variant47997, - Variant47998, - Variant47999, - Variant48000, - Variant48001, - Variant48002, - Variant48003, - Variant48004, - Variant48005, - Variant48006, - Variant48007, - Variant48008, - Variant48009, - Variant48010, - Variant48011, - Variant48012, - Variant48013, - Variant48014, - Variant48015, - Variant48016, - Variant48017, - Variant48018, - Variant48019, - Variant48020, - Variant48021, - Variant48022, - Variant48023, - Variant48024, - Variant48025, - Variant48026, - Variant48027, - Variant48028, - Variant48029, - Variant48030, - Variant48031, - Variant48032, - Variant48033, - Variant48034, - Variant48035, - Variant48036, - Variant48037, - Variant48038, - Variant48039, - Variant48040, - Variant48041, - Variant48042, - Variant48043, - Variant48044, - Variant48045, - Variant48046, - Variant48047, - Variant48048, - Variant48049, - Variant48050, - Variant48051, - Variant48052, - Variant48053, - Variant48054, - Variant48055, - Variant48056, - Variant48057, - Variant48058, - Variant48059, - Variant48060, - Variant48061, - Variant48062, - Variant48063, - Variant48064, - Variant48065, - Variant48066, - Variant48067, - Variant48068, - Variant48069, - Variant48070, - Variant48071, - Variant48072, - Variant48073, - Variant48074, - Variant48075, - Variant48076, - Variant48077, - Variant48078, - Variant48079, - Variant48080, - Variant48081, - Variant48082, - Variant48083, - Variant48084, - Variant48085, - Variant48086, - Variant48087, - Variant48088, - Variant48089, - Variant48090, - Variant48091, - Variant48092, - Variant48093, - Variant48094, - Variant48095, - Variant48096, - Variant48097, - Variant48098, - Variant48099, - Variant48100, - Variant48101, - Variant48102, - Variant48103, - Variant48104, - Variant48105, - Variant48106, - Variant48107, - Variant48108, - Variant48109, - Variant48110, - Variant48111, - Variant48112, - Variant48113, - Variant48114, - Variant48115, - Variant48116, - Variant48117, - Variant48118, - Variant48119, - Variant48120, - Variant48121, - Variant48122, - Variant48123, - Variant48124, - Variant48125, - Variant48126, - Variant48127, - Variant48128, - Variant48129, - Variant48130, - Variant48131, - Variant48132, - Variant48133, - Variant48134, - Variant48135, - Variant48136, - Variant48137, - Variant48138, - Variant48139, - Variant48140, - Variant48141, - Variant48142, - Variant48143, - Variant48144, - Variant48145, - Variant48146, - Variant48147, - Variant48148, - Variant48149, - Variant48150, - Variant48151, - Variant48152, - Variant48153, - Variant48154, - Variant48155, - Variant48156, - Variant48157, - Variant48158, - Variant48159, - Variant48160, - Variant48161, - Variant48162, - Variant48163, - Variant48164, - Variant48165, - Variant48166, - Variant48167, - Variant48168, - Variant48169, - Variant48170, - Variant48171, - Variant48172, - Variant48173, - Variant48174, - Variant48175, - Variant48176, - Variant48177, - Variant48178, - Variant48179, - Variant48180, - Variant48181, - Variant48182, - Variant48183, - Variant48184, - Variant48185, - Variant48186, - Variant48187, - Variant48188, - Variant48189, - Variant48190, - Variant48191, - Variant48192, - Variant48193, - Variant48194, - Variant48195, - Variant48196, - Variant48197, - Variant48198, - Variant48199, - Variant48200, - Variant48201, - Variant48202, - Variant48203, - Variant48204, - Variant48205, - Variant48206, - Variant48207, - Variant48208, - Variant48209, - Variant48210, - Variant48211, - Variant48212, - Variant48213, - Variant48214, - Variant48215, - Variant48216, - Variant48217, - Variant48218, - Variant48219, - Variant48220, - Variant48221, - Variant48222, - Variant48223, - Variant48224, - Variant48225, - Variant48226, - Variant48227, - Variant48228, - Variant48229, - Variant48230, - Variant48231, - Variant48232, - Variant48233, - Variant48234, - Variant48235, - Variant48236, - Variant48237, - Variant48238, - Variant48239, - Variant48240, - Variant48241, - Variant48242, - Variant48243, - Variant48244, - Variant48245, - Variant48246, - Variant48247, - Variant48248, - Variant48249, - Variant48250, - Variant48251, - Variant48252, - Variant48253, - Variant48254, - Variant48255, - Variant48256, - Variant48257, - Variant48258, - Variant48259, - Variant48260, - Variant48261, - Variant48262, - Variant48263, - Variant48264, - Variant48265, - Variant48266, - Variant48267, - Variant48268, - Variant48269, - Variant48270, - Variant48271, - Variant48272, - Variant48273, - Variant48274, - Variant48275, - Variant48276, - Variant48277, - Variant48278, - Variant48279, - Variant48280, - Variant48281, - Variant48282, - Variant48283, - Variant48284, - Variant48285, - Variant48286, - Variant48287, - Variant48288, - Variant48289, - Variant48290, - Variant48291, - Variant48292, - Variant48293, - Variant48294, - Variant48295, - Variant48296, - Variant48297, - Variant48298, - Variant48299, - Variant48300, - Variant48301, - Variant48302, - Variant48303, - Variant48304, - Variant48305, - Variant48306, - Variant48307, - Variant48308, - Variant48309, - Variant48310, - Variant48311, - Variant48312, - Variant48313, - Variant48314, - Variant48315, - Variant48316, - Variant48317, - Variant48318, - Variant48319, - Variant48320, - Variant48321, - Variant48322, - Variant48323, - Variant48324, - Variant48325, - Variant48326, - Variant48327, - Variant48328, - Variant48329, - Variant48330, - Variant48331, - Variant48332, - Variant48333, - Variant48334, - Variant48335, - Variant48336, - Variant48337, - Variant48338, - Variant48339, - Variant48340, - Variant48341, - Variant48342, - Variant48343, - Variant48344, - Variant48345, - Variant48346, - Variant48347, - Variant48348, - Variant48349, - Variant48350, - Variant48351, - Variant48352, - Variant48353, - Variant48354, - Variant48355, - Variant48356, - Variant48357, - Variant48358, - Variant48359, - Variant48360, - Variant48361, - Variant48362, - Variant48363, - Variant48364, - Variant48365, - Variant48366, - Variant48367, - Variant48368, - Variant48369, - Variant48370, - Variant48371, - Variant48372, - Variant48373, - Variant48374, - Variant48375, - Variant48376, - Variant48377, - Variant48378, - Variant48379, - Variant48380, - Variant48381, - Variant48382, - Variant48383, - Variant48384, - Variant48385, - Variant48386, - Variant48387, - Variant48388, - Variant48389, - Variant48390, - Variant48391, - Variant48392, - Variant48393, - Variant48394, - Variant48395, - Variant48396, - Variant48397, - Variant48398, - Variant48399, - Variant48400, - Variant48401, - Variant48402, - Variant48403, - Variant48404, - Variant48405, - Variant48406, - Variant48407, - Variant48408, - Variant48409, - Variant48410, - Variant48411, - Variant48412, - Variant48413, - Variant48414, - Variant48415, - Variant48416, - Variant48417, - Variant48418, - Variant48419, - Variant48420, - Variant48421, - Variant48422, - Variant48423, - Variant48424, - Variant48425, - Variant48426, - Variant48427, - Variant48428, - Variant48429, - Variant48430, - Variant48431, - Variant48432, - Variant48433, - Variant48434, - Variant48435, - Variant48436, - Variant48437, - Variant48438, - Variant48439, - Variant48440, - Variant48441, - Variant48442, - Variant48443, - Variant48444, - Variant48445, - Variant48446, - Variant48447, - Variant48448, - Variant48449, - Variant48450, - Variant48451, - Variant48452, - Variant48453, - Variant48454, - Variant48455, - Variant48456, - Variant48457, - Variant48458, - Variant48459, - Variant48460, - Variant48461, - Variant48462, - Variant48463, - Variant48464, - Variant48465, - Variant48466, - Variant48467, - Variant48468, - Variant48469, - Variant48470, - Variant48471, - Variant48472, - Variant48473, - Variant48474, - Variant48475, - Variant48476, - Variant48477, - Variant48478, - Variant48479, - Variant48480, - Variant48481, - Variant48482, - Variant48483, - Variant48484, - Variant48485, - Variant48486, - Variant48487, - Variant48488, - Variant48489, - Variant48490, - Variant48491, - Variant48492, - Variant48493, - Variant48494, - Variant48495, - Variant48496, - Variant48497, - Variant48498, - Variant48499, - Variant48500, - Variant48501, - Variant48502, - Variant48503, - Variant48504, - Variant48505, - Variant48506, - Variant48507, - Variant48508, - Variant48509, - Variant48510, - Variant48511, - Variant48512, - Variant48513, - Variant48514, - Variant48515, - Variant48516, - Variant48517, - Variant48518, - Variant48519, - Variant48520, - Variant48521, - Variant48522, - Variant48523, - Variant48524, - Variant48525, - Variant48526, - Variant48527, - Variant48528, - Variant48529, - Variant48530, - Variant48531, - Variant48532, - Variant48533, - Variant48534, - Variant48535, - Variant48536, - Variant48537, - Variant48538, - Variant48539, - Variant48540, - Variant48541, - Variant48542, - Variant48543, - Variant48544, - Variant48545, - Variant48546, - Variant48547, - Variant48548, - Variant48549, - Variant48550, - Variant48551, - Variant48552, - Variant48553, - Variant48554, - Variant48555, - Variant48556, - Variant48557, - Variant48558, - Variant48559, - Variant48560, - Variant48561, - Variant48562, - Variant48563, - Variant48564, - Variant48565, - Variant48566, - Variant48567, - Variant48568, - Variant48569, - Variant48570, - Variant48571, - Variant48572, - Variant48573, - Variant48574, - Variant48575, - Variant48576, - Variant48577, - Variant48578, - Variant48579, - Variant48580, - Variant48581, - Variant48582, - Variant48583, - Variant48584, - Variant48585, - Variant48586, - Variant48587, - Variant48588, - Variant48589, - Variant48590, - Variant48591, - Variant48592, - Variant48593, - Variant48594, - Variant48595, - Variant48596, - Variant48597, - Variant48598, - Variant48599, - Variant48600, - Variant48601, - Variant48602, - Variant48603, - Variant48604, - Variant48605, - Variant48606, - Variant48607, - Variant48608, - Variant48609, - Variant48610, - Variant48611, - Variant48612, - Variant48613, - Variant48614, - Variant48615, - Variant48616, - Variant48617, - Variant48618, - Variant48619, - Variant48620, - Variant48621, - Variant48622, - Variant48623, - Variant48624, - Variant48625, - Variant48626, - Variant48627, - Variant48628, - Variant48629, - Variant48630, - Variant48631, - Variant48632, - Variant48633, - Variant48634, - Variant48635, - Variant48636, - Variant48637, - Variant48638, - Variant48639, - Variant48640, - Variant48641, - Variant48642, - Variant48643, - Variant48644, - Variant48645, - Variant48646, - Variant48647, - Variant48648, - Variant48649, - Variant48650, - Variant48651, - Variant48652, - Variant48653, - Variant48654, - Variant48655, - Variant48656, - Variant48657, - Variant48658, - Variant48659, - Variant48660, - Variant48661, - Variant48662, - Variant48663, - Variant48664, - Variant48665, - Variant48666, - Variant48667, - Variant48668, - Variant48669, - Variant48670, - Variant48671, - Variant48672, - Variant48673, - Variant48674, - Variant48675, - Variant48676, - Variant48677, - Variant48678, - Variant48679, - Variant48680, - Variant48681, - Variant48682, - Variant48683, - Variant48684, - Variant48685, - Variant48686, - Variant48687, - Variant48688, - Variant48689, - Variant48690, - Variant48691, - Variant48692, - Variant48693, - Variant48694, - Variant48695, - Variant48696, - Variant48697, - Variant48698, - Variant48699, - Variant48700, - Variant48701, - Variant48702, - Variant48703, - Variant48704, - Variant48705, - Variant48706, - Variant48707, - Variant48708, - Variant48709, - Variant48710, - Variant48711, - Variant48712, - Variant48713, - Variant48714, - Variant48715, - Variant48716, - Variant48717, - Variant48718, - Variant48719, - Variant48720, - Variant48721, - Variant48722, - Variant48723, - Variant48724, - Variant48725, - Variant48726, - Variant48727, - Variant48728, - Variant48729, - Variant48730, - Variant48731, - Variant48732, - Variant48733, - Variant48734, - Variant48735, - Variant48736, - Variant48737, - Variant48738, - Variant48739, - Variant48740, - Variant48741, - Variant48742, - Variant48743, - Variant48744, - Variant48745, - Variant48746, - Variant48747, - Variant48748, - Variant48749, - Variant48750, - Variant48751, - Variant48752, - Variant48753, - Variant48754, - Variant48755, - Variant48756, - Variant48757, - Variant48758, - Variant48759, - Variant48760, - Variant48761, - Variant48762, - Variant48763, - Variant48764, - Variant48765, - Variant48766, - Variant48767, - Variant48768, - Variant48769, - Variant48770, - Variant48771, - Variant48772, - Variant48773, - Variant48774, - Variant48775, - Variant48776, - Variant48777, - Variant48778, - Variant48779, - Variant48780, - Variant48781, - Variant48782, - Variant48783, - Variant48784, - Variant48785, - Variant48786, - Variant48787, - Variant48788, - Variant48789, - Variant48790, - Variant48791, - Variant48792, - Variant48793, - Variant48794, - Variant48795, - Variant48796, - Variant48797, - Variant48798, - Variant48799, - Variant48800, - Variant48801, - Variant48802, - Variant48803, - Variant48804, - Variant48805, - Variant48806, - Variant48807, - Variant48808, - Variant48809, - Variant48810, - Variant48811, - Variant48812, - Variant48813, - Variant48814, - Variant48815, - Variant48816, - Variant48817, - Variant48818, - Variant48819, - Variant48820, - Variant48821, - Variant48822, - Variant48823, - Variant48824, - Variant48825, - Variant48826, - Variant48827, - Variant48828, - Variant48829, - Variant48830, - Variant48831, - Variant48832, - Variant48833, - Variant48834, - Variant48835, - Variant48836, - Variant48837, - Variant48838, - Variant48839, - Variant48840, - Variant48841, - Variant48842, - Variant48843, - Variant48844, - Variant48845, - Variant48846, - Variant48847, - Variant48848, - Variant48849, - Variant48850, - Variant48851, - Variant48852, - Variant48853, - Variant48854, - Variant48855, - Variant48856, - Variant48857, - Variant48858, - Variant48859, - Variant48860, - Variant48861, - Variant48862, - Variant48863, - Variant48864, - Variant48865, - Variant48866, - Variant48867, - Variant48868, - Variant48869, - Variant48870, - Variant48871, - Variant48872, - Variant48873, - Variant48874, - Variant48875, - Variant48876, - Variant48877, - Variant48878, - Variant48879, - Variant48880, - Variant48881, - Variant48882, - Variant48883, - Variant48884, - Variant48885, - Variant48886, - Variant48887, - Variant48888, - Variant48889, - Variant48890, - Variant48891, - Variant48892, - Variant48893, - Variant48894, - Variant48895, - Variant48896, - Variant48897, - Variant48898, - Variant48899, - Variant48900, - Variant48901, - Variant48902, - Variant48903, - Variant48904, - Variant48905, - Variant48906, - Variant48907, - Variant48908, - Variant48909, - Variant48910, - Variant48911, - Variant48912, - Variant48913, - Variant48914, - Variant48915, - Variant48916, - Variant48917, - Variant48918, - Variant48919, - Variant48920, - Variant48921, - Variant48922, - Variant48923, - Variant48924, - Variant48925, - Variant48926, - Variant48927, - Variant48928, - Variant48929, - Variant48930, - Variant48931, - Variant48932, - Variant48933, - Variant48934, - Variant48935, - Variant48936, - Variant48937, - Variant48938, - Variant48939, - Variant48940, - Variant48941, - Variant48942, - Variant48943, - Variant48944, - Variant48945, - Variant48946, - Variant48947, - Variant48948, - Variant48949, - Variant48950, - Variant48951, - Variant48952, - Variant48953, - Variant48954, - Variant48955, - Variant48956, - Variant48957, - Variant48958, - Variant48959, - Variant48960, - Variant48961, - Variant48962, - Variant48963, - Variant48964, - Variant48965, - Variant48966, - Variant48967, - Variant48968, - Variant48969, - Variant48970, - Variant48971, - Variant48972, - Variant48973, - Variant48974, - Variant48975, - Variant48976, - Variant48977, - Variant48978, - Variant48979, - Variant48980, - Variant48981, - Variant48982, - Variant48983, - Variant48984, - Variant48985, - Variant48986, - Variant48987, - Variant48988, - Variant48989, - Variant48990, - Variant48991, - Variant48992, - Variant48993, - Variant48994, - Variant48995, - Variant48996, - Variant48997, - Variant48998, - Variant48999, - Variant49000, - Variant49001, - Variant49002, - Variant49003, - Variant49004, - Variant49005, - Variant49006, - Variant49007, - Variant49008, - Variant49009, - Variant49010, - Variant49011, - Variant49012, - Variant49013, - Variant49014, - Variant49015, - Variant49016, - Variant49017, - Variant49018, - Variant49019, - Variant49020, - Variant49021, - Variant49022, - Variant49023, - Variant49024, - Variant49025, - Variant49026, - Variant49027, - Variant49028, - Variant49029, - Variant49030, - Variant49031, - Variant49032, - Variant49033, - Variant49034, - Variant49035, - Variant49036, - Variant49037, - Variant49038, - Variant49039, - Variant49040, - Variant49041, - Variant49042, - Variant49043, - Variant49044, - Variant49045, - Variant49046, - Variant49047, - Variant49048, - Variant49049, - Variant49050, - Variant49051, - Variant49052, - Variant49053, - Variant49054, - Variant49055, - Variant49056, - Variant49057, - Variant49058, - Variant49059, - Variant49060, - Variant49061, - Variant49062, - Variant49063, - Variant49064, - Variant49065, - Variant49066, - Variant49067, - Variant49068, - Variant49069, - Variant49070, - Variant49071, - Variant49072, - Variant49073, - Variant49074, - Variant49075, - Variant49076, - Variant49077, - Variant49078, - Variant49079, - Variant49080, - Variant49081, - Variant49082, - Variant49083, - Variant49084, - Variant49085, - Variant49086, - Variant49087, - Variant49088, - Variant49089, - Variant49090, - Variant49091, - Variant49092, - Variant49093, - Variant49094, - Variant49095, - Variant49096, - Variant49097, - Variant49098, - Variant49099, - Variant49100, - Variant49101, - Variant49102, - Variant49103, - Variant49104, - Variant49105, - Variant49106, - Variant49107, - Variant49108, - Variant49109, - Variant49110, - Variant49111, - Variant49112, - Variant49113, - Variant49114, - Variant49115, - Variant49116, - Variant49117, - Variant49118, - Variant49119, - Variant49120, - Variant49121, - Variant49122, - Variant49123, - Variant49124, - Variant49125, - Variant49126, - Variant49127, - Variant49128, - Variant49129, - Variant49130, - Variant49131, - Variant49132, - Variant49133, - Variant49134, - Variant49135, - Variant49136, - Variant49137, - Variant49138, - Variant49139, - Variant49140, - Variant49141, - Variant49142, - Variant49143, - Variant49144, - Variant49145, - Variant49146, - Variant49147, - Variant49148, - Variant49149, - Variant49150, - Variant49151, - Variant49152, - Variant49153, - Variant49154, - Variant49155, - Variant49156, - Variant49157, - Variant49158, - Variant49159, - Variant49160, - Variant49161, - Variant49162, - Variant49163, - Variant49164, - Variant49165, - Variant49166, - Variant49167, - Variant49168, - Variant49169, - Variant49170, - Variant49171, - Variant49172, - Variant49173, - Variant49174, - Variant49175, - Variant49176, - Variant49177, - Variant49178, - Variant49179, - Variant49180, - Variant49181, - Variant49182, - Variant49183, - Variant49184, - Variant49185, - Variant49186, - Variant49187, - Variant49188, - Variant49189, - Variant49190, - Variant49191, - Variant49192, - Variant49193, - Variant49194, - Variant49195, - Variant49196, - Variant49197, - Variant49198, - Variant49199, - Variant49200, - Variant49201, - Variant49202, - Variant49203, - Variant49204, - Variant49205, - Variant49206, - Variant49207, - Variant49208, - Variant49209, - Variant49210, - Variant49211, - Variant49212, - Variant49213, - Variant49214, - Variant49215, - Variant49216, - Variant49217, - Variant49218, - Variant49219, - Variant49220, - Variant49221, - Variant49222, - Variant49223, - Variant49224, - Variant49225, - Variant49226, - Variant49227, - Variant49228, - Variant49229, - Variant49230, - Variant49231, - Variant49232, - Variant49233, - Variant49234, - Variant49235, - Variant49236, - Variant49237, - Variant49238, - Variant49239, - Variant49240, - Variant49241, - Variant49242, - Variant49243, - Variant49244, - Variant49245, - Variant49246, - Variant49247, - Variant49248, - Variant49249, - Variant49250, - Variant49251, - Variant49252, - Variant49253, - Variant49254, - Variant49255, - Variant49256, - Variant49257, - Variant49258, - Variant49259, - Variant49260, - Variant49261, - Variant49262, - Variant49263, - Variant49264, - Variant49265, - Variant49266, - Variant49267, - Variant49268, - Variant49269, - Variant49270, - Variant49271, - Variant49272, - Variant49273, - Variant49274, - Variant49275, - Variant49276, - Variant49277, - Variant49278, - Variant49279, - Variant49280, - Variant49281, - Variant49282, - Variant49283, - Variant49284, - Variant49285, - Variant49286, - Variant49287, - Variant49288, - Variant49289, - Variant49290, - Variant49291, - Variant49292, - Variant49293, - Variant49294, - Variant49295, - Variant49296, - Variant49297, - Variant49298, - Variant49299, - Variant49300, - Variant49301, - Variant49302, - Variant49303, - Variant49304, - Variant49305, - Variant49306, - Variant49307, - Variant49308, - Variant49309, - Variant49310, - Variant49311, - Variant49312, - Variant49313, - Variant49314, - Variant49315, - Variant49316, - Variant49317, - Variant49318, - Variant49319, - Variant49320, - Variant49321, - Variant49322, - Variant49323, - Variant49324, - Variant49325, - Variant49326, - Variant49327, - Variant49328, - Variant49329, - Variant49330, - Variant49331, - Variant49332, - Variant49333, - Variant49334, - Variant49335, - Variant49336, - Variant49337, - Variant49338, - Variant49339, - Variant49340, - Variant49341, - Variant49342, - Variant49343, - Variant49344, - Variant49345, - Variant49346, - Variant49347, - Variant49348, - Variant49349, - Variant49350, - Variant49351, - Variant49352, - Variant49353, - Variant49354, - Variant49355, - Variant49356, - Variant49357, - Variant49358, - Variant49359, - Variant49360, - Variant49361, - Variant49362, - Variant49363, - Variant49364, - Variant49365, - Variant49366, - Variant49367, - Variant49368, - Variant49369, - Variant49370, - Variant49371, - Variant49372, - Variant49373, - Variant49374, - Variant49375, - Variant49376, - Variant49377, - Variant49378, - Variant49379, - Variant49380, - Variant49381, - Variant49382, - Variant49383, - Variant49384, - Variant49385, - Variant49386, - Variant49387, - Variant49388, - Variant49389, - Variant49390, - Variant49391, - Variant49392, - Variant49393, - Variant49394, - Variant49395, - Variant49396, - Variant49397, - Variant49398, - Variant49399, - Variant49400, - Variant49401, - Variant49402, - Variant49403, - Variant49404, - Variant49405, - Variant49406, - Variant49407, - Variant49408, - Variant49409, - Variant49410, - Variant49411, - Variant49412, - Variant49413, - Variant49414, - Variant49415, - Variant49416, - Variant49417, - Variant49418, - Variant49419, - Variant49420, - Variant49421, - Variant49422, - Variant49423, - Variant49424, - Variant49425, - Variant49426, - Variant49427, - Variant49428, - Variant49429, - Variant49430, - Variant49431, - Variant49432, - Variant49433, - Variant49434, - Variant49435, - Variant49436, - Variant49437, - Variant49438, - Variant49439, - Variant49440, - Variant49441, - Variant49442, - Variant49443, - Variant49444, - Variant49445, - Variant49446, - Variant49447, - Variant49448, - Variant49449, - Variant49450, - Variant49451, - Variant49452, - Variant49453, - Variant49454, - Variant49455, - Variant49456, - Variant49457, - Variant49458, - Variant49459, - Variant49460, - Variant49461, - Variant49462, - Variant49463, - Variant49464, - Variant49465, - Variant49466, - Variant49467, - Variant49468, - Variant49469, - Variant49470, - Variant49471, - Variant49472, - Variant49473, - Variant49474, - Variant49475, - Variant49476, - Variant49477, - Variant49478, - Variant49479, - Variant49480, - Variant49481, - Variant49482, - Variant49483, - Variant49484, - Variant49485, - Variant49486, - Variant49487, - Variant49488, - Variant49489, - Variant49490, - Variant49491, - Variant49492, - Variant49493, - Variant49494, - Variant49495, - Variant49496, - Variant49497, - Variant49498, - Variant49499, - Variant49500, - Variant49501, - Variant49502, - Variant49503, - Variant49504, - Variant49505, - Variant49506, - Variant49507, - Variant49508, - Variant49509, - Variant49510, - Variant49511, - Variant49512, - Variant49513, - Variant49514, - Variant49515, - Variant49516, - Variant49517, - Variant49518, - Variant49519, - Variant49520, - Variant49521, - Variant49522, - Variant49523, - Variant49524, - Variant49525, - Variant49526, - Variant49527, - Variant49528, - Variant49529, - Variant49530, - Variant49531, - Variant49532, - Variant49533, - Variant49534, - Variant49535, - Variant49536, - Variant49537, - Variant49538, - Variant49539, - Variant49540, - Variant49541, - Variant49542, - Variant49543, - Variant49544, - Variant49545, - Variant49546, - Variant49547, - Variant49548, - Variant49549, - Variant49550, - Variant49551, - Variant49552, - Variant49553, - Variant49554, - Variant49555, - Variant49556, - Variant49557, - Variant49558, - Variant49559, - Variant49560, - Variant49561, - Variant49562, - Variant49563, - Variant49564, - Variant49565, - Variant49566, - Variant49567, - Variant49568, - Variant49569, - Variant49570, - Variant49571, - Variant49572, - Variant49573, - Variant49574, - Variant49575, - Variant49576, - Variant49577, - Variant49578, - Variant49579, - Variant49580, - Variant49581, - Variant49582, - Variant49583, - Variant49584, - Variant49585, - Variant49586, - Variant49587, - Variant49588, - Variant49589, - Variant49590, - Variant49591, - Variant49592, - Variant49593, - Variant49594, - Variant49595, - Variant49596, - Variant49597, - Variant49598, - Variant49599, - Variant49600, - Variant49601, - Variant49602, - Variant49603, - Variant49604, - Variant49605, - Variant49606, - Variant49607, - Variant49608, - Variant49609, - Variant49610, - Variant49611, - Variant49612, - Variant49613, - Variant49614, - Variant49615, - Variant49616, - Variant49617, - Variant49618, - Variant49619, - Variant49620, - Variant49621, - Variant49622, - Variant49623, - Variant49624, - Variant49625, - Variant49626, - Variant49627, - Variant49628, - Variant49629, - Variant49630, - Variant49631, - Variant49632, - Variant49633, - Variant49634, - Variant49635, - Variant49636, - Variant49637, - Variant49638, - Variant49639, - Variant49640, - Variant49641, - Variant49642, - Variant49643, - Variant49644, - Variant49645, - Variant49646, - Variant49647, - Variant49648, - Variant49649, - Variant49650, - Variant49651, - Variant49652, - Variant49653, - Variant49654, - Variant49655, - Variant49656, - Variant49657, - Variant49658, - Variant49659, - Variant49660, - Variant49661, - Variant49662, - Variant49663, - Variant49664, - Variant49665, - Variant49666, - Variant49667, - Variant49668, - Variant49669, - Variant49670, - Variant49671, - Variant49672, - Variant49673, - Variant49674, - Variant49675, - Variant49676, - Variant49677, - Variant49678, - Variant49679, - Variant49680, - Variant49681, - Variant49682, - Variant49683, - Variant49684, - Variant49685, - Variant49686, - Variant49687, - Variant49688, - Variant49689, - Variant49690, - Variant49691, - Variant49692, - Variant49693, - Variant49694, - Variant49695, - Variant49696, - Variant49697, - Variant49698, - Variant49699, - Variant49700, - Variant49701, - Variant49702, - Variant49703, - Variant49704, - Variant49705, - Variant49706, - Variant49707, - Variant49708, - Variant49709, - Variant49710, - Variant49711, - Variant49712, - Variant49713, - Variant49714, - Variant49715, - Variant49716, - Variant49717, - Variant49718, - Variant49719, - Variant49720, - Variant49721, - Variant49722, - Variant49723, - Variant49724, - Variant49725, - Variant49726, - Variant49727, - Variant49728, - Variant49729, - Variant49730, - Variant49731, - Variant49732, - Variant49733, - Variant49734, - Variant49735, - Variant49736, - Variant49737, - Variant49738, - Variant49739, - Variant49740, - Variant49741, - Variant49742, - Variant49743, - Variant49744, - Variant49745, - Variant49746, - Variant49747, - Variant49748, - Variant49749, - Variant49750, - Variant49751, - Variant49752, - Variant49753, - Variant49754, - Variant49755, - Variant49756, - Variant49757, - Variant49758, - Variant49759, - Variant49760, - Variant49761, - Variant49762, - Variant49763, - Variant49764, - Variant49765, - Variant49766, - Variant49767, - Variant49768, - Variant49769, - Variant49770, - Variant49771, - Variant49772, - Variant49773, - Variant49774, - Variant49775, - Variant49776, - Variant49777, - Variant49778, - Variant49779, - Variant49780, - Variant49781, - Variant49782, - Variant49783, - Variant49784, - Variant49785, - Variant49786, - Variant49787, - Variant49788, - Variant49789, - Variant49790, - Variant49791, - Variant49792, - Variant49793, - Variant49794, - Variant49795, - Variant49796, - Variant49797, - Variant49798, - Variant49799, - Variant49800, - Variant49801, - Variant49802, - Variant49803, - Variant49804, - Variant49805, - Variant49806, - Variant49807, - Variant49808, - Variant49809, - Variant49810, - Variant49811, - Variant49812, - Variant49813, - Variant49814, - Variant49815, - Variant49816, - Variant49817, - Variant49818, - Variant49819, - Variant49820, - Variant49821, - Variant49822, - Variant49823, - Variant49824, - Variant49825, - Variant49826, - Variant49827, - Variant49828, - Variant49829, - Variant49830, - Variant49831, - Variant49832, - Variant49833, - Variant49834, - Variant49835, - Variant49836, - Variant49837, - Variant49838, - Variant49839, - Variant49840, - Variant49841, - Variant49842, - Variant49843, - Variant49844, - Variant49845, - Variant49846, - Variant49847, - Variant49848, - Variant49849, - Variant49850, - Variant49851, - Variant49852, - Variant49853, - Variant49854, - Variant49855, - Variant49856, - Variant49857, - Variant49858, - Variant49859, - Variant49860, - Variant49861, - Variant49862, - Variant49863, - Variant49864, - Variant49865, - Variant49866, - Variant49867, - Variant49868, - Variant49869, - Variant49870, - Variant49871, - Variant49872, - Variant49873, - Variant49874, - Variant49875, - Variant49876, - Variant49877, - Variant49878, - Variant49879, - Variant49880, - Variant49881, - Variant49882, - Variant49883, - Variant49884, - Variant49885, - Variant49886, - Variant49887, - Variant49888, - Variant49889, - Variant49890, - Variant49891, - Variant49892, - Variant49893, - Variant49894, - Variant49895, - Variant49896, - Variant49897, - Variant49898, - Variant49899, - Variant49900, - Variant49901, - Variant49902, - Variant49903, - Variant49904, - Variant49905, - Variant49906, - Variant49907, - Variant49908, - Variant49909, - Variant49910, - Variant49911, - Variant49912, - Variant49913, - Variant49914, - Variant49915, - Variant49916, - Variant49917, - Variant49918, - Variant49919, - Variant49920, - Variant49921, - Variant49922, - Variant49923, - Variant49924, - Variant49925, - Variant49926, - Variant49927, - Variant49928, - Variant49929, - Variant49930, - Variant49931, - Variant49932, - Variant49933, - Variant49934, - Variant49935, - Variant49936, - Variant49937, - Variant49938, - Variant49939, - Variant49940, - Variant49941, - Variant49942, - Variant49943, - Variant49944, - Variant49945, - Variant49946, - Variant49947, - Variant49948, - Variant49949, - Variant49950, - Variant49951, - Variant49952, - Variant49953, - Variant49954, - Variant49955, - Variant49956, - Variant49957, - Variant49958, - Variant49959, - Variant49960, - Variant49961, - Variant49962, - Variant49963, - Variant49964, - Variant49965, - Variant49966, - Variant49967, - Variant49968, - Variant49969, - Variant49970, - Variant49971, - Variant49972, - Variant49973, - Variant49974, - Variant49975, - Variant49976, - Variant49977, - Variant49978, - Variant49979, - Variant49980, - Variant49981, - Variant49982, - Variant49983, - Variant49984, - Variant49985, - Variant49986, - Variant49987, - Variant49988, - Variant49989, - Variant49990, - Variant49991, - Variant49992, - Variant49993, - Variant49994, - Variant49995, - Variant49996, - Variant49997, - Variant49998, - Variant49999, - Variant50000, - Variant50001, - Variant50002, - Variant50003, - Variant50004, - Variant50005, - Variant50006, - Variant50007, - Variant50008, - Variant50009, - Variant50010, - Variant50011, - Variant50012, - Variant50013, - Variant50014, - Variant50015, - Variant50016, - Variant50017, - Variant50018, - Variant50019, - Variant50020, - Variant50021, - Variant50022, - Variant50023, - Variant50024, - Variant50025, - Variant50026, - Variant50027, - Variant50028, - Variant50029, - Variant50030, - Variant50031, - Variant50032, - Variant50033, - Variant50034, - Variant50035, - Variant50036, - Variant50037, - Variant50038, - Variant50039, - Variant50040, - Variant50041, - Variant50042, - Variant50043, - Variant50044, - Variant50045, - Variant50046, - Variant50047, - Variant50048, - Variant50049, - Variant50050, - Variant50051, - Variant50052, - Variant50053, - Variant50054, - Variant50055, - Variant50056, - Variant50057, - Variant50058, - Variant50059, - Variant50060, - Variant50061, - Variant50062, - Variant50063, - Variant50064, - Variant50065, - Variant50066, - Variant50067, - Variant50068, - Variant50069, - Variant50070, - Variant50071, - Variant50072, - Variant50073, - Variant50074, - Variant50075, - Variant50076, - Variant50077, - Variant50078, - Variant50079, - Variant50080, - Variant50081, - Variant50082, - Variant50083, - Variant50084, - Variant50085, - Variant50086, - Variant50087, - Variant50088, - Variant50089, - Variant50090, - Variant50091, - Variant50092, - Variant50093, - Variant50094, - Variant50095, - Variant50096, - Variant50097, - Variant50098, - Variant50099, - Variant50100, - Variant50101, - Variant50102, - Variant50103, - Variant50104, - Variant50105, - Variant50106, - Variant50107, - Variant50108, - Variant50109, - Variant50110, - Variant50111, - Variant50112, - Variant50113, - Variant50114, - Variant50115, - Variant50116, - Variant50117, - Variant50118, - Variant50119, - Variant50120, - Variant50121, - Variant50122, - Variant50123, - Variant50124, - Variant50125, - Variant50126, - Variant50127, - Variant50128, - Variant50129, - Variant50130, - Variant50131, - Variant50132, - Variant50133, - Variant50134, - Variant50135, - Variant50136, - Variant50137, - Variant50138, - Variant50139, - Variant50140, - Variant50141, - Variant50142, - Variant50143, - Variant50144, - Variant50145, - Variant50146, - Variant50147, - Variant50148, - Variant50149, - Variant50150, - Variant50151, - Variant50152, - Variant50153, - Variant50154, - Variant50155, - Variant50156, - Variant50157, - Variant50158, - Variant50159, - Variant50160, - Variant50161, - Variant50162, - Variant50163, - Variant50164, - Variant50165, - Variant50166, - Variant50167, - Variant50168, - Variant50169, - Variant50170, - Variant50171, - Variant50172, - Variant50173, - Variant50174, - Variant50175, - Variant50176, - Variant50177, - Variant50178, - Variant50179, - Variant50180, - Variant50181, - Variant50182, - Variant50183, - Variant50184, - Variant50185, - Variant50186, - Variant50187, - Variant50188, - Variant50189, - Variant50190, - Variant50191, - Variant50192, - Variant50193, - Variant50194, - Variant50195, - Variant50196, - Variant50197, - Variant50198, - Variant50199, - Variant50200, - Variant50201, - Variant50202, - Variant50203, - Variant50204, - Variant50205, - Variant50206, - Variant50207, - Variant50208, - Variant50209, - Variant50210, - Variant50211, - Variant50212, - Variant50213, - Variant50214, - Variant50215, - Variant50216, - Variant50217, - Variant50218, - Variant50219, - Variant50220, - Variant50221, - Variant50222, - Variant50223, - Variant50224, - Variant50225, - Variant50226, - Variant50227, - Variant50228, - Variant50229, - Variant50230, - Variant50231, - Variant50232, - Variant50233, - Variant50234, - Variant50235, - Variant50236, - Variant50237, - Variant50238, - Variant50239, - Variant50240, - Variant50241, - Variant50242, - Variant50243, - Variant50244, - Variant50245, - Variant50246, - Variant50247, - Variant50248, - Variant50249, - Variant50250, - Variant50251, - Variant50252, - Variant50253, - Variant50254, - Variant50255, - Variant50256, - Variant50257, - Variant50258, - Variant50259, - Variant50260, - Variant50261, - Variant50262, - Variant50263, - Variant50264, - Variant50265, - Variant50266, - Variant50267, - Variant50268, - Variant50269, - Variant50270, - Variant50271, - Variant50272, - Variant50273, - Variant50274, - Variant50275, - Variant50276, - Variant50277, - Variant50278, - Variant50279, - Variant50280, - Variant50281, - Variant50282, - Variant50283, - Variant50284, - Variant50285, - Variant50286, - Variant50287, - Variant50288, - Variant50289, - Variant50290, - Variant50291, - Variant50292, - Variant50293, - Variant50294, - Variant50295, - Variant50296, - Variant50297, - Variant50298, - Variant50299, - Variant50300, - Variant50301, - Variant50302, - Variant50303, - Variant50304, - Variant50305, - Variant50306, - Variant50307, - Variant50308, - Variant50309, - Variant50310, - Variant50311, - Variant50312, - Variant50313, - Variant50314, - Variant50315, - Variant50316, - Variant50317, - Variant50318, - Variant50319, - Variant50320, - Variant50321, - Variant50322, - Variant50323, - Variant50324, - Variant50325, - Variant50326, - Variant50327, - Variant50328, - Variant50329, - Variant50330, - Variant50331, - Variant50332, - Variant50333, - Variant50334, - Variant50335, - Variant50336, - Variant50337, - Variant50338, - Variant50339, - Variant50340, - Variant50341, - Variant50342, - Variant50343, - Variant50344, - Variant50345, - Variant50346, - Variant50347, - Variant50348, - Variant50349, - Variant50350, - Variant50351, - Variant50352, - Variant50353, - Variant50354, - Variant50355, - Variant50356, - Variant50357, - Variant50358, - Variant50359, - Variant50360, - Variant50361, - Variant50362, - Variant50363, - Variant50364, - Variant50365, - Variant50366, - Variant50367, - Variant50368, - Variant50369, - Variant50370, - Variant50371, - Variant50372, - Variant50373, - Variant50374, - Variant50375, - Variant50376, - Variant50377, - Variant50378, - Variant50379, - Variant50380, - Variant50381, - Variant50382, - Variant50383, - Variant50384, - Variant50385, - Variant50386, - Variant50387, - Variant50388, - Variant50389, - Variant50390, - Variant50391, - Variant50392, - Variant50393, - Variant50394, - Variant50395, - Variant50396, - Variant50397, - Variant50398, - Variant50399, - Variant50400, - Variant50401, - Variant50402, - Variant50403, - Variant50404, - Variant50405, - Variant50406, - Variant50407, - Variant50408, - Variant50409, - Variant50410, - Variant50411, - Variant50412, - Variant50413, - Variant50414, - Variant50415, - Variant50416, - Variant50417, - Variant50418, - Variant50419, - Variant50420, - Variant50421, - Variant50422, - Variant50423, - Variant50424, - Variant50425, - Variant50426, - Variant50427, - Variant50428, - Variant50429, - Variant50430, - Variant50431, - Variant50432, - Variant50433, - Variant50434, - Variant50435, - Variant50436, - Variant50437, - Variant50438, - Variant50439, - Variant50440, - Variant50441, - Variant50442, - Variant50443, - Variant50444, - Variant50445, - Variant50446, - Variant50447, - Variant50448, - Variant50449, - Variant50450, - Variant50451, - Variant50452, - Variant50453, - Variant50454, - Variant50455, - Variant50456, - Variant50457, - Variant50458, - Variant50459, - Variant50460, - Variant50461, - Variant50462, - Variant50463, - Variant50464, - Variant50465, - Variant50466, - Variant50467, - Variant50468, - Variant50469, - Variant50470, - Variant50471, - Variant50472, - Variant50473, - Variant50474, - Variant50475, - Variant50476, - Variant50477, - Variant50478, - Variant50479, - Variant50480, - Variant50481, - Variant50482, - Variant50483, - Variant50484, - Variant50485, - Variant50486, - Variant50487, - Variant50488, - Variant50489, - Variant50490, - Variant50491, - Variant50492, - Variant50493, - Variant50494, - Variant50495, - Variant50496, - Variant50497, - Variant50498, - Variant50499, - Variant50500, - Variant50501, - Variant50502, - Variant50503, - Variant50504, - Variant50505, - Variant50506, - Variant50507, - Variant50508, - Variant50509, - Variant50510, - Variant50511, - Variant50512, - Variant50513, - Variant50514, - Variant50515, - Variant50516, - Variant50517, - Variant50518, - Variant50519, - Variant50520, - Variant50521, - Variant50522, - Variant50523, - Variant50524, - Variant50525, - Variant50526, - Variant50527, - Variant50528, - Variant50529, - Variant50530, - Variant50531, - Variant50532, - Variant50533, - Variant50534, - Variant50535, - Variant50536, - Variant50537, - Variant50538, - Variant50539, - Variant50540, - Variant50541, - Variant50542, - Variant50543, - Variant50544, - Variant50545, - Variant50546, - Variant50547, - Variant50548, - Variant50549, - Variant50550, - Variant50551, - Variant50552, - Variant50553, - Variant50554, - Variant50555, - Variant50556, - Variant50557, - Variant50558, - Variant50559, - Variant50560, - Variant50561, - Variant50562, - Variant50563, - Variant50564, - Variant50565, - Variant50566, - Variant50567, - Variant50568, - Variant50569, - Variant50570, - Variant50571, - Variant50572, - Variant50573, - Variant50574, - Variant50575, - Variant50576, - Variant50577, - Variant50578, - Variant50579, - Variant50580, - Variant50581, - Variant50582, - Variant50583, - Variant50584, - Variant50585, - Variant50586, - Variant50587, - Variant50588, - Variant50589, - Variant50590, - Variant50591, - Variant50592, - Variant50593, - Variant50594, - Variant50595, - Variant50596, - Variant50597, - Variant50598, - Variant50599, - Variant50600, - Variant50601, - Variant50602, - Variant50603, - Variant50604, - Variant50605, - Variant50606, - Variant50607, - Variant50608, - Variant50609, - Variant50610, - Variant50611, - Variant50612, - Variant50613, - Variant50614, - Variant50615, - Variant50616, - Variant50617, - Variant50618, - Variant50619, - Variant50620, - Variant50621, - Variant50622, - Variant50623, - Variant50624, - Variant50625, - Variant50626, - Variant50627, - Variant50628, - Variant50629, - Variant50630, - Variant50631, - Variant50632, - Variant50633, - Variant50634, - Variant50635, - Variant50636, - Variant50637, - Variant50638, - Variant50639, - Variant50640, - Variant50641, - Variant50642, - Variant50643, - Variant50644, - Variant50645, - Variant50646, - Variant50647, - Variant50648, - Variant50649, - Variant50650, - Variant50651, - Variant50652, - Variant50653, - Variant50654, - Variant50655, - Variant50656, - Variant50657, - Variant50658, - Variant50659, - Variant50660, - Variant50661, - Variant50662, - Variant50663, - Variant50664, - Variant50665, - Variant50666, - Variant50667, - Variant50668, - Variant50669, - Variant50670, - Variant50671, - Variant50672, - Variant50673, - Variant50674, - Variant50675, - Variant50676, - Variant50677, - Variant50678, - Variant50679, - Variant50680, - Variant50681, - Variant50682, - Variant50683, - Variant50684, - Variant50685, - Variant50686, - Variant50687, - Variant50688, - Variant50689, - Variant50690, - Variant50691, - Variant50692, - Variant50693, - Variant50694, - Variant50695, - Variant50696, - Variant50697, - Variant50698, - Variant50699, - Variant50700, - Variant50701, - Variant50702, - Variant50703, - Variant50704, - Variant50705, - Variant50706, - Variant50707, - Variant50708, - Variant50709, - Variant50710, - Variant50711, - Variant50712, - Variant50713, - Variant50714, - Variant50715, - Variant50716, - Variant50717, - Variant50718, - Variant50719, - Variant50720, - Variant50721, - Variant50722, - Variant50723, - Variant50724, - Variant50725, - Variant50726, - Variant50727, - Variant50728, - Variant50729, - Variant50730, - Variant50731, - Variant50732, - Variant50733, - Variant50734, - Variant50735, - Variant50736, - Variant50737, - Variant50738, - Variant50739, - Variant50740, - Variant50741, - Variant50742, - Variant50743, - Variant50744, - Variant50745, - Variant50746, - Variant50747, - Variant50748, - Variant50749, - Variant50750, - Variant50751, - Variant50752, - Variant50753, - Variant50754, - Variant50755, - Variant50756, - Variant50757, - Variant50758, - Variant50759, - Variant50760, - Variant50761, - Variant50762, - Variant50763, - Variant50764, - Variant50765, - Variant50766, - Variant50767, - Variant50768, - Variant50769, - Variant50770, - Variant50771, - Variant50772, - Variant50773, - Variant50774, - Variant50775, - Variant50776, - Variant50777, - Variant50778, - Variant50779, - Variant50780, - Variant50781, - Variant50782, - Variant50783, - Variant50784, - Variant50785, - Variant50786, - Variant50787, - Variant50788, - Variant50789, - Variant50790, - Variant50791, - Variant50792, - Variant50793, - Variant50794, - Variant50795, - Variant50796, - Variant50797, - Variant50798, - Variant50799, - Variant50800, - Variant50801, - Variant50802, - Variant50803, - Variant50804, - Variant50805, - Variant50806, - Variant50807, - Variant50808, - Variant50809, - Variant50810, - Variant50811, - Variant50812, - Variant50813, - Variant50814, - Variant50815, - Variant50816, - Variant50817, - Variant50818, - Variant50819, - Variant50820, - Variant50821, - Variant50822, - Variant50823, - Variant50824, - Variant50825, - Variant50826, - Variant50827, - Variant50828, - Variant50829, - Variant50830, - Variant50831, - Variant50832, - Variant50833, - Variant50834, - Variant50835, - Variant50836, - Variant50837, - Variant50838, - Variant50839, - Variant50840, - Variant50841, - Variant50842, - Variant50843, - Variant50844, - Variant50845, - Variant50846, - Variant50847, - Variant50848, - Variant50849, - Variant50850, - Variant50851, - Variant50852, - Variant50853, - Variant50854, - Variant50855, - Variant50856, - Variant50857, - Variant50858, - Variant50859, - Variant50860, - Variant50861, - Variant50862, - Variant50863, - Variant50864, - Variant50865, - Variant50866, - Variant50867, - Variant50868, - Variant50869, - Variant50870, - Variant50871, - Variant50872, - Variant50873, - Variant50874, - Variant50875, - Variant50876, - Variant50877, - Variant50878, - Variant50879, - Variant50880, - Variant50881, - Variant50882, - Variant50883, - Variant50884, - Variant50885, - Variant50886, - Variant50887, - Variant50888, - Variant50889, - Variant50890, - Variant50891, - Variant50892, - Variant50893, - Variant50894, - Variant50895, - Variant50896, - Variant50897, - Variant50898, - Variant50899, - Variant50900, - Variant50901, - Variant50902, - Variant50903, - Variant50904, - Variant50905, - Variant50906, - Variant50907, - Variant50908, - Variant50909, - Variant50910, - Variant50911, - Variant50912, - Variant50913, - Variant50914, - Variant50915, - Variant50916, - Variant50917, - Variant50918, - Variant50919, - Variant50920, - Variant50921, - Variant50922, - Variant50923, - Variant50924, - Variant50925, - Variant50926, - Variant50927, - Variant50928, - Variant50929, - Variant50930, - Variant50931, - Variant50932, - Variant50933, - Variant50934, - Variant50935, - Variant50936, - Variant50937, - Variant50938, - Variant50939, - Variant50940, - Variant50941, - Variant50942, - Variant50943, - Variant50944, - Variant50945, - Variant50946, - Variant50947, - Variant50948, - Variant50949, - Variant50950, - Variant50951, - Variant50952, - Variant50953, - Variant50954, - Variant50955, - Variant50956, - Variant50957, - Variant50958, - Variant50959, - Variant50960, - Variant50961, - Variant50962, - Variant50963, - Variant50964, - Variant50965, - Variant50966, - Variant50967, - Variant50968, - Variant50969, - Variant50970, - Variant50971, - Variant50972, - Variant50973, - Variant50974, - Variant50975, - Variant50976, - Variant50977, - Variant50978, - Variant50979, - Variant50980, - Variant50981, - Variant50982, - Variant50983, - Variant50984, - Variant50985, - Variant50986, - Variant50987, - Variant50988, - Variant50989, - Variant50990, - Variant50991, - Variant50992, - Variant50993, - Variant50994, - Variant50995, - Variant50996, - Variant50997, - Variant50998, - Variant50999, - Variant51000, - Variant51001, - Variant51002, - Variant51003, - Variant51004, - Variant51005, - Variant51006, - Variant51007, - Variant51008, - Variant51009, - Variant51010, - Variant51011, - Variant51012, - Variant51013, - Variant51014, - Variant51015, - Variant51016, - Variant51017, - Variant51018, - Variant51019, - Variant51020, - Variant51021, - Variant51022, - Variant51023, - Variant51024, - Variant51025, - Variant51026, - Variant51027, - Variant51028, - Variant51029, - Variant51030, - Variant51031, - Variant51032, - Variant51033, - Variant51034, - Variant51035, - Variant51036, - Variant51037, - Variant51038, - Variant51039, - Variant51040, - Variant51041, - Variant51042, - Variant51043, - Variant51044, - Variant51045, - Variant51046, - Variant51047, - Variant51048, - Variant51049, - Variant51050, - Variant51051, - Variant51052, - Variant51053, - Variant51054, - Variant51055, - Variant51056, - Variant51057, - Variant51058, - Variant51059, - Variant51060, - Variant51061, - Variant51062, - Variant51063, - Variant51064, - Variant51065, - Variant51066, - Variant51067, - Variant51068, - Variant51069, - Variant51070, - Variant51071, - Variant51072, - Variant51073, - Variant51074, - Variant51075, - Variant51076, - Variant51077, - Variant51078, - Variant51079, - Variant51080, - Variant51081, - Variant51082, - Variant51083, - Variant51084, - Variant51085, - Variant51086, - Variant51087, - Variant51088, - Variant51089, - Variant51090, - Variant51091, - Variant51092, - Variant51093, - Variant51094, - Variant51095, - Variant51096, - Variant51097, - Variant51098, - Variant51099, - Variant51100, - Variant51101, - Variant51102, - Variant51103, - Variant51104, - Variant51105, - Variant51106, - Variant51107, - Variant51108, - Variant51109, - Variant51110, - Variant51111, - Variant51112, - Variant51113, - Variant51114, - Variant51115, - Variant51116, - Variant51117, - Variant51118, - Variant51119, - Variant51120, - Variant51121, - Variant51122, - Variant51123, - Variant51124, - Variant51125, - Variant51126, - Variant51127, - Variant51128, - Variant51129, - Variant51130, - Variant51131, - Variant51132, - Variant51133, - Variant51134, - Variant51135, - Variant51136, - Variant51137, - Variant51138, - Variant51139, - Variant51140, - Variant51141, - Variant51142, - Variant51143, - Variant51144, - Variant51145, - Variant51146, - Variant51147, - Variant51148, - Variant51149, - Variant51150, - Variant51151, - Variant51152, - Variant51153, - Variant51154, - Variant51155, - Variant51156, - Variant51157, - Variant51158, - Variant51159, - Variant51160, - Variant51161, - Variant51162, - Variant51163, - Variant51164, - Variant51165, - Variant51166, - Variant51167, - Variant51168, - Variant51169, - Variant51170, - Variant51171, - Variant51172, - Variant51173, - Variant51174, - Variant51175, - Variant51176, - Variant51177, - Variant51178, - Variant51179, - Variant51180, - Variant51181, - Variant51182, - Variant51183, - Variant51184, - Variant51185, - Variant51186, - Variant51187, - Variant51188, - Variant51189, - Variant51190, - Variant51191, - Variant51192, - Variant51193, - Variant51194, - Variant51195, - Variant51196, - Variant51197, - Variant51198, - Variant51199, - Variant51200, - Variant51201, - Variant51202, - Variant51203, - Variant51204, - Variant51205, - Variant51206, - Variant51207, - Variant51208, - Variant51209, - Variant51210, - Variant51211, - Variant51212, - Variant51213, - Variant51214, - Variant51215, - Variant51216, - Variant51217, - Variant51218, - Variant51219, - Variant51220, - Variant51221, - Variant51222, - Variant51223, - Variant51224, - Variant51225, - Variant51226, - Variant51227, - Variant51228, - Variant51229, - Variant51230, - Variant51231, - Variant51232, - Variant51233, - Variant51234, - Variant51235, - Variant51236, - Variant51237, - Variant51238, - Variant51239, - Variant51240, - Variant51241, - Variant51242, - Variant51243, - Variant51244, - Variant51245, - Variant51246, - Variant51247, - Variant51248, - Variant51249, - Variant51250, - Variant51251, - Variant51252, - Variant51253, - Variant51254, - Variant51255, - Variant51256, - Variant51257, - Variant51258, - Variant51259, - Variant51260, - Variant51261, - Variant51262, - Variant51263, - Variant51264, - Variant51265, - Variant51266, - Variant51267, - Variant51268, - Variant51269, - Variant51270, - Variant51271, - Variant51272, - Variant51273, - Variant51274, - Variant51275, - Variant51276, - Variant51277, - Variant51278, - Variant51279, - Variant51280, - Variant51281, - Variant51282, - Variant51283, - Variant51284, - Variant51285, - Variant51286, - Variant51287, - Variant51288, - Variant51289, - Variant51290, - Variant51291, - Variant51292, - Variant51293, - Variant51294, - Variant51295, - Variant51296, - Variant51297, - Variant51298, - Variant51299, - Variant51300, - Variant51301, - Variant51302, - Variant51303, - Variant51304, - Variant51305, - Variant51306, - Variant51307, - Variant51308, - Variant51309, - Variant51310, - Variant51311, - Variant51312, - Variant51313, - Variant51314, - Variant51315, - Variant51316, - Variant51317, - Variant51318, - Variant51319, - Variant51320, - Variant51321, - Variant51322, - Variant51323, - Variant51324, - Variant51325, - Variant51326, - Variant51327, - Variant51328, - Variant51329, - Variant51330, - Variant51331, - Variant51332, - Variant51333, - Variant51334, - Variant51335, - Variant51336, - Variant51337, - Variant51338, - Variant51339, - Variant51340, - Variant51341, - Variant51342, - Variant51343, - Variant51344, - Variant51345, - Variant51346, - Variant51347, - Variant51348, - Variant51349, - Variant51350, - Variant51351, - Variant51352, - Variant51353, - Variant51354, - Variant51355, - Variant51356, - Variant51357, - Variant51358, - Variant51359, - Variant51360, - Variant51361, - Variant51362, - Variant51363, - Variant51364, - Variant51365, - Variant51366, - Variant51367, - Variant51368, - Variant51369, - Variant51370, - Variant51371, - Variant51372, - Variant51373, - Variant51374, - Variant51375, - Variant51376, - Variant51377, - Variant51378, - Variant51379, - Variant51380, - Variant51381, - Variant51382, - Variant51383, - Variant51384, - Variant51385, - Variant51386, - Variant51387, - Variant51388, - Variant51389, - Variant51390, - Variant51391, - Variant51392, - Variant51393, - Variant51394, - Variant51395, - Variant51396, - Variant51397, - Variant51398, - Variant51399, - Variant51400, - Variant51401, - Variant51402, - Variant51403, - Variant51404, - Variant51405, - Variant51406, - Variant51407, - Variant51408, - Variant51409, - Variant51410, - Variant51411, - Variant51412, - Variant51413, - Variant51414, - Variant51415, - Variant51416, - Variant51417, - Variant51418, - Variant51419, - Variant51420, - Variant51421, - Variant51422, - Variant51423, - Variant51424, - Variant51425, - Variant51426, - Variant51427, - Variant51428, - Variant51429, - Variant51430, - Variant51431, - Variant51432, - Variant51433, - Variant51434, - Variant51435, - Variant51436, - Variant51437, - Variant51438, - Variant51439, - Variant51440, - Variant51441, - Variant51442, - Variant51443, - Variant51444, - Variant51445, - Variant51446, - Variant51447, - Variant51448, - Variant51449, - Variant51450, - Variant51451, - Variant51452, - Variant51453, - Variant51454, - Variant51455, - Variant51456, - Variant51457, - Variant51458, - Variant51459, - Variant51460, - Variant51461, - Variant51462, - Variant51463, - Variant51464, - Variant51465, - Variant51466, - Variant51467, - Variant51468, - Variant51469, - Variant51470, - Variant51471, - Variant51472, - Variant51473, - Variant51474, - Variant51475, - Variant51476, - Variant51477, - Variant51478, - Variant51479, - Variant51480, - Variant51481, - Variant51482, - Variant51483, - Variant51484, - Variant51485, - Variant51486, - Variant51487, - Variant51488, - Variant51489, - Variant51490, - Variant51491, - Variant51492, - Variant51493, - Variant51494, - Variant51495, - Variant51496, - Variant51497, - Variant51498, - Variant51499, - Variant51500, - Variant51501, - Variant51502, - Variant51503, - Variant51504, - Variant51505, - Variant51506, - Variant51507, - Variant51508, - Variant51509, - Variant51510, - Variant51511, - Variant51512, - Variant51513, - Variant51514, - Variant51515, - Variant51516, - Variant51517, - Variant51518, - Variant51519, - Variant51520, - Variant51521, - Variant51522, - Variant51523, - Variant51524, - Variant51525, - Variant51526, - Variant51527, - Variant51528, - Variant51529, - Variant51530, - Variant51531, - Variant51532, - Variant51533, - Variant51534, - Variant51535, - Variant51536, - Variant51537, - Variant51538, - Variant51539, - Variant51540, - Variant51541, - Variant51542, - Variant51543, - Variant51544, - Variant51545, - Variant51546, - Variant51547, - Variant51548, - Variant51549, - Variant51550, - Variant51551, - Variant51552, - Variant51553, - Variant51554, - Variant51555, - Variant51556, - Variant51557, - Variant51558, - Variant51559, - Variant51560, - Variant51561, - Variant51562, - Variant51563, - Variant51564, - Variant51565, - Variant51566, - Variant51567, - Variant51568, - Variant51569, - Variant51570, - Variant51571, - Variant51572, - Variant51573, - Variant51574, - Variant51575, - Variant51576, - Variant51577, - Variant51578, - Variant51579, - Variant51580, - Variant51581, - Variant51582, - Variant51583, - Variant51584, - Variant51585, - Variant51586, - Variant51587, - Variant51588, - Variant51589, - Variant51590, - Variant51591, - Variant51592, - Variant51593, - Variant51594, - Variant51595, - Variant51596, - Variant51597, - Variant51598, - Variant51599, - Variant51600, - Variant51601, - Variant51602, - Variant51603, - Variant51604, - Variant51605, - Variant51606, - Variant51607, - Variant51608, - Variant51609, - Variant51610, - Variant51611, - Variant51612, - Variant51613, - Variant51614, - Variant51615, - Variant51616, - Variant51617, - Variant51618, - Variant51619, - Variant51620, - Variant51621, - Variant51622, - Variant51623, - Variant51624, - Variant51625, - Variant51626, - Variant51627, - Variant51628, - Variant51629, - Variant51630, - Variant51631, - Variant51632, - Variant51633, - Variant51634, - Variant51635, - Variant51636, - Variant51637, - Variant51638, - Variant51639, - Variant51640, - Variant51641, - Variant51642, - Variant51643, - Variant51644, - Variant51645, - Variant51646, - Variant51647, - Variant51648, - Variant51649, - Variant51650, - Variant51651, - Variant51652, - Variant51653, - Variant51654, - Variant51655, - Variant51656, - Variant51657, - Variant51658, - Variant51659, - Variant51660, - Variant51661, - Variant51662, - Variant51663, - Variant51664, - Variant51665, - Variant51666, - Variant51667, - Variant51668, - Variant51669, - Variant51670, - Variant51671, - Variant51672, - Variant51673, - Variant51674, - Variant51675, - Variant51676, - Variant51677, - Variant51678, - Variant51679, - Variant51680, - Variant51681, - Variant51682, - Variant51683, - Variant51684, - Variant51685, - Variant51686, - Variant51687, - Variant51688, - Variant51689, - Variant51690, - Variant51691, - Variant51692, - Variant51693, - Variant51694, - Variant51695, - Variant51696, - Variant51697, - Variant51698, - Variant51699, - Variant51700, - Variant51701, - Variant51702, - Variant51703, - Variant51704, - Variant51705, - Variant51706, - Variant51707, - Variant51708, - Variant51709, - Variant51710, - Variant51711, - Variant51712, - Variant51713, - Variant51714, - Variant51715, - Variant51716, - Variant51717, - Variant51718, - Variant51719, - Variant51720, - Variant51721, - Variant51722, - Variant51723, - Variant51724, - Variant51725, - Variant51726, - Variant51727, - Variant51728, - Variant51729, - Variant51730, - Variant51731, - Variant51732, - Variant51733, - Variant51734, - Variant51735, - Variant51736, - Variant51737, - Variant51738, - Variant51739, - Variant51740, - Variant51741, - Variant51742, - Variant51743, - Variant51744, - Variant51745, - Variant51746, - Variant51747, - Variant51748, - Variant51749, - Variant51750, - Variant51751, - Variant51752, - Variant51753, - Variant51754, - Variant51755, - Variant51756, - Variant51757, - Variant51758, - Variant51759, - Variant51760, - Variant51761, - Variant51762, - Variant51763, - Variant51764, - Variant51765, - Variant51766, - Variant51767, - Variant51768, - Variant51769, - Variant51770, - Variant51771, - Variant51772, - Variant51773, - Variant51774, - Variant51775, - Variant51776, - Variant51777, - Variant51778, - Variant51779, - Variant51780, - Variant51781, - Variant51782, - Variant51783, - Variant51784, - Variant51785, - Variant51786, - Variant51787, - Variant51788, - Variant51789, - Variant51790, - Variant51791, - Variant51792, - Variant51793, - Variant51794, - Variant51795, - Variant51796, - Variant51797, - Variant51798, - Variant51799, - Variant51800, - Variant51801, - Variant51802, - Variant51803, - Variant51804, - Variant51805, - Variant51806, - Variant51807, - Variant51808, - Variant51809, - Variant51810, - Variant51811, - Variant51812, - Variant51813, - Variant51814, - Variant51815, - Variant51816, - Variant51817, - Variant51818, - Variant51819, - Variant51820, - Variant51821, - Variant51822, - Variant51823, - Variant51824, - Variant51825, - Variant51826, - Variant51827, - Variant51828, - Variant51829, - Variant51830, - Variant51831, - Variant51832, - Variant51833, - Variant51834, - Variant51835, - Variant51836, - Variant51837, - Variant51838, - Variant51839, - Variant51840, - Variant51841, - Variant51842, - Variant51843, - Variant51844, - Variant51845, - Variant51846, - Variant51847, - Variant51848, - Variant51849, - Variant51850, - Variant51851, - Variant51852, - Variant51853, - Variant51854, - Variant51855, - Variant51856, - Variant51857, - Variant51858, - Variant51859, - Variant51860, - Variant51861, - Variant51862, - Variant51863, - Variant51864, - Variant51865, - Variant51866, - Variant51867, - Variant51868, - Variant51869, - Variant51870, - Variant51871, - Variant51872, - Variant51873, - Variant51874, - Variant51875, - Variant51876, - Variant51877, - Variant51878, - Variant51879, - Variant51880, - Variant51881, - Variant51882, - Variant51883, - Variant51884, - Variant51885, - Variant51886, - Variant51887, - Variant51888, - Variant51889, - Variant51890, - Variant51891, - Variant51892, - Variant51893, - Variant51894, - Variant51895, - Variant51896, - Variant51897, - Variant51898, - Variant51899, - Variant51900, - Variant51901, - Variant51902, - Variant51903, - Variant51904, - Variant51905, - Variant51906, - Variant51907, - Variant51908, - Variant51909, - Variant51910, - Variant51911, - Variant51912, - Variant51913, - Variant51914, - Variant51915, - Variant51916, - Variant51917, - Variant51918, - Variant51919, - Variant51920, - Variant51921, - Variant51922, - Variant51923, - Variant51924, - Variant51925, - Variant51926, - Variant51927, - Variant51928, - Variant51929, - Variant51930, - Variant51931, - Variant51932, - Variant51933, - Variant51934, - Variant51935, - Variant51936, - Variant51937, - Variant51938, - Variant51939, - Variant51940, - Variant51941, - Variant51942, - Variant51943, - Variant51944, - Variant51945, - Variant51946, - Variant51947, - Variant51948, - Variant51949, - Variant51950, - Variant51951, - Variant51952, - Variant51953, - Variant51954, - Variant51955, - Variant51956, - Variant51957, - Variant51958, - Variant51959, - Variant51960, - Variant51961, - Variant51962, - Variant51963, - Variant51964, - Variant51965, - Variant51966, - Variant51967, - Variant51968, - Variant51969, - Variant51970, - Variant51971, - Variant51972, - Variant51973, - Variant51974, - Variant51975, - Variant51976, - Variant51977, - Variant51978, - Variant51979, - Variant51980, - Variant51981, - Variant51982, - Variant51983, - Variant51984, - Variant51985, - Variant51986, - Variant51987, - Variant51988, - Variant51989, - Variant51990, - Variant51991, - Variant51992, - Variant51993, - Variant51994, - Variant51995, - Variant51996, - Variant51997, - Variant51998, - Variant51999, - Variant52000, - Variant52001, - Variant52002, - Variant52003, - Variant52004, - Variant52005, - Variant52006, - Variant52007, - Variant52008, - Variant52009, - Variant52010, - Variant52011, - Variant52012, - Variant52013, - Variant52014, - Variant52015, - Variant52016, - Variant52017, - Variant52018, - Variant52019, - Variant52020, - Variant52021, - Variant52022, - Variant52023, - Variant52024, - Variant52025, - Variant52026, - Variant52027, - Variant52028, - Variant52029, - Variant52030, - Variant52031, - Variant52032, - Variant52033, - Variant52034, - Variant52035, - Variant52036, - Variant52037, - Variant52038, - Variant52039, - Variant52040, - Variant52041, - Variant52042, - Variant52043, - Variant52044, - Variant52045, - Variant52046, - Variant52047, - Variant52048, - Variant52049, - Variant52050, - Variant52051, - Variant52052, - Variant52053, - Variant52054, - Variant52055, - Variant52056, - Variant52057, - Variant52058, - Variant52059, - Variant52060, - Variant52061, - Variant52062, - Variant52063, - Variant52064, - Variant52065, - Variant52066, - Variant52067, - Variant52068, - Variant52069, - Variant52070, - Variant52071, - Variant52072, - Variant52073, - Variant52074, - Variant52075, - Variant52076, - Variant52077, - Variant52078, - Variant52079, - Variant52080, - Variant52081, - Variant52082, - Variant52083, - Variant52084, - Variant52085, - Variant52086, - Variant52087, - Variant52088, - Variant52089, - Variant52090, - Variant52091, - Variant52092, - Variant52093, - Variant52094, - Variant52095, - Variant52096, - Variant52097, - Variant52098, - Variant52099, - Variant52100, - Variant52101, - Variant52102, - Variant52103, - Variant52104, - Variant52105, - Variant52106, - Variant52107, - Variant52108, - Variant52109, - Variant52110, - Variant52111, - Variant52112, - Variant52113, - Variant52114, - Variant52115, - Variant52116, - Variant52117, - Variant52118, - Variant52119, - Variant52120, - Variant52121, - Variant52122, - Variant52123, - Variant52124, - Variant52125, - Variant52126, - Variant52127, - Variant52128, - Variant52129, - Variant52130, - Variant52131, - Variant52132, - Variant52133, - Variant52134, - Variant52135, - Variant52136, - Variant52137, - Variant52138, - Variant52139, - Variant52140, - Variant52141, - Variant52142, - Variant52143, - Variant52144, - Variant52145, - Variant52146, - Variant52147, - Variant52148, - Variant52149, - Variant52150, - Variant52151, - Variant52152, - Variant52153, - Variant52154, - Variant52155, - Variant52156, - Variant52157, - Variant52158, - Variant52159, - Variant52160, - Variant52161, - Variant52162, - Variant52163, - Variant52164, - Variant52165, - Variant52166, - Variant52167, - Variant52168, - Variant52169, - Variant52170, - Variant52171, - Variant52172, - Variant52173, - Variant52174, - Variant52175, - Variant52176, - Variant52177, - Variant52178, - Variant52179, - Variant52180, - Variant52181, - Variant52182, - Variant52183, - Variant52184, - Variant52185, - Variant52186, - Variant52187, - Variant52188, - Variant52189, - Variant52190, - Variant52191, - Variant52192, - Variant52193, - Variant52194, - Variant52195, - Variant52196, - Variant52197, - Variant52198, - Variant52199, - Variant52200, - Variant52201, - Variant52202, - Variant52203, - Variant52204, - Variant52205, - Variant52206, - Variant52207, - Variant52208, - Variant52209, - Variant52210, - Variant52211, - Variant52212, - Variant52213, - Variant52214, - Variant52215, - Variant52216, - Variant52217, - Variant52218, - Variant52219, - Variant52220, - Variant52221, - Variant52222, - Variant52223, - Variant52224, - Variant52225, - Variant52226, - Variant52227, - Variant52228, - Variant52229, - Variant52230, - Variant52231, - Variant52232, - Variant52233, - Variant52234, - Variant52235, - Variant52236, - Variant52237, - Variant52238, - Variant52239, - Variant52240, - Variant52241, - Variant52242, - Variant52243, - Variant52244, - Variant52245, - Variant52246, - Variant52247, - Variant52248, - Variant52249, - Variant52250, - Variant52251, - Variant52252, - Variant52253, - Variant52254, - Variant52255, - Variant52256, - Variant52257, - Variant52258, - Variant52259, - Variant52260, - Variant52261, - Variant52262, - Variant52263, - Variant52264, - Variant52265, - Variant52266, - Variant52267, - Variant52268, - Variant52269, - Variant52270, - Variant52271, - Variant52272, - Variant52273, - Variant52274, - Variant52275, - Variant52276, - Variant52277, - Variant52278, - Variant52279, - Variant52280, - Variant52281, - Variant52282, - Variant52283, - Variant52284, - Variant52285, - Variant52286, - Variant52287, - Variant52288, - Variant52289, - Variant52290, - Variant52291, - Variant52292, - Variant52293, - Variant52294, - Variant52295, - Variant52296, - Variant52297, - Variant52298, - Variant52299, - Variant52300, - Variant52301, - Variant52302, - Variant52303, - Variant52304, - Variant52305, - Variant52306, - Variant52307, - Variant52308, - Variant52309, - Variant52310, - Variant52311, - Variant52312, - Variant52313, - Variant52314, - Variant52315, - Variant52316, - Variant52317, - Variant52318, - Variant52319, - Variant52320, - Variant52321, - Variant52322, - Variant52323, - Variant52324, - Variant52325, - Variant52326, - Variant52327, - Variant52328, - Variant52329, - Variant52330, - Variant52331, - Variant52332, - Variant52333, - Variant52334, - Variant52335, - Variant52336, - Variant52337, - Variant52338, - Variant52339, - Variant52340, - Variant52341, - Variant52342, - Variant52343, - Variant52344, - Variant52345, - Variant52346, - Variant52347, - Variant52348, - Variant52349, - Variant52350, - Variant52351, - Variant52352, - Variant52353, - Variant52354, - Variant52355, - Variant52356, - Variant52357, - Variant52358, - Variant52359, - Variant52360, - Variant52361, - Variant52362, - Variant52363, - Variant52364, - Variant52365, - Variant52366, - Variant52367, - Variant52368, - Variant52369, - Variant52370, - Variant52371, - Variant52372, - Variant52373, - Variant52374, - Variant52375, - Variant52376, - Variant52377, - Variant52378, - Variant52379, - Variant52380, - Variant52381, - Variant52382, - Variant52383, - Variant52384, - Variant52385, - Variant52386, - Variant52387, - Variant52388, - Variant52389, - Variant52390, - Variant52391, - Variant52392, - Variant52393, - Variant52394, - Variant52395, - Variant52396, - Variant52397, - Variant52398, - Variant52399, - Variant52400, - Variant52401, - Variant52402, - Variant52403, - Variant52404, - Variant52405, - Variant52406, - Variant52407, - Variant52408, - Variant52409, - Variant52410, - Variant52411, - Variant52412, - Variant52413, - Variant52414, - Variant52415, - Variant52416, - Variant52417, - Variant52418, - Variant52419, - Variant52420, - Variant52421, - Variant52422, - Variant52423, - Variant52424, - Variant52425, - Variant52426, - Variant52427, - Variant52428, - Variant52429, - Variant52430, - Variant52431, - Variant52432, - Variant52433, - Variant52434, - Variant52435, - Variant52436, - Variant52437, - Variant52438, - Variant52439, - Variant52440, - Variant52441, - Variant52442, - Variant52443, - Variant52444, - Variant52445, - Variant52446, - Variant52447, - Variant52448, - Variant52449, - Variant52450, - Variant52451, - Variant52452, - Variant52453, - Variant52454, - Variant52455, - Variant52456, - Variant52457, - Variant52458, - Variant52459, - Variant52460, - Variant52461, - Variant52462, - Variant52463, - Variant52464, - Variant52465, - Variant52466, - Variant52467, - Variant52468, - Variant52469, - Variant52470, - Variant52471, - Variant52472, - Variant52473, - Variant52474, - Variant52475, - Variant52476, - Variant52477, - Variant52478, - Variant52479, - Variant52480, - Variant52481, - Variant52482, - Variant52483, - Variant52484, - Variant52485, - Variant52486, - Variant52487, - Variant52488, - Variant52489, - Variant52490, - Variant52491, - Variant52492, - Variant52493, - Variant52494, - Variant52495, - Variant52496, - Variant52497, - Variant52498, - Variant52499, - Variant52500, - Variant52501, - Variant52502, - Variant52503, - Variant52504, - Variant52505, - Variant52506, - Variant52507, - Variant52508, - Variant52509, - Variant52510, - Variant52511, - Variant52512, - Variant52513, - Variant52514, - Variant52515, - Variant52516, - Variant52517, - Variant52518, - Variant52519, - Variant52520, - Variant52521, - Variant52522, - Variant52523, - Variant52524, - Variant52525, - Variant52526, - Variant52527, - Variant52528, - Variant52529, - Variant52530, - Variant52531, - Variant52532, - Variant52533, - Variant52534, - Variant52535, - Variant52536, - Variant52537, - Variant52538, - Variant52539, - Variant52540, - Variant52541, - Variant52542, - Variant52543, - Variant52544, - Variant52545, - Variant52546, - Variant52547, - Variant52548, - Variant52549, - Variant52550, - Variant52551, - Variant52552, - Variant52553, - Variant52554, - Variant52555, - Variant52556, - Variant52557, - Variant52558, - Variant52559, - Variant52560, - Variant52561, - Variant52562, - Variant52563, - Variant52564, - Variant52565, - Variant52566, - Variant52567, - Variant52568, - Variant52569, - Variant52570, - Variant52571, - Variant52572, - Variant52573, - Variant52574, - Variant52575, - Variant52576, - Variant52577, - Variant52578, - Variant52579, - Variant52580, - Variant52581, - Variant52582, - Variant52583, - Variant52584, - Variant52585, - Variant52586, - Variant52587, - Variant52588, - Variant52589, - Variant52590, - Variant52591, - Variant52592, - Variant52593, - Variant52594, - Variant52595, - Variant52596, - Variant52597, - Variant52598, - Variant52599, - Variant52600, - Variant52601, - Variant52602, - Variant52603, - Variant52604, - Variant52605, - Variant52606, - Variant52607, - Variant52608, - Variant52609, - Variant52610, - Variant52611, - Variant52612, - Variant52613, - Variant52614, - Variant52615, - Variant52616, - Variant52617, - Variant52618, - Variant52619, - Variant52620, - Variant52621, - Variant52622, - Variant52623, - Variant52624, - Variant52625, - Variant52626, - Variant52627, - Variant52628, - Variant52629, - Variant52630, - Variant52631, - Variant52632, - Variant52633, - Variant52634, - Variant52635, - Variant52636, - Variant52637, - Variant52638, - Variant52639, - Variant52640, - Variant52641, - Variant52642, - Variant52643, - Variant52644, - Variant52645, - Variant52646, - Variant52647, - Variant52648, - Variant52649, - Variant52650, - Variant52651, - Variant52652, - Variant52653, - Variant52654, - Variant52655, - Variant52656, - Variant52657, - Variant52658, - Variant52659, - Variant52660, - Variant52661, - Variant52662, - Variant52663, - Variant52664, - Variant52665, - Variant52666, - Variant52667, - Variant52668, - Variant52669, - Variant52670, - Variant52671, - Variant52672, - Variant52673, - Variant52674, - Variant52675, - Variant52676, - Variant52677, - Variant52678, - Variant52679, - Variant52680, - Variant52681, - Variant52682, - Variant52683, - Variant52684, - Variant52685, - Variant52686, - Variant52687, - Variant52688, - Variant52689, - Variant52690, - Variant52691, - Variant52692, - Variant52693, - Variant52694, - Variant52695, - Variant52696, - Variant52697, - Variant52698, - Variant52699, - Variant52700, - Variant52701, - Variant52702, - Variant52703, - Variant52704, - Variant52705, - Variant52706, - Variant52707, - Variant52708, - Variant52709, - Variant52710, - Variant52711, - Variant52712, - Variant52713, - Variant52714, - Variant52715, - Variant52716, - Variant52717, - Variant52718, - Variant52719, - Variant52720, - Variant52721, - Variant52722, - Variant52723, - Variant52724, - Variant52725, - Variant52726, - Variant52727, - Variant52728, - Variant52729, - Variant52730, - Variant52731, - Variant52732, - Variant52733, - Variant52734, - Variant52735, - Variant52736, - Variant52737, - Variant52738, - Variant52739, - Variant52740, - Variant52741, - Variant52742, - Variant52743, - Variant52744, - Variant52745, - Variant52746, - Variant52747, - Variant52748, - Variant52749, - Variant52750, - Variant52751, - Variant52752, - Variant52753, - Variant52754, - Variant52755, - Variant52756, - Variant52757, - Variant52758, - Variant52759, - Variant52760, - Variant52761, - Variant52762, - Variant52763, - Variant52764, - Variant52765, - Variant52766, - Variant52767, - Variant52768, - Variant52769, - Variant52770, - Variant52771, - Variant52772, - Variant52773, - Variant52774, - Variant52775, - Variant52776, - Variant52777, - Variant52778, - Variant52779, - Variant52780, - Variant52781, - Variant52782, - Variant52783, - Variant52784, - Variant52785, - Variant52786, - Variant52787, - Variant52788, - Variant52789, - Variant52790, - Variant52791, - Variant52792, - Variant52793, - Variant52794, - Variant52795, - Variant52796, - Variant52797, - Variant52798, - Variant52799, - Variant52800, - Variant52801, - Variant52802, - Variant52803, - Variant52804, - Variant52805, - Variant52806, - Variant52807, - Variant52808, - Variant52809, - Variant52810, - Variant52811, - Variant52812, - Variant52813, - Variant52814, - Variant52815, - Variant52816, - Variant52817, - Variant52818, - Variant52819, - Variant52820, - Variant52821, - Variant52822, - Variant52823, - Variant52824, - Variant52825, - Variant52826, - Variant52827, - Variant52828, - Variant52829, - Variant52830, - Variant52831, - Variant52832, - Variant52833, - Variant52834, - Variant52835, - Variant52836, - Variant52837, - Variant52838, - Variant52839, - Variant52840, - Variant52841, - Variant52842, - Variant52843, - Variant52844, - Variant52845, - Variant52846, - Variant52847, - Variant52848, - Variant52849, - Variant52850, - Variant52851, - Variant52852, - Variant52853, - Variant52854, - Variant52855, - Variant52856, - Variant52857, - Variant52858, - Variant52859, - Variant52860, - Variant52861, - Variant52862, - Variant52863, - Variant52864, - Variant52865, - Variant52866, - Variant52867, - Variant52868, - Variant52869, - Variant52870, - Variant52871, - Variant52872, - Variant52873, - Variant52874, - Variant52875, - Variant52876, - Variant52877, - Variant52878, - Variant52879, - Variant52880, - Variant52881, - Variant52882, - Variant52883, - Variant52884, - Variant52885, - Variant52886, - Variant52887, - Variant52888, - Variant52889, - Variant52890, - Variant52891, - Variant52892, - Variant52893, - Variant52894, - Variant52895, - Variant52896, - Variant52897, - Variant52898, - Variant52899, - Variant52900, - Variant52901, - Variant52902, - Variant52903, - Variant52904, - Variant52905, - Variant52906, - Variant52907, - Variant52908, - Variant52909, - Variant52910, - Variant52911, - Variant52912, - Variant52913, - Variant52914, - Variant52915, - Variant52916, - Variant52917, - Variant52918, - Variant52919, - Variant52920, - Variant52921, - Variant52922, - Variant52923, - Variant52924, - Variant52925, - Variant52926, - Variant52927, - Variant52928, - Variant52929, - Variant52930, - Variant52931, - Variant52932, - Variant52933, - Variant52934, - Variant52935, - Variant52936, - Variant52937, - Variant52938, - Variant52939, - Variant52940, - Variant52941, - Variant52942, - Variant52943, - Variant52944, - Variant52945, - Variant52946, - Variant52947, - Variant52948, - Variant52949, - Variant52950, - Variant52951, - Variant52952, - Variant52953, - Variant52954, - Variant52955, - Variant52956, - Variant52957, - Variant52958, - Variant52959, - Variant52960, - Variant52961, - Variant52962, - Variant52963, - Variant52964, - Variant52965, - Variant52966, - Variant52967, - Variant52968, - Variant52969, - Variant52970, - Variant52971, - Variant52972, - Variant52973, - Variant52974, - Variant52975, - Variant52976, - Variant52977, - Variant52978, - Variant52979, - Variant52980, - Variant52981, - Variant52982, - Variant52983, - Variant52984, - Variant52985, - Variant52986, - Variant52987, - Variant52988, - Variant52989, - Variant52990, - Variant52991, - Variant52992, - Variant52993, - Variant52994, - Variant52995, - Variant52996, - Variant52997, - Variant52998, - Variant52999, - Variant53000, - Variant53001, - Variant53002, - Variant53003, - Variant53004, - Variant53005, - Variant53006, - Variant53007, - Variant53008, - Variant53009, - Variant53010, - Variant53011, - Variant53012, - Variant53013, - Variant53014, - Variant53015, - Variant53016, - Variant53017, - Variant53018, - Variant53019, - Variant53020, - Variant53021, - Variant53022, - Variant53023, - Variant53024, - Variant53025, - Variant53026, - Variant53027, - Variant53028, - Variant53029, - Variant53030, - Variant53031, - Variant53032, - Variant53033, - Variant53034, - Variant53035, - Variant53036, - Variant53037, - Variant53038, - Variant53039, - Variant53040, - Variant53041, - Variant53042, - Variant53043, - Variant53044, - Variant53045, - Variant53046, - Variant53047, - Variant53048, - Variant53049, - Variant53050, - Variant53051, - Variant53052, - Variant53053, - Variant53054, - Variant53055, - Variant53056, - Variant53057, - Variant53058, - Variant53059, - Variant53060, - Variant53061, - Variant53062, - Variant53063, - Variant53064, - Variant53065, - Variant53066, - Variant53067, - Variant53068, - Variant53069, - Variant53070, - Variant53071, - Variant53072, - Variant53073, - Variant53074, - Variant53075, - Variant53076, - Variant53077, - Variant53078, - Variant53079, - Variant53080, - Variant53081, - Variant53082, - Variant53083, - Variant53084, - Variant53085, - Variant53086, - Variant53087, - Variant53088, - Variant53089, - Variant53090, - Variant53091, - Variant53092, - Variant53093, - Variant53094, - Variant53095, - Variant53096, - Variant53097, - Variant53098, - Variant53099, - Variant53100, - Variant53101, - Variant53102, - Variant53103, - Variant53104, - Variant53105, - Variant53106, - Variant53107, - Variant53108, - Variant53109, - Variant53110, - Variant53111, - Variant53112, - Variant53113, - Variant53114, - Variant53115, - Variant53116, - Variant53117, - Variant53118, - Variant53119, - Variant53120, - Variant53121, - Variant53122, - Variant53123, - Variant53124, - Variant53125, - Variant53126, - Variant53127, - Variant53128, - Variant53129, - Variant53130, - Variant53131, - Variant53132, - Variant53133, - Variant53134, - Variant53135, - Variant53136, - Variant53137, - Variant53138, - Variant53139, - Variant53140, - Variant53141, - Variant53142, - Variant53143, - Variant53144, - Variant53145, - Variant53146, - Variant53147, - Variant53148, - Variant53149, - Variant53150, - Variant53151, - Variant53152, - Variant53153, - Variant53154, - Variant53155, - Variant53156, - Variant53157, - Variant53158, - Variant53159, - Variant53160, - Variant53161, - Variant53162, - Variant53163, - Variant53164, - Variant53165, - Variant53166, - Variant53167, - Variant53168, - Variant53169, - Variant53170, - Variant53171, - Variant53172, - Variant53173, - Variant53174, - Variant53175, - Variant53176, - Variant53177, - Variant53178, - Variant53179, - Variant53180, - Variant53181, - Variant53182, - Variant53183, - Variant53184, - Variant53185, - Variant53186, - Variant53187, - Variant53188, - Variant53189, - Variant53190, - Variant53191, - Variant53192, - Variant53193, - Variant53194, - Variant53195, - Variant53196, - Variant53197, - Variant53198, - Variant53199, - Variant53200, - Variant53201, - Variant53202, - Variant53203, - Variant53204, - Variant53205, - Variant53206, - Variant53207, - Variant53208, - Variant53209, - Variant53210, - Variant53211, - Variant53212, - Variant53213, - Variant53214, - Variant53215, - Variant53216, - Variant53217, - Variant53218, - Variant53219, - Variant53220, - Variant53221, - Variant53222, - Variant53223, - Variant53224, - Variant53225, - Variant53226, - Variant53227, - Variant53228, - Variant53229, - Variant53230, - Variant53231, - Variant53232, - Variant53233, - Variant53234, - Variant53235, - Variant53236, - Variant53237, - Variant53238, - Variant53239, - Variant53240, - Variant53241, - Variant53242, - Variant53243, - Variant53244, - Variant53245, - Variant53246, - Variant53247, - Variant53248, - Variant53249, - Variant53250, - Variant53251, - Variant53252, - Variant53253, - Variant53254, - Variant53255, - Variant53256, - Variant53257, - Variant53258, - Variant53259, - Variant53260, - Variant53261, - Variant53262, - Variant53263, - Variant53264, - Variant53265, - Variant53266, - Variant53267, - Variant53268, - Variant53269, - Variant53270, - Variant53271, - Variant53272, - Variant53273, - Variant53274, - Variant53275, - Variant53276, - Variant53277, - Variant53278, - Variant53279, - Variant53280, - Variant53281, - Variant53282, - Variant53283, - Variant53284, - Variant53285, - Variant53286, - Variant53287, - Variant53288, - Variant53289, - Variant53290, - Variant53291, - Variant53292, - Variant53293, - Variant53294, - Variant53295, - Variant53296, - Variant53297, - Variant53298, - Variant53299, - Variant53300, - Variant53301, - Variant53302, - Variant53303, - Variant53304, - Variant53305, - Variant53306, - Variant53307, - Variant53308, - Variant53309, - Variant53310, - Variant53311, - Variant53312, - Variant53313, - Variant53314, - Variant53315, - Variant53316, - Variant53317, - Variant53318, - Variant53319, - Variant53320, - Variant53321, - Variant53322, - Variant53323, - Variant53324, - Variant53325, - Variant53326, - Variant53327, - Variant53328, - Variant53329, - Variant53330, - Variant53331, - Variant53332, - Variant53333, - Variant53334, - Variant53335, - Variant53336, - Variant53337, - Variant53338, - Variant53339, - Variant53340, - Variant53341, - Variant53342, - Variant53343, - Variant53344, - Variant53345, - Variant53346, - Variant53347, - Variant53348, - Variant53349, - Variant53350, - Variant53351, - Variant53352, - Variant53353, - Variant53354, - Variant53355, - Variant53356, - Variant53357, - Variant53358, - Variant53359, - Variant53360, - Variant53361, - Variant53362, - Variant53363, - Variant53364, - Variant53365, - Variant53366, - Variant53367, - Variant53368, - Variant53369, - Variant53370, - Variant53371, - Variant53372, - Variant53373, - Variant53374, - Variant53375, - Variant53376, - Variant53377, - Variant53378, - Variant53379, - Variant53380, - Variant53381, - Variant53382, - Variant53383, - Variant53384, - Variant53385, - Variant53386, - Variant53387, - Variant53388, - Variant53389, - Variant53390, - Variant53391, - Variant53392, - Variant53393, - Variant53394, - Variant53395, - Variant53396, - Variant53397, - Variant53398, - Variant53399, - Variant53400, - Variant53401, - Variant53402, - Variant53403, - Variant53404, - Variant53405, - Variant53406, - Variant53407, - Variant53408, - Variant53409, - Variant53410, - Variant53411, - Variant53412, - Variant53413, - Variant53414, - Variant53415, - Variant53416, - Variant53417, - Variant53418, - Variant53419, - Variant53420, - Variant53421, - Variant53422, - Variant53423, - Variant53424, - Variant53425, - Variant53426, - Variant53427, - Variant53428, - Variant53429, - Variant53430, - Variant53431, - Variant53432, - Variant53433, - Variant53434, - Variant53435, - Variant53436, - Variant53437, - Variant53438, - Variant53439, - Variant53440, - Variant53441, - Variant53442, - Variant53443, - Variant53444, - Variant53445, - Variant53446, - Variant53447, - Variant53448, - Variant53449, - Variant53450, - Variant53451, - Variant53452, - Variant53453, - Variant53454, - Variant53455, - Variant53456, - Variant53457, - Variant53458, - Variant53459, - Variant53460, - Variant53461, - Variant53462, - Variant53463, - Variant53464, - Variant53465, - Variant53466, - Variant53467, - Variant53468, - Variant53469, - Variant53470, - Variant53471, - Variant53472, - Variant53473, - Variant53474, - Variant53475, - Variant53476, - Variant53477, - Variant53478, - Variant53479, - Variant53480, - Variant53481, - Variant53482, - Variant53483, - Variant53484, - Variant53485, - Variant53486, - Variant53487, - Variant53488, - Variant53489, - Variant53490, - Variant53491, - Variant53492, - Variant53493, - Variant53494, - Variant53495, - Variant53496, - Variant53497, - Variant53498, - Variant53499, - Variant53500, - Variant53501, - Variant53502, - Variant53503, - Variant53504, - Variant53505, - Variant53506, - Variant53507, - Variant53508, - Variant53509, - Variant53510, - Variant53511, - Variant53512, - Variant53513, - Variant53514, - Variant53515, - Variant53516, - Variant53517, - Variant53518, - Variant53519, - Variant53520, - Variant53521, - Variant53522, - Variant53523, - Variant53524, - Variant53525, - Variant53526, - Variant53527, - Variant53528, - Variant53529, - Variant53530, - Variant53531, - Variant53532, - Variant53533, - Variant53534, - Variant53535, - Variant53536, - Variant53537, - Variant53538, - Variant53539, - Variant53540, - Variant53541, - Variant53542, - Variant53543, - Variant53544, - Variant53545, - Variant53546, - Variant53547, - Variant53548, - Variant53549, - Variant53550, - Variant53551, - Variant53552, - Variant53553, - Variant53554, - Variant53555, - Variant53556, - Variant53557, - Variant53558, - Variant53559, - Variant53560, - Variant53561, - Variant53562, - Variant53563, - Variant53564, - Variant53565, - Variant53566, - Variant53567, - Variant53568, - Variant53569, - Variant53570, - Variant53571, - Variant53572, - Variant53573, - Variant53574, - Variant53575, - Variant53576, - Variant53577, - Variant53578, - Variant53579, - Variant53580, - Variant53581, - Variant53582, - Variant53583, - Variant53584, - Variant53585, - Variant53586, - Variant53587, - Variant53588, - Variant53589, - Variant53590, - Variant53591, - Variant53592, - Variant53593, - Variant53594, - Variant53595, - Variant53596, - Variant53597, - Variant53598, - Variant53599, - Variant53600, - Variant53601, - Variant53602, - Variant53603, - Variant53604, - Variant53605, - Variant53606, - Variant53607, - Variant53608, - Variant53609, - Variant53610, - Variant53611, - Variant53612, - Variant53613, - Variant53614, - Variant53615, - Variant53616, - Variant53617, - Variant53618, - Variant53619, - Variant53620, - Variant53621, - Variant53622, - Variant53623, - Variant53624, - Variant53625, - Variant53626, - Variant53627, - Variant53628, - Variant53629, - Variant53630, - Variant53631, - Variant53632, - Variant53633, - Variant53634, - Variant53635, - Variant53636, - Variant53637, - Variant53638, - Variant53639, - Variant53640, - Variant53641, - Variant53642, - Variant53643, - Variant53644, - Variant53645, - Variant53646, - Variant53647, - Variant53648, - Variant53649, - Variant53650, - Variant53651, - Variant53652, - Variant53653, - Variant53654, - Variant53655, - Variant53656, - Variant53657, - Variant53658, - Variant53659, - Variant53660, - Variant53661, - Variant53662, - Variant53663, - Variant53664, - Variant53665, - Variant53666, - Variant53667, - Variant53668, - Variant53669, - Variant53670, - Variant53671, - Variant53672, - Variant53673, - Variant53674, - Variant53675, - Variant53676, - Variant53677, - Variant53678, - Variant53679, - Variant53680, - Variant53681, - Variant53682, - Variant53683, - Variant53684, - Variant53685, - Variant53686, - Variant53687, - Variant53688, - Variant53689, - Variant53690, - Variant53691, - Variant53692, - Variant53693, - Variant53694, - Variant53695, - Variant53696, - Variant53697, - Variant53698, - Variant53699, - Variant53700, - Variant53701, - Variant53702, - Variant53703, - Variant53704, - Variant53705, - Variant53706, - Variant53707, - Variant53708, - Variant53709, - Variant53710, - Variant53711, - Variant53712, - Variant53713, - Variant53714, - Variant53715, - Variant53716, - Variant53717, - Variant53718, - Variant53719, - Variant53720, - Variant53721, - Variant53722, - Variant53723, - Variant53724, - Variant53725, - Variant53726, - Variant53727, - Variant53728, - Variant53729, - Variant53730, - Variant53731, - Variant53732, - Variant53733, - Variant53734, - Variant53735, - Variant53736, - Variant53737, - Variant53738, - Variant53739, - Variant53740, - Variant53741, - Variant53742, - Variant53743, - Variant53744, - Variant53745, - Variant53746, - Variant53747, - Variant53748, - Variant53749, - Variant53750, - Variant53751, - Variant53752, - Variant53753, - Variant53754, - Variant53755, - Variant53756, - Variant53757, - Variant53758, - Variant53759, - Variant53760, - Variant53761, - Variant53762, - Variant53763, - Variant53764, - Variant53765, - Variant53766, - Variant53767, - Variant53768, - Variant53769, - Variant53770, - Variant53771, - Variant53772, - Variant53773, - Variant53774, - Variant53775, - Variant53776, - Variant53777, - Variant53778, - Variant53779, - Variant53780, - Variant53781, - Variant53782, - Variant53783, - Variant53784, - Variant53785, - Variant53786, - Variant53787, - Variant53788, - Variant53789, - Variant53790, - Variant53791, - Variant53792, - Variant53793, - Variant53794, - Variant53795, - Variant53796, - Variant53797, - Variant53798, - Variant53799, - Variant53800, - Variant53801, - Variant53802, - Variant53803, - Variant53804, - Variant53805, - Variant53806, - Variant53807, - Variant53808, - Variant53809, - Variant53810, - Variant53811, - Variant53812, - Variant53813, - Variant53814, - Variant53815, - Variant53816, - Variant53817, - Variant53818, - Variant53819, - Variant53820, - Variant53821, - Variant53822, - Variant53823, - Variant53824, - Variant53825, - Variant53826, - Variant53827, - Variant53828, - Variant53829, - Variant53830, - Variant53831, - Variant53832, - Variant53833, - Variant53834, - Variant53835, - Variant53836, - Variant53837, - Variant53838, - Variant53839, - Variant53840, - Variant53841, - Variant53842, - Variant53843, - Variant53844, - Variant53845, - Variant53846, - Variant53847, - Variant53848, - Variant53849, - Variant53850, - Variant53851, - Variant53852, - Variant53853, - Variant53854, - Variant53855, - Variant53856, - Variant53857, - Variant53858, - Variant53859, - Variant53860, - Variant53861, - Variant53862, - Variant53863, - Variant53864, - Variant53865, - Variant53866, - Variant53867, - Variant53868, - Variant53869, - Variant53870, - Variant53871, - Variant53872, - Variant53873, - Variant53874, - Variant53875, - Variant53876, - Variant53877, - Variant53878, - Variant53879, - Variant53880, - Variant53881, - Variant53882, - Variant53883, - Variant53884, - Variant53885, - Variant53886, - Variant53887, - Variant53888, - Variant53889, - Variant53890, - Variant53891, - Variant53892, - Variant53893, - Variant53894, - Variant53895, - Variant53896, - Variant53897, - Variant53898, - Variant53899, - Variant53900, - Variant53901, - Variant53902, - Variant53903, - Variant53904, - Variant53905, - Variant53906, - Variant53907, - Variant53908, - Variant53909, - Variant53910, - Variant53911, - Variant53912, - Variant53913, - Variant53914, - Variant53915, - Variant53916, - Variant53917, - Variant53918, - Variant53919, - Variant53920, - Variant53921, - Variant53922, - Variant53923, - Variant53924, - Variant53925, - Variant53926, - Variant53927, - Variant53928, - Variant53929, - Variant53930, - Variant53931, - Variant53932, - Variant53933, - Variant53934, - Variant53935, - Variant53936, - Variant53937, - Variant53938, - Variant53939, - Variant53940, - Variant53941, - Variant53942, - Variant53943, - Variant53944, - Variant53945, - Variant53946, - Variant53947, - Variant53948, - Variant53949, - Variant53950, - Variant53951, - Variant53952, - Variant53953, - Variant53954, - Variant53955, - Variant53956, - Variant53957, - Variant53958, - Variant53959, - Variant53960, - Variant53961, - Variant53962, - Variant53963, - Variant53964, - Variant53965, - Variant53966, - Variant53967, - Variant53968, - Variant53969, - Variant53970, - Variant53971, - Variant53972, - Variant53973, - Variant53974, - Variant53975, - Variant53976, - Variant53977, - Variant53978, - Variant53979, - Variant53980, - Variant53981, - Variant53982, - Variant53983, - Variant53984, - Variant53985, - Variant53986, - Variant53987, - Variant53988, - Variant53989, - Variant53990, - Variant53991, - Variant53992, - Variant53993, - Variant53994, - Variant53995, - Variant53996, - Variant53997, - Variant53998, - Variant53999, - Variant54000, - Variant54001, - Variant54002, - Variant54003, - Variant54004, - Variant54005, - Variant54006, - Variant54007, - Variant54008, - Variant54009, - Variant54010, - Variant54011, - Variant54012, - Variant54013, - Variant54014, - Variant54015, - Variant54016, - Variant54017, - Variant54018, - Variant54019, - Variant54020, - Variant54021, - Variant54022, - Variant54023, - Variant54024, - Variant54025, - Variant54026, - Variant54027, - Variant54028, - Variant54029, - Variant54030, - Variant54031, - Variant54032, - Variant54033, - Variant54034, - Variant54035, - Variant54036, - Variant54037, - Variant54038, - Variant54039, - Variant54040, - Variant54041, - Variant54042, - Variant54043, - Variant54044, - Variant54045, - Variant54046, - Variant54047, - Variant54048, - Variant54049, - Variant54050, - Variant54051, - Variant54052, - Variant54053, - Variant54054, - Variant54055, - Variant54056, - Variant54057, - Variant54058, - Variant54059, - Variant54060, - Variant54061, - Variant54062, - Variant54063, - Variant54064, - Variant54065, - Variant54066, - Variant54067, - Variant54068, - Variant54069, - Variant54070, - Variant54071, - Variant54072, - Variant54073, - Variant54074, - Variant54075, - Variant54076, - Variant54077, - Variant54078, - Variant54079, - Variant54080, - Variant54081, - Variant54082, - Variant54083, - Variant54084, - Variant54085, - Variant54086, - Variant54087, - Variant54088, - Variant54089, - Variant54090, - Variant54091, - Variant54092, - Variant54093, - Variant54094, - Variant54095, - Variant54096, - Variant54097, - Variant54098, - Variant54099, - Variant54100, - Variant54101, - Variant54102, - Variant54103, - Variant54104, - Variant54105, - Variant54106, - Variant54107, - Variant54108, - Variant54109, - Variant54110, - Variant54111, - Variant54112, - Variant54113, - Variant54114, - Variant54115, - Variant54116, - Variant54117, - Variant54118, - Variant54119, - Variant54120, - Variant54121, - Variant54122, - Variant54123, - Variant54124, - Variant54125, - Variant54126, - Variant54127, - Variant54128, - Variant54129, - Variant54130, - Variant54131, - Variant54132, - Variant54133, - Variant54134, - Variant54135, - Variant54136, - Variant54137, - Variant54138, - Variant54139, - Variant54140, - Variant54141, - Variant54142, - Variant54143, - Variant54144, - Variant54145, - Variant54146, - Variant54147, - Variant54148, - Variant54149, - Variant54150, - Variant54151, - Variant54152, - Variant54153, - Variant54154, - Variant54155, - Variant54156, - Variant54157, - Variant54158, - Variant54159, - Variant54160, - Variant54161, - Variant54162, - Variant54163, - Variant54164, - Variant54165, - Variant54166, - Variant54167, - Variant54168, - Variant54169, - Variant54170, - Variant54171, - Variant54172, - Variant54173, - Variant54174, - Variant54175, - Variant54176, - Variant54177, - Variant54178, - Variant54179, - Variant54180, - Variant54181, - Variant54182, - Variant54183, - Variant54184, - Variant54185, - Variant54186, - Variant54187, - Variant54188, - Variant54189, - Variant54190, - Variant54191, - Variant54192, - Variant54193, - Variant54194, - Variant54195, - Variant54196, - Variant54197, - Variant54198, - Variant54199, - Variant54200, - Variant54201, - Variant54202, - Variant54203, - Variant54204, - Variant54205, - Variant54206, - Variant54207, - Variant54208, - Variant54209, - Variant54210, - Variant54211, - Variant54212, - Variant54213, - Variant54214, - Variant54215, - Variant54216, - Variant54217, - Variant54218, - Variant54219, - Variant54220, - Variant54221, - Variant54222, - Variant54223, - Variant54224, - Variant54225, - Variant54226, - Variant54227, - Variant54228, - Variant54229, - Variant54230, - Variant54231, - Variant54232, - Variant54233, - Variant54234, - Variant54235, - Variant54236, - Variant54237, - Variant54238, - Variant54239, - Variant54240, - Variant54241, - Variant54242, - Variant54243, - Variant54244, - Variant54245, - Variant54246, - Variant54247, - Variant54248, - Variant54249, - Variant54250, - Variant54251, - Variant54252, - Variant54253, - Variant54254, - Variant54255, - Variant54256, - Variant54257, - Variant54258, - Variant54259, - Variant54260, - Variant54261, - Variant54262, - Variant54263, - Variant54264, - Variant54265, - Variant54266, - Variant54267, - Variant54268, - Variant54269, - Variant54270, - Variant54271, - Variant54272, - Variant54273, - Variant54274, - Variant54275, - Variant54276, - Variant54277, - Variant54278, - Variant54279, - Variant54280, - Variant54281, - Variant54282, - Variant54283, - Variant54284, - Variant54285, - Variant54286, - Variant54287, - Variant54288, - Variant54289, - Variant54290, - Variant54291, - Variant54292, - Variant54293, - Variant54294, - Variant54295, - Variant54296, - Variant54297, - Variant54298, - Variant54299, - Variant54300, - Variant54301, - Variant54302, - Variant54303, - Variant54304, - Variant54305, - Variant54306, - Variant54307, - Variant54308, - Variant54309, - Variant54310, - Variant54311, - Variant54312, - Variant54313, - Variant54314, - Variant54315, - Variant54316, - Variant54317, - Variant54318, - Variant54319, - Variant54320, - Variant54321, - Variant54322, - Variant54323, - Variant54324, - Variant54325, - Variant54326, - Variant54327, - Variant54328, - Variant54329, - Variant54330, - Variant54331, - Variant54332, - Variant54333, - Variant54334, - Variant54335, - Variant54336, - Variant54337, - Variant54338, - Variant54339, - Variant54340, - Variant54341, - Variant54342, - Variant54343, - Variant54344, - Variant54345, - Variant54346, - Variant54347, - Variant54348, - Variant54349, - Variant54350, - Variant54351, - Variant54352, - Variant54353, - Variant54354, - Variant54355, - Variant54356, - Variant54357, - Variant54358, - Variant54359, - Variant54360, - Variant54361, - Variant54362, - Variant54363, - Variant54364, - Variant54365, - Variant54366, - Variant54367, - Variant54368, - Variant54369, - Variant54370, - Variant54371, - Variant54372, - Variant54373, - Variant54374, - Variant54375, - Variant54376, - Variant54377, - Variant54378, - Variant54379, - Variant54380, - Variant54381, - Variant54382, - Variant54383, - Variant54384, - Variant54385, - Variant54386, - Variant54387, - Variant54388, - Variant54389, - Variant54390, - Variant54391, - Variant54392, - Variant54393, - Variant54394, - Variant54395, - Variant54396, - Variant54397, - Variant54398, - Variant54399, - Variant54400, - Variant54401, - Variant54402, - Variant54403, - Variant54404, - Variant54405, - Variant54406, - Variant54407, - Variant54408, - Variant54409, - Variant54410, - Variant54411, - Variant54412, - Variant54413, - Variant54414, - Variant54415, - Variant54416, - Variant54417, - Variant54418, - Variant54419, - Variant54420, - Variant54421, - Variant54422, - Variant54423, - Variant54424, - Variant54425, - Variant54426, - Variant54427, - Variant54428, - Variant54429, - Variant54430, - Variant54431, - Variant54432, - Variant54433, - Variant54434, - Variant54435, - Variant54436, - Variant54437, - Variant54438, - Variant54439, - Variant54440, - Variant54441, - Variant54442, - Variant54443, - Variant54444, - Variant54445, - Variant54446, - Variant54447, - Variant54448, - Variant54449, - Variant54450, - Variant54451, - Variant54452, - Variant54453, - Variant54454, - Variant54455, - Variant54456, - Variant54457, - Variant54458, - Variant54459, - Variant54460, - Variant54461, - Variant54462, - Variant54463, - Variant54464, - Variant54465, - Variant54466, - Variant54467, - Variant54468, - Variant54469, - Variant54470, - Variant54471, - Variant54472, - Variant54473, - Variant54474, - Variant54475, - Variant54476, - Variant54477, - Variant54478, - Variant54479, - Variant54480, - Variant54481, - Variant54482, - Variant54483, - Variant54484, - Variant54485, - Variant54486, - Variant54487, - Variant54488, - Variant54489, - Variant54490, - Variant54491, - Variant54492, - Variant54493, - Variant54494, - Variant54495, - Variant54496, - Variant54497, - Variant54498, - Variant54499, - Variant54500, - Variant54501, - Variant54502, - Variant54503, - Variant54504, - Variant54505, - Variant54506, - Variant54507, - Variant54508, - Variant54509, - Variant54510, - Variant54511, - Variant54512, - Variant54513, - Variant54514, - Variant54515, - Variant54516, - Variant54517, - Variant54518, - Variant54519, - Variant54520, - Variant54521, - Variant54522, - Variant54523, - Variant54524, - Variant54525, - Variant54526, - Variant54527, - Variant54528, - Variant54529, - Variant54530, - Variant54531, - Variant54532, - Variant54533, - Variant54534, - Variant54535, - Variant54536, - Variant54537, - Variant54538, - Variant54539, - Variant54540, - Variant54541, - Variant54542, - Variant54543, - Variant54544, - Variant54545, - Variant54546, - Variant54547, - Variant54548, - Variant54549, - Variant54550, - Variant54551, - Variant54552, - Variant54553, - Variant54554, - Variant54555, - Variant54556, - Variant54557, - Variant54558, - Variant54559, - Variant54560, - Variant54561, - Variant54562, - Variant54563, - Variant54564, - Variant54565, - Variant54566, - Variant54567, - Variant54568, - Variant54569, - Variant54570, - Variant54571, - Variant54572, - Variant54573, - Variant54574, - Variant54575, - Variant54576, - Variant54577, - Variant54578, - Variant54579, - Variant54580, - Variant54581, - Variant54582, - Variant54583, - Variant54584, - Variant54585, - Variant54586, - Variant54587, - Variant54588, - Variant54589, - Variant54590, - Variant54591, - Variant54592, - Variant54593, - Variant54594, - Variant54595, - Variant54596, - Variant54597, - Variant54598, - Variant54599, - Variant54600, - Variant54601, - Variant54602, - Variant54603, - Variant54604, - Variant54605, - Variant54606, - Variant54607, - Variant54608, - Variant54609, - Variant54610, - Variant54611, - Variant54612, - Variant54613, - Variant54614, - Variant54615, - Variant54616, - Variant54617, - Variant54618, - Variant54619, - Variant54620, - Variant54621, - Variant54622, - Variant54623, - Variant54624, - Variant54625, - Variant54626, - Variant54627, - Variant54628, - Variant54629, - Variant54630, - Variant54631, - Variant54632, - Variant54633, - Variant54634, - Variant54635, - Variant54636, - Variant54637, - Variant54638, - Variant54639, - Variant54640, - Variant54641, - Variant54642, - Variant54643, - Variant54644, - Variant54645, - Variant54646, - Variant54647, - Variant54648, - Variant54649, - Variant54650, - Variant54651, - Variant54652, - Variant54653, - Variant54654, - Variant54655, - Variant54656, - Variant54657, - Variant54658, - Variant54659, - Variant54660, - Variant54661, - Variant54662, - Variant54663, - Variant54664, - Variant54665, - Variant54666, - Variant54667, - Variant54668, - Variant54669, - Variant54670, - Variant54671, - Variant54672, - Variant54673, - Variant54674, - Variant54675, - Variant54676, - Variant54677, - Variant54678, - Variant54679, - Variant54680, - Variant54681, - Variant54682, - Variant54683, - Variant54684, - Variant54685, - Variant54686, - Variant54687, - Variant54688, - Variant54689, - Variant54690, - Variant54691, - Variant54692, - Variant54693, - Variant54694, - Variant54695, - Variant54696, - Variant54697, - Variant54698, - Variant54699, - Variant54700, - Variant54701, - Variant54702, - Variant54703, - Variant54704, - Variant54705, - Variant54706, - Variant54707, - Variant54708, - Variant54709, - Variant54710, - Variant54711, - Variant54712, - Variant54713, - Variant54714, - Variant54715, - Variant54716, - Variant54717, - Variant54718, - Variant54719, - Variant54720, - Variant54721, - Variant54722, - Variant54723, - Variant54724, - Variant54725, - Variant54726, - Variant54727, - Variant54728, - Variant54729, - Variant54730, - Variant54731, - Variant54732, - Variant54733, - Variant54734, - Variant54735, - Variant54736, - Variant54737, - Variant54738, - Variant54739, - Variant54740, - Variant54741, - Variant54742, - Variant54743, - Variant54744, - Variant54745, - Variant54746, - Variant54747, - Variant54748, - Variant54749, - Variant54750, - Variant54751, - Variant54752, - Variant54753, - Variant54754, - Variant54755, - Variant54756, - Variant54757, - Variant54758, - Variant54759, - Variant54760, - Variant54761, - Variant54762, - Variant54763, - Variant54764, - Variant54765, - Variant54766, - Variant54767, - Variant54768, - Variant54769, - Variant54770, - Variant54771, - Variant54772, - Variant54773, - Variant54774, - Variant54775, - Variant54776, - Variant54777, - Variant54778, - Variant54779, - Variant54780, - Variant54781, - Variant54782, - Variant54783, - Variant54784, - Variant54785, - Variant54786, - Variant54787, - Variant54788, - Variant54789, - Variant54790, - Variant54791, - Variant54792, - Variant54793, - Variant54794, - Variant54795, - Variant54796, - Variant54797, - Variant54798, - Variant54799, - Variant54800, - Variant54801, - Variant54802, - Variant54803, - Variant54804, - Variant54805, - Variant54806, - Variant54807, - Variant54808, - Variant54809, - Variant54810, - Variant54811, - Variant54812, - Variant54813, - Variant54814, - Variant54815, - Variant54816, - Variant54817, - Variant54818, - Variant54819, - Variant54820, - Variant54821, - Variant54822, - Variant54823, - Variant54824, - Variant54825, - Variant54826, - Variant54827, - Variant54828, - Variant54829, - Variant54830, - Variant54831, - Variant54832, - Variant54833, - Variant54834, - Variant54835, - Variant54836, - Variant54837, - Variant54838, - Variant54839, - Variant54840, - Variant54841, - Variant54842, - Variant54843, - Variant54844, - Variant54845, - Variant54846, - Variant54847, - Variant54848, - Variant54849, - Variant54850, - Variant54851, - Variant54852, - Variant54853, - Variant54854, - Variant54855, - Variant54856, - Variant54857, - Variant54858, - Variant54859, - Variant54860, - Variant54861, - Variant54862, - Variant54863, - Variant54864, - Variant54865, - Variant54866, - Variant54867, - Variant54868, - Variant54869, - Variant54870, - Variant54871, - Variant54872, - Variant54873, - Variant54874, - Variant54875, - Variant54876, - Variant54877, - Variant54878, - Variant54879, - Variant54880, - Variant54881, - Variant54882, - Variant54883, - Variant54884, - Variant54885, - Variant54886, - Variant54887, - Variant54888, - Variant54889, - Variant54890, - Variant54891, - Variant54892, - Variant54893, - Variant54894, - Variant54895, - Variant54896, - Variant54897, - Variant54898, - Variant54899, - Variant54900, - Variant54901, - Variant54902, - Variant54903, - Variant54904, - Variant54905, - Variant54906, - Variant54907, - Variant54908, - Variant54909, - Variant54910, - Variant54911, - Variant54912, - Variant54913, - Variant54914, - Variant54915, - Variant54916, - Variant54917, - Variant54918, - Variant54919, - Variant54920, - Variant54921, - Variant54922, - Variant54923, - Variant54924, - Variant54925, - Variant54926, - Variant54927, - Variant54928, - Variant54929, - Variant54930, - Variant54931, - Variant54932, - Variant54933, - Variant54934, - Variant54935, - Variant54936, - Variant54937, - Variant54938, - Variant54939, - Variant54940, - Variant54941, - Variant54942, - Variant54943, - Variant54944, - Variant54945, - Variant54946, - Variant54947, - Variant54948, - Variant54949, - Variant54950, - Variant54951, - Variant54952, - Variant54953, - Variant54954, - Variant54955, - Variant54956, - Variant54957, - Variant54958, - Variant54959, - Variant54960, - Variant54961, - Variant54962, - Variant54963, - Variant54964, - Variant54965, - Variant54966, - Variant54967, - Variant54968, - Variant54969, - Variant54970, - Variant54971, - Variant54972, - Variant54973, - Variant54974, - Variant54975, - Variant54976, - Variant54977, - Variant54978, - Variant54979, - Variant54980, - Variant54981, - Variant54982, - Variant54983, - Variant54984, - Variant54985, - Variant54986, - Variant54987, - Variant54988, - Variant54989, - Variant54990, - Variant54991, - Variant54992, - Variant54993, - Variant54994, - Variant54995, - Variant54996, - Variant54997, - Variant54998, - Variant54999, - Variant55000, - Variant55001, - Variant55002, - Variant55003, - Variant55004, - Variant55005, - Variant55006, - Variant55007, - Variant55008, - Variant55009, - Variant55010, - Variant55011, - Variant55012, - Variant55013, - Variant55014, - Variant55015, - Variant55016, - Variant55017, - Variant55018, - Variant55019, - Variant55020, - Variant55021, - Variant55022, - Variant55023, - Variant55024, - Variant55025, - Variant55026, - Variant55027, - Variant55028, - Variant55029, - Variant55030, - Variant55031, - Variant55032, - Variant55033, - Variant55034, - Variant55035, - Variant55036, - Variant55037, - Variant55038, - Variant55039, - Variant55040, - Variant55041, - Variant55042, - Variant55043, - Variant55044, - Variant55045, - Variant55046, - Variant55047, - Variant55048, - Variant55049, - Variant55050, - Variant55051, - Variant55052, - Variant55053, - Variant55054, - Variant55055, - Variant55056, - Variant55057, - Variant55058, - Variant55059, - Variant55060, - Variant55061, - Variant55062, - Variant55063, - Variant55064, - Variant55065, - Variant55066, - Variant55067, - Variant55068, - Variant55069, - Variant55070, - Variant55071, - Variant55072, - Variant55073, - Variant55074, - Variant55075, - Variant55076, - Variant55077, - Variant55078, - Variant55079, - Variant55080, - Variant55081, - Variant55082, - Variant55083, - Variant55084, - Variant55085, - Variant55086, - Variant55087, - Variant55088, - Variant55089, - Variant55090, - Variant55091, - Variant55092, - Variant55093, - Variant55094, - Variant55095, - Variant55096, - Variant55097, - Variant55098, - Variant55099, - Variant55100, - Variant55101, - Variant55102, - Variant55103, - Variant55104, - Variant55105, - Variant55106, - Variant55107, - Variant55108, - Variant55109, - Variant55110, - Variant55111, - Variant55112, - Variant55113, - Variant55114, - Variant55115, - Variant55116, - Variant55117, - Variant55118, - Variant55119, - Variant55120, - Variant55121, - Variant55122, - Variant55123, - Variant55124, - Variant55125, - Variant55126, - Variant55127, - Variant55128, - Variant55129, - Variant55130, - Variant55131, - Variant55132, - Variant55133, - Variant55134, - Variant55135, - Variant55136, - Variant55137, - Variant55138, - Variant55139, - Variant55140, - Variant55141, - Variant55142, - Variant55143, - Variant55144, - Variant55145, - Variant55146, - Variant55147, - Variant55148, - Variant55149, - Variant55150, - Variant55151, - Variant55152, - Variant55153, - Variant55154, - Variant55155, - Variant55156, - Variant55157, - Variant55158, - Variant55159, - Variant55160, - Variant55161, - Variant55162, - Variant55163, - Variant55164, - Variant55165, - Variant55166, - Variant55167, - Variant55168, - Variant55169, - Variant55170, - Variant55171, - Variant55172, - Variant55173, - Variant55174, - Variant55175, - Variant55176, - Variant55177, - Variant55178, - Variant55179, - Variant55180, - Variant55181, - Variant55182, - Variant55183, - Variant55184, - Variant55185, - Variant55186, - Variant55187, - Variant55188, - Variant55189, - Variant55190, - Variant55191, - Variant55192, - Variant55193, - Variant55194, - Variant55195, - Variant55196, - Variant55197, - Variant55198, - Variant55199, - Variant55200, - Variant55201, - Variant55202, - Variant55203, - Variant55204, - Variant55205, - Variant55206, - Variant55207, - Variant55208, - Variant55209, - Variant55210, - Variant55211, - Variant55212, - Variant55213, - Variant55214, - Variant55215, - Variant55216, - Variant55217, - Variant55218, - Variant55219, - Variant55220, - Variant55221, - Variant55222, - Variant55223, - Variant55224, - Variant55225, - Variant55226, - Variant55227, - Variant55228, - Variant55229, - Variant55230, - Variant55231, - Variant55232, - Variant55233, - Variant55234, - Variant55235, - Variant55236, - Variant55237, - Variant55238, - Variant55239, - Variant55240, - Variant55241, - Variant55242, - Variant55243, - Variant55244, - Variant55245, - Variant55246, - Variant55247, - Variant55248, - Variant55249, - Variant55250, - Variant55251, - Variant55252, - Variant55253, - Variant55254, - Variant55255, - Variant55256, - Variant55257, - Variant55258, - Variant55259, - Variant55260, - Variant55261, - Variant55262, - Variant55263, - Variant55264, - Variant55265, - Variant55266, - Variant55267, - Variant55268, - Variant55269, - Variant55270, - Variant55271, - Variant55272, - Variant55273, - Variant55274, - Variant55275, - Variant55276, - Variant55277, - Variant55278, - Variant55279, - Variant55280, - Variant55281, - Variant55282, - Variant55283, - Variant55284, - Variant55285, - Variant55286, - Variant55287, - Variant55288, - Variant55289, - Variant55290, - Variant55291, - Variant55292, - Variant55293, - Variant55294, - Variant55295, - Variant55296, - Variant55297, - Variant55298, - Variant55299, - Variant55300, - Variant55301, - Variant55302, - Variant55303, - Variant55304, - Variant55305, - Variant55306, - Variant55307, - Variant55308, - Variant55309, - Variant55310, - Variant55311, - Variant55312, - Variant55313, - Variant55314, - Variant55315, - Variant55316, - Variant55317, - Variant55318, - Variant55319, - Variant55320, - Variant55321, - Variant55322, - Variant55323, - Variant55324, - Variant55325, - Variant55326, - Variant55327, - Variant55328, - Variant55329, - Variant55330, - Variant55331, - Variant55332, - Variant55333, - Variant55334, - Variant55335, - Variant55336, - Variant55337, - Variant55338, - Variant55339, - Variant55340, - Variant55341, - Variant55342, - Variant55343, - Variant55344, - Variant55345, - Variant55346, - Variant55347, - Variant55348, - Variant55349, - Variant55350, - Variant55351, - Variant55352, - Variant55353, - Variant55354, - Variant55355, - Variant55356, - Variant55357, - Variant55358, - Variant55359, - Variant55360, - Variant55361, - Variant55362, - Variant55363, - Variant55364, - Variant55365, - Variant55366, - Variant55367, - Variant55368, - Variant55369, - Variant55370, - Variant55371, - Variant55372, - Variant55373, - Variant55374, - Variant55375, - Variant55376, - Variant55377, - Variant55378, - Variant55379, - Variant55380, - Variant55381, - Variant55382, - Variant55383, - Variant55384, - Variant55385, - Variant55386, - Variant55387, - Variant55388, - Variant55389, - Variant55390, - Variant55391, - Variant55392, - Variant55393, - Variant55394, - Variant55395, - Variant55396, - Variant55397, - Variant55398, - Variant55399, - Variant55400, - Variant55401, - Variant55402, - Variant55403, - Variant55404, - Variant55405, - Variant55406, - Variant55407, - Variant55408, - Variant55409, - Variant55410, - Variant55411, - Variant55412, - Variant55413, - Variant55414, - Variant55415, - Variant55416, - Variant55417, - Variant55418, - Variant55419, - Variant55420, - Variant55421, - Variant55422, - Variant55423, - Variant55424, - Variant55425, - Variant55426, - Variant55427, - Variant55428, - Variant55429, - Variant55430, - Variant55431, - Variant55432, - Variant55433, - Variant55434, - Variant55435, - Variant55436, - Variant55437, - Variant55438, - Variant55439, - Variant55440, - Variant55441, - Variant55442, - Variant55443, - Variant55444, - Variant55445, - Variant55446, - Variant55447, - Variant55448, - Variant55449, - Variant55450, - Variant55451, - Variant55452, - Variant55453, - Variant55454, - Variant55455, - Variant55456, - Variant55457, - Variant55458, - Variant55459, - Variant55460, - Variant55461, - Variant55462, - Variant55463, - Variant55464, - Variant55465, - Variant55466, - Variant55467, - Variant55468, - Variant55469, - Variant55470, - Variant55471, - Variant55472, - Variant55473, - Variant55474, - Variant55475, - Variant55476, - Variant55477, - Variant55478, - Variant55479, - Variant55480, - Variant55481, - Variant55482, - Variant55483, - Variant55484, - Variant55485, - Variant55486, - Variant55487, - Variant55488, - Variant55489, - Variant55490, - Variant55491, - Variant55492, - Variant55493, - Variant55494, - Variant55495, - Variant55496, - Variant55497, - Variant55498, - Variant55499, - Variant55500, - Variant55501, - Variant55502, - Variant55503, - Variant55504, - Variant55505, - Variant55506, - Variant55507, - Variant55508, - Variant55509, - Variant55510, - Variant55511, - Variant55512, - Variant55513, - Variant55514, - Variant55515, - Variant55516, - Variant55517, - Variant55518, - Variant55519, - Variant55520, - Variant55521, - Variant55522, - Variant55523, - Variant55524, - Variant55525, - Variant55526, - Variant55527, - Variant55528, - Variant55529, - Variant55530, - Variant55531, - Variant55532, - Variant55533, - Variant55534, - Variant55535, - Variant55536, - Variant55537, - Variant55538, - Variant55539, - Variant55540, - Variant55541, - Variant55542, - Variant55543, - Variant55544, - Variant55545, - Variant55546, - Variant55547, - Variant55548, - Variant55549, - Variant55550, - Variant55551, - Variant55552, - Variant55553, - Variant55554, - Variant55555, - Variant55556, - Variant55557, - Variant55558, - Variant55559, - Variant55560, - Variant55561, - Variant55562, - Variant55563, - Variant55564, - Variant55565, - Variant55566, - Variant55567, - Variant55568, - Variant55569, - Variant55570, - Variant55571, - Variant55572, - Variant55573, - Variant55574, - Variant55575, - Variant55576, - Variant55577, - Variant55578, - Variant55579, - Variant55580, - Variant55581, - Variant55582, - Variant55583, - Variant55584, - Variant55585, - Variant55586, - Variant55587, - Variant55588, - Variant55589, - Variant55590, - Variant55591, - Variant55592, - Variant55593, - Variant55594, - Variant55595, - Variant55596, - Variant55597, - Variant55598, - Variant55599, - Variant55600, - Variant55601, - Variant55602, - Variant55603, - Variant55604, - Variant55605, - Variant55606, - Variant55607, - Variant55608, - Variant55609, - Variant55610, - Variant55611, - Variant55612, - Variant55613, - Variant55614, - Variant55615, - Variant55616, - Variant55617, - Variant55618, - Variant55619, - Variant55620, - Variant55621, - Variant55622, - Variant55623, - Variant55624, - Variant55625, - Variant55626, - Variant55627, - Variant55628, - Variant55629, - Variant55630, - Variant55631, - Variant55632, - Variant55633, - Variant55634, - Variant55635, - Variant55636, - Variant55637, - Variant55638, - Variant55639, - Variant55640, - Variant55641, - Variant55642, - Variant55643, - Variant55644, - Variant55645, - Variant55646, - Variant55647, - Variant55648, - Variant55649, - Variant55650, - Variant55651, - Variant55652, - Variant55653, - Variant55654, - Variant55655, - Variant55656, - Variant55657, - Variant55658, - Variant55659, - Variant55660, - Variant55661, - Variant55662, - Variant55663, - Variant55664, - Variant55665, - Variant55666, - Variant55667, - Variant55668, - Variant55669, - Variant55670, - Variant55671, - Variant55672, - Variant55673, - Variant55674, - Variant55675, - Variant55676, - Variant55677, - Variant55678, - Variant55679, - Variant55680, - Variant55681, - Variant55682, - Variant55683, - Variant55684, - Variant55685, - Variant55686, - Variant55687, - Variant55688, - Variant55689, - Variant55690, - Variant55691, - Variant55692, - Variant55693, - Variant55694, - Variant55695, - Variant55696, - Variant55697, - Variant55698, - Variant55699, - Variant55700, - Variant55701, - Variant55702, - Variant55703, - Variant55704, - Variant55705, - Variant55706, - Variant55707, - Variant55708, - Variant55709, - Variant55710, - Variant55711, - Variant55712, - Variant55713, - Variant55714, - Variant55715, - Variant55716, - Variant55717, - Variant55718, - Variant55719, - Variant55720, - Variant55721, - Variant55722, - Variant55723, - Variant55724, - Variant55725, - Variant55726, - Variant55727, - Variant55728, - Variant55729, - Variant55730, - Variant55731, - Variant55732, - Variant55733, - Variant55734, - Variant55735, - Variant55736, - Variant55737, - Variant55738, - Variant55739, - Variant55740, - Variant55741, - Variant55742, - Variant55743, - Variant55744, - Variant55745, - Variant55746, - Variant55747, - Variant55748, - Variant55749, - Variant55750, - Variant55751, - Variant55752, - Variant55753, - Variant55754, - Variant55755, - Variant55756, - Variant55757, - Variant55758, - Variant55759, - Variant55760, - Variant55761, - Variant55762, - Variant55763, - Variant55764, - Variant55765, - Variant55766, - Variant55767, - Variant55768, - Variant55769, - Variant55770, - Variant55771, - Variant55772, - Variant55773, - Variant55774, - Variant55775, - Variant55776, - Variant55777, - Variant55778, - Variant55779, - Variant55780, - Variant55781, - Variant55782, - Variant55783, - Variant55784, - Variant55785, - Variant55786, - Variant55787, - Variant55788, - Variant55789, - Variant55790, - Variant55791, - Variant55792, - Variant55793, - Variant55794, - Variant55795, - Variant55796, - Variant55797, - Variant55798, - Variant55799, - Variant55800, - Variant55801, - Variant55802, - Variant55803, - Variant55804, - Variant55805, - Variant55806, - Variant55807, - Variant55808, - Variant55809, - Variant55810, - Variant55811, - Variant55812, - Variant55813, - Variant55814, - Variant55815, - Variant55816, - Variant55817, - Variant55818, - Variant55819, - Variant55820, - Variant55821, - Variant55822, - Variant55823, - Variant55824, - Variant55825, - Variant55826, - Variant55827, - Variant55828, - Variant55829, - Variant55830, - Variant55831, - Variant55832, - Variant55833, - Variant55834, - Variant55835, - Variant55836, - Variant55837, - Variant55838, - Variant55839, - Variant55840, - Variant55841, - Variant55842, - Variant55843, - Variant55844, - Variant55845, - Variant55846, - Variant55847, - Variant55848, - Variant55849, - Variant55850, - Variant55851, - Variant55852, - Variant55853, - Variant55854, - Variant55855, - Variant55856, - Variant55857, - Variant55858, - Variant55859, - Variant55860, - Variant55861, - Variant55862, - Variant55863, - Variant55864, - Variant55865, - Variant55866, - Variant55867, - Variant55868, - Variant55869, - Variant55870, - Variant55871, - Variant55872, - Variant55873, - Variant55874, - Variant55875, - Variant55876, - Variant55877, - Variant55878, - Variant55879, - Variant55880, - Variant55881, - Variant55882, - Variant55883, - Variant55884, - Variant55885, - Variant55886, - Variant55887, - Variant55888, - Variant55889, - Variant55890, - Variant55891, - Variant55892, - Variant55893, - Variant55894, - Variant55895, - Variant55896, - Variant55897, - Variant55898, - Variant55899, - Variant55900, - Variant55901, - Variant55902, - Variant55903, - Variant55904, - Variant55905, - Variant55906, - Variant55907, - Variant55908, - Variant55909, - Variant55910, - Variant55911, - Variant55912, - Variant55913, - Variant55914, - Variant55915, - Variant55916, - Variant55917, - Variant55918, - Variant55919, - Variant55920, - Variant55921, - Variant55922, - Variant55923, - Variant55924, - Variant55925, - Variant55926, - Variant55927, - Variant55928, - Variant55929, - Variant55930, - Variant55931, - Variant55932, - Variant55933, - Variant55934, - Variant55935, - Variant55936, - Variant55937, - Variant55938, - Variant55939, - Variant55940, - Variant55941, - Variant55942, - Variant55943, - Variant55944, - Variant55945, - Variant55946, - Variant55947, - Variant55948, - Variant55949, - Variant55950, - Variant55951, - Variant55952, - Variant55953, - Variant55954, - Variant55955, - Variant55956, - Variant55957, - Variant55958, - Variant55959, - Variant55960, - Variant55961, - Variant55962, - Variant55963, - Variant55964, - Variant55965, - Variant55966, - Variant55967, - Variant55968, - Variant55969, - Variant55970, - Variant55971, - Variant55972, - Variant55973, - Variant55974, - Variant55975, - Variant55976, - Variant55977, - Variant55978, - Variant55979, - Variant55980, - Variant55981, - Variant55982, - Variant55983, - Variant55984, - Variant55985, - Variant55986, - Variant55987, - Variant55988, - Variant55989, - Variant55990, - Variant55991, - Variant55992, - Variant55993, - Variant55994, - Variant55995, - Variant55996, - Variant55997, - Variant55998, - Variant55999, - Variant56000, - Variant56001, - Variant56002, - Variant56003, - Variant56004, - Variant56005, - Variant56006, - Variant56007, - Variant56008, - Variant56009, - Variant56010, - Variant56011, - Variant56012, - Variant56013, - Variant56014, - Variant56015, - Variant56016, - Variant56017, - Variant56018, - Variant56019, - Variant56020, - Variant56021, - Variant56022, - Variant56023, - Variant56024, - Variant56025, - Variant56026, - Variant56027, - Variant56028, - Variant56029, - Variant56030, - Variant56031, - Variant56032, - Variant56033, - Variant56034, - Variant56035, - Variant56036, - Variant56037, - Variant56038, - Variant56039, - Variant56040, - Variant56041, - Variant56042, - Variant56043, - Variant56044, - Variant56045, - Variant56046, - Variant56047, - Variant56048, - Variant56049, - Variant56050, - Variant56051, - Variant56052, - Variant56053, - Variant56054, - Variant56055, - Variant56056, - Variant56057, - Variant56058, - Variant56059, - Variant56060, - Variant56061, - Variant56062, - Variant56063, - Variant56064, - Variant56065, - Variant56066, - Variant56067, - Variant56068, - Variant56069, - Variant56070, - Variant56071, - Variant56072, - Variant56073, - Variant56074, - Variant56075, - Variant56076, - Variant56077, - Variant56078, - Variant56079, - Variant56080, - Variant56081, - Variant56082, - Variant56083, - Variant56084, - Variant56085, - Variant56086, - Variant56087, - Variant56088, - Variant56089, - Variant56090, - Variant56091, - Variant56092, - Variant56093, - Variant56094, - Variant56095, - Variant56096, - Variant56097, - Variant56098, - Variant56099, - Variant56100, - Variant56101, - Variant56102, - Variant56103, - Variant56104, - Variant56105, - Variant56106, - Variant56107, - Variant56108, - Variant56109, - Variant56110, - Variant56111, - Variant56112, - Variant56113, - Variant56114, - Variant56115, - Variant56116, - Variant56117, - Variant56118, - Variant56119, - Variant56120, - Variant56121, - Variant56122, - Variant56123, - Variant56124, - Variant56125, - Variant56126, - Variant56127, - Variant56128, - Variant56129, - Variant56130, - Variant56131, - Variant56132, - Variant56133, - Variant56134, - Variant56135, - Variant56136, - Variant56137, - Variant56138, - Variant56139, - Variant56140, - Variant56141, - Variant56142, - Variant56143, - Variant56144, - Variant56145, - Variant56146, - Variant56147, - Variant56148, - Variant56149, - Variant56150, - Variant56151, - Variant56152, - Variant56153, - Variant56154, - Variant56155, - Variant56156, - Variant56157, - Variant56158, - Variant56159, - Variant56160, - Variant56161, - Variant56162, - Variant56163, - Variant56164, - Variant56165, - Variant56166, - Variant56167, - Variant56168, - Variant56169, - Variant56170, - Variant56171, - Variant56172, - Variant56173, - Variant56174, - Variant56175, - Variant56176, - Variant56177, - Variant56178, - Variant56179, - Variant56180, - Variant56181, - Variant56182, - Variant56183, - Variant56184, - Variant56185, - Variant56186, - Variant56187, - Variant56188, - Variant56189, - Variant56190, - Variant56191, - Variant56192, - Variant56193, - Variant56194, - Variant56195, - Variant56196, - Variant56197, - Variant56198, - Variant56199, - Variant56200, - Variant56201, - Variant56202, - Variant56203, - Variant56204, - Variant56205, - Variant56206, - Variant56207, - Variant56208, - Variant56209, - Variant56210, - Variant56211, - Variant56212, - Variant56213, - Variant56214, - Variant56215, - Variant56216, - Variant56217, - Variant56218, - Variant56219, - Variant56220, - Variant56221, - Variant56222, - Variant56223, - Variant56224, - Variant56225, - Variant56226, - Variant56227, - Variant56228, - Variant56229, - Variant56230, - Variant56231, - Variant56232, - Variant56233, - Variant56234, - Variant56235, - Variant56236, - Variant56237, - Variant56238, - Variant56239, - Variant56240, - Variant56241, - Variant56242, - Variant56243, - Variant56244, - Variant56245, - Variant56246, - Variant56247, - Variant56248, - Variant56249, - Variant56250, - Variant56251, - Variant56252, - Variant56253, - Variant56254, - Variant56255, - Variant56256, - Variant56257, - Variant56258, - Variant56259, - Variant56260, - Variant56261, - Variant56262, - Variant56263, - Variant56264, - Variant56265, - Variant56266, - Variant56267, - Variant56268, - Variant56269, - Variant56270, - Variant56271, - Variant56272, - Variant56273, - Variant56274, - Variant56275, - Variant56276, - Variant56277, - Variant56278, - Variant56279, - Variant56280, - Variant56281, - Variant56282, - Variant56283, - Variant56284, - Variant56285, - Variant56286, - Variant56287, - Variant56288, - Variant56289, - Variant56290, - Variant56291, - Variant56292, - Variant56293, - Variant56294, - Variant56295, - Variant56296, - Variant56297, - Variant56298, - Variant56299, - Variant56300, - Variant56301, - Variant56302, - Variant56303, - Variant56304, - Variant56305, - Variant56306, - Variant56307, - Variant56308, - Variant56309, - Variant56310, - Variant56311, - Variant56312, - Variant56313, - Variant56314, - Variant56315, - Variant56316, - Variant56317, - Variant56318, - Variant56319, - Variant56320, - Variant56321, - Variant56322, - Variant56323, - Variant56324, - Variant56325, - Variant56326, - Variant56327, - Variant56328, - Variant56329, - Variant56330, - Variant56331, - Variant56332, - Variant56333, - Variant56334, - Variant56335, - Variant56336, - Variant56337, - Variant56338, - Variant56339, - Variant56340, - Variant56341, - Variant56342, - Variant56343, - Variant56344, - Variant56345, - Variant56346, - Variant56347, - Variant56348, - Variant56349, - Variant56350, - Variant56351, - Variant56352, - Variant56353, - Variant56354, - Variant56355, - Variant56356, - Variant56357, - Variant56358, - Variant56359, - Variant56360, - Variant56361, - Variant56362, - Variant56363, - Variant56364, - Variant56365, - Variant56366, - Variant56367, - Variant56368, - Variant56369, - Variant56370, - Variant56371, - Variant56372, - Variant56373, - Variant56374, - Variant56375, - Variant56376, - Variant56377, - Variant56378, - Variant56379, - Variant56380, - Variant56381, - Variant56382, - Variant56383, - Variant56384, - Variant56385, - Variant56386, - Variant56387, - Variant56388, - Variant56389, - Variant56390, - Variant56391, - Variant56392, - Variant56393, - Variant56394, - Variant56395, - Variant56396, - Variant56397, - Variant56398, - Variant56399, - Variant56400, - Variant56401, - Variant56402, - Variant56403, - Variant56404, - Variant56405, - Variant56406, - Variant56407, - Variant56408, - Variant56409, - Variant56410, - Variant56411, - Variant56412, - Variant56413, - Variant56414, - Variant56415, - Variant56416, - Variant56417, - Variant56418, - Variant56419, - Variant56420, - Variant56421, - Variant56422, - Variant56423, - Variant56424, - Variant56425, - Variant56426, - Variant56427, - Variant56428, - Variant56429, - Variant56430, - Variant56431, - Variant56432, - Variant56433, - Variant56434, - Variant56435, - Variant56436, - Variant56437, - Variant56438, - Variant56439, - Variant56440, - Variant56441, - Variant56442, - Variant56443, - Variant56444, - Variant56445, - Variant56446, - Variant56447, - Variant56448, - Variant56449, - Variant56450, - Variant56451, - Variant56452, - Variant56453, - Variant56454, - Variant56455, - Variant56456, - Variant56457, - Variant56458, - Variant56459, - Variant56460, - Variant56461, - Variant56462, - Variant56463, - Variant56464, - Variant56465, - Variant56466, - Variant56467, - Variant56468, - Variant56469, - Variant56470, - Variant56471, - Variant56472, - Variant56473, - Variant56474, - Variant56475, - Variant56476, - Variant56477, - Variant56478, - Variant56479, - Variant56480, - Variant56481, - Variant56482, - Variant56483, - Variant56484, - Variant56485, - Variant56486, - Variant56487, - Variant56488, - Variant56489, - Variant56490, - Variant56491, - Variant56492, - Variant56493, - Variant56494, - Variant56495, - Variant56496, - Variant56497, - Variant56498, - Variant56499, - Variant56500, - Variant56501, - Variant56502, - Variant56503, - Variant56504, - Variant56505, - Variant56506, - Variant56507, - Variant56508, - Variant56509, - Variant56510, - Variant56511, - Variant56512, - Variant56513, - Variant56514, - Variant56515, - Variant56516, - Variant56517, - Variant56518, - Variant56519, - Variant56520, - Variant56521, - Variant56522, - Variant56523, - Variant56524, - Variant56525, - Variant56526, - Variant56527, - Variant56528, - Variant56529, - Variant56530, - Variant56531, - Variant56532, - Variant56533, - Variant56534, - Variant56535, - Variant56536, - Variant56537, - Variant56538, - Variant56539, - Variant56540, - Variant56541, - Variant56542, - Variant56543, - Variant56544, - Variant56545, - Variant56546, - Variant56547, - Variant56548, - Variant56549, - Variant56550, - Variant56551, - Variant56552, - Variant56553, - Variant56554, - Variant56555, - Variant56556, - Variant56557, - Variant56558, - Variant56559, - Variant56560, - Variant56561, - Variant56562, - Variant56563, - Variant56564, - Variant56565, - Variant56566, - Variant56567, - Variant56568, - Variant56569, - Variant56570, - Variant56571, - Variant56572, - Variant56573, - Variant56574, - Variant56575, - Variant56576, - Variant56577, - Variant56578, - Variant56579, - Variant56580, - Variant56581, - Variant56582, - Variant56583, - Variant56584, - Variant56585, - Variant56586, - Variant56587, - Variant56588, - Variant56589, - Variant56590, - Variant56591, - Variant56592, - Variant56593, - Variant56594, - Variant56595, - Variant56596, - Variant56597, - Variant56598, - Variant56599, - Variant56600, - Variant56601, - Variant56602, - Variant56603, - Variant56604, - Variant56605, - Variant56606, - Variant56607, - Variant56608, - Variant56609, - Variant56610, - Variant56611, - Variant56612, - Variant56613, - Variant56614, - Variant56615, - Variant56616, - Variant56617, - Variant56618, - Variant56619, - Variant56620, - Variant56621, - Variant56622, - Variant56623, - Variant56624, - Variant56625, - Variant56626, - Variant56627, - Variant56628, - Variant56629, - Variant56630, - Variant56631, - Variant56632, - Variant56633, - Variant56634, - Variant56635, - Variant56636, - Variant56637, - Variant56638, - Variant56639, - Variant56640, - Variant56641, - Variant56642, - Variant56643, - Variant56644, - Variant56645, - Variant56646, - Variant56647, - Variant56648, - Variant56649, - Variant56650, - Variant56651, - Variant56652, - Variant56653, - Variant56654, - Variant56655, - Variant56656, - Variant56657, - Variant56658, - Variant56659, - Variant56660, - Variant56661, - Variant56662, - Variant56663, - Variant56664, - Variant56665, - Variant56666, - Variant56667, - Variant56668, - Variant56669, - Variant56670, - Variant56671, - Variant56672, - Variant56673, - Variant56674, - Variant56675, - Variant56676, - Variant56677, - Variant56678, - Variant56679, - Variant56680, - Variant56681, - Variant56682, - Variant56683, - Variant56684, - Variant56685, - Variant56686, - Variant56687, - Variant56688, - Variant56689, - Variant56690, - Variant56691, - Variant56692, - Variant56693, - Variant56694, - Variant56695, - Variant56696, - Variant56697, - Variant56698, - Variant56699, - Variant56700, - Variant56701, - Variant56702, - Variant56703, - Variant56704, - Variant56705, - Variant56706, - Variant56707, - Variant56708, - Variant56709, - Variant56710, - Variant56711, - Variant56712, - Variant56713, - Variant56714, - Variant56715, - Variant56716, - Variant56717, - Variant56718, - Variant56719, - Variant56720, - Variant56721, - Variant56722, - Variant56723, - Variant56724, - Variant56725, - Variant56726, - Variant56727, - Variant56728, - Variant56729, - Variant56730, - Variant56731, - Variant56732, - Variant56733, - Variant56734, - Variant56735, - Variant56736, - Variant56737, - Variant56738, - Variant56739, - Variant56740, - Variant56741, - Variant56742, - Variant56743, - Variant56744, - Variant56745, - Variant56746, - Variant56747, - Variant56748, - Variant56749, - Variant56750, - Variant56751, - Variant56752, - Variant56753, - Variant56754, - Variant56755, - Variant56756, - Variant56757, - Variant56758, - Variant56759, - Variant56760, - Variant56761, - Variant56762, - Variant56763, - Variant56764, - Variant56765, - Variant56766, - Variant56767, - Variant56768, - Variant56769, - Variant56770, - Variant56771, - Variant56772, - Variant56773, - Variant56774, - Variant56775, - Variant56776, - Variant56777, - Variant56778, - Variant56779, - Variant56780, - Variant56781, - Variant56782, - Variant56783, - Variant56784, - Variant56785, - Variant56786, - Variant56787, - Variant56788, - Variant56789, - Variant56790, - Variant56791, - Variant56792, - Variant56793, - Variant56794, - Variant56795, - Variant56796, - Variant56797, - Variant56798, - Variant56799, - Variant56800, - Variant56801, - Variant56802, - Variant56803, - Variant56804, - Variant56805, - Variant56806, - Variant56807, - Variant56808, - Variant56809, - Variant56810, - Variant56811, - Variant56812, - Variant56813, - Variant56814, - Variant56815, - Variant56816, - Variant56817, - Variant56818, - Variant56819, - Variant56820, - Variant56821, - Variant56822, - Variant56823, - Variant56824, - Variant56825, - Variant56826, - Variant56827, - Variant56828, - Variant56829, - Variant56830, - Variant56831, - Variant56832, - Variant56833, - Variant56834, - Variant56835, - Variant56836, - Variant56837, - Variant56838, - Variant56839, - Variant56840, - Variant56841, - Variant56842, - Variant56843, - Variant56844, - Variant56845, - Variant56846, - Variant56847, - Variant56848, - Variant56849, - Variant56850, - Variant56851, - Variant56852, - Variant56853, - Variant56854, - Variant56855, - Variant56856, - Variant56857, - Variant56858, - Variant56859, - Variant56860, - Variant56861, - Variant56862, - Variant56863, - Variant56864, - Variant56865, - Variant56866, - Variant56867, - Variant56868, - Variant56869, - Variant56870, - Variant56871, - Variant56872, - Variant56873, - Variant56874, - Variant56875, - Variant56876, - Variant56877, - Variant56878, - Variant56879, - Variant56880, - Variant56881, - Variant56882, - Variant56883, - Variant56884, - Variant56885, - Variant56886, - Variant56887, - Variant56888, - Variant56889, - Variant56890, - Variant56891, - Variant56892, - Variant56893, - Variant56894, - Variant56895, - Variant56896, - Variant56897, - Variant56898, - Variant56899, - Variant56900, - Variant56901, - Variant56902, - Variant56903, - Variant56904, - Variant56905, - Variant56906, - Variant56907, - Variant56908, - Variant56909, - Variant56910, - Variant56911, - Variant56912, - Variant56913, - Variant56914, - Variant56915, - Variant56916, - Variant56917, - Variant56918, - Variant56919, - Variant56920, - Variant56921, - Variant56922, - Variant56923, - Variant56924, - Variant56925, - Variant56926, - Variant56927, - Variant56928, - Variant56929, - Variant56930, - Variant56931, - Variant56932, - Variant56933, - Variant56934, - Variant56935, - Variant56936, - Variant56937, - Variant56938, - Variant56939, - Variant56940, - Variant56941, - Variant56942, - Variant56943, - Variant56944, - Variant56945, - Variant56946, - Variant56947, - Variant56948, - Variant56949, - Variant56950, - Variant56951, - Variant56952, - Variant56953, - Variant56954, - Variant56955, - Variant56956, - Variant56957, - Variant56958, - Variant56959, - Variant56960, - Variant56961, - Variant56962, - Variant56963, - Variant56964, - Variant56965, - Variant56966, - Variant56967, - Variant56968, - Variant56969, - Variant56970, - Variant56971, - Variant56972, - Variant56973, - Variant56974, - Variant56975, - Variant56976, - Variant56977, - Variant56978, - Variant56979, - Variant56980, - Variant56981, - Variant56982, - Variant56983, - Variant56984, - Variant56985, - Variant56986, - Variant56987, - Variant56988, - Variant56989, - Variant56990, - Variant56991, - Variant56992, - Variant56993, - Variant56994, - Variant56995, - Variant56996, - Variant56997, - Variant56998, - Variant56999, - Variant57000, - Variant57001, - Variant57002, - Variant57003, - Variant57004, - Variant57005, - Variant57006, - Variant57007, - Variant57008, - Variant57009, - Variant57010, - Variant57011, - Variant57012, - Variant57013, - Variant57014, - Variant57015, - Variant57016, - Variant57017, - Variant57018, - Variant57019, - Variant57020, - Variant57021, - Variant57022, - Variant57023, - Variant57024, - Variant57025, - Variant57026, - Variant57027, - Variant57028, - Variant57029, - Variant57030, - Variant57031, - Variant57032, - Variant57033, - Variant57034, - Variant57035, - Variant57036, - Variant57037, - Variant57038, - Variant57039, - Variant57040, - Variant57041, - Variant57042, - Variant57043, - Variant57044, - Variant57045, - Variant57046, - Variant57047, - Variant57048, - Variant57049, - Variant57050, - Variant57051, - Variant57052, - Variant57053, - Variant57054, - Variant57055, - Variant57056, - Variant57057, - Variant57058, - Variant57059, - Variant57060, - Variant57061, - Variant57062, - Variant57063, - Variant57064, - Variant57065, - Variant57066, - Variant57067, - Variant57068, - Variant57069, - Variant57070, - Variant57071, - Variant57072, - Variant57073, - Variant57074, - Variant57075, - Variant57076, - Variant57077, - Variant57078, - Variant57079, - Variant57080, - Variant57081, - Variant57082, - Variant57083, - Variant57084, - Variant57085, - Variant57086, - Variant57087, - Variant57088, - Variant57089, - Variant57090, - Variant57091, - Variant57092, - Variant57093, - Variant57094, - Variant57095, - Variant57096, - Variant57097, - Variant57098, - Variant57099, - Variant57100, - Variant57101, - Variant57102, - Variant57103, - Variant57104, - Variant57105, - Variant57106, - Variant57107, - Variant57108, - Variant57109, - Variant57110, - Variant57111, - Variant57112, - Variant57113, - Variant57114, - Variant57115, - Variant57116, - Variant57117, - Variant57118, - Variant57119, - Variant57120, - Variant57121, - Variant57122, - Variant57123, - Variant57124, - Variant57125, - Variant57126, - Variant57127, - Variant57128, - Variant57129, - Variant57130, - Variant57131, - Variant57132, - Variant57133, - Variant57134, - Variant57135, - Variant57136, - Variant57137, - Variant57138, - Variant57139, - Variant57140, - Variant57141, - Variant57142, - Variant57143, - Variant57144, - Variant57145, - Variant57146, - Variant57147, - Variant57148, - Variant57149, - Variant57150, - Variant57151, - Variant57152, - Variant57153, - Variant57154, - Variant57155, - Variant57156, - Variant57157, - Variant57158, - Variant57159, - Variant57160, - Variant57161, - Variant57162, - Variant57163, - Variant57164, - Variant57165, - Variant57166, - Variant57167, - Variant57168, - Variant57169, - Variant57170, - Variant57171, - Variant57172, - Variant57173, - Variant57174, - Variant57175, - Variant57176, - Variant57177, - Variant57178, - Variant57179, - Variant57180, - Variant57181, - Variant57182, - Variant57183, - Variant57184, - Variant57185, - Variant57186, - Variant57187, - Variant57188, - Variant57189, - Variant57190, - Variant57191, - Variant57192, - Variant57193, - Variant57194, - Variant57195, - Variant57196, - Variant57197, - Variant57198, - Variant57199, - Variant57200, - Variant57201, - Variant57202, - Variant57203, - Variant57204, - Variant57205, - Variant57206, - Variant57207, - Variant57208, - Variant57209, - Variant57210, - Variant57211, - Variant57212, - Variant57213, - Variant57214, - Variant57215, - Variant57216, - Variant57217, - Variant57218, - Variant57219, - Variant57220, - Variant57221, - Variant57222, - Variant57223, - Variant57224, - Variant57225, - Variant57226, - Variant57227, - Variant57228, - Variant57229, - Variant57230, - Variant57231, - Variant57232, - Variant57233, - Variant57234, - Variant57235, - Variant57236, - Variant57237, - Variant57238, - Variant57239, - Variant57240, - Variant57241, - Variant57242, - Variant57243, - Variant57244, - Variant57245, - Variant57246, - Variant57247, - Variant57248, - Variant57249, - Variant57250, - Variant57251, - Variant57252, - Variant57253, - Variant57254, - Variant57255, - Variant57256, - Variant57257, - Variant57258, - Variant57259, - Variant57260, - Variant57261, - Variant57262, - Variant57263, - Variant57264, - Variant57265, - Variant57266, - Variant57267, - Variant57268, - Variant57269, - Variant57270, - Variant57271, - Variant57272, - Variant57273, - Variant57274, - Variant57275, - Variant57276, - Variant57277, - Variant57278, - Variant57279, - Variant57280, - Variant57281, - Variant57282, - Variant57283, - Variant57284, - Variant57285, - Variant57286, - Variant57287, - Variant57288, - Variant57289, - Variant57290, - Variant57291, - Variant57292, - Variant57293, - Variant57294, - Variant57295, - Variant57296, - Variant57297, - Variant57298, - Variant57299, - Variant57300, - Variant57301, - Variant57302, - Variant57303, - Variant57304, - Variant57305, - Variant57306, - Variant57307, - Variant57308, - Variant57309, - Variant57310, - Variant57311, - Variant57312, - Variant57313, - Variant57314, - Variant57315, - Variant57316, - Variant57317, - Variant57318, - Variant57319, - Variant57320, - Variant57321, - Variant57322, - Variant57323, - Variant57324, - Variant57325, - Variant57326, - Variant57327, - Variant57328, - Variant57329, - Variant57330, - Variant57331, - Variant57332, - Variant57333, - Variant57334, - Variant57335, - Variant57336, - Variant57337, - Variant57338, - Variant57339, - Variant57340, - Variant57341, - Variant57342, - Variant57343, - Variant57344, - Variant57345, - Variant57346, - Variant57347, - Variant57348, - Variant57349, - Variant57350, - Variant57351, - Variant57352, - Variant57353, - Variant57354, - Variant57355, - Variant57356, - Variant57357, - Variant57358, - Variant57359, - Variant57360, - Variant57361, - Variant57362, - Variant57363, - Variant57364, - Variant57365, - Variant57366, - Variant57367, - Variant57368, - Variant57369, - Variant57370, - Variant57371, - Variant57372, - Variant57373, - Variant57374, - Variant57375, - Variant57376, - Variant57377, - Variant57378, - Variant57379, - Variant57380, - Variant57381, - Variant57382, - Variant57383, - Variant57384, - Variant57385, - Variant57386, - Variant57387, - Variant57388, - Variant57389, - Variant57390, - Variant57391, - Variant57392, - Variant57393, - Variant57394, - Variant57395, - Variant57396, - Variant57397, - Variant57398, - Variant57399, - Variant57400, - Variant57401, - Variant57402, - Variant57403, - Variant57404, - Variant57405, - Variant57406, - Variant57407, - Variant57408, - Variant57409, - Variant57410, - Variant57411, - Variant57412, - Variant57413, - Variant57414, - Variant57415, - Variant57416, - Variant57417, - Variant57418, - Variant57419, - Variant57420, - Variant57421, - Variant57422, - Variant57423, - Variant57424, - Variant57425, - Variant57426, - Variant57427, - Variant57428, - Variant57429, - Variant57430, - Variant57431, - Variant57432, - Variant57433, - Variant57434, - Variant57435, - Variant57436, - Variant57437, - Variant57438, - Variant57439, - Variant57440, - Variant57441, - Variant57442, - Variant57443, - Variant57444, - Variant57445, - Variant57446, - Variant57447, - Variant57448, - Variant57449, - Variant57450, - Variant57451, - Variant57452, - Variant57453, - Variant57454, - Variant57455, - Variant57456, - Variant57457, - Variant57458, - Variant57459, - Variant57460, - Variant57461, - Variant57462, - Variant57463, - Variant57464, - Variant57465, - Variant57466, - Variant57467, - Variant57468, - Variant57469, - Variant57470, - Variant57471, - Variant57472, - Variant57473, - Variant57474, - Variant57475, - Variant57476, - Variant57477, - Variant57478, - Variant57479, - Variant57480, - Variant57481, - Variant57482, - Variant57483, - Variant57484, - Variant57485, - Variant57486, - Variant57487, - Variant57488, - Variant57489, - Variant57490, - Variant57491, - Variant57492, - Variant57493, - Variant57494, - Variant57495, - Variant57496, - Variant57497, - Variant57498, - Variant57499, - Variant57500, - Variant57501, - Variant57502, - Variant57503, - Variant57504, - Variant57505, - Variant57506, - Variant57507, - Variant57508, - Variant57509, - Variant57510, - Variant57511, - Variant57512, - Variant57513, - Variant57514, - Variant57515, - Variant57516, - Variant57517, - Variant57518, - Variant57519, - Variant57520, - Variant57521, - Variant57522, - Variant57523, - Variant57524, - Variant57525, - Variant57526, - Variant57527, - Variant57528, - Variant57529, - Variant57530, - Variant57531, - Variant57532, - Variant57533, - Variant57534, - Variant57535, - Variant57536, - Variant57537, - Variant57538, - Variant57539, - Variant57540, - Variant57541, - Variant57542, - Variant57543, - Variant57544, - Variant57545, - Variant57546, - Variant57547, - Variant57548, - Variant57549, - Variant57550, - Variant57551, - Variant57552, - Variant57553, - Variant57554, - Variant57555, - Variant57556, - Variant57557, - Variant57558, - Variant57559, - Variant57560, - Variant57561, - Variant57562, - Variant57563, - Variant57564, - Variant57565, - Variant57566, - Variant57567, - Variant57568, - Variant57569, - Variant57570, - Variant57571, - Variant57572, - Variant57573, - Variant57574, - Variant57575, - Variant57576, - Variant57577, - Variant57578, - Variant57579, - Variant57580, - Variant57581, - Variant57582, - Variant57583, - Variant57584, - Variant57585, - Variant57586, - Variant57587, - Variant57588, - Variant57589, - Variant57590, - Variant57591, - Variant57592, - Variant57593, - Variant57594, - Variant57595, - Variant57596, - Variant57597, - Variant57598, - Variant57599, - Variant57600, - Variant57601, - Variant57602, - Variant57603, - Variant57604, - Variant57605, - Variant57606, - Variant57607, - Variant57608, - Variant57609, - Variant57610, - Variant57611, - Variant57612, - Variant57613, - Variant57614, - Variant57615, - Variant57616, - Variant57617, - Variant57618, - Variant57619, - Variant57620, - Variant57621, - Variant57622, - Variant57623, - Variant57624, - Variant57625, - Variant57626, - Variant57627, - Variant57628, - Variant57629, - Variant57630, - Variant57631, - Variant57632, - Variant57633, - Variant57634, - Variant57635, - Variant57636, - Variant57637, - Variant57638, - Variant57639, - Variant57640, - Variant57641, - Variant57642, - Variant57643, - Variant57644, - Variant57645, - Variant57646, - Variant57647, - Variant57648, - Variant57649, - Variant57650, - Variant57651, - Variant57652, - Variant57653, - Variant57654, - Variant57655, - Variant57656, - Variant57657, - Variant57658, - Variant57659, - Variant57660, - Variant57661, - Variant57662, - Variant57663, - Variant57664, - Variant57665, - Variant57666, - Variant57667, - Variant57668, - Variant57669, - Variant57670, - Variant57671, - Variant57672, - Variant57673, - Variant57674, - Variant57675, - Variant57676, - Variant57677, - Variant57678, - Variant57679, - Variant57680, - Variant57681, - Variant57682, - Variant57683, - Variant57684, - Variant57685, - Variant57686, - Variant57687, - Variant57688, - Variant57689, - Variant57690, - Variant57691, - Variant57692, - Variant57693, - Variant57694, - Variant57695, - Variant57696, - Variant57697, - Variant57698, - Variant57699, - Variant57700, - Variant57701, - Variant57702, - Variant57703, - Variant57704, - Variant57705, - Variant57706, - Variant57707, - Variant57708, - Variant57709, - Variant57710, - Variant57711, - Variant57712, - Variant57713, - Variant57714, - Variant57715, - Variant57716, - Variant57717, - Variant57718, - Variant57719, - Variant57720, - Variant57721, - Variant57722, - Variant57723, - Variant57724, - Variant57725, - Variant57726, - Variant57727, - Variant57728, - Variant57729, - Variant57730, - Variant57731, - Variant57732, - Variant57733, - Variant57734, - Variant57735, - Variant57736, - Variant57737, - Variant57738, - Variant57739, - Variant57740, - Variant57741, - Variant57742, - Variant57743, - Variant57744, - Variant57745, - Variant57746, - Variant57747, - Variant57748, - Variant57749, - Variant57750, - Variant57751, - Variant57752, - Variant57753, - Variant57754, - Variant57755, - Variant57756, - Variant57757, - Variant57758, - Variant57759, - Variant57760, - Variant57761, - Variant57762, - Variant57763, - Variant57764, - Variant57765, - Variant57766, - Variant57767, - Variant57768, - Variant57769, - Variant57770, - Variant57771, - Variant57772, - Variant57773, - Variant57774, - Variant57775, - Variant57776, - Variant57777, - Variant57778, - Variant57779, - Variant57780, - Variant57781, - Variant57782, - Variant57783, - Variant57784, - Variant57785, - Variant57786, - Variant57787, - Variant57788, - Variant57789, - Variant57790, - Variant57791, - Variant57792, - Variant57793, - Variant57794, - Variant57795, - Variant57796, - Variant57797, - Variant57798, - Variant57799, - Variant57800, - Variant57801, - Variant57802, - Variant57803, - Variant57804, - Variant57805, - Variant57806, - Variant57807, - Variant57808, - Variant57809, - Variant57810, - Variant57811, - Variant57812, - Variant57813, - Variant57814, - Variant57815, - Variant57816, - Variant57817, - Variant57818, - Variant57819, - Variant57820, - Variant57821, - Variant57822, - Variant57823, - Variant57824, - Variant57825, - Variant57826, - Variant57827, - Variant57828, - Variant57829, - Variant57830, - Variant57831, - Variant57832, - Variant57833, - Variant57834, - Variant57835, - Variant57836, - Variant57837, - Variant57838, - Variant57839, - Variant57840, - Variant57841, - Variant57842, - Variant57843, - Variant57844, - Variant57845, - Variant57846, - Variant57847, - Variant57848, - Variant57849, - Variant57850, - Variant57851, - Variant57852, - Variant57853, - Variant57854, - Variant57855, - Variant57856, - Variant57857, - Variant57858, - Variant57859, - Variant57860, - Variant57861, - Variant57862, - Variant57863, - Variant57864, - Variant57865, - Variant57866, - Variant57867, - Variant57868, - Variant57869, - Variant57870, - Variant57871, - Variant57872, - Variant57873, - Variant57874, - Variant57875, - Variant57876, - Variant57877, - Variant57878, - Variant57879, - Variant57880, - Variant57881, - Variant57882, - Variant57883, - Variant57884, - Variant57885, - Variant57886, - Variant57887, - Variant57888, - Variant57889, - Variant57890, - Variant57891, - Variant57892, - Variant57893, - Variant57894, - Variant57895, - Variant57896, - Variant57897, - Variant57898, - Variant57899, - Variant57900, - Variant57901, - Variant57902, - Variant57903, - Variant57904, - Variant57905, - Variant57906, - Variant57907, - Variant57908, - Variant57909, - Variant57910, - Variant57911, - Variant57912, - Variant57913, - Variant57914, - Variant57915, - Variant57916, - Variant57917, - Variant57918, - Variant57919, - Variant57920, - Variant57921, - Variant57922, - Variant57923, - Variant57924, - Variant57925, - Variant57926, - Variant57927, - Variant57928, - Variant57929, - Variant57930, - Variant57931, - Variant57932, - Variant57933, - Variant57934, - Variant57935, - Variant57936, - Variant57937, - Variant57938, - Variant57939, - Variant57940, - Variant57941, - Variant57942, - Variant57943, - Variant57944, - Variant57945, - Variant57946, - Variant57947, - Variant57948, - Variant57949, - Variant57950, - Variant57951, - Variant57952, - Variant57953, - Variant57954, - Variant57955, - Variant57956, - Variant57957, - Variant57958, - Variant57959, - Variant57960, - Variant57961, - Variant57962, - Variant57963, - Variant57964, - Variant57965, - Variant57966, - Variant57967, - Variant57968, - Variant57969, - Variant57970, - Variant57971, - Variant57972, - Variant57973, - Variant57974, - Variant57975, - Variant57976, - Variant57977, - Variant57978, - Variant57979, - Variant57980, - Variant57981, - Variant57982, - Variant57983, - Variant57984, - Variant57985, - Variant57986, - Variant57987, - Variant57988, - Variant57989, - Variant57990, - Variant57991, - Variant57992, - Variant57993, - Variant57994, - Variant57995, - Variant57996, - Variant57997, - Variant57998, - Variant57999, - Variant58000, - Variant58001, - Variant58002, - Variant58003, - Variant58004, - Variant58005, - Variant58006, - Variant58007, - Variant58008, - Variant58009, - Variant58010, - Variant58011, - Variant58012, - Variant58013, - Variant58014, - Variant58015, - Variant58016, - Variant58017, - Variant58018, - Variant58019, - Variant58020, - Variant58021, - Variant58022, - Variant58023, - Variant58024, - Variant58025, - Variant58026, - Variant58027, - Variant58028, - Variant58029, - Variant58030, - Variant58031, - Variant58032, - Variant58033, - Variant58034, - Variant58035, - Variant58036, - Variant58037, - Variant58038, - Variant58039, - Variant58040, - Variant58041, - Variant58042, - Variant58043, - Variant58044, - Variant58045, - Variant58046, - Variant58047, - Variant58048, - Variant58049, - Variant58050, - Variant58051, - Variant58052, - Variant58053, - Variant58054, - Variant58055, - Variant58056, - Variant58057, - Variant58058, - Variant58059, - Variant58060, - Variant58061, - Variant58062, - Variant58063, - Variant58064, - Variant58065, - Variant58066, - Variant58067, - Variant58068, - Variant58069, - Variant58070, - Variant58071, - Variant58072, - Variant58073, - Variant58074, - Variant58075, - Variant58076, - Variant58077, - Variant58078, - Variant58079, - Variant58080, - Variant58081, - Variant58082, - Variant58083, - Variant58084, - Variant58085, - Variant58086, - Variant58087, - Variant58088, - Variant58089, - Variant58090, - Variant58091, - Variant58092, - Variant58093, - Variant58094, - Variant58095, - Variant58096, - Variant58097, - Variant58098, - Variant58099, - Variant58100, - Variant58101, - Variant58102, - Variant58103, - Variant58104, - Variant58105, - Variant58106, - Variant58107, - Variant58108, - Variant58109, - Variant58110, - Variant58111, - Variant58112, - Variant58113, - Variant58114, - Variant58115, - Variant58116, - Variant58117, - Variant58118, - Variant58119, - Variant58120, - Variant58121, - Variant58122, - Variant58123, - Variant58124, - Variant58125, - Variant58126, - Variant58127, - Variant58128, - Variant58129, - Variant58130, - Variant58131, - Variant58132, - Variant58133, - Variant58134, - Variant58135, - Variant58136, - Variant58137, - Variant58138, - Variant58139, - Variant58140, - Variant58141, - Variant58142, - Variant58143, - Variant58144, - Variant58145, - Variant58146, - Variant58147, - Variant58148, - Variant58149, - Variant58150, - Variant58151, - Variant58152, - Variant58153, - Variant58154, - Variant58155, - Variant58156, - Variant58157, - Variant58158, - Variant58159, - Variant58160, - Variant58161, - Variant58162, - Variant58163, - Variant58164, - Variant58165, - Variant58166, - Variant58167, - Variant58168, - Variant58169, - Variant58170, - Variant58171, - Variant58172, - Variant58173, - Variant58174, - Variant58175, - Variant58176, - Variant58177, - Variant58178, - Variant58179, - Variant58180, - Variant58181, - Variant58182, - Variant58183, - Variant58184, - Variant58185, - Variant58186, - Variant58187, - Variant58188, - Variant58189, - Variant58190, - Variant58191, - Variant58192, - Variant58193, - Variant58194, - Variant58195, - Variant58196, - Variant58197, - Variant58198, - Variant58199, - Variant58200, - Variant58201, - Variant58202, - Variant58203, - Variant58204, - Variant58205, - Variant58206, - Variant58207, - Variant58208, - Variant58209, - Variant58210, - Variant58211, - Variant58212, - Variant58213, - Variant58214, - Variant58215, - Variant58216, - Variant58217, - Variant58218, - Variant58219, - Variant58220, - Variant58221, - Variant58222, - Variant58223, - Variant58224, - Variant58225, - Variant58226, - Variant58227, - Variant58228, - Variant58229, - Variant58230, - Variant58231, - Variant58232, - Variant58233, - Variant58234, - Variant58235, - Variant58236, - Variant58237, - Variant58238, - Variant58239, - Variant58240, - Variant58241, - Variant58242, - Variant58243, - Variant58244, - Variant58245, - Variant58246, - Variant58247, - Variant58248, - Variant58249, - Variant58250, - Variant58251, - Variant58252, - Variant58253, - Variant58254, - Variant58255, - Variant58256, - Variant58257, - Variant58258, - Variant58259, - Variant58260, - Variant58261, - Variant58262, - Variant58263, - Variant58264, - Variant58265, - Variant58266, - Variant58267, - Variant58268, - Variant58269, - Variant58270, - Variant58271, - Variant58272, - Variant58273, - Variant58274, - Variant58275, - Variant58276, - Variant58277, - Variant58278, - Variant58279, - Variant58280, - Variant58281, - Variant58282, - Variant58283, - Variant58284, - Variant58285, - Variant58286, - Variant58287, - Variant58288, - Variant58289, - Variant58290, - Variant58291, - Variant58292, - Variant58293, - Variant58294, - Variant58295, - Variant58296, - Variant58297, - Variant58298, - Variant58299, - Variant58300, - Variant58301, - Variant58302, - Variant58303, - Variant58304, - Variant58305, - Variant58306, - Variant58307, - Variant58308, - Variant58309, - Variant58310, - Variant58311, - Variant58312, - Variant58313, - Variant58314, - Variant58315, - Variant58316, - Variant58317, - Variant58318, - Variant58319, - Variant58320, - Variant58321, - Variant58322, - Variant58323, - Variant58324, - Variant58325, - Variant58326, - Variant58327, - Variant58328, - Variant58329, - Variant58330, - Variant58331, - Variant58332, - Variant58333, - Variant58334, - Variant58335, - Variant58336, - Variant58337, - Variant58338, - Variant58339, - Variant58340, - Variant58341, - Variant58342, - Variant58343, - Variant58344, - Variant58345, - Variant58346, - Variant58347, - Variant58348, - Variant58349, - Variant58350, - Variant58351, - Variant58352, - Variant58353, - Variant58354, - Variant58355, - Variant58356, - Variant58357, - Variant58358, - Variant58359, - Variant58360, - Variant58361, - Variant58362, - Variant58363, - Variant58364, - Variant58365, - Variant58366, - Variant58367, - Variant58368, - Variant58369, - Variant58370, - Variant58371, - Variant58372, - Variant58373, - Variant58374, - Variant58375, - Variant58376, - Variant58377, - Variant58378, - Variant58379, - Variant58380, - Variant58381, - Variant58382, - Variant58383, - Variant58384, - Variant58385, - Variant58386, - Variant58387, - Variant58388, - Variant58389, - Variant58390, - Variant58391, - Variant58392, - Variant58393, - Variant58394, - Variant58395, - Variant58396, - Variant58397, - Variant58398, - Variant58399, - Variant58400, - Variant58401, - Variant58402, - Variant58403, - Variant58404, - Variant58405, - Variant58406, - Variant58407, - Variant58408, - Variant58409, - Variant58410, - Variant58411, - Variant58412, - Variant58413, - Variant58414, - Variant58415, - Variant58416, - Variant58417, - Variant58418, - Variant58419, - Variant58420, - Variant58421, - Variant58422, - Variant58423, - Variant58424, - Variant58425, - Variant58426, - Variant58427, - Variant58428, - Variant58429, - Variant58430, - Variant58431, - Variant58432, - Variant58433, - Variant58434, - Variant58435, - Variant58436, - Variant58437, - Variant58438, - Variant58439, - Variant58440, - Variant58441, - Variant58442, - Variant58443, - Variant58444, - Variant58445, - Variant58446, - Variant58447, - Variant58448, - Variant58449, - Variant58450, - Variant58451, - Variant58452, - Variant58453, - Variant58454, - Variant58455, - Variant58456, - Variant58457, - Variant58458, - Variant58459, - Variant58460, - Variant58461, - Variant58462, - Variant58463, - Variant58464, - Variant58465, - Variant58466, - Variant58467, - Variant58468, - Variant58469, - Variant58470, - Variant58471, - Variant58472, - Variant58473, - Variant58474, - Variant58475, - Variant58476, - Variant58477, - Variant58478, - Variant58479, - Variant58480, - Variant58481, - Variant58482, - Variant58483, - Variant58484, - Variant58485, - Variant58486, - Variant58487, - Variant58488, - Variant58489, - Variant58490, - Variant58491, - Variant58492, - Variant58493, - Variant58494, - Variant58495, - Variant58496, - Variant58497, - Variant58498, - Variant58499, - Variant58500, - Variant58501, - Variant58502, - Variant58503, - Variant58504, - Variant58505, - Variant58506, - Variant58507, - Variant58508, - Variant58509, - Variant58510, - Variant58511, - Variant58512, - Variant58513, - Variant58514, - Variant58515, - Variant58516, - Variant58517, - Variant58518, - Variant58519, - Variant58520, - Variant58521, - Variant58522, - Variant58523, - Variant58524, - Variant58525, - Variant58526, - Variant58527, - Variant58528, - Variant58529, - Variant58530, - Variant58531, - Variant58532, - Variant58533, - Variant58534, - Variant58535, - Variant58536, - Variant58537, - Variant58538, - Variant58539, - Variant58540, - Variant58541, - Variant58542, - Variant58543, - Variant58544, - Variant58545, - Variant58546, - Variant58547, - Variant58548, - Variant58549, - Variant58550, - Variant58551, - Variant58552, - Variant58553, - Variant58554, - Variant58555, - Variant58556, - Variant58557, - Variant58558, - Variant58559, - Variant58560, - Variant58561, - Variant58562, - Variant58563, - Variant58564, - Variant58565, - Variant58566, - Variant58567, - Variant58568, - Variant58569, - Variant58570, - Variant58571, - Variant58572, - Variant58573, - Variant58574, - Variant58575, - Variant58576, - Variant58577, - Variant58578, - Variant58579, - Variant58580, - Variant58581, - Variant58582, - Variant58583, - Variant58584, - Variant58585, - Variant58586, - Variant58587, - Variant58588, - Variant58589, - Variant58590, - Variant58591, - Variant58592, - Variant58593, - Variant58594, - Variant58595, - Variant58596, - Variant58597, - Variant58598, - Variant58599, - Variant58600, - Variant58601, - Variant58602, - Variant58603, - Variant58604, - Variant58605, - Variant58606, - Variant58607, - Variant58608, - Variant58609, - Variant58610, - Variant58611, - Variant58612, - Variant58613, - Variant58614, - Variant58615, - Variant58616, - Variant58617, - Variant58618, - Variant58619, - Variant58620, - Variant58621, - Variant58622, - Variant58623, - Variant58624, - Variant58625, - Variant58626, - Variant58627, - Variant58628, - Variant58629, - Variant58630, - Variant58631, - Variant58632, - Variant58633, - Variant58634, - Variant58635, - Variant58636, - Variant58637, - Variant58638, - Variant58639, - Variant58640, - Variant58641, - Variant58642, - Variant58643, - Variant58644, - Variant58645, - Variant58646, - Variant58647, - Variant58648, - Variant58649, - Variant58650, - Variant58651, - Variant58652, - Variant58653, - Variant58654, - Variant58655, - Variant58656, - Variant58657, - Variant58658, - Variant58659, - Variant58660, - Variant58661, - Variant58662, - Variant58663, - Variant58664, - Variant58665, - Variant58666, - Variant58667, - Variant58668, - Variant58669, - Variant58670, - Variant58671, - Variant58672, - Variant58673, - Variant58674, - Variant58675, - Variant58676, - Variant58677, - Variant58678, - Variant58679, - Variant58680, - Variant58681, - Variant58682, - Variant58683, - Variant58684, - Variant58685, - Variant58686, - Variant58687, - Variant58688, - Variant58689, - Variant58690, - Variant58691, - Variant58692, - Variant58693, - Variant58694, - Variant58695, - Variant58696, - Variant58697, - Variant58698, - Variant58699, - Variant58700, - Variant58701, - Variant58702, - Variant58703, - Variant58704, - Variant58705, - Variant58706, - Variant58707, - Variant58708, - Variant58709, - Variant58710, - Variant58711, - Variant58712, - Variant58713, - Variant58714, - Variant58715, - Variant58716, - Variant58717, - Variant58718, - Variant58719, - Variant58720, - Variant58721, - Variant58722, - Variant58723, - Variant58724, - Variant58725, - Variant58726, - Variant58727, - Variant58728, - Variant58729, - Variant58730, - Variant58731, - Variant58732, - Variant58733, - Variant58734, - Variant58735, - Variant58736, - Variant58737, - Variant58738, - Variant58739, - Variant58740, - Variant58741, - Variant58742, - Variant58743, - Variant58744, - Variant58745, - Variant58746, - Variant58747, - Variant58748, - Variant58749, - Variant58750, - Variant58751, - Variant58752, - Variant58753, - Variant58754, - Variant58755, - Variant58756, - Variant58757, - Variant58758, - Variant58759, - Variant58760, - Variant58761, - Variant58762, - Variant58763, - Variant58764, - Variant58765, - Variant58766, - Variant58767, - Variant58768, - Variant58769, - Variant58770, - Variant58771, - Variant58772, - Variant58773, - Variant58774, - Variant58775, - Variant58776, - Variant58777, - Variant58778, - Variant58779, - Variant58780, - Variant58781, - Variant58782, - Variant58783, - Variant58784, - Variant58785, - Variant58786, - Variant58787, - Variant58788, - Variant58789, - Variant58790, - Variant58791, - Variant58792, - Variant58793, - Variant58794, - Variant58795, - Variant58796, - Variant58797, - Variant58798, - Variant58799, - Variant58800, - Variant58801, - Variant58802, - Variant58803, - Variant58804, - Variant58805, - Variant58806, - Variant58807, - Variant58808, - Variant58809, - Variant58810, - Variant58811, - Variant58812, - Variant58813, - Variant58814, - Variant58815, - Variant58816, - Variant58817, - Variant58818, - Variant58819, - Variant58820, - Variant58821, - Variant58822, - Variant58823, - Variant58824, - Variant58825, - Variant58826, - Variant58827, - Variant58828, - Variant58829, - Variant58830, - Variant58831, - Variant58832, - Variant58833, - Variant58834, - Variant58835, - Variant58836, - Variant58837, - Variant58838, - Variant58839, - Variant58840, - Variant58841, - Variant58842, - Variant58843, - Variant58844, - Variant58845, - Variant58846, - Variant58847, - Variant58848, - Variant58849, - Variant58850, - Variant58851, - Variant58852, - Variant58853, - Variant58854, - Variant58855, - Variant58856, - Variant58857, - Variant58858, - Variant58859, - Variant58860, - Variant58861, - Variant58862, - Variant58863, - Variant58864, - Variant58865, - Variant58866, - Variant58867, - Variant58868, - Variant58869, - Variant58870, - Variant58871, - Variant58872, - Variant58873, - Variant58874, - Variant58875, - Variant58876, - Variant58877, - Variant58878, - Variant58879, - Variant58880, - Variant58881, - Variant58882, - Variant58883, - Variant58884, - Variant58885, - Variant58886, - Variant58887, - Variant58888, - Variant58889, - Variant58890, - Variant58891, - Variant58892, - Variant58893, - Variant58894, - Variant58895, - Variant58896, - Variant58897, - Variant58898, - Variant58899, - Variant58900, - Variant58901, - Variant58902, - Variant58903, - Variant58904, - Variant58905, - Variant58906, - Variant58907, - Variant58908, - Variant58909, - Variant58910, - Variant58911, - Variant58912, - Variant58913, - Variant58914, - Variant58915, - Variant58916, - Variant58917, - Variant58918, - Variant58919, - Variant58920, - Variant58921, - Variant58922, - Variant58923, - Variant58924, - Variant58925, - Variant58926, - Variant58927, - Variant58928, - Variant58929, - Variant58930, - Variant58931, - Variant58932, - Variant58933, - Variant58934, - Variant58935, - Variant58936, - Variant58937, - Variant58938, - Variant58939, - Variant58940, - Variant58941, - Variant58942, - Variant58943, - Variant58944, - Variant58945, - Variant58946, - Variant58947, - Variant58948, - Variant58949, - Variant58950, - Variant58951, - Variant58952, - Variant58953, - Variant58954, - Variant58955, - Variant58956, - Variant58957, - Variant58958, - Variant58959, - Variant58960, - Variant58961, - Variant58962, - Variant58963, - Variant58964, - Variant58965, - Variant58966, - Variant58967, - Variant58968, - Variant58969, - Variant58970, - Variant58971, - Variant58972, - Variant58973, - Variant58974, - Variant58975, - Variant58976, - Variant58977, - Variant58978, - Variant58979, - Variant58980, - Variant58981, - Variant58982, - Variant58983, - Variant58984, - Variant58985, - Variant58986, - Variant58987, - Variant58988, - Variant58989, - Variant58990, - Variant58991, - Variant58992, - Variant58993, - Variant58994, - Variant58995, - Variant58996, - Variant58997, - Variant58998, - Variant58999, - Variant59000, - Variant59001, - Variant59002, - Variant59003, - Variant59004, - Variant59005, - Variant59006, - Variant59007, - Variant59008, - Variant59009, - Variant59010, - Variant59011, - Variant59012, - Variant59013, - Variant59014, - Variant59015, - Variant59016, - Variant59017, - Variant59018, - Variant59019, - Variant59020, - Variant59021, - Variant59022, - Variant59023, - Variant59024, - Variant59025, - Variant59026, - Variant59027, - Variant59028, - Variant59029, - Variant59030, - Variant59031, - Variant59032, - Variant59033, - Variant59034, - Variant59035, - Variant59036, - Variant59037, - Variant59038, - Variant59039, - Variant59040, - Variant59041, - Variant59042, - Variant59043, - Variant59044, - Variant59045, - Variant59046, - Variant59047, - Variant59048, - Variant59049, - Variant59050, - Variant59051, - Variant59052, - Variant59053, - Variant59054, - Variant59055, - Variant59056, - Variant59057, - Variant59058, - Variant59059, - Variant59060, - Variant59061, - Variant59062, - Variant59063, - Variant59064, - Variant59065, - Variant59066, - Variant59067, - Variant59068, - Variant59069, - Variant59070, - Variant59071, - Variant59072, - Variant59073, - Variant59074, - Variant59075, - Variant59076, - Variant59077, - Variant59078, - Variant59079, - Variant59080, - Variant59081, - Variant59082, - Variant59083, - Variant59084, - Variant59085, - Variant59086, - Variant59087, - Variant59088, - Variant59089, - Variant59090, - Variant59091, - Variant59092, - Variant59093, - Variant59094, - Variant59095, - Variant59096, - Variant59097, - Variant59098, - Variant59099, - Variant59100, - Variant59101, - Variant59102, - Variant59103, - Variant59104, - Variant59105, - Variant59106, - Variant59107, - Variant59108, - Variant59109, - Variant59110, - Variant59111, - Variant59112, - Variant59113, - Variant59114, - Variant59115, - Variant59116, - Variant59117, - Variant59118, - Variant59119, - Variant59120, - Variant59121, - Variant59122, - Variant59123, - Variant59124, - Variant59125, - Variant59126, - Variant59127, - Variant59128, - Variant59129, - Variant59130, - Variant59131, - Variant59132, - Variant59133, - Variant59134, - Variant59135, - Variant59136, - Variant59137, - Variant59138, - Variant59139, - Variant59140, - Variant59141, - Variant59142, - Variant59143, - Variant59144, - Variant59145, - Variant59146, - Variant59147, - Variant59148, - Variant59149, - Variant59150, - Variant59151, - Variant59152, - Variant59153, - Variant59154, - Variant59155, - Variant59156, - Variant59157, - Variant59158, - Variant59159, - Variant59160, - Variant59161, - Variant59162, - Variant59163, - Variant59164, - Variant59165, - Variant59166, - Variant59167, - Variant59168, - Variant59169, - Variant59170, - Variant59171, - Variant59172, - Variant59173, - Variant59174, - Variant59175, - Variant59176, - Variant59177, - Variant59178, - Variant59179, - Variant59180, - Variant59181, - Variant59182, - Variant59183, - Variant59184, - Variant59185, - Variant59186, - Variant59187, - Variant59188, - Variant59189, - Variant59190, - Variant59191, - Variant59192, - Variant59193, - Variant59194, - Variant59195, - Variant59196, - Variant59197, - Variant59198, - Variant59199, - Variant59200, - Variant59201, - Variant59202, - Variant59203, - Variant59204, - Variant59205, - Variant59206, - Variant59207, - Variant59208, - Variant59209, - Variant59210, - Variant59211, - Variant59212, - Variant59213, - Variant59214, - Variant59215, - Variant59216, - Variant59217, - Variant59218, - Variant59219, - Variant59220, - Variant59221, - Variant59222, - Variant59223, - Variant59224, - Variant59225, - Variant59226, - Variant59227, - Variant59228, - Variant59229, - Variant59230, - Variant59231, - Variant59232, - Variant59233, - Variant59234, - Variant59235, - Variant59236, - Variant59237, - Variant59238, - Variant59239, - Variant59240, - Variant59241, - Variant59242, - Variant59243, - Variant59244, - Variant59245, - Variant59246, - Variant59247, - Variant59248, - Variant59249, - Variant59250, - Variant59251, - Variant59252, - Variant59253, - Variant59254, - Variant59255, - Variant59256, - Variant59257, - Variant59258, - Variant59259, - Variant59260, - Variant59261, - Variant59262, - Variant59263, - Variant59264, - Variant59265, - Variant59266, - Variant59267, - Variant59268, - Variant59269, - Variant59270, - Variant59271, - Variant59272, - Variant59273, - Variant59274, - Variant59275, - Variant59276, - Variant59277, - Variant59278, - Variant59279, - Variant59280, - Variant59281, - Variant59282, - Variant59283, - Variant59284, - Variant59285, - Variant59286, - Variant59287, - Variant59288, - Variant59289, - Variant59290, - Variant59291, - Variant59292, - Variant59293, - Variant59294, - Variant59295, - Variant59296, - Variant59297, - Variant59298, - Variant59299, - Variant59300, - Variant59301, - Variant59302, - Variant59303, - Variant59304, - Variant59305, - Variant59306, - Variant59307, - Variant59308, - Variant59309, - Variant59310, - Variant59311, - Variant59312, - Variant59313, - Variant59314, - Variant59315, - Variant59316, - Variant59317, - Variant59318, - Variant59319, - Variant59320, - Variant59321, - Variant59322, - Variant59323, - Variant59324, - Variant59325, - Variant59326, - Variant59327, - Variant59328, - Variant59329, - Variant59330, - Variant59331, - Variant59332, - Variant59333, - Variant59334, - Variant59335, - Variant59336, - Variant59337, - Variant59338, - Variant59339, - Variant59340, - Variant59341, - Variant59342, - Variant59343, - Variant59344, - Variant59345, - Variant59346, - Variant59347, - Variant59348, - Variant59349, - Variant59350, - Variant59351, - Variant59352, - Variant59353, - Variant59354, - Variant59355, - Variant59356, - Variant59357, - Variant59358, - Variant59359, - Variant59360, - Variant59361, - Variant59362, - Variant59363, - Variant59364, - Variant59365, - Variant59366, - Variant59367, - Variant59368, - Variant59369, - Variant59370, - Variant59371, - Variant59372, - Variant59373, - Variant59374, - Variant59375, - Variant59376, - Variant59377, - Variant59378, - Variant59379, - Variant59380, - Variant59381, - Variant59382, - Variant59383, - Variant59384, - Variant59385, - Variant59386, - Variant59387, - Variant59388, - Variant59389, - Variant59390, - Variant59391, - Variant59392, - Variant59393, - Variant59394, - Variant59395, - Variant59396, - Variant59397, - Variant59398, - Variant59399, - Variant59400, - Variant59401, - Variant59402, - Variant59403, - Variant59404, - Variant59405, - Variant59406, - Variant59407, - Variant59408, - Variant59409, - Variant59410, - Variant59411, - Variant59412, - Variant59413, - Variant59414, - Variant59415, - Variant59416, - Variant59417, - Variant59418, - Variant59419, - Variant59420, - Variant59421, - Variant59422, - Variant59423, - Variant59424, - Variant59425, - Variant59426, - Variant59427, - Variant59428, - Variant59429, - Variant59430, - Variant59431, - Variant59432, - Variant59433, - Variant59434, - Variant59435, - Variant59436, - Variant59437, - Variant59438, - Variant59439, - Variant59440, - Variant59441, - Variant59442, - Variant59443, - Variant59444, - Variant59445, - Variant59446, - Variant59447, - Variant59448, - Variant59449, - Variant59450, - Variant59451, - Variant59452, - Variant59453, - Variant59454, - Variant59455, - Variant59456, - Variant59457, - Variant59458, - Variant59459, - Variant59460, - Variant59461, - Variant59462, - Variant59463, - Variant59464, - Variant59465, - Variant59466, - Variant59467, - Variant59468, - Variant59469, - Variant59470, - Variant59471, - Variant59472, - Variant59473, - Variant59474, - Variant59475, - Variant59476, - Variant59477, - Variant59478, - Variant59479, - Variant59480, - Variant59481, - Variant59482, - Variant59483, - Variant59484, - Variant59485, - Variant59486, - Variant59487, - Variant59488, - Variant59489, - Variant59490, - Variant59491, - Variant59492, - Variant59493, - Variant59494, - Variant59495, - Variant59496, - Variant59497, - Variant59498, - Variant59499, - Variant59500, - Variant59501, - Variant59502, - Variant59503, - Variant59504, - Variant59505, - Variant59506, - Variant59507, - Variant59508, - Variant59509, - Variant59510, - Variant59511, - Variant59512, - Variant59513, - Variant59514, - Variant59515, - Variant59516, - Variant59517, - Variant59518, - Variant59519, - Variant59520, - Variant59521, - Variant59522, - Variant59523, - Variant59524, - Variant59525, - Variant59526, - Variant59527, - Variant59528, - Variant59529, - Variant59530, - Variant59531, - Variant59532, - Variant59533, - Variant59534, - Variant59535, - Variant59536, - Variant59537, - Variant59538, - Variant59539, - Variant59540, - Variant59541, - Variant59542, - Variant59543, - Variant59544, - Variant59545, - Variant59546, - Variant59547, - Variant59548, - Variant59549, - Variant59550, - Variant59551, - Variant59552, - Variant59553, - Variant59554, - Variant59555, - Variant59556, - Variant59557, - Variant59558, - Variant59559, - Variant59560, - Variant59561, - Variant59562, - Variant59563, - Variant59564, - Variant59565, - Variant59566, - Variant59567, - Variant59568, - Variant59569, - Variant59570, - Variant59571, - Variant59572, - Variant59573, - Variant59574, - Variant59575, - Variant59576, - Variant59577, - Variant59578, - Variant59579, - Variant59580, - Variant59581, - Variant59582, - Variant59583, - Variant59584, - Variant59585, - Variant59586, - Variant59587, - Variant59588, - Variant59589, - Variant59590, - Variant59591, - Variant59592, - Variant59593, - Variant59594, - Variant59595, - Variant59596, - Variant59597, - Variant59598, - Variant59599, - Variant59600, - Variant59601, - Variant59602, - Variant59603, - Variant59604, - Variant59605, - Variant59606, - Variant59607, - Variant59608, - Variant59609, - Variant59610, - Variant59611, - Variant59612, - Variant59613, - Variant59614, - Variant59615, - Variant59616, - Variant59617, - Variant59618, - Variant59619, - Variant59620, - Variant59621, - Variant59622, - Variant59623, - Variant59624, - Variant59625, - Variant59626, - Variant59627, - Variant59628, - Variant59629, - Variant59630, - Variant59631, - Variant59632, - Variant59633, - Variant59634, - Variant59635, - Variant59636, - Variant59637, - Variant59638, - Variant59639, - Variant59640, - Variant59641, - Variant59642, - Variant59643, - Variant59644, - Variant59645, - Variant59646, - Variant59647, - Variant59648, - Variant59649, - Variant59650, - Variant59651, - Variant59652, - Variant59653, - Variant59654, - Variant59655, - Variant59656, - Variant59657, - Variant59658, - Variant59659, - Variant59660, - Variant59661, - Variant59662, - Variant59663, - Variant59664, - Variant59665, - Variant59666, - Variant59667, - Variant59668, - Variant59669, - Variant59670, - Variant59671, - Variant59672, - Variant59673, - Variant59674, - Variant59675, - Variant59676, - Variant59677, - Variant59678, - Variant59679, - Variant59680, - Variant59681, - Variant59682, - Variant59683, - Variant59684, - Variant59685, - Variant59686, - Variant59687, - Variant59688, - Variant59689, - Variant59690, - Variant59691, - Variant59692, - Variant59693, - Variant59694, - Variant59695, - Variant59696, - Variant59697, - Variant59698, - Variant59699, - Variant59700, - Variant59701, - Variant59702, - Variant59703, - Variant59704, - Variant59705, - Variant59706, - Variant59707, - Variant59708, - Variant59709, - Variant59710, - Variant59711, - Variant59712, - Variant59713, - Variant59714, - Variant59715, - Variant59716, - Variant59717, - Variant59718, - Variant59719, - Variant59720, - Variant59721, - Variant59722, - Variant59723, - Variant59724, - Variant59725, - Variant59726, - Variant59727, - Variant59728, - Variant59729, - Variant59730, - Variant59731, - Variant59732, - Variant59733, - Variant59734, - Variant59735, - Variant59736, - Variant59737, - Variant59738, - Variant59739, - Variant59740, - Variant59741, - Variant59742, - Variant59743, - Variant59744, - Variant59745, - Variant59746, - Variant59747, - Variant59748, - Variant59749, - Variant59750, - Variant59751, - Variant59752, - Variant59753, - Variant59754, - Variant59755, - Variant59756, - Variant59757, - Variant59758, - Variant59759, - Variant59760, - Variant59761, - Variant59762, - Variant59763, - Variant59764, - Variant59765, - Variant59766, - Variant59767, - Variant59768, - Variant59769, - Variant59770, - Variant59771, - Variant59772, - Variant59773, - Variant59774, - Variant59775, - Variant59776, - Variant59777, - Variant59778, - Variant59779, - Variant59780, - Variant59781, - Variant59782, - Variant59783, - Variant59784, - Variant59785, - Variant59786, - Variant59787, - Variant59788, - Variant59789, - Variant59790, - Variant59791, - Variant59792, - Variant59793, - Variant59794, - Variant59795, - Variant59796, - Variant59797, - Variant59798, - Variant59799, - Variant59800, - Variant59801, - Variant59802, - Variant59803, - Variant59804, - Variant59805, - Variant59806, - Variant59807, - Variant59808, - Variant59809, - Variant59810, - Variant59811, - Variant59812, - Variant59813, - Variant59814, - Variant59815, - Variant59816, - Variant59817, - Variant59818, - Variant59819, - Variant59820, - Variant59821, - Variant59822, - Variant59823, - Variant59824, - Variant59825, - Variant59826, - Variant59827, - Variant59828, - Variant59829, - Variant59830, - Variant59831, - Variant59832, - Variant59833, - Variant59834, - Variant59835, - Variant59836, - Variant59837, - Variant59838, - Variant59839, - Variant59840, - Variant59841, - Variant59842, - Variant59843, - Variant59844, - Variant59845, - Variant59846, - Variant59847, - Variant59848, - Variant59849, - Variant59850, - Variant59851, - Variant59852, - Variant59853, - Variant59854, - Variant59855, - Variant59856, - Variant59857, - Variant59858, - Variant59859, - Variant59860, - Variant59861, - Variant59862, - Variant59863, - Variant59864, - Variant59865, - Variant59866, - Variant59867, - Variant59868, - Variant59869, - Variant59870, - Variant59871, - Variant59872, - Variant59873, - Variant59874, - Variant59875, - Variant59876, - Variant59877, - Variant59878, - Variant59879, - Variant59880, - Variant59881, - Variant59882, - Variant59883, - Variant59884, - Variant59885, - Variant59886, - Variant59887, - Variant59888, - Variant59889, - Variant59890, - Variant59891, - Variant59892, - Variant59893, - Variant59894, - Variant59895, - Variant59896, - Variant59897, - Variant59898, - Variant59899, - Variant59900, - Variant59901, - Variant59902, - Variant59903, - Variant59904, - Variant59905, - Variant59906, - Variant59907, - Variant59908, - Variant59909, - Variant59910, - Variant59911, - Variant59912, - Variant59913, - Variant59914, - Variant59915, - Variant59916, - Variant59917, - Variant59918, - Variant59919, - Variant59920, - Variant59921, - Variant59922, - Variant59923, - Variant59924, - Variant59925, - Variant59926, - Variant59927, - Variant59928, - Variant59929, - Variant59930, - Variant59931, - Variant59932, - Variant59933, - Variant59934, - Variant59935, - Variant59936, - Variant59937, - Variant59938, - Variant59939, - Variant59940, - Variant59941, - Variant59942, - Variant59943, - Variant59944, - Variant59945, - Variant59946, - Variant59947, - Variant59948, - Variant59949, - Variant59950, - Variant59951, - Variant59952, - Variant59953, - Variant59954, - Variant59955, - Variant59956, - Variant59957, - Variant59958, - Variant59959, - Variant59960, - Variant59961, - Variant59962, - Variant59963, - Variant59964, - Variant59965, - Variant59966, - Variant59967, - Variant59968, - Variant59969, - Variant59970, - Variant59971, - Variant59972, - Variant59973, - Variant59974, - Variant59975, - Variant59976, - Variant59977, - Variant59978, - Variant59979, - Variant59980, - Variant59981, - Variant59982, - Variant59983, - Variant59984, - Variant59985, - Variant59986, - Variant59987, - Variant59988, - Variant59989, - Variant59990, - Variant59991, - Variant59992, - Variant59993, - Variant59994, - Variant59995, - Variant59996, - Variant59997, - Variant59998, - Variant59999, - Variant60000, - Variant60001, - Variant60002, - Variant60003, - Variant60004, - Variant60005, - Variant60006, - Variant60007, - Variant60008, - Variant60009, - Variant60010, - Variant60011, - Variant60012, - Variant60013, - Variant60014, - Variant60015, - Variant60016, - Variant60017, - Variant60018, - Variant60019, - Variant60020, - Variant60021, - Variant60022, - Variant60023, - Variant60024, - Variant60025, - Variant60026, - Variant60027, - Variant60028, - Variant60029, - Variant60030, - Variant60031, - Variant60032, - Variant60033, - Variant60034, - Variant60035, - Variant60036, - Variant60037, - Variant60038, - Variant60039, - Variant60040, - Variant60041, - Variant60042, - Variant60043, - Variant60044, - Variant60045, - Variant60046, - Variant60047, - Variant60048, - Variant60049, - Variant60050, - Variant60051, - Variant60052, - Variant60053, - Variant60054, - Variant60055, - Variant60056, - Variant60057, - Variant60058, - Variant60059, - Variant60060, - Variant60061, - Variant60062, - Variant60063, - Variant60064, - Variant60065, - Variant60066, - Variant60067, - Variant60068, - Variant60069, - Variant60070, - Variant60071, - Variant60072, - Variant60073, - Variant60074, - Variant60075, - Variant60076, - Variant60077, - Variant60078, - Variant60079, - Variant60080, - Variant60081, - Variant60082, - Variant60083, - Variant60084, - Variant60085, - Variant60086, - Variant60087, - Variant60088, - Variant60089, - Variant60090, - Variant60091, - Variant60092, - Variant60093, - Variant60094, - Variant60095, - Variant60096, - Variant60097, - Variant60098, - Variant60099, - Variant60100, - Variant60101, - Variant60102, - Variant60103, - Variant60104, - Variant60105, - Variant60106, - Variant60107, - Variant60108, - Variant60109, - Variant60110, - Variant60111, - Variant60112, - Variant60113, - Variant60114, - Variant60115, - Variant60116, - Variant60117, - Variant60118, - Variant60119, - Variant60120, - Variant60121, - Variant60122, - Variant60123, - Variant60124, - Variant60125, - Variant60126, - Variant60127, - Variant60128, - Variant60129, - Variant60130, - Variant60131, - Variant60132, - Variant60133, - Variant60134, - Variant60135, - Variant60136, - Variant60137, - Variant60138, - Variant60139, - Variant60140, - Variant60141, - Variant60142, - Variant60143, - Variant60144, - Variant60145, - Variant60146, - Variant60147, - Variant60148, - Variant60149, - Variant60150, - Variant60151, - Variant60152, - Variant60153, - Variant60154, - Variant60155, - Variant60156, - Variant60157, - Variant60158, - Variant60159, - Variant60160, - Variant60161, - Variant60162, - Variant60163, - Variant60164, - Variant60165, - Variant60166, - Variant60167, - Variant60168, - Variant60169, - Variant60170, - Variant60171, - Variant60172, - Variant60173, - Variant60174, - Variant60175, - Variant60176, - Variant60177, - Variant60178, - Variant60179, - Variant60180, - Variant60181, - Variant60182, - Variant60183, - Variant60184, - Variant60185, - Variant60186, - Variant60187, - Variant60188, - Variant60189, - Variant60190, - Variant60191, - Variant60192, - Variant60193, - Variant60194, - Variant60195, - Variant60196, - Variant60197, - Variant60198, - Variant60199, - Variant60200, - Variant60201, - Variant60202, - Variant60203, - Variant60204, - Variant60205, - Variant60206, - Variant60207, - Variant60208, - Variant60209, - Variant60210, - Variant60211, - Variant60212, - Variant60213, - Variant60214, - Variant60215, - Variant60216, - Variant60217, - Variant60218, - Variant60219, - Variant60220, - Variant60221, - Variant60222, - Variant60223, - Variant60224, - Variant60225, - Variant60226, - Variant60227, - Variant60228, - Variant60229, - Variant60230, - Variant60231, - Variant60232, - Variant60233, - Variant60234, - Variant60235, - Variant60236, - Variant60237, - Variant60238, - Variant60239, - Variant60240, - Variant60241, - Variant60242, - Variant60243, - Variant60244, - Variant60245, - Variant60246, - Variant60247, - Variant60248, - Variant60249, - Variant60250, - Variant60251, - Variant60252, - Variant60253, - Variant60254, - Variant60255, - Variant60256, - Variant60257, - Variant60258, - Variant60259, - Variant60260, - Variant60261, - Variant60262, - Variant60263, - Variant60264, - Variant60265, - Variant60266, - Variant60267, - Variant60268, - Variant60269, - Variant60270, - Variant60271, - Variant60272, - Variant60273, - Variant60274, - Variant60275, - Variant60276, - Variant60277, - Variant60278, - Variant60279, - Variant60280, - Variant60281, - Variant60282, - Variant60283, - Variant60284, - Variant60285, - Variant60286, - Variant60287, - Variant60288, - Variant60289, - Variant60290, - Variant60291, - Variant60292, - Variant60293, - Variant60294, - Variant60295, - Variant60296, - Variant60297, - Variant60298, - Variant60299, - Variant60300, - Variant60301, - Variant60302, - Variant60303, - Variant60304, - Variant60305, - Variant60306, - Variant60307, - Variant60308, - Variant60309, - Variant60310, - Variant60311, - Variant60312, - Variant60313, - Variant60314, - Variant60315, - Variant60316, - Variant60317, - Variant60318, - Variant60319, - Variant60320, - Variant60321, - Variant60322, - Variant60323, - Variant60324, - Variant60325, - Variant60326, - Variant60327, - Variant60328, - Variant60329, - Variant60330, - Variant60331, - Variant60332, - Variant60333, - Variant60334, - Variant60335, - Variant60336, - Variant60337, - Variant60338, - Variant60339, - Variant60340, - Variant60341, - Variant60342, - Variant60343, - Variant60344, - Variant60345, - Variant60346, - Variant60347, - Variant60348, - Variant60349, - Variant60350, - Variant60351, - Variant60352, - Variant60353, - Variant60354, - Variant60355, - Variant60356, - Variant60357, - Variant60358, - Variant60359, - Variant60360, - Variant60361, - Variant60362, - Variant60363, - Variant60364, - Variant60365, - Variant60366, - Variant60367, - Variant60368, - Variant60369, - Variant60370, - Variant60371, - Variant60372, - Variant60373, - Variant60374, - Variant60375, - Variant60376, - Variant60377, - Variant60378, - Variant60379, - Variant60380, - Variant60381, - Variant60382, - Variant60383, - Variant60384, - Variant60385, - Variant60386, - Variant60387, - Variant60388, - Variant60389, - Variant60390, - Variant60391, - Variant60392, - Variant60393, - Variant60394, - Variant60395, - Variant60396, - Variant60397, - Variant60398, - Variant60399, - Variant60400, - Variant60401, - Variant60402, - Variant60403, - Variant60404, - Variant60405, - Variant60406, - Variant60407, - Variant60408, - Variant60409, - Variant60410, - Variant60411, - Variant60412, - Variant60413, - Variant60414, - Variant60415, - Variant60416, - Variant60417, - Variant60418, - Variant60419, - Variant60420, - Variant60421, - Variant60422, - Variant60423, - Variant60424, - Variant60425, - Variant60426, - Variant60427, - Variant60428, - Variant60429, - Variant60430, - Variant60431, - Variant60432, - Variant60433, - Variant60434, - Variant60435, - Variant60436, - Variant60437, - Variant60438, - Variant60439, - Variant60440, - Variant60441, - Variant60442, - Variant60443, - Variant60444, - Variant60445, - Variant60446, - Variant60447, - Variant60448, - Variant60449, - Variant60450, - Variant60451, - Variant60452, - Variant60453, - Variant60454, - Variant60455, - Variant60456, - Variant60457, - Variant60458, - Variant60459, - Variant60460, - Variant60461, - Variant60462, - Variant60463, - Variant60464, - Variant60465, - Variant60466, - Variant60467, - Variant60468, - Variant60469, - Variant60470, - Variant60471, - Variant60472, - Variant60473, - Variant60474, - Variant60475, - Variant60476, - Variant60477, - Variant60478, - Variant60479, - Variant60480, - Variant60481, - Variant60482, - Variant60483, - Variant60484, - Variant60485, - Variant60486, - Variant60487, - Variant60488, - Variant60489, - Variant60490, - Variant60491, - Variant60492, - Variant60493, - Variant60494, - Variant60495, - Variant60496, - Variant60497, - Variant60498, - Variant60499, - Variant60500, - Variant60501, - Variant60502, - Variant60503, - Variant60504, - Variant60505, - Variant60506, - Variant60507, - Variant60508, - Variant60509, - Variant60510, - Variant60511, - Variant60512, - Variant60513, - Variant60514, - Variant60515, - Variant60516, - Variant60517, - Variant60518, - Variant60519, - Variant60520, - Variant60521, - Variant60522, - Variant60523, - Variant60524, - Variant60525, - Variant60526, - Variant60527, - Variant60528, - Variant60529, - Variant60530, - Variant60531, - Variant60532, - Variant60533, - Variant60534, - Variant60535, - Variant60536, - Variant60537, - Variant60538, - Variant60539, - Variant60540, - Variant60541, - Variant60542, - Variant60543, - Variant60544, - Variant60545, - Variant60546, - Variant60547, - Variant60548, - Variant60549, - Variant60550, - Variant60551, - Variant60552, - Variant60553, - Variant60554, - Variant60555, - Variant60556, - Variant60557, - Variant60558, - Variant60559, - Variant60560, - Variant60561, - Variant60562, - Variant60563, - Variant60564, - Variant60565, - Variant60566, - Variant60567, - Variant60568, - Variant60569, - Variant60570, - Variant60571, - Variant60572, - Variant60573, - Variant60574, - Variant60575, - Variant60576, - Variant60577, - Variant60578, - Variant60579, - Variant60580, - Variant60581, - Variant60582, - Variant60583, - Variant60584, - Variant60585, - Variant60586, - Variant60587, - Variant60588, - Variant60589, - Variant60590, - Variant60591, - Variant60592, - Variant60593, - Variant60594, - Variant60595, - Variant60596, - Variant60597, - Variant60598, - Variant60599, - Variant60600, - Variant60601, - Variant60602, - Variant60603, - Variant60604, - Variant60605, - Variant60606, - Variant60607, - Variant60608, - Variant60609, - Variant60610, - Variant60611, - Variant60612, - Variant60613, - Variant60614, - Variant60615, - Variant60616, - Variant60617, - Variant60618, - Variant60619, - Variant60620, - Variant60621, - Variant60622, - Variant60623, - Variant60624, - Variant60625, - Variant60626, - Variant60627, - Variant60628, - Variant60629, - Variant60630, - Variant60631, - Variant60632, - Variant60633, - Variant60634, - Variant60635, - Variant60636, - Variant60637, - Variant60638, - Variant60639, - Variant60640, - Variant60641, - Variant60642, - Variant60643, - Variant60644, - Variant60645, - Variant60646, - Variant60647, - Variant60648, - Variant60649, - Variant60650, - Variant60651, - Variant60652, - Variant60653, - Variant60654, - Variant60655, - Variant60656, - Variant60657, - Variant60658, - Variant60659, - Variant60660, - Variant60661, - Variant60662, - Variant60663, - Variant60664, - Variant60665, - Variant60666, - Variant60667, - Variant60668, - Variant60669, - Variant60670, - Variant60671, - Variant60672, - Variant60673, - Variant60674, - Variant60675, - Variant60676, - Variant60677, - Variant60678, - Variant60679, - Variant60680, - Variant60681, - Variant60682, - Variant60683, - Variant60684, - Variant60685, - Variant60686, - Variant60687, - Variant60688, - Variant60689, - Variant60690, - Variant60691, - Variant60692, - Variant60693, - Variant60694, - Variant60695, - Variant60696, - Variant60697, - Variant60698, - Variant60699, - Variant60700, - Variant60701, - Variant60702, - Variant60703, - Variant60704, - Variant60705, - Variant60706, - Variant60707, - Variant60708, - Variant60709, - Variant60710, - Variant60711, - Variant60712, - Variant60713, - Variant60714, - Variant60715, - Variant60716, - Variant60717, - Variant60718, - Variant60719, - Variant60720, - Variant60721, - Variant60722, - Variant60723, - Variant60724, - Variant60725, - Variant60726, - Variant60727, - Variant60728, - Variant60729, - Variant60730, - Variant60731, - Variant60732, - Variant60733, - Variant60734, - Variant60735, - Variant60736, - Variant60737, - Variant60738, - Variant60739, - Variant60740, - Variant60741, - Variant60742, - Variant60743, - Variant60744, - Variant60745, - Variant60746, - Variant60747, - Variant60748, - Variant60749, - Variant60750, - Variant60751, - Variant60752, - Variant60753, - Variant60754, - Variant60755, - Variant60756, - Variant60757, - Variant60758, - Variant60759, - Variant60760, - Variant60761, - Variant60762, - Variant60763, - Variant60764, - Variant60765, - Variant60766, - Variant60767, - Variant60768, - Variant60769, - Variant60770, - Variant60771, - Variant60772, - Variant60773, - Variant60774, - Variant60775, - Variant60776, - Variant60777, - Variant60778, - Variant60779, - Variant60780, - Variant60781, - Variant60782, - Variant60783, - Variant60784, - Variant60785, - Variant60786, - Variant60787, - Variant60788, - Variant60789, - Variant60790, - Variant60791, - Variant60792, - Variant60793, - Variant60794, - Variant60795, - Variant60796, - Variant60797, - Variant60798, - Variant60799, - Variant60800, - Variant60801, - Variant60802, - Variant60803, - Variant60804, - Variant60805, - Variant60806, - Variant60807, - Variant60808, - Variant60809, - Variant60810, - Variant60811, - Variant60812, - Variant60813, - Variant60814, - Variant60815, - Variant60816, - Variant60817, - Variant60818, - Variant60819, - Variant60820, - Variant60821, - Variant60822, - Variant60823, - Variant60824, - Variant60825, - Variant60826, - Variant60827, - Variant60828, - Variant60829, - Variant60830, - Variant60831, - Variant60832, - Variant60833, - Variant60834, - Variant60835, - Variant60836, - Variant60837, - Variant60838, - Variant60839, - Variant60840, - Variant60841, - Variant60842, - Variant60843, - Variant60844, - Variant60845, - Variant60846, - Variant60847, - Variant60848, - Variant60849, - Variant60850, - Variant60851, - Variant60852, - Variant60853, - Variant60854, - Variant60855, - Variant60856, - Variant60857, - Variant60858, - Variant60859, - Variant60860, - Variant60861, - Variant60862, - Variant60863, - Variant60864, - Variant60865, - Variant60866, - Variant60867, - Variant60868, - Variant60869, - Variant60870, - Variant60871, - Variant60872, - Variant60873, - Variant60874, - Variant60875, - Variant60876, - Variant60877, - Variant60878, - Variant60879, - Variant60880, - Variant60881, - Variant60882, - Variant60883, - Variant60884, - Variant60885, - Variant60886, - Variant60887, - Variant60888, - Variant60889, - Variant60890, - Variant60891, - Variant60892, - Variant60893, - Variant60894, - Variant60895, - Variant60896, - Variant60897, - Variant60898, - Variant60899, - Variant60900, - Variant60901, - Variant60902, - Variant60903, - Variant60904, - Variant60905, - Variant60906, - Variant60907, - Variant60908, - Variant60909, - Variant60910, - Variant60911, - Variant60912, - Variant60913, - Variant60914, - Variant60915, - Variant60916, - Variant60917, - Variant60918, - Variant60919, - Variant60920, - Variant60921, - Variant60922, - Variant60923, - Variant60924, - Variant60925, - Variant60926, - Variant60927, - Variant60928, - Variant60929, - Variant60930, - Variant60931, - Variant60932, - Variant60933, - Variant60934, - Variant60935, - Variant60936, - Variant60937, - Variant60938, - Variant60939, - Variant60940, - Variant60941, - Variant60942, - Variant60943, - Variant60944, - Variant60945, - Variant60946, - Variant60947, - Variant60948, - Variant60949, - Variant60950, - Variant60951, - Variant60952, - Variant60953, - Variant60954, - Variant60955, - Variant60956, - Variant60957, - Variant60958, - Variant60959, - Variant60960, - Variant60961, - Variant60962, - Variant60963, - Variant60964, - Variant60965, - Variant60966, - Variant60967, - Variant60968, - Variant60969, - Variant60970, - Variant60971, - Variant60972, - Variant60973, - Variant60974, - Variant60975, - Variant60976, - Variant60977, - Variant60978, - Variant60979, - Variant60980, - Variant60981, - Variant60982, - Variant60983, - Variant60984, - Variant60985, - Variant60986, - Variant60987, - Variant60988, - Variant60989, - Variant60990, - Variant60991, - Variant60992, - Variant60993, - Variant60994, - Variant60995, - Variant60996, - Variant60997, - Variant60998, - Variant60999, - Variant61000, - Variant61001, - Variant61002, - Variant61003, - Variant61004, - Variant61005, - Variant61006, - Variant61007, - Variant61008, - Variant61009, - Variant61010, - Variant61011, - Variant61012, - Variant61013, - Variant61014, - Variant61015, - Variant61016, - Variant61017, - Variant61018, - Variant61019, - Variant61020, - Variant61021, - Variant61022, - Variant61023, - Variant61024, - Variant61025, - Variant61026, - Variant61027, - Variant61028, - Variant61029, - Variant61030, - Variant61031, - Variant61032, - Variant61033, - Variant61034, - Variant61035, - Variant61036, - Variant61037, - Variant61038, - Variant61039, - Variant61040, - Variant61041, - Variant61042, - Variant61043, - Variant61044, - Variant61045, - Variant61046, - Variant61047, - Variant61048, - Variant61049, - Variant61050, - Variant61051, - Variant61052, - Variant61053, - Variant61054, - Variant61055, - Variant61056, - Variant61057, - Variant61058, - Variant61059, - Variant61060, - Variant61061, - Variant61062, - Variant61063, - Variant61064, - Variant61065, - Variant61066, - Variant61067, - Variant61068, - Variant61069, - Variant61070, - Variant61071, - Variant61072, - Variant61073, - Variant61074, - Variant61075, - Variant61076, - Variant61077, - Variant61078, - Variant61079, - Variant61080, - Variant61081, - Variant61082, - Variant61083, - Variant61084, - Variant61085, - Variant61086, - Variant61087, - Variant61088, - Variant61089, - Variant61090, - Variant61091, - Variant61092, - Variant61093, - Variant61094, - Variant61095, - Variant61096, - Variant61097, - Variant61098, - Variant61099, - Variant61100, - Variant61101, - Variant61102, - Variant61103, - Variant61104, - Variant61105, - Variant61106, - Variant61107, - Variant61108, - Variant61109, - Variant61110, - Variant61111, - Variant61112, - Variant61113, - Variant61114, - Variant61115, - Variant61116, - Variant61117, - Variant61118, - Variant61119, - Variant61120, - Variant61121, - Variant61122, - Variant61123, - Variant61124, - Variant61125, - Variant61126, - Variant61127, - Variant61128, - Variant61129, - Variant61130, - Variant61131, - Variant61132, - Variant61133, - Variant61134, - Variant61135, - Variant61136, - Variant61137, - Variant61138, - Variant61139, - Variant61140, - Variant61141, - Variant61142, - Variant61143, - Variant61144, - Variant61145, - Variant61146, - Variant61147, - Variant61148, - Variant61149, - Variant61150, - Variant61151, - Variant61152, - Variant61153, - Variant61154, - Variant61155, - Variant61156, - Variant61157, - Variant61158, - Variant61159, - Variant61160, - Variant61161, - Variant61162, - Variant61163, - Variant61164, - Variant61165, - Variant61166, - Variant61167, - Variant61168, - Variant61169, - Variant61170, - Variant61171, - Variant61172, - Variant61173, - Variant61174, - Variant61175, - Variant61176, - Variant61177, - Variant61178, - Variant61179, - Variant61180, - Variant61181, - Variant61182, - Variant61183, - Variant61184, - Variant61185, - Variant61186, - Variant61187, - Variant61188, - Variant61189, - Variant61190, - Variant61191, - Variant61192, - Variant61193, - Variant61194, - Variant61195, - Variant61196, - Variant61197, - Variant61198, - Variant61199, - Variant61200, - Variant61201, - Variant61202, - Variant61203, - Variant61204, - Variant61205, - Variant61206, - Variant61207, - Variant61208, - Variant61209, - Variant61210, - Variant61211, - Variant61212, - Variant61213, - Variant61214, - Variant61215, - Variant61216, - Variant61217, - Variant61218, - Variant61219, - Variant61220, - Variant61221, - Variant61222, - Variant61223, - Variant61224, - Variant61225, - Variant61226, - Variant61227, - Variant61228, - Variant61229, - Variant61230, - Variant61231, - Variant61232, - Variant61233, - Variant61234, - Variant61235, - Variant61236, - Variant61237, - Variant61238, - Variant61239, - Variant61240, - Variant61241, - Variant61242, - Variant61243, - Variant61244, - Variant61245, - Variant61246, - Variant61247, - Variant61248, - Variant61249, - Variant61250, - Variant61251, - Variant61252, - Variant61253, - Variant61254, - Variant61255, - Variant61256, - Variant61257, - Variant61258, - Variant61259, - Variant61260, - Variant61261, - Variant61262, - Variant61263, - Variant61264, - Variant61265, - Variant61266, - Variant61267, - Variant61268, - Variant61269, - Variant61270, - Variant61271, - Variant61272, - Variant61273, - Variant61274, - Variant61275, - Variant61276, - Variant61277, - Variant61278, - Variant61279, - Variant61280, - Variant61281, - Variant61282, - Variant61283, - Variant61284, - Variant61285, - Variant61286, - Variant61287, - Variant61288, - Variant61289, - Variant61290, - Variant61291, - Variant61292, - Variant61293, - Variant61294, - Variant61295, - Variant61296, - Variant61297, - Variant61298, - Variant61299, - Variant61300, - Variant61301, - Variant61302, - Variant61303, - Variant61304, - Variant61305, - Variant61306, - Variant61307, - Variant61308, - Variant61309, - Variant61310, - Variant61311, - Variant61312, - Variant61313, - Variant61314, - Variant61315, - Variant61316, - Variant61317, - Variant61318, - Variant61319, - Variant61320, - Variant61321, - Variant61322, - Variant61323, - Variant61324, - Variant61325, - Variant61326, - Variant61327, - Variant61328, - Variant61329, - Variant61330, - Variant61331, - Variant61332, - Variant61333, - Variant61334, - Variant61335, - Variant61336, - Variant61337, - Variant61338, - Variant61339, - Variant61340, - Variant61341, - Variant61342, - Variant61343, - Variant61344, - Variant61345, - Variant61346, - Variant61347, - Variant61348, - Variant61349, - Variant61350, - Variant61351, - Variant61352, - Variant61353, - Variant61354, - Variant61355, - Variant61356, - Variant61357, - Variant61358, - Variant61359, - Variant61360, - Variant61361, - Variant61362, - Variant61363, - Variant61364, - Variant61365, - Variant61366, - Variant61367, - Variant61368, - Variant61369, - Variant61370, - Variant61371, - Variant61372, - Variant61373, - Variant61374, - Variant61375, - Variant61376, - Variant61377, - Variant61378, - Variant61379, - Variant61380, - Variant61381, - Variant61382, - Variant61383, - Variant61384, - Variant61385, - Variant61386, - Variant61387, - Variant61388, - Variant61389, - Variant61390, - Variant61391, - Variant61392, - Variant61393, - Variant61394, - Variant61395, - Variant61396, - Variant61397, - Variant61398, - Variant61399, - Variant61400, - Variant61401, - Variant61402, - Variant61403, - Variant61404, - Variant61405, - Variant61406, - Variant61407, - Variant61408, - Variant61409, - Variant61410, - Variant61411, - Variant61412, - Variant61413, - Variant61414, - Variant61415, - Variant61416, - Variant61417, - Variant61418, - Variant61419, - Variant61420, - Variant61421, - Variant61422, - Variant61423, - Variant61424, - Variant61425, - Variant61426, - Variant61427, - Variant61428, - Variant61429, - Variant61430, - Variant61431, - Variant61432, - Variant61433, - Variant61434, - Variant61435, - Variant61436, - Variant61437, - Variant61438, - Variant61439, - Variant61440, - Variant61441, - Variant61442, - Variant61443, - Variant61444, - Variant61445, - Variant61446, - Variant61447, - Variant61448, - Variant61449, - Variant61450, - Variant61451, - Variant61452, - Variant61453, - Variant61454, - Variant61455, - Variant61456, - Variant61457, - Variant61458, - Variant61459, - Variant61460, - Variant61461, - Variant61462, - Variant61463, - Variant61464, - Variant61465, - Variant61466, - Variant61467, - Variant61468, - Variant61469, - Variant61470, - Variant61471, - Variant61472, - Variant61473, - Variant61474, - Variant61475, - Variant61476, - Variant61477, - Variant61478, - Variant61479, - Variant61480, - Variant61481, - Variant61482, - Variant61483, - Variant61484, - Variant61485, - Variant61486, - Variant61487, - Variant61488, - Variant61489, - Variant61490, - Variant61491, - Variant61492, - Variant61493, - Variant61494, - Variant61495, - Variant61496, - Variant61497, - Variant61498, - Variant61499, - Variant61500, - Variant61501, - Variant61502, - Variant61503, - Variant61504, - Variant61505, - Variant61506, - Variant61507, - Variant61508, - Variant61509, - Variant61510, - Variant61511, - Variant61512, - Variant61513, - Variant61514, - Variant61515, - Variant61516, - Variant61517, - Variant61518, - Variant61519, - Variant61520, - Variant61521, - Variant61522, - Variant61523, - Variant61524, - Variant61525, - Variant61526, - Variant61527, - Variant61528, - Variant61529, - Variant61530, - Variant61531, - Variant61532, - Variant61533, - Variant61534, - Variant61535, - Variant61536, - Variant61537, - Variant61538, - Variant61539, - Variant61540, - Variant61541, - Variant61542, - Variant61543, - Variant61544, - Variant61545, - Variant61546, - Variant61547, - Variant61548, - Variant61549, - Variant61550, - Variant61551, - Variant61552, - Variant61553, - Variant61554, - Variant61555, - Variant61556, - Variant61557, - Variant61558, - Variant61559, - Variant61560, - Variant61561, - Variant61562, - Variant61563, - Variant61564, - Variant61565, - Variant61566, - Variant61567, - Variant61568, - Variant61569, - Variant61570, - Variant61571, - Variant61572, - Variant61573, - Variant61574, - Variant61575, - Variant61576, - Variant61577, - Variant61578, - Variant61579, - Variant61580, - Variant61581, - Variant61582, - Variant61583, - Variant61584, - Variant61585, - Variant61586, - Variant61587, - Variant61588, - Variant61589, - Variant61590, - Variant61591, - Variant61592, - Variant61593, - Variant61594, - Variant61595, - Variant61596, - Variant61597, - Variant61598, - Variant61599, - Variant61600, - Variant61601, - Variant61602, - Variant61603, - Variant61604, - Variant61605, - Variant61606, - Variant61607, - Variant61608, - Variant61609, - Variant61610, - Variant61611, - Variant61612, - Variant61613, - Variant61614, - Variant61615, - Variant61616, - Variant61617, - Variant61618, - Variant61619, - Variant61620, - Variant61621, - Variant61622, - Variant61623, - Variant61624, - Variant61625, - Variant61626, - Variant61627, - Variant61628, - Variant61629, - Variant61630, - Variant61631, - Variant61632, - Variant61633, - Variant61634, - Variant61635, - Variant61636, - Variant61637, - Variant61638, - Variant61639, - Variant61640, - Variant61641, - Variant61642, - Variant61643, - Variant61644, - Variant61645, - Variant61646, - Variant61647, - Variant61648, - Variant61649, - Variant61650, - Variant61651, - Variant61652, - Variant61653, - Variant61654, - Variant61655, - Variant61656, - Variant61657, - Variant61658, - Variant61659, - Variant61660, - Variant61661, - Variant61662, - Variant61663, - Variant61664, - Variant61665, - Variant61666, - Variant61667, - Variant61668, - Variant61669, - Variant61670, - Variant61671, - Variant61672, - Variant61673, - Variant61674, - Variant61675, - Variant61676, - Variant61677, - Variant61678, - Variant61679, - Variant61680, - Variant61681, - Variant61682, - Variant61683, - Variant61684, - Variant61685, - Variant61686, - Variant61687, - Variant61688, - Variant61689, - Variant61690, - Variant61691, - Variant61692, - Variant61693, - Variant61694, - Variant61695, - Variant61696, - Variant61697, - Variant61698, - Variant61699, - Variant61700, - Variant61701, - Variant61702, - Variant61703, - Variant61704, - Variant61705, - Variant61706, - Variant61707, - Variant61708, - Variant61709, - Variant61710, - Variant61711, - Variant61712, - Variant61713, - Variant61714, - Variant61715, - Variant61716, - Variant61717, - Variant61718, - Variant61719, - Variant61720, - Variant61721, - Variant61722, - Variant61723, - Variant61724, - Variant61725, - Variant61726, - Variant61727, - Variant61728, - Variant61729, - Variant61730, - Variant61731, - Variant61732, - Variant61733, - Variant61734, - Variant61735, - Variant61736, - Variant61737, - Variant61738, - Variant61739, - Variant61740, - Variant61741, - Variant61742, - Variant61743, - Variant61744, - Variant61745, - Variant61746, - Variant61747, - Variant61748, - Variant61749, - Variant61750, - Variant61751, - Variant61752, - Variant61753, - Variant61754, - Variant61755, - Variant61756, - Variant61757, - Variant61758, - Variant61759, - Variant61760, - Variant61761, - Variant61762, - Variant61763, - Variant61764, - Variant61765, - Variant61766, - Variant61767, - Variant61768, - Variant61769, - Variant61770, - Variant61771, - Variant61772, - Variant61773, - Variant61774, - Variant61775, - Variant61776, - Variant61777, - Variant61778, - Variant61779, - Variant61780, - Variant61781, - Variant61782, - Variant61783, - Variant61784, - Variant61785, - Variant61786, - Variant61787, - Variant61788, - Variant61789, - Variant61790, - Variant61791, - Variant61792, - Variant61793, - Variant61794, - Variant61795, - Variant61796, - Variant61797, - Variant61798, - Variant61799, - Variant61800, - Variant61801, - Variant61802, - Variant61803, - Variant61804, - Variant61805, - Variant61806, - Variant61807, - Variant61808, - Variant61809, - Variant61810, - Variant61811, - Variant61812, - Variant61813, - Variant61814, - Variant61815, - Variant61816, - Variant61817, - Variant61818, - Variant61819, - Variant61820, - Variant61821, - Variant61822, - Variant61823, - Variant61824, - Variant61825, - Variant61826, - Variant61827, - Variant61828, - Variant61829, - Variant61830, - Variant61831, - Variant61832, - Variant61833, - Variant61834, - Variant61835, - Variant61836, - Variant61837, - Variant61838, - Variant61839, - Variant61840, - Variant61841, - Variant61842, - Variant61843, - Variant61844, - Variant61845, - Variant61846, - Variant61847, - Variant61848, - Variant61849, - Variant61850, - Variant61851, - Variant61852, - Variant61853, - Variant61854, - Variant61855, - Variant61856, - Variant61857, - Variant61858, - Variant61859, - Variant61860, - Variant61861, - Variant61862, - Variant61863, - Variant61864, - Variant61865, - Variant61866, - Variant61867, - Variant61868, - Variant61869, - Variant61870, - Variant61871, - Variant61872, - Variant61873, - Variant61874, - Variant61875, - Variant61876, - Variant61877, - Variant61878, - Variant61879, - Variant61880, - Variant61881, - Variant61882, - Variant61883, - Variant61884, - Variant61885, - Variant61886, - Variant61887, - Variant61888, - Variant61889, - Variant61890, - Variant61891, - Variant61892, - Variant61893, - Variant61894, - Variant61895, - Variant61896, - Variant61897, - Variant61898, - Variant61899, - Variant61900, - Variant61901, - Variant61902, - Variant61903, - Variant61904, - Variant61905, - Variant61906, - Variant61907, - Variant61908, - Variant61909, - Variant61910, - Variant61911, - Variant61912, - Variant61913, - Variant61914, - Variant61915, - Variant61916, - Variant61917, - Variant61918, - Variant61919, - Variant61920, - Variant61921, - Variant61922, - Variant61923, - Variant61924, - Variant61925, - Variant61926, - Variant61927, - Variant61928, - Variant61929, - Variant61930, - Variant61931, - Variant61932, - Variant61933, - Variant61934, - Variant61935, - Variant61936, - Variant61937, - Variant61938, - Variant61939, - Variant61940, - Variant61941, - Variant61942, - Variant61943, - Variant61944, - Variant61945, - Variant61946, - Variant61947, - Variant61948, - Variant61949, - Variant61950, - Variant61951, - Variant61952, - Variant61953, - Variant61954, - Variant61955, - Variant61956, - Variant61957, - Variant61958, - Variant61959, - Variant61960, - Variant61961, - Variant61962, - Variant61963, - Variant61964, - Variant61965, - Variant61966, - Variant61967, - Variant61968, - Variant61969, - Variant61970, - Variant61971, - Variant61972, - Variant61973, - Variant61974, - Variant61975, - Variant61976, - Variant61977, - Variant61978, - Variant61979, - Variant61980, - Variant61981, - Variant61982, - Variant61983, - Variant61984, - Variant61985, - Variant61986, - Variant61987, - Variant61988, - Variant61989, - Variant61990, - Variant61991, - Variant61992, - Variant61993, - Variant61994, - Variant61995, - Variant61996, - Variant61997, - Variant61998, - Variant61999, - Variant62000, - Variant62001, - Variant62002, - Variant62003, - Variant62004, - Variant62005, - Variant62006, - Variant62007, - Variant62008, - Variant62009, - Variant62010, - Variant62011, - Variant62012, - Variant62013, - Variant62014, - Variant62015, - Variant62016, - Variant62017, - Variant62018, - Variant62019, - Variant62020, - Variant62021, - Variant62022, - Variant62023, - Variant62024, - Variant62025, - Variant62026, - Variant62027, - Variant62028, - Variant62029, - Variant62030, - Variant62031, - Variant62032, - Variant62033, - Variant62034, - Variant62035, - Variant62036, - Variant62037, - Variant62038, - Variant62039, - Variant62040, - Variant62041, - Variant62042, - Variant62043, - Variant62044, - Variant62045, - Variant62046, - Variant62047, - Variant62048, - Variant62049, - Variant62050, - Variant62051, - Variant62052, - Variant62053, - Variant62054, - Variant62055, - Variant62056, - Variant62057, - Variant62058, - Variant62059, - Variant62060, - Variant62061, - Variant62062, - Variant62063, - Variant62064, - Variant62065, - Variant62066, - Variant62067, - Variant62068, - Variant62069, - Variant62070, - Variant62071, - Variant62072, - Variant62073, - Variant62074, - Variant62075, - Variant62076, - Variant62077, - Variant62078, - Variant62079, - Variant62080, - Variant62081, - Variant62082, - Variant62083, - Variant62084, - Variant62085, - Variant62086, - Variant62087, - Variant62088, - Variant62089, - Variant62090, - Variant62091, - Variant62092, - Variant62093, - Variant62094, - Variant62095, - Variant62096, - Variant62097, - Variant62098, - Variant62099, - Variant62100, - Variant62101, - Variant62102, - Variant62103, - Variant62104, - Variant62105, - Variant62106, - Variant62107, - Variant62108, - Variant62109, - Variant62110, - Variant62111, - Variant62112, - Variant62113, - Variant62114, - Variant62115, - Variant62116, - Variant62117, - Variant62118, - Variant62119, - Variant62120, - Variant62121, - Variant62122, - Variant62123, - Variant62124, - Variant62125, - Variant62126, - Variant62127, - Variant62128, - Variant62129, - Variant62130, - Variant62131, - Variant62132, - Variant62133, - Variant62134, - Variant62135, - Variant62136, - Variant62137, - Variant62138, - Variant62139, - Variant62140, - Variant62141, - Variant62142, - Variant62143, - Variant62144, - Variant62145, - Variant62146, - Variant62147, - Variant62148, - Variant62149, - Variant62150, - Variant62151, - Variant62152, - Variant62153, - Variant62154, - Variant62155, - Variant62156, - Variant62157, - Variant62158, - Variant62159, - Variant62160, - Variant62161, - Variant62162, - Variant62163, - Variant62164, - Variant62165, - Variant62166, - Variant62167, - Variant62168, - Variant62169, - Variant62170, - Variant62171, - Variant62172, - Variant62173, - Variant62174, - Variant62175, - Variant62176, - Variant62177, - Variant62178, - Variant62179, - Variant62180, - Variant62181, - Variant62182, - Variant62183, - Variant62184, - Variant62185, - Variant62186, - Variant62187, - Variant62188, - Variant62189, - Variant62190, - Variant62191, - Variant62192, - Variant62193, - Variant62194, - Variant62195, - Variant62196, - Variant62197, - Variant62198, - Variant62199, - Variant62200, - Variant62201, - Variant62202, - Variant62203, - Variant62204, - Variant62205, - Variant62206, - Variant62207, - Variant62208, - Variant62209, - Variant62210, - Variant62211, - Variant62212, - Variant62213, - Variant62214, - Variant62215, - Variant62216, - Variant62217, - Variant62218, - Variant62219, - Variant62220, - Variant62221, - Variant62222, - Variant62223, - Variant62224, - Variant62225, - Variant62226, - Variant62227, - Variant62228, - Variant62229, - Variant62230, - Variant62231, - Variant62232, - Variant62233, - Variant62234, - Variant62235, - Variant62236, - Variant62237, - Variant62238, - Variant62239, - Variant62240, - Variant62241, - Variant62242, - Variant62243, - Variant62244, - Variant62245, - Variant62246, - Variant62247, - Variant62248, - Variant62249, - Variant62250, - Variant62251, - Variant62252, - Variant62253, - Variant62254, - Variant62255, - Variant62256, - Variant62257, - Variant62258, - Variant62259, - Variant62260, - Variant62261, - Variant62262, - Variant62263, - Variant62264, - Variant62265, - Variant62266, - Variant62267, - Variant62268, - Variant62269, - Variant62270, - Variant62271, - Variant62272, - Variant62273, - Variant62274, - Variant62275, - Variant62276, - Variant62277, - Variant62278, - Variant62279, - Variant62280, - Variant62281, - Variant62282, - Variant62283, - Variant62284, - Variant62285, - Variant62286, - Variant62287, - Variant62288, - Variant62289, - Variant62290, - Variant62291, - Variant62292, - Variant62293, - Variant62294, - Variant62295, - Variant62296, - Variant62297, - Variant62298, - Variant62299, - Variant62300, - Variant62301, - Variant62302, - Variant62303, - Variant62304, - Variant62305, - Variant62306, - Variant62307, - Variant62308, - Variant62309, - Variant62310, - Variant62311, - Variant62312, - Variant62313, - Variant62314, - Variant62315, - Variant62316, - Variant62317, - Variant62318, - Variant62319, - Variant62320, - Variant62321, - Variant62322, - Variant62323, - Variant62324, - Variant62325, - Variant62326, - Variant62327, - Variant62328, - Variant62329, - Variant62330, - Variant62331, - Variant62332, - Variant62333, - Variant62334, - Variant62335, - Variant62336, - Variant62337, - Variant62338, - Variant62339, - Variant62340, - Variant62341, - Variant62342, - Variant62343, - Variant62344, - Variant62345, - Variant62346, - Variant62347, - Variant62348, - Variant62349, - Variant62350, - Variant62351, - Variant62352, - Variant62353, - Variant62354, - Variant62355, - Variant62356, - Variant62357, - Variant62358, - Variant62359, - Variant62360, - Variant62361, - Variant62362, - Variant62363, - Variant62364, - Variant62365, - Variant62366, - Variant62367, - Variant62368, - Variant62369, - Variant62370, - Variant62371, - Variant62372, - Variant62373, - Variant62374, - Variant62375, - Variant62376, - Variant62377, - Variant62378, - Variant62379, - Variant62380, - Variant62381, - Variant62382, - Variant62383, - Variant62384, - Variant62385, - Variant62386, - Variant62387, - Variant62388, - Variant62389, - Variant62390, - Variant62391, - Variant62392, - Variant62393, - Variant62394, - Variant62395, - Variant62396, - Variant62397, - Variant62398, - Variant62399, - Variant62400, - Variant62401, - Variant62402, - Variant62403, - Variant62404, - Variant62405, - Variant62406, - Variant62407, - Variant62408, - Variant62409, - Variant62410, - Variant62411, - Variant62412, - Variant62413, - Variant62414, - Variant62415, - Variant62416, - Variant62417, - Variant62418, - Variant62419, - Variant62420, - Variant62421, - Variant62422, - Variant62423, - Variant62424, - Variant62425, - Variant62426, - Variant62427, - Variant62428, - Variant62429, - Variant62430, - Variant62431, - Variant62432, - Variant62433, - Variant62434, - Variant62435, - Variant62436, - Variant62437, - Variant62438, - Variant62439, - Variant62440, - Variant62441, - Variant62442, - Variant62443, - Variant62444, - Variant62445, - Variant62446, - Variant62447, - Variant62448, - Variant62449, - Variant62450, - Variant62451, - Variant62452, - Variant62453, - Variant62454, - Variant62455, - Variant62456, - Variant62457, - Variant62458, - Variant62459, - Variant62460, - Variant62461, - Variant62462, - Variant62463, - Variant62464, - Variant62465, - Variant62466, - Variant62467, - Variant62468, - Variant62469, - Variant62470, - Variant62471, - Variant62472, - Variant62473, - Variant62474, - Variant62475, - Variant62476, - Variant62477, - Variant62478, - Variant62479, - Variant62480, - Variant62481, - Variant62482, - Variant62483, - Variant62484, - Variant62485, - Variant62486, - Variant62487, - Variant62488, - Variant62489, - Variant62490, - Variant62491, - Variant62492, - Variant62493, - Variant62494, - Variant62495, - Variant62496, - Variant62497, - Variant62498, - Variant62499, - Variant62500, - Variant62501, - Variant62502, - Variant62503, - Variant62504, - Variant62505, - Variant62506, - Variant62507, - Variant62508, - Variant62509, - Variant62510, - Variant62511, - Variant62512, - Variant62513, - Variant62514, - Variant62515, - Variant62516, - Variant62517, - Variant62518, - Variant62519, - Variant62520, - Variant62521, - Variant62522, - Variant62523, - Variant62524, - Variant62525, - Variant62526, - Variant62527, - Variant62528, - Variant62529, - Variant62530, - Variant62531, - Variant62532, - Variant62533, - Variant62534, - Variant62535, - Variant62536, - Variant62537, - Variant62538, - Variant62539, - Variant62540, - Variant62541, - Variant62542, - Variant62543, - Variant62544, - Variant62545, - Variant62546, - Variant62547, - Variant62548, - Variant62549, - Variant62550, - Variant62551, - Variant62552, - Variant62553, - Variant62554, - Variant62555, - Variant62556, - Variant62557, - Variant62558, - Variant62559, - Variant62560, - Variant62561, - Variant62562, - Variant62563, - Variant62564, - Variant62565, - Variant62566, - Variant62567, - Variant62568, - Variant62569, - Variant62570, - Variant62571, - Variant62572, - Variant62573, - Variant62574, - Variant62575, - Variant62576, - Variant62577, - Variant62578, - Variant62579, - Variant62580, - Variant62581, - Variant62582, - Variant62583, - Variant62584, - Variant62585, - Variant62586, - Variant62587, - Variant62588, - Variant62589, - Variant62590, - Variant62591, - Variant62592, - Variant62593, - Variant62594, - Variant62595, - Variant62596, - Variant62597, - Variant62598, - Variant62599, - Variant62600, - Variant62601, - Variant62602, - Variant62603, - Variant62604, - Variant62605, - Variant62606, - Variant62607, - Variant62608, - Variant62609, - Variant62610, - Variant62611, - Variant62612, - Variant62613, - Variant62614, - Variant62615, - Variant62616, - Variant62617, - Variant62618, - Variant62619, - Variant62620, - Variant62621, - Variant62622, - Variant62623, - Variant62624, - Variant62625, - Variant62626, - Variant62627, - Variant62628, - Variant62629, - Variant62630, - Variant62631, - Variant62632, - Variant62633, - Variant62634, - Variant62635, - Variant62636, - Variant62637, - Variant62638, - Variant62639, - Variant62640, - Variant62641, - Variant62642, - Variant62643, - Variant62644, - Variant62645, - Variant62646, - Variant62647, - Variant62648, - Variant62649, - Variant62650, - Variant62651, - Variant62652, - Variant62653, - Variant62654, - Variant62655, - Variant62656, - Variant62657, - Variant62658, - Variant62659, - Variant62660, - Variant62661, - Variant62662, - Variant62663, - Variant62664, - Variant62665, - Variant62666, - Variant62667, - Variant62668, - Variant62669, - Variant62670, - Variant62671, - Variant62672, - Variant62673, - Variant62674, - Variant62675, - Variant62676, - Variant62677, - Variant62678, - Variant62679, - Variant62680, - Variant62681, - Variant62682, - Variant62683, - Variant62684, - Variant62685, - Variant62686, - Variant62687, - Variant62688, - Variant62689, - Variant62690, - Variant62691, - Variant62692, - Variant62693, - Variant62694, - Variant62695, - Variant62696, - Variant62697, - Variant62698, - Variant62699, - Variant62700, - Variant62701, - Variant62702, - Variant62703, - Variant62704, - Variant62705, - Variant62706, - Variant62707, - Variant62708, - Variant62709, - Variant62710, - Variant62711, - Variant62712, - Variant62713, - Variant62714, - Variant62715, - Variant62716, - Variant62717, - Variant62718, - Variant62719, - Variant62720, - Variant62721, - Variant62722, - Variant62723, - Variant62724, - Variant62725, - Variant62726, - Variant62727, - Variant62728, - Variant62729, - Variant62730, - Variant62731, - Variant62732, - Variant62733, - Variant62734, - Variant62735, - Variant62736, - Variant62737, - Variant62738, - Variant62739, - Variant62740, - Variant62741, - Variant62742, - Variant62743, - Variant62744, - Variant62745, - Variant62746, - Variant62747, - Variant62748, - Variant62749, - Variant62750, - Variant62751, - Variant62752, - Variant62753, - Variant62754, - Variant62755, - Variant62756, - Variant62757, - Variant62758, - Variant62759, - Variant62760, - Variant62761, - Variant62762, - Variant62763, - Variant62764, - Variant62765, - Variant62766, - Variant62767, - Variant62768, - Variant62769, - Variant62770, - Variant62771, - Variant62772, - Variant62773, - Variant62774, - Variant62775, - Variant62776, - Variant62777, - Variant62778, - Variant62779, - Variant62780, - Variant62781, - Variant62782, - Variant62783, - Variant62784, - Variant62785, - Variant62786, - Variant62787, - Variant62788, - Variant62789, - Variant62790, - Variant62791, - Variant62792, - Variant62793, - Variant62794, - Variant62795, - Variant62796, - Variant62797, - Variant62798, - Variant62799, - Variant62800, - Variant62801, - Variant62802, - Variant62803, - Variant62804, - Variant62805, - Variant62806, - Variant62807, - Variant62808, - Variant62809, - Variant62810, - Variant62811, - Variant62812, - Variant62813, - Variant62814, - Variant62815, - Variant62816, - Variant62817, - Variant62818, - Variant62819, - Variant62820, - Variant62821, - Variant62822, - Variant62823, - Variant62824, - Variant62825, - Variant62826, - Variant62827, - Variant62828, - Variant62829, - Variant62830, - Variant62831, - Variant62832, - Variant62833, - Variant62834, - Variant62835, - Variant62836, - Variant62837, - Variant62838, - Variant62839, - Variant62840, - Variant62841, - Variant62842, - Variant62843, - Variant62844, - Variant62845, - Variant62846, - Variant62847, - Variant62848, - Variant62849, - Variant62850, - Variant62851, - Variant62852, - Variant62853, - Variant62854, - Variant62855, - Variant62856, - Variant62857, - Variant62858, - Variant62859, - Variant62860, - Variant62861, - Variant62862, - Variant62863, - Variant62864, - Variant62865, - Variant62866, - Variant62867, - Variant62868, - Variant62869, - Variant62870, - Variant62871, - Variant62872, - Variant62873, - Variant62874, - Variant62875, - Variant62876, - Variant62877, - Variant62878, - Variant62879, - Variant62880, - Variant62881, - Variant62882, - Variant62883, - Variant62884, - Variant62885, - Variant62886, - Variant62887, - Variant62888, - Variant62889, - Variant62890, - Variant62891, - Variant62892, - Variant62893, - Variant62894, - Variant62895, - Variant62896, - Variant62897, - Variant62898, - Variant62899, - Variant62900, - Variant62901, - Variant62902, - Variant62903, - Variant62904, - Variant62905, - Variant62906, - Variant62907, - Variant62908, - Variant62909, - Variant62910, - Variant62911, - Variant62912, - Variant62913, - Variant62914, - Variant62915, - Variant62916, - Variant62917, - Variant62918, - Variant62919, - Variant62920, - Variant62921, - Variant62922, - Variant62923, - Variant62924, - Variant62925, - Variant62926, - Variant62927, - Variant62928, - Variant62929, - Variant62930, - Variant62931, - Variant62932, - Variant62933, - Variant62934, - Variant62935, - Variant62936, - Variant62937, - Variant62938, - Variant62939, - Variant62940, - Variant62941, - Variant62942, - Variant62943, - Variant62944, - Variant62945, - Variant62946, - Variant62947, - Variant62948, - Variant62949, - Variant62950, - Variant62951, - Variant62952, - Variant62953, - Variant62954, - Variant62955, - Variant62956, - Variant62957, - Variant62958, - Variant62959, - Variant62960, - Variant62961, - Variant62962, - Variant62963, - Variant62964, - Variant62965, - Variant62966, - Variant62967, - Variant62968, - Variant62969, - Variant62970, - Variant62971, - Variant62972, - Variant62973, - Variant62974, - Variant62975, - Variant62976, - Variant62977, - Variant62978, - Variant62979, - Variant62980, - Variant62981, - Variant62982, - Variant62983, - Variant62984, - Variant62985, - Variant62986, - Variant62987, - Variant62988, - Variant62989, - Variant62990, - Variant62991, - Variant62992, - Variant62993, - Variant62994, - Variant62995, - Variant62996, - Variant62997, - Variant62998, - Variant62999, - Variant63000, - Variant63001, - Variant63002, - Variant63003, - Variant63004, - Variant63005, - Variant63006, - Variant63007, - Variant63008, - Variant63009, - Variant63010, - Variant63011, - Variant63012, - Variant63013, - Variant63014, - Variant63015, - Variant63016, - Variant63017, - Variant63018, - Variant63019, - Variant63020, - Variant63021, - Variant63022, - Variant63023, - Variant63024, - Variant63025, - Variant63026, - Variant63027, - Variant63028, - Variant63029, - Variant63030, - Variant63031, - Variant63032, - Variant63033, - Variant63034, - Variant63035, - Variant63036, - Variant63037, - Variant63038, - Variant63039, - Variant63040, - Variant63041, - Variant63042, - Variant63043, - Variant63044, - Variant63045, - Variant63046, - Variant63047, - Variant63048, - Variant63049, - Variant63050, - Variant63051, - Variant63052, - Variant63053, - Variant63054, - Variant63055, - Variant63056, - Variant63057, - Variant63058, - Variant63059, - Variant63060, - Variant63061, - Variant63062, - Variant63063, - Variant63064, - Variant63065, - Variant63066, - Variant63067, - Variant63068, - Variant63069, - Variant63070, - Variant63071, - Variant63072, - Variant63073, - Variant63074, - Variant63075, - Variant63076, - Variant63077, - Variant63078, - Variant63079, - Variant63080, - Variant63081, - Variant63082, - Variant63083, - Variant63084, - Variant63085, - Variant63086, - Variant63087, - Variant63088, - Variant63089, - Variant63090, - Variant63091, - Variant63092, - Variant63093, - Variant63094, - Variant63095, - Variant63096, - Variant63097, - Variant63098, - Variant63099, - Variant63100, - Variant63101, - Variant63102, - Variant63103, - Variant63104, - Variant63105, - Variant63106, - Variant63107, - Variant63108, - Variant63109, - Variant63110, - Variant63111, - Variant63112, - Variant63113, - Variant63114, - Variant63115, - Variant63116, - Variant63117, - Variant63118, - Variant63119, - Variant63120, - Variant63121, - Variant63122, - Variant63123, - Variant63124, - Variant63125, - Variant63126, - Variant63127, - Variant63128, - Variant63129, - Variant63130, - Variant63131, - Variant63132, - Variant63133, - Variant63134, - Variant63135, - Variant63136, - Variant63137, - Variant63138, - Variant63139, - Variant63140, - Variant63141, - Variant63142, - Variant63143, - Variant63144, - Variant63145, - Variant63146, - Variant63147, - Variant63148, - Variant63149, - Variant63150, - Variant63151, - Variant63152, - Variant63153, - Variant63154, - Variant63155, - Variant63156, - Variant63157, - Variant63158, - Variant63159, - Variant63160, - Variant63161, - Variant63162, - Variant63163, - Variant63164, - Variant63165, - Variant63166, - Variant63167, - Variant63168, - Variant63169, - Variant63170, - Variant63171, - Variant63172, - Variant63173, - Variant63174, - Variant63175, - Variant63176, - Variant63177, - Variant63178, - Variant63179, - Variant63180, - Variant63181, - Variant63182, - Variant63183, - Variant63184, - Variant63185, - Variant63186, - Variant63187, - Variant63188, - Variant63189, - Variant63190, - Variant63191, - Variant63192, - Variant63193, - Variant63194, - Variant63195, - Variant63196, - Variant63197, - Variant63198, - Variant63199, - Variant63200, - Variant63201, - Variant63202, - Variant63203, - Variant63204, - Variant63205, - Variant63206, - Variant63207, - Variant63208, - Variant63209, - Variant63210, - Variant63211, - Variant63212, - Variant63213, - Variant63214, - Variant63215, - Variant63216, - Variant63217, - Variant63218, - Variant63219, - Variant63220, - Variant63221, - Variant63222, - Variant63223, - Variant63224, - Variant63225, - Variant63226, - Variant63227, - Variant63228, - Variant63229, - Variant63230, - Variant63231, - Variant63232, - Variant63233, - Variant63234, - Variant63235, - Variant63236, - Variant63237, - Variant63238, - Variant63239, - Variant63240, - Variant63241, - Variant63242, - Variant63243, - Variant63244, - Variant63245, - Variant63246, - Variant63247, - Variant63248, - Variant63249, - Variant63250, - Variant63251, - Variant63252, - Variant63253, - Variant63254, - Variant63255, - Variant63256, - Variant63257, - Variant63258, - Variant63259, - Variant63260, - Variant63261, - Variant63262, - Variant63263, - Variant63264, - Variant63265, - Variant63266, - Variant63267, - Variant63268, - Variant63269, - Variant63270, - Variant63271, - Variant63272, - Variant63273, - Variant63274, - Variant63275, - Variant63276, - Variant63277, - Variant63278, - Variant63279, - Variant63280, - Variant63281, - Variant63282, - Variant63283, - Variant63284, - Variant63285, - Variant63286, - Variant63287, - Variant63288, - Variant63289, - Variant63290, - Variant63291, - Variant63292, - Variant63293, - Variant63294, - Variant63295, - Variant63296, - Variant63297, - Variant63298, - Variant63299, - Variant63300, - Variant63301, - Variant63302, - Variant63303, - Variant63304, - Variant63305, - Variant63306, - Variant63307, - Variant63308, - Variant63309, - Variant63310, - Variant63311, - Variant63312, - Variant63313, - Variant63314, - Variant63315, - Variant63316, - Variant63317, - Variant63318, - Variant63319, - Variant63320, - Variant63321, - Variant63322, - Variant63323, - Variant63324, - Variant63325, - Variant63326, - Variant63327, - Variant63328, - Variant63329, - Variant63330, - Variant63331, - Variant63332, - Variant63333, - Variant63334, - Variant63335, - Variant63336, - Variant63337, - Variant63338, - Variant63339, - Variant63340, - Variant63341, - Variant63342, - Variant63343, - Variant63344, - Variant63345, - Variant63346, - Variant63347, - Variant63348, - Variant63349, - Variant63350, - Variant63351, - Variant63352, - Variant63353, - Variant63354, - Variant63355, - Variant63356, - Variant63357, - Variant63358, - Variant63359, - Variant63360, - Variant63361, - Variant63362, - Variant63363, - Variant63364, - Variant63365, - Variant63366, - Variant63367, - Variant63368, - Variant63369, - Variant63370, - Variant63371, - Variant63372, - Variant63373, - Variant63374, - Variant63375, - Variant63376, - Variant63377, - Variant63378, - Variant63379, - Variant63380, - Variant63381, - Variant63382, - Variant63383, - Variant63384, - Variant63385, - Variant63386, - Variant63387, - Variant63388, - Variant63389, - Variant63390, - Variant63391, - Variant63392, - Variant63393, - Variant63394, - Variant63395, - Variant63396, - Variant63397, - Variant63398, - Variant63399, - Variant63400, - Variant63401, - Variant63402, - Variant63403, - Variant63404, - Variant63405, - Variant63406, - Variant63407, - Variant63408, - Variant63409, - Variant63410, - Variant63411, - Variant63412, - Variant63413, - Variant63414, - Variant63415, - Variant63416, - Variant63417, - Variant63418, - Variant63419, - Variant63420, - Variant63421, - Variant63422, - Variant63423, - Variant63424, - Variant63425, - Variant63426, - Variant63427, - Variant63428, - Variant63429, - Variant63430, - Variant63431, - Variant63432, - Variant63433, - Variant63434, - Variant63435, - Variant63436, - Variant63437, - Variant63438, - Variant63439, - Variant63440, - Variant63441, - Variant63442, - Variant63443, - Variant63444, - Variant63445, - Variant63446, - Variant63447, - Variant63448, - Variant63449, - Variant63450, - Variant63451, - Variant63452, - Variant63453, - Variant63454, - Variant63455, - Variant63456, - Variant63457, - Variant63458, - Variant63459, - Variant63460, - Variant63461, - Variant63462, - Variant63463, - Variant63464, - Variant63465, - Variant63466, - Variant63467, - Variant63468, - Variant63469, - Variant63470, - Variant63471, - Variant63472, - Variant63473, - Variant63474, - Variant63475, - Variant63476, - Variant63477, - Variant63478, - Variant63479, - Variant63480, - Variant63481, - Variant63482, - Variant63483, - Variant63484, - Variant63485, - Variant63486, - Variant63487, - Variant63488, - Variant63489, - Variant63490, - Variant63491, - Variant63492, - Variant63493, - Variant63494, - Variant63495, - Variant63496, - Variant63497, - Variant63498, - Variant63499, - Variant63500, - Variant63501, - Variant63502, - Variant63503, - Variant63504, - Variant63505, - Variant63506, - Variant63507, - Variant63508, - Variant63509, - Variant63510, - Variant63511, - Variant63512, - Variant63513, - Variant63514, - Variant63515, - Variant63516, - Variant63517, - Variant63518, - Variant63519, - Variant63520, - Variant63521, - Variant63522, - Variant63523, - Variant63524, - Variant63525, - Variant63526, - Variant63527, - Variant63528, - Variant63529, - Variant63530, - Variant63531, - Variant63532, - Variant63533, - Variant63534, - Variant63535, - Variant63536, - Variant63537, - Variant63538, - Variant63539, - Variant63540, - Variant63541, - Variant63542, - Variant63543, - Variant63544, - Variant63545, - Variant63546, - Variant63547, - Variant63548, - Variant63549, - Variant63550, - Variant63551, - Variant63552, - Variant63553, - Variant63554, - Variant63555, - Variant63556, - Variant63557, - Variant63558, - Variant63559, - Variant63560, - Variant63561, - Variant63562, - Variant63563, - Variant63564, - Variant63565, - Variant63566, - Variant63567, - Variant63568, - Variant63569, - Variant63570, - Variant63571, - Variant63572, - Variant63573, - Variant63574, - Variant63575, - Variant63576, - Variant63577, - Variant63578, - Variant63579, - Variant63580, - Variant63581, - Variant63582, - Variant63583, - Variant63584, - Variant63585, - Variant63586, - Variant63587, - Variant63588, - Variant63589, - Variant63590, - Variant63591, - Variant63592, - Variant63593, - Variant63594, - Variant63595, - Variant63596, - Variant63597, - Variant63598, - Variant63599, - Variant63600, - Variant63601, - Variant63602, - Variant63603, - Variant63604, - Variant63605, - Variant63606, - Variant63607, - Variant63608, - Variant63609, - Variant63610, - Variant63611, - Variant63612, - Variant63613, - Variant63614, - Variant63615, - Variant63616, - Variant63617, - Variant63618, - Variant63619, - Variant63620, - Variant63621, - Variant63622, - Variant63623, - Variant63624, - Variant63625, - Variant63626, - Variant63627, - Variant63628, - Variant63629, - Variant63630, - Variant63631, - Variant63632, - Variant63633, - Variant63634, - Variant63635, - Variant63636, - Variant63637, - Variant63638, - Variant63639, - Variant63640, - Variant63641, - Variant63642, - Variant63643, - Variant63644, - Variant63645, - Variant63646, - Variant63647, - Variant63648, - Variant63649, - Variant63650, - Variant63651, - Variant63652, - Variant63653, - Variant63654, - Variant63655, - Variant63656, - Variant63657, - Variant63658, - Variant63659, - Variant63660, - Variant63661, - Variant63662, - Variant63663, - Variant63664, - Variant63665, - Variant63666, - Variant63667, - Variant63668, - Variant63669, - Variant63670, - Variant63671, - Variant63672, - Variant63673, - Variant63674, - Variant63675, - Variant63676, - Variant63677, - Variant63678, - Variant63679, - Variant63680, - Variant63681, - Variant63682, - Variant63683, - Variant63684, - Variant63685, - Variant63686, - Variant63687, - Variant63688, - Variant63689, - Variant63690, - Variant63691, - Variant63692, - Variant63693, - Variant63694, - Variant63695, - Variant63696, - Variant63697, - Variant63698, - Variant63699, - Variant63700, - Variant63701, - Variant63702, - Variant63703, - Variant63704, - Variant63705, - Variant63706, - Variant63707, - Variant63708, - Variant63709, - Variant63710, - Variant63711, - Variant63712, - Variant63713, - Variant63714, - Variant63715, - Variant63716, - Variant63717, - Variant63718, - Variant63719, - Variant63720, - Variant63721, - Variant63722, - Variant63723, - Variant63724, - Variant63725, - Variant63726, - Variant63727, - Variant63728, - Variant63729, - Variant63730, - Variant63731, - Variant63732, - Variant63733, - Variant63734, - Variant63735, - Variant63736, - Variant63737, - Variant63738, - Variant63739, - Variant63740, - Variant63741, - Variant63742, - Variant63743, - Variant63744, - Variant63745, - Variant63746, - Variant63747, - Variant63748, - Variant63749, - Variant63750, - Variant63751, - Variant63752, - Variant63753, - Variant63754, - Variant63755, - Variant63756, - Variant63757, - Variant63758, - Variant63759, - Variant63760, - Variant63761, - Variant63762, - Variant63763, - Variant63764, - Variant63765, - Variant63766, - Variant63767, - Variant63768, - Variant63769, - Variant63770, - Variant63771, - Variant63772, - Variant63773, - Variant63774, - Variant63775, - Variant63776, - Variant63777, - Variant63778, - Variant63779, - Variant63780, - Variant63781, - Variant63782, - Variant63783, - Variant63784, - Variant63785, - Variant63786, - Variant63787, - Variant63788, - Variant63789, - Variant63790, - Variant63791, - Variant63792, - Variant63793, - Variant63794, - Variant63795, - Variant63796, - Variant63797, - Variant63798, - Variant63799, - Variant63800, - Variant63801, - Variant63802, - Variant63803, - Variant63804, - Variant63805, - Variant63806, - Variant63807, - Variant63808, - Variant63809, - Variant63810, - Variant63811, - Variant63812, - Variant63813, - Variant63814, - Variant63815, - Variant63816, - Variant63817, - Variant63818, - Variant63819, - Variant63820, - Variant63821, - Variant63822, - Variant63823, - Variant63824, - Variant63825, - Variant63826, - Variant63827, - Variant63828, - Variant63829, - Variant63830, - Variant63831, - Variant63832, - Variant63833, - Variant63834, - Variant63835, - Variant63836, - Variant63837, - Variant63838, - Variant63839, - Variant63840, - Variant63841, - Variant63842, - Variant63843, - Variant63844, - Variant63845, - Variant63846, - Variant63847, - Variant63848, - Variant63849, - Variant63850, - Variant63851, - Variant63852, - Variant63853, - Variant63854, - Variant63855, - Variant63856, - Variant63857, - Variant63858, - Variant63859, - Variant63860, - Variant63861, - Variant63862, - Variant63863, - Variant63864, - Variant63865, - Variant63866, - Variant63867, - Variant63868, - Variant63869, - Variant63870, - Variant63871, - Variant63872, - Variant63873, - Variant63874, - Variant63875, - Variant63876, - Variant63877, - Variant63878, - Variant63879, - Variant63880, - Variant63881, - Variant63882, - Variant63883, - Variant63884, - Variant63885, - Variant63886, - Variant63887, - Variant63888, - Variant63889, - Variant63890, - Variant63891, - Variant63892, - Variant63893, - Variant63894, - Variant63895, - Variant63896, - Variant63897, - Variant63898, - Variant63899, - Variant63900, - Variant63901, - Variant63902, - Variant63903, - Variant63904, - Variant63905, - Variant63906, - Variant63907, - Variant63908, - Variant63909, - Variant63910, - Variant63911, - Variant63912, - Variant63913, - Variant63914, - Variant63915, - Variant63916, - Variant63917, - Variant63918, - Variant63919, - Variant63920, - Variant63921, - Variant63922, - Variant63923, - Variant63924, - Variant63925, - Variant63926, - Variant63927, - Variant63928, - Variant63929, - Variant63930, - Variant63931, - Variant63932, - Variant63933, - Variant63934, - Variant63935, - Variant63936, - Variant63937, - Variant63938, - Variant63939, - Variant63940, - Variant63941, - Variant63942, - Variant63943, - Variant63944, - Variant63945, - Variant63946, - Variant63947, - Variant63948, - Variant63949, - Variant63950, - Variant63951, - Variant63952, - Variant63953, - Variant63954, - Variant63955, - Variant63956, - Variant63957, - Variant63958, - Variant63959, - Variant63960, - Variant63961, - Variant63962, - Variant63963, - Variant63964, - Variant63965, - Variant63966, - Variant63967, - Variant63968, - Variant63969, - Variant63970, - Variant63971, - Variant63972, - Variant63973, - Variant63974, - Variant63975, - Variant63976, - Variant63977, - Variant63978, - Variant63979, - Variant63980, - Variant63981, - Variant63982, - Variant63983, - Variant63984, - Variant63985, - Variant63986, - Variant63987, - Variant63988, - Variant63989, - Variant63990, - Variant63991, - Variant63992, - Variant63993, - Variant63994, - Variant63995, - Variant63996, - Variant63997, - Variant63998, - Variant63999, - Variant64000, - Variant64001, - Variant64002, - Variant64003, - Variant64004, - Variant64005, - Variant64006, - Variant64007, - Variant64008, - Variant64009, - Variant64010, - Variant64011, - Variant64012, - Variant64013, - Variant64014, - Variant64015, - Variant64016, - Variant64017, - Variant64018, - Variant64019, - Variant64020, - Variant64021, - Variant64022, - Variant64023, - Variant64024, - Variant64025, - Variant64026, - Variant64027, - Variant64028, - Variant64029, - Variant64030, - Variant64031, - Variant64032, - Variant64033, - Variant64034, - Variant64035, - Variant64036, - Variant64037, - Variant64038, - Variant64039, - Variant64040, - Variant64041, - Variant64042, - Variant64043, - Variant64044, - Variant64045, - Variant64046, - Variant64047, - Variant64048, - Variant64049, - Variant64050, - Variant64051, - Variant64052, - Variant64053, - Variant64054, - Variant64055, - Variant64056, - Variant64057, - Variant64058, - Variant64059, - Variant64060, - Variant64061, - Variant64062, - Variant64063, - Variant64064, - Variant64065, - Variant64066, - Variant64067, - Variant64068, - Variant64069, - Variant64070, - Variant64071, - Variant64072, - Variant64073, - Variant64074, - Variant64075, - Variant64076, - Variant64077, - Variant64078, - Variant64079, - Variant64080, - Variant64081, - Variant64082, - Variant64083, - Variant64084, - Variant64085, - Variant64086, - Variant64087, - Variant64088, - Variant64089, - Variant64090, - Variant64091, - Variant64092, - Variant64093, - Variant64094, - Variant64095, - Variant64096, - Variant64097, - Variant64098, - Variant64099, - Variant64100, - Variant64101, - Variant64102, - Variant64103, - Variant64104, - Variant64105, - Variant64106, - Variant64107, - Variant64108, - Variant64109, - Variant64110, - Variant64111, - Variant64112, - Variant64113, - Variant64114, - Variant64115, - Variant64116, - Variant64117, - Variant64118, - Variant64119, - Variant64120, - Variant64121, - Variant64122, - Variant64123, - Variant64124, - Variant64125, - Variant64126, - Variant64127, - Variant64128, - Variant64129, - Variant64130, - Variant64131, - Variant64132, - Variant64133, - Variant64134, - Variant64135, - Variant64136, - Variant64137, - Variant64138, - Variant64139, - Variant64140, - Variant64141, - Variant64142, - Variant64143, - Variant64144, - Variant64145, - Variant64146, - Variant64147, - Variant64148, - Variant64149, - Variant64150, - Variant64151, - Variant64152, - Variant64153, - Variant64154, - Variant64155, - Variant64156, - Variant64157, - Variant64158, - Variant64159, - Variant64160, - Variant64161, - Variant64162, - Variant64163, - Variant64164, - Variant64165, - Variant64166, - Variant64167, - Variant64168, - Variant64169, - Variant64170, - Variant64171, - Variant64172, - Variant64173, - Variant64174, - Variant64175, - Variant64176, - Variant64177, - Variant64178, - Variant64179, - Variant64180, - Variant64181, - Variant64182, - Variant64183, - Variant64184, - Variant64185, - Variant64186, - Variant64187, - Variant64188, - Variant64189, - Variant64190, - Variant64191, - Variant64192, - Variant64193, - Variant64194, - Variant64195, - Variant64196, - Variant64197, - Variant64198, - Variant64199, - Variant64200, - Variant64201, - Variant64202, - Variant64203, - Variant64204, - Variant64205, - Variant64206, - Variant64207, - Variant64208, - Variant64209, - Variant64210, - Variant64211, - Variant64212, - Variant64213, - Variant64214, - Variant64215, - Variant64216, - Variant64217, - Variant64218, - Variant64219, - Variant64220, - Variant64221, - Variant64222, - Variant64223, - Variant64224, - Variant64225, - Variant64226, - Variant64227, - Variant64228, - Variant64229, - Variant64230, - Variant64231, - Variant64232, - Variant64233, - Variant64234, - Variant64235, - Variant64236, - Variant64237, - Variant64238, - Variant64239, - Variant64240, - Variant64241, - Variant64242, - Variant64243, - Variant64244, - Variant64245, - Variant64246, - Variant64247, - Variant64248, - Variant64249, - Variant64250, - Variant64251, - Variant64252, - Variant64253, - Variant64254, - Variant64255, - Variant64256, - Variant64257, - Variant64258, - Variant64259, - Variant64260, - Variant64261, - Variant64262, - Variant64263, - Variant64264, - Variant64265, - Variant64266, - Variant64267, - Variant64268, - Variant64269, - Variant64270, - Variant64271, - Variant64272, - Variant64273, - Variant64274, - Variant64275, - Variant64276, - Variant64277, - Variant64278, - Variant64279, - Variant64280, - Variant64281, - Variant64282, - Variant64283, - Variant64284, - Variant64285, - Variant64286, - Variant64287, - Variant64288, - Variant64289, - Variant64290, - Variant64291, - Variant64292, - Variant64293, - Variant64294, - Variant64295, - Variant64296, - Variant64297, - Variant64298, - Variant64299, - Variant64300, - Variant64301, - Variant64302, - Variant64303, - Variant64304, - Variant64305, - Variant64306, - Variant64307, - Variant64308, - Variant64309, - Variant64310, - Variant64311, - Variant64312, - Variant64313, - Variant64314, - Variant64315, - Variant64316, - Variant64317, - Variant64318, - Variant64319, - Variant64320, - Variant64321, - Variant64322, - Variant64323, - Variant64324, - Variant64325, - Variant64326, - Variant64327, - Variant64328, - Variant64329, - Variant64330, - Variant64331, - Variant64332, - Variant64333, - Variant64334, - Variant64335, - Variant64336, - Variant64337, - Variant64338, - Variant64339, - Variant64340, - Variant64341, - Variant64342, - Variant64343, - Variant64344, - Variant64345, - Variant64346, - Variant64347, - Variant64348, - Variant64349, - Variant64350, - Variant64351, - Variant64352, - Variant64353, - Variant64354, - Variant64355, - Variant64356, - Variant64357, - Variant64358, - Variant64359, - Variant64360, - Variant64361, - Variant64362, - Variant64363, - Variant64364, - Variant64365, - Variant64366, - Variant64367, - Variant64368, - Variant64369, - Variant64370, - Variant64371, - Variant64372, - Variant64373, - Variant64374, - Variant64375, - Variant64376, - Variant64377, - Variant64378, - Variant64379, - Variant64380, - Variant64381, - Variant64382, - Variant64383, - Variant64384, - Variant64385, - Variant64386, - Variant64387, - Variant64388, - Variant64389, - Variant64390, - Variant64391, - Variant64392, - Variant64393, - Variant64394, - Variant64395, - Variant64396, - Variant64397, - Variant64398, - Variant64399, - Variant64400, - Variant64401, - Variant64402, - Variant64403, - Variant64404, - Variant64405, - Variant64406, - Variant64407, - Variant64408, - Variant64409, - Variant64410, - Variant64411, - Variant64412, - Variant64413, - Variant64414, - Variant64415, - Variant64416, - Variant64417, - Variant64418, - Variant64419, - Variant64420, - Variant64421, - Variant64422, - Variant64423, - Variant64424, - Variant64425, - Variant64426, - Variant64427, - Variant64428, - Variant64429, - Variant64430, - Variant64431, - Variant64432, - Variant64433, - Variant64434, - Variant64435, - Variant64436, - Variant64437, - Variant64438, - Variant64439, - Variant64440, - Variant64441, - Variant64442, - Variant64443, - Variant64444, - Variant64445, - Variant64446, - Variant64447, - Variant64448, - Variant64449, - Variant64450, - Variant64451, - Variant64452, - Variant64453, - Variant64454, - Variant64455, - Variant64456, - Variant64457, - Variant64458, - Variant64459, - Variant64460, - Variant64461, - Variant64462, - Variant64463, - Variant64464, - Variant64465, - Variant64466, - Variant64467, - Variant64468, - Variant64469, - Variant64470, - Variant64471, - Variant64472, - Variant64473, - Variant64474, - Variant64475, - Variant64476, - Variant64477, - Variant64478, - Variant64479, - Variant64480, - Variant64481, - Variant64482, - Variant64483, - Variant64484, - Variant64485, - Variant64486, - Variant64487, - Variant64488, - Variant64489, - Variant64490, - Variant64491, - Variant64492, - Variant64493, - Variant64494, - Variant64495, - Variant64496, - Variant64497, - Variant64498, - Variant64499, - Variant64500, - Variant64501, - Variant64502, - Variant64503, - Variant64504, - Variant64505, - Variant64506, - Variant64507, - Variant64508, - Variant64509, - Variant64510, - Variant64511, - Variant64512, - Variant64513, - Variant64514, - Variant64515, - Variant64516, - Variant64517, - Variant64518, - Variant64519, - Variant64520, - Variant64521, - Variant64522, - Variant64523, - Variant64524, - Variant64525, - Variant64526, - Variant64527, - Variant64528, - Variant64529, - Variant64530, - Variant64531, - Variant64532, - Variant64533, - Variant64534, - Variant64535, - Variant64536, - Variant64537, - Variant64538, - Variant64539, - Variant64540, - Variant64541, - Variant64542, - Variant64543, - Variant64544, - Variant64545, - Variant64546, - Variant64547, - Variant64548, - Variant64549, - Variant64550, - Variant64551, - Variant64552, - Variant64553, - Variant64554, - Variant64555, - Variant64556, - Variant64557, - Variant64558, - Variant64559, - Variant64560, - Variant64561, - Variant64562, - Variant64563, - Variant64564, - Variant64565, - Variant64566, - Variant64567, - Variant64568, - Variant64569, - Variant64570, - Variant64571, - Variant64572, - Variant64573, - Variant64574, - Variant64575, - Variant64576, - Variant64577, - Variant64578, - Variant64579, - Variant64580, - Variant64581, - Variant64582, - Variant64583, - Variant64584, - Variant64585, - Variant64586, - Variant64587, - Variant64588, - Variant64589, - Variant64590, - Variant64591, - Variant64592, - Variant64593, - Variant64594, - Variant64595, - Variant64596, - Variant64597, - Variant64598, - Variant64599, - Variant64600, - Variant64601, - Variant64602, - Variant64603, - Variant64604, - Variant64605, - Variant64606, - Variant64607, - Variant64608, - Variant64609, - Variant64610, - Variant64611, - Variant64612, - Variant64613, - Variant64614, - Variant64615, - Variant64616, - Variant64617, - Variant64618, - Variant64619, - Variant64620, - Variant64621, - Variant64622, - Variant64623, - Variant64624, - Variant64625, - Variant64626, - Variant64627, - Variant64628, - Variant64629, - Variant64630, - Variant64631, - Variant64632, - Variant64633, - Variant64634, - Variant64635, - Variant64636, - Variant64637, - Variant64638, - Variant64639, - Variant64640, - Variant64641, - Variant64642, - Variant64643, - Variant64644, - Variant64645, - Variant64646, - Variant64647, - Variant64648, - Variant64649, - Variant64650, - Variant64651, - Variant64652, - Variant64653, - Variant64654, - Variant64655, - Variant64656, - Variant64657, - Variant64658, - Variant64659, - Variant64660, - Variant64661, - Variant64662, - Variant64663, - Variant64664, - Variant64665, - Variant64666, - Variant64667, - Variant64668, - Variant64669, - Variant64670, - Variant64671, - Variant64672, - Variant64673, - Variant64674, - Variant64675, - Variant64676, - Variant64677, - Variant64678, - Variant64679, - Variant64680, - Variant64681, - Variant64682, - Variant64683, - Variant64684, - Variant64685, - Variant64686, - Variant64687, - Variant64688, - Variant64689, - Variant64690, - Variant64691, - Variant64692, - Variant64693, - Variant64694, - Variant64695, - Variant64696, - Variant64697, - Variant64698, - Variant64699, - Variant64700, - Variant64701, - Variant64702, - Variant64703, - Variant64704, - Variant64705, - Variant64706, - Variant64707, - Variant64708, - Variant64709, - Variant64710, - Variant64711, - Variant64712, - Variant64713, - Variant64714, - Variant64715, - Variant64716, - Variant64717, - Variant64718, - Variant64719, - Variant64720, - Variant64721, - Variant64722, - Variant64723, - Variant64724, - Variant64725, - Variant64726, - Variant64727, - Variant64728, - Variant64729, - Variant64730, - Variant64731, - Variant64732, - Variant64733, - Variant64734, - Variant64735, - Variant64736, - Variant64737, - Variant64738, - Variant64739, - Variant64740, - Variant64741, - Variant64742, - Variant64743, - Variant64744, - Variant64745, - Variant64746, - Variant64747, - Variant64748, - Variant64749, - Variant64750, - Variant64751, - Variant64752, - Variant64753, - Variant64754, - Variant64755, - Variant64756, - Variant64757, - Variant64758, - Variant64759, - Variant64760, - Variant64761, - Variant64762, - Variant64763, - Variant64764, - Variant64765, - Variant64766, - Variant64767, - Variant64768, - Variant64769, - Variant64770, - Variant64771, - Variant64772, - Variant64773, - Variant64774, - Variant64775, - Variant64776, - Variant64777, - Variant64778, - Variant64779, - Variant64780, - Variant64781, - Variant64782, - Variant64783, - Variant64784, - Variant64785, - Variant64786, - Variant64787, - Variant64788, - Variant64789, - Variant64790, - Variant64791, - Variant64792, - Variant64793, - Variant64794, - Variant64795, - Variant64796, - Variant64797, - Variant64798, - Variant64799, - Variant64800, - Variant64801, - Variant64802, - Variant64803, - Variant64804, - Variant64805, - Variant64806, - Variant64807, - Variant64808, - Variant64809, - Variant64810, - Variant64811, - Variant64812, - Variant64813, - Variant64814, - Variant64815, - Variant64816, - Variant64817, - Variant64818, - Variant64819, - Variant64820, - Variant64821, - Variant64822, - Variant64823, - Variant64824, - Variant64825, - Variant64826, - Variant64827, - Variant64828, - Variant64829, - Variant64830, - Variant64831, - Variant64832, - Variant64833, - Variant64834, - Variant64835, - Variant64836, - Variant64837, - Variant64838, - Variant64839, - Variant64840, - Variant64841, - Variant64842, - Variant64843, - Variant64844, - Variant64845, - Variant64846, - Variant64847, - Variant64848, - Variant64849, - Variant64850, - Variant64851, - Variant64852, - Variant64853, - Variant64854, - Variant64855, - Variant64856, - Variant64857, - Variant64858, - Variant64859, - Variant64860, - Variant64861, - Variant64862, - Variant64863, - Variant64864, - Variant64865, - Variant64866, - Variant64867, - Variant64868, - Variant64869, - Variant64870, - Variant64871, - Variant64872, - Variant64873, - Variant64874, - Variant64875, - Variant64876, - Variant64877, - Variant64878, - Variant64879, - Variant64880, - Variant64881, - Variant64882, - Variant64883, - Variant64884, - Variant64885, - Variant64886, - Variant64887, - Variant64888, - Variant64889, - Variant64890, - Variant64891, - Variant64892, - Variant64893, - Variant64894, - Variant64895, - Variant64896, - Variant64897, - Variant64898, - Variant64899, - Variant64900, - Variant64901, - Variant64902, - Variant64903, - Variant64904, - Variant64905, - Variant64906, - Variant64907, - Variant64908, - Variant64909, - Variant64910, - Variant64911, - Variant64912, - Variant64913, - Variant64914, - Variant64915, - Variant64916, - Variant64917, - Variant64918, - Variant64919, - Variant64920, - Variant64921, - Variant64922, - Variant64923, - Variant64924, - Variant64925, - Variant64926, - Variant64927, - Variant64928, - Variant64929, - Variant64930, - Variant64931, - Variant64932, - Variant64933, - Variant64934, - Variant64935, - Variant64936, - Variant64937, - Variant64938, - Variant64939, - Variant64940, - Variant64941, - Variant64942, - Variant64943, - Variant64944, - Variant64945, - Variant64946, - Variant64947, - Variant64948, - Variant64949, - Variant64950, - Variant64951, - Variant64952, - Variant64953, - Variant64954, - Variant64955, - Variant64956, - Variant64957, - Variant64958, - Variant64959, - Variant64960, - Variant64961, - Variant64962, - Variant64963, - Variant64964, - Variant64965, - Variant64966, - Variant64967, - Variant64968, - Variant64969, - Variant64970, - Variant64971, - Variant64972, - Variant64973, - Variant64974, - Variant64975, - Variant64976, - Variant64977, - Variant64978, - Variant64979, - Variant64980, - Variant64981, - Variant64982, - Variant64983, - Variant64984, - Variant64985, - Variant64986, - Variant64987, - Variant64988, - Variant64989, - Variant64990, - Variant64991, - Variant64992, - Variant64993, - Variant64994, - Variant64995, - Variant64996, - Variant64997, - Variant64998, - Variant64999, - Variant65000, - Variant65001, - Variant65002, - Variant65003, - Variant65004, - Variant65005, - Variant65006, - Variant65007, - Variant65008, - Variant65009, - Variant65010, - Variant65011, - Variant65012, - Variant65013, - Variant65014, - Variant65015, - Variant65016, - Variant65017, - Variant65018, - Variant65019, - Variant65020, - Variant65021, - Variant65022, - Variant65023, - Variant65024, - Variant65025, - Variant65026, - Variant65027, - Variant65028, - Variant65029, - Variant65030, - Variant65031, - Variant65032, - Variant65033, - Variant65034, - Variant65035, - Variant65036, - Variant65037, - Variant65038, - Variant65039, - Variant65040, - Variant65041, - Variant65042, - Variant65043, - Variant65044, - Variant65045, - Variant65046, - Variant65047, - Variant65048, - Variant65049, - Variant65050, - Variant65051, - Variant65052, - Variant65053, - Variant65054, - Variant65055, - Variant65056, - Variant65057, - Variant65058, - Variant65059, - Variant65060, - Variant65061, - Variant65062, - Variant65063, - Variant65064, - Variant65065, - Variant65066, - Variant65067, - Variant65068, - Variant65069, - Variant65070, - Variant65071, - Variant65072, - Variant65073, - Variant65074, - Variant65075, - Variant65076, - Variant65077, - Variant65078, - Variant65079, - Variant65080, - Variant65081, - Variant65082, - Variant65083, - Variant65084, - Variant65085, - Variant65086, - Variant65087, - Variant65088, - Variant65089, - Variant65090, - Variant65091, - Variant65092, - Variant65093, - Variant65094, - Variant65095, - Variant65096, - Variant65097, - Variant65098, - Variant65099, - Variant65100, - Variant65101, - Variant65102, - Variant65103, - Variant65104, - Variant65105, - Variant65106, - Variant65107, - Variant65108, - Variant65109, - Variant65110, - Variant65111, - Variant65112, - Variant65113, - Variant65114, - Variant65115, - Variant65116, - Variant65117, - Variant65118, - Variant65119, - Variant65120, - Variant65121, - Variant65122, - Variant65123, - Variant65124, - Variant65125, - Variant65126, - Variant65127, - Variant65128, - Variant65129, - Variant65130, - Variant65131, - Variant65132, - Variant65133, - Variant65134, - Variant65135, - Variant65136, - Variant65137, - Variant65138, - Variant65139, - Variant65140, - Variant65141, - Variant65142, - Variant65143, - Variant65144, - Variant65145, - Variant65146, - Variant65147, - Variant65148, - Variant65149, - Variant65150, - Variant65151, - Variant65152, - Variant65153, - Variant65154, - Variant65155, - Variant65156, - Variant65157, - Variant65158, - Variant65159, - Variant65160, - Variant65161, - Variant65162, - Variant65163, - Variant65164, - Variant65165, - Variant65166, - Variant65167, - Variant65168, - Variant65169, - Variant65170, - Variant65171, - Variant65172, - Variant65173, - Variant65174, - Variant65175, - Variant65176, - Variant65177, - Variant65178, - Variant65179, - Variant65180, - Variant65181, - Variant65182, - Variant65183, - Variant65184, - Variant65185, - Variant65186, - Variant65187, - Variant65188, - Variant65189, - Variant65190, - Variant65191, - Variant65192, - Variant65193, - Variant65194, - Variant65195, - Variant65196, - Variant65197, - Variant65198, - Variant65199, - Variant65200, - Variant65201, - Variant65202, - Variant65203, - Variant65204, - Variant65205, - Variant65206, - Variant65207, - Variant65208, - Variant65209, - Variant65210, - Variant65211, - Variant65212, - Variant65213, - Variant65214, - Variant65215, - Variant65216, - Variant65217, - Variant65218, - Variant65219, - Variant65220, - Variant65221, - Variant65222, - Variant65223, - Variant65224, - Variant65225, - Variant65226, - Variant65227, - Variant65228, - Variant65229, - Variant65230, - Variant65231, - Variant65232, - Variant65233, - Variant65234, - Variant65235, - Variant65236, - Variant65237, - Variant65238, - Variant65239, - Variant65240, - Variant65241, - Variant65242, - Variant65243, - Variant65244, - Variant65245, - Variant65246, - Variant65247, - Variant65248, - Variant65249, - Variant65250, - Variant65251, - Variant65252, - Variant65253, - Variant65254, - Variant65255, - Variant65256, - Variant65257, - Variant65258, - Variant65259, - Variant65260, - Variant65261, - Variant65262, - Variant65263, - Variant65264, - Variant65265, - Variant65266, - Variant65267, - Variant65268, - Variant65269, - Variant65270, - Variant65271, - Variant65272, - Variant65273, - Variant65274, - Variant65275, - Variant65276, - Variant65277, - Variant65278, - Variant65279, - Variant65280, - Variant65281, - Variant65282, - Variant65283, - Variant65284, - Variant65285, - Variant65286, - Variant65287, - Variant65288, - Variant65289, - Variant65290, - Variant65291, - Variant65292, - Variant65293, - Variant65294, - Variant65295, - Variant65296, - Variant65297, - Variant65298, - Variant65299, - Variant65300, - Variant65301, - Variant65302, - Variant65303, - Variant65304, - Variant65305, - Variant65306, - Variant65307, - Variant65308, - Variant65309, - Variant65310, - Variant65311, - Variant65312, - Variant65313, - Variant65314, - Variant65315, - Variant65316, - Variant65317, - Variant65318, - Variant65319, - Variant65320, - Variant65321, - Variant65322, - Variant65323, - Variant65324, - Variant65325, - Variant65326, - Variant65327, - Variant65328, - Variant65329, - Variant65330, - Variant65331, - Variant65332, - Variant65333, - Variant65334, - Variant65335, - Variant65336, - Variant65337, - Variant65338, - Variant65339, - Variant65340, - Variant65341, - Variant65342, - Variant65343, - Variant65344, - Variant65345, - Variant65346, - Variant65347, - Variant65348, - Variant65349, - Variant65350, - Variant65351, - Variant65352, - Variant65353, - Variant65354, - Variant65355, - Variant65356, - Variant65357, - Variant65358, - Variant65359, - Variant65360, - Variant65361, - Variant65362, - Variant65363, - Variant65364, - Variant65365, - Variant65366, - Variant65367, - Variant65368, - Variant65369, - Variant65370, - Variant65371, - Variant65372, - Variant65373, - Variant65374, - Variant65375, - Variant65376, - Variant65377, - Variant65378, - Variant65379, - Variant65380, - Variant65381, - Variant65382, - Variant65383, - Variant65384, - Variant65385, - Variant65386, - Variant65387, - Variant65388, - Variant65389, - Variant65390, - Variant65391, - Variant65392, - Variant65393, - Variant65394, - Variant65395, - Variant65396, - Variant65397, - Variant65398, - Variant65399, - Variant65400, - Variant65401, - Variant65402, - Variant65403, - Variant65404, - Variant65405, - Variant65406, - Variant65407, - Variant65408, - Variant65409, - Variant65410, - Variant65411, - Variant65412, - Variant65413, - Variant65414, - Variant65415, - Variant65416, - Variant65417, - Variant65418, - Variant65419, - Variant65420, - Variant65421, - Variant65422, - Variant65423, - Variant65424, - Variant65425, - Variant65426, - Variant65427, - Variant65428, - Variant65429, - Variant65430, - Variant65431, - Variant65432, - Variant65433, - Variant65434, - Variant65435, - Variant65436, - Variant65437, - Variant65438, - Variant65439, - Variant65440, - Variant65441, - Variant65442, - Variant65443, - Variant65444, - Variant65445, - Variant65446, - Variant65447, - Variant65448, - Variant65449, - Variant65450, - Variant65451, - Variant65452, - Variant65453, - Variant65454, - Variant65455, - Variant65456, - Variant65457, - Variant65458, - Variant65459, - Variant65460, - Variant65461, - Variant65462, - Variant65463, - Variant65464, - Variant65465, - Variant65466, - Variant65467, - Variant65468, - Variant65469, - Variant65470, - Variant65471, - Variant65472, - Variant65473, - Variant65474, - Variant65475, - Variant65476, - Variant65477, - Variant65478, - Variant65479, - Variant65480, - Variant65481, - Variant65482, - Variant65483, - Variant65484, - Variant65485, - Variant65486, - Variant65487, - Variant65488, - Variant65489, - Variant65490, - Variant65491, - Variant65492, - Variant65493, - Variant65494, - Variant65495, - Variant65496, - Variant65497, - Variant65498, - Variant65499, - Variant65500, - Variant65501, - Variant65502, - Variant65503, - Variant65504, - Variant65505, - Variant65506, - Variant65507, - Variant65508, - Variant65509, - Variant65510, - Variant65511, - Variant65512, - Variant65513, - Variant65514, - Variant65515, - Variant65516, - Variant65517, - Variant65518, - Variant65519, - Variant65520, - Variant65521, - Variant65522, - Variant65523, - Variant65524, - Variant65525, - Variant65526, - Variant65527, - Variant65528, - Variant65529, - Variant65530, - Variant65531, - Variant65532, - Variant65533, - Variant65534, - Variant65535, -} - -assert_impl_all!(FooU16: FromBytes); - -#[derive(FromZeroes, FromBytes)] -#[repr(i16)] -enum FooI16 { - Variant0, - Variant1, - Variant2, - Variant3, - Variant4, - Variant5, - Variant6, - Variant7, - Variant8, - Variant9, - Variant10, - Variant11, - Variant12, - Variant13, - Variant14, - Variant15, - Variant16, - Variant17, - Variant18, - Variant19, - Variant20, - Variant21, - Variant22, - Variant23, - Variant24, - Variant25, - Variant26, - Variant27, - Variant28, - Variant29, - Variant30, - Variant31, - Variant32, - Variant33, - Variant34, - Variant35, - Variant36, - Variant37, - Variant38, - Variant39, - Variant40, - Variant41, - Variant42, - Variant43, - Variant44, - Variant45, - Variant46, - Variant47, - Variant48, - Variant49, - Variant50, - Variant51, - Variant52, - Variant53, - Variant54, - Variant55, - Variant56, - Variant57, - Variant58, - Variant59, - Variant60, - Variant61, - Variant62, - Variant63, - Variant64, - Variant65, - Variant66, - Variant67, - Variant68, - Variant69, - Variant70, - Variant71, - Variant72, - Variant73, - Variant74, - Variant75, - Variant76, - Variant77, - Variant78, - Variant79, - Variant80, - Variant81, - Variant82, - Variant83, - Variant84, - Variant85, - Variant86, - Variant87, - Variant88, - Variant89, - Variant90, - Variant91, - Variant92, - Variant93, - Variant94, - Variant95, - Variant96, - Variant97, - Variant98, - Variant99, - Variant100, - Variant101, - Variant102, - Variant103, - Variant104, - Variant105, - Variant106, - Variant107, - Variant108, - Variant109, - Variant110, - Variant111, - Variant112, - Variant113, - Variant114, - Variant115, - Variant116, - Variant117, - Variant118, - Variant119, - Variant120, - Variant121, - Variant122, - Variant123, - Variant124, - Variant125, - Variant126, - Variant127, - Variant128, - Variant129, - Variant130, - Variant131, - Variant132, - Variant133, - Variant134, - Variant135, - Variant136, - Variant137, - Variant138, - Variant139, - Variant140, - Variant141, - Variant142, - Variant143, - Variant144, - Variant145, - Variant146, - Variant147, - Variant148, - Variant149, - Variant150, - Variant151, - Variant152, - Variant153, - Variant154, - Variant155, - Variant156, - Variant157, - Variant158, - Variant159, - Variant160, - Variant161, - Variant162, - Variant163, - Variant164, - Variant165, - Variant166, - Variant167, - Variant168, - Variant169, - Variant170, - Variant171, - Variant172, - Variant173, - Variant174, - Variant175, - Variant176, - Variant177, - Variant178, - Variant179, - Variant180, - Variant181, - Variant182, - Variant183, - Variant184, - Variant185, - Variant186, - Variant187, - Variant188, - Variant189, - Variant190, - Variant191, - Variant192, - Variant193, - Variant194, - Variant195, - Variant196, - Variant197, - Variant198, - Variant199, - Variant200, - Variant201, - Variant202, - Variant203, - Variant204, - Variant205, - Variant206, - Variant207, - Variant208, - Variant209, - Variant210, - Variant211, - Variant212, - Variant213, - Variant214, - Variant215, - Variant216, - Variant217, - Variant218, - Variant219, - Variant220, - Variant221, - Variant222, - Variant223, - Variant224, - Variant225, - Variant226, - Variant227, - Variant228, - Variant229, - Variant230, - Variant231, - Variant232, - Variant233, - Variant234, - Variant235, - Variant236, - Variant237, - Variant238, - Variant239, - Variant240, - Variant241, - Variant242, - Variant243, - Variant244, - Variant245, - Variant246, - Variant247, - Variant248, - Variant249, - Variant250, - Variant251, - Variant252, - Variant253, - Variant254, - Variant255, - Variant256, - Variant257, - Variant258, - Variant259, - Variant260, - Variant261, - Variant262, - Variant263, - Variant264, - Variant265, - Variant266, - Variant267, - Variant268, - Variant269, - Variant270, - Variant271, - Variant272, - Variant273, - Variant274, - Variant275, - Variant276, - Variant277, - Variant278, - Variant279, - Variant280, - Variant281, - Variant282, - Variant283, - Variant284, - Variant285, - Variant286, - Variant287, - Variant288, - Variant289, - Variant290, - Variant291, - Variant292, - Variant293, - Variant294, - Variant295, - Variant296, - Variant297, - Variant298, - Variant299, - Variant300, - Variant301, - Variant302, - Variant303, - Variant304, - Variant305, - Variant306, - Variant307, - Variant308, - Variant309, - Variant310, - Variant311, - Variant312, - Variant313, - Variant314, - Variant315, - Variant316, - Variant317, - Variant318, - Variant319, - Variant320, - Variant321, - Variant322, - Variant323, - Variant324, - Variant325, - Variant326, - Variant327, - Variant328, - Variant329, - Variant330, - Variant331, - Variant332, - Variant333, - Variant334, - Variant335, - Variant336, - Variant337, - Variant338, - Variant339, - Variant340, - Variant341, - Variant342, - Variant343, - Variant344, - Variant345, - Variant346, - Variant347, - Variant348, - Variant349, - Variant350, - Variant351, - Variant352, - Variant353, - Variant354, - Variant355, - Variant356, - Variant357, - Variant358, - Variant359, - Variant360, - Variant361, - Variant362, - Variant363, - Variant364, - Variant365, - Variant366, - Variant367, - Variant368, - Variant369, - Variant370, - Variant371, - Variant372, - Variant373, - Variant374, - Variant375, - Variant376, - Variant377, - Variant378, - Variant379, - Variant380, - Variant381, - Variant382, - Variant383, - Variant384, - Variant385, - Variant386, - Variant387, - Variant388, - Variant389, - Variant390, - Variant391, - Variant392, - Variant393, - Variant394, - Variant395, - Variant396, - Variant397, - Variant398, - Variant399, - Variant400, - Variant401, - Variant402, - Variant403, - Variant404, - Variant405, - Variant406, - Variant407, - Variant408, - Variant409, - Variant410, - Variant411, - Variant412, - Variant413, - Variant414, - Variant415, - Variant416, - Variant417, - Variant418, - Variant419, - Variant420, - Variant421, - Variant422, - Variant423, - Variant424, - Variant425, - Variant426, - Variant427, - Variant428, - Variant429, - Variant430, - Variant431, - Variant432, - Variant433, - Variant434, - Variant435, - Variant436, - Variant437, - Variant438, - Variant439, - Variant440, - Variant441, - Variant442, - Variant443, - Variant444, - Variant445, - Variant446, - Variant447, - Variant448, - Variant449, - Variant450, - Variant451, - Variant452, - Variant453, - Variant454, - Variant455, - Variant456, - Variant457, - Variant458, - Variant459, - Variant460, - Variant461, - Variant462, - Variant463, - Variant464, - Variant465, - Variant466, - Variant467, - Variant468, - Variant469, - Variant470, - Variant471, - Variant472, - Variant473, - Variant474, - Variant475, - Variant476, - Variant477, - Variant478, - Variant479, - Variant480, - Variant481, - Variant482, - Variant483, - Variant484, - Variant485, - Variant486, - Variant487, - Variant488, - Variant489, - Variant490, - Variant491, - Variant492, - Variant493, - Variant494, - Variant495, - Variant496, - Variant497, - Variant498, - Variant499, - Variant500, - Variant501, - Variant502, - Variant503, - Variant504, - Variant505, - Variant506, - Variant507, - Variant508, - Variant509, - Variant510, - Variant511, - Variant512, - Variant513, - Variant514, - Variant515, - Variant516, - Variant517, - Variant518, - Variant519, - Variant520, - Variant521, - Variant522, - Variant523, - Variant524, - Variant525, - Variant526, - Variant527, - Variant528, - Variant529, - Variant530, - Variant531, - Variant532, - Variant533, - Variant534, - Variant535, - Variant536, - Variant537, - Variant538, - Variant539, - Variant540, - Variant541, - Variant542, - Variant543, - Variant544, - Variant545, - Variant546, - Variant547, - Variant548, - Variant549, - Variant550, - Variant551, - Variant552, - Variant553, - Variant554, - Variant555, - Variant556, - Variant557, - Variant558, - Variant559, - Variant560, - Variant561, - Variant562, - Variant563, - Variant564, - Variant565, - Variant566, - Variant567, - Variant568, - Variant569, - Variant570, - Variant571, - Variant572, - Variant573, - Variant574, - Variant575, - Variant576, - Variant577, - Variant578, - Variant579, - Variant580, - Variant581, - Variant582, - Variant583, - Variant584, - Variant585, - Variant586, - Variant587, - Variant588, - Variant589, - Variant590, - Variant591, - Variant592, - Variant593, - Variant594, - Variant595, - Variant596, - Variant597, - Variant598, - Variant599, - Variant600, - Variant601, - Variant602, - Variant603, - Variant604, - Variant605, - Variant606, - Variant607, - Variant608, - Variant609, - Variant610, - Variant611, - Variant612, - Variant613, - Variant614, - Variant615, - Variant616, - Variant617, - Variant618, - Variant619, - Variant620, - Variant621, - Variant622, - Variant623, - Variant624, - Variant625, - Variant626, - Variant627, - Variant628, - Variant629, - Variant630, - Variant631, - Variant632, - Variant633, - Variant634, - Variant635, - Variant636, - Variant637, - Variant638, - Variant639, - Variant640, - Variant641, - Variant642, - Variant643, - Variant644, - Variant645, - Variant646, - Variant647, - Variant648, - Variant649, - Variant650, - Variant651, - Variant652, - Variant653, - Variant654, - Variant655, - Variant656, - Variant657, - Variant658, - Variant659, - Variant660, - Variant661, - Variant662, - Variant663, - Variant664, - Variant665, - Variant666, - Variant667, - Variant668, - Variant669, - Variant670, - Variant671, - Variant672, - Variant673, - Variant674, - Variant675, - Variant676, - Variant677, - Variant678, - Variant679, - Variant680, - Variant681, - Variant682, - Variant683, - Variant684, - Variant685, - Variant686, - Variant687, - Variant688, - Variant689, - Variant690, - Variant691, - Variant692, - Variant693, - Variant694, - Variant695, - Variant696, - Variant697, - Variant698, - Variant699, - Variant700, - Variant701, - Variant702, - Variant703, - Variant704, - Variant705, - Variant706, - Variant707, - Variant708, - Variant709, - Variant710, - Variant711, - Variant712, - Variant713, - Variant714, - Variant715, - Variant716, - Variant717, - Variant718, - Variant719, - Variant720, - Variant721, - Variant722, - Variant723, - Variant724, - Variant725, - Variant726, - Variant727, - Variant728, - Variant729, - Variant730, - Variant731, - Variant732, - Variant733, - Variant734, - Variant735, - Variant736, - Variant737, - Variant738, - Variant739, - Variant740, - Variant741, - Variant742, - Variant743, - Variant744, - Variant745, - Variant746, - Variant747, - Variant748, - Variant749, - Variant750, - Variant751, - Variant752, - Variant753, - Variant754, - Variant755, - Variant756, - Variant757, - Variant758, - Variant759, - Variant760, - Variant761, - Variant762, - Variant763, - Variant764, - Variant765, - Variant766, - Variant767, - Variant768, - Variant769, - Variant770, - Variant771, - Variant772, - Variant773, - Variant774, - Variant775, - Variant776, - Variant777, - Variant778, - Variant779, - Variant780, - Variant781, - Variant782, - Variant783, - Variant784, - Variant785, - Variant786, - Variant787, - Variant788, - Variant789, - Variant790, - Variant791, - Variant792, - Variant793, - Variant794, - Variant795, - Variant796, - Variant797, - Variant798, - Variant799, - Variant800, - Variant801, - Variant802, - Variant803, - Variant804, - Variant805, - Variant806, - Variant807, - Variant808, - Variant809, - Variant810, - Variant811, - Variant812, - Variant813, - Variant814, - Variant815, - Variant816, - Variant817, - Variant818, - Variant819, - Variant820, - Variant821, - Variant822, - Variant823, - Variant824, - Variant825, - Variant826, - Variant827, - Variant828, - Variant829, - Variant830, - Variant831, - Variant832, - Variant833, - Variant834, - Variant835, - Variant836, - Variant837, - Variant838, - Variant839, - Variant840, - Variant841, - Variant842, - Variant843, - Variant844, - Variant845, - Variant846, - Variant847, - Variant848, - Variant849, - Variant850, - Variant851, - Variant852, - Variant853, - Variant854, - Variant855, - Variant856, - Variant857, - Variant858, - Variant859, - Variant860, - Variant861, - Variant862, - Variant863, - Variant864, - Variant865, - Variant866, - Variant867, - Variant868, - Variant869, - Variant870, - Variant871, - Variant872, - Variant873, - Variant874, - Variant875, - Variant876, - Variant877, - Variant878, - Variant879, - Variant880, - Variant881, - Variant882, - Variant883, - Variant884, - Variant885, - Variant886, - Variant887, - Variant888, - Variant889, - Variant890, - Variant891, - Variant892, - Variant893, - Variant894, - Variant895, - Variant896, - Variant897, - Variant898, - Variant899, - Variant900, - Variant901, - Variant902, - Variant903, - Variant904, - Variant905, - Variant906, - Variant907, - Variant908, - Variant909, - Variant910, - Variant911, - Variant912, - Variant913, - Variant914, - Variant915, - Variant916, - Variant917, - Variant918, - Variant919, - Variant920, - Variant921, - Variant922, - Variant923, - Variant924, - Variant925, - Variant926, - Variant927, - Variant928, - Variant929, - Variant930, - Variant931, - Variant932, - Variant933, - Variant934, - Variant935, - Variant936, - Variant937, - Variant938, - Variant939, - Variant940, - Variant941, - Variant942, - Variant943, - Variant944, - Variant945, - Variant946, - Variant947, - Variant948, - Variant949, - Variant950, - Variant951, - Variant952, - Variant953, - Variant954, - Variant955, - Variant956, - Variant957, - Variant958, - Variant959, - Variant960, - Variant961, - Variant962, - Variant963, - Variant964, - Variant965, - Variant966, - Variant967, - Variant968, - Variant969, - Variant970, - Variant971, - Variant972, - Variant973, - Variant974, - Variant975, - Variant976, - Variant977, - Variant978, - Variant979, - Variant980, - Variant981, - Variant982, - Variant983, - Variant984, - Variant985, - Variant986, - Variant987, - Variant988, - Variant989, - Variant990, - Variant991, - Variant992, - Variant993, - Variant994, - Variant995, - Variant996, - Variant997, - Variant998, - Variant999, - Variant1000, - Variant1001, - Variant1002, - Variant1003, - Variant1004, - Variant1005, - Variant1006, - Variant1007, - Variant1008, - Variant1009, - Variant1010, - Variant1011, - Variant1012, - Variant1013, - Variant1014, - Variant1015, - Variant1016, - Variant1017, - Variant1018, - Variant1019, - Variant1020, - Variant1021, - Variant1022, - Variant1023, - Variant1024, - Variant1025, - Variant1026, - Variant1027, - Variant1028, - Variant1029, - Variant1030, - Variant1031, - Variant1032, - Variant1033, - Variant1034, - Variant1035, - Variant1036, - Variant1037, - Variant1038, - Variant1039, - Variant1040, - Variant1041, - Variant1042, - Variant1043, - Variant1044, - Variant1045, - Variant1046, - Variant1047, - Variant1048, - Variant1049, - Variant1050, - Variant1051, - Variant1052, - Variant1053, - Variant1054, - Variant1055, - Variant1056, - Variant1057, - Variant1058, - Variant1059, - Variant1060, - Variant1061, - Variant1062, - Variant1063, - Variant1064, - Variant1065, - Variant1066, - Variant1067, - Variant1068, - Variant1069, - Variant1070, - Variant1071, - Variant1072, - Variant1073, - Variant1074, - Variant1075, - Variant1076, - Variant1077, - Variant1078, - Variant1079, - Variant1080, - Variant1081, - Variant1082, - Variant1083, - Variant1084, - Variant1085, - Variant1086, - Variant1087, - Variant1088, - Variant1089, - Variant1090, - Variant1091, - Variant1092, - Variant1093, - Variant1094, - Variant1095, - Variant1096, - Variant1097, - Variant1098, - Variant1099, - Variant1100, - Variant1101, - Variant1102, - Variant1103, - Variant1104, - Variant1105, - Variant1106, - Variant1107, - Variant1108, - Variant1109, - Variant1110, - Variant1111, - Variant1112, - Variant1113, - Variant1114, - Variant1115, - Variant1116, - Variant1117, - Variant1118, - Variant1119, - Variant1120, - Variant1121, - Variant1122, - Variant1123, - Variant1124, - Variant1125, - Variant1126, - Variant1127, - Variant1128, - Variant1129, - Variant1130, - Variant1131, - Variant1132, - Variant1133, - Variant1134, - Variant1135, - Variant1136, - Variant1137, - Variant1138, - Variant1139, - Variant1140, - Variant1141, - Variant1142, - Variant1143, - Variant1144, - Variant1145, - Variant1146, - Variant1147, - Variant1148, - Variant1149, - Variant1150, - Variant1151, - Variant1152, - Variant1153, - Variant1154, - Variant1155, - Variant1156, - Variant1157, - Variant1158, - Variant1159, - Variant1160, - Variant1161, - Variant1162, - Variant1163, - Variant1164, - Variant1165, - Variant1166, - Variant1167, - Variant1168, - Variant1169, - Variant1170, - Variant1171, - Variant1172, - Variant1173, - Variant1174, - Variant1175, - Variant1176, - Variant1177, - Variant1178, - Variant1179, - Variant1180, - Variant1181, - Variant1182, - Variant1183, - Variant1184, - Variant1185, - Variant1186, - Variant1187, - Variant1188, - Variant1189, - Variant1190, - Variant1191, - Variant1192, - Variant1193, - Variant1194, - Variant1195, - Variant1196, - Variant1197, - Variant1198, - Variant1199, - Variant1200, - Variant1201, - Variant1202, - Variant1203, - Variant1204, - Variant1205, - Variant1206, - Variant1207, - Variant1208, - Variant1209, - Variant1210, - Variant1211, - Variant1212, - Variant1213, - Variant1214, - Variant1215, - Variant1216, - Variant1217, - Variant1218, - Variant1219, - Variant1220, - Variant1221, - Variant1222, - Variant1223, - Variant1224, - Variant1225, - Variant1226, - Variant1227, - Variant1228, - Variant1229, - Variant1230, - Variant1231, - Variant1232, - Variant1233, - Variant1234, - Variant1235, - Variant1236, - Variant1237, - Variant1238, - Variant1239, - Variant1240, - Variant1241, - Variant1242, - Variant1243, - Variant1244, - Variant1245, - Variant1246, - Variant1247, - Variant1248, - Variant1249, - Variant1250, - Variant1251, - Variant1252, - Variant1253, - Variant1254, - Variant1255, - Variant1256, - Variant1257, - Variant1258, - Variant1259, - Variant1260, - Variant1261, - Variant1262, - Variant1263, - Variant1264, - Variant1265, - Variant1266, - Variant1267, - Variant1268, - Variant1269, - Variant1270, - Variant1271, - Variant1272, - Variant1273, - Variant1274, - Variant1275, - Variant1276, - Variant1277, - Variant1278, - Variant1279, - Variant1280, - Variant1281, - Variant1282, - Variant1283, - Variant1284, - Variant1285, - Variant1286, - Variant1287, - Variant1288, - Variant1289, - Variant1290, - Variant1291, - Variant1292, - Variant1293, - Variant1294, - Variant1295, - Variant1296, - Variant1297, - Variant1298, - Variant1299, - Variant1300, - Variant1301, - Variant1302, - Variant1303, - Variant1304, - Variant1305, - Variant1306, - Variant1307, - Variant1308, - Variant1309, - Variant1310, - Variant1311, - Variant1312, - Variant1313, - Variant1314, - Variant1315, - Variant1316, - Variant1317, - Variant1318, - Variant1319, - Variant1320, - Variant1321, - Variant1322, - Variant1323, - Variant1324, - Variant1325, - Variant1326, - Variant1327, - Variant1328, - Variant1329, - Variant1330, - Variant1331, - Variant1332, - Variant1333, - Variant1334, - Variant1335, - Variant1336, - Variant1337, - Variant1338, - Variant1339, - Variant1340, - Variant1341, - Variant1342, - Variant1343, - Variant1344, - Variant1345, - Variant1346, - Variant1347, - Variant1348, - Variant1349, - Variant1350, - Variant1351, - Variant1352, - Variant1353, - Variant1354, - Variant1355, - Variant1356, - Variant1357, - Variant1358, - Variant1359, - Variant1360, - Variant1361, - Variant1362, - Variant1363, - Variant1364, - Variant1365, - Variant1366, - Variant1367, - Variant1368, - Variant1369, - Variant1370, - Variant1371, - Variant1372, - Variant1373, - Variant1374, - Variant1375, - Variant1376, - Variant1377, - Variant1378, - Variant1379, - Variant1380, - Variant1381, - Variant1382, - Variant1383, - Variant1384, - Variant1385, - Variant1386, - Variant1387, - Variant1388, - Variant1389, - Variant1390, - Variant1391, - Variant1392, - Variant1393, - Variant1394, - Variant1395, - Variant1396, - Variant1397, - Variant1398, - Variant1399, - Variant1400, - Variant1401, - Variant1402, - Variant1403, - Variant1404, - Variant1405, - Variant1406, - Variant1407, - Variant1408, - Variant1409, - Variant1410, - Variant1411, - Variant1412, - Variant1413, - Variant1414, - Variant1415, - Variant1416, - Variant1417, - Variant1418, - Variant1419, - Variant1420, - Variant1421, - Variant1422, - Variant1423, - Variant1424, - Variant1425, - Variant1426, - Variant1427, - Variant1428, - Variant1429, - Variant1430, - Variant1431, - Variant1432, - Variant1433, - Variant1434, - Variant1435, - Variant1436, - Variant1437, - Variant1438, - Variant1439, - Variant1440, - Variant1441, - Variant1442, - Variant1443, - Variant1444, - Variant1445, - Variant1446, - Variant1447, - Variant1448, - Variant1449, - Variant1450, - Variant1451, - Variant1452, - Variant1453, - Variant1454, - Variant1455, - Variant1456, - Variant1457, - Variant1458, - Variant1459, - Variant1460, - Variant1461, - Variant1462, - Variant1463, - Variant1464, - Variant1465, - Variant1466, - Variant1467, - Variant1468, - Variant1469, - Variant1470, - Variant1471, - Variant1472, - Variant1473, - Variant1474, - Variant1475, - Variant1476, - Variant1477, - Variant1478, - Variant1479, - Variant1480, - Variant1481, - Variant1482, - Variant1483, - Variant1484, - Variant1485, - Variant1486, - Variant1487, - Variant1488, - Variant1489, - Variant1490, - Variant1491, - Variant1492, - Variant1493, - Variant1494, - Variant1495, - Variant1496, - Variant1497, - Variant1498, - Variant1499, - Variant1500, - Variant1501, - Variant1502, - Variant1503, - Variant1504, - Variant1505, - Variant1506, - Variant1507, - Variant1508, - Variant1509, - Variant1510, - Variant1511, - Variant1512, - Variant1513, - Variant1514, - Variant1515, - Variant1516, - Variant1517, - Variant1518, - Variant1519, - Variant1520, - Variant1521, - Variant1522, - Variant1523, - Variant1524, - Variant1525, - Variant1526, - Variant1527, - Variant1528, - Variant1529, - Variant1530, - Variant1531, - Variant1532, - Variant1533, - Variant1534, - Variant1535, - Variant1536, - Variant1537, - Variant1538, - Variant1539, - Variant1540, - Variant1541, - Variant1542, - Variant1543, - Variant1544, - Variant1545, - Variant1546, - Variant1547, - Variant1548, - Variant1549, - Variant1550, - Variant1551, - Variant1552, - Variant1553, - Variant1554, - Variant1555, - Variant1556, - Variant1557, - Variant1558, - Variant1559, - Variant1560, - Variant1561, - Variant1562, - Variant1563, - Variant1564, - Variant1565, - Variant1566, - Variant1567, - Variant1568, - Variant1569, - Variant1570, - Variant1571, - Variant1572, - Variant1573, - Variant1574, - Variant1575, - Variant1576, - Variant1577, - Variant1578, - Variant1579, - Variant1580, - Variant1581, - Variant1582, - Variant1583, - Variant1584, - Variant1585, - Variant1586, - Variant1587, - Variant1588, - Variant1589, - Variant1590, - Variant1591, - Variant1592, - Variant1593, - Variant1594, - Variant1595, - Variant1596, - Variant1597, - Variant1598, - Variant1599, - Variant1600, - Variant1601, - Variant1602, - Variant1603, - Variant1604, - Variant1605, - Variant1606, - Variant1607, - Variant1608, - Variant1609, - Variant1610, - Variant1611, - Variant1612, - Variant1613, - Variant1614, - Variant1615, - Variant1616, - Variant1617, - Variant1618, - Variant1619, - Variant1620, - Variant1621, - Variant1622, - Variant1623, - Variant1624, - Variant1625, - Variant1626, - Variant1627, - Variant1628, - Variant1629, - Variant1630, - Variant1631, - Variant1632, - Variant1633, - Variant1634, - Variant1635, - Variant1636, - Variant1637, - Variant1638, - Variant1639, - Variant1640, - Variant1641, - Variant1642, - Variant1643, - Variant1644, - Variant1645, - Variant1646, - Variant1647, - Variant1648, - Variant1649, - Variant1650, - Variant1651, - Variant1652, - Variant1653, - Variant1654, - Variant1655, - Variant1656, - Variant1657, - Variant1658, - Variant1659, - Variant1660, - Variant1661, - Variant1662, - Variant1663, - Variant1664, - Variant1665, - Variant1666, - Variant1667, - Variant1668, - Variant1669, - Variant1670, - Variant1671, - Variant1672, - Variant1673, - Variant1674, - Variant1675, - Variant1676, - Variant1677, - Variant1678, - Variant1679, - Variant1680, - Variant1681, - Variant1682, - Variant1683, - Variant1684, - Variant1685, - Variant1686, - Variant1687, - Variant1688, - Variant1689, - Variant1690, - Variant1691, - Variant1692, - Variant1693, - Variant1694, - Variant1695, - Variant1696, - Variant1697, - Variant1698, - Variant1699, - Variant1700, - Variant1701, - Variant1702, - Variant1703, - Variant1704, - Variant1705, - Variant1706, - Variant1707, - Variant1708, - Variant1709, - Variant1710, - Variant1711, - Variant1712, - Variant1713, - Variant1714, - Variant1715, - Variant1716, - Variant1717, - Variant1718, - Variant1719, - Variant1720, - Variant1721, - Variant1722, - Variant1723, - Variant1724, - Variant1725, - Variant1726, - Variant1727, - Variant1728, - Variant1729, - Variant1730, - Variant1731, - Variant1732, - Variant1733, - Variant1734, - Variant1735, - Variant1736, - Variant1737, - Variant1738, - Variant1739, - Variant1740, - Variant1741, - Variant1742, - Variant1743, - Variant1744, - Variant1745, - Variant1746, - Variant1747, - Variant1748, - Variant1749, - Variant1750, - Variant1751, - Variant1752, - Variant1753, - Variant1754, - Variant1755, - Variant1756, - Variant1757, - Variant1758, - Variant1759, - Variant1760, - Variant1761, - Variant1762, - Variant1763, - Variant1764, - Variant1765, - Variant1766, - Variant1767, - Variant1768, - Variant1769, - Variant1770, - Variant1771, - Variant1772, - Variant1773, - Variant1774, - Variant1775, - Variant1776, - Variant1777, - Variant1778, - Variant1779, - Variant1780, - Variant1781, - Variant1782, - Variant1783, - Variant1784, - Variant1785, - Variant1786, - Variant1787, - Variant1788, - Variant1789, - Variant1790, - Variant1791, - Variant1792, - Variant1793, - Variant1794, - Variant1795, - Variant1796, - Variant1797, - Variant1798, - Variant1799, - Variant1800, - Variant1801, - Variant1802, - Variant1803, - Variant1804, - Variant1805, - Variant1806, - Variant1807, - Variant1808, - Variant1809, - Variant1810, - Variant1811, - Variant1812, - Variant1813, - Variant1814, - Variant1815, - Variant1816, - Variant1817, - Variant1818, - Variant1819, - Variant1820, - Variant1821, - Variant1822, - Variant1823, - Variant1824, - Variant1825, - Variant1826, - Variant1827, - Variant1828, - Variant1829, - Variant1830, - Variant1831, - Variant1832, - Variant1833, - Variant1834, - Variant1835, - Variant1836, - Variant1837, - Variant1838, - Variant1839, - Variant1840, - Variant1841, - Variant1842, - Variant1843, - Variant1844, - Variant1845, - Variant1846, - Variant1847, - Variant1848, - Variant1849, - Variant1850, - Variant1851, - Variant1852, - Variant1853, - Variant1854, - Variant1855, - Variant1856, - Variant1857, - Variant1858, - Variant1859, - Variant1860, - Variant1861, - Variant1862, - Variant1863, - Variant1864, - Variant1865, - Variant1866, - Variant1867, - Variant1868, - Variant1869, - Variant1870, - Variant1871, - Variant1872, - Variant1873, - Variant1874, - Variant1875, - Variant1876, - Variant1877, - Variant1878, - Variant1879, - Variant1880, - Variant1881, - Variant1882, - Variant1883, - Variant1884, - Variant1885, - Variant1886, - Variant1887, - Variant1888, - Variant1889, - Variant1890, - Variant1891, - Variant1892, - Variant1893, - Variant1894, - Variant1895, - Variant1896, - Variant1897, - Variant1898, - Variant1899, - Variant1900, - Variant1901, - Variant1902, - Variant1903, - Variant1904, - Variant1905, - Variant1906, - Variant1907, - Variant1908, - Variant1909, - Variant1910, - Variant1911, - Variant1912, - Variant1913, - Variant1914, - Variant1915, - Variant1916, - Variant1917, - Variant1918, - Variant1919, - Variant1920, - Variant1921, - Variant1922, - Variant1923, - Variant1924, - Variant1925, - Variant1926, - Variant1927, - Variant1928, - Variant1929, - Variant1930, - Variant1931, - Variant1932, - Variant1933, - Variant1934, - Variant1935, - Variant1936, - Variant1937, - Variant1938, - Variant1939, - Variant1940, - Variant1941, - Variant1942, - Variant1943, - Variant1944, - Variant1945, - Variant1946, - Variant1947, - Variant1948, - Variant1949, - Variant1950, - Variant1951, - Variant1952, - Variant1953, - Variant1954, - Variant1955, - Variant1956, - Variant1957, - Variant1958, - Variant1959, - Variant1960, - Variant1961, - Variant1962, - Variant1963, - Variant1964, - Variant1965, - Variant1966, - Variant1967, - Variant1968, - Variant1969, - Variant1970, - Variant1971, - Variant1972, - Variant1973, - Variant1974, - Variant1975, - Variant1976, - Variant1977, - Variant1978, - Variant1979, - Variant1980, - Variant1981, - Variant1982, - Variant1983, - Variant1984, - Variant1985, - Variant1986, - Variant1987, - Variant1988, - Variant1989, - Variant1990, - Variant1991, - Variant1992, - Variant1993, - Variant1994, - Variant1995, - Variant1996, - Variant1997, - Variant1998, - Variant1999, - Variant2000, - Variant2001, - Variant2002, - Variant2003, - Variant2004, - Variant2005, - Variant2006, - Variant2007, - Variant2008, - Variant2009, - Variant2010, - Variant2011, - Variant2012, - Variant2013, - Variant2014, - Variant2015, - Variant2016, - Variant2017, - Variant2018, - Variant2019, - Variant2020, - Variant2021, - Variant2022, - Variant2023, - Variant2024, - Variant2025, - Variant2026, - Variant2027, - Variant2028, - Variant2029, - Variant2030, - Variant2031, - Variant2032, - Variant2033, - Variant2034, - Variant2035, - Variant2036, - Variant2037, - Variant2038, - Variant2039, - Variant2040, - Variant2041, - Variant2042, - Variant2043, - Variant2044, - Variant2045, - Variant2046, - Variant2047, - Variant2048, - Variant2049, - Variant2050, - Variant2051, - Variant2052, - Variant2053, - Variant2054, - Variant2055, - Variant2056, - Variant2057, - Variant2058, - Variant2059, - Variant2060, - Variant2061, - Variant2062, - Variant2063, - Variant2064, - Variant2065, - Variant2066, - Variant2067, - Variant2068, - Variant2069, - Variant2070, - Variant2071, - Variant2072, - Variant2073, - Variant2074, - Variant2075, - Variant2076, - Variant2077, - Variant2078, - Variant2079, - Variant2080, - Variant2081, - Variant2082, - Variant2083, - Variant2084, - Variant2085, - Variant2086, - Variant2087, - Variant2088, - Variant2089, - Variant2090, - Variant2091, - Variant2092, - Variant2093, - Variant2094, - Variant2095, - Variant2096, - Variant2097, - Variant2098, - Variant2099, - Variant2100, - Variant2101, - Variant2102, - Variant2103, - Variant2104, - Variant2105, - Variant2106, - Variant2107, - Variant2108, - Variant2109, - Variant2110, - Variant2111, - Variant2112, - Variant2113, - Variant2114, - Variant2115, - Variant2116, - Variant2117, - Variant2118, - Variant2119, - Variant2120, - Variant2121, - Variant2122, - Variant2123, - Variant2124, - Variant2125, - Variant2126, - Variant2127, - Variant2128, - Variant2129, - Variant2130, - Variant2131, - Variant2132, - Variant2133, - Variant2134, - Variant2135, - Variant2136, - Variant2137, - Variant2138, - Variant2139, - Variant2140, - Variant2141, - Variant2142, - Variant2143, - Variant2144, - Variant2145, - Variant2146, - Variant2147, - Variant2148, - Variant2149, - Variant2150, - Variant2151, - Variant2152, - Variant2153, - Variant2154, - Variant2155, - Variant2156, - Variant2157, - Variant2158, - Variant2159, - Variant2160, - Variant2161, - Variant2162, - Variant2163, - Variant2164, - Variant2165, - Variant2166, - Variant2167, - Variant2168, - Variant2169, - Variant2170, - Variant2171, - Variant2172, - Variant2173, - Variant2174, - Variant2175, - Variant2176, - Variant2177, - Variant2178, - Variant2179, - Variant2180, - Variant2181, - Variant2182, - Variant2183, - Variant2184, - Variant2185, - Variant2186, - Variant2187, - Variant2188, - Variant2189, - Variant2190, - Variant2191, - Variant2192, - Variant2193, - Variant2194, - Variant2195, - Variant2196, - Variant2197, - Variant2198, - Variant2199, - Variant2200, - Variant2201, - Variant2202, - Variant2203, - Variant2204, - Variant2205, - Variant2206, - Variant2207, - Variant2208, - Variant2209, - Variant2210, - Variant2211, - Variant2212, - Variant2213, - Variant2214, - Variant2215, - Variant2216, - Variant2217, - Variant2218, - Variant2219, - Variant2220, - Variant2221, - Variant2222, - Variant2223, - Variant2224, - Variant2225, - Variant2226, - Variant2227, - Variant2228, - Variant2229, - Variant2230, - Variant2231, - Variant2232, - Variant2233, - Variant2234, - Variant2235, - Variant2236, - Variant2237, - Variant2238, - Variant2239, - Variant2240, - Variant2241, - Variant2242, - Variant2243, - Variant2244, - Variant2245, - Variant2246, - Variant2247, - Variant2248, - Variant2249, - Variant2250, - Variant2251, - Variant2252, - Variant2253, - Variant2254, - Variant2255, - Variant2256, - Variant2257, - Variant2258, - Variant2259, - Variant2260, - Variant2261, - Variant2262, - Variant2263, - Variant2264, - Variant2265, - Variant2266, - Variant2267, - Variant2268, - Variant2269, - Variant2270, - Variant2271, - Variant2272, - Variant2273, - Variant2274, - Variant2275, - Variant2276, - Variant2277, - Variant2278, - Variant2279, - Variant2280, - Variant2281, - Variant2282, - Variant2283, - Variant2284, - Variant2285, - Variant2286, - Variant2287, - Variant2288, - Variant2289, - Variant2290, - Variant2291, - Variant2292, - Variant2293, - Variant2294, - Variant2295, - Variant2296, - Variant2297, - Variant2298, - Variant2299, - Variant2300, - Variant2301, - Variant2302, - Variant2303, - Variant2304, - Variant2305, - Variant2306, - Variant2307, - Variant2308, - Variant2309, - Variant2310, - Variant2311, - Variant2312, - Variant2313, - Variant2314, - Variant2315, - Variant2316, - Variant2317, - Variant2318, - Variant2319, - Variant2320, - Variant2321, - Variant2322, - Variant2323, - Variant2324, - Variant2325, - Variant2326, - Variant2327, - Variant2328, - Variant2329, - Variant2330, - Variant2331, - Variant2332, - Variant2333, - Variant2334, - Variant2335, - Variant2336, - Variant2337, - Variant2338, - Variant2339, - Variant2340, - Variant2341, - Variant2342, - Variant2343, - Variant2344, - Variant2345, - Variant2346, - Variant2347, - Variant2348, - Variant2349, - Variant2350, - Variant2351, - Variant2352, - Variant2353, - Variant2354, - Variant2355, - Variant2356, - Variant2357, - Variant2358, - Variant2359, - Variant2360, - Variant2361, - Variant2362, - Variant2363, - Variant2364, - Variant2365, - Variant2366, - Variant2367, - Variant2368, - Variant2369, - Variant2370, - Variant2371, - Variant2372, - Variant2373, - Variant2374, - Variant2375, - Variant2376, - Variant2377, - Variant2378, - Variant2379, - Variant2380, - Variant2381, - Variant2382, - Variant2383, - Variant2384, - Variant2385, - Variant2386, - Variant2387, - Variant2388, - Variant2389, - Variant2390, - Variant2391, - Variant2392, - Variant2393, - Variant2394, - Variant2395, - Variant2396, - Variant2397, - Variant2398, - Variant2399, - Variant2400, - Variant2401, - Variant2402, - Variant2403, - Variant2404, - Variant2405, - Variant2406, - Variant2407, - Variant2408, - Variant2409, - Variant2410, - Variant2411, - Variant2412, - Variant2413, - Variant2414, - Variant2415, - Variant2416, - Variant2417, - Variant2418, - Variant2419, - Variant2420, - Variant2421, - Variant2422, - Variant2423, - Variant2424, - Variant2425, - Variant2426, - Variant2427, - Variant2428, - Variant2429, - Variant2430, - Variant2431, - Variant2432, - Variant2433, - Variant2434, - Variant2435, - Variant2436, - Variant2437, - Variant2438, - Variant2439, - Variant2440, - Variant2441, - Variant2442, - Variant2443, - Variant2444, - Variant2445, - Variant2446, - Variant2447, - Variant2448, - Variant2449, - Variant2450, - Variant2451, - Variant2452, - Variant2453, - Variant2454, - Variant2455, - Variant2456, - Variant2457, - Variant2458, - Variant2459, - Variant2460, - Variant2461, - Variant2462, - Variant2463, - Variant2464, - Variant2465, - Variant2466, - Variant2467, - Variant2468, - Variant2469, - Variant2470, - Variant2471, - Variant2472, - Variant2473, - Variant2474, - Variant2475, - Variant2476, - Variant2477, - Variant2478, - Variant2479, - Variant2480, - Variant2481, - Variant2482, - Variant2483, - Variant2484, - Variant2485, - Variant2486, - Variant2487, - Variant2488, - Variant2489, - Variant2490, - Variant2491, - Variant2492, - Variant2493, - Variant2494, - Variant2495, - Variant2496, - Variant2497, - Variant2498, - Variant2499, - Variant2500, - Variant2501, - Variant2502, - Variant2503, - Variant2504, - Variant2505, - Variant2506, - Variant2507, - Variant2508, - Variant2509, - Variant2510, - Variant2511, - Variant2512, - Variant2513, - Variant2514, - Variant2515, - Variant2516, - Variant2517, - Variant2518, - Variant2519, - Variant2520, - Variant2521, - Variant2522, - Variant2523, - Variant2524, - Variant2525, - Variant2526, - Variant2527, - Variant2528, - Variant2529, - Variant2530, - Variant2531, - Variant2532, - Variant2533, - Variant2534, - Variant2535, - Variant2536, - Variant2537, - Variant2538, - Variant2539, - Variant2540, - Variant2541, - Variant2542, - Variant2543, - Variant2544, - Variant2545, - Variant2546, - Variant2547, - Variant2548, - Variant2549, - Variant2550, - Variant2551, - Variant2552, - Variant2553, - Variant2554, - Variant2555, - Variant2556, - Variant2557, - Variant2558, - Variant2559, - Variant2560, - Variant2561, - Variant2562, - Variant2563, - Variant2564, - Variant2565, - Variant2566, - Variant2567, - Variant2568, - Variant2569, - Variant2570, - Variant2571, - Variant2572, - Variant2573, - Variant2574, - Variant2575, - Variant2576, - Variant2577, - Variant2578, - Variant2579, - Variant2580, - Variant2581, - Variant2582, - Variant2583, - Variant2584, - Variant2585, - Variant2586, - Variant2587, - Variant2588, - Variant2589, - Variant2590, - Variant2591, - Variant2592, - Variant2593, - Variant2594, - Variant2595, - Variant2596, - Variant2597, - Variant2598, - Variant2599, - Variant2600, - Variant2601, - Variant2602, - Variant2603, - Variant2604, - Variant2605, - Variant2606, - Variant2607, - Variant2608, - Variant2609, - Variant2610, - Variant2611, - Variant2612, - Variant2613, - Variant2614, - Variant2615, - Variant2616, - Variant2617, - Variant2618, - Variant2619, - Variant2620, - Variant2621, - Variant2622, - Variant2623, - Variant2624, - Variant2625, - Variant2626, - Variant2627, - Variant2628, - Variant2629, - Variant2630, - Variant2631, - Variant2632, - Variant2633, - Variant2634, - Variant2635, - Variant2636, - Variant2637, - Variant2638, - Variant2639, - Variant2640, - Variant2641, - Variant2642, - Variant2643, - Variant2644, - Variant2645, - Variant2646, - Variant2647, - Variant2648, - Variant2649, - Variant2650, - Variant2651, - Variant2652, - Variant2653, - Variant2654, - Variant2655, - Variant2656, - Variant2657, - Variant2658, - Variant2659, - Variant2660, - Variant2661, - Variant2662, - Variant2663, - Variant2664, - Variant2665, - Variant2666, - Variant2667, - Variant2668, - Variant2669, - Variant2670, - Variant2671, - Variant2672, - Variant2673, - Variant2674, - Variant2675, - Variant2676, - Variant2677, - Variant2678, - Variant2679, - Variant2680, - Variant2681, - Variant2682, - Variant2683, - Variant2684, - Variant2685, - Variant2686, - Variant2687, - Variant2688, - Variant2689, - Variant2690, - Variant2691, - Variant2692, - Variant2693, - Variant2694, - Variant2695, - Variant2696, - Variant2697, - Variant2698, - Variant2699, - Variant2700, - Variant2701, - Variant2702, - Variant2703, - Variant2704, - Variant2705, - Variant2706, - Variant2707, - Variant2708, - Variant2709, - Variant2710, - Variant2711, - Variant2712, - Variant2713, - Variant2714, - Variant2715, - Variant2716, - Variant2717, - Variant2718, - Variant2719, - Variant2720, - Variant2721, - Variant2722, - Variant2723, - Variant2724, - Variant2725, - Variant2726, - Variant2727, - Variant2728, - Variant2729, - Variant2730, - Variant2731, - Variant2732, - Variant2733, - Variant2734, - Variant2735, - Variant2736, - Variant2737, - Variant2738, - Variant2739, - Variant2740, - Variant2741, - Variant2742, - Variant2743, - Variant2744, - Variant2745, - Variant2746, - Variant2747, - Variant2748, - Variant2749, - Variant2750, - Variant2751, - Variant2752, - Variant2753, - Variant2754, - Variant2755, - Variant2756, - Variant2757, - Variant2758, - Variant2759, - Variant2760, - Variant2761, - Variant2762, - Variant2763, - Variant2764, - Variant2765, - Variant2766, - Variant2767, - Variant2768, - Variant2769, - Variant2770, - Variant2771, - Variant2772, - Variant2773, - Variant2774, - Variant2775, - Variant2776, - Variant2777, - Variant2778, - Variant2779, - Variant2780, - Variant2781, - Variant2782, - Variant2783, - Variant2784, - Variant2785, - Variant2786, - Variant2787, - Variant2788, - Variant2789, - Variant2790, - Variant2791, - Variant2792, - Variant2793, - Variant2794, - Variant2795, - Variant2796, - Variant2797, - Variant2798, - Variant2799, - Variant2800, - Variant2801, - Variant2802, - Variant2803, - Variant2804, - Variant2805, - Variant2806, - Variant2807, - Variant2808, - Variant2809, - Variant2810, - Variant2811, - Variant2812, - Variant2813, - Variant2814, - Variant2815, - Variant2816, - Variant2817, - Variant2818, - Variant2819, - Variant2820, - Variant2821, - Variant2822, - Variant2823, - Variant2824, - Variant2825, - Variant2826, - Variant2827, - Variant2828, - Variant2829, - Variant2830, - Variant2831, - Variant2832, - Variant2833, - Variant2834, - Variant2835, - Variant2836, - Variant2837, - Variant2838, - Variant2839, - Variant2840, - Variant2841, - Variant2842, - Variant2843, - Variant2844, - Variant2845, - Variant2846, - Variant2847, - Variant2848, - Variant2849, - Variant2850, - Variant2851, - Variant2852, - Variant2853, - Variant2854, - Variant2855, - Variant2856, - Variant2857, - Variant2858, - Variant2859, - Variant2860, - Variant2861, - Variant2862, - Variant2863, - Variant2864, - Variant2865, - Variant2866, - Variant2867, - Variant2868, - Variant2869, - Variant2870, - Variant2871, - Variant2872, - Variant2873, - Variant2874, - Variant2875, - Variant2876, - Variant2877, - Variant2878, - Variant2879, - Variant2880, - Variant2881, - Variant2882, - Variant2883, - Variant2884, - Variant2885, - Variant2886, - Variant2887, - Variant2888, - Variant2889, - Variant2890, - Variant2891, - Variant2892, - Variant2893, - Variant2894, - Variant2895, - Variant2896, - Variant2897, - Variant2898, - Variant2899, - Variant2900, - Variant2901, - Variant2902, - Variant2903, - Variant2904, - Variant2905, - Variant2906, - Variant2907, - Variant2908, - Variant2909, - Variant2910, - Variant2911, - Variant2912, - Variant2913, - Variant2914, - Variant2915, - Variant2916, - Variant2917, - Variant2918, - Variant2919, - Variant2920, - Variant2921, - Variant2922, - Variant2923, - Variant2924, - Variant2925, - Variant2926, - Variant2927, - Variant2928, - Variant2929, - Variant2930, - Variant2931, - Variant2932, - Variant2933, - Variant2934, - Variant2935, - Variant2936, - Variant2937, - Variant2938, - Variant2939, - Variant2940, - Variant2941, - Variant2942, - Variant2943, - Variant2944, - Variant2945, - Variant2946, - Variant2947, - Variant2948, - Variant2949, - Variant2950, - Variant2951, - Variant2952, - Variant2953, - Variant2954, - Variant2955, - Variant2956, - Variant2957, - Variant2958, - Variant2959, - Variant2960, - Variant2961, - Variant2962, - Variant2963, - Variant2964, - Variant2965, - Variant2966, - Variant2967, - Variant2968, - Variant2969, - Variant2970, - Variant2971, - Variant2972, - Variant2973, - Variant2974, - Variant2975, - Variant2976, - Variant2977, - Variant2978, - Variant2979, - Variant2980, - Variant2981, - Variant2982, - Variant2983, - Variant2984, - Variant2985, - Variant2986, - Variant2987, - Variant2988, - Variant2989, - Variant2990, - Variant2991, - Variant2992, - Variant2993, - Variant2994, - Variant2995, - Variant2996, - Variant2997, - Variant2998, - Variant2999, - Variant3000, - Variant3001, - Variant3002, - Variant3003, - Variant3004, - Variant3005, - Variant3006, - Variant3007, - Variant3008, - Variant3009, - Variant3010, - Variant3011, - Variant3012, - Variant3013, - Variant3014, - Variant3015, - Variant3016, - Variant3017, - Variant3018, - Variant3019, - Variant3020, - Variant3021, - Variant3022, - Variant3023, - Variant3024, - Variant3025, - Variant3026, - Variant3027, - Variant3028, - Variant3029, - Variant3030, - Variant3031, - Variant3032, - Variant3033, - Variant3034, - Variant3035, - Variant3036, - Variant3037, - Variant3038, - Variant3039, - Variant3040, - Variant3041, - Variant3042, - Variant3043, - Variant3044, - Variant3045, - Variant3046, - Variant3047, - Variant3048, - Variant3049, - Variant3050, - Variant3051, - Variant3052, - Variant3053, - Variant3054, - Variant3055, - Variant3056, - Variant3057, - Variant3058, - Variant3059, - Variant3060, - Variant3061, - Variant3062, - Variant3063, - Variant3064, - Variant3065, - Variant3066, - Variant3067, - Variant3068, - Variant3069, - Variant3070, - Variant3071, - Variant3072, - Variant3073, - Variant3074, - Variant3075, - Variant3076, - Variant3077, - Variant3078, - Variant3079, - Variant3080, - Variant3081, - Variant3082, - Variant3083, - Variant3084, - Variant3085, - Variant3086, - Variant3087, - Variant3088, - Variant3089, - Variant3090, - Variant3091, - Variant3092, - Variant3093, - Variant3094, - Variant3095, - Variant3096, - Variant3097, - Variant3098, - Variant3099, - Variant3100, - Variant3101, - Variant3102, - Variant3103, - Variant3104, - Variant3105, - Variant3106, - Variant3107, - Variant3108, - Variant3109, - Variant3110, - Variant3111, - Variant3112, - Variant3113, - Variant3114, - Variant3115, - Variant3116, - Variant3117, - Variant3118, - Variant3119, - Variant3120, - Variant3121, - Variant3122, - Variant3123, - Variant3124, - Variant3125, - Variant3126, - Variant3127, - Variant3128, - Variant3129, - Variant3130, - Variant3131, - Variant3132, - Variant3133, - Variant3134, - Variant3135, - Variant3136, - Variant3137, - Variant3138, - Variant3139, - Variant3140, - Variant3141, - Variant3142, - Variant3143, - Variant3144, - Variant3145, - Variant3146, - Variant3147, - Variant3148, - Variant3149, - Variant3150, - Variant3151, - Variant3152, - Variant3153, - Variant3154, - Variant3155, - Variant3156, - Variant3157, - Variant3158, - Variant3159, - Variant3160, - Variant3161, - Variant3162, - Variant3163, - Variant3164, - Variant3165, - Variant3166, - Variant3167, - Variant3168, - Variant3169, - Variant3170, - Variant3171, - Variant3172, - Variant3173, - Variant3174, - Variant3175, - Variant3176, - Variant3177, - Variant3178, - Variant3179, - Variant3180, - Variant3181, - Variant3182, - Variant3183, - Variant3184, - Variant3185, - Variant3186, - Variant3187, - Variant3188, - Variant3189, - Variant3190, - Variant3191, - Variant3192, - Variant3193, - Variant3194, - Variant3195, - Variant3196, - Variant3197, - Variant3198, - Variant3199, - Variant3200, - Variant3201, - Variant3202, - Variant3203, - Variant3204, - Variant3205, - Variant3206, - Variant3207, - Variant3208, - Variant3209, - Variant3210, - Variant3211, - Variant3212, - Variant3213, - Variant3214, - Variant3215, - Variant3216, - Variant3217, - Variant3218, - Variant3219, - Variant3220, - Variant3221, - Variant3222, - Variant3223, - Variant3224, - Variant3225, - Variant3226, - Variant3227, - Variant3228, - Variant3229, - Variant3230, - Variant3231, - Variant3232, - Variant3233, - Variant3234, - Variant3235, - Variant3236, - Variant3237, - Variant3238, - Variant3239, - Variant3240, - Variant3241, - Variant3242, - Variant3243, - Variant3244, - Variant3245, - Variant3246, - Variant3247, - Variant3248, - Variant3249, - Variant3250, - Variant3251, - Variant3252, - Variant3253, - Variant3254, - Variant3255, - Variant3256, - Variant3257, - Variant3258, - Variant3259, - Variant3260, - Variant3261, - Variant3262, - Variant3263, - Variant3264, - Variant3265, - Variant3266, - Variant3267, - Variant3268, - Variant3269, - Variant3270, - Variant3271, - Variant3272, - Variant3273, - Variant3274, - Variant3275, - Variant3276, - Variant3277, - Variant3278, - Variant3279, - Variant3280, - Variant3281, - Variant3282, - Variant3283, - Variant3284, - Variant3285, - Variant3286, - Variant3287, - Variant3288, - Variant3289, - Variant3290, - Variant3291, - Variant3292, - Variant3293, - Variant3294, - Variant3295, - Variant3296, - Variant3297, - Variant3298, - Variant3299, - Variant3300, - Variant3301, - Variant3302, - Variant3303, - Variant3304, - Variant3305, - Variant3306, - Variant3307, - Variant3308, - Variant3309, - Variant3310, - Variant3311, - Variant3312, - Variant3313, - Variant3314, - Variant3315, - Variant3316, - Variant3317, - Variant3318, - Variant3319, - Variant3320, - Variant3321, - Variant3322, - Variant3323, - Variant3324, - Variant3325, - Variant3326, - Variant3327, - Variant3328, - Variant3329, - Variant3330, - Variant3331, - Variant3332, - Variant3333, - Variant3334, - Variant3335, - Variant3336, - Variant3337, - Variant3338, - Variant3339, - Variant3340, - Variant3341, - Variant3342, - Variant3343, - Variant3344, - Variant3345, - Variant3346, - Variant3347, - Variant3348, - Variant3349, - Variant3350, - Variant3351, - Variant3352, - Variant3353, - Variant3354, - Variant3355, - Variant3356, - Variant3357, - Variant3358, - Variant3359, - Variant3360, - Variant3361, - Variant3362, - Variant3363, - Variant3364, - Variant3365, - Variant3366, - Variant3367, - Variant3368, - Variant3369, - Variant3370, - Variant3371, - Variant3372, - Variant3373, - Variant3374, - Variant3375, - Variant3376, - Variant3377, - Variant3378, - Variant3379, - Variant3380, - Variant3381, - Variant3382, - Variant3383, - Variant3384, - Variant3385, - Variant3386, - Variant3387, - Variant3388, - Variant3389, - Variant3390, - Variant3391, - Variant3392, - Variant3393, - Variant3394, - Variant3395, - Variant3396, - Variant3397, - Variant3398, - Variant3399, - Variant3400, - Variant3401, - Variant3402, - Variant3403, - Variant3404, - Variant3405, - Variant3406, - Variant3407, - Variant3408, - Variant3409, - Variant3410, - Variant3411, - Variant3412, - Variant3413, - Variant3414, - Variant3415, - Variant3416, - Variant3417, - Variant3418, - Variant3419, - Variant3420, - Variant3421, - Variant3422, - Variant3423, - Variant3424, - Variant3425, - Variant3426, - Variant3427, - Variant3428, - Variant3429, - Variant3430, - Variant3431, - Variant3432, - Variant3433, - Variant3434, - Variant3435, - Variant3436, - Variant3437, - Variant3438, - Variant3439, - Variant3440, - Variant3441, - Variant3442, - Variant3443, - Variant3444, - Variant3445, - Variant3446, - Variant3447, - Variant3448, - Variant3449, - Variant3450, - Variant3451, - Variant3452, - Variant3453, - Variant3454, - Variant3455, - Variant3456, - Variant3457, - Variant3458, - Variant3459, - Variant3460, - Variant3461, - Variant3462, - Variant3463, - Variant3464, - Variant3465, - Variant3466, - Variant3467, - Variant3468, - Variant3469, - Variant3470, - Variant3471, - Variant3472, - Variant3473, - Variant3474, - Variant3475, - Variant3476, - Variant3477, - Variant3478, - Variant3479, - Variant3480, - Variant3481, - Variant3482, - Variant3483, - Variant3484, - Variant3485, - Variant3486, - Variant3487, - Variant3488, - Variant3489, - Variant3490, - Variant3491, - Variant3492, - Variant3493, - Variant3494, - Variant3495, - Variant3496, - Variant3497, - Variant3498, - Variant3499, - Variant3500, - Variant3501, - Variant3502, - Variant3503, - Variant3504, - Variant3505, - Variant3506, - Variant3507, - Variant3508, - Variant3509, - Variant3510, - Variant3511, - Variant3512, - Variant3513, - Variant3514, - Variant3515, - Variant3516, - Variant3517, - Variant3518, - Variant3519, - Variant3520, - Variant3521, - Variant3522, - Variant3523, - Variant3524, - Variant3525, - Variant3526, - Variant3527, - Variant3528, - Variant3529, - Variant3530, - Variant3531, - Variant3532, - Variant3533, - Variant3534, - Variant3535, - Variant3536, - Variant3537, - Variant3538, - Variant3539, - Variant3540, - Variant3541, - Variant3542, - Variant3543, - Variant3544, - Variant3545, - Variant3546, - Variant3547, - Variant3548, - Variant3549, - Variant3550, - Variant3551, - Variant3552, - Variant3553, - Variant3554, - Variant3555, - Variant3556, - Variant3557, - Variant3558, - Variant3559, - Variant3560, - Variant3561, - Variant3562, - Variant3563, - Variant3564, - Variant3565, - Variant3566, - Variant3567, - Variant3568, - Variant3569, - Variant3570, - Variant3571, - Variant3572, - Variant3573, - Variant3574, - Variant3575, - Variant3576, - Variant3577, - Variant3578, - Variant3579, - Variant3580, - Variant3581, - Variant3582, - Variant3583, - Variant3584, - Variant3585, - Variant3586, - Variant3587, - Variant3588, - Variant3589, - Variant3590, - Variant3591, - Variant3592, - Variant3593, - Variant3594, - Variant3595, - Variant3596, - Variant3597, - Variant3598, - Variant3599, - Variant3600, - Variant3601, - Variant3602, - Variant3603, - Variant3604, - Variant3605, - Variant3606, - Variant3607, - Variant3608, - Variant3609, - Variant3610, - Variant3611, - Variant3612, - Variant3613, - Variant3614, - Variant3615, - Variant3616, - Variant3617, - Variant3618, - Variant3619, - Variant3620, - Variant3621, - Variant3622, - Variant3623, - Variant3624, - Variant3625, - Variant3626, - Variant3627, - Variant3628, - Variant3629, - Variant3630, - Variant3631, - Variant3632, - Variant3633, - Variant3634, - Variant3635, - Variant3636, - Variant3637, - Variant3638, - Variant3639, - Variant3640, - Variant3641, - Variant3642, - Variant3643, - Variant3644, - Variant3645, - Variant3646, - Variant3647, - Variant3648, - Variant3649, - Variant3650, - Variant3651, - Variant3652, - Variant3653, - Variant3654, - Variant3655, - Variant3656, - Variant3657, - Variant3658, - Variant3659, - Variant3660, - Variant3661, - Variant3662, - Variant3663, - Variant3664, - Variant3665, - Variant3666, - Variant3667, - Variant3668, - Variant3669, - Variant3670, - Variant3671, - Variant3672, - Variant3673, - Variant3674, - Variant3675, - Variant3676, - Variant3677, - Variant3678, - Variant3679, - Variant3680, - Variant3681, - Variant3682, - Variant3683, - Variant3684, - Variant3685, - Variant3686, - Variant3687, - Variant3688, - Variant3689, - Variant3690, - Variant3691, - Variant3692, - Variant3693, - Variant3694, - Variant3695, - Variant3696, - Variant3697, - Variant3698, - Variant3699, - Variant3700, - Variant3701, - Variant3702, - Variant3703, - Variant3704, - Variant3705, - Variant3706, - Variant3707, - Variant3708, - Variant3709, - Variant3710, - Variant3711, - Variant3712, - Variant3713, - Variant3714, - Variant3715, - Variant3716, - Variant3717, - Variant3718, - Variant3719, - Variant3720, - Variant3721, - Variant3722, - Variant3723, - Variant3724, - Variant3725, - Variant3726, - Variant3727, - Variant3728, - Variant3729, - Variant3730, - Variant3731, - Variant3732, - Variant3733, - Variant3734, - Variant3735, - Variant3736, - Variant3737, - Variant3738, - Variant3739, - Variant3740, - Variant3741, - Variant3742, - Variant3743, - Variant3744, - Variant3745, - Variant3746, - Variant3747, - Variant3748, - Variant3749, - Variant3750, - Variant3751, - Variant3752, - Variant3753, - Variant3754, - Variant3755, - Variant3756, - Variant3757, - Variant3758, - Variant3759, - Variant3760, - Variant3761, - Variant3762, - Variant3763, - Variant3764, - Variant3765, - Variant3766, - Variant3767, - Variant3768, - Variant3769, - Variant3770, - Variant3771, - Variant3772, - Variant3773, - Variant3774, - Variant3775, - Variant3776, - Variant3777, - Variant3778, - Variant3779, - Variant3780, - Variant3781, - Variant3782, - Variant3783, - Variant3784, - Variant3785, - Variant3786, - Variant3787, - Variant3788, - Variant3789, - Variant3790, - Variant3791, - Variant3792, - Variant3793, - Variant3794, - Variant3795, - Variant3796, - Variant3797, - Variant3798, - Variant3799, - Variant3800, - Variant3801, - Variant3802, - Variant3803, - Variant3804, - Variant3805, - Variant3806, - Variant3807, - Variant3808, - Variant3809, - Variant3810, - Variant3811, - Variant3812, - Variant3813, - Variant3814, - Variant3815, - Variant3816, - Variant3817, - Variant3818, - Variant3819, - Variant3820, - Variant3821, - Variant3822, - Variant3823, - Variant3824, - Variant3825, - Variant3826, - Variant3827, - Variant3828, - Variant3829, - Variant3830, - Variant3831, - Variant3832, - Variant3833, - Variant3834, - Variant3835, - Variant3836, - Variant3837, - Variant3838, - Variant3839, - Variant3840, - Variant3841, - Variant3842, - Variant3843, - Variant3844, - Variant3845, - Variant3846, - Variant3847, - Variant3848, - Variant3849, - Variant3850, - Variant3851, - Variant3852, - Variant3853, - Variant3854, - Variant3855, - Variant3856, - Variant3857, - Variant3858, - Variant3859, - Variant3860, - Variant3861, - Variant3862, - Variant3863, - Variant3864, - Variant3865, - Variant3866, - Variant3867, - Variant3868, - Variant3869, - Variant3870, - Variant3871, - Variant3872, - Variant3873, - Variant3874, - Variant3875, - Variant3876, - Variant3877, - Variant3878, - Variant3879, - Variant3880, - Variant3881, - Variant3882, - Variant3883, - Variant3884, - Variant3885, - Variant3886, - Variant3887, - Variant3888, - Variant3889, - Variant3890, - Variant3891, - Variant3892, - Variant3893, - Variant3894, - Variant3895, - Variant3896, - Variant3897, - Variant3898, - Variant3899, - Variant3900, - Variant3901, - Variant3902, - Variant3903, - Variant3904, - Variant3905, - Variant3906, - Variant3907, - Variant3908, - Variant3909, - Variant3910, - Variant3911, - Variant3912, - Variant3913, - Variant3914, - Variant3915, - Variant3916, - Variant3917, - Variant3918, - Variant3919, - Variant3920, - Variant3921, - Variant3922, - Variant3923, - Variant3924, - Variant3925, - Variant3926, - Variant3927, - Variant3928, - Variant3929, - Variant3930, - Variant3931, - Variant3932, - Variant3933, - Variant3934, - Variant3935, - Variant3936, - Variant3937, - Variant3938, - Variant3939, - Variant3940, - Variant3941, - Variant3942, - Variant3943, - Variant3944, - Variant3945, - Variant3946, - Variant3947, - Variant3948, - Variant3949, - Variant3950, - Variant3951, - Variant3952, - Variant3953, - Variant3954, - Variant3955, - Variant3956, - Variant3957, - Variant3958, - Variant3959, - Variant3960, - Variant3961, - Variant3962, - Variant3963, - Variant3964, - Variant3965, - Variant3966, - Variant3967, - Variant3968, - Variant3969, - Variant3970, - Variant3971, - Variant3972, - Variant3973, - Variant3974, - Variant3975, - Variant3976, - Variant3977, - Variant3978, - Variant3979, - Variant3980, - Variant3981, - Variant3982, - Variant3983, - Variant3984, - Variant3985, - Variant3986, - Variant3987, - Variant3988, - Variant3989, - Variant3990, - Variant3991, - Variant3992, - Variant3993, - Variant3994, - Variant3995, - Variant3996, - Variant3997, - Variant3998, - Variant3999, - Variant4000, - Variant4001, - Variant4002, - Variant4003, - Variant4004, - Variant4005, - Variant4006, - Variant4007, - Variant4008, - Variant4009, - Variant4010, - Variant4011, - Variant4012, - Variant4013, - Variant4014, - Variant4015, - Variant4016, - Variant4017, - Variant4018, - Variant4019, - Variant4020, - Variant4021, - Variant4022, - Variant4023, - Variant4024, - Variant4025, - Variant4026, - Variant4027, - Variant4028, - Variant4029, - Variant4030, - Variant4031, - Variant4032, - Variant4033, - Variant4034, - Variant4035, - Variant4036, - Variant4037, - Variant4038, - Variant4039, - Variant4040, - Variant4041, - Variant4042, - Variant4043, - Variant4044, - Variant4045, - Variant4046, - Variant4047, - Variant4048, - Variant4049, - Variant4050, - Variant4051, - Variant4052, - Variant4053, - Variant4054, - Variant4055, - Variant4056, - Variant4057, - Variant4058, - Variant4059, - Variant4060, - Variant4061, - Variant4062, - Variant4063, - Variant4064, - Variant4065, - Variant4066, - Variant4067, - Variant4068, - Variant4069, - Variant4070, - Variant4071, - Variant4072, - Variant4073, - Variant4074, - Variant4075, - Variant4076, - Variant4077, - Variant4078, - Variant4079, - Variant4080, - Variant4081, - Variant4082, - Variant4083, - Variant4084, - Variant4085, - Variant4086, - Variant4087, - Variant4088, - Variant4089, - Variant4090, - Variant4091, - Variant4092, - Variant4093, - Variant4094, - Variant4095, - Variant4096, - Variant4097, - Variant4098, - Variant4099, - Variant4100, - Variant4101, - Variant4102, - Variant4103, - Variant4104, - Variant4105, - Variant4106, - Variant4107, - Variant4108, - Variant4109, - Variant4110, - Variant4111, - Variant4112, - Variant4113, - Variant4114, - Variant4115, - Variant4116, - Variant4117, - Variant4118, - Variant4119, - Variant4120, - Variant4121, - Variant4122, - Variant4123, - Variant4124, - Variant4125, - Variant4126, - Variant4127, - Variant4128, - Variant4129, - Variant4130, - Variant4131, - Variant4132, - Variant4133, - Variant4134, - Variant4135, - Variant4136, - Variant4137, - Variant4138, - Variant4139, - Variant4140, - Variant4141, - Variant4142, - Variant4143, - Variant4144, - Variant4145, - Variant4146, - Variant4147, - Variant4148, - Variant4149, - Variant4150, - Variant4151, - Variant4152, - Variant4153, - Variant4154, - Variant4155, - Variant4156, - Variant4157, - Variant4158, - Variant4159, - Variant4160, - Variant4161, - Variant4162, - Variant4163, - Variant4164, - Variant4165, - Variant4166, - Variant4167, - Variant4168, - Variant4169, - Variant4170, - Variant4171, - Variant4172, - Variant4173, - Variant4174, - Variant4175, - Variant4176, - Variant4177, - Variant4178, - Variant4179, - Variant4180, - Variant4181, - Variant4182, - Variant4183, - Variant4184, - Variant4185, - Variant4186, - Variant4187, - Variant4188, - Variant4189, - Variant4190, - Variant4191, - Variant4192, - Variant4193, - Variant4194, - Variant4195, - Variant4196, - Variant4197, - Variant4198, - Variant4199, - Variant4200, - Variant4201, - Variant4202, - Variant4203, - Variant4204, - Variant4205, - Variant4206, - Variant4207, - Variant4208, - Variant4209, - Variant4210, - Variant4211, - Variant4212, - Variant4213, - Variant4214, - Variant4215, - Variant4216, - Variant4217, - Variant4218, - Variant4219, - Variant4220, - Variant4221, - Variant4222, - Variant4223, - Variant4224, - Variant4225, - Variant4226, - Variant4227, - Variant4228, - Variant4229, - Variant4230, - Variant4231, - Variant4232, - Variant4233, - Variant4234, - Variant4235, - Variant4236, - Variant4237, - Variant4238, - Variant4239, - Variant4240, - Variant4241, - Variant4242, - Variant4243, - Variant4244, - Variant4245, - Variant4246, - Variant4247, - Variant4248, - Variant4249, - Variant4250, - Variant4251, - Variant4252, - Variant4253, - Variant4254, - Variant4255, - Variant4256, - Variant4257, - Variant4258, - Variant4259, - Variant4260, - Variant4261, - Variant4262, - Variant4263, - Variant4264, - Variant4265, - Variant4266, - Variant4267, - Variant4268, - Variant4269, - Variant4270, - Variant4271, - Variant4272, - Variant4273, - Variant4274, - Variant4275, - Variant4276, - Variant4277, - Variant4278, - Variant4279, - Variant4280, - Variant4281, - Variant4282, - Variant4283, - Variant4284, - Variant4285, - Variant4286, - Variant4287, - Variant4288, - Variant4289, - Variant4290, - Variant4291, - Variant4292, - Variant4293, - Variant4294, - Variant4295, - Variant4296, - Variant4297, - Variant4298, - Variant4299, - Variant4300, - Variant4301, - Variant4302, - Variant4303, - Variant4304, - Variant4305, - Variant4306, - Variant4307, - Variant4308, - Variant4309, - Variant4310, - Variant4311, - Variant4312, - Variant4313, - Variant4314, - Variant4315, - Variant4316, - Variant4317, - Variant4318, - Variant4319, - Variant4320, - Variant4321, - Variant4322, - Variant4323, - Variant4324, - Variant4325, - Variant4326, - Variant4327, - Variant4328, - Variant4329, - Variant4330, - Variant4331, - Variant4332, - Variant4333, - Variant4334, - Variant4335, - Variant4336, - Variant4337, - Variant4338, - Variant4339, - Variant4340, - Variant4341, - Variant4342, - Variant4343, - Variant4344, - Variant4345, - Variant4346, - Variant4347, - Variant4348, - Variant4349, - Variant4350, - Variant4351, - Variant4352, - Variant4353, - Variant4354, - Variant4355, - Variant4356, - Variant4357, - Variant4358, - Variant4359, - Variant4360, - Variant4361, - Variant4362, - Variant4363, - Variant4364, - Variant4365, - Variant4366, - Variant4367, - Variant4368, - Variant4369, - Variant4370, - Variant4371, - Variant4372, - Variant4373, - Variant4374, - Variant4375, - Variant4376, - Variant4377, - Variant4378, - Variant4379, - Variant4380, - Variant4381, - Variant4382, - Variant4383, - Variant4384, - Variant4385, - Variant4386, - Variant4387, - Variant4388, - Variant4389, - Variant4390, - Variant4391, - Variant4392, - Variant4393, - Variant4394, - Variant4395, - Variant4396, - Variant4397, - Variant4398, - Variant4399, - Variant4400, - Variant4401, - Variant4402, - Variant4403, - Variant4404, - Variant4405, - Variant4406, - Variant4407, - Variant4408, - Variant4409, - Variant4410, - Variant4411, - Variant4412, - Variant4413, - Variant4414, - Variant4415, - Variant4416, - Variant4417, - Variant4418, - Variant4419, - Variant4420, - Variant4421, - Variant4422, - Variant4423, - Variant4424, - Variant4425, - Variant4426, - Variant4427, - Variant4428, - Variant4429, - Variant4430, - Variant4431, - Variant4432, - Variant4433, - Variant4434, - Variant4435, - Variant4436, - Variant4437, - Variant4438, - Variant4439, - Variant4440, - Variant4441, - Variant4442, - Variant4443, - Variant4444, - Variant4445, - Variant4446, - Variant4447, - Variant4448, - Variant4449, - Variant4450, - Variant4451, - Variant4452, - Variant4453, - Variant4454, - Variant4455, - Variant4456, - Variant4457, - Variant4458, - Variant4459, - Variant4460, - Variant4461, - Variant4462, - Variant4463, - Variant4464, - Variant4465, - Variant4466, - Variant4467, - Variant4468, - Variant4469, - Variant4470, - Variant4471, - Variant4472, - Variant4473, - Variant4474, - Variant4475, - Variant4476, - Variant4477, - Variant4478, - Variant4479, - Variant4480, - Variant4481, - Variant4482, - Variant4483, - Variant4484, - Variant4485, - Variant4486, - Variant4487, - Variant4488, - Variant4489, - Variant4490, - Variant4491, - Variant4492, - Variant4493, - Variant4494, - Variant4495, - Variant4496, - Variant4497, - Variant4498, - Variant4499, - Variant4500, - Variant4501, - Variant4502, - Variant4503, - Variant4504, - Variant4505, - Variant4506, - Variant4507, - Variant4508, - Variant4509, - Variant4510, - Variant4511, - Variant4512, - Variant4513, - Variant4514, - Variant4515, - Variant4516, - Variant4517, - Variant4518, - Variant4519, - Variant4520, - Variant4521, - Variant4522, - Variant4523, - Variant4524, - Variant4525, - Variant4526, - Variant4527, - Variant4528, - Variant4529, - Variant4530, - Variant4531, - Variant4532, - Variant4533, - Variant4534, - Variant4535, - Variant4536, - Variant4537, - Variant4538, - Variant4539, - Variant4540, - Variant4541, - Variant4542, - Variant4543, - Variant4544, - Variant4545, - Variant4546, - Variant4547, - Variant4548, - Variant4549, - Variant4550, - Variant4551, - Variant4552, - Variant4553, - Variant4554, - Variant4555, - Variant4556, - Variant4557, - Variant4558, - Variant4559, - Variant4560, - Variant4561, - Variant4562, - Variant4563, - Variant4564, - Variant4565, - Variant4566, - Variant4567, - Variant4568, - Variant4569, - Variant4570, - Variant4571, - Variant4572, - Variant4573, - Variant4574, - Variant4575, - Variant4576, - Variant4577, - Variant4578, - Variant4579, - Variant4580, - Variant4581, - Variant4582, - Variant4583, - Variant4584, - Variant4585, - Variant4586, - Variant4587, - Variant4588, - Variant4589, - Variant4590, - Variant4591, - Variant4592, - Variant4593, - Variant4594, - Variant4595, - Variant4596, - Variant4597, - Variant4598, - Variant4599, - Variant4600, - Variant4601, - Variant4602, - Variant4603, - Variant4604, - Variant4605, - Variant4606, - Variant4607, - Variant4608, - Variant4609, - Variant4610, - Variant4611, - Variant4612, - Variant4613, - Variant4614, - Variant4615, - Variant4616, - Variant4617, - Variant4618, - Variant4619, - Variant4620, - Variant4621, - Variant4622, - Variant4623, - Variant4624, - Variant4625, - Variant4626, - Variant4627, - Variant4628, - Variant4629, - Variant4630, - Variant4631, - Variant4632, - Variant4633, - Variant4634, - Variant4635, - Variant4636, - Variant4637, - Variant4638, - Variant4639, - Variant4640, - Variant4641, - Variant4642, - Variant4643, - Variant4644, - Variant4645, - Variant4646, - Variant4647, - Variant4648, - Variant4649, - Variant4650, - Variant4651, - Variant4652, - Variant4653, - Variant4654, - Variant4655, - Variant4656, - Variant4657, - Variant4658, - Variant4659, - Variant4660, - Variant4661, - Variant4662, - Variant4663, - Variant4664, - Variant4665, - Variant4666, - Variant4667, - Variant4668, - Variant4669, - Variant4670, - Variant4671, - Variant4672, - Variant4673, - Variant4674, - Variant4675, - Variant4676, - Variant4677, - Variant4678, - Variant4679, - Variant4680, - Variant4681, - Variant4682, - Variant4683, - Variant4684, - Variant4685, - Variant4686, - Variant4687, - Variant4688, - Variant4689, - Variant4690, - Variant4691, - Variant4692, - Variant4693, - Variant4694, - Variant4695, - Variant4696, - Variant4697, - Variant4698, - Variant4699, - Variant4700, - Variant4701, - Variant4702, - Variant4703, - Variant4704, - Variant4705, - Variant4706, - Variant4707, - Variant4708, - Variant4709, - Variant4710, - Variant4711, - Variant4712, - Variant4713, - Variant4714, - Variant4715, - Variant4716, - Variant4717, - Variant4718, - Variant4719, - Variant4720, - Variant4721, - Variant4722, - Variant4723, - Variant4724, - Variant4725, - Variant4726, - Variant4727, - Variant4728, - Variant4729, - Variant4730, - Variant4731, - Variant4732, - Variant4733, - Variant4734, - Variant4735, - Variant4736, - Variant4737, - Variant4738, - Variant4739, - Variant4740, - Variant4741, - Variant4742, - Variant4743, - Variant4744, - Variant4745, - Variant4746, - Variant4747, - Variant4748, - Variant4749, - Variant4750, - Variant4751, - Variant4752, - Variant4753, - Variant4754, - Variant4755, - Variant4756, - Variant4757, - Variant4758, - Variant4759, - Variant4760, - Variant4761, - Variant4762, - Variant4763, - Variant4764, - Variant4765, - Variant4766, - Variant4767, - Variant4768, - Variant4769, - Variant4770, - Variant4771, - Variant4772, - Variant4773, - Variant4774, - Variant4775, - Variant4776, - Variant4777, - Variant4778, - Variant4779, - Variant4780, - Variant4781, - Variant4782, - Variant4783, - Variant4784, - Variant4785, - Variant4786, - Variant4787, - Variant4788, - Variant4789, - Variant4790, - Variant4791, - Variant4792, - Variant4793, - Variant4794, - Variant4795, - Variant4796, - Variant4797, - Variant4798, - Variant4799, - Variant4800, - Variant4801, - Variant4802, - Variant4803, - Variant4804, - Variant4805, - Variant4806, - Variant4807, - Variant4808, - Variant4809, - Variant4810, - Variant4811, - Variant4812, - Variant4813, - Variant4814, - Variant4815, - Variant4816, - Variant4817, - Variant4818, - Variant4819, - Variant4820, - Variant4821, - Variant4822, - Variant4823, - Variant4824, - Variant4825, - Variant4826, - Variant4827, - Variant4828, - Variant4829, - Variant4830, - Variant4831, - Variant4832, - Variant4833, - Variant4834, - Variant4835, - Variant4836, - Variant4837, - Variant4838, - Variant4839, - Variant4840, - Variant4841, - Variant4842, - Variant4843, - Variant4844, - Variant4845, - Variant4846, - Variant4847, - Variant4848, - Variant4849, - Variant4850, - Variant4851, - Variant4852, - Variant4853, - Variant4854, - Variant4855, - Variant4856, - Variant4857, - Variant4858, - Variant4859, - Variant4860, - Variant4861, - Variant4862, - Variant4863, - Variant4864, - Variant4865, - Variant4866, - Variant4867, - Variant4868, - Variant4869, - Variant4870, - Variant4871, - Variant4872, - Variant4873, - Variant4874, - Variant4875, - Variant4876, - Variant4877, - Variant4878, - Variant4879, - Variant4880, - Variant4881, - Variant4882, - Variant4883, - Variant4884, - Variant4885, - Variant4886, - Variant4887, - Variant4888, - Variant4889, - Variant4890, - Variant4891, - Variant4892, - Variant4893, - Variant4894, - Variant4895, - Variant4896, - Variant4897, - Variant4898, - Variant4899, - Variant4900, - Variant4901, - Variant4902, - Variant4903, - Variant4904, - Variant4905, - Variant4906, - Variant4907, - Variant4908, - Variant4909, - Variant4910, - Variant4911, - Variant4912, - Variant4913, - Variant4914, - Variant4915, - Variant4916, - Variant4917, - Variant4918, - Variant4919, - Variant4920, - Variant4921, - Variant4922, - Variant4923, - Variant4924, - Variant4925, - Variant4926, - Variant4927, - Variant4928, - Variant4929, - Variant4930, - Variant4931, - Variant4932, - Variant4933, - Variant4934, - Variant4935, - Variant4936, - Variant4937, - Variant4938, - Variant4939, - Variant4940, - Variant4941, - Variant4942, - Variant4943, - Variant4944, - Variant4945, - Variant4946, - Variant4947, - Variant4948, - Variant4949, - Variant4950, - Variant4951, - Variant4952, - Variant4953, - Variant4954, - Variant4955, - Variant4956, - Variant4957, - Variant4958, - Variant4959, - Variant4960, - Variant4961, - Variant4962, - Variant4963, - Variant4964, - Variant4965, - Variant4966, - Variant4967, - Variant4968, - Variant4969, - Variant4970, - Variant4971, - Variant4972, - Variant4973, - Variant4974, - Variant4975, - Variant4976, - Variant4977, - Variant4978, - Variant4979, - Variant4980, - Variant4981, - Variant4982, - Variant4983, - Variant4984, - Variant4985, - Variant4986, - Variant4987, - Variant4988, - Variant4989, - Variant4990, - Variant4991, - Variant4992, - Variant4993, - Variant4994, - Variant4995, - Variant4996, - Variant4997, - Variant4998, - Variant4999, - Variant5000, - Variant5001, - Variant5002, - Variant5003, - Variant5004, - Variant5005, - Variant5006, - Variant5007, - Variant5008, - Variant5009, - Variant5010, - Variant5011, - Variant5012, - Variant5013, - Variant5014, - Variant5015, - Variant5016, - Variant5017, - Variant5018, - Variant5019, - Variant5020, - Variant5021, - Variant5022, - Variant5023, - Variant5024, - Variant5025, - Variant5026, - Variant5027, - Variant5028, - Variant5029, - Variant5030, - Variant5031, - Variant5032, - Variant5033, - Variant5034, - Variant5035, - Variant5036, - Variant5037, - Variant5038, - Variant5039, - Variant5040, - Variant5041, - Variant5042, - Variant5043, - Variant5044, - Variant5045, - Variant5046, - Variant5047, - Variant5048, - Variant5049, - Variant5050, - Variant5051, - Variant5052, - Variant5053, - Variant5054, - Variant5055, - Variant5056, - Variant5057, - Variant5058, - Variant5059, - Variant5060, - Variant5061, - Variant5062, - Variant5063, - Variant5064, - Variant5065, - Variant5066, - Variant5067, - Variant5068, - Variant5069, - Variant5070, - Variant5071, - Variant5072, - Variant5073, - Variant5074, - Variant5075, - Variant5076, - Variant5077, - Variant5078, - Variant5079, - Variant5080, - Variant5081, - Variant5082, - Variant5083, - Variant5084, - Variant5085, - Variant5086, - Variant5087, - Variant5088, - Variant5089, - Variant5090, - Variant5091, - Variant5092, - Variant5093, - Variant5094, - Variant5095, - Variant5096, - Variant5097, - Variant5098, - Variant5099, - Variant5100, - Variant5101, - Variant5102, - Variant5103, - Variant5104, - Variant5105, - Variant5106, - Variant5107, - Variant5108, - Variant5109, - Variant5110, - Variant5111, - Variant5112, - Variant5113, - Variant5114, - Variant5115, - Variant5116, - Variant5117, - Variant5118, - Variant5119, - Variant5120, - Variant5121, - Variant5122, - Variant5123, - Variant5124, - Variant5125, - Variant5126, - Variant5127, - Variant5128, - Variant5129, - Variant5130, - Variant5131, - Variant5132, - Variant5133, - Variant5134, - Variant5135, - Variant5136, - Variant5137, - Variant5138, - Variant5139, - Variant5140, - Variant5141, - Variant5142, - Variant5143, - Variant5144, - Variant5145, - Variant5146, - Variant5147, - Variant5148, - Variant5149, - Variant5150, - Variant5151, - Variant5152, - Variant5153, - Variant5154, - Variant5155, - Variant5156, - Variant5157, - Variant5158, - Variant5159, - Variant5160, - Variant5161, - Variant5162, - Variant5163, - Variant5164, - Variant5165, - Variant5166, - Variant5167, - Variant5168, - Variant5169, - Variant5170, - Variant5171, - Variant5172, - Variant5173, - Variant5174, - Variant5175, - Variant5176, - Variant5177, - Variant5178, - Variant5179, - Variant5180, - Variant5181, - Variant5182, - Variant5183, - Variant5184, - Variant5185, - Variant5186, - Variant5187, - Variant5188, - Variant5189, - Variant5190, - Variant5191, - Variant5192, - Variant5193, - Variant5194, - Variant5195, - Variant5196, - Variant5197, - Variant5198, - Variant5199, - Variant5200, - Variant5201, - Variant5202, - Variant5203, - Variant5204, - Variant5205, - Variant5206, - Variant5207, - Variant5208, - Variant5209, - Variant5210, - Variant5211, - Variant5212, - Variant5213, - Variant5214, - Variant5215, - Variant5216, - Variant5217, - Variant5218, - Variant5219, - Variant5220, - Variant5221, - Variant5222, - Variant5223, - Variant5224, - Variant5225, - Variant5226, - Variant5227, - Variant5228, - Variant5229, - Variant5230, - Variant5231, - Variant5232, - Variant5233, - Variant5234, - Variant5235, - Variant5236, - Variant5237, - Variant5238, - Variant5239, - Variant5240, - Variant5241, - Variant5242, - Variant5243, - Variant5244, - Variant5245, - Variant5246, - Variant5247, - Variant5248, - Variant5249, - Variant5250, - Variant5251, - Variant5252, - Variant5253, - Variant5254, - Variant5255, - Variant5256, - Variant5257, - Variant5258, - Variant5259, - Variant5260, - Variant5261, - Variant5262, - Variant5263, - Variant5264, - Variant5265, - Variant5266, - Variant5267, - Variant5268, - Variant5269, - Variant5270, - Variant5271, - Variant5272, - Variant5273, - Variant5274, - Variant5275, - Variant5276, - Variant5277, - Variant5278, - Variant5279, - Variant5280, - Variant5281, - Variant5282, - Variant5283, - Variant5284, - Variant5285, - Variant5286, - Variant5287, - Variant5288, - Variant5289, - Variant5290, - Variant5291, - Variant5292, - Variant5293, - Variant5294, - Variant5295, - Variant5296, - Variant5297, - Variant5298, - Variant5299, - Variant5300, - Variant5301, - Variant5302, - Variant5303, - Variant5304, - Variant5305, - Variant5306, - Variant5307, - Variant5308, - Variant5309, - Variant5310, - Variant5311, - Variant5312, - Variant5313, - Variant5314, - Variant5315, - Variant5316, - Variant5317, - Variant5318, - Variant5319, - Variant5320, - Variant5321, - Variant5322, - Variant5323, - Variant5324, - Variant5325, - Variant5326, - Variant5327, - Variant5328, - Variant5329, - Variant5330, - Variant5331, - Variant5332, - Variant5333, - Variant5334, - Variant5335, - Variant5336, - Variant5337, - Variant5338, - Variant5339, - Variant5340, - Variant5341, - Variant5342, - Variant5343, - Variant5344, - Variant5345, - Variant5346, - Variant5347, - Variant5348, - Variant5349, - Variant5350, - Variant5351, - Variant5352, - Variant5353, - Variant5354, - Variant5355, - Variant5356, - Variant5357, - Variant5358, - Variant5359, - Variant5360, - Variant5361, - Variant5362, - Variant5363, - Variant5364, - Variant5365, - Variant5366, - Variant5367, - Variant5368, - Variant5369, - Variant5370, - Variant5371, - Variant5372, - Variant5373, - Variant5374, - Variant5375, - Variant5376, - Variant5377, - Variant5378, - Variant5379, - Variant5380, - Variant5381, - Variant5382, - Variant5383, - Variant5384, - Variant5385, - Variant5386, - Variant5387, - Variant5388, - Variant5389, - Variant5390, - Variant5391, - Variant5392, - Variant5393, - Variant5394, - Variant5395, - Variant5396, - Variant5397, - Variant5398, - Variant5399, - Variant5400, - Variant5401, - Variant5402, - Variant5403, - Variant5404, - Variant5405, - Variant5406, - Variant5407, - Variant5408, - Variant5409, - Variant5410, - Variant5411, - Variant5412, - Variant5413, - Variant5414, - Variant5415, - Variant5416, - Variant5417, - Variant5418, - Variant5419, - Variant5420, - Variant5421, - Variant5422, - Variant5423, - Variant5424, - Variant5425, - Variant5426, - Variant5427, - Variant5428, - Variant5429, - Variant5430, - Variant5431, - Variant5432, - Variant5433, - Variant5434, - Variant5435, - Variant5436, - Variant5437, - Variant5438, - Variant5439, - Variant5440, - Variant5441, - Variant5442, - Variant5443, - Variant5444, - Variant5445, - Variant5446, - Variant5447, - Variant5448, - Variant5449, - Variant5450, - Variant5451, - Variant5452, - Variant5453, - Variant5454, - Variant5455, - Variant5456, - Variant5457, - Variant5458, - Variant5459, - Variant5460, - Variant5461, - Variant5462, - Variant5463, - Variant5464, - Variant5465, - Variant5466, - Variant5467, - Variant5468, - Variant5469, - Variant5470, - Variant5471, - Variant5472, - Variant5473, - Variant5474, - Variant5475, - Variant5476, - Variant5477, - Variant5478, - Variant5479, - Variant5480, - Variant5481, - Variant5482, - Variant5483, - Variant5484, - Variant5485, - Variant5486, - Variant5487, - Variant5488, - Variant5489, - Variant5490, - Variant5491, - Variant5492, - Variant5493, - Variant5494, - Variant5495, - Variant5496, - Variant5497, - Variant5498, - Variant5499, - Variant5500, - Variant5501, - Variant5502, - Variant5503, - Variant5504, - Variant5505, - Variant5506, - Variant5507, - Variant5508, - Variant5509, - Variant5510, - Variant5511, - Variant5512, - Variant5513, - Variant5514, - Variant5515, - Variant5516, - Variant5517, - Variant5518, - Variant5519, - Variant5520, - Variant5521, - Variant5522, - Variant5523, - Variant5524, - Variant5525, - Variant5526, - Variant5527, - Variant5528, - Variant5529, - Variant5530, - Variant5531, - Variant5532, - Variant5533, - Variant5534, - Variant5535, - Variant5536, - Variant5537, - Variant5538, - Variant5539, - Variant5540, - Variant5541, - Variant5542, - Variant5543, - Variant5544, - Variant5545, - Variant5546, - Variant5547, - Variant5548, - Variant5549, - Variant5550, - Variant5551, - Variant5552, - Variant5553, - Variant5554, - Variant5555, - Variant5556, - Variant5557, - Variant5558, - Variant5559, - Variant5560, - Variant5561, - Variant5562, - Variant5563, - Variant5564, - Variant5565, - Variant5566, - Variant5567, - Variant5568, - Variant5569, - Variant5570, - Variant5571, - Variant5572, - Variant5573, - Variant5574, - Variant5575, - Variant5576, - Variant5577, - Variant5578, - Variant5579, - Variant5580, - Variant5581, - Variant5582, - Variant5583, - Variant5584, - Variant5585, - Variant5586, - Variant5587, - Variant5588, - Variant5589, - Variant5590, - Variant5591, - Variant5592, - Variant5593, - Variant5594, - Variant5595, - Variant5596, - Variant5597, - Variant5598, - Variant5599, - Variant5600, - Variant5601, - Variant5602, - Variant5603, - Variant5604, - Variant5605, - Variant5606, - Variant5607, - Variant5608, - Variant5609, - Variant5610, - Variant5611, - Variant5612, - Variant5613, - Variant5614, - Variant5615, - Variant5616, - Variant5617, - Variant5618, - Variant5619, - Variant5620, - Variant5621, - Variant5622, - Variant5623, - Variant5624, - Variant5625, - Variant5626, - Variant5627, - Variant5628, - Variant5629, - Variant5630, - Variant5631, - Variant5632, - Variant5633, - Variant5634, - Variant5635, - Variant5636, - Variant5637, - Variant5638, - Variant5639, - Variant5640, - Variant5641, - Variant5642, - Variant5643, - Variant5644, - Variant5645, - Variant5646, - Variant5647, - Variant5648, - Variant5649, - Variant5650, - Variant5651, - Variant5652, - Variant5653, - Variant5654, - Variant5655, - Variant5656, - Variant5657, - Variant5658, - Variant5659, - Variant5660, - Variant5661, - Variant5662, - Variant5663, - Variant5664, - Variant5665, - Variant5666, - Variant5667, - Variant5668, - Variant5669, - Variant5670, - Variant5671, - Variant5672, - Variant5673, - Variant5674, - Variant5675, - Variant5676, - Variant5677, - Variant5678, - Variant5679, - Variant5680, - Variant5681, - Variant5682, - Variant5683, - Variant5684, - Variant5685, - Variant5686, - Variant5687, - Variant5688, - Variant5689, - Variant5690, - Variant5691, - Variant5692, - Variant5693, - Variant5694, - Variant5695, - Variant5696, - Variant5697, - Variant5698, - Variant5699, - Variant5700, - Variant5701, - Variant5702, - Variant5703, - Variant5704, - Variant5705, - Variant5706, - Variant5707, - Variant5708, - Variant5709, - Variant5710, - Variant5711, - Variant5712, - Variant5713, - Variant5714, - Variant5715, - Variant5716, - Variant5717, - Variant5718, - Variant5719, - Variant5720, - Variant5721, - Variant5722, - Variant5723, - Variant5724, - Variant5725, - Variant5726, - Variant5727, - Variant5728, - Variant5729, - Variant5730, - Variant5731, - Variant5732, - Variant5733, - Variant5734, - Variant5735, - Variant5736, - Variant5737, - Variant5738, - Variant5739, - Variant5740, - Variant5741, - Variant5742, - Variant5743, - Variant5744, - Variant5745, - Variant5746, - Variant5747, - Variant5748, - Variant5749, - Variant5750, - Variant5751, - Variant5752, - Variant5753, - Variant5754, - Variant5755, - Variant5756, - Variant5757, - Variant5758, - Variant5759, - Variant5760, - Variant5761, - Variant5762, - Variant5763, - Variant5764, - Variant5765, - Variant5766, - Variant5767, - Variant5768, - Variant5769, - Variant5770, - Variant5771, - Variant5772, - Variant5773, - Variant5774, - Variant5775, - Variant5776, - Variant5777, - Variant5778, - Variant5779, - Variant5780, - Variant5781, - Variant5782, - Variant5783, - Variant5784, - Variant5785, - Variant5786, - Variant5787, - Variant5788, - Variant5789, - Variant5790, - Variant5791, - Variant5792, - Variant5793, - Variant5794, - Variant5795, - Variant5796, - Variant5797, - Variant5798, - Variant5799, - Variant5800, - Variant5801, - Variant5802, - Variant5803, - Variant5804, - Variant5805, - Variant5806, - Variant5807, - Variant5808, - Variant5809, - Variant5810, - Variant5811, - Variant5812, - Variant5813, - Variant5814, - Variant5815, - Variant5816, - Variant5817, - Variant5818, - Variant5819, - Variant5820, - Variant5821, - Variant5822, - Variant5823, - Variant5824, - Variant5825, - Variant5826, - Variant5827, - Variant5828, - Variant5829, - Variant5830, - Variant5831, - Variant5832, - Variant5833, - Variant5834, - Variant5835, - Variant5836, - Variant5837, - Variant5838, - Variant5839, - Variant5840, - Variant5841, - Variant5842, - Variant5843, - Variant5844, - Variant5845, - Variant5846, - Variant5847, - Variant5848, - Variant5849, - Variant5850, - Variant5851, - Variant5852, - Variant5853, - Variant5854, - Variant5855, - Variant5856, - Variant5857, - Variant5858, - Variant5859, - Variant5860, - Variant5861, - Variant5862, - Variant5863, - Variant5864, - Variant5865, - Variant5866, - Variant5867, - Variant5868, - Variant5869, - Variant5870, - Variant5871, - Variant5872, - Variant5873, - Variant5874, - Variant5875, - Variant5876, - Variant5877, - Variant5878, - Variant5879, - Variant5880, - Variant5881, - Variant5882, - Variant5883, - Variant5884, - Variant5885, - Variant5886, - Variant5887, - Variant5888, - Variant5889, - Variant5890, - Variant5891, - Variant5892, - Variant5893, - Variant5894, - Variant5895, - Variant5896, - Variant5897, - Variant5898, - Variant5899, - Variant5900, - Variant5901, - Variant5902, - Variant5903, - Variant5904, - Variant5905, - Variant5906, - Variant5907, - Variant5908, - Variant5909, - Variant5910, - Variant5911, - Variant5912, - Variant5913, - Variant5914, - Variant5915, - Variant5916, - Variant5917, - Variant5918, - Variant5919, - Variant5920, - Variant5921, - Variant5922, - Variant5923, - Variant5924, - Variant5925, - Variant5926, - Variant5927, - Variant5928, - Variant5929, - Variant5930, - Variant5931, - Variant5932, - Variant5933, - Variant5934, - Variant5935, - Variant5936, - Variant5937, - Variant5938, - Variant5939, - Variant5940, - Variant5941, - Variant5942, - Variant5943, - Variant5944, - Variant5945, - Variant5946, - Variant5947, - Variant5948, - Variant5949, - Variant5950, - Variant5951, - Variant5952, - Variant5953, - Variant5954, - Variant5955, - Variant5956, - Variant5957, - Variant5958, - Variant5959, - Variant5960, - Variant5961, - Variant5962, - Variant5963, - Variant5964, - Variant5965, - Variant5966, - Variant5967, - Variant5968, - Variant5969, - Variant5970, - Variant5971, - Variant5972, - Variant5973, - Variant5974, - Variant5975, - Variant5976, - Variant5977, - Variant5978, - Variant5979, - Variant5980, - Variant5981, - Variant5982, - Variant5983, - Variant5984, - Variant5985, - Variant5986, - Variant5987, - Variant5988, - Variant5989, - Variant5990, - Variant5991, - Variant5992, - Variant5993, - Variant5994, - Variant5995, - Variant5996, - Variant5997, - Variant5998, - Variant5999, - Variant6000, - Variant6001, - Variant6002, - Variant6003, - Variant6004, - Variant6005, - Variant6006, - Variant6007, - Variant6008, - Variant6009, - Variant6010, - Variant6011, - Variant6012, - Variant6013, - Variant6014, - Variant6015, - Variant6016, - Variant6017, - Variant6018, - Variant6019, - Variant6020, - Variant6021, - Variant6022, - Variant6023, - Variant6024, - Variant6025, - Variant6026, - Variant6027, - Variant6028, - Variant6029, - Variant6030, - Variant6031, - Variant6032, - Variant6033, - Variant6034, - Variant6035, - Variant6036, - Variant6037, - Variant6038, - Variant6039, - Variant6040, - Variant6041, - Variant6042, - Variant6043, - Variant6044, - Variant6045, - Variant6046, - Variant6047, - Variant6048, - Variant6049, - Variant6050, - Variant6051, - Variant6052, - Variant6053, - Variant6054, - Variant6055, - Variant6056, - Variant6057, - Variant6058, - Variant6059, - Variant6060, - Variant6061, - Variant6062, - Variant6063, - Variant6064, - Variant6065, - Variant6066, - Variant6067, - Variant6068, - Variant6069, - Variant6070, - Variant6071, - Variant6072, - Variant6073, - Variant6074, - Variant6075, - Variant6076, - Variant6077, - Variant6078, - Variant6079, - Variant6080, - Variant6081, - Variant6082, - Variant6083, - Variant6084, - Variant6085, - Variant6086, - Variant6087, - Variant6088, - Variant6089, - Variant6090, - Variant6091, - Variant6092, - Variant6093, - Variant6094, - Variant6095, - Variant6096, - Variant6097, - Variant6098, - Variant6099, - Variant6100, - Variant6101, - Variant6102, - Variant6103, - Variant6104, - Variant6105, - Variant6106, - Variant6107, - Variant6108, - Variant6109, - Variant6110, - Variant6111, - Variant6112, - Variant6113, - Variant6114, - Variant6115, - Variant6116, - Variant6117, - Variant6118, - Variant6119, - Variant6120, - Variant6121, - Variant6122, - Variant6123, - Variant6124, - Variant6125, - Variant6126, - Variant6127, - Variant6128, - Variant6129, - Variant6130, - Variant6131, - Variant6132, - Variant6133, - Variant6134, - Variant6135, - Variant6136, - Variant6137, - Variant6138, - Variant6139, - Variant6140, - Variant6141, - Variant6142, - Variant6143, - Variant6144, - Variant6145, - Variant6146, - Variant6147, - Variant6148, - Variant6149, - Variant6150, - Variant6151, - Variant6152, - Variant6153, - Variant6154, - Variant6155, - Variant6156, - Variant6157, - Variant6158, - Variant6159, - Variant6160, - Variant6161, - Variant6162, - Variant6163, - Variant6164, - Variant6165, - Variant6166, - Variant6167, - Variant6168, - Variant6169, - Variant6170, - Variant6171, - Variant6172, - Variant6173, - Variant6174, - Variant6175, - Variant6176, - Variant6177, - Variant6178, - Variant6179, - Variant6180, - Variant6181, - Variant6182, - Variant6183, - Variant6184, - Variant6185, - Variant6186, - Variant6187, - Variant6188, - Variant6189, - Variant6190, - Variant6191, - Variant6192, - Variant6193, - Variant6194, - Variant6195, - Variant6196, - Variant6197, - Variant6198, - Variant6199, - Variant6200, - Variant6201, - Variant6202, - Variant6203, - Variant6204, - Variant6205, - Variant6206, - Variant6207, - Variant6208, - Variant6209, - Variant6210, - Variant6211, - Variant6212, - Variant6213, - Variant6214, - Variant6215, - Variant6216, - Variant6217, - Variant6218, - Variant6219, - Variant6220, - Variant6221, - Variant6222, - Variant6223, - Variant6224, - Variant6225, - Variant6226, - Variant6227, - Variant6228, - Variant6229, - Variant6230, - Variant6231, - Variant6232, - Variant6233, - Variant6234, - Variant6235, - Variant6236, - Variant6237, - Variant6238, - Variant6239, - Variant6240, - Variant6241, - Variant6242, - Variant6243, - Variant6244, - Variant6245, - Variant6246, - Variant6247, - Variant6248, - Variant6249, - Variant6250, - Variant6251, - Variant6252, - Variant6253, - Variant6254, - Variant6255, - Variant6256, - Variant6257, - Variant6258, - Variant6259, - Variant6260, - Variant6261, - Variant6262, - Variant6263, - Variant6264, - Variant6265, - Variant6266, - Variant6267, - Variant6268, - Variant6269, - Variant6270, - Variant6271, - Variant6272, - Variant6273, - Variant6274, - Variant6275, - Variant6276, - Variant6277, - Variant6278, - Variant6279, - Variant6280, - Variant6281, - Variant6282, - Variant6283, - Variant6284, - Variant6285, - Variant6286, - Variant6287, - Variant6288, - Variant6289, - Variant6290, - Variant6291, - Variant6292, - Variant6293, - Variant6294, - Variant6295, - Variant6296, - Variant6297, - Variant6298, - Variant6299, - Variant6300, - Variant6301, - Variant6302, - Variant6303, - Variant6304, - Variant6305, - Variant6306, - Variant6307, - Variant6308, - Variant6309, - Variant6310, - Variant6311, - Variant6312, - Variant6313, - Variant6314, - Variant6315, - Variant6316, - Variant6317, - Variant6318, - Variant6319, - Variant6320, - Variant6321, - Variant6322, - Variant6323, - Variant6324, - Variant6325, - Variant6326, - Variant6327, - Variant6328, - Variant6329, - Variant6330, - Variant6331, - Variant6332, - Variant6333, - Variant6334, - Variant6335, - Variant6336, - Variant6337, - Variant6338, - Variant6339, - Variant6340, - Variant6341, - Variant6342, - Variant6343, - Variant6344, - Variant6345, - Variant6346, - Variant6347, - Variant6348, - Variant6349, - Variant6350, - Variant6351, - Variant6352, - Variant6353, - Variant6354, - Variant6355, - Variant6356, - Variant6357, - Variant6358, - Variant6359, - Variant6360, - Variant6361, - Variant6362, - Variant6363, - Variant6364, - Variant6365, - Variant6366, - Variant6367, - Variant6368, - Variant6369, - Variant6370, - Variant6371, - Variant6372, - Variant6373, - Variant6374, - Variant6375, - Variant6376, - Variant6377, - Variant6378, - Variant6379, - Variant6380, - Variant6381, - Variant6382, - Variant6383, - Variant6384, - Variant6385, - Variant6386, - Variant6387, - Variant6388, - Variant6389, - Variant6390, - Variant6391, - Variant6392, - Variant6393, - Variant6394, - Variant6395, - Variant6396, - Variant6397, - Variant6398, - Variant6399, - Variant6400, - Variant6401, - Variant6402, - Variant6403, - Variant6404, - Variant6405, - Variant6406, - Variant6407, - Variant6408, - Variant6409, - Variant6410, - Variant6411, - Variant6412, - Variant6413, - Variant6414, - Variant6415, - Variant6416, - Variant6417, - Variant6418, - Variant6419, - Variant6420, - Variant6421, - Variant6422, - Variant6423, - Variant6424, - Variant6425, - Variant6426, - Variant6427, - Variant6428, - Variant6429, - Variant6430, - Variant6431, - Variant6432, - Variant6433, - Variant6434, - Variant6435, - Variant6436, - Variant6437, - Variant6438, - Variant6439, - Variant6440, - Variant6441, - Variant6442, - Variant6443, - Variant6444, - Variant6445, - Variant6446, - Variant6447, - Variant6448, - Variant6449, - Variant6450, - Variant6451, - Variant6452, - Variant6453, - Variant6454, - Variant6455, - Variant6456, - Variant6457, - Variant6458, - Variant6459, - Variant6460, - Variant6461, - Variant6462, - Variant6463, - Variant6464, - Variant6465, - Variant6466, - Variant6467, - Variant6468, - Variant6469, - Variant6470, - Variant6471, - Variant6472, - Variant6473, - Variant6474, - Variant6475, - Variant6476, - Variant6477, - Variant6478, - Variant6479, - Variant6480, - Variant6481, - Variant6482, - Variant6483, - Variant6484, - Variant6485, - Variant6486, - Variant6487, - Variant6488, - Variant6489, - Variant6490, - Variant6491, - Variant6492, - Variant6493, - Variant6494, - Variant6495, - Variant6496, - Variant6497, - Variant6498, - Variant6499, - Variant6500, - Variant6501, - Variant6502, - Variant6503, - Variant6504, - Variant6505, - Variant6506, - Variant6507, - Variant6508, - Variant6509, - Variant6510, - Variant6511, - Variant6512, - Variant6513, - Variant6514, - Variant6515, - Variant6516, - Variant6517, - Variant6518, - Variant6519, - Variant6520, - Variant6521, - Variant6522, - Variant6523, - Variant6524, - Variant6525, - Variant6526, - Variant6527, - Variant6528, - Variant6529, - Variant6530, - Variant6531, - Variant6532, - Variant6533, - Variant6534, - Variant6535, - Variant6536, - Variant6537, - Variant6538, - Variant6539, - Variant6540, - Variant6541, - Variant6542, - Variant6543, - Variant6544, - Variant6545, - Variant6546, - Variant6547, - Variant6548, - Variant6549, - Variant6550, - Variant6551, - Variant6552, - Variant6553, - Variant6554, - Variant6555, - Variant6556, - Variant6557, - Variant6558, - Variant6559, - Variant6560, - Variant6561, - Variant6562, - Variant6563, - Variant6564, - Variant6565, - Variant6566, - Variant6567, - Variant6568, - Variant6569, - Variant6570, - Variant6571, - Variant6572, - Variant6573, - Variant6574, - Variant6575, - Variant6576, - Variant6577, - Variant6578, - Variant6579, - Variant6580, - Variant6581, - Variant6582, - Variant6583, - Variant6584, - Variant6585, - Variant6586, - Variant6587, - Variant6588, - Variant6589, - Variant6590, - Variant6591, - Variant6592, - Variant6593, - Variant6594, - Variant6595, - Variant6596, - Variant6597, - Variant6598, - Variant6599, - Variant6600, - Variant6601, - Variant6602, - Variant6603, - Variant6604, - Variant6605, - Variant6606, - Variant6607, - Variant6608, - Variant6609, - Variant6610, - Variant6611, - Variant6612, - Variant6613, - Variant6614, - Variant6615, - Variant6616, - Variant6617, - Variant6618, - Variant6619, - Variant6620, - Variant6621, - Variant6622, - Variant6623, - Variant6624, - Variant6625, - Variant6626, - Variant6627, - Variant6628, - Variant6629, - Variant6630, - Variant6631, - Variant6632, - Variant6633, - Variant6634, - Variant6635, - Variant6636, - Variant6637, - Variant6638, - Variant6639, - Variant6640, - Variant6641, - Variant6642, - Variant6643, - Variant6644, - Variant6645, - Variant6646, - Variant6647, - Variant6648, - Variant6649, - Variant6650, - Variant6651, - Variant6652, - Variant6653, - Variant6654, - Variant6655, - Variant6656, - Variant6657, - Variant6658, - Variant6659, - Variant6660, - Variant6661, - Variant6662, - Variant6663, - Variant6664, - Variant6665, - Variant6666, - Variant6667, - Variant6668, - Variant6669, - Variant6670, - Variant6671, - Variant6672, - Variant6673, - Variant6674, - Variant6675, - Variant6676, - Variant6677, - Variant6678, - Variant6679, - Variant6680, - Variant6681, - Variant6682, - Variant6683, - Variant6684, - Variant6685, - Variant6686, - Variant6687, - Variant6688, - Variant6689, - Variant6690, - Variant6691, - Variant6692, - Variant6693, - Variant6694, - Variant6695, - Variant6696, - Variant6697, - Variant6698, - Variant6699, - Variant6700, - Variant6701, - Variant6702, - Variant6703, - Variant6704, - Variant6705, - Variant6706, - Variant6707, - Variant6708, - Variant6709, - Variant6710, - Variant6711, - Variant6712, - Variant6713, - Variant6714, - Variant6715, - Variant6716, - Variant6717, - Variant6718, - Variant6719, - Variant6720, - Variant6721, - Variant6722, - Variant6723, - Variant6724, - Variant6725, - Variant6726, - Variant6727, - Variant6728, - Variant6729, - Variant6730, - Variant6731, - Variant6732, - Variant6733, - Variant6734, - Variant6735, - Variant6736, - Variant6737, - Variant6738, - Variant6739, - Variant6740, - Variant6741, - Variant6742, - Variant6743, - Variant6744, - Variant6745, - Variant6746, - Variant6747, - Variant6748, - Variant6749, - Variant6750, - Variant6751, - Variant6752, - Variant6753, - Variant6754, - Variant6755, - Variant6756, - Variant6757, - Variant6758, - Variant6759, - Variant6760, - Variant6761, - Variant6762, - Variant6763, - Variant6764, - Variant6765, - Variant6766, - Variant6767, - Variant6768, - Variant6769, - Variant6770, - Variant6771, - Variant6772, - Variant6773, - Variant6774, - Variant6775, - Variant6776, - Variant6777, - Variant6778, - Variant6779, - Variant6780, - Variant6781, - Variant6782, - Variant6783, - Variant6784, - Variant6785, - Variant6786, - Variant6787, - Variant6788, - Variant6789, - Variant6790, - Variant6791, - Variant6792, - Variant6793, - Variant6794, - Variant6795, - Variant6796, - Variant6797, - Variant6798, - Variant6799, - Variant6800, - Variant6801, - Variant6802, - Variant6803, - Variant6804, - Variant6805, - Variant6806, - Variant6807, - Variant6808, - Variant6809, - Variant6810, - Variant6811, - Variant6812, - Variant6813, - Variant6814, - Variant6815, - Variant6816, - Variant6817, - Variant6818, - Variant6819, - Variant6820, - Variant6821, - Variant6822, - Variant6823, - Variant6824, - Variant6825, - Variant6826, - Variant6827, - Variant6828, - Variant6829, - Variant6830, - Variant6831, - Variant6832, - Variant6833, - Variant6834, - Variant6835, - Variant6836, - Variant6837, - Variant6838, - Variant6839, - Variant6840, - Variant6841, - Variant6842, - Variant6843, - Variant6844, - Variant6845, - Variant6846, - Variant6847, - Variant6848, - Variant6849, - Variant6850, - Variant6851, - Variant6852, - Variant6853, - Variant6854, - Variant6855, - Variant6856, - Variant6857, - Variant6858, - Variant6859, - Variant6860, - Variant6861, - Variant6862, - Variant6863, - Variant6864, - Variant6865, - Variant6866, - Variant6867, - Variant6868, - Variant6869, - Variant6870, - Variant6871, - Variant6872, - Variant6873, - Variant6874, - Variant6875, - Variant6876, - Variant6877, - Variant6878, - Variant6879, - Variant6880, - Variant6881, - Variant6882, - Variant6883, - Variant6884, - Variant6885, - Variant6886, - Variant6887, - Variant6888, - Variant6889, - Variant6890, - Variant6891, - Variant6892, - Variant6893, - Variant6894, - Variant6895, - Variant6896, - Variant6897, - Variant6898, - Variant6899, - Variant6900, - Variant6901, - Variant6902, - Variant6903, - Variant6904, - Variant6905, - Variant6906, - Variant6907, - Variant6908, - Variant6909, - Variant6910, - Variant6911, - Variant6912, - Variant6913, - Variant6914, - Variant6915, - Variant6916, - Variant6917, - Variant6918, - Variant6919, - Variant6920, - Variant6921, - Variant6922, - Variant6923, - Variant6924, - Variant6925, - Variant6926, - Variant6927, - Variant6928, - Variant6929, - Variant6930, - Variant6931, - Variant6932, - Variant6933, - Variant6934, - Variant6935, - Variant6936, - Variant6937, - Variant6938, - Variant6939, - Variant6940, - Variant6941, - Variant6942, - Variant6943, - Variant6944, - Variant6945, - Variant6946, - Variant6947, - Variant6948, - Variant6949, - Variant6950, - Variant6951, - Variant6952, - Variant6953, - Variant6954, - Variant6955, - Variant6956, - Variant6957, - Variant6958, - Variant6959, - Variant6960, - Variant6961, - Variant6962, - Variant6963, - Variant6964, - Variant6965, - Variant6966, - Variant6967, - Variant6968, - Variant6969, - Variant6970, - Variant6971, - Variant6972, - Variant6973, - Variant6974, - Variant6975, - Variant6976, - Variant6977, - Variant6978, - Variant6979, - Variant6980, - Variant6981, - Variant6982, - Variant6983, - Variant6984, - Variant6985, - Variant6986, - Variant6987, - Variant6988, - Variant6989, - Variant6990, - Variant6991, - Variant6992, - Variant6993, - Variant6994, - Variant6995, - Variant6996, - Variant6997, - Variant6998, - Variant6999, - Variant7000, - Variant7001, - Variant7002, - Variant7003, - Variant7004, - Variant7005, - Variant7006, - Variant7007, - Variant7008, - Variant7009, - Variant7010, - Variant7011, - Variant7012, - Variant7013, - Variant7014, - Variant7015, - Variant7016, - Variant7017, - Variant7018, - Variant7019, - Variant7020, - Variant7021, - Variant7022, - Variant7023, - Variant7024, - Variant7025, - Variant7026, - Variant7027, - Variant7028, - Variant7029, - Variant7030, - Variant7031, - Variant7032, - Variant7033, - Variant7034, - Variant7035, - Variant7036, - Variant7037, - Variant7038, - Variant7039, - Variant7040, - Variant7041, - Variant7042, - Variant7043, - Variant7044, - Variant7045, - Variant7046, - Variant7047, - Variant7048, - Variant7049, - Variant7050, - Variant7051, - Variant7052, - Variant7053, - Variant7054, - Variant7055, - Variant7056, - Variant7057, - Variant7058, - Variant7059, - Variant7060, - Variant7061, - Variant7062, - Variant7063, - Variant7064, - Variant7065, - Variant7066, - Variant7067, - Variant7068, - Variant7069, - Variant7070, - Variant7071, - Variant7072, - Variant7073, - Variant7074, - Variant7075, - Variant7076, - Variant7077, - Variant7078, - Variant7079, - Variant7080, - Variant7081, - Variant7082, - Variant7083, - Variant7084, - Variant7085, - Variant7086, - Variant7087, - Variant7088, - Variant7089, - Variant7090, - Variant7091, - Variant7092, - Variant7093, - Variant7094, - Variant7095, - Variant7096, - Variant7097, - Variant7098, - Variant7099, - Variant7100, - Variant7101, - Variant7102, - Variant7103, - Variant7104, - Variant7105, - Variant7106, - Variant7107, - Variant7108, - Variant7109, - Variant7110, - Variant7111, - Variant7112, - Variant7113, - Variant7114, - Variant7115, - Variant7116, - Variant7117, - Variant7118, - Variant7119, - Variant7120, - Variant7121, - Variant7122, - Variant7123, - Variant7124, - Variant7125, - Variant7126, - Variant7127, - Variant7128, - Variant7129, - Variant7130, - Variant7131, - Variant7132, - Variant7133, - Variant7134, - Variant7135, - Variant7136, - Variant7137, - Variant7138, - Variant7139, - Variant7140, - Variant7141, - Variant7142, - Variant7143, - Variant7144, - Variant7145, - Variant7146, - Variant7147, - Variant7148, - Variant7149, - Variant7150, - Variant7151, - Variant7152, - Variant7153, - Variant7154, - Variant7155, - Variant7156, - Variant7157, - Variant7158, - Variant7159, - Variant7160, - Variant7161, - Variant7162, - Variant7163, - Variant7164, - Variant7165, - Variant7166, - Variant7167, - Variant7168, - Variant7169, - Variant7170, - Variant7171, - Variant7172, - Variant7173, - Variant7174, - Variant7175, - Variant7176, - Variant7177, - Variant7178, - Variant7179, - Variant7180, - Variant7181, - Variant7182, - Variant7183, - Variant7184, - Variant7185, - Variant7186, - Variant7187, - Variant7188, - Variant7189, - Variant7190, - Variant7191, - Variant7192, - Variant7193, - Variant7194, - Variant7195, - Variant7196, - Variant7197, - Variant7198, - Variant7199, - Variant7200, - Variant7201, - Variant7202, - Variant7203, - Variant7204, - Variant7205, - Variant7206, - Variant7207, - Variant7208, - Variant7209, - Variant7210, - Variant7211, - Variant7212, - Variant7213, - Variant7214, - Variant7215, - Variant7216, - Variant7217, - Variant7218, - Variant7219, - Variant7220, - Variant7221, - Variant7222, - Variant7223, - Variant7224, - Variant7225, - Variant7226, - Variant7227, - Variant7228, - Variant7229, - Variant7230, - Variant7231, - Variant7232, - Variant7233, - Variant7234, - Variant7235, - Variant7236, - Variant7237, - Variant7238, - Variant7239, - Variant7240, - Variant7241, - Variant7242, - Variant7243, - Variant7244, - Variant7245, - Variant7246, - Variant7247, - Variant7248, - Variant7249, - Variant7250, - Variant7251, - Variant7252, - Variant7253, - Variant7254, - Variant7255, - Variant7256, - Variant7257, - Variant7258, - Variant7259, - Variant7260, - Variant7261, - Variant7262, - Variant7263, - Variant7264, - Variant7265, - Variant7266, - Variant7267, - Variant7268, - Variant7269, - Variant7270, - Variant7271, - Variant7272, - Variant7273, - Variant7274, - Variant7275, - Variant7276, - Variant7277, - Variant7278, - Variant7279, - Variant7280, - Variant7281, - Variant7282, - Variant7283, - Variant7284, - Variant7285, - Variant7286, - Variant7287, - Variant7288, - Variant7289, - Variant7290, - Variant7291, - Variant7292, - Variant7293, - Variant7294, - Variant7295, - Variant7296, - Variant7297, - Variant7298, - Variant7299, - Variant7300, - Variant7301, - Variant7302, - Variant7303, - Variant7304, - Variant7305, - Variant7306, - Variant7307, - Variant7308, - Variant7309, - Variant7310, - Variant7311, - Variant7312, - Variant7313, - Variant7314, - Variant7315, - Variant7316, - Variant7317, - Variant7318, - Variant7319, - Variant7320, - Variant7321, - Variant7322, - Variant7323, - Variant7324, - Variant7325, - Variant7326, - Variant7327, - Variant7328, - Variant7329, - Variant7330, - Variant7331, - Variant7332, - Variant7333, - Variant7334, - Variant7335, - Variant7336, - Variant7337, - Variant7338, - Variant7339, - Variant7340, - Variant7341, - Variant7342, - Variant7343, - Variant7344, - Variant7345, - Variant7346, - Variant7347, - Variant7348, - Variant7349, - Variant7350, - Variant7351, - Variant7352, - Variant7353, - Variant7354, - Variant7355, - Variant7356, - Variant7357, - Variant7358, - Variant7359, - Variant7360, - Variant7361, - Variant7362, - Variant7363, - Variant7364, - Variant7365, - Variant7366, - Variant7367, - Variant7368, - Variant7369, - Variant7370, - Variant7371, - Variant7372, - Variant7373, - Variant7374, - Variant7375, - Variant7376, - Variant7377, - Variant7378, - Variant7379, - Variant7380, - Variant7381, - Variant7382, - Variant7383, - Variant7384, - Variant7385, - Variant7386, - Variant7387, - Variant7388, - Variant7389, - Variant7390, - Variant7391, - Variant7392, - Variant7393, - Variant7394, - Variant7395, - Variant7396, - Variant7397, - Variant7398, - Variant7399, - Variant7400, - Variant7401, - Variant7402, - Variant7403, - Variant7404, - Variant7405, - Variant7406, - Variant7407, - Variant7408, - Variant7409, - Variant7410, - Variant7411, - Variant7412, - Variant7413, - Variant7414, - Variant7415, - Variant7416, - Variant7417, - Variant7418, - Variant7419, - Variant7420, - Variant7421, - Variant7422, - Variant7423, - Variant7424, - Variant7425, - Variant7426, - Variant7427, - Variant7428, - Variant7429, - Variant7430, - Variant7431, - Variant7432, - Variant7433, - Variant7434, - Variant7435, - Variant7436, - Variant7437, - Variant7438, - Variant7439, - Variant7440, - Variant7441, - Variant7442, - Variant7443, - Variant7444, - Variant7445, - Variant7446, - Variant7447, - Variant7448, - Variant7449, - Variant7450, - Variant7451, - Variant7452, - Variant7453, - Variant7454, - Variant7455, - Variant7456, - Variant7457, - Variant7458, - Variant7459, - Variant7460, - Variant7461, - Variant7462, - Variant7463, - Variant7464, - Variant7465, - Variant7466, - Variant7467, - Variant7468, - Variant7469, - Variant7470, - Variant7471, - Variant7472, - Variant7473, - Variant7474, - Variant7475, - Variant7476, - Variant7477, - Variant7478, - Variant7479, - Variant7480, - Variant7481, - Variant7482, - Variant7483, - Variant7484, - Variant7485, - Variant7486, - Variant7487, - Variant7488, - Variant7489, - Variant7490, - Variant7491, - Variant7492, - Variant7493, - Variant7494, - Variant7495, - Variant7496, - Variant7497, - Variant7498, - Variant7499, - Variant7500, - Variant7501, - Variant7502, - Variant7503, - Variant7504, - Variant7505, - Variant7506, - Variant7507, - Variant7508, - Variant7509, - Variant7510, - Variant7511, - Variant7512, - Variant7513, - Variant7514, - Variant7515, - Variant7516, - Variant7517, - Variant7518, - Variant7519, - Variant7520, - Variant7521, - Variant7522, - Variant7523, - Variant7524, - Variant7525, - Variant7526, - Variant7527, - Variant7528, - Variant7529, - Variant7530, - Variant7531, - Variant7532, - Variant7533, - Variant7534, - Variant7535, - Variant7536, - Variant7537, - Variant7538, - Variant7539, - Variant7540, - Variant7541, - Variant7542, - Variant7543, - Variant7544, - Variant7545, - Variant7546, - Variant7547, - Variant7548, - Variant7549, - Variant7550, - Variant7551, - Variant7552, - Variant7553, - Variant7554, - Variant7555, - Variant7556, - Variant7557, - Variant7558, - Variant7559, - Variant7560, - Variant7561, - Variant7562, - Variant7563, - Variant7564, - Variant7565, - Variant7566, - Variant7567, - Variant7568, - Variant7569, - Variant7570, - Variant7571, - Variant7572, - Variant7573, - Variant7574, - Variant7575, - Variant7576, - Variant7577, - Variant7578, - Variant7579, - Variant7580, - Variant7581, - Variant7582, - Variant7583, - Variant7584, - Variant7585, - Variant7586, - Variant7587, - Variant7588, - Variant7589, - Variant7590, - Variant7591, - Variant7592, - Variant7593, - Variant7594, - Variant7595, - Variant7596, - Variant7597, - Variant7598, - Variant7599, - Variant7600, - Variant7601, - Variant7602, - Variant7603, - Variant7604, - Variant7605, - Variant7606, - Variant7607, - Variant7608, - Variant7609, - Variant7610, - Variant7611, - Variant7612, - Variant7613, - Variant7614, - Variant7615, - Variant7616, - Variant7617, - Variant7618, - Variant7619, - Variant7620, - Variant7621, - Variant7622, - Variant7623, - Variant7624, - Variant7625, - Variant7626, - Variant7627, - Variant7628, - Variant7629, - Variant7630, - Variant7631, - Variant7632, - Variant7633, - Variant7634, - Variant7635, - Variant7636, - Variant7637, - Variant7638, - Variant7639, - Variant7640, - Variant7641, - Variant7642, - Variant7643, - Variant7644, - Variant7645, - Variant7646, - Variant7647, - Variant7648, - Variant7649, - Variant7650, - Variant7651, - Variant7652, - Variant7653, - Variant7654, - Variant7655, - Variant7656, - Variant7657, - Variant7658, - Variant7659, - Variant7660, - Variant7661, - Variant7662, - Variant7663, - Variant7664, - Variant7665, - Variant7666, - Variant7667, - Variant7668, - Variant7669, - Variant7670, - Variant7671, - Variant7672, - Variant7673, - Variant7674, - Variant7675, - Variant7676, - Variant7677, - Variant7678, - Variant7679, - Variant7680, - Variant7681, - Variant7682, - Variant7683, - Variant7684, - Variant7685, - Variant7686, - Variant7687, - Variant7688, - Variant7689, - Variant7690, - Variant7691, - Variant7692, - Variant7693, - Variant7694, - Variant7695, - Variant7696, - Variant7697, - Variant7698, - Variant7699, - Variant7700, - Variant7701, - Variant7702, - Variant7703, - Variant7704, - Variant7705, - Variant7706, - Variant7707, - Variant7708, - Variant7709, - Variant7710, - Variant7711, - Variant7712, - Variant7713, - Variant7714, - Variant7715, - Variant7716, - Variant7717, - Variant7718, - Variant7719, - Variant7720, - Variant7721, - Variant7722, - Variant7723, - Variant7724, - Variant7725, - Variant7726, - Variant7727, - Variant7728, - Variant7729, - Variant7730, - Variant7731, - Variant7732, - Variant7733, - Variant7734, - Variant7735, - Variant7736, - Variant7737, - Variant7738, - Variant7739, - Variant7740, - Variant7741, - Variant7742, - Variant7743, - Variant7744, - Variant7745, - Variant7746, - Variant7747, - Variant7748, - Variant7749, - Variant7750, - Variant7751, - Variant7752, - Variant7753, - Variant7754, - Variant7755, - Variant7756, - Variant7757, - Variant7758, - Variant7759, - Variant7760, - Variant7761, - Variant7762, - Variant7763, - Variant7764, - Variant7765, - Variant7766, - Variant7767, - Variant7768, - Variant7769, - Variant7770, - Variant7771, - Variant7772, - Variant7773, - Variant7774, - Variant7775, - Variant7776, - Variant7777, - Variant7778, - Variant7779, - Variant7780, - Variant7781, - Variant7782, - Variant7783, - Variant7784, - Variant7785, - Variant7786, - Variant7787, - Variant7788, - Variant7789, - Variant7790, - Variant7791, - Variant7792, - Variant7793, - Variant7794, - Variant7795, - Variant7796, - Variant7797, - Variant7798, - Variant7799, - Variant7800, - Variant7801, - Variant7802, - Variant7803, - Variant7804, - Variant7805, - Variant7806, - Variant7807, - Variant7808, - Variant7809, - Variant7810, - Variant7811, - Variant7812, - Variant7813, - Variant7814, - Variant7815, - Variant7816, - Variant7817, - Variant7818, - Variant7819, - Variant7820, - Variant7821, - Variant7822, - Variant7823, - Variant7824, - Variant7825, - Variant7826, - Variant7827, - Variant7828, - Variant7829, - Variant7830, - Variant7831, - Variant7832, - Variant7833, - Variant7834, - Variant7835, - Variant7836, - Variant7837, - Variant7838, - Variant7839, - Variant7840, - Variant7841, - Variant7842, - Variant7843, - Variant7844, - Variant7845, - Variant7846, - Variant7847, - Variant7848, - Variant7849, - Variant7850, - Variant7851, - Variant7852, - Variant7853, - Variant7854, - Variant7855, - Variant7856, - Variant7857, - Variant7858, - Variant7859, - Variant7860, - Variant7861, - Variant7862, - Variant7863, - Variant7864, - Variant7865, - Variant7866, - Variant7867, - Variant7868, - Variant7869, - Variant7870, - Variant7871, - Variant7872, - Variant7873, - Variant7874, - Variant7875, - Variant7876, - Variant7877, - Variant7878, - Variant7879, - Variant7880, - Variant7881, - Variant7882, - Variant7883, - Variant7884, - Variant7885, - Variant7886, - Variant7887, - Variant7888, - Variant7889, - Variant7890, - Variant7891, - Variant7892, - Variant7893, - Variant7894, - Variant7895, - Variant7896, - Variant7897, - Variant7898, - Variant7899, - Variant7900, - Variant7901, - Variant7902, - Variant7903, - Variant7904, - Variant7905, - Variant7906, - Variant7907, - Variant7908, - Variant7909, - Variant7910, - Variant7911, - Variant7912, - Variant7913, - Variant7914, - Variant7915, - Variant7916, - Variant7917, - Variant7918, - Variant7919, - Variant7920, - Variant7921, - Variant7922, - Variant7923, - Variant7924, - Variant7925, - Variant7926, - Variant7927, - Variant7928, - Variant7929, - Variant7930, - Variant7931, - Variant7932, - Variant7933, - Variant7934, - Variant7935, - Variant7936, - Variant7937, - Variant7938, - Variant7939, - Variant7940, - Variant7941, - Variant7942, - Variant7943, - Variant7944, - Variant7945, - Variant7946, - Variant7947, - Variant7948, - Variant7949, - Variant7950, - Variant7951, - Variant7952, - Variant7953, - Variant7954, - Variant7955, - Variant7956, - Variant7957, - Variant7958, - Variant7959, - Variant7960, - Variant7961, - Variant7962, - Variant7963, - Variant7964, - Variant7965, - Variant7966, - Variant7967, - Variant7968, - Variant7969, - Variant7970, - Variant7971, - Variant7972, - Variant7973, - Variant7974, - Variant7975, - Variant7976, - Variant7977, - Variant7978, - Variant7979, - Variant7980, - Variant7981, - Variant7982, - Variant7983, - Variant7984, - Variant7985, - Variant7986, - Variant7987, - Variant7988, - Variant7989, - Variant7990, - Variant7991, - Variant7992, - Variant7993, - Variant7994, - Variant7995, - Variant7996, - Variant7997, - Variant7998, - Variant7999, - Variant8000, - Variant8001, - Variant8002, - Variant8003, - Variant8004, - Variant8005, - Variant8006, - Variant8007, - Variant8008, - Variant8009, - Variant8010, - Variant8011, - Variant8012, - Variant8013, - Variant8014, - Variant8015, - Variant8016, - Variant8017, - Variant8018, - Variant8019, - Variant8020, - Variant8021, - Variant8022, - Variant8023, - Variant8024, - Variant8025, - Variant8026, - Variant8027, - Variant8028, - Variant8029, - Variant8030, - Variant8031, - Variant8032, - Variant8033, - Variant8034, - Variant8035, - Variant8036, - Variant8037, - Variant8038, - Variant8039, - Variant8040, - Variant8041, - Variant8042, - Variant8043, - Variant8044, - Variant8045, - Variant8046, - Variant8047, - Variant8048, - Variant8049, - Variant8050, - Variant8051, - Variant8052, - Variant8053, - Variant8054, - Variant8055, - Variant8056, - Variant8057, - Variant8058, - Variant8059, - Variant8060, - Variant8061, - Variant8062, - Variant8063, - Variant8064, - Variant8065, - Variant8066, - Variant8067, - Variant8068, - Variant8069, - Variant8070, - Variant8071, - Variant8072, - Variant8073, - Variant8074, - Variant8075, - Variant8076, - Variant8077, - Variant8078, - Variant8079, - Variant8080, - Variant8081, - Variant8082, - Variant8083, - Variant8084, - Variant8085, - Variant8086, - Variant8087, - Variant8088, - Variant8089, - Variant8090, - Variant8091, - Variant8092, - Variant8093, - Variant8094, - Variant8095, - Variant8096, - Variant8097, - Variant8098, - Variant8099, - Variant8100, - Variant8101, - Variant8102, - Variant8103, - Variant8104, - Variant8105, - Variant8106, - Variant8107, - Variant8108, - Variant8109, - Variant8110, - Variant8111, - Variant8112, - Variant8113, - Variant8114, - Variant8115, - Variant8116, - Variant8117, - Variant8118, - Variant8119, - Variant8120, - Variant8121, - Variant8122, - Variant8123, - Variant8124, - Variant8125, - Variant8126, - Variant8127, - Variant8128, - Variant8129, - Variant8130, - Variant8131, - Variant8132, - Variant8133, - Variant8134, - Variant8135, - Variant8136, - Variant8137, - Variant8138, - Variant8139, - Variant8140, - Variant8141, - Variant8142, - Variant8143, - Variant8144, - Variant8145, - Variant8146, - Variant8147, - Variant8148, - Variant8149, - Variant8150, - Variant8151, - Variant8152, - Variant8153, - Variant8154, - Variant8155, - Variant8156, - Variant8157, - Variant8158, - Variant8159, - Variant8160, - Variant8161, - Variant8162, - Variant8163, - Variant8164, - Variant8165, - Variant8166, - Variant8167, - Variant8168, - Variant8169, - Variant8170, - Variant8171, - Variant8172, - Variant8173, - Variant8174, - Variant8175, - Variant8176, - Variant8177, - Variant8178, - Variant8179, - Variant8180, - Variant8181, - Variant8182, - Variant8183, - Variant8184, - Variant8185, - Variant8186, - Variant8187, - Variant8188, - Variant8189, - Variant8190, - Variant8191, - Variant8192, - Variant8193, - Variant8194, - Variant8195, - Variant8196, - Variant8197, - Variant8198, - Variant8199, - Variant8200, - Variant8201, - Variant8202, - Variant8203, - Variant8204, - Variant8205, - Variant8206, - Variant8207, - Variant8208, - Variant8209, - Variant8210, - Variant8211, - Variant8212, - Variant8213, - Variant8214, - Variant8215, - Variant8216, - Variant8217, - Variant8218, - Variant8219, - Variant8220, - Variant8221, - Variant8222, - Variant8223, - Variant8224, - Variant8225, - Variant8226, - Variant8227, - Variant8228, - Variant8229, - Variant8230, - Variant8231, - Variant8232, - Variant8233, - Variant8234, - Variant8235, - Variant8236, - Variant8237, - Variant8238, - Variant8239, - Variant8240, - Variant8241, - Variant8242, - Variant8243, - Variant8244, - Variant8245, - Variant8246, - Variant8247, - Variant8248, - Variant8249, - Variant8250, - Variant8251, - Variant8252, - Variant8253, - Variant8254, - Variant8255, - Variant8256, - Variant8257, - Variant8258, - Variant8259, - Variant8260, - Variant8261, - Variant8262, - Variant8263, - Variant8264, - Variant8265, - Variant8266, - Variant8267, - Variant8268, - Variant8269, - Variant8270, - Variant8271, - Variant8272, - Variant8273, - Variant8274, - Variant8275, - Variant8276, - Variant8277, - Variant8278, - Variant8279, - Variant8280, - Variant8281, - Variant8282, - Variant8283, - Variant8284, - Variant8285, - Variant8286, - Variant8287, - Variant8288, - Variant8289, - Variant8290, - Variant8291, - Variant8292, - Variant8293, - Variant8294, - Variant8295, - Variant8296, - Variant8297, - Variant8298, - Variant8299, - Variant8300, - Variant8301, - Variant8302, - Variant8303, - Variant8304, - Variant8305, - Variant8306, - Variant8307, - Variant8308, - Variant8309, - Variant8310, - Variant8311, - Variant8312, - Variant8313, - Variant8314, - Variant8315, - Variant8316, - Variant8317, - Variant8318, - Variant8319, - Variant8320, - Variant8321, - Variant8322, - Variant8323, - Variant8324, - Variant8325, - Variant8326, - Variant8327, - Variant8328, - Variant8329, - Variant8330, - Variant8331, - Variant8332, - Variant8333, - Variant8334, - Variant8335, - Variant8336, - Variant8337, - Variant8338, - Variant8339, - Variant8340, - Variant8341, - Variant8342, - Variant8343, - Variant8344, - Variant8345, - Variant8346, - Variant8347, - Variant8348, - Variant8349, - Variant8350, - Variant8351, - Variant8352, - Variant8353, - Variant8354, - Variant8355, - Variant8356, - Variant8357, - Variant8358, - Variant8359, - Variant8360, - Variant8361, - Variant8362, - Variant8363, - Variant8364, - Variant8365, - Variant8366, - Variant8367, - Variant8368, - Variant8369, - Variant8370, - Variant8371, - Variant8372, - Variant8373, - Variant8374, - Variant8375, - Variant8376, - Variant8377, - Variant8378, - Variant8379, - Variant8380, - Variant8381, - Variant8382, - Variant8383, - Variant8384, - Variant8385, - Variant8386, - Variant8387, - Variant8388, - Variant8389, - Variant8390, - Variant8391, - Variant8392, - Variant8393, - Variant8394, - Variant8395, - Variant8396, - Variant8397, - Variant8398, - Variant8399, - Variant8400, - Variant8401, - Variant8402, - Variant8403, - Variant8404, - Variant8405, - Variant8406, - Variant8407, - Variant8408, - Variant8409, - Variant8410, - Variant8411, - Variant8412, - Variant8413, - Variant8414, - Variant8415, - Variant8416, - Variant8417, - Variant8418, - Variant8419, - Variant8420, - Variant8421, - Variant8422, - Variant8423, - Variant8424, - Variant8425, - Variant8426, - Variant8427, - Variant8428, - Variant8429, - Variant8430, - Variant8431, - Variant8432, - Variant8433, - Variant8434, - Variant8435, - Variant8436, - Variant8437, - Variant8438, - Variant8439, - Variant8440, - Variant8441, - Variant8442, - Variant8443, - Variant8444, - Variant8445, - Variant8446, - Variant8447, - Variant8448, - Variant8449, - Variant8450, - Variant8451, - Variant8452, - Variant8453, - Variant8454, - Variant8455, - Variant8456, - Variant8457, - Variant8458, - Variant8459, - Variant8460, - Variant8461, - Variant8462, - Variant8463, - Variant8464, - Variant8465, - Variant8466, - Variant8467, - Variant8468, - Variant8469, - Variant8470, - Variant8471, - Variant8472, - Variant8473, - Variant8474, - Variant8475, - Variant8476, - Variant8477, - Variant8478, - Variant8479, - Variant8480, - Variant8481, - Variant8482, - Variant8483, - Variant8484, - Variant8485, - Variant8486, - Variant8487, - Variant8488, - Variant8489, - Variant8490, - Variant8491, - Variant8492, - Variant8493, - Variant8494, - Variant8495, - Variant8496, - Variant8497, - Variant8498, - Variant8499, - Variant8500, - Variant8501, - Variant8502, - Variant8503, - Variant8504, - Variant8505, - Variant8506, - Variant8507, - Variant8508, - Variant8509, - Variant8510, - Variant8511, - Variant8512, - Variant8513, - Variant8514, - Variant8515, - Variant8516, - Variant8517, - Variant8518, - Variant8519, - Variant8520, - Variant8521, - Variant8522, - Variant8523, - Variant8524, - Variant8525, - Variant8526, - Variant8527, - Variant8528, - Variant8529, - Variant8530, - Variant8531, - Variant8532, - Variant8533, - Variant8534, - Variant8535, - Variant8536, - Variant8537, - Variant8538, - Variant8539, - Variant8540, - Variant8541, - Variant8542, - Variant8543, - Variant8544, - Variant8545, - Variant8546, - Variant8547, - Variant8548, - Variant8549, - Variant8550, - Variant8551, - Variant8552, - Variant8553, - Variant8554, - Variant8555, - Variant8556, - Variant8557, - Variant8558, - Variant8559, - Variant8560, - Variant8561, - Variant8562, - Variant8563, - Variant8564, - Variant8565, - Variant8566, - Variant8567, - Variant8568, - Variant8569, - Variant8570, - Variant8571, - Variant8572, - Variant8573, - Variant8574, - Variant8575, - Variant8576, - Variant8577, - Variant8578, - Variant8579, - Variant8580, - Variant8581, - Variant8582, - Variant8583, - Variant8584, - Variant8585, - Variant8586, - Variant8587, - Variant8588, - Variant8589, - Variant8590, - Variant8591, - Variant8592, - Variant8593, - Variant8594, - Variant8595, - Variant8596, - Variant8597, - Variant8598, - Variant8599, - Variant8600, - Variant8601, - Variant8602, - Variant8603, - Variant8604, - Variant8605, - Variant8606, - Variant8607, - Variant8608, - Variant8609, - Variant8610, - Variant8611, - Variant8612, - Variant8613, - Variant8614, - Variant8615, - Variant8616, - Variant8617, - Variant8618, - Variant8619, - Variant8620, - Variant8621, - Variant8622, - Variant8623, - Variant8624, - Variant8625, - Variant8626, - Variant8627, - Variant8628, - Variant8629, - Variant8630, - Variant8631, - Variant8632, - Variant8633, - Variant8634, - Variant8635, - Variant8636, - Variant8637, - Variant8638, - Variant8639, - Variant8640, - Variant8641, - Variant8642, - Variant8643, - Variant8644, - Variant8645, - Variant8646, - Variant8647, - Variant8648, - Variant8649, - Variant8650, - Variant8651, - Variant8652, - Variant8653, - Variant8654, - Variant8655, - Variant8656, - Variant8657, - Variant8658, - Variant8659, - Variant8660, - Variant8661, - Variant8662, - Variant8663, - Variant8664, - Variant8665, - Variant8666, - Variant8667, - Variant8668, - Variant8669, - Variant8670, - Variant8671, - Variant8672, - Variant8673, - Variant8674, - Variant8675, - Variant8676, - Variant8677, - Variant8678, - Variant8679, - Variant8680, - Variant8681, - Variant8682, - Variant8683, - Variant8684, - Variant8685, - Variant8686, - Variant8687, - Variant8688, - Variant8689, - Variant8690, - Variant8691, - Variant8692, - Variant8693, - Variant8694, - Variant8695, - Variant8696, - Variant8697, - Variant8698, - Variant8699, - Variant8700, - Variant8701, - Variant8702, - Variant8703, - Variant8704, - Variant8705, - Variant8706, - Variant8707, - Variant8708, - Variant8709, - Variant8710, - Variant8711, - Variant8712, - Variant8713, - Variant8714, - Variant8715, - Variant8716, - Variant8717, - Variant8718, - Variant8719, - Variant8720, - Variant8721, - Variant8722, - Variant8723, - Variant8724, - Variant8725, - Variant8726, - Variant8727, - Variant8728, - Variant8729, - Variant8730, - Variant8731, - Variant8732, - Variant8733, - Variant8734, - Variant8735, - Variant8736, - Variant8737, - Variant8738, - Variant8739, - Variant8740, - Variant8741, - Variant8742, - Variant8743, - Variant8744, - Variant8745, - Variant8746, - Variant8747, - Variant8748, - Variant8749, - Variant8750, - Variant8751, - Variant8752, - Variant8753, - Variant8754, - Variant8755, - Variant8756, - Variant8757, - Variant8758, - Variant8759, - Variant8760, - Variant8761, - Variant8762, - Variant8763, - Variant8764, - Variant8765, - Variant8766, - Variant8767, - Variant8768, - Variant8769, - Variant8770, - Variant8771, - Variant8772, - Variant8773, - Variant8774, - Variant8775, - Variant8776, - Variant8777, - Variant8778, - Variant8779, - Variant8780, - Variant8781, - Variant8782, - Variant8783, - Variant8784, - Variant8785, - Variant8786, - Variant8787, - Variant8788, - Variant8789, - Variant8790, - Variant8791, - Variant8792, - Variant8793, - Variant8794, - Variant8795, - Variant8796, - Variant8797, - Variant8798, - Variant8799, - Variant8800, - Variant8801, - Variant8802, - Variant8803, - Variant8804, - Variant8805, - Variant8806, - Variant8807, - Variant8808, - Variant8809, - Variant8810, - Variant8811, - Variant8812, - Variant8813, - Variant8814, - Variant8815, - Variant8816, - Variant8817, - Variant8818, - Variant8819, - Variant8820, - Variant8821, - Variant8822, - Variant8823, - Variant8824, - Variant8825, - Variant8826, - Variant8827, - Variant8828, - Variant8829, - Variant8830, - Variant8831, - Variant8832, - Variant8833, - Variant8834, - Variant8835, - Variant8836, - Variant8837, - Variant8838, - Variant8839, - Variant8840, - Variant8841, - Variant8842, - Variant8843, - Variant8844, - Variant8845, - Variant8846, - Variant8847, - Variant8848, - Variant8849, - Variant8850, - Variant8851, - Variant8852, - Variant8853, - Variant8854, - Variant8855, - Variant8856, - Variant8857, - Variant8858, - Variant8859, - Variant8860, - Variant8861, - Variant8862, - Variant8863, - Variant8864, - Variant8865, - Variant8866, - Variant8867, - Variant8868, - Variant8869, - Variant8870, - Variant8871, - Variant8872, - Variant8873, - Variant8874, - Variant8875, - Variant8876, - Variant8877, - Variant8878, - Variant8879, - Variant8880, - Variant8881, - Variant8882, - Variant8883, - Variant8884, - Variant8885, - Variant8886, - Variant8887, - Variant8888, - Variant8889, - Variant8890, - Variant8891, - Variant8892, - Variant8893, - Variant8894, - Variant8895, - Variant8896, - Variant8897, - Variant8898, - Variant8899, - Variant8900, - Variant8901, - Variant8902, - Variant8903, - Variant8904, - Variant8905, - Variant8906, - Variant8907, - Variant8908, - Variant8909, - Variant8910, - Variant8911, - Variant8912, - Variant8913, - Variant8914, - Variant8915, - Variant8916, - Variant8917, - Variant8918, - Variant8919, - Variant8920, - Variant8921, - Variant8922, - Variant8923, - Variant8924, - Variant8925, - Variant8926, - Variant8927, - Variant8928, - Variant8929, - Variant8930, - Variant8931, - Variant8932, - Variant8933, - Variant8934, - Variant8935, - Variant8936, - Variant8937, - Variant8938, - Variant8939, - Variant8940, - Variant8941, - Variant8942, - Variant8943, - Variant8944, - Variant8945, - Variant8946, - Variant8947, - Variant8948, - Variant8949, - Variant8950, - Variant8951, - Variant8952, - Variant8953, - Variant8954, - Variant8955, - Variant8956, - Variant8957, - Variant8958, - Variant8959, - Variant8960, - Variant8961, - Variant8962, - Variant8963, - Variant8964, - Variant8965, - Variant8966, - Variant8967, - Variant8968, - Variant8969, - Variant8970, - Variant8971, - Variant8972, - Variant8973, - Variant8974, - Variant8975, - Variant8976, - Variant8977, - Variant8978, - Variant8979, - Variant8980, - Variant8981, - Variant8982, - Variant8983, - Variant8984, - Variant8985, - Variant8986, - Variant8987, - Variant8988, - Variant8989, - Variant8990, - Variant8991, - Variant8992, - Variant8993, - Variant8994, - Variant8995, - Variant8996, - Variant8997, - Variant8998, - Variant8999, - Variant9000, - Variant9001, - Variant9002, - Variant9003, - Variant9004, - Variant9005, - Variant9006, - Variant9007, - Variant9008, - Variant9009, - Variant9010, - Variant9011, - Variant9012, - Variant9013, - Variant9014, - Variant9015, - Variant9016, - Variant9017, - Variant9018, - Variant9019, - Variant9020, - Variant9021, - Variant9022, - Variant9023, - Variant9024, - Variant9025, - Variant9026, - Variant9027, - Variant9028, - Variant9029, - Variant9030, - Variant9031, - Variant9032, - Variant9033, - Variant9034, - Variant9035, - Variant9036, - Variant9037, - Variant9038, - Variant9039, - Variant9040, - Variant9041, - Variant9042, - Variant9043, - Variant9044, - Variant9045, - Variant9046, - Variant9047, - Variant9048, - Variant9049, - Variant9050, - Variant9051, - Variant9052, - Variant9053, - Variant9054, - Variant9055, - Variant9056, - Variant9057, - Variant9058, - Variant9059, - Variant9060, - Variant9061, - Variant9062, - Variant9063, - Variant9064, - Variant9065, - Variant9066, - Variant9067, - Variant9068, - Variant9069, - Variant9070, - Variant9071, - Variant9072, - Variant9073, - Variant9074, - Variant9075, - Variant9076, - Variant9077, - Variant9078, - Variant9079, - Variant9080, - Variant9081, - Variant9082, - Variant9083, - Variant9084, - Variant9085, - Variant9086, - Variant9087, - Variant9088, - Variant9089, - Variant9090, - Variant9091, - Variant9092, - Variant9093, - Variant9094, - Variant9095, - Variant9096, - Variant9097, - Variant9098, - Variant9099, - Variant9100, - Variant9101, - Variant9102, - Variant9103, - Variant9104, - Variant9105, - Variant9106, - Variant9107, - Variant9108, - Variant9109, - Variant9110, - Variant9111, - Variant9112, - Variant9113, - Variant9114, - Variant9115, - Variant9116, - Variant9117, - Variant9118, - Variant9119, - Variant9120, - Variant9121, - Variant9122, - Variant9123, - Variant9124, - Variant9125, - Variant9126, - Variant9127, - Variant9128, - Variant9129, - Variant9130, - Variant9131, - Variant9132, - Variant9133, - Variant9134, - Variant9135, - Variant9136, - Variant9137, - Variant9138, - Variant9139, - Variant9140, - Variant9141, - Variant9142, - Variant9143, - Variant9144, - Variant9145, - Variant9146, - Variant9147, - Variant9148, - Variant9149, - Variant9150, - Variant9151, - Variant9152, - Variant9153, - Variant9154, - Variant9155, - Variant9156, - Variant9157, - Variant9158, - Variant9159, - Variant9160, - Variant9161, - Variant9162, - Variant9163, - Variant9164, - Variant9165, - Variant9166, - Variant9167, - Variant9168, - Variant9169, - Variant9170, - Variant9171, - Variant9172, - Variant9173, - Variant9174, - Variant9175, - Variant9176, - Variant9177, - Variant9178, - Variant9179, - Variant9180, - Variant9181, - Variant9182, - Variant9183, - Variant9184, - Variant9185, - Variant9186, - Variant9187, - Variant9188, - Variant9189, - Variant9190, - Variant9191, - Variant9192, - Variant9193, - Variant9194, - Variant9195, - Variant9196, - Variant9197, - Variant9198, - Variant9199, - Variant9200, - Variant9201, - Variant9202, - Variant9203, - Variant9204, - Variant9205, - Variant9206, - Variant9207, - Variant9208, - Variant9209, - Variant9210, - Variant9211, - Variant9212, - Variant9213, - Variant9214, - Variant9215, - Variant9216, - Variant9217, - Variant9218, - Variant9219, - Variant9220, - Variant9221, - Variant9222, - Variant9223, - Variant9224, - Variant9225, - Variant9226, - Variant9227, - Variant9228, - Variant9229, - Variant9230, - Variant9231, - Variant9232, - Variant9233, - Variant9234, - Variant9235, - Variant9236, - Variant9237, - Variant9238, - Variant9239, - Variant9240, - Variant9241, - Variant9242, - Variant9243, - Variant9244, - Variant9245, - Variant9246, - Variant9247, - Variant9248, - Variant9249, - Variant9250, - Variant9251, - Variant9252, - Variant9253, - Variant9254, - Variant9255, - Variant9256, - Variant9257, - Variant9258, - Variant9259, - Variant9260, - Variant9261, - Variant9262, - Variant9263, - Variant9264, - Variant9265, - Variant9266, - Variant9267, - Variant9268, - Variant9269, - Variant9270, - Variant9271, - Variant9272, - Variant9273, - Variant9274, - Variant9275, - Variant9276, - Variant9277, - Variant9278, - Variant9279, - Variant9280, - Variant9281, - Variant9282, - Variant9283, - Variant9284, - Variant9285, - Variant9286, - Variant9287, - Variant9288, - Variant9289, - Variant9290, - Variant9291, - Variant9292, - Variant9293, - Variant9294, - Variant9295, - Variant9296, - Variant9297, - Variant9298, - Variant9299, - Variant9300, - Variant9301, - Variant9302, - Variant9303, - Variant9304, - Variant9305, - Variant9306, - Variant9307, - Variant9308, - Variant9309, - Variant9310, - Variant9311, - Variant9312, - Variant9313, - Variant9314, - Variant9315, - Variant9316, - Variant9317, - Variant9318, - Variant9319, - Variant9320, - Variant9321, - Variant9322, - Variant9323, - Variant9324, - Variant9325, - Variant9326, - Variant9327, - Variant9328, - Variant9329, - Variant9330, - Variant9331, - Variant9332, - Variant9333, - Variant9334, - Variant9335, - Variant9336, - Variant9337, - Variant9338, - Variant9339, - Variant9340, - Variant9341, - Variant9342, - Variant9343, - Variant9344, - Variant9345, - Variant9346, - Variant9347, - Variant9348, - Variant9349, - Variant9350, - Variant9351, - Variant9352, - Variant9353, - Variant9354, - Variant9355, - Variant9356, - Variant9357, - Variant9358, - Variant9359, - Variant9360, - Variant9361, - Variant9362, - Variant9363, - Variant9364, - Variant9365, - Variant9366, - Variant9367, - Variant9368, - Variant9369, - Variant9370, - Variant9371, - Variant9372, - Variant9373, - Variant9374, - Variant9375, - Variant9376, - Variant9377, - Variant9378, - Variant9379, - Variant9380, - Variant9381, - Variant9382, - Variant9383, - Variant9384, - Variant9385, - Variant9386, - Variant9387, - Variant9388, - Variant9389, - Variant9390, - Variant9391, - Variant9392, - Variant9393, - Variant9394, - Variant9395, - Variant9396, - Variant9397, - Variant9398, - Variant9399, - Variant9400, - Variant9401, - Variant9402, - Variant9403, - Variant9404, - Variant9405, - Variant9406, - Variant9407, - Variant9408, - Variant9409, - Variant9410, - Variant9411, - Variant9412, - Variant9413, - Variant9414, - Variant9415, - Variant9416, - Variant9417, - Variant9418, - Variant9419, - Variant9420, - Variant9421, - Variant9422, - Variant9423, - Variant9424, - Variant9425, - Variant9426, - Variant9427, - Variant9428, - Variant9429, - Variant9430, - Variant9431, - Variant9432, - Variant9433, - Variant9434, - Variant9435, - Variant9436, - Variant9437, - Variant9438, - Variant9439, - Variant9440, - Variant9441, - Variant9442, - Variant9443, - Variant9444, - Variant9445, - Variant9446, - Variant9447, - Variant9448, - Variant9449, - Variant9450, - Variant9451, - Variant9452, - Variant9453, - Variant9454, - Variant9455, - Variant9456, - Variant9457, - Variant9458, - Variant9459, - Variant9460, - Variant9461, - Variant9462, - Variant9463, - Variant9464, - Variant9465, - Variant9466, - Variant9467, - Variant9468, - Variant9469, - Variant9470, - Variant9471, - Variant9472, - Variant9473, - Variant9474, - Variant9475, - Variant9476, - Variant9477, - Variant9478, - Variant9479, - Variant9480, - Variant9481, - Variant9482, - Variant9483, - Variant9484, - Variant9485, - Variant9486, - Variant9487, - Variant9488, - Variant9489, - Variant9490, - Variant9491, - Variant9492, - Variant9493, - Variant9494, - Variant9495, - Variant9496, - Variant9497, - Variant9498, - Variant9499, - Variant9500, - Variant9501, - Variant9502, - Variant9503, - Variant9504, - Variant9505, - Variant9506, - Variant9507, - Variant9508, - Variant9509, - Variant9510, - Variant9511, - Variant9512, - Variant9513, - Variant9514, - Variant9515, - Variant9516, - Variant9517, - Variant9518, - Variant9519, - Variant9520, - Variant9521, - Variant9522, - Variant9523, - Variant9524, - Variant9525, - Variant9526, - Variant9527, - Variant9528, - Variant9529, - Variant9530, - Variant9531, - Variant9532, - Variant9533, - Variant9534, - Variant9535, - Variant9536, - Variant9537, - Variant9538, - Variant9539, - Variant9540, - Variant9541, - Variant9542, - Variant9543, - Variant9544, - Variant9545, - Variant9546, - Variant9547, - Variant9548, - Variant9549, - Variant9550, - Variant9551, - Variant9552, - Variant9553, - Variant9554, - Variant9555, - Variant9556, - Variant9557, - Variant9558, - Variant9559, - Variant9560, - Variant9561, - Variant9562, - Variant9563, - Variant9564, - Variant9565, - Variant9566, - Variant9567, - Variant9568, - Variant9569, - Variant9570, - Variant9571, - Variant9572, - Variant9573, - Variant9574, - Variant9575, - Variant9576, - Variant9577, - Variant9578, - Variant9579, - Variant9580, - Variant9581, - Variant9582, - Variant9583, - Variant9584, - Variant9585, - Variant9586, - Variant9587, - Variant9588, - Variant9589, - Variant9590, - Variant9591, - Variant9592, - Variant9593, - Variant9594, - Variant9595, - Variant9596, - Variant9597, - Variant9598, - Variant9599, - Variant9600, - Variant9601, - Variant9602, - Variant9603, - Variant9604, - Variant9605, - Variant9606, - Variant9607, - Variant9608, - Variant9609, - Variant9610, - Variant9611, - Variant9612, - Variant9613, - Variant9614, - Variant9615, - Variant9616, - Variant9617, - Variant9618, - Variant9619, - Variant9620, - Variant9621, - Variant9622, - Variant9623, - Variant9624, - Variant9625, - Variant9626, - Variant9627, - Variant9628, - Variant9629, - Variant9630, - Variant9631, - Variant9632, - Variant9633, - Variant9634, - Variant9635, - Variant9636, - Variant9637, - Variant9638, - Variant9639, - Variant9640, - Variant9641, - Variant9642, - Variant9643, - Variant9644, - Variant9645, - Variant9646, - Variant9647, - Variant9648, - Variant9649, - Variant9650, - Variant9651, - Variant9652, - Variant9653, - Variant9654, - Variant9655, - Variant9656, - Variant9657, - Variant9658, - Variant9659, - Variant9660, - Variant9661, - Variant9662, - Variant9663, - Variant9664, - Variant9665, - Variant9666, - Variant9667, - Variant9668, - Variant9669, - Variant9670, - Variant9671, - Variant9672, - Variant9673, - Variant9674, - Variant9675, - Variant9676, - Variant9677, - Variant9678, - Variant9679, - Variant9680, - Variant9681, - Variant9682, - Variant9683, - Variant9684, - Variant9685, - Variant9686, - Variant9687, - Variant9688, - Variant9689, - Variant9690, - Variant9691, - Variant9692, - Variant9693, - Variant9694, - Variant9695, - Variant9696, - Variant9697, - Variant9698, - Variant9699, - Variant9700, - Variant9701, - Variant9702, - Variant9703, - Variant9704, - Variant9705, - Variant9706, - Variant9707, - Variant9708, - Variant9709, - Variant9710, - Variant9711, - Variant9712, - Variant9713, - Variant9714, - Variant9715, - Variant9716, - Variant9717, - Variant9718, - Variant9719, - Variant9720, - Variant9721, - Variant9722, - Variant9723, - Variant9724, - Variant9725, - Variant9726, - Variant9727, - Variant9728, - Variant9729, - Variant9730, - Variant9731, - Variant9732, - Variant9733, - Variant9734, - Variant9735, - Variant9736, - Variant9737, - Variant9738, - Variant9739, - Variant9740, - Variant9741, - Variant9742, - Variant9743, - Variant9744, - Variant9745, - Variant9746, - Variant9747, - Variant9748, - Variant9749, - Variant9750, - Variant9751, - Variant9752, - Variant9753, - Variant9754, - Variant9755, - Variant9756, - Variant9757, - Variant9758, - Variant9759, - Variant9760, - Variant9761, - Variant9762, - Variant9763, - Variant9764, - Variant9765, - Variant9766, - Variant9767, - Variant9768, - Variant9769, - Variant9770, - Variant9771, - Variant9772, - Variant9773, - Variant9774, - Variant9775, - Variant9776, - Variant9777, - Variant9778, - Variant9779, - Variant9780, - Variant9781, - Variant9782, - Variant9783, - Variant9784, - Variant9785, - Variant9786, - Variant9787, - Variant9788, - Variant9789, - Variant9790, - Variant9791, - Variant9792, - Variant9793, - Variant9794, - Variant9795, - Variant9796, - Variant9797, - Variant9798, - Variant9799, - Variant9800, - Variant9801, - Variant9802, - Variant9803, - Variant9804, - Variant9805, - Variant9806, - Variant9807, - Variant9808, - Variant9809, - Variant9810, - Variant9811, - Variant9812, - Variant9813, - Variant9814, - Variant9815, - Variant9816, - Variant9817, - Variant9818, - Variant9819, - Variant9820, - Variant9821, - Variant9822, - Variant9823, - Variant9824, - Variant9825, - Variant9826, - Variant9827, - Variant9828, - Variant9829, - Variant9830, - Variant9831, - Variant9832, - Variant9833, - Variant9834, - Variant9835, - Variant9836, - Variant9837, - Variant9838, - Variant9839, - Variant9840, - Variant9841, - Variant9842, - Variant9843, - Variant9844, - Variant9845, - Variant9846, - Variant9847, - Variant9848, - Variant9849, - Variant9850, - Variant9851, - Variant9852, - Variant9853, - Variant9854, - Variant9855, - Variant9856, - Variant9857, - Variant9858, - Variant9859, - Variant9860, - Variant9861, - Variant9862, - Variant9863, - Variant9864, - Variant9865, - Variant9866, - Variant9867, - Variant9868, - Variant9869, - Variant9870, - Variant9871, - Variant9872, - Variant9873, - Variant9874, - Variant9875, - Variant9876, - Variant9877, - Variant9878, - Variant9879, - Variant9880, - Variant9881, - Variant9882, - Variant9883, - Variant9884, - Variant9885, - Variant9886, - Variant9887, - Variant9888, - Variant9889, - Variant9890, - Variant9891, - Variant9892, - Variant9893, - Variant9894, - Variant9895, - Variant9896, - Variant9897, - Variant9898, - Variant9899, - Variant9900, - Variant9901, - Variant9902, - Variant9903, - Variant9904, - Variant9905, - Variant9906, - Variant9907, - Variant9908, - Variant9909, - Variant9910, - Variant9911, - Variant9912, - Variant9913, - Variant9914, - Variant9915, - Variant9916, - Variant9917, - Variant9918, - Variant9919, - Variant9920, - Variant9921, - Variant9922, - Variant9923, - Variant9924, - Variant9925, - Variant9926, - Variant9927, - Variant9928, - Variant9929, - Variant9930, - Variant9931, - Variant9932, - Variant9933, - Variant9934, - Variant9935, - Variant9936, - Variant9937, - Variant9938, - Variant9939, - Variant9940, - Variant9941, - Variant9942, - Variant9943, - Variant9944, - Variant9945, - Variant9946, - Variant9947, - Variant9948, - Variant9949, - Variant9950, - Variant9951, - Variant9952, - Variant9953, - Variant9954, - Variant9955, - Variant9956, - Variant9957, - Variant9958, - Variant9959, - Variant9960, - Variant9961, - Variant9962, - Variant9963, - Variant9964, - Variant9965, - Variant9966, - Variant9967, - Variant9968, - Variant9969, - Variant9970, - Variant9971, - Variant9972, - Variant9973, - Variant9974, - Variant9975, - Variant9976, - Variant9977, - Variant9978, - Variant9979, - Variant9980, - Variant9981, - Variant9982, - Variant9983, - Variant9984, - Variant9985, - Variant9986, - Variant9987, - Variant9988, - Variant9989, - Variant9990, - Variant9991, - Variant9992, - Variant9993, - Variant9994, - Variant9995, - Variant9996, - Variant9997, - Variant9998, - Variant9999, - Variant10000, - Variant10001, - Variant10002, - Variant10003, - Variant10004, - Variant10005, - Variant10006, - Variant10007, - Variant10008, - Variant10009, - Variant10010, - Variant10011, - Variant10012, - Variant10013, - Variant10014, - Variant10015, - Variant10016, - Variant10017, - Variant10018, - Variant10019, - Variant10020, - Variant10021, - Variant10022, - Variant10023, - Variant10024, - Variant10025, - Variant10026, - Variant10027, - Variant10028, - Variant10029, - Variant10030, - Variant10031, - Variant10032, - Variant10033, - Variant10034, - Variant10035, - Variant10036, - Variant10037, - Variant10038, - Variant10039, - Variant10040, - Variant10041, - Variant10042, - Variant10043, - Variant10044, - Variant10045, - Variant10046, - Variant10047, - Variant10048, - Variant10049, - Variant10050, - Variant10051, - Variant10052, - Variant10053, - Variant10054, - Variant10055, - Variant10056, - Variant10057, - Variant10058, - Variant10059, - Variant10060, - Variant10061, - Variant10062, - Variant10063, - Variant10064, - Variant10065, - Variant10066, - Variant10067, - Variant10068, - Variant10069, - Variant10070, - Variant10071, - Variant10072, - Variant10073, - Variant10074, - Variant10075, - Variant10076, - Variant10077, - Variant10078, - Variant10079, - Variant10080, - Variant10081, - Variant10082, - Variant10083, - Variant10084, - Variant10085, - Variant10086, - Variant10087, - Variant10088, - Variant10089, - Variant10090, - Variant10091, - Variant10092, - Variant10093, - Variant10094, - Variant10095, - Variant10096, - Variant10097, - Variant10098, - Variant10099, - Variant10100, - Variant10101, - Variant10102, - Variant10103, - Variant10104, - Variant10105, - Variant10106, - Variant10107, - Variant10108, - Variant10109, - Variant10110, - Variant10111, - Variant10112, - Variant10113, - Variant10114, - Variant10115, - Variant10116, - Variant10117, - Variant10118, - Variant10119, - Variant10120, - Variant10121, - Variant10122, - Variant10123, - Variant10124, - Variant10125, - Variant10126, - Variant10127, - Variant10128, - Variant10129, - Variant10130, - Variant10131, - Variant10132, - Variant10133, - Variant10134, - Variant10135, - Variant10136, - Variant10137, - Variant10138, - Variant10139, - Variant10140, - Variant10141, - Variant10142, - Variant10143, - Variant10144, - Variant10145, - Variant10146, - Variant10147, - Variant10148, - Variant10149, - Variant10150, - Variant10151, - Variant10152, - Variant10153, - Variant10154, - Variant10155, - Variant10156, - Variant10157, - Variant10158, - Variant10159, - Variant10160, - Variant10161, - Variant10162, - Variant10163, - Variant10164, - Variant10165, - Variant10166, - Variant10167, - Variant10168, - Variant10169, - Variant10170, - Variant10171, - Variant10172, - Variant10173, - Variant10174, - Variant10175, - Variant10176, - Variant10177, - Variant10178, - Variant10179, - Variant10180, - Variant10181, - Variant10182, - Variant10183, - Variant10184, - Variant10185, - Variant10186, - Variant10187, - Variant10188, - Variant10189, - Variant10190, - Variant10191, - Variant10192, - Variant10193, - Variant10194, - Variant10195, - Variant10196, - Variant10197, - Variant10198, - Variant10199, - Variant10200, - Variant10201, - Variant10202, - Variant10203, - Variant10204, - Variant10205, - Variant10206, - Variant10207, - Variant10208, - Variant10209, - Variant10210, - Variant10211, - Variant10212, - Variant10213, - Variant10214, - Variant10215, - Variant10216, - Variant10217, - Variant10218, - Variant10219, - Variant10220, - Variant10221, - Variant10222, - Variant10223, - Variant10224, - Variant10225, - Variant10226, - Variant10227, - Variant10228, - Variant10229, - Variant10230, - Variant10231, - Variant10232, - Variant10233, - Variant10234, - Variant10235, - Variant10236, - Variant10237, - Variant10238, - Variant10239, - Variant10240, - Variant10241, - Variant10242, - Variant10243, - Variant10244, - Variant10245, - Variant10246, - Variant10247, - Variant10248, - Variant10249, - Variant10250, - Variant10251, - Variant10252, - Variant10253, - Variant10254, - Variant10255, - Variant10256, - Variant10257, - Variant10258, - Variant10259, - Variant10260, - Variant10261, - Variant10262, - Variant10263, - Variant10264, - Variant10265, - Variant10266, - Variant10267, - Variant10268, - Variant10269, - Variant10270, - Variant10271, - Variant10272, - Variant10273, - Variant10274, - Variant10275, - Variant10276, - Variant10277, - Variant10278, - Variant10279, - Variant10280, - Variant10281, - Variant10282, - Variant10283, - Variant10284, - Variant10285, - Variant10286, - Variant10287, - Variant10288, - Variant10289, - Variant10290, - Variant10291, - Variant10292, - Variant10293, - Variant10294, - Variant10295, - Variant10296, - Variant10297, - Variant10298, - Variant10299, - Variant10300, - Variant10301, - Variant10302, - Variant10303, - Variant10304, - Variant10305, - Variant10306, - Variant10307, - Variant10308, - Variant10309, - Variant10310, - Variant10311, - Variant10312, - Variant10313, - Variant10314, - Variant10315, - Variant10316, - Variant10317, - Variant10318, - Variant10319, - Variant10320, - Variant10321, - Variant10322, - Variant10323, - Variant10324, - Variant10325, - Variant10326, - Variant10327, - Variant10328, - Variant10329, - Variant10330, - Variant10331, - Variant10332, - Variant10333, - Variant10334, - Variant10335, - Variant10336, - Variant10337, - Variant10338, - Variant10339, - Variant10340, - Variant10341, - Variant10342, - Variant10343, - Variant10344, - Variant10345, - Variant10346, - Variant10347, - Variant10348, - Variant10349, - Variant10350, - Variant10351, - Variant10352, - Variant10353, - Variant10354, - Variant10355, - Variant10356, - Variant10357, - Variant10358, - Variant10359, - Variant10360, - Variant10361, - Variant10362, - Variant10363, - Variant10364, - Variant10365, - Variant10366, - Variant10367, - Variant10368, - Variant10369, - Variant10370, - Variant10371, - Variant10372, - Variant10373, - Variant10374, - Variant10375, - Variant10376, - Variant10377, - Variant10378, - Variant10379, - Variant10380, - Variant10381, - Variant10382, - Variant10383, - Variant10384, - Variant10385, - Variant10386, - Variant10387, - Variant10388, - Variant10389, - Variant10390, - Variant10391, - Variant10392, - Variant10393, - Variant10394, - Variant10395, - Variant10396, - Variant10397, - Variant10398, - Variant10399, - Variant10400, - Variant10401, - Variant10402, - Variant10403, - Variant10404, - Variant10405, - Variant10406, - Variant10407, - Variant10408, - Variant10409, - Variant10410, - Variant10411, - Variant10412, - Variant10413, - Variant10414, - Variant10415, - Variant10416, - Variant10417, - Variant10418, - Variant10419, - Variant10420, - Variant10421, - Variant10422, - Variant10423, - Variant10424, - Variant10425, - Variant10426, - Variant10427, - Variant10428, - Variant10429, - Variant10430, - Variant10431, - Variant10432, - Variant10433, - Variant10434, - Variant10435, - Variant10436, - Variant10437, - Variant10438, - Variant10439, - Variant10440, - Variant10441, - Variant10442, - Variant10443, - Variant10444, - Variant10445, - Variant10446, - Variant10447, - Variant10448, - Variant10449, - Variant10450, - Variant10451, - Variant10452, - Variant10453, - Variant10454, - Variant10455, - Variant10456, - Variant10457, - Variant10458, - Variant10459, - Variant10460, - Variant10461, - Variant10462, - Variant10463, - Variant10464, - Variant10465, - Variant10466, - Variant10467, - Variant10468, - Variant10469, - Variant10470, - Variant10471, - Variant10472, - Variant10473, - Variant10474, - Variant10475, - Variant10476, - Variant10477, - Variant10478, - Variant10479, - Variant10480, - Variant10481, - Variant10482, - Variant10483, - Variant10484, - Variant10485, - Variant10486, - Variant10487, - Variant10488, - Variant10489, - Variant10490, - Variant10491, - Variant10492, - Variant10493, - Variant10494, - Variant10495, - Variant10496, - Variant10497, - Variant10498, - Variant10499, - Variant10500, - Variant10501, - Variant10502, - Variant10503, - Variant10504, - Variant10505, - Variant10506, - Variant10507, - Variant10508, - Variant10509, - Variant10510, - Variant10511, - Variant10512, - Variant10513, - Variant10514, - Variant10515, - Variant10516, - Variant10517, - Variant10518, - Variant10519, - Variant10520, - Variant10521, - Variant10522, - Variant10523, - Variant10524, - Variant10525, - Variant10526, - Variant10527, - Variant10528, - Variant10529, - Variant10530, - Variant10531, - Variant10532, - Variant10533, - Variant10534, - Variant10535, - Variant10536, - Variant10537, - Variant10538, - Variant10539, - Variant10540, - Variant10541, - Variant10542, - Variant10543, - Variant10544, - Variant10545, - Variant10546, - Variant10547, - Variant10548, - Variant10549, - Variant10550, - Variant10551, - Variant10552, - Variant10553, - Variant10554, - Variant10555, - Variant10556, - Variant10557, - Variant10558, - Variant10559, - Variant10560, - Variant10561, - Variant10562, - Variant10563, - Variant10564, - Variant10565, - Variant10566, - Variant10567, - Variant10568, - Variant10569, - Variant10570, - Variant10571, - Variant10572, - Variant10573, - Variant10574, - Variant10575, - Variant10576, - Variant10577, - Variant10578, - Variant10579, - Variant10580, - Variant10581, - Variant10582, - Variant10583, - Variant10584, - Variant10585, - Variant10586, - Variant10587, - Variant10588, - Variant10589, - Variant10590, - Variant10591, - Variant10592, - Variant10593, - Variant10594, - Variant10595, - Variant10596, - Variant10597, - Variant10598, - Variant10599, - Variant10600, - Variant10601, - Variant10602, - Variant10603, - Variant10604, - Variant10605, - Variant10606, - Variant10607, - Variant10608, - Variant10609, - Variant10610, - Variant10611, - Variant10612, - Variant10613, - Variant10614, - Variant10615, - Variant10616, - Variant10617, - Variant10618, - Variant10619, - Variant10620, - Variant10621, - Variant10622, - Variant10623, - Variant10624, - Variant10625, - Variant10626, - Variant10627, - Variant10628, - Variant10629, - Variant10630, - Variant10631, - Variant10632, - Variant10633, - Variant10634, - Variant10635, - Variant10636, - Variant10637, - Variant10638, - Variant10639, - Variant10640, - Variant10641, - Variant10642, - Variant10643, - Variant10644, - Variant10645, - Variant10646, - Variant10647, - Variant10648, - Variant10649, - Variant10650, - Variant10651, - Variant10652, - Variant10653, - Variant10654, - Variant10655, - Variant10656, - Variant10657, - Variant10658, - Variant10659, - Variant10660, - Variant10661, - Variant10662, - Variant10663, - Variant10664, - Variant10665, - Variant10666, - Variant10667, - Variant10668, - Variant10669, - Variant10670, - Variant10671, - Variant10672, - Variant10673, - Variant10674, - Variant10675, - Variant10676, - Variant10677, - Variant10678, - Variant10679, - Variant10680, - Variant10681, - Variant10682, - Variant10683, - Variant10684, - Variant10685, - Variant10686, - Variant10687, - Variant10688, - Variant10689, - Variant10690, - Variant10691, - Variant10692, - Variant10693, - Variant10694, - Variant10695, - Variant10696, - Variant10697, - Variant10698, - Variant10699, - Variant10700, - Variant10701, - Variant10702, - Variant10703, - Variant10704, - Variant10705, - Variant10706, - Variant10707, - Variant10708, - Variant10709, - Variant10710, - Variant10711, - Variant10712, - Variant10713, - Variant10714, - Variant10715, - Variant10716, - Variant10717, - Variant10718, - Variant10719, - Variant10720, - Variant10721, - Variant10722, - Variant10723, - Variant10724, - Variant10725, - Variant10726, - Variant10727, - Variant10728, - Variant10729, - Variant10730, - Variant10731, - Variant10732, - Variant10733, - Variant10734, - Variant10735, - Variant10736, - Variant10737, - Variant10738, - Variant10739, - Variant10740, - Variant10741, - Variant10742, - Variant10743, - Variant10744, - Variant10745, - Variant10746, - Variant10747, - Variant10748, - Variant10749, - Variant10750, - Variant10751, - Variant10752, - Variant10753, - Variant10754, - Variant10755, - Variant10756, - Variant10757, - Variant10758, - Variant10759, - Variant10760, - Variant10761, - Variant10762, - Variant10763, - Variant10764, - Variant10765, - Variant10766, - Variant10767, - Variant10768, - Variant10769, - Variant10770, - Variant10771, - Variant10772, - Variant10773, - Variant10774, - Variant10775, - Variant10776, - Variant10777, - Variant10778, - Variant10779, - Variant10780, - Variant10781, - Variant10782, - Variant10783, - Variant10784, - Variant10785, - Variant10786, - Variant10787, - Variant10788, - Variant10789, - Variant10790, - Variant10791, - Variant10792, - Variant10793, - Variant10794, - Variant10795, - Variant10796, - Variant10797, - Variant10798, - Variant10799, - Variant10800, - Variant10801, - Variant10802, - Variant10803, - Variant10804, - Variant10805, - Variant10806, - Variant10807, - Variant10808, - Variant10809, - Variant10810, - Variant10811, - Variant10812, - Variant10813, - Variant10814, - Variant10815, - Variant10816, - Variant10817, - Variant10818, - Variant10819, - Variant10820, - Variant10821, - Variant10822, - Variant10823, - Variant10824, - Variant10825, - Variant10826, - Variant10827, - Variant10828, - Variant10829, - Variant10830, - Variant10831, - Variant10832, - Variant10833, - Variant10834, - Variant10835, - Variant10836, - Variant10837, - Variant10838, - Variant10839, - Variant10840, - Variant10841, - Variant10842, - Variant10843, - Variant10844, - Variant10845, - Variant10846, - Variant10847, - Variant10848, - Variant10849, - Variant10850, - Variant10851, - Variant10852, - Variant10853, - Variant10854, - Variant10855, - Variant10856, - Variant10857, - Variant10858, - Variant10859, - Variant10860, - Variant10861, - Variant10862, - Variant10863, - Variant10864, - Variant10865, - Variant10866, - Variant10867, - Variant10868, - Variant10869, - Variant10870, - Variant10871, - Variant10872, - Variant10873, - Variant10874, - Variant10875, - Variant10876, - Variant10877, - Variant10878, - Variant10879, - Variant10880, - Variant10881, - Variant10882, - Variant10883, - Variant10884, - Variant10885, - Variant10886, - Variant10887, - Variant10888, - Variant10889, - Variant10890, - Variant10891, - Variant10892, - Variant10893, - Variant10894, - Variant10895, - Variant10896, - Variant10897, - Variant10898, - Variant10899, - Variant10900, - Variant10901, - Variant10902, - Variant10903, - Variant10904, - Variant10905, - Variant10906, - Variant10907, - Variant10908, - Variant10909, - Variant10910, - Variant10911, - Variant10912, - Variant10913, - Variant10914, - Variant10915, - Variant10916, - Variant10917, - Variant10918, - Variant10919, - Variant10920, - Variant10921, - Variant10922, - Variant10923, - Variant10924, - Variant10925, - Variant10926, - Variant10927, - Variant10928, - Variant10929, - Variant10930, - Variant10931, - Variant10932, - Variant10933, - Variant10934, - Variant10935, - Variant10936, - Variant10937, - Variant10938, - Variant10939, - Variant10940, - Variant10941, - Variant10942, - Variant10943, - Variant10944, - Variant10945, - Variant10946, - Variant10947, - Variant10948, - Variant10949, - Variant10950, - Variant10951, - Variant10952, - Variant10953, - Variant10954, - Variant10955, - Variant10956, - Variant10957, - Variant10958, - Variant10959, - Variant10960, - Variant10961, - Variant10962, - Variant10963, - Variant10964, - Variant10965, - Variant10966, - Variant10967, - Variant10968, - Variant10969, - Variant10970, - Variant10971, - Variant10972, - Variant10973, - Variant10974, - Variant10975, - Variant10976, - Variant10977, - Variant10978, - Variant10979, - Variant10980, - Variant10981, - Variant10982, - Variant10983, - Variant10984, - Variant10985, - Variant10986, - Variant10987, - Variant10988, - Variant10989, - Variant10990, - Variant10991, - Variant10992, - Variant10993, - Variant10994, - Variant10995, - Variant10996, - Variant10997, - Variant10998, - Variant10999, - Variant11000, - Variant11001, - Variant11002, - Variant11003, - Variant11004, - Variant11005, - Variant11006, - Variant11007, - Variant11008, - Variant11009, - Variant11010, - Variant11011, - Variant11012, - Variant11013, - Variant11014, - Variant11015, - Variant11016, - Variant11017, - Variant11018, - Variant11019, - Variant11020, - Variant11021, - Variant11022, - Variant11023, - Variant11024, - Variant11025, - Variant11026, - Variant11027, - Variant11028, - Variant11029, - Variant11030, - Variant11031, - Variant11032, - Variant11033, - Variant11034, - Variant11035, - Variant11036, - Variant11037, - Variant11038, - Variant11039, - Variant11040, - Variant11041, - Variant11042, - Variant11043, - Variant11044, - Variant11045, - Variant11046, - Variant11047, - Variant11048, - Variant11049, - Variant11050, - Variant11051, - Variant11052, - Variant11053, - Variant11054, - Variant11055, - Variant11056, - Variant11057, - Variant11058, - Variant11059, - Variant11060, - Variant11061, - Variant11062, - Variant11063, - Variant11064, - Variant11065, - Variant11066, - Variant11067, - Variant11068, - Variant11069, - Variant11070, - Variant11071, - Variant11072, - Variant11073, - Variant11074, - Variant11075, - Variant11076, - Variant11077, - Variant11078, - Variant11079, - Variant11080, - Variant11081, - Variant11082, - Variant11083, - Variant11084, - Variant11085, - Variant11086, - Variant11087, - Variant11088, - Variant11089, - Variant11090, - Variant11091, - Variant11092, - Variant11093, - Variant11094, - Variant11095, - Variant11096, - Variant11097, - Variant11098, - Variant11099, - Variant11100, - Variant11101, - Variant11102, - Variant11103, - Variant11104, - Variant11105, - Variant11106, - Variant11107, - Variant11108, - Variant11109, - Variant11110, - Variant11111, - Variant11112, - Variant11113, - Variant11114, - Variant11115, - Variant11116, - Variant11117, - Variant11118, - Variant11119, - Variant11120, - Variant11121, - Variant11122, - Variant11123, - Variant11124, - Variant11125, - Variant11126, - Variant11127, - Variant11128, - Variant11129, - Variant11130, - Variant11131, - Variant11132, - Variant11133, - Variant11134, - Variant11135, - Variant11136, - Variant11137, - Variant11138, - Variant11139, - Variant11140, - Variant11141, - Variant11142, - Variant11143, - Variant11144, - Variant11145, - Variant11146, - Variant11147, - Variant11148, - Variant11149, - Variant11150, - Variant11151, - Variant11152, - Variant11153, - Variant11154, - Variant11155, - Variant11156, - Variant11157, - Variant11158, - Variant11159, - Variant11160, - Variant11161, - Variant11162, - Variant11163, - Variant11164, - Variant11165, - Variant11166, - Variant11167, - Variant11168, - Variant11169, - Variant11170, - Variant11171, - Variant11172, - Variant11173, - Variant11174, - Variant11175, - Variant11176, - Variant11177, - Variant11178, - Variant11179, - Variant11180, - Variant11181, - Variant11182, - Variant11183, - Variant11184, - Variant11185, - Variant11186, - Variant11187, - Variant11188, - Variant11189, - Variant11190, - Variant11191, - Variant11192, - Variant11193, - Variant11194, - Variant11195, - Variant11196, - Variant11197, - Variant11198, - Variant11199, - Variant11200, - Variant11201, - Variant11202, - Variant11203, - Variant11204, - Variant11205, - Variant11206, - Variant11207, - Variant11208, - Variant11209, - Variant11210, - Variant11211, - Variant11212, - Variant11213, - Variant11214, - Variant11215, - Variant11216, - Variant11217, - Variant11218, - Variant11219, - Variant11220, - Variant11221, - Variant11222, - Variant11223, - Variant11224, - Variant11225, - Variant11226, - Variant11227, - Variant11228, - Variant11229, - Variant11230, - Variant11231, - Variant11232, - Variant11233, - Variant11234, - Variant11235, - Variant11236, - Variant11237, - Variant11238, - Variant11239, - Variant11240, - Variant11241, - Variant11242, - Variant11243, - Variant11244, - Variant11245, - Variant11246, - Variant11247, - Variant11248, - Variant11249, - Variant11250, - Variant11251, - Variant11252, - Variant11253, - Variant11254, - Variant11255, - Variant11256, - Variant11257, - Variant11258, - Variant11259, - Variant11260, - Variant11261, - Variant11262, - Variant11263, - Variant11264, - Variant11265, - Variant11266, - Variant11267, - Variant11268, - Variant11269, - Variant11270, - Variant11271, - Variant11272, - Variant11273, - Variant11274, - Variant11275, - Variant11276, - Variant11277, - Variant11278, - Variant11279, - Variant11280, - Variant11281, - Variant11282, - Variant11283, - Variant11284, - Variant11285, - Variant11286, - Variant11287, - Variant11288, - Variant11289, - Variant11290, - Variant11291, - Variant11292, - Variant11293, - Variant11294, - Variant11295, - Variant11296, - Variant11297, - Variant11298, - Variant11299, - Variant11300, - Variant11301, - Variant11302, - Variant11303, - Variant11304, - Variant11305, - Variant11306, - Variant11307, - Variant11308, - Variant11309, - Variant11310, - Variant11311, - Variant11312, - Variant11313, - Variant11314, - Variant11315, - Variant11316, - Variant11317, - Variant11318, - Variant11319, - Variant11320, - Variant11321, - Variant11322, - Variant11323, - Variant11324, - Variant11325, - Variant11326, - Variant11327, - Variant11328, - Variant11329, - Variant11330, - Variant11331, - Variant11332, - Variant11333, - Variant11334, - Variant11335, - Variant11336, - Variant11337, - Variant11338, - Variant11339, - Variant11340, - Variant11341, - Variant11342, - Variant11343, - Variant11344, - Variant11345, - Variant11346, - Variant11347, - Variant11348, - Variant11349, - Variant11350, - Variant11351, - Variant11352, - Variant11353, - Variant11354, - Variant11355, - Variant11356, - Variant11357, - Variant11358, - Variant11359, - Variant11360, - Variant11361, - Variant11362, - Variant11363, - Variant11364, - Variant11365, - Variant11366, - Variant11367, - Variant11368, - Variant11369, - Variant11370, - Variant11371, - Variant11372, - Variant11373, - Variant11374, - Variant11375, - Variant11376, - Variant11377, - Variant11378, - Variant11379, - Variant11380, - Variant11381, - Variant11382, - Variant11383, - Variant11384, - Variant11385, - Variant11386, - Variant11387, - Variant11388, - Variant11389, - Variant11390, - Variant11391, - Variant11392, - Variant11393, - Variant11394, - Variant11395, - Variant11396, - Variant11397, - Variant11398, - Variant11399, - Variant11400, - Variant11401, - Variant11402, - Variant11403, - Variant11404, - Variant11405, - Variant11406, - Variant11407, - Variant11408, - Variant11409, - Variant11410, - Variant11411, - Variant11412, - Variant11413, - Variant11414, - Variant11415, - Variant11416, - Variant11417, - Variant11418, - Variant11419, - Variant11420, - Variant11421, - Variant11422, - Variant11423, - Variant11424, - Variant11425, - Variant11426, - Variant11427, - Variant11428, - Variant11429, - Variant11430, - Variant11431, - Variant11432, - Variant11433, - Variant11434, - Variant11435, - Variant11436, - Variant11437, - Variant11438, - Variant11439, - Variant11440, - Variant11441, - Variant11442, - Variant11443, - Variant11444, - Variant11445, - Variant11446, - Variant11447, - Variant11448, - Variant11449, - Variant11450, - Variant11451, - Variant11452, - Variant11453, - Variant11454, - Variant11455, - Variant11456, - Variant11457, - Variant11458, - Variant11459, - Variant11460, - Variant11461, - Variant11462, - Variant11463, - Variant11464, - Variant11465, - Variant11466, - Variant11467, - Variant11468, - Variant11469, - Variant11470, - Variant11471, - Variant11472, - Variant11473, - Variant11474, - Variant11475, - Variant11476, - Variant11477, - Variant11478, - Variant11479, - Variant11480, - Variant11481, - Variant11482, - Variant11483, - Variant11484, - Variant11485, - Variant11486, - Variant11487, - Variant11488, - Variant11489, - Variant11490, - Variant11491, - Variant11492, - Variant11493, - Variant11494, - Variant11495, - Variant11496, - Variant11497, - Variant11498, - Variant11499, - Variant11500, - Variant11501, - Variant11502, - Variant11503, - Variant11504, - Variant11505, - Variant11506, - Variant11507, - Variant11508, - Variant11509, - Variant11510, - Variant11511, - Variant11512, - Variant11513, - Variant11514, - Variant11515, - Variant11516, - Variant11517, - Variant11518, - Variant11519, - Variant11520, - Variant11521, - Variant11522, - Variant11523, - Variant11524, - Variant11525, - Variant11526, - Variant11527, - Variant11528, - Variant11529, - Variant11530, - Variant11531, - Variant11532, - Variant11533, - Variant11534, - Variant11535, - Variant11536, - Variant11537, - Variant11538, - Variant11539, - Variant11540, - Variant11541, - Variant11542, - Variant11543, - Variant11544, - Variant11545, - Variant11546, - Variant11547, - Variant11548, - Variant11549, - Variant11550, - Variant11551, - Variant11552, - Variant11553, - Variant11554, - Variant11555, - Variant11556, - Variant11557, - Variant11558, - Variant11559, - Variant11560, - Variant11561, - Variant11562, - Variant11563, - Variant11564, - Variant11565, - Variant11566, - Variant11567, - Variant11568, - Variant11569, - Variant11570, - Variant11571, - Variant11572, - Variant11573, - Variant11574, - Variant11575, - Variant11576, - Variant11577, - Variant11578, - Variant11579, - Variant11580, - Variant11581, - Variant11582, - Variant11583, - Variant11584, - Variant11585, - Variant11586, - Variant11587, - Variant11588, - Variant11589, - Variant11590, - Variant11591, - Variant11592, - Variant11593, - Variant11594, - Variant11595, - Variant11596, - Variant11597, - Variant11598, - Variant11599, - Variant11600, - Variant11601, - Variant11602, - Variant11603, - Variant11604, - Variant11605, - Variant11606, - Variant11607, - Variant11608, - Variant11609, - Variant11610, - Variant11611, - Variant11612, - Variant11613, - Variant11614, - Variant11615, - Variant11616, - Variant11617, - Variant11618, - Variant11619, - Variant11620, - Variant11621, - Variant11622, - Variant11623, - Variant11624, - Variant11625, - Variant11626, - Variant11627, - Variant11628, - Variant11629, - Variant11630, - Variant11631, - Variant11632, - Variant11633, - Variant11634, - Variant11635, - Variant11636, - Variant11637, - Variant11638, - Variant11639, - Variant11640, - Variant11641, - Variant11642, - Variant11643, - Variant11644, - Variant11645, - Variant11646, - Variant11647, - Variant11648, - Variant11649, - Variant11650, - Variant11651, - Variant11652, - Variant11653, - Variant11654, - Variant11655, - Variant11656, - Variant11657, - Variant11658, - Variant11659, - Variant11660, - Variant11661, - Variant11662, - Variant11663, - Variant11664, - Variant11665, - Variant11666, - Variant11667, - Variant11668, - Variant11669, - Variant11670, - Variant11671, - Variant11672, - Variant11673, - Variant11674, - Variant11675, - Variant11676, - Variant11677, - Variant11678, - Variant11679, - Variant11680, - Variant11681, - Variant11682, - Variant11683, - Variant11684, - Variant11685, - Variant11686, - Variant11687, - Variant11688, - Variant11689, - Variant11690, - Variant11691, - Variant11692, - Variant11693, - Variant11694, - Variant11695, - Variant11696, - Variant11697, - Variant11698, - Variant11699, - Variant11700, - Variant11701, - Variant11702, - Variant11703, - Variant11704, - Variant11705, - Variant11706, - Variant11707, - Variant11708, - Variant11709, - Variant11710, - Variant11711, - Variant11712, - Variant11713, - Variant11714, - Variant11715, - Variant11716, - Variant11717, - Variant11718, - Variant11719, - Variant11720, - Variant11721, - Variant11722, - Variant11723, - Variant11724, - Variant11725, - Variant11726, - Variant11727, - Variant11728, - Variant11729, - Variant11730, - Variant11731, - Variant11732, - Variant11733, - Variant11734, - Variant11735, - Variant11736, - Variant11737, - Variant11738, - Variant11739, - Variant11740, - Variant11741, - Variant11742, - Variant11743, - Variant11744, - Variant11745, - Variant11746, - Variant11747, - Variant11748, - Variant11749, - Variant11750, - Variant11751, - Variant11752, - Variant11753, - Variant11754, - Variant11755, - Variant11756, - Variant11757, - Variant11758, - Variant11759, - Variant11760, - Variant11761, - Variant11762, - Variant11763, - Variant11764, - Variant11765, - Variant11766, - Variant11767, - Variant11768, - Variant11769, - Variant11770, - Variant11771, - Variant11772, - Variant11773, - Variant11774, - Variant11775, - Variant11776, - Variant11777, - Variant11778, - Variant11779, - Variant11780, - Variant11781, - Variant11782, - Variant11783, - Variant11784, - Variant11785, - Variant11786, - Variant11787, - Variant11788, - Variant11789, - Variant11790, - Variant11791, - Variant11792, - Variant11793, - Variant11794, - Variant11795, - Variant11796, - Variant11797, - Variant11798, - Variant11799, - Variant11800, - Variant11801, - Variant11802, - Variant11803, - Variant11804, - Variant11805, - Variant11806, - Variant11807, - Variant11808, - Variant11809, - Variant11810, - Variant11811, - Variant11812, - Variant11813, - Variant11814, - Variant11815, - Variant11816, - Variant11817, - Variant11818, - Variant11819, - Variant11820, - Variant11821, - Variant11822, - Variant11823, - Variant11824, - Variant11825, - Variant11826, - Variant11827, - Variant11828, - Variant11829, - Variant11830, - Variant11831, - Variant11832, - Variant11833, - Variant11834, - Variant11835, - Variant11836, - Variant11837, - Variant11838, - Variant11839, - Variant11840, - Variant11841, - Variant11842, - Variant11843, - Variant11844, - Variant11845, - Variant11846, - Variant11847, - Variant11848, - Variant11849, - Variant11850, - Variant11851, - Variant11852, - Variant11853, - Variant11854, - Variant11855, - Variant11856, - Variant11857, - Variant11858, - Variant11859, - Variant11860, - Variant11861, - Variant11862, - Variant11863, - Variant11864, - Variant11865, - Variant11866, - Variant11867, - Variant11868, - Variant11869, - Variant11870, - Variant11871, - Variant11872, - Variant11873, - Variant11874, - Variant11875, - Variant11876, - Variant11877, - Variant11878, - Variant11879, - Variant11880, - Variant11881, - Variant11882, - Variant11883, - Variant11884, - Variant11885, - Variant11886, - Variant11887, - Variant11888, - Variant11889, - Variant11890, - Variant11891, - Variant11892, - Variant11893, - Variant11894, - Variant11895, - Variant11896, - Variant11897, - Variant11898, - Variant11899, - Variant11900, - Variant11901, - Variant11902, - Variant11903, - Variant11904, - Variant11905, - Variant11906, - Variant11907, - Variant11908, - Variant11909, - Variant11910, - Variant11911, - Variant11912, - Variant11913, - Variant11914, - Variant11915, - Variant11916, - Variant11917, - Variant11918, - Variant11919, - Variant11920, - Variant11921, - Variant11922, - Variant11923, - Variant11924, - Variant11925, - Variant11926, - Variant11927, - Variant11928, - Variant11929, - Variant11930, - Variant11931, - Variant11932, - Variant11933, - Variant11934, - Variant11935, - Variant11936, - Variant11937, - Variant11938, - Variant11939, - Variant11940, - Variant11941, - Variant11942, - Variant11943, - Variant11944, - Variant11945, - Variant11946, - Variant11947, - Variant11948, - Variant11949, - Variant11950, - Variant11951, - Variant11952, - Variant11953, - Variant11954, - Variant11955, - Variant11956, - Variant11957, - Variant11958, - Variant11959, - Variant11960, - Variant11961, - Variant11962, - Variant11963, - Variant11964, - Variant11965, - Variant11966, - Variant11967, - Variant11968, - Variant11969, - Variant11970, - Variant11971, - Variant11972, - Variant11973, - Variant11974, - Variant11975, - Variant11976, - Variant11977, - Variant11978, - Variant11979, - Variant11980, - Variant11981, - Variant11982, - Variant11983, - Variant11984, - Variant11985, - Variant11986, - Variant11987, - Variant11988, - Variant11989, - Variant11990, - Variant11991, - Variant11992, - Variant11993, - Variant11994, - Variant11995, - Variant11996, - Variant11997, - Variant11998, - Variant11999, - Variant12000, - Variant12001, - Variant12002, - Variant12003, - Variant12004, - Variant12005, - Variant12006, - Variant12007, - Variant12008, - Variant12009, - Variant12010, - Variant12011, - Variant12012, - Variant12013, - Variant12014, - Variant12015, - Variant12016, - Variant12017, - Variant12018, - Variant12019, - Variant12020, - Variant12021, - Variant12022, - Variant12023, - Variant12024, - Variant12025, - Variant12026, - Variant12027, - Variant12028, - Variant12029, - Variant12030, - Variant12031, - Variant12032, - Variant12033, - Variant12034, - Variant12035, - Variant12036, - Variant12037, - Variant12038, - Variant12039, - Variant12040, - Variant12041, - Variant12042, - Variant12043, - Variant12044, - Variant12045, - Variant12046, - Variant12047, - Variant12048, - Variant12049, - Variant12050, - Variant12051, - Variant12052, - Variant12053, - Variant12054, - Variant12055, - Variant12056, - Variant12057, - Variant12058, - Variant12059, - Variant12060, - Variant12061, - Variant12062, - Variant12063, - Variant12064, - Variant12065, - Variant12066, - Variant12067, - Variant12068, - Variant12069, - Variant12070, - Variant12071, - Variant12072, - Variant12073, - Variant12074, - Variant12075, - Variant12076, - Variant12077, - Variant12078, - Variant12079, - Variant12080, - Variant12081, - Variant12082, - Variant12083, - Variant12084, - Variant12085, - Variant12086, - Variant12087, - Variant12088, - Variant12089, - Variant12090, - Variant12091, - Variant12092, - Variant12093, - Variant12094, - Variant12095, - Variant12096, - Variant12097, - Variant12098, - Variant12099, - Variant12100, - Variant12101, - Variant12102, - Variant12103, - Variant12104, - Variant12105, - Variant12106, - Variant12107, - Variant12108, - Variant12109, - Variant12110, - Variant12111, - Variant12112, - Variant12113, - Variant12114, - Variant12115, - Variant12116, - Variant12117, - Variant12118, - Variant12119, - Variant12120, - Variant12121, - Variant12122, - Variant12123, - Variant12124, - Variant12125, - Variant12126, - Variant12127, - Variant12128, - Variant12129, - Variant12130, - Variant12131, - Variant12132, - Variant12133, - Variant12134, - Variant12135, - Variant12136, - Variant12137, - Variant12138, - Variant12139, - Variant12140, - Variant12141, - Variant12142, - Variant12143, - Variant12144, - Variant12145, - Variant12146, - Variant12147, - Variant12148, - Variant12149, - Variant12150, - Variant12151, - Variant12152, - Variant12153, - Variant12154, - Variant12155, - Variant12156, - Variant12157, - Variant12158, - Variant12159, - Variant12160, - Variant12161, - Variant12162, - Variant12163, - Variant12164, - Variant12165, - Variant12166, - Variant12167, - Variant12168, - Variant12169, - Variant12170, - Variant12171, - Variant12172, - Variant12173, - Variant12174, - Variant12175, - Variant12176, - Variant12177, - Variant12178, - Variant12179, - Variant12180, - Variant12181, - Variant12182, - Variant12183, - Variant12184, - Variant12185, - Variant12186, - Variant12187, - Variant12188, - Variant12189, - Variant12190, - Variant12191, - Variant12192, - Variant12193, - Variant12194, - Variant12195, - Variant12196, - Variant12197, - Variant12198, - Variant12199, - Variant12200, - Variant12201, - Variant12202, - Variant12203, - Variant12204, - Variant12205, - Variant12206, - Variant12207, - Variant12208, - Variant12209, - Variant12210, - Variant12211, - Variant12212, - Variant12213, - Variant12214, - Variant12215, - Variant12216, - Variant12217, - Variant12218, - Variant12219, - Variant12220, - Variant12221, - Variant12222, - Variant12223, - Variant12224, - Variant12225, - Variant12226, - Variant12227, - Variant12228, - Variant12229, - Variant12230, - Variant12231, - Variant12232, - Variant12233, - Variant12234, - Variant12235, - Variant12236, - Variant12237, - Variant12238, - Variant12239, - Variant12240, - Variant12241, - Variant12242, - Variant12243, - Variant12244, - Variant12245, - Variant12246, - Variant12247, - Variant12248, - Variant12249, - Variant12250, - Variant12251, - Variant12252, - Variant12253, - Variant12254, - Variant12255, - Variant12256, - Variant12257, - Variant12258, - Variant12259, - Variant12260, - Variant12261, - Variant12262, - Variant12263, - Variant12264, - Variant12265, - Variant12266, - Variant12267, - Variant12268, - Variant12269, - Variant12270, - Variant12271, - Variant12272, - Variant12273, - Variant12274, - Variant12275, - Variant12276, - Variant12277, - Variant12278, - Variant12279, - Variant12280, - Variant12281, - Variant12282, - Variant12283, - Variant12284, - Variant12285, - Variant12286, - Variant12287, - Variant12288, - Variant12289, - Variant12290, - Variant12291, - Variant12292, - Variant12293, - Variant12294, - Variant12295, - Variant12296, - Variant12297, - Variant12298, - Variant12299, - Variant12300, - Variant12301, - Variant12302, - Variant12303, - Variant12304, - Variant12305, - Variant12306, - Variant12307, - Variant12308, - Variant12309, - Variant12310, - Variant12311, - Variant12312, - Variant12313, - Variant12314, - Variant12315, - Variant12316, - Variant12317, - Variant12318, - Variant12319, - Variant12320, - Variant12321, - Variant12322, - Variant12323, - Variant12324, - Variant12325, - Variant12326, - Variant12327, - Variant12328, - Variant12329, - Variant12330, - Variant12331, - Variant12332, - Variant12333, - Variant12334, - Variant12335, - Variant12336, - Variant12337, - Variant12338, - Variant12339, - Variant12340, - Variant12341, - Variant12342, - Variant12343, - Variant12344, - Variant12345, - Variant12346, - Variant12347, - Variant12348, - Variant12349, - Variant12350, - Variant12351, - Variant12352, - Variant12353, - Variant12354, - Variant12355, - Variant12356, - Variant12357, - Variant12358, - Variant12359, - Variant12360, - Variant12361, - Variant12362, - Variant12363, - Variant12364, - Variant12365, - Variant12366, - Variant12367, - Variant12368, - Variant12369, - Variant12370, - Variant12371, - Variant12372, - Variant12373, - Variant12374, - Variant12375, - Variant12376, - Variant12377, - Variant12378, - Variant12379, - Variant12380, - Variant12381, - Variant12382, - Variant12383, - Variant12384, - Variant12385, - Variant12386, - Variant12387, - Variant12388, - Variant12389, - Variant12390, - Variant12391, - Variant12392, - Variant12393, - Variant12394, - Variant12395, - Variant12396, - Variant12397, - Variant12398, - Variant12399, - Variant12400, - Variant12401, - Variant12402, - Variant12403, - Variant12404, - Variant12405, - Variant12406, - Variant12407, - Variant12408, - Variant12409, - Variant12410, - Variant12411, - Variant12412, - Variant12413, - Variant12414, - Variant12415, - Variant12416, - Variant12417, - Variant12418, - Variant12419, - Variant12420, - Variant12421, - Variant12422, - Variant12423, - Variant12424, - Variant12425, - Variant12426, - Variant12427, - Variant12428, - Variant12429, - Variant12430, - Variant12431, - Variant12432, - Variant12433, - Variant12434, - Variant12435, - Variant12436, - Variant12437, - Variant12438, - Variant12439, - Variant12440, - Variant12441, - Variant12442, - Variant12443, - Variant12444, - Variant12445, - Variant12446, - Variant12447, - Variant12448, - Variant12449, - Variant12450, - Variant12451, - Variant12452, - Variant12453, - Variant12454, - Variant12455, - Variant12456, - Variant12457, - Variant12458, - Variant12459, - Variant12460, - Variant12461, - Variant12462, - Variant12463, - Variant12464, - Variant12465, - Variant12466, - Variant12467, - Variant12468, - Variant12469, - Variant12470, - Variant12471, - Variant12472, - Variant12473, - Variant12474, - Variant12475, - Variant12476, - Variant12477, - Variant12478, - Variant12479, - Variant12480, - Variant12481, - Variant12482, - Variant12483, - Variant12484, - Variant12485, - Variant12486, - Variant12487, - Variant12488, - Variant12489, - Variant12490, - Variant12491, - Variant12492, - Variant12493, - Variant12494, - Variant12495, - Variant12496, - Variant12497, - Variant12498, - Variant12499, - Variant12500, - Variant12501, - Variant12502, - Variant12503, - Variant12504, - Variant12505, - Variant12506, - Variant12507, - Variant12508, - Variant12509, - Variant12510, - Variant12511, - Variant12512, - Variant12513, - Variant12514, - Variant12515, - Variant12516, - Variant12517, - Variant12518, - Variant12519, - Variant12520, - Variant12521, - Variant12522, - Variant12523, - Variant12524, - Variant12525, - Variant12526, - Variant12527, - Variant12528, - Variant12529, - Variant12530, - Variant12531, - Variant12532, - Variant12533, - Variant12534, - Variant12535, - Variant12536, - Variant12537, - Variant12538, - Variant12539, - Variant12540, - Variant12541, - Variant12542, - Variant12543, - Variant12544, - Variant12545, - Variant12546, - Variant12547, - Variant12548, - Variant12549, - Variant12550, - Variant12551, - Variant12552, - Variant12553, - Variant12554, - Variant12555, - Variant12556, - Variant12557, - Variant12558, - Variant12559, - Variant12560, - Variant12561, - Variant12562, - Variant12563, - Variant12564, - Variant12565, - Variant12566, - Variant12567, - Variant12568, - Variant12569, - Variant12570, - Variant12571, - Variant12572, - Variant12573, - Variant12574, - Variant12575, - Variant12576, - Variant12577, - Variant12578, - Variant12579, - Variant12580, - Variant12581, - Variant12582, - Variant12583, - Variant12584, - Variant12585, - Variant12586, - Variant12587, - Variant12588, - Variant12589, - Variant12590, - Variant12591, - Variant12592, - Variant12593, - Variant12594, - Variant12595, - Variant12596, - Variant12597, - Variant12598, - Variant12599, - Variant12600, - Variant12601, - Variant12602, - Variant12603, - Variant12604, - Variant12605, - Variant12606, - Variant12607, - Variant12608, - Variant12609, - Variant12610, - Variant12611, - Variant12612, - Variant12613, - Variant12614, - Variant12615, - Variant12616, - Variant12617, - Variant12618, - Variant12619, - Variant12620, - Variant12621, - Variant12622, - Variant12623, - Variant12624, - Variant12625, - Variant12626, - Variant12627, - Variant12628, - Variant12629, - Variant12630, - Variant12631, - Variant12632, - Variant12633, - Variant12634, - Variant12635, - Variant12636, - Variant12637, - Variant12638, - Variant12639, - Variant12640, - Variant12641, - Variant12642, - Variant12643, - Variant12644, - Variant12645, - Variant12646, - Variant12647, - Variant12648, - Variant12649, - Variant12650, - Variant12651, - Variant12652, - Variant12653, - Variant12654, - Variant12655, - Variant12656, - Variant12657, - Variant12658, - Variant12659, - Variant12660, - Variant12661, - Variant12662, - Variant12663, - Variant12664, - Variant12665, - Variant12666, - Variant12667, - Variant12668, - Variant12669, - Variant12670, - Variant12671, - Variant12672, - Variant12673, - Variant12674, - Variant12675, - Variant12676, - Variant12677, - Variant12678, - Variant12679, - Variant12680, - Variant12681, - Variant12682, - Variant12683, - Variant12684, - Variant12685, - Variant12686, - Variant12687, - Variant12688, - Variant12689, - Variant12690, - Variant12691, - Variant12692, - Variant12693, - Variant12694, - Variant12695, - Variant12696, - Variant12697, - Variant12698, - Variant12699, - Variant12700, - Variant12701, - Variant12702, - Variant12703, - Variant12704, - Variant12705, - Variant12706, - Variant12707, - Variant12708, - Variant12709, - Variant12710, - Variant12711, - Variant12712, - Variant12713, - Variant12714, - Variant12715, - Variant12716, - Variant12717, - Variant12718, - Variant12719, - Variant12720, - Variant12721, - Variant12722, - Variant12723, - Variant12724, - Variant12725, - Variant12726, - Variant12727, - Variant12728, - Variant12729, - Variant12730, - Variant12731, - Variant12732, - Variant12733, - Variant12734, - Variant12735, - Variant12736, - Variant12737, - Variant12738, - Variant12739, - Variant12740, - Variant12741, - Variant12742, - Variant12743, - Variant12744, - Variant12745, - Variant12746, - Variant12747, - Variant12748, - Variant12749, - Variant12750, - Variant12751, - Variant12752, - Variant12753, - Variant12754, - Variant12755, - Variant12756, - Variant12757, - Variant12758, - Variant12759, - Variant12760, - Variant12761, - Variant12762, - Variant12763, - Variant12764, - Variant12765, - Variant12766, - Variant12767, - Variant12768, - Variant12769, - Variant12770, - Variant12771, - Variant12772, - Variant12773, - Variant12774, - Variant12775, - Variant12776, - Variant12777, - Variant12778, - Variant12779, - Variant12780, - Variant12781, - Variant12782, - Variant12783, - Variant12784, - Variant12785, - Variant12786, - Variant12787, - Variant12788, - Variant12789, - Variant12790, - Variant12791, - Variant12792, - Variant12793, - Variant12794, - Variant12795, - Variant12796, - Variant12797, - Variant12798, - Variant12799, - Variant12800, - Variant12801, - Variant12802, - Variant12803, - Variant12804, - Variant12805, - Variant12806, - Variant12807, - Variant12808, - Variant12809, - Variant12810, - Variant12811, - Variant12812, - Variant12813, - Variant12814, - Variant12815, - Variant12816, - Variant12817, - Variant12818, - Variant12819, - Variant12820, - Variant12821, - Variant12822, - Variant12823, - Variant12824, - Variant12825, - Variant12826, - Variant12827, - Variant12828, - Variant12829, - Variant12830, - Variant12831, - Variant12832, - Variant12833, - Variant12834, - Variant12835, - Variant12836, - Variant12837, - Variant12838, - Variant12839, - Variant12840, - Variant12841, - Variant12842, - Variant12843, - Variant12844, - Variant12845, - Variant12846, - Variant12847, - Variant12848, - Variant12849, - Variant12850, - Variant12851, - Variant12852, - Variant12853, - Variant12854, - Variant12855, - Variant12856, - Variant12857, - Variant12858, - Variant12859, - Variant12860, - Variant12861, - Variant12862, - Variant12863, - Variant12864, - Variant12865, - Variant12866, - Variant12867, - Variant12868, - Variant12869, - Variant12870, - Variant12871, - Variant12872, - Variant12873, - Variant12874, - Variant12875, - Variant12876, - Variant12877, - Variant12878, - Variant12879, - Variant12880, - Variant12881, - Variant12882, - Variant12883, - Variant12884, - Variant12885, - Variant12886, - Variant12887, - Variant12888, - Variant12889, - Variant12890, - Variant12891, - Variant12892, - Variant12893, - Variant12894, - Variant12895, - Variant12896, - Variant12897, - Variant12898, - Variant12899, - Variant12900, - Variant12901, - Variant12902, - Variant12903, - Variant12904, - Variant12905, - Variant12906, - Variant12907, - Variant12908, - Variant12909, - Variant12910, - Variant12911, - Variant12912, - Variant12913, - Variant12914, - Variant12915, - Variant12916, - Variant12917, - Variant12918, - Variant12919, - Variant12920, - Variant12921, - Variant12922, - Variant12923, - Variant12924, - Variant12925, - Variant12926, - Variant12927, - Variant12928, - Variant12929, - Variant12930, - Variant12931, - Variant12932, - Variant12933, - Variant12934, - Variant12935, - Variant12936, - Variant12937, - Variant12938, - Variant12939, - Variant12940, - Variant12941, - Variant12942, - Variant12943, - Variant12944, - Variant12945, - Variant12946, - Variant12947, - Variant12948, - Variant12949, - Variant12950, - Variant12951, - Variant12952, - Variant12953, - Variant12954, - Variant12955, - Variant12956, - Variant12957, - Variant12958, - Variant12959, - Variant12960, - Variant12961, - Variant12962, - Variant12963, - Variant12964, - Variant12965, - Variant12966, - Variant12967, - Variant12968, - Variant12969, - Variant12970, - Variant12971, - Variant12972, - Variant12973, - Variant12974, - Variant12975, - Variant12976, - Variant12977, - Variant12978, - Variant12979, - Variant12980, - Variant12981, - Variant12982, - Variant12983, - Variant12984, - Variant12985, - Variant12986, - Variant12987, - Variant12988, - Variant12989, - Variant12990, - Variant12991, - Variant12992, - Variant12993, - Variant12994, - Variant12995, - Variant12996, - Variant12997, - Variant12998, - Variant12999, - Variant13000, - Variant13001, - Variant13002, - Variant13003, - Variant13004, - Variant13005, - Variant13006, - Variant13007, - Variant13008, - Variant13009, - Variant13010, - Variant13011, - Variant13012, - Variant13013, - Variant13014, - Variant13015, - Variant13016, - Variant13017, - Variant13018, - Variant13019, - Variant13020, - Variant13021, - Variant13022, - Variant13023, - Variant13024, - Variant13025, - Variant13026, - Variant13027, - Variant13028, - Variant13029, - Variant13030, - Variant13031, - Variant13032, - Variant13033, - Variant13034, - Variant13035, - Variant13036, - Variant13037, - Variant13038, - Variant13039, - Variant13040, - Variant13041, - Variant13042, - Variant13043, - Variant13044, - Variant13045, - Variant13046, - Variant13047, - Variant13048, - Variant13049, - Variant13050, - Variant13051, - Variant13052, - Variant13053, - Variant13054, - Variant13055, - Variant13056, - Variant13057, - Variant13058, - Variant13059, - Variant13060, - Variant13061, - Variant13062, - Variant13063, - Variant13064, - Variant13065, - Variant13066, - Variant13067, - Variant13068, - Variant13069, - Variant13070, - Variant13071, - Variant13072, - Variant13073, - Variant13074, - Variant13075, - Variant13076, - Variant13077, - Variant13078, - Variant13079, - Variant13080, - Variant13081, - Variant13082, - Variant13083, - Variant13084, - Variant13085, - Variant13086, - Variant13087, - Variant13088, - Variant13089, - Variant13090, - Variant13091, - Variant13092, - Variant13093, - Variant13094, - Variant13095, - Variant13096, - Variant13097, - Variant13098, - Variant13099, - Variant13100, - Variant13101, - Variant13102, - Variant13103, - Variant13104, - Variant13105, - Variant13106, - Variant13107, - Variant13108, - Variant13109, - Variant13110, - Variant13111, - Variant13112, - Variant13113, - Variant13114, - Variant13115, - Variant13116, - Variant13117, - Variant13118, - Variant13119, - Variant13120, - Variant13121, - Variant13122, - Variant13123, - Variant13124, - Variant13125, - Variant13126, - Variant13127, - Variant13128, - Variant13129, - Variant13130, - Variant13131, - Variant13132, - Variant13133, - Variant13134, - Variant13135, - Variant13136, - Variant13137, - Variant13138, - Variant13139, - Variant13140, - Variant13141, - Variant13142, - Variant13143, - Variant13144, - Variant13145, - Variant13146, - Variant13147, - Variant13148, - Variant13149, - Variant13150, - Variant13151, - Variant13152, - Variant13153, - Variant13154, - Variant13155, - Variant13156, - Variant13157, - Variant13158, - Variant13159, - Variant13160, - Variant13161, - Variant13162, - Variant13163, - Variant13164, - Variant13165, - Variant13166, - Variant13167, - Variant13168, - Variant13169, - Variant13170, - Variant13171, - Variant13172, - Variant13173, - Variant13174, - Variant13175, - Variant13176, - Variant13177, - Variant13178, - Variant13179, - Variant13180, - Variant13181, - Variant13182, - Variant13183, - Variant13184, - Variant13185, - Variant13186, - Variant13187, - Variant13188, - Variant13189, - Variant13190, - Variant13191, - Variant13192, - Variant13193, - Variant13194, - Variant13195, - Variant13196, - Variant13197, - Variant13198, - Variant13199, - Variant13200, - Variant13201, - Variant13202, - Variant13203, - Variant13204, - Variant13205, - Variant13206, - Variant13207, - Variant13208, - Variant13209, - Variant13210, - Variant13211, - Variant13212, - Variant13213, - Variant13214, - Variant13215, - Variant13216, - Variant13217, - Variant13218, - Variant13219, - Variant13220, - Variant13221, - Variant13222, - Variant13223, - Variant13224, - Variant13225, - Variant13226, - Variant13227, - Variant13228, - Variant13229, - Variant13230, - Variant13231, - Variant13232, - Variant13233, - Variant13234, - Variant13235, - Variant13236, - Variant13237, - Variant13238, - Variant13239, - Variant13240, - Variant13241, - Variant13242, - Variant13243, - Variant13244, - Variant13245, - Variant13246, - Variant13247, - Variant13248, - Variant13249, - Variant13250, - Variant13251, - Variant13252, - Variant13253, - Variant13254, - Variant13255, - Variant13256, - Variant13257, - Variant13258, - Variant13259, - Variant13260, - Variant13261, - Variant13262, - Variant13263, - Variant13264, - Variant13265, - Variant13266, - Variant13267, - Variant13268, - Variant13269, - Variant13270, - Variant13271, - Variant13272, - Variant13273, - Variant13274, - Variant13275, - Variant13276, - Variant13277, - Variant13278, - Variant13279, - Variant13280, - Variant13281, - Variant13282, - Variant13283, - Variant13284, - Variant13285, - Variant13286, - Variant13287, - Variant13288, - Variant13289, - Variant13290, - Variant13291, - Variant13292, - Variant13293, - Variant13294, - Variant13295, - Variant13296, - Variant13297, - Variant13298, - Variant13299, - Variant13300, - Variant13301, - Variant13302, - Variant13303, - Variant13304, - Variant13305, - Variant13306, - Variant13307, - Variant13308, - Variant13309, - Variant13310, - Variant13311, - Variant13312, - Variant13313, - Variant13314, - Variant13315, - Variant13316, - Variant13317, - Variant13318, - Variant13319, - Variant13320, - Variant13321, - Variant13322, - Variant13323, - Variant13324, - Variant13325, - Variant13326, - Variant13327, - Variant13328, - Variant13329, - Variant13330, - Variant13331, - Variant13332, - Variant13333, - Variant13334, - Variant13335, - Variant13336, - Variant13337, - Variant13338, - Variant13339, - Variant13340, - Variant13341, - Variant13342, - Variant13343, - Variant13344, - Variant13345, - Variant13346, - Variant13347, - Variant13348, - Variant13349, - Variant13350, - Variant13351, - Variant13352, - Variant13353, - Variant13354, - Variant13355, - Variant13356, - Variant13357, - Variant13358, - Variant13359, - Variant13360, - Variant13361, - Variant13362, - Variant13363, - Variant13364, - Variant13365, - Variant13366, - Variant13367, - Variant13368, - Variant13369, - Variant13370, - Variant13371, - Variant13372, - Variant13373, - Variant13374, - Variant13375, - Variant13376, - Variant13377, - Variant13378, - Variant13379, - Variant13380, - Variant13381, - Variant13382, - Variant13383, - Variant13384, - Variant13385, - Variant13386, - Variant13387, - Variant13388, - Variant13389, - Variant13390, - Variant13391, - Variant13392, - Variant13393, - Variant13394, - Variant13395, - Variant13396, - Variant13397, - Variant13398, - Variant13399, - Variant13400, - Variant13401, - Variant13402, - Variant13403, - Variant13404, - Variant13405, - Variant13406, - Variant13407, - Variant13408, - Variant13409, - Variant13410, - Variant13411, - Variant13412, - Variant13413, - Variant13414, - Variant13415, - Variant13416, - Variant13417, - Variant13418, - Variant13419, - Variant13420, - Variant13421, - Variant13422, - Variant13423, - Variant13424, - Variant13425, - Variant13426, - Variant13427, - Variant13428, - Variant13429, - Variant13430, - Variant13431, - Variant13432, - Variant13433, - Variant13434, - Variant13435, - Variant13436, - Variant13437, - Variant13438, - Variant13439, - Variant13440, - Variant13441, - Variant13442, - Variant13443, - Variant13444, - Variant13445, - Variant13446, - Variant13447, - Variant13448, - Variant13449, - Variant13450, - Variant13451, - Variant13452, - Variant13453, - Variant13454, - Variant13455, - Variant13456, - Variant13457, - Variant13458, - Variant13459, - Variant13460, - Variant13461, - Variant13462, - Variant13463, - Variant13464, - Variant13465, - Variant13466, - Variant13467, - Variant13468, - Variant13469, - Variant13470, - Variant13471, - Variant13472, - Variant13473, - Variant13474, - Variant13475, - Variant13476, - Variant13477, - Variant13478, - Variant13479, - Variant13480, - Variant13481, - Variant13482, - Variant13483, - Variant13484, - Variant13485, - Variant13486, - Variant13487, - Variant13488, - Variant13489, - Variant13490, - Variant13491, - Variant13492, - Variant13493, - Variant13494, - Variant13495, - Variant13496, - Variant13497, - Variant13498, - Variant13499, - Variant13500, - Variant13501, - Variant13502, - Variant13503, - Variant13504, - Variant13505, - Variant13506, - Variant13507, - Variant13508, - Variant13509, - Variant13510, - Variant13511, - Variant13512, - Variant13513, - Variant13514, - Variant13515, - Variant13516, - Variant13517, - Variant13518, - Variant13519, - Variant13520, - Variant13521, - Variant13522, - Variant13523, - Variant13524, - Variant13525, - Variant13526, - Variant13527, - Variant13528, - Variant13529, - Variant13530, - Variant13531, - Variant13532, - Variant13533, - Variant13534, - Variant13535, - Variant13536, - Variant13537, - Variant13538, - Variant13539, - Variant13540, - Variant13541, - Variant13542, - Variant13543, - Variant13544, - Variant13545, - Variant13546, - Variant13547, - Variant13548, - Variant13549, - Variant13550, - Variant13551, - Variant13552, - Variant13553, - Variant13554, - Variant13555, - Variant13556, - Variant13557, - Variant13558, - Variant13559, - Variant13560, - Variant13561, - Variant13562, - Variant13563, - Variant13564, - Variant13565, - Variant13566, - Variant13567, - Variant13568, - Variant13569, - Variant13570, - Variant13571, - Variant13572, - Variant13573, - Variant13574, - Variant13575, - Variant13576, - Variant13577, - Variant13578, - Variant13579, - Variant13580, - Variant13581, - Variant13582, - Variant13583, - Variant13584, - Variant13585, - Variant13586, - Variant13587, - Variant13588, - Variant13589, - Variant13590, - Variant13591, - Variant13592, - Variant13593, - Variant13594, - Variant13595, - Variant13596, - Variant13597, - Variant13598, - Variant13599, - Variant13600, - Variant13601, - Variant13602, - Variant13603, - Variant13604, - Variant13605, - Variant13606, - Variant13607, - Variant13608, - Variant13609, - Variant13610, - Variant13611, - Variant13612, - Variant13613, - Variant13614, - Variant13615, - Variant13616, - Variant13617, - Variant13618, - Variant13619, - Variant13620, - Variant13621, - Variant13622, - Variant13623, - Variant13624, - Variant13625, - Variant13626, - Variant13627, - Variant13628, - Variant13629, - Variant13630, - Variant13631, - Variant13632, - Variant13633, - Variant13634, - Variant13635, - Variant13636, - Variant13637, - Variant13638, - Variant13639, - Variant13640, - Variant13641, - Variant13642, - Variant13643, - Variant13644, - Variant13645, - Variant13646, - Variant13647, - Variant13648, - Variant13649, - Variant13650, - Variant13651, - Variant13652, - Variant13653, - Variant13654, - Variant13655, - Variant13656, - Variant13657, - Variant13658, - Variant13659, - Variant13660, - Variant13661, - Variant13662, - Variant13663, - Variant13664, - Variant13665, - Variant13666, - Variant13667, - Variant13668, - Variant13669, - Variant13670, - Variant13671, - Variant13672, - Variant13673, - Variant13674, - Variant13675, - Variant13676, - Variant13677, - Variant13678, - Variant13679, - Variant13680, - Variant13681, - Variant13682, - Variant13683, - Variant13684, - Variant13685, - Variant13686, - Variant13687, - Variant13688, - Variant13689, - Variant13690, - Variant13691, - Variant13692, - Variant13693, - Variant13694, - Variant13695, - Variant13696, - Variant13697, - Variant13698, - Variant13699, - Variant13700, - Variant13701, - Variant13702, - Variant13703, - Variant13704, - Variant13705, - Variant13706, - Variant13707, - Variant13708, - Variant13709, - Variant13710, - Variant13711, - Variant13712, - Variant13713, - Variant13714, - Variant13715, - Variant13716, - Variant13717, - Variant13718, - Variant13719, - Variant13720, - Variant13721, - Variant13722, - Variant13723, - Variant13724, - Variant13725, - Variant13726, - Variant13727, - Variant13728, - Variant13729, - Variant13730, - Variant13731, - Variant13732, - Variant13733, - Variant13734, - Variant13735, - Variant13736, - Variant13737, - Variant13738, - Variant13739, - Variant13740, - Variant13741, - Variant13742, - Variant13743, - Variant13744, - Variant13745, - Variant13746, - Variant13747, - Variant13748, - Variant13749, - Variant13750, - Variant13751, - Variant13752, - Variant13753, - Variant13754, - Variant13755, - Variant13756, - Variant13757, - Variant13758, - Variant13759, - Variant13760, - Variant13761, - Variant13762, - Variant13763, - Variant13764, - Variant13765, - Variant13766, - Variant13767, - Variant13768, - Variant13769, - Variant13770, - Variant13771, - Variant13772, - Variant13773, - Variant13774, - Variant13775, - Variant13776, - Variant13777, - Variant13778, - Variant13779, - Variant13780, - Variant13781, - Variant13782, - Variant13783, - Variant13784, - Variant13785, - Variant13786, - Variant13787, - Variant13788, - Variant13789, - Variant13790, - Variant13791, - Variant13792, - Variant13793, - Variant13794, - Variant13795, - Variant13796, - Variant13797, - Variant13798, - Variant13799, - Variant13800, - Variant13801, - Variant13802, - Variant13803, - Variant13804, - Variant13805, - Variant13806, - Variant13807, - Variant13808, - Variant13809, - Variant13810, - Variant13811, - Variant13812, - Variant13813, - Variant13814, - Variant13815, - Variant13816, - Variant13817, - Variant13818, - Variant13819, - Variant13820, - Variant13821, - Variant13822, - Variant13823, - Variant13824, - Variant13825, - Variant13826, - Variant13827, - Variant13828, - Variant13829, - Variant13830, - Variant13831, - Variant13832, - Variant13833, - Variant13834, - Variant13835, - Variant13836, - Variant13837, - Variant13838, - Variant13839, - Variant13840, - Variant13841, - Variant13842, - Variant13843, - Variant13844, - Variant13845, - Variant13846, - Variant13847, - Variant13848, - Variant13849, - Variant13850, - Variant13851, - Variant13852, - Variant13853, - Variant13854, - Variant13855, - Variant13856, - Variant13857, - Variant13858, - Variant13859, - Variant13860, - Variant13861, - Variant13862, - Variant13863, - Variant13864, - Variant13865, - Variant13866, - Variant13867, - Variant13868, - Variant13869, - Variant13870, - Variant13871, - Variant13872, - Variant13873, - Variant13874, - Variant13875, - Variant13876, - Variant13877, - Variant13878, - Variant13879, - Variant13880, - Variant13881, - Variant13882, - Variant13883, - Variant13884, - Variant13885, - Variant13886, - Variant13887, - Variant13888, - Variant13889, - Variant13890, - Variant13891, - Variant13892, - Variant13893, - Variant13894, - Variant13895, - Variant13896, - Variant13897, - Variant13898, - Variant13899, - Variant13900, - Variant13901, - Variant13902, - Variant13903, - Variant13904, - Variant13905, - Variant13906, - Variant13907, - Variant13908, - Variant13909, - Variant13910, - Variant13911, - Variant13912, - Variant13913, - Variant13914, - Variant13915, - Variant13916, - Variant13917, - Variant13918, - Variant13919, - Variant13920, - Variant13921, - Variant13922, - Variant13923, - Variant13924, - Variant13925, - Variant13926, - Variant13927, - Variant13928, - Variant13929, - Variant13930, - Variant13931, - Variant13932, - Variant13933, - Variant13934, - Variant13935, - Variant13936, - Variant13937, - Variant13938, - Variant13939, - Variant13940, - Variant13941, - Variant13942, - Variant13943, - Variant13944, - Variant13945, - Variant13946, - Variant13947, - Variant13948, - Variant13949, - Variant13950, - Variant13951, - Variant13952, - Variant13953, - Variant13954, - Variant13955, - Variant13956, - Variant13957, - Variant13958, - Variant13959, - Variant13960, - Variant13961, - Variant13962, - Variant13963, - Variant13964, - Variant13965, - Variant13966, - Variant13967, - Variant13968, - Variant13969, - Variant13970, - Variant13971, - Variant13972, - Variant13973, - Variant13974, - Variant13975, - Variant13976, - Variant13977, - Variant13978, - Variant13979, - Variant13980, - Variant13981, - Variant13982, - Variant13983, - Variant13984, - Variant13985, - Variant13986, - Variant13987, - Variant13988, - Variant13989, - Variant13990, - Variant13991, - Variant13992, - Variant13993, - Variant13994, - Variant13995, - Variant13996, - Variant13997, - Variant13998, - Variant13999, - Variant14000, - Variant14001, - Variant14002, - Variant14003, - Variant14004, - Variant14005, - Variant14006, - Variant14007, - Variant14008, - Variant14009, - Variant14010, - Variant14011, - Variant14012, - Variant14013, - Variant14014, - Variant14015, - Variant14016, - Variant14017, - Variant14018, - Variant14019, - Variant14020, - Variant14021, - Variant14022, - Variant14023, - Variant14024, - Variant14025, - Variant14026, - Variant14027, - Variant14028, - Variant14029, - Variant14030, - Variant14031, - Variant14032, - Variant14033, - Variant14034, - Variant14035, - Variant14036, - Variant14037, - Variant14038, - Variant14039, - Variant14040, - Variant14041, - Variant14042, - Variant14043, - Variant14044, - Variant14045, - Variant14046, - Variant14047, - Variant14048, - Variant14049, - Variant14050, - Variant14051, - Variant14052, - Variant14053, - Variant14054, - Variant14055, - Variant14056, - Variant14057, - Variant14058, - Variant14059, - Variant14060, - Variant14061, - Variant14062, - Variant14063, - Variant14064, - Variant14065, - Variant14066, - Variant14067, - Variant14068, - Variant14069, - Variant14070, - Variant14071, - Variant14072, - Variant14073, - Variant14074, - Variant14075, - Variant14076, - Variant14077, - Variant14078, - Variant14079, - Variant14080, - Variant14081, - Variant14082, - Variant14083, - Variant14084, - Variant14085, - Variant14086, - Variant14087, - Variant14088, - Variant14089, - Variant14090, - Variant14091, - Variant14092, - Variant14093, - Variant14094, - Variant14095, - Variant14096, - Variant14097, - Variant14098, - Variant14099, - Variant14100, - Variant14101, - Variant14102, - Variant14103, - Variant14104, - Variant14105, - Variant14106, - Variant14107, - Variant14108, - Variant14109, - Variant14110, - Variant14111, - Variant14112, - Variant14113, - Variant14114, - Variant14115, - Variant14116, - Variant14117, - Variant14118, - Variant14119, - Variant14120, - Variant14121, - Variant14122, - Variant14123, - Variant14124, - Variant14125, - Variant14126, - Variant14127, - Variant14128, - Variant14129, - Variant14130, - Variant14131, - Variant14132, - Variant14133, - Variant14134, - Variant14135, - Variant14136, - Variant14137, - Variant14138, - Variant14139, - Variant14140, - Variant14141, - Variant14142, - Variant14143, - Variant14144, - Variant14145, - Variant14146, - Variant14147, - Variant14148, - Variant14149, - Variant14150, - Variant14151, - Variant14152, - Variant14153, - Variant14154, - Variant14155, - Variant14156, - Variant14157, - Variant14158, - Variant14159, - Variant14160, - Variant14161, - Variant14162, - Variant14163, - Variant14164, - Variant14165, - Variant14166, - Variant14167, - Variant14168, - Variant14169, - Variant14170, - Variant14171, - Variant14172, - Variant14173, - Variant14174, - Variant14175, - Variant14176, - Variant14177, - Variant14178, - Variant14179, - Variant14180, - Variant14181, - Variant14182, - Variant14183, - Variant14184, - Variant14185, - Variant14186, - Variant14187, - Variant14188, - Variant14189, - Variant14190, - Variant14191, - Variant14192, - Variant14193, - Variant14194, - Variant14195, - Variant14196, - Variant14197, - Variant14198, - Variant14199, - Variant14200, - Variant14201, - Variant14202, - Variant14203, - Variant14204, - Variant14205, - Variant14206, - Variant14207, - Variant14208, - Variant14209, - Variant14210, - Variant14211, - Variant14212, - Variant14213, - Variant14214, - Variant14215, - Variant14216, - Variant14217, - Variant14218, - Variant14219, - Variant14220, - Variant14221, - Variant14222, - Variant14223, - Variant14224, - Variant14225, - Variant14226, - Variant14227, - Variant14228, - Variant14229, - Variant14230, - Variant14231, - Variant14232, - Variant14233, - Variant14234, - Variant14235, - Variant14236, - Variant14237, - Variant14238, - Variant14239, - Variant14240, - Variant14241, - Variant14242, - Variant14243, - Variant14244, - Variant14245, - Variant14246, - Variant14247, - Variant14248, - Variant14249, - Variant14250, - Variant14251, - Variant14252, - Variant14253, - Variant14254, - Variant14255, - Variant14256, - Variant14257, - Variant14258, - Variant14259, - Variant14260, - Variant14261, - Variant14262, - Variant14263, - Variant14264, - Variant14265, - Variant14266, - Variant14267, - Variant14268, - Variant14269, - Variant14270, - Variant14271, - Variant14272, - Variant14273, - Variant14274, - Variant14275, - Variant14276, - Variant14277, - Variant14278, - Variant14279, - Variant14280, - Variant14281, - Variant14282, - Variant14283, - Variant14284, - Variant14285, - Variant14286, - Variant14287, - Variant14288, - Variant14289, - Variant14290, - Variant14291, - Variant14292, - Variant14293, - Variant14294, - Variant14295, - Variant14296, - Variant14297, - Variant14298, - Variant14299, - Variant14300, - Variant14301, - Variant14302, - Variant14303, - Variant14304, - Variant14305, - Variant14306, - Variant14307, - Variant14308, - Variant14309, - Variant14310, - Variant14311, - Variant14312, - Variant14313, - Variant14314, - Variant14315, - Variant14316, - Variant14317, - Variant14318, - Variant14319, - Variant14320, - Variant14321, - Variant14322, - Variant14323, - Variant14324, - Variant14325, - Variant14326, - Variant14327, - Variant14328, - Variant14329, - Variant14330, - Variant14331, - Variant14332, - Variant14333, - Variant14334, - Variant14335, - Variant14336, - Variant14337, - Variant14338, - Variant14339, - Variant14340, - Variant14341, - Variant14342, - Variant14343, - Variant14344, - Variant14345, - Variant14346, - Variant14347, - Variant14348, - Variant14349, - Variant14350, - Variant14351, - Variant14352, - Variant14353, - Variant14354, - Variant14355, - Variant14356, - Variant14357, - Variant14358, - Variant14359, - Variant14360, - Variant14361, - Variant14362, - Variant14363, - Variant14364, - Variant14365, - Variant14366, - Variant14367, - Variant14368, - Variant14369, - Variant14370, - Variant14371, - Variant14372, - Variant14373, - Variant14374, - Variant14375, - Variant14376, - Variant14377, - Variant14378, - Variant14379, - Variant14380, - Variant14381, - Variant14382, - Variant14383, - Variant14384, - Variant14385, - Variant14386, - Variant14387, - Variant14388, - Variant14389, - Variant14390, - Variant14391, - Variant14392, - Variant14393, - Variant14394, - Variant14395, - Variant14396, - Variant14397, - Variant14398, - Variant14399, - Variant14400, - Variant14401, - Variant14402, - Variant14403, - Variant14404, - Variant14405, - Variant14406, - Variant14407, - Variant14408, - Variant14409, - Variant14410, - Variant14411, - Variant14412, - Variant14413, - Variant14414, - Variant14415, - Variant14416, - Variant14417, - Variant14418, - Variant14419, - Variant14420, - Variant14421, - Variant14422, - Variant14423, - Variant14424, - Variant14425, - Variant14426, - Variant14427, - Variant14428, - Variant14429, - Variant14430, - Variant14431, - Variant14432, - Variant14433, - Variant14434, - Variant14435, - Variant14436, - Variant14437, - Variant14438, - Variant14439, - Variant14440, - Variant14441, - Variant14442, - Variant14443, - Variant14444, - Variant14445, - Variant14446, - Variant14447, - Variant14448, - Variant14449, - Variant14450, - Variant14451, - Variant14452, - Variant14453, - Variant14454, - Variant14455, - Variant14456, - Variant14457, - Variant14458, - Variant14459, - Variant14460, - Variant14461, - Variant14462, - Variant14463, - Variant14464, - Variant14465, - Variant14466, - Variant14467, - Variant14468, - Variant14469, - Variant14470, - Variant14471, - Variant14472, - Variant14473, - Variant14474, - Variant14475, - Variant14476, - Variant14477, - Variant14478, - Variant14479, - Variant14480, - Variant14481, - Variant14482, - Variant14483, - Variant14484, - Variant14485, - Variant14486, - Variant14487, - Variant14488, - Variant14489, - Variant14490, - Variant14491, - Variant14492, - Variant14493, - Variant14494, - Variant14495, - Variant14496, - Variant14497, - Variant14498, - Variant14499, - Variant14500, - Variant14501, - Variant14502, - Variant14503, - Variant14504, - Variant14505, - Variant14506, - Variant14507, - Variant14508, - Variant14509, - Variant14510, - Variant14511, - Variant14512, - Variant14513, - Variant14514, - Variant14515, - Variant14516, - Variant14517, - Variant14518, - Variant14519, - Variant14520, - Variant14521, - Variant14522, - Variant14523, - Variant14524, - Variant14525, - Variant14526, - Variant14527, - Variant14528, - Variant14529, - Variant14530, - Variant14531, - Variant14532, - Variant14533, - Variant14534, - Variant14535, - Variant14536, - Variant14537, - Variant14538, - Variant14539, - Variant14540, - Variant14541, - Variant14542, - Variant14543, - Variant14544, - Variant14545, - Variant14546, - Variant14547, - Variant14548, - Variant14549, - Variant14550, - Variant14551, - Variant14552, - Variant14553, - Variant14554, - Variant14555, - Variant14556, - Variant14557, - Variant14558, - Variant14559, - Variant14560, - Variant14561, - Variant14562, - Variant14563, - Variant14564, - Variant14565, - Variant14566, - Variant14567, - Variant14568, - Variant14569, - Variant14570, - Variant14571, - Variant14572, - Variant14573, - Variant14574, - Variant14575, - Variant14576, - Variant14577, - Variant14578, - Variant14579, - Variant14580, - Variant14581, - Variant14582, - Variant14583, - Variant14584, - Variant14585, - Variant14586, - Variant14587, - Variant14588, - Variant14589, - Variant14590, - Variant14591, - Variant14592, - Variant14593, - Variant14594, - Variant14595, - Variant14596, - Variant14597, - Variant14598, - Variant14599, - Variant14600, - Variant14601, - Variant14602, - Variant14603, - Variant14604, - Variant14605, - Variant14606, - Variant14607, - Variant14608, - Variant14609, - Variant14610, - Variant14611, - Variant14612, - Variant14613, - Variant14614, - Variant14615, - Variant14616, - Variant14617, - Variant14618, - Variant14619, - Variant14620, - Variant14621, - Variant14622, - Variant14623, - Variant14624, - Variant14625, - Variant14626, - Variant14627, - Variant14628, - Variant14629, - Variant14630, - Variant14631, - Variant14632, - Variant14633, - Variant14634, - Variant14635, - Variant14636, - Variant14637, - Variant14638, - Variant14639, - Variant14640, - Variant14641, - Variant14642, - Variant14643, - Variant14644, - Variant14645, - Variant14646, - Variant14647, - Variant14648, - Variant14649, - Variant14650, - Variant14651, - Variant14652, - Variant14653, - Variant14654, - Variant14655, - Variant14656, - Variant14657, - Variant14658, - Variant14659, - Variant14660, - Variant14661, - Variant14662, - Variant14663, - Variant14664, - Variant14665, - Variant14666, - Variant14667, - Variant14668, - Variant14669, - Variant14670, - Variant14671, - Variant14672, - Variant14673, - Variant14674, - Variant14675, - Variant14676, - Variant14677, - Variant14678, - Variant14679, - Variant14680, - Variant14681, - Variant14682, - Variant14683, - Variant14684, - Variant14685, - Variant14686, - Variant14687, - Variant14688, - Variant14689, - Variant14690, - Variant14691, - Variant14692, - Variant14693, - Variant14694, - Variant14695, - Variant14696, - Variant14697, - Variant14698, - Variant14699, - Variant14700, - Variant14701, - Variant14702, - Variant14703, - Variant14704, - Variant14705, - Variant14706, - Variant14707, - Variant14708, - Variant14709, - Variant14710, - Variant14711, - Variant14712, - Variant14713, - Variant14714, - Variant14715, - Variant14716, - Variant14717, - Variant14718, - Variant14719, - Variant14720, - Variant14721, - Variant14722, - Variant14723, - Variant14724, - Variant14725, - Variant14726, - Variant14727, - Variant14728, - Variant14729, - Variant14730, - Variant14731, - Variant14732, - Variant14733, - Variant14734, - Variant14735, - Variant14736, - Variant14737, - Variant14738, - Variant14739, - Variant14740, - Variant14741, - Variant14742, - Variant14743, - Variant14744, - Variant14745, - Variant14746, - Variant14747, - Variant14748, - Variant14749, - Variant14750, - Variant14751, - Variant14752, - Variant14753, - Variant14754, - Variant14755, - Variant14756, - Variant14757, - Variant14758, - Variant14759, - Variant14760, - Variant14761, - Variant14762, - Variant14763, - Variant14764, - Variant14765, - Variant14766, - Variant14767, - Variant14768, - Variant14769, - Variant14770, - Variant14771, - Variant14772, - Variant14773, - Variant14774, - Variant14775, - Variant14776, - Variant14777, - Variant14778, - Variant14779, - Variant14780, - Variant14781, - Variant14782, - Variant14783, - Variant14784, - Variant14785, - Variant14786, - Variant14787, - Variant14788, - Variant14789, - Variant14790, - Variant14791, - Variant14792, - Variant14793, - Variant14794, - Variant14795, - Variant14796, - Variant14797, - Variant14798, - Variant14799, - Variant14800, - Variant14801, - Variant14802, - Variant14803, - Variant14804, - Variant14805, - Variant14806, - Variant14807, - Variant14808, - Variant14809, - Variant14810, - Variant14811, - Variant14812, - Variant14813, - Variant14814, - Variant14815, - Variant14816, - Variant14817, - Variant14818, - Variant14819, - Variant14820, - Variant14821, - Variant14822, - Variant14823, - Variant14824, - Variant14825, - Variant14826, - Variant14827, - Variant14828, - Variant14829, - Variant14830, - Variant14831, - Variant14832, - Variant14833, - Variant14834, - Variant14835, - Variant14836, - Variant14837, - Variant14838, - Variant14839, - Variant14840, - Variant14841, - Variant14842, - Variant14843, - Variant14844, - Variant14845, - Variant14846, - Variant14847, - Variant14848, - Variant14849, - Variant14850, - Variant14851, - Variant14852, - Variant14853, - Variant14854, - Variant14855, - Variant14856, - Variant14857, - Variant14858, - Variant14859, - Variant14860, - Variant14861, - Variant14862, - Variant14863, - Variant14864, - Variant14865, - Variant14866, - Variant14867, - Variant14868, - Variant14869, - Variant14870, - Variant14871, - Variant14872, - Variant14873, - Variant14874, - Variant14875, - Variant14876, - Variant14877, - Variant14878, - Variant14879, - Variant14880, - Variant14881, - Variant14882, - Variant14883, - Variant14884, - Variant14885, - Variant14886, - Variant14887, - Variant14888, - Variant14889, - Variant14890, - Variant14891, - Variant14892, - Variant14893, - Variant14894, - Variant14895, - Variant14896, - Variant14897, - Variant14898, - Variant14899, - Variant14900, - Variant14901, - Variant14902, - Variant14903, - Variant14904, - Variant14905, - Variant14906, - Variant14907, - Variant14908, - Variant14909, - Variant14910, - Variant14911, - Variant14912, - Variant14913, - Variant14914, - Variant14915, - Variant14916, - Variant14917, - Variant14918, - Variant14919, - Variant14920, - Variant14921, - Variant14922, - Variant14923, - Variant14924, - Variant14925, - Variant14926, - Variant14927, - Variant14928, - Variant14929, - Variant14930, - Variant14931, - Variant14932, - Variant14933, - Variant14934, - Variant14935, - Variant14936, - Variant14937, - Variant14938, - Variant14939, - Variant14940, - Variant14941, - Variant14942, - Variant14943, - Variant14944, - Variant14945, - Variant14946, - Variant14947, - Variant14948, - Variant14949, - Variant14950, - Variant14951, - Variant14952, - Variant14953, - Variant14954, - Variant14955, - Variant14956, - Variant14957, - Variant14958, - Variant14959, - Variant14960, - Variant14961, - Variant14962, - Variant14963, - Variant14964, - Variant14965, - Variant14966, - Variant14967, - Variant14968, - Variant14969, - Variant14970, - Variant14971, - Variant14972, - Variant14973, - Variant14974, - Variant14975, - Variant14976, - Variant14977, - Variant14978, - Variant14979, - Variant14980, - Variant14981, - Variant14982, - Variant14983, - Variant14984, - Variant14985, - Variant14986, - Variant14987, - Variant14988, - Variant14989, - Variant14990, - Variant14991, - Variant14992, - Variant14993, - Variant14994, - Variant14995, - Variant14996, - Variant14997, - Variant14998, - Variant14999, - Variant15000, - Variant15001, - Variant15002, - Variant15003, - Variant15004, - Variant15005, - Variant15006, - Variant15007, - Variant15008, - Variant15009, - Variant15010, - Variant15011, - Variant15012, - Variant15013, - Variant15014, - Variant15015, - Variant15016, - Variant15017, - Variant15018, - Variant15019, - Variant15020, - Variant15021, - Variant15022, - Variant15023, - Variant15024, - Variant15025, - Variant15026, - Variant15027, - Variant15028, - Variant15029, - Variant15030, - Variant15031, - Variant15032, - Variant15033, - Variant15034, - Variant15035, - Variant15036, - Variant15037, - Variant15038, - Variant15039, - Variant15040, - Variant15041, - Variant15042, - Variant15043, - Variant15044, - Variant15045, - Variant15046, - Variant15047, - Variant15048, - Variant15049, - Variant15050, - Variant15051, - Variant15052, - Variant15053, - Variant15054, - Variant15055, - Variant15056, - Variant15057, - Variant15058, - Variant15059, - Variant15060, - Variant15061, - Variant15062, - Variant15063, - Variant15064, - Variant15065, - Variant15066, - Variant15067, - Variant15068, - Variant15069, - Variant15070, - Variant15071, - Variant15072, - Variant15073, - Variant15074, - Variant15075, - Variant15076, - Variant15077, - Variant15078, - Variant15079, - Variant15080, - Variant15081, - Variant15082, - Variant15083, - Variant15084, - Variant15085, - Variant15086, - Variant15087, - Variant15088, - Variant15089, - Variant15090, - Variant15091, - Variant15092, - Variant15093, - Variant15094, - Variant15095, - Variant15096, - Variant15097, - Variant15098, - Variant15099, - Variant15100, - Variant15101, - Variant15102, - Variant15103, - Variant15104, - Variant15105, - Variant15106, - Variant15107, - Variant15108, - Variant15109, - Variant15110, - Variant15111, - Variant15112, - Variant15113, - Variant15114, - Variant15115, - Variant15116, - Variant15117, - Variant15118, - Variant15119, - Variant15120, - Variant15121, - Variant15122, - Variant15123, - Variant15124, - Variant15125, - Variant15126, - Variant15127, - Variant15128, - Variant15129, - Variant15130, - Variant15131, - Variant15132, - Variant15133, - Variant15134, - Variant15135, - Variant15136, - Variant15137, - Variant15138, - Variant15139, - Variant15140, - Variant15141, - Variant15142, - Variant15143, - Variant15144, - Variant15145, - Variant15146, - Variant15147, - Variant15148, - Variant15149, - Variant15150, - Variant15151, - Variant15152, - Variant15153, - Variant15154, - Variant15155, - Variant15156, - Variant15157, - Variant15158, - Variant15159, - Variant15160, - Variant15161, - Variant15162, - Variant15163, - Variant15164, - Variant15165, - Variant15166, - Variant15167, - Variant15168, - Variant15169, - Variant15170, - Variant15171, - Variant15172, - Variant15173, - Variant15174, - Variant15175, - Variant15176, - Variant15177, - Variant15178, - Variant15179, - Variant15180, - Variant15181, - Variant15182, - Variant15183, - Variant15184, - Variant15185, - Variant15186, - Variant15187, - Variant15188, - Variant15189, - Variant15190, - Variant15191, - Variant15192, - Variant15193, - Variant15194, - Variant15195, - Variant15196, - Variant15197, - Variant15198, - Variant15199, - Variant15200, - Variant15201, - Variant15202, - Variant15203, - Variant15204, - Variant15205, - Variant15206, - Variant15207, - Variant15208, - Variant15209, - Variant15210, - Variant15211, - Variant15212, - Variant15213, - Variant15214, - Variant15215, - Variant15216, - Variant15217, - Variant15218, - Variant15219, - Variant15220, - Variant15221, - Variant15222, - Variant15223, - Variant15224, - Variant15225, - Variant15226, - Variant15227, - Variant15228, - Variant15229, - Variant15230, - Variant15231, - Variant15232, - Variant15233, - Variant15234, - Variant15235, - Variant15236, - Variant15237, - Variant15238, - Variant15239, - Variant15240, - Variant15241, - Variant15242, - Variant15243, - Variant15244, - Variant15245, - Variant15246, - Variant15247, - Variant15248, - Variant15249, - Variant15250, - Variant15251, - Variant15252, - Variant15253, - Variant15254, - Variant15255, - Variant15256, - Variant15257, - Variant15258, - Variant15259, - Variant15260, - Variant15261, - Variant15262, - Variant15263, - Variant15264, - Variant15265, - Variant15266, - Variant15267, - Variant15268, - Variant15269, - Variant15270, - Variant15271, - Variant15272, - Variant15273, - Variant15274, - Variant15275, - Variant15276, - Variant15277, - Variant15278, - Variant15279, - Variant15280, - Variant15281, - Variant15282, - Variant15283, - Variant15284, - Variant15285, - Variant15286, - Variant15287, - Variant15288, - Variant15289, - Variant15290, - Variant15291, - Variant15292, - Variant15293, - Variant15294, - Variant15295, - Variant15296, - Variant15297, - Variant15298, - Variant15299, - Variant15300, - Variant15301, - Variant15302, - Variant15303, - Variant15304, - Variant15305, - Variant15306, - Variant15307, - Variant15308, - Variant15309, - Variant15310, - Variant15311, - Variant15312, - Variant15313, - Variant15314, - Variant15315, - Variant15316, - Variant15317, - Variant15318, - Variant15319, - Variant15320, - Variant15321, - Variant15322, - Variant15323, - Variant15324, - Variant15325, - Variant15326, - Variant15327, - Variant15328, - Variant15329, - Variant15330, - Variant15331, - Variant15332, - Variant15333, - Variant15334, - Variant15335, - Variant15336, - Variant15337, - Variant15338, - Variant15339, - Variant15340, - Variant15341, - Variant15342, - Variant15343, - Variant15344, - Variant15345, - Variant15346, - Variant15347, - Variant15348, - Variant15349, - Variant15350, - Variant15351, - Variant15352, - Variant15353, - Variant15354, - Variant15355, - Variant15356, - Variant15357, - Variant15358, - Variant15359, - Variant15360, - Variant15361, - Variant15362, - Variant15363, - Variant15364, - Variant15365, - Variant15366, - Variant15367, - Variant15368, - Variant15369, - Variant15370, - Variant15371, - Variant15372, - Variant15373, - Variant15374, - Variant15375, - Variant15376, - Variant15377, - Variant15378, - Variant15379, - Variant15380, - Variant15381, - Variant15382, - Variant15383, - Variant15384, - Variant15385, - Variant15386, - Variant15387, - Variant15388, - Variant15389, - Variant15390, - Variant15391, - Variant15392, - Variant15393, - Variant15394, - Variant15395, - Variant15396, - Variant15397, - Variant15398, - Variant15399, - Variant15400, - Variant15401, - Variant15402, - Variant15403, - Variant15404, - Variant15405, - Variant15406, - Variant15407, - Variant15408, - Variant15409, - Variant15410, - Variant15411, - Variant15412, - Variant15413, - Variant15414, - Variant15415, - Variant15416, - Variant15417, - Variant15418, - Variant15419, - Variant15420, - Variant15421, - Variant15422, - Variant15423, - Variant15424, - Variant15425, - Variant15426, - Variant15427, - Variant15428, - Variant15429, - Variant15430, - Variant15431, - Variant15432, - Variant15433, - Variant15434, - Variant15435, - Variant15436, - Variant15437, - Variant15438, - Variant15439, - Variant15440, - Variant15441, - Variant15442, - Variant15443, - Variant15444, - Variant15445, - Variant15446, - Variant15447, - Variant15448, - Variant15449, - Variant15450, - Variant15451, - Variant15452, - Variant15453, - Variant15454, - Variant15455, - Variant15456, - Variant15457, - Variant15458, - Variant15459, - Variant15460, - Variant15461, - Variant15462, - Variant15463, - Variant15464, - Variant15465, - Variant15466, - Variant15467, - Variant15468, - Variant15469, - Variant15470, - Variant15471, - Variant15472, - Variant15473, - Variant15474, - Variant15475, - Variant15476, - Variant15477, - Variant15478, - Variant15479, - Variant15480, - Variant15481, - Variant15482, - Variant15483, - Variant15484, - Variant15485, - Variant15486, - Variant15487, - Variant15488, - Variant15489, - Variant15490, - Variant15491, - Variant15492, - Variant15493, - Variant15494, - Variant15495, - Variant15496, - Variant15497, - Variant15498, - Variant15499, - Variant15500, - Variant15501, - Variant15502, - Variant15503, - Variant15504, - Variant15505, - Variant15506, - Variant15507, - Variant15508, - Variant15509, - Variant15510, - Variant15511, - Variant15512, - Variant15513, - Variant15514, - Variant15515, - Variant15516, - Variant15517, - Variant15518, - Variant15519, - Variant15520, - Variant15521, - Variant15522, - Variant15523, - Variant15524, - Variant15525, - Variant15526, - Variant15527, - Variant15528, - Variant15529, - Variant15530, - Variant15531, - Variant15532, - Variant15533, - Variant15534, - Variant15535, - Variant15536, - Variant15537, - Variant15538, - Variant15539, - Variant15540, - Variant15541, - Variant15542, - Variant15543, - Variant15544, - Variant15545, - Variant15546, - Variant15547, - Variant15548, - Variant15549, - Variant15550, - Variant15551, - Variant15552, - Variant15553, - Variant15554, - Variant15555, - Variant15556, - Variant15557, - Variant15558, - Variant15559, - Variant15560, - Variant15561, - Variant15562, - Variant15563, - Variant15564, - Variant15565, - Variant15566, - Variant15567, - Variant15568, - Variant15569, - Variant15570, - Variant15571, - Variant15572, - Variant15573, - Variant15574, - Variant15575, - Variant15576, - Variant15577, - Variant15578, - Variant15579, - Variant15580, - Variant15581, - Variant15582, - Variant15583, - Variant15584, - Variant15585, - Variant15586, - Variant15587, - Variant15588, - Variant15589, - Variant15590, - Variant15591, - Variant15592, - Variant15593, - Variant15594, - Variant15595, - Variant15596, - Variant15597, - Variant15598, - Variant15599, - Variant15600, - Variant15601, - Variant15602, - Variant15603, - Variant15604, - Variant15605, - Variant15606, - Variant15607, - Variant15608, - Variant15609, - Variant15610, - Variant15611, - Variant15612, - Variant15613, - Variant15614, - Variant15615, - Variant15616, - Variant15617, - Variant15618, - Variant15619, - Variant15620, - Variant15621, - Variant15622, - Variant15623, - Variant15624, - Variant15625, - Variant15626, - Variant15627, - Variant15628, - Variant15629, - Variant15630, - Variant15631, - Variant15632, - Variant15633, - Variant15634, - Variant15635, - Variant15636, - Variant15637, - Variant15638, - Variant15639, - Variant15640, - Variant15641, - Variant15642, - Variant15643, - Variant15644, - Variant15645, - Variant15646, - Variant15647, - Variant15648, - Variant15649, - Variant15650, - Variant15651, - Variant15652, - Variant15653, - Variant15654, - Variant15655, - Variant15656, - Variant15657, - Variant15658, - Variant15659, - Variant15660, - Variant15661, - Variant15662, - Variant15663, - Variant15664, - Variant15665, - Variant15666, - Variant15667, - Variant15668, - Variant15669, - Variant15670, - Variant15671, - Variant15672, - Variant15673, - Variant15674, - Variant15675, - Variant15676, - Variant15677, - Variant15678, - Variant15679, - Variant15680, - Variant15681, - Variant15682, - Variant15683, - Variant15684, - Variant15685, - Variant15686, - Variant15687, - Variant15688, - Variant15689, - Variant15690, - Variant15691, - Variant15692, - Variant15693, - Variant15694, - Variant15695, - Variant15696, - Variant15697, - Variant15698, - Variant15699, - Variant15700, - Variant15701, - Variant15702, - Variant15703, - Variant15704, - Variant15705, - Variant15706, - Variant15707, - Variant15708, - Variant15709, - Variant15710, - Variant15711, - Variant15712, - Variant15713, - Variant15714, - Variant15715, - Variant15716, - Variant15717, - Variant15718, - Variant15719, - Variant15720, - Variant15721, - Variant15722, - Variant15723, - Variant15724, - Variant15725, - Variant15726, - Variant15727, - Variant15728, - Variant15729, - Variant15730, - Variant15731, - Variant15732, - Variant15733, - Variant15734, - Variant15735, - Variant15736, - Variant15737, - Variant15738, - Variant15739, - Variant15740, - Variant15741, - Variant15742, - Variant15743, - Variant15744, - Variant15745, - Variant15746, - Variant15747, - Variant15748, - Variant15749, - Variant15750, - Variant15751, - Variant15752, - Variant15753, - Variant15754, - Variant15755, - Variant15756, - Variant15757, - Variant15758, - Variant15759, - Variant15760, - Variant15761, - Variant15762, - Variant15763, - Variant15764, - Variant15765, - Variant15766, - Variant15767, - Variant15768, - Variant15769, - Variant15770, - Variant15771, - Variant15772, - Variant15773, - Variant15774, - Variant15775, - Variant15776, - Variant15777, - Variant15778, - Variant15779, - Variant15780, - Variant15781, - Variant15782, - Variant15783, - Variant15784, - Variant15785, - Variant15786, - Variant15787, - Variant15788, - Variant15789, - Variant15790, - Variant15791, - Variant15792, - Variant15793, - Variant15794, - Variant15795, - Variant15796, - Variant15797, - Variant15798, - Variant15799, - Variant15800, - Variant15801, - Variant15802, - Variant15803, - Variant15804, - Variant15805, - Variant15806, - Variant15807, - Variant15808, - Variant15809, - Variant15810, - Variant15811, - Variant15812, - Variant15813, - Variant15814, - Variant15815, - Variant15816, - Variant15817, - Variant15818, - Variant15819, - Variant15820, - Variant15821, - Variant15822, - Variant15823, - Variant15824, - Variant15825, - Variant15826, - Variant15827, - Variant15828, - Variant15829, - Variant15830, - Variant15831, - Variant15832, - Variant15833, - Variant15834, - Variant15835, - Variant15836, - Variant15837, - Variant15838, - Variant15839, - Variant15840, - Variant15841, - Variant15842, - Variant15843, - Variant15844, - Variant15845, - Variant15846, - Variant15847, - Variant15848, - Variant15849, - Variant15850, - Variant15851, - Variant15852, - Variant15853, - Variant15854, - Variant15855, - Variant15856, - Variant15857, - Variant15858, - Variant15859, - Variant15860, - Variant15861, - Variant15862, - Variant15863, - Variant15864, - Variant15865, - Variant15866, - Variant15867, - Variant15868, - Variant15869, - Variant15870, - Variant15871, - Variant15872, - Variant15873, - Variant15874, - Variant15875, - Variant15876, - Variant15877, - Variant15878, - Variant15879, - Variant15880, - Variant15881, - Variant15882, - Variant15883, - Variant15884, - Variant15885, - Variant15886, - Variant15887, - Variant15888, - Variant15889, - Variant15890, - Variant15891, - Variant15892, - Variant15893, - Variant15894, - Variant15895, - Variant15896, - Variant15897, - Variant15898, - Variant15899, - Variant15900, - Variant15901, - Variant15902, - Variant15903, - Variant15904, - Variant15905, - Variant15906, - Variant15907, - Variant15908, - Variant15909, - Variant15910, - Variant15911, - Variant15912, - Variant15913, - Variant15914, - Variant15915, - Variant15916, - Variant15917, - Variant15918, - Variant15919, - Variant15920, - Variant15921, - Variant15922, - Variant15923, - Variant15924, - Variant15925, - Variant15926, - Variant15927, - Variant15928, - Variant15929, - Variant15930, - Variant15931, - Variant15932, - Variant15933, - Variant15934, - Variant15935, - Variant15936, - Variant15937, - Variant15938, - Variant15939, - Variant15940, - Variant15941, - Variant15942, - Variant15943, - Variant15944, - Variant15945, - Variant15946, - Variant15947, - Variant15948, - Variant15949, - Variant15950, - Variant15951, - Variant15952, - Variant15953, - Variant15954, - Variant15955, - Variant15956, - Variant15957, - Variant15958, - Variant15959, - Variant15960, - Variant15961, - Variant15962, - Variant15963, - Variant15964, - Variant15965, - Variant15966, - Variant15967, - Variant15968, - Variant15969, - Variant15970, - Variant15971, - Variant15972, - Variant15973, - Variant15974, - Variant15975, - Variant15976, - Variant15977, - Variant15978, - Variant15979, - Variant15980, - Variant15981, - Variant15982, - Variant15983, - Variant15984, - Variant15985, - Variant15986, - Variant15987, - Variant15988, - Variant15989, - Variant15990, - Variant15991, - Variant15992, - Variant15993, - Variant15994, - Variant15995, - Variant15996, - Variant15997, - Variant15998, - Variant15999, - Variant16000, - Variant16001, - Variant16002, - Variant16003, - Variant16004, - Variant16005, - Variant16006, - Variant16007, - Variant16008, - Variant16009, - Variant16010, - Variant16011, - Variant16012, - Variant16013, - Variant16014, - Variant16015, - Variant16016, - Variant16017, - Variant16018, - Variant16019, - Variant16020, - Variant16021, - Variant16022, - Variant16023, - Variant16024, - Variant16025, - Variant16026, - Variant16027, - Variant16028, - Variant16029, - Variant16030, - Variant16031, - Variant16032, - Variant16033, - Variant16034, - Variant16035, - Variant16036, - Variant16037, - Variant16038, - Variant16039, - Variant16040, - Variant16041, - Variant16042, - Variant16043, - Variant16044, - Variant16045, - Variant16046, - Variant16047, - Variant16048, - Variant16049, - Variant16050, - Variant16051, - Variant16052, - Variant16053, - Variant16054, - Variant16055, - Variant16056, - Variant16057, - Variant16058, - Variant16059, - Variant16060, - Variant16061, - Variant16062, - Variant16063, - Variant16064, - Variant16065, - Variant16066, - Variant16067, - Variant16068, - Variant16069, - Variant16070, - Variant16071, - Variant16072, - Variant16073, - Variant16074, - Variant16075, - Variant16076, - Variant16077, - Variant16078, - Variant16079, - Variant16080, - Variant16081, - Variant16082, - Variant16083, - Variant16084, - Variant16085, - Variant16086, - Variant16087, - Variant16088, - Variant16089, - Variant16090, - Variant16091, - Variant16092, - Variant16093, - Variant16094, - Variant16095, - Variant16096, - Variant16097, - Variant16098, - Variant16099, - Variant16100, - Variant16101, - Variant16102, - Variant16103, - Variant16104, - Variant16105, - Variant16106, - Variant16107, - Variant16108, - Variant16109, - Variant16110, - Variant16111, - Variant16112, - Variant16113, - Variant16114, - Variant16115, - Variant16116, - Variant16117, - Variant16118, - Variant16119, - Variant16120, - Variant16121, - Variant16122, - Variant16123, - Variant16124, - Variant16125, - Variant16126, - Variant16127, - Variant16128, - Variant16129, - Variant16130, - Variant16131, - Variant16132, - Variant16133, - Variant16134, - Variant16135, - Variant16136, - Variant16137, - Variant16138, - Variant16139, - Variant16140, - Variant16141, - Variant16142, - Variant16143, - Variant16144, - Variant16145, - Variant16146, - Variant16147, - Variant16148, - Variant16149, - Variant16150, - Variant16151, - Variant16152, - Variant16153, - Variant16154, - Variant16155, - Variant16156, - Variant16157, - Variant16158, - Variant16159, - Variant16160, - Variant16161, - Variant16162, - Variant16163, - Variant16164, - Variant16165, - Variant16166, - Variant16167, - Variant16168, - Variant16169, - Variant16170, - Variant16171, - Variant16172, - Variant16173, - Variant16174, - Variant16175, - Variant16176, - Variant16177, - Variant16178, - Variant16179, - Variant16180, - Variant16181, - Variant16182, - Variant16183, - Variant16184, - Variant16185, - Variant16186, - Variant16187, - Variant16188, - Variant16189, - Variant16190, - Variant16191, - Variant16192, - Variant16193, - Variant16194, - Variant16195, - Variant16196, - Variant16197, - Variant16198, - Variant16199, - Variant16200, - Variant16201, - Variant16202, - Variant16203, - Variant16204, - Variant16205, - Variant16206, - Variant16207, - Variant16208, - Variant16209, - Variant16210, - Variant16211, - Variant16212, - Variant16213, - Variant16214, - Variant16215, - Variant16216, - Variant16217, - Variant16218, - Variant16219, - Variant16220, - Variant16221, - Variant16222, - Variant16223, - Variant16224, - Variant16225, - Variant16226, - Variant16227, - Variant16228, - Variant16229, - Variant16230, - Variant16231, - Variant16232, - Variant16233, - Variant16234, - Variant16235, - Variant16236, - Variant16237, - Variant16238, - Variant16239, - Variant16240, - Variant16241, - Variant16242, - Variant16243, - Variant16244, - Variant16245, - Variant16246, - Variant16247, - Variant16248, - Variant16249, - Variant16250, - Variant16251, - Variant16252, - Variant16253, - Variant16254, - Variant16255, - Variant16256, - Variant16257, - Variant16258, - Variant16259, - Variant16260, - Variant16261, - Variant16262, - Variant16263, - Variant16264, - Variant16265, - Variant16266, - Variant16267, - Variant16268, - Variant16269, - Variant16270, - Variant16271, - Variant16272, - Variant16273, - Variant16274, - Variant16275, - Variant16276, - Variant16277, - Variant16278, - Variant16279, - Variant16280, - Variant16281, - Variant16282, - Variant16283, - Variant16284, - Variant16285, - Variant16286, - Variant16287, - Variant16288, - Variant16289, - Variant16290, - Variant16291, - Variant16292, - Variant16293, - Variant16294, - Variant16295, - Variant16296, - Variant16297, - Variant16298, - Variant16299, - Variant16300, - Variant16301, - Variant16302, - Variant16303, - Variant16304, - Variant16305, - Variant16306, - Variant16307, - Variant16308, - Variant16309, - Variant16310, - Variant16311, - Variant16312, - Variant16313, - Variant16314, - Variant16315, - Variant16316, - Variant16317, - Variant16318, - Variant16319, - Variant16320, - Variant16321, - Variant16322, - Variant16323, - Variant16324, - Variant16325, - Variant16326, - Variant16327, - Variant16328, - Variant16329, - Variant16330, - Variant16331, - Variant16332, - Variant16333, - Variant16334, - Variant16335, - Variant16336, - Variant16337, - Variant16338, - Variant16339, - Variant16340, - Variant16341, - Variant16342, - Variant16343, - Variant16344, - Variant16345, - Variant16346, - Variant16347, - Variant16348, - Variant16349, - Variant16350, - Variant16351, - Variant16352, - Variant16353, - Variant16354, - Variant16355, - Variant16356, - Variant16357, - Variant16358, - Variant16359, - Variant16360, - Variant16361, - Variant16362, - Variant16363, - Variant16364, - Variant16365, - Variant16366, - Variant16367, - Variant16368, - Variant16369, - Variant16370, - Variant16371, - Variant16372, - Variant16373, - Variant16374, - Variant16375, - Variant16376, - Variant16377, - Variant16378, - Variant16379, - Variant16380, - Variant16381, - Variant16382, - Variant16383, - Variant16384, - Variant16385, - Variant16386, - Variant16387, - Variant16388, - Variant16389, - Variant16390, - Variant16391, - Variant16392, - Variant16393, - Variant16394, - Variant16395, - Variant16396, - Variant16397, - Variant16398, - Variant16399, - Variant16400, - Variant16401, - Variant16402, - Variant16403, - Variant16404, - Variant16405, - Variant16406, - Variant16407, - Variant16408, - Variant16409, - Variant16410, - Variant16411, - Variant16412, - Variant16413, - Variant16414, - Variant16415, - Variant16416, - Variant16417, - Variant16418, - Variant16419, - Variant16420, - Variant16421, - Variant16422, - Variant16423, - Variant16424, - Variant16425, - Variant16426, - Variant16427, - Variant16428, - Variant16429, - Variant16430, - Variant16431, - Variant16432, - Variant16433, - Variant16434, - Variant16435, - Variant16436, - Variant16437, - Variant16438, - Variant16439, - Variant16440, - Variant16441, - Variant16442, - Variant16443, - Variant16444, - Variant16445, - Variant16446, - Variant16447, - Variant16448, - Variant16449, - Variant16450, - Variant16451, - Variant16452, - Variant16453, - Variant16454, - Variant16455, - Variant16456, - Variant16457, - Variant16458, - Variant16459, - Variant16460, - Variant16461, - Variant16462, - Variant16463, - Variant16464, - Variant16465, - Variant16466, - Variant16467, - Variant16468, - Variant16469, - Variant16470, - Variant16471, - Variant16472, - Variant16473, - Variant16474, - Variant16475, - Variant16476, - Variant16477, - Variant16478, - Variant16479, - Variant16480, - Variant16481, - Variant16482, - Variant16483, - Variant16484, - Variant16485, - Variant16486, - Variant16487, - Variant16488, - Variant16489, - Variant16490, - Variant16491, - Variant16492, - Variant16493, - Variant16494, - Variant16495, - Variant16496, - Variant16497, - Variant16498, - Variant16499, - Variant16500, - Variant16501, - Variant16502, - Variant16503, - Variant16504, - Variant16505, - Variant16506, - Variant16507, - Variant16508, - Variant16509, - Variant16510, - Variant16511, - Variant16512, - Variant16513, - Variant16514, - Variant16515, - Variant16516, - Variant16517, - Variant16518, - Variant16519, - Variant16520, - Variant16521, - Variant16522, - Variant16523, - Variant16524, - Variant16525, - Variant16526, - Variant16527, - Variant16528, - Variant16529, - Variant16530, - Variant16531, - Variant16532, - Variant16533, - Variant16534, - Variant16535, - Variant16536, - Variant16537, - Variant16538, - Variant16539, - Variant16540, - Variant16541, - Variant16542, - Variant16543, - Variant16544, - Variant16545, - Variant16546, - Variant16547, - Variant16548, - Variant16549, - Variant16550, - Variant16551, - Variant16552, - Variant16553, - Variant16554, - Variant16555, - Variant16556, - Variant16557, - Variant16558, - Variant16559, - Variant16560, - Variant16561, - Variant16562, - Variant16563, - Variant16564, - Variant16565, - Variant16566, - Variant16567, - Variant16568, - Variant16569, - Variant16570, - Variant16571, - Variant16572, - Variant16573, - Variant16574, - Variant16575, - Variant16576, - Variant16577, - Variant16578, - Variant16579, - Variant16580, - Variant16581, - Variant16582, - Variant16583, - Variant16584, - Variant16585, - Variant16586, - Variant16587, - Variant16588, - Variant16589, - Variant16590, - Variant16591, - Variant16592, - Variant16593, - Variant16594, - Variant16595, - Variant16596, - Variant16597, - Variant16598, - Variant16599, - Variant16600, - Variant16601, - Variant16602, - Variant16603, - Variant16604, - Variant16605, - Variant16606, - Variant16607, - Variant16608, - Variant16609, - Variant16610, - Variant16611, - Variant16612, - Variant16613, - Variant16614, - Variant16615, - Variant16616, - Variant16617, - Variant16618, - Variant16619, - Variant16620, - Variant16621, - Variant16622, - Variant16623, - Variant16624, - Variant16625, - Variant16626, - Variant16627, - Variant16628, - Variant16629, - Variant16630, - Variant16631, - Variant16632, - Variant16633, - Variant16634, - Variant16635, - Variant16636, - Variant16637, - Variant16638, - Variant16639, - Variant16640, - Variant16641, - Variant16642, - Variant16643, - Variant16644, - Variant16645, - Variant16646, - Variant16647, - Variant16648, - Variant16649, - Variant16650, - Variant16651, - Variant16652, - Variant16653, - Variant16654, - Variant16655, - Variant16656, - Variant16657, - Variant16658, - Variant16659, - Variant16660, - Variant16661, - Variant16662, - Variant16663, - Variant16664, - Variant16665, - Variant16666, - Variant16667, - Variant16668, - Variant16669, - Variant16670, - Variant16671, - Variant16672, - Variant16673, - Variant16674, - Variant16675, - Variant16676, - Variant16677, - Variant16678, - Variant16679, - Variant16680, - Variant16681, - Variant16682, - Variant16683, - Variant16684, - Variant16685, - Variant16686, - Variant16687, - Variant16688, - Variant16689, - Variant16690, - Variant16691, - Variant16692, - Variant16693, - Variant16694, - Variant16695, - Variant16696, - Variant16697, - Variant16698, - Variant16699, - Variant16700, - Variant16701, - Variant16702, - Variant16703, - Variant16704, - Variant16705, - Variant16706, - Variant16707, - Variant16708, - Variant16709, - Variant16710, - Variant16711, - Variant16712, - Variant16713, - Variant16714, - Variant16715, - Variant16716, - Variant16717, - Variant16718, - Variant16719, - Variant16720, - Variant16721, - Variant16722, - Variant16723, - Variant16724, - Variant16725, - Variant16726, - Variant16727, - Variant16728, - Variant16729, - Variant16730, - Variant16731, - Variant16732, - Variant16733, - Variant16734, - Variant16735, - Variant16736, - Variant16737, - Variant16738, - Variant16739, - Variant16740, - Variant16741, - Variant16742, - Variant16743, - Variant16744, - Variant16745, - Variant16746, - Variant16747, - Variant16748, - Variant16749, - Variant16750, - Variant16751, - Variant16752, - Variant16753, - Variant16754, - Variant16755, - Variant16756, - Variant16757, - Variant16758, - Variant16759, - Variant16760, - Variant16761, - Variant16762, - Variant16763, - Variant16764, - Variant16765, - Variant16766, - Variant16767, - Variant16768, - Variant16769, - Variant16770, - Variant16771, - Variant16772, - Variant16773, - Variant16774, - Variant16775, - Variant16776, - Variant16777, - Variant16778, - Variant16779, - Variant16780, - Variant16781, - Variant16782, - Variant16783, - Variant16784, - Variant16785, - Variant16786, - Variant16787, - Variant16788, - Variant16789, - Variant16790, - Variant16791, - Variant16792, - Variant16793, - Variant16794, - Variant16795, - Variant16796, - Variant16797, - Variant16798, - Variant16799, - Variant16800, - Variant16801, - Variant16802, - Variant16803, - Variant16804, - Variant16805, - Variant16806, - Variant16807, - Variant16808, - Variant16809, - Variant16810, - Variant16811, - Variant16812, - Variant16813, - Variant16814, - Variant16815, - Variant16816, - Variant16817, - Variant16818, - Variant16819, - Variant16820, - Variant16821, - Variant16822, - Variant16823, - Variant16824, - Variant16825, - Variant16826, - Variant16827, - Variant16828, - Variant16829, - Variant16830, - Variant16831, - Variant16832, - Variant16833, - Variant16834, - Variant16835, - Variant16836, - Variant16837, - Variant16838, - Variant16839, - Variant16840, - Variant16841, - Variant16842, - Variant16843, - Variant16844, - Variant16845, - Variant16846, - Variant16847, - Variant16848, - Variant16849, - Variant16850, - Variant16851, - Variant16852, - Variant16853, - Variant16854, - Variant16855, - Variant16856, - Variant16857, - Variant16858, - Variant16859, - Variant16860, - Variant16861, - Variant16862, - Variant16863, - Variant16864, - Variant16865, - Variant16866, - Variant16867, - Variant16868, - Variant16869, - Variant16870, - Variant16871, - Variant16872, - Variant16873, - Variant16874, - Variant16875, - Variant16876, - Variant16877, - Variant16878, - Variant16879, - Variant16880, - Variant16881, - Variant16882, - Variant16883, - Variant16884, - Variant16885, - Variant16886, - Variant16887, - Variant16888, - Variant16889, - Variant16890, - Variant16891, - Variant16892, - Variant16893, - Variant16894, - Variant16895, - Variant16896, - Variant16897, - Variant16898, - Variant16899, - Variant16900, - Variant16901, - Variant16902, - Variant16903, - Variant16904, - Variant16905, - Variant16906, - Variant16907, - Variant16908, - Variant16909, - Variant16910, - Variant16911, - Variant16912, - Variant16913, - Variant16914, - Variant16915, - Variant16916, - Variant16917, - Variant16918, - Variant16919, - Variant16920, - Variant16921, - Variant16922, - Variant16923, - Variant16924, - Variant16925, - Variant16926, - Variant16927, - Variant16928, - Variant16929, - Variant16930, - Variant16931, - Variant16932, - Variant16933, - Variant16934, - Variant16935, - Variant16936, - Variant16937, - Variant16938, - Variant16939, - Variant16940, - Variant16941, - Variant16942, - Variant16943, - Variant16944, - Variant16945, - Variant16946, - Variant16947, - Variant16948, - Variant16949, - Variant16950, - Variant16951, - Variant16952, - Variant16953, - Variant16954, - Variant16955, - Variant16956, - Variant16957, - Variant16958, - Variant16959, - Variant16960, - Variant16961, - Variant16962, - Variant16963, - Variant16964, - Variant16965, - Variant16966, - Variant16967, - Variant16968, - Variant16969, - Variant16970, - Variant16971, - Variant16972, - Variant16973, - Variant16974, - Variant16975, - Variant16976, - Variant16977, - Variant16978, - Variant16979, - Variant16980, - Variant16981, - Variant16982, - Variant16983, - Variant16984, - Variant16985, - Variant16986, - Variant16987, - Variant16988, - Variant16989, - Variant16990, - Variant16991, - Variant16992, - Variant16993, - Variant16994, - Variant16995, - Variant16996, - Variant16997, - Variant16998, - Variant16999, - Variant17000, - Variant17001, - Variant17002, - Variant17003, - Variant17004, - Variant17005, - Variant17006, - Variant17007, - Variant17008, - Variant17009, - Variant17010, - Variant17011, - Variant17012, - Variant17013, - Variant17014, - Variant17015, - Variant17016, - Variant17017, - Variant17018, - Variant17019, - Variant17020, - Variant17021, - Variant17022, - Variant17023, - Variant17024, - Variant17025, - Variant17026, - Variant17027, - Variant17028, - Variant17029, - Variant17030, - Variant17031, - Variant17032, - Variant17033, - Variant17034, - Variant17035, - Variant17036, - Variant17037, - Variant17038, - Variant17039, - Variant17040, - Variant17041, - Variant17042, - Variant17043, - Variant17044, - Variant17045, - Variant17046, - Variant17047, - Variant17048, - Variant17049, - Variant17050, - Variant17051, - Variant17052, - Variant17053, - Variant17054, - Variant17055, - Variant17056, - Variant17057, - Variant17058, - Variant17059, - Variant17060, - Variant17061, - Variant17062, - Variant17063, - Variant17064, - Variant17065, - Variant17066, - Variant17067, - Variant17068, - Variant17069, - Variant17070, - Variant17071, - Variant17072, - Variant17073, - Variant17074, - Variant17075, - Variant17076, - Variant17077, - Variant17078, - Variant17079, - Variant17080, - Variant17081, - Variant17082, - Variant17083, - Variant17084, - Variant17085, - Variant17086, - Variant17087, - Variant17088, - Variant17089, - Variant17090, - Variant17091, - Variant17092, - Variant17093, - Variant17094, - Variant17095, - Variant17096, - Variant17097, - Variant17098, - Variant17099, - Variant17100, - Variant17101, - Variant17102, - Variant17103, - Variant17104, - Variant17105, - Variant17106, - Variant17107, - Variant17108, - Variant17109, - Variant17110, - Variant17111, - Variant17112, - Variant17113, - Variant17114, - Variant17115, - Variant17116, - Variant17117, - Variant17118, - Variant17119, - Variant17120, - Variant17121, - Variant17122, - Variant17123, - Variant17124, - Variant17125, - Variant17126, - Variant17127, - Variant17128, - Variant17129, - Variant17130, - Variant17131, - Variant17132, - Variant17133, - Variant17134, - Variant17135, - Variant17136, - Variant17137, - Variant17138, - Variant17139, - Variant17140, - Variant17141, - Variant17142, - Variant17143, - Variant17144, - Variant17145, - Variant17146, - Variant17147, - Variant17148, - Variant17149, - Variant17150, - Variant17151, - Variant17152, - Variant17153, - Variant17154, - Variant17155, - Variant17156, - Variant17157, - Variant17158, - Variant17159, - Variant17160, - Variant17161, - Variant17162, - Variant17163, - Variant17164, - Variant17165, - Variant17166, - Variant17167, - Variant17168, - Variant17169, - Variant17170, - Variant17171, - Variant17172, - Variant17173, - Variant17174, - Variant17175, - Variant17176, - Variant17177, - Variant17178, - Variant17179, - Variant17180, - Variant17181, - Variant17182, - Variant17183, - Variant17184, - Variant17185, - Variant17186, - Variant17187, - Variant17188, - Variant17189, - Variant17190, - Variant17191, - Variant17192, - Variant17193, - Variant17194, - Variant17195, - Variant17196, - Variant17197, - Variant17198, - Variant17199, - Variant17200, - Variant17201, - Variant17202, - Variant17203, - Variant17204, - Variant17205, - Variant17206, - Variant17207, - Variant17208, - Variant17209, - Variant17210, - Variant17211, - Variant17212, - Variant17213, - Variant17214, - Variant17215, - Variant17216, - Variant17217, - Variant17218, - Variant17219, - Variant17220, - Variant17221, - Variant17222, - Variant17223, - Variant17224, - Variant17225, - Variant17226, - Variant17227, - Variant17228, - Variant17229, - Variant17230, - Variant17231, - Variant17232, - Variant17233, - Variant17234, - Variant17235, - Variant17236, - Variant17237, - Variant17238, - Variant17239, - Variant17240, - Variant17241, - Variant17242, - Variant17243, - Variant17244, - Variant17245, - Variant17246, - Variant17247, - Variant17248, - Variant17249, - Variant17250, - Variant17251, - Variant17252, - Variant17253, - Variant17254, - Variant17255, - Variant17256, - Variant17257, - Variant17258, - Variant17259, - Variant17260, - Variant17261, - Variant17262, - Variant17263, - Variant17264, - Variant17265, - Variant17266, - Variant17267, - Variant17268, - Variant17269, - Variant17270, - Variant17271, - Variant17272, - Variant17273, - Variant17274, - Variant17275, - Variant17276, - Variant17277, - Variant17278, - Variant17279, - Variant17280, - Variant17281, - Variant17282, - Variant17283, - Variant17284, - Variant17285, - Variant17286, - Variant17287, - Variant17288, - Variant17289, - Variant17290, - Variant17291, - Variant17292, - Variant17293, - Variant17294, - Variant17295, - Variant17296, - Variant17297, - Variant17298, - Variant17299, - Variant17300, - Variant17301, - Variant17302, - Variant17303, - Variant17304, - Variant17305, - Variant17306, - Variant17307, - Variant17308, - Variant17309, - Variant17310, - Variant17311, - Variant17312, - Variant17313, - Variant17314, - Variant17315, - Variant17316, - Variant17317, - Variant17318, - Variant17319, - Variant17320, - Variant17321, - Variant17322, - Variant17323, - Variant17324, - Variant17325, - Variant17326, - Variant17327, - Variant17328, - Variant17329, - Variant17330, - Variant17331, - Variant17332, - Variant17333, - Variant17334, - Variant17335, - Variant17336, - Variant17337, - Variant17338, - Variant17339, - Variant17340, - Variant17341, - Variant17342, - Variant17343, - Variant17344, - Variant17345, - Variant17346, - Variant17347, - Variant17348, - Variant17349, - Variant17350, - Variant17351, - Variant17352, - Variant17353, - Variant17354, - Variant17355, - Variant17356, - Variant17357, - Variant17358, - Variant17359, - Variant17360, - Variant17361, - Variant17362, - Variant17363, - Variant17364, - Variant17365, - Variant17366, - Variant17367, - Variant17368, - Variant17369, - Variant17370, - Variant17371, - Variant17372, - Variant17373, - Variant17374, - Variant17375, - Variant17376, - Variant17377, - Variant17378, - Variant17379, - Variant17380, - Variant17381, - Variant17382, - Variant17383, - Variant17384, - Variant17385, - Variant17386, - Variant17387, - Variant17388, - Variant17389, - Variant17390, - Variant17391, - Variant17392, - Variant17393, - Variant17394, - Variant17395, - Variant17396, - Variant17397, - Variant17398, - Variant17399, - Variant17400, - Variant17401, - Variant17402, - Variant17403, - Variant17404, - Variant17405, - Variant17406, - Variant17407, - Variant17408, - Variant17409, - Variant17410, - Variant17411, - Variant17412, - Variant17413, - Variant17414, - Variant17415, - Variant17416, - Variant17417, - Variant17418, - Variant17419, - Variant17420, - Variant17421, - Variant17422, - Variant17423, - Variant17424, - Variant17425, - Variant17426, - Variant17427, - Variant17428, - Variant17429, - Variant17430, - Variant17431, - Variant17432, - Variant17433, - Variant17434, - Variant17435, - Variant17436, - Variant17437, - Variant17438, - Variant17439, - Variant17440, - Variant17441, - Variant17442, - Variant17443, - Variant17444, - Variant17445, - Variant17446, - Variant17447, - Variant17448, - Variant17449, - Variant17450, - Variant17451, - Variant17452, - Variant17453, - Variant17454, - Variant17455, - Variant17456, - Variant17457, - Variant17458, - Variant17459, - Variant17460, - Variant17461, - Variant17462, - Variant17463, - Variant17464, - Variant17465, - Variant17466, - Variant17467, - Variant17468, - Variant17469, - Variant17470, - Variant17471, - Variant17472, - Variant17473, - Variant17474, - Variant17475, - Variant17476, - Variant17477, - Variant17478, - Variant17479, - Variant17480, - Variant17481, - Variant17482, - Variant17483, - Variant17484, - Variant17485, - Variant17486, - Variant17487, - Variant17488, - Variant17489, - Variant17490, - Variant17491, - Variant17492, - Variant17493, - Variant17494, - Variant17495, - Variant17496, - Variant17497, - Variant17498, - Variant17499, - Variant17500, - Variant17501, - Variant17502, - Variant17503, - Variant17504, - Variant17505, - Variant17506, - Variant17507, - Variant17508, - Variant17509, - Variant17510, - Variant17511, - Variant17512, - Variant17513, - Variant17514, - Variant17515, - Variant17516, - Variant17517, - Variant17518, - Variant17519, - Variant17520, - Variant17521, - Variant17522, - Variant17523, - Variant17524, - Variant17525, - Variant17526, - Variant17527, - Variant17528, - Variant17529, - Variant17530, - Variant17531, - Variant17532, - Variant17533, - Variant17534, - Variant17535, - Variant17536, - Variant17537, - Variant17538, - Variant17539, - Variant17540, - Variant17541, - Variant17542, - Variant17543, - Variant17544, - Variant17545, - Variant17546, - Variant17547, - Variant17548, - Variant17549, - Variant17550, - Variant17551, - Variant17552, - Variant17553, - Variant17554, - Variant17555, - Variant17556, - Variant17557, - Variant17558, - Variant17559, - Variant17560, - Variant17561, - Variant17562, - Variant17563, - Variant17564, - Variant17565, - Variant17566, - Variant17567, - Variant17568, - Variant17569, - Variant17570, - Variant17571, - Variant17572, - Variant17573, - Variant17574, - Variant17575, - Variant17576, - Variant17577, - Variant17578, - Variant17579, - Variant17580, - Variant17581, - Variant17582, - Variant17583, - Variant17584, - Variant17585, - Variant17586, - Variant17587, - Variant17588, - Variant17589, - Variant17590, - Variant17591, - Variant17592, - Variant17593, - Variant17594, - Variant17595, - Variant17596, - Variant17597, - Variant17598, - Variant17599, - Variant17600, - Variant17601, - Variant17602, - Variant17603, - Variant17604, - Variant17605, - Variant17606, - Variant17607, - Variant17608, - Variant17609, - Variant17610, - Variant17611, - Variant17612, - Variant17613, - Variant17614, - Variant17615, - Variant17616, - Variant17617, - Variant17618, - Variant17619, - Variant17620, - Variant17621, - Variant17622, - Variant17623, - Variant17624, - Variant17625, - Variant17626, - Variant17627, - Variant17628, - Variant17629, - Variant17630, - Variant17631, - Variant17632, - Variant17633, - Variant17634, - Variant17635, - Variant17636, - Variant17637, - Variant17638, - Variant17639, - Variant17640, - Variant17641, - Variant17642, - Variant17643, - Variant17644, - Variant17645, - Variant17646, - Variant17647, - Variant17648, - Variant17649, - Variant17650, - Variant17651, - Variant17652, - Variant17653, - Variant17654, - Variant17655, - Variant17656, - Variant17657, - Variant17658, - Variant17659, - Variant17660, - Variant17661, - Variant17662, - Variant17663, - Variant17664, - Variant17665, - Variant17666, - Variant17667, - Variant17668, - Variant17669, - Variant17670, - Variant17671, - Variant17672, - Variant17673, - Variant17674, - Variant17675, - Variant17676, - Variant17677, - Variant17678, - Variant17679, - Variant17680, - Variant17681, - Variant17682, - Variant17683, - Variant17684, - Variant17685, - Variant17686, - Variant17687, - Variant17688, - Variant17689, - Variant17690, - Variant17691, - Variant17692, - Variant17693, - Variant17694, - Variant17695, - Variant17696, - Variant17697, - Variant17698, - Variant17699, - Variant17700, - Variant17701, - Variant17702, - Variant17703, - Variant17704, - Variant17705, - Variant17706, - Variant17707, - Variant17708, - Variant17709, - Variant17710, - Variant17711, - Variant17712, - Variant17713, - Variant17714, - Variant17715, - Variant17716, - Variant17717, - Variant17718, - Variant17719, - Variant17720, - Variant17721, - Variant17722, - Variant17723, - Variant17724, - Variant17725, - Variant17726, - Variant17727, - Variant17728, - Variant17729, - Variant17730, - Variant17731, - Variant17732, - Variant17733, - Variant17734, - Variant17735, - Variant17736, - Variant17737, - Variant17738, - Variant17739, - Variant17740, - Variant17741, - Variant17742, - Variant17743, - Variant17744, - Variant17745, - Variant17746, - Variant17747, - Variant17748, - Variant17749, - Variant17750, - Variant17751, - Variant17752, - Variant17753, - Variant17754, - Variant17755, - Variant17756, - Variant17757, - Variant17758, - Variant17759, - Variant17760, - Variant17761, - Variant17762, - Variant17763, - Variant17764, - Variant17765, - Variant17766, - Variant17767, - Variant17768, - Variant17769, - Variant17770, - Variant17771, - Variant17772, - Variant17773, - Variant17774, - Variant17775, - Variant17776, - Variant17777, - Variant17778, - Variant17779, - Variant17780, - Variant17781, - Variant17782, - Variant17783, - Variant17784, - Variant17785, - Variant17786, - Variant17787, - Variant17788, - Variant17789, - Variant17790, - Variant17791, - Variant17792, - Variant17793, - Variant17794, - Variant17795, - Variant17796, - Variant17797, - Variant17798, - Variant17799, - Variant17800, - Variant17801, - Variant17802, - Variant17803, - Variant17804, - Variant17805, - Variant17806, - Variant17807, - Variant17808, - Variant17809, - Variant17810, - Variant17811, - Variant17812, - Variant17813, - Variant17814, - Variant17815, - Variant17816, - Variant17817, - Variant17818, - Variant17819, - Variant17820, - Variant17821, - Variant17822, - Variant17823, - Variant17824, - Variant17825, - Variant17826, - Variant17827, - Variant17828, - Variant17829, - Variant17830, - Variant17831, - Variant17832, - Variant17833, - Variant17834, - Variant17835, - Variant17836, - Variant17837, - Variant17838, - Variant17839, - Variant17840, - Variant17841, - Variant17842, - Variant17843, - Variant17844, - Variant17845, - Variant17846, - Variant17847, - Variant17848, - Variant17849, - Variant17850, - Variant17851, - Variant17852, - Variant17853, - Variant17854, - Variant17855, - Variant17856, - Variant17857, - Variant17858, - Variant17859, - Variant17860, - Variant17861, - Variant17862, - Variant17863, - Variant17864, - Variant17865, - Variant17866, - Variant17867, - Variant17868, - Variant17869, - Variant17870, - Variant17871, - Variant17872, - Variant17873, - Variant17874, - Variant17875, - Variant17876, - Variant17877, - Variant17878, - Variant17879, - Variant17880, - Variant17881, - Variant17882, - Variant17883, - Variant17884, - Variant17885, - Variant17886, - Variant17887, - Variant17888, - Variant17889, - Variant17890, - Variant17891, - Variant17892, - Variant17893, - Variant17894, - Variant17895, - Variant17896, - Variant17897, - Variant17898, - Variant17899, - Variant17900, - Variant17901, - Variant17902, - Variant17903, - Variant17904, - Variant17905, - Variant17906, - Variant17907, - Variant17908, - Variant17909, - Variant17910, - Variant17911, - Variant17912, - Variant17913, - Variant17914, - Variant17915, - Variant17916, - Variant17917, - Variant17918, - Variant17919, - Variant17920, - Variant17921, - Variant17922, - Variant17923, - Variant17924, - Variant17925, - Variant17926, - Variant17927, - Variant17928, - Variant17929, - Variant17930, - Variant17931, - Variant17932, - Variant17933, - Variant17934, - Variant17935, - Variant17936, - Variant17937, - Variant17938, - Variant17939, - Variant17940, - Variant17941, - Variant17942, - Variant17943, - Variant17944, - Variant17945, - Variant17946, - Variant17947, - Variant17948, - Variant17949, - Variant17950, - Variant17951, - Variant17952, - Variant17953, - Variant17954, - Variant17955, - Variant17956, - Variant17957, - Variant17958, - Variant17959, - Variant17960, - Variant17961, - Variant17962, - Variant17963, - Variant17964, - Variant17965, - Variant17966, - Variant17967, - Variant17968, - Variant17969, - Variant17970, - Variant17971, - Variant17972, - Variant17973, - Variant17974, - Variant17975, - Variant17976, - Variant17977, - Variant17978, - Variant17979, - Variant17980, - Variant17981, - Variant17982, - Variant17983, - Variant17984, - Variant17985, - Variant17986, - Variant17987, - Variant17988, - Variant17989, - Variant17990, - Variant17991, - Variant17992, - Variant17993, - Variant17994, - Variant17995, - Variant17996, - Variant17997, - Variant17998, - Variant17999, - Variant18000, - Variant18001, - Variant18002, - Variant18003, - Variant18004, - Variant18005, - Variant18006, - Variant18007, - Variant18008, - Variant18009, - Variant18010, - Variant18011, - Variant18012, - Variant18013, - Variant18014, - Variant18015, - Variant18016, - Variant18017, - Variant18018, - Variant18019, - Variant18020, - Variant18021, - Variant18022, - Variant18023, - Variant18024, - Variant18025, - Variant18026, - Variant18027, - Variant18028, - Variant18029, - Variant18030, - Variant18031, - Variant18032, - Variant18033, - Variant18034, - Variant18035, - Variant18036, - Variant18037, - Variant18038, - Variant18039, - Variant18040, - Variant18041, - Variant18042, - Variant18043, - Variant18044, - Variant18045, - Variant18046, - Variant18047, - Variant18048, - Variant18049, - Variant18050, - Variant18051, - Variant18052, - Variant18053, - Variant18054, - Variant18055, - Variant18056, - Variant18057, - Variant18058, - Variant18059, - Variant18060, - Variant18061, - Variant18062, - Variant18063, - Variant18064, - Variant18065, - Variant18066, - Variant18067, - Variant18068, - Variant18069, - Variant18070, - Variant18071, - Variant18072, - Variant18073, - Variant18074, - Variant18075, - Variant18076, - Variant18077, - Variant18078, - Variant18079, - Variant18080, - Variant18081, - Variant18082, - Variant18083, - Variant18084, - Variant18085, - Variant18086, - Variant18087, - Variant18088, - Variant18089, - Variant18090, - Variant18091, - Variant18092, - Variant18093, - Variant18094, - Variant18095, - Variant18096, - Variant18097, - Variant18098, - Variant18099, - Variant18100, - Variant18101, - Variant18102, - Variant18103, - Variant18104, - Variant18105, - Variant18106, - Variant18107, - Variant18108, - Variant18109, - Variant18110, - Variant18111, - Variant18112, - Variant18113, - Variant18114, - Variant18115, - Variant18116, - Variant18117, - Variant18118, - Variant18119, - Variant18120, - Variant18121, - Variant18122, - Variant18123, - Variant18124, - Variant18125, - Variant18126, - Variant18127, - Variant18128, - Variant18129, - Variant18130, - Variant18131, - Variant18132, - Variant18133, - Variant18134, - Variant18135, - Variant18136, - Variant18137, - Variant18138, - Variant18139, - Variant18140, - Variant18141, - Variant18142, - Variant18143, - Variant18144, - Variant18145, - Variant18146, - Variant18147, - Variant18148, - Variant18149, - Variant18150, - Variant18151, - Variant18152, - Variant18153, - Variant18154, - Variant18155, - Variant18156, - Variant18157, - Variant18158, - Variant18159, - Variant18160, - Variant18161, - Variant18162, - Variant18163, - Variant18164, - Variant18165, - Variant18166, - Variant18167, - Variant18168, - Variant18169, - Variant18170, - Variant18171, - Variant18172, - Variant18173, - Variant18174, - Variant18175, - Variant18176, - Variant18177, - Variant18178, - Variant18179, - Variant18180, - Variant18181, - Variant18182, - Variant18183, - Variant18184, - Variant18185, - Variant18186, - Variant18187, - Variant18188, - Variant18189, - Variant18190, - Variant18191, - Variant18192, - Variant18193, - Variant18194, - Variant18195, - Variant18196, - Variant18197, - Variant18198, - Variant18199, - Variant18200, - Variant18201, - Variant18202, - Variant18203, - Variant18204, - Variant18205, - Variant18206, - Variant18207, - Variant18208, - Variant18209, - Variant18210, - Variant18211, - Variant18212, - Variant18213, - Variant18214, - Variant18215, - Variant18216, - Variant18217, - Variant18218, - Variant18219, - Variant18220, - Variant18221, - Variant18222, - Variant18223, - Variant18224, - Variant18225, - Variant18226, - Variant18227, - Variant18228, - Variant18229, - Variant18230, - Variant18231, - Variant18232, - Variant18233, - Variant18234, - Variant18235, - Variant18236, - Variant18237, - Variant18238, - Variant18239, - Variant18240, - Variant18241, - Variant18242, - Variant18243, - Variant18244, - Variant18245, - Variant18246, - Variant18247, - Variant18248, - Variant18249, - Variant18250, - Variant18251, - Variant18252, - Variant18253, - Variant18254, - Variant18255, - Variant18256, - Variant18257, - Variant18258, - Variant18259, - Variant18260, - Variant18261, - Variant18262, - Variant18263, - Variant18264, - Variant18265, - Variant18266, - Variant18267, - Variant18268, - Variant18269, - Variant18270, - Variant18271, - Variant18272, - Variant18273, - Variant18274, - Variant18275, - Variant18276, - Variant18277, - Variant18278, - Variant18279, - Variant18280, - Variant18281, - Variant18282, - Variant18283, - Variant18284, - Variant18285, - Variant18286, - Variant18287, - Variant18288, - Variant18289, - Variant18290, - Variant18291, - Variant18292, - Variant18293, - Variant18294, - Variant18295, - Variant18296, - Variant18297, - Variant18298, - Variant18299, - Variant18300, - Variant18301, - Variant18302, - Variant18303, - Variant18304, - Variant18305, - Variant18306, - Variant18307, - Variant18308, - Variant18309, - Variant18310, - Variant18311, - Variant18312, - Variant18313, - Variant18314, - Variant18315, - Variant18316, - Variant18317, - Variant18318, - Variant18319, - Variant18320, - Variant18321, - Variant18322, - Variant18323, - Variant18324, - Variant18325, - Variant18326, - Variant18327, - Variant18328, - Variant18329, - Variant18330, - Variant18331, - Variant18332, - Variant18333, - Variant18334, - Variant18335, - Variant18336, - Variant18337, - Variant18338, - Variant18339, - Variant18340, - Variant18341, - Variant18342, - Variant18343, - Variant18344, - Variant18345, - Variant18346, - Variant18347, - Variant18348, - Variant18349, - Variant18350, - Variant18351, - Variant18352, - Variant18353, - Variant18354, - Variant18355, - Variant18356, - Variant18357, - Variant18358, - Variant18359, - Variant18360, - Variant18361, - Variant18362, - Variant18363, - Variant18364, - Variant18365, - Variant18366, - Variant18367, - Variant18368, - Variant18369, - Variant18370, - Variant18371, - Variant18372, - Variant18373, - Variant18374, - Variant18375, - Variant18376, - Variant18377, - Variant18378, - Variant18379, - Variant18380, - Variant18381, - Variant18382, - Variant18383, - Variant18384, - Variant18385, - Variant18386, - Variant18387, - Variant18388, - Variant18389, - Variant18390, - Variant18391, - Variant18392, - Variant18393, - Variant18394, - Variant18395, - Variant18396, - Variant18397, - Variant18398, - Variant18399, - Variant18400, - Variant18401, - Variant18402, - Variant18403, - Variant18404, - Variant18405, - Variant18406, - Variant18407, - Variant18408, - Variant18409, - Variant18410, - Variant18411, - Variant18412, - Variant18413, - Variant18414, - Variant18415, - Variant18416, - Variant18417, - Variant18418, - Variant18419, - Variant18420, - Variant18421, - Variant18422, - Variant18423, - Variant18424, - Variant18425, - Variant18426, - Variant18427, - Variant18428, - Variant18429, - Variant18430, - Variant18431, - Variant18432, - Variant18433, - Variant18434, - Variant18435, - Variant18436, - Variant18437, - Variant18438, - Variant18439, - Variant18440, - Variant18441, - Variant18442, - Variant18443, - Variant18444, - Variant18445, - Variant18446, - Variant18447, - Variant18448, - Variant18449, - Variant18450, - Variant18451, - Variant18452, - Variant18453, - Variant18454, - Variant18455, - Variant18456, - Variant18457, - Variant18458, - Variant18459, - Variant18460, - Variant18461, - Variant18462, - Variant18463, - Variant18464, - Variant18465, - Variant18466, - Variant18467, - Variant18468, - Variant18469, - Variant18470, - Variant18471, - Variant18472, - Variant18473, - Variant18474, - Variant18475, - Variant18476, - Variant18477, - Variant18478, - Variant18479, - Variant18480, - Variant18481, - Variant18482, - Variant18483, - Variant18484, - Variant18485, - Variant18486, - Variant18487, - Variant18488, - Variant18489, - Variant18490, - Variant18491, - Variant18492, - Variant18493, - Variant18494, - Variant18495, - Variant18496, - Variant18497, - Variant18498, - Variant18499, - Variant18500, - Variant18501, - Variant18502, - Variant18503, - Variant18504, - Variant18505, - Variant18506, - Variant18507, - Variant18508, - Variant18509, - Variant18510, - Variant18511, - Variant18512, - Variant18513, - Variant18514, - Variant18515, - Variant18516, - Variant18517, - Variant18518, - Variant18519, - Variant18520, - Variant18521, - Variant18522, - Variant18523, - Variant18524, - Variant18525, - Variant18526, - Variant18527, - Variant18528, - Variant18529, - Variant18530, - Variant18531, - Variant18532, - Variant18533, - Variant18534, - Variant18535, - Variant18536, - Variant18537, - Variant18538, - Variant18539, - Variant18540, - Variant18541, - Variant18542, - Variant18543, - Variant18544, - Variant18545, - Variant18546, - Variant18547, - Variant18548, - Variant18549, - Variant18550, - Variant18551, - Variant18552, - Variant18553, - Variant18554, - Variant18555, - Variant18556, - Variant18557, - Variant18558, - Variant18559, - Variant18560, - Variant18561, - Variant18562, - Variant18563, - Variant18564, - Variant18565, - Variant18566, - Variant18567, - Variant18568, - Variant18569, - Variant18570, - Variant18571, - Variant18572, - Variant18573, - Variant18574, - Variant18575, - Variant18576, - Variant18577, - Variant18578, - Variant18579, - Variant18580, - Variant18581, - Variant18582, - Variant18583, - Variant18584, - Variant18585, - Variant18586, - Variant18587, - Variant18588, - Variant18589, - Variant18590, - Variant18591, - Variant18592, - Variant18593, - Variant18594, - Variant18595, - Variant18596, - Variant18597, - Variant18598, - Variant18599, - Variant18600, - Variant18601, - Variant18602, - Variant18603, - Variant18604, - Variant18605, - Variant18606, - Variant18607, - Variant18608, - Variant18609, - Variant18610, - Variant18611, - Variant18612, - Variant18613, - Variant18614, - Variant18615, - Variant18616, - Variant18617, - Variant18618, - Variant18619, - Variant18620, - Variant18621, - Variant18622, - Variant18623, - Variant18624, - Variant18625, - Variant18626, - Variant18627, - Variant18628, - Variant18629, - Variant18630, - Variant18631, - Variant18632, - Variant18633, - Variant18634, - Variant18635, - Variant18636, - Variant18637, - Variant18638, - Variant18639, - Variant18640, - Variant18641, - Variant18642, - Variant18643, - Variant18644, - Variant18645, - Variant18646, - Variant18647, - Variant18648, - Variant18649, - Variant18650, - Variant18651, - Variant18652, - Variant18653, - Variant18654, - Variant18655, - Variant18656, - Variant18657, - Variant18658, - Variant18659, - Variant18660, - Variant18661, - Variant18662, - Variant18663, - Variant18664, - Variant18665, - Variant18666, - Variant18667, - Variant18668, - Variant18669, - Variant18670, - Variant18671, - Variant18672, - Variant18673, - Variant18674, - Variant18675, - Variant18676, - Variant18677, - Variant18678, - Variant18679, - Variant18680, - Variant18681, - Variant18682, - Variant18683, - Variant18684, - Variant18685, - Variant18686, - Variant18687, - Variant18688, - Variant18689, - Variant18690, - Variant18691, - Variant18692, - Variant18693, - Variant18694, - Variant18695, - Variant18696, - Variant18697, - Variant18698, - Variant18699, - Variant18700, - Variant18701, - Variant18702, - Variant18703, - Variant18704, - Variant18705, - Variant18706, - Variant18707, - Variant18708, - Variant18709, - Variant18710, - Variant18711, - Variant18712, - Variant18713, - Variant18714, - Variant18715, - Variant18716, - Variant18717, - Variant18718, - Variant18719, - Variant18720, - Variant18721, - Variant18722, - Variant18723, - Variant18724, - Variant18725, - Variant18726, - Variant18727, - Variant18728, - Variant18729, - Variant18730, - Variant18731, - Variant18732, - Variant18733, - Variant18734, - Variant18735, - Variant18736, - Variant18737, - Variant18738, - Variant18739, - Variant18740, - Variant18741, - Variant18742, - Variant18743, - Variant18744, - Variant18745, - Variant18746, - Variant18747, - Variant18748, - Variant18749, - Variant18750, - Variant18751, - Variant18752, - Variant18753, - Variant18754, - Variant18755, - Variant18756, - Variant18757, - Variant18758, - Variant18759, - Variant18760, - Variant18761, - Variant18762, - Variant18763, - Variant18764, - Variant18765, - Variant18766, - Variant18767, - Variant18768, - Variant18769, - Variant18770, - Variant18771, - Variant18772, - Variant18773, - Variant18774, - Variant18775, - Variant18776, - Variant18777, - Variant18778, - Variant18779, - Variant18780, - Variant18781, - Variant18782, - Variant18783, - Variant18784, - Variant18785, - Variant18786, - Variant18787, - Variant18788, - Variant18789, - Variant18790, - Variant18791, - Variant18792, - Variant18793, - Variant18794, - Variant18795, - Variant18796, - Variant18797, - Variant18798, - Variant18799, - Variant18800, - Variant18801, - Variant18802, - Variant18803, - Variant18804, - Variant18805, - Variant18806, - Variant18807, - Variant18808, - Variant18809, - Variant18810, - Variant18811, - Variant18812, - Variant18813, - Variant18814, - Variant18815, - Variant18816, - Variant18817, - Variant18818, - Variant18819, - Variant18820, - Variant18821, - Variant18822, - Variant18823, - Variant18824, - Variant18825, - Variant18826, - Variant18827, - Variant18828, - Variant18829, - Variant18830, - Variant18831, - Variant18832, - Variant18833, - Variant18834, - Variant18835, - Variant18836, - Variant18837, - Variant18838, - Variant18839, - Variant18840, - Variant18841, - Variant18842, - Variant18843, - Variant18844, - Variant18845, - Variant18846, - Variant18847, - Variant18848, - Variant18849, - Variant18850, - Variant18851, - Variant18852, - Variant18853, - Variant18854, - Variant18855, - Variant18856, - Variant18857, - Variant18858, - Variant18859, - Variant18860, - Variant18861, - Variant18862, - Variant18863, - Variant18864, - Variant18865, - Variant18866, - Variant18867, - Variant18868, - Variant18869, - Variant18870, - Variant18871, - Variant18872, - Variant18873, - Variant18874, - Variant18875, - Variant18876, - Variant18877, - Variant18878, - Variant18879, - Variant18880, - Variant18881, - Variant18882, - Variant18883, - Variant18884, - Variant18885, - Variant18886, - Variant18887, - Variant18888, - Variant18889, - Variant18890, - Variant18891, - Variant18892, - Variant18893, - Variant18894, - Variant18895, - Variant18896, - Variant18897, - Variant18898, - Variant18899, - Variant18900, - Variant18901, - Variant18902, - Variant18903, - Variant18904, - Variant18905, - Variant18906, - Variant18907, - Variant18908, - Variant18909, - Variant18910, - Variant18911, - Variant18912, - Variant18913, - Variant18914, - Variant18915, - Variant18916, - Variant18917, - Variant18918, - Variant18919, - Variant18920, - Variant18921, - Variant18922, - Variant18923, - Variant18924, - Variant18925, - Variant18926, - Variant18927, - Variant18928, - Variant18929, - Variant18930, - Variant18931, - Variant18932, - Variant18933, - Variant18934, - Variant18935, - Variant18936, - Variant18937, - Variant18938, - Variant18939, - Variant18940, - Variant18941, - Variant18942, - Variant18943, - Variant18944, - Variant18945, - Variant18946, - Variant18947, - Variant18948, - Variant18949, - Variant18950, - Variant18951, - Variant18952, - Variant18953, - Variant18954, - Variant18955, - Variant18956, - Variant18957, - Variant18958, - Variant18959, - Variant18960, - Variant18961, - Variant18962, - Variant18963, - Variant18964, - Variant18965, - Variant18966, - Variant18967, - Variant18968, - Variant18969, - Variant18970, - Variant18971, - Variant18972, - Variant18973, - Variant18974, - Variant18975, - Variant18976, - Variant18977, - Variant18978, - Variant18979, - Variant18980, - Variant18981, - Variant18982, - Variant18983, - Variant18984, - Variant18985, - Variant18986, - Variant18987, - Variant18988, - Variant18989, - Variant18990, - Variant18991, - Variant18992, - Variant18993, - Variant18994, - Variant18995, - Variant18996, - Variant18997, - Variant18998, - Variant18999, - Variant19000, - Variant19001, - Variant19002, - Variant19003, - Variant19004, - Variant19005, - Variant19006, - Variant19007, - Variant19008, - Variant19009, - Variant19010, - Variant19011, - Variant19012, - Variant19013, - Variant19014, - Variant19015, - Variant19016, - Variant19017, - Variant19018, - Variant19019, - Variant19020, - Variant19021, - Variant19022, - Variant19023, - Variant19024, - Variant19025, - Variant19026, - Variant19027, - Variant19028, - Variant19029, - Variant19030, - Variant19031, - Variant19032, - Variant19033, - Variant19034, - Variant19035, - Variant19036, - Variant19037, - Variant19038, - Variant19039, - Variant19040, - Variant19041, - Variant19042, - Variant19043, - Variant19044, - Variant19045, - Variant19046, - Variant19047, - Variant19048, - Variant19049, - Variant19050, - Variant19051, - Variant19052, - Variant19053, - Variant19054, - Variant19055, - Variant19056, - Variant19057, - Variant19058, - Variant19059, - Variant19060, - Variant19061, - Variant19062, - Variant19063, - Variant19064, - Variant19065, - Variant19066, - Variant19067, - Variant19068, - Variant19069, - Variant19070, - Variant19071, - Variant19072, - Variant19073, - Variant19074, - Variant19075, - Variant19076, - Variant19077, - Variant19078, - Variant19079, - Variant19080, - Variant19081, - Variant19082, - Variant19083, - Variant19084, - Variant19085, - Variant19086, - Variant19087, - Variant19088, - Variant19089, - Variant19090, - Variant19091, - Variant19092, - Variant19093, - Variant19094, - Variant19095, - Variant19096, - Variant19097, - Variant19098, - Variant19099, - Variant19100, - Variant19101, - Variant19102, - Variant19103, - Variant19104, - Variant19105, - Variant19106, - Variant19107, - Variant19108, - Variant19109, - Variant19110, - Variant19111, - Variant19112, - Variant19113, - Variant19114, - Variant19115, - Variant19116, - Variant19117, - Variant19118, - Variant19119, - Variant19120, - Variant19121, - Variant19122, - Variant19123, - Variant19124, - Variant19125, - Variant19126, - Variant19127, - Variant19128, - Variant19129, - Variant19130, - Variant19131, - Variant19132, - Variant19133, - Variant19134, - Variant19135, - Variant19136, - Variant19137, - Variant19138, - Variant19139, - Variant19140, - Variant19141, - Variant19142, - Variant19143, - Variant19144, - Variant19145, - Variant19146, - Variant19147, - Variant19148, - Variant19149, - Variant19150, - Variant19151, - Variant19152, - Variant19153, - Variant19154, - Variant19155, - Variant19156, - Variant19157, - Variant19158, - Variant19159, - Variant19160, - Variant19161, - Variant19162, - Variant19163, - Variant19164, - Variant19165, - Variant19166, - Variant19167, - Variant19168, - Variant19169, - Variant19170, - Variant19171, - Variant19172, - Variant19173, - Variant19174, - Variant19175, - Variant19176, - Variant19177, - Variant19178, - Variant19179, - Variant19180, - Variant19181, - Variant19182, - Variant19183, - Variant19184, - Variant19185, - Variant19186, - Variant19187, - Variant19188, - Variant19189, - Variant19190, - Variant19191, - Variant19192, - Variant19193, - Variant19194, - Variant19195, - Variant19196, - Variant19197, - Variant19198, - Variant19199, - Variant19200, - Variant19201, - Variant19202, - Variant19203, - Variant19204, - Variant19205, - Variant19206, - Variant19207, - Variant19208, - Variant19209, - Variant19210, - Variant19211, - Variant19212, - Variant19213, - Variant19214, - Variant19215, - Variant19216, - Variant19217, - Variant19218, - Variant19219, - Variant19220, - Variant19221, - Variant19222, - Variant19223, - Variant19224, - Variant19225, - Variant19226, - Variant19227, - Variant19228, - Variant19229, - Variant19230, - Variant19231, - Variant19232, - Variant19233, - Variant19234, - Variant19235, - Variant19236, - Variant19237, - Variant19238, - Variant19239, - Variant19240, - Variant19241, - Variant19242, - Variant19243, - Variant19244, - Variant19245, - Variant19246, - Variant19247, - Variant19248, - Variant19249, - Variant19250, - Variant19251, - Variant19252, - Variant19253, - Variant19254, - Variant19255, - Variant19256, - Variant19257, - Variant19258, - Variant19259, - Variant19260, - Variant19261, - Variant19262, - Variant19263, - Variant19264, - Variant19265, - Variant19266, - Variant19267, - Variant19268, - Variant19269, - Variant19270, - Variant19271, - Variant19272, - Variant19273, - Variant19274, - Variant19275, - Variant19276, - Variant19277, - Variant19278, - Variant19279, - Variant19280, - Variant19281, - Variant19282, - Variant19283, - Variant19284, - Variant19285, - Variant19286, - Variant19287, - Variant19288, - Variant19289, - Variant19290, - Variant19291, - Variant19292, - Variant19293, - Variant19294, - Variant19295, - Variant19296, - Variant19297, - Variant19298, - Variant19299, - Variant19300, - Variant19301, - Variant19302, - Variant19303, - Variant19304, - Variant19305, - Variant19306, - Variant19307, - Variant19308, - Variant19309, - Variant19310, - Variant19311, - Variant19312, - Variant19313, - Variant19314, - Variant19315, - Variant19316, - Variant19317, - Variant19318, - Variant19319, - Variant19320, - Variant19321, - Variant19322, - Variant19323, - Variant19324, - Variant19325, - Variant19326, - Variant19327, - Variant19328, - Variant19329, - Variant19330, - Variant19331, - Variant19332, - Variant19333, - Variant19334, - Variant19335, - Variant19336, - Variant19337, - Variant19338, - Variant19339, - Variant19340, - Variant19341, - Variant19342, - Variant19343, - Variant19344, - Variant19345, - Variant19346, - Variant19347, - Variant19348, - Variant19349, - Variant19350, - Variant19351, - Variant19352, - Variant19353, - Variant19354, - Variant19355, - Variant19356, - Variant19357, - Variant19358, - Variant19359, - Variant19360, - Variant19361, - Variant19362, - Variant19363, - Variant19364, - Variant19365, - Variant19366, - Variant19367, - Variant19368, - Variant19369, - Variant19370, - Variant19371, - Variant19372, - Variant19373, - Variant19374, - Variant19375, - Variant19376, - Variant19377, - Variant19378, - Variant19379, - Variant19380, - Variant19381, - Variant19382, - Variant19383, - Variant19384, - Variant19385, - Variant19386, - Variant19387, - Variant19388, - Variant19389, - Variant19390, - Variant19391, - Variant19392, - Variant19393, - Variant19394, - Variant19395, - Variant19396, - Variant19397, - Variant19398, - Variant19399, - Variant19400, - Variant19401, - Variant19402, - Variant19403, - Variant19404, - Variant19405, - Variant19406, - Variant19407, - Variant19408, - Variant19409, - Variant19410, - Variant19411, - Variant19412, - Variant19413, - Variant19414, - Variant19415, - Variant19416, - Variant19417, - Variant19418, - Variant19419, - Variant19420, - Variant19421, - Variant19422, - Variant19423, - Variant19424, - Variant19425, - Variant19426, - Variant19427, - Variant19428, - Variant19429, - Variant19430, - Variant19431, - Variant19432, - Variant19433, - Variant19434, - Variant19435, - Variant19436, - Variant19437, - Variant19438, - Variant19439, - Variant19440, - Variant19441, - Variant19442, - Variant19443, - Variant19444, - Variant19445, - Variant19446, - Variant19447, - Variant19448, - Variant19449, - Variant19450, - Variant19451, - Variant19452, - Variant19453, - Variant19454, - Variant19455, - Variant19456, - Variant19457, - Variant19458, - Variant19459, - Variant19460, - Variant19461, - Variant19462, - Variant19463, - Variant19464, - Variant19465, - Variant19466, - Variant19467, - Variant19468, - Variant19469, - Variant19470, - Variant19471, - Variant19472, - Variant19473, - Variant19474, - Variant19475, - Variant19476, - Variant19477, - Variant19478, - Variant19479, - Variant19480, - Variant19481, - Variant19482, - Variant19483, - Variant19484, - Variant19485, - Variant19486, - Variant19487, - Variant19488, - Variant19489, - Variant19490, - Variant19491, - Variant19492, - Variant19493, - Variant19494, - Variant19495, - Variant19496, - Variant19497, - Variant19498, - Variant19499, - Variant19500, - Variant19501, - Variant19502, - Variant19503, - Variant19504, - Variant19505, - Variant19506, - Variant19507, - Variant19508, - Variant19509, - Variant19510, - Variant19511, - Variant19512, - Variant19513, - Variant19514, - Variant19515, - Variant19516, - Variant19517, - Variant19518, - Variant19519, - Variant19520, - Variant19521, - Variant19522, - Variant19523, - Variant19524, - Variant19525, - Variant19526, - Variant19527, - Variant19528, - Variant19529, - Variant19530, - Variant19531, - Variant19532, - Variant19533, - Variant19534, - Variant19535, - Variant19536, - Variant19537, - Variant19538, - Variant19539, - Variant19540, - Variant19541, - Variant19542, - Variant19543, - Variant19544, - Variant19545, - Variant19546, - Variant19547, - Variant19548, - Variant19549, - Variant19550, - Variant19551, - Variant19552, - Variant19553, - Variant19554, - Variant19555, - Variant19556, - Variant19557, - Variant19558, - Variant19559, - Variant19560, - Variant19561, - Variant19562, - Variant19563, - Variant19564, - Variant19565, - Variant19566, - Variant19567, - Variant19568, - Variant19569, - Variant19570, - Variant19571, - Variant19572, - Variant19573, - Variant19574, - Variant19575, - Variant19576, - Variant19577, - Variant19578, - Variant19579, - Variant19580, - Variant19581, - Variant19582, - Variant19583, - Variant19584, - Variant19585, - Variant19586, - Variant19587, - Variant19588, - Variant19589, - Variant19590, - Variant19591, - Variant19592, - Variant19593, - Variant19594, - Variant19595, - Variant19596, - Variant19597, - Variant19598, - Variant19599, - Variant19600, - Variant19601, - Variant19602, - Variant19603, - Variant19604, - Variant19605, - Variant19606, - Variant19607, - Variant19608, - Variant19609, - Variant19610, - Variant19611, - Variant19612, - Variant19613, - Variant19614, - Variant19615, - Variant19616, - Variant19617, - Variant19618, - Variant19619, - Variant19620, - Variant19621, - Variant19622, - Variant19623, - Variant19624, - Variant19625, - Variant19626, - Variant19627, - Variant19628, - Variant19629, - Variant19630, - Variant19631, - Variant19632, - Variant19633, - Variant19634, - Variant19635, - Variant19636, - Variant19637, - Variant19638, - Variant19639, - Variant19640, - Variant19641, - Variant19642, - Variant19643, - Variant19644, - Variant19645, - Variant19646, - Variant19647, - Variant19648, - Variant19649, - Variant19650, - Variant19651, - Variant19652, - Variant19653, - Variant19654, - Variant19655, - Variant19656, - Variant19657, - Variant19658, - Variant19659, - Variant19660, - Variant19661, - Variant19662, - Variant19663, - Variant19664, - Variant19665, - Variant19666, - Variant19667, - Variant19668, - Variant19669, - Variant19670, - Variant19671, - Variant19672, - Variant19673, - Variant19674, - Variant19675, - Variant19676, - Variant19677, - Variant19678, - Variant19679, - Variant19680, - Variant19681, - Variant19682, - Variant19683, - Variant19684, - Variant19685, - Variant19686, - Variant19687, - Variant19688, - Variant19689, - Variant19690, - Variant19691, - Variant19692, - Variant19693, - Variant19694, - Variant19695, - Variant19696, - Variant19697, - Variant19698, - Variant19699, - Variant19700, - Variant19701, - Variant19702, - Variant19703, - Variant19704, - Variant19705, - Variant19706, - Variant19707, - Variant19708, - Variant19709, - Variant19710, - Variant19711, - Variant19712, - Variant19713, - Variant19714, - Variant19715, - Variant19716, - Variant19717, - Variant19718, - Variant19719, - Variant19720, - Variant19721, - Variant19722, - Variant19723, - Variant19724, - Variant19725, - Variant19726, - Variant19727, - Variant19728, - Variant19729, - Variant19730, - Variant19731, - Variant19732, - Variant19733, - Variant19734, - Variant19735, - Variant19736, - Variant19737, - Variant19738, - Variant19739, - Variant19740, - Variant19741, - Variant19742, - Variant19743, - Variant19744, - Variant19745, - Variant19746, - Variant19747, - Variant19748, - Variant19749, - Variant19750, - Variant19751, - Variant19752, - Variant19753, - Variant19754, - Variant19755, - Variant19756, - Variant19757, - Variant19758, - Variant19759, - Variant19760, - Variant19761, - Variant19762, - Variant19763, - Variant19764, - Variant19765, - Variant19766, - Variant19767, - Variant19768, - Variant19769, - Variant19770, - Variant19771, - Variant19772, - Variant19773, - Variant19774, - Variant19775, - Variant19776, - Variant19777, - Variant19778, - Variant19779, - Variant19780, - Variant19781, - Variant19782, - Variant19783, - Variant19784, - Variant19785, - Variant19786, - Variant19787, - Variant19788, - Variant19789, - Variant19790, - Variant19791, - Variant19792, - Variant19793, - Variant19794, - Variant19795, - Variant19796, - Variant19797, - Variant19798, - Variant19799, - Variant19800, - Variant19801, - Variant19802, - Variant19803, - Variant19804, - Variant19805, - Variant19806, - Variant19807, - Variant19808, - Variant19809, - Variant19810, - Variant19811, - Variant19812, - Variant19813, - Variant19814, - Variant19815, - Variant19816, - Variant19817, - Variant19818, - Variant19819, - Variant19820, - Variant19821, - Variant19822, - Variant19823, - Variant19824, - Variant19825, - Variant19826, - Variant19827, - Variant19828, - Variant19829, - Variant19830, - Variant19831, - Variant19832, - Variant19833, - Variant19834, - Variant19835, - Variant19836, - Variant19837, - Variant19838, - Variant19839, - Variant19840, - Variant19841, - Variant19842, - Variant19843, - Variant19844, - Variant19845, - Variant19846, - Variant19847, - Variant19848, - Variant19849, - Variant19850, - Variant19851, - Variant19852, - Variant19853, - Variant19854, - Variant19855, - Variant19856, - Variant19857, - Variant19858, - Variant19859, - Variant19860, - Variant19861, - Variant19862, - Variant19863, - Variant19864, - Variant19865, - Variant19866, - Variant19867, - Variant19868, - Variant19869, - Variant19870, - Variant19871, - Variant19872, - Variant19873, - Variant19874, - Variant19875, - Variant19876, - Variant19877, - Variant19878, - Variant19879, - Variant19880, - Variant19881, - Variant19882, - Variant19883, - Variant19884, - Variant19885, - Variant19886, - Variant19887, - Variant19888, - Variant19889, - Variant19890, - Variant19891, - Variant19892, - Variant19893, - Variant19894, - Variant19895, - Variant19896, - Variant19897, - Variant19898, - Variant19899, - Variant19900, - Variant19901, - Variant19902, - Variant19903, - Variant19904, - Variant19905, - Variant19906, - Variant19907, - Variant19908, - Variant19909, - Variant19910, - Variant19911, - Variant19912, - Variant19913, - Variant19914, - Variant19915, - Variant19916, - Variant19917, - Variant19918, - Variant19919, - Variant19920, - Variant19921, - Variant19922, - Variant19923, - Variant19924, - Variant19925, - Variant19926, - Variant19927, - Variant19928, - Variant19929, - Variant19930, - Variant19931, - Variant19932, - Variant19933, - Variant19934, - Variant19935, - Variant19936, - Variant19937, - Variant19938, - Variant19939, - Variant19940, - Variant19941, - Variant19942, - Variant19943, - Variant19944, - Variant19945, - Variant19946, - Variant19947, - Variant19948, - Variant19949, - Variant19950, - Variant19951, - Variant19952, - Variant19953, - Variant19954, - Variant19955, - Variant19956, - Variant19957, - Variant19958, - Variant19959, - Variant19960, - Variant19961, - Variant19962, - Variant19963, - Variant19964, - Variant19965, - Variant19966, - Variant19967, - Variant19968, - Variant19969, - Variant19970, - Variant19971, - Variant19972, - Variant19973, - Variant19974, - Variant19975, - Variant19976, - Variant19977, - Variant19978, - Variant19979, - Variant19980, - Variant19981, - Variant19982, - Variant19983, - Variant19984, - Variant19985, - Variant19986, - Variant19987, - Variant19988, - Variant19989, - Variant19990, - Variant19991, - Variant19992, - Variant19993, - Variant19994, - Variant19995, - Variant19996, - Variant19997, - Variant19998, - Variant19999, - Variant20000, - Variant20001, - Variant20002, - Variant20003, - Variant20004, - Variant20005, - Variant20006, - Variant20007, - Variant20008, - Variant20009, - Variant20010, - Variant20011, - Variant20012, - Variant20013, - Variant20014, - Variant20015, - Variant20016, - Variant20017, - Variant20018, - Variant20019, - Variant20020, - Variant20021, - Variant20022, - Variant20023, - Variant20024, - Variant20025, - Variant20026, - Variant20027, - Variant20028, - Variant20029, - Variant20030, - Variant20031, - Variant20032, - Variant20033, - Variant20034, - Variant20035, - Variant20036, - Variant20037, - Variant20038, - Variant20039, - Variant20040, - Variant20041, - Variant20042, - Variant20043, - Variant20044, - Variant20045, - Variant20046, - Variant20047, - Variant20048, - Variant20049, - Variant20050, - Variant20051, - Variant20052, - Variant20053, - Variant20054, - Variant20055, - Variant20056, - Variant20057, - Variant20058, - Variant20059, - Variant20060, - Variant20061, - Variant20062, - Variant20063, - Variant20064, - Variant20065, - Variant20066, - Variant20067, - Variant20068, - Variant20069, - Variant20070, - Variant20071, - Variant20072, - Variant20073, - Variant20074, - Variant20075, - Variant20076, - Variant20077, - Variant20078, - Variant20079, - Variant20080, - Variant20081, - Variant20082, - Variant20083, - Variant20084, - Variant20085, - Variant20086, - Variant20087, - Variant20088, - Variant20089, - Variant20090, - Variant20091, - Variant20092, - Variant20093, - Variant20094, - Variant20095, - Variant20096, - Variant20097, - Variant20098, - Variant20099, - Variant20100, - Variant20101, - Variant20102, - Variant20103, - Variant20104, - Variant20105, - Variant20106, - Variant20107, - Variant20108, - Variant20109, - Variant20110, - Variant20111, - Variant20112, - Variant20113, - Variant20114, - Variant20115, - Variant20116, - Variant20117, - Variant20118, - Variant20119, - Variant20120, - Variant20121, - Variant20122, - Variant20123, - Variant20124, - Variant20125, - Variant20126, - Variant20127, - Variant20128, - Variant20129, - Variant20130, - Variant20131, - Variant20132, - Variant20133, - Variant20134, - Variant20135, - Variant20136, - Variant20137, - Variant20138, - Variant20139, - Variant20140, - Variant20141, - Variant20142, - Variant20143, - Variant20144, - Variant20145, - Variant20146, - Variant20147, - Variant20148, - Variant20149, - Variant20150, - Variant20151, - Variant20152, - Variant20153, - Variant20154, - Variant20155, - Variant20156, - Variant20157, - Variant20158, - Variant20159, - Variant20160, - Variant20161, - Variant20162, - Variant20163, - Variant20164, - Variant20165, - Variant20166, - Variant20167, - Variant20168, - Variant20169, - Variant20170, - Variant20171, - Variant20172, - Variant20173, - Variant20174, - Variant20175, - Variant20176, - Variant20177, - Variant20178, - Variant20179, - Variant20180, - Variant20181, - Variant20182, - Variant20183, - Variant20184, - Variant20185, - Variant20186, - Variant20187, - Variant20188, - Variant20189, - Variant20190, - Variant20191, - Variant20192, - Variant20193, - Variant20194, - Variant20195, - Variant20196, - Variant20197, - Variant20198, - Variant20199, - Variant20200, - Variant20201, - Variant20202, - Variant20203, - Variant20204, - Variant20205, - Variant20206, - Variant20207, - Variant20208, - Variant20209, - Variant20210, - Variant20211, - Variant20212, - Variant20213, - Variant20214, - Variant20215, - Variant20216, - Variant20217, - Variant20218, - Variant20219, - Variant20220, - Variant20221, - Variant20222, - Variant20223, - Variant20224, - Variant20225, - Variant20226, - Variant20227, - Variant20228, - Variant20229, - Variant20230, - Variant20231, - Variant20232, - Variant20233, - Variant20234, - Variant20235, - Variant20236, - Variant20237, - Variant20238, - Variant20239, - Variant20240, - Variant20241, - Variant20242, - Variant20243, - Variant20244, - Variant20245, - Variant20246, - Variant20247, - Variant20248, - Variant20249, - Variant20250, - Variant20251, - Variant20252, - Variant20253, - Variant20254, - Variant20255, - Variant20256, - Variant20257, - Variant20258, - Variant20259, - Variant20260, - Variant20261, - Variant20262, - Variant20263, - Variant20264, - Variant20265, - Variant20266, - Variant20267, - Variant20268, - Variant20269, - Variant20270, - Variant20271, - Variant20272, - Variant20273, - Variant20274, - Variant20275, - Variant20276, - Variant20277, - Variant20278, - Variant20279, - Variant20280, - Variant20281, - Variant20282, - Variant20283, - Variant20284, - Variant20285, - Variant20286, - Variant20287, - Variant20288, - Variant20289, - Variant20290, - Variant20291, - Variant20292, - Variant20293, - Variant20294, - Variant20295, - Variant20296, - Variant20297, - Variant20298, - Variant20299, - Variant20300, - Variant20301, - Variant20302, - Variant20303, - Variant20304, - Variant20305, - Variant20306, - Variant20307, - Variant20308, - Variant20309, - Variant20310, - Variant20311, - Variant20312, - Variant20313, - Variant20314, - Variant20315, - Variant20316, - Variant20317, - Variant20318, - Variant20319, - Variant20320, - Variant20321, - Variant20322, - Variant20323, - Variant20324, - Variant20325, - Variant20326, - Variant20327, - Variant20328, - Variant20329, - Variant20330, - Variant20331, - Variant20332, - Variant20333, - Variant20334, - Variant20335, - Variant20336, - Variant20337, - Variant20338, - Variant20339, - Variant20340, - Variant20341, - Variant20342, - Variant20343, - Variant20344, - Variant20345, - Variant20346, - Variant20347, - Variant20348, - Variant20349, - Variant20350, - Variant20351, - Variant20352, - Variant20353, - Variant20354, - Variant20355, - Variant20356, - Variant20357, - Variant20358, - Variant20359, - Variant20360, - Variant20361, - Variant20362, - Variant20363, - Variant20364, - Variant20365, - Variant20366, - Variant20367, - Variant20368, - Variant20369, - Variant20370, - Variant20371, - Variant20372, - Variant20373, - Variant20374, - Variant20375, - Variant20376, - Variant20377, - Variant20378, - Variant20379, - Variant20380, - Variant20381, - Variant20382, - Variant20383, - Variant20384, - Variant20385, - Variant20386, - Variant20387, - Variant20388, - Variant20389, - Variant20390, - Variant20391, - Variant20392, - Variant20393, - Variant20394, - Variant20395, - Variant20396, - Variant20397, - Variant20398, - Variant20399, - Variant20400, - Variant20401, - Variant20402, - Variant20403, - Variant20404, - Variant20405, - Variant20406, - Variant20407, - Variant20408, - Variant20409, - Variant20410, - Variant20411, - Variant20412, - Variant20413, - Variant20414, - Variant20415, - Variant20416, - Variant20417, - Variant20418, - Variant20419, - Variant20420, - Variant20421, - Variant20422, - Variant20423, - Variant20424, - Variant20425, - Variant20426, - Variant20427, - Variant20428, - Variant20429, - Variant20430, - Variant20431, - Variant20432, - Variant20433, - Variant20434, - Variant20435, - Variant20436, - Variant20437, - Variant20438, - Variant20439, - Variant20440, - Variant20441, - Variant20442, - Variant20443, - Variant20444, - Variant20445, - Variant20446, - Variant20447, - Variant20448, - Variant20449, - Variant20450, - Variant20451, - Variant20452, - Variant20453, - Variant20454, - Variant20455, - Variant20456, - Variant20457, - Variant20458, - Variant20459, - Variant20460, - Variant20461, - Variant20462, - Variant20463, - Variant20464, - Variant20465, - Variant20466, - Variant20467, - Variant20468, - Variant20469, - Variant20470, - Variant20471, - Variant20472, - Variant20473, - Variant20474, - Variant20475, - Variant20476, - Variant20477, - Variant20478, - Variant20479, - Variant20480, - Variant20481, - Variant20482, - Variant20483, - Variant20484, - Variant20485, - Variant20486, - Variant20487, - Variant20488, - Variant20489, - Variant20490, - Variant20491, - Variant20492, - Variant20493, - Variant20494, - Variant20495, - Variant20496, - Variant20497, - Variant20498, - Variant20499, - Variant20500, - Variant20501, - Variant20502, - Variant20503, - Variant20504, - Variant20505, - Variant20506, - Variant20507, - Variant20508, - Variant20509, - Variant20510, - Variant20511, - Variant20512, - Variant20513, - Variant20514, - Variant20515, - Variant20516, - Variant20517, - Variant20518, - Variant20519, - Variant20520, - Variant20521, - Variant20522, - Variant20523, - Variant20524, - Variant20525, - Variant20526, - Variant20527, - Variant20528, - Variant20529, - Variant20530, - Variant20531, - Variant20532, - Variant20533, - Variant20534, - Variant20535, - Variant20536, - Variant20537, - Variant20538, - Variant20539, - Variant20540, - Variant20541, - Variant20542, - Variant20543, - Variant20544, - Variant20545, - Variant20546, - Variant20547, - Variant20548, - Variant20549, - Variant20550, - Variant20551, - Variant20552, - Variant20553, - Variant20554, - Variant20555, - Variant20556, - Variant20557, - Variant20558, - Variant20559, - Variant20560, - Variant20561, - Variant20562, - Variant20563, - Variant20564, - Variant20565, - Variant20566, - Variant20567, - Variant20568, - Variant20569, - Variant20570, - Variant20571, - Variant20572, - Variant20573, - Variant20574, - Variant20575, - Variant20576, - Variant20577, - Variant20578, - Variant20579, - Variant20580, - Variant20581, - Variant20582, - Variant20583, - Variant20584, - Variant20585, - Variant20586, - Variant20587, - Variant20588, - Variant20589, - Variant20590, - Variant20591, - Variant20592, - Variant20593, - Variant20594, - Variant20595, - Variant20596, - Variant20597, - Variant20598, - Variant20599, - Variant20600, - Variant20601, - Variant20602, - Variant20603, - Variant20604, - Variant20605, - Variant20606, - Variant20607, - Variant20608, - Variant20609, - Variant20610, - Variant20611, - Variant20612, - Variant20613, - Variant20614, - Variant20615, - Variant20616, - Variant20617, - Variant20618, - Variant20619, - Variant20620, - Variant20621, - Variant20622, - Variant20623, - Variant20624, - Variant20625, - Variant20626, - Variant20627, - Variant20628, - Variant20629, - Variant20630, - Variant20631, - Variant20632, - Variant20633, - Variant20634, - Variant20635, - Variant20636, - Variant20637, - Variant20638, - Variant20639, - Variant20640, - Variant20641, - Variant20642, - Variant20643, - Variant20644, - Variant20645, - Variant20646, - Variant20647, - Variant20648, - Variant20649, - Variant20650, - Variant20651, - Variant20652, - Variant20653, - Variant20654, - Variant20655, - Variant20656, - Variant20657, - Variant20658, - Variant20659, - Variant20660, - Variant20661, - Variant20662, - Variant20663, - Variant20664, - Variant20665, - Variant20666, - Variant20667, - Variant20668, - Variant20669, - Variant20670, - Variant20671, - Variant20672, - Variant20673, - Variant20674, - Variant20675, - Variant20676, - Variant20677, - Variant20678, - Variant20679, - Variant20680, - Variant20681, - Variant20682, - Variant20683, - Variant20684, - Variant20685, - Variant20686, - Variant20687, - Variant20688, - Variant20689, - Variant20690, - Variant20691, - Variant20692, - Variant20693, - Variant20694, - Variant20695, - Variant20696, - Variant20697, - Variant20698, - Variant20699, - Variant20700, - Variant20701, - Variant20702, - Variant20703, - Variant20704, - Variant20705, - Variant20706, - Variant20707, - Variant20708, - Variant20709, - Variant20710, - Variant20711, - Variant20712, - Variant20713, - Variant20714, - Variant20715, - Variant20716, - Variant20717, - Variant20718, - Variant20719, - Variant20720, - Variant20721, - Variant20722, - Variant20723, - Variant20724, - Variant20725, - Variant20726, - Variant20727, - Variant20728, - Variant20729, - Variant20730, - Variant20731, - Variant20732, - Variant20733, - Variant20734, - Variant20735, - Variant20736, - Variant20737, - Variant20738, - Variant20739, - Variant20740, - Variant20741, - Variant20742, - Variant20743, - Variant20744, - Variant20745, - Variant20746, - Variant20747, - Variant20748, - Variant20749, - Variant20750, - Variant20751, - Variant20752, - Variant20753, - Variant20754, - Variant20755, - Variant20756, - Variant20757, - Variant20758, - Variant20759, - Variant20760, - Variant20761, - Variant20762, - Variant20763, - Variant20764, - Variant20765, - Variant20766, - Variant20767, - Variant20768, - Variant20769, - Variant20770, - Variant20771, - Variant20772, - Variant20773, - Variant20774, - Variant20775, - Variant20776, - Variant20777, - Variant20778, - Variant20779, - Variant20780, - Variant20781, - Variant20782, - Variant20783, - Variant20784, - Variant20785, - Variant20786, - Variant20787, - Variant20788, - Variant20789, - Variant20790, - Variant20791, - Variant20792, - Variant20793, - Variant20794, - Variant20795, - Variant20796, - Variant20797, - Variant20798, - Variant20799, - Variant20800, - Variant20801, - Variant20802, - Variant20803, - Variant20804, - Variant20805, - Variant20806, - Variant20807, - Variant20808, - Variant20809, - Variant20810, - Variant20811, - Variant20812, - Variant20813, - Variant20814, - Variant20815, - Variant20816, - Variant20817, - Variant20818, - Variant20819, - Variant20820, - Variant20821, - Variant20822, - Variant20823, - Variant20824, - Variant20825, - Variant20826, - Variant20827, - Variant20828, - Variant20829, - Variant20830, - Variant20831, - Variant20832, - Variant20833, - Variant20834, - Variant20835, - Variant20836, - Variant20837, - Variant20838, - Variant20839, - Variant20840, - Variant20841, - Variant20842, - Variant20843, - Variant20844, - Variant20845, - Variant20846, - Variant20847, - Variant20848, - Variant20849, - Variant20850, - Variant20851, - Variant20852, - Variant20853, - Variant20854, - Variant20855, - Variant20856, - Variant20857, - Variant20858, - Variant20859, - Variant20860, - Variant20861, - Variant20862, - Variant20863, - Variant20864, - Variant20865, - Variant20866, - Variant20867, - Variant20868, - Variant20869, - Variant20870, - Variant20871, - Variant20872, - Variant20873, - Variant20874, - Variant20875, - Variant20876, - Variant20877, - Variant20878, - Variant20879, - Variant20880, - Variant20881, - Variant20882, - Variant20883, - Variant20884, - Variant20885, - Variant20886, - Variant20887, - Variant20888, - Variant20889, - Variant20890, - Variant20891, - Variant20892, - Variant20893, - Variant20894, - Variant20895, - Variant20896, - Variant20897, - Variant20898, - Variant20899, - Variant20900, - Variant20901, - Variant20902, - Variant20903, - Variant20904, - Variant20905, - Variant20906, - Variant20907, - Variant20908, - Variant20909, - Variant20910, - Variant20911, - Variant20912, - Variant20913, - Variant20914, - Variant20915, - Variant20916, - Variant20917, - Variant20918, - Variant20919, - Variant20920, - Variant20921, - Variant20922, - Variant20923, - Variant20924, - Variant20925, - Variant20926, - Variant20927, - Variant20928, - Variant20929, - Variant20930, - Variant20931, - Variant20932, - Variant20933, - Variant20934, - Variant20935, - Variant20936, - Variant20937, - Variant20938, - Variant20939, - Variant20940, - Variant20941, - Variant20942, - Variant20943, - Variant20944, - Variant20945, - Variant20946, - Variant20947, - Variant20948, - Variant20949, - Variant20950, - Variant20951, - Variant20952, - Variant20953, - Variant20954, - Variant20955, - Variant20956, - Variant20957, - Variant20958, - Variant20959, - Variant20960, - Variant20961, - Variant20962, - Variant20963, - Variant20964, - Variant20965, - Variant20966, - Variant20967, - Variant20968, - Variant20969, - Variant20970, - Variant20971, - Variant20972, - Variant20973, - Variant20974, - Variant20975, - Variant20976, - Variant20977, - Variant20978, - Variant20979, - Variant20980, - Variant20981, - Variant20982, - Variant20983, - Variant20984, - Variant20985, - Variant20986, - Variant20987, - Variant20988, - Variant20989, - Variant20990, - Variant20991, - Variant20992, - Variant20993, - Variant20994, - Variant20995, - Variant20996, - Variant20997, - Variant20998, - Variant20999, - Variant21000, - Variant21001, - Variant21002, - Variant21003, - Variant21004, - Variant21005, - Variant21006, - Variant21007, - Variant21008, - Variant21009, - Variant21010, - Variant21011, - Variant21012, - Variant21013, - Variant21014, - Variant21015, - Variant21016, - Variant21017, - Variant21018, - Variant21019, - Variant21020, - Variant21021, - Variant21022, - Variant21023, - Variant21024, - Variant21025, - Variant21026, - Variant21027, - Variant21028, - Variant21029, - Variant21030, - Variant21031, - Variant21032, - Variant21033, - Variant21034, - Variant21035, - Variant21036, - Variant21037, - Variant21038, - Variant21039, - Variant21040, - Variant21041, - Variant21042, - Variant21043, - Variant21044, - Variant21045, - Variant21046, - Variant21047, - Variant21048, - Variant21049, - Variant21050, - Variant21051, - Variant21052, - Variant21053, - Variant21054, - Variant21055, - Variant21056, - Variant21057, - Variant21058, - Variant21059, - Variant21060, - Variant21061, - Variant21062, - Variant21063, - Variant21064, - Variant21065, - Variant21066, - Variant21067, - Variant21068, - Variant21069, - Variant21070, - Variant21071, - Variant21072, - Variant21073, - Variant21074, - Variant21075, - Variant21076, - Variant21077, - Variant21078, - Variant21079, - Variant21080, - Variant21081, - Variant21082, - Variant21083, - Variant21084, - Variant21085, - Variant21086, - Variant21087, - Variant21088, - Variant21089, - Variant21090, - Variant21091, - Variant21092, - Variant21093, - Variant21094, - Variant21095, - Variant21096, - Variant21097, - Variant21098, - Variant21099, - Variant21100, - Variant21101, - Variant21102, - Variant21103, - Variant21104, - Variant21105, - Variant21106, - Variant21107, - Variant21108, - Variant21109, - Variant21110, - Variant21111, - Variant21112, - Variant21113, - Variant21114, - Variant21115, - Variant21116, - Variant21117, - Variant21118, - Variant21119, - Variant21120, - Variant21121, - Variant21122, - Variant21123, - Variant21124, - Variant21125, - Variant21126, - Variant21127, - Variant21128, - Variant21129, - Variant21130, - Variant21131, - Variant21132, - Variant21133, - Variant21134, - Variant21135, - Variant21136, - Variant21137, - Variant21138, - Variant21139, - Variant21140, - Variant21141, - Variant21142, - Variant21143, - Variant21144, - Variant21145, - Variant21146, - Variant21147, - Variant21148, - Variant21149, - Variant21150, - Variant21151, - Variant21152, - Variant21153, - Variant21154, - Variant21155, - Variant21156, - Variant21157, - Variant21158, - Variant21159, - Variant21160, - Variant21161, - Variant21162, - Variant21163, - Variant21164, - Variant21165, - Variant21166, - Variant21167, - Variant21168, - Variant21169, - Variant21170, - Variant21171, - Variant21172, - Variant21173, - Variant21174, - Variant21175, - Variant21176, - Variant21177, - Variant21178, - Variant21179, - Variant21180, - Variant21181, - Variant21182, - Variant21183, - Variant21184, - Variant21185, - Variant21186, - Variant21187, - Variant21188, - Variant21189, - Variant21190, - Variant21191, - Variant21192, - Variant21193, - Variant21194, - Variant21195, - Variant21196, - Variant21197, - Variant21198, - Variant21199, - Variant21200, - Variant21201, - Variant21202, - Variant21203, - Variant21204, - Variant21205, - Variant21206, - Variant21207, - Variant21208, - Variant21209, - Variant21210, - Variant21211, - Variant21212, - Variant21213, - Variant21214, - Variant21215, - Variant21216, - Variant21217, - Variant21218, - Variant21219, - Variant21220, - Variant21221, - Variant21222, - Variant21223, - Variant21224, - Variant21225, - Variant21226, - Variant21227, - Variant21228, - Variant21229, - Variant21230, - Variant21231, - Variant21232, - Variant21233, - Variant21234, - Variant21235, - Variant21236, - Variant21237, - Variant21238, - Variant21239, - Variant21240, - Variant21241, - Variant21242, - Variant21243, - Variant21244, - Variant21245, - Variant21246, - Variant21247, - Variant21248, - Variant21249, - Variant21250, - Variant21251, - Variant21252, - Variant21253, - Variant21254, - Variant21255, - Variant21256, - Variant21257, - Variant21258, - Variant21259, - Variant21260, - Variant21261, - Variant21262, - Variant21263, - Variant21264, - Variant21265, - Variant21266, - Variant21267, - Variant21268, - Variant21269, - Variant21270, - Variant21271, - Variant21272, - Variant21273, - Variant21274, - Variant21275, - Variant21276, - Variant21277, - Variant21278, - Variant21279, - Variant21280, - Variant21281, - Variant21282, - Variant21283, - Variant21284, - Variant21285, - Variant21286, - Variant21287, - Variant21288, - Variant21289, - Variant21290, - Variant21291, - Variant21292, - Variant21293, - Variant21294, - Variant21295, - Variant21296, - Variant21297, - Variant21298, - Variant21299, - Variant21300, - Variant21301, - Variant21302, - Variant21303, - Variant21304, - Variant21305, - Variant21306, - Variant21307, - Variant21308, - Variant21309, - Variant21310, - Variant21311, - Variant21312, - Variant21313, - Variant21314, - Variant21315, - Variant21316, - Variant21317, - Variant21318, - Variant21319, - Variant21320, - Variant21321, - Variant21322, - Variant21323, - Variant21324, - Variant21325, - Variant21326, - Variant21327, - Variant21328, - Variant21329, - Variant21330, - Variant21331, - Variant21332, - Variant21333, - Variant21334, - Variant21335, - Variant21336, - Variant21337, - Variant21338, - Variant21339, - Variant21340, - Variant21341, - Variant21342, - Variant21343, - Variant21344, - Variant21345, - Variant21346, - Variant21347, - Variant21348, - Variant21349, - Variant21350, - Variant21351, - Variant21352, - Variant21353, - Variant21354, - Variant21355, - Variant21356, - Variant21357, - Variant21358, - Variant21359, - Variant21360, - Variant21361, - Variant21362, - Variant21363, - Variant21364, - Variant21365, - Variant21366, - Variant21367, - Variant21368, - Variant21369, - Variant21370, - Variant21371, - Variant21372, - Variant21373, - Variant21374, - Variant21375, - Variant21376, - Variant21377, - Variant21378, - Variant21379, - Variant21380, - Variant21381, - Variant21382, - Variant21383, - Variant21384, - Variant21385, - Variant21386, - Variant21387, - Variant21388, - Variant21389, - Variant21390, - Variant21391, - Variant21392, - Variant21393, - Variant21394, - Variant21395, - Variant21396, - Variant21397, - Variant21398, - Variant21399, - Variant21400, - Variant21401, - Variant21402, - Variant21403, - Variant21404, - Variant21405, - Variant21406, - Variant21407, - Variant21408, - Variant21409, - Variant21410, - Variant21411, - Variant21412, - Variant21413, - Variant21414, - Variant21415, - Variant21416, - Variant21417, - Variant21418, - Variant21419, - Variant21420, - Variant21421, - Variant21422, - Variant21423, - Variant21424, - Variant21425, - Variant21426, - Variant21427, - Variant21428, - Variant21429, - Variant21430, - Variant21431, - Variant21432, - Variant21433, - Variant21434, - Variant21435, - Variant21436, - Variant21437, - Variant21438, - Variant21439, - Variant21440, - Variant21441, - Variant21442, - Variant21443, - Variant21444, - Variant21445, - Variant21446, - Variant21447, - Variant21448, - Variant21449, - Variant21450, - Variant21451, - Variant21452, - Variant21453, - Variant21454, - Variant21455, - Variant21456, - Variant21457, - Variant21458, - Variant21459, - Variant21460, - Variant21461, - Variant21462, - Variant21463, - Variant21464, - Variant21465, - Variant21466, - Variant21467, - Variant21468, - Variant21469, - Variant21470, - Variant21471, - Variant21472, - Variant21473, - Variant21474, - Variant21475, - Variant21476, - Variant21477, - Variant21478, - Variant21479, - Variant21480, - Variant21481, - Variant21482, - Variant21483, - Variant21484, - Variant21485, - Variant21486, - Variant21487, - Variant21488, - Variant21489, - Variant21490, - Variant21491, - Variant21492, - Variant21493, - Variant21494, - Variant21495, - Variant21496, - Variant21497, - Variant21498, - Variant21499, - Variant21500, - Variant21501, - Variant21502, - Variant21503, - Variant21504, - Variant21505, - Variant21506, - Variant21507, - Variant21508, - Variant21509, - Variant21510, - Variant21511, - Variant21512, - Variant21513, - Variant21514, - Variant21515, - Variant21516, - Variant21517, - Variant21518, - Variant21519, - Variant21520, - Variant21521, - Variant21522, - Variant21523, - Variant21524, - Variant21525, - Variant21526, - Variant21527, - Variant21528, - Variant21529, - Variant21530, - Variant21531, - Variant21532, - Variant21533, - Variant21534, - Variant21535, - Variant21536, - Variant21537, - Variant21538, - Variant21539, - Variant21540, - Variant21541, - Variant21542, - Variant21543, - Variant21544, - Variant21545, - Variant21546, - Variant21547, - Variant21548, - Variant21549, - Variant21550, - Variant21551, - Variant21552, - Variant21553, - Variant21554, - Variant21555, - Variant21556, - Variant21557, - Variant21558, - Variant21559, - Variant21560, - Variant21561, - Variant21562, - Variant21563, - Variant21564, - Variant21565, - Variant21566, - Variant21567, - Variant21568, - Variant21569, - Variant21570, - Variant21571, - Variant21572, - Variant21573, - Variant21574, - Variant21575, - Variant21576, - Variant21577, - Variant21578, - Variant21579, - Variant21580, - Variant21581, - Variant21582, - Variant21583, - Variant21584, - Variant21585, - Variant21586, - Variant21587, - Variant21588, - Variant21589, - Variant21590, - Variant21591, - Variant21592, - Variant21593, - Variant21594, - Variant21595, - Variant21596, - Variant21597, - Variant21598, - Variant21599, - Variant21600, - Variant21601, - Variant21602, - Variant21603, - Variant21604, - Variant21605, - Variant21606, - Variant21607, - Variant21608, - Variant21609, - Variant21610, - Variant21611, - Variant21612, - Variant21613, - Variant21614, - Variant21615, - Variant21616, - Variant21617, - Variant21618, - Variant21619, - Variant21620, - Variant21621, - Variant21622, - Variant21623, - Variant21624, - Variant21625, - Variant21626, - Variant21627, - Variant21628, - Variant21629, - Variant21630, - Variant21631, - Variant21632, - Variant21633, - Variant21634, - Variant21635, - Variant21636, - Variant21637, - Variant21638, - Variant21639, - Variant21640, - Variant21641, - Variant21642, - Variant21643, - Variant21644, - Variant21645, - Variant21646, - Variant21647, - Variant21648, - Variant21649, - Variant21650, - Variant21651, - Variant21652, - Variant21653, - Variant21654, - Variant21655, - Variant21656, - Variant21657, - Variant21658, - Variant21659, - Variant21660, - Variant21661, - Variant21662, - Variant21663, - Variant21664, - Variant21665, - Variant21666, - Variant21667, - Variant21668, - Variant21669, - Variant21670, - Variant21671, - Variant21672, - Variant21673, - Variant21674, - Variant21675, - Variant21676, - Variant21677, - Variant21678, - Variant21679, - Variant21680, - Variant21681, - Variant21682, - Variant21683, - Variant21684, - Variant21685, - Variant21686, - Variant21687, - Variant21688, - Variant21689, - Variant21690, - Variant21691, - Variant21692, - Variant21693, - Variant21694, - Variant21695, - Variant21696, - Variant21697, - Variant21698, - Variant21699, - Variant21700, - Variant21701, - Variant21702, - Variant21703, - Variant21704, - Variant21705, - Variant21706, - Variant21707, - Variant21708, - Variant21709, - Variant21710, - Variant21711, - Variant21712, - Variant21713, - Variant21714, - Variant21715, - Variant21716, - Variant21717, - Variant21718, - Variant21719, - Variant21720, - Variant21721, - Variant21722, - Variant21723, - Variant21724, - Variant21725, - Variant21726, - Variant21727, - Variant21728, - Variant21729, - Variant21730, - Variant21731, - Variant21732, - Variant21733, - Variant21734, - Variant21735, - Variant21736, - Variant21737, - Variant21738, - Variant21739, - Variant21740, - Variant21741, - Variant21742, - Variant21743, - Variant21744, - Variant21745, - Variant21746, - Variant21747, - Variant21748, - Variant21749, - Variant21750, - Variant21751, - Variant21752, - Variant21753, - Variant21754, - Variant21755, - Variant21756, - Variant21757, - Variant21758, - Variant21759, - Variant21760, - Variant21761, - Variant21762, - Variant21763, - Variant21764, - Variant21765, - Variant21766, - Variant21767, - Variant21768, - Variant21769, - Variant21770, - Variant21771, - Variant21772, - Variant21773, - Variant21774, - Variant21775, - Variant21776, - Variant21777, - Variant21778, - Variant21779, - Variant21780, - Variant21781, - Variant21782, - Variant21783, - Variant21784, - Variant21785, - Variant21786, - Variant21787, - Variant21788, - Variant21789, - Variant21790, - Variant21791, - Variant21792, - Variant21793, - Variant21794, - Variant21795, - Variant21796, - Variant21797, - Variant21798, - Variant21799, - Variant21800, - Variant21801, - Variant21802, - Variant21803, - Variant21804, - Variant21805, - Variant21806, - Variant21807, - Variant21808, - Variant21809, - Variant21810, - Variant21811, - Variant21812, - Variant21813, - Variant21814, - Variant21815, - Variant21816, - Variant21817, - Variant21818, - Variant21819, - Variant21820, - Variant21821, - Variant21822, - Variant21823, - Variant21824, - Variant21825, - Variant21826, - Variant21827, - Variant21828, - Variant21829, - Variant21830, - Variant21831, - Variant21832, - Variant21833, - Variant21834, - Variant21835, - Variant21836, - Variant21837, - Variant21838, - Variant21839, - Variant21840, - Variant21841, - Variant21842, - Variant21843, - Variant21844, - Variant21845, - Variant21846, - Variant21847, - Variant21848, - Variant21849, - Variant21850, - Variant21851, - Variant21852, - Variant21853, - Variant21854, - Variant21855, - Variant21856, - Variant21857, - Variant21858, - Variant21859, - Variant21860, - Variant21861, - Variant21862, - Variant21863, - Variant21864, - Variant21865, - Variant21866, - Variant21867, - Variant21868, - Variant21869, - Variant21870, - Variant21871, - Variant21872, - Variant21873, - Variant21874, - Variant21875, - Variant21876, - Variant21877, - Variant21878, - Variant21879, - Variant21880, - Variant21881, - Variant21882, - Variant21883, - Variant21884, - Variant21885, - Variant21886, - Variant21887, - Variant21888, - Variant21889, - Variant21890, - Variant21891, - Variant21892, - Variant21893, - Variant21894, - Variant21895, - Variant21896, - Variant21897, - Variant21898, - Variant21899, - Variant21900, - Variant21901, - Variant21902, - Variant21903, - Variant21904, - Variant21905, - Variant21906, - Variant21907, - Variant21908, - Variant21909, - Variant21910, - Variant21911, - Variant21912, - Variant21913, - Variant21914, - Variant21915, - Variant21916, - Variant21917, - Variant21918, - Variant21919, - Variant21920, - Variant21921, - Variant21922, - Variant21923, - Variant21924, - Variant21925, - Variant21926, - Variant21927, - Variant21928, - Variant21929, - Variant21930, - Variant21931, - Variant21932, - Variant21933, - Variant21934, - Variant21935, - Variant21936, - Variant21937, - Variant21938, - Variant21939, - Variant21940, - Variant21941, - Variant21942, - Variant21943, - Variant21944, - Variant21945, - Variant21946, - Variant21947, - Variant21948, - Variant21949, - Variant21950, - Variant21951, - Variant21952, - Variant21953, - Variant21954, - Variant21955, - Variant21956, - Variant21957, - Variant21958, - Variant21959, - Variant21960, - Variant21961, - Variant21962, - Variant21963, - Variant21964, - Variant21965, - Variant21966, - Variant21967, - Variant21968, - Variant21969, - Variant21970, - Variant21971, - Variant21972, - Variant21973, - Variant21974, - Variant21975, - Variant21976, - Variant21977, - Variant21978, - Variant21979, - Variant21980, - Variant21981, - Variant21982, - Variant21983, - Variant21984, - Variant21985, - Variant21986, - Variant21987, - Variant21988, - Variant21989, - Variant21990, - Variant21991, - Variant21992, - Variant21993, - Variant21994, - Variant21995, - Variant21996, - Variant21997, - Variant21998, - Variant21999, - Variant22000, - Variant22001, - Variant22002, - Variant22003, - Variant22004, - Variant22005, - Variant22006, - Variant22007, - Variant22008, - Variant22009, - Variant22010, - Variant22011, - Variant22012, - Variant22013, - Variant22014, - Variant22015, - Variant22016, - Variant22017, - Variant22018, - Variant22019, - Variant22020, - Variant22021, - Variant22022, - Variant22023, - Variant22024, - Variant22025, - Variant22026, - Variant22027, - Variant22028, - Variant22029, - Variant22030, - Variant22031, - Variant22032, - Variant22033, - Variant22034, - Variant22035, - Variant22036, - Variant22037, - Variant22038, - Variant22039, - Variant22040, - Variant22041, - Variant22042, - Variant22043, - Variant22044, - Variant22045, - Variant22046, - Variant22047, - Variant22048, - Variant22049, - Variant22050, - Variant22051, - Variant22052, - Variant22053, - Variant22054, - Variant22055, - Variant22056, - Variant22057, - Variant22058, - Variant22059, - Variant22060, - Variant22061, - Variant22062, - Variant22063, - Variant22064, - Variant22065, - Variant22066, - Variant22067, - Variant22068, - Variant22069, - Variant22070, - Variant22071, - Variant22072, - Variant22073, - Variant22074, - Variant22075, - Variant22076, - Variant22077, - Variant22078, - Variant22079, - Variant22080, - Variant22081, - Variant22082, - Variant22083, - Variant22084, - Variant22085, - Variant22086, - Variant22087, - Variant22088, - Variant22089, - Variant22090, - Variant22091, - Variant22092, - Variant22093, - Variant22094, - Variant22095, - Variant22096, - Variant22097, - Variant22098, - Variant22099, - Variant22100, - Variant22101, - Variant22102, - Variant22103, - Variant22104, - Variant22105, - Variant22106, - Variant22107, - Variant22108, - Variant22109, - Variant22110, - Variant22111, - Variant22112, - Variant22113, - Variant22114, - Variant22115, - Variant22116, - Variant22117, - Variant22118, - Variant22119, - Variant22120, - Variant22121, - Variant22122, - Variant22123, - Variant22124, - Variant22125, - Variant22126, - Variant22127, - Variant22128, - Variant22129, - Variant22130, - Variant22131, - Variant22132, - Variant22133, - Variant22134, - Variant22135, - Variant22136, - Variant22137, - Variant22138, - Variant22139, - Variant22140, - Variant22141, - Variant22142, - Variant22143, - Variant22144, - Variant22145, - Variant22146, - Variant22147, - Variant22148, - Variant22149, - Variant22150, - Variant22151, - Variant22152, - Variant22153, - Variant22154, - Variant22155, - Variant22156, - Variant22157, - Variant22158, - Variant22159, - Variant22160, - Variant22161, - Variant22162, - Variant22163, - Variant22164, - Variant22165, - Variant22166, - Variant22167, - Variant22168, - Variant22169, - Variant22170, - Variant22171, - Variant22172, - Variant22173, - Variant22174, - Variant22175, - Variant22176, - Variant22177, - Variant22178, - Variant22179, - Variant22180, - Variant22181, - Variant22182, - Variant22183, - Variant22184, - Variant22185, - Variant22186, - Variant22187, - Variant22188, - Variant22189, - Variant22190, - Variant22191, - Variant22192, - Variant22193, - Variant22194, - Variant22195, - Variant22196, - Variant22197, - Variant22198, - Variant22199, - Variant22200, - Variant22201, - Variant22202, - Variant22203, - Variant22204, - Variant22205, - Variant22206, - Variant22207, - Variant22208, - Variant22209, - Variant22210, - Variant22211, - Variant22212, - Variant22213, - Variant22214, - Variant22215, - Variant22216, - Variant22217, - Variant22218, - Variant22219, - Variant22220, - Variant22221, - Variant22222, - Variant22223, - Variant22224, - Variant22225, - Variant22226, - Variant22227, - Variant22228, - Variant22229, - Variant22230, - Variant22231, - Variant22232, - Variant22233, - Variant22234, - Variant22235, - Variant22236, - Variant22237, - Variant22238, - Variant22239, - Variant22240, - Variant22241, - Variant22242, - Variant22243, - Variant22244, - Variant22245, - Variant22246, - Variant22247, - Variant22248, - Variant22249, - Variant22250, - Variant22251, - Variant22252, - Variant22253, - Variant22254, - Variant22255, - Variant22256, - Variant22257, - Variant22258, - Variant22259, - Variant22260, - Variant22261, - Variant22262, - Variant22263, - Variant22264, - Variant22265, - Variant22266, - Variant22267, - Variant22268, - Variant22269, - Variant22270, - Variant22271, - Variant22272, - Variant22273, - Variant22274, - Variant22275, - Variant22276, - Variant22277, - Variant22278, - Variant22279, - Variant22280, - Variant22281, - Variant22282, - Variant22283, - Variant22284, - Variant22285, - Variant22286, - Variant22287, - Variant22288, - Variant22289, - Variant22290, - Variant22291, - Variant22292, - Variant22293, - Variant22294, - Variant22295, - Variant22296, - Variant22297, - Variant22298, - Variant22299, - Variant22300, - Variant22301, - Variant22302, - Variant22303, - Variant22304, - Variant22305, - Variant22306, - Variant22307, - Variant22308, - Variant22309, - Variant22310, - Variant22311, - Variant22312, - Variant22313, - Variant22314, - Variant22315, - Variant22316, - Variant22317, - Variant22318, - Variant22319, - Variant22320, - Variant22321, - Variant22322, - Variant22323, - Variant22324, - Variant22325, - Variant22326, - Variant22327, - Variant22328, - Variant22329, - Variant22330, - Variant22331, - Variant22332, - Variant22333, - Variant22334, - Variant22335, - Variant22336, - Variant22337, - Variant22338, - Variant22339, - Variant22340, - Variant22341, - Variant22342, - Variant22343, - Variant22344, - Variant22345, - Variant22346, - Variant22347, - Variant22348, - Variant22349, - Variant22350, - Variant22351, - Variant22352, - Variant22353, - Variant22354, - Variant22355, - Variant22356, - Variant22357, - Variant22358, - Variant22359, - Variant22360, - Variant22361, - Variant22362, - Variant22363, - Variant22364, - Variant22365, - Variant22366, - Variant22367, - Variant22368, - Variant22369, - Variant22370, - Variant22371, - Variant22372, - Variant22373, - Variant22374, - Variant22375, - Variant22376, - Variant22377, - Variant22378, - Variant22379, - Variant22380, - Variant22381, - Variant22382, - Variant22383, - Variant22384, - Variant22385, - Variant22386, - Variant22387, - Variant22388, - Variant22389, - Variant22390, - Variant22391, - Variant22392, - Variant22393, - Variant22394, - Variant22395, - Variant22396, - Variant22397, - Variant22398, - Variant22399, - Variant22400, - Variant22401, - Variant22402, - Variant22403, - Variant22404, - Variant22405, - Variant22406, - Variant22407, - Variant22408, - Variant22409, - Variant22410, - Variant22411, - Variant22412, - Variant22413, - Variant22414, - Variant22415, - Variant22416, - Variant22417, - Variant22418, - Variant22419, - Variant22420, - Variant22421, - Variant22422, - Variant22423, - Variant22424, - Variant22425, - Variant22426, - Variant22427, - Variant22428, - Variant22429, - Variant22430, - Variant22431, - Variant22432, - Variant22433, - Variant22434, - Variant22435, - Variant22436, - Variant22437, - Variant22438, - Variant22439, - Variant22440, - Variant22441, - Variant22442, - Variant22443, - Variant22444, - Variant22445, - Variant22446, - Variant22447, - Variant22448, - Variant22449, - Variant22450, - Variant22451, - Variant22452, - Variant22453, - Variant22454, - Variant22455, - Variant22456, - Variant22457, - Variant22458, - Variant22459, - Variant22460, - Variant22461, - Variant22462, - Variant22463, - Variant22464, - Variant22465, - Variant22466, - Variant22467, - Variant22468, - Variant22469, - Variant22470, - Variant22471, - Variant22472, - Variant22473, - Variant22474, - Variant22475, - Variant22476, - Variant22477, - Variant22478, - Variant22479, - Variant22480, - Variant22481, - Variant22482, - Variant22483, - Variant22484, - Variant22485, - Variant22486, - Variant22487, - Variant22488, - Variant22489, - Variant22490, - Variant22491, - Variant22492, - Variant22493, - Variant22494, - Variant22495, - Variant22496, - Variant22497, - Variant22498, - Variant22499, - Variant22500, - Variant22501, - Variant22502, - Variant22503, - Variant22504, - Variant22505, - Variant22506, - Variant22507, - Variant22508, - Variant22509, - Variant22510, - Variant22511, - Variant22512, - Variant22513, - Variant22514, - Variant22515, - Variant22516, - Variant22517, - Variant22518, - Variant22519, - Variant22520, - Variant22521, - Variant22522, - Variant22523, - Variant22524, - Variant22525, - Variant22526, - Variant22527, - Variant22528, - Variant22529, - Variant22530, - Variant22531, - Variant22532, - Variant22533, - Variant22534, - Variant22535, - Variant22536, - Variant22537, - Variant22538, - Variant22539, - Variant22540, - Variant22541, - Variant22542, - Variant22543, - Variant22544, - Variant22545, - Variant22546, - Variant22547, - Variant22548, - Variant22549, - Variant22550, - Variant22551, - Variant22552, - Variant22553, - Variant22554, - Variant22555, - Variant22556, - Variant22557, - Variant22558, - Variant22559, - Variant22560, - Variant22561, - Variant22562, - Variant22563, - Variant22564, - Variant22565, - Variant22566, - Variant22567, - Variant22568, - Variant22569, - Variant22570, - Variant22571, - Variant22572, - Variant22573, - Variant22574, - Variant22575, - Variant22576, - Variant22577, - Variant22578, - Variant22579, - Variant22580, - Variant22581, - Variant22582, - Variant22583, - Variant22584, - Variant22585, - Variant22586, - Variant22587, - Variant22588, - Variant22589, - Variant22590, - Variant22591, - Variant22592, - Variant22593, - Variant22594, - Variant22595, - Variant22596, - Variant22597, - Variant22598, - Variant22599, - Variant22600, - Variant22601, - Variant22602, - Variant22603, - Variant22604, - Variant22605, - Variant22606, - Variant22607, - Variant22608, - Variant22609, - Variant22610, - Variant22611, - Variant22612, - Variant22613, - Variant22614, - Variant22615, - Variant22616, - Variant22617, - Variant22618, - Variant22619, - Variant22620, - Variant22621, - Variant22622, - Variant22623, - Variant22624, - Variant22625, - Variant22626, - Variant22627, - Variant22628, - Variant22629, - Variant22630, - Variant22631, - Variant22632, - Variant22633, - Variant22634, - Variant22635, - Variant22636, - Variant22637, - Variant22638, - Variant22639, - Variant22640, - Variant22641, - Variant22642, - Variant22643, - Variant22644, - Variant22645, - Variant22646, - Variant22647, - Variant22648, - Variant22649, - Variant22650, - Variant22651, - Variant22652, - Variant22653, - Variant22654, - Variant22655, - Variant22656, - Variant22657, - Variant22658, - Variant22659, - Variant22660, - Variant22661, - Variant22662, - Variant22663, - Variant22664, - Variant22665, - Variant22666, - Variant22667, - Variant22668, - Variant22669, - Variant22670, - Variant22671, - Variant22672, - Variant22673, - Variant22674, - Variant22675, - Variant22676, - Variant22677, - Variant22678, - Variant22679, - Variant22680, - Variant22681, - Variant22682, - Variant22683, - Variant22684, - Variant22685, - Variant22686, - Variant22687, - Variant22688, - Variant22689, - Variant22690, - Variant22691, - Variant22692, - Variant22693, - Variant22694, - Variant22695, - Variant22696, - Variant22697, - Variant22698, - Variant22699, - Variant22700, - Variant22701, - Variant22702, - Variant22703, - Variant22704, - Variant22705, - Variant22706, - Variant22707, - Variant22708, - Variant22709, - Variant22710, - Variant22711, - Variant22712, - Variant22713, - Variant22714, - Variant22715, - Variant22716, - Variant22717, - Variant22718, - Variant22719, - Variant22720, - Variant22721, - Variant22722, - Variant22723, - Variant22724, - Variant22725, - Variant22726, - Variant22727, - Variant22728, - Variant22729, - Variant22730, - Variant22731, - Variant22732, - Variant22733, - Variant22734, - Variant22735, - Variant22736, - Variant22737, - Variant22738, - Variant22739, - Variant22740, - Variant22741, - Variant22742, - Variant22743, - Variant22744, - Variant22745, - Variant22746, - Variant22747, - Variant22748, - Variant22749, - Variant22750, - Variant22751, - Variant22752, - Variant22753, - Variant22754, - Variant22755, - Variant22756, - Variant22757, - Variant22758, - Variant22759, - Variant22760, - Variant22761, - Variant22762, - Variant22763, - Variant22764, - Variant22765, - Variant22766, - Variant22767, - Variant22768, - Variant22769, - Variant22770, - Variant22771, - Variant22772, - Variant22773, - Variant22774, - Variant22775, - Variant22776, - Variant22777, - Variant22778, - Variant22779, - Variant22780, - Variant22781, - Variant22782, - Variant22783, - Variant22784, - Variant22785, - Variant22786, - Variant22787, - Variant22788, - Variant22789, - Variant22790, - Variant22791, - Variant22792, - Variant22793, - Variant22794, - Variant22795, - Variant22796, - Variant22797, - Variant22798, - Variant22799, - Variant22800, - Variant22801, - Variant22802, - Variant22803, - Variant22804, - Variant22805, - Variant22806, - Variant22807, - Variant22808, - Variant22809, - Variant22810, - Variant22811, - Variant22812, - Variant22813, - Variant22814, - Variant22815, - Variant22816, - Variant22817, - Variant22818, - Variant22819, - Variant22820, - Variant22821, - Variant22822, - Variant22823, - Variant22824, - Variant22825, - Variant22826, - Variant22827, - Variant22828, - Variant22829, - Variant22830, - Variant22831, - Variant22832, - Variant22833, - Variant22834, - Variant22835, - Variant22836, - Variant22837, - Variant22838, - Variant22839, - Variant22840, - Variant22841, - Variant22842, - Variant22843, - Variant22844, - Variant22845, - Variant22846, - Variant22847, - Variant22848, - Variant22849, - Variant22850, - Variant22851, - Variant22852, - Variant22853, - Variant22854, - Variant22855, - Variant22856, - Variant22857, - Variant22858, - Variant22859, - Variant22860, - Variant22861, - Variant22862, - Variant22863, - Variant22864, - Variant22865, - Variant22866, - Variant22867, - Variant22868, - Variant22869, - Variant22870, - Variant22871, - Variant22872, - Variant22873, - Variant22874, - Variant22875, - Variant22876, - Variant22877, - Variant22878, - Variant22879, - Variant22880, - Variant22881, - Variant22882, - Variant22883, - Variant22884, - Variant22885, - Variant22886, - Variant22887, - Variant22888, - Variant22889, - Variant22890, - Variant22891, - Variant22892, - Variant22893, - Variant22894, - Variant22895, - Variant22896, - Variant22897, - Variant22898, - Variant22899, - Variant22900, - Variant22901, - Variant22902, - Variant22903, - Variant22904, - Variant22905, - Variant22906, - Variant22907, - Variant22908, - Variant22909, - Variant22910, - Variant22911, - Variant22912, - Variant22913, - Variant22914, - Variant22915, - Variant22916, - Variant22917, - Variant22918, - Variant22919, - Variant22920, - Variant22921, - Variant22922, - Variant22923, - Variant22924, - Variant22925, - Variant22926, - Variant22927, - Variant22928, - Variant22929, - Variant22930, - Variant22931, - Variant22932, - Variant22933, - Variant22934, - Variant22935, - Variant22936, - Variant22937, - Variant22938, - Variant22939, - Variant22940, - Variant22941, - Variant22942, - Variant22943, - Variant22944, - Variant22945, - Variant22946, - Variant22947, - Variant22948, - Variant22949, - Variant22950, - Variant22951, - Variant22952, - Variant22953, - Variant22954, - Variant22955, - Variant22956, - Variant22957, - Variant22958, - Variant22959, - Variant22960, - Variant22961, - Variant22962, - Variant22963, - Variant22964, - Variant22965, - Variant22966, - Variant22967, - Variant22968, - Variant22969, - Variant22970, - Variant22971, - Variant22972, - Variant22973, - Variant22974, - Variant22975, - Variant22976, - Variant22977, - Variant22978, - Variant22979, - Variant22980, - Variant22981, - Variant22982, - Variant22983, - Variant22984, - Variant22985, - Variant22986, - Variant22987, - Variant22988, - Variant22989, - Variant22990, - Variant22991, - Variant22992, - Variant22993, - Variant22994, - Variant22995, - Variant22996, - Variant22997, - Variant22998, - Variant22999, - Variant23000, - Variant23001, - Variant23002, - Variant23003, - Variant23004, - Variant23005, - Variant23006, - Variant23007, - Variant23008, - Variant23009, - Variant23010, - Variant23011, - Variant23012, - Variant23013, - Variant23014, - Variant23015, - Variant23016, - Variant23017, - Variant23018, - Variant23019, - Variant23020, - Variant23021, - Variant23022, - Variant23023, - Variant23024, - Variant23025, - Variant23026, - Variant23027, - Variant23028, - Variant23029, - Variant23030, - Variant23031, - Variant23032, - Variant23033, - Variant23034, - Variant23035, - Variant23036, - Variant23037, - Variant23038, - Variant23039, - Variant23040, - Variant23041, - Variant23042, - Variant23043, - Variant23044, - Variant23045, - Variant23046, - Variant23047, - Variant23048, - Variant23049, - Variant23050, - Variant23051, - Variant23052, - Variant23053, - Variant23054, - Variant23055, - Variant23056, - Variant23057, - Variant23058, - Variant23059, - Variant23060, - Variant23061, - Variant23062, - Variant23063, - Variant23064, - Variant23065, - Variant23066, - Variant23067, - Variant23068, - Variant23069, - Variant23070, - Variant23071, - Variant23072, - Variant23073, - Variant23074, - Variant23075, - Variant23076, - Variant23077, - Variant23078, - Variant23079, - Variant23080, - Variant23081, - Variant23082, - Variant23083, - Variant23084, - Variant23085, - Variant23086, - Variant23087, - Variant23088, - Variant23089, - Variant23090, - Variant23091, - Variant23092, - Variant23093, - Variant23094, - Variant23095, - Variant23096, - Variant23097, - Variant23098, - Variant23099, - Variant23100, - Variant23101, - Variant23102, - Variant23103, - Variant23104, - Variant23105, - Variant23106, - Variant23107, - Variant23108, - Variant23109, - Variant23110, - Variant23111, - Variant23112, - Variant23113, - Variant23114, - Variant23115, - Variant23116, - Variant23117, - Variant23118, - Variant23119, - Variant23120, - Variant23121, - Variant23122, - Variant23123, - Variant23124, - Variant23125, - Variant23126, - Variant23127, - Variant23128, - Variant23129, - Variant23130, - Variant23131, - Variant23132, - Variant23133, - Variant23134, - Variant23135, - Variant23136, - Variant23137, - Variant23138, - Variant23139, - Variant23140, - Variant23141, - Variant23142, - Variant23143, - Variant23144, - Variant23145, - Variant23146, - Variant23147, - Variant23148, - Variant23149, - Variant23150, - Variant23151, - Variant23152, - Variant23153, - Variant23154, - Variant23155, - Variant23156, - Variant23157, - Variant23158, - Variant23159, - Variant23160, - Variant23161, - Variant23162, - Variant23163, - Variant23164, - Variant23165, - Variant23166, - Variant23167, - Variant23168, - Variant23169, - Variant23170, - Variant23171, - Variant23172, - Variant23173, - Variant23174, - Variant23175, - Variant23176, - Variant23177, - Variant23178, - Variant23179, - Variant23180, - Variant23181, - Variant23182, - Variant23183, - Variant23184, - Variant23185, - Variant23186, - Variant23187, - Variant23188, - Variant23189, - Variant23190, - Variant23191, - Variant23192, - Variant23193, - Variant23194, - Variant23195, - Variant23196, - Variant23197, - Variant23198, - Variant23199, - Variant23200, - Variant23201, - Variant23202, - Variant23203, - Variant23204, - Variant23205, - Variant23206, - Variant23207, - Variant23208, - Variant23209, - Variant23210, - Variant23211, - Variant23212, - Variant23213, - Variant23214, - Variant23215, - Variant23216, - Variant23217, - Variant23218, - Variant23219, - Variant23220, - Variant23221, - Variant23222, - Variant23223, - Variant23224, - Variant23225, - Variant23226, - Variant23227, - Variant23228, - Variant23229, - Variant23230, - Variant23231, - Variant23232, - Variant23233, - Variant23234, - Variant23235, - Variant23236, - Variant23237, - Variant23238, - Variant23239, - Variant23240, - Variant23241, - Variant23242, - Variant23243, - Variant23244, - Variant23245, - Variant23246, - Variant23247, - Variant23248, - Variant23249, - Variant23250, - Variant23251, - Variant23252, - Variant23253, - Variant23254, - Variant23255, - Variant23256, - Variant23257, - Variant23258, - Variant23259, - Variant23260, - Variant23261, - Variant23262, - Variant23263, - Variant23264, - Variant23265, - Variant23266, - Variant23267, - Variant23268, - Variant23269, - Variant23270, - Variant23271, - Variant23272, - Variant23273, - Variant23274, - Variant23275, - Variant23276, - Variant23277, - Variant23278, - Variant23279, - Variant23280, - Variant23281, - Variant23282, - Variant23283, - Variant23284, - Variant23285, - Variant23286, - Variant23287, - Variant23288, - Variant23289, - Variant23290, - Variant23291, - Variant23292, - Variant23293, - Variant23294, - Variant23295, - Variant23296, - Variant23297, - Variant23298, - Variant23299, - Variant23300, - Variant23301, - Variant23302, - Variant23303, - Variant23304, - Variant23305, - Variant23306, - Variant23307, - Variant23308, - Variant23309, - Variant23310, - Variant23311, - Variant23312, - Variant23313, - Variant23314, - Variant23315, - Variant23316, - Variant23317, - Variant23318, - Variant23319, - Variant23320, - Variant23321, - Variant23322, - Variant23323, - Variant23324, - Variant23325, - Variant23326, - Variant23327, - Variant23328, - Variant23329, - Variant23330, - Variant23331, - Variant23332, - Variant23333, - Variant23334, - Variant23335, - Variant23336, - Variant23337, - Variant23338, - Variant23339, - Variant23340, - Variant23341, - Variant23342, - Variant23343, - Variant23344, - Variant23345, - Variant23346, - Variant23347, - Variant23348, - Variant23349, - Variant23350, - Variant23351, - Variant23352, - Variant23353, - Variant23354, - Variant23355, - Variant23356, - Variant23357, - Variant23358, - Variant23359, - Variant23360, - Variant23361, - Variant23362, - Variant23363, - Variant23364, - Variant23365, - Variant23366, - Variant23367, - Variant23368, - Variant23369, - Variant23370, - Variant23371, - Variant23372, - Variant23373, - Variant23374, - Variant23375, - Variant23376, - Variant23377, - Variant23378, - Variant23379, - Variant23380, - Variant23381, - Variant23382, - Variant23383, - Variant23384, - Variant23385, - Variant23386, - Variant23387, - Variant23388, - Variant23389, - Variant23390, - Variant23391, - Variant23392, - Variant23393, - Variant23394, - Variant23395, - Variant23396, - Variant23397, - Variant23398, - Variant23399, - Variant23400, - Variant23401, - Variant23402, - Variant23403, - Variant23404, - Variant23405, - Variant23406, - Variant23407, - Variant23408, - Variant23409, - Variant23410, - Variant23411, - Variant23412, - Variant23413, - Variant23414, - Variant23415, - Variant23416, - Variant23417, - Variant23418, - Variant23419, - Variant23420, - Variant23421, - Variant23422, - Variant23423, - Variant23424, - Variant23425, - Variant23426, - Variant23427, - Variant23428, - Variant23429, - Variant23430, - Variant23431, - Variant23432, - Variant23433, - Variant23434, - Variant23435, - Variant23436, - Variant23437, - Variant23438, - Variant23439, - Variant23440, - Variant23441, - Variant23442, - Variant23443, - Variant23444, - Variant23445, - Variant23446, - Variant23447, - Variant23448, - Variant23449, - Variant23450, - Variant23451, - Variant23452, - Variant23453, - Variant23454, - Variant23455, - Variant23456, - Variant23457, - Variant23458, - Variant23459, - Variant23460, - Variant23461, - Variant23462, - Variant23463, - Variant23464, - Variant23465, - Variant23466, - Variant23467, - Variant23468, - Variant23469, - Variant23470, - Variant23471, - Variant23472, - Variant23473, - Variant23474, - Variant23475, - Variant23476, - Variant23477, - Variant23478, - Variant23479, - Variant23480, - Variant23481, - Variant23482, - Variant23483, - Variant23484, - Variant23485, - Variant23486, - Variant23487, - Variant23488, - Variant23489, - Variant23490, - Variant23491, - Variant23492, - Variant23493, - Variant23494, - Variant23495, - Variant23496, - Variant23497, - Variant23498, - Variant23499, - Variant23500, - Variant23501, - Variant23502, - Variant23503, - Variant23504, - Variant23505, - Variant23506, - Variant23507, - Variant23508, - Variant23509, - Variant23510, - Variant23511, - Variant23512, - Variant23513, - Variant23514, - Variant23515, - Variant23516, - Variant23517, - Variant23518, - Variant23519, - Variant23520, - Variant23521, - Variant23522, - Variant23523, - Variant23524, - Variant23525, - Variant23526, - Variant23527, - Variant23528, - Variant23529, - Variant23530, - Variant23531, - Variant23532, - Variant23533, - Variant23534, - Variant23535, - Variant23536, - Variant23537, - Variant23538, - Variant23539, - Variant23540, - Variant23541, - Variant23542, - Variant23543, - Variant23544, - Variant23545, - Variant23546, - Variant23547, - Variant23548, - Variant23549, - Variant23550, - Variant23551, - Variant23552, - Variant23553, - Variant23554, - Variant23555, - Variant23556, - Variant23557, - Variant23558, - Variant23559, - Variant23560, - Variant23561, - Variant23562, - Variant23563, - Variant23564, - Variant23565, - Variant23566, - Variant23567, - Variant23568, - Variant23569, - Variant23570, - Variant23571, - Variant23572, - Variant23573, - Variant23574, - Variant23575, - Variant23576, - Variant23577, - Variant23578, - Variant23579, - Variant23580, - Variant23581, - Variant23582, - Variant23583, - Variant23584, - Variant23585, - Variant23586, - Variant23587, - Variant23588, - Variant23589, - Variant23590, - Variant23591, - Variant23592, - Variant23593, - Variant23594, - Variant23595, - Variant23596, - Variant23597, - Variant23598, - Variant23599, - Variant23600, - Variant23601, - Variant23602, - Variant23603, - Variant23604, - Variant23605, - Variant23606, - Variant23607, - Variant23608, - Variant23609, - Variant23610, - Variant23611, - Variant23612, - Variant23613, - Variant23614, - Variant23615, - Variant23616, - Variant23617, - Variant23618, - Variant23619, - Variant23620, - Variant23621, - Variant23622, - Variant23623, - Variant23624, - Variant23625, - Variant23626, - Variant23627, - Variant23628, - Variant23629, - Variant23630, - Variant23631, - Variant23632, - Variant23633, - Variant23634, - Variant23635, - Variant23636, - Variant23637, - Variant23638, - Variant23639, - Variant23640, - Variant23641, - Variant23642, - Variant23643, - Variant23644, - Variant23645, - Variant23646, - Variant23647, - Variant23648, - Variant23649, - Variant23650, - Variant23651, - Variant23652, - Variant23653, - Variant23654, - Variant23655, - Variant23656, - Variant23657, - Variant23658, - Variant23659, - Variant23660, - Variant23661, - Variant23662, - Variant23663, - Variant23664, - Variant23665, - Variant23666, - Variant23667, - Variant23668, - Variant23669, - Variant23670, - Variant23671, - Variant23672, - Variant23673, - Variant23674, - Variant23675, - Variant23676, - Variant23677, - Variant23678, - Variant23679, - Variant23680, - Variant23681, - Variant23682, - Variant23683, - Variant23684, - Variant23685, - Variant23686, - Variant23687, - Variant23688, - Variant23689, - Variant23690, - Variant23691, - Variant23692, - Variant23693, - Variant23694, - Variant23695, - Variant23696, - Variant23697, - Variant23698, - Variant23699, - Variant23700, - Variant23701, - Variant23702, - Variant23703, - Variant23704, - Variant23705, - Variant23706, - Variant23707, - Variant23708, - Variant23709, - Variant23710, - Variant23711, - Variant23712, - Variant23713, - Variant23714, - Variant23715, - Variant23716, - Variant23717, - Variant23718, - Variant23719, - Variant23720, - Variant23721, - Variant23722, - Variant23723, - Variant23724, - Variant23725, - Variant23726, - Variant23727, - Variant23728, - Variant23729, - Variant23730, - Variant23731, - Variant23732, - Variant23733, - Variant23734, - Variant23735, - Variant23736, - Variant23737, - Variant23738, - Variant23739, - Variant23740, - Variant23741, - Variant23742, - Variant23743, - Variant23744, - Variant23745, - Variant23746, - Variant23747, - Variant23748, - Variant23749, - Variant23750, - Variant23751, - Variant23752, - Variant23753, - Variant23754, - Variant23755, - Variant23756, - Variant23757, - Variant23758, - Variant23759, - Variant23760, - Variant23761, - Variant23762, - Variant23763, - Variant23764, - Variant23765, - Variant23766, - Variant23767, - Variant23768, - Variant23769, - Variant23770, - Variant23771, - Variant23772, - Variant23773, - Variant23774, - Variant23775, - Variant23776, - Variant23777, - Variant23778, - Variant23779, - Variant23780, - Variant23781, - Variant23782, - Variant23783, - Variant23784, - Variant23785, - Variant23786, - Variant23787, - Variant23788, - Variant23789, - Variant23790, - Variant23791, - Variant23792, - Variant23793, - Variant23794, - Variant23795, - Variant23796, - Variant23797, - Variant23798, - Variant23799, - Variant23800, - Variant23801, - Variant23802, - Variant23803, - Variant23804, - Variant23805, - Variant23806, - Variant23807, - Variant23808, - Variant23809, - Variant23810, - Variant23811, - Variant23812, - Variant23813, - Variant23814, - Variant23815, - Variant23816, - Variant23817, - Variant23818, - Variant23819, - Variant23820, - Variant23821, - Variant23822, - Variant23823, - Variant23824, - Variant23825, - Variant23826, - Variant23827, - Variant23828, - Variant23829, - Variant23830, - Variant23831, - Variant23832, - Variant23833, - Variant23834, - Variant23835, - Variant23836, - Variant23837, - Variant23838, - Variant23839, - Variant23840, - Variant23841, - Variant23842, - Variant23843, - Variant23844, - Variant23845, - Variant23846, - Variant23847, - Variant23848, - Variant23849, - Variant23850, - Variant23851, - Variant23852, - Variant23853, - Variant23854, - Variant23855, - Variant23856, - Variant23857, - Variant23858, - Variant23859, - Variant23860, - Variant23861, - Variant23862, - Variant23863, - Variant23864, - Variant23865, - Variant23866, - Variant23867, - Variant23868, - Variant23869, - Variant23870, - Variant23871, - Variant23872, - Variant23873, - Variant23874, - Variant23875, - Variant23876, - Variant23877, - Variant23878, - Variant23879, - Variant23880, - Variant23881, - Variant23882, - Variant23883, - Variant23884, - Variant23885, - Variant23886, - Variant23887, - Variant23888, - Variant23889, - Variant23890, - Variant23891, - Variant23892, - Variant23893, - Variant23894, - Variant23895, - Variant23896, - Variant23897, - Variant23898, - Variant23899, - Variant23900, - Variant23901, - Variant23902, - Variant23903, - Variant23904, - Variant23905, - Variant23906, - Variant23907, - Variant23908, - Variant23909, - Variant23910, - Variant23911, - Variant23912, - Variant23913, - Variant23914, - Variant23915, - Variant23916, - Variant23917, - Variant23918, - Variant23919, - Variant23920, - Variant23921, - Variant23922, - Variant23923, - Variant23924, - Variant23925, - Variant23926, - Variant23927, - Variant23928, - Variant23929, - Variant23930, - Variant23931, - Variant23932, - Variant23933, - Variant23934, - Variant23935, - Variant23936, - Variant23937, - Variant23938, - Variant23939, - Variant23940, - Variant23941, - Variant23942, - Variant23943, - Variant23944, - Variant23945, - Variant23946, - Variant23947, - Variant23948, - Variant23949, - Variant23950, - Variant23951, - Variant23952, - Variant23953, - Variant23954, - Variant23955, - Variant23956, - Variant23957, - Variant23958, - Variant23959, - Variant23960, - Variant23961, - Variant23962, - Variant23963, - Variant23964, - Variant23965, - Variant23966, - Variant23967, - Variant23968, - Variant23969, - Variant23970, - Variant23971, - Variant23972, - Variant23973, - Variant23974, - Variant23975, - Variant23976, - Variant23977, - Variant23978, - Variant23979, - Variant23980, - Variant23981, - Variant23982, - Variant23983, - Variant23984, - Variant23985, - Variant23986, - Variant23987, - Variant23988, - Variant23989, - Variant23990, - Variant23991, - Variant23992, - Variant23993, - Variant23994, - Variant23995, - Variant23996, - Variant23997, - Variant23998, - Variant23999, - Variant24000, - Variant24001, - Variant24002, - Variant24003, - Variant24004, - Variant24005, - Variant24006, - Variant24007, - Variant24008, - Variant24009, - Variant24010, - Variant24011, - Variant24012, - Variant24013, - Variant24014, - Variant24015, - Variant24016, - Variant24017, - Variant24018, - Variant24019, - Variant24020, - Variant24021, - Variant24022, - Variant24023, - Variant24024, - Variant24025, - Variant24026, - Variant24027, - Variant24028, - Variant24029, - Variant24030, - Variant24031, - Variant24032, - Variant24033, - Variant24034, - Variant24035, - Variant24036, - Variant24037, - Variant24038, - Variant24039, - Variant24040, - Variant24041, - Variant24042, - Variant24043, - Variant24044, - Variant24045, - Variant24046, - Variant24047, - Variant24048, - Variant24049, - Variant24050, - Variant24051, - Variant24052, - Variant24053, - Variant24054, - Variant24055, - Variant24056, - Variant24057, - Variant24058, - Variant24059, - Variant24060, - Variant24061, - Variant24062, - Variant24063, - Variant24064, - Variant24065, - Variant24066, - Variant24067, - Variant24068, - Variant24069, - Variant24070, - Variant24071, - Variant24072, - Variant24073, - Variant24074, - Variant24075, - Variant24076, - Variant24077, - Variant24078, - Variant24079, - Variant24080, - Variant24081, - Variant24082, - Variant24083, - Variant24084, - Variant24085, - Variant24086, - Variant24087, - Variant24088, - Variant24089, - Variant24090, - Variant24091, - Variant24092, - Variant24093, - Variant24094, - Variant24095, - Variant24096, - Variant24097, - Variant24098, - Variant24099, - Variant24100, - Variant24101, - Variant24102, - Variant24103, - Variant24104, - Variant24105, - Variant24106, - Variant24107, - Variant24108, - Variant24109, - Variant24110, - Variant24111, - Variant24112, - Variant24113, - Variant24114, - Variant24115, - Variant24116, - Variant24117, - Variant24118, - Variant24119, - Variant24120, - Variant24121, - Variant24122, - Variant24123, - Variant24124, - Variant24125, - Variant24126, - Variant24127, - Variant24128, - Variant24129, - Variant24130, - Variant24131, - Variant24132, - Variant24133, - Variant24134, - Variant24135, - Variant24136, - Variant24137, - Variant24138, - Variant24139, - Variant24140, - Variant24141, - Variant24142, - Variant24143, - Variant24144, - Variant24145, - Variant24146, - Variant24147, - Variant24148, - Variant24149, - Variant24150, - Variant24151, - Variant24152, - Variant24153, - Variant24154, - Variant24155, - Variant24156, - Variant24157, - Variant24158, - Variant24159, - Variant24160, - Variant24161, - Variant24162, - Variant24163, - Variant24164, - Variant24165, - Variant24166, - Variant24167, - Variant24168, - Variant24169, - Variant24170, - Variant24171, - Variant24172, - Variant24173, - Variant24174, - Variant24175, - Variant24176, - Variant24177, - Variant24178, - Variant24179, - Variant24180, - Variant24181, - Variant24182, - Variant24183, - Variant24184, - Variant24185, - Variant24186, - Variant24187, - Variant24188, - Variant24189, - Variant24190, - Variant24191, - Variant24192, - Variant24193, - Variant24194, - Variant24195, - Variant24196, - Variant24197, - Variant24198, - Variant24199, - Variant24200, - Variant24201, - Variant24202, - Variant24203, - Variant24204, - Variant24205, - Variant24206, - Variant24207, - Variant24208, - Variant24209, - Variant24210, - Variant24211, - Variant24212, - Variant24213, - Variant24214, - Variant24215, - Variant24216, - Variant24217, - Variant24218, - Variant24219, - Variant24220, - Variant24221, - Variant24222, - Variant24223, - Variant24224, - Variant24225, - Variant24226, - Variant24227, - Variant24228, - Variant24229, - Variant24230, - Variant24231, - Variant24232, - Variant24233, - Variant24234, - Variant24235, - Variant24236, - Variant24237, - Variant24238, - Variant24239, - Variant24240, - Variant24241, - Variant24242, - Variant24243, - Variant24244, - Variant24245, - Variant24246, - Variant24247, - Variant24248, - Variant24249, - Variant24250, - Variant24251, - Variant24252, - Variant24253, - Variant24254, - Variant24255, - Variant24256, - Variant24257, - Variant24258, - Variant24259, - Variant24260, - Variant24261, - Variant24262, - Variant24263, - Variant24264, - Variant24265, - Variant24266, - Variant24267, - Variant24268, - Variant24269, - Variant24270, - Variant24271, - Variant24272, - Variant24273, - Variant24274, - Variant24275, - Variant24276, - Variant24277, - Variant24278, - Variant24279, - Variant24280, - Variant24281, - Variant24282, - Variant24283, - Variant24284, - Variant24285, - Variant24286, - Variant24287, - Variant24288, - Variant24289, - Variant24290, - Variant24291, - Variant24292, - Variant24293, - Variant24294, - Variant24295, - Variant24296, - Variant24297, - Variant24298, - Variant24299, - Variant24300, - Variant24301, - Variant24302, - Variant24303, - Variant24304, - Variant24305, - Variant24306, - Variant24307, - Variant24308, - Variant24309, - Variant24310, - Variant24311, - Variant24312, - Variant24313, - Variant24314, - Variant24315, - Variant24316, - Variant24317, - Variant24318, - Variant24319, - Variant24320, - Variant24321, - Variant24322, - Variant24323, - Variant24324, - Variant24325, - Variant24326, - Variant24327, - Variant24328, - Variant24329, - Variant24330, - Variant24331, - Variant24332, - Variant24333, - Variant24334, - Variant24335, - Variant24336, - Variant24337, - Variant24338, - Variant24339, - Variant24340, - Variant24341, - Variant24342, - Variant24343, - Variant24344, - Variant24345, - Variant24346, - Variant24347, - Variant24348, - Variant24349, - Variant24350, - Variant24351, - Variant24352, - Variant24353, - Variant24354, - Variant24355, - Variant24356, - Variant24357, - Variant24358, - Variant24359, - Variant24360, - Variant24361, - Variant24362, - Variant24363, - Variant24364, - Variant24365, - Variant24366, - Variant24367, - Variant24368, - Variant24369, - Variant24370, - Variant24371, - Variant24372, - Variant24373, - Variant24374, - Variant24375, - Variant24376, - Variant24377, - Variant24378, - Variant24379, - Variant24380, - Variant24381, - Variant24382, - Variant24383, - Variant24384, - Variant24385, - Variant24386, - Variant24387, - Variant24388, - Variant24389, - Variant24390, - Variant24391, - Variant24392, - Variant24393, - Variant24394, - Variant24395, - Variant24396, - Variant24397, - Variant24398, - Variant24399, - Variant24400, - Variant24401, - Variant24402, - Variant24403, - Variant24404, - Variant24405, - Variant24406, - Variant24407, - Variant24408, - Variant24409, - Variant24410, - Variant24411, - Variant24412, - Variant24413, - Variant24414, - Variant24415, - Variant24416, - Variant24417, - Variant24418, - Variant24419, - Variant24420, - Variant24421, - Variant24422, - Variant24423, - Variant24424, - Variant24425, - Variant24426, - Variant24427, - Variant24428, - Variant24429, - Variant24430, - Variant24431, - Variant24432, - Variant24433, - Variant24434, - Variant24435, - Variant24436, - Variant24437, - Variant24438, - Variant24439, - Variant24440, - Variant24441, - Variant24442, - Variant24443, - Variant24444, - Variant24445, - Variant24446, - Variant24447, - Variant24448, - Variant24449, - Variant24450, - Variant24451, - Variant24452, - Variant24453, - Variant24454, - Variant24455, - Variant24456, - Variant24457, - Variant24458, - Variant24459, - Variant24460, - Variant24461, - Variant24462, - Variant24463, - Variant24464, - Variant24465, - Variant24466, - Variant24467, - Variant24468, - Variant24469, - Variant24470, - Variant24471, - Variant24472, - Variant24473, - Variant24474, - Variant24475, - Variant24476, - Variant24477, - Variant24478, - Variant24479, - Variant24480, - Variant24481, - Variant24482, - Variant24483, - Variant24484, - Variant24485, - Variant24486, - Variant24487, - Variant24488, - Variant24489, - Variant24490, - Variant24491, - Variant24492, - Variant24493, - Variant24494, - Variant24495, - Variant24496, - Variant24497, - Variant24498, - Variant24499, - Variant24500, - Variant24501, - Variant24502, - Variant24503, - Variant24504, - Variant24505, - Variant24506, - Variant24507, - Variant24508, - Variant24509, - Variant24510, - Variant24511, - Variant24512, - Variant24513, - Variant24514, - Variant24515, - Variant24516, - Variant24517, - Variant24518, - Variant24519, - Variant24520, - Variant24521, - Variant24522, - Variant24523, - Variant24524, - Variant24525, - Variant24526, - Variant24527, - Variant24528, - Variant24529, - Variant24530, - Variant24531, - Variant24532, - Variant24533, - Variant24534, - Variant24535, - Variant24536, - Variant24537, - Variant24538, - Variant24539, - Variant24540, - Variant24541, - Variant24542, - Variant24543, - Variant24544, - Variant24545, - Variant24546, - Variant24547, - Variant24548, - Variant24549, - Variant24550, - Variant24551, - Variant24552, - Variant24553, - Variant24554, - Variant24555, - Variant24556, - Variant24557, - Variant24558, - Variant24559, - Variant24560, - Variant24561, - Variant24562, - Variant24563, - Variant24564, - Variant24565, - Variant24566, - Variant24567, - Variant24568, - Variant24569, - Variant24570, - Variant24571, - Variant24572, - Variant24573, - Variant24574, - Variant24575, - Variant24576, - Variant24577, - Variant24578, - Variant24579, - Variant24580, - Variant24581, - Variant24582, - Variant24583, - Variant24584, - Variant24585, - Variant24586, - Variant24587, - Variant24588, - Variant24589, - Variant24590, - Variant24591, - Variant24592, - Variant24593, - Variant24594, - Variant24595, - Variant24596, - Variant24597, - Variant24598, - Variant24599, - Variant24600, - Variant24601, - Variant24602, - Variant24603, - Variant24604, - Variant24605, - Variant24606, - Variant24607, - Variant24608, - Variant24609, - Variant24610, - Variant24611, - Variant24612, - Variant24613, - Variant24614, - Variant24615, - Variant24616, - Variant24617, - Variant24618, - Variant24619, - Variant24620, - Variant24621, - Variant24622, - Variant24623, - Variant24624, - Variant24625, - Variant24626, - Variant24627, - Variant24628, - Variant24629, - Variant24630, - Variant24631, - Variant24632, - Variant24633, - Variant24634, - Variant24635, - Variant24636, - Variant24637, - Variant24638, - Variant24639, - Variant24640, - Variant24641, - Variant24642, - Variant24643, - Variant24644, - Variant24645, - Variant24646, - Variant24647, - Variant24648, - Variant24649, - Variant24650, - Variant24651, - Variant24652, - Variant24653, - Variant24654, - Variant24655, - Variant24656, - Variant24657, - Variant24658, - Variant24659, - Variant24660, - Variant24661, - Variant24662, - Variant24663, - Variant24664, - Variant24665, - Variant24666, - Variant24667, - Variant24668, - Variant24669, - Variant24670, - Variant24671, - Variant24672, - Variant24673, - Variant24674, - Variant24675, - Variant24676, - Variant24677, - Variant24678, - Variant24679, - Variant24680, - Variant24681, - Variant24682, - Variant24683, - Variant24684, - Variant24685, - Variant24686, - Variant24687, - Variant24688, - Variant24689, - Variant24690, - Variant24691, - Variant24692, - Variant24693, - Variant24694, - Variant24695, - Variant24696, - Variant24697, - Variant24698, - Variant24699, - Variant24700, - Variant24701, - Variant24702, - Variant24703, - Variant24704, - Variant24705, - Variant24706, - Variant24707, - Variant24708, - Variant24709, - Variant24710, - Variant24711, - Variant24712, - Variant24713, - Variant24714, - Variant24715, - Variant24716, - Variant24717, - Variant24718, - Variant24719, - Variant24720, - Variant24721, - Variant24722, - Variant24723, - Variant24724, - Variant24725, - Variant24726, - Variant24727, - Variant24728, - Variant24729, - Variant24730, - Variant24731, - Variant24732, - Variant24733, - Variant24734, - Variant24735, - Variant24736, - Variant24737, - Variant24738, - Variant24739, - Variant24740, - Variant24741, - Variant24742, - Variant24743, - Variant24744, - Variant24745, - Variant24746, - Variant24747, - Variant24748, - Variant24749, - Variant24750, - Variant24751, - Variant24752, - Variant24753, - Variant24754, - Variant24755, - Variant24756, - Variant24757, - Variant24758, - Variant24759, - Variant24760, - Variant24761, - Variant24762, - Variant24763, - Variant24764, - Variant24765, - Variant24766, - Variant24767, - Variant24768, - Variant24769, - Variant24770, - Variant24771, - Variant24772, - Variant24773, - Variant24774, - Variant24775, - Variant24776, - Variant24777, - Variant24778, - Variant24779, - Variant24780, - Variant24781, - Variant24782, - Variant24783, - Variant24784, - Variant24785, - Variant24786, - Variant24787, - Variant24788, - Variant24789, - Variant24790, - Variant24791, - Variant24792, - Variant24793, - Variant24794, - Variant24795, - Variant24796, - Variant24797, - Variant24798, - Variant24799, - Variant24800, - Variant24801, - Variant24802, - Variant24803, - Variant24804, - Variant24805, - Variant24806, - Variant24807, - Variant24808, - Variant24809, - Variant24810, - Variant24811, - Variant24812, - Variant24813, - Variant24814, - Variant24815, - Variant24816, - Variant24817, - Variant24818, - Variant24819, - Variant24820, - Variant24821, - Variant24822, - Variant24823, - Variant24824, - Variant24825, - Variant24826, - Variant24827, - Variant24828, - Variant24829, - Variant24830, - Variant24831, - Variant24832, - Variant24833, - Variant24834, - Variant24835, - Variant24836, - Variant24837, - Variant24838, - Variant24839, - Variant24840, - Variant24841, - Variant24842, - Variant24843, - Variant24844, - Variant24845, - Variant24846, - Variant24847, - Variant24848, - Variant24849, - Variant24850, - Variant24851, - Variant24852, - Variant24853, - Variant24854, - Variant24855, - Variant24856, - Variant24857, - Variant24858, - Variant24859, - Variant24860, - Variant24861, - Variant24862, - Variant24863, - Variant24864, - Variant24865, - Variant24866, - Variant24867, - Variant24868, - Variant24869, - Variant24870, - Variant24871, - Variant24872, - Variant24873, - Variant24874, - Variant24875, - Variant24876, - Variant24877, - Variant24878, - Variant24879, - Variant24880, - Variant24881, - Variant24882, - Variant24883, - Variant24884, - Variant24885, - Variant24886, - Variant24887, - Variant24888, - Variant24889, - Variant24890, - Variant24891, - Variant24892, - Variant24893, - Variant24894, - Variant24895, - Variant24896, - Variant24897, - Variant24898, - Variant24899, - Variant24900, - Variant24901, - Variant24902, - Variant24903, - Variant24904, - Variant24905, - Variant24906, - Variant24907, - Variant24908, - Variant24909, - Variant24910, - Variant24911, - Variant24912, - Variant24913, - Variant24914, - Variant24915, - Variant24916, - Variant24917, - Variant24918, - Variant24919, - Variant24920, - Variant24921, - Variant24922, - Variant24923, - Variant24924, - Variant24925, - Variant24926, - Variant24927, - Variant24928, - Variant24929, - Variant24930, - Variant24931, - Variant24932, - Variant24933, - Variant24934, - Variant24935, - Variant24936, - Variant24937, - Variant24938, - Variant24939, - Variant24940, - Variant24941, - Variant24942, - Variant24943, - Variant24944, - Variant24945, - Variant24946, - Variant24947, - Variant24948, - Variant24949, - Variant24950, - Variant24951, - Variant24952, - Variant24953, - Variant24954, - Variant24955, - Variant24956, - Variant24957, - Variant24958, - Variant24959, - Variant24960, - Variant24961, - Variant24962, - Variant24963, - Variant24964, - Variant24965, - Variant24966, - Variant24967, - Variant24968, - Variant24969, - Variant24970, - Variant24971, - Variant24972, - Variant24973, - Variant24974, - Variant24975, - Variant24976, - Variant24977, - Variant24978, - Variant24979, - Variant24980, - Variant24981, - Variant24982, - Variant24983, - Variant24984, - Variant24985, - Variant24986, - Variant24987, - Variant24988, - Variant24989, - Variant24990, - Variant24991, - Variant24992, - Variant24993, - Variant24994, - Variant24995, - Variant24996, - Variant24997, - Variant24998, - Variant24999, - Variant25000, - Variant25001, - Variant25002, - Variant25003, - Variant25004, - Variant25005, - Variant25006, - Variant25007, - Variant25008, - Variant25009, - Variant25010, - Variant25011, - Variant25012, - Variant25013, - Variant25014, - Variant25015, - Variant25016, - Variant25017, - Variant25018, - Variant25019, - Variant25020, - Variant25021, - Variant25022, - Variant25023, - Variant25024, - Variant25025, - Variant25026, - Variant25027, - Variant25028, - Variant25029, - Variant25030, - Variant25031, - Variant25032, - Variant25033, - Variant25034, - Variant25035, - Variant25036, - Variant25037, - Variant25038, - Variant25039, - Variant25040, - Variant25041, - Variant25042, - Variant25043, - Variant25044, - Variant25045, - Variant25046, - Variant25047, - Variant25048, - Variant25049, - Variant25050, - Variant25051, - Variant25052, - Variant25053, - Variant25054, - Variant25055, - Variant25056, - Variant25057, - Variant25058, - Variant25059, - Variant25060, - Variant25061, - Variant25062, - Variant25063, - Variant25064, - Variant25065, - Variant25066, - Variant25067, - Variant25068, - Variant25069, - Variant25070, - Variant25071, - Variant25072, - Variant25073, - Variant25074, - Variant25075, - Variant25076, - Variant25077, - Variant25078, - Variant25079, - Variant25080, - Variant25081, - Variant25082, - Variant25083, - Variant25084, - Variant25085, - Variant25086, - Variant25087, - Variant25088, - Variant25089, - Variant25090, - Variant25091, - Variant25092, - Variant25093, - Variant25094, - Variant25095, - Variant25096, - Variant25097, - Variant25098, - Variant25099, - Variant25100, - Variant25101, - Variant25102, - Variant25103, - Variant25104, - Variant25105, - Variant25106, - Variant25107, - Variant25108, - Variant25109, - Variant25110, - Variant25111, - Variant25112, - Variant25113, - Variant25114, - Variant25115, - Variant25116, - Variant25117, - Variant25118, - Variant25119, - Variant25120, - Variant25121, - Variant25122, - Variant25123, - Variant25124, - Variant25125, - Variant25126, - Variant25127, - Variant25128, - Variant25129, - Variant25130, - Variant25131, - Variant25132, - Variant25133, - Variant25134, - Variant25135, - Variant25136, - Variant25137, - Variant25138, - Variant25139, - Variant25140, - Variant25141, - Variant25142, - Variant25143, - Variant25144, - Variant25145, - Variant25146, - Variant25147, - Variant25148, - Variant25149, - Variant25150, - Variant25151, - Variant25152, - Variant25153, - Variant25154, - Variant25155, - Variant25156, - Variant25157, - Variant25158, - Variant25159, - Variant25160, - Variant25161, - Variant25162, - Variant25163, - Variant25164, - Variant25165, - Variant25166, - Variant25167, - Variant25168, - Variant25169, - Variant25170, - Variant25171, - Variant25172, - Variant25173, - Variant25174, - Variant25175, - Variant25176, - Variant25177, - Variant25178, - Variant25179, - Variant25180, - Variant25181, - Variant25182, - Variant25183, - Variant25184, - Variant25185, - Variant25186, - Variant25187, - Variant25188, - Variant25189, - Variant25190, - Variant25191, - Variant25192, - Variant25193, - Variant25194, - Variant25195, - Variant25196, - Variant25197, - Variant25198, - Variant25199, - Variant25200, - Variant25201, - Variant25202, - Variant25203, - Variant25204, - Variant25205, - Variant25206, - Variant25207, - Variant25208, - Variant25209, - Variant25210, - Variant25211, - Variant25212, - Variant25213, - Variant25214, - Variant25215, - Variant25216, - Variant25217, - Variant25218, - Variant25219, - Variant25220, - Variant25221, - Variant25222, - Variant25223, - Variant25224, - Variant25225, - Variant25226, - Variant25227, - Variant25228, - Variant25229, - Variant25230, - Variant25231, - Variant25232, - Variant25233, - Variant25234, - Variant25235, - Variant25236, - Variant25237, - Variant25238, - Variant25239, - Variant25240, - Variant25241, - Variant25242, - Variant25243, - Variant25244, - Variant25245, - Variant25246, - Variant25247, - Variant25248, - Variant25249, - Variant25250, - Variant25251, - Variant25252, - Variant25253, - Variant25254, - Variant25255, - Variant25256, - Variant25257, - Variant25258, - Variant25259, - Variant25260, - Variant25261, - Variant25262, - Variant25263, - Variant25264, - Variant25265, - Variant25266, - Variant25267, - Variant25268, - Variant25269, - Variant25270, - Variant25271, - Variant25272, - Variant25273, - Variant25274, - Variant25275, - Variant25276, - Variant25277, - Variant25278, - Variant25279, - Variant25280, - Variant25281, - Variant25282, - Variant25283, - Variant25284, - Variant25285, - Variant25286, - Variant25287, - Variant25288, - Variant25289, - Variant25290, - Variant25291, - Variant25292, - Variant25293, - Variant25294, - Variant25295, - Variant25296, - Variant25297, - Variant25298, - Variant25299, - Variant25300, - Variant25301, - Variant25302, - Variant25303, - Variant25304, - Variant25305, - Variant25306, - Variant25307, - Variant25308, - Variant25309, - Variant25310, - Variant25311, - Variant25312, - Variant25313, - Variant25314, - Variant25315, - Variant25316, - Variant25317, - Variant25318, - Variant25319, - Variant25320, - Variant25321, - Variant25322, - Variant25323, - Variant25324, - Variant25325, - Variant25326, - Variant25327, - Variant25328, - Variant25329, - Variant25330, - Variant25331, - Variant25332, - Variant25333, - Variant25334, - Variant25335, - Variant25336, - Variant25337, - Variant25338, - Variant25339, - Variant25340, - Variant25341, - Variant25342, - Variant25343, - Variant25344, - Variant25345, - Variant25346, - Variant25347, - Variant25348, - Variant25349, - Variant25350, - Variant25351, - Variant25352, - Variant25353, - Variant25354, - Variant25355, - Variant25356, - Variant25357, - Variant25358, - Variant25359, - Variant25360, - Variant25361, - Variant25362, - Variant25363, - Variant25364, - Variant25365, - Variant25366, - Variant25367, - Variant25368, - Variant25369, - Variant25370, - Variant25371, - Variant25372, - Variant25373, - Variant25374, - Variant25375, - Variant25376, - Variant25377, - Variant25378, - Variant25379, - Variant25380, - Variant25381, - Variant25382, - Variant25383, - Variant25384, - Variant25385, - Variant25386, - Variant25387, - Variant25388, - Variant25389, - Variant25390, - Variant25391, - Variant25392, - Variant25393, - Variant25394, - Variant25395, - Variant25396, - Variant25397, - Variant25398, - Variant25399, - Variant25400, - Variant25401, - Variant25402, - Variant25403, - Variant25404, - Variant25405, - Variant25406, - Variant25407, - Variant25408, - Variant25409, - Variant25410, - Variant25411, - Variant25412, - Variant25413, - Variant25414, - Variant25415, - Variant25416, - Variant25417, - Variant25418, - Variant25419, - Variant25420, - Variant25421, - Variant25422, - Variant25423, - Variant25424, - Variant25425, - Variant25426, - Variant25427, - Variant25428, - Variant25429, - Variant25430, - Variant25431, - Variant25432, - Variant25433, - Variant25434, - Variant25435, - Variant25436, - Variant25437, - Variant25438, - Variant25439, - Variant25440, - Variant25441, - Variant25442, - Variant25443, - Variant25444, - Variant25445, - Variant25446, - Variant25447, - Variant25448, - Variant25449, - Variant25450, - Variant25451, - Variant25452, - Variant25453, - Variant25454, - Variant25455, - Variant25456, - Variant25457, - Variant25458, - Variant25459, - Variant25460, - Variant25461, - Variant25462, - Variant25463, - Variant25464, - Variant25465, - Variant25466, - Variant25467, - Variant25468, - Variant25469, - Variant25470, - Variant25471, - Variant25472, - Variant25473, - Variant25474, - Variant25475, - Variant25476, - Variant25477, - Variant25478, - Variant25479, - Variant25480, - Variant25481, - Variant25482, - Variant25483, - Variant25484, - Variant25485, - Variant25486, - Variant25487, - Variant25488, - Variant25489, - Variant25490, - Variant25491, - Variant25492, - Variant25493, - Variant25494, - Variant25495, - Variant25496, - Variant25497, - Variant25498, - Variant25499, - Variant25500, - Variant25501, - Variant25502, - Variant25503, - Variant25504, - Variant25505, - Variant25506, - Variant25507, - Variant25508, - Variant25509, - Variant25510, - Variant25511, - Variant25512, - Variant25513, - Variant25514, - Variant25515, - Variant25516, - Variant25517, - Variant25518, - Variant25519, - Variant25520, - Variant25521, - Variant25522, - Variant25523, - Variant25524, - Variant25525, - Variant25526, - Variant25527, - Variant25528, - Variant25529, - Variant25530, - Variant25531, - Variant25532, - Variant25533, - Variant25534, - Variant25535, - Variant25536, - Variant25537, - Variant25538, - Variant25539, - Variant25540, - Variant25541, - Variant25542, - Variant25543, - Variant25544, - Variant25545, - Variant25546, - Variant25547, - Variant25548, - Variant25549, - Variant25550, - Variant25551, - Variant25552, - Variant25553, - Variant25554, - Variant25555, - Variant25556, - Variant25557, - Variant25558, - Variant25559, - Variant25560, - Variant25561, - Variant25562, - Variant25563, - Variant25564, - Variant25565, - Variant25566, - Variant25567, - Variant25568, - Variant25569, - Variant25570, - Variant25571, - Variant25572, - Variant25573, - Variant25574, - Variant25575, - Variant25576, - Variant25577, - Variant25578, - Variant25579, - Variant25580, - Variant25581, - Variant25582, - Variant25583, - Variant25584, - Variant25585, - Variant25586, - Variant25587, - Variant25588, - Variant25589, - Variant25590, - Variant25591, - Variant25592, - Variant25593, - Variant25594, - Variant25595, - Variant25596, - Variant25597, - Variant25598, - Variant25599, - Variant25600, - Variant25601, - Variant25602, - Variant25603, - Variant25604, - Variant25605, - Variant25606, - Variant25607, - Variant25608, - Variant25609, - Variant25610, - Variant25611, - Variant25612, - Variant25613, - Variant25614, - Variant25615, - Variant25616, - Variant25617, - Variant25618, - Variant25619, - Variant25620, - Variant25621, - Variant25622, - Variant25623, - Variant25624, - Variant25625, - Variant25626, - Variant25627, - Variant25628, - Variant25629, - Variant25630, - Variant25631, - Variant25632, - Variant25633, - Variant25634, - Variant25635, - Variant25636, - Variant25637, - Variant25638, - Variant25639, - Variant25640, - Variant25641, - Variant25642, - Variant25643, - Variant25644, - Variant25645, - Variant25646, - Variant25647, - Variant25648, - Variant25649, - Variant25650, - Variant25651, - Variant25652, - Variant25653, - Variant25654, - Variant25655, - Variant25656, - Variant25657, - Variant25658, - Variant25659, - Variant25660, - Variant25661, - Variant25662, - Variant25663, - Variant25664, - Variant25665, - Variant25666, - Variant25667, - Variant25668, - Variant25669, - Variant25670, - Variant25671, - Variant25672, - Variant25673, - Variant25674, - Variant25675, - Variant25676, - Variant25677, - Variant25678, - Variant25679, - Variant25680, - Variant25681, - Variant25682, - Variant25683, - Variant25684, - Variant25685, - Variant25686, - Variant25687, - Variant25688, - Variant25689, - Variant25690, - Variant25691, - Variant25692, - Variant25693, - Variant25694, - Variant25695, - Variant25696, - Variant25697, - Variant25698, - Variant25699, - Variant25700, - Variant25701, - Variant25702, - Variant25703, - Variant25704, - Variant25705, - Variant25706, - Variant25707, - Variant25708, - Variant25709, - Variant25710, - Variant25711, - Variant25712, - Variant25713, - Variant25714, - Variant25715, - Variant25716, - Variant25717, - Variant25718, - Variant25719, - Variant25720, - Variant25721, - Variant25722, - Variant25723, - Variant25724, - Variant25725, - Variant25726, - Variant25727, - Variant25728, - Variant25729, - Variant25730, - Variant25731, - Variant25732, - Variant25733, - Variant25734, - Variant25735, - Variant25736, - Variant25737, - Variant25738, - Variant25739, - Variant25740, - Variant25741, - Variant25742, - Variant25743, - Variant25744, - Variant25745, - Variant25746, - Variant25747, - Variant25748, - Variant25749, - Variant25750, - Variant25751, - Variant25752, - Variant25753, - Variant25754, - Variant25755, - Variant25756, - Variant25757, - Variant25758, - Variant25759, - Variant25760, - Variant25761, - Variant25762, - Variant25763, - Variant25764, - Variant25765, - Variant25766, - Variant25767, - Variant25768, - Variant25769, - Variant25770, - Variant25771, - Variant25772, - Variant25773, - Variant25774, - Variant25775, - Variant25776, - Variant25777, - Variant25778, - Variant25779, - Variant25780, - Variant25781, - Variant25782, - Variant25783, - Variant25784, - Variant25785, - Variant25786, - Variant25787, - Variant25788, - Variant25789, - Variant25790, - Variant25791, - Variant25792, - Variant25793, - Variant25794, - Variant25795, - Variant25796, - Variant25797, - Variant25798, - Variant25799, - Variant25800, - Variant25801, - Variant25802, - Variant25803, - Variant25804, - Variant25805, - Variant25806, - Variant25807, - Variant25808, - Variant25809, - Variant25810, - Variant25811, - Variant25812, - Variant25813, - Variant25814, - Variant25815, - Variant25816, - Variant25817, - Variant25818, - Variant25819, - Variant25820, - Variant25821, - Variant25822, - Variant25823, - Variant25824, - Variant25825, - Variant25826, - Variant25827, - Variant25828, - Variant25829, - Variant25830, - Variant25831, - Variant25832, - Variant25833, - Variant25834, - Variant25835, - Variant25836, - Variant25837, - Variant25838, - Variant25839, - Variant25840, - Variant25841, - Variant25842, - Variant25843, - Variant25844, - Variant25845, - Variant25846, - Variant25847, - Variant25848, - Variant25849, - Variant25850, - Variant25851, - Variant25852, - Variant25853, - Variant25854, - Variant25855, - Variant25856, - Variant25857, - Variant25858, - Variant25859, - Variant25860, - Variant25861, - Variant25862, - Variant25863, - Variant25864, - Variant25865, - Variant25866, - Variant25867, - Variant25868, - Variant25869, - Variant25870, - Variant25871, - Variant25872, - Variant25873, - Variant25874, - Variant25875, - Variant25876, - Variant25877, - Variant25878, - Variant25879, - Variant25880, - Variant25881, - Variant25882, - Variant25883, - Variant25884, - Variant25885, - Variant25886, - Variant25887, - Variant25888, - Variant25889, - Variant25890, - Variant25891, - Variant25892, - Variant25893, - Variant25894, - Variant25895, - Variant25896, - Variant25897, - Variant25898, - Variant25899, - Variant25900, - Variant25901, - Variant25902, - Variant25903, - Variant25904, - Variant25905, - Variant25906, - Variant25907, - Variant25908, - Variant25909, - Variant25910, - Variant25911, - Variant25912, - Variant25913, - Variant25914, - Variant25915, - Variant25916, - Variant25917, - Variant25918, - Variant25919, - Variant25920, - Variant25921, - Variant25922, - Variant25923, - Variant25924, - Variant25925, - Variant25926, - Variant25927, - Variant25928, - Variant25929, - Variant25930, - Variant25931, - Variant25932, - Variant25933, - Variant25934, - Variant25935, - Variant25936, - Variant25937, - Variant25938, - Variant25939, - Variant25940, - Variant25941, - Variant25942, - Variant25943, - Variant25944, - Variant25945, - Variant25946, - Variant25947, - Variant25948, - Variant25949, - Variant25950, - Variant25951, - Variant25952, - Variant25953, - Variant25954, - Variant25955, - Variant25956, - Variant25957, - Variant25958, - Variant25959, - Variant25960, - Variant25961, - Variant25962, - Variant25963, - Variant25964, - Variant25965, - Variant25966, - Variant25967, - Variant25968, - Variant25969, - Variant25970, - Variant25971, - Variant25972, - Variant25973, - Variant25974, - Variant25975, - Variant25976, - Variant25977, - Variant25978, - Variant25979, - Variant25980, - Variant25981, - Variant25982, - Variant25983, - Variant25984, - Variant25985, - Variant25986, - Variant25987, - Variant25988, - Variant25989, - Variant25990, - Variant25991, - Variant25992, - Variant25993, - Variant25994, - Variant25995, - Variant25996, - Variant25997, - Variant25998, - Variant25999, - Variant26000, - Variant26001, - Variant26002, - Variant26003, - Variant26004, - Variant26005, - Variant26006, - Variant26007, - Variant26008, - Variant26009, - Variant26010, - Variant26011, - Variant26012, - Variant26013, - Variant26014, - Variant26015, - Variant26016, - Variant26017, - Variant26018, - Variant26019, - Variant26020, - Variant26021, - Variant26022, - Variant26023, - Variant26024, - Variant26025, - Variant26026, - Variant26027, - Variant26028, - Variant26029, - Variant26030, - Variant26031, - Variant26032, - Variant26033, - Variant26034, - Variant26035, - Variant26036, - Variant26037, - Variant26038, - Variant26039, - Variant26040, - Variant26041, - Variant26042, - Variant26043, - Variant26044, - Variant26045, - Variant26046, - Variant26047, - Variant26048, - Variant26049, - Variant26050, - Variant26051, - Variant26052, - Variant26053, - Variant26054, - Variant26055, - Variant26056, - Variant26057, - Variant26058, - Variant26059, - Variant26060, - Variant26061, - Variant26062, - Variant26063, - Variant26064, - Variant26065, - Variant26066, - Variant26067, - Variant26068, - Variant26069, - Variant26070, - Variant26071, - Variant26072, - Variant26073, - Variant26074, - Variant26075, - Variant26076, - Variant26077, - Variant26078, - Variant26079, - Variant26080, - Variant26081, - Variant26082, - Variant26083, - Variant26084, - Variant26085, - Variant26086, - Variant26087, - Variant26088, - Variant26089, - Variant26090, - Variant26091, - Variant26092, - Variant26093, - Variant26094, - Variant26095, - Variant26096, - Variant26097, - Variant26098, - Variant26099, - Variant26100, - Variant26101, - Variant26102, - Variant26103, - Variant26104, - Variant26105, - Variant26106, - Variant26107, - Variant26108, - Variant26109, - Variant26110, - Variant26111, - Variant26112, - Variant26113, - Variant26114, - Variant26115, - Variant26116, - Variant26117, - Variant26118, - Variant26119, - Variant26120, - Variant26121, - Variant26122, - Variant26123, - Variant26124, - Variant26125, - Variant26126, - Variant26127, - Variant26128, - Variant26129, - Variant26130, - Variant26131, - Variant26132, - Variant26133, - Variant26134, - Variant26135, - Variant26136, - Variant26137, - Variant26138, - Variant26139, - Variant26140, - Variant26141, - Variant26142, - Variant26143, - Variant26144, - Variant26145, - Variant26146, - Variant26147, - Variant26148, - Variant26149, - Variant26150, - Variant26151, - Variant26152, - Variant26153, - Variant26154, - Variant26155, - Variant26156, - Variant26157, - Variant26158, - Variant26159, - Variant26160, - Variant26161, - Variant26162, - Variant26163, - Variant26164, - Variant26165, - Variant26166, - Variant26167, - Variant26168, - Variant26169, - Variant26170, - Variant26171, - Variant26172, - Variant26173, - Variant26174, - Variant26175, - Variant26176, - Variant26177, - Variant26178, - Variant26179, - Variant26180, - Variant26181, - Variant26182, - Variant26183, - Variant26184, - Variant26185, - Variant26186, - Variant26187, - Variant26188, - Variant26189, - Variant26190, - Variant26191, - Variant26192, - Variant26193, - Variant26194, - Variant26195, - Variant26196, - Variant26197, - Variant26198, - Variant26199, - Variant26200, - Variant26201, - Variant26202, - Variant26203, - Variant26204, - Variant26205, - Variant26206, - Variant26207, - Variant26208, - Variant26209, - Variant26210, - Variant26211, - Variant26212, - Variant26213, - Variant26214, - Variant26215, - Variant26216, - Variant26217, - Variant26218, - Variant26219, - Variant26220, - Variant26221, - Variant26222, - Variant26223, - Variant26224, - Variant26225, - Variant26226, - Variant26227, - Variant26228, - Variant26229, - Variant26230, - Variant26231, - Variant26232, - Variant26233, - Variant26234, - Variant26235, - Variant26236, - Variant26237, - Variant26238, - Variant26239, - Variant26240, - Variant26241, - Variant26242, - Variant26243, - Variant26244, - Variant26245, - Variant26246, - Variant26247, - Variant26248, - Variant26249, - Variant26250, - Variant26251, - Variant26252, - Variant26253, - Variant26254, - Variant26255, - Variant26256, - Variant26257, - Variant26258, - Variant26259, - Variant26260, - Variant26261, - Variant26262, - Variant26263, - Variant26264, - Variant26265, - Variant26266, - Variant26267, - Variant26268, - Variant26269, - Variant26270, - Variant26271, - Variant26272, - Variant26273, - Variant26274, - Variant26275, - Variant26276, - Variant26277, - Variant26278, - Variant26279, - Variant26280, - Variant26281, - Variant26282, - Variant26283, - Variant26284, - Variant26285, - Variant26286, - Variant26287, - Variant26288, - Variant26289, - Variant26290, - Variant26291, - Variant26292, - Variant26293, - Variant26294, - Variant26295, - Variant26296, - Variant26297, - Variant26298, - Variant26299, - Variant26300, - Variant26301, - Variant26302, - Variant26303, - Variant26304, - Variant26305, - Variant26306, - Variant26307, - Variant26308, - Variant26309, - Variant26310, - Variant26311, - Variant26312, - Variant26313, - Variant26314, - Variant26315, - Variant26316, - Variant26317, - Variant26318, - Variant26319, - Variant26320, - Variant26321, - Variant26322, - Variant26323, - Variant26324, - Variant26325, - Variant26326, - Variant26327, - Variant26328, - Variant26329, - Variant26330, - Variant26331, - Variant26332, - Variant26333, - Variant26334, - Variant26335, - Variant26336, - Variant26337, - Variant26338, - Variant26339, - Variant26340, - Variant26341, - Variant26342, - Variant26343, - Variant26344, - Variant26345, - Variant26346, - Variant26347, - Variant26348, - Variant26349, - Variant26350, - Variant26351, - Variant26352, - Variant26353, - Variant26354, - Variant26355, - Variant26356, - Variant26357, - Variant26358, - Variant26359, - Variant26360, - Variant26361, - Variant26362, - Variant26363, - Variant26364, - Variant26365, - Variant26366, - Variant26367, - Variant26368, - Variant26369, - Variant26370, - Variant26371, - Variant26372, - Variant26373, - Variant26374, - Variant26375, - Variant26376, - Variant26377, - Variant26378, - Variant26379, - Variant26380, - Variant26381, - Variant26382, - Variant26383, - Variant26384, - Variant26385, - Variant26386, - Variant26387, - Variant26388, - Variant26389, - Variant26390, - Variant26391, - Variant26392, - Variant26393, - Variant26394, - Variant26395, - Variant26396, - Variant26397, - Variant26398, - Variant26399, - Variant26400, - Variant26401, - Variant26402, - Variant26403, - Variant26404, - Variant26405, - Variant26406, - Variant26407, - Variant26408, - Variant26409, - Variant26410, - Variant26411, - Variant26412, - Variant26413, - Variant26414, - Variant26415, - Variant26416, - Variant26417, - Variant26418, - Variant26419, - Variant26420, - Variant26421, - Variant26422, - Variant26423, - Variant26424, - Variant26425, - Variant26426, - Variant26427, - Variant26428, - Variant26429, - Variant26430, - Variant26431, - Variant26432, - Variant26433, - Variant26434, - Variant26435, - Variant26436, - Variant26437, - Variant26438, - Variant26439, - Variant26440, - Variant26441, - Variant26442, - Variant26443, - Variant26444, - Variant26445, - Variant26446, - Variant26447, - Variant26448, - Variant26449, - Variant26450, - Variant26451, - Variant26452, - Variant26453, - Variant26454, - Variant26455, - Variant26456, - Variant26457, - Variant26458, - Variant26459, - Variant26460, - Variant26461, - Variant26462, - Variant26463, - Variant26464, - Variant26465, - Variant26466, - Variant26467, - Variant26468, - Variant26469, - Variant26470, - Variant26471, - Variant26472, - Variant26473, - Variant26474, - Variant26475, - Variant26476, - Variant26477, - Variant26478, - Variant26479, - Variant26480, - Variant26481, - Variant26482, - Variant26483, - Variant26484, - Variant26485, - Variant26486, - Variant26487, - Variant26488, - Variant26489, - Variant26490, - Variant26491, - Variant26492, - Variant26493, - Variant26494, - Variant26495, - Variant26496, - Variant26497, - Variant26498, - Variant26499, - Variant26500, - Variant26501, - Variant26502, - Variant26503, - Variant26504, - Variant26505, - Variant26506, - Variant26507, - Variant26508, - Variant26509, - Variant26510, - Variant26511, - Variant26512, - Variant26513, - Variant26514, - Variant26515, - Variant26516, - Variant26517, - Variant26518, - Variant26519, - Variant26520, - Variant26521, - Variant26522, - Variant26523, - Variant26524, - Variant26525, - Variant26526, - Variant26527, - Variant26528, - Variant26529, - Variant26530, - Variant26531, - Variant26532, - Variant26533, - Variant26534, - Variant26535, - Variant26536, - Variant26537, - Variant26538, - Variant26539, - Variant26540, - Variant26541, - Variant26542, - Variant26543, - Variant26544, - Variant26545, - Variant26546, - Variant26547, - Variant26548, - Variant26549, - Variant26550, - Variant26551, - Variant26552, - Variant26553, - Variant26554, - Variant26555, - Variant26556, - Variant26557, - Variant26558, - Variant26559, - Variant26560, - Variant26561, - Variant26562, - Variant26563, - Variant26564, - Variant26565, - Variant26566, - Variant26567, - Variant26568, - Variant26569, - Variant26570, - Variant26571, - Variant26572, - Variant26573, - Variant26574, - Variant26575, - Variant26576, - Variant26577, - Variant26578, - Variant26579, - Variant26580, - Variant26581, - Variant26582, - Variant26583, - Variant26584, - Variant26585, - Variant26586, - Variant26587, - Variant26588, - Variant26589, - Variant26590, - Variant26591, - Variant26592, - Variant26593, - Variant26594, - Variant26595, - Variant26596, - Variant26597, - Variant26598, - Variant26599, - Variant26600, - Variant26601, - Variant26602, - Variant26603, - Variant26604, - Variant26605, - Variant26606, - Variant26607, - Variant26608, - Variant26609, - Variant26610, - Variant26611, - Variant26612, - Variant26613, - Variant26614, - Variant26615, - Variant26616, - Variant26617, - Variant26618, - Variant26619, - Variant26620, - Variant26621, - Variant26622, - Variant26623, - Variant26624, - Variant26625, - Variant26626, - Variant26627, - Variant26628, - Variant26629, - Variant26630, - Variant26631, - Variant26632, - Variant26633, - Variant26634, - Variant26635, - Variant26636, - Variant26637, - Variant26638, - Variant26639, - Variant26640, - Variant26641, - Variant26642, - Variant26643, - Variant26644, - Variant26645, - Variant26646, - Variant26647, - Variant26648, - Variant26649, - Variant26650, - Variant26651, - Variant26652, - Variant26653, - Variant26654, - Variant26655, - Variant26656, - Variant26657, - Variant26658, - Variant26659, - Variant26660, - Variant26661, - Variant26662, - Variant26663, - Variant26664, - Variant26665, - Variant26666, - Variant26667, - Variant26668, - Variant26669, - Variant26670, - Variant26671, - Variant26672, - Variant26673, - Variant26674, - Variant26675, - Variant26676, - Variant26677, - Variant26678, - Variant26679, - Variant26680, - Variant26681, - Variant26682, - Variant26683, - Variant26684, - Variant26685, - Variant26686, - Variant26687, - Variant26688, - Variant26689, - Variant26690, - Variant26691, - Variant26692, - Variant26693, - Variant26694, - Variant26695, - Variant26696, - Variant26697, - Variant26698, - Variant26699, - Variant26700, - Variant26701, - Variant26702, - Variant26703, - Variant26704, - Variant26705, - Variant26706, - Variant26707, - Variant26708, - Variant26709, - Variant26710, - Variant26711, - Variant26712, - Variant26713, - Variant26714, - Variant26715, - Variant26716, - Variant26717, - Variant26718, - Variant26719, - Variant26720, - Variant26721, - Variant26722, - Variant26723, - Variant26724, - Variant26725, - Variant26726, - Variant26727, - Variant26728, - Variant26729, - Variant26730, - Variant26731, - Variant26732, - Variant26733, - Variant26734, - Variant26735, - Variant26736, - Variant26737, - Variant26738, - Variant26739, - Variant26740, - Variant26741, - Variant26742, - Variant26743, - Variant26744, - Variant26745, - Variant26746, - Variant26747, - Variant26748, - Variant26749, - Variant26750, - Variant26751, - Variant26752, - Variant26753, - Variant26754, - Variant26755, - Variant26756, - Variant26757, - Variant26758, - Variant26759, - Variant26760, - Variant26761, - Variant26762, - Variant26763, - Variant26764, - Variant26765, - Variant26766, - Variant26767, - Variant26768, - Variant26769, - Variant26770, - Variant26771, - Variant26772, - Variant26773, - Variant26774, - Variant26775, - Variant26776, - Variant26777, - Variant26778, - Variant26779, - Variant26780, - Variant26781, - Variant26782, - Variant26783, - Variant26784, - Variant26785, - Variant26786, - Variant26787, - Variant26788, - Variant26789, - Variant26790, - Variant26791, - Variant26792, - Variant26793, - Variant26794, - Variant26795, - Variant26796, - Variant26797, - Variant26798, - Variant26799, - Variant26800, - Variant26801, - Variant26802, - Variant26803, - Variant26804, - Variant26805, - Variant26806, - Variant26807, - Variant26808, - Variant26809, - Variant26810, - Variant26811, - Variant26812, - Variant26813, - Variant26814, - Variant26815, - Variant26816, - Variant26817, - Variant26818, - Variant26819, - Variant26820, - Variant26821, - Variant26822, - Variant26823, - Variant26824, - Variant26825, - Variant26826, - Variant26827, - Variant26828, - Variant26829, - Variant26830, - Variant26831, - Variant26832, - Variant26833, - Variant26834, - Variant26835, - Variant26836, - Variant26837, - Variant26838, - Variant26839, - Variant26840, - Variant26841, - Variant26842, - Variant26843, - Variant26844, - Variant26845, - Variant26846, - Variant26847, - Variant26848, - Variant26849, - Variant26850, - Variant26851, - Variant26852, - Variant26853, - Variant26854, - Variant26855, - Variant26856, - Variant26857, - Variant26858, - Variant26859, - Variant26860, - Variant26861, - Variant26862, - Variant26863, - Variant26864, - Variant26865, - Variant26866, - Variant26867, - Variant26868, - Variant26869, - Variant26870, - Variant26871, - Variant26872, - Variant26873, - Variant26874, - Variant26875, - Variant26876, - Variant26877, - Variant26878, - Variant26879, - Variant26880, - Variant26881, - Variant26882, - Variant26883, - Variant26884, - Variant26885, - Variant26886, - Variant26887, - Variant26888, - Variant26889, - Variant26890, - Variant26891, - Variant26892, - Variant26893, - Variant26894, - Variant26895, - Variant26896, - Variant26897, - Variant26898, - Variant26899, - Variant26900, - Variant26901, - Variant26902, - Variant26903, - Variant26904, - Variant26905, - Variant26906, - Variant26907, - Variant26908, - Variant26909, - Variant26910, - Variant26911, - Variant26912, - Variant26913, - Variant26914, - Variant26915, - Variant26916, - Variant26917, - Variant26918, - Variant26919, - Variant26920, - Variant26921, - Variant26922, - Variant26923, - Variant26924, - Variant26925, - Variant26926, - Variant26927, - Variant26928, - Variant26929, - Variant26930, - Variant26931, - Variant26932, - Variant26933, - Variant26934, - Variant26935, - Variant26936, - Variant26937, - Variant26938, - Variant26939, - Variant26940, - Variant26941, - Variant26942, - Variant26943, - Variant26944, - Variant26945, - Variant26946, - Variant26947, - Variant26948, - Variant26949, - Variant26950, - Variant26951, - Variant26952, - Variant26953, - Variant26954, - Variant26955, - Variant26956, - Variant26957, - Variant26958, - Variant26959, - Variant26960, - Variant26961, - Variant26962, - Variant26963, - Variant26964, - Variant26965, - Variant26966, - Variant26967, - Variant26968, - Variant26969, - Variant26970, - Variant26971, - Variant26972, - Variant26973, - Variant26974, - Variant26975, - Variant26976, - Variant26977, - Variant26978, - Variant26979, - Variant26980, - Variant26981, - Variant26982, - Variant26983, - Variant26984, - Variant26985, - Variant26986, - Variant26987, - Variant26988, - Variant26989, - Variant26990, - Variant26991, - Variant26992, - Variant26993, - Variant26994, - Variant26995, - Variant26996, - Variant26997, - Variant26998, - Variant26999, - Variant27000, - Variant27001, - Variant27002, - Variant27003, - Variant27004, - Variant27005, - Variant27006, - Variant27007, - Variant27008, - Variant27009, - Variant27010, - Variant27011, - Variant27012, - Variant27013, - Variant27014, - Variant27015, - Variant27016, - Variant27017, - Variant27018, - Variant27019, - Variant27020, - Variant27021, - Variant27022, - Variant27023, - Variant27024, - Variant27025, - Variant27026, - Variant27027, - Variant27028, - Variant27029, - Variant27030, - Variant27031, - Variant27032, - Variant27033, - Variant27034, - Variant27035, - Variant27036, - Variant27037, - Variant27038, - Variant27039, - Variant27040, - Variant27041, - Variant27042, - Variant27043, - Variant27044, - Variant27045, - Variant27046, - Variant27047, - Variant27048, - Variant27049, - Variant27050, - Variant27051, - Variant27052, - Variant27053, - Variant27054, - Variant27055, - Variant27056, - Variant27057, - Variant27058, - Variant27059, - Variant27060, - Variant27061, - Variant27062, - Variant27063, - Variant27064, - Variant27065, - Variant27066, - Variant27067, - Variant27068, - Variant27069, - Variant27070, - Variant27071, - Variant27072, - Variant27073, - Variant27074, - Variant27075, - Variant27076, - Variant27077, - Variant27078, - Variant27079, - Variant27080, - Variant27081, - Variant27082, - Variant27083, - Variant27084, - Variant27085, - Variant27086, - Variant27087, - Variant27088, - Variant27089, - Variant27090, - Variant27091, - Variant27092, - Variant27093, - Variant27094, - Variant27095, - Variant27096, - Variant27097, - Variant27098, - Variant27099, - Variant27100, - Variant27101, - Variant27102, - Variant27103, - Variant27104, - Variant27105, - Variant27106, - Variant27107, - Variant27108, - Variant27109, - Variant27110, - Variant27111, - Variant27112, - Variant27113, - Variant27114, - Variant27115, - Variant27116, - Variant27117, - Variant27118, - Variant27119, - Variant27120, - Variant27121, - Variant27122, - Variant27123, - Variant27124, - Variant27125, - Variant27126, - Variant27127, - Variant27128, - Variant27129, - Variant27130, - Variant27131, - Variant27132, - Variant27133, - Variant27134, - Variant27135, - Variant27136, - Variant27137, - Variant27138, - Variant27139, - Variant27140, - Variant27141, - Variant27142, - Variant27143, - Variant27144, - Variant27145, - Variant27146, - Variant27147, - Variant27148, - Variant27149, - Variant27150, - Variant27151, - Variant27152, - Variant27153, - Variant27154, - Variant27155, - Variant27156, - Variant27157, - Variant27158, - Variant27159, - Variant27160, - Variant27161, - Variant27162, - Variant27163, - Variant27164, - Variant27165, - Variant27166, - Variant27167, - Variant27168, - Variant27169, - Variant27170, - Variant27171, - Variant27172, - Variant27173, - Variant27174, - Variant27175, - Variant27176, - Variant27177, - Variant27178, - Variant27179, - Variant27180, - Variant27181, - Variant27182, - Variant27183, - Variant27184, - Variant27185, - Variant27186, - Variant27187, - Variant27188, - Variant27189, - Variant27190, - Variant27191, - Variant27192, - Variant27193, - Variant27194, - Variant27195, - Variant27196, - Variant27197, - Variant27198, - Variant27199, - Variant27200, - Variant27201, - Variant27202, - Variant27203, - Variant27204, - Variant27205, - Variant27206, - Variant27207, - Variant27208, - Variant27209, - Variant27210, - Variant27211, - Variant27212, - Variant27213, - Variant27214, - Variant27215, - Variant27216, - Variant27217, - Variant27218, - Variant27219, - Variant27220, - Variant27221, - Variant27222, - Variant27223, - Variant27224, - Variant27225, - Variant27226, - Variant27227, - Variant27228, - Variant27229, - Variant27230, - Variant27231, - Variant27232, - Variant27233, - Variant27234, - Variant27235, - Variant27236, - Variant27237, - Variant27238, - Variant27239, - Variant27240, - Variant27241, - Variant27242, - Variant27243, - Variant27244, - Variant27245, - Variant27246, - Variant27247, - Variant27248, - Variant27249, - Variant27250, - Variant27251, - Variant27252, - Variant27253, - Variant27254, - Variant27255, - Variant27256, - Variant27257, - Variant27258, - Variant27259, - Variant27260, - Variant27261, - Variant27262, - Variant27263, - Variant27264, - Variant27265, - Variant27266, - Variant27267, - Variant27268, - Variant27269, - Variant27270, - Variant27271, - Variant27272, - Variant27273, - Variant27274, - Variant27275, - Variant27276, - Variant27277, - Variant27278, - Variant27279, - Variant27280, - Variant27281, - Variant27282, - Variant27283, - Variant27284, - Variant27285, - Variant27286, - Variant27287, - Variant27288, - Variant27289, - Variant27290, - Variant27291, - Variant27292, - Variant27293, - Variant27294, - Variant27295, - Variant27296, - Variant27297, - Variant27298, - Variant27299, - Variant27300, - Variant27301, - Variant27302, - Variant27303, - Variant27304, - Variant27305, - Variant27306, - Variant27307, - Variant27308, - Variant27309, - Variant27310, - Variant27311, - Variant27312, - Variant27313, - Variant27314, - Variant27315, - Variant27316, - Variant27317, - Variant27318, - Variant27319, - Variant27320, - Variant27321, - Variant27322, - Variant27323, - Variant27324, - Variant27325, - Variant27326, - Variant27327, - Variant27328, - Variant27329, - Variant27330, - Variant27331, - Variant27332, - Variant27333, - Variant27334, - Variant27335, - Variant27336, - Variant27337, - Variant27338, - Variant27339, - Variant27340, - Variant27341, - Variant27342, - Variant27343, - Variant27344, - Variant27345, - Variant27346, - Variant27347, - Variant27348, - Variant27349, - Variant27350, - Variant27351, - Variant27352, - Variant27353, - Variant27354, - Variant27355, - Variant27356, - Variant27357, - Variant27358, - Variant27359, - Variant27360, - Variant27361, - Variant27362, - Variant27363, - Variant27364, - Variant27365, - Variant27366, - Variant27367, - Variant27368, - Variant27369, - Variant27370, - Variant27371, - Variant27372, - Variant27373, - Variant27374, - Variant27375, - Variant27376, - Variant27377, - Variant27378, - Variant27379, - Variant27380, - Variant27381, - Variant27382, - Variant27383, - Variant27384, - Variant27385, - Variant27386, - Variant27387, - Variant27388, - Variant27389, - Variant27390, - Variant27391, - Variant27392, - Variant27393, - Variant27394, - Variant27395, - Variant27396, - Variant27397, - Variant27398, - Variant27399, - Variant27400, - Variant27401, - Variant27402, - Variant27403, - Variant27404, - Variant27405, - Variant27406, - Variant27407, - Variant27408, - Variant27409, - Variant27410, - Variant27411, - Variant27412, - Variant27413, - Variant27414, - Variant27415, - Variant27416, - Variant27417, - Variant27418, - Variant27419, - Variant27420, - Variant27421, - Variant27422, - Variant27423, - Variant27424, - Variant27425, - Variant27426, - Variant27427, - Variant27428, - Variant27429, - Variant27430, - Variant27431, - Variant27432, - Variant27433, - Variant27434, - Variant27435, - Variant27436, - Variant27437, - Variant27438, - Variant27439, - Variant27440, - Variant27441, - Variant27442, - Variant27443, - Variant27444, - Variant27445, - Variant27446, - Variant27447, - Variant27448, - Variant27449, - Variant27450, - Variant27451, - Variant27452, - Variant27453, - Variant27454, - Variant27455, - Variant27456, - Variant27457, - Variant27458, - Variant27459, - Variant27460, - Variant27461, - Variant27462, - Variant27463, - Variant27464, - Variant27465, - Variant27466, - Variant27467, - Variant27468, - Variant27469, - Variant27470, - Variant27471, - Variant27472, - Variant27473, - Variant27474, - Variant27475, - Variant27476, - Variant27477, - Variant27478, - Variant27479, - Variant27480, - Variant27481, - Variant27482, - Variant27483, - Variant27484, - Variant27485, - Variant27486, - Variant27487, - Variant27488, - Variant27489, - Variant27490, - Variant27491, - Variant27492, - Variant27493, - Variant27494, - Variant27495, - Variant27496, - Variant27497, - Variant27498, - Variant27499, - Variant27500, - Variant27501, - Variant27502, - Variant27503, - Variant27504, - Variant27505, - Variant27506, - Variant27507, - Variant27508, - Variant27509, - Variant27510, - Variant27511, - Variant27512, - Variant27513, - Variant27514, - Variant27515, - Variant27516, - Variant27517, - Variant27518, - Variant27519, - Variant27520, - Variant27521, - Variant27522, - Variant27523, - Variant27524, - Variant27525, - Variant27526, - Variant27527, - Variant27528, - Variant27529, - Variant27530, - Variant27531, - Variant27532, - Variant27533, - Variant27534, - Variant27535, - Variant27536, - Variant27537, - Variant27538, - Variant27539, - Variant27540, - Variant27541, - Variant27542, - Variant27543, - Variant27544, - Variant27545, - Variant27546, - Variant27547, - Variant27548, - Variant27549, - Variant27550, - Variant27551, - Variant27552, - Variant27553, - Variant27554, - Variant27555, - Variant27556, - Variant27557, - Variant27558, - Variant27559, - Variant27560, - Variant27561, - Variant27562, - Variant27563, - Variant27564, - Variant27565, - Variant27566, - Variant27567, - Variant27568, - Variant27569, - Variant27570, - Variant27571, - Variant27572, - Variant27573, - Variant27574, - Variant27575, - Variant27576, - Variant27577, - Variant27578, - Variant27579, - Variant27580, - Variant27581, - Variant27582, - Variant27583, - Variant27584, - Variant27585, - Variant27586, - Variant27587, - Variant27588, - Variant27589, - Variant27590, - Variant27591, - Variant27592, - Variant27593, - Variant27594, - Variant27595, - Variant27596, - Variant27597, - Variant27598, - Variant27599, - Variant27600, - Variant27601, - Variant27602, - Variant27603, - Variant27604, - Variant27605, - Variant27606, - Variant27607, - Variant27608, - Variant27609, - Variant27610, - Variant27611, - Variant27612, - Variant27613, - Variant27614, - Variant27615, - Variant27616, - Variant27617, - Variant27618, - Variant27619, - Variant27620, - Variant27621, - Variant27622, - Variant27623, - Variant27624, - Variant27625, - Variant27626, - Variant27627, - Variant27628, - Variant27629, - Variant27630, - Variant27631, - Variant27632, - Variant27633, - Variant27634, - Variant27635, - Variant27636, - Variant27637, - Variant27638, - Variant27639, - Variant27640, - Variant27641, - Variant27642, - Variant27643, - Variant27644, - Variant27645, - Variant27646, - Variant27647, - Variant27648, - Variant27649, - Variant27650, - Variant27651, - Variant27652, - Variant27653, - Variant27654, - Variant27655, - Variant27656, - Variant27657, - Variant27658, - Variant27659, - Variant27660, - Variant27661, - Variant27662, - Variant27663, - Variant27664, - Variant27665, - Variant27666, - Variant27667, - Variant27668, - Variant27669, - Variant27670, - Variant27671, - Variant27672, - Variant27673, - Variant27674, - Variant27675, - Variant27676, - Variant27677, - Variant27678, - Variant27679, - Variant27680, - Variant27681, - Variant27682, - Variant27683, - Variant27684, - Variant27685, - Variant27686, - Variant27687, - Variant27688, - Variant27689, - Variant27690, - Variant27691, - Variant27692, - Variant27693, - Variant27694, - Variant27695, - Variant27696, - Variant27697, - Variant27698, - Variant27699, - Variant27700, - Variant27701, - Variant27702, - Variant27703, - Variant27704, - Variant27705, - Variant27706, - Variant27707, - Variant27708, - Variant27709, - Variant27710, - Variant27711, - Variant27712, - Variant27713, - Variant27714, - Variant27715, - Variant27716, - Variant27717, - Variant27718, - Variant27719, - Variant27720, - Variant27721, - Variant27722, - Variant27723, - Variant27724, - Variant27725, - Variant27726, - Variant27727, - Variant27728, - Variant27729, - Variant27730, - Variant27731, - Variant27732, - Variant27733, - Variant27734, - Variant27735, - Variant27736, - Variant27737, - Variant27738, - Variant27739, - Variant27740, - Variant27741, - Variant27742, - Variant27743, - Variant27744, - Variant27745, - Variant27746, - Variant27747, - Variant27748, - Variant27749, - Variant27750, - Variant27751, - Variant27752, - Variant27753, - Variant27754, - Variant27755, - Variant27756, - Variant27757, - Variant27758, - Variant27759, - Variant27760, - Variant27761, - Variant27762, - Variant27763, - Variant27764, - Variant27765, - Variant27766, - Variant27767, - Variant27768, - Variant27769, - Variant27770, - Variant27771, - Variant27772, - Variant27773, - Variant27774, - Variant27775, - Variant27776, - Variant27777, - Variant27778, - Variant27779, - Variant27780, - Variant27781, - Variant27782, - Variant27783, - Variant27784, - Variant27785, - Variant27786, - Variant27787, - Variant27788, - Variant27789, - Variant27790, - Variant27791, - Variant27792, - Variant27793, - Variant27794, - Variant27795, - Variant27796, - Variant27797, - Variant27798, - Variant27799, - Variant27800, - Variant27801, - Variant27802, - Variant27803, - Variant27804, - Variant27805, - Variant27806, - Variant27807, - Variant27808, - Variant27809, - Variant27810, - Variant27811, - Variant27812, - Variant27813, - Variant27814, - Variant27815, - Variant27816, - Variant27817, - Variant27818, - Variant27819, - Variant27820, - Variant27821, - Variant27822, - Variant27823, - Variant27824, - Variant27825, - Variant27826, - Variant27827, - Variant27828, - Variant27829, - Variant27830, - Variant27831, - Variant27832, - Variant27833, - Variant27834, - Variant27835, - Variant27836, - Variant27837, - Variant27838, - Variant27839, - Variant27840, - Variant27841, - Variant27842, - Variant27843, - Variant27844, - Variant27845, - Variant27846, - Variant27847, - Variant27848, - Variant27849, - Variant27850, - Variant27851, - Variant27852, - Variant27853, - Variant27854, - Variant27855, - Variant27856, - Variant27857, - Variant27858, - Variant27859, - Variant27860, - Variant27861, - Variant27862, - Variant27863, - Variant27864, - Variant27865, - Variant27866, - Variant27867, - Variant27868, - Variant27869, - Variant27870, - Variant27871, - Variant27872, - Variant27873, - Variant27874, - Variant27875, - Variant27876, - Variant27877, - Variant27878, - Variant27879, - Variant27880, - Variant27881, - Variant27882, - Variant27883, - Variant27884, - Variant27885, - Variant27886, - Variant27887, - Variant27888, - Variant27889, - Variant27890, - Variant27891, - Variant27892, - Variant27893, - Variant27894, - Variant27895, - Variant27896, - Variant27897, - Variant27898, - Variant27899, - Variant27900, - Variant27901, - Variant27902, - Variant27903, - Variant27904, - Variant27905, - Variant27906, - Variant27907, - Variant27908, - Variant27909, - Variant27910, - Variant27911, - Variant27912, - Variant27913, - Variant27914, - Variant27915, - Variant27916, - Variant27917, - Variant27918, - Variant27919, - Variant27920, - Variant27921, - Variant27922, - Variant27923, - Variant27924, - Variant27925, - Variant27926, - Variant27927, - Variant27928, - Variant27929, - Variant27930, - Variant27931, - Variant27932, - Variant27933, - Variant27934, - Variant27935, - Variant27936, - Variant27937, - Variant27938, - Variant27939, - Variant27940, - Variant27941, - Variant27942, - Variant27943, - Variant27944, - Variant27945, - Variant27946, - Variant27947, - Variant27948, - Variant27949, - Variant27950, - Variant27951, - Variant27952, - Variant27953, - Variant27954, - Variant27955, - Variant27956, - Variant27957, - Variant27958, - Variant27959, - Variant27960, - Variant27961, - Variant27962, - Variant27963, - Variant27964, - Variant27965, - Variant27966, - Variant27967, - Variant27968, - Variant27969, - Variant27970, - Variant27971, - Variant27972, - Variant27973, - Variant27974, - Variant27975, - Variant27976, - Variant27977, - Variant27978, - Variant27979, - Variant27980, - Variant27981, - Variant27982, - Variant27983, - Variant27984, - Variant27985, - Variant27986, - Variant27987, - Variant27988, - Variant27989, - Variant27990, - Variant27991, - Variant27992, - Variant27993, - Variant27994, - Variant27995, - Variant27996, - Variant27997, - Variant27998, - Variant27999, - Variant28000, - Variant28001, - Variant28002, - Variant28003, - Variant28004, - Variant28005, - Variant28006, - Variant28007, - Variant28008, - Variant28009, - Variant28010, - Variant28011, - Variant28012, - Variant28013, - Variant28014, - Variant28015, - Variant28016, - Variant28017, - Variant28018, - Variant28019, - Variant28020, - Variant28021, - Variant28022, - Variant28023, - Variant28024, - Variant28025, - Variant28026, - Variant28027, - Variant28028, - Variant28029, - Variant28030, - Variant28031, - Variant28032, - Variant28033, - Variant28034, - Variant28035, - Variant28036, - Variant28037, - Variant28038, - Variant28039, - Variant28040, - Variant28041, - Variant28042, - Variant28043, - Variant28044, - Variant28045, - Variant28046, - Variant28047, - Variant28048, - Variant28049, - Variant28050, - Variant28051, - Variant28052, - Variant28053, - Variant28054, - Variant28055, - Variant28056, - Variant28057, - Variant28058, - Variant28059, - Variant28060, - Variant28061, - Variant28062, - Variant28063, - Variant28064, - Variant28065, - Variant28066, - Variant28067, - Variant28068, - Variant28069, - Variant28070, - Variant28071, - Variant28072, - Variant28073, - Variant28074, - Variant28075, - Variant28076, - Variant28077, - Variant28078, - Variant28079, - Variant28080, - Variant28081, - Variant28082, - Variant28083, - Variant28084, - Variant28085, - Variant28086, - Variant28087, - Variant28088, - Variant28089, - Variant28090, - Variant28091, - Variant28092, - Variant28093, - Variant28094, - Variant28095, - Variant28096, - Variant28097, - Variant28098, - Variant28099, - Variant28100, - Variant28101, - Variant28102, - Variant28103, - Variant28104, - Variant28105, - Variant28106, - Variant28107, - Variant28108, - Variant28109, - Variant28110, - Variant28111, - Variant28112, - Variant28113, - Variant28114, - Variant28115, - Variant28116, - Variant28117, - Variant28118, - Variant28119, - Variant28120, - Variant28121, - Variant28122, - Variant28123, - Variant28124, - Variant28125, - Variant28126, - Variant28127, - Variant28128, - Variant28129, - Variant28130, - Variant28131, - Variant28132, - Variant28133, - Variant28134, - Variant28135, - Variant28136, - Variant28137, - Variant28138, - Variant28139, - Variant28140, - Variant28141, - Variant28142, - Variant28143, - Variant28144, - Variant28145, - Variant28146, - Variant28147, - Variant28148, - Variant28149, - Variant28150, - Variant28151, - Variant28152, - Variant28153, - Variant28154, - Variant28155, - Variant28156, - Variant28157, - Variant28158, - Variant28159, - Variant28160, - Variant28161, - Variant28162, - Variant28163, - Variant28164, - Variant28165, - Variant28166, - Variant28167, - Variant28168, - Variant28169, - Variant28170, - Variant28171, - Variant28172, - Variant28173, - Variant28174, - Variant28175, - Variant28176, - Variant28177, - Variant28178, - Variant28179, - Variant28180, - Variant28181, - Variant28182, - Variant28183, - Variant28184, - Variant28185, - Variant28186, - Variant28187, - Variant28188, - Variant28189, - Variant28190, - Variant28191, - Variant28192, - Variant28193, - Variant28194, - Variant28195, - Variant28196, - Variant28197, - Variant28198, - Variant28199, - Variant28200, - Variant28201, - Variant28202, - Variant28203, - Variant28204, - Variant28205, - Variant28206, - Variant28207, - Variant28208, - Variant28209, - Variant28210, - Variant28211, - Variant28212, - Variant28213, - Variant28214, - Variant28215, - Variant28216, - Variant28217, - Variant28218, - Variant28219, - Variant28220, - Variant28221, - Variant28222, - Variant28223, - Variant28224, - Variant28225, - Variant28226, - Variant28227, - Variant28228, - Variant28229, - Variant28230, - Variant28231, - Variant28232, - Variant28233, - Variant28234, - Variant28235, - Variant28236, - Variant28237, - Variant28238, - Variant28239, - Variant28240, - Variant28241, - Variant28242, - Variant28243, - Variant28244, - Variant28245, - Variant28246, - Variant28247, - Variant28248, - Variant28249, - Variant28250, - Variant28251, - Variant28252, - Variant28253, - Variant28254, - Variant28255, - Variant28256, - Variant28257, - Variant28258, - Variant28259, - Variant28260, - Variant28261, - Variant28262, - Variant28263, - Variant28264, - Variant28265, - Variant28266, - Variant28267, - Variant28268, - Variant28269, - Variant28270, - Variant28271, - Variant28272, - Variant28273, - Variant28274, - Variant28275, - Variant28276, - Variant28277, - Variant28278, - Variant28279, - Variant28280, - Variant28281, - Variant28282, - Variant28283, - Variant28284, - Variant28285, - Variant28286, - Variant28287, - Variant28288, - Variant28289, - Variant28290, - Variant28291, - Variant28292, - Variant28293, - Variant28294, - Variant28295, - Variant28296, - Variant28297, - Variant28298, - Variant28299, - Variant28300, - Variant28301, - Variant28302, - Variant28303, - Variant28304, - Variant28305, - Variant28306, - Variant28307, - Variant28308, - Variant28309, - Variant28310, - Variant28311, - Variant28312, - Variant28313, - Variant28314, - Variant28315, - Variant28316, - Variant28317, - Variant28318, - Variant28319, - Variant28320, - Variant28321, - Variant28322, - Variant28323, - Variant28324, - Variant28325, - Variant28326, - Variant28327, - Variant28328, - Variant28329, - Variant28330, - Variant28331, - Variant28332, - Variant28333, - Variant28334, - Variant28335, - Variant28336, - Variant28337, - Variant28338, - Variant28339, - Variant28340, - Variant28341, - Variant28342, - Variant28343, - Variant28344, - Variant28345, - Variant28346, - Variant28347, - Variant28348, - Variant28349, - Variant28350, - Variant28351, - Variant28352, - Variant28353, - Variant28354, - Variant28355, - Variant28356, - Variant28357, - Variant28358, - Variant28359, - Variant28360, - Variant28361, - Variant28362, - Variant28363, - Variant28364, - Variant28365, - Variant28366, - Variant28367, - Variant28368, - Variant28369, - Variant28370, - Variant28371, - Variant28372, - Variant28373, - Variant28374, - Variant28375, - Variant28376, - Variant28377, - Variant28378, - Variant28379, - Variant28380, - Variant28381, - Variant28382, - Variant28383, - Variant28384, - Variant28385, - Variant28386, - Variant28387, - Variant28388, - Variant28389, - Variant28390, - Variant28391, - Variant28392, - Variant28393, - Variant28394, - Variant28395, - Variant28396, - Variant28397, - Variant28398, - Variant28399, - Variant28400, - Variant28401, - Variant28402, - Variant28403, - Variant28404, - Variant28405, - Variant28406, - Variant28407, - Variant28408, - Variant28409, - Variant28410, - Variant28411, - Variant28412, - Variant28413, - Variant28414, - Variant28415, - Variant28416, - Variant28417, - Variant28418, - Variant28419, - Variant28420, - Variant28421, - Variant28422, - Variant28423, - Variant28424, - Variant28425, - Variant28426, - Variant28427, - Variant28428, - Variant28429, - Variant28430, - Variant28431, - Variant28432, - Variant28433, - Variant28434, - Variant28435, - Variant28436, - Variant28437, - Variant28438, - Variant28439, - Variant28440, - Variant28441, - Variant28442, - Variant28443, - Variant28444, - Variant28445, - Variant28446, - Variant28447, - Variant28448, - Variant28449, - Variant28450, - Variant28451, - Variant28452, - Variant28453, - Variant28454, - Variant28455, - Variant28456, - Variant28457, - Variant28458, - Variant28459, - Variant28460, - Variant28461, - Variant28462, - Variant28463, - Variant28464, - Variant28465, - Variant28466, - Variant28467, - Variant28468, - Variant28469, - Variant28470, - Variant28471, - Variant28472, - Variant28473, - Variant28474, - Variant28475, - Variant28476, - Variant28477, - Variant28478, - Variant28479, - Variant28480, - Variant28481, - Variant28482, - Variant28483, - Variant28484, - Variant28485, - Variant28486, - Variant28487, - Variant28488, - Variant28489, - Variant28490, - Variant28491, - Variant28492, - Variant28493, - Variant28494, - Variant28495, - Variant28496, - Variant28497, - Variant28498, - Variant28499, - Variant28500, - Variant28501, - Variant28502, - Variant28503, - Variant28504, - Variant28505, - Variant28506, - Variant28507, - Variant28508, - Variant28509, - Variant28510, - Variant28511, - Variant28512, - Variant28513, - Variant28514, - Variant28515, - Variant28516, - Variant28517, - Variant28518, - Variant28519, - Variant28520, - Variant28521, - Variant28522, - Variant28523, - Variant28524, - Variant28525, - Variant28526, - Variant28527, - Variant28528, - Variant28529, - Variant28530, - Variant28531, - Variant28532, - Variant28533, - Variant28534, - Variant28535, - Variant28536, - Variant28537, - Variant28538, - Variant28539, - Variant28540, - Variant28541, - Variant28542, - Variant28543, - Variant28544, - Variant28545, - Variant28546, - Variant28547, - Variant28548, - Variant28549, - Variant28550, - Variant28551, - Variant28552, - Variant28553, - Variant28554, - Variant28555, - Variant28556, - Variant28557, - Variant28558, - Variant28559, - Variant28560, - Variant28561, - Variant28562, - Variant28563, - Variant28564, - Variant28565, - Variant28566, - Variant28567, - Variant28568, - Variant28569, - Variant28570, - Variant28571, - Variant28572, - Variant28573, - Variant28574, - Variant28575, - Variant28576, - Variant28577, - Variant28578, - Variant28579, - Variant28580, - Variant28581, - Variant28582, - Variant28583, - Variant28584, - Variant28585, - Variant28586, - Variant28587, - Variant28588, - Variant28589, - Variant28590, - Variant28591, - Variant28592, - Variant28593, - Variant28594, - Variant28595, - Variant28596, - Variant28597, - Variant28598, - Variant28599, - Variant28600, - Variant28601, - Variant28602, - Variant28603, - Variant28604, - Variant28605, - Variant28606, - Variant28607, - Variant28608, - Variant28609, - Variant28610, - Variant28611, - Variant28612, - Variant28613, - Variant28614, - Variant28615, - Variant28616, - Variant28617, - Variant28618, - Variant28619, - Variant28620, - Variant28621, - Variant28622, - Variant28623, - Variant28624, - Variant28625, - Variant28626, - Variant28627, - Variant28628, - Variant28629, - Variant28630, - Variant28631, - Variant28632, - Variant28633, - Variant28634, - Variant28635, - Variant28636, - Variant28637, - Variant28638, - Variant28639, - Variant28640, - Variant28641, - Variant28642, - Variant28643, - Variant28644, - Variant28645, - Variant28646, - Variant28647, - Variant28648, - Variant28649, - Variant28650, - Variant28651, - Variant28652, - Variant28653, - Variant28654, - Variant28655, - Variant28656, - Variant28657, - Variant28658, - Variant28659, - Variant28660, - Variant28661, - Variant28662, - Variant28663, - Variant28664, - Variant28665, - Variant28666, - Variant28667, - Variant28668, - Variant28669, - Variant28670, - Variant28671, - Variant28672, - Variant28673, - Variant28674, - Variant28675, - Variant28676, - Variant28677, - Variant28678, - Variant28679, - Variant28680, - Variant28681, - Variant28682, - Variant28683, - Variant28684, - Variant28685, - Variant28686, - Variant28687, - Variant28688, - Variant28689, - Variant28690, - Variant28691, - Variant28692, - Variant28693, - Variant28694, - Variant28695, - Variant28696, - Variant28697, - Variant28698, - Variant28699, - Variant28700, - Variant28701, - Variant28702, - Variant28703, - Variant28704, - Variant28705, - Variant28706, - Variant28707, - Variant28708, - Variant28709, - Variant28710, - Variant28711, - Variant28712, - Variant28713, - Variant28714, - Variant28715, - Variant28716, - Variant28717, - Variant28718, - Variant28719, - Variant28720, - Variant28721, - Variant28722, - Variant28723, - Variant28724, - Variant28725, - Variant28726, - Variant28727, - Variant28728, - Variant28729, - Variant28730, - Variant28731, - Variant28732, - Variant28733, - Variant28734, - Variant28735, - Variant28736, - Variant28737, - Variant28738, - Variant28739, - Variant28740, - Variant28741, - Variant28742, - Variant28743, - Variant28744, - Variant28745, - Variant28746, - Variant28747, - Variant28748, - Variant28749, - Variant28750, - Variant28751, - Variant28752, - Variant28753, - Variant28754, - Variant28755, - Variant28756, - Variant28757, - Variant28758, - Variant28759, - Variant28760, - Variant28761, - Variant28762, - Variant28763, - Variant28764, - Variant28765, - Variant28766, - Variant28767, - Variant28768, - Variant28769, - Variant28770, - Variant28771, - Variant28772, - Variant28773, - Variant28774, - Variant28775, - Variant28776, - Variant28777, - Variant28778, - Variant28779, - Variant28780, - Variant28781, - Variant28782, - Variant28783, - Variant28784, - Variant28785, - Variant28786, - Variant28787, - Variant28788, - Variant28789, - Variant28790, - Variant28791, - Variant28792, - Variant28793, - Variant28794, - Variant28795, - Variant28796, - Variant28797, - Variant28798, - Variant28799, - Variant28800, - Variant28801, - Variant28802, - Variant28803, - Variant28804, - Variant28805, - Variant28806, - Variant28807, - Variant28808, - Variant28809, - Variant28810, - Variant28811, - Variant28812, - Variant28813, - Variant28814, - Variant28815, - Variant28816, - Variant28817, - Variant28818, - Variant28819, - Variant28820, - Variant28821, - Variant28822, - Variant28823, - Variant28824, - Variant28825, - Variant28826, - Variant28827, - Variant28828, - Variant28829, - Variant28830, - Variant28831, - Variant28832, - Variant28833, - Variant28834, - Variant28835, - Variant28836, - Variant28837, - Variant28838, - Variant28839, - Variant28840, - Variant28841, - Variant28842, - Variant28843, - Variant28844, - Variant28845, - Variant28846, - Variant28847, - Variant28848, - Variant28849, - Variant28850, - Variant28851, - Variant28852, - Variant28853, - Variant28854, - Variant28855, - Variant28856, - Variant28857, - Variant28858, - Variant28859, - Variant28860, - Variant28861, - Variant28862, - Variant28863, - Variant28864, - Variant28865, - Variant28866, - Variant28867, - Variant28868, - Variant28869, - Variant28870, - Variant28871, - Variant28872, - Variant28873, - Variant28874, - Variant28875, - Variant28876, - Variant28877, - Variant28878, - Variant28879, - Variant28880, - Variant28881, - Variant28882, - Variant28883, - Variant28884, - Variant28885, - Variant28886, - Variant28887, - Variant28888, - Variant28889, - Variant28890, - Variant28891, - Variant28892, - Variant28893, - Variant28894, - Variant28895, - Variant28896, - Variant28897, - Variant28898, - Variant28899, - Variant28900, - Variant28901, - Variant28902, - Variant28903, - Variant28904, - Variant28905, - Variant28906, - Variant28907, - Variant28908, - Variant28909, - Variant28910, - Variant28911, - Variant28912, - Variant28913, - Variant28914, - Variant28915, - Variant28916, - Variant28917, - Variant28918, - Variant28919, - Variant28920, - Variant28921, - Variant28922, - Variant28923, - Variant28924, - Variant28925, - Variant28926, - Variant28927, - Variant28928, - Variant28929, - Variant28930, - Variant28931, - Variant28932, - Variant28933, - Variant28934, - Variant28935, - Variant28936, - Variant28937, - Variant28938, - Variant28939, - Variant28940, - Variant28941, - Variant28942, - Variant28943, - Variant28944, - Variant28945, - Variant28946, - Variant28947, - Variant28948, - Variant28949, - Variant28950, - Variant28951, - Variant28952, - Variant28953, - Variant28954, - Variant28955, - Variant28956, - Variant28957, - Variant28958, - Variant28959, - Variant28960, - Variant28961, - Variant28962, - Variant28963, - Variant28964, - Variant28965, - Variant28966, - Variant28967, - Variant28968, - Variant28969, - Variant28970, - Variant28971, - Variant28972, - Variant28973, - Variant28974, - Variant28975, - Variant28976, - Variant28977, - Variant28978, - Variant28979, - Variant28980, - Variant28981, - Variant28982, - Variant28983, - Variant28984, - Variant28985, - Variant28986, - Variant28987, - Variant28988, - Variant28989, - Variant28990, - Variant28991, - Variant28992, - Variant28993, - Variant28994, - Variant28995, - Variant28996, - Variant28997, - Variant28998, - Variant28999, - Variant29000, - Variant29001, - Variant29002, - Variant29003, - Variant29004, - Variant29005, - Variant29006, - Variant29007, - Variant29008, - Variant29009, - Variant29010, - Variant29011, - Variant29012, - Variant29013, - Variant29014, - Variant29015, - Variant29016, - Variant29017, - Variant29018, - Variant29019, - Variant29020, - Variant29021, - Variant29022, - Variant29023, - Variant29024, - Variant29025, - Variant29026, - Variant29027, - Variant29028, - Variant29029, - Variant29030, - Variant29031, - Variant29032, - Variant29033, - Variant29034, - Variant29035, - Variant29036, - Variant29037, - Variant29038, - Variant29039, - Variant29040, - Variant29041, - Variant29042, - Variant29043, - Variant29044, - Variant29045, - Variant29046, - Variant29047, - Variant29048, - Variant29049, - Variant29050, - Variant29051, - Variant29052, - Variant29053, - Variant29054, - Variant29055, - Variant29056, - Variant29057, - Variant29058, - Variant29059, - Variant29060, - Variant29061, - Variant29062, - Variant29063, - Variant29064, - Variant29065, - Variant29066, - Variant29067, - Variant29068, - Variant29069, - Variant29070, - Variant29071, - Variant29072, - Variant29073, - Variant29074, - Variant29075, - Variant29076, - Variant29077, - Variant29078, - Variant29079, - Variant29080, - Variant29081, - Variant29082, - Variant29083, - Variant29084, - Variant29085, - Variant29086, - Variant29087, - Variant29088, - Variant29089, - Variant29090, - Variant29091, - Variant29092, - Variant29093, - Variant29094, - Variant29095, - Variant29096, - Variant29097, - Variant29098, - Variant29099, - Variant29100, - Variant29101, - Variant29102, - Variant29103, - Variant29104, - Variant29105, - Variant29106, - Variant29107, - Variant29108, - Variant29109, - Variant29110, - Variant29111, - Variant29112, - Variant29113, - Variant29114, - Variant29115, - Variant29116, - Variant29117, - Variant29118, - Variant29119, - Variant29120, - Variant29121, - Variant29122, - Variant29123, - Variant29124, - Variant29125, - Variant29126, - Variant29127, - Variant29128, - Variant29129, - Variant29130, - Variant29131, - Variant29132, - Variant29133, - Variant29134, - Variant29135, - Variant29136, - Variant29137, - Variant29138, - Variant29139, - Variant29140, - Variant29141, - Variant29142, - Variant29143, - Variant29144, - Variant29145, - Variant29146, - Variant29147, - Variant29148, - Variant29149, - Variant29150, - Variant29151, - Variant29152, - Variant29153, - Variant29154, - Variant29155, - Variant29156, - Variant29157, - Variant29158, - Variant29159, - Variant29160, - Variant29161, - Variant29162, - Variant29163, - Variant29164, - Variant29165, - Variant29166, - Variant29167, - Variant29168, - Variant29169, - Variant29170, - Variant29171, - Variant29172, - Variant29173, - Variant29174, - Variant29175, - Variant29176, - Variant29177, - Variant29178, - Variant29179, - Variant29180, - Variant29181, - Variant29182, - Variant29183, - Variant29184, - Variant29185, - Variant29186, - Variant29187, - Variant29188, - Variant29189, - Variant29190, - Variant29191, - Variant29192, - Variant29193, - Variant29194, - Variant29195, - Variant29196, - Variant29197, - Variant29198, - Variant29199, - Variant29200, - Variant29201, - Variant29202, - Variant29203, - Variant29204, - Variant29205, - Variant29206, - Variant29207, - Variant29208, - Variant29209, - Variant29210, - Variant29211, - Variant29212, - Variant29213, - Variant29214, - Variant29215, - Variant29216, - Variant29217, - Variant29218, - Variant29219, - Variant29220, - Variant29221, - Variant29222, - Variant29223, - Variant29224, - Variant29225, - Variant29226, - Variant29227, - Variant29228, - Variant29229, - Variant29230, - Variant29231, - Variant29232, - Variant29233, - Variant29234, - Variant29235, - Variant29236, - Variant29237, - Variant29238, - Variant29239, - Variant29240, - Variant29241, - Variant29242, - Variant29243, - Variant29244, - Variant29245, - Variant29246, - Variant29247, - Variant29248, - Variant29249, - Variant29250, - Variant29251, - Variant29252, - Variant29253, - Variant29254, - Variant29255, - Variant29256, - Variant29257, - Variant29258, - Variant29259, - Variant29260, - Variant29261, - Variant29262, - Variant29263, - Variant29264, - Variant29265, - Variant29266, - Variant29267, - Variant29268, - Variant29269, - Variant29270, - Variant29271, - Variant29272, - Variant29273, - Variant29274, - Variant29275, - Variant29276, - Variant29277, - Variant29278, - Variant29279, - Variant29280, - Variant29281, - Variant29282, - Variant29283, - Variant29284, - Variant29285, - Variant29286, - Variant29287, - Variant29288, - Variant29289, - Variant29290, - Variant29291, - Variant29292, - Variant29293, - Variant29294, - Variant29295, - Variant29296, - Variant29297, - Variant29298, - Variant29299, - Variant29300, - Variant29301, - Variant29302, - Variant29303, - Variant29304, - Variant29305, - Variant29306, - Variant29307, - Variant29308, - Variant29309, - Variant29310, - Variant29311, - Variant29312, - Variant29313, - Variant29314, - Variant29315, - Variant29316, - Variant29317, - Variant29318, - Variant29319, - Variant29320, - Variant29321, - Variant29322, - Variant29323, - Variant29324, - Variant29325, - Variant29326, - Variant29327, - Variant29328, - Variant29329, - Variant29330, - Variant29331, - Variant29332, - Variant29333, - Variant29334, - Variant29335, - Variant29336, - Variant29337, - Variant29338, - Variant29339, - Variant29340, - Variant29341, - Variant29342, - Variant29343, - Variant29344, - Variant29345, - Variant29346, - Variant29347, - Variant29348, - Variant29349, - Variant29350, - Variant29351, - Variant29352, - Variant29353, - Variant29354, - Variant29355, - Variant29356, - Variant29357, - Variant29358, - Variant29359, - Variant29360, - Variant29361, - Variant29362, - Variant29363, - Variant29364, - Variant29365, - Variant29366, - Variant29367, - Variant29368, - Variant29369, - Variant29370, - Variant29371, - Variant29372, - Variant29373, - Variant29374, - Variant29375, - Variant29376, - Variant29377, - Variant29378, - Variant29379, - Variant29380, - Variant29381, - Variant29382, - Variant29383, - Variant29384, - Variant29385, - Variant29386, - Variant29387, - Variant29388, - Variant29389, - Variant29390, - Variant29391, - Variant29392, - Variant29393, - Variant29394, - Variant29395, - Variant29396, - Variant29397, - Variant29398, - Variant29399, - Variant29400, - Variant29401, - Variant29402, - Variant29403, - Variant29404, - Variant29405, - Variant29406, - Variant29407, - Variant29408, - Variant29409, - Variant29410, - Variant29411, - Variant29412, - Variant29413, - Variant29414, - Variant29415, - Variant29416, - Variant29417, - Variant29418, - Variant29419, - Variant29420, - Variant29421, - Variant29422, - Variant29423, - Variant29424, - Variant29425, - Variant29426, - Variant29427, - Variant29428, - Variant29429, - Variant29430, - Variant29431, - Variant29432, - Variant29433, - Variant29434, - Variant29435, - Variant29436, - Variant29437, - Variant29438, - Variant29439, - Variant29440, - Variant29441, - Variant29442, - Variant29443, - Variant29444, - Variant29445, - Variant29446, - Variant29447, - Variant29448, - Variant29449, - Variant29450, - Variant29451, - Variant29452, - Variant29453, - Variant29454, - Variant29455, - Variant29456, - Variant29457, - Variant29458, - Variant29459, - Variant29460, - Variant29461, - Variant29462, - Variant29463, - Variant29464, - Variant29465, - Variant29466, - Variant29467, - Variant29468, - Variant29469, - Variant29470, - Variant29471, - Variant29472, - Variant29473, - Variant29474, - Variant29475, - Variant29476, - Variant29477, - Variant29478, - Variant29479, - Variant29480, - Variant29481, - Variant29482, - Variant29483, - Variant29484, - Variant29485, - Variant29486, - Variant29487, - Variant29488, - Variant29489, - Variant29490, - Variant29491, - Variant29492, - Variant29493, - Variant29494, - Variant29495, - Variant29496, - Variant29497, - Variant29498, - Variant29499, - Variant29500, - Variant29501, - Variant29502, - Variant29503, - Variant29504, - Variant29505, - Variant29506, - Variant29507, - Variant29508, - Variant29509, - Variant29510, - Variant29511, - Variant29512, - Variant29513, - Variant29514, - Variant29515, - Variant29516, - Variant29517, - Variant29518, - Variant29519, - Variant29520, - Variant29521, - Variant29522, - Variant29523, - Variant29524, - Variant29525, - Variant29526, - Variant29527, - Variant29528, - Variant29529, - Variant29530, - Variant29531, - Variant29532, - Variant29533, - Variant29534, - Variant29535, - Variant29536, - Variant29537, - Variant29538, - Variant29539, - Variant29540, - Variant29541, - Variant29542, - Variant29543, - Variant29544, - Variant29545, - Variant29546, - Variant29547, - Variant29548, - Variant29549, - Variant29550, - Variant29551, - Variant29552, - Variant29553, - Variant29554, - Variant29555, - Variant29556, - Variant29557, - Variant29558, - Variant29559, - Variant29560, - Variant29561, - Variant29562, - Variant29563, - Variant29564, - Variant29565, - Variant29566, - Variant29567, - Variant29568, - Variant29569, - Variant29570, - Variant29571, - Variant29572, - Variant29573, - Variant29574, - Variant29575, - Variant29576, - Variant29577, - Variant29578, - Variant29579, - Variant29580, - Variant29581, - Variant29582, - Variant29583, - Variant29584, - Variant29585, - Variant29586, - Variant29587, - Variant29588, - Variant29589, - Variant29590, - Variant29591, - Variant29592, - Variant29593, - Variant29594, - Variant29595, - Variant29596, - Variant29597, - Variant29598, - Variant29599, - Variant29600, - Variant29601, - Variant29602, - Variant29603, - Variant29604, - Variant29605, - Variant29606, - Variant29607, - Variant29608, - Variant29609, - Variant29610, - Variant29611, - Variant29612, - Variant29613, - Variant29614, - Variant29615, - Variant29616, - Variant29617, - Variant29618, - Variant29619, - Variant29620, - Variant29621, - Variant29622, - Variant29623, - Variant29624, - Variant29625, - Variant29626, - Variant29627, - Variant29628, - Variant29629, - Variant29630, - Variant29631, - Variant29632, - Variant29633, - Variant29634, - Variant29635, - Variant29636, - Variant29637, - Variant29638, - Variant29639, - Variant29640, - Variant29641, - Variant29642, - Variant29643, - Variant29644, - Variant29645, - Variant29646, - Variant29647, - Variant29648, - Variant29649, - Variant29650, - Variant29651, - Variant29652, - Variant29653, - Variant29654, - Variant29655, - Variant29656, - Variant29657, - Variant29658, - Variant29659, - Variant29660, - Variant29661, - Variant29662, - Variant29663, - Variant29664, - Variant29665, - Variant29666, - Variant29667, - Variant29668, - Variant29669, - Variant29670, - Variant29671, - Variant29672, - Variant29673, - Variant29674, - Variant29675, - Variant29676, - Variant29677, - Variant29678, - Variant29679, - Variant29680, - Variant29681, - Variant29682, - Variant29683, - Variant29684, - Variant29685, - Variant29686, - Variant29687, - Variant29688, - Variant29689, - Variant29690, - Variant29691, - Variant29692, - Variant29693, - Variant29694, - Variant29695, - Variant29696, - Variant29697, - Variant29698, - Variant29699, - Variant29700, - Variant29701, - Variant29702, - Variant29703, - Variant29704, - Variant29705, - Variant29706, - Variant29707, - Variant29708, - Variant29709, - Variant29710, - Variant29711, - Variant29712, - Variant29713, - Variant29714, - Variant29715, - Variant29716, - Variant29717, - Variant29718, - Variant29719, - Variant29720, - Variant29721, - Variant29722, - Variant29723, - Variant29724, - Variant29725, - Variant29726, - Variant29727, - Variant29728, - Variant29729, - Variant29730, - Variant29731, - Variant29732, - Variant29733, - Variant29734, - Variant29735, - Variant29736, - Variant29737, - Variant29738, - Variant29739, - Variant29740, - Variant29741, - Variant29742, - Variant29743, - Variant29744, - Variant29745, - Variant29746, - Variant29747, - Variant29748, - Variant29749, - Variant29750, - Variant29751, - Variant29752, - Variant29753, - Variant29754, - Variant29755, - Variant29756, - Variant29757, - Variant29758, - Variant29759, - Variant29760, - Variant29761, - Variant29762, - Variant29763, - Variant29764, - Variant29765, - Variant29766, - Variant29767, - Variant29768, - Variant29769, - Variant29770, - Variant29771, - Variant29772, - Variant29773, - Variant29774, - Variant29775, - Variant29776, - Variant29777, - Variant29778, - Variant29779, - Variant29780, - Variant29781, - Variant29782, - Variant29783, - Variant29784, - Variant29785, - Variant29786, - Variant29787, - Variant29788, - Variant29789, - Variant29790, - Variant29791, - Variant29792, - Variant29793, - Variant29794, - Variant29795, - Variant29796, - Variant29797, - Variant29798, - Variant29799, - Variant29800, - Variant29801, - Variant29802, - Variant29803, - Variant29804, - Variant29805, - Variant29806, - Variant29807, - Variant29808, - Variant29809, - Variant29810, - Variant29811, - Variant29812, - Variant29813, - Variant29814, - Variant29815, - Variant29816, - Variant29817, - Variant29818, - Variant29819, - Variant29820, - Variant29821, - Variant29822, - Variant29823, - Variant29824, - Variant29825, - Variant29826, - Variant29827, - Variant29828, - Variant29829, - Variant29830, - Variant29831, - Variant29832, - Variant29833, - Variant29834, - Variant29835, - Variant29836, - Variant29837, - Variant29838, - Variant29839, - Variant29840, - Variant29841, - Variant29842, - Variant29843, - Variant29844, - Variant29845, - Variant29846, - Variant29847, - Variant29848, - Variant29849, - Variant29850, - Variant29851, - Variant29852, - Variant29853, - Variant29854, - Variant29855, - Variant29856, - Variant29857, - Variant29858, - Variant29859, - Variant29860, - Variant29861, - Variant29862, - Variant29863, - Variant29864, - Variant29865, - Variant29866, - Variant29867, - Variant29868, - Variant29869, - Variant29870, - Variant29871, - Variant29872, - Variant29873, - Variant29874, - Variant29875, - Variant29876, - Variant29877, - Variant29878, - Variant29879, - Variant29880, - Variant29881, - Variant29882, - Variant29883, - Variant29884, - Variant29885, - Variant29886, - Variant29887, - Variant29888, - Variant29889, - Variant29890, - Variant29891, - Variant29892, - Variant29893, - Variant29894, - Variant29895, - Variant29896, - Variant29897, - Variant29898, - Variant29899, - Variant29900, - Variant29901, - Variant29902, - Variant29903, - Variant29904, - Variant29905, - Variant29906, - Variant29907, - Variant29908, - Variant29909, - Variant29910, - Variant29911, - Variant29912, - Variant29913, - Variant29914, - Variant29915, - Variant29916, - Variant29917, - Variant29918, - Variant29919, - Variant29920, - Variant29921, - Variant29922, - Variant29923, - Variant29924, - Variant29925, - Variant29926, - Variant29927, - Variant29928, - Variant29929, - Variant29930, - Variant29931, - Variant29932, - Variant29933, - Variant29934, - Variant29935, - Variant29936, - Variant29937, - Variant29938, - Variant29939, - Variant29940, - Variant29941, - Variant29942, - Variant29943, - Variant29944, - Variant29945, - Variant29946, - Variant29947, - Variant29948, - Variant29949, - Variant29950, - Variant29951, - Variant29952, - Variant29953, - Variant29954, - Variant29955, - Variant29956, - Variant29957, - Variant29958, - Variant29959, - Variant29960, - Variant29961, - Variant29962, - Variant29963, - Variant29964, - Variant29965, - Variant29966, - Variant29967, - Variant29968, - Variant29969, - Variant29970, - Variant29971, - Variant29972, - Variant29973, - Variant29974, - Variant29975, - Variant29976, - Variant29977, - Variant29978, - Variant29979, - Variant29980, - Variant29981, - Variant29982, - Variant29983, - Variant29984, - Variant29985, - Variant29986, - Variant29987, - Variant29988, - Variant29989, - Variant29990, - Variant29991, - Variant29992, - Variant29993, - Variant29994, - Variant29995, - Variant29996, - Variant29997, - Variant29998, - Variant29999, - Variant30000, - Variant30001, - Variant30002, - Variant30003, - Variant30004, - Variant30005, - Variant30006, - Variant30007, - Variant30008, - Variant30009, - Variant30010, - Variant30011, - Variant30012, - Variant30013, - Variant30014, - Variant30015, - Variant30016, - Variant30017, - Variant30018, - Variant30019, - Variant30020, - Variant30021, - Variant30022, - Variant30023, - Variant30024, - Variant30025, - Variant30026, - Variant30027, - Variant30028, - Variant30029, - Variant30030, - Variant30031, - Variant30032, - Variant30033, - Variant30034, - Variant30035, - Variant30036, - Variant30037, - Variant30038, - Variant30039, - Variant30040, - Variant30041, - Variant30042, - Variant30043, - Variant30044, - Variant30045, - Variant30046, - Variant30047, - Variant30048, - Variant30049, - Variant30050, - Variant30051, - Variant30052, - Variant30053, - Variant30054, - Variant30055, - Variant30056, - Variant30057, - Variant30058, - Variant30059, - Variant30060, - Variant30061, - Variant30062, - Variant30063, - Variant30064, - Variant30065, - Variant30066, - Variant30067, - Variant30068, - Variant30069, - Variant30070, - Variant30071, - Variant30072, - Variant30073, - Variant30074, - Variant30075, - Variant30076, - Variant30077, - Variant30078, - Variant30079, - Variant30080, - Variant30081, - Variant30082, - Variant30083, - Variant30084, - Variant30085, - Variant30086, - Variant30087, - Variant30088, - Variant30089, - Variant30090, - Variant30091, - Variant30092, - Variant30093, - Variant30094, - Variant30095, - Variant30096, - Variant30097, - Variant30098, - Variant30099, - Variant30100, - Variant30101, - Variant30102, - Variant30103, - Variant30104, - Variant30105, - Variant30106, - Variant30107, - Variant30108, - Variant30109, - Variant30110, - Variant30111, - Variant30112, - Variant30113, - Variant30114, - Variant30115, - Variant30116, - Variant30117, - Variant30118, - Variant30119, - Variant30120, - Variant30121, - Variant30122, - Variant30123, - Variant30124, - Variant30125, - Variant30126, - Variant30127, - Variant30128, - Variant30129, - Variant30130, - Variant30131, - Variant30132, - Variant30133, - Variant30134, - Variant30135, - Variant30136, - Variant30137, - Variant30138, - Variant30139, - Variant30140, - Variant30141, - Variant30142, - Variant30143, - Variant30144, - Variant30145, - Variant30146, - Variant30147, - Variant30148, - Variant30149, - Variant30150, - Variant30151, - Variant30152, - Variant30153, - Variant30154, - Variant30155, - Variant30156, - Variant30157, - Variant30158, - Variant30159, - Variant30160, - Variant30161, - Variant30162, - Variant30163, - Variant30164, - Variant30165, - Variant30166, - Variant30167, - Variant30168, - Variant30169, - Variant30170, - Variant30171, - Variant30172, - Variant30173, - Variant30174, - Variant30175, - Variant30176, - Variant30177, - Variant30178, - Variant30179, - Variant30180, - Variant30181, - Variant30182, - Variant30183, - Variant30184, - Variant30185, - Variant30186, - Variant30187, - Variant30188, - Variant30189, - Variant30190, - Variant30191, - Variant30192, - Variant30193, - Variant30194, - Variant30195, - Variant30196, - Variant30197, - Variant30198, - Variant30199, - Variant30200, - Variant30201, - Variant30202, - Variant30203, - Variant30204, - Variant30205, - Variant30206, - Variant30207, - Variant30208, - Variant30209, - Variant30210, - Variant30211, - Variant30212, - Variant30213, - Variant30214, - Variant30215, - Variant30216, - Variant30217, - Variant30218, - Variant30219, - Variant30220, - Variant30221, - Variant30222, - Variant30223, - Variant30224, - Variant30225, - Variant30226, - Variant30227, - Variant30228, - Variant30229, - Variant30230, - Variant30231, - Variant30232, - Variant30233, - Variant30234, - Variant30235, - Variant30236, - Variant30237, - Variant30238, - Variant30239, - Variant30240, - Variant30241, - Variant30242, - Variant30243, - Variant30244, - Variant30245, - Variant30246, - Variant30247, - Variant30248, - Variant30249, - Variant30250, - Variant30251, - Variant30252, - Variant30253, - Variant30254, - Variant30255, - Variant30256, - Variant30257, - Variant30258, - Variant30259, - Variant30260, - Variant30261, - Variant30262, - Variant30263, - Variant30264, - Variant30265, - Variant30266, - Variant30267, - Variant30268, - Variant30269, - Variant30270, - Variant30271, - Variant30272, - Variant30273, - Variant30274, - Variant30275, - Variant30276, - Variant30277, - Variant30278, - Variant30279, - Variant30280, - Variant30281, - Variant30282, - Variant30283, - Variant30284, - Variant30285, - Variant30286, - Variant30287, - Variant30288, - Variant30289, - Variant30290, - Variant30291, - Variant30292, - Variant30293, - Variant30294, - Variant30295, - Variant30296, - Variant30297, - Variant30298, - Variant30299, - Variant30300, - Variant30301, - Variant30302, - Variant30303, - Variant30304, - Variant30305, - Variant30306, - Variant30307, - Variant30308, - Variant30309, - Variant30310, - Variant30311, - Variant30312, - Variant30313, - Variant30314, - Variant30315, - Variant30316, - Variant30317, - Variant30318, - Variant30319, - Variant30320, - Variant30321, - Variant30322, - Variant30323, - Variant30324, - Variant30325, - Variant30326, - Variant30327, - Variant30328, - Variant30329, - Variant30330, - Variant30331, - Variant30332, - Variant30333, - Variant30334, - Variant30335, - Variant30336, - Variant30337, - Variant30338, - Variant30339, - Variant30340, - Variant30341, - Variant30342, - Variant30343, - Variant30344, - Variant30345, - Variant30346, - Variant30347, - Variant30348, - Variant30349, - Variant30350, - Variant30351, - Variant30352, - Variant30353, - Variant30354, - Variant30355, - Variant30356, - Variant30357, - Variant30358, - Variant30359, - Variant30360, - Variant30361, - Variant30362, - Variant30363, - Variant30364, - Variant30365, - Variant30366, - Variant30367, - Variant30368, - Variant30369, - Variant30370, - Variant30371, - Variant30372, - Variant30373, - Variant30374, - Variant30375, - Variant30376, - Variant30377, - Variant30378, - Variant30379, - Variant30380, - Variant30381, - Variant30382, - Variant30383, - Variant30384, - Variant30385, - Variant30386, - Variant30387, - Variant30388, - Variant30389, - Variant30390, - Variant30391, - Variant30392, - Variant30393, - Variant30394, - Variant30395, - Variant30396, - Variant30397, - Variant30398, - Variant30399, - Variant30400, - Variant30401, - Variant30402, - Variant30403, - Variant30404, - Variant30405, - Variant30406, - Variant30407, - Variant30408, - Variant30409, - Variant30410, - Variant30411, - Variant30412, - Variant30413, - Variant30414, - Variant30415, - Variant30416, - Variant30417, - Variant30418, - Variant30419, - Variant30420, - Variant30421, - Variant30422, - Variant30423, - Variant30424, - Variant30425, - Variant30426, - Variant30427, - Variant30428, - Variant30429, - Variant30430, - Variant30431, - Variant30432, - Variant30433, - Variant30434, - Variant30435, - Variant30436, - Variant30437, - Variant30438, - Variant30439, - Variant30440, - Variant30441, - Variant30442, - Variant30443, - Variant30444, - Variant30445, - Variant30446, - Variant30447, - Variant30448, - Variant30449, - Variant30450, - Variant30451, - Variant30452, - Variant30453, - Variant30454, - Variant30455, - Variant30456, - Variant30457, - Variant30458, - Variant30459, - Variant30460, - Variant30461, - Variant30462, - Variant30463, - Variant30464, - Variant30465, - Variant30466, - Variant30467, - Variant30468, - Variant30469, - Variant30470, - Variant30471, - Variant30472, - Variant30473, - Variant30474, - Variant30475, - Variant30476, - Variant30477, - Variant30478, - Variant30479, - Variant30480, - Variant30481, - Variant30482, - Variant30483, - Variant30484, - Variant30485, - Variant30486, - Variant30487, - Variant30488, - Variant30489, - Variant30490, - Variant30491, - Variant30492, - Variant30493, - Variant30494, - Variant30495, - Variant30496, - Variant30497, - Variant30498, - Variant30499, - Variant30500, - Variant30501, - Variant30502, - Variant30503, - Variant30504, - Variant30505, - Variant30506, - Variant30507, - Variant30508, - Variant30509, - Variant30510, - Variant30511, - Variant30512, - Variant30513, - Variant30514, - Variant30515, - Variant30516, - Variant30517, - Variant30518, - Variant30519, - Variant30520, - Variant30521, - Variant30522, - Variant30523, - Variant30524, - Variant30525, - Variant30526, - Variant30527, - Variant30528, - Variant30529, - Variant30530, - Variant30531, - Variant30532, - Variant30533, - Variant30534, - Variant30535, - Variant30536, - Variant30537, - Variant30538, - Variant30539, - Variant30540, - Variant30541, - Variant30542, - Variant30543, - Variant30544, - Variant30545, - Variant30546, - Variant30547, - Variant30548, - Variant30549, - Variant30550, - Variant30551, - Variant30552, - Variant30553, - Variant30554, - Variant30555, - Variant30556, - Variant30557, - Variant30558, - Variant30559, - Variant30560, - Variant30561, - Variant30562, - Variant30563, - Variant30564, - Variant30565, - Variant30566, - Variant30567, - Variant30568, - Variant30569, - Variant30570, - Variant30571, - Variant30572, - Variant30573, - Variant30574, - Variant30575, - Variant30576, - Variant30577, - Variant30578, - Variant30579, - Variant30580, - Variant30581, - Variant30582, - Variant30583, - Variant30584, - Variant30585, - Variant30586, - Variant30587, - Variant30588, - Variant30589, - Variant30590, - Variant30591, - Variant30592, - Variant30593, - Variant30594, - Variant30595, - Variant30596, - Variant30597, - Variant30598, - Variant30599, - Variant30600, - Variant30601, - Variant30602, - Variant30603, - Variant30604, - Variant30605, - Variant30606, - Variant30607, - Variant30608, - Variant30609, - Variant30610, - Variant30611, - Variant30612, - Variant30613, - Variant30614, - Variant30615, - Variant30616, - Variant30617, - Variant30618, - Variant30619, - Variant30620, - Variant30621, - Variant30622, - Variant30623, - Variant30624, - Variant30625, - Variant30626, - Variant30627, - Variant30628, - Variant30629, - Variant30630, - Variant30631, - Variant30632, - Variant30633, - Variant30634, - Variant30635, - Variant30636, - Variant30637, - Variant30638, - Variant30639, - Variant30640, - Variant30641, - Variant30642, - Variant30643, - Variant30644, - Variant30645, - Variant30646, - Variant30647, - Variant30648, - Variant30649, - Variant30650, - Variant30651, - Variant30652, - Variant30653, - Variant30654, - Variant30655, - Variant30656, - Variant30657, - Variant30658, - Variant30659, - Variant30660, - Variant30661, - Variant30662, - Variant30663, - Variant30664, - Variant30665, - Variant30666, - Variant30667, - Variant30668, - Variant30669, - Variant30670, - Variant30671, - Variant30672, - Variant30673, - Variant30674, - Variant30675, - Variant30676, - Variant30677, - Variant30678, - Variant30679, - Variant30680, - Variant30681, - Variant30682, - Variant30683, - Variant30684, - Variant30685, - Variant30686, - Variant30687, - Variant30688, - Variant30689, - Variant30690, - Variant30691, - Variant30692, - Variant30693, - Variant30694, - Variant30695, - Variant30696, - Variant30697, - Variant30698, - Variant30699, - Variant30700, - Variant30701, - Variant30702, - Variant30703, - Variant30704, - Variant30705, - Variant30706, - Variant30707, - Variant30708, - Variant30709, - Variant30710, - Variant30711, - Variant30712, - Variant30713, - Variant30714, - Variant30715, - Variant30716, - Variant30717, - Variant30718, - Variant30719, - Variant30720, - Variant30721, - Variant30722, - Variant30723, - Variant30724, - Variant30725, - Variant30726, - Variant30727, - Variant30728, - Variant30729, - Variant30730, - Variant30731, - Variant30732, - Variant30733, - Variant30734, - Variant30735, - Variant30736, - Variant30737, - Variant30738, - Variant30739, - Variant30740, - Variant30741, - Variant30742, - Variant30743, - Variant30744, - Variant30745, - Variant30746, - Variant30747, - Variant30748, - Variant30749, - Variant30750, - Variant30751, - Variant30752, - Variant30753, - Variant30754, - Variant30755, - Variant30756, - Variant30757, - Variant30758, - Variant30759, - Variant30760, - Variant30761, - Variant30762, - Variant30763, - Variant30764, - Variant30765, - Variant30766, - Variant30767, - Variant30768, - Variant30769, - Variant30770, - Variant30771, - Variant30772, - Variant30773, - Variant30774, - Variant30775, - Variant30776, - Variant30777, - Variant30778, - Variant30779, - Variant30780, - Variant30781, - Variant30782, - Variant30783, - Variant30784, - Variant30785, - Variant30786, - Variant30787, - Variant30788, - Variant30789, - Variant30790, - Variant30791, - Variant30792, - Variant30793, - Variant30794, - Variant30795, - Variant30796, - Variant30797, - Variant30798, - Variant30799, - Variant30800, - Variant30801, - Variant30802, - Variant30803, - Variant30804, - Variant30805, - Variant30806, - Variant30807, - Variant30808, - Variant30809, - Variant30810, - Variant30811, - Variant30812, - Variant30813, - Variant30814, - Variant30815, - Variant30816, - Variant30817, - Variant30818, - Variant30819, - Variant30820, - Variant30821, - Variant30822, - Variant30823, - Variant30824, - Variant30825, - Variant30826, - Variant30827, - Variant30828, - Variant30829, - Variant30830, - Variant30831, - Variant30832, - Variant30833, - Variant30834, - Variant30835, - Variant30836, - Variant30837, - Variant30838, - Variant30839, - Variant30840, - Variant30841, - Variant30842, - Variant30843, - Variant30844, - Variant30845, - Variant30846, - Variant30847, - Variant30848, - Variant30849, - Variant30850, - Variant30851, - Variant30852, - Variant30853, - Variant30854, - Variant30855, - Variant30856, - Variant30857, - Variant30858, - Variant30859, - Variant30860, - Variant30861, - Variant30862, - Variant30863, - Variant30864, - Variant30865, - Variant30866, - Variant30867, - Variant30868, - Variant30869, - Variant30870, - Variant30871, - Variant30872, - Variant30873, - Variant30874, - Variant30875, - Variant30876, - Variant30877, - Variant30878, - Variant30879, - Variant30880, - Variant30881, - Variant30882, - Variant30883, - Variant30884, - Variant30885, - Variant30886, - Variant30887, - Variant30888, - Variant30889, - Variant30890, - Variant30891, - Variant30892, - Variant30893, - Variant30894, - Variant30895, - Variant30896, - Variant30897, - Variant30898, - Variant30899, - Variant30900, - Variant30901, - Variant30902, - Variant30903, - Variant30904, - Variant30905, - Variant30906, - Variant30907, - Variant30908, - Variant30909, - Variant30910, - Variant30911, - Variant30912, - Variant30913, - Variant30914, - Variant30915, - Variant30916, - Variant30917, - Variant30918, - Variant30919, - Variant30920, - Variant30921, - Variant30922, - Variant30923, - Variant30924, - Variant30925, - Variant30926, - Variant30927, - Variant30928, - Variant30929, - Variant30930, - Variant30931, - Variant30932, - Variant30933, - Variant30934, - Variant30935, - Variant30936, - Variant30937, - Variant30938, - Variant30939, - Variant30940, - Variant30941, - Variant30942, - Variant30943, - Variant30944, - Variant30945, - Variant30946, - Variant30947, - Variant30948, - Variant30949, - Variant30950, - Variant30951, - Variant30952, - Variant30953, - Variant30954, - Variant30955, - Variant30956, - Variant30957, - Variant30958, - Variant30959, - Variant30960, - Variant30961, - Variant30962, - Variant30963, - Variant30964, - Variant30965, - Variant30966, - Variant30967, - Variant30968, - Variant30969, - Variant30970, - Variant30971, - Variant30972, - Variant30973, - Variant30974, - Variant30975, - Variant30976, - Variant30977, - Variant30978, - Variant30979, - Variant30980, - Variant30981, - Variant30982, - Variant30983, - Variant30984, - Variant30985, - Variant30986, - Variant30987, - Variant30988, - Variant30989, - Variant30990, - Variant30991, - Variant30992, - Variant30993, - Variant30994, - Variant30995, - Variant30996, - Variant30997, - Variant30998, - Variant30999, - Variant31000, - Variant31001, - Variant31002, - Variant31003, - Variant31004, - Variant31005, - Variant31006, - Variant31007, - Variant31008, - Variant31009, - Variant31010, - Variant31011, - Variant31012, - Variant31013, - Variant31014, - Variant31015, - Variant31016, - Variant31017, - Variant31018, - Variant31019, - Variant31020, - Variant31021, - Variant31022, - Variant31023, - Variant31024, - Variant31025, - Variant31026, - Variant31027, - Variant31028, - Variant31029, - Variant31030, - Variant31031, - Variant31032, - Variant31033, - Variant31034, - Variant31035, - Variant31036, - Variant31037, - Variant31038, - Variant31039, - Variant31040, - Variant31041, - Variant31042, - Variant31043, - Variant31044, - Variant31045, - Variant31046, - Variant31047, - Variant31048, - Variant31049, - Variant31050, - Variant31051, - Variant31052, - Variant31053, - Variant31054, - Variant31055, - Variant31056, - Variant31057, - Variant31058, - Variant31059, - Variant31060, - Variant31061, - Variant31062, - Variant31063, - Variant31064, - Variant31065, - Variant31066, - Variant31067, - Variant31068, - Variant31069, - Variant31070, - Variant31071, - Variant31072, - Variant31073, - Variant31074, - Variant31075, - Variant31076, - Variant31077, - Variant31078, - Variant31079, - Variant31080, - Variant31081, - Variant31082, - Variant31083, - Variant31084, - Variant31085, - Variant31086, - Variant31087, - Variant31088, - Variant31089, - Variant31090, - Variant31091, - Variant31092, - Variant31093, - Variant31094, - Variant31095, - Variant31096, - Variant31097, - Variant31098, - Variant31099, - Variant31100, - Variant31101, - Variant31102, - Variant31103, - Variant31104, - Variant31105, - Variant31106, - Variant31107, - Variant31108, - Variant31109, - Variant31110, - Variant31111, - Variant31112, - Variant31113, - Variant31114, - Variant31115, - Variant31116, - Variant31117, - Variant31118, - Variant31119, - Variant31120, - Variant31121, - Variant31122, - Variant31123, - Variant31124, - Variant31125, - Variant31126, - Variant31127, - Variant31128, - Variant31129, - Variant31130, - Variant31131, - Variant31132, - Variant31133, - Variant31134, - Variant31135, - Variant31136, - Variant31137, - Variant31138, - Variant31139, - Variant31140, - Variant31141, - Variant31142, - Variant31143, - Variant31144, - Variant31145, - Variant31146, - Variant31147, - Variant31148, - Variant31149, - Variant31150, - Variant31151, - Variant31152, - Variant31153, - Variant31154, - Variant31155, - Variant31156, - Variant31157, - Variant31158, - Variant31159, - Variant31160, - Variant31161, - Variant31162, - Variant31163, - Variant31164, - Variant31165, - Variant31166, - Variant31167, - Variant31168, - Variant31169, - Variant31170, - Variant31171, - Variant31172, - Variant31173, - Variant31174, - Variant31175, - Variant31176, - Variant31177, - Variant31178, - Variant31179, - Variant31180, - Variant31181, - Variant31182, - Variant31183, - Variant31184, - Variant31185, - Variant31186, - Variant31187, - Variant31188, - Variant31189, - Variant31190, - Variant31191, - Variant31192, - Variant31193, - Variant31194, - Variant31195, - Variant31196, - Variant31197, - Variant31198, - Variant31199, - Variant31200, - Variant31201, - Variant31202, - Variant31203, - Variant31204, - Variant31205, - Variant31206, - Variant31207, - Variant31208, - Variant31209, - Variant31210, - Variant31211, - Variant31212, - Variant31213, - Variant31214, - Variant31215, - Variant31216, - Variant31217, - Variant31218, - Variant31219, - Variant31220, - Variant31221, - Variant31222, - Variant31223, - Variant31224, - Variant31225, - Variant31226, - Variant31227, - Variant31228, - Variant31229, - Variant31230, - Variant31231, - Variant31232, - Variant31233, - Variant31234, - Variant31235, - Variant31236, - Variant31237, - Variant31238, - Variant31239, - Variant31240, - Variant31241, - Variant31242, - Variant31243, - Variant31244, - Variant31245, - Variant31246, - Variant31247, - Variant31248, - Variant31249, - Variant31250, - Variant31251, - Variant31252, - Variant31253, - Variant31254, - Variant31255, - Variant31256, - Variant31257, - Variant31258, - Variant31259, - Variant31260, - Variant31261, - Variant31262, - Variant31263, - Variant31264, - Variant31265, - Variant31266, - Variant31267, - Variant31268, - Variant31269, - Variant31270, - Variant31271, - Variant31272, - Variant31273, - Variant31274, - Variant31275, - Variant31276, - Variant31277, - Variant31278, - Variant31279, - Variant31280, - Variant31281, - Variant31282, - Variant31283, - Variant31284, - Variant31285, - Variant31286, - Variant31287, - Variant31288, - Variant31289, - Variant31290, - Variant31291, - Variant31292, - Variant31293, - Variant31294, - Variant31295, - Variant31296, - Variant31297, - Variant31298, - Variant31299, - Variant31300, - Variant31301, - Variant31302, - Variant31303, - Variant31304, - Variant31305, - Variant31306, - Variant31307, - Variant31308, - Variant31309, - Variant31310, - Variant31311, - Variant31312, - Variant31313, - Variant31314, - Variant31315, - Variant31316, - Variant31317, - Variant31318, - Variant31319, - Variant31320, - Variant31321, - Variant31322, - Variant31323, - Variant31324, - Variant31325, - Variant31326, - Variant31327, - Variant31328, - Variant31329, - Variant31330, - Variant31331, - Variant31332, - Variant31333, - Variant31334, - Variant31335, - Variant31336, - Variant31337, - Variant31338, - Variant31339, - Variant31340, - Variant31341, - Variant31342, - Variant31343, - Variant31344, - Variant31345, - Variant31346, - Variant31347, - Variant31348, - Variant31349, - Variant31350, - Variant31351, - Variant31352, - Variant31353, - Variant31354, - Variant31355, - Variant31356, - Variant31357, - Variant31358, - Variant31359, - Variant31360, - Variant31361, - Variant31362, - Variant31363, - Variant31364, - Variant31365, - Variant31366, - Variant31367, - Variant31368, - Variant31369, - Variant31370, - Variant31371, - Variant31372, - Variant31373, - Variant31374, - Variant31375, - Variant31376, - Variant31377, - Variant31378, - Variant31379, - Variant31380, - Variant31381, - Variant31382, - Variant31383, - Variant31384, - Variant31385, - Variant31386, - Variant31387, - Variant31388, - Variant31389, - Variant31390, - Variant31391, - Variant31392, - Variant31393, - Variant31394, - Variant31395, - Variant31396, - Variant31397, - Variant31398, - Variant31399, - Variant31400, - Variant31401, - Variant31402, - Variant31403, - Variant31404, - Variant31405, - Variant31406, - Variant31407, - Variant31408, - Variant31409, - Variant31410, - Variant31411, - Variant31412, - Variant31413, - Variant31414, - Variant31415, - Variant31416, - Variant31417, - Variant31418, - Variant31419, - Variant31420, - Variant31421, - Variant31422, - Variant31423, - Variant31424, - Variant31425, - Variant31426, - Variant31427, - Variant31428, - Variant31429, - Variant31430, - Variant31431, - Variant31432, - Variant31433, - Variant31434, - Variant31435, - Variant31436, - Variant31437, - Variant31438, - Variant31439, - Variant31440, - Variant31441, - Variant31442, - Variant31443, - Variant31444, - Variant31445, - Variant31446, - Variant31447, - Variant31448, - Variant31449, - Variant31450, - Variant31451, - Variant31452, - Variant31453, - Variant31454, - Variant31455, - Variant31456, - Variant31457, - Variant31458, - Variant31459, - Variant31460, - Variant31461, - Variant31462, - Variant31463, - Variant31464, - Variant31465, - Variant31466, - Variant31467, - Variant31468, - Variant31469, - Variant31470, - Variant31471, - Variant31472, - Variant31473, - Variant31474, - Variant31475, - Variant31476, - Variant31477, - Variant31478, - Variant31479, - Variant31480, - Variant31481, - Variant31482, - Variant31483, - Variant31484, - Variant31485, - Variant31486, - Variant31487, - Variant31488, - Variant31489, - Variant31490, - Variant31491, - Variant31492, - Variant31493, - Variant31494, - Variant31495, - Variant31496, - Variant31497, - Variant31498, - Variant31499, - Variant31500, - Variant31501, - Variant31502, - Variant31503, - Variant31504, - Variant31505, - Variant31506, - Variant31507, - Variant31508, - Variant31509, - Variant31510, - Variant31511, - Variant31512, - Variant31513, - Variant31514, - Variant31515, - Variant31516, - Variant31517, - Variant31518, - Variant31519, - Variant31520, - Variant31521, - Variant31522, - Variant31523, - Variant31524, - Variant31525, - Variant31526, - Variant31527, - Variant31528, - Variant31529, - Variant31530, - Variant31531, - Variant31532, - Variant31533, - Variant31534, - Variant31535, - Variant31536, - Variant31537, - Variant31538, - Variant31539, - Variant31540, - Variant31541, - Variant31542, - Variant31543, - Variant31544, - Variant31545, - Variant31546, - Variant31547, - Variant31548, - Variant31549, - Variant31550, - Variant31551, - Variant31552, - Variant31553, - Variant31554, - Variant31555, - Variant31556, - Variant31557, - Variant31558, - Variant31559, - Variant31560, - Variant31561, - Variant31562, - Variant31563, - Variant31564, - Variant31565, - Variant31566, - Variant31567, - Variant31568, - Variant31569, - Variant31570, - Variant31571, - Variant31572, - Variant31573, - Variant31574, - Variant31575, - Variant31576, - Variant31577, - Variant31578, - Variant31579, - Variant31580, - Variant31581, - Variant31582, - Variant31583, - Variant31584, - Variant31585, - Variant31586, - Variant31587, - Variant31588, - Variant31589, - Variant31590, - Variant31591, - Variant31592, - Variant31593, - Variant31594, - Variant31595, - Variant31596, - Variant31597, - Variant31598, - Variant31599, - Variant31600, - Variant31601, - Variant31602, - Variant31603, - Variant31604, - Variant31605, - Variant31606, - Variant31607, - Variant31608, - Variant31609, - Variant31610, - Variant31611, - Variant31612, - Variant31613, - Variant31614, - Variant31615, - Variant31616, - Variant31617, - Variant31618, - Variant31619, - Variant31620, - Variant31621, - Variant31622, - Variant31623, - Variant31624, - Variant31625, - Variant31626, - Variant31627, - Variant31628, - Variant31629, - Variant31630, - Variant31631, - Variant31632, - Variant31633, - Variant31634, - Variant31635, - Variant31636, - Variant31637, - Variant31638, - Variant31639, - Variant31640, - Variant31641, - Variant31642, - Variant31643, - Variant31644, - Variant31645, - Variant31646, - Variant31647, - Variant31648, - Variant31649, - Variant31650, - Variant31651, - Variant31652, - Variant31653, - Variant31654, - Variant31655, - Variant31656, - Variant31657, - Variant31658, - Variant31659, - Variant31660, - Variant31661, - Variant31662, - Variant31663, - Variant31664, - Variant31665, - Variant31666, - Variant31667, - Variant31668, - Variant31669, - Variant31670, - Variant31671, - Variant31672, - Variant31673, - Variant31674, - Variant31675, - Variant31676, - Variant31677, - Variant31678, - Variant31679, - Variant31680, - Variant31681, - Variant31682, - Variant31683, - Variant31684, - Variant31685, - Variant31686, - Variant31687, - Variant31688, - Variant31689, - Variant31690, - Variant31691, - Variant31692, - Variant31693, - Variant31694, - Variant31695, - Variant31696, - Variant31697, - Variant31698, - Variant31699, - Variant31700, - Variant31701, - Variant31702, - Variant31703, - Variant31704, - Variant31705, - Variant31706, - Variant31707, - Variant31708, - Variant31709, - Variant31710, - Variant31711, - Variant31712, - Variant31713, - Variant31714, - Variant31715, - Variant31716, - Variant31717, - Variant31718, - Variant31719, - Variant31720, - Variant31721, - Variant31722, - Variant31723, - Variant31724, - Variant31725, - Variant31726, - Variant31727, - Variant31728, - Variant31729, - Variant31730, - Variant31731, - Variant31732, - Variant31733, - Variant31734, - Variant31735, - Variant31736, - Variant31737, - Variant31738, - Variant31739, - Variant31740, - Variant31741, - Variant31742, - Variant31743, - Variant31744, - Variant31745, - Variant31746, - Variant31747, - Variant31748, - Variant31749, - Variant31750, - Variant31751, - Variant31752, - Variant31753, - Variant31754, - Variant31755, - Variant31756, - Variant31757, - Variant31758, - Variant31759, - Variant31760, - Variant31761, - Variant31762, - Variant31763, - Variant31764, - Variant31765, - Variant31766, - Variant31767, - Variant31768, - Variant31769, - Variant31770, - Variant31771, - Variant31772, - Variant31773, - Variant31774, - Variant31775, - Variant31776, - Variant31777, - Variant31778, - Variant31779, - Variant31780, - Variant31781, - Variant31782, - Variant31783, - Variant31784, - Variant31785, - Variant31786, - Variant31787, - Variant31788, - Variant31789, - Variant31790, - Variant31791, - Variant31792, - Variant31793, - Variant31794, - Variant31795, - Variant31796, - Variant31797, - Variant31798, - Variant31799, - Variant31800, - Variant31801, - Variant31802, - Variant31803, - Variant31804, - Variant31805, - Variant31806, - Variant31807, - Variant31808, - Variant31809, - Variant31810, - Variant31811, - Variant31812, - Variant31813, - Variant31814, - Variant31815, - Variant31816, - Variant31817, - Variant31818, - Variant31819, - Variant31820, - Variant31821, - Variant31822, - Variant31823, - Variant31824, - Variant31825, - Variant31826, - Variant31827, - Variant31828, - Variant31829, - Variant31830, - Variant31831, - Variant31832, - Variant31833, - Variant31834, - Variant31835, - Variant31836, - Variant31837, - Variant31838, - Variant31839, - Variant31840, - Variant31841, - Variant31842, - Variant31843, - Variant31844, - Variant31845, - Variant31846, - Variant31847, - Variant31848, - Variant31849, - Variant31850, - Variant31851, - Variant31852, - Variant31853, - Variant31854, - Variant31855, - Variant31856, - Variant31857, - Variant31858, - Variant31859, - Variant31860, - Variant31861, - Variant31862, - Variant31863, - Variant31864, - Variant31865, - Variant31866, - Variant31867, - Variant31868, - Variant31869, - Variant31870, - Variant31871, - Variant31872, - Variant31873, - Variant31874, - Variant31875, - Variant31876, - Variant31877, - Variant31878, - Variant31879, - Variant31880, - Variant31881, - Variant31882, - Variant31883, - Variant31884, - Variant31885, - Variant31886, - Variant31887, - Variant31888, - Variant31889, - Variant31890, - Variant31891, - Variant31892, - Variant31893, - Variant31894, - Variant31895, - Variant31896, - Variant31897, - Variant31898, - Variant31899, - Variant31900, - Variant31901, - Variant31902, - Variant31903, - Variant31904, - Variant31905, - Variant31906, - Variant31907, - Variant31908, - Variant31909, - Variant31910, - Variant31911, - Variant31912, - Variant31913, - Variant31914, - Variant31915, - Variant31916, - Variant31917, - Variant31918, - Variant31919, - Variant31920, - Variant31921, - Variant31922, - Variant31923, - Variant31924, - Variant31925, - Variant31926, - Variant31927, - Variant31928, - Variant31929, - Variant31930, - Variant31931, - Variant31932, - Variant31933, - Variant31934, - Variant31935, - Variant31936, - Variant31937, - Variant31938, - Variant31939, - Variant31940, - Variant31941, - Variant31942, - Variant31943, - Variant31944, - Variant31945, - Variant31946, - Variant31947, - Variant31948, - Variant31949, - Variant31950, - Variant31951, - Variant31952, - Variant31953, - Variant31954, - Variant31955, - Variant31956, - Variant31957, - Variant31958, - Variant31959, - Variant31960, - Variant31961, - Variant31962, - Variant31963, - Variant31964, - Variant31965, - Variant31966, - Variant31967, - Variant31968, - Variant31969, - Variant31970, - Variant31971, - Variant31972, - Variant31973, - Variant31974, - Variant31975, - Variant31976, - Variant31977, - Variant31978, - Variant31979, - Variant31980, - Variant31981, - Variant31982, - Variant31983, - Variant31984, - Variant31985, - Variant31986, - Variant31987, - Variant31988, - Variant31989, - Variant31990, - Variant31991, - Variant31992, - Variant31993, - Variant31994, - Variant31995, - Variant31996, - Variant31997, - Variant31998, - Variant31999, - Variant32000, - Variant32001, - Variant32002, - Variant32003, - Variant32004, - Variant32005, - Variant32006, - Variant32007, - Variant32008, - Variant32009, - Variant32010, - Variant32011, - Variant32012, - Variant32013, - Variant32014, - Variant32015, - Variant32016, - Variant32017, - Variant32018, - Variant32019, - Variant32020, - Variant32021, - Variant32022, - Variant32023, - Variant32024, - Variant32025, - Variant32026, - Variant32027, - Variant32028, - Variant32029, - Variant32030, - Variant32031, - Variant32032, - Variant32033, - Variant32034, - Variant32035, - Variant32036, - Variant32037, - Variant32038, - Variant32039, - Variant32040, - Variant32041, - Variant32042, - Variant32043, - Variant32044, - Variant32045, - Variant32046, - Variant32047, - Variant32048, - Variant32049, - Variant32050, - Variant32051, - Variant32052, - Variant32053, - Variant32054, - Variant32055, - Variant32056, - Variant32057, - Variant32058, - Variant32059, - Variant32060, - Variant32061, - Variant32062, - Variant32063, - Variant32064, - Variant32065, - Variant32066, - Variant32067, - Variant32068, - Variant32069, - Variant32070, - Variant32071, - Variant32072, - Variant32073, - Variant32074, - Variant32075, - Variant32076, - Variant32077, - Variant32078, - Variant32079, - Variant32080, - Variant32081, - Variant32082, - Variant32083, - Variant32084, - Variant32085, - Variant32086, - Variant32087, - Variant32088, - Variant32089, - Variant32090, - Variant32091, - Variant32092, - Variant32093, - Variant32094, - Variant32095, - Variant32096, - Variant32097, - Variant32098, - Variant32099, - Variant32100, - Variant32101, - Variant32102, - Variant32103, - Variant32104, - Variant32105, - Variant32106, - Variant32107, - Variant32108, - Variant32109, - Variant32110, - Variant32111, - Variant32112, - Variant32113, - Variant32114, - Variant32115, - Variant32116, - Variant32117, - Variant32118, - Variant32119, - Variant32120, - Variant32121, - Variant32122, - Variant32123, - Variant32124, - Variant32125, - Variant32126, - Variant32127, - Variant32128, - Variant32129, - Variant32130, - Variant32131, - Variant32132, - Variant32133, - Variant32134, - Variant32135, - Variant32136, - Variant32137, - Variant32138, - Variant32139, - Variant32140, - Variant32141, - Variant32142, - Variant32143, - Variant32144, - Variant32145, - Variant32146, - Variant32147, - Variant32148, - Variant32149, - Variant32150, - Variant32151, - Variant32152, - Variant32153, - Variant32154, - Variant32155, - Variant32156, - Variant32157, - Variant32158, - Variant32159, - Variant32160, - Variant32161, - Variant32162, - Variant32163, - Variant32164, - Variant32165, - Variant32166, - Variant32167, - Variant32168, - Variant32169, - Variant32170, - Variant32171, - Variant32172, - Variant32173, - Variant32174, - Variant32175, - Variant32176, - Variant32177, - Variant32178, - Variant32179, - Variant32180, - Variant32181, - Variant32182, - Variant32183, - Variant32184, - Variant32185, - Variant32186, - Variant32187, - Variant32188, - Variant32189, - Variant32190, - Variant32191, - Variant32192, - Variant32193, - Variant32194, - Variant32195, - Variant32196, - Variant32197, - Variant32198, - Variant32199, - Variant32200, - Variant32201, - Variant32202, - Variant32203, - Variant32204, - Variant32205, - Variant32206, - Variant32207, - Variant32208, - Variant32209, - Variant32210, - Variant32211, - Variant32212, - Variant32213, - Variant32214, - Variant32215, - Variant32216, - Variant32217, - Variant32218, - Variant32219, - Variant32220, - Variant32221, - Variant32222, - Variant32223, - Variant32224, - Variant32225, - Variant32226, - Variant32227, - Variant32228, - Variant32229, - Variant32230, - Variant32231, - Variant32232, - Variant32233, - Variant32234, - Variant32235, - Variant32236, - Variant32237, - Variant32238, - Variant32239, - Variant32240, - Variant32241, - Variant32242, - Variant32243, - Variant32244, - Variant32245, - Variant32246, - Variant32247, - Variant32248, - Variant32249, - Variant32250, - Variant32251, - Variant32252, - Variant32253, - Variant32254, - Variant32255, - Variant32256, - Variant32257, - Variant32258, - Variant32259, - Variant32260, - Variant32261, - Variant32262, - Variant32263, - Variant32264, - Variant32265, - Variant32266, - Variant32267, - Variant32268, - Variant32269, - Variant32270, - Variant32271, - Variant32272, - Variant32273, - Variant32274, - Variant32275, - Variant32276, - Variant32277, - Variant32278, - Variant32279, - Variant32280, - Variant32281, - Variant32282, - Variant32283, - Variant32284, - Variant32285, - Variant32286, - Variant32287, - Variant32288, - Variant32289, - Variant32290, - Variant32291, - Variant32292, - Variant32293, - Variant32294, - Variant32295, - Variant32296, - Variant32297, - Variant32298, - Variant32299, - Variant32300, - Variant32301, - Variant32302, - Variant32303, - Variant32304, - Variant32305, - Variant32306, - Variant32307, - Variant32308, - Variant32309, - Variant32310, - Variant32311, - Variant32312, - Variant32313, - Variant32314, - Variant32315, - Variant32316, - Variant32317, - Variant32318, - Variant32319, - Variant32320, - Variant32321, - Variant32322, - Variant32323, - Variant32324, - Variant32325, - Variant32326, - Variant32327, - Variant32328, - Variant32329, - Variant32330, - Variant32331, - Variant32332, - Variant32333, - Variant32334, - Variant32335, - Variant32336, - Variant32337, - Variant32338, - Variant32339, - Variant32340, - Variant32341, - Variant32342, - Variant32343, - Variant32344, - Variant32345, - Variant32346, - Variant32347, - Variant32348, - Variant32349, - Variant32350, - Variant32351, - Variant32352, - Variant32353, - Variant32354, - Variant32355, - Variant32356, - Variant32357, - Variant32358, - Variant32359, - Variant32360, - Variant32361, - Variant32362, - Variant32363, - Variant32364, - Variant32365, - Variant32366, - Variant32367, - Variant32368, - Variant32369, - Variant32370, - Variant32371, - Variant32372, - Variant32373, - Variant32374, - Variant32375, - Variant32376, - Variant32377, - Variant32378, - Variant32379, - Variant32380, - Variant32381, - Variant32382, - Variant32383, - Variant32384, - Variant32385, - Variant32386, - Variant32387, - Variant32388, - Variant32389, - Variant32390, - Variant32391, - Variant32392, - Variant32393, - Variant32394, - Variant32395, - Variant32396, - Variant32397, - Variant32398, - Variant32399, - Variant32400, - Variant32401, - Variant32402, - Variant32403, - Variant32404, - Variant32405, - Variant32406, - Variant32407, - Variant32408, - Variant32409, - Variant32410, - Variant32411, - Variant32412, - Variant32413, - Variant32414, - Variant32415, - Variant32416, - Variant32417, - Variant32418, - Variant32419, - Variant32420, - Variant32421, - Variant32422, - Variant32423, - Variant32424, - Variant32425, - Variant32426, - Variant32427, - Variant32428, - Variant32429, - Variant32430, - Variant32431, - Variant32432, - Variant32433, - Variant32434, - Variant32435, - Variant32436, - Variant32437, - Variant32438, - Variant32439, - Variant32440, - Variant32441, - Variant32442, - Variant32443, - Variant32444, - Variant32445, - Variant32446, - Variant32447, - Variant32448, - Variant32449, - Variant32450, - Variant32451, - Variant32452, - Variant32453, - Variant32454, - Variant32455, - Variant32456, - Variant32457, - Variant32458, - Variant32459, - Variant32460, - Variant32461, - Variant32462, - Variant32463, - Variant32464, - Variant32465, - Variant32466, - Variant32467, - Variant32468, - Variant32469, - Variant32470, - Variant32471, - Variant32472, - Variant32473, - Variant32474, - Variant32475, - Variant32476, - Variant32477, - Variant32478, - Variant32479, - Variant32480, - Variant32481, - Variant32482, - Variant32483, - Variant32484, - Variant32485, - Variant32486, - Variant32487, - Variant32488, - Variant32489, - Variant32490, - Variant32491, - Variant32492, - Variant32493, - Variant32494, - Variant32495, - Variant32496, - Variant32497, - Variant32498, - Variant32499, - Variant32500, - Variant32501, - Variant32502, - Variant32503, - Variant32504, - Variant32505, - Variant32506, - Variant32507, - Variant32508, - Variant32509, - Variant32510, - Variant32511, - Variant32512, - Variant32513, - Variant32514, - Variant32515, - Variant32516, - Variant32517, - Variant32518, - Variant32519, - Variant32520, - Variant32521, - Variant32522, - Variant32523, - Variant32524, - Variant32525, - Variant32526, - Variant32527, - Variant32528, - Variant32529, - Variant32530, - Variant32531, - Variant32532, - Variant32533, - Variant32534, - Variant32535, - Variant32536, - Variant32537, - Variant32538, - Variant32539, - Variant32540, - Variant32541, - Variant32542, - Variant32543, - Variant32544, - Variant32545, - Variant32546, - Variant32547, - Variant32548, - Variant32549, - Variant32550, - Variant32551, - Variant32552, - Variant32553, - Variant32554, - Variant32555, - Variant32556, - Variant32557, - Variant32558, - Variant32559, - Variant32560, - Variant32561, - Variant32562, - Variant32563, - Variant32564, - Variant32565, - Variant32566, - Variant32567, - Variant32568, - Variant32569, - Variant32570, - Variant32571, - Variant32572, - Variant32573, - Variant32574, - Variant32575, - Variant32576, - Variant32577, - Variant32578, - Variant32579, - Variant32580, - Variant32581, - Variant32582, - Variant32583, - Variant32584, - Variant32585, - Variant32586, - Variant32587, - Variant32588, - Variant32589, - Variant32590, - Variant32591, - Variant32592, - Variant32593, - Variant32594, - Variant32595, - Variant32596, - Variant32597, - Variant32598, - Variant32599, - Variant32600, - Variant32601, - Variant32602, - Variant32603, - Variant32604, - Variant32605, - Variant32606, - Variant32607, - Variant32608, - Variant32609, - Variant32610, - Variant32611, - Variant32612, - Variant32613, - Variant32614, - Variant32615, - Variant32616, - Variant32617, - Variant32618, - Variant32619, - Variant32620, - Variant32621, - Variant32622, - Variant32623, - Variant32624, - Variant32625, - Variant32626, - Variant32627, - Variant32628, - Variant32629, - Variant32630, - Variant32631, - Variant32632, - Variant32633, - Variant32634, - Variant32635, - Variant32636, - Variant32637, - Variant32638, - Variant32639, - Variant32640, - Variant32641, - Variant32642, - Variant32643, - Variant32644, - Variant32645, - Variant32646, - Variant32647, - Variant32648, - Variant32649, - Variant32650, - Variant32651, - Variant32652, - Variant32653, - Variant32654, - Variant32655, - Variant32656, - Variant32657, - Variant32658, - Variant32659, - Variant32660, - Variant32661, - Variant32662, - Variant32663, - Variant32664, - Variant32665, - Variant32666, - Variant32667, - Variant32668, - Variant32669, - Variant32670, - Variant32671, - Variant32672, - Variant32673, - Variant32674, - Variant32675, - Variant32676, - Variant32677, - Variant32678, - Variant32679, - Variant32680, - Variant32681, - Variant32682, - Variant32683, - Variant32684, - Variant32685, - Variant32686, - Variant32687, - Variant32688, - Variant32689, - Variant32690, - Variant32691, - Variant32692, - Variant32693, - Variant32694, - Variant32695, - Variant32696, - Variant32697, - Variant32698, - Variant32699, - Variant32700, - Variant32701, - Variant32702, - Variant32703, - Variant32704, - Variant32705, - Variant32706, - Variant32707, - Variant32708, - Variant32709, - Variant32710, - Variant32711, - Variant32712, - Variant32713, - Variant32714, - Variant32715, - Variant32716, - Variant32717, - Variant32718, - Variant32719, - Variant32720, - Variant32721, - Variant32722, - Variant32723, - Variant32724, - Variant32725, - Variant32726, - Variant32727, - Variant32728, - Variant32729, - Variant32730, - Variant32731, - Variant32732, - Variant32733, - Variant32734, - Variant32735, - Variant32736, - Variant32737, - Variant32738, - Variant32739, - Variant32740, - Variant32741, - Variant32742, - Variant32743, - Variant32744, - Variant32745, - Variant32746, - Variant32747, - Variant32748, - Variant32749, - Variant32750, - Variant32751, - Variant32752, - Variant32753, - Variant32754, - Variant32755, - Variant32756, - Variant32757, - Variant32758, - Variant32759, - Variant32760, - Variant32761, - Variant32762, - Variant32763, - Variant32764, - Variant32765, - Variant32766, - Variant32767, - Variant32768 = -32768i16, - Variant32769, - Variant32770, - Variant32771, - Variant32772, - Variant32773, - Variant32774, - Variant32775, - Variant32776, - Variant32777, - Variant32778, - Variant32779, - Variant32780, - Variant32781, - Variant32782, - Variant32783, - Variant32784, - Variant32785, - Variant32786, - Variant32787, - Variant32788, - Variant32789, - Variant32790, - Variant32791, - Variant32792, - Variant32793, - Variant32794, - Variant32795, - Variant32796, - Variant32797, - Variant32798, - Variant32799, - Variant32800, - Variant32801, - Variant32802, - Variant32803, - Variant32804, - Variant32805, - Variant32806, - Variant32807, - Variant32808, - Variant32809, - Variant32810, - Variant32811, - Variant32812, - Variant32813, - Variant32814, - Variant32815, - Variant32816, - Variant32817, - Variant32818, - Variant32819, - Variant32820, - Variant32821, - Variant32822, - Variant32823, - Variant32824, - Variant32825, - Variant32826, - Variant32827, - Variant32828, - Variant32829, - Variant32830, - Variant32831, - Variant32832, - Variant32833, - Variant32834, - Variant32835, - Variant32836, - Variant32837, - Variant32838, - Variant32839, - Variant32840, - Variant32841, - Variant32842, - Variant32843, - Variant32844, - Variant32845, - Variant32846, - Variant32847, - Variant32848, - Variant32849, - Variant32850, - Variant32851, - Variant32852, - Variant32853, - Variant32854, - Variant32855, - Variant32856, - Variant32857, - Variant32858, - Variant32859, - Variant32860, - Variant32861, - Variant32862, - Variant32863, - Variant32864, - Variant32865, - Variant32866, - Variant32867, - Variant32868, - Variant32869, - Variant32870, - Variant32871, - Variant32872, - Variant32873, - Variant32874, - Variant32875, - Variant32876, - Variant32877, - Variant32878, - Variant32879, - Variant32880, - Variant32881, - Variant32882, - Variant32883, - Variant32884, - Variant32885, - Variant32886, - Variant32887, - Variant32888, - Variant32889, - Variant32890, - Variant32891, - Variant32892, - Variant32893, - Variant32894, - Variant32895, - Variant32896, - Variant32897, - Variant32898, - Variant32899, - Variant32900, - Variant32901, - Variant32902, - Variant32903, - Variant32904, - Variant32905, - Variant32906, - Variant32907, - Variant32908, - Variant32909, - Variant32910, - Variant32911, - Variant32912, - Variant32913, - Variant32914, - Variant32915, - Variant32916, - Variant32917, - Variant32918, - Variant32919, - Variant32920, - Variant32921, - Variant32922, - Variant32923, - Variant32924, - Variant32925, - Variant32926, - Variant32927, - Variant32928, - Variant32929, - Variant32930, - Variant32931, - Variant32932, - Variant32933, - Variant32934, - Variant32935, - Variant32936, - Variant32937, - Variant32938, - Variant32939, - Variant32940, - Variant32941, - Variant32942, - Variant32943, - Variant32944, - Variant32945, - Variant32946, - Variant32947, - Variant32948, - Variant32949, - Variant32950, - Variant32951, - Variant32952, - Variant32953, - Variant32954, - Variant32955, - Variant32956, - Variant32957, - Variant32958, - Variant32959, - Variant32960, - Variant32961, - Variant32962, - Variant32963, - Variant32964, - Variant32965, - Variant32966, - Variant32967, - Variant32968, - Variant32969, - Variant32970, - Variant32971, - Variant32972, - Variant32973, - Variant32974, - Variant32975, - Variant32976, - Variant32977, - Variant32978, - Variant32979, - Variant32980, - Variant32981, - Variant32982, - Variant32983, - Variant32984, - Variant32985, - Variant32986, - Variant32987, - Variant32988, - Variant32989, - Variant32990, - Variant32991, - Variant32992, - Variant32993, - Variant32994, - Variant32995, - Variant32996, - Variant32997, - Variant32998, - Variant32999, - Variant33000, - Variant33001, - Variant33002, - Variant33003, - Variant33004, - Variant33005, - Variant33006, - Variant33007, - Variant33008, - Variant33009, - Variant33010, - Variant33011, - Variant33012, - Variant33013, - Variant33014, - Variant33015, - Variant33016, - Variant33017, - Variant33018, - Variant33019, - Variant33020, - Variant33021, - Variant33022, - Variant33023, - Variant33024, - Variant33025, - Variant33026, - Variant33027, - Variant33028, - Variant33029, - Variant33030, - Variant33031, - Variant33032, - Variant33033, - Variant33034, - Variant33035, - Variant33036, - Variant33037, - Variant33038, - Variant33039, - Variant33040, - Variant33041, - Variant33042, - Variant33043, - Variant33044, - Variant33045, - Variant33046, - Variant33047, - Variant33048, - Variant33049, - Variant33050, - Variant33051, - Variant33052, - Variant33053, - Variant33054, - Variant33055, - Variant33056, - Variant33057, - Variant33058, - Variant33059, - Variant33060, - Variant33061, - Variant33062, - Variant33063, - Variant33064, - Variant33065, - Variant33066, - Variant33067, - Variant33068, - Variant33069, - Variant33070, - Variant33071, - Variant33072, - Variant33073, - Variant33074, - Variant33075, - Variant33076, - Variant33077, - Variant33078, - Variant33079, - Variant33080, - Variant33081, - Variant33082, - Variant33083, - Variant33084, - Variant33085, - Variant33086, - Variant33087, - Variant33088, - Variant33089, - Variant33090, - Variant33091, - Variant33092, - Variant33093, - Variant33094, - Variant33095, - Variant33096, - Variant33097, - Variant33098, - Variant33099, - Variant33100, - Variant33101, - Variant33102, - Variant33103, - Variant33104, - Variant33105, - Variant33106, - Variant33107, - Variant33108, - Variant33109, - Variant33110, - Variant33111, - Variant33112, - Variant33113, - Variant33114, - Variant33115, - Variant33116, - Variant33117, - Variant33118, - Variant33119, - Variant33120, - Variant33121, - Variant33122, - Variant33123, - Variant33124, - Variant33125, - Variant33126, - Variant33127, - Variant33128, - Variant33129, - Variant33130, - Variant33131, - Variant33132, - Variant33133, - Variant33134, - Variant33135, - Variant33136, - Variant33137, - Variant33138, - Variant33139, - Variant33140, - Variant33141, - Variant33142, - Variant33143, - Variant33144, - Variant33145, - Variant33146, - Variant33147, - Variant33148, - Variant33149, - Variant33150, - Variant33151, - Variant33152, - Variant33153, - Variant33154, - Variant33155, - Variant33156, - Variant33157, - Variant33158, - Variant33159, - Variant33160, - Variant33161, - Variant33162, - Variant33163, - Variant33164, - Variant33165, - Variant33166, - Variant33167, - Variant33168, - Variant33169, - Variant33170, - Variant33171, - Variant33172, - Variant33173, - Variant33174, - Variant33175, - Variant33176, - Variant33177, - Variant33178, - Variant33179, - Variant33180, - Variant33181, - Variant33182, - Variant33183, - Variant33184, - Variant33185, - Variant33186, - Variant33187, - Variant33188, - Variant33189, - Variant33190, - Variant33191, - Variant33192, - Variant33193, - Variant33194, - Variant33195, - Variant33196, - Variant33197, - Variant33198, - Variant33199, - Variant33200, - Variant33201, - Variant33202, - Variant33203, - Variant33204, - Variant33205, - Variant33206, - Variant33207, - Variant33208, - Variant33209, - Variant33210, - Variant33211, - Variant33212, - Variant33213, - Variant33214, - Variant33215, - Variant33216, - Variant33217, - Variant33218, - Variant33219, - Variant33220, - Variant33221, - Variant33222, - Variant33223, - Variant33224, - Variant33225, - Variant33226, - Variant33227, - Variant33228, - Variant33229, - Variant33230, - Variant33231, - Variant33232, - Variant33233, - Variant33234, - Variant33235, - Variant33236, - Variant33237, - Variant33238, - Variant33239, - Variant33240, - Variant33241, - Variant33242, - Variant33243, - Variant33244, - Variant33245, - Variant33246, - Variant33247, - Variant33248, - Variant33249, - Variant33250, - Variant33251, - Variant33252, - Variant33253, - Variant33254, - Variant33255, - Variant33256, - Variant33257, - Variant33258, - Variant33259, - Variant33260, - Variant33261, - Variant33262, - Variant33263, - Variant33264, - Variant33265, - Variant33266, - Variant33267, - Variant33268, - Variant33269, - Variant33270, - Variant33271, - Variant33272, - Variant33273, - Variant33274, - Variant33275, - Variant33276, - Variant33277, - Variant33278, - Variant33279, - Variant33280, - Variant33281, - Variant33282, - Variant33283, - Variant33284, - Variant33285, - Variant33286, - Variant33287, - Variant33288, - Variant33289, - Variant33290, - Variant33291, - Variant33292, - Variant33293, - Variant33294, - Variant33295, - Variant33296, - Variant33297, - Variant33298, - Variant33299, - Variant33300, - Variant33301, - Variant33302, - Variant33303, - Variant33304, - Variant33305, - Variant33306, - Variant33307, - Variant33308, - Variant33309, - Variant33310, - Variant33311, - Variant33312, - Variant33313, - Variant33314, - Variant33315, - Variant33316, - Variant33317, - Variant33318, - Variant33319, - Variant33320, - Variant33321, - Variant33322, - Variant33323, - Variant33324, - Variant33325, - Variant33326, - Variant33327, - Variant33328, - Variant33329, - Variant33330, - Variant33331, - Variant33332, - Variant33333, - Variant33334, - Variant33335, - Variant33336, - Variant33337, - Variant33338, - Variant33339, - Variant33340, - Variant33341, - Variant33342, - Variant33343, - Variant33344, - Variant33345, - Variant33346, - Variant33347, - Variant33348, - Variant33349, - Variant33350, - Variant33351, - Variant33352, - Variant33353, - Variant33354, - Variant33355, - Variant33356, - Variant33357, - Variant33358, - Variant33359, - Variant33360, - Variant33361, - Variant33362, - Variant33363, - Variant33364, - Variant33365, - Variant33366, - Variant33367, - Variant33368, - Variant33369, - Variant33370, - Variant33371, - Variant33372, - Variant33373, - Variant33374, - Variant33375, - Variant33376, - Variant33377, - Variant33378, - Variant33379, - Variant33380, - Variant33381, - Variant33382, - Variant33383, - Variant33384, - Variant33385, - Variant33386, - Variant33387, - Variant33388, - Variant33389, - Variant33390, - Variant33391, - Variant33392, - Variant33393, - Variant33394, - Variant33395, - Variant33396, - Variant33397, - Variant33398, - Variant33399, - Variant33400, - Variant33401, - Variant33402, - Variant33403, - Variant33404, - Variant33405, - Variant33406, - Variant33407, - Variant33408, - Variant33409, - Variant33410, - Variant33411, - Variant33412, - Variant33413, - Variant33414, - Variant33415, - Variant33416, - Variant33417, - Variant33418, - Variant33419, - Variant33420, - Variant33421, - Variant33422, - Variant33423, - Variant33424, - Variant33425, - Variant33426, - Variant33427, - Variant33428, - Variant33429, - Variant33430, - Variant33431, - Variant33432, - Variant33433, - Variant33434, - Variant33435, - Variant33436, - Variant33437, - Variant33438, - Variant33439, - Variant33440, - Variant33441, - Variant33442, - Variant33443, - Variant33444, - Variant33445, - Variant33446, - Variant33447, - Variant33448, - Variant33449, - Variant33450, - Variant33451, - Variant33452, - Variant33453, - Variant33454, - Variant33455, - Variant33456, - Variant33457, - Variant33458, - Variant33459, - Variant33460, - Variant33461, - Variant33462, - Variant33463, - Variant33464, - Variant33465, - Variant33466, - Variant33467, - Variant33468, - Variant33469, - Variant33470, - Variant33471, - Variant33472, - Variant33473, - Variant33474, - Variant33475, - Variant33476, - Variant33477, - Variant33478, - Variant33479, - Variant33480, - Variant33481, - Variant33482, - Variant33483, - Variant33484, - Variant33485, - Variant33486, - Variant33487, - Variant33488, - Variant33489, - Variant33490, - Variant33491, - Variant33492, - Variant33493, - Variant33494, - Variant33495, - Variant33496, - Variant33497, - Variant33498, - Variant33499, - Variant33500, - Variant33501, - Variant33502, - Variant33503, - Variant33504, - Variant33505, - Variant33506, - Variant33507, - Variant33508, - Variant33509, - Variant33510, - Variant33511, - Variant33512, - Variant33513, - Variant33514, - Variant33515, - Variant33516, - Variant33517, - Variant33518, - Variant33519, - Variant33520, - Variant33521, - Variant33522, - Variant33523, - Variant33524, - Variant33525, - Variant33526, - Variant33527, - Variant33528, - Variant33529, - Variant33530, - Variant33531, - Variant33532, - Variant33533, - Variant33534, - Variant33535, - Variant33536, - Variant33537, - Variant33538, - Variant33539, - Variant33540, - Variant33541, - Variant33542, - Variant33543, - Variant33544, - Variant33545, - Variant33546, - Variant33547, - Variant33548, - Variant33549, - Variant33550, - Variant33551, - Variant33552, - Variant33553, - Variant33554, - Variant33555, - Variant33556, - Variant33557, - Variant33558, - Variant33559, - Variant33560, - Variant33561, - Variant33562, - Variant33563, - Variant33564, - Variant33565, - Variant33566, - Variant33567, - Variant33568, - Variant33569, - Variant33570, - Variant33571, - Variant33572, - Variant33573, - Variant33574, - Variant33575, - Variant33576, - Variant33577, - Variant33578, - Variant33579, - Variant33580, - Variant33581, - Variant33582, - Variant33583, - Variant33584, - Variant33585, - Variant33586, - Variant33587, - Variant33588, - Variant33589, - Variant33590, - Variant33591, - Variant33592, - Variant33593, - Variant33594, - Variant33595, - Variant33596, - Variant33597, - Variant33598, - Variant33599, - Variant33600, - Variant33601, - Variant33602, - Variant33603, - Variant33604, - Variant33605, - Variant33606, - Variant33607, - Variant33608, - Variant33609, - Variant33610, - Variant33611, - Variant33612, - Variant33613, - Variant33614, - Variant33615, - Variant33616, - Variant33617, - Variant33618, - Variant33619, - Variant33620, - Variant33621, - Variant33622, - Variant33623, - Variant33624, - Variant33625, - Variant33626, - Variant33627, - Variant33628, - Variant33629, - Variant33630, - Variant33631, - Variant33632, - Variant33633, - Variant33634, - Variant33635, - Variant33636, - Variant33637, - Variant33638, - Variant33639, - Variant33640, - Variant33641, - Variant33642, - Variant33643, - Variant33644, - Variant33645, - Variant33646, - Variant33647, - Variant33648, - Variant33649, - Variant33650, - Variant33651, - Variant33652, - Variant33653, - Variant33654, - Variant33655, - Variant33656, - Variant33657, - Variant33658, - Variant33659, - Variant33660, - Variant33661, - Variant33662, - Variant33663, - Variant33664, - Variant33665, - Variant33666, - Variant33667, - Variant33668, - Variant33669, - Variant33670, - Variant33671, - Variant33672, - Variant33673, - Variant33674, - Variant33675, - Variant33676, - Variant33677, - Variant33678, - Variant33679, - Variant33680, - Variant33681, - Variant33682, - Variant33683, - Variant33684, - Variant33685, - Variant33686, - Variant33687, - Variant33688, - Variant33689, - Variant33690, - Variant33691, - Variant33692, - Variant33693, - Variant33694, - Variant33695, - Variant33696, - Variant33697, - Variant33698, - Variant33699, - Variant33700, - Variant33701, - Variant33702, - Variant33703, - Variant33704, - Variant33705, - Variant33706, - Variant33707, - Variant33708, - Variant33709, - Variant33710, - Variant33711, - Variant33712, - Variant33713, - Variant33714, - Variant33715, - Variant33716, - Variant33717, - Variant33718, - Variant33719, - Variant33720, - Variant33721, - Variant33722, - Variant33723, - Variant33724, - Variant33725, - Variant33726, - Variant33727, - Variant33728, - Variant33729, - Variant33730, - Variant33731, - Variant33732, - Variant33733, - Variant33734, - Variant33735, - Variant33736, - Variant33737, - Variant33738, - Variant33739, - Variant33740, - Variant33741, - Variant33742, - Variant33743, - Variant33744, - Variant33745, - Variant33746, - Variant33747, - Variant33748, - Variant33749, - Variant33750, - Variant33751, - Variant33752, - Variant33753, - Variant33754, - Variant33755, - Variant33756, - Variant33757, - Variant33758, - Variant33759, - Variant33760, - Variant33761, - Variant33762, - Variant33763, - Variant33764, - Variant33765, - Variant33766, - Variant33767, - Variant33768, - Variant33769, - Variant33770, - Variant33771, - Variant33772, - Variant33773, - Variant33774, - Variant33775, - Variant33776, - Variant33777, - Variant33778, - Variant33779, - Variant33780, - Variant33781, - Variant33782, - Variant33783, - Variant33784, - Variant33785, - Variant33786, - Variant33787, - Variant33788, - Variant33789, - Variant33790, - Variant33791, - Variant33792, - Variant33793, - Variant33794, - Variant33795, - Variant33796, - Variant33797, - Variant33798, - Variant33799, - Variant33800, - Variant33801, - Variant33802, - Variant33803, - Variant33804, - Variant33805, - Variant33806, - Variant33807, - Variant33808, - Variant33809, - Variant33810, - Variant33811, - Variant33812, - Variant33813, - Variant33814, - Variant33815, - Variant33816, - Variant33817, - Variant33818, - Variant33819, - Variant33820, - Variant33821, - Variant33822, - Variant33823, - Variant33824, - Variant33825, - Variant33826, - Variant33827, - Variant33828, - Variant33829, - Variant33830, - Variant33831, - Variant33832, - Variant33833, - Variant33834, - Variant33835, - Variant33836, - Variant33837, - Variant33838, - Variant33839, - Variant33840, - Variant33841, - Variant33842, - Variant33843, - Variant33844, - Variant33845, - Variant33846, - Variant33847, - Variant33848, - Variant33849, - Variant33850, - Variant33851, - Variant33852, - Variant33853, - Variant33854, - Variant33855, - Variant33856, - Variant33857, - Variant33858, - Variant33859, - Variant33860, - Variant33861, - Variant33862, - Variant33863, - Variant33864, - Variant33865, - Variant33866, - Variant33867, - Variant33868, - Variant33869, - Variant33870, - Variant33871, - Variant33872, - Variant33873, - Variant33874, - Variant33875, - Variant33876, - Variant33877, - Variant33878, - Variant33879, - Variant33880, - Variant33881, - Variant33882, - Variant33883, - Variant33884, - Variant33885, - Variant33886, - Variant33887, - Variant33888, - Variant33889, - Variant33890, - Variant33891, - Variant33892, - Variant33893, - Variant33894, - Variant33895, - Variant33896, - Variant33897, - Variant33898, - Variant33899, - Variant33900, - Variant33901, - Variant33902, - Variant33903, - Variant33904, - Variant33905, - Variant33906, - Variant33907, - Variant33908, - Variant33909, - Variant33910, - Variant33911, - Variant33912, - Variant33913, - Variant33914, - Variant33915, - Variant33916, - Variant33917, - Variant33918, - Variant33919, - Variant33920, - Variant33921, - Variant33922, - Variant33923, - Variant33924, - Variant33925, - Variant33926, - Variant33927, - Variant33928, - Variant33929, - Variant33930, - Variant33931, - Variant33932, - Variant33933, - Variant33934, - Variant33935, - Variant33936, - Variant33937, - Variant33938, - Variant33939, - Variant33940, - Variant33941, - Variant33942, - Variant33943, - Variant33944, - Variant33945, - Variant33946, - Variant33947, - Variant33948, - Variant33949, - Variant33950, - Variant33951, - Variant33952, - Variant33953, - Variant33954, - Variant33955, - Variant33956, - Variant33957, - Variant33958, - Variant33959, - Variant33960, - Variant33961, - Variant33962, - Variant33963, - Variant33964, - Variant33965, - Variant33966, - Variant33967, - Variant33968, - Variant33969, - Variant33970, - Variant33971, - Variant33972, - Variant33973, - Variant33974, - Variant33975, - Variant33976, - Variant33977, - Variant33978, - Variant33979, - Variant33980, - Variant33981, - Variant33982, - Variant33983, - Variant33984, - Variant33985, - Variant33986, - Variant33987, - Variant33988, - Variant33989, - Variant33990, - Variant33991, - Variant33992, - Variant33993, - Variant33994, - Variant33995, - Variant33996, - Variant33997, - Variant33998, - Variant33999, - Variant34000, - Variant34001, - Variant34002, - Variant34003, - Variant34004, - Variant34005, - Variant34006, - Variant34007, - Variant34008, - Variant34009, - Variant34010, - Variant34011, - Variant34012, - Variant34013, - Variant34014, - Variant34015, - Variant34016, - Variant34017, - Variant34018, - Variant34019, - Variant34020, - Variant34021, - Variant34022, - Variant34023, - Variant34024, - Variant34025, - Variant34026, - Variant34027, - Variant34028, - Variant34029, - Variant34030, - Variant34031, - Variant34032, - Variant34033, - Variant34034, - Variant34035, - Variant34036, - Variant34037, - Variant34038, - Variant34039, - Variant34040, - Variant34041, - Variant34042, - Variant34043, - Variant34044, - Variant34045, - Variant34046, - Variant34047, - Variant34048, - Variant34049, - Variant34050, - Variant34051, - Variant34052, - Variant34053, - Variant34054, - Variant34055, - Variant34056, - Variant34057, - Variant34058, - Variant34059, - Variant34060, - Variant34061, - Variant34062, - Variant34063, - Variant34064, - Variant34065, - Variant34066, - Variant34067, - Variant34068, - Variant34069, - Variant34070, - Variant34071, - Variant34072, - Variant34073, - Variant34074, - Variant34075, - Variant34076, - Variant34077, - Variant34078, - Variant34079, - Variant34080, - Variant34081, - Variant34082, - Variant34083, - Variant34084, - Variant34085, - Variant34086, - Variant34087, - Variant34088, - Variant34089, - Variant34090, - Variant34091, - Variant34092, - Variant34093, - Variant34094, - Variant34095, - Variant34096, - Variant34097, - Variant34098, - Variant34099, - Variant34100, - Variant34101, - Variant34102, - Variant34103, - Variant34104, - Variant34105, - Variant34106, - Variant34107, - Variant34108, - Variant34109, - Variant34110, - Variant34111, - Variant34112, - Variant34113, - Variant34114, - Variant34115, - Variant34116, - Variant34117, - Variant34118, - Variant34119, - Variant34120, - Variant34121, - Variant34122, - Variant34123, - Variant34124, - Variant34125, - Variant34126, - Variant34127, - Variant34128, - Variant34129, - Variant34130, - Variant34131, - Variant34132, - Variant34133, - Variant34134, - Variant34135, - Variant34136, - Variant34137, - Variant34138, - Variant34139, - Variant34140, - Variant34141, - Variant34142, - Variant34143, - Variant34144, - Variant34145, - Variant34146, - Variant34147, - Variant34148, - Variant34149, - Variant34150, - Variant34151, - Variant34152, - Variant34153, - Variant34154, - Variant34155, - Variant34156, - Variant34157, - Variant34158, - Variant34159, - Variant34160, - Variant34161, - Variant34162, - Variant34163, - Variant34164, - Variant34165, - Variant34166, - Variant34167, - Variant34168, - Variant34169, - Variant34170, - Variant34171, - Variant34172, - Variant34173, - Variant34174, - Variant34175, - Variant34176, - Variant34177, - Variant34178, - Variant34179, - Variant34180, - Variant34181, - Variant34182, - Variant34183, - Variant34184, - Variant34185, - Variant34186, - Variant34187, - Variant34188, - Variant34189, - Variant34190, - Variant34191, - Variant34192, - Variant34193, - Variant34194, - Variant34195, - Variant34196, - Variant34197, - Variant34198, - Variant34199, - Variant34200, - Variant34201, - Variant34202, - Variant34203, - Variant34204, - Variant34205, - Variant34206, - Variant34207, - Variant34208, - Variant34209, - Variant34210, - Variant34211, - Variant34212, - Variant34213, - Variant34214, - Variant34215, - Variant34216, - Variant34217, - Variant34218, - Variant34219, - Variant34220, - Variant34221, - Variant34222, - Variant34223, - Variant34224, - Variant34225, - Variant34226, - Variant34227, - Variant34228, - Variant34229, - Variant34230, - Variant34231, - Variant34232, - Variant34233, - Variant34234, - Variant34235, - Variant34236, - Variant34237, - Variant34238, - Variant34239, - Variant34240, - Variant34241, - Variant34242, - Variant34243, - Variant34244, - Variant34245, - Variant34246, - Variant34247, - Variant34248, - Variant34249, - Variant34250, - Variant34251, - Variant34252, - Variant34253, - Variant34254, - Variant34255, - Variant34256, - Variant34257, - Variant34258, - Variant34259, - Variant34260, - Variant34261, - Variant34262, - Variant34263, - Variant34264, - Variant34265, - Variant34266, - Variant34267, - Variant34268, - Variant34269, - Variant34270, - Variant34271, - Variant34272, - Variant34273, - Variant34274, - Variant34275, - Variant34276, - Variant34277, - Variant34278, - Variant34279, - Variant34280, - Variant34281, - Variant34282, - Variant34283, - Variant34284, - Variant34285, - Variant34286, - Variant34287, - Variant34288, - Variant34289, - Variant34290, - Variant34291, - Variant34292, - Variant34293, - Variant34294, - Variant34295, - Variant34296, - Variant34297, - Variant34298, - Variant34299, - Variant34300, - Variant34301, - Variant34302, - Variant34303, - Variant34304, - Variant34305, - Variant34306, - Variant34307, - Variant34308, - Variant34309, - Variant34310, - Variant34311, - Variant34312, - Variant34313, - Variant34314, - Variant34315, - Variant34316, - Variant34317, - Variant34318, - Variant34319, - Variant34320, - Variant34321, - Variant34322, - Variant34323, - Variant34324, - Variant34325, - Variant34326, - Variant34327, - Variant34328, - Variant34329, - Variant34330, - Variant34331, - Variant34332, - Variant34333, - Variant34334, - Variant34335, - Variant34336, - Variant34337, - Variant34338, - Variant34339, - Variant34340, - Variant34341, - Variant34342, - Variant34343, - Variant34344, - Variant34345, - Variant34346, - Variant34347, - Variant34348, - Variant34349, - Variant34350, - Variant34351, - Variant34352, - Variant34353, - Variant34354, - Variant34355, - Variant34356, - Variant34357, - Variant34358, - Variant34359, - Variant34360, - Variant34361, - Variant34362, - Variant34363, - Variant34364, - Variant34365, - Variant34366, - Variant34367, - Variant34368, - Variant34369, - Variant34370, - Variant34371, - Variant34372, - Variant34373, - Variant34374, - Variant34375, - Variant34376, - Variant34377, - Variant34378, - Variant34379, - Variant34380, - Variant34381, - Variant34382, - Variant34383, - Variant34384, - Variant34385, - Variant34386, - Variant34387, - Variant34388, - Variant34389, - Variant34390, - Variant34391, - Variant34392, - Variant34393, - Variant34394, - Variant34395, - Variant34396, - Variant34397, - Variant34398, - Variant34399, - Variant34400, - Variant34401, - Variant34402, - Variant34403, - Variant34404, - Variant34405, - Variant34406, - Variant34407, - Variant34408, - Variant34409, - Variant34410, - Variant34411, - Variant34412, - Variant34413, - Variant34414, - Variant34415, - Variant34416, - Variant34417, - Variant34418, - Variant34419, - Variant34420, - Variant34421, - Variant34422, - Variant34423, - Variant34424, - Variant34425, - Variant34426, - Variant34427, - Variant34428, - Variant34429, - Variant34430, - Variant34431, - Variant34432, - Variant34433, - Variant34434, - Variant34435, - Variant34436, - Variant34437, - Variant34438, - Variant34439, - Variant34440, - Variant34441, - Variant34442, - Variant34443, - Variant34444, - Variant34445, - Variant34446, - Variant34447, - Variant34448, - Variant34449, - Variant34450, - Variant34451, - Variant34452, - Variant34453, - Variant34454, - Variant34455, - Variant34456, - Variant34457, - Variant34458, - Variant34459, - Variant34460, - Variant34461, - Variant34462, - Variant34463, - Variant34464, - Variant34465, - Variant34466, - Variant34467, - Variant34468, - Variant34469, - Variant34470, - Variant34471, - Variant34472, - Variant34473, - Variant34474, - Variant34475, - Variant34476, - Variant34477, - Variant34478, - Variant34479, - Variant34480, - Variant34481, - Variant34482, - Variant34483, - Variant34484, - Variant34485, - Variant34486, - Variant34487, - Variant34488, - Variant34489, - Variant34490, - Variant34491, - Variant34492, - Variant34493, - Variant34494, - Variant34495, - Variant34496, - Variant34497, - Variant34498, - Variant34499, - Variant34500, - Variant34501, - Variant34502, - Variant34503, - Variant34504, - Variant34505, - Variant34506, - Variant34507, - Variant34508, - Variant34509, - Variant34510, - Variant34511, - Variant34512, - Variant34513, - Variant34514, - Variant34515, - Variant34516, - Variant34517, - Variant34518, - Variant34519, - Variant34520, - Variant34521, - Variant34522, - Variant34523, - Variant34524, - Variant34525, - Variant34526, - Variant34527, - Variant34528, - Variant34529, - Variant34530, - Variant34531, - Variant34532, - Variant34533, - Variant34534, - Variant34535, - Variant34536, - Variant34537, - Variant34538, - Variant34539, - Variant34540, - Variant34541, - Variant34542, - Variant34543, - Variant34544, - Variant34545, - Variant34546, - Variant34547, - Variant34548, - Variant34549, - Variant34550, - Variant34551, - Variant34552, - Variant34553, - Variant34554, - Variant34555, - Variant34556, - Variant34557, - Variant34558, - Variant34559, - Variant34560, - Variant34561, - Variant34562, - Variant34563, - Variant34564, - Variant34565, - Variant34566, - Variant34567, - Variant34568, - Variant34569, - Variant34570, - Variant34571, - Variant34572, - Variant34573, - Variant34574, - Variant34575, - Variant34576, - Variant34577, - Variant34578, - Variant34579, - Variant34580, - Variant34581, - Variant34582, - Variant34583, - Variant34584, - Variant34585, - Variant34586, - Variant34587, - Variant34588, - Variant34589, - Variant34590, - Variant34591, - Variant34592, - Variant34593, - Variant34594, - Variant34595, - Variant34596, - Variant34597, - Variant34598, - Variant34599, - Variant34600, - Variant34601, - Variant34602, - Variant34603, - Variant34604, - Variant34605, - Variant34606, - Variant34607, - Variant34608, - Variant34609, - Variant34610, - Variant34611, - Variant34612, - Variant34613, - Variant34614, - Variant34615, - Variant34616, - Variant34617, - Variant34618, - Variant34619, - Variant34620, - Variant34621, - Variant34622, - Variant34623, - Variant34624, - Variant34625, - Variant34626, - Variant34627, - Variant34628, - Variant34629, - Variant34630, - Variant34631, - Variant34632, - Variant34633, - Variant34634, - Variant34635, - Variant34636, - Variant34637, - Variant34638, - Variant34639, - Variant34640, - Variant34641, - Variant34642, - Variant34643, - Variant34644, - Variant34645, - Variant34646, - Variant34647, - Variant34648, - Variant34649, - Variant34650, - Variant34651, - Variant34652, - Variant34653, - Variant34654, - Variant34655, - Variant34656, - Variant34657, - Variant34658, - Variant34659, - Variant34660, - Variant34661, - Variant34662, - Variant34663, - Variant34664, - Variant34665, - Variant34666, - Variant34667, - Variant34668, - Variant34669, - Variant34670, - Variant34671, - Variant34672, - Variant34673, - Variant34674, - Variant34675, - Variant34676, - Variant34677, - Variant34678, - Variant34679, - Variant34680, - Variant34681, - Variant34682, - Variant34683, - Variant34684, - Variant34685, - Variant34686, - Variant34687, - Variant34688, - Variant34689, - Variant34690, - Variant34691, - Variant34692, - Variant34693, - Variant34694, - Variant34695, - Variant34696, - Variant34697, - Variant34698, - Variant34699, - Variant34700, - Variant34701, - Variant34702, - Variant34703, - Variant34704, - Variant34705, - Variant34706, - Variant34707, - Variant34708, - Variant34709, - Variant34710, - Variant34711, - Variant34712, - Variant34713, - Variant34714, - Variant34715, - Variant34716, - Variant34717, - Variant34718, - Variant34719, - Variant34720, - Variant34721, - Variant34722, - Variant34723, - Variant34724, - Variant34725, - Variant34726, - Variant34727, - Variant34728, - Variant34729, - Variant34730, - Variant34731, - Variant34732, - Variant34733, - Variant34734, - Variant34735, - Variant34736, - Variant34737, - Variant34738, - Variant34739, - Variant34740, - Variant34741, - Variant34742, - Variant34743, - Variant34744, - Variant34745, - Variant34746, - Variant34747, - Variant34748, - Variant34749, - Variant34750, - Variant34751, - Variant34752, - Variant34753, - Variant34754, - Variant34755, - Variant34756, - Variant34757, - Variant34758, - Variant34759, - Variant34760, - Variant34761, - Variant34762, - Variant34763, - Variant34764, - Variant34765, - Variant34766, - Variant34767, - Variant34768, - Variant34769, - Variant34770, - Variant34771, - Variant34772, - Variant34773, - Variant34774, - Variant34775, - Variant34776, - Variant34777, - Variant34778, - Variant34779, - Variant34780, - Variant34781, - Variant34782, - Variant34783, - Variant34784, - Variant34785, - Variant34786, - Variant34787, - Variant34788, - Variant34789, - Variant34790, - Variant34791, - Variant34792, - Variant34793, - Variant34794, - Variant34795, - Variant34796, - Variant34797, - Variant34798, - Variant34799, - Variant34800, - Variant34801, - Variant34802, - Variant34803, - Variant34804, - Variant34805, - Variant34806, - Variant34807, - Variant34808, - Variant34809, - Variant34810, - Variant34811, - Variant34812, - Variant34813, - Variant34814, - Variant34815, - Variant34816, - Variant34817, - Variant34818, - Variant34819, - Variant34820, - Variant34821, - Variant34822, - Variant34823, - Variant34824, - Variant34825, - Variant34826, - Variant34827, - Variant34828, - Variant34829, - Variant34830, - Variant34831, - Variant34832, - Variant34833, - Variant34834, - Variant34835, - Variant34836, - Variant34837, - Variant34838, - Variant34839, - Variant34840, - Variant34841, - Variant34842, - Variant34843, - Variant34844, - Variant34845, - Variant34846, - Variant34847, - Variant34848, - Variant34849, - Variant34850, - Variant34851, - Variant34852, - Variant34853, - Variant34854, - Variant34855, - Variant34856, - Variant34857, - Variant34858, - Variant34859, - Variant34860, - Variant34861, - Variant34862, - Variant34863, - Variant34864, - Variant34865, - Variant34866, - Variant34867, - Variant34868, - Variant34869, - Variant34870, - Variant34871, - Variant34872, - Variant34873, - Variant34874, - Variant34875, - Variant34876, - Variant34877, - Variant34878, - Variant34879, - Variant34880, - Variant34881, - Variant34882, - Variant34883, - Variant34884, - Variant34885, - Variant34886, - Variant34887, - Variant34888, - Variant34889, - Variant34890, - Variant34891, - Variant34892, - Variant34893, - Variant34894, - Variant34895, - Variant34896, - Variant34897, - Variant34898, - Variant34899, - Variant34900, - Variant34901, - Variant34902, - Variant34903, - Variant34904, - Variant34905, - Variant34906, - Variant34907, - Variant34908, - Variant34909, - Variant34910, - Variant34911, - Variant34912, - Variant34913, - Variant34914, - Variant34915, - Variant34916, - Variant34917, - Variant34918, - Variant34919, - Variant34920, - Variant34921, - Variant34922, - Variant34923, - Variant34924, - Variant34925, - Variant34926, - Variant34927, - Variant34928, - Variant34929, - Variant34930, - Variant34931, - Variant34932, - Variant34933, - Variant34934, - Variant34935, - Variant34936, - Variant34937, - Variant34938, - Variant34939, - Variant34940, - Variant34941, - Variant34942, - Variant34943, - Variant34944, - Variant34945, - Variant34946, - Variant34947, - Variant34948, - Variant34949, - Variant34950, - Variant34951, - Variant34952, - Variant34953, - Variant34954, - Variant34955, - Variant34956, - Variant34957, - Variant34958, - Variant34959, - Variant34960, - Variant34961, - Variant34962, - Variant34963, - Variant34964, - Variant34965, - Variant34966, - Variant34967, - Variant34968, - Variant34969, - Variant34970, - Variant34971, - Variant34972, - Variant34973, - Variant34974, - Variant34975, - Variant34976, - Variant34977, - Variant34978, - Variant34979, - Variant34980, - Variant34981, - Variant34982, - Variant34983, - Variant34984, - Variant34985, - Variant34986, - Variant34987, - Variant34988, - Variant34989, - Variant34990, - Variant34991, - Variant34992, - Variant34993, - Variant34994, - Variant34995, - Variant34996, - Variant34997, - Variant34998, - Variant34999, - Variant35000, - Variant35001, - Variant35002, - Variant35003, - Variant35004, - Variant35005, - Variant35006, - Variant35007, - Variant35008, - Variant35009, - Variant35010, - Variant35011, - Variant35012, - Variant35013, - Variant35014, - Variant35015, - Variant35016, - Variant35017, - Variant35018, - Variant35019, - Variant35020, - Variant35021, - Variant35022, - Variant35023, - Variant35024, - Variant35025, - Variant35026, - Variant35027, - Variant35028, - Variant35029, - Variant35030, - Variant35031, - Variant35032, - Variant35033, - Variant35034, - Variant35035, - Variant35036, - Variant35037, - Variant35038, - Variant35039, - Variant35040, - Variant35041, - Variant35042, - Variant35043, - Variant35044, - Variant35045, - Variant35046, - Variant35047, - Variant35048, - Variant35049, - Variant35050, - Variant35051, - Variant35052, - Variant35053, - Variant35054, - Variant35055, - Variant35056, - Variant35057, - Variant35058, - Variant35059, - Variant35060, - Variant35061, - Variant35062, - Variant35063, - Variant35064, - Variant35065, - Variant35066, - Variant35067, - Variant35068, - Variant35069, - Variant35070, - Variant35071, - Variant35072, - Variant35073, - Variant35074, - Variant35075, - Variant35076, - Variant35077, - Variant35078, - Variant35079, - Variant35080, - Variant35081, - Variant35082, - Variant35083, - Variant35084, - Variant35085, - Variant35086, - Variant35087, - Variant35088, - Variant35089, - Variant35090, - Variant35091, - Variant35092, - Variant35093, - Variant35094, - Variant35095, - Variant35096, - Variant35097, - Variant35098, - Variant35099, - Variant35100, - Variant35101, - Variant35102, - Variant35103, - Variant35104, - Variant35105, - Variant35106, - Variant35107, - Variant35108, - Variant35109, - Variant35110, - Variant35111, - Variant35112, - Variant35113, - Variant35114, - Variant35115, - Variant35116, - Variant35117, - Variant35118, - Variant35119, - Variant35120, - Variant35121, - Variant35122, - Variant35123, - Variant35124, - Variant35125, - Variant35126, - Variant35127, - Variant35128, - Variant35129, - Variant35130, - Variant35131, - Variant35132, - Variant35133, - Variant35134, - Variant35135, - Variant35136, - Variant35137, - Variant35138, - Variant35139, - Variant35140, - Variant35141, - Variant35142, - Variant35143, - Variant35144, - Variant35145, - Variant35146, - Variant35147, - Variant35148, - Variant35149, - Variant35150, - Variant35151, - Variant35152, - Variant35153, - Variant35154, - Variant35155, - Variant35156, - Variant35157, - Variant35158, - Variant35159, - Variant35160, - Variant35161, - Variant35162, - Variant35163, - Variant35164, - Variant35165, - Variant35166, - Variant35167, - Variant35168, - Variant35169, - Variant35170, - Variant35171, - Variant35172, - Variant35173, - Variant35174, - Variant35175, - Variant35176, - Variant35177, - Variant35178, - Variant35179, - Variant35180, - Variant35181, - Variant35182, - Variant35183, - Variant35184, - Variant35185, - Variant35186, - Variant35187, - Variant35188, - Variant35189, - Variant35190, - Variant35191, - Variant35192, - Variant35193, - Variant35194, - Variant35195, - Variant35196, - Variant35197, - Variant35198, - Variant35199, - Variant35200, - Variant35201, - Variant35202, - Variant35203, - Variant35204, - Variant35205, - Variant35206, - Variant35207, - Variant35208, - Variant35209, - Variant35210, - Variant35211, - Variant35212, - Variant35213, - Variant35214, - Variant35215, - Variant35216, - Variant35217, - Variant35218, - Variant35219, - Variant35220, - Variant35221, - Variant35222, - Variant35223, - Variant35224, - Variant35225, - Variant35226, - Variant35227, - Variant35228, - Variant35229, - Variant35230, - Variant35231, - Variant35232, - Variant35233, - Variant35234, - Variant35235, - Variant35236, - Variant35237, - Variant35238, - Variant35239, - Variant35240, - Variant35241, - Variant35242, - Variant35243, - Variant35244, - Variant35245, - Variant35246, - Variant35247, - Variant35248, - Variant35249, - Variant35250, - Variant35251, - Variant35252, - Variant35253, - Variant35254, - Variant35255, - Variant35256, - Variant35257, - Variant35258, - Variant35259, - Variant35260, - Variant35261, - Variant35262, - Variant35263, - Variant35264, - Variant35265, - Variant35266, - Variant35267, - Variant35268, - Variant35269, - Variant35270, - Variant35271, - Variant35272, - Variant35273, - Variant35274, - Variant35275, - Variant35276, - Variant35277, - Variant35278, - Variant35279, - Variant35280, - Variant35281, - Variant35282, - Variant35283, - Variant35284, - Variant35285, - Variant35286, - Variant35287, - Variant35288, - Variant35289, - Variant35290, - Variant35291, - Variant35292, - Variant35293, - Variant35294, - Variant35295, - Variant35296, - Variant35297, - Variant35298, - Variant35299, - Variant35300, - Variant35301, - Variant35302, - Variant35303, - Variant35304, - Variant35305, - Variant35306, - Variant35307, - Variant35308, - Variant35309, - Variant35310, - Variant35311, - Variant35312, - Variant35313, - Variant35314, - Variant35315, - Variant35316, - Variant35317, - Variant35318, - Variant35319, - Variant35320, - Variant35321, - Variant35322, - Variant35323, - Variant35324, - Variant35325, - Variant35326, - Variant35327, - Variant35328, - Variant35329, - Variant35330, - Variant35331, - Variant35332, - Variant35333, - Variant35334, - Variant35335, - Variant35336, - Variant35337, - Variant35338, - Variant35339, - Variant35340, - Variant35341, - Variant35342, - Variant35343, - Variant35344, - Variant35345, - Variant35346, - Variant35347, - Variant35348, - Variant35349, - Variant35350, - Variant35351, - Variant35352, - Variant35353, - Variant35354, - Variant35355, - Variant35356, - Variant35357, - Variant35358, - Variant35359, - Variant35360, - Variant35361, - Variant35362, - Variant35363, - Variant35364, - Variant35365, - Variant35366, - Variant35367, - Variant35368, - Variant35369, - Variant35370, - Variant35371, - Variant35372, - Variant35373, - Variant35374, - Variant35375, - Variant35376, - Variant35377, - Variant35378, - Variant35379, - Variant35380, - Variant35381, - Variant35382, - Variant35383, - Variant35384, - Variant35385, - Variant35386, - Variant35387, - Variant35388, - Variant35389, - Variant35390, - Variant35391, - Variant35392, - Variant35393, - Variant35394, - Variant35395, - Variant35396, - Variant35397, - Variant35398, - Variant35399, - Variant35400, - Variant35401, - Variant35402, - Variant35403, - Variant35404, - Variant35405, - Variant35406, - Variant35407, - Variant35408, - Variant35409, - Variant35410, - Variant35411, - Variant35412, - Variant35413, - Variant35414, - Variant35415, - Variant35416, - Variant35417, - Variant35418, - Variant35419, - Variant35420, - Variant35421, - Variant35422, - Variant35423, - Variant35424, - Variant35425, - Variant35426, - Variant35427, - Variant35428, - Variant35429, - Variant35430, - Variant35431, - Variant35432, - Variant35433, - Variant35434, - Variant35435, - Variant35436, - Variant35437, - Variant35438, - Variant35439, - Variant35440, - Variant35441, - Variant35442, - Variant35443, - Variant35444, - Variant35445, - Variant35446, - Variant35447, - Variant35448, - Variant35449, - Variant35450, - Variant35451, - Variant35452, - Variant35453, - Variant35454, - Variant35455, - Variant35456, - Variant35457, - Variant35458, - Variant35459, - Variant35460, - Variant35461, - Variant35462, - Variant35463, - Variant35464, - Variant35465, - Variant35466, - Variant35467, - Variant35468, - Variant35469, - Variant35470, - Variant35471, - Variant35472, - Variant35473, - Variant35474, - Variant35475, - Variant35476, - Variant35477, - Variant35478, - Variant35479, - Variant35480, - Variant35481, - Variant35482, - Variant35483, - Variant35484, - Variant35485, - Variant35486, - Variant35487, - Variant35488, - Variant35489, - Variant35490, - Variant35491, - Variant35492, - Variant35493, - Variant35494, - Variant35495, - Variant35496, - Variant35497, - Variant35498, - Variant35499, - Variant35500, - Variant35501, - Variant35502, - Variant35503, - Variant35504, - Variant35505, - Variant35506, - Variant35507, - Variant35508, - Variant35509, - Variant35510, - Variant35511, - Variant35512, - Variant35513, - Variant35514, - Variant35515, - Variant35516, - Variant35517, - Variant35518, - Variant35519, - Variant35520, - Variant35521, - Variant35522, - Variant35523, - Variant35524, - Variant35525, - Variant35526, - Variant35527, - Variant35528, - Variant35529, - Variant35530, - Variant35531, - Variant35532, - Variant35533, - Variant35534, - Variant35535, - Variant35536, - Variant35537, - Variant35538, - Variant35539, - Variant35540, - Variant35541, - Variant35542, - Variant35543, - Variant35544, - Variant35545, - Variant35546, - Variant35547, - Variant35548, - Variant35549, - Variant35550, - Variant35551, - Variant35552, - Variant35553, - Variant35554, - Variant35555, - Variant35556, - Variant35557, - Variant35558, - Variant35559, - Variant35560, - Variant35561, - Variant35562, - Variant35563, - Variant35564, - Variant35565, - Variant35566, - Variant35567, - Variant35568, - Variant35569, - Variant35570, - Variant35571, - Variant35572, - Variant35573, - Variant35574, - Variant35575, - Variant35576, - Variant35577, - Variant35578, - Variant35579, - Variant35580, - Variant35581, - Variant35582, - Variant35583, - Variant35584, - Variant35585, - Variant35586, - Variant35587, - Variant35588, - Variant35589, - Variant35590, - Variant35591, - Variant35592, - Variant35593, - Variant35594, - Variant35595, - Variant35596, - Variant35597, - Variant35598, - Variant35599, - Variant35600, - Variant35601, - Variant35602, - Variant35603, - Variant35604, - Variant35605, - Variant35606, - Variant35607, - Variant35608, - Variant35609, - Variant35610, - Variant35611, - Variant35612, - Variant35613, - Variant35614, - Variant35615, - Variant35616, - Variant35617, - Variant35618, - Variant35619, - Variant35620, - Variant35621, - Variant35622, - Variant35623, - Variant35624, - Variant35625, - Variant35626, - Variant35627, - Variant35628, - Variant35629, - Variant35630, - Variant35631, - Variant35632, - Variant35633, - Variant35634, - Variant35635, - Variant35636, - Variant35637, - Variant35638, - Variant35639, - Variant35640, - Variant35641, - Variant35642, - Variant35643, - Variant35644, - Variant35645, - Variant35646, - Variant35647, - Variant35648, - Variant35649, - Variant35650, - Variant35651, - Variant35652, - Variant35653, - Variant35654, - Variant35655, - Variant35656, - Variant35657, - Variant35658, - Variant35659, - Variant35660, - Variant35661, - Variant35662, - Variant35663, - Variant35664, - Variant35665, - Variant35666, - Variant35667, - Variant35668, - Variant35669, - Variant35670, - Variant35671, - Variant35672, - Variant35673, - Variant35674, - Variant35675, - Variant35676, - Variant35677, - Variant35678, - Variant35679, - Variant35680, - Variant35681, - Variant35682, - Variant35683, - Variant35684, - Variant35685, - Variant35686, - Variant35687, - Variant35688, - Variant35689, - Variant35690, - Variant35691, - Variant35692, - Variant35693, - Variant35694, - Variant35695, - Variant35696, - Variant35697, - Variant35698, - Variant35699, - Variant35700, - Variant35701, - Variant35702, - Variant35703, - Variant35704, - Variant35705, - Variant35706, - Variant35707, - Variant35708, - Variant35709, - Variant35710, - Variant35711, - Variant35712, - Variant35713, - Variant35714, - Variant35715, - Variant35716, - Variant35717, - Variant35718, - Variant35719, - Variant35720, - Variant35721, - Variant35722, - Variant35723, - Variant35724, - Variant35725, - Variant35726, - Variant35727, - Variant35728, - Variant35729, - Variant35730, - Variant35731, - Variant35732, - Variant35733, - Variant35734, - Variant35735, - Variant35736, - Variant35737, - Variant35738, - Variant35739, - Variant35740, - Variant35741, - Variant35742, - Variant35743, - Variant35744, - Variant35745, - Variant35746, - Variant35747, - Variant35748, - Variant35749, - Variant35750, - Variant35751, - Variant35752, - Variant35753, - Variant35754, - Variant35755, - Variant35756, - Variant35757, - Variant35758, - Variant35759, - Variant35760, - Variant35761, - Variant35762, - Variant35763, - Variant35764, - Variant35765, - Variant35766, - Variant35767, - Variant35768, - Variant35769, - Variant35770, - Variant35771, - Variant35772, - Variant35773, - Variant35774, - Variant35775, - Variant35776, - Variant35777, - Variant35778, - Variant35779, - Variant35780, - Variant35781, - Variant35782, - Variant35783, - Variant35784, - Variant35785, - Variant35786, - Variant35787, - Variant35788, - Variant35789, - Variant35790, - Variant35791, - Variant35792, - Variant35793, - Variant35794, - Variant35795, - Variant35796, - Variant35797, - Variant35798, - Variant35799, - Variant35800, - Variant35801, - Variant35802, - Variant35803, - Variant35804, - Variant35805, - Variant35806, - Variant35807, - Variant35808, - Variant35809, - Variant35810, - Variant35811, - Variant35812, - Variant35813, - Variant35814, - Variant35815, - Variant35816, - Variant35817, - Variant35818, - Variant35819, - Variant35820, - Variant35821, - Variant35822, - Variant35823, - Variant35824, - Variant35825, - Variant35826, - Variant35827, - Variant35828, - Variant35829, - Variant35830, - Variant35831, - Variant35832, - Variant35833, - Variant35834, - Variant35835, - Variant35836, - Variant35837, - Variant35838, - Variant35839, - Variant35840, - Variant35841, - Variant35842, - Variant35843, - Variant35844, - Variant35845, - Variant35846, - Variant35847, - Variant35848, - Variant35849, - Variant35850, - Variant35851, - Variant35852, - Variant35853, - Variant35854, - Variant35855, - Variant35856, - Variant35857, - Variant35858, - Variant35859, - Variant35860, - Variant35861, - Variant35862, - Variant35863, - Variant35864, - Variant35865, - Variant35866, - Variant35867, - Variant35868, - Variant35869, - Variant35870, - Variant35871, - Variant35872, - Variant35873, - Variant35874, - Variant35875, - Variant35876, - Variant35877, - Variant35878, - Variant35879, - Variant35880, - Variant35881, - Variant35882, - Variant35883, - Variant35884, - Variant35885, - Variant35886, - Variant35887, - Variant35888, - Variant35889, - Variant35890, - Variant35891, - Variant35892, - Variant35893, - Variant35894, - Variant35895, - Variant35896, - Variant35897, - Variant35898, - Variant35899, - Variant35900, - Variant35901, - Variant35902, - Variant35903, - Variant35904, - Variant35905, - Variant35906, - Variant35907, - Variant35908, - Variant35909, - Variant35910, - Variant35911, - Variant35912, - Variant35913, - Variant35914, - Variant35915, - Variant35916, - Variant35917, - Variant35918, - Variant35919, - Variant35920, - Variant35921, - Variant35922, - Variant35923, - Variant35924, - Variant35925, - Variant35926, - Variant35927, - Variant35928, - Variant35929, - Variant35930, - Variant35931, - Variant35932, - Variant35933, - Variant35934, - Variant35935, - Variant35936, - Variant35937, - Variant35938, - Variant35939, - Variant35940, - Variant35941, - Variant35942, - Variant35943, - Variant35944, - Variant35945, - Variant35946, - Variant35947, - Variant35948, - Variant35949, - Variant35950, - Variant35951, - Variant35952, - Variant35953, - Variant35954, - Variant35955, - Variant35956, - Variant35957, - Variant35958, - Variant35959, - Variant35960, - Variant35961, - Variant35962, - Variant35963, - Variant35964, - Variant35965, - Variant35966, - Variant35967, - Variant35968, - Variant35969, - Variant35970, - Variant35971, - Variant35972, - Variant35973, - Variant35974, - Variant35975, - Variant35976, - Variant35977, - Variant35978, - Variant35979, - Variant35980, - Variant35981, - Variant35982, - Variant35983, - Variant35984, - Variant35985, - Variant35986, - Variant35987, - Variant35988, - Variant35989, - Variant35990, - Variant35991, - Variant35992, - Variant35993, - Variant35994, - Variant35995, - Variant35996, - Variant35997, - Variant35998, - Variant35999, - Variant36000, - Variant36001, - Variant36002, - Variant36003, - Variant36004, - Variant36005, - Variant36006, - Variant36007, - Variant36008, - Variant36009, - Variant36010, - Variant36011, - Variant36012, - Variant36013, - Variant36014, - Variant36015, - Variant36016, - Variant36017, - Variant36018, - Variant36019, - Variant36020, - Variant36021, - Variant36022, - Variant36023, - Variant36024, - Variant36025, - Variant36026, - Variant36027, - Variant36028, - Variant36029, - Variant36030, - Variant36031, - Variant36032, - Variant36033, - Variant36034, - Variant36035, - Variant36036, - Variant36037, - Variant36038, - Variant36039, - Variant36040, - Variant36041, - Variant36042, - Variant36043, - Variant36044, - Variant36045, - Variant36046, - Variant36047, - Variant36048, - Variant36049, - Variant36050, - Variant36051, - Variant36052, - Variant36053, - Variant36054, - Variant36055, - Variant36056, - Variant36057, - Variant36058, - Variant36059, - Variant36060, - Variant36061, - Variant36062, - Variant36063, - Variant36064, - Variant36065, - Variant36066, - Variant36067, - Variant36068, - Variant36069, - Variant36070, - Variant36071, - Variant36072, - Variant36073, - Variant36074, - Variant36075, - Variant36076, - Variant36077, - Variant36078, - Variant36079, - Variant36080, - Variant36081, - Variant36082, - Variant36083, - Variant36084, - Variant36085, - Variant36086, - Variant36087, - Variant36088, - Variant36089, - Variant36090, - Variant36091, - Variant36092, - Variant36093, - Variant36094, - Variant36095, - Variant36096, - Variant36097, - Variant36098, - Variant36099, - Variant36100, - Variant36101, - Variant36102, - Variant36103, - Variant36104, - Variant36105, - Variant36106, - Variant36107, - Variant36108, - Variant36109, - Variant36110, - Variant36111, - Variant36112, - Variant36113, - Variant36114, - Variant36115, - Variant36116, - Variant36117, - Variant36118, - Variant36119, - Variant36120, - Variant36121, - Variant36122, - Variant36123, - Variant36124, - Variant36125, - Variant36126, - Variant36127, - Variant36128, - Variant36129, - Variant36130, - Variant36131, - Variant36132, - Variant36133, - Variant36134, - Variant36135, - Variant36136, - Variant36137, - Variant36138, - Variant36139, - Variant36140, - Variant36141, - Variant36142, - Variant36143, - Variant36144, - Variant36145, - Variant36146, - Variant36147, - Variant36148, - Variant36149, - Variant36150, - Variant36151, - Variant36152, - Variant36153, - Variant36154, - Variant36155, - Variant36156, - Variant36157, - Variant36158, - Variant36159, - Variant36160, - Variant36161, - Variant36162, - Variant36163, - Variant36164, - Variant36165, - Variant36166, - Variant36167, - Variant36168, - Variant36169, - Variant36170, - Variant36171, - Variant36172, - Variant36173, - Variant36174, - Variant36175, - Variant36176, - Variant36177, - Variant36178, - Variant36179, - Variant36180, - Variant36181, - Variant36182, - Variant36183, - Variant36184, - Variant36185, - Variant36186, - Variant36187, - Variant36188, - Variant36189, - Variant36190, - Variant36191, - Variant36192, - Variant36193, - Variant36194, - Variant36195, - Variant36196, - Variant36197, - Variant36198, - Variant36199, - Variant36200, - Variant36201, - Variant36202, - Variant36203, - Variant36204, - Variant36205, - Variant36206, - Variant36207, - Variant36208, - Variant36209, - Variant36210, - Variant36211, - Variant36212, - Variant36213, - Variant36214, - Variant36215, - Variant36216, - Variant36217, - Variant36218, - Variant36219, - Variant36220, - Variant36221, - Variant36222, - Variant36223, - Variant36224, - Variant36225, - Variant36226, - Variant36227, - Variant36228, - Variant36229, - Variant36230, - Variant36231, - Variant36232, - Variant36233, - Variant36234, - Variant36235, - Variant36236, - Variant36237, - Variant36238, - Variant36239, - Variant36240, - Variant36241, - Variant36242, - Variant36243, - Variant36244, - Variant36245, - Variant36246, - Variant36247, - Variant36248, - Variant36249, - Variant36250, - Variant36251, - Variant36252, - Variant36253, - Variant36254, - Variant36255, - Variant36256, - Variant36257, - Variant36258, - Variant36259, - Variant36260, - Variant36261, - Variant36262, - Variant36263, - Variant36264, - Variant36265, - Variant36266, - Variant36267, - Variant36268, - Variant36269, - Variant36270, - Variant36271, - Variant36272, - Variant36273, - Variant36274, - Variant36275, - Variant36276, - Variant36277, - Variant36278, - Variant36279, - Variant36280, - Variant36281, - Variant36282, - Variant36283, - Variant36284, - Variant36285, - Variant36286, - Variant36287, - Variant36288, - Variant36289, - Variant36290, - Variant36291, - Variant36292, - Variant36293, - Variant36294, - Variant36295, - Variant36296, - Variant36297, - Variant36298, - Variant36299, - Variant36300, - Variant36301, - Variant36302, - Variant36303, - Variant36304, - Variant36305, - Variant36306, - Variant36307, - Variant36308, - Variant36309, - Variant36310, - Variant36311, - Variant36312, - Variant36313, - Variant36314, - Variant36315, - Variant36316, - Variant36317, - Variant36318, - Variant36319, - Variant36320, - Variant36321, - Variant36322, - Variant36323, - Variant36324, - Variant36325, - Variant36326, - Variant36327, - Variant36328, - Variant36329, - Variant36330, - Variant36331, - Variant36332, - Variant36333, - Variant36334, - Variant36335, - Variant36336, - Variant36337, - Variant36338, - Variant36339, - Variant36340, - Variant36341, - Variant36342, - Variant36343, - Variant36344, - Variant36345, - Variant36346, - Variant36347, - Variant36348, - Variant36349, - Variant36350, - Variant36351, - Variant36352, - Variant36353, - Variant36354, - Variant36355, - Variant36356, - Variant36357, - Variant36358, - Variant36359, - Variant36360, - Variant36361, - Variant36362, - Variant36363, - Variant36364, - Variant36365, - Variant36366, - Variant36367, - Variant36368, - Variant36369, - Variant36370, - Variant36371, - Variant36372, - Variant36373, - Variant36374, - Variant36375, - Variant36376, - Variant36377, - Variant36378, - Variant36379, - Variant36380, - Variant36381, - Variant36382, - Variant36383, - Variant36384, - Variant36385, - Variant36386, - Variant36387, - Variant36388, - Variant36389, - Variant36390, - Variant36391, - Variant36392, - Variant36393, - Variant36394, - Variant36395, - Variant36396, - Variant36397, - Variant36398, - Variant36399, - Variant36400, - Variant36401, - Variant36402, - Variant36403, - Variant36404, - Variant36405, - Variant36406, - Variant36407, - Variant36408, - Variant36409, - Variant36410, - Variant36411, - Variant36412, - Variant36413, - Variant36414, - Variant36415, - Variant36416, - Variant36417, - Variant36418, - Variant36419, - Variant36420, - Variant36421, - Variant36422, - Variant36423, - Variant36424, - Variant36425, - Variant36426, - Variant36427, - Variant36428, - Variant36429, - Variant36430, - Variant36431, - Variant36432, - Variant36433, - Variant36434, - Variant36435, - Variant36436, - Variant36437, - Variant36438, - Variant36439, - Variant36440, - Variant36441, - Variant36442, - Variant36443, - Variant36444, - Variant36445, - Variant36446, - Variant36447, - Variant36448, - Variant36449, - Variant36450, - Variant36451, - Variant36452, - Variant36453, - Variant36454, - Variant36455, - Variant36456, - Variant36457, - Variant36458, - Variant36459, - Variant36460, - Variant36461, - Variant36462, - Variant36463, - Variant36464, - Variant36465, - Variant36466, - Variant36467, - Variant36468, - Variant36469, - Variant36470, - Variant36471, - Variant36472, - Variant36473, - Variant36474, - Variant36475, - Variant36476, - Variant36477, - Variant36478, - Variant36479, - Variant36480, - Variant36481, - Variant36482, - Variant36483, - Variant36484, - Variant36485, - Variant36486, - Variant36487, - Variant36488, - Variant36489, - Variant36490, - Variant36491, - Variant36492, - Variant36493, - Variant36494, - Variant36495, - Variant36496, - Variant36497, - Variant36498, - Variant36499, - Variant36500, - Variant36501, - Variant36502, - Variant36503, - Variant36504, - Variant36505, - Variant36506, - Variant36507, - Variant36508, - Variant36509, - Variant36510, - Variant36511, - Variant36512, - Variant36513, - Variant36514, - Variant36515, - Variant36516, - Variant36517, - Variant36518, - Variant36519, - Variant36520, - Variant36521, - Variant36522, - Variant36523, - Variant36524, - Variant36525, - Variant36526, - Variant36527, - Variant36528, - Variant36529, - Variant36530, - Variant36531, - Variant36532, - Variant36533, - Variant36534, - Variant36535, - Variant36536, - Variant36537, - Variant36538, - Variant36539, - Variant36540, - Variant36541, - Variant36542, - Variant36543, - Variant36544, - Variant36545, - Variant36546, - Variant36547, - Variant36548, - Variant36549, - Variant36550, - Variant36551, - Variant36552, - Variant36553, - Variant36554, - Variant36555, - Variant36556, - Variant36557, - Variant36558, - Variant36559, - Variant36560, - Variant36561, - Variant36562, - Variant36563, - Variant36564, - Variant36565, - Variant36566, - Variant36567, - Variant36568, - Variant36569, - Variant36570, - Variant36571, - Variant36572, - Variant36573, - Variant36574, - Variant36575, - Variant36576, - Variant36577, - Variant36578, - Variant36579, - Variant36580, - Variant36581, - Variant36582, - Variant36583, - Variant36584, - Variant36585, - Variant36586, - Variant36587, - Variant36588, - Variant36589, - Variant36590, - Variant36591, - Variant36592, - Variant36593, - Variant36594, - Variant36595, - Variant36596, - Variant36597, - Variant36598, - Variant36599, - Variant36600, - Variant36601, - Variant36602, - Variant36603, - Variant36604, - Variant36605, - Variant36606, - Variant36607, - Variant36608, - Variant36609, - Variant36610, - Variant36611, - Variant36612, - Variant36613, - Variant36614, - Variant36615, - Variant36616, - Variant36617, - Variant36618, - Variant36619, - Variant36620, - Variant36621, - Variant36622, - Variant36623, - Variant36624, - Variant36625, - Variant36626, - Variant36627, - Variant36628, - Variant36629, - Variant36630, - Variant36631, - Variant36632, - Variant36633, - Variant36634, - Variant36635, - Variant36636, - Variant36637, - Variant36638, - Variant36639, - Variant36640, - Variant36641, - Variant36642, - Variant36643, - Variant36644, - Variant36645, - Variant36646, - Variant36647, - Variant36648, - Variant36649, - Variant36650, - Variant36651, - Variant36652, - Variant36653, - Variant36654, - Variant36655, - Variant36656, - Variant36657, - Variant36658, - Variant36659, - Variant36660, - Variant36661, - Variant36662, - Variant36663, - Variant36664, - Variant36665, - Variant36666, - Variant36667, - Variant36668, - Variant36669, - Variant36670, - Variant36671, - Variant36672, - Variant36673, - Variant36674, - Variant36675, - Variant36676, - Variant36677, - Variant36678, - Variant36679, - Variant36680, - Variant36681, - Variant36682, - Variant36683, - Variant36684, - Variant36685, - Variant36686, - Variant36687, - Variant36688, - Variant36689, - Variant36690, - Variant36691, - Variant36692, - Variant36693, - Variant36694, - Variant36695, - Variant36696, - Variant36697, - Variant36698, - Variant36699, - Variant36700, - Variant36701, - Variant36702, - Variant36703, - Variant36704, - Variant36705, - Variant36706, - Variant36707, - Variant36708, - Variant36709, - Variant36710, - Variant36711, - Variant36712, - Variant36713, - Variant36714, - Variant36715, - Variant36716, - Variant36717, - Variant36718, - Variant36719, - Variant36720, - Variant36721, - Variant36722, - Variant36723, - Variant36724, - Variant36725, - Variant36726, - Variant36727, - Variant36728, - Variant36729, - Variant36730, - Variant36731, - Variant36732, - Variant36733, - Variant36734, - Variant36735, - Variant36736, - Variant36737, - Variant36738, - Variant36739, - Variant36740, - Variant36741, - Variant36742, - Variant36743, - Variant36744, - Variant36745, - Variant36746, - Variant36747, - Variant36748, - Variant36749, - Variant36750, - Variant36751, - Variant36752, - Variant36753, - Variant36754, - Variant36755, - Variant36756, - Variant36757, - Variant36758, - Variant36759, - Variant36760, - Variant36761, - Variant36762, - Variant36763, - Variant36764, - Variant36765, - Variant36766, - Variant36767, - Variant36768, - Variant36769, - Variant36770, - Variant36771, - Variant36772, - Variant36773, - Variant36774, - Variant36775, - Variant36776, - Variant36777, - Variant36778, - Variant36779, - Variant36780, - Variant36781, - Variant36782, - Variant36783, - Variant36784, - Variant36785, - Variant36786, - Variant36787, - Variant36788, - Variant36789, - Variant36790, - Variant36791, - Variant36792, - Variant36793, - Variant36794, - Variant36795, - Variant36796, - Variant36797, - Variant36798, - Variant36799, - Variant36800, - Variant36801, - Variant36802, - Variant36803, - Variant36804, - Variant36805, - Variant36806, - Variant36807, - Variant36808, - Variant36809, - Variant36810, - Variant36811, - Variant36812, - Variant36813, - Variant36814, - Variant36815, - Variant36816, - Variant36817, - Variant36818, - Variant36819, - Variant36820, - Variant36821, - Variant36822, - Variant36823, - Variant36824, - Variant36825, - Variant36826, - Variant36827, - Variant36828, - Variant36829, - Variant36830, - Variant36831, - Variant36832, - Variant36833, - Variant36834, - Variant36835, - Variant36836, - Variant36837, - Variant36838, - Variant36839, - Variant36840, - Variant36841, - Variant36842, - Variant36843, - Variant36844, - Variant36845, - Variant36846, - Variant36847, - Variant36848, - Variant36849, - Variant36850, - Variant36851, - Variant36852, - Variant36853, - Variant36854, - Variant36855, - Variant36856, - Variant36857, - Variant36858, - Variant36859, - Variant36860, - Variant36861, - Variant36862, - Variant36863, - Variant36864, - Variant36865, - Variant36866, - Variant36867, - Variant36868, - Variant36869, - Variant36870, - Variant36871, - Variant36872, - Variant36873, - Variant36874, - Variant36875, - Variant36876, - Variant36877, - Variant36878, - Variant36879, - Variant36880, - Variant36881, - Variant36882, - Variant36883, - Variant36884, - Variant36885, - Variant36886, - Variant36887, - Variant36888, - Variant36889, - Variant36890, - Variant36891, - Variant36892, - Variant36893, - Variant36894, - Variant36895, - Variant36896, - Variant36897, - Variant36898, - Variant36899, - Variant36900, - Variant36901, - Variant36902, - Variant36903, - Variant36904, - Variant36905, - Variant36906, - Variant36907, - Variant36908, - Variant36909, - Variant36910, - Variant36911, - Variant36912, - Variant36913, - Variant36914, - Variant36915, - Variant36916, - Variant36917, - Variant36918, - Variant36919, - Variant36920, - Variant36921, - Variant36922, - Variant36923, - Variant36924, - Variant36925, - Variant36926, - Variant36927, - Variant36928, - Variant36929, - Variant36930, - Variant36931, - Variant36932, - Variant36933, - Variant36934, - Variant36935, - Variant36936, - Variant36937, - Variant36938, - Variant36939, - Variant36940, - Variant36941, - Variant36942, - Variant36943, - Variant36944, - Variant36945, - Variant36946, - Variant36947, - Variant36948, - Variant36949, - Variant36950, - Variant36951, - Variant36952, - Variant36953, - Variant36954, - Variant36955, - Variant36956, - Variant36957, - Variant36958, - Variant36959, - Variant36960, - Variant36961, - Variant36962, - Variant36963, - Variant36964, - Variant36965, - Variant36966, - Variant36967, - Variant36968, - Variant36969, - Variant36970, - Variant36971, - Variant36972, - Variant36973, - Variant36974, - Variant36975, - Variant36976, - Variant36977, - Variant36978, - Variant36979, - Variant36980, - Variant36981, - Variant36982, - Variant36983, - Variant36984, - Variant36985, - Variant36986, - Variant36987, - Variant36988, - Variant36989, - Variant36990, - Variant36991, - Variant36992, - Variant36993, - Variant36994, - Variant36995, - Variant36996, - Variant36997, - Variant36998, - Variant36999, - Variant37000, - Variant37001, - Variant37002, - Variant37003, - Variant37004, - Variant37005, - Variant37006, - Variant37007, - Variant37008, - Variant37009, - Variant37010, - Variant37011, - Variant37012, - Variant37013, - Variant37014, - Variant37015, - Variant37016, - Variant37017, - Variant37018, - Variant37019, - Variant37020, - Variant37021, - Variant37022, - Variant37023, - Variant37024, - Variant37025, - Variant37026, - Variant37027, - Variant37028, - Variant37029, - Variant37030, - Variant37031, - Variant37032, - Variant37033, - Variant37034, - Variant37035, - Variant37036, - Variant37037, - Variant37038, - Variant37039, - Variant37040, - Variant37041, - Variant37042, - Variant37043, - Variant37044, - Variant37045, - Variant37046, - Variant37047, - Variant37048, - Variant37049, - Variant37050, - Variant37051, - Variant37052, - Variant37053, - Variant37054, - Variant37055, - Variant37056, - Variant37057, - Variant37058, - Variant37059, - Variant37060, - Variant37061, - Variant37062, - Variant37063, - Variant37064, - Variant37065, - Variant37066, - Variant37067, - Variant37068, - Variant37069, - Variant37070, - Variant37071, - Variant37072, - Variant37073, - Variant37074, - Variant37075, - Variant37076, - Variant37077, - Variant37078, - Variant37079, - Variant37080, - Variant37081, - Variant37082, - Variant37083, - Variant37084, - Variant37085, - Variant37086, - Variant37087, - Variant37088, - Variant37089, - Variant37090, - Variant37091, - Variant37092, - Variant37093, - Variant37094, - Variant37095, - Variant37096, - Variant37097, - Variant37098, - Variant37099, - Variant37100, - Variant37101, - Variant37102, - Variant37103, - Variant37104, - Variant37105, - Variant37106, - Variant37107, - Variant37108, - Variant37109, - Variant37110, - Variant37111, - Variant37112, - Variant37113, - Variant37114, - Variant37115, - Variant37116, - Variant37117, - Variant37118, - Variant37119, - Variant37120, - Variant37121, - Variant37122, - Variant37123, - Variant37124, - Variant37125, - Variant37126, - Variant37127, - Variant37128, - Variant37129, - Variant37130, - Variant37131, - Variant37132, - Variant37133, - Variant37134, - Variant37135, - Variant37136, - Variant37137, - Variant37138, - Variant37139, - Variant37140, - Variant37141, - Variant37142, - Variant37143, - Variant37144, - Variant37145, - Variant37146, - Variant37147, - Variant37148, - Variant37149, - Variant37150, - Variant37151, - Variant37152, - Variant37153, - Variant37154, - Variant37155, - Variant37156, - Variant37157, - Variant37158, - Variant37159, - Variant37160, - Variant37161, - Variant37162, - Variant37163, - Variant37164, - Variant37165, - Variant37166, - Variant37167, - Variant37168, - Variant37169, - Variant37170, - Variant37171, - Variant37172, - Variant37173, - Variant37174, - Variant37175, - Variant37176, - Variant37177, - Variant37178, - Variant37179, - Variant37180, - Variant37181, - Variant37182, - Variant37183, - Variant37184, - Variant37185, - Variant37186, - Variant37187, - Variant37188, - Variant37189, - Variant37190, - Variant37191, - Variant37192, - Variant37193, - Variant37194, - Variant37195, - Variant37196, - Variant37197, - Variant37198, - Variant37199, - Variant37200, - Variant37201, - Variant37202, - Variant37203, - Variant37204, - Variant37205, - Variant37206, - Variant37207, - Variant37208, - Variant37209, - Variant37210, - Variant37211, - Variant37212, - Variant37213, - Variant37214, - Variant37215, - Variant37216, - Variant37217, - Variant37218, - Variant37219, - Variant37220, - Variant37221, - Variant37222, - Variant37223, - Variant37224, - Variant37225, - Variant37226, - Variant37227, - Variant37228, - Variant37229, - Variant37230, - Variant37231, - Variant37232, - Variant37233, - Variant37234, - Variant37235, - Variant37236, - Variant37237, - Variant37238, - Variant37239, - Variant37240, - Variant37241, - Variant37242, - Variant37243, - Variant37244, - Variant37245, - Variant37246, - Variant37247, - Variant37248, - Variant37249, - Variant37250, - Variant37251, - Variant37252, - Variant37253, - Variant37254, - Variant37255, - Variant37256, - Variant37257, - Variant37258, - Variant37259, - Variant37260, - Variant37261, - Variant37262, - Variant37263, - Variant37264, - Variant37265, - Variant37266, - Variant37267, - Variant37268, - Variant37269, - Variant37270, - Variant37271, - Variant37272, - Variant37273, - Variant37274, - Variant37275, - Variant37276, - Variant37277, - Variant37278, - Variant37279, - Variant37280, - Variant37281, - Variant37282, - Variant37283, - Variant37284, - Variant37285, - Variant37286, - Variant37287, - Variant37288, - Variant37289, - Variant37290, - Variant37291, - Variant37292, - Variant37293, - Variant37294, - Variant37295, - Variant37296, - Variant37297, - Variant37298, - Variant37299, - Variant37300, - Variant37301, - Variant37302, - Variant37303, - Variant37304, - Variant37305, - Variant37306, - Variant37307, - Variant37308, - Variant37309, - Variant37310, - Variant37311, - Variant37312, - Variant37313, - Variant37314, - Variant37315, - Variant37316, - Variant37317, - Variant37318, - Variant37319, - Variant37320, - Variant37321, - Variant37322, - Variant37323, - Variant37324, - Variant37325, - Variant37326, - Variant37327, - Variant37328, - Variant37329, - Variant37330, - Variant37331, - Variant37332, - Variant37333, - Variant37334, - Variant37335, - Variant37336, - Variant37337, - Variant37338, - Variant37339, - Variant37340, - Variant37341, - Variant37342, - Variant37343, - Variant37344, - Variant37345, - Variant37346, - Variant37347, - Variant37348, - Variant37349, - Variant37350, - Variant37351, - Variant37352, - Variant37353, - Variant37354, - Variant37355, - Variant37356, - Variant37357, - Variant37358, - Variant37359, - Variant37360, - Variant37361, - Variant37362, - Variant37363, - Variant37364, - Variant37365, - Variant37366, - Variant37367, - Variant37368, - Variant37369, - Variant37370, - Variant37371, - Variant37372, - Variant37373, - Variant37374, - Variant37375, - Variant37376, - Variant37377, - Variant37378, - Variant37379, - Variant37380, - Variant37381, - Variant37382, - Variant37383, - Variant37384, - Variant37385, - Variant37386, - Variant37387, - Variant37388, - Variant37389, - Variant37390, - Variant37391, - Variant37392, - Variant37393, - Variant37394, - Variant37395, - Variant37396, - Variant37397, - Variant37398, - Variant37399, - Variant37400, - Variant37401, - Variant37402, - Variant37403, - Variant37404, - Variant37405, - Variant37406, - Variant37407, - Variant37408, - Variant37409, - Variant37410, - Variant37411, - Variant37412, - Variant37413, - Variant37414, - Variant37415, - Variant37416, - Variant37417, - Variant37418, - Variant37419, - Variant37420, - Variant37421, - Variant37422, - Variant37423, - Variant37424, - Variant37425, - Variant37426, - Variant37427, - Variant37428, - Variant37429, - Variant37430, - Variant37431, - Variant37432, - Variant37433, - Variant37434, - Variant37435, - Variant37436, - Variant37437, - Variant37438, - Variant37439, - Variant37440, - Variant37441, - Variant37442, - Variant37443, - Variant37444, - Variant37445, - Variant37446, - Variant37447, - Variant37448, - Variant37449, - Variant37450, - Variant37451, - Variant37452, - Variant37453, - Variant37454, - Variant37455, - Variant37456, - Variant37457, - Variant37458, - Variant37459, - Variant37460, - Variant37461, - Variant37462, - Variant37463, - Variant37464, - Variant37465, - Variant37466, - Variant37467, - Variant37468, - Variant37469, - Variant37470, - Variant37471, - Variant37472, - Variant37473, - Variant37474, - Variant37475, - Variant37476, - Variant37477, - Variant37478, - Variant37479, - Variant37480, - Variant37481, - Variant37482, - Variant37483, - Variant37484, - Variant37485, - Variant37486, - Variant37487, - Variant37488, - Variant37489, - Variant37490, - Variant37491, - Variant37492, - Variant37493, - Variant37494, - Variant37495, - Variant37496, - Variant37497, - Variant37498, - Variant37499, - Variant37500, - Variant37501, - Variant37502, - Variant37503, - Variant37504, - Variant37505, - Variant37506, - Variant37507, - Variant37508, - Variant37509, - Variant37510, - Variant37511, - Variant37512, - Variant37513, - Variant37514, - Variant37515, - Variant37516, - Variant37517, - Variant37518, - Variant37519, - Variant37520, - Variant37521, - Variant37522, - Variant37523, - Variant37524, - Variant37525, - Variant37526, - Variant37527, - Variant37528, - Variant37529, - Variant37530, - Variant37531, - Variant37532, - Variant37533, - Variant37534, - Variant37535, - Variant37536, - Variant37537, - Variant37538, - Variant37539, - Variant37540, - Variant37541, - Variant37542, - Variant37543, - Variant37544, - Variant37545, - Variant37546, - Variant37547, - Variant37548, - Variant37549, - Variant37550, - Variant37551, - Variant37552, - Variant37553, - Variant37554, - Variant37555, - Variant37556, - Variant37557, - Variant37558, - Variant37559, - Variant37560, - Variant37561, - Variant37562, - Variant37563, - Variant37564, - Variant37565, - Variant37566, - Variant37567, - Variant37568, - Variant37569, - Variant37570, - Variant37571, - Variant37572, - Variant37573, - Variant37574, - Variant37575, - Variant37576, - Variant37577, - Variant37578, - Variant37579, - Variant37580, - Variant37581, - Variant37582, - Variant37583, - Variant37584, - Variant37585, - Variant37586, - Variant37587, - Variant37588, - Variant37589, - Variant37590, - Variant37591, - Variant37592, - Variant37593, - Variant37594, - Variant37595, - Variant37596, - Variant37597, - Variant37598, - Variant37599, - Variant37600, - Variant37601, - Variant37602, - Variant37603, - Variant37604, - Variant37605, - Variant37606, - Variant37607, - Variant37608, - Variant37609, - Variant37610, - Variant37611, - Variant37612, - Variant37613, - Variant37614, - Variant37615, - Variant37616, - Variant37617, - Variant37618, - Variant37619, - Variant37620, - Variant37621, - Variant37622, - Variant37623, - Variant37624, - Variant37625, - Variant37626, - Variant37627, - Variant37628, - Variant37629, - Variant37630, - Variant37631, - Variant37632, - Variant37633, - Variant37634, - Variant37635, - Variant37636, - Variant37637, - Variant37638, - Variant37639, - Variant37640, - Variant37641, - Variant37642, - Variant37643, - Variant37644, - Variant37645, - Variant37646, - Variant37647, - Variant37648, - Variant37649, - Variant37650, - Variant37651, - Variant37652, - Variant37653, - Variant37654, - Variant37655, - Variant37656, - Variant37657, - Variant37658, - Variant37659, - Variant37660, - Variant37661, - Variant37662, - Variant37663, - Variant37664, - Variant37665, - Variant37666, - Variant37667, - Variant37668, - Variant37669, - Variant37670, - Variant37671, - Variant37672, - Variant37673, - Variant37674, - Variant37675, - Variant37676, - Variant37677, - Variant37678, - Variant37679, - Variant37680, - Variant37681, - Variant37682, - Variant37683, - Variant37684, - Variant37685, - Variant37686, - Variant37687, - Variant37688, - Variant37689, - Variant37690, - Variant37691, - Variant37692, - Variant37693, - Variant37694, - Variant37695, - Variant37696, - Variant37697, - Variant37698, - Variant37699, - Variant37700, - Variant37701, - Variant37702, - Variant37703, - Variant37704, - Variant37705, - Variant37706, - Variant37707, - Variant37708, - Variant37709, - Variant37710, - Variant37711, - Variant37712, - Variant37713, - Variant37714, - Variant37715, - Variant37716, - Variant37717, - Variant37718, - Variant37719, - Variant37720, - Variant37721, - Variant37722, - Variant37723, - Variant37724, - Variant37725, - Variant37726, - Variant37727, - Variant37728, - Variant37729, - Variant37730, - Variant37731, - Variant37732, - Variant37733, - Variant37734, - Variant37735, - Variant37736, - Variant37737, - Variant37738, - Variant37739, - Variant37740, - Variant37741, - Variant37742, - Variant37743, - Variant37744, - Variant37745, - Variant37746, - Variant37747, - Variant37748, - Variant37749, - Variant37750, - Variant37751, - Variant37752, - Variant37753, - Variant37754, - Variant37755, - Variant37756, - Variant37757, - Variant37758, - Variant37759, - Variant37760, - Variant37761, - Variant37762, - Variant37763, - Variant37764, - Variant37765, - Variant37766, - Variant37767, - Variant37768, - Variant37769, - Variant37770, - Variant37771, - Variant37772, - Variant37773, - Variant37774, - Variant37775, - Variant37776, - Variant37777, - Variant37778, - Variant37779, - Variant37780, - Variant37781, - Variant37782, - Variant37783, - Variant37784, - Variant37785, - Variant37786, - Variant37787, - Variant37788, - Variant37789, - Variant37790, - Variant37791, - Variant37792, - Variant37793, - Variant37794, - Variant37795, - Variant37796, - Variant37797, - Variant37798, - Variant37799, - Variant37800, - Variant37801, - Variant37802, - Variant37803, - Variant37804, - Variant37805, - Variant37806, - Variant37807, - Variant37808, - Variant37809, - Variant37810, - Variant37811, - Variant37812, - Variant37813, - Variant37814, - Variant37815, - Variant37816, - Variant37817, - Variant37818, - Variant37819, - Variant37820, - Variant37821, - Variant37822, - Variant37823, - Variant37824, - Variant37825, - Variant37826, - Variant37827, - Variant37828, - Variant37829, - Variant37830, - Variant37831, - Variant37832, - Variant37833, - Variant37834, - Variant37835, - Variant37836, - Variant37837, - Variant37838, - Variant37839, - Variant37840, - Variant37841, - Variant37842, - Variant37843, - Variant37844, - Variant37845, - Variant37846, - Variant37847, - Variant37848, - Variant37849, - Variant37850, - Variant37851, - Variant37852, - Variant37853, - Variant37854, - Variant37855, - Variant37856, - Variant37857, - Variant37858, - Variant37859, - Variant37860, - Variant37861, - Variant37862, - Variant37863, - Variant37864, - Variant37865, - Variant37866, - Variant37867, - Variant37868, - Variant37869, - Variant37870, - Variant37871, - Variant37872, - Variant37873, - Variant37874, - Variant37875, - Variant37876, - Variant37877, - Variant37878, - Variant37879, - Variant37880, - Variant37881, - Variant37882, - Variant37883, - Variant37884, - Variant37885, - Variant37886, - Variant37887, - Variant37888, - Variant37889, - Variant37890, - Variant37891, - Variant37892, - Variant37893, - Variant37894, - Variant37895, - Variant37896, - Variant37897, - Variant37898, - Variant37899, - Variant37900, - Variant37901, - Variant37902, - Variant37903, - Variant37904, - Variant37905, - Variant37906, - Variant37907, - Variant37908, - Variant37909, - Variant37910, - Variant37911, - Variant37912, - Variant37913, - Variant37914, - Variant37915, - Variant37916, - Variant37917, - Variant37918, - Variant37919, - Variant37920, - Variant37921, - Variant37922, - Variant37923, - Variant37924, - Variant37925, - Variant37926, - Variant37927, - Variant37928, - Variant37929, - Variant37930, - Variant37931, - Variant37932, - Variant37933, - Variant37934, - Variant37935, - Variant37936, - Variant37937, - Variant37938, - Variant37939, - Variant37940, - Variant37941, - Variant37942, - Variant37943, - Variant37944, - Variant37945, - Variant37946, - Variant37947, - Variant37948, - Variant37949, - Variant37950, - Variant37951, - Variant37952, - Variant37953, - Variant37954, - Variant37955, - Variant37956, - Variant37957, - Variant37958, - Variant37959, - Variant37960, - Variant37961, - Variant37962, - Variant37963, - Variant37964, - Variant37965, - Variant37966, - Variant37967, - Variant37968, - Variant37969, - Variant37970, - Variant37971, - Variant37972, - Variant37973, - Variant37974, - Variant37975, - Variant37976, - Variant37977, - Variant37978, - Variant37979, - Variant37980, - Variant37981, - Variant37982, - Variant37983, - Variant37984, - Variant37985, - Variant37986, - Variant37987, - Variant37988, - Variant37989, - Variant37990, - Variant37991, - Variant37992, - Variant37993, - Variant37994, - Variant37995, - Variant37996, - Variant37997, - Variant37998, - Variant37999, - Variant38000, - Variant38001, - Variant38002, - Variant38003, - Variant38004, - Variant38005, - Variant38006, - Variant38007, - Variant38008, - Variant38009, - Variant38010, - Variant38011, - Variant38012, - Variant38013, - Variant38014, - Variant38015, - Variant38016, - Variant38017, - Variant38018, - Variant38019, - Variant38020, - Variant38021, - Variant38022, - Variant38023, - Variant38024, - Variant38025, - Variant38026, - Variant38027, - Variant38028, - Variant38029, - Variant38030, - Variant38031, - Variant38032, - Variant38033, - Variant38034, - Variant38035, - Variant38036, - Variant38037, - Variant38038, - Variant38039, - Variant38040, - Variant38041, - Variant38042, - Variant38043, - Variant38044, - Variant38045, - Variant38046, - Variant38047, - Variant38048, - Variant38049, - Variant38050, - Variant38051, - Variant38052, - Variant38053, - Variant38054, - Variant38055, - Variant38056, - Variant38057, - Variant38058, - Variant38059, - Variant38060, - Variant38061, - Variant38062, - Variant38063, - Variant38064, - Variant38065, - Variant38066, - Variant38067, - Variant38068, - Variant38069, - Variant38070, - Variant38071, - Variant38072, - Variant38073, - Variant38074, - Variant38075, - Variant38076, - Variant38077, - Variant38078, - Variant38079, - Variant38080, - Variant38081, - Variant38082, - Variant38083, - Variant38084, - Variant38085, - Variant38086, - Variant38087, - Variant38088, - Variant38089, - Variant38090, - Variant38091, - Variant38092, - Variant38093, - Variant38094, - Variant38095, - Variant38096, - Variant38097, - Variant38098, - Variant38099, - Variant38100, - Variant38101, - Variant38102, - Variant38103, - Variant38104, - Variant38105, - Variant38106, - Variant38107, - Variant38108, - Variant38109, - Variant38110, - Variant38111, - Variant38112, - Variant38113, - Variant38114, - Variant38115, - Variant38116, - Variant38117, - Variant38118, - Variant38119, - Variant38120, - Variant38121, - Variant38122, - Variant38123, - Variant38124, - Variant38125, - Variant38126, - Variant38127, - Variant38128, - Variant38129, - Variant38130, - Variant38131, - Variant38132, - Variant38133, - Variant38134, - Variant38135, - Variant38136, - Variant38137, - Variant38138, - Variant38139, - Variant38140, - Variant38141, - Variant38142, - Variant38143, - Variant38144, - Variant38145, - Variant38146, - Variant38147, - Variant38148, - Variant38149, - Variant38150, - Variant38151, - Variant38152, - Variant38153, - Variant38154, - Variant38155, - Variant38156, - Variant38157, - Variant38158, - Variant38159, - Variant38160, - Variant38161, - Variant38162, - Variant38163, - Variant38164, - Variant38165, - Variant38166, - Variant38167, - Variant38168, - Variant38169, - Variant38170, - Variant38171, - Variant38172, - Variant38173, - Variant38174, - Variant38175, - Variant38176, - Variant38177, - Variant38178, - Variant38179, - Variant38180, - Variant38181, - Variant38182, - Variant38183, - Variant38184, - Variant38185, - Variant38186, - Variant38187, - Variant38188, - Variant38189, - Variant38190, - Variant38191, - Variant38192, - Variant38193, - Variant38194, - Variant38195, - Variant38196, - Variant38197, - Variant38198, - Variant38199, - Variant38200, - Variant38201, - Variant38202, - Variant38203, - Variant38204, - Variant38205, - Variant38206, - Variant38207, - Variant38208, - Variant38209, - Variant38210, - Variant38211, - Variant38212, - Variant38213, - Variant38214, - Variant38215, - Variant38216, - Variant38217, - Variant38218, - Variant38219, - Variant38220, - Variant38221, - Variant38222, - Variant38223, - Variant38224, - Variant38225, - Variant38226, - Variant38227, - Variant38228, - Variant38229, - Variant38230, - Variant38231, - Variant38232, - Variant38233, - Variant38234, - Variant38235, - Variant38236, - Variant38237, - Variant38238, - Variant38239, - Variant38240, - Variant38241, - Variant38242, - Variant38243, - Variant38244, - Variant38245, - Variant38246, - Variant38247, - Variant38248, - Variant38249, - Variant38250, - Variant38251, - Variant38252, - Variant38253, - Variant38254, - Variant38255, - Variant38256, - Variant38257, - Variant38258, - Variant38259, - Variant38260, - Variant38261, - Variant38262, - Variant38263, - Variant38264, - Variant38265, - Variant38266, - Variant38267, - Variant38268, - Variant38269, - Variant38270, - Variant38271, - Variant38272, - Variant38273, - Variant38274, - Variant38275, - Variant38276, - Variant38277, - Variant38278, - Variant38279, - Variant38280, - Variant38281, - Variant38282, - Variant38283, - Variant38284, - Variant38285, - Variant38286, - Variant38287, - Variant38288, - Variant38289, - Variant38290, - Variant38291, - Variant38292, - Variant38293, - Variant38294, - Variant38295, - Variant38296, - Variant38297, - Variant38298, - Variant38299, - Variant38300, - Variant38301, - Variant38302, - Variant38303, - Variant38304, - Variant38305, - Variant38306, - Variant38307, - Variant38308, - Variant38309, - Variant38310, - Variant38311, - Variant38312, - Variant38313, - Variant38314, - Variant38315, - Variant38316, - Variant38317, - Variant38318, - Variant38319, - Variant38320, - Variant38321, - Variant38322, - Variant38323, - Variant38324, - Variant38325, - Variant38326, - Variant38327, - Variant38328, - Variant38329, - Variant38330, - Variant38331, - Variant38332, - Variant38333, - Variant38334, - Variant38335, - Variant38336, - Variant38337, - Variant38338, - Variant38339, - Variant38340, - Variant38341, - Variant38342, - Variant38343, - Variant38344, - Variant38345, - Variant38346, - Variant38347, - Variant38348, - Variant38349, - Variant38350, - Variant38351, - Variant38352, - Variant38353, - Variant38354, - Variant38355, - Variant38356, - Variant38357, - Variant38358, - Variant38359, - Variant38360, - Variant38361, - Variant38362, - Variant38363, - Variant38364, - Variant38365, - Variant38366, - Variant38367, - Variant38368, - Variant38369, - Variant38370, - Variant38371, - Variant38372, - Variant38373, - Variant38374, - Variant38375, - Variant38376, - Variant38377, - Variant38378, - Variant38379, - Variant38380, - Variant38381, - Variant38382, - Variant38383, - Variant38384, - Variant38385, - Variant38386, - Variant38387, - Variant38388, - Variant38389, - Variant38390, - Variant38391, - Variant38392, - Variant38393, - Variant38394, - Variant38395, - Variant38396, - Variant38397, - Variant38398, - Variant38399, - Variant38400, - Variant38401, - Variant38402, - Variant38403, - Variant38404, - Variant38405, - Variant38406, - Variant38407, - Variant38408, - Variant38409, - Variant38410, - Variant38411, - Variant38412, - Variant38413, - Variant38414, - Variant38415, - Variant38416, - Variant38417, - Variant38418, - Variant38419, - Variant38420, - Variant38421, - Variant38422, - Variant38423, - Variant38424, - Variant38425, - Variant38426, - Variant38427, - Variant38428, - Variant38429, - Variant38430, - Variant38431, - Variant38432, - Variant38433, - Variant38434, - Variant38435, - Variant38436, - Variant38437, - Variant38438, - Variant38439, - Variant38440, - Variant38441, - Variant38442, - Variant38443, - Variant38444, - Variant38445, - Variant38446, - Variant38447, - Variant38448, - Variant38449, - Variant38450, - Variant38451, - Variant38452, - Variant38453, - Variant38454, - Variant38455, - Variant38456, - Variant38457, - Variant38458, - Variant38459, - Variant38460, - Variant38461, - Variant38462, - Variant38463, - Variant38464, - Variant38465, - Variant38466, - Variant38467, - Variant38468, - Variant38469, - Variant38470, - Variant38471, - Variant38472, - Variant38473, - Variant38474, - Variant38475, - Variant38476, - Variant38477, - Variant38478, - Variant38479, - Variant38480, - Variant38481, - Variant38482, - Variant38483, - Variant38484, - Variant38485, - Variant38486, - Variant38487, - Variant38488, - Variant38489, - Variant38490, - Variant38491, - Variant38492, - Variant38493, - Variant38494, - Variant38495, - Variant38496, - Variant38497, - Variant38498, - Variant38499, - Variant38500, - Variant38501, - Variant38502, - Variant38503, - Variant38504, - Variant38505, - Variant38506, - Variant38507, - Variant38508, - Variant38509, - Variant38510, - Variant38511, - Variant38512, - Variant38513, - Variant38514, - Variant38515, - Variant38516, - Variant38517, - Variant38518, - Variant38519, - Variant38520, - Variant38521, - Variant38522, - Variant38523, - Variant38524, - Variant38525, - Variant38526, - Variant38527, - Variant38528, - Variant38529, - Variant38530, - Variant38531, - Variant38532, - Variant38533, - Variant38534, - Variant38535, - Variant38536, - Variant38537, - Variant38538, - Variant38539, - Variant38540, - Variant38541, - Variant38542, - Variant38543, - Variant38544, - Variant38545, - Variant38546, - Variant38547, - Variant38548, - Variant38549, - Variant38550, - Variant38551, - Variant38552, - Variant38553, - Variant38554, - Variant38555, - Variant38556, - Variant38557, - Variant38558, - Variant38559, - Variant38560, - Variant38561, - Variant38562, - Variant38563, - Variant38564, - Variant38565, - Variant38566, - Variant38567, - Variant38568, - Variant38569, - Variant38570, - Variant38571, - Variant38572, - Variant38573, - Variant38574, - Variant38575, - Variant38576, - Variant38577, - Variant38578, - Variant38579, - Variant38580, - Variant38581, - Variant38582, - Variant38583, - Variant38584, - Variant38585, - Variant38586, - Variant38587, - Variant38588, - Variant38589, - Variant38590, - Variant38591, - Variant38592, - Variant38593, - Variant38594, - Variant38595, - Variant38596, - Variant38597, - Variant38598, - Variant38599, - Variant38600, - Variant38601, - Variant38602, - Variant38603, - Variant38604, - Variant38605, - Variant38606, - Variant38607, - Variant38608, - Variant38609, - Variant38610, - Variant38611, - Variant38612, - Variant38613, - Variant38614, - Variant38615, - Variant38616, - Variant38617, - Variant38618, - Variant38619, - Variant38620, - Variant38621, - Variant38622, - Variant38623, - Variant38624, - Variant38625, - Variant38626, - Variant38627, - Variant38628, - Variant38629, - Variant38630, - Variant38631, - Variant38632, - Variant38633, - Variant38634, - Variant38635, - Variant38636, - Variant38637, - Variant38638, - Variant38639, - Variant38640, - Variant38641, - Variant38642, - Variant38643, - Variant38644, - Variant38645, - Variant38646, - Variant38647, - Variant38648, - Variant38649, - Variant38650, - Variant38651, - Variant38652, - Variant38653, - Variant38654, - Variant38655, - Variant38656, - Variant38657, - Variant38658, - Variant38659, - Variant38660, - Variant38661, - Variant38662, - Variant38663, - Variant38664, - Variant38665, - Variant38666, - Variant38667, - Variant38668, - Variant38669, - Variant38670, - Variant38671, - Variant38672, - Variant38673, - Variant38674, - Variant38675, - Variant38676, - Variant38677, - Variant38678, - Variant38679, - Variant38680, - Variant38681, - Variant38682, - Variant38683, - Variant38684, - Variant38685, - Variant38686, - Variant38687, - Variant38688, - Variant38689, - Variant38690, - Variant38691, - Variant38692, - Variant38693, - Variant38694, - Variant38695, - Variant38696, - Variant38697, - Variant38698, - Variant38699, - Variant38700, - Variant38701, - Variant38702, - Variant38703, - Variant38704, - Variant38705, - Variant38706, - Variant38707, - Variant38708, - Variant38709, - Variant38710, - Variant38711, - Variant38712, - Variant38713, - Variant38714, - Variant38715, - Variant38716, - Variant38717, - Variant38718, - Variant38719, - Variant38720, - Variant38721, - Variant38722, - Variant38723, - Variant38724, - Variant38725, - Variant38726, - Variant38727, - Variant38728, - Variant38729, - Variant38730, - Variant38731, - Variant38732, - Variant38733, - Variant38734, - Variant38735, - Variant38736, - Variant38737, - Variant38738, - Variant38739, - Variant38740, - Variant38741, - Variant38742, - Variant38743, - Variant38744, - Variant38745, - Variant38746, - Variant38747, - Variant38748, - Variant38749, - Variant38750, - Variant38751, - Variant38752, - Variant38753, - Variant38754, - Variant38755, - Variant38756, - Variant38757, - Variant38758, - Variant38759, - Variant38760, - Variant38761, - Variant38762, - Variant38763, - Variant38764, - Variant38765, - Variant38766, - Variant38767, - Variant38768, - Variant38769, - Variant38770, - Variant38771, - Variant38772, - Variant38773, - Variant38774, - Variant38775, - Variant38776, - Variant38777, - Variant38778, - Variant38779, - Variant38780, - Variant38781, - Variant38782, - Variant38783, - Variant38784, - Variant38785, - Variant38786, - Variant38787, - Variant38788, - Variant38789, - Variant38790, - Variant38791, - Variant38792, - Variant38793, - Variant38794, - Variant38795, - Variant38796, - Variant38797, - Variant38798, - Variant38799, - Variant38800, - Variant38801, - Variant38802, - Variant38803, - Variant38804, - Variant38805, - Variant38806, - Variant38807, - Variant38808, - Variant38809, - Variant38810, - Variant38811, - Variant38812, - Variant38813, - Variant38814, - Variant38815, - Variant38816, - Variant38817, - Variant38818, - Variant38819, - Variant38820, - Variant38821, - Variant38822, - Variant38823, - Variant38824, - Variant38825, - Variant38826, - Variant38827, - Variant38828, - Variant38829, - Variant38830, - Variant38831, - Variant38832, - Variant38833, - Variant38834, - Variant38835, - Variant38836, - Variant38837, - Variant38838, - Variant38839, - Variant38840, - Variant38841, - Variant38842, - Variant38843, - Variant38844, - Variant38845, - Variant38846, - Variant38847, - Variant38848, - Variant38849, - Variant38850, - Variant38851, - Variant38852, - Variant38853, - Variant38854, - Variant38855, - Variant38856, - Variant38857, - Variant38858, - Variant38859, - Variant38860, - Variant38861, - Variant38862, - Variant38863, - Variant38864, - Variant38865, - Variant38866, - Variant38867, - Variant38868, - Variant38869, - Variant38870, - Variant38871, - Variant38872, - Variant38873, - Variant38874, - Variant38875, - Variant38876, - Variant38877, - Variant38878, - Variant38879, - Variant38880, - Variant38881, - Variant38882, - Variant38883, - Variant38884, - Variant38885, - Variant38886, - Variant38887, - Variant38888, - Variant38889, - Variant38890, - Variant38891, - Variant38892, - Variant38893, - Variant38894, - Variant38895, - Variant38896, - Variant38897, - Variant38898, - Variant38899, - Variant38900, - Variant38901, - Variant38902, - Variant38903, - Variant38904, - Variant38905, - Variant38906, - Variant38907, - Variant38908, - Variant38909, - Variant38910, - Variant38911, - Variant38912, - Variant38913, - Variant38914, - Variant38915, - Variant38916, - Variant38917, - Variant38918, - Variant38919, - Variant38920, - Variant38921, - Variant38922, - Variant38923, - Variant38924, - Variant38925, - Variant38926, - Variant38927, - Variant38928, - Variant38929, - Variant38930, - Variant38931, - Variant38932, - Variant38933, - Variant38934, - Variant38935, - Variant38936, - Variant38937, - Variant38938, - Variant38939, - Variant38940, - Variant38941, - Variant38942, - Variant38943, - Variant38944, - Variant38945, - Variant38946, - Variant38947, - Variant38948, - Variant38949, - Variant38950, - Variant38951, - Variant38952, - Variant38953, - Variant38954, - Variant38955, - Variant38956, - Variant38957, - Variant38958, - Variant38959, - Variant38960, - Variant38961, - Variant38962, - Variant38963, - Variant38964, - Variant38965, - Variant38966, - Variant38967, - Variant38968, - Variant38969, - Variant38970, - Variant38971, - Variant38972, - Variant38973, - Variant38974, - Variant38975, - Variant38976, - Variant38977, - Variant38978, - Variant38979, - Variant38980, - Variant38981, - Variant38982, - Variant38983, - Variant38984, - Variant38985, - Variant38986, - Variant38987, - Variant38988, - Variant38989, - Variant38990, - Variant38991, - Variant38992, - Variant38993, - Variant38994, - Variant38995, - Variant38996, - Variant38997, - Variant38998, - Variant38999, - Variant39000, - Variant39001, - Variant39002, - Variant39003, - Variant39004, - Variant39005, - Variant39006, - Variant39007, - Variant39008, - Variant39009, - Variant39010, - Variant39011, - Variant39012, - Variant39013, - Variant39014, - Variant39015, - Variant39016, - Variant39017, - Variant39018, - Variant39019, - Variant39020, - Variant39021, - Variant39022, - Variant39023, - Variant39024, - Variant39025, - Variant39026, - Variant39027, - Variant39028, - Variant39029, - Variant39030, - Variant39031, - Variant39032, - Variant39033, - Variant39034, - Variant39035, - Variant39036, - Variant39037, - Variant39038, - Variant39039, - Variant39040, - Variant39041, - Variant39042, - Variant39043, - Variant39044, - Variant39045, - Variant39046, - Variant39047, - Variant39048, - Variant39049, - Variant39050, - Variant39051, - Variant39052, - Variant39053, - Variant39054, - Variant39055, - Variant39056, - Variant39057, - Variant39058, - Variant39059, - Variant39060, - Variant39061, - Variant39062, - Variant39063, - Variant39064, - Variant39065, - Variant39066, - Variant39067, - Variant39068, - Variant39069, - Variant39070, - Variant39071, - Variant39072, - Variant39073, - Variant39074, - Variant39075, - Variant39076, - Variant39077, - Variant39078, - Variant39079, - Variant39080, - Variant39081, - Variant39082, - Variant39083, - Variant39084, - Variant39085, - Variant39086, - Variant39087, - Variant39088, - Variant39089, - Variant39090, - Variant39091, - Variant39092, - Variant39093, - Variant39094, - Variant39095, - Variant39096, - Variant39097, - Variant39098, - Variant39099, - Variant39100, - Variant39101, - Variant39102, - Variant39103, - Variant39104, - Variant39105, - Variant39106, - Variant39107, - Variant39108, - Variant39109, - Variant39110, - Variant39111, - Variant39112, - Variant39113, - Variant39114, - Variant39115, - Variant39116, - Variant39117, - Variant39118, - Variant39119, - Variant39120, - Variant39121, - Variant39122, - Variant39123, - Variant39124, - Variant39125, - Variant39126, - Variant39127, - Variant39128, - Variant39129, - Variant39130, - Variant39131, - Variant39132, - Variant39133, - Variant39134, - Variant39135, - Variant39136, - Variant39137, - Variant39138, - Variant39139, - Variant39140, - Variant39141, - Variant39142, - Variant39143, - Variant39144, - Variant39145, - Variant39146, - Variant39147, - Variant39148, - Variant39149, - Variant39150, - Variant39151, - Variant39152, - Variant39153, - Variant39154, - Variant39155, - Variant39156, - Variant39157, - Variant39158, - Variant39159, - Variant39160, - Variant39161, - Variant39162, - Variant39163, - Variant39164, - Variant39165, - Variant39166, - Variant39167, - Variant39168, - Variant39169, - Variant39170, - Variant39171, - Variant39172, - Variant39173, - Variant39174, - Variant39175, - Variant39176, - Variant39177, - Variant39178, - Variant39179, - Variant39180, - Variant39181, - Variant39182, - Variant39183, - Variant39184, - Variant39185, - Variant39186, - Variant39187, - Variant39188, - Variant39189, - Variant39190, - Variant39191, - Variant39192, - Variant39193, - Variant39194, - Variant39195, - Variant39196, - Variant39197, - Variant39198, - Variant39199, - Variant39200, - Variant39201, - Variant39202, - Variant39203, - Variant39204, - Variant39205, - Variant39206, - Variant39207, - Variant39208, - Variant39209, - Variant39210, - Variant39211, - Variant39212, - Variant39213, - Variant39214, - Variant39215, - Variant39216, - Variant39217, - Variant39218, - Variant39219, - Variant39220, - Variant39221, - Variant39222, - Variant39223, - Variant39224, - Variant39225, - Variant39226, - Variant39227, - Variant39228, - Variant39229, - Variant39230, - Variant39231, - Variant39232, - Variant39233, - Variant39234, - Variant39235, - Variant39236, - Variant39237, - Variant39238, - Variant39239, - Variant39240, - Variant39241, - Variant39242, - Variant39243, - Variant39244, - Variant39245, - Variant39246, - Variant39247, - Variant39248, - Variant39249, - Variant39250, - Variant39251, - Variant39252, - Variant39253, - Variant39254, - Variant39255, - Variant39256, - Variant39257, - Variant39258, - Variant39259, - Variant39260, - Variant39261, - Variant39262, - Variant39263, - Variant39264, - Variant39265, - Variant39266, - Variant39267, - Variant39268, - Variant39269, - Variant39270, - Variant39271, - Variant39272, - Variant39273, - Variant39274, - Variant39275, - Variant39276, - Variant39277, - Variant39278, - Variant39279, - Variant39280, - Variant39281, - Variant39282, - Variant39283, - Variant39284, - Variant39285, - Variant39286, - Variant39287, - Variant39288, - Variant39289, - Variant39290, - Variant39291, - Variant39292, - Variant39293, - Variant39294, - Variant39295, - Variant39296, - Variant39297, - Variant39298, - Variant39299, - Variant39300, - Variant39301, - Variant39302, - Variant39303, - Variant39304, - Variant39305, - Variant39306, - Variant39307, - Variant39308, - Variant39309, - Variant39310, - Variant39311, - Variant39312, - Variant39313, - Variant39314, - Variant39315, - Variant39316, - Variant39317, - Variant39318, - Variant39319, - Variant39320, - Variant39321, - Variant39322, - Variant39323, - Variant39324, - Variant39325, - Variant39326, - Variant39327, - Variant39328, - Variant39329, - Variant39330, - Variant39331, - Variant39332, - Variant39333, - Variant39334, - Variant39335, - Variant39336, - Variant39337, - Variant39338, - Variant39339, - Variant39340, - Variant39341, - Variant39342, - Variant39343, - Variant39344, - Variant39345, - Variant39346, - Variant39347, - Variant39348, - Variant39349, - Variant39350, - Variant39351, - Variant39352, - Variant39353, - Variant39354, - Variant39355, - Variant39356, - Variant39357, - Variant39358, - Variant39359, - Variant39360, - Variant39361, - Variant39362, - Variant39363, - Variant39364, - Variant39365, - Variant39366, - Variant39367, - Variant39368, - Variant39369, - Variant39370, - Variant39371, - Variant39372, - Variant39373, - Variant39374, - Variant39375, - Variant39376, - Variant39377, - Variant39378, - Variant39379, - Variant39380, - Variant39381, - Variant39382, - Variant39383, - Variant39384, - Variant39385, - Variant39386, - Variant39387, - Variant39388, - Variant39389, - Variant39390, - Variant39391, - Variant39392, - Variant39393, - Variant39394, - Variant39395, - Variant39396, - Variant39397, - Variant39398, - Variant39399, - Variant39400, - Variant39401, - Variant39402, - Variant39403, - Variant39404, - Variant39405, - Variant39406, - Variant39407, - Variant39408, - Variant39409, - Variant39410, - Variant39411, - Variant39412, - Variant39413, - Variant39414, - Variant39415, - Variant39416, - Variant39417, - Variant39418, - Variant39419, - Variant39420, - Variant39421, - Variant39422, - Variant39423, - Variant39424, - Variant39425, - Variant39426, - Variant39427, - Variant39428, - Variant39429, - Variant39430, - Variant39431, - Variant39432, - Variant39433, - Variant39434, - Variant39435, - Variant39436, - Variant39437, - Variant39438, - Variant39439, - Variant39440, - Variant39441, - Variant39442, - Variant39443, - Variant39444, - Variant39445, - Variant39446, - Variant39447, - Variant39448, - Variant39449, - Variant39450, - Variant39451, - Variant39452, - Variant39453, - Variant39454, - Variant39455, - Variant39456, - Variant39457, - Variant39458, - Variant39459, - Variant39460, - Variant39461, - Variant39462, - Variant39463, - Variant39464, - Variant39465, - Variant39466, - Variant39467, - Variant39468, - Variant39469, - Variant39470, - Variant39471, - Variant39472, - Variant39473, - Variant39474, - Variant39475, - Variant39476, - Variant39477, - Variant39478, - Variant39479, - Variant39480, - Variant39481, - Variant39482, - Variant39483, - Variant39484, - Variant39485, - Variant39486, - Variant39487, - Variant39488, - Variant39489, - Variant39490, - Variant39491, - Variant39492, - Variant39493, - Variant39494, - Variant39495, - Variant39496, - Variant39497, - Variant39498, - Variant39499, - Variant39500, - Variant39501, - Variant39502, - Variant39503, - Variant39504, - Variant39505, - Variant39506, - Variant39507, - Variant39508, - Variant39509, - Variant39510, - Variant39511, - Variant39512, - Variant39513, - Variant39514, - Variant39515, - Variant39516, - Variant39517, - Variant39518, - Variant39519, - Variant39520, - Variant39521, - Variant39522, - Variant39523, - Variant39524, - Variant39525, - Variant39526, - Variant39527, - Variant39528, - Variant39529, - Variant39530, - Variant39531, - Variant39532, - Variant39533, - Variant39534, - Variant39535, - Variant39536, - Variant39537, - Variant39538, - Variant39539, - Variant39540, - Variant39541, - Variant39542, - Variant39543, - Variant39544, - Variant39545, - Variant39546, - Variant39547, - Variant39548, - Variant39549, - Variant39550, - Variant39551, - Variant39552, - Variant39553, - Variant39554, - Variant39555, - Variant39556, - Variant39557, - Variant39558, - Variant39559, - Variant39560, - Variant39561, - Variant39562, - Variant39563, - Variant39564, - Variant39565, - Variant39566, - Variant39567, - Variant39568, - Variant39569, - Variant39570, - Variant39571, - Variant39572, - Variant39573, - Variant39574, - Variant39575, - Variant39576, - Variant39577, - Variant39578, - Variant39579, - Variant39580, - Variant39581, - Variant39582, - Variant39583, - Variant39584, - Variant39585, - Variant39586, - Variant39587, - Variant39588, - Variant39589, - Variant39590, - Variant39591, - Variant39592, - Variant39593, - Variant39594, - Variant39595, - Variant39596, - Variant39597, - Variant39598, - Variant39599, - Variant39600, - Variant39601, - Variant39602, - Variant39603, - Variant39604, - Variant39605, - Variant39606, - Variant39607, - Variant39608, - Variant39609, - Variant39610, - Variant39611, - Variant39612, - Variant39613, - Variant39614, - Variant39615, - Variant39616, - Variant39617, - Variant39618, - Variant39619, - Variant39620, - Variant39621, - Variant39622, - Variant39623, - Variant39624, - Variant39625, - Variant39626, - Variant39627, - Variant39628, - Variant39629, - Variant39630, - Variant39631, - Variant39632, - Variant39633, - Variant39634, - Variant39635, - Variant39636, - Variant39637, - Variant39638, - Variant39639, - Variant39640, - Variant39641, - Variant39642, - Variant39643, - Variant39644, - Variant39645, - Variant39646, - Variant39647, - Variant39648, - Variant39649, - Variant39650, - Variant39651, - Variant39652, - Variant39653, - Variant39654, - Variant39655, - Variant39656, - Variant39657, - Variant39658, - Variant39659, - Variant39660, - Variant39661, - Variant39662, - Variant39663, - Variant39664, - Variant39665, - Variant39666, - Variant39667, - Variant39668, - Variant39669, - Variant39670, - Variant39671, - Variant39672, - Variant39673, - Variant39674, - Variant39675, - Variant39676, - Variant39677, - Variant39678, - Variant39679, - Variant39680, - Variant39681, - Variant39682, - Variant39683, - Variant39684, - Variant39685, - Variant39686, - Variant39687, - Variant39688, - Variant39689, - Variant39690, - Variant39691, - Variant39692, - Variant39693, - Variant39694, - Variant39695, - Variant39696, - Variant39697, - Variant39698, - Variant39699, - Variant39700, - Variant39701, - Variant39702, - Variant39703, - Variant39704, - Variant39705, - Variant39706, - Variant39707, - Variant39708, - Variant39709, - Variant39710, - Variant39711, - Variant39712, - Variant39713, - Variant39714, - Variant39715, - Variant39716, - Variant39717, - Variant39718, - Variant39719, - Variant39720, - Variant39721, - Variant39722, - Variant39723, - Variant39724, - Variant39725, - Variant39726, - Variant39727, - Variant39728, - Variant39729, - Variant39730, - Variant39731, - Variant39732, - Variant39733, - Variant39734, - Variant39735, - Variant39736, - Variant39737, - Variant39738, - Variant39739, - Variant39740, - Variant39741, - Variant39742, - Variant39743, - Variant39744, - Variant39745, - Variant39746, - Variant39747, - Variant39748, - Variant39749, - Variant39750, - Variant39751, - Variant39752, - Variant39753, - Variant39754, - Variant39755, - Variant39756, - Variant39757, - Variant39758, - Variant39759, - Variant39760, - Variant39761, - Variant39762, - Variant39763, - Variant39764, - Variant39765, - Variant39766, - Variant39767, - Variant39768, - Variant39769, - Variant39770, - Variant39771, - Variant39772, - Variant39773, - Variant39774, - Variant39775, - Variant39776, - Variant39777, - Variant39778, - Variant39779, - Variant39780, - Variant39781, - Variant39782, - Variant39783, - Variant39784, - Variant39785, - Variant39786, - Variant39787, - Variant39788, - Variant39789, - Variant39790, - Variant39791, - Variant39792, - Variant39793, - Variant39794, - Variant39795, - Variant39796, - Variant39797, - Variant39798, - Variant39799, - Variant39800, - Variant39801, - Variant39802, - Variant39803, - Variant39804, - Variant39805, - Variant39806, - Variant39807, - Variant39808, - Variant39809, - Variant39810, - Variant39811, - Variant39812, - Variant39813, - Variant39814, - Variant39815, - Variant39816, - Variant39817, - Variant39818, - Variant39819, - Variant39820, - Variant39821, - Variant39822, - Variant39823, - Variant39824, - Variant39825, - Variant39826, - Variant39827, - Variant39828, - Variant39829, - Variant39830, - Variant39831, - Variant39832, - Variant39833, - Variant39834, - Variant39835, - Variant39836, - Variant39837, - Variant39838, - Variant39839, - Variant39840, - Variant39841, - Variant39842, - Variant39843, - Variant39844, - Variant39845, - Variant39846, - Variant39847, - Variant39848, - Variant39849, - Variant39850, - Variant39851, - Variant39852, - Variant39853, - Variant39854, - Variant39855, - Variant39856, - Variant39857, - Variant39858, - Variant39859, - Variant39860, - Variant39861, - Variant39862, - Variant39863, - Variant39864, - Variant39865, - Variant39866, - Variant39867, - Variant39868, - Variant39869, - Variant39870, - Variant39871, - Variant39872, - Variant39873, - Variant39874, - Variant39875, - Variant39876, - Variant39877, - Variant39878, - Variant39879, - Variant39880, - Variant39881, - Variant39882, - Variant39883, - Variant39884, - Variant39885, - Variant39886, - Variant39887, - Variant39888, - Variant39889, - Variant39890, - Variant39891, - Variant39892, - Variant39893, - Variant39894, - Variant39895, - Variant39896, - Variant39897, - Variant39898, - Variant39899, - Variant39900, - Variant39901, - Variant39902, - Variant39903, - Variant39904, - Variant39905, - Variant39906, - Variant39907, - Variant39908, - Variant39909, - Variant39910, - Variant39911, - Variant39912, - Variant39913, - Variant39914, - Variant39915, - Variant39916, - Variant39917, - Variant39918, - Variant39919, - Variant39920, - Variant39921, - Variant39922, - Variant39923, - Variant39924, - Variant39925, - Variant39926, - Variant39927, - Variant39928, - Variant39929, - Variant39930, - Variant39931, - Variant39932, - Variant39933, - Variant39934, - Variant39935, - Variant39936, - Variant39937, - Variant39938, - Variant39939, - Variant39940, - Variant39941, - Variant39942, - Variant39943, - Variant39944, - Variant39945, - Variant39946, - Variant39947, - Variant39948, - Variant39949, - Variant39950, - Variant39951, - Variant39952, - Variant39953, - Variant39954, - Variant39955, - Variant39956, - Variant39957, - Variant39958, - Variant39959, - Variant39960, - Variant39961, - Variant39962, - Variant39963, - Variant39964, - Variant39965, - Variant39966, - Variant39967, - Variant39968, - Variant39969, - Variant39970, - Variant39971, - Variant39972, - Variant39973, - Variant39974, - Variant39975, - Variant39976, - Variant39977, - Variant39978, - Variant39979, - Variant39980, - Variant39981, - Variant39982, - Variant39983, - Variant39984, - Variant39985, - Variant39986, - Variant39987, - Variant39988, - Variant39989, - Variant39990, - Variant39991, - Variant39992, - Variant39993, - Variant39994, - Variant39995, - Variant39996, - Variant39997, - Variant39998, - Variant39999, - Variant40000, - Variant40001, - Variant40002, - Variant40003, - Variant40004, - Variant40005, - Variant40006, - Variant40007, - Variant40008, - Variant40009, - Variant40010, - Variant40011, - Variant40012, - Variant40013, - Variant40014, - Variant40015, - Variant40016, - Variant40017, - Variant40018, - Variant40019, - Variant40020, - Variant40021, - Variant40022, - Variant40023, - Variant40024, - Variant40025, - Variant40026, - Variant40027, - Variant40028, - Variant40029, - Variant40030, - Variant40031, - Variant40032, - Variant40033, - Variant40034, - Variant40035, - Variant40036, - Variant40037, - Variant40038, - Variant40039, - Variant40040, - Variant40041, - Variant40042, - Variant40043, - Variant40044, - Variant40045, - Variant40046, - Variant40047, - Variant40048, - Variant40049, - Variant40050, - Variant40051, - Variant40052, - Variant40053, - Variant40054, - Variant40055, - Variant40056, - Variant40057, - Variant40058, - Variant40059, - Variant40060, - Variant40061, - Variant40062, - Variant40063, - Variant40064, - Variant40065, - Variant40066, - Variant40067, - Variant40068, - Variant40069, - Variant40070, - Variant40071, - Variant40072, - Variant40073, - Variant40074, - Variant40075, - Variant40076, - Variant40077, - Variant40078, - Variant40079, - Variant40080, - Variant40081, - Variant40082, - Variant40083, - Variant40084, - Variant40085, - Variant40086, - Variant40087, - Variant40088, - Variant40089, - Variant40090, - Variant40091, - Variant40092, - Variant40093, - Variant40094, - Variant40095, - Variant40096, - Variant40097, - Variant40098, - Variant40099, - Variant40100, - Variant40101, - Variant40102, - Variant40103, - Variant40104, - Variant40105, - Variant40106, - Variant40107, - Variant40108, - Variant40109, - Variant40110, - Variant40111, - Variant40112, - Variant40113, - Variant40114, - Variant40115, - Variant40116, - Variant40117, - Variant40118, - Variant40119, - Variant40120, - Variant40121, - Variant40122, - Variant40123, - Variant40124, - Variant40125, - Variant40126, - Variant40127, - Variant40128, - Variant40129, - Variant40130, - Variant40131, - Variant40132, - Variant40133, - Variant40134, - Variant40135, - Variant40136, - Variant40137, - Variant40138, - Variant40139, - Variant40140, - Variant40141, - Variant40142, - Variant40143, - Variant40144, - Variant40145, - Variant40146, - Variant40147, - Variant40148, - Variant40149, - Variant40150, - Variant40151, - Variant40152, - Variant40153, - Variant40154, - Variant40155, - Variant40156, - Variant40157, - Variant40158, - Variant40159, - Variant40160, - Variant40161, - Variant40162, - Variant40163, - Variant40164, - Variant40165, - Variant40166, - Variant40167, - Variant40168, - Variant40169, - Variant40170, - Variant40171, - Variant40172, - Variant40173, - Variant40174, - Variant40175, - Variant40176, - Variant40177, - Variant40178, - Variant40179, - Variant40180, - Variant40181, - Variant40182, - Variant40183, - Variant40184, - Variant40185, - Variant40186, - Variant40187, - Variant40188, - Variant40189, - Variant40190, - Variant40191, - Variant40192, - Variant40193, - Variant40194, - Variant40195, - Variant40196, - Variant40197, - Variant40198, - Variant40199, - Variant40200, - Variant40201, - Variant40202, - Variant40203, - Variant40204, - Variant40205, - Variant40206, - Variant40207, - Variant40208, - Variant40209, - Variant40210, - Variant40211, - Variant40212, - Variant40213, - Variant40214, - Variant40215, - Variant40216, - Variant40217, - Variant40218, - Variant40219, - Variant40220, - Variant40221, - Variant40222, - Variant40223, - Variant40224, - Variant40225, - Variant40226, - Variant40227, - Variant40228, - Variant40229, - Variant40230, - Variant40231, - Variant40232, - Variant40233, - Variant40234, - Variant40235, - Variant40236, - Variant40237, - Variant40238, - Variant40239, - Variant40240, - Variant40241, - Variant40242, - Variant40243, - Variant40244, - Variant40245, - Variant40246, - Variant40247, - Variant40248, - Variant40249, - Variant40250, - Variant40251, - Variant40252, - Variant40253, - Variant40254, - Variant40255, - Variant40256, - Variant40257, - Variant40258, - Variant40259, - Variant40260, - Variant40261, - Variant40262, - Variant40263, - Variant40264, - Variant40265, - Variant40266, - Variant40267, - Variant40268, - Variant40269, - Variant40270, - Variant40271, - Variant40272, - Variant40273, - Variant40274, - Variant40275, - Variant40276, - Variant40277, - Variant40278, - Variant40279, - Variant40280, - Variant40281, - Variant40282, - Variant40283, - Variant40284, - Variant40285, - Variant40286, - Variant40287, - Variant40288, - Variant40289, - Variant40290, - Variant40291, - Variant40292, - Variant40293, - Variant40294, - Variant40295, - Variant40296, - Variant40297, - Variant40298, - Variant40299, - Variant40300, - Variant40301, - Variant40302, - Variant40303, - Variant40304, - Variant40305, - Variant40306, - Variant40307, - Variant40308, - Variant40309, - Variant40310, - Variant40311, - Variant40312, - Variant40313, - Variant40314, - Variant40315, - Variant40316, - Variant40317, - Variant40318, - Variant40319, - Variant40320, - Variant40321, - Variant40322, - Variant40323, - Variant40324, - Variant40325, - Variant40326, - Variant40327, - Variant40328, - Variant40329, - Variant40330, - Variant40331, - Variant40332, - Variant40333, - Variant40334, - Variant40335, - Variant40336, - Variant40337, - Variant40338, - Variant40339, - Variant40340, - Variant40341, - Variant40342, - Variant40343, - Variant40344, - Variant40345, - Variant40346, - Variant40347, - Variant40348, - Variant40349, - Variant40350, - Variant40351, - Variant40352, - Variant40353, - Variant40354, - Variant40355, - Variant40356, - Variant40357, - Variant40358, - Variant40359, - Variant40360, - Variant40361, - Variant40362, - Variant40363, - Variant40364, - Variant40365, - Variant40366, - Variant40367, - Variant40368, - Variant40369, - Variant40370, - Variant40371, - Variant40372, - Variant40373, - Variant40374, - Variant40375, - Variant40376, - Variant40377, - Variant40378, - Variant40379, - Variant40380, - Variant40381, - Variant40382, - Variant40383, - Variant40384, - Variant40385, - Variant40386, - Variant40387, - Variant40388, - Variant40389, - Variant40390, - Variant40391, - Variant40392, - Variant40393, - Variant40394, - Variant40395, - Variant40396, - Variant40397, - Variant40398, - Variant40399, - Variant40400, - Variant40401, - Variant40402, - Variant40403, - Variant40404, - Variant40405, - Variant40406, - Variant40407, - Variant40408, - Variant40409, - Variant40410, - Variant40411, - Variant40412, - Variant40413, - Variant40414, - Variant40415, - Variant40416, - Variant40417, - Variant40418, - Variant40419, - Variant40420, - Variant40421, - Variant40422, - Variant40423, - Variant40424, - Variant40425, - Variant40426, - Variant40427, - Variant40428, - Variant40429, - Variant40430, - Variant40431, - Variant40432, - Variant40433, - Variant40434, - Variant40435, - Variant40436, - Variant40437, - Variant40438, - Variant40439, - Variant40440, - Variant40441, - Variant40442, - Variant40443, - Variant40444, - Variant40445, - Variant40446, - Variant40447, - Variant40448, - Variant40449, - Variant40450, - Variant40451, - Variant40452, - Variant40453, - Variant40454, - Variant40455, - Variant40456, - Variant40457, - Variant40458, - Variant40459, - Variant40460, - Variant40461, - Variant40462, - Variant40463, - Variant40464, - Variant40465, - Variant40466, - Variant40467, - Variant40468, - Variant40469, - Variant40470, - Variant40471, - Variant40472, - Variant40473, - Variant40474, - Variant40475, - Variant40476, - Variant40477, - Variant40478, - Variant40479, - Variant40480, - Variant40481, - Variant40482, - Variant40483, - Variant40484, - Variant40485, - Variant40486, - Variant40487, - Variant40488, - Variant40489, - Variant40490, - Variant40491, - Variant40492, - Variant40493, - Variant40494, - Variant40495, - Variant40496, - Variant40497, - Variant40498, - Variant40499, - Variant40500, - Variant40501, - Variant40502, - Variant40503, - Variant40504, - Variant40505, - Variant40506, - Variant40507, - Variant40508, - Variant40509, - Variant40510, - Variant40511, - Variant40512, - Variant40513, - Variant40514, - Variant40515, - Variant40516, - Variant40517, - Variant40518, - Variant40519, - Variant40520, - Variant40521, - Variant40522, - Variant40523, - Variant40524, - Variant40525, - Variant40526, - Variant40527, - Variant40528, - Variant40529, - Variant40530, - Variant40531, - Variant40532, - Variant40533, - Variant40534, - Variant40535, - Variant40536, - Variant40537, - Variant40538, - Variant40539, - Variant40540, - Variant40541, - Variant40542, - Variant40543, - Variant40544, - Variant40545, - Variant40546, - Variant40547, - Variant40548, - Variant40549, - Variant40550, - Variant40551, - Variant40552, - Variant40553, - Variant40554, - Variant40555, - Variant40556, - Variant40557, - Variant40558, - Variant40559, - Variant40560, - Variant40561, - Variant40562, - Variant40563, - Variant40564, - Variant40565, - Variant40566, - Variant40567, - Variant40568, - Variant40569, - Variant40570, - Variant40571, - Variant40572, - Variant40573, - Variant40574, - Variant40575, - Variant40576, - Variant40577, - Variant40578, - Variant40579, - Variant40580, - Variant40581, - Variant40582, - Variant40583, - Variant40584, - Variant40585, - Variant40586, - Variant40587, - Variant40588, - Variant40589, - Variant40590, - Variant40591, - Variant40592, - Variant40593, - Variant40594, - Variant40595, - Variant40596, - Variant40597, - Variant40598, - Variant40599, - Variant40600, - Variant40601, - Variant40602, - Variant40603, - Variant40604, - Variant40605, - Variant40606, - Variant40607, - Variant40608, - Variant40609, - Variant40610, - Variant40611, - Variant40612, - Variant40613, - Variant40614, - Variant40615, - Variant40616, - Variant40617, - Variant40618, - Variant40619, - Variant40620, - Variant40621, - Variant40622, - Variant40623, - Variant40624, - Variant40625, - Variant40626, - Variant40627, - Variant40628, - Variant40629, - Variant40630, - Variant40631, - Variant40632, - Variant40633, - Variant40634, - Variant40635, - Variant40636, - Variant40637, - Variant40638, - Variant40639, - Variant40640, - Variant40641, - Variant40642, - Variant40643, - Variant40644, - Variant40645, - Variant40646, - Variant40647, - Variant40648, - Variant40649, - Variant40650, - Variant40651, - Variant40652, - Variant40653, - Variant40654, - Variant40655, - Variant40656, - Variant40657, - Variant40658, - Variant40659, - Variant40660, - Variant40661, - Variant40662, - Variant40663, - Variant40664, - Variant40665, - Variant40666, - Variant40667, - Variant40668, - Variant40669, - Variant40670, - Variant40671, - Variant40672, - Variant40673, - Variant40674, - Variant40675, - Variant40676, - Variant40677, - Variant40678, - Variant40679, - Variant40680, - Variant40681, - Variant40682, - Variant40683, - Variant40684, - Variant40685, - Variant40686, - Variant40687, - Variant40688, - Variant40689, - Variant40690, - Variant40691, - Variant40692, - Variant40693, - Variant40694, - Variant40695, - Variant40696, - Variant40697, - Variant40698, - Variant40699, - Variant40700, - Variant40701, - Variant40702, - Variant40703, - Variant40704, - Variant40705, - Variant40706, - Variant40707, - Variant40708, - Variant40709, - Variant40710, - Variant40711, - Variant40712, - Variant40713, - Variant40714, - Variant40715, - Variant40716, - Variant40717, - Variant40718, - Variant40719, - Variant40720, - Variant40721, - Variant40722, - Variant40723, - Variant40724, - Variant40725, - Variant40726, - Variant40727, - Variant40728, - Variant40729, - Variant40730, - Variant40731, - Variant40732, - Variant40733, - Variant40734, - Variant40735, - Variant40736, - Variant40737, - Variant40738, - Variant40739, - Variant40740, - Variant40741, - Variant40742, - Variant40743, - Variant40744, - Variant40745, - Variant40746, - Variant40747, - Variant40748, - Variant40749, - Variant40750, - Variant40751, - Variant40752, - Variant40753, - Variant40754, - Variant40755, - Variant40756, - Variant40757, - Variant40758, - Variant40759, - Variant40760, - Variant40761, - Variant40762, - Variant40763, - Variant40764, - Variant40765, - Variant40766, - Variant40767, - Variant40768, - Variant40769, - Variant40770, - Variant40771, - Variant40772, - Variant40773, - Variant40774, - Variant40775, - Variant40776, - Variant40777, - Variant40778, - Variant40779, - Variant40780, - Variant40781, - Variant40782, - Variant40783, - Variant40784, - Variant40785, - Variant40786, - Variant40787, - Variant40788, - Variant40789, - Variant40790, - Variant40791, - Variant40792, - Variant40793, - Variant40794, - Variant40795, - Variant40796, - Variant40797, - Variant40798, - Variant40799, - Variant40800, - Variant40801, - Variant40802, - Variant40803, - Variant40804, - Variant40805, - Variant40806, - Variant40807, - Variant40808, - Variant40809, - Variant40810, - Variant40811, - Variant40812, - Variant40813, - Variant40814, - Variant40815, - Variant40816, - Variant40817, - Variant40818, - Variant40819, - Variant40820, - Variant40821, - Variant40822, - Variant40823, - Variant40824, - Variant40825, - Variant40826, - Variant40827, - Variant40828, - Variant40829, - Variant40830, - Variant40831, - Variant40832, - Variant40833, - Variant40834, - Variant40835, - Variant40836, - Variant40837, - Variant40838, - Variant40839, - Variant40840, - Variant40841, - Variant40842, - Variant40843, - Variant40844, - Variant40845, - Variant40846, - Variant40847, - Variant40848, - Variant40849, - Variant40850, - Variant40851, - Variant40852, - Variant40853, - Variant40854, - Variant40855, - Variant40856, - Variant40857, - Variant40858, - Variant40859, - Variant40860, - Variant40861, - Variant40862, - Variant40863, - Variant40864, - Variant40865, - Variant40866, - Variant40867, - Variant40868, - Variant40869, - Variant40870, - Variant40871, - Variant40872, - Variant40873, - Variant40874, - Variant40875, - Variant40876, - Variant40877, - Variant40878, - Variant40879, - Variant40880, - Variant40881, - Variant40882, - Variant40883, - Variant40884, - Variant40885, - Variant40886, - Variant40887, - Variant40888, - Variant40889, - Variant40890, - Variant40891, - Variant40892, - Variant40893, - Variant40894, - Variant40895, - Variant40896, - Variant40897, - Variant40898, - Variant40899, - Variant40900, - Variant40901, - Variant40902, - Variant40903, - Variant40904, - Variant40905, - Variant40906, - Variant40907, - Variant40908, - Variant40909, - Variant40910, - Variant40911, - Variant40912, - Variant40913, - Variant40914, - Variant40915, - Variant40916, - Variant40917, - Variant40918, - Variant40919, - Variant40920, - Variant40921, - Variant40922, - Variant40923, - Variant40924, - Variant40925, - Variant40926, - Variant40927, - Variant40928, - Variant40929, - Variant40930, - Variant40931, - Variant40932, - Variant40933, - Variant40934, - Variant40935, - Variant40936, - Variant40937, - Variant40938, - Variant40939, - Variant40940, - Variant40941, - Variant40942, - Variant40943, - Variant40944, - Variant40945, - Variant40946, - Variant40947, - Variant40948, - Variant40949, - Variant40950, - Variant40951, - Variant40952, - Variant40953, - Variant40954, - Variant40955, - Variant40956, - Variant40957, - Variant40958, - Variant40959, - Variant40960, - Variant40961, - Variant40962, - Variant40963, - Variant40964, - Variant40965, - Variant40966, - Variant40967, - Variant40968, - Variant40969, - Variant40970, - Variant40971, - Variant40972, - Variant40973, - Variant40974, - Variant40975, - Variant40976, - Variant40977, - Variant40978, - Variant40979, - Variant40980, - Variant40981, - Variant40982, - Variant40983, - Variant40984, - Variant40985, - Variant40986, - Variant40987, - Variant40988, - Variant40989, - Variant40990, - Variant40991, - Variant40992, - Variant40993, - Variant40994, - Variant40995, - Variant40996, - Variant40997, - Variant40998, - Variant40999, - Variant41000, - Variant41001, - Variant41002, - Variant41003, - Variant41004, - Variant41005, - Variant41006, - Variant41007, - Variant41008, - Variant41009, - Variant41010, - Variant41011, - Variant41012, - Variant41013, - Variant41014, - Variant41015, - Variant41016, - Variant41017, - Variant41018, - Variant41019, - Variant41020, - Variant41021, - Variant41022, - Variant41023, - Variant41024, - Variant41025, - Variant41026, - Variant41027, - Variant41028, - Variant41029, - Variant41030, - Variant41031, - Variant41032, - Variant41033, - Variant41034, - Variant41035, - Variant41036, - Variant41037, - Variant41038, - Variant41039, - Variant41040, - Variant41041, - Variant41042, - Variant41043, - Variant41044, - Variant41045, - Variant41046, - Variant41047, - Variant41048, - Variant41049, - Variant41050, - Variant41051, - Variant41052, - Variant41053, - Variant41054, - Variant41055, - Variant41056, - Variant41057, - Variant41058, - Variant41059, - Variant41060, - Variant41061, - Variant41062, - Variant41063, - Variant41064, - Variant41065, - Variant41066, - Variant41067, - Variant41068, - Variant41069, - Variant41070, - Variant41071, - Variant41072, - Variant41073, - Variant41074, - Variant41075, - Variant41076, - Variant41077, - Variant41078, - Variant41079, - Variant41080, - Variant41081, - Variant41082, - Variant41083, - Variant41084, - Variant41085, - Variant41086, - Variant41087, - Variant41088, - Variant41089, - Variant41090, - Variant41091, - Variant41092, - Variant41093, - Variant41094, - Variant41095, - Variant41096, - Variant41097, - Variant41098, - Variant41099, - Variant41100, - Variant41101, - Variant41102, - Variant41103, - Variant41104, - Variant41105, - Variant41106, - Variant41107, - Variant41108, - Variant41109, - Variant41110, - Variant41111, - Variant41112, - Variant41113, - Variant41114, - Variant41115, - Variant41116, - Variant41117, - Variant41118, - Variant41119, - Variant41120, - Variant41121, - Variant41122, - Variant41123, - Variant41124, - Variant41125, - Variant41126, - Variant41127, - Variant41128, - Variant41129, - Variant41130, - Variant41131, - Variant41132, - Variant41133, - Variant41134, - Variant41135, - Variant41136, - Variant41137, - Variant41138, - Variant41139, - Variant41140, - Variant41141, - Variant41142, - Variant41143, - Variant41144, - Variant41145, - Variant41146, - Variant41147, - Variant41148, - Variant41149, - Variant41150, - Variant41151, - Variant41152, - Variant41153, - Variant41154, - Variant41155, - Variant41156, - Variant41157, - Variant41158, - Variant41159, - Variant41160, - Variant41161, - Variant41162, - Variant41163, - Variant41164, - Variant41165, - Variant41166, - Variant41167, - Variant41168, - Variant41169, - Variant41170, - Variant41171, - Variant41172, - Variant41173, - Variant41174, - Variant41175, - Variant41176, - Variant41177, - Variant41178, - Variant41179, - Variant41180, - Variant41181, - Variant41182, - Variant41183, - Variant41184, - Variant41185, - Variant41186, - Variant41187, - Variant41188, - Variant41189, - Variant41190, - Variant41191, - Variant41192, - Variant41193, - Variant41194, - Variant41195, - Variant41196, - Variant41197, - Variant41198, - Variant41199, - Variant41200, - Variant41201, - Variant41202, - Variant41203, - Variant41204, - Variant41205, - Variant41206, - Variant41207, - Variant41208, - Variant41209, - Variant41210, - Variant41211, - Variant41212, - Variant41213, - Variant41214, - Variant41215, - Variant41216, - Variant41217, - Variant41218, - Variant41219, - Variant41220, - Variant41221, - Variant41222, - Variant41223, - Variant41224, - Variant41225, - Variant41226, - Variant41227, - Variant41228, - Variant41229, - Variant41230, - Variant41231, - Variant41232, - Variant41233, - Variant41234, - Variant41235, - Variant41236, - Variant41237, - Variant41238, - Variant41239, - Variant41240, - Variant41241, - Variant41242, - Variant41243, - Variant41244, - Variant41245, - Variant41246, - Variant41247, - Variant41248, - Variant41249, - Variant41250, - Variant41251, - Variant41252, - Variant41253, - Variant41254, - Variant41255, - Variant41256, - Variant41257, - Variant41258, - Variant41259, - Variant41260, - Variant41261, - Variant41262, - Variant41263, - Variant41264, - Variant41265, - Variant41266, - Variant41267, - Variant41268, - Variant41269, - Variant41270, - Variant41271, - Variant41272, - Variant41273, - Variant41274, - Variant41275, - Variant41276, - Variant41277, - Variant41278, - Variant41279, - Variant41280, - Variant41281, - Variant41282, - Variant41283, - Variant41284, - Variant41285, - Variant41286, - Variant41287, - Variant41288, - Variant41289, - Variant41290, - Variant41291, - Variant41292, - Variant41293, - Variant41294, - Variant41295, - Variant41296, - Variant41297, - Variant41298, - Variant41299, - Variant41300, - Variant41301, - Variant41302, - Variant41303, - Variant41304, - Variant41305, - Variant41306, - Variant41307, - Variant41308, - Variant41309, - Variant41310, - Variant41311, - Variant41312, - Variant41313, - Variant41314, - Variant41315, - Variant41316, - Variant41317, - Variant41318, - Variant41319, - Variant41320, - Variant41321, - Variant41322, - Variant41323, - Variant41324, - Variant41325, - Variant41326, - Variant41327, - Variant41328, - Variant41329, - Variant41330, - Variant41331, - Variant41332, - Variant41333, - Variant41334, - Variant41335, - Variant41336, - Variant41337, - Variant41338, - Variant41339, - Variant41340, - Variant41341, - Variant41342, - Variant41343, - Variant41344, - Variant41345, - Variant41346, - Variant41347, - Variant41348, - Variant41349, - Variant41350, - Variant41351, - Variant41352, - Variant41353, - Variant41354, - Variant41355, - Variant41356, - Variant41357, - Variant41358, - Variant41359, - Variant41360, - Variant41361, - Variant41362, - Variant41363, - Variant41364, - Variant41365, - Variant41366, - Variant41367, - Variant41368, - Variant41369, - Variant41370, - Variant41371, - Variant41372, - Variant41373, - Variant41374, - Variant41375, - Variant41376, - Variant41377, - Variant41378, - Variant41379, - Variant41380, - Variant41381, - Variant41382, - Variant41383, - Variant41384, - Variant41385, - Variant41386, - Variant41387, - Variant41388, - Variant41389, - Variant41390, - Variant41391, - Variant41392, - Variant41393, - Variant41394, - Variant41395, - Variant41396, - Variant41397, - Variant41398, - Variant41399, - Variant41400, - Variant41401, - Variant41402, - Variant41403, - Variant41404, - Variant41405, - Variant41406, - Variant41407, - Variant41408, - Variant41409, - Variant41410, - Variant41411, - Variant41412, - Variant41413, - Variant41414, - Variant41415, - Variant41416, - Variant41417, - Variant41418, - Variant41419, - Variant41420, - Variant41421, - Variant41422, - Variant41423, - Variant41424, - Variant41425, - Variant41426, - Variant41427, - Variant41428, - Variant41429, - Variant41430, - Variant41431, - Variant41432, - Variant41433, - Variant41434, - Variant41435, - Variant41436, - Variant41437, - Variant41438, - Variant41439, - Variant41440, - Variant41441, - Variant41442, - Variant41443, - Variant41444, - Variant41445, - Variant41446, - Variant41447, - Variant41448, - Variant41449, - Variant41450, - Variant41451, - Variant41452, - Variant41453, - Variant41454, - Variant41455, - Variant41456, - Variant41457, - Variant41458, - Variant41459, - Variant41460, - Variant41461, - Variant41462, - Variant41463, - Variant41464, - Variant41465, - Variant41466, - Variant41467, - Variant41468, - Variant41469, - Variant41470, - Variant41471, - Variant41472, - Variant41473, - Variant41474, - Variant41475, - Variant41476, - Variant41477, - Variant41478, - Variant41479, - Variant41480, - Variant41481, - Variant41482, - Variant41483, - Variant41484, - Variant41485, - Variant41486, - Variant41487, - Variant41488, - Variant41489, - Variant41490, - Variant41491, - Variant41492, - Variant41493, - Variant41494, - Variant41495, - Variant41496, - Variant41497, - Variant41498, - Variant41499, - Variant41500, - Variant41501, - Variant41502, - Variant41503, - Variant41504, - Variant41505, - Variant41506, - Variant41507, - Variant41508, - Variant41509, - Variant41510, - Variant41511, - Variant41512, - Variant41513, - Variant41514, - Variant41515, - Variant41516, - Variant41517, - Variant41518, - Variant41519, - Variant41520, - Variant41521, - Variant41522, - Variant41523, - Variant41524, - Variant41525, - Variant41526, - Variant41527, - Variant41528, - Variant41529, - Variant41530, - Variant41531, - Variant41532, - Variant41533, - Variant41534, - Variant41535, - Variant41536, - Variant41537, - Variant41538, - Variant41539, - Variant41540, - Variant41541, - Variant41542, - Variant41543, - Variant41544, - Variant41545, - Variant41546, - Variant41547, - Variant41548, - Variant41549, - Variant41550, - Variant41551, - Variant41552, - Variant41553, - Variant41554, - Variant41555, - Variant41556, - Variant41557, - Variant41558, - Variant41559, - Variant41560, - Variant41561, - Variant41562, - Variant41563, - Variant41564, - Variant41565, - Variant41566, - Variant41567, - Variant41568, - Variant41569, - Variant41570, - Variant41571, - Variant41572, - Variant41573, - Variant41574, - Variant41575, - Variant41576, - Variant41577, - Variant41578, - Variant41579, - Variant41580, - Variant41581, - Variant41582, - Variant41583, - Variant41584, - Variant41585, - Variant41586, - Variant41587, - Variant41588, - Variant41589, - Variant41590, - Variant41591, - Variant41592, - Variant41593, - Variant41594, - Variant41595, - Variant41596, - Variant41597, - Variant41598, - Variant41599, - Variant41600, - Variant41601, - Variant41602, - Variant41603, - Variant41604, - Variant41605, - Variant41606, - Variant41607, - Variant41608, - Variant41609, - Variant41610, - Variant41611, - Variant41612, - Variant41613, - Variant41614, - Variant41615, - Variant41616, - Variant41617, - Variant41618, - Variant41619, - Variant41620, - Variant41621, - Variant41622, - Variant41623, - Variant41624, - Variant41625, - Variant41626, - Variant41627, - Variant41628, - Variant41629, - Variant41630, - Variant41631, - Variant41632, - Variant41633, - Variant41634, - Variant41635, - Variant41636, - Variant41637, - Variant41638, - Variant41639, - Variant41640, - Variant41641, - Variant41642, - Variant41643, - Variant41644, - Variant41645, - Variant41646, - Variant41647, - Variant41648, - Variant41649, - Variant41650, - Variant41651, - Variant41652, - Variant41653, - Variant41654, - Variant41655, - Variant41656, - Variant41657, - Variant41658, - Variant41659, - Variant41660, - Variant41661, - Variant41662, - Variant41663, - Variant41664, - Variant41665, - Variant41666, - Variant41667, - Variant41668, - Variant41669, - Variant41670, - Variant41671, - Variant41672, - Variant41673, - Variant41674, - Variant41675, - Variant41676, - Variant41677, - Variant41678, - Variant41679, - Variant41680, - Variant41681, - Variant41682, - Variant41683, - Variant41684, - Variant41685, - Variant41686, - Variant41687, - Variant41688, - Variant41689, - Variant41690, - Variant41691, - Variant41692, - Variant41693, - Variant41694, - Variant41695, - Variant41696, - Variant41697, - Variant41698, - Variant41699, - Variant41700, - Variant41701, - Variant41702, - Variant41703, - Variant41704, - Variant41705, - Variant41706, - Variant41707, - Variant41708, - Variant41709, - Variant41710, - Variant41711, - Variant41712, - Variant41713, - Variant41714, - Variant41715, - Variant41716, - Variant41717, - Variant41718, - Variant41719, - Variant41720, - Variant41721, - Variant41722, - Variant41723, - Variant41724, - Variant41725, - Variant41726, - Variant41727, - Variant41728, - Variant41729, - Variant41730, - Variant41731, - Variant41732, - Variant41733, - Variant41734, - Variant41735, - Variant41736, - Variant41737, - Variant41738, - Variant41739, - Variant41740, - Variant41741, - Variant41742, - Variant41743, - Variant41744, - Variant41745, - Variant41746, - Variant41747, - Variant41748, - Variant41749, - Variant41750, - Variant41751, - Variant41752, - Variant41753, - Variant41754, - Variant41755, - Variant41756, - Variant41757, - Variant41758, - Variant41759, - Variant41760, - Variant41761, - Variant41762, - Variant41763, - Variant41764, - Variant41765, - Variant41766, - Variant41767, - Variant41768, - Variant41769, - Variant41770, - Variant41771, - Variant41772, - Variant41773, - Variant41774, - Variant41775, - Variant41776, - Variant41777, - Variant41778, - Variant41779, - Variant41780, - Variant41781, - Variant41782, - Variant41783, - Variant41784, - Variant41785, - Variant41786, - Variant41787, - Variant41788, - Variant41789, - Variant41790, - Variant41791, - Variant41792, - Variant41793, - Variant41794, - Variant41795, - Variant41796, - Variant41797, - Variant41798, - Variant41799, - Variant41800, - Variant41801, - Variant41802, - Variant41803, - Variant41804, - Variant41805, - Variant41806, - Variant41807, - Variant41808, - Variant41809, - Variant41810, - Variant41811, - Variant41812, - Variant41813, - Variant41814, - Variant41815, - Variant41816, - Variant41817, - Variant41818, - Variant41819, - Variant41820, - Variant41821, - Variant41822, - Variant41823, - Variant41824, - Variant41825, - Variant41826, - Variant41827, - Variant41828, - Variant41829, - Variant41830, - Variant41831, - Variant41832, - Variant41833, - Variant41834, - Variant41835, - Variant41836, - Variant41837, - Variant41838, - Variant41839, - Variant41840, - Variant41841, - Variant41842, - Variant41843, - Variant41844, - Variant41845, - Variant41846, - Variant41847, - Variant41848, - Variant41849, - Variant41850, - Variant41851, - Variant41852, - Variant41853, - Variant41854, - Variant41855, - Variant41856, - Variant41857, - Variant41858, - Variant41859, - Variant41860, - Variant41861, - Variant41862, - Variant41863, - Variant41864, - Variant41865, - Variant41866, - Variant41867, - Variant41868, - Variant41869, - Variant41870, - Variant41871, - Variant41872, - Variant41873, - Variant41874, - Variant41875, - Variant41876, - Variant41877, - Variant41878, - Variant41879, - Variant41880, - Variant41881, - Variant41882, - Variant41883, - Variant41884, - Variant41885, - Variant41886, - Variant41887, - Variant41888, - Variant41889, - Variant41890, - Variant41891, - Variant41892, - Variant41893, - Variant41894, - Variant41895, - Variant41896, - Variant41897, - Variant41898, - Variant41899, - Variant41900, - Variant41901, - Variant41902, - Variant41903, - Variant41904, - Variant41905, - Variant41906, - Variant41907, - Variant41908, - Variant41909, - Variant41910, - Variant41911, - Variant41912, - Variant41913, - Variant41914, - Variant41915, - Variant41916, - Variant41917, - Variant41918, - Variant41919, - Variant41920, - Variant41921, - Variant41922, - Variant41923, - Variant41924, - Variant41925, - Variant41926, - Variant41927, - Variant41928, - Variant41929, - Variant41930, - Variant41931, - Variant41932, - Variant41933, - Variant41934, - Variant41935, - Variant41936, - Variant41937, - Variant41938, - Variant41939, - Variant41940, - Variant41941, - Variant41942, - Variant41943, - Variant41944, - Variant41945, - Variant41946, - Variant41947, - Variant41948, - Variant41949, - Variant41950, - Variant41951, - Variant41952, - Variant41953, - Variant41954, - Variant41955, - Variant41956, - Variant41957, - Variant41958, - Variant41959, - Variant41960, - Variant41961, - Variant41962, - Variant41963, - Variant41964, - Variant41965, - Variant41966, - Variant41967, - Variant41968, - Variant41969, - Variant41970, - Variant41971, - Variant41972, - Variant41973, - Variant41974, - Variant41975, - Variant41976, - Variant41977, - Variant41978, - Variant41979, - Variant41980, - Variant41981, - Variant41982, - Variant41983, - Variant41984, - Variant41985, - Variant41986, - Variant41987, - Variant41988, - Variant41989, - Variant41990, - Variant41991, - Variant41992, - Variant41993, - Variant41994, - Variant41995, - Variant41996, - Variant41997, - Variant41998, - Variant41999, - Variant42000, - Variant42001, - Variant42002, - Variant42003, - Variant42004, - Variant42005, - Variant42006, - Variant42007, - Variant42008, - Variant42009, - Variant42010, - Variant42011, - Variant42012, - Variant42013, - Variant42014, - Variant42015, - Variant42016, - Variant42017, - Variant42018, - Variant42019, - Variant42020, - Variant42021, - Variant42022, - Variant42023, - Variant42024, - Variant42025, - Variant42026, - Variant42027, - Variant42028, - Variant42029, - Variant42030, - Variant42031, - Variant42032, - Variant42033, - Variant42034, - Variant42035, - Variant42036, - Variant42037, - Variant42038, - Variant42039, - Variant42040, - Variant42041, - Variant42042, - Variant42043, - Variant42044, - Variant42045, - Variant42046, - Variant42047, - Variant42048, - Variant42049, - Variant42050, - Variant42051, - Variant42052, - Variant42053, - Variant42054, - Variant42055, - Variant42056, - Variant42057, - Variant42058, - Variant42059, - Variant42060, - Variant42061, - Variant42062, - Variant42063, - Variant42064, - Variant42065, - Variant42066, - Variant42067, - Variant42068, - Variant42069, - Variant42070, - Variant42071, - Variant42072, - Variant42073, - Variant42074, - Variant42075, - Variant42076, - Variant42077, - Variant42078, - Variant42079, - Variant42080, - Variant42081, - Variant42082, - Variant42083, - Variant42084, - Variant42085, - Variant42086, - Variant42087, - Variant42088, - Variant42089, - Variant42090, - Variant42091, - Variant42092, - Variant42093, - Variant42094, - Variant42095, - Variant42096, - Variant42097, - Variant42098, - Variant42099, - Variant42100, - Variant42101, - Variant42102, - Variant42103, - Variant42104, - Variant42105, - Variant42106, - Variant42107, - Variant42108, - Variant42109, - Variant42110, - Variant42111, - Variant42112, - Variant42113, - Variant42114, - Variant42115, - Variant42116, - Variant42117, - Variant42118, - Variant42119, - Variant42120, - Variant42121, - Variant42122, - Variant42123, - Variant42124, - Variant42125, - Variant42126, - Variant42127, - Variant42128, - Variant42129, - Variant42130, - Variant42131, - Variant42132, - Variant42133, - Variant42134, - Variant42135, - Variant42136, - Variant42137, - Variant42138, - Variant42139, - Variant42140, - Variant42141, - Variant42142, - Variant42143, - Variant42144, - Variant42145, - Variant42146, - Variant42147, - Variant42148, - Variant42149, - Variant42150, - Variant42151, - Variant42152, - Variant42153, - Variant42154, - Variant42155, - Variant42156, - Variant42157, - Variant42158, - Variant42159, - Variant42160, - Variant42161, - Variant42162, - Variant42163, - Variant42164, - Variant42165, - Variant42166, - Variant42167, - Variant42168, - Variant42169, - Variant42170, - Variant42171, - Variant42172, - Variant42173, - Variant42174, - Variant42175, - Variant42176, - Variant42177, - Variant42178, - Variant42179, - Variant42180, - Variant42181, - Variant42182, - Variant42183, - Variant42184, - Variant42185, - Variant42186, - Variant42187, - Variant42188, - Variant42189, - Variant42190, - Variant42191, - Variant42192, - Variant42193, - Variant42194, - Variant42195, - Variant42196, - Variant42197, - Variant42198, - Variant42199, - Variant42200, - Variant42201, - Variant42202, - Variant42203, - Variant42204, - Variant42205, - Variant42206, - Variant42207, - Variant42208, - Variant42209, - Variant42210, - Variant42211, - Variant42212, - Variant42213, - Variant42214, - Variant42215, - Variant42216, - Variant42217, - Variant42218, - Variant42219, - Variant42220, - Variant42221, - Variant42222, - Variant42223, - Variant42224, - Variant42225, - Variant42226, - Variant42227, - Variant42228, - Variant42229, - Variant42230, - Variant42231, - Variant42232, - Variant42233, - Variant42234, - Variant42235, - Variant42236, - Variant42237, - Variant42238, - Variant42239, - Variant42240, - Variant42241, - Variant42242, - Variant42243, - Variant42244, - Variant42245, - Variant42246, - Variant42247, - Variant42248, - Variant42249, - Variant42250, - Variant42251, - Variant42252, - Variant42253, - Variant42254, - Variant42255, - Variant42256, - Variant42257, - Variant42258, - Variant42259, - Variant42260, - Variant42261, - Variant42262, - Variant42263, - Variant42264, - Variant42265, - Variant42266, - Variant42267, - Variant42268, - Variant42269, - Variant42270, - Variant42271, - Variant42272, - Variant42273, - Variant42274, - Variant42275, - Variant42276, - Variant42277, - Variant42278, - Variant42279, - Variant42280, - Variant42281, - Variant42282, - Variant42283, - Variant42284, - Variant42285, - Variant42286, - Variant42287, - Variant42288, - Variant42289, - Variant42290, - Variant42291, - Variant42292, - Variant42293, - Variant42294, - Variant42295, - Variant42296, - Variant42297, - Variant42298, - Variant42299, - Variant42300, - Variant42301, - Variant42302, - Variant42303, - Variant42304, - Variant42305, - Variant42306, - Variant42307, - Variant42308, - Variant42309, - Variant42310, - Variant42311, - Variant42312, - Variant42313, - Variant42314, - Variant42315, - Variant42316, - Variant42317, - Variant42318, - Variant42319, - Variant42320, - Variant42321, - Variant42322, - Variant42323, - Variant42324, - Variant42325, - Variant42326, - Variant42327, - Variant42328, - Variant42329, - Variant42330, - Variant42331, - Variant42332, - Variant42333, - Variant42334, - Variant42335, - Variant42336, - Variant42337, - Variant42338, - Variant42339, - Variant42340, - Variant42341, - Variant42342, - Variant42343, - Variant42344, - Variant42345, - Variant42346, - Variant42347, - Variant42348, - Variant42349, - Variant42350, - Variant42351, - Variant42352, - Variant42353, - Variant42354, - Variant42355, - Variant42356, - Variant42357, - Variant42358, - Variant42359, - Variant42360, - Variant42361, - Variant42362, - Variant42363, - Variant42364, - Variant42365, - Variant42366, - Variant42367, - Variant42368, - Variant42369, - Variant42370, - Variant42371, - Variant42372, - Variant42373, - Variant42374, - Variant42375, - Variant42376, - Variant42377, - Variant42378, - Variant42379, - Variant42380, - Variant42381, - Variant42382, - Variant42383, - Variant42384, - Variant42385, - Variant42386, - Variant42387, - Variant42388, - Variant42389, - Variant42390, - Variant42391, - Variant42392, - Variant42393, - Variant42394, - Variant42395, - Variant42396, - Variant42397, - Variant42398, - Variant42399, - Variant42400, - Variant42401, - Variant42402, - Variant42403, - Variant42404, - Variant42405, - Variant42406, - Variant42407, - Variant42408, - Variant42409, - Variant42410, - Variant42411, - Variant42412, - Variant42413, - Variant42414, - Variant42415, - Variant42416, - Variant42417, - Variant42418, - Variant42419, - Variant42420, - Variant42421, - Variant42422, - Variant42423, - Variant42424, - Variant42425, - Variant42426, - Variant42427, - Variant42428, - Variant42429, - Variant42430, - Variant42431, - Variant42432, - Variant42433, - Variant42434, - Variant42435, - Variant42436, - Variant42437, - Variant42438, - Variant42439, - Variant42440, - Variant42441, - Variant42442, - Variant42443, - Variant42444, - Variant42445, - Variant42446, - Variant42447, - Variant42448, - Variant42449, - Variant42450, - Variant42451, - Variant42452, - Variant42453, - Variant42454, - Variant42455, - Variant42456, - Variant42457, - Variant42458, - Variant42459, - Variant42460, - Variant42461, - Variant42462, - Variant42463, - Variant42464, - Variant42465, - Variant42466, - Variant42467, - Variant42468, - Variant42469, - Variant42470, - Variant42471, - Variant42472, - Variant42473, - Variant42474, - Variant42475, - Variant42476, - Variant42477, - Variant42478, - Variant42479, - Variant42480, - Variant42481, - Variant42482, - Variant42483, - Variant42484, - Variant42485, - Variant42486, - Variant42487, - Variant42488, - Variant42489, - Variant42490, - Variant42491, - Variant42492, - Variant42493, - Variant42494, - Variant42495, - Variant42496, - Variant42497, - Variant42498, - Variant42499, - Variant42500, - Variant42501, - Variant42502, - Variant42503, - Variant42504, - Variant42505, - Variant42506, - Variant42507, - Variant42508, - Variant42509, - Variant42510, - Variant42511, - Variant42512, - Variant42513, - Variant42514, - Variant42515, - Variant42516, - Variant42517, - Variant42518, - Variant42519, - Variant42520, - Variant42521, - Variant42522, - Variant42523, - Variant42524, - Variant42525, - Variant42526, - Variant42527, - Variant42528, - Variant42529, - Variant42530, - Variant42531, - Variant42532, - Variant42533, - Variant42534, - Variant42535, - Variant42536, - Variant42537, - Variant42538, - Variant42539, - Variant42540, - Variant42541, - Variant42542, - Variant42543, - Variant42544, - Variant42545, - Variant42546, - Variant42547, - Variant42548, - Variant42549, - Variant42550, - Variant42551, - Variant42552, - Variant42553, - Variant42554, - Variant42555, - Variant42556, - Variant42557, - Variant42558, - Variant42559, - Variant42560, - Variant42561, - Variant42562, - Variant42563, - Variant42564, - Variant42565, - Variant42566, - Variant42567, - Variant42568, - Variant42569, - Variant42570, - Variant42571, - Variant42572, - Variant42573, - Variant42574, - Variant42575, - Variant42576, - Variant42577, - Variant42578, - Variant42579, - Variant42580, - Variant42581, - Variant42582, - Variant42583, - Variant42584, - Variant42585, - Variant42586, - Variant42587, - Variant42588, - Variant42589, - Variant42590, - Variant42591, - Variant42592, - Variant42593, - Variant42594, - Variant42595, - Variant42596, - Variant42597, - Variant42598, - Variant42599, - Variant42600, - Variant42601, - Variant42602, - Variant42603, - Variant42604, - Variant42605, - Variant42606, - Variant42607, - Variant42608, - Variant42609, - Variant42610, - Variant42611, - Variant42612, - Variant42613, - Variant42614, - Variant42615, - Variant42616, - Variant42617, - Variant42618, - Variant42619, - Variant42620, - Variant42621, - Variant42622, - Variant42623, - Variant42624, - Variant42625, - Variant42626, - Variant42627, - Variant42628, - Variant42629, - Variant42630, - Variant42631, - Variant42632, - Variant42633, - Variant42634, - Variant42635, - Variant42636, - Variant42637, - Variant42638, - Variant42639, - Variant42640, - Variant42641, - Variant42642, - Variant42643, - Variant42644, - Variant42645, - Variant42646, - Variant42647, - Variant42648, - Variant42649, - Variant42650, - Variant42651, - Variant42652, - Variant42653, - Variant42654, - Variant42655, - Variant42656, - Variant42657, - Variant42658, - Variant42659, - Variant42660, - Variant42661, - Variant42662, - Variant42663, - Variant42664, - Variant42665, - Variant42666, - Variant42667, - Variant42668, - Variant42669, - Variant42670, - Variant42671, - Variant42672, - Variant42673, - Variant42674, - Variant42675, - Variant42676, - Variant42677, - Variant42678, - Variant42679, - Variant42680, - Variant42681, - Variant42682, - Variant42683, - Variant42684, - Variant42685, - Variant42686, - Variant42687, - Variant42688, - Variant42689, - Variant42690, - Variant42691, - Variant42692, - Variant42693, - Variant42694, - Variant42695, - Variant42696, - Variant42697, - Variant42698, - Variant42699, - Variant42700, - Variant42701, - Variant42702, - Variant42703, - Variant42704, - Variant42705, - Variant42706, - Variant42707, - Variant42708, - Variant42709, - Variant42710, - Variant42711, - Variant42712, - Variant42713, - Variant42714, - Variant42715, - Variant42716, - Variant42717, - Variant42718, - Variant42719, - Variant42720, - Variant42721, - Variant42722, - Variant42723, - Variant42724, - Variant42725, - Variant42726, - Variant42727, - Variant42728, - Variant42729, - Variant42730, - Variant42731, - Variant42732, - Variant42733, - Variant42734, - Variant42735, - Variant42736, - Variant42737, - Variant42738, - Variant42739, - Variant42740, - Variant42741, - Variant42742, - Variant42743, - Variant42744, - Variant42745, - Variant42746, - Variant42747, - Variant42748, - Variant42749, - Variant42750, - Variant42751, - Variant42752, - Variant42753, - Variant42754, - Variant42755, - Variant42756, - Variant42757, - Variant42758, - Variant42759, - Variant42760, - Variant42761, - Variant42762, - Variant42763, - Variant42764, - Variant42765, - Variant42766, - Variant42767, - Variant42768, - Variant42769, - Variant42770, - Variant42771, - Variant42772, - Variant42773, - Variant42774, - Variant42775, - Variant42776, - Variant42777, - Variant42778, - Variant42779, - Variant42780, - Variant42781, - Variant42782, - Variant42783, - Variant42784, - Variant42785, - Variant42786, - Variant42787, - Variant42788, - Variant42789, - Variant42790, - Variant42791, - Variant42792, - Variant42793, - Variant42794, - Variant42795, - Variant42796, - Variant42797, - Variant42798, - Variant42799, - Variant42800, - Variant42801, - Variant42802, - Variant42803, - Variant42804, - Variant42805, - Variant42806, - Variant42807, - Variant42808, - Variant42809, - Variant42810, - Variant42811, - Variant42812, - Variant42813, - Variant42814, - Variant42815, - Variant42816, - Variant42817, - Variant42818, - Variant42819, - Variant42820, - Variant42821, - Variant42822, - Variant42823, - Variant42824, - Variant42825, - Variant42826, - Variant42827, - Variant42828, - Variant42829, - Variant42830, - Variant42831, - Variant42832, - Variant42833, - Variant42834, - Variant42835, - Variant42836, - Variant42837, - Variant42838, - Variant42839, - Variant42840, - Variant42841, - Variant42842, - Variant42843, - Variant42844, - Variant42845, - Variant42846, - Variant42847, - Variant42848, - Variant42849, - Variant42850, - Variant42851, - Variant42852, - Variant42853, - Variant42854, - Variant42855, - Variant42856, - Variant42857, - Variant42858, - Variant42859, - Variant42860, - Variant42861, - Variant42862, - Variant42863, - Variant42864, - Variant42865, - Variant42866, - Variant42867, - Variant42868, - Variant42869, - Variant42870, - Variant42871, - Variant42872, - Variant42873, - Variant42874, - Variant42875, - Variant42876, - Variant42877, - Variant42878, - Variant42879, - Variant42880, - Variant42881, - Variant42882, - Variant42883, - Variant42884, - Variant42885, - Variant42886, - Variant42887, - Variant42888, - Variant42889, - Variant42890, - Variant42891, - Variant42892, - Variant42893, - Variant42894, - Variant42895, - Variant42896, - Variant42897, - Variant42898, - Variant42899, - Variant42900, - Variant42901, - Variant42902, - Variant42903, - Variant42904, - Variant42905, - Variant42906, - Variant42907, - Variant42908, - Variant42909, - Variant42910, - Variant42911, - Variant42912, - Variant42913, - Variant42914, - Variant42915, - Variant42916, - Variant42917, - Variant42918, - Variant42919, - Variant42920, - Variant42921, - Variant42922, - Variant42923, - Variant42924, - Variant42925, - Variant42926, - Variant42927, - Variant42928, - Variant42929, - Variant42930, - Variant42931, - Variant42932, - Variant42933, - Variant42934, - Variant42935, - Variant42936, - Variant42937, - Variant42938, - Variant42939, - Variant42940, - Variant42941, - Variant42942, - Variant42943, - Variant42944, - Variant42945, - Variant42946, - Variant42947, - Variant42948, - Variant42949, - Variant42950, - Variant42951, - Variant42952, - Variant42953, - Variant42954, - Variant42955, - Variant42956, - Variant42957, - Variant42958, - Variant42959, - Variant42960, - Variant42961, - Variant42962, - Variant42963, - Variant42964, - Variant42965, - Variant42966, - Variant42967, - Variant42968, - Variant42969, - Variant42970, - Variant42971, - Variant42972, - Variant42973, - Variant42974, - Variant42975, - Variant42976, - Variant42977, - Variant42978, - Variant42979, - Variant42980, - Variant42981, - Variant42982, - Variant42983, - Variant42984, - Variant42985, - Variant42986, - Variant42987, - Variant42988, - Variant42989, - Variant42990, - Variant42991, - Variant42992, - Variant42993, - Variant42994, - Variant42995, - Variant42996, - Variant42997, - Variant42998, - Variant42999, - Variant43000, - Variant43001, - Variant43002, - Variant43003, - Variant43004, - Variant43005, - Variant43006, - Variant43007, - Variant43008, - Variant43009, - Variant43010, - Variant43011, - Variant43012, - Variant43013, - Variant43014, - Variant43015, - Variant43016, - Variant43017, - Variant43018, - Variant43019, - Variant43020, - Variant43021, - Variant43022, - Variant43023, - Variant43024, - Variant43025, - Variant43026, - Variant43027, - Variant43028, - Variant43029, - Variant43030, - Variant43031, - Variant43032, - Variant43033, - Variant43034, - Variant43035, - Variant43036, - Variant43037, - Variant43038, - Variant43039, - Variant43040, - Variant43041, - Variant43042, - Variant43043, - Variant43044, - Variant43045, - Variant43046, - Variant43047, - Variant43048, - Variant43049, - Variant43050, - Variant43051, - Variant43052, - Variant43053, - Variant43054, - Variant43055, - Variant43056, - Variant43057, - Variant43058, - Variant43059, - Variant43060, - Variant43061, - Variant43062, - Variant43063, - Variant43064, - Variant43065, - Variant43066, - Variant43067, - Variant43068, - Variant43069, - Variant43070, - Variant43071, - Variant43072, - Variant43073, - Variant43074, - Variant43075, - Variant43076, - Variant43077, - Variant43078, - Variant43079, - Variant43080, - Variant43081, - Variant43082, - Variant43083, - Variant43084, - Variant43085, - Variant43086, - Variant43087, - Variant43088, - Variant43089, - Variant43090, - Variant43091, - Variant43092, - Variant43093, - Variant43094, - Variant43095, - Variant43096, - Variant43097, - Variant43098, - Variant43099, - Variant43100, - Variant43101, - Variant43102, - Variant43103, - Variant43104, - Variant43105, - Variant43106, - Variant43107, - Variant43108, - Variant43109, - Variant43110, - Variant43111, - Variant43112, - Variant43113, - Variant43114, - Variant43115, - Variant43116, - Variant43117, - Variant43118, - Variant43119, - Variant43120, - Variant43121, - Variant43122, - Variant43123, - Variant43124, - Variant43125, - Variant43126, - Variant43127, - Variant43128, - Variant43129, - Variant43130, - Variant43131, - Variant43132, - Variant43133, - Variant43134, - Variant43135, - Variant43136, - Variant43137, - Variant43138, - Variant43139, - Variant43140, - Variant43141, - Variant43142, - Variant43143, - Variant43144, - Variant43145, - Variant43146, - Variant43147, - Variant43148, - Variant43149, - Variant43150, - Variant43151, - Variant43152, - Variant43153, - Variant43154, - Variant43155, - Variant43156, - Variant43157, - Variant43158, - Variant43159, - Variant43160, - Variant43161, - Variant43162, - Variant43163, - Variant43164, - Variant43165, - Variant43166, - Variant43167, - Variant43168, - Variant43169, - Variant43170, - Variant43171, - Variant43172, - Variant43173, - Variant43174, - Variant43175, - Variant43176, - Variant43177, - Variant43178, - Variant43179, - Variant43180, - Variant43181, - Variant43182, - Variant43183, - Variant43184, - Variant43185, - Variant43186, - Variant43187, - Variant43188, - Variant43189, - Variant43190, - Variant43191, - Variant43192, - Variant43193, - Variant43194, - Variant43195, - Variant43196, - Variant43197, - Variant43198, - Variant43199, - Variant43200, - Variant43201, - Variant43202, - Variant43203, - Variant43204, - Variant43205, - Variant43206, - Variant43207, - Variant43208, - Variant43209, - Variant43210, - Variant43211, - Variant43212, - Variant43213, - Variant43214, - Variant43215, - Variant43216, - Variant43217, - Variant43218, - Variant43219, - Variant43220, - Variant43221, - Variant43222, - Variant43223, - Variant43224, - Variant43225, - Variant43226, - Variant43227, - Variant43228, - Variant43229, - Variant43230, - Variant43231, - Variant43232, - Variant43233, - Variant43234, - Variant43235, - Variant43236, - Variant43237, - Variant43238, - Variant43239, - Variant43240, - Variant43241, - Variant43242, - Variant43243, - Variant43244, - Variant43245, - Variant43246, - Variant43247, - Variant43248, - Variant43249, - Variant43250, - Variant43251, - Variant43252, - Variant43253, - Variant43254, - Variant43255, - Variant43256, - Variant43257, - Variant43258, - Variant43259, - Variant43260, - Variant43261, - Variant43262, - Variant43263, - Variant43264, - Variant43265, - Variant43266, - Variant43267, - Variant43268, - Variant43269, - Variant43270, - Variant43271, - Variant43272, - Variant43273, - Variant43274, - Variant43275, - Variant43276, - Variant43277, - Variant43278, - Variant43279, - Variant43280, - Variant43281, - Variant43282, - Variant43283, - Variant43284, - Variant43285, - Variant43286, - Variant43287, - Variant43288, - Variant43289, - Variant43290, - Variant43291, - Variant43292, - Variant43293, - Variant43294, - Variant43295, - Variant43296, - Variant43297, - Variant43298, - Variant43299, - Variant43300, - Variant43301, - Variant43302, - Variant43303, - Variant43304, - Variant43305, - Variant43306, - Variant43307, - Variant43308, - Variant43309, - Variant43310, - Variant43311, - Variant43312, - Variant43313, - Variant43314, - Variant43315, - Variant43316, - Variant43317, - Variant43318, - Variant43319, - Variant43320, - Variant43321, - Variant43322, - Variant43323, - Variant43324, - Variant43325, - Variant43326, - Variant43327, - Variant43328, - Variant43329, - Variant43330, - Variant43331, - Variant43332, - Variant43333, - Variant43334, - Variant43335, - Variant43336, - Variant43337, - Variant43338, - Variant43339, - Variant43340, - Variant43341, - Variant43342, - Variant43343, - Variant43344, - Variant43345, - Variant43346, - Variant43347, - Variant43348, - Variant43349, - Variant43350, - Variant43351, - Variant43352, - Variant43353, - Variant43354, - Variant43355, - Variant43356, - Variant43357, - Variant43358, - Variant43359, - Variant43360, - Variant43361, - Variant43362, - Variant43363, - Variant43364, - Variant43365, - Variant43366, - Variant43367, - Variant43368, - Variant43369, - Variant43370, - Variant43371, - Variant43372, - Variant43373, - Variant43374, - Variant43375, - Variant43376, - Variant43377, - Variant43378, - Variant43379, - Variant43380, - Variant43381, - Variant43382, - Variant43383, - Variant43384, - Variant43385, - Variant43386, - Variant43387, - Variant43388, - Variant43389, - Variant43390, - Variant43391, - Variant43392, - Variant43393, - Variant43394, - Variant43395, - Variant43396, - Variant43397, - Variant43398, - Variant43399, - Variant43400, - Variant43401, - Variant43402, - Variant43403, - Variant43404, - Variant43405, - Variant43406, - Variant43407, - Variant43408, - Variant43409, - Variant43410, - Variant43411, - Variant43412, - Variant43413, - Variant43414, - Variant43415, - Variant43416, - Variant43417, - Variant43418, - Variant43419, - Variant43420, - Variant43421, - Variant43422, - Variant43423, - Variant43424, - Variant43425, - Variant43426, - Variant43427, - Variant43428, - Variant43429, - Variant43430, - Variant43431, - Variant43432, - Variant43433, - Variant43434, - Variant43435, - Variant43436, - Variant43437, - Variant43438, - Variant43439, - Variant43440, - Variant43441, - Variant43442, - Variant43443, - Variant43444, - Variant43445, - Variant43446, - Variant43447, - Variant43448, - Variant43449, - Variant43450, - Variant43451, - Variant43452, - Variant43453, - Variant43454, - Variant43455, - Variant43456, - Variant43457, - Variant43458, - Variant43459, - Variant43460, - Variant43461, - Variant43462, - Variant43463, - Variant43464, - Variant43465, - Variant43466, - Variant43467, - Variant43468, - Variant43469, - Variant43470, - Variant43471, - Variant43472, - Variant43473, - Variant43474, - Variant43475, - Variant43476, - Variant43477, - Variant43478, - Variant43479, - Variant43480, - Variant43481, - Variant43482, - Variant43483, - Variant43484, - Variant43485, - Variant43486, - Variant43487, - Variant43488, - Variant43489, - Variant43490, - Variant43491, - Variant43492, - Variant43493, - Variant43494, - Variant43495, - Variant43496, - Variant43497, - Variant43498, - Variant43499, - Variant43500, - Variant43501, - Variant43502, - Variant43503, - Variant43504, - Variant43505, - Variant43506, - Variant43507, - Variant43508, - Variant43509, - Variant43510, - Variant43511, - Variant43512, - Variant43513, - Variant43514, - Variant43515, - Variant43516, - Variant43517, - Variant43518, - Variant43519, - Variant43520, - Variant43521, - Variant43522, - Variant43523, - Variant43524, - Variant43525, - Variant43526, - Variant43527, - Variant43528, - Variant43529, - Variant43530, - Variant43531, - Variant43532, - Variant43533, - Variant43534, - Variant43535, - Variant43536, - Variant43537, - Variant43538, - Variant43539, - Variant43540, - Variant43541, - Variant43542, - Variant43543, - Variant43544, - Variant43545, - Variant43546, - Variant43547, - Variant43548, - Variant43549, - Variant43550, - Variant43551, - Variant43552, - Variant43553, - Variant43554, - Variant43555, - Variant43556, - Variant43557, - Variant43558, - Variant43559, - Variant43560, - Variant43561, - Variant43562, - Variant43563, - Variant43564, - Variant43565, - Variant43566, - Variant43567, - Variant43568, - Variant43569, - Variant43570, - Variant43571, - Variant43572, - Variant43573, - Variant43574, - Variant43575, - Variant43576, - Variant43577, - Variant43578, - Variant43579, - Variant43580, - Variant43581, - Variant43582, - Variant43583, - Variant43584, - Variant43585, - Variant43586, - Variant43587, - Variant43588, - Variant43589, - Variant43590, - Variant43591, - Variant43592, - Variant43593, - Variant43594, - Variant43595, - Variant43596, - Variant43597, - Variant43598, - Variant43599, - Variant43600, - Variant43601, - Variant43602, - Variant43603, - Variant43604, - Variant43605, - Variant43606, - Variant43607, - Variant43608, - Variant43609, - Variant43610, - Variant43611, - Variant43612, - Variant43613, - Variant43614, - Variant43615, - Variant43616, - Variant43617, - Variant43618, - Variant43619, - Variant43620, - Variant43621, - Variant43622, - Variant43623, - Variant43624, - Variant43625, - Variant43626, - Variant43627, - Variant43628, - Variant43629, - Variant43630, - Variant43631, - Variant43632, - Variant43633, - Variant43634, - Variant43635, - Variant43636, - Variant43637, - Variant43638, - Variant43639, - Variant43640, - Variant43641, - Variant43642, - Variant43643, - Variant43644, - Variant43645, - Variant43646, - Variant43647, - Variant43648, - Variant43649, - Variant43650, - Variant43651, - Variant43652, - Variant43653, - Variant43654, - Variant43655, - Variant43656, - Variant43657, - Variant43658, - Variant43659, - Variant43660, - Variant43661, - Variant43662, - Variant43663, - Variant43664, - Variant43665, - Variant43666, - Variant43667, - Variant43668, - Variant43669, - Variant43670, - Variant43671, - Variant43672, - Variant43673, - Variant43674, - Variant43675, - Variant43676, - Variant43677, - Variant43678, - Variant43679, - Variant43680, - Variant43681, - Variant43682, - Variant43683, - Variant43684, - Variant43685, - Variant43686, - Variant43687, - Variant43688, - Variant43689, - Variant43690, - Variant43691, - Variant43692, - Variant43693, - Variant43694, - Variant43695, - Variant43696, - Variant43697, - Variant43698, - Variant43699, - Variant43700, - Variant43701, - Variant43702, - Variant43703, - Variant43704, - Variant43705, - Variant43706, - Variant43707, - Variant43708, - Variant43709, - Variant43710, - Variant43711, - Variant43712, - Variant43713, - Variant43714, - Variant43715, - Variant43716, - Variant43717, - Variant43718, - Variant43719, - Variant43720, - Variant43721, - Variant43722, - Variant43723, - Variant43724, - Variant43725, - Variant43726, - Variant43727, - Variant43728, - Variant43729, - Variant43730, - Variant43731, - Variant43732, - Variant43733, - Variant43734, - Variant43735, - Variant43736, - Variant43737, - Variant43738, - Variant43739, - Variant43740, - Variant43741, - Variant43742, - Variant43743, - Variant43744, - Variant43745, - Variant43746, - Variant43747, - Variant43748, - Variant43749, - Variant43750, - Variant43751, - Variant43752, - Variant43753, - Variant43754, - Variant43755, - Variant43756, - Variant43757, - Variant43758, - Variant43759, - Variant43760, - Variant43761, - Variant43762, - Variant43763, - Variant43764, - Variant43765, - Variant43766, - Variant43767, - Variant43768, - Variant43769, - Variant43770, - Variant43771, - Variant43772, - Variant43773, - Variant43774, - Variant43775, - Variant43776, - Variant43777, - Variant43778, - Variant43779, - Variant43780, - Variant43781, - Variant43782, - Variant43783, - Variant43784, - Variant43785, - Variant43786, - Variant43787, - Variant43788, - Variant43789, - Variant43790, - Variant43791, - Variant43792, - Variant43793, - Variant43794, - Variant43795, - Variant43796, - Variant43797, - Variant43798, - Variant43799, - Variant43800, - Variant43801, - Variant43802, - Variant43803, - Variant43804, - Variant43805, - Variant43806, - Variant43807, - Variant43808, - Variant43809, - Variant43810, - Variant43811, - Variant43812, - Variant43813, - Variant43814, - Variant43815, - Variant43816, - Variant43817, - Variant43818, - Variant43819, - Variant43820, - Variant43821, - Variant43822, - Variant43823, - Variant43824, - Variant43825, - Variant43826, - Variant43827, - Variant43828, - Variant43829, - Variant43830, - Variant43831, - Variant43832, - Variant43833, - Variant43834, - Variant43835, - Variant43836, - Variant43837, - Variant43838, - Variant43839, - Variant43840, - Variant43841, - Variant43842, - Variant43843, - Variant43844, - Variant43845, - Variant43846, - Variant43847, - Variant43848, - Variant43849, - Variant43850, - Variant43851, - Variant43852, - Variant43853, - Variant43854, - Variant43855, - Variant43856, - Variant43857, - Variant43858, - Variant43859, - Variant43860, - Variant43861, - Variant43862, - Variant43863, - Variant43864, - Variant43865, - Variant43866, - Variant43867, - Variant43868, - Variant43869, - Variant43870, - Variant43871, - Variant43872, - Variant43873, - Variant43874, - Variant43875, - Variant43876, - Variant43877, - Variant43878, - Variant43879, - Variant43880, - Variant43881, - Variant43882, - Variant43883, - Variant43884, - Variant43885, - Variant43886, - Variant43887, - Variant43888, - Variant43889, - Variant43890, - Variant43891, - Variant43892, - Variant43893, - Variant43894, - Variant43895, - Variant43896, - Variant43897, - Variant43898, - Variant43899, - Variant43900, - Variant43901, - Variant43902, - Variant43903, - Variant43904, - Variant43905, - Variant43906, - Variant43907, - Variant43908, - Variant43909, - Variant43910, - Variant43911, - Variant43912, - Variant43913, - Variant43914, - Variant43915, - Variant43916, - Variant43917, - Variant43918, - Variant43919, - Variant43920, - Variant43921, - Variant43922, - Variant43923, - Variant43924, - Variant43925, - Variant43926, - Variant43927, - Variant43928, - Variant43929, - Variant43930, - Variant43931, - Variant43932, - Variant43933, - Variant43934, - Variant43935, - Variant43936, - Variant43937, - Variant43938, - Variant43939, - Variant43940, - Variant43941, - Variant43942, - Variant43943, - Variant43944, - Variant43945, - Variant43946, - Variant43947, - Variant43948, - Variant43949, - Variant43950, - Variant43951, - Variant43952, - Variant43953, - Variant43954, - Variant43955, - Variant43956, - Variant43957, - Variant43958, - Variant43959, - Variant43960, - Variant43961, - Variant43962, - Variant43963, - Variant43964, - Variant43965, - Variant43966, - Variant43967, - Variant43968, - Variant43969, - Variant43970, - Variant43971, - Variant43972, - Variant43973, - Variant43974, - Variant43975, - Variant43976, - Variant43977, - Variant43978, - Variant43979, - Variant43980, - Variant43981, - Variant43982, - Variant43983, - Variant43984, - Variant43985, - Variant43986, - Variant43987, - Variant43988, - Variant43989, - Variant43990, - Variant43991, - Variant43992, - Variant43993, - Variant43994, - Variant43995, - Variant43996, - Variant43997, - Variant43998, - Variant43999, - Variant44000, - Variant44001, - Variant44002, - Variant44003, - Variant44004, - Variant44005, - Variant44006, - Variant44007, - Variant44008, - Variant44009, - Variant44010, - Variant44011, - Variant44012, - Variant44013, - Variant44014, - Variant44015, - Variant44016, - Variant44017, - Variant44018, - Variant44019, - Variant44020, - Variant44021, - Variant44022, - Variant44023, - Variant44024, - Variant44025, - Variant44026, - Variant44027, - Variant44028, - Variant44029, - Variant44030, - Variant44031, - Variant44032, - Variant44033, - Variant44034, - Variant44035, - Variant44036, - Variant44037, - Variant44038, - Variant44039, - Variant44040, - Variant44041, - Variant44042, - Variant44043, - Variant44044, - Variant44045, - Variant44046, - Variant44047, - Variant44048, - Variant44049, - Variant44050, - Variant44051, - Variant44052, - Variant44053, - Variant44054, - Variant44055, - Variant44056, - Variant44057, - Variant44058, - Variant44059, - Variant44060, - Variant44061, - Variant44062, - Variant44063, - Variant44064, - Variant44065, - Variant44066, - Variant44067, - Variant44068, - Variant44069, - Variant44070, - Variant44071, - Variant44072, - Variant44073, - Variant44074, - Variant44075, - Variant44076, - Variant44077, - Variant44078, - Variant44079, - Variant44080, - Variant44081, - Variant44082, - Variant44083, - Variant44084, - Variant44085, - Variant44086, - Variant44087, - Variant44088, - Variant44089, - Variant44090, - Variant44091, - Variant44092, - Variant44093, - Variant44094, - Variant44095, - Variant44096, - Variant44097, - Variant44098, - Variant44099, - Variant44100, - Variant44101, - Variant44102, - Variant44103, - Variant44104, - Variant44105, - Variant44106, - Variant44107, - Variant44108, - Variant44109, - Variant44110, - Variant44111, - Variant44112, - Variant44113, - Variant44114, - Variant44115, - Variant44116, - Variant44117, - Variant44118, - Variant44119, - Variant44120, - Variant44121, - Variant44122, - Variant44123, - Variant44124, - Variant44125, - Variant44126, - Variant44127, - Variant44128, - Variant44129, - Variant44130, - Variant44131, - Variant44132, - Variant44133, - Variant44134, - Variant44135, - Variant44136, - Variant44137, - Variant44138, - Variant44139, - Variant44140, - Variant44141, - Variant44142, - Variant44143, - Variant44144, - Variant44145, - Variant44146, - Variant44147, - Variant44148, - Variant44149, - Variant44150, - Variant44151, - Variant44152, - Variant44153, - Variant44154, - Variant44155, - Variant44156, - Variant44157, - Variant44158, - Variant44159, - Variant44160, - Variant44161, - Variant44162, - Variant44163, - Variant44164, - Variant44165, - Variant44166, - Variant44167, - Variant44168, - Variant44169, - Variant44170, - Variant44171, - Variant44172, - Variant44173, - Variant44174, - Variant44175, - Variant44176, - Variant44177, - Variant44178, - Variant44179, - Variant44180, - Variant44181, - Variant44182, - Variant44183, - Variant44184, - Variant44185, - Variant44186, - Variant44187, - Variant44188, - Variant44189, - Variant44190, - Variant44191, - Variant44192, - Variant44193, - Variant44194, - Variant44195, - Variant44196, - Variant44197, - Variant44198, - Variant44199, - Variant44200, - Variant44201, - Variant44202, - Variant44203, - Variant44204, - Variant44205, - Variant44206, - Variant44207, - Variant44208, - Variant44209, - Variant44210, - Variant44211, - Variant44212, - Variant44213, - Variant44214, - Variant44215, - Variant44216, - Variant44217, - Variant44218, - Variant44219, - Variant44220, - Variant44221, - Variant44222, - Variant44223, - Variant44224, - Variant44225, - Variant44226, - Variant44227, - Variant44228, - Variant44229, - Variant44230, - Variant44231, - Variant44232, - Variant44233, - Variant44234, - Variant44235, - Variant44236, - Variant44237, - Variant44238, - Variant44239, - Variant44240, - Variant44241, - Variant44242, - Variant44243, - Variant44244, - Variant44245, - Variant44246, - Variant44247, - Variant44248, - Variant44249, - Variant44250, - Variant44251, - Variant44252, - Variant44253, - Variant44254, - Variant44255, - Variant44256, - Variant44257, - Variant44258, - Variant44259, - Variant44260, - Variant44261, - Variant44262, - Variant44263, - Variant44264, - Variant44265, - Variant44266, - Variant44267, - Variant44268, - Variant44269, - Variant44270, - Variant44271, - Variant44272, - Variant44273, - Variant44274, - Variant44275, - Variant44276, - Variant44277, - Variant44278, - Variant44279, - Variant44280, - Variant44281, - Variant44282, - Variant44283, - Variant44284, - Variant44285, - Variant44286, - Variant44287, - Variant44288, - Variant44289, - Variant44290, - Variant44291, - Variant44292, - Variant44293, - Variant44294, - Variant44295, - Variant44296, - Variant44297, - Variant44298, - Variant44299, - Variant44300, - Variant44301, - Variant44302, - Variant44303, - Variant44304, - Variant44305, - Variant44306, - Variant44307, - Variant44308, - Variant44309, - Variant44310, - Variant44311, - Variant44312, - Variant44313, - Variant44314, - Variant44315, - Variant44316, - Variant44317, - Variant44318, - Variant44319, - Variant44320, - Variant44321, - Variant44322, - Variant44323, - Variant44324, - Variant44325, - Variant44326, - Variant44327, - Variant44328, - Variant44329, - Variant44330, - Variant44331, - Variant44332, - Variant44333, - Variant44334, - Variant44335, - Variant44336, - Variant44337, - Variant44338, - Variant44339, - Variant44340, - Variant44341, - Variant44342, - Variant44343, - Variant44344, - Variant44345, - Variant44346, - Variant44347, - Variant44348, - Variant44349, - Variant44350, - Variant44351, - Variant44352, - Variant44353, - Variant44354, - Variant44355, - Variant44356, - Variant44357, - Variant44358, - Variant44359, - Variant44360, - Variant44361, - Variant44362, - Variant44363, - Variant44364, - Variant44365, - Variant44366, - Variant44367, - Variant44368, - Variant44369, - Variant44370, - Variant44371, - Variant44372, - Variant44373, - Variant44374, - Variant44375, - Variant44376, - Variant44377, - Variant44378, - Variant44379, - Variant44380, - Variant44381, - Variant44382, - Variant44383, - Variant44384, - Variant44385, - Variant44386, - Variant44387, - Variant44388, - Variant44389, - Variant44390, - Variant44391, - Variant44392, - Variant44393, - Variant44394, - Variant44395, - Variant44396, - Variant44397, - Variant44398, - Variant44399, - Variant44400, - Variant44401, - Variant44402, - Variant44403, - Variant44404, - Variant44405, - Variant44406, - Variant44407, - Variant44408, - Variant44409, - Variant44410, - Variant44411, - Variant44412, - Variant44413, - Variant44414, - Variant44415, - Variant44416, - Variant44417, - Variant44418, - Variant44419, - Variant44420, - Variant44421, - Variant44422, - Variant44423, - Variant44424, - Variant44425, - Variant44426, - Variant44427, - Variant44428, - Variant44429, - Variant44430, - Variant44431, - Variant44432, - Variant44433, - Variant44434, - Variant44435, - Variant44436, - Variant44437, - Variant44438, - Variant44439, - Variant44440, - Variant44441, - Variant44442, - Variant44443, - Variant44444, - Variant44445, - Variant44446, - Variant44447, - Variant44448, - Variant44449, - Variant44450, - Variant44451, - Variant44452, - Variant44453, - Variant44454, - Variant44455, - Variant44456, - Variant44457, - Variant44458, - Variant44459, - Variant44460, - Variant44461, - Variant44462, - Variant44463, - Variant44464, - Variant44465, - Variant44466, - Variant44467, - Variant44468, - Variant44469, - Variant44470, - Variant44471, - Variant44472, - Variant44473, - Variant44474, - Variant44475, - Variant44476, - Variant44477, - Variant44478, - Variant44479, - Variant44480, - Variant44481, - Variant44482, - Variant44483, - Variant44484, - Variant44485, - Variant44486, - Variant44487, - Variant44488, - Variant44489, - Variant44490, - Variant44491, - Variant44492, - Variant44493, - Variant44494, - Variant44495, - Variant44496, - Variant44497, - Variant44498, - Variant44499, - Variant44500, - Variant44501, - Variant44502, - Variant44503, - Variant44504, - Variant44505, - Variant44506, - Variant44507, - Variant44508, - Variant44509, - Variant44510, - Variant44511, - Variant44512, - Variant44513, - Variant44514, - Variant44515, - Variant44516, - Variant44517, - Variant44518, - Variant44519, - Variant44520, - Variant44521, - Variant44522, - Variant44523, - Variant44524, - Variant44525, - Variant44526, - Variant44527, - Variant44528, - Variant44529, - Variant44530, - Variant44531, - Variant44532, - Variant44533, - Variant44534, - Variant44535, - Variant44536, - Variant44537, - Variant44538, - Variant44539, - Variant44540, - Variant44541, - Variant44542, - Variant44543, - Variant44544, - Variant44545, - Variant44546, - Variant44547, - Variant44548, - Variant44549, - Variant44550, - Variant44551, - Variant44552, - Variant44553, - Variant44554, - Variant44555, - Variant44556, - Variant44557, - Variant44558, - Variant44559, - Variant44560, - Variant44561, - Variant44562, - Variant44563, - Variant44564, - Variant44565, - Variant44566, - Variant44567, - Variant44568, - Variant44569, - Variant44570, - Variant44571, - Variant44572, - Variant44573, - Variant44574, - Variant44575, - Variant44576, - Variant44577, - Variant44578, - Variant44579, - Variant44580, - Variant44581, - Variant44582, - Variant44583, - Variant44584, - Variant44585, - Variant44586, - Variant44587, - Variant44588, - Variant44589, - Variant44590, - Variant44591, - Variant44592, - Variant44593, - Variant44594, - Variant44595, - Variant44596, - Variant44597, - Variant44598, - Variant44599, - Variant44600, - Variant44601, - Variant44602, - Variant44603, - Variant44604, - Variant44605, - Variant44606, - Variant44607, - Variant44608, - Variant44609, - Variant44610, - Variant44611, - Variant44612, - Variant44613, - Variant44614, - Variant44615, - Variant44616, - Variant44617, - Variant44618, - Variant44619, - Variant44620, - Variant44621, - Variant44622, - Variant44623, - Variant44624, - Variant44625, - Variant44626, - Variant44627, - Variant44628, - Variant44629, - Variant44630, - Variant44631, - Variant44632, - Variant44633, - Variant44634, - Variant44635, - Variant44636, - Variant44637, - Variant44638, - Variant44639, - Variant44640, - Variant44641, - Variant44642, - Variant44643, - Variant44644, - Variant44645, - Variant44646, - Variant44647, - Variant44648, - Variant44649, - Variant44650, - Variant44651, - Variant44652, - Variant44653, - Variant44654, - Variant44655, - Variant44656, - Variant44657, - Variant44658, - Variant44659, - Variant44660, - Variant44661, - Variant44662, - Variant44663, - Variant44664, - Variant44665, - Variant44666, - Variant44667, - Variant44668, - Variant44669, - Variant44670, - Variant44671, - Variant44672, - Variant44673, - Variant44674, - Variant44675, - Variant44676, - Variant44677, - Variant44678, - Variant44679, - Variant44680, - Variant44681, - Variant44682, - Variant44683, - Variant44684, - Variant44685, - Variant44686, - Variant44687, - Variant44688, - Variant44689, - Variant44690, - Variant44691, - Variant44692, - Variant44693, - Variant44694, - Variant44695, - Variant44696, - Variant44697, - Variant44698, - Variant44699, - Variant44700, - Variant44701, - Variant44702, - Variant44703, - Variant44704, - Variant44705, - Variant44706, - Variant44707, - Variant44708, - Variant44709, - Variant44710, - Variant44711, - Variant44712, - Variant44713, - Variant44714, - Variant44715, - Variant44716, - Variant44717, - Variant44718, - Variant44719, - Variant44720, - Variant44721, - Variant44722, - Variant44723, - Variant44724, - Variant44725, - Variant44726, - Variant44727, - Variant44728, - Variant44729, - Variant44730, - Variant44731, - Variant44732, - Variant44733, - Variant44734, - Variant44735, - Variant44736, - Variant44737, - Variant44738, - Variant44739, - Variant44740, - Variant44741, - Variant44742, - Variant44743, - Variant44744, - Variant44745, - Variant44746, - Variant44747, - Variant44748, - Variant44749, - Variant44750, - Variant44751, - Variant44752, - Variant44753, - Variant44754, - Variant44755, - Variant44756, - Variant44757, - Variant44758, - Variant44759, - Variant44760, - Variant44761, - Variant44762, - Variant44763, - Variant44764, - Variant44765, - Variant44766, - Variant44767, - Variant44768, - Variant44769, - Variant44770, - Variant44771, - Variant44772, - Variant44773, - Variant44774, - Variant44775, - Variant44776, - Variant44777, - Variant44778, - Variant44779, - Variant44780, - Variant44781, - Variant44782, - Variant44783, - Variant44784, - Variant44785, - Variant44786, - Variant44787, - Variant44788, - Variant44789, - Variant44790, - Variant44791, - Variant44792, - Variant44793, - Variant44794, - Variant44795, - Variant44796, - Variant44797, - Variant44798, - Variant44799, - Variant44800, - Variant44801, - Variant44802, - Variant44803, - Variant44804, - Variant44805, - Variant44806, - Variant44807, - Variant44808, - Variant44809, - Variant44810, - Variant44811, - Variant44812, - Variant44813, - Variant44814, - Variant44815, - Variant44816, - Variant44817, - Variant44818, - Variant44819, - Variant44820, - Variant44821, - Variant44822, - Variant44823, - Variant44824, - Variant44825, - Variant44826, - Variant44827, - Variant44828, - Variant44829, - Variant44830, - Variant44831, - Variant44832, - Variant44833, - Variant44834, - Variant44835, - Variant44836, - Variant44837, - Variant44838, - Variant44839, - Variant44840, - Variant44841, - Variant44842, - Variant44843, - Variant44844, - Variant44845, - Variant44846, - Variant44847, - Variant44848, - Variant44849, - Variant44850, - Variant44851, - Variant44852, - Variant44853, - Variant44854, - Variant44855, - Variant44856, - Variant44857, - Variant44858, - Variant44859, - Variant44860, - Variant44861, - Variant44862, - Variant44863, - Variant44864, - Variant44865, - Variant44866, - Variant44867, - Variant44868, - Variant44869, - Variant44870, - Variant44871, - Variant44872, - Variant44873, - Variant44874, - Variant44875, - Variant44876, - Variant44877, - Variant44878, - Variant44879, - Variant44880, - Variant44881, - Variant44882, - Variant44883, - Variant44884, - Variant44885, - Variant44886, - Variant44887, - Variant44888, - Variant44889, - Variant44890, - Variant44891, - Variant44892, - Variant44893, - Variant44894, - Variant44895, - Variant44896, - Variant44897, - Variant44898, - Variant44899, - Variant44900, - Variant44901, - Variant44902, - Variant44903, - Variant44904, - Variant44905, - Variant44906, - Variant44907, - Variant44908, - Variant44909, - Variant44910, - Variant44911, - Variant44912, - Variant44913, - Variant44914, - Variant44915, - Variant44916, - Variant44917, - Variant44918, - Variant44919, - Variant44920, - Variant44921, - Variant44922, - Variant44923, - Variant44924, - Variant44925, - Variant44926, - Variant44927, - Variant44928, - Variant44929, - Variant44930, - Variant44931, - Variant44932, - Variant44933, - Variant44934, - Variant44935, - Variant44936, - Variant44937, - Variant44938, - Variant44939, - Variant44940, - Variant44941, - Variant44942, - Variant44943, - Variant44944, - Variant44945, - Variant44946, - Variant44947, - Variant44948, - Variant44949, - Variant44950, - Variant44951, - Variant44952, - Variant44953, - Variant44954, - Variant44955, - Variant44956, - Variant44957, - Variant44958, - Variant44959, - Variant44960, - Variant44961, - Variant44962, - Variant44963, - Variant44964, - Variant44965, - Variant44966, - Variant44967, - Variant44968, - Variant44969, - Variant44970, - Variant44971, - Variant44972, - Variant44973, - Variant44974, - Variant44975, - Variant44976, - Variant44977, - Variant44978, - Variant44979, - Variant44980, - Variant44981, - Variant44982, - Variant44983, - Variant44984, - Variant44985, - Variant44986, - Variant44987, - Variant44988, - Variant44989, - Variant44990, - Variant44991, - Variant44992, - Variant44993, - Variant44994, - Variant44995, - Variant44996, - Variant44997, - Variant44998, - Variant44999, - Variant45000, - Variant45001, - Variant45002, - Variant45003, - Variant45004, - Variant45005, - Variant45006, - Variant45007, - Variant45008, - Variant45009, - Variant45010, - Variant45011, - Variant45012, - Variant45013, - Variant45014, - Variant45015, - Variant45016, - Variant45017, - Variant45018, - Variant45019, - Variant45020, - Variant45021, - Variant45022, - Variant45023, - Variant45024, - Variant45025, - Variant45026, - Variant45027, - Variant45028, - Variant45029, - Variant45030, - Variant45031, - Variant45032, - Variant45033, - Variant45034, - Variant45035, - Variant45036, - Variant45037, - Variant45038, - Variant45039, - Variant45040, - Variant45041, - Variant45042, - Variant45043, - Variant45044, - Variant45045, - Variant45046, - Variant45047, - Variant45048, - Variant45049, - Variant45050, - Variant45051, - Variant45052, - Variant45053, - Variant45054, - Variant45055, - Variant45056, - Variant45057, - Variant45058, - Variant45059, - Variant45060, - Variant45061, - Variant45062, - Variant45063, - Variant45064, - Variant45065, - Variant45066, - Variant45067, - Variant45068, - Variant45069, - Variant45070, - Variant45071, - Variant45072, - Variant45073, - Variant45074, - Variant45075, - Variant45076, - Variant45077, - Variant45078, - Variant45079, - Variant45080, - Variant45081, - Variant45082, - Variant45083, - Variant45084, - Variant45085, - Variant45086, - Variant45087, - Variant45088, - Variant45089, - Variant45090, - Variant45091, - Variant45092, - Variant45093, - Variant45094, - Variant45095, - Variant45096, - Variant45097, - Variant45098, - Variant45099, - Variant45100, - Variant45101, - Variant45102, - Variant45103, - Variant45104, - Variant45105, - Variant45106, - Variant45107, - Variant45108, - Variant45109, - Variant45110, - Variant45111, - Variant45112, - Variant45113, - Variant45114, - Variant45115, - Variant45116, - Variant45117, - Variant45118, - Variant45119, - Variant45120, - Variant45121, - Variant45122, - Variant45123, - Variant45124, - Variant45125, - Variant45126, - Variant45127, - Variant45128, - Variant45129, - Variant45130, - Variant45131, - Variant45132, - Variant45133, - Variant45134, - Variant45135, - Variant45136, - Variant45137, - Variant45138, - Variant45139, - Variant45140, - Variant45141, - Variant45142, - Variant45143, - Variant45144, - Variant45145, - Variant45146, - Variant45147, - Variant45148, - Variant45149, - Variant45150, - Variant45151, - Variant45152, - Variant45153, - Variant45154, - Variant45155, - Variant45156, - Variant45157, - Variant45158, - Variant45159, - Variant45160, - Variant45161, - Variant45162, - Variant45163, - Variant45164, - Variant45165, - Variant45166, - Variant45167, - Variant45168, - Variant45169, - Variant45170, - Variant45171, - Variant45172, - Variant45173, - Variant45174, - Variant45175, - Variant45176, - Variant45177, - Variant45178, - Variant45179, - Variant45180, - Variant45181, - Variant45182, - Variant45183, - Variant45184, - Variant45185, - Variant45186, - Variant45187, - Variant45188, - Variant45189, - Variant45190, - Variant45191, - Variant45192, - Variant45193, - Variant45194, - Variant45195, - Variant45196, - Variant45197, - Variant45198, - Variant45199, - Variant45200, - Variant45201, - Variant45202, - Variant45203, - Variant45204, - Variant45205, - Variant45206, - Variant45207, - Variant45208, - Variant45209, - Variant45210, - Variant45211, - Variant45212, - Variant45213, - Variant45214, - Variant45215, - Variant45216, - Variant45217, - Variant45218, - Variant45219, - Variant45220, - Variant45221, - Variant45222, - Variant45223, - Variant45224, - Variant45225, - Variant45226, - Variant45227, - Variant45228, - Variant45229, - Variant45230, - Variant45231, - Variant45232, - Variant45233, - Variant45234, - Variant45235, - Variant45236, - Variant45237, - Variant45238, - Variant45239, - Variant45240, - Variant45241, - Variant45242, - Variant45243, - Variant45244, - Variant45245, - Variant45246, - Variant45247, - Variant45248, - Variant45249, - Variant45250, - Variant45251, - Variant45252, - Variant45253, - Variant45254, - Variant45255, - Variant45256, - Variant45257, - Variant45258, - Variant45259, - Variant45260, - Variant45261, - Variant45262, - Variant45263, - Variant45264, - Variant45265, - Variant45266, - Variant45267, - Variant45268, - Variant45269, - Variant45270, - Variant45271, - Variant45272, - Variant45273, - Variant45274, - Variant45275, - Variant45276, - Variant45277, - Variant45278, - Variant45279, - Variant45280, - Variant45281, - Variant45282, - Variant45283, - Variant45284, - Variant45285, - Variant45286, - Variant45287, - Variant45288, - Variant45289, - Variant45290, - Variant45291, - Variant45292, - Variant45293, - Variant45294, - Variant45295, - Variant45296, - Variant45297, - Variant45298, - Variant45299, - Variant45300, - Variant45301, - Variant45302, - Variant45303, - Variant45304, - Variant45305, - Variant45306, - Variant45307, - Variant45308, - Variant45309, - Variant45310, - Variant45311, - Variant45312, - Variant45313, - Variant45314, - Variant45315, - Variant45316, - Variant45317, - Variant45318, - Variant45319, - Variant45320, - Variant45321, - Variant45322, - Variant45323, - Variant45324, - Variant45325, - Variant45326, - Variant45327, - Variant45328, - Variant45329, - Variant45330, - Variant45331, - Variant45332, - Variant45333, - Variant45334, - Variant45335, - Variant45336, - Variant45337, - Variant45338, - Variant45339, - Variant45340, - Variant45341, - Variant45342, - Variant45343, - Variant45344, - Variant45345, - Variant45346, - Variant45347, - Variant45348, - Variant45349, - Variant45350, - Variant45351, - Variant45352, - Variant45353, - Variant45354, - Variant45355, - Variant45356, - Variant45357, - Variant45358, - Variant45359, - Variant45360, - Variant45361, - Variant45362, - Variant45363, - Variant45364, - Variant45365, - Variant45366, - Variant45367, - Variant45368, - Variant45369, - Variant45370, - Variant45371, - Variant45372, - Variant45373, - Variant45374, - Variant45375, - Variant45376, - Variant45377, - Variant45378, - Variant45379, - Variant45380, - Variant45381, - Variant45382, - Variant45383, - Variant45384, - Variant45385, - Variant45386, - Variant45387, - Variant45388, - Variant45389, - Variant45390, - Variant45391, - Variant45392, - Variant45393, - Variant45394, - Variant45395, - Variant45396, - Variant45397, - Variant45398, - Variant45399, - Variant45400, - Variant45401, - Variant45402, - Variant45403, - Variant45404, - Variant45405, - Variant45406, - Variant45407, - Variant45408, - Variant45409, - Variant45410, - Variant45411, - Variant45412, - Variant45413, - Variant45414, - Variant45415, - Variant45416, - Variant45417, - Variant45418, - Variant45419, - Variant45420, - Variant45421, - Variant45422, - Variant45423, - Variant45424, - Variant45425, - Variant45426, - Variant45427, - Variant45428, - Variant45429, - Variant45430, - Variant45431, - Variant45432, - Variant45433, - Variant45434, - Variant45435, - Variant45436, - Variant45437, - Variant45438, - Variant45439, - Variant45440, - Variant45441, - Variant45442, - Variant45443, - Variant45444, - Variant45445, - Variant45446, - Variant45447, - Variant45448, - Variant45449, - Variant45450, - Variant45451, - Variant45452, - Variant45453, - Variant45454, - Variant45455, - Variant45456, - Variant45457, - Variant45458, - Variant45459, - Variant45460, - Variant45461, - Variant45462, - Variant45463, - Variant45464, - Variant45465, - Variant45466, - Variant45467, - Variant45468, - Variant45469, - Variant45470, - Variant45471, - Variant45472, - Variant45473, - Variant45474, - Variant45475, - Variant45476, - Variant45477, - Variant45478, - Variant45479, - Variant45480, - Variant45481, - Variant45482, - Variant45483, - Variant45484, - Variant45485, - Variant45486, - Variant45487, - Variant45488, - Variant45489, - Variant45490, - Variant45491, - Variant45492, - Variant45493, - Variant45494, - Variant45495, - Variant45496, - Variant45497, - Variant45498, - Variant45499, - Variant45500, - Variant45501, - Variant45502, - Variant45503, - Variant45504, - Variant45505, - Variant45506, - Variant45507, - Variant45508, - Variant45509, - Variant45510, - Variant45511, - Variant45512, - Variant45513, - Variant45514, - Variant45515, - Variant45516, - Variant45517, - Variant45518, - Variant45519, - Variant45520, - Variant45521, - Variant45522, - Variant45523, - Variant45524, - Variant45525, - Variant45526, - Variant45527, - Variant45528, - Variant45529, - Variant45530, - Variant45531, - Variant45532, - Variant45533, - Variant45534, - Variant45535, - Variant45536, - Variant45537, - Variant45538, - Variant45539, - Variant45540, - Variant45541, - Variant45542, - Variant45543, - Variant45544, - Variant45545, - Variant45546, - Variant45547, - Variant45548, - Variant45549, - Variant45550, - Variant45551, - Variant45552, - Variant45553, - Variant45554, - Variant45555, - Variant45556, - Variant45557, - Variant45558, - Variant45559, - Variant45560, - Variant45561, - Variant45562, - Variant45563, - Variant45564, - Variant45565, - Variant45566, - Variant45567, - Variant45568, - Variant45569, - Variant45570, - Variant45571, - Variant45572, - Variant45573, - Variant45574, - Variant45575, - Variant45576, - Variant45577, - Variant45578, - Variant45579, - Variant45580, - Variant45581, - Variant45582, - Variant45583, - Variant45584, - Variant45585, - Variant45586, - Variant45587, - Variant45588, - Variant45589, - Variant45590, - Variant45591, - Variant45592, - Variant45593, - Variant45594, - Variant45595, - Variant45596, - Variant45597, - Variant45598, - Variant45599, - Variant45600, - Variant45601, - Variant45602, - Variant45603, - Variant45604, - Variant45605, - Variant45606, - Variant45607, - Variant45608, - Variant45609, - Variant45610, - Variant45611, - Variant45612, - Variant45613, - Variant45614, - Variant45615, - Variant45616, - Variant45617, - Variant45618, - Variant45619, - Variant45620, - Variant45621, - Variant45622, - Variant45623, - Variant45624, - Variant45625, - Variant45626, - Variant45627, - Variant45628, - Variant45629, - Variant45630, - Variant45631, - Variant45632, - Variant45633, - Variant45634, - Variant45635, - Variant45636, - Variant45637, - Variant45638, - Variant45639, - Variant45640, - Variant45641, - Variant45642, - Variant45643, - Variant45644, - Variant45645, - Variant45646, - Variant45647, - Variant45648, - Variant45649, - Variant45650, - Variant45651, - Variant45652, - Variant45653, - Variant45654, - Variant45655, - Variant45656, - Variant45657, - Variant45658, - Variant45659, - Variant45660, - Variant45661, - Variant45662, - Variant45663, - Variant45664, - Variant45665, - Variant45666, - Variant45667, - Variant45668, - Variant45669, - Variant45670, - Variant45671, - Variant45672, - Variant45673, - Variant45674, - Variant45675, - Variant45676, - Variant45677, - Variant45678, - Variant45679, - Variant45680, - Variant45681, - Variant45682, - Variant45683, - Variant45684, - Variant45685, - Variant45686, - Variant45687, - Variant45688, - Variant45689, - Variant45690, - Variant45691, - Variant45692, - Variant45693, - Variant45694, - Variant45695, - Variant45696, - Variant45697, - Variant45698, - Variant45699, - Variant45700, - Variant45701, - Variant45702, - Variant45703, - Variant45704, - Variant45705, - Variant45706, - Variant45707, - Variant45708, - Variant45709, - Variant45710, - Variant45711, - Variant45712, - Variant45713, - Variant45714, - Variant45715, - Variant45716, - Variant45717, - Variant45718, - Variant45719, - Variant45720, - Variant45721, - Variant45722, - Variant45723, - Variant45724, - Variant45725, - Variant45726, - Variant45727, - Variant45728, - Variant45729, - Variant45730, - Variant45731, - Variant45732, - Variant45733, - Variant45734, - Variant45735, - Variant45736, - Variant45737, - Variant45738, - Variant45739, - Variant45740, - Variant45741, - Variant45742, - Variant45743, - Variant45744, - Variant45745, - Variant45746, - Variant45747, - Variant45748, - Variant45749, - Variant45750, - Variant45751, - Variant45752, - Variant45753, - Variant45754, - Variant45755, - Variant45756, - Variant45757, - Variant45758, - Variant45759, - Variant45760, - Variant45761, - Variant45762, - Variant45763, - Variant45764, - Variant45765, - Variant45766, - Variant45767, - Variant45768, - Variant45769, - Variant45770, - Variant45771, - Variant45772, - Variant45773, - Variant45774, - Variant45775, - Variant45776, - Variant45777, - Variant45778, - Variant45779, - Variant45780, - Variant45781, - Variant45782, - Variant45783, - Variant45784, - Variant45785, - Variant45786, - Variant45787, - Variant45788, - Variant45789, - Variant45790, - Variant45791, - Variant45792, - Variant45793, - Variant45794, - Variant45795, - Variant45796, - Variant45797, - Variant45798, - Variant45799, - Variant45800, - Variant45801, - Variant45802, - Variant45803, - Variant45804, - Variant45805, - Variant45806, - Variant45807, - Variant45808, - Variant45809, - Variant45810, - Variant45811, - Variant45812, - Variant45813, - Variant45814, - Variant45815, - Variant45816, - Variant45817, - Variant45818, - Variant45819, - Variant45820, - Variant45821, - Variant45822, - Variant45823, - Variant45824, - Variant45825, - Variant45826, - Variant45827, - Variant45828, - Variant45829, - Variant45830, - Variant45831, - Variant45832, - Variant45833, - Variant45834, - Variant45835, - Variant45836, - Variant45837, - Variant45838, - Variant45839, - Variant45840, - Variant45841, - Variant45842, - Variant45843, - Variant45844, - Variant45845, - Variant45846, - Variant45847, - Variant45848, - Variant45849, - Variant45850, - Variant45851, - Variant45852, - Variant45853, - Variant45854, - Variant45855, - Variant45856, - Variant45857, - Variant45858, - Variant45859, - Variant45860, - Variant45861, - Variant45862, - Variant45863, - Variant45864, - Variant45865, - Variant45866, - Variant45867, - Variant45868, - Variant45869, - Variant45870, - Variant45871, - Variant45872, - Variant45873, - Variant45874, - Variant45875, - Variant45876, - Variant45877, - Variant45878, - Variant45879, - Variant45880, - Variant45881, - Variant45882, - Variant45883, - Variant45884, - Variant45885, - Variant45886, - Variant45887, - Variant45888, - Variant45889, - Variant45890, - Variant45891, - Variant45892, - Variant45893, - Variant45894, - Variant45895, - Variant45896, - Variant45897, - Variant45898, - Variant45899, - Variant45900, - Variant45901, - Variant45902, - Variant45903, - Variant45904, - Variant45905, - Variant45906, - Variant45907, - Variant45908, - Variant45909, - Variant45910, - Variant45911, - Variant45912, - Variant45913, - Variant45914, - Variant45915, - Variant45916, - Variant45917, - Variant45918, - Variant45919, - Variant45920, - Variant45921, - Variant45922, - Variant45923, - Variant45924, - Variant45925, - Variant45926, - Variant45927, - Variant45928, - Variant45929, - Variant45930, - Variant45931, - Variant45932, - Variant45933, - Variant45934, - Variant45935, - Variant45936, - Variant45937, - Variant45938, - Variant45939, - Variant45940, - Variant45941, - Variant45942, - Variant45943, - Variant45944, - Variant45945, - Variant45946, - Variant45947, - Variant45948, - Variant45949, - Variant45950, - Variant45951, - Variant45952, - Variant45953, - Variant45954, - Variant45955, - Variant45956, - Variant45957, - Variant45958, - Variant45959, - Variant45960, - Variant45961, - Variant45962, - Variant45963, - Variant45964, - Variant45965, - Variant45966, - Variant45967, - Variant45968, - Variant45969, - Variant45970, - Variant45971, - Variant45972, - Variant45973, - Variant45974, - Variant45975, - Variant45976, - Variant45977, - Variant45978, - Variant45979, - Variant45980, - Variant45981, - Variant45982, - Variant45983, - Variant45984, - Variant45985, - Variant45986, - Variant45987, - Variant45988, - Variant45989, - Variant45990, - Variant45991, - Variant45992, - Variant45993, - Variant45994, - Variant45995, - Variant45996, - Variant45997, - Variant45998, - Variant45999, - Variant46000, - Variant46001, - Variant46002, - Variant46003, - Variant46004, - Variant46005, - Variant46006, - Variant46007, - Variant46008, - Variant46009, - Variant46010, - Variant46011, - Variant46012, - Variant46013, - Variant46014, - Variant46015, - Variant46016, - Variant46017, - Variant46018, - Variant46019, - Variant46020, - Variant46021, - Variant46022, - Variant46023, - Variant46024, - Variant46025, - Variant46026, - Variant46027, - Variant46028, - Variant46029, - Variant46030, - Variant46031, - Variant46032, - Variant46033, - Variant46034, - Variant46035, - Variant46036, - Variant46037, - Variant46038, - Variant46039, - Variant46040, - Variant46041, - Variant46042, - Variant46043, - Variant46044, - Variant46045, - Variant46046, - Variant46047, - Variant46048, - Variant46049, - Variant46050, - Variant46051, - Variant46052, - Variant46053, - Variant46054, - Variant46055, - Variant46056, - Variant46057, - Variant46058, - Variant46059, - Variant46060, - Variant46061, - Variant46062, - Variant46063, - Variant46064, - Variant46065, - Variant46066, - Variant46067, - Variant46068, - Variant46069, - Variant46070, - Variant46071, - Variant46072, - Variant46073, - Variant46074, - Variant46075, - Variant46076, - Variant46077, - Variant46078, - Variant46079, - Variant46080, - Variant46081, - Variant46082, - Variant46083, - Variant46084, - Variant46085, - Variant46086, - Variant46087, - Variant46088, - Variant46089, - Variant46090, - Variant46091, - Variant46092, - Variant46093, - Variant46094, - Variant46095, - Variant46096, - Variant46097, - Variant46098, - Variant46099, - Variant46100, - Variant46101, - Variant46102, - Variant46103, - Variant46104, - Variant46105, - Variant46106, - Variant46107, - Variant46108, - Variant46109, - Variant46110, - Variant46111, - Variant46112, - Variant46113, - Variant46114, - Variant46115, - Variant46116, - Variant46117, - Variant46118, - Variant46119, - Variant46120, - Variant46121, - Variant46122, - Variant46123, - Variant46124, - Variant46125, - Variant46126, - Variant46127, - Variant46128, - Variant46129, - Variant46130, - Variant46131, - Variant46132, - Variant46133, - Variant46134, - Variant46135, - Variant46136, - Variant46137, - Variant46138, - Variant46139, - Variant46140, - Variant46141, - Variant46142, - Variant46143, - Variant46144, - Variant46145, - Variant46146, - Variant46147, - Variant46148, - Variant46149, - Variant46150, - Variant46151, - Variant46152, - Variant46153, - Variant46154, - Variant46155, - Variant46156, - Variant46157, - Variant46158, - Variant46159, - Variant46160, - Variant46161, - Variant46162, - Variant46163, - Variant46164, - Variant46165, - Variant46166, - Variant46167, - Variant46168, - Variant46169, - Variant46170, - Variant46171, - Variant46172, - Variant46173, - Variant46174, - Variant46175, - Variant46176, - Variant46177, - Variant46178, - Variant46179, - Variant46180, - Variant46181, - Variant46182, - Variant46183, - Variant46184, - Variant46185, - Variant46186, - Variant46187, - Variant46188, - Variant46189, - Variant46190, - Variant46191, - Variant46192, - Variant46193, - Variant46194, - Variant46195, - Variant46196, - Variant46197, - Variant46198, - Variant46199, - Variant46200, - Variant46201, - Variant46202, - Variant46203, - Variant46204, - Variant46205, - Variant46206, - Variant46207, - Variant46208, - Variant46209, - Variant46210, - Variant46211, - Variant46212, - Variant46213, - Variant46214, - Variant46215, - Variant46216, - Variant46217, - Variant46218, - Variant46219, - Variant46220, - Variant46221, - Variant46222, - Variant46223, - Variant46224, - Variant46225, - Variant46226, - Variant46227, - Variant46228, - Variant46229, - Variant46230, - Variant46231, - Variant46232, - Variant46233, - Variant46234, - Variant46235, - Variant46236, - Variant46237, - Variant46238, - Variant46239, - Variant46240, - Variant46241, - Variant46242, - Variant46243, - Variant46244, - Variant46245, - Variant46246, - Variant46247, - Variant46248, - Variant46249, - Variant46250, - Variant46251, - Variant46252, - Variant46253, - Variant46254, - Variant46255, - Variant46256, - Variant46257, - Variant46258, - Variant46259, - Variant46260, - Variant46261, - Variant46262, - Variant46263, - Variant46264, - Variant46265, - Variant46266, - Variant46267, - Variant46268, - Variant46269, - Variant46270, - Variant46271, - Variant46272, - Variant46273, - Variant46274, - Variant46275, - Variant46276, - Variant46277, - Variant46278, - Variant46279, - Variant46280, - Variant46281, - Variant46282, - Variant46283, - Variant46284, - Variant46285, - Variant46286, - Variant46287, - Variant46288, - Variant46289, - Variant46290, - Variant46291, - Variant46292, - Variant46293, - Variant46294, - Variant46295, - Variant46296, - Variant46297, - Variant46298, - Variant46299, - Variant46300, - Variant46301, - Variant46302, - Variant46303, - Variant46304, - Variant46305, - Variant46306, - Variant46307, - Variant46308, - Variant46309, - Variant46310, - Variant46311, - Variant46312, - Variant46313, - Variant46314, - Variant46315, - Variant46316, - Variant46317, - Variant46318, - Variant46319, - Variant46320, - Variant46321, - Variant46322, - Variant46323, - Variant46324, - Variant46325, - Variant46326, - Variant46327, - Variant46328, - Variant46329, - Variant46330, - Variant46331, - Variant46332, - Variant46333, - Variant46334, - Variant46335, - Variant46336, - Variant46337, - Variant46338, - Variant46339, - Variant46340, - Variant46341, - Variant46342, - Variant46343, - Variant46344, - Variant46345, - Variant46346, - Variant46347, - Variant46348, - Variant46349, - Variant46350, - Variant46351, - Variant46352, - Variant46353, - Variant46354, - Variant46355, - Variant46356, - Variant46357, - Variant46358, - Variant46359, - Variant46360, - Variant46361, - Variant46362, - Variant46363, - Variant46364, - Variant46365, - Variant46366, - Variant46367, - Variant46368, - Variant46369, - Variant46370, - Variant46371, - Variant46372, - Variant46373, - Variant46374, - Variant46375, - Variant46376, - Variant46377, - Variant46378, - Variant46379, - Variant46380, - Variant46381, - Variant46382, - Variant46383, - Variant46384, - Variant46385, - Variant46386, - Variant46387, - Variant46388, - Variant46389, - Variant46390, - Variant46391, - Variant46392, - Variant46393, - Variant46394, - Variant46395, - Variant46396, - Variant46397, - Variant46398, - Variant46399, - Variant46400, - Variant46401, - Variant46402, - Variant46403, - Variant46404, - Variant46405, - Variant46406, - Variant46407, - Variant46408, - Variant46409, - Variant46410, - Variant46411, - Variant46412, - Variant46413, - Variant46414, - Variant46415, - Variant46416, - Variant46417, - Variant46418, - Variant46419, - Variant46420, - Variant46421, - Variant46422, - Variant46423, - Variant46424, - Variant46425, - Variant46426, - Variant46427, - Variant46428, - Variant46429, - Variant46430, - Variant46431, - Variant46432, - Variant46433, - Variant46434, - Variant46435, - Variant46436, - Variant46437, - Variant46438, - Variant46439, - Variant46440, - Variant46441, - Variant46442, - Variant46443, - Variant46444, - Variant46445, - Variant46446, - Variant46447, - Variant46448, - Variant46449, - Variant46450, - Variant46451, - Variant46452, - Variant46453, - Variant46454, - Variant46455, - Variant46456, - Variant46457, - Variant46458, - Variant46459, - Variant46460, - Variant46461, - Variant46462, - Variant46463, - Variant46464, - Variant46465, - Variant46466, - Variant46467, - Variant46468, - Variant46469, - Variant46470, - Variant46471, - Variant46472, - Variant46473, - Variant46474, - Variant46475, - Variant46476, - Variant46477, - Variant46478, - Variant46479, - Variant46480, - Variant46481, - Variant46482, - Variant46483, - Variant46484, - Variant46485, - Variant46486, - Variant46487, - Variant46488, - Variant46489, - Variant46490, - Variant46491, - Variant46492, - Variant46493, - Variant46494, - Variant46495, - Variant46496, - Variant46497, - Variant46498, - Variant46499, - Variant46500, - Variant46501, - Variant46502, - Variant46503, - Variant46504, - Variant46505, - Variant46506, - Variant46507, - Variant46508, - Variant46509, - Variant46510, - Variant46511, - Variant46512, - Variant46513, - Variant46514, - Variant46515, - Variant46516, - Variant46517, - Variant46518, - Variant46519, - Variant46520, - Variant46521, - Variant46522, - Variant46523, - Variant46524, - Variant46525, - Variant46526, - Variant46527, - Variant46528, - Variant46529, - Variant46530, - Variant46531, - Variant46532, - Variant46533, - Variant46534, - Variant46535, - Variant46536, - Variant46537, - Variant46538, - Variant46539, - Variant46540, - Variant46541, - Variant46542, - Variant46543, - Variant46544, - Variant46545, - Variant46546, - Variant46547, - Variant46548, - Variant46549, - Variant46550, - Variant46551, - Variant46552, - Variant46553, - Variant46554, - Variant46555, - Variant46556, - Variant46557, - Variant46558, - Variant46559, - Variant46560, - Variant46561, - Variant46562, - Variant46563, - Variant46564, - Variant46565, - Variant46566, - Variant46567, - Variant46568, - Variant46569, - Variant46570, - Variant46571, - Variant46572, - Variant46573, - Variant46574, - Variant46575, - Variant46576, - Variant46577, - Variant46578, - Variant46579, - Variant46580, - Variant46581, - Variant46582, - Variant46583, - Variant46584, - Variant46585, - Variant46586, - Variant46587, - Variant46588, - Variant46589, - Variant46590, - Variant46591, - Variant46592, - Variant46593, - Variant46594, - Variant46595, - Variant46596, - Variant46597, - Variant46598, - Variant46599, - Variant46600, - Variant46601, - Variant46602, - Variant46603, - Variant46604, - Variant46605, - Variant46606, - Variant46607, - Variant46608, - Variant46609, - Variant46610, - Variant46611, - Variant46612, - Variant46613, - Variant46614, - Variant46615, - Variant46616, - Variant46617, - Variant46618, - Variant46619, - Variant46620, - Variant46621, - Variant46622, - Variant46623, - Variant46624, - Variant46625, - Variant46626, - Variant46627, - Variant46628, - Variant46629, - Variant46630, - Variant46631, - Variant46632, - Variant46633, - Variant46634, - Variant46635, - Variant46636, - Variant46637, - Variant46638, - Variant46639, - Variant46640, - Variant46641, - Variant46642, - Variant46643, - Variant46644, - Variant46645, - Variant46646, - Variant46647, - Variant46648, - Variant46649, - Variant46650, - Variant46651, - Variant46652, - Variant46653, - Variant46654, - Variant46655, - Variant46656, - Variant46657, - Variant46658, - Variant46659, - Variant46660, - Variant46661, - Variant46662, - Variant46663, - Variant46664, - Variant46665, - Variant46666, - Variant46667, - Variant46668, - Variant46669, - Variant46670, - Variant46671, - Variant46672, - Variant46673, - Variant46674, - Variant46675, - Variant46676, - Variant46677, - Variant46678, - Variant46679, - Variant46680, - Variant46681, - Variant46682, - Variant46683, - Variant46684, - Variant46685, - Variant46686, - Variant46687, - Variant46688, - Variant46689, - Variant46690, - Variant46691, - Variant46692, - Variant46693, - Variant46694, - Variant46695, - Variant46696, - Variant46697, - Variant46698, - Variant46699, - Variant46700, - Variant46701, - Variant46702, - Variant46703, - Variant46704, - Variant46705, - Variant46706, - Variant46707, - Variant46708, - Variant46709, - Variant46710, - Variant46711, - Variant46712, - Variant46713, - Variant46714, - Variant46715, - Variant46716, - Variant46717, - Variant46718, - Variant46719, - Variant46720, - Variant46721, - Variant46722, - Variant46723, - Variant46724, - Variant46725, - Variant46726, - Variant46727, - Variant46728, - Variant46729, - Variant46730, - Variant46731, - Variant46732, - Variant46733, - Variant46734, - Variant46735, - Variant46736, - Variant46737, - Variant46738, - Variant46739, - Variant46740, - Variant46741, - Variant46742, - Variant46743, - Variant46744, - Variant46745, - Variant46746, - Variant46747, - Variant46748, - Variant46749, - Variant46750, - Variant46751, - Variant46752, - Variant46753, - Variant46754, - Variant46755, - Variant46756, - Variant46757, - Variant46758, - Variant46759, - Variant46760, - Variant46761, - Variant46762, - Variant46763, - Variant46764, - Variant46765, - Variant46766, - Variant46767, - Variant46768, - Variant46769, - Variant46770, - Variant46771, - Variant46772, - Variant46773, - Variant46774, - Variant46775, - Variant46776, - Variant46777, - Variant46778, - Variant46779, - Variant46780, - Variant46781, - Variant46782, - Variant46783, - Variant46784, - Variant46785, - Variant46786, - Variant46787, - Variant46788, - Variant46789, - Variant46790, - Variant46791, - Variant46792, - Variant46793, - Variant46794, - Variant46795, - Variant46796, - Variant46797, - Variant46798, - Variant46799, - Variant46800, - Variant46801, - Variant46802, - Variant46803, - Variant46804, - Variant46805, - Variant46806, - Variant46807, - Variant46808, - Variant46809, - Variant46810, - Variant46811, - Variant46812, - Variant46813, - Variant46814, - Variant46815, - Variant46816, - Variant46817, - Variant46818, - Variant46819, - Variant46820, - Variant46821, - Variant46822, - Variant46823, - Variant46824, - Variant46825, - Variant46826, - Variant46827, - Variant46828, - Variant46829, - Variant46830, - Variant46831, - Variant46832, - Variant46833, - Variant46834, - Variant46835, - Variant46836, - Variant46837, - Variant46838, - Variant46839, - Variant46840, - Variant46841, - Variant46842, - Variant46843, - Variant46844, - Variant46845, - Variant46846, - Variant46847, - Variant46848, - Variant46849, - Variant46850, - Variant46851, - Variant46852, - Variant46853, - Variant46854, - Variant46855, - Variant46856, - Variant46857, - Variant46858, - Variant46859, - Variant46860, - Variant46861, - Variant46862, - Variant46863, - Variant46864, - Variant46865, - Variant46866, - Variant46867, - Variant46868, - Variant46869, - Variant46870, - Variant46871, - Variant46872, - Variant46873, - Variant46874, - Variant46875, - Variant46876, - Variant46877, - Variant46878, - Variant46879, - Variant46880, - Variant46881, - Variant46882, - Variant46883, - Variant46884, - Variant46885, - Variant46886, - Variant46887, - Variant46888, - Variant46889, - Variant46890, - Variant46891, - Variant46892, - Variant46893, - Variant46894, - Variant46895, - Variant46896, - Variant46897, - Variant46898, - Variant46899, - Variant46900, - Variant46901, - Variant46902, - Variant46903, - Variant46904, - Variant46905, - Variant46906, - Variant46907, - Variant46908, - Variant46909, - Variant46910, - Variant46911, - Variant46912, - Variant46913, - Variant46914, - Variant46915, - Variant46916, - Variant46917, - Variant46918, - Variant46919, - Variant46920, - Variant46921, - Variant46922, - Variant46923, - Variant46924, - Variant46925, - Variant46926, - Variant46927, - Variant46928, - Variant46929, - Variant46930, - Variant46931, - Variant46932, - Variant46933, - Variant46934, - Variant46935, - Variant46936, - Variant46937, - Variant46938, - Variant46939, - Variant46940, - Variant46941, - Variant46942, - Variant46943, - Variant46944, - Variant46945, - Variant46946, - Variant46947, - Variant46948, - Variant46949, - Variant46950, - Variant46951, - Variant46952, - Variant46953, - Variant46954, - Variant46955, - Variant46956, - Variant46957, - Variant46958, - Variant46959, - Variant46960, - Variant46961, - Variant46962, - Variant46963, - Variant46964, - Variant46965, - Variant46966, - Variant46967, - Variant46968, - Variant46969, - Variant46970, - Variant46971, - Variant46972, - Variant46973, - Variant46974, - Variant46975, - Variant46976, - Variant46977, - Variant46978, - Variant46979, - Variant46980, - Variant46981, - Variant46982, - Variant46983, - Variant46984, - Variant46985, - Variant46986, - Variant46987, - Variant46988, - Variant46989, - Variant46990, - Variant46991, - Variant46992, - Variant46993, - Variant46994, - Variant46995, - Variant46996, - Variant46997, - Variant46998, - Variant46999, - Variant47000, - Variant47001, - Variant47002, - Variant47003, - Variant47004, - Variant47005, - Variant47006, - Variant47007, - Variant47008, - Variant47009, - Variant47010, - Variant47011, - Variant47012, - Variant47013, - Variant47014, - Variant47015, - Variant47016, - Variant47017, - Variant47018, - Variant47019, - Variant47020, - Variant47021, - Variant47022, - Variant47023, - Variant47024, - Variant47025, - Variant47026, - Variant47027, - Variant47028, - Variant47029, - Variant47030, - Variant47031, - Variant47032, - Variant47033, - Variant47034, - Variant47035, - Variant47036, - Variant47037, - Variant47038, - Variant47039, - Variant47040, - Variant47041, - Variant47042, - Variant47043, - Variant47044, - Variant47045, - Variant47046, - Variant47047, - Variant47048, - Variant47049, - Variant47050, - Variant47051, - Variant47052, - Variant47053, - Variant47054, - Variant47055, - Variant47056, - Variant47057, - Variant47058, - Variant47059, - Variant47060, - Variant47061, - Variant47062, - Variant47063, - Variant47064, - Variant47065, - Variant47066, - Variant47067, - Variant47068, - Variant47069, - Variant47070, - Variant47071, - Variant47072, - Variant47073, - Variant47074, - Variant47075, - Variant47076, - Variant47077, - Variant47078, - Variant47079, - Variant47080, - Variant47081, - Variant47082, - Variant47083, - Variant47084, - Variant47085, - Variant47086, - Variant47087, - Variant47088, - Variant47089, - Variant47090, - Variant47091, - Variant47092, - Variant47093, - Variant47094, - Variant47095, - Variant47096, - Variant47097, - Variant47098, - Variant47099, - Variant47100, - Variant47101, - Variant47102, - Variant47103, - Variant47104, - Variant47105, - Variant47106, - Variant47107, - Variant47108, - Variant47109, - Variant47110, - Variant47111, - Variant47112, - Variant47113, - Variant47114, - Variant47115, - Variant47116, - Variant47117, - Variant47118, - Variant47119, - Variant47120, - Variant47121, - Variant47122, - Variant47123, - Variant47124, - Variant47125, - Variant47126, - Variant47127, - Variant47128, - Variant47129, - Variant47130, - Variant47131, - Variant47132, - Variant47133, - Variant47134, - Variant47135, - Variant47136, - Variant47137, - Variant47138, - Variant47139, - Variant47140, - Variant47141, - Variant47142, - Variant47143, - Variant47144, - Variant47145, - Variant47146, - Variant47147, - Variant47148, - Variant47149, - Variant47150, - Variant47151, - Variant47152, - Variant47153, - Variant47154, - Variant47155, - Variant47156, - Variant47157, - Variant47158, - Variant47159, - Variant47160, - Variant47161, - Variant47162, - Variant47163, - Variant47164, - Variant47165, - Variant47166, - Variant47167, - Variant47168, - Variant47169, - Variant47170, - Variant47171, - Variant47172, - Variant47173, - Variant47174, - Variant47175, - Variant47176, - Variant47177, - Variant47178, - Variant47179, - Variant47180, - Variant47181, - Variant47182, - Variant47183, - Variant47184, - Variant47185, - Variant47186, - Variant47187, - Variant47188, - Variant47189, - Variant47190, - Variant47191, - Variant47192, - Variant47193, - Variant47194, - Variant47195, - Variant47196, - Variant47197, - Variant47198, - Variant47199, - Variant47200, - Variant47201, - Variant47202, - Variant47203, - Variant47204, - Variant47205, - Variant47206, - Variant47207, - Variant47208, - Variant47209, - Variant47210, - Variant47211, - Variant47212, - Variant47213, - Variant47214, - Variant47215, - Variant47216, - Variant47217, - Variant47218, - Variant47219, - Variant47220, - Variant47221, - Variant47222, - Variant47223, - Variant47224, - Variant47225, - Variant47226, - Variant47227, - Variant47228, - Variant47229, - Variant47230, - Variant47231, - Variant47232, - Variant47233, - Variant47234, - Variant47235, - Variant47236, - Variant47237, - Variant47238, - Variant47239, - Variant47240, - Variant47241, - Variant47242, - Variant47243, - Variant47244, - Variant47245, - Variant47246, - Variant47247, - Variant47248, - Variant47249, - Variant47250, - Variant47251, - Variant47252, - Variant47253, - Variant47254, - Variant47255, - Variant47256, - Variant47257, - Variant47258, - Variant47259, - Variant47260, - Variant47261, - Variant47262, - Variant47263, - Variant47264, - Variant47265, - Variant47266, - Variant47267, - Variant47268, - Variant47269, - Variant47270, - Variant47271, - Variant47272, - Variant47273, - Variant47274, - Variant47275, - Variant47276, - Variant47277, - Variant47278, - Variant47279, - Variant47280, - Variant47281, - Variant47282, - Variant47283, - Variant47284, - Variant47285, - Variant47286, - Variant47287, - Variant47288, - Variant47289, - Variant47290, - Variant47291, - Variant47292, - Variant47293, - Variant47294, - Variant47295, - Variant47296, - Variant47297, - Variant47298, - Variant47299, - Variant47300, - Variant47301, - Variant47302, - Variant47303, - Variant47304, - Variant47305, - Variant47306, - Variant47307, - Variant47308, - Variant47309, - Variant47310, - Variant47311, - Variant47312, - Variant47313, - Variant47314, - Variant47315, - Variant47316, - Variant47317, - Variant47318, - Variant47319, - Variant47320, - Variant47321, - Variant47322, - Variant47323, - Variant47324, - Variant47325, - Variant47326, - Variant47327, - Variant47328, - Variant47329, - Variant47330, - Variant47331, - Variant47332, - Variant47333, - Variant47334, - Variant47335, - Variant47336, - Variant47337, - Variant47338, - Variant47339, - Variant47340, - Variant47341, - Variant47342, - Variant47343, - Variant47344, - Variant47345, - Variant47346, - Variant47347, - Variant47348, - Variant47349, - Variant47350, - Variant47351, - Variant47352, - Variant47353, - Variant47354, - Variant47355, - Variant47356, - Variant47357, - Variant47358, - Variant47359, - Variant47360, - Variant47361, - Variant47362, - Variant47363, - Variant47364, - Variant47365, - Variant47366, - Variant47367, - Variant47368, - Variant47369, - Variant47370, - Variant47371, - Variant47372, - Variant47373, - Variant47374, - Variant47375, - Variant47376, - Variant47377, - Variant47378, - Variant47379, - Variant47380, - Variant47381, - Variant47382, - Variant47383, - Variant47384, - Variant47385, - Variant47386, - Variant47387, - Variant47388, - Variant47389, - Variant47390, - Variant47391, - Variant47392, - Variant47393, - Variant47394, - Variant47395, - Variant47396, - Variant47397, - Variant47398, - Variant47399, - Variant47400, - Variant47401, - Variant47402, - Variant47403, - Variant47404, - Variant47405, - Variant47406, - Variant47407, - Variant47408, - Variant47409, - Variant47410, - Variant47411, - Variant47412, - Variant47413, - Variant47414, - Variant47415, - Variant47416, - Variant47417, - Variant47418, - Variant47419, - Variant47420, - Variant47421, - Variant47422, - Variant47423, - Variant47424, - Variant47425, - Variant47426, - Variant47427, - Variant47428, - Variant47429, - Variant47430, - Variant47431, - Variant47432, - Variant47433, - Variant47434, - Variant47435, - Variant47436, - Variant47437, - Variant47438, - Variant47439, - Variant47440, - Variant47441, - Variant47442, - Variant47443, - Variant47444, - Variant47445, - Variant47446, - Variant47447, - Variant47448, - Variant47449, - Variant47450, - Variant47451, - Variant47452, - Variant47453, - Variant47454, - Variant47455, - Variant47456, - Variant47457, - Variant47458, - Variant47459, - Variant47460, - Variant47461, - Variant47462, - Variant47463, - Variant47464, - Variant47465, - Variant47466, - Variant47467, - Variant47468, - Variant47469, - Variant47470, - Variant47471, - Variant47472, - Variant47473, - Variant47474, - Variant47475, - Variant47476, - Variant47477, - Variant47478, - Variant47479, - Variant47480, - Variant47481, - Variant47482, - Variant47483, - Variant47484, - Variant47485, - Variant47486, - Variant47487, - Variant47488, - Variant47489, - Variant47490, - Variant47491, - Variant47492, - Variant47493, - Variant47494, - Variant47495, - Variant47496, - Variant47497, - Variant47498, - Variant47499, - Variant47500, - Variant47501, - Variant47502, - Variant47503, - Variant47504, - Variant47505, - Variant47506, - Variant47507, - Variant47508, - Variant47509, - Variant47510, - Variant47511, - Variant47512, - Variant47513, - Variant47514, - Variant47515, - Variant47516, - Variant47517, - Variant47518, - Variant47519, - Variant47520, - Variant47521, - Variant47522, - Variant47523, - Variant47524, - Variant47525, - Variant47526, - Variant47527, - Variant47528, - Variant47529, - Variant47530, - Variant47531, - Variant47532, - Variant47533, - Variant47534, - Variant47535, - Variant47536, - Variant47537, - Variant47538, - Variant47539, - Variant47540, - Variant47541, - Variant47542, - Variant47543, - Variant47544, - Variant47545, - Variant47546, - Variant47547, - Variant47548, - Variant47549, - Variant47550, - Variant47551, - Variant47552, - Variant47553, - Variant47554, - Variant47555, - Variant47556, - Variant47557, - Variant47558, - Variant47559, - Variant47560, - Variant47561, - Variant47562, - Variant47563, - Variant47564, - Variant47565, - Variant47566, - Variant47567, - Variant47568, - Variant47569, - Variant47570, - Variant47571, - Variant47572, - Variant47573, - Variant47574, - Variant47575, - Variant47576, - Variant47577, - Variant47578, - Variant47579, - Variant47580, - Variant47581, - Variant47582, - Variant47583, - Variant47584, - Variant47585, - Variant47586, - Variant47587, - Variant47588, - Variant47589, - Variant47590, - Variant47591, - Variant47592, - Variant47593, - Variant47594, - Variant47595, - Variant47596, - Variant47597, - Variant47598, - Variant47599, - Variant47600, - Variant47601, - Variant47602, - Variant47603, - Variant47604, - Variant47605, - Variant47606, - Variant47607, - Variant47608, - Variant47609, - Variant47610, - Variant47611, - Variant47612, - Variant47613, - Variant47614, - Variant47615, - Variant47616, - Variant47617, - Variant47618, - Variant47619, - Variant47620, - Variant47621, - Variant47622, - Variant47623, - Variant47624, - Variant47625, - Variant47626, - Variant47627, - Variant47628, - Variant47629, - Variant47630, - Variant47631, - Variant47632, - Variant47633, - Variant47634, - Variant47635, - Variant47636, - Variant47637, - Variant47638, - Variant47639, - Variant47640, - Variant47641, - Variant47642, - Variant47643, - Variant47644, - Variant47645, - Variant47646, - Variant47647, - Variant47648, - Variant47649, - Variant47650, - Variant47651, - Variant47652, - Variant47653, - Variant47654, - Variant47655, - Variant47656, - Variant47657, - Variant47658, - Variant47659, - Variant47660, - Variant47661, - Variant47662, - Variant47663, - Variant47664, - Variant47665, - Variant47666, - Variant47667, - Variant47668, - Variant47669, - Variant47670, - Variant47671, - Variant47672, - Variant47673, - Variant47674, - Variant47675, - Variant47676, - Variant47677, - Variant47678, - Variant47679, - Variant47680, - Variant47681, - Variant47682, - Variant47683, - Variant47684, - Variant47685, - Variant47686, - Variant47687, - Variant47688, - Variant47689, - Variant47690, - Variant47691, - Variant47692, - Variant47693, - Variant47694, - Variant47695, - Variant47696, - Variant47697, - Variant47698, - Variant47699, - Variant47700, - Variant47701, - Variant47702, - Variant47703, - Variant47704, - Variant47705, - Variant47706, - Variant47707, - Variant47708, - Variant47709, - Variant47710, - Variant47711, - Variant47712, - Variant47713, - Variant47714, - Variant47715, - Variant47716, - Variant47717, - Variant47718, - Variant47719, - Variant47720, - Variant47721, - Variant47722, - Variant47723, - Variant47724, - Variant47725, - Variant47726, - Variant47727, - Variant47728, - Variant47729, - Variant47730, - Variant47731, - Variant47732, - Variant47733, - Variant47734, - Variant47735, - Variant47736, - Variant47737, - Variant47738, - Variant47739, - Variant47740, - Variant47741, - Variant47742, - Variant47743, - Variant47744, - Variant47745, - Variant47746, - Variant47747, - Variant47748, - Variant47749, - Variant47750, - Variant47751, - Variant47752, - Variant47753, - Variant47754, - Variant47755, - Variant47756, - Variant47757, - Variant47758, - Variant47759, - Variant47760, - Variant47761, - Variant47762, - Variant47763, - Variant47764, - Variant47765, - Variant47766, - Variant47767, - Variant47768, - Variant47769, - Variant47770, - Variant47771, - Variant47772, - Variant47773, - Variant47774, - Variant47775, - Variant47776, - Variant47777, - Variant47778, - Variant47779, - Variant47780, - Variant47781, - Variant47782, - Variant47783, - Variant47784, - Variant47785, - Variant47786, - Variant47787, - Variant47788, - Variant47789, - Variant47790, - Variant47791, - Variant47792, - Variant47793, - Variant47794, - Variant47795, - Variant47796, - Variant47797, - Variant47798, - Variant47799, - Variant47800, - Variant47801, - Variant47802, - Variant47803, - Variant47804, - Variant47805, - Variant47806, - Variant47807, - Variant47808, - Variant47809, - Variant47810, - Variant47811, - Variant47812, - Variant47813, - Variant47814, - Variant47815, - Variant47816, - Variant47817, - Variant47818, - Variant47819, - Variant47820, - Variant47821, - Variant47822, - Variant47823, - Variant47824, - Variant47825, - Variant47826, - Variant47827, - Variant47828, - Variant47829, - Variant47830, - Variant47831, - Variant47832, - Variant47833, - Variant47834, - Variant47835, - Variant47836, - Variant47837, - Variant47838, - Variant47839, - Variant47840, - Variant47841, - Variant47842, - Variant47843, - Variant47844, - Variant47845, - Variant47846, - Variant47847, - Variant47848, - Variant47849, - Variant47850, - Variant47851, - Variant47852, - Variant47853, - Variant47854, - Variant47855, - Variant47856, - Variant47857, - Variant47858, - Variant47859, - Variant47860, - Variant47861, - Variant47862, - Variant47863, - Variant47864, - Variant47865, - Variant47866, - Variant47867, - Variant47868, - Variant47869, - Variant47870, - Variant47871, - Variant47872, - Variant47873, - Variant47874, - Variant47875, - Variant47876, - Variant47877, - Variant47878, - Variant47879, - Variant47880, - Variant47881, - Variant47882, - Variant47883, - Variant47884, - Variant47885, - Variant47886, - Variant47887, - Variant47888, - Variant47889, - Variant47890, - Variant47891, - Variant47892, - Variant47893, - Variant47894, - Variant47895, - Variant47896, - Variant47897, - Variant47898, - Variant47899, - Variant47900, - Variant47901, - Variant47902, - Variant47903, - Variant47904, - Variant47905, - Variant47906, - Variant47907, - Variant47908, - Variant47909, - Variant47910, - Variant47911, - Variant47912, - Variant47913, - Variant47914, - Variant47915, - Variant47916, - Variant47917, - Variant47918, - Variant47919, - Variant47920, - Variant47921, - Variant47922, - Variant47923, - Variant47924, - Variant47925, - Variant47926, - Variant47927, - Variant47928, - Variant47929, - Variant47930, - Variant47931, - Variant47932, - Variant47933, - Variant47934, - Variant47935, - Variant47936, - Variant47937, - Variant47938, - Variant47939, - Variant47940, - Variant47941, - Variant47942, - Variant47943, - Variant47944, - Variant47945, - Variant47946, - Variant47947, - Variant47948, - Variant47949, - Variant47950, - Variant47951, - Variant47952, - Variant47953, - Variant47954, - Variant47955, - Variant47956, - Variant47957, - Variant47958, - Variant47959, - Variant47960, - Variant47961, - Variant47962, - Variant47963, - Variant47964, - Variant47965, - Variant47966, - Variant47967, - Variant47968, - Variant47969, - Variant47970, - Variant47971, - Variant47972, - Variant47973, - Variant47974, - Variant47975, - Variant47976, - Variant47977, - Variant47978, - Variant47979, - Variant47980, - Variant47981, - Variant47982, - Variant47983, - Variant47984, - Variant47985, - Variant47986, - Variant47987, - Variant47988, - Variant47989, - Variant47990, - Variant47991, - Variant47992, - Variant47993, - Variant47994, - Variant47995, - Variant47996, - Variant47997, - Variant47998, - Variant47999, - Variant48000, - Variant48001, - Variant48002, - Variant48003, - Variant48004, - Variant48005, - Variant48006, - Variant48007, - Variant48008, - Variant48009, - Variant48010, - Variant48011, - Variant48012, - Variant48013, - Variant48014, - Variant48015, - Variant48016, - Variant48017, - Variant48018, - Variant48019, - Variant48020, - Variant48021, - Variant48022, - Variant48023, - Variant48024, - Variant48025, - Variant48026, - Variant48027, - Variant48028, - Variant48029, - Variant48030, - Variant48031, - Variant48032, - Variant48033, - Variant48034, - Variant48035, - Variant48036, - Variant48037, - Variant48038, - Variant48039, - Variant48040, - Variant48041, - Variant48042, - Variant48043, - Variant48044, - Variant48045, - Variant48046, - Variant48047, - Variant48048, - Variant48049, - Variant48050, - Variant48051, - Variant48052, - Variant48053, - Variant48054, - Variant48055, - Variant48056, - Variant48057, - Variant48058, - Variant48059, - Variant48060, - Variant48061, - Variant48062, - Variant48063, - Variant48064, - Variant48065, - Variant48066, - Variant48067, - Variant48068, - Variant48069, - Variant48070, - Variant48071, - Variant48072, - Variant48073, - Variant48074, - Variant48075, - Variant48076, - Variant48077, - Variant48078, - Variant48079, - Variant48080, - Variant48081, - Variant48082, - Variant48083, - Variant48084, - Variant48085, - Variant48086, - Variant48087, - Variant48088, - Variant48089, - Variant48090, - Variant48091, - Variant48092, - Variant48093, - Variant48094, - Variant48095, - Variant48096, - Variant48097, - Variant48098, - Variant48099, - Variant48100, - Variant48101, - Variant48102, - Variant48103, - Variant48104, - Variant48105, - Variant48106, - Variant48107, - Variant48108, - Variant48109, - Variant48110, - Variant48111, - Variant48112, - Variant48113, - Variant48114, - Variant48115, - Variant48116, - Variant48117, - Variant48118, - Variant48119, - Variant48120, - Variant48121, - Variant48122, - Variant48123, - Variant48124, - Variant48125, - Variant48126, - Variant48127, - Variant48128, - Variant48129, - Variant48130, - Variant48131, - Variant48132, - Variant48133, - Variant48134, - Variant48135, - Variant48136, - Variant48137, - Variant48138, - Variant48139, - Variant48140, - Variant48141, - Variant48142, - Variant48143, - Variant48144, - Variant48145, - Variant48146, - Variant48147, - Variant48148, - Variant48149, - Variant48150, - Variant48151, - Variant48152, - Variant48153, - Variant48154, - Variant48155, - Variant48156, - Variant48157, - Variant48158, - Variant48159, - Variant48160, - Variant48161, - Variant48162, - Variant48163, - Variant48164, - Variant48165, - Variant48166, - Variant48167, - Variant48168, - Variant48169, - Variant48170, - Variant48171, - Variant48172, - Variant48173, - Variant48174, - Variant48175, - Variant48176, - Variant48177, - Variant48178, - Variant48179, - Variant48180, - Variant48181, - Variant48182, - Variant48183, - Variant48184, - Variant48185, - Variant48186, - Variant48187, - Variant48188, - Variant48189, - Variant48190, - Variant48191, - Variant48192, - Variant48193, - Variant48194, - Variant48195, - Variant48196, - Variant48197, - Variant48198, - Variant48199, - Variant48200, - Variant48201, - Variant48202, - Variant48203, - Variant48204, - Variant48205, - Variant48206, - Variant48207, - Variant48208, - Variant48209, - Variant48210, - Variant48211, - Variant48212, - Variant48213, - Variant48214, - Variant48215, - Variant48216, - Variant48217, - Variant48218, - Variant48219, - Variant48220, - Variant48221, - Variant48222, - Variant48223, - Variant48224, - Variant48225, - Variant48226, - Variant48227, - Variant48228, - Variant48229, - Variant48230, - Variant48231, - Variant48232, - Variant48233, - Variant48234, - Variant48235, - Variant48236, - Variant48237, - Variant48238, - Variant48239, - Variant48240, - Variant48241, - Variant48242, - Variant48243, - Variant48244, - Variant48245, - Variant48246, - Variant48247, - Variant48248, - Variant48249, - Variant48250, - Variant48251, - Variant48252, - Variant48253, - Variant48254, - Variant48255, - Variant48256, - Variant48257, - Variant48258, - Variant48259, - Variant48260, - Variant48261, - Variant48262, - Variant48263, - Variant48264, - Variant48265, - Variant48266, - Variant48267, - Variant48268, - Variant48269, - Variant48270, - Variant48271, - Variant48272, - Variant48273, - Variant48274, - Variant48275, - Variant48276, - Variant48277, - Variant48278, - Variant48279, - Variant48280, - Variant48281, - Variant48282, - Variant48283, - Variant48284, - Variant48285, - Variant48286, - Variant48287, - Variant48288, - Variant48289, - Variant48290, - Variant48291, - Variant48292, - Variant48293, - Variant48294, - Variant48295, - Variant48296, - Variant48297, - Variant48298, - Variant48299, - Variant48300, - Variant48301, - Variant48302, - Variant48303, - Variant48304, - Variant48305, - Variant48306, - Variant48307, - Variant48308, - Variant48309, - Variant48310, - Variant48311, - Variant48312, - Variant48313, - Variant48314, - Variant48315, - Variant48316, - Variant48317, - Variant48318, - Variant48319, - Variant48320, - Variant48321, - Variant48322, - Variant48323, - Variant48324, - Variant48325, - Variant48326, - Variant48327, - Variant48328, - Variant48329, - Variant48330, - Variant48331, - Variant48332, - Variant48333, - Variant48334, - Variant48335, - Variant48336, - Variant48337, - Variant48338, - Variant48339, - Variant48340, - Variant48341, - Variant48342, - Variant48343, - Variant48344, - Variant48345, - Variant48346, - Variant48347, - Variant48348, - Variant48349, - Variant48350, - Variant48351, - Variant48352, - Variant48353, - Variant48354, - Variant48355, - Variant48356, - Variant48357, - Variant48358, - Variant48359, - Variant48360, - Variant48361, - Variant48362, - Variant48363, - Variant48364, - Variant48365, - Variant48366, - Variant48367, - Variant48368, - Variant48369, - Variant48370, - Variant48371, - Variant48372, - Variant48373, - Variant48374, - Variant48375, - Variant48376, - Variant48377, - Variant48378, - Variant48379, - Variant48380, - Variant48381, - Variant48382, - Variant48383, - Variant48384, - Variant48385, - Variant48386, - Variant48387, - Variant48388, - Variant48389, - Variant48390, - Variant48391, - Variant48392, - Variant48393, - Variant48394, - Variant48395, - Variant48396, - Variant48397, - Variant48398, - Variant48399, - Variant48400, - Variant48401, - Variant48402, - Variant48403, - Variant48404, - Variant48405, - Variant48406, - Variant48407, - Variant48408, - Variant48409, - Variant48410, - Variant48411, - Variant48412, - Variant48413, - Variant48414, - Variant48415, - Variant48416, - Variant48417, - Variant48418, - Variant48419, - Variant48420, - Variant48421, - Variant48422, - Variant48423, - Variant48424, - Variant48425, - Variant48426, - Variant48427, - Variant48428, - Variant48429, - Variant48430, - Variant48431, - Variant48432, - Variant48433, - Variant48434, - Variant48435, - Variant48436, - Variant48437, - Variant48438, - Variant48439, - Variant48440, - Variant48441, - Variant48442, - Variant48443, - Variant48444, - Variant48445, - Variant48446, - Variant48447, - Variant48448, - Variant48449, - Variant48450, - Variant48451, - Variant48452, - Variant48453, - Variant48454, - Variant48455, - Variant48456, - Variant48457, - Variant48458, - Variant48459, - Variant48460, - Variant48461, - Variant48462, - Variant48463, - Variant48464, - Variant48465, - Variant48466, - Variant48467, - Variant48468, - Variant48469, - Variant48470, - Variant48471, - Variant48472, - Variant48473, - Variant48474, - Variant48475, - Variant48476, - Variant48477, - Variant48478, - Variant48479, - Variant48480, - Variant48481, - Variant48482, - Variant48483, - Variant48484, - Variant48485, - Variant48486, - Variant48487, - Variant48488, - Variant48489, - Variant48490, - Variant48491, - Variant48492, - Variant48493, - Variant48494, - Variant48495, - Variant48496, - Variant48497, - Variant48498, - Variant48499, - Variant48500, - Variant48501, - Variant48502, - Variant48503, - Variant48504, - Variant48505, - Variant48506, - Variant48507, - Variant48508, - Variant48509, - Variant48510, - Variant48511, - Variant48512, - Variant48513, - Variant48514, - Variant48515, - Variant48516, - Variant48517, - Variant48518, - Variant48519, - Variant48520, - Variant48521, - Variant48522, - Variant48523, - Variant48524, - Variant48525, - Variant48526, - Variant48527, - Variant48528, - Variant48529, - Variant48530, - Variant48531, - Variant48532, - Variant48533, - Variant48534, - Variant48535, - Variant48536, - Variant48537, - Variant48538, - Variant48539, - Variant48540, - Variant48541, - Variant48542, - Variant48543, - Variant48544, - Variant48545, - Variant48546, - Variant48547, - Variant48548, - Variant48549, - Variant48550, - Variant48551, - Variant48552, - Variant48553, - Variant48554, - Variant48555, - Variant48556, - Variant48557, - Variant48558, - Variant48559, - Variant48560, - Variant48561, - Variant48562, - Variant48563, - Variant48564, - Variant48565, - Variant48566, - Variant48567, - Variant48568, - Variant48569, - Variant48570, - Variant48571, - Variant48572, - Variant48573, - Variant48574, - Variant48575, - Variant48576, - Variant48577, - Variant48578, - Variant48579, - Variant48580, - Variant48581, - Variant48582, - Variant48583, - Variant48584, - Variant48585, - Variant48586, - Variant48587, - Variant48588, - Variant48589, - Variant48590, - Variant48591, - Variant48592, - Variant48593, - Variant48594, - Variant48595, - Variant48596, - Variant48597, - Variant48598, - Variant48599, - Variant48600, - Variant48601, - Variant48602, - Variant48603, - Variant48604, - Variant48605, - Variant48606, - Variant48607, - Variant48608, - Variant48609, - Variant48610, - Variant48611, - Variant48612, - Variant48613, - Variant48614, - Variant48615, - Variant48616, - Variant48617, - Variant48618, - Variant48619, - Variant48620, - Variant48621, - Variant48622, - Variant48623, - Variant48624, - Variant48625, - Variant48626, - Variant48627, - Variant48628, - Variant48629, - Variant48630, - Variant48631, - Variant48632, - Variant48633, - Variant48634, - Variant48635, - Variant48636, - Variant48637, - Variant48638, - Variant48639, - Variant48640, - Variant48641, - Variant48642, - Variant48643, - Variant48644, - Variant48645, - Variant48646, - Variant48647, - Variant48648, - Variant48649, - Variant48650, - Variant48651, - Variant48652, - Variant48653, - Variant48654, - Variant48655, - Variant48656, - Variant48657, - Variant48658, - Variant48659, - Variant48660, - Variant48661, - Variant48662, - Variant48663, - Variant48664, - Variant48665, - Variant48666, - Variant48667, - Variant48668, - Variant48669, - Variant48670, - Variant48671, - Variant48672, - Variant48673, - Variant48674, - Variant48675, - Variant48676, - Variant48677, - Variant48678, - Variant48679, - Variant48680, - Variant48681, - Variant48682, - Variant48683, - Variant48684, - Variant48685, - Variant48686, - Variant48687, - Variant48688, - Variant48689, - Variant48690, - Variant48691, - Variant48692, - Variant48693, - Variant48694, - Variant48695, - Variant48696, - Variant48697, - Variant48698, - Variant48699, - Variant48700, - Variant48701, - Variant48702, - Variant48703, - Variant48704, - Variant48705, - Variant48706, - Variant48707, - Variant48708, - Variant48709, - Variant48710, - Variant48711, - Variant48712, - Variant48713, - Variant48714, - Variant48715, - Variant48716, - Variant48717, - Variant48718, - Variant48719, - Variant48720, - Variant48721, - Variant48722, - Variant48723, - Variant48724, - Variant48725, - Variant48726, - Variant48727, - Variant48728, - Variant48729, - Variant48730, - Variant48731, - Variant48732, - Variant48733, - Variant48734, - Variant48735, - Variant48736, - Variant48737, - Variant48738, - Variant48739, - Variant48740, - Variant48741, - Variant48742, - Variant48743, - Variant48744, - Variant48745, - Variant48746, - Variant48747, - Variant48748, - Variant48749, - Variant48750, - Variant48751, - Variant48752, - Variant48753, - Variant48754, - Variant48755, - Variant48756, - Variant48757, - Variant48758, - Variant48759, - Variant48760, - Variant48761, - Variant48762, - Variant48763, - Variant48764, - Variant48765, - Variant48766, - Variant48767, - Variant48768, - Variant48769, - Variant48770, - Variant48771, - Variant48772, - Variant48773, - Variant48774, - Variant48775, - Variant48776, - Variant48777, - Variant48778, - Variant48779, - Variant48780, - Variant48781, - Variant48782, - Variant48783, - Variant48784, - Variant48785, - Variant48786, - Variant48787, - Variant48788, - Variant48789, - Variant48790, - Variant48791, - Variant48792, - Variant48793, - Variant48794, - Variant48795, - Variant48796, - Variant48797, - Variant48798, - Variant48799, - Variant48800, - Variant48801, - Variant48802, - Variant48803, - Variant48804, - Variant48805, - Variant48806, - Variant48807, - Variant48808, - Variant48809, - Variant48810, - Variant48811, - Variant48812, - Variant48813, - Variant48814, - Variant48815, - Variant48816, - Variant48817, - Variant48818, - Variant48819, - Variant48820, - Variant48821, - Variant48822, - Variant48823, - Variant48824, - Variant48825, - Variant48826, - Variant48827, - Variant48828, - Variant48829, - Variant48830, - Variant48831, - Variant48832, - Variant48833, - Variant48834, - Variant48835, - Variant48836, - Variant48837, - Variant48838, - Variant48839, - Variant48840, - Variant48841, - Variant48842, - Variant48843, - Variant48844, - Variant48845, - Variant48846, - Variant48847, - Variant48848, - Variant48849, - Variant48850, - Variant48851, - Variant48852, - Variant48853, - Variant48854, - Variant48855, - Variant48856, - Variant48857, - Variant48858, - Variant48859, - Variant48860, - Variant48861, - Variant48862, - Variant48863, - Variant48864, - Variant48865, - Variant48866, - Variant48867, - Variant48868, - Variant48869, - Variant48870, - Variant48871, - Variant48872, - Variant48873, - Variant48874, - Variant48875, - Variant48876, - Variant48877, - Variant48878, - Variant48879, - Variant48880, - Variant48881, - Variant48882, - Variant48883, - Variant48884, - Variant48885, - Variant48886, - Variant48887, - Variant48888, - Variant48889, - Variant48890, - Variant48891, - Variant48892, - Variant48893, - Variant48894, - Variant48895, - Variant48896, - Variant48897, - Variant48898, - Variant48899, - Variant48900, - Variant48901, - Variant48902, - Variant48903, - Variant48904, - Variant48905, - Variant48906, - Variant48907, - Variant48908, - Variant48909, - Variant48910, - Variant48911, - Variant48912, - Variant48913, - Variant48914, - Variant48915, - Variant48916, - Variant48917, - Variant48918, - Variant48919, - Variant48920, - Variant48921, - Variant48922, - Variant48923, - Variant48924, - Variant48925, - Variant48926, - Variant48927, - Variant48928, - Variant48929, - Variant48930, - Variant48931, - Variant48932, - Variant48933, - Variant48934, - Variant48935, - Variant48936, - Variant48937, - Variant48938, - Variant48939, - Variant48940, - Variant48941, - Variant48942, - Variant48943, - Variant48944, - Variant48945, - Variant48946, - Variant48947, - Variant48948, - Variant48949, - Variant48950, - Variant48951, - Variant48952, - Variant48953, - Variant48954, - Variant48955, - Variant48956, - Variant48957, - Variant48958, - Variant48959, - Variant48960, - Variant48961, - Variant48962, - Variant48963, - Variant48964, - Variant48965, - Variant48966, - Variant48967, - Variant48968, - Variant48969, - Variant48970, - Variant48971, - Variant48972, - Variant48973, - Variant48974, - Variant48975, - Variant48976, - Variant48977, - Variant48978, - Variant48979, - Variant48980, - Variant48981, - Variant48982, - Variant48983, - Variant48984, - Variant48985, - Variant48986, - Variant48987, - Variant48988, - Variant48989, - Variant48990, - Variant48991, - Variant48992, - Variant48993, - Variant48994, - Variant48995, - Variant48996, - Variant48997, - Variant48998, - Variant48999, - Variant49000, - Variant49001, - Variant49002, - Variant49003, - Variant49004, - Variant49005, - Variant49006, - Variant49007, - Variant49008, - Variant49009, - Variant49010, - Variant49011, - Variant49012, - Variant49013, - Variant49014, - Variant49015, - Variant49016, - Variant49017, - Variant49018, - Variant49019, - Variant49020, - Variant49021, - Variant49022, - Variant49023, - Variant49024, - Variant49025, - Variant49026, - Variant49027, - Variant49028, - Variant49029, - Variant49030, - Variant49031, - Variant49032, - Variant49033, - Variant49034, - Variant49035, - Variant49036, - Variant49037, - Variant49038, - Variant49039, - Variant49040, - Variant49041, - Variant49042, - Variant49043, - Variant49044, - Variant49045, - Variant49046, - Variant49047, - Variant49048, - Variant49049, - Variant49050, - Variant49051, - Variant49052, - Variant49053, - Variant49054, - Variant49055, - Variant49056, - Variant49057, - Variant49058, - Variant49059, - Variant49060, - Variant49061, - Variant49062, - Variant49063, - Variant49064, - Variant49065, - Variant49066, - Variant49067, - Variant49068, - Variant49069, - Variant49070, - Variant49071, - Variant49072, - Variant49073, - Variant49074, - Variant49075, - Variant49076, - Variant49077, - Variant49078, - Variant49079, - Variant49080, - Variant49081, - Variant49082, - Variant49083, - Variant49084, - Variant49085, - Variant49086, - Variant49087, - Variant49088, - Variant49089, - Variant49090, - Variant49091, - Variant49092, - Variant49093, - Variant49094, - Variant49095, - Variant49096, - Variant49097, - Variant49098, - Variant49099, - Variant49100, - Variant49101, - Variant49102, - Variant49103, - Variant49104, - Variant49105, - Variant49106, - Variant49107, - Variant49108, - Variant49109, - Variant49110, - Variant49111, - Variant49112, - Variant49113, - Variant49114, - Variant49115, - Variant49116, - Variant49117, - Variant49118, - Variant49119, - Variant49120, - Variant49121, - Variant49122, - Variant49123, - Variant49124, - Variant49125, - Variant49126, - Variant49127, - Variant49128, - Variant49129, - Variant49130, - Variant49131, - Variant49132, - Variant49133, - Variant49134, - Variant49135, - Variant49136, - Variant49137, - Variant49138, - Variant49139, - Variant49140, - Variant49141, - Variant49142, - Variant49143, - Variant49144, - Variant49145, - Variant49146, - Variant49147, - Variant49148, - Variant49149, - Variant49150, - Variant49151, - Variant49152, - Variant49153, - Variant49154, - Variant49155, - Variant49156, - Variant49157, - Variant49158, - Variant49159, - Variant49160, - Variant49161, - Variant49162, - Variant49163, - Variant49164, - Variant49165, - Variant49166, - Variant49167, - Variant49168, - Variant49169, - Variant49170, - Variant49171, - Variant49172, - Variant49173, - Variant49174, - Variant49175, - Variant49176, - Variant49177, - Variant49178, - Variant49179, - Variant49180, - Variant49181, - Variant49182, - Variant49183, - Variant49184, - Variant49185, - Variant49186, - Variant49187, - Variant49188, - Variant49189, - Variant49190, - Variant49191, - Variant49192, - Variant49193, - Variant49194, - Variant49195, - Variant49196, - Variant49197, - Variant49198, - Variant49199, - Variant49200, - Variant49201, - Variant49202, - Variant49203, - Variant49204, - Variant49205, - Variant49206, - Variant49207, - Variant49208, - Variant49209, - Variant49210, - Variant49211, - Variant49212, - Variant49213, - Variant49214, - Variant49215, - Variant49216, - Variant49217, - Variant49218, - Variant49219, - Variant49220, - Variant49221, - Variant49222, - Variant49223, - Variant49224, - Variant49225, - Variant49226, - Variant49227, - Variant49228, - Variant49229, - Variant49230, - Variant49231, - Variant49232, - Variant49233, - Variant49234, - Variant49235, - Variant49236, - Variant49237, - Variant49238, - Variant49239, - Variant49240, - Variant49241, - Variant49242, - Variant49243, - Variant49244, - Variant49245, - Variant49246, - Variant49247, - Variant49248, - Variant49249, - Variant49250, - Variant49251, - Variant49252, - Variant49253, - Variant49254, - Variant49255, - Variant49256, - Variant49257, - Variant49258, - Variant49259, - Variant49260, - Variant49261, - Variant49262, - Variant49263, - Variant49264, - Variant49265, - Variant49266, - Variant49267, - Variant49268, - Variant49269, - Variant49270, - Variant49271, - Variant49272, - Variant49273, - Variant49274, - Variant49275, - Variant49276, - Variant49277, - Variant49278, - Variant49279, - Variant49280, - Variant49281, - Variant49282, - Variant49283, - Variant49284, - Variant49285, - Variant49286, - Variant49287, - Variant49288, - Variant49289, - Variant49290, - Variant49291, - Variant49292, - Variant49293, - Variant49294, - Variant49295, - Variant49296, - Variant49297, - Variant49298, - Variant49299, - Variant49300, - Variant49301, - Variant49302, - Variant49303, - Variant49304, - Variant49305, - Variant49306, - Variant49307, - Variant49308, - Variant49309, - Variant49310, - Variant49311, - Variant49312, - Variant49313, - Variant49314, - Variant49315, - Variant49316, - Variant49317, - Variant49318, - Variant49319, - Variant49320, - Variant49321, - Variant49322, - Variant49323, - Variant49324, - Variant49325, - Variant49326, - Variant49327, - Variant49328, - Variant49329, - Variant49330, - Variant49331, - Variant49332, - Variant49333, - Variant49334, - Variant49335, - Variant49336, - Variant49337, - Variant49338, - Variant49339, - Variant49340, - Variant49341, - Variant49342, - Variant49343, - Variant49344, - Variant49345, - Variant49346, - Variant49347, - Variant49348, - Variant49349, - Variant49350, - Variant49351, - Variant49352, - Variant49353, - Variant49354, - Variant49355, - Variant49356, - Variant49357, - Variant49358, - Variant49359, - Variant49360, - Variant49361, - Variant49362, - Variant49363, - Variant49364, - Variant49365, - Variant49366, - Variant49367, - Variant49368, - Variant49369, - Variant49370, - Variant49371, - Variant49372, - Variant49373, - Variant49374, - Variant49375, - Variant49376, - Variant49377, - Variant49378, - Variant49379, - Variant49380, - Variant49381, - Variant49382, - Variant49383, - Variant49384, - Variant49385, - Variant49386, - Variant49387, - Variant49388, - Variant49389, - Variant49390, - Variant49391, - Variant49392, - Variant49393, - Variant49394, - Variant49395, - Variant49396, - Variant49397, - Variant49398, - Variant49399, - Variant49400, - Variant49401, - Variant49402, - Variant49403, - Variant49404, - Variant49405, - Variant49406, - Variant49407, - Variant49408, - Variant49409, - Variant49410, - Variant49411, - Variant49412, - Variant49413, - Variant49414, - Variant49415, - Variant49416, - Variant49417, - Variant49418, - Variant49419, - Variant49420, - Variant49421, - Variant49422, - Variant49423, - Variant49424, - Variant49425, - Variant49426, - Variant49427, - Variant49428, - Variant49429, - Variant49430, - Variant49431, - Variant49432, - Variant49433, - Variant49434, - Variant49435, - Variant49436, - Variant49437, - Variant49438, - Variant49439, - Variant49440, - Variant49441, - Variant49442, - Variant49443, - Variant49444, - Variant49445, - Variant49446, - Variant49447, - Variant49448, - Variant49449, - Variant49450, - Variant49451, - Variant49452, - Variant49453, - Variant49454, - Variant49455, - Variant49456, - Variant49457, - Variant49458, - Variant49459, - Variant49460, - Variant49461, - Variant49462, - Variant49463, - Variant49464, - Variant49465, - Variant49466, - Variant49467, - Variant49468, - Variant49469, - Variant49470, - Variant49471, - Variant49472, - Variant49473, - Variant49474, - Variant49475, - Variant49476, - Variant49477, - Variant49478, - Variant49479, - Variant49480, - Variant49481, - Variant49482, - Variant49483, - Variant49484, - Variant49485, - Variant49486, - Variant49487, - Variant49488, - Variant49489, - Variant49490, - Variant49491, - Variant49492, - Variant49493, - Variant49494, - Variant49495, - Variant49496, - Variant49497, - Variant49498, - Variant49499, - Variant49500, - Variant49501, - Variant49502, - Variant49503, - Variant49504, - Variant49505, - Variant49506, - Variant49507, - Variant49508, - Variant49509, - Variant49510, - Variant49511, - Variant49512, - Variant49513, - Variant49514, - Variant49515, - Variant49516, - Variant49517, - Variant49518, - Variant49519, - Variant49520, - Variant49521, - Variant49522, - Variant49523, - Variant49524, - Variant49525, - Variant49526, - Variant49527, - Variant49528, - Variant49529, - Variant49530, - Variant49531, - Variant49532, - Variant49533, - Variant49534, - Variant49535, - Variant49536, - Variant49537, - Variant49538, - Variant49539, - Variant49540, - Variant49541, - Variant49542, - Variant49543, - Variant49544, - Variant49545, - Variant49546, - Variant49547, - Variant49548, - Variant49549, - Variant49550, - Variant49551, - Variant49552, - Variant49553, - Variant49554, - Variant49555, - Variant49556, - Variant49557, - Variant49558, - Variant49559, - Variant49560, - Variant49561, - Variant49562, - Variant49563, - Variant49564, - Variant49565, - Variant49566, - Variant49567, - Variant49568, - Variant49569, - Variant49570, - Variant49571, - Variant49572, - Variant49573, - Variant49574, - Variant49575, - Variant49576, - Variant49577, - Variant49578, - Variant49579, - Variant49580, - Variant49581, - Variant49582, - Variant49583, - Variant49584, - Variant49585, - Variant49586, - Variant49587, - Variant49588, - Variant49589, - Variant49590, - Variant49591, - Variant49592, - Variant49593, - Variant49594, - Variant49595, - Variant49596, - Variant49597, - Variant49598, - Variant49599, - Variant49600, - Variant49601, - Variant49602, - Variant49603, - Variant49604, - Variant49605, - Variant49606, - Variant49607, - Variant49608, - Variant49609, - Variant49610, - Variant49611, - Variant49612, - Variant49613, - Variant49614, - Variant49615, - Variant49616, - Variant49617, - Variant49618, - Variant49619, - Variant49620, - Variant49621, - Variant49622, - Variant49623, - Variant49624, - Variant49625, - Variant49626, - Variant49627, - Variant49628, - Variant49629, - Variant49630, - Variant49631, - Variant49632, - Variant49633, - Variant49634, - Variant49635, - Variant49636, - Variant49637, - Variant49638, - Variant49639, - Variant49640, - Variant49641, - Variant49642, - Variant49643, - Variant49644, - Variant49645, - Variant49646, - Variant49647, - Variant49648, - Variant49649, - Variant49650, - Variant49651, - Variant49652, - Variant49653, - Variant49654, - Variant49655, - Variant49656, - Variant49657, - Variant49658, - Variant49659, - Variant49660, - Variant49661, - Variant49662, - Variant49663, - Variant49664, - Variant49665, - Variant49666, - Variant49667, - Variant49668, - Variant49669, - Variant49670, - Variant49671, - Variant49672, - Variant49673, - Variant49674, - Variant49675, - Variant49676, - Variant49677, - Variant49678, - Variant49679, - Variant49680, - Variant49681, - Variant49682, - Variant49683, - Variant49684, - Variant49685, - Variant49686, - Variant49687, - Variant49688, - Variant49689, - Variant49690, - Variant49691, - Variant49692, - Variant49693, - Variant49694, - Variant49695, - Variant49696, - Variant49697, - Variant49698, - Variant49699, - Variant49700, - Variant49701, - Variant49702, - Variant49703, - Variant49704, - Variant49705, - Variant49706, - Variant49707, - Variant49708, - Variant49709, - Variant49710, - Variant49711, - Variant49712, - Variant49713, - Variant49714, - Variant49715, - Variant49716, - Variant49717, - Variant49718, - Variant49719, - Variant49720, - Variant49721, - Variant49722, - Variant49723, - Variant49724, - Variant49725, - Variant49726, - Variant49727, - Variant49728, - Variant49729, - Variant49730, - Variant49731, - Variant49732, - Variant49733, - Variant49734, - Variant49735, - Variant49736, - Variant49737, - Variant49738, - Variant49739, - Variant49740, - Variant49741, - Variant49742, - Variant49743, - Variant49744, - Variant49745, - Variant49746, - Variant49747, - Variant49748, - Variant49749, - Variant49750, - Variant49751, - Variant49752, - Variant49753, - Variant49754, - Variant49755, - Variant49756, - Variant49757, - Variant49758, - Variant49759, - Variant49760, - Variant49761, - Variant49762, - Variant49763, - Variant49764, - Variant49765, - Variant49766, - Variant49767, - Variant49768, - Variant49769, - Variant49770, - Variant49771, - Variant49772, - Variant49773, - Variant49774, - Variant49775, - Variant49776, - Variant49777, - Variant49778, - Variant49779, - Variant49780, - Variant49781, - Variant49782, - Variant49783, - Variant49784, - Variant49785, - Variant49786, - Variant49787, - Variant49788, - Variant49789, - Variant49790, - Variant49791, - Variant49792, - Variant49793, - Variant49794, - Variant49795, - Variant49796, - Variant49797, - Variant49798, - Variant49799, - Variant49800, - Variant49801, - Variant49802, - Variant49803, - Variant49804, - Variant49805, - Variant49806, - Variant49807, - Variant49808, - Variant49809, - Variant49810, - Variant49811, - Variant49812, - Variant49813, - Variant49814, - Variant49815, - Variant49816, - Variant49817, - Variant49818, - Variant49819, - Variant49820, - Variant49821, - Variant49822, - Variant49823, - Variant49824, - Variant49825, - Variant49826, - Variant49827, - Variant49828, - Variant49829, - Variant49830, - Variant49831, - Variant49832, - Variant49833, - Variant49834, - Variant49835, - Variant49836, - Variant49837, - Variant49838, - Variant49839, - Variant49840, - Variant49841, - Variant49842, - Variant49843, - Variant49844, - Variant49845, - Variant49846, - Variant49847, - Variant49848, - Variant49849, - Variant49850, - Variant49851, - Variant49852, - Variant49853, - Variant49854, - Variant49855, - Variant49856, - Variant49857, - Variant49858, - Variant49859, - Variant49860, - Variant49861, - Variant49862, - Variant49863, - Variant49864, - Variant49865, - Variant49866, - Variant49867, - Variant49868, - Variant49869, - Variant49870, - Variant49871, - Variant49872, - Variant49873, - Variant49874, - Variant49875, - Variant49876, - Variant49877, - Variant49878, - Variant49879, - Variant49880, - Variant49881, - Variant49882, - Variant49883, - Variant49884, - Variant49885, - Variant49886, - Variant49887, - Variant49888, - Variant49889, - Variant49890, - Variant49891, - Variant49892, - Variant49893, - Variant49894, - Variant49895, - Variant49896, - Variant49897, - Variant49898, - Variant49899, - Variant49900, - Variant49901, - Variant49902, - Variant49903, - Variant49904, - Variant49905, - Variant49906, - Variant49907, - Variant49908, - Variant49909, - Variant49910, - Variant49911, - Variant49912, - Variant49913, - Variant49914, - Variant49915, - Variant49916, - Variant49917, - Variant49918, - Variant49919, - Variant49920, - Variant49921, - Variant49922, - Variant49923, - Variant49924, - Variant49925, - Variant49926, - Variant49927, - Variant49928, - Variant49929, - Variant49930, - Variant49931, - Variant49932, - Variant49933, - Variant49934, - Variant49935, - Variant49936, - Variant49937, - Variant49938, - Variant49939, - Variant49940, - Variant49941, - Variant49942, - Variant49943, - Variant49944, - Variant49945, - Variant49946, - Variant49947, - Variant49948, - Variant49949, - Variant49950, - Variant49951, - Variant49952, - Variant49953, - Variant49954, - Variant49955, - Variant49956, - Variant49957, - Variant49958, - Variant49959, - Variant49960, - Variant49961, - Variant49962, - Variant49963, - Variant49964, - Variant49965, - Variant49966, - Variant49967, - Variant49968, - Variant49969, - Variant49970, - Variant49971, - Variant49972, - Variant49973, - Variant49974, - Variant49975, - Variant49976, - Variant49977, - Variant49978, - Variant49979, - Variant49980, - Variant49981, - Variant49982, - Variant49983, - Variant49984, - Variant49985, - Variant49986, - Variant49987, - Variant49988, - Variant49989, - Variant49990, - Variant49991, - Variant49992, - Variant49993, - Variant49994, - Variant49995, - Variant49996, - Variant49997, - Variant49998, - Variant49999, - Variant50000, - Variant50001, - Variant50002, - Variant50003, - Variant50004, - Variant50005, - Variant50006, - Variant50007, - Variant50008, - Variant50009, - Variant50010, - Variant50011, - Variant50012, - Variant50013, - Variant50014, - Variant50015, - Variant50016, - Variant50017, - Variant50018, - Variant50019, - Variant50020, - Variant50021, - Variant50022, - Variant50023, - Variant50024, - Variant50025, - Variant50026, - Variant50027, - Variant50028, - Variant50029, - Variant50030, - Variant50031, - Variant50032, - Variant50033, - Variant50034, - Variant50035, - Variant50036, - Variant50037, - Variant50038, - Variant50039, - Variant50040, - Variant50041, - Variant50042, - Variant50043, - Variant50044, - Variant50045, - Variant50046, - Variant50047, - Variant50048, - Variant50049, - Variant50050, - Variant50051, - Variant50052, - Variant50053, - Variant50054, - Variant50055, - Variant50056, - Variant50057, - Variant50058, - Variant50059, - Variant50060, - Variant50061, - Variant50062, - Variant50063, - Variant50064, - Variant50065, - Variant50066, - Variant50067, - Variant50068, - Variant50069, - Variant50070, - Variant50071, - Variant50072, - Variant50073, - Variant50074, - Variant50075, - Variant50076, - Variant50077, - Variant50078, - Variant50079, - Variant50080, - Variant50081, - Variant50082, - Variant50083, - Variant50084, - Variant50085, - Variant50086, - Variant50087, - Variant50088, - Variant50089, - Variant50090, - Variant50091, - Variant50092, - Variant50093, - Variant50094, - Variant50095, - Variant50096, - Variant50097, - Variant50098, - Variant50099, - Variant50100, - Variant50101, - Variant50102, - Variant50103, - Variant50104, - Variant50105, - Variant50106, - Variant50107, - Variant50108, - Variant50109, - Variant50110, - Variant50111, - Variant50112, - Variant50113, - Variant50114, - Variant50115, - Variant50116, - Variant50117, - Variant50118, - Variant50119, - Variant50120, - Variant50121, - Variant50122, - Variant50123, - Variant50124, - Variant50125, - Variant50126, - Variant50127, - Variant50128, - Variant50129, - Variant50130, - Variant50131, - Variant50132, - Variant50133, - Variant50134, - Variant50135, - Variant50136, - Variant50137, - Variant50138, - Variant50139, - Variant50140, - Variant50141, - Variant50142, - Variant50143, - Variant50144, - Variant50145, - Variant50146, - Variant50147, - Variant50148, - Variant50149, - Variant50150, - Variant50151, - Variant50152, - Variant50153, - Variant50154, - Variant50155, - Variant50156, - Variant50157, - Variant50158, - Variant50159, - Variant50160, - Variant50161, - Variant50162, - Variant50163, - Variant50164, - Variant50165, - Variant50166, - Variant50167, - Variant50168, - Variant50169, - Variant50170, - Variant50171, - Variant50172, - Variant50173, - Variant50174, - Variant50175, - Variant50176, - Variant50177, - Variant50178, - Variant50179, - Variant50180, - Variant50181, - Variant50182, - Variant50183, - Variant50184, - Variant50185, - Variant50186, - Variant50187, - Variant50188, - Variant50189, - Variant50190, - Variant50191, - Variant50192, - Variant50193, - Variant50194, - Variant50195, - Variant50196, - Variant50197, - Variant50198, - Variant50199, - Variant50200, - Variant50201, - Variant50202, - Variant50203, - Variant50204, - Variant50205, - Variant50206, - Variant50207, - Variant50208, - Variant50209, - Variant50210, - Variant50211, - Variant50212, - Variant50213, - Variant50214, - Variant50215, - Variant50216, - Variant50217, - Variant50218, - Variant50219, - Variant50220, - Variant50221, - Variant50222, - Variant50223, - Variant50224, - Variant50225, - Variant50226, - Variant50227, - Variant50228, - Variant50229, - Variant50230, - Variant50231, - Variant50232, - Variant50233, - Variant50234, - Variant50235, - Variant50236, - Variant50237, - Variant50238, - Variant50239, - Variant50240, - Variant50241, - Variant50242, - Variant50243, - Variant50244, - Variant50245, - Variant50246, - Variant50247, - Variant50248, - Variant50249, - Variant50250, - Variant50251, - Variant50252, - Variant50253, - Variant50254, - Variant50255, - Variant50256, - Variant50257, - Variant50258, - Variant50259, - Variant50260, - Variant50261, - Variant50262, - Variant50263, - Variant50264, - Variant50265, - Variant50266, - Variant50267, - Variant50268, - Variant50269, - Variant50270, - Variant50271, - Variant50272, - Variant50273, - Variant50274, - Variant50275, - Variant50276, - Variant50277, - Variant50278, - Variant50279, - Variant50280, - Variant50281, - Variant50282, - Variant50283, - Variant50284, - Variant50285, - Variant50286, - Variant50287, - Variant50288, - Variant50289, - Variant50290, - Variant50291, - Variant50292, - Variant50293, - Variant50294, - Variant50295, - Variant50296, - Variant50297, - Variant50298, - Variant50299, - Variant50300, - Variant50301, - Variant50302, - Variant50303, - Variant50304, - Variant50305, - Variant50306, - Variant50307, - Variant50308, - Variant50309, - Variant50310, - Variant50311, - Variant50312, - Variant50313, - Variant50314, - Variant50315, - Variant50316, - Variant50317, - Variant50318, - Variant50319, - Variant50320, - Variant50321, - Variant50322, - Variant50323, - Variant50324, - Variant50325, - Variant50326, - Variant50327, - Variant50328, - Variant50329, - Variant50330, - Variant50331, - Variant50332, - Variant50333, - Variant50334, - Variant50335, - Variant50336, - Variant50337, - Variant50338, - Variant50339, - Variant50340, - Variant50341, - Variant50342, - Variant50343, - Variant50344, - Variant50345, - Variant50346, - Variant50347, - Variant50348, - Variant50349, - Variant50350, - Variant50351, - Variant50352, - Variant50353, - Variant50354, - Variant50355, - Variant50356, - Variant50357, - Variant50358, - Variant50359, - Variant50360, - Variant50361, - Variant50362, - Variant50363, - Variant50364, - Variant50365, - Variant50366, - Variant50367, - Variant50368, - Variant50369, - Variant50370, - Variant50371, - Variant50372, - Variant50373, - Variant50374, - Variant50375, - Variant50376, - Variant50377, - Variant50378, - Variant50379, - Variant50380, - Variant50381, - Variant50382, - Variant50383, - Variant50384, - Variant50385, - Variant50386, - Variant50387, - Variant50388, - Variant50389, - Variant50390, - Variant50391, - Variant50392, - Variant50393, - Variant50394, - Variant50395, - Variant50396, - Variant50397, - Variant50398, - Variant50399, - Variant50400, - Variant50401, - Variant50402, - Variant50403, - Variant50404, - Variant50405, - Variant50406, - Variant50407, - Variant50408, - Variant50409, - Variant50410, - Variant50411, - Variant50412, - Variant50413, - Variant50414, - Variant50415, - Variant50416, - Variant50417, - Variant50418, - Variant50419, - Variant50420, - Variant50421, - Variant50422, - Variant50423, - Variant50424, - Variant50425, - Variant50426, - Variant50427, - Variant50428, - Variant50429, - Variant50430, - Variant50431, - Variant50432, - Variant50433, - Variant50434, - Variant50435, - Variant50436, - Variant50437, - Variant50438, - Variant50439, - Variant50440, - Variant50441, - Variant50442, - Variant50443, - Variant50444, - Variant50445, - Variant50446, - Variant50447, - Variant50448, - Variant50449, - Variant50450, - Variant50451, - Variant50452, - Variant50453, - Variant50454, - Variant50455, - Variant50456, - Variant50457, - Variant50458, - Variant50459, - Variant50460, - Variant50461, - Variant50462, - Variant50463, - Variant50464, - Variant50465, - Variant50466, - Variant50467, - Variant50468, - Variant50469, - Variant50470, - Variant50471, - Variant50472, - Variant50473, - Variant50474, - Variant50475, - Variant50476, - Variant50477, - Variant50478, - Variant50479, - Variant50480, - Variant50481, - Variant50482, - Variant50483, - Variant50484, - Variant50485, - Variant50486, - Variant50487, - Variant50488, - Variant50489, - Variant50490, - Variant50491, - Variant50492, - Variant50493, - Variant50494, - Variant50495, - Variant50496, - Variant50497, - Variant50498, - Variant50499, - Variant50500, - Variant50501, - Variant50502, - Variant50503, - Variant50504, - Variant50505, - Variant50506, - Variant50507, - Variant50508, - Variant50509, - Variant50510, - Variant50511, - Variant50512, - Variant50513, - Variant50514, - Variant50515, - Variant50516, - Variant50517, - Variant50518, - Variant50519, - Variant50520, - Variant50521, - Variant50522, - Variant50523, - Variant50524, - Variant50525, - Variant50526, - Variant50527, - Variant50528, - Variant50529, - Variant50530, - Variant50531, - Variant50532, - Variant50533, - Variant50534, - Variant50535, - Variant50536, - Variant50537, - Variant50538, - Variant50539, - Variant50540, - Variant50541, - Variant50542, - Variant50543, - Variant50544, - Variant50545, - Variant50546, - Variant50547, - Variant50548, - Variant50549, - Variant50550, - Variant50551, - Variant50552, - Variant50553, - Variant50554, - Variant50555, - Variant50556, - Variant50557, - Variant50558, - Variant50559, - Variant50560, - Variant50561, - Variant50562, - Variant50563, - Variant50564, - Variant50565, - Variant50566, - Variant50567, - Variant50568, - Variant50569, - Variant50570, - Variant50571, - Variant50572, - Variant50573, - Variant50574, - Variant50575, - Variant50576, - Variant50577, - Variant50578, - Variant50579, - Variant50580, - Variant50581, - Variant50582, - Variant50583, - Variant50584, - Variant50585, - Variant50586, - Variant50587, - Variant50588, - Variant50589, - Variant50590, - Variant50591, - Variant50592, - Variant50593, - Variant50594, - Variant50595, - Variant50596, - Variant50597, - Variant50598, - Variant50599, - Variant50600, - Variant50601, - Variant50602, - Variant50603, - Variant50604, - Variant50605, - Variant50606, - Variant50607, - Variant50608, - Variant50609, - Variant50610, - Variant50611, - Variant50612, - Variant50613, - Variant50614, - Variant50615, - Variant50616, - Variant50617, - Variant50618, - Variant50619, - Variant50620, - Variant50621, - Variant50622, - Variant50623, - Variant50624, - Variant50625, - Variant50626, - Variant50627, - Variant50628, - Variant50629, - Variant50630, - Variant50631, - Variant50632, - Variant50633, - Variant50634, - Variant50635, - Variant50636, - Variant50637, - Variant50638, - Variant50639, - Variant50640, - Variant50641, - Variant50642, - Variant50643, - Variant50644, - Variant50645, - Variant50646, - Variant50647, - Variant50648, - Variant50649, - Variant50650, - Variant50651, - Variant50652, - Variant50653, - Variant50654, - Variant50655, - Variant50656, - Variant50657, - Variant50658, - Variant50659, - Variant50660, - Variant50661, - Variant50662, - Variant50663, - Variant50664, - Variant50665, - Variant50666, - Variant50667, - Variant50668, - Variant50669, - Variant50670, - Variant50671, - Variant50672, - Variant50673, - Variant50674, - Variant50675, - Variant50676, - Variant50677, - Variant50678, - Variant50679, - Variant50680, - Variant50681, - Variant50682, - Variant50683, - Variant50684, - Variant50685, - Variant50686, - Variant50687, - Variant50688, - Variant50689, - Variant50690, - Variant50691, - Variant50692, - Variant50693, - Variant50694, - Variant50695, - Variant50696, - Variant50697, - Variant50698, - Variant50699, - Variant50700, - Variant50701, - Variant50702, - Variant50703, - Variant50704, - Variant50705, - Variant50706, - Variant50707, - Variant50708, - Variant50709, - Variant50710, - Variant50711, - Variant50712, - Variant50713, - Variant50714, - Variant50715, - Variant50716, - Variant50717, - Variant50718, - Variant50719, - Variant50720, - Variant50721, - Variant50722, - Variant50723, - Variant50724, - Variant50725, - Variant50726, - Variant50727, - Variant50728, - Variant50729, - Variant50730, - Variant50731, - Variant50732, - Variant50733, - Variant50734, - Variant50735, - Variant50736, - Variant50737, - Variant50738, - Variant50739, - Variant50740, - Variant50741, - Variant50742, - Variant50743, - Variant50744, - Variant50745, - Variant50746, - Variant50747, - Variant50748, - Variant50749, - Variant50750, - Variant50751, - Variant50752, - Variant50753, - Variant50754, - Variant50755, - Variant50756, - Variant50757, - Variant50758, - Variant50759, - Variant50760, - Variant50761, - Variant50762, - Variant50763, - Variant50764, - Variant50765, - Variant50766, - Variant50767, - Variant50768, - Variant50769, - Variant50770, - Variant50771, - Variant50772, - Variant50773, - Variant50774, - Variant50775, - Variant50776, - Variant50777, - Variant50778, - Variant50779, - Variant50780, - Variant50781, - Variant50782, - Variant50783, - Variant50784, - Variant50785, - Variant50786, - Variant50787, - Variant50788, - Variant50789, - Variant50790, - Variant50791, - Variant50792, - Variant50793, - Variant50794, - Variant50795, - Variant50796, - Variant50797, - Variant50798, - Variant50799, - Variant50800, - Variant50801, - Variant50802, - Variant50803, - Variant50804, - Variant50805, - Variant50806, - Variant50807, - Variant50808, - Variant50809, - Variant50810, - Variant50811, - Variant50812, - Variant50813, - Variant50814, - Variant50815, - Variant50816, - Variant50817, - Variant50818, - Variant50819, - Variant50820, - Variant50821, - Variant50822, - Variant50823, - Variant50824, - Variant50825, - Variant50826, - Variant50827, - Variant50828, - Variant50829, - Variant50830, - Variant50831, - Variant50832, - Variant50833, - Variant50834, - Variant50835, - Variant50836, - Variant50837, - Variant50838, - Variant50839, - Variant50840, - Variant50841, - Variant50842, - Variant50843, - Variant50844, - Variant50845, - Variant50846, - Variant50847, - Variant50848, - Variant50849, - Variant50850, - Variant50851, - Variant50852, - Variant50853, - Variant50854, - Variant50855, - Variant50856, - Variant50857, - Variant50858, - Variant50859, - Variant50860, - Variant50861, - Variant50862, - Variant50863, - Variant50864, - Variant50865, - Variant50866, - Variant50867, - Variant50868, - Variant50869, - Variant50870, - Variant50871, - Variant50872, - Variant50873, - Variant50874, - Variant50875, - Variant50876, - Variant50877, - Variant50878, - Variant50879, - Variant50880, - Variant50881, - Variant50882, - Variant50883, - Variant50884, - Variant50885, - Variant50886, - Variant50887, - Variant50888, - Variant50889, - Variant50890, - Variant50891, - Variant50892, - Variant50893, - Variant50894, - Variant50895, - Variant50896, - Variant50897, - Variant50898, - Variant50899, - Variant50900, - Variant50901, - Variant50902, - Variant50903, - Variant50904, - Variant50905, - Variant50906, - Variant50907, - Variant50908, - Variant50909, - Variant50910, - Variant50911, - Variant50912, - Variant50913, - Variant50914, - Variant50915, - Variant50916, - Variant50917, - Variant50918, - Variant50919, - Variant50920, - Variant50921, - Variant50922, - Variant50923, - Variant50924, - Variant50925, - Variant50926, - Variant50927, - Variant50928, - Variant50929, - Variant50930, - Variant50931, - Variant50932, - Variant50933, - Variant50934, - Variant50935, - Variant50936, - Variant50937, - Variant50938, - Variant50939, - Variant50940, - Variant50941, - Variant50942, - Variant50943, - Variant50944, - Variant50945, - Variant50946, - Variant50947, - Variant50948, - Variant50949, - Variant50950, - Variant50951, - Variant50952, - Variant50953, - Variant50954, - Variant50955, - Variant50956, - Variant50957, - Variant50958, - Variant50959, - Variant50960, - Variant50961, - Variant50962, - Variant50963, - Variant50964, - Variant50965, - Variant50966, - Variant50967, - Variant50968, - Variant50969, - Variant50970, - Variant50971, - Variant50972, - Variant50973, - Variant50974, - Variant50975, - Variant50976, - Variant50977, - Variant50978, - Variant50979, - Variant50980, - Variant50981, - Variant50982, - Variant50983, - Variant50984, - Variant50985, - Variant50986, - Variant50987, - Variant50988, - Variant50989, - Variant50990, - Variant50991, - Variant50992, - Variant50993, - Variant50994, - Variant50995, - Variant50996, - Variant50997, - Variant50998, - Variant50999, - Variant51000, - Variant51001, - Variant51002, - Variant51003, - Variant51004, - Variant51005, - Variant51006, - Variant51007, - Variant51008, - Variant51009, - Variant51010, - Variant51011, - Variant51012, - Variant51013, - Variant51014, - Variant51015, - Variant51016, - Variant51017, - Variant51018, - Variant51019, - Variant51020, - Variant51021, - Variant51022, - Variant51023, - Variant51024, - Variant51025, - Variant51026, - Variant51027, - Variant51028, - Variant51029, - Variant51030, - Variant51031, - Variant51032, - Variant51033, - Variant51034, - Variant51035, - Variant51036, - Variant51037, - Variant51038, - Variant51039, - Variant51040, - Variant51041, - Variant51042, - Variant51043, - Variant51044, - Variant51045, - Variant51046, - Variant51047, - Variant51048, - Variant51049, - Variant51050, - Variant51051, - Variant51052, - Variant51053, - Variant51054, - Variant51055, - Variant51056, - Variant51057, - Variant51058, - Variant51059, - Variant51060, - Variant51061, - Variant51062, - Variant51063, - Variant51064, - Variant51065, - Variant51066, - Variant51067, - Variant51068, - Variant51069, - Variant51070, - Variant51071, - Variant51072, - Variant51073, - Variant51074, - Variant51075, - Variant51076, - Variant51077, - Variant51078, - Variant51079, - Variant51080, - Variant51081, - Variant51082, - Variant51083, - Variant51084, - Variant51085, - Variant51086, - Variant51087, - Variant51088, - Variant51089, - Variant51090, - Variant51091, - Variant51092, - Variant51093, - Variant51094, - Variant51095, - Variant51096, - Variant51097, - Variant51098, - Variant51099, - Variant51100, - Variant51101, - Variant51102, - Variant51103, - Variant51104, - Variant51105, - Variant51106, - Variant51107, - Variant51108, - Variant51109, - Variant51110, - Variant51111, - Variant51112, - Variant51113, - Variant51114, - Variant51115, - Variant51116, - Variant51117, - Variant51118, - Variant51119, - Variant51120, - Variant51121, - Variant51122, - Variant51123, - Variant51124, - Variant51125, - Variant51126, - Variant51127, - Variant51128, - Variant51129, - Variant51130, - Variant51131, - Variant51132, - Variant51133, - Variant51134, - Variant51135, - Variant51136, - Variant51137, - Variant51138, - Variant51139, - Variant51140, - Variant51141, - Variant51142, - Variant51143, - Variant51144, - Variant51145, - Variant51146, - Variant51147, - Variant51148, - Variant51149, - Variant51150, - Variant51151, - Variant51152, - Variant51153, - Variant51154, - Variant51155, - Variant51156, - Variant51157, - Variant51158, - Variant51159, - Variant51160, - Variant51161, - Variant51162, - Variant51163, - Variant51164, - Variant51165, - Variant51166, - Variant51167, - Variant51168, - Variant51169, - Variant51170, - Variant51171, - Variant51172, - Variant51173, - Variant51174, - Variant51175, - Variant51176, - Variant51177, - Variant51178, - Variant51179, - Variant51180, - Variant51181, - Variant51182, - Variant51183, - Variant51184, - Variant51185, - Variant51186, - Variant51187, - Variant51188, - Variant51189, - Variant51190, - Variant51191, - Variant51192, - Variant51193, - Variant51194, - Variant51195, - Variant51196, - Variant51197, - Variant51198, - Variant51199, - Variant51200, - Variant51201, - Variant51202, - Variant51203, - Variant51204, - Variant51205, - Variant51206, - Variant51207, - Variant51208, - Variant51209, - Variant51210, - Variant51211, - Variant51212, - Variant51213, - Variant51214, - Variant51215, - Variant51216, - Variant51217, - Variant51218, - Variant51219, - Variant51220, - Variant51221, - Variant51222, - Variant51223, - Variant51224, - Variant51225, - Variant51226, - Variant51227, - Variant51228, - Variant51229, - Variant51230, - Variant51231, - Variant51232, - Variant51233, - Variant51234, - Variant51235, - Variant51236, - Variant51237, - Variant51238, - Variant51239, - Variant51240, - Variant51241, - Variant51242, - Variant51243, - Variant51244, - Variant51245, - Variant51246, - Variant51247, - Variant51248, - Variant51249, - Variant51250, - Variant51251, - Variant51252, - Variant51253, - Variant51254, - Variant51255, - Variant51256, - Variant51257, - Variant51258, - Variant51259, - Variant51260, - Variant51261, - Variant51262, - Variant51263, - Variant51264, - Variant51265, - Variant51266, - Variant51267, - Variant51268, - Variant51269, - Variant51270, - Variant51271, - Variant51272, - Variant51273, - Variant51274, - Variant51275, - Variant51276, - Variant51277, - Variant51278, - Variant51279, - Variant51280, - Variant51281, - Variant51282, - Variant51283, - Variant51284, - Variant51285, - Variant51286, - Variant51287, - Variant51288, - Variant51289, - Variant51290, - Variant51291, - Variant51292, - Variant51293, - Variant51294, - Variant51295, - Variant51296, - Variant51297, - Variant51298, - Variant51299, - Variant51300, - Variant51301, - Variant51302, - Variant51303, - Variant51304, - Variant51305, - Variant51306, - Variant51307, - Variant51308, - Variant51309, - Variant51310, - Variant51311, - Variant51312, - Variant51313, - Variant51314, - Variant51315, - Variant51316, - Variant51317, - Variant51318, - Variant51319, - Variant51320, - Variant51321, - Variant51322, - Variant51323, - Variant51324, - Variant51325, - Variant51326, - Variant51327, - Variant51328, - Variant51329, - Variant51330, - Variant51331, - Variant51332, - Variant51333, - Variant51334, - Variant51335, - Variant51336, - Variant51337, - Variant51338, - Variant51339, - Variant51340, - Variant51341, - Variant51342, - Variant51343, - Variant51344, - Variant51345, - Variant51346, - Variant51347, - Variant51348, - Variant51349, - Variant51350, - Variant51351, - Variant51352, - Variant51353, - Variant51354, - Variant51355, - Variant51356, - Variant51357, - Variant51358, - Variant51359, - Variant51360, - Variant51361, - Variant51362, - Variant51363, - Variant51364, - Variant51365, - Variant51366, - Variant51367, - Variant51368, - Variant51369, - Variant51370, - Variant51371, - Variant51372, - Variant51373, - Variant51374, - Variant51375, - Variant51376, - Variant51377, - Variant51378, - Variant51379, - Variant51380, - Variant51381, - Variant51382, - Variant51383, - Variant51384, - Variant51385, - Variant51386, - Variant51387, - Variant51388, - Variant51389, - Variant51390, - Variant51391, - Variant51392, - Variant51393, - Variant51394, - Variant51395, - Variant51396, - Variant51397, - Variant51398, - Variant51399, - Variant51400, - Variant51401, - Variant51402, - Variant51403, - Variant51404, - Variant51405, - Variant51406, - Variant51407, - Variant51408, - Variant51409, - Variant51410, - Variant51411, - Variant51412, - Variant51413, - Variant51414, - Variant51415, - Variant51416, - Variant51417, - Variant51418, - Variant51419, - Variant51420, - Variant51421, - Variant51422, - Variant51423, - Variant51424, - Variant51425, - Variant51426, - Variant51427, - Variant51428, - Variant51429, - Variant51430, - Variant51431, - Variant51432, - Variant51433, - Variant51434, - Variant51435, - Variant51436, - Variant51437, - Variant51438, - Variant51439, - Variant51440, - Variant51441, - Variant51442, - Variant51443, - Variant51444, - Variant51445, - Variant51446, - Variant51447, - Variant51448, - Variant51449, - Variant51450, - Variant51451, - Variant51452, - Variant51453, - Variant51454, - Variant51455, - Variant51456, - Variant51457, - Variant51458, - Variant51459, - Variant51460, - Variant51461, - Variant51462, - Variant51463, - Variant51464, - Variant51465, - Variant51466, - Variant51467, - Variant51468, - Variant51469, - Variant51470, - Variant51471, - Variant51472, - Variant51473, - Variant51474, - Variant51475, - Variant51476, - Variant51477, - Variant51478, - Variant51479, - Variant51480, - Variant51481, - Variant51482, - Variant51483, - Variant51484, - Variant51485, - Variant51486, - Variant51487, - Variant51488, - Variant51489, - Variant51490, - Variant51491, - Variant51492, - Variant51493, - Variant51494, - Variant51495, - Variant51496, - Variant51497, - Variant51498, - Variant51499, - Variant51500, - Variant51501, - Variant51502, - Variant51503, - Variant51504, - Variant51505, - Variant51506, - Variant51507, - Variant51508, - Variant51509, - Variant51510, - Variant51511, - Variant51512, - Variant51513, - Variant51514, - Variant51515, - Variant51516, - Variant51517, - Variant51518, - Variant51519, - Variant51520, - Variant51521, - Variant51522, - Variant51523, - Variant51524, - Variant51525, - Variant51526, - Variant51527, - Variant51528, - Variant51529, - Variant51530, - Variant51531, - Variant51532, - Variant51533, - Variant51534, - Variant51535, - Variant51536, - Variant51537, - Variant51538, - Variant51539, - Variant51540, - Variant51541, - Variant51542, - Variant51543, - Variant51544, - Variant51545, - Variant51546, - Variant51547, - Variant51548, - Variant51549, - Variant51550, - Variant51551, - Variant51552, - Variant51553, - Variant51554, - Variant51555, - Variant51556, - Variant51557, - Variant51558, - Variant51559, - Variant51560, - Variant51561, - Variant51562, - Variant51563, - Variant51564, - Variant51565, - Variant51566, - Variant51567, - Variant51568, - Variant51569, - Variant51570, - Variant51571, - Variant51572, - Variant51573, - Variant51574, - Variant51575, - Variant51576, - Variant51577, - Variant51578, - Variant51579, - Variant51580, - Variant51581, - Variant51582, - Variant51583, - Variant51584, - Variant51585, - Variant51586, - Variant51587, - Variant51588, - Variant51589, - Variant51590, - Variant51591, - Variant51592, - Variant51593, - Variant51594, - Variant51595, - Variant51596, - Variant51597, - Variant51598, - Variant51599, - Variant51600, - Variant51601, - Variant51602, - Variant51603, - Variant51604, - Variant51605, - Variant51606, - Variant51607, - Variant51608, - Variant51609, - Variant51610, - Variant51611, - Variant51612, - Variant51613, - Variant51614, - Variant51615, - Variant51616, - Variant51617, - Variant51618, - Variant51619, - Variant51620, - Variant51621, - Variant51622, - Variant51623, - Variant51624, - Variant51625, - Variant51626, - Variant51627, - Variant51628, - Variant51629, - Variant51630, - Variant51631, - Variant51632, - Variant51633, - Variant51634, - Variant51635, - Variant51636, - Variant51637, - Variant51638, - Variant51639, - Variant51640, - Variant51641, - Variant51642, - Variant51643, - Variant51644, - Variant51645, - Variant51646, - Variant51647, - Variant51648, - Variant51649, - Variant51650, - Variant51651, - Variant51652, - Variant51653, - Variant51654, - Variant51655, - Variant51656, - Variant51657, - Variant51658, - Variant51659, - Variant51660, - Variant51661, - Variant51662, - Variant51663, - Variant51664, - Variant51665, - Variant51666, - Variant51667, - Variant51668, - Variant51669, - Variant51670, - Variant51671, - Variant51672, - Variant51673, - Variant51674, - Variant51675, - Variant51676, - Variant51677, - Variant51678, - Variant51679, - Variant51680, - Variant51681, - Variant51682, - Variant51683, - Variant51684, - Variant51685, - Variant51686, - Variant51687, - Variant51688, - Variant51689, - Variant51690, - Variant51691, - Variant51692, - Variant51693, - Variant51694, - Variant51695, - Variant51696, - Variant51697, - Variant51698, - Variant51699, - Variant51700, - Variant51701, - Variant51702, - Variant51703, - Variant51704, - Variant51705, - Variant51706, - Variant51707, - Variant51708, - Variant51709, - Variant51710, - Variant51711, - Variant51712, - Variant51713, - Variant51714, - Variant51715, - Variant51716, - Variant51717, - Variant51718, - Variant51719, - Variant51720, - Variant51721, - Variant51722, - Variant51723, - Variant51724, - Variant51725, - Variant51726, - Variant51727, - Variant51728, - Variant51729, - Variant51730, - Variant51731, - Variant51732, - Variant51733, - Variant51734, - Variant51735, - Variant51736, - Variant51737, - Variant51738, - Variant51739, - Variant51740, - Variant51741, - Variant51742, - Variant51743, - Variant51744, - Variant51745, - Variant51746, - Variant51747, - Variant51748, - Variant51749, - Variant51750, - Variant51751, - Variant51752, - Variant51753, - Variant51754, - Variant51755, - Variant51756, - Variant51757, - Variant51758, - Variant51759, - Variant51760, - Variant51761, - Variant51762, - Variant51763, - Variant51764, - Variant51765, - Variant51766, - Variant51767, - Variant51768, - Variant51769, - Variant51770, - Variant51771, - Variant51772, - Variant51773, - Variant51774, - Variant51775, - Variant51776, - Variant51777, - Variant51778, - Variant51779, - Variant51780, - Variant51781, - Variant51782, - Variant51783, - Variant51784, - Variant51785, - Variant51786, - Variant51787, - Variant51788, - Variant51789, - Variant51790, - Variant51791, - Variant51792, - Variant51793, - Variant51794, - Variant51795, - Variant51796, - Variant51797, - Variant51798, - Variant51799, - Variant51800, - Variant51801, - Variant51802, - Variant51803, - Variant51804, - Variant51805, - Variant51806, - Variant51807, - Variant51808, - Variant51809, - Variant51810, - Variant51811, - Variant51812, - Variant51813, - Variant51814, - Variant51815, - Variant51816, - Variant51817, - Variant51818, - Variant51819, - Variant51820, - Variant51821, - Variant51822, - Variant51823, - Variant51824, - Variant51825, - Variant51826, - Variant51827, - Variant51828, - Variant51829, - Variant51830, - Variant51831, - Variant51832, - Variant51833, - Variant51834, - Variant51835, - Variant51836, - Variant51837, - Variant51838, - Variant51839, - Variant51840, - Variant51841, - Variant51842, - Variant51843, - Variant51844, - Variant51845, - Variant51846, - Variant51847, - Variant51848, - Variant51849, - Variant51850, - Variant51851, - Variant51852, - Variant51853, - Variant51854, - Variant51855, - Variant51856, - Variant51857, - Variant51858, - Variant51859, - Variant51860, - Variant51861, - Variant51862, - Variant51863, - Variant51864, - Variant51865, - Variant51866, - Variant51867, - Variant51868, - Variant51869, - Variant51870, - Variant51871, - Variant51872, - Variant51873, - Variant51874, - Variant51875, - Variant51876, - Variant51877, - Variant51878, - Variant51879, - Variant51880, - Variant51881, - Variant51882, - Variant51883, - Variant51884, - Variant51885, - Variant51886, - Variant51887, - Variant51888, - Variant51889, - Variant51890, - Variant51891, - Variant51892, - Variant51893, - Variant51894, - Variant51895, - Variant51896, - Variant51897, - Variant51898, - Variant51899, - Variant51900, - Variant51901, - Variant51902, - Variant51903, - Variant51904, - Variant51905, - Variant51906, - Variant51907, - Variant51908, - Variant51909, - Variant51910, - Variant51911, - Variant51912, - Variant51913, - Variant51914, - Variant51915, - Variant51916, - Variant51917, - Variant51918, - Variant51919, - Variant51920, - Variant51921, - Variant51922, - Variant51923, - Variant51924, - Variant51925, - Variant51926, - Variant51927, - Variant51928, - Variant51929, - Variant51930, - Variant51931, - Variant51932, - Variant51933, - Variant51934, - Variant51935, - Variant51936, - Variant51937, - Variant51938, - Variant51939, - Variant51940, - Variant51941, - Variant51942, - Variant51943, - Variant51944, - Variant51945, - Variant51946, - Variant51947, - Variant51948, - Variant51949, - Variant51950, - Variant51951, - Variant51952, - Variant51953, - Variant51954, - Variant51955, - Variant51956, - Variant51957, - Variant51958, - Variant51959, - Variant51960, - Variant51961, - Variant51962, - Variant51963, - Variant51964, - Variant51965, - Variant51966, - Variant51967, - Variant51968, - Variant51969, - Variant51970, - Variant51971, - Variant51972, - Variant51973, - Variant51974, - Variant51975, - Variant51976, - Variant51977, - Variant51978, - Variant51979, - Variant51980, - Variant51981, - Variant51982, - Variant51983, - Variant51984, - Variant51985, - Variant51986, - Variant51987, - Variant51988, - Variant51989, - Variant51990, - Variant51991, - Variant51992, - Variant51993, - Variant51994, - Variant51995, - Variant51996, - Variant51997, - Variant51998, - Variant51999, - Variant52000, - Variant52001, - Variant52002, - Variant52003, - Variant52004, - Variant52005, - Variant52006, - Variant52007, - Variant52008, - Variant52009, - Variant52010, - Variant52011, - Variant52012, - Variant52013, - Variant52014, - Variant52015, - Variant52016, - Variant52017, - Variant52018, - Variant52019, - Variant52020, - Variant52021, - Variant52022, - Variant52023, - Variant52024, - Variant52025, - Variant52026, - Variant52027, - Variant52028, - Variant52029, - Variant52030, - Variant52031, - Variant52032, - Variant52033, - Variant52034, - Variant52035, - Variant52036, - Variant52037, - Variant52038, - Variant52039, - Variant52040, - Variant52041, - Variant52042, - Variant52043, - Variant52044, - Variant52045, - Variant52046, - Variant52047, - Variant52048, - Variant52049, - Variant52050, - Variant52051, - Variant52052, - Variant52053, - Variant52054, - Variant52055, - Variant52056, - Variant52057, - Variant52058, - Variant52059, - Variant52060, - Variant52061, - Variant52062, - Variant52063, - Variant52064, - Variant52065, - Variant52066, - Variant52067, - Variant52068, - Variant52069, - Variant52070, - Variant52071, - Variant52072, - Variant52073, - Variant52074, - Variant52075, - Variant52076, - Variant52077, - Variant52078, - Variant52079, - Variant52080, - Variant52081, - Variant52082, - Variant52083, - Variant52084, - Variant52085, - Variant52086, - Variant52087, - Variant52088, - Variant52089, - Variant52090, - Variant52091, - Variant52092, - Variant52093, - Variant52094, - Variant52095, - Variant52096, - Variant52097, - Variant52098, - Variant52099, - Variant52100, - Variant52101, - Variant52102, - Variant52103, - Variant52104, - Variant52105, - Variant52106, - Variant52107, - Variant52108, - Variant52109, - Variant52110, - Variant52111, - Variant52112, - Variant52113, - Variant52114, - Variant52115, - Variant52116, - Variant52117, - Variant52118, - Variant52119, - Variant52120, - Variant52121, - Variant52122, - Variant52123, - Variant52124, - Variant52125, - Variant52126, - Variant52127, - Variant52128, - Variant52129, - Variant52130, - Variant52131, - Variant52132, - Variant52133, - Variant52134, - Variant52135, - Variant52136, - Variant52137, - Variant52138, - Variant52139, - Variant52140, - Variant52141, - Variant52142, - Variant52143, - Variant52144, - Variant52145, - Variant52146, - Variant52147, - Variant52148, - Variant52149, - Variant52150, - Variant52151, - Variant52152, - Variant52153, - Variant52154, - Variant52155, - Variant52156, - Variant52157, - Variant52158, - Variant52159, - Variant52160, - Variant52161, - Variant52162, - Variant52163, - Variant52164, - Variant52165, - Variant52166, - Variant52167, - Variant52168, - Variant52169, - Variant52170, - Variant52171, - Variant52172, - Variant52173, - Variant52174, - Variant52175, - Variant52176, - Variant52177, - Variant52178, - Variant52179, - Variant52180, - Variant52181, - Variant52182, - Variant52183, - Variant52184, - Variant52185, - Variant52186, - Variant52187, - Variant52188, - Variant52189, - Variant52190, - Variant52191, - Variant52192, - Variant52193, - Variant52194, - Variant52195, - Variant52196, - Variant52197, - Variant52198, - Variant52199, - Variant52200, - Variant52201, - Variant52202, - Variant52203, - Variant52204, - Variant52205, - Variant52206, - Variant52207, - Variant52208, - Variant52209, - Variant52210, - Variant52211, - Variant52212, - Variant52213, - Variant52214, - Variant52215, - Variant52216, - Variant52217, - Variant52218, - Variant52219, - Variant52220, - Variant52221, - Variant52222, - Variant52223, - Variant52224, - Variant52225, - Variant52226, - Variant52227, - Variant52228, - Variant52229, - Variant52230, - Variant52231, - Variant52232, - Variant52233, - Variant52234, - Variant52235, - Variant52236, - Variant52237, - Variant52238, - Variant52239, - Variant52240, - Variant52241, - Variant52242, - Variant52243, - Variant52244, - Variant52245, - Variant52246, - Variant52247, - Variant52248, - Variant52249, - Variant52250, - Variant52251, - Variant52252, - Variant52253, - Variant52254, - Variant52255, - Variant52256, - Variant52257, - Variant52258, - Variant52259, - Variant52260, - Variant52261, - Variant52262, - Variant52263, - Variant52264, - Variant52265, - Variant52266, - Variant52267, - Variant52268, - Variant52269, - Variant52270, - Variant52271, - Variant52272, - Variant52273, - Variant52274, - Variant52275, - Variant52276, - Variant52277, - Variant52278, - Variant52279, - Variant52280, - Variant52281, - Variant52282, - Variant52283, - Variant52284, - Variant52285, - Variant52286, - Variant52287, - Variant52288, - Variant52289, - Variant52290, - Variant52291, - Variant52292, - Variant52293, - Variant52294, - Variant52295, - Variant52296, - Variant52297, - Variant52298, - Variant52299, - Variant52300, - Variant52301, - Variant52302, - Variant52303, - Variant52304, - Variant52305, - Variant52306, - Variant52307, - Variant52308, - Variant52309, - Variant52310, - Variant52311, - Variant52312, - Variant52313, - Variant52314, - Variant52315, - Variant52316, - Variant52317, - Variant52318, - Variant52319, - Variant52320, - Variant52321, - Variant52322, - Variant52323, - Variant52324, - Variant52325, - Variant52326, - Variant52327, - Variant52328, - Variant52329, - Variant52330, - Variant52331, - Variant52332, - Variant52333, - Variant52334, - Variant52335, - Variant52336, - Variant52337, - Variant52338, - Variant52339, - Variant52340, - Variant52341, - Variant52342, - Variant52343, - Variant52344, - Variant52345, - Variant52346, - Variant52347, - Variant52348, - Variant52349, - Variant52350, - Variant52351, - Variant52352, - Variant52353, - Variant52354, - Variant52355, - Variant52356, - Variant52357, - Variant52358, - Variant52359, - Variant52360, - Variant52361, - Variant52362, - Variant52363, - Variant52364, - Variant52365, - Variant52366, - Variant52367, - Variant52368, - Variant52369, - Variant52370, - Variant52371, - Variant52372, - Variant52373, - Variant52374, - Variant52375, - Variant52376, - Variant52377, - Variant52378, - Variant52379, - Variant52380, - Variant52381, - Variant52382, - Variant52383, - Variant52384, - Variant52385, - Variant52386, - Variant52387, - Variant52388, - Variant52389, - Variant52390, - Variant52391, - Variant52392, - Variant52393, - Variant52394, - Variant52395, - Variant52396, - Variant52397, - Variant52398, - Variant52399, - Variant52400, - Variant52401, - Variant52402, - Variant52403, - Variant52404, - Variant52405, - Variant52406, - Variant52407, - Variant52408, - Variant52409, - Variant52410, - Variant52411, - Variant52412, - Variant52413, - Variant52414, - Variant52415, - Variant52416, - Variant52417, - Variant52418, - Variant52419, - Variant52420, - Variant52421, - Variant52422, - Variant52423, - Variant52424, - Variant52425, - Variant52426, - Variant52427, - Variant52428, - Variant52429, - Variant52430, - Variant52431, - Variant52432, - Variant52433, - Variant52434, - Variant52435, - Variant52436, - Variant52437, - Variant52438, - Variant52439, - Variant52440, - Variant52441, - Variant52442, - Variant52443, - Variant52444, - Variant52445, - Variant52446, - Variant52447, - Variant52448, - Variant52449, - Variant52450, - Variant52451, - Variant52452, - Variant52453, - Variant52454, - Variant52455, - Variant52456, - Variant52457, - Variant52458, - Variant52459, - Variant52460, - Variant52461, - Variant52462, - Variant52463, - Variant52464, - Variant52465, - Variant52466, - Variant52467, - Variant52468, - Variant52469, - Variant52470, - Variant52471, - Variant52472, - Variant52473, - Variant52474, - Variant52475, - Variant52476, - Variant52477, - Variant52478, - Variant52479, - Variant52480, - Variant52481, - Variant52482, - Variant52483, - Variant52484, - Variant52485, - Variant52486, - Variant52487, - Variant52488, - Variant52489, - Variant52490, - Variant52491, - Variant52492, - Variant52493, - Variant52494, - Variant52495, - Variant52496, - Variant52497, - Variant52498, - Variant52499, - Variant52500, - Variant52501, - Variant52502, - Variant52503, - Variant52504, - Variant52505, - Variant52506, - Variant52507, - Variant52508, - Variant52509, - Variant52510, - Variant52511, - Variant52512, - Variant52513, - Variant52514, - Variant52515, - Variant52516, - Variant52517, - Variant52518, - Variant52519, - Variant52520, - Variant52521, - Variant52522, - Variant52523, - Variant52524, - Variant52525, - Variant52526, - Variant52527, - Variant52528, - Variant52529, - Variant52530, - Variant52531, - Variant52532, - Variant52533, - Variant52534, - Variant52535, - Variant52536, - Variant52537, - Variant52538, - Variant52539, - Variant52540, - Variant52541, - Variant52542, - Variant52543, - Variant52544, - Variant52545, - Variant52546, - Variant52547, - Variant52548, - Variant52549, - Variant52550, - Variant52551, - Variant52552, - Variant52553, - Variant52554, - Variant52555, - Variant52556, - Variant52557, - Variant52558, - Variant52559, - Variant52560, - Variant52561, - Variant52562, - Variant52563, - Variant52564, - Variant52565, - Variant52566, - Variant52567, - Variant52568, - Variant52569, - Variant52570, - Variant52571, - Variant52572, - Variant52573, - Variant52574, - Variant52575, - Variant52576, - Variant52577, - Variant52578, - Variant52579, - Variant52580, - Variant52581, - Variant52582, - Variant52583, - Variant52584, - Variant52585, - Variant52586, - Variant52587, - Variant52588, - Variant52589, - Variant52590, - Variant52591, - Variant52592, - Variant52593, - Variant52594, - Variant52595, - Variant52596, - Variant52597, - Variant52598, - Variant52599, - Variant52600, - Variant52601, - Variant52602, - Variant52603, - Variant52604, - Variant52605, - Variant52606, - Variant52607, - Variant52608, - Variant52609, - Variant52610, - Variant52611, - Variant52612, - Variant52613, - Variant52614, - Variant52615, - Variant52616, - Variant52617, - Variant52618, - Variant52619, - Variant52620, - Variant52621, - Variant52622, - Variant52623, - Variant52624, - Variant52625, - Variant52626, - Variant52627, - Variant52628, - Variant52629, - Variant52630, - Variant52631, - Variant52632, - Variant52633, - Variant52634, - Variant52635, - Variant52636, - Variant52637, - Variant52638, - Variant52639, - Variant52640, - Variant52641, - Variant52642, - Variant52643, - Variant52644, - Variant52645, - Variant52646, - Variant52647, - Variant52648, - Variant52649, - Variant52650, - Variant52651, - Variant52652, - Variant52653, - Variant52654, - Variant52655, - Variant52656, - Variant52657, - Variant52658, - Variant52659, - Variant52660, - Variant52661, - Variant52662, - Variant52663, - Variant52664, - Variant52665, - Variant52666, - Variant52667, - Variant52668, - Variant52669, - Variant52670, - Variant52671, - Variant52672, - Variant52673, - Variant52674, - Variant52675, - Variant52676, - Variant52677, - Variant52678, - Variant52679, - Variant52680, - Variant52681, - Variant52682, - Variant52683, - Variant52684, - Variant52685, - Variant52686, - Variant52687, - Variant52688, - Variant52689, - Variant52690, - Variant52691, - Variant52692, - Variant52693, - Variant52694, - Variant52695, - Variant52696, - Variant52697, - Variant52698, - Variant52699, - Variant52700, - Variant52701, - Variant52702, - Variant52703, - Variant52704, - Variant52705, - Variant52706, - Variant52707, - Variant52708, - Variant52709, - Variant52710, - Variant52711, - Variant52712, - Variant52713, - Variant52714, - Variant52715, - Variant52716, - Variant52717, - Variant52718, - Variant52719, - Variant52720, - Variant52721, - Variant52722, - Variant52723, - Variant52724, - Variant52725, - Variant52726, - Variant52727, - Variant52728, - Variant52729, - Variant52730, - Variant52731, - Variant52732, - Variant52733, - Variant52734, - Variant52735, - Variant52736, - Variant52737, - Variant52738, - Variant52739, - Variant52740, - Variant52741, - Variant52742, - Variant52743, - Variant52744, - Variant52745, - Variant52746, - Variant52747, - Variant52748, - Variant52749, - Variant52750, - Variant52751, - Variant52752, - Variant52753, - Variant52754, - Variant52755, - Variant52756, - Variant52757, - Variant52758, - Variant52759, - Variant52760, - Variant52761, - Variant52762, - Variant52763, - Variant52764, - Variant52765, - Variant52766, - Variant52767, - Variant52768, - Variant52769, - Variant52770, - Variant52771, - Variant52772, - Variant52773, - Variant52774, - Variant52775, - Variant52776, - Variant52777, - Variant52778, - Variant52779, - Variant52780, - Variant52781, - Variant52782, - Variant52783, - Variant52784, - Variant52785, - Variant52786, - Variant52787, - Variant52788, - Variant52789, - Variant52790, - Variant52791, - Variant52792, - Variant52793, - Variant52794, - Variant52795, - Variant52796, - Variant52797, - Variant52798, - Variant52799, - Variant52800, - Variant52801, - Variant52802, - Variant52803, - Variant52804, - Variant52805, - Variant52806, - Variant52807, - Variant52808, - Variant52809, - Variant52810, - Variant52811, - Variant52812, - Variant52813, - Variant52814, - Variant52815, - Variant52816, - Variant52817, - Variant52818, - Variant52819, - Variant52820, - Variant52821, - Variant52822, - Variant52823, - Variant52824, - Variant52825, - Variant52826, - Variant52827, - Variant52828, - Variant52829, - Variant52830, - Variant52831, - Variant52832, - Variant52833, - Variant52834, - Variant52835, - Variant52836, - Variant52837, - Variant52838, - Variant52839, - Variant52840, - Variant52841, - Variant52842, - Variant52843, - Variant52844, - Variant52845, - Variant52846, - Variant52847, - Variant52848, - Variant52849, - Variant52850, - Variant52851, - Variant52852, - Variant52853, - Variant52854, - Variant52855, - Variant52856, - Variant52857, - Variant52858, - Variant52859, - Variant52860, - Variant52861, - Variant52862, - Variant52863, - Variant52864, - Variant52865, - Variant52866, - Variant52867, - Variant52868, - Variant52869, - Variant52870, - Variant52871, - Variant52872, - Variant52873, - Variant52874, - Variant52875, - Variant52876, - Variant52877, - Variant52878, - Variant52879, - Variant52880, - Variant52881, - Variant52882, - Variant52883, - Variant52884, - Variant52885, - Variant52886, - Variant52887, - Variant52888, - Variant52889, - Variant52890, - Variant52891, - Variant52892, - Variant52893, - Variant52894, - Variant52895, - Variant52896, - Variant52897, - Variant52898, - Variant52899, - Variant52900, - Variant52901, - Variant52902, - Variant52903, - Variant52904, - Variant52905, - Variant52906, - Variant52907, - Variant52908, - Variant52909, - Variant52910, - Variant52911, - Variant52912, - Variant52913, - Variant52914, - Variant52915, - Variant52916, - Variant52917, - Variant52918, - Variant52919, - Variant52920, - Variant52921, - Variant52922, - Variant52923, - Variant52924, - Variant52925, - Variant52926, - Variant52927, - Variant52928, - Variant52929, - Variant52930, - Variant52931, - Variant52932, - Variant52933, - Variant52934, - Variant52935, - Variant52936, - Variant52937, - Variant52938, - Variant52939, - Variant52940, - Variant52941, - Variant52942, - Variant52943, - Variant52944, - Variant52945, - Variant52946, - Variant52947, - Variant52948, - Variant52949, - Variant52950, - Variant52951, - Variant52952, - Variant52953, - Variant52954, - Variant52955, - Variant52956, - Variant52957, - Variant52958, - Variant52959, - Variant52960, - Variant52961, - Variant52962, - Variant52963, - Variant52964, - Variant52965, - Variant52966, - Variant52967, - Variant52968, - Variant52969, - Variant52970, - Variant52971, - Variant52972, - Variant52973, - Variant52974, - Variant52975, - Variant52976, - Variant52977, - Variant52978, - Variant52979, - Variant52980, - Variant52981, - Variant52982, - Variant52983, - Variant52984, - Variant52985, - Variant52986, - Variant52987, - Variant52988, - Variant52989, - Variant52990, - Variant52991, - Variant52992, - Variant52993, - Variant52994, - Variant52995, - Variant52996, - Variant52997, - Variant52998, - Variant52999, - Variant53000, - Variant53001, - Variant53002, - Variant53003, - Variant53004, - Variant53005, - Variant53006, - Variant53007, - Variant53008, - Variant53009, - Variant53010, - Variant53011, - Variant53012, - Variant53013, - Variant53014, - Variant53015, - Variant53016, - Variant53017, - Variant53018, - Variant53019, - Variant53020, - Variant53021, - Variant53022, - Variant53023, - Variant53024, - Variant53025, - Variant53026, - Variant53027, - Variant53028, - Variant53029, - Variant53030, - Variant53031, - Variant53032, - Variant53033, - Variant53034, - Variant53035, - Variant53036, - Variant53037, - Variant53038, - Variant53039, - Variant53040, - Variant53041, - Variant53042, - Variant53043, - Variant53044, - Variant53045, - Variant53046, - Variant53047, - Variant53048, - Variant53049, - Variant53050, - Variant53051, - Variant53052, - Variant53053, - Variant53054, - Variant53055, - Variant53056, - Variant53057, - Variant53058, - Variant53059, - Variant53060, - Variant53061, - Variant53062, - Variant53063, - Variant53064, - Variant53065, - Variant53066, - Variant53067, - Variant53068, - Variant53069, - Variant53070, - Variant53071, - Variant53072, - Variant53073, - Variant53074, - Variant53075, - Variant53076, - Variant53077, - Variant53078, - Variant53079, - Variant53080, - Variant53081, - Variant53082, - Variant53083, - Variant53084, - Variant53085, - Variant53086, - Variant53087, - Variant53088, - Variant53089, - Variant53090, - Variant53091, - Variant53092, - Variant53093, - Variant53094, - Variant53095, - Variant53096, - Variant53097, - Variant53098, - Variant53099, - Variant53100, - Variant53101, - Variant53102, - Variant53103, - Variant53104, - Variant53105, - Variant53106, - Variant53107, - Variant53108, - Variant53109, - Variant53110, - Variant53111, - Variant53112, - Variant53113, - Variant53114, - Variant53115, - Variant53116, - Variant53117, - Variant53118, - Variant53119, - Variant53120, - Variant53121, - Variant53122, - Variant53123, - Variant53124, - Variant53125, - Variant53126, - Variant53127, - Variant53128, - Variant53129, - Variant53130, - Variant53131, - Variant53132, - Variant53133, - Variant53134, - Variant53135, - Variant53136, - Variant53137, - Variant53138, - Variant53139, - Variant53140, - Variant53141, - Variant53142, - Variant53143, - Variant53144, - Variant53145, - Variant53146, - Variant53147, - Variant53148, - Variant53149, - Variant53150, - Variant53151, - Variant53152, - Variant53153, - Variant53154, - Variant53155, - Variant53156, - Variant53157, - Variant53158, - Variant53159, - Variant53160, - Variant53161, - Variant53162, - Variant53163, - Variant53164, - Variant53165, - Variant53166, - Variant53167, - Variant53168, - Variant53169, - Variant53170, - Variant53171, - Variant53172, - Variant53173, - Variant53174, - Variant53175, - Variant53176, - Variant53177, - Variant53178, - Variant53179, - Variant53180, - Variant53181, - Variant53182, - Variant53183, - Variant53184, - Variant53185, - Variant53186, - Variant53187, - Variant53188, - Variant53189, - Variant53190, - Variant53191, - Variant53192, - Variant53193, - Variant53194, - Variant53195, - Variant53196, - Variant53197, - Variant53198, - Variant53199, - Variant53200, - Variant53201, - Variant53202, - Variant53203, - Variant53204, - Variant53205, - Variant53206, - Variant53207, - Variant53208, - Variant53209, - Variant53210, - Variant53211, - Variant53212, - Variant53213, - Variant53214, - Variant53215, - Variant53216, - Variant53217, - Variant53218, - Variant53219, - Variant53220, - Variant53221, - Variant53222, - Variant53223, - Variant53224, - Variant53225, - Variant53226, - Variant53227, - Variant53228, - Variant53229, - Variant53230, - Variant53231, - Variant53232, - Variant53233, - Variant53234, - Variant53235, - Variant53236, - Variant53237, - Variant53238, - Variant53239, - Variant53240, - Variant53241, - Variant53242, - Variant53243, - Variant53244, - Variant53245, - Variant53246, - Variant53247, - Variant53248, - Variant53249, - Variant53250, - Variant53251, - Variant53252, - Variant53253, - Variant53254, - Variant53255, - Variant53256, - Variant53257, - Variant53258, - Variant53259, - Variant53260, - Variant53261, - Variant53262, - Variant53263, - Variant53264, - Variant53265, - Variant53266, - Variant53267, - Variant53268, - Variant53269, - Variant53270, - Variant53271, - Variant53272, - Variant53273, - Variant53274, - Variant53275, - Variant53276, - Variant53277, - Variant53278, - Variant53279, - Variant53280, - Variant53281, - Variant53282, - Variant53283, - Variant53284, - Variant53285, - Variant53286, - Variant53287, - Variant53288, - Variant53289, - Variant53290, - Variant53291, - Variant53292, - Variant53293, - Variant53294, - Variant53295, - Variant53296, - Variant53297, - Variant53298, - Variant53299, - Variant53300, - Variant53301, - Variant53302, - Variant53303, - Variant53304, - Variant53305, - Variant53306, - Variant53307, - Variant53308, - Variant53309, - Variant53310, - Variant53311, - Variant53312, - Variant53313, - Variant53314, - Variant53315, - Variant53316, - Variant53317, - Variant53318, - Variant53319, - Variant53320, - Variant53321, - Variant53322, - Variant53323, - Variant53324, - Variant53325, - Variant53326, - Variant53327, - Variant53328, - Variant53329, - Variant53330, - Variant53331, - Variant53332, - Variant53333, - Variant53334, - Variant53335, - Variant53336, - Variant53337, - Variant53338, - Variant53339, - Variant53340, - Variant53341, - Variant53342, - Variant53343, - Variant53344, - Variant53345, - Variant53346, - Variant53347, - Variant53348, - Variant53349, - Variant53350, - Variant53351, - Variant53352, - Variant53353, - Variant53354, - Variant53355, - Variant53356, - Variant53357, - Variant53358, - Variant53359, - Variant53360, - Variant53361, - Variant53362, - Variant53363, - Variant53364, - Variant53365, - Variant53366, - Variant53367, - Variant53368, - Variant53369, - Variant53370, - Variant53371, - Variant53372, - Variant53373, - Variant53374, - Variant53375, - Variant53376, - Variant53377, - Variant53378, - Variant53379, - Variant53380, - Variant53381, - Variant53382, - Variant53383, - Variant53384, - Variant53385, - Variant53386, - Variant53387, - Variant53388, - Variant53389, - Variant53390, - Variant53391, - Variant53392, - Variant53393, - Variant53394, - Variant53395, - Variant53396, - Variant53397, - Variant53398, - Variant53399, - Variant53400, - Variant53401, - Variant53402, - Variant53403, - Variant53404, - Variant53405, - Variant53406, - Variant53407, - Variant53408, - Variant53409, - Variant53410, - Variant53411, - Variant53412, - Variant53413, - Variant53414, - Variant53415, - Variant53416, - Variant53417, - Variant53418, - Variant53419, - Variant53420, - Variant53421, - Variant53422, - Variant53423, - Variant53424, - Variant53425, - Variant53426, - Variant53427, - Variant53428, - Variant53429, - Variant53430, - Variant53431, - Variant53432, - Variant53433, - Variant53434, - Variant53435, - Variant53436, - Variant53437, - Variant53438, - Variant53439, - Variant53440, - Variant53441, - Variant53442, - Variant53443, - Variant53444, - Variant53445, - Variant53446, - Variant53447, - Variant53448, - Variant53449, - Variant53450, - Variant53451, - Variant53452, - Variant53453, - Variant53454, - Variant53455, - Variant53456, - Variant53457, - Variant53458, - Variant53459, - Variant53460, - Variant53461, - Variant53462, - Variant53463, - Variant53464, - Variant53465, - Variant53466, - Variant53467, - Variant53468, - Variant53469, - Variant53470, - Variant53471, - Variant53472, - Variant53473, - Variant53474, - Variant53475, - Variant53476, - Variant53477, - Variant53478, - Variant53479, - Variant53480, - Variant53481, - Variant53482, - Variant53483, - Variant53484, - Variant53485, - Variant53486, - Variant53487, - Variant53488, - Variant53489, - Variant53490, - Variant53491, - Variant53492, - Variant53493, - Variant53494, - Variant53495, - Variant53496, - Variant53497, - Variant53498, - Variant53499, - Variant53500, - Variant53501, - Variant53502, - Variant53503, - Variant53504, - Variant53505, - Variant53506, - Variant53507, - Variant53508, - Variant53509, - Variant53510, - Variant53511, - Variant53512, - Variant53513, - Variant53514, - Variant53515, - Variant53516, - Variant53517, - Variant53518, - Variant53519, - Variant53520, - Variant53521, - Variant53522, - Variant53523, - Variant53524, - Variant53525, - Variant53526, - Variant53527, - Variant53528, - Variant53529, - Variant53530, - Variant53531, - Variant53532, - Variant53533, - Variant53534, - Variant53535, - Variant53536, - Variant53537, - Variant53538, - Variant53539, - Variant53540, - Variant53541, - Variant53542, - Variant53543, - Variant53544, - Variant53545, - Variant53546, - Variant53547, - Variant53548, - Variant53549, - Variant53550, - Variant53551, - Variant53552, - Variant53553, - Variant53554, - Variant53555, - Variant53556, - Variant53557, - Variant53558, - Variant53559, - Variant53560, - Variant53561, - Variant53562, - Variant53563, - Variant53564, - Variant53565, - Variant53566, - Variant53567, - Variant53568, - Variant53569, - Variant53570, - Variant53571, - Variant53572, - Variant53573, - Variant53574, - Variant53575, - Variant53576, - Variant53577, - Variant53578, - Variant53579, - Variant53580, - Variant53581, - Variant53582, - Variant53583, - Variant53584, - Variant53585, - Variant53586, - Variant53587, - Variant53588, - Variant53589, - Variant53590, - Variant53591, - Variant53592, - Variant53593, - Variant53594, - Variant53595, - Variant53596, - Variant53597, - Variant53598, - Variant53599, - Variant53600, - Variant53601, - Variant53602, - Variant53603, - Variant53604, - Variant53605, - Variant53606, - Variant53607, - Variant53608, - Variant53609, - Variant53610, - Variant53611, - Variant53612, - Variant53613, - Variant53614, - Variant53615, - Variant53616, - Variant53617, - Variant53618, - Variant53619, - Variant53620, - Variant53621, - Variant53622, - Variant53623, - Variant53624, - Variant53625, - Variant53626, - Variant53627, - Variant53628, - Variant53629, - Variant53630, - Variant53631, - Variant53632, - Variant53633, - Variant53634, - Variant53635, - Variant53636, - Variant53637, - Variant53638, - Variant53639, - Variant53640, - Variant53641, - Variant53642, - Variant53643, - Variant53644, - Variant53645, - Variant53646, - Variant53647, - Variant53648, - Variant53649, - Variant53650, - Variant53651, - Variant53652, - Variant53653, - Variant53654, - Variant53655, - Variant53656, - Variant53657, - Variant53658, - Variant53659, - Variant53660, - Variant53661, - Variant53662, - Variant53663, - Variant53664, - Variant53665, - Variant53666, - Variant53667, - Variant53668, - Variant53669, - Variant53670, - Variant53671, - Variant53672, - Variant53673, - Variant53674, - Variant53675, - Variant53676, - Variant53677, - Variant53678, - Variant53679, - Variant53680, - Variant53681, - Variant53682, - Variant53683, - Variant53684, - Variant53685, - Variant53686, - Variant53687, - Variant53688, - Variant53689, - Variant53690, - Variant53691, - Variant53692, - Variant53693, - Variant53694, - Variant53695, - Variant53696, - Variant53697, - Variant53698, - Variant53699, - Variant53700, - Variant53701, - Variant53702, - Variant53703, - Variant53704, - Variant53705, - Variant53706, - Variant53707, - Variant53708, - Variant53709, - Variant53710, - Variant53711, - Variant53712, - Variant53713, - Variant53714, - Variant53715, - Variant53716, - Variant53717, - Variant53718, - Variant53719, - Variant53720, - Variant53721, - Variant53722, - Variant53723, - Variant53724, - Variant53725, - Variant53726, - Variant53727, - Variant53728, - Variant53729, - Variant53730, - Variant53731, - Variant53732, - Variant53733, - Variant53734, - Variant53735, - Variant53736, - Variant53737, - Variant53738, - Variant53739, - Variant53740, - Variant53741, - Variant53742, - Variant53743, - Variant53744, - Variant53745, - Variant53746, - Variant53747, - Variant53748, - Variant53749, - Variant53750, - Variant53751, - Variant53752, - Variant53753, - Variant53754, - Variant53755, - Variant53756, - Variant53757, - Variant53758, - Variant53759, - Variant53760, - Variant53761, - Variant53762, - Variant53763, - Variant53764, - Variant53765, - Variant53766, - Variant53767, - Variant53768, - Variant53769, - Variant53770, - Variant53771, - Variant53772, - Variant53773, - Variant53774, - Variant53775, - Variant53776, - Variant53777, - Variant53778, - Variant53779, - Variant53780, - Variant53781, - Variant53782, - Variant53783, - Variant53784, - Variant53785, - Variant53786, - Variant53787, - Variant53788, - Variant53789, - Variant53790, - Variant53791, - Variant53792, - Variant53793, - Variant53794, - Variant53795, - Variant53796, - Variant53797, - Variant53798, - Variant53799, - Variant53800, - Variant53801, - Variant53802, - Variant53803, - Variant53804, - Variant53805, - Variant53806, - Variant53807, - Variant53808, - Variant53809, - Variant53810, - Variant53811, - Variant53812, - Variant53813, - Variant53814, - Variant53815, - Variant53816, - Variant53817, - Variant53818, - Variant53819, - Variant53820, - Variant53821, - Variant53822, - Variant53823, - Variant53824, - Variant53825, - Variant53826, - Variant53827, - Variant53828, - Variant53829, - Variant53830, - Variant53831, - Variant53832, - Variant53833, - Variant53834, - Variant53835, - Variant53836, - Variant53837, - Variant53838, - Variant53839, - Variant53840, - Variant53841, - Variant53842, - Variant53843, - Variant53844, - Variant53845, - Variant53846, - Variant53847, - Variant53848, - Variant53849, - Variant53850, - Variant53851, - Variant53852, - Variant53853, - Variant53854, - Variant53855, - Variant53856, - Variant53857, - Variant53858, - Variant53859, - Variant53860, - Variant53861, - Variant53862, - Variant53863, - Variant53864, - Variant53865, - Variant53866, - Variant53867, - Variant53868, - Variant53869, - Variant53870, - Variant53871, - Variant53872, - Variant53873, - Variant53874, - Variant53875, - Variant53876, - Variant53877, - Variant53878, - Variant53879, - Variant53880, - Variant53881, - Variant53882, - Variant53883, - Variant53884, - Variant53885, - Variant53886, - Variant53887, - Variant53888, - Variant53889, - Variant53890, - Variant53891, - Variant53892, - Variant53893, - Variant53894, - Variant53895, - Variant53896, - Variant53897, - Variant53898, - Variant53899, - Variant53900, - Variant53901, - Variant53902, - Variant53903, - Variant53904, - Variant53905, - Variant53906, - Variant53907, - Variant53908, - Variant53909, - Variant53910, - Variant53911, - Variant53912, - Variant53913, - Variant53914, - Variant53915, - Variant53916, - Variant53917, - Variant53918, - Variant53919, - Variant53920, - Variant53921, - Variant53922, - Variant53923, - Variant53924, - Variant53925, - Variant53926, - Variant53927, - Variant53928, - Variant53929, - Variant53930, - Variant53931, - Variant53932, - Variant53933, - Variant53934, - Variant53935, - Variant53936, - Variant53937, - Variant53938, - Variant53939, - Variant53940, - Variant53941, - Variant53942, - Variant53943, - Variant53944, - Variant53945, - Variant53946, - Variant53947, - Variant53948, - Variant53949, - Variant53950, - Variant53951, - Variant53952, - Variant53953, - Variant53954, - Variant53955, - Variant53956, - Variant53957, - Variant53958, - Variant53959, - Variant53960, - Variant53961, - Variant53962, - Variant53963, - Variant53964, - Variant53965, - Variant53966, - Variant53967, - Variant53968, - Variant53969, - Variant53970, - Variant53971, - Variant53972, - Variant53973, - Variant53974, - Variant53975, - Variant53976, - Variant53977, - Variant53978, - Variant53979, - Variant53980, - Variant53981, - Variant53982, - Variant53983, - Variant53984, - Variant53985, - Variant53986, - Variant53987, - Variant53988, - Variant53989, - Variant53990, - Variant53991, - Variant53992, - Variant53993, - Variant53994, - Variant53995, - Variant53996, - Variant53997, - Variant53998, - Variant53999, - Variant54000, - Variant54001, - Variant54002, - Variant54003, - Variant54004, - Variant54005, - Variant54006, - Variant54007, - Variant54008, - Variant54009, - Variant54010, - Variant54011, - Variant54012, - Variant54013, - Variant54014, - Variant54015, - Variant54016, - Variant54017, - Variant54018, - Variant54019, - Variant54020, - Variant54021, - Variant54022, - Variant54023, - Variant54024, - Variant54025, - Variant54026, - Variant54027, - Variant54028, - Variant54029, - Variant54030, - Variant54031, - Variant54032, - Variant54033, - Variant54034, - Variant54035, - Variant54036, - Variant54037, - Variant54038, - Variant54039, - Variant54040, - Variant54041, - Variant54042, - Variant54043, - Variant54044, - Variant54045, - Variant54046, - Variant54047, - Variant54048, - Variant54049, - Variant54050, - Variant54051, - Variant54052, - Variant54053, - Variant54054, - Variant54055, - Variant54056, - Variant54057, - Variant54058, - Variant54059, - Variant54060, - Variant54061, - Variant54062, - Variant54063, - Variant54064, - Variant54065, - Variant54066, - Variant54067, - Variant54068, - Variant54069, - Variant54070, - Variant54071, - Variant54072, - Variant54073, - Variant54074, - Variant54075, - Variant54076, - Variant54077, - Variant54078, - Variant54079, - Variant54080, - Variant54081, - Variant54082, - Variant54083, - Variant54084, - Variant54085, - Variant54086, - Variant54087, - Variant54088, - Variant54089, - Variant54090, - Variant54091, - Variant54092, - Variant54093, - Variant54094, - Variant54095, - Variant54096, - Variant54097, - Variant54098, - Variant54099, - Variant54100, - Variant54101, - Variant54102, - Variant54103, - Variant54104, - Variant54105, - Variant54106, - Variant54107, - Variant54108, - Variant54109, - Variant54110, - Variant54111, - Variant54112, - Variant54113, - Variant54114, - Variant54115, - Variant54116, - Variant54117, - Variant54118, - Variant54119, - Variant54120, - Variant54121, - Variant54122, - Variant54123, - Variant54124, - Variant54125, - Variant54126, - Variant54127, - Variant54128, - Variant54129, - Variant54130, - Variant54131, - Variant54132, - Variant54133, - Variant54134, - Variant54135, - Variant54136, - Variant54137, - Variant54138, - Variant54139, - Variant54140, - Variant54141, - Variant54142, - Variant54143, - Variant54144, - Variant54145, - Variant54146, - Variant54147, - Variant54148, - Variant54149, - Variant54150, - Variant54151, - Variant54152, - Variant54153, - Variant54154, - Variant54155, - Variant54156, - Variant54157, - Variant54158, - Variant54159, - Variant54160, - Variant54161, - Variant54162, - Variant54163, - Variant54164, - Variant54165, - Variant54166, - Variant54167, - Variant54168, - Variant54169, - Variant54170, - Variant54171, - Variant54172, - Variant54173, - Variant54174, - Variant54175, - Variant54176, - Variant54177, - Variant54178, - Variant54179, - Variant54180, - Variant54181, - Variant54182, - Variant54183, - Variant54184, - Variant54185, - Variant54186, - Variant54187, - Variant54188, - Variant54189, - Variant54190, - Variant54191, - Variant54192, - Variant54193, - Variant54194, - Variant54195, - Variant54196, - Variant54197, - Variant54198, - Variant54199, - Variant54200, - Variant54201, - Variant54202, - Variant54203, - Variant54204, - Variant54205, - Variant54206, - Variant54207, - Variant54208, - Variant54209, - Variant54210, - Variant54211, - Variant54212, - Variant54213, - Variant54214, - Variant54215, - Variant54216, - Variant54217, - Variant54218, - Variant54219, - Variant54220, - Variant54221, - Variant54222, - Variant54223, - Variant54224, - Variant54225, - Variant54226, - Variant54227, - Variant54228, - Variant54229, - Variant54230, - Variant54231, - Variant54232, - Variant54233, - Variant54234, - Variant54235, - Variant54236, - Variant54237, - Variant54238, - Variant54239, - Variant54240, - Variant54241, - Variant54242, - Variant54243, - Variant54244, - Variant54245, - Variant54246, - Variant54247, - Variant54248, - Variant54249, - Variant54250, - Variant54251, - Variant54252, - Variant54253, - Variant54254, - Variant54255, - Variant54256, - Variant54257, - Variant54258, - Variant54259, - Variant54260, - Variant54261, - Variant54262, - Variant54263, - Variant54264, - Variant54265, - Variant54266, - Variant54267, - Variant54268, - Variant54269, - Variant54270, - Variant54271, - Variant54272, - Variant54273, - Variant54274, - Variant54275, - Variant54276, - Variant54277, - Variant54278, - Variant54279, - Variant54280, - Variant54281, - Variant54282, - Variant54283, - Variant54284, - Variant54285, - Variant54286, - Variant54287, - Variant54288, - Variant54289, - Variant54290, - Variant54291, - Variant54292, - Variant54293, - Variant54294, - Variant54295, - Variant54296, - Variant54297, - Variant54298, - Variant54299, - Variant54300, - Variant54301, - Variant54302, - Variant54303, - Variant54304, - Variant54305, - Variant54306, - Variant54307, - Variant54308, - Variant54309, - Variant54310, - Variant54311, - Variant54312, - Variant54313, - Variant54314, - Variant54315, - Variant54316, - Variant54317, - Variant54318, - Variant54319, - Variant54320, - Variant54321, - Variant54322, - Variant54323, - Variant54324, - Variant54325, - Variant54326, - Variant54327, - Variant54328, - Variant54329, - Variant54330, - Variant54331, - Variant54332, - Variant54333, - Variant54334, - Variant54335, - Variant54336, - Variant54337, - Variant54338, - Variant54339, - Variant54340, - Variant54341, - Variant54342, - Variant54343, - Variant54344, - Variant54345, - Variant54346, - Variant54347, - Variant54348, - Variant54349, - Variant54350, - Variant54351, - Variant54352, - Variant54353, - Variant54354, - Variant54355, - Variant54356, - Variant54357, - Variant54358, - Variant54359, - Variant54360, - Variant54361, - Variant54362, - Variant54363, - Variant54364, - Variant54365, - Variant54366, - Variant54367, - Variant54368, - Variant54369, - Variant54370, - Variant54371, - Variant54372, - Variant54373, - Variant54374, - Variant54375, - Variant54376, - Variant54377, - Variant54378, - Variant54379, - Variant54380, - Variant54381, - Variant54382, - Variant54383, - Variant54384, - Variant54385, - Variant54386, - Variant54387, - Variant54388, - Variant54389, - Variant54390, - Variant54391, - Variant54392, - Variant54393, - Variant54394, - Variant54395, - Variant54396, - Variant54397, - Variant54398, - Variant54399, - Variant54400, - Variant54401, - Variant54402, - Variant54403, - Variant54404, - Variant54405, - Variant54406, - Variant54407, - Variant54408, - Variant54409, - Variant54410, - Variant54411, - Variant54412, - Variant54413, - Variant54414, - Variant54415, - Variant54416, - Variant54417, - Variant54418, - Variant54419, - Variant54420, - Variant54421, - Variant54422, - Variant54423, - Variant54424, - Variant54425, - Variant54426, - Variant54427, - Variant54428, - Variant54429, - Variant54430, - Variant54431, - Variant54432, - Variant54433, - Variant54434, - Variant54435, - Variant54436, - Variant54437, - Variant54438, - Variant54439, - Variant54440, - Variant54441, - Variant54442, - Variant54443, - Variant54444, - Variant54445, - Variant54446, - Variant54447, - Variant54448, - Variant54449, - Variant54450, - Variant54451, - Variant54452, - Variant54453, - Variant54454, - Variant54455, - Variant54456, - Variant54457, - Variant54458, - Variant54459, - Variant54460, - Variant54461, - Variant54462, - Variant54463, - Variant54464, - Variant54465, - Variant54466, - Variant54467, - Variant54468, - Variant54469, - Variant54470, - Variant54471, - Variant54472, - Variant54473, - Variant54474, - Variant54475, - Variant54476, - Variant54477, - Variant54478, - Variant54479, - Variant54480, - Variant54481, - Variant54482, - Variant54483, - Variant54484, - Variant54485, - Variant54486, - Variant54487, - Variant54488, - Variant54489, - Variant54490, - Variant54491, - Variant54492, - Variant54493, - Variant54494, - Variant54495, - Variant54496, - Variant54497, - Variant54498, - Variant54499, - Variant54500, - Variant54501, - Variant54502, - Variant54503, - Variant54504, - Variant54505, - Variant54506, - Variant54507, - Variant54508, - Variant54509, - Variant54510, - Variant54511, - Variant54512, - Variant54513, - Variant54514, - Variant54515, - Variant54516, - Variant54517, - Variant54518, - Variant54519, - Variant54520, - Variant54521, - Variant54522, - Variant54523, - Variant54524, - Variant54525, - Variant54526, - Variant54527, - Variant54528, - Variant54529, - Variant54530, - Variant54531, - Variant54532, - Variant54533, - Variant54534, - Variant54535, - Variant54536, - Variant54537, - Variant54538, - Variant54539, - Variant54540, - Variant54541, - Variant54542, - Variant54543, - Variant54544, - Variant54545, - Variant54546, - Variant54547, - Variant54548, - Variant54549, - Variant54550, - Variant54551, - Variant54552, - Variant54553, - Variant54554, - Variant54555, - Variant54556, - Variant54557, - Variant54558, - Variant54559, - Variant54560, - Variant54561, - Variant54562, - Variant54563, - Variant54564, - Variant54565, - Variant54566, - Variant54567, - Variant54568, - Variant54569, - Variant54570, - Variant54571, - Variant54572, - Variant54573, - Variant54574, - Variant54575, - Variant54576, - Variant54577, - Variant54578, - Variant54579, - Variant54580, - Variant54581, - Variant54582, - Variant54583, - Variant54584, - Variant54585, - Variant54586, - Variant54587, - Variant54588, - Variant54589, - Variant54590, - Variant54591, - Variant54592, - Variant54593, - Variant54594, - Variant54595, - Variant54596, - Variant54597, - Variant54598, - Variant54599, - Variant54600, - Variant54601, - Variant54602, - Variant54603, - Variant54604, - Variant54605, - Variant54606, - Variant54607, - Variant54608, - Variant54609, - Variant54610, - Variant54611, - Variant54612, - Variant54613, - Variant54614, - Variant54615, - Variant54616, - Variant54617, - Variant54618, - Variant54619, - Variant54620, - Variant54621, - Variant54622, - Variant54623, - Variant54624, - Variant54625, - Variant54626, - Variant54627, - Variant54628, - Variant54629, - Variant54630, - Variant54631, - Variant54632, - Variant54633, - Variant54634, - Variant54635, - Variant54636, - Variant54637, - Variant54638, - Variant54639, - Variant54640, - Variant54641, - Variant54642, - Variant54643, - Variant54644, - Variant54645, - Variant54646, - Variant54647, - Variant54648, - Variant54649, - Variant54650, - Variant54651, - Variant54652, - Variant54653, - Variant54654, - Variant54655, - Variant54656, - Variant54657, - Variant54658, - Variant54659, - Variant54660, - Variant54661, - Variant54662, - Variant54663, - Variant54664, - Variant54665, - Variant54666, - Variant54667, - Variant54668, - Variant54669, - Variant54670, - Variant54671, - Variant54672, - Variant54673, - Variant54674, - Variant54675, - Variant54676, - Variant54677, - Variant54678, - Variant54679, - Variant54680, - Variant54681, - Variant54682, - Variant54683, - Variant54684, - Variant54685, - Variant54686, - Variant54687, - Variant54688, - Variant54689, - Variant54690, - Variant54691, - Variant54692, - Variant54693, - Variant54694, - Variant54695, - Variant54696, - Variant54697, - Variant54698, - Variant54699, - Variant54700, - Variant54701, - Variant54702, - Variant54703, - Variant54704, - Variant54705, - Variant54706, - Variant54707, - Variant54708, - Variant54709, - Variant54710, - Variant54711, - Variant54712, - Variant54713, - Variant54714, - Variant54715, - Variant54716, - Variant54717, - Variant54718, - Variant54719, - Variant54720, - Variant54721, - Variant54722, - Variant54723, - Variant54724, - Variant54725, - Variant54726, - Variant54727, - Variant54728, - Variant54729, - Variant54730, - Variant54731, - Variant54732, - Variant54733, - Variant54734, - Variant54735, - Variant54736, - Variant54737, - Variant54738, - Variant54739, - Variant54740, - Variant54741, - Variant54742, - Variant54743, - Variant54744, - Variant54745, - Variant54746, - Variant54747, - Variant54748, - Variant54749, - Variant54750, - Variant54751, - Variant54752, - Variant54753, - Variant54754, - Variant54755, - Variant54756, - Variant54757, - Variant54758, - Variant54759, - Variant54760, - Variant54761, - Variant54762, - Variant54763, - Variant54764, - Variant54765, - Variant54766, - Variant54767, - Variant54768, - Variant54769, - Variant54770, - Variant54771, - Variant54772, - Variant54773, - Variant54774, - Variant54775, - Variant54776, - Variant54777, - Variant54778, - Variant54779, - Variant54780, - Variant54781, - Variant54782, - Variant54783, - Variant54784, - Variant54785, - Variant54786, - Variant54787, - Variant54788, - Variant54789, - Variant54790, - Variant54791, - Variant54792, - Variant54793, - Variant54794, - Variant54795, - Variant54796, - Variant54797, - Variant54798, - Variant54799, - Variant54800, - Variant54801, - Variant54802, - Variant54803, - Variant54804, - Variant54805, - Variant54806, - Variant54807, - Variant54808, - Variant54809, - Variant54810, - Variant54811, - Variant54812, - Variant54813, - Variant54814, - Variant54815, - Variant54816, - Variant54817, - Variant54818, - Variant54819, - Variant54820, - Variant54821, - Variant54822, - Variant54823, - Variant54824, - Variant54825, - Variant54826, - Variant54827, - Variant54828, - Variant54829, - Variant54830, - Variant54831, - Variant54832, - Variant54833, - Variant54834, - Variant54835, - Variant54836, - Variant54837, - Variant54838, - Variant54839, - Variant54840, - Variant54841, - Variant54842, - Variant54843, - Variant54844, - Variant54845, - Variant54846, - Variant54847, - Variant54848, - Variant54849, - Variant54850, - Variant54851, - Variant54852, - Variant54853, - Variant54854, - Variant54855, - Variant54856, - Variant54857, - Variant54858, - Variant54859, - Variant54860, - Variant54861, - Variant54862, - Variant54863, - Variant54864, - Variant54865, - Variant54866, - Variant54867, - Variant54868, - Variant54869, - Variant54870, - Variant54871, - Variant54872, - Variant54873, - Variant54874, - Variant54875, - Variant54876, - Variant54877, - Variant54878, - Variant54879, - Variant54880, - Variant54881, - Variant54882, - Variant54883, - Variant54884, - Variant54885, - Variant54886, - Variant54887, - Variant54888, - Variant54889, - Variant54890, - Variant54891, - Variant54892, - Variant54893, - Variant54894, - Variant54895, - Variant54896, - Variant54897, - Variant54898, - Variant54899, - Variant54900, - Variant54901, - Variant54902, - Variant54903, - Variant54904, - Variant54905, - Variant54906, - Variant54907, - Variant54908, - Variant54909, - Variant54910, - Variant54911, - Variant54912, - Variant54913, - Variant54914, - Variant54915, - Variant54916, - Variant54917, - Variant54918, - Variant54919, - Variant54920, - Variant54921, - Variant54922, - Variant54923, - Variant54924, - Variant54925, - Variant54926, - Variant54927, - Variant54928, - Variant54929, - Variant54930, - Variant54931, - Variant54932, - Variant54933, - Variant54934, - Variant54935, - Variant54936, - Variant54937, - Variant54938, - Variant54939, - Variant54940, - Variant54941, - Variant54942, - Variant54943, - Variant54944, - Variant54945, - Variant54946, - Variant54947, - Variant54948, - Variant54949, - Variant54950, - Variant54951, - Variant54952, - Variant54953, - Variant54954, - Variant54955, - Variant54956, - Variant54957, - Variant54958, - Variant54959, - Variant54960, - Variant54961, - Variant54962, - Variant54963, - Variant54964, - Variant54965, - Variant54966, - Variant54967, - Variant54968, - Variant54969, - Variant54970, - Variant54971, - Variant54972, - Variant54973, - Variant54974, - Variant54975, - Variant54976, - Variant54977, - Variant54978, - Variant54979, - Variant54980, - Variant54981, - Variant54982, - Variant54983, - Variant54984, - Variant54985, - Variant54986, - Variant54987, - Variant54988, - Variant54989, - Variant54990, - Variant54991, - Variant54992, - Variant54993, - Variant54994, - Variant54995, - Variant54996, - Variant54997, - Variant54998, - Variant54999, - Variant55000, - Variant55001, - Variant55002, - Variant55003, - Variant55004, - Variant55005, - Variant55006, - Variant55007, - Variant55008, - Variant55009, - Variant55010, - Variant55011, - Variant55012, - Variant55013, - Variant55014, - Variant55015, - Variant55016, - Variant55017, - Variant55018, - Variant55019, - Variant55020, - Variant55021, - Variant55022, - Variant55023, - Variant55024, - Variant55025, - Variant55026, - Variant55027, - Variant55028, - Variant55029, - Variant55030, - Variant55031, - Variant55032, - Variant55033, - Variant55034, - Variant55035, - Variant55036, - Variant55037, - Variant55038, - Variant55039, - Variant55040, - Variant55041, - Variant55042, - Variant55043, - Variant55044, - Variant55045, - Variant55046, - Variant55047, - Variant55048, - Variant55049, - Variant55050, - Variant55051, - Variant55052, - Variant55053, - Variant55054, - Variant55055, - Variant55056, - Variant55057, - Variant55058, - Variant55059, - Variant55060, - Variant55061, - Variant55062, - Variant55063, - Variant55064, - Variant55065, - Variant55066, - Variant55067, - Variant55068, - Variant55069, - Variant55070, - Variant55071, - Variant55072, - Variant55073, - Variant55074, - Variant55075, - Variant55076, - Variant55077, - Variant55078, - Variant55079, - Variant55080, - Variant55081, - Variant55082, - Variant55083, - Variant55084, - Variant55085, - Variant55086, - Variant55087, - Variant55088, - Variant55089, - Variant55090, - Variant55091, - Variant55092, - Variant55093, - Variant55094, - Variant55095, - Variant55096, - Variant55097, - Variant55098, - Variant55099, - Variant55100, - Variant55101, - Variant55102, - Variant55103, - Variant55104, - Variant55105, - Variant55106, - Variant55107, - Variant55108, - Variant55109, - Variant55110, - Variant55111, - Variant55112, - Variant55113, - Variant55114, - Variant55115, - Variant55116, - Variant55117, - Variant55118, - Variant55119, - Variant55120, - Variant55121, - Variant55122, - Variant55123, - Variant55124, - Variant55125, - Variant55126, - Variant55127, - Variant55128, - Variant55129, - Variant55130, - Variant55131, - Variant55132, - Variant55133, - Variant55134, - Variant55135, - Variant55136, - Variant55137, - Variant55138, - Variant55139, - Variant55140, - Variant55141, - Variant55142, - Variant55143, - Variant55144, - Variant55145, - Variant55146, - Variant55147, - Variant55148, - Variant55149, - Variant55150, - Variant55151, - Variant55152, - Variant55153, - Variant55154, - Variant55155, - Variant55156, - Variant55157, - Variant55158, - Variant55159, - Variant55160, - Variant55161, - Variant55162, - Variant55163, - Variant55164, - Variant55165, - Variant55166, - Variant55167, - Variant55168, - Variant55169, - Variant55170, - Variant55171, - Variant55172, - Variant55173, - Variant55174, - Variant55175, - Variant55176, - Variant55177, - Variant55178, - Variant55179, - Variant55180, - Variant55181, - Variant55182, - Variant55183, - Variant55184, - Variant55185, - Variant55186, - Variant55187, - Variant55188, - Variant55189, - Variant55190, - Variant55191, - Variant55192, - Variant55193, - Variant55194, - Variant55195, - Variant55196, - Variant55197, - Variant55198, - Variant55199, - Variant55200, - Variant55201, - Variant55202, - Variant55203, - Variant55204, - Variant55205, - Variant55206, - Variant55207, - Variant55208, - Variant55209, - Variant55210, - Variant55211, - Variant55212, - Variant55213, - Variant55214, - Variant55215, - Variant55216, - Variant55217, - Variant55218, - Variant55219, - Variant55220, - Variant55221, - Variant55222, - Variant55223, - Variant55224, - Variant55225, - Variant55226, - Variant55227, - Variant55228, - Variant55229, - Variant55230, - Variant55231, - Variant55232, - Variant55233, - Variant55234, - Variant55235, - Variant55236, - Variant55237, - Variant55238, - Variant55239, - Variant55240, - Variant55241, - Variant55242, - Variant55243, - Variant55244, - Variant55245, - Variant55246, - Variant55247, - Variant55248, - Variant55249, - Variant55250, - Variant55251, - Variant55252, - Variant55253, - Variant55254, - Variant55255, - Variant55256, - Variant55257, - Variant55258, - Variant55259, - Variant55260, - Variant55261, - Variant55262, - Variant55263, - Variant55264, - Variant55265, - Variant55266, - Variant55267, - Variant55268, - Variant55269, - Variant55270, - Variant55271, - Variant55272, - Variant55273, - Variant55274, - Variant55275, - Variant55276, - Variant55277, - Variant55278, - Variant55279, - Variant55280, - Variant55281, - Variant55282, - Variant55283, - Variant55284, - Variant55285, - Variant55286, - Variant55287, - Variant55288, - Variant55289, - Variant55290, - Variant55291, - Variant55292, - Variant55293, - Variant55294, - Variant55295, - Variant55296, - Variant55297, - Variant55298, - Variant55299, - Variant55300, - Variant55301, - Variant55302, - Variant55303, - Variant55304, - Variant55305, - Variant55306, - Variant55307, - Variant55308, - Variant55309, - Variant55310, - Variant55311, - Variant55312, - Variant55313, - Variant55314, - Variant55315, - Variant55316, - Variant55317, - Variant55318, - Variant55319, - Variant55320, - Variant55321, - Variant55322, - Variant55323, - Variant55324, - Variant55325, - Variant55326, - Variant55327, - Variant55328, - Variant55329, - Variant55330, - Variant55331, - Variant55332, - Variant55333, - Variant55334, - Variant55335, - Variant55336, - Variant55337, - Variant55338, - Variant55339, - Variant55340, - Variant55341, - Variant55342, - Variant55343, - Variant55344, - Variant55345, - Variant55346, - Variant55347, - Variant55348, - Variant55349, - Variant55350, - Variant55351, - Variant55352, - Variant55353, - Variant55354, - Variant55355, - Variant55356, - Variant55357, - Variant55358, - Variant55359, - Variant55360, - Variant55361, - Variant55362, - Variant55363, - Variant55364, - Variant55365, - Variant55366, - Variant55367, - Variant55368, - Variant55369, - Variant55370, - Variant55371, - Variant55372, - Variant55373, - Variant55374, - Variant55375, - Variant55376, - Variant55377, - Variant55378, - Variant55379, - Variant55380, - Variant55381, - Variant55382, - Variant55383, - Variant55384, - Variant55385, - Variant55386, - Variant55387, - Variant55388, - Variant55389, - Variant55390, - Variant55391, - Variant55392, - Variant55393, - Variant55394, - Variant55395, - Variant55396, - Variant55397, - Variant55398, - Variant55399, - Variant55400, - Variant55401, - Variant55402, - Variant55403, - Variant55404, - Variant55405, - Variant55406, - Variant55407, - Variant55408, - Variant55409, - Variant55410, - Variant55411, - Variant55412, - Variant55413, - Variant55414, - Variant55415, - Variant55416, - Variant55417, - Variant55418, - Variant55419, - Variant55420, - Variant55421, - Variant55422, - Variant55423, - Variant55424, - Variant55425, - Variant55426, - Variant55427, - Variant55428, - Variant55429, - Variant55430, - Variant55431, - Variant55432, - Variant55433, - Variant55434, - Variant55435, - Variant55436, - Variant55437, - Variant55438, - Variant55439, - Variant55440, - Variant55441, - Variant55442, - Variant55443, - Variant55444, - Variant55445, - Variant55446, - Variant55447, - Variant55448, - Variant55449, - Variant55450, - Variant55451, - Variant55452, - Variant55453, - Variant55454, - Variant55455, - Variant55456, - Variant55457, - Variant55458, - Variant55459, - Variant55460, - Variant55461, - Variant55462, - Variant55463, - Variant55464, - Variant55465, - Variant55466, - Variant55467, - Variant55468, - Variant55469, - Variant55470, - Variant55471, - Variant55472, - Variant55473, - Variant55474, - Variant55475, - Variant55476, - Variant55477, - Variant55478, - Variant55479, - Variant55480, - Variant55481, - Variant55482, - Variant55483, - Variant55484, - Variant55485, - Variant55486, - Variant55487, - Variant55488, - Variant55489, - Variant55490, - Variant55491, - Variant55492, - Variant55493, - Variant55494, - Variant55495, - Variant55496, - Variant55497, - Variant55498, - Variant55499, - Variant55500, - Variant55501, - Variant55502, - Variant55503, - Variant55504, - Variant55505, - Variant55506, - Variant55507, - Variant55508, - Variant55509, - Variant55510, - Variant55511, - Variant55512, - Variant55513, - Variant55514, - Variant55515, - Variant55516, - Variant55517, - Variant55518, - Variant55519, - Variant55520, - Variant55521, - Variant55522, - Variant55523, - Variant55524, - Variant55525, - Variant55526, - Variant55527, - Variant55528, - Variant55529, - Variant55530, - Variant55531, - Variant55532, - Variant55533, - Variant55534, - Variant55535, - Variant55536, - Variant55537, - Variant55538, - Variant55539, - Variant55540, - Variant55541, - Variant55542, - Variant55543, - Variant55544, - Variant55545, - Variant55546, - Variant55547, - Variant55548, - Variant55549, - Variant55550, - Variant55551, - Variant55552, - Variant55553, - Variant55554, - Variant55555, - Variant55556, - Variant55557, - Variant55558, - Variant55559, - Variant55560, - Variant55561, - Variant55562, - Variant55563, - Variant55564, - Variant55565, - Variant55566, - Variant55567, - Variant55568, - Variant55569, - Variant55570, - Variant55571, - Variant55572, - Variant55573, - Variant55574, - Variant55575, - Variant55576, - Variant55577, - Variant55578, - Variant55579, - Variant55580, - Variant55581, - Variant55582, - Variant55583, - Variant55584, - Variant55585, - Variant55586, - Variant55587, - Variant55588, - Variant55589, - Variant55590, - Variant55591, - Variant55592, - Variant55593, - Variant55594, - Variant55595, - Variant55596, - Variant55597, - Variant55598, - Variant55599, - Variant55600, - Variant55601, - Variant55602, - Variant55603, - Variant55604, - Variant55605, - Variant55606, - Variant55607, - Variant55608, - Variant55609, - Variant55610, - Variant55611, - Variant55612, - Variant55613, - Variant55614, - Variant55615, - Variant55616, - Variant55617, - Variant55618, - Variant55619, - Variant55620, - Variant55621, - Variant55622, - Variant55623, - Variant55624, - Variant55625, - Variant55626, - Variant55627, - Variant55628, - Variant55629, - Variant55630, - Variant55631, - Variant55632, - Variant55633, - Variant55634, - Variant55635, - Variant55636, - Variant55637, - Variant55638, - Variant55639, - Variant55640, - Variant55641, - Variant55642, - Variant55643, - Variant55644, - Variant55645, - Variant55646, - Variant55647, - Variant55648, - Variant55649, - Variant55650, - Variant55651, - Variant55652, - Variant55653, - Variant55654, - Variant55655, - Variant55656, - Variant55657, - Variant55658, - Variant55659, - Variant55660, - Variant55661, - Variant55662, - Variant55663, - Variant55664, - Variant55665, - Variant55666, - Variant55667, - Variant55668, - Variant55669, - Variant55670, - Variant55671, - Variant55672, - Variant55673, - Variant55674, - Variant55675, - Variant55676, - Variant55677, - Variant55678, - Variant55679, - Variant55680, - Variant55681, - Variant55682, - Variant55683, - Variant55684, - Variant55685, - Variant55686, - Variant55687, - Variant55688, - Variant55689, - Variant55690, - Variant55691, - Variant55692, - Variant55693, - Variant55694, - Variant55695, - Variant55696, - Variant55697, - Variant55698, - Variant55699, - Variant55700, - Variant55701, - Variant55702, - Variant55703, - Variant55704, - Variant55705, - Variant55706, - Variant55707, - Variant55708, - Variant55709, - Variant55710, - Variant55711, - Variant55712, - Variant55713, - Variant55714, - Variant55715, - Variant55716, - Variant55717, - Variant55718, - Variant55719, - Variant55720, - Variant55721, - Variant55722, - Variant55723, - Variant55724, - Variant55725, - Variant55726, - Variant55727, - Variant55728, - Variant55729, - Variant55730, - Variant55731, - Variant55732, - Variant55733, - Variant55734, - Variant55735, - Variant55736, - Variant55737, - Variant55738, - Variant55739, - Variant55740, - Variant55741, - Variant55742, - Variant55743, - Variant55744, - Variant55745, - Variant55746, - Variant55747, - Variant55748, - Variant55749, - Variant55750, - Variant55751, - Variant55752, - Variant55753, - Variant55754, - Variant55755, - Variant55756, - Variant55757, - Variant55758, - Variant55759, - Variant55760, - Variant55761, - Variant55762, - Variant55763, - Variant55764, - Variant55765, - Variant55766, - Variant55767, - Variant55768, - Variant55769, - Variant55770, - Variant55771, - Variant55772, - Variant55773, - Variant55774, - Variant55775, - Variant55776, - Variant55777, - Variant55778, - Variant55779, - Variant55780, - Variant55781, - Variant55782, - Variant55783, - Variant55784, - Variant55785, - Variant55786, - Variant55787, - Variant55788, - Variant55789, - Variant55790, - Variant55791, - Variant55792, - Variant55793, - Variant55794, - Variant55795, - Variant55796, - Variant55797, - Variant55798, - Variant55799, - Variant55800, - Variant55801, - Variant55802, - Variant55803, - Variant55804, - Variant55805, - Variant55806, - Variant55807, - Variant55808, - Variant55809, - Variant55810, - Variant55811, - Variant55812, - Variant55813, - Variant55814, - Variant55815, - Variant55816, - Variant55817, - Variant55818, - Variant55819, - Variant55820, - Variant55821, - Variant55822, - Variant55823, - Variant55824, - Variant55825, - Variant55826, - Variant55827, - Variant55828, - Variant55829, - Variant55830, - Variant55831, - Variant55832, - Variant55833, - Variant55834, - Variant55835, - Variant55836, - Variant55837, - Variant55838, - Variant55839, - Variant55840, - Variant55841, - Variant55842, - Variant55843, - Variant55844, - Variant55845, - Variant55846, - Variant55847, - Variant55848, - Variant55849, - Variant55850, - Variant55851, - Variant55852, - Variant55853, - Variant55854, - Variant55855, - Variant55856, - Variant55857, - Variant55858, - Variant55859, - Variant55860, - Variant55861, - Variant55862, - Variant55863, - Variant55864, - Variant55865, - Variant55866, - Variant55867, - Variant55868, - Variant55869, - Variant55870, - Variant55871, - Variant55872, - Variant55873, - Variant55874, - Variant55875, - Variant55876, - Variant55877, - Variant55878, - Variant55879, - Variant55880, - Variant55881, - Variant55882, - Variant55883, - Variant55884, - Variant55885, - Variant55886, - Variant55887, - Variant55888, - Variant55889, - Variant55890, - Variant55891, - Variant55892, - Variant55893, - Variant55894, - Variant55895, - Variant55896, - Variant55897, - Variant55898, - Variant55899, - Variant55900, - Variant55901, - Variant55902, - Variant55903, - Variant55904, - Variant55905, - Variant55906, - Variant55907, - Variant55908, - Variant55909, - Variant55910, - Variant55911, - Variant55912, - Variant55913, - Variant55914, - Variant55915, - Variant55916, - Variant55917, - Variant55918, - Variant55919, - Variant55920, - Variant55921, - Variant55922, - Variant55923, - Variant55924, - Variant55925, - Variant55926, - Variant55927, - Variant55928, - Variant55929, - Variant55930, - Variant55931, - Variant55932, - Variant55933, - Variant55934, - Variant55935, - Variant55936, - Variant55937, - Variant55938, - Variant55939, - Variant55940, - Variant55941, - Variant55942, - Variant55943, - Variant55944, - Variant55945, - Variant55946, - Variant55947, - Variant55948, - Variant55949, - Variant55950, - Variant55951, - Variant55952, - Variant55953, - Variant55954, - Variant55955, - Variant55956, - Variant55957, - Variant55958, - Variant55959, - Variant55960, - Variant55961, - Variant55962, - Variant55963, - Variant55964, - Variant55965, - Variant55966, - Variant55967, - Variant55968, - Variant55969, - Variant55970, - Variant55971, - Variant55972, - Variant55973, - Variant55974, - Variant55975, - Variant55976, - Variant55977, - Variant55978, - Variant55979, - Variant55980, - Variant55981, - Variant55982, - Variant55983, - Variant55984, - Variant55985, - Variant55986, - Variant55987, - Variant55988, - Variant55989, - Variant55990, - Variant55991, - Variant55992, - Variant55993, - Variant55994, - Variant55995, - Variant55996, - Variant55997, - Variant55998, - Variant55999, - Variant56000, - Variant56001, - Variant56002, - Variant56003, - Variant56004, - Variant56005, - Variant56006, - Variant56007, - Variant56008, - Variant56009, - Variant56010, - Variant56011, - Variant56012, - Variant56013, - Variant56014, - Variant56015, - Variant56016, - Variant56017, - Variant56018, - Variant56019, - Variant56020, - Variant56021, - Variant56022, - Variant56023, - Variant56024, - Variant56025, - Variant56026, - Variant56027, - Variant56028, - Variant56029, - Variant56030, - Variant56031, - Variant56032, - Variant56033, - Variant56034, - Variant56035, - Variant56036, - Variant56037, - Variant56038, - Variant56039, - Variant56040, - Variant56041, - Variant56042, - Variant56043, - Variant56044, - Variant56045, - Variant56046, - Variant56047, - Variant56048, - Variant56049, - Variant56050, - Variant56051, - Variant56052, - Variant56053, - Variant56054, - Variant56055, - Variant56056, - Variant56057, - Variant56058, - Variant56059, - Variant56060, - Variant56061, - Variant56062, - Variant56063, - Variant56064, - Variant56065, - Variant56066, - Variant56067, - Variant56068, - Variant56069, - Variant56070, - Variant56071, - Variant56072, - Variant56073, - Variant56074, - Variant56075, - Variant56076, - Variant56077, - Variant56078, - Variant56079, - Variant56080, - Variant56081, - Variant56082, - Variant56083, - Variant56084, - Variant56085, - Variant56086, - Variant56087, - Variant56088, - Variant56089, - Variant56090, - Variant56091, - Variant56092, - Variant56093, - Variant56094, - Variant56095, - Variant56096, - Variant56097, - Variant56098, - Variant56099, - Variant56100, - Variant56101, - Variant56102, - Variant56103, - Variant56104, - Variant56105, - Variant56106, - Variant56107, - Variant56108, - Variant56109, - Variant56110, - Variant56111, - Variant56112, - Variant56113, - Variant56114, - Variant56115, - Variant56116, - Variant56117, - Variant56118, - Variant56119, - Variant56120, - Variant56121, - Variant56122, - Variant56123, - Variant56124, - Variant56125, - Variant56126, - Variant56127, - Variant56128, - Variant56129, - Variant56130, - Variant56131, - Variant56132, - Variant56133, - Variant56134, - Variant56135, - Variant56136, - Variant56137, - Variant56138, - Variant56139, - Variant56140, - Variant56141, - Variant56142, - Variant56143, - Variant56144, - Variant56145, - Variant56146, - Variant56147, - Variant56148, - Variant56149, - Variant56150, - Variant56151, - Variant56152, - Variant56153, - Variant56154, - Variant56155, - Variant56156, - Variant56157, - Variant56158, - Variant56159, - Variant56160, - Variant56161, - Variant56162, - Variant56163, - Variant56164, - Variant56165, - Variant56166, - Variant56167, - Variant56168, - Variant56169, - Variant56170, - Variant56171, - Variant56172, - Variant56173, - Variant56174, - Variant56175, - Variant56176, - Variant56177, - Variant56178, - Variant56179, - Variant56180, - Variant56181, - Variant56182, - Variant56183, - Variant56184, - Variant56185, - Variant56186, - Variant56187, - Variant56188, - Variant56189, - Variant56190, - Variant56191, - Variant56192, - Variant56193, - Variant56194, - Variant56195, - Variant56196, - Variant56197, - Variant56198, - Variant56199, - Variant56200, - Variant56201, - Variant56202, - Variant56203, - Variant56204, - Variant56205, - Variant56206, - Variant56207, - Variant56208, - Variant56209, - Variant56210, - Variant56211, - Variant56212, - Variant56213, - Variant56214, - Variant56215, - Variant56216, - Variant56217, - Variant56218, - Variant56219, - Variant56220, - Variant56221, - Variant56222, - Variant56223, - Variant56224, - Variant56225, - Variant56226, - Variant56227, - Variant56228, - Variant56229, - Variant56230, - Variant56231, - Variant56232, - Variant56233, - Variant56234, - Variant56235, - Variant56236, - Variant56237, - Variant56238, - Variant56239, - Variant56240, - Variant56241, - Variant56242, - Variant56243, - Variant56244, - Variant56245, - Variant56246, - Variant56247, - Variant56248, - Variant56249, - Variant56250, - Variant56251, - Variant56252, - Variant56253, - Variant56254, - Variant56255, - Variant56256, - Variant56257, - Variant56258, - Variant56259, - Variant56260, - Variant56261, - Variant56262, - Variant56263, - Variant56264, - Variant56265, - Variant56266, - Variant56267, - Variant56268, - Variant56269, - Variant56270, - Variant56271, - Variant56272, - Variant56273, - Variant56274, - Variant56275, - Variant56276, - Variant56277, - Variant56278, - Variant56279, - Variant56280, - Variant56281, - Variant56282, - Variant56283, - Variant56284, - Variant56285, - Variant56286, - Variant56287, - Variant56288, - Variant56289, - Variant56290, - Variant56291, - Variant56292, - Variant56293, - Variant56294, - Variant56295, - Variant56296, - Variant56297, - Variant56298, - Variant56299, - Variant56300, - Variant56301, - Variant56302, - Variant56303, - Variant56304, - Variant56305, - Variant56306, - Variant56307, - Variant56308, - Variant56309, - Variant56310, - Variant56311, - Variant56312, - Variant56313, - Variant56314, - Variant56315, - Variant56316, - Variant56317, - Variant56318, - Variant56319, - Variant56320, - Variant56321, - Variant56322, - Variant56323, - Variant56324, - Variant56325, - Variant56326, - Variant56327, - Variant56328, - Variant56329, - Variant56330, - Variant56331, - Variant56332, - Variant56333, - Variant56334, - Variant56335, - Variant56336, - Variant56337, - Variant56338, - Variant56339, - Variant56340, - Variant56341, - Variant56342, - Variant56343, - Variant56344, - Variant56345, - Variant56346, - Variant56347, - Variant56348, - Variant56349, - Variant56350, - Variant56351, - Variant56352, - Variant56353, - Variant56354, - Variant56355, - Variant56356, - Variant56357, - Variant56358, - Variant56359, - Variant56360, - Variant56361, - Variant56362, - Variant56363, - Variant56364, - Variant56365, - Variant56366, - Variant56367, - Variant56368, - Variant56369, - Variant56370, - Variant56371, - Variant56372, - Variant56373, - Variant56374, - Variant56375, - Variant56376, - Variant56377, - Variant56378, - Variant56379, - Variant56380, - Variant56381, - Variant56382, - Variant56383, - Variant56384, - Variant56385, - Variant56386, - Variant56387, - Variant56388, - Variant56389, - Variant56390, - Variant56391, - Variant56392, - Variant56393, - Variant56394, - Variant56395, - Variant56396, - Variant56397, - Variant56398, - Variant56399, - Variant56400, - Variant56401, - Variant56402, - Variant56403, - Variant56404, - Variant56405, - Variant56406, - Variant56407, - Variant56408, - Variant56409, - Variant56410, - Variant56411, - Variant56412, - Variant56413, - Variant56414, - Variant56415, - Variant56416, - Variant56417, - Variant56418, - Variant56419, - Variant56420, - Variant56421, - Variant56422, - Variant56423, - Variant56424, - Variant56425, - Variant56426, - Variant56427, - Variant56428, - Variant56429, - Variant56430, - Variant56431, - Variant56432, - Variant56433, - Variant56434, - Variant56435, - Variant56436, - Variant56437, - Variant56438, - Variant56439, - Variant56440, - Variant56441, - Variant56442, - Variant56443, - Variant56444, - Variant56445, - Variant56446, - Variant56447, - Variant56448, - Variant56449, - Variant56450, - Variant56451, - Variant56452, - Variant56453, - Variant56454, - Variant56455, - Variant56456, - Variant56457, - Variant56458, - Variant56459, - Variant56460, - Variant56461, - Variant56462, - Variant56463, - Variant56464, - Variant56465, - Variant56466, - Variant56467, - Variant56468, - Variant56469, - Variant56470, - Variant56471, - Variant56472, - Variant56473, - Variant56474, - Variant56475, - Variant56476, - Variant56477, - Variant56478, - Variant56479, - Variant56480, - Variant56481, - Variant56482, - Variant56483, - Variant56484, - Variant56485, - Variant56486, - Variant56487, - Variant56488, - Variant56489, - Variant56490, - Variant56491, - Variant56492, - Variant56493, - Variant56494, - Variant56495, - Variant56496, - Variant56497, - Variant56498, - Variant56499, - Variant56500, - Variant56501, - Variant56502, - Variant56503, - Variant56504, - Variant56505, - Variant56506, - Variant56507, - Variant56508, - Variant56509, - Variant56510, - Variant56511, - Variant56512, - Variant56513, - Variant56514, - Variant56515, - Variant56516, - Variant56517, - Variant56518, - Variant56519, - Variant56520, - Variant56521, - Variant56522, - Variant56523, - Variant56524, - Variant56525, - Variant56526, - Variant56527, - Variant56528, - Variant56529, - Variant56530, - Variant56531, - Variant56532, - Variant56533, - Variant56534, - Variant56535, - Variant56536, - Variant56537, - Variant56538, - Variant56539, - Variant56540, - Variant56541, - Variant56542, - Variant56543, - Variant56544, - Variant56545, - Variant56546, - Variant56547, - Variant56548, - Variant56549, - Variant56550, - Variant56551, - Variant56552, - Variant56553, - Variant56554, - Variant56555, - Variant56556, - Variant56557, - Variant56558, - Variant56559, - Variant56560, - Variant56561, - Variant56562, - Variant56563, - Variant56564, - Variant56565, - Variant56566, - Variant56567, - Variant56568, - Variant56569, - Variant56570, - Variant56571, - Variant56572, - Variant56573, - Variant56574, - Variant56575, - Variant56576, - Variant56577, - Variant56578, - Variant56579, - Variant56580, - Variant56581, - Variant56582, - Variant56583, - Variant56584, - Variant56585, - Variant56586, - Variant56587, - Variant56588, - Variant56589, - Variant56590, - Variant56591, - Variant56592, - Variant56593, - Variant56594, - Variant56595, - Variant56596, - Variant56597, - Variant56598, - Variant56599, - Variant56600, - Variant56601, - Variant56602, - Variant56603, - Variant56604, - Variant56605, - Variant56606, - Variant56607, - Variant56608, - Variant56609, - Variant56610, - Variant56611, - Variant56612, - Variant56613, - Variant56614, - Variant56615, - Variant56616, - Variant56617, - Variant56618, - Variant56619, - Variant56620, - Variant56621, - Variant56622, - Variant56623, - Variant56624, - Variant56625, - Variant56626, - Variant56627, - Variant56628, - Variant56629, - Variant56630, - Variant56631, - Variant56632, - Variant56633, - Variant56634, - Variant56635, - Variant56636, - Variant56637, - Variant56638, - Variant56639, - Variant56640, - Variant56641, - Variant56642, - Variant56643, - Variant56644, - Variant56645, - Variant56646, - Variant56647, - Variant56648, - Variant56649, - Variant56650, - Variant56651, - Variant56652, - Variant56653, - Variant56654, - Variant56655, - Variant56656, - Variant56657, - Variant56658, - Variant56659, - Variant56660, - Variant56661, - Variant56662, - Variant56663, - Variant56664, - Variant56665, - Variant56666, - Variant56667, - Variant56668, - Variant56669, - Variant56670, - Variant56671, - Variant56672, - Variant56673, - Variant56674, - Variant56675, - Variant56676, - Variant56677, - Variant56678, - Variant56679, - Variant56680, - Variant56681, - Variant56682, - Variant56683, - Variant56684, - Variant56685, - Variant56686, - Variant56687, - Variant56688, - Variant56689, - Variant56690, - Variant56691, - Variant56692, - Variant56693, - Variant56694, - Variant56695, - Variant56696, - Variant56697, - Variant56698, - Variant56699, - Variant56700, - Variant56701, - Variant56702, - Variant56703, - Variant56704, - Variant56705, - Variant56706, - Variant56707, - Variant56708, - Variant56709, - Variant56710, - Variant56711, - Variant56712, - Variant56713, - Variant56714, - Variant56715, - Variant56716, - Variant56717, - Variant56718, - Variant56719, - Variant56720, - Variant56721, - Variant56722, - Variant56723, - Variant56724, - Variant56725, - Variant56726, - Variant56727, - Variant56728, - Variant56729, - Variant56730, - Variant56731, - Variant56732, - Variant56733, - Variant56734, - Variant56735, - Variant56736, - Variant56737, - Variant56738, - Variant56739, - Variant56740, - Variant56741, - Variant56742, - Variant56743, - Variant56744, - Variant56745, - Variant56746, - Variant56747, - Variant56748, - Variant56749, - Variant56750, - Variant56751, - Variant56752, - Variant56753, - Variant56754, - Variant56755, - Variant56756, - Variant56757, - Variant56758, - Variant56759, - Variant56760, - Variant56761, - Variant56762, - Variant56763, - Variant56764, - Variant56765, - Variant56766, - Variant56767, - Variant56768, - Variant56769, - Variant56770, - Variant56771, - Variant56772, - Variant56773, - Variant56774, - Variant56775, - Variant56776, - Variant56777, - Variant56778, - Variant56779, - Variant56780, - Variant56781, - Variant56782, - Variant56783, - Variant56784, - Variant56785, - Variant56786, - Variant56787, - Variant56788, - Variant56789, - Variant56790, - Variant56791, - Variant56792, - Variant56793, - Variant56794, - Variant56795, - Variant56796, - Variant56797, - Variant56798, - Variant56799, - Variant56800, - Variant56801, - Variant56802, - Variant56803, - Variant56804, - Variant56805, - Variant56806, - Variant56807, - Variant56808, - Variant56809, - Variant56810, - Variant56811, - Variant56812, - Variant56813, - Variant56814, - Variant56815, - Variant56816, - Variant56817, - Variant56818, - Variant56819, - Variant56820, - Variant56821, - Variant56822, - Variant56823, - Variant56824, - Variant56825, - Variant56826, - Variant56827, - Variant56828, - Variant56829, - Variant56830, - Variant56831, - Variant56832, - Variant56833, - Variant56834, - Variant56835, - Variant56836, - Variant56837, - Variant56838, - Variant56839, - Variant56840, - Variant56841, - Variant56842, - Variant56843, - Variant56844, - Variant56845, - Variant56846, - Variant56847, - Variant56848, - Variant56849, - Variant56850, - Variant56851, - Variant56852, - Variant56853, - Variant56854, - Variant56855, - Variant56856, - Variant56857, - Variant56858, - Variant56859, - Variant56860, - Variant56861, - Variant56862, - Variant56863, - Variant56864, - Variant56865, - Variant56866, - Variant56867, - Variant56868, - Variant56869, - Variant56870, - Variant56871, - Variant56872, - Variant56873, - Variant56874, - Variant56875, - Variant56876, - Variant56877, - Variant56878, - Variant56879, - Variant56880, - Variant56881, - Variant56882, - Variant56883, - Variant56884, - Variant56885, - Variant56886, - Variant56887, - Variant56888, - Variant56889, - Variant56890, - Variant56891, - Variant56892, - Variant56893, - Variant56894, - Variant56895, - Variant56896, - Variant56897, - Variant56898, - Variant56899, - Variant56900, - Variant56901, - Variant56902, - Variant56903, - Variant56904, - Variant56905, - Variant56906, - Variant56907, - Variant56908, - Variant56909, - Variant56910, - Variant56911, - Variant56912, - Variant56913, - Variant56914, - Variant56915, - Variant56916, - Variant56917, - Variant56918, - Variant56919, - Variant56920, - Variant56921, - Variant56922, - Variant56923, - Variant56924, - Variant56925, - Variant56926, - Variant56927, - Variant56928, - Variant56929, - Variant56930, - Variant56931, - Variant56932, - Variant56933, - Variant56934, - Variant56935, - Variant56936, - Variant56937, - Variant56938, - Variant56939, - Variant56940, - Variant56941, - Variant56942, - Variant56943, - Variant56944, - Variant56945, - Variant56946, - Variant56947, - Variant56948, - Variant56949, - Variant56950, - Variant56951, - Variant56952, - Variant56953, - Variant56954, - Variant56955, - Variant56956, - Variant56957, - Variant56958, - Variant56959, - Variant56960, - Variant56961, - Variant56962, - Variant56963, - Variant56964, - Variant56965, - Variant56966, - Variant56967, - Variant56968, - Variant56969, - Variant56970, - Variant56971, - Variant56972, - Variant56973, - Variant56974, - Variant56975, - Variant56976, - Variant56977, - Variant56978, - Variant56979, - Variant56980, - Variant56981, - Variant56982, - Variant56983, - Variant56984, - Variant56985, - Variant56986, - Variant56987, - Variant56988, - Variant56989, - Variant56990, - Variant56991, - Variant56992, - Variant56993, - Variant56994, - Variant56995, - Variant56996, - Variant56997, - Variant56998, - Variant56999, - Variant57000, - Variant57001, - Variant57002, - Variant57003, - Variant57004, - Variant57005, - Variant57006, - Variant57007, - Variant57008, - Variant57009, - Variant57010, - Variant57011, - Variant57012, - Variant57013, - Variant57014, - Variant57015, - Variant57016, - Variant57017, - Variant57018, - Variant57019, - Variant57020, - Variant57021, - Variant57022, - Variant57023, - Variant57024, - Variant57025, - Variant57026, - Variant57027, - Variant57028, - Variant57029, - Variant57030, - Variant57031, - Variant57032, - Variant57033, - Variant57034, - Variant57035, - Variant57036, - Variant57037, - Variant57038, - Variant57039, - Variant57040, - Variant57041, - Variant57042, - Variant57043, - Variant57044, - Variant57045, - Variant57046, - Variant57047, - Variant57048, - Variant57049, - Variant57050, - Variant57051, - Variant57052, - Variant57053, - Variant57054, - Variant57055, - Variant57056, - Variant57057, - Variant57058, - Variant57059, - Variant57060, - Variant57061, - Variant57062, - Variant57063, - Variant57064, - Variant57065, - Variant57066, - Variant57067, - Variant57068, - Variant57069, - Variant57070, - Variant57071, - Variant57072, - Variant57073, - Variant57074, - Variant57075, - Variant57076, - Variant57077, - Variant57078, - Variant57079, - Variant57080, - Variant57081, - Variant57082, - Variant57083, - Variant57084, - Variant57085, - Variant57086, - Variant57087, - Variant57088, - Variant57089, - Variant57090, - Variant57091, - Variant57092, - Variant57093, - Variant57094, - Variant57095, - Variant57096, - Variant57097, - Variant57098, - Variant57099, - Variant57100, - Variant57101, - Variant57102, - Variant57103, - Variant57104, - Variant57105, - Variant57106, - Variant57107, - Variant57108, - Variant57109, - Variant57110, - Variant57111, - Variant57112, - Variant57113, - Variant57114, - Variant57115, - Variant57116, - Variant57117, - Variant57118, - Variant57119, - Variant57120, - Variant57121, - Variant57122, - Variant57123, - Variant57124, - Variant57125, - Variant57126, - Variant57127, - Variant57128, - Variant57129, - Variant57130, - Variant57131, - Variant57132, - Variant57133, - Variant57134, - Variant57135, - Variant57136, - Variant57137, - Variant57138, - Variant57139, - Variant57140, - Variant57141, - Variant57142, - Variant57143, - Variant57144, - Variant57145, - Variant57146, - Variant57147, - Variant57148, - Variant57149, - Variant57150, - Variant57151, - Variant57152, - Variant57153, - Variant57154, - Variant57155, - Variant57156, - Variant57157, - Variant57158, - Variant57159, - Variant57160, - Variant57161, - Variant57162, - Variant57163, - Variant57164, - Variant57165, - Variant57166, - Variant57167, - Variant57168, - Variant57169, - Variant57170, - Variant57171, - Variant57172, - Variant57173, - Variant57174, - Variant57175, - Variant57176, - Variant57177, - Variant57178, - Variant57179, - Variant57180, - Variant57181, - Variant57182, - Variant57183, - Variant57184, - Variant57185, - Variant57186, - Variant57187, - Variant57188, - Variant57189, - Variant57190, - Variant57191, - Variant57192, - Variant57193, - Variant57194, - Variant57195, - Variant57196, - Variant57197, - Variant57198, - Variant57199, - Variant57200, - Variant57201, - Variant57202, - Variant57203, - Variant57204, - Variant57205, - Variant57206, - Variant57207, - Variant57208, - Variant57209, - Variant57210, - Variant57211, - Variant57212, - Variant57213, - Variant57214, - Variant57215, - Variant57216, - Variant57217, - Variant57218, - Variant57219, - Variant57220, - Variant57221, - Variant57222, - Variant57223, - Variant57224, - Variant57225, - Variant57226, - Variant57227, - Variant57228, - Variant57229, - Variant57230, - Variant57231, - Variant57232, - Variant57233, - Variant57234, - Variant57235, - Variant57236, - Variant57237, - Variant57238, - Variant57239, - Variant57240, - Variant57241, - Variant57242, - Variant57243, - Variant57244, - Variant57245, - Variant57246, - Variant57247, - Variant57248, - Variant57249, - Variant57250, - Variant57251, - Variant57252, - Variant57253, - Variant57254, - Variant57255, - Variant57256, - Variant57257, - Variant57258, - Variant57259, - Variant57260, - Variant57261, - Variant57262, - Variant57263, - Variant57264, - Variant57265, - Variant57266, - Variant57267, - Variant57268, - Variant57269, - Variant57270, - Variant57271, - Variant57272, - Variant57273, - Variant57274, - Variant57275, - Variant57276, - Variant57277, - Variant57278, - Variant57279, - Variant57280, - Variant57281, - Variant57282, - Variant57283, - Variant57284, - Variant57285, - Variant57286, - Variant57287, - Variant57288, - Variant57289, - Variant57290, - Variant57291, - Variant57292, - Variant57293, - Variant57294, - Variant57295, - Variant57296, - Variant57297, - Variant57298, - Variant57299, - Variant57300, - Variant57301, - Variant57302, - Variant57303, - Variant57304, - Variant57305, - Variant57306, - Variant57307, - Variant57308, - Variant57309, - Variant57310, - Variant57311, - Variant57312, - Variant57313, - Variant57314, - Variant57315, - Variant57316, - Variant57317, - Variant57318, - Variant57319, - Variant57320, - Variant57321, - Variant57322, - Variant57323, - Variant57324, - Variant57325, - Variant57326, - Variant57327, - Variant57328, - Variant57329, - Variant57330, - Variant57331, - Variant57332, - Variant57333, - Variant57334, - Variant57335, - Variant57336, - Variant57337, - Variant57338, - Variant57339, - Variant57340, - Variant57341, - Variant57342, - Variant57343, - Variant57344, - Variant57345, - Variant57346, - Variant57347, - Variant57348, - Variant57349, - Variant57350, - Variant57351, - Variant57352, - Variant57353, - Variant57354, - Variant57355, - Variant57356, - Variant57357, - Variant57358, - Variant57359, - Variant57360, - Variant57361, - Variant57362, - Variant57363, - Variant57364, - Variant57365, - Variant57366, - Variant57367, - Variant57368, - Variant57369, - Variant57370, - Variant57371, - Variant57372, - Variant57373, - Variant57374, - Variant57375, - Variant57376, - Variant57377, - Variant57378, - Variant57379, - Variant57380, - Variant57381, - Variant57382, - Variant57383, - Variant57384, - Variant57385, - Variant57386, - Variant57387, - Variant57388, - Variant57389, - Variant57390, - Variant57391, - Variant57392, - Variant57393, - Variant57394, - Variant57395, - Variant57396, - Variant57397, - Variant57398, - Variant57399, - Variant57400, - Variant57401, - Variant57402, - Variant57403, - Variant57404, - Variant57405, - Variant57406, - Variant57407, - Variant57408, - Variant57409, - Variant57410, - Variant57411, - Variant57412, - Variant57413, - Variant57414, - Variant57415, - Variant57416, - Variant57417, - Variant57418, - Variant57419, - Variant57420, - Variant57421, - Variant57422, - Variant57423, - Variant57424, - Variant57425, - Variant57426, - Variant57427, - Variant57428, - Variant57429, - Variant57430, - Variant57431, - Variant57432, - Variant57433, - Variant57434, - Variant57435, - Variant57436, - Variant57437, - Variant57438, - Variant57439, - Variant57440, - Variant57441, - Variant57442, - Variant57443, - Variant57444, - Variant57445, - Variant57446, - Variant57447, - Variant57448, - Variant57449, - Variant57450, - Variant57451, - Variant57452, - Variant57453, - Variant57454, - Variant57455, - Variant57456, - Variant57457, - Variant57458, - Variant57459, - Variant57460, - Variant57461, - Variant57462, - Variant57463, - Variant57464, - Variant57465, - Variant57466, - Variant57467, - Variant57468, - Variant57469, - Variant57470, - Variant57471, - Variant57472, - Variant57473, - Variant57474, - Variant57475, - Variant57476, - Variant57477, - Variant57478, - Variant57479, - Variant57480, - Variant57481, - Variant57482, - Variant57483, - Variant57484, - Variant57485, - Variant57486, - Variant57487, - Variant57488, - Variant57489, - Variant57490, - Variant57491, - Variant57492, - Variant57493, - Variant57494, - Variant57495, - Variant57496, - Variant57497, - Variant57498, - Variant57499, - Variant57500, - Variant57501, - Variant57502, - Variant57503, - Variant57504, - Variant57505, - Variant57506, - Variant57507, - Variant57508, - Variant57509, - Variant57510, - Variant57511, - Variant57512, - Variant57513, - Variant57514, - Variant57515, - Variant57516, - Variant57517, - Variant57518, - Variant57519, - Variant57520, - Variant57521, - Variant57522, - Variant57523, - Variant57524, - Variant57525, - Variant57526, - Variant57527, - Variant57528, - Variant57529, - Variant57530, - Variant57531, - Variant57532, - Variant57533, - Variant57534, - Variant57535, - Variant57536, - Variant57537, - Variant57538, - Variant57539, - Variant57540, - Variant57541, - Variant57542, - Variant57543, - Variant57544, - Variant57545, - Variant57546, - Variant57547, - Variant57548, - Variant57549, - Variant57550, - Variant57551, - Variant57552, - Variant57553, - Variant57554, - Variant57555, - Variant57556, - Variant57557, - Variant57558, - Variant57559, - Variant57560, - Variant57561, - Variant57562, - Variant57563, - Variant57564, - Variant57565, - Variant57566, - Variant57567, - Variant57568, - Variant57569, - Variant57570, - Variant57571, - Variant57572, - Variant57573, - Variant57574, - Variant57575, - Variant57576, - Variant57577, - Variant57578, - Variant57579, - Variant57580, - Variant57581, - Variant57582, - Variant57583, - Variant57584, - Variant57585, - Variant57586, - Variant57587, - Variant57588, - Variant57589, - Variant57590, - Variant57591, - Variant57592, - Variant57593, - Variant57594, - Variant57595, - Variant57596, - Variant57597, - Variant57598, - Variant57599, - Variant57600, - Variant57601, - Variant57602, - Variant57603, - Variant57604, - Variant57605, - Variant57606, - Variant57607, - Variant57608, - Variant57609, - Variant57610, - Variant57611, - Variant57612, - Variant57613, - Variant57614, - Variant57615, - Variant57616, - Variant57617, - Variant57618, - Variant57619, - Variant57620, - Variant57621, - Variant57622, - Variant57623, - Variant57624, - Variant57625, - Variant57626, - Variant57627, - Variant57628, - Variant57629, - Variant57630, - Variant57631, - Variant57632, - Variant57633, - Variant57634, - Variant57635, - Variant57636, - Variant57637, - Variant57638, - Variant57639, - Variant57640, - Variant57641, - Variant57642, - Variant57643, - Variant57644, - Variant57645, - Variant57646, - Variant57647, - Variant57648, - Variant57649, - Variant57650, - Variant57651, - Variant57652, - Variant57653, - Variant57654, - Variant57655, - Variant57656, - Variant57657, - Variant57658, - Variant57659, - Variant57660, - Variant57661, - Variant57662, - Variant57663, - Variant57664, - Variant57665, - Variant57666, - Variant57667, - Variant57668, - Variant57669, - Variant57670, - Variant57671, - Variant57672, - Variant57673, - Variant57674, - Variant57675, - Variant57676, - Variant57677, - Variant57678, - Variant57679, - Variant57680, - Variant57681, - Variant57682, - Variant57683, - Variant57684, - Variant57685, - Variant57686, - Variant57687, - Variant57688, - Variant57689, - Variant57690, - Variant57691, - Variant57692, - Variant57693, - Variant57694, - Variant57695, - Variant57696, - Variant57697, - Variant57698, - Variant57699, - Variant57700, - Variant57701, - Variant57702, - Variant57703, - Variant57704, - Variant57705, - Variant57706, - Variant57707, - Variant57708, - Variant57709, - Variant57710, - Variant57711, - Variant57712, - Variant57713, - Variant57714, - Variant57715, - Variant57716, - Variant57717, - Variant57718, - Variant57719, - Variant57720, - Variant57721, - Variant57722, - Variant57723, - Variant57724, - Variant57725, - Variant57726, - Variant57727, - Variant57728, - Variant57729, - Variant57730, - Variant57731, - Variant57732, - Variant57733, - Variant57734, - Variant57735, - Variant57736, - Variant57737, - Variant57738, - Variant57739, - Variant57740, - Variant57741, - Variant57742, - Variant57743, - Variant57744, - Variant57745, - Variant57746, - Variant57747, - Variant57748, - Variant57749, - Variant57750, - Variant57751, - Variant57752, - Variant57753, - Variant57754, - Variant57755, - Variant57756, - Variant57757, - Variant57758, - Variant57759, - Variant57760, - Variant57761, - Variant57762, - Variant57763, - Variant57764, - Variant57765, - Variant57766, - Variant57767, - Variant57768, - Variant57769, - Variant57770, - Variant57771, - Variant57772, - Variant57773, - Variant57774, - Variant57775, - Variant57776, - Variant57777, - Variant57778, - Variant57779, - Variant57780, - Variant57781, - Variant57782, - Variant57783, - Variant57784, - Variant57785, - Variant57786, - Variant57787, - Variant57788, - Variant57789, - Variant57790, - Variant57791, - Variant57792, - Variant57793, - Variant57794, - Variant57795, - Variant57796, - Variant57797, - Variant57798, - Variant57799, - Variant57800, - Variant57801, - Variant57802, - Variant57803, - Variant57804, - Variant57805, - Variant57806, - Variant57807, - Variant57808, - Variant57809, - Variant57810, - Variant57811, - Variant57812, - Variant57813, - Variant57814, - Variant57815, - Variant57816, - Variant57817, - Variant57818, - Variant57819, - Variant57820, - Variant57821, - Variant57822, - Variant57823, - Variant57824, - Variant57825, - Variant57826, - Variant57827, - Variant57828, - Variant57829, - Variant57830, - Variant57831, - Variant57832, - Variant57833, - Variant57834, - Variant57835, - Variant57836, - Variant57837, - Variant57838, - Variant57839, - Variant57840, - Variant57841, - Variant57842, - Variant57843, - Variant57844, - Variant57845, - Variant57846, - Variant57847, - Variant57848, - Variant57849, - Variant57850, - Variant57851, - Variant57852, - Variant57853, - Variant57854, - Variant57855, - Variant57856, - Variant57857, - Variant57858, - Variant57859, - Variant57860, - Variant57861, - Variant57862, - Variant57863, - Variant57864, - Variant57865, - Variant57866, - Variant57867, - Variant57868, - Variant57869, - Variant57870, - Variant57871, - Variant57872, - Variant57873, - Variant57874, - Variant57875, - Variant57876, - Variant57877, - Variant57878, - Variant57879, - Variant57880, - Variant57881, - Variant57882, - Variant57883, - Variant57884, - Variant57885, - Variant57886, - Variant57887, - Variant57888, - Variant57889, - Variant57890, - Variant57891, - Variant57892, - Variant57893, - Variant57894, - Variant57895, - Variant57896, - Variant57897, - Variant57898, - Variant57899, - Variant57900, - Variant57901, - Variant57902, - Variant57903, - Variant57904, - Variant57905, - Variant57906, - Variant57907, - Variant57908, - Variant57909, - Variant57910, - Variant57911, - Variant57912, - Variant57913, - Variant57914, - Variant57915, - Variant57916, - Variant57917, - Variant57918, - Variant57919, - Variant57920, - Variant57921, - Variant57922, - Variant57923, - Variant57924, - Variant57925, - Variant57926, - Variant57927, - Variant57928, - Variant57929, - Variant57930, - Variant57931, - Variant57932, - Variant57933, - Variant57934, - Variant57935, - Variant57936, - Variant57937, - Variant57938, - Variant57939, - Variant57940, - Variant57941, - Variant57942, - Variant57943, - Variant57944, - Variant57945, - Variant57946, - Variant57947, - Variant57948, - Variant57949, - Variant57950, - Variant57951, - Variant57952, - Variant57953, - Variant57954, - Variant57955, - Variant57956, - Variant57957, - Variant57958, - Variant57959, - Variant57960, - Variant57961, - Variant57962, - Variant57963, - Variant57964, - Variant57965, - Variant57966, - Variant57967, - Variant57968, - Variant57969, - Variant57970, - Variant57971, - Variant57972, - Variant57973, - Variant57974, - Variant57975, - Variant57976, - Variant57977, - Variant57978, - Variant57979, - Variant57980, - Variant57981, - Variant57982, - Variant57983, - Variant57984, - Variant57985, - Variant57986, - Variant57987, - Variant57988, - Variant57989, - Variant57990, - Variant57991, - Variant57992, - Variant57993, - Variant57994, - Variant57995, - Variant57996, - Variant57997, - Variant57998, - Variant57999, - Variant58000, - Variant58001, - Variant58002, - Variant58003, - Variant58004, - Variant58005, - Variant58006, - Variant58007, - Variant58008, - Variant58009, - Variant58010, - Variant58011, - Variant58012, - Variant58013, - Variant58014, - Variant58015, - Variant58016, - Variant58017, - Variant58018, - Variant58019, - Variant58020, - Variant58021, - Variant58022, - Variant58023, - Variant58024, - Variant58025, - Variant58026, - Variant58027, - Variant58028, - Variant58029, - Variant58030, - Variant58031, - Variant58032, - Variant58033, - Variant58034, - Variant58035, - Variant58036, - Variant58037, - Variant58038, - Variant58039, - Variant58040, - Variant58041, - Variant58042, - Variant58043, - Variant58044, - Variant58045, - Variant58046, - Variant58047, - Variant58048, - Variant58049, - Variant58050, - Variant58051, - Variant58052, - Variant58053, - Variant58054, - Variant58055, - Variant58056, - Variant58057, - Variant58058, - Variant58059, - Variant58060, - Variant58061, - Variant58062, - Variant58063, - Variant58064, - Variant58065, - Variant58066, - Variant58067, - Variant58068, - Variant58069, - Variant58070, - Variant58071, - Variant58072, - Variant58073, - Variant58074, - Variant58075, - Variant58076, - Variant58077, - Variant58078, - Variant58079, - Variant58080, - Variant58081, - Variant58082, - Variant58083, - Variant58084, - Variant58085, - Variant58086, - Variant58087, - Variant58088, - Variant58089, - Variant58090, - Variant58091, - Variant58092, - Variant58093, - Variant58094, - Variant58095, - Variant58096, - Variant58097, - Variant58098, - Variant58099, - Variant58100, - Variant58101, - Variant58102, - Variant58103, - Variant58104, - Variant58105, - Variant58106, - Variant58107, - Variant58108, - Variant58109, - Variant58110, - Variant58111, - Variant58112, - Variant58113, - Variant58114, - Variant58115, - Variant58116, - Variant58117, - Variant58118, - Variant58119, - Variant58120, - Variant58121, - Variant58122, - Variant58123, - Variant58124, - Variant58125, - Variant58126, - Variant58127, - Variant58128, - Variant58129, - Variant58130, - Variant58131, - Variant58132, - Variant58133, - Variant58134, - Variant58135, - Variant58136, - Variant58137, - Variant58138, - Variant58139, - Variant58140, - Variant58141, - Variant58142, - Variant58143, - Variant58144, - Variant58145, - Variant58146, - Variant58147, - Variant58148, - Variant58149, - Variant58150, - Variant58151, - Variant58152, - Variant58153, - Variant58154, - Variant58155, - Variant58156, - Variant58157, - Variant58158, - Variant58159, - Variant58160, - Variant58161, - Variant58162, - Variant58163, - Variant58164, - Variant58165, - Variant58166, - Variant58167, - Variant58168, - Variant58169, - Variant58170, - Variant58171, - Variant58172, - Variant58173, - Variant58174, - Variant58175, - Variant58176, - Variant58177, - Variant58178, - Variant58179, - Variant58180, - Variant58181, - Variant58182, - Variant58183, - Variant58184, - Variant58185, - Variant58186, - Variant58187, - Variant58188, - Variant58189, - Variant58190, - Variant58191, - Variant58192, - Variant58193, - Variant58194, - Variant58195, - Variant58196, - Variant58197, - Variant58198, - Variant58199, - Variant58200, - Variant58201, - Variant58202, - Variant58203, - Variant58204, - Variant58205, - Variant58206, - Variant58207, - Variant58208, - Variant58209, - Variant58210, - Variant58211, - Variant58212, - Variant58213, - Variant58214, - Variant58215, - Variant58216, - Variant58217, - Variant58218, - Variant58219, - Variant58220, - Variant58221, - Variant58222, - Variant58223, - Variant58224, - Variant58225, - Variant58226, - Variant58227, - Variant58228, - Variant58229, - Variant58230, - Variant58231, - Variant58232, - Variant58233, - Variant58234, - Variant58235, - Variant58236, - Variant58237, - Variant58238, - Variant58239, - Variant58240, - Variant58241, - Variant58242, - Variant58243, - Variant58244, - Variant58245, - Variant58246, - Variant58247, - Variant58248, - Variant58249, - Variant58250, - Variant58251, - Variant58252, - Variant58253, - Variant58254, - Variant58255, - Variant58256, - Variant58257, - Variant58258, - Variant58259, - Variant58260, - Variant58261, - Variant58262, - Variant58263, - Variant58264, - Variant58265, - Variant58266, - Variant58267, - Variant58268, - Variant58269, - Variant58270, - Variant58271, - Variant58272, - Variant58273, - Variant58274, - Variant58275, - Variant58276, - Variant58277, - Variant58278, - Variant58279, - Variant58280, - Variant58281, - Variant58282, - Variant58283, - Variant58284, - Variant58285, - Variant58286, - Variant58287, - Variant58288, - Variant58289, - Variant58290, - Variant58291, - Variant58292, - Variant58293, - Variant58294, - Variant58295, - Variant58296, - Variant58297, - Variant58298, - Variant58299, - Variant58300, - Variant58301, - Variant58302, - Variant58303, - Variant58304, - Variant58305, - Variant58306, - Variant58307, - Variant58308, - Variant58309, - Variant58310, - Variant58311, - Variant58312, - Variant58313, - Variant58314, - Variant58315, - Variant58316, - Variant58317, - Variant58318, - Variant58319, - Variant58320, - Variant58321, - Variant58322, - Variant58323, - Variant58324, - Variant58325, - Variant58326, - Variant58327, - Variant58328, - Variant58329, - Variant58330, - Variant58331, - Variant58332, - Variant58333, - Variant58334, - Variant58335, - Variant58336, - Variant58337, - Variant58338, - Variant58339, - Variant58340, - Variant58341, - Variant58342, - Variant58343, - Variant58344, - Variant58345, - Variant58346, - Variant58347, - Variant58348, - Variant58349, - Variant58350, - Variant58351, - Variant58352, - Variant58353, - Variant58354, - Variant58355, - Variant58356, - Variant58357, - Variant58358, - Variant58359, - Variant58360, - Variant58361, - Variant58362, - Variant58363, - Variant58364, - Variant58365, - Variant58366, - Variant58367, - Variant58368, - Variant58369, - Variant58370, - Variant58371, - Variant58372, - Variant58373, - Variant58374, - Variant58375, - Variant58376, - Variant58377, - Variant58378, - Variant58379, - Variant58380, - Variant58381, - Variant58382, - Variant58383, - Variant58384, - Variant58385, - Variant58386, - Variant58387, - Variant58388, - Variant58389, - Variant58390, - Variant58391, - Variant58392, - Variant58393, - Variant58394, - Variant58395, - Variant58396, - Variant58397, - Variant58398, - Variant58399, - Variant58400, - Variant58401, - Variant58402, - Variant58403, - Variant58404, - Variant58405, - Variant58406, - Variant58407, - Variant58408, - Variant58409, - Variant58410, - Variant58411, - Variant58412, - Variant58413, - Variant58414, - Variant58415, - Variant58416, - Variant58417, - Variant58418, - Variant58419, - Variant58420, - Variant58421, - Variant58422, - Variant58423, - Variant58424, - Variant58425, - Variant58426, - Variant58427, - Variant58428, - Variant58429, - Variant58430, - Variant58431, - Variant58432, - Variant58433, - Variant58434, - Variant58435, - Variant58436, - Variant58437, - Variant58438, - Variant58439, - Variant58440, - Variant58441, - Variant58442, - Variant58443, - Variant58444, - Variant58445, - Variant58446, - Variant58447, - Variant58448, - Variant58449, - Variant58450, - Variant58451, - Variant58452, - Variant58453, - Variant58454, - Variant58455, - Variant58456, - Variant58457, - Variant58458, - Variant58459, - Variant58460, - Variant58461, - Variant58462, - Variant58463, - Variant58464, - Variant58465, - Variant58466, - Variant58467, - Variant58468, - Variant58469, - Variant58470, - Variant58471, - Variant58472, - Variant58473, - Variant58474, - Variant58475, - Variant58476, - Variant58477, - Variant58478, - Variant58479, - Variant58480, - Variant58481, - Variant58482, - Variant58483, - Variant58484, - Variant58485, - Variant58486, - Variant58487, - Variant58488, - Variant58489, - Variant58490, - Variant58491, - Variant58492, - Variant58493, - Variant58494, - Variant58495, - Variant58496, - Variant58497, - Variant58498, - Variant58499, - Variant58500, - Variant58501, - Variant58502, - Variant58503, - Variant58504, - Variant58505, - Variant58506, - Variant58507, - Variant58508, - Variant58509, - Variant58510, - Variant58511, - Variant58512, - Variant58513, - Variant58514, - Variant58515, - Variant58516, - Variant58517, - Variant58518, - Variant58519, - Variant58520, - Variant58521, - Variant58522, - Variant58523, - Variant58524, - Variant58525, - Variant58526, - Variant58527, - Variant58528, - Variant58529, - Variant58530, - Variant58531, - Variant58532, - Variant58533, - Variant58534, - Variant58535, - Variant58536, - Variant58537, - Variant58538, - Variant58539, - Variant58540, - Variant58541, - Variant58542, - Variant58543, - Variant58544, - Variant58545, - Variant58546, - Variant58547, - Variant58548, - Variant58549, - Variant58550, - Variant58551, - Variant58552, - Variant58553, - Variant58554, - Variant58555, - Variant58556, - Variant58557, - Variant58558, - Variant58559, - Variant58560, - Variant58561, - Variant58562, - Variant58563, - Variant58564, - Variant58565, - Variant58566, - Variant58567, - Variant58568, - Variant58569, - Variant58570, - Variant58571, - Variant58572, - Variant58573, - Variant58574, - Variant58575, - Variant58576, - Variant58577, - Variant58578, - Variant58579, - Variant58580, - Variant58581, - Variant58582, - Variant58583, - Variant58584, - Variant58585, - Variant58586, - Variant58587, - Variant58588, - Variant58589, - Variant58590, - Variant58591, - Variant58592, - Variant58593, - Variant58594, - Variant58595, - Variant58596, - Variant58597, - Variant58598, - Variant58599, - Variant58600, - Variant58601, - Variant58602, - Variant58603, - Variant58604, - Variant58605, - Variant58606, - Variant58607, - Variant58608, - Variant58609, - Variant58610, - Variant58611, - Variant58612, - Variant58613, - Variant58614, - Variant58615, - Variant58616, - Variant58617, - Variant58618, - Variant58619, - Variant58620, - Variant58621, - Variant58622, - Variant58623, - Variant58624, - Variant58625, - Variant58626, - Variant58627, - Variant58628, - Variant58629, - Variant58630, - Variant58631, - Variant58632, - Variant58633, - Variant58634, - Variant58635, - Variant58636, - Variant58637, - Variant58638, - Variant58639, - Variant58640, - Variant58641, - Variant58642, - Variant58643, - Variant58644, - Variant58645, - Variant58646, - Variant58647, - Variant58648, - Variant58649, - Variant58650, - Variant58651, - Variant58652, - Variant58653, - Variant58654, - Variant58655, - Variant58656, - Variant58657, - Variant58658, - Variant58659, - Variant58660, - Variant58661, - Variant58662, - Variant58663, - Variant58664, - Variant58665, - Variant58666, - Variant58667, - Variant58668, - Variant58669, - Variant58670, - Variant58671, - Variant58672, - Variant58673, - Variant58674, - Variant58675, - Variant58676, - Variant58677, - Variant58678, - Variant58679, - Variant58680, - Variant58681, - Variant58682, - Variant58683, - Variant58684, - Variant58685, - Variant58686, - Variant58687, - Variant58688, - Variant58689, - Variant58690, - Variant58691, - Variant58692, - Variant58693, - Variant58694, - Variant58695, - Variant58696, - Variant58697, - Variant58698, - Variant58699, - Variant58700, - Variant58701, - Variant58702, - Variant58703, - Variant58704, - Variant58705, - Variant58706, - Variant58707, - Variant58708, - Variant58709, - Variant58710, - Variant58711, - Variant58712, - Variant58713, - Variant58714, - Variant58715, - Variant58716, - Variant58717, - Variant58718, - Variant58719, - Variant58720, - Variant58721, - Variant58722, - Variant58723, - Variant58724, - Variant58725, - Variant58726, - Variant58727, - Variant58728, - Variant58729, - Variant58730, - Variant58731, - Variant58732, - Variant58733, - Variant58734, - Variant58735, - Variant58736, - Variant58737, - Variant58738, - Variant58739, - Variant58740, - Variant58741, - Variant58742, - Variant58743, - Variant58744, - Variant58745, - Variant58746, - Variant58747, - Variant58748, - Variant58749, - Variant58750, - Variant58751, - Variant58752, - Variant58753, - Variant58754, - Variant58755, - Variant58756, - Variant58757, - Variant58758, - Variant58759, - Variant58760, - Variant58761, - Variant58762, - Variant58763, - Variant58764, - Variant58765, - Variant58766, - Variant58767, - Variant58768, - Variant58769, - Variant58770, - Variant58771, - Variant58772, - Variant58773, - Variant58774, - Variant58775, - Variant58776, - Variant58777, - Variant58778, - Variant58779, - Variant58780, - Variant58781, - Variant58782, - Variant58783, - Variant58784, - Variant58785, - Variant58786, - Variant58787, - Variant58788, - Variant58789, - Variant58790, - Variant58791, - Variant58792, - Variant58793, - Variant58794, - Variant58795, - Variant58796, - Variant58797, - Variant58798, - Variant58799, - Variant58800, - Variant58801, - Variant58802, - Variant58803, - Variant58804, - Variant58805, - Variant58806, - Variant58807, - Variant58808, - Variant58809, - Variant58810, - Variant58811, - Variant58812, - Variant58813, - Variant58814, - Variant58815, - Variant58816, - Variant58817, - Variant58818, - Variant58819, - Variant58820, - Variant58821, - Variant58822, - Variant58823, - Variant58824, - Variant58825, - Variant58826, - Variant58827, - Variant58828, - Variant58829, - Variant58830, - Variant58831, - Variant58832, - Variant58833, - Variant58834, - Variant58835, - Variant58836, - Variant58837, - Variant58838, - Variant58839, - Variant58840, - Variant58841, - Variant58842, - Variant58843, - Variant58844, - Variant58845, - Variant58846, - Variant58847, - Variant58848, - Variant58849, - Variant58850, - Variant58851, - Variant58852, - Variant58853, - Variant58854, - Variant58855, - Variant58856, - Variant58857, - Variant58858, - Variant58859, - Variant58860, - Variant58861, - Variant58862, - Variant58863, - Variant58864, - Variant58865, - Variant58866, - Variant58867, - Variant58868, - Variant58869, - Variant58870, - Variant58871, - Variant58872, - Variant58873, - Variant58874, - Variant58875, - Variant58876, - Variant58877, - Variant58878, - Variant58879, - Variant58880, - Variant58881, - Variant58882, - Variant58883, - Variant58884, - Variant58885, - Variant58886, - Variant58887, - Variant58888, - Variant58889, - Variant58890, - Variant58891, - Variant58892, - Variant58893, - Variant58894, - Variant58895, - Variant58896, - Variant58897, - Variant58898, - Variant58899, - Variant58900, - Variant58901, - Variant58902, - Variant58903, - Variant58904, - Variant58905, - Variant58906, - Variant58907, - Variant58908, - Variant58909, - Variant58910, - Variant58911, - Variant58912, - Variant58913, - Variant58914, - Variant58915, - Variant58916, - Variant58917, - Variant58918, - Variant58919, - Variant58920, - Variant58921, - Variant58922, - Variant58923, - Variant58924, - Variant58925, - Variant58926, - Variant58927, - Variant58928, - Variant58929, - Variant58930, - Variant58931, - Variant58932, - Variant58933, - Variant58934, - Variant58935, - Variant58936, - Variant58937, - Variant58938, - Variant58939, - Variant58940, - Variant58941, - Variant58942, - Variant58943, - Variant58944, - Variant58945, - Variant58946, - Variant58947, - Variant58948, - Variant58949, - Variant58950, - Variant58951, - Variant58952, - Variant58953, - Variant58954, - Variant58955, - Variant58956, - Variant58957, - Variant58958, - Variant58959, - Variant58960, - Variant58961, - Variant58962, - Variant58963, - Variant58964, - Variant58965, - Variant58966, - Variant58967, - Variant58968, - Variant58969, - Variant58970, - Variant58971, - Variant58972, - Variant58973, - Variant58974, - Variant58975, - Variant58976, - Variant58977, - Variant58978, - Variant58979, - Variant58980, - Variant58981, - Variant58982, - Variant58983, - Variant58984, - Variant58985, - Variant58986, - Variant58987, - Variant58988, - Variant58989, - Variant58990, - Variant58991, - Variant58992, - Variant58993, - Variant58994, - Variant58995, - Variant58996, - Variant58997, - Variant58998, - Variant58999, - Variant59000, - Variant59001, - Variant59002, - Variant59003, - Variant59004, - Variant59005, - Variant59006, - Variant59007, - Variant59008, - Variant59009, - Variant59010, - Variant59011, - Variant59012, - Variant59013, - Variant59014, - Variant59015, - Variant59016, - Variant59017, - Variant59018, - Variant59019, - Variant59020, - Variant59021, - Variant59022, - Variant59023, - Variant59024, - Variant59025, - Variant59026, - Variant59027, - Variant59028, - Variant59029, - Variant59030, - Variant59031, - Variant59032, - Variant59033, - Variant59034, - Variant59035, - Variant59036, - Variant59037, - Variant59038, - Variant59039, - Variant59040, - Variant59041, - Variant59042, - Variant59043, - Variant59044, - Variant59045, - Variant59046, - Variant59047, - Variant59048, - Variant59049, - Variant59050, - Variant59051, - Variant59052, - Variant59053, - Variant59054, - Variant59055, - Variant59056, - Variant59057, - Variant59058, - Variant59059, - Variant59060, - Variant59061, - Variant59062, - Variant59063, - Variant59064, - Variant59065, - Variant59066, - Variant59067, - Variant59068, - Variant59069, - Variant59070, - Variant59071, - Variant59072, - Variant59073, - Variant59074, - Variant59075, - Variant59076, - Variant59077, - Variant59078, - Variant59079, - Variant59080, - Variant59081, - Variant59082, - Variant59083, - Variant59084, - Variant59085, - Variant59086, - Variant59087, - Variant59088, - Variant59089, - Variant59090, - Variant59091, - Variant59092, - Variant59093, - Variant59094, - Variant59095, - Variant59096, - Variant59097, - Variant59098, - Variant59099, - Variant59100, - Variant59101, - Variant59102, - Variant59103, - Variant59104, - Variant59105, - Variant59106, - Variant59107, - Variant59108, - Variant59109, - Variant59110, - Variant59111, - Variant59112, - Variant59113, - Variant59114, - Variant59115, - Variant59116, - Variant59117, - Variant59118, - Variant59119, - Variant59120, - Variant59121, - Variant59122, - Variant59123, - Variant59124, - Variant59125, - Variant59126, - Variant59127, - Variant59128, - Variant59129, - Variant59130, - Variant59131, - Variant59132, - Variant59133, - Variant59134, - Variant59135, - Variant59136, - Variant59137, - Variant59138, - Variant59139, - Variant59140, - Variant59141, - Variant59142, - Variant59143, - Variant59144, - Variant59145, - Variant59146, - Variant59147, - Variant59148, - Variant59149, - Variant59150, - Variant59151, - Variant59152, - Variant59153, - Variant59154, - Variant59155, - Variant59156, - Variant59157, - Variant59158, - Variant59159, - Variant59160, - Variant59161, - Variant59162, - Variant59163, - Variant59164, - Variant59165, - Variant59166, - Variant59167, - Variant59168, - Variant59169, - Variant59170, - Variant59171, - Variant59172, - Variant59173, - Variant59174, - Variant59175, - Variant59176, - Variant59177, - Variant59178, - Variant59179, - Variant59180, - Variant59181, - Variant59182, - Variant59183, - Variant59184, - Variant59185, - Variant59186, - Variant59187, - Variant59188, - Variant59189, - Variant59190, - Variant59191, - Variant59192, - Variant59193, - Variant59194, - Variant59195, - Variant59196, - Variant59197, - Variant59198, - Variant59199, - Variant59200, - Variant59201, - Variant59202, - Variant59203, - Variant59204, - Variant59205, - Variant59206, - Variant59207, - Variant59208, - Variant59209, - Variant59210, - Variant59211, - Variant59212, - Variant59213, - Variant59214, - Variant59215, - Variant59216, - Variant59217, - Variant59218, - Variant59219, - Variant59220, - Variant59221, - Variant59222, - Variant59223, - Variant59224, - Variant59225, - Variant59226, - Variant59227, - Variant59228, - Variant59229, - Variant59230, - Variant59231, - Variant59232, - Variant59233, - Variant59234, - Variant59235, - Variant59236, - Variant59237, - Variant59238, - Variant59239, - Variant59240, - Variant59241, - Variant59242, - Variant59243, - Variant59244, - Variant59245, - Variant59246, - Variant59247, - Variant59248, - Variant59249, - Variant59250, - Variant59251, - Variant59252, - Variant59253, - Variant59254, - Variant59255, - Variant59256, - Variant59257, - Variant59258, - Variant59259, - Variant59260, - Variant59261, - Variant59262, - Variant59263, - Variant59264, - Variant59265, - Variant59266, - Variant59267, - Variant59268, - Variant59269, - Variant59270, - Variant59271, - Variant59272, - Variant59273, - Variant59274, - Variant59275, - Variant59276, - Variant59277, - Variant59278, - Variant59279, - Variant59280, - Variant59281, - Variant59282, - Variant59283, - Variant59284, - Variant59285, - Variant59286, - Variant59287, - Variant59288, - Variant59289, - Variant59290, - Variant59291, - Variant59292, - Variant59293, - Variant59294, - Variant59295, - Variant59296, - Variant59297, - Variant59298, - Variant59299, - Variant59300, - Variant59301, - Variant59302, - Variant59303, - Variant59304, - Variant59305, - Variant59306, - Variant59307, - Variant59308, - Variant59309, - Variant59310, - Variant59311, - Variant59312, - Variant59313, - Variant59314, - Variant59315, - Variant59316, - Variant59317, - Variant59318, - Variant59319, - Variant59320, - Variant59321, - Variant59322, - Variant59323, - Variant59324, - Variant59325, - Variant59326, - Variant59327, - Variant59328, - Variant59329, - Variant59330, - Variant59331, - Variant59332, - Variant59333, - Variant59334, - Variant59335, - Variant59336, - Variant59337, - Variant59338, - Variant59339, - Variant59340, - Variant59341, - Variant59342, - Variant59343, - Variant59344, - Variant59345, - Variant59346, - Variant59347, - Variant59348, - Variant59349, - Variant59350, - Variant59351, - Variant59352, - Variant59353, - Variant59354, - Variant59355, - Variant59356, - Variant59357, - Variant59358, - Variant59359, - Variant59360, - Variant59361, - Variant59362, - Variant59363, - Variant59364, - Variant59365, - Variant59366, - Variant59367, - Variant59368, - Variant59369, - Variant59370, - Variant59371, - Variant59372, - Variant59373, - Variant59374, - Variant59375, - Variant59376, - Variant59377, - Variant59378, - Variant59379, - Variant59380, - Variant59381, - Variant59382, - Variant59383, - Variant59384, - Variant59385, - Variant59386, - Variant59387, - Variant59388, - Variant59389, - Variant59390, - Variant59391, - Variant59392, - Variant59393, - Variant59394, - Variant59395, - Variant59396, - Variant59397, - Variant59398, - Variant59399, - Variant59400, - Variant59401, - Variant59402, - Variant59403, - Variant59404, - Variant59405, - Variant59406, - Variant59407, - Variant59408, - Variant59409, - Variant59410, - Variant59411, - Variant59412, - Variant59413, - Variant59414, - Variant59415, - Variant59416, - Variant59417, - Variant59418, - Variant59419, - Variant59420, - Variant59421, - Variant59422, - Variant59423, - Variant59424, - Variant59425, - Variant59426, - Variant59427, - Variant59428, - Variant59429, - Variant59430, - Variant59431, - Variant59432, - Variant59433, - Variant59434, - Variant59435, - Variant59436, - Variant59437, - Variant59438, - Variant59439, - Variant59440, - Variant59441, - Variant59442, - Variant59443, - Variant59444, - Variant59445, - Variant59446, - Variant59447, - Variant59448, - Variant59449, - Variant59450, - Variant59451, - Variant59452, - Variant59453, - Variant59454, - Variant59455, - Variant59456, - Variant59457, - Variant59458, - Variant59459, - Variant59460, - Variant59461, - Variant59462, - Variant59463, - Variant59464, - Variant59465, - Variant59466, - Variant59467, - Variant59468, - Variant59469, - Variant59470, - Variant59471, - Variant59472, - Variant59473, - Variant59474, - Variant59475, - Variant59476, - Variant59477, - Variant59478, - Variant59479, - Variant59480, - Variant59481, - Variant59482, - Variant59483, - Variant59484, - Variant59485, - Variant59486, - Variant59487, - Variant59488, - Variant59489, - Variant59490, - Variant59491, - Variant59492, - Variant59493, - Variant59494, - Variant59495, - Variant59496, - Variant59497, - Variant59498, - Variant59499, - Variant59500, - Variant59501, - Variant59502, - Variant59503, - Variant59504, - Variant59505, - Variant59506, - Variant59507, - Variant59508, - Variant59509, - Variant59510, - Variant59511, - Variant59512, - Variant59513, - Variant59514, - Variant59515, - Variant59516, - Variant59517, - Variant59518, - Variant59519, - Variant59520, - Variant59521, - Variant59522, - Variant59523, - Variant59524, - Variant59525, - Variant59526, - Variant59527, - Variant59528, - Variant59529, - Variant59530, - Variant59531, - Variant59532, - Variant59533, - Variant59534, - Variant59535, - Variant59536, - Variant59537, - Variant59538, - Variant59539, - Variant59540, - Variant59541, - Variant59542, - Variant59543, - Variant59544, - Variant59545, - Variant59546, - Variant59547, - Variant59548, - Variant59549, - Variant59550, - Variant59551, - Variant59552, - Variant59553, - Variant59554, - Variant59555, - Variant59556, - Variant59557, - Variant59558, - Variant59559, - Variant59560, - Variant59561, - Variant59562, - Variant59563, - Variant59564, - Variant59565, - Variant59566, - Variant59567, - Variant59568, - Variant59569, - Variant59570, - Variant59571, - Variant59572, - Variant59573, - Variant59574, - Variant59575, - Variant59576, - Variant59577, - Variant59578, - Variant59579, - Variant59580, - Variant59581, - Variant59582, - Variant59583, - Variant59584, - Variant59585, - Variant59586, - Variant59587, - Variant59588, - Variant59589, - Variant59590, - Variant59591, - Variant59592, - Variant59593, - Variant59594, - Variant59595, - Variant59596, - Variant59597, - Variant59598, - Variant59599, - Variant59600, - Variant59601, - Variant59602, - Variant59603, - Variant59604, - Variant59605, - Variant59606, - Variant59607, - Variant59608, - Variant59609, - Variant59610, - Variant59611, - Variant59612, - Variant59613, - Variant59614, - Variant59615, - Variant59616, - Variant59617, - Variant59618, - Variant59619, - Variant59620, - Variant59621, - Variant59622, - Variant59623, - Variant59624, - Variant59625, - Variant59626, - Variant59627, - Variant59628, - Variant59629, - Variant59630, - Variant59631, - Variant59632, - Variant59633, - Variant59634, - Variant59635, - Variant59636, - Variant59637, - Variant59638, - Variant59639, - Variant59640, - Variant59641, - Variant59642, - Variant59643, - Variant59644, - Variant59645, - Variant59646, - Variant59647, - Variant59648, - Variant59649, - Variant59650, - Variant59651, - Variant59652, - Variant59653, - Variant59654, - Variant59655, - Variant59656, - Variant59657, - Variant59658, - Variant59659, - Variant59660, - Variant59661, - Variant59662, - Variant59663, - Variant59664, - Variant59665, - Variant59666, - Variant59667, - Variant59668, - Variant59669, - Variant59670, - Variant59671, - Variant59672, - Variant59673, - Variant59674, - Variant59675, - Variant59676, - Variant59677, - Variant59678, - Variant59679, - Variant59680, - Variant59681, - Variant59682, - Variant59683, - Variant59684, - Variant59685, - Variant59686, - Variant59687, - Variant59688, - Variant59689, - Variant59690, - Variant59691, - Variant59692, - Variant59693, - Variant59694, - Variant59695, - Variant59696, - Variant59697, - Variant59698, - Variant59699, - Variant59700, - Variant59701, - Variant59702, - Variant59703, - Variant59704, - Variant59705, - Variant59706, - Variant59707, - Variant59708, - Variant59709, - Variant59710, - Variant59711, - Variant59712, - Variant59713, - Variant59714, - Variant59715, - Variant59716, - Variant59717, - Variant59718, - Variant59719, - Variant59720, - Variant59721, - Variant59722, - Variant59723, - Variant59724, - Variant59725, - Variant59726, - Variant59727, - Variant59728, - Variant59729, - Variant59730, - Variant59731, - Variant59732, - Variant59733, - Variant59734, - Variant59735, - Variant59736, - Variant59737, - Variant59738, - Variant59739, - Variant59740, - Variant59741, - Variant59742, - Variant59743, - Variant59744, - Variant59745, - Variant59746, - Variant59747, - Variant59748, - Variant59749, - Variant59750, - Variant59751, - Variant59752, - Variant59753, - Variant59754, - Variant59755, - Variant59756, - Variant59757, - Variant59758, - Variant59759, - Variant59760, - Variant59761, - Variant59762, - Variant59763, - Variant59764, - Variant59765, - Variant59766, - Variant59767, - Variant59768, - Variant59769, - Variant59770, - Variant59771, - Variant59772, - Variant59773, - Variant59774, - Variant59775, - Variant59776, - Variant59777, - Variant59778, - Variant59779, - Variant59780, - Variant59781, - Variant59782, - Variant59783, - Variant59784, - Variant59785, - Variant59786, - Variant59787, - Variant59788, - Variant59789, - Variant59790, - Variant59791, - Variant59792, - Variant59793, - Variant59794, - Variant59795, - Variant59796, - Variant59797, - Variant59798, - Variant59799, - Variant59800, - Variant59801, - Variant59802, - Variant59803, - Variant59804, - Variant59805, - Variant59806, - Variant59807, - Variant59808, - Variant59809, - Variant59810, - Variant59811, - Variant59812, - Variant59813, - Variant59814, - Variant59815, - Variant59816, - Variant59817, - Variant59818, - Variant59819, - Variant59820, - Variant59821, - Variant59822, - Variant59823, - Variant59824, - Variant59825, - Variant59826, - Variant59827, - Variant59828, - Variant59829, - Variant59830, - Variant59831, - Variant59832, - Variant59833, - Variant59834, - Variant59835, - Variant59836, - Variant59837, - Variant59838, - Variant59839, - Variant59840, - Variant59841, - Variant59842, - Variant59843, - Variant59844, - Variant59845, - Variant59846, - Variant59847, - Variant59848, - Variant59849, - Variant59850, - Variant59851, - Variant59852, - Variant59853, - Variant59854, - Variant59855, - Variant59856, - Variant59857, - Variant59858, - Variant59859, - Variant59860, - Variant59861, - Variant59862, - Variant59863, - Variant59864, - Variant59865, - Variant59866, - Variant59867, - Variant59868, - Variant59869, - Variant59870, - Variant59871, - Variant59872, - Variant59873, - Variant59874, - Variant59875, - Variant59876, - Variant59877, - Variant59878, - Variant59879, - Variant59880, - Variant59881, - Variant59882, - Variant59883, - Variant59884, - Variant59885, - Variant59886, - Variant59887, - Variant59888, - Variant59889, - Variant59890, - Variant59891, - Variant59892, - Variant59893, - Variant59894, - Variant59895, - Variant59896, - Variant59897, - Variant59898, - Variant59899, - Variant59900, - Variant59901, - Variant59902, - Variant59903, - Variant59904, - Variant59905, - Variant59906, - Variant59907, - Variant59908, - Variant59909, - Variant59910, - Variant59911, - Variant59912, - Variant59913, - Variant59914, - Variant59915, - Variant59916, - Variant59917, - Variant59918, - Variant59919, - Variant59920, - Variant59921, - Variant59922, - Variant59923, - Variant59924, - Variant59925, - Variant59926, - Variant59927, - Variant59928, - Variant59929, - Variant59930, - Variant59931, - Variant59932, - Variant59933, - Variant59934, - Variant59935, - Variant59936, - Variant59937, - Variant59938, - Variant59939, - Variant59940, - Variant59941, - Variant59942, - Variant59943, - Variant59944, - Variant59945, - Variant59946, - Variant59947, - Variant59948, - Variant59949, - Variant59950, - Variant59951, - Variant59952, - Variant59953, - Variant59954, - Variant59955, - Variant59956, - Variant59957, - Variant59958, - Variant59959, - Variant59960, - Variant59961, - Variant59962, - Variant59963, - Variant59964, - Variant59965, - Variant59966, - Variant59967, - Variant59968, - Variant59969, - Variant59970, - Variant59971, - Variant59972, - Variant59973, - Variant59974, - Variant59975, - Variant59976, - Variant59977, - Variant59978, - Variant59979, - Variant59980, - Variant59981, - Variant59982, - Variant59983, - Variant59984, - Variant59985, - Variant59986, - Variant59987, - Variant59988, - Variant59989, - Variant59990, - Variant59991, - Variant59992, - Variant59993, - Variant59994, - Variant59995, - Variant59996, - Variant59997, - Variant59998, - Variant59999, - Variant60000, - Variant60001, - Variant60002, - Variant60003, - Variant60004, - Variant60005, - Variant60006, - Variant60007, - Variant60008, - Variant60009, - Variant60010, - Variant60011, - Variant60012, - Variant60013, - Variant60014, - Variant60015, - Variant60016, - Variant60017, - Variant60018, - Variant60019, - Variant60020, - Variant60021, - Variant60022, - Variant60023, - Variant60024, - Variant60025, - Variant60026, - Variant60027, - Variant60028, - Variant60029, - Variant60030, - Variant60031, - Variant60032, - Variant60033, - Variant60034, - Variant60035, - Variant60036, - Variant60037, - Variant60038, - Variant60039, - Variant60040, - Variant60041, - Variant60042, - Variant60043, - Variant60044, - Variant60045, - Variant60046, - Variant60047, - Variant60048, - Variant60049, - Variant60050, - Variant60051, - Variant60052, - Variant60053, - Variant60054, - Variant60055, - Variant60056, - Variant60057, - Variant60058, - Variant60059, - Variant60060, - Variant60061, - Variant60062, - Variant60063, - Variant60064, - Variant60065, - Variant60066, - Variant60067, - Variant60068, - Variant60069, - Variant60070, - Variant60071, - Variant60072, - Variant60073, - Variant60074, - Variant60075, - Variant60076, - Variant60077, - Variant60078, - Variant60079, - Variant60080, - Variant60081, - Variant60082, - Variant60083, - Variant60084, - Variant60085, - Variant60086, - Variant60087, - Variant60088, - Variant60089, - Variant60090, - Variant60091, - Variant60092, - Variant60093, - Variant60094, - Variant60095, - Variant60096, - Variant60097, - Variant60098, - Variant60099, - Variant60100, - Variant60101, - Variant60102, - Variant60103, - Variant60104, - Variant60105, - Variant60106, - Variant60107, - Variant60108, - Variant60109, - Variant60110, - Variant60111, - Variant60112, - Variant60113, - Variant60114, - Variant60115, - Variant60116, - Variant60117, - Variant60118, - Variant60119, - Variant60120, - Variant60121, - Variant60122, - Variant60123, - Variant60124, - Variant60125, - Variant60126, - Variant60127, - Variant60128, - Variant60129, - Variant60130, - Variant60131, - Variant60132, - Variant60133, - Variant60134, - Variant60135, - Variant60136, - Variant60137, - Variant60138, - Variant60139, - Variant60140, - Variant60141, - Variant60142, - Variant60143, - Variant60144, - Variant60145, - Variant60146, - Variant60147, - Variant60148, - Variant60149, - Variant60150, - Variant60151, - Variant60152, - Variant60153, - Variant60154, - Variant60155, - Variant60156, - Variant60157, - Variant60158, - Variant60159, - Variant60160, - Variant60161, - Variant60162, - Variant60163, - Variant60164, - Variant60165, - Variant60166, - Variant60167, - Variant60168, - Variant60169, - Variant60170, - Variant60171, - Variant60172, - Variant60173, - Variant60174, - Variant60175, - Variant60176, - Variant60177, - Variant60178, - Variant60179, - Variant60180, - Variant60181, - Variant60182, - Variant60183, - Variant60184, - Variant60185, - Variant60186, - Variant60187, - Variant60188, - Variant60189, - Variant60190, - Variant60191, - Variant60192, - Variant60193, - Variant60194, - Variant60195, - Variant60196, - Variant60197, - Variant60198, - Variant60199, - Variant60200, - Variant60201, - Variant60202, - Variant60203, - Variant60204, - Variant60205, - Variant60206, - Variant60207, - Variant60208, - Variant60209, - Variant60210, - Variant60211, - Variant60212, - Variant60213, - Variant60214, - Variant60215, - Variant60216, - Variant60217, - Variant60218, - Variant60219, - Variant60220, - Variant60221, - Variant60222, - Variant60223, - Variant60224, - Variant60225, - Variant60226, - Variant60227, - Variant60228, - Variant60229, - Variant60230, - Variant60231, - Variant60232, - Variant60233, - Variant60234, - Variant60235, - Variant60236, - Variant60237, - Variant60238, - Variant60239, - Variant60240, - Variant60241, - Variant60242, - Variant60243, - Variant60244, - Variant60245, - Variant60246, - Variant60247, - Variant60248, - Variant60249, - Variant60250, - Variant60251, - Variant60252, - Variant60253, - Variant60254, - Variant60255, - Variant60256, - Variant60257, - Variant60258, - Variant60259, - Variant60260, - Variant60261, - Variant60262, - Variant60263, - Variant60264, - Variant60265, - Variant60266, - Variant60267, - Variant60268, - Variant60269, - Variant60270, - Variant60271, - Variant60272, - Variant60273, - Variant60274, - Variant60275, - Variant60276, - Variant60277, - Variant60278, - Variant60279, - Variant60280, - Variant60281, - Variant60282, - Variant60283, - Variant60284, - Variant60285, - Variant60286, - Variant60287, - Variant60288, - Variant60289, - Variant60290, - Variant60291, - Variant60292, - Variant60293, - Variant60294, - Variant60295, - Variant60296, - Variant60297, - Variant60298, - Variant60299, - Variant60300, - Variant60301, - Variant60302, - Variant60303, - Variant60304, - Variant60305, - Variant60306, - Variant60307, - Variant60308, - Variant60309, - Variant60310, - Variant60311, - Variant60312, - Variant60313, - Variant60314, - Variant60315, - Variant60316, - Variant60317, - Variant60318, - Variant60319, - Variant60320, - Variant60321, - Variant60322, - Variant60323, - Variant60324, - Variant60325, - Variant60326, - Variant60327, - Variant60328, - Variant60329, - Variant60330, - Variant60331, - Variant60332, - Variant60333, - Variant60334, - Variant60335, - Variant60336, - Variant60337, - Variant60338, - Variant60339, - Variant60340, - Variant60341, - Variant60342, - Variant60343, - Variant60344, - Variant60345, - Variant60346, - Variant60347, - Variant60348, - Variant60349, - Variant60350, - Variant60351, - Variant60352, - Variant60353, - Variant60354, - Variant60355, - Variant60356, - Variant60357, - Variant60358, - Variant60359, - Variant60360, - Variant60361, - Variant60362, - Variant60363, - Variant60364, - Variant60365, - Variant60366, - Variant60367, - Variant60368, - Variant60369, - Variant60370, - Variant60371, - Variant60372, - Variant60373, - Variant60374, - Variant60375, - Variant60376, - Variant60377, - Variant60378, - Variant60379, - Variant60380, - Variant60381, - Variant60382, - Variant60383, - Variant60384, - Variant60385, - Variant60386, - Variant60387, - Variant60388, - Variant60389, - Variant60390, - Variant60391, - Variant60392, - Variant60393, - Variant60394, - Variant60395, - Variant60396, - Variant60397, - Variant60398, - Variant60399, - Variant60400, - Variant60401, - Variant60402, - Variant60403, - Variant60404, - Variant60405, - Variant60406, - Variant60407, - Variant60408, - Variant60409, - Variant60410, - Variant60411, - Variant60412, - Variant60413, - Variant60414, - Variant60415, - Variant60416, - Variant60417, - Variant60418, - Variant60419, - Variant60420, - Variant60421, - Variant60422, - Variant60423, - Variant60424, - Variant60425, - Variant60426, - Variant60427, - Variant60428, - Variant60429, - Variant60430, - Variant60431, - Variant60432, - Variant60433, - Variant60434, - Variant60435, - Variant60436, - Variant60437, - Variant60438, - Variant60439, - Variant60440, - Variant60441, - Variant60442, - Variant60443, - Variant60444, - Variant60445, - Variant60446, - Variant60447, - Variant60448, - Variant60449, - Variant60450, - Variant60451, - Variant60452, - Variant60453, - Variant60454, - Variant60455, - Variant60456, - Variant60457, - Variant60458, - Variant60459, - Variant60460, - Variant60461, - Variant60462, - Variant60463, - Variant60464, - Variant60465, - Variant60466, - Variant60467, - Variant60468, - Variant60469, - Variant60470, - Variant60471, - Variant60472, - Variant60473, - Variant60474, - Variant60475, - Variant60476, - Variant60477, - Variant60478, - Variant60479, - Variant60480, - Variant60481, - Variant60482, - Variant60483, - Variant60484, - Variant60485, - Variant60486, - Variant60487, - Variant60488, - Variant60489, - Variant60490, - Variant60491, - Variant60492, - Variant60493, - Variant60494, - Variant60495, - Variant60496, - Variant60497, - Variant60498, - Variant60499, - Variant60500, - Variant60501, - Variant60502, - Variant60503, - Variant60504, - Variant60505, - Variant60506, - Variant60507, - Variant60508, - Variant60509, - Variant60510, - Variant60511, - Variant60512, - Variant60513, - Variant60514, - Variant60515, - Variant60516, - Variant60517, - Variant60518, - Variant60519, - Variant60520, - Variant60521, - Variant60522, - Variant60523, - Variant60524, - Variant60525, - Variant60526, - Variant60527, - Variant60528, - Variant60529, - Variant60530, - Variant60531, - Variant60532, - Variant60533, - Variant60534, - Variant60535, - Variant60536, - Variant60537, - Variant60538, - Variant60539, - Variant60540, - Variant60541, - Variant60542, - Variant60543, - Variant60544, - Variant60545, - Variant60546, - Variant60547, - Variant60548, - Variant60549, - Variant60550, - Variant60551, - Variant60552, - Variant60553, - Variant60554, - Variant60555, - Variant60556, - Variant60557, - Variant60558, - Variant60559, - Variant60560, - Variant60561, - Variant60562, - Variant60563, - Variant60564, - Variant60565, - Variant60566, - Variant60567, - Variant60568, - Variant60569, - Variant60570, - Variant60571, - Variant60572, - Variant60573, - Variant60574, - Variant60575, - Variant60576, - Variant60577, - Variant60578, - Variant60579, - Variant60580, - Variant60581, - Variant60582, - Variant60583, - Variant60584, - Variant60585, - Variant60586, - Variant60587, - Variant60588, - Variant60589, - Variant60590, - Variant60591, - Variant60592, - Variant60593, - Variant60594, - Variant60595, - Variant60596, - Variant60597, - Variant60598, - Variant60599, - Variant60600, - Variant60601, - Variant60602, - Variant60603, - Variant60604, - Variant60605, - Variant60606, - Variant60607, - Variant60608, - Variant60609, - Variant60610, - Variant60611, - Variant60612, - Variant60613, - Variant60614, - Variant60615, - Variant60616, - Variant60617, - Variant60618, - Variant60619, - Variant60620, - Variant60621, - Variant60622, - Variant60623, - Variant60624, - Variant60625, - Variant60626, - Variant60627, - Variant60628, - Variant60629, - Variant60630, - Variant60631, - Variant60632, - Variant60633, - Variant60634, - Variant60635, - Variant60636, - Variant60637, - Variant60638, - Variant60639, - Variant60640, - Variant60641, - Variant60642, - Variant60643, - Variant60644, - Variant60645, - Variant60646, - Variant60647, - Variant60648, - Variant60649, - Variant60650, - Variant60651, - Variant60652, - Variant60653, - Variant60654, - Variant60655, - Variant60656, - Variant60657, - Variant60658, - Variant60659, - Variant60660, - Variant60661, - Variant60662, - Variant60663, - Variant60664, - Variant60665, - Variant60666, - Variant60667, - Variant60668, - Variant60669, - Variant60670, - Variant60671, - Variant60672, - Variant60673, - Variant60674, - Variant60675, - Variant60676, - Variant60677, - Variant60678, - Variant60679, - Variant60680, - Variant60681, - Variant60682, - Variant60683, - Variant60684, - Variant60685, - Variant60686, - Variant60687, - Variant60688, - Variant60689, - Variant60690, - Variant60691, - Variant60692, - Variant60693, - Variant60694, - Variant60695, - Variant60696, - Variant60697, - Variant60698, - Variant60699, - Variant60700, - Variant60701, - Variant60702, - Variant60703, - Variant60704, - Variant60705, - Variant60706, - Variant60707, - Variant60708, - Variant60709, - Variant60710, - Variant60711, - Variant60712, - Variant60713, - Variant60714, - Variant60715, - Variant60716, - Variant60717, - Variant60718, - Variant60719, - Variant60720, - Variant60721, - Variant60722, - Variant60723, - Variant60724, - Variant60725, - Variant60726, - Variant60727, - Variant60728, - Variant60729, - Variant60730, - Variant60731, - Variant60732, - Variant60733, - Variant60734, - Variant60735, - Variant60736, - Variant60737, - Variant60738, - Variant60739, - Variant60740, - Variant60741, - Variant60742, - Variant60743, - Variant60744, - Variant60745, - Variant60746, - Variant60747, - Variant60748, - Variant60749, - Variant60750, - Variant60751, - Variant60752, - Variant60753, - Variant60754, - Variant60755, - Variant60756, - Variant60757, - Variant60758, - Variant60759, - Variant60760, - Variant60761, - Variant60762, - Variant60763, - Variant60764, - Variant60765, - Variant60766, - Variant60767, - Variant60768, - Variant60769, - Variant60770, - Variant60771, - Variant60772, - Variant60773, - Variant60774, - Variant60775, - Variant60776, - Variant60777, - Variant60778, - Variant60779, - Variant60780, - Variant60781, - Variant60782, - Variant60783, - Variant60784, - Variant60785, - Variant60786, - Variant60787, - Variant60788, - Variant60789, - Variant60790, - Variant60791, - Variant60792, - Variant60793, - Variant60794, - Variant60795, - Variant60796, - Variant60797, - Variant60798, - Variant60799, - Variant60800, - Variant60801, - Variant60802, - Variant60803, - Variant60804, - Variant60805, - Variant60806, - Variant60807, - Variant60808, - Variant60809, - Variant60810, - Variant60811, - Variant60812, - Variant60813, - Variant60814, - Variant60815, - Variant60816, - Variant60817, - Variant60818, - Variant60819, - Variant60820, - Variant60821, - Variant60822, - Variant60823, - Variant60824, - Variant60825, - Variant60826, - Variant60827, - Variant60828, - Variant60829, - Variant60830, - Variant60831, - Variant60832, - Variant60833, - Variant60834, - Variant60835, - Variant60836, - Variant60837, - Variant60838, - Variant60839, - Variant60840, - Variant60841, - Variant60842, - Variant60843, - Variant60844, - Variant60845, - Variant60846, - Variant60847, - Variant60848, - Variant60849, - Variant60850, - Variant60851, - Variant60852, - Variant60853, - Variant60854, - Variant60855, - Variant60856, - Variant60857, - Variant60858, - Variant60859, - Variant60860, - Variant60861, - Variant60862, - Variant60863, - Variant60864, - Variant60865, - Variant60866, - Variant60867, - Variant60868, - Variant60869, - Variant60870, - Variant60871, - Variant60872, - Variant60873, - Variant60874, - Variant60875, - Variant60876, - Variant60877, - Variant60878, - Variant60879, - Variant60880, - Variant60881, - Variant60882, - Variant60883, - Variant60884, - Variant60885, - Variant60886, - Variant60887, - Variant60888, - Variant60889, - Variant60890, - Variant60891, - Variant60892, - Variant60893, - Variant60894, - Variant60895, - Variant60896, - Variant60897, - Variant60898, - Variant60899, - Variant60900, - Variant60901, - Variant60902, - Variant60903, - Variant60904, - Variant60905, - Variant60906, - Variant60907, - Variant60908, - Variant60909, - Variant60910, - Variant60911, - Variant60912, - Variant60913, - Variant60914, - Variant60915, - Variant60916, - Variant60917, - Variant60918, - Variant60919, - Variant60920, - Variant60921, - Variant60922, - Variant60923, - Variant60924, - Variant60925, - Variant60926, - Variant60927, - Variant60928, - Variant60929, - Variant60930, - Variant60931, - Variant60932, - Variant60933, - Variant60934, - Variant60935, - Variant60936, - Variant60937, - Variant60938, - Variant60939, - Variant60940, - Variant60941, - Variant60942, - Variant60943, - Variant60944, - Variant60945, - Variant60946, - Variant60947, - Variant60948, - Variant60949, - Variant60950, - Variant60951, - Variant60952, - Variant60953, - Variant60954, - Variant60955, - Variant60956, - Variant60957, - Variant60958, - Variant60959, - Variant60960, - Variant60961, - Variant60962, - Variant60963, - Variant60964, - Variant60965, - Variant60966, - Variant60967, - Variant60968, - Variant60969, - Variant60970, - Variant60971, - Variant60972, - Variant60973, - Variant60974, - Variant60975, - Variant60976, - Variant60977, - Variant60978, - Variant60979, - Variant60980, - Variant60981, - Variant60982, - Variant60983, - Variant60984, - Variant60985, - Variant60986, - Variant60987, - Variant60988, - Variant60989, - Variant60990, - Variant60991, - Variant60992, - Variant60993, - Variant60994, - Variant60995, - Variant60996, - Variant60997, - Variant60998, - Variant60999, - Variant61000, - Variant61001, - Variant61002, - Variant61003, - Variant61004, - Variant61005, - Variant61006, - Variant61007, - Variant61008, - Variant61009, - Variant61010, - Variant61011, - Variant61012, - Variant61013, - Variant61014, - Variant61015, - Variant61016, - Variant61017, - Variant61018, - Variant61019, - Variant61020, - Variant61021, - Variant61022, - Variant61023, - Variant61024, - Variant61025, - Variant61026, - Variant61027, - Variant61028, - Variant61029, - Variant61030, - Variant61031, - Variant61032, - Variant61033, - Variant61034, - Variant61035, - Variant61036, - Variant61037, - Variant61038, - Variant61039, - Variant61040, - Variant61041, - Variant61042, - Variant61043, - Variant61044, - Variant61045, - Variant61046, - Variant61047, - Variant61048, - Variant61049, - Variant61050, - Variant61051, - Variant61052, - Variant61053, - Variant61054, - Variant61055, - Variant61056, - Variant61057, - Variant61058, - Variant61059, - Variant61060, - Variant61061, - Variant61062, - Variant61063, - Variant61064, - Variant61065, - Variant61066, - Variant61067, - Variant61068, - Variant61069, - Variant61070, - Variant61071, - Variant61072, - Variant61073, - Variant61074, - Variant61075, - Variant61076, - Variant61077, - Variant61078, - Variant61079, - Variant61080, - Variant61081, - Variant61082, - Variant61083, - Variant61084, - Variant61085, - Variant61086, - Variant61087, - Variant61088, - Variant61089, - Variant61090, - Variant61091, - Variant61092, - Variant61093, - Variant61094, - Variant61095, - Variant61096, - Variant61097, - Variant61098, - Variant61099, - Variant61100, - Variant61101, - Variant61102, - Variant61103, - Variant61104, - Variant61105, - Variant61106, - Variant61107, - Variant61108, - Variant61109, - Variant61110, - Variant61111, - Variant61112, - Variant61113, - Variant61114, - Variant61115, - Variant61116, - Variant61117, - Variant61118, - Variant61119, - Variant61120, - Variant61121, - Variant61122, - Variant61123, - Variant61124, - Variant61125, - Variant61126, - Variant61127, - Variant61128, - Variant61129, - Variant61130, - Variant61131, - Variant61132, - Variant61133, - Variant61134, - Variant61135, - Variant61136, - Variant61137, - Variant61138, - Variant61139, - Variant61140, - Variant61141, - Variant61142, - Variant61143, - Variant61144, - Variant61145, - Variant61146, - Variant61147, - Variant61148, - Variant61149, - Variant61150, - Variant61151, - Variant61152, - Variant61153, - Variant61154, - Variant61155, - Variant61156, - Variant61157, - Variant61158, - Variant61159, - Variant61160, - Variant61161, - Variant61162, - Variant61163, - Variant61164, - Variant61165, - Variant61166, - Variant61167, - Variant61168, - Variant61169, - Variant61170, - Variant61171, - Variant61172, - Variant61173, - Variant61174, - Variant61175, - Variant61176, - Variant61177, - Variant61178, - Variant61179, - Variant61180, - Variant61181, - Variant61182, - Variant61183, - Variant61184, - Variant61185, - Variant61186, - Variant61187, - Variant61188, - Variant61189, - Variant61190, - Variant61191, - Variant61192, - Variant61193, - Variant61194, - Variant61195, - Variant61196, - Variant61197, - Variant61198, - Variant61199, - Variant61200, - Variant61201, - Variant61202, - Variant61203, - Variant61204, - Variant61205, - Variant61206, - Variant61207, - Variant61208, - Variant61209, - Variant61210, - Variant61211, - Variant61212, - Variant61213, - Variant61214, - Variant61215, - Variant61216, - Variant61217, - Variant61218, - Variant61219, - Variant61220, - Variant61221, - Variant61222, - Variant61223, - Variant61224, - Variant61225, - Variant61226, - Variant61227, - Variant61228, - Variant61229, - Variant61230, - Variant61231, - Variant61232, - Variant61233, - Variant61234, - Variant61235, - Variant61236, - Variant61237, - Variant61238, - Variant61239, - Variant61240, - Variant61241, - Variant61242, - Variant61243, - Variant61244, - Variant61245, - Variant61246, - Variant61247, - Variant61248, - Variant61249, - Variant61250, - Variant61251, - Variant61252, - Variant61253, - Variant61254, - Variant61255, - Variant61256, - Variant61257, - Variant61258, - Variant61259, - Variant61260, - Variant61261, - Variant61262, - Variant61263, - Variant61264, - Variant61265, - Variant61266, - Variant61267, - Variant61268, - Variant61269, - Variant61270, - Variant61271, - Variant61272, - Variant61273, - Variant61274, - Variant61275, - Variant61276, - Variant61277, - Variant61278, - Variant61279, - Variant61280, - Variant61281, - Variant61282, - Variant61283, - Variant61284, - Variant61285, - Variant61286, - Variant61287, - Variant61288, - Variant61289, - Variant61290, - Variant61291, - Variant61292, - Variant61293, - Variant61294, - Variant61295, - Variant61296, - Variant61297, - Variant61298, - Variant61299, - Variant61300, - Variant61301, - Variant61302, - Variant61303, - Variant61304, - Variant61305, - Variant61306, - Variant61307, - Variant61308, - Variant61309, - Variant61310, - Variant61311, - Variant61312, - Variant61313, - Variant61314, - Variant61315, - Variant61316, - Variant61317, - Variant61318, - Variant61319, - Variant61320, - Variant61321, - Variant61322, - Variant61323, - Variant61324, - Variant61325, - Variant61326, - Variant61327, - Variant61328, - Variant61329, - Variant61330, - Variant61331, - Variant61332, - Variant61333, - Variant61334, - Variant61335, - Variant61336, - Variant61337, - Variant61338, - Variant61339, - Variant61340, - Variant61341, - Variant61342, - Variant61343, - Variant61344, - Variant61345, - Variant61346, - Variant61347, - Variant61348, - Variant61349, - Variant61350, - Variant61351, - Variant61352, - Variant61353, - Variant61354, - Variant61355, - Variant61356, - Variant61357, - Variant61358, - Variant61359, - Variant61360, - Variant61361, - Variant61362, - Variant61363, - Variant61364, - Variant61365, - Variant61366, - Variant61367, - Variant61368, - Variant61369, - Variant61370, - Variant61371, - Variant61372, - Variant61373, - Variant61374, - Variant61375, - Variant61376, - Variant61377, - Variant61378, - Variant61379, - Variant61380, - Variant61381, - Variant61382, - Variant61383, - Variant61384, - Variant61385, - Variant61386, - Variant61387, - Variant61388, - Variant61389, - Variant61390, - Variant61391, - Variant61392, - Variant61393, - Variant61394, - Variant61395, - Variant61396, - Variant61397, - Variant61398, - Variant61399, - Variant61400, - Variant61401, - Variant61402, - Variant61403, - Variant61404, - Variant61405, - Variant61406, - Variant61407, - Variant61408, - Variant61409, - Variant61410, - Variant61411, - Variant61412, - Variant61413, - Variant61414, - Variant61415, - Variant61416, - Variant61417, - Variant61418, - Variant61419, - Variant61420, - Variant61421, - Variant61422, - Variant61423, - Variant61424, - Variant61425, - Variant61426, - Variant61427, - Variant61428, - Variant61429, - Variant61430, - Variant61431, - Variant61432, - Variant61433, - Variant61434, - Variant61435, - Variant61436, - Variant61437, - Variant61438, - Variant61439, - Variant61440, - Variant61441, - Variant61442, - Variant61443, - Variant61444, - Variant61445, - Variant61446, - Variant61447, - Variant61448, - Variant61449, - Variant61450, - Variant61451, - Variant61452, - Variant61453, - Variant61454, - Variant61455, - Variant61456, - Variant61457, - Variant61458, - Variant61459, - Variant61460, - Variant61461, - Variant61462, - Variant61463, - Variant61464, - Variant61465, - Variant61466, - Variant61467, - Variant61468, - Variant61469, - Variant61470, - Variant61471, - Variant61472, - Variant61473, - Variant61474, - Variant61475, - Variant61476, - Variant61477, - Variant61478, - Variant61479, - Variant61480, - Variant61481, - Variant61482, - Variant61483, - Variant61484, - Variant61485, - Variant61486, - Variant61487, - Variant61488, - Variant61489, - Variant61490, - Variant61491, - Variant61492, - Variant61493, - Variant61494, - Variant61495, - Variant61496, - Variant61497, - Variant61498, - Variant61499, - Variant61500, - Variant61501, - Variant61502, - Variant61503, - Variant61504, - Variant61505, - Variant61506, - Variant61507, - Variant61508, - Variant61509, - Variant61510, - Variant61511, - Variant61512, - Variant61513, - Variant61514, - Variant61515, - Variant61516, - Variant61517, - Variant61518, - Variant61519, - Variant61520, - Variant61521, - Variant61522, - Variant61523, - Variant61524, - Variant61525, - Variant61526, - Variant61527, - Variant61528, - Variant61529, - Variant61530, - Variant61531, - Variant61532, - Variant61533, - Variant61534, - Variant61535, - Variant61536, - Variant61537, - Variant61538, - Variant61539, - Variant61540, - Variant61541, - Variant61542, - Variant61543, - Variant61544, - Variant61545, - Variant61546, - Variant61547, - Variant61548, - Variant61549, - Variant61550, - Variant61551, - Variant61552, - Variant61553, - Variant61554, - Variant61555, - Variant61556, - Variant61557, - Variant61558, - Variant61559, - Variant61560, - Variant61561, - Variant61562, - Variant61563, - Variant61564, - Variant61565, - Variant61566, - Variant61567, - Variant61568, - Variant61569, - Variant61570, - Variant61571, - Variant61572, - Variant61573, - Variant61574, - Variant61575, - Variant61576, - Variant61577, - Variant61578, - Variant61579, - Variant61580, - Variant61581, - Variant61582, - Variant61583, - Variant61584, - Variant61585, - Variant61586, - Variant61587, - Variant61588, - Variant61589, - Variant61590, - Variant61591, - Variant61592, - Variant61593, - Variant61594, - Variant61595, - Variant61596, - Variant61597, - Variant61598, - Variant61599, - Variant61600, - Variant61601, - Variant61602, - Variant61603, - Variant61604, - Variant61605, - Variant61606, - Variant61607, - Variant61608, - Variant61609, - Variant61610, - Variant61611, - Variant61612, - Variant61613, - Variant61614, - Variant61615, - Variant61616, - Variant61617, - Variant61618, - Variant61619, - Variant61620, - Variant61621, - Variant61622, - Variant61623, - Variant61624, - Variant61625, - Variant61626, - Variant61627, - Variant61628, - Variant61629, - Variant61630, - Variant61631, - Variant61632, - Variant61633, - Variant61634, - Variant61635, - Variant61636, - Variant61637, - Variant61638, - Variant61639, - Variant61640, - Variant61641, - Variant61642, - Variant61643, - Variant61644, - Variant61645, - Variant61646, - Variant61647, - Variant61648, - Variant61649, - Variant61650, - Variant61651, - Variant61652, - Variant61653, - Variant61654, - Variant61655, - Variant61656, - Variant61657, - Variant61658, - Variant61659, - Variant61660, - Variant61661, - Variant61662, - Variant61663, - Variant61664, - Variant61665, - Variant61666, - Variant61667, - Variant61668, - Variant61669, - Variant61670, - Variant61671, - Variant61672, - Variant61673, - Variant61674, - Variant61675, - Variant61676, - Variant61677, - Variant61678, - Variant61679, - Variant61680, - Variant61681, - Variant61682, - Variant61683, - Variant61684, - Variant61685, - Variant61686, - Variant61687, - Variant61688, - Variant61689, - Variant61690, - Variant61691, - Variant61692, - Variant61693, - Variant61694, - Variant61695, - Variant61696, - Variant61697, - Variant61698, - Variant61699, - Variant61700, - Variant61701, - Variant61702, - Variant61703, - Variant61704, - Variant61705, - Variant61706, - Variant61707, - Variant61708, - Variant61709, - Variant61710, - Variant61711, - Variant61712, - Variant61713, - Variant61714, - Variant61715, - Variant61716, - Variant61717, - Variant61718, - Variant61719, - Variant61720, - Variant61721, - Variant61722, - Variant61723, - Variant61724, - Variant61725, - Variant61726, - Variant61727, - Variant61728, - Variant61729, - Variant61730, - Variant61731, - Variant61732, - Variant61733, - Variant61734, - Variant61735, - Variant61736, - Variant61737, - Variant61738, - Variant61739, - Variant61740, - Variant61741, - Variant61742, - Variant61743, - Variant61744, - Variant61745, - Variant61746, - Variant61747, - Variant61748, - Variant61749, - Variant61750, - Variant61751, - Variant61752, - Variant61753, - Variant61754, - Variant61755, - Variant61756, - Variant61757, - Variant61758, - Variant61759, - Variant61760, - Variant61761, - Variant61762, - Variant61763, - Variant61764, - Variant61765, - Variant61766, - Variant61767, - Variant61768, - Variant61769, - Variant61770, - Variant61771, - Variant61772, - Variant61773, - Variant61774, - Variant61775, - Variant61776, - Variant61777, - Variant61778, - Variant61779, - Variant61780, - Variant61781, - Variant61782, - Variant61783, - Variant61784, - Variant61785, - Variant61786, - Variant61787, - Variant61788, - Variant61789, - Variant61790, - Variant61791, - Variant61792, - Variant61793, - Variant61794, - Variant61795, - Variant61796, - Variant61797, - Variant61798, - Variant61799, - Variant61800, - Variant61801, - Variant61802, - Variant61803, - Variant61804, - Variant61805, - Variant61806, - Variant61807, - Variant61808, - Variant61809, - Variant61810, - Variant61811, - Variant61812, - Variant61813, - Variant61814, - Variant61815, - Variant61816, - Variant61817, - Variant61818, - Variant61819, - Variant61820, - Variant61821, - Variant61822, - Variant61823, - Variant61824, - Variant61825, - Variant61826, - Variant61827, - Variant61828, - Variant61829, - Variant61830, - Variant61831, - Variant61832, - Variant61833, - Variant61834, - Variant61835, - Variant61836, - Variant61837, - Variant61838, - Variant61839, - Variant61840, - Variant61841, - Variant61842, - Variant61843, - Variant61844, - Variant61845, - Variant61846, - Variant61847, - Variant61848, - Variant61849, - Variant61850, - Variant61851, - Variant61852, - Variant61853, - Variant61854, - Variant61855, - Variant61856, - Variant61857, - Variant61858, - Variant61859, - Variant61860, - Variant61861, - Variant61862, - Variant61863, - Variant61864, - Variant61865, - Variant61866, - Variant61867, - Variant61868, - Variant61869, - Variant61870, - Variant61871, - Variant61872, - Variant61873, - Variant61874, - Variant61875, - Variant61876, - Variant61877, - Variant61878, - Variant61879, - Variant61880, - Variant61881, - Variant61882, - Variant61883, - Variant61884, - Variant61885, - Variant61886, - Variant61887, - Variant61888, - Variant61889, - Variant61890, - Variant61891, - Variant61892, - Variant61893, - Variant61894, - Variant61895, - Variant61896, - Variant61897, - Variant61898, - Variant61899, - Variant61900, - Variant61901, - Variant61902, - Variant61903, - Variant61904, - Variant61905, - Variant61906, - Variant61907, - Variant61908, - Variant61909, - Variant61910, - Variant61911, - Variant61912, - Variant61913, - Variant61914, - Variant61915, - Variant61916, - Variant61917, - Variant61918, - Variant61919, - Variant61920, - Variant61921, - Variant61922, - Variant61923, - Variant61924, - Variant61925, - Variant61926, - Variant61927, - Variant61928, - Variant61929, - Variant61930, - Variant61931, - Variant61932, - Variant61933, - Variant61934, - Variant61935, - Variant61936, - Variant61937, - Variant61938, - Variant61939, - Variant61940, - Variant61941, - Variant61942, - Variant61943, - Variant61944, - Variant61945, - Variant61946, - Variant61947, - Variant61948, - Variant61949, - Variant61950, - Variant61951, - Variant61952, - Variant61953, - Variant61954, - Variant61955, - Variant61956, - Variant61957, - Variant61958, - Variant61959, - Variant61960, - Variant61961, - Variant61962, - Variant61963, - Variant61964, - Variant61965, - Variant61966, - Variant61967, - Variant61968, - Variant61969, - Variant61970, - Variant61971, - Variant61972, - Variant61973, - Variant61974, - Variant61975, - Variant61976, - Variant61977, - Variant61978, - Variant61979, - Variant61980, - Variant61981, - Variant61982, - Variant61983, - Variant61984, - Variant61985, - Variant61986, - Variant61987, - Variant61988, - Variant61989, - Variant61990, - Variant61991, - Variant61992, - Variant61993, - Variant61994, - Variant61995, - Variant61996, - Variant61997, - Variant61998, - Variant61999, - Variant62000, - Variant62001, - Variant62002, - Variant62003, - Variant62004, - Variant62005, - Variant62006, - Variant62007, - Variant62008, - Variant62009, - Variant62010, - Variant62011, - Variant62012, - Variant62013, - Variant62014, - Variant62015, - Variant62016, - Variant62017, - Variant62018, - Variant62019, - Variant62020, - Variant62021, - Variant62022, - Variant62023, - Variant62024, - Variant62025, - Variant62026, - Variant62027, - Variant62028, - Variant62029, - Variant62030, - Variant62031, - Variant62032, - Variant62033, - Variant62034, - Variant62035, - Variant62036, - Variant62037, - Variant62038, - Variant62039, - Variant62040, - Variant62041, - Variant62042, - Variant62043, - Variant62044, - Variant62045, - Variant62046, - Variant62047, - Variant62048, - Variant62049, - Variant62050, - Variant62051, - Variant62052, - Variant62053, - Variant62054, - Variant62055, - Variant62056, - Variant62057, - Variant62058, - Variant62059, - Variant62060, - Variant62061, - Variant62062, - Variant62063, - Variant62064, - Variant62065, - Variant62066, - Variant62067, - Variant62068, - Variant62069, - Variant62070, - Variant62071, - Variant62072, - Variant62073, - Variant62074, - Variant62075, - Variant62076, - Variant62077, - Variant62078, - Variant62079, - Variant62080, - Variant62081, - Variant62082, - Variant62083, - Variant62084, - Variant62085, - Variant62086, - Variant62087, - Variant62088, - Variant62089, - Variant62090, - Variant62091, - Variant62092, - Variant62093, - Variant62094, - Variant62095, - Variant62096, - Variant62097, - Variant62098, - Variant62099, - Variant62100, - Variant62101, - Variant62102, - Variant62103, - Variant62104, - Variant62105, - Variant62106, - Variant62107, - Variant62108, - Variant62109, - Variant62110, - Variant62111, - Variant62112, - Variant62113, - Variant62114, - Variant62115, - Variant62116, - Variant62117, - Variant62118, - Variant62119, - Variant62120, - Variant62121, - Variant62122, - Variant62123, - Variant62124, - Variant62125, - Variant62126, - Variant62127, - Variant62128, - Variant62129, - Variant62130, - Variant62131, - Variant62132, - Variant62133, - Variant62134, - Variant62135, - Variant62136, - Variant62137, - Variant62138, - Variant62139, - Variant62140, - Variant62141, - Variant62142, - Variant62143, - Variant62144, - Variant62145, - Variant62146, - Variant62147, - Variant62148, - Variant62149, - Variant62150, - Variant62151, - Variant62152, - Variant62153, - Variant62154, - Variant62155, - Variant62156, - Variant62157, - Variant62158, - Variant62159, - Variant62160, - Variant62161, - Variant62162, - Variant62163, - Variant62164, - Variant62165, - Variant62166, - Variant62167, - Variant62168, - Variant62169, - Variant62170, - Variant62171, - Variant62172, - Variant62173, - Variant62174, - Variant62175, - Variant62176, - Variant62177, - Variant62178, - Variant62179, - Variant62180, - Variant62181, - Variant62182, - Variant62183, - Variant62184, - Variant62185, - Variant62186, - Variant62187, - Variant62188, - Variant62189, - Variant62190, - Variant62191, - Variant62192, - Variant62193, - Variant62194, - Variant62195, - Variant62196, - Variant62197, - Variant62198, - Variant62199, - Variant62200, - Variant62201, - Variant62202, - Variant62203, - Variant62204, - Variant62205, - Variant62206, - Variant62207, - Variant62208, - Variant62209, - Variant62210, - Variant62211, - Variant62212, - Variant62213, - Variant62214, - Variant62215, - Variant62216, - Variant62217, - Variant62218, - Variant62219, - Variant62220, - Variant62221, - Variant62222, - Variant62223, - Variant62224, - Variant62225, - Variant62226, - Variant62227, - Variant62228, - Variant62229, - Variant62230, - Variant62231, - Variant62232, - Variant62233, - Variant62234, - Variant62235, - Variant62236, - Variant62237, - Variant62238, - Variant62239, - Variant62240, - Variant62241, - Variant62242, - Variant62243, - Variant62244, - Variant62245, - Variant62246, - Variant62247, - Variant62248, - Variant62249, - Variant62250, - Variant62251, - Variant62252, - Variant62253, - Variant62254, - Variant62255, - Variant62256, - Variant62257, - Variant62258, - Variant62259, - Variant62260, - Variant62261, - Variant62262, - Variant62263, - Variant62264, - Variant62265, - Variant62266, - Variant62267, - Variant62268, - Variant62269, - Variant62270, - Variant62271, - Variant62272, - Variant62273, - Variant62274, - Variant62275, - Variant62276, - Variant62277, - Variant62278, - Variant62279, - Variant62280, - Variant62281, - Variant62282, - Variant62283, - Variant62284, - Variant62285, - Variant62286, - Variant62287, - Variant62288, - Variant62289, - Variant62290, - Variant62291, - Variant62292, - Variant62293, - Variant62294, - Variant62295, - Variant62296, - Variant62297, - Variant62298, - Variant62299, - Variant62300, - Variant62301, - Variant62302, - Variant62303, - Variant62304, - Variant62305, - Variant62306, - Variant62307, - Variant62308, - Variant62309, - Variant62310, - Variant62311, - Variant62312, - Variant62313, - Variant62314, - Variant62315, - Variant62316, - Variant62317, - Variant62318, - Variant62319, - Variant62320, - Variant62321, - Variant62322, - Variant62323, - Variant62324, - Variant62325, - Variant62326, - Variant62327, - Variant62328, - Variant62329, - Variant62330, - Variant62331, - Variant62332, - Variant62333, - Variant62334, - Variant62335, - Variant62336, - Variant62337, - Variant62338, - Variant62339, - Variant62340, - Variant62341, - Variant62342, - Variant62343, - Variant62344, - Variant62345, - Variant62346, - Variant62347, - Variant62348, - Variant62349, - Variant62350, - Variant62351, - Variant62352, - Variant62353, - Variant62354, - Variant62355, - Variant62356, - Variant62357, - Variant62358, - Variant62359, - Variant62360, - Variant62361, - Variant62362, - Variant62363, - Variant62364, - Variant62365, - Variant62366, - Variant62367, - Variant62368, - Variant62369, - Variant62370, - Variant62371, - Variant62372, - Variant62373, - Variant62374, - Variant62375, - Variant62376, - Variant62377, - Variant62378, - Variant62379, - Variant62380, - Variant62381, - Variant62382, - Variant62383, - Variant62384, - Variant62385, - Variant62386, - Variant62387, - Variant62388, - Variant62389, - Variant62390, - Variant62391, - Variant62392, - Variant62393, - Variant62394, - Variant62395, - Variant62396, - Variant62397, - Variant62398, - Variant62399, - Variant62400, - Variant62401, - Variant62402, - Variant62403, - Variant62404, - Variant62405, - Variant62406, - Variant62407, - Variant62408, - Variant62409, - Variant62410, - Variant62411, - Variant62412, - Variant62413, - Variant62414, - Variant62415, - Variant62416, - Variant62417, - Variant62418, - Variant62419, - Variant62420, - Variant62421, - Variant62422, - Variant62423, - Variant62424, - Variant62425, - Variant62426, - Variant62427, - Variant62428, - Variant62429, - Variant62430, - Variant62431, - Variant62432, - Variant62433, - Variant62434, - Variant62435, - Variant62436, - Variant62437, - Variant62438, - Variant62439, - Variant62440, - Variant62441, - Variant62442, - Variant62443, - Variant62444, - Variant62445, - Variant62446, - Variant62447, - Variant62448, - Variant62449, - Variant62450, - Variant62451, - Variant62452, - Variant62453, - Variant62454, - Variant62455, - Variant62456, - Variant62457, - Variant62458, - Variant62459, - Variant62460, - Variant62461, - Variant62462, - Variant62463, - Variant62464, - Variant62465, - Variant62466, - Variant62467, - Variant62468, - Variant62469, - Variant62470, - Variant62471, - Variant62472, - Variant62473, - Variant62474, - Variant62475, - Variant62476, - Variant62477, - Variant62478, - Variant62479, - Variant62480, - Variant62481, - Variant62482, - Variant62483, - Variant62484, - Variant62485, - Variant62486, - Variant62487, - Variant62488, - Variant62489, - Variant62490, - Variant62491, - Variant62492, - Variant62493, - Variant62494, - Variant62495, - Variant62496, - Variant62497, - Variant62498, - Variant62499, - Variant62500, - Variant62501, - Variant62502, - Variant62503, - Variant62504, - Variant62505, - Variant62506, - Variant62507, - Variant62508, - Variant62509, - Variant62510, - Variant62511, - Variant62512, - Variant62513, - Variant62514, - Variant62515, - Variant62516, - Variant62517, - Variant62518, - Variant62519, - Variant62520, - Variant62521, - Variant62522, - Variant62523, - Variant62524, - Variant62525, - Variant62526, - Variant62527, - Variant62528, - Variant62529, - Variant62530, - Variant62531, - Variant62532, - Variant62533, - Variant62534, - Variant62535, - Variant62536, - Variant62537, - Variant62538, - Variant62539, - Variant62540, - Variant62541, - Variant62542, - Variant62543, - Variant62544, - Variant62545, - Variant62546, - Variant62547, - Variant62548, - Variant62549, - Variant62550, - Variant62551, - Variant62552, - Variant62553, - Variant62554, - Variant62555, - Variant62556, - Variant62557, - Variant62558, - Variant62559, - Variant62560, - Variant62561, - Variant62562, - Variant62563, - Variant62564, - Variant62565, - Variant62566, - Variant62567, - Variant62568, - Variant62569, - Variant62570, - Variant62571, - Variant62572, - Variant62573, - Variant62574, - Variant62575, - Variant62576, - Variant62577, - Variant62578, - Variant62579, - Variant62580, - Variant62581, - Variant62582, - Variant62583, - Variant62584, - Variant62585, - Variant62586, - Variant62587, - Variant62588, - Variant62589, - Variant62590, - Variant62591, - Variant62592, - Variant62593, - Variant62594, - Variant62595, - Variant62596, - Variant62597, - Variant62598, - Variant62599, - Variant62600, - Variant62601, - Variant62602, - Variant62603, - Variant62604, - Variant62605, - Variant62606, - Variant62607, - Variant62608, - Variant62609, - Variant62610, - Variant62611, - Variant62612, - Variant62613, - Variant62614, - Variant62615, - Variant62616, - Variant62617, - Variant62618, - Variant62619, - Variant62620, - Variant62621, - Variant62622, - Variant62623, - Variant62624, - Variant62625, - Variant62626, - Variant62627, - Variant62628, - Variant62629, - Variant62630, - Variant62631, - Variant62632, - Variant62633, - Variant62634, - Variant62635, - Variant62636, - Variant62637, - Variant62638, - Variant62639, - Variant62640, - Variant62641, - Variant62642, - Variant62643, - Variant62644, - Variant62645, - Variant62646, - Variant62647, - Variant62648, - Variant62649, - Variant62650, - Variant62651, - Variant62652, - Variant62653, - Variant62654, - Variant62655, - Variant62656, - Variant62657, - Variant62658, - Variant62659, - Variant62660, - Variant62661, - Variant62662, - Variant62663, - Variant62664, - Variant62665, - Variant62666, - Variant62667, - Variant62668, - Variant62669, - Variant62670, - Variant62671, - Variant62672, - Variant62673, - Variant62674, - Variant62675, - Variant62676, - Variant62677, - Variant62678, - Variant62679, - Variant62680, - Variant62681, - Variant62682, - Variant62683, - Variant62684, - Variant62685, - Variant62686, - Variant62687, - Variant62688, - Variant62689, - Variant62690, - Variant62691, - Variant62692, - Variant62693, - Variant62694, - Variant62695, - Variant62696, - Variant62697, - Variant62698, - Variant62699, - Variant62700, - Variant62701, - Variant62702, - Variant62703, - Variant62704, - Variant62705, - Variant62706, - Variant62707, - Variant62708, - Variant62709, - Variant62710, - Variant62711, - Variant62712, - Variant62713, - Variant62714, - Variant62715, - Variant62716, - Variant62717, - Variant62718, - Variant62719, - Variant62720, - Variant62721, - Variant62722, - Variant62723, - Variant62724, - Variant62725, - Variant62726, - Variant62727, - Variant62728, - Variant62729, - Variant62730, - Variant62731, - Variant62732, - Variant62733, - Variant62734, - Variant62735, - Variant62736, - Variant62737, - Variant62738, - Variant62739, - Variant62740, - Variant62741, - Variant62742, - Variant62743, - Variant62744, - Variant62745, - Variant62746, - Variant62747, - Variant62748, - Variant62749, - Variant62750, - Variant62751, - Variant62752, - Variant62753, - Variant62754, - Variant62755, - Variant62756, - Variant62757, - Variant62758, - Variant62759, - Variant62760, - Variant62761, - Variant62762, - Variant62763, - Variant62764, - Variant62765, - Variant62766, - Variant62767, - Variant62768, - Variant62769, - Variant62770, - Variant62771, - Variant62772, - Variant62773, - Variant62774, - Variant62775, - Variant62776, - Variant62777, - Variant62778, - Variant62779, - Variant62780, - Variant62781, - Variant62782, - Variant62783, - Variant62784, - Variant62785, - Variant62786, - Variant62787, - Variant62788, - Variant62789, - Variant62790, - Variant62791, - Variant62792, - Variant62793, - Variant62794, - Variant62795, - Variant62796, - Variant62797, - Variant62798, - Variant62799, - Variant62800, - Variant62801, - Variant62802, - Variant62803, - Variant62804, - Variant62805, - Variant62806, - Variant62807, - Variant62808, - Variant62809, - Variant62810, - Variant62811, - Variant62812, - Variant62813, - Variant62814, - Variant62815, - Variant62816, - Variant62817, - Variant62818, - Variant62819, - Variant62820, - Variant62821, - Variant62822, - Variant62823, - Variant62824, - Variant62825, - Variant62826, - Variant62827, - Variant62828, - Variant62829, - Variant62830, - Variant62831, - Variant62832, - Variant62833, - Variant62834, - Variant62835, - Variant62836, - Variant62837, - Variant62838, - Variant62839, - Variant62840, - Variant62841, - Variant62842, - Variant62843, - Variant62844, - Variant62845, - Variant62846, - Variant62847, - Variant62848, - Variant62849, - Variant62850, - Variant62851, - Variant62852, - Variant62853, - Variant62854, - Variant62855, - Variant62856, - Variant62857, - Variant62858, - Variant62859, - Variant62860, - Variant62861, - Variant62862, - Variant62863, - Variant62864, - Variant62865, - Variant62866, - Variant62867, - Variant62868, - Variant62869, - Variant62870, - Variant62871, - Variant62872, - Variant62873, - Variant62874, - Variant62875, - Variant62876, - Variant62877, - Variant62878, - Variant62879, - Variant62880, - Variant62881, - Variant62882, - Variant62883, - Variant62884, - Variant62885, - Variant62886, - Variant62887, - Variant62888, - Variant62889, - Variant62890, - Variant62891, - Variant62892, - Variant62893, - Variant62894, - Variant62895, - Variant62896, - Variant62897, - Variant62898, - Variant62899, - Variant62900, - Variant62901, - Variant62902, - Variant62903, - Variant62904, - Variant62905, - Variant62906, - Variant62907, - Variant62908, - Variant62909, - Variant62910, - Variant62911, - Variant62912, - Variant62913, - Variant62914, - Variant62915, - Variant62916, - Variant62917, - Variant62918, - Variant62919, - Variant62920, - Variant62921, - Variant62922, - Variant62923, - Variant62924, - Variant62925, - Variant62926, - Variant62927, - Variant62928, - Variant62929, - Variant62930, - Variant62931, - Variant62932, - Variant62933, - Variant62934, - Variant62935, - Variant62936, - Variant62937, - Variant62938, - Variant62939, - Variant62940, - Variant62941, - Variant62942, - Variant62943, - Variant62944, - Variant62945, - Variant62946, - Variant62947, - Variant62948, - Variant62949, - Variant62950, - Variant62951, - Variant62952, - Variant62953, - Variant62954, - Variant62955, - Variant62956, - Variant62957, - Variant62958, - Variant62959, - Variant62960, - Variant62961, - Variant62962, - Variant62963, - Variant62964, - Variant62965, - Variant62966, - Variant62967, - Variant62968, - Variant62969, - Variant62970, - Variant62971, - Variant62972, - Variant62973, - Variant62974, - Variant62975, - Variant62976, - Variant62977, - Variant62978, - Variant62979, - Variant62980, - Variant62981, - Variant62982, - Variant62983, - Variant62984, - Variant62985, - Variant62986, - Variant62987, - Variant62988, - Variant62989, - Variant62990, - Variant62991, - Variant62992, - Variant62993, - Variant62994, - Variant62995, - Variant62996, - Variant62997, - Variant62998, - Variant62999, - Variant63000, - Variant63001, - Variant63002, - Variant63003, - Variant63004, - Variant63005, - Variant63006, - Variant63007, - Variant63008, - Variant63009, - Variant63010, - Variant63011, - Variant63012, - Variant63013, - Variant63014, - Variant63015, - Variant63016, - Variant63017, - Variant63018, - Variant63019, - Variant63020, - Variant63021, - Variant63022, - Variant63023, - Variant63024, - Variant63025, - Variant63026, - Variant63027, - Variant63028, - Variant63029, - Variant63030, - Variant63031, - Variant63032, - Variant63033, - Variant63034, - Variant63035, - Variant63036, - Variant63037, - Variant63038, - Variant63039, - Variant63040, - Variant63041, - Variant63042, - Variant63043, - Variant63044, - Variant63045, - Variant63046, - Variant63047, - Variant63048, - Variant63049, - Variant63050, - Variant63051, - Variant63052, - Variant63053, - Variant63054, - Variant63055, - Variant63056, - Variant63057, - Variant63058, - Variant63059, - Variant63060, - Variant63061, - Variant63062, - Variant63063, - Variant63064, - Variant63065, - Variant63066, - Variant63067, - Variant63068, - Variant63069, - Variant63070, - Variant63071, - Variant63072, - Variant63073, - Variant63074, - Variant63075, - Variant63076, - Variant63077, - Variant63078, - Variant63079, - Variant63080, - Variant63081, - Variant63082, - Variant63083, - Variant63084, - Variant63085, - Variant63086, - Variant63087, - Variant63088, - Variant63089, - Variant63090, - Variant63091, - Variant63092, - Variant63093, - Variant63094, - Variant63095, - Variant63096, - Variant63097, - Variant63098, - Variant63099, - Variant63100, - Variant63101, - Variant63102, - Variant63103, - Variant63104, - Variant63105, - Variant63106, - Variant63107, - Variant63108, - Variant63109, - Variant63110, - Variant63111, - Variant63112, - Variant63113, - Variant63114, - Variant63115, - Variant63116, - Variant63117, - Variant63118, - Variant63119, - Variant63120, - Variant63121, - Variant63122, - Variant63123, - Variant63124, - Variant63125, - Variant63126, - Variant63127, - Variant63128, - Variant63129, - Variant63130, - Variant63131, - Variant63132, - Variant63133, - Variant63134, - Variant63135, - Variant63136, - Variant63137, - Variant63138, - Variant63139, - Variant63140, - Variant63141, - Variant63142, - Variant63143, - Variant63144, - Variant63145, - Variant63146, - Variant63147, - Variant63148, - Variant63149, - Variant63150, - Variant63151, - Variant63152, - Variant63153, - Variant63154, - Variant63155, - Variant63156, - Variant63157, - Variant63158, - Variant63159, - Variant63160, - Variant63161, - Variant63162, - Variant63163, - Variant63164, - Variant63165, - Variant63166, - Variant63167, - Variant63168, - Variant63169, - Variant63170, - Variant63171, - Variant63172, - Variant63173, - Variant63174, - Variant63175, - Variant63176, - Variant63177, - Variant63178, - Variant63179, - Variant63180, - Variant63181, - Variant63182, - Variant63183, - Variant63184, - Variant63185, - Variant63186, - Variant63187, - Variant63188, - Variant63189, - Variant63190, - Variant63191, - Variant63192, - Variant63193, - Variant63194, - Variant63195, - Variant63196, - Variant63197, - Variant63198, - Variant63199, - Variant63200, - Variant63201, - Variant63202, - Variant63203, - Variant63204, - Variant63205, - Variant63206, - Variant63207, - Variant63208, - Variant63209, - Variant63210, - Variant63211, - Variant63212, - Variant63213, - Variant63214, - Variant63215, - Variant63216, - Variant63217, - Variant63218, - Variant63219, - Variant63220, - Variant63221, - Variant63222, - Variant63223, - Variant63224, - Variant63225, - Variant63226, - Variant63227, - Variant63228, - Variant63229, - Variant63230, - Variant63231, - Variant63232, - Variant63233, - Variant63234, - Variant63235, - Variant63236, - Variant63237, - Variant63238, - Variant63239, - Variant63240, - Variant63241, - Variant63242, - Variant63243, - Variant63244, - Variant63245, - Variant63246, - Variant63247, - Variant63248, - Variant63249, - Variant63250, - Variant63251, - Variant63252, - Variant63253, - Variant63254, - Variant63255, - Variant63256, - Variant63257, - Variant63258, - Variant63259, - Variant63260, - Variant63261, - Variant63262, - Variant63263, - Variant63264, - Variant63265, - Variant63266, - Variant63267, - Variant63268, - Variant63269, - Variant63270, - Variant63271, - Variant63272, - Variant63273, - Variant63274, - Variant63275, - Variant63276, - Variant63277, - Variant63278, - Variant63279, - Variant63280, - Variant63281, - Variant63282, - Variant63283, - Variant63284, - Variant63285, - Variant63286, - Variant63287, - Variant63288, - Variant63289, - Variant63290, - Variant63291, - Variant63292, - Variant63293, - Variant63294, - Variant63295, - Variant63296, - Variant63297, - Variant63298, - Variant63299, - Variant63300, - Variant63301, - Variant63302, - Variant63303, - Variant63304, - Variant63305, - Variant63306, - Variant63307, - Variant63308, - Variant63309, - Variant63310, - Variant63311, - Variant63312, - Variant63313, - Variant63314, - Variant63315, - Variant63316, - Variant63317, - Variant63318, - Variant63319, - Variant63320, - Variant63321, - Variant63322, - Variant63323, - Variant63324, - Variant63325, - Variant63326, - Variant63327, - Variant63328, - Variant63329, - Variant63330, - Variant63331, - Variant63332, - Variant63333, - Variant63334, - Variant63335, - Variant63336, - Variant63337, - Variant63338, - Variant63339, - Variant63340, - Variant63341, - Variant63342, - Variant63343, - Variant63344, - Variant63345, - Variant63346, - Variant63347, - Variant63348, - Variant63349, - Variant63350, - Variant63351, - Variant63352, - Variant63353, - Variant63354, - Variant63355, - Variant63356, - Variant63357, - Variant63358, - Variant63359, - Variant63360, - Variant63361, - Variant63362, - Variant63363, - Variant63364, - Variant63365, - Variant63366, - Variant63367, - Variant63368, - Variant63369, - Variant63370, - Variant63371, - Variant63372, - Variant63373, - Variant63374, - Variant63375, - Variant63376, - Variant63377, - Variant63378, - Variant63379, - Variant63380, - Variant63381, - Variant63382, - Variant63383, - Variant63384, - Variant63385, - Variant63386, - Variant63387, - Variant63388, - Variant63389, - Variant63390, - Variant63391, - Variant63392, - Variant63393, - Variant63394, - Variant63395, - Variant63396, - Variant63397, - Variant63398, - Variant63399, - Variant63400, - Variant63401, - Variant63402, - Variant63403, - Variant63404, - Variant63405, - Variant63406, - Variant63407, - Variant63408, - Variant63409, - Variant63410, - Variant63411, - Variant63412, - Variant63413, - Variant63414, - Variant63415, - Variant63416, - Variant63417, - Variant63418, - Variant63419, - Variant63420, - Variant63421, - Variant63422, - Variant63423, - Variant63424, - Variant63425, - Variant63426, - Variant63427, - Variant63428, - Variant63429, - Variant63430, - Variant63431, - Variant63432, - Variant63433, - Variant63434, - Variant63435, - Variant63436, - Variant63437, - Variant63438, - Variant63439, - Variant63440, - Variant63441, - Variant63442, - Variant63443, - Variant63444, - Variant63445, - Variant63446, - Variant63447, - Variant63448, - Variant63449, - Variant63450, - Variant63451, - Variant63452, - Variant63453, - Variant63454, - Variant63455, - Variant63456, - Variant63457, - Variant63458, - Variant63459, - Variant63460, - Variant63461, - Variant63462, - Variant63463, - Variant63464, - Variant63465, - Variant63466, - Variant63467, - Variant63468, - Variant63469, - Variant63470, - Variant63471, - Variant63472, - Variant63473, - Variant63474, - Variant63475, - Variant63476, - Variant63477, - Variant63478, - Variant63479, - Variant63480, - Variant63481, - Variant63482, - Variant63483, - Variant63484, - Variant63485, - Variant63486, - Variant63487, - Variant63488, - Variant63489, - Variant63490, - Variant63491, - Variant63492, - Variant63493, - Variant63494, - Variant63495, - Variant63496, - Variant63497, - Variant63498, - Variant63499, - Variant63500, - Variant63501, - Variant63502, - Variant63503, - Variant63504, - Variant63505, - Variant63506, - Variant63507, - Variant63508, - Variant63509, - Variant63510, - Variant63511, - Variant63512, - Variant63513, - Variant63514, - Variant63515, - Variant63516, - Variant63517, - Variant63518, - Variant63519, - Variant63520, - Variant63521, - Variant63522, - Variant63523, - Variant63524, - Variant63525, - Variant63526, - Variant63527, - Variant63528, - Variant63529, - Variant63530, - Variant63531, - Variant63532, - Variant63533, - Variant63534, - Variant63535, - Variant63536, - Variant63537, - Variant63538, - Variant63539, - Variant63540, - Variant63541, - Variant63542, - Variant63543, - Variant63544, - Variant63545, - Variant63546, - Variant63547, - Variant63548, - Variant63549, - Variant63550, - Variant63551, - Variant63552, - Variant63553, - Variant63554, - Variant63555, - Variant63556, - Variant63557, - Variant63558, - Variant63559, - Variant63560, - Variant63561, - Variant63562, - Variant63563, - Variant63564, - Variant63565, - Variant63566, - Variant63567, - Variant63568, - Variant63569, - Variant63570, - Variant63571, - Variant63572, - Variant63573, - Variant63574, - Variant63575, - Variant63576, - Variant63577, - Variant63578, - Variant63579, - Variant63580, - Variant63581, - Variant63582, - Variant63583, - Variant63584, - Variant63585, - Variant63586, - Variant63587, - Variant63588, - Variant63589, - Variant63590, - Variant63591, - Variant63592, - Variant63593, - Variant63594, - Variant63595, - Variant63596, - Variant63597, - Variant63598, - Variant63599, - Variant63600, - Variant63601, - Variant63602, - Variant63603, - Variant63604, - Variant63605, - Variant63606, - Variant63607, - Variant63608, - Variant63609, - Variant63610, - Variant63611, - Variant63612, - Variant63613, - Variant63614, - Variant63615, - Variant63616, - Variant63617, - Variant63618, - Variant63619, - Variant63620, - Variant63621, - Variant63622, - Variant63623, - Variant63624, - Variant63625, - Variant63626, - Variant63627, - Variant63628, - Variant63629, - Variant63630, - Variant63631, - Variant63632, - Variant63633, - Variant63634, - Variant63635, - Variant63636, - Variant63637, - Variant63638, - Variant63639, - Variant63640, - Variant63641, - Variant63642, - Variant63643, - Variant63644, - Variant63645, - Variant63646, - Variant63647, - Variant63648, - Variant63649, - Variant63650, - Variant63651, - Variant63652, - Variant63653, - Variant63654, - Variant63655, - Variant63656, - Variant63657, - Variant63658, - Variant63659, - Variant63660, - Variant63661, - Variant63662, - Variant63663, - Variant63664, - Variant63665, - Variant63666, - Variant63667, - Variant63668, - Variant63669, - Variant63670, - Variant63671, - Variant63672, - Variant63673, - Variant63674, - Variant63675, - Variant63676, - Variant63677, - Variant63678, - Variant63679, - Variant63680, - Variant63681, - Variant63682, - Variant63683, - Variant63684, - Variant63685, - Variant63686, - Variant63687, - Variant63688, - Variant63689, - Variant63690, - Variant63691, - Variant63692, - Variant63693, - Variant63694, - Variant63695, - Variant63696, - Variant63697, - Variant63698, - Variant63699, - Variant63700, - Variant63701, - Variant63702, - Variant63703, - Variant63704, - Variant63705, - Variant63706, - Variant63707, - Variant63708, - Variant63709, - Variant63710, - Variant63711, - Variant63712, - Variant63713, - Variant63714, - Variant63715, - Variant63716, - Variant63717, - Variant63718, - Variant63719, - Variant63720, - Variant63721, - Variant63722, - Variant63723, - Variant63724, - Variant63725, - Variant63726, - Variant63727, - Variant63728, - Variant63729, - Variant63730, - Variant63731, - Variant63732, - Variant63733, - Variant63734, - Variant63735, - Variant63736, - Variant63737, - Variant63738, - Variant63739, - Variant63740, - Variant63741, - Variant63742, - Variant63743, - Variant63744, - Variant63745, - Variant63746, - Variant63747, - Variant63748, - Variant63749, - Variant63750, - Variant63751, - Variant63752, - Variant63753, - Variant63754, - Variant63755, - Variant63756, - Variant63757, - Variant63758, - Variant63759, - Variant63760, - Variant63761, - Variant63762, - Variant63763, - Variant63764, - Variant63765, - Variant63766, - Variant63767, - Variant63768, - Variant63769, - Variant63770, - Variant63771, - Variant63772, - Variant63773, - Variant63774, - Variant63775, - Variant63776, - Variant63777, - Variant63778, - Variant63779, - Variant63780, - Variant63781, - Variant63782, - Variant63783, - Variant63784, - Variant63785, - Variant63786, - Variant63787, - Variant63788, - Variant63789, - Variant63790, - Variant63791, - Variant63792, - Variant63793, - Variant63794, - Variant63795, - Variant63796, - Variant63797, - Variant63798, - Variant63799, - Variant63800, - Variant63801, - Variant63802, - Variant63803, - Variant63804, - Variant63805, - Variant63806, - Variant63807, - Variant63808, - Variant63809, - Variant63810, - Variant63811, - Variant63812, - Variant63813, - Variant63814, - Variant63815, - Variant63816, - Variant63817, - Variant63818, - Variant63819, - Variant63820, - Variant63821, - Variant63822, - Variant63823, - Variant63824, - Variant63825, - Variant63826, - Variant63827, - Variant63828, - Variant63829, - Variant63830, - Variant63831, - Variant63832, - Variant63833, - Variant63834, - Variant63835, - Variant63836, - Variant63837, - Variant63838, - Variant63839, - Variant63840, - Variant63841, - Variant63842, - Variant63843, - Variant63844, - Variant63845, - Variant63846, - Variant63847, - Variant63848, - Variant63849, - Variant63850, - Variant63851, - Variant63852, - Variant63853, - Variant63854, - Variant63855, - Variant63856, - Variant63857, - Variant63858, - Variant63859, - Variant63860, - Variant63861, - Variant63862, - Variant63863, - Variant63864, - Variant63865, - Variant63866, - Variant63867, - Variant63868, - Variant63869, - Variant63870, - Variant63871, - Variant63872, - Variant63873, - Variant63874, - Variant63875, - Variant63876, - Variant63877, - Variant63878, - Variant63879, - Variant63880, - Variant63881, - Variant63882, - Variant63883, - Variant63884, - Variant63885, - Variant63886, - Variant63887, - Variant63888, - Variant63889, - Variant63890, - Variant63891, - Variant63892, - Variant63893, - Variant63894, - Variant63895, - Variant63896, - Variant63897, - Variant63898, - Variant63899, - Variant63900, - Variant63901, - Variant63902, - Variant63903, - Variant63904, - Variant63905, - Variant63906, - Variant63907, - Variant63908, - Variant63909, - Variant63910, - Variant63911, - Variant63912, - Variant63913, - Variant63914, - Variant63915, - Variant63916, - Variant63917, - Variant63918, - Variant63919, - Variant63920, - Variant63921, - Variant63922, - Variant63923, - Variant63924, - Variant63925, - Variant63926, - Variant63927, - Variant63928, - Variant63929, - Variant63930, - Variant63931, - Variant63932, - Variant63933, - Variant63934, - Variant63935, - Variant63936, - Variant63937, - Variant63938, - Variant63939, - Variant63940, - Variant63941, - Variant63942, - Variant63943, - Variant63944, - Variant63945, - Variant63946, - Variant63947, - Variant63948, - Variant63949, - Variant63950, - Variant63951, - Variant63952, - Variant63953, - Variant63954, - Variant63955, - Variant63956, - Variant63957, - Variant63958, - Variant63959, - Variant63960, - Variant63961, - Variant63962, - Variant63963, - Variant63964, - Variant63965, - Variant63966, - Variant63967, - Variant63968, - Variant63969, - Variant63970, - Variant63971, - Variant63972, - Variant63973, - Variant63974, - Variant63975, - Variant63976, - Variant63977, - Variant63978, - Variant63979, - Variant63980, - Variant63981, - Variant63982, - Variant63983, - Variant63984, - Variant63985, - Variant63986, - Variant63987, - Variant63988, - Variant63989, - Variant63990, - Variant63991, - Variant63992, - Variant63993, - Variant63994, - Variant63995, - Variant63996, - Variant63997, - Variant63998, - Variant63999, - Variant64000, - Variant64001, - Variant64002, - Variant64003, - Variant64004, - Variant64005, - Variant64006, - Variant64007, - Variant64008, - Variant64009, - Variant64010, - Variant64011, - Variant64012, - Variant64013, - Variant64014, - Variant64015, - Variant64016, - Variant64017, - Variant64018, - Variant64019, - Variant64020, - Variant64021, - Variant64022, - Variant64023, - Variant64024, - Variant64025, - Variant64026, - Variant64027, - Variant64028, - Variant64029, - Variant64030, - Variant64031, - Variant64032, - Variant64033, - Variant64034, - Variant64035, - Variant64036, - Variant64037, - Variant64038, - Variant64039, - Variant64040, - Variant64041, - Variant64042, - Variant64043, - Variant64044, - Variant64045, - Variant64046, - Variant64047, - Variant64048, - Variant64049, - Variant64050, - Variant64051, - Variant64052, - Variant64053, - Variant64054, - Variant64055, - Variant64056, - Variant64057, - Variant64058, - Variant64059, - Variant64060, - Variant64061, - Variant64062, - Variant64063, - Variant64064, - Variant64065, - Variant64066, - Variant64067, - Variant64068, - Variant64069, - Variant64070, - Variant64071, - Variant64072, - Variant64073, - Variant64074, - Variant64075, - Variant64076, - Variant64077, - Variant64078, - Variant64079, - Variant64080, - Variant64081, - Variant64082, - Variant64083, - Variant64084, - Variant64085, - Variant64086, - Variant64087, - Variant64088, - Variant64089, - Variant64090, - Variant64091, - Variant64092, - Variant64093, - Variant64094, - Variant64095, - Variant64096, - Variant64097, - Variant64098, - Variant64099, - Variant64100, - Variant64101, - Variant64102, - Variant64103, - Variant64104, - Variant64105, - Variant64106, - Variant64107, - Variant64108, - Variant64109, - Variant64110, - Variant64111, - Variant64112, - Variant64113, - Variant64114, - Variant64115, - Variant64116, - Variant64117, - Variant64118, - Variant64119, - Variant64120, - Variant64121, - Variant64122, - Variant64123, - Variant64124, - Variant64125, - Variant64126, - Variant64127, - Variant64128, - Variant64129, - Variant64130, - Variant64131, - Variant64132, - Variant64133, - Variant64134, - Variant64135, - Variant64136, - Variant64137, - Variant64138, - Variant64139, - Variant64140, - Variant64141, - Variant64142, - Variant64143, - Variant64144, - Variant64145, - Variant64146, - Variant64147, - Variant64148, - Variant64149, - Variant64150, - Variant64151, - Variant64152, - Variant64153, - Variant64154, - Variant64155, - Variant64156, - Variant64157, - Variant64158, - Variant64159, - Variant64160, - Variant64161, - Variant64162, - Variant64163, - Variant64164, - Variant64165, - Variant64166, - Variant64167, - Variant64168, - Variant64169, - Variant64170, - Variant64171, - Variant64172, - Variant64173, - Variant64174, - Variant64175, - Variant64176, - Variant64177, - Variant64178, - Variant64179, - Variant64180, - Variant64181, - Variant64182, - Variant64183, - Variant64184, - Variant64185, - Variant64186, - Variant64187, - Variant64188, - Variant64189, - Variant64190, - Variant64191, - Variant64192, - Variant64193, - Variant64194, - Variant64195, - Variant64196, - Variant64197, - Variant64198, - Variant64199, - Variant64200, - Variant64201, - Variant64202, - Variant64203, - Variant64204, - Variant64205, - Variant64206, - Variant64207, - Variant64208, - Variant64209, - Variant64210, - Variant64211, - Variant64212, - Variant64213, - Variant64214, - Variant64215, - Variant64216, - Variant64217, - Variant64218, - Variant64219, - Variant64220, - Variant64221, - Variant64222, - Variant64223, - Variant64224, - Variant64225, - Variant64226, - Variant64227, - Variant64228, - Variant64229, - Variant64230, - Variant64231, - Variant64232, - Variant64233, - Variant64234, - Variant64235, - Variant64236, - Variant64237, - Variant64238, - Variant64239, - Variant64240, - Variant64241, - Variant64242, - Variant64243, - Variant64244, - Variant64245, - Variant64246, - Variant64247, - Variant64248, - Variant64249, - Variant64250, - Variant64251, - Variant64252, - Variant64253, - Variant64254, - Variant64255, - Variant64256, - Variant64257, - Variant64258, - Variant64259, - Variant64260, - Variant64261, - Variant64262, - Variant64263, - Variant64264, - Variant64265, - Variant64266, - Variant64267, - Variant64268, - Variant64269, - Variant64270, - Variant64271, - Variant64272, - Variant64273, - Variant64274, - Variant64275, - Variant64276, - Variant64277, - Variant64278, - Variant64279, - Variant64280, - Variant64281, - Variant64282, - Variant64283, - Variant64284, - Variant64285, - Variant64286, - Variant64287, - Variant64288, - Variant64289, - Variant64290, - Variant64291, - Variant64292, - Variant64293, - Variant64294, - Variant64295, - Variant64296, - Variant64297, - Variant64298, - Variant64299, - Variant64300, - Variant64301, - Variant64302, - Variant64303, - Variant64304, - Variant64305, - Variant64306, - Variant64307, - Variant64308, - Variant64309, - Variant64310, - Variant64311, - Variant64312, - Variant64313, - Variant64314, - Variant64315, - Variant64316, - Variant64317, - Variant64318, - Variant64319, - Variant64320, - Variant64321, - Variant64322, - Variant64323, - Variant64324, - Variant64325, - Variant64326, - Variant64327, - Variant64328, - Variant64329, - Variant64330, - Variant64331, - Variant64332, - Variant64333, - Variant64334, - Variant64335, - Variant64336, - Variant64337, - Variant64338, - Variant64339, - Variant64340, - Variant64341, - Variant64342, - Variant64343, - Variant64344, - Variant64345, - Variant64346, - Variant64347, - Variant64348, - Variant64349, - Variant64350, - Variant64351, - Variant64352, - Variant64353, - Variant64354, - Variant64355, - Variant64356, - Variant64357, - Variant64358, - Variant64359, - Variant64360, - Variant64361, - Variant64362, - Variant64363, - Variant64364, - Variant64365, - Variant64366, - Variant64367, - Variant64368, - Variant64369, - Variant64370, - Variant64371, - Variant64372, - Variant64373, - Variant64374, - Variant64375, - Variant64376, - Variant64377, - Variant64378, - Variant64379, - Variant64380, - Variant64381, - Variant64382, - Variant64383, - Variant64384, - Variant64385, - Variant64386, - Variant64387, - Variant64388, - Variant64389, - Variant64390, - Variant64391, - Variant64392, - Variant64393, - Variant64394, - Variant64395, - Variant64396, - Variant64397, - Variant64398, - Variant64399, - Variant64400, - Variant64401, - Variant64402, - Variant64403, - Variant64404, - Variant64405, - Variant64406, - Variant64407, - Variant64408, - Variant64409, - Variant64410, - Variant64411, - Variant64412, - Variant64413, - Variant64414, - Variant64415, - Variant64416, - Variant64417, - Variant64418, - Variant64419, - Variant64420, - Variant64421, - Variant64422, - Variant64423, - Variant64424, - Variant64425, - Variant64426, - Variant64427, - Variant64428, - Variant64429, - Variant64430, - Variant64431, - Variant64432, - Variant64433, - Variant64434, - Variant64435, - Variant64436, - Variant64437, - Variant64438, - Variant64439, - Variant64440, - Variant64441, - Variant64442, - Variant64443, - Variant64444, - Variant64445, - Variant64446, - Variant64447, - Variant64448, - Variant64449, - Variant64450, - Variant64451, - Variant64452, - Variant64453, - Variant64454, - Variant64455, - Variant64456, - Variant64457, - Variant64458, - Variant64459, - Variant64460, - Variant64461, - Variant64462, - Variant64463, - Variant64464, - Variant64465, - Variant64466, - Variant64467, - Variant64468, - Variant64469, - Variant64470, - Variant64471, - Variant64472, - Variant64473, - Variant64474, - Variant64475, - Variant64476, - Variant64477, - Variant64478, - Variant64479, - Variant64480, - Variant64481, - Variant64482, - Variant64483, - Variant64484, - Variant64485, - Variant64486, - Variant64487, - Variant64488, - Variant64489, - Variant64490, - Variant64491, - Variant64492, - Variant64493, - Variant64494, - Variant64495, - Variant64496, - Variant64497, - Variant64498, - Variant64499, - Variant64500, - Variant64501, - Variant64502, - Variant64503, - Variant64504, - Variant64505, - Variant64506, - Variant64507, - Variant64508, - Variant64509, - Variant64510, - Variant64511, - Variant64512, - Variant64513, - Variant64514, - Variant64515, - Variant64516, - Variant64517, - Variant64518, - Variant64519, - Variant64520, - Variant64521, - Variant64522, - Variant64523, - Variant64524, - Variant64525, - Variant64526, - Variant64527, - Variant64528, - Variant64529, - Variant64530, - Variant64531, - Variant64532, - Variant64533, - Variant64534, - Variant64535, - Variant64536, - Variant64537, - Variant64538, - Variant64539, - Variant64540, - Variant64541, - Variant64542, - Variant64543, - Variant64544, - Variant64545, - Variant64546, - Variant64547, - Variant64548, - Variant64549, - Variant64550, - Variant64551, - Variant64552, - Variant64553, - Variant64554, - Variant64555, - Variant64556, - Variant64557, - Variant64558, - Variant64559, - Variant64560, - Variant64561, - Variant64562, - Variant64563, - Variant64564, - Variant64565, - Variant64566, - Variant64567, - Variant64568, - Variant64569, - Variant64570, - Variant64571, - Variant64572, - Variant64573, - Variant64574, - Variant64575, - Variant64576, - Variant64577, - Variant64578, - Variant64579, - Variant64580, - Variant64581, - Variant64582, - Variant64583, - Variant64584, - Variant64585, - Variant64586, - Variant64587, - Variant64588, - Variant64589, - Variant64590, - Variant64591, - Variant64592, - Variant64593, - Variant64594, - Variant64595, - Variant64596, - Variant64597, - Variant64598, - Variant64599, - Variant64600, - Variant64601, - Variant64602, - Variant64603, - Variant64604, - Variant64605, - Variant64606, - Variant64607, - Variant64608, - Variant64609, - Variant64610, - Variant64611, - Variant64612, - Variant64613, - Variant64614, - Variant64615, - Variant64616, - Variant64617, - Variant64618, - Variant64619, - Variant64620, - Variant64621, - Variant64622, - Variant64623, - Variant64624, - Variant64625, - Variant64626, - Variant64627, - Variant64628, - Variant64629, - Variant64630, - Variant64631, - Variant64632, - Variant64633, - Variant64634, - Variant64635, - Variant64636, - Variant64637, - Variant64638, - Variant64639, - Variant64640, - Variant64641, - Variant64642, - Variant64643, - Variant64644, - Variant64645, - Variant64646, - Variant64647, - Variant64648, - Variant64649, - Variant64650, - Variant64651, - Variant64652, - Variant64653, - Variant64654, - Variant64655, - Variant64656, - Variant64657, - Variant64658, - Variant64659, - Variant64660, - Variant64661, - Variant64662, - Variant64663, - Variant64664, - Variant64665, - Variant64666, - Variant64667, - Variant64668, - Variant64669, - Variant64670, - Variant64671, - Variant64672, - Variant64673, - Variant64674, - Variant64675, - Variant64676, - Variant64677, - Variant64678, - Variant64679, - Variant64680, - Variant64681, - Variant64682, - Variant64683, - Variant64684, - Variant64685, - Variant64686, - Variant64687, - Variant64688, - Variant64689, - Variant64690, - Variant64691, - Variant64692, - Variant64693, - Variant64694, - Variant64695, - Variant64696, - Variant64697, - Variant64698, - Variant64699, - Variant64700, - Variant64701, - Variant64702, - Variant64703, - Variant64704, - Variant64705, - Variant64706, - Variant64707, - Variant64708, - Variant64709, - Variant64710, - Variant64711, - Variant64712, - Variant64713, - Variant64714, - Variant64715, - Variant64716, - Variant64717, - Variant64718, - Variant64719, - Variant64720, - Variant64721, - Variant64722, - Variant64723, - Variant64724, - Variant64725, - Variant64726, - Variant64727, - Variant64728, - Variant64729, - Variant64730, - Variant64731, - Variant64732, - Variant64733, - Variant64734, - Variant64735, - Variant64736, - Variant64737, - Variant64738, - Variant64739, - Variant64740, - Variant64741, - Variant64742, - Variant64743, - Variant64744, - Variant64745, - Variant64746, - Variant64747, - Variant64748, - Variant64749, - Variant64750, - Variant64751, - Variant64752, - Variant64753, - Variant64754, - Variant64755, - Variant64756, - Variant64757, - Variant64758, - Variant64759, - Variant64760, - Variant64761, - Variant64762, - Variant64763, - Variant64764, - Variant64765, - Variant64766, - Variant64767, - Variant64768, - Variant64769, - Variant64770, - Variant64771, - Variant64772, - Variant64773, - Variant64774, - Variant64775, - Variant64776, - Variant64777, - Variant64778, - Variant64779, - Variant64780, - Variant64781, - Variant64782, - Variant64783, - Variant64784, - Variant64785, - Variant64786, - Variant64787, - Variant64788, - Variant64789, - Variant64790, - Variant64791, - Variant64792, - Variant64793, - Variant64794, - Variant64795, - Variant64796, - Variant64797, - Variant64798, - Variant64799, - Variant64800, - Variant64801, - Variant64802, - Variant64803, - Variant64804, - Variant64805, - Variant64806, - Variant64807, - Variant64808, - Variant64809, - Variant64810, - Variant64811, - Variant64812, - Variant64813, - Variant64814, - Variant64815, - Variant64816, - Variant64817, - Variant64818, - Variant64819, - Variant64820, - Variant64821, - Variant64822, - Variant64823, - Variant64824, - Variant64825, - Variant64826, - Variant64827, - Variant64828, - Variant64829, - Variant64830, - Variant64831, - Variant64832, - Variant64833, - Variant64834, - Variant64835, - Variant64836, - Variant64837, - Variant64838, - Variant64839, - Variant64840, - Variant64841, - Variant64842, - Variant64843, - Variant64844, - Variant64845, - Variant64846, - Variant64847, - Variant64848, - Variant64849, - Variant64850, - Variant64851, - Variant64852, - Variant64853, - Variant64854, - Variant64855, - Variant64856, - Variant64857, - Variant64858, - Variant64859, - Variant64860, - Variant64861, - Variant64862, - Variant64863, - Variant64864, - Variant64865, - Variant64866, - Variant64867, - Variant64868, - Variant64869, - Variant64870, - Variant64871, - Variant64872, - Variant64873, - Variant64874, - Variant64875, - Variant64876, - Variant64877, - Variant64878, - Variant64879, - Variant64880, - Variant64881, - Variant64882, - Variant64883, - Variant64884, - Variant64885, - Variant64886, - Variant64887, - Variant64888, - Variant64889, - Variant64890, - Variant64891, - Variant64892, - Variant64893, - Variant64894, - Variant64895, - Variant64896, - Variant64897, - Variant64898, - Variant64899, - Variant64900, - Variant64901, - Variant64902, - Variant64903, - Variant64904, - Variant64905, - Variant64906, - Variant64907, - Variant64908, - Variant64909, - Variant64910, - Variant64911, - Variant64912, - Variant64913, - Variant64914, - Variant64915, - Variant64916, - Variant64917, - Variant64918, - Variant64919, - Variant64920, - Variant64921, - Variant64922, - Variant64923, - Variant64924, - Variant64925, - Variant64926, - Variant64927, - Variant64928, - Variant64929, - Variant64930, - Variant64931, - Variant64932, - Variant64933, - Variant64934, - Variant64935, - Variant64936, - Variant64937, - Variant64938, - Variant64939, - Variant64940, - Variant64941, - Variant64942, - Variant64943, - Variant64944, - Variant64945, - Variant64946, - Variant64947, - Variant64948, - Variant64949, - Variant64950, - Variant64951, - Variant64952, - Variant64953, - Variant64954, - Variant64955, - Variant64956, - Variant64957, - Variant64958, - Variant64959, - Variant64960, - Variant64961, - Variant64962, - Variant64963, - Variant64964, - Variant64965, - Variant64966, - Variant64967, - Variant64968, - Variant64969, - Variant64970, - Variant64971, - Variant64972, - Variant64973, - Variant64974, - Variant64975, - Variant64976, - Variant64977, - Variant64978, - Variant64979, - Variant64980, - Variant64981, - Variant64982, - Variant64983, - Variant64984, - Variant64985, - Variant64986, - Variant64987, - Variant64988, - Variant64989, - Variant64990, - Variant64991, - Variant64992, - Variant64993, - Variant64994, - Variant64995, - Variant64996, - Variant64997, - Variant64998, - Variant64999, - Variant65000, - Variant65001, - Variant65002, - Variant65003, - Variant65004, - Variant65005, - Variant65006, - Variant65007, - Variant65008, - Variant65009, - Variant65010, - Variant65011, - Variant65012, - Variant65013, - Variant65014, - Variant65015, - Variant65016, - Variant65017, - Variant65018, - Variant65019, - Variant65020, - Variant65021, - Variant65022, - Variant65023, - Variant65024, - Variant65025, - Variant65026, - Variant65027, - Variant65028, - Variant65029, - Variant65030, - Variant65031, - Variant65032, - Variant65033, - Variant65034, - Variant65035, - Variant65036, - Variant65037, - Variant65038, - Variant65039, - Variant65040, - Variant65041, - Variant65042, - Variant65043, - Variant65044, - Variant65045, - Variant65046, - Variant65047, - Variant65048, - Variant65049, - Variant65050, - Variant65051, - Variant65052, - Variant65053, - Variant65054, - Variant65055, - Variant65056, - Variant65057, - Variant65058, - Variant65059, - Variant65060, - Variant65061, - Variant65062, - Variant65063, - Variant65064, - Variant65065, - Variant65066, - Variant65067, - Variant65068, - Variant65069, - Variant65070, - Variant65071, - Variant65072, - Variant65073, - Variant65074, - Variant65075, - Variant65076, - Variant65077, - Variant65078, - Variant65079, - Variant65080, - Variant65081, - Variant65082, - Variant65083, - Variant65084, - Variant65085, - Variant65086, - Variant65087, - Variant65088, - Variant65089, - Variant65090, - Variant65091, - Variant65092, - Variant65093, - Variant65094, - Variant65095, - Variant65096, - Variant65097, - Variant65098, - Variant65099, - Variant65100, - Variant65101, - Variant65102, - Variant65103, - Variant65104, - Variant65105, - Variant65106, - Variant65107, - Variant65108, - Variant65109, - Variant65110, - Variant65111, - Variant65112, - Variant65113, - Variant65114, - Variant65115, - Variant65116, - Variant65117, - Variant65118, - Variant65119, - Variant65120, - Variant65121, - Variant65122, - Variant65123, - Variant65124, - Variant65125, - Variant65126, - Variant65127, - Variant65128, - Variant65129, - Variant65130, - Variant65131, - Variant65132, - Variant65133, - Variant65134, - Variant65135, - Variant65136, - Variant65137, - Variant65138, - Variant65139, - Variant65140, - Variant65141, - Variant65142, - Variant65143, - Variant65144, - Variant65145, - Variant65146, - Variant65147, - Variant65148, - Variant65149, - Variant65150, - Variant65151, - Variant65152, - Variant65153, - Variant65154, - Variant65155, - Variant65156, - Variant65157, - Variant65158, - Variant65159, - Variant65160, - Variant65161, - Variant65162, - Variant65163, - Variant65164, - Variant65165, - Variant65166, - Variant65167, - Variant65168, - Variant65169, - Variant65170, - Variant65171, - Variant65172, - Variant65173, - Variant65174, - Variant65175, - Variant65176, - Variant65177, - Variant65178, - Variant65179, - Variant65180, - Variant65181, - Variant65182, - Variant65183, - Variant65184, - Variant65185, - Variant65186, - Variant65187, - Variant65188, - Variant65189, - Variant65190, - Variant65191, - Variant65192, - Variant65193, - Variant65194, - Variant65195, - Variant65196, - Variant65197, - Variant65198, - Variant65199, - Variant65200, - Variant65201, - Variant65202, - Variant65203, - Variant65204, - Variant65205, - Variant65206, - Variant65207, - Variant65208, - Variant65209, - Variant65210, - Variant65211, - Variant65212, - Variant65213, - Variant65214, - Variant65215, - Variant65216, - Variant65217, - Variant65218, - Variant65219, - Variant65220, - Variant65221, - Variant65222, - Variant65223, - Variant65224, - Variant65225, - Variant65226, - Variant65227, - Variant65228, - Variant65229, - Variant65230, - Variant65231, - Variant65232, - Variant65233, - Variant65234, - Variant65235, - Variant65236, - Variant65237, - Variant65238, - Variant65239, - Variant65240, - Variant65241, - Variant65242, - Variant65243, - Variant65244, - Variant65245, - Variant65246, - Variant65247, - Variant65248, - Variant65249, - Variant65250, - Variant65251, - Variant65252, - Variant65253, - Variant65254, - Variant65255, - Variant65256, - Variant65257, - Variant65258, - Variant65259, - Variant65260, - Variant65261, - Variant65262, - Variant65263, - Variant65264, - Variant65265, - Variant65266, - Variant65267, - Variant65268, - Variant65269, - Variant65270, - Variant65271, - Variant65272, - Variant65273, - Variant65274, - Variant65275, - Variant65276, - Variant65277, - Variant65278, - Variant65279, - Variant65280, - Variant65281, - Variant65282, - Variant65283, - Variant65284, - Variant65285, - Variant65286, - Variant65287, - Variant65288, - Variant65289, - Variant65290, - Variant65291, - Variant65292, - Variant65293, - Variant65294, - Variant65295, - Variant65296, - Variant65297, - Variant65298, - Variant65299, - Variant65300, - Variant65301, - Variant65302, - Variant65303, - Variant65304, - Variant65305, - Variant65306, - Variant65307, - Variant65308, - Variant65309, - Variant65310, - Variant65311, - Variant65312, - Variant65313, - Variant65314, - Variant65315, - Variant65316, - Variant65317, - Variant65318, - Variant65319, - Variant65320, - Variant65321, - Variant65322, - Variant65323, - Variant65324, - Variant65325, - Variant65326, - Variant65327, - Variant65328, - Variant65329, - Variant65330, - Variant65331, - Variant65332, - Variant65333, - Variant65334, - Variant65335, - Variant65336, - Variant65337, - Variant65338, - Variant65339, - Variant65340, - Variant65341, - Variant65342, - Variant65343, - Variant65344, - Variant65345, - Variant65346, - Variant65347, - Variant65348, - Variant65349, - Variant65350, - Variant65351, - Variant65352, - Variant65353, - Variant65354, - Variant65355, - Variant65356, - Variant65357, - Variant65358, - Variant65359, - Variant65360, - Variant65361, - Variant65362, - Variant65363, - Variant65364, - Variant65365, - Variant65366, - Variant65367, - Variant65368, - Variant65369, - Variant65370, - Variant65371, - Variant65372, - Variant65373, - Variant65374, - Variant65375, - Variant65376, - Variant65377, - Variant65378, - Variant65379, - Variant65380, - Variant65381, - Variant65382, - Variant65383, - Variant65384, - Variant65385, - Variant65386, - Variant65387, - Variant65388, - Variant65389, - Variant65390, - Variant65391, - Variant65392, - Variant65393, - Variant65394, - Variant65395, - Variant65396, - Variant65397, - Variant65398, - Variant65399, - Variant65400, - Variant65401, - Variant65402, - Variant65403, - Variant65404, - Variant65405, - Variant65406, - Variant65407, - Variant65408, - Variant65409, - Variant65410, - Variant65411, - Variant65412, - Variant65413, - Variant65414, - Variant65415, - Variant65416, - Variant65417, - Variant65418, - Variant65419, - Variant65420, - Variant65421, - Variant65422, - Variant65423, - Variant65424, - Variant65425, - Variant65426, - Variant65427, - Variant65428, - Variant65429, - Variant65430, - Variant65431, - Variant65432, - Variant65433, - Variant65434, - Variant65435, - Variant65436, - Variant65437, - Variant65438, - Variant65439, - Variant65440, - Variant65441, - Variant65442, - Variant65443, - Variant65444, - Variant65445, - Variant65446, - Variant65447, - Variant65448, - Variant65449, - Variant65450, - Variant65451, - Variant65452, - Variant65453, - Variant65454, - Variant65455, - Variant65456, - Variant65457, - Variant65458, - Variant65459, - Variant65460, - Variant65461, - Variant65462, - Variant65463, - Variant65464, - Variant65465, - Variant65466, - Variant65467, - Variant65468, - Variant65469, - Variant65470, - Variant65471, - Variant65472, - Variant65473, - Variant65474, - Variant65475, - Variant65476, - Variant65477, - Variant65478, - Variant65479, - Variant65480, - Variant65481, - Variant65482, - Variant65483, - Variant65484, - Variant65485, - Variant65486, - Variant65487, - Variant65488, - Variant65489, - Variant65490, - Variant65491, - Variant65492, - Variant65493, - Variant65494, - Variant65495, - Variant65496, - Variant65497, - Variant65498, - Variant65499, - Variant65500, - Variant65501, - Variant65502, - Variant65503, - Variant65504, - Variant65505, - Variant65506, - Variant65507, - Variant65508, - Variant65509, - Variant65510, - Variant65511, - Variant65512, - Variant65513, - Variant65514, - Variant65515, - Variant65516, - Variant65517, - Variant65518, - Variant65519, - Variant65520, - Variant65521, - Variant65522, - Variant65523, - Variant65524, - Variant65525, - Variant65526, - Variant65527, - Variant65528, - Variant65529, - Variant65530, - Variant65531, - Variant65532, - Variant65533, - Variant65534, - Variant65535, -} - -assert_impl_all!(FooI16: FromBytes); diff -Nru temporalio-1.3.0/vendor/zerocopy-derive/tests/enum_from_zeroes.rs temporalio-1.3.0/vendor/zerocopy-derive/tests/enum_from_zeroes.rs --- temporalio-1.3.0/vendor/zerocopy-derive/tests/enum_from_zeroes.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy-derive/tests/enum_from_zeroes.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,35 +0,0 @@ -// Copyright 2019 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -#![allow(warnings)] - -mod util; - -use {static_assertions::assert_impl_all, zerocopy::FromZeroes}; - -#[derive(FromZeroes)] -enum Foo { - A, -} - -assert_impl_all!(Foo: FromZeroes); - -#[derive(FromZeroes)] -enum Bar { - A = 0, -} - -assert_impl_all!(Bar: FromZeroes); - -#[derive(FromZeroes)] -enum Baz { - A = 1, - B = 0, -} - -assert_impl_all!(Baz: FromZeroes); diff -Nru temporalio-1.3.0/vendor/zerocopy-derive/tests/enum_known_layout.rs temporalio-1.3.0/vendor/zerocopy-derive/tests/enum_known_layout.rs --- temporalio-1.3.0/vendor/zerocopy-derive/tests/enum_known_layout.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy-derive/tests/enum_known_layout.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -// Copyright 2022 The Fuchsia Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#![allow(warnings)] - -mod util; - -use {static_assertions::assert_impl_all, zerocopy::KnownLayout}; - -#[derive(KnownLayout)] -enum Foo { - A, -} - -assert_impl_all!(Foo: KnownLayout); - -#[derive(KnownLayout)] -enum Bar { - A = 0, -} - -assert_impl_all!(Bar: KnownLayout); - -#[derive(KnownLayout)] -enum Baz { - A = 1, - B = 0, -} - -assert_impl_all!(Baz: KnownLayout); diff -Nru temporalio-1.3.0/vendor/zerocopy-derive/tests/enum_unaligned.rs temporalio-1.3.0/vendor/zerocopy-derive/tests/enum_unaligned.rs --- temporalio-1.3.0/vendor/zerocopy-derive/tests/enum_unaligned.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy-derive/tests/enum_unaligned.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,47 +0,0 @@ -// Copyright 2019 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -#![allow(warnings)] - -use {static_assertions::assert_impl_all, zerocopy::Unaligned}; - -// An enum is `Unaligned` if: -// - No `repr(align(N > 1))` -// - `repr(u8)` or `repr(i8)` - -#[derive(Unaligned)] -#[repr(u8)] -enum Foo { - A, -} - -assert_impl_all!(Foo: Unaligned); - -#[derive(Unaligned)] -#[repr(i8)] -enum Bar { - A, -} - -assert_impl_all!(Bar: Unaligned); - -#[derive(Unaligned)] -#[repr(u8, align(1))] -enum Baz { - A, -} - -assert_impl_all!(Baz: Unaligned); - -#[derive(Unaligned)] -#[repr(i8, align(1))] -enum Blah { - B, -} - -assert_impl_all!(Blah: Unaligned); diff -Nru temporalio-1.3.0/vendor/zerocopy-derive/tests/hygiene.rs temporalio-1.3.0/vendor/zerocopy-derive/tests/hygiene.rs --- temporalio-1.3.0/vendor/zerocopy-derive/tests/hygiene.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy-derive/tests/hygiene.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,43 +0,0 @@ -// Copyright 2019 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -// Make sure that macro hygiene will ensure that when we reference "zerocopy", -// that will work properly even if they've renamed the crate and have not -// imported its traits. - -#![allow(warnings)] - -extern crate zerocopy as _zerocopy; - -#[macro_use] -mod util; - -use std::{marker::PhantomData, option::IntoIter}; - -use static_assertions::assert_impl_all; - -#[derive( - _zerocopy::KnownLayout, _zerocopy::FromZeroes, _zerocopy::FromBytes, _zerocopy::Unaligned, -)] -#[repr(C)] -struct TypeParams<'a, T, I: Iterator> { - a: T, - c: I::Item, - d: u8, - e: PhantomData<&'a [u8]>, - f: PhantomData<&'static str>, - g: PhantomData, -} - -assert_impl_all!( - TypeParams<'static, (), IntoIter<()>>: - _zerocopy::KnownLayout, - _zerocopy::FromZeroes, - _zerocopy::FromBytes, - _zerocopy::Unaligned -); diff -Nru temporalio-1.3.0/vendor/zerocopy-derive/tests/paths_and_modules.rs temporalio-1.3.0/vendor/zerocopy-derive/tests/paths_and_modules.rs --- temporalio-1.3.0/vendor/zerocopy-derive/tests/paths_and_modules.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy-derive/tests/paths_and_modules.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,38 +0,0 @@ -// Copyright 2019 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -#![allow(warnings)] - -use zerocopy::{AsBytes, FromBytes, FromZeroes, Unaligned}; - -// Ensure that types that are use'd and types that are referenced by path work. - -mod foo { - use zerocopy::{AsBytes, FromBytes, FromZeroes, Unaligned}; - - #[derive(FromZeroes, FromBytes, AsBytes, Unaligned)] - #[repr(C)] - pub struct Foo { - foo: u8, - } - - #[derive(FromZeroes, FromBytes, AsBytes, Unaligned)] - #[repr(C)] - pub struct Bar { - bar: u8, - } -} - -use foo::Foo; - -#[derive(FromZeroes, FromBytes, AsBytes, Unaligned)] -#[repr(C)] -struct Baz { - foo: Foo, - bar: foo::Bar, -} diff -Nru temporalio-1.3.0/vendor/zerocopy-derive/tests/priv_in_pub.rs temporalio-1.3.0/vendor/zerocopy-derive/tests/priv_in_pub.rs --- temporalio-1.3.0/vendor/zerocopy-derive/tests/priv_in_pub.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy-derive/tests/priv_in_pub.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,24 +0,0 @@ -// Copyright 2019 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -use zerocopy::{AsBytes, FromBytes, FromZeroes, KnownLayout, Unaligned}; - -// These derives do not result in E0446 as of Rust 1.59.0, because of -// https://github.com/rust-lang/rust/pull/90586. -// -// This change eliminates one of the major downsides of emitting `where` -// bounds for field types (i.e., the emission of E0446 for private field -// types). - -#[derive(KnownLayout, AsBytes, FromZeroes, FromBytes, Unaligned)] -#[repr(C)] -pub struct Public(Private); - -#[derive(KnownLayout, AsBytes, FromZeroes, FromBytes, Unaligned)] -#[repr(C)] -struct Private(()); diff -Nru temporalio-1.3.0/vendor/zerocopy-derive/tests/struct_as_bytes.rs temporalio-1.3.0/vendor/zerocopy-derive/tests/struct_as_bytes.rs --- temporalio-1.3.0/vendor/zerocopy-derive/tests/struct_as_bytes.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy-derive/tests/struct_as_bytes.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,134 +0,0 @@ -// Copyright 2019 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -#![allow(warnings)] - -mod util; - -use std::{marker::PhantomData, mem::ManuallyDrop, option::IntoIter}; - -use {static_assertions::assert_impl_all, zerocopy::AsBytes}; - -use self::util::AU16; - -// A struct is `AsBytes` if: -// - all fields are `AsBytes` -// - `repr(C)` or `repr(transparent)` and -// - no padding (size of struct equals sum of size of field types) -// - `repr(packed)` - -#[derive(AsBytes)] -#[repr(C)] -struct CZst; - -assert_impl_all!(CZst: AsBytes); - -#[derive(AsBytes)] -#[repr(C)] -struct C { - a: u8, - b: u8, - c: AU16, -} - -assert_impl_all!(C: AsBytes); - -#[derive(AsBytes)] -#[repr(transparent)] -struct Transparent { - a: u8, - b: CZst, -} - -assert_impl_all!(Transparent: AsBytes); - -#[derive(AsBytes)] -#[repr(transparent)] -struct TransparentGeneric { - a: CZst, - b: T, -} - -assert_impl_all!(TransparentGeneric: AsBytes); -assert_impl_all!(TransparentGeneric<[u64]>: AsBytes); - -#[derive(AsBytes)] -#[repr(C, packed)] -struct CZstPacked; - -assert_impl_all!(CZstPacked: AsBytes); - -#[derive(AsBytes)] -#[repr(C, packed)] -struct CPacked { - a: u8, - // NOTE: The `u16` type is not guaranteed to have alignment 2, although it - // does on many platforms. However, to fix this would require a custom type - // with a `#[repr(align(2))]` attribute, and `#[repr(packed)]` types are not - // allowed to transitively contain `#[repr(align(...))]` types. Thus, we - // have no choice but to use `u16` here. Luckily, these tests run in CI on - // platforms on which `u16` has alignment 2, so this isn't that big of a - // deal. - b: u16, -} - -assert_impl_all!(CPacked: AsBytes); - -#[derive(AsBytes)] -#[repr(C, packed)] -struct CPackedGeneric { - t: T, - // Unsized types stored in `repr(packed)` structs must not be dropped - // because dropping them in-place might be unsound depending on the - // alignment of the outer struct. Sized types can be dropped by first being - // moved to an aligned stack variable, but this isn't possible with unsized - // types. - u: ManuallyDrop, -} - -assert_impl_all!(CPackedGeneric: AsBytes); -assert_impl_all!(CPackedGeneric: AsBytes); - -#[derive(AsBytes)] -#[repr(packed)] -struct Packed { - a: u8, - // NOTE: The `u16` type is not guaranteed to have alignment 2, although it - // does on many platforms. However, to fix this would require a custom type - // with a `#[repr(align(2))]` attribute, and `#[repr(packed)]` types are not - // allowed to transitively contain `#[repr(align(...))]` types. Thus, we - // have no choice but to use `u16` here. Luckily, these tests run in CI on - // platforms on which `u16` has alignment 2, so this isn't that big of a - // deal. - b: u16, -} - -assert_impl_all!(Packed: AsBytes); - -#[derive(AsBytes)] -#[repr(packed)] -struct PackedGeneric { - t: T, - // Unsized types stored in `repr(packed)` structs must not be dropped - // because dropping them in-place might be unsound depending on the - // alignment of the outer struct. Sized types can be dropped by first being - // moved to an aligned stack variable, but this isn't possible with unsized - // types. - u: ManuallyDrop, -} - -assert_impl_all!(PackedGeneric: AsBytes); -assert_impl_all!(PackedGeneric: AsBytes); - -#[derive(AsBytes)] -#[repr(transparent)] -struct Unsized { - a: [u8], -} - -assert_impl_all!(Unsized: AsBytes); diff -Nru temporalio-1.3.0/vendor/zerocopy-derive/tests/struct_from_bytes.rs temporalio-1.3.0/vendor/zerocopy-derive/tests/struct_from_bytes.rs --- temporalio-1.3.0/vendor/zerocopy-derive/tests/struct_from_bytes.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy-derive/tests/struct_from_bytes.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,64 +0,0 @@ -// Copyright 2019 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -#![allow(warnings)] - -mod util; - -use std::{marker::PhantomData, option::IntoIter}; - -use { - static_assertions::assert_impl_all, - zerocopy::{FromBytes, FromZeroes}, -}; - -use crate::util::AU16; - -// A struct is `FromBytes` if: -// - all fields are `FromBytes` - -#[derive(FromZeroes, FromBytes)] -struct Zst; - -assert_impl_all!(Zst: FromBytes); - -#[derive(FromZeroes, FromBytes)] -struct One { - a: u8, -} - -assert_impl_all!(One: FromBytes); - -#[derive(FromZeroes, FromBytes)] -struct Two { - a: u8, - b: Zst, -} - -assert_impl_all!(Two: FromBytes); - -#[derive(FromZeroes, FromBytes)] -struct Unsized { - a: [u8], -} - -assert_impl_all!(Unsized: FromBytes); - -#[derive(FromZeroes, FromBytes)] -struct TypeParams<'a, T: ?Sized, I: Iterator> { - a: I::Item, - b: u8, - c: PhantomData<&'a [u8]>, - d: PhantomData<&'static str>, - e: PhantomData, - f: T, -} - -assert_impl_all!(TypeParams<'static, (), IntoIter<()>>: FromBytes); -assert_impl_all!(TypeParams<'static, AU16, IntoIter<()>>: FromBytes); -assert_impl_all!(TypeParams<'static, [AU16], IntoIter<()>>: FromBytes); diff -Nru temporalio-1.3.0/vendor/zerocopy-derive/tests/struct_from_zeroes.rs temporalio-1.3.0/vendor/zerocopy-derive/tests/struct_from_zeroes.rs --- temporalio-1.3.0/vendor/zerocopy-derive/tests/struct_from_zeroes.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy-derive/tests/struct_from_zeroes.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,62 +0,0 @@ -// Copyright 2019 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -#![allow(warnings)] - -#[macro_use] -mod util; - -use std::{marker::PhantomData, option::IntoIter}; - -use {static_assertions::assert_impl_all, zerocopy::FromZeroes}; - -use crate::util::AU16; - -// A struct is `FromZeroes` if: -// - all fields are `FromZeroes` - -#[derive(FromZeroes)] -struct Zst; - -assert_impl_all!(Zst: FromZeroes); - -#[derive(FromZeroes)] -struct One { - a: bool, -} - -assert_impl_all!(One: FromZeroes); - -#[derive(FromZeroes)] -struct Two { - a: bool, - b: Zst, -} - -assert_impl_all!(Two: FromZeroes); - -#[derive(FromZeroes)] -struct Unsized { - a: [u8], -} - -assert_impl_all!(Unsized: FromZeroes); - -#[derive(FromZeroes)] -struct TypeParams<'a, T: ?Sized, I: Iterator> { - a: I::Item, - b: u8, - c: PhantomData<&'a [u8]>, - d: PhantomData<&'static str>, - e: PhantomData, - f: T, -} - -assert_impl_all!(TypeParams<'static, (), IntoIter<()>>: FromZeroes); -assert_impl_all!(TypeParams<'static, AU16, IntoIter<()>>: FromZeroes); -assert_impl_all!(TypeParams<'static, [AU16], IntoIter<()>>: FromZeroes); diff -Nru temporalio-1.3.0/vendor/zerocopy-derive/tests/struct_known_layout.rs temporalio-1.3.0/vendor/zerocopy-derive/tests/struct_known_layout.rs --- temporalio-1.3.0/vendor/zerocopy-derive/tests/struct_known_layout.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy-derive/tests/struct_known_layout.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,47 +0,0 @@ -// Copyright 2022 The Fuchsia Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#![allow(warnings)] - -#[macro_use] -mod util; - -use std::{marker::PhantomData, option::IntoIter}; - -use {static_assertions::assert_impl_all, zerocopy::KnownLayout}; - -use crate::util::AU16; - -#[derive(KnownLayout)] -struct Zst; - -assert_impl_all!(Zst: KnownLayout); - -#[derive(KnownLayout)] -struct One { - a: bool, -} - -assert_impl_all!(One: KnownLayout); - -#[derive(KnownLayout)] -struct Two { - a: bool, - b: Zst, -} - -assert_impl_all!(Two: KnownLayout); - -#[derive(KnownLayout)] -struct TypeParams<'a, T, I: Iterator> { - a: I::Item, - b: u8, - c: PhantomData<&'a [u8]>, - d: PhantomData<&'static str>, - e: PhantomData, - f: T, -} - -assert_impl_all!(TypeParams<'static, (), IntoIter<()>>: KnownLayout); -assert_impl_all!(TypeParams<'static, AU16, IntoIter<()>>: KnownLayout); diff -Nru temporalio-1.3.0/vendor/zerocopy-derive/tests/struct_unaligned.rs temporalio-1.3.0/vendor/zerocopy-derive/tests/struct_unaligned.rs --- temporalio-1.3.0/vendor/zerocopy-derive/tests/struct_unaligned.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy-derive/tests/struct_unaligned.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,85 +0,0 @@ -// Copyright 2019 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -#![allow(warnings)] - -mod util; - -use std::{marker::PhantomData, option::IntoIter}; - -use {static_assertions::assert_impl_all, zerocopy::Unaligned}; - -use crate::util::AU16; - -// A struct is `Unaligned` if: -// - `repr(align)` is no more than 1 and either -// - `repr(C)` or `repr(transparent)` and -// - all fields Unaligned -// - `repr(packed)` - -#[derive(Unaligned)] -#[repr(C)] -struct Foo { - a: u8, -} - -assert_impl_all!(Foo: Unaligned); - -#[derive(Unaligned)] -#[repr(transparent)] -struct Bar { - a: u8, -} - -assert_impl_all!(Bar: Unaligned); - -#[derive(Unaligned)] -#[repr(packed)] -struct Baz { - // NOTE: The `u16` type is not guaranteed to have alignment 2, although it - // does on many platforms. However, to fix this would require a custom type - // with a `#[repr(align(2))]` attribute, and `#[repr(packed)]` types are not - // allowed to transitively contain `#[repr(align(...))]` types. Thus, we - // have no choice but to use `u16` here. Luckily, these tests run in CI on - // platforms on which `u16` has alignment 2, so this isn't that big of a - // deal. - a: u16, -} - -assert_impl_all!(Baz: Unaligned); - -#[derive(Unaligned)] -#[repr(C, align(1))] -struct FooAlign { - a: u8, -} - -assert_impl_all!(FooAlign: Unaligned); - -#[derive(Unaligned)] -#[repr(transparent)] -struct Unsized { - a: [u8], -} - -assert_impl_all!(Unsized: Unaligned); - -#[derive(Unaligned)] -#[repr(C)] -struct TypeParams<'a, T: ?Sized, I: Iterator> { - a: I::Item, - b: u8, - c: PhantomData<&'a [u8]>, - d: PhantomData<&'static str>, - e: PhantomData, - f: T, -} - -assert_impl_all!(TypeParams<'static, (), IntoIter<()>>: Unaligned); -assert_impl_all!(TypeParams<'static, u8, IntoIter<()>>: Unaligned); -assert_impl_all!(TypeParams<'static, [u8], IntoIter<()>>: Unaligned); diff -Nru temporalio-1.3.0/vendor/zerocopy-derive/tests/trybuild.rs temporalio-1.3.0/vendor/zerocopy-derive/tests/trybuild.rs --- temporalio-1.3.0/vendor/zerocopy-derive/tests/trybuild.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy-derive/tests/trybuild.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,19 +0,0 @@ -// Copyright 2019 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -#[test] -#[cfg_attr(miri, ignore)] -fn ui() { - let version = testutil::ToolchainVersion::extract_from_pwd().unwrap(); - // See the doc comment on this method for an explanation of what this does - // and why we store source files in different directories. - let source_files_dirname = version.get_ui_source_files_dirname_and_maybe_print_warning(); - - let t = trybuild::TestCases::new(); - t.compile_fail(format!("tests/{source_files_dirname}/*.rs")); -} diff -Nru temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-msrv/derive_transparent.rs temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-msrv/derive_transparent.rs --- temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-msrv/derive_transparent.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-msrv/derive_transparent.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,40 +0,0 @@ -// Copyright 2019 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -#[path = "../util.rs"] -mod util; - -use core::marker::PhantomData; - -use { - static_assertions::assert_impl_all, - zerocopy::{AsBytes, FromBytes, FromZeroes, Unaligned}, -}; - -use self::util::NotZerocopy; - -fn main() {} - -// Test generic transparent structs - -#[derive(AsBytes, FromZeroes, FromBytes, Unaligned)] -#[repr(transparent)] -struct TransparentStruct { - inner: T, - _phantom: PhantomData<()>, -} - -// It should be legal to derive these traits on a transparent struct, but it -// must also ensure the traits are only implemented when the inner type -// implements them. -assert_impl_all!(TransparentStruct: FromZeroes); -assert_impl_all!(TransparentStruct: FromBytes); -assert_impl_all!(TransparentStruct: AsBytes); -assert_impl_all!(TransparentStruct: Unaligned); diff -Nru temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-msrv/derive_transparent.stderr temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-msrv/derive_transparent.stderr --- temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-msrv/derive_transparent.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-msrv/derive_transparent.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,71 +0,0 @@ -error[E0277]: the trait bound `NotZerocopy: FromZeroes` is not satisfied - --> tests/ui-msrv/derive_transparent.rs:37:1 - | -37 | assert_impl_all!(TransparentStruct: FromZeroes); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `FromZeroes` is not implemented for `NotZerocopy` - | -note: required because of the requirements on the impl of `FromZeroes` for `TransparentStruct` - --> tests/ui-msrv/derive_transparent.rs:27:19 - | -27 | #[derive(AsBytes, FromZeroes, FromBytes, Unaligned)] - | ^^^^^^^^^^ -note: required by a bound in `_::{closure#0}::assert_impl_all` - --> tests/ui-msrv/derive_transparent.rs:37:1 - | -37 | assert_impl_all!(TransparentStruct: FromZeroes); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `_::{closure#0}::assert_impl_all` - = note: this error originates in the macro `assert_impl_all` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the trait bound `NotZerocopy: FromBytes` is not satisfied - --> tests/ui-msrv/derive_transparent.rs:38:1 - | -38 | assert_impl_all!(TransparentStruct: FromBytes); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `FromBytes` is not implemented for `NotZerocopy` - | -note: required because of the requirements on the impl of `FromBytes` for `TransparentStruct` - --> tests/ui-msrv/derive_transparent.rs:27:31 - | -27 | #[derive(AsBytes, FromZeroes, FromBytes, Unaligned)] - | ^^^^^^^^^ -note: required by a bound in `_::{closure#0}::assert_impl_all` - --> tests/ui-msrv/derive_transparent.rs:38:1 - | -38 | assert_impl_all!(TransparentStruct: FromBytes); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `_::{closure#0}::assert_impl_all` - = note: this error originates in the macro `assert_impl_all` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the trait bound `NotZerocopy: AsBytes` is not satisfied - --> tests/ui-msrv/derive_transparent.rs:39:1 - | -39 | assert_impl_all!(TransparentStruct: AsBytes); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `AsBytes` is not implemented for `NotZerocopy` - | -note: required because of the requirements on the impl of `AsBytes` for `TransparentStruct` - --> tests/ui-msrv/derive_transparent.rs:27:10 - | -27 | #[derive(AsBytes, FromZeroes, FromBytes, Unaligned)] - | ^^^^^^^ -note: required by a bound in `_::{closure#0}::assert_impl_all` - --> tests/ui-msrv/derive_transparent.rs:39:1 - | -39 | assert_impl_all!(TransparentStruct: AsBytes); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `_::{closure#0}::assert_impl_all` - = note: this error originates in the macro `assert_impl_all` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the trait bound `NotZerocopy: Unaligned` is not satisfied - --> tests/ui-msrv/derive_transparent.rs:40:1 - | -40 | assert_impl_all!(TransparentStruct: Unaligned); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Unaligned` is not implemented for `NotZerocopy` - | -note: required because of the requirements on the impl of `Unaligned` for `TransparentStruct` - --> tests/ui-msrv/derive_transparent.rs:27:42 - | -27 | #[derive(AsBytes, FromZeroes, FromBytes, Unaligned)] - | ^^^^^^^^^ -note: required by a bound in `_::{closure#0}::assert_impl_all` - --> tests/ui-msrv/derive_transparent.rs:40:1 - | -40 | assert_impl_all!(TransparentStruct: Unaligned); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `_::{closure#0}::assert_impl_all` - = note: this error originates in the macro `assert_impl_all` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-msrv/enum_from_bytes_u8_too_few.rs temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-msrv/enum_from_bytes_u8_too_few.rs --- temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-msrv/enum_from_bytes_u8_too_few.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-msrv/enum_from_bytes_u8_too_few.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,272 +0,0 @@ -// Copyright 2019 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -#[macro_use] -extern crate zerocopy; - -fn main() {} - -#[derive(FromBytes)] -#[repr(u8)] -enum Foo { - Variant0, - Variant1, - Variant2, - Variant3, - Variant4, - Variant5, - Variant6, - Variant7, - Variant8, - Variant9, - Variant10, - Variant11, - Variant12, - Variant13, - Variant14, - Variant15, - Variant16, - Variant17, - Variant18, - Variant19, - Variant20, - Variant21, - Variant22, - Variant23, - Variant24, - Variant25, - Variant26, - Variant27, - Variant28, - Variant29, - Variant30, - Variant31, - Variant32, - Variant33, - Variant34, - Variant35, - Variant36, - Variant37, - Variant38, - Variant39, - Variant40, - Variant41, - Variant42, - Variant43, - Variant44, - Variant45, - Variant46, - Variant47, - Variant48, - Variant49, - Variant50, - Variant51, - Variant52, - Variant53, - Variant54, - Variant55, - Variant56, - Variant57, - Variant58, - Variant59, - Variant60, - Variant61, - Variant62, - Variant63, - Variant64, - Variant65, - Variant66, - Variant67, - Variant68, - Variant69, - Variant70, - Variant71, - Variant72, - Variant73, - Variant74, - Variant75, - Variant76, - Variant77, - Variant78, - Variant79, - Variant80, - Variant81, - Variant82, - Variant83, - Variant84, - Variant85, - Variant86, - Variant87, - Variant88, - Variant89, - Variant90, - Variant91, - Variant92, - Variant93, - Variant94, - Variant95, - Variant96, - Variant97, - Variant98, - Variant99, - Variant100, - Variant101, - Variant102, - Variant103, - Variant104, - Variant105, - Variant106, - Variant107, - Variant108, - Variant109, - Variant110, - Variant111, - Variant112, - Variant113, - Variant114, - Variant115, - Variant116, - Variant117, - Variant118, - Variant119, - Variant120, - Variant121, - Variant122, - Variant123, - Variant124, - Variant125, - Variant126, - Variant127, - Variant128, - Variant129, - Variant130, - Variant131, - Variant132, - Variant133, - Variant134, - Variant135, - Variant136, - Variant137, - Variant138, - Variant139, - Variant140, - Variant141, - Variant142, - Variant143, - Variant144, - Variant145, - Variant146, - Variant147, - Variant148, - Variant149, - Variant150, - Variant151, - Variant152, - Variant153, - Variant154, - Variant155, - Variant156, - Variant157, - Variant158, - Variant159, - Variant160, - Variant161, - Variant162, - Variant163, - Variant164, - Variant165, - Variant166, - Variant167, - Variant168, - Variant169, - Variant170, - Variant171, - Variant172, - Variant173, - Variant174, - Variant175, - Variant176, - Variant177, - Variant178, - Variant179, - Variant180, - Variant181, - Variant182, - Variant183, - Variant184, - Variant185, - Variant186, - Variant187, - Variant188, - Variant189, - Variant190, - Variant191, - Variant192, - Variant193, - Variant194, - Variant195, - Variant196, - Variant197, - Variant198, - Variant199, - Variant200, - Variant201, - Variant202, - Variant203, - Variant204, - Variant205, - Variant206, - Variant207, - Variant208, - Variant209, - Variant210, - Variant211, - Variant212, - Variant213, - Variant214, - Variant215, - Variant216, - Variant217, - Variant218, - Variant219, - Variant220, - Variant221, - Variant222, - Variant223, - Variant224, - Variant225, - Variant226, - Variant227, - Variant228, - Variant229, - Variant230, - Variant231, - Variant232, - Variant233, - Variant234, - Variant235, - Variant236, - Variant237, - Variant238, - Variant239, - Variant240, - Variant241, - Variant242, - Variant243, - Variant244, - Variant245, - Variant246, - Variant247, - Variant248, - Variant249, - Variant250, - Variant251, - Variant252, - Variant253, - Variant254, -} diff -Nru temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-msrv/enum_from_bytes_u8_too_few.stderr temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-msrv/enum_from_bytes_u8_too_few.stderr --- temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-msrv/enum_from_bytes_u8_too_few.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-msrv/enum_from_bytes_u8_too_few.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,11 +0,0 @@ -error: FromBytes only supported on repr(u8) enum with 256 variants - --> tests/ui-msrv/enum_from_bytes_u8_too_few.rs:15:1 - | -15 | / #[repr(u8)] -16 | | enum Foo { -17 | | Variant0, -18 | | Variant1, -... | -271 | | Variant254, -272 | | } - | |_^ diff -Nru temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-msrv/enum.rs temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-msrv/enum.rs --- temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-msrv/enum.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-msrv/enum.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,194 +0,0 @@ -// Copyright 2019 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -#[macro_use] -extern crate zerocopy; - -fn main() {} - -// -// Generic errors -// - -#[derive(FromZeroes, FromBytes)] -#[repr("foo")] -enum Generic1 { - A, -} - -#[derive(FromZeroes, FromBytes)] -#[repr(foo)] -enum Generic2 { - A, -} - -#[derive(FromZeroes, FromBytes)] -#[repr(transparent)] -enum Generic3 { - A, -} - -#[derive(FromZeroes, FromBytes)] -#[repr(u8, u16)] -enum Generic4 { - A, -} - -#[derive(FromZeroes, FromBytes)] -enum Generic5 { - A, -} - -// -// FromZeroes errors -// - -#[derive(FromZeroes)] -enum FromZeroes1 { - A(u8), -} - -#[derive(FromZeroes)] -enum FromZeroes2 { - A, - B(u8), -} - -#[derive(FromZeroes)] -enum FromZeroes3 { - A = 1, - B, -} - -// -// FromBytes errors -// - -#[derive(FromZeroes, FromBytes)] -#[repr(C)] -enum FromBytes1 { - A, -} - -#[derive(FromZeroes, FromBytes)] -#[repr(usize)] -enum FromBytes2 { - A, -} - -#[derive(FromZeroes, FromBytes)] -#[repr(isize)] -enum FromBytes3 { - A, -} - -#[derive(FromZeroes, FromBytes)] -#[repr(u32)] -enum FromBytes4 { - A, -} - -#[derive(FromZeroes, FromBytes)] -#[repr(i32)] -enum FromBytes5 { - A, -} - -#[derive(FromZeroes, FromBytes)] -#[repr(u64)] -enum FromBytes6 { - A, -} - -#[derive(FromZeroes, FromBytes)] -#[repr(i64)] -enum FromBytes7 { - A, -} - -// -// Unaligned errors -// - -#[derive(Unaligned)] -#[repr(C)] -enum Unaligned1 { - A, -} - -#[derive(Unaligned)] -#[repr(u16)] -enum Unaligned2 { - A, -} - -#[derive(Unaligned)] -#[repr(i16)] -enum Unaligned3 { - A, -} - -#[derive(Unaligned)] -#[repr(u32)] -enum Unaligned4 { - A, -} - -#[derive(Unaligned)] -#[repr(i32)] -enum Unaligned5 { - A, -} - -#[derive(Unaligned)] -#[repr(u64)] -enum Unaligned6 { - A, -} - -#[derive(Unaligned)] -#[repr(i64)] -enum Unaligned7 { - A, -} - -#[derive(Unaligned)] -#[repr(usize)] -enum Unaligned8 { - A, -} - -#[derive(Unaligned)] -#[repr(isize)] -enum Unaligned9 { - A, -} - -#[derive(Unaligned)] -#[repr(u8, align(2))] -enum Unaligned10 { - A, -} - -#[derive(Unaligned)] -#[repr(i8, align(2))] -enum Unaligned11 { - A, -} - -#[derive(Unaligned)] -#[repr(align(1), align(2))] -enum Unaligned12 { - A, -} - -#[derive(Unaligned)] -#[repr(align(2), align(4))] -enum Unaligned13 { - A, -} diff -Nru temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-msrv/enum.stderr temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-msrv/enum.stderr --- temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-msrv/enum.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-msrv/enum.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,199 +0,0 @@ -error: unrecognized representation hint - --> tests/ui-msrv/enum.rs:19:8 - | -19 | #[repr("foo")] - | ^^^^^ - -error: unrecognized representation hint - --> tests/ui-msrv/enum.rs:25:8 - | -25 | #[repr(foo)] - | ^^^ - -error: unsupported representation for deriving FromBytes, AsBytes, or Unaligned on an enum - --> tests/ui-msrv/enum.rs:31:8 - | -31 | #[repr(transparent)] - | ^^^^^^^^^^^ - -error: conflicting representation hints - --> tests/ui-msrv/enum.rs:37:1 - | -37 | #[repr(u8, u16)] - | ^ - -error: must have a non-align #[repr(...)] attribute in order to guarantee this type's memory layout - --> tests/ui-msrv/enum.rs:42:22 - | -42 | #[derive(FromZeroes, FromBytes)] - | ^^^^^^^^^ - | - = note: this error originates in the derive macro `FromBytes` (in Nightly builds, run with -Z macro-backtrace for more info) - -error: only C-like enums can implement FromZeroes - --> tests/ui-msrv/enum.rs:52:1 - | -52 | / enum FromZeroes1 { -53 | | A(u8), -54 | | } - | |_^ - -error: only C-like enums can implement FromZeroes - --> tests/ui-msrv/enum.rs:57:1 - | -57 | / enum FromZeroes2 { -58 | | A, -59 | | B(u8), -60 | | } - | |_^ - -error: FromZeroes only supported on enums with a variant that has a discriminant of `0` - --> tests/ui-msrv/enum.rs:63:1 - | -63 | / enum FromZeroes3 { -64 | | A = 1, -65 | | B, -66 | | } - | |_^ - -error: FromBytes requires repr of "u8", "u16", "i8", or "i16" - --> tests/ui-msrv/enum.rs:73:8 - | -73 | #[repr(C)] - | ^ - -error: FromBytes requires repr of "u8", "u16", "i8", or "i16" - --> tests/ui-msrv/enum.rs:79:8 - | -79 | #[repr(usize)] - | ^^^^^ - -error: FromBytes requires repr of "u8", "u16", "i8", or "i16" - --> tests/ui-msrv/enum.rs:85:8 - | -85 | #[repr(isize)] - | ^^^^^ - -error: FromBytes requires repr of "u8", "u16", "i8", or "i16" - --> tests/ui-msrv/enum.rs:91:8 - | -91 | #[repr(u32)] - | ^^^ - -error: FromBytes requires repr of "u8", "u16", "i8", or "i16" - --> tests/ui-msrv/enum.rs:97:8 - | -97 | #[repr(i32)] - | ^^^ - -error: FromBytes requires repr of "u8", "u16", "i8", or "i16" - --> tests/ui-msrv/enum.rs:103:8 - | -103 | #[repr(u64)] - | ^^^ - -error: FromBytes requires repr of "u8", "u16", "i8", or "i16" - --> tests/ui-msrv/enum.rs:109:8 - | -109 | #[repr(i64)] - | ^^^ - -error: Unaligned requires repr of "u8" or "i8", and no alignment (i.e., repr(align(N > 1))) - --> tests/ui-msrv/enum.rs:119:8 - | -119 | #[repr(C)] - | ^ - -error: Unaligned requires repr of "u8" or "i8", and no alignment (i.e., repr(align(N > 1))) - --> tests/ui-msrv/enum.rs:125:8 - | -125 | #[repr(u16)] - | ^^^ - -error: Unaligned requires repr of "u8" or "i8", and no alignment (i.e., repr(align(N > 1))) - --> tests/ui-msrv/enum.rs:131:8 - | -131 | #[repr(i16)] - | ^^^ - -error: Unaligned requires repr of "u8" or "i8", and no alignment (i.e., repr(align(N > 1))) - --> tests/ui-msrv/enum.rs:137:8 - | -137 | #[repr(u32)] - | ^^^ - -error: Unaligned requires repr of "u8" or "i8", and no alignment (i.e., repr(align(N > 1))) - --> tests/ui-msrv/enum.rs:143:8 - | -143 | #[repr(i32)] - | ^^^ - -error: Unaligned requires repr of "u8" or "i8", and no alignment (i.e., repr(align(N > 1))) - --> tests/ui-msrv/enum.rs:149:8 - | -149 | #[repr(u64)] - | ^^^ - -error: Unaligned requires repr of "u8" or "i8", and no alignment (i.e., repr(align(N > 1))) - --> tests/ui-msrv/enum.rs:155:8 - | -155 | #[repr(i64)] - | ^^^ - -error: Unaligned requires repr of "u8" or "i8", and no alignment (i.e., repr(align(N > 1))) - --> tests/ui-msrv/enum.rs:161:8 - | -161 | #[repr(usize)] - | ^^^^^ - -error: Unaligned requires repr of "u8" or "i8", and no alignment (i.e., repr(align(N > 1))) - --> tests/ui-msrv/enum.rs:167:8 - | -167 | #[repr(isize)] - | ^^^^^ - -error: cannot derive Unaligned with repr(align(N > 1)) - --> tests/ui-msrv/enum.rs:173:12 - | -173 | #[repr(u8, align(2))] - | ^^^^^^^^ - -error: cannot derive Unaligned with repr(align(N > 1)) - --> tests/ui-msrv/enum.rs:179:12 - | -179 | #[repr(i8, align(2))] - | ^^^^^^^^ - -error: cannot derive Unaligned with repr(align(N > 1)) - --> tests/ui-msrv/enum.rs:185:18 - | -185 | #[repr(align(1), align(2))] - | ^^^^^^^^ - -error: cannot derive Unaligned with repr(align(N > 1)) - --> tests/ui-msrv/enum.rs:191:8 - | -191 | #[repr(align(2), align(4))] - | ^^^^^^^^ - -error[E0565]: meta item in `repr` must be an identifier - --> tests/ui-msrv/enum.rs:19:8 - | -19 | #[repr("foo")] - | ^^^^^ - -error[E0552]: unrecognized representation hint - --> tests/ui-msrv/enum.rs:25:8 - | -25 | #[repr(foo)] - | ^^^ - -error[E0566]: conflicting representation hints - --> tests/ui-msrv/enum.rs:37:8 - | -37 | #[repr(u8, u16)] - | ^^ ^^^ - | - = note: `#[deny(conflicting_repr_hints)]` on by default - = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = note: for more information, see issue #68585 diff -Nru temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-msrv/late_compile_pass.rs temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-msrv/late_compile_pass.rs --- temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-msrv/late_compile_pass.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-msrv/late_compile_pass.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,74 +0,0 @@ -// Copyright 2019 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -#[macro_use] -extern crate zerocopy; - -#[path = "../util.rs"] -mod util; - -use self::util::{NotZerocopy, AU16}; - -fn main() {} - -// These tests cause errors which are generated by a later compilation pass than -// the other errors we generate, and so if they're compiled in the same file, -// the compiler will never get to that pass, and so we won't get the errors. - -// -// FromZeroes errors -// - -#[derive(FromZeroes)] -struct FromZeroes1 { - value: NotZerocopy, -} - -// -// FromBytes errors -// - -#[derive(FromBytes)] -struct FromBytes1 { - value: NotZerocopy, -} - -// -// AsBytes errors -// - -#[derive(AsBytes)] -#[repr(C)] -struct AsBytes1 { - value: NotZerocopy, -} - -// -// Unaligned errors -// - -#[derive(Unaligned)] -#[repr(C)] -struct Unaligned1 { - aligned: AU16, -} - -// This specifically tests a bug we had in an old version of the code in which -// the trait bound would only be enforced for the first field's type. -#[derive(Unaligned)] -#[repr(C)] -struct Unaligned2 { - unaligned: u8, - aligned: AU16, -} - -#[derive(Unaligned)] -#[repr(transparent)] -struct Unaligned3 { - aligned: AU16, -} diff -Nru temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-msrv/late_compile_pass.stderr temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-msrv/late_compile_pass.stderr --- temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-msrv/late_compile_pass.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-msrv/late_compile_pass.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,66 +0,0 @@ -error[E0277]: the trait bound `NotZerocopy: FromZeroes` is not satisfied - --> tests/ui-msrv/late_compile_pass.rs:27:10 - | -27 | #[derive(FromZeroes)] - | ^^^^^^^^^^ the trait `FromZeroes` is not implemented for `NotZerocopy` - | - = help: see issue #48214 - = note: this error originates in the derive macro `FromZeroes` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the trait bound `NotZerocopy: FromBytes` is not satisfied - --> tests/ui-msrv/late_compile_pass.rs:36:10 - | -36 | #[derive(FromBytes)] - | ^^^^^^^^^ the trait `FromBytes` is not implemented for `NotZerocopy` - | - = help: see issue #48214 - = note: this error originates in the derive macro `FromBytes` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the trait bound `FromBytes1: FromZeroes` is not satisfied - --> tests/ui-msrv/late_compile_pass.rs:36:10 - | -36 | #[derive(FromBytes)] - | ^^^^^^^^^ the trait `FromZeroes` is not implemented for `FromBytes1` - | -note: required by a bound in `FromBytes` - --> $WORKSPACE/src/lib.rs - | - | pub unsafe trait FromBytes: FromZeroes { - | ^^^^^^^^^^ required by this bound in `FromBytes` - = note: this error originates in the derive macro `FromBytes` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the trait bound `NotZerocopy: AsBytes` is not satisfied - --> tests/ui-msrv/late_compile_pass.rs:45:10 - | -45 | #[derive(AsBytes)] - | ^^^^^^^ the trait `AsBytes` is not implemented for `NotZerocopy` - | - = help: see issue #48214 - = note: this error originates in the derive macro `AsBytes` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the trait bound `AU16: Unaligned` is not satisfied - --> tests/ui-msrv/late_compile_pass.rs:55:10 - | -55 | #[derive(Unaligned)] - | ^^^^^^^^^ the trait `Unaligned` is not implemented for `AU16` - | - = help: see issue #48214 - = note: this error originates in the derive macro `Unaligned` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the trait bound `AU16: Unaligned` is not satisfied - --> tests/ui-msrv/late_compile_pass.rs:63:10 - | -63 | #[derive(Unaligned)] - | ^^^^^^^^^ the trait `Unaligned` is not implemented for `AU16` - | - = help: see issue #48214 - = note: this error originates in the derive macro `Unaligned` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the trait bound `AU16: Unaligned` is not satisfied - --> tests/ui-msrv/late_compile_pass.rs:70:10 - | -70 | #[derive(Unaligned)] - | ^^^^^^^^^ the trait `Unaligned` is not implemented for `AU16` - | - = help: see issue #48214 - = note: this error originates in the derive macro `Unaligned` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-msrv/struct.rs temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-msrv/struct.rs --- temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-msrv/struct.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-msrv/struct.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,75 +0,0 @@ -// Copyright 2019 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -#[macro_use] -extern crate zerocopy; - -#[path = "../util.rs"] -mod util; - -use static_assertions::assert_impl_all; -use zerocopy::KnownLayout; - -use self::util::AU16; - -fn main() {} - -// -// KnownLayout errors -// - -#[derive(KnownLayout)] -struct KnownLayout1([u8]); - -assert_impl_all!(KnownLayout1: KnownLayout); - -#[derive(KnownLayout)] -struct KnownLayout2(T); - -assert_impl_all!(KnownLayout2<[u8]>: KnownLayout); - -// -// AsBytes errors -// - -#[derive(AsBytes)] -#[repr(C)] -struct AsBytes1(T); - -#[derive(AsBytes)] -#[repr(C)] -struct AsBytes2 { - foo: u8, - bar: AU16, -} - -// -// Unaligned errors -// - -#[derive(Unaligned)] -#[repr(C, align(2))] -struct Unaligned1; - -#[derive(Unaligned)] -#[repr(transparent, align(2))] -struct Unaligned2 { - foo: u8, -} - -#[derive(Unaligned)] -#[repr(packed, align(2))] -struct Unaligned3; - -#[derive(Unaligned)] -#[repr(align(1), align(2))] -struct Unaligned4; - -#[derive(Unaligned)] -#[repr(align(2), align(4))] -struct Unaligned5; diff -Nru temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-msrv/struct.stderr temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-msrv/struct.stderr --- temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-msrv/struct.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-msrv/struct.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,54 +0,0 @@ -error: unsupported on generic structs that are not repr(transparent) or repr(packed) - --> tests/ui-msrv/struct.rs:40:10 - | -40 | #[derive(AsBytes)] - | ^^^^^^^ - | - = note: this error originates in the derive macro `AsBytes` (in Nightly builds, run with -Z macro-backtrace for more info) - -error: cannot derive Unaligned with repr(align(N > 1)) - --> tests/ui-msrv/struct.rs:56:11 - | -56 | #[repr(C, align(2))] - | ^^^^^^^^ - -error: cannot derive Unaligned with repr(align(N > 1)) - --> tests/ui-msrv/struct.rs:60:21 - | -60 | #[repr(transparent, align(2))] - | ^^^^^^^^ - -error: cannot derive Unaligned with repr(align(N > 1)) - --> tests/ui-msrv/struct.rs:66:16 - | -66 | #[repr(packed, align(2))] - | ^^^^^^^^ - -error: cannot derive Unaligned with repr(align(N > 1)) - --> tests/ui-msrv/struct.rs:70:18 - | -70 | #[repr(align(1), align(2))] - | ^^^^^^^^ - -error: cannot derive Unaligned with repr(align(N > 1)) - --> tests/ui-msrv/struct.rs:74:8 - | -74 | #[repr(align(2), align(4))] - | ^^^^^^^^ - -error[E0692]: transparent struct cannot have other repr hints - --> tests/ui-msrv/struct.rs:60:8 - | -60 | #[repr(transparent, align(2))] - | ^^^^^^^^^^^ ^^^^^^^^ - -error[E0277]: the trait bound `HasPadding: ShouldBe` is not satisfied - --> tests/ui-msrv/struct.rs:44:10 - | -44 | #[derive(AsBytes)] - | ^^^^^^^ the trait `ShouldBe` is not implemented for `HasPadding` - | - = help: the following implementations were found: - as ShouldBe> - = help: see issue #48214 - = note: this error originates in the derive macro `AsBytes` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-msrv/union.rs temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-msrv/union.rs --- temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-msrv/union.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-msrv/union.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,73 +0,0 @@ -// Copyright 2019 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -#[macro_use] -extern crate zerocopy; - -#[path = "../util.rs"] -mod util; - -use self::util::AU16; -use std::mem::ManuallyDrop; - -fn main() {} - -// -// AsBytes errors -// - -#[derive(AsBytes)] -#[repr(C)] -union AsBytes1 { - foo: ManuallyDrop, -} - -#[derive(AsBytes)] -#[repr(C)] -union AsBytes2 { - foo: u8, - bar: [u8; 2], -} - -// -// Unaligned errors -// - -#[derive(Unaligned)] -#[repr(C, align(2))] -union Unaligned1 { - foo: i16, - bar: AU16, -} - -// Transparent unions are unstable; see issue #60405 -// for more information. - -// #[derive(Unaligned)] -// #[repr(transparent, align(2))] -// union Unaligned2 { -// foo: u8, -// } - -#[derive(Unaligned)] -#[repr(packed, align(2))] -union Unaligned3 { - foo: u8, -} - -#[derive(Unaligned)] -#[repr(align(1), align(2))] -struct Unaligned4 { - foo: u8, -} - -#[derive(Unaligned)] -#[repr(align(2), align(4))] -struct Unaligned5 { - foo: u8, -} diff -Nru temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-msrv/union.stderr temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-msrv/union.stderr --- temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-msrv/union.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-msrv/union.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,42 +0,0 @@ -error: unsupported on types with type parameters - --> tests/ui-msrv/union.rs:24:10 - | -24 | #[derive(AsBytes)] - | ^^^^^^^ - | - = note: this error originates in the derive macro `AsBytes` (in Nightly builds, run with -Z macro-backtrace for more info) - -error: cannot derive Unaligned with repr(align(N > 1)) - --> tests/ui-msrv/union.rs:42:11 - | -42 | #[repr(C, align(2))] - | ^^^^^^^^ - -error: cannot derive Unaligned with repr(align(N > 1)) - --> tests/ui-msrv/union.rs:58:16 - | -58 | #[repr(packed, align(2))] - | ^^^^^^^^ - -error: cannot derive Unaligned with repr(align(N > 1)) - --> tests/ui-msrv/union.rs:64:18 - | -64 | #[repr(align(1), align(2))] - | ^^^^^^^^ - -error: cannot derive Unaligned with repr(align(N > 1)) - --> tests/ui-msrv/union.rs:70:8 - | -70 | #[repr(align(2), align(4))] - | ^^^^^^^^ - -error[E0277]: the trait bound `HasPadding: ShouldBe` is not satisfied - --> tests/ui-msrv/union.rs:30:10 - | -30 | #[derive(AsBytes)] - | ^^^^^^^ the trait `ShouldBe` is not implemented for `HasPadding` - | - = help: the following implementations were found: - as ShouldBe> - = help: see issue #48214 - = note: this error originates in the derive macro `AsBytes` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-nightly/derive_transparent.rs temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-nightly/derive_transparent.rs --- temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-nightly/derive_transparent.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-nightly/derive_transparent.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,40 +0,0 @@ -// Copyright 2019 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -#[path = "../util.rs"] -mod util; - -use core::marker::PhantomData; - -use { - static_assertions::assert_impl_all, - zerocopy::{AsBytes, FromBytes, FromZeroes, Unaligned}, -}; - -use self::util::NotZerocopy; - -fn main() {} - -// Test generic transparent structs - -#[derive(AsBytes, FromZeroes, FromBytes, Unaligned)] -#[repr(transparent)] -struct TransparentStruct { - inner: T, - _phantom: PhantomData<()>, -} - -// It should be legal to derive these traits on a transparent struct, but it -// must also ensure the traits are only implemented when the inner type -// implements them. -assert_impl_all!(TransparentStruct: FromZeroes); -assert_impl_all!(TransparentStruct: FromBytes); -assert_impl_all!(TransparentStruct: AsBytes); -assert_impl_all!(TransparentStruct: Unaligned); diff -Nru temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-nightly/derive_transparent.stderr temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-nightly/derive_transparent.stderr --- temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-nightly/derive_transparent.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-nightly/derive_transparent.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,111 +0,0 @@ -error[E0277]: the trait bound `NotZerocopy: FromZeroes` is not satisfied - --> tests/ui-nightly/derive_transparent.rs:37:18 - | -37 | assert_impl_all!(TransparentStruct: FromZeroes); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `FromZeroes` is not implemented for `NotZerocopy` - | - = help: the following other types implement trait `FromZeroes`: - bool - char - isize - i8 - i16 - i32 - i64 - i128 - and $N others -note: required for `TransparentStruct` to implement `FromZeroes` - --> tests/ui-nightly/derive_transparent.rs:27:19 - | -27 | #[derive(AsBytes, FromZeroes, FromBytes, Unaligned)] - | ^^^^^^^^^^ unsatisfied trait bound introduced in this `derive` macro -note: required by a bound in `_::{closure#0}::assert_impl_all` - --> tests/ui-nightly/derive_transparent.rs:37:1 - | -37 | assert_impl_all!(TransparentStruct: FromZeroes); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `assert_impl_all` - = note: this error originates in the derive macro `FromZeroes` which comes from the expansion of the macro `assert_impl_all` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the trait bound `NotZerocopy: FromBytes` is not satisfied - --> tests/ui-nightly/derive_transparent.rs:38:18 - | -38 | assert_impl_all!(TransparentStruct: FromBytes); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `FromBytes` is not implemented for `NotZerocopy` - | - = help: the following other types implement trait `FromBytes`: - isize - i8 - i16 - i32 - i64 - i128 - usize - u8 - and $N others -note: required for `TransparentStruct` to implement `FromBytes` - --> tests/ui-nightly/derive_transparent.rs:27:31 - | -27 | #[derive(AsBytes, FromZeroes, FromBytes, Unaligned)] - | ^^^^^^^^^ unsatisfied trait bound introduced in this `derive` macro -note: required by a bound in `_::{closure#0}::assert_impl_all` - --> tests/ui-nightly/derive_transparent.rs:38:1 - | -38 | assert_impl_all!(TransparentStruct: FromBytes); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `assert_impl_all` - = note: this error originates in the derive macro `FromBytes` which comes from the expansion of the macro `assert_impl_all` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the trait bound `NotZerocopy: AsBytes` is not satisfied - --> tests/ui-nightly/derive_transparent.rs:39:18 - | -39 | assert_impl_all!(TransparentStruct: AsBytes); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `AsBytes` is not implemented for `NotZerocopy` - | - = help: the following other types implement trait `AsBytes`: - bool - char - isize - i8 - i16 - i32 - i64 - i128 - and $N others -note: required for `TransparentStruct` to implement `AsBytes` - --> tests/ui-nightly/derive_transparent.rs:27:10 - | -27 | #[derive(AsBytes, FromZeroes, FromBytes, Unaligned)] - | ^^^^^^^ unsatisfied trait bound introduced in this `derive` macro -note: required by a bound in `_::{closure#0}::assert_impl_all` - --> tests/ui-nightly/derive_transparent.rs:39:1 - | -39 | assert_impl_all!(TransparentStruct: AsBytes); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `assert_impl_all` - = note: this error originates in the derive macro `AsBytes` which comes from the expansion of the macro `assert_impl_all` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the trait bound `NotZerocopy: Unaligned` is not satisfied - --> tests/ui-nightly/derive_transparent.rs:40:18 - | -40 | assert_impl_all!(TransparentStruct: Unaligned); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Unaligned` is not implemented for `NotZerocopy` - | - = help: the following other types implement trait `Unaligned`: - bool - i8 - u8 - TransparentStruct - U16 - U32 - U64 - U128 - and $N others -note: required for `TransparentStruct` to implement `Unaligned` - --> tests/ui-nightly/derive_transparent.rs:27:42 - | -27 | #[derive(AsBytes, FromZeroes, FromBytes, Unaligned)] - | ^^^^^^^^^ unsatisfied trait bound introduced in this `derive` macro -note: required by a bound in `_::{closure#0}::assert_impl_all` - --> tests/ui-nightly/derive_transparent.rs:40:1 - | -40 | assert_impl_all!(TransparentStruct: Unaligned); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `assert_impl_all` - = note: this error originates in the derive macro `Unaligned` which comes from the expansion of the macro `assert_impl_all` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-nightly/enum_from_bytes_u16_too_few.rs.disabled temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-nightly/enum_from_bytes_u16_too_few.rs.disabled --- temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-nightly/enum_from_bytes_u16_too_few.rs.disabled 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-nightly/enum_from_bytes_u16_too_few.rs.disabled 1970-01-01 00:00:00.000000000 +0000 @@ -1,65558 +0,0 @@ -// Copyright 2019 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -#[macro_use] -extern crate zerocopy; - -fn main() {} - -// NOTE: This is currently disabled because it causes the compiler to... crash? -// I didn't spend too much time looking into it, but while outputting JSON that -// compiletest tried to consume, it gave up and compiletest spat out an EOF -// error. I'm not too worried about it since essentially the exact same logic is -// exercised by enum_repr_u8_too_few.rs. - -#[derive(FromBytes)] -#[repr(u16)] -enum Foo { - Variant0, - Variant1, - Variant2, - Variant3, - Variant4, - Variant5, - Variant6, - Variant7, - Variant8, - Variant9, - Variant10, - Variant11, - Variant12, - Variant13, - Variant14, - Variant15, - Variant16, - Variant17, - Variant18, - Variant19, - Variant20, - Variant21, - Variant22, - Variant23, - Variant24, - Variant25, - Variant26, - Variant27, - Variant28, - Variant29, - Variant30, - Variant31, - Variant32, - Variant33, - Variant34, - Variant35, - Variant36, - Variant37, - Variant38, - Variant39, - Variant40, - Variant41, - Variant42, - Variant43, - Variant44, - Variant45, - Variant46, - Variant47, - Variant48, - Variant49, - Variant50, - Variant51, - Variant52, - Variant53, - Variant54, - Variant55, - Variant56, - Variant57, - Variant58, - Variant59, - Variant60, - Variant61, - Variant62, - Variant63, - Variant64, - Variant65, - Variant66, - Variant67, - Variant68, - Variant69, - Variant70, - Variant71, - Variant72, - Variant73, - Variant74, - Variant75, - Variant76, - Variant77, - Variant78, - Variant79, - Variant80, - Variant81, - Variant82, - Variant83, - Variant84, - Variant85, - Variant86, - Variant87, - Variant88, - Variant89, - Variant90, - Variant91, - Variant92, - Variant93, - Variant94, - Variant95, - Variant96, - Variant97, - Variant98, - Variant99, - Variant100, - Variant101, - Variant102, - Variant103, - Variant104, - Variant105, - Variant106, - Variant107, - Variant108, - Variant109, - Variant110, - Variant111, - Variant112, - Variant113, - Variant114, - Variant115, - Variant116, - Variant117, - Variant118, - Variant119, - Variant120, - Variant121, - Variant122, - Variant123, - Variant124, - Variant125, - Variant126, - Variant127, - Variant128, - Variant129, - Variant130, - Variant131, - Variant132, - Variant133, - Variant134, - Variant135, - Variant136, - Variant137, - Variant138, - Variant139, - Variant140, - Variant141, - Variant142, - Variant143, - Variant144, - Variant145, - Variant146, - Variant147, - Variant148, - Variant149, - Variant150, - Variant151, - Variant152, - Variant153, - Variant154, - Variant155, - Variant156, - Variant157, - Variant158, - Variant159, - Variant160, - Variant161, - Variant162, - Variant163, - Variant164, - Variant165, - Variant166, - Variant167, - Variant168, - Variant169, - Variant170, - Variant171, - Variant172, - Variant173, - Variant174, - Variant175, - Variant176, - Variant177, - Variant178, - Variant179, - Variant180, - Variant181, - Variant182, - Variant183, - Variant184, - Variant185, - Variant186, - Variant187, - Variant188, - Variant189, - Variant190, - Variant191, - Variant192, - Variant193, - Variant194, - Variant195, - Variant196, - Variant197, - Variant198, - Variant199, - Variant200, - Variant201, - Variant202, - Variant203, - Variant204, - Variant205, - Variant206, - Variant207, - Variant208, - Variant209, - Variant210, - Variant211, - Variant212, - Variant213, - Variant214, - Variant215, - Variant216, - Variant217, - Variant218, - Variant219, - Variant220, - Variant221, - Variant222, - Variant223, - Variant224, - Variant225, - Variant226, - Variant227, - Variant228, - Variant229, - Variant230, - Variant231, - Variant232, - Variant233, - Variant234, - Variant235, - Variant236, - Variant237, - Variant238, - Variant239, - Variant240, - Variant241, - Variant242, - Variant243, - Variant244, - Variant245, - Variant246, - Variant247, - Variant248, - Variant249, - Variant250, - Variant251, - Variant252, - Variant253, - Variant254, - Variant255, - Variant256, - Variant257, - Variant258, - Variant259, - Variant260, - Variant261, - Variant262, - Variant263, - Variant264, - Variant265, - Variant266, - Variant267, - Variant268, - Variant269, - Variant270, - Variant271, - Variant272, - Variant273, - Variant274, - Variant275, - Variant276, - Variant277, - Variant278, - Variant279, - Variant280, - Variant281, - Variant282, - Variant283, - Variant284, - Variant285, - Variant286, - Variant287, - Variant288, - Variant289, - Variant290, - Variant291, - Variant292, - Variant293, - Variant294, - Variant295, - Variant296, - Variant297, - Variant298, - Variant299, - Variant300, - Variant301, - Variant302, - Variant303, - Variant304, - Variant305, - Variant306, - Variant307, - Variant308, - Variant309, - Variant310, - Variant311, - Variant312, - Variant313, - Variant314, - Variant315, - Variant316, - Variant317, - Variant318, - Variant319, - Variant320, - Variant321, - Variant322, - Variant323, - Variant324, - Variant325, - Variant326, - Variant327, - Variant328, - Variant329, - Variant330, - Variant331, - Variant332, - Variant333, - Variant334, - Variant335, - Variant336, - Variant337, - Variant338, - Variant339, - Variant340, - Variant341, - Variant342, - Variant343, - Variant344, - Variant345, - Variant346, - Variant347, - Variant348, - Variant349, - Variant350, - Variant351, - Variant352, - Variant353, - Variant354, - Variant355, - Variant356, - Variant357, - Variant358, - Variant359, - Variant360, - Variant361, - Variant362, - Variant363, - Variant364, - Variant365, - Variant366, - Variant367, - Variant368, - Variant369, - Variant370, - Variant371, - Variant372, - Variant373, - Variant374, - Variant375, - Variant376, - Variant377, - Variant378, - Variant379, - Variant380, - Variant381, - Variant382, - Variant383, - Variant384, - Variant385, - Variant386, - Variant387, - Variant388, - Variant389, - Variant390, - Variant391, - Variant392, - Variant393, - Variant394, - Variant395, - Variant396, - Variant397, - Variant398, - Variant399, - Variant400, - Variant401, - Variant402, - Variant403, - Variant404, - Variant405, - Variant406, - Variant407, - Variant408, - Variant409, - Variant410, - Variant411, - Variant412, - Variant413, - Variant414, - Variant415, - Variant416, - Variant417, - Variant418, - Variant419, - Variant420, - Variant421, - Variant422, - Variant423, - Variant424, - Variant425, - Variant426, - Variant427, - Variant428, - Variant429, - Variant430, - Variant431, - Variant432, - Variant433, - Variant434, - Variant435, - Variant436, - Variant437, - Variant438, - Variant439, - Variant440, - Variant441, - Variant442, - Variant443, - Variant444, - Variant445, - Variant446, - Variant447, - Variant448, - Variant449, - Variant450, - Variant451, - Variant452, - Variant453, - Variant454, - Variant455, - Variant456, - Variant457, - Variant458, - Variant459, - Variant460, - Variant461, - Variant462, - Variant463, - Variant464, - Variant465, - Variant466, - Variant467, - Variant468, - Variant469, - Variant470, - Variant471, - Variant472, - Variant473, - Variant474, - Variant475, - Variant476, - Variant477, - Variant478, - Variant479, - Variant480, - Variant481, - Variant482, - Variant483, - Variant484, - Variant485, - Variant486, - Variant487, - Variant488, - Variant489, - Variant490, - Variant491, - Variant492, - Variant493, - Variant494, - Variant495, - Variant496, - Variant497, - Variant498, - Variant499, - Variant500, - Variant501, - Variant502, - Variant503, - Variant504, - Variant505, - Variant506, - Variant507, - Variant508, - Variant509, - Variant510, - Variant511, - Variant512, - Variant513, - Variant514, - Variant515, - Variant516, - Variant517, - Variant518, - Variant519, - Variant520, - Variant521, - Variant522, - Variant523, - Variant524, - Variant525, - Variant526, - Variant527, - Variant528, - Variant529, - Variant530, - Variant531, - Variant532, - Variant533, - Variant534, - Variant535, - Variant536, - Variant537, - Variant538, - Variant539, - Variant540, - Variant541, - Variant542, - Variant543, - Variant544, - Variant545, - Variant546, - Variant547, - Variant548, - Variant549, - Variant550, - Variant551, - Variant552, - Variant553, - Variant554, - Variant555, - Variant556, - Variant557, - Variant558, - Variant559, - Variant560, - Variant561, - Variant562, - Variant563, - Variant564, - Variant565, - Variant566, - Variant567, - Variant568, - Variant569, - Variant570, - Variant571, - Variant572, - Variant573, - Variant574, - Variant575, - Variant576, - Variant577, - Variant578, - Variant579, - Variant580, - Variant581, - Variant582, - Variant583, - Variant584, - Variant585, - Variant586, - Variant587, - Variant588, - Variant589, - Variant590, - Variant591, - Variant592, - Variant593, - Variant594, - Variant595, - Variant596, - Variant597, - Variant598, - Variant599, - Variant600, - Variant601, - Variant602, - Variant603, - Variant604, - Variant605, - Variant606, - Variant607, - Variant608, - Variant609, - Variant610, - Variant611, - Variant612, - Variant613, - Variant614, - Variant615, - Variant616, - Variant617, - Variant618, - Variant619, - Variant620, - Variant621, - Variant622, - Variant623, - Variant624, - Variant625, - Variant626, - Variant627, - Variant628, - Variant629, - Variant630, - Variant631, - Variant632, - Variant633, - Variant634, - Variant635, - Variant636, - Variant637, - Variant638, - Variant639, - Variant640, - Variant641, - Variant642, - Variant643, - Variant644, - Variant645, - Variant646, - Variant647, - Variant648, - Variant649, - Variant650, - Variant651, - Variant652, - Variant653, - Variant654, - Variant655, - Variant656, - Variant657, - Variant658, - Variant659, - Variant660, - Variant661, - Variant662, - Variant663, - Variant664, - Variant665, - Variant666, - Variant667, - Variant668, - Variant669, - Variant670, - Variant671, - Variant672, - Variant673, - Variant674, - Variant675, - Variant676, - Variant677, - Variant678, - Variant679, - Variant680, - Variant681, - Variant682, - Variant683, - Variant684, - Variant685, - Variant686, - Variant687, - Variant688, - Variant689, - Variant690, - Variant691, - Variant692, - Variant693, - Variant694, - Variant695, - Variant696, - Variant697, - Variant698, - Variant699, - Variant700, - Variant701, - Variant702, - Variant703, - Variant704, - Variant705, - Variant706, - Variant707, - Variant708, - Variant709, - Variant710, - Variant711, - Variant712, - Variant713, - Variant714, - Variant715, - Variant716, - Variant717, - Variant718, - Variant719, - Variant720, - Variant721, - Variant722, - Variant723, - Variant724, - Variant725, - Variant726, - Variant727, - Variant728, - Variant729, - Variant730, - Variant731, - Variant732, - Variant733, - Variant734, - Variant735, - Variant736, - Variant737, - Variant738, - Variant739, - Variant740, - Variant741, - Variant742, - Variant743, - Variant744, - Variant745, - Variant746, - Variant747, - Variant748, - Variant749, - Variant750, - Variant751, - Variant752, - Variant753, - Variant754, - Variant755, - Variant756, - Variant757, - Variant758, - Variant759, - Variant760, - Variant761, - Variant762, - Variant763, - Variant764, - Variant765, - Variant766, - Variant767, - Variant768, - Variant769, - Variant770, - Variant771, - Variant772, - Variant773, - Variant774, - Variant775, - Variant776, - Variant777, - Variant778, - Variant779, - Variant780, - Variant781, - Variant782, - Variant783, - Variant784, - Variant785, - Variant786, - Variant787, - Variant788, - Variant789, - Variant790, - Variant791, - Variant792, - Variant793, - Variant794, - Variant795, - Variant796, - Variant797, - Variant798, - Variant799, - Variant800, - Variant801, - Variant802, - Variant803, - Variant804, - Variant805, - Variant806, - Variant807, - Variant808, - Variant809, - Variant810, - Variant811, - Variant812, - Variant813, - Variant814, - Variant815, - Variant816, - Variant817, - Variant818, - Variant819, - Variant820, - Variant821, - Variant822, - Variant823, - Variant824, - Variant825, - Variant826, - Variant827, - Variant828, - Variant829, - Variant830, - Variant831, - Variant832, - Variant833, - Variant834, - Variant835, - Variant836, - Variant837, - Variant838, - Variant839, - Variant840, - Variant841, - Variant842, - Variant843, - Variant844, - Variant845, - Variant846, - Variant847, - Variant848, - Variant849, - Variant850, - Variant851, - Variant852, - Variant853, - Variant854, - Variant855, - Variant856, - Variant857, - Variant858, - Variant859, - Variant860, - Variant861, - Variant862, - Variant863, - Variant864, - Variant865, - Variant866, - Variant867, - Variant868, - Variant869, - Variant870, - Variant871, - Variant872, - Variant873, - Variant874, - Variant875, - Variant876, - Variant877, - Variant878, - Variant879, - Variant880, - Variant881, - Variant882, - Variant883, - Variant884, - Variant885, - Variant886, - Variant887, - Variant888, - Variant889, - Variant890, - Variant891, - Variant892, - Variant893, - Variant894, - Variant895, - Variant896, - Variant897, - Variant898, - Variant899, - Variant900, - Variant901, - Variant902, - Variant903, - Variant904, - Variant905, - Variant906, - Variant907, - Variant908, - Variant909, - Variant910, - Variant911, - Variant912, - Variant913, - Variant914, - Variant915, - Variant916, - Variant917, - Variant918, - Variant919, - Variant920, - Variant921, - Variant922, - Variant923, - Variant924, - Variant925, - Variant926, - Variant927, - Variant928, - Variant929, - Variant930, - Variant931, - Variant932, - Variant933, - Variant934, - Variant935, - Variant936, - Variant937, - Variant938, - Variant939, - Variant940, - Variant941, - Variant942, - Variant943, - Variant944, - Variant945, - Variant946, - Variant947, - Variant948, - Variant949, - Variant950, - Variant951, - Variant952, - Variant953, - Variant954, - Variant955, - Variant956, - Variant957, - Variant958, - Variant959, - Variant960, - Variant961, - Variant962, - Variant963, - Variant964, - Variant965, - Variant966, - Variant967, - Variant968, - Variant969, - Variant970, - Variant971, - Variant972, - Variant973, - Variant974, - Variant975, - Variant976, - Variant977, - Variant978, - Variant979, - Variant980, - Variant981, - Variant982, - Variant983, - Variant984, - Variant985, - Variant986, - Variant987, - Variant988, - Variant989, - Variant990, - Variant991, - Variant992, - Variant993, - Variant994, - Variant995, - Variant996, - Variant997, - Variant998, - Variant999, - Variant1000, - Variant1001, - Variant1002, - Variant1003, - Variant1004, - Variant1005, - Variant1006, - Variant1007, - Variant1008, - Variant1009, - Variant1010, - Variant1011, - Variant1012, - Variant1013, - Variant1014, - Variant1015, - Variant1016, - Variant1017, - Variant1018, - Variant1019, - Variant1020, - Variant1021, - Variant1022, - Variant1023, - Variant1024, - Variant1025, - Variant1026, - Variant1027, - Variant1028, - Variant1029, - Variant1030, - Variant1031, - Variant1032, - Variant1033, - Variant1034, - Variant1035, - Variant1036, - Variant1037, - Variant1038, - Variant1039, - Variant1040, - Variant1041, - Variant1042, - Variant1043, - Variant1044, - Variant1045, - Variant1046, - Variant1047, - Variant1048, - Variant1049, - Variant1050, - Variant1051, - Variant1052, - Variant1053, - Variant1054, - Variant1055, - Variant1056, - Variant1057, - Variant1058, - Variant1059, - Variant1060, - Variant1061, - Variant1062, - Variant1063, - Variant1064, - Variant1065, - Variant1066, - Variant1067, - Variant1068, - Variant1069, - Variant1070, - Variant1071, - Variant1072, - Variant1073, - Variant1074, - Variant1075, - Variant1076, - Variant1077, - Variant1078, - Variant1079, - Variant1080, - Variant1081, - Variant1082, - Variant1083, - Variant1084, - Variant1085, - Variant1086, - Variant1087, - Variant1088, - Variant1089, - Variant1090, - Variant1091, - Variant1092, - Variant1093, - Variant1094, - Variant1095, - Variant1096, - Variant1097, - Variant1098, - Variant1099, - Variant1100, - Variant1101, - Variant1102, - Variant1103, - Variant1104, - Variant1105, - Variant1106, - Variant1107, - Variant1108, - Variant1109, - Variant1110, - Variant1111, - Variant1112, - Variant1113, - Variant1114, - Variant1115, - Variant1116, - Variant1117, - Variant1118, - Variant1119, - Variant1120, - Variant1121, - Variant1122, - Variant1123, - Variant1124, - Variant1125, - Variant1126, - Variant1127, - Variant1128, - Variant1129, - Variant1130, - Variant1131, - Variant1132, - Variant1133, - Variant1134, - Variant1135, - Variant1136, - Variant1137, - Variant1138, - Variant1139, - Variant1140, - Variant1141, - Variant1142, - Variant1143, - Variant1144, - Variant1145, - Variant1146, - Variant1147, - Variant1148, - Variant1149, - Variant1150, - Variant1151, - Variant1152, - Variant1153, - Variant1154, - Variant1155, - Variant1156, - Variant1157, - Variant1158, - Variant1159, - Variant1160, - Variant1161, - Variant1162, - Variant1163, - Variant1164, - Variant1165, - Variant1166, - Variant1167, - Variant1168, - Variant1169, - Variant1170, - Variant1171, - Variant1172, - Variant1173, - Variant1174, - Variant1175, - Variant1176, - Variant1177, - Variant1178, - Variant1179, - Variant1180, - Variant1181, - Variant1182, - Variant1183, - Variant1184, - Variant1185, - Variant1186, - Variant1187, - Variant1188, - Variant1189, - Variant1190, - Variant1191, - Variant1192, - Variant1193, - Variant1194, - Variant1195, - Variant1196, - Variant1197, - Variant1198, - Variant1199, - Variant1200, - Variant1201, - Variant1202, - Variant1203, - Variant1204, - Variant1205, - Variant1206, - Variant1207, - Variant1208, - Variant1209, - Variant1210, - Variant1211, - Variant1212, - Variant1213, - Variant1214, - Variant1215, - Variant1216, - Variant1217, - Variant1218, - Variant1219, - Variant1220, - Variant1221, - Variant1222, - Variant1223, - Variant1224, - Variant1225, - Variant1226, - Variant1227, - Variant1228, - Variant1229, - Variant1230, - Variant1231, - Variant1232, - Variant1233, - Variant1234, - Variant1235, - Variant1236, - Variant1237, - Variant1238, - Variant1239, - Variant1240, - Variant1241, - Variant1242, - Variant1243, - Variant1244, - Variant1245, - Variant1246, - Variant1247, - Variant1248, - Variant1249, - Variant1250, - Variant1251, - Variant1252, - Variant1253, - Variant1254, - Variant1255, - Variant1256, - Variant1257, - Variant1258, - Variant1259, - Variant1260, - Variant1261, - Variant1262, - Variant1263, - Variant1264, - Variant1265, - Variant1266, - Variant1267, - Variant1268, - Variant1269, - Variant1270, - Variant1271, - Variant1272, - Variant1273, - Variant1274, - Variant1275, - Variant1276, - Variant1277, - Variant1278, - Variant1279, - Variant1280, - Variant1281, - Variant1282, - Variant1283, - Variant1284, - Variant1285, - Variant1286, - Variant1287, - Variant1288, - Variant1289, - Variant1290, - Variant1291, - Variant1292, - Variant1293, - Variant1294, - Variant1295, - Variant1296, - Variant1297, - Variant1298, - Variant1299, - Variant1300, - Variant1301, - Variant1302, - Variant1303, - Variant1304, - Variant1305, - Variant1306, - Variant1307, - Variant1308, - Variant1309, - Variant1310, - Variant1311, - Variant1312, - Variant1313, - Variant1314, - Variant1315, - Variant1316, - Variant1317, - Variant1318, - Variant1319, - Variant1320, - Variant1321, - Variant1322, - Variant1323, - Variant1324, - Variant1325, - Variant1326, - Variant1327, - Variant1328, - Variant1329, - Variant1330, - Variant1331, - Variant1332, - Variant1333, - Variant1334, - Variant1335, - Variant1336, - Variant1337, - Variant1338, - Variant1339, - Variant1340, - Variant1341, - Variant1342, - Variant1343, - Variant1344, - Variant1345, - Variant1346, - Variant1347, - Variant1348, - Variant1349, - Variant1350, - Variant1351, - Variant1352, - Variant1353, - Variant1354, - Variant1355, - Variant1356, - Variant1357, - Variant1358, - Variant1359, - Variant1360, - Variant1361, - Variant1362, - Variant1363, - Variant1364, - Variant1365, - Variant1366, - Variant1367, - Variant1368, - Variant1369, - Variant1370, - Variant1371, - Variant1372, - Variant1373, - Variant1374, - Variant1375, - Variant1376, - Variant1377, - Variant1378, - Variant1379, - Variant1380, - Variant1381, - Variant1382, - Variant1383, - Variant1384, - Variant1385, - Variant1386, - Variant1387, - Variant1388, - Variant1389, - Variant1390, - Variant1391, - Variant1392, - Variant1393, - Variant1394, - Variant1395, - Variant1396, - Variant1397, - Variant1398, - Variant1399, - Variant1400, - Variant1401, - Variant1402, - Variant1403, - Variant1404, - Variant1405, - Variant1406, - Variant1407, - Variant1408, - Variant1409, - Variant1410, - Variant1411, - Variant1412, - Variant1413, - Variant1414, - Variant1415, - Variant1416, - Variant1417, - Variant1418, - Variant1419, - Variant1420, - Variant1421, - Variant1422, - Variant1423, - Variant1424, - Variant1425, - Variant1426, - Variant1427, - Variant1428, - Variant1429, - Variant1430, - Variant1431, - Variant1432, - Variant1433, - Variant1434, - Variant1435, - Variant1436, - Variant1437, - Variant1438, - Variant1439, - Variant1440, - Variant1441, - Variant1442, - Variant1443, - Variant1444, - Variant1445, - Variant1446, - Variant1447, - Variant1448, - Variant1449, - Variant1450, - Variant1451, - Variant1452, - Variant1453, - Variant1454, - Variant1455, - Variant1456, - Variant1457, - Variant1458, - Variant1459, - Variant1460, - Variant1461, - Variant1462, - Variant1463, - Variant1464, - Variant1465, - Variant1466, - Variant1467, - Variant1468, - Variant1469, - Variant1470, - Variant1471, - Variant1472, - Variant1473, - Variant1474, - Variant1475, - Variant1476, - Variant1477, - Variant1478, - Variant1479, - Variant1480, - Variant1481, - Variant1482, - Variant1483, - Variant1484, - Variant1485, - Variant1486, - Variant1487, - Variant1488, - Variant1489, - Variant1490, - Variant1491, - Variant1492, - Variant1493, - Variant1494, - Variant1495, - Variant1496, - Variant1497, - Variant1498, - Variant1499, - Variant1500, - Variant1501, - Variant1502, - Variant1503, - Variant1504, - Variant1505, - Variant1506, - Variant1507, - Variant1508, - Variant1509, - Variant1510, - Variant1511, - Variant1512, - Variant1513, - Variant1514, - Variant1515, - Variant1516, - Variant1517, - Variant1518, - Variant1519, - Variant1520, - Variant1521, - Variant1522, - Variant1523, - Variant1524, - Variant1525, - Variant1526, - Variant1527, - Variant1528, - Variant1529, - Variant1530, - Variant1531, - Variant1532, - Variant1533, - Variant1534, - Variant1535, - Variant1536, - Variant1537, - Variant1538, - Variant1539, - Variant1540, - Variant1541, - Variant1542, - Variant1543, - Variant1544, - Variant1545, - Variant1546, - Variant1547, - Variant1548, - Variant1549, - Variant1550, - Variant1551, - Variant1552, - Variant1553, - Variant1554, - Variant1555, - Variant1556, - Variant1557, - Variant1558, - Variant1559, - Variant1560, - Variant1561, - Variant1562, - Variant1563, - Variant1564, - Variant1565, - Variant1566, - Variant1567, - Variant1568, - Variant1569, - Variant1570, - Variant1571, - Variant1572, - Variant1573, - Variant1574, - Variant1575, - Variant1576, - Variant1577, - Variant1578, - Variant1579, - Variant1580, - Variant1581, - Variant1582, - Variant1583, - Variant1584, - Variant1585, - Variant1586, - Variant1587, - Variant1588, - Variant1589, - Variant1590, - Variant1591, - Variant1592, - Variant1593, - Variant1594, - Variant1595, - Variant1596, - Variant1597, - Variant1598, - Variant1599, - Variant1600, - Variant1601, - Variant1602, - Variant1603, - Variant1604, - Variant1605, - Variant1606, - Variant1607, - Variant1608, - Variant1609, - Variant1610, - Variant1611, - Variant1612, - Variant1613, - Variant1614, - Variant1615, - Variant1616, - Variant1617, - Variant1618, - Variant1619, - Variant1620, - Variant1621, - Variant1622, - Variant1623, - Variant1624, - Variant1625, - Variant1626, - Variant1627, - Variant1628, - Variant1629, - Variant1630, - Variant1631, - Variant1632, - Variant1633, - Variant1634, - Variant1635, - Variant1636, - Variant1637, - Variant1638, - Variant1639, - Variant1640, - Variant1641, - Variant1642, - Variant1643, - Variant1644, - Variant1645, - Variant1646, - Variant1647, - Variant1648, - Variant1649, - Variant1650, - Variant1651, - Variant1652, - Variant1653, - Variant1654, - Variant1655, - Variant1656, - Variant1657, - Variant1658, - Variant1659, - Variant1660, - Variant1661, - Variant1662, - Variant1663, - Variant1664, - Variant1665, - Variant1666, - Variant1667, - Variant1668, - Variant1669, - Variant1670, - Variant1671, - Variant1672, - Variant1673, - Variant1674, - Variant1675, - Variant1676, - Variant1677, - Variant1678, - Variant1679, - Variant1680, - Variant1681, - Variant1682, - Variant1683, - Variant1684, - Variant1685, - Variant1686, - Variant1687, - Variant1688, - Variant1689, - Variant1690, - Variant1691, - Variant1692, - Variant1693, - Variant1694, - Variant1695, - Variant1696, - Variant1697, - Variant1698, - Variant1699, - Variant1700, - Variant1701, - Variant1702, - Variant1703, - Variant1704, - Variant1705, - Variant1706, - Variant1707, - Variant1708, - Variant1709, - Variant1710, - Variant1711, - Variant1712, - Variant1713, - Variant1714, - Variant1715, - Variant1716, - Variant1717, - Variant1718, - Variant1719, - Variant1720, - Variant1721, - Variant1722, - Variant1723, - Variant1724, - Variant1725, - Variant1726, - Variant1727, - Variant1728, - Variant1729, - Variant1730, - Variant1731, - Variant1732, - Variant1733, - Variant1734, - Variant1735, - Variant1736, - Variant1737, - Variant1738, - Variant1739, - Variant1740, - Variant1741, - Variant1742, - Variant1743, - Variant1744, - Variant1745, - Variant1746, - Variant1747, - Variant1748, - Variant1749, - Variant1750, - Variant1751, - Variant1752, - Variant1753, - Variant1754, - Variant1755, - Variant1756, - Variant1757, - Variant1758, - Variant1759, - Variant1760, - Variant1761, - Variant1762, - Variant1763, - Variant1764, - Variant1765, - Variant1766, - Variant1767, - Variant1768, - Variant1769, - Variant1770, - Variant1771, - Variant1772, - Variant1773, - Variant1774, - Variant1775, - Variant1776, - Variant1777, - Variant1778, - Variant1779, - Variant1780, - Variant1781, - Variant1782, - Variant1783, - Variant1784, - Variant1785, - Variant1786, - Variant1787, - Variant1788, - Variant1789, - Variant1790, - Variant1791, - Variant1792, - Variant1793, - Variant1794, - Variant1795, - Variant1796, - Variant1797, - Variant1798, - Variant1799, - Variant1800, - Variant1801, - Variant1802, - Variant1803, - Variant1804, - Variant1805, - Variant1806, - Variant1807, - Variant1808, - Variant1809, - Variant1810, - Variant1811, - Variant1812, - Variant1813, - Variant1814, - Variant1815, - Variant1816, - Variant1817, - Variant1818, - Variant1819, - Variant1820, - Variant1821, - Variant1822, - Variant1823, - Variant1824, - Variant1825, - Variant1826, - Variant1827, - Variant1828, - Variant1829, - Variant1830, - Variant1831, - Variant1832, - Variant1833, - Variant1834, - Variant1835, - Variant1836, - Variant1837, - Variant1838, - Variant1839, - Variant1840, - Variant1841, - Variant1842, - Variant1843, - Variant1844, - Variant1845, - Variant1846, - Variant1847, - Variant1848, - Variant1849, - Variant1850, - Variant1851, - Variant1852, - Variant1853, - Variant1854, - Variant1855, - Variant1856, - Variant1857, - Variant1858, - Variant1859, - Variant1860, - Variant1861, - Variant1862, - Variant1863, - Variant1864, - Variant1865, - Variant1866, - Variant1867, - Variant1868, - Variant1869, - Variant1870, - Variant1871, - Variant1872, - Variant1873, - Variant1874, - Variant1875, - Variant1876, - Variant1877, - Variant1878, - Variant1879, - Variant1880, - Variant1881, - Variant1882, - Variant1883, - Variant1884, - Variant1885, - Variant1886, - Variant1887, - Variant1888, - Variant1889, - Variant1890, - Variant1891, - Variant1892, - Variant1893, - Variant1894, - Variant1895, - Variant1896, - Variant1897, - Variant1898, - Variant1899, - Variant1900, - Variant1901, - Variant1902, - Variant1903, - Variant1904, - Variant1905, - Variant1906, - Variant1907, - Variant1908, - Variant1909, - Variant1910, - Variant1911, - Variant1912, - Variant1913, - Variant1914, - Variant1915, - Variant1916, - Variant1917, - Variant1918, - Variant1919, - Variant1920, - Variant1921, - Variant1922, - Variant1923, - Variant1924, - Variant1925, - Variant1926, - Variant1927, - Variant1928, - Variant1929, - Variant1930, - Variant1931, - Variant1932, - Variant1933, - Variant1934, - Variant1935, - Variant1936, - Variant1937, - Variant1938, - Variant1939, - Variant1940, - Variant1941, - Variant1942, - Variant1943, - Variant1944, - Variant1945, - Variant1946, - Variant1947, - Variant1948, - Variant1949, - Variant1950, - Variant1951, - Variant1952, - Variant1953, - Variant1954, - Variant1955, - Variant1956, - Variant1957, - Variant1958, - Variant1959, - Variant1960, - Variant1961, - Variant1962, - Variant1963, - Variant1964, - Variant1965, - Variant1966, - Variant1967, - Variant1968, - Variant1969, - Variant1970, - Variant1971, - Variant1972, - Variant1973, - Variant1974, - Variant1975, - Variant1976, - Variant1977, - Variant1978, - Variant1979, - Variant1980, - Variant1981, - Variant1982, - Variant1983, - Variant1984, - Variant1985, - Variant1986, - Variant1987, - Variant1988, - Variant1989, - Variant1990, - Variant1991, - Variant1992, - Variant1993, - Variant1994, - Variant1995, - Variant1996, - Variant1997, - Variant1998, - Variant1999, - Variant2000, - Variant2001, - Variant2002, - Variant2003, - Variant2004, - Variant2005, - Variant2006, - Variant2007, - Variant2008, - Variant2009, - Variant2010, - Variant2011, - Variant2012, - Variant2013, - Variant2014, - Variant2015, - Variant2016, - Variant2017, - Variant2018, - Variant2019, - Variant2020, - Variant2021, - Variant2022, - Variant2023, - Variant2024, - Variant2025, - Variant2026, - Variant2027, - Variant2028, - Variant2029, - Variant2030, - Variant2031, - Variant2032, - Variant2033, - Variant2034, - Variant2035, - Variant2036, - Variant2037, - Variant2038, - Variant2039, - Variant2040, - Variant2041, - Variant2042, - Variant2043, - Variant2044, - Variant2045, - Variant2046, - Variant2047, - Variant2048, - Variant2049, - Variant2050, - Variant2051, - Variant2052, - Variant2053, - Variant2054, - Variant2055, - Variant2056, - Variant2057, - Variant2058, - Variant2059, - Variant2060, - Variant2061, - Variant2062, - Variant2063, - Variant2064, - Variant2065, - Variant2066, - Variant2067, - Variant2068, - Variant2069, - Variant2070, - Variant2071, - Variant2072, - Variant2073, - Variant2074, - Variant2075, - Variant2076, - Variant2077, - Variant2078, - Variant2079, - Variant2080, - Variant2081, - Variant2082, - Variant2083, - Variant2084, - Variant2085, - Variant2086, - Variant2087, - Variant2088, - Variant2089, - Variant2090, - Variant2091, - Variant2092, - Variant2093, - Variant2094, - Variant2095, - Variant2096, - Variant2097, - Variant2098, - Variant2099, - Variant2100, - Variant2101, - Variant2102, - Variant2103, - Variant2104, - Variant2105, - Variant2106, - Variant2107, - Variant2108, - Variant2109, - Variant2110, - Variant2111, - Variant2112, - Variant2113, - Variant2114, - Variant2115, - Variant2116, - Variant2117, - Variant2118, - Variant2119, - Variant2120, - Variant2121, - Variant2122, - Variant2123, - Variant2124, - Variant2125, - Variant2126, - Variant2127, - Variant2128, - Variant2129, - Variant2130, - Variant2131, - Variant2132, - Variant2133, - Variant2134, - Variant2135, - Variant2136, - Variant2137, - Variant2138, - Variant2139, - Variant2140, - Variant2141, - Variant2142, - Variant2143, - Variant2144, - Variant2145, - Variant2146, - Variant2147, - Variant2148, - Variant2149, - Variant2150, - Variant2151, - Variant2152, - Variant2153, - Variant2154, - Variant2155, - Variant2156, - Variant2157, - Variant2158, - Variant2159, - Variant2160, - Variant2161, - Variant2162, - Variant2163, - Variant2164, - Variant2165, - Variant2166, - Variant2167, - Variant2168, - Variant2169, - Variant2170, - Variant2171, - Variant2172, - Variant2173, - Variant2174, - Variant2175, - Variant2176, - Variant2177, - Variant2178, - Variant2179, - Variant2180, - Variant2181, - Variant2182, - Variant2183, - Variant2184, - Variant2185, - Variant2186, - Variant2187, - Variant2188, - Variant2189, - Variant2190, - Variant2191, - Variant2192, - Variant2193, - Variant2194, - Variant2195, - Variant2196, - Variant2197, - Variant2198, - Variant2199, - Variant2200, - Variant2201, - Variant2202, - Variant2203, - Variant2204, - Variant2205, - Variant2206, - Variant2207, - Variant2208, - Variant2209, - Variant2210, - Variant2211, - Variant2212, - Variant2213, - Variant2214, - Variant2215, - Variant2216, - Variant2217, - Variant2218, - Variant2219, - Variant2220, - Variant2221, - Variant2222, - Variant2223, - Variant2224, - Variant2225, - Variant2226, - Variant2227, - Variant2228, - Variant2229, - Variant2230, - Variant2231, - Variant2232, - Variant2233, - Variant2234, - Variant2235, - Variant2236, - Variant2237, - Variant2238, - Variant2239, - Variant2240, - Variant2241, - Variant2242, - Variant2243, - Variant2244, - Variant2245, - Variant2246, - Variant2247, - Variant2248, - Variant2249, - Variant2250, - Variant2251, - Variant2252, - Variant2253, - Variant2254, - Variant2255, - Variant2256, - Variant2257, - Variant2258, - Variant2259, - Variant2260, - Variant2261, - Variant2262, - Variant2263, - Variant2264, - Variant2265, - Variant2266, - Variant2267, - Variant2268, - Variant2269, - Variant2270, - Variant2271, - Variant2272, - Variant2273, - Variant2274, - Variant2275, - Variant2276, - Variant2277, - Variant2278, - Variant2279, - Variant2280, - Variant2281, - Variant2282, - Variant2283, - Variant2284, - Variant2285, - Variant2286, - Variant2287, - Variant2288, - Variant2289, - Variant2290, - Variant2291, - Variant2292, - Variant2293, - Variant2294, - Variant2295, - Variant2296, - Variant2297, - Variant2298, - Variant2299, - Variant2300, - Variant2301, - Variant2302, - Variant2303, - Variant2304, - Variant2305, - Variant2306, - Variant2307, - Variant2308, - Variant2309, - Variant2310, - Variant2311, - Variant2312, - Variant2313, - Variant2314, - Variant2315, - Variant2316, - Variant2317, - Variant2318, - Variant2319, - Variant2320, - Variant2321, - Variant2322, - Variant2323, - Variant2324, - Variant2325, - Variant2326, - Variant2327, - Variant2328, - Variant2329, - Variant2330, - Variant2331, - Variant2332, - Variant2333, - Variant2334, - Variant2335, - Variant2336, - Variant2337, - Variant2338, - Variant2339, - Variant2340, - Variant2341, - Variant2342, - Variant2343, - Variant2344, - Variant2345, - Variant2346, - Variant2347, - Variant2348, - Variant2349, - Variant2350, - Variant2351, - Variant2352, - Variant2353, - Variant2354, - Variant2355, - Variant2356, - Variant2357, - Variant2358, - Variant2359, - Variant2360, - Variant2361, - Variant2362, - Variant2363, - Variant2364, - Variant2365, - Variant2366, - Variant2367, - Variant2368, - Variant2369, - Variant2370, - Variant2371, - Variant2372, - Variant2373, - Variant2374, - Variant2375, - Variant2376, - Variant2377, - Variant2378, - Variant2379, - Variant2380, - Variant2381, - Variant2382, - Variant2383, - Variant2384, - Variant2385, - Variant2386, - Variant2387, - Variant2388, - Variant2389, - Variant2390, - Variant2391, - Variant2392, - Variant2393, - Variant2394, - Variant2395, - Variant2396, - Variant2397, - Variant2398, - Variant2399, - Variant2400, - Variant2401, - Variant2402, - Variant2403, - Variant2404, - Variant2405, - Variant2406, - Variant2407, - Variant2408, - Variant2409, - Variant2410, - Variant2411, - Variant2412, - Variant2413, - Variant2414, - Variant2415, - Variant2416, - Variant2417, - Variant2418, - Variant2419, - Variant2420, - Variant2421, - Variant2422, - Variant2423, - Variant2424, - Variant2425, - Variant2426, - Variant2427, - Variant2428, - Variant2429, - Variant2430, - Variant2431, - Variant2432, - Variant2433, - Variant2434, - Variant2435, - Variant2436, - Variant2437, - Variant2438, - Variant2439, - Variant2440, - Variant2441, - Variant2442, - Variant2443, - Variant2444, - Variant2445, - Variant2446, - Variant2447, - Variant2448, - Variant2449, - Variant2450, - Variant2451, - Variant2452, - Variant2453, - Variant2454, - Variant2455, - Variant2456, - Variant2457, - Variant2458, - Variant2459, - Variant2460, - Variant2461, - Variant2462, - Variant2463, - Variant2464, - Variant2465, - Variant2466, - Variant2467, - Variant2468, - Variant2469, - Variant2470, - Variant2471, - Variant2472, - Variant2473, - Variant2474, - Variant2475, - Variant2476, - Variant2477, - Variant2478, - Variant2479, - Variant2480, - Variant2481, - Variant2482, - Variant2483, - Variant2484, - Variant2485, - Variant2486, - Variant2487, - Variant2488, - Variant2489, - Variant2490, - Variant2491, - Variant2492, - Variant2493, - Variant2494, - Variant2495, - Variant2496, - Variant2497, - Variant2498, - Variant2499, - Variant2500, - Variant2501, - Variant2502, - Variant2503, - Variant2504, - Variant2505, - Variant2506, - Variant2507, - Variant2508, - Variant2509, - Variant2510, - Variant2511, - Variant2512, - Variant2513, - Variant2514, - Variant2515, - Variant2516, - Variant2517, - Variant2518, - Variant2519, - Variant2520, - Variant2521, - Variant2522, - Variant2523, - Variant2524, - Variant2525, - Variant2526, - Variant2527, - Variant2528, - Variant2529, - Variant2530, - Variant2531, - Variant2532, - Variant2533, - Variant2534, - Variant2535, - Variant2536, - Variant2537, - Variant2538, - Variant2539, - Variant2540, - Variant2541, - Variant2542, - Variant2543, - Variant2544, - Variant2545, - Variant2546, - Variant2547, - Variant2548, - Variant2549, - Variant2550, - Variant2551, - Variant2552, - Variant2553, - Variant2554, - Variant2555, - Variant2556, - Variant2557, - Variant2558, - Variant2559, - Variant2560, - Variant2561, - Variant2562, - Variant2563, - Variant2564, - Variant2565, - Variant2566, - Variant2567, - Variant2568, - Variant2569, - Variant2570, - Variant2571, - Variant2572, - Variant2573, - Variant2574, - Variant2575, - Variant2576, - Variant2577, - Variant2578, - Variant2579, - Variant2580, - Variant2581, - Variant2582, - Variant2583, - Variant2584, - Variant2585, - Variant2586, - Variant2587, - Variant2588, - Variant2589, - Variant2590, - Variant2591, - Variant2592, - Variant2593, - Variant2594, - Variant2595, - Variant2596, - Variant2597, - Variant2598, - Variant2599, - Variant2600, - Variant2601, - Variant2602, - Variant2603, - Variant2604, - Variant2605, - Variant2606, - Variant2607, - Variant2608, - Variant2609, - Variant2610, - Variant2611, - Variant2612, - Variant2613, - Variant2614, - Variant2615, - Variant2616, - Variant2617, - Variant2618, - Variant2619, - Variant2620, - Variant2621, - Variant2622, - Variant2623, - Variant2624, - Variant2625, - Variant2626, - Variant2627, - Variant2628, - Variant2629, - Variant2630, - Variant2631, - Variant2632, - Variant2633, - Variant2634, - Variant2635, - Variant2636, - Variant2637, - Variant2638, - Variant2639, - Variant2640, - Variant2641, - Variant2642, - Variant2643, - Variant2644, - Variant2645, - Variant2646, - Variant2647, - Variant2648, - Variant2649, - Variant2650, - Variant2651, - Variant2652, - Variant2653, - Variant2654, - Variant2655, - Variant2656, - Variant2657, - Variant2658, - Variant2659, - Variant2660, - Variant2661, - Variant2662, - Variant2663, - Variant2664, - Variant2665, - Variant2666, - Variant2667, - Variant2668, - Variant2669, - Variant2670, - Variant2671, - Variant2672, - Variant2673, - Variant2674, - Variant2675, - Variant2676, - Variant2677, - Variant2678, - Variant2679, - Variant2680, - Variant2681, - Variant2682, - Variant2683, - Variant2684, - Variant2685, - Variant2686, - Variant2687, - Variant2688, - Variant2689, - Variant2690, - Variant2691, - Variant2692, - Variant2693, - Variant2694, - Variant2695, - Variant2696, - Variant2697, - Variant2698, - Variant2699, - Variant2700, - Variant2701, - Variant2702, - Variant2703, - Variant2704, - Variant2705, - Variant2706, - Variant2707, - Variant2708, - Variant2709, - Variant2710, - Variant2711, - Variant2712, - Variant2713, - Variant2714, - Variant2715, - Variant2716, - Variant2717, - Variant2718, - Variant2719, - Variant2720, - Variant2721, - Variant2722, - Variant2723, - Variant2724, - Variant2725, - Variant2726, - Variant2727, - Variant2728, - Variant2729, - Variant2730, - Variant2731, - Variant2732, - Variant2733, - Variant2734, - Variant2735, - Variant2736, - Variant2737, - Variant2738, - Variant2739, - Variant2740, - Variant2741, - Variant2742, - Variant2743, - Variant2744, - Variant2745, - Variant2746, - Variant2747, - Variant2748, - Variant2749, - Variant2750, - Variant2751, - Variant2752, - Variant2753, - Variant2754, - Variant2755, - Variant2756, - Variant2757, - Variant2758, - Variant2759, - Variant2760, - Variant2761, - Variant2762, - Variant2763, - Variant2764, - Variant2765, - Variant2766, - Variant2767, - Variant2768, - Variant2769, - Variant2770, - Variant2771, - Variant2772, - Variant2773, - Variant2774, - Variant2775, - Variant2776, - Variant2777, - Variant2778, - Variant2779, - Variant2780, - Variant2781, - Variant2782, - Variant2783, - Variant2784, - Variant2785, - Variant2786, - Variant2787, - Variant2788, - Variant2789, - Variant2790, - Variant2791, - Variant2792, - Variant2793, - Variant2794, - Variant2795, - Variant2796, - Variant2797, - Variant2798, - Variant2799, - Variant2800, - Variant2801, - Variant2802, - Variant2803, - Variant2804, - Variant2805, - Variant2806, - Variant2807, - Variant2808, - Variant2809, - Variant2810, - Variant2811, - Variant2812, - Variant2813, - Variant2814, - Variant2815, - Variant2816, - Variant2817, - Variant2818, - Variant2819, - Variant2820, - Variant2821, - Variant2822, - Variant2823, - Variant2824, - Variant2825, - Variant2826, - Variant2827, - Variant2828, - Variant2829, - Variant2830, - Variant2831, - Variant2832, - Variant2833, - Variant2834, - Variant2835, - Variant2836, - Variant2837, - Variant2838, - Variant2839, - Variant2840, - Variant2841, - Variant2842, - Variant2843, - Variant2844, - Variant2845, - Variant2846, - Variant2847, - Variant2848, - Variant2849, - Variant2850, - Variant2851, - Variant2852, - Variant2853, - Variant2854, - Variant2855, - Variant2856, - Variant2857, - Variant2858, - Variant2859, - Variant2860, - Variant2861, - Variant2862, - Variant2863, - Variant2864, - Variant2865, - Variant2866, - Variant2867, - Variant2868, - Variant2869, - Variant2870, - Variant2871, - Variant2872, - Variant2873, - Variant2874, - Variant2875, - Variant2876, - Variant2877, - Variant2878, - Variant2879, - Variant2880, - Variant2881, - Variant2882, - Variant2883, - Variant2884, - Variant2885, - Variant2886, - Variant2887, - Variant2888, - Variant2889, - Variant2890, - Variant2891, - Variant2892, - Variant2893, - Variant2894, - Variant2895, - Variant2896, - Variant2897, - Variant2898, - Variant2899, - Variant2900, - Variant2901, - Variant2902, - Variant2903, - Variant2904, - Variant2905, - Variant2906, - Variant2907, - Variant2908, - Variant2909, - Variant2910, - Variant2911, - Variant2912, - Variant2913, - Variant2914, - Variant2915, - Variant2916, - Variant2917, - Variant2918, - Variant2919, - Variant2920, - Variant2921, - Variant2922, - Variant2923, - Variant2924, - Variant2925, - Variant2926, - Variant2927, - Variant2928, - Variant2929, - Variant2930, - Variant2931, - Variant2932, - Variant2933, - Variant2934, - Variant2935, - Variant2936, - Variant2937, - Variant2938, - Variant2939, - Variant2940, - Variant2941, - Variant2942, - Variant2943, - Variant2944, - Variant2945, - Variant2946, - Variant2947, - Variant2948, - Variant2949, - Variant2950, - Variant2951, - Variant2952, - Variant2953, - Variant2954, - Variant2955, - Variant2956, - Variant2957, - Variant2958, - Variant2959, - Variant2960, - Variant2961, - Variant2962, - Variant2963, - Variant2964, - Variant2965, - Variant2966, - Variant2967, - Variant2968, - Variant2969, - Variant2970, - Variant2971, - Variant2972, - Variant2973, - Variant2974, - Variant2975, - Variant2976, - Variant2977, - Variant2978, - Variant2979, - Variant2980, - Variant2981, - Variant2982, - Variant2983, - Variant2984, - Variant2985, - Variant2986, - Variant2987, - Variant2988, - Variant2989, - Variant2990, - Variant2991, - Variant2992, - Variant2993, - Variant2994, - Variant2995, - Variant2996, - Variant2997, - Variant2998, - Variant2999, - Variant3000, - Variant3001, - Variant3002, - Variant3003, - Variant3004, - Variant3005, - Variant3006, - Variant3007, - Variant3008, - Variant3009, - Variant3010, - Variant3011, - Variant3012, - Variant3013, - Variant3014, - Variant3015, - Variant3016, - Variant3017, - Variant3018, - Variant3019, - Variant3020, - Variant3021, - Variant3022, - Variant3023, - Variant3024, - Variant3025, - Variant3026, - Variant3027, - Variant3028, - Variant3029, - Variant3030, - Variant3031, - Variant3032, - Variant3033, - Variant3034, - Variant3035, - Variant3036, - Variant3037, - Variant3038, - Variant3039, - Variant3040, - Variant3041, - Variant3042, - Variant3043, - Variant3044, - Variant3045, - Variant3046, - Variant3047, - Variant3048, - Variant3049, - Variant3050, - Variant3051, - Variant3052, - Variant3053, - Variant3054, - Variant3055, - Variant3056, - Variant3057, - Variant3058, - Variant3059, - Variant3060, - Variant3061, - Variant3062, - Variant3063, - Variant3064, - Variant3065, - Variant3066, - Variant3067, - Variant3068, - Variant3069, - Variant3070, - Variant3071, - Variant3072, - Variant3073, - Variant3074, - Variant3075, - Variant3076, - Variant3077, - Variant3078, - Variant3079, - Variant3080, - Variant3081, - Variant3082, - Variant3083, - Variant3084, - Variant3085, - Variant3086, - Variant3087, - Variant3088, - Variant3089, - Variant3090, - Variant3091, - Variant3092, - Variant3093, - Variant3094, - Variant3095, - Variant3096, - Variant3097, - Variant3098, - Variant3099, - Variant3100, - Variant3101, - Variant3102, - Variant3103, - Variant3104, - Variant3105, - Variant3106, - Variant3107, - Variant3108, - Variant3109, - Variant3110, - Variant3111, - Variant3112, - Variant3113, - Variant3114, - Variant3115, - Variant3116, - Variant3117, - Variant3118, - Variant3119, - Variant3120, - Variant3121, - Variant3122, - Variant3123, - Variant3124, - Variant3125, - Variant3126, - Variant3127, - Variant3128, - Variant3129, - Variant3130, - Variant3131, - Variant3132, - Variant3133, - Variant3134, - Variant3135, - Variant3136, - Variant3137, - Variant3138, - Variant3139, - Variant3140, - Variant3141, - Variant3142, - Variant3143, - Variant3144, - Variant3145, - Variant3146, - Variant3147, - Variant3148, - Variant3149, - Variant3150, - Variant3151, - Variant3152, - Variant3153, - Variant3154, - Variant3155, - Variant3156, - Variant3157, - Variant3158, - Variant3159, - Variant3160, - Variant3161, - Variant3162, - Variant3163, - Variant3164, - Variant3165, - Variant3166, - Variant3167, - Variant3168, - Variant3169, - Variant3170, - Variant3171, - Variant3172, - Variant3173, - Variant3174, - Variant3175, - Variant3176, - Variant3177, - Variant3178, - Variant3179, - Variant3180, - Variant3181, - Variant3182, - Variant3183, - Variant3184, - Variant3185, - Variant3186, - Variant3187, - Variant3188, - Variant3189, - Variant3190, - Variant3191, - Variant3192, - Variant3193, - Variant3194, - Variant3195, - Variant3196, - Variant3197, - Variant3198, - Variant3199, - Variant3200, - Variant3201, - Variant3202, - Variant3203, - Variant3204, - Variant3205, - Variant3206, - Variant3207, - Variant3208, - Variant3209, - Variant3210, - Variant3211, - Variant3212, - Variant3213, - Variant3214, - Variant3215, - Variant3216, - Variant3217, - Variant3218, - Variant3219, - Variant3220, - Variant3221, - Variant3222, - Variant3223, - Variant3224, - Variant3225, - Variant3226, - Variant3227, - Variant3228, - Variant3229, - Variant3230, - Variant3231, - Variant3232, - Variant3233, - Variant3234, - Variant3235, - Variant3236, - Variant3237, - Variant3238, - Variant3239, - Variant3240, - Variant3241, - Variant3242, - Variant3243, - Variant3244, - Variant3245, - Variant3246, - Variant3247, - Variant3248, - Variant3249, - Variant3250, - Variant3251, - Variant3252, - Variant3253, - Variant3254, - Variant3255, - Variant3256, - Variant3257, - Variant3258, - Variant3259, - Variant3260, - Variant3261, - Variant3262, - Variant3263, - Variant3264, - Variant3265, - Variant3266, - Variant3267, - Variant3268, - Variant3269, - Variant3270, - Variant3271, - Variant3272, - Variant3273, - Variant3274, - Variant3275, - Variant3276, - Variant3277, - Variant3278, - Variant3279, - Variant3280, - Variant3281, - Variant3282, - Variant3283, - Variant3284, - Variant3285, - Variant3286, - Variant3287, - Variant3288, - Variant3289, - Variant3290, - Variant3291, - Variant3292, - Variant3293, - Variant3294, - Variant3295, - Variant3296, - Variant3297, - Variant3298, - Variant3299, - Variant3300, - Variant3301, - Variant3302, - Variant3303, - Variant3304, - Variant3305, - Variant3306, - Variant3307, - Variant3308, - Variant3309, - Variant3310, - Variant3311, - Variant3312, - Variant3313, - Variant3314, - Variant3315, - Variant3316, - Variant3317, - Variant3318, - Variant3319, - Variant3320, - Variant3321, - Variant3322, - Variant3323, - Variant3324, - Variant3325, - Variant3326, - Variant3327, - Variant3328, - Variant3329, - Variant3330, - Variant3331, - Variant3332, - Variant3333, - Variant3334, - Variant3335, - Variant3336, - Variant3337, - Variant3338, - Variant3339, - Variant3340, - Variant3341, - Variant3342, - Variant3343, - Variant3344, - Variant3345, - Variant3346, - Variant3347, - Variant3348, - Variant3349, - Variant3350, - Variant3351, - Variant3352, - Variant3353, - Variant3354, - Variant3355, - Variant3356, - Variant3357, - Variant3358, - Variant3359, - Variant3360, - Variant3361, - Variant3362, - Variant3363, - Variant3364, - Variant3365, - Variant3366, - Variant3367, - Variant3368, - Variant3369, - Variant3370, - Variant3371, - Variant3372, - Variant3373, - Variant3374, - Variant3375, - Variant3376, - Variant3377, - Variant3378, - Variant3379, - Variant3380, - Variant3381, - Variant3382, - Variant3383, - Variant3384, - Variant3385, - Variant3386, - Variant3387, - Variant3388, - Variant3389, - Variant3390, - Variant3391, - Variant3392, - Variant3393, - Variant3394, - Variant3395, - Variant3396, - Variant3397, - Variant3398, - Variant3399, - Variant3400, - Variant3401, - Variant3402, - Variant3403, - Variant3404, - Variant3405, - Variant3406, - Variant3407, - Variant3408, - Variant3409, - Variant3410, - Variant3411, - Variant3412, - Variant3413, - Variant3414, - Variant3415, - Variant3416, - Variant3417, - Variant3418, - Variant3419, - Variant3420, - Variant3421, - Variant3422, - Variant3423, - Variant3424, - Variant3425, - Variant3426, - Variant3427, - Variant3428, - Variant3429, - Variant3430, - Variant3431, - Variant3432, - Variant3433, - Variant3434, - Variant3435, - Variant3436, - Variant3437, - Variant3438, - Variant3439, - Variant3440, - Variant3441, - Variant3442, - Variant3443, - Variant3444, - Variant3445, - Variant3446, - Variant3447, - Variant3448, - Variant3449, - Variant3450, - Variant3451, - Variant3452, - Variant3453, - Variant3454, - Variant3455, - Variant3456, - Variant3457, - Variant3458, - Variant3459, - Variant3460, - Variant3461, - Variant3462, - Variant3463, - Variant3464, - Variant3465, - Variant3466, - Variant3467, - Variant3468, - Variant3469, - Variant3470, - Variant3471, - Variant3472, - Variant3473, - Variant3474, - Variant3475, - Variant3476, - Variant3477, - Variant3478, - Variant3479, - Variant3480, - Variant3481, - Variant3482, - Variant3483, - Variant3484, - Variant3485, - Variant3486, - Variant3487, - Variant3488, - Variant3489, - Variant3490, - Variant3491, - Variant3492, - Variant3493, - Variant3494, - Variant3495, - Variant3496, - Variant3497, - Variant3498, - Variant3499, - Variant3500, - Variant3501, - Variant3502, - Variant3503, - Variant3504, - Variant3505, - Variant3506, - Variant3507, - Variant3508, - Variant3509, - Variant3510, - Variant3511, - Variant3512, - Variant3513, - Variant3514, - Variant3515, - Variant3516, - Variant3517, - Variant3518, - Variant3519, - Variant3520, - Variant3521, - Variant3522, - Variant3523, - Variant3524, - Variant3525, - Variant3526, - Variant3527, - Variant3528, - Variant3529, - Variant3530, - Variant3531, - Variant3532, - Variant3533, - Variant3534, - Variant3535, - Variant3536, - Variant3537, - Variant3538, - Variant3539, - Variant3540, - Variant3541, - Variant3542, - Variant3543, - Variant3544, - Variant3545, - Variant3546, - Variant3547, - Variant3548, - Variant3549, - Variant3550, - Variant3551, - Variant3552, - Variant3553, - Variant3554, - Variant3555, - Variant3556, - Variant3557, - Variant3558, - Variant3559, - Variant3560, - Variant3561, - Variant3562, - Variant3563, - Variant3564, - Variant3565, - Variant3566, - Variant3567, - Variant3568, - Variant3569, - Variant3570, - Variant3571, - Variant3572, - Variant3573, - Variant3574, - Variant3575, - Variant3576, - Variant3577, - Variant3578, - Variant3579, - Variant3580, - Variant3581, - Variant3582, - Variant3583, - Variant3584, - Variant3585, - Variant3586, - Variant3587, - Variant3588, - Variant3589, - Variant3590, - Variant3591, - Variant3592, - Variant3593, - Variant3594, - Variant3595, - Variant3596, - Variant3597, - Variant3598, - Variant3599, - Variant3600, - Variant3601, - Variant3602, - Variant3603, - Variant3604, - Variant3605, - Variant3606, - Variant3607, - Variant3608, - Variant3609, - Variant3610, - Variant3611, - Variant3612, - Variant3613, - Variant3614, - Variant3615, - Variant3616, - Variant3617, - Variant3618, - Variant3619, - Variant3620, - Variant3621, - Variant3622, - Variant3623, - Variant3624, - Variant3625, - Variant3626, - Variant3627, - Variant3628, - Variant3629, - Variant3630, - Variant3631, - Variant3632, - Variant3633, - Variant3634, - Variant3635, - Variant3636, - Variant3637, - Variant3638, - Variant3639, - Variant3640, - Variant3641, - Variant3642, - Variant3643, - Variant3644, - Variant3645, - Variant3646, - Variant3647, - Variant3648, - Variant3649, - Variant3650, - Variant3651, - Variant3652, - Variant3653, - Variant3654, - Variant3655, - Variant3656, - Variant3657, - Variant3658, - Variant3659, - Variant3660, - Variant3661, - Variant3662, - Variant3663, - Variant3664, - Variant3665, - Variant3666, - Variant3667, - Variant3668, - Variant3669, - Variant3670, - Variant3671, - Variant3672, - Variant3673, - Variant3674, - Variant3675, - Variant3676, - Variant3677, - Variant3678, - Variant3679, - Variant3680, - Variant3681, - Variant3682, - Variant3683, - Variant3684, - Variant3685, - Variant3686, - Variant3687, - Variant3688, - Variant3689, - Variant3690, - Variant3691, - Variant3692, - Variant3693, - Variant3694, - Variant3695, - Variant3696, - Variant3697, - Variant3698, - Variant3699, - Variant3700, - Variant3701, - Variant3702, - Variant3703, - Variant3704, - Variant3705, - Variant3706, - Variant3707, - Variant3708, - Variant3709, - Variant3710, - Variant3711, - Variant3712, - Variant3713, - Variant3714, - Variant3715, - Variant3716, - Variant3717, - Variant3718, - Variant3719, - Variant3720, - Variant3721, - Variant3722, - Variant3723, - Variant3724, - Variant3725, - Variant3726, - Variant3727, - Variant3728, - Variant3729, - Variant3730, - Variant3731, - Variant3732, - Variant3733, - Variant3734, - Variant3735, - Variant3736, - Variant3737, - Variant3738, - Variant3739, - Variant3740, - Variant3741, - Variant3742, - Variant3743, - Variant3744, - Variant3745, - Variant3746, - Variant3747, - Variant3748, - Variant3749, - Variant3750, - Variant3751, - Variant3752, - Variant3753, - Variant3754, - Variant3755, - Variant3756, - Variant3757, - Variant3758, - Variant3759, - Variant3760, - Variant3761, - Variant3762, - Variant3763, - Variant3764, - Variant3765, - Variant3766, - Variant3767, - Variant3768, - Variant3769, - Variant3770, - Variant3771, - Variant3772, - Variant3773, - Variant3774, - Variant3775, - Variant3776, - Variant3777, - Variant3778, - Variant3779, - Variant3780, - Variant3781, - Variant3782, - Variant3783, - Variant3784, - Variant3785, - Variant3786, - Variant3787, - Variant3788, - Variant3789, - Variant3790, - Variant3791, - Variant3792, - Variant3793, - Variant3794, - Variant3795, - Variant3796, - Variant3797, - Variant3798, - Variant3799, - Variant3800, - Variant3801, - Variant3802, - Variant3803, - Variant3804, - Variant3805, - Variant3806, - Variant3807, - Variant3808, - Variant3809, - Variant3810, - Variant3811, - Variant3812, - Variant3813, - Variant3814, - Variant3815, - Variant3816, - Variant3817, - Variant3818, - Variant3819, - Variant3820, - Variant3821, - Variant3822, - Variant3823, - Variant3824, - Variant3825, - Variant3826, - Variant3827, - Variant3828, - Variant3829, - Variant3830, - Variant3831, - Variant3832, - Variant3833, - Variant3834, - Variant3835, - Variant3836, - Variant3837, - Variant3838, - Variant3839, - Variant3840, - Variant3841, - Variant3842, - Variant3843, - Variant3844, - Variant3845, - Variant3846, - Variant3847, - Variant3848, - Variant3849, - Variant3850, - Variant3851, - Variant3852, - Variant3853, - Variant3854, - Variant3855, - Variant3856, - Variant3857, - Variant3858, - Variant3859, - Variant3860, - Variant3861, - Variant3862, - Variant3863, - Variant3864, - Variant3865, - Variant3866, - Variant3867, - Variant3868, - Variant3869, - Variant3870, - Variant3871, - Variant3872, - Variant3873, - Variant3874, - Variant3875, - Variant3876, - Variant3877, - Variant3878, - Variant3879, - Variant3880, - Variant3881, - Variant3882, - Variant3883, - Variant3884, - Variant3885, - Variant3886, - Variant3887, - Variant3888, - Variant3889, - Variant3890, - Variant3891, - Variant3892, - Variant3893, - Variant3894, - Variant3895, - Variant3896, - Variant3897, - Variant3898, - Variant3899, - Variant3900, - Variant3901, - Variant3902, - Variant3903, - Variant3904, - Variant3905, - Variant3906, - Variant3907, - Variant3908, - Variant3909, - Variant3910, - Variant3911, - Variant3912, - Variant3913, - Variant3914, - Variant3915, - Variant3916, - Variant3917, - Variant3918, - Variant3919, - Variant3920, - Variant3921, - Variant3922, - Variant3923, - Variant3924, - Variant3925, - Variant3926, - Variant3927, - Variant3928, - Variant3929, - Variant3930, - Variant3931, - Variant3932, - Variant3933, - Variant3934, - Variant3935, - Variant3936, - Variant3937, - Variant3938, - Variant3939, - Variant3940, - Variant3941, - Variant3942, - Variant3943, - Variant3944, - Variant3945, - Variant3946, - Variant3947, - Variant3948, - Variant3949, - Variant3950, - Variant3951, - Variant3952, - Variant3953, - Variant3954, - Variant3955, - Variant3956, - Variant3957, - Variant3958, - Variant3959, - Variant3960, - Variant3961, - Variant3962, - Variant3963, - Variant3964, - Variant3965, - Variant3966, - Variant3967, - Variant3968, - Variant3969, - Variant3970, - Variant3971, - Variant3972, - Variant3973, - Variant3974, - Variant3975, - Variant3976, - Variant3977, - Variant3978, - Variant3979, - Variant3980, - Variant3981, - Variant3982, - Variant3983, - Variant3984, - Variant3985, - Variant3986, - Variant3987, - Variant3988, - Variant3989, - Variant3990, - Variant3991, - Variant3992, - Variant3993, - Variant3994, - Variant3995, - Variant3996, - Variant3997, - Variant3998, - Variant3999, - Variant4000, - Variant4001, - Variant4002, - Variant4003, - Variant4004, - Variant4005, - Variant4006, - Variant4007, - Variant4008, - Variant4009, - Variant4010, - Variant4011, - Variant4012, - Variant4013, - Variant4014, - Variant4015, - Variant4016, - Variant4017, - Variant4018, - Variant4019, - Variant4020, - Variant4021, - Variant4022, - Variant4023, - Variant4024, - Variant4025, - Variant4026, - Variant4027, - Variant4028, - Variant4029, - Variant4030, - Variant4031, - Variant4032, - Variant4033, - Variant4034, - Variant4035, - Variant4036, - Variant4037, - Variant4038, - Variant4039, - Variant4040, - Variant4041, - Variant4042, - Variant4043, - Variant4044, - Variant4045, - Variant4046, - Variant4047, - Variant4048, - Variant4049, - Variant4050, - Variant4051, - Variant4052, - Variant4053, - Variant4054, - Variant4055, - Variant4056, - Variant4057, - Variant4058, - Variant4059, - Variant4060, - Variant4061, - Variant4062, - Variant4063, - Variant4064, - Variant4065, - Variant4066, - Variant4067, - Variant4068, - Variant4069, - Variant4070, - Variant4071, - Variant4072, - Variant4073, - Variant4074, - Variant4075, - Variant4076, - Variant4077, - Variant4078, - Variant4079, - Variant4080, - Variant4081, - Variant4082, - Variant4083, - Variant4084, - Variant4085, - Variant4086, - Variant4087, - Variant4088, - Variant4089, - Variant4090, - Variant4091, - Variant4092, - Variant4093, - Variant4094, - Variant4095, - Variant4096, - Variant4097, - Variant4098, - Variant4099, - Variant4100, - Variant4101, - Variant4102, - Variant4103, - Variant4104, - Variant4105, - Variant4106, - Variant4107, - Variant4108, - Variant4109, - Variant4110, - Variant4111, - Variant4112, - Variant4113, - Variant4114, - Variant4115, - Variant4116, - Variant4117, - Variant4118, - Variant4119, - Variant4120, - Variant4121, - Variant4122, - Variant4123, - Variant4124, - Variant4125, - Variant4126, - Variant4127, - Variant4128, - Variant4129, - Variant4130, - Variant4131, - Variant4132, - Variant4133, - Variant4134, - Variant4135, - Variant4136, - Variant4137, - Variant4138, - Variant4139, - Variant4140, - Variant4141, - Variant4142, - Variant4143, - Variant4144, - Variant4145, - Variant4146, - Variant4147, - Variant4148, - Variant4149, - Variant4150, - Variant4151, - Variant4152, - Variant4153, - Variant4154, - Variant4155, - Variant4156, - Variant4157, - Variant4158, - Variant4159, - Variant4160, - Variant4161, - Variant4162, - Variant4163, - Variant4164, - Variant4165, - Variant4166, - Variant4167, - Variant4168, - Variant4169, - Variant4170, - Variant4171, - Variant4172, - Variant4173, - Variant4174, - Variant4175, - Variant4176, - Variant4177, - Variant4178, - Variant4179, - Variant4180, - Variant4181, - Variant4182, - Variant4183, - Variant4184, - Variant4185, - Variant4186, - Variant4187, - Variant4188, - Variant4189, - Variant4190, - Variant4191, - Variant4192, - Variant4193, - Variant4194, - Variant4195, - Variant4196, - Variant4197, - Variant4198, - Variant4199, - Variant4200, - Variant4201, - Variant4202, - Variant4203, - Variant4204, - Variant4205, - Variant4206, - Variant4207, - Variant4208, - Variant4209, - Variant4210, - Variant4211, - Variant4212, - Variant4213, - Variant4214, - Variant4215, - Variant4216, - Variant4217, - Variant4218, - Variant4219, - Variant4220, - Variant4221, - Variant4222, - Variant4223, - Variant4224, - Variant4225, - Variant4226, - Variant4227, - Variant4228, - Variant4229, - Variant4230, - Variant4231, - Variant4232, - Variant4233, - Variant4234, - Variant4235, - Variant4236, - Variant4237, - Variant4238, - Variant4239, - Variant4240, - Variant4241, - Variant4242, - Variant4243, - Variant4244, - Variant4245, - Variant4246, - Variant4247, - Variant4248, - Variant4249, - Variant4250, - Variant4251, - Variant4252, - Variant4253, - Variant4254, - Variant4255, - Variant4256, - Variant4257, - Variant4258, - Variant4259, - Variant4260, - Variant4261, - Variant4262, - Variant4263, - Variant4264, - Variant4265, - Variant4266, - Variant4267, - Variant4268, - Variant4269, - Variant4270, - Variant4271, - Variant4272, - Variant4273, - Variant4274, - Variant4275, - Variant4276, - Variant4277, - Variant4278, - Variant4279, - Variant4280, - Variant4281, - Variant4282, - Variant4283, - Variant4284, - Variant4285, - Variant4286, - Variant4287, - Variant4288, - Variant4289, - Variant4290, - Variant4291, - Variant4292, - Variant4293, - Variant4294, - Variant4295, - Variant4296, - Variant4297, - Variant4298, - Variant4299, - Variant4300, - Variant4301, - Variant4302, - Variant4303, - Variant4304, - Variant4305, - Variant4306, - Variant4307, - Variant4308, - Variant4309, - Variant4310, - Variant4311, - Variant4312, - Variant4313, - Variant4314, - Variant4315, - Variant4316, - Variant4317, - Variant4318, - Variant4319, - Variant4320, - Variant4321, - Variant4322, - Variant4323, - Variant4324, - Variant4325, - Variant4326, - Variant4327, - Variant4328, - Variant4329, - Variant4330, - Variant4331, - Variant4332, - Variant4333, - Variant4334, - Variant4335, - Variant4336, - Variant4337, - Variant4338, - Variant4339, - Variant4340, - Variant4341, - Variant4342, - Variant4343, - Variant4344, - Variant4345, - Variant4346, - Variant4347, - Variant4348, - Variant4349, - Variant4350, - Variant4351, - Variant4352, - Variant4353, - Variant4354, - Variant4355, - Variant4356, - Variant4357, - Variant4358, - Variant4359, - Variant4360, - Variant4361, - Variant4362, - Variant4363, - Variant4364, - Variant4365, - Variant4366, - Variant4367, - Variant4368, - Variant4369, - Variant4370, - Variant4371, - Variant4372, - Variant4373, - Variant4374, - Variant4375, - Variant4376, - Variant4377, - Variant4378, - Variant4379, - Variant4380, - Variant4381, - Variant4382, - Variant4383, - Variant4384, - Variant4385, - Variant4386, - Variant4387, - Variant4388, - Variant4389, - Variant4390, - Variant4391, - Variant4392, - Variant4393, - Variant4394, - Variant4395, - Variant4396, - Variant4397, - Variant4398, - Variant4399, - Variant4400, - Variant4401, - Variant4402, - Variant4403, - Variant4404, - Variant4405, - Variant4406, - Variant4407, - Variant4408, - Variant4409, - Variant4410, - Variant4411, - Variant4412, - Variant4413, - Variant4414, - Variant4415, - Variant4416, - Variant4417, - Variant4418, - Variant4419, - Variant4420, - Variant4421, - Variant4422, - Variant4423, - Variant4424, - Variant4425, - Variant4426, - Variant4427, - Variant4428, - Variant4429, - Variant4430, - Variant4431, - Variant4432, - Variant4433, - Variant4434, - Variant4435, - Variant4436, - Variant4437, - Variant4438, - Variant4439, - Variant4440, - Variant4441, - Variant4442, - Variant4443, - Variant4444, - Variant4445, - Variant4446, - Variant4447, - Variant4448, - Variant4449, - Variant4450, - Variant4451, - Variant4452, - Variant4453, - Variant4454, - Variant4455, - Variant4456, - Variant4457, - Variant4458, - Variant4459, - Variant4460, - Variant4461, - Variant4462, - Variant4463, - Variant4464, - Variant4465, - Variant4466, - Variant4467, - Variant4468, - Variant4469, - Variant4470, - Variant4471, - Variant4472, - Variant4473, - Variant4474, - Variant4475, - Variant4476, - Variant4477, - Variant4478, - Variant4479, - Variant4480, - Variant4481, - Variant4482, - Variant4483, - Variant4484, - Variant4485, - Variant4486, - Variant4487, - Variant4488, - Variant4489, - Variant4490, - Variant4491, - Variant4492, - Variant4493, - Variant4494, - Variant4495, - Variant4496, - Variant4497, - Variant4498, - Variant4499, - Variant4500, - Variant4501, - Variant4502, - Variant4503, - Variant4504, - Variant4505, - Variant4506, - Variant4507, - Variant4508, - Variant4509, - Variant4510, - Variant4511, - Variant4512, - Variant4513, - Variant4514, - Variant4515, - Variant4516, - Variant4517, - Variant4518, - Variant4519, - Variant4520, - Variant4521, - Variant4522, - Variant4523, - Variant4524, - Variant4525, - Variant4526, - Variant4527, - Variant4528, - Variant4529, - Variant4530, - Variant4531, - Variant4532, - Variant4533, - Variant4534, - Variant4535, - Variant4536, - Variant4537, - Variant4538, - Variant4539, - Variant4540, - Variant4541, - Variant4542, - Variant4543, - Variant4544, - Variant4545, - Variant4546, - Variant4547, - Variant4548, - Variant4549, - Variant4550, - Variant4551, - Variant4552, - Variant4553, - Variant4554, - Variant4555, - Variant4556, - Variant4557, - Variant4558, - Variant4559, - Variant4560, - Variant4561, - Variant4562, - Variant4563, - Variant4564, - Variant4565, - Variant4566, - Variant4567, - Variant4568, - Variant4569, - Variant4570, - Variant4571, - Variant4572, - Variant4573, - Variant4574, - Variant4575, - Variant4576, - Variant4577, - Variant4578, - Variant4579, - Variant4580, - Variant4581, - Variant4582, - Variant4583, - Variant4584, - Variant4585, - Variant4586, - Variant4587, - Variant4588, - Variant4589, - Variant4590, - Variant4591, - Variant4592, - Variant4593, - Variant4594, - Variant4595, - Variant4596, - Variant4597, - Variant4598, - Variant4599, - Variant4600, - Variant4601, - Variant4602, - Variant4603, - Variant4604, - Variant4605, - Variant4606, - Variant4607, - Variant4608, - Variant4609, - Variant4610, - Variant4611, - Variant4612, - Variant4613, - Variant4614, - Variant4615, - Variant4616, - Variant4617, - Variant4618, - Variant4619, - Variant4620, - Variant4621, - Variant4622, - Variant4623, - Variant4624, - Variant4625, - Variant4626, - Variant4627, - Variant4628, - Variant4629, - Variant4630, - Variant4631, - Variant4632, - Variant4633, - Variant4634, - Variant4635, - Variant4636, - Variant4637, - Variant4638, - Variant4639, - Variant4640, - Variant4641, - Variant4642, - Variant4643, - Variant4644, - Variant4645, - Variant4646, - Variant4647, - Variant4648, - Variant4649, - Variant4650, - Variant4651, - Variant4652, - Variant4653, - Variant4654, - Variant4655, - Variant4656, - Variant4657, - Variant4658, - Variant4659, - Variant4660, - Variant4661, - Variant4662, - Variant4663, - Variant4664, - Variant4665, - Variant4666, - Variant4667, - Variant4668, - Variant4669, - Variant4670, - Variant4671, - Variant4672, - Variant4673, - Variant4674, - Variant4675, - Variant4676, - Variant4677, - Variant4678, - Variant4679, - Variant4680, - Variant4681, - Variant4682, - Variant4683, - Variant4684, - Variant4685, - Variant4686, - Variant4687, - Variant4688, - Variant4689, - Variant4690, - Variant4691, - Variant4692, - Variant4693, - Variant4694, - Variant4695, - Variant4696, - Variant4697, - Variant4698, - Variant4699, - Variant4700, - Variant4701, - Variant4702, - Variant4703, - Variant4704, - Variant4705, - Variant4706, - Variant4707, - Variant4708, - Variant4709, - Variant4710, - Variant4711, - Variant4712, - Variant4713, - Variant4714, - Variant4715, - Variant4716, - Variant4717, - Variant4718, - Variant4719, - Variant4720, - Variant4721, - Variant4722, - Variant4723, - Variant4724, - Variant4725, - Variant4726, - Variant4727, - Variant4728, - Variant4729, - Variant4730, - Variant4731, - Variant4732, - Variant4733, - Variant4734, - Variant4735, - Variant4736, - Variant4737, - Variant4738, - Variant4739, - Variant4740, - Variant4741, - Variant4742, - Variant4743, - Variant4744, - Variant4745, - Variant4746, - Variant4747, - Variant4748, - Variant4749, - Variant4750, - Variant4751, - Variant4752, - Variant4753, - Variant4754, - Variant4755, - Variant4756, - Variant4757, - Variant4758, - Variant4759, - Variant4760, - Variant4761, - Variant4762, - Variant4763, - Variant4764, - Variant4765, - Variant4766, - Variant4767, - Variant4768, - Variant4769, - Variant4770, - Variant4771, - Variant4772, - Variant4773, - Variant4774, - Variant4775, - Variant4776, - Variant4777, - Variant4778, - Variant4779, - Variant4780, - Variant4781, - Variant4782, - Variant4783, - Variant4784, - Variant4785, - Variant4786, - Variant4787, - Variant4788, - Variant4789, - Variant4790, - Variant4791, - Variant4792, - Variant4793, - Variant4794, - Variant4795, - Variant4796, - Variant4797, - Variant4798, - Variant4799, - Variant4800, - Variant4801, - Variant4802, - Variant4803, - Variant4804, - Variant4805, - Variant4806, - Variant4807, - Variant4808, - Variant4809, - Variant4810, - Variant4811, - Variant4812, - Variant4813, - Variant4814, - Variant4815, - Variant4816, - Variant4817, - Variant4818, - Variant4819, - Variant4820, - Variant4821, - Variant4822, - Variant4823, - Variant4824, - Variant4825, - Variant4826, - Variant4827, - Variant4828, - Variant4829, - Variant4830, - Variant4831, - Variant4832, - Variant4833, - Variant4834, - Variant4835, - Variant4836, - Variant4837, - Variant4838, - Variant4839, - Variant4840, - Variant4841, - Variant4842, - Variant4843, - Variant4844, - Variant4845, - Variant4846, - Variant4847, - Variant4848, - Variant4849, - Variant4850, - Variant4851, - Variant4852, - Variant4853, - Variant4854, - Variant4855, - Variant4856, - Variant4857, - Variant4858, - Variant4859, - Variant4860, - Variant4861, - Variant4862, - Variant4863, - Variant4864, - Variant4865, - Variant4866, - Variant4867, - Variant4868, - Variant4869, - Variant4870, - Variant4871, - Variant4872, - Variant4873, - Variant4874, - Variant4875, - Variant4876, - Variant4877, - Variant4878, - Variant4879, - Variant4880, - Variant4881, - Variant4882, - Variant4883, - Variant4884, - Variant4885, - Variant4886, - Variant4887, - Variant4888, - Variant4889, - Variant4890, - Variant4891, - Variant4892, - Variant4893, - Variant4894, - Variant4895, - Variant4896, - Variant4897, - Variant4898, - Variant4899, - Variant4900, - Variant4901, - Variant4902, - Variant4903, - Variant4904, - Variant4905, - Variant4906, - Variant4907, - Variant4908, - Variant4909, - Variant4910, - Variant4911, - Variant4912, - Variant4913, - Variant4914, - Variant4915, - Variant4916, - Variant4917, - Variant4918, - Variant4919, - Variant4920, - Variant4921, - Variant4922, - Variant4923, - Variant4924, - Variant4925, - Variant4926, - Variant4927, - Variant4928, - Variant4929, - Variant4930, - Variant4931, - Variant4932, - Variant4933, - Variant4934, - Variant4935, - Variant4936, - Variant4937, - Variant4938, - Variant4939, - Variant4940, - Variant4941, - Variant4942, - Variant4943, - Variant4944, - Variant4945, - Variant4946, - Variant4947, - Variant4948, - Variant4949, - Variant4950, - Variant4951, - Variant4952, - Variant4953, - Variant4954, - Variant4955, - Variant4956, - Variant4957, - Variant4958, - Variant4959, - Variant4960, - Variant4961, - Variant4962, - Variant4963, - Variant4964, - Variant4965, - Variant4966, - Variant4967, - Variant4968, - Variant4969, - Variant4970, - Variant4971, - Variant4972, - Variant4973, - Variant4974, - Variant4975, - Variant4976, - Variant4977, - Variant4978, - Variant4979, - Variant4980, - Variant4981, - Variant4982, - Variant4983, - Variant4984, - Variant4985, - Variant4986, - Variant4987, - Variant4988, - Variant4989, - Variant4990, - Variant4991, - Variant4992, - Variant4993, - Variant4994, - Variant4995, - Variant4996, - Variant4997, - Variant4998, - Variant4999, - Variant5000, - Variant5001, - Variant5002, - Variant5003, - Variant5004, - Variant5005, - Variant5006, - Variant5007, - Variant5008, - Variant5009, - Variant5010, - Variant5011, - Variant5012, - Variant5013, - Variant5014, - Variant5015, - Variant5016, - Variant5017, - Variant5018, - Variant5019, - Variant5020, - Variant5021, - Variant5022, - Variant5023, - Variant5024, - Variant5025, - Variant5026, - Variant5027, - Variant5028, - Variant5029, - Variant5030, - Variant5031, - Variant5032, - Variant5033, - Variant5034, - Variant5035, - Variant5036, - Variant5037, - Variant5038, - Variant5039, - Variant5040, - Variant5041, - Variant5042, - Variant5043, - Variant5044, - Variant5045, - Variant5046, - Variant5047, - Variant5048, - Variant5049, - Variant5050, - Variant5051, - Variant5052, - Variant5053, - Variant5054, - Variant5055, - Variant5056, - Variant5057, - Variant5058, - Variant5059, - Variant5060, - Variant5061, - Variant5062, - Variant5063, - Variant5064, - Variant5065, - Variant5066, - Variant5067, - Variant5068, - Variant5069, - Variant5070, - Variant5071, - Variant5072, - Variant5073, - Variant5074, - Variant5075, - Variant5076, - Variant5077, - Variant5078, - Variant5079, - Variant5080, - Variant5081, - Variant5082, - Variant5083, - Variant5084, - Variant5085, - Variant5086, - Variant5087, - Variant5088, - Variant5089, - Variant5090, - Variant5091, - Variant5092, - Variant5093, - Variant5094, - Variant5095, - Variant5096, - Variant5097, - Variant5098, - Variant5099, - Variant5100, - Variant5101, - Variant5102, - Variant5103, - Variant5104, - Variant5105, - Variant5106, - Variant5107, - Variant5108, - Variant5109, - Variant5110, - Variant5111, - Variant5112, - Variant5113, - Variant5114, - Variant5115, - Variant5116, - Variant5117, - Variant5118, - Variant5119, - Variant5120, - Variant5121, - Variant5122, - Variant5123, - Variant5124, - Variant5125, - Variant5126, - Variant5127, - Variant5128, - Variant5129, - Variant5130, - Variant5131, - Variant5132, - Variant5133, - Variant5134, - Variant5135, - Variant5136, - Variant5137, - Variant5138, - Variant5139, - Variant5140, - Variant5141, - Variant5142, - Variant5143, - Variant5144, - Variant5145, - Variant5146, - Variant5147, - Variant5148, - Variant5149, - Variant5150, - Variant5151, - Variant5152, - Variant5153, - Variant5154, - Variant5155, - Variant5156, - Variant5157, - Variant5158, - Variant5159, - Variant5160, - Variant5161, - Variant5162, - Variant5163, - Variant5164, - Variant5165, - Variant5166, - Variant5167, - Variant5168, - Variant5169, - Variant5170, - Variant5171, - Variant5172, - Variant5173, - Variant5174, - Variant5175, - Variant5176, - Variant5177, - Variant5178, - Variant5179, - Variant5180, - Variant5181, - Variant5182, - Variant5183, - Variant5184, - Variant5185, - Variant5186, - Variant5187, - Variant5188, - Variant5189, - Variant5190, - Variant5191, - Variant5192, - Variant5193, - Variant5194, - Variant5195, - Variant5196, - Variant5197, - Variant5198, - Variant5199, - Variant5200, - Variant5201, - Variant5202, - Variant5203, - Variant5204, - Variant5205, - Variant5206, - Variant5207, - Variant5208, - Variant5209, - Variant5210, - Variant5211, - Variant5212, - Variant5213, - Variant5214, - Variant5215, - Variant5216, - Variant5217, - Variant5218, - Variant5219, - Variant5220, - Variant5221, - Variant5222, - Variant5223, - Variant5224, - Variant5225, - Variant5226, - Variant5227, - Variant5228, - Variant5229, - Variant5230, - Variant5231, - Variant5232, - Variant5233, - Variant5234, - Variant5235, - Variant5236, - Variant5237, - Variant5238, - Variant5239, - Variant5240, - Variant5241, - Variant5242, - Variant5243, - Variant5244, - Variant5245, - Variant5246, - Variant5247, - Variant5248, - Variant5249, - Variant5250, - Variant5251, - Variant5252, - Variant5253, - Variant5254, - Variant5255, - Variant5256, - Variant5257, - Variant5258, - Variant5259, - Variant5260, - Variant5261, - Variant5262, - Variant5263, - Variant5264, - Variant5265, - Variant5266, - Variant5267, - Variant5268, - Variant5269, - Variant5270, - Variant5271, - Variant5272, - Variant5273, - Variant5274, - Variant5275, - Variant5276, - Variant5277, - Variant5278, - Variant5279, - Variant5280, - Variant5281, - Variant5282, - Variant5283, - Variant5284, - Variant5285, - Variant5286, - Variant5287, - Variant5288, - Variant5289, - Variant5290, - Variant5291, - Variant5292, - Variant5293, - Variant5294, - Variant5295, - Variant5296, - Variant5297, - Variant5298, - Variant5299, - Variant5300, - Variant5301, - Variant5302, - Variant5303, - Variant5304, - Variant5305, - Variant5306, - Variant5307, - Variant5308, - Variant5309, - Variant5310, - Variant5311, - Variant5312, - Variant5313, - Variant5314, - Variant5315, - Variant5316, - Variant5317, - Variant5318, - Variant5319, - Variant5320, - Variant5321, - Variant5322, - Variant5323, - Variant5324, - Variant5325, - Variant5326, - Variant5327, - Variant5328, - Variant5329, - Variant5330, - Variant5331, - Variant5332, - Variant5333, - Variant5334, - Variant5335, - Variant5336, - Variant5337, - Variant5338, - Variant5339, - Variant5340, - Variant5341, - Variant5342, - Variant5343, - Variant5344, - Variant5345, - Variant5346, - Variant5347, - Variant5348, - Variant5349, - Variant5350, - Variant5351, - Variant5352, - Variant5353, - Variant5354, - Variant5355, - Variant5356, - Variant5357, - Variant5358, - Variant5359, - Variant5360, - Variant5361, - Variant5362, - Variant5363, - Variant5364, - Variant5365, - Variant5366, - Variant5367, - Variant5368, - Variant5369, - Variant5370, - Variant5371, - Variant5372, - Variant5373, - Variant5374, - Variant5375, - Variant5376, - Variant5377, - Variant5378, - Variant5379, - Variant5380, - Variant5381, - Variant5382, - Variant5383, - Variant5384, - Variant5385, - Variant5386, - Variant5387, - Variant5388, - Variant5389, - Variant5390, - Variant5391, - Variant5392, - Variant5393, - Variant5394, - Variant5395, - Variant5396, - Variant5397, - Variant5398, - Variant5399, - Variant5400, - Variant5401, - Variant5402, - Variant5403, - Variant5404, - Variant5405, - Variant5406, - Variant5407, - Variant5408, - Variant5409, - Variant5410, - Variant5411, - Variant5412, - Variant5413, - Variant5414, - Variant5415, - Variant5416, - Variant5417, - Variant5418, - Variant5419, - Variant5420, - Variant5421, - Variant5422, - Variant5423, - Variant5424, - Variant5425, - Variant5426, - Variant5427, - Variant5428, - Variant5429, - Variant5430, - Variant5431, - Variant5432, - Variant5433, - Variant5434, - Variant5435, - Variant5436, - Variant5437, - Variant5438, - Variant5439, - Variant5440, - Variant5441, - Variant5442, - Variant5443, - Variant5444, - Variant5445, - Variant5446, - Variant5447, - Variant5448, - Variant5449, - Variant5450, - Variant5451, - Variant5452, - Variant5453, - Variant5454, - Variant5455, - Variant5456, - Variant5457, - Variant5458, - Variant5459, - Variant5460, - Variant5461, - Variant5462, - Variant5463, - Variant5464, - Variant5465, - Variant5466, - Variant5467, - Variant5468, - Variant5469, - Variant5470, - Variant5471, - Variant5472, - Variant5473, - Variant5474, - Variant5475, - Variant5476, - Variant5477, - Variant5478, - Variant5479, - Variant5480, - Variant5481, - Variant5482, - Variant5483, - Variant5484, - Variant5485, - Variant5486, - Variant5487, - Variant5488, - Variant5489, - Variant5490, - Variant5491, - Variant5492, - Variant5493, - Variant5494, - Variant5495, - Variant5496, - Variant5497, - Variant5498, - Variant5499, - Variant5500, - Variant5501, - Variant5502, - Variant5503, - Variant5504, - Variant5505, - Variant5506, - Variant5507, - Variant5508, - Variant5509, - Variant5510, - Variant5511, - Variant5512, - Variant5513, - Variant5514, - Variant5515, - Variant5516, - Variant5517, - Variant5518, - Variant5519, - Variant5520, - Variant5521, - Variant5522, - Variant5523, - Variant5524, - Variant5525, - Variant5526, - Variant5527, - Variant5528, - Variant5529, - Variant5530, - Variant5531, - Variant5532, - Variant5533, - Variant5534, - Variant5535, - Variant5536, - Variant5537, - Variant5538, - Variant5539, - Variant5540, - Variant5541, - Variant5542, - Variant5543, - Variant5544, - Variant5545, - Variant5546, - Variant5547, - Variant5548, - Variant5549, - Variant5550, - Variant5551, - Variant5552, - Variant5553, - Variant5554, - Variant5555, - Variant5556, - Variant5557, - Variant5558, - Variant5559, - Variant5560, - Variant5561, - Variant5562, - Variant5563, - Variant5564, - Variant5565, - Variant5566, - Variant5567, - Variant5568, - Variant5569, - Variant5570, - Variant5571, - Variant5572, - Variant5573, - Variant5574, - Variant5575, - Variant5576, - Variant5577, - Variant5578, - Variant5579, - Variant5580, - Variant5581, - Variant5582, - Variant5583, - Variant5584, - Variant5585, - Variant5586, - Variant5587, - Variant5588, - Variant5589, - Variant5590, - Variant5591, - Variant5592, - Variant5593, - Variant5594, - Variant5595, - Variant5596, - Variant5597, - Variant5598, - Variant5599, - Variant5600, - Variant5601, - Variant5602, - Variant5603, - Variant5604, - Variant5605, - Variant5606, - Variant5607, - Variant5608, - Variant5609, - Variant5610, - Variant5611, - Variant5612, - Variant5613, - Variant5614, - Variant5615, - Variant5616, - Variant5617, - Variant5618, - Variant5619, - Variant5620, - Variant5621, - Variant5622, - Variant5623, - Variant5624, - Variant5625, - Variant5626, - Variant5627, - Variant5628, - Variant5629, - Variant5630, - Variant5631, - Variant5632, - Variant5633, - Variant5634, - Variant5635, - Variant5636, - Variant5637, - Variant5638, - Variant5639, - Variant5640, - Variant5641, - Variant5642, - Variant5643, - Variant5644, - Variant5645, - Variant5646, - Variant5647, - Variant5648, - Variant5649, - Variant5650, - Variant5651, - Variant5652, - Variant5653, - Variant5654, - Variant5655, - Variant5656, - Variant5657, - Variant5658, - Variant5659, - Variant5660, - Variant5661, - Variant5662, - Variant5663, - Variant5664, - Variant5665, - Variant5666, - Variant5667, - Variant5668, - Variant5669, - Variant5670, - Variant5671, - Variant5672, - Variant5673, - Variant5674, - Variant5675, - Variant5676, - Variant5677, - Variant5678, - Variant5679, - Variant5680, - Variant5681, - Variant5682, - Variant5683, - Variant5684, - Variant5685, - Variant5686, - Variant5687, - Variant5688, - Variant5689, - Variant5690, - Variant5691, - Variant5692, - Variant5693, - Variant5694, - Variant5695, - Variant5696, - Variant5697, - Variant5698, - Variant5699, - Variant5700, - Variant5701, - Variant5702, - Variant5703, - Variant5704, - Variant5705, - Variant5706, - Variant5707, - Variant5708, - Variant5709, - Variant5710, - Variant5711, - Variant5712, - Variant5713, - Variant5714, - Variant5715, - Variant5716, - Variant5717, - Variant5718, - Variant5719, - Variant5720, - Variant5721, - Variant5722, - Variant5723, - Variant5724, - Variant5725, - Variant5726, - Variant5727, - Variant5728, - Variant5729, - Variant5730, - Variant5731, - Variant5732, - Variant5733, - Variant5734, - Variant5735, - Variant5736, - Variant5737, - Variant5738, - Variant5739, - Variant5740, - Variant5741, - Variant5742, - Variant5743, - Variant5744, - Variant5745, - Variant5746, - Variant5747, - Variant5748, - Variant5749, - Variant5750, - Variant5751, - Variant5752, - Variant5753, - Variant5754, - Variant5755, - Variant5756, - Variant5757, - Variant5758, - Variant5759, - Variant5760, - Variant5761, - Variant5762, - Variant5763, - Variant5764, - Variant5765, - Variant5766, - Variant5767, - Variant5768, - Variant5769, - Variant5770, - Variant5771, - Variant5772, - Variant5773, - Variant5774, - Variant5775, - Variant5776, - Variant5777, - Variant5778, - Variant5779, - Variant5780, - Variant5781, - Variant5782, - Variant5783, - Variant5784, - Variant5785, - Variant5786, - Variant5787, - Variant5788, - Variant5789, - Variant5790, - Variant5791, - Variant5792, - Variant5793, - Variant5794, - Variant5795, - Variant5796, - Variant5797, - Variant5798, - Variant5799, - Variant5800, - Variant5801, - Variant5802, - Variant5803, - Variant5804, - Variant5805, - Variant5806, - Variant5807, - Variant5808, - Variant5809, - Variant5810, - Variant5811, - Variant5812, - Variant5813, - Variant5814, - Variant5815, - Variant5816, - Variant5817, - Variant5818, - Variant5819, - Variant5820, - Variant5821, - Variant5822, - Variant5823, - Variant5824, - Variant5825, - Variant5826, - Variant5827, - Variant5828, - Variant5829, - Variant5830, - Variant5831, - Variant5832, - Variant5833, - Variant5834, - Variant5835, - Variant5836, - Variant5837, - Variant5838, - Variant5839, - Variant5840, - Variant5841, - Variant5842, - Variant5843, - Variant5844, - Variant5845, - Variant5846, - Variant5847, - Variant5848, - Variant5849, - Variant5850, - Variant5851, - Variant5852, - Variant5853, - Variant5854, - Variant5855, - Variant5856, - Variant5857, - Variant5858, - Variant5859, - Variant5860, - Variant5861, - Variant5862, - Variant5863, - Variant5864, - Variant5865, - Variant5866, - Variant5867, - Variant5868, - Variant5869, - Variant5870, - Variant5871, - Variant5872, - Variant5873, - Variant5874, - Variant5875, - Variant5876, - Variant5877, - Variant5878, - Variant5879, - Variant5880, - Variant5881, - Variant5882, - Variant5883, - Variant5884, - Variant5885, - Variant5886, - Variant5887, - Variant5888, - Variant5889, - Variant5890, - Variant5891, - Variant5892, - Variant5893, - Variant5894, - Variant5895, - Variant5896, - Variant5897, - Variant5898, - Variant5899, - Variant5900, - Variant5901, - Variant5902, - Variant5903, - Variant5904, - Variant5905, - Variant5906, - Variant5907, - Variant5908, - Variant5909, - Variant5910, - Variant5911, - Variant5912, - Variant5913, - Variant5914, - Variant5915, - Variant5916, - Variant5917, - Variant5918, - Variant5919, - Variant5920, - Variant5921, - Variant5922, - Variant5923, - Variant5924, - Variant5925, - Variant5926, - Variant5927, - Variant5928, - Variant5929, - Variant5930, - Variant5931, - Variant5932, - Variant5933, - Variant5934, - Variant5935, - Variant5936, - Variant5937, - Variant5938, - Variant5939, - Variant5940, - Variant5941, - Variant5942, - Variant5943, - Variant5944, - Variant5945, - Variant5946, - Variant5947, - Variant5948, - Variant5949, - Variant5950, - Variant5951, - Variant5952, - Variant5953, - Variant5954, - Variant5955, - Variant5956, - Variant5957, - Variant5958, - Variant5959, - Variant5960, - Variant5961, - Variant5962, - Variant5963, - Variant5964, - Variant5965, - Variant5966, - Variant5967, - Variant5968, - Variant5969, - Variant5970, - Variant5971, - Variant5972, - Variant5973, - Variant5974, - Variant5975, - Variant5976, - Variant5977, - Variant5978, - Variant5979, - Variant5980, - Variant5981, - Variant5982, - Variant5983, - Variant5984, - Variant5985, - Variant5986, - Variant5987, - Variant5988, - Variant5989, - Variant5990, - Variant5991, - Variant5992, - Variant5993, - Variant5994, - Variant5995, - Variant5996, - Variant5997, - Variant5998, - Variant5999, - Variant6000, - Variant6001, - Variant6002, - Variant6003, - Variant6004, - Variant6005, - Variant6006, - Variant6007, - Variant6008, - Variant6009, - Variant6010, - Variant6011, - Variant6012, - Variant6013, - Variant6014, - Variant6015, - Variant6016, - Variant6017, - Variant6018, - Variant6019, - Variant6020, - Variant6021, - Variant6022, - Variant6023, - Variant6024, - Variant6025, - Variant6026, - Variant6027, - Variant6028, - Variant6029, - Variant6030, - Variant6031, - Variant6032, - Variant6033, - Variant6034, - Variant6035, - Variant6036, - Variant6037, - Variant6038, - Variant6039, - Variant6040, - Variant6041, - Variant6042, - Variant6043, - Variant6044, - Variant6045, - Variant6046, - Variant6047, - Variant6048, - Variant6049, - Variant6050, - Variant6051, - Variant6052, - Variant6053, - Variant6054, - Variant6055, - Variant6056, - Variant6057, - Variant6058, - Variant6059, - Variant6060, - Variant6061, - Variant6062, - Variant6063, - Variant6064, - Variant6065, - Variant6066, - Variant6067, - Variant6068, - Variant6069, - Variant6070, - Variant6071, - Variant6072, - Variant6073, - Variant6074, - Variant6075, - Variant6076, - Variant6077, - Variant6078, - Variant6079, - Variant6080, - Variant6081, - Variant6082, - Variant6083, - Variant6084, - Variant6085, - Variant6086, - Variant6087, - Variant6088, - Variant6089, - Variant6090, - Variant6091, - Variant6092, - Variant6093, - Variant6094, - Variant6095, - Variant6096, - Variant6097, - Variant6098, - Variant6099, - Variant6100, - Variant6101, - Variant6102, - Variant6103, - Variant6104, - Variant6105, - Variant6106, - Variant6107, - Variant6108, - Variant6109, - Variant6110, - Variant6111, - Variant6112, - Variant6113, - Variant6114, - Variant6115, - Variant6116, - Variant6117, - Variant6118, - Variant6119, - Variant6120, - Variant6121, - Variant6122, - Variant6123, - Variant6124, - Variant6125, - Variant6126, - Variant6127, - Variant6128, - Variant6129, - Variant6130, - Variant6131, - Variant6132, - Variant6133, - Variant6134, - Variant6135, - Variant6136, - Variant6137, - Variant6138, - Variant6139, - Variant6140, - Variant6141, - Variant6142, - Variant6143, - Variant6144, - Variant6145, - Variant6146, - Variant6147, - Variant6148, - Variant6149, - Variant6150, - Variant6151, - Variant6152, - Variant6153, - Variant6154, - Variant6155, - Variant6156, - Variant6157, - Variant6158, - Variant6159, - Variant6160, - Variant6161, - Variant6162, - Variant6163, - Variant6164, - Variant6165, - Variant6166, - Variant6167, - Variant6168, - Variant6169, - Variant6170, - Variant6171, - Variant6172, - Variant6173, - Variant6174, - Variant6175, - Variant6176, - Variant6177, - Variant6178, - Variant6179, - Variant6180, - Variant6181, - Variant6182, - Variant6183, - Variant6184, - Variant6185, - Variant6186, - Variant6187, - Variant6188, - Variant6189, - Variant6190, - Variant6191, - Variant6192, - Variant6193, - Variant6194, - Variant6195, - Variant6196, - Variant6197, - Variant6198, - Variant6199, - Variant6200, - Variant6201, - Variant6202, - Variant6203, - Variant6204, - Variant6205, - Variant6206, - Variant6207, - Variant6208, - Variant6209, - Variant6210, - Variant6211, - Variant6212, - Variant6213, - Variant6214, - Variant6215, - Variant6216, - Variant6217, - Variant6218, - Variant6219, - Variant6220, - Variant6221, - Variant6222, - Variant6223, - Variant6224, - Variant6225, - Variant6226, - Variant6227, - Variant6228, - Variant6229, - Variant6230, - Variant6231, - Variant6232, - Variant6233, - Variant6234, - Variant6235, - Variant6236, - Variant6237, - Variant6238, - Variant6239, - Variant6240, - Variant6241, - Variant6242, - Variant6243, - Variant6244, - Variant6245, - Variant6246, - Variant6247, - Variant6248, - Variant6249, - Variant6250, - Variant6251, - Variant6252, - Variant6253, - Variant6254, - Variant6255, - Variant6256, - Variant6257, - Variant6258, - Variant6259, - Variant6260, - Variant6261, - Variant6262, - Variant6263, - Variant6264, - Variant6265, - Variant6266, - Variant6267, - Variant6268, - Variant6269, - Variant6270, - Variant6271, - Variant6272, - Variant6273, - Variant6274, - Variant6275, - Variant6276, - Variant6277, - Variant6278, - Variant6279, - Variant6280, - Variant6281, - Variant6282, - Variant6283, - Variant6284, - Variant6285, - Variant6286, - Variant6287, - Variant6288, - Variant6289, - Variant6290, - Variant6291, - Variant6292, - Variant6293, - Variant6294, - Variant6295, - Variant6296, - Variant6297, - Variant6298, - Variant6299, - Variant6300, - Variant6301, - Variant6302, - Variant6303, - Variant6304, - Variant6305, - Variant6306, - Variant6307, - Variant6308, - Variant6309, - Variant6310, - Variant6311, - Variant6312, - Variant6313, - Variant6314, - Variant6315, - Variant6316, - Variant6317, - Variant6318, - Variant6319, - Variant6320, - Variant6321, - Variant6322, - Variant6323, - Variant6324, - Variant6325, - Variant6326, - Variant6327, - Variant6328, - Variant6329, - Variant6330, - Variant6331, - Variant6332, - Variant6333, - Variant6334, - Variant6335, - Variant6336, - Variant6337, - Variant6338, - Variant6339, - Variant6340, - Variant6341, - Variant6342, - Variant6343, - Variant6344, - Variant6345, - Variant6346, - Variant6347, - Variant6348, - Variant6349, - Variant6350, - Variant6351, - Variant6352, - Variant6353, - Variant6354, - Variant6355, - Variant6356, - Variant6357, - Variant6358, - Variant6359, - Variant6360, - Variant6361, - Variant6362, - Variant6363, - Variant6364, - Variant6365, - Variant6366, - Variant6367, - Variant6368, - Variant6369, - Variant6370, - Variant6371, - Variant6372, - Variant6373, - Variant6374, - Variant6375, - Variant6376, - Variant6377, - Variant6378, - Variant6379, - Variant6380, - Variant6381, - Variant6382, - Variant6383, - Variant6384, - Variant6385, - Variant6386, - Variant6387, - Variant6388, - Variant6389, - Variant6390, - Variant6391, - Variant6392, - Variant6393, - Variant6394, - Variant6395, - Variant6396, - Variant6397, - Variant6398, - Variant6399, - Variant6400, - Variant6401, - Variant6402, - Variant6403, - Variant6404, - Variant6405, - Variant6406, - Variant6407, - Variant6408, - Variant6409, - Variant6410, - Variant6411, - Variant6412, - Variant6413, - Variant6414, - Variant6415, - Variant6416, - Variant6417, - Variant6418, - Variant6419, - Variant6420, - Variant6421, - Variant6422, - Variant6423, - Variant6424, - Variant6425, - Variant6426, - Variant6427, - Variant6428, - Variant6429, - Variant6430, - Variant6431, - Variant6432, - Variant6433, - Variant6434, - Variant6435, - Variant6436, - Variant6437, - Variant6438, - Variant6439, - Variant6440, - Variant6441, - Variant6442, - Variant6443, - Variant6444, - Variant6445, - Variant6446, - Variant6447, - Variant6448, - Variant6449, - Variant6450, - Variant6451, - Variant6452, - Variant6453, - Variant6454, - Variant6455, - Variant6456, - Variant6457, - Variant6458, - Variant6459, - Variant6460, - Variant6461, - Variant6462, - Variant6463, - Variant6464, - Variant6465, - Variant6466, - Variant6467, - Variant6468, - Variant6469, - Variant6470, - Variant6471, - Variant6472, - Variant6473, - Variant6474, - Variant6475, - Variant6476, - Variant6477, - Variant6478, - Variant6479, - Variant6480, - Variant6481, - Variant6482, - Variant6483, - Variant6484, - Variant6485, - Variant6486, - Variant6487, - Variant6488, - Variant6489, - Variant6490, - Variant6491, - Variant6492, - Variant6493, - Variant6494, - Variant6495, - Variant6496, - Variant6497, - Variant6498, - Variant6499, - Variant6500, - Variant6501, - Variant6502, - Variant6503, - Variant6504, - Variant6505, - Variant6506, - Variant6507, - Variant6508, - Variant6509, - Variant6510, - Variant6511, - Variant6512, - Variant6513, - Variant6514, - Variant6515, - Variant6516, - Variant6517, - Variant6518, - Variant6519, - Variant6520, - Variant6521, - Variant6522, - Variant6523, - Variant6524, - Variant6525, - Variant6526, - Variant6527, - Variant6528, - Variant6529, - Variant6530, - Variant6531, - Variant6532, - Variant6533, - Variant6534, - Variant6535, - Variant6536, - Variant6537, - Variant6538, - Variant6539, - Variant6540, - Variant6541, - Variant6542, - Variant6543, - Variant6544, - Variant6545, - Variant6546, - Variant6547, - Variant6548, - Variant6549, - Variant6550, - Variant6551, - Variant6552, - Variant6553, - Variant6554, - Variant6555, - Variant6556, - Variant6557, - Variant6558, - Variant6559, - Variant6560, - Variant6561, - Variant6562, - Variant6563, - Variant6564, - Variant6565, - Variant6566, - Variant6567, - Variant6568, - Variant6569, - Variant6570, - Variant6571, - Variant6572, - Variant6573, - Variant6574, - Variant6575, - Variant6576, - Variant6577, - Variant6578, - Variant6579, - Variant6580, - Variant6581, - Variant6582, - Variant6583, - Variant6584, - Variant6585, - Variant6586, - Variant6587, - Variant6588, - Variant6589, - Variant6590, - Variant6591, - Variant6592, - Variant6593, - Variant6594, - Variant6595, - Variant6596, - Variant6597, - Variant6598, - Variant6599, - Variant6600, - Variant6601, - Variant6602, - Variant6603, - Variant6604, - Variant6605, - Variant6606, - Variant6607, - Variant6608, - Variant6609, - Variant6610, - Variant6611, - Variant6612, - Variant6613, - Variant6614, - Variant6615, - Variant6616, - Variant6617, - Variant6618, - Variant6619, - Variant6620, - Variant6621, - Variant6622, - Variant6623, - Variant6624, - Variant6625, - Variant6626, - Variant6627, - Variant6628, - Variant6629, - Variant6630, - Variant6631, - Variant6632, - Variant6633, - Variant6634, - Variant6635, - Variant6636, - Variant6637, - Variant6638, - Variant6639, - Variant6640, - Variant6641, - Variant6642, - Variant6643, - Variant6644, - Variant6645, - Variant6646, - Variant6647, - Variant6648, - Variant6649, - Variant6650, - Variant6651, - Variant6652, - Variant6653, - Variant6654, - Variant6655, - Variant6656, - Variant6657, - Variant6658, - Variant6659, - Variant6660, - Variant6661, - Variant6662, - Variant6663, - Variant6664, - Variant6665, - Variant6666, - Variant6667, - Variant6668, - Variant6669, - Variant6670, - Variant6671, - Variant6672, - Variant6673, - Variant6674, - Variant6675, - Variant6676, - Variant6677, - Variant6678, - Variant6679, - Variant6680, - Variant6681, - Variant6682, - Variant6683, - Variant6684, - Variant6685, - Variant6686, - Variant6687, - Variant6688, - Variant6689, - Variant6690, - Variant6691, - Variant6692, - Variant6693, - Variant6694, - Variant6695, - Variant6696, - Variant6697, - Variant6698, - Variant6699, - Variant6700, - Variant6701, - Variant6702, - Variant6703, - Variant6704, - Variant6705, - Variant6706, - Variant6707, - Variant6708, - Variant6709, - Variant6710, - Variant6711, - Variant6712, - Variant6713, - Variant6714, - Variant6715, - Variant6716, - Variant6717, - Variant6718, - Variant6719, - Variant6720, - Variant6721, - Variant6722, - Variant6723, - Variant6724, - Variant6725, - Variant6726, - Variant6727, - Variant6728, - Variant6729, - Variant6730, - Variant6731, - Variant6732, - Variant6733, - Variant6734, - Variant6735, - Variant6736, - Variant6737, - Variant6738, - Variant6739, - Variant6740, - Variant6741, - Variant6742, - Variant6743, - Variant6744, - Variant6745, - Variant6746, - Variant6747, - Variant6748, - Variant6749, - Variant6750, - Variant6751, - Variant6752, - Variant6753, - Variant6754, - Variant6755, - Variant6756, - Variant6757, - Variant6758, - Variant6759, - Variant6760, - Variant6761, - Variant6762, - Variant6763, - Variant6764, - Variant6765, - Variant6766, - Variant6767, - Variant6768, - Variant6769, - Variant6770, - Variant6771, - Variant6772, - Variant6773, - Variant6774, - Variant6775, - Variant6776, - Variant6777, - Variant6778, - Variant6779, - Variant6780, - Variant6781, - Variant6782, - Variant6783, - Variant6784, - Variant6785, - Variant6786, - Variant6787, - Variant6788, - Variant6789, - Variant6790, - Variant6791, - Variant6792, - Variant6793, - Variant6794, - Variant6795, - Variant6796, - Variant6797, - Variant6798, - Variant6799, - Variant6800, - Variant6801, - Variant6802, - Variant6803, - Variant6804, - Variant6805, - Variant6806, - Variant6807, - Variant6808, - Variant6809, - Variant6810, - Variant6811, - Variant6812, - Variant6813, - Variant6814, - Variant6815, - Variant6816, - Variant6817, - Variant6818, - Variant6819, - Variant6820, - Variant6821, - Variant6822, - Variant6823, - Variant6824, - Variant6825, - Variant6826, - Variant6827, - Variant6828, - Variant6829, - Variant6830, - Variant6831, - Variant6832, - Variant6833, - Variant6834, - Variant6835, - Variant6836, - Variant6837, - Variant6838, - Variant6839, - Variant6840, - Variant6841, - Variant6842, - Variant6843, - Variant6844, - Variant6845, - Variant6846, - Variant6847, - Variant6848, - Variant6849, - Variant6850, - Variant6851, - Variant6852, - Variant6853, - Variant6854, - Variant6855, - Variant6856, - Variant6857, - Variant6858, - Variant6859, - Variant6860, - Variant6861, - Variant6862, - Variant6863, - Variant6864, - Variant6865, - Variant6866, - Variant6867, - Variant6868, - Variant6869, - Variant6870, - Variant6871, - Variant6872, - Variant6873, - Variant6874, - Variant6875, - Variant6876, - Variant6877, - Variant6878, - Variant6879, - Variant6880, - Variant6881, - Variant6882, - Variant6883, - Variant6884, - Variant6885, - Variant6886, - Variant6887, - Variant6888, - Variant6889, - Variant6890, - Variant6891, - Variant6892, - Variant6893, - Variant6894, - Variant6895, - Variant6896, - Variant6897, - Variant6898, - Variant6899, - Variant6900, - Variant6901, - Variant6902, - Variant6903, - Variant6904, - Variant6905, - Variant6906, - Variant6907, - Variant6908, - Variant6909, - Variant6910, - Variant6911, - Variant6912, - Variant6913, - Variant6914, - Variant6915, - Variant6916, - Variant6917, - Variant6918, - Variant6919, - Variant6920, - Variant6921, - Variant6922, - Variant6923, - Variant6924, - Variant6925, - Variant6926, - Variant6927, - Variant6928, - Variant6929, - Variant6930, - Variant6931, - Variant6932, - Variant6933, - Variant6934, - Variant6935, - Variant6936, - Variant6937, - Variant6938, - Variant6939, - Variant6940, - Variant6941, - Variant6942, - Variant6943, - Variant6944, - Variant6945, - Variant6946, - Variant6947, - Variant6948, - Variant6949, - Variant6950, - Variant6951, - Variant6952, - Variant6953, - Variant6954, - Variant6955, - Variant6956, - Variant6957, - Variant6958, - Variant6959, - Variant6960, - Variant6961, - Variant6962, - Variant6963, - Variant6964, - Variant6965, - Variant6966, - Variant6967, - Variant6968, - Variant6969, - Variant6970, - Variant6971, - Variant6972, - Variant6973, - Variant6974, - Variant6975, - Variant6976, - Variant6977, - Variant6978, - Variant6979, - Variant6980, - Variant6981, - Variant6982, - Variant6983, - Variant6984, - Variant6985, - Variant6986, - Variant6987, - Variant6988, - Variant6989, - Variant6990, - Variant6991, - Variant6992, - Variant6993, - Variant6994, - Variant6995, - Variant6996, - Variant6997, - Variant6998, - Variant6999, - Variant7000, - Variant7001, - Variant7002, - Variant7003, - Variant7004, - Variant7005, - Variant7006, - Variant7007, - Variant7008, - Variant7009, - Variant7010, - Variant7011, - Variant7012, - Variant7013, - Variant7014, - Variant7015, - Variant7016, - Variant7017, - Variant7018, - Variant7019, - Variant7020, - Variant7021, - Variant7022, - Variant7023, - Variant7024, - Variant7025, - Variant7026, - Variant7027, - Variant7028, - Variant7029, - Variant7030, - Variant7031, - Variant7032, - Variant7033, - Variant7034, - Variant7035, - Variant7036, - Variant7037, - Variant7038, - Variant7039, - Variant7040, - Variant7041, - Variant7042, - Variant7043, - Variant7044, - Variant7045, - Variant7046, - Variant7047, - Variant7048, - Variant7049, - Variant7050, - Variant7051, - Variant7052, - Variant7053, - Variant7054, - Variant7055, - Variant7056, - Variant7057, - Variant7058, - Variant7059, - Variant7060, - Variant7061, - Variant7062, - Variant7063, - Variant7064, - Variant7065, - Variant7066, - Variant7067, - Variant7068, - Variant7069, - Variant7070, - Variant7071, - Variant7072, - Variant7073, - Variant7074, - Variant7075, - Variant7076, - Variant7077, - Variant7078, - Variant7079, - Variant7080, - Variant7081, - Variant7082, - Variant7083, - Variant7084, - Variant7085, - Variant7086, - Variant7087, - Variant7088, - Variant7089, - Variant7090, - Variant7091, - Variant7092, - Variant7093, - Variant7094, - Variant7095, - Variant7096, - Variant7097, - Variant7098, - Variant7099, - Variant7100, - Variant7101, - Variant7102, - Variant7103, - Variant7104, - Variant7105, - Variant7106, - Variant7107, - Variant7108, - Variant7109, - Variant7110, - Variant7111, - Variant7112, - Variant7113, - Variant7114, - Variant7115, - Variant7116, - Variant7117, - Variant7118, - Variant7119, - Variant7120, - Variant7121, - Variant7122, - Variant7123, - Variant7124, - Variant7125, - Variant7126, - Variant7127, - Variant7128, - Variant7129, - Variant7130, - Variant7131, - Variant7132, - Variant7133, - Variant7134, - Variant7135, - Variant7136, - Variant7137, - Variant7138, - Variant7139, - Variant7140, - Variant7141, - Variant7142, - Variant7143, - Variant7144, - Variant7145, - Variant7146, - Variant7147, - Variant7148, - Variant7149, - Variant7150, - Variant7151, - Variant7152, - Variant7153, - Variant7154, - Variant7155, - Variant7156, - Variant7157, - Variant7158, - Variant7159, - Variant7160, - Variant7161, - Variant7162, - Variant7163, - Variant7164, - Variant7165, - Variant7166, - Variant7167, - Variant7168, - Variant7169, - Variant7170, - Variant7171, - Variant7172, - Variant7173, - Variant7174, - Variant7175, - Variant7176, - Variant7177, - Variant7178, - Variant7179, - Variant7180, - Variant7181, - Variant7182, - Variant7183, - Variant7184, - Variant7185, - Variant7186, - Variant7187, - Variant7188, - Variant7189, - Variant7190, - Variant7191, - Variant7192, - Variant7193, - Variant7194, - Variant7195, - Variant7196, - Variant7197, - Variant7198, - Variant7199, - Variant7200, - Variant7201, - Variant7202, - Variant7203, - Variant7204, - Variant7205, - Variant7206, - Variant7207, - Variant7208, - Variant7209, - Variant7210, - Variant7211, - Variant7212, - Variant7213, - Variant7214, - Variant7215, - Variant7216, - Variant7217, - Variant7218, - Variant7219, - Variant7220, - Variant7221, - Variant7222, - Variant7223, - Variant7224, - Variant7225, - Variant7226, - Variant7227, - Variant7228, - Variant7229, - Variant7230, - Variant7231, - Variant7232, - Variant7233, - Variant7234, - Variant7235, - Variant7236, - Variant7237, - Variant7238, - Variant7239, - Variant7240, - Variant7241, - Variant7242, - Variant7243, - Variant7244, - Variant7245, - Variant7246, - Variant7247, - Variant7248, - Variant7249, - Variant7250, - Variant7251, - Variant7252, - Variant7253, - Variant7254, - Variant7255, - Variant7256, - Variant7257, - Variant7258, - Variant7259, - Variant7260, - Variant7261, - Variant7262, - Variant7263, - Variant7264, - Variant7265, - Variant7266, - Variant7267, - Variant7268, - Variant7269, - Variant7270, - Variant7271, - Variant7272, - Variant7273, - Variant7274, - Variant7275, - Variant7276, - Variant7277, - Variant7278, - Variant7279, - Variant7280, - Variant7281, - Variant7282, - Variant7283, - Variant7284, - Variant7285, - Variant7286, - Variant7287, - Variant7288, - Variant7289, - Variant7290, - Variant7291, - Variant7292, - Variant7293, - Variant7294, - Variant7295, - Variant7296, - Variant7297, - Variant7298, - Variant7299, - Variant7300, - Variant7301, - Variant7302, - Variant7303, - Variant7304, - Variant7305, - Variant7306, - Variant7307, - Variant7308, - Variant7309, - Variant7310, - Variant7311, - Variant7312, - Variant7313, - Variant7314, - Variant7315, - Variant7316, - Variant7317, - Variant7318, - Variant7319, - Variant7320, - Variant7321, - Variant7322, - Variant7323, - Variant7324, - Variant7325, - Variant7326, - Variant7327, - Variant7328, - Variant7329, - Variant7330, - Variant7331, - Variant7332, - Variant7333, - Variant7334, - Variant7335, - Variant7336, - Variant7337, - Variant7338, - Variant7339, - Variant7340, - Variant7341, - Variant7342, - Variant7343, - Variant7344, - Variant7345, - Variant7346, - Variant7347, - Variant7348, - Variant7349, - Variant7350, - Variant7351, - Variant7352, - Variant7353, - Variant7354, - Variant7355, - Variant7356, - Variant7357, - Variant7358, - Variant7359, - Variant7360, - Variant7361, - Variant7362, - Variant7363, - Variant7364, - Variant7365, - Variant7366, - Variant7367, - Variant7368, - Variant7369, - Variant7370, - Variant7371, - Variant7372, - Variant7373, - Variant7374, - Variant7375, - Variant7376, - Variant7377, - Variant7378, - Variant7379, - Variant7380, - Variant7381, - Variant7382, - Variant7383, - Variant7384, - Variant7385, - Variant7386, - Variant7387, - Variant7388, - Variant7389, - Variant7390, - Variant7391, - Variant7392, - Variant7393, - Variant7394, - Variant7395, - Variant7396, - Variant7397, - Variant7398, - Variant7399, - Variant7400, - Variant7401, - Variant7402, - Variant7403, - Variant7404, - Variant7405, - Variant7406, - Variant7407, - Variant7408, - Variant7409, - Variant7410, - Variant7411, - Variant7412, - Variant7413, - Variant7414, - Variant7415, - Variant7416, - Variant7417, - Variant7418, - Variant7419, - Variant7420, - Variant7421, - Variant7422, - Variant7423, - Variant7424, - Variant7425, - Variant7426, - Variant7427, - Variant7428, - Variant7429, - Variant7430, - Variant7431, - Variant7432, - Variant7433, - Variant7434, - Variant7435, - Variant7436, - Variant7437, - Variant7438, - Variant7439, - Variant7440, - Variant7441, - Variant7442, - Variant7443, - Variant7444, - Variant7445, - Variant7446, - Variant7447, - Variant7448, - Variant7449, - Variant7450, - Variant7451, - Variant7452, - Variant7453, - Variant7454, - Variant7455, - Variant7456, - Variant7457, - Variant7458, - Variant7459, - Variant7460, - Variant7461, - Variant7462, - Variant7463, - Variant7464, - Variant7465, - Variant7466, - Variant7467, - Variant7468, - Variant7469, - Variant7470, - Variant7471, - Variant7472, - Variant7473, - Variant7474, - Variant7475, - Variant7476, - Variant7477, - Variant7478, - Variant7479, - Variant7480, - Variant7481, - Variant7482, - Variant7483, - Variant7484, - Variant7485, - Variant7486, - Variant7487, - Variant7488, - Variant7489, - Variant7490, - Variant7491, - Variant7492, - Variant7493, - Variant7494, - Variant7495, - Variant7496, - Variant7497, - Variant7498, - Variant7499, - Variant7500, - Variant7501, - Variant7502, - Variant7503, - Variant7504, - Variant7505, - Variant7506, - Variant7507, - Variant7508, - Variant7509, - Variant7510, - Variant7511, - Variant7512, - Variant7513, - Variant7514, - Variant7515, - Variant7516, - Variant7517, - Variant7518, - Variant7519, - Variant7520, - Variant7521, - Variant7522, - Variant7523, - Variant7524, - Variant7525, - Variant7526, - Variant7527, - Variant7528, - Variant7529, - Variant7530, - Variant7531, - Variant7532, - Variant7533, - Variant7534, - Variant7535, - Variant7536, - Variant7537, - Variant7538, - Variant7539, - Variant7540, - Variant7541, - Variant7542, - Variant7543, - Variant7544, - Variant7545, - Variant7546, - Variant7547, - Variant7548, - Variant7549, - Variant7550, - Variant7551, - Variant7552, - Variant7553, - Variant7554, - Variant7555, - Variant7556, - Variant7557, - Variant7558, - Variant7559, - Variant7560, - Variant7561, - Variant7562, - Variant7563, - Variant7564, - Variant7565, - Variant7566, - Variant7567, - Variant7568, - Variant7569, - Variant7570, - Variant7571, - Variant7572, - Variant7573, - Variant7574, - Variant7575, - Variant7576, - Variant7577, - Variant7578, - Variant7579, - Variant7580, - Variant7581, - Variant7582, - Variant7583, - Variant7584, - Variant7585, - Variant7586, - Variant7587, - Variant7588, - Variant7589, - Variant7590, - Variant7591, - Variant7592, - Variant7593, - Variant7594, - Variant7595, - Variant7596, - Variant7597, - Variant7598, - Variant7599, - Variant7600, - Variant7601, - Variant7602, - Variant7603, - Variant7604, - Variant7605, - Variant7606, - Variant7607, - Variant7608, - Variant7609, - Variant7610, - Variant7611, - Variant7612, - Variant7613, - Variant7614, - Variant7615, - Variant7616, - Variant7617, - Variant7618, - Variant7619, - Variant7620, - Variant7621, - Variant7622, - Variant7623, - Variant7624, - Variant7625, - Variant7626, - Variant7627, - Variant7628, - Variant7629, - Variant7630, - Variant7631, - Variant7632, - Variant7633, - Variant7634, - Variant7635, - Variant7636, - Variant7637, - Variant7638, - Variant7639, - Variant7640, - Variant7641, - Variant7642, - Variant7643, - Variant7644, - Variant7645, - Variant7646, - Variant7647, - Variant7648, - Variant7649, - Variant7650, - Variant7651, - Variant7652, - Variant7653, - Variant7654, - Variant7655, - Variant7656, - Variant7657, - Variant7658, - Variant7659, - Variant7660, - Variant7661, - Variant7662, - Variant7663, - Variant7664, - Variant7665, - Variant7666, - Variant7667, - Variant7668, - Variant7669, - Variant7670, - Variant7671, - Variant7672, - Variant7673, - Variant7674, - Variant7675, - Variant7676, - Variant7677, - Variant7678, - Variant7679, - Variant7680, - Variant7681, - Variant7682, - Variant7683, - Variant7684, - Variant7685, - Variant7686, - Variant7687, - Variant7688, - Variant7689, - Variant7690, - Variant7691, - Variant7692, - Variant7693, - Variant7694, - Variant7695, - Variant7696, - Variant7697, - Variant7698, - Variant7699, - Variant7700, - Variant7701, - Variant7702, - Variant7703, - Variant7704, - Variant7705, - Variant7706, - Variant7707, - Variant7708, - Variant7709, - Variant7710, - Variant7711, - Variant7712, - Variant7713, - Variant7714, - Variant7715, - Variant7716, - Variant7717, - Variant7718, - Variant7719, - Variant7720, - Variant7721, - Variant7722, - Variant7723, - Variant7724, - Variant7725, - Variant7726, - Variant7727, - Variant7728, - Variant7729, - Variant7730, - Variant7731, - Variant7732, - Variant7733, - Variant7734, - Variant7735, - Variant7736, - Variant7737, - Variant7738, - Variant7739, - Variant7740, - Variant7741, - Variant7742, - Variant7743, - Variant7744, - Variant7745, - Variant7746, - Variant7747, - Variant7748, - Variant7749, - Variant7750, - Variant7751, - Variant7752, - Variant7753, - Variant7754, - Variant7755, - Variant7756, - Variant7757, - Variant7758, - Variant7759, - Variant7760, - Variant7761, - Variant7762, - Variant7763, - Variant7764, - Variant7765, - Variant7766, - Variant7767, - Variant7768, - Variant7769, - Variant7770, - Variant7771, - Variant7772, - Variant7773, - Variant7774, - Variant7775, - Variant7776, - Variant7777, - Variant7778, - Variant7779, - Variant7780, - Variant7781, - Variant7782, - Variant7783, - Variant7784, - Variant7785, - Variant7786, - Variant7787, - Variant7788, - Variant7789, - Variant7790, - Variant7791, - Variant7792, - Variant7793, - Variant7794, - Variant7795, - Variant7796, - Variant7797, - Variant7798, - Variant7799, - Variant7800, - Variant7801, - Variant7802, - Variant7803, - Variant7804, - Variant7805, - Variant7806, - Variant7807, - Variant7808, - Variant7809, - Variant7810, - Variant7811, - Variant7812, - Variant7813, - Variant7814, - Variant7815, - Variant7816, - Variant7817, - Variant7818, - Variant7819, - Variant7820, - Variant7821, - Variant7822, - Variant7823, - Variant7824, - Variant7825, - Variant7826, - Variant7827, - Variant7828, - Variant7829, - Variant7830, - Variant7831, - Variant7832, - Variant7833, - Variant7834, - Variant7835, - Variant7836, - Variant7837, - Variant7838, - Variant7839, - Variant7840, - Variant7841, - Variant7842, - Variant7843, - Variant7844, - Variant7845, - Variant7846, - Variant7847, - Variant7848, - Variant7849, - Variant7850, - Variant7851, - Variant7852, - Variant7853, - Variant7854, - Variant7855, - Variant7856, - Variant7857, - Variant7858, - Variant7859, - Variant7860, - Variant7861, - Variant7862, - Variant7863, - Variant7864, - Variant7865, - Variant7866, - Variant7867, - Variant7868, - Variant7869, - Variant7870, - Variant7871, - Variant7872, - Variant7873, - Variant7874, - Variant7875, - Variant7876, - Variant7877, - Variant7878, - Variant7879, - Variant7880, - Variant7881, - Variant7882, - Variant7883, - Variant7884, - Variant7885, - Variant7886, - Variant7887, - Variant7888, - Variant7889, - Variant7890, - Variant7891, - Variant7892, - Variant7893, - Variant7894, - Variant7895, - Variant7896, - Variant7897, - Variant7898, - Variant7899, - Variant7900, - Variant7901, - Variant7902, - Variant7903, - Variant7904, - Variant7905, - Variant7906, - Variant7907, - Variant7908, - Variant7909, - Variant7910, - Variant7911, - Variant7912, - Variant7913, - Variant7914, - Variant7915, - Variant7916, - Variant7917, - Variant7918, - Variant7919, - Variant7920, - Variant7921, - Variant7922, - Variant7923, - Variant7924, - Variant7925, - Variant7926, - Variant7927, - Variant7928, - Variant7929, - Variant7930, - Variant7931, - Variant7932, - Variant7933, - Variant7934, - Variant7935, - Variant7936, - Variant7937, - Variant7938, - Variant7939, - Variant7940, - Variant7941, - Variant7942, - Variant7943, - Variant7944, - Variant7945, - Variant7946, - Variant7947, - Variant7948, - Variant7949, - Variant7950, - Variant7951, - Variant7952, - Variant7953, - Variant7954, - Variant7955, - Variant7956, - Variant7957, - Variant7958, - Variant7959, - Variant7960, - Variant7961, - Variant7962, - Variant7963, - Variant7964, - Variant7965, - Variant7966, - Variant7967, - Variant7968, - Variant7969, - Variant7970, - Variant7971, - Variant7972, - Variant7973, - Variant7974, - Variant7975, - Variant7976, - Variant7977, - Variant7978, - Variant7979, - Variant7980, - Variant7981, - Variant7982, - Variant7983, - Variant7984, - Variant7985, - Variant7986, - Variant7987, - Variant7988, - Variant7989, - Variant7990, - Variant7991, - Variant7992, - Variant7993, - Variant7994, - Variant7995, - Variant7996, - Variant7997, - Variant7998, - Variant7999, - Variant8000, - Variant8001, - Variant8002, - Variant8003, - Variant8004, - Variant8005, - Variant8006, - Variant8007, - Variant8008, - Variant8009, - Variant8010, - Variant8011, - Variant8012, - Variant8013, - Variant8014, - Variant8015, - Variant8016, - Variant8017, - Variant8018, - Variant8019, - Variant8020, - Variant8021, - Variant8022, - Variant8023, - Variant8024, - Variant8025, - Variant8026, - Variant8027, - Variant8028, - Variant8029, - Variant8030, - Variant8031, - Variant8032, - Variant8033, - Variant8034, - Variant8035, - Variant8036, - Variant8037, - Variant8038, - Variant8039, - Variant8040, - Variant8041, - Variant8042, - Variant8043, - Variant8044, - Variant8045, - Variant8046, - Variant8047, - Variant8048, - Variant8049, - Variant8050, - Variant8051, - Variant8052, - Variant8053, - Variant8054, - Variant8055, - Variant8056, - Variant8057, - Variant8058, - Variant8059, - Variant8060, - Variant8061, - Variant8062, - Variant8063, - Variant8064, - Variant8065, - Variant8066, - Variant8067, - Variant8068, - Variant8069, - Variant8070, - Variant8071, - Variant8072, - Variant8073, - Variant8074, - Variant8075, - Variant8076, - Variant8077, - Variant8078, - Variant8079, - Variant8080, - Variant8081, - Variant8082, - Variant8083, - Variant8084, - Variant8085, - Variant8086, - Variant8087, - Variant8088, - Variant8089, - Variant8090, - Variant8091, - Variant8092, - Variant8093, - Variant8094, - Variant8095, - Variant8096, - Variant8097, - Variant8098, - Variant8099, - Variant8100, - Variant8101, - Variant8102, - Variant8103, - Variant8104, - Variant8105, - Variant8106, - Variant8107, - Variant8108, - Variant8109, - Variant8110, - Variant8111, - Variant8112, - Variant8113, - Variant8114, - Variant8115, - Variant8116, - Variant8117, - Variant8118, - Variant8119, - Variant8120, - Variant8121, - Variant8122, - Variant8123, - Variant8124, - Variant8125, - Variant8126, - Variant8127, - Variant8128, - Variant8129, - Variant8130, - Variant8131, - Variant8132, - Variant8133, - Variant8134, - Variant8135, - Variant8136, - Variant8137, - Variant8138, - Variant8139, - Variant8140, - Variant8141, - Variant8142, - Variant8143, - Variant8144, - Variant8145, - Variant8146, - Variant8147, - Variant8148, - Variant8149, - Variant8150, - Variant8151, - Variant8152, - Variant8153, - Variant8154, - Variant8155, - Variant8156, - Variant8157, - Variant8158, - Variant8159, - Variant8160, - Variant8161, - Variant8162, - Variant8163, - Variant8164, - Variant8165, - Variant8166, - Variant8167, - Variant8168, - Variant8169, - Variant8170, - Variant8171, - Variant8172, - Variant8173, - Variant8174, - Variant8175, - Variant8176, - Variant8177, - Variant8178, - Variant8179, - Variant8180, - Variant8181, - Variant8182, - Variant8183, - Variant8184, - Variant8185, - Variant8186, - Variant8187, - Variant8188, - Variant8189, - Variant8190, - Variant8191, - Variant8192, - Variant8193, - Variant8194, - Variant8195, - Variant8196, - Variant8197, - Variant8198, - Variant8199, - Variant8200, - Variant8201, - Variant8202, - Variant8203, - Variant8204, - Variant8205, - Variant8206, - Variant8207, - Variant8208, - Variant8209, - Variant8210, - Variant8211, - Variant8212, - Variant8213, - Variant8214, - Variant8215, - Variant8216, - Variant8217, - Variant8218, - Variant8219, - Variant8220, - Variant8221, - Variant8222, - Variant8223, - Variant8224, - Variant8225, - Variant8226, - Variant8227, - Variant8228, - Variant8229, - Variant8230, - Variant8231, - Variant8232, - Variant8233, - Variant8234, - Variant8235, - Variant8236, - Variant8237, - Variant8238, - Variant8239, - Variant8240, - Variant8241, - Variant8242, - Variant8243, - Variant8244, - Variant8245, - Variant8246, - Variant8247, - Variant8248, - Variant8249, - Variant8250, - Variant8251, - Variant8252, - Variant8253, - Variant8254, - Variant8255, - Variant8256, - Variant8257, - Variant8258, - Variant8259, - Variant8260, - Variant8261, - Variant8262, - Variant8263, - Variant8264, - Variant8265, - Variant8266, - Variant8267, - Variant8268, - Variant8269, - Variant8270, - Variant8271, - Variant8272, - Variant8273, - Variant8274, - Variant8275, - Variant8276, - Variant8277, - Variant8278, - Variant8279, - Variant8280, - Variant8281, - Variant8282, - Variant8283, - Variant8284, - Variant8285, - Variant8286, - Variant8287, - Variant8288, - Variant8289, - Variant8290, - Variant8291, - Variant8292, - Variant8293, - Variant8294, - Variant8295, - Variant8296, - Variant8297, - Variant8298, - Variant8299, - Variant8300, - Variant8301, - Variant8302, - Variant8303, - Variant8304, - Variant8305, - Variant8306, - Variant8307, - Variant8308, - Variant8309, - Variant8310, - Variant8311, - Variant8312, - Variant8313, - Variant8314, - Variant8315, - Variant8316, - Variant8317, - Variant8318, - Variant8319, - Variant8320, - Variant8321, - Variant8322, - Variant8323, - Variant8324, - Variant8325, - Variant8326, - Variant8327, - Variant8328, - Variant8329, - Variant8330, - Variant8331, - Variant8332, - Variant8333, - Variant8334, - Variant8335, - Variant8336, - Variant8337, - Variant8338, - Variant8339, - Variant8340, - Variant8341, - Variant8342, - Variant8343, - Variant8344, - Variant8345, - Variant8346, - Variant8347, - Variant8348, - Variant8349, - Variant8350, - Variant8351, - Variant8352, - Variant8353, - Variant8354, - Variant8355, - Variant8356, - Variant8357, - Variant8358, - Variant8359, - Variant8360, - Variant8361, - Variant8362, - Variant8363, - Variant8364, - Variant8365, - Variant8366, - Variant8367, - Variant8368, - Variant8369, - Variant8370, - Variant8371, - Variant8372, - Variant8373, - Variant8374, - Variant8375, - Variant8376, - Variant8377, - Variant8378, - Variant8379, - Variant8380, - Variant8381, - Variant8382, - Variant8383, - Variant8384, - Variant8385, - Variant8386, - Variant8387, - Variant8388, - Variant8389, - Variant8390, - Variant8391, - Variant8392, - Variant8393, - Variant8394, - Variant8395, - Variant8396, - Variant8397, - Variant8398, - Variant8399, - Variant8400, - Variant8401, - Variant8402, - Variant8403, - Variant8404, - Variant8405, - Variant8406, - Variant8407, - Variant8408, - Variant8409, - Variant8410, - Variant8411, - Variant8412, - Variant8413, - Variant8414, - Variant8415, - Variant8416, - Variant8417, - Variant8418, - Variant8419, - Variant8420, - Variant8421, - Variant8422, - Variant8423, - Variant8424, - Variant8425, - Variant8426, - Variant8427, - Variant8428, - Variant8429, - Variant8430, - Variant8431, - Variant8432, - Variant8433, - Variant8434, - Variant8435, - Variant8436, - Variant8437, - Variant8438, - Variant8439, - Variant8440, - Variant8441, - Variant8442, - Variant8443, - Variant8444, - Variant8445, - Variant8446, - Variant8447, - Variant8448, - Variant8449, - Variant8450, - Variant8451, - Variant8452, - Variant8453, - Variant8454, - Variant8455, - Variant8456, - Variant8457, - Variant8458, - Variant8459, - Variant8460, - Variant8461, - Variant8462, - Variant8463, - Variant8464, - Variant8465, - Variant8466, - Variant8467, - Variant8468, - Variant8469, - Variant8470, - Variant8471, - Variant8472, - Variant8473, - Variant8474, - Variant8475, - Variant8476, - Variant8477, - Variant8478, - Variant8479, - Variant8480, - Variant8481, - Variant8482, - Variant8483, - Variant8484, - Variant8485, - Variant8486, - Variant8487, - Variant8488, - Variant8489, - Variant8490, - Variant8491, - Variant8492, - Variant8493, - Variant8494, - Variant8495, - Variant8496, - Variant8497, - Variant8498, - Variant8499, - Variant8500, - Variant8501, - Variant8502, - Variant8503, - Variant8504, - Variant8505, - Variant8506, - Variant8507, - Variant8508, - Variant8509, - Variant8510, - Variant8511, - Variant8512, - Variant8513, - Variant8514, - Variant8515, - Variant8516, - Variant8517, - Variant8518, - Variant8519, - Variant8520, - Variant8521, - Variant8522, - Variant8523, - Variant8524, - Variant8525, - Variant8526, - Variant8527, - Variant8528, - Variant8529, - Variant8530, - Variant8531, - Variant8532, - Variant8533, - Variant8534, - Variant8535, - Variant8536, - Variant8537, - Variant8538, - Variant8539, - Variant8540, - Variant8541, - Variant8542, - Variant8543, - Variant8544, - Variant8545, - Variant8546, - Variant8547, - Variant8548, - Variant8549, - Variant8550, - Variant8551, - Variant8552, - Variant8553, - Variant8554, - Variant8555, - Variant8556, - Variant8557, - Variant8558, - Variant8559, - Variant8560, - Variant8561, - Variant8562, - Variant8563, - Variant8564, - Variant8565, - Variant8566, - Variant8567, - Variant8568, - Variant8569, - Variant8570, - Variant8571, - Variant8572, - Variant8573, - Variant8574, - Variant8575, - Variant8576, - Variant8577, - Variant8578, - Variant8579, - Variant8580, - Variant8581, - Variant8582, - Variant8583, - Variant8584, - Variant8585, - Variant8586, - Variant8587, - Variant8588, - Variant8589, - Variant8590, - Variant8591, - Variant8592, - Variant8593, - Variant8594, - Variant8595, - Variant8596, - Variant8597, - Variant8598, - Variant8599, - Variant8600, - Variant8601, - Variant8602, - Variant8603, - Variant8604, - Variant8605, - Variant8606, - Variant8607, - Variant8608, - Variant8609, - Variant8610, - Variant8611, - Variant8612, - Variant8613, - Variant8614, - Variant8615, - Variant8616, - Variant8617, - Variant8618, - Variant8619, - Variant8620, - Variant8621, - Variant8622, - Variant8623, - Variant8624, - Variant8625, - Variant8626, - Variant8627, - Variant8628, - Variant8629, - Variant8630, - Variant8631, - Variant8632, - Variant8633, - Variant8634, - Variant8635, - Variant8636, - Variant8637, - Variant8638, - Variant8639, - Variant8640, - Variant8641, - Variant8642, - Variant8643, - Variant8644, - Variant8645, - Variant8646, - Variant8647, - Variant8648, - Variant8649, - Variant8650, - Variant8651, - Variant8652, - Variant8653, - Variant8654, - Variant8655, - Variant8656, - Variant8657, - Variant8658, - Variant8659, - Variant8660, - Variant8661, - Variant8662, - Variant8663, - Variant8664, - Variant8665, - Variant8666, - Variant8667, - Variant8668, - Variant8669, - Variant8670, - Variant8671, - Variant8672, - Variant8673, - Variant8674, - Variant8675, - Variant8676, - Variant8677, - Variant8678, - Variant8679, - Variant8680, - Variant8681, - Variant8682, - Variant8683, - Variant8684, - Variant8685, - Variant8686, - Variant8687, - Variant8688, - Variant8689, - Variant8690, - Variant8691, - Variant8692, - Variant8693, - Variant8694, - Variant8695, - Variant8696, - Variant8697, - Variant8698, - Variant8699, - Variant8700, - Variant8701, - Variant8702, - Variant8703, - Variant8704, - Variant8705, - Variant8706, - Variant8707, - Variant8708, - Variant8709, - Variant8710, - Variant8711, - Variant8712, - Variant8713, - Variant8714, - Variant8715, - Variant8716, - Variant8717, - Variant8718, - Variant8719, - Variant8720, - Variant8721, - Variant8722, - Variant8723, - Variant8724, - Variant8725, - Variant8726, - Variant8727, - Variant8728, - Variant8729, - Variant8730, - Variant8731, - Variant8732, - Variant8733, - Variant8734, - Variant8735, - Variant8736, - Variant8737, - Variant8738, - Variant8739, - Variant8740, - Variant8741, - Variant8742, - Variant8743, - Variant8744, - Variant8745, - Variant8746, - Variant8747, - Variant8748, - Variant8749, - Variant8750, - Variant8751, - Variant8752, - Variant8753, - Variant8754, - Variant8755, - Variant8756, - Variant8757, - Variant8758, - Variant8759, - Variant8760, - Variant8761, - Variant8762, - Variant8763, - Variant8764, - Variant8765, - Variant8766, - Variant8767, - Variant8768, - Variant8769, - Variant8770, - Variant8771, - Variant8772, - Variant8773, - Variant8774, - Variant8775, - Variant8776, - Variant8777, - Variant8778, - Variant8779, - Variant8780, - Variant8781, - Variant8782, - Variant8783, - Variant8784, - Variant8785, - Variant8786, - Variant8787, - Variant8788, - Variant8789, - Variant8790, - Variant8791, - Variant8792, - Variant8793, - Variant8794, - Variant8795, - Variant8796, - Variant8797, - Variant8798, - Variant8799, - Variant8800, - Variant8801, - Variant8802, - Variant8803, - Variant8804, - Variant8805, - Variant8806, - Variant8807, - Variant8808, - Variant8809, - Variant8810, - Variant8811, - Variant8812, - Variant8813, - Variant8814, - Variant8815, - Variant8816, - Variant8817, - Variant8818, - Variant8819, - Variant8820, - Variant8821, - Variant8822, - Variant8823, - Variant8824, - Variant8825, - Variant8826, - Variant8827, - Variant8828, - Variant8829, - Variant8830, - Variant8831, - Variant8832, - Variant8833, - Variant8834, - Variant8835, - Variant8836, - Variant8837, - Variant8838, - Variant8839, - Variant8840, - Variant8841, - Variant8842, - Variant8843, - Variant8844, - Variant8845, - Variant8846, - Variant8847, - Variant8848, - Variant8849, - Variant8850, - Variant8851, - Variant8852, - Variant8853, - Variant8854, - Variant8855, - Variant8856, - Variant8857, - Variant8858, - Variant8859, - Variant8860, - Variant8861, - Variant8862, - Variant8863, - Variant8864, - Variant8865, - Variant8866, - Variant8867, - Variant8868, - Variant8869, - Variant8870, - Variant8871, - Variant8872, - Variant8873, - Variant8874, - Variant8875, - Variant8876, - Variant8877, - Variant8878, - Variant8879, - Variant8880, - Variant8881, - Variant8882, - Variant8883, - Variant8884, - Variant8885, - Variant8886, - Variant8887, - Variant8888, - Variant8889, - Variant8890, - Variant8891, - Variant8892, - Variant8893, - Variant8894, - Variant8895, - Variant8896, - Variant8897, - Variant8898, - Variant8899, - Variant8900, - Variant8901, - Variant8902, - Variant8903, - Variant8904, - Variant8905, - Variant8906, - Variant8907, - Variant8908, - Variant8909, - Variant8910, - Variant8911, - Variant8912, - Variant8913, - Variant8914, - Variant8915, - Variant8916, - Variant8917, - Variant8918, - Variant8919, - Variant8920, - Variant8921, - Variant8922, - Variant8923, - Variant8924, - Variant8925, - Variant8926, - Variant8927, - Variant8928, - Variant8929, - Variant8930, - Variant8931, - Variant8932, - Variant8933, - Variant8934, - Variant8935, - Variant8936, - Variant8937, - Variant8938, - Variant8939, - Variant8940, - Variant8941, - Variant8942, - Variant8943, - Variant8944, - Variant8945, - Variant8946, - Variant8947, - Variant8948, - Variant8949, - Variant8950, - Variant8951, - Variant8952, - Variant8953, - Variant8954, - Variant8955, - Variant8956, - Variant8957, - Variant8958, - Variant8959, - Variant8960, - Variant8961, - Variant8962, - Variant8963, - Variant8964, - Variant8965, - Variant8966, - Variant8967, - Variant8968, - Variant8969, - Variant8970, - Variant8971, - Variant8972, - Variant8973, - Variant8974, - Variant8975, - Variant8976, - Variant8977, - Variant8978, - Variant8979, - Variant8980, - Variant8981, - Variant8982, - Variant8983, - Variant8984, - Variant8985, - Variant8986, - Variant8987, - Variant8988, - Variant8989, - Variant8990, - Variant8991, - Variant8992, - Variant8993, - Variant8994, - Variant8995, - Variant8996, - Variant8997, - Variant8998, - Variant8999, - Variant9000, - Variant9001, - Variant9002, - Variant9003, - Variant9004, - Variant9005, - Variant9006, - Variant9007, - Variant9008, - Variant9009, - Variant9010, - Variant9011, - Variant9012, - Variant9013, - Variant9014, - Variant9015, - Variant9016, - Variant9017, - Variant9018, - Variant9019, - Variant9020, - Variant9021, - Variant9022, - Variant9023, - Variant9024, - Variant9025, - Variant9026, - Variant9027, - Variant9028, - Variant9029, - Variant9030, - Variant9031, - Variant9032, - Variant9033, - Variant9034, - Variant9035, - Variant9036, - Variant9037, - Variant9038, - Variant9039, - Variant9040, - Variant9041, - Variant9042, - Variant9043, - Variant9044, - Variant9045, - Variant9046, - Variant9047, - Variant9048, - Variant9049, - Variant9050, - Variant9051, - Variant9052, - Variant9053, - Variant9054, - Variant9055, - Variant9056, - Variant9057, - Variant9058, - Variant9059, - Variant9060, - Variant9061, - Variant9062, - Variant9063, - Variant9064, - Variant9065, - Variant9066, - Variant9067, - Variant9068, - Variant9069, - Variant9070, - Variant9071, - Variant9072, - Variant9073, - Variant9074, - Variant9075, - Variant9076, - Variant9077, - Variant9078, - Variant9079, - Variant9080, - Variant9081, - Variant9082, - Variant9083, - Variant9084, - Variant9085, - Variant9086, - Variant9087, - Variant9088, - Variant9089, - Variant9090, - Variant9091, - Variant9092, - Variant9093, - Variant9094, - Variant9095, - Variant9096, - Variant9097, - Variant9098, - Variant9099, - Variant9100, - Variant9101, - Variant9102, - Variant9103, - Variant9104, - Variant9105, - Variant9106, - Variant9107, - Variant9108, - Variant9109, - Variant9110, - Variant9111, - Variant9112, - Variant9113, - Variant9114, - Variant9115, - Variant9116, - Variant9117, - Variant9118, - Variant9119, - Variant9120, - Variant9121, - Variant9122, - Variant9123, - Variant9124, - Variant9125, - Variant9126, - Variant9127, - Variant9128, - Variant9129, - Variant9130, - Variant9131, - Variant9132, - Variant9133, - Variant9134, - Variant9135, - Variant9136, - Variant9137, - Variant9138, - Variant9139, - Variant9140, - Variant9141, - Variant9142, - Variant9143, - Variant9144, - Variant9145, - Variant9146, - Variant9147, - Variant9148, - Variant9149, - Variant9150, - Variant9151, - Variant9152, - Variant9153, - Variant9154, - Variant9155, - Variant9156, - Variant9157, - Variant9158, - Variant9159, - Variant9160, - Variant9161, - Variant9162, - Variant9163, - Variant9164, - Variant9165, - Variant9166, - Variant9167, - Variant9168, - Variant9169, - Variant9170, - Variant9171, - Variant9172, - Variant9173, - Variant9174, - Variant9175, - Variant9176, - Variant9177, - Variant9178, - Variant9179, - Variant9180, - Variant9181, - Variant9182, - Variant9183, - Variant9184, - Variant9185, - Variant9186, - Variant9187, - Variant9188, - Variant9189, - Variant9190, - Variant9191, - Variant9192, - Variant9193, - Variant9194, - Variant9195, - Variant9196, - Variant9197, - Variant9198, - Variant9199, - Variant9200, - Variant9201, - Variant9202, - Variant9203, - Variant9204, - Variant9205, - Variant9206, - Variant9207, - Variant9208, - Variant9209, - Variant9210, - Variant9211, - Variant9212, - Variant9213, - Variant9214, - Variant9215, - Variant9216, - Variant9217, - Variant9218, - Variant9219, - Variant9220, - Variant9221, - Variant9222, - Variant9223, - Variant9224, - Variant9225, - Variant9226, - Variant9227, - Variant9228, - Variant9229, - Variant9230, - Variant9231, - Variant9232, - Variant9233, - Variant9234, - Variant9235, - Variant9236, - Variant9237, - Variant9238, - Variant9239, - Variant9240, - Variant9241, - Variant9242, - Variant9243, - Variant9244, - Variant9245, - Variant9246, - Variant9247, - Variant9248, - Variant9249, - Variant9250, - Variant9251, - Variant9252, - Variant9253, - Variant9254, - Variant9255, - Variant9256, - Variant9257, - Variant9258, - Variant9259, - Variant9260, - Variant9261, - Variant9262, - Variant9263, - Variant9264, - Variant9265, - Variant9266, - Variant9267, - Variant9268, - Variant9269, - Variant9270, - Variant9271, - Variant9272, - Variant9273, - Variant9274, - Variant9275, - Variant9276, - Variant9277, - Variant9278, - Variant9279, - Variant9280, - Variant9281, - Variant9282, - Variant9283, - Variant9284, - Variant9285, - Variant9286, - Variant9287, - Variant9288, - Variant9289, - Variant9290, - Variant9291, - Variant9292, - Variant9293, - Variant9294, - Variant9295, - Variant9296, - Variant9297, - Variant9298, - Variant9299, - Variant9300, - Variant9301, - Variant9302, - Variant9303, - Variant9304, - Variant9305, - Variant9306, - Variant9307, - Variant9308, - Variant9309, - Variant9310, - Variant9311, - Variant9312, - Variant9313, - Variant9314, - Variant9315, - Variant9316, - Variant9317, - Variant9318, - Variant9319, - Variant9320, - Variant9321, - Variant9322, - Variant9323, - Variant9324, - Variant9325, - Variant9326, - Variant9327, - Variant9328, - Variant9329, - Variant9330, - Variant9331, - Variant9332, - Variant9333, - Variant9334, - Variant9335, - Variant9336, - Variant9337, - Variant9338, - Variant9339, - Variant9340, - Variant9341, - Variant9342, - Variant9343, - Variant9344, - Variant9345, - Variant9346, - Variant9347, - Variant9348, - Variant9349, - Variant9350, - Variant9351, - Variant9352, - Variant9353, - Variant9354, - Variant9355, - Variant9356, - Variant9357, - Variant9358, - Variant9359, - Variant9360, - Variant9361, - Variant9362, - Variant9363, - Variant9364, - Variant9365, - Variant9366, - Variant9367, - Variant9368, - Variant9369, - Variant9370, - Variant9371, - Variant9372, - Variant9373, - Variant9374, - Variant9375, - Variant9376, - Variant9377, - Variant9378, - Variant9379, - Variant9380, - Variant9381, - Variant9382, - Variant9383, - Variant9384, - Variant9385, - Variant9386, - Variant9387, - Variant9388, - Variant9389, - Variant9390, - Variant9391, - Variant9392, - Variant9393, - Variant9394, - Variant9395, - Variant9396, - Variant9397, - Variant9398, - Variant9399, - Variant9400, - Variant9401, - Variant9402, - Variant9403, - Variant9404, - Variant9405, - Variant9406, - Variant9407, - Variant9408, - Variant9409, - Variant9410, - Variant9411, - Variant9412, - Variant9413, - Variant9414, - Variant9415, - Variant9416, - Variant9417, - Variant9418, - Variant9419, - Variant9420, - Variant9421, - Variant9422, - Variant9423, - Variant9424, - Variant9425, - Variant9426, - Variant9427, - Variant9428, - Variant9429, - Variant9430, - Variant9431, - Variant9432, - Variant9433, - Variant9434, - Variant9435, - Variant9436, - Variant9437, - Variant9438, - Variant9439, - Variant9440, - Variant9441, - Variant9442, - Variant9443, - Variant9444, - Variant9445, - Variant9446, - Variant9447, - Variant9448, - Variant9449, - Variant9450, - Variant9451, - Variant9452, - Variant9453, - Variant9454, - Variant9455, - Variant9456, - Variant9457, - Variant9458, - Variant9459, - Variant9460, - Variant9461, - Variant9462, - Variant9463, - Variant9464, - Variant9465, - Variant9466, - Variant9467, - Variant9468, - Variant9469, - Variant9470, - Variant9471, - Variant9472, - Variant9473, - Variant9474, - Variant9475, - Variant9476, - Variant9477, - Variant9478, - Variant9479, - Variant9480, - Variant9481, - Variant9482, - Variant9483, - Variant9484, - Variant9485, - Variant9486, - Variant9487, - Variant9488, - Variant9489, - Variant9490, - Variant9491, - Variant9492, - Variant9493, - Variant9494, - Variant9495, - Variant9496, - Variant9497, - Variant9498, - Variant9499, - Variant9500, - Variant9501, - Variant9502, - Variant9503, - Variant9504, - Variant9505, - Variant9506, - Variant9507, - Variant9508, - Variant9509, - Variant9510, - Variant9511, - Variant9512, - Variant9513, - Variant9514, - Variant9515, - Variant9516, - Variant9517, - Variant9518, - Variant9519, - Variant9520, - Variant9521, - Variant9522, - Variant9523, - Variant9524, - Variant9525, - Variant9526, - Variant9527, - Variant9528, - Variant9529, - Variant9530, - Variant9531, - Variant9532, - Variant9533, - Variant9534, - Variant9535, - Variant9536, - Variant9537, - Variant9538, - Variant9539, - Variant9540, - Variant9541, - Variant9542, - Variant9543, - Variant9544, - Variant9545, - Variant9546, - Variant9547, - Variant9548, - Variant9549, - Variant9550, - Variant9551, - Variant9552, - Variant9553, - Variant9554, - Variant9555, - Variant9556, - Variant9557, - Variant9558, - Variant9559, - Variant9560, - Variant9561, - Variant9562, - Variant9563, - Variant9564, - Variant9565, - Variant9566, - Variant9567, - Variant9568, - Variant9569, - Variant9570, - Variant9571, - Variant9572, - Variant9573, - Variant9574, - Variant9575, - Variant9576, - Variant9577, - Variant9578, - Variant9579, - Variant9580, - Variant9581, - Variant9582, - Variant9583, - Variant9584, - Variant9585, - Variant9586, - Variant9587, - Variant9588, - Variant9589, - Variant9590, - Variant9591, - Variant9592, - Variant9593, - Variant9594, - Variant9595, - Variant9596, - Variant9597, - Variant9598, - Variant9599, - Variant9600, - Variant9601, - Variant9602, - Variant9603, - Variant9604, - Variant9605, - Variant9606, - Variant9607, - Variant9608, - Variant9609, - Variant9610, - Variant9611, - Variant9612, - Variant9613, - Variant9614, - Variant9615, - Variant9616, - Variant9617, - Variant9618, - Variant9619, - Variant9620, - Variant9621, - Variant9622, - Variant9623, - Variant9624, - Variant9625, - Variant9626, - Variant9627, - Variant9628, - Variant9629, - Variant9630, - Variant9631, - Variant9632, - Variant9633, - Variant9634, - Variant9635, - Variant9636, - Variant9637, - Variant9638, - Variant9639, - Variant9640, - Variant9641, - Variant9642, - Variant9643, - Variant9644, - Variant9645, - Variant9646, - Variant9647, - Variant9648, - Variant9649, - Variant9650, - Variant9651, - Variant9652, - Variant9653, - Variant9654, - Variant9655, - Variant9656, - Variant9657, - Variant9658, - Variant9659, - Variant9660, - Variant9661, - Variant9662, - Variant9663, - Variant9664, - Variant9665, - Variant9666, - Variant9667, - Variant9668, - Variant9669, - Variant9670, - Variant9671, - Variant9672, - Variant9673, - Variant9674, - Variant9675, - Variant9676, - Variant9677, - Variant9678, - Variant9679, - Variant9680, - Variant9681, - Variant9682, - Variant9683, - Variant9684, - Variant9685, - Variant9686, - Variant9687, - Variant9688, - Variant9689, - Variant9690, - Variant9691, - Variant9692, - Variant9693, - Variant9694, - Variant9695, - Variant9696, - Variant9697, - Variant9698, - Variant9699, - Variant9700, - Variant9701, - Variant9702, - Variant9703, - Variant9704, - Variant9705, - Variant9706, - Variant9707, - Variant9708, - Variant9709, - Variant9710, - Variant9711, - Variant9712, - Variant9713, - Variant9714, - Variant9715, - Variant9716, - Variant9717, - Variant9718, - Variant9719, - Variant9720, - Variant9721, - Variant9722, - Variant9723, - Variant9724, - Variant9725, - Variant9726, - Variant9727, - Variant9728, - Variant9729, - Variant9730, - Variant9731, - Variant9732, - Variant9733, - Variant9734, - Variant9735, - Variant9736, - Variant9737, - Variant9738, - Variant9739, - Variant9740, - Variant9741, - Variant9742, - Variant9743, - Variant9744, - Variant9745, - Variant9746, - Variant9747, - Variant9748, - Variant9749, - Variant9750, - Variant9751, - Variant9752, - Variant9753, - Variant9754, - Variant9755, - Variant9756, - Variant9757, - Variant9758, - Variant9759, - Variant9760, - Variant9761, - Variant9762, - Variant9763, - Variant9764, - Variant9765, - Variant9766, - Variant9767, - Variant9768, - Variant9769, - Variant9770, - Variant9771, - Variant9772, - Variant9773, - Variant9774, - Variant9775, - Variant9776, - Variant9777, - Variant9778, - Variant9779, - Variant9780, - Variant9781, - Variant9782, - Variant9783, - Variant9784, - Variant9785, - Variant9786, - Variant9787, - Variant9788, - Variant9789, - Variant9790, - Variant9791, - Variant9792, - Variant9793, - Variant9794, - Variant9795, - Variant9796, - Variant9797, - Variant9798, - Variant9799, - Variant9800, - Variant9801, - Variant9802, - Variant9803, - Variant9804, - Variant9805, - Variant9806, - Variant9807, - Variant9808, - Variant9809, - Variant9810, - Variant9811, - Variant9812, - Variant9813, - Variant9814, - Variant9815, - Variant9816, - Variant9817, - Variant9818, - Variant9819, - Variant9820, - Variant9821, - Variant9822, - Variant9823, - Variant9824, - Variant9825, - Variant9826, - Variant9827, - Variant9828, - Variant9829, - Variant9830, - Variant9831, - Variant9832, - Variant9833, - Variant9834, - Variant9835, - Variant9836, - Variant9837, - Variant9838, - Variant9839, - Variant9840, - Variant9841, - Variant9842, - Variant9843, - Variant9844, - Variant9845, - Variant9846, - Variant9847, - Variant9848, - Variant9849, - Variant9850, - Variant9851, - Variant9852, - Variant9853, - Variant9854, - Variant9855, - Variant9856, - Variant9857, - Variant9858, - Variant9859, - Variant9860, - Variant9861, - Variant9862, - Variant9863, - Variant9864, - Variant9865, - Variant9866, - Variant9867, - Variant9868, - Variant9869, - Variant9870, - Variant9871, - Variant9872, - Variant9873, - Variant9874, - Variant9875, - Variant9876, - Variant9877, - Variant9878, - Variant9879, - Variant9880, - Variant9881, - Variant9882, - Variant9883, - Variant9884, - Variant9885, - Variant9886, - Variant9887, - Variant9888, - Variant9889, - Variant9890, - Variant9891, - Variant9892, - Variant9893, - Variant9894, - Variant9895, - Variant9896, - Variant9897, - Variant9898, - Variant9899, - Variant9900, - Variant9901, - Variant9902, - Variant9903, - Variant9904, - Variant9905, - Variant9906, - Variant9907, - Variant9908, - Variant9909, - Variant9910, - Variant9911, - Variant9912, - Variant9913, - Variant9914, - Variant9915, - Variant9916, - Variant9917, - Variant9918, - Variant9919, - Variant9920, - Variant9921, - Variant9922, - Variant9923, - Variant9924, - Variant9925, - Variant9926, - Variant9927, - Variant9928, - Variant9929, - Variant9930, - Variant9931, - Variant9932, - Variant9933, - Variant9934, - Variant9935, - Variant9936, - Variant9937, - Variant9938, - Variant9939, - Variant9940, - Variant9941, - Variant9942, - Variant9943, - Variant9944, - Variant9945, - Variant9946, - Variant9947, - Variant9948, - Variant9949, - Variant9950, - Variant9951, - Variant9952, - Variant9953, - Variant9954, - Variant9955, - Variant9956, - Variant9957, - Variant9958, - Variant9959, - Variant9960, - Variant9961, - Variant9962, - Variant9963, - Variant9964, - Variant9965, - Variant9966, - Variant9967, - Variant9968, - Variant9969, - Variant9970, - Variant9971, - Variant9972, - Variant9973, - Variant9974, - Variant9975, - Variant9976, - Variant9977, - Variant9978, - Variant9979, - Variant9980, - Variant9981, - Variant9982, - Variant9983, - Variant9984, - Variant9985, - Variant9986, - Variant9987, - Variant9988, - Variant9989, - Variant9990, - Variant9991, - Variant9992, - Variant9993, - Variant9994, - Variant9995, - Variant9996, - Variant9997, - Variant9998, - Variant9999, - Variant10000, - Variant10001, - Variant10002, - Variant10003, - Variant10004, - Variant10005, - Variant10006, - Variant10007, - Variant10008, - Variant10009, - Variant10010, - Variant10011, - Variant10012, - Variant10013, - Variant10014, - Variant10015, - Variant10016, - Variant10017, - Variant10018, - Variant10019, - Variant10020, - Variant10021, - Variant10022, - Variant10023, - Variant10024, - Variant10025, - Variant10026, - Variant10027, - Variant10028, - Variant10029, - Variant10030, - Variant10031, - Variant10032, - Variant10033, - Variant10034, - Variant10035, - Variant10036, - Variant10037, - Variant10038, - Variant10039, - Variant10040, - Variant10041, - Variant10042, - Variant10043, - Variant10044, - Variant10045, - Variant10046, - Variant10047, - Variant10048, - Variant10049, - Variant10050, - Variant10051, - Variant10052, - Variant10053, - Variant10054, - Variant10055, - Variant10056, - Variant10057, - Variant10058, - Variant10059, - Variant10060, - Variant10061, - Variant10062, - Variant10063, - Variant10064, - Variant10065, - Variant10066, - Variant10067, - Variant10068, - Variant10069, - Variant10070, - Variant10071, - Variant10072, - Variant10073, - Variant10074, - Variant10075, - Variant10076, - Variant10077, - Variant10078, - Variant10079, - Variant10080, - Variant10081, - Variant10082, - Variant10083, - Variant10084, - Variant10085, - Variant10086, - Variant10087, - Variant10088, - Variant10089, - Variant10090, - Variant10091, - Variant10092, - Variant10093, - Variant10094, - Variant10095, - Variant10096, - Variant10097, - Variant10098, - Variant10099, - Variant10100, - Variant10101, - Variant10102, - Variant10103, - Variant10104, - Variant10105, - Variant10106, - Variant10107, - Variant10108, - Variant10109, - Variant10110, - Variant10111, - Variant10112, - Variant10113, - Variant10114, - Variant10115, - Variant10116, - Variant10117, - Variant10118, - Variant10119, - Variant10120, - Variant10121, - Variant10122, - Variant10123, - Variant10124, - Variant10125, - Variant10126, - Variant10127, - Variant10128, - Variant10129, - Variant10130, - Variant10131, - Variant10132, - Variant10133, - Variant10134, - Variant10135, - Variant10136, - Variant10137, - Variant10138, - Variant10139, - Variant10140, - Variant10141, - Variant10142, - Variant10143, - Variant10144, - Variant10145, - Variant10146, - Variant10147, - Variant10148, - Variant10149, - Variant10150, - Variant10151, - Variant10152, - Variant10153, - Variant10154, - Variant10155, - Variant10156, - Variant10157, - Variant10158, - Variant10159, - Variant10160, - Variant10161, - Variant10162, - Variant10163, - Variant10164, - Variant10165, - Variant10166, - Variant10167, - Variant10168, - Variant10169, - Variant10170, - Variant10171, - Variant10172, - Variant10173, - Variant10174, - Variant10175, - Variant10176, - Variant10177, - Variant10178, - Variant10179, - Variant10180, - Variant10181, - Variant10182, - Variant10183, - Variant10184, - Variant10185, - Variant10186, - Variant10187, - Variant10188, - Variant10189, - Variant10190, - Variant10191, - Variant10192, - Variant10193, - Variant10194, - Variant10195, - Variant10196, - Variant10197, - Variant10198, - Variant10199, - Variant10200, - Variant10201, - Variant10202, - Variant10203, - Variant10204, - Variant10205, - Variant10206, - Variant10207, - Variant10208, - Variant10209, - Variant10210, - Variant10211, - Variant10212, - Variant10213, - Variant10214, - Variant10215, - Variant10216, - Variant10217, - Variant10218, - Variant10219, - Variant10220, - Variant10221, - Variant10222, - Variant10223, - Variant10224, - Variant10225, - Variant10226, - Variant10227, - Variant10228, - Variant10229, - Variant10230, - Variant10231, - Variant10232, - Variant10233, - Variant10234, - Variant10235, - Variant10236, - Variant10237, - Variant10238, - Variant10239, - Variant10240, - Variant10241, - Variant10242, - Variant10243, - Variant10244, - Variant10245, - Variant10246, - Variant10247, - Variant10248, - Variant10249, - Variant10250, - Variant10251, - Variant10252, - Variant10253, - Variant10254, - Variant10255, - Variant10256, - Variant10257, - Variant10258, - Variant10259, - Variant10260, - Variant10261, - Variant10262, - Variant10263, - Variant10264, - Variant10265, - Variant10266, - Variant10267, - Variant10268, - Variant10269, - Variant10270, - Variant10271, - Variant10272, - Variant10273, - Variant10274, - Variant10275, - Variant10276, - Variant10277, - Variant10278, - Variant10279, - Variant10280, - Variant10281, - Variant10282, - Variant10283, - Variant10284, - Variant10285, - Variant10286, - Variant10287, - Variant10288, - Variant10289, - Variant10290, - Variant10291, - Variant10292, - Variant10293, - Variant10294, - Variant10295, - Variant10296, - Variant10297, - Variant10298, - Variant10299, - Variant10300, - Variant10301, - Variant10302, - Variant10303, - Variant10304, - Variant10305, - Variant10306, - Variant10307, - Variant10308, - Variant10309, - Variant10310, - Variant10311, - Variant10312, - Variant10313, - Variant10314, - Variant10315, - Variant10316, - Variant10317, - Variant10318, - Variant10319, - Variant10320, - Variant10321, - Variant10322, - Variant10323, - Variant10324, - Variant10325, - Variant10326, - Variant10327, - Variant10328, - Variant10329, - Variant10330, - Variant10331, - Variant10332, - Variant10333, - Variant10334, - Variant10335, - Variant10336, - Variant10337, - Variant10338, - Variant10339, - Variant10340, - Variant10341, - Variant10342, - Variant10343, - Variant10344, - Variant10345, - Variant10346, - Variant10347, - Variant10348, - Variant10349, - Variant10350, - Variant10351, - Variant10352, - Variant10353, - Variant10354, - Variant10355, - Variant10356, - Variant10357, - Variant10358, - Variant10359, - Variant10360, - Variant10361, - Variant10362, - Variant10363, - Variant10364, - Variant10365, - Variant10366, - Variant10367, - Variant10368, - Variant10369, - Variant10370, - Variant10371, - Variant10372, - Variant10373, - Variant10374, - Variant10375, - Variant10376, - Variant10377, - Variant10378, - Variant10379, - Variant10380, - Variant10381, - Variant10382, - Variant10383, - Variant10384, - Variant10385, - Variant10386, - Variant10387, - Variant10388, - Variant10389, - Variant10390, - Variant10391, - Variant10392, - Variant10393, - Variant10394, - Variant10395, - Variant10396, - Variant10397, - Variant10398, - Variant10399, - Variant10400, - Variant10401, - Variant10402, - Variant10403, - Variant10404, - Variant10405, - Variant10406, - Variant10407, - Variant10408, - Variant10409, - Variant10410, - Variant10411, - Variant10412, - Variant10413, - Variant10414, - Variant10415, - Variant10416, - Variant10417, - Variant10418, - Variant10419, - Variant10420, - Variant10421, - Variant10422, - Variant10423, - Variant10424, - Variant10425, - Variant10426, - Variant10427, - Variant10428, - Variant10429, - Variant10430, - Variant10431, - Variant10432, - Variant10433, - Variant10434, - Variant10435, - Variant10436, - Variant10437, - Variant10438, - Variant10439, - Variant10440, - Variant10441, - Variant10442, - Variant10443, - Variant10444, - Variant10445, - Variant10446, - Variant10447, - Variant10448, - Variant10449, - Variant10450, - Variant10451, - Variant10452, - Variant10453, - Variant10454, - Variant10455, - Variant10456, - Variant10457, - Variant10458, - Variant10459, - Variant10460, - Variant10461, - Variant10462, - Variant10463, - Variant10464, - Variant10465, - Variant10466, - Variant10467, - Variant10468, - Variant10469, - Variant10470, - Variant10471, - Variant10472, - Variant10473, - Variant10474, - Variant10475, - Variant10476, - Variant10477, - Variant10478, - Variant10479, - Variant10480, - Variant10481, - Variant10482, - Variant10483, - Variant10484, - Variant10485, - Variant10486, - Variant10487, - Variant10488, - Variant10489, - Variant10490, - Variant10491, - Variant10492, - Variant10493, - Variant10494, - Variant10495, - Variant10496, - Variant10497, - Variant10498, - Variant10499, - Variant10500, - Variant10501, - Variant10502, - Variant10503, - Variant10504, - Variant10505, - Variant10506, - Variant10507, - Variant10508, - Variant10509, - Variant10510, - Variant10511, - Variant10512, - Variant10513, - Variant10514, - Variant10515, - Variant10516, - Variant10517, - Variant10518, - Variant10519, - Variant10520, - Variant10521, - Variant10522, - Variant10523, - Variant10524, - Variant10525, - Variant10526, - Variant10527, - Variant10528, - Variant10529, - Variant10530, - Variant10531, - Variant10532, - Variant10533, - Variant10534, - Variant10535, - Variant10536, - Variant10537, - Variant10538, - Variant10539, - Variant10540, - Variant10541, - Variant10542, - Variant10543, - Variant10544, - Variant10545, - Variant10546, - Variant10547, - Variant10548, - Variant10549, - Variant10550, - Variant10551, - Variant10552, - Variant10553, - Variant10554, - Variant10555, - Variant10556, - Variant10557, - Variant10558, - Variant10559, - Variant10560, - Variant10561, - Variant10562, - Variant10563, - Variant10564, - Variant10565, - Variant10566, - Variant10567, - Variant10568, - Variant10569, - Variant10570, - Variant10571, - Variant10572, - Variant10573, - Variant10574, - Variant10575, - Variant10576, - Variant10577, - Variant10578, - Variant10579, - Variant10580, - Variant10581, - Variant10582, - Variant10583, - Variant10584, - Variant10585, - Variant10586, - Variant10587, - Variant10588, - Variant10589, - Variant10590, - Variant10591, - Variant10592, - Variant10593, - Variant10594, - Variant10595, - Variant10596, - Variant10597, - Variant10598, - Variant10599, - Variant10600, - Variant10601, - Variant10602, - Variant10603, - Variant10604, - Variant10605, - Variant10606, - Variant10607, - Variant10608, - Variant10609, - Variant10610, - Variant10611, - Variant10612, - Variant10613, - Variant10614, - Variant10615, - Variant10616, - Variant10617, - Variant10618, - Variant10619, - Variant10620, - Variant10621, - Variant10622, - Variant10623, - Variant10624, - Variant10625, - Variant10626, - Variant10627, - Variant10628, - Variant10629, - Variant10630, - Variant10631, - Variant10632, - Variant10633, - Variant10634, - Variant10635, - Variant10636, - Variant10637, - Variant10638, - Variant10639, - Variant10640, - Variant10641, - Variant10642, - Variant10643, - Variant10644, - Variant10645, - Variant10646, - Variant10647, - Variant10648, - Variant10649, - Variant10650, - Variant10651, - Variant10652, - Variant10653, - Variant10654, - Variant10655, - Variant10656, - Variant10657, - Variant10658, - Variant10659, - Variant10660, - Variant10661, - Variant10662, - Variant10663, - Variant10664, - Variant10665, - Variant10666, - Variant10667, - Variant10668, - Variant10669, - Variant10670, - Variant10671, - Variant10672, - Variant10673, - Variant10674, - Variant10675, - Variant10676, - Variant10677, - Variant10678, - Variant10679, - Variant10680, - Variant10681, - Variant10682, - Variant10683, - Variant10684, - Variant10685, - Variant10686, - Variant10687, - Variant10688, - Variant10689, - Variant10690, - Variant10691, - Variant10692, - Variant10693, - Variant10694, - Variant10695, - Variant10696, - Variant10697, - Variant10698, - Variant10699, - Variant10700, - Variant10701, - Variant10702, - Variant10703, - Variant10704, - Variant10705, - Variant10706, - Variant10707, - Variant10708, - Variant10709, - Variant10710, - Variant10711, - Variant10712, - Variant10713, - Variant10714, - Variant10715, - Variant10716, - Variant10717, - Variant10718, - Variant10719, - Variant10720, - Variant10721, - Variant10722, - Variant10723, - Variant10724, - Variant10725, - Variant10726, - Variant10727, - Variant10728, - Variant10729, - Variant10730, - Variant10731, - Variant10732, - Variant10733, - Variant10734, - Variant10735, - Variant10736, - Variant10737, - Variant10738, - Variant10739, - Variant10740, - Variant10741, - Variant10742, - Variant10743, - Variant10744, - Variant10745, - Variant10746, - Variant10747, - Variant10748, - Variant10749, - Variant10750, - Variant10751, - Variant10752, - Variant10753, - Variant10754, - Variant10755, - Variant10756, - Variant10757, - Variant10758, - Variant10759, - Variant10760, - Variant10761, - Variant10762, - Variant10763, - Variant10764, - Variant10765, - Variant10766, - Variant10767, - Variant10768, - Variant10769, - Variant10770, - Variant10771, - Variant10772, - Variant10773, - Variant10774, - Variant10775, - Variant10776, - Variant10777, - Variant10778, - Variant10779, - Variant10780, - Variant10781, - Variant10782, - Variant10783, - Variant10784, - Variant10785, - Variant10786, - Variant10787, - Variant10788, - Variant10789, - Variant10790, - Variant10791, - Variant10792, - Variant10793, - Variant10794, - Variant10795, - Variant10796, - Variant10797, - Variant10798, - Variant10799, - Variant10800, - Variant10801, - Variant10802, - Variant10803, - Variant10804, - Variant10805, - Variant10806, - Variant10807, - Variant10808, - Variant10809, - Variant10810, - Variant10811, - Variant10812, - Variant10813, - Variant10814, - Variant10815, - Variant10816, - Variant10817, - Variant10818, - Variant10819, - Variant10820, - Variant10821, - Variant10822, - Variant10823, - Variant10824, - Variant10825, - Variant10826, - Variant10827, - Variant10828, - Variant10829, - Variant10830, - Variant10831, - Variant10832, - Variant10833, - Variant10834, - Variant10835, - Variant10836, - Variant10837, - Variant10838, - Variant10839, - Variant10840, - Variant10841, - Variant10842, - Variant10843, - Variant10844, - Variant10845, - Variant10846, - Variant10847, - Variant10848, - Variant10849, - Variant10850, - Variant10851, - Variant10852, - Variant10853, - Variant10854, - Variant10855, - Variant10856, - Variant10857, - Variant10858, - Variant10859, - Variant10860, - Variant10861, - Variant10862, - Variant10863, - Variant10864, - Variant10865, - Variant10866, - Variant10867, - Variant10868, - Variant10869, - Variant10870, - Variant10871, - Variant10872, - Variant10873, - Variant10874, - Variant10875, - Variant10876, - Variant10877, - Variant10878, - Variant10879, - Variant10880, - Variant10881, - Variant10882, - Variant10883, - Variant10884, - Variant10885, - Variant10886, - Variant10887, - Variant10888, - Variant10889, - Variant10890, - Variant10891, - Variant10892, - Variant10893, - Variant10894, - Variant10895, - Variant10896, - Variant10897, - Variant10898, - Variant10899, - Variant10900, - Variant10901, - Variant10902, - Variant10903, - Variant10904, - Variant10905, - Variant10906, - Variant10907, - Variant10908, - Variant10909, - Variant10910, - Variant10911, - Variant10912, - Variant10913, - Variant10914, - Variant10915, - Variant10916, - Variant10917, - Variant10918, - Variant10919, - Variant10920, - Variant10921, - Variant10922, - Variant10923, - Variant10924, - Variant10925, - Variant10926, - Variant10927, - Variant10928, - Variant10929, - Variant10930, - Variant10931, - Variant10932, - Variant10933, - Variant10934, - Variant10935, - Variant10936, - Variant10937, - Variant10938, - Variant10939, - Variant10940, - Variant10941, - Variant10942, - Variant10943, - Variant10944, - Variant10945, - Variant10946, - Variant10947, - Variant10948, - Variant10949, - Variant10950, - Variant10951, - Variant10952, - Variant10953, - Variant10954, - Variant10955, - Variant10956, - Variant10957, - Variant10958, - Variant10959, - Variant10960, - Variant10961, - Variant10962, - Variant10963, - Variant10964, - Variant10965, - Variant10966, - Variant10967, - Variant10968, - Variant10969, - Variant10970, - Variant10971, - Variant10972, - Variant10973, - Variant10974, - Variant10975, - Variant10976, - Variant10977, - Variant10978, - Variant10979, - Variant10980, - Variant10981, - Variant10982, - Variant10983, - Variant10984, - Variant10985, - Variant10986, - Variant10987, - Variant10988, - Variant10989, - Variant10990, - Variant10991, - Variant10992, - Variant10993, - Variant10994, - Variant10995, - Variant10996, - Variant10997, - Variant10998, - Variant10999, - Variant11000, - Variant11001, - Variant11002, - Variant11003, - Variant11004, - Variant11005, - Variant11006, - Variant11007, - Variant11008, - Variant11009, - Variant11010, - Variant11011, - Variant11012, - Variant11013, - Variant11014, - Variant11015, - Variant11016, - Variant11017, - Variant11018, - Variant11019, - Variant11020, - Variant11021, - Variant11022, - Variant11023, - Variant11024, - Variant11025, - Variant11026, - Variant11027, - Variant11028, - Variant11029, - Variant11030, - Variant11031, - Variant11032, - Variant11033, - Variant11034, - Variant11035, - Variant11036, - Variant11037, - Variant11038, - Variant11039, - Variant11040, - Variant11041, - Variant11042, - Variant11043, - Variant11044, - Variant11045, - Variant11046, - Variant11047, - Variant11048, - Variant11049, - Variant11050, - Variant11051, - Variant11052, - Variant11053, - Variant11054, - Variant11055, - Variant11056, - Variant11057, - Variant11058, - Variant11059, - Variant11060, - Variant11061, - Variant11062, - Variant11063, - Variant11064, - Variant11065, - Variant11066, - Variant11067, - Variant11068, - Variant11069, - Variant11070, - Variant11071, - Variant11072, - Variant11073, - Variant11074, - Variant11075, - Variant11076, - Variant11077, - Variant11078, - Variant11079, - Variant11080, - Variant11081, - Variant11082, - Variant11083, - Variant11084, - Variant11085, - Variant11086, - Variant11087, - Variant11088, - Variant11089, - Variant11090, - Variant11091, - Variant11092, - Variant11093, - Variant11094, - Variant11095, - Variant11096, - Variant11097, - Variant11098, - Variant11099, - Variant11100, - Variant11101, - Variant11102, - Variant11103, - Variant11104, - Variant11105, - Variant11106, - Variant11107, - Variant11108, - Variant11109, - Variant11110, - Variant11111, - Variant11112, - Variant11113, - Variant11114, - Variant11115, - Variant11116, - Variant11117, - Variant11118, - Variant11119, - Variant11120, - Variant11121, - Variant11122, - Variant11123, - Variant11124, - Variant11125, - Variant11126, - Variant11127, - Variant11128, - Variant11129, - Variant11130, - Variant11131, - Variant11132, - Variant11133, - Variant11134, - Variant11135, - Variant11136, - Variant11137, - Variant11138, - Variant11139, - Variant11140, - Variant11141, - Variant11142, - Variant11143, - Variant11144, - Variant11145, - Variant11146, - Variant11147, - Variant11148, - Variant11149, - Variant11150, - Variant11151, - Variant11152, - Variant11153, - Variant11154, - Variant11155, - Variant11156, - Variant11157, - Variant11158, - Variant11159, - Variant11160, - Variant11161, - Variant11162, - Variant11163, - Variant11164, - Variant11165, - Variant11166, - Variant11167, - Variant11168, - Variant11169, - Variant11170, - Variant11171, - Variant11172, - Variant11173, - Variant11174, - Variant11175, - Variant11176, - Variant11177, - Variant11178, - Variant11179, - Variant11180, - Variant11181, - Variant11182, - Variant11183, - Variant11184, - Variant11185, - Variant11186, - Variant11187, - Variant11188, - Variant11189, - Variant11190, - Variant11191, - Variant11192, - Variant11193, - Variant11194, - Variant11195, - Variant11196, - Variant11197, - Variant11198, - Variant11199, - Variant11200, - Variant11201, - Variant11202, - Variant11203, - Variant11204, - Variant11205, - Variant11206, - Variant11207, - Variant11208, - Variant11209, - Variant11210, - Variant11211, - Variant11212, - Variant11213, - Variant11214, - Variant11215, - Variant11216, - Variant11217, - Variant11218, - Variant11219, - Variant11220, - Variant11221, - Variant11222, - Variant11223, - Variant11224, - Variant11225, - Variant11226, - Variant11227, - Variant11228, - Variant11229, - Variant11230, - Variant11231, - Variant11232, - Variant11233, - Variant11234, - Variant11235, - Variant11236, - Variant11237, - Variant11238, - Variant11239, - Variant11240, - Variant11241, - Variant11242, - Variant11243, - Variant11244, - Variant11245, - Variant11246, - Variant11247, - Variant11248, - Variant11249, - Variant11250, - Variant11251, - Variant11252, - Variant11253, - Variant11254, - Variant11255, - Variant11256, - Variant11257, - Variant11258, - Variant11259, - Variant11260, - Variant11261, - Variant11262, - Variant11263, - Variant11264, - Variant11265, - Variant11266, - Variant11267, - Variant11268, - Variant11269, - Variant11270, - Variant11271, - Variant11272, - Variant11273, - Variant11274, - Variant11275, - Variant11276, - Variant11277, - Variant11278, - Variant11279, - Variant11280, - Variant11281, - Variant11282, - Variant11283, - Variant11284, - Variant11285, - Variant11286, - Variant11287, - Variant11288, - Variant11289, - Variant11290, - Variant11291, - Variant11292, - Variant11293, - Variant11294, - Variant11295, - Variant11296, - Variant11297, - Variant11298, - Variant11299, - Variant11300, - Variant11301, - Variant11302, - Variant11303, - Variant11304, - Variant11305, - Variant11306, - Variant11307, - Variant11308, - Variant11309, - Variant11310, - Variant11311, - Variant11312, - Variant11313, - Variant11314, - Variant11315, - Variant11316, - Variant11317, - Variant11318, - Variant11319, - Variant11320, - Variant11321, - Variant11322, - Variant11323, - Variant11324, - Variant11325, - Variant11326, - Variant11327, - Variant11328, - Variant11329, - Variant11330, - Variant11331, - Variant11332, - Variant11333, - Variant11334, - Variant11335, - Variant11336, - Variant11337, - Variant11338, - Variant11339, - Variant11340, - Variant11341, - Variant11342, - Variant11343, - Variant11344, - Variant11345, - Variant11346, - Variant11347, - Variant11348, - Variant11349, - Variant11350, - Variant11351, - Variant11352, - Variant11353, - Variant11354, - Variant11355, - Variant11356, - Variant11357, - Variant11358, - Variant11359, - Variant11360, - Variant11361, - Variant11362, - Variant11363, - Variant11364, - Variant11365, - Variant11366, - Variant11367, - Variant11368, - Variant11369, - Variant11370, - Variant11371, - Variant11372, - Variant11373, - Variant11374, - Variant11375, - Variant11376, - Variant11377, - Variant11378, - Variant11379, - Variant11380, - Variant11381, - Variant11382, - Variant11383, - Variant11384, - Variant11385, - Variant11386, - Variant11387, - Variant11388, - Variant11389, - Variant11390, - Variant11391, - Variant11392, - Variant11393, - Variant11394, - Variant11395, - Variant11396, - Variant11397, - Variant11398, - Variant11399, - Variant11400, - Variant11401, - Variant11402, - Variant11403, - Variant11404, - Variant11405, - Variant11406, - Variant11407, - Variant11408, - Variant11409, - Variant11410, - Variant11411, - Variant11412, - Variant11413, - Variant11414, - Variant11415, - Variant11416, - Variant11417, - Variant11418, - Variant11419, - Variant11420, - Variant11421, - Variant11422, - Variant11423, - Variant11424, - Variant11425, - Variant11426, - Variant11427, - Variant11428, - Variant11429, - Variant11430, - Variant11431, - Variant11432, - Variant11433, - Variant11434, - Variant11435, - Variant11436, - Variant11437, - Variant11438, - Variant11439, - Variant11440, - Variant11441, - Variant11442, - Variant11443, - Variant11444, - Variant11445, - Variant11446, - Variant11447, - Variant11448, - Variant11449, - Variant11450, - Variant11451, - Variant11452, - Variant11453, - Variant11454, - Variant11455, - Variant11456, - Variant11457, - Variant11458, - Variant11459, - Variant11460, - Variant11461, - Variant11462, - Variant11463, - Variant11464, - Variant11465, - Variant11466, - Variant11467, - Variant11468, - Variant11469, - Variant11470, - Variant11471, - Variant11472, - Variant11473, - Variant11474, - Variant11475, - Variant11476, - Variant11477, - Variant11478, - Variant11479, - Variant11480, - Variant11481, - Variant11482, - Variant11483, - Variant11484, - Variant11485, - Variant11486, - Variant11487, - Variant11488, - Variant11489, - Variant11490, - Variant11491, - Variant11492, - Variant11493, - Variant11494, - Variant11495, - Variant11496, - Variant11497, - Variant11498, - Variant11499, - Variant11500, - Variant11501, - Variant11502, - Variant11503, - Variant11504, - Variant11505, - Variant11506, - Variant11507, - Variant11508, - Variant11509, - Variant11510, - Variant11511, - Variant11512, - Variant11513, - Variant11514, - Variant11515, - Variant11516, - Variant11517, - Variant11518, - Variant11519, - Variant11520, - Variant11521, - Variant11522, - Variant11523, - Variant11524, - Variant11525, - Variant11526, - Variant11527, - Variant11528, - Variant11529, - Variant11530, - Variant11531, - Variant11532, - Variant11533, - Variant11534, - Variant11535, - Variant11536, - Variant11537, - Variant11538, - Variant11539, - Variant11540, - Variant11541, - Variant11542, - Variant11543, - Variant11544, - Variant11545, - Variant11546, - Variant11547, - Variant11548, - Variant11549, - Variant11550, - Variant11551, - Variant11552, - Variant11553, - Variant11554, - Variant11555, - Variant11556, - Variant11557, - Variant11558, - Variant11559, - Variant11560, - Variant11561, - Variant11562, - Variant11563, - Variant11564, - Variant11565, - Variant11566, - Variant11567, - Variant11568, - Variant11569, - Variant11570, - Variant11571, - Variant11572, - Variant11573, - Variant11574, - Variant11575, - Variant11576, - Variant11577, - Variant11578, - Variant11579, - Variant11580, - Variant11581, - Variant11582, - Variant11583, - Variant11584, - Variant11585, - Variant11586, - Variant11587, - Variant11588, - Variant11589, - Variant11590, - Variant11591, - Variant11592, - Variant11593, - Variant11594, - Variant11595, - Variant11596, - Variant11597, - Variant11598, - Variant11599, - Variant11600, - Variant11601, - Variant11602, - Variant11603, - Variant11604, - Variant11605, - Variant11606, - Variant11607, - Variant11608, - Variant11609, - Variant11610, - Variant11611, - Variant11612, - Variant11613, - Variant11614, - Variant11615, - Variant11616, - Variant11617, - Variant11618, - Variant11619, - Variant11620, - Variant11621, - Variant11622, - Variant11623, - Variant11624, - Variant11625, - Variant11626, - Variant11627, - Variant11628, - Variant11629, - Variant11630, - Variant11631, - Variant11632, - Variant11633, - Variant11634, - Variant11635, - Variant11636, - Variant11637, - Variant11638, - Variant11639, - Variant11640, - Variant11641, - Variant11642, - Variant11643, - Variant11644, - Variant11645, - Variant11646, - Variant11647, - Variant11648, - Variant11649, - Variant11650, - Variant11651, - Variant11652, - Variant11653, - Variant11654, - Variant11655, - Variant11656, - Variant11657, - Variant11658, - Variant11659, - Variant11660, - Variant11661, - Variant11662, - Variant11663, - Variant11664, - Variant11665, - Variant11666, - Variant11667, - Variant11668, - Variant11669, - Variant11670, - Variant11671, - Variant11672, - Variant11673, - Variant11674, - Variant11675, - Variant11676, - Variant11677, - Variant11678, - Variant11679, - Variant11680, - Variant11681, - Variant11682, - Variant11683, - Variant11684, - Variant11685, - Variant11686, - Variant11687, - Variant11688, - Variant11689, - Variant11690, - Variant11691, - Variant11692, - Variant11693, - Variant11694, - Variant11695, - Variant11696, - Variant11697, - Variant11698, - Variant11699, - Variant11700, - Variant11701, - Variant11702, - Variant11703, - Variant11704, - Variant11705, - Variant11706, - Variant11707, - Variant11708, - Variant11709, - Variant11710, - Variant11711, - Variant11712, - Variant11713, - Variant11714, - Variant11715, - Variant11716, - Variant11717, - Variant11718, - Variant11719, - Variant11720, - Variant11721, - Variant11722, - Variant11723, - Variant11724, - Variant11725, - Variant11726, - Variant11727, - Variant11728, - Variant11729, - Variant11730, - Variant11731, - Variant11732, - Variant11733, - Variant11734, - Variant11735, - Variant11736, - Variant11737, - Variant11738, - Variant11739, - Variant11740, - Variant11741, - Variant11742, - Variant11743, - Variant11744, - Variant11745, - Variant11746, - Variant11747, - Variant11748, - Variant11749, - Variant11750, - Variant11751, - Variant11752, - Variant11753, - Variant11754, - Variant11755, - Variant11756, - Variant11757, - Variant11758, - Variant11759, - Variant11760, - Variant11761, - Variant11762, - Variant11763, - Variant11764, - Variant11765, - Variant11766, - Variant11767, - Variant11768, - Variant11769, - Variant11770, - Variant11771, - Variant11772, - Variant11773, - Variant11774, - Variant11775, - Variant11776, - Variant11777, - Variant11778, - Variant11779, - Variant11780, - Variant11781, - Variant11782, - Variant11783, - Variant11784, - Variant11785, - Variant11786, - Variant11787, - Variant11788, - Variant11789, - Variant11790, - Variant11791, - Variant11792, - Variant11793, - Variant11794, - Variant11795, - Variant11796, - Variant11797, - Variant11798, - Variant11799, - Variant11800, - Variant11801, - Variant11802, - Variant11803, - Variant11804, - Variant11805, - Variant11806, - Variant11807, - Variant11808, - Variant11809, - Variant11810, - Variant11811, - Variant11812, - Variant11813, - Variant11814, - Variant11815, - Variant11816, - Variant11817, - Variant11818, - Variant11819, - Variant11820, - Variant11821, - Variant11822, - Variant11823, - Variant11824, - Variant11825, - Variant11826, - Variant11827, - Variant11828, - Variant11829, - Variant11830, - Variant11831, - Variant11832, - Variant11833, - Variant11834, - Variant11835, - Variant11836, - Variant11837, - Variant11838, - Variant11839, - Variant11840, - Variant11841, - Variant11842, - Variant11843, - Variant11844, - Variant11845, - Variant11846, - Variant11847, - Variant11848, - Variant11849, - Variant11850, - Variant11851, - Variant11852, - Variant11853, - Variant11854, - Variant11855, - Variant11856, - Variant11857, - Variant11858, - Variant11859, - Variant11860, - Variant11861, - Variant11862, - Variant11863, - Variant11864, - Variant11865, - Variant11866, - Variant11867, - Variant11868, - Variant11869, - Variant11870, - Variant11871, - Variant11872, - Variant11873, - Variant11874, - Variant11875, - Variant11876, - Variant11877, - Variant11878, - Variant11879, - Variant11880, - Variant11881, - Variant11882, - Variant11883, - Variant11884, - Variant11885, - Variant11886, - Variant11887, - Variant11888, - Variant11889, - Variant11890, - Variant11891, - Variant11892, - Variant11893, - Variant11894, - Variant11895, - Variant11896, - Variant11897, - Variant11898, - Variant11899, - Variant11900, - Variant11901, - Variant11902, - Variant11903, - Variant11904, - Variant11905, - Variant11906, - Variant11907, - Variant11908, - Variant11909, - Variant11910, - Variant11911, - Variant11912, - Variant11913, - Variant11914, - Variant11915, - Variant11916, - Variant11917, - Variant11918, - Variant11919, - Variant11920, - Variant11921, - Variant11922, - Variant11923, - Variant11924, - Variant11925, - Variant11926, - Variant11927, - Variant11928, - Variant11929, - Variant11930, - Variant11931, - Variant11932, - Variant11933, - Variant11934, - Variant11935, - Variant11936, - Variant11937, - Variant11938, - Variant11939, - Variant11940, - Variant11941, - Variant11942, - Variant11943, - Variant11944, - Variant11945, - Variant11946, - Variant11947, - Variant11948, - Variant11949, - Variant11950, - Variant11951, - Variant11952, - Variant11953, - Variant11954, - Variant11955, - Variant11956, - Variant11957, - Variant11958, - Variant11959, - Variant11960, - Variant11961, - Variant11962, - Variant11963, - Variant11964, - Variant11965, - Variant11966, - Variant11967, - Variant11968, - Variant11969, - Variant11970, - Variant11971, - Variant11972, - Variant11973, - Variant11974, - Variant11975, - Variant11976, - Variant11977, - Variant11978, - Variant11979, - Variant11980, - Variant11981, - Variant11982, - Variant11983, - Variant11984, - Variant11985, - Variant11986, - Variant11987, - Variant11988, - Variant11989, - Variant11990, - Variant11991, - Variant11992, - Variant11993, - Variant11994, - Variant11995, - Variant11996, - Variant11997, - Variant11998, - Variant11999, - Variant12000, - Variant12001, - Variant12002, - Variant12003, - Variant12004, - Variant12005, - Variant12006, - Variant12007, - Variant12008, - Variant12009, - Variant12010, - Variant12011, - Variant12012, - Variant12013, - Variant12014, - Variant12015, - Variant12016, - Variant12017, - Variant12018, - Variant12019, - Variant12020, - Variant12021, - Variant12022, - Variant12023, - Variant12024, - Variant12025, - Variant12026, - Variant12027, - Variant12028, - Variant12029, - Variant12030, - Variant12031, - Variant12032, - Variant12033, - Variant12034, - Variant12035, - Variant12036, - Variant12037, - Variant12038, - Variant12039, - Variant12040, - Variant12041, - Variant12042, - Variant12043, - Variant12044, - Variant12045, - Variant12046, - Variant12047, - Variant12048, - Variant12049, - Variant12050, - Variant12051, - Variant12052, - Variant12053, - Variant12054, - Variant12055, - Variant12056, - Variant12057, - Variant12058, - Variant12059, - Variant12060, - Variant12061, - Variant12062, - Variant12063, - Variant12064, - Variant12065, - Variant12066, - Variant12067, - Variant12068, - Variant12069, - Variant12070, - Variant12071, - Variant12072, - Variant12073, - Variant12074, - Variant12075, - Variant12076, - Variant12077, - Variant12078, - Variant12079, - Variant12080, - Variant12081, - Variant12082, - Variant12083, - Variant12084, - Variant12085, - Variant12086, - Variant12087, - Variant12088, - Variant12089, - Variant12090, - Variant12091, - Variant12092, - Variant12093, - Variant12094, - Variant12095, - Variant12096, - Variant12097, - Variant12098, - Variant12099, - Variant12100, - Variant12101, - Variant12102, - Variant12103, - Variant12104, - Variant12105, - Variant12106, - Variant12107, - Variant12108, - Variant12109, - Variant12110, - Variant12111, - Variant12112, - Variant12113, - Variant12114, - Variant12115, - Variant12116, - Variant12117, - Variant12118, - Variant12119, - Variant12120, - Variant12121, - Variant12122, - Variant12123, - Variant12124, - Variant12125, - Variant12126, - Variant12127, - Variant12128, - Variant12129, - Variant12130, - Variant12131, - Variant12132, - Variant12133, - Variant12134, - Variant12135, - Variant12136, - Variant12137, - Variant12138, - Variant12139, - Variant12140, - Variant12141, - Variant12142, - Variant12143, - Variant12144, - Variant12145, - Variant12146, - Variant12147, - Variant12148, - Variant12149, - Variant12150, - Variant12151, - Variant12152, - Variant12153, - Variant12154, - Variant12155, - Variant12156, - Variant12157, - Variant12158, - Variant12159, - Variant12160, - Variant12161, - Variant12162, - Variant12163, - Variant12164, - Variant12165, - Variant12166, - Variant12167, - Variant12168, - Variant12169, - Variant12170, - Variant12171, - Variant12172, - Variant12173, - Variant12174, - Variant12175, - Variant12176, - Variant12177, - Variant12178, - Variant12179, - Variant12180, - Variant12181, - Variant12182, - Variant12183, - Variant12184, - Variant12185, - Variant12186, - Variant12187, - Variant12188, - Variant12189, - Variant12190, - Variant12191, - Variant12192, - Variant12193, - Variant12194, - Variant12195, - Variant12196, - Variant12197, - Variant12198, - Variant12199, - Variant12200, - Variant12201, - Variant12202, - Variant12203, - Variant12204, - Variant12205, - Variant12206, - Variant12207, - Variant12208, - Variant12209, - Variant12210, - Variant12211, - Variant12212, - Variant12213, - Variant12214, - Variant12215, - Variant12216, - Variant12217, - Variant12218, - Variant12219, - Variant12220, - Variant12221, - Variant12222, - Variant12223, - Variant12224, - Variant12225, - Variant12226, - Variant12227, - Variant12228, - Variant12229, - Variant12230, - Variant12231, - Variant12232, - Variant12233, - Variant12234, - Variant12235, - Variant12236, - Variant12237, - Variant12238, - Variant12239, - Variant12240, - Variant12241, - Variant12242, - Variant12243, - Variant12244, - Variant12245, - Variant12246, - Variant12247, - Variant12248, - Variant12249, - Variant12250, - Variant12251, - Variant12252, - Variant12253, - Variant12254, - Variant12255, - Variant12256, - Variant12257, - Variant12258, - Variant12259, - Variant12260, - Variant12261, - Variant12262, - Variant12263, - Variant12264, - Variant12265, - Variant12266, - Variant12267, - Variant12268, - Variant12269, - Variant12270, - Variant12271, - Variant12272, - Variant12273, - Variant12274, - Variant12275, - Variant12276, - Variant12277, - Variant12278, - Variant12279, - Variant12280, - Variant12281, - Variant12282, - Variant12283, - Variant12284, - Variant12285, - Variant12286, - Variant12287, - Variant12288, - Variant12289, - Variant12290, - Variant12291, - Variant12292, - Variant12293, - Variant12294, - Variant12295, - Variant12296, - Variant12297, - Variant12298, - Variant12299, - Variant12300, - Variant12301, - Variant12302, - Variant12303, - Variant12304, - Variant12305, - Variant12306, - Variant12307, - Variant12308, - Variant12309, - Variant12310, - Variant12311, - Variant12312, - Variant12313, - Variant12314, - Variant12315, - Variant12316, - Variant12317, - Variant12318, - Variant12319, - Variant12320, - Variant12321, - Variant12322, - Variant12323, - Variant12324, - Variant12325, - Variant12326, - Variant12327, - Variant12328, - Variant12329, - Variant12330, - Variant12331, - Variant12332, - Variant12333, - Variant12334, - Variant12335, - Variant12336, - Variant12337, - Variant12338, - Variant12339, - Variant12340, - Variant12341, - Variant12342, - Variant12343, - Variant12344, - Variant12345, - Variant12346, - Variant12347, - Variant12348, - Variant12349, - Variant12350, - Variant12351, - Variant12352, - Variant12353, - Variant12354, - Variant12355, - Variant12356, - Variant12357, - Variant12358, - Variant12359, - Variant12360, - Variant12361, - Variant12362, - Variant12363, - Variant12364, - Variant12365, - Variant12366, - Variant12367, - Variant12368, - Variant12369, - Variant12370, - Variant12371, - Variant12372, - Variant12373, - Variant12374, - Variant12375, - Variant12376, - Variant12377, - Variant12378, - Variant12379, - Variant12380, - Variant12381, - Variant12382, - Variant12383, - Variant12384, - Variant12385, - Variant12386, - Variant12387, - Variant12388, - Variant12389, - Variant12390, - Variant12391, - Variant12392, - Variant12393, - Variant12394, - Variant12395, - Variant12396, - Variant12397, - Variant12398, - Variant12399, - Variant12400, - Variant12401, - Variant12402, - Variant12403, - Variant12404, - Variant12405, - Variant12406, - Variant12407, - Variant12408, - Variant12409, - Variant12410, - Variant12411, - Variant12412, - Variant12413, - Variant12414, - Variant12415, - Variant12416, - Variant12417, - Variant12418, - Variant12419, - Variant12420, - Variant12421, - Variant12422, - Variant12423, - Variant12424, - Variant12425, - Variant12426, - Variant12427, - Variant12428, - Variant12429, - Variant12430, - Variant12431, - Variant12432, - Variant12433, - Variant12434, - Variant12435, - Variant12436, - Variant12437, - Variant12438, - Variant12439, - Variant12440, - Variant12441, - Variant12442, - Variant12443, - Variant12444, - Variant12445, - Variant12446, - Variant12447, - Variant12448, - Variant12449, - Variant12450, - Variant12451, - Variant12452, - Variant12453, - Variant12454, - Variant12455, - Variant12456, - Variant12457, - Variant12458, - Variant12459, - Variant12460, - Variant12461, - Variant12462, - Variant12463, - Variant12464, - Variant12465, - Variant12466, - Variant12467, - Variant12468, - Variant12469, - Variant12470, - Variant12471, - Variant12472, - Variant12473, - Variant12474, - Variant12475, - Variant12476, - Variant12477, - Variant12478, - Variant12479, - Variant12480, - Variant12481, - Variant12482, - Variant12483, - Variant12484, - Variant12485, - Variant12486, - Variant12487, - Variant12488, - Variant12489, - Variant12490, - Variant12491, - Variant12492, - Variant12493, - Variant12494, - Variant12495, - Variant12496, - Variant12497, - Variant12498, - Variant12499, - Variant12500, - Variant12501, - Variant12502, - Variant12503, - Variant12504, - Variant12505, - Variant12506, - Variant12507, - Variant12508, - Variant12509, - Variant12510, - Variant12511, - Variant12512, - Variant12513, - Variant12514, - Variant12515, - Variant12516, - Variant12517, - Variant12518, - Variant12519, - Variant12520, - Variant12521, - Variant12522, - Variant12523, - Variant12524, - Variant12525, - Variant12526, - Variant12527, - Variant12528, - Variant12529, - Variant12530, - Variant12531, - Variant12532, - Variant12533, - Variant12534, - Variant12535, - Variant12536, - Variant12537, - Variant12538, - Variant12539, - Variant12540, - Variant12541, - Variant12542, - Variant12543, - Variant12544, - Variant12545, - Variant12546, - Variant12547, - Variant12548, - Variant12549, - Variant12550, - Variant12551, - Variant12552, - Variant12553, - Variant12554, - Variant12555, - Variant12556, - Variant12557, - Variant12558, - Variant12559, - Variant12560, - Variant12561, - Variant12562, - Variant12563, - Variant12564, - Variant12565, - Variant12566, - Variant12567, - Variant12568, - Variant12569, - Variant12570, - Variant12571, - Variant12572, - Variant12573, - Variant12574, - Variant12575, - Variant12576, - Variant12577, - Variant12578, - Variant12579, - Variant12580, - Variant12581, - Variant12582, - Variant12583, - Variant12584, - Variant12585, - Variant12586, - Variant12587, - Variant12588, - Variant12589, - Variant12590, - Variant12591, - Variant12592, - Variant12593, - Variant12594, - Variant12595, - Variant12596, - Variant12597, - Variant12598, - Variant12599, - Variant12600, - Variant12601, - Variant12602, - Variant12603, - Variant12604, - Variant12605, - Variant12606, - Variant12607, - Variant12608, - Variant12609, - Variant12610, - Variant12611, - Variant12612, - Variant12613, - Variant12614, - Variant12615, - Variant12616, - Variant12617, - Variant12618, - Variant12619, - Variant12620, - Variant12621, - Variant12622, - Variant12623, - Variant12624, - Variant12625, - Variant12626, - Variant12627, - Variant12628, - Variant12629, - Variant12630, - Variant12631, - Variant12632, - Variant12633, - Variant12634, - Variant12635, - Variant12636, - Variant12637, - Variant12638, - Variant12639, - Variant12640, - Variant12641, - Variant12642, - Variant12643, - Variant12644, - Variant12645, - Variant12646, - Variant12647, - Variant12648, - Variant12649, - Variant12650, - Variant12651, - Variant12652, - Variant12653, - Variant12654, - Variant12655, - Variant12656, - Variant12657, - Variant12658, - Variant12659, - Variant12660, - Variant12661, - Variant12662, - Variant12663, - Variant12664, - Variant12665, - Variant12666, - Variant12667, - Variant12668, - Variant12669, - Variant12670, - Variant12671, - Variant12672, - Variant12673, - Variant12674, - Variant12675, - Variant12676, - Variant12677, - Variant12678, - Variant12679, - Variant12680, - Variant12681, - Variant12682, - Variant12683, - Variant12684, - Variant12685, - Variant12686, - Variant12687, - Variant12688, - Variant12689, - Variant12690, - Variant12691, - Variant12692, - Variant12693, - Variant12694, - Variant12695, - Variant12696, - Variant12697, - Variant12698, - Variant12699, - Variant12700, - Variant12701, - Variant12702, - Variant12703, - Variant12704, - Variant12705, - Variant12706, - Variant12707, - Variant12708, - Variant12709, - Variant12710, - Variant12711, - Variant12712, - Variant12713, - Variant12714, - Variant12715, - Variant12716, - Variant12717, - Variant12718, - Variant12719, - Variant12720, - Variant12721, - Variant12722, - Variant12723, - Variant12724, - Variant12725, - Variant12726, - Variant12727, - Variant12728, - Variant12729, - Variant12730, - Variant12731, - Variant12732, - Variant12733, - Variant12734, - Variant12735, - Variant12736, - Variant12737, - Variant12738, - Variant12739, - Variant12740, - Variant12741, - Variant12742, - Variant12743, - Variant12744, - Variant12745, - Variant12746, - Variant12747, - Variant12748, - Variant12749, - Variant12750, - Variant12751, - Variant12752, - Variant12753, - Variant12754, - Variant12755, - Variant12756, - Variant12757, - Variant12758, - Variant12759, - Variant12760, - Variant12761, - Variant12762, - Variant12763, - Variant12764, - Variant12765, - Variant12766, - Variant12767, - Variant12768, - Variant12769, - Variant12770, - Variant12771, - Variant12772, - Variant12773, - Variant12774, - Variant12775, - Variant12776, - Variant12777, - Variant12778, - Variant12779, - Variant12780, - Variant12781, - Variant12782, - Variant12783, - Variant12784, - Variant12785, - Variant12786, - Variant12787, - Variant12788, - Variant12789, - Variant12790, - Variant12791, - Variant12792, - Variant12793, - Variant12794, - Variant12795, - Variant12796, - Variant12797, - Variant12798, - Variant12799, - Variant12800, - Variant12801, - Variant12802, - Variant12803, - Variant12804, - Variant12805, - Variant12806, - Variant12807, - Variant12808, - Variant12809, - Variant12810, - Variant12811, - Variant12812, - Variant12813, - Variant12814, - Variant12815, - Variant12816, - Variant12817, - Variant12818, - Variant12819, - Variant12820, - Variant12821, - Variant12822, - Variant12823, - Variant12824, - Variant12825, - Variant12826, - Variant12827, - Variant12828, - Variant12829, - Variant12830, - Variant12831, - Variant12832, - Variant12833, - Variant12834, - Variant12835, - Variant12836, - Variant12837, - Variant12838, - Variant12839, - Variant12840, - Variant12841, - Variant12842, - Variant12843, - Variant12844, - Variant12845, - Variant12846, - Variant12847, - Variant12848, - Variant12849, - Variant12850, - Variant12851, - Variant12852, - Variant12853, - Variant12854, - Variant12855, - Variant12856, - Variant12857, - Variant12858, - Variant12859, - Variant12860, - Variant12861, - Variant12862, - Variant12863, - Variant12864, - Variant12865, - Variant12866, - Variant12867, - Variant12868, - Variant12869, - Variant12870, - Variant12871, - Variant12872, - Variant12873, - Variant12874, - Variant12875, - Variant12876, - Variant12877, - Variant12878, - Variant12879, - Variant12880, - Variant12881, - Variant12882, - Variant12883, - Variant12884, - Variant12885, - Variant12886, - Variant12887, - Variant12888, - Variant12889, - Variant12890, - Variant12891, - Variant12892, - Variant12893, - Variant12894, - Variant12895, - Variant12896, - Variant12897, - Variant12898, - Variant12899, - Variant12900, - Variant12901, - Variant12902, - Variant12903, - Variant12904, - Variant12905, - Variant12906, - Variant12907, - Variant12908, - Variant12909, - Variant12910, - Variant12911, - Variant12912, - Variant12913, - Variant12914, - Variant12915, - Variant12916, - Variant12917, - Variant12918, - Variant12919, - Variant12920, - Variant12921, - Variant12922, - Variant12923, - Variant12924, - Variant12925, - Variant12926, - Variant12927, - Variant12928, - Variant12929, - Variant12930, - Variant12931, - Variant12932, - Variant12933, - Variant12934, - Variant12935, - Variant12936, - Variant12937, - Variant12938, - Variant12939, - Variant12940, - Variant12941, - Variant12942, - Variant12943, - Variant12944, - Variant12945, - Variant12946, - Variant12947, - Variant12948, - Variant12949, - Variant12950, - Variant12951, - Variant12952, - Variant12953, - Variant12954, - Variant12955, - Variant12956, - Variant12957, - Variant12958, - Variant12959, - Variant12960, - Variant12961, - Variant12962, - Variant12963, - Variant12964, - Variant12965, - Variant12966, - Variant12967, - Variant12968, - Variant12969, - Variant12970, - Variant12971, - Variant12972, - Variant12973, - Variant12974, - Variant12975, - Variant12976, - Variant12977, - Variant12978, - Variant12979, - Variant12980, - Variant12981, - Variant12982, - Variant12983, - Variant12984, - Variant12985, - Variant12986, - Variant12987, - Variant12988, - Variant12989, - Variant12990, - Variant12991, - Variant12992, - Variant12993, - Variant12994, - Variant12995, - Variant12996, - Variant12997, - Variant12998, - Variant12999, - Variant13000, - Variant13001, - Variant13002, - Variant13003, - Variant13004, - Variant13005, - Variant13006, - Variant13007, - Variant13008, - Variant13009, - Variant13010, - Variant13011, - Variant13012, - Variant13013, - Variant13014, - Variant13015, - Variant13016, - Variant13017, - Variant13018, - Variant13019, - Variant13020, - Variant13021, - Variant13022, - Variant13023, - Variant13024, - Variant13025, - Variant13026, - Variant13027, - Variant13028, - Variant13029, - Variant13030, - Variant13031, - Variant13032, - Variant13033, - Variant13034, - Variant13035, - Variant13036, - Variant13037, - Variant13038, - Variant13039, - Variant13040, - Variant13041, - Variant13042, - Variant13043, - Variant13044, - Variant13045, - Variant13046, - Variant13047, - Variant13048, - Variant13049, - Variant13050, - Variant13051, - Variant13052, - Variant13053, - Variant13054, - Variant13055, - Variant13056, - Variant13057, - Variant13058, - Variant13059, - Variant13060, - Variant13061, - Variant13062, - Variant13063, - Variant13064, - Variant13065, - Variant13066, - Variant13067, - Variant13068, - Variant13069, - Variant13070, - Variant13071, - Variant13072, - Variant13073, - Variant13074, - Variant13075, - Variant13076, - Variant13077, - Variant13078, - Variant13079, - Variant13080, - Variant13081, - Variant13082, - Variant13083, - Variant13084, - Variant13085, - Variant13086, - Variant13087, - Variant13088, - Variant13089, - Variant13090, - Variant13091, - Variant13092, - Variant13093, - Variant13094, - Variant13095, - Variant13096, - Variant13097, - Variant13098, - Variant13099, - Variant13100, - Variant13101, - Variant13102, - Variant13103, - Variant13104, - Variant13105, - Variant13106, - Variant13107, - Variant13108, - Variant13109, - Variant13110, - Variant13111, - Variant13112, - Variant13113, - Variant13114, - Variant13115, - Variant13116, - Variant13117, - Variant13118, - Variant13119, - Variant13120, - Variant13121, - Variant13122, - Variant13123, - Variant13124, - Variant13125, - Variant13126, - Variant13127, - Variant13128, - Variant13129, - Variant13130, - Variant13131, - Variant13132, - Variant13133, - Variant13134, - Variant13135, - Variant13136, - Variant13137, - Variant13138, - Variant13139, - Variant13140, - Variant13141, - Variant13142, - Variant13143, - Variant13144, - Variant13145, - Variant13146, - Variant13147, - Variant13148, - Variant13149, - Variant13150, - Variant13151, - Variant13152, - Variant13153, - Variant13154, - Variant13155, - Variant13156, - Variant13157, - Variant13158, - Variant13159, - Variant13160, - Variant13161, - Variant13162, - Variant13163, - Variant13164, - Variant13165, - Variant13166, - Variant13167, - Variant13168, - Variant13169, - Variant13170, - Variant13171, - Variant13172, - Variant13173, - Variant13174, - Variant13175, - Variant13176, - Variant13177, - Variant13178, - Variant13179, - Variant13180, - Variant13181, - Variant13182, - Variant13183, - Variant13184, - Variant13185, - Variant13186, - Variant13187, - Variant13188, - Variant13189, - Variant13190, - Variant13191, - Variant13192, - Variant13193, - Variant13194, - Variant13195, - Variant13196, - Variant13197, - Variant13198, - Variant13199, - Variant13200, - Variant13201, - Variant13202, - Variant13203, - Variant13204, - Variant13205, - Variant13206, - Variant13207, - Variant13208, - Variant13209, - Variant13210, - Variant13211, - Variant13212, - Variant13213, - Variant13214, - Variant13215, - Variant13216, - Variant13217, - Variant13218, - Variant13219, - Variant13220, - Variant13221, - Variant13222, - Variant13223, - Variant13224, - Variant13225, - Variant13226, - Variant13227, - Variant13228, - Variant13229, - Variant13230, - Variant13231, - Variant13232, - Variant13233, - Variant13234, - Variant13235, - Variant13236, - Variant13237, - Variant13238, - Variant13239, - Variant13240, - Variant13241, - Variant13242, - Variant13243, - Variant13244, - Variant13245, - Variant13246, - Variant13247, - Variant13248, - Variant13249, - Variant13250, - Variant13251, - Variant13252, - Variant13253, - Variant13254, - Variant13255, - Variant13256, - Variant13257, - Variant13258, - Variant13259, - Variant13260, - Variant13261, - Variant13262, - Variant13263, - Variant13264, - Variant13265, - Variant13266, - Variant13267, - Variant13268, - Variant13269, - Variant13270, - Variant13271, - Variant13272, - Variant13273, - Variant13274, - Variant13275, - Variant13276, - Variant13277, - Variant13278, - Variant13279, - Variant13280, - Variant13281, - Variant13282, - Variant13283, - Variant13284, - Variant13285, - Variant13286, - Variant13287, - Variant13288, - Variant13289, - Variant13290, - Variant13291, - Variant13292, - Variant13293, - Variant13294, - Variant13295, - Variant13296, - Variant13297, - Variant13298, - Variant13299, - Variant13300, - Variant13301, - Variant13302, - Variant13303, - Variant13304, - Variant13305, - Variant13306, - Variant13307, - Variant13308, - Variant13309, - Variant13310, - Variant13311, - Variant13312, - Variant13313, - Variant13314, - Variant13315, - Variant13316, - Variant13317, - Variant13318, - Variant13319, - Variant13320, - Variant13321, - Variant13322, - Variant13323, - Variant13324, - Variant13325, - Variant13326, - Variant13327, - Variant13328, - Variant13329, - Variant13330, - Variant13331, - Variant13332, - Variant13333, - Variant13334, - Variant13335, - Variant13336, - Variant13337, - Variant13338, - Variant13339, - Variant13340, - Variant13341, - Variant13342, - Variant13343, - Variant13344, - Variant13345, - Variant13346, - Variant13347, - Variant13348, - Variant13349, - Variant13350, - Variant13351, - Variant13352, - Variant13353, - Variant13354, - Variant13355, - Variant13356, - Variant13357, - Variant13358, - Variant13359, - Variant13360, - Variant13361, - Variant13362, - Variant13363, - Variant13364, - Variant13365, - Variant13366, - Variant13367, - Variant13368, - Variant13369, - Variant13370, - Variant13371, - Variant13372, - Variant13373, - Variant13374, - Variant13375, - Variant13376, - Variant13377, - Variant13378, - Variant13379, - Variant13380, - Variant13381, - Variant13382, - Variant13383, - Variant13384, - Variant13385, - Variant13386, - Variant13387, - Variant13388, - Variant13389, - Variant13390, - Variant13391, - Variant13392, - Variant13393, - Variant13394, - Variant13395, - Variant13396, - Variant13397, - Variant13398, - Variant13399, - Variant13400, - Variant13401, - Variant13402, - Variant13403, - Variant13404, - Variant13405, - Variant13406, - Variant13407, - Variant13408, - Variant13409, - Variant13410, - Variant13411, - Variant13412, - Variant13413, - Variant13414, - Variant13415, - Variant13416, - Variant13417, - Variant13418, - Variant13419, - Variant13420, - Variant13421, - Variant13422, - Variant13423, - Variant13424, - Variant13425, - Variant13426, - Variant13427, - Variant13428, - Variant13429, - Variant13430, - Variant13431, - Variant13432, - Variant13433, - Variant13434, - Variant13435, - Variant13436, - Variant13437, - Variant13438, - Variant13439, - Variant13440, - Variant13441, - Variant13442, - Variant13443, - Variant13444, - Variant13445, - Variant13446, - Variant13447, - Variant13448, - Variant13449, - Variant13450, - Variant13451, - Variant13452, - Variant13453, - Variant13454, - Variant13455, - Variant13456, - Variant13457, - Variant13458, - Variant13459, - Variant13460, - Variant13461, - Variant13462, - Variant13463, - Variant13464, - Variant13465, - Variant13466, - Variant13467, - Variant13468, - Variant13469, - Variant13470, - Variant13471, - Variant13472, - Variant13473, - Variant13474, - Variant13475, - Variant13476, - Variant13477, - Variant13478, - Variant13479, - Variant13480, - Variant13481, - Variant13482, - Variant13483, - Variant13484, - Variant13485, - Variant13486, - Variant13487, - Variant13488, - Variant13489, - Variant13490, - Variant13491, - Variant13492, - Variant13493, - Variant13494, - Variant13495, - Variant13496, - Variant13497, - Variant13498, - Variant13499, - Variant13500, - Variant13501, - Variant13502, - Variant13503, - Variant13504, - Variant13505, - Variant13506, - Variant13507, - Variant13508, - Variant13509, - Variant13510, - Variant13511, - Variant13512, - Variant13513, - Variant13514, - Variant13515, - Variant13516, - Variant13517, - Variant13518, - Variant13519, - Variant13520, - Variant13521, - Variant13522, - Variant13523, - Variant13524, - Variant13525, - Variant13526, - Variant13527, - Variant13528, - Variant13529, - Variant13530, - Variant13531, - Variant13532, - Variant13533, - Variant13534, - Variant13535, - Variant13536, - Variant13537, - Variant13538, - Variant13539, - Variant13540, - Variant13541, - Variant13542, - Variant13543, - Variant13544, - Variant13545, - Variant13546, - Variant13547, - Variant13548, - Variant13549, - Variant13550, - Variant13551, - Variant13552, - Variant13553, - Variant13554, - Variant13555, - Variant13556, - Variant13557, - Variant13558, - Variant13559, - Variant13560, - Variant13561, - Variant13562, - Variant13563, - Variant13564, - Variant13565, - Variant13566, - Variant13567, - Variant13568, - Variant13569, - Variant13570, - Variant13571, - Variant13572, - Variant13573, - Variant13574, - Variant13575, - Variant13576, - Variant13577, - Variant13578, - Variant13579, - Variant13580, - Variant13581, - Variant13582, - Variant13583, - Variant13584, - Variant13585, - Variant13586, - Variant13587, - Variant13588, - Variant13589, - Variant13590, - Variant13591, - Variant13592, - Variant13593, - Variant13594, - Variant13595, - Variant13596, - Variant13597, - Variant13598, - Variant13599, - Variant13600, - Variant13601, - Variant13602, - Variant13603, - Variant13604, - Variant13605, - Variant13606, - Variant13607, - Variant13608, - Variant13609, - Variant13610, - Variant13611, - Variant13612, - Variant13613, - Variant13614, - Variant13615, - Variant13616, - Variant13617, - Variant13618, - Variant13619, - Variant13620, - Variant13621, - Variant13622, - Variant13623, - Variant13624, - Variant13625, - Variant13626, - Variant13627, - Variant13628, - Variant13629, - Variant13630, - Variant13631, - Variant13632, - Variant13633, - Variant13634, - Variant13635, - Variant13636, - Variant13637, - Variant13638, - Variant13639, - Variant13640, - Variant13641, - Variant13642, - Variant13643, - Variant13644, - Variant13645, - Variant13646, - Variant13647, - Variant13648, - Variant13649, - Variant13650, - Variant13651, - Variant13652, - Variant13653, - Variant13654, - Variant13655, - Variant13656, - Variant13657, - Variant13658, - Variant13659, - Variant13660, - Variant13661, - Variant13662, - Variant13663, - Variant13664, - Variant13665, - Variant13666, - Variant13667, - Variant13668, - Variant13669, - Variant13670, - Variant13671, - Variant13672, - Variant13673, - Variant13674, - Variant13675, - Variant13676, - Variant13677, - Variant13678, - Variant13679, - Variant13680, - Variant13681, - Variant13682, - Variant13683, - Variant13684, - Variant13685, - Variant13686, - Variant13687, - Variant13688, - Variant13689, - Variant13690, - Variant13691, - Variant13692, - Variant13693, - Variant13694, - Variant13695, - Variant13696, - Variant13697, - Variant13698, - Variant13699, - Variant13700, - Variant13701, - Variant13702, - Variant13703, - Variant13704, - Variant13705, - Variant13706, - Variant13707, - Variant13708, - Variant13709, - Variant13710, - Variant13711, - Variant13712, - Variant13713, - Variant13714, - Variant13715, - Variant13716, - Variant13717, - Variant13718, - Variant13719, - Variant13720, - Variant13721, - Variant13722, - Variant13723, - Variant13724, - Variant13725, - Variant13726, - Variant13727, - Variant13728, - Variant13729, - Variant13730, - Variant13731, - Variant13732, - Variant13733, - Variant13734, - Variant13735, - Variant13736, - Variant13737, - Variant13738, - Variant13739, - Variant13740, - Variant13741, - Variant13742, - Variant13743, - Variant13744, - Variant13745, - Variant13746, - Variant13747, - Variant13748, - Variant13749, - Variant13750, - Variant13751, - Variant13752, - Variant13753, - Variant13754, - Variant13755, - Variant13756, - Variant13757, - Variant13758, - Variant13759, - Variant13760, - Variant13761, - Variant13762, - Variant13763, - Variant13764, - Variant13765, - Variant13766, - Variant13767, - Variant13768, - Variant13769, - Variant13770, - Variant13771, - Variant13772, - Variant13773, - Variant13774, - Variant13775, - Variant13776, - Variant13777, - Variant13778, - Variant13779, - Variant13780, - Variant13781, - Variant13782, - Variant13783, - Variant13784, - Variant13785, - Variant13786, - Variant13787, - Variant13788, - Variant13789, - Variant13790, - Variant13791, - Variant13792, - Variant13793, - Variant13794, - Variant13795, - Variant13796, - Variant13797, - Variant13798, - Variant13799, - Variant13800, - Variant13801, - Variant13802, - Variant13803, - Variant13804, - Variant13805, - Variant13806, - Variant13807, - Variant13808, - Variant13809, - Variant13810, - Variant13811, - Variant13812, - Variant13813, - Variant13814, - Variant13815, - Variant13816, - Variant13817, - Variant13818, - Variant13819, - Variant13820, - Variant13821, - Variant13822, - Variant13823, - Variant13824, - Variant13825, - Variant13826, - Variant13827, - Variant13828, - Variant13829, - Variant13830, - Variant13831, - Variant13832, - Variant13833, - Variant13834, - Variant13835, - Variant13836, - Variant13837, - Variant13838, - Variant13839, - Variant13840, - Variant13841, - Variant13842, - Variant13843, - Variant13844, - Variant13845, - Variant13846, - Variant13847, - Variant13848, - Variant13849, - Variant13850, - Variant13851, - Variant13852, - Variant13853, - Variant13854, - Variant13855, - Variant13856, - Variant13857, - Variant13858, - Variant13859, - Variant13860, - Variant13861, - Variant13862, - Variant13863, - Variant13864, - Variant13865, - Variant13866, - Variant13867, - Variant13868, - Variant13869, - Variant13870, - Variant13871, - Variant13872, - Variant13873, - Variant13874, - Variant13875, - Variant13876, - Variant13877, - Variant13878, - Variant13879, - Variant13880, - Variant13881, - Variant13882, - Variant13883, - Variant13884, - Variant13885, - Variant13886, - Variant13887, - Variant13888, - Variant13889, - Variant13890, - Variant13891, - Variant13892, - Variant13893, - Variant13894, - Variant13895, - Variant13896, - Variant13897, - Variant13898, - Variant13899, - Variant13900, - Variant13901, - Variant13902, - Variant13903, - Variant13904, - Variant13905, - Variant13906, - Variant13907, - Variant13908, - Variant13909, - Variant13910, - Variant13911, - Variant13912, - Variant13913, - Variant13914, - Variant13915, - Variant13916, - Variant13917, - Variant13918, - Variant13919, - Variant13920, - Variant13921, - Variant13922, - Variant13923, - Variant13924, - Variant13925, - Variant13926, - Variant13927, - Variant13928, - Variant13929, - Variant13930, - Variant13931, - Variant13932, - Variant13933, - Variant13934, - Variant13935, - Variant13936, - Variant13937, - Variant13938, - Variant13939, - Variant13940, - Variant13941, - Variant13942, - Variant13943, - Variant13944, - Variant13945, - Variant13946, - Variant13947, - Variant13948, - Variant13949, - Variant13950, - Variant13951, - Variant13952, - Variant13953, - Variant13954, - Variant13955, - Variant13956, - Variant13957, - Variant13958, - Variant13959, - Variant13960, - Variant13961, - Variant13962, - Variant13963, - Variant13964, - Variant13965, - Variant13966, - Variant13967, - Variant13968, - Variant13969, - Variant13970, - Variant13971, - Variant13972, - Variant13973, - Variant13974, - Variant13975, - Variant13976, - Variant13977, - Variant13978, - Variant13979, - Variant13980, - Variant13981, - Variant13982, - Variant13983, - Variant13984, - Variant13985, - Variant13986, - Variant13987, - Variant13988, - Variant13989, - Variant13990, - Variant13991, - Variant13992, - Variant13993, - Variant13994, - Variant13995, - Variant13996, - Variant13997, - Variant13998, - Variant13999, - Variant14000, - Variant14001, - Variant14002, - Variant14003, - Variant14004, - Variant14005, - Variant14006, - Variant14007, - Variant14008, - Variant14009, - Variant14010, - Variant14011, - Variant14012, - Variant14013, - Variant14014, - Variant14015, - Variant14016, - Variant14017, - Variant14018, - Variant14019, - Variant14020, - Variant14021, - Variant14022, - Variant14023, - Variant14024, - Variant14025, - Variant14026, - Variant14027, - Variant14028, - Variant14029, - Variant14030, - Variant14031, - Variant14032, - Variant14033, - Variant14034, - Variant14035, - Variant14036, - Variant14037, - Variant14038, - Variant14039, - Variant14040, - Variant14041, - Variant14042, - Variant14043, - Variant14044, - Variant14045, - Variant14046, - Variant14047, - Variant14048, - Variant14049, - Variant14050, - Variant14051, - Variant14052, - Variant14053, - Variant14054, - Variant14055, - Variant14056, - Variant14057, - Variant14058, - Variant14059, - Variant14060, - Variant14061, - Variant14062, - Variant14063, - Variant14064, - Variant14065, - Variant14066, - Variant14067, - Variant14068, - Variant14069, - Variant14070, - Variant14071, - Variant14072, - Variant14073, - Variant14074, - Variant14075, - Variant14076, - Variant14077, - Variant14078, - Variant14079, - Variant14080, - Variant14081, - Variant14082, - Variant14083, - Variant14084, - Variant14085, - Variant14086, - Variant14087, - Variant14088, - Variant14089, - Variant14090, - Variant14091, - Variant14092, - Variant14093, - Variant14094, - Variant14095, - Variant14096, - Variant14097, - Variant14098, - Variant14099, - Variant14100, - Variant14101, - Variant14102, - Variant14103, - Variant14104, - Variant14105, - Variant14106, - Variant14107, - Variant14108, - Variant14109, - Variant14110, - Variant14111, - Variant14112, - Variant14113, - Variant14114, - Variant14115, - Variant14116, - Variant14117, - Variant14118, - Variant14119, - Variant14120, - Variant14121, - Variant14122, - Variant14123, - Variant14124, - Variant14125, - Variant14126, - Variant14127, - Variant14128, - Variant14129, - Variant14130, - Variant14131, - Variant14132, - Variant14133, - Variant14134, - Variant14135, - Variant14136, - Variant14137, - Variant14138, - Variant14139, - Variant14140, - Variant14141, - Variant14142, - Variant14143, - Variant14144, - Variant14145, - Variant14146, - Variant14147, - Variant14148, - Variant14149, - Variant14150, - Variant14151, - Variant14152, - Variant14153, - Variant14154, - Variant14155, - Variant14156, - Variant14157, - Variant14158, - Variant14159, - Variant14160, - Variant14161, - Variant14162, - Variant14163, - Variant14164, - Variant14165, - Variant14166, - Variant14167, - Variant14168, - Variant14169, - Variant14170, - Variant14171, - Variant14172, - Variant14173, - Variant14174, - Variant14175, - Variant14176, - Variant14177, - Variant14178, - Variant14179, - Variant14180, - Variant14181, - Variant14182, - Variant14183, - Variant14184, - Variant14185, - Variant14186, - Variant14187, - Variant14188, - Variant14189, - Variant14190, - Variant14191, - Variant14192, - Variant14193, - Variant14194, - Variant14195, - Variant14196, - Variant14197, - Variant14198, - Variant14199, - Variant14200, - Variant14201, - Variant14202, - Variant14203, - Variant14204, - Variant14205, - Variant14206, - Variant14207, - Variant14208, - Variant14209, - Variant14210, - Variant14211, - Variant14212, - Variant14213, - Variant14214, - Variant14215, - Variant14216, - Variant14217, - Variant14218, - Variant14219, - Variant14220, - Variant14221, - Variant14222, - Variant14223, - Variant14224, - Variant14225, - Variant14226, - Variant14227, - Variant14228, - Variant14229, - Variant14230, - Variant14231, - Variant14232, - Variant14233, - Variant14234, - Variant14235, - Variant14236, - Variant14237, - Variant14238, - Variant14239, - Variant14240, - Variant14241, - Variant14242, - Variant14243, - Variant14244, - Variant14245, - Variant14246, - Variant14247, - Variant14248, - Variant14249, - Variant14250, - Variant14251, - Variant14252, - Variant14253, - Variant14254, - Variant14255, - Variant14256, - Variant14257, - Variant14258, - Variant14259, - Variant14260, - Variant14261, - Variant14262, - Variant14263, - Variant14264, - Variant14265, - Variant14266, - Variant14267, - Variant14268, - Variant14269, - Variant14270, - Variant14271, - Variant14272, - Variant14273, - Variant14274, - Variant14275, - Variant14276, - Variant14277, - Variant14278, - Variant14279, - Variant14280, - Variant14281, - Variant14282, - Variant14283, - Variant14284, - Variant14285, - Variant14286, - Variant14287, - Variant14288, - Variant14289, - Variant14290, - Variant14291, - Variant14292, - Variant14293, - Variant14294, - Variant14295, - Variant14296, - Variant14297, - Variant14298, - Variant14299, - Variant14300, - Variant14301, - Variant14302, - Variant14303, - Variant14304, - Variant14305, - Variant14306, - Variant14307, - Variant14308, - Variant14309, - Variant14310, - Variant14311, - Variant14312, - Variant14313, - Variant14314, - Variant14315, - Variant14316, - Variant14317, - Variant14318, - Variant14319, - Variant14320, - Variant14321, - Variant14322, - Variant14323, - Variant14324, - Variant14325, - Variant14326, - Variant14327, - Variant14328, - Variant14329, - Variant14330, - Variant14331, - Variant14332, - Variant14333, - Variant14334, - Variant14335, - Variant14336, - Variant14337, - Variant14338, - Variant14339, - Variant14340, - Variant14341, - Variant14342, - Variant14343, - Variant14344, - Variant14345, - Variant14346, - Variant14347, - Variant14348, - Variant14349, - Variant14350, - Variant14351, - Variant14352, - Variant14353, - Variant14354, - Variant14355, - Variant14356, - Variant14357, - Variant14358, - Variant14359, - Variant14360, - Variant14361, - Variant14362, - Variant14363, - Variant14364, - Variant14365, - Variant14366, - Variant14367, - Variant14368, - Variant14369, - Variant14370, - Variant14371, - Variant14372, - Variant14373, - Variant14374, - Variant14375, - Variant14376, - Variant14377, - Variant14378, - Variant14379, - Variant14380, - Variant14381, - Variant14382, - Variant14383, - Variant14384, - Variant14385, - Variant14386, - Variant14387, - Variant14388, - Variant14389, - Variant14390, - Variant14391, - Variant14392, - Variant14393, - Variant14394, - Variant14395, - Variant14396, - Variant14397, - Variant14398, - Variant14399, - Variant14400, - Variant14401, - Variant14402, - Variant14403, - Variant14404, - Variant14405, - Variant14406, - Variant14407, - Variant14408, - Variant14409, - Variant14410, - Variant14411, - Variant14412, - Variant14413, - Variant14414, - Variant14415, - Variant14416, - Variant14417, - Variant14418, - Variant14419, - Variant14420, - Variant14421, - Variant14422, - Variant14423, - Variant14424, - Variant14425, - Variant14426, - Variant14427, - Variant14428, - Variant14429, - Variant14430, - Variant14431, - Variant14432, - Variant14433, - Variant14434, - Variant14435, - Variant14436, - Variant14437, - Variant14438, - Variant14439, - Variant14440, - Variant14441, - Variant14442, - Variant14443, - Variant14444, - Variant14445, - Variant14446, - Variant14447, - Variant14448, - Variant14449, - Variant14450, - Variant14451, - Variant14452, - Variant14453, - Variant14454, - Variant14455, - Variant14456, - Variant14457, - Variant14458, - Variant14459, - Variant14460, - Variant14461, - Variant14462, - Variant14463, - Variant14464, - Variant14465, - Variant14466, - Variant14467, - Variant14468, - Variant14469, - Variant14470, - Variant14471, - Variant14472, - Variant14473, - Variant14474, - Variant14475, - Variant14476, - Variant14477, - Variant14478, - Variant14479, - Variant14480, - Variant14481, - Variant14482, - Variant14483, - Variant14484, - Variant14485, - Variant14486, - Variant14487, - Variant14488, - Variant14489, - Variant14490, - Variant14491, - Variant14492, - Variant14493, - Variant14494, - Variant14495, - Variant14496, - Variant14497, - Variant14498, - Variant14499, - Variant14500, - Variant14501, - Variant14502, - Variant14503, - Variant14504, - Variant14505, - Variant14506, - Variant14507, - Variant14508, - Variant14509, - Variant14510, - Variant14511, - Variant14512, - Variant14513, - Variant14514, - Variant14515, - Variant14516, - Variant14517, - Variant14518, - Variant14519, - Variant14520, - Variant14521, - Variant14522, - Variant14523, - Variant14524, - Variant14525, - Variant14526, - Variant14527, - Variant14528, - Variant14529, - Variant14530, - Variant14531, - Variant14532, - Variant14533, - Variant14534, - Variant14535, - Variant14536, - Variant14537, - Variant14538, - Variant14539, - Variant14540, - Variant14541, - Variant14542, - Variant14543, - Variant14544, - Variant14545, - Variant14546, - Variant14547, - Variant14548, - Variant14549, - Variant14550, - Variant14551, - Variant14552, - Variant14553, - Variant14554, - Variant14555, - Variant14556, - Variant14557, - Variant14558, - Variant14559, - Variant14560, - Variant14561, - Variant14562, - Variant14563, - Variant14564, - Variant14565, - Variant14566, - Variant14567, - Variant14568, - Variant14569, - Variant14570, - Variant14571, - Variant14572, - Variant14573, - Variant14574, - Variant14575, - Variant14576, - Variant14577, - Variant14578, - Variant14579, - Variant14580, - Variant14581, - Variant14582, - Variant14583, - Variant14584, - Variant14585, - Variant14586, - Variant14587, - Variant14588, - Variant14589, - Variant14590, - Variant14591, - Variant14592, - Variant14593, - Variant14594, - Variant14595, - Variant14596, - Variant14597, - Variant14598, - Variant14599, - Variant14600, - Variant14601, - Variant14602, - Variant14603, - Variant14604, - Variant14605, - Variant14606, - Variant14607, - Variant14608, - Variant14609, - Variant14610, - Variant14611, - Variant14612, - Variant14613, - Variant14614, - Variant14615, - Variant14616, - Variant14617, - Variant14618, - Variant14619, - Variant14620, - Variant14621, - Variant14622, - Variant14623, - Variant14624, - Variant14625, - Variant14626, - Variant14627, - Variant14628, - Variant14629, - Variant14630, - Variant14631, - Variant14632, - Variant14633, - Variant14634, - Variant14635, - Variant14636, - Variant14637, - Variant14638, - Variant14639, - Variant14640, - Variant14641, - Variant14642, - Variant14643, - Variant14644, - Variant14645, - Variant14646, - Variant14647, - Variant14648, - Variant14649, - Variant14650, - Variant14651, - Variant14652, - Variant14653, - Variant14654, - Variant14655, - Variant14656, - Variant14657, - Variant14658, - Variant14659, - Variant14660, - Variant14661, - Variant14662, - Variant14663, - Variant14664, - Variant14665, - Variant14666, - Variant14667, - Variant14668, - Variant14669, - Variant14670, - Variant14671, - Variant14672, - Variant14673, - Variant14674, - Variant14675, - Variant14676, - Variant14677, - Variant14678, - Variant14679, - Variant14680, - Variant14681, - Variant14682, - Variant14683, - Variant14684, - Variant14685, - Variant14686, - Variant14687, - Variant14688, - Variant14689, - Variant14690, - Variant14691, - Variant14692, - Variant14693, - Variant14694, - Variant14695, - Variant14696, - Variant14697, - Variant14698, - Variant14699, - Variant14700, - Variant14701, - Variant14702, - Variant14703, - Variant14704, - Variant14705, - Variant14706, - Variant14707, - Variant14708, - Variant14709, - Variant14710, - Variant14711, - Variant14712, - Variant14713, - Variant14714, - Variant14715, - Variant14716, - Variant14717, - Variant14718, - Variant14719, - Variant14720, - Variant14721, - Variant14722, - Variant14723, - Variant14724, - Variant14725, - Variant14726, - Variant14727, - Variant14728, - Variant14729, - Variant14730, - Variant14731, - Variant14732, - Variant14733, - Variant14734, - Variant14735, - Variant14736, - Variant14737, - Variant14738, - Variant14739, - Variant14740, - Variant14741, - Variant14742, - Variant14743, - Variant14744, - Variant14745, - Variant14746, - Variant14747, - Variant14748, - Variant14749, - Variant14750, - Variant14751, - Variant14752, - Variant14753, - Variant14754, - Variant14755, - Variant14756, - Variant14757, - Variant14758, - Variant14759, - Variant14760, - Variant14761, - Variant14762, - Variant14763, - Variant14764, - Variant14765, - Variant14766, - Variant14767, - Variant14768, - Variant14769, - Variant14770, - Variant14771, - Variant14772, - Variant14773, - Variant14774, - Variant14775, - Variant14776, - Variant14777, - Variant14778, - Variant14779, - Variant14780, - Variant14781, - Variant14782, - Variant14783, - Variant14784, - Variant14785, - Variant14786, - Variant14787, - Variant14788, - Variant14789, - Variant14790, - Variant14791, - Variant14792, - Variant14793, - Variant14794, - Variant14795, - Variant14796, - Variant14797, - Variant14798, - Variant14799, - Variant14800, - Variant14801, - Variant14802, - Variant14803, - Variant14804, - Variant14805, - Variant14806, - Variant14807, - Variant14808, - Variant14809, - Variant14810, - Variant14811, - Variant14812, - Variant14813, - Variant14814, - Variant14815, - Variant14816, - Variant14817, - Variant14818, - Variant14819, - Variant14820, - Variant14821, - Variant14822, - Variant14823, - Variant14824, - Variant14825, - Variant14826, - Variant14827, - Variant14828, - Variant14829, - Variant14830, - Variant14831, - Variant14832, - Variant14833, - Variant14834, - Variant14835, - Variant14836, - Variant14837, - Variant14838, - Variant14839, - Variant14840, - Variant14841, - Variant14842, - Variant14843, - Variant14844, - Variant14845, - Variant14846, - Variant14847, - Variant14848, - Variant14849, - Variant14850, - Variant14851, - Variant14852, - Variant14853, - Variant14854, - Variant14855, - Variant14856, - Variant14857, - Variant14858, - Variant14859, - Variant14860, - Variant14861, - Variant14862, - Variant14863, - Variant14864, - Variant14865, - Variant14866, - Variant14867, - Variant14868, - Variant14869, - Variant14870, - Variant14871, - Variant14872, - Variant14873, - Variant14874, - Variant14875, - Variant14876, - Variant14877, - Variant14878, - Variant14879, - Variant14880, - Variant14881, - Variant14882, - Variant14883, - Variant14884, - Variant14885, - Variant14886, - Variant14887, - Variant14888, - Variant14889, - Variant14890, - Variant14891, - Variant14892, - Variant14893, - Variant14894, - Variant14895, - Variant14896, - Variant14897, - Variant14898, - Variant14899, - Variant14900, - Variant14901, - Variant14902, - Variant14903, - Variant14904, - Variant14905, - Variant14906, - Variant14907, - Variant14908, - Variant14909, - Variant14910, - Variant14911, - Variant14912, - Variant14913, - Variant14914, - Variant14915, - Variant14916, - Variant14917, - Variant14918, - Variant14919, - Variant14920, - Variant14921, - Variant14922, - Variant14923, - Variant14924, - Variant14925, - Variant14926, - Variant14927, - Variant14928, - Variant14929, - Variant14930, - Variant14931, - Variant14932, - Variant14933, - Variant14934, - Variant14935, - Variant14936, - Variant14937, - Variant14938, - Variant14939, - Variant14940, - Variant14941, - Variant14942, - Variant14943, - Variant14944, - Variant14945, - Variant14946, - Variant14947, - Variant14948, - Variant14949, - Variant14950, - Variant14951, - Variant14952, - Variant14953, - Variant14954, - Variant14955, - Variant14956, - Variant14957, - Variant14958, - Variant14959, - Variant14960, - Variant14961, - Variant14962, - Variant14963, - Variant14964, - Variant14965, - Variant14966, - Variant14967, - Variant14968, - Variant14969, - Variant14970, - Variant14971, - Variant14972, - Variant14973, - Variant14974, - Variant14975, - Variant14976, - Variant14977, - Variant14978, - Variant14979, - Variant14980, - Variant14981, - Variant14982, - Variant14983, - Variant14984, - Variant14985, - Variant14986, - Variant14987, - Variant14988, - Variant14989, - Variant14990, - Variant14991, - Variant14992, - Variant14993, - Variant14994, - Variant14995, - Variant14996, - Variant14997, - Variant14998, - Variant14999, - Variant15000, - Variant15001, - Variant15002, - Variant15003, - Variant15004, - Variant15005, - Variant15006, - Variant15007, - Variant15008, - Variant15009, - Variant15010, - Variant15011, - Variant15012, - Variant15013, - Variant15014, - Variant15015, - Variant15016, - Variant15017, - Variant15018, - Variant15019, - Variant15020, - Variant15021, - Variant15022, - Variant15023, - Variant15024, - Variant15025, - Variant15026, - Variant15027, - Variant15028, - Variant15029, - Variant15030, - Variant15031, - Variant15032, - Variant15033, - Variant15034, - Variant15035, - Variant15036, - Variant15037, - Variant15038, - Variant15039, - Variant15040, - Variant15041, - Variant15042, - Variant15043, - Variant15044, - Variant15045, - Variant15046, - Variant15047, - Variant15048, - Variant15049, - Variant15050, - Variant15051, - Variant15052, - Variant15053, - Variant15054, - Variant15055, - Variant15056, - Variant15057, - Variant15058, - Variant15059, - Variant15060, - Variant15061, - Variant15062, - Variant15063, - Variant15064, - Variant15065, - Variant15066, - Variant15067, - Variant15068, - Variant15069, - Variant15070, - Variant15071, - Variant15072, - Variant15073, - Variant15074, - Variant15075, - Variant15076, - Variant15077, - Variant15078, - Variant15079, - Variant15080, - Variant15081, - Variant15082, - Variant15083, - Variant15084, - Variant15085, - Variant15086, - Variant15087, - Variant15088, - Variant15089, - Variant15090, - Variant15091, - Variant15092, - Variant15093, - Variant15094, - Variant15095, - Variant15096, - Variant15097, - Variant15098, - Variant15099, - Variant15100, - Variant15101, - Variant15102, - Variant15103, - Variant15104, - Variant15105, - Variant15106, - Variant15107, - Variant15108, - Variant15109, - Variant15110, - Variant15111, - Variant15112, - Variant15113, - Variant15114, - Variant15115, - Variant15116, - Variant15117, - Variant15118, - Variant15119, - Variant15120, - Variant15121, - Variant15122, - Variant15123, - Variant15124, - Variant15125, - Variant15126, - Variant15127, - Variant15128, - Variant15129, - Variant15130, - Variant15131, - Variant15132, - Variant15133, - Variant15134, - Variant15135, - Variant15136, - Variant15137, - Variant15138, - Variant15139, - Variant15140, - Variant15141, - Variant15142, - Variant15143, - Variant15144, - Variant15145, - Variant15146, - Variant15147, - Variant15148, - Variant15149, - Variant15150, - Variant15151, - Variant15152, - Variant15153, - Variant15154, - Variant15155, - Variant15156, - Variant15157, - Variant15158, - Variant15159, - Variant15160, - Variant15161, - Variant15162, - Variant15163, - Variant15164, - Variant15165, - Variant15166, - Variant15167, - Variant15168, - Variant15169, - Variant15170, - Variant15171, - Variant15172, - Variant15173, - Variant15174, - Variant15175, - Variant15176, - Variant15177, - Variant15178, - Variant15179, - Variant15180, - Variant15181, - Variant15182, - Variant15183, - Variant15184, - Variant15185, - Variant15186, - Variant15187, - Variant15188, - Variant15189, - Variant15190, - Variant15191, - Variant15192, - Variant15193, - Variant15194, - Variant15195, - Variant15196, - Variant15197, - Variant15198, - Variant15199, - Variant15200, - Variant15201, - Variant15202, - Variant15203, - Variant15204, - Variant15205, - Variant15206, - Variant15207, - Variant15208, - Variant15209, - Variant15210, - Variant15211, - Variant15212, - Variant15213, - Variant15214, - Variant15215, - Variant15216, - Variant15217, - Variant15218, - Variant15219, - Variant15220, - Variant15221, - Variant15222, - Variant15223, - Variant15224, - Variant15225, - Variant15226, - Variant15227, - Variant15228, - Variant15229, - Variant15230, - Variant15231, - Variant15232, - Variant15233, - Variant15234, - Variant15235, - Variant15236, - Variant15237, - Variant15238, - Variant15239, - Variant15240, - Variant15241, - Variant15242, - Variant15243, - Variant15244, - Variant15245, - Variant15246, - Variant15247, - Variant15248, - Variant15249, - Variant15250, - Variant15251, - Variant15252, - Variant15253, - Variant15254, - Variant15255, - Variant15256, - Variant15257, - Variant15258, - Variant15259, - Variant15260, - Variant15261, - Variant15262, - Variant15263, - Variant15264, - Variant15265, - Variant15266, - Variant15267, - Variant15268, - Variant15269, - Variant15270, - Variant15271, - Variant15272, - Variant15273, - Variant15274, - Variant15275, - Variant15276, - Variant15277, - Variant15278, - Variant15279, - Variant15280, - Variant15281, - Variant15282, - Variant15283, - Variant15284, - Variant15285, - Variant15286, - Variant15287, - Variant15288, - Variant15289, - Variant15290, - Variant15291, - Variant15292, - Variant15293, - Variant15294, - Variant15295, - Variant15296, - Variant15297, - Variant15298, - Variant15299, - Variant15300, - Variant15301, - Variant15302, - Variant15303, - Variant15304, - Variant15305, - Variant15306, - Variant15307, - Variant15308, - Variant15309, - Variant15310, - Variant15311, - Variant15312, - Variant15313, - Variant15314, - Variant15315, - Variant15316, - Variant15317, - Variant15318, - Variant15319, - Variant15320, - Variant15321, - Variant15322, - Variant15323, - Variant15324, - Variant15325, - Variant15326, - Variant15327, - Variant15328, - Variant15329, - Variant15330, - Variant15331, - Variant15332, - Variant15333, - Variant15334, - Variant15335, - Variant15336, - Variant15337, - Variant15338, - Variant15339, - Variant15340, - Variant15341, - Variant15342, - Variant15343, - Variant15344, - Variant15345, - Variant15346, - Variant15347, - Variant15348, - Variant15349, - Variant15350, - Variant15351, - Variant15352, - Variant15353, - Variant15354, - Variant15355, - Variant15356, - Variant15357, - Variant15358, - Variant15359, - Variant15360, - Variant15361, - Variant15362, - Variant15363, - Variant15364, - Variant15365, - Variant15366, - Variant15367, - Variant15368, - Variant15369, - Variant15370, - Variant15371, - Variant15372, - Variant15373, - Variant15374, - Variant15375, - Variant15376, - Variant15377, - Variant15378, - Variant15379, - Variant15380, - Variant15381, - Variant15382, - Variant15383, - Variant15384, - Variant15385, - Variant15386, - Variant15387, - Variant15388, - Variant15389, - Variant15390, - Variant15391, - Variant15392, - Variant15393, - Variant15394, - Variant15395, - Variant15396, - Variant15397, - Variant15398, - Variant15399, - Variant15400, - Variant15401, - Variant15402, - Variant15403, - Variant15404, - Variant15405, - Variant15406, - Variant15407, - Variant15408, - Variant15409, - Variant15410, - Variant15411, - Variant15412, - Variant15413, - Variant15414, - Variant15415, - Variant15416, - Variant15417, - Variant15418, - Variant15419, - Variant15420, - Variant15421, - Variant15422, - Variant15423, - Variant15424, - Variant15425, - Variant15426, - Variant15427, - Variant15428, - Variant15429, - Variant15430, - Variant15431, - Variant15432, - Variant15433, - Variant15434, - Variant15435, - Variant15436, - Variant15437, - Variant15438, - Variant15439, - Variant15440, - Variant15441, - Variant15442, - Variant15443, - Variant15444, - Variant15445, - Variant15446, - Variant15447, - Variant15448, - Variant15449, - Variant15450, - Variant15451, - Variant15452, - Variant15453, - Variant15454, - Variant15455, - Variant15456, - Variant15457, - Variant15458, - Variant15459, - Variant15460, - Variant15461, - Variant15462, - Variant15463, - Variant15464, - Variant15465, - Variant15466, - Variant15467, - Variant15468, - Variant15469, - Variant15470, - Variant15471, - Variant15472, - Variant15473, - Variant15474, - Variant15475, - Variant15476, - Variant15477, - Variant15478, - Variant15479, - Variant15480, - Variant15481, - Variant15482, - Variant15483, - Variant15484, - Variant15485, - Variant15486, - Variant15487, - Variant15488, - Variant15489, - Variant15490, - Variant15491, - Variant15492, - Variant15493, - Variant15494, - Variant15495, - Variant15496, - Variant15497, - Variant15498, - Variant15499, - Variant15500, - Variant15501, - Variant15502, - Variant15503, - Variant15504, - Variant15505, - Variant15506, - Variant15507, - Variant15508, - Variant15509, - Variant15510, - Variant15511, - Variant15512, - Variant15513, - Variant15514, - Variant15515, - Variant15516, - Variant15517, - Variant15518, - Variant15519, - Variant15520, - Variant15521, - Variant15522, - Variant15523, - Variant15524, - Variant15525, - Variant15526, - Variant15527, - Variant15528, - Variant15529, - Variant15530, - Variant15531, - Variant15532, - Variant15533, - Variant15534, - Variant15535, - Variant15536, - Variant15537, - Variant15538, - Variant15539, - Variant15540, - Variant15541, - Variant15542, - Variant15543, - Variant15544, - Variant15545, - Variant15546, - Variant15547, - Variant15548, - Variant15549, - Variant15550, - Variant15551, - Variant15552, - Variant15553, - Variant15554, - Variant15555, - Variant15556, - Variant15557, - Variant15558, - Variant15559, - Variant15560, - Variant15561, - Variant15562, - Variant15563, - Variant15564, - Variant15565, - Variant15566, - Variant15567, - Variant15568, - Variant15569, - Variant15570, - Variant15571, - Variant15572, - Variant15573, - Variant15574, - Variant15575, - Variant15576, - Variant15577, - Variant15578, - Variant15579, - Variant15580, - Variant15581, - Variant15582, - Variant15583, - Variant15584, - Variant15585, - Variant15586, - Variant15587, - Variant15588, - Variant15589, - Variant15590, - Variant15591, - Variant15592, - Variant15593, - Variant15594, - Variant15595, - Variant15596, - Variant15597, - Variant15598, - Variant15599, - Variant15600, - Variant15601, - Variant15602, - Variant15603, - Variant15604, - Variant15605, - Variant15606, - Variant15607, - Variant15608, - Variant15609, - Variant15610, - Variant15611, - Variant15612, - Variant15613, - Variant15614, - Variant15615, - Variant15616, - Variant15617, - Variant15618, - Variant15619, - Variant15620, - Variant15621, - Variant15622, - Variant15623, - Variant15624, - Variant15625, - Variant15626, - Variant15627, - Variant15628, - Variant15629, - Variant15630, - Variant15631, - Variant15632, - Variant15633, - Variant15634, - Variant15635, - Variant15636, - Variant15637, - Variant15638, - Variant15639, - Variant15640, - Variant15641, - Variant15642, - Variant15643, - Variant15644, - Variant15645, - Variant15646, - Variant15647, - Variant15648, - Variant15649, - Variant15650, - Variant15651, - Variant15652, - Variant15653, - Variant15654, - Variant15655, - Variant15656, - Variant15657, - Variant15658, - Variant15659, - Variant15660, - Variant15661, - Variant15662, - Variant15663, - Variant15664, - Variant15665, - Variant15666, - Variant15667, - Variant15668, - Variant15669, - Variant15670, - Variant15671, - Variant15672, - Variant15673, - Variant15674, - Variant15675, - Variant15676, - Variant15677, - Variant15678, - Variant15679, - Variant15680, - Variant15681, - Variant15682, - Variant15683, - Variant15684, - Variant15685, - Variant15686, - Variant15687, - Variant15688, - Variant15689, - Variant15690, - Variant15691, - Variant15692, - Variant15693, - Variant15694, - Variant15695, - Variant15696, - Variant15697, - Variant15698, - Variant15699, - Variant15700, - Variant15701, - Variant15702, - Variant15703, - Variant15704, - Variant15705, - Variant15706, - Variant15707, - Variant15708, - Variant15709, - Variant15710, - Variant15711, - Variant15712, - Variant15713, - Variant15714, - Variant15715, - Variant15716, - Variant15717, - Variant15718, - Variant15719, - Variant15720, - Variant15721, - Variant15722, - Variant15723, - Variant15724, - Variant15725, - Variant15726, - Variant15727, - Variant15728, - Variant15729, - Variant15730, - Variant15731, - Variant15732, - Variant15733, - Variant15734, - Variant15735, - Variant15736, - Variant15737, - Variant15738, - Variant15739, - Variant15740, - Variant15741, - Variant15742, - Variant15743, - Variant15744, - Variant15745, - Variant15746, - Variant15747, - Variant15748, - Variant15749, - Variant15750, - Variant15751, - Variant15752, - Variant15753, - Variant15754, - Variant15755, - Variant15756, - Variant15757, - Variant15758, - Variant15759, - Variant15760, - Variant15761, - Variant15762, - Variant15763, - Variant15764, - Variant15765, - Variant15766, - Variant15767, - Variant15768, - Variant15769, - Variant15770, - Variant15771, - Variant15772, - Variant15773, - Variant15774, - Variant15775, - Variant15776, - Variant15777, - Variant15778, - Variant15779, - Variant15780, - Variant15781, - Variant15782, - Variant15783, - Variant15784, - Variant15785, - Variant15786, - Variant15787, - Variant15788, - Variant15789, - Variant15790, - Variant15791, - Variant15792, - Variant15793, - Variant15794, - Variant15795, - Variant15796, - Variant15797, - Variant15798, - Variant15799, - Variant15800, - Variant15801, - Variant15802, - Variant15803, - Variant15804, - Variant15805, - Variant15806, - Variant15807, - Variant15808, - Variant15809, - Variant15810, - Variant15811, - Variant15812, - Variant15813, - Variant15814, - Variant15815, - Variant15816, - Variant15817, - Variant15818, - Variant15819, - Variant15820, - Variant15821, - Variant15822, - Variant15823, - Variant15824, - Variant15825, - Variant15826, - Variant15827, - Variant15828, - Variant15829, - Variant15830, - Variant15831, - Variant15832, - Variant15833, - Variant15834, - Variant15835, - Variant15836, - Variant15837, - Variant15838, - Variant15839, - Variant15840, - Variant15841, - Variant15842, - Variant15843, - Variant15844, - Variant15845, - Variant15846, - Variant15847, - Variant15848, - Variant15849, - Variant15850, - Variant15851, - Variant15852, - Variant15853, - Variant15854, - Variant15855, - Variant15856, - Variant15857, - Variant15858, - Variant15859, - Variant15860, - Variant15861, - Variant15862, - Variant15863, - Variant15864, - Variant15865, - Variant15866, - Variant15867, - Variant15868, - Variant15869, - Variant15870, - Variant15871, - Variant15872, - Variant15873, - Variant15874, - Variant15875, - Variant15876, - Variant15877, - Variant15878, - Variant15879, - Variant15880, - Variant15881, - Variant15882, - Variant15883, - Variant15884, - Variant15885, - Variant15886, - Variant15887, - Variant15888, - Variant15889, - Variant15890, - Variant15891, - Variant15892, - Variant15893, - Variant15894, - Variant15895, - Variant15896, - Variant15897, - Variant15898, - Variant15899, - Variant15900, - Variant15901, - Variant15902, - Variant15903, - Variant15904, - Variant15905, - Variant15906, - Variant15907, - Variant15908, - Variant15909, - Variant15910, - Variant15911, - Variant15912, - Variant15913, - Variant15914, - Variant15915, - Variant15916, - Variant15917, - Variant15918, - Variant15919, - Variant15920, - Variant15921, - Variant15922, - Variant15923, - Variant15924, - Variant15925, - Variant15926, - Variant15927, - Variant15928, - Variant15929, - Variant15930, - Variant15931, - Variant15932, - Variant15933, - Variant15934, - Variant15935, - Variant15936, - Variant15937, - Variant15938, - Variant15939, - Variant15940, - Variant15941, - Variant15942, - Variant15943, - Variant15944, - Variant15945, - Variant15946, - Variant15947, - Variant15948, - Variant15949, - Variant15950, - Variant15951, - Variant15952, - Variant15953, - Variant15954, - Variant15955, - Variant15956, - Variant15957, - Variant15958, - Variant15959, - Variant15960, - Variant15961, - Variant15962, - Variant15963, - Variant15964, - Variant15965, - Variant15966, - Variant15967, - Variant15968, - Variant15969, - Variant15970, - Variant15971, - Variant15972, - Variant15973, - Variant15974, - Variant15975, - Variant15976, - Variant15977, - Variant15978, - Variant15979, - Variant15980, - Variant15981, - Variant15982, - Variant15983, - Variant15984, - Variant15985, - Variant15986, - Variant15987, - Variant15988, - Variant15989, - Variant15990, - Variant15991, - Variant15992, - Variant15993, - Variant15994, - Variant15995, - Variant15996, - Variant15997, - Variant15998, - Variant15999, - Variant16000, - Variant16001, - Variant16002, - Variant16003, - Variant16004, - Variant16005, - Variant16006, - Variant16007, - Variant16008, - Variant16009, - Variant16010, - Variant16011, - Variant16012, - Variant16013, - Variant16014, - Variant16015, - Variant16016, - Variant16017, - Variant16018, - Variant16019, - Variant16020, - Variant16021, - Variant16022, - Variant16023, - Variant16024, - Variant16025, - Variant16026, - Variant16027, - Variant16028, - Variant16029, - Variant16030, - Variant16031, - Variant16032, - Variant16033, - Variant16034, - Variant16035, - Variant16036, - Variant16037, - Variant16038, - Variant16039, - Variant16040, - Variant16041, - Variant16042, - Variant16043, - Variant16044, - Variant16045, - Variant16046, - Variant16047, - Variant16048, - Variant16049, - Variant16050, - Variant16051, - Variant16052, - Variant16053, - Variant16054, - Variant16055, - Variant16056, - Variant16057, - Variant16058, - Variant16059, - Variant16060, - Variant16061, - Variant16062, - Variant16063, - Variant16064, - Variant16065, - Variant16066, - Variant16067, - Variant16068, - Variant16069, - Variant16070, - Variant16071, - Variant16072, - Variant16073, - Variant16074, - Variant16075, - Variant16076, - Variant16077, - Variant16078, - Variant16079, - Variant16080, - Variant16081, - Variant16082, - Variant16083, - Variant16084, - Variant16085, - Variant16086, - Variant16087, - Variant16088, - Variant16089, - Variant16090, - Variant16091, - Variant16092, - Variant16093, - Variant16094, - Variant16095, - Variant16096, - Variant16097, - Variant16098, - Variant16099, - Variant16100, - Variant16101, - Variant16102, - Variant16103, - Variant16104, - Variant16105, - Variant16106, - Variant16107, - Variant16108, - Variant16109, - Variant16110, - Variant16111, - Variant16112, - Variant16113, - Variant16114, - Variant16115, - Variant16116, - Variant16117, - Variant16118, - Variant16119, - Variant16120, - Variant16121, - Variant16122, - Variant16123, - Variant16124, - Variant16125, - Variant16126, - Variant16127, - Variant16128, - Variant16129, - Variant16130, - Variant16131, - Variant16132, - Variant16133, - Variant16134, - Variant16135, - Variant16136, - Variant16137, - Variant16138, - Variant16139, - Variant16140, - Variant16141, - Variant16142, - Variant16143, - Variant16144, - Variant16145, - Variant16146, - Variant16147, - Variant16148, - Variant16149, - Variant16150, - Variant16151, - Variant16152, - Variant16153, - Variant16154, - Variant16155, - Variant16156, - Variant16157, - Variant16158, - Variant16159, - Variant16160, - Variant16161, - Variant16162, - Variant16163, - Variant16164, - Variant16165, - Variant16166, - Variant16167, - Variant16168, - Variant16169, - Variant16170, - Variant16171, - Variant16172, - Variant16173, - Variant16174, - Variant16175, - Variant16176, - Variant16177, - Variant16178, - Variant16179, - Variant16180, - Variant16181, - Variant16182, - Variant16183, - Variant16184, - Variant16185, - Variant16186, - Variant16187, - Variant16188, - Variant16189, - Variant16190, - Variant16191, - Variant16192, - Variant16193, - Variant16194, - Variant16195, - Variant16196, - Variant16197, - Variant16198, - Variant16199, - Variant16200, - Variant16201, - Variant16202, - Variant16203, - Variant16204, - Variant16205, - Variant16206, - Variant16207, - Variant16208, - Variant16209, - Variant16210, - Variant16211, - Variant16212, - Variant16213, - Variant16214, - Variant16215, - Variant16216, - Variant16217, - Variant16218, - Variant16219, - Variant16220, - Variant16221, - Variant16222, - Variant16223, - Variant16224, - Variant16225, - Variant16226, - Variant16227, - Variant16228, - Variant16229, - Variant16230, - Variant16231, - Variant16232, - Variant16233, - Variant16234, - Variant16235, - Variant16236, - Variant16237, - Variant16238, - Variant16239, - Variant16240, - Variant16241, - Variant16242, - Variant16243, - Variant16244, - Variant16245, - Variant16246, - Variant16247, - Variant16248, - Variant16249, - Variant16250, - Variant16251, - Variant16252, - Variant16253, - Variant16254, - Variant16255, - Variant16256, - Variant16257, - Variant16258, - Variant16259, - Variant16260, - Variant16261, - Variant16262, - Variant16263, - Variant16264, - Variant16265, - Variant16266, - Variant16267, - Variant16268, - Variant16269, - Variant16270, - Variant16271, - Variant16272, - Variant16273, - Variant16274, - Variant16275, - Variant16276, - Variant16277, - Variant16278, - Variant16279, - Variant16280, - Variant16281, - Variant16282, - Variant16283, - Variant16284, - Variant16285, - Variant16286, - Variant16287, - Variant16288, - Variant16289, - Variant16290, - Variant16291, - Variant16292, - Variant16293, - Variant16294, - Variant16295, - Variant16296, - Variant16297, - Variant16298, - Variant16299, - Variant16300, - Variant16301, - Variant16302, - Variant16303, - Variant16304, - Variant16305, - Variant16306, - Variant16307, - Variant16308, - Variant16309, - Variant16310, - Variant16311, - Variant16312, - Variant16313, - Variant16314, - Variant16315, - Variant16316, - Variant16317, - Variant16318, - Variant16319, - Variant16320, - Variant16321, - Variant16322, - Variant16323, - Variant16324, - Variant16325, - Variant16326, - Variant16327, - Variant16328, - Variant16329, - Variant16330, - Variant16331, - Variant16332, - Variant16333, - Variant16334, - Variant16335, - Variant16336, - Variant16337, - Variant16338, - Variant16339, - Variant16340, - Variant16341, - Variant16342, - Variant16343, - Variant16344, - Variant16345, - Variant16346, - Variant16347, - Variant16348, - Variant16349, - Variant16350, - Variant16351, - Variant16352, - Variant16353, - Variant16354, - Variant16355, - Variant16356, - Variant16357, - Variant16358, - Variant16359, - Variant16360, - Variant16361, - Variant16362, - Variant16363, - Variant16364, - Variant16365, - Variant16366, - Variant16367, - Variant16368, - Variant16369, - Variant16370, - Variant16371, - Variant16372, - Variant16373, - Variant16374, - Variant16375, - Variant16376, - Variant16377, - Variant16378, - Variant16379, - Variant16380, - Variant16381, - Variant16382, - Variant16383, - Variant16384, - Variant16385, - Variant16386, - Variant16387, - Variant16388, - Variant16389, - Variant16390, - Variant16391, - Variant16392, - Variant16393, - Variant16394, - Variant16395, - Variant16396, - Variant16397, - Variant16398, - Variant16399, - Variant16400, - Variant16401, - Variant16402, - Variant16403, - Variant16404, - Variant16405, - Variant16406, - Variant16407, - Variant16408, - Variant16409, - Variant16410, - Variant16411, - Variant16412, - Variant16413, - Variant16414, - Variant16415, - Variant16416, - Variant16417, - Variant16418, - Variant16419, - Variant16420, - Variant16421, - Variant16422, - Variant16423, - Variant16424, - Variant16425, - Variant16426, - Variant16427, - Variant16428, - Variant16429, - Variant16430, - Variant16431, - Variant16432, - Variant16433, - Variant16434, - Variant16435, - Variant16436, - Variant16437, - Variant16438, - Variant16439, - Variant16440, - Variant16441, - Variant16442, - Variant16443, - Variant16444, - Variant16445, - Variant16446, - Variant16447, - Variant16448, - Variant16449, - Variant16450, - Variant16451, - Variant16452, - Variant16453, - Variant16454, - Variant16455, - Variant16456, - Variant16457, - Variant16458, - Variant16459, - Variant16460, - Variant16461, - Variant16462, - Variant16463, - Variant16464, - Variant16465, - Variant16466, - Variant16467, - Variant16468, - Variant16469, - Variant16470, - Variant16471, - Variant16472, - Variant16473, - Variant16474, - Variant16475, - Variant16476, - Variant16477, - Variant16478, - Variant16479, - Variant16480, - Variant16481, - Variant16482, - Variant16483, - Variant16484, - Variant16485, - Variant16486, - Variant16487, - Variant16488, - Variant16489, - Variant16490, - Variant16491, - Variant16492, - Variant16493, - Variant16494, - Variant16495, - Variant16496, - Variant16497, - Variant16498, - Variant16499, - Variant16500, - Variant16501, - Variant16502, - Variant16503, - Variant16504, - Variant16505, - Variant16506, - Variant16507, - Variant16508, - Variant16509, - Variant16510, - Variant16511, - Variant16512, - Variant16513, - Variant16514, - Variant16515, - Variant16516, - Variant16517, - Variant16518, - Variant16519, - Variant16520, - Variant16521, - Variant16522, - Variant16523, - Variant16524, - Variant16525, - Variant16526, - Variant16527, - Variant16528, - Variant16529, - Variant16530, - Variant16531, - Variant16532, - Variant16533, - Variant16534, - Variant16535, - Variant16536, - Variant16537, - Variant16538, - Variant16539, - Variant16540, - Variant16541, - Variant16542, - Variant16543, - Variant16544, - Variant16545, - Variant16546, - Variant16547, - Variant16548, - Variant16549, - Variant16550, - Variant16551, - Variant16552, - Variant16553, - Variant16554, - Variant16555, - Variant16556, - Variant16557, - Variant16558, - Variant16559, - Variant16560, - Variant16561, - Variant16562, - Variant16563, - Variant16564, - Variant16565, - Variant16566, - Variant16567, - Variant16568, - Variant16569, - Variant16570, - Variant16571, - Variant16572, - Variant16573, - Variant16574, - Variant16575, - Variant16576, - Variant16577, - Variant16578, - Variant16579, - Variant16580, - Variant16581, - Variant16582, - Variant16583, - Variant16584, - Variant16585, - Variant16586, - Variant16587, - Variant16588, - Variant16589, - Variant16590, - Variant16591, - Variant16592, - Variant16593, - Variant16594, - Variant16595, - Variant16596, - Variant16597, - Variant16598, - Variant16599, - Variant16600, - Variant16601, - Variant16602, - Variant16603, - Variant16604, - Variant16605, - Variant16606, - Variant16607, - Variant16608, - Variant16609, - Variant16610, - Variant16611, - Variant16612, - Variant16613, - Variant16614, - Variant16615, - Variant16616, - Variant16617, - Variant16618, - Variant16619, - Variant16620, - Variant16621, - Variant16622, - Variant16623, - Variant16624, - Variant16625, - Variant16626, - Variant16627, - Variant16628, - Variant16629, - Variant16630, - Variant16631, - Variant16632, - Variant16633, - Variant16634, - Variant16635, - Variant16636, - Variant16637, - Variant16638, - Variant16639, - Variant16640, - Variant16641, - Variant16642, - Variant16643, - Variant16644, - Variant16645, - Variant16646, - Variant16647, - Variant16648, - Variant16649, - Variant16650, - Variant16651, - Variant16652, - Variant16653, - Variant16654, - Variant16655, - Variant16656, - Variant16657, - Variant16658, - Variant16659, - Variant16660, - Variant16661, - Variant16662, - Variant16663, - Variant16664, - Variant16665, - Variant16666, - Variant16667, - Variant16668, - Variant16669, - Variant16670, - Variant16671, - Variant16672, - Variant16673, - Variant16674, - Variant16675, - Variant16676, - Variant16677, - Variant16678, - Variant16679, - Variant16680, - Variant16681, - Variant16682, - Variant16683, - Variant16684, - Variant16685, - Variant16686, - Variant16687, - Variant16688, - Variant16689, - Variant16690, - Variant16691, - Variant16692, - Variant16693, - Variant16694, - Variant16695, - Variant16696, - Variant16697, - Variant16698, - Variant16699, - Variant16700, - Variant16701, - Variant16702, - Variant16703, - Variant16704, - Variant16705, - Variant16706, - Variant16707, - Variant16708, - Variant16709, - Variant16710, - Variant16711, - Variant16712, - Variant16713, - Variant16714, - Variant16715, - Variant16716, - Variant16717, - Variant16718, - Variant16719, - Variant16720, - Variant16721, - Variant16722, - Variant16723, - Variant16724, - Variant16725, - Variant16726, - Variant16727, - Variant16728, - Variant16729, - Variant16730, - Variant16731, - Variant16732, - Variant16733, - Variant16734, - Variant16735, - Variant16736, - Variant16737, - Variant16738, - Variant16739, - Variant16740, - Variant16741, - Variant16742, - Variant16743, - Variant16744, - Variant16745, - Variant16746, - Variant16747, - Variant16748, - Variant16749, - Variant16750, - Variant16751, - Variant16752, - Variant16753, - Variant16754, - Variant16755, - Variant16756, - Variant16757, - Variant16758, - Variant16759, - Variant16760, - Variant16761, - Variant16762, - Variant16763, - Variant16764, - Variant16765, - Variant16766, - Variant16767, - Variant16768, - Variant16769, - Variant16770, - Variant16771, - Variant16772, - Variant16773, - Variant16774, - Variant16775, - Variant16776, - Variant16777, - Variant16778, - Variant16779, - Variant16780, - Variant16781, - Variant16782, - Variant16783, - Variant16784, - Variant16785, - Variant16786, - Variant16787, - Variant16788, - Variant16789, - Variant16790, - Variant16791, - Variant16792, - Variant16793, - Variant16794, - Variant16795, - Variant16796, - Variant16797, - Variant16798, - Variant16799, - Variant16800, - Variant16801, - Variant16802, - Variant16803, - Variant16804, - Variant16805, - Variant16806, - Variant16807, - Variant16808, - Variant16809, - Variant16810, - Variant16811, - Variant16812, - Variant16813, - Variant16814, - Variant16815, - Variant16816, - Variant16817, - Variant16818, - Variant16819, - Variant16820, - Variant16821, - Variant16822, - Variant16823, - Variant16824, - Variant16825, - Variant16826, - Variant16827, - Variant16828, - Variant16829, - Variant16830, - Variant16831, - Variant16832, - Variant16833, - Variant16834, - Variant16835, - Variant16836, - Variant16837, - Variant16838, - Variant16839, - Variant16840, - Variant16841, - Variant16842, - Variant16843, - Variant16844, - Variant16845, - Variant16846, - Variant16847, - Variant16848, - Variant16849, - Variant16850, - Variant16851, - Variant16852, - Variant16853, - Variant16854, - Variant16855, - Variant16856, - Variant16857, - Variant16858, - Variant16859, - Variant16860, - Variant16861, - Variant16862, - Variant16863, - Variant16864, - Variant16865, - Variant16866, - Variant16867, - Variant16868, - Variant16869, - Variant16870, - Variant16871, - Variant16872, - Variant16873, - Variant16874, - Variant16875, - Variant16876, - Variant16877, - Variant16878, - Variant16879, - Variant16880, - Variant16881, - Variant16882, - Variant16883, - Variant16884, - Variant16885, - Variant16886, - Variant16887, - Variant16888, - Variant16889, - Variant16890, - Variant16891, - Variant16892, - Variant16893, - Variant16894, - Variant16895, - Variant16896, - Variant16897, - Variant16898, - Variant16899, - Variant16900, - Variant16901, - Variant16902, - Variant16903, - Variant16904, - Variant16905, - Variant16906, - Variant16907, - Variant16908, - Variant16909, - Variant16910, - Variant16911, - Variant16912, - Variant16913, - Variant16914, - Variant16915, - Variant16916, - Variant16917, - Variant16918, - Variant16919, - Variant16920, - Variant16921, - Variant16922, - Variant16923, - Variant16924, - Variant16925, - Variant16926, - Variant16927, - Variant16928, - Variant16929, - Variant16930, - Variant16931, - Variant16932, - Variant16933, - Variant16934, - Variant16935, - Variant16936, - Variant16937, - Variant16938, - Variant16939, - Variant16940, - Variant16941, - Variant16942, - Variant16943, - Variant16944, - Variant16945, - Variant16946, - Variant16947, - Variant16948, - Variant16949, - Variant16950, - Variant16951, - Variant16952, - Variant16953, - Variant16954, - Variant16955, - Variant16956, - Variant16957, - Variant16958, - Variant16959, - Variant16960, - Variant16961, - Variant16962, - Variant16963, - Variant16964, - Variant16965, - Variant16966, - Variant16967, - Variant16968, - Variant16969, - Variant16970, - Variant16971, - Variant16972, - Variant16973, - Variant16974, - Variant16975, - Variant16976, - Variant16977, - Variant16978, - Variant16979, - Variant16980, - Variant16981, - Variant16982, - Variant16983, - Variant16984, - Variant16985, - Variant16986, - Variant16987, - Variant16988, - Variant16989, - Variant16990, - Variant16991, - Variant16992, - Variant16993, - Variant16994, - Variant16995, - Variant16996, - Variant16997, - Variant16998, - Variant16999, - Variant17000, - Variant17001, - Variant17002, - Variant17003, - Variant17004, - Variant17005, - Variant17006, - Variant17007, - Variant17008, - Variant17009, - Variant17010, - Variant17011, - Variant17012, - Variant17013, - Variant17014, - Variant17015, - Variant17016, - Variant17017, - Variant17018, - Variant17019, - Variant17020, - Variant17021, - Variant17022, - Variant17023, - Variant17024, - Variant17025, - Variant17026, - Variant17027, - Variant17028, - Variant17029, - Variant17030, - Variant17031, - Variant17032, - Variant17033, - Variant17034, - Variant17035, - Variant17036, - Variant17037, - Variant17038, - Variant17039, - Variant17040, - Variant17041, - Variant17042, - Variant17043, - Variant17044, - Variant17045, - Variant17046, - Variant17047, - Variant17048, - Variant17049, - Variant17050, - Variant17051, - Variant17052, - Variant17053, - Variant17054, - Variant17055, - Variant17056, - Variant17057, - Variant17058, - Variant17059, - Variant17060, - Variant17061, - Variant17062, - Variant17063, - Variant17064, - Variant17065, - Variant17066, - Variant17067, - Variant17068, - Variant17069, - Variant17070, - Variant17071, - Variant17072, - Variant17073, - Variant17074, - Variant17075, - Variant17076, - Variant17077, - Variant17078, - Variant17079, - Variant17080, - Variant17081, - Variant17082, - Variant17083, - Variant17084, - Variant17085, - Variant17086, - Variant17087, - Variant17088, - Variant17089, - Variant17090, - Variant17091, - Variant17092, - Variant17093, - Variant17094, - Variant17095, - Variant17096, - Variant17097, - Variant17098, - Variant17099, - Variant17100, - Variant17101, - Variant17102, - Variant17103, - Variant17104, - Variant17105, - Variant17106, - Variant17107, - Variant17108, - Variant17109, - Variant17110, - Variant17111, - Variant17112, - Variant17113, - Variant17114, - Variant17115, - Variant17116, - Variant17117, - Variant17118, - Variant17119, - Variant17120, - Variant17121, - Variant17122, - Variant17123, - Variant17124, - Variant17125, - Variant17126, - Variant17127, - Variant17128, - Variant17129, - Variant17130, - Variant17131, - Variant17132, - Variant17133, - Variant17134, - Variant17135, - Variant17136, - Variant17137, - Variant17138, - Variant17139, - Variant17140, - Variant17141, - Variant17142, - Variant17143, - Variant17144, - Variant17145, - Variant17146, - Variant17147, - Variant17148, - Variant17149, - Variant17150, - Variant17151, - Variant17152, - Variant17153, - Variant17154, - Variant17155, - Variant17156, - Variant17157, - Variant17158, - Variant17159, - Variant17160, - Variant17161, - Variant17162, - Variant17163, - Variant17164, - Variant17165, - Variant17166, - Variant17167, - Variant17168, - Variant17169, - Variant17170, - Variant17171, - Variant17172, - Variant17173, - Variant17174, - Variant17175, - Variant17176, - Variant17177, - Variant17178, - Variant17179, - Variant17180, - Variant17181, - Variant17182, - Variant17183, - Variant17184, - Variant17185, - Variant17186, - Variant17187, - Variant17188, - Variant17189, - Variant17190, - Variant17191, - Variant17192, - Variant17193, - Variant17194, - Variant17195, - Variant17196, - Variant17197, - Variant17198, - Variant17199, - Variant17200, - Variant17201, - Variant17202, - Variant17203, - Variant17204, - Variant17205, - Variant17206, - Variant17207, - Variant17208, - Variant17209, - Variant17210, - Variant17211, - Variant17212, - Variant17213, - Variant17214, - Variant17215, - Variant17216, - Variant17217, - Variant17218, - Variant17219, - Variant17220, - Variant17221, - Variant17222, - Variant17223, - Variant17224, - Variant17225, - Variant17226, - Variant17227, - Variant17228, - Variant17229, - Variant17230, - Variant17231, - Variant17232, - Variant17233, - Variant17234, - Variant17235, - Variant17236, - Variant17237, - Variant17238, - Variant17239, - Variant17240, - Variant17241, - Variant17242, - Variant17243, - Variant17244, - Variant17245, - Variant17246, - Variant17247, - Variant17248, - Variant17249, - Variant17250, - Variant17251, - Variant17252, - Variant17253, - Variant17254, - Variant17255, - Variant17256, - Variant17257, - Variant17258, - Variant17259, - Variant17260, - Variant17261, - Variant17262, - Variant17263, - Variant17264, - Variant17265, - Variant17266, - Variant17267, - Variant17268, - Variant17269, - Variant17270, - Variant17271, - Variant17272, - Variant17273, - Variant17274, - Variant17275, - Variant17276, - Variant17277, - Variant17278, - Variant17279, - Variant17280, - Variant17281, - Variant17282, - Variant17283, - Variant17284, - Variant17285, - Variant17286, - Variant17287, - Variant17288, - Variant17289, - Variant17290, - Variant17291, - Variant17292, - Variant17293, - Variant17294, - Variant17295, - Variant17296, - Variant17297, - Variant17298, - Variant17299, - Variant17300, - Variant17301, - Variant17302, - Variant17303, - Variant17304, - Variant17305, - Variant17306, - Variant17307, - Variant17308, - Variant17309, - Variant17310, - Variant17311, - Variant17312, - Variant17313, - Variant17314, - Variant17315, - Variant17316, - Variant17317, - Variant17318, - Variant17319, - Variant17320, - Variant17321, - Variant17322, - Variant17323, - Variant17324, - Variant17325, - Variant17326, - Variant17327, - Variant17328, - Variant17329, - Variant17330, - Variant17331, - Variant17332, - Variant17333, - Variant17334, - Variant17335, - Variant17336, - Variant17337, - Variant17338, - Variant17339, - Variant17340, - Variant17341, - Variant17342, - Variant17343, - Variant17344, - Variant17345, - Variant17346, - Variant17347, - Variant17348, - Variant17349, - Variant17350, - Variant17351, - Variant17352, - Variant17353, - Variant17354, - Variant17355, - Variant17356, - Variant17357, - Variant17358, - Variant17359, - Variant17360, - Variant17361, - Variant17362, - Variant17363, - Variant17364, - Variant17365, - Variant17366, - Variant17367, - Variant17368, - Variant17369, - Variant17370, - Variant17371, - Variant17372, - Variant17373, - Variant17374, - Variant17375, - Variant17376, - Variant17377, - Variant17378, - Variant17379, - Variant17380, - Variant17381, - Variant17382, - Variant17383, - Variant17384, - Variant17385, - Variant17386, - Variant17387, - Variant17388, - Variant17389, - Variant17390, - Variant17391, - Variant17392, - Variant17393, - Variant17394, - Variant17395, - Variant17396, - Variant17397, - Variant17398, - Variant17399, - Variant17400, - Variant17401, - Variant17402, - Variant17403, - Variant17404, - Variant17405, - Variant17406, - Variant17407, - Variant17408, - Variant17409, - Variant17410, - Variant17411, - Variant17412, - Variant17413, - Variant17414, - Variant17415, - Variant17416, - Variant17417, - Variant17418, - Variant17419, - Variant17420, - Variant17421, - Variant17422, - Variant17423, - Variant17424, - Variant17425, - Variant17426, - Variant17427, - Variant17428, - Variant17429, - Variant17430, - Variant17431, - Variant17432, - Variant17433, - Variant17434, - Variant17435, - Variant17436, - Variant17437, - Variant17438, - Variant17439, - Variant17440, - Variant17441, - Variant17442, - Variant17443, - Variant17444, - Variant17445, - Variant17446, - Variant17447, - Variant17448, - Variant17449, - Variant17450, - Variant17451, - Variant17452, - Variant17453, - Variant17454, - Variant17455, - Variant17456, - Variant17457, - Variant17458, - Variant17459, - Variant17460, - Variant17461, - Variant17462, - Variant17463, - Variant17464, - Variant17465, - Variant17466, - Variant17467, - Variant17468, - Variant17469, - Variant17470, - Variant17471, - Variant17472, - Variant17473, - Variant17474, - Variant17475, - Variant17476, - Variant17477, - Variant17478, - Variant17479, - Variant17480, - Variant17481, - Variant17482, - Variant17483, - Variant17484, - Variant17485, - Variant17486, - Variant17487, - Variant17488, - Variant17489, - Variant17490, - Variant17491, - Variant17492, - Variant17493, - Variant17494, - Variant17495, - Variant17496, - Variant17497, - Variant17498, - Variant17499, - Variant17500, - Variant17501, - Variant17502, - Variant17503, - Variant17504, - Variant17505, - Variant17506, - Variant17507, - Variant17508, - Variant17509, - Variant17510, - Variant17511, - Variant17512, - Variant17513, - Variant17514, - Variant17515, - Variant17516, - Variant17517, - Variant17518, - Variant17519, - Variant17520, - Variant17521, - Variant17522, - Variant17523, - Variant17524, - Variant17525, - Variant17526, - Variant17527, - Variant17528, - Variant17529, - Variant17530, - Variant17531, - Variant17532, - Variant17533, - Variant17534, - Variant17535, - Variant17536, - Variant17537, - Variant17538, - Variant17539, - Variant17540, - Variant17541, - Variant17542, - Variant17543, - Variant17544, - Variant17545, - Variant17546, - Variant17547, - Variant17548, - Variant17549, - Variant17550, - Variant17551, - Variant17552, - Variant17553, - Variant17554, - Variant17555, - Variant17556, - Variant17557, - Variant17558, - Variant17559, - Variant17560, - Variant17561, - Variant17562, - Variant17563, - Variant17564, - Variant17565, - Variant17566, - Variant17567, - Variant17568, - Variant17569, - Variant17570, - Variant17571, - Variant17572, - Variant17573, - Variant17574, - Variant17575, - Variant17576, - Variant17577, - Variant17578, - Variant17579, - Variant17580, - Variant17581, - Variant17582, - Variant17583, - Variant17584, - Variant17585, - Variant17586, - Variant17587, - Variant17588, - Variant17589, - Variant17590, - Variant17591, - Variant17592, - Variant17593, - Variant17594, - Variant17595, - Variant17596, - Variant17597, - Variant17598, - Variant17599, - Variant17600, - Variant17601, - Variant17602, - Variant17603, - Variant17604, - Variant17605, - Variant17606, - Variant17607, - Variant17608, - Variant17609, - Variant17610, - Variant17611, - Variant17612, - Variant17613, - Variant17614, - Variant17615, - Variant17616, - Variant17617, - Variant17618, - Variant17619, - Variant17620, - Variant17621, - Variant17622, - Variant17623, - Variant17624, - Variant17625, - Variant17626, - Variant17627, - Variant17628, - Variant17629, - Variant17630, - Variant17631, - Variant17632, - Variant17633, - Variant17634, - Variant17635, - Variant17636, - Variant17637, - Variant17638, - Variant17639, - Variant17640, - Variant17641, - Variant17642, - Variant17643, - Variant17644, - Variant17645, - Variant17646, - Variant17647, - Variant17648, - Variant17649, - Variant17650, - Variant17651, - Variant17652, - Variant17653, - Variant17654, - Variant17655, - Variant17656, - Variant17657, - Variant17658, - Variant17659, - Variant17660, - Variant17661, - Variant17662, - Variant17663, - Variant17664, - Variant17665, - Variant17666, - Variant17667, - Variant17668, - Variant17669, - Variant17670, - Variant17671, - Variant17672, - Variant17673, - Variant17674, - Variant17675, - Variant17676, - Variant17677, - Variant17678, - Variant17679, - Variant17680, - Variant17681, - Variant17682, - Variant17683, - Variant17684, - Variant17685, - Variant17686, - Variant17687, - Variant17688, - Variant17689, - Variant17690, - Variant17691, - Variant17692, - Variant17693, - Variant17694, - Variant17695, - Variant17696, - Variant17697, - Variant17698, - Variant17699, - Variant17700, - Variant17701, - Variant17702, - Variant17703, - Variant17704, - Variant17705, - Variant17706, - Variant17707, - Variant17708, - Variant17709, - Variant17710, - Variant17711, - Variant17712, - Variant17713, - Variant17714, - Variant17715, - Variant17716, - Variant17717, - Variant17718, - Variant17719, - Variant17720, - Variant17721, - Variant17722, - Variant17723, - Variant17724, - Variant17725, - Variant17726, - Variant17727, - Variant17728, - Variant17729, - Variant17730, - Variant17731, - Variant17732, - Variant17733, - Variant17734, - Variant17735, - Variant17736, - Variant17737, - Variant17738, - Variant17739, - Variant17740, - Variant17741, - Variant17742, - Variant17743, - Variant17744, - Variant17745, - Variant17746, - Variant17747, - Variant17748, - Variant17749, - Variant17750, - Variant17751, - Variant17752, - Variant17753, - Variant17754, - Variant17755, - Variant17756, - Variant17757, - Variant17758, - Variant17759, - Variant17760, - Variant17761, - Variant17762, - Variant17763, - Variant17764, - Variant17765, - Variant17766, - Variant17767, - Variant17768, - Variant17769, - Variant17770, - Variant17771, - Variant17772, - Variant17773, - Variant17774, - Variant17775, - Variant17776, - Variant17777, - Variant17778, - Variant17779, - Variant17780, - Variant17781, - Variant17782, - Variant17783, - Variant17784, - Variant17785, - Variant17786, - Variant17787, - Variant17788, - Variant17789, - Variant17790, - Variant17791, - Variant17792, - Variant17793, - Variant17794, - Variant17795, - Variant17796, - Variant17797, - Variant17798, - Variant17799, - Variant17800, - Variant17801, - Variant17802, - Variant17803, - Variant17804, - Variant17805, - Variant17806, - Variant17807, - Variant17808, - Variant17809, - Variant17810, - Variant17811, - Variant17812, - Variant17813, - Variant17814, - Variant17815, - Variant17816, - Variant17817, - Variant17818, - Variant17819, - Variant17820, - Variant17821, - Variant17822, - Variant17823, - Variant17824, - Variant17825, - Variant17826, - Variant17827, - Variant17828, - Variant17829, - Variant17830, - Variant17831, - Variant17832, - Variant17833, - Variant17834, - Variant17835, - Variant17836, - Variant17837, - Variant17838, - Variant17839, - Variant17840, - Variant17841, - Variant17842, - Variant17843, - Variant17844, - Variant17845, - Variant17846, - Variant17847, - Variant17848, - Variant17849, - Variant17850, - Variant17851, - Variant17852, - Variant17853, - Variant17854, - Variant17855, - Variant17856, - Variant17857, - Variant17858, - Variant17859, - Variant17860, - Variant17861, - Variant17862, - Variant17863, - Variant17864, - Variant17865, - Variant17866, - Variant17867, - Variant17868, - Variant17869, - Variant17870, - Variant17871, - Variant17872, - Variant17873, - Variant17874, - Variant17875, - Variant17876, - Variant17877, - Variant17878, - Variant17879, - Variant17880, - Variant17881, - Variant17882, - Variant17883, - Variant17884, - Variant17885, - Variant17886, - Variant17887, - Variant17888, - Variant17889, - Variant17890, - Variant17891, - Variant17892, - Variant17893, - Variant17894, - Variant17895, - Variant17896, - Variant17897, - Variant17898, - Variant17899, - Variant17900, - Variant17901, - Variant17902, - Variant17903, - Variant17904, - Variant17905, - Variant17906, - Variant17907, - Variant17908, - Variant17909, - Variant17910, - Variant17911, - Variant17912, - Variant17913, - Variant17914, - Variant17915, - Variant17916, - Variant17917, - Variant17918, - Variant17919, - Variant17920, - Variant17921, - Variant17922, - Variant17923, - Variant17924, - Variant17925, - Variant17926, - Variant17927, - Variant17928, - Variant17929, - Variant17930, - Variant17931, - Variant17932, - Variant17933, - Variant17934, - Variant17935, - Variant17936, - Variant17937, - Variant17938, - Variant17939, - Variant17940, - Variant17941, - Variant17942, - Variant17943, - Variant17944, - Variant17945, - Variant17946, - Variant17947, - Variant17948, - Variant17949, - Variant17950, - Variant17951, - Variant17952, - Variant17953, - Variant17954, - Variant17955, - Variant17956, - Variant17957, - Variant17958, - Variant17959, - Variant17960, - Variant17961, - Variant17962, - Variant17963, - Variant17964, - Variant17965, - Variant17966, - Variant17967, - Variant17968, - Variant17969, - Variant17970, - Variant17971, - Variant17972, - Variant17973, - Variant17974, - Variant17975, - Variant17976, - Variant17977, - Variant17978, - Variant17979, - Variant17980, - Variant17981, - Variant17982, - Variant17983, - Variant17984, - Variant17985, - Variant17986, - Variant17987, - Variant17988, - Variant17989, - Variant17990, - Variant17991, - Variant17992, - Variant17993, - Variant17994, - Variant17995, - Variant17996, - Variant17997, - Variant17998, - Variant17999, - Variant18000, - Variant18001, - Variant18002, - Variant18003, - Variant18004, - Variant18005, - Variant18006, - Variant18007, - Variant18008, - Variant18009, - Variant18010, - Variant18011, - Variant18012, - Variant18013, - Variant18014, - Variant18015, - Variant18016, - Variant18017, - Variant18018, - Variant18019, - Variant18020, - Variant18021, - Variant18022, - Variant18023, - Variant18024, - Variant18025, - Variant18026, - Variant18027, - Variant18028, - Variant18029, - Variant18030, - Variant18031, - Variant18032, - Variant18033, - Variant18034, - Variant18035, - Variant18036, - Variant18037, - Variant18038, - Variant18039, - Variant18040, - Variant18041, - Variant18042, - Variant18043, - Variant18044, - Variant18045, - Variant18046, - Variant18047, - Variant18048, - Variant18049, - Variant18050, - Variant18051, - Variant18052, - Variant18053, - Variant18054, - Variant18055, - Variant18056, - Variant18057, - Variant18058, - Variant18059, - Variant18060, - Variant18061, - Variant18062, - Variant18063, - Variant18064, - Variant18065, - Variant18066, - Variant18067, - Variant18068, - Variant18069, - Variant18070, - Variant18071, - Variant18072, - Variant18073, - Variant18074, - Variant18075, - Variant18076, - Variant18077, - Variant18078, - Variant18079, - Variant18080, - Variant18081, - Variant18082, - Variant18083, - Variant18084, - Variant18085, - Variant18086, - Variant18087, - Variant18088, - Variant18089, - Variant18090, - Variant18091, - Variant18092, - Variant18093, - Variant18094, - Variant18095, - Variant18096, - Variant18097, - Variant18098, - Variant18099, - Variant18100, - Variant18101, - Variant18102, - Variant18103, - Variant18104, - Variant18105, - Variant18106, - Variant18107, - Variant18108, - Variant18109, - Variant18110, - Variant18111, - Variant18112, - Variant18113, - Variant18114, - Variant18115, - Variant18116, - Variant18117, - Variant18118, - Variant18119, - Variant18120, - Variant18121, - Variant18122, - Variant18123, - Variant18124, - Variant18125, - Variant18126, - Variant18127, - Variant18128, - Variant18129, - Variant18130, - Variant18131, - Variant18132, - Variant18133, - Variant18134, - Variant18135, - Variant18136, - Variant18137, - Variant18138, - Variant18139, - Variant18140, - Variant18141, - Variant18142, - Variant18143, - Variant18144, - Variant18145, - Variant18146, - Variant18147, - Variant18148, - Variant18149, - Variant18150, - Variant18151, - Variant18152, - Variant18153, - Variant18154, - Variant18155, - Variant18156, - Variant18157, - Variant18158, - Variant18159, - Variant18160, - Variant18161, - Variant18162, - Variant18163, - Variant18164, - Variant18165, - Variant18166, - Variant18167, - Variant18168, - Variant18169, - Variant18170, - Variant18171, - Variant18172, - Variant18173, - Variant18174, - Variant18175, - Variant18176, - Variant18177, - Variant18178, - Variant18179, - Variant18180, - Variant18181, - Variant18182, - Variant18183, - Variant18184, - Variant18185, - Variant18186, - Variant18187, - Variant18188, - Variant18189, - Variant18190, - Variant18191, - Variant18192, - Variant18193, - Variant18194, - Variant18195, - Variant18196, - Variant18197, - Variant18198, - Variant18199, - Variant18200, - Variant18201, - Variant18202, - Variant18203, - Variant18204, - Variant18205, - Variant18206, - Variant18207, - Variant18208, - Variant18209, - Variant18210, - Variant18211, - Variant18212, - Variant18213, - Variant18214, - Variant18215, - Variant18216, - Variant18217, - Variant18218, - Variant18219, - Variant18220, - Variant18221, - Variant18222, - Variant18223, - Variant18224, - Variant18225, - Variant18226, - Variant18227, - Variant18228, - Variant18229, - Variant18230, - Variant18231, - Variant18232, - Variant18233, - Variant18234, - Variant18235, - Variant18236, - Variant18237, - Variant18238, - Variant18239, - Variant18240, - Variant18241, - Variant18242, - Variant18243, - Variant18244, - Variant18245, - Variant18246, - Variant18247, - Variant18248, - Variant18249, - Variant18250, - Variant18251, - Variant18252, - Variant18253, - Variant18254, - Variant18255, - Variant18256, - Variant18257, - Variant18258, - Variant18259, - Variant18260, - Variant18261, - Variant18262, - Variant18263, - Variant18264, - Variant18265, - Variant18266, - Variant18267, - Variant18268, - Variant18269, - Variant18270, - Variant18271, - Variant18272, - Variant18273, - Variant18274, - Variant18275, - Variant18276, - Variant18277, - Variant18278, - Variant18279, - Variant18280, - Variant18281, - Variant18282, - Variant18283, - Variant18284, - Variant18285, - Variant18286, - Variant18287, - Variant18288, - Variant18289, - Variant18290, - Variant18291, - Variant18292, - Variant18293, - Variant18294, - Variant18295, - Variant18296, - Variant18297, - Variant18298, - Variant18299, - Variant18300, - Variant18301, - Variant18302, - Variant18303, - Variant18304, - Variant18305, - Variant18306, - Variant18307, - Variant18308, - Variant18309, - Variant18310, - Variant18311, - Variant18312, - Variant18313, - Variant18314, - Variant18315, - Variant18316, - Variant18317, - Variant18318, - Variant18319, - Variant18320, - Variant18321, - Variant18322, - Variant18323, - Variant18324, - Variant18325, - Variant18326, - Variant18327, - Variant18328, - Variant18329, - Variant18330, - Variant18331, - Variant18332, - Variant18333, - Variant18334, - Variant18335, - Variant18336, - Variant18337, - Variant18338, - Variant18339, - Variant18340, - Variant18341, - Variant18342, - Variant18343, - Variant18344, - Variant18345, - Variant18346, - Variant18347, - Variant18348, - Variant18349, - Variant18350, - Variant18351, - Variant18352, - Variant18353, - Variant18354, - Variant18355, - Variant18356, - Variant18357, - Variant18358, - Variant18359, - Variant18360, - Variant18361, - Variant18362, - Variant18363, - Variant18364, - Variant18365, - Variant18366, - Variant18367, - Variant18368, - Variant18369, - Variant18370, - Variant18371, - Variant18372, - Variant18373, - Variant18374, - Variant18375, - Variant18376, - Variant18377, - Variant18378, - Variant18379, - Variant18380, - Variant18381, - Variant18382, - Variant18383, - Variant18384, - Variant18385, - Variant18386, - Variant18387, - Variant18388, - Variant18389, - Variant18390, - Variant18391, - Variant18392, - Variant18393, - Variant18394, - Variant18395, - Variant18396, - Variant18397, - Variant18398, - Variant18399, - Variant18400, - Variant18401, - Variant18402, - Variant18403, - Variant18404, - Variant18405, - Variant18406, - Variant18407, - Variant18408, - Variant18409, - Variant18410, - Variant18411, - Variant18412, - Variant18413, - Variant18414, - Variant18415, - Variant18416, - Variant18417, - Variant18418, - Variant18419, - Variant18420, - Variant18421, - Variant18422, - Variant18423, - Variant18424, - Variant18425, - Variant18426, - Variant18427, - Variant18428, - Variant18429, - Variant18430, - Variant18431, - Variant18432, - Variant18433, - Variant18434, - Variant18435, - Variant18436, - Variant18437, - Variant18438, - Variant18439, - Variant18440, - Variant18441, - Variant18442, - Variant18443, - Variant18444, - Variant18445, - Variant18446, - Variant18447, - Variant18448, - Variant18449, - Variant18450, - Variant18451, - Variant18452, - Variant18453, - Variant18454, - Variant18455, - Variant18456, - Variant18457, - Variant18458, - Variant18459, - Variant18460, - Variant18461, - Variant18462, - Variant18463, - Variant18464, - Variant18465, - Variant18466, - Variant18467, - Variant18468, - Variant18469, - Variant18470, - Variant18471, - Variant18472, - Variant18473, - Variant18474, - Variant18475, - Variant18476, - Variant18477, - Variant18478, - Variant18479, - Variant18480, - Variant18481, - Variant18482, - Variant18483, - Variant18484, - Variant18485, - Variant18486, - Variant18487, - Variant18488, - Variant18489, - Variant18490, - Variant18491, - Variant18492, - Variant18493, - Variant18494, - Variant18495, - Variant18496, - Variant18497, - Variant18498, - Variant18499, - Variant18500, - Variant18501, - Variant18502, - Variant18503, - Variant18504, - Variant18505, - Variant18506, - Variant18507, - Variant18508, - Variant18509, - Variant18510, - Variant18511, - Variant18512, - Variant18513, - Variant18514, - Variant18515, - Variant18516, - Variant18517, - Variant18518, - Variant18519, - Variant18520, - Variant18521, - Variant18522, - Variant18523, - Variant18524, - Variant18525, - Variant18526, - Variant18527, - Variant18528, - Variant18529, - Variant18530, - Variant18531, - Variant18532, - Variant18533, - Variant18534, - Variant18535, - Variant18536, - Variant18537, - Variant18538, - Variant18539, - Variant18540, - Variant18541, - Variant18542, - Variant18543, - Variant18544, - Variant18545, - Variant18546, - Variant18547, - Variant18548, - Variant18549, - Variant18550, - Variant18551, - Variant18552, - Variant18553, - Variant18554, - Variant18555, - Variant18556, - Variant18557, - Variant18558, - Variant18559, - Variant18560, - Variant18561, - Variant18562, - Variant18563, - Variant18564, - Variant18565, - Variant18566, - Variant18567, - Variant18568, - Variant18569, - Variant18570, - Variant18571, - Variant18572, - Variant18573, - Variant18574, - Variant18575, - Variant18576, - Variant18577, - Variant18578, - Variant18579, - Variant18580, - Variant18581, - Variant18582, - Variant18583, - Variant18584, - Variant18585, - Variant18586, - Variant18587, - Variant18588, - Variant18589, - Variant18590, - Variant18591, - Variant18592, - Variant18593, - Variant18594, - Variant18595, - Variant18596, - Variant18597, - Variant18598, - Variant18599, - Variant18600, - Variant18601, - Variant18602, - Variant18603, - Variant18604, - Variant18605, - Variant18606, - Variant18607, - Variant18608, - Variant18609, - Variant18610, - Variant18611, - Variant18612, - Variant18613, - Variant18614, - Variant18615, - Variant18616, - Variant18617, - Variant18618, - Variant18619, - Variant18620, - Variant18621, - Variant18622, - Variant18623, - Variant18624, - Variant18625, - Variant18626, - Variant18627, - Variant18628, - Variant18629, - Variant18630, - Variant18631, - Variant18632, - Variant18633, - Variant18634, - Variant18635, - Variant18636, - Variant18637, - Variant18638, - Variant18639, - Variant18640, - Variant18641, - Variant18642, - Variant18643, - Variant18644, - Variant18645, - Variant18646, - Variant18647, - Variant18648, - Variant18649, - Variant18650, - Variant18651, - Variant18652, - Variant18653, - Variant18654, - Variant18655, - Variant18656, - Variant18657, - Variant18658, - Variant18659, - Variant18660, - Variant18661, - Variant18662, - Variant18663, - Variant18664, - Variant18665, - Variant18666, - Variant18667, - Variant18668, - Variant18669, - Variant18670, - Variant18671, - Variant18672, - Variant18673, - Variant18674, - Variant18675, - Variant18676, - Variant18677, - Variant18678, - Variant18679, - Variant18680, - Variant18681, - Variant18682, - Variant18683, - Variant18684, - Variant18685, - Variant18686, - Variant18687, - Variant18688, - Variant18689, - Variant18690, - Variant18691, - Variant18692, - Variant18693, - Variant18694, - Variant18695, - Variant18696, - Variant18697, - Variant18698, - Variant18699, - Variant18700, - Variant18701, - Variant18702, - Variant18703, - Variant18704, - Variant18705, - Variant18706, - Variant18707, - Variant18708, - Variant18709, - Variant18710, - Variant18711, - Variant18712, - Variant18713, - Variant18714, - Variant18715, - Variant18716, - Variant18717, - Variant18718, - Variant18719, - Variant18720, - Variant18721, - Variant18722, - Variant18723, - Variant18724, - Variant18725, - Variant18726, - Variant18727, - Variant18728, - Variant18729, - Variant18730, - Variant18731, - Variant18732, - Variant18733, - Variant18734, - Variant18735, - Variant18736, - Variant18737, - Variant18738, - Variant18739, - Variant18740, - Variant18741, - Variant18742, - Variant18743, - Variant18744, - Variant18745, - Variant18746, - Variant18747, - Variant18748, - Variant18749, - Variant18750, - Variant18751, - Variant18752, - Variant18753, - Variant18754, - Variant18755, - Variant18756, - Variant18757, - Variant18758, - Variant18759, - Variant18760, - Variant18761, - Variant18762, - Variant18763, - Variant18764, - Variant18765, - Variant18766, - Variant18767, - Variant18768, - Variant18769, - Variant18770, - Variant18771, - Variant18772, - Variant18773, - Variant18774, - Variant18775, - Variant18776, - Variant18777, - Variant18778, - Variant18779, - Variant18780, - Variant18781, - Variant18782, - Variant18783, - Variant18784, - Variant18785, - Variant18786, - Variant18787, - Variant18788, - Variant18789, - Variant18790, - Variant18791, - Variant18792, - Variant18793, - Variant18794, - Variant18795, - Variant18796, - Variant18797, - Variant18798, - Variant18799, - Variant18800, - Variant18801, - Variant18802, - Variant18803, - Variant18804, - Variant18805, - Variant18806, - Variant18807, - Variant18808, - Variant18809, - Variant18810, - Variant18811, - Variant18812, - Variant18813, - Variant18814, - Variant18815, - Variant18816, - Variant18817, - Variant18818, - Variant18819, - Variant18820, - Variant18821, - Variant18822, - Variant18823, - Variant18824, - Variant18825, - Variant18826, - Variant18827, - Variant18828, - Variant18829, - Variant18830, - Variant18831, - Variant18832, - Variant18833, - Variant18834, - Variant18835, - Variant18836, - Variant18837, - Variant18838, - Variant18839, - Variant18840, - Variant18841, - Variant18842, - Variant18843, - Variant18844, - Variant18845, - Variant18846, - Variant18847, - Variant18848, - Variant18849, - Variant18850, - Variant18851, - Variant18852, - Variant18853, - Variant18854, - Variant18855, - Variant18856, - Variant18857, - Variant18858, - Variant18859, - Variant18860, - Variant18861, - Variant18862, - Variant18863, - Variant18864, - Variant18865, - Variant18866, - Variant18867, - Variant18868, - Variant18869, - Variant18870, - Variant18871, - Variant18872, - Variant18873, - Variant18874, - Variant18875, - Variant18876, - Variant18877, - Variant18878, - Variant18879, - Variant18880, - Variant18881, - Variant18882, - Variant18883, - Variant18884, - Variant18885, - Variant18886, - Variant18887, - Variant18888, - Variant18889, - Variant18890, - Variant18891, - Variant18892, - Variant18893, - Variant18894, - Variant18895, - Variant18896, - Variant18897, - Variant18898, - Variant18899, - Variant18900, - Variant18901, - Variant18902, - Variant18903, - Variant18904, - Variant18905, - Variant18906, - Variant18907, - Variant18908, - Variant18909, - Variant18910, - Variant18911, - Variant18912, - Variant18913, - Variant18914, - Variant18915, - Variant18916, - Variant18917, - Variant18918, - Variant18919, - Variant18920, - Variant18921, - Variant18922, - Variant18923, - Variant18924, - Variant18925, - Variant18926, - Variant18927, - Variant18928, - Variant18929, - Variant18930, - Variant18931, - Variant18932, - Variant18933, - Variant18934, - Variant18935, - Variant18936, - Variant18937, - Variant18938, - Variant18939, - Variant18940, - Variant18941, - Variant18942, - Variant18943, - Variant18944, - Variant18945, - Variant18946, - Variant18947, - Variant18948, - Variant18949, - Variant18950, - Variant18951, - Variant18952, - Variant18953, - Variant18954, - Variant18955, - Variant18956, - Variant18957, - Variant18958, - Variant18959, - Variant18960, - Variant18961, - Variant18962, - Variant18963, - Variant18964, - Variant18965, - Variant18966, - Variant18967, - Variant18968, - Variant18969, - Variant18970, - Variant18971, - Variant18972, - Variant18973, - Variant18974, - Variant18975, - Variant18976, - Variant18977, - Variant18978, - Variant18979, - Variant18980, - Variant18981, - Variant18982, - Variant18983, - Variant18984, - Variant18985, - Variant18986, - Variant18987, - Variant18988, - Variant18989, - Variant18990, - Variant18991, - Variant18992, - Variant18993, - Variant18994, - Variant18995, - Variant18996, - Variant18997, - Variant18998, - Variant18999, - Variant19000, - Variant19001, - Variant19002, - Variant19003, - Variant19004, - Variant19005, - Variant19006, - Variant19007, - Variant19008, - Variant19009, - Variant19010, - Variant19011, - Variant19012, - Variant19013, - Variant19014, - Variant19015, - Variant19016, - Variant19017, - Variant19018, - Variant19019, - Variant19020, - Variant19021, - Variant19022, - Variant19023, - Variant19024, - Variant19025, - Variant19026, - Variant19027, - Variant19028, - Variant19029, - Variant19030, - Variant19031, - Variant19032, - Variant19033, - Variant19034, - Variant19035, - Variant19036, - Variant19037, - Variant19038, - Variant19039, - Variant19040, - Variant19041, - Variant19042, - Variant19043, - Variant19044, - Variant19045, - Variant19046, - Variant19047, - Variant19048, - Variant19049, - Variant19050, - Variant19051, - Variant19052, - Variant19053, - Variant19054, - Variant19055, - Variant19056, - Variant19057, - Variant19058, - Variant19059, - Variant19060, - Variant19061, - Variant19062, - Variant19063, - Variant19064, - Variant19065, - Variant19066, - Variant19067, - Variant19068, - Variant19069, - Variant19070, - Variant19071, - Variant19072, - Variant19073, - Variant19074, - Variant19075, - Variant19076, - Variant19077, - Variant19078, - Variant19079, - Variant19080, - Variant19081, - Variant19082, - Variant19083, - Variant19084, - Variant19085, - Variant19086, - Variant19087, - Variant19088, - Variant19089, - Variant19090, - Variant19091, - Variant19092, - Variant19093, - Variant19094, - Variant19095, - Variant19096, - Variant19097, - Variant19098, - Variant19099, - Variant19100, - Variant19101, - Variant19102, - Variant19103, - Variant19104, - Variant19105, - Variant19106, - Variant19107, - Variant19108, - Variant19109, - Variant19110, - Variant19111, - Variant19112, - Variant19113, - Variant19114, - Variant19115, - Variant19116, - Variant19117, - Variant19118, - Variant19119, - Variant19120, - Variant19121, - Variant19122, - Variant19123, - Variant19124, - Variant19125, - Variant19126, - Variant19127, - Variant19128, - Variant19129, - Variant19130, - Variant19131, - Variant19132, - Variant19133, - Variant19134, - Variant19135, - Variant19136, - Variant19137, - Variant19138, - Variant19139, - Variant19140, - Variant19141, - Variant19142, - Variant19143, - Variant19144, - Variant19145, - Variant19146, - Variant19147, - Variant19148, - Variant19149, - Variant19150, - Variant19151, - Variant19152, - Variant19153, - Variant19154, - Variant19155, - Variant19156, - Variant19157, - Variant19158, - Variant19159, - Variant19160, - Variant19161, - Variant19162, - Variant19163, - Variant19164, - Variant19165, - Variant19166, - Variant19167, - Variant19168, - Variant19169, - Variant19170, - Variant19171, - Variant19172, - Variant19173, - Variant19174, - Variant19175, - Variant19176, - Variant19177, - Variant19178, - Variant19179, - Variant19180, - Variant19181, - Variant19182, - Variant19183, - Variant19184, - Variant19185, - Variant19186, - Variant19187, - Variant19188, - Variant19189, - Variant19190, - Variant19191, - Variant19192, - Variant19193, - Variant19194, - Variant19195, - Variant19196, - Variant19197, - Variant19198, - Variant19199, - Variant19200, - Variant19201, - Variant19202, - Variant19203, - Variant19204, - Variant19205, - Variant19206, - Variant19207, - Variant19208, - Variant19209, - Variant19210, - Variant19211, - Variant19212, - Variant19213, - Variant19214, - Variant19215, - Variant19216, - Variant19217, - Variant19218, - Variant19219, - Variant19220, - Variant19221, - Variant19222, - Variant19223, - Variant19224, - Variant19225, - Variant19226, - Variant19227, - Variant19228, - Variant19229, - Variant19230, - Variant19231, - Variant19232, - Variant19233, - Variant19234, - Variant19235, - Variant19236, - Variant19237, - Variant19238, - Variant19239, - Variant19240, - Variant19241, - Variant19242, - Variant19243, - Variant19244, - Variant19245, - Variant19246, - Variant19247, - Variant19248, - Variant19249, - Variant19250, - Variant19251, - Variant19252, - Variant19253, - Variant19254, - Variant19255, - Variant19256, - Variant19257, - Variant19258, - Variant19259, - Variant19260, - Variant19261, - Variant19262, - Variant19263, - Variant19264, - Variant19265, - Variant19266, - Variant19267, - Variant19268, - Variant19269, - Variant19270, - Variant19271, - Variant19272, - Variant19273, - Variant19274, - Variant19275, - Variant19276, - Variant19277, - Variant19278, - Variant19279, - Variant19280, - Variant19281, - Variant19282, - Variant19283, - Variant19284, - Variant19285, - Variant19286, - Variant19287, - Variant19288, - Variant19289, - Variant19290, - Variant19291, - Variant19292, - Variant19293, - Variant19294, - Variant19295, - Variant19296, - Variant19297, - Variant19298, - Variant19299, - Variant19300, - Variant19301, - Variant19302, - Variant19303, - Variant19304, - Variant19305, - Variant19306, - Variant19307, - Variant19308, - Variant19309, - Variant19310, - Variant19311, - Variant19312, - Variant19313, - Variant19314, - Variant19315, - Variant19316, - Variant19317, - Variant19318, - Variant19319, - Variant19320, - Variant19321, - Variant19322, - Variant19323, - Variant19324, - Variant19325, - Variant19326, - Variant19327, - Variant19328, - Variant19329, - Variant19330, - Variant19331, - Variant19332, - Variant19333, - Variant19334, - Variant19335, - Variant19336, - Variant19337, - Variant19338, - Variant19339, - Variant19340, - Variant19341, - Variant19342, - Variant19343, - Variant19344, - Variant19345, - Variant19346, - Variant19347, - Variant19348, - Variant19349, - Variant19350, - Variant19351, - Variant19352, - Variant19353, - Variant19354, - Variant19355, - Variant19356, - Variant19357, - Variant19358, - Variant19359, - Variant19360, - Variant19361, - Variant19362, - Variant19363, - Variant19364, - Variant19365, - Variant19366, - Variant19367, - Variant19368, - Variant19369, - Variant19370, - Variant19371, - Variant19372, - Variant19373, - Variant19374, - Variant19375, - Variant19376, - Variant19377, - Variant19378, - Variant19379, - Variant19380, - Variant19381, - Variant19382, - Variant19383, - Variant19384, - Variant19385, - Variant19386, - Variant19387, - Variant19388, - Variant19389, - Variant19390, - Variant19391, - Variant19392, - Variant19393, - Variant19394, - Variant19395, - Variant19396, - Variant19397, - Variant19398, - Variant19399, - Variant19400, - Variant19401, - Variant19402, - Variant19403, - Variant19404, - Variant19405, - Variant19406, - Variant19407, - Variant19408, - Variant19409, - Variant19410, - Variant19411, - Variant19412, - Variant19413, - Variant19414, - Variant19415, - Variant19416, - Variant19417, - Variant19418, - Variant19419, - Variant19420, - Variant19421, - Variant19422, - Variant19423, - Variant19424, - Variant19425, - Variant19426, - Variant19427, - Variant19428, - Variant19429, - Variant19430, - Variant19431, - Variant19432, - Variant19433, - Variant19434, - Variant19435, - Variant19436, - Variant19437, - Variant19438, - Variant19439, - Variant19440, - Variant19441, - Variant19442, - Variant19443, - Variant19444, - Variant19445, - Variant19446, - Variant19447, - Variant19448, - Variant19449, - Variant19450, - Variant19451, - Variant19452, - Variant19453, - Variant19454, - Variant19455, - Variant19456, - Variant19457, - Variant19458, - Variant19459, - Variant19460, - Variant19461, - Variant19462, - Variant19463, - Variant19464, - Variant19465, - Variant19466, - Variant19467, - Variant19468, - Variant19469, - Variant19470, - Variant19471, - Variant19472, - Variant19473, - Variant19474, - Variant19475, - Variant19476, - Variant19477, - Variant19478, - Variant19479, - Variant19480, - Variant19481, - Variant19482, - Variant19483, - Variant19484, - Variant19485, - Variant19486, - Variant19487, - Variant19488, - Variant19489, - Variant19490, - Variant19491, - Variant19492, - Variant19493, - Variant19494, - Variant19495, - Variant19496, - Variant19497, - Variant19498, - Variant19499, - Variant19500, - Variant19501, - Variant19502, - Variant19503, - Variant19504, - Variant19505, - Variant19506, - Variant19507, - Variant19508, - Variant19509, - Variant19510, - Variant19511, - Variant19512, - Variant19513, - Variant19514, - Variant19515, - Variant19516, - Variant19517, - Variant19518, - Variant19519, - Variant19520, - Variant19521, - Variant19522, - Variant19523, - Variant19524, - Variant19525, - Variant19526, - Variant19527, - Variant19528, - Variant19529, - Variant19530, - Variant19531, - Variant19532, - Variant19533, - Variant19534, - Variant19535, - Variant19536, - Variant19537, - Variant19538, - Variant19539, - Variant19540, - Variant19541, - Variant19542, - Variant19543, - Variant19544, - Variant19545, - Variant19546, - Variant19547, - Variant19548, - Variant19549, - Variant19550, - Variant19551, - Variant19552, - Variant19553, - Variant19554, - Variant19555, - Variant19556, - Variant19557, - Variant19558, - Variant19559, - Variant19560, - Variant19561, - Variant19562, - Variant19563, - Variant19564, - Variant19565, - Variant19566, - Variant19567, - Variant19568, - Variant19569, - Variant19570, - Variant19571, - Variant19572, - Variant19573, - Variant19574, - Variant19575, - Variant19576, - Variant19577, - Variant19578, - Variant19579, - Variant19580, - Variant19581, - Variant19582, - Variant19583, - Variant19584, - Variant19585, - Variant19586, - Variant19587, - Variant19588, - Variant19589, - Variant19590, - Variant19591, - Variant19592, - Variant19593, - Variant19594, - Variant19595, - Variant19596, - Variant19597, - Variant19598, - Variant19599, - Variant19600, - Variant19601, - Variant19602, - Variant19603, - Variant19604, - Variant19605, - Variant19606, - Variant19607, - Variant19608, - Variant19609, - Variant19610, - Variant19611, - Variant19612, - Variant19613, - Variant19614, - Variant19615, - Variant19616, - Variant19617, - Variant19618, - Variant19619, - Variant19620, - Variant19621, - Variant19622, - Variant19623, - Variant19624, - Variant19625, - Variant19626, - Variant19627, - Variant19628, - Variant19629, - Variant19630, - Variant19631, - Variant19632, - Variant19633, - Variant19634, - Variant19635, - Variant19636, - Variant19637, - Variant19638, - Variant19639, - Variant19640, - Variant19641, - Variant19642, - Variant19643, - Variant19644, - Variant19645, - Variant19646, - Variant19647, - Variant19648, - Variant19649, - Variant19650, - Variant19651, - Variant19652, - Variant19653, - Variant19654, - Variant19655, - Variant19656, - Variant19657, - Variant19658, - Variant19659, - Variant19660, - Variant19661, - Variant19662, - Variant19663, - Variant19664, - Variant19665, - Variant19666, - Variant19667, - Variant19668, - Variant19669, - Variant19670, - Variant19671, - Variant19672, - Variant19673, - Variant19674, - Variant19675, - Variant19676, - Variant19677, - Variant19678, - Variant19679, - Variant19680, - Variant19681, - Variant19682, - Variant19683, - Variant19684, - Variant19685, - Variant19686, - Variant19687, - Variant19688, - Variant19689, - Variant19690, - Variant19691, - Variant19692, - Variant19693, - Variant19694, - Variant19695, - Variant19696, - Variant19697, - Variant19698, - Variant19699, - Variant19700, - Variant19701, - Variant19702, - Variant19703, - Variant19704, - Variant19705, - Variant19706, - Variant19707, - Variant19708, - Variant19709, - Variant19710, - Variant19711, - Variant19712, - Variant19713, - Variant19714, - Variant19715, - Variant19716, - Variant19717, - Variant19718, - Variant19719, - Variant19720, - Variant19721, - Variant19722, - Variant19723, - Variant19724, - Variant19725, - Variant19726, - Variant19727, - Variant19728, - Variant19729, - Variant19730, - Variant19731, - Variant19732, - Variant19733, - Variant19734, - Variant19735, - Variant19736, - Variant19737, - Variant19738, - Variant19739, - Variant19740, - Variant19741, - Variant19742, - Variant19743, - Variant19744, - Variant19745, - Variant19746, - Variant19747, - Variant19748, - Variant19749, - Variant19750, - Variant19751, - Variant19752, - Variant19753, - Variant19754, - Variant19755, - Variant19756, - Variant19757, - Variant19758, - Variant19759, - Variant19760, - Variant19761, - Variant19762, - Variant19763, - Variant19764, - Variant19765, - Variant19766, - Variant19767, - Variant19768, - Variant19769, - Variant19770, - Variant19771, - Variant19772, - Variant19773, - Variant19774, - Variant19775, - Variant19776, - Variant19777, - Variant19778, - Variant19779, - Variant19780, - Variant19781, - Variant19782, - Variant19783, - Variant19784, - Variant19785, - Variant19786, - Variant19787, - Variant19788, - Variant19789, - Variant19790, - Variant19791, - Variant19792, - Variant19793, - Variant19794, - Variant19795, - Variant19796, - Variant19797, - Variant19798, - Variant19799, - Variant19800, - Variant19801, - Variant19802, - Variant19803, - Variant19804, - Variant19805, - Variant19806, - Variant19807, - Variant19808, - Variant19809, - Variant19810, - Variant19811, - Variant19812, - Variant19813, - Variant19814, - Variant19815, - Variant19816, - Variant19817, - Variant19818, - Variant19819, - Variant19820, - Variant19821, - Variant19822, - Variant19823, - Variant19824, - Variant19825, - Variant19826, - Variant19827, - Variant19828, - Variant19829, - Variant19830, - Variant19831, - Variant19832, - Variant19833, - Variant19834, - Variant19835, - Variant19836, - Variant19837, - Variant19838, - Variant19839, - Variant19840, - Variant19841, - Variant19842, - Variant19843, - Variant19844, - Variant19845, - Variant19846, - Variant19847, - Variant19848, - Variant19849, - Variant19850, - Variant19851, - Variant19852, - Variant19853, - Variant19854, - Variant19855, - Variant19856, - Variant19857, - Variant19858, - Variant19859, - Variant19860, - Variant19861, - Variant19862, - Variant19863, - Variant19864, - Variant19865, - Variant19866, - Variant19867, - Variant19868, - Variant19869, - Variant19870, - Variant19871, - Variant19872, - Variant19873, - Variant19874, - Variant19875, - Variant19876, - Variant19877, - Variant19878, - Variant19879, - Variant19880, - Variant19881, - Variant19882, - Variant19883, - Variant19884, - Variant19885, - Variant19886, - Variant19887, - Variant19888, - Variant19889, - Variant19890, - Variant19891, - Variant19892, - Variant19893, - Variant19894, - Variant19895, - Variant19896, - Variant19897, - Variant19898, - Variant19899, - Variant19900, - Variant19901, - Variant19902, - Variant19903, - Variant19904, - Variant19905, - Variant19906, - Variant19907, - Variant19908, - Variant19909, - Variant19910, - Variant19911, - Variant19912, - Variant19913, - Variant19914, - Variant19915, - Variant19916, - Variant19917, - Variant19918, - Variant19919, - Variant19920, - Variant19921, - Variant19922, - Variant19923, - Variant19924, - Variant19925, - Variant19926, - Variant19927, - Variant19928, - Variant19929, - Variant19930, - Variant19931, - Variant19932, - Variant19933, - Variant19934, - Variant19935, - Variant19936, - Variant19937, - Variant19938, - Variant19939, - Variant19940, - Variant19941, - Variant19942, - Variant19943, - Variant19944, - Variant19945, - Variant19946, - Variant19947, - Variant19948, - Variant19949, - Variant19950, - Variant19951, - Variant19952, - Variant19953, - Variant19954, - Variant19955, - Variant19956, - Variant19957, - Variant19958, - Variant19959, - Variant19960, - Variant19961, - Variant19962, - Variant19963, - Variant19964, - Variant19965, - Variant19966, - Variant19967, - Variant19968, - Variant19969, - Variant19970, - Variant19971, - Variant19972, - Variant19973, - Variant19974, - Variant19975, - Variant19976, - Variant19977, - Variant19978, - Variant19979, - Variant19980, - Variant19981, - Variant19982, - Variant19983, - Variant19984, - Variant19985, - Variant19986, - Variant19987, - Variant19988, - Variant19989, - Variant19990, - Variant19991, - Variant19992, - Variant19993, - Variant19994, - Variant19995, - Variant19996, - Variant19997, - Variant19998, - Variant19999, - Variant20000, - Variant20001, - Variant20002, - Variant20003, - Variant20004, - Variant20005, - Variant20006, - Variant20007, - Variant20008, - Variant20009, - Variant20010, - Variant20011, - Variant20012, - Variant20013, - Variant20014, - Variant20015, - Variant20016, - Variant20017, - Variant20018, - Variant20019, - Variant20020, - Variant20021, - Variant20022, - Variant20023, - Variant20024, - Variant20025, - Variant20026, - Variant20027, - Variant20028, - Variant20029, - Variant20030, - Variant20031, - Variant20032, - Variant20033, - Variant20034, - Variant20035, - Variant20036, - Variant20037, - Variant20038, - Variant20039, - Variant20040, - Variant20041, - Variant20042, - Variant20043, - Variant20044, - Variant20045, - Variant20046, - Variant20047, - Variant20048, - Variant20049, - Variant20050, - Variant20051, - Variant20052, - Variant20053, - Variant20054, - Variant20055, - Variant20056, - Variant20057, - Variant20058, - Variant20059, - Variant20060, - Variant20061, - Variant20062, - Variant20063, - Variant20064, - Variant20065, - Variant20066, - Variant20067, - Variant20068, - Variant20069, - Variant20070, - Variant20071, - Variant20072, - Variant20073, - Variant20074, - Variant20075, - Variant20076, - Variant20077, - Variant20078, - Variant20079, - Variant20080, - Variant20081, - Variant20082, - Variant20083, - Variant20084, - Variant20085, - Variant20086, - Variant20087, - Variant20088, - Variant20089, - Variant20090, - Variant20091, - Variant20092, - Variant20093, - Variant20094, - Variant20095, - Variant20096, - Variant20097, - Variant20098, - Variant20099, - Variant20100, - Variant20101, - Variant20102, - Variant20103, - Variant20104, - Variant20105, - Variant20106, - Variant20107, - Variant20108, - Variant20109, - Variant20110, - Variant20111, - Variant20112, - Variant20113, - Variant20114, - Variant20115, - Variant20116, - Variant20117, - Variant20118, - Variant20119, - Variant20120, - Variant20121, - Variant20122, - Variant20123, - Variant20124, - Variant20125, - Variant20126, - Variant20127, - Variant20128, - Variant20129, - Variant20130, - Variant20131, - Variant20132, - Variant20133, - Variant20134, - Variant20135, - Variant20136, - Variant20137, - Variant20138, - Variant20139, - Variant20140, - Variant20141, - Variant20142, - Variant20143, - Variant20144, - Variant20145, - Variant20146, - Variant20147, - Variant20148, - Variant20149, - Variant20150, - Variant20151, - Variant20152, - Variant20153, - Variant20154, - Variant20155, - Variant20156, - Variant20157, - Variant20158, - Variant20159, - Variant20160, - Variant20161, - Variant20162, - Variant20163, - Variant20164, - Variant20165, - Variant20166, - Variant20167, - Variant20168, - Variant20169, - Variant20170, - Variant20171, - Variant20172, - Variant20173, - Variant20174, - Variant20175, - Variant20176, - Variant20177, - Variant20178, - Variant20179, - Variant20180, - Variant20181, - Variant20182, - Variant20183, - Variant20184, - Variant20185, - Variant20186, - Variant20187, - Variant20188, - Variant20189, - Variant20190, - Variant20191, - Variant20192, - Variant20193, - Variant20194, - Variant20195, - Variant20196, - Variant20197, - Variant20198, - Variant20199, - Variant20200, - Variant20201, - Variant20202, - Variant20203, - Variant20204, - Variant20205, - Variant20206, - Variant20207, - Variant20208, - Variant20209, - Variant20210, - Variant20211, - Variant20212, - Variant20213, - Variant20214, - Variant20215, - Variant20216, - Variant20217, - Variant20218, - Variant20219, - Variant20220, - Variant20221, - Variant20222, - Variant20223, - Variant20224, - Variant20225, - Variant20226, - Variant20227, - Variant20228, - Variant20229, - Variant20230, - Variant20231, - Variant20232, - Variant20233, - Variant20234, - Variant20235, - Variant20236, - Variant20237, - Variant20238, - Variant20239, - Variant20240, - Variant20241, - Variant20242, - Variant20243, - Variant20244, - Variant20245, - Variant20246, - Variant20247, - Variant20248, - Variant20249, - Variant20250, - Variant20251, - Variant20252, - Variant20253, - Variant20254, - Variant20255, - Variant20256, - Variant20257, - Variant20258, - Variant20259, - Variant20260, - Variant20261, - Variant20262, - Variant20263, - Variant20264, - Variant20265, - Variant20266, - Variant20267, - Variant20268, - Variant20269, - Variant20270, - Variant20271, - Variant20272, - Variant20273, - Variant20274, - Variant20275, - Variant20276, - Variant20277, - Variant20278, - Variant20279, - Variant20280, - Variant20281, - Variant20282, - Variant20283, - Variant20284, - Variant20285, - Variant20286, - Variant20287, - Variant20288, - Variant20289, - Variant20290, - Variant20291, - Variant20292, - Variant20293, - Variant20294, - Variant20295, - Variant20296, - Variant20297, - Variant20298, - Variant20299, - Variant20300, - Variant20301, - Variant20302, - Variant20303, - Variant20304, - Variant20305, - Variant20306, - Variant20307, - Variant20308, - Variant20309, - Variant20310, - Variant20311, - Variant20312, - Variant20313, - Variant20314, - Variant20315, - Variant20316, - Variant20317, - Variant20318, - Variant20319, - Variant20320, - Variant20321, - Variant20322, - Variant20323, - Variant20324, - Variant20325, - Variant20326, - Variant20327, - Variant20328, - Variant20329, - Variant20330, - Variant20331, - Variant20332, - Variant20333, - Variant20334, - Variant20335, - Variant20336, - Variant20337, - Variant20338, - Variant20339, - Variant20340, - Variant20341, - Variant20342, - Variant20343, - Variant20344, - Variant20345, - Variant20346, - Variant20347, - Variant20348, - Variant20349, - Variant20350, - Variant20351, - Variant20352, - Variant20353, - Variant20354, - Variant20355, - Variant20356, - Variant20357, - Variant20358, - Variant20359, - Variant20360, - Variant20361, - Variant20362, - Variant20363, - Variant20364, - Variant20365, - Variant20366, - Variant20367, - Variant20368, - Variant20369, - Variant20370, - Variant20371, - Variant20372, - Variant20373, - Variant20374, - Variant20375, - Variant20376, - Variant20377, - Variant20378, - Variant20379, - Variant20380, - Variant20381, - Variant20382, - Variant20383, - Variant20384, - Variant20385, - Variant20386, - Variant20387, - Variant20388, - Variant20389, - Variant20390, - Variant20391, - Variant20392, - Variant20393, - Variant20394, - Variant20395, - Variant20396, - Variant20397, - Variant20398, - Variant20399, - Variant20400, - Variant20401, - Variant20402, - Variant20403, - Variant20404, - Variant20405, - Variant20406, - Variant20407, - Variant20408, - Variant20409, - Variant20410, - Variant20411, - Variant20412, - Variant20413, - Variant20414, - Variant20415, - Variant20416, - Variant20417, - Variant20418, - Variant20419, - Variant20420, - Variant20421, - Variant20422, - Variant20423, - Variant20424, - Variant20425, - Variant20426, - Variant20427, - Variant20428, - Variant20429, - Variant20430, - Variant20431, - Variant20432, - Variant20433, - Variant20434, - Variant20435, - Variant20436, - Variant20437, - Variant20438, - Variant20439, - Variant20440, - Variant20441, - Variant20442, - Variant20443, - Variant20444, - Variant20445, - Variant20446, - Variant20447, - Variant20448, - Variant20449, - Variant20450, - Variant20451, - Variant20452, - Variant20453, - Variant20454, - Variant20455, - Variant20456, - Variant20457, - Variant20458, - Variant20459, - Variant20460, - Variant20461, - Variant20462, - Variant20463, - Variant20464, - Variant20465, - Variant20466, - Variant20467, - Variant20468, - Variant20469, - Variant20470, - Variant20471, - Variant20472, - Variant20473, - Variant20474, - Variant20475, - Variant20476, - Variant20477, - Variant20478, - Variant20479, - Variant20480, - Variant20481, - Variant20482, - Variant20483, - Variant20484, - Variant20485, - Variant20486, - Variant20487, - Variant20488, - Variant20489, - Variant20490, - Variant20491, - Variant20492, - Variant20493, - Variant20494, - Variant20495, - Variant20496, - Variant20497, - Variant20498, - Variant20499, - Variant20500, - Variant20501, - Variant20502, - Variant20503, - Variant20504, - Variant20505, - Variant20506, - Variant20507, - Variant20508, - Variant20509, - Variant20510, - Variant20511, - Variant20512, - Variant20513, - Variant20514, - Variant20515, - Variant20516, - Variant20517, - Variant20518, - Variant20519, - Variant20520, - Variant20521, - Variant20522, - Variant20523, - Variant20524, - Variant20525, - Variant20526, - Variant20527, - Variant20528, - Variant20529, - Variant20530, - Variant20531, - Variant20532, - Variant20533, - Variant20534, - Variant20535, - Variant20536, - Variant20537, - Variant20538, - Variant20539, - Variant20540, - Variant20541, - Variant20542, - Variant20543, - Variant20544, - Variant20545, - Variant20546, - Variant20547, - Variant20548, - Variant20549, - Variant20550, - Variant20551, - Variant20552, - Variant20553, - Variant20554, - Variant20555, - Variant20556, - Variant20557, - Variant20558, - Variant20559, - Variant20560, - Variant20561, - Variant20562, - Variant20563, - Variant20564, - Variant20565, - Variant20566, - Variant20567, - Variant20568, - Variant20569, - Variant20570, - Variant20571, - Variant20572, - Variant20573, - Variant20574, - Variant20575, - Variant20576, - Variant20577, - Variant20578, - Variant20579, - Variant20580, - Variant20581, - Variant20582, - Variant20583, - Variant20584, - Variant20585, - Variant20586, - Variant20587, - Variant20588, - Variant20589, - Variant20590, - Variant20591, - Variant20592, - Variant20593, - Variant20594, - Variant20595, - Variant20596, - Variant20597, - Variant20598, - Variant20599, - Variant20600, - Variant20601, - Variant20602, - Variant20603, - Variant20604, - Variant20605, - Variant20606, - Variant20607, - Variant20608, - Variant20609, - Variant20610, - Variant20611, - Variant20612, - Variant20613, - Variant20614, - Variant20615, - Variant20616, - Variant20617, - Variant20618, - Variant20619, - Variant20620, - Variant20621, - Variant20622, - Variant20623, - Variant20624, - Variant20625, - Variant20626, - Variant20627, - Variant20628, - Variant20629, - Variant20630, - Variant20631, - Variant20632, - Variant20633, - Variant20634, - Variant20635, - Variant20636, - Variant20637, - Variant20638, - Variant20639, - Variant20640, - Variant20641, - Variant20642, - Variant20643, - Variant20644, - Variant20645, - Variant20646, - Variant20647, - Variant20648, - Variant20649, - Variant20650, - Variant20651, - Variant20652, - Variant20653, - Variant20654, - Variant20655, - Variant20656, - Variant20657, - Variant20658, - Variant20659, - Variant20660, - Variant20661, - Variant20662, - Variant20663, - Variant20664, - Variant20665, - Variant20666, - Variant20667, - Variant20668, - Variant20669, - Variant20670, - Variant20671, - Variant20672, - Variant20673, - Variant20674, - Variant20675, - Variant20676, - Variant20677, - Variant20678, - Variant20679, - Variant20680, - Variant20681, - Variant20682, - Variant20683, - Variant20684, - Variant20685, - Variant20686, - Variant20687, - Variant20688, - Variant20689, - Variant20690, - Variant20691, - Variant20692, - Variant20693, - Variant20694, - Variant20695, - Variant20696, - Variant20697, - Variant20698, - Variant20699, - Variant20700, - Variant20701, - Variant20702, - Variant20703, - Variant20704, - Variant20705, - Variant20706, - Variant20707, - Variant20708, - Variant20709, - Variant20710, - Variant20711, - Variant20712, - Variant20713, - Variant20714, - Variant20715, - Variant20716, - Variant20717, - Variant20718, - Variant20719, - Variant20720, - Variant20721, - Variant20722, - Variant20723, - Variant20724, - Variant20725, - Variant20726, - Variant20727, - Variant20728, - Variant20729, - Variant20730, - Variant20731, - Variant20732, - Variant20733, - Variant20734, - Variant20735, - Variant20736, - Variant20737, - Variant20738, - Variant20739, - Variant20740, - Variant20741, - Variant20742, - Variant20743, - Variant20744, - Variant20745, - Variant20746, - Variant20747, - Variant20748, - Variant20749, - Variant20750, - Variant20751, - Variant20752, - Variant20753, - Variant20754, - Variant20755, - Variant20756, - Variant20757, - Variant20758, - Variant20759, - Variant20760, - Variant20761, - Variant20762, - Variant20763, - Variant20764, - Variant20765, - Variant20766, - Variant20767, - Variant20768, - Variant20769, - Variant20770, - Variant20771, - Variant20772, - Variant20773, - Variant20774, - Variant20775, - Variant20776, - Variant20777, - Variant20778, - Variant20779, - Variant20780, - Variant20781, - Variant20782, - Variant20783, - Variant20784, - Variant20785, - Variant20786, - Variant20787, - Variant20788, - Variant20789, - Variant20790, - Variant20791, - Variant20792, - Variant20793, - Variant20794, - Variant20795, - Variant20796, - Variant20797, - Variant20798, - Variant20799, - Variant20800, - Variant20801, - Variant20802, - Variant20803, - Variant20804, - Variant20805, - Variant20806, - Variant20807, - Variant20808, - Variant20809, - Variant20810, - Variant20811, - Variant20812, - Variant20813, - Variant20814, - Variant20815, - Variant20816, - Variant20817, - Variant20818, - Variant20819, - Variant20820, - Variant20821, - Variant20822, - Variant20823, - Variant20824, - Variant20825, - Variant20826, - Variant20827, - Variant20828, - Variant20829, - Variant20830, - Variant20831, - Variant20832, - Variant20833, - Variant20834, - Variant20835, - Variant20836, - Variant20837, - Variant20838, - Variant20839, - Variant20840, - Variant20841, - Variant20842, - Variant20843, - Variant20844, - Variant20845, - Variant20846, - Variant20847, - Variant20848, - Variant20849, - Variant20850, - Variant20851, - Variant20852, - Variant20853, - Variant20854, - Variant20855, - Variant20856, - Variant20857, - Variant20858, - Variant20859, - Variant20860, - Variant20861, - Variant20862, - Variant20863, - Variant20864, - Variant20865, - Variant20866, - Variant20867, - Variant20868, - Variant20869, - Variant20870, - Variant20871, - Variant20872, - Variant20873, - Variant20874, - Variant20875, - Variant20876, - Variant20877, - Variant20878, - Variant20879, - Variant20880, - Variant20881, - Variant20882, - Variant20883, - Variant20884, - Variant20885, - Variant20886, - Variant20887, - Variant20888, - Variant20889, - Variant20890, - Variant20891, - Variant20892, - Variant20893, - Variant20894, - Variant20895, - Variant20896, - Variant20897, - Variant20898, - Variant20899, - Variant20900, - Variant20901, - Variant20902, - Variant20903, - Variant20904, - Variant20905, - Variant20906, - Variant20907, - Variant20908, - Variant20909, - Variant20910, - Variant20911, - Variant20912, - Variant20913, - Variant20914, - Variant20915, - Variant20916, - Variant20917, - Variant20918, - Variant20919, - Variant20920, - Variant20921, - Variant20922, - Variant20923, - Variant20924, - Variant20925, - Variant20926, - Variant20927, - Variant20928, - Variant20929, - Variant20930, - Variant20931, - Variant20932, - Variant20933, - Variant20934, - Variant20935, - Variant20936, - Variant20937, - Variant20938, - Variant20939, - Variant20940, - Variant20941, - Variant20942, - Variant20943, - Variant20944, - Variant20945, - Variant20946, - Variant20947, - Variant20948, - Variant20949, - Variant20950, - Variant20951, - Variant20952, - Variant20953, - Variant20954, - Variant20955, - Variant20956, - Variant20957, - Variant20958, - Variant20959, - Variant20960, - Variant20961, - Variant20962, - Variant20963, - Variant20964, - Variant20965, - Variant20966, - Variant20967, - Variant20968, - Variant20969, - Variant20970, - Variant20971, - Variant20972, - Variant20973, - Variant20974, - Variant20975, - Variant20976, - Variant20977, - Variant20978, - Variant20979, - Variant20980, - Variant20981, - Variant20982, - Variant20983, - Variant20984, - Variant20985, - Variant20986, - Variant20987, - Variant20988, - Variant20989, - Variant20990, - Variant20991, - Variant20992, - Variant20993, - Variant20994, - Variant20995, - Variant20996, - Variant20997, - Variant20998, - Variant20999, - Variant21000, - Variant21001, - Variant21002, - Variant21003, - Variant21004, - Variant21005, - Variant21006, - Variant21007, - Variant21008, - Variant21009, - Variant21010, - Variant21011, - Variant21012, - Variant21013, - Variant21014, - Variant21015, - Variant21016, - Variant21017, - Variant21018, - Variant21019, - Variant21020, - Variant21021, - Variant21022, - Variant21023, - Variant21024, - Variant21025, - Variant21026, - Variant21027, - Variant21028, - Variant21029, - Variant21030, - Variant21031, - Variant21032, - Variant21033, - Variant21034, - Variant21035, - Variant21036, - Variant21037, - Variant21038, - Variant21039, - Variant21040, - Variant21041, - Variant21042, - Variant21043, - Variant21044, - Variant21045, - Variant21046, - Variant21047, - Variant21048, - Variant21049, - Variant21050, - Variant21051, - Variant21052, - Variant21053, - Variant21054, - Variant21055, - Variant21056, - Variant21057, - Variant21058, - Variant21059, - Variant21060, - Variant21061, - Variant21062, - Variant21063, - Variant21064, - Variant21065, - Variant21066, - Variant21067, - Variant21068, - Variant21069, - Variant21070, - Variant21071, - Variant21072, - Variant21073, - Variant21074, - Variant21075, - Variant21076, - Variant21077, - Variant21078, - Variant21079, - Variant21080, - Variant21081, - Variant21082, - Variant21083, - Variant21084, - Variant21085, - Variant21086, - Variant21087, - Variant21088, - Variant21089, - Variant21090, - Variant21091, - Variant21092, - Variant21093, - Variant21094, - Variant21095, - Variant21096, - Variant21097, - Variant21098, - Variant21099, - Variant21100, - Variant21101, - Variant21102, - Variant21103, - Variant21104, - Variant21105, - Variant21106, - Variant21107, - Variant21108, - Variant21109, - Variant21110, - Variant21111, - Variant21112, - Variant21113, - Variant21114, - Variant21115, - Variant21116, - Variant21117, - Variant21118, - Variant21119, - Variant21120, - Variant21121, - Variant21122, - Variant21123, - Variant21124, - Variant21125, - Variant21126, - Variant21127, - Variant21128, - Variant21129, - Variant21130, - Variant21131, - Variant21132, - Variant21133, - Variant21134, - Variant21135, - Variant21136, - Variant21137, - Variant21138, - Variant21139, - Variant21140, - Variant21141, - Variant21142, - Variant21143, - Variant21144, - Variant21145, - Variant21146, - Variant21147, - Variant21148, - Variant21149, - Variant21150, - Variant21151, - Variant21152, - Variant21153, - Variant21154, - Variant21155, - Variant21156, - Variant21157, - Variant21158, - Variant21159, - Variant21160, - Variant21161, - Variant21162, - Variant21163, - Variant21164, - Variant21165, - Variant21166, - Variant21167, - Variant21168, - Variant21169, - Variant21170, - Variant21171, - Variant21172, - Variant21173, - Variant21174, - Variant21175, - Variant21176, - Variant21177, - Variant21178, - Variant21179, - Variant21180, - Variant21181, - Variant21182, - Variant21183, - Variant21184, - Variant21185, - Variant21186, - Variant21187, - Variant21188, - Variant21189, - Variant21190, - Variant21191, - Variant21192, - Variant21193, - Variant21194, - Variant21195, - Variant21196, - Variant21197, - Variant21198, - Variant21199, - Variant21200, - Variant21201, - Variant21202, - Variant21203, - Variant21204, - Variant21205, - Variant21206, - Variant21207, - Variant21208, - Variant21209, - Variant21210, - Variant21211, - Variant21212, - Variant21213, - Variant21214, - Variant21215, - Variant21216, - Variant21217, - Variant21218, - Variant21219, - Variant21220, - Variant21221, - Variant21222, - Variant21223, - Variant21224, - Variant21225, - Variant21226, - Variant21227, - Variant21228, - Variant21229, - Variant21230, - Variant21231, - Variant21232, - Variant21233, - Variant21234, - Variant21235, - Variant21236, - Variant21237, - Variant21238, - Variant21239, - Variant21240, - Variant21241, - Variant21242, - Variant21243, - Variant21244, - Variant21245, - Variant21246, - Variant21247, - Variant21248, - Variant21249, - Variant21250, - Variant21251, - Variant21252, - Variant21253, - Variant21254, - Variant21255, - Variant21256, - Variant21257, - Variant21258, - Variant21259, - Variant21260, - Variant21261, - Variant21262, - Variant21263, - Variant21264, - Variant21265, - Variant21266, - Variant21267, - Variant21268, - Variant21269, - Variant21270, - Variant21271, - Variant21272, - Variant21273, - Variant21274, - Variant21275, - Variant21276, - Variant21277, - Variant21278, - Variant21279, - Variant21280, - Variant21281, - Variant21282, - Variant21283, - Variant21284, - Variant21285, - Variant21286, - Variant21287, - Variant21288, - Variant21289, - Variant21290, - Variant21291, - Variant21292, - Variant21293, - Variant21294, - Variant21295, - Variant21296, - Variant21297, - Variant21298, - Variant21299, - Variant21300, - Variant21301, - Variant21302, - Variant21303, - Variant21304, - Variant21305, - Variant21306, - Variant21307, - Variant21308, - Variant21309, - Variant21310, - Variant21311, - Variant21312, - Variant21313, - Variant21314, - Variant21315, - Variant21316, - Variant21317, - Variant21318, - Variant21319, - Variant21320, - Variant21321, - Variant21322, - Variant21323, - Variant21324, - Variant21325, - Variant21326, - Variant21327, - Variant21328, - Variant21329, - Variant21330, - Variant21331, - Variant21332, - Variant21333, - Variant21334, - Variant21335, - Variant21336, - Variant21337, - Variant21338, - Variant21339, - Variant21340, - Variant21341, - Variant21342, - Variant21343, - Variant21344, - Variant21345, - Variant21346, - Variant21347, - Variant21348, - Variant21349, - Variant21350, - Variant21351, - Variant21352, - Variant21353, - Variant21354, - Variant21355, - Variant21356, - Variant21357, - Variant21358, - Variant21359, - Variant21360, - Variant21361, - Variant21362, - Variant21363, - Variant21364, - Variant21365, - Variant21366, - Variant21367, - Variant21368, - Variant21369, - Variant21370, - Variant21371, - Variant21372, - Variant21373, - Variant21374, - Variant21375, - Variant21376, - Variant21377, - Variant21378, - Variant21379, - Variant21380, - Variant21381, - Variant21382, - Variant21383, - Variant21384, - Variant21385, - Variant21386, - Variant21387, - Variant21388, - Variant21389, - Variant21390, - Variant21391, - Variant21392, - Variant21393, - Variant21394, - Variant21395, - Variant21396, - Variant21397, - Variant21398, - Variant21399, - Variant21400, - Variant21401, - Variant21402, - Variant21403, - Variant21404, - Variant21405, - Variant21406, - Variant21407, - Variant21408, - Variant21409, - Variant21410, - Variant21411, - Variant21412, - Variant21413, - Variant21414, - Variant21415, - Variant21416, - Variant21417, - Variant21418, - Variant21419, - Variant21420, - Variant21421, - Variant21422, - Variant21423, - Variant21424, - Variant21425, - Variant21426, - Variant21427, - Variant21428, - Variant21429, - Variant21430, - Variant21431, - Variant21432, - Variant21433, - Variant21434, - Variant21435, - Variant21436, - Variant21437, - Variant21438, - Variant21439, - Variant21440, - Variant21441, - Variant21442, - Variant21443, - Variant21444, - Variant21445, - Variant21446, - Variant21447, - Variant21448, - Variant21449, - Variant21450, - Variant21451, - Variant21452, - Variant21453, - Variant21454, - Variant21455, - Variant21456, - Variant21457, - Variant21458, - Variant21459, - Variant21460, - Variant21461, - Variant21462, - Variant21463, - Variant21464, - Variant21465, - Variant21466, - Variant21467, - Variant21468, - Variant21469, - Variant21470, - Variant21471, - Variant21472, - Variant21473, - Variant21474, - Variant21475, - Variant21476, - Variant21477, - Variant21478, - Variant21479, - Variant21480, - Variant21481, - Variant21482, - Variant21483, - Variant21484, - Variant21485, - Variant21486, - Variant21487, - Variant21488, - Variant21489, - Variant21490, - Variant21491, - Variant21492, - Variant21493, - Variant21494, - Variant21495, - Variant21496, - Variant21497, - Variant21498, - Variant21499, - Variant21500, - Variant21501, - Variant21502, - Variant21503, - Variant21504, - Variant21505, - Variant21506, - Variant21507, - Variant21508, - Variant21509, - Variant21510, - Variant21511, - Variant21512, - Variant21513, - Variant21514, - Variant21515, - Variant21516, - Variant21517, - Variant21518, - Variant21519, - Variant21520, - Variant21521, - Variant21522, - Variant21523, - Variant21524, - Variant21525, - Variant21526, - Variant21527, - Variant21528, - Variant21529, - Variant21530, - Variant21531, - Variant21532, - Variant21533, - Variant21534, - Variant21535, - Variant21536, - Variant21537, - Variant21538, - Variant21539, - Variant21540, - Variant21541, - Variant21542, - Variant21543, - Variant21544, - Variant21545, - Variant21546, - Variant21547, - Variant21548, - Variant21549, - Variant21550, - Variant21551, - Variant21552, - Variant21553, - Variant21554, - Variant21555, - Variant21556, - Variant21557, - Variant21558, - Variant21559, - Variant21560, - Variant21561, - Variant21562, - Variant21563, - Variant21564, - Variant21565, - Variant21566, - Variant21567, - Variant21568, - Variant21569, - Variant21570, - Variant21571, - Variant21572, - Variant21573, - Variant21574, - Variant21575, - Variant21576, - Variant21577, - Variant21578, - Variant21579, - Variant21580, - Variant21581, - Variant21582, - Variant21583, - Variant21584, - Variant21585, - Variant21586, - Variant21587, - Variant21588, - Variant21589, - Variant21590, - Variant21591, - Variant21592, - Variant21593, - Variant21594, - Variant21595, - Variant21596, - Variant21597, - Variant21598, - Variant21599, - Variant21600, - Variant21601, - Variant21602, - Variant21603, - Variant21604, - Variant21605, - Variant21606, - Variant21607, - Variant21608, - Variant21609, - Variant21610, - Variant21611, - Variant21612, - Variant21613, - Variant21614, - Variant21615, - Variant21616, - Variant21617, - Variant21618, - Variant21619, - Variant21620, - Variant21621, - Variant21622, - Variant21623, - Variant21624, - Variant21625, - Variant21626, - Variant21627, - Variant21628, - Variant21629, - Variant21630, - Variant21631, - Variant21632, - Variant21633, - Variant21634, - Variant21635, - Variant21636, - Variant21637, - Variant21638, - Variant21639, - Variant21640, - Variant21641, - Variant21642, - Variant21643, - Variant21644, - Variant21645, - Variant21646, - Variant21647, - Variant21648, - Variant21649, - Variant21650, - Variant21651, - Variant21652, - Variant21653, - Variant21654, - Variant21655, - Variant21656, - Variant21657, - Variant21658, - Variant21659, - Variant21660, - Variant21661, - Variant21662, - Variant21663, - Variant21664, - Variant21665, - Variant21666, - Variant21667, - Variant21668, - Variant21669, - Variant21670, - Variant21671, - Variant21672, - Variant21673, - Variant21674, - Variant21675, - Variant21676, - Variant21677, - Variant21678, - Variant21679, - Variant21680, - Variant21681, - Variant21682, - Variant21683, - Variant21684, - Variant21685, - Variant21686, - Variant21687, - Variant21688, - Variant21689, - Variant21690, - Variant21691, - Variant21692, - Variant21693, - Variant21694, - Variant21695, - Variant21696, - Variant21697, - Variant21698, - Variant21699, - Variant21700, - Variant21701, - Variant21702, - Variant21703, - Variant21704, - Variant21705, - Variant21706, - Variant21707, - Variant21708, - Variant21709, - Variant21710, - Variant21711, - Variant21712, - Variant21713, - Variant21714, - Variant21715, - Variant21716, - Variant21717, - Variant21718, - Variant21719, - Variant21720, - Variant21721, - Variant21722, - Variant21723, - Variant21724, - Variant21725, - Variant21726, - Variant21727, - Variant21728, - Variant21729, - Variant21730, - Variant21731, - Variant21732, - Variant21733, - Variant21734, - Variant21735, - Variant21736, - Variant21737, - Variant21738, - Variant21739, - Variant21740, - Variant21741, - Variant21742, - Variant21743, - Variant21744, - Variant21745, - Variant21746, - Variant21747, - Variant21748, - Variant21749, - Variant21750, - Variant21751, - Variant21752, - Variant21753, - Variant21754, - Variant21755, - Variant21756, - Variant21757, - Variant21758, - Variant21759, - Variant21760, - Variant21761, - Variant21762, - Variant21763, - Variant21764, - Variant21765, - Variant21766, - Variant21767, - Variant21768, - Variant21769, - Variant21770, - Variant21771, - Variant21772, - Variant21773, - Variant21774, - Variant21775, - Variant21776, - Variant21777, - Variant21778, - Variant21779, - Variant21780, - Variant21781, - Variant21782, - Variant21783, - Variant21784, - Variant21785, - Variant21786, - Variant21787, - Variant21788, - Variant21789, - Variant21790, - Variant21791, - Variant21792, - Variant21793, - Variant21794, - Variant21795, - Variant21796, - Variant21797, - Variant21798, - Variant21799, - Variant21800, - Variant21801, - Variant21802, - Variant21803, - Variant21804, - Variant21805, - Variant21806, - Variant21807, - Variant21808, - Variant21809, - Variant21810, - Variant21811, - Variant21812, - Variant21813, - Variant21814, - Variant21815, - Variant21816, - Variant21817, - Variant21818, - Variant21819, - Variant21820, - Variant21821, - Variant21822, - Variant21823, - Variant21824, - Variant21825, - Variant21826, - Variant21827, - Variant21828, - Variant21829, - Variant21830, - Variant21831, - Variant21832, - Variant21833, - Variant21834, - Variant21835, - Variant21836, - Variant21837, - Variant21838, - Variant21839, - Variant21840, - Variant21841, - Variant21842, - Variant21843, - Variant21844, - Variant21845, - Variant21846, - Variant21847, - Variant21848, - Variant21849, - Variant21850, - Variant21851, - Variant21852, - Variant21853, - Variant21854, - Variant21855, - Variant21856, - Variant21857, - Variant21858, - Variant21859, - Variant21860, - Variant21861, - Variant21862, - Variant21863, - Variant21864, - Variant21865, - Variant21866, - Variant21867, - Variant21868, - Variant21869, - Variant21870, - Variant21871, - Variant21872, - Variant21873, - Variant21874, - Variant21875, - Variant21876, - Variant21877, - Variant21878, - Variant21879, - Variant21880, - Variant21881, - Variant21882, - Variant21883, - Variant21884, - Variant21885, - Variant21886, - Variant21887, - Variant21888, - Variant21889, - Variant21890, - Variant21891, - Variant21892, - Variant21893, - Variant21894, - Variant21895, - Variant21896, - Variant21897, - Variant21898, - Variant21899, - Variant21900, - Variant21901, - Variant21902, - Variant21903, - Variant21904, - Variant21905, - Variant21906, - Variant21907, - Variant21908, - Variant21909, - Variant21910, - Variant21911, - Variant21912, - Variant21913, - Variant21914, - Variant21915, - Variant21916, - Variant21917, - Variant21918, - Variant21919, - Variant21920, - Variant21921, - Variant21922, - Variant21923, - Variant21924, - Variant21925, - Variant21926, - Variant21927, - Variant21928, - Variant21929, - Variant21930, - Variant21931, - Variant21932, - Variant21933, - Variant21934, - Variant21935, - Variant21936, - Variant21937, - Variant21938, - Variant21939, - Variant21940, - Variant21941, - Variant21942, - Variant21943, - Variant21944, - Variant21945, - Variant21946, - Variant21947, - Variant21948, - Variant21949, - Variant21950, - Variant21951, - Variant21952, - Variant21953, - Variant21954, - Variant21955, - Variant21956, - Variant21957, - Variant21958, - Variant21959, - Variant21960, - Variant21961, - Variant21962, - Variant21963, - Variant21964, - Variant21965, - Variant21966, - Variant21967, - Variant21968, - Variant21969, - Variant21970, - Variant21971, - Variant21972, - Variant21973, - Variant21974, - Variant21975, - Variant21976, - Variant21977, - Variant21978, - Variant21979, - Variant21980, - Variant21981, - Variant21982, - Variant21983, - Variant21984, - Variant21985, - Variant21986, - Variant21987, - Variant21988, - Variant21989, - Variant21990, - Variant21991, - Variant21992, - Variant21993, - Variant21994, - Variant21995, - Variant21996, - Variant21997, - Variant21998, - Variant21999, - Variant22000, - Variant22001, - Variant22002, - Variant22003, - Variant22004, - Variant22005, - Variant22006, - Variant22007, - Variant22008, - Variant22009, - Variant22010, - Variant22011, - Variant22012, - Variant22013, - Variant22014, - Variant22015, - Variant22016, - Variant22017, - Variant22018, - Variant22019, - Variant22020, - Variant22021, - Variant22022, - Variant22023, - Variant22024, - Variant22025, - Variant22026, - Variant22027, - Variant22028, - Variant22029, - Variant22030, - Variant22031, - Variant22032, - Variant22033, - Variant22034, - Variant22035, - Variant22036, - Variant22037, - Variant22038, - Variant22039, - Variant22040, - Variant22041, - Variant22042, - Variant22043, - Variant22044, - Variant22045, - Variant22046, - Variant22047, - Variant22048, - Variant22049, - Variant22050, - Variant22051, - Variant22052, - Variant22053, - Variant22054, - Variant22055, - Variant22056, - Variant22057, - Variant22058, - Variant22059, - Variant22060, - Variant22061, - Variant22062, - Variant22063, - Variant22064, - Variant22065, - Variant22066, - Variant22067, - Variant22068, - Variant22069, - Variant22070, - Variant22071, - Variant22072, - Variant22073, - Variant22074, - Variant22075, - Variant22076, - Variant22077, - Variant22078, - Variant22079, - Variant22080, - Variant22081, - Variant22082, - Variant22083, - Variant22084, - Variant22085, - Variant22086, - Variant22087, - Variant22088, - Variant22089, - Variant22090, - Variant22091, - Variant22092, - Variant22093, - Variant22094, - Variant22095, - Variant22096, - Variant22097, - Variant22098, - Variant22099, - Variant22100, - Variant22101, - Variant22102, - Variant22103, - Variant22104, - Variant22105, - Variant22106, - Variant22107, - Variant22108, - Variant22109, - Variant22110, - Variant22111, - Variant22112, - Variant22113, - Variant22114, - Variant22115, - Variant22116, - Variant22117, - Variant22118, - Variant22119, - Variant22120, - Variant22121, - Variant22122, - Variant22123, - Variant22124, - Variant22125, - Variant22126, - Variant22127, - Variant22128, - Variant22129, - Variant22130, - Variant22131, - Variant22132, - Variant22133, - Variant22134, - Variant22135, - Variant22136, - Variant22137, - Variant22138, - Variant22139, - Variant22140, - Variant22141, - Variant22142, - Variant22143, - Variant22144, - Variant22145, - Variant22146, - Variant22147, - Variant22148, - Variant22149, - Variant22150, - Variant22151, - Variant22152, - Variant22153, - Variant22154, - Variant22155, - Variant22156, - Variant22157, - Variant22158, - Variant22159, - Variant22160, - Variant22161, - Variant22162, - Variant22163, - Variant22164, - Variant22165, - Variant22166, - Variant22167, - Variant22168, - Variant22169, - Variant22170, - Variant22171, - Variant22172, - Variant22173, - Variant22174, - Variant22175, - Variant22176, - Variant22177, - Variant22178, - Variant22179, - Variant22180, - Variant22181, - Variant22182, - Variant22183, - Variant22184, - Variant22185, - Variant22186, - Variant22187, - Variant22188, - Variant22189, - Variant22190, - Variant22191, - Variant22192, - Variant22193, - Variant22194, - Variant22195, - Variant22196, - Variant22197, - Variant22198, - Variant22199, - Variant22200, - Variant22201, - Variant22202, - Variant22203, - Variant22204, - Variant22205, - Variant22206, - Variant22207, - Variant22208, - Variant22209, - Variant22210, - Variant22211, - Variant22212, - Variant22213, - Variant22214, - Variant22215, - Variant22216, - Variant22217, - Variant22218, - Variant22219, - Variant22220, - Variant22221, - Variant22222, - Variant22223, - Variant22224, - Variant22225, - Variant22226, - Variant22227, - Variant22228, - Variant22229, - Variant22230, - Variant22231, - Variant22232, - Variant22233, - Variant22234, - Variant22235, - Variant22236, - Variant22237, - Variant22238, - Variant22239, - Variant22240, - Variant22241, - Variant22242, - Variant22243, - Variant22244, - Variant22245, - Variant22246, - Variant22247, - Variant22248, - Variant22249, - Variant22250, - Variant22251, - Variant22252, - Variant22253, - Variant22254, - Variant22255, - Variant22256, - Variant22257, - Variant22258, - Variant22259, - Variant22260, - Variant22261, - Variant22262, - Variant22263, - Variant22264, - Variant22265, - Variant22266, - Variant22267, - Variant22268, - Variant22269, - Variant22270, - Variant22271, - Variant22272, - Variant22273, - Variant22274, - Variant22275, - Variant22276, - Variant22277, - Variant22278, - Variant22279, - Variant22280, - Variant22281, - Variant22282, - Variant22283, - Variant22284, - Variant22285, - Variant22286, - Variant22287, - Variant22288, - Variant22289, - Variant22290, - Variant22291, - Variant22292, - Variant22293, - Variant22294, - Variant22295, - Variant22296, - Variant22297, - Variant22298, - Variant22299, - Variant22300, - Variant22301, - Variant22302, - Variant22303, - Variant22304, - Variant22305, - Variant22306, - Variant22307, - Variant22308, - Variant22309, - Variant22310, - Variant22311, - Variant22312, - Variant22313, - Variant22314, - Variant22315, - Variant22316, - Variant22317, - Variant22318, - Variant22319, - Variant22320, - Variant22321, - Variant22322, - Variant22323, - Variant22324, - Variant22325, - Variant22326, - Variant22327, - Variant22328, - Variant22329, - Variant22330, - Variant22331, - Variant22332, - Variant22333, - Variant22334, - Variant22335, - Variant22336, - Variant22337, - Variant22338, - Variant22339, - Variant22340, - Variant22341, - Variant22342, - Variant22343, - Variant22344, - Variant22345, - Variant22346, - Variant22347, - Variant22348, - Variant22349, - Variant22350, - Variant22351, - Variant22352, - Variant22353, - Variant22354, - Variant22355, - Variant22356, - Variant22357, - Variant22358, - Variant22359, - Variant22360, - Variant22361, - Variant22362, - Variant22363, - Variant22364, - Variant22365, - Variant22366, - Variant22367, - Variant22368, - Variant22369, - Variant22370, - Variant22371, - Variant22372, - Variant22373, - Variant22374, - Variant22375, - Variant22376, - Variant22377, - Variant22378, - Variant22379, - Variant22380, - Variant22381, - Variant22382, - Variant22383, - Variant22384, - Variant22385, - Variant22386, - Variant22387, - Variant22388, - Variant22389, - Variant22390, - Variant22391, - Variant22392, - Variant22393, - Variant22394, - Variant22395, - Variant22396, - Variant22397, - Variant22398, - Variant22399, - Variant22400, - Variant22401, - Variant22402, - Variant22403, - Variant22404, - Variant22405, - Variant22406, - Variant22407, - Variant22408, - Variant22409, - Variant22410, - Variant22411, - Variant22412, - Variant22413, - Variant22414, - Variant22415, - Variant22416, - Variant22417, - Variant22418, - Variant22419, - Variant22420, - Variant22421, - Variant22422, - Variant22423, - Variant22424, - Variant22425, - Variant22426, - Variant22427, - Variant22428, - Variant22429, - Variant22430, - Variant22431, - Variant22432, - Variant22433, - Variant22434, - Variant22435, - Variant22436, - Variant22437, - Variant22438, - Variant22439, - Variant22440, - Variant22441, - Variant22442, - Variant22443, - Variant22444, - Variant22445, - Variant22446, - Variant22447, - Variant22448, - Variant22449, - Variant22450, - Variant22451, - Variant22452, - Variant22453, - Variant22454, - Variant22455, - Variant22456, - Variant22457, - Variant22458, - Variant22459, - Variant22460, - Variant22461, - Variant22462, - Variant22463, - Variant22464, - Variant22465, - Variant22466, - Variant22467, - Variant22468, - Variant22469, - Variant22470, - Variant22471, - Variant22472, - Variant22473, - Variant22474, - Variant22475, - Variant22476, - Variant22477, - Variant22478, - Variant22479, - Variant22480, - Variant22481, - Variant22482, - Variant22483, - Variant22484, - Variant22485, - Variant22486, - Variant22487, - Variant22488, - Variant22489, - Variant22490, - Variant22491, - Variant22492, - Variant22493, - Variant22494, - Variant22495, - Variant22496, - Variant22497, - Variant22498, - Variant22499, - Variant22500, - Variant22501, - Variant22502, - Variant22503, - Variant22504, - Variant22505, - Variant22506, - Variant22507, - Variant22508, - Variant22509, - Variant22510, - Variant22511, - Variant22512, - Variant22513, - Variant22514, - Variant22515, - Variant22516, - Variant22517, - Variant22518, - Variant22519, - Variant22520, - Variant22521, - Variant22522, - Variant22523, - Variant22524, - Variant22525, - Variant22526, - Variant22527, - Variant22528, - Variant22529, - Variant22530, - Variant22531, - Variant22532, - Variant22533, - Variant22534, - Variant22535, - Variant22536, - Variant22537, - Variant22538, - Variant22539, - Variant22540, - Variant22541, - Variant22542, - Variant22543, - Variant22544, - Variant22545, - Variant22546, - Variant22547, - Variant22548, - Variant22549, - Variant22550, - Variant22551, - Variant22552, - Variant22553, - Variant22554, - Variant22555, - Variant22556, - Variant22557, - Variant22558, - Variant22559, - Variant22560, - Variant22561, - Variant22562, - Variant22563, - Variant22564, - Variant22565, - Variant22566, - Variant22567, - Variant22568, - Variant22569, - Variant22570, - Variant22571, - Variant22572, - Variant22573, - Variant22574, - Variant22575, - Variant22576, - Variant22577, - Variant22578, - Variant22579, - Variant22580, - Variant22581, - Variant22582, - Variant22583, - Variant22584, - Variant22585, - Variant22586, - Variant22587, - Variant22588, - Variant22589, - Variant22590, - Variant22591, - Variant22592, - Variant22593, - Variant22594, - Variant22595, - Variant22596, - Variant22597, - Variant22598, - Variant22599, - Variant22600, - Variant22601, - Variant22602, - Variant22603, - Variant22604, - Variant22605, - Variant22606, - Variant22607, - Variant22608, - Variant22609, - Variant22610, - Variant22611, - Variant22612, - Variant22613, - Variant22614, - Variant22615, - Variant22616, - Variant22617, - Variant22618, - Variant22619, - Variant22620, - Variant22621, - Variant22622, - Variant22623, - Variant22624, - Variant22625, - Variant22626, - Variant22627, - Variant22628, - Variant22629, - Variant22630, - Variant22631, - Variant22632, - Variant22633, - Variant22634, - Variant22635, - Variant22636, - Variant22637, - Variant22638, - Variant22639, - Variant22640, - Variant22641, - Variant22642, - Variant22643, - Variant22644, - Variant22645, - Variant22646, - Variant22647, - Variant22648, - Variant22649, - Variant22650, - Variant22651, - Variant22652, - Variant22653, - Variant22654, - Variant22655, - Variant22656, - Variant22657, - Variant22658, - Variant22659, - Variant22660, - Variant22661, - Variant22662, - Variant22663, - Variant22664, - Variant22665, - Variant22666, - Variant22667, - Variant22668, - Variant22669, - Variant22670, - Variant22671, - Variant22672, - Variant22673, - Variant22674, - Variant22675, - Variant22676, - Variant22677, - Variant22678, - Variant22679, - Variant22680, - Variant22681, - Variant22682, - Variant22683, - Variant22684, - Variant22685, - Variant22686, - Variant22687, - Variant22688, - Variant22689, - Variant22690, - Variant22691, - Variant22692, - Variant22693, - Variant22694, - Variant22695, - Variant22696, - Variant22697, - Variant22698, - Variant22699, - Variant22700, - Variant22701, - Variant22702, - Variant22703, - Variant22704, - Variant22705, - Variant22706, - Variant22707, - Variant22708, - Variant22709, - Variant22710, - Variant22711, - Variant22712, - Variant22713, - Variant22714, - Variant22715, - Variant22716, - Variant22717, - Variant22718, - Variant22719, - Variant22720, - Variant22721, - Variant22722, - Variant22723, - Variant22724, - Variant22725, - Variant22726, - Variant22727, - Variant22728, - Variant22729, - Variant22730, - Variant22731, - Variant22732, - Variant22733, - Variant22734, - Variant22735, - Variant22736, - Variant22737, - Variant22738, - Variant22739, - Variant22740, - Variant22741, - Variant22742, - Variant22743, - Variant22744, - Variant22745, - Variant22746, - Variant22747, - Variant22748, - Variant22749, - Variant22750, - Variant22751, - Variant22752, - Variant22753, - Variant22754, - Variant22755, - Variant22756, - Variant22757, - Variant22758, - Variant22759, - Variant22760, - Variant22761, - Variant22762, - Variant22763, - Variant22764, - Variant22765, - Variant22766, - Variant22767, - Variant22768, - Variant22769, - Variant22770, - Variant22771, - Variant22772, - Variant22773, - Variant22774, - Variant22775, - Variant22776, - Variant22777, - Variant22778, - Variant22779, - Variant22780, - Variant22781, - Variant22782, - Variant22783, - Variant22784, - Variant22785, - Variant22786, - Variant22787, - Variant22788, - Variant22789, - Variant22790, - Variant22791, - Variant22792, - Variant22793, - Variant22794, - Variant22795, - Variant22796, - Variant22797, - Variant22798, - Variant22799, - Variant22800, - Variant22801, - Variant22802, - Variant22803, - Variant22804, - Variant22805, - Variant22806, - Variant22807, - Variant22808, - Variant22809, - Variant22810, - Variant22811, - Variant22812, - Variant22813, - Variant22814, - Variant22815, - Variant22816, - Variant22817, - Variant22818, - Variant22819, - Variant22820, - Variant22821, - Variant22822, - Variant22823, - Variant22824, - Variant22825, - Variant22826, - Variant22827, - Variant22828, - Variant22829, - Variant22830, - Variant22831, - Variant22832, - Variant22833, - Variant22834, - Variant22835, - Variant22836, - Variant22837, - Variant22838, - Variant22839, - Variant22840, - Variant22841, - Variant22842, - Variant22843, - Variant22844, - Variant22845, - Variant22846, - Variant22847, - Variant22848, - Variant22849, - Variant22850, - Variant22851, - Variant22852, - Variant22853, - Variant22854, - Variant22855, - Variant22856, - Variant22857, - Variant22858, - Variant22859, - Variant22860, - Variant22861, - Variant22862, - Variant22863, - Variant22864, - Variant22865, - Variant22866, - Variant22867, - Variant22868, - Variant22869, - Variant22870, - Variant22871, - Variant22872, - Variant22873, - Variant22874, - Variant22875, - Variant22876, - Variant22877, - Variant22878, - Variant22879, - Variant22880, - Variant22881, - Variant22882, - Variant22883, - Variant22884, - Variant22885, - Variant22886, - Variant22887, - Variant22888, - Variant22889, - Variant22890, - Variant22891, - Variant22892, - Variant22893, - Variant22894, - Variant22895, - Variant22896, - Variant22897, - Variant22898, - Variant22899, - Variant22900, - Variant22901, - Variant22902, - Variant22903, - Variant22904, - Variant22905, - Variant22906, - Variant22907, - Variant22908, - Variant22909, - Variant22910, - Variant22911, - Variant22912, - Variant22913, - Variant22914, - Variant22915, - Variant22916, - Variant22917, - Variant22918, - Variant22919, - Variant22920, - Variant22921, - Variant22922, - Variant22923, - Variant22924, - Variant22925, - Variant22926, - Variant22927, - Variant22928, - Variant22929, - Variant22930, - Variant22931, - Variant22932, - Variant22933, - Variant22934, - Variant22935, - Variant22936, - Variant22937, - Variant22938, - Variant22939, - Variant22940, - Variant22941, - Variant22942, - Variant22943, - Variant22944, - Variant22945, - Variant22946, - Variant22947, - Variant22948, - Variant22949, - Variant22950, - Variant22951, - Variant22952, - Variant22953, - Variant22954, - Variant22955, - Variant22956, - Variant22957, - Variant22958, - Variant22959, - Variant22960, - Variant22961, - Variant22962, - Variant22963, - Variant22964, - Variant22965, - Variant22966, - Variant22967, - Variant22968, - Variant22969, - Variant22970, - Variant22971, - Variant22972, - Variant22973, - Variant22974, - Variant22975, - Variant22976, - Variant22977, - Variant22978, - Variant22979, - Variant22980, - Variant22981, - Variant22982, - Variant22983, - Variant22984, - Variant22985, - Variant22986, - Variant22987, - Variant22988, - Variant22989, - Variant22990, - Variant22991, - Variant22992, - Variant22993, - Variant22994, - Variant22995, - Variant22996, - Variant22997, - Variant22998, - Variant22999, - Variant23000, - Variant23001, - Variant23002, - Variant23003, - Variant23004, - Variant23005, - Variant23006, - Variant23007, - Variant23008, - Variant23009, - Variant23010, - Variant23011, - Variant23012, - Variant23013, - Variant23014, - Variant23015, - Variant23016, - Variant23017, - Variant23018, - Variant23019, - Variant23020, - Variant23021, - Variant23022, - Variant23023, - Variant23024, - Variant23025, - Variant23026, - Variant23027, - Variant23028, - Variant23029, - Variant23030, - Variant23031, - Variant23032, - Variant23033, - Variant23034, - Variant23035, - Variant23036, - Variant23037, - Variant23038, - Variant23039, - Variant23040, - Variant23041, - Variant23042, - Variant23043, - Variant23044, - Variant23045, - Variant23046, - Variant23047, - Variant23048, - Variant23049, - Variant23050, - Variant23051, - Variant23052, - Variant23053, - Variant23054, - Variant23055, - Variant23056, - Variant23057, - Variant23058, - Variant23059, - Variant23060, - Variant23061, - Variant23062, - Variant23063, - Variant23064, - Variant23065, - Variant23066, - Variant23067, - Variant23068, - Variant23069, - Variant23070, - Variant23071, - Variant23072, - Variant23073, - Variant23074, - Variant23075, - Variant23076, - Variant23077, - Variant23078, - Variant23079, - Variant23080, - Variant23081, - Variant23082, - Variant23083, - Variant23084, - Variant23085, - Variant23086, - Variant23087, - Variant23088, - Variant23089, - Variant23090, - Variant23091, - Variant23092, - Variant23093, - Variant23094, - Variant23095, - Variant23096, - Variant23097, - Variant23098, - Variant23099, - Variant23100, - Variant23101, - Variant23102, - Variant23103, - Variant23104, - Variant23105, - Variant23106, - Variant23107, - Variant23108, - Variant23109, - Variant23110, - Variant23111, - Variant23112, - Variant23113, - Variant23114, - Variant23115, - Variant23116, - Variant23117, - Variant23118, - Variant23119, - Variant23120, - Variant23121, - Variant23122, - Variant23123, - Variant23124, - Variant23125, - Variant23126, - Variant23127, - Variant23128, - Variant23129, - Variant23130, - Variant23131, - Variant23132, - Variant23133, - Variant23134, - Variant23135, - Variant23136, - Variant23137, - Variant23138, - Variant23139, - Variant23140, - Variant23141, - Variant23142, - Variant23143, - Variant23144, - Variant23145, - Variant23146, - Variant23147, - Variant23148, - Variant23149, - Variant23150, - Variant23151, - Variant23152, - Variant23153, - Variant23154, - Variant23155, - Variant23156, - Variant23157, - Variant23158, - Variant23159, - Variant23160, - Variant23161, - Variant23162, - Variant23163, - Variant23164, - Variant23165, - Variant23166, - Variant23167, - Variant23168, - Variant23169, - Variant23170, - Variant23171, - Variant23172, - Variant23173, - Variant23174, - Variant23175, - Variant23176, - Variant23177, - Variant23178, - Variant23179, - Variant23180, - Variant23181, - Variant23182, - Variant23183, - Variant23184, - Variant23185, - Variant23186, - Variant23187, - Variant23188, - Variant23189, - Variant23190, - Variant23191, - Variant23192, - Variant23193, - Variant23194, - Variant23195, - Variant23196, - Variant23197, - Variant23198, - Variant23199, - Variant23200, - Variant23201, - Variant23202, - Variant23203, - Variant23204, - Variant23205, - Variant23206, - Variant23207, - Variant23208, - Variant23209, - Variant23210, - Variant23211, - Variant23212, - Variant23213, - Variant23214, - Variant23215, - Variant23216, - Variant23217, - Variant23218, - Variant23219, - Variant23220, - Variant23221, - Variant23222, - Variant23223, - Variant23224, - Variant23225, - Variant23226, - Variant23227, - Variant23228, - Variant23229, - Variant23230, - Variant23231, - Variant23232, - Variant23233, - Variant23234, - Variant23235, - Variant23236, - Variant23237, - Variant23238, - Variant23239, - Variant23240, - Variant23241, - Variant23242, - Variant23243, - Variant23244, - Variant23245, - Variant23246, - Variant23247, - Variant23248, - Variant23249, - Variant23250, - Variant23251, - Variant23252, - Variant23253, - Variant23254, - Variant23255, - Variant23256, - Variant23257, - Variant23258, - Variant23259, - Variant23260, - Variant23261, - Variant23262, - Variant23263, - Variant23264, - Variant23265, - Variant23266, - Variant23267, - Variant23268, - Variant23269, - Variant23270, - Variant23271, - Variant23272, - Variant23273, - Variant23274, - Variant23275, - Variant23276, - Variant23277, - Variant23278, - Variant23279, - Variant23280, - Variant23281, - Variant23282, - Variant23283, - Variant23284, - Variant23285, - Variant23286, - Variant23287, - Variant23288, - Variant23289, - Variant23290, - Variant23291, - Variant23292, - Variant23293, - Variant23294, - Variant23295, - Variant23296, - Variant23297, - Variant23298, - Variant23299, - Variant23300, - Variant23301, - Variant23302, - Variant23303, - Variant23304, - Variant23305, - Variant23306, - Variant23307, - Variant23308, - Variant23309, - Variant23310, - Variant23311, - Variant23312, - Variant23313, - Variant23314, - Variant23315, - Variant23316, - Variant23317, - Variant23318, - Variant23319, - Variant23320, - Variant23321, - Variant23322, - Variant23323, - Variant23324, - Variant23325, - Variant23326, - Variant23327, - Variant23328, - Variant23329, - Variant23330, - Variant23331, - Variant23332, - Variant23333, - Variant23334, - Variant23335, - Variant23336, - Variant23337, - Variant23338, - Variant23339, - Variant23340, - Variant23341, - Variant23342, - Variant23343, - Variant23344, - Variant23345, - Variant23346, - Variant23347, - Variant23348, - Variant23349, - Variant23350, - Variant23351, - Variant23352, - Variant23353, - Variant23354, - Variant23355, - Variant23356, - Variant23357, - Variant23358, - Variant23359, - Variant23360, - Variant23361, - Variant23362, - Variant23363, - Variant23364, - Variant23365, - Variant23366, - Variant23367, - Variant23368, - Variant23369, - Variant23370, - Variant23371, - Variant23372, - Variant23373, - Variant23374, - Variant23375, - Variant23376, - Variant23377, - Variant23378, - Variant23379, - Variant23380, - Variant23381, - Variant23382, - Variant23383, - Variant23384, - Variant23385, - Variant23386, - Variant23387, - Variant23388, - Variant23389, - Variant23390, - Variant23391, - Variant23392, - Variant23393, - Variant23394, - Variant23395, - Variant23396, - Variant23397, - Variant23398, - Variant23399, - Variant23400, - Variant23401, - Variant23402, - Variant23403, - Variant23404, - Variant23405, - Variant23406, - Variant23407, - Variant23408, - Variant23409, - Variant23410, - Variant23411, - Variant23412, - Variant23413, - Variant23414, - Variant23415, - Variant23416, - Variant23417, - Variant23418, - Variant23419, - Variant23420, - Variant23421, - Variant23422, - Variant23423, - Variant23424, - Variant23425, - Variant23426, - Variant23427, - Variant23428, - Variant23429, - Variant23430, - Variant23431, - Variant23432, - Variant23433, - Variant23434, - Variant23435, - Variant23436, - Variant23437, - Variant23438, - Variant23439, - Variant23440, - Variant23441, - Variant23442, - Variant23443, - Variant23444, - Variant23445, - Variant23446, - Variant23447, - Variant23448, - Variant23449, - Variant23450, - Variant23451, - Variant23452, - Variant23453, - Variant23454, - Variant23455, - Variant23456, - Variant23457, - Variant23458, - Variant23459, - Variant23460, - Variant23461, - Variant23462, - Variant23463, - Variant23464, - Variant23465, - Variant23466, - Variant23467, - Variant23468, - Variant23469, - Variant23470, - Variant23471, - Variant23472, - Variant23473, - Variant23474, - Variant23475, - Variant23476, - Variant23477, - Variant23478, - Variant23479, - Variant23480, - Variant23481, - Variant23482, - Variant23483, - Variant23484, - Variant23485, - Variant23486, - Variant23487, - Variant23488, - Variant23489, - Variant23490, - Variant23491, - Variant23492, - Variant23493, - Variant23494, - Variant23495, - Variant23496, - Variant23497, - Variant23498, - Variant23499, - Variant23500, - Variant23501, - Variant23502, - Variant23503, - Variant23504, - Variant23505, - Variant23506, - Variant23507, - Variant23508, - Variant23509, - Variant23510, - Variant23511, - Variant23512, - Variant23513, - Variant23514, - Variant23515, - Variant23516, - Variant23517, - Variant23518, - Variant23519, - Variant23520, - Variant23521, - Variant23522, - Variant23523, - Variant23524, - Variant23525, - Variant23526, - Variant23527, - Variant23528, - Variant23529, - Variant23530, - Variant23531, - Variant23532, - Variant23533, - Variant23534, - Variant23535, - Variant23536, - Variant23537, - Variant23538, - Variant23539, - Variant23540, - Variant23541, - Variant23542, - Variant23543, - Variant23544, - Variant23545, - Variant23546, - Variant23547, - Variant23548, - Variant23549, - Variant23550, - Variant23551, - Variant23552, - Variant23553, - Variant23554, - Variant23555, - Variant23556, - Variant23557, - Variant23558, - Variant23559, - Variant23560, - Variant23561, - Variant23562, - Variant23563, - Variant23564, - Variant23565, - Variant23566, - Variant23567, - Variant23568, - Variant23569, - Variant23570, - Variant23571, - Variant23572, - Variant23573, - Variant23574, - Variant23575, - Variant23576, - Variant23577, - Variant23578, - Variant23579, - Variant23580, - Variant23581, - Variant23582, - Variant23583, - Variant23584, - Variant23585, - Variant23586, - Variant23587, - Variant23588, - Variant23589, - Variant23590, - Variant23591, - Variant23592, - Variant23593, - Variant23594, - Variant23595, - Variant23596, - Variant23597, - Variant23598, - Variant23599, - Variant23600, - Variant23601, - Variant23602, - Variant23603, - Variant23604, - Variant23605, - Variant23606, - Variant23607, - Variant23608, - Variant23609, - Variant23610, - Variant23611, - Variant23612, - Variant23613, - Variant23614, - Variant23615, - Variant23616, - Variant23617, - Variant23618, - Variant23619, - Variant23620, - Variant23621, - Variant23622, - Variant23623, - Variant23624, - Variant23625, - Variant23626, - Variant23627, - Variant23628, - Variant23629, - Variant23630, - Variant23631, - Variant23632, - Variant23633, - Variant23634, - Variant23635, - Variant23636, - Variant23637, - Variant23638, - Variant23639, - Variant23640, - Variant23641, - Variant23642, - Variant23643, - Variant23644, - Variant23645, - Variant23646, - Variant23647, - Variant23648, - Variant23649, - Variant23650, - Variant23651, - Variant23652, - Variant23653, - Variant23654, - Variant23655, - Variant23656, - Variant23657, - Variant23658, - Variant23659, - Variant23660, - Variant23661, - Variant23662, - Variant23663, - Variant23664, - Variant23665, - Variant23666, - Variant23667, - Variant23668, - Variant23669, - Variant23670, - Variant23671, - Variant23672, - Variant23673, - Variant23674, - Variant23675, - Variant23676, - Variant23677, - Variant23678, - Variant23679, - Variant23680, - Variant23681, - Variant23682, - Variant23683, - Variant23684, - Variant23685, - Variant23686, - Variant23687, - Variant23688, - Variant23689, - Variant23690, - Variant23691, - Variant23692, - Variant23693, - Variant23694, - Variant23695, - Variant23696, - Variant23697, - Variant23698, - Variant23699, - Variant23700, - Variant23701, - Variant23702, - Variant23703, - Variant23704, - Variant23705, - Variant23706, - Variant23707, - Variant23708, - Variant23709, - Variant23710, - Variant23711, - Variant23712, - Variant23713, - Variant23714, - Variant23715, - Variant23716, - Variant23717, - Variant23718, - Variant23719, - Variant23720, - Variant23721, - Variant23722, - Variant23723, - Variant23724, - Variant23725, - Variant23726, - Variant23727, - Variant23728, - Variant23729, - Variant23730, - Variant23731, - Variant23732, - Variant23733, - Variant23734, - Variant23735, - Variant23736, - Variant23737, - Variant23738, - Variant23739, - Variant23740, - Variant23741, - Variant23742, - Variant23743, - Variant23744, - Variant23745, - Variant23746, - Variant23747, - Variant23748, - Variant23749, - Variant23750, - Variant23751, - Variant23752, - Variant23753, - Variant23754, - Variant23755, - Variant23756, - Variant23757, - Variant23758, - Variant23759, - Variant23760, - Variant23761, - Variant23762, - Variant23763, - Variant23764, - Variant23765, - Variant23766, - Variant23767, - Variant23768, - Variant23769, - Variant23770, - Variant23771, - Variant23772, - Variant23773, - Variant23774, - Variant23775, - Variant23776, - Variant23777, - Variant23778, - Variant23779, - Variant23780, - Variant23781, - Variant23782, - Variant23783, - Variant23784, - Variant23785, - Variant23786, - Variant23787, - Variant23788, - Variant23789, - Variant23790, - Variant23791, - Variant23792, - Variant23793, - Variant23794, - Variant23795, - Variant23796, - Variant23797, - Variant23798, - Variant23799, - Variant23800, - Variant23801, - Variant23802, - Variant23803, - Variant23804, - Variant23805, - Variant23806, - Variant23807, - Variant23808, - Variant23809, - Variant23810, - Variant23811, - Variant23812, - Variant23813, - Variant23814, - Variant23815, - Variant23816, - Variant23817, - Variant23818, - Variant23819, - Variant23820, - Variant23821, - Variant23822, - Variant23823, - Variant23824, - Variant23825, - Variant23826, - Variant23827, - Variant23828, - Variant23829, - Variant23830, - Variant23831, - Variant23832, - Variant23833, - Variant23834, - Variant23835, - Variant23836, - Variant23837, - Variant23838, - Variant23839, - Variant23840, - Variant23841, - Variant23842, - Variant23843, - Variant23844, - Variant23845, - Variant23846, - Variant23847, - Variant23848, - Variant23849, - Variant23850, - Variant23851, - Variant23852, - Variant23853, - Variant23854, - Variant23855, - Variant23856, - Variant23857, - Variant23858, - Variant23859, - Variant23860, - Variant23861, - Variant23862, - Variant23863, - Variant23864, - Variant23865, - Variant23866, - Variant23867, - Variant23868, - Variant23869, - Variant23870, - Variant23871, - Variant23872, - Variant23873, - Variant23874, - Variant23875, - Variant23876, - Variant23877, - Variant23878, - Variant23879, - Variant23880, - Variant23881, - Variant23882, - Variant23883, - Variant23884, - Variant23885, - Variant23886, - Variant23887, - Variant23888, - Variant23889, - Variant23890, - Variant23891, - Variant23892, - Variant23893, - Variant23894, - Variant23895, - Variant23896, - Variant23897, - Variant23898, - Variant23899, - Variant23900, - Variant23901, - Variant23902, - Variant23903, - Variant23904, - Variant23905, - Variant23906, - Variant23907, - Variant23908, - Variant23909, - Variant23910, - Variant23911, - Variant23912, - Variant23913, - Variant23914, - Variant23915, - Variant23916, - Variant23917, - Variant23918, - Variant23919, - Variant23920, - Variant23921, - Variant23922, - Variant23923, - Variant23924, - Variant23925, - Variant23926, - Variant23927, - Variant23928, - Variant23929, - Variant23930, - Variant23931, - Variant23932, - Variant23933, - Variant23934, - Variant23935, - Variant23936, - Variant23937, - Variant23938, - Variant23939, - Variant23940, - Variant23941, - Variant23942, - Variant23943, - Variant23944, - Variant23945, - Variant23946, - Variant23947, - Variant23948, - Variant23949, - Variant23950, - Variant23951, - Variant23952, - Variant23953, - Variant23954, - Variant23955, - Variant23956, - Variant23957, - Variant23958, - Variant23959, - Variant23960, - Variant23961, - Variant23962, - Variant23963, - Variant23964, - Variant23965, - Variant23966, - Variant23967, - Variant23968, - Variant23969, - Variant23970, - Variant23971, - Variant23972, - Variant23973, - Variant23974, - Variant23975, - Variant23976, - Variant23977, - Variant23978, - Variant23979, - Variant23980, - Variant23981, - Variant23982, - Variant23983, - Variant23984, - Variant23985, - Variant23986, - Variant23987, - Variant23988, - Variant23989, - Variant23990, - Variant23991, - Variant23992, - Variant23993, - Variant23994, - Variant23995, - Variant23996, - Variant23997, - Variant23998, - Variant23999, - Variant24000, - Variant24001, - Variant24002, - Variant24003, - Variant24004, - Variant24005, - Variant24006, - Variant24007, - Variant24008, - Variant24009, - Variant24010, - Variant24011, - Variant24012, - Variant24013, - Variant24014, - Variant24015, - Variant24016, - Variant24017, - Variant24018, - Variant24019, - Variant24020, - Variant24021, - Variant24022, - Variant24023, - Variant24024, - Variant24025, - Variant24026, - Variant24027, - Variant24028, - Variant24029, - Variant24030, - Variant24031, - Variant24032, - Variant24033, - Variant24034, - Variant24035, - Variant24036, - Variant24037, - Variant24038, - Variant24039, - Variant24040, - Variant24041, - Variant24042, - Variant24043, - Variant24044, - Variant24045, - Variant24046, - Variant24047, - Variant24048, - Variant24049, - Variant24050, - Variant24051, - Variant24052, - Variant24053, - Variant24054, - Variant24055, - Variant24056, - Variant24057, - Variant24058, - Variant24059, - Variant24060, - Variant24061, - Variant24062, - Variant24063, - Variant24064, - Variant24065, - Variant24066, - Variant24067, - Variant24068, - Variant24069, - Variant24070, - Variant24071, - Variant24072, - Variant24073, - Variant24074, - Variant24075, - Variant24076, - Variant24077, - Variant24078, - Variant24079, - Variant24080, - Variant24081, - Variant24082, - Variant24083, - Variant24084, - Variant24085, - Variant24086, - Variant24087, - Variant24088, - Variant24089, - Variant24090, - Variant24091, - Variant24092, - Variant24093, - Variant24094, - Variant24095, - Variant24096, - Variant24097, - Variant24098, - Variant24099, - Variant24100, - Variant24101, - Variant24102, - Variant24103, - Variant24104, - Variant24105, - Variant24106, - Variant24107, - Variant24108, - Variant24109, - Variant24110, - Variant24111, - Variant24112, - Variant24113, - Variant24114, - Variant24115, - Variant24116, - Variant24117, - Variant24118, - Variant24119, - Variant24120, - Variant24121, - Variant24122, - Variant24123, - Variant24124, - Variant24125, - Variant24126, - Variant24127, - Variant24128, - Variant24129, - Variant24130, - Variant24131, - Variant24132, - Variant24133, - Variant24134, - Variant24135, - Variant24136, - Variant24137, - Variant24138, - Variant24139, - Variant24140, - Variant24141, - Variant24142, - Variant24143, - Variant24144, - Variant24145, - Variant24146, - Variant24147, - Variant24148, - Variant24149, - Variant24150, - Variant24151, - Variant24152, - Variant24153, - Variant24154, - Variant24155, - Variant24156, - Variant24157, - Variant24158, - Variant24159, - Variant24160, - Variant24161, - Variant24162, - Variant24163, - Variant24164, - Variant24165, - Variant24166, - Variant24167, - Variant24168, - Variant24169, - Variant24170, - Variant24171, - Variant24172, - Variant24173, - Variant24174, - Variant24175, - Variant24176, - Variant24177, - Variant24178, - Variant24179, - Variant24180, - Variant24181, - Variant24182, - Variant24183, - Variant24184, - Variant24185, - Variant24186, - Variant24187, - Variant24188, - Variant24189, - Variant24190, - Variant24191, - Variant24192, - Variant24193, - Variant24194, - Variant24195, - Variant24196, - Variant24197, - Variant24198, - Variant24199, - Variant24200, - Variant24201, - Variant24202, - Variant24203, - Variant24204, - Variant24205, - Variant24206, - Variant24207, - Variant24208, - Variant24209, - Variant24210, - Variant24211, - Variant24212, - Variant24213, - Variant24214, - Variant24215, - Variant24216, - Variant24217, - Variant24218, - Variant24219, - Variant24220, - Variant24221, - Variant24222, - Variant24223, - Variant24224, - Variant24225, - Variant24226, - Variant24227, - Variant24228, - Variant24229, - Variant24230, - Variant24231, - Variant24232, - Variant24233, - Variant24234, - Variant24235, - Variant24236, - Variant24237, - Variant24238, - Variant24239, - Variant24240, - Variant24241, - Variant24242, - Variant24243, - Variant24244, - Variant24245, - Variant24246, - Variant24247, - Variant24248, - Variant24249, - Variant24250, - Variant24251, - Variant24252, - Variant24253, - Variant24254, - Variant24255, - Variant24256, - Variant24257, - Variant24258, - Variant24259, - Variant24260, - Variant24261, - Variant24262, - Variant24263, - Variant24264, - Variant24265, - Variant24266, - Variant24267, - Variant24268, - Variant24269, - Variant24270, - Variant24271, - Variant24272, - Variant24273, - Variant24274, - Variant24275, - Variant24276, - Variant24277, - Variant24278, - Variant24279, - Variant24280, - Variant24281, - Variant24282, - Variant24283, - Variant24284, - Variant24285, - Variant24286, - Variant24287, - Variant24288, - Variant24289, - Variant24290, - Variant24291, - Variant24292, - Variant24293, - Variant24294, - Variant24295, - Variant24296, - Variant24297, - Variant24298, - Variant24299, - Variant24300, - Variant24301, - Variant24302, - Variant24303, - Variant24304, - Variant24305, - Variant24306, - Variant24307, - Variant24308, - Variant24309, - Variant24310, - Variant24311, - Variant24312, - Variant24313, - Variant24314, - Variant24315, - Variant24316, - Variant24317, - Variant24318, - Variant24319, - Variant24320, - Variant24321, - Variant24322, - Variant24323, - Variant24324, - Variant24325, - Variant24326, - Variant24327, - Variant24328, - Variant24329, - Variant24330, - Variant24331, - Variant24332, - Variant24333, - Variant24334, - Variant24335, - Variant24336, - Variant24337, - Variant24338, - Variant24339, - Variant24340, - Variant24341, - Variant24342, - Variant24343, - Variant24344, - Variant24345, - Variant24346, - Variant24347, - Variant24348, - Variant24349, - Variant24350, - Variant24351, - Variant24352, - Variant24353, - Variant24354, - Variant24355, - Variant24356, - Variant24357, - Variant24358, - Variant24359, - Variant24360, - Variant24361, - Variant24362, - Variant24363, - Variant24364, - Variant24365, - Variant24366, - Variant24367, - Variant24368, - Variant24369, - Variant24370, - Variant24371, - Variant24372, - Variant24373, - Variant24374, - Variant24375, - Variant24376, - Variant24377, - Variant24378, - Variant24379, - Variant24380, - Variant24381, - Variant24382, - Variant24383, - Variant24384, - Variant24385, - Variant24386, - Variant24387, - Variant24388, - Variant24389, - Variant24390, - Variant24391, - Variant24392, - Variant24393, - Variant24394, - Variant24395, - Variant24396, - Variant24397, - Variant24398, - Variant24399, - Variant24400, - Variant24401, - Variant24402, - Variant24403, - Variant24404, - Variant24405, - Variant24406, - Variant24407, - Variant24408, - Variant24409, - Variant24410, - Variant24411, - Variant24412, - Variant24413, - Variant24414, - Variant24415, - Variant24416, - Variant24417, - Variant24418, - Variant24419, - Variant24420, - Variant24421, - Variant24422, - Variant24423, - Variant24424, - Variant24425, - Variant24426, - Variant24427, - Variant24428, - Variant24429, - Variant24430, - Variant24431, - Variant24432, - Variant24433, - Variant24434, - Variant24435, - Variant24436, - Variant24437, - Variant24438, - Variant24439, - Variant24440, - Variant24441, - Variant24442, - Variant24443, - Variant24444, - Variant24445, - Variant24446, - Variant24447, - Variant24448, - Variant24449, - Variant24450, - Variant24451, - Variant24452, - Variant24453, - Variant24454, - Variant24455, - Variant24456, - Variant24457, - Variant24458, - Variant24459, - Variant24460, - Variant24461, - Variant24462, - Variant24463, - Variant24464, - Variant24465, - Variant24466, - Variant24467, - Variant24468, - Variant24469, - Variant24470, - Variant24471, - Variant24472, - Variant24473, - Variant24474, - Variant24475, - Variant24476, - Variant24477, - Variant24478, - Variant24479, - Variant24480, - Variant24481, - Variant24482, - Variant24483, - Variant24484, - Variant24485, - Variant24486, - Variant24487, - Variant24488, - Variant24489, - Variant24490, - Variant24491, - Variant24492, - Variant24493, - Variant24494, - Variant24495, - Variant24496, - Variant24497, - Variant24498, - Variant24499, - Variant24500, - Variant24501, - Variant24502, - Variant24503, - Variant24504, - Variant24505, - Variant24506, - Variant24507, - Variant24508, - Variant24509, - Variant24510, - Variant24511, - Variant24512, - Variant24513, - Variant24514, - Variant24515, - Variant24516, - Variant24517, - Variant24518, - Variant24519, - Variant24520, - Variant24521, - Variant24522, - Variant24523, - Variant24524, - Variant24525, - Variant24526, - Variant24527, - Variant24528, - Variant24529, - Variant24530, - Variant24531, - Variant24532, - Variant24533, - Variant24534, - Variant24535, - Variant24536, - Variant24537, - Variant24538, - Variant24539, - Variant24540, - Variant24541, - Variant24542, - Variant24543, - Variant24544, - Variant24545, - Variant24546, - Variant24547, - Variant24548, - Variant24549, - Variant24550, - Variant24551, - Variant24552, - Variant24553, - Variant24554, - Variant24555, - Variant24556, - Variant24557, - Variant24558, - Variant24559, - Variant24560, - Variant24561, - Variant24562, - Variant24563, - Variant24564, - Variant24565, - Variant24566, - Variant24567, - Variant24568, - Variant24569, - Variant24570, - Variant24571, - Variant24572, - Variant24573, - Variant24574, - Variant24575, - Variant24576, - Variant24577, - Variant24578, - Variant24579, - Variant24580, - Variant24581, - Variant24582, - Variant24583, - Variant24584, - Variant24585, - Variant24586, - Variant24587, - Variant24588, - Variant24589, - Variant24590, - Variant24591, - Variant24592, - Variant24593, - Variant24594, - Variant24595, - Variant24596, - Variant24597, - Variant24598, - Variant24599, - Variant24600, - Variant24601, - Variant24602, - Variant24603, - Variant24604, - Variant24605, - Variant24606, - Variant24607, - Variant24608, - Variant24609, - Variant24610, - Variant24611, - Variant24612, - Variant24613, - Variant24614, - Variant24615, - Variant24616, - Variant24617, - Variant24618, - Variant24619, - Variant24620, - Variant24621, - Variant24622, - Variant24623, - Variant24624, - Variant24625, - Variant24626, - Variant24627, - Variant24628, - Variant24629, - Variant24630, - Variant24631, - Variant24632, - Variant24633, - Variant24634, - Variant24635, - Variant24636, - Variant24637, - Variant24638, - Variant24639, - Variant24640, - Variant24641, - Variant24642, - Variant24643, - Variant24644, - Variant24645, - Variant24646, - Variant24647, - Variant24648, - Variant24649, - Variant24650, - Variant24651, - Variant24652, - Variant24653, - Variant24654, - Variant24655, - Variant24656, - Variant24657, - Variant24658, - Variant24659, - Variant24660, - Variant24661, - Variant24662, - Variant24663, - Variant24664, - Variant24665, - Variant24666, - Variant24667, - Variant24668, - Variant24669, - Variant24670, - Variant24671, - Variant24672, - Variant24673, - Variant24674, - Variant24675, - Variant24676, - Variant24677, - Variant24678, - Variant24679, - Variant24680, - Variant24681, - Variant24682, - Variant24683, - Variant24684, - Variant24685, - Variant24686, - Variant24687, - Variant24688, - Variant24689, - Variant24690, - Variant24691, - Variant24692, - Variant24693, - Variant24694, - Variant24695, - Variant24696, - Variant24697, - Variant24698, - Variant24699, - Variant24700, - Variant24701, - Variant24702, - Variant24703, - Variant24704, - Variant24705, - Variant24706, - Variant24707, - Variant24708, - Variant24709, - Variant24710, - Variant24711, - Variant24712, - Variant24713, - Variant24714, - Variant24715, - Variant24716, - Variant24717, - Variant24718, - Variant24719, - Variant24720, - Variant24721, - Variant24722, - Variant24723, - Variant24724, - Variant24725, - Variant24726, - Variant24727, - Variant24728, - Variant24729, - Variant24730, - Variant24731, - Variant24732, - Variant24733, - Variant24734, - Variant24735, - Variant24736, - Variant24737, - Variant24738, - Variant24739, - Variant24740, - Variant24741, - Variant24742, - Variant24743, - Variant24744, - Variant24745, - Variant24746, - Variant24747, - Variant24748, - Variant24749, - Variant24750, - Variant24751, - Variant24752, - Variant24753, - Variant24754, - Variant24755, - Variant24756, - Variant24757, - Variant24758, - Variant24759, - Variant24760, - Variant24761, - Variant24762, - Variant24763, - Variant24764, - Variant24765, - Variant24766, - Variant24767, - Variant24768, - Variant24769, - Variant24770, - Variant24771, - Variant24772, - Variant24773, - Variant24774, - Variant24775, - Variant24776, - Variant24777, - Variant24778, - Variant24779, - Variant24780, - Variant24781, - Variant24782, - Variant24783, - Variant24784, - Variant24785, - Variant24786, - Variant24787, - Variant24788, - Variant24789, - Variant24790, - Variant24791, - Variant24792, - Variant24793, - Variant24794, - Variant24795, - Variant24796, - Variant24797, - Variant24798, - Variant24799, - Variant24800, - Variant24801, - Variant24802, - Variant24803, - Variant24804, - Variant24805, - Variant24806, - Variant24807, - Variant24808, - Variant24809, - Variant24810, - Variant24811, - Variant24812, - Variant24813, - Variant24814, - Variant24815, - Variant24816, - Variant24817, - Variant24818, - Variant24819, - Variant24820, - Variant24821, - Variant24822, - Variant24823, - Variant24824, - Variant24825, - Variant24826, - Variant24827, - Variant24828, - Variant24829, - Variant24830, - Variant24831, - Variant24832, - Variant24833, - Variant24834, - Variant24835, - Variant24836, - Variant24837, - Variant24838, - Variant24839, - Variant24840, - Variant24841, - Variant24842, - Variant24843, - Variant24844, - Variant24845, - Variant24846, - Variant24847, - Variant24848, - Variant24849, - Variant24850, - Variant24851, - Variant24852, - Variant24853, - Variant24854, - Variant24855, - Variant24856, - Variant24857, - Variant24858, - Variant24859, - Variant24860, - Variant24861, - Variant24862, - Variant24863, - Variant24864, - Variant24865, - Variant24866, - Variant24867, - Variant24868, - Variant24869, - Variant24870, - Variant24871, - Variant24872, - Variant24873, - Variant24874, - Variant24875, - Variant24876, - Variant24877, - Variant24878, - Variant24879, - Variant24880, - Variant24881, - Variant24882, - Variant24883, - Variant24884, - Variant24885, - Variant24886, - Variant24887, - Variant24888, - Variant24889, - Variant24890, - Variant24891, - Variant24892, - Variant24893, - Variant24894, - Variant24895, - Variant24896, - Variant24897, - Variant24898, - Variant24899, - Variant24900, - Variant24901, - Variant24902, - Variant24903, - Variant24904, - Variant24905, - Variant24906, - Variant24907, - Variant24908, - Variant24909, - Variant24910, - Variant24911, - Variant24912, - Variant24913, - Variant24914, - Variant24915, - Variant24916, - Variant24917, - Variant24918, - Variant24919, - Variant24920, - Variant24921, - Variant24922, - Variant24923, - Variant24924, - Variant24925, - Variant24926, - Variant24927, - Variant24928, - Variant24929, - Variant24930, - Variant24931, - Variant24932, - Variant24933, - Variant24934, - Variant24935, - Variant24936, - Variant24937, - Variant24938, - Variant24939, - Variant24940, - Variant24941, - Variant24942, - Variant24943, - Variant24944, - Variant24945, - Variant24946, - Variant24947, - Variant24948, - Variant24949, - Variant24950, - Variant24951, - Variant24952, - Variant24953, - Variant24954, - Variant24955, - Variant24956, - Variant24957, - Variant24958, - Variant24959, - Variant24960, - Variant24961, - Variant24962, - Variant24963, - Variant24964, - Variant24965, - Variant24966, - Variant24967, - Variant24968, - Variant24969, - Variant24970, - Variant24971, - Variant24972, - Variant24973, - Variant24974, - Variant24975, - Variant24976, - Variant24977, - Variant24978, - Variant24979, - Variant24980, - Variant24981, - Variant24982, - Variant24983, - Variant24984, - Variant24985, - Variant24986, - Variant24987, - Variant24988, - Variant24989, - Variant24990, - Variant24991, - Variant24992, - Variant24993, - Variant24994, - Variant24995, - Variant24996, - Variant24997, - Variant24998, - Variant24999, - Variant25000, - Variant25001, - Variant25002, - Variant25003, - Variant25004, - Variant25005, - Variant25006, - Variant25007, - Variant25008, - Variant25009, - Variant25010, - Variant25011, - Variant25012, - Variant25013, - Variant25014, - Variant25015, - Variant25016, - Variant25017, - Variant25018, - Variant25019, - Variant25020, - Variant25021, - Variant25022, - Variant25023, - Variant25024, - Variant25025, - Variant25026, - Variant25027, - Variant25028, - Variant25029, - Variant25030, - Variant25031, - Variant25032, - Variant25033, - Variant25034, - Variant25035, - Variant25036, - Variant25037, - Variant25038, - Variant25039, - Variant25040, - Variant25041, - Variant25042, - Variant25043, - Variant25044, - Variant25045, - Variant25046, - Variant25047, - Variant25048, - Variant25049, - Variant25050, - Variant25051, - Variant25052, - Variant25053, - Variant25054, - Variant25055, - Variant25056, - Variant25057, - Variant25058, - Variant25059, - Variant25060, - Variant25061, - Variant25062, - Variant25063, - Variant25064, - Variant25065, - Variant25066, - Variant25067, - Variant25068, - Variant25069, - Variant25070, - Variant25071, - Variant25072, - Variant25073, - Variant25074, - Variant25075, - Variant25076, - Variant25077, - Variant25078, - Variant25079, - Variant25080, - Variant25081, - Variant25082, - Variant25083, - Variant25084, - Variant25085, - Variant25086, - Variant25087, - Variant25088, - Variant25089, - Variant25090, - Variant25091, - Variant25092, - Variant25093, - Variant25094, - Variant25095, - Variant25096, - Variant25097, - Variant25098, - Variant25099, - Variant25100, - Variant25101, - Variant25102, - Variant25103, - Variant25104, - Variant25105, - Variant25106, - Variant25107, - Variant25108, - Variant25109, - Variant25110, - Variant25111, - Variant25112, - Variant25113, - Variant25114, - Variant25115, - Variant25116, - Variant25117, - Variant25118, - Variant25119, - Variant25120, - Variant25121, - Variant25122, - Variant25123, - Variant25124, - Variant25125, - Variant25126, - Variant25127, - Variant25128, - Variant25129, - Variant25130, - Variant25131, - Variant25132, - Variant25133, - Variant25134, - Variant25135, - Variant25136, - Variant25137, - Variant25138, - Variant25139, - Variant25140, - Variant25141, - Variant25142, - Variant25143, - Variant25144, - Variant25145, - Variant25146, - Variant25147, - Variant25148, - Variant25149, - Variant25150, - Variant25151, - Variant25152, - Variant25153, - Variant25154, - Variant25155, - Variant25156, - Variant25157, - Variant25158, - Variant25159, - Variant25160, - Variant25161, - Variant25162, - Variant25163, - Variant25164, - Variant25165, - Variant25166, - Variant25167, - Variant25168, - Variant25169, - Variant25170, - Variant25171, - Variant25172, - Variant25173, - Variant25174, - Variant25175, - Variant25176, - Variant25177, - Variant25178, - Variant25179, - Variant25180, - Variant25181, - Variant25182, - Variant25183, - Variant25184, - Variant25185, - Variant25186, - Variant25187, - Variant25188, - Variant25189, - Variant25190, - Variant25191, - Variant25192, - Variant25193, - Variant25194, - Variant25195, - Variant25196, - Variant25197, - Variant25198, - Variant25199, - Variant25200, - Variant25201, - Variant25202, - Variant25203, - Variant25204, - Variant25205, - Variant25206, - Variant25207, - Variant25208, - Variant25209, - Variant25210, - Variant25211, - Variant25212, - Variant25213, - Variant25214, - Variant25215, - Variant25216, - Variant25217, - Variant25218, - Variant25219, - Variant25220, - Variant25221, - Variant25222, - Variant25223, - Variant25224, - Variant25225, - Variant25226, - Variant25227, - Variant25228, - Variant25229, - Variant25230, - Variant25231, - Variant25232, - Variant25233, - Variant25234, - Variant25235, - Variant25236, - Variant25237, - Variant25238, - Variant25239, - Variant25240, - Variant25241, - Variant25242, - Variant25243, - Variant25244, - Variant25245, - Variant25246, - Variant25247, - Variant25248, - Variant25249, - Variant25250, - Variant25251, - Variant25252, - Variant25253, - Variant25254, - Variant25255, - Variant25256, - Variant25257, - Variant25258, - Variant25259, - Variant25260, - Variant25261, - Variant25262, - Variant25263, - Variant25264, - Variant25265, - Variant25266, - Variant25267, - Variant25268, - Variant25269, - Variant25270, - Variant25271, - Variant25272, - Variant25273, - Variant25274, - Variant25275, - Variant25276, - Variant25277, - Variant25278, - Variant25279, - Variant25280, - Variant25281, - Variant25282, - Variant25283, - Variant25284, - Variant25285, - Variant25286, - Variant25287, - Variant25288, - Variant25289, - Variant25290, - Variant25291, - Variant25292, - Variant25293, - Variant25294, - Variant25295, - Variant25296, - Variant25297, - Variant25298, - Variant25299, - Variant25300, - Variant25301, - Variant25302, - Variant25303, - Variant25304, - Variant25305, - Variant25306, - Variant25307, - Variant25308, - Variant25309, - Variant25310, - Variant25311, - Variant25312, - Variant25313, - Variant25314, - Variant25315, - Variant25316, - Variant25317, - Variant25318, - Variant25319, - Variant25320, - Variant25321, - Variant25322, - Variant25323, - Variant25324, - Variant25325, - Variant25326, - Variant25327, - Variant25328, - Variant25329, - Variant25330, - Variant25331, - Variant25332, - Variant25333, - Variant25334, - Variant25335, - Variant25336, - Variant25337, - Variant25338, - Variant25339, - Variant25340, - Variant25341, - Variant25342, - Variant25343, - Variant25344, - Variant25345, - Variant25346, - Variant25347, - Variant25348, - Variant25349, - Variant25350, - Variant25351, - Variant25352, - Variant25353, - Variant25354, - Variant25355, - Variant25356, - Variant25357, - Variant25358, - Variant25359, - Variant25360, - Variant25361, - Variant25362, - Variant25363, - Variant25364, - Variant25365, - Variant25366, - Variant25367, - Variant25368, - Variant25369, - Variant25370, - Variant25371, - Variant25372, - Variant25373, - Variant25374, - Variant25375, - Variant25376, - Variant25377, - Variant25378, - Variant25379, - Variant25380, - Variant25381, - Variant25382, - Variant25383, - Variant25384, - Variant25385, - Variant25386, - Variant25387, - Variant25388, - Variant25389, - Variant25390, - Variant25391, - Variant25392, - Variant25393, - Variant25394, - Variant25395, - Variant25396, - Variant25397, - Variant25398, - Variant25399, - Variant25400, - Variant25401, - Variant25402, - Variant25403, - Variant25404, - Variant25405, - Variant25406, - Variant25407, - Variant25408, - Variant25409, - Variant25410, - Variant25411, - Variant25412, - Variant25413, - Variant25414, - Variant25415, - Variant25416, - Variant25417, - Variant25418, - Variant25419, - Variant25420, - Variant25421, - Variant25422, - Variant25423, - Variant25424, - Variant25425, - Variant25426, - Variant25427, - Variant25428, - Variant25429, - Variant25430, - Variant25431, - Variant25432, - Variant25433, - Variant25434, - Variant25435, - Variant25436, - Variant25437, - Variant25438, - Variant25439, - Variant25440, - Variant25441, - Variant25442, - Variant25443, - Variant25444, - Variant25445, - Variant25446, - Variant25447, - Variant25448, - Variant25449, - Variant25450, - Variant25451, - Variant25452, - Variant25453, - Variant25454, - Variant25455, - Variant25456, - Variant25457, - Variant25458, - Variant25459, - Variant25460, - Variant25461, - Variant25462, - Variant25463, - Variant25464, - Variant25465, - Variant25466, - Variant25467, - Variant25468, - Variant25469, - Variant25470, - Variant25471, - Variant25472, - Variant25473, - Variant25474, - Variant25475, - Variant25476, - Variant25477, - Variant25478, - Variant25479, - Variant25480, - Variant25481, - Variant25482, - Variant25483, - Variant25484, - Variant25485, - Variant25486, - Variant25487, - Variant25488, - Variant25489, - Variant25490, - Variant25491, - Variant25492, - Variant25493, - Variant25494, - Variant25495, - Variant25496, - Variant25497, - Variant25498, - Variant25499, - Variant25500, - Variant25501, - Variant25502, - Variant25503, - Variant25504, - Variant25505, - Variant25506, - Variant25507, - Variant25508, - Variant25509, - Variant25510, - Variant25511, - Variant25512, - Variant25513, - Variant25514, - Variant25515, - Variant25516, - Variant25517, - Variant25518, - Variant25519, - Variant25520, - Variant25521, - Variant25522, - Variant25523, - Variant25524, - Variant25525, - Variant25526, - Variant25527, - Variant25528, - Variant25529, - Variant25530, - Variant25531, - Variant25532, - Variant25533, - Variant25534, - Variant25535, - Variant25536, - Variant25537, - Variant25538, - Variant25539, - Variant25540, - Variant25541, - Variant25542, - Variant25543, - Variant25544, - Variant25545, - Variant25546, - Variant25547, - Variant25548, - Variant25549, - Variant25550, - Variant25551, - Variant25552, - Variant25553, - Variant25554, - Variant25555, - Variant25556, - Variant25557, - Variant25558, - Variant25559, - Variant25560, - Variant25561, - Variant25562, - Variant25563, - Variant25564, - Variant25565, - Variant25566, - Variant25567, - Variant25568, - Variant25569, - Variant25570, - Variant25571, - Variant25572, - Variant25573, - Variant25574, - Variant25575, - Variant25576, - Variant25577, - Variant25578, - Variant25579, - Variant25580, - Variant25581, - Variant25582, - Variant25583, - Variant25584, - Variant25585, - Variant25586, - Variant25587, - Variant25588, - Variant25589, - Variant25590, - Variant25591, - Variant25592, - Variant25593, - Variant25594, - Variant25595, - Variant25596, - Variant25597, - Variant25598, - Variant25599, - Variant25600, - Variant25601, - Variant25602, - Variant25603, - Variant25604, - Variant25605, - Variant25606, - Variant25607, - Variant25608, - Variant25609, - Variant25610, - Variant25611, - Variant25612, - Variant25613, - Variant25614, - Variant25615, - Variant25616, - Variant25617, - Variant25618, - Variant25619, - Variant25620, - Variant25621, - Variant25622, - Variant25623, - Variant25624, - Variant25625, - Variant25626, - Variant25627, - Variant25628, - Variant25629, - Variant25630, - Variant25631, - Variant25632, - Variant25633, - Variant25634, - Variant25635, - Variant25636, - Variant25637, - Variant25638, - Variant25639, - Variant25640, - Variant25641, - Variant25642, - Variant25643, - Variant25644, - Variant25645, - Variant25646, - Variant25647, - Variant25648, - Variant25649, - Variant25650, - Variant25651, - Variant25652, - Variant25653, - Variant25654, - Variant25655, - Variant25656, - Variant25657, - Variant25658, - Variant25659, - Variant25660, - Variant25661, - Variant25662, - Variant25663, - Variant25664, - Variant25665, - Variant25666, - Variant25667, - Variant25668, - Variant25669, - Variant25670, - Variant25671, - Variant25672, - Variant25673, - Variant25674, - Variant25675, - Variant25676, - Variant25677, - Variant25678, - Variant25679, - Variant25680, - Variant25681, - Variant25682, - Variant25683, - Variant25684, - Variant25685, - Variant25686, - Variant25687, - Variant25688, - Variant25689, - Variant25690, - Variant25691, - Variant25692, - Variant25693, - Variant25694, - Variant25695, - Variant25696, - Variant25697, - Variant25698, - Variant25699, - Variant25700, - Variant25701, - Variant25702, - Variant25703, - Variant25704, - Variant25705, - Variant25706, - Variant25707, - Variant25708, - Variant25709, - Variant25710, - Variant25711, - Variant25712, - Variant25713, - Variant25714, - Variant25715, - Variant25716, - Variant25717, - Variant25718, - Variant25719, - Variant25720, - Variant25721, - Variant25722, - Variant25723, - Variant25724, - Variant25725, - Variant25726, - Variant25727, - Variant25728, - Variant25729, - Variant25730, - Variant25731, - Variant25732, - Variant25733, - Variant25734, - Variant25735, - Variant25736, - Variant25737, - Variant25738, - Variant25739, - Variant25740, - Variant25741, - Variant25742, - Variant25743, - Variant25744, - Variant25745, - Variant25746, - Variant25747, - Variant25748, - Variant25749, - Variant25750, - Variant25751, - Variant25752, - Variant25753, - Variant25754, - Variant25755, - Variant25756, - Variant25757, - Variant25758, - Variant25759, - Variant25760, - Variant25761, - Variant25762, - Variant25763, - Variant25764, - Variant25765, - Variant25766, - Variant25767, - Variant25768, - Variant25769, - Variant25770, - Variant25771, - Variant25772, - Variant25773, - Variant25774, - Variant25775, - Variant25776, - Variant25777, - Variant25778, - Variant25779, - Variant25780, - Variant25781, - Variant25782, - Variant25783, - Variant25784, - Variant25785, - Variant25786, - Variant25787, - Variant25788, - Variant25789, - Variant25790, - Variant25791, - Variant25792, - Variant25793, - Variant25794, - Variant25795, - Variant25796, - Variant25797, - Variant25798, - Variant25799, - Variant25800, - Variant25801, - Variant25802, - Variant25803, - Variant25804, - Variant25805, - Variant25806, - Variant25807, - Variant25808, - Variant25809, - Variant25810, - Variant25811, - Variant25812, - Variant25813, - Variant25814, - Variant25815, - Variant25816, - Variant25817, - Variant25818, - Variant25819, - Variant25820, - Variant25821, - Variant25822, - Variant25823, - Variant25824, - Variant25825, - Variant25826, - Variant25827, - Variant25828, - Variant25829, - Variant25830, - Variant25831, - Variant25832, - Variant25833, - Variant25834, - Variant25835, - Variant25836, - Variant25837, - Variant25838, - Variant25839, - Variant25840, - Variant25841, - Variant25842, - Variant25843, - Variant25844, - Variant25845, - Variant25846, - Variant25847, - Variant25848, - Variant25849, - Variant25850, - Variant25851, - Variant25852, - Variant25853, - Variant25854, - Variant25855, - Variant25856, - Variant25857, - Variant25858, - Variant25859, - Variant25860, - Variant25861, - Variant25862, - Variant25863, - Variant25864, - Variant25865, - Variant25866, - Variant25867, - Variant25868, - Variant25869, - Variant25870, - Variant25871, - Variant25872, - Variant25873, - Variant25874, - Variant25875, - Variant25876, - Variant25877, - Variant25878, - Variant25879, - Variant25880, - Variant25881, - Variant25882, - Variant25883, - Variant25884, - Variant25885, - Variant25886, - Variant25887, - Variant25888, - Variant25889, - Variant25890, - Variant25891, - Variant25892, - Variant25893, - Variant25894, - Variant25895, - Variant25896, - Variant25897, - Variant25898, - Variant25899, - Variant25900, - Variant25901, - Variant25902, - Variant25903, - Variant25904, - Variant25905, - Variant25906, - Variant25907, - Variant25908, - Variant25909, - Variant25910, - Variant25911, - Variant25912, - Variant25913, - Variant25914, - Variant25915, - Variant25916, - Variant25917, - Variant25918, - Variant25919, - Variant25920, - Variant25921, - Variant25922, - Variant25923, - Variant25924, - Variant25925, - Variant25926, - Variant25927, - Variant25928, - Variant25929, - Variant25930, - Variant25931, - Variant25932, - Variant25933, - Variant25934, - Variant25935, - Variant25936, - Variant25937, - Variant25938, - Variant25939, - Variant25940, - Variant25941, - Variant25942, - Variant25943, - Variant25944, - Variant25945, - Variant25946, - Variant25947, - Variant25948, - Variant25949, - Variant25950, - Variant25951, - Variant25952, - Variant25953, - Variant25954, - Variant25955, - Variant25956, - Variant25957, - Variant25958, - Variant25959, - Variant25960, - Variant25961, - Variant25962, - Variant25963, - Variant25964, - Variant25965, - Variant25966, - Variant25967, - Variant25968, - Variant25969, - Variant25970, - Variant25971, - Variant25972, - Variant25973, - Variant25974, - Variant25975, - Variant25976, - Variant25977, - Variant25978, - Variant25979, - Variant25980, - Variant25981, - Variant25982, - Variant25983, - Variant25984, - Variant25985, - Variant25986, - Variant25987, - Variant25988, - Variant25989, - Variant25990, - Variant25991, - Variant25992, - Variant25993, - Variant25994, - Variant25995, - Variant25996, - Variant25997, - Variant25998, - Variant25999, - Variant26000, - Variant26001, - Variant26002, - Variant26003, - Variant26004, - Variant26005, - Variant26006, - Variant26007, - Variant26008, - Variant26009, - Variant26010, - Variant26011, - Variant26012, - Variant26013, - Variant26014, - Variant26015, - Variant26016, - Variant26017, - Variant26018, - Variant26019, - Variant26020, - Variant26021, - Variant26022, - Variant26023, - Variant26024, - Variant26025, - Variant26026, - Variant26027, - Variant26028, - Variant26029, - Variant26030, - Variant26031, - Variant26032, - Variant26033, - Variant26034, - Variant26035, - Variant26036, - Variant26037, - Variant26038, - Variant26039, - Variant26040, - Variant26041, - Variant26042, - Variant26043, - Variant26044, - Variant26045, - Variant26046, - Variant26047, - Variant26048, - Variant26049, - Variant26050, - Variant26051, - Variant26052, - Variant26053, - Variant26054, - Variant26055, - Variant26056, - Variant26057, - Variant26058, - Variant26059, - Variant26060, - Variant26061, - Variant26062, - Variant26063, - Variant26064, - Variant26065, - Variant26066, - Variant26067, - Variant26068, - Variant26069, - Variant26070, - Variant26071, - Variant26072, - Variant26073, - Variant26074, - Variant26075, - Variant26076, - Variant26077, - Variant26078, - Variant26079, - Variant26080, - Variant26081, - Variant26082, - Variant26083, - Variant26084, - Variant26085, - Variant26086, - Variant26087, - Variant26088, - Variant26089, - Variant26090, - Variant26091, - Variant26092, - Variant26093, - Variant26094, - Variant26095, - Variant26096, - Variant26097, - Variant26098, - Variant26099, - Variant26100, - Variant26101, - Variant26102, - Variant26103, - Variant26104, - Variant26105, - Variant26106, - Variant26107, - Variant26108, - Variant26109, - Variant26110, - Variant26111, - Variant26112, - Variant26113, - Variant26114, - Variant26115, - Variant26116, - Variant26117, - Variant26118, - Variant26119, - Variant26120, - Variant26121, - Variant26122, - Variant26123, - Variant26124, - Variant26125, - Variant26126, - Variant26127, - Variant26128, - Variant26129, - Variant26130, - Variant26131, - Variant26132, - Variant26133, - Variant26134, - Variant26135, - Variant26136, - Variant26137, - Variant26138, - Variant26139, - Variant26140, - Variant26141, - Variant26142, - Variant26143, - Variant26144, - Variant26145, - Variant26146, - Variant26147, - Variant26148, - Variant26149, - Variant26150, - Variant26151, - Variant26152, - Variant26153, - Variant26154, - Variant26155, - Variant26156, - Variant26157, - Variant26158, - Variant26159, - Variant26160, - Variant26161, - Variant26162, - Variant26163, - Variant26164, - Variant26165, - Variant26166, - Variant26167, - Variant26168, - Variant26169, - Variant26170, - Variant26171, - Variant26172, - Variant26173, - Variant26174, - Variant26175, - Variant26176, - Variant26177, - Variant26178, - Variant26179, - Variant26180, - Variant26181, - Variant26182, - Variant26183, - Variant26184, - Variant26185, - Variant26186, - Variant26187, - Variant26188, - Variant26189, - Variant26190, - Variant26191, - Variant26192, - Variant26193, - Variant26194, - Variant26195, - Variant26196, - Variant26197, - Variant26198, - Variant26199, - Variant26200, - Variant26201, - Variant26202, - Variant26203, - Variant26204, - Variant26205, - Variant26206, - Variant26207, - Variant26208, - Variant26209, - Variant26210, - Variant26211, - Variant26212, - Variant26213, - Variant26214, - Variant26215, - Variant26216, - Variant26217, - Variant26218, - Variant26219, - Variant26220, - Variant26221, - Variant26222, - Variant26223, - Variant26224, - Variant26225, - Variant26226, - Variant26227, - Variant26228, - Variant26229, - Variant26230, - Variant26231, - Variant26232, - Variant26233, - Variant26234, - Variant26235, - Variant26236, - Variant26237, - Variant26238, - Variant26239, - Variant26240, - Variant26241, - Variant26242, - Variant26243, - Variant26244, - Variant26245, - Variant26246, - Variant26247, - Variant26248, - Variant26249, - Variant26250, - Variant26251, - Variant26252, - Variant26253, - Variant26254, - Variant26255, - Variant26256, - Variant26257, - Variant26258, - Variant26259, - Variant26260, - Variant26261, - Variant26262, - Variant26263, - Variant26264, - Variant26265, - Variant26266, - Variant26267, - Variant26268, - Variant26269, - Variant26270, - Variant26271, - Variant26272, - Variant26273, - Variant26274, - Variant26275, - Variant26276, - Variant26277, - Variant26278, - Variant26279, - Variant26280, - Variant26281, - Variant26282, - Variant26283, - Variant26284, - Variant26285, - Variant26286, - Variant26287, - Variant26288, - Variant26289, - Variant26290, - Variant26291, - Variant26292, - Variant26293, - Variant26294, - Variant26295, - Variant26296, - Variant26297, - Variant26298, - Variant26299, - Variant26300, - Variant26301, - Variant26302, - Variant26303, - Variant26304, - Variant26305, - Variant26306, - Variant26307, - Variant26308, - Variant26309, - Variant26310, - Variant26311, - Variant26312, - Variant26313, - Variant26314, - Variant26315, - Variant26316, - Variant26317, - Variant26318, - Variant26319, - Variant26320, - Variant26321, - Variant26322, - Variant26323, - Variant26324, - Variant26325, - Variant26326, - Variant26327, - Variant26328, - Variant26329, - Variant26330, - Variant26331, - Variant26332, - Variant26333, - Variant26334, - Variant26335, - Variant26336, - Variant26337, - Variant26338, - Variant26339, - Variant26340, - Variant26341, - Variant26342, - Variant26343, - Variant26344, - Variant26345, - Variant26346, - Variant26347, - Variant26348, - Variant26349, - Variant26350, - Variant26351, - Variant26352, - Variant26353, - Variant26354, - Variant26355, - Variant26356, - Variant26357, - Variant26358, - Variant26359, - Variant26360, - Variant26361, - Variant26362, - Variant26363, - Variant26364, - Variant26365, - Variant26366, - Variant26367, - Variant26368, - Variant26369, - Variant26370, - Variant26371, - Variant26372, - Variant26373, - Variant26374, - Variant26375, - Variant26376, - Variant26377, - Variant26378, - Variant26379, - Variant26380, - Variant26381, - Variant26382, - Variant26383, - Variant26384, - Variant26385, - Variant26386, - Variant26387, - Variant26388, - Variant26389, - Variant26390, - Variant26391, - Variant26392, - Variant26393, - Variant26394, - Variant26395, - Variant26396, - Variant26397, - Variant26398, - Variant26399, - Variant26400, - Variant26401, - Variant26402, - Variant26403, - Variant26404, - Variant26405, - Variant26406, - Variant26407, - Variant26408, - Variant26409, - Variant26410, - Variant26411, - Variant26412, - Variant26413, - Variant26414, - Variant26415, - Variant26416, - Variant26417, - Variant26418, - Variant26419, - Variant26420, - Variant26421, - Variant26422, - Variant26423, - Variant26424, - Variant26425, - Variant26426, - Variant26427, - Variant26428, - Variant26429, - Variant26430, - Variant26431, - Variant26432, - Variant26433, - Variant26434, - Variant26435, - Variant26436, - Variant26437, - Variant26438, - Variant26439, - Variant26440, - Variant26441, - Variant26442, - Variant26443, - Variant26444, - Variant26445, - Variant26446, - Variant26447, - Variant26448, - Variant26449, - Variant26450, - Variant26451, - Variant26452, - Variant26453, - Variant26454, - Variant26455, - Variant26456, - Variant26457, - Variant26458, - Variant26459, - Variant26460, - Variant26461, - Variant26462, - Variant26463, - Variant26464, - Variant26465, - Variant26466, - Variant26467, - Variant26468, - Variant26469, - Variant26470, - Variant26471, - Variant26472, - Variant26473, - Variant26474, - Variant26475, - Variant26476, - Variant26477, - Variant26478, - Variant26479, - Variant26480, - Variant26481, - Variant26482, - Variant26483, - Variant26484, - Variant26485, - Variant26486, - Variant26487, - Variant26488, - Variant26489, - Variant26490, - Variant26491, - Variant26492, - Variant26493, - Variant26494, - Variant26495, - Variant26496, - Variant26497, - Variant26498, - Variant26499, - Variant26500, - Variant26501, - Variant26502, - Variant26503, - Variant26504, - Variant26505, - Variant26506, - Variant26507, - Variant26508, - Variant26509, - Variant26510, - Variant26511, - Variant26512, - Variant26513, - Variant26514, - Variant26515, - Variant26516, - Variant26517, - Variant26518, - Variant26519, - Variant26520, - Variant26521, - Variant26522, - Variant26523, - Variant26524, - Variant26525, - Variant26526, - Variant26527, - Variant26528, - Variant26529, - Variant26530, - Variant26531, - Variant26532, - Variant26533, - Variant26534, - Variant26535, - Variant26536, - Variant26537, - Variant26538, - Variant26539, - Variant26540, - Variant26541, - Variant26542, - Variant26543, - Variant26544, - Variant26545, - Variant26546, - Variant26547, - Variant26548, - Variant26549, - Variant26550, - Variant26551, - Variant26552, - Variant26553, - Variant26554, - Variant26555, - Variant26556, - Variant26557, - Variant26558, - Variant26559, - Variant26560, - Variant26561, - Variant26562, - Variant26563, - Variant26564, - Variant26565, - Variant26566, - Variant26567, - Variant26568, - Variant26569, - Variant26570, - Variant26571, - Variant26572, - Variant26573, - Variant26574, - Variant26575, - Variant26576, - Variant26577, - Variant26578, - Variant26579, - Variant26580, - Variant26581, - Variant26582, - Variant26583, - Variant26584, - Variant26585, - Variant26586, - Variant26587, - Variant26588, - Variant26589, - Variant26590, - Variant26591, - Variant26592, - Variant26593, - Variant26594, - Variant26595, - Variant26596, - Variant26597, - Variant26598, - Variant26599, - Variant26600, - Variant26601, - Variant26602, - Variant26603, - Variant26604, - Variant26605, - Variant26606, - Variant26607, - Variant26608, - Variant26609, - Variant26610, - Variant26611, - Variant26612, - Variant26613, - Variant26614, - Variant26615, - Variant26616, - Variant26617, - Variant26618, - Variant26619, - Variant26620, - Variant26621, - Variant26622, - Variant26623, - Variant26624, - Variant26625, - Variant26626, - Variant26627, - Variant26628, - Variant26629, - Variant26630, - Variant26631, - Variant26632, - Variant26633, - Variant26634, - Variant26635, - Variant26636, - Variant26637, - Variant26638, - Variant26639, - Variant26640, - Variant26641, - Variant26642, - Variant26643, - Variant26644, - Variant26645, - Variant26646, - Variant26647, - Variant26648, - Variant26649, - Variant26650, - Variant26651, - Variant26652, - Variant26653, - Variant26654, - Variant26655, - Variant26656, - Variant26657, - Variant26658, - Variant26659, - Variant26660, - Variant26661, - Variant26662, - Variant26663, - Variant26664, - Variant26665, - Variant26666, - Variant26667, - Variant26668, - Variant26669, - Variant26670, - Variant26671, - Variant26672, - Variant26673, - Variant26674, - Variant26675, - Variant26676, - Variant26677, - Variant26678, - Variant26679, - Variant26680, - Variant26681, - Variant26682, - Variant26683, - Variant26684, - Variant26685, - Variant26686, - Variant26687, - Variant26688, - Variant26689, - Variant26690, - Variant26691, - Variant26692, - Variant26693, - Variant26694, - Variant26695, - Variant26696, - Variant26697, - Variant26698, - Variant26699, - Variant26700, - Variant26701, - Variant26702, - Variant26703, - Variant26704, - Variant26705, - Variant26706, - Variant26707, - Variant26708, - Variant26709, - Variant26710, - Variant26711, - Variant26712, - Variant26713, - Variant26714, - Variant26715, - Variant26716, - Variant26717, - Variant26718, - Variant26719, - Variant26720, - Variant26721, - Variant26722, - Variant26723, - Variant26724, - Variant26725, - Variant26726, - Variant26727, - Variant26728, - Variant26729, - Variant26730, - Variant26731, - Variant26732, - Variant26733, - Variant26734, - Variant26735, - Variant26736, - Variant26737, - Variant26738, - Variant26739, - Variant26740, - Variant26741, - Variant26742, - Variant26743, - Variant26744, - Variant26745, - Variant26746, - Variant26747, - Variant26748, - Variant26749, - Variant26750, - Variant26751, - Variant26752, - Variant26753, - Variant26754, - Variant26755, - Variant26756, - Variant26757, - Variant26758, - Variant26759, - Variant26760, - Variant26761, - Variant26762, - Variant26763, - Variant26764, - Variant26765, - Variant26766, - Variant26767, - Variant26768, - Variant26769, - Variant26770, - Variant26771, - Variant26772, - Variant26773, - Variant26774, - Variant26775, - Variant26776, - Variant26777, - Variant26778, - Variant26779, - Variant26780, - Variant26781, - Variant26782, - Variant26783, - Variant26784, - Variant26785, - Variant26786, - Variant26787, - Variant26788, - Variant26789, - Variant26790, - Variant26791, - Variant26792, - Variant26793, - Variant26794, - Variant26795, - Variant26796, - Variant26797, - Variant26798, - Variant26799, - Variant26800, - Variant26801, - Variant26802, - Variant26803, - Variant26804, - Variant26805, - Variant26806, - Variant26807, - Variant26808, - Variant26809, - Variant26810, - Variant26811, - Variant26812, - Variant26813, - Variant26814, - Variant26815, - Variant26816, - Variant26817, - Variant26818, - Variant26819, - Variant26820, - Variant26821, - Variant26822, - Variant26823, - Variant26824, - Variant26825, - Variant26826, - Variant26827, - Variant26828, - Variant26829, - Variant26830, - Variant26831, - Variant26832, - Variant26833, - Variant26834, - Variant26835, - Variant26836, - Variant26837, - Variant26838, - Variant26839, - Variant26840, - Variant26841, - Variant26842, - Variant26843, - Variant26844, - Variant26845, - Variant26846, - Variant26847, - Variant26848, - Variant26849, - Variant26850, - Variant26851, - Variant26852, - Variant26853, - Variant26854, - Variant26855, - Variant26856, - Variant26857, - Variant26858, - Variant26859, - Variant26860, - Variant26861, - Variant26862, - Variant26863, - Variant26864, - Variant26865, - Variant26866, - Variant26867, - Variant26868, - Variant26869, - Variant26870, - Variant26871, - Variant26872, - Variant26873, - Variant26874, - Variant26875, - Variant26876, - Variant26877, - Variant26878, - Variant26879, - Variant26880, - Variant26881, - Variant26882, - Variant26883, - Variant26884, - Variant26885, - Variant26886, - Variant26887, - Variant26888, - Variant26889, - Variant26890, - Variant26891, - Variant26892, - Variant26893, - Variant26894, - Variant26895, - Variant26896, - Variant26897, - Variant26898, - Variant26899, - Variant26900, - Variant26901, - Variant26902, - Variant26903, - Variant26904, - Variant26905, - Variant26906, - Variant26907, - Variant26908, - Variant26909, - Variant26910, - Variant26911, - Variant26912, - Variant26913, - Variant26914, - Variant26915, - Variant26916, - Variant26917, - Variant26918, - Variant26919, - Variant26920, - Variant26921, - Variant26922, - Variant26923, - Variant26924, - Variant26925, - Variant26926, - Variant26927, - Variant26928, - Variant26929, - Variant26930, - Variant26931, - Variant26932, - Variant26933, - Variant26934, - Variant26935, - Variant26936, - Variant26937, - Variant26938, - Variant26939, - Variant26940, - Variant26941, - Variant26942, - Variant26943, - Variant26944, - Variant26945, - Variant26946, - Variant26947, - Variant26948, - Variant26949, - Variant26950, - Variant26951, - Variant26952, - Variant26953, - Variant26954, - Variant26955, - Variant26956, - Variant26957, - Variant26958, - Variant26959, - Variant26960, - Variant26961, - Variant26962, - Variant26963, - Variant26964, - Variant26965, - Variant26966, - Variant26967, - Variant26968, - Variant26969, - Variant26970, - Variant26971, - Variant26972, - Variant26973, - Variant26974, - Variant26975, - Variant26976, - Variant26977, - Variant26978, - Variant26979, - Variant26980, - Variant26981, - Variant26982, - Variant26983, - Variant26984, - Variant26985, - Variant26986, - Variant26987, - Variant26988, - Variant26989, - Variant26990, - Variant26991, - Variant26992, - Variant26993, - Variant26994, - Variant26995, - Variant26996, - Variant26997, - Variant26998, - Variant26999, - Variant27000, - Variant27001, - Variant27002, - Variant27003, - Variant27004, - Variant27005, - Variant27006, - Variant27007, - Variant27008, - Variant27009, - Variant27010, - Variant27011, - Variant27012, - Variant27013, - Variant27014, - Variant27015, - Variant27016, - Variant27017, - Variant27018, - Variant27019, - Variant27020, - Variant27021, - Variant27022, - Variant27023, - Variant27024, - Variant27025, - Variant27026, - Variant27027, - Variant27028, - Variant27029, - Variant27030, - Variant27031, - Variant27032, - Variant27033, - Variant27034, - Variant27035, - Variant27036, - Variant27037, - Variant27038, - Variant27039, - Variant27040, - Variant27041, - Variant27042, - Variant27043, - Variant27044, - Variant27045, - Variant27046, - Variant27047, - Variant27048, - Variant27049, - Variant27050, - Variant27051, - Variant27052, - Variant27053, - Variant27054, - Variant27055, - Variant27056, - Variant27057, - Variant27058, - Variant27059, - Variant27060, - Variant27061, - Variant27062, - Variant27063, - Variant27064, - Variant27065, - Variant27066, - Variant27067, - Variant27068, - Variant27069, - Variant27070, - Variant27071, - Variant27072, - Variant27073, - Variant27074, - Variant27075, - Variant27076, - Variant27077, - Variant27078, - Variant27079, - Variant27080, - Variant27081, - Variant27082, - Variant27083, - Variant27084, - Variant27085, - Variant27086, - Variant27087, - Variant27088, - Variant27089, - Variant27090, - Variant27091, - Variant27092, - Variant27093, - Variant27094, - Variant27095, - Variant27096, - Variant27097, - Variant27098, - Variant27099, - Variant27100, - Variant27101, - Variant27102, - Variant27103, - Variant27104, - Variant27105, - Variant27106, - Variant27107, - Variant27108, - Variant27109, - Variant27110, - Variant27111, - Variant27112, - Variant27113, - Variant27114, - Variant27115, - Variant27116, - Variant27117, - Variant27118, - Variant27119, - Variant27120, - Variant27121, - Variant27122, - Variant27123, - Variant27124, - Variant27125, - Variant27126, - Variant27127, - Variant27128, - Variant27129, - Variant27130, - Variant27131, - Variant27132, - Variant27133, - Variant27134, - Variant27135, - Variant27136, - Variant27137, - Variant27138, - Variant27139, - Variant27140, - Variant27141, - Variant27142, - Variant27143, - Variant27144, - Variant27145, - Variant27146, - Variant27147, - Variant27148, - Variant27149, - Variant27150, - Variant27151, - Variant27152, - Variant27153, - Variant27154, - Variant27155, - Variant27156, - Variant27157, - Variant27158, - Variant27159, - Variant27160, - Variant27161, - Variant27162, - Variant27163, - Variant27164, - Variant27165, - Variant27166, - Variant27167, - Variant27168, - Variant27169, - Variant27170, - Variant27171, - Variant27172, - Variant27173, - Variant27174, - Variant27175, - Variant27176, - Variant27177, - Variant27178, - Variant27179, - Variant27180, - Variant27181, - Variant27182, - Variant27183, - Variant27184, - Variant27185, - Variant27186, - Variant27187, - Variant27188, - Variant27189, - Variant27190, - Variant27191, - Variant27192, - Variant27193, - Variant27194, - Variant27195, - Variant27196, - Variant27197, - Variant27198, - Variant27199, - Variant27200, - Variant27201, - Variant27202, - Variant27203, - Variant27204, - Variant27205, - Variant27206, - Variant27207, - Variant27208, - Variant27209, - Variant27210, - Variant27211, - Variant27212, - Variant27213, - Variant27214, - Variant27215, - Variant27216, - Variant27217, - Variant27218, - Variant27219, - Variant27220, - Variant27221, - Variant27222, - Variant27223, - Variant27224, - Variant27225, - Variant27226, - Variant27227, - Variant27228, - Variant27229, - Variant27230, - Variant27231, - Variant27232, - Variant27233, - Variant27234, - Variant27235, - Variant27236, - Variant27237, - Variant27238, - Variant27239, - Variant27240, - Variant27241, - Variant27242, - Variant27243, - Variant27244, - Variant27245, - Variant27246, - Variant27247, - Variant27248, - Variant27249, - Variant27250, - Variant27251, - Variant27252, - Variant27253, - Variant27254, - Variant27255, - Variant27256, - Variant27257, - Variant27258, - Variant27259, - Variant27260, - Variant27261, - Variant27262, - Variant27263, - Variant27264, - Variant27265, - Variant27266, - Variant27267, - Variant27268, - Variant27269, - Variant27270, - Variant27271, - Variant27272, - Variant27273, - Variant27274, - Variant27275, - Variant27276, - Variant27277, - Variant27278, - Variant27279, - Variant27280, - Variant27281, - Variant27282, - Variant27283, - Variant27284, - Variant27285, - Variant27286, - Variant27287, - Variant27288, - Variant27289, - Variant27290, - Variant27291, - Variant27292, - Variant27293, - Variant27294, - Variant27295, - Variant27296, - Variant27297, - Variant27298, - Variant27299, - Variant27300, - Variant27301, - Variant27302, - Variant27303, - Variant27304, - Variant27305, - Variant27306, - Variant27307, - Variant27308, - Variant27309, - Variant27310, - Variant27311, - Variant27312, - Variant27313, - Variant27314, - Variant27315, - Variant27316, - Variant27317, - Variant27318, - Variant27319, - Variant27320, - Variant27321, - Variant27322, - Variant27323, - Variant27324, - Variant27325, - Variant27326, - Variant27327, - Variant27328, - Variant27329, - Variant27330, - Variant27331, - Variant27332, - Variant27333, - Variant27334, - Variant27335, - Variant27336, - Variant27337, - Variant27338, - Variant27339, - Variant27340, - Variant27341, - Variant27342, - Variant27343, - Variant27344, - Variant27345, - Variant27346, - Variant27347, - Variant27348, - Variant27349, - Variant27350, - Variant27351, - Variant27352, - Variant27353, - Variant27354, - Variant27355, - Variant27356, - Variant27357, - Variant27358, - Variant27359, - Variant27360, - Variant27361, - Variant27362, - Variant27363, - Variant27364, - Variant27365, - Variant27366, - Variant27367, - Variant27368, - Variant27369, - Variant27370, - Variant27371, - Variant27372, - Variant27373, - Variant27374, - Variant27375, - Variant27376, - Variant27377, - Variant27378, - Variant27379, - Variant27380, - Variant27381, - Variant27382, - Variant27383, - Variant27384, - Variant27385, - Variant27386, - Variant27387, - Variant27388, - Variant27389, - Variant27390, - Variant27391, - Variant27392, - Variant27393, - Variant27394, - Variant27395, - Variant27396, - Variant27397, - Variant27398, - Variant27399, - Variant27400, - Variant27401, - Variant27402, - Variant27403, - Variant27404, - Variant27405, - Variant27406, - Variant27407, - Variant27408, - Variant27409, - Variant27410, - Variant27411, - Variant27412, - Variant27413, - Variant27414, - Variant27415, - Variant27416, - Variant27417, - Variant27418, - Variant27419, - Variant27420, - Variant27421, - Variant27422, - Variant27423, - Variant27424, - Variant27425, - Variant27426, - Variant27427, - Variant27428, - Variant27429, - Variant27430, - Variant27431, - Variant27432, - Variant27433, - Variant27434, - Variant27435, - Variant27436, - Variant27437, - Variant27438, - Variant27439, - Variant27440, - Variant27441, - Variant27442, - Variant27443, - Variant27444, - Variant27445, - Variant27446, - Variant27447, - Variant27448, - Variant27449, - Variant27450, - Variant27451, - Variant27452, - Variant27453, - Variant27454, - Variant27455, - Variant27456, - Variant27457, - Variant27458, - Variant27459, - Variant27460, - Variant27461, - Variant27462, - Variant27463, - Variant27464, - Variant27465, - Variant27466, - Variant27467, - Variant27468, - Variant27469, - Variant27470, - Variant27471, - Variant27472, - Variant27473, - Variant27474, - Variant27475, - Variant27476, - Variant27477, - Variant27478, - Variant27479, - Variant27480, - Variant27481, - Variant27482, - Variant27483, - Variant27484, - Variant27485, - Variant27486, - Variant27487, - Variant27488, - Variant27489, - Variant27490, - Variant27491, - Variant27492, - Variant27493, - Variant27494, - Variant27495, - Variant27496, - Variant27497, - Variant27498, - Variant27499, - Variant27500, - Variant27501, - Variant27502, - Variant27503, - Variant27504, - Variant27505, - Variant27506, - Variant27507, - Variant27508, - Variant27509, - Variant27510, - Variant27511, - Variant27512, - Variant27513, - Variant27514, - Variant27515, - Variant27516, - Variant27517, - Variant27518, - Variant27519, - Variant27520, - Variant27521, - Variant27522, - Variant27523, - Variant27524, - Variant27525, - Variant27526, - Variant27527, - Variant27528, - Variant27529, - Variant27530, - Variant27531, - Variant27532, - Variant27533, - Variant27534, - Variant27535, - Variant27536, - Variant27537, - Variant27538, - Variant27539, - Variant27540, - Variant27541, - Variant27542, - Variant27543, - Variant27544, - Variant27545, - Variant27546, - Variant27547, - Variant27548, - Variant27549, - Variant27550, - Variant27551, - Variant27552, - Variant27553, - Variant27554, - Variant27555, - Variant27556, - Variant27557, - Variant27558, - Variant27559, - Variant27560, - Variant27561, - Variant27562, - Variant27563, - Variant27564, - Variant27565, - Variant27566, - Variant27567, - Variant27568, - Variant27569, - Variant27570, - Variant27571, - Variant27572, - Variant27573, - Variant27574, - Variant27575, - Variant27576, - Variant27577, - Variant27578, - Variant27579, - Variant27580, - Variant27581, - Variant27582, - Variant27583, - Variant27584, - Variant27585, - Variant27586, - Variant27587, - Variant27588, - Variant27589, - Variant27590, - Variant27591, - Variant27592, - Variant27593, - Variant27594, - Variant27595, - Variant27596, - Variant27597, - Variant27598, - Variant27599, - Variant27600, - Variant27601, - Variant27602, - Variant27603, - Variant27604, - Variant27605, - Variant27606, - Variant27607, - Variant27608, - Variant27609, - Variant27610, - Variant27611, - Variant27612, - Variant27613, - Variant27614, - Variant27615, - Variant27616, - Variant27617, - Variant27618, - Variant27619, - Variant27620, - Variant27621, - Variant27622, - Variant27623, - Variant27624, - Variant27625, - Variant27626, - Variant27627, - Variant27628, - Variant27629, - Variant27630, - Variant27631, - Variant27632, - Variant27633, - Variant27634, - Variant27635, - Variant27636, - Variant27637, - Variant27638, - Variant27639, - Variant27640, - Variant27641, - Variant27642, - Variant27643, - Variant27644, - Variant27645, - Variant27646, - Variant27647, - Variant27648, - Variant27649, - Variant27650, - Variant27651, - Variant27652, - Variant27653, - Variant27654, - Variant27655, - Variant27656, - Variant27657, - Variant27658, - Variant27659, - Variant27660, - Variant27661, - Variant27662, - Variant27663, - Variant27664, - Variant27665, - Variant27666, - Variant27667, - Variant27668, - Variant27669, - Variant27670, - Variant27671, - Variant27672, - Variant27673, - Variant27674, - Variant27675, - Variant27676, - Variant27677, - Variant27678, - Variant27679, - Variant27680, - Variant27681, - Variant27682, - Variant27683, - Variant27684, - Variant27685, - Variant27686, - Variant27687, - Variant27688, - Variant27689, - Variant27690, - Variant27691, - Variant27692, - Variant27693, - Variant27694, - Variant27695, - Variant27696, - Variant27697, - Variant27698, - Variant27699, - Variant27700, - Variant27701, - Variant27702, - Variant27703, - Variant27704, - Variant27705, - Variant27706, - Variant27707, - Variant27708, - Variant27709, - Variant27710, - Variant27711, - Variant27712, - Variant27713, - Variant27714, - Variant27715, - Variant27716, - Variant27717, - Variant27718, - Variant27719, - Variant27720, - Variant27721, - Variant27722, - Variant27723, - Variant27724, - Variant27725, - Variant27726, - Variant27727, - Variant27728, - Variant27729, - Variant27730, - Variant27731, - Variant27732, - Variant27733, - Variant27734, - Variant27735, - Variant27736, - Variant27737, - Variant27738, - Variant27739, - Variant27740, - Variant27741, - Variant27742, - Variant27743, - Variant27744, - Variant27745, - Variant27746, - Variant27747, - Variant27748, - Variant27749, - Variant27750, - Variant27751, - Variant27752, - Variant27753, - Variant27754, - Variant27755, - Variant27756, - Variant27757, - Variant27758, - Variant27759, - Variant27760, - Variant27761, - Variant27762, - Variant27763, - Variant27764, - Variant27765, - Variant27766, - Variant27767, - Variant27768, - Variant27769, - Variant27770, - Variant27771, - Variant27772, - Variant27773, - Variant27774, - Variant27775, - Variant27776, - Variant27777, - Variant27778, - Variant27779, - Variant27780, - Variant27781, - Variant27782, - Variant27783, - Variant27784, - Variant27785, - Variant27786, - Variant27787, - Variant27788, - Variant27789, - Variant27790, - Variant27791, - Variant27792, - Variant27793, - Variant27794, - Variant27795, - Variant27796, - Variant27797, - Variant27798, - Variant27799, - Variant27800, - Variant27801, - Variant27802, - Variant27803, - Variant27804, - Variant27805, - Variant27806, - Variant27807, - Variant27808, - Variant27809, - Variant27810, - Variant27811, - Variant27812, - Variant27813, - Variant27814, - Variant27815, - Variant27816, - Variant27817, - Variant27818, - Variant27819, - Variant27820, - Variant27821, - Variant27822, - Variant27823, - Variant27824, - Variant27825, - Variant27826, - Variant27827, - Variant27828, - Variant27829, - Variant27830, - Variant27831, - Variant27832, - Variant27833, - Variant27834, - Variant27835, - Variant27836, - Variant27837, - Variant27838, - Variant27839, - Variant27840, - Variant27841, - Variant27842, - Variant27843, - Variant27844, - Variant27845, - Variant27846, - Variant27847, - Variant27848, - Variant27849, - Variant27850, - Variant27851, - Variant27852, - Variant27853, - Variant27854, - Variant27855, - Variant27856, - Variant27857, - Variant27858, - Variant27859, - Variant27860, - Variant27861, - Variant27862, - Variant27863, - Variant27864, - Variant27865, - Variant27866, - Variant27867, - Variant27868, - Variant27869, - Variant27870, - Variant27871, - Variant27872, - Variant27873, - Variant27874, - Variant27875, - Variant27876, - Variant27877, - Variant27878, - Variant27879, - Variant27880, - Variant27881, - Variant27882, - Variant27883, - Variant27884, - Variant27885, - Variant27886, - Variant27887, - Variant27888, - Variant27889, - Variant27890, - Variant27891, - Variant27892, - Variant27893, - Variant27894, - Variant27895, - Variant27896, - Variant27897, - Variant27898, - Variant27899, - Variant27900, - Variant27901, - Variant27902, - Variant27903, - Variant27904, - Variant27905, - Variant27906, - Variant27907, - Variant27908, - Variant27909, - Variant27910, - Variant27911, - Variant27912, - Variant27913, - Variant27914, - Variant27915, - Variant27916, - Variant27917, - Variant27918, - Variant27919, - Variant27920, - Variant27921, - Variant27922, - Variant27923, - Variant27924, - Variant27925, - Variant27926, - Variant27927, - Variant27928, - Variant27929, - Variant27930, - Variant27931, - Variant27932, - Variant27933, - Variant27934, - Variant27935, - Variant27936, - Variant27937, - Variant27938, - Variant27939, - Variant27940, - Variant27941, - Variant27942, - Variant27943, - Variant27944, - Variant27945, - Variant27946, - Variant27947, - Variant27948, - Variant27949, - Variant27950, - Variant27951, - Variant27952, - Variant27953, - Variant27954, - Variant27955, - Variant27956, - Variant27957, - Variant27958, - Variant27959, - Variant27960, - Variant27961, - Variant27962, - Variant27963, - Variant27964, - Variant27965, - Variant27966, - Variant27967, - Variant27968, - Variant27969, - Variant27970, - Variant27971, - Variant27972, - Variant27973, - Variant27974, - Variant27975, - Variant27976, - Variant27977, - Variant27978, - Variant27979, - Variant27980, - Variant27981, - Variant27982, - Variant27983, - Variant27984, - Variant27985, - Variant27986, - Variant27987, - Variant27988, - Variant27989, - Variant27990, - Variant27991, - Variant27992, - Variant27993, - Variant27994, - Variant27995, - Variant27996, - Variant27997, - Variant27998, - Variant27999, - Variant28000, - Variant28001, - Variant28002, - Variant28003, - Variant28004, - Variant28005, - Variant28006, - Variant28007, - Variant28008, - Variant28009, - Variant28010, - Variant28011, - Variant28012, - Variant28013, - Variant28014, - Variant28015, - Variant28016, - Variant28017, - Variant28018, - Variant28019, - Variant28020, - Variant28021, - Variant28022, - Variant28023, - Variant28024, - Variant28025, - Variant28026, - Variant28027, - Variant28028, - Variant28029, - Variant28030, - Variant28031, - Variant28032, - Variant28033, - Variant28034, - Variant28035, - Variant28036, - Variant28037, - Variant28038, - Variant28039, - Variant28040, - Variant28041, - Variant28042, - Variant28043, - Variant28044, - Variant28045, - Variant28046, - Variant28047, - Variant28048, - Variant28049, - Variant28050, - Variant28051, - Variant28052, - Variant28053, - Variant28054, - Variant28055, - Variant28056, - Variant28057, - Variant28058, - Variant28059, - Variant28060, - Variant28061, - Variant28062, - Variant28063, - Variant28064, - Variant28065, - Variant28066, - Variant28067, - Variant28068, - Variant28069, - Variant28070, - Variant28071, - Variant28072, - Variant28073, - Variant28074, - Variant28075, - Variant28076, - Variant28077, - Variant28078, - Variant28079, - Variant28080, - Variant28081, - Variant28082, - Variant28083, - Variant28084, - Variant28085, - Variant28086, - Variant28087, - Variant28088, - Variant28089, - Variant28090, - Variant28091, - Variant28092, - Variant28093, - Variant28094, - Variant28095, - Variant28096, - Variant28097, - Variant28098, - Variant28099, - Variant28100, - Variant28101, - Variant28102, - Variant28103, - Variant28104, - Variant28105, - Variant28106, - Variant28107, - Variant28108, - Variant28109, - Variant28110, - Variant28111, - Variant28112, - Variant28113, - Variant28114, - Variant28115, - Variant28116, - Variant28117, - Variant28118, - Variant28119, - Variant28120, - Variant28121, - Variant28122, - Variant28123, - Variant28124, - Variant28125, - Variant28126, - Variant28127, - Variant28128, - Variant28129, - Variant28130, - Variant28131, - Variant28132, - Variant28133, - Variant28134, - Variant28135, - Variant28136, - Variant28137, - Variant28138, - Variant28139, - Variant28140, - Variant28141, - Variant28142, - Variant28143, - Variant28144, - Variant28145, - Variant28146, - Variant28147, - Variant28148, - Variant28149, - Variant28150, - Variant28151, - Variant28152, - Variant28153, - Variant28154, - Variant28155, - Variant28156, - Variant28157, - Variant28158, - Variant28159, - Variant28160, - Variant28161, - Variant28162, - Variant28163, - Variant28164, - Variant28165, - Variant28166, - Variant28167, - Variant28168, - Variant28169, - Variant28170, - Variant28171, - Variant28172, - Variant28173, - Variant28174, - Variant28175, - Variant28176, - Variant28177, - Variant28178, - Variant28179, - Variant28180, - Variant28181, - Variant28182, - Variant28183, - Variant28184, - Variant28185, - Variant28186, - Variant28187, - Variant28188, - Variant28189, - Variant28190, - Variant28191, - Variant28192, - Variant28193, - Variant28194, - Variant28195, - Variant28196, - Variant28197, - Variant28198, - Variant28199, - Variant28200, - Variant28201, - Variant28202, - Variant28203, - Variant28204, - Variant28205, - Variant28206, - Variant28207, - Variant28208, - Variant28209, - Variant28210, - Variant28211, - Variant28212, - Variant28213, - Variant28214, - Variant28215, - Variant28216, - Variant28217, - Variant28218, - Variant28219, - Variant28220, - Variant28221, - Variant28222, - Variant28223, - Variant28224, - Variant28225, - Variant28226, - Variant28227, - Variant28228, - Variant28229, - Variant28230, - Variant28231, - Variant28232, - Variant28233, - Variant28234, - Variant28235, - Variant28236, - Variant28237, - Variant28238, - Variant28239, - Variant28240, - Variant28241, - Variant28242, - Variant28243, - Variant28244, - Variant28245, - Variant28246, - Variant28247, - Variant28248, - Variant28249, - Variant28250, - Variant28251, - Variant28252, - Variant28253, - Variant28254, - Variant28255, - Variant28256, - Variant28257, - Variant28258, - Variant28259, - Variant28260, - Variant28261, - Variant28262, - Variant28263, - Variant28264, - Variant28265, - Variant28266, - Variant28267, - Variant28268, - Variant28269, - Variant28270, - Variant28271, - Variant28272, - Variant28273, - Variant28274, - Variant28275, - Variant28276, - Variant28277, - Variant28278, - Variant28279, - Variant28280, - Variant28281, - Variant28282, - Variant28283, - Variant28284, - Variant28285, - Variant28286, - Variant28287, - Variant28288, - Variant28289, - Variant28290, - Variant28291, - Variant28292, - Variant28293, - Variant28294, - Variant28295, - Variant28296, - Variant28297, - Variant28298, - Variant28299, - Variant28300, - Variant28301, - Variant28302, - Variant28303, - Variant28304, - Variant28305, - Variant28306, - Variant28307, - Variant28308, - Variant28309, - Variant28310, - Variant28311, - Variant28312, - Variant28313, - Variant28314, - Variant28315, - Variant28316, - Variant28317, - Variant28318, - Variant28319, - Variant28320, - Variant28321, - Variant28322, - Variant28323, - Variant28324, - Variant28325, - Variant28326, - Variant28327, - Variant28328, - Variant28329, - Variant28330, - Variant28331, - Variant28332, - Variant28333, - Variant28334, - Variant28335, - Variant28336, - Variant28337, - Variant28338, - Variant28339, - Variant28340, - Variant28341, - Variant28342, - Variant28343, - Variant28344, - Variant28345, - Variant28346, - Variant28347, - Variant28348, - Variant28349, - Variant28350, - Variant28351, - Variant28352, - Variant28353, - Variant28354, - Variant28355, - Variant28356, - Variant28357, - Variant28358, - Variant28359, - Variant28360, - Variant28361, - Variant28362, - Variant28363, - Variant28364, - Variant28365, - Variant28366, - Variant28367, - Variant28368, - Variant28369, - Variant28370, - Variant28371, - Variant28372, - Variant28373, - Variant28374, - Variant28375, - Variant28376, - Variant28377, - Variant28378, - Variant28379, - Variant28380, - Variant28381, - Variant28382, - Variant28383, - Variant28384, - Variant28385, - Variant28386, - Variant28387, - Variant28388, - Variant28389, - Variant28390, - Variant28391, - Variant28392, - Variant28393, - Variant28394, - Variant28395, - Variant28396, - Variant28397, - Variant28398, - Variant28399, - Variant28400, - Variant28401, - Variant28402, - Variant28403, - Variant28404, - Variant28405, - Variant28406, - Variant28407, - Variant28408, - Variant28409, - Variant28410, - Variant28411, - Variant28412, - Variant28413, - Variant28414, - Variant28415, - Variant28416, - Variant28417, - Variant28418, - Variant28419, - Variant28420, - Variant28421, - Variant28422, - Variant28423, - Variant28424, - Variant28425, - Variant28426, - Variant28427, - Variant28428, - Variant28429, - Variant28430, - Variant28431, - Variant28432, - Variant28433, - Variant28434, - Variant28435, - Variant28436, - Variant28437, - Variant28438, - Variant28439, - Variant28440, - Variant28441, - Variant28442, - Variant28443, - Variant28444, - Variant28445, - Variant28446, - Variant28447, - Variant28448, - Variant28449, - Variant28450, - Variant28451, - Variant28452, - Variant28453, - Variant28454, - Variant28455, - Variant28456, - Variant28457, - Variant28458, - Variant28459, - Variant28460, - Variant28461, - Variant28462, - Variant28463, - Variant28464, - Variant28465, - Variant28466, - Variant28467, - Variant28468, - Variant28469, - Variant28470, - Variant28471, - Variant28472, - Variant28473, - Variant28474, - Variant28475, - Variant28476, - Variant28477, - Variant28478, - Variant28479, - Variant28480, - Variant28481, - Variant28482, - Variant28483, - Variant28484, - Variant28485, - Variant28486, - Variant28487, - Variant28488, - Variant28489, - Variant28490, - Variant28491, - Variant28492, - Variant28493, - Variant28494, - Variant28495, - Variant28496, - Variant28497, - Variant28498, - Variant28499, - Variant28500, - Variant28501, - Variant28502, - Variant28503, - Variant28504, - Variant28505, - Variant28506, - Variant28507, - Variant28508, - Variant28509, - Variant28510, - Variant28511, - Variant28512, - Variant28513, - Variant28514, - Variant28515, - Variant28516, - Variant28517, - Variant28518, - Variant28519, - Variant28520, - Variant28521, - Variant28522, - Variant28523, - Variant28524, - Variant28525, - Variant28526, - Variant28527, - Variant28528, - Variant28529, - Variant28530, - Variant28531, - Variant28532, - Variant28533, - Variant28534, - Variant28535, - Variant28536, - Variant28537, - Variant28538, - Variant28539, - Variant28540, - Variant28541, - Variant28542, - Variant28543, - Variant28544, - Variant28545, - Variant28546, - Variant28547, - Variant28548, - Variant28549, - Variant28550, - Variant28551, - Variant28552, - Variant28553, - Variant28554, - Variant28555, - Variant28556, - Variant28557, - Variant28558, - Variant28559, - Variant28560, - Variant28561, - Variant28562, - Variant28563, - Variant28564, - Variant28565, - Variant28566, - Variant28567, - Variant28568, - Variant28569, - Variant28570, - Variant28571, - Variant28572, - Variant28573, - Variant28574, - Variant28575, - Variant28576, - Variant28577, - Variant28578, - Variant28579, - Variant28580, - Variant28581, - Variant28582, - Variant28583, - Variant28584, - Variant28585, - Variant28586, - Variant28587, - Variant28588, - Variant28589, - Variant28590, - Variant28591, - Variant28592, - Variant28593, - Variant28594, - Variant28595, - Variant28596, - Variant28597, - Variant28598, - Variant28599, - Variant28600, - Variant28601, - Variant28602, - Variant28603, - Variant28604, - Variant28605, - Variant28606, - Variant28607, - Variant28608, - Variant28609, - Variant28610, - Variant28611, - Variant28612, - Variant28613, - Variant28614, - Variant28615, - Variant28616, - Variant28617, - Variant28618, - Variant28619, - Variant28620, - Variant28621, - Variant28622, - Variant28623, - Variant28624, - Variant28625, - Variant28626, - Variant28627, - Variant28628, - Variant28629, - Variant28630, - Variant28631, - Variant28632, - Variant28633, - Variant28634, - Variant28635, - Variant28636, - Variant28637, - Variant28638, - Variant28639, - Variant28640, - Variant28641, - Variant28642, - Variant28643, - Variant28644, - Variant28645, - Variant28646, - Variant28647, - Variant28648, - Variant28649, - Variant28650, - Variant28651, - Variant28652, - Variant28653, - Variant28654, - Variant28655, - Variant28656, - Variant28657, - Variant28658, - Variant28659, - Variant28660, - Variant28661, - Variant28662, - Variant28663, - Variant28664, - Variant28665, - Variant28666, - Variant28667, - Variant28668, - Variant28669, - Variant28670, - Variant28671, - Variant28672, - Variant28673, - Variant28674, - Variant28675, - Variant28676, - Variant28677, - Variant28678, - Variant28679, - Variant28680, - Variant28681, - Variant28682, - Variant28683, - Variant28684, - Variant28685, - Variant28686, - Variant28687, - Variant28688, - Variant28689, - Variant28690, - Variant28691, - Variant28692, - Variant28693, - Variant28694, - Variant28695, - Variant28696, - Variant28697, - Variant28698, - Variant28699, - Variant28700, - Variant28701, - Variant28702, - Variant28703, - Variant28704, - Variant28705, - Variant28706, - Variant28707, - Variant28708, - Variant28709, - Variant28710, - Variant28711, - Variant28712, - Variant28713, - Variant28714, - Variant28715, - Variant28716, - Variant28717, - Variant28718, - Variant28719, - Variant28720, - Variant28721, - Variant28722, - Variant28723, - Variant28724, - Variant28725, - Variant28726, - Variant28727, - Variant28728, - Variant28729, - Variant28730, - Variant28731, - Variant28732, - Variant28733, - Variant28734, - Variant28735, - Variant28736, - Variant28737, - Variant28738, - Variant28739, - Variant28740, - Variant28741, - Variant28742, - Variant28743, - Variant28744, - Variant28745, - Variant28746, - Variant28747, - Variant28748, - Variant28749, - Variant28750, - Variant28751, - Variant28752, - Variant28753, - Variant28754, - Variant28755, - Variant28756, - Variant28757, - Variant28758, - Variant28759, - Variant28760, - Variant28761, - Variant28762, - Variant28763, - Variant28764, - Variant28765, - Variant28766, - Variant28767, - Variant28768, - Variant28769, - Variant28770, - Variant28771, - Variant28772, - Variant28773, - Variant28774, - Variant28775, - Variant28776, - Variant28777, - Variant28778, - Variant28779, - Variant28780, - Variant28781, - Variant28782, - Variant28783, - Variant28784, - Variant28785, - Variant28786, - Variant28787, - Variant28788, - Variant28789, - Variant28790, - Variant28791, - Variant28792, - Variant28793, - Variant28794, - Variant28795, - Variant28796, - Variant28797, - Variant28798, - Variant28799, - Variant28800, - Variant28801, - Variant28802, - Variant28803, - Variant28804, - Variant28805, - Variant28806, - Variant28807, - Variant28808, - Variant28809, - Variant28810, - Variant28811, - Variant28812, - Variant28813, - Variant28814, - Variant28815, - Variant28816, - Variant28817, - Variant28818, - Variant28819, - Variant28820, - Variant28821, - Variant28822, - Variant28823, - Variant28824, - Variant28825, - Variant28826, - Variant28827, - Variant28828, - Variant28829, - Variant28830, - Variant28831, - Variant28832, - Variant28833, - Variant28834, - Variant28835, - Variant28836, - Variant28837, - Variant28838, - Variant28839, - Variant28840, - Variant28841, - Variant28842, - Variant28843, - Variant28844, - Variant28845, - Variant28846, - Variant28847, - Variant28848, - Variant28849, - Variant28850, - Variant28851, - Variant28852, - Variant28853, - Variant28854, - Variant28855, - Variant28856, - Variant28857, - Variant28858, - Variant28859, - Variant28860, - Variant28861, - Variant28862, - Variant28863, - Variant28864, - Variant28865, - Variant28866, - Variant28867, - Variant28868, - Variant28869, - Variant28870, - Variant28871, - Variant28872, - Variant28873, - Variant28874, - Variant28875, - Variant28876, - Variant28877, - Variant28878, - Variant28879, - Variant28880, - Variant28881, - Variant28882, - Variant28883, - Variant28884, - Variant28885, - Variant28886, - Variant28887, - Variant28888, - Variant28889, - Variant28890, - Variant28891, - Variant28892, - Variant28893, - Variant28894, - Variant28895, - Variant28896, - Variant28897, - Variant28898, - Variant28899, - Variant28900, - Variant28901, - Variant28902, - Variant28903, - Variant28904, - Variant28905, - Variant28906, - Variant28907, - Variant28908, - Variant28909, - Variant28910, - Variant28911, - Variant28912, - Variant28913, - Variant28914, - Variant28915, - Variant28916, - Variant28917, - Variant28918, - Variant28919, - Variant28920, - Variant28921, - Variant28922, - Variant28923, - Variant28924, - Variant28925, - Variant28926, - Variant28927, - Variant28928, - Variant28929, - Variant28930, - Variant28931, - Variant28932, - Variant28933, - Variant28934, - Variant28935, - Variant28936, - Variant28937, - Variant28938, - Variant28939, - Variant28940, - Variant28941, - Variant28942, - Variant28943, - Variant28944, - Variant28945, - Variant28946, - Variant28947, - Variant28948, - Variant28949, - Variant28950, - Variant28951, - Variant28952, - Variant28953, - Variant28954, - Variant28955, - Variant28956, - Variant28957, - Variant28958, - Variant28959, - Variant28960, - Variant28961, - Variant28962, - Variant28963, - Variant28964, - Variant28965, - Variant28966, - Variant28967, - Variant28968, - Variant28969, - Variant28970, - Variant28971, - Variant28972, - Variant28973, - Variant28974, - Variant28975, - Variant28976, - Variant28977, - Variant28978, - Variant28979, - Variant28980, - Variant28981, - Variant28982, - Variant28983, - Variant28984, - Variant28985, - Variant28986, - Variant28987, - Variant28988, - Variant28989, - Variant28990, - Variant28991, - Variant28992, - Variant28993, - Variant28994, - Variant28995, - Variant28996, - Variant28997, - Variant28998, - Variant28999, - Variant29000, - Variant29001, - Variant29002, - Variant29003, - Variant29004, - Variant29005, - Variant29006, - Variant29007, - Variant29008, - Variant29009, - Variant29010, - Variant29011, - Variant29012, - Variant29013, - Variant29014, - Variant29015, - Variant29016, - Variant29017, - Variant29018, - Variant29019, - Variant29020, - Variant29021, - Variant29022, - Variant29023, - Variant29024, - Variant29025, - Variant29026, - Variant29027, - Variant29028, - Variant29029, - Variant29030, - Variant29031, - Variant29032, - Variant29033, - Variant29034, - Variant29035, - Variant29036, - Variant29037, - Variant29038, - Variant29039, - Variant29040, - Variant29041, - Variant29042, - Variant29043, - Variant29044, - Variant29045, - Variant29046, - Variant29047, - Variant29048, - Variant29049, - Variant29050, - Variant29051, - Variant29052, - Variant29053, - Variant29054, - Variant29055, - Variant29056, - Variant29057, - Variant29058, - Variant29059, - Variant29060, - Variant29061, - Variant29062, - Variant29063, - Variant29064, - Variant29065, - Variant29066, - Variant29067, - Variant29068, - Variant29069, - Variant29070, - Variant29071, - Variant29072, - Variant29073, - Variant29074, - Variant29075, - Variant29076, - Variant29077, - Variant29078, - Variant29079, - Variant29080, - Variant29081, - Variant29082, - Variant29083, - Variant29084, - Variant29085, - Variant29086, - Variant29087, - Variant29088, - Variant29089, - Variant29090, - Variant29091, - Variant29092, - Variant29093, - Variant29094, - Variant29095, - Variant29096, - Variant29097, - Variant29098, - Variant29099, - Variant29100, - Variant29101, - Variant29102, - Variant29103, - Variant29104, - Variant29105, - Variant29106, - Variant29107, - Variant29108, - Variant29109, - Variant29110, - Variant29111, - Variant29112, - Variant29113, - Variant29114, - Variant29115, - Variant29116, - Variant29117, - Variant29118, - Variant29119, - Variant29120, - Variant29121, - Variant29122, - Variant29123, - Variant29124, - Variant29125, - Variant29126, - Variant29127, - Variant29128, - Variant29129, - Variant29130, - Variant29131, - Variant29132, - Variant29133, - Variant29134, - Variant29135, - Variant29136, - Variant29137, - Variant29138, - Variant29139, - Variant29140, - Variant29141, - Variant29142, - Variant29143, - Variant29144, - Variant29145, - Variant29146, - Variant29147, - Variant29148, - Variant29149, - Variant29150, - Variant29151, - Variant29152, - Variant29153, - Variant29154, - Variant29155, - Variant29156, - Variant29157, - Variant29158, - Variant29159, - Variant29160, - Variant29161, - Variant29162, - Variant29163, - Variant29164, - Variant29165, - Variant29166, - Variant29167, - Variant29168, - Variant29169, - Variant29170, - Variant29171, - Variant29172, - Variant29173, - Variant29174, - Variant29175, - Variant29176, - Variant29177, - Variant29178, - Variant29179, - Variant29180, - Variant29181, - Variant29182, - Variant29183, - Variant29184, - Variant29185, - Variant29186, - Variant29187, - Variant29188, - Variant29189, - Variant29190, - Variant29191, - Variant29192, - Variant29193, - Variant29194, - Variant29195, - Variant29196, - Variant29197, - Variant29198, - Variant29199, - Variant29200, - Variant29201, - Variant29202, - Variant29203, - Variant29204, - Variant29205, - Variant29206, - Variant29207, - Variant29208, - Variant29209, - Variant29210, - Variant29211, - Variant29212, - Variant29213, - Variant29214, - Variant29215, - Variant29216, - Variant29217, - Variant29218, - Variant29219, - Variant29220, - Variant29221, - Variant29222, - Variant29223, - Variant29224, - Variant29225, - Variant29226, - Variant29227, - Variant29228, - Variant29229, - Variant29230, - Variant29231, - Variant29232, - Variant29233, - Variant29234, - Variant29235, - Variant29236, - Variant29237, - Variant29238, - Variant29239, - Variant29240, - Variant29241, - Variant29242, - Variant29243, - Variant29244, - Variant29245, - Variant29246, - Variant29247, - Variant29248, - Variant29249, - Variant29250, - Variant29251, - Variant29252, - Variant29253, - Variant29254, - Variant29255, - Variant29256, - Variant29257, - Variant29258, - Variant29259, - Variant29260, - Variant29261, - Variant29262, - Variant29263, - Variant29264, - Variant29265, - Variant29266, - Variant29267, - Variant29268, - Variant29269, - Variant29270, - Variant29271, - Variant29272, - Variant29273, - Variant29274, - Variant29275, - Variant29276, - Variant29277, - Variant29278, - Variant29279, - Variant29280, - Variant29281, - Variant29282, - Variant29283, - Variant29284, - Variant29285, - Variant29286, - Variant29287, - Variant29288, - Variant29289, - Variant29290, - Variant29291, - Variant29292, - Variant29293, - Variant29294, - Variant29295, - Variant29296, - Variant29297, - Variant29298, - Variant29299, - Variant29300, - Variant29301, - Variant29302, - Variant29303, - Variant29304, - Variant29305, - Variant29306, - Variant29307, - Variant29308, - Variant29309, - Variant29310, - Variant29311, - Variant29312, - Variant29313, - Variant29314, - Variant29315, - Variant29316, - Variant29317, - Variant29318, - Variant29319, - Variant29320, - Variant29321, - Variant29322, - Variant29323, - Variant29324, - Variant29325, - Variant29326, - Variant29327, - Variant29328, - Variant29329, - Variant29330, - Variant29331, - Variant29332, - Variant29333, - Variant29334, - Variant29335, - Variant29336, - Variant29337, - Variant29338, - Variant29339, - Variant29340, - Variant29341, - Variant29342, - Variant29343, - Variant29344, - Variant29345, - Variant29346, - Variant29347, - Variant29348, - Variant29349, - Variant29350, - Variant29351, - Variant29352, - Variant29353, - Variant29354, - Variant29355, - Variant29356, - Variant29357, - Variant29358, - Variant29359, - Variant29360, - Variant29361, - Variant29362, - Variant29363, - Variant29364, - Variant29365, - Variant29366, - Variant29367, - Variant29368, - Variant29369, - Variant29370, - Variant29371, - Variant29372, - Variant29373, - Variant29374, - Variant29375, - Variant29376, - Variant29377, - Variant29378, - Variant29379, - Variant29380, - Variant29381, - Variant29382, - Variant29383, - Variant29384, - Variant29385, - Variant29386, - Variant29387, - Variant29388, - Variant29389, - Variant29390, - Variant29391, - Variant29392, - Variant29393, - Variant29394, - Variant29395, - Variant29396, - Variant29397, - Variant29398, - Variant29399, - Variant29400, - Variant29401, - Variant29402, - Variant29403, - Variant29404, - Variant29405, - Variant29406, - Variant29407, - Variant29408, - Variant29409, - Variant29410, - Variant29411, - Variant29412, - Variant29413, - Variant29414, - Variant29415, - Variant29416, - Variant29417, - Variant29418, - Variant29419, - Variant29420, - Variant29421, - Variant29422, - Variant29423, - Variant29424, - Variant29425, - Variant29426, - Variant29427, - Variant29428, - Variant29429, - Variant29430, - Variant29431, - Variant29432, - Variant29433, - Variant29434, - Variant29435, - Variant29436, - Variant29437, - Variant29438, - Variant29439, - Variant29440, - Variant29441, - Variant29442, - Variant29443, - Variant29444, - Variant29445, - Variant29446, - Variant29447, - Variant29448, - Variant29449, - Variant29450, - Variant29451, - Variant29452, - Variant29453, - Variant29454, - Variant29455, - Variant29456, - Variant29457, - Variant29458, - Variant29459, - Variant29460, - Variant29461, - Variant29462, - Variant29463, - Variant29464, - Variant29465, - Variant29466, - Variant29467, - Variant29468, - Variant29469, - Variant29470, - Variant29471, - Variant29472, - Variant29473, - Variant29474, - Variant29475, - Variant29476, - Variant29477, - Variant29478, - Variant29479, - Variant29480, - Variant29481, - Variant29482, - Variant29483, - Variant29484, - Variant29485, - Variant29486, - Variant29487, - Variant29488, - Variant29489, - Variant29490, - Variant29491, - Variant29492, - Variant29493, - Variant29494, - Variant29495, - Variant29496, - Variant29497, - Variant29498, - Variant29499, - Variant29500, - Variant29501, - Variant29502, - Variant29503, - Variant29504, - Variant29505, - Variant29506, - Variant29507, - Variant29508, - Variant29509, - Variant29510, - Variant29511, - Variant29512, - Variant29513, - Variant29514, - Variant29515, - Variant29516, - Variant29517, - Variant29518, - Variant29519, - Variant29520, - Variant29521, - Variant29522, - Variant29523, - Variant29524, - Variant29525, - Variant29526, - Variant29527, - Variant29528, - Variant29529, - Variant29530, - Variant29531, - Variant29532, - Variant29533, - Variant29534, - Variant29535, - Variant29536, - Variant29537, - Variant29538, - Variant29539, - Variant29540, - Variant29541, - Variant29542, - Variant29543, - Variant29544, - Variant29545, - Variant29546, - Variant29547, - Variant29548, - Variant29549, - Variant29550, - Variant29551, - Variant29552, - Variant29553, - Variant29554, - Variant29555, - Variant29556, - Variant29557, - Variant29558, - Variant29559, - Variant29560, - Variant29561, - Variant29562, - Variant29563, - Variant29564, - Variant29565, - Variant29566, - Variant29567, - Variant29568, - Variant29569, - Variant29570, - Variant29571, - Variant29572, - Variant29573, - Variant29574, - Variant29575, - Variant29576, - Variant29577, - Variant29578, - Variant29579, - Variant29580, - Variant29581, - Variant29582, - Variant29583, - Variant29584, - Variant29585, - Variant29586, - Variant29587, - Variant29588, - Variant29589, - Variant29590, - Variant29591, - Variant29592, - Variant29593, - Variant29594, - Variant29595, - Variant29596, - Variant29597, - Variant29598, - Variant29599, - Variant29600, - Variant29601, - Variant29602, - Variant29603, - Variant29604, - Variant29605, - Variant29606, - Variant29607, - Variant29608, - Variant29609, - Variant29610, - Variant29611, - Variant29612, - Variant29613, - Variant29614, - Variant29615, - Variant29616, - Variant29617, - Variant29618, - Variant29619, - Variant29620, - Variant29621, - Variant29622, - Variant29623, - Variant29624, - Variant29625, - Variant29626, - Variant29627, - Variant29628, - Variant29629, - Variant29630, - Variant29631, - Variant29632, - Variant29633, - Variant29634, - Variant29635, - Variant29636, - Variant29637, - Variant29638, - Variant29639, - Variant29640, - Variant29641, - Variant29642, - Variant29643, - Variant29644, - Variant29645, - Variant29646, - Variant29647, - Variant29648, - Variant29649, - Variant29650, - Variant29651, - Variant29652, - Variant29653, - Variant29654, - Variant29655, - Variant29656, - Variant29657, - Variant29658, - Variant29659, - Variant29660, - Variant29661, - Variant29662, - Variant29663, - Variant29664, - Variant29665, - Variant29666, - Variant29667, - Variant29668, - Variant29669, - Variant29670, - Variant29671, - Variant29672, - Variant29673, - Variant29674, - Variant29675, - Variant29676, - Variant29677, - Variant29678, - Variant29679, - Variant29680, - Variant29681, - Variant29682, - Variant29683, - Variant29684, - Variant29685, - Variant29686, - Variant29687, - Variant29688, - Variant29689, - Variant29690, - Variant29691, - Variant29692, - Variant29693, - Variant29694, - Variant29695, - Variant29696, - Variant29697, - Variant29698, - Variant29699, - Variant29700, - Variant29701, - Variant29702, - Variant29703, - Variant29704, - Variant29705, - Variant29706, - Variant29707, - Variant29708, - Variant29709, - Variant29710, - Variant29711, - Variant29712, - Variant29713, - Variant29714, - Variant29715, - Variant29716, - Variant29717, - Variant29718, - Variant29719, - Variant29720, - Variant29721, - Variant29722, - Variant29723, - Variant29724, - Variant29725, - Variant29726, - Variant29727, - Variant29728, - Variant29729, - Variant29730, - Variant29731, - Variant29732, - Variant29733, - Variant29734, - Variant29735, - Variant29736, - Variant29737, - Variant29738, - Variant29739, - Variant29740, - Variant29741, - Variant29742, - Variant29743, - Variant29744, - Variant29745, - Variant29746, - Variant29747, - Variant29748, - Variant29749, - Variant29750, - Variant29751, - Variant29752, - Variant29753, - Variant29754, - Variant29755, - Variant29756, - Variant29757, - Variant29758, - Variant29759, - Variant29760, - Variant29761, - Variant29762, - Variant29763, - Variant29764, - Variant29765, - Variant29766, - Variant29767, - Variant29768, - Variant29769, - Variant29770, - Variant29771, - Variant29772, - Variant29773, - Variant29774, - Variant29775, - Variant29776, - Variant29777, - Variant29778, - Variant29779, - Variant29780, - Variant29781, - Variant29782, - Variant29783, - Variant29784, - Variant29785, - Variant29786, - Variant29787, - Variant29788, - Variant29789, - Variant29790, - Variant29791, - Variant29792, - Variant29793, - Variant29794, - Variant29795, - Variant29796, - Variant29797, - Variant29798, - Variant29799, - Variant29800, - Variant29801, - Variant29802, - Variant29803, - Variant29804, - Variant29805, - Variant29806, - Variant29807, - Variant29808, - Variant29809, - Variant29810, - Variant29811, - Variant29812, - Variant29813, - Variant29814, - Variant29815, - Variant29816, - Variant29817, - Variant29818, - Variant29819, - Variant29820, - Variant29821, - Variant29822, - Variant29823, - Variant29824, - Variant29825, - Variant29826, - Variant29827, - Variant29828, - Variant29829, - Variant29830, - Variant29831, - Variant29832, - Variant29833, - Variant29834, - Variant29835, - Variant29836, - Variant29837, - Variant29838, - Variant29839, - Variant29840, - Variant29841, - Variant29842, - Variant29843, - Variant29844, - Variant29845, - Variant29846, - Variant29847, - Variant29848, - Variant29849, - Variant29850, - Variant29851, - Variant29852, - Variant29853, - Variant29854, - Variant29855, - Variant29856, - Variant29857, - Variant29858, - Variant29859, - Variant29860, - Variant29861, - Variant29862, - Variant29863, - Variant29864, - Variant29865, - Variant29866, - Variant29867, - Variant29868, - Variant29869, - Variant29870, - Variant29871, - Variant29872, - Variant29873, - Variant29874, - Variant29875, - Variant29876, - Variant29877, - Variant29878, - Variant29879, - Variant29880, - Variant29881, - Variant29882, - Variant29883, - Variant29884, - Variant29885, - Variant29886, - Variant29887, - Variant29888, - Variant29889, - Variant29890, - Variant29891, - Variant29892, - Variant29893, - Variant29894, - Variant29895, - Variant29896, - Variant29897, - Variant29898, - Variant29899, - Variant29900, - Variant29901, - Variant29902, - Variant29903, - Variant29904, - Variant29905, - Variant29906, - Variant29907, - Variant29908, - Variant29909, - Variant29910, - Variant29911, - Variant29912, - Variant29913, - Variant29914, - Variant29915, - Variant29916, - Variant29917, - Variant29918, - Variant29919, - Variant29920, - Variant29921, - Variant29922, - Variant29923, - Variant29924, - Variant29925, - Variant29926, - Variant29927, - Variant29928, - Variant29929, - Variant29930, - Variant29931, - Variant29932, - Variant29933, - Variant29934, - Variant29935, - Variant29936, - Variant29937, - Variant29938, - Variant29939, - Variant29940, - Variant29941, - Variant29942, - Variant29943, - Variant29944, - Variant29945, - Variant29946, - Variant29947, - Variant29948, - Variant29949, - Variant29950, - Variant29951, - Variant29952, - Variant29953, - Variant29954, - Variant29955, - Variant29956, - Variant29957, - Variant29958, - Variant29959, - Variant29960, - Variant29961, - Variant29962, - Variant29963, - Variant29964, - Variant29965, - Variant29966, - Variant29967, - Variant29968, - Variant29969, - Variant29970, - Variant29971, - Variant29972, - Variant29973, - Variant29974, - Variant29975, - Variant29976, - Variant29977, - Variant29978, - Variant29979, - Variant29980, - Variant29981, - Variant29982, - Variant29983, - Variant29984, - Variant29985, - Variant29986, - Variant29987, - Variant29988, - Variant29989, - Variant29990, - Variant29991, - Variant29992, - Variant29993, - Variant29994, - Variant29995, - Variant29996, - Variant29997, - Variant29998, - Variant29999, - Variant30000, - Variant30001, - Variant30002, - Variant30003, - Variant30004, - Variant30005, - Variant30006, - Variant30007, - Variant30008, - Variant30009, - Variant30010, - Variant30011, - Variant30012, - Variant30013, - Variant30014, - Variant30015, - Variant30016, - Variant30017, - Variant30018, - Variant30019, - Variant30020, - Variant30021, - Variant30022, - Variant30023, - Variant30024, - Variant30025, - Variant30026, - Variant30027, - Variant30028, - Variant30029, - Variant30030, - Variant30031, - Variant30032, - Variant30033, - Variant30034, - Variant30035, - Variant30036, - Variant30037, - Variant30038, - Variant30039, - Variant30040, - Variant30041, - Variant30042, - Variant30043, - Variant30044, - Variant30045, - Variant30046, - Variant30047, - Variant30048, - Variant30049, - Variant30050, - Variant30051, - Variant30052, - Variant30053, - Variant30054, - Variant30055, - Variant30056, - Variant30057, - Variant30058, - Variant30059, - Variant30060, - Variant30061, - Variant30062, - Variant30063, - Variant30064, - Variant30065, - Variant30066, - Variant30067, - Variant30068, - Variant30069, - Variant30070, - Variant30071, - Variant30072, - Variant30073, - Variant30074, - Variant30075, - Variant30076, - Variant30077, - Variant30078, - Variant30079, - Variant30080, - Variant30081, - Variant30082, - Variant30083, - Variant30084, - Variant30085, - Variant30086, - Variant30087, - Variant30088, - Variant30089, - Variant30090, - Variant30091, - Variant30092, - Variant30093, - Variant30094, - Variant30095, - Variant30096, - Variant30097, - Variant30098, - Variant30099, - Variant30100, - Variant30101, - Variant30102, - Variant30103, - Variant30104, - Variant30105, - Variant30106, - Variant30107, - Variant30108, - Variant30109, - Variant30110, - Variant30111, - Variant30112, - Variant30113, - Variant30114, - Variant30115, - Variant30116, - Variant30117, - Variant30118, - Variant30119, - Variant30120, - Variant30121, - Variant30122, - Variant30123, - Variant30124, - Variant30125, - Variant30126, - Variant30127, - Variant30128, - Variant30129, - Variant30130, - Variant30131, - Variant30132, - Variant30133, - Variant30134, - Variant30135, - Variant30136, - Variant30137, - Variant30138, - Variant30139, - Variant30140, - Variant30141, - Variant30142, - Variant30143, - Variant30144, - Variant30145, - Variant30146, - Variant30147, - Variant30148, - Variant30149, - Variant30150, - Variant30151, - Variant30152, - Variant30153, - Variant30154, - Variant30155, - Variant30156, - Variant30157, - Variant30158, - Variant30159, - Variant30160, - Variant30161, - Variant30162, - Variant30163, - Variant30164, - Variant30165, - Variant30166, - Variant30167, - Variant30168, - Variant30169, - Variant30170, - Variant30171, - Variant30172, - Variant30173, - Variant30174, - Variant30175, - Variant30176, - Variant30177, - Variant30178, - Variant30179, - Variant30180, - Variant30181, - Variant30182, - Variant30183, - Variant30184, - Variant30185, - Variant30186, - Variant30187, - Variant30188, - Variant30189, - Variant30190, - Variant30191, - Variant30192, - Variant30193, - Variant30194, - Variant30195, - Variant30196, - Variant30197, - Variant30198, - Variant30199, - Variant30200, - Variant30201, - Variant30202, - Variant30203, - Variant30204, - Variant30205, - Variant30206, - Variant30207, - Variant30208, - Variant30209, - Variant30210, - Variant30211, - Variant30212, - Variant30213, - Variant30214, - Variant30215, - Variant30216, - Variant30217, - Variant30218, - Variant30219, - Variant30220, - Variant30221, - Variant30222, - Variant30223, - Variant30224, - Variant30225, - Variant30226, - Variant30227, - Variant30228, - Variant30229, - Variant30230, - Variant30231, - Variant30232, - Variant30233, - Variant30234, - Variant30235, - Variant30236, - Variant30237, - Variant30238, - Variant30239, - Variant30240, - Variant30241, - Variant30242, - Variant30243, - Variant30244, - Variant30245, - Variant30246, - Variant30247, - Variant30248, - Variant30249, - Variant30250, - Variant30251, - Variant30252, - Variant30253, - Variant30254, - Variant30255, - Variant30256, - Variant30257, - Variant30258, - Variant30259, - Variant30260, - Variant30261, - Variant30262, - Variant30263, - Variant30264, - Variant30265, - Variant30266, - Variant30267, - Variant30268, - Variant30269, - Variant30270, - Variant30271, - Variant30272, - Variant30273, - Variant30274, - Variant30275, - Variant30276, - Variant30277, - Variant30278, - Variant30279, - Variant30280, - Variant30281, - Variant30282, - Variant30283, - Variant30284, - Variant30285, - Variant30286, - Variant30287, - Variant30288, - Variant30289, - Variant30290, - Variant30291, - Variant30292, - Variant30293, - Variant30294, - Variant30295, - Variant30296, - Variant30297, - Variant30298, - Variant30299, - Variant30300, - Variant30301, - Variant30302, - Variant30303, - Variant30304, - Variant30305, - Variant30306, - Variant30307, - Variant30308, - Variant30309, - Variant30310, - Variant30311, - Variant30312, - Variant30313, - Variant30314, - Variant30315, - Variant30316, - Variant30317, - Variant30318, - Variant30319, - Variant30320, - Variant30321, - Variant30322, - Variant30323, - Variant30324, - Variant30325, - Variant30326, - Variant30327, - Variant30328, - Variant30329, - Variant30330, - Variant30331, - Variant30332, - Variant30333, - Variant30334, - Variant30335, - Variant30336, - Variant30337, - Variant30338, - Variant30339, - Variant30340, - Variant30341, - Variant30342, - Variant30343, - Variant30344, - Variant30345, - Variant30346, - Variant30347, - Variant30348, - Variant30349, - Variant30350, - Variant30351, - Variant30352, - Variant30353, - Variant30354, - Variant30355, - Variant30356, - Variant30357, - Variant30358, - Variant30359, - Variant30360, - Variant30361, - Variant30362, - Variant30363, - Variant30364, - Variant30365, - Variant30366, - Variant30367, - Variant30368, - Variant30369, - Variant30370, - Variant30371, - Variant30372, - Variant30373, - Variant30374, - Variant30375, - Variant30376, - Variant30377, - Variant30378, - Variant30379, - Variant30380, - Variant30381, - Variant30382, - Variant30383, - Variant30384, - Variant30385, - Variant30386, - Variant30387, - Variant30388, - Variant30389, - Variant30390, - Variant30391, - Variant30392, - Variant30393, - Variant30394, - Variant30395, - Variant30396, - Variant30397, - Variant30398, - Variant30399, - Variant30400, - Variant30401, - Variant30402, - Variant30403, - Variant30404, - Variant30405, - Variant30406, - Variant30407, - Variant30408, - Variant30409, - Variant30410, - Variant30411, - Variant30412, - Variant30413, - Variant30414, - Variant30415, - Variant30416, - Variant30417, - Variant30418, - Variant30419, - Variant30420, - Variant30421, - Variant30422, - Variant30423, - Variant30424, - Variant30425, - Variant30426, - Variant30427, - Variant30428, - Variant30429, - Variant30430, - Variant30431, - Variant30432, - Variant30433, - Variant30434, - Variant30435, - Variant30436, - Variant30437, - Variant30438, - Variant30439, - Variant30440, - Variant30441, - Variant30442, - Variant30443, - Variant30444, - Variant30445, - Variant30446, - Variant30447, - Variant30448, - Variant30449, - Variant30450, - Variant30451, - Variant30452, - Variant30453, - Variant30454, - Variant30455, - Variant30456, - Variant30457, - Variant30458, - Variant30459, - Variant30460, - Variant30461, - Variant30462, - Variant30463, - Variant30464, - Variant30465, - Variant30466, - Variant30467, - Variant30468, - Variant30469, - Variant30470, - Variant30471, - Variant30472, - Variant30473, - Variant30474, - Variant30475, - Variant30476, - Variant30477, - Variant30478, - Variant30479, - Variant30480, - Variant30481, - Variant30482, - Variant30483, - Variant30484, - Variant30485, - Variant30486, - Variant30487, - Variant30488, - Variant30489, - Variant30490, - Variant30491, - Variant30492, - Variant30493, - Variant30494, - Variant30495, - Variant30496, - Variant30497, - Variant30498, - Variant30499, - Variant30500, - Variant30501, - Variant30502, - Variant30503, - Variant30504, - Variant30505, - Variant30506, - Variant30507, - Variant30508, - Variant30509, - Variant30510, - Variant30511, - Variant30512, - Variant30513, - Variant30514, - Variant30515, - Variant30516, - Variant30517, - Variant30518, - Variant30519, - Variant30520, - Variant30521, - Variant30522, - Variant30523, - Variant30524, - Variant30525, - Variant30526, - Variant30527, - Variant30528, - Variant30529, - Variant30530, - Variant30531, - Variant30532, - Variant30533, - Variant30534, - Variant30535, - Variant30536, - Variant30537, - Variant30538, - Variant30539, - Variant30540, - Variant30541, - Variant30542, - Variant30543, - Variant30544, - Variant30545, - Variant30546, - Variant30547, - Variant30548, - Variant30549, - Variant30550, - Variant30551, - Variant30552, - Variant30553, - Variant30554, - Variant30555, - Variant30556, - Variant30557, - Variant30558, - Variant30559, - Variant30560, - Variant30561, - Variant30562, - Variant30563, - Variant30564, - Variant30565, - Variant30566, - Variant30567, - Variant30568, - Variant30569, - Variant30570, - Variant30571, - Variant30572, - Variant30573, - Variant30574, - Variant30575, - Variant30576, - Variant30577, - Variant30578, - Variant30579, - Variant30580, - Variant30581, - Variant30582, - Variant30583, - Variant30584, - Variant30585, - Variant30586, - Variant30587, - Variant30588, - Variant30589, - Variant30590, - Variant30591, - Variant30592, - Variant30593, - Variant30594, - Variant30595, - Variant30596, - Variant30597, - Variant30598, - Variant30599, - Variant30600, - Variant30601, - Variant30602, - Variant30603, - Variant30604, - Variant30605, - Variant30606, - Variant30607, - Variant30608, - Variant30609, - Variant30610, - Variant30611, - Variant30612, - Variant30613, - Variant30614, - Variant30615, - Variant30616, - Variant30617, - Variant30618, - Variant30619, - Variant30620, - Variant30621, - Variant30622, - Variant30623, - Variant30624, - Variant30625, - Variant30626, - Variant30627, - Variant30628, - Variant30629, - Variant30630, - Variant30631, - Variant30632, - Variant30633, - Variant30634, - Variant30635, - Variant30636, - Variant30637, - Variant30638, - Variant30639, - Variant30640, - Variant30641, - Variant30642, - Variant30643, - Variant30644, - Variant30645, - Variant30646, - Variant30647, - Variant30648, - Variant30649, - Variant30650, - Variant30651, - Variant30652, - Variant30653, - Variant30654, - Variant30655, - Variant30656, - Variant30657, - Variant30658, - Variant30659, - Variant30660, - Variant30661, - Variant30662, - Variant30663, - Variant30664, - Variant30665, - Variant30666, - Variant30667, - Variant30668, - Variant30669, - Variant30670, - Variant30671, - Variant30672, - Variant30673, - Variant30674, - Variant30675, - Variant30676, - Variant30677, - Variant30678, - Variant30679, - Variant30680, - Variant30681, - Variant30682, - Variant30683, - Variant30684, - Variant30685, - Variant30686, - Variant30687, - Variant30688, - Variant30689, - Variant30690, - Variant30691, - Variant30692, - Variant30693, - Variant30694, - Variant30695, - Variant30696, - Variant30697, - Variant30698, - Variant30699, - Variant30700, - Variant30701, - Variant30702, - Variant30703, - Variant30704, - Variant30705, - Variant30706, - Variant30707, - Variant30708, - Variant30709, - Variant30710, - Variant30711, - Variant30712, - Variant30713, - Variant30714, - Variant30715, - Variant30716, - Variant30717, - Variant30718, - Variant30719, - Variant30720, - Variant30721, - Variant30722, - Variant30723, - Variant30724, - Variant30725, - Variant30726, - Variant30727, - Variant30728, - Variant30729, - Variant30730, - Variant30731, - Variant30732, - Variant30733, - Variant30734, - Variant30735, - Variant30736, - Variant30737, - Variant30738, - Variant30739, - Variant30740, - Variant30741, - Variant30742, - Variant30743, - Variant30744, - Variant30745, - Variant30746, - Variant30747, - Variant30748, - Variant30749, - Variant30750, - Variant30751, - Variant30752, - Variant30753, - Variant30754, - Variant30755, - Variant30756, - Variant30757, - Variant30758, - Variant30759, - Variant30760, - Variant30761, - Variant30762, - Variant30763, - Variant30764, - Variant30765, - Variant30766, - Variant30767, - Variant30768, - Variant30769, - Variant30770, - Variant30771, - Variant30772, - Variant30773, - Variant30774, - Variant30775, - Variant30776, - Variant30777, - Variant30778, - Variant30779, - Variant30780, - Variant30781, - Variant30782, - Variant30783, - Variant30784, - Variant30785, - Variant30786, - Variant30787, - Variant30788, - Variant30789, - Variant30790, - Variant30791, - Variant30792, - Variant30793, - Variant30794, - Variant30795, - Variant30796, - Variant30797, - Variant30798, - Variant30799, - Variant30800, - Variant30801, - Variant30802, - Variant30803, - Variant30804, - Variant30805, - Variant30806, - Variant30807, - Variant30808, - Variant30809, - Variant30810, - Variant30811, - Variant30812, - Variant30813, - Variant30814, - Variant30815, - Variant30816, - Variant30817, - Variant30818, - Variant30819, - Variant30820, - Variant30821, - Variant30822, - Variant30823, - Variant30824, - Variant30825, - Variant30826, - Variant30827, - Variant30828, - Variant30829, - Variant30830, - Variant30831, - Variant30832, - Variant30833, - Variant30834, - Variant30835, - Variant30836, - Variant30837, - Variant30838, - Variant30839, - Variant30840, - Variant30841, - Variant30842, - Variant30843, - Variant30844, - Variant30845, - Variant30846, - Variant30847, - Variant30848, - Variant30849, - Variant30850, - Variant30851, - Variant30852, - Variant30853, - Variant30854, - Variant30855, - Variant30856, - Variant30857, - Variant30858, - Variant30859, - Variant30860, - Variant30861, - Variant30862, - Variant30863, - Variant30864, - Variant30865, - Variant30866, - Variant30867, - Variant30868, - Variant30869, - Variant30870, - Variant30871, - Variant30872, - Variant30873, - Variant30874, - Variant30875, - Variant30876, - Variant30877, - Variant30878, - Variant30879, - Variant30880, - Variant30881, - Variant30882, - Variant30883, - Variant30884, - Variant30885, - Variant30886, - Variant30887, - Variant30888, - Variant30889, - Variant30890, - Variant30891, - Variant30892, - Variant30893, - Variant30894, - Variant30895, - Variant30896, - Variant30897, - Variant30898, - Variant30899, - Variant30900, - Variant30901, - Variant30902, - Variant30903, - Variant30904, - Variant30905, - Variant30906, - Variant30907, - Variant30908, - Variant30909, - Variant30910, - Variant30911, - Variant30912, - Variant30913, - Variant30914, - Variant30915, - Variant30916, - Variant30917, - Variant30918, - Variant30919, - Variant30920, - Variant30921, - Variant30922, - Variant30923, - Variant30924, - Variant30925, - Variant30926, - Variant30927, - Variant30928, - Variant30929, - Variant30930, - Variant30931, - Variant30932, - Variant30933, - Variant30934, - Variant30935, - Variant30936, - Variant30937, - Variant30938, - Variant30939, - Variant30940, - Variant30941, - Variant30942, - Variant30943, - Variant30944, - Variant30945, - Variant30946, - Variant30947, - Variant30948, - Variant30949, - Variant30950, - Variant30951, - Variant30952, - Variant30953, - Variant30954, - Variant30955, - Variant30956, - Variant30957, - Variant30958, - Variant30959, - Variant30960, - Variant30961, - Variant30962, - Variant30963, - Variant30964, - Variant30965, - Variant30966, - Variant30967, - Variant30968, - Variant30969, - Variant30970, - Variant30971, - Variant30972, - Variant30973, - Variant30974, - Variant30975, - Variant30976, - Variant30977, - Variant30978, - Variant30979, - Variant30980, - Variant30981, - Variant30982, - Variant30983, - Variant30984, - Variant30985, - Variant30986, - Variant30987, - Variant30988, - Variant30989, - Variant30990, - Variant30991, - Variant30992, - Variant30993, - Variant30994, - Variant30995, - Variant30996, - Variant30997, - Variant30998, - Variant30999, - Variant31000, - Variant31001, - Variant31002, - Variant31003, - Variant31004, - Variant31005, - Variant31006, - Variant31007, - Variant31008, - Variant31009, - Variant31010, - Variant31011, - Variant31012, - Variant31013, - Variant31014, - Variant31015, - Variant31016, - Variant31017, - Variant31018, - Variant31019, - Variant31020, - Variant31021, - Variant31022, - Variant31023, - Variant31024, - Variant31025, - Variant31026, - Variant31027, - Variant31028, - Variant31029, - Variant31030, - Variant31031, - Variant31032, - Variant31033, - Variant31034, - Variant31035, - Variant31036, - Variant31037, - Variant31038, - Variant31039, - Variant31040, - Variant31041, - Variant31042, - Variant31043, - Variant31044, - Variant31045, - Variant31046, - Variant31047, - Variant31048, - Variant31049, - Variant31050, - Variant31051, - Variant31052, - Variant31053, - Variant31054, - Variant31055, - Variant31056, - Variant31057, - Variant31058, - Variant31059, - Variant31060, - Variant31061, - Variant31062, - Variant31063, - Variant31064, - Variant31065, - Variant31066, - Variant31067, - Variant31068, - Variant31069, - Variant31070, - Variant31071, - Variant31072, - Variant31073, - Variant31074, - Variant31075, - Variant31076, - Variant31077, - Variant31078, - Variant31079, - Variant31080, - Variant31081, - Variant31082, - Variant31083, - Variant31084, - Variant31085, - Variant31086, - Variant31087, - Variant31088, - Variant31089, - Variant31090, - Variant31091, - Variant31092, - Variant31093, - Variant31094, - Variant31095, - Variant31096, - Variant31097, - Variant31098, - Variant31099, - Variant31100, - Variant31101, - Variant31102, - Variant31103, - Variant31104, - Variant31105, - Variant31106, - Variant31107, - Variant31108, - Variant31109, - Variant31110, - Variant31111, - Variant31112, - Variant31113, - Variant31114, - Variant31115, - Variant31116, - Variant31117, - Variant31118, - Variant31119, - Variant31120, - Variant31121, - Variant31122, - Variant31123, - Variant31124, - Variant31125, - Variant31126, - Variant31127, - Variant31128, - Variant31129, - Variant31130, - Variant31131, - Variant31132, - Variant31133, - Variant31134, - Variant31135, - Variant31136, - Variant31137, - Variant31138, - Variant31139, - Variant31140, - Variant31141, - Variant31142, - Variant31143, - Variant31144, - Variant31145, - Variant31146, - Variant31147, - Variant31148, - Variant31149, - Variant31150, - Variant31151, - Variant31152, - Variant31153, - Variant31154, - Variant31155, - Variant31156, - Variant31157, - Variant31158, - Variant31159, - Variant31160, - Variant31161, - Variant31162, - Variant31163, - Variant31164, - Variant31165, - Variant31166, - Variant31167, - Variant31168, - Variant31169, - Variant31170, - Variant31171, - Variant31172, - Variant31173, - Variant31174, - Variant31175, - Variant31176, - Variant31177, - Variant31178, - Variant31179, - Variant31180, - Variant31181, - Variant31182, - Variant31183, - Variant31184, - Variant31185, - Variant31186, - Variant31187, - Variant31188, - Variant31189, - Variant31190, - Variant31191, - Variant31192, - Variant31193, - Variant31194, - Variant31195, - Variant31196, - Variant31197, - Variant31198, - Variant31199, - Variant31200, - Variant31201, - Variant31202, - Variant31203, - Variant31204, - Variant31205, - Variant31206, - Variant31207, - Variant31208, - Variant31209, - Variant31210, - Variant31211, - Variant31212, - Variant31213, - Variant31214, - Variant31215, - Variant31216, - Variant31217, - Variant31218, - Variant31219, - Variant31220, - Variant31221, - Variant31222, - Variant31223, - Variant31224, - Variant31225, - Variant31226, - Variant31227, - Variant31228, - Variant31229, - Variant31230, - Variant31231, - Variant31232, - Variant31233, - Variant31234, - Variant31235, - Variant31236, - Variant31237, - Variant31238, - Variant31239, - Variant31240, - Variant31241, - Variant31242, - Variant31243, - Variant31244, - Variant31245, - Variant31246, - Variant31247, - Variant31248, - Variant31249, - Variant31250, - Variant31251, - Variant31252, - Variant31253, - Variant31254, - Variant31255, - Variant31256, - Variant31257, - Variant31258, - Variant31259, - Variant31260, - Variant31261, - Variant31262, - Variant31263, - Variant31264, - Variant31265, - Variant31266, - Variant31267, - Variant31268, - Variant31269, - Variant31270, - Variant31271, - Variant31272, - Variant31273, - Variant31274, - Variant31275, - Variant31276, - Variant31277, - Variant31278, - Variant31279, - Variant31280, - Variant31281, - Variant31282, - Variant31283, - Variant31284, - Variant31285, - Variant31286, - Variant31287, - Variant31288, - Variant31289, - Variant31290, - Variant31291, - Variant31292, - Variant31293, - Variant31294, - Variant31295, - Variant31296, - Variant31297, - Variant31298, - Variant31299, - Variant31300, - Variant31301, - Variant31302, - Variant31303, - Variant31304, - Variant31305, - Variant31306, - Variant31307, - Variant31308, - Variant31309, - Variant31310, - Variant31311, - Variant31312, - Variant31313, - Variant31314, - Variant31315, - Variant31316, - Variant31317, - Variant31318, - Variant31319, - Variant31320, - Variant31321, - Variant31322, - Variant31323, - Variant31324, - Variant31325, - Variant31326, - Variant31327, - Variant31328, - Variant31329, - Variant31330, - Variant31331, - Variant31332, - Variant31333, - Variant31334, - Variant31335, - Variant31336, - Variant31337, - Variant31338, - Variant31339, - Variant31340, - Variant31341, - Variant31342, - Variant31343, - Variant31344, - Variant31345, - Variant31346, - Variant31347, - Variant31348, - Variant31349, - Variant31350, - Variant31351, - Variant31352, - Variant31353, - Variant31354, - Variant31355, - Variant31356, - Variant31357, - Variant31358, - Variant31359, - Variant31360, - Variant31361, - Variant31362, - Variant31363, - Variant31364, - Variant31365, - Variant31366, - Variant31367, - Variant31368, - Variant31369, - Variant31370, - Variant31371, - Variant31372, - Variant31373, - Variant31374, - Variant31375, - Variant31376, - Variant31377, - Variant31378, - Variant31379, - Variant31380, - Variant31381, - Variant31382, - Variant31383, - Variant31384, - Variant31385, - Variant31386, - Variant31387, - Variant31388, - Variant31389, - Variant31390, - Variant31391, - Variant31392, - Variant31393, - Variant31394, - Variant31395, - Variant31396, - Variant31397, - Variant31398, - Variant31399, - Variant31400, - Variant31401, - Variant31402, - Variant31403, - Variant31404, - Variant31405, - Variant31406, - Variant31407, - Variant31408, - Variant31409, - Variant31410, - Variant31411, - Variant31412, - Variant31413, - Variant31414, - Variant31415, - Variant31416, - Variant31417, - Variant31418, - Variant31419, - Variant31420, - Variant31421, - Variant31422, - Variant31423, - Variant31424, - Variant31425, - Variant31426, - Variant31427, - Variant31428, - Variant31429, - Variant31430, - Variant31431, - Variant31432, - Variant31433, - Variant31434, - Variant31435, - Variant31436, - Variant31437, - Variant31438, - Variant31439, - Variant31440, - Variant31441, - Variant31442, - Variant31443, - Variant31444, - Variant31445, - Variant31446, - Variant31447, - Variant31448, - Variant31449, - Variant31450, - Variant31451, - Variant31452, - Variant31453, - Variant31454, - Variant31455, - Variant31456, - Variant31457, - Variant31458, - Variant31459, - Variant31460, - Variant31461, - Variant31462, - Variant31463, - Variant31464, - Variant31465, - Variant31466, - Variant31467, - Variant31468, - Variant31469, - Variant31470, - Variant31471, - Variant31472, - Variant31473, - Variant31474, - Variant31475, - Variant31476, - Variant31477, - Variant31478, - Variant31479, - Variant31480, - Variant31481, - Variant31482, - Variant31483, - Variant31484, - Variant31485, - Variant31486, - Variant31487, - Variant31488, - Variant31489, - Variant31490, - Variant31491, - Variant31492, - Variant31493, - Variant31494, - Variant31495, - Variant31496, - Variant31497, - Variant31498, - Variant31499, - Variant31500, - Variant31501, - Variant31502, - Variant31503, - Variant31504, - Variant31505, - Variant31506, - Variant31507, - Variant31508, - Variant31509, - Variant31510, - Variant31511, - Variant31512, - Variant31513, - Variant31514, - Variant31515, - Variant31516, - Variant31517, - Variant31518, - Variant31519, - Variant31520, - Variant31521, - Variant31522, - Variant31523, - Variant31524, - Variant31525, - Variant31526, - Variant31527, - Variant31528, - Variant31529, - Variant31530, - Variant31531, - Variant31532, - Variant31533, - Variant31534, - Variant31535, - Variant31536, - Variant31537, - Variant31538, - Variant31539, - Variant31540, - Variant31541, - Variant31542, - Variant31543, - Variant31544, - Variant31545, - Variant31546, - Variant31547, - Variant31548, - Variant31549, - Variant31550, - Variant31551, - Variant31552, - Variant31553, - Variant31554, - Variant31555, - Variant31556, - Variant31557, - Variant31558, - Variant31559, - Variant31560, - Variant31561, - Variant31562, - Variant31563, - Variant31564, - Variant31565, - Variant31566, - Variant31567, - Variant31568, - Variant31569, - Variant31570, - Variant31571, - Variant31572, - Variant31573, - Variant31574, - Variant31575, - Variant31576, - Variant31577, - Variant31578, - Variant31579, - Variant31580, - Variant31581, - Variant31582, - Variant31583, - Variant31584, - Variant31585, - Variant31586, - Variant31587, - Variant31588, - Variant31589, - Variant31590, - Variant31591, - Variant31592, - Variant31593, - Variant31594, - Variant31595, - Variant31596, - Variant31597, - Variant31598, - Variant31599, - Variant31600, - Variant31601, - Variant31602, - Variant31603, - Variant31604, - Variant31605, - Variant31606, - Variant31607, - Variant31608, - Variant31609, - Variant31610, - Variant31611, - Variant31612, - Variant31613, - Variant31614, - Variant31615, - Variant31616, - Variant31617, - Variant31618, - Variant31619, - Variant31620, - Variant31621, - Variant31622, - Variant31623, - Variant31624, - Variant31625, - Variant31626, - Variant31627, - Variant31628, - Variant31629, - Variant31630, - Variant31631, - Variant31632, - Variant31633, - Variant31634, - Variant31635, - Variant31636, - Variant31637, - Variant31638, - Variant31639, - Variant31640, - Variant31641, - Variant31642, - Variant31643, - Variant31644, - Variant31645, - Variant31646, - Variant31647, - Variant31648, - Variant31649, - Variant31650, - Variant31651, - Variant31652, - Variant31653, - Variant31654, - Variant31655, - Variant31656, - Variant31657, - Variant31658, - Variant31659, - Variant31660, - Variant31661, - Variant31662, - Variant31663, - Variant31664, - Variant31665, - Variant31666, - Variant31667, - Variant31668, - Variant31669, - Variant31670, - Variant31671, - Variant31672, - Variant31673, - Variant31674, - Variant31675, - Variant31676, - Variant31677, - Variant31678, - Variant31679, - Variant31680, - Variant31681, - Variant31682, - Variant31683, - Variant31684, - Variant31685, - Variant31686, - Variant31687, - Variant31688, - Variant31689, - Variant31690, - Variant31691, - Variant31692, - Variant31693, - Variant31694, - Variant31695, - Variant31696, - Variant31697, - Variant31698, - Variant31699, - Variant31700, - Variant31701, - Variant31702, - Variant31703, - Variant31704, - Variant31705, - Variant31706, - Variant31707, - Variant31708, - Variant31709, - Variant31710, - Variant31711, - Variant31712, - Variant31713, - Variant31714, - Variant31715, - Variant31716, - Variant31717, - Variant31718, - Variant31719, - Variant31720, - Variant31721, - Variant31722, - Variant31723, - Variant31724, - Variant31725, - Variant31726, - Variant31727, - Variant31728, - Variant31729, - Variant31730, - Variant31731, - Variant31732, - Variant31733, - Variant31734, - Variant31735, - Variant31736, - Variant31737, - Variant31738, - Variant31739, - Variant31740, - Variant31741, - Variant31742, - Variant31743, - Variant31744, - Variant31745, - Variant31746, - Variant31747, - Variant31748, - Variant31749, - Variant31750, - Variant31751, - Variant31752, - Variant31753, - Variant31754, - Variant31755, - Variant31756, - Variant31757, - Variant31758, - Variant31759, - Variant31760, - Variant31761, - Variant31762, - Variant31763, - Variant31764, - Variant31765, - Variant31766, - Variant31767, - Variant31768, - Variant31769, - Variant31770, - Variant31771, - Variant31772, - Variant31773, - Variant31774, - Variant31775, - Variant31776, - Variant31777, - Variant31778, - Variant31779, - Variant31780, - Variant31781, - Variant31782, - Variant31783, - Variant31784, - Variant31785, - Variant31786, - Variant31787, - Variant31788, - Variant31789, - Variant31790, - Variant31791, - Variant31792, - Variant31793, - Variant31794, - Variant31795, - Variant31796, - Variant31797, - Variant31798, - Variant31799, - Variant31800, - Variant31801, - Variant31802, - Variant31803, - Variant31804, - Variant31805, - Variant31806, - Variant31807, - Variant31808, - Variant31809, - Variant31810, - Variant31811, - Variant31812, - Variant31813, - Variant31814, - Variant31815, - Variant31816, - Variant31817, - Variant31818, - Variant31819, - Variant31820, - Variant31821, - Variant31822, - Variant31823, - Variant31824, - Variant31825, - Variant31826, - Variant31827, - Variant31828, - Variant31829, - Variant31830, - Variant31831, - Variant31832, - Variant31833, - Variant31834, - Variant31835, - Variant31836, - Variant31837, - Variant31838, - Variant31839, - Variant31840, - Variant31841, - Variant31842, - Variant31843, - Variant31844, - Variant31845, - Variant31846, - Variant31847, - Variant31848, - Variant31849, - Variant31850, - Variant31851, - Variant31852, - Variant31853, - Variant31854, - Variant31855, - Variant31856, - Variant31857, - Variant31858, - Variant31859, - Variant31860, - Variant31861, - Variant31862, - Variant31863, - Variant31864, - Variant31865, - Variant31866, - Variant31867, - Variant31868, - Variant31869, - Variant31870, - Variant31871, - Variant31872, - Variant31873, - Variant31874, - Variant31875, - Variant31876, - Variant31877, - Variant31878, - Variant31879, - Variant31880, - Variant31881, - Variant31882, - Variant31883, - Variant31884, - Variant31885, - Variant31886, - Variant31887, - Variant31888, - Variant31889, - Variant31890, - Variant31891, - Variant31892, - Variant31893, - Variant31894, - Variant31895, - Variant31896, - Variant31897, - Variant31898, - Variant31899, - Variant31900, - Variant31901, - Variant31902, - Variant31903, - Variant31904, - Variant31905, - Variant31906, - Variant31907, - Variant31908, - Variant31909, - Variant31910, - Variant31911, - Variant31912, - Variant31913, - Variant31914, - Variant31915, - Variant31916, - Variant31917, - Variant31918, - Variant31919, - Variant31920, - Variant31921, - Variant31922, - Variant31923, - Variant31924, - Variant31925, - Variant31926, - Variant31927, - Variant31928, - Variant31929, - Variant31930, - Variant31931, - Variant31932, - Variant31933, - Variant31934, - Variant31935, - Variant31936, - Variant31937, - Variant31938, - Variant31939, - Variant31940, - Variant31941, - Variant31942, - Variant31943, - Variant31944, - Variant31945, - Variant31946, - Variant31947, - Variant31948, - Variant31949, - Variant31950, - Variant31951, - Variant31952, - Variant31953, - Variant31954, - Variant31955, - Variant31956, - Variant31957, - Variant31958, - Variant31959, - Variant31960, - Variant31961, - Variant31962, - Variant31963, - Variant31964, - Variant31965, - Variant31966, - Variant31967, - Variant31968, - Variant31969, - Variant31970, - Variant31971, - Variant31972, - Variant31973, - Variant31974, - Variant31975, - Variant31976, - Variant31977, - Variant31978, - Variant31979, - Variant31980, - Variant31981, - Variant31982, - Variant31983, - Variant31984, - Variant31985, - Variant31986, - Variant31987, - Variant31988, - Variant31989, - Variant31990, - Variant31991, - Variant31992, - Variant31993, - Variant31994, - Variant31995, - Variant31996, - Variant31997, - Variant31998, - Variant31999, - Variant32000, - Variant32001, - Variant32002, - Variant32003, - Variant32004, - Variant32005, - Variant32006, - Variant32007, - Variant32008, - Variant32009, - Variant32010, - Variant32011, - Variant32012, - Variant32013, - Variant32014, - Variant32015, - Variant32016, - Variant32017, - Variant32018, - Variant32019, - Variant32020, - Variant32021, - Variant32022, - Variant32023, - Variant32024, - Variant32025, - Variant32026, - Variant32027, - Variant32028, - Variant32029, - Variant32030, - Variant32031, - Variant32032, - Variant32033, - Variant32034, - Variant32035, - Variant32036, - Variant32037, - Variant32038, - Variant32039, - Variant32040, - Variant32041, - Variant32042, - Variant32043, - Variant32044, - Variant32045, - Variant32046, - Variant32047, - Variant32048, - Variant32049, - Variant32050, - Variant32051, - Variant32052, - Variant32053, - Variant32054, - Variant32055, - Variant32056, - Variant32057, - Variant32058, - Variant32059, - Variant32060, - Variant32061, - Variant32062, - Variant32063, - Variant32064, - Variant32065, - Variant32066, - Variant32067, - Variant32068, - Variant32069, - Variant32070, - Variant32071, - Variant32072, - Variant32073, - Variant32074, - Variant32075, - Variant32076, - Variant32077, - Variant32078, - Variant32079, - Variant32080, - Variant32081, - Variant32082, - Variant32083, - Variant32084, - Variant32085, - Variant32086, - Variant32087, - Variant32088, - Variant32089, - Variant32090, - Variant32091, - Variant32092, - Variant32093, - Variant32094, - Variant32095, - Variant32096, - Variant32097, - Variant32098, - Variant32099, - Variant32100, - Variant32101, - Variant32102, - Variant32103, - Variant32104, - Variant32105, - Variant32106, - Variant32107, - Variant32108, - Variant32109, - Variant32110, - Variant32111, - Variant32112, - Variant32113, - Variant32114, - Variant32115, - Variant32116, - Variant32117, - Variant32118, - Variant32119, - Variant32120, - Variant32121, - Variant32122, - Variant32123, - Variant32124, - Variant32125, - Variant32126, - Variant32127, - Variant32128, - Variant32129, - Variant32130, - Variant32131, - Variant32132, - Variant32133, - Variant32134, - Variant32135, - Variant32136, - Variant32137, - Variant32138, - Variant32139, - Variant32140, - Variant32141, - Variant32142, - Variant32143, - Variant32144, - Variant32145, - Variant32146, - Variant32147, - Variant32148, - Variant32149, - Variant32150, - Variant32151, - Variant32152, - Variant32153, - Variant32154, - Variant32155, - Variant32156, - Variant32157, - Variant32158, - Variant32159, - Variant32160, - Variant32161, - Variant32162, - Variant32163, - Variant32164, - Variant32165, - Variant32166, - Variant32167, - Variant32168, - Variant32169, - Variant32170, - Variant32171, - Variant32172, - Variant32173, - Variant32174, - Variant32175, - Variant32176, - Variant32177, - Variant32178, - Variant32179, - Variant32180, - Variant32181, - Variant32182, - Variant32183, - Variant32184, - Variant32185, - Variant32186, - Variant32187, - Variant32188, - Variant32189, - Variant32190, - Variant32191, - Variant32192, - Variant32193, - Variant32194, - Variant32195, - Variant32196, - Variant32197, - Variant32198, - Variant32199, - Variant32200, - Variant32201, - Variant32202, - Variant32203, - Variant32204, - Variant32205, - Variant32206, - Variant32207, - Variant32208, - Variant32209, - Variant32210, - Variant32211, - Variant32212, - Variant32213, - Variant32214, - Variant32215, - Variant32216, - Variant32217, - Variant32218, - Variant32219, - Variant32220, - Variant32221, - Variant32222, - Variant32223, - Variant32224, - Variant32225, - Variant32226, - Variant32227, - Variant32228, - Variant32229, - Variant32230, - Variant32231, - Variant32232, - Variant32233, - Variant32234, - Variant32235, - Variant32236, - Variant32237, - Variant32238, - Variant32239, - Variant32240, - Variant32241, - Variant32242, - Variant32243, - Variant32244, - Variant32245, - Variant32246, - Variant32247, - Variant32248, - Variant32249, - Variant32250, - Variant32251, - Variant32252, - Variant32253, - Variant32254, - Variant32255, - Variant32256, - Variant32257, - Variant32258, - Variant32259, - Variant32260, - Variant32261, - Variant32262, - Variant32263, - Variant32264, - Variant32265, - Variant32266, - Variant32267, - Variant32268, - Variant32269, - Variant32270, - Variant32271, - Variant32272, - Variant32273, - Variant32274, - Variant32275, - Variant32276, - Variant32277, - Variant32278, - Variant32279, - Variant32280, - Variant32281, - Variant32282, - Variant32283, - Variant32284, - Variant32285, - Variant32286, - Variant32287, - Variant32288, - Variant32289, - Variant32290, - Variant32291, - Variant32292, - Variant32293, - Variant32294, - Variant32295, - Variant32296, - Variant32297, - Variant32298, - Variant32299, - Variant32300, - Variant32301, - Variant32302, - Variant32303, - Variant32304, - Variant32305, - Variant32306, - Variant32307, - Variant32308, - Variant32309, - Variant32310, - Variant32311, - Variant32312, - Variant32313, - Variant32314, - Variant32315, - Variant32316, - Variant32317, - Variant32318, - Variant32319, - Variant32320, - Variant32321, - Variant32322, - Variant32323, - Variant32324, - Variant32325, - Variant32326, - Variant32327, - Variant32328, - Variant32329, - Variant32330, - Variant32331, - Variant32332, - Variant32333, - Variant32334, - Variant32335, - Variant32336, - Variant32337, - Variant32338, - Variant32339, - Variant32340, - Variant32341, - Variant32342, - Variant32343, - Variant32344, - Variant32345, - Variant32346, - Variant32347, - Variant32348, - Variant32349, - Variant32350, - Variant32351, - Variant32352, - Variant32353, - Variant32354, - Variant32355, - Variant32356, - Variant32357, - Variant32358, - Variant32359, - Variant32360, - Variant32361, - Variant32362, - Variant32363, - Variant32364, - Variant32365, - Variant32366, - Variant32367, - Variant32368, - Variant32369, - Variant32370, - Variant32371, - Variant32372, - Variant32373, - Variant32374, - Variant32375, - Variant32376, - Variant32377, - Variant32378, - Variant32379, - Variant32380, - Variant32381, - Variant32382, - Variant32383, - Variant32384, - Variant32385, - Variant32386, - Variant32387, - Variant32388, - Variant32389, - Variant32390, - Variant32391, - Variant32392, - Variant32393, - Variant32394, - Variant32395, - Variant32396, - Variant32397, - Variant32398, - Variant32399, - Variant32400, - Variant32401, - Variant32402, - Variant32403, - Variant32404, - Variant32405, - Variant32406, - Variant32407, - Variant32408, - Variant32409, - Variant32410, - Variant32411, - Variant32412, - Variant32413, - Variant32414, - Variant32415, - Variant32416, - Variant32417, - Variant32418, - Variant32419, - Variant32420, - Variant32421, - Variant32422, - Variant32423, - Variant32424, - Variant32425, - Variant32426, - Variant32427, - Variant32428, - Variant32429, - Variant32430, - Variant32431, - Variant32432, - Variant32433, - Variant32434, - Variant32435, - Variant32436, - Variant32437, - Variant32438, - Variant32439, - Variant32440, - Variant32441, - Variant32442, - Variant32443, - Variant32444, - Variant32445, - Variant32446, - Variant32447, - Variant32448, - Variant32449, - Variant32450, - Variant32451, - Variant32452, - Variant32453, - Variant32454, - Variant32455, - Variant32456, - Variant32457, - Variant32458, - Variant32459, - Variant32460, - Variant32461, - Variant32462, - Variant32463, - Variant32464, - Variant32465, - Variant32466, - Variant32467, - Variant32468, - Variant32469, - Variant32470, - Variant32471, - Variant32472, - Variant32473, - Variant32474, - Variant32475, - Variant32476, - Variant32477, - Variant32478, - Variant32479, - Variant32480, - Variant32481, - Variant32482, - Variant32483, - Variant32484, - Variant32485, - Variant32486, - Variant32487, - Variant32488, - Variant32489, - Variant32490, - Variant32491, - Variant32492, - Variant32493, - Variant32494, - Variant32495, - Variant32496, - Variant32497, - Variant32498, - Variant32499, - Variant32500, - Variant32501, - Variant32502, - Variant32503, - Variant32504, - Variant32505, - Variant32506, - Variant32507, - Variant32508, - Variant32509, - Variant32510, - Variant32511, - Variant32512, - Variant32513, - Variant32514, - Variant32515, - Variant32516, - Variant32517, - Variant32518, - Variant32519, - Variant32520, - Variant32521, - Variant32522, - Variant32523, - Variant32524, - Variant32525, - Variant32526, - Variant32527, - Variant32528, - Variant32529, - Variant32530, - Variant32531, - Variant32532, - Variant32533, - Variant32534, - Variant32535, - Variant32536, - Variant32537, - Variant32538, - Variant32539, - Variant32540, - Variant32541, - Variant32542, - Variant32543, - Variant32544, - Variant32545, - Variant32546, - Variant32547, - Variant32548, - Variant32549, - Variant32550, - Variant32551, - Variant32552, - Variant32553, - Variant32554, - Variant32555, - Variant32556, - Variant32557, - Variant32558, - Variant32559, - Variant32560, - Variant32561, - Variant32562, - Variant32563, - Variant32564, - Variant32565, - Variant32566, - Variant32567, - Variant32568, - Variant32569, - Variant32570, - Variant32571, - Variant32572, - Variant32573, - Variant32574, - Variant32575, - Variant32576, - Variant32577, - Variant32578, - Variant32579, - Variant32580, - Variant32581, - Variant32582, - Variant32583, - Variant32584, - Variant32585, - Variant32586, - Variant32587, - Variant32588, - Variant32589, - Variant32590, - Variant32591, - Variant32592, - Variant32593, - Variant32594, - Variant32595, - Variant32596, - Variant32597, - Variant32598, - Variant32599, - Variant32600, - Variant32601, - Variant32602, - Variant32603, - Variant32604, - Variant32605, - Variant32606, - Variant32607, - Variant32608, - Variant32609, - Variant32610, - Variant32611, - Variant32612, - Variant32613, - Variant32614, - Variant32615, - Variant32616, - Variant32617, - Variant32618, - Variant32619, - Variant32620, - Variant32621, - Variant32622, - Variant32623, - Variant32624, - Variant32625, - Variant32626, - Variant32627, - Variant32628, - Variant32629, - Variant32630, - Variant32631, - Variant32632, - Variant32633, - Variant32634, - Variant32635, - Variant32636, - Variant32637, - Variant32638, - Variant32639, - Variant32640, - Variant32641, - Variant32642, - Variant32643, - Variant32644, - Variant32645, - Variant32646, - Variant32647, - Variant32648, - Variant32649, - Variant32650, - Variant32651, - Variant32652, - Variant32653, - Variant32654, - Variant32655, - Variant32656, - Variant32657, - Variant32658, - Variant32659, - Variant32660, - Variant32661, - Variant32662, - Variant32663, - Variant32664, - Variant32665, - Variant32666, - Variant32667, - Variant32668, - Variant32669, - Variant32670, - Variant32671, - Variant32672, - Variant32673, - Variant32674, - Variant32675, - Variant32676, - Variant32677, - Variant32678, - Variant32679, - Variant32680, - Variant32681, - Variant32682, - Variant32683, - Variant32684, - Variant32685, - Variant32686, - Variant32687, - Variant32688, - Variant32689, - Variant32690, - Variant32691, - Variant32692, - Variant32693, - Variant32694, - Variant32695, - Variant32696, - Variant32697, - Variant32698, - Variant32699, - Variant32700, - Variant32701, - Variant32702, - Variant32703, - Variant32704, - Variant32705, - Variant32706, - Variant32707, - Variant32708, - Variant32709, - Variant32710, - Variant32711, - Variant32712, - Variant32713, - Variant32714, - Variant32715, - Variant32716, - Variant32717, - Variant32718, - Variant32719, - Variant32720, - Variant32721, - Variant32722, - Variant32723, - Variant32724, - Variant32725, - Variant32726, - Variant32727, - Variant32728, - Variant32729, - Variant32730, - Variant32731, - Variant32732, - Variant32733, - Variant32734, - Variant32735, - Variant32736, - Variant32737, - Variant32738, - Variant32739, - Variant32740, - Variant32741, - Variant32742, - Variant32743, - Variant32744, - Variant32745, - Variant32746, - Variant32747, - Variant32748, - Variant32749, - Variant32750, - Variant32751, - Variant32752, - Variant32753, - Variant32754, - Variant32755, - Variant32756, - Variant32757, - Variant32758, - Variant32759, - Variant32760, - Variant32761, - Variant32762, - Variant32763, - Variant32764, - Variant32765, - Variant32766, - Variant32767, - Variant32768, - Variant32769, - Variant32770, - Variant32771, - Variant32772, - Variant32773, - Variant32774, - Variant32775, - Variant32776, - Variant32777, - Variant32778, - Variant32779, - Variant32780, - Variant32781, - Variant32782, - Variant32783, - Variant32784, - Variant32785, - Variant32786, - Variant32787, - Variant32788, - Variant32789, - Variant32790, - Variant32791, - Variant32792, - Variant32793, - Variant32794, - Variant32795, - Variant32796, - Variant32797, - Variant32798, - Variant32799, - Variant32800, - Variant32801, - Variant32802, - Variant32803, - Variant32804, - Variant32805, - Variant32806, - Variant32807, - Variant32808, - Variant32809, - Variant32810, - Variant32811, - Variant32812, - Variant32813, - Variant32814, - Variant32815, - Variant32816, - Variant32817, - Variant32818, - Variant32819, - Variant32820, - Variant32821, - Variant32822, - Variant32823, - Variant32824, - Variant32825, - Variant32826, - Variant32827, - Variant32828, - Variant32829, - Variant32830, - Variant32831, - Variant32832, - Variant32833, - Variant32834, - Variant32835, - Variant32836, - Variant32837, - Variant32838, - Variant32839, - Variant32840, - Variant32841, - Variant32842, - Variant32843, - Variant32844, - Variant32845, - Variant32846, - Variant32847, - Variant32848, - Variant32849, - Variant32850, - Variant32851, - Variant32852, - Variant32853, - Variant32854, - Variant32855, - Variant32856, - Variant32857, - Variant32858, - Variant32859, - Variant32860, - Variant32861, - Variant32862, - Variant32863, - Variant32864, - Variant32865, - Variant32866, - Variant32867, - Variant32868, - Variant32869, - Variant32870, - Variant32871, - Variant32872, - Variant32873, - Variant32874, - Variant32875, - Variant32876, - Variant32877, - Variant32878, - Variant32879, - Variant32880, - Variant32881, - Variant32882, - Variant32883, - Variant32884, - Variant32885, - Variant32886, - Variant32887, - Variant32888, - Variant32889, - Variant32890, - Variant32891, - Variant32892, - Variant32893, - Variant32894, - Variant32895, - Variant32896, - Variant32897, - Variant32898, - Variant32899, - Variant32900, - Variant32901, - Variant32902, - Variant32903, - Variant32904, - Variant32905, - Variant32906, - Variant32907, - Variant32908, - Variant32909, - Variant32910, - Variant32911, - Variant32912, - Variant32913, - Variant32914, - Variant32915, - Variant32916, - Variant32917, - Variant32918, - Variant32919, - Variant32920, - Variant32921, - Variant32922, - Variant32923, - Variant32924, - Variant32925, - Variant32926, - Variant32927, - Variant32928, - Variant32929, - Variant32930, - Variant32931, - Variant32932, - Variant32933, - Variant32934, - Variant32935, - Variant32936, - Variant32937, - Variant32938, - Variant32939, - Variant32940, - Variant32941, - Variant32942, - Variant32943, - Variant32944, - Variant32945, - Variant32946, - Variant32947, - Variant32948, - Variant32949, - Variant32950, - Variant32951, - Variant32952, - Variant32953, - Variant32954, - Variant32955, - Variant32956, - Variant32957, - Variant32958, - Variant32959, - Variant32960, - Variant32961, - Variant32962, - Variant32963, - Variant32964, - Variant32965, - Variant32966, - Variant32967, - Variant32968, - Variant32969, - Variant32970, - Variant32971, - Variant32972, - Variant32973, - Variant32974, - Variant32975, - Variant32976, - Variant32977, - Variant32978, - Variant32979, - Variant32980, - Variant32981, - Variant32982, - Variant32983, - Variant32984, - Variant32985, - Variant32986, - Variant32987, - Variant32988, - Variant32989, - Variant32990, - Variant32991, - Variant32992, - Variant32993, - Variant32994, - Variant32995, - Variant32996, - Variant32997, - Variant32998, - Variant32999, - Variant33000, - Variant33001, - Variant33002, - Variant33003, - Variant33004, - Variant33005, - Variant33006, - Variant33007, - Variant33008, - Variant33009, - Variant33010, - Variant33011, - Variant33012, - Variant33013, - Variant33014, - Variant33015, - Variant33016, - Variant33017, - Variant33018, - Variant33019, - Variant33020, - Variant33021, - Variant33022, - Variant33023, - Variant33024, - Variant33025, - Variant33026, - Variant33027, - Variant33028, - Variant33029, - Variant33030, - Variant33031, - Variant33032, - Variant33033, - Variant33034, - Variant33035, - Variant33036, - Variant33037, - Variant33038, - Variant33039, - Variant33040, - Variant33041, - Variant33042, - Variant33043, - Variant33044, - Variant33045, - Variant33046, - Variant33047, - Variant33048, - Variant33049, - Variant33050, - Variant33051, - Variant33052, - Variant33053, - Variant33054, - Variant33055, - Variant33056, - Variant33057, - Variant33058, - Variant33059, - Variant33060, - Variant33061, - Variant33062, - Variant33063, - Variant33064, - Variant33065, - Variant33066, - Variant33067, - Variant33068, - Variant33069, - Variant33070, - Variant33071, - Variant33072, - Variant33073, - Variant33074, - Variant33075, - Variant33076, - Variant33077, - Variant33078, - Variant33079, - Variant33080, - Variant33081, - Variant33082, - Variant33083, - Variant33084, - Variant33085, - Variant33086, - Variant33087, - Variant33088, - Variant33089, - Variant33090, - Variant33091, - Variant33092, - Variant33093, - Variant33094, - Variant33095, - Variant33096, - Variant33097, - Variant33098, - Variant33099, - Variant33100, - Variant33101, - Variant33102, - Variant33103, - Variant33104, - Variant33105, - Variant33106, - Variant33107, - Variant33108, - Variant33109, - Variant33110, - Variant33111, - Variant33112, - Variant33113, - Variant33114, - Variant33115, - Variant33116, - Variant33117, - Variant33118, - Variant33119, - Variant33120, - Variant33121, - Variant33122, - Variant33123, - Variant33124, - Variant33125, - Variant33126, - Variant33127, - Variant33128, - Variant33129, - Variant33130, - Variant33131, - Variant33132, - Variant33133, - Variant33134, - Variant33135, - Variant33136, - Variant33137, - Variant33138, - Variant33139, - Variant33140, - Variant33141, - Variant33142, - Variant33143, - Variant33144, - Variant33145, - Variant33146, - Variant33147, - Variant33148, - Variant33149, - Variant33150, - Variant33151, - Variant33152, - Variant33153, - Variant33154, - Variant33155, - Variant33156, - Variant33157, - Variant33158, - Variant33159, - Variant33160, - Variant33161, - Variant33162, - Variant33163, - Variant33164, - Variant33165, - Variant33166, - Variant33167, - Variant33168, - Variant33169, - Variant33170, - Variant33171, - Variant33172, - Variant33173, - Variant33174, - Variant33175, - Variant33176, - Variant33177, - Variant33178, - Variant33179, - Variant33180, - Variant33181, - Variant33182, - Variant33183, - Variant33184, - Variant33185, - Variant33186, - Variant33187, - Variant33188, - Variant33189, - Variant33190, - Variant33191, - Variant33192, - Variant33193, - Variant33194, - Variant33195, - Variant33196, - Variant33197, - Variant33198, - Variant33199, - Variant33200, - Variant33201, - Variant33202, - Variant33203, - Variant33204, - Variant33205, - Variant33206, - Variant33207, - Variant33208, - Variant33209, - Variant33210, - Variant33211, - Variant33212, - Variant33213, - Variant33214, - Variant33215, - Variant33216, - Variant33217, - Variant33218, - Variant33219, - Variant33220, - Variant33221, - Variant33222, - Variant33223, - Variant33224, - Variant33225, - Variant33226, - Variant33227, - Variant33228, - Variant33229, - Variant33230, - Variant33231, - Variant33232, - Variant33233, - Variant33234, - Variant33235, - Variant33236, - Variant33237, - Variant33238, - Variant33239, - Variant33240, - Variant33241, - Variant33242, - Variant33243, - Variant33244, - Variant33245, - Variant33246, - Variant33247, - Variant33248, - Variant33249, - Variant33250, - Variant33251, - Variant33252, - Variant33253, - Variant33254, - Variant33255, - Variant33256, - Variant33257, - Variant33258, - Variant33259, - Variant33260, - Variant33261, - Variant33262, - Variant33263, - Variant33264, - Variant33265, - Variant33266, - Variant33267, - Variant33268, - Variant33269, - Variant33270, - Variant33271, - Variant33272, - Variant33273, - Variant33274, - Variant33275, - Variant33276, - Variant33277, - Variant33278, - Variant33279, - Variant33280, - Variant33281, - Variant33282, - Variant33283, - Variant33284, - Variant33285, - Variant33286, - Variant33287, - Variant33288, - Variant33289, - Variant33290, - Variant33291, - Variant33292, - Variant33293, - Variant33294, - Variant33295, - Variant33296, - Variant33297, - Variant33298, - Variant33299, - Variant33300, - Variant33301, - Variant33302, - Variant33303, - Variant33304, - Variant33305, - Variant33306, - Variant33307, - Variant33308, - Variant33309, - Variant33310, - Variant33311, - Variant33312, - Variant33313, - Variant33314, - Variant33315, - Variant33316, - Variant33317, - Variant33318, - Variant33319, - Variant33320, - Variant33321, - Variant33322, - Variant33323, - Variant33324, - Variant33325, - Variant33326, - Variant33327, - Variant33328, - Variant33329, - Variant33330, - Variant33331, - Variant33332, - Variant33333, - Variant33334, - Variant33335, - Variant33336, - Variant33337, - Variant33338, - Variant33339, - Variant33340, - Variant33341, - Variant33342, - Variant33343, - Variant33344, - Variant33345, - Variant33346, - Variant33347, - Variant33348, - Variant33349, - Variant33350, - Variant33351, - Variant33352, - Variant33353, - Variant33354, - Variant33355, - Variant33356, - Variant33357, - Variant33358, - Variant33359, - Variant33360, - Variant33361, - Variant33362, - Variant33363, - Variant33364, - Variant33365, - Variant33366, - Variant33367, - Variant33368, - Variant33369, - Variant33370, - Variant33371, - Variant33372, - Variant33373, - Variant33374, - Variant33375, - Variant33376, - Variant33377, - Variant33378, - Variant33379, - Variant33380, - Variant33381, - Variant33382, - Variant33383, - Variant33384, - Variant33385, - Variant33386, - Variant33387, - Variant33388, - Variant33389, - Variant33390, - Variant33391, - Variant33392, - Variant33393, - Variant33394, - Variant33395, - Variant33396, - Variant33397, - Variant33398, - Variant33399, - Variant33400, - Variant33401, - Variant33402, - Variant33403, - Variant33404, - Variant33405, - Variant33406, - Variant33407, - Variant33408, - Variant33409, - Variant33410, - Variant33411, - Variant33412, - Variant33413, - Variant33414, - Variant33415, - Variant33416, - Variant33417, - Variant33418, - Variant33419, - Variant33420, - Variant33421, - Variant33422, - Variant33423, - Variant33424, - Variant33425, - Variant33426, - Variant33427, - Variant33428, - Variant33429, - Variant33430, - Variant33431, - Variant33432, - Variant33433, - Variant33434, - Variant33435, - Variant33436, - Variant33437, - Variant33438, - Variant33439, - Variant33440, - Variant33441, - Variant33442, - Variant33443, - Variant33444, - Variant33445, - Variant33446, - Variant33447, - Variant33448, - Variant33449, - Variant33450, - Variant33451, - Variant33452, - Variant33453, - Variant33454, - Variant33455, - Variant33456, - Variant33457, - Variant33458, - Variant33459, - Variant33460, - Variant33461, - Variant33462, - Variant33463, - Variant33464, - Variant33465, - Variant33466, - Variant33467, - Variant33468, - Variant33469, - Variant33470, - Variant33471, - Variant33472, - Variant33473, - Variant33474, - Variant33475, - Variant33476, - Variant33477, - Variant33478, - Variant33479, - Variant33480, - Variant33481, - Variant33482, - Variant33483, - Variant33484, - Variant33485, - Variant33486, - Variant33487, - Variant33488, - Variant33489, - Variant33490, - Variant33491, - Variant33492, - Variant33493, - Variant33494, - Variant33495, - Variant33496, - Variant33497, - Variant33498, - Variant33499, - Variant33500, - Variant33501, - Variant33502, - Variant33503, - Variant33504, - Variant33505, - Variant33506, - Variant33507, - Variant33508, - Variant33509, - Variant33510, - Variant33511, - Variant33512, - Variant33513, - Variant33514, - Variant33515, - Variant33516, - Variant33517, - Variant33518, - Variant33519, - Variant33520, - Variant33521, - Variant33522, - Variant33523, - Variant33524, - Variant33525, - Variant33526, - Variant33527, - Variant33528, - Variant33529, - Variant33530, - Variant33531, - Variant33532, - Variant33533, - Variant33534, - Variant33535, - Variant33536, - Variant33537, - Variant33538, - Variant33539, - Variant33540, - Variant33541, - Variant33542, - Variant33543, - Variant33544, - Variant33545, - Variant33546, - Variant33547, - Variant33548, - Variant33549, - Variant33550, - Variant33551, - Variant33552, - Variant33553, - Variant33554, - Variant33555, - Variant33556, - Variant33557, - Variant33558, - Variant33559, - Variant33560, - Variant33561, - Variant33562, - Variant33563, - Variant33564, - Variant33565, - Variant33566, - Variant33567, - Variant33568, - Variant33569, - Variant33570, - Variant33571, - Variant33572, - Variant33573, - Variant33574, - Variant33575, - Variant33576, - Variant33577, - Variant33578, - Variant33579, - Variant33580, - Variant33581, - Variant33582, - Variant33583, - Variant33584, - Variant33585, - Variant33586, - Variant33587, - Variant33588, - Variant33589, - Variant33590, - Variant33591, - Variant33592, - Variant33593, - Variant33594, - Variant33595, - Variant33596, - Variant33597, - Variant33598, - Variant33599, - Variant33600, - Variant33601, - Variant33602, - Variant33603, - Variant33604, - Variant33605, - Variant33606, - Variant33607, - Variant33608, - Variant33609, - Variant33610, - Variant33611, - Variant33612, - Variant33613, - Variant33614, - Variant33615, - Variant33616, - Variant33617, - Variant33618, - Variant33619, - Variant33620, - Variant33621, - Variant33622, - Variant33623, - Variant33624, - Variant33625, - Variant33626, - Variant33627, - Variant33628, - Variant33629, - Variant33630, - Variant33631, - Variant33632, - Variant33633, - Variant33634, - Variant33635, - Variant33636, - Variant33637, - Variant33638, - Variant33639, - Variant33640, - Variant33641, - Variant33642, - Variant33643, - Variant33644, - Variant33645, - Variant33646, - Variant33647, - Variant33648, - Variant33649, - Variant33650, - Variant33651, - Variant33652, - Variant33653, - Variant33654, - Variant33655, - Variant33656, - Variant33657, - Variant33658, - Variant33659, - Variant33660, - Variant33661, - Variant33662, - Variant33663, - Variant33664, - Variant33665, - Variant33666, - Variant33667, - Variant33668, - Variant33669, - Variant33670, - Variant33671, - Variant33672, - Variant33673, - Variant33674, - Variant33675, - Variant33676, - Variant33677, - Variant33678, - Variant33679, - Variant33680, - Variant33681, - Variant33682, - Variant33683, - Variant33684, - Variant33685, - Variant33686, - Variant33687, - Variant33688, - Variant33689, - Variant33690, - Variant33691, - Variant33692, - Variant33693, - Variant33694, - Variant33695, - Variant33696, - Variant33697, - Variant33698, - Variant33699, - Variant33700, - Variant33701, - Variant33702, - Variant33703, - Variant33704, - Variant33705, - Variant33706, - Variant33707, - Variant33708, - Variant33709, - Variant33710, - Variant33711, - Variant33712, - Variant33713, - Variant33714, - Variant33715, - Variant33716, - Variant33717, - Variant33718, - Variant33719, - Variant33720, - Variant33721, - Variant33722, - Variant33723, - Variant33724, - Variant33725, - Variant33726, - Variant33727, - Variant33728, - Variant33729, - Variant33730, - Variant33731, - Variant33732, - Variant33733, - Variant33734, - Variant33735, - Variant33736, - Variant33737, - Variant33738, - Variant33739, - Variant33740, - Variant33741, - Variant33742, - Variant33743, - Variant33744, - Variant33745, - Variant33746, - Variant33747, - Variant33748, - Variant33749, - Variant33750, - Variant33751, - Variant33752, - Variant33753, - Variant33754, - Variant33755, - Variant33756, - Variant33757, - Variant33758, - Variant33759, - Variant33760, - Variant33761, - Variant33762, - Variant33763, - Variant33764, - Variant33765, - Variant33766, - Variant33767, - Variant33768, - Variant33769, - Variant33770, - Variant33771, - Variant33772, - Variant33773, - Variant33774, - Variant33775, - Variant33776, - Variant33777, - Variant33778, - Variant33779, - Variant33780, - Variant33781, - Variant33782, - Variant33783, - Variant33784, - Variant33785, - Variant33786, - Variant33787, - Variant33788, - Variant33789, - Variant33790, - Variant33791, - Variant33792, - Variant33793, - Variant33794, - Variant33795, - Variant33796, - Variant33797, - Variant33798, - Variant33799, - Variant33800, - Variant33801, - Variant33802, - Variant33803, - Variant33804, - Variant33805, - Variant33806, - Variant33807, - Variant33808, - Variant33809, - Variant33810, - Variant33811, - Variant33812, - Variant33813, - Variant33814, - Variant33815, - Variant33816, - Variant33817, - Variant33818, - Variant33819, - Variant33820, - Variant33821, - Variant33822, - Variant33823, - Variant33824, - Variant33825, - Variant33826, - Variant33827, - Variant33828, - Variant33829, - Variant33830, - Variant33831, - Variant33832, - Variant33833, - Variant33834, - Variant33835, - Variant33836, - Variant33837, - Variant33838, - Variant33839, - Variant33840, - Variant33841, - Variant33842, - Variant33843, - Variant33844, - Variant33845, - Variant33846, - Variant33847, - Variant33848, - Variant33849, - Variant33850, - Variant33851, - Variant33852, - Variant33853, - Variant33854, - Variant33855, - Variant33856, - Variant33857, - Variant33858, - Variant33859, - Variant33860, - Variant33861, - Variant33862, - Variant33863, - Variant33864, - Variant33865, - Variant33866, - Variant33867, - Variant33868, - Variant33869, - Variant33870, - Variant33871, - Variant33872, - Variant33873, - Variant33874, - Variant33875, - Variant33876, - Variant33877, - Variant33878, - Variant33879, - Variant33880, - Variant33881, - Variant33882, - Variant33883, - Variant33884, - Variant33885, - Variant33886, - Variant33887, - Variant33888, - Variant33889, - Variant33890, - Variant33891, - Variant33892, - Variant33893, - Variant33894, - Variant33895, - Variant33896, - Variant33897, - Variant33898, - Variant33899, - Variant33900, - Variant33901, - Variant33902, - Variant33903, - Variant33904, - Variant33905, - Variant33906, - Variant33907, - Variant33908, - Variant33909, - Variant33910, - Variant33911, - Variant33912, - Variant33913, - Variant33914, - Variant33915, - Variant33916, - Variant33917, - Variant33918, - Variant33919, - Variant33920, - Variant33921, - Variant33922, - Variant33923, - Variant33924, - Variant33925, - Variant33926, - Variant33927, - Variant33928, - Variant33929, - Variant33930, - Variant33931, - Variant33932, - Variant33933, - Variant33934, - Variant33935, - Variant33936, - Variant33937, - Variant33938, - Variant33939, - Variant33940, - Variant33941, - Variant33942, - Variant33943, - Variant33944, - Variant33945, - Variant33946, - Variant33947, - Variant33948, - Variant33949, - Variant33950, - Variant33951, - Variant33952, - Variant33953, - Variant33954, - Variant33955, - Variant33956, - Variant33957, - Variant33958, - Variant33959, - Variant33960, - Variant33961, - Variant33962, - Variant33963, - Variant33964, - Variant33965, - Variant33966, - Variant33967, - Variant33968, - Variant33969, - Variant33970, - Variant33971, - Variant33972, - Variant33973, - Variant33974, - Variant33975, - Variant33976, - Variant33977, - Variant33978, - Variant33979, - Variant33980, - Variant33981, - Variant33982, - Variant33983, - Variant33984, - Variant33985, - Variant33986, - Variant33987, - Variant33988, - Variant33989, - Variant33990, - Variant33991, - Variant33992, - Variant33993, - Variant33994, - Variant33995, - Variant33996, - Variant33997, - Variant33998, - Variant33999, - Variant34000, - Variant34001, - Variant34002, - Variant34003, - Variant34004, - Variant34005, - Variant34006, - Variant34007, - Variant34008, - Variant34009, - Variant34010, - Variant34011, - Variant34012, - Variant34013, - Variant34014, - Variant34015, - Variant34016, - Variant34017, - Variant34018, - Variant34019, - Variant34020, - Variant34021, - Variant34022, - Variant34023, - Variant34024, - Variant34025, - Variant34026, - Variant34027, - Variant34028, - Variant34029, - Variant34030, - Variant34031, - Variant34032, - Variant34033, - Variant34034, - Variant34035, - Variant34036, - Variant34037, - Variant34038, - Variant34039, - Variant34040, - Variant34041, - Variant34042, - Variant34043, - Variant34044, - Variant34045, - Variant34046, - Variant34047, - Variant34048, - Variant34049, - Variant34050, - Variant34051, - Variant34052, - Variant34053, - Variant34054, - Variant34055, - Variant34056, - Variant34057, - Variant34058, - Variant34059, - Variant34060, - Variant34061, - Variant34062, - Variant34063, - Variant34064, - Variant34065, - Variant34066, - Variant34067, - Variant34068, - Variant34069, - Variant34070, - Variant34071, - Variant34072, - Variant34073, - Variant34074, - Variant34075, - Variant34076, - Variant34077, - Variant34078, - Variant34079, - Variant34080, - Variant34081, - Variant34082, - Variant34083, - Variant34084, - Variant34085, - Variant34086, - Variant34087, - Variant34088, - Variant34089, - Variant34090, - Variant34091, - Variant34092, - Variant34093, - Variant34094, - Variant34095, - Variant34096, - Variant34097, - Variant34098, - Variant34099, - Variant34100, - Variant34101, - Variant34102, - Variant34103, - Variant34104, - Variant34105, - Variant34106, - Variant34107, - Variant34108, - Variant34109, - Variant34110, - Variant34111, - Variant34112, - Variant34113, - Variant34114, - Variant34115, - Variant34116, - Variant34117, - Variant34118, - Variant34119, - Variant34120, - Variant34121, - Variant34122, - Variant34123, - Variant34124, - Variant34125, - Variant34126, - Variant34127, - Variant34128, - Variant34129, - Variant34130, - Variant34131, - Variant34132, - Variant34133, - Variant34134, - Variant34135, - Variant34136, - Variant34137, - Variant34138, - Variant34139, - Variant34140, - Variant34141, - Variant34142, - Variant34143, - Variant34144, - Variant34145, - Variant34146, - Variant34147, - Variant34148, - Variant34149, - Variant34150, - Variant34151, - Variant34152, - Variant34153, - Variant34154, - Variant34155, - Variant34156, - Variant34157, - Variant34158, - Variant34159, - Variant34160, - Variant34161, - Variant34162, - Variant34163, - Variant34164, - Variant34165, - Variant34166, - Variant34167, - Variant34168, - Variant34169, - Variant34170, - Variant34171, - Variant34172, - Variant34173, - Variant34174, - Variant34175, - Variant34176, - Variant34177, - Variant34178, - Variant34179, - Variant34180, - Variant34181, - Variant34182, - Variant34183, - Variant34184, - Variant34185, - Variant34186, - Variant34187, - Variant34188, - Variant34189, - Variant34190, - Variant34191, - Variant34192, - Variant34193, - Variant34194, - Variant34195, - Variant34196, - Variant34197, - Variant34198, - Variant34199, - Variant34200, - Variant34201, - Variant34202, - Variant34203, - Variant34204, - Variant34205, - Variant34206, - Variant34207, - Variant34208, - Variant34209, - Variant34210, - Variant34211, - Variant34212, - Variant34213, - Variant34214, - Variant34215, - Variant34216, - Variant34217, - Variant34218, - Variant34219, - Variant34220, - Variant34221, - Variant34222, - Variant34223, - Variant34224, - Variant34225, - Variant34226, - Variant34227, - Variant34228, - Variant34229, - Variant34230, - Variant34231, - Variant34232, - Variant34233, - Variant34234, - Variant34235, - Variant34236, - Variant34237, - Variant34238, - Variant34239, - Variant34240, - Variant34241, - Variant34242, - Variant34243, - Variant34244, - Variant34245, - Variant34246, - Variant34247, - Variant34248, - Variant34249, - Variant34250, - Variant34251, - Variant34252, - Variant34253, - Variant34254, - Variant34255, - Variant34256, - Variant34257, - Variant34258, - Variant34259, - Variant34260, - Variant34261, - Variant34262, - Variant34263, - Variant34264, - Variant34265, - Variant34266, - Variant34267, - Variant34268, - Variant34269, - Variant34270, - Variant34271, - Variant34272, - Variant34273, - Variant34274, - Variant34275, - Variant34276, - Variant34277, - Variant34278, - Variant34279, - Variant34280, - Variant34281, - Variant34282, - Variant34283, - Variant34284, - Variant34285, - Variant34286, - Variant34287, - Variant34288, - Variant34289, - Variant34290, - Variant34291, - Variant34292, - Variant34293, - Variant34294, - Variant34295, - Variant34296, - Variant34297, - Variant34298, - Variant34299, - Variant34300, - Variant34301, - Variant34302, - Variant34303, - Variant34304, - Variant34305, - Variant34306, - Variant34307, - Variant34308, - Variant34309, - Variant34310, - Variant34311, - Variant34312, - Variant34313, - Variant34314, - Variant34315, - Variant34316, - Variant34317, - Variant34318, - Variant34319, - Variant34320, - Variant34321, - Variant34322, - Variant34323, - Variant34324, - Variant34325, - Variant34326, - Variant34327, - Variant34328, - Variant34329, - Variant34330, - Variant34331, - Variant34332, - Variant34333, - Variant34334, - Variant34335, - Variant34336, - Variant34337, - Variant34338, - Variant34339, - Variant34340, - Variant34341, - Variant34342, - Variant34343, - Variant34344, - Variant34345, - Variant34346, - Variant34347, - Variant34348, - Variant34349, - Variant34350, - Variant34351, - Variant34352, - Variant34353, - Variant34354, - Variant34355, - Variant34356, - Variant34357, - Variant34358, - Variant34359, - Variant34360, - Variant34361, - Variant34362, - Variant34363, - Variant34364, - Variant34365, - Variant34366, - Variant34367, - Variant34368, - Variant34369, - Variant34370, - Variant34371, - Variant34372, - Variant34373, - Variant34374, - Variant34375, - Variant34376, - Variant34377, - Variant34378, - Variant34379, - Variant34380, - Variant34381, - Variant34382, - Variant34383, - Variant34384, - Variant34385, - Variant34386, - Variant34387, - Variant34388, - Variant34389, - Variant34390, - Variant34391, - Variant34392, - Variant34393, - Variant34394, - Variant34395, - Variant34396, - Variant34397, - Variant34398, - Variant34399, - Variant34400, - Variant34401, - Variant34402, - Variant34403, - Variant34404, - Variant34405, - Variant34406, - Variant34407, - Variant34408, - Variant34409, - Variant34410, - Variant34411, - Variant34412, - Variant34413, - Variant34414, - Variant34415, - Variant34416, - Variant34417, - Variant34418, - Variant34419, - Variant34420, - Variant34421, - Variant34422, - Variant34423, - Variant34424, - Variant34425, - Variant34426, - Variant34427, - Variant34428, - Variant34429, - Variant34430, - Variant34431, - Variant34432, - Variant34433, - Variant34434, - Variant34435, - Variant34436, - Variant34437, - Variant34438, - Variant34439, - Variant34440, - Variant34441, - Variant34442, - Variant34443, - Variant34444, - Variant34445, - Variant34446, - Variant34447, - Variant34448, - Variant34449, - Variant34450, - Variant34451, - Variant34452, - Variant34453, - Variant34454, - Variant34455, - Variant34456, - Variant34457, - Variant34458, - Variant34459, - Variant34460, - Variant34461, - Variant34462, - Variant34463, - Variant34464, - Variant34465, - Variant34466, - Variant34467, - Variant34468, - Variant34469, - Variant34470, - Variant34471, - Variant34472, - Variant34473, - Variant34474, - Variant34475, - Variant34476, - Variant34477, - Variant34478, - Variant34479, - Variant34480, - Variant34481, - Variant34482, - Variant34483, - Variant34484, - Variant34485, - Variant34486, - Variant34487, - Variant34488, - Variant34489, - Variant34490, - Variant34491, - Variant34492, - Variant34493, - Variant34494, - Variant34495, - Variant34496, - Variant34497, - Variant34498, - Variant34499, - Variant34500, - Variant34501, - Variant34502, - Variant34503, - Variant34504, - Variant34505, - Variant34506, - Variant34507, - Variant34508, - Variant34509, - Variant34510, - Variant34511, - Variant34512, - Variant34513, - Variant34514, - Variant34515, - Variant34516, - Variant34517, - Variant34518, - Variant34519, - Variant34520, - Variant34521, - Variant34522, - Variant34523, - Variant34524, - Variant34525, - Variant34526, - Variant34527, - Variant34528, - Variant34529, - Variant34530, - Variant34531, - Variant34532, - Variant34533, - Variant34534, - Variant34535, - Variant34536, - Variant34537, - Variant34538, - Variant34539, - Variant34540, - Variant34541, - Variant34542, - Variant34543, - Variant34544, - Variant34545, - Variant34546, - Variant34547, - Variant34548, - Variant34549, - Variant34550, - Variant34551, - Variant34552, - Variant34553, - Variant34554, - Variant34555, - Variant34556, - Variant34557, - Variant34558, - Variant34559, - Variant34560, - Variant34561, - Variant34562, - Variant34563, - Variant34564, - Variant34565, - Variant34566, - Variant34567, - Variant34568, - Variant34569, - Variant34570, - Variant34571, - Variant34572, - Variant34573, - Variant34574, - Variant34575, - Variant34576, - Variant34577, - Variant34578, - Variant34579, - Variant34580, - Variant34581, - Variant34582, - Variant34583, - Variant34584, - Variant34585, - Variant34586, - Variant34587, - Variant34588, - Variant34589, - Variant34590, - Variant34591, - Variant34592, - Variant34593, - Variant34594, - Variant34595, - Variant34596, - Variant34597, - Variant34598, - Variant34599, - Variant34600, - Variant34601, - Variant34602, - Variant34603, - Variant34604, - Variant34605, - Variant34606, - Variant34607, - Variant34608, - Variant34609, - Variant34610, - Variant34611, - Variant34612, - Variant34613, - Variant34614, - Variant34615, - Variant34616, - Variant34617, - Variant34618, - Variant34619, - Variant34620, - Variant34621, - Variant34622, - Variant34623, - Variant34624, - Variant34625, - Variant34626, - Variant34627, - Variant34628, - Variant34629, - Variant34630, - Variant34631, - Variant34632, - Variant34633, - Variant34634, - Variant34635, - Variant34636, - Variant34637, - Variant34638, - Variant34639, - Variant34640, - Variant34641, - Variant34642, - Variant34643, - Variant34644, - Variant34645, - Variant34646, - Variant34647, - Variant34648, - Variant34649, - Variant34650, - Variant34651, - Variant34652, - Variant34653, - Variant34654, - Variant34655, - Variant34656, - Variant34657, - Variant34658, - Variant34659, - Variant34660, - Variant34661, - Variant34662, - Variant34663, - Variant34664, - Variant34665, - Variant34666, - Variant34667, - Variant34668, - Variant34669, - Variant34670, - Variant34671, - Variant34672, - Variant34673, - Variant34674, - Variant34675, - Variant34676, - Variant34677, - Variant34678, - Variant34679, - Variant34680, - Variant34681, - Variant34682, - Variant34683, - Variant34684, - Variant34685, - Variant34686, - Variant34687, - Variant34688, - Variant34689, - Variant34690, - Variant34691, - Variant34692, - Variant34693, - Variant34694, - Variant34695, - Variant34696, - Variant34697, - Variant34698, - Variant34699, - Variant34700, - Variant34701, - Variant34702, - Variant34703, - Variant34704, - Variant34705, - Variant34706, - Variant34707, - Variant34708, - Variant34709, - Variant34710, - Variant34711, - Variant34712, - Variant34713, - Variant34714, - Variant34715, - Variant34716, - Variant34717, - Variant34718, - Variant34719, - Variant34720, - Variant34721, - Variant34722, - Variant34723, - Variant34724, - Variant34725, - Variant34726, - Variant34727, - Variant34728, - Variant34729, - Variant34730, - Variant34731, - Variant34732, - Variant34733, - Variant34734, - Variant34735, - Variant34736, - Variant34737, - Variant34738, - Variant34739, - Variant34740, - Variant34741, - Variant34742, - Variant34743, - Variant34744, - Variant34745, - Variant34746, - Variant34747, - Variant34748, - Variant34749, - Variant34750, - Variant34751, - Variant34752, - Variant34753, - Variant34754, - Variant34755, - Variant34756, - Variant34757, - Variant34758, - Variant34759, - Variant34760, - Variant34761, - Variant34762, - Variant34763, - Variant34764, - Variant34765, - Variant34766, - Variant34767, - Variant34768, - Variant34769, - Variant34770, - Variant34771, - Variant34772, - Variant34773, - Variant34774, - Variant34775, - Variant34776, - Variant34777, - Variant34778, - Variant34779, - Variant34780, - Variant34781, - Variant34782, - Variant34783, - Variant34784, - Variant34785, - Variant34786, - Variant34787, - Variant34788, - Variant34789, - Variant34790, - Variant34791, - Variant34792, - Variant34793, - Variant34794, - Variant34795, - Variant34796, - Variant34797, - Variant34798, - Variant34799, - Variant34800, - Variant34801, - Variant34802, - Variant34803, - Variant34804, - Variant34805, - Variant34806, - Variant34807, - Variant34808, - Variant34809, - Variant34810, - Variant34811, - Variant34812, - Variant34813, - Variant34814, - Variant34815, - Variant34816, - Variant34817, - Variant34818, - Variant34819, - Variant34820, - Variant34821, - Variant34822, - Variant34823, - Variant34824, - Variant34825, - Variant34826, - Variant34827, - Variant34828, - Variant34829, - Variant34830, - Variant34831, - Variant34832, - Variant34833, - Variant34834, - Variant34835, - Variant34836, - Variant34837, - Variant34838, - Variant34839, - Variant34840, - Variant34841, - Variant34842, - Variant34843, - Variant34844, - Variant34845, - Variant34846, - Variant34847, - Variant34848, - Variant34849, - Variant34850, - Variant34851, - Variant34852, - Variant34853, - Variant34854, - Variant34855, - Variant34856, - Variant34857, - Variant34858, - Variant34859, - Variant34860, - Variant34861, - Variant34862, - Variant34863, - Variant34864, - Variant34865, - Variant34866, - Variant34867, - Variant34868, - Variant34869, - Variant34870, - Variant34871, - Variant34872, - Variant34873, - Variant34874, - Variant34875, - Variant34876, - Variant34877, - Variant34878, - Variant34879, - Variant34880, - Variant34881, - Variant34882, - Variant34883, - Variant34884, - Variant34885, - Variant34886, - Variant34887, - Variant34888, - Variant34889, - Variant34890, - Variant34891, - Variant34892, - Variant34893, - Variant34894, - Variant34895, - Variant34896, - Variant34897, - Variant34898, - Variant34899, - Variant34900, - Variant34901, - Variant34902, - Variant34903, - Variant34904, - Variant34905, - Variant34906, - Variant34907, - Variant34908, - Variant34909, - Variant34910, - Variant34911, - Variant34912, - Variant34913, - Variant34914, - Variant34915, - Variant34916, - Variant34917, - Variant34918, - Variant34919, - Variant34920, - Variant34921, - Variant34922, - Variant34923, - Variant34924, - Variant34925, - Variant34926, - Variant34927, - Variant34928, - Variant34929, - Variant34930, - Variant34931, - Variant34932, - Variant34933, - Variant34934, - Variant34935, - Variant34936, - Variant34937, - Variant34938, - Variant34939, - Variant34940, - Variant34941, - Variant34942, - Variant34943, - Variant34944, - Variant34945, - Variant34946, - Variant34947, - Variant34948, - Variant34949, - Variant34950, - Variant34951, - Variant34952, - Variant34953, - Variant34954, - Variant34955, - Variant34956, - Variant34957, - Variant34958, - Variant34959, - Variant34960, - Variant34961, - Variant34962, - Variant34963, - Variant34964, - Variant34965, - Variant34966, - Variant34967, - Variant34968, - Variant34969, - Variant34970, - Variant34971, - Variant34972, - Variant34973, - Variant34974, - Variant34975, - Variant34976, - Variant34977, - Variant34978, - Variant34979, - Variant34980, - Variant34981, - Variant34982, - Variant34983, - Variant34984, - Variant34985, - Variant34986, - Variant34987, - Variant34988, - Variant34989, - Variant34990, - Variant34991, - Variant34992, - Variant34993, - Variant34994, - Variant34995, - Variant34996, - Variant34997, - Variant34998, - Variant34999, - Variant35000, - Variant35001, - Variant35002, - Variant35003, - Variant35004, - Variant35005, - Variant35006, - Variant35007, - Variant35008, - Variant35009, - Variant35010, - Variant35011, - Variant35012, - Variant35013, - Variant35014, - Variant35015, - Variant35016, - Variant35017, - Variant35018, - Variant35019, - Variant35020, - Variant35021, - Variant35022, - Variant35023, - Variant35024, - Variant35025, - Variant35026, - Variant35027, - Variant35028, - Variant35029, - Variant35030, - Variant35031, - Variant35032, - Variant35033, - Variant35034, - Variant35035, - Variant35036, - Variant35037, - Variant35038, - Variant35039, - Variant35040, - Variant35041, - Variant35042, - Variant35043, - Variant35044, - Variant35045, - Variant35046, - Variant35047, - Variant35048, - Variant35049, - Variant35050, - Variant35051, - Variant35052, - Variant35053, - Variant35054, - Variant35055, - Variant35056, - Variant35057, - Variant35058, - Variant35059, - Variant35060, - Variant35061, - Variant35062, - Variant35063, - Variant35064, - Variant35065, - Variant35066, - Variant35067, - Variant35068, - Variant35069, - Variant35070, - Variant35071, - Variant35072, - Variant35073, - Variant35074, - Variant35075, - Variant35076, - Variant35077, - Variant35078, - Variant35079, - Variant35080, - Variant35081, - Variant35082, - Variant35083, - Variant35084, - Variant35085, - Variant35086, - Variant35087, - Variant35088, - Variant35089, - Variant35090, - Variant35091, - Variant35092, - Variant35093, - Variant35094, - Variant35095, - Variant35096, - Variant35097, - Variant35098, - Variant35099, - Variant35100, - Variant35101, - Variant35102, - Variant35103, - Variant35104, - Variant35105, - Variant35106, - Variant35107, - Variant35108, - Variant35109, - Variant35110, - Variant35111, - Variant35112, - Variant35113, - Variant35114, - Variant35115, - Variant35116, - Variant35117, - Variant35118, - Variant35119, - Variant35120, - Variant35121, - Variant35122, - Variant35123, - Variant35124, - Variant35125, - Variant35126, - Variant35127, - Variant35128, - Variant35129, - Variant35130, - Variant35131, - Variant35132, - Variant35133, - Variant35134, - Variant35135, - Variant35136, - Variant35137, - Variant35138, - Variant35139, - Variant35140, - Variant35141, - Variant35142, - Variant35143, - Variant35144, - Variant35145, - Variant35146, - Variant35147, - Variant35148, - Variant35149, - Variant35150, - Variant35151, - Variant35152, - Variant35153, - Variant35154, - Variant35155, - Variant35156, - Variant35157, - Variant35158, - Variant35159, - Variant35160, - Variant35161, - Variant35162, - Variant35163, - Variant35164, - Variant35165, - Variant35166, - Variant35167, - Variant35168, - Variant35169, - Variant35170, - Variant35171, - Variant35172, - Variant35173, - Variant35174, - Variant35175, - Variant35176, - Variant35177, - Variant35178, - Variant35179, - Variant35180, - Variant35181, - Variant35182, - Variant35183, - Variant35184, - Variant35185, - Variant35186, - Variant35187, - Variant35188, - Variant35189, - Variant35190, - Variant35191, - Variant35192, - Variant35193, - Variant35194, - Variant35195, - Variant35196, - Variant35197, - Variant35198, - Variant35199, - Variant35200, - Variant35201, - Variant35202, - Variant35203, - Variant35204, - Variant35205, - Variant35206, - Variant35207, - Variant35208, - Variant35209, - Variant35210, - Variant35211, - Variant35212, - Variant35213, - Variant35214, - Variant35215, - Variant35216, - Variant35217, - Variant35218, - Variant35219, - Variant35220, - Variant35221, - Variant35222, - Variant35223, - Variant35224, - Variant35225, - Variant35226, - Variant35227, - Variant35228, - Variant35229, - Variant35230, - Variant35231, - Variant35232, - Variant35233, - Variant35234, - Variant35235, - Variant35236, - Variant35237, - Variant35238, - Variant35239, - Variant35240, - Variant35241, - Variant35242, - Variant35243, - Variant35244, - Variant35245, - Variant35246, - Variant35247, - Variant35248, - Variant35249, - Variant35250, - Variant35251, - Variant35252, - Variant35253, - Variant35254, - Variant35255, - Variant35256, - Variant35257, - Variant35258, - Variant35259, - Variant35260, - Variant35261, - Variant35262, - Variant35263, - Variant35264, - Variant35265, - Variant35266, - Variant35267, - Variant35268, - Variant35269, - Variant35270, - Variant35271, - Variant35272, - Variant35273, - Variant35274, - Variant35275, - Variant35276, - Variant35277, - Variant35278, - Variant35279, - Variant35280, - Variant35281, - Variant35282, - Variant35283, - Variant35284, - Variant35285, - Variant35286, - Variant35287, - Variant35288, - Variant35289, - Variant35290, - Variant35291, - Variant35292, - Variant35293, - Variant35294, - Variant35295, - Variant35296, - Variant35297, - Variant35298, - Variant35299, - Variant35300, - Variant35301, - Variant35302, - Variant35303, - Variant35304, - Variant35305, - Variant35306, - Variant35307, - Variant35308, - Variant35309, - Variant35310, - Variant35311, - Variant35312, - Variant35313, - Variant35314, - Variant35315, - Variant35316, - Variant35317, - Variant35318, - Variant35319, - Variant35320, - Variant35321, - Variant35322, - Variant35323, - Variant35324, - Variant35325, - Variant35326, - Variant35327, - Variant35328, - Variant35329, - Variant35330, - Variant35331, - Variant35332, - Variant35333, - Variant35334, - Variant35335, - Variant35336, - Variant35337, - Variant35338, - Variant35339, - Variant35340, - Variant35341, - Variant35342, - Variant35343, - Variant35344, - Variant35345, - Variant35346, - Variant35347, - Variant35348, - Variant35349, - Variant35350, - Variant35351, - Variant35352, - Variant35353, - Variant35354, - Variant35355, - Variant35356, - Variant35357, - Variant35358, - Variant35359, - Variant35360, - Variant35361, - Variant35362, - Variant35363, - Variant35364, - Variant35365, - Variant35366, - Variant35367, - Variant35368, - Variant35369, - Variant35370, - Variant35371, - Variant35372, - Variant35373, - Variant35374, - Variant35375, - Variant35376, - Variant35377, - Variant35378, - Variant35379, - Variant35380, - Variant35381, - Variant35382, - Variant35383, - Variant35384, - Variant35385, - Variant35386, - Variant35387, - Variant35388, - Variant35389, - Variant35390, - Variant35391, - Variant35392, - Variant35393, - Variant35394, - Variant35395, - Variant35396, - Variant35397, - Variant35398, - Variant35399, - Variant35400, - Variant35401, - Variant35402, - Variant35403, - Variant35404, - Variant35405, - Variant35406, - Variant35407, - Variant35408, - Variant35409, - Variant35410, - Variant35411, - Variant35412, - Variant35413, - Variant35414, - Variant35415, - Variant35416, - Variant35417, - Variant35418, - Variant35419, - Variant35420, - Variant35421, - Variant35422, - Variant35423, - Variant35424, - Variant35425, - Variant35426, - Variant35427, - Variant35428, - Variant35429, - Variant35430, - Variant35431, - Variant35432, - Variant35433, - Variant35434, - Variant35435, - Variant35436, - Variant35437, - Variant35438, - Variant35439, - Variant35440, - Variant35441, - Variant35442, - Variant35443, - Variant35444, - Variant35445, - Variant35446, - Variant35447, - Variant35448, - Variant35449, - Variant35450, - Variant35451, - Variant35452, - Variant35453, - Variant35454, - Variant35455, - Variant35456, - Variant35457, - Variant35458, - Variant35459, - Variant35460, - Variant35461, - Variant35462, - Variant35463, - Variant35464, - Variant35465, - Variant35466, - Variant35467, - Variant35468, - Variant35469, - Variant35470, - Variant35471, - Variant35472, - Variant35473, - Variant35474, - Variant35475, - Variant35476, - Variant35477, - Variant35478, - Variant35479, - Variant35480, - Variant35481, - Variant35482, - Variant35483, - Variant35484, - Variant35485, - Variant35486, - Variant35487, - Variant35488, - Variant35489, - Variant35490, - Variant35491, - Variant35492, - Variant35493, - Variant35494, - Variant35495, - Variant35496, - Variant35497, - Variant35498, - Variant35499, - Variant35500, - Variant35501, - Variant35502, - Variant35503, - Variant35504, - Variant35505, - Variant35506, - Variant35507, - Variant35508, - Variant35509, - Variant35510, - Variant35511, - Variant35512, - Variant35513, - Variant35514, - Variant35515, - Variant35516, - Variant35517, - Variant35518, - Variant35519, - Variant35520, - Variant35521, - Variant35522, - Variant35523, - Variant35524, - Variant35525, - Variant35526, - Variant35527, - Variant35528, - Variant35529, - Variant35530, - Variant35531, - Variant35532, - Variant35533, - Variant35534, - Variant35535, - Variant35536, - Variant35537, - Variant35538, - Variant35539, - Variant35540, - Variant35541, - Variant35542, - Variant35543, - Variant35544, - Variant35545, - Variant35546, - Variant35547, - Variant35548, - Variant35549, - Variant35550, - Variant35551, - Variant35552, - Variant35553, - Variant35554, - Variant35555, - Variant35556, - Variant35557, - Variant35558, - Variant35559, - Variant35560, - Variant35561, - Variant35562, - Variant35563, - Variant35564, - Variant35565, - Variant35566, - Variant35567, - Variant35568, - Variant35569, - Variant35570, - Variant35571, - Variant35572, - Variant35573, - Variant35574, - Variant35575, - Variant35576, - Variant35577, - Variant35578, - Variant35579, - Variant35580, - Variant35581, - Variant35582, - Variant35583, - Variant35584, - Variant35585, - Variant35586, - Variant35587, - Variant35588, - Variant35589, - Variant35590, - Variant35591, - Variant35592, - Variant35593, - Variant35594, - Variant35595, - Variant35596, - Variant35597, - Variant35598, - Variant35599, - Variant35600, - Variant35601, - Variant35602, - Variant35603, - Variant35604, - Variant35605, - Variant35606, - Variant35607, - Variant35608, - Variant35609, - Variant35610, - Variant35611, - Variant35612, - Variant35613, - Variant35614, - Variant35615, - Variant35616, - Variant35617, - Variant35618, - Variant35619, - Variant35620, - Variant35621, - Variant35622, - Variant35623, - Variant35624, - Variant35625, - Variant35626, - Variant35627, - Variant35628, - Variant35629, - Variant35630, - Variant35631, - Variant35632, - Variant35633, - Variant35634, - Variant35635, - Variant35636, - Variant35637, - Variant35638, - Variant35639, - Variant35640, - Variant35641, - Variant35642, - Variant35643, - Variant35644, - Variant35645, - Variant35646, - Variant35647, - Variant35648, - Variant35649, - Variant35650, - Variant35651, - Variant35652, - Variant35653, - Variant35654, - Variant35655, - Variant35656, - Variant35657, - Variant35658, - Variant35659, - Variant35660, - Variant35661, - Variant35662, - Variant35663, - Variant35664, - Variant35665, - Variant35666, - Variant35667, - Variant35668, - Variant35669, - Variant35670, - Variant35671, - Variant35672, - Variant35673, - Variant35674, - Variant35675, - Variant35676, - Variant35677, - Variant35678, - Variant35679, - Variant35680, - Variant35681, - Variant35682, - Variant35683, - Variant35684, - Variant35685, - Variant35686, - Variant35687, - Variant35688, - Variant35689, - Variant35690, - Variant35691, - Variant35692, - Variant35693, - Variant35694, - Variant35695, - Variant35696, - Variant35697, - Variant35698, - Variant35699, - Variant35700, - Variant35701, - Variant35702, - Variant35703, - Variant35704, - Variant35705, - Variant35706, - Variant35707, - Variant35708, - Variant35709, - Variant35710, - Variant35711, - Variant35712, - Variant35713, - Variant35714, - Variant35715, - Variant35716, - Variant35717, - Variant35718, - Variant35719, - Variant35720, - Variant35721, - Variant35722, - Variant35723, - Variant35724, - Variant35725, - Variant35726, - Variant35727, - Variant35728, - Variant35729, - Variant35730, - Variant35731, - Variant35732, - Variant35733, - Variant35734, - Variant35735, - Variant35736, - Variant35737, - Variant35738, - Variant35739, - Variant35740, - Variant35741, - Variant35742, - Variant35743, - Variant35744, - Variant35745, - Variant35746, - Variant35747, - Variant35748, - Variant35749, - Variant35750, - Variant35751, - Variant35752, - Variant35753, - Variant35754, - Variant35755, - Variant35756, - Variant35757, - Variant35758, - Variant35759, - Variant35760, - Variant35761, - Variant35762, - Variant35763, - Variant35764, - Variant35765, - Variant35766, - Variant35767, - Variant35768, - Variant35769, - Variant35770, - Variant35771, - Variant35772, - Variant35773, - Variant35774, - Variant35775, - Variant35776, - Variant35777, - Variant35778, - Variant35779, - Variant35780, - Variant35781, - Variant35782, - Variant35783, - Variant35784, - Variant35785, - Variant35786, - Variant35787, - Variant35788, - Variant35789, - Variant35790, - Variant35791, - Variant35792, - Variant35793, - Variant35794, - Variant35795, - Variant35796, - Variant35797, - Variant35798, - Variant35799, - Variant35800, - Variant35801, - Variant35802, - Variant35803, - Variant35804, - Variant35805, - Variant35806, - Variant35807, - Variant35808, - Variant35809, - Variant35810, - Variant35811, - Variant35812, - Variant35813, - Variant35814, - Variant35815, - Variant35816, - Variant35817, - Variant35818, - Variant35819, - Variant35820, - Variant35821, - Variant35822, - Variant35823, - Variant35824, - Variant35825, - Variant35826, - Variant35827, - Variant35828, - Variant35829, - Variant35830, - Variant35831, - Variant35832, - Variant35833, - Variant35834, - Variant35835, - Variant35836, - Variant35837, - Variant35838, - Variant35839, - Variant35840, - Variant35841, - Variant35842, - Variant35843, - Variant35844, - Variant35845, - Variant35846, - Variant35847, - Variant35848, - Variant35849, - Variant35850, - Variant35851, - Variant35852, - Variant35853, - Variant35854, - Variant35855, - Variant35856, - Variant35857, - Variant35858, - Variant35859, - Variant35860, - Variant35861, - Variant35862, - Variant35863, - Variant35864, - Variant35865, - Variant35866, - Variant35867, - Variant35868, - Variant35869, - Variant35870, - Variant35871, - Variant35872, - Variant35873, - Variant35874, - Variant35875, - Variant35876, - Variant35877, - Variant35878, - Variant35879, - Variant35880, - Variant35881, - Variant35882, - Variant35883, - Variant35884, - Variant35885, - Variant35886, - Variant35887, - Variant35888, - Variant35889, - Variant35890, - Variant35891, - Variant35892, - Variant35893, - Variant35894, - Variant35895, - Variant35896, - Variant35897, - Variant35898, - Variant35899, - Variant35900, - Variant35901, - Variant35902, - Variant35903, - Variant35904, - Variant35905, - Variant35906, - Variant35907, - Variant35908, - Variant35909, - Variant35910, - Variant35911, - Variant35912, - Variant35913, - Variant35914, - Variant35915, - Variant35916, - Variant35917, - Variant35918, - Variant35919, - Variant35920, - Variant35921, - Variant35922, - Variant35923, - Variant35924, - Variant35925, - Variant35926, - Variant35927, - Variant35928, - Variant35929, - Variant35930, - Variant35931, - Variant35932, - Variant35933, - Variant35934, - Variant35935, - Variant35936, - Variant35937, - Variant35938, - Variant35939, - Variant35940, - Variant35941, - Variant35942, - Variant35943, - Variant35944, - Variant35945, - Variant35946, - Variant35947, - Variant35948, - Variant35949, - Variant35950, - Variant35951, - Variant35952, - Variant35953, - Variant35954, - Variant35955, - Variant35956, - Variant35957, - Variant35958, - Variant35959, - Variant35960, - Variant35961, - Variant35962, - Variant35963, - Variant35964, - Variant35965, - Variant35966, - Variant35967, - Variant35968, - Variant35969, - Variant35970, - Variant35971, - Variant35972, - Variant35973, - Variant35974, - Variant35975, - Variant35976, - Variant35977, - Variant35978, - Variant35979, - Variant35980, - Variant35981, - Variant35982, - Variant35983, - Variant35984, - Variant35985, - Variant35986, - Variant35987, - Variant35988, - Variant35989, - Variant35990, - Variant35991, - Variant35992, - Variant35993, - Variant35994, - Variant35995, - Variant35996, - Variant35997, - Variant35998, - Variant35999, - Variant36000, - Variant36001, - Variant36002, - Variant36003, - Variant36004, - Variant36005, - Variant36006, - Variant36007, - Variant36008, - Variant36009, - Variant36010, - Variant36011, - Variant36012, - Variant36013, - Variant36014, - Variant36015, - Variant36016, - Variant36017, - Variant36018, - Variant36019, - Variant36020, - Variant36021, - Variant36022, - Variant36023, - Variant36024, - Variant36025, - Variant36026, - Variant36027, - Variant36028, - Variant36029, - Variant36030, - Variant36031, - Variant36032, - Variant36033, - Variant36034, - Variant36035, - Variant36036, - Variant36037, - Variant36038, - Variant36039, - Variant36040, - Variant36041, - Variant36042, - Variant36043, - Variant36044, - Variant36045, - Variant36046, - Variant36047, - Variant36048, - Variant36049, - Variant36050, - Variant36051, - Variant36052, - Variant36053, - Variant36054, - Variant36055, - Variant36056, - Variant36057, - Variant36058, - Variant36059, - Variant36060, - Variant36061, - Variant36062, - Variant36063, - Variant36064, - Variant36065, - Variant36066, - Variant36067, - Variant36068, - Variant36069, - Variant36070, - Variant36071, - Variant36072, - Variant36073, - Variant36074, - Variant36075, - Variant36076, - Variant36077, - Variant36078, - Variant36079, - Variant36080, - Variant36081, - Variant36082, - Variant36083, - Variant36084, - Variant36085, - Variant36086, - Variant36087, - Variant36088, - Variant36089, - Variant36090, - Variant36091, - Variant36092, - Variant36093, - Variant36094, - Variant36095, - Variant36096, - Variant36097, - Variant36098, - Variant36099, - Variant36100, - Variant36101, - Variant36102, - Variant36103, - Variant36104, - Variant36105, - Variant36106, - Variant36107, - Variant36108, - Variant36109, - Variant36110, - Variant36111, - Variant36112, - Variant36113, - Variant36114, - Variant36115, - Variant36116, - Variant36117, - Variant36118, - Variant36119, - Variant36120, - Variant36121, - Variant36122, - Variant36123, - Variant36124, - Variant36125, - Variant36126, - Variant36127, - Variant36128, - Variant36129, - Variant36130, - Variant36131, - Variant36132, - Variant36133, - Variant36134, - Variant36135, - Variant36136, - Variant36137, - Variant36138, - Variant36139, - Variant36140, - Variant36141, - Variant36142, - Variant36143, - Variant36144, - Variant36145, - Variant36146, - Variant36147, - Variant36148, - Variant36149, - Variant36150, - Variant36151, - Variant36152, - Variant36153, - Variant36154, - Variant36155, - Variant36156, - Variant36157, - Variant36158, - Variant36159, - Variant36160, - Variant36161, - Variant36162, - Variant36163, - Variant36164, - Variant36165, - Variant36166, - Variant36167, - Variant36168, - Variant36169, - Variant36170, - Variant36171, - Variant36172, - Variant36173, - Variant36174, - Variant36175, - Variant36176, - Variant36177, - Variant36178, - Variant36179, - Variant36180, - Variant36181, - Variant36182, - Variant36183, - Variant36184, - Variant36185, - Variant36186, - Variant36187, - Variant36188, - Variant36189, - Variant36190, - Variant36191, - Variant36192, - Variant36193, - Variant36194, - Variant36195, - Variant36196, - Variant36197, - Variant36198, - Variant36199, - Variant36200, - Variant36201, - Variant36202, - Variant36203, - Variant36204, - Variant36205, - Variant36206, - Variant36207, - Variant36208, - Variant36209, - Variant36210, - Variant36211, - Variant36212, - Variant36213, - Variant36214, - Variant36215, - Variant36216, - Variant36217, - Variant36218, - Variant36219, - Variant36220, - Variant36221, - Variant36222, - Variant36223, - Variant36224, - Variant36225, - Variant36226, - Variant36227, - Variant36228, - Variant36229, - Variant36230, - Variant36231, - Variant36232, - Variant36233, - Variant36234, - Variant36235, - Variant36236, - Variant36237, - Variant36238, - Variant36239, - Variant36240, - Variant36241, - Variant36242, - Variant36243, - Variant36244, - Variant36245, - Variant36246, - Variant36247, - Variant36248, - Variant36249, - Variant36250, - Variant36251, - Variant36252, - Variant36253, - Variant36254, - Variant36255, - Variant36256, - Variant36257, - Variant36258, - Variant36259, - Variant36260, - Variant36261, - Variant36262, - Variant36263, - Variant36264, - Variant36265, - Variant36266, - Variant36267, - Variant36268, - Variant36269, - Variant36270, - Variant36271, - Variant36272, - Variant36273, - Variant36274, - Variant36275, - Variant36276, - Variant36277, - Variant36278, - Variant36279, - Variant36280, - Variant36281, - Variant36282, - Variant36283, - Variant36284, - Variant36285, - Variant36286, - Variant36287, - Variant36288, - Variant36289, - Variant36290, - Variant36291, - Variant36292, - Variant36293, - Variant36294, - Variant36295, - Variant36296, - Variant36297, - Variant36298, - Variant36299, - Variant36300, - Variant36301, - Variant36302, - Variant36303, - Variant36304, - Variant36305, - Variant36306, - Variant36307, - Variant36308, - Variant36309, - Variant36310, - Variant36311, - Variant36312, - Variant36313, - Variant36314, - Variant36315, - Variant36316, - Variant36317, - Variant36318, - Variant36319, - Variant36320, - Variant36321, - Variant36322, - Variant36323, - Variant36324, - Variant36325, - Variant36326, - Variant36327, - Variant36328, - Variant36329, - Variant36330, - Variant36331, - Variant36332, - Variant36333, - Variant36334, - Variant36335, - Variant36336, - Variant36337, - Variant36338, - Variant36339, - Variant36340, - Variant36341, - Variant36342, - Variant36343, - Variant36344, - Variant36345, - Variant36346, - Variant36347, - Variant36348, - Variant36349, - Variant36350, - Variant36351, - Variant36352, - Variant36353, - Variant36354, - Variant36355, - Variant36356, - Variant36357, - Variant36358, - Variant36359, - Variant36360, - Variant36361, - Variant36362, - Variant36363, - Variant36364, - Variant36365, - Variant36366, - Variant36367, - Variant36368, - Variant36369, - Variant36370, - Variant36371, - Variant36372, - Variant36373, - Variant36374, - Variant36375, - Variant36376, - Variant36377, - Variant36378, - Variant36379, - Variant36380, - Variant36381, - Variant36382, - Variant36383, - Variant36384, - Variant36385, - Variant36386, - Variant36387, - Variant36388, - Variant36389, - Variant36390, - Variant36391, - Variant36392, - Variant36393, - Variant36394, - Variant36395, - Variant36396, - Variant36397, - Variant36398, - Variant36399, - Variant36400, - Variant36401, - Variant36402, - Variant36403, - Variant36404, - Variant36405, - Variant36406, - Variant36407, - Variant36408, - Variant36409, - Variant36410, - Variant36411, - Variant36412, - Variant36413, - Variant36414, - Variant36415, - Variant36416, - Variant36417, - Variant36418, - Variant36419, - Variant36420, - Variant36421, - Variant36422, - Variant36423, - Variant36424, - Variant36425, - Variant36426, - Variant36427, - Variant36428, - Variant36429, - Variant36430, - Variant36431, - Variant36432, - Variant36433, - Variant36434, - Variant36435, - Variant36436, - Variant36437, - Variant36438, - Variant36439, - Variant36440, - Variant36441, - Variant36442, - Variant36443, - Variant36444, - Variant36445, - Variant36446, - Variant36447, - Variant36448, - Variant36449, - Variant36450, - Variant36451, - Variant36452, - Variant36453, - Variant36454, - Variant36455, - Variant36456, - Variant36457, - Variant36458, - Variant36459, - Variant36460, - Variant36461, - Variant36462, - Variant36463, - Variant36464, - Variant36465, - Variant36466, - Variant36467, - Variant36468, - Variant36469, - Variant36470, - Variant36471, - Variant36472, - Variant36473, - Variant36474, - Variant36475, - Variant36476, - Variant36477, - Variant36478, - Variant36479, - Variant36480, - Variant36481, - Variant36482, - Variant36483, - Variant36484, - Variant36485, - Variant36486, - Variant36487, - Variant36488, - Variant36489, - Variant36490, - Variant36491, - Variant36492, - Variant36493, - Variant36494, - Variant36495, - Variant36496, - Variant36497, - Variant36498, - Variant36499, - Variant36500, - Variant36501, - Variant36502, - Variant36503, - Variant36504, - Variant36505, - Variant36506, - Variant36507, - Variant36508, - Variant36509, - Variant36510, - Variant36511, - Variant36512, - Variant36513, - Variant36514, - Variant36515, - Variant36516, - Variant36517, - Variant36518, - Variant36519, - Variant36520, - Variant36521, - Variant36522, - Variant36523, - Variant36524, - Variant36525, - Variant36526, - Variant36527, - Variant36528, - Variant36529, - Variant36530, - Variant36531, - Variant36532, - Variant36533, - Variant36534, - Variant36535, - Variant36536, - Variant36537, - Variant36538, - Variant36539, - Variant36540, - Variant36541, - Variant36542, - Variant36543, - Variant36544, - Variant36545, - Variant36546, - Variant36547, - Variant36548, - Variant36549, - Variant36550, - Variant36551, - Variant36552, - Variant36553, - Variant36554, - Variant36555, - Variant36556, - Variant36557, - Variant36558, - Variant36559, - Variant36560, - Variant36561, - Variant36562, - Variant36563, - Variant36564, - Variant36565, - Variant36566, - Variant36567, - Variant36568, - Variant36569, - Variant36570, - Variant36571, - Variant36572, - Variant36573, - Variant36574, - Variant36575, - Variant36576, - Variant36577, - Variant36578, - Variant36579, - Variant36580, - Variant36581, - Variant36582, - Variant36583, - Variant36584, - Variant36585, - Variant36586, - Variant36587, - Variant36588, - Variant36589, - Variant36590, - Variant36591, - Variant36592, - Variant36593, - Variant36594, - Variant36595, - Variant36596, - Variant36597, - Variant36598, - Variant36599, - Variant36600, - Variant36601, - Variant36602, - Variant36603, - Variant36604, - Variant36605, - Variant36606, - Variant36607, - Variant36608, - Variant36609, - Variant36610, - Variant36611, - Variant36612, - Variant36613, - Variant36614, - Variant36615, - Variant36616, - Variant36617, - Variant36618, - Variant36619, - Variant36620, - Variant36621, - Variant36622, - Variant36623, - Variant36624, - Variant36625, - Variant36626, - Variant36627, - Variant36628, - Variant36629, - Variant36630, - Variant36631, - Variant36632, - Variant36633, - Variant36634, - Variant36635, - Variant36636, - Variant36637, - Variant36638, - Variant36639, - Variant36640, - Variant36641, - Variant36642, - Variant36643, - Variant36644, - Variant36645, - Variant36646, - Variant36647, - Variant36648, - Variant36649, - Variant36650, - Variant36651, - Variant36652, - Variant36653, - Variant36654, - Variant36655, - Variant36656, - Variant36657, - Variant36658, - Variant36659, - Variant36660, - Variant36661, - Variant36662, - Variant36663, - Variant36664, - Variant36665, - Variant36666, - Variant36667, - Variant36668, - Variant36669, - Variant36670, - Variant36671, - Variant36672, - Variant36673, - Variant36674, - Variant36675, - Variant36676, - Variant36677, - Variant36678, - Variant36679, - Variant36680, - Variant36681, - Variant36682, - Variant36683, - Variant36684, - Variant36685, - Variant36686, - Variant36687, - Variant36688, - Variant36689, - Variant36690, - Variant36691, - Variant36692, - Variant36693, - Variant36694, - Variant36695, - Variant36696, - Variant36697, - Variant36698, - Variant36699, - Variant36700, - Variant36701, - Variant36702, - Variant36703, - Variant36704, - Variant36705, - Variant36706, - Variant36707, - Variant36708, - Variant36709, - Variant36710, - Variant36711, - Variant36712, - Variant36713, - Variant36714, - Variant36715, - Variant36716, - Variant36717, - Variant36718, - Variant36719, - Variant36720, - Variant36721, - Variant36722, - Variant36723, - Variant36724, - Variant36725, - Variant36726, - Variant36727, - Variant36728, - Variant36729, - Variant36730, - Variant36731, - Variant36732, - Variant36733, - Variant36734, - Variant36735, - Variant36736, - Variant36737, - Variant36738, - Variant36739, - Variant36740, - Variant36741, - Variant36742, - Variant36743, - Variant36744, - Variant36745, - Variant36746, - Variant36747, - Variant36748, - Variant36749, - Variant36750, - Variant36751, - Variant36752, - Variant36753, - Variant36754, - Variant36755, - Variant36756, - Variant36757, - Variant36758, - Variant36759, - Variant36760, - Variant36761, - Variant36762, - Variant36763, - Variant36764, - Variant36765, - Variant36766, - Variant36767, - Variant36768, - Variant36769, - Variant36770, - Variant36771, - Variant36772, - Variant36773, - Variant36774, - Variant36775, - Variant36776, - Variant36777, - Variant36778, - Variant36779, - Variant36780, - Variant36781, - Variant36782, - Variant36783, - Variant36784, - Variant36785, - Variant36786, - Variant36787, - Variant36788, - Variant36789, - Variant36790, - Variant36791, - Variant36792, - Variant36793, - Variant36794, - Variant36795, - Variant36796, - Variant36797, - Variant36798, - Variant36799, - Variant36800, - Variant36801, - Variant36802, - Variant36803, - Variant36804, - Variant36805, - Variant36806, - Variant36807, - Variant36808, - Variant36809, - Variant36810, - Variant36811, - Variant36812, - Variant36813, - Variant36814, - Variant36815, - Variant36816, - Variant36817, - Variant36818, - Variant36819, - Variant36820, - Variant36821, - Variant36822, - Variant36823, - Variant36824, - Variant36825, - Variant36826, - Variant36827, - Variant36828, - Variant36829, - Variant36830, - Variant36831, - Variant36832, - Variant36833, - Variant36834, - Variant36835, - Variant36836, - Variant36837, - Variant36838, - Variant36839, - Variant36840, - Variant36841, - Variant36842, - Variant36843, - Variant36844, - Variant36845, - Variant36846, - Variant36847, - Variant36848, - Variant36849, - Variant36850, - Variant36851, - Variant36852, - Variant36853, - Variant36854, - Variant36855, - Variant36856, - Variant36857, - Variant36858, - Variant36859, - Variant36860, - Variant36861, - Variant36862, - Variant36863, - Variant36864, - Variant36865, - Variant36866, - Variant36867, - Variant36868, - Variant36869, - Variant36870, - Variant36871, - Variant36872, - Variant36873, - Variant36874, - Variant36875, - Variant36876, - Variant36877, - Variant36878, - Variant36879, - Variant36880, - Variant36881, - Variant36882, - Variant36883, - Variant36884, - Variant36885, - Variant36886, - Variant36887, - Variant36888, - Variant36889, - Variant36890, - Variant36891, - Variant36892, - Variant36893, - Variant36894, - Variant36895, - Variant36896, - Variant36897, - Variant36898, - Variant36899, - Variant36900, - Variant36901, - Variant36902, - Variant36903, - Variant36904, - Variant36905, - Variant36906, - Variant36907, - Variant36908, - Variant36909, - Variant36910, - Variant36911, - Variant36912, - Variant36913, - Variant36914, - Variant36915, - Variant36916, - Variant36917, - Variant36918, - Variant36919, - Variant36920, - Variant36921, - Variant36922, - Variant36923, - Variant36924, - Variant36925, - Variant36926, - Variant36927, - Variant36928, - Variant36929, - Variant36930, - Variant36931, - Variant36932, - Variant36933, - Variant36934, - Variant36935, - Variant36936, - Variant36937, - Variant36938, - Variant36939, - Variant36940, - Variant36941, - Variant36942, - Variant36943, - Variant36944, - Variant36945, - Variant36946, - Variant36947, - Variant36948, - Variant36949, - Variant36950, - Variant36951, - Variant36952, - Variant36953, - Variant36954, - Variant36955, - Variant36956, - Variant36957, - Variant36958, - Variant36959, - Variant36960, - Variant36961, - Variant36962, - Variant36963, - Variant36964, - Variant36965, - Variant36966, - Variant36967, - Variant36968, - Variant36969, - Variant36970, - Variant36971, - Variant36972, - Variant36973, - Variant36974, - Variant36975, - Variant36976, - Variant36977, - Variant36978, - Variant36979, - Variant36980, - Variant36981, - Variant36982, - Variant36983, - Variant36984, - Variant36985, - Variant36986, - Variant36987, - Variant36988, - Variant36989, - Variant36990, - Variant36991, - Variant36992, - Variant36993, - Variant36994, - Variant36995, - Variant36996, - Variant36997, - Variant36998, - Variant36999, - Variant37000, - Variant37001, - Variant37002, - Variant37003, - Variant37004, - Variant37005, - Variant37006, - Variant37007, - Variant37008, - Variant37009, - Variant37010, - Variant37011, - Variant37012, - Variant37013, - Variant37014, - Variant37015, - Variant37016, - Variant37017, - Variant37018, - Variant37019, - Variant37020, - Variant37021, - Variant37022, - Variant37023, - Variant37024, - Variant37025, - Variant37026, - Variant37027, - Variant37028, - Variant37029, - Variant37030, - Variant37031, - Variant37032, - Variant37033, - Variant37034, - Variant37035, - Variant37036, - Variant37037, - Variant37038, - Variant37039, - Variant37040, - Variant37041, - Variant37042, - Variant37043, - Variant37044, - Variant37045, - Variant37046, - Variant37047, - Variant37048, - Variant37049, - Variant37050, - Variant37051, - Variant37052, - Variant37053, - Variant37054, - Variant37055, - Variant37056, - Variant37057, - Variant37058, - Variant37059, - Variant37060, - Variant37061, - Variant37062, - Variant37063, - Variant37064, - Variant37065, - Variant37066, - Variant37067, - Variant37068, - Variant37069, - Variant37070, - Variant37071, - Variant37072, - Variant37073, - Variant37074, - Variant37075, - Variant37076, - Variant37077, - Variant37078, - Variant37079, - Variant37080, - Variant37081, - Variant37082, - Variant37083, - Variant37084, - Variant37085, - Variant37086, - Variant37087, - Variant37088, - Variant37089, - Variant37090, - Variant37091, - Variant37092, - Variant37093, - Variant37094, - Variant37095, - Variant37096, - Variant37097, - Variant37098, - Variant37099, - Variant37100, - Variant37101, - Variant37102, - Variant37103, - Variant37104, - Variant37105, - Variant37106, - Variant37107, - Variant37108, - Variant37109, - Variant37110, - Variant37111, - Variant37112, - Variant37113, - Variant37114, - Variant37115, - Variant37116, - Variant37117, - Variant37118, - Variant37119, - Variant37120, - Variant37121, - Variant37122, - Variant37123, - Variant37124, - Variant37125, - Variant37126, - Variant37127, - Variant37128, - Variant37129, - Variant37130, - Variant37131, - Variant37132, - Variant37133, - Variant37134, - Variant37135, - Variant37136, - Variant37137, - Variant37138, - Variant37139, - Variant37140, - Variant37141, - Variant37142, - Variant37143, - Variant37144, - Variant37145, - Variant37146, - Variant37147, - Variant37148, - Variant37149, - Variant37150, - Variant37151, - Variant37152, - Variant37153, - Variant37154, - Variant37155, - Variant37156, - Variant37157, - Variant37158, - Variant37159, - Variant37160, - Variant37161, - Variant37162, - Variant37163, - Variant37164, - Variant37165, - Variant37166, - Variant37167, - Variant37168, - Variant37169, - Variant37170, - Variant37171, - Variant37172, - Variant37173, - Variant37174, - Variant37175, - Variant37176, - Variant37177, - Variant37178, - Variant37179, - Variant37180, - Variant37181, - Variant37182, - Variant37183, - Variant37184, - Variant37185, - Variant37186, - Variant37187, - Variant37188, - Variant37189, - Variant37190, - Variant37191, - Variant37192, - Variant37193, - Variant37194, - Variant37195, - Variant37196, - Variant37197, - Variant37198, - Variant37199, - Variant37200, - Variant37201, - Variant37202, - Variant37203, - Variant37204, - Variant37205, - Variant37206, - Variant37207, - Variant37208, - Variant37209, - Variant37210, - Variant37211, - Variant37212, - Variant37213, - Variant37214, - Variant37215, - Variant37216, - Variant37217, - Variant37218, - Variant37219, - Variant37220, - Variant37221, - Variant37222, - Variant37223, - Variant37224, - Variant37225, - Variant37226, - Variant37227, - Variant37228, - Variant37229, - Variant37230, - Variant37231, - Variant37232, - Variant37233, - Variant37234, - Variant37235, - Variant37236, - Variant37237, - Variant37238, - Variant37239, - Variant37240, - Variant37241, - Variant37242, - Variant37243, - Variant37244, - Variant37245, - Variant37246, - Variant37247, - Variant37248, - Variant37249, - Variant37250, - Variant37251, - Variant37252, - Variant37253, - Variant37254, - Variant37255, - Variant37256, - Variant37257, - Variant37258, - Variant37259, - Variant37260, - Variant37261, - Variant37262, - Variant37263, - Variant37264, - Variant37265, - Variant37266, - Variant37267, - Variant37268, - Variant37269, - Variant37270, - Variant37271, - Variant37272, - Variant37273, - Variant37274, - Variant37275, - Variant37276, - Variant37277, - Variant37278, - Variant37279, - Variant37280, - Variant37281, - Variant37282, - Variant37283, - Variant37284, - Variant37285, - Variant37286, - Variant37287, - Variant37288, - Variant37289, - Variant37290, - Variant37291, - Variant37292, - Variant37293, - Variant37294, - Variant37295, - Variant37296, - Variant37297, - Variant37298, - Variant37299, - Variant37300, - Variant37301, - Variant37302, - Variant37303, - Variant37304, - Variant37305, - Variant37306, - Variant37307, - Variant37308, - Variant37309, - Variant37310, - Variant37311, - Variant37312, - Variant37313, - Variant37314, - Variant37315, - Variant37316, - Variant37317, - Variant37318, - Variant37319, - Variant37320, - Variant37321, - Variant37322, - Variant37323, - Variant37324, - Variant37325, - Variant37326, - Variant37327, - Variant37328, - Variant37329, - Variant37330, - Variant37331, - Variant37332, - Variant37333, - Variant37334, - Variant37335, - Variant37336, - Variant37337, - Variant37338, - Variant37339, - Variant37340, - Variant37341, - Variant37342, - Variant37343, - Variant37344, - Variant37345, - Variant37346, - Variant37347, - Variant37348, - Variant37349, - Variant37350, - Variant37351, - Variant37352, - Variant37353, - Variant37354, - Variant37355, - Variant37356, - Variant37357, - Variant37358, - Variant37359, - Variant37360, - Variant37361, - Variant37362, - Variant37363, - Variant37364, - Variant37365, - Variant37366, - Variant37367, - Variant37368, - Variant37369, - Variant37370, - Variant37371, - Variant37372, - Variant37373, - Variant37374, - Variant37375, - Variant37376, - Variant37377, - Variant37378, - Variant37379, - Variant37380, - Variant37381, - Variant37382, - Variant37383, - Variant37384, - Variant37385, - Variant37386, - Variant37387, - Variant37388, - Variant37389, - Variant37390, - Variant37391, - Variant37392, - Variant37393, - Variant37394, - Variant37395, - Variant37396, - Variant37397, - Variant37398, - Variant37399, - Variant37400, - Variant37401, - Variant37402, - Variant37403, - Variant37404, - Variant37405, - Variant37406, - Variant37407, - Variant37408, - Variant37409, - Variant37410, - Variant37411, - Variant37412, - Variant37413, - Variant37414, - Variant37415, - Variant37416, - Variant37417, - Variant37418, - Variant37419, - Variant37420, - Variant37421, - Variant37422, - Variant37423, - Variant37424, - Variant37425, - Variant37426, - Variant37427, - Variant37428, - Variant37429, - Variant37430, - Variant37431, - Variant37432, - Variant37433, - Variant37434, - Variant37435, - Variant37436, - Variant37437, - Variant37438, - Variant37439, - Variant37440, - Variant37441, - Variant37442, - Variant37443, - Variant37444, - Variant37445, - Variant37446, - Variant37447, - Variant37448, - Variant37449, - Variant37450, - Variant37451, - Variant37452, - Variant37453, - Variant37454, - Variant37455, - Variant37456, - Variant37457, - Variant37458, - Variant37459, - Variant37460, - Variant37461, - Variant37462, - Variant37463, - Variant37464, - Variant37465, - Variant37466, - Variant37467, - Variant37468, - Variant37469, - Variant37470, - Variant37471, - Variant37472, - Variant37473, - Variant37474, - Variant37475, - Variant37476, - Variant37477, - Variant37478, - Variant37479, - Variant37480, - Variant37481, - Variant37482, - Variant37483, - Variant37484, - Variant37485, - Variant37486, - Variant37487, - Variant37488, - Variant37489, - Variant37490, - Variant37491, - Variant37492, - Variant37493, - Variant37494, - Variant37495, - Variant37496, - Variant37497, - Variant37498, - Variant37499, - Variant37500, - Variant37501, - Variant37502, - Variant37503, - Variant37504, - Variant37505, - Variant37506, - Variant37507, - Variant37508, - Variant37509, - Variant37510, - Variant37511, - Variant37512, - Variant37513, - Variant37514, - Variant37515, - Variant37516, - Variant37517, - Variant37518, - Variant37519, - Variant37520, - Variant37521, - Variant37522, - Variant37523, - Variant37524, - Variant37525, - Variant37526, - Variant37527, - Variant37528, - Variant37529, - Variant37530, - Variant37531, - Variant37532, - Variant37533, - Variant37534, - Variant37535, - Variant37536, - Variant37537, - Variant37538, - Variant37539, - Variant37540, - Variant37541, - Variant37542, - Variant37543, - Variant37544, - Variant37545, - Variant37546, - Variant37547, - Variant37548, - Variant37549, - Variant37550, - Variant37551, - Variant37552, - Variant37553, - Variant37554, - Variant37555, - Variant37556, - Variant37557, - Variant37558, - Variant37559, - Variant37560, - Variant37561, - Variant37562, - Variant37563, - Variant37564, - Variant37565, - Variant37566, - Variant37567, - Variant37568, - Variant37569, - Variant37570, - Variant37571, - Variant37572, - Variant37573, - Variant37574, - Variant37575, - Variant37576, - Variant37577, - Variant37578, - Variant37579, - Variant37580, - Variant37581, - Variant37582, - Variant37583, - Variant37584, - Variant37585, - Variant37586, - Variant37587, - Variant37588, - Variant37589, - Variant37590, - Variant37591, - Variant37592, - Variant37593, - Variant37594, - Variant37595, - Variant37596, - Variant37597, - Variant37598, - Variant37599, - Variant37600, - Variant37601, - Variant37602, - Variant37603, - Variant37604, - Variant37605, - Variant37606, - Variant37607, - Variant37608, - Variant37609, - Variant37610, - Variant37611, - Variant37612, - Variant37613, - Variant37614, - Variant37615, - Variant37616, - Variant37617, - Variant37618, - Variant37619, - Variant37620, - Variant37621, - Variant37622, - Variant37623, - Variant37624, - Variant37625, - Variant37626, - Variant37627, - Variant37628, - Variant37629, - Variant37630, - Variant37631, - Variant37632, - Variant37633, - Variant37634, - Variant37635, - Variant37636, - Variant37637, - Variant37638, - Variant37639, - Variant37640, - Variant37641, - Variant37642, - Variant37643, - Variant37644, - Variant37645, - Variant37646, - Variant37647, - Variant37648, - Variant37649, - Variant37650, - Variant37651, - Variant37652, - Variant37653, - Variant37654, - Variant37655, - Variant37656, - Variant37657, - Variant37658, - Variant37659, - Variant37660, - Variant37661, - Variant37662, - Variant37663, - Variant37664, - Variant37665, - Variant37666, - Variant37667, - Variant37668, - Variant37669, - Variant37670, - Variant37671, - Variant37672, - Variant37673, - Variant37674, - Variant37675, - Variant37676, - Variant37677, - Variant37678, - Variant37679, - Variant37680, - Variant37681, - Variant37682, - Variant37683, - Variant37684, - Variant37685, - Variant37686, - Variant37687, - Variant37688, - Variant37689, - Variant37690, - Variant37691, - Variant37692, - Variant37693, - Variant37694, - Variant37695, - Variant37696, - Variant37697, - Variant37698, - Variant37699, - Variant37700, - Variant37701, - Variant37702, - Variant37703, - Variant37704, - Variant37705, - Variant37706, - Variant37707, - Variant37708, - Variant37709, - Variant37710, - Variant37711, - Variant37712, - Variant37713, - Variant37714, - Variant37715, - Variant37716, - Variant37717, - Variant37718, - Variant37719, - Variant37720, - Variant37721, - Variant37722, - Variant37723, - Variant37724, - Variant37725, - Variant37726, - Variant37727, - Variant37728, - Variant37729, - Variant37730, - Variant37731, - Variant37732, - Variant37733, - Variant37734, - Variant37735, - Variant37736, - Variant37737, - Variant37738, - Variant37739, - Variant37740, - Variant37741, - Variant37742, - Variant37743, - Variant37744, - Variant37745, - Variant37746, - Variant37747, - Variant37748, - Variant37749, - Variant37750, - Variant37751, - Variant37752, - Variant37753, - Variant37754, - Variant37755, - Variant37756, - Variant37757, - Variant37758, - Variant37759, - Variant37760, - Variant37761, - Variant37762, - Variant37763, - Variant37764, - Variant37765, - Variant37766, - Variant37767, - Variant37768, - Variant37769, - Variant37770, - Variant37771, - Variant37772, - Variant37773, - Variant37774, - Variant37775, - Variant37776, - Variant37777, - Variant37778, - Variant37779, - Variant37780, - Variant37781, - Variant37782, - Variant37783, - Variant37784, - Variant37785, - Variant37786, - Variant37787, - Variant37788, - Variant37789, - Variant37790, - Variant37791, - Variant37792, - Variant37793, - Variant37794, - Variant37795, - Variant37796, - Variant37797, - Variant37798, - Variant37799, - Variant37800, - Variant37801, - Variant37802, - Variant37803, - Variant37804, - Variant37805, - Variant37806, - Variant37807, - Variant37808, - Variant37809, - Variant37810, - Variant37811, - Variant37812, - Variant37813, - Variant37814, - Variant37815, - Variant37816, - Variant37817, - Variant37818, - Variant37819, - Variant37820, - Variant37821, - Variant37822, - Variant37823, - Variant37824, - Variant37825, - Variant37826, - Variant37827, - Variant37828, - Variant37829, - Variant37830, - Variant37831, - Variant37832, - Variant37833, - Variant37834, - Variant37835, - Variant37836, - Variant37837, - Variant37838, - Variant37839, - Variant37840, - Variant37841, - Variant37842, - Variant37843, - Variant37844, - Variant37845, - Variant37846, - Variant37847, - Variant37848, - Variant37849, - Variant37850, - Variant37851, - Variant37852, - Variant37853, - Variant37854, - Variant37855, - Variant37856, - Variant37857, - Variant37858, - Variant37859, - Variant37860, - Variant37861, - Variant37862, - Variant37863, - Variant37864, - Variant37865, - Variant37866, - Variant37867, - Variant37868, - Variant37869, - Variant37870, - Variant37871, - Variant37872, - Variant37873, - Variant37874, - Variant37875, - Variant37876, - Variant37877, - Variant37878, - Variant37879, - Variant37880, - Variant37881, - Variant37882, - Variant37883, - Variant37884, - Variant37885, - Variant37886, - Variant37887, - Variant37888, - Variant37889, - Variant37890, - Variant37891, - Variant37892, - Variant37893, - Variant37894, - Variant37895, - Variant37896, - Variant37897, - Variant37898, - Variant37899, - Variant37900, - Variant37901, - Variant37902, - Variant37903, - Variant37904, - Variant37905, - Variant37906, - Variant37907, - Variant37908, - Variant37909, - Variant37910, - Variant37911, - Variant37912, - Variant37913, - Variant37914, - Variant37915, - Variant37916, - Variant37917, - Variant37918, - Variant37919, - Variant37920, - Variant37921, - Variant37922, - Variant37923, - Variant37924, - Variant37925, - Variant37926, - Variant37927, - Variant37928, - Variant37929, - Variant37930, - Variant37931, - Variant37932, - Variant37933, - Variant37934, - Variant37935, - Variant37936, - Variant37937, - Variant37938, - Variant37939, - Variant37940, - Variant37941, - Variant37942, - Variant37943, - Variant37944, - Variant37945, - Variant37946, - Variant37947, - Variant37948, - Variant37949, - Variant37950, - Variant37951, - Variant37952, - Variant37953, - Variant37954, - Variant37955, - Variant37956, - Variant37957, - Variant37958, - Variant37959, - Variant37960, - Variant37961, - Variant37962, - Variant37963, - Variant37964, - Variant37965, - Variant37966, - Variant37967, - Variant37968, - Variant37969, - Variant37970, - Variant37971, - Variant37972, - Variant37973, - Variant37974, - Variant37975, - Variant37976, - Variant37977, - Variant37978, - Variant37979, - Variant37980, - Variant37981, - Variant37982, - Variant37983, - Variant37984, - Variant37985, - Variant37986, - Variant37987, - Variant37988, - Variant37989, - Variant37990, - Variant37991, - Variant37992, - Variant37993, - Variant37994, - Variant37995, - Variant37996, - Variant37997, - Variant37998, - Variant37999, - Variant38000, - Variant38001, - Variant38002, - Variant38003, - Variant38004, - Variant38005, - Variant38006, - Variant38007, - Variant38008, - Variant38009, - Variant38010, - Variant38011, - Variant38012, - Variant38013, - Variant38014, - Variant38015, - Variant38016, - Variant38017, - Variant38018, - Variant38019, - Variant38020, - Variant38021, - Variant38022, - Variant38023, - Variant38024, - Variant38025, - Variant38026, - Variant38027, - Variant38028, - Variant38029, - Variant38030, - Variant38031, - Variant38032, - Variant38033, - Variant38034, - Variant38035, - Variant38036, - Variant38037, - Variant38038, - Variant38039, - Variant38040, - Variant38041, - Variant38042, - Variant38043, - Variant38044, - Variant38045, - Variant38046, - Variant38047, - Variant38048, - Variant38049, - Variant38050, - Variant38051, - Variant38052, - Variant38053, - Variant38054, - Variant38055, - Variant38056, - Variant38057, - Variant38058, - Variant38059, - Variant38060, - Variant38061, - Variant38062, - Variant38063, - Variant38064, - Variant38065, - Variant38066, - Variant38067, - Variant38068, - Variant38069, - Variant38070, - Variant38071, - Variant38072, - Variant38073, - Variant38074, - Variant38075, - Variant38076, - Variant38077, - Variant38078, - Variant38079, - Variant38080, - Variant38081, - Variant38082, - Variant38083, - Variant38084, - Variant38085, - Variant38086, - Variant38087, - Variant38088, - Variant38089, - Variant38090, - Variant38091, - Variant38092, - Variant38093, - Variant38094, - Variant38095, - Variant38096, - Variant38097, - Variant38098, - Variant38099, - Variant38100, - Variant38101, - Variant38102, - Variant38103, - Variant38104, - Variant38105, - Variant38106, - Variant38107, - Variant38108, - Variant38109, - Variant38110, - Variant38111, - Variant38112, - Variant38113, - Variant38114, - Variant38115, - Variant38116, - Variant38117, - Variant38118, - Variant38119, - Variant38120, - Variant38121, - Variant38122, - Variant38123, - Variant38124, - Variant38125, - Variant38126, - Variant38127, - Variant38128, - Variant38129, - Variant38130, - Variant38131, - Variant38132, - Variant38133, - Variant38134, - Variant38135, - Variant38136, - Variant38137, - Variant38138, - Variant38139, - Variant38140, - Variant38141, - Variant38142, - Variant38143, - Variant38144, - Variant38145, - Variant38146, - Variant38147, - Variant38148, - Variant38149, - Variant38150, - Variant38151, - Variant38152, - Variant38153, - Variant38154, - Variant38155, - Variant38156, - Variant38157, - Variant38158, - Variant38159, - Variant38160, - Variant38161, - Variant38162, - Variant38163, - Variant38164, - Variant38165, - Variant38166, - Variant38167, - Variant38168, - Variant38169, - Variant38170, - Variant38171, - Variant38172, - Variant38173, - Variant38174, - Variant38175, - Variant38176, - Variant38177, - Variant38178, - Variant38179, - Variant38180, - Variant38181, - Variant38182, - Variant38183, - Variant38184, - Variant38185, - Variant38186, - Variant38187, - Variant38188, - Variant38189, - Variant38190, - Variant38191, - Variant38192, - Variant38193, - Variant38194, - Variant38195, - Variant38196, - Variant38197, - Variant38198, - Variant38199, - Variant38200, - Variant38201, - Variant38202, - Variant38203, - Variant38204, - Variant38205, - Variant38206, - Variant38207, - Variant38208, - Variant38209, - Variant38210, - Variant38211, - Variant38212, - Variant38213, - Variant38214, - Variant38215, - Variant38216, - Variant38217, - Variant38218, - Variant38219, - Variant38220, - Variant38221, - Variant38222, - Variant38223, - Variant38224, - Variant38225, - Variant38226, - Variant38227, - Variant38228, - Variant38229, - Variant38230, - Variant38231, - Variant38232, - Variant38233, - Variant38234, - Variant38235, - Variant38236, - Variant38237, - Variant38238, - Variant38239, - Variant38240, - Variant38241, - Variant38242, - Variant38243, - Variant38244, - Variant38245, - Variant38246, - Variant38247, - Variant38248, - Variant38249, - Variant38250, - Variant38251, - Variant38252, - Variant38253, - Variant38254, - Variant38255, - Variant38256, - Variant38257, - Variant38258, - Variant38259, - Variant38260, - Variant38261, - Variant38262, - Variant38263, - Variant38264, - Variant38265, - Variant38266, - Variant38267, - Variant38268, - Variant38269, - Variant38270, - Variant38271, - Variant38272, - Variant38273, - Variant38274, - Variant38275, - Variant38276, - Variant38277, - Variant38278, - Variant38279, - Variant38280, - Variant38281, - Variant38282, - Variant38283, - Variant38284, - Variant38285, - Variant38286, - Variant38287, - Variant38288, - Variant38289, - Variant38290, - Variant38291, - Variant38292, - Variant38293, - Variant38294, - Variant38295, - Variant38296, - Variant38297, - Variant38298, - Variant38299, - Variant38300, - Variant38301, - Variant38302, - Variant38303, - Variant38304, - Variant38305, - Variant38306, - Variant38307, - Variant38308, - Variant38309, - Variant38310, - Variant38311, - Variant38312, - Variant38313, - Variant38314, - Variant38315, - Variant38316, - Variant38317, - Variant38318, - Variant38319, - Variant38320, - Variant38321, - Variant38322, - Variant38323, - Variant38324, - Variant38325, - Variant38326, - Variant38327, - Variant38328, - Variant38329, - Variant38330, - Variant38331, - Variant38332, - Variant38333, - Variant38334, - Variant38335, - Variant38336, - Variant38337, - Variant38338, - Variant38339, - Variant38340, - Variant38341, - Variant38342, - Variant38343, - Variant38344, - Variant38345, - Variant38346, - Variant38347, - Variant38348, - Variant38349, - Variant38350, - Variant38351, - Variant38352, - Variant38353, - Variant38354, - Variant38355, - Variant38356, - Variant38357, - Variant38358, - Variant38359, - Variant38360, - Variant38361, - Variant38362, - Variant38363, - Variant38364, - Variant38365, - Variant38366, - Variant38367, - Variant38368, - Variant38369, - Variant38370, - Variant38371, - Variant38372, - Variant38373, - Variant38374, - Variant38375, - Variant38376, - Variant38377, - Variant38378, - Variant38379, - Variant38380, - Variant38381, - Variant38382, - Variant38383, - Variant38384, - Variant38385, - Variant38386, - Variant38387, - Variant38388, - Variant38389, - Variant38390, - Variant38391, - Variant38392, - Variant38393, - Variant38394, - Variant38395, - Variant38396, - Variant38397, - Variant38398, - Variant38399, - Variant38400, - Variant38401, - Variant38402, - Variant38403, - Variant38404, - Variant38405, - Variant38406, - Variant38407, - Variant38408, - Variant38409, - Variant38410, - Variant38411, - Variant38412, - Variant38413, - Variant38414, - Variant38415, - Variant38416, - Variant38417, - Variant38418, - Variant38419, - Variant38420, - Variant38421, - Variant38422, - Variant38423, - Variant38424, - Variant38425, - Variant38426, - Variant38427, - Variant38428, - Variant38429, - Variant38430, - Variant38431, - Variant38432, - Variant38433, - Variant38434, - Variant38435, - Variant38436, - Variant38437, - Variant38438, - Variant38439, - Variant38440, - Variant38441, - Variant38442, - Variant38443, - Variant38444, - Variant38445, - Variant38446, - Variant38447, - Variant38448, - Variant38449, - Variant38450, - Variant38451, - Variant38452, - Variant38453, - Variant38454, - Variant38455, - Variant38456, - Variant38457, - Variant38458, - Variant38459, - Variant38460, - Variant38461, - Variant38462, - Variant38463, - Variant38464, - Variant38465, - Variant38466, - Variant38467, - Variant38468, - Variant38469, - Variant38470, - Variant38471, - Variant38472, - Variant38473, - Variant38474, - Variant38475, - Variant38476, - Variant38477, - Variant38478, - Variant38479, - Variant38480, - Variant38481, - Variant38482, - Variant38483, - Variant38484, - Variant38485, - Variant38486, - Variant38487, - Variant38488, - Variant38489, - Variant38490, - Variant38491, - Variant38492, - Variant38493, - Variant38494, - Variant38495, - Variant38496, - Variant38497, - Variant38498, - Variant38499, - Variant38500, - Variant38501, - Variant38502, - Variant38503, - Variant38504, - Variant38505, - Variant38506, - Variant38507, - Variant38508, - Variant38509, - Variant38510, - Variant38511, - Variant38512, - Variant38513, - Variant38514, - Variant38515, - Variant38516, - Variant38517, - Variant38518, - Variant38519, - Variant38520, - Variant38521, - Variant38522, - Variant38523, - Variant38524, - Variant38525, - Variant38526, - Variant38527, - Variant38528, - Variant38529, - Variant38530, - Variant38531, - Variant38532, - Variant38533, - Variant38534, - Variant38535, - Variant38536, - Variant38537, - Variant38538, - Variant38539, - Variant38540, - Variant38541, - Variant38542, - Variant38543, - Variant38544, - Variant38545, - Variant38546, - Variant38547, - Variant38548, - Variant38549, - Variant38550, - Variant38551, - Variant38552, - Variant38553, - Variant38554, - Variant38555, - Variant38556, - Variant38557, - Variant38558, - Variant38559, - Variant38560, - Variant38561, - Variant38562, - Variant38563, - Variant38564, - Variant38565, - Variant38566, - Variant38567, - Variant38568, - Variant38569, - Variant38570, - Variant38571, - Variant38572, - Variant38573, - Variant38574, - Variant38575, - Variant38576, - Variant38577, - Variant38578, - Variant38579, - Variant38580, - Variant38581, - Variant38582, - Variant38583, - Variant38584, - Variant38585, - Variant38586, - Variant38587, - Variant38588, - Variant38589, - Variant38590, - Variant38591, - Variant38592, - Variant38593, - Variant38594, - Variant38595, - Variant38596, - Variant38597, - Variant38598, - Variant38599, - Variant38600, - Variant38601, - Variant38602, - Variant38603, - Variant38604, - Variant38605, - Variant38606, - Variant38607, - Variant38608, - Variant38609, - Variant38610, - Variant38611, - Variant38612, - Variant38613, - Variant38614, - Variant38615, - Variant38616, - Variant38617, - Variant38618, - Variant38619, - Variant38620, - Variant38621, - Variant38622, - Variant38623, - Variant38624, - Variant38625, - Variant38626, - Variant38627, - Variant38628, - Variant38629, - Variant38630, - Variant38631, - Variant38632, - Variant38633, - Variant38634, - Variant38635, - Variant38636, - Variant38637, - Variant38638, - Variant38639, - Variant38640, - Variant38641, - Variant38642, - Variant38643, - Variant38644, - Variant38645, - Variant38646, - Variant38647, - Variant38648, - Variant38649, - Variant38650, - Variant38651, - Variant38652, - Variant38653, - Variant38654, - Variant38655, - Variant38656, - Variant38657, - Variant38658, - Variant38659, - Variant38660, - Variant38661, - Variant38662, - Variant38663, - Variant38664, - Variant38665, - Variant38666, - Variant38667, - Variant38668, - Variant38669, - Variant38670, - Variant38671, - Variant38672, - Variant38673, - Variant38674, - Variant38675, - Variant38676, - Variant38677, - Variant38678, - Variant38679, - Variant38680, - Variant38681, - Variant38682, - Variant38683, - Variant38684, - Variant38685, - Variant38686, - Variant38687, - Variant38688, - Variant38689, - Variant38690, - Variant38691, - Variant38692, - Variant38693, - Variant38694, - Variant38695, - Variant38696, - Variant38697, - Variant38698, - Variant38699, - Variant38700, - Variant38701, - Variant38702, - Variant38703, - Variant38704, - Variant38705, - Variant38706, - Variant38707, - Variant38708, - Variant38709, - Variant38710, - Variant38711, - Variant38712, - Variant38713, - Variant38714, - Variant38715, - Variant38716, - Variant38717, - Variant38718, - Variant38719, - Variant38720, - Variant38721, - Variant38722, - Variant38723, - Variant38724, - Variant38725, - Variant38726, - Variant38727, - Variant38728, - Variant38729, - Variant38730, - Variant38731, - Variant38732, - Variant38733, - Variant38734, - Variant38735, - Variant38736, - Variant38737, - Variant38738, - Variant38739, - Variant38740, - Variant38741, - Variant38742, - Variant38743, - Variant38744, - Variant38745, - Variant38746, - Variant38747, - Variant38748, - Variant38749, - Variant38750, - Variant38751, - Variant38752, - Variant38753, - Variant38754, - Variant38755, - Variant38756, - Variant38757, - Variant38758, - Variant38759, - Variant38760, - Variant38761, - Variant38762, - Variant38763, - Variant38764, - Variant38765, - Variant38766, - Variant38767, - Variant38768, - Variant38769, - Variant38770, - Variant38771, - Variant38772, - Variant38773, - Variant38774, - Variant38775, - Variant38776, - Variant38777, - Variant38778, - Variant38779, - Variant38780, - Variant38781, - Variant38782, - Variant38783, - Variant38784, - Variant38785, - Variant38786, - Variant38787, - Variant38788, - Variant38789, - Variant38790, - Variant38791, - Variant38792, - Variant38793, - Variant38794, - Variant38795, - Variant38796, - Variant38797, - Variant38798, - Variant38799, - Variant38800, - Variant38801, - Variant38802, - Variant38803, - Variant38804, - Variant38805, - Variant38806, - Variant38807, - Variant38808, - Variant38809, - Variant38810, - Variant38811, - Variant38812, - Variant38813, - Variant38814, - Variant38815, - Variant38816, - Variant38817, - Variant38818, - Variant38819, - Variant38820, - Variant38821, - Variant38822, - Variant38823, - Variant38824, - Variant38825, - Variant38826, - Variant38827, - Variant38828, - Variant38829, - Variant38830, - Variant38831, - Variant38832, - Variant38833, - Variant38834, - Variant38835, - Variant38836, - Variant38837, - Variant38838, - Variant38839, - Variant38840, - Variant38841, - Variant38842, - Variant38843, - Variant38844, - Variant38845, - Variant38846, - Variant38847, - Variant38848, - Variant38849, - Variant38850, - Variant38851, - Variant38852, - Variant38853, - Variant38854, - Variant38855, - Variant38856, - Variant38857, - Variant38858, - Variant38859, - Variant38860, - Variant38861, - Variant38862, - Variant38863, - Variant38864, - Variant38865, - Variant38866, - Variant38867, - Variant38868, - Variant38869, - Variant38870, - Variant38871, - Variant38872, - Variant38873, - Variant38874, - Variant38875, - Variant38876, - Variant38877, - Variant38878, - Variant38879, - Variant38880, - Variant38881, - Variant38882, - Variant38883, - Variant38884, - Variant38885, - Variant38886, - Variant38887, - Variant38888, - Variant38889, - Variant38890, - Variant38891, - Variant38892, - Variant38893, - Variant38894, - Variant38895, - Variant38896, - Variant38897, - Variant38898, - Variant38899, - Variant38900, - Variant38901, - Variant38902, - Variant38903, - Variant38904, - Variant38905, - Variant38906, - Variant38907, - Variant38908, - Variant38909, - Variant38910, - Variant38911, - Variant38912, - Variant38913, - Variant38914, - Variant38915, - Variant38916, - Variant38917, - Variant38918, - Variant38919, - Variant38920, - Variant38921, - Variant38922, - Variant38923, - Variant38924, - Variant38925, - Variant38926, - Variant38927, - Variant38928, - Variant38929, - Variant38930, - Variant38931, - Variant38932, - Variant38933, - Variant38934, - Variant38935, - Variant38936, - Variant38937, - Variant38938, - Variant38939, - Variant38940, - Variant38941, - Variant38942, - Variant38943, - Variant38944, - Variant38945, - Variant38946, - Variant38947, - Variant38948, - Variant38949, - Variant38950, - Variant38951, - Variant38952, - Variant38953, - Variant38954, - Variant38955, - Variant38956, - Variant38957, - Variant38958, - Variant38959, - Variant38960, - Variant38961, - Variant38962, - Variant38963, - Variant38964, - Variant38965, - Variant38966, - Variant38967, - Variant38968, - Variant38969, - Variant38970, - Variant38971, - Variant38972, - Variant38973, - Variant38974, - Variant38975, - Variant38976, - Variant38977, - Variant38978, - Variant38979, - Variant38980, - Variant38981, - Variant38982, - Variant38983, - Variant38984, - Variant38985, - Variant38986, - Variant38987, - Variant38988, - Variant38989, - Variant38990, - Variant38991, - Variant38992, - Variant38993, - Variant38994, - Variant38995, - Variant38996, - Variant38997, - Variant38998, - Variant38999, - Variant39000, - Variant39001, - Variant39002, - Variant39003, - Variant39004, - Variant39005, - Variant39006, - Variant39007, - Variant39008, - Variant39009, - Variant39010, - Variant39011, - Variant39012, - Variant39013, - Variant39014, - Variant39015, - Variant39016, - Variant39017, - Variant39018, - Variant39019, - Variant39020, - Variant39021, - Variant39022, - Variant39023, - Variant39024, - Variant39025, - Variant39026, - Variant39027, - Variant39028, - Variant39029, - Variant39030, - Variant39031, - Variant39032, - Variant39033, - Variant39034, - Variant39035, - Variant39036, - Variant39037, - Variant39038, - Variant39039, - Variant39040, - Variant39041, - Variant39042, - Variant39043, - Variant39044, - Variant39045, - Variant39046, - Variant39047, - Variant39048, - Variant39049, - Variant39050, - Variant39051, - Variant39052, - Variant39053, - Variant39054, - Variant39055, - Variant39056, - Variant39057, - Variant39058, - Variant39059, - Variant39060, - Variant39061, - Variant39062, - Variant39063, - Variant39064, - Variant39065, - Variant39066, - Variant39067, - Variant39068, - Variant39069, - Variant39070, - Variant39071, - Variant39072, - Variant39073, - Variant39074, - Variant39075, - Variant39076, - Variant39077, - Variant39078, - Variant39079, - Variant39080, - Variant39081, - Variant39082, - Variant39083, - Variant39084, - Variant39085, - Variant39086, - Variant39087, - Variant39088, - Variant39089, - Variant39090, - Variant39091, - Variant39092, - Variant39093, - Variant39094, - Variant39095, - Variant39096, - Variant39097, - Variant39098, - Variant39099, - Variant39100, - Variant39101, - Variant39102, - Variant39103, - Variant39104, - Variant39105, - Variant39106, - Variant39107, - Variant39108, - Variant39109, - Variant39110, - Variant39111, - Variant39112, - Variant39113, - Variant39114, - Variant39115, - Variant39116, - Variant39117, - Variant39118, - Variant39119, - Variant39120, - Variant39121, - Variant39122, - Variant39123, - Variant39124, - Variant39125, - Variant39126, - Variant39127, - Variant39128, - Variant39129, - Variant39130, - Variant39131, - Variant39132, - Variant39133, - Variant39134, - Variant39135, - Variant39136, - Variant39137, - Variant39138, - Variant39139, - Variant39140, - Variant39141, - Variant39142, - Variant39143, - Variant39144, - Variant39145, - Variant39146, - Variant39147, - Variant39148, - Variant39149, - Variant39150, - Variant39151, - Variant39152, - Variant39153, - Variant39154, - Variant39155, - Variant39156, - Variant39157, - Variant39158, - Variant39159, - Variant39160, - Variant39161, - Variant39162, - Variant39163, - Variant39164, - Variant39165, - Variant39166, - Variant39167, - Variant39168, - Variant39169, - Variant39170, - Variant39171, - Variant39172, - Variant39173, - Variant39174, - Variant39175, - Variant39176, - Variant39177, - Variant39178, - Variant39179, - Variant39180, - Variant39181, - Variant39182, - Variant39183, - Variant39184, - Variant39185, - Variant39186, - Variant39187, - Variant39188, - Variant39189, - Variant39190, - Variant39191, - Variant39192, - Variant39193, - Variant39194, - Variant39195, - Variant39196, - Variant39197, - Variant39198, - Variant39199, - Variant39200, - Variant39201, - Variant39202, - Variant39203, - Variant39204, - Variant39205, - Variant39206, - Variant39207, - Variant39208, - Variant39209, - Variant39210, - Variant39211, - Variant39212, - Variant39213, - Variant39214, - Variant39215, - Variant39216, - Variant39217, - Variant39218, - Variant39219, - Variant39220, - Variant39221, - Variant39222, - Variant39223, - Variant39224, - Variant39225, - Variant39226, - Variant39227, - Variant39228, - Variant39229, - Variant39230, - Variant39231, - Variant39232, - Variant39233, - Variant39234, - Variant39235, - Variant39236, - Variant39237, - Variant39238, - Variant39239, - Variant39240, - Variant39241, - Variant39242, - Variant39243, - Variant39244, - Variant39245, - Variant39246, - Variant39247, - Variant39248, - Variant39249, - Variant39250, - Variant39251, - Variant39252, - Variant39253, - Variant39254, - Variant39255, - Variant39256, - Variant39257, - Variant39258, - Variant39259, - Variant39260, - Variant39261, - Variant39262, - Variant39263, - Variant39264, - Variant39265, - Variant39266, - Variant39267, - Variant39268, - Variant39269, - Variant39270, - Variant39271, - Variant39272, - Variant39273, - Variant39274, - Variant39275, - Variant39276, - Variant39277, - Variant39278, - Variant39279, - Variant39280, - Variant39281, - Variant39282, - Variant39283, - Variant39284, - Variant39285, - Variant39286, - Variant39287, - Variant39288, - Variant39289, - Variant39290, - Variant39291, - Variant39292, - Variant39293, - Variant39294, - Variant39295, - Variant39296, - Variant39297, - Variant39298, - Variant39299, - Variant39300, - Variant39301, - Variant39302, - Variant39303, - Variant39304, - Variant39305, - Variant39306, - Variant39307, - Variant39308, - Variant39309, - Variant39310, - Variant39311, - Variant39312, - Variant39313, - Variant39314, - Variant39315, - Variant39316, - Variant39317, - Variant39318, - Variant39319, - Variant39320, - Variant39321, - Variant39322, - Variant39323, - Variant39324, - Variant39325, - Variant39326, - Variant39327, - Variant39328, - Variant39329, - Variant39330, - Variant39331, - Variant39332, - Variant39333, - Variant39334, - Variant39335, - Variant39336, - Variant39337, - Variant39338, - Variant39339, - Variant39340, - Variant39341, - Variant39342, - Variant39343, - Variant39344, - Variant39345, - Variant39346, - Variant39347, - Variant39348, - Variant39349, - Variant39350, - Variant39351, - Variant39352, - Variant39353, - Variant39354, - Variant39355, - Variant39356, - Variant39357, - Variant39358, - Variant39359, - Variant39360, - Variant39361, - Variant39362, - Variant39363, - Variant39364, - Variant39365, - Variant39366, - Variant39367, - Variant39368, - Variant39369, - Variant39370, - Variant39371, - Variant39372, - Variant39373, - Variant39374, - Variant39375, - Variant39376, - Variant39377, - Variant39378, - Variant39379, - Variant39380, - Variant39381, - Variant39382, - Variant39383, - Variant39384, - Variant39385, - Variant39386, - Variant39387, - Variant39388, - Variant39389, - Variant39390, - Variant39391, - Variant39392, - Variant39393, - Variant39394, - Variant39395, - Variant39396, - Variant39397, - Variant39398, - Variant39399, - Variant39400, - Variant39401, - Variant39402, - Variant39403, - Variant39404, - Variant39405, - Variant39406, - Variant39407, - Variant39408, - Variant39409, - Variant39410, - Variant39411, - Variant39412, - Variant39413, - Variant39414, - Variant39415, - Variant39416, - Variant39417, - Variant39418, - Variant39419, - Variant39420, - Variant39421, - Variant39422, - Variant39423, - Variant39424, - Variant39425, - Variant39426, - Variant39427, - Variant39428, - Variant39429, - Variant39430, - Variant39431, - Variant39432, - Variant39433, - Variant39434, - Variant39435, - Variant39436, - Variant39437, - Variant39438, - Variant39439, - Variant39440, - Variant39441, - Variant39442, - Variant39443, - Variant39444, - Variant39445, - Variant39446, - Variant39447, - Variant39448, - Variant39449, - Variant39450, - Variant39451, - Variant39452, - Variant39453, - Variant39454, - Variant39455, - Variant39456, - Variant39457, - Variant39458, - Variant39459, - Variant39460, - Variant39461, - Variant39462, - Variant39463, - Variant39464, - Variant39465, - Variant39466, - Variant39467, - Variant39468, - Variant39469, - Variant39470, - Variant39471, - Variant39472, - Variant39473, - Variant39474, - Variant39475, - Variant39476, - Variant39477, - Variant39478, - Variant39479, - Variant39480, - Variant39481, - Variant39482, - Variant39483, - Variant39484, - Variant39485, - Variant39486, - Variant39487, - Variant39488, - Variant39489, - Variant39490, - Variant39491, - Variant39492, - Variant39493, - Variant39494, - Variant39495, - Variant39496, - Variant39497, - Variant39498, - Variant39499, - Variant39500, - Variant39501, - Variant39502, - Variant39503, - Variant39504, - Variant39505, - Variant39506, - Variant39507, - Variant39508, - Variant39509, - Variant39510, - Variant39511, - Variant39512, - Variant39513, - Variant39514, - Variant39515, - Variant39516, - Variant39517, - Variant39518, - Variant39519, - Variant39520, - Variant39521, - Variant39522, - Variant39523, - Variant39524, - Variant39525, - Variant39526, - Variant39527, - Variant39528, - Variant39529, - Variant39530, - Variant39531, - Variant39532, - Variant39533, - Variant39534, - Variant39535, - Variant39536, - Variant39537, - Variant39538, - Variant39539, - Variant39540, - Variant39541, - Variant39542, - Variant39543, - Variant39544, - Variant39545, - Variant39546, - Variant39547, - Variant39548, - Variant39549, - Variant39550, - Variant39551, - Variant39552, - Variant39553, - Variant39554, - Variant39555, - Variant39556, - Variant39557, - Variant39558, - Variant39559, - Variant39560, - Variant39561, - Variant39562, - Variant39563, - Variant39564, - Variant39565, - Variant39566, - Variant39567, - Variant39568, - Variant39569, - Variant39570, - Variant39571, - Variant39572, - Variant39573, - Variant39574, - Variant39575, - Variant39576, - Variant39577, - Variant39578, - Variant39579, - Variant39580, - Variant39581, - Variant39582, - Variant39583, - Variant39584, - Variant39585, - Variant39586, - Variant39587, - Variant39588, - Variant39589, - Variant39590, - Variant39591, - Variant39592, - Variant39593, - Variant39594, - Variant39595, - Variant39596, - Variant39597, - Variant39598, - Variant39599, - Variant39600, - Variant39601, - Variant39602, - Variant39603, - Variant39604, - Variant39605, - Variant39606, - Variant39607, - Variant39608, - Variant39609, - Variant39610, - Variant39611, - Variant39612, - Variant39613, - Variant39614, - Variant39615, - Variant39616, - Variant39617, - Variant39618, - Variant39619, - Variant39620, - Variant39621, - Variant39622, - Variant39623, - Variant39624, - Variant39625, - Variant39626, - Variant39627, - Variant39628, - Variant39629, - Variant39630, - Variant39631, - Variant39632, - Variant39633, - Variant39634, - Variant39635, - Variant39636, - Variant39637, - Variant39638, - Variant39639, - Variant39640, - Variant39641, - Variant39642, - Variant39643, - Variant39644, - Variant39645, - Variant39646, - Variant39647, - Variant39648, - Variant39649, - Variant39650, - Variant39651, - Variant39652, - Variant39653, - Variant39654, - Variant39655, - Variant39656, - Variant39657, - Variant39658, - Variant39659, - Variant39660, - Variant39661, - Variant39662, - Variant39663, - Variant39664, - Variant39665, - Variant39666, - Variant39667, - Variant39668, - Variant39669, - Variant39670, - Variant39671, - Variant39672, - Variant39673, - Variant39674, - Variant39675, - Variant39676, - Variant39677, - Variant39678, - Variant39679, - Variant39680, - Variant39681, - Variant39682, - Variant39683, - Variant39684, - Variant39685, - Variant39686, - Variant39687, - Variant39688, - Variant39689, - Variant39690, - Variant39691, - Variant39692, - Variant39693, - Variant39694, - Variant39695, - Variant39696, - Variant39697, - Variant39698, - Variant39699, - Variant39700, - Variant39701, - Variant39702, - Variant39703, - Variant39704, - Variant39705, - Variant39706, - Variant39707, - Variant39708, - Variant39709, - Variant39710, - Variant39711, - Variant39712, - Variant39713, - Variant39714, - Variant39715, - Variant39716, - Variant39717, - Variant39718, - Variant39719, - Variant39720, - Variant39721, - Variant39722, - Variant39723, - Variant39724, - Variant39725, - Variant39726, - Variant39727, - Variant39728, - Variant39729, - Variant39730, - Variant39731, - Variant39732, - Variant39733, - Variant39734, - Variant39735, - Variant39736, - Variant39737, - Variant39738, - Variant39739, - Variant39740, - Variant39741, - Variant39742, - Variant39743, - Variant39744, - Variant39745, - Variant39746, - Variant39747, - Variant39748, - Variant39749, - Variant39750, - Variant39751, - Variant39752, - Variant39753, - Variant39754, - Variant39755, - Variant39756, - Variant39757, - Variant39758, - Variant39759, - Variant39760, - Variant39761, - Variant39762, - Variant39763, - Variant39764, - Variant39765, - Variant39766, - Variant39767, - Variant39768, - Variant39769, - Variant39770, - Variant39771, - Variant39772, - Variant39773, - Variant39774, - Variant39775, - Variant39776, - Variant39777, - Variant39778, - Variant39779, - Variant39780, - Variant39781, - Variant39782, - Variant39783, - Variant39784, - Variant39785, - Variant39786, - Variant39787, - Variant39788, - Variant39789, - Variant39790, - Variant39791, - Variant39792, - Variant39793, - Variant39794, - Variant39795, - Variant39796, - Variant39797, - Variant39798, - Variant39799, - Variant39800, - Variant39801, - Variant39802, - Variant39803, - Variant39804, - Variant39805, - Variant39806, - Variant39807, - Variant39808, - Variant39809, - Variant39810, - Variant39811, - Variant39812, - Variant39813, - Variant39814, - Variant39815, - Variant39816, - Variant39817, - Variant39818, - Variant39819, - Variant39820, - Variant39821, - Variant39822, - Variant39823, - Variant39824, - Variant39825, - Variant39826, - Variant39827, - Variant39828, - Variant39829, - Variant39830, - Variant39831, - Variant39832, - Variant39833, - Variant39834, - Variant39835, - Variant39836, - Variant39837, - Variant39838, - Variant39839, - Variant39840, - Variant39841, - Variant39842, - Variant39843, - Variant39844, - Variant39845, - Variant39846, - Variant39847, - Variant39848, - Variant39849, - Variant39850, - Variant39851, - Variant39852, - Variant39853, - Variant39854, - Variant39855, - Variant39856, - Variant39857, - Variant39858, - Variant39859, - Variant39860, - Variant39861, - Variant39862, - Variant39863, - Variant39864, - Variant39865, - Variant39866, - Variant39867, - Variant39868, - Variant39869, - Variant39870, - Variant39871, - Variant39872, - Variant39873, - Variant39874, - Variant39875, - Variant39876, - Variant39877, - Variant39878, - Variant39879, - Variant39880, - Variant39881, - Variant39882, - Variant39883, - Variant39884, - Variant39885, - Variant39886, - Variant39887, - Variant39888, - Variant39889, - Variant39890, - Variant39891, - Variant39892, - Variant39893, - Variant39894, - Variant39895, - Variant39896, - Variant39897, - Variant39898, - Variant39899, - Variant39900, - Variant39901, - Variant39902, - Variant39903, - Variant39904, - Variant39905, - Variant39906, - Variant39907, - Variant39908, - Variant39909, - Variant39910, - Variant39911, - Variant39912, - Variant39913, - Variant39914, - Variant39915, - Variant39916, - Variant39917, - Variant39918, - Variant39919, - Variant39920, - Variant39921, - Variant39922, - Variant39923, - Variant39924, - Variant39925, - Variant39926, - Variant39927, - Variant39928, - Variant39929, - Variant39930, - Variant39931, - Variant39932, - Variant39933, - Variant39934, - Variant39935, - Variant39936, - Variant39937, - Variant39938, - Variant39939, - Variant39940, - Variant39941, - Variant39942, - Variant39943, - Variant39944, - Variant39945, - Variant39946, - Variant39947, - Variant39948, - Variant39949, - Variant39950, - Variant39951, - Variant39952, - Variant39953, - Variant39954, - Variant39955, - Variant39956, - Variant39957, - Variant39958, - Variant39959, - Variant39960, - Variant39961, - Variant39962, - Variant39963, - Variant39964, - Variant39965, - Variant39966, - Variant39967, - Variant39968, - Variant39969, - Variant39970, - Variant39971, - Variant39972, - Variant39973, - Variant39974, - Variant39975, - Variant39976, - Variant39977, - Variant39978, - Variant39979, - Variant39980, - Variant39981, - Variant39982, - Variant39983, - Variant39984, - Variant39985, - Variant39986, - Variant39987, - Variant39988, - Variant39989, - Variant39990, - Variant39991, - Variant39992, - Variant39993, - Variant39994, - Variant39995, - Variant39996, - Variant39997, - Variant39998, - Variant39999, - Variant40000, - Variant40001, - Variant40002, - Variant40003, - Variant40004, - Variant40005, - Variant40006, - Variant40007, - Variant40008, - Variant40009, - Variant40010, - Variant40011, - Variant40012, - Variant40013, - Variant40014, - Variant40015, - Variant40016, - Variant40017, - Variant40018, - Variant40019, - Variant40020, - Variant40021, - Variant40022, - Variant40023, - Variant40024, - Variant40025, - Variant40026, - Variant40027, - Variant40028, - Variant40029, - Variant40030, - Variant40031, - Variant40032, - Variant40033, - Variant40034, - Variant40035, - Variant40036, - Variant40037, - Variant40038, - Variant40039, - Variant40040, - Variant40041, - Variant40042, - Variant40043, - Variant40044, - Variant40045, - Variant40046, - Variant40047, - Variant40048, - Variant40049, - Variant40050, - Variant40051, - Variant40052, - Variant40053, - Variant40054, - Variant40055, - Variant40056, - Variant40057, - Variant40058, - Variant40059, - Variant40060, - Variant40061, - Variant40062, - Variant40063, - Variant40064, - Variant40065, - Variant40066, - Variant40067, - Variant40068, - Variant40069, - Variant40070, - Variant40071, - Variant40072, - Variant40073, - Variant40074, - Variant40075, - Variant40076, - Variant40077, - Variant40078, - Variant40079, - Variant40080, - Variant40081, - Variant40082, - Variant40083, - Variant40084, - Variant40085, - Variant40086, - Variant40087, - Variant40088, - Variant40089, - Variant40090, - Variant40091, - Variant40092, - Variant40093, - Variant40094, - Variant40095, - Variant40096, - Variant40097, - Variant40098, - Variant40099, - Variant40100, - Variant40101, - Variant40102, - Variant40103, - Variant40104, - Variant40105, - Variant40106, - Variant40107, - Variant40108, - Variant40109, - Variant40110, - Variant40111, - Variant40112, - Variant40113, - Variant40114, - Variant40115, - Variant40116, - Variant40117, - Variant40118, - Variant40119, - Variant40120, - Variant40121, - Variant40122, - Variant40123, - Variant40124, - Variant40125, - Variant40126, - Variant40127, - Variant40128, - Variant40129, - Variant40130, - Variant40131, - Variant40132, - Variant40133, - Variant40134, - Variant40135, - Variant40136, - Variant40137, - Variant40138, - Variant40139, - Variant40140, - Variant40141, - Variant40142, - Variant40143, - Variant40144, - Variant40145, - Variant40146, - Variant40147, - Variant40148, - Variant40149, - Variant40150, - Variant40151, - Variant40152, - Variant40153, - Variant40154, - Variant40155, - Variant40156, - Variant40157, - Variant40158, - Variant40159, - Variant40160, - Variant40161, - Variant40162, - Variant40163, - Variant40164, - Variant40165, - Variant40166, - Variant40167, - Variant40168, - Variant40169, - Variant40170, - Variant40171, - Variant40172, - Variant40173, - Variant40174, - Variant40175, - Variant40176, - Variant40177, - Variant40178, - Variant40179, - Variant40180, - Variant40181, - Variant40182, - Variant40183, - Variant40184, - Variant40185, - Variant40186, - Variant40187, - Variant40188, - Variant40189, - Variant40190, - Variant40191, - Variant40192, - Variant40193, - Variant40194, - Variant40195, - Variant40196, - Variant40197, - Variant40198, - Variant40199, - Variant40200, - Variant40201, - Variant40202, - Variant40203, - Variant40204, - Variant40205, - Variant40206, - Variant40207, - Variant40208, - Variant40209, - Variant40210, - Variant40211, - Variant40212, - Variant40213, - Variant40214, - Variant40215, - Variant40216, - Variant40217, - Variant40218, - Variant40219, - Variant40220, - Variant40221, - Variant40222, - Variant40223, - Variant40224, - Variant40225, - Variant40226, - Variant40227, - Variant40228, - Variant40229, - Variant40230, - Variant40231, - Variant40232, - Variant40233, - Variant40234, - Variant40235, - Variant40236, - Variant40237, - Variant40238, - Variant40239, - Variant40240, - Variant40241, - Variant40242, - Variant40243, - Variant40244, - Variant40245, - Variant40246, - Variant40247, - Variant40248, - Variant40249, - Variant40250, - Variant40251, - Variant40252, - Variant40253, - Variant40254, - Variant40255, - Variant40256, - Variant40257, - Variant40258, - Variant40259, - Variant40260, - Variant40261, - Variant40262, - Variant40263, - Variant40264, - Variant40265, - Variant40266, - Variant40267, - Variant40268, - Variant40269, - Variant40270, - Variant40271, - Variant40272, - Variant40273, - Variant40274, - Variant40275, - Variant40276, - Variant40277, - Variant40278, - Variant40279, - Variant40280, - Variant40281, - Variant40282, - Variant40283, - Variant40284, - Variant40285, - Variant40286, - Variant40287, - Variant40288, - Variant40289, - Variant40290, - Variant40291, - Variant40292, - Variant40293, - Variant40294, - Variant40295, - Variant40296, - Variant40297, - Variant40298, - Variant40299, - Variant40300, - Variant40301, - Variant40302, - Variant40303, - Variant40304, - Variant40305, - Variant40306, - Variant40307, - Variant40308, - Variant40309, - Variant40310, - Variant40311, - Variant40312, - Variant40313, - Variant40314, - Variant40315, - Variant40316, - Variant40317, - Variant40318, - Variant40319, - Variant40320, - Variant40321, - Variant40322, - Variant40323, - Variant40324, - Variant40325, - Variant40326, - Variant40327, - Variant40328, - Variant40329, - Variant40330, - Variant40331, - Variant40332, - Variant40333, - Variant40334, - Variant40335, - Variant40336, - Variant40337, - Variant40338, - Variant40339, - Variant40340, - Variant40341, - Variant40342, - Variant40343, - Variant40344, - Variant40345, - Variant40346, - Variant40347, - Variant40348, - Variant40349, - Variant40350, - Variant40351, - Variant40352, - Variant40353, - Variant40354, - Variant40355, - Variant40356, - Variant40357, - Variant40358, - Variant40359, - Variant40360, - Variant40361, - Variant40362, - Variant40363, - Variant40364, - Variant40365, - Variant40366, - Variant40367, - Variant40368, - Variant40369, - Variant40370, - Variant40371, - Variant40372, - Variant40373, - Variant40374, - Variant40375, - Variant40376, - Variant40377, - Variant40378, - Variant40379, - Variant40380, - Variant40381, - Variant40382, - Variant40383, - Variant40384, - Variant40385, - Variant40386, - Variant40387, - Variant40388, - Variant40389, - Variant40390, - Variant40391, - Variant40392, - Variant40393, - Variant40394, - Variant40395, - Variant40396, - Variant40397, - Variant40398, - Variant40399, - Variant40400, - Variant40401, - Variant40402, - Variant40403, - Variant40404, - Variant40405, - Variant40406, - Variant40407, - Variant40408, - Variant40409, - Variant40410, - Variant40411, - Variant40412, - Variant40413, - Variant40414, - Variant40415, - Variant40416, - Variant40417, - Variant40418, - Variant40419, - Variant40420, - Variant40421, - Variant40422, - Variant40423, - Variant40424, - Variant40425, - Variant40426, - Variant40427, - Variant40428, - Variant40429, - Variant40430, - Variant40431, - Variant40432, - Variant40433, - Variant40434, - Variant40435, - Variant40436, - Variant40437, - Variant40438, - Variant40439, - Variant40440, - Variant40441, - Variant40442, - Variant40443, - Variant40444, - Variant40445, - Variant40446, - Variant40447, - Variant40448, - Variant40449, - Variant40450, - Variant40451, - Variant40452, - Variant40453, - Variant40454, - Variant40455, - Variant40456, - Variant40457, - Variant40458, - Variant40459, - Variant40460, - Variant40461, - Variant40462, - Variant40463, - Variant40464, - Variant40465, - Variant40466, - Variant40467, - Variant40468, - Variant40469, - Variant40470, - Variant40471, - Variant40472, - Variant40473, - Variant40474, - Variant40475, - Variant40476, - Variant40477, - Variant40478, - Variant40479, - Variant40480, - Variant40481, - Variant40482, - Variant40483, - Variant40484, - Variant40485, - Variant40486, - Variant40487, - Variant40488, - Variant40489, - Variant40490, - Variant40491, - Variant40492, - Variant40493, - Variant40494, - Variant40495, - Variant40496, - Variant40497, - Variant40498, - Variant40499, - Variant40500, - Variant40501, - Variant40502, - Variant40503, - Variant40504, - Variant40505, - Variant40506, - Variant40507, - Variant40508, - Variant40509, - Variant40510, - Variant40511, - Variant40512, - Variant40513, - Variant40514, - Variant40515, - Variant40516, - Variant40517, - Variant40518, - Variant40519, - Variant40520, - Variant40521, - Variant40522, - Variant40523, - Variant40524, - Variant40525, - Variant40526, - Variant40527, - Variant40528, - Variant40529, - Variant40530, - Variant40531, - Variant40532, - Variant40533, - Variant40534, - Variant40535, - Variant40536, - Variant40537, - Variant40538, - Variant40539, - Variant40540, - Variant40541, - Variant40542, - Variant40543, - Variant40544, - Variant40545, - Variant40546, - Variant40547, - Variant40548, - Variant40549, - Variant40550, - Variant40551, - Variant40552, - Variant40553, - Variant40554, - Variant40555, - Variant40556, - Variant40557, - Variant40558, - Variant40559, - Variant40560, - Variant40561, - Variant40562, - Variant40563, - Variant40564, - Variant40565, - Variant40566, - Variant40567, - Variant40568, - Variant40569, - Variant40570, - Variant40571, - Variant40572, - Variant40573, - Variant40574, - Variant40575, - Variant40576, - Variant40577, - Variant40578, - Variant40579, - Variant40580, - Variant40581, - Variant40582, - Variant40583, - Variant40584, - Variant40585, - Variant40586, - Variant40587, - Variant40588, - Variant40589, - Variant40590, - Variant40591, - Variant40592, - Variant40593, - Variant40594, - Variant40595, - Variant40596, - Variant40597, - Variant40598, - Variant40599, - Variant40600, - Variant40601, - Variant40602, - Variant40603, - Variant40604, - Variant40605, - Variant40606, - Variant40607, - Variant40608, - Variant40609, - Variant40610, - Variant40611, - Variant40612, - Variant40613, - Variant40614, - Variant40615, - Variant40616, - Variant40617, - Variant40618, - Variant40619, - Variant40620, - Variant40621, - Variant40622, - Variant40623, - Variant40624, - Variant40625, - Variant40626, - Variant40627, - Variant40628, - Variant40629, - Variant40630, - Variant40631, - Variant40632, - Variant40633, - Variant40634, - Variant40635, - Variant40636, - Variant40637, - Variant40638, - Variant40639, - Variant40640, - Variant40641, - Variant40642, - Variant40643, - Variant40644, - Variant40645, - Variant40646, - Variant40647, - Variant40648, - Variant40649, - Variant40650, - Variant40651, - Variant40652, - Variant40653, - Variant40654, - Variant40655, - Variant40656, - Variant40657, - Variant40658, - Variant40659, - Variant40660, - Variant40661, - Variant40662, - Variant40663, - Variant40664, - Variant40665, - Variant40666, - Variant40667, - Variant40668, - Variant40669, - Variant40670, - Variant40671, - Variant40672, - Variant40673, - Variant40674, - Variant40675, - Variant40676, - Variant40677, - Variant40678, - Variant40679, - Variant40680, - Variant40681, - Variant40682, - Variant40683, - Variant40684, - Variant40685, - Variant40686, - Variant40687, - Variant40688, - Variant40689, - Variant40690, - Variant40691, - Variant40692, - Variant40693, - Variant40694, - Variant40695, - Variant40696, - Variant40697, - Variant40698, - Variant40699, - Variant40700, - Variant40701, - Variant40702, - Variant40703, - Variant40704, - Variant40705, - Variant40706, - Variant40707, - Variant40708, - Variant40709, - Variant40710, - Variant40711, - Variant40712, - Variant40713, - Variant40714, - Variant40715, - Variant40716, - Variant40717, - Variant40718, - Variant40719, - Variant40720, - Variant40721, - Variant40722, - Variant40723, - Variant40724, - Variant40725, - Variant40726, - Variant40727, - Variant40728, - Variant40729, - Variant40730, - Variant40731, - Variant40732, - Variant40733, - Variant40734, - Variant40735, - Variant40736, - Variant40737, - Variant40738, - Variant40739, - Variant40740, - Variant40741, - Variant40742, - Variant40743, - Variant40744, - Variant40745, - Variant40746, - Variant40747, - Variant40748, - Variant40749, - Variant40750, - Variant40751, - Variant40752, - Variant40753, - Variant40754, - Variant40755, - Variant40756, - Variant40757, - Variant40758, - Variant40759, - Variant40760, - Variant40761, - Variant40762, - Variant40763, - Variant40764, - Variant40765, - Variant40766, - Variant40767, - Variant40768, - Variant40769, - Variant40770, - Variant40771, - Variant40772, - Variant40773, - Variant40774, - Variant40775, - Variant40776, - Variant40777, - Variant40778, - Variant40779, - Variant40780, - Variant40781, - Variant40782, - Variant40783, - Variant40784, - Variant40785, - Variant40786, - Variant40787, - Variant40788, - Variant40789, - Variant40790, - Variant40791, - Variant40792, - Variant40793, - Variant40794, - Variant40795, - Variant40796, - Variant40797, - Variant40798, - Variant40799, - Variant40800, - Variant40801, - Variant40802, - Variant40803, - Variant40804, - Variant40805, - Variant40806, - Variant40807, - Variant40808, - Variant40809, - Variant40810, - Variant40811, - Variant40812, - Variant40813, - Variant40814, - Variant40815, - Variant40816, - Variant40817, - Variant40818, - Variant40819, - Variant40820, - Variant40821, - Variant40822, - Variant40823, - Variant40824, - Variant40825, - Variant40826, - Variant40827, - Variant40828, - Variant40829, - Variant40830, - Variant40831, - Variant40832, - Variant40833, - Variant40834, - Variant40835, - Variant40836, - Variant40837, - Variant40838, - Variant40839, - Variant40840, - Variant40841, - Variant40842, - Variant40843, - Variant40844, - Variant40845, - Variant40846, - Variant40847, - Variant40848, - Variant40849, - Variant40850, - Variant40851, - Variant40852, - Variant40853, - Variant40854, - Variant40855, - Variant40856, - Variant40857, - Variant40858, - Variant40859, - Variant40860, - Variant40861, - Variant40862, - Variant40863, - Variant40864, - Variant40865, - Variant40866, - Variant40867, - Variant40868, - Variant40869, - Variant40870, - Variant40871, - Variant40872, - Variant40873, - Variant40874, - Variant40875, - Variant40876, - Variant40877, - Variant40878, - Variant40879, - Variant40880, - Variant40881, - Variant40882, - Variant40883, - Variant40884, - Variant40885, - Variant40886, - Variant40887, - Variant40888, - Variant40889, - Variant40890, - Variant40891, - Variant40892, - Variant40893, - Variant40894, - Variant40895, - Variant40896, - Variant40897, - Variant40898, - Variant40899, - Variant40900, - Variant40901, - Variant40902, - Variant40903, - Variant40904, - Variant40905, - Variant40906, - Variant40907, - Variant40908, - Variant40909, - Variant40910, - Variant40911, - Variant40912, - Variant40913, - Variant40914, - Variant40915, - Variant40916, - Variant40917, - Variant40918, - Variant40919, - Variant40920, - Variant40921, - Variant40922, - Variant40923, - Variant40924, - Variant40925, - Variant40926, - Variant40927, - Variant40928, - Variant40929, - Variant40930, - Variant40931, - Variant40932, - Variant40933, - Variant40934, - Variant40935, - Variant40936, - Variant40937, - Variant40938, - Variant40939, - Variant40940, - Variant40941, - Variant40942, - Variant40943, - Variant40944, - Variant40945, - Variant40946, - Variant40947, - Variant40948, - Variant40949, - Variant40950, - Variant40951, - Variant40952, - Variant40953, - Variant40954, - Variant40955, - Variant40956, - Variant40957, - Variant40958, - Variant40959, - Variant40960, - Variant40961, - Variant40962, - Variant40963, - Variant40964, - Variant40965, - Variant40966, - Variant40967, - Variant40968, - Variant40969, - Variant40970, - Variant40971, - Variant40972, - Variant40973, - Variant40974, - Variant40975, - Variant40976, - Variant40977, - Variant40978, - Variant40979, - Variant40980, - Variant40981, - Variant40982, - Variant40983, - Variant40984, - Variant40985, - Variant40986, - Variant40987, - Variant40988, - Variant40989, - Variant40990, - Variant40991, - Variant40992, - Variant40993, - Variant40994, - Variant40995, - Variant40996, - Variant40997, - Variant40998, - Variant40999, - Variant41000, - Variant41001, - Variant41002, - Variant41003, - Variant41004, - Variant41005, - Variant41006, - Variant41007, - Variant41008, - Variant41009, - Variant41010, - Variant41011, - Variant41012, - Variant41013, - Variant41014, - Variant41015, - Variant41016, - Variant41017, - Variant41018, - Variant41019, - Variant41020, - Variant41021, - Variant41022, - Variant41023, - Variant41024, - Variant41025, - Variant41026, - Variant41027, - Variant41028, - Variant41029, - Variant41030, - Variant41031, - Variant41032, - Variant41033, - Variant41034, - Variant41035, - Variant41036, - Variant41037, - Variant41038, - Variant41039, - Variant41040, - Variant41041, - Variant41042, - Variant41043, - Variant41044, - Variant41045, - Variant41046, - Variant41047, - Variant41048, - Variant41049, - Variant41050, - Variant41051, - Variant41052, - Variant41053, - Variant41054, - Variant41055, - Variant41056, - Variant41057, - Variant41058, - Variant41059, - Variant41060, - Variant41061, - Variant41062, - Variant41063, - Variant41064, - Variant41065, - Variant41066, - Variant41067, - Variant41068, - Variant41069, - Variant41070, - Variant41071, - Variant41072, - Variant41073, - Variant41074, - Variant41075, - Variant41076, - Variant41077, - Variant41078, - Variant41079, - Variant41080, - Variant41081, - Variant41082, - Variant41083, - Variant41084, - Variant41085, - Variant41086, - Variant41087, - Variant41088, - Variant41089, - Variant41090, - Variant41091, - Variant41092, - Variant41093, - Variant41094, - Variant41095, - Variant41096, - Variant41097, - Variant41098, - Variant41099, - Variant41100, - Variant41101, - Variant41102, - Variant41103, - Variant41104, - Variant41105, - Variant41106, - Variant41107, - Variant41108, - Variant41109, - Variant41110, - Variant41111, - Variant41112, - Variant41113, - Variant41114, - Variant41115, - Variant41116, - Variant41117, - Variant41118, - Variant41119, - Variant41120, - Variant41121, - Variant41122, - Variant41123, - Variant41124, - Variant41125, - Variant41126, - Variant41127, - Variant41128, - Variant41129, - Variant41130, - Variant41131, - Variant41132, - Variant41133, - Variant41134, - Variant41135, - Variant41136, - Variant41137, - Variant41138, - Variant41139, - Variant41140, - Variant41141, - Variant41142, - Variant41143, - Variant41144, - Variant41145, - Variant41146, - Variant41147, - Variant41148, - Variant41149, - Variant41150, - Variant41151, - Variant41152, - Variant41153, - Variant41154, - Variant41155, - Variant41156, - Variant41157, - Variant41158, - Variant41159, - Variant41160, - Variant41161, - Variant41162, - Variant41163, - Variant41164, - Variant41165, - Variant41166, - Variant41167, - Variant41168, - Variant41169, - Variant41170, - Variant41171, - Variant41172, - Variant41173, - Variant41174, - Variant41175, - Variant41176, - Variant41177, - Variant41178, - Variant41179, - Variant41180, - Variant41181, - Variant41182, - Variant41183, - Variant41184, - Variant41185, - Variant41186, - Variant41187, - Variant41188, - Variant41189, - Variant41190, - Variant41191, - Variant41192, - Variant41193, - Variant41194, - Variant41195, - Variant41196, - Variant41197, - Variant41198, - Variant41199, - Variant41200, - Variant41201, - Variant41202, - Variant41203, - Variant41204, - Variant41205, - Variant41206, - Variant41207, - Variant41208, - Variant41209, - Variant41210, - Variant41211, - Variant41212, - Variant41213, - Variant41214, - Variant41215, - Variant41216, - Variant41217, - Variant41218, - Variant41219, - Variant41220, - Variant41221, - Variant41222, - Variant41223, - Variant41224, - Variant41225, - Variant41226, - Variant41227, - Variant41228, - Variant41229, - Variant41230, - Variant41231, - Variant41232, - Variant41233, - Variant41234, - Variant41235, - Variant41236, - Variant41237, - Variant41238, - Variant41239, - Variant41240, - Variant41241, - Variant41242, - Variant41243, - Variant41244, - Variant41245, - Variant41246, - Variant41247, - Variant41248, - Variant41249, - Variant41250, - Variant41251, - Variant41252, - Variant41253, - Variant41254, - Variant41255, - Variant41256, - Variant41257, - Variant41258, - Variant41259, - Variant41260, - Variant41261, - Variant41262, - Variant41263, - Variant41264, - Variant41265, - Variant41266, - Variant41267, - Variant41268, - Variant41269, - Variant41270, - Variant41271, - Variant41272, - Variant41273, - Variant41274, - Variant41275, - Variant41276, - Variant41277, - Variant41278, - Variant41279, - Variant41280, - Variant41281, - Variant41282, - Variant41283, - Variant41284, - Variant41285, - Variant41286, - Variant41287, - Variant41288, - Variant41289, - Variant41290, - Variant41291, - Variant41292, - Variant41293, - Variant41294, - Variant41295, - Variant41296, - Variant41297, - Variant41298, - Variant41299, - Variant41300, - Variant41301, - Variant41302, - Variant41303, - Variant41304, - Variant41305, - Variant41306, - Variant41307, - Variant41308, - Variant41309, - Variant41310, - Variant41311, - Variant41312, - Variant41313, - Variant41314, - Variant41315, - Variant41316, - Variant41317, - Variant41318, - Variant41319, - Variant41320, - Variant41321, - Variant41322, - Variant41323, - Variant41324, - Variant41325, - Variant41326, - Variant41327, - Variant41328, - Variant41329, - Variant41330, - Variant41331, - Variant41332, - Variant41333, - Variant41334, - Variant41335, - Variant41336, - Variant41337, - Variant41338, - Variant41339, - Variant41340, - Variant41341, - Variant41342, - Variant41343, - Variant41344, - Variant41345, - Variant41346, - Variant41347, - Variant41348, - Variant41349, - Variant41350, - Variant41351, - Variant41352, - Variant41353, - Variant41354, - Variant41355, - Variant41356, - Variant41357, - Variant41358, - Variant41359, - Variant41360, - Variant41361, - Variant41362, - Variant41363, - Variant41364, - Variant41365, - Variant41366, - Variant41367, - Variant41368, - Variant41369, - Variant41370, - Variant41371, - Variant41372, - Variant41373, - Variant41374, - Variant41375, - Variant41376, - Variant41377, - Variant41378, - Variant41379, - Variant41380, - Variant41381, - Variant41382, - Variant41383, - Variant41384, - Variant41385, - Variant41386, - Variant41387, - Variant41388, - Variant41389, - Variant41390, - Variant41391, - Variant41392, - Variant41393, - Variant41394, - Variant41395, - Variant41396, - Variant41397, - Variant41398, - Variant41399, - Variant41400, - Variant41401, - Variant41402, - Variant41403, - Variant41404, - Variant41405, - Variant41406, - Variant41407, - Variant41408, - Variant41409, - Variant41410, - Variant41411, - Variant41412, - Variant41413, - Variant41414, - Variant41415, - Variant41416, - Variant41417, - Variant41418, - Variant41419, - Variant41420, - Variant41421, - Variant41422, - Variant41423, - Variant41424, - Variant41425, - Variant41426, - Variant41427, - Variant41428, - Variant41429, - Variant41430, - Variant41431, - Variant41432, - Variant41433, - Variant41434, - Variant41435, - Variant41436, - Variant41437, - Variant41438, - Variant41439, - Variant41440, - Variant41441, - Variant41442, - Variant41443, - Variant41444, - Variant41445, - Variant41446, - Variant41447, - Variant41448, - Variant41449, - Variant41450, - Variant41451, - Variant41452, - Variant41453, - Variant41454, - Variant41455, - Variant41456, - Variant41457, - Variant41458, - Variant41459, - Variant41460, - Variant41461, - Variant41462, - Variant41463, - Variant41464, - Variant41465, - Variant41466, - Variant41467, - Variant41468, - Variant41469, - Variant41470, - Variant41471, - Variant41472, - Variant41473, - Variant41474, - Variant41475, - Variant41476, - Variant41477, - Variant41478, - Variant41479, - Variant41480, - Variant41481, - Variant41482, - Variant41483, - Variant41484, - Variant41485, - Variant41486, - Variant41487, - Variant41488, - Variant41489, - Variant41490, - Variant41491, - Variant41492, - Variant41493, - Variant41494, - Variant41495, - Variant41496, - Variant41497, - Variant41498, - Variant41499, - Variant41500, - Variant41501, - Variant41502, - Variant41503, - Variant41504, - Variant41505, - Variant41506, - Variant41507, - Variant41508, - Variant41509, - Variant41510, - Variant41511, - Variant41512, - Variant41513, - Variant41514, - Variant41515, - Variant41516, - Variant41517, - Variant41518, - Variant41519, - Variant41520, - Variant41521, - Variant41522, - Variant41523, - Variant41524, - Variant41525, - Variant41526, - Variant41527, - Variant41528, - Variant41529, - Variant41530, - Variant41531, - Variant41532, - Variant41533, - Variant41534, - Variant41535, - Variant41536, - Variant41537, - Variant41538, - Variant41539, - Variant41540, - Variant41541, - Variant41542, - Variant41543, - Variant41544, - Variant41545, - Variant41546, - Variant41547, - Variant41548, - Variant41549, - Variant41550, - Variant41551, - Variant41552, - Variant41553, - Variant41554, - Variant41555, - Variant41556, - Variant41557, - Variant41558, - Variant41559, - Variant41560, - Variant41561, - Variant41562, - Variant41563, - Variant41564, - Variant41565, - Variant41566, - Variant41567, - Variant41568, - Variant41569, - Variant41570, - Variant41571, - Variant41572, - Variant41573, - Variant41574, - Variant41575, - Variant41576, - Variant41577, - Variant41578, - Variant41579, - Variant41580, - Variant41581, - Variant41582, - Variant41583, - Variant41584, - Variant41585, - Variant41586, - Variant41587, - Variant41588, - Variant41589, - Variant41590, - Variant41591, - Variant41592, - Variant41593, - Variant41594, - Variant41595, - Variant41596, - Variant41597, - Variant41598, - Variant41599, - Variant41600, - Variant41601, - Variant41602, - Variant41603, - Variant41604, - Variant41605, - Variant41606, - Variant41607, - Variant41608, - Variant41609, - Variant41610, - Variant41611, - Variant41612, - Variant41613, - Variant41614, - Variant41615, - Variant41616, - Variant41617, - Variant41618, - Variant41619, - Variant41620, - Variant41621, - Variant41622, - Variant41623, - Variant41624, - Variant41625, - Variant41626, - Variant41627, - Variant41628, - Variant41629, - Variant41630, - Variant41631, - Variant41632, - Variant41633, - Variant41634, - Variant41635, - Variant41636, - Variant41637, - Variant41638, - Variant41639, - Variant41640, - Variant41641, - Variant41642, - Variant41643, - Variant41644, - Variant41645, - Variant41646, - Variant41647, - Variant41648, - Variant41649, - Variant41650, - Variant41651, - Variant41652, - Variant41653, - Variant41654, - Variant41655, - Variant41656, - Variant41657, - Variant41658, - Variant41659, - Variant41660, - Variant41661, - Variant41662, - Variant41663, - Variant41664, - Variant41665, - Variant41666, - Variant41667, - Variant41668, - Variant41669, - Variant41670, - Variant41671, - Variant41672, - Variant41673, - Variant41674, - Variant41675, - Variant41676, - Variant41677, - Variant41678, - Variant41679, - Variant41680, - Variant41681, - Variant41682, - Variant41683, - Variant41684, - Variant41685, - Variant41686, - Variant41687, - Variant41688, - Variant41689, - Variant41690, - Variant41691, - Variant41692, - Variant41693, - Variant41694, - Variant41695, - Variant41696, - Variant41697, - Variant41698, - Variant41699, - Variant41700, - Variant41701, - Variant41702, - Variant41703, - Variant41704, - Variant41705, - Variant41706, - Variant41707, - Variant41708, - Variant41709, - Variant41710, - Variant41711, - Variant41712, - Variant41713, - Variant41714, - Variant41715, - Variant41716, - Variant41717, - Variant41718, - Variant41719, - Variant41720, - Variant41721, - Variant41722, - Variant41723, - Variant41724, - Variant41725, - Variant41726, - Variant41727, - Variant41728, - Variant41729, - Variant41730, - Variant41731, - Variant41732, - Variant41733, - Variant41734, - Variant41735, - Variant41736, - Variant41737, - Variant41738, - Variant41739, - Variant41740, - Variant41741, - Variant41742, - Variant41743, - Variant41744, - Variant41745, - Variant41746, - Variant41747, - Variant41748, - Variant41749, - Variant41750, - Variant41751, - Variant41752, - Variant41753, - Variant41754, - Variant41755, - Variant41756, - Variant41757, - Variant41758, - Variant41759, - Variant41760, - Variant41761, - Variant41762, - Variant41763, - Variant41764, - Variant41765, - Variant41766, - Variant41767, - Variant41768, - Variant41769, - Variant41770, - Variant41771, - Variant41772, - Variant41773, - Variant41774, - Variant41775, - Variant41776, - Variant41777, - Variant41778, - Variant41779, - Variant41780, - Variant41781, - Variant41782, - Variant41783, - Variant41784, - Variant41785, - Variant41786, - Variant41787, - Variant41788, - Variant41789, - Variant41790, - Variant41791, - Variant41792, - Variant41793, - Variant41794, - Variant41795, - Variant41796, - Variant41797, - Variant41798, - Variant41799, - Variant41800, - Variant41801, - Variant41802, - Variant41803, - Variant41804, - Variant41805, - Variant41806, - Variant41807, - Variant41808, - Variant41809, - Variant41810, - Variant41811, - Variant41812, - Variant41813, - Variant41814, - Variant41815, - Variant41816, - Variant41817, - Variant41818, - Variant41819, - Variant41820, - Variant41821, - Variant41822, - Variant41823, - Variant41824, - Variant41825, - Variant41826, - Variant41827, - Variant41828, - Variant41829, - Variant41830, - Variant41831, - Variant41832, - Variant41833, - Variant41834, - Variant41835, - Variant41836, - Variant41837, - Variant41838, - Variant41839, - Variant41840, - Variant41841, - Variant41842, - Variant41843, - Variant41844, - Variant41845, - Variant41846, - Variant41847, - Variant41848, - Variant41849, - Variant41850, - Variant41851, - Variant41852, - Variant41853, - Variant41854, - Variant41855, - Variant41856, - Variant41857, - Variant41858, - Variant41859, - Variant41860, - Variant41861, - Variant41862, - Variant41863, - Variant41864, - Variant41865, - Variant41866, - Variant41867, - Variant41868, - Variant41869, - Variant41870, - Variant41871, - Variant41872, - Variant41873, - Variant41874, - Variant41875, - Variant41876, - Variant41877, - Variant41878, - Variant41879, - Variant41880, - Variant41881, - Variant41882, - Variant41883, - Variant41884, - Variant41885, - Variant41886, - Variant41887, - Variant41888, - Variant41889, - Variant41890, - Variant41891, - Variant41892, - Variant41893, - Variant41894, - Variant41895, - Variant41896, - Variant41897, - Variant41898, - Variant41899, - Variant41900, - Variant41901, - Variant41902, - Variant41903, - Variant41904, - Variant41905, - Variant41906, - Variant41907, - Variant41908, - Variant41909, - Variant41910, - Variant41911, - Variant41912, - Variant41913, - Variant41914, - Variant41915, - Variant41916, - Variant41917, - Variant41918, - Variant41919, - Variant41920, - Variant41921, - Variant41922, - Variant41923, - Variant41924, - Variant41925, - Variant41926, - Variant41927, - Variant41928, - Variant41929, - Variant41930, - Variant41931, - Variant41932, - Variant41933, - Variant41934, - Variant41935, - Variant41936, - Variant41937, - Variant41938, - Variant41939, - Variant41940, - Variant41941, - Variant41942, - Variant41943, - Variant41944, - Variant41945, - Variant41946, - Variant41947, - Variant41948, - Variant41949, - Variant41950, - Variant41951, - Variant41952, - Variant41953, - Variant41954, - Variant41955, - Variant41956, - Variant41957, - Variant41958, - Variant41959, - Variant41960, - Variant41961, - Variant41962, - Variant41963, - Variant41964, - Variant41965, - Variant41966, - Variant41967, - Variant41968, - Variant41969, - Variant41970, - Variant41971, - Variant41972, - Variant41973, - Variant41974, - Variant41975, - Variant41976, - Variant41977, - Variant41978, - Variant41979, - Variant41980, - Variant41981, - Variant41982, - Variant41983, - Variant41984, - Variant41985, - Variant41986, - Variant41987, - Variant41988, - Variant41989, - Variant41990, - Variant41991, - Variant41992, - Variant41993, - Variant41994, - Variant41995, - Variant41996, - Variant41997, - Variant41998, - Variant41999, - Variant42000, - Variant42001, - Variant42002, - Variant42003, - Variant42004, - Variant42005, - Variant42006, - Variant42007, - Variant42008, - Variant42009, - Variant42010, - Variant42011, - Variant42012, - Variant42013, - Variant42014, - Variant42015, - Variant42016, - Variant42017, - Variant42018, - Variant42019, - Variant42020, - Variant42021, - Variant42022, - Variant42023, - Variant42024, - Variant42025, - Variant42026, - Variant42027, - Variant42028, - Variant42029, - Variant42030, - Variant42031, - Variant42032, - Variant42033, - Variant42034, - Variant42035, - Variant42036, - Variant42037, - Variant42038, - Variant42039, - Variant42040, - Variant42041, - Variant42042, - Variant42043, - Variant42044, - Variant42045, - Variant42046, - Variant42047, - Variant42048, - Variant42049, - Variant42050, - Variant42051, - Variant42052, - Variant42053, - Variant42054, - Variant42055, - Variant42056, - Variant42057, - Variant42058, - Variant42059, - Variant42060, - Variant42061, - Variant42062, - Variant42063, - Variant42064, - Variant42065, - Variant42066, - Variant42067, - Variant42068, - Variant42069, - Variant42070, - Variant42071, - Variant42072, - Variant42073, - Variant42074, - Variant42075, - Variant42076, - Variant42077, - Variant42078, - Variant42079, - Variant42080, - Variant42081, - Variant42082, - Variant42083, - Variant42084, - Variant42085, - Variant42086, - Variant42087, - Variant42088, - Variant42089, - Variant42090, - Variant42091, - Variant42092, - Variant42093, - Variant42094, - Variant42095, - Variant42096, - Variant42097, - Variant42098, - Variant42099, - Variant42100, - Variant42101, - Variant42102, - Variant42103, - Variant42104, - Variant42105, - Variant42106, - Variant42107, - Variant42108, - Variant42109, - Variant42110, - Variant42111, - Variant42112, - Variant42113, - Variant42114, - Variant42115, - Variant42116, - Variant42117, - Variant42118, - Variant42119, - Variant42120, - Variant42121, - Variant42122, - Variant42123, - Variant42124, - Variant42125, - Variant42126, - Variant42127, - Variant42128, - Variant42129, - Variant42130, - Variant42131, - Variant42132, - Variant42133, - Variant42134, - Variant42135, - Variant42136, - Variant42137, - Variant42138, - Variant42139, - Variant42140, - Variant42141, - Variant42142, - Variant42143, - Variant42144, - Variant42145, - Variant42146, - Variant42147, - Variant42148, - Variant42149, - Variant42150, - Variant42151, - Variant42152, - Variant42153, - Variant42154, - Variant42155, - Variant42156, - Variant42157, - Variant42158, - Variant42159, - Variant42160, - Variant42161, - Variant42162, - Variant42163, - Variant42164, - Variant42165, - Variant42166, - Variant42167, - Variant42168, - Variant42169, - Variant42170, - Variant42171, - Variant42172, - Variant42173, - Variant42174, - Variant42175, - Variant42176, - Variant42177, - Variant42178, - Variant42179, - Variant42180, - Variant42181, - Variant42182, - Variant42183, - Variant42184, - Variant42185, - Variant42186, - Variant42187, - Variant42188, - Variant42189, - Variant42190, - Variant42191, - Variant42192, - Variant42193, - Variant42194, - Variant42195, - Variant42196, - Variant42197, - Variant42198, - Variant42199, - Variant42200, - Variant42201, - Variant42202, - Variant42203, - Variant42204, - Variant42205, - Variant42206, - Variant42207, - Variant42208, - Variant42209, - Variant42210, - Variant42211, - Variant42212, - Variant42213, - Variant42214, - Variant42215, - Variant42216, - Variant42217, - Variant42218, - Variant42219, - Variant42220, - Variant42221, - Variant42222, - Variant42223, - Variant42224, - Variant42225, - Variant42226, - Variant42227, - Variant42228, - Variant42229, - Variant42230, - Variant42231, - Variant42232, - Variant42233, - Variant42234, - Variant42235, - Variant42236, - Variant42237, - Variant42238, - Variant42239, - Variant42240, - Variant42241, - Variant42242, - Variant42243, - Variant42244, - Variant42245, - Variant42246, - Variant42247, - Variant42248, - Variant42249, - Variant42250, - Variant42251, - Variant42252, - Variant42253, - Variant42254, - Variant42255, - Variant42256, - Variant42257, - Variant42258, - Variant42259, - Variant42260, - Variant42261, - Variant42262, - Variant42263, - Variant42264, - Variant42265, - Variant42266, - Variant42267, - Variant42268, - Variant42269, - Variant42270, - Variant42271, - Variant42272, - Variant42273, - Variant42274, - Variant42275, - Variant42276, - Variant42277, - Variant42278, - Variant42279, - Variant42280, - Variant42281, - Variant42282, - Variant42283, - Variant42284, - Variant42285, - Variant42286, - Variant42287, - Variant42288, - Variant42289, - Variant42290, - Variant42291, - Variant42292, - Variant42293, - Variant42294, - Variant42295, - Variant42296, - Variant42297, - Variant42298, - Variant42299, - Variant42300, - Variant42301, - Variant42302, - Variant42303, - Variant42304, - Variant42305, - Variant42306, - Variant42307, - Variant42308, - Variant42309, - Variant42310, - Variant42311, - Variant42312, - Variant42313, - Variant42314, - Variant42315, - Variant42316, - Variant42317, - Variant42318, - Variant42319, - Variant42320, - Variant42321, - Variant42322, - Variant42323, - Variant42324, - Variant42325, - Variant42326, - Variant42327, - Variant42328, - Variant42329, - Variant42330, - Variant42331, - Variant42332, - Variant42333, - Variant42334, - Variant42335, - Variant42336, - Variant42337, - Variant42338, - Variant42339, - Variant42340, - Variant42341, - Variant42342, - Variant42343, - Variant42344, - Variant42345, - Variant42346, - Variant42347, - Variant42348, - Variant42349, - Variant42350, - Variant42351, - Variant42352, - Variant42353, - Variant42354, - Variant42355, - Variant42356, - Variant42357, - Variant42358, - Variant42359, - Variant42360, - Variant42361, - Variant42362, - Variant42363, - Variant42364, - Variant42365, - Variant42366, - Variant42367, - Variant42368, - Variant42369, - Variant42370, - Variant42371, - Variant42372, - Variant42373, - Variant42374, - Variant42375, - Variant42376, - Variant42377, - Variant42378, - Variant42379, - Variant42380, - Variant42381, - Variant42382, - Variant42383, - Variant42384, - Variant42385, - Variant42386, - Variant42387, - Variant42388, - Variant42389, - Variant42390, - Variant42391, - Variant42392, - Variant42393, - Variant42394, - Variant42395, - Variant42396, - Variant42397, - Variant42398, - Variant42399, - Variant42400, - Variant42401, - Variant42402, - Variant42403, - Variant42404, - Variant42405, - Variant42406, - Variant42407, - Variant42408, - Variant42409, - Variant42410, - Variant42411, - Variant42412, - Variant42413, - Variant42414, - Variant42415, - Variant42416, - Variant42417, - Variant42418, - Variant42419, - Variant42420, - Variant42421, - Variant42422, - Variant42423, - Variant42424, - Variant42425, - Variant42426, - Variant42427, - Variant42428, - Variant42429, - Variant42430, - Variant42431, - Variant42432, - Variant42433, - Variant42434, - Variant42435, - Variant42436, - Variant42437, - Variant42438, - Variant42439, - Variant42440, - Variant42441, - Variant42442, - Variant42443, - Variant42444, - Variant42445, - Variant42446, - Variant42447, - Variant42448, - Variant42449, - Variant42450, - Variant42451, - Variant42452, - Variant42453, - Variant42454, - Variant42455, - Variant42456, - Variant42457, - Variant42458, - Variant42459, - Variant42460, - Variant42461, - Variant42462, - Variant42463, - Variant42464, - Variant42465, - Variant42466, - Variant42467, - Variant42468, - Variant42469, - Variant42470, - Variant42471, - Variant42472, - Variant42473, - Variant42474, - Variant42475, - Variant42476, - Variant42477, - Variant42478, - Variant42479, - Variant42480, - Variant42481, - Variant42482, - Variant42483, - Variant42484, - Variant42485, - Variant42486, - Variant42487, - Variant42488, - Variant42489, - Variant42490, - Variant42491, - Variant42492, - Variant42493, - Variant42494, - Variant42495, - Variant42496, - Variant42497, - Variant42498, - Variant42499, - Variant42500, - Variant42501, - Variant42502, - Variant42503, - Variant42504, - Variant42505, - Variant42506, - Variant42507, - Variant42508, - Variant42509, - Variant42510, - Variant42511, - Variant42512, - Variant42513, - Variant42514, - Variant42515, - Variant42516, - Variant42517, - Variant42518, - Variant42519, - Variant42520, - Variant42521, - Variant42522, - Variant42523, - Variant42524, - Variant42525, - Variant42526, - Variant42527, - Variant42528, - Variant42529, - Variant42530, - Variant42531, - Variant42532, - Variant42533, - Variant42534, - Variant42535, - Variant42536, - Variant42537, - Variant42538, - Variant42539, - Variant42540, - Variant42541, - Variant42542, - Variant42543, - Variant42544, - Variant42545, - Variant42546, - Variant42547, - Variant42548, - Variant42549, - Variant42550, - Variant42551, - Variant42552, - Variant42553, - Variant42554, - Variant42555, - Variant42556, - Variant42557, - Variant42558, - Variant42559, - Variant42560, - Variant42561, - Variant42562, - Variant42563, - Variant42564, - Variant42565, - Variant42566, - Variant42567, - Variant42568, - Variant42569, - Variant42570, - Variant42571, - Variant42572, - Variant42573, - Variant42574, - Variant42575, - Variant42576, - Variant42577, - Variant42578, - Variant42579, - Variant42580, - Variant42581, - Variant42582, - Variant42583, - Variant42584, - Variant42585, - Variant42586, - Variant42587, - Variant42588, - Variant42589, - Variant42590, - Variant42591, - Variant42592, - Variant42593, - Variant42594, - Variant42595, - Variant42596, - Variant42597, - Variant42598, - Variant42599, - Variant42600, - Variant42601, - Variant42602, - Variant42603, - Variant42604, - Variant42605, - Variant42606, - Variant42607, - Variant42608, - Variant42609, - Variant42610, - Variant42611, - Variant42612, - Variant42613, - Variant42614, - Variant42615, - Variant42616, - Variant42617, - Variant42618, - Variant42619, - Variant42620, - Variant42621, - Variant42622, - Variant42623, - Variant42624, - Variant42625, - Variant42626, - Variant42627, - Variant42628, - Variant42629, - Variant42630, - Variant42631, - Variant42632, - Variant42633, - Variant42634, - Variant42635, - Variant42636, - Variant42637, - Variant42638, - Variant42639, - Variant42640, - Variant42641, - Variant42642, - Variant42643, - Variant42644, - Variant42645, - Variant42646, - Variant42647, - Variant42648, - Variant42649, - Variant42650, - Variant42651, - Variant42652, - Variant42653, - Variant42654, - Variant42655, - Variant42656, - Variant42657, - Variant42658, - Variant42659, - Variant42660, - Variant42661, - Variant42662, - Variant42663, - Variant42664, - Variant42665, - Variant42666, - Variant42667, - Variant42668, - Variant42669, - Variant42670, - Variant42671, - Variant42672, - Variant42673, - Variant42674, - Variant42675, - Variant42676, - Variant42677, - Variant42678, - Variant42679, - Variant42680, - Variant42681, - Variant42682, - Variant42683, - Variant42684, - Variant42685, - Variant42686, - Variant42687, - Variant42688, - Variant42689, - Variant42690, - Variant42691, - Variant42692, - Variant42693, - Variant42694, - Variant42695, - Variant42696, - Variant42697, - Variant42698, - Variant42699, - Variant42700, - Variant42701, - Variant42702, - Variant42703, - Variant42704, - Variant42705, - Variant42706, - Variant42707, - Variant42708, - Variant42709, - Variant42710, - Variant42711, - Variant42712, - Variant42713, - Variant42714, - Variant42715, - Variant42716, - Variant42717, - Variant42718, - Variant42719, - Variant42720, - Variant42721, - Variant42722, - Variant42723, - Variant42724, - Variant42725, - Variant42726, - Variant42727, - Variant42728, - Variant42729, - Variant42730, - Variant42731, - Variant42732, - Variant42733, - Variant42734, - Variant42735, - Variant42736, - Variant42737, - Variant42738, - Variant42739, - Variant42740, - Variant42741, - Variant42742, - Variant42743, - Variant42744, - Variant42745, - Variant42746, - Variant42747, - Variant42748, - Variant42749, - Variant42750, - Variant42751, - Variant42752, - Variant42753, - Variant42754, - Variant42755, - Variant42756, - Variant42757, - Variant42758, - Variant42759, - Variant42760, - Variant42761, - Variant42762, - Variant42763, - Variant42764, - Variant42765, - Variant42766, - Variant42767, - Variant42768, - Variant42769, - Variant42770, - Variant42771, - Variant42772, - Variant42773, - Variant42774, - Variant42775, - Variant42776, - Variant42777, - Variant42778, - Variant42779, - Variant42780, - Variant42781, - Variant42782, - Variant42783, - Variant42784, - Variant42785, - Variant42786, - Variant42787, - Variant42788, - Variant42789, - Variant42790, - Variant42791, - Variant42792, - Variant42793, - Variant42794, - Variant42795, - Variant42796, - Variant42797, - Variant42798, - Variant42799, - Variant42800, - Variant42801, - Variant42802, - Variant42803, - Variant42804, - Variant42805, - Variant42806, - Variant42807, - Variant42808, - Variant42809, - Variant42810, - Variant42811, - Variant42812, - Variant42813, - Variant42814, - Variant42815, - Variant42816, - Variant42817, - Variant42818, - Variant42819, - Variant42820, - Variant42821, - Variant42822, - Variant42823, - Variant42824, - Variant42825, - Variant42826, - Variant42827, - Variant42828, - Variant42829, - Variant42830, - Variant42831, - Variant42832, - Variant42833, - Variant42834, - Variant42835, - Variant42836, - Variant42837, - Variant42838, - Variant42839, - Variant42840, - Variant42841, - Variant42842, - Variant42843, - Variant42844, - Variant42845, - Variant42846, - Variant42847, - Variant42848, - Variant42849, - Variant42850, - Variant42851, - Variant42852, - Variant42853, - Variant42854, - Variant42855, - Variant42856, - Variant42857, - Variant42858, - Variant42859, - Variant42860, - Variant42861, - Variant42862, - Variant42863, - Variant42864, - Variant42865, - Variant42866, - Variant42867, - Variant42868, - Variant42869, - Variant42870, - Variant42871, - Variant42872, - Variant42873, - Variant42874, - Variant42875, - Variant42876, - Variant42877, - Variant42878, - Variant42879, - Variant42880, - Variant42881, - Variant42882, - Variant42883, - Variant42884, - Variant42885, - Variant42886, - Variant42887, - Variant42888, - Variant42889, - Variant42890, - Variant42891, - Variant42892, - Variant42893, - Variant42894, - Variant42895, - Variant42896, - Variant42897, - Variant42898, - Variant42899, - Variant42900, - Variant42901, - Variant42902, - Variant42903, - Variant42904, - Variant42905, - Variant42906, - Variant42907, - Variant42908, - Variant42909, - Variant42910, - Variant42911, - Variant42912, - Variant42913, - Variant42914, - Variant42915, - Variant42916, - Variant42917, - Variant42918, - Variant42919, - Variant42920, - Variant42921, - Variant42922, - Variant42923, - Variant42924, - Variant42925, - Variant42926, - Variant42927, - Variant42928, - Variant42929, - Variant42930, - Variant42931, - Variant42932, - Variant42933, - Variant42934, - Variant42935, - Variant42936, - Variant42937, - Variant42938, - Variant42939, - Variant42940, - Variant42941, - Variant42942, - Variant42943, - Variant42944, - Variant42945, - Variant42946, - Variant42947, - Variant42948, - Variant42949, - Variant42950, - Variant42951, - Variant42952, - Variant42953, - Variant42954, - Variant42955, - Variant42956, - Variant42957, - Variant42958, - Variant42959, - Variant42960, - Variant42961, - Variant42962, - Variant42963, - Variant42964, - Variant42965, - Variant42966, - Variant42967, - Variant42968, - Variant42969, - Variant42970, - Variant42971, - Variant42972, - Variant42973, - Variant42974, - Variant42975, - Variant42976, - Variant42977, - Variant42978, - Variant42979, - Variant42980, - Variant42981, - Variant42982, - Variant42983, - Variant42984, - Variant42985, - Variant42986, - Variant42987, - Variant42988, - Variant42989, - Variant42990, - Variant42991, - Variant42992, - Variant42993, - Variant42994, - Variant42995, - Variant42996, - Variant42997, - Variant42998, - Variant42999, - Variant43000, - Variant43001, - Variant43002, - Variant43003, - Variant43004, - Variant43005, - Variant43006, - Variant43007, - Variant43008, - Variant43009, - Variant43010, - Variant43011, - Variant43012, - Variant43013, - Variant43014, - Variant43015, - Variant43016, - Variant43017, - Variant43018, - Variant43019, - Variant43020, - Variant43021, - Variant43022, - Variant43023, - Variant43024, - Variant43025, - Variant43026, - Variant43027, - Variant43028, - Variant43029, - Variant43030, - Variant43031, - Variant43032, - Variant43033, - Variant43034, - Variant43035, - Variant43036, - Variant43037, - Variant43038, - Variant43039, - Variant43040, - Variant43041, - Variant43042, - Variant43043, - Variant43044, - Variant43045, - Variant43046, - Variant43047, - Variant43048, - Variant43049, - Variant43050, - Variant43051, - Variant43052, - Variant43053, - Variant43054, - Variant43055, - Variant43056, - Variant43057, - Variant43058, - Variant43059, - Variant43060, - Variant43061, - Variant43062, - Variant43063, - Variant43064, - Variant43065, - Variant43066, - Variant43067, - Variant43068, - Variant43069, - Variant43070, - Variant43071, - Variant43072, - Variant43073, - Variant43074, - Variant43075, - Variant43076, - Variant43077, - Variant43078, - Variant43079, - Variant43080, - Variant43081, - Variant43082, - Variant43083, - Variant43084, - Variant43085, - Variant43086, - Variant43087, - Variant43088, - Variant43089, - Variant43090, - Variant43091, - Variant43092, - Variant43093, - Variant43094, - Variant43095, - Variant43096, - Variant43097, - Variant43098, - Variant43099, - Variant43100, - Variant43101, - Variant43102, - Variant43103, - Variant43104, - Variant43105, - Variant43106, - Variant43107, - Variant43108, - Variant43109, - Variant43110, - Variant43111, - Variant43112, - Variant43113, - Variant43114, - Variant43115, - Variant43116, - Variant43117, - Variant43118, - Variant43119, - Variant43120, - Variant43121, - Variant43122, - Variant43123, - Variant43124, - Variant43125, - Variant43126, - Variant43127, - Variant43128, - Variant43129, - Variant43130, - Variant43131, - Variant43132, - Variant43133, - Variant43134, - Variant43135, - Variant43136, - Variant43137, - Variant43138, - Variant43139, - Variant43140, - Variant43141, - Variant43142, - Variant43143, - Variant43144, - Variant43145, - Variant43146, - Variant43147, - Variant43148, - Variant43149, - Variant43150, - Variant43151, - Variant43152, - Variant43153, - Variant43154, - Variant43155, - Variant43156, - Variant43157, - Variant43158, - Variant43159, - Variant43160, - Variant43161, - Variant43162, - Variant43163, - Variant43164, - Variant43165, - Variant43166, - Variant43167, - Variant43168, - Variant43169, - Variant43170, - Variant43171, - Variant43172, - Variant43173, - Variant43174, - Variant43175, - Variant43176, - Variant43177, - Variant43178, - Variant43179, - Variant43180, - Variant43181, - Variant43182, - Variant43183, - Variant43184, - Variant43185, - Variant43186, - Variant43187, - Variant43188, - Variant43189, - Variant43190, - Variant43191, - Variant43192, - Variant43193, - Variant43194, - Variant43195, - Variant43196, - Variant43197, - Variant43198, - Variant43199, - Variant43200, - Variant43201, - Variant43202, - Variant43203, - Variant43204, - Variant43205, - Variant43206, - Variant43207, - Variant43208, - Variant43209, - Variant43210, - Variant43211, - Variant43212, - Variant43213, - Variant43214, - Variant43215, - Variant43216, - Variant43217, - Variant43218, - Variant43219, - Variant43220, - Variant43221, - Variant43222, - Variant43223, - Variant43224, - Variant43225, - Variant43226, - Variant43227, - Variant43228, - Variant43229, - Variant43230, - Variant43231, - Variant43232, - Variant43233, - Variant43234, - Variant43235, - Variant43236, - Variant43237, - Variant43238, - Variant43239, - Variant43240, - Variant43241, - Variant43242, - Variant43243, - Variant43244, - Variant43245, - Variant43246, - Variant43247, - Variant43248, - Variant43249, - Variant43250, - Variant43251, - Variant43252, - Variant43253, - Variant43254, - Variant43255, - Variant43256, - Variant43257, - Variant43258, - Variant43259, - Variant43260, - Variant43261, - Variant43262, - Variant43263, - Variant43264, - Variant43265, - Variant43266, - Variant43267, - Variant43268, - Variant43269, - Variant43270, - Variant43271, - Variant43272, - Variant43273, - Variant43274, - Variant43275, - Variant43276, - Variant43277, - Variant43278, - Variant43279, - Variant43280, - Variant43281, - Variant43282, - Variant43283, - Variant43284, - Variant43285, - Variant43286, - Variant43287, - Variant43288, - Variant43289, - Variant43290, - Variant43291, - Variant43292, - Variant43293, - Variant43294, - Variant43295, - Variant43296, - Variant43297, - Variant43298, - Variant43299, - Variant43300, - Variant43301, - Variant43302, - Variant43303, - Variant43304, - Variant43305, - Variant43306, - Variant43307, - Variant43308, - Variant43309, - Variant43310, - Variant43311, - Variant43312, - Variant43313, - Variant43314, - Variant43315, - Variant43316, - Variant43317, - Variant43318, - Variant43319, - Variant43320, - Variant43321, - Variant43322, - Variant43323, - Variant43324, - Variant43325, - Variant43326, - Variant43327, - Variant43328, - Variant43329, - Variant43330, - Variant43331, - Variant43332, - Variant43333, - Variant43334, - Variant43335, - Variant43336, - Variant43337, - Variant43338, - Variant43339, - Variant43340, - Variant43341, - Variant43342, - Variant43343, - Variant43344, - Variant43345, - Variant43346, - Variant43347, - Variant43348, - Variant43349, - Variant43350, - Variant43351, - Variant43352, - Variant43353, - Variant43354, - Variant43355, - Variant43356, - Variant43357, - Variant43358, - Variant43359, - Variant43360, - Variant43361, - Variant43362, - Variant43363, - Variant43364, - Variant43365, - Variant43366, - Variant43367, - Variant43368, - Variant43369, - Variant43370, - Variant43371, - Variant43372, - Variant43373, - Variant43374, - Variant43375, - Variant43376, - Variant43377, - Variant43378, - Variant43379, - Variant43380, - Variant43381, - Variant43382, - Variant43383, - Variant43384, - Variant43385, - Variant43386, - Variant43387, - Variant43388, - Variant43389, - Variant43390, - Variant43391, - Variant43392, - Variant43393, - Variant43394, - Variant43395, - Variant43396, - Variant43397, - Variant43398, - Variant43399, - Variant43400, - Variant43401, - Variant43402, - Variant43403, - Variant43404, - Variant43405, - Variant43406, - Variant43407, - Variant43408, - Variant43409, - Variant43410, - Variant43411, - Variant43412, - Variant43413, - Variant43414, - Variant43415, - Variant43416, - Variant43417, - Variant43418, - Variant43419, - Variant43420, - Variant43421, - Variant43422, - Variant43423, - Variant43424, - Variant43425, - Variant43426, - Variant43427, - Variant43428, - Variant43429, - Variant43430, - Variant43431, - Variant43432, - Variant43433, - Variant43434, - Variant43435, - Variant43436, - Variant43437, - Variant43438, - Variant43439, - Variant43440, - Variant43441, - Variant43442, - Variant43443, - Variant43444, - Variant43445, - Variant43446, - Variant43447, - Variant43448, - Variant43449, - Variant43450, - Variant43451, - Variant43452, - Variant43453, - Variant43454, - Variant43455, - Variant43456, - Variant43457, - Variant43458, - Variant43459, - Variant43460, - Variant43461, - Variant43462, - Variant43463, - Variant43464, - Variant43465, - Variant43466, - Variant43467, - Variant43468, - Variant43469, - Variant43470, - Variant43471, - Variant43472, - Variant43473, - Variant43474, - Variant43475, - Variant43476, - Variant43477, - Variant43478, - Variant43479, - Variant43480, - Variant43481, - Variant43482, - Variant43483, - Variant43484, - Variant43485, - Variant43486, - Variant43487, - Variant43488, - Variant43489, - Variant43490, - Variant43491, - Variant43492, - Variant43493, - Variant43494, - Variant43495, - Variant43496, - Variant43497, - Variant43498, - Variant43499, - Variant43500, - Variant43501, - Variant43502, - Variant43503, - Variant43504, - Variant43505, - Variant43506, - Variant43507, - Variant43508, - Variant43509, - Variant43510, - Variant43511, - Variant43512, - Variant43513, - Variant43514, - Variant43515, - Variant43516, - Variant43517, - Variant43518, - Variant43519, - Variant43520, - Variant43521, - Variant43522, - Variant43523, - Variant43524, - Variant43525, - Variant43526, - Variant43527, - Variant43528, - Variant43529, - Variant43530, - Variant43531, - Variant43532, - Variant43533, - Variant43534, - Variant43535, - Variant43536, - Variant43537, - Variant43538, - Variant43539, - Variant43540, - Variant43541, - Variant43542, - Variant43543, - Variant43544, - Variant43545, - Variant43546, - Variant43547, - Variant43548, - Variant43549, - Variant43550, - Variant43551, - Variant43552, - Variant43553, - Variant43554, - Variant43555, - Variant43556, - Variant43557, - Variant43558, - Variant43559, - Variant43560, - Variant43561, - Variant43562, - Variant43563, - Variant43564, - Variant43565, - Variant43566, - Variant43567, - Variant43568, - Variant43569, - Variant43570, - Variant43571, - Variant43572, - Variant43573, - Variant43574, - Variant43575, - Variant43576, - Variant43577, - Variant43578, - Variant43579, - Variant43580, - Variant43581, - Variant43582, - Variant43583, - Variant43584, - Variant43585, - Variant43586, - Variant43587, - Variant43588, - Variant43589, - Variant43590, - Variant43591, - Variant43592, - Variant43593, - Variant43594, - Variant43595, - Variant43596, - Variant43597, - Variant43598, - Variant43599, - Variant43600, - Variant43601, - Variant43602, - Variant43603, - Variant43604, - Variant43605, - Variant43606, - Variant43607, - Variant43608, - Variant43609, - Variant43610, - Variant43611, - Variant43612, - Variant43613, - Variant43614, - Variant43615, - Variant43616, - Variant43617, - Variant43618, - Variant43619, - Variant43620, - Variant43621, - Variant43622, - Variant43623, - Variant43624, - Variant43625, - Variant43626, - Variant43627, - Variant43628, - Variant43629, - Variant43630, - Variant43631, - Variant43632, - Variant43633, - Variant43634, - Variant43635, - Variant43636, - Variant43637, - Variant43638, - Variant43639, - Variant43640, - Variant43641, - Variant43642, - Variant43643, - Variant43644, - Variant43645, - Variant43646, - Variant43647, - Variant43648, - Variant43649, - Variant43650, - Variant43651, - Variant43652, - Variant43653, - Variant43654, - Variant43655, - Variant43656, - Variant43657, - Variant43658, - Variant43659, - Variant43660, - Variant43661, - Variant43662, - Variant43663, - Variant43664, - Variant43665, - Variant43666, - Variant43667, - Variant43668, - Variant43669, - Variant43670, - Variant43671, - Variant43672, - Variant43673, - Variant43674, - Variant43675, - Variant43676, - Variant43677, - Variant43678, - Variant43679, - Variant43680, - Variant43681, - Variant43682, - Variant43683, - Variant43684, - Variant43685, - Variant43686, - Variant43687, - Variant43688, - Variant43689, - Variant43690, - Variant43691, - Variant43692, - Variant43693, - Variant43694, - Variant43695, - Variant43696, - Variant43697, - Variant43698, - Variant43699, - Variant43700, - Variant43701, - Variant43702, - Variant43703, - Variant43704, - Variant43705, - Variant43706, - Variant43707, - Variant43708, - Variant43709, - Variant43710, - Variant43711, - Variant43712, - Variant43713, - Variant43714, - Variant43715, - Variant43716, - Variant43717, - Variant43718, - Variant43719, - Variant43720, - Variant43721, - Variant43722, - Variant43723, - Variant43724, - Variant43725, - Variant43726, - Variant43727, - Variant43728, - Variant43729, - Variant43730, - Variant43731, - Variant43732, - Variant43733, - Variant43734, - Variant43735, - Variant43736, - Variant43737, - Variant43738, - Variant43739, - Variant43740, - Variant43741, - Variant43742, - Variant43743, - Variant43744, - Variant43745, - Variant43746, - Variant43747, - Variant43748, - Variant43749, - Variant43750, - Variant43751, - Variant43752, - Variant43753, - Variant43754, - Variant43755, - Variant43756, - Variant43757, - Variant43758, - Variant43759, - Variant43760, - Variant43761, - Variant43762, - Variant43763, - Variant43764, - Variant43765, - Variant43766, - Variant43767, - Variant43768, - Variant43769, - Variant43770, - Variant43771, - Variant43772, - Variant43773, - Variant43774, - Variant43775, - Variant43776, - Variant43777, - Variant43778, - Variant43779, - Variant43780, - Variant43781, - Variant43782, - Variant43783, - Variant43784, - Variant43785, - Variant43786, - Variant43787, - Variant43788, - Variant43789, - Variant43790, - Variant43791, - Variant43792, - Variant43793, - Variant43794, - Variant43795, - Variant43796, - Variant43797, - Variant43798, - Variant43799, - Variant43800, - Variant43801, - Variant43802, - Variant43803, - Variant43804, - Variant43805, - Variant43806, - Variant43807, - Variant43808, - Variant43809, - Variant43810, - Variant43811, - Variant43812, - Variant43813, - Variant43814, - Variant43815, - Variant43816, - Variant43817, - Variant43818, - Variant43819, - Variant43820, - Variant43821, - Variant43822, - Variant43823, - Variant43824, - Variant43825, - Variant43826, - Variant43827, - Variant43828, - Variant43829, - Variant43830, - Variant43831, - Variant43832, - Variant43833, - Variant43834, - Variant43835, - Variant43836, - Variant43837, - Variant43838, - Variant43839, - Variant43840, - Variant43841, - Variant43842, - Variant43843, - Variant43844, - Variant43845, - Variant43846, - Variant43847, - Variant43848, - Variant43849, - Variant43850, - Variant43851, - Variant43852, - Variant43853, - Variant43854, - Variant43855, - Variant43856, - Variant43857, - Variant43858, - Variant43859, - Variant43860, - Variant43861, - Variant43862, - Variant43863, - Variant43864, - Variant43865, - Variant43866, - Variant43867, - Variant43868, - Variant43869, - Variant43870, - Variant43871, - Variant43872, - Variant43873, - Variant43874, - Variant43875, - Variant43876, - Variant43877, - Variant43878, - Variant43879, - Variant43880, - Variant43881, - Variant43882, - Variant43883, - Variant43884, - Variant43885, - Variant43886, - Variant43887, - Variant43888, - Variant43889, - Variant43890, - Variant43891, - Variant43892, - Variant43893, - Variant43894, - Variant43895, - Variant43896, - Variant43897, - Variant43898, - Variant43899, - Variant43900, - Variant43901, - Variant43902, - Variant43903, - Variant43904, - Variant43905, - Variant43906, - Variant43907, - Variant43908, - Variant43909, - Variant43910, - Variant43911, - Variant43912, - Variant43913, - Variant43914, - Variant43915, - Variant43916, - Variant43917, - Variant43918, - Variant43919, - Variant43920, - Variant43921, - Variant43922, - Variant43923, - Variant43924, - Variant43925, - Variant43926, - Variant43927, - Variant43928, - Variant43929, - Variant43930, - Variant43931, - Variant43932, - Variant43933, - Variant43934, - Variant43935, - Variant43936, - Variant43937, - Variant43938, - Variant43939, - Variant43940, - Variant43941, - Variant43942, - Variant43943, - Variant43944, - Variant43945, - Variant43946, - Variant43947, - Variant43948, - Variant43949, - Variant43950, - Variant43951, - Variant43952, - Variant43953, - Variant43954, - Variant43955, - Variant43956, - Variant43957, - Variant43958, - Variant43959, - Variant43960, - Variant43961, - Variant43962, - Variant43963, - Variant43964, - Variant43965, - Variant43966, - Variant43967, - Variant43968, - Variant43969, - Variant43970, - Variant43971, - Variant43972, - Variant43973, - Variant43974, - Variant43975, - Variant43976, - Variant43977, - Variant43978, - Variant43979, - Variant43980, - Variant43981, - Variant43982, - Variant43983, - Variant43984, - Variant43985, - Variant43986, - Variant43987, - Variant43988, - Variant43989, - Variant43990, - Variant43991, - Variant43992, - Variant43993, - Variant43994, - Variant43995, - Variant43996, - Variant43997, - Variant43998, - Variant43999, - Variant44000, - Variant44001, - Variant44002, - Variant44003, - Variant44004, - Variant44005, - Variant44006, - Variant44007, - Variant44008, - Variant44009, - Variant44010, - Variant44011, - Variant44012, - Variant44013, - Variant44014, - Variant44015, - Variant44016, - Variant44017, - Variant44018, - Variant44019, - Variant44020, - Variant44021, - Variant44022, - Variant44023, - Variant44024, - Variant44025, - Variant44026, - Variant44027, - Variant44028, - Variant44029, - Variant44030, - Variant44031, - Variant44032, - Variant44033, - Variant44034, - Variant44035, - Variant44036, - Variant44037, - Variant44038, - Variant44039, - Variant44040, - Variant44041, - Variant44042, - Variant44043, - Variant44044, - Variant44045, - Variant44046, - Variant44047, - Variant44048, - Variant44049, - Variant44050, - Variant44051, - Variant44052, - Variant44053, - Variant44054, - Variant44055, - Variant44056, - Variant44057, - Variant44058, - Variant44059, - Variant44060, - Variant44061, - Variant44062, - Variant44063, - Variant44064, - Variant44065, - Variant44066, - Variant44067, - Variant44068, - Variant44069, - Variant44070, - Variant44071, - Variant44072, - Variant44073, - Variant44074, - Variant44075, - Variant44076, - Variant44077, - Variant44078, - Variant44079, - Variant44080, - Variant44081, - Variant44082, - Variant44083, - Variant44084, - Variant44085, - Variant44086, - Variant44087, - Variant44088, - Variant44089, - Variant44090, - Variant44091, - Variant44092, - Variant44093, - Variant44094, - Variant44095, - Variant44096, - Variant44097, - Variant44098, - Variant44099, - Variant44100, - Variant44101, - Variant44102, - Variant44103, - Variant44104, - Variant44105, - Variant44106, - Variant44107, - Variant44108, - Variant44109, - Variant44110, - Variant44111, - Variant44112, - Variant44113, - Variant44114, - Variant44115, - Variant44116, - Variant44117, - Variant44118, - Variant44119, - Variant44120, - Variant44121, - Variant44122, - Variant44123, - Variant44124, - Variant44125, - Variant44126, - Variant44127, - Variant44128, - Variant44129, - Variant44130, - Variant44131, - Variant44132, - Variant44133, - Variant44134, - Variant44135, - Variant44136, - Variant44137, - Variant44138, - Variant44139, - Variant44140, - Variant44141, - Variant44142, - Variant44143, - Variant44144, - Variant44145, - Variant44146, - Variant44147, - Variant44148, - Variant44149, - Variant44150, - Variant44151, - Variant44152, - Variant44153, - Variant44154, - Variant44155, - Variant44156, - Variant44157, - Variant44158, - Variant44159, - Variant44160, - Variant44161, - Variant44162, - Variant44163, - Variant44164, - Variant44165, - Variant44166, - Variant44167, - Variant44168, - Variant44169, - Variant44170, - Variant44171, - Variant44172, - Variant44173, - Variant44174, - Variant44175, - Variant44176, - Variant44177, - Variant44178, - Variant44179, - Variant44180, - Variant44181, - Variant44182, - Variant44183, - Variant44184, - Variant44185, - Variant44186, - Variant44187, - Variant44188, - Variant44189, - Variant44190, - Variant44191, - Variant44192, - Variant44193, - Variant44194, - Variant44195, - Variant44196, - Variant44197, - Variant44198, - Variant44199, - Variant44200, - Variant44201, - Variant44202, - Variant44203, - Variant44204, - Variant44205, - Variant44206, - Variant44207, - Variant44208, - Variant44209, - Variant44210, - Variant44211, - Variant44212, - Variant44213, - Variant44214, - Variant44215, - Variant44216, - Variant44217, - Variant44218, - Variant44219, - Variant44220, - Variant44221, - Variant44222, - Variant44223, - Variant44224, - Variant44225, - Variant44226, - Variant44227, - Variant44228, - Variant44229, - Variant44230, - Variant44231, - Variant44232, - Variant44233, - Variant44234, - Variant44235, - Variant44236, - Variant44237, - Variant44238, - Variant44239, - Variant44240, - Variant44241, - Variant44242, - Variant44243, - Variant44244, - Variant44245, - Variant44246, - Variant44247, - Variant44248, - Variant44249, - Variant44250, - Variant44251, - Variant44252, - Variant44253, - Variant44254, - Variant44255, - Variant44256, - Variant44257, - Variant44258, - Variant44259, - Variant44260, - Variant44261, - Variant44262, - Variant44263, - Variant44264, - Variant44265, - Variant44266, - Variant44267, - Variant44268, - Variant44269, - Variant44270, - Variant44271, - Variant44272, - Variant44273, - Variant44274, - Variant44275, - Variant44276, - Variant44277, - Variant44278, - Variant44279, - Variant44280, - Variant44281, - Variant44282, - Variant44283, - Variant44284, - Variant44285, - Variant44286, - Variant44287, - Variant44288, - Variant44289, - Variant44290, - Variant44291, - Variant44292, - Variant44293, - Variant44294, - Variant44295, - Variant44296, - Variant44297, - Variant44298, - Variant44299, - Variant44300, - Variant44301, - Variant44302, - Variant44303, - Variant44304, - Variant44305, - Variant44306, - Variant44307, - Variant44308, - Variant44309, - Variant44310, - Variant44311, - Variant44312, - Variant44313, - Variant44314, - Variant44315, - Variant44316, - Variant44317, - Variant44318, - Variant44319, - Variant44320, - Variant44321, - Variant44322, - Variant44323, - Variant44324, - Variant44325, - Variant44326, - Variant44327, - Variant44328, - Variant44329, - Variant44330, - Variant44331, - Variant44332, - Variant44333, - Variant44334, - Variant44335, - Variant44336, - Variant44337, - Variant44338, - Variant44339, - Variant44340, - Variant44341, - Variant44342, - Variant44343, - Variant44344, - Variant44345, - Variant44346, - Variant44347, - Variant44348, - Variant44349, - Variant44350, - Variant44351, - Variant44352, - Variant44353, - Variant44354, - Variant44355, - Variant44356, - Variant44357, - Variant44358, - Variant44359, - Variant44360, - Variant44361, - Variant44362, - Variant44363, - Variant44364, - Variant44365, - Variant44366, - Variant44367, - Variant44368, - Variant44369, - Variant44370, - Variant44371, - Variant44372, - Variant44373, - Variant44374, - Variant44375, - Variant44376, - Variant44377, - Variant44378, - Variant44379, - Variant44380, - Variant44381, - Variant44382, - Variant44383, - Variant44384, - Variant44385, - Variant44386, - Variant44387, - Variant44388, - Variant44389, - Variant44390, - Variant44391, - Variant44392, - Variant44393, - Variant44394, - Variant44395, - Variant44396, - Variant44397, - Variant44398, - Variant44399, - Variant44400, - Variant44401, - Variant44402, - Variant44403, - Variant44404, - Variant44405, - Variant44406, - Variant44407, - Variant44408, - Variant44409, - Variant44410, - Variant44411, - Variant44412, - Variant44413, - Variant44414, - Variant44415, - Variant44416, - Variant44417, - Variant44418, - Variant44419, - Variant44420, - Variant44421, - Variant44422, - Variant44423, - Variant44424, - Variant44425, - Variant44426, - Variant44427, - Variant44428, - Variant44429, - Variant44430, - Variant44431, - Variant44432, - Variant44433, - Variant44434, - Variant44435, - Variant44436, - Variant44437, - Variant44438, - Variant44439, - Variant44440, - Variant44441, - Variant44442, - Variant44443, - Variant44444, - Variant44445, - Variant44446, - Variant44447, - Variant44448, - Variant44449, - Variant44450, - Variant44451, - Variant44452, - Variant44453, - Variant44454, - Variant44455, - Variant44456, - Variant44457, - Variant44458, - Variant44459, - Variant44460, - Variant44461, - Variant44462, - Variant44463, - Variant44464, - Variant44465, - Variant44466, - Variant44467, - Variant44468, - Variant44469, - Variant44470, - Variant44471, - Variant44472, - Variant44473, - Variant44474, - Variant44475, - Variant44476, - Variant44477, - Variant44478, - Variant44479, - Variant44480, - Variant44481, - Variant44482, - Variant44483, - Variant44484, - Variant44485, - Variant44486, - Variant44487, - Variant44488, - Variant44489, - Variant44490, - Variant44491, - Variant44492, - Variant44493, - Variant44494, - Variant44495, - Variant44496, - Variant44497, - Variant44498, - Variant44499, - Variant44500, - Variant44501, - Variant44502, - Variant44503, - Variant44504, - Variant44505, - Variant44506, - Variant44507, - Variant44508, - Variant44509, - Variant44510, - Variant44511, - Variant44512, - Variant44513, - Variant44514, - Variant44515, - Variant44516, - Variant44517, - Variant44518, - Variant44519, - Variant44520, - Variant44521, - Variant44522, - Variant44523, - Variant44524, - Variant44525, - Variant44526, - Variant44527, - Variant44528, - Variant44529, - Variant44530, - Variant44531, - Variant44532, - Variant44533, - Variant44534, - Variant44535, - Variant44536, - Variant44537, - Variant44538, - Variant44539, - Variant44540, - Variant44541, - Variant44542, - Variant44543, - Variant44544, - Variant44545, - Variant44546, - Variant44547, - Variant44548, - Variant44549, - Variant44550, - Variant44551, - Variant44552, - Variant44553, - Variant44554, - Variant44555, - Variant44556, - Variant44557, - Variant44558, - Variant44559, - Variant44560, - Variant44561, - Variant44562, - Variant44563, - Variant44564, - Variant44565, - Variant44566, - Variant44567, - Variant44568, - Variant44569, - Variant44570, - Variant44571, - Variant44572, - Variant44573, - Variant44574, - Variant44575, - Variant44576, - Variant44577, - Variant44578, - Variant44579, - Variant44580, - Variant44581, - Variant44582, - Variant44583, - Variant44584, - Variant44585, - Variant44586, - Variant44587, - Variant44588, - Variant44589, - Variant44590, - Variant44591, - Variant44592, - Variant44593, - Variant44594, - Variant44595, - Variant44596, - Variant44597, - Variant44598, - Variant44599, - Variant44600, - Variant44601, - Variant44602, - Variant44603, - Variant44604, - Variant44605, - Variant44606, - Variant44607, - Variant44608, - Variant44609, - Variant44610, - Variant44611, - Variant44612, - Variant44613, - Variant44614, - Variant44615, - Variant44616, - Variant44617, - Variant44618, - Variant44619, - Variant44620, - Variant44621, - Variant44622, - Variant44623, - Variant44624, - Variant44625, - Variant44626, - Variant44627, - Variant44628, - Variant44629, - Variant44630, - Variant44631, - Variant44632, - Variant44633, - Variant44634, - Variant44635, - Variant44636, - Variant44637, - Variant44638, - Variant44639, - Variant44640, - Variant44641, - Variant44642, - Variant44643, - Variant44644, - Variant44645, - Variant44646, - Variant44647, - Variant44648, - Variant44649, - Variant44650, - Variant44651, - Variant44652, - Variant44653, - Variant44654, - Variant44655, - Variant44656, - Variant44657, - Variant44658, - Variant44659, - Variant44660, - Variant44661, - Variant44662, - Variant44663, - Variant44664, - Variant44665, - Variant44666, - Variant44667, - Variant44668, - Variant44669, - Variant44670, - Variant44671, - Variant44672, - Variant44673, - Variant44674, - Variant44675, - Variant44676, - Variant44677, - Variant44678, - Variant44679, - Variant44680, - Variant44681, - Variant44682, - Variant44683, - Variant44684, - Variant44685, - Variant44686, - Variant44687, - Variant44688, - Variant44689, - Variant44690, - Variant44691, - Variant44692, - Variant44693, - Variant44694, - Variant44695, - Variant44696, - Variant44697, - Variant44698, - Variant44699, - Variant44700, - Variant44701, - Variant44702, - Variant44703, - Variant44704, - Variant44705, - Variant44706, - Variant44707, - Variant44708, - Variant44709, - Variant44710, - Variant44711, - Variant44712, - Variant44713, - Variant44714, - Variant44715, - Variant44716, - Variant44717, - Variant44718, - Variant44719, - Variant44720, - Variant44721, - Variant44722, - Variant44723, - Variant44724, - Variant44725, - Variant44726, - Variant44727, - Variant44728, - Variant44729, - Variant44730, - Variant44731, - Variant44732, - Variant44733, - Variant44734, - Variant44735, - Variant44736, - Variant44737, - Variant44738, - Variant44739, - Variant44740, - Variant44741, - Variant44742, - Variant44743, - Variant44744, - Variant44745, - Variant44746, - Variant44747, - Variant44748, - Variant44749, - Variant44750, - Variant44751, - Variant44752, - Variant44753, - Variant44754, - Variant44755, - Variant44756, - Variant44757, - Variant44758, - Variant44759, - Variant44760, - Variant44761, - Variant44762, - Variant44763, - Variant44764, - Variant44765, - Variant44766, - Variant44767, - Variant44768, - Variant44769, - Variant44770, - Variant44771, - Variant44772, - Variant44773, - Variant44774, - Variant44775, - Variant44776, - Variant44777, - Variant44778, - Variant44779, - Variant44780, - Variant44781, - Variant44782, - Variant44783, - Variant44784, - Variant44785, - Variant44786, - Variant44787, - Variant44788, - Variant44789, - Variant44790, - Variant44791, - Variant44792, - Variant44793, - Variant44794, - Variant44795, - Variant44796, - Variant44797, - Variant44798, - Variant44799, - Variant44800, - Variant44801, - Variant44802, - Variant44803, - Variant44804, - Variant44805, - Variant44806, - Variant44807, - Variant44808, - Variant44809, - Variant44810, - Variant44811, - Variant44812, - Variant44813, - Variant44814, - Variant44815, - Variant44816, - Variant44817, - Variant44818, - Variant44819, - Variant44820, - Variant44821, - Variant44822, - Variant44823, - Variant44824, - Variant44825, - Variant44826, - Variant44827, - Variant44828, - Variant44829, - Variant44830, - Variant44831, - Variant44832, - Variant44833, - Variant44834, - Variant44835, - Variant44836, - Variant44837, - Variant44838, - Variant44839, - Variant44840, - Variant44841, - Variant44842, - Variant44843, - Variant44844, - Variant44845, - Variant44846, - Variant44847, - Variant44848, - Variant44849, - Variant44850, - Variant44851, - Variant44852, - Variant44853, - Variant44854, - Variant44855, - Variant44856, - Variant44857, - Variant44858, - Variant44859, - Variant44860, - Variant44861, - Variant44862, - Variant44863, - Variant44864, - Variant44865, - Variant44866, - Variant44867, - Variant44868, - Variant44869, - Variant44870, - Variant44871, - Variant44872, - Variant44873, - Variant44874, - Variant44875, - Variant44876, - Variant44877, - Variant44878, - Variant44879, - Variant44880, - Variant44881, - Variant44882, - Variant44883, - Variant44884, - Variant44885, - Variant44886, - Variant44887, - Variant44888, - Variant44889, - Variant44890, - Variant44891, - Variant44892, - Variant44893, - Variant44894, - Variant44895, - Variant44896, - Variant44897, - Variant44898, - Variant44899, - Variant44900, - Variant44901, - Variant44902, - Variant44903, - Variant44904, - Variant44905, - Variant44906, - Variant44907, - Variant44908, - Variant44909, - Variant44910, - Variant44911, - Variant44912, - Variant44913, - Variant44914, - Variant44915, - Variant44916, - Variant44917, - Variant44918, - Variant44919, - Variant44920, - Variant44921, - Variant44922, - Variant44923, - Variant44924, - Variant44925, - Variant44926, - Variant44927, - Variant44928, - Variant44929, - Variant44930, - Variant44931, - Variant44932, - Variant44933, - Variant44934, - Variant44935, - Variant44936, - Variant44937, - Variant44938, - Variant44939, - Variant44940, - Variant44941, - Variant44942, - Variant44943, - Variant44944, - Variant44945, - Variant44946, - Variant44947, - Variant44948, - Variant44949, - Variant44950, - Variant44951, - Variant44952, - Variant44953, - Variant44954, - Variant44955, - Variant44956, - Variant44957, - Variant44958, - Variant44959, - Variant44960, - Variant44961, - Variant44962, - Variant44963, - Variant44964, - Variant44965, - Variant44966, - Variant44967, - Variant44968, - Variant44969, - Variant44970, - Variant44971, - Variant44972, - Variant44973, - Variant44974, - Variant44975, - Variant44976, - Variant44977, - Variant44978, - Variant44979, - Variant44980, - Variant44981, - Variant44982, - Variant44983, - Variant44984, - Variant44985, - Variant44986, - Variant44987, - Variant44988, - Variant44989, - Variant44990, - Variant44991, - Variant44992, - Variant44993, - Variant44994, - Variant44995, - Variant44996, - Variant44997, - Variant44998, - Variant44999, - Variant45000, - Variant45001, - Variant45002, - Variant45003, - Variant45004, - Variant45005, - Variant45006, - Variant45007, - Variant45008, - Variant45009, - Variant45010, - Variant45011, - Variant45012, - Variant45013, - Variant45014, - Variant45015, - Variant45016, - Variant45017, - Variant45018, - Variant45019, - Variant45020, - Variant45021, - Variant45022, - Variant45023, - Variant45024, - Variant45025, - Variant45026, - Variant45027, - Variant45028, - Variant45029, - Variant45030, - Variant45031, - Variant45032, - Variant45033, - Variant45034, - Variant45035, - Variant45036, - Variant45037, - Variant45038, - Variant45039, - Variant45040, - Variant45041, - Variant45042, - Variant45043, - Variant45044, - Variant45045, - Variant45046, - Variant45047, - Variant45048, - Variant45049, - Variant45050, - Variant45051, - Variant45052, - Variant45053, - Variant45054, - Variant45055, - Variant45056, - Variant45057, - Variant45058, - Variant45059, - Variant45060, - Variant45061, - Variant45062, - Variant45063, - Variant45064, - Variant45065, - Variant45066, - Variant45067, - Variant45068, - Variant45069, - Variant45070, - Variant45071, - Variant45072, - Variant45073, - Variant45074, - Variant45075, - Variant45076, - Variant45077, - Variant45078, - Variant45079, - Variant45080, - Variant45081, - Variant45082, - Variant45083, - Variant45084, - Variant45085, - Variant45086, - Variant45087, - Variant45088, - Variant45089, - Variant45090, - Variant45091, - Variant45092, - Variant45093, - Variant45094, - Variant45095, - Variant45096, - Variant45097, - Variant45098, - Variant45099, - Variant45100, - Variant45101, - Variant45102, - Variant45103, - Variant45104, - Variant45105, - Variant45106, - Variant45107, - Variant45108, - Variant45109, - Variant45110, - Variant45111, - Variant45112, - Variant45113, - Variant45114, - Variant45115, - Variant45116, - Variant45117, - Variant45118, - Variant45119, - Variant45120, - Variant45121, - Variant45122, - Variant45123, - Variant45124, - Variant45125, - Variant45126, - Variant45127, - Variant45128, - Variant45129, - Variant45130, - Variant45131, - Variant45132, - Variant45133, - Variant45134, - Variant45135, - Variant45136, - Variant45137, - Variant45138, - Variant45139, - Variant45140, - Variant45141, - Variant45142, - Variant45143, - Variant45144, - Variant45145, - Variant45146, - Variant45147, - Variant45148, - Variant45149, - Variant45150, - Variant45151, - Variant45152, - Variant45153, - Variant45154, - Variant45155, - Variant45156, - Variant45157, - Variant45158, - Variant45159, - Variant45160, - Variant45161, - Variant45162, - Variant45163, - Variant45164, - Variant45165, - Variant45166, - Variant45167, - Variant45168, - Variant45169, - Variant45170, - Variant45171, - Variant45172, - Variant45173, - Variant45174, - Variant45175, - Variant45176, - Variant45177, - Variant45178, - Variant45179, - Variant45180, - Variant45181, - Variant45182, - Variant45183, - Variant45184, - Variant45185, - Variant45186, - Variant45187, - Variant45188, - Variant45189, - Variant45190, - Variant45191, - Variant45192, - Variant45193, - Variant45194, - Variant45195, - Variant45196, - Variant45197, - Variant45198, - Variant45199, - Variant45200, - Variant45201, - Variant45202, - Variant45203, - Variant45204, - Variant45205, - Variant45206, - Variant45207, - Variant45208, - Variant45209, - Variant45210, - Variant45211, - Variant45212, - Variant45213, - Variant45214, - Variant45215, - Variant45216, - Variant45217, - Variant45218, - Variant45219, - Variant45220, - Variant45221, - Variant45222, - Variant45223, - Variant45224, - Variant45225, - Variant45226, - Variant45227, - Variant45228, - Variant45229, - Variant45230, - Variant45231, - Variant45232, - Variant45233, - Variant45234, - Variant45235, - Variant45236, - Variant45237, - Variant45238, - Variant45239, - Variant45240, - Variant45241, - Variant45242, - Variant45243, - Variant45244, - Variant45245, - Variant45246, - Variant45247, - Variant45248, - Variant45249, - Variant45250, - Variant45251, - Variant45252, - Variant45253, - Variant45254, - Variant45255, - Variant45256, - Variant45257, - Variant45258, - Variant45259, - Variant45260, - Variant45261, - Variant45262, - Variant45263, - Variant45264, - Variant45265, - Variant45266, - Variant45267, - Variant45268, - Variant45269, - Variant45270, - Variant45271, - Variant45272, - Variant45273, - Variant45274, - Variant45275, - Variant45276, - Variant45277, - Variant45278, - Variant45279, - Variant45280, - Variant45281, - Variant45282, - Variant45283, - Variant45284, - Variant45285, - Variant45286, - Variant45287, - Variant45288, - Variant45289, - Variant45290, - Variant45291, - Variant45292, - Variant45293, - Variant45294, - Variant45295, - Variant45296, - Variant45297, - Variant45298, - Variant45299, - Variant45300, - Variant45301, - Variant45302, - Variant45303, - Variant45304, - Variant45305, - Variant45306, - Variant45307, - Variant45308, - Variant45309, - Variant45310, - Variant45311, - Variant45312, - Variant45313, - Variant45314, - Variant45315, - Variant45316, - Variant45317, - Variant45318, - Variant45319, - Variant45320, - Variant45321, - Variant45322, - Variant45323, - Variant45324, - Variant45325, - Variant45326, - Variant45327, - Variant45328, - Variant45329, - Variant45330, - Variant45331, - Variant45332, - Variant45333, - Variant45334, - Variant45335, - Variant45336, - Variant45337, - Variant45338, - Variant45339, - Variant45340, - Variant45341, - Variant45342, - Variant45343, - Variant45344, - Variant45345, - Variant45346, - Variant45347, - Variant45348, - Variant45349, - Variant45350, - Variant45351, - Variant45352, - Variant45353, - Variant45354, - Variant45355, - Variant45356, - Variant45357, - Variant45358, - Variant45359, - Variant45360, - Variant45361, - Variant45362, - Variant45363, - Variant45364, - Variant45365, - Variant45366, - Variant45367, - Variant45368, - Variant45369, - Variant45370, - Variant45371, - Variant45372, - Variant45373, - Variant45374, - Variant45375, - Variant45376, - Variant45377, - Variant45378, - Variant45379, - Variant45380, - Variant45381, - Variant45382, - Variant45383, - Variant45384, - Variant45385, - Variant45386, - Variant45387, - Variant45388, - Variant45389, - Variant45390, - Variant45391, - Variant45392, - Variant45393, - Variant45394, - Variant45395, - Variant45396, - Variant45397, - Variant45398, - Variant45399, - Variant45400, - Variant45401, - Variant45402, - Variant45403, - Variant45404, - Variant45405, - Variant45406, - Variant45407, - Variant45408, - Variant45409, - Variant45410, - Variant45411, - Variant45412, - Variant45413, - Variant45414, - Variant45415, - Variant45416, - Variant45417, - Variant45418, - Variant45419, - Variant45420, - Variant45421, - Variant45422, - Variant45423, - Variant45424, - Variant45425, - Variant45426, - Variant45427, - Variant45428, - Variant45429, - Variant45430, - Variant45431, - Variant45432, - Variant45433, - Variant45434, - Variant45435, - Variant45436, - Variant45437, - Variant45438, - Variant45439, - Variant45440, - Variant45441, - Variant45442, - Variant45443, - Variant45444, - Variant45445, - Variant45446, - Variant45447, - Variant45448, - Variant45449, - Variant45450, - Variant45451, - Variant45452, - Variant45453, - Variant45454, - Variant45455, - Variant45456, - Variant45457, - Variant45458, - Variant45459, - Variant45460, - Variant45461, - Variant45462, - Variant45463, - Variant45464, - Variant45465, - Variant45466, - Variant45467, - Variant45468, - Variant45469, - Variant45470, - Variant45471, - Variant45472, - Variant45473, - Variant45474, - Variant45475, - Variant45476, - Variant45477, - Variant45478, - Variant45479, - Variant45480, - Variant45481, - Variant45482, - Variant45483, - Variant45484, - Variant45485, - Variant45486, - Variant45487, - Variant45488, - Variant45489, - Variant45490, - Variant45491, - Variant45492, - Variant45493, - Variant45494, - Variant45495, - Variant45496, - Variant45497, - Variant45498, - Variant45499, - Variant45500, - Variant45501, - Variant45502, - Variant45503, - Variant45504, - Variant45505, - Variant45506, - Variant45507, - Variant45508, - Variant45509, - Variant45510, - Variant45511, - Variant45512, - Variant45513, - Variant45514, - Variant45515, - Variant45516, - Variant45517, - Variant45518, - Variant45519, - Variant45520, - Variant45521, - Variant45522, - Variant45523, - Variant45524, - Variant45525, - Variant45526, - Variant45527, - Variant45528, - Variant45529, - Variant45530, - Variant45531, - Variant45532, - Variant45533, - Variant45534, - Variant45535, - Variant45536, - Variant45537, - Variant45538, - Variant45539, - Variant45540, - Variant45541, - Variant45542, - Variant45543, - Variant45544, - Variant45545, - Variant45546, - Variant45547, - Variant45548, - Variant45549, - Variant45550, - Variant45551, - Variant45552, - Variant45553, - Variant45554, - Variant45555, - Variant45556, - Variant45557, - Variant45558, - Variant45559, - Variant45560, - Variant45561, - Variant45562, - Variant45563, - Variant45564, - Variant45565, - Variant45566, - Variant45567, - Variant45568, - Variant45569, - Variant45570, - Variant45571, - Variant45572, - Variant45573, - Variant45574, - Variant45575, - Variant45576, - Variant45577, - Variant45578, - Variant45579, - Variant45580, - Variant45581, - Variant45582, - Variant45583, - Variant45584, - Variant45585, - Variant45586, - Variant45587, - Variant45588, - Variant45589, - Variant45590, - Variant45591, - Variant45592, - Variant45593, - Variant45594, - Variant45595, - Variant45596, - Variant45597, - Variant45598, - Variant45599, - Variant45600, - Variant45601, - Variant45602, - Variant45603, - Variant45604, - Variant45605, - Variant45606, - Variant45607, - Variant45608, - Variant45609, - Variant45610, - Variant45611, - Variant45612, - Variant45613, - Variant45614, - Variant45615, - Variant45616, - Variant45617, - Variant45618, - Variant45619, - Variant45620, - Variant45621, - Variant45622, - Variant45623, - Variant45624, - Variant45625, - Variant45626, - Variant45627, - Variant45628, - Variant45629, - Variant45630, - Variant45631, - Variant45632, - Variant45633, - Variant45634, - Variant45635, - Variant45636, - Variant45637, - Variant45638, - Variant45639, - Variant45640, - Variant45641, - Variant45642, - Variant45643, - Variant45644, - Variant45645, - Variant45646, - Variant45647, - Variant45648, - Variant45649, - Variant45650, - Variant45651, - Variant45652, - Variant45653, - Variant45654, - Variant45655, - Variant45656, - Variant45657, - Variant45658, - Variant45659, - Variant45660, - Variant45661, - Variant45662, - Variant45663, - Variant45664, - Variant45665, - Variant45666, - Variant45667, - Variant45668, - Variant45669, - Variant45670, - Variant45671, - Variant45672, - Variant45673, - Variant45674, - Variant45675, - Variant45676, - Variant45677, - Variant45678, - Variant45679, - Variant45680, - Variant45681, - Variant45682, - Variant45683, - Variant45684, - Variant45685, - Variant45686, - Variant45687, - Variant45688, - Variant45689, - Variant45690, - Variant45691, - Variant45692, - Variant45693, - Variant45694, - Variant45695, - Variant45696, - Variant45697, - Variant45698, - Variant45699, - Variant45700, - Variant45701, - Variant45702, - Variant45703, - Variant45704, - Variant45705, - Variant45706, - Variant45707, - Variant45708, - Variant45709, - Variant45710, - Variant45711, - Variant45712, - Variant45713, - Variant45714, - Variant45715, - Variant45716, - Variant45717, - Variant45718, - Variant45719, - Variant45720, - Variant45721, - Variant45722, - Variant45723, - Variant45724, - Variant45725, - Variant45726, - Variant45727, - Variant45728, - Variant45729, - Variant45730, - Variant45731, - Variant45732, - Variant45733, - Variant45734, - Variant45735, - Variant45736, - Variant45737, - Variant45738, - Variant45739, - Variant45740, - Variant45741, - Variant45742, - Variant45743, - Variant45744, - Variant45745, - Variant45746, - Variant45747, - Variant45748, - Variant45749, - Variant45750, - Variant45751, - Variant45752, - Variant45753, - Variant45754, - Variant45755, - Variant45756, - Variant45757, - Variant45758, - Variant45759, - Variant45760, - Variant45761, - Variant45762, - Variant45763, - Variant45764, - Variant45765, - Variant45766, - Variant45767, - Variant45768, - Variant45769, - Variant45770, - Variant45771, - Variant45772, - Variant45773, - Variant45774, - Variant45775, - Variant45776, - Variant45777, - Variant45778, - Variant45779, - Variant45780, - Variant45781, - Variant45782, - Variant45783, - Variant45784, - Variant45785, - Variant45786, - Variant45787, - Variant45788, - Variant45789, - Variant45790, - Variant45791, - Variant45792, - Variant45793, - Variant45794, - Variant45795, - Variant45796, - Variant45797, - Variant45798, - Variant45799, - Variant45800, - Variant45801, - Variant45802, - Variant45803, - Variant45804, - Variant45805, - Variant45806, - Variant45807, - Variant45808, - Variant45809, - Variant45810, - Variant45811, - Variant45812, - Variant45813, - Variant45814, - Variant45815, - Variant45816, - Variant45817, - Variant45818, - Variant45819, - Variant45820, - Variant45821, - Variant45822, - Variant45823, - Variant45824, - Variant45825, - Variant45826, - Variant45827, - Variant45828, - Variant45829, - Variant45830, - Variant45831, - Variant45832, - Variant45833, - Variant45834, - Variant45835, - Variant45836, - Variant45837, - Variant45838, - Variant45839, - Variant45840, - Variant45841, - Variant45842, - Variant45843, - Variant45844, - Variant45845, - Variant45846, - Variant45847, - Variant45848, - Variant45849, - Variant45850, - Variant45851, - Variant45852, - Variant45853, - Variant45854, - Variant45855, - Variant45856, - Variant45857, - Variant45858, - Variant45859, - Variant45860, - Variant45861, - Variant45862, - Variant45863, - Variant45864, - Variant45865, - Variant45866, - Variant45867, - Variant45868, - Variant45869, - Variant45870, - Variant45871, - Variant45872, - Variant45873, - Variant45874, - Variant45875, - Variant45876, - Variant45877, - Variant45878, - Variant45879, - Variant45880, - Variant45881, - Variant45882, - Variant45883, - Variant45884, - Variant45885, - Variant45886, - Variant45887, - Variant45888, - Variant45889, - Variant45890, - Variant45891, - Variant45892, - Variant45893, - Variant45894, - Variant45895, - Variant45896, - Variant45897, - Variant45898, - Variant45899, - Variant45900, - Variant45901, - Variant45902, - Variant45903, - Variant45904, - Variant45905, - Variant45906, - Variant45907, - Variant45908, - Variant45909, - Variant45910, - Variant45911, - Variant45912, - Variant45913, - Variant45914, - Variant45915, - Variant45916, - Variant45917, - Variant45918, - Variant45919, - Variant45920, - Variant45921, - Variant45922, - Variant45923, - Variant45924, - Variant45925, - Variant45926, - Variant45927, - Variant45928, - Variant45929, - Variant45930, - Variant45931, - Variant45932, - Variant45933, - Variant45934, - Variant45935, - Variant45936, - Variant45937, - Variant45938, - Variant45939, - Variant45940, - Variant45941, - Variant45942, - Variant45943, - Variant45944, - Variant45945, - Variant45946, - Variant45947, - Variant45948, - Variant45949, - Variant45950, - Variant45951, - Variant45952, - Variant45953, - Variant45954, - Variant45955, - Variant45956, - Variant45957, - Variant45958, - Variant45959, - Variant45960, - Variant45961, - Variant45962, - Variant45963, - Variant45964, - Variant45965, - Variant45966, - Variant45967, - Variant45968, - Variant45969, - Variant45970, - Variant45971, - Variant45972, - Variant45973, - Variant45974, - Variant45975, - Variant45976, - Variant45977, - Variant45978, - Variant45979, - Variant45980, - Variant45981, - Variant45982, - Variant45983, - Variant45984, - Variant45985, - Variant45986, - Variant45987, - Variant45988, - Variant45989, - Variant45990, - Variant45991, - Variant45992, - Variant45993, - Variant45994, - Variant45995, - Variant45996, - Variant45997, - Variant45998, - Variant45999, - Variant46000, - Variant46001, - Variant46002, - Variant46003, - Variant46004, - Variant46005, - Variant46006, - Variant46007, - Variant46008, - Variant46009, - Variant46010, - Variant46011, - Variant46012, - Variant46013, - Variant46014, - Variant46015, - Variant46016, - Variant46017, - Variant46018, - Variant46019, - Variant46020, - Variant46021, - Variant46022, - Variant46023, - Variant46024, - Variant46025, - Variant46026, - Variant46027, - Variant46028, - Variant46029, - Variant46030, - Variant46031, - Variant46032, - Variant46033, - Variant46034, - Variant46035, - Variant46036, - Variant46037, - Variant46038, - Variant46039, - Variant46040, - Variant46041, - Variant46042, - Variant46043, - Variant46044, - Variant46045, - Variant46046, - Variant46047, - Variant46048, - Variant46049, - Variant46050, - Variant46051, - Variant46052, - Variant46053, - Variant46054, - Variant46055, - Variant46056, - Variant46057, - Variant46058, - Variant46059, - Variant46060, - Variant46061, - Variant46062, - Variant46063, - Variant46064, - Variant46065, - Variant46066, - Variant46067, - Variant46068, - Variant46069, - Variant46070, - Variant46071, - Variant46072, - Variant46073, - Variant46074, - Variant46075, - Variant46076, - Variant46077, - Variant46078, - Variant46079, - Variant46080, - Variant46081, - Variant46082, - Variant46083, - Variant46084, - Variant46085, - Variant46086, - Variant46087, - Variant46088, - Variant46089, - Variant46090, - Variant46091, - Variant46092, - Variant46093, - Variant46094, - Variant46095, - Variant46096, - Variant46097, - Variant46098, - Variant46099, - Variant46100, - Variant46101, - Variant46102, - Variant46103, - Variant46104, - Variant46105, - Variant46106, - Variant46107, - Variant46108, - Variant46109, - Variant46110, - Variant46111, - Variant46112, - Variant46113, - Variant46114, - Variant46115, - Variant46116, - Variant46117, - Variant46118, - Variant46119, - Variant46120, - Variant46121, - Variant46122, - Variant46123, - Variant46124, - Variant46125, - Variant46126, - Variant46127, - Variant46128, - Variant46129, - Variant46130, - Variant46131, - Variant46132, - Variant46133, - Variant46134, - Variant46135, - Variant46136, - Variant46137, - Variant46138, - Variant46139, - Variant46140, - Variant46141, - Variant46142, - Variant46143, - Variant46144, - Variant46145, - Variant46146, - Variant46147, - Variant46148, - Variant46149, - Variant46150, - Variant46151, - Variant46152, - Variant46153, - Variant46154, - Variant46155, - Variant46156, - Variant46157, - Variant46158, - Variant46159, - Variant46160, - Variant46161, - Variant46162, - Variant46163, - Variant46164, - Variant46165, - Variant46166, - Variant46167, - Variant46168, - Variant46169, - Variant46170, - Variant46171, - Variant46172, - Variant46173, - Variant46174, - Variant46175, - Variant46176, - Variant46177, - Variant46178, - Variant46179, - Variant46180, - Variant46181, - Variant46182, - Variant46183, - Variant46184, - Variant46185, - Variant46186, - Variant46187, - Variant46188, - Variant46189, - Variant46190, - Variant46191, - Variant46192, - Variant46193, - Variant46194, - Variant46195, - Variant46196, - Variant46197, - Variant46198, - Variant46199, - Variant46200, - Variant46201, - Variant46202, - Variant46203, - Variant46204, - Variant46205, - Variant46206, - Variant46207, - Variant46208, - Variant46209, - Variant46210, - Variant46211, - Variant46212, - Variant46213, - Variant46214, - Variant46215, - Variant46216, - Variant46217, - Variant46218, - Variant46219, - Variant46220, - Variant46221, - Variant46222, - Variant46223, - Variant46224, - Variant46225, - Variant46226, - Variant46227, - Variant46228, - Variant46229, - Variant46230, - Variant46231, - Variant46232, - Variant46233, - Variant46234, - Variant46235, - Variant46236, - Variant46237, - Variant46238, - Variant46239, - Variant46240, - Variant46241, - Variant46242, - Variant46243, - Variant46244, - Variant46245, - Variant46246, - Variant46247, - Variant46248, - Variant46249, - Variant46250, - Variant46251, - Variant46252, - Variant46253, - Variant46254, - Variant46255, - Variant46256, - Variant46257, - Variant46258, - Variant46259, - Variant46260, - Variant46261, - Variant46262, - Variant46263, - Variant46264, - Variant46265, - Variant46266, - Variant46267, - Variant46268, - Variant46269, - Variant46270, - Variant46271, - Variant46272, - Variant46273, - Variant46274, - Variant46275, - Variant46276, - Variant46277, - Variant46278, - Variant46279, - Variant46280, - Variant46281, - Variant46282, - Variant46283, - Variant46284, - Variant46285, - Variant46286, - Variant46287, - Variant46288, - Variant46289, - Variant46290, - Variant46291, - Variant46292, - Variant46293, - Variant46294, - Variant46295, - Variant46296, - Variant46297, - Variant46298, - Variant46299, - Variant46300, - Variant46301, - Variant46302, - Variant46303, - Variant46304, - Variant46305, - Variant46306, - Variant46307, - Variant46308, - Variant46309, - Variant46310, - Variant46311, - Variant46312, - Variant46313, - Variant46314, - Variant46315, - Variant46316, - Variant46317, - Variant46318, - Variant46319, - Variant46320, - Variant46321, - Variant46322, - Variant46323, - Variant46324, - Variant46325, - Variant46326, - Variant46327, - Variant46328, - Variant46329, - Variant46330, - Variant46331, - Variant46332, - Variant46333, - Variant46334, - Variant46335, - Variant46336, - Variant46337, - Variant46338, - Variant46339, - Variant46340, - Variant46341, - Variant46342, - Variant46343, - Variant46344, - Variant46345, - Variant46346, - Variant46347, - Variant46348, - Variant46349, - Variant46350, - Variant46351, - Variant46352, - Variant46353, - Variant46354, - Variant46355, - Variant46356, - Variant46357, - Variant46358, - Variant46359, - Variant46360, - Variant46361, - Variant46362, - Variant46363, - Variant46364, - Variant46365, - Variant46366, - Variant46367, - Variant46368, - Variant46369, - Variant46370, - Variant46371, - Variant46372, - Variant46373, - Variant46374, - Variant46375, - Variant46376, - Variant46377, - Variant46378, - Variant46379, - Variant46380, - Variant46381, - Variant46382, - Variant46383, - Variant46384, - Variant46385, - Variant46386, - Variant46387, - Variant46388, - Variant46389, - Variant46390, - Variant46391, - Variant46392, - Variant46393, - Variant46394, - Variant46395, - Variant46396, - Variant46397, - Variant46398, - Variant46399, - Variant46400, - Variant46401, - Variant46402, - Variant46403, - Variant46404, - Variant46405, - Variant46406, - Variant46407, - Variant46408, - Variant46409, - Variant46410, - Variant46411, - Variant46412, - Variant46413, - Variant46414, - Variant46415, - Variant46416, - Variant46417, - Variant46418, - Variant46419, - Variant46420, - Variant46421, - Variant46422, - Variant46423, - Variant46424, - Variant46425, - Variant46426, - Variant46427, - Variant46428, - Variant46429, - Variant46430, - Variant46431, - Variant46432, - Variant46433, - Variant46434, - Variant46435, - Variant46436, - Variant46437, - Variant46438, - Variant46439, - Variant46440, - Variant46441, - Variant46442, - Variant46443, - Variant46444, - Variant46445, - Variant46446, - Variant46447, - Variant46448, - Variant46449, - Variant46450, - Variant46451, - Variant46452, - Variant46453, - Variant46454, - Variant46455, - Variant46456, - Variant46457, - Variant46458, - Variant46459, - Variant46460, - Variant46461, - Variant46462, - Variant46463, - Variant46464, - Variant46465, - Variant46466, - Variant46467, - Variant46468, - Variant46469, - Variant46470, - Variant46471, - Variant46472, - Variant46473, - Variant46474, - Variant46475, - Variant46476, - Variant46477, - Variant46478, - Variant46479, - Variant46480, - Variant46481, - Variant46482, - Variant46483, - Variant46484, - Variant46485, - Variant46486, - Variant46487, - Variant46488, - Variant46489, - Variant46490, - Variant46491, - Variant46492, - Variant46493, - Variant46494, - Variant46495, - Variant46496, - Variant46497, - Variant46498, - Variant46499, - Variant46500, - Variant46501, - Variant46502, - Variant46503, - Variant46504, - Variant46505, - Variant46506, - Variant46507, - Variant46508, - Variant46509, - Variant46510, - Variant46511, - Variant46512, - Variant46513, - Variant46514, - Variant46515, - Variant46516, - Variant46517, - Variant46518, - Variant46519, - Variant46520, - Variant46521, - Variant46522, - Variant46523, - Variant46524, - Variant46525, - Variant46526, - Variant46527, - Variant46528, - Variant46529, - Variant46530, - Variant46531, - Variant46532, - Variant46533, - Variant46534, - Variant46535, - Variant46536, - Variant46537, - Variant46538, - Variant46539, - Variant46540, - Variant46541, - Variant46542, - Variant46543, - Variant46544, - Variant46545, - Variant46546, - Variant46547, - Variant46548, - Variant46549, - Variant46550, - Variant46551, - Variant46552, - Variant46553, - Variant46554, - Variant46555, - Variant46556, - Variant46557, - Variant46558, - Variant46559, - Variant46560, - Variant46561, - Variant46562, - Variant46563, - Variant46564, - Variant46565, - Variant46566, - Variant46567, - Variant46568, - Variant46569, - Variant46570, - Variant46571, - Variant46572, - Variant46573, - Variant46574, - Variant46575, - Variant46576, - Variant46577, - Variant46578, - Variant46579, - Variant46580, - Variant46581, - Variant46582, - Variant46583, - Variant46584, - Variant46585, - Variant46586, - Variant46587, - Variant46588, - Variant46589, - Variant46590, - Variant46591, - Variant46592, - Variant46593, - Variant46594, - Variant46595, - Variant46596, - Variant46597, - Variant46598, - Variant46599, - Variant46600, - Variant46601, - Variant46602, - Variant46603, - Variant46604, - Variant46605, - Variant46606, - Variant46607, - Variant46608, - Variant46609, - Variant46610, - Variant46611, - Variant46612, - Variant46613, - Variant46614, - Variant46615, - Variant46616, - Variant46617, - Variant46618, - Variant46619, - Variant46620, - Variant46621, - Variant46622, - Variant46623, - Variant46624, - Variant46625, - Variant46626, - Variant46627, - Variant46628, - Variant46629, - Variant46630, - Variant46631, - Variant46632, - Variant46633, - Variant46634, - Variant46635, - Variant46636, - Variant46637, - Variant46638, - Variant46639, - Variant46640, - Variant46641, - Variant46642, - Variant46643, - Variant46644, - Variant46645, - Variant46646, - Variant46647, - Variant46648, - Variant46649, - Variant46650, - Variant46651, - Variant46652, - Variant46653, - Variant46654, - Variant46655, - Variant46656, - Variant46657, - Variant46658, - Variant46659, - Variant46660, - Variant46661, - Variant46662, - Variant46663, - Variant46664, - Variant46665, - Variant46666, - Variant46667, - Variant46668, - Variant46669, - Variant46670, - Variant46671, - Variant46672, - Variant46673, - Variant46674, - Variant46675, - Variant46676, - Variant46677, - Variant46678, - Variant46679, - Variant46680, - Variant46681, - Variant46682, - Variant46683, - Variant46684, - Variant46685, - Variant46686, - Variant46687, - Variant46688, - Variant46689, - Variant46690, - Variant46691, - Variant46692, - Variant46693, - Variant46694, - Variant46695, - Variant46696, - Variant46697, - Variant46698, - Variant46699, - Variant46700, - Variant46701, - Variant46702, - Variant46703, - Variant46704, - Variant46705, - Variant46706, - Variant46707, - Variant46708, - Variant46709, - Variant46710, - Variant46711, - Variant46712, - Variant46713, - Variant46714, - Variant46715, - Variant46716, - Variant46717, - Variant46718, - Variant46719, - Variant46720, - Variant46721, - Variant46722, - Variant46723, - Variant46724, - Variant46725, - Variant46726, - Variant46727, - Variant46728, - Variant46729, - Variant46730, - Variant46731, - Variant46732, - Variant46733, - Variant46734, - Variant46735, - Variant46736, - Variant46737, - Variant46738, - Variant46739, - Variant46740, - Variant46741, - Variant46742, - Variant46743, - Variant46744, - Variant46745, - Variant46746, - Variant46747, - Variant46748, - Variant46749, - Variant46750, - Variant46751, - Variant46752, - Variant46753, - Variant46754, - Variant46755, - Variant46756, - Variant46757, - Variant46758, - Variant46759, - Variant46760, - Variant46761, - Variant46762, - Variant46763, - Variant46764, - Variant46765, - Variant46766, - Variant46767, - Variant46768, - Variant46769, - Variant46770, - Variant46771, - Variant46772, - Variant46773, - Variant46774, - Variant46775, - Variant46776, - Variant46777, - Variant46778, - Variant46779, - Variant46780, - Variant46781, - Variant46782, - Variant46783, - Variant46784, - Variant46785, - Variant46786, - Variant46787, - Variant46788, - Variant46789, - Variant46790, - Variant46791, - Variant46792, - Variant46793, - Variant46794, - Variant46795, - Variant46796, - Variant46797, - Variant46798, - Variant46799, - Variant46800, - Variant46801, - Variant46802, - Variant46803, - Variant46804, - Variant46805, - Variant46806, - Variant46807, - Variant46808, - Variant46809, - Variant46810, - Variant46811, - Variant46812, - Variant46813, - Variant46814, - Variant46815, - Variant46816, - Variant46817, - Variant46818, - Variant46819, - Variant46820, - Variant46821, - Variant46822, - Variant46823, - Variant46824, - Variant46825, - Variant46826, - Variant46827, - Variant46828, - Variant46829, - Variant46830, - Variant46831, - Variant46832, - Variant46833, - Variant46834, - Variant46835, - Variant46836, - Variant46837, - Variant46838, - Variant46839, - Variant46840, - Variant46841, - Variant46842, - Variant46843, - Variant46844, - Variant46845, - Variant46846, - Variant46847, - Variant46848, - Variant46849, - Variant46850, - Variant46851, - Variant46852, - Variant46853, - Variant46854, - Variant46855, - Variant46856, - Variant46857, - Variant46858, - Variant46859, - Variant46860, - Variant46861, - Variant46862, - Variant46863, - Variant46864, - Variant46865, - Variant46866, - Variant46867, - Variant46868, - Variant46869, - Variant46870, - Variant46871, - Variant46872, - Variant46873, - Variant46874, - Variant46875, - Variant46876, - Variant46877, - Variant46878, - Variant46879, - Variant46880, - Variant46881, - Variant46882, - Variant46883, - Variant46884, - Variant46885, - Variant46886, - Variant46887, - Variant46888, - Variant46889, - Variant46890, - Variant46891, - Variant46892, - Variant46893, - Variant46894, - Variant46895, - Variant46896, - Variant46897, - Variant46898, - Variant46899, - Variant46900, - Variant46901, - Variant46902, - Variant46903, - Variant46904, - Variant46905, - Variant46906, - Variant46907, - Variant46908, - Variant46909, - Variant46910, - Variant46911, - Variant46912, - Variant46913, - Variant46914, - Variant46915, - Variant46916, - Variant46917, - Variant46918, - Variant46919, - Variant46920, - Variant46921, - Variant46922, - Variant46923, - Variant46924, - Variant46925, - Variant46926, - Variant46927, - Variant46928, - Variant46929, - Variant46930, - Variant46931, - Variant46932, - Variant46933, - Variant46934, - Variant46935, - Variant46936, - Variant46937, - Variant46938, - Variant46939, - Variant46940, - Variant46941, - Variant46942, - Variant46943, - Variant46944, - Variant46945, - Variant46946, - Variant46947, - Variant46948, - Variant46949, - Variant46950, - Variant46951, - Variant46952, - Variant46953, - Variant46954, - Variant46955, - Variant46956, - Variant46957, - Variant46958, - Variant46959, - Variant46960, - Variant46961, - Variant46962, - Variant46963, - Variant46964, - Variant46965, - Variant46966, - Variant46967, - Variant46968, - Variant46969, - Variant46970, - Variant46971, - Variant46972, - Variant46973, - Variant46974, - Variant46975, - Variant46976, - Variant46977, - Variant46978, - Variant46979, - Variant46980, - Variant46981, - Variant46982, - Variant46983, - Variant46984, - Variant46985, - Variant46986, - Variant46987, - Variant46988, - Variant46989, - Variant46990, - Variant46991, - Variant46992, - Variant46993, - Variant46994, - Variant46995, - Variant46996, - Variant46997, - Variant46998, - Variant46999, - Variant47000, - Variant47001, - Variant47002, - Variant47003, - Variant47004, - Variant47005, - Variant47006, - Variant47007, - Variant47008, - Variant47009, - Variant47010, - Variant47011, - Variant47012, - Variant47013, - Variant47014, - Variant47015, - Variant47016, - Variant47017, - Variant47018, - Variant47019, - Variant47020, - Variant47021, - Variant47022, - Variant47023, - Variant47024, - Variant47025, - Variant47026, - Variant47027, - Variant47028, - Variant47029, - Variant47030, - Variant47031, - Variant47032, - Variant47033, - Variant47034, - Variant47035, - Variant47036, - Variant47037, - Variant47038, - Variant47039, - Variant47040, - Variant47041, - Variant47042, - Variant47043, - Variant47044, - Variant47045, - Variant47046, - Variant47047, - Variant47048, - Variant47049, - Variant47050, - Variant47051, - Variant47052, - Variant47053, - Variant47054, - Variant47055, - Variant47056, - Variant47057, - Variant47058, - Variant47059, - Variant47060, - Variant47061, - Variant47062, - Variant47063, - Variant47064, - Variant47065, - Variant47066, - Variant47067, - Variant47068, - Variant47069, - Variant47070, - Variant47071, - Variant47072, - Variant47073, - Variant47074, - Variant47075, - Variant47076, - Variant47077, - Variant47078, - Variant47079, - Variant47080, - Variant47081, - Variant47082, - Variant47083, - Variant47084, - Variant47085, - Variant47086, - Variant47087, - Variant47088, - Variant47089, - Variant47090, - Variant47091, - Variant47092, - Variant47093, - Variant47094, - Variant47095, - Variant47096, - Variant47097, - Variant47098, - Variant47099, - Variant47100, - Variant47101, - Variant47102, - Variant47103, - Variant47104, - Variant47105, - Variant47106, - Variant47107, - Variant47108, - Variant47109, - Variant47110, - Variant47111, - Variant47112, - Variant47113, - Variant47114, - Variant47115, - Variant47116, - Variant47117, - Variant47118, - Variant47119, - Variant47120, - Variant47121, - Variant47122, - Variant47123, - Variant47124, - Variant47125, - Variant47126, - Variant47127, - Variant47128, - Variant47129, - Variant47130, - Variant47131, - Variant47132, - Variant47133, - Variant47134, - Variant47135, - Variant47136, - Variant47137, - Variant47138, - Variant47139, - Variant47140, - Variant47141, - Variant47142, - Variant47143, - Variant47144, - Variant47145, - Variant47146, - Variant47147, - Variant47148, - Variant47149, - Variant47150, - Variant47151, - Variant47152, - Variant47153, - Variant47154, - Variant47155, - Variant47156, - Variant47157, - Variant47158, - Variant47159, - Variant47160, - Variant47161, - Variant47162, - Variant47163, - Variant47164, - Variant47165, - Variant47166, - Variant47167, - Variant47168, - Variant47169, - Variant47170, - Variant47171, - Variant47172, - Variant47173, - Variant47174, - Variant47175, - Variant47176, - Variant47177, - Variant47178, - Variant47179, - Variant47180, - Variant47181, - Variant47182, - Variant47183, - Variant47184, - Variant47185, - Variant47186, - Variant47187, - Variant47188, - Variant47189, - Variant47190, - Variant47191, - Variant47192, - Variant47193, - Variant47194, - Variant47195, - Variant47196, - Variant47197, - Variant47198, - Variant47199, - Variant47200, - Variant47201, - Variant47202, - Variant47203, - Variant47204, - Variant47205, - Variant47206, - Variant47207, - Variant47208, - Variant47209, - Variant47210, - Variant47211, - Variant47212, - Variant47213, - Variant47214, - Variant47215, - Variant47216, - Variant47217, - Variant47218, - Variant47219, - Variant47220, - Variant47221, - Variant47222, - Variant47223, - Variant47224, - Variant47225, - Variant47226, - Variant47227, - Variant47228, - Variant47229, - Variant47230, - Variant47231, - Variant47232, - Variant47233, - Variant47234, - Variant47235, - Variant47236, - Variant47237, - Variant47238, - Variant47239, - Variant47240, - Variant47241, - Variant47242, - Variant47243, - Variant47244, - Variant47245, - Variant47246, - Variant47247, - Variant47248, - Variant47249, - Variant47250, - Variant47251, - Variant47252, - Variant47253, - Variant47254, - Variant47255, - Variant47256, - Variant47257, - Variant47258, - Variant47259, - Variant47260, - Variant47261, - Variant47262, - Variant47263, - Variant47264, - Variant47265, - Variant47266, - Variant47267, - Variant47268, - Variant47269, - Variant47270, - Variant47271, - Variant47272, - Variant47273, - Variant47274, - Variant47275, - Variant47276, - Variant47277, - Variant47278, - Variant47279, - Variant47280, - Variant47281, - Variant47282, - Variant47283, - Variant47284, - Variant47285, - Variant47286, - Variant47287, - Variant47288, - Variant47289, - Variant47290, - Variant47291, - Variant47292, - Variant47293, - Variant47294, - Variant47295, - Variant47296, - Variant47297, - Variant47298, - Variant47299, - Variant47300, - Variant47301, - Variant47302, - Variant47303, - Variant47304, - Variant47305, - Variant47306, - Variant47307, - Variant47308, - Variant47309, - Variant47310, - Variant47311, - Variant47312, - Variant47313, - Variant47314, - Variant47315, - Variant47316, - Variant47317, - Variant47318, - Variant47319, - Variant47320, - Variant47321, - Variant47322, - Variant47323, - Variant47324, - Variant47325, - Variant47326, - Variant47327, - Variant47328, - Variant47329, - Variant47330, - Variant47331, - Variant47332, - Variant47333, - Variant47334, - Variant47335, - Variant47336, - Variant47337, - Variant47338, - Variant47339, - Variant47340, - Variant47341, - Variant47342, - Variant47343, - Variant47344, - Variant47345, - Variant47346, - Variant47347, - Variant47348, - Variant47349, - Variant47350, - Variant47351, - Variant47352, - Variant47353, - Variant47354, - Variant47355, - Variant47356, - Variant47357, - Variant47358, - Variant47359, - Variant47360, - Variant47361, - Variant47362, - Variant47363, - Variant47364, - Variant47365, - Variant47366, - Variant47367, - Variant47368, - Variant47369, - Variant47370, - Variant47371, - Variant47372, - Variant47373, - Variant47374, - Variant47375, - Variant47376, - Variant47377, - Variant47378, - Variant47379, - Variant47380, - Variant47381, - Variant47382, - Variant47383, - Variant47384, - Variant47385, - Variant47386, - Variant47387, - Variant47388, - Variant47389, - Variant47390, - Variant47391, - Variant47392, - Variant47393, - Variant47394, - Variant47395, - Variant47396, - Variant47397, - Variant47398, - Variant47399, - Variant47400, - Variant47401, - Variant47402, - Variant47403, - Variant47404, - Variant47405, - Variant47406, - Variant47407, - Variant47408, - Variant47409, - Variant47410, - Variant47411, - Variant47412, - Variant47413, - Variant47414, - Variant47415, - Variant47416, - Variant47417, - Variant47418, - Variant47419, - Variant47420, - Variant47421, - Variant47422, - Variant47423, - Variant47424, - Variant47425, - Variant47426, - Variant47427, - Variant47428, - Variant47429, - Variant47430, - Variant47431, - Variant47432, - Variant47433, - Variant47434, - Variant47435, - Variant47436, - Variant47437, - Variant47438, - Variant47439, - Variant47440, - Variant47441, - Variant47442, - Variant47443, - Variant47444, - Variant47445, - Variant47446, - Variant47447, - Variant47448, - Variant47449, - Variant47450, - Variant47451, - Variant47452, - Variant47453, - Variant47454, - Variant47455, - Variant47456, - Variant47457, - Variant47458, - Variant47459, - Variant47460, - Variant47461, - Variant47462, - Variant47463, - Variant47464, - Variant47465, - Variant47466, - Variant47467, - Variant47468, - Variant47469, - Variant47470, - Variant47471, - Variant47472, - Variant47473, - Variant47474, - Variant47475, - Variant47476, - Variant47477, - Variant47478, - Variant47479, - Variant47480, - Variant47481, - Variant47482, - Variant47483, - Variant47484, - Variant47485, - Variant47486, - Variant47487, - Variant47488, - Variant47489, - Variant47490, - Variant47491, - Variant47492, - Variant47493, - Variant47494, - Variant47495, - Variant47496, - Variant47497, - Variant47498, - Variant47499, - Variant47500, - Variant47501, - Variant47502, - Variant47503, - Variant47504, - Variant47505, - Variant47506, - Variant47507, - Variant47508, - Variant47509, - Variant47510, - Variant47511, - Variant47512, - Variant47513, - Variant47514, - Variant47515, - Variant47516, - Variant47517, - Variant47518, - Variant47519, - Variant47520, - Variant47521, - Variant47522, - Variant47523, - Variant47524, - Variant47525, - Variant47526, - Variant47527, - Variant47528, - Variant47529, - Variant47530, - Variant47531, - Variant47532, - Variant47533, - Variant47534, - Variant47535, - Variant47536, - Variant47537, - Variant47538, - Variant47539, - Variant47540, - Variant47541, - Variant47542, - Variant47543, - Variant47544, - Variant47545, - Variant47546, - Variant47547, - Variant47548, - Variant47549, - Variant47550, - Variant47551, - Variant47552, - Variant47553, - Variant47554, - Variant47555, - Variant47556, - Variant47557, - Variant47558, - Variant47559, - Variant47560, - Variant47561, - Variant47562, - Variant47563, - Variant47564, - Variant47565, - Variant47566, - Variant47567, - Variant47568, - Variant47569, - Variant47570, - Variant47571, - Variant47572, - Variant47573, - Variant47574, - Variant47575, - Variant47576, - Variant47577, - Variant47578, - Variant47579, - Variant47580, - Variant47581, - Variant47582, - Variant47583, - Variant47584, - Variant47585, - Variant47586, - Variant47587, - Variant47588, - Variant47589, - Variant47590, - Variant47591, - Variant47592, - Variant47593, - Variant47594, - Variant47595, - Variant47596, - Variant47597, - Variant47598, - Variant47599, - Variant47600, - Variant47601, - Variant47602, - Variant47603, - Variant47604, - Variant47605, - Variant47606, - Variant47607, - Variant47608, - Variant47609, - Variant47610, - Variant47611, - Variant47612, - Variant47613, - Variant47614, - Variant47615, - Variant47616, - Variant47617, - Variant47618, - Variant47619, - Variant47620, - Variant47621, - Variant47622, - Variant47623, - Variant47624, - Variant47625, - Variant47626, - Variant47627, - Variant47628, - Variant47629, - Variant47630, - Variant47631, - Variant47632, - Variant47633, - Variant47634, - Variant47635, - Variant47636, - Variant47637, - Variant47638, - Variant47639, - Variant47640, - Variant47641, - Variant47642, - Variant47643, - Variant47644, - Variant47645, - Variant47646, - Variant47647, - Variant47648, - Variant47649, - Variant47650, - Variant47651, - Variant47652, - Variant47653, - Variant47654, - Variant47655, - Variant47656, - Variant47657, - Variant47658, - Variant47659, - Variant47660, - Variant47661, - Variant47662, - Variant47663, - Variant47664, - Variant47665, - Variant47666, - Variant47667, - Variant47668, - Variant47669, - Variant47670, - Variant47671, - Variant47672, - Variant47673, - Variant47674, - Variant47675, - Variant47676, - Variant47677, - Variant47678, - Variant47679, - Variant47680, - Variant47681, - Variant47682, - Variant47683, - Variant47684, - Variant47685, - Variant47686, - Variant47687, - Variant47688, - Variant47689, - Variant47690, - Variant47691, - Variant47692, - Variant47693, - Variant47694, - Variant47695, - Variant47696, - Variant47697, - Variant47698, - Variant47699, - Variant47700, - Variant47701, - Variant47702, - Variant47703, - Variant47704, - Variant47705, - Variant47706, - Variant47707, - Variant47708, - Variant47709, - Variant47710, - Variant47711, - Variant47712, - Variant47713, - Variant47714, - Variant47715, - Variant47716, - Variant47717, - Variant47718, - Variant47719, - Variant47720, - Variant47721, - Variant47722, - Variant47723, - Variant47724, - Variant47725, - Variant47726, - Variant47727, - Variant47728, - Variant47729, - Variant47730, - Variant47731, - Variant47732, - Variant47733, - Variant47734, - Variant47735, - Variant47736, - Variant47737, - Variant47738, - Variant47739, - Variant47740, - Variant47741, - Variant47742, - Variant47743, - Variant47744, - Variant47745, - Variant47746, - Variant47747, - Variant47748, - Variant47749, - Variant47750, - Variant47751, - Variant47752, - Variant47753, - Variant47754, - Variant47755, - Variant47756, - Variant47757, - Variant47758, - Variant47759, - Variant47760, - Variant47761, - Variant47762, - Variant47763, - Variant47764, - Variant47765, - Variant47766, - Variant47767, - Variant47768, - Variant47769, - Variant47770, - Variant47771, - Variant47772, - Variant47773, - Variant47774, - Variant47775, - Variant47776, - Variant47777, - Variant47778, - Variant47779, - Variant47780, - Variant47781, - Variant47782, - Variant47783, - Variant47784, - Variant47785, - Variant47786, - Variant47787, - Variant47788, - Variant47789, - Variant47790, - Variant47791, - Variant47792, - Variant47793, - Variant47794, - Variant47795, - Variant47796, - Variant47797, - Variant47798, - Variant47799, - Variant47800, - Variant47801, - Variant47802, - Variant47803, - Variant47804, - Variant47805, - Variant47806, - Variant47807, - Variant47808, - Variant47809, - Variant47810, - Variant47811, - Variant47812, - Variant47813, - Variant47814, - Variant47815, - Variant47816, - Variant47817, - Variant47818, - Variant47819, - Variant47820, - Variant47821, - Variant47822, - Variant47823, - Variant47824, - Variant47825, - Variant47826, - Variant47827, - Variant47828, - Variant47829, - Variant47830, - Variant47831, - Variant47832, - Variant47833, - Variant47834, - Variant47835, - Variant47836, - Variant47837, - Variant47838, - Variant47839, - Variant47840, - Variant47841, - Variant47842, - Variant47843, - Variant47844, - Variant47845, - Variant47846, - Variant47847, - Variant47848, - Variant47849, - Variant47850, - Variant47851, - Variant47852, - Variant47853, - Variant47854, - Variant47855, - Variant47856, - Variant47857, - Variant47858, - Variant47859, - Variant47860, - Variant47861, - Variant47862, - Variant47863, - Variant47864, - Variant47865, - Variant47866, - Variant47867, - Variant47868, - Variant47869, - Variant47870, - Variant47871, - Variant47872, - Variant47873, - Variant47874, - Variant47875, - Variant47876, - Variant47877, - Variant47878, - Variant47879, - Variant47880, - Variant47881, - Variant47882, - Variant47883, - Variant47884, - Variant47885, - Variant47886, - Variant47887, - Variant47888, - Variant47889, - Variant47890, - Variant47891, - Variant47892, - Variant47893, - Variant47894, - Variant47895, - Variant47896, - Variant47897, - Variant47898, - Variant47899, - Variant47900, - Variant47901, - Variant47902, - Variant47903, - Variant47904, - Variant47905, - Variant47906, - Variant47907, - Variant47908, - Variant47909, - Variant47910, - Variant47911, - Variant47912, - Variant47913, - Variant47914, - Variant47915, - Variant47916, - Variant47917, - Variant47918, - Variant47919, - Variant47920, - Variant47921, - Variant47922, - Variant47923, - Variant47924, - Variant47925, - Variant47926, - Variant47927, - Variant47928, - Variant47929, - Variant47930, - Variant47931, - Variant47932, - Variant47933, - Variant47934, - Variant47935, - Variant47936, - Variant47937, - Variant47938, - Variant47939, - Variant47940, - Variant47941, - Variant47942, - Variant47943, - Variant47944, - Variant47945, - Variant47946, - Variant47947, - Variant47948, - Variant47949, - Variant47950, - Variant47951, - Variant47952, - Variant47953, - Variant47954, - Variant47955, - Variant47956, - Variant47957, - Variant47958, - Variant47959, - Variant47960, - Variant47961, - Variant47962, - Variant47963, - Variant47964, - Variant47965, - Variant47966, - Variant47967, - Variant47968, - Variant47969, - Variant47970, - Variant47971, - Variant47972, - Variant47973, - Variant47974, - Variant47975, - Variant47976, - Variant47977, - Variant47978, - Variant47979, - Variant47980, - Variant47981, - Variant47982, - Variant47983, - Variant47984, - Variant47985, - Variant47986, - Variant47987, - Variant47988, - Variant47989, - Variant47990, - Variant47991, - Variant47992, - Variant47993, - Variant47994, - Variant47995, - Variant47996, - Variant47997, - Variant47998, - Variant47999, - Variant48000, - Variant48001, - Variant48002, - Variant48003, - Variant48004, - Variant48005, - Variant48006, - Variant48007, - Variant48008, - Variant48009, - Variant48010, - Variant48011, - Variant48012, - Variant48013, - Variant48014, - Variant48015, - Variant48016, - Variant48017, - Variant48018, - Variant48019, - Variant48020, - Variant48021, - Variant48022, - Variant48023, - Variant48024, - Variant48025, - Variant48026, - Variant48027, - Variant48028, - Variant48029, - Variant48030, - Variant48031, - Variant48032, - Variant48033, - Variant48034, - Variant48035, - Variant48036, - Variant48037, - Variant48038, - Variant48039, - Variant48040, - Variant48041, - Variant48042, - Variant48043, - Variant48044, - Variant48045, - Variant48046, - Variant48047, - Variant48048, - Variant48049, - Variant48050, - Variant48051, - Variant48052, - Variant48053, - Variant48054, - Variant48055, - Variant48056, - Variant48057, - Variant48058, - Variant48059, - Variant48060, - Variant48061, - Variant48062, - Variant48063, - Variant48064, - Variant48065, - Variant48066, - Variant48067, - Variant48068, - Variant48069, - Variant48070, - Variant48071, - Variant48072, - Variant48073, - Variant48074, - Variant48075, - Variant48076, - Variant48077, - Variant48078, - Variant48079, - Variant48080, - Variant48081, - Variant48082, - Variant48083, - Variant48084, - Variant48085, - Variant48086, - Variant48087, - Variant48088, - Variant48089, - Variant48090, - Variant48091, - Variant48092, - Variant48093, - Variant48094, - Variant48095, - Variant48096, - Variant48097, - Variant48098, - Variant48099, - Variant48100, - Variant48101, - Variant48102, - Variant48103, - Variant48104, - Variant48105, - Variant48106, - Variant48107, - Variant48108, - Variant48109, - Variant48110, - Variant48111, - Variant48112, - Variant48113, - Variant48114, - Variant48115, - Variant48116, - Variant48117, - Variant48118, - Variant48119, - Variant48120, - Variant48121, - Variant48122, - Variant48123, - Variant48124, - Variant48125, - Variant48126, - Variant48127, - Variant48128, - Variant48129, - Variant48130, - Variant48131, - Variant48132, - Variant48133, - Variant48134, - Variant48135, - Variant48136, - Variant48137, - Variant48138, - Variant48139, - Variant48140, - Variant48141, - Variant48142, - Variant48143, - Variant48144, - Variant48145, - Variant48146, - Variant48147, - Variant48148, - Variant48149, - Variant48150, - Variant48151, - Variant48152, - Variant48153, - Variant48154, - Variant48155, - Variant48156, - Variant48157, - Variant48158, - Variant48159, - Variant48160, - Variant48161, - Variant48162, - Variant48163, - Variant48164, - Variant48165, - Variant48166, - Variant48167, - Variant48168, - Variant48169, - Variant48170, - Variant48171, - Variant48172, - Variant48173, - Variant48174, - Variant48175, - Variant48176, - Variant48177, - Variant48178, - Variant48179, - Variant48180, - Variant48181, - Variant48182, - Variant48183, - Variant48184, - Variant48185, - Variant48186, - Variant48187, - Variant48188, - Variant48189, - Variant48190, - Variant48191, - Variant48192, - Variant48193, - Variant48194, - Variant48195, - Variant48196, - Variant48197, - Variant48198, - Variant48199, - Variant48200, - Variant48201, - Variant48202, - Variant48203, - Variant48204, - Variant48205, - Variant48206, - Variant48207, - Variant48208, - Variant48209, - Variant48210, - Variant48211, - Variant48212, - Variant48213, - Variant48214, - Variant48215, - Variant48216, - Variant48217, - Variant48218, - Variant48219, - Variant48220, - Variant48221, - Variant48222, - Variant48223, - Variant48224, - Variant48225, - Variant48226, - Variant48227, - Variant48228, - Variant48229, - Variant48230, - Variant48231, - Variant48232, - Variant48233, - Variant48234, - Variant48235, - Variant48236, - Variant48237, - Variant48238, - Variant48239, - Variant48240, - Variant48241, - Variant48242, - Variant48243, - Variant48244, - Variant48245, - Variant48246, - Variant48247, - Variant48248, - Variant48249, - Variant48250, - Variant48251, - Variant48252, - Variant48253, - Variant48254, - Variant48255, - Variant48256, - Variant48257, - Variant48258, - Variant48259, - Variant48260, - Variant48261, - Variant48262, - Variant48263, - Variant48264, - Variant48265, - Variant48266, - Variant48267, - Variant48268, - Variant48269, - Variant48270, - Variant48271, - Variant48272, - Variant48273, - Variant48274, - Variant48275, - Variant48276, - Variant48277, - Variant48278, - Variant48279, - Variant48280, - Variant48281, - Variant48282, - Variant48283, - Variant48284, - Variant48285, - Variant48286, - Variant48287, - Variant48288, - Variant48289, - Variant48290, - Variant48291, - Variant48292, - Variant48293, - Variant48294, - Variant48295, - Variant48296, - Variant48297, - Variant48298, - Variant48299, - Variant48300, - Variant48301, - Variant48302, - Variant48303, - Variant48304, - Variant48305, - Variant48306, - Variant48307, - Variant48308, - Variant48309, - Variant48310, - Variant48311, - Variant48312, - Variant48313, - Variant48314, - Variant48315, - Variant48316, - Variant48317, - Variant48318, - Variant48319, - Variant48320, - Variant48321, - Variant48322, - Variant48323, - Variant48324, - Variant48325, - Variant48326, - Variant48327, - Variant48328, - Variant48329, - Variant48330, - Variant48331, - Variant48332, - Variant48333, - Variant48334, - Variant48335, - Variant48336, - Variant48337, - Variant48338, - Variant48339, - Variant48340, - Variant48341, - Variant48342, - Variant48343, - Variant48344, - Variant48345, - Variant48346, - Variant48347, - Variant48348, - Variant48349, - Variant48350, - Variant48351, - Variant48352, - Variant48353, - Variant48354, - Variant48355, - Variant48356, - Variant48357, - Variant48358, - Variant48359, - Variant48360, - Variant48361, - Variant48362, - Variant48363, - Variant48364, - Variant48365, - Variant48366, - Variant48367, - Variant48368, - Variant48369, - Variant48370, - Variant48371, - Variant48372, - Variant48373, - Variant48374, - Variant48375, - Variant48376, - Variant48377, - Variant48378, - Variant48379, - Variant48380, - Variant48381, - Variant48382, - Variant48383, - Variant48384, - Variant48385, - Variant48386, - Variant48387, - Variant48388, - Variant48389, - Variant48390, - Variant48391, - Variant48392, - Variant48393, - Variant48394, - Variant48395, - Variant48396, - Variant48397, - Variant48398, - Variant48399, - Variant48400, - Variant48401, - Variant48402, - Variant48403, - Variant48404, - Variant48405, - Variant48406, - Variant48407, - Variant48408, - Variant48409, - Variant48410, - Variant48411, - Variant48412, - Variant48413, - Variant48414, - Variant48415, - Variant48416, - Variant48417, - Variant48418, - Variant48419, - Variant48420, - Variant48421, - Variant48422, - Variant48423, - Variant48424, - Variant48425, - Variant48426, - Variant48427, - Variant48428, - Variant48429, - Variant48430, - Variant48431, - Variant48432, - Variant48433, - Variant48434, - Variant48435, - Variant48436, - Variant48437, - Variant48438, - Variant48439, - Variant48440, - Variant48441, - Variant48442, - Variant48443, - Variant48444, - Variant48445, - Variant48446, - Variant48447, - Variant48448, - Variant48449, - Variant48450, - Variant48451, - Variant48452, - Variant48453, - Variant48454, - Variant48455, - Variant48456, - Variant48457, - Variant48458, - Variant48459, - Variant48460, - Variant48461, - Variant48462, - Variant48463, - Variant48464, - Variant48465, - Variant48466, - Variant48467, - Variant48468, - Variant48469, - Variant48470, - Variant48471, - Variant48472, - Variant48473, - Variant48474, - Variant48475, - Variant48476, - Variant48477, - Variant48478, - Variant48479, - Variant48480, - Variant48481, - Variant48482, - Variant48483, - Variant48484, - Variant48485, - Variant48486, - Variant48487, - Variant48488, - Variant48489, - Variant48490, - Variant48491, - Variant48492, - Variant48493, - Variant48494, - Variant48495, - Variant48496, - Variant48497, - Variant48498, - Variant48499, - Variant48500, - Variant48501, - Variant48502, - Variant48503, - Variant48504, - Variant48505, - Variant48506, - Variant48507, - Variant48508, - Variant48509, - Variant48510, - Variant48511, - Variant48512, - Variant48513, - Variant48514, - Variant48515, - Variant48516, - Variant48517, - Variant48518, - Variant48519, - Variant48520, - Variant48521, - Variant48522, - Variant48523, - Variant48524, - Variant48525, - Variant48526, - Variant48527, - Variant48528, - Variant48529, - Variant48530, - Variant48531, - Variant48532, - Variant48533, - Variant48534, - Variant48535, - Variant48536, - Variant48537, - Variant48538, - Variant48539, - Variant48540, - Variant48541, - Variant48542, - Variant48543, - Variant48544, - Variant48545, - Variant48546, - Variant48547, - Variant48548, - Variant48549, - Variant48550, - Variant48551, - Variant48552, - Variant48553, - Variant48554, - Variant48555, - Variant48556, - Variant48557, - Variant48558, - Variant48559, - Variant48560, - Variant48561, - Variant48562, - Variant48563, - Variant48564, - Variant48565, - Variant48566, - Variant48567, - Variant48568, - Variant48569, - Variant48570, - Variant48571, - Variant48572, - Variant48573, - Variant48574, - Variant48575, - Variant48576, - Variant48577, - Variant48578, - Variant48579, - Variant48580, - Variant48581, - Variant48582, - Variant48583, - Variant48584, - Variant48585, - Variant48586, - Variant48587, - Variant48588, - Variant48589, - Variant48590, - Variant48591, - Variant48592, - Variant48593, - Variant48594, - Variant48595, - Variant48596, - Variant48597, - Variant48598, - Variant48599, - Variant48600, - Variant48601, - Variant48602, - Variant48603, - Variant48604, - Variant48605, - Variant48606, - Variant48607, - Variant48608, - Variant48609, - Variant48610, - Variant48611, - Variant48612, - Variant48613, - Variant48614, - Variant48615, - Variant48616, - Variant48617, - Variant48618, - Variant48619, - Variant48620, - Variant48621, - Variant48622, - Variant48623, - Variant48624, - Variant48625, - Variant48626, - Variant48627, - Variant48628, - Variant48629, - Variant48630, - Variant48631, - Variant48632, - Variant48633, - Variant48634, - Variant48635, - Variant48636, - Variant48637, - Variant48638, - Variant48639, - Variant48640, - Variant48641, - Variant48642, - Variant48643, - Variant48644, - Variant48645, - Variant48646, - Variant48647, - Variant48648, - Variant48649, - Variant48650, - Variant48651, - Variant48652, - Variant48653, - Variant48654, - Variant48655, - Variant48656, - Variant48657, - Variant48658, - Variant48659, - Variant48660, - Variant48661, - Variant48662, - Variant48663, - Variant48664, - Variant48665, - Variant48666, - Variant48667, - Variant48668, - Variant48669, - Variant48670, - Variant48671, - Variant48672, - Variant48673, - Variant48674, - Variant48675, - Variant48676, - Variant48677, - Variant48678, - Variant48679, - Variant48680, - Variant48681, - Variant48682, - Variant48683, - Variant48684, - Variant48685, - Variant48686, - Variant48687, - Variant48688, - Variant48689, - Variant48690, - Variant48691, - Variant48692, - Variant48693, - Variant48694, - Variant48695, - Variant48696, - Variant48697, - Variant48698, - Variant48699, - Variant48700, - Variant48701, - Variant48702, - Variant48703, - Variant48704, - Variant48705, - Variant48706, - Variant48707, - Variant48708, - Variant48709, - Variant48710, - Variant48711, - Variant48712, - Variant48713, - Variant48714, - Variant48715, - Variant48716, - Variant48717, - Variant48718, - Variant48719, - Variant48720, - Variant48721, - Variant48722, - Variant48723, - Variant48724, - Variant48725, - Variant48726, - Variant48727, - Variant48728, - Variant48729, - Variant48730, - Variant48731, - Variant48732, - Variant48733, - Variant48734, - Variant48735, - Variant48736, - Variant48737, - Variant48738, - Variant48739, - Variant48740, - Variant48741, - Variant48742, - Variant48743, - Variant48744, - Variant48745, - Variant48746, - Variant48747, - Variant48748, - Variant48749, - Variant48750, - Variant48751, - Variant48752, - Variant48753, - Variant48754, - Variant48755, - Variant48756, - Variant48757, - Variant48758, - Variant48759, - Variant48760, - Variant48761, - Variant48762, - Variant48763, - Variant48764, - Variant48765, - Variant48766, - Variant48767, - Variant48768, - Variant48769, - Variant48770, - Variant48771, - Variant48772, - Variant48773, - Variant48774, - Variant48775, - Variant48776, - Variant48777, - Variant48778, - Variant48779, - Variant48780, - Variant48781, - Variant48782, - Variant48783, - Variant48784, - Variant48785, - Variant48786, - Variant48787, - Variant48788, - Variant48789, - Variant48790, - Variant48791, - Variant48792, - Variant48793, - Variant48794, - Variant48795, - Variant48796, - Variant48797, - Variant48798, - Variant48799, - Variant48800, - Variant48801, - Variant48802, - Variant48803, - Variant48804, - Variant48805, - Variant48806, - Variant48807, - Variant48808, - Variant48809, - Variant48810, - Variant48811, - Variant48812, - Variant48813, - Variant48814, - Variant48815, - Variant48816, - Variant48817, - Variant48818, - Variant48819, - Variant48820, - Variant48821, - Variant48822, - Variant48823, - Variant48824, - Variant48825, - Variant48826, - Variant48827, - Variant48828, - Variant48829, - Variant48830, - Variant48831, - Variant48832, - Variant48833, - Variant48834, - Variant48835, - Variant48836, - Variant48837, - Variant48838, - Variant48839, - Variant48840, - Variant48841, - Variant48842, - Variant48843, - Variant48844, - Variant48845, - Variant48846, - Variant48847, - Variant48848, - Variant48849, - Variant48850, - Variant48851, - Variant48852, - Variant48853, - Variant48854, - Variant48855, - Variant48856, - Variant48857, - Variant48858, - Variant48859, - Variant48860, - Variant48861, - Variant48862, - Variant48863, - Variant48864, - Variant48865, - Variant48866, - Variant48867, - Variant48868, - Variant48869, - Variant48870, - Variant48871, - Variant48872, - Variant48873, - Variant48874, - Variant48875, - Variant48876, - Variant48877, - Variant48878, - Variant48879, - Variant48880, - Variant48881, - Variant48882, - Variant48883, - Variant48884, - Variant48885, - Variant48886, - Variant48887, - Variant48888, - Variant48889, - Variant48890, - Variant48891, - Variant48892, - Variant48893, - Variant48894, - Variant48895, - Variant48896, - Variant48897, - Variant48898, - Variant48899, - Variant48900, - Variant48901, - Variant48902, - Variant48903, - Variant48904, - Variant48905, - Variant48906, - Variant48907, - Variant48908, - Variant48909, - Variant48910, - Variant48911, - Variant48912, - Variant48913, - Variant48914, - Variant48915, - Variant48916, - Variant48917, - Variant48918, - Variant48919, - Variant48920, - Variant48921, - Variant48922, - Variant48923, - Variant48924, - Variant48925, - Variant48926, - Variant48927, - Variant48928, - Variant48929, - Variant48930, - Variant48931, - Variant48932, - Variant48933, - Variant48934, - Variant48935, - Variant48936, - Variant48937, - Variant48938, - Variant48939, - Variant48940, - Variant48941, - Variant48942, - Variant48943, - Variant48944, - Variant48945, - Variant48946, - Variant48947, - Variant48948, - Variant48949, - Variant48950, - Variant48951, - Variant48952, - Variant48953, - Variant48954, - Variant48955, - Variant48956, - Variant48957, - Variant48958, - Variant48959, - Variant48960, - Variant48961, - Variant48962, - Variant48963, - Variant48964, - Variant48965, - Variant48966, - Variant48967, - Variant48968, - Variant48969, - Variant48970, - Variant48971, - Variant48972, - Variant48973, - Variant48974, - Variant48975, - Variant48976, - Variant48977, - Variant48978, - Variant48979, - Variant48980, - Variant48981, - Variant48982, - Variant48983, - Variant48984, - Variant48985, - Variant48986, - Variant48987, - Variant48988, - Variant48989, - Variant48990, - Variant48991, - Variant48992, - Variant48993, - Variant48994, - Variant48995, - Variant48996, - Variant48997, - Variant48998, - Variant48999, - Variant49000, - Variant49001, - Variant49002, - Variant49003, - Variant49004, - Variant49005, - Variant49006, - Variant49007, - Variant49008, - Variant49009, - Variant49010, - Variant49011, - Variant49012, - Variant49013, - Variant49014, - Variant49015, - Variant49016, - Variant49017, - Variant49018, - Variant49019, - Variant49020, - Variant49021, - Variant49022, - Variant49023, - Variant49024, - Variant49025, - Variant49026, - Variant49027, - Variant49028, - Variant49029, - Variant49030, - Variant49031, - Variant49032, - Variant49033, - Variant49034, - Variant49035, - Variant49036, - Variant49037, - Variant49038, - Variant49039, - Variant49040, - Variant49041, - Variant49042, - Variant49043, - Variant49044, - Variant49045, - Variant49046, - Variant49047, - Variant49048, - Variant49049, - Variant49050, - Variant49051, - Variant49052, - Variant49053, - Variant49054, - Variant49055, - Variant49056, - Variant49057, - Variant49058, - Variant49059, - Variant49060, - Variant49061, - Variant49062, - Variant49063, - Variant49064, - Variant49065, - Variant49066, - Variant49067, - Variant49068, - Variant49069, - Variant49070, - Variant49071, - Variant49072, - Variant49073, - Variant49074, - Variant49075, - Variant49076, - Variant49077, - Variant49078, - Variant49079, - Variant49080, - Variant49081, - Variant49082, - Variant49083, - Variant49084, - Variant49085, - Variant49086, - Variant49087, - Variant49088, - Variant49089, - Variant49090, - Variant49091, - Variant49092, - Variant49093, - Variant49094, - Variant49095, - Variant49096, - Variant49097, - Variant49098, - Variant49099, - Variant49100, - Variant49101, - Variant49102, - Variant49103, - Variant49104, - Variant49105, - Variant49106, - Variant49107, - Variant49108, - Variant49109, - Variant49110, - Variant49111, - Variant49112, - Variant49113, - Variant49114, - Variant49115, - Variant49116, - Variant49117, - Variant49118, - Variant49119, - Variant49120, - Variant49121, - Variant49122, - Variant49123, - Variant49124, - Variant49125, - Variant49126, - Variant49127, - Variant49128, - Variant49129, - Variant49130, - Variant49131, - Variant49132, - Variant49133, - Variant49134, - Variant49135, - Variant49136, - Variant49137, - Variant49138, - Variant49139, - Variant49140, - Variant49141, - Variant49142, - Variant49143, - Variant49144, - Variant49145, - Variant49146, - Variant49147, - Variant49148, - Variant49149, - Variant49150, - Variant49151, - Variant49152, - Variant49153, - Variant49154, - Variant49155, - Variant49156, - Variant49157, - Variant49158, - Variant49159, - Variant49160, - Variant49161, - Variant49162, - Variant49163, - Variant49164, - Variant49165, - Variant49166, - Variant49167, - Variant49168, - Variant49169, - Variant49170, - Variant49171, - Variant49172, - Variant49173, - Variant49174, - Variant49175, - Variant49176, - Variant49177, - Variant49178, - Variant49179, - Variant49180, - Variant49181, - Variant49182, - Variant49183, - Variant49184, - Variant49185, - Variant49186, - Variant49187, - Variant49188, - Variant49189, - Variant49190, - Variant49191, - Variant49192, - Variant49193, - Variant49194, - Variant49195, - Variant49196, - Variant49197, - Variant49198, - Variant49199, - Variant49200, - Variant49201, - Variant49202, - Variant49203, - Variant49204, - Variant49205, - Variant49206, - Variant49207, - Variant49208, - Variant49209, - Variant49210, - Variant49211, - Variant49212, - Variant49213, - Variant49214, - Variant49215, - Variant49216, - Variant49217, - Variant49218, - Variant49219, - Variant49220, - Variant49221, - Variant49222, - Variant49223, - Variant49224, - Variant49225, - Variant49226, - Variant49227, - Variant49228, - Variant49229, - Variant49230, - Variant49231, - Variant49232, - Variant49233, - Variant49234, - Variant49235, - Variant49236, - Variant49237, - Variant49238, - Variant49239, - Variant49240, - Variant49241, - Variant49242, - Variant49243, - Variant49244, - Variant49245, - Variant49246, - Variant49247, - Variant49248, - Variant49249, - Variant49250, - Variant49251, - Variant49252, - Variant49253, - Variant49254, - Variant49255, - Variant49256, - Variant49257, - Variant49258, - Variant49259, - Variant49260, - Variant49261, - Variant49262, - Variant49263, - Variant49264, - Variant49265, - Variant49266, - Variant49267, - Variant49268, - Variant49269, - Variant49270, - Variant49271, - Variant49272, - Variant49273, - Variant49274, - Variant49275, - Variant49276, - Variant49277, - Variant49278, - Variant49279, - Variant49280, - Variant49281, - Variant49282, - Variant49283, - Variant49284, - Variant49285, - Variant49286, - Variant49287, - Variant49288, - Variant49289, - Variant49290, - Variant49291, - Variant49292, - Variant49293, - Variant49294, - Variant49295, - Variant49296, - Variant49297, - Variant49298, - Variant49299, - Variant49300, - Variant49301, - Variant49302, - Variant49303, - Variant49304, - Variant49305, - Variant49306, - Variant49307, - Variant49308, - Variant49309, - Variant49310, - Variant49311, - Variant49312, - Variant49313, - Variant49314, - Variant49315, - Variant49316, - Variant49317, - Variant49318, - Variant49319, - Variant49320, - Variant49321, - Variant49322, - Variant49323, - Variant49324, - Variant49325, - Variant49326, - Variant49327, - Variant49328, - Variant49329, - Variant49330, - Variant49331, - Variant49332, - Variant49333, - Variant49334, - Variant49335, - Variant49336, - Variant49337, - Variant49338, - Variant49339, - Variant49340, - Variant49341, - Variant49342, - Variant49343, - Variant49344, - Variant49345, - Variant49346, - Variant49347, - Variant49348, - Variant49349, - Variant49350, - Variant49351, - Variant49352, - Variant49353, - Variant49354, - Variant49355, - Variant49356, - Variant49357, - Variant49358, - Variant49359, - Variant49360, - Variant49361, - Variant49362, - Variant49363, - Variant49364, - Variant49365, - Variant49366, - Variant49367, - Variant49368, - Variant49369, - Variant49370, - Variant49371, - Variant49372, - Variant49373, - Variant49374, - Variant49375, - Variant49376, - Variant49377, - Variant49378, - Variant49379, - Variant49380, - Variant49381, - Variant49382, - Variant49383, - Variant49384, - Variant49385, - Variant49386, - Variant49387, - Variant49388, - Variant49389, - Variant49390, - Variant49391, - Variant49392, - Variant49393, - Variant49394, - Variant49395, - Variant49396, - Variant49397, - Variant49398, - Variant49399, - Variant49400, - Variant49401, - Variant49402, - Variant49403, - Variant49404, - Variant49405, - Variant49406, - Variant49407, - Variant49408, - Variant49409, - Variant49410, - Variant49411, - Variant49412, - Variant49413, - Variant49414, - Variant49415, - Variant49416, - Variant49417, - Variant49418, - Variant49419, - Variant49420, - Variant49421, - Variant49422, - Variant49423, - Variant49424, - Variant49425, - Variant49426, - Variant49427, - Variant49428, - Variant49429, - Variant49430, - Variant49431, - Variant49432, - Variant49433, - Variant49434, - Variant49435, - Variant49436, - Variant49437, - Variant49438, - Variant49439, - Variant49440, - Variant49441, - Variant49442, - Variant49443, - Variant49444, - Variant49445, - Variant49446, - Variant49447, - Variant49448, - Variant49449, - Variant49450, - Variant49451, - Variant49452, - Variant49453, - Variant49454, - Variant49455, - Variant49456, - Variant49457, - Variant49458, - Variant49459, - Variant49460, - Variant49461, - Variant49462, - Variant49463, - Variant49464, - Variant49465, - Variant49466, - Variant49467, - Variant49468, - Variant49469, - Variant49470, - Variant49471, - Variant49472, - Variant49473, - Variant49474, - Variant49475, - Variant49476, - Variant49477, - Variant49478, - Variant49479, - Variant49480, - Variant49481, - Variant49482, - Variant49483, - Variant49484, - Variant49485, - Variant49486, - Variant49487, - Variant49488, - Variant49489, - Variant49490, - Variant49491, - Variant49492, - Variant49493, - Variant49494, - Variant49495, - Variant49496, - Variant49497, - Variant49498, - Variant49499, - Variant49500, - Variant49501, - Variant49502, - Variant49503, - Variant49504, - Variant49505, - Variant49506, - Variant49507, - Variant49508, - Variant49509, - Variant49510, - Variant49511, - Variant49512, - Variant49513, - Variant49514, - Variant49515, - Variant49516, - Variant49517, - Variant49518, - Variant49519, - Variant49520, - Variant49521, - Variant49522, - Variant49523, - Variant49524, - Variant49525, - Variant49526, - Variant49527, - Variant49528, - Variant49529, - Variant49530, - Variant49531, - Variant49532, - Variant49533, - Variant49534, - Variant49535, - Variant49536, - Variant49537, - Variant49538, - Variant49539, - Variant49540, - Variant49541, - Variant49542, - Variant49543, - Variant49544, - Variant49545, - Variant49546, - Variant49547, - Variant49548, - Variant49549, - Variant49550, - Variant49551, - Variant49552, - Variant49553, - Variant49554, - Variant49555, - Variant49556, - Variant49557, - Variant49558, - Variant49559, - Variant49560, - Variant49561, - Variant49562, - Variant49563, - Variant49564, - Variant49565, - Variant49566, - Variant49567, - Variant49568, - Variant49569, - Variant49570, - Variant49571, - Variant49572, - Variant49573, - Variant49574, - Variant49575, - Variant49576, - Variant49577, - Variant49578, - Variant49579, - Variant49580, - Variant49581, - Variant49582, - Variant49583, - Variant49584, - Variant49585, - Variant49586, - Variant49587, - Variant49588, - Variant49589, - Variant49590, - Variant49591, - Variant49592, - Variant49593, - Variant49594, - Variant49595, - Variant49596, - Variant49597, - Variant49598, - Variant49599, - Variant49600, - Variant49601, - Variant49602, - Variant49603, - Variant49604, - Variant49605, - Variant49606, - Variant49607, - Variant49608, - Variant49609, - Variant49610, - Variant49611, - Variant49612, - Variant49613, - Variant49614, - Variant49615, - Variant49616, - Variant49617, - Variant49618, - Variant49619, - Variant49620, - Variant49621, - Variant49622, - Variant49623, - Variant49624, - Variant49625, - Variant49626, - Variant49627, - Variant49628, - Variant49629, - Variant49630, - Variant49631, - Variant49632, - Variant49633, - Variant49634, - Variant49635, - Variant49636, - Variant49637, - Variant49638, - Variant49639, - Variant49640, - Variant49641, - Variant49642, - Variant49643, - Variant49644, - Variant49645, - Variant49646, - Variant49647, - Variant49648, - Variant49649, - Variant49650, - Variant49651, - Variant49652, - Variant49653, - Variant49654, - Variant49655, - Variant49656, - Variant49657, - Variant49658, - Variant49659, - Variant49660, - Variant49661, - Variant49662, - Variant49663, - Variant49664, - Variant49665, - Variant49666, - Variant49667, - Variant49668, - Variant49669, - Variant49670, - Variant49671, - Variant49672, - Variant49673, - Variant49674, - Variant49675, - Variant49676, - Variant49677, - Variant49678, - Variant49679, - Variant49680, - Variant49681, - Variant49682, - Variant49683, - Variant49684, - Variant49685, - Variant49686, - Variant49687, - Variant49688, - Variant49689, - Variant49690, - Variant49691, - Variant49692, - Variant49693, - Variant49694, - Variant49695, - Variant49696, - Variant49697, - Variant49698, - Variant49699, - Variant49700, - Variant49701, - Variant49702, - Variant49703, - Variant49704, - Variant49705, - Variant49706, - Variant49707, - Variant49708, - Variant49709, - Variant49710, - Variant49711, - Variant49712, - Variant49713, - Variant49714, - Variant49715, - Variant49716, - Variant49717, - Variant49718, - Variant49719, - Variant49720, - Variant49721, - Variant49722, - Variant49723, - Variant49724, - Variant49725, - Variant49726, - Variant49727, - Variant49728, - Variant49729, - Variant49730, - Variant49731, - Variant49732, - Variant49733, - Variant49734, - Variant49735, - Variant49736, - Variant49737, - Variant49738, - Variant49739, - Variant49740, - Variant49741, - Variant49742, - Variant49743, - Variant49744, - Variant49745, - Variant49746, - Variant49747, - Variant49748, - Variant49749, - Variant49750, - Variant49751, - Variant49752, - Variant49753, - Variant49754, - Variant49755, - Variant49756, - Variant49757, - Variant49758, - Variant49759, - Variant49760, - Variant49761, - Variant49762, - Variant49763, - Variant49764, - Variant49765, - Variant49766, - Variant49767, - Variant49768, - Variant49769, - Variant49770, - Variant49771, - Variant49772, - Variant49773, - Variant49774, - Variant49775, - Variant49776, - Variant49777, - Variant49778, - Variant49779, - Variant49780, - Variant49781, - Variant49782, - Variant49783, - Variant49784, - Variant49785, - Variant49786, - Variant49787, - Variant49788, - Variant49789, - Variant49790, - Variant49791, - Variant49792, - Variant49793, - Variant49794, - Variant49795, - Variant49796, - Variant49797, - Variant49798, - Variant49799, - Variant49800, - Variant49801, - Variant49802, - Variant49803, - Variant49804, - Variant49805, - Variant49806, - Variant49807, - Variant49808, - Variant49809, - Variant49810, - Variant49811, - Variant49812, - Variant49813, - Variant49814, - Variant49815, - Variant49816, - Variant49817, - Variant49818, - Variant49819, - Variant49820, - Variant49821, - Variant49822, - Variant49823, - Variant49824, - Variant49825, - Variant49826, - Variant49827, - Variant49828, - Variant49829, - Variant49830, - Variant49831, - Variant49832, - Variant49833, - Variant49834, - Variant49835, - Variant49836, - Variant49837, - Variant49838, - Variant49839, - Variant49840, - Variant49841, - Variant49842, - Variant49843, - Variant49844, - Variant49845, - Variant49846, - Variant49847, - Variant49848, - Variant49849, - Variant49850, - Variant49851, - Variant49852, - Variant49853, - Variant49854, - Variant49855, - Variant49856, - Variant49857, - Variant49858, - Variant49859, - Variant49860, - Variant49861, - Variant49862, - Variant49863, - Variant49864, - Variant49865, - Variant49866, - Variant49867, - Variant49868, - Variant49869, - Variant49870, - Variant49871, - Variant49872, - Variant49873, - Variant49874, - Variant49875, - Variant49876, - Variant49877, - Variant49878, - Variant49879, - Variant49880, - Variant49881, - Variant49882, - Variant49883, - Variant49884, - Variant49885, - Variant49886, - Variant49887, - Variant49888, - Variant49889, - Variant49890, - Variant49891, - Variant49892, - Variant49893, - Variant49894, - Variant49895, - Variant49896, - Variant49897, - Variant49898, - Variant49899, - Variant49900, - Variant49901, - Variant49902, - Variant49903, - Variant49904, - Variant49905, - Variant49906, - Variant49907, - Variant49908, - Variant49909, - Variant49910, - Variant49911, - Variant49912, - Variant49913, - Variant49914, - Variant49915, - Variant49916, - Variant49917, - Variant49918, - Variant49919, - Variant49920, - Variant49921, - Variant49922, - Variant49923, - Variant49924, - Variant49925, - Variant49926, - Variant49927, - Variant49928, - Variant49929, - Variant49930, - Variant49931, - Variant49932, - Variant49933, - Variant49934, - Variant49935, - Variant49936, - Variant49937, - Variant49938, - Variant49939, - Variant49940, - Variant49941, - Variant49942, - Variant49943, - Variant49944, - Variant49945, - Variant49946, - Variant49947, - Variant49948, - Variant49949, - Variant49950, - Variant49951, - Variant49952, - Variant49953, - Variant49954, - Variant49955, - Variant49956, - Variant49957, - Variant49958, - Variant49959, - Variant49960, - Variant49961, - Variant49962, - Variant49963, - Variant49964, - Variant49965, - Variant49966, - Variant49967, - Variant49968, - Variant49969, - Variant49970, - Variant49971, - Variant49972, - Variant49973, - Variant49974, - Variant49975, - Variant49976, - Variant49977, - Variant49978, - Variant49979, - Variant49980, - Variant49981, - Variant49982, - Variant49983, - Variant49984, - Variant49985, - Variant49986, - Variant49987, - Variant49988, - Variant49989, - Variant49990, - Variant49991, - Variant49992, - Variant49993, - Variant49994, - Variant49995, - Variant49996, - Variant49997, - Variant49998, - Variant49999, - Variant50000, - Variant50001, - Variant50002, - Variant50003, - Variant50004, - Variant50005, - Variant50006, - Variant50007, - Variant50008, - Variant50009, - Variant50010, - Variant50011, - Variant50012, - Variant50013, - Variant50014, - Variant50015, - Variant50016, - Variant50017, - Variant50018, - Variant50019, - Variant50020, - Variant50021, - Variant50022, - Variant50023, - Variant50024, - Variant50025, - Variant50026, - Variant50027, - Variant50028, - Variant50029, - Variant50030, - Variant50031, - Variant50032, - Variant50033, - Variant50034, - Variant50035, - Variant50036, - Variant50037, - Variant50038, - Variant50039, - Variant50040, - Variant50041, - Variant50042, - Variant50043, - Variant50044, - Variant50045, - Variant50046, - Variant50047, - Variant50048, - Variant50049, - Variant50050, - Variant50051, - Variant50052, - Variant50053, - Variant50054, - Variant50055, - Variant50056, - Variant50057, - Variant50058, - Variant50059, - Variant50060, - Variant50061, - Variant50062, - Variant50063, - Variant50064, - Variant50065, - Variant50066, - Variant50067, - Variant50068, - Variant50069, - Variant50070, - Variant50071, - Variant50072, - Variant50073, - Variant50074, - Variant50075, - Variant50076, - Variant50077, - Variant50078, - Variant50079, - Variant50080, - Variant50081, - Variant50082, - Variant50083, - Variant50084, - Variant50085, - Variant50086, - Variant50087, - Variant50088, - Variant50089, - Variant50090, - Variant50091, - Variant50092, - Variant50093, - Variant50094, - Variant50095, - Variant50096, - Variant50097, - Variant50098, - Variant50099, - Variant50100, - Variant50101, - Variant50102, - Variant50103, - Variant50104, - Variant50105, - Variant50106, - Variant50107, - Variant50108, - Variant50109, - Variant50110, - Variant50111, - Variant50112, - Variant50113, - Variant50114, - Variant50115, - Variant50116, - Variant50117, - Variant50118, - Variant50119, - Variant50120, - Variant50121, - Variant50122, - Variant50123, - Variant50124, - Variant50125, - Variant50126, - Variant50127, - Variant50128, - Variant50129, - Variant50130, - Variant50131, - Variant50132, - Variant50133, - Variant50134, - Variant50135, - Variant50136, - Variant50137, - Variant50138, - Variant50139, - Variant50140, - Variant50141, - Variant50142, - Variant50143, - Variant50144, - Variant50145, - Variant50146, - Variant50147, - Variant50148, - Variant50149, - Variant50150, - Variant50151, - Variant50152, - Variant50153, - Variant50154, - Variant50155, - Variant50156, - Variant50157, - Variant50158, - Variant50159, - Variant50160, - Variant50161, - Variant50162, - Variant50163, - Variant50164, - Variant50165, - Variant50166, - Variant50167, - Variant50168, - Variant50169, - Variant50170, - Variant50171, - Variant50172, - Variant50173, - Variant50174, - Variant50175, - Variant50176, - Variant50177, - Variant50178, - Variant50179, - Variant50180, - Variant50181, - Variant50182, - Variant50183, - Variant50184, - Variant50185, - Variant50186, - Variant50187, - Variant50188, - Variant50189, - Variant50190, - Variant50191, - Variant50192, - Variant50193, - Variant50194, - Variant50195, - Variant50196, - Variant50197, - Variant50198, - Variant50199, - Variant50200, - Variant50201, - Variant50202, - Variant50203, - Variant50204, - Variant50205, - Variant50206, - Variant50207, - Variant50208, - Variant50209, - Variant50210, - Variant50211, - Variant50212, - Variant50213, - Variant50214, - Variant50215, - Variant50216, - Variant50217, - Variant50218, - Variant50219, - Variant50220, - Variant50221, - Variant50222, - Variant50223, - Variant50224, - Variant50225, - Variant50226, - Variant50227, - Variant50228, - Variant50229, - Variant50230, - Variant50231, - Variant50232, - Variant50233, - Variant50234, - Variant50235, - Variant50236, - Variant50237, - Variant50238, - Variant50239, - Variant50240, - Variant50241, - Variant50242, - Variant50243, - Variant50244, - Variant50245, - Variant50246, - Variant50247, - Variant50248, - Variant50249, - Variant50250, - Variant50251, - Variant50252, - Variant50253, - Variant50254, - Variant50255, - Variant50256, - Variant50257, - Variant50258, - Variant50259, - Variant50260, - Variant50261, - Variant50262, - Variant50263, - Variant50264, - Variant50265, - Variant50266, - Variant50267, - Variant50268, - Variant50269, - Variant50270, - Variant50271, - Variant50272, - Variant50273, - Variant50274, - Variant50275, - Variant50276, - Variant50277, - Variant50278, - Variant50279, - Variant50280, - Variant50281, - Variant50282, - Variant50283, - Variant50284, - Variant50285, - Variant50286, - Variant50287, - Variant50288, - Variant50289, - Variant50290, - Variant50291, - Variant50292, - Variant50293, - Variant50294, - Variant50295, - Variant50296, - Variant50297, - Variant50298, - Variant50299, - Variant50300, - Variant50301, - Variant50302, - Variant50303, - Variant50304, - Variant50305, - Variant50306, - Variant50307, - Variant50308, - Variant50309, - Variant50310, - Variant50311, - Variant50312, - Variant50313, - Variant50314, - Variant50315, - Variant50316, - Variant50317, - Variant50318, - Variant50319, - Variant50320, - Variant50321, - Variant50322, - Variant50323, - Variant50324, - Variant50325, - Variant50326, - Variant50327, - Variant50328, - Variant50329, - Variant50330, - Variant50331, - Variant50332, - Variant50333, - Variant50334, - Variant50335, - Variant50336, - Variant50337, - Variant50338, - Variant50339, - Variant50340, - Variant50341, - Variant50342, - Variant50343, - Variant50344, - Variant50345, - Variant50346, - Variant50347, - Variant50348, - Variant50349, - Variant50350, - Variant50351, - Variant50352, - Variant50353, - Variant50354, - Variant50355, - Variant50356, - Variant50357, - Variant50358, - Variant50359, - Variant50360, - Variant50361, - Variant50362, - Variant50363, - Variant50364, - Variant50365, - Variant50366, - Variant50367, - Variant50368, - Variant50369, - Variant50370, - Variant50371, - Variant50372, - Variant50373, - Variant50374, - Variant50375, - Variant50376, - Variant50377, - Variant50378, - Variant50379, - Variant50380, - Variant50381, - Variant50382, - Variant50383, - Variant50384, - Variant50385, - Variant50386, - Variant50387, - Variant50388, - Variant50389, - Variant50390, - Variant50391, - Variant50392, - Variant50393, - Variant50394, - Variant50395, - Variant50396, - Variant50397, - Variant50398, - Variant50399, - Variant50400, - Variant50401, - Variant50402, - Variant50403, - Variant50404, - Variant50405, - Variant50406, - Variant50407, - Variant50408, - Variant50409, - Variant50410, - Variant50411, - Variant50412, - Variant50413, - Variant50414, - Variant50415, - Variant50416, - Variant50417, - Variant50418, - Variant50419, - Variant50420, - Variant50421, - Variant50422, - Variant50423, - Variant50424, - Variant50425, - Variant50426, - Variant50427, - Variant50428, - Variant50429, - Variant50430, - Variant50431, - Variant50432, - Variant50433, - Variant50434, - Variant50435, - Variant50436, - Variant50437, - Variant50438, - Variant50439, - Variant50440, - Variant50441, - Variant50442, - Variant50443, - Variant50444, - Variant50445, - Variant50446, - Variant50447, - Variant50448, - Variant50449, - Variant50450, - Variant50451, - Variant50452, - Variant50453, - Variant50454, - Variant50455, - Variant50456, - Variant50457, - Variant50458, - Variant50459, - Variant50460, - Variant50461, - Variant50462, - Variant50463, - Variant50464, - Variant50465, - Variant50466, - Variant50467, - Variant50468, - Variant50469, - Variant50470, - Variant50471, - Variant50472, - Variant50473, - Variant50474, - Variant50475, - Variant50476, - Variant50477, - Variant50478, - Variant50479, - Variant50480, - Variant50481, - Variant50482, - Variant50483, - Variant50484, - Variant50485, - Variant50486, - Variant50487, - Variant50488, - Variant50489, - Variant50490, - Variant50491, - Variant50492, - Variant50493, - Variant50494, - Variant50495, - Variant50496, - Variant50497, - Variant50498, - Variant50499, - Variant50500, - Variant50501, - Variant50502, - Variant50503, - Variant50504, - Variant50505, - Variant50506, - Variant50507, - Variant50508, - Variant50509, - Variant50510, - Variant50511, - Variant50512, - Variant50513, - Variant50514, - Variant50515, - Variant50516, - Variant50517, - Variant50518, - Variant50519, - Variant50520, - Variant50521, - Variant50522, - Variant50523, - Variant50524, - Variant50525, - Variant50526, - Variant50527, - Variant50528, - Variant50529, - Variant50530, - Variant50531, - Variant50532, - Variant50533, - Variant50534, - Variant50535, - Variant50536, - Variant50537, - Variant50538, - Variant50539, - Variant50540, - Variant50541, - Variant50542, - Variant50543, - Variant50544, - Variant50545, - Variant50546, - Variant50547, - Variant50548, - Variant50549, - Variant50550, - Variant50551, - Variant50552, - Variant50553, - Variant50554, - Variant50555, - Variant50556, - Variant50557, - Variant50558, - Variant50559, - Variant50560, - Variant50561, - Variant50562, - Variant50563, - Variant50564, - Variant50565, - Variant50566, - Variant50567, - Variant50568, - Variant50569, - Variant50570, - Variant50571, - Variant50572, - Variant50573, - Variant50574, - Variant50575, - Variant50576, - Variant50577, - Variant50578, - Variant50579, - Variant50580, - Variant50581, - Variant50582, - Variant50583, - Variant50584, - Variant50585, - Variant50586, - Variant50587, - Variant50588, - Variant50589, - Variant50590, - Variant50591, - Variant50592, - Variant50593, - Variant50594, - Variant50595, - Variant50596, - Variant50597, - Variant50598, - Variant50599, - Variant50600, - Variant50601, - Variant50602, - Variant50603, - Variant50604, - Variant50605, - Variant50606, - Variant50607, - Variant50608, - Variant50609, - Variant50610, - Variant50611, - Variant50612, - Variant50613, - Variant50614, - Variant50615, - Variant50616, - Variant50617, - Variant50618, - Variant50619, - Variant50620, - Variant50621, - Variant50622, - Variant50623, - Variant50624, - Variant50625, - Variant50626, - Variant50627, - Variant50628, - Variant50629, - Variant50630, - Variant50631, - Variant50632, - Variant50633, - Variant50634, - Variant50635, - Variant50636, - Variant50637, - Variant50638, - Variant50639, - Variant50640, - Variant50641, - Variant50642, - Variant50643, - Variant50644, - Variant50645, - Variant50646, - Variant50647, - Variant50648, - Variant50649, - Variant50650, - Variant50651, - Variant50652, - Variant50653, - Variant50654, - Variant50655, - Variant50656, - Variant50657, - Variant50658, - Variant50659, - Variant50660, - Variant50661, - Variant50662, - Variant50663, - Variant50664, - Variant50665, - Variant50666, - Variant50667, - Variant50668, - Variant50669, - Variant50670, - Variant50671, - Variant50672, - Variant50673, - Variant50674, - Variant50675, - Variant50676, - Variant50677, - Variant50678, - Variant50679, - Variant50680, - Variant50681, - Variant50682, - Variant50683, - Variant50684, - Variant50685, - Variant50686, - Variant50687, - Variant50688, - Variant50689, - Variant50690, - Variant50691, - Variant50692, - Variant50693, - Variant50694, - Variant50695, - Variant50696, - Variant50697, - Variant50698, - Variant50699, - Variant50700, - Variant50701, - Variant50702, - Variant50703, - Variant50704, - Variant50705, - Variant50706, - Variant50707, - Variant50708, - Variant50709, - Variant50710, - Variant50711, - Variant50712, - Variant50713, - Variant50714, - Variant50715, - Variant50716, - Variant50717, - Variant50718, - Variant50719, - Variant50720, - Variant50721, - Variant50722, - Variant50723, - Variant50724, - Variant50725, - Variant50726, - Variant50727, - Variant50728, - Variant50729, - Variant50730, - Variant50731, - Variant50732, - Variant50733, - Variant50734, - Variant50735, - Variant50736, - Variant50737, - Variant50738, - Variant50739, - Variant50740, - Variant50741, - Variant50742, - Variant50743, - Variant50744, - Variant50745, - Variant50746, - Variant50747, - Variant50748, - Variant50749, - Variant50750, - Variant50751, - Variant50752, - Variant50753, - Variant50754, - Variant50755, - Variant50756, - Variant50757, - Variant50758, - Variant50759, - Variant50760, - Variant50761, - Variant50762, - Variant50763, - Variant50764, - Variant50765, - Variant50766, - Variant50767, - Variant50768, - Variant50769, - Variant50770, - Variant50771, - Variant50772, - Variant50773, - Variant50774, - Variant50775, - Variant50776, - Variant50777, - Variant50778, - Variant50779, - Variant50780, - Variant50781, - Variant50782, - Variant50783, - Variant50784, - Variant50785, - Variant50786, - Variant50787, - Variant50788, - Variant50789, - Variant50790, - Variant50791, - Variant50792, - Variant50793, - Variant50794, - Variant50795, - Variant50796, - Variant50797, - Variant50798, - Variant50799, - Variant50800, - Variant50801, - Variant50802, - Variant50803, - Variant50804, - Variant50805, - Variant50806, - Variant50807, - Variant50808, - Variant50809, - Variant50810, - Variant50811, - Variant50812, - Variant50813, - Variant50814, - Variant50815, - Variant50816, - Variant50817, - Variant50818, - Variant50819, - Variant50820, - Variant50821, - Variant50822, - Variant50823, - Variant50824, - Variant50825, - Variant50826, - Variant50827, - Variant50828, - Variant50829, - Variant50830, - Variant50831, - Variant50832, - Variant50833, - Variant50834, - Variant50835, - Variant50836, - Variant50837, - Variant50838, - Variant50839, - Variant50840, - Variant50841, - Variant50842, - Variant50843, - Variant50844, - Variant50845, - Variant50846, - Variant50847, - Variant50848, - Variant50849, - Variant50850, - Variant50851, - Variant50852, - Variant50853, - Variant50854, - Variant50855, - Variant50856, - Variant50857, - Variant50858, - Variant50859, - Variant50860, - Variant50861, - Variant50862, - Variant50863, - Variant50864, - Variant50865, - Variant50866, - Variant50867, - Variant50868, - Variant50869, - Variant50870, - Variant50871, - Variant50872, - Variant50873, - Variant50874, - Variant50875, - Variant50876, - Variant50877, - Variant50878, - Variant50879, - Variant50880, - Variant50881, - Variant50882, - Variant50883, - Variant50884, - Variant50885, - Variant50886, - Variant50887, - Variant50888, - Variant50889, - Variant50890, - Variant50891, - Variant50892, - Variant50893, - Variant50894, - Variant50895, - Variant50896, - Variant50897, - Variant50898, - Variant50899, - Variant50900, - Variant50901, - Variant50902, - Variant50903, - Variant50904, - Variant50905, - Variant50906, - Variant50907, - Variant50908, - Variant50909, - Variant50910, - Variant50911, - Variant50912, - Variant50913, - Variant50914, - Variant50915, - Variant50916, - Variant50917, - Variant50918, - Variant50919, - Variant50920, - Variant50921, - Variant50922, - Variant50923, - Variant50924, - Variant50925, - Variant50926, - Variant50927, - Variant50928, - Variant50929, - Variant50930, - Variant50931, - Variant50932, - Variant50933, - Variant50934, - Variant50935, - Variant50936, - Variant50937, - Variant50938, - Variant50939, - Variant50940, - Variant50941, - Variant50942, - Variant50943, - Variant50944, - Variant50945, - Variant50946, - Variant50947, - Variant50948, - Variant50949, - Variant50950, - Variant50951, - Variant50952, - Variant50953, - Variant50954, - Variant50955, - Variant50956, - Variant50957, - Variant50958, - Variant50959, - Variant50960, - Variant50961, - Variant50962, - Variant50963, - Variant50964, - Variant50965, - Variant50966, - Variant50967, - Variant50968, - Variant50969, - Variant50970, - Variant50971, - Variant50972, - Variant50973, - Variant50974, - Variant50975, - Variant50976, - Variant50977, - Variant50978, - Variant50979, - Variant50980, - Variant50981, - Variant50982, - Variant50983, - Variant50984, - Variant50985, - Variant50986, - Variant50987, - Variant50988, - Variant50989, - Variant50990, - Variant50991, - Variant50992, - Variant50993, - Variant50994, - Variant50995, - Variant50996, - Variant50997, - Variant50998, - Variant50999, - Variant51000, - Variant51001, - Variant51002, - Variant51003, - Variant51004, - Variant51005, - Variant51006, - Variant51007, - Variant51008, - Variant51009, - Variant51010, - Variant51011, - Variant51012, - Variant51013, - Variant51014, - Variant51015, - Variant51016, - Variant51017, - Variant51018, - Variant51019, - Variant51020, - Variant51021, - Variant51022, - Variant51023, - Variant51024, - Variant51025, - Variant51026, - Variant51027, - Variant51028, - Variant51029, - Variant51030, - Variant51031, - Variant51032, - Variant51033, - Variant51034, - Variant51035, - Variant51036, - Variant51037, - Variant51038, - Variant51039, - Variant51040, - Variant51041, - Variant51042, - Variant51043, - Variant51044, - Variant51045, - Variant51046, - Variant51047, - Variant51048, - Variant51049, - Variant51050, - Variant51051, - Variant51052, - Variant51053, - Variant51054, - Variant51055, - Variant51056, - Variant51057, - Variant51058, - Variant51059, - Variant51060, - Variant51061, - Variant51062, - Variant51063, - Variant51064, - Variant51065, - Variant51066, - Variant51067, - Variant51068, - Variant51069, - Variant51070, - Variant51071, - Variant51072, - Variant51073, - Variant51074, - Variant51075, - Variant51076, - Variant51077, - Variant51078, - Variant51079, - Variant51080, - Variant51081, - Variant51082, - Variant51083, - Variant51084, - Variant51085, - Variant51086, - Variant51087, - Variant51088, - Variant51089, - Variant51090, - Variant51091, - Variant51092, - Variant51093, - Variant51094, - Variant51095, - Variant51096, - Variant51097, - Variant51098, - Variant51099, - Variant51100, - Variant51101, - Variant51102, - Variant51103, - Variant51104, - Variant51105, - Variant51106, - Variant51107, - Variant51108, - Variant51109, - Variant51110, - Variant51111, - Variant51112, - Variant51113, - Variant51114, - Variant51115, - Variant51116, - Variant51117, - Variant51118, - Variant51119, - Variant51120, - Variant51121, - Variant51122, - Variant51123, - Variant51124, - Variant51125, - Variant51126, - Variant51127, - Variant51128, - Variant51129, - Variant51130, - Variant51131, - Variant51132, - Variant51133, - Variant51134, - Variant51135, - Variant51136, - Variant51137, - Variant51138, - Variant51139, - Variant51140, - Variant51141, - Variant51142, - Variant51143, - Variant51144, - Variant51145, - Variant51146, - Variant51147, - Variant51148, - Variant51149, - Variant51150, - Variant51151, - Variant51152, - Variant51153, - Variant51154, - Variant51155, - Variant51156, - Variant51157, - Variant51158, - Variant51159, - Variant51160, - Variant51161, - Variant51162, - Variant51163, - Variant51164, - Variant51165, - Variant51166, - Variant51167, - Variant51168, - Variant51169, - Variant51170, - Variant51171, - Variant51172, - Variant51173, - Variant51174, - Variant51175, - Variant51176, - Variant51177, - Variant51178, - Variant51179, - Variant51180, - Variant51181, - Variant51182, - Variant51183, - Variant51184, - Variant51185, - Variant51186, - Variant51187, - Variant51188, - Variant51189, - Variant51190, - Variant51191, - Variant51192, - Variant51193, - Variant51194, - Variant51195, - Variant51196, - Variant51197, - Variant51198, - Variant51199, - Variant51200, - Variant51201, - Variant51202, - Variant51203, - Variant51204, - Variant51205, - Variant51206, - Variant51207, - Variant51208, - Variant51209, - Variant51210, - Variant51211, - Variant51212, - Variant51213, - Variant51214, - Variant51215, - Variant51216, - Variant51217, - Variant51218, - Variant51219, - Variant51220, - Variant51221, - Variant51222, - Variant51223, - Variant51224, - Variant51225, - Variant51226, - Variant51227, - Variant51228, - Variant51229, - Variant51230, - Variant51231, - Variant51232, - Variant51233, - Variant51234, - Variant51235, - Variant51236, - Variant51237, - Variant51238, - Variant51239, - Variant51240, - Variant51241, - Variant51242, - Variant51243, - Variant51244, - Variant51245, - Variant51246, - Variant51247, - Variant51248, - Variant51249, - Variant51250, - Variant51251, - Variant51252, - Variant51253, - Variant51254, - Variant51255, - Variant51256, - Variant51257, - Variant51258, - Variant51259, - Variant51260, - Variant51261, - Variant51262, - Variant51263, - Variant51264, - Variant51265, - Variant51266, - Variant51267, - Variant51268, - Variant51269, - Variant51270, - Variant51271, - Variant51272, - Variant51273, - Variant51274, - Variant51275, - Variant51276, - Variant51277, - Variant51278, - Variant51279, - Variant51280, - Variant51281, - Variant51282, - Variant51283, - Variant51284, - Variant51285, - Variant51286, - Variant51287, - Variant51288, - Variant51289, - Variant51290, - Variant51291, - Variant51292, - Variant51293, - Variant51294, - Variant51295, - Variant51296, - Variant51297, - Variant51298, - Variant51299, - Variant51300, - Variant51301, - Variant51302, - Variant51303, - Variant51304, - Variant51305, - Variant51306, - Variant51307, - Variant51308, - Variant51309, - Variant51310, - Variant51311, - Variant51312, - Variant51313, - Variant51314, - Variant51315, - Variant51316, - Variant51317, - Variant51318, - Variant51319, - Variant51320, - Variant51321, - Variant51322, - Variant51323, - Variant51324, - Variant51325, - Variant51326, - Variant51327, - Variant51328, - Variant51329, - Variant51330, - Variant51331, - Variant51332, - Variant51333, - Variant51334, - Variant51335, - Variant51336, - Variant51337, - Variant51338, - Variant51339, - Variant51340, - Variant51341, - Variant51342, - Variant51343, - Variant51344, - Variant51345, - Variant51346, - Variant51347, - Variant51348, - Variant51349, - Variant51350, - Variant51351, - Variant51352, - Variant51353, - Variant51354, - Variant51355, - Variant51356, - Variant51357, - Variant51358, - Variant51359, - Variant51360, - Variant51361, - Variant51362, - Variant51363, - Variant51364, - Variant51365, - Variant51366, - Variant51367, - Variant51368, - Variant51369, - Variant51370, - Variant51371, - Variant51372, - Variant51373, - Variant51374, - Variant51375, - Variant51376, - Variant51377, - Variant51378, - Variant51379, - Variant51380, - Variant51381, - Variant51382, - Variant51383, - Variant51384, - Variant51385, - Variant51386, - Variant51387, - Variant51388, - Variant51389, - Variant51390, - Variant51391, - Variant51392, - Variant51393, - Variant51394, - Variant51395, - Variant51396, - Variant51397, - Variant51398, - Variant51399, - Variant51400, - Variant51401, - Variant51402, - Variant51403, - Variant51404, - Variant51405, - Variant51406, - Variant51407, - Variant51408, - Variant51409, - Variant51410, - Variant51411, - Variant51412, - Variant51413, - Variant51414, - Variant51415, - Variant51416, - Variant51417, - Variant51418, - Variant51419, - Variant51420, - Variant51421, - Variant51422, - Variant51423, - Variant51424, - Variant51425, - Variant51426, - Variant51427, - Variant51428, - Variant51429, - Variant51430, - Variant51431, - Variant51432, - Variant51433, - Variant51434, - Variant51435, - Variant51436, - Variant51437, - Variant51438, - Variant51439, - Variant51440, - Variant51441, - Variant51442, - Variant51443, - Variant51444, - Variant51445, - Variant51446, - Variant51447, - Variant51448, - Variant51449, - Variant51450, - Variant51451, - Variant51452, - Variant51453, - Variant51454, - Variant51455, - Variant51456, - Variant51457, - Variant51458, - Variant51459, - Variant51460, - Variant51461, - Variant51462, - Variant51463, - Variant51464, - Variant51465, - Variant51466, - Variant51467, - Variant51468, - Variant51469, - Variant51470, - Variant51471, - Variant51472, - Variant51473, - Variant51474, - Variant51475, - Variant51476, - Variant51477, - Variant51478, - Variant51479, - Variant51480, - Variant51481, - Variant51482, - Variant51483, - Variant51484, - Variant51485, - Variant51486, - Variant51487, - Variant51488, - Variant51489, - Variant51490, - Variant51491, - Variant51492, - Variant51493, - Variant51494, - Variant51495, - Variant51496, - Variant51497, - Variant51498, - Variant51499, - Variant51500, - Variant51501, - Variant51502, - Variant51503, - Variant51504, - Variant51505, - Variant51506, - Variant51507, - Variant51508, - Variant51509, - Variant51510, - Variant51511, - Variant51512, - Variant51513, - Variant51514, - Variant51515, - Variant51516, - Variant51517, - Variant51518, - Variant51519, - Variant51520, - Variant51521, - Variant51522, - Variant51523, - Variant51524, - Variant51525, - Variant51526, - Variant51527, - Variant51528, - Variant51529, - Variant51530, - Variant51531, - Variant51532, - Variant51533, - Variant51534, - Variant51535, - Variant51536, - Variant51537, - Variant51538, - Variant51539, - Variant51540, - Variant51541, - Variant51542, - Variant51543, - Variant51544, - Variant51545, - Variant51546, - Variant51547, - Variant51548, - Variant51549, - Variant51550, - Variant51551, - Variant51552, - Variant51553, - Variant51554, - Variant51555, - Variant51556, - Variant51557, - Variant51558, - Variant51559, - Variant51560, - Variant51561, - Variant51562, - Variant51563, - Variant51564, - Variant51565, - Variant51566, - Variant51567, - Variant51568, - Variant51569, - Variant51570, - Variant51571, - Variant51572, - Variant51573, - Variant51574, - Variant51575, - Variant51576, - Variant51577, - Variant51578, - Variant51579, - Variant51580, - Variant51581, - Variant51582, - Variant51583, - Variant51584, - Variant51585, - Variant51586, - Variant51587, - Variant51588, - Variant51589, - Variant51590, - Variant51591, - Variant51592, - Variant51593, - Variant51594, - Variant51595, - Variant51596, - Variant51597, - Variant51598, - Variant51599, - Variant51600, - Variant51601, - Variant51602, - Variant51603, - Variant51604, - Variant51605, - Variant51606, - Variant51607, - Variant51608, - Variant51609, - Variant51610, - Variant51611, - Variant51612, - Variant51613, - Variant51614, - Variant51615, - Variant51616, - Variant51617, - Variant51618, - Variant51619, - Variant51620, - Variant51621, - Variant51622, - Variant51623, - Variant51624, - Variant51625, - Variant51626, - Variant51627, - Variant51628, - Variant51629, - Variant51630, - Variant51631, - Variant51632, - Variant51633, - Variant51634, - Variant51635, - Variant51636, - Variant51637, - Variant51638, - Variant51639, - Variant51640, - Variant51641, - Variant51642, - Variant51643, - Variant51644, - Variant51645, - Variant51646, - Variant51647, - Variant51648, - Variant51649, - Variant51650, - Variant51651, - Variant51652, - Variant51653, - Variant51654, - Variant51655, - Variant51656, - Variant51657, - Variant51658, - Variant51659, - Variant51660, - Variant51661, - Variant51662, - Variant51663, - Variant51664, - Variant51665, - Variant51666, - Variant51667, - Variant51668, - Variant51669, - Variant51670, - Variant51671, - Variant51672, - Variant51673, - Variant51674, - Variant51675, - Variant51676, - Variant51677, - Variant51678, - Variant51679, - Variant51680, - Variant51681, - Variant51682, - Variant51683, - Variant51684, - Variant51685, - Variant51686, - Variant51687, - Variant51688, - Variant51689, - Variant51690, - Variant51691, - Variant51692, - Variant51693, - Variant51694, - Variant51695, - Variant51696, - Variant51697, - Variant51698, - Variant51699, - Variant51700, - Variant51701, - Variant51702, - Variant51703, - Variant51704, - Variant51705, - Variant51706, - Variant51707, - Variant51708, - Variant51709, - Variant51710, - Variant51711, - Variant51712, - Variant51713, - Variant51714, - Variant51715, - Variant51716, - Variant51717, - Variant51718, - Variant51719, - Variant51720, - Variant51721, - Variant51722, - Variant51723, - Variant51724, - Variant51725, - Variant51726, - Variant51727, - Variant51728, - Variant51729, - Variant51730, - Variant51731, - Variant51732, - Variant51733, - Variant51734, - Variant51735, - Variant51736, - Variant51737, - Variant51738, - Variant51739, - Variant51740, - Variant51741, - Variant51742, - Variant51743, - Variant51744, - Variant51745, - Variant51746, - Variant51747, - Variant51748, - Variant51749, - Variant51750, - Variant51751, - Variant51752, - Variant51753, - Variant51754, - Variant51755, - Variant51756, - Variant51757, - Variant51758, - Variant51759, - Variant51760, - Variant51761, - Variant51762, - Variant51763, - Variant51764, - Variant51765, - Variant51766, - Variant51767, - Variant51768, - Variant51769, - Variant51770, - Variant51771, - Variant51772, - Variant51773, - Variant51774, - Variant51775, - Variant51776, - Variant51777, - Variant51778, - Variant51779, - Variant51780, - Variant51781, - Variant51782, - Variant51783, - Variant51784, - Variant51785, - Variant51786, - Variant51787, - Variant51788, - Variant51789, - Variant51790, - Variant51791, - Variant51792, - Variant51793, - Variant51794, - Variant51795, - Variant51796, - Variant51797, - Variant51798, - Variant51799, - Variant51800, - Variant51801, - Variant51802, - Variant51803, - Variant51804, - Variant51805, - Variant51806, - Variant51807, - Variant51808, - Variant51809, - Variant51810, - Variant51811, - Variant51812, - Variant51813, - Variant51814, - Variant51815, - Variant51816, - Variant51817, - Variant51818, - Variant51819, - Variant51820, - Variant51821, - Variant51822, - Variant51823, - Variant51824, - Variant51825, - Variant51826, - Variant51827, - Variant51828, - Variant51829, - Variant51830, - Variant51831, - Variant51832, - Variant51833, - Variant51834, - Variant51835, - Variant51836, - Variant51837, - Variant51838, - Variant51839, - Variant51840, - Variant51841, - Variant51842, - Variant51843, - Variant51844, - Variant51845, - Variant51846, - Variant51847, - Variant51848, - Variant51849, - Variant51850, - Variant51851, - Variant51852, - Variant51853, - Variant51854, - Variant51855, - Variant51856, - Variant51857, - Variant51858, - Variant51859, - Variant51860, - Variant51861, - Variant51862, - Variant51863, - Variant51864, - Variant51865, - Variant51866, - Variant51867, - Variant51868, - Variant51869, - Variant51870, - Variant51871, - Variant51872, - Variant51873, - Variant51874, - Variant51875, - Variant51876, - Variant51877, - Variant51878, - Variant51879, - Variant51880, - Variant51881, - Variant51882, - Variant51883, - Variant51884, - Variant51885, - Variant51886, - Variant51887, - Variant51888, - Variant51889, - Variant51890, - Variant51891, - Variant51892, - Variant51893, - Variant51894, - Variant51895, - Variant51896, - Variant51897, - Variant51898, - Variant51899, - Variant51900, - Variant51901, - Variant51902, - Variant51903, - Variant51904, - Variant51905, - Variant51906, - Variant51907, - Variant51908, - Variant51909, - Variant51910, - Variant51911, - Variant51912, - Variant51913, - Variant51914, - Variant51915, - Variant51916, - Variant51917, - Variant51918, - Variant51919, - Variant51920, - Variant51921, - Variant51922, - Variant51923, - Variant51924, - Variant51925, - Variant51926, - Variant51927, - Variant51928, - Variant51929, - Variant51930, - Variant51931, - Variant51932, - Variant51933, - Variant51934, - Variant51935, - Variant51936, - Variant51937, - Variant51938, - Variant51939, - Variant51940, - Variant51941, - Variant51942, - Variant51943, - Variant51944, - Variant51945, - Variant51946, - Variant51947, - Variant51948, - Variant51949, - Variant51950, - Variant51951, - Variant51952, - Variant51953, - Variant51954, - Variant51955, - Variant51956, - Variant51957, - Variant51958, - Variant51959, - Variant51960, - Variant51961, - Variant51962, - Variant51963, - Variant51964, - Variant51965, - Variant51966, - Variant51967, - Variant51968, - Variant51969, - Variant51970, - Variant51971, - Variant51972, - Variant51973, - Variant51974, - Variant51975, - Variant51976, - Variant51977, - Variant51978, - Variant51979, - Variant51980, - Variant51981, - Variant51982, - Variant51983, - Variant51984, - Variant51985, - Variant51986, - Variant51987, - Variant51988, - Variant51989, - Variant51990, - Variant51991, - Variant51992, - Variant51993, - Variant51994, - Variant51995, - Variant51996, - Variant51997, - Variant51998, - Variant51999, - Variant52000, - Variant52001, - Variant52002, - Variant52003, - Variant52004, - Variant52005, - Variant52006, - Variant52007, - Variant52008, - Variant52009, - Variant52010, - Variant52011, - Variant52012, - Variant52013, - Variant52014, - Variant52015, - Variant52016, - Variant52017, - Variant52018, - Variant52019, - Variant52020, - Variant52021, - Variant52022, - Variant52023, - Variant52024, - Variant52025, - Variant52026, - Variant52027, - Variant52028, - Variant52029, - Variant52030, - Variant52031, - Variant52032, - Variant52033, - Variant52034, - Variant52035, - Variant52036, - Variant52037, - Variant52038, - Variant52039, - Variant52040, - Variant52041, - Variant52042, - Variant52043, - Variant52044, - Variant52045, - Variant52046, - Variant52047, - Variant52048, - Variant52049, - Variant52050, - Variant52051, - Variant52052, - Variant52053, - Variant52054, - Variant52055, - Variant52056, - Variant52057, - Variant52058, - Variant52059, - Variant52060, - Variant52061, - Variant52062, - Variant52063, - Variant52064, - Variant52065, - Variant52066, - Variant52067, - Variant52068, - Variant52069, - Variant52070, - Variant52071, - Variant52072, - Variant52073, - Variant52074, - Variant52075, - Variant52076, - Variant52077, - Variant52078, - Variant52079, - Variant52080, - Variant52081, - Variant52082, - Variant52083, - Variant52084, - Variant52085, - Variant52086, - Variant52087, - Variant52088, - Variant52089, - Variant52090, - Variant52091, - Variant52092, - Variant52093, - Variant52094, - Variant52095, - Variant52096, - Variant52097, - Variant52098, - Variant52099, - Variant52100, - Variant52101, - Variant52102, - Variant52103, - Variant52104, - Variant52105, - Variant52106, - Variant52107, - Variant52108, - Variant52109, - Variant52110, - Variant52111, - Variant52112, - Variant52113, - Variant52114, - Variant52115, - Variant52116, - Variant52117, - Variant52118, - Variant52119, - Variant52120, - Variant52121, - Variant52122, - Variant52123, - Variant52124, - Variant52125, - Variant52126, - Variant52127, - Variant52128, - Variant52129, - Variant52130, - Variant52131, - Variant52132, - Variant52133, - Variant52134, - Variant52135, - Variant52136, - Variant52137, - Variant52138, - Variant52139, - Variant52140, - Variant52141, - Variant52142, - Variant52143, - Variant52144, - Variant52145, - Variant52146, - Variant52147, - Variant52148, - Variant52149, - Variant52150, - Variant52151, - Variant52152, - Variant52153, - Variant52154, - Variant52155, - Variant52156, - Variant52157, - Variant52158, - Variant52159, - Variant52160, - Variant52161, - Variant52162, - Variant52163, - Variant52164, - Variant52165, - Variant52166, - Variant52167, - Variant52168, - Variant52169, - Variant52170, - Variant52171, - Variant52172, - Variant52173, - Variant52174, - Variant52175, - Variant52176, - Variant52177, - Variant52178, - Variant52179, - Variant52180, - Variant52181, - Variant52182, - Variant52183, - Variant52184, - Variant52185, - Variant52186, - Variant52187, - Variant52188, - Variant52189, - Variant52190, - Variant52191, - Variant52192, - Variant52193, - Variant52194, - Variant52195, - Variant52196, - Variant52197, - Variant52198, - Variant52199, - Variant52200, - Variant52201, - Variant52202, - Variant52203, - Variant52204, - Variant52205, - Variant52206, - Variant52207, - Variant52208, - Variant52209, - Variant52210, - Variant52211, - Variant52212, - Variant52213, - Variant52214, - Variant52215, - Variant52216, - Variant52217, - Variant52218, - Variant52219, - Variant52220, - Variant52221, - Variant52222, - Variant52223, - Variant52224, - Variant52225, - Variant52226, - Variant52227, - Variant52228, - Variant52229, - Variant52230, - Variant52231, - Variant52232, - Variant52233, - Variant52234, - Variant52235, - Variant52236, - Variant52237, - Variant52238, - Variant52239, - Variant52240, - Variant52241, - Variant52242, - Variant52243, - Variant52244, - Variant52245, - Variant52246, - Variant52247, - Variant52248, - Variant52249, - Variant52250, - Variant52251, - Variant52252, - Variant52253, - Variant52254, - Variant52255, - Variant52256, - Variant52257, - Variant52258, - Variant52259, - Variant52260, - Variant52261, - Variant52262, - Variant52263, - Variant52264, - Variant52265, - Variant52266, - Variant52267, - Variant52268, - Variant52269, - Variant52270, - Variant52271, - Variant52272, - Variant52273, - Variant52274, - Variant52275, - Variant52276, - Variant52277, - Variant52278, - Variant52279, - Variant52280, - Variant52281, - Variant52282, - Variant52283, - Variant52284, - Variant52285, - Variant52286, - Variant52287, - Variant52288, - Variant52289, - Variant52290, - Variant52291, - Variant52292, - Variant52293, - Variant52294, - Variant52295, - Variant52296, - Variant52297, - Variant52298, - Variant52299, - Variant52300, - Variant52301, - Variant52302, - Variant52303, - Variant52304, - Variant52305, - Variant52306, - Variant52307, - Variant52308, - Variant52309, - Variant52310, - Variant52311, - Variant52312, - Variant52313, - Variant52314, - Variant52315, - Variant52316, - Variant52317, - Variant52318, - Variant52319, - Variant52320, - Variant52321, - Variant52322, - Variant52323, - Variant52324, - Variant52325, - Variant52326, - Variant52327, - Variant52328, - Variant52329, - Variant52330, - Variant52331, - Variant52332, - Variant52333, - Variant52334, - Variant52335, - Variant52336, - Variant52337, - Variant52338, - Variant52339, - Variant52340, - Variant52341, - Variant52342, - Variant52343, - Variant52344, - Variant52345, - Variant52346, - Variant52347, - Variant52348, - Variant52349, - Variant52350, - Variant52351, - Variant52352, - Variant52353, - Variant52354, - Variant52355, - Variant52356, - Variant52357, - Variant52358, - Variant52359, - Variant52360, - Variant52361, - Variant52362, - Variant52363, - Variant52364, - Variant52365, - Variant52366, - Variant52367, - Variant52368, - Variant52369, - Variant52370, - Variant52371, - Variant52372, - Variant52373, - Variant52374, - Variant52375, - Variant52376, - Variant52377, - Variant52378, - Variant52379, - Variant52380, - Variant52381, - Variant52382, - Variant52383, - Variant52384, - Variant52385, - Variant52386, - Variant52387, - Variant52388, - Variant52389, - Variant52390, - Variant52391, - Variant52392, - Variant52393, - Variant52394, - Variant52395, - Variant52396, - Variant52397, - Variant52398, - Variant52399, - Variant52400, - Variant52401, - Variant52402, - Variant52403, - Variant52404, - Variant52405, - Variant52406, - Variant52407, - Variant52408, - Variant52409, - Variant52410, - Variant52411, - Variant52412, - Variant52413, - Variant52414, - Variant52415, - Variant52416, - Variant52417, - Variant52418, - Variant52419, - Variant52420, - Variant52421, - Variant52422, - Variant52423, - Variant52424, - Variant52425, - Variant52426, - Variant52427, - Variant52428, - Variant52429, - Variant52430, - Variant52431, - Variant52432, - Variant52433, - Variant52434, - Variant52435, - Variant52436, - Variant52437, - Variant52438, - Variant52439, - Variant52440, - Variant52441, - Variant52442, - Variant52443, - Variant52444, - Variant52445, - Variant52446, - Variant52447, - Variant52448, - Variant52449, - Variant52450, - Variant52451, - Variant52452, - Variant52453, - Variant52454, - Variant52455, - Variant52456, - Variant52457, - Variant52458, - Variant52459, - Variant52460, - Variant52461, - Variant52462, - Variant52463, - Variant52464, - Variant52465, - Variant52466, - Variant52467, - Variant52468, - Variant52469, - Variant52470, - Variant52471, - Variant52472, - Variant52473, - Variant52474, - Variant52475, - Variant52476, - Variant52477, - Variant52478, - Variant52479, - Variant52480, - Variant52481, - Variant52482, - Variant52483, - Variant52484, - Variant52485, - Variant52486, - Variant52487, - Variant52488, - Variant52489, - Variant52490, - Variant52491, - Variant52492, - Variant52493, - Variant52494, - Variant52495, - Variant52496, - Variant52497, - Variant52498, - Variant52499, - Variant52500, - Variant52501, - Variant52502, - Variant52503, - Variant52504, - Variant52505, - Variant52506, - Variant52507, - Variant52508, - Variant52509, - Variant52510, - Variant52511, - Variant52512, - Variant52513, - Variant52514, - Variant52515, - Variant52516, - Variant52517, - Variant52518, - Variant52519, - Variant52520, - Variant52521, - Variant52522, - Variant52523, - Variant52524, - Variant52525, - Variant52526, - Variant52527, - Variant52528, - Variant52529, - Variant52530, - Variant52531, - Variant52532, - Variant52533, - Variant52534, - Variant52535, - Variant52536, - Variant52537, - Variant52538, - Variant52539, - Variant52540, - Variant52541, - Variant52542, - Variant52543, - Variant52544, - Variant52545, - Variant52546, - Variant52547, - Variant52548, - Variant52549, - Variant52550, - Variant52551, - Variant52552, - Variant52553, - Variant52554, - Variant52555, - Variant52556, - Variant52557, - Variant52558, - Variant52559, - Variant52560, - Variant52561, - Variant52562, - Variant52563, - Variant52564, - Variant52565, - Variant52566, - Variant52567, - Variant52568, - Variant52569, - Variant52570, - Variant52571, - Variant52572, - Variant52573, - Variant52574, - Variant52575, - Variant52576, - Variant52577, - Variant52578, - Variant52579, - Variant52580, - Variant52581, - Variant52582, - Variant52583, - Variant52584, - Variant52585, - Variant52586, - Variant52587, - Variant52588, - Variant52589, - Variant52590, - Variant52591, - Variant52592, - Variant52593, - Variant52594, - Variant52595, - Variant52596, - Variant52597, - Variant52598, - Variant52599, - Variant52600, - Variant52601, - Variant52602, - Variant52603, - Variant52604, - Variant52605, - Variant52606, - Variant52607, - Variant52608, - Variant52609, - Variant52610, - Variant52611, - Variant52612, - Variant52613, - Variant52614, - Variant52615, - Variant52616, - Variant52617, - Variant52618, - Variant52619, - Variant52620, - Variant52621, - Variant52622, - Variant52623, - Variant52624, - Variant52625, - Variant52626, - Variant52627, - Variant52628, - Variant52629, - Variant52630, - Variant52631, - Variant52632, - Variant52633, - Variant52634, - Variant52635, - Variant52636, - Variant52637, - Variant52638, - Variant52639, - Variant52640, - Variant52641, - Variant52642, - Variant52643, - Variant52644, - Variant52645, - Variant52646, - Variant52647, - Variant52648, - Variant52649, - Variant52650, - Variant52651, - Variant52652, - Variant52653, - Variant52654, - Variant52655, - Variant52656, - Variant52657, - Variant52658, - Variant52659, - Variant52660, - Variant52661, - Variant52662, - Variant52663, - Variant52664, - Variant52665, - Variant52666, - Variant52667, - Variant52668, - Variant52669, - Variant52670, - Variant52671, - Variant52672, - Variant52673, - Variant52674, - Variant52675, - Variant52676, - Variant52677, - Variant52678, - Variant52679, - Variant52680, - Variant52681, - Variant52682, - Variant52683, - Variant52684, - Variant52685, - Variant52686, - Variant52687, - Variant52688, - Variant52689, - Variant52690, - Variant52691, - Variant52692, - Variant52693, - Variant52694, - Variant52695, - Variant52696, - Variant52697, - Variant52698, - Variant52699, - Variant52700, - Variant52701, - Variant52702, - Variant52703, - Variant52704, - Variant52705, - Variant52706, - Variant52707, - Variant52708, - Variant52709, - Variant52710, - Variant52711, - Variant52712, - Variant52713, - Variant52714, - Variant52715, - Variant52716, - Variant52717, - Variant52718, - Variant52719, - Variant52720, - Variant52721, - Variant52722, - Variant52723, - Variant52724, - Variant52725, - Variant52726, - Variant52727, - Variant52728, - Variant52729, - Variant52730, - Variant52731, - Variant52732, - Variant52733, - Variant52734, - Variant52735, - Variant52736, - Variant52737, - Variant52738, - Variant52739, - Variant52740, - Variant52741, - Variant52742, - Variant52743, - Variant52744, - Variant52745, - Variant52746, - Variant52747, - Variant52748, - Variant52749, - Variant52750, - Variant52751, - Variant52752, - Variant52753, - Variant52754, - Variant52755, - Variant52756, - Variant52757, - Variant52758, - Variant52759, - Variant52760, - Variant52761, - Variant52762, - Variant52763, - Variant52764, - Variant52765, - Variant52766, - Variant52767, - Variant52768, - Variant52769, - Variant52770, - Variant52771, - Variant52772, - Variant52773, - Variant52774, - Variant52775, - Variant52776, - Variant52777, - Variant52778, - Variant52779, - Variant52780, - Variant52781, - Variant52782, - Variant52783, - Variant52784, - Variant52785, - Variant52786, - Variant52787, - Variant52788, - Variant52789, - Variant52790, - Variant52791, - Variant52792, - Variant52793, - Variant52794, - Variant52795, - Variant52796, - Variant52797, - Variant52798, - Variant52799, - Variant52800, - Variant52801, - Variant52802, - Variant52803, - Variant52804, - Variant52805, - Variant52806, - Variant52807, - Variant52808, - Variant52809, - Variant52810, - Variant52811, - Variant52812, - Variant52813, - Variant52814, - Variant52815, - Variant52816, - Variant52817, - Variant52818, - Variant52819, - Variant52820, - Variant52821, - Variant52822, - Variant52823, - Variant52824, - Variant52825, - Variant52826, - Variant52827, - Variant52828, - Variant52829, - Variant52830, - Variant52831, - Variant52832, - Variant52833, - Variant52834, - Variant52835, - Variant52836, - Variant52837, - Variant52838, - Variant52839, - Variant52840, - Variant52841, - Variant52842, - Variant52843, - Variant52844, - Variant52845, - Variant52846, - Variant52847, - Variant52848, - Variant52849, - Variant52850, - Variant52851, - Variant52852, - Variant52853, - Variant52854, - Variant52855, - Variant52856, - Variant52857, - Variant52858, - Variant52859, - Variant52860, - Variant52861, - Variant52862, - Variant52863, - Variant52864, - Variant52865, - Variant52866, - Variant52867, - Variant52868, - Variant52869, - Variant52870, - Variant52871, - Variant52872, - Variant52873, - Variant52874, - Variant52875, - Variant52876, - Variant52877, - Variant52878, - Variant52879, - Variant52880, - Variant52881, - Variant52882, - Variant52883, - Variant52884, - Variant52885, - Variant52886, - Variant52887, - Variant52888, - Variant52889, - Variant52890, - Variant52891, - Variant52892, - Variant52893, - Variant52894, - Variant52895, - Variant52896, - Variant52897, - Variant52898, - Variant52899, - Variant52900, - Variant52901, - Variant52902, - Variant52903, - Variant52904, - Variant52905, - Variant52906, - Variant52907, - Variant52908, - Variant52909, - Variant52910, - Variant52911, - Variant52912, - Variant52913, - Variant52914, - Variant52915, - Variant52916, - Variant52917, - Variant52918, - Variant52919, - Variant52920, - Variant52921, - Variant52922, - Variant52923, - Variant52924, - Variant52925, - Variant52926, - Variant52927, - Variant52928, - Variant52929, - Variant52930, - Variant52931, - Variant52932, - Variant52933, - Variant52934, - Variant52935, - Variant52936, - Variant52937, - Variant52938, - Variant52939, - Variant52940, - Variant52941, - Variant52942, - Variant52943, - Variant52944, - Variant52945, - Variant52946, - Variant52947, - Variant52948, - Variant52949, - Variant52950, - Variant52951, - Variant52952, - Variant52953, - Variant52954, - Variant52955, - Variant52956, - Variant52957, - Variant52958, - Variant52959, - Variant52960, - Variant52961, - Variant52962, - Variant52963, - Variant52964, - Variant52965, - Variant52966, - Variant52967, - Variant52968, - Variant52969, - Variant52970, - Variant52971, - Variant52972, - Variant52973, - Variant52974, - Variant52975, - Variant52976, - Variant52977, - Variant52978, - Variant52979, - Variant52980, - Variant52981, - Variant52982, - Variant52983, - Variant52984, - Variant52985, - Variant52986, - Variant52987, - Variant52988, - Variant52989, - Variant52990, - Variant52991, - Variant52992, - Variant52993, - Variant52994, - Variant52995, - Variant52996, - Variant52997, - Variant52998, - Variant52999, - Variant53000, - Variant53001, - Variant53002, - Variant53003, - Variant53004, - Variant53005, - Variant53006, - Variant53007, - Variant53008, - Variant53009, - Variant53010, - Variant53011, - Variant53012, - Variant53013, - Variant53014, - Variant53015, - Variant53016, - Variant53017, - Variant53018, - Variant53019, - Variant53020, - Variant53021, - Variant53022, - Variant53023, - Variant53024, - Variant53025, - Variant53026, - Variant53027, - Variant53028, - Variant53029, - Variant53030, - Variant53031, - Variant53032, - Variant53033, - Variant53034, - Variant53035, - Variant53036, - Variant53037, - Variant53038, - Variant53039, - Variant53040, - Variant53041, - Variant53042, - Variant53043, - Variant53044, - Variant53045, - Variant53046, - Variant53047, - Variant53048, - Variant53049, - Variant53050, - Variant53051, - Variant53052, - Variant53053, - Variant53054, - Variant53055, - Variant53056, - Variant53057, - Variant53058, - Variant53059, - Variant53060, - Variant53061, - Variant53062, - Variant53063, - Variant53064, - Variant53065, - Variant53066, - Variant53067, - Variant53068, - Variant53069, - Variant53070, - Variant53071, - Variant53072, - Variant53073, - Variant53074, - Variant53075, - Variant53076, - Variant53077, - Variant53078, - Variant53079, - Variant53080, - Variant53081, - Variant53082, - Variant53083, - Variant53084, - Variant53085, - Variant53086, - Variant53087, - Variant53088, - Variant53089, - Variant53090, - Variant53091, - Variant53092, - Variant53093, - Variant53094, - Variant53095, - Variant53096, - Variant53097, - Variant53098, - Variant53099, - Variant53100, - Variant53101, - Variant53102, - Variant53103, - Variant53104, - Variant53105, - Variant53106, - Variant53107, - Variant53108, - Variant53109, - Variant53110, - Variant53111, - Variant53112, - Variant53113, - Variant53114, - Variant53115, - Variant53116, - Variant53117, - Variant53118, - Variant53119, - Variant53120, - Variant53121, - Variant53122, - Variant53123, - Variant53124, - Variant53125, - Variant53126, - Variant53127, - Variant53128, - Variant53129, - Variant53130, - Variant53131, - Variant53132, - Variant53133, - Variant53134, - Variant53135, - Variant53136, - Variant53137, - Variant53138, - Variant53139, - Variant53140, - Variant53141, - Variant53142, - Variant53143, - Variant53144, - Variant53145, - Variant53146, - Variant53147, - Variant53148, - Variant53149, - Variant53150, - Variant53151, - Variant53152, - Variant53153, - Variant53154, - Variant53155, - Variant53156, - Variant53157, - Variant53158, - Variant53159, - Variant53160, - Variant53161, - Variant53162, - Variant53163, - Variant53164, - Variant53165, - Variant53166, - Variant53167, - Variant53168, - Variant53169, - Variant53170, - Variant53171, - Variant53172, - Variant53173, - Variant53174, - Variant53175, - Variant53176, - Variant53177, - Variant53178, - Variant53179, - Variant53180, - Variant53181, - Variant53182, - Variant53183, - Variant53184, - Variant53185, - Variant53186, - Variant53187, - Variant53188, - Variant53189, - Variant53190, - Variant53191, - Variant53192, - Variant53193, - Variant53194, - Variant53195, - Variant53196, - Variant53197, - Variant53198, - Variant53199, - Variant53200, - Variant53201, - Variant53202, - Variant53203, - Variant53204, - Variant53205, - Variant53206, - Variant53207, - Variant53208, - Variant53209, - Variant53210, - Variant53211, - Variant53212, - Variant53213, - Variant53214, - Variant53215, - Variant53216, - Variant53217, - Variant53218, - Variant53219, - Variant53220, - Variant53221, - Variant53222, - Variant53223, - Variant53224, - Variant53225, - Variant53226, - Variant53227, - Variant53228, - Variant53229, - Variant53230, - Variant53231, - Variant53232, - Variant53233, - Variant53234, - Variant53235, - Variant53236, - Variant53237, - Variant53238, - Variant53239, - Variant53240, - Variant53241, - Variant53242, - Variant53243, - Variant53244, - Variant53245, - Variant53246, - Variant53247, - Variant53248, - Variant53249, - Variant53250, - Variant53251, - Variant53252, - Variant53253, - Variant53254, - Variant53255, - Variant53256, - Variant53257, - Variant53258, - Variant53259, - Variant53260, - Variant53261, - Variant53262, - Variant53263, - Variant53264, - Variant53265, - Variant53266, - Variant53267, - Variant53268, - Variant53269, - Variant53270, - Variant53271, - Variant53272, - Variant53273, - Variant53274, - Variant53275, - Variant53276, - Variant53277, - Variant53278, - Variant53279, - Variant53280, - Variant53281, - Variant53282, - Variant53283, - Variant53284, - Variant53285, - Variant53286, - Variant53287, - Variant53288, - Variant53289, - Variant53290, - Variant53291, - Variant53292, - Variant53293, - Variant53294, - Variant53295, - Variant53296, - Variant53297, - Variant53298, - Variant53299, - Variant53300, - Variant53301, - Variant53302, - Variant53303, - Variant53304, - Variant53305, - Variant53306, - Variant53307, - Variant53308, - Variant53309, - Variant53310, - Variant53311, - Variant53312, - Variant53313, - Variant53314, - Variant53315, - Variant53316, - Variant53317, - Variant53318, - Variant53319, - Variant53320, - Variant53321, - Variant53322, - Variant53323, - Variant53324, - Variant53325, - Variant53326, - Variant53327, - Variant53328, - Variant53329, - Variant53330, - Variant53331, - Variant53332, - Variant53333, - Variant53334, - Variant53335, - Variant53336, - Variant53337, - Variant53338, - Variant53339, - Variant53340, - Variant53341, - Variant53342, - Variant53343, - Variant53344, - Variant53345, - Variant53346, - Variant53347, - Variant53348, - Variant53349, - Variant53350, - Variant53351, - Variant53352, - Variant53353, - Variant53354, - Variant53355, - Variant53356, - Variant53357, - Variant53358, - Variant53359, - Variant53360, - Variant53361, - Variant53362, - Variant53363, - Variant53364, - Variant53365, - Variant53366, - Variant53367, - Variant53368, - Variant53369, - Variant53370, - Variant53371, - Variant53372, - Variant53373, - Variant53374, - Variant53375, - Variant53376, - Variant53377, - Variant53378, - Variant53379, - Variant53380, - Variant53381, - Variant53382, - Variant53383, - Variant53384, - Variant53385, - Variant53386, - Variant53387, - Variant53388, - Variant53389, - Variant53390, - Variant53391, - Variant53392, - Variant53393, - Variant53394, - Variant53395, - Variant53396, - Variant53397, - Variant53398, - Variant53399, - Variant53400, - Variant53401, - Variant53402, - Variant53403, - Variant53404, - Variant53405, - Variant53406, - Variant53407, - Variant53408, - Variant53409, - Variant53410, - Variant53411, - Variant53412, - Variant53413, - Variant53414, - Variant53415, - Variant53416, - Variant53417, - Variant53418, - Variant53419, - Variant53420, - Variant53421, - Variant53422, - Variant53423, - Variant53424, - Variant53425, - Variant53426, - Variant53427, - Variant53428, - Variant53429, - Variant53430, - Variant53431, - Variant53432, - Variant53433, - Variant53434, - Variant53435, - Variant53436, - Variant53437, - Variant53438, - Variant53439, - Variant53440, - Variant53441, - Variant53442, - Variant53443, - Variant53444, - Variant53445, - Variant53446, - Variant53447, - Variant53448, - Variant53449, - Variant53450, - Variant53451, - Variant53452, - Variant53453, - Variant53454, - Variant53455, - Variant53456, - Variant53457, - Variant53458, - Variant53459, - Variant53460, - Variant53461, - Variant53462, - Variant53463, - Variant53464, - Variant53465, - Variant53466, - Variant53467, - Variant53468, - Variant53469, - Variant53470, - Variant53471, - Variant53472, - Variant53473, - Variant53474, - Variant53475, - Variant53476, - Variant53477, - Variant53478, - Variant53479, - Variant53480, - Variant53481, - Variant53482, - Variant53483, - Variant53484, - Variant53485, - Variant53486, - Variant53487, - Variant53488, - Variant53489, - Variant53490, - Variant53491, - Variant53492, - Variant53493, - Variant53494, - Variant53495, - Variant53496, - Variant53497, - Variant53498, - Variant53499, - Variant53500, - Variant53501, - Variant53502, - Variant53503, - Variant53504, - Variant53505, - Variant53506, - Variant53507, - Variant53508, - Variant53509, - Variant53510, - Variant53511, - Variant53512, - Variant53513, - Variant53514, - Variant53515, - Variant53516, - Variant53517, - Variant53518, - Variant53519, - Variant53520, - Variant53521, - Variant53522, - Variant53523, - Variant53524, - Variant53525, - Variant53526, - Variant53527, - Variant53528, - Variant53529, - Variant53530, - Variant53531, - Variant53532, - Variant53533, - Variant53534, - Variant53535, - Variant53536, - Variant53537, - Variant53538, - Variant53539, - Variant53540, - Variant53541, - Variant53542, - Variant53543, - Variant53544, - Variant53545, - Variant53546, - Variant53547, - Variant53548, - Variant53549, - Variant53550, - Variant53551, - Variant53552, - Variant53553, - Variant53554, - Variant53555, - Variant53556, - Variant53557, - Variant53558, - Variant53559, - Variant53560, - Variant53561, - Variant53562, - Variant53563, - Variant53564, - Variant53565, - Variant53566, - Variant53567, - Variant53568, - Variant53569, - Variant53570, - Variant53571, - Variant53572, - Variant53573, - Variant53574, - Variant53575, - Variant53576, - Variant53577, - Variant53578, - Variant53579, - Variant53580, - Variant53581, - Variant53582, - Variant53583, - Variant53584, - Variant53585, - Variant53586, - Variant53587, - Variant53588, - Variant53589, - Variant53590, - Variant53591, - Variant53592, - Variant53593, - Variant53594, - Variant53595, - Variant53596, - Variant53597, - Variant53598, - Variant53599, - Variant53600, - Variant53601, - Variant53602, - Variant53603, - Variant53604, - Variant53605, - Variant53606, - Variant53607, - Variant53608, - Variant53609, - Variant53610, - Variant53611, - Variant53612, - Variant53613, - Variant53614, - Variant53615, - Variant53616, - Variant53617, - Variant53618, - Variant53619, - Variant53620, - Variant53621, - Variant53622, - Variant53623, - Variant53624, - Variant53625, - Variant53626, - Variant53627, - Variant53628, - Variant53629, - Variant53630, - Variant53631, - Variant53632, - Variant53633, - Variant53634, - Variant53635, - Variant53636, - Variant53637, - Variant53638, - Variant53639, - Variant53640, - Variant53641, - Variant53642, - Variant53643, - Variant53644, - Variant53645, - Variant53646, - Variant53647, - Variant53648, - Variant53649, - Variant53650, - Variant53651, - Variant53652, - Variant53653, - Variant53654, - Variant53655, - Variant53656, - Variant53657, - Variant53658, - Variant53659, - Variant53660, - Variant53661, - Variant53662, - Variant53663, - Variant53664, - Variant53665, - Variant53666, - Variant53667, - Variant53668, - Variant53669, - Variant53670, - Variant53671, - Variant53672, - Variant53673, - Variant53674, - Variant53675, - Variant53676, - Variant53677, - Variant53678, - Variant53679, - Variant53680, - Variant53681, - Variant53682, - Variant53683, - Variant53684, - Variant53685, - Variant53686, - Variant53687, - Variant53688, - Variant53689, - Variant53690, - Variant53691, - Variant53692, - Variant53693, - Variant53694, - Variant53695, - Variant53696, - Variant53697, - Variant53698, - Variant53699, - Variant53700, - Variant53701, - Variant53702, - Variant53703, - Variant53704, - Variant53705, - Variant53706, - Variant53707, - Variant53708, - Variant53709, - Variant53710, - Variant53711, - Variant53712, - Variant53713, - Variant53714, - Variant53715, - Variant53716, - Variant53717, - Variant53718, - Variant53719, - Variant53720, - Variant53721, - Variant53722, - Variant53723, - Variant53724, - Variant53725, - Variant53726, - Variant53727, - Variant53728, - Variant53729, - Variant53730, - Variant53731, - Variant53732, - Variant53733, - Variant53734, - Variant53735, - Variant53736, - Variant53737, - Variant53738, - Variant53739, - Variant53740, - Variant53741, - Variant53742, - Variant53743, - Variant53744, - Variant53745, - Variant53746, - Variant53747, - Variant53748, - Variant53749, - Variant53750, - Variant53751, - Variant53752, - Variant53753, - Variant53754, - Variant53755, - Variant53756, - Variant53757, - Variant53758, - Variant53759, - Variant53760, - Variant53761, - Variant53762, - Variant53763, - Variant53764, - Variant53765, - Variant53766, - Variant53767, - Variant53768, - Variant53769, - Variant53770, - Variant53771, - Variant53772, - Variant53773, - Variant53774, - Variant53775, - Variant53776, - Variant53777, - Variant53778, - Variant53779, - Variant53780, - Variant53781, - Variant53782, - Variant53783, - Variant53784, - Variant53785, - Variant53786, - Variant53787, - Variant53788, - Variant53789, - Variant53790, - Variant53791, - Variant53792, - Variant53793, - Variant53794, - Variant53795, - Variant53796, - Variant53797, - Variant53798, - Variant53799, - Variant53800, - Variant53801, - Variant53802, - Variant53803, - Variant53804, - Variant53805, - Variant53806, - Variant53807, - Variant53808, - Variant53809, - Variant53810, - Variant53811, - Variant53812, - Variant53813, - Variant53814, - Variant53815, - Variant53816, - Variant53817, - Variant53818, - Variant53819, - Variant53820, - Variant53821, - Variant53822, - Variant53823, - Variant53824, - Variant53825, - Variant53826, - Variant53827, - Variant53828, - Variant53829, - Variant53830, - Variant53831, - Variant53832, - Variant53833, - Variant53834, - Variant53835, - Variant53836, - Variant53837, - Variant53838, - Variant53839, - Variant53840, - Variant53841, - Variant53842, - Variant53843, - Variant53844, - Variant53845, - Variant53846, - Variant53847, - Variant53848, - Variant53849, - Variant53850, - Variant53851, - Variant53852, - Variant53853, - Variant53854, - Variant53855, - Variant53856, - Variant53857, - Variant53858, - Variant53859, - Variant53860, - Variant53861, - Variant53862, - Variant53863, - Variant53864, - Variant53865, - Variant53866, - Variant53867, - Variant53868, - Variant53869, - Variant53870, - Variant53871, - Variant53872, - Variant53873, - Variant53874, - Variant53875, - Variant53876, - Variant53877, - Variant53878, - Variant53879, - Variant53880, - Variant53881, - Variant53882, - Variant53883, - Variant53884, - Variant53885, - Variant53886, - Variant53887, - Variant53888, - Variant53889, - Variant53890, - Variant53891, - Variant53892, - Variant53893, - Variant53894, - Variant53895, - Variant53896, - Variant53897, - Variant53898, - Variant53899, - Variant53900, - Variant53901, - Variant53902, - Variant53903, - Variant53904, - Variant53905, - Variant53906, - Variant53907, - Variant53908, - Variant53909, - Variant53910, - Variant53911, - Variant53912, - Variant53913, - Variant53914, - Variant53915, - Variant53916, - Variant53917, - Variant53918, - Variant53919, - Variant53920, - Variant53921, - Variant53922, - Variant53923, - Variant53924, - Variant53925, - Variant53926, - Variant53927, - Variant53928, - Variant53929, - Variant53930, - Variant53931, - Variant53932, - Variant53933, - Variant53934, - Variant53935, - Variant53936, - Variant53937, - Variant53938, - Variant53939, - Variant53940, - Variant53941, - Variant53942, - Variant53943, - Variant53944, - Variant53945, - Variant53946, - Variant53947, - Variant53948, - Variant53949, - Variant53950, - Variant53951, - Variant53952, - Variant53953, - Variant53954, - Variant53955, - Variant53956, - Variant53957, - Variant53958, - Variant53959, - Variant53960, - Variant53961, - Variant53962, - Variant53963, - Variant53964, - Variant53965, - Variant53966, - Variant53967, - Variant53968, - Variant53969, - Variant53970, - Variant53971, - Variant53972, - Variant53973, - Variant53974, - Variant53975, - Variant53976, - Variant53977, - Variant53978, - Variant53979, - Variant53980, - Variant53981, - Variant53982, - Variant53983, - Variant53984, - Variant53985, - Variant53986, - Variant53987, - Variant53988, - Variant53989, - Variant53990, - Variant53991, - Variant53992, - Variant53993, - Variant53994, - Variant53995, - Variant53996, - Variant53997, - Variant53998, - Variant53999, - Variant54000, - Variant54001, - Variant54002, - Variant54003, - Variant54004, - Variant54005, - Variant54006, - Variant54007, - Variant54008, - Variant54009, - Variant54010, - Variant54011, - Variant54012, - Variant54013, - Variant54014, - Variant54015, - Variant54016, - Variant54017, - Variant54018, - Variant54019, - Variant54020, - Variant54021, - Variant54022, - Variant54023, - Variant54024, - Variant54025, - Variant54026, - Variant54027, - Variant54028, - Variant54029, - Variant54030, - Variant54031, - Variant54032, - Variant54033, - Variant54034, - Variant54035, - Variant54036, - Variant54037, - Variant54038, - Variant54039, - Variant54040, - Variant54041, - Variant54042, - Variant54043, - Variant54044, - Variant54045, - Variant54046, - Variant54047, - Variant54048, - Variant54049, - Variant54050, - Variant54051, - Variant54052, - Variant54053, - Variant54054, - Variant54055, - Variant54056, - Variant54057, - Variant54058, - Variant54059, - Variant54060, - Variant54061, - Variant54062, - Variant54063, - Variant54064, - Variant54065, - Variant54066, - Variant54067, - Variant54068, - Variant54069, - Variant54070, - Variant54071, - Variant54072, - Variant54073, - Variant54074, - Variant54075, - Variant54076, - Variant54077, - Variant54078, - Variant54079, - Variant54080, - Variant54081, - Variant54082, - Variant54083, - Variant54084, - Variant54085, - Variant54086, - Variant54087, - Variant54088, - Variant54089, - Variant54090, - Variant54091, - Variant54092, - Variant54093, - Variant54094, - Variant54095, - Variant54096, - Variant54097, - Variant54098, - Variant54099, - Variant54100, - Variant54101, - Variant54102, - Variant54103, - Variant54104, - Variant54105, - Variant54106, - Variant54107, - Variant54108, - Variant54109, - Variant54110, - Variant54111, - Variant54112, - Variant54113, - Variant54114, - Variant54115, - Variant54116, - Variant54117, - Variant54118, - Variant54119, - Variant54120, - Variant54121, - Variant54122, - Variant54123, - Variant54124, - Variant54125, - Variant54126, - Variant54127, - Variant54128, - Variant54129, - Variant54130, - Variant54131, - Variant54132, - Variant54133, - Variant54134, - Variant54135, - Variant54136, - Variant54137, - Variant54138, - Variant54139, - Variant54140, - Variant54141, - Variant54142, - Variant54143, - Variant54144, - Variant54145, - Variant54146, - Variant54147, - Variant54148, - Variant54149, - Variant54150, - Variant54151, - Variant54152, - Variant54153, - Variant54154, - Variant54155, - Variant54156, - Variant54157, - Variant54158, - Variant54159, - Variant54160, - Variant54161, - Variant54162, - Variant54163, - Variant54164, - Variant54165, - Variant54166, - Variant54167, - Variant54168, - Variant54169, - Variant54170, - Variant54171, - Variant54172, - Variant54173, - Variant54174, - Variant54175, - Variant54176, - Variant54177, - Variant54178, - Variant54179, - Variant54180, - Variant54181, - Variant54182, - Variant54183, - Variant54184, - Variant54185, - Variant54186, - Variant54187, - Variant54188, - Variant54189, - Variant54190, - Variant54191, - Variant54192, - Variant54193, - Variant54194, - Variant54195, - Variant54196, - Variant54197, - Variant54198, - Variant54199, - Variant54200, - Variant54201, - Variant54202, - Variant54203, - Variant54204, - Variant54205, - Variant54206, - Variant54207, - Variant54208, - Variant54209, - Variant54210, - Variant54211, - Variant54212, - Variant54213, - Variant54214, - Variant54215, - Variant54216, - Variant54217, - Variant54218, - Variant54219, - Variant54220, - Variant54221, - Variant54222, - Variant54223, - Variant54224, - Variant54225, - Variant54226, - Variant54227, - Variant54228, - Variant54229, - Variant54230, - Variant54231, - Variant54232, - Variant54233, - Variant54234, - Variant54235, - Variant54236, - Variant54237, - Variant54238, - Variant54239, - Variant54240, - Variant54241, - Variant54242, - Variant54243, - Variant54244, - Variant54245, - Variant54246, - Variant54247, - Variant54248, - Variant54249, - Variant54250, - Variant54251, - Variant54252, - Variant54253, - Variant54254, - Variant54255, - Variant54256, - Variant54257, - Variant54258, - Variant54259, - Variant54260, - Variant54261, - Variant54262, - Variant54263, - Variant54264, - Variant54265, - Variant54266, - Variant54267, - Variant54268, - Variant54269, - Variant54270, - Variant54271, - Variant54272, - Variant54273, - Variant54274, - Variant54275, - Variant54276, - Variant54277, - Variant54278, - Variant54279, - Variant54280, - Variant54281, - Variant54282, - Variant54283, - Variant54284, - Variant54285, - Variant54286, - Variant54287, - Variant54288, - Variant54289, - Variant54290, - Variant54291, - Variant54292, - Variant54293, - Variant54294, - Variant54295, - Variant54296, - Variant54297, - Variant54298, - Variant54299, - Variant54300, - Variant54301, - Variant54302, - Variant54303, - Variant54304, - Variant54305, - Variant54306, - Variant54307, - Variant54308, - Variant54309, - Variant54310, - Variant54311, - Variant54312, - Variant54313, - Variant54314, - Variant54315, - Variant54316, - Variant54317, - Variant54318, - Variant54319, - Variant54320, - Variant54321, - Variant54322, - Variant54323, - Variant54324, - Variant54325, - Variant54326, - Variant54327, - Variant54328, - Variant54329, - Variant54330, - Variant54331, - Variant54332, - Variant54333, - Variant54334, - Variant54335, - Variant54336, - Variant54337, - Variant54338, - Variant54339, - Variant54340, - Variant54341, - Variant54342, - Variant54343, - Variant54344, - Variant54345, - Variant54346, - Variant54347, - Variant54348, - Variant54349, - Variant54350, - Variant54351, - Variant54352, - Variant54353, - Variant54354, - Variant54355, - Variant54356, - Variant54357, - Variant54358, - Variant54359, - Variant54360, - Variant54361, - Variant54362, - Variant54363, - Variant54364, - Variant54365, - Variant54366, - Variant54367, - Variant54368, - Variant54369, - Variant54370, - Variant54371, - Variant54372, - Variant54373, - Variant54374, - Variant54375, - Variant54376, - Variant54377, - Variant54378, - Variant54379, - Variant54380, - Variant54381, - Variant54382, - Variant54383, - Variant54384, - Variant54385, - Variant54386, - Variant54387, - Variant54388, - Variant54389, - Variant54390, - Variant54391, - Variant54392, - Variant54393, - Variant54394, - Variant54395, - Variant54396, - Variant54397, - Variant54398, - Variant54399, - Variant54400, - Variant54401, - Variant54402, - Variant54403, - Variant54404, - Variant54405, - Variant54406, - Variant54407, - Variant54408, - Variant54409, - Variant54410, - Variant54411, - Variant54412, - Variant54413, - Variant54414, - Variant54415, - Variant54416, - Variant54417, - Variant54418, - Variant54419, - Variant54420, - Variant54421, - Variant54422, - Variant54423, - Variant54424, - Variant54425, - Variant54426, - Variant54427, - Variant54428, - Variant54429, - Variant54430, - Variant54431, - Variant54432, - Variant54433, - Variant54434, - Variant54435, - Variant54436, - Variant54437, - Variant54438, - Variant54439, - Variant54440, - Variant54441, - Variant54442, - Variant54443, - Variant54444, - Variant54445, - Variant54446, - Variant54447, - Variant54448, - Variant54449, - Variant54450, - Variant54451, - Variant54452, - Variant54453, - Variant54454, - Variant54455, - Variant54456, - Variant54457, - Variant54458, - Variant54459, - Variant54460, - Variant54461, - Variant54462, - Variant54463, - Variant54464, - Variant54465, - Variant54466, - Variant54467, - Variant54468, - Variant54469, - Variant54470, - Variant54471, - Variant54472, - Variant54473, - Variant54474, - Variant54475, - Variant54476, - Variant54477, - Variant54478, - Variant54479, - Variant54480, - Variant54481, - Variant54482, - Variant54483, - Variant54484, - Variant54485, - Variant54486, - Variant54487, - Variant54488, - Variant54489, - Variant54490, - Variant54491, - Variant54492, - Variant54493, - Variant54494, - Variant54495, - Variant54496, - Variant54497, - Variant54498, - Variant54499, - Variant54500, - Variant54501, - Variant54502, - Variant54503, - Variant54504, - Variant54505, - Variant54506, - Variant54507, - Variant54508, - Variant54509, - Variant54510, - Variant54511, - Variant54512, - Variant54513, - Variant54514, - Variant54515, - Variant54516, - Variant54517, - Variant54518, - Variant54519, - Variant54520, - Variant54521, - Variant54522, - Variant54523, - Variant54524, - Variant54525, - Variant54526, - Variant54527, - Variant54528, - Variant54529, - Variant54530, - Variant54531, - Variant54532, - Variant54533, - Variant54534, - Variant54535, - Variant54536, - Variant54537, - Variant54538, - Variant54539, - Variant54540, - Variant54541, - Variant54542, - Variant54543, - Variant54544, - Variant54545, - Variant54546, - Variant54547, - Variant54548, - Variant54549, - Variant54550, - Variant54551, - Variant54552, - Variant54553, - Variant54554, - Variant54555, - Variant54556, - Variant54557, - Variant54558, - Variant54559, - Variant54560, - Variant54561, - Variant54562, - Variant54563, - Variant54564, - Variant54565, - Variant54566, - Variant54567, - Variant54568, - Variant54569, - Variant54570, - Variant54571, - Variant54572, - Variant54573, - Variant54574, - Variant54575, - Variant54576, - Variant54577, - Variant54578, - Variant54579, - Variant54580, - Variant54581, - Variant54582, - Variant54583, - Variant54584, - Variant54585, - Variant54586, - Variant54587, - Variant54588, - Variant54589, - Variant54590, - Variant54591, - Variant54592, - Variant54593, - Variant54594, - Variant54595, - Variant54596, - Variant54597, - Variant54598, - Variant54599, - Variant54600, - Variant54601, - Variant54602, - Variant54603, - Variant54604, - Variant54605, - Variant54606, - Variant54607, - Variant54608, - Variant54609, - Variant54610, - Variant54611, - Variant54612, - Variant54613, - Variant54614, - Variant54615, - Variant54616, - Variant54617, - Variant54618, - Variant54619, - Variant54620, - Variant54621, - Variant54622, - Variant54623, - Variant54624, - Variant54625, - Variant54626, - Variant54627, - Variant54628, - Variant54629, - Variant54630, - Variant54631, - Variant54632, - Variant54633, - Variant54634, - Variant54635, - Variant54636, - Variant54637, - Variant54638, - Variant54639, - Variant54640, - Variant54641, - Variant54642, - Variant54643, - Variant54644, - Variant54645, - Variant54646, - Variant54647, - Variant54648, - Variant54649, - Variant54650, - Variant54651, - Variant54652, - Variant54653, - Variant54654, - Variant54655, - Variant54656, - Variant54657, - Variant54658, - Variant54659, - Variant54660, - Variant54661, - Variant54662, - Variant54663, - Variant54664, - Variant54665, - Variant54666, - Variant54667, - Variant54668, - Variant54669, - Variant54670, - Variant54671, - Variant54672, - Variant54673, - Variant54674, - Variant54675, - Variant54676, - Variant54677, - Variant54678, - Variant54679, - Variant54680, - Variant54681, - Variant54682, - Variant54683, - Variant54684, - Variant54685, - Variant54686, - Variant54687, - Variant54688, - Variant54689, - Variant54690, - Variant54691, - Variant54692, - Variant54693, - Variant54694, - Variant54695, - Variant54696, - Variant54697, - Variant54698, - Variant54699, - Variant54700, - Variant54701, - Variant54702, - Variant54703, - Variant54704, - Variant54705, - Variant54706, - Variant54707, - Variant54708, - Variant54709, - Variant54710, - Variant54711, - Variant54712, - Variant54713, - Variant54714, - Variant54715, - Variant54716, - Variant54717, - Variant54718, - Variant54719, - Variant54720, - Variant54721, - Variant54722, - Variant54723, - Variant54724, - Variant54725, - Variant54726, - Variant54727, - Variant54728, - Variant54729, - Variant54730, - Variant54731, - Variant54732, - Variant54733, - Variant54734, - Variant54735, - Variant54736, - Variant54737, - Variant54738, - Variant54739, - Variant54740, - Variant54741, - Variant54742, - Variant54743, - Variant54744, - Variant54745, - Variant54746, - Variant54747, - Variant54748, - Variant54749, - Variant54750, - Variant54751, - Variant54752, - Variant54753, - Variant54754, - Variant54755, - Variant54756, - Variant54757, - Variant54758, - Variant54759, - Variant54760, - Variant54761, - Variant54762, - Variant54763, - Variant54764, - Variant54765, - Variant54766, - Variant54767, - Variant54768, - Variant54769, - Variant54770, - Variant54771, - Variant54772, - Variant54773, - Variant54774, - Variant54775, - Variant54776, - Variant54777, - Variant54778, - Variant54779, - Variant54780, - Variant54781, - Variant54782, - Variant54783, - Variant54784, - Variant54785, - Variant54786, - Variant54787, - Variant54788, - Variant54789, - Variant54790, - Variant54791, - Variant54792, - Variant54793, - Variant54794, - Variant54795, - Variant54796, - Variant54797, - Variant54798, - Variant54799, - Variant54800, - Variant54801, - Variant54802, - Variant54803, - Variant54804, - Variant54805, - Variant54806, - Variant54807, - Variant54808, - Variant54809, - Variant54810, - Variant54811, - Variant54812, - Variant54813, - Variant54814, - Variant54815, - Variant54816, - Variant54817, - Variant54818, - Variant54819, - Variant54820, - Variant54821, - Variant54822, - Variant54823, - Variant54824, - Variant54825, - Variant54826, - Variant54827, - Variant54828, - Variant54829, - Variant54830, - Variant54831, - Variant54832, - Variant54833, - Variant54834, - Variant54835, - Variant54836, - Variant54837, - Variant54838, - Variant54839, - Variant54840, - Variant54841, - Variant54842, - Variant54843, - Variant54844, - Variant54845, - Variant54846, - Variant54847, - Variant54848, - Variant54849, - Variant54850, - Variant54851, - Variant54852, - Variant54853, - Variant54854, - Variant54855, - Variant54856, - Variant54857, - Variant54858, - Variant54859, - Variant54860, - Variant54861, - Variant54862, - Variant54863, - Variant54864, - Variant54865, - Variant54866, - Variant54867, - Variant54868, - Variant54869, - Variant54870, - Variant54871, - Variant54872, - Variant54873, - Variant54874, - Variant54875, - Variant54876, - Variant54877, - Variant54878, - Variant54879, - Variant54880, - Variant54881, - Variant54882, - Variant54883, - Variant54884, - Variant54885, - Variant54886, - Variant54887, - Variant54888, - Variant54889, - Variant54890, - Variant54891, - Variant54892, - Variant54893, - Variant54894, - Variant54895, - Variant54896, - Variant54897, - Variant54898, - Variant54899, - Variant54900, - Variant54901, - Variant54902, - Variant54903, - Variant54904, - Variant54905, - Variant54906, - Variant54907, - Variant54908, - Variant54909, - Variant54910, - Variant54911, - Variant54912, - Variant54913, - Variant54914, - Variant54915, - Variant54916, - Variant54917, - Variant54918, - Variant54919, - Variant54920, - Variant54921, - Variant54922, - Variant54923, - Variant54924, - Variant54925, - Variant54926, - Variant54927, - Variant54928, - Variant54929, - Variant54930, - Variant54931, - Variant54932, - Variant54933, - Variant54934, - Variant54935, - Variant54936, - Variant54937, - Variant54938, - Variant54939, - Variant54940, - Variant54941, - Variant54942, - Variant54943, - Variant54944, - Variant54945, - Variant54946, - Variant54947, - Variant54948, - Variant54949, - Variant54950, - Variant54951, - Variant54952, - Variant54953, - Variant54954, - Variant54955, - Variant54956, - Variant54957, - Variant54958, - Variant54959, - Variant54960, - Variant54961, - Variant54962, - Variant54963, - Variant54964, - Variant54965, - Variant54966, - Variant54967, - Variant54968, - Variant54969, - Variant54970, - Variant54971, - Variant54972, - Variant54973, - Variant54974, - Variant54975, - Variant54976, - Variant54977, - Variant54978, - Variant54979, - Variant54980, - Variant54981, - Variant54982, - Variant54983, - Variant54984, - Variant54985, - Variant54986, - Variant54987, - Variant54988, - Variant54989, - Variant54990, - Variant54991, - Variant54992, - Variant54993, - Variant54994, - Variant54995, - Variant54996, - Variant54997, - Variant54998, - Variant54999, - Variant55000, - Variant55001, - Variant55002, - Variant55003, - Variant55004, - Variant55005, - Variant55006, - Variant55007, - Variant55008, - Variant55009, - Variant55010, - Variant55011, - Variant55012, - Variant55013, - Variant55014, - Variant55015, - Variant55016, - Variant55017, - Variant55018, - Variant55019, - Variant55020, - Variant55021, - Variant55022, - Variant55023, - Variant55024, - Variant55025, - Variant55026, - Variant55027, - Variant55028, - Variant55029, - Variant55030, - Variant55031, - Variant55032, - Variant55033, - Variant55034, - Variant55035, - Variant55036, - Variant55037, - Variant55038, - Variant55039, - Variant55040, - Variant55041, - Variant55042, - Variant55043, - Variant55044, - Variant55045, - Variant55046, - Variant55047, - Variant55048, - Variant55049, - Variant55050, - Variant55051, - Variant55052, - Variant55053, - Variant55054, - Variant55055, - Variant55056, - Variant55057, - Variant55058, - Variant55059, - Variant55060, - Variant55061, - Variant55062, - Variant55063, - Variant55064, - Variant55065, - Variant55066, - Variant55067, - Variant55068, - Variant55069, - Variant55070, - Variant55071, - Variant55072, - Variant55073, - Variant55074, - Variant55075, - Variant55076, - Variant55077, - Variant55078, - Variant55079, - Variant55080, - Variant55081, - Variant55082, - Variant55083, - Variant55084, - Variant55085, - Variant55086, - Variant55087, - Variant55088, - Variant55089, - Variant55090, - Variant55091, - Variant55092, - Variant55093, - Variant55094, - Variant55095, - Variant55096, - Variant55097, - Variant55098, - Variant55099, - Variant55100, - Variant55101, - Variant55102, - Variant55103, - Variant55104, - Variant55105, - Variant55106, - Variant55107, - Variant55108, - Variant55109, - Variant55110, - Variant55111, - Variant55112, - Variant55113, - Variant55114, - Variant55115, - Variant55116, - Variant55117, - Variant55118, - Variant55119, - Variant55120, - Variant55121, - Variant55122, - Variant55123, - Variant55124, - Variant55125, - Variant55126, - Variant55127, - Variant55128, - Variant55129, - Variant55130, - Variant55131, - Variant55132, - Variant55133, - Variant55134, - Variant55135, - Variant55136, - Variant55137, - Variant55138, - Variant55139, - Variant55140, - Variant55141, - Variant55142, - Variant55143, - Variant55144, - Variant55145, - Variant55146, - Variant55147, - Variant55148, - Variant55149, - Variant55150, - Variant55151, - Variant55152, - Variant55153, - Variant55154, - Variant55155, - Variant55156, - Variant55157, - Variant55158, - Variant55159, - Variant55160, - Variant55161, - Variant55162, - Variant55163, - Variant55164, - Variant55165, - Variant55166, - Variant55167, - Variant55168, - Variant55169, - Variant55170, - Variant55171, - Variant55172, - Variant55173, - Variant55174, - Variant55175, - Variant55176, - Variant55177, - Variant55178, - Variant55179, - Variant55180, - Variant55181, - Variant55182, - Variant55183, - Variant55184, - Variant55185, - Variant55186, - Variant55187, - Variant55188, - Variant55189, - Variant55190, - Variant55191, - Variant55192, - Variant55193, - Variant55194, - Variant55195, - Variant55196, - Variant55197, - Variant55198, - Variant55199, - Variant55200, - Variant55201, - Variant55202, - Variant55203, - Variant55204, - Variant55205, - Variant55206, - Variant55207, - Variant55208, - Variant55209, - Variant55210, - Variant55211, - Variant55212, - Variant55213, - Variant55214, - Variant55215, - Variant55216, - Variant55217, - Variant55218, - Variant55219, - Variant55220, - Variant55221, - Variant55222, - Variant55223, - Variant55224, - Variant55225, - Variant55226, - Variant55227, - Variant55228, - Variant55229, - Variant55230, - Variant55231, - Variant55232, - Variant55233, - Variant55234, - Variant55235, - Variant55236, - Variant55237, - Variant55238, - Variant55239, - Variant55240, - Variant55241, - Variant55242, - Variant55243, - Variant55244, - Variant55245, - Variant55246, - Variant55247, - Variant55248, - Variant55249, - Variant55250, - Variant55251, - Variant55252, - Variant55253, - Variant55254, - Variant55255, - Variant55256, - Variant55257, - Variant55258, - Variant55259, - Variant55260, - Variant55261, - Variant55262, - Variant55263, - Variant55264, - Variant55265, - Variant55266, - Variant55267, - Variant55268, - Variant55269, - Variant55270, - Variant55271, - Variant55272, - Variant55273, - Variant55274, - Variant55275, - Variant55276, - Variant55277, - Variant55278, - Variant55279, - Variant55280, - Variant55281, - Variant55282, - Variant55283, - Variant55284, - Variant55285, - Variant55286, - Variant55287, - Variant55288, - Variant55289, - Variant55290, - Variant55291, - Variant55292, - Variant55293, - Variant55294, - Variant55295, - Variant55296, - Variant55297, - Variant55298, - Variant55299, - Variant55300, - Variant55301, - Variant55302, - Variant55303, - Variant55304, - Variant55305, - Variant55306, - Variant55307, - Variant55308, - Variant55309, - Variant55310, - Variant55311, - Variant55312, - Variant55313, - Variant55314, - Variant55315, - Variant55316, - Variant55317, - Variant55318, - Variant55319, - Variant55320, - Variant55321, - Variant55322, - Variant55323, - Variant55324, - Variant55325, - Variant55326, - Variant55327, - Variant55328, - Variant55329, - Variant55330, - Variant55331, - Variant55332, - Variant55333, - Variant55334, - Variant55335, - Variant55336, - Variant55337, - Variant55338, - Variant55339, - Variant55340, - Variant55341, - Variant55342, - Variant55343, - Variant55344, - Variant55345, - Variant55346, - Variant55347, - Variant55348, - Variant55349, - Variant55350, - Variant55351, - Variant55352, - Variant55353, - Variant55354, - Variant55355, - Variant55356, - Variant55357, - Variant55358, - Variant55359, - Variant55360, - Variant55361, - Variant55362, - Variant55363, - Variant55364, - Variant55365, - Variant55366, - Variant55367, - Variant55368, - Variant55369, - Variant55370, - Variant55371, - Variant55372, - Variant55373, - Variant55374, - Variant55375, - Variant55376, - Variant55377, - Variant55378, - Variant55379, - Variant55380, - Variant55381, - Variant55382, - Variant55383, - Variant55384, - Variant55385, - Variant55386, - Variant55387, - Variant55388, - Variant55389, - Variant55390, - Variant55391, - Variant55392, - Variant55393, - Variant55394, - Variant55395, - Variant55396, - Variant55397, - Variant55398, - Variant55399, - Variant55400, - Variant55401, - Variant55402, - Variant55403, - Variant55404, - Variant55405, - Variant55406, - Variant55407, - Variant55408, - Variant55409, - Variant55410, - Variant55411, - Variant55412, - Variant55413, - Variant55414, - Variant55415, - Variant55416, - Variant55417, - Variant55418, - Variant55419, - Variant55420, - Variant55421, - Variant55422, - Variant55423, - Variant55424, - Variant55425, - Variant55426, - Variant55427, - Variant55428, - Variant55429, - Variant55430, - Variant55431, - Variant55432, - Variant55433, - Variant55434, - Variant55435, - Variant55436, - Variant55437, - Variant55438, - Variant55439, - Variant55440, - Variant55441, - Variant55442, - Variant55443, - Variant55444, - Variant55445, - Variant55446, - Variant55447, - Variant55448, - Variant55449, - Variant55450, - Variant55451, - Variant55452, - Variant55453, - Variant55454, - Variant55455, - Variant55456, - Variant55457, - Variant55458, - Variant55459, - Variant55460, - Variant55461, - Variant55462, - Variant55463, - Variant55464, - Variant55465, - Variant55466, - Variant55467, - Variant55468, - Variant55469, - Variant55470, - Variant55471, - Variant55472, - Variant55473, - Variant55474, - Variant55475, - Variant55476, - Variant55477, - Variant55478, - Variant55479, - Variant55480, - Variant55481, - Variant55482, - Variant55483, - Variant55484, - Variant55485, - Variant55486, - Variant55487, - Variant55488, - Variant55489, - Variant55490, - Variant55491, - Variant55492, - Variant55493, - Variant55494, - Variant55495, - Variant55496, - Variant55497, - Variant55498, - Variant55499, - Variant55500, - Variant55501, - Variant55502, - Variant55503, - Variant55504, - Variant55505, - Variant55506, - Variant55507, - Variant55508, - Variant55509, - Variant55510, - Variant55511, - Variant55512, - Variant55513, - Variant55514, - Variant55515, - Variant55516, - Variant55517, - Variant55518, - Variant55519, - Variant55520, - Variant55521, - Variant55522, - Variant55523, - Variant55524, - Variant55525, - Variant55526, - Variant55527, - Variant55528, - Variant55529, - Variant55530, - Variant55531, - Variant55532, - Variant55533, - Variant55534, - Variant55535, - Variant55536, - Variant55537, - Variant55538, - Variant55539, - Variant55540, - Variant55541, - Variant55542, - Variant55543, - Variant55544, - Variant55545, - Variant55546, - Variant55547, - Variant55548, - Variant55549, - Variant55550, - Variant55551, - Variant55552, - Variant55553, - Variant55554, - Variant55555, - Variant55556, - Variant55557, - Variant55558, - Variant55559, - Variant55560, - Variant55561, - Variant55562, - Variant55563, - Variant55564, - Variant55565, - Variant55566, - Variant55567, - Variant55568, - Variant55569, - Variant55570, - Variant55571, - Variant55572, - Variant55573, - Variant55574, - Variant55575, - Variant55576, - Variant55577, - Variant55578, - Variant55579, - Variant55580, - Variant55581, - Variant55582, - Variant55583, - Variant55584, - Variant55585, - Variant55586, - Variant55587, - Variant55588, - Variant55589, - Variant55590, - Variant55591, - Variant55592, - Variant55593, - Variant55594, - Variant55595, - Variant55596, - Variant55597, - Variant55598, - Variant55599, - Variant55600, - Variant55601, - Variant55602, - Variant55603, - Variant55604, - Variant55605, - Variant55606, - Variant55607, - Variant55608, - Variant55609, - Variant55610, - Variant55611, - Variant55612, - Variant55613, - Variant55614, - Variant55615, - Variant55616, - Variant55617, - Variant55618, - Variant55619, - Variant55620, - Variant55621, - Variant55622, - Variant55623, - Variant55624, - Variant55625, - Variant55626, - Variant55627, - Variant55628, - Variant55629, - Variant55630, - Variant55631, - Variant55632, - Variant55633, - Variant55634, - Variant55635, - Variant55636, - Variant55637, - Variant55638, - Variant55639, - Variant55640, - Variant55641, - Variant55642, - Variant55643, - Variant55644, - Variant55645, - Variant55646, - Variant55647, - Variant55648, - Variant55649, - Variant55650, - Variant55651, - Variant55652, - Variant55653, - Variant55654, - Variant55655, - Variant55656, - Variant55657, - Variant55658, - Variant55659, - Variant55660, - Variant55661, - Variant55662, - Variant55663, - Variant55664, - Variant55665, - Variant55666, - Variant55667, - Variant55668, - Variant55669, - Variant55670, - Variant55671, - Variant55672, - Variant55673, - Variant55674, - Variant55675, - Variant55676, - Variant55677, - Variant55678, - Variant55679, - Variant55680, - Variant55681, - Variant55682, - Variant55683, - Variant55684, - Variant55685, - Variant55686, - Variant55687, - Variant55688, - Variant55689, - Variant55690, - Variant55691, - Variant55692, - Variant55693, - Variant55694, - Variant55695, - Variant55696, - Variant55697, - Variant55698, - Variant55699, - Variant55700, - Variant55701, - Variant55702, - Variant55703, - Variant55704, - Variant55705, - Variant55706, - Variant55707, - Variant55708, - Variant55709, - Variant55710, - Variant55711, - Variant55712, - Variant55713, - Variant55714, - Variant55715, - Variant55716, - Variant55717, - Variant55718, - Variant55719, - Variant55720, - Variant55721, - Variant55722, - Variant55723, - Variant55724, - Variant55725, - Variant55726, - Variant55727, - Variant55728, - Variant55729, - Variant55730, - Variant55731, - Variant55732, - Variant55733, - Variant55734, - Variant55735, - Variant55736, - Variant55737, - Variant55738, - Variant55739, - Variant55740, - Variant55741, - Variant55742, - Variant55743, - Variant55744, - Variant55745, - Variant55746, - Variant55747, - Variant55748, - Variant55749, - Variant55750, - Variant55751, - Variant55752, - Variant55753, - Variant55754, - Variant55755, - Variant55756, - Variant55757, - Variant55758, - Variant55759, - Variant55760, - Variant55761, - Variant55762, - Variant55763, - Variant55764, - Variant55765, - Variant55766, - Variant55767, - Variant55768, - Variant55769, - Variant55770, - Variant55771, - Variant55772, - Variant55773, - Variant55774, - Variant55775, - Variant55776, - Variant55777, - Variant55778, - Variant55779, - Variant55780, - Variant55781, - Variant55782, - Variant55783, - Variant55784, - Variant55785, - Variant55786, - Variant55787, - Variant55788, - Variant55789, - Variant55790, - Variant55791, - Variant55792, - Variant55793, - Variant55794, - Variant55795, - Variant55796, - Variant55797, - Variant55798, - Variant55799, - Variant55800, - Variant55801, - Variant55802, - Variant55803, - Variant55804, - Variant55805, - Variant55806, - Variant55807, - Variant55808, - Variant55809, - Variant55810, - Variant55811, - Variant55812, - Variant55813, - Variant55814, - Variant55815, - Variant55816, - Variant55817, - Variant55818, - Variant55819, - Variant55820, - Variant55821, - Variant55822, - Variant55823, - Variant55824, - Variant55825, - Variant55826, - Variant55827, - Variant55828, - Variant55829, - Variant55830, - Variant55831, - Variant55832, - Variant55833, - Variant55834, - Variant55835, - Variant55836, - Variant55837, - Variant55838, - Variant55839, - Variant55840, - Variant55841, - Variant55842, - Variant55843, - Variant55844, - Variant55845, - Variant55846, - Variant55847, - Variant55848, - Variant55849, - Variant55850, - Variant55851, - Variant55852, - Variant55853, - Variant55854, - Variant55855, - Variant55856, - Variant55857, - Variant55858, - Variant55859, - Variant55860, - Variant55861, - Variant55862, - Variant55863, - Variant55864, - Variant55865, - Variant55866, - Variant55867, - Variant55868, - Variant55869, - Variant55870, - Variant55871, - Variant55872, - Variant55873, - Variant55874, - Variant55875, - Variant55876, - Variant55877, - Variant55878, - Variant55879, - Variant55880, - Variant55881, - Variant55882, - Variant55883, - Variant55884, - Variant55885, - Variant55886, - Variant55887, - Variant55888, - Variant55889, - Variant55890, - Variant55891, - Variant55892, - Variant55893, - Variant55894, - Variant55895, - Variant55896, - Variant55897, - Variant55898, - Variant55899, - Variant55900, - Variant55901, - Variant55902, - Variant55903, - Variant55904, - Variant55905, - Variant55906, - Variant55907, - Variant55908, - Variant55909, - Variant55910, - Variant55911, - Variant55912, - Variant55913, - Variant55914, - Variant55915, - Variant55916, - Variant55917, - Variant55918, - Variant55919, - Variant55920, - Variant55921, - Variant55922, - Variant55923, - Variant55924, - Variant55925, - Variant55926, - Variant55927, - Variant55928, - Variant55929, - Variant55930, - Variant55931, - Variant55932, - Variant55933, - Variant55934, - Variant55935, - Variant55936, - Variant55937, - Variant55938, - Variant55939, - Variant55940, - Variant55941, - Variant55942, - Variant55943, - Variant55944, - Variant55945, - Variant55946, - Variant55947, - Variant55948, - Variant55949, - Variant55950, - Variant55951, - Variant55952, - Variant55953, - Variant55954, - Variant55955, - Variant55956, - Variant55957, - Variant55958, - Variant55959, - Variant55960, - Variant55961, - Variant55962, - Variant55963, - Variant55964, - Variant55965, - Variant55966, - Variant55967, - Variant55968, - Variant55969, - Variant55970, - Variant55971, - Variant55972, - Variant55973, - Variant55974, - Variant55975, - Variant55976, - Variant55977, - Variant55978, - Variant55979, - Variant55980, - Variant55981, - Variant55982, - Variant55983, - Variant55984, - Variant55985, - Variant55986, - Variant55987, - Variant55988, - Variant55989, - Variant55990, - Variant55991, - Variant55992, - Variant55993, - Variant55994, - Variant55995, - Variant55996, - Variant55997, - Variant55998, - Variant55999, - Variant56000, - Variant56001, - Variant56002, - Variant56003, - Variant56004, - Variant56005, - Variant56006, - Variant56007, - Variant56008, - Variant56009, - Variant56010, - Variant56011, - Variant56012, - Variant56013, - Variant56014, - Variant56015, - Variant56016, - Variant56017, - Variant56018, - Variant56019, - Variant56020, - Variant56021, - Variant56022, - Variant56023, - Variant56024, - Variant56025, - Variant56026, - Variant56027, - Variant56028, - Variant56029, - Variant56030, - Variant56031, - Variant56032, - Variant56033, - Variant56034, - Variant56035, - Variant56036, - Variant56037, - Variant56038, - Variant56039, - Variant56040, - Variant56041, - Variant56042, - Variant56043, - Variant56044, - Variant56045, - Variant56046, - Variant56047, - Variant56048, - Variant56049, - Variant56050, - Variant56051, - Variant56052, - Variant56053, - Variant56054, - Variant56055, - Variant56056, - Variant56057, - Variant56058, - Variant56059, - Variant56060, - Variant56061, - Variant56062, - Variant56063, - Variant56064, - Variant56065, - Variant56066, - Variant56067, - Variant56068, - Variant56069, - Variant56070, - Variant56071, - Variant56072, - Variant56073, - Variant56074, - Variant56075, - Variant56076, - Variant56077, - Variant56078, - Variant56079, - Variant56080, - Variant56081, - Variant56082, - Variant56083, - Variant56084, - Variant56085, - Variant56086, - Variant56087, - Variant56088, - Variant56089, - Variant56090, - Variant56091, - Variant56092, - Variant56093, - Variant56094, - Variant56095, - Variant56096, - Variant56097, - Variant56098, - Variant56099, - Variant56100, - Variant56101, - Variant56102, - Variant56103, - Variant56104, - Variant56105, - Variant56106, - Variant56107, - Variant56108, - Variant56109, - Variant56110, - Variant56111, - Variant56112, - Variant56113, - Variant56114, - Variant56115, - Variant56116, - Variant56117, - Variant56118, - Variant56119, - Variant56120, - Variant56121, - Variant56122, - Variant56123, - Variant56124, - Variant56125, - Variant56126, - Variant56127, - Variant56128, - Variant56129, - Variant56130, - Variant56131, - Variant56132, - Variant56133, - Variant56134, - Variant56135, - Variant56136, - Variant56137, - Variant56138, - Variant56139, - Variant56140, - Variant56141, - Variant56142, - Variant56143, - Variant56144, - Variant56145, - Variant56146, - Variant56147, - Variant56148, - Variant56149, - Variant56150, - Variant56151, - Variant56152, - Variant56153, - Variant56154, - Variant56155, - Variant56156, - Variant56157, - Variant56158, - Variant56159, - Variant56160, - Variant56161, - Variant56162, - Variant56163, - Variant56164, - Variant56165, - Variant56166, - Variant56167, - Variant56168, - Variant56169, - Variant56170, - Variant56171, - Variant56172, - Variant56173, - Variant56174, - Variant56175, - Variant56176, - Variant56177, - Variant56178, - Variant56179, - Variant56180, - Variant56181, - Variant56182, - Variant56183, - Variant56184, - Variant56185, - Variant56186, - Variant56187, - Variant56188, - Variant56189, - Variant56190, - Variant56191, - Variant56192, - Variant56193, - Variant56194, - Variant56195, - Variant56196, - Variant56197, - Variant56198, - Variant56199, - Variant56200, - Variant56201, - Variant56202, - Variant56203, - Variant56204, - Variant56205, - Variant56206, - Variant56207, - Variant56208, - Variant56209, - Variant56210, - Variant56211, - Variant56212, - Variant56213, - Variant56214, - Variant56215, - Variant56216, - Variant56217, - Variant56218, - Variant56219, - Variant56220, - Variant56221, - Variant56222, - Variant56223, - Variant56224, - Variant56225, - Variant56226, - Variant56227, - Variant56228, - Variant56229, - Variant56230, - Variant56231, - Variant56232, - Variant56233, - Variant56234, - Variant56235, - Variant56236, - Variant56237, - Variant56238, - Variant56239, - Variant56240, - Variant56241, - Variant56242, - Variant56243, - Variant56244, - Variant56245, - Variant56246, - Variant56247, - Variant56248, - Variant56249, - Variant56250, - Variant56251, - Variant56252, - Variant56253, - Variant56254, - Variant56255, - Variant56256, - Variant56257, - Variant56258, - Variant56259, - Variant56260, - Variant56261, - Variant56262, - Variant56263, - Variant56264, - Variant56265, - Variant56266, - Variant56267, - Variant56268, - Variant56269, - Variant56270, - Variant56271, - Variant56272, - Variant56273, - Variant56274, - Variant56275, - Variant56276, - Variant56277, - Variant56278, - Variant56279, - Variant56280, - Variant56281, - Variant56282, - Variant56283, - Variant56284, - Variant56285, - Variant56286, - Variant56287, - Variant56288, - Variant56289, - Variant56290, - Variant56291, - Variant56292, - Variant56293, - Variant56294, - Variant56295, - Variant56296, - Variant56297, - Variant56298, - Variant56299, - Variant56300, - Variant56301, - Variant56302, - Variant56303, - Variant56304, - Variant56305, - Variant56306, - Variant56307, - Variant56308, - Variant56309, - Variant56310, - Variant56311, - Variant56312, - Variant56313, - Variant56314, - Variant56315, - Variant56316, - Variant56317, - Variant56318, - Variant56319, - Variant56320, - Variant56321, - Variant56322, - Variant56323, - Variant56324, - Variant56325, - Variant56326, - Variant56327, - Variant56328, - Variant56329, - Variant56330, - Variant56331, - Variant56332, - Variant56333, - Variant56334, - Variant56335, - Variant56336, - Variant56337, - Variant56338, - Variant56339, - Variant56340, - Variant56341, - Variant56342, - Variant56343, - Variant56344, - Variant56345, - Variant56346, - Variant56347, - Variant56348, - Variant56349, - Variant56350, - Variant56351, - Variant56352, - Variant56353, - Variant56354, - Variant56355, - Variant56356, - Variant56357, - Variant56358, - Variant56359, - Variant56360, - Variant56361, - Variant56362, - Variant56363, - Variant56364, - Variant56365, - Variant56366, - Variant56367, - Variant56368, - Variant56369, - Variant56370, - Variant56371, - Variant56372, - Variant56373, - Variant56374, - Variant56375, - Variant56376, - Variant56377, - Variant56378, - Variant56379, - Variant56380, - Variant56381, - Variant56382, - Variant56383, - Variant56384, - Variant56385, - Variant56386, - Variant56387, - Variant56388, - Variant56389, - Variant56390, - Variant56391, - Variant56392, - Variant56393, - Variant56394, - Variant56395, - Variant56396, - Variant56397, - Variant56398, - Variant56399, - Variant56400, - Variant56401, - Variant56402, - Variant56403, - Variant56404, - Variant56405, - Variant56406, - Variant56407, - Variant56408, - Variant56409, - Variant56410, - Variant56411, - Variant56412, - Variant56413, - Variant56414, - Variant56415, - Variant56416, - Variant56417, - Variant56418, - Variant56419, - Variant56420, - Variant56421, - Variant56422, - Variant56423, - Variant56424, - Variant56425, - Variant56426, - Variant56427, - Variant56428, - Variant56429, - Variant56430, - Variant56431, - Variant56432, - Variant56433, - Variant56434, - Variant56435, - Variant56436, - Variant56437, - Variant56438, - Variant56439, - Variant56440, - Variant56441, - Variant56442, - Variant56443, - Variant56444, - Variant56445, - Variant56446, - Variant56447, - Variant56448, - Variant56449, - Variant56450, - Variant56451, - Variant56452, - Variant56453, - Variant56454, - Variant56455, - Variant56456, - Variant56457, - Variant56458, - Variant56459, - Variant56460, - Variant56461, - Variant56462, - Variant56463, - Variant56464, - Variant56465, - Variant56466, - Variant56467, - Variant56468, - Variant56469, - Variant56470, - Variant56471, - Variant56472, - Variant56473, - Variant56474, - Variant56475, - Variant56476, - Variant56477, - Variant56478, - Variant56479, - Variant56480, - Variant56481, - Variant56482, - Variant56483, - Variant56484, - Variant56485, - Variant56486, - Variant56487, - Variant56488, - Variant56489, - Variant56490, - Variant56491, - Variant56492, - Variant56493, - Variant56494, - Variant56495, - Variant56496, - Variant56497, - Variant56498, - Variant56499, - Variant56500, - Variant56501, - Variant56502, - Variant56503, - Variant56504, - Variant56505, - Variant56506, - Variant56507, - Variant56508, - Variant56509, - Variant56510, - Variant56511, - Variant56512, - Variant56513, - Variant56514, - Variant56515, - Variant56516, - Variant56517, - Variant56518, - Variant56519, - Variant56520, - Variant56521, - Variant56522, - Variant56523, - Variant56524, - Variant56525, - Variant56526, - Variant56527, - Variant56528, - Variant56529, - Variant56530, - Variant56531, - Variant56532, - Variant56533, - Variant56534, - Variant56535, - Variant56536, - Variant56537, - Variant56538, - Variant56539, - Variant56540, - Variant56541, - Variant56542, - Variant56543, - Variant56544, - Variant56545, - Variant56546, - Variant56547, - Variant56548, - Variant56549, - Variant56550, - Variant56551, - Variant56552, - Variant56553, - Variant56554, - Variant56555, - Variant56556, - Variant56557, - Variant56558, - Variant56559, - Variant56560, - Variant56561, - Variant56562, - Variant56563, - Variant56564, - Variant56565, - Variant56566, - Variant56567, - Variant56568, - Variant56569, - Variant56570, - Variant56571, - Variant56572, - Variant56573, - Variant56574, - Variant56575, - Variant56576, - Variant56577, - Variant56578, - Variant56579, - Variant56580, - Variant56581, - Variant56582, - Variant56583, - Variant56584, - Variant56585, - Variant56586, - Variant56587, - Variant56588, - Variant56589, - Variant56590, - Variant56591, - Variant56592, - Variant56593, - Variant56594, - Variant56595, - Variant56596, - Variant56597, - Variant56598, - Variant56599, - Variant56600, - Variant56601, - Variant56602, - Variant56603, - Variant56604, - Variant56605, - Variant56606, - Variant56607, - Variant56608, - Variant56609, - Variant56610, - Variant56611, - Variant56612, - Variant56613, - Variant56614, - Variant56615, - Variant56616, - Variant56617, - Variant56618, - Variant56619, - Variant56620, - Variant56621, - Variant56622, - Variant56623, - Variant56624, - Variant56625, - Variant56626, - Variant56627, - Variant56628, - Variant56629, - Variant56630, - Variant56631, - Variant56632, - Variant56633, - Variant56634, - Variant56635, - Variant56636, - Variant56637, - Variant56638, - Variant56639, - Variant56640, - Variant56641, - Variant56642, - Variant56643, - Variant56644, - Variant56645, - Variant56646, - Variant56647, - Variant56648, - Variant56649, - Variant56650, - Variant56651, - Variant56652, - Variant56653, - Variant56654, - Variant56655, - Variant56656, - Variant56657, - Variant56658, - Variant56659, - Variant56660, - Variant56661, - Variant56662, - Variant56663, - Variant56664, - Variant56665, - Variant56666, - Variant56667, - Variant56668, - Variant56669, - Variant56670, - Variant56671, - Variant56672, - Variant56673, - Variant56674, - Variant56675, - Variant56676, - Variant56677, - Variant56678, - Variant56679, - Variant56680, - Variant56681, - Variant56682, - Variant56683, - Variant56684, - Variant56685, - Variant56686, - Variant56687, - Variant56688, - Variant56689, - Variant56690, - Variant56691, - Variant56692, - Variant56693, - Variant56694, - Variant56695, - Variant56696, - Variant56697, - Variant56698, - Variant56699, - Variant56700, - Variant56701, - Variant56702, - Variant56703, - Variant56704, - Variant56705, - Variant56706, - Variant56707, - Variant56708, - Variant56709, - Variant56710, - Variant56711, - Variant56712, - Variant56713, - Variant56714, - Variant56715, - Variant56716, - Variant56717, - Variant56718, - Variant56719, - Variant56720, - Variant56721, - Variant56722, - Variant56723, - Variant56724, - Variant56725, - Variant56726, - Variant56727, - Variant56728, - Variant56729, - Variant56730, - Variant56731, - Variant56732, - Variant56733, - Variant56734, - Variant56735, - Variant56736, - Variant56737, - Variant56738, - Variant56739, - Variant56740, - Variant56741, - Variant56742, - Variant56743, - Variant56744, - Variant56745, - Variant56746, - Variant56747, - Variant56748, - Variant56749, - Variant56750, - Variant56751, - Variant56752, - Variant56753, - Variant56754, - Variant56755, - Variant56756, - Variant56757, - Variant56758, - Variant56759, - Variant56760, - Variant56761, - Variant56762, - Variant56763, - Variant56764, - Variant56765, - Variant56766, - Variant56767, - Variant56768, - Variant56769, - Variant56770, - Variant56771, - Variant56772, - Variant56773, - Variant56774, - Variant56775, - Variant56776, - Variant56777, - Variant56778, - Variant56779, - Variant56780, - Variant56781, - Variant56782, - Variant56783, - Variant56784, - Variant56785, - Variant56786, - Variant56787, - Variant56788, - Variant56789, - Variant56790, - Variant56791, - Variant56792, - Variant56793, - Variant56794, - Variant56795, - Variant56796, - Variant56797, - Variant56798, - Variant56799, - Variant56800, - Variant56801, - Variant56802, - Variant56803, - Variant56804, - Variant56805, - Variant56806, - Variant56807, - Variant56808, - Variant56809, - Variant56810, - Variant56811, - Variant56812, - Variant56813, - Variant56814, - Variant56815, - Variant56816, - Variant56817, - Variant56818, - Variant56819, - Variant56820, - Variant56821, - Variant56822, - Variant56823, - Variant56824, - Variant56825, - Variant56826, - Variant56827, - Variant56828, - Variant56829, - Variant56830, - Variant56831, - Variant56832, - Variant56833, - Variant56834, - Variant56835, - Variant56836, - Variant56837, - Variant56838, - Variant56839, - Variant56840, - Variant56841, - Variant56842, - Variant56843, - Variant56844, - Variant56845, - Variant56846, - Variant56847, - Variant56848, - Variant56849, - Variant56850, - Variant56851, - Variant56852, - Variant56853, - Variant56854, - Variant56855, - Variant56856, - Variant56857, - Variant56858, - Variant56859, - Variant56860, - Variant56861, - Variant56862, - Variant56863, - Variant56864, - Variant56865, - Variant56866, - Variant56867, - Variant56868, - Variant56869, - Variant56870, - Variant56871, - Variant56872, - Variant56873, - Variant56874, - Variant56875, - Variant56876, - Variant56877, - Variant56878, - Variant56879, - Variant56880, - Variant56881, - Variant56882, - Variant56883, - Variant56884, - Variant56885, - Variant56886, - Variant56887, - Variant56888, - Variant56889, - Variant56890, - Variant56891, - Variant56892, - Variant56893, - Variant56894, - Variant56895, - Variant56896, - Variant56897, - Variant56898, - Variant56899, - Variant56900, - Variant56901, - Variant56902, - Variant56903, - Variant56904, - Variant56905, - Variant56906, - Variant56907, - Variant56908, - Variant56909, - Variant56910, - Variant56911, - Variant56912, - Variant56913, - Variant56914, - Variant56915, - Variant56916, - Variant56917, - Variant56918, - Variant56919, - Variant56920, - Variant56921, - Variant56922, - Variant56923, - Variant56924, - Variant56925, - Variant56926, - Variant56927, - Variant56928, - Variant56929, - Variant56930, - Variant56931, - Variant56932, - Variant56933, - Variant56934, - Variant56935, - Variant56936, - Variant56937, - Variant56938, - Variant56939, - Variant56940, - Variant56941, - Variant56942, - Variant56943, - Variant56944, - Variant56945, - Variant56946, - Variant56947, - Variant56948, - Variant56949, - Variant56950, - Variant56951, - Variant56952, - Variant56953, - Variant56954, - Variant56955, - Variant56956, - Variant56957, - Variant56958, - Variant56959, - Variant56960, - Variant56961, - Variant56962, - Variant56963, - Variant56964, - Variant56965, - Variant56966, - Variant56967, - Variant56968, - Variant56969, - Variant56970, - Variant56971, - Variant56972, - Variant56973, - Variant56974, - Variant56975, - Variant56976, - Variant56977, - Variant56978, - Variant56979, - Variant56980, - Variant56981, - Variant56982, - Variant56983, - Variant56984, - Variant56985, - Variant56986, - Variant56987, - Variant56988, - Variant56989, - Variant56990, - Variant56991, - Variant56992, - Variant56993, - Variant56994, - Variant56995, - Variant56996, - Variant56997, - Variant56998, - Variant56999, - Variant57000, - Variant57001, - Variant57002, - Variant57003, - Variant57004, - Variant57005, - Variant57006, - Variant57007, - Variant57008, - Variant57009, - Variant57010, - Variant57011, - Variant57012, - Variant57013, - Variant57014, - Variant57015, - Variant57016, - Variant57017, - Variant57018, - Variant57019, - Variant57020, - Variant57021, - Variant57022, - Variant57023, - Variant57024, - Variant57025, - Variant57026, - Variant57027, - Variant57028, - Variant57029, - Variant57030, - Variant57031, - Variant57032, - Variant57033, - Variant57034, - Variant57035, - Variant57036, - Variant57037, - Variant57038, - Variant57039, - Variant57040, - Variant57041, - Variant57042, - Variant57043, - Variant57044, - Variant57045, - Variant57046, - Variant57047, - Variant57048, - Variant57049, - Variant57050, - Variant57051, - Variant57052, - Variant57053, - Variant57054, - Variant57055, - Variant57056, - Variant57057, - Variant57058, - Variant57059, - Variant57060, - Variant57061, - Variant57062, - Variant57063, - Variant57064, - Variant57065, - Variant57066, - Variant57067, - Variant57068, - Variant57069, - Variant57070, - Variant57071, - Variant57072, - Variant57073, - Variant57074, - Variant57075, - Variant57076, - Variant57077, - Variant57078, - Variant57079, - Variant57080, - Variant57081, - Variant57082, - Variant57083, - Variant57084, - Variant57085, - Variant57086, - Variant57087, - Variant57088, - Variant57089, - Variant57090, - Variant57091, - Variant57092, - Variant57093, - Variant57094, - Variant57095, - Variant57096, - Variant57097, - Variant57098, - Variant57099, - Variant57100, - Variant57101, - Variant57102, - Variant57103, - Variant57104, - Variant57105, - Variant57106, - Variant57107, - Variant57108, - Variant57109, - Variant57110, - Variant57111, - Variant57112, - Variant57113, - Variant57114, - Variant57115, - Variant57116, - Variant57117, - Variant57118, - Variant57119, - Variant57120, - Variant57121, - Variant57122, - Variant57123, - Variant57124, - Variant57125, - Variant57126, - Variant57127, - Variant57128, - Variant57129, - Variant57130, - Variant57131, - Variant57132, - Variant57133, - Variant57134, - Variant57135, - Variant57136, - Variant57137, - Variant57138, - Variant57139, - Variant57140, - Variant57141, - Variant57142, - Variant57143, - Variant57144, - Variant57145, - Variant57146, - Variant57147, - Variant57148, - Variant57149, - Variant57150, - Variant57151, - Variant57152, - Variant57153, - Variant57154, - Variant57155, - Variant57156, - Variant57157, - Variant57158, - Variant57159, - Variant57160, - Variant57161, - Variant57162, - Variant57163, - Variant57164, - Variant57165, - Variant57166, - Variant57167, - Variant57168, - Variant57169, - Variant57170, - Variant57171, - Variant57172, - Variant57173, - Variant57174, - Variant57175, - Variant57176, - Variant57177, - Variant57178, - Variant57179, - Variant57180, - Variant57181, - Variant57182, - Variant57183, - Variant57184, - Variant57185, - Variant57186, - Variant57187, - Variant57188, - Variant57189, - Variant57190, - Variant57191, - Variant57192, - Variant57193, - Variant57194, - Variant57195, - Variant57196, - Variant57197, - Variant57198, - Variant57199, - Variant57200, - Variant57201, - Variant57202, - Variant57203, - Variant57204, - Variant57205, - Variant57206, - Variant57207, - Variant57208, - Variant57209, - Variant57210, - Variant57211, - Variant57212, - Variant57213, - Variant57214, - Variant57215, - Variant57216, - Variant57217, - Variant57218, - Variant57219, - Variant57220, - Variant57221, - Variant57222, - Variant57223, - Variant57224, - Variant57225, - Variant57226, - Variant57227, - Variant57228, - Variant57229, - Variant57230, - Variant57231, - Variant57232, - Variant57233, - Variant57234, - Variant57235, - Variant57236, - Variant57237, - Variant57238, - Variant57239, - Variant57240, - Variant57241, - Variant57242, - Variant57243, - Variant57244, - Variant57245, - Variant57246, - Variant57247, - Variant57248, - Variant57249, - Variant57250, - Variant57251, - Variant57252, - Variant57253, - Variant57254, - Variant57255, - Variant57256, - Variant57257, - Variant57258, - Variant57259, - Variant57260, - Variant57261, - Variant57262, - Variant57263, - Variant57264, - Variant57265, - Variant57266, - Variant57267, - Variant57268, - Variant57269, - Variant57270, - Variant57271, - Variant57272, - Variant57273, - Variant57274, - Variant57275, - Variant57276, - Variant57277, - Variant57278, - Variant57279, - Variant57280, - Variant57281, - Variant57282, - Variant57283, - Variant57284, - Variant57285, - Variant57286, - Variant57287, - Variant57288, - Variant57289, - Variant57290, - Variant57291, - Variant57292, - Variant57293, - Variant57294, - Variant57295, - Variant57296, - Variant57297, - Variant57298, - Variant57299, - Variant57300, - Variant57301, - Variant57302, - Variant57303, - Variant57304, - Variant57305, - Variant57306, - Variant57307, - Variant57308, - Variant57309, - Variant57310, - Variant57311, - Variant57312, - Variant57313, - Variant57314, - Variant57315, - Variant57316, - Variant57317, - Variant57318, - Variant57319, - Variant57320, - Variant57321, - Variant57322, - Variant57323, - Variant57324, - Variant57325, - Variant57326, - Variant57327, - Variant57328, - Variant57329, - Variant57330, - Variant57331, - Variant57332, - Variant57333, - Variant57334, - Variant57335, - Variant57336, - Variant57337, - Variant57338, - Variant57339, - Variant57340, - Variant57341, - Variant57342, - Variant57343, - Variant57344, - Variant57345, - Variant57346, - Variant57347, - Variant57348, - Variant57349, - Variant57350, - Variant57351, - Variant57352, - Variant57353, - Variant57354, - Variant57355, - Variant57356, - Variant57357, - Variant57358, - Variant57359, - Variant57360, - Variant57361, - Variant57362, - Variant57363, - Variant57364, - Variant57365, - Variant57366, - Variant57367, - Variant57368, - Variant57369, - Variant57370, - Variant57371, - Variant57372, - Variant57373, - Variant57374, - Variant57375, - Variant57376, - Variant57377, - Variant57378, - Variant57379, - Variant57380, - Variant57381, - Variant57382, - Variant57383, - Variant57384, - Variant57385, - Variant57386, - Variant57387, - Variant57388, - Variant57389, - Variant57390, - Variant57391, - Variant57392, - Variant57393, - Variant57394, - Variant57395, - Variant57396, - Variant57397, - Variant57398, - Variant57399, - Variant57400, - Variant57401, - Variant57402, - Variant57403, - Variant57404, - Variant57405, - Variant57406, - Variant57407, - Variant57408, - Variant57409, - Variant57410, - Variant57411, - Variant57412, - Variant57413, - Variant57414, - Variant57415, - Variant57416, - Variant57417, - Variant57418, - Variant57419, - Variant57420, - Variant57421, - Variant57422, - Variant57423, - Variant57424, - Variant57425, - Variant57426, - Variant57427, - Variant57428, - Variant57429, - Variant57430, - Variant57431, - Variant57432, - Variant57433, - Variant57434, - Variant57435, - Variant57436, - Variant57437, - Variant57438, - Variant57439, - Variant57440, - Variant57441, - Variant57442, - Variant57443, - Variant57444, - Variant57445, - Variant57446, - Variant57447, - Variant57448, - Variant57449, - Variant57450, - Variant57451, - Variant57452, - Variant57453, - Variant57454, - Variant57455, - Variant57456, - Variant57457, - Variant57458, - Variant57459, - Variant57460, - Variant57461, - Variant57462, - Variant57463, - Variant57464, - Variant57465, - Variant57466, - Variant57467, - Variant57468, - Variant57469, - Variant57470, - Variant57471, - Variant57472, - Variant57473, - Variant57474, - Variant57475, - Variant57476, - Variant57477, - Variant57478, - Variant57479, - Variant57480, - Variant57481, - Variant57482, - Variant57483, - Variant57484, - Variant57485, - Variant57486, - Variant57487, - Variant57488, - Variant57489, - Variant57490, - Variant57491, - Variant57492, - Variant57493, - Variant57494, - Variant57495, - Variant57496, - Variant57497, - Variant57498, - Variant57499, - Variant57500, - Variant57501, - Variant57502, - Variant57503, - Variant57504, - Variant57505, - Variant57506, - Variant57507, - Variant57508, - Variant57509, - Variant57510, - Variant57511, - Variant57512, - Variant57513, - Variant57514, - Variant57515, - Variant57516, - Variant57517, - Variant57518, - Variant57519, - Variant57520, - Variant57521, - Variant57522, - Variant57523, - Variant57524, - Variant57525, - Variant57526, - Variant57527, - Variant57528, - Variant57529, - Variant57530, - Variant57531, - Variant57532, - Variant57533, - Variant57534, - Variant57535, - Variant57536, - Variant57537, - Variant57538, - Variant57539, - Variant57540, - Variant57541, - Variant57542, - Variant57543, - Variant57544, - Variant57545, - Variant57546, - Variant57547, - Variant57548, - Variant57549, - Variant57550, - Variant57551, - Variant57552, - Variant57553, - Variant57554, - Variant57555, - Variant57556, - Variant57557, - Variant57558, - Variant57559, - Variant57560, - Variant57561, - Variant57562, - Variant57563, - Variant57564, - Variant57565, - Variant57566, - Variant57567, - Variant57568, - Variant57569, - Variant57570, - Variant57571, - Variant57572, - Variant57573, - Variant57574, - Variant57575, - Variant57576, - Variant57577, - Variant57578, - Variant57579, - Variant57580, - Variant57581, - Variant57582, - Variant57583, - Variant57584, - Variant57585, - Variant57586, - Variant57587, - Variant57588, - Variant57589, - Variant57590, - Variant57591, - Variant57592, - Variant57593, - Variant57594, - Variant57595, - Variant57596, - Variant57597, - Variant57598, - Variant57599, - Variant57600, - Variant57601, - Variant57602, - Variant57603, - Variant57604, - Variant57605, - Variant57606, - Variant57607, - Variant57608, - Variant57609, - Variant57610, - Variant57611, - Variant57612, - Variant57613, - Variant57614, - Variant57615, - Variant57616, - Variant57617, - Variant57618, - Variant57619, - Variant57620, - Variant57621, - Variant57622, - Variant57623, - Variant57624, - Variant57625, - Variant57626, - Variant57627, - Variant57628, - Variant57629, - Variant57630, - Variant57631, - Variant57632, - Variant57633, - Variant57634, - Variant57635, - Variant57636, - Variant57637, - Variant57638, - Variant57639, - Variant57640, - Variant57641, - Variant57642, - Variant57643, - Variant57644, - Variant57645, - Variant57646, - Variant57647, - Variant57648, - Variant57649, - Variant57650, - Variant57651, - Variant57652, - Variant57653, - Variant57654, - Variant57655, - Variant57656, - Variant57657, - Variant57658, - Variant57659, - Variant57660, - Variant57661, - Variant57662, - Variant57663, - Variant57664, - Variant57665, - Variant57666, - Variant57667, - Variant57668, - Variant57669, - Variant57670, - Variant57671, - Variant57672, - Variant57673, - Variant57674, - Variant57675, - Variant57676, - Variant57677, - Variant57678, - Variant57679, - Variant57680, - Variant57681, - Variant57682, - Variant57683, - Variant57684, - Variant57685, - Variant57686, - Variant57687, - Variant57688, - Variant57689, - Variant57690, - Variant57691, - Variant57692, - Variant57693, - Variant57694, - Variant57695, - Variant57696, - Variant57697, - Variant57698, - Variant57699, - Variant57700, - Variant57701, - Variant57702, - Variant57703, - Variant57704, - Variant57705, - Variant57706, - Variant57707, - Variant57708, - Variant57709, - Variant57710, - Variant57711, - Variant57712, - Variant57713, - Variant57714, - Variant57715, - Variant57716, - Variant57717, - Variant57718, - Variant57719, - Variant57720, - Variant57721, - Variant57722, - Variant57723, - Variant57724, - Variant57725, - Variant57726, - Variant57727, - Variant57728, - Variant57729, - Variant57730, - Variant57731, - Variant57732, - Variant57733, - Variant57734, - Variant57735, - Variant57736, - Variant57737, - Variant57738, - Variant57739, - Variant57740, - Variant57741, - Variant57742, - Variant57743, - Variant57744, - Variant57745, - Variant57746, - Variant57747, - Variant57748, - Variant57749, - Variant57750, - Variant57751, - Variant57752, - Variant57753, - Variant57754, - Variant57755, - Variant57756, - Variant57757, - Variant57758, - Variant57759, - Variant57760, - Variant57761, - Variant57762, - Variant57763, - Variant57764, - Variant57765, - Variant57766, - Variant57767, - Variant57768, - Variant57769, - Variant57770, - Variant57771, - Variant57772, - Variant57773, - Variant57774, - Variant57775, - Variant57776, - Variant57777, - Variant57778, - Variant57779, - Variant57780, - Variant57781, - Variant57782, - Variant57783, - Variant57784, - Variant57785, - Variant57786, - Variant57787, - Variant57788, - Variant57789, - Variant57790, - Variant57791, - Variant57792, - Variant57793, - Variant57794, - Variant57795, - Variant57796, - Variant57797, - Variant57798, - Variant57799, - Variant57800, - Variant57801, - Variant57802, - Variant57803, - Variant57804, - Variant57805, - Variant57806, - Variant57807, - Variant57808, - Variant57809, - Variant57810, - Variant57811, - Variant57812, - Variant57813, - Variant57814, - Variant57815, - Variant57816, - Variant57817, - Variant57818, - Variant57819, - Variant57820, - Variant57821, - Variant57822, - Variant57823, - Variant57824, - Variant57825, - Variant57826, - Variant57827, - Variant57828, - Variant57829, - Variant57830, - Variant57831, - Variant57832, - Variant57833, - Variant57834, - Variant57835, - Variant57836, - Variant57837, - Variant57838, - Variant57839, - Variant57840, - Variant57841, - Variant57842, - Variant57843, - Variant57844, - Variant57845, - Variant57846, - Variant57847, - Variant57848, - Variant57849, - Variant57850, - Variant57851, - Variant57852, - Variant57853, - Variant57854, - Variant57855, - Variant57856, - Variant57857, - Variant57858, - Variant57859, - Variant57860, - Variant57861, - Variant57862, - Variant57863, - Variant57864, - Variant57865, - Variant57866, - Variant57867, - Variant57868, - Variant57869, - Variant57870, - Variant57871, - Variant57872, - Variant57873, - Variant57874, - Variant57875, - Variant57876, - Variant57877, - Variant57878, - Variant57879, - Variant57880, - Variant57881, - Variant57882, - Variant57883, - Variant57884, - Variant57885, - Variant57886, - Variant57887, - Variant57888, - Variant57889, - Variant57890, - Variant57891, - Variant57892, - Variant57893, - Variant57894, - Variant57895, - Variant57896, - Variant57897, - Variant57898, - Variant57899, - Variant57900, - Variant57901, - Variant57902, - Variant57903, - Variant57904, - Variant57905, - Variant57906, - Variant57907, - Variant57908, - Variant57909, - Variant57910, - Variant57911, - Variant57912, - Variant57913, - Variant57914, - Variant57915, - Variant57916, - Variant57917, - Variant57918, - Variant57919, - Variant57920, - Variant57921, - Variant57922, - Variant57923, - Variant57924, - Variant57925, - Variant57926, - Variant57927, - Variant57928, - Variant57929, - Variant57930, - Variant57931, - Variant57932, - Variant57933, - Variant57934, - Variant57935, - Variant57936, - Variant57937, - Variant57938, - Variant57939, - Variant57940, - Variant57941, - Variant57942, - Variant57943, - Variant57944, - Variant57945, - Variant57946, - Variant57947, - Variant57948, - Variant57949, - Variant57950, - Variant57951, - Variant57952, - Variant57953, - Variant57954, - Variant57955, - Variant57956, - Variant57957, - Variant57958, - Variant57959, - Variant57960, - Variant57961, - Variant57962, - Variant57963, - Variant57964, - Variant57965, - Variant57966, - Variant57967, - Variant57968, - Variant57969, - Variant57970, - Variant57971, - Variant57972, - Variant57973, - Variant57974, - Variant57975, - Variant57976, - Variant57977, - Variant57978, - Variant57979, - Variant57980, - Variant57981, - Variant57982, - Variant57983, - Variant57984, - Variant57985, - Variant57986, - Variant57987, - Variant57988, - Variant57989, - Variant57990, - Variant57991, - Variant57992, - Variant57993, - Variant57994, - Variant57995, - Variant57996, - Variant57997, - Variant57998, - Variant57999, - Variant58000, - Variant58001, - Variant58002, - Variant58003, - Variant58004, - Variant58005, - Variant58006, - Variant58007, - Variant58008, - Variant58009, - Variant58010, - Variant58011, - Variant58012, - Variant58013, - Variant58014, - Variant58015, - Variant58016, - Variant58017, - Variant58018, - Variant58019, - Variant58020, - Variant58021, - Variant58022, - Variant58023, - Variant58024, - Variant58025, - Variant58026, - Variant58027, - Variant58028, - Variant58029, - Variant58030, - Variant58031, - Variant58032, - Variant58033, - Variant58034, - Variant58035, - Variant58036, - Variant58037, - Variant58038, - Variant58039, - Variant58040, - Variant58041, - Variant58042, - Variant58043, - Variant58044, - Variant58045, - Variant58046, - Variant58047, - Variant58048, - Variant58049, - Variant58050, - Variant58051, - Variant58052, - Variant58053, - Variant58054, - Variant58055, - Variant58056, - Variant58057, - Variant58058, - Variant58059, - Variant58060, - Variant58061, - Variant58062, - Variant58063, - Variant58064, - Variant58065, - Variant58066, - Variant58067, - Variant58068, - Variant58069, - Variant58070, - Variant58071, - Variant58072, - Variant58073, - Variant58074, - Variant58075, - Variant58076, - Variant58077, - Variant58078, - Variant58079, - Variant58080, - Variant58081, - Variant58082, - Variant58083, - Variant58084, - Variant58085, - Variant58086, - Variant58087, - Variant58088, - Variant58089, - Variant58090, - Variant58091, - Variant58092, - Variant58093, - Variant58094, - Variant58095, - Variant58096, - Variant58097, - Variant58098, - Variant58099, - Variant58100, - Variant58101, - Variant58102, - Variant58103, - Variant58104, - Variant58105, - Variant58106, - Variant58107, - Variant58108, - Variant58109, - Variant58110, - Variant58111, - Variant58112, - Variant58113, - Variant58114, - Variant58115, - Variant58116, - Variant58117, - Variant58118, - Variant58119, - Variant58120, - Variant58121, - Variant58122, - Variant58123, - Variant58124, - Variant58125, - Variant58126, - Variant58127, - Variant58128, - Variant58129, - Variant58130, - Variant58131, - Variant58132, - Variant58133, - Variant58134, - Variant58135, - Variant58136, - Variant58137, - Variant58138, - Variant58139, - Variant58140, - Variant58141, - Variant58142, - Variant58143, - Variant58144, - Variant58145, - Variant58146, - Variant58147, - Variant58148, - Variant58149, - Variant58150, - Variant58151, - Variant58152, - Variant58153, - Variant58154, - Variant58155, - Variant58156, - Variant58157, - Variant58158, - Variant58159, - Variant58160, - Variant58161, - Variant58162, - Variant58163, - Variant58164, - Variant58165, - Variant58166, - Variant58167, - Variant58168, - Variant58169, - Variant58170, - Variant58171, - Variant58172, - Variant58173, - Variant58174, - Variant58175, - Variant58176, - Variant58177, - Variant58178, - Variant58179, - Variant58180, - Variant58181, - Variant58182, - Variant58183, - Variant58184, - Variant58185, - Variant58186, - Variant58187, - Variant58188, - Variant58189, - Variant58190, - Variant58191, - Variant58192, - Variant58193, - Variant58194, - Variant58195, - Variant58196, - Variant58197, - Variant58198, - Variant58199, - Variant58200, - Variant58201, - Variant58202, - Variant58203, - Variant58204, - Variant58205, - Variant58206, - Variant58207, - Variant58208, - Variant58209, - Variant58210, - Variant58211, - Variant58212, - Variant58213, - Variant58214, - Variant58215, - Variant58216, - Variant58217, - Variant58218, - Variant58219, - Variant58220, - Variant58221, - Variant58222, - Variant58223, - Variant58224, - Variant58225, - Variant58226, - Variant58227, - Variant58228, - Variant58229, - Variant58230, - Variant58231, - Variant58232, - Variant58233, - Variant58234, - Variant58235, - Variant58236, - Variant58237, - Variant58238, - Variant58239, - Variant58240, - Variant58241, - Variant58242, - Variant58243, - Variant58244, - Variant58245, - Variant58246, - Variant58247, - Variant58248, - Variant58249, - Variant58250, - Variant58251, - Variant58252, - Variant58253, - Variant58254, - Variant58255, - Variant58256, - Variant58257, - Variant58258, - Variant58259, - Variant58260, - Variant58261, - Variant58262, - Variant58263, - Variant58264, - Variant58265, - Variant58266, - Variant58267, - Variant58268, - Variant58269, - Variant58270, - Variant58271, - Variant58272, - Variant58273, - Variant58274, - Variant58275, - Variant58276, - Variant58277, - Variant58278, - Variant58279, - Variant58280, - Variant58281, - Variant58282, - Variant58283, - Variant58284, - Variant58285, - Variant58286, - Variant58287, - Variant58288, - Variant58289, - Variant58290, - Variant58291, - Variant58292, - Variant58293, - Variant58294, - Variant58295, - Variant58296, - Variant58297, - Variant58298, - Variant58299, - Variant58300, - Variant58301, - Variant58302, - Variant58303, - Variant58304, - Variant58305, - Variant58306, - Variant58307, - Variant58308, - Variant58309, - Variant58310, - Variant58311, - Variant58312, - Variant58313, - Variant58314, - Variant58315, - Variant58316, - Variant58317, - Variant58318, - Variant58319, - Variant58320, - Variant58321, - Variant58322, - Variant58323, - Variant58324, - Variant58325, - Variant58326, - Variant58327, - Variant58328, - Variant58329, - Variant58330, - Variant58331, - Variant58332, - Variant58333, - Variant58334, - Variant58335, - Variant58336, - Variant58337, - Variant58338, - Variant58339, - Variant58340, - Variant58341, - Variant58342, - Variant58343, - Variant58344, - Variant58345, - Variant58346, - Variant58347, - Variant58348, - Variant58349, - Variant58350, - Variant58351, - Variant58352, - Variant58353, - Variant58354, - Variant58355, - Variant58356, - Variant58357, - Variant58358, - Variant58359, - Variant58360, - Variant58361, - Variant58362, - Variant58363, - Variant58364, - Variant58365, - Variant58366, - Variant58367, - Variant58368, - Variant58369, - Variant58370, - Variant58371, - Variant58372, - Variant58373, - Variant58374, - Variant58375, - Variant58376, - Variant58377, - Variant58378, - Variant58379, - Variant58380, - Variant58381, - Variant58382, - Variant58383, - Variant58384, - Variant58385, - Variant58386, - Variant58387, - Variant58388, - Variant58389, - Variant58390, - Variant58391, - Variant58392, - Variant58393, - Variant58394, - Variant58395, - Variant58396, - Variant58397, - Variant58398, - Variant58399, - Variant58400, - Variant58401, - Variant58402, - Variant58403, - Variant58404, - Variant58405, - Variant58406, - Variant58407, - Variant58408, - Variant58409, - Variant58410, - Variant58411, - Variant58412, - Variant58413, - Variant58414, - Variant58415, - Variant58416, - Variant58417, - Variant58418, - Variant58419, - Variant58420, - Variant58421, - Variant58422, - Variant58423, - Variant58424, - Variant58425, - Variant58426, - Variant58427, - Variant58428, - Variant58429, - Variant58430, - Variant58431, - Variant58432, - Variant58433, - Variant58434, - Variant58435, - Variant58436, - Variant58437, - Variant58438, - Variant58439, - Variant58440, - Variant58441, - Variant58442, - Variant58443, - Variant58444, - Variant58445, - Variant58446, - Variant58447, - Variant58448, - Variant58449, - Variant58450, - Variant58451, - Variant58452, - Variant58453, - Variant58454, - Variant58455, - Variant58456, - Variant58457, - Variant58458, - Variant58459, - Variant58460, - Variant58461, - Variant58462, - Variant58463, - Variant58464, - Variant58465, - Variant58466, - Variant58467, - Variant58468, - Variant58469, - Variant58470, - Variant58471, - Variant58472, - Variant58473, - Variant58474, - Variant58475, - Variant58476, - Variant58477, - Variant58478, - Variant58479, - Variant58480, - Variant58481, - Variant58482, - Variant58483, - Variant58484, - Variant58485, - Variant58486, - Variant58487, - Variant58488, - Variant58489, - Variant58490, - Variant58491, - Variant58492, - Variant58493, - Variant58494, - Variant58495, - Variant58496, - Variant58497, - Variant58498, - Variant58499, - Variant58500, - Variant58501, - Variant58502, - Variant58503, - Variant58504, - Variant58505, - Variant58506, - Variant58507, - Variant58508, - Variant58509, - Variant58510, - Variant58511, - Variant58512, - Variant58513, - Variant58514, - Variant58515, - Variant58516, - Variant58517, - Variant58518, - Variant58519, - Variant58520, - Variant58521, - Variant58522, - Variant58523, - Variant58524, - Variant58525, - Variant58526, - Variant58527, - Variant58528, - Variant58529, - Variant58530, - Variant58531, - Variant58532, - Variant58533, - Variant58534, - Variant58535, - Variant58536, - Variant58537, - Variant58538, - Variant58539, - Variant58540, - Variant58541, - Variant58542, - Variant58543, - Variant58544, - Variant58545, - Variant58546, - Variant58547, - Variant58548, - Variant58549, - Variant58550, - Variant58551, - Variant58552, - Variant58553, - Variant58554, - Variant58555, - Variant58556, - Variant58557, - Variant58558, - Variant58559, - Variant58560, - Variant58561, - Variant58562, - Variant58563, - Variant58564, - Variant58565, - Variant58566, - Variant58567, - Variant58568, - Variant58569, - Variant58570, - Variant58571, - Variant58572, - Variant58573, - Variant58574, - Variant58575, - Variant58576, - Variant58577, - Variant58578, - Variant58579, - Variant58580, - Variant58581, - Variant58582, - Variant58583, - Variant58584, - Variant58585, - Variant58586, - Variant58587, - Variant58588, - Variant58589, - Variant58590, - Variant58591, - Variant58592, - Variant58593, - Variant58594, - Variant58595, - Variant58596, - Variant58597, - Variant58598, - Variant58599, - Variant58600, - Variant58601, - Variant58602, - Variant58603, - Variant58604, - Variant58605, - Variant58606, - Variant58607, - Variant58608, - Variant58609, - Variant58610, - Variant58611, - Variant58612, - Variant58613, - Variant58614, - Variant58615, - Variant58616, - Variant58617, - Variant58618, - Variant58619, - Variant58620, - Variant58621, - Variant58622, - Variant58623, - Variant58624, - Variant58625, - Variant58626, - Variant58627, - Variant58628, - Variant58629, - Variant58630, - Variant58631, - Variant58632, - Variant58633, - Variant58634, - Variant58635, - Variant58636, - Variant58637, - Variant58638, - Variant58639, - Variant58640, - Variant58641, - Variant58642, - Variant58643, - Variant58644, - Variant58645, - Variant58646, - Variant58647, - Variant58648, - Variant58649, - Variant58650, - Variant58651, - Variant58652, - Variant58653, - Variant58654, - Variant58655, - Variant58656, - Variant58657, - Variant58658, - Variant58659, - Variant58660, - Variant58661, - Variant58662, - Variant58663, - Variant58664, - Variant58665, - Variant58666, - Variant58667, - Variant58668, - Variant58669, - Variant58670, - Variant58671, - Variant58672, - Variant58673, - Variant58674, - Variant58675, - Variant58676, - Variant58677, - Variant58678, - Variant58679, - Variant58680, - Variant58681, - Variant58682, - Variant58683, - Variant58684, - Variant58685, - Variant58686, - Variant58687, - Variant58688, - Variant58689, - Variant58690, - Variant58691, - Variant58692, - Variant58693, - Variant58694, - Variant58695, - Variant58696, - Variant58697, - Variant58698, - Variant58699, - Variant58700, - Variant58701, - Variant58702, - Variant58703, - Variant58704, - Variant58705, - Variant58706, - Variant58707, - Variant58708, - Variant58709, - Variant58710, - Variant58711, - Variant58712, - Variant58713, - Variant58714, - Variant58715, - Variant58716, - Variant58717, - Variant58718, - Variant58719, - Variant58720, - Variant58721, - Variant58722, - Variant58723, - Variant58724, - Variant58725, - Variant58726, - Variant58727, - Variant58728, - Variant58729, - Variant58730, - Variant58731, - Variant58732, - Variant58733, - Variant58734, - Variant58735, - Variant58736, - Variant58737, - Variant58738, - Variant58739, - Variant58740, - Variant58741, - Variant58742, - Variant58743, - Variant58744, - Variant58745, - Variant58746, - Variant58747, - Variant58748, - Variant58749, - Variant58750, - Variant58751, - Variant58752, - Variant58753, - Variant58754, - Variant58755, - Variant58756, - Variant58757, - Variant58758, - Variant58759, - Variant58760, - Variant58761, - Variant58762, - Variant58763, - Variant58764, - Variant58765, - Variant58766, - Variant58767, - Variant58768, - Variant58769, - Variant58770, - Variant58771, - Variant58772, - Variant58773, - Variant58774, - Variant58775, - Variant58776, - Variant58777, - Variant58778, - Variant58779, - Variant58780, - Variant58781, - Variant58782, - Variant58783, - Variant58784, - Variant58785, - Variant58786, - Variant58787, - Variant58788, - Variant58789, - Variant58790, - Variant58791, - Variant58792, - Variant58793, - Variant58794, - Variant58795, - Variant58796, - Variant58797, - Variant58798, - Variant58799, - Variant58800, - Variant58801, - Variant58802, - Variant58803, - Variant58804, - Variant58805, - Variant58806, - Variant58807, - Variant58808, - Variant58809, - Variant58810, - Variant58811, - Variant58812, - Variant58813, - Variant58814, - Variant58815, - Variant58816, - Variant58817, - Variant58818, - Variant58819, - Variant58820, - Variant58821, - Variant58822, - Variant58823, - Variant58824, - Variant58825, - Variant58826, - Variant58827, - Variant58828, - Variant58829, - Variant58830, - Variant58831, - Variant58832, - Variant58833, - Variant58834, - Variant58835, - Variant58836, - Variant58837, - Variant58838, - Variant58839, - Variant58840, - Variant58841, - Variant58842, - Variant58843, - Variant58844, - Variant58845, - Variant58846, - Variant58847, - Variant58848, - Variant58849, - Variant58850, - Variant58851, - Variant58852, - Variant58853, - Variant58854, - Variant58855, - Variant58856, - Variant58857, - Variant58858, - Variant58859, - Variant58860, - Variant58861, - Variant58862, - Variant58863, - Variant58864, - Variant58865, - Variant58866, - Variant58867, - Variant58868, - Variant58869, - Variant58870, - Variant58871, - Variant58872, - Variant58873, - Variant58874, - Variant58875, - Variant58876, - Variant58877, - Variant58878, - Variant58879, - Variant58880, - Variant58881, - Variant58882, - Variant58883, - Variant58884, - Variant58885, - Variant58886, - Variant58887, - Variant58888, - Variant58889, - Variant58890, - Variant58891, - Variant58892, - Variant58893, - Variant58894, - Variant58895, - Variant58896, - Variant58897, - Variant58898, - Variant58899, - Variant58900, - Variant58901, - Variant58902, - Variant58903, - Variant58904, - Variant58905, - Variant58906, - Variant58907, - Variant58908, - Variant58909, - Variant58910, - Variant58911, - Variant58912, - Variant58913, - Variant58914, - Variant58915, - Variant58916, - Variant58917, - Variant58918, - Variant58919, - Variant58920, - Variant58921, - Variant58922, - Variant58923, - Variant58924, - Variant58925, - Variant58926, - Variant58927, - Variant58928, - Variant58929, - Variant58930, - Variant58931, - Variant58932, - Variant58933, - Variant58934, - Variant58935, - Variant58936, - Variant58937, - Variant58938, - Variant58939, - Variant58940, - Variant58941, - Variant58942, - Variant58943, - Variant58944, - Variant58945, - Variant58946, - Variant58947, - Variant58948, - Variant58949, - Variant58950, - Variant58951, - Variant58952, - Variant58953, - Variant58954, - Variant58955, - Variant58956, - Variant58957, - Variant58958, - Variant58959, - Variant58960, - Variant58961, - Variant58962, - Variant58963, - Variant58964, - Variant58965, - Variant58966, - Variant58967, - Variant58968, - Variant58969, - Variant58970, - Variant58971, - Variant58972, - Variant58973, - Variant58974, - Variant58975, - Variant58976, - Variant58977, - Variant58978, - Variant58979, - Variant58980, - Variant58981, - Variant58982, - Variant58983, - Variant58984, - Variant58985, - Variant58986, - Variant58987, - Variant58988, - Variant58989, - Variant58990, - Variant58991, - Variant58992, - Variant58993, - Variant58994, - Variant58995, - Variant58996, - Variant58997, - Variant58998, - Variant58999, - Variant59000, - Variant59001, - Variant59002, - Variant59003, - Variant59004, - Variant59005, - Variant59006, - Variant59007, - Variant59008, - Variant59009, - Variant59010, - Variant59011, - Variant59012, - Variant59013, - Variant59014, - Variant59015, - Variant59016, - Variant59017, - Variant59018, - Variant59019, - Variant59020, - Variant59021, - Variant59022, - Variant59023, - Variant59024, - Variant59025, - Variant59026, - Variant59027, - Variant59028, - Variant59029, - Variant59030, - Variant59031, - Variant59032, - Variant59033, - Variant59034, - Variant59035, - Variant59036, - Variant59037, - Variant59038, - Variant59039, - Variant59040, - Variant59041, - Variant59042, - Variant59043, - Variant59044, - Variant59045, - Variant59046, - Variant59047, - Variant59048, - Variant59049, - Variant59050, - Variant59051, - Variant59052, - Variant59053, - Variant59054, - Variant59055, - Variant59056, - Variant59057, - Variant59058, - Variant59059, - Variant59060, - Variant59061, - Variant59062, - Variant59063, - Variant59064, - Variant59065, - Variant59066, - Variant59067, - Variant59068, - Variant59069, - Variant59070, - Variant59071, - Variant59072, - Variant59073, - Variant59074, - Variant59075, - Variant59076, - Variant59077, - Variant59078, - Variant59079, - Variant59080, - Variant59081, - Variant59082, - Variant59083, - Variant59084, - Variant59085, - Variant59086, - Variant59087, - Variant59088, - Variant59089, - Variant59090, - Variant59091, - Variant59092, - Variant59093, - Variant59094, - Variant59095, - Variant59096, - Variant59097, - Variant59098, - Variant59099, - Variant59100, - Variant59101, - Variant59102, - Variant59103, - Variant59104, - Variant59105, - Variant59106, - Variant59107, - Variant59108, - Variant59109, - Variant59110, - Variant59111, - Variant59112, - Variant59113, - Variant59114, - Variant59115, - Variant59116, - Variant59117, - Variant59118, - Variant59119, - Variant59120, - Variant59121, - Variant59122, - Variant59123, - Variant59124, - Variant59125, - Variant59126, - Variant59127, - Variant59128, - Variant59129, - Variant59130, - Variant59131, - Variant59132, - Variant59133, - Variant59134, - Variant59135, - Variant59136, - Variant59137, - Variant59138, - Variant59139, - Variant59140, - Variant59141, - Variant59142, - Variant59143, - Variant59144, - Variant59145, - Variant59146, - Variant59147, - Variant59148, - Variant59149, - Variant59150, - Variant59151, - Variant59152, - Variant59153, - Variant59154, - Variant59155, - Variant59156, - Variant59157, - Variant59158, - Variant59159, - Variant59160, - Variant59161, - Variant59162, - Variant59163, - Variant59164, - Variant59165, - Variant59166, - Variant59167, - Variant59168, - Variant59169, - Variant59170, - Variant59171, - Variant59172, - Variant59173, - Variant59174, - Variant59175, - Variant59176, - Variant59177, - Variant59178, - Variant59179, - Variant59180, - Variant59181, - Variant59182, - Variant59183, - Variant59184, - Variant59185, - Variant59186, - Variant59187, - Variant59188, - Variant59189, - Variant59190, - Variant59191, - Variant59192, - Variant59193, - Variant59194, - Variant59195, - Variant59196, - Variant59197, - Variant59198, - Variant59199, - Variant59200, - Variant59201, - Variant59202, - Variant59203, - Variant59204, - Variant59205, - Variant59206, - Variant59207, - Variant59208, - Variant59209, - Variant59210, - Variant59211, - Variant59212, - Variant59213, - Variant59214, - Variant59215, - Variant59216, - Variant59217, - Variant59218, - Variant59219, - Variant59220, - Variant59221, - Variant59222, - Variant59223, - Variant59224, - Variant59225, - Variant59226, - Variant59227, - Variant59228, - Variant59229, - Variant59230, - Variant59231, - Variant59232, - Variant59233, - Variant59234, - Variant59235, - Variant59236, - Variant59237, - Variant59238, - Variant59239, - Variant59240, - Variant59241, - Variant59242, - Variant59243, - Variant59244, - Variant59245, - Variant59246, - Variant59247, - Variant59248, - Variant59249, - Variant59250, - Variant59251, - Variant59252, - Variant59253, - Variant59254, - Variant59255, - Variant59256, - Variant59257, - Variant59258, - Variant59259, - Variant59260, - Variant59261, - Variant59262, - Variant59263, - Variant59264, - Variant59265, - Variant59266, - Variant59267, - Variant59268, - Variant59269, - Variant59270, - Variant59271, - Variant59272, - Variant59273, - Variant59274, - Variant59275, - Variant59276, - Variant59277, - Variant59278, - Variant59279, - Variant59280, - Variant59281, - Variant59282, - Variant59283, - Variant59284, - Variant59285, - Variant59286, - Variant59287, - Variant59288, - Variant59289, - Variant59290, - Variant59291, - Variant59292, - Variant59293, - Variant59294, - Variant59295, - Variant59296, - Variant59297, - Variant59298, - Variant59299, - Variant59300, - Variant59301, - Variant59302, - Variant59303, - Variant59304, - Variant59305, - Variant59306, - Variant59307, - Variant59308, - Variant59309, - Variant59310, - Variant59311, - Variant59312, - Variant59313, - Variant59314, - Variant59315, - Variant59316, - Variant59317, - Variant59318, - Variant59319, - Variant59320, - Variant59321, - Variant59322, - Variant59323, - Variant59324, - Variant59325, - Variant59326, - Variant59327, - Variant59328, - Variant59329, - Variant59330, - Variant59331, - Variant59332, - Variant59333, - Variant59334, - Variant59335, - Variant59336, - Variant59337, - Variant59338, - Variant59339, - Variant59340, - Variant59341, - Variant59342, - Variant59343, - Variant59344, - Variant59345, - Variant59346, - Variant59347, - Variant59348, - Variant59349, - Variant59350, - Variant59351, - Variant59352, - Variant59353, - Variant59354, - Variant59355, - Variant59356, - Variant59357, - Variant59358, - Variant59359, - Variant59360, - Variant59361, - Variant59362, - Variant59363, - Variant59364, - Variant59365, - Variant59366, - Variant59367, - Variant59368, - Variant59369, - Variant59370, - Variant59371, - Variant59372, - Variant59373, - Variant59374, - Variant59375, - Variant59376, - Variant59377, - Variant59378, - Variant59379, - Variant59380, - Variant59381, - Variant59382, - Variant59383, - Variant59384, - Variant59385, - Variant59386, - Variant59387, - Variant59388, - Variant59389, - Variant59390, - Variant59391, - Variant59392, - Variant59393, - Variant59394, - Variant59395, - Variant59396, - Variant59397, - Variant59398, - Variant59399, - Variant59400, - Variant59401, - Variant59402, - Variant59403, - Variant59404, - Variant59405, - Variant59406, - Variant59407, - Variant59408, - Variant59409, - Variant59410, - Variant59411, - Variant59412, - Variant59413, - Variant59414, - Variant59415, - Variant59416, - Variant59417, - Variant59418, - Variant59419, - Variant59420, - Variant59421, - Variant59422, - Variant59423, - Variant59424, - Variant59425, - Variant59426, - Variant59427, - Variant59428, - Variant59429, - Variant59430, - Variant59431, - Variant59432, - Variant59433, - Variant59434, - Variant59435, - Variant59436, - Variant59437, - Variant59438, - Variant59439, - Variant59440, - Variant59441, - Variant59442, - Variant59443, - Variant59444, - Variant59445, - Variant59446, - Variant59447, - Variant59448, - Variant59449, - Variant59450, - Variant59451, - Variant59452, - Variant59453, - Variant59454, - Variant59455, - Variant59456, - Variant59457, - Variant59458, - Variant59459, - Variant59460, - Variant59461, - Variant59462, - Variant59463, - Variant59464, - Variant59465, - Variant59466, - Variant59467, - Variant59468, - Variant59469, - Variant59470, - Variant59471, - Variant59472, - Variant59473, - Variant59474, - Variant59475, - Variant59476, - Variant59477, - Variant59478, - Variant59479, - Variant59480, - Variant59481, - Variant59482, - Variant59483, - Variant59484, - Variant59485, - Variant59486, - Variant59487, - Variant59488, - Variant59489, - Variant59490, - Variant59491, - Variant59492, - Variant59493, - Variant59494, - Variant59495, - Variant59496, - Variant59497, - Variant59498, - Variant59499, - Variant59500, - Variant59501, - Variant59502, - Variant59503, - Variant59504, - Variant59505, - Variant59506, - Variant59507, - Variant59508, - Variant59509, - Variant59510, - Variant59511, - Variant59512, - Variant59513, - Variant59514, - Variant59515, - Variant59516, - Variant59517, - Variant59518, - Variant59519, - Variant59520, - Variant59521, - Variant59522, - Variant59523, - Variant59524, - Variant59525, - Variant59526, - Variant59527, - Variant59528, - Variant59529, - Variant59530, - Variant59531, - Variant59532, - Variant59533, - Variant59534, - Variant59535, - Variant59536, - Variant59537, - Variant59538, - Variant59539, - Variant59540, - Variant59541, - Variant59542, - Variant59543, - Variant59544, - Variant59545, - Variant59546, - Variant59547, - Variant59548, - Variant59549, - Variant59550, - Variant59551, - Variant59552, - Variant59553, - Variant59554, - Variant59555, - Variant59556, - Variant59557, - Variant59558, - Variant59559, - Variant59560, - Variant59561, - Variant59562, - Variant59563, - Variant59564, - Variant59565, - Variant59566, - Variant59567, - Variant59568, - Variant59569, - Variant59570, - Variant59571, - Variant59572, - Variant59573, - Variant59574, - Variant59575, - Variant59576, - Variant59577, - Variant59578, - Variant59579, - Variant59580, - Variant59581, - Variant59582, - Variant59583, - Variant59584, - Variant59585, - Variant59586, - Variant59587, - Variant59588, - Variant59589, - Variant59590, - Variant59591, - Variant59592, - Variant59593, - Variant59594, - Variant59595, - Variant59596, - Variant59597, - Variant59598, - Variant59599, - Variant59600, - Variant59601, - Variant59602, - Variant59603, - Variant59604, - Variant59605, - Variant59606, - Variant59607, - Variant59608, - Variant59609, - Variant59610, - Variant59611, - Variant59612, - Variant59613, - Variant59614, - Variant59615, - Variant59616, - Variant59617, - Variant59618, - Variant59619, - Variant59620, - Variant59621, - Variant59622, - Variant59623, - Variant59624, - Variant59625, - Variant59626, - Variant59627, - Variant59628, - Variant59629, - Variant59630, - Variant59631, - Variant59632, - Variant59633, - Variant59634, - Variant59635, - Variant59636, - Variant59637, - Variant59638, - Variant59639, - Variant59640, - Variant59641, - Variant59642, - Variant59643, - Variant59644, - Variant59645, - Variant59646, - Variant59647, - Variant59648, - Variant59649, - Variant59650, - Variant59651, - Variant59652, - Variant59653, - Variant59654, - Variant59655, - Variant59656, - Variant59657, - Variant59658, - Variant59659, - Variant59660, - Variant59661, - Variant59662, - Variant59663, - Variant59664, - Variant59665, - Variant59666, - Variant59667, - Variant59668, - Variant59669, - Variant59670, - Variant59671, - Variant59672, - Variant59673, - Variant59674, - Variant59675, - Variant59676, - Variant59677, - Variant59678, - Variant59679, - Variant59680, - Variant59681, - Variant59682, - Variant59683, - Variant59684, - Variant59685, - Variant59686, - Variant59687, - Variant59688, - Variant59689, - Variant59690, - Variant59691, - Variant59692, - Variant59693, - Variant59694, - Variant59695, - Variant59696, - Variant59697, - Variant59698, - Variant59699, - Variant59700, - Variant59701, - Variant59702, - Variant59703, - Variant59704, - Variant59705, - Variant59706, - Variant59707, - Variant59708, - Variant59709, - Variant59710, - Variant59711, - Variant59712, - Variant59713, - Variant59714, - Variant59715, - Variant59716, - Variant59717, - Variant59718, - Variant59719, - Variant59720, - Variant59721, - Variant59722, - Variant59723, - Variant59724, - Variant59725, - Variant59726, - Variant59727, - Variant59728, - Variant59729, - Variant59730, - Variant59731, - Variant59732, - Variant59733, - Variant59734, - Variant59735, - Variant59736, - Variant59737, - Variant59738, - Variant59739, - Variant59740, - Variant59741, - Variant59742, - Variant59743, - Variant59744, - Variant59745, - Variant59746, - Variant59747, - Variant59748, - Variant59749, - Variant59750, - Variant59751, - Variant59752, - Variant59753, - Variant59754, - Variant59755, - Variant59756, - Variant59757, - Variant59758, - Variant59759, - Variant59760, - Variant59761, - Variant59762, - Variant59763, - Variant59764, - Variant59765, - Variant59766, - Variant59767, - Variant59768, - Variant59769, - Variant59770, - Variant59771, - Variant59772, - Variant59773, - Variant59774, - Variant59775, - Variant59776, - Variant59777, - Variant59778, - Variant59779, - Variant59780, - Variant59781, - Variant59782, - Variant59783, - Variant59784, - Variant59785, - Variant59786, - Variant59787, - Variant59788, - Variant59789, - Variant59790, - Variant59791, - Variant59792, - Variant59793, - Variant59794, - Variant59795, - Variant59796, - Variant59797, - Variant59798, - Variant59799, - Variant59800, - Variant59801, - Variant59802, - Variant59803, - Variant59804, - Variant59805, - Variant59806, - Variant59807, - Variant59808, - Variant59809, - Variant59810, - Variant59811, - Variant59812, - Variant59813, - Variant59814, - Variant59815, - Variant59816, - Variant59817, - Variant59818, - Variant59819, - Variant59820, - Variant59821, - Variant59822, - Variant59823, - Variant59824, - Variant59825, - Variant59826, - Variant59827, - Variant59828, - Variant59829, - Variant59830, - Variant59831, - Variant59832, - Variant59833, - Variant59834, - Variant59835, - Variant59836, - Variant59837, - Variant59838, - Variant59839, - Variant59840, - Variant59841, - Variant59842, - Variant59843, - Variant59844, - Variant59845, - Variant59846, - Variant59847, - Variant59848, - Variant59849, - Variant59850, - Variant59851, - Variant59852, - Variant59853, - Variant59854, - Variant59855, - Variant59856, - Variant59857, - Variant59858, - Variant59859, - Variant59860, - Variant59861, - Variant59862, - Variant59863, - Variant59864, - Variant59865, - Variant59866, - Variant59867, - Variant59868, - Variant59869, - Variant59870, - Variant59871, - Variant59872, - Variant59873, - Variant59874, - Variant59875, - Variant59876, - Variant59877, - Variant59878, - Variant59879, - Variant59880, - Variant59881, - Variant59882, - Variant59883, - Variant59884, - Variant59885, - Variant59886, - Variant59887, - Variant59888, - Variant59889, - Variant59890, - Variant59891, - Variant59892, - Variant59893, - Variant59894, - Variant59895, - Variant59896, - Variant59897, - Variant59898, - Variant59899, - Variant59900, - Variant59901, - Variant59902, - Variant59903, - Variant59904, - Variant59905, - Variant59906, - Variant59907, - Variant59908, - Variant59909, - Variant59910, - Variant59911, - Variant59912, - Variant59913, - Variant59914, - Variant59915, - Variant59916, - Variant59917, - Variant59918, - Variant59919, - Variant59920, - Variant59921, - Variant59922, - Variant59923, - Variant59924, - Variant59925, - Variant59926, - Variant59927, - Variant59928, - Variant59929, - Variant59930, - Variant59931, - Variant59932, - Variant59933, - Variant59934, - Variant59935, - Variant59936, - Variant59937, - Variant59938, - Variant59939, - Variant59940, - Variant59941, - Variant59942, - Variant59943, - Variant59944, - Variant59945, - Variant59946, - Variant59947, - Variant59948, - Variant59949, - Variant59950, - Variant59951, - Variant59952, - Variant59953, - Variant59954, - Variant59955, - Variant59956, - Variant59957, - Variant59958, - Variant59959, - Variant59960, - Variant59961, - Variant59962, - Variant59963, - Variant59964, - Variant59965, - Variant59966, - Variant59967, - Variant59968, - Variant59969, - Variant59970, - Variant59971, - Variant59972, - Variant59973, - Variant59974, - Variant59975, - Variant59976, - Variant59977, - Variant59978, - Variant59979, - Variant59980, - Variant59981, - Variant59982, - Variant59983, - Variant59984, - Variant59985, - Variant59986, - Variant59987, - Variant59988, - Variant59989, - Variant59990, - Variant59991, - Variant59992, - Variant59993, - Variant59994, - Variant59995, - Variant59996, - Variant59997, - Variant59998, - Variant59999, - Variant60000, - Variant60001, - Variant60002, - Variant60003, - Variant60004, - Variant60005, - Variant60006, - Variant60007, - Variant60008, - Variant60009, - Variant60010, - Variant60011, - Variant60012, - Variant60013, - Variant60014, - Variant60015, - Variant60016, - Variant60017, - Variant60018, - Variant60019, - Variant60020, - Variant60021, - Variant60022, - Variant60023, - Variant60024, - Variant60025, - Variant60026, - Variant60027, - Variant60028, - Variant60029, - Variant60030, - Variant60031, - Variant60032, - Variant60033, - Variant60034, - Variant60035, - Variant60036, - Variant60037, - Variant60038, - Variant60039, - Variant60040, - Variant60041, - Variant60042, - Variant60043, - Variant60044, - Variant60045, - Variant60046, - Variant60047, - Variant60048, - Variant60049, - Variant60050, - Variant60051, - Variant60052, - Variant60053, - Variant60054, - Variant60055, - Variant60056, - Variant60057, - Variant60058, - Variant60059, - Variant60060, - Variant60061, - Variant60062, - Variant60063, - Variant60064, - Variant60065, - Variant60066, - Variant60067, - Variant60068, - Variant60069, - Variant60070, - Variant60071, - Variant60072, - Variant60073, - Variant60074, - Variant60075, - Variant60076, - Variant60077, - Variant60078, - Variant60079, - Variant60080, - Variant60081, - Variant60082, - Variant60083, - Variant60084, - Variant60085, - Variant60086, - Variant60087, - Variant60088, - Variant60089, - Variant60090, - Variant60091, - Variant60092, - Variant60093, - Variant60094, - Variant60095, - Variant60096, - Variant60097, - Variant60098, - Variant60099, - Variant60100, - Variant60101, - Variant60102, - Variant60103, - Variant60104, - Variant60105, - Variant60106, - Variant60107, - Variant60108, - Variant60109, - Variant60110, - Variant60111, - Variant60112, - Variant60113, - Variant60114, - Variant60115, - Variant60116, - Variant60117, - Variant60118, - Variant60119, - Variant60120, - Variant60121, - Variant60122, - Variant60123, - Variant60124, - Variant60125, - Variant60126, - Variant60127, - Variant60128, - Variant60129, - Variant60130, - Variant60131, - Variant60132, - Variant60133, - Variant60134, - Variant60135, - Variant60136, - Variant60137, - Variant60138, - Variant60139, - Variant60140, - Variant60141, - Variant60142, - Variant60143, - Variant60144, - Variant60145, - Variant60146, - Variant60147, - Variant60148, - Variant60149, - Variant60150, - Variant60151, - Variant60152, - Variant60153, - Variant60154, - Variant60155, - Variant60156, - Variant60157, - Variant60158, - Variant60159, - Variant60160, - Variant60161, - Variant60162, - Variant60163, - Variant60164, - Variant60165, - Variant60166, - Variant60167, - Variant60168, - Variant60169, - Variant60170, - Variant60171, - Variant60172, - Variant60173, - Variant60174, - Variant60175, - Variant60176, - Variant60177, - Variant60178, - Variant60179, - Variant60180, - Variant60181, - Variant60182, - Variant60183, - Variant60184, - Variant60185, - Variant60186, - Variant60187, - Variant60188, - Variant60189, - Variant60190, - Variant60191, - Variant60192, - Variant60193, - Variant60194, - Variant60195, - Variant60196, - Variant60197, - Variant60198, - Variant60199, - Variant60200, - Variant60201, - Variant60202, - Variant60203, - Variant60204, - Variant60205, - Variant60206, - Variant60207, - Variant60208, - Variant60209, - Variant60210, - Variant60211, - Variant60212, - Variant60213, - Variant60214, - Variant60215, - Variant60216, - Variant60217, - Variant60218, - Variant60219, - Variant60220, - Variant60221, - Variant60222, - Variant60223, - Variant60224, - Variant60225, - Variant60226, - Variant60227, - Variant60228, - Variant60229, - Variant60230, - Variant60231, - Variant60232, - Variant60233, - Variant60234, - Variant60235, - Variant60236, - Variant60237, - Variant60238, - Variant60239, - Variant60240, - Variant60241, - Variant60242, - Variant60243, - Variant60244, - Variant60245, - Variant60246, - Variant60247, - Variant60248, - Variant60249, - Variant60250, - Variant60251, - Variant60252, - Variant60253, - Variant60254, - Variant60255, - Variant60256, - Variant60257, - Variant60258, - Variant60259, - Variant60260, - Variant60261, - Variant60262, - Variant60263, - Variant60264, - Variant60265, - Variant60266, - Variant60267, - Variant60268, - Variant60269, - Variant60270, - Variant60271, - Variant60272, - Variant60273, - Variant60274, - Variant60275, - Variant60276, - Variant60277, - Variant60278, - Variant60279, - Variant60280, - Variant60281, - Variant60282, - Variant60283, - Variant60284, - Variant60285, - Variant60286, - Variant60287, - Variant60288, - Variant60289, - Variant60290, - Variant60291, - Variant60292, - Variant60293, - Variant60294, - Variant60295, - Variant60296, - Variant60297, - Variant60298, - Variant60299, - Variant60300, - Variant60301, - Variant60302, - Variant60303, - Variant60304, - Variant60305, - Variant60306, - Variant60307, - Variant60308, - Variant60309, - Variant60310, - Variant60311, - Variant60312, - Variant60313, - Variant60314, - Variant60315, - Variant60316, - Variant60317, - Variant60318, - Variant60319, - Variant60320, - Variant60321, - Variant60322, - Variant60323, - Variant60324, - Variant60325, - Variant60326, - Variant60327, - Variant60328, - Variant60329, - Variant60330, - Variant60331, - Variant60332, - Variant60333, - Variant60334, - Variant60335, - Variant60336, - Variant60337, - Variant60338, - Variant60339, - Variant60340, - Variant60341, - Variant60342, - Variant60343, - Variant60344, - Variant60345, - Variant60346, - Variant60347, - Variant60348, - Variant60349, - Variant60350, - Variant60351, - Variant60352, - Variant60353, - Variant60354, - Variant60355, - Variant60356, - Variant60357, - Variant60358, - Variant60359, - Variant60360, - Variant60361, - Variant60362, - Variant60363, - Variant60364, - Variant60365, - Variant60366, - Variant60367, - Variant60368, - Variant60369, - Variant60370, - Variant60371, - Variant60372, - Variant60373, - Variant60374, - Variant60375, - Variant60376, - Variant60377, - Variant60378, - Variant60379, - Variant60380, - Variant60381, - Variant60382, - Variant60383, - Variant60384, - Variant60385, - Variant60386, - Variant60387, - Variant60388, - Variant60389, - Variant60390, - Variant60391, - Variant60392, - Variant60393, - Variant60394, - Variant60395, - Variant60396, - Variant60397, - Variant60398, - Variant60399, - Variant60400, - Variant60401, - Variant60402, - Variant60403, - Variant60404, - Variant60405, - Variant60406, - Variant60407, - Variant60408, - Variant60409, - Variant60410, - Variant60411, - Variant60412, - Variant60413, - Variant60414, - Variant60415, - Variant60416, - Variant60417, - Variant60418, - Variant60419, - Variant60420, - Variant60421, - Variant60422, - Variant60423, - Variant60424, - Variant60425, - Variant60426, - Variant60427, - Variant60428, - Variant60429, - Variant60430, - Variant60431, - Variant60432, - Variant60433, - Variant60434, - Variant60435, - Variant60436, - Variant60437, - Variant60438, - Variant60439, - Variant60440, - Variant60441, - Variant60442, - Variant60443, - Variant60444, - Variant60445, - Variant60446, - Variant60447, - Variant60448, - Variant60449, - Variant60450, - Variant60451, - Variant60452, - Variant60453, - Variant60454, - Variant60455, - Variant60456, - Variant60457, - Variant60458, - Variant60459, - Variant60460, - Variant60461, - Variant60462, - Variant60463, - Variant60464, - Variant60465, - Variant60466, - Variant60467, - Variant60468, - Variant60469, - Variant60470, - Variant60471, - Variant60472, - Variant60473, - Variant60474, - Variant60475, - Variant60476, - Variant60477, - Variant60478, - Variant60479, - Variant60480, - Variant60481, - Variant60482, - Variant60483, - Variant60484, - Variant60485, - Variant60486, - Variant60487, - Variant60488, - Variant60489, - Variant60490, - Variant60491, - Variant60492, - Variant60493, - Variant60494, - Variant60495, - Variant60496, - Variant60497, - Variant60498, - Variant60499, - Variant60500, - Variant60501, - Variant60502, - Variant60503, - Variant60504, - Variant60505, - Variant60506, - Variant60507, - Variant60508, - Variant60509, - Variant60510, - Variant60511, - Variant60512, - Variant60513, - Variant60514, - Variant60515, - Variant60516, - Variant60517, - Variant60518, - Variant60519, - Variant60520, - Variant60521, - Variant60522, - Variant60523, - Variant60524, - Variant60525, - Variant60526, - Variant60527, - Variant60528, - Variant60529, - Variant60530, - Variant60531, - Variant60532, - Variant60533, - Variant60534, - Variant60535, - Variant60536, - Variant60537, - Variant60538, - Variant60539, - Variant60540, - Variant60541, - Variant60542, - Variant60543, - Variant60544, - Variant60545, - Variant60546, - Variant60547, - Variant60548, - Variant60549, - Variant60550, - Variant60551, - Variant60552, - Variant60553, - Variant60554, - Variant60555, - Variant60556, - Variant60557, - Variant60558, - Variant60559, - Variant60560, - Variant60561, - Variant60562, - Variant60563, - Variant60564, - Variant60565, - Variant60566, - Variant60567, - Variant60568, - Variant60569, - Variant60570, - Variant60571, - Variant60572, - Variant60573, - Variant60574, - Variant60575, - Variant60576, - Variant60577, - Variant60578, - Variant60579, - Variant60580, - Variant60581, - Variant60582, - Variant60583, - Variant60584, - Variant60585, - Variant60586, - Variant60587, - Variant60588, - Variant60589, - Variant60590, - Variant60591, - Variant60592, - Variant60593, - Variant60594, - Variant60595, - Variant60596, - Variant60597, - Variant60598, - Variant60599, - Variant60600, - Variant60601, - Variant60602, - Variant60603, - Variant60604, - Variant60605, - Variant60606, - Variant60607, - Variant60608, - Variant60609, - Variant60610, - Variant60611, - Variant60612, - Variant60613, - Variant60614, - Variant60615, - Variant60616, - Variant60617, - Variant60618, - Variant60619, - Variant60620, - Variant60621, - Variant60622, - Variant60623, - Variant60624, - Variant60625, - Variant60626, - Variant60627, - Variant60628, - Variant60629, - Variant60630, - Variant60631, - Variant60632, - Variant60633, - Variant60634, - Variant60635, - Variant60636, - Variant60637, - Variant60638, - Variant60639, - Variant60640, - Variant60641, - Variant60642, - Variant60643, - Variant60644, - Variant60645, - Variant60646, - Variant60647, - Variant60648, - Variant60649, - Variant60650, - Variant60651, - Variant60652, - Variant60653, - Variant60654, - Variant60655, - Variant60656, - Variant60657, - Variant60658, - Variant60659, - Variant60660, - Variant60661, - Variant60662, - Variant60663, - Variant60664, - Variant60665, - Variant60666, - Variant60667, - Variant60668, - Variant60669, - Variant60670, - Variant60671, - Variant60672, - Variant60673, - Variant60674, - Variant60675, - Variant60676, - Variant60677, - Variant60678, - Variant60679, - Variant60680, - Variant60681, - Variant60682, - Variant60683, - Variant60684, - Variant60685, - Variant60686, - Variant60687, - Variant60688, - Variant60689, - Variant60690, - Variant60691, - Variant60692, - Variant60693, - Variant60694, - Variant60695, - Variant60696, - Variant60697, - Variant60698, - Variant60699, - Variant60700, - Variant60701, - Variant60702, - Variant60703, - Variant60704, - Variant60705, - Variant60706, - Variant60707, - Variant60708, - Variant60709, - Variant60710, - Variant60711, - Variant60712, - Variant60713, - Variant60714, - Variant60715, - Variant60716, - Variant60717, - Variant60718, - Variant60719, - Variant60720, - Variant60721, - Variant60722, - Variant60723, - Variant60724, - Variant60725, - Variant60726, - Variant60727, - Variant60728, - Variant60729, - Variant60730, - Variant60731, - Variant60732, - Variant60733, - Variant60734, - Variant60735, - Variant60736, - Variant60737, - Variant60738, - Variant60739, - Variant60740, - Variant60741, - Variant60742, - Variant60743, - Variant60744, - Variant60745, - Variant60746, - Variant60747, - Variant60748, - Variant60749, - Variant60750, - Variant60751, - Variant60752, - Variant60753, - Variant60754, - Variant60755, - Variant60756, - Variant60757, - Variant60758, - Variant60759, - Variant60760, - Variant60761, - Variant60762, - Variant60763, - Variant60764, - Variant60765, - Variant60766, - Variant60767, - Variant60768, - Variant60769, - Variant60770, - Variant60771, - Variant60772, - Variant60773, - Variant60774, - Variant60775, - Variant60776, - Variant60777, - Variant60778, - Variant60779, - Variant60780, - Variant60781, - Variant60782, - Variant60783, - Variant60784, - Variant60785, - Variant60786, - Variant60787, - Variant60788, - Variant60789, - Variant60790, - Variant60791, - Variant60792, - Variant60793, - Variant60794, - Variant60795, - Variant60796, - Variant60797, - Variant60798, - Variant60799, - Variant60800, - Variant60801, - Variant60802, - Variant60803, - Variant60804, - Variant60805, - Variant60806, - Variant60807, - Variant60808, - Variant60809, - Variant60810, - Variant60811, - Variant60812, - Variant60813, - Variant60814, - Variant60815, - Variant60816, - Variant60817, - Variant60818, - Variant60819, - Variant60820, - Variant60821, - Variant60822, - Variant60823, - Variant60824, - Variant60825, - Variant60826, - Variant60827, - Variant60828, - Variant60829, - Variant60830, - Variant60831, - Variant60832, - Variant60833, - Variant60834, - Variant60835, - Variant60836, - Variant60837, - Variant60838, - Variant60839, - Variant60840, - Variant60841, - Variant60842, - Variant60843, - Variant60844, - Variant60845, - Variant60846, - Variant60847, - Variant60848, - Variant60849, - Variant60850, - Variant60851, - Variant60852, - Variant60853, - Variant60854, - Variant60855, - Variant60856, - Variant60857, - Variant60858, - Variant60859, - Variant60860, - Variant60861, - Variant60862, - Variant60863, - Variant60864, - Variant60865, - Variant60866, - Variant60867, - Variant60868, - Variant60869, - Variant60870, - Variant60871, - Variant60872, - Variant60873, - Variant60874, - Variant60875, - Variant60876, - Variant60877, - Variant60878, - Variant60879, - Variant60880, - Variant60881, - Variant60882, - Variant60883, - Variant60884, - Variant60885, - Variant60886, - Variant60887, - Variant60888, - Variant60889, - Variant60890, - Variant60891, - Variant60892, - Variant60893, - Variant60894, - Variant60895, - Variant60896, - Variant60897, - Variant60898, - Variant60899, - Variant60900, - Variant60901, - Variant60902, - Variant60903, - Variant60904, - Variant60905, - Variant60906, - Variant60907, - Variant60908, - Variant60909, - Variant60910, - Variant60911, - Variant60912, - Variant60913, - Variant60914, - Variant60915, - Variant60916, - Variant60917, - Variant60918, - Variant60919, - Variant60920, - Variant60921, - Variant60922, - Variant60923, - Variant60924, - Variant60925, - Variant60926, - Variant60927, - Variant60928, - Variant60929, - Variant60930, - Variant60931, - Variant60932, - Variant60933, - Variant60934, - Variant60935, - Variant60936, - Variant60937, - Variant60938, - Variant60939, - Variant60940, - Variant60941, - Variant60942, - Variant60943, - Variant60944, - Variant60945, - Variant60946, - Variant60947, - Variant60948, - Variant60949, - Variant60950, - Variant60951, - Variant60952, - Variant60953, - Variant60954, - Variant60955, - Variant60956, - Variant60957, - Variant60958, - Variant60959, - Variant60960, - Variant60961, - Variant60962, - Variant60963, - Variant60964, - Variant60965, - Variant60966, - Variant60967, - Variant60968, - Variant60969, - Variant60970, - Variant60971, - Variant60972, - Variant60973, - Variant60974, - Variant60975, - Variant60976, - Variant60977, - Variant60978, - Variant60979, - Variant60980, - Variant60981, - Variant60982, - Variant60983, - Variant60984, - Variant60985, - Variant60986, - Variant60987, - Variant60988, - Variant60989, - Variant60990, - Variant60991, - Variant60992, - Variant60993, - Variant60994, - Variant60995, - Variant60996, - Variant60997, - Variant60998, - Variant60999, - Variant61000, - Variant61001, - Variant61002, - Variant61003, - Variant61004, - Variant61005, - Variant61006, - Variant61007, - Variant61008, - Variant61009, - Variant61010, - Variant61011, - Variant61012, - Variant61013, - Variant61014, - Variant61015, - Variant61016, - Variant61017, - Variant61018, - Variant61019, - Variant61020, - Variant61021, - Variant61022, - Variant61023, - Variant61024, - Variant61025, - Variant61026, - Variant61027, - Variant61028, - Variant61029, - Variant61030, - Variant61031, - Variant61032, - Variant61033, - Variant61034, - Variant61035, - Variant61036, - Variant61037, - Variant61038, - Variant61039, - Variant61040, - Variant61041, - Variant61042, - Variant61043, - Variant61044, - Variant61045, - Variant61046, - Variant61047, - Variant61048, - Variant61049, - Variant61050, - Variant61051, - Variant61052, - Variant61053, - Variant61054, - Variant61055, - Variant61056, - Variant61057, - Variant61058, - Variant61059, - Variant61060, - Variant61061, - Variant61062, - Variant61063, - Variant61064, - Variant61065, - Variant61066, - Variant61067, - Variant61068, - Variant61069, - Variant61070, - Variant61071, - Variant61072, - Variant61073, - Variant61074, - Variant61075, - Variant61076, - Variant61077, - Variant61078, - Variant61079, - Variant61080, - Variant61081, - Variant61082, - Variant61083, - Variant61084, - Variant61085, - Variant61086, - Variant61087, - Variant61088, - Variant61089, - Variant61090, - Variant61091, - Variant61092, - Variant61093, - Variant61094, - Variant61095, - Variant61096, - Variant61097, - Variant61098, - Variant61099, - Variant61100, - Variant61101, - Variant61102, - Variant61103, - Variant61104, - Variant61105, - Variant61106, - Variant61107, - Variant61108, - Variant61109, - Variant61110, - Variant61111, - Variant61112, - Variant61113, - Variant61114, - Variant61115, - Variant61116, - Variant61117, - Variant61118, - Variant61119, - Variant61120, - Variant61121, - Variant61122, - Variant61123, - Variant61124, - Variant61125, - Variant61126, - Variant61127, - Variant61128, - Variant61129, - Variant61130, - Variant61131, - Variant61132, - Variant61133, - Variant61134, - Variant61135, - Variant61136, - Variant61137, - Variant61138, - Variant61139, - Variant61140, - Variant61141, - Variant61142, - Variant61143, - Variant61144, - Variant61145, - Variant61146, - Variant61147, - Variant61148, - Variant61149, - Variant61150, - Variant61151, - Variant61152, - Variant61153, - Variant61154, - Variant61155, - Variant61156, - Variant61157, - Variant61158, - Variant61159, - Variant61160, - Variant61161, - Variant61162, - Variant61163, - Variant61164, - Variant61165, - Variant61166, - Variant61167, - Variant61168, - Variant61169, - Variant61170, - Variant61171, - Variant61172, - Variant61173, - Variant61174, - Variant61175, - Variant61176, - Variant61177, - Variant61178, - Variant61179, - Variant61180, - Variant61181, - Variant61182, - Variant61183, - Variant61184, - Variant61185, - Variant61186, - Variant61187, - Variant61188, - Variant61189, - Variant61190, - Variant61191, - Variant61192, - Variant61193, - Variant61194, - Variant61195, - Variant61196, - Variant61197, - Variant61198, - Variant61199, - Variant61200, - Variant61201, - Variant61202, - Variant61203, - Variant61204, - Variant61205, - Variant61206, - Variant61207, - Variant61208, - Variant61209, - Variant61210, - Variant61211, - Variant61212, - Variant61213, - Variant61214, - Variant61215, - Variant61216, - Variant61217, - Variant61218, - Variant61219, - Variant61220, - Variant61221, - Variant61222, - Variant61223, - Variant61224, - Variant61225, - Variant61226, - Variant61227, - Variant61228, - Variant61229, - Variant61230, - Variant61231, - Variant61232, - Variant61233, - Variant61234, - Variant61235, - Variant61236, - Variant61237, - Variant61238, - Variant61239, - Variant61240, - Variant61241, - Variant61242, - Variant61243, - Variant61244, - Variant61245, - Variant61246, - Variant61247, - Variant61248, - Variant61249, - Variant61250, - Variant61251, - Variant61252, - Variant61253, - Variant61254, - Variant61255, - Variant61256, - Variant61257, - Variant61258, - Variant61259, - Variant61260, - Variant61261, - Variant61262, - Variant61263, - Variant61264, - Variant61265, - Variant61266, - Variant61267, - Variant61268, - Variant61269, - Variant61270, - Variant61271, - Variant61272, - Variant61273, - Variant61274, - Variant61275, - Variant61276, - Variant61277, - Variant61278, - Variant61279, - Variant61280, - Variant61281, - Variant61282, - Variant61283, - Variant61284, - Variant61285, - Variant61286, - Variant61287, - Variant61288, - Variant61289, - Variant61290, - Variant61291, - Variant61292, - Variant61293, - Variant61294, - Variant61295, - Variant61296, - Variant61297, - Variant61298, - Variant61299, - Variant61300, - Variant61301, - Variant61302, - Variant61303, - Variant61304, - Variant61305, - Variant61306, - Variant61307, - Variant61308, - Variant61309, - Variant61310, - Variant61311, - Variant61312, - Variant61313, - Variant61314, - Variant61315, - Variant61316, - Variant61317, - Variant61318, - Variant61319, - Variant61320, - Variant61321, - Variant61322, - Variant61323, - Variant61324, - Variant61325, - Variant61326, - Variant61327, - Variant61328, - Variant61329, - Variant61330, - Variant61331, - Variant61332, - Variant61333, - Variant61334, - Variant61335, - Variant61336, - Variant61337, - Variant61338, - Variant61339, - Variant61340, - Variant61341, - Variant61342, - Variant61343, - Variant61344, - Variant61345, - Variant61346, - Variant61347, - Variant61348, - Variant61349, - Variant61350, - Variant61351, - Variant61352, - Variant61353, - Variant61354, - Variant61355, - Variant61356, - Variant61357, - Variant61358, - Variant61359, - Variant61360, - Variant61361, - Variant61362, - Variant61363, - Variant61364, - Variant61365, - Variant61366, - Variant61367, - Variant61368, - Variant61369, - Variant61370, - Variant61371, - Variant61372, - Variant61373, - Variant61374, - Variant61375, - Variant61376, - Variant61377, - Variant61378, - Variant61379, - Variant61380, - Variant61381, - Variant61382, - Variant61383, - Variant61384, - Variant61385, - Variant61386, - Variant61387, - Variant61388, - Variant61389, - Variant61390, - Variant61391, - Variant61392, - Variant61393, - Variant61394, - Variant61395, - Variant61396, - Variant61397, - Variant61398, - Variant61399, - Variant61400, - Variant61401, - Variant61402, - Variant61403, - Variant61404, - Variant61405, - Variant61406, - Variant61407, - Variant61408, - Variant61409, - Variant61410, - Variant61411, - Variant61412, - Variant61413, - Variant61414, - Variant61415, - Variant61416, - Variant61417, - Variant61418, - Variant61419, - Variant61420, - Variant61421, - Variant61422, - Variant61423, - Variant61424, - Variant61425, - Variant61426, - Variant61427, - Variant61428, - Variant61429, - Variant61430, - Variant61431, - Variant61432, - Variant61433, - Variant61434, - Variant61435, - Variant61436, - Variant61437, - Variant61438, - Variant61439, - Variant61440, - Variant61441, - Variant61442, - Variant61443, - Variant61444, - Variant61445, - Variant61446, - Variant61447, - Variant61448, - Variant61449, - Variant61450, - Variant61451, - Variant61452, - Variant61453, - Variant61454, - Variant61455, - Variant61456, - Variant61457, - Variant61458, - Variant61459, - Variant61460, - Variant61461, - Variant61462, - Variant61463, - Variant61464, - Variant61465, - Variant61466, - Variant61467, - Variant61468, - Variant61469, - Variant61470, - Variant61471, - Variant61472, - Variant61473, - Variant61474, - Variant61475, - Variant61476, - Variant61477, - Variant61478, - Variant61479, - Variant61480, - Variant61481, - Variant61482, - Variant61483, - Variant61484, - Variant61485, - Variant61486, - Variant61487, - Variant61488, - Variant61489, - Variant61490, - Variant61491, - Variant61492, - Variant61493, - Variant61494, - Variant61495, - Variant61496, - Variant61497, - Variant61498, - Variant61499, - Variant61500, - Variant61501, - Variant61502, - Variant61503, - Variant61504, - Variant61505, - Variant61506, - Variant61507, - Variant61508, - Variant61509, - Variant61510, - Variant61511, - Variant61512, - Variant61513, - Variant61514, - Variant61515, - Variant61516, - Variant61517, - Variant61518, - Variant61519, - Variant61520, - Variant61521, - Variant61522, - Variant61523, - Variant61524, - Variant61525, - Variant61526, - Variant61527, - Variant61528, - Variant61529, - Variant61530, - Variant61531, - Variant61532, - Variant61533, - Variant61534, - Variant61535, - Variant61536, - Variant61537, - Variant61538, - Variant61539, - Variant61540, - Variant61541, - Variant61542, - Variant61543, - Variant61544, - Variant61545, - Variant61546, - Variant61547, - Variant61548, - Variant61549, - Variant61550, - Variant61551, - Variant61552, - Variant61553, - Variant61554, - Variant61555, - Variant61556, - Variant61557, - Variant61558, - Variant61559, - Variant61560, - Variant61561, - Variant61562, - Variant61563, - Variant61564, - Variant61565, - Variant61566, - Variant61567, - Variant61568, - Variant61569, - Variant61570, - Variant61571, - Variant61572, - Variant61573, - Variant61574, - Variant61575, - Variant61576, - Variant61577, - Variant61578, - Variant61579, - Variant61580, - Variant61581, - Variant61582, - Variant61583, - Variant61584, - Variant61585, - Variant61586, - Variant61587, - Variant61588, - Variant61589, - Variant61590, - Variant61591, - Variant61592, - Variant61593, - Variant61594, - Variant61595, - Variant61596, - Variant61597, - Variant61598, - Variant61599, - Variant61600, - Variant61601, - Variant61602, - Variant61603, - Variant61604, - Variant61605, - Variant61606, - Variant61607, - Variant61608, - Variant61609, - Variant61610, - Variant61611, - Variant61612, - Variant61613, - Variant61614, - Variant61615, - Variant61616, - Variant61617, - Variant61618, - Variant61619, - Variant61620, - Variant61621, - Variant61622, - Variant61623, - Variant61624, - Variant61625, - Variant61626, - Variant61627, - Variant61628, - Variant61629, - Variant61630, - Variant61631, - Variant61632, - Variant61633, - Variant61634, - Variant61635, - Variant61636, - Variant61637, - Variant61638, - Variant61639, - Variant61640, - Variant61641, - Variant61642, - Variant61643, - Variant61644, - Variant61645, - Variant61646, - Variant61647, - Variant61648, - Variant61649, - Variant61650, - Variant61651, - Variant61652, - Variant61653, - Variant61654, - Variant61655, - Variant61656, - Variant61657, - Variant61658, - Variant61659, - Variant61660, - Variant61661, - Variant61662, - Variant61663, - Variant61664, - Variant61665, - Variant61666, - Variant61667, - Variant61668, - Variant61669, - Variant61670, - Variant61671, - Variant61672, - Variant61673, - Variant61674, - Variant61675, - Variant61676, - Variant61677, - Variant61678, - Variant61679, - Variant61680, - Variant61681, - Variant61682, - Variant61683, - Variant61684, - Variant61685, - Variant61686, - Variant61687, - Variant61688, - Variant61689, - Variant61690, - Variant61691, - Variant61692, - Variant61693, - Variant61694, - Variant61695, - Variant61696, - Variant61697, - Variant61698, - Variant61699, - Variant61700, - Variant61701, - Variant61702, - Variant61703, - Variant61704, - Variant61705, - Variant61706, - Variant61707, - Variant61708, - Variant61709, - Variant61710, - Variant61711, - Variant61712, - Variant61713, - Variant61714, - Variant61715, - Variant61716, - Variant61717, - Variant61718, - Variant61719, - Variant61720, - Variant61721, - Variant61722, - Variant61723, - Variant61724, - Variant61725, - Variant61726, - Variant61727, - Variant61728, - Variant61729, - Variant61730, - Variant61731, - Variant61732, - Variant61733, - Variant61734, - Variant61735, - Variant61736, - Variant61737, - Variant61738, - Variant61739, - Variant61740, - Variant61741, - Variant61742, - Variant61743, - Variant61744, - Variant61745, - Variant61746, - Variant61747, - Variant61748, - Variant61749, - Variant61750, - Variant61751, - Variant61752, - Variant61753, - Variant61754, - Variant61755, - Variant61756, - Variant61757, - Variant61758, - Variant61759, - Variant61760, - Variant61761, - Variant61762, - Variant61763, - Variant61764, - Variant61765, - Variant61766, - Variant61767, - Variant61768, - Variant61769, - Variant61770, - Variant61771, - Variant61772, - Variant61773, - Variant61774, - Variant61775, - Variant61776, - Variant61777, - Variant61778, - Variant61779, - Variant61780, - Variant61781, - Variant61782, - Variant61783, - Variant61784, - Variant61785, - Variant61786, - Variant61787, - Variant61788, - Variant61789, - Variant61790, - Variant61791, - Variant61792, - Variant61793, - Variant61794, - Variant61795, - Variant61796, - Variant61797, - Variant61798, - Variant61799, - Variant61800, - Variant61801, - Variant61802, - Variant61803, - Variant61804, - Variant61805, - Variant61806, - Variant61807, - Variant61808, - Variant61809, - Variant61810, - Variant61811, - Variant61812, - Variant61813, - Variant61814, - Variant61815, - Variant61816, - Variant61817, - Variant61818, - Variant61819, - Variant61820, - Variant61821, - Variant61822, - Variant61823, - Variant61824, - Variant61825, - Variant61826, - Variant61827, - Variant61828, - Variant61829, - Variant61830, - Variant61831, - Variant61832, - Variant61833, - Variant61834, - Variant61835, - Variant61836, - Variant61837, - Variant61838, - Variant61839, - Variant61840, - Variant61841, - Variant61842, - Variant61843, - Variant61844, - Variant61845, - Variant61846, - Variant61847, - Variant61848, - Variant61849, - Variant61850, - Variant61851, - Variant61852, - Variant61853, - Variant61854, - Variant61855, - Variant61856, - Variant61857, - Variant61858, - Variant61859, - Variant61860, - Variant61861, - Variant61862, - Variant61863, - Variant61864, - Variant61865, - Variant61866, - Variant61867, - Variant61868, - Variant61869, - Variant61870, - Variant61871, - Variant61872, - Variant61873, - Variant61874, - Variant61875, - Variant61876, - Variant61877, - Variant61878, - Variant61879, - Variant61880, - Variant61881, - Variant61882, - Variant61883, - Variant61884, - Variant61885, - Variant61886, - Variant61887, - Variant61888, - Variant61889, - Variant61890, - Variant61891, - Variant61892, - Variant61893, - Variant61894, - Variant61895, - Variant61896, - Variant61897, - Variant61898, - Variant61899, - Variant61900, - Variant61901, - Variant61902, - Variant61903, - Variant61904, - Variant61905, - Variant61906, - Variant61907, - Variant61908, - Variant61909, - Variant61910, - Variant61911, - Variant61912, - Variant61913, - Variant61914, - Variant61915, - Variant61916, - Variant61917, - Variant61918, - Variant61919, - Variant61920, - Variant61921, - Variant61922, - Variant61923, - Variant61924, - Variant61925, - Variant61926, - Variant61927, - Variant61928, - Variant61929, - Variant61930, - Variant61931, - Variant61932, - Variant61933, - Variant61934, - Variant61935, - Variant61936, - Variant61937, - Variant61938, - Variant61939, - Variant61940, - Variant61941, - Variant61942, - Variant61943, - Variant61944, - Variant61945, - Variant61946, - Variant61947, - Variant61948, - Variant61949, - Variant61950, - Variant61951, - Variant61952, - Variant61953, - Variant61954, - Variant61955, - Variant61956, - Variant61957, - Variant61958, - Variant61959, - Variant61960, - Variant61961, - Variant61962, - Variant61963, - Variant61964, - Variant61965, - Variant61966, - Variant61967, - Variant61968, - Variant61969, - Variant61970, - Variant61971, - Variant61972, - Variant61973, - Variant61974, - Variant61975, - Variant61976, - Variant61977, - Variant61978, - Variant61979, - Variant61980, - Variant61981, - Variant61982, - Variant61983, - Variant61984, - Variant61985, - Variant61986, - Variant61987, - Variant61988, - Variant61989, - Variant61990, - Variant61991, - Variant61992, - Variant61993, - Variant61994, - Variant61995, - Variant61996, - Variant61997, - Variant61998, - Variant61999, - Variant62000, - Variant62001, - Variant62002, - Variant62003, - Variant62004, - Variant62005, - Variant62006, - Variant62007, - Variant62008, - Variant62009, - Variant62010, - Variant62011, - Variant62012, - Variant62013, - Variant62014, - Variant62015, - Variant62016, - Variant62017, - Variant62018, - Variant62019, - Variant62020, - Variant62021, - Variant62022, - Variant62023, - Variant62024, - Variant62025, - Variant62026, - Variant62027, - Variant62028, - Variant62029, - Variant62030, - Variant62031, - Variant62032, - Variant62033, - Variant62034, - Variant62035, - Variant62036, - Variant62037, - Variant62038, - Variant62039, - Variant62040, - Variant62041, - Variant62042, - Variant62043, - Variant62044, - Variant62045, - Variant62046, - Variant62047, - Variant62048, - Variant62049, - Variant62050, - Variant62051, - Variant62052, - Variant62053, - Variant62054, - Variant62055, - Variant62056, - Variant62057, - Variant62058, - Variant62059, - Variant62060, - Variant62061, - Variant62062, - Variant62063, - Variant62064, - Variant62065, - Variant62066, - Variant62067, - Variant62068, - Variant62069, - Variant62070, - Variant62071, - Variant62072, - Variant62073, - Variant62074, - Variant62075, - Variant62076, - Variant62077, - Variant62078, - Variant62079, - Variant62080, - Variant62081, - Variant62082, - Variant62083, - Variant62084, - Variant62085, - Variant62086, - Variant62087, - Variant62088, - Variant62089, - Variant62090, - Variant62091, - Variant62092, - Variant62093, - Variant62094, - Variant62095, - Variant62096, - Variant62097, - Variant62098, - Variant62099, - Variant62100, - Variant62101, - Variant62102, - Variant62103, - Variant62104, - Variant62105, - Variant62106, - Variant62107, - Variant62108, - Variant62109, - Variant62110, - Variant62111, - Variant62112, - Variant62113, - Variant62114, - Variant62115, - Variant62116, - Variant62117, - Variant62118, - Variant62119, - Variant62120, - Variant62121, - Variant62122, - Variant62123, - Variant62124, - Variant62125, - Variant62126, - Variant62127, - Variant62128, - Variant62129, - Variant62130, - Variant62131, - Variant62132, - Variant62133, - Variant62134, - Variant62135, - Variant62136, - Variant62137, - Variant62138, - Variant62139, - Variant62140, - Variant62141, - Variant62142, - Variant62143, - Variant62144, - Variant62145, - Variant62146, - Variant62147, - Variant62148, - Variant62149, - Variant62150, - Variant62151, - Variant62152, - Variant62153, - Variant62154, - Variant62155, - Variant62156, - Variant62157, - Variant62158, - Variant62159, - Variant62160, - Variant62161, - Variant62162, - Variant62163, - Variant62164, - Variant62165, - Variant62166, - Variant62167, - Variant62168, - Variant62169, - Variant62170, - Variant62171, - Variant62172, - Variant62173, - Variant62174, - Variant62175, - Variant62176, - Variant62177, - Variant62178, - Variant62179, - Variant62180, - Variant62181, - Variant62182, - Variant62183, - Variant62184, - Variant62185, - Variant62186, - Variant62187, - Variant62188, - Variant62189, - Variant62190, - Variant62191, - Variant62192, - Variant62193, - Variant62194, - Variant62195, - Variant62196, - Variant62197, - Variant62198, - Variant62199, - Variant62200, - Variant62201, - Variant62202, - Variant62203, - Variant62204, - Variant62205, - Variant62206, - Variant62207, - Variant62208, - Variant62209, - Variant62210, - Variant62211, - Variant62212, - Variant62213, - Variant62214, - Variant62215, - Variant62216, - Variant62217, - Variant62218, - Variant62219, - Variant62220, - Variant62221, - Variant62222, - Variant62223, - Variant62224, - Variant62225, - Variant62226, - Variant62227, - Variant62228, - Variant62229, - Variant62230, - Variant62231, - Variant62232, - Variant62233, - Variant62234, - Variant62235, - Variant62236, - Variant62237, - Variant62238, - Variant62239, - Variant62240, - Variant62241, - Variant62242, - Variant62243, - Variant62244, - Variant62245, - Variant62246, - Variant62247, - Variant62248, - Variant62249, - Variant62250, - Variant62251, - Variant62252, - Variant62253, - Variant62254, - Variant62255, - Variant62256, - Variant62257, - Variant62258, - Variant62259, - Variant62260, - Variant62261, - Variant62262, - Variant62263, - Variant62264, - Variant62265, - Variant62266, - Variant62267, - Variant62268, - Variant62269, - Variant62270, - Variant62271, - Variant62272, - Variant62273, - Variant62274, - Variant62275, - Variant62276, - Variant62277, - Variant62278, - Variant62279, - Variant62280, - Variant62281, - Variant62282, - Variant62283, - Variant62284, - Variant62285, - Variant62286, - Variant62287, - Variant62288, - Variant62289, - Variant62290, - Variant62291, - Variant62292, - Variant62293, - Variant62294, - Variant62295, - Variant62296, - Variant62297, - Variant62298, - Variant62299, - Variant62300, - Variant62301, - Variant62302, - Variant62303, - Variant62304, - Variant62305, - Variant62306, - Variant62307, - Variant62308, - Variant62309, - Variant62310, - Variant62311, - Variant62312, - Variant62313, - Variant62314, - Variant62315, - Variant62316, - Variant62317, - Variant62318, - Variant62319, - Variant62320, - Variant62321, - Variant62322, - Variant62323, - Variant62324, - Variant62325, - Variant62326, - Variant62327, - Variant62328, - Variant62329, - Variant62330, - Variant62331, - Variant62332, - Variant62333, - Variant62334, - Variant62335, - Variant62336, - Variant62337, - Variant62338, - Variant62339, - Variant62340, - Variant62341, - Variant62342, - Variant62343, - Variant62344, - Variant62345, - Variant62346, - Variant62347, - Variant62348, - Variant62349, - Variant62350, - Variant62351, - Variant62352, - Variant62353, - Variant62354, - Variant62355, - Variant62356, - Variant62357, - Variant62358, - Variant62359, - Variant62360, - Variant62361, - Variant62362, - Variant62363, - Variant62364, - Variant62365, - Variant62366, - Variant62367, - Variant62368, - Variant62369, - Variant62370, - Variant62371, - Variant62372, - Variant62373, - Variant62374, - Variant62375, - Variant62376, - Variant62377, - Variant62378, - Variant62379, - Variant62380, - Variant62381, - Variant62382, - Variant62383, - Variant62384, - Variant62385, - Variant62386, - Variant62387, - Variant62388, - Variant62389, - Variant62390, - Variant62391, - Variant62392, - Variant62393, - Variant62394, - Variant62395, - Variant62396, - Variant62397, - Variant62398, - Variant62399, - Variant62400, - Variant62401, - Variant62402, - Variant62403, - Variant62404, - Variant62405, - Variant62406, - Variant62407, - Variant62408, - Variant62409, - Variant62410, - Variant62411, - Variant62412, - Variant62413, - Variant62414, - Variant62415, - Variant62416, - Variant62417, - Variant62418, - Variant62419, - Variant62420, - Variant62421, - Variant62422, - Variant62423, - Variant62424, - Variant62425, - Variant62426, - Variant62427, - Variant62428, - Variant62429, - Variant62430, - Variant62431, - Variant62432, - Variant62433, - Variant62434, - Variant62435, - Variant62436, - Variant62437, - Variant62438, - Variant62439, - Variant62440, - Variant62441, - Variant62442, - Variant62443, - Variant62444, - Variant62445, - Variant62446, - Variant62447, - Variant62448, - Variant62449, - Variant62450, - Variant62451, - Variant62452, - Variant62453, - Variant62454, - Variant62455, - Variant62456, - Variant62457, - Variant62458, - Variant62459, - Variant62460, - Variant62461, - Variant62462, - Variant62463, - Variant62464, - Variant62465, - Variant62466, - Variant62467, - Variant62468, - Variant62469, - Variant62470, - Variant62471, - Variant62472, - Variant62473, - Variant62474, - Variant62475, - Variant62476, - Variant62477, - Variant62478, - Variant62479, - Variant62480, - Variant62481, - Variant62482, - Variant62483, - Variant62484, - Variant62485, - Variant62486, - Variant62487, - Variant62488, - Variant62489, - Variant62490, - Variant62491, - Variant62492, - Variant62493, - Variant62494, - Variant62495, - Variant62496, - Variant62497, - Variant62498, - Variant62499, - Variant62500, - Variant62501, - Variant62502, - Variant62503, - Variant62504, - Variant62505, - Variant62506, - Variant62507, - Variant62508, - Variant62509, - Variant62510, - Variant62511, - Variant62512, - Variant62513, - Variant62514, - Variant62515, - Variant62516, - Variant62517, - Variant62518, - Variant62519, - Variant62520, - Variant62521, - Variant62522, - Variant62523, - Variant62524, - Variant62525, - Variant62526, - Variant62527, - Variant62528, - Variant62529, - Variant62530, - Variant62531, - Variant62532, - Variant62533, - Variant62534, - Variant62535, - Variant62536, - Variant62537, - Variant62538, - Variant62539, - Variant62540, - Variant62541, - Variant62542, - Variant62543, - Variant62544, - Variant62545, - Variant62546, - Variant62547, - Variant62548, - Variant62549, - Variant62550, - Variant62551, - Variant62552, - Variant62553, - Variant62554, - Variant62555, - Variant62556, - Variant62557, - Variant62558, - Variant62559, - Variant62560, - Variant62561, - Variant62562, - Variant62563, - Variant62564, - Variant62565, - Variant62566, - Variant62567, - Variant62568, - Variant62569, - Variant62570, - Variant62571, - Variant62572, - Variant62573, - Variant62574, - Variant62575, - Variant62576, - Variant62577, - Variant62578, - Variant62579, - Variant62580, - Variant62581, - Variant62582, - Variant62583, - Variant62584, - Variant62585, - Variant62586, - Variant62587, - Variant62588, - Variant62589, - Variant62590, - Variant62591, - Variant62592, - Variant62593, - Variant62594, - Variant62595, - Variant62596, - Variant62597, - Variant62598, - Variant62599, - Variant62600, - Variant62601, - Variant62602, - Variant62603, - Variant62604, - Variant62605, - Variant62606, - Variant62607, - Variant62608, - Variant62609, - Variant62610, - Variant62611, - Variant62612, - Variant62613, - Variant62614, - Variant62615, - Variant62616, - Variant62617, - Variant62618, - Variant62619, - Variant62620, - Variant62621, - Variant62622, - Variant62623, - Variant62624, - Variant62625, - Variant62626, - Variant62627, - Variant62628, - Variant62629, - Variant62630, - Variant62631, - Variant62632, - Variant62633, - Variant62634, - Variant62635, - Variant62636, - Variant62637, - Variant62638, - Variant62639, - Variant62640, - Variant62641, - Variant62642, - Variant62643, - Variant62644, - Variant62645, - Variant62646, - Variant62647, - Variant62648, - Variant62649, - Variant62650, - Variant62651, - Variant62652, - Variant62653, - Variant62654, - Variant62655, - Variant62656, - Variant62657, - Variant62658, - Variant62659, - Variant62660, - Variant62661, - Variant62662, - Variant62663, - Variant62664, - Variant62665, - Variant62666, - Variant62667, - Variant62668, - Variant62669, - Variant62670, - Variant62671, - Variant62672, - Variant62673, - Variant62674, - Variant62675, - Variant62676, - Variant62677, - Variant62678, - Variant62679, - Variant62680, - Variant62681, - Variant62682, - Variant62683, - Variant62684, - Variant62685, - Variant62686, - Variant62687, - Variant62688, - Variant62689, - Variant62690, - Variant62691, - Variant62692, - Variant62693, - Variant62694, - Variant62695, - Variant62696, - Variant62697, - Variant62698, - Variant62699, - Variant62700, - Variant62701, - Variant62702, - Variant62703, - Variant62704, - Variant62705, - Variant62706, - Variant62707, - Variant62708, - Variant62709, - Variant62710, - Variant62711, - Variant62712, - Variant62713, - Variant62714, - Variant62715, - Variant62716, - Variant62717, - Variant62718, - Variant62719, - Variant62720, - Variant62721, - Variant62722, - Variant62723, - Variant62724, - Variant62725, - Variant62726, - Variant62727, - Variant62728, - Variant62729, - Variant62730, - Variant62731, - Variant62732, - Variant62733, - Variant62734, - Variant62735, - Variant62736, - Variant62737, - Variant62738, - Variant62739, - Variant62740, - Variant62741, - Variant62742, - Variant62743, - Variant62744, - Variant62745, - Variant62746, - Variant62747, - Variant62748, - Variant62749, - Variant62750, - Variant62751, - Variant62752, - Variant62753, - Variant62754, - Variant62755, - Variant62756, - Variant62757, - Variant62758, - Variant62759, - Variant62760, - Variant62761, - Variant62762, - Variant62763, - Variant62764, - Variant62765, - Variant62766, - Variant62767, - Variant62768, - Variant62769, - Variant62770, - Variant62771, - Variant62772, - Variant62773, - Variant62774, - Variant62775, - Variant62776, - Variant62777, - Variant62778, - Variant62779, - Variant62780, - Variant62781, - Variant62782, - Variant62783, - Variant62784, - Variant62785, - Variant62786, - Variant62787, - Variant62788, - Variant62789, - Variant62790, - Variant62791, - Variant62792, - Variant62793, - Variant62794, - Variant62795, - Variant62796, - Variant62797, - Variant62798, - Variant62799, - Variant62800, - Variant62801, - Variant62802, - Variant62803, - Variant62804, - Variant62805, - Variant62806, - Variant62807, - Variant62808, - Variant62809, - Variant62810, - Variant62811, - Variant62812, - Variant62813, - Variant62814, - Variant62815, - Variant62816, - Variant62817, - Variant62818, - Variant62819, - Variant62820, - Variant62821, - Variant62822, - Variant62823, - Variant62824, - Variant62825, - Variant62826, - Variant62827, - Variant62828, - Variant62829, - Variant62830, - Variant62831, - Variant62832, - Variant62833, - Variant62834, - Variant62835, - Variant62836, - Variant62837, - Variant62838, - Variant62839, - Variant62840, - Variant62841, - Variant62842, - Variant62843, - Variant62844, - Variant62845, - Variant62846, - Variant62847, - Variant62848, - Variant62849, - Variant62850, - Variant62851, - Variant62852, - Variant62853, - Variant62854, - Variant62855, - Variant62856, - Variant62857, - Variant62858, - Variant62859, - Variant62860, - Variant62861, - Variant62862, - Variant62863, - Variant62864, - Variant62865, - Variant62866, - Variant62867, - Variant62868, - Variant62869, - Variant62870, - Variant62871, - Variant62872, - Variant62873, - Variant62874, - Variant62875, - Variant62876, - Variant62877, - Variant62878, - Variant62879, - Variant62880, - Variant62881, - Variant62882, - Variant62883, - Variant62884, - Variant62885, - Variant62886, - Variant62887, - Variant62888, - Variant62889, - Variant62890, - Variant62891, - Variant62892, - Variant62893, - Variant62894, - Variant62895, - Variant62896, - Variant62897, - Variant62898, - Variant62899, - Variant62900, - Variant62901, - Variant62902, - Variant62903, - Variant62904, - Variant62905, - Variant62906, - Variant62907, - Variant62908, - Variant62909, - Variant62910, - Variant62911, - Variant62912, - Variant62913, - Variant62914, - Variant62915, - Variant62916, - Variant62917, - Variant62918, - Variant62919, - Variant62920, - Variant62921, - Variant62922, - Variant62923, - Variant62924, - Variant62925, - Variant62926, - Variant62927, - Variant62928, - Variant62929, - Variant62930, - Variant62931, - Variant62932, - Variant62933, - Variant62934, - Variant62935, - Variant62936, - Variant62937, - Variant62938, - Variant62939, - Variant62940, - Variant62941, - Variant62942, - Variant62943, - Variant62944, - Variant62945, - Variant62946, - Variant62947, - Variant62948, - Variant62949, - Variant62950, - Variant62951, - Variant62952, - Variant62953, - Variant62954, - Variant62955, - Variant62956, - Variant62957, - Variant62958, - Variant62959, - Variant62960, - Variant62961, - Variant62962, - Variant62963, - Variant62964, - Variant62965, - Variant62966, - Variant62967, - Variant62968, - Variant62969, - Variant62970, - Variant62971, - Variant62972, - Variant62973, - Variant62974, - Variant62975, - Variant62976, - Variant62977, - Variant62978, - Variant62979, - Variant62980, - Variant62981, - Variant62982, - Variant62983, - Variant62984, - Variant62985, - Variant62986, - Variant62987, - Variant62988, - Variant62989, - Variant62990, - Variant62991, - Variant62992, - Variant62993, - Variant62994, - Variant62995, - Variant62996, - Variant62997, - Variant62998, - Variant62999, - Variant63000, - Variant63001, - Variant63002, - Variant63003, - Variant63004, - Variant63005, - Variant63006, - Variant63007, - Variant63008, - Variant63009, - Variant63010, - Variant63011, - Variant63012, - Variant63013, - Variant63014, - Variant63015, - Variant63016, - Variant63017, - Variant63018, - Variant63019, - Variant63020, - Variant63021, - Variant63022, - Variant63023, - Variant63024, - Variant63025, - Variant63026, - Variant63027, - Variant63028, - Variant63029, - Variant63030, - Variant63031, - Variant63032, - Variant63033, - Variant63034, - Variant63035, - Variant63036, - Variant63037, - Variant63038, - Variant63039, - Variant63040, - Variant63041, - Variant63042, - Variant63043, - Variant63044, - Variant63045, - Variant63046, - Variant63047, - Variant63048, - Variant63049, - Variant63050, - Variant63051, - Variant63052, - Variant63053, - Variant63054, - Variant63055, - Variant63056, - Variant63057, - Variant63058, - Variant63059, - Variant63060, - Variant63061, - Variant63062, - Variant63063, - Variant63064, - Variant63065, - Variant63066, - Variant63067, - Variant63068, - Variant63069, - Variant63070, - Variant63071, - Variant63072, - Variant63073, - Variant63074, - Variant63075, - Variant63076, - Variant63077, - Variant63078, - Variant63079, - Variant63080, - Variant63081, - Variant63082, - Variant63083, - Variant63084, - Variant63085, - Variant63086, - Variant63087, - Variant63088, - Variant63089, - Variant63090, - Variant63091, - Variant63092, - Variant63093, - Variant63094, - Variant63095, - Variant63096, - Variant63097, - Variant63098, - Variant63099, - Variant63100, - Variant63101, - Variant63102, - Variant63103, - Variant63104, - Variant63105, - Variant63106, - Variant63107, - Variant63108, - Variant63109, - Variant63110, - Variant63111, - Variant63112, - Variant63113, - Variant63114, - Variant63115, - Variant63116, - Variant63117, - Variant63118, - Variant63119, - Variant63120, - Variant63121, - Variant63122, - Variant63123, - Variant63124, - Variant63125, - Variant63126, - Variant63127, - Variant63128, - Variant63129, - Variant63130, - Variant63131, - Variant63132, - Variant63133, - Variant63134, - Variant63135, - Variant63136, - Variant63137, - Variant63138, - Variant63139, - Variant63140, - Variant63141, - Variant63142, - Variant63143, - Variant63144, - Variant63145, - Variant63146, - Variant63147, - Variant63148, - Variant63149, - Variant63150, - Variant63151, - Variant63152, - Variant63153, - Variant63154, - Variant63155, - Variant63156, - Variant63157, - Variant63158, - Variant63159, - Variant63160, - Variant63161, - Variant63162, - Variant63163, - Variant63164, - Variant63165, - Variant63166, - Variant63167, - Variant63168, - Variant63169, - Variant63170, - Variant63171, - Variant63172, - Variant63173, - Variant63174, - Variant63175, - Variant63176, - Variant63177, - Variant63178, - Variant63179, - Variant63180, - Variant63181, - Variant63182, - Variant63183, - Variant63184, - Variant63185, - Variant63186, - Variant63187, - Variant63188, - Variant63189, - Variant63190, - Variant63191, - Variant63192, - Variant63193, - Variant63194, - Variant63195, - Variant63196, - Variant63197, - Variant63198, - Variant63199, - Variant63200, - Variant63201, - Variant63202, - Variant63203, - Variant63204, - Variant63205, - Variant63206, - Variant63207, - Variant63208, - Variant63209, - Variant63210, - Variant63211, - Variant63212, - Variant63213, - Variant63214, - Variant63215, - Variant63216, - Variant63217, - Variant63218, - Variant63219, - Variant63220, - Variant63221, - Variant63222, - Variant63223, - Variant63224, - Variant63225, - Variant63226, - Variant63227, - Variant63228, - Variant63229, - Variant63230, - Variant63231, - Variant63232, - Variant63233, - Variant63234, - Variant63235, - Variant63236, - Variant63237, - Variant63238, - Variant63239, - Variant63240, - Variant63241, - Variant63242, - Variant63243, - Variant63244, - Variant63245, - Variant63246, - Variant63247, - Variant63248, - Variant63249, - Variant63250, - Variant63251, - Variant63252, - Variant63253, - Variant63254, - Variant63255, - Variant63256, - Variant63257, - Variant63258, - Variant63259, - Variant63260, - Variant63261, - Variant63262, - Variant63263, - Variant63264, - Variant63265, - Variant63266, - Variant63267, - Variant63268, - Variant63269, - Variant63270, - Variant63271, - Variant63272, - Variant63273, - Variant63274, - Variant63275, - Variant63276, - Variant63277, - Variant63278, - Variant63279, - Variant63280, - Variant63281, - Variant63282, - Variant63283, - Variant63284, - Variant63285, - Variant63286, - Variant63287, - Variant63288, - Variant63289, - Variant63290, - Variant63291, - Variant63292, - Variant63293, - Variant63294, - Variant63295, - Variant63296, - Variant63297, - Variant63298, - Variant63299, - Variant63300, - Variant63301, - Variant63302, - Variant63303, - Variant63304, - Variant63305, - Variant63306, - Variant63307, - Variant63308, - Variant63309, - Variant63310, - Variant63311, - Variant63312, - Variant63313, - Variant63314, - Variant63315, - Variant63316, - Variant63317, - Variant63318, - Variant63319, - Variant63320, - Variant63321, - Variant63322, - Variant63323, - Variant63324, - Variant63325, - Variant63326, - Variant63327, - Variant63328, - Variant63329, - Variant63330, - Variant63331, - Variant63332, - Variant63333, - Variant63334, - Variant63335, - Variant63336, - Variant63337, - Variant63338, - Variant63339, - Variant63340, - Variant63341, - Variant63342, - Variant63343, - Variant63344, - Variant63345, - Variant63346, - Variant63347, - Variant63348, - Variant63349, - Variant63350, - Variant63351, - Variant63352, - Variant63353, - Variant63354, - Variant63355, - Variant63356, - Variant63357, - Variant63358, - Variant63359, - Variant63360, - Variant63361, - Variant63362, - Variant63363, - Variant63364, - Variant63365, - Variant63366, - Variant63367, - Variant63368, - Variant63369, - Variant63370, - Variant63371, - Variant63372, - Variant63373, - Variant63374, - Variant63375, - Variant63376, - Variant63377, - Variant63378, - Variant63379, - Variant63380, - Variant63381, - Variant63382, - Variant63383, - Variant63384, - Variant63385, - Variant63386, - Variant63387, - Variant63388, - Variant63389, - Variant63390, - Variant63391, - Variant63392, - Variant63393, - Variant63394, - Variant63395, - Variant63396, - Variant63397, - Variant63398, - Variant63399, - Variant63400, - Variant63401, - Variant63402, - Variant63403, - Variant63404, - Variant63405, - Variant63406, - Variant63407, - Variant63408, - Variant63409, - Variant63410, - Variant63411, - Variant63412, - Variant63413, - Variant63414, - Variant63415, - Variant63416, - Variant63417, - Variant63418, - Variant63419, - Variant63420, - Variant63421, - Variant63422, - Variant63423, - Variant63424, - Variant63425, - Variant63426, - Variant63427, - Variant63428, - Variant63429, - Variant63430, - Variant63431, - Variant63432, - Variant63433, - Variant63434, - Variant63435, - Variant63436, - Variant63437, - Variant63438, - Variant63439, - Variant63440, - Variant63441, - Variant63442, - Variant63443, - Variant63444, - Variant63445, - Variant63446, - Variant63447, - Variant63448, - Variant63449, - Variant63450, - Variant63451, - Variant63452, - Variant63453, - Variant63454, - Variant63455, - Variant63456, - Variant63457, - Variant63458, - Variant63459, - Variant63460, - Variant63461, - Variant63462, - Variant63463, - Variant63464, - Variant63465, - Variant63466, - Variant63467, - Variant63468, - Variant63469, - Variant63470, - Variant63471, - Variant63472, - Variant63473, - Variant63474, - Variant63475, - Variant63476, - Variant63477, - Variant63478, - Variant63479, - Variant63480, - Variant63481, - Variant63482, - Variant63483, - Variant63484, - Variant63485, - Variant63486, - Variant63487, - Variant63488, - Variant63489, - Variant63490, - Variant63491, - Variant63492, - Variant63493, - Variant63494, - Variant63495, - Variant63496, - Variant63497, - Variant63498, - Variant63499, - Variant63500, - Variant63501, - Variant63502, - Variant63503, - Variant63504, - Variant63505, - Variant63506, - Variant63507, - Variant63508, - Variant63509, - Variant63510, - Variant63511, - Variant63512, - Variant63513, - Variant63514, - Variant63515, - Variant63516, - Variant63517, - Variant63518, - Variant63519, - Variant63520, - Variant63521, - Variant63522, - Variant63523, - Variant63524, - Variant63525, - Variant63526, - Variant63527, - Variant63528, - Variant63529, - Variant63530, - Variant63531, - Variant63532, - Variant63533, - Variant63534, - Variant63535, - Variant63536, - Variant63537, - Variant63538, - Variant63539, - Variant63540, - Variant63541, - Variant63542, - Variant63543, - Variant63544, - Variant63545, - Variant63546, - Variant63547, - Variant63548, - Variant63549, - Variant63550, - Variant63551, - Variant63552, - Variant63553, - Variant63554, - Variant63555, - Variant63556, - Variant63557, - Variant63558, - Variant63559, - Variant63560, - Variant63561, - Variant63562, - Variant63563, - Variant63564, - Variant63565, - Variant63566, - Variant63567, - Variant63568, - Variant63569, - Variant63570, - Variant63571, - Variant63572, - Variant63573, - Variant63574, - Variant63575, - Variant63576, - Variant63577, - Variant63578, - Variant63579, - Variant63580, - Variant63581, - Variant63582, - Variant63583, - Variant63584, - Variant63585, - Variant63586, - Variant63587, - Variant63588, - Variant63589, - Variant63590, - Variant63591, - Variant63592, - Variant63593, - Variant63594, - Variant63595, - Variant63596, - Variant63597, - Variant63598, - Variant63599, - Variant63600, - Variant63601, - Variant63602, - Variant63603, - Variant63604, - Variant63605, - Variant63606, - Variant63607, - Variant63608, - Variant63609, - Variant63610, - Variant63611, - Variant63612, - Variant63613, - Variant63614, - Variant63615, - Variant63616, - Variant63617, - Variant63618, - Variant63619, - Variant63620, - Variant63621, - Variant63622, - Variant63623, - Variant63624, - Variant63625, - Variant63626, - Variant63627, - Variant63628, - Variant63629, - Variant63630, - Variant63631, - Variant63632, - Variant63633, - Variant63634, - Variant63635, - Variant63636, - Variant63637, - Variant63638, - Variant63639, - Variant63640, - Variant63641, - Variant63642, - Variant63643, - Variant63644, - Variant63645, - Variant63646, - Variant63647, - Variant63648, - Variant63649, - Variant63650, - Variant63651, - Variant63652, - Variant63653, - Variant63654, - Variant63655, - Variant63656, - Variant63657, - Variant63658, - Variant63659, - Variant63660, - Variant63661, - Variant63662, - Variant63663, - Variant63664, - Variant63665, - Variant63666, - Variant63667, - Variant63668, - Variant63669, - Variant63670, - Variant63671, - Variant63672, - Variant63673, - Variant63674, - Variant63675, - Variant63676, - Variant63677, - Variant63678, - Variant63679, - Variant63680, - Variant63681, - Variant63682, - Variant63683, - Variant63684, - Variant63685, - Variant63686, - Variant63687, - Variant63688, - Variant63689, - Variant63690, - Variant63691, - Variant63692, - Variant63693, - Variant63694, - Variant63695, - Variant63696, - Variant63697, - Variant63698, - Variant63699, - Variant63700, - Variant63701, - Variant63702, - Variant63703, - Variant63704, - Variant63705, - Variant63706, - Variant63707, - Variant63708, - Variant63709, - Variant63710, - Variant63711, - Variant63712, - Variant63713, - Variant63714, - Variant63715, - Variant63716, - Variant63717, - Variant63718, - Variant63719, - Variant63720, - Variant63721, - Variant63722, - Variant63723, - Variant63724, - Variant63725, - Variant63726, - Variant63727, - Variant63728, - Variant63729, - Variant63730, - Variant63731, - Variant63732, - Variant63733, - Variant63734, - Variant63735, - Variant63736, - Variant63737, - Variant63738, - Variant63739, - Variant63740, - Variant63741, - Variant63742, - Variant63743, - Variant63744, - Variant63745, - Variant63746, - Variant63747, - Variant63748, - Variant63749, - Variant63750, - Variant63751, - Variant63752, - Variant63753, - Variant63754, - Variant63755, - Variant63756, - Variant63757, - Variant63758, - Variant63759, - Variant63760, - Variant63761, - Variant63762, - Variant63763, - Variant63764, - Variant63765, - Variant63766, - Variant63767, - Variant63768, - Variant63769, - Variant63770, - Variant63771, - Variant63772, - Variant63773, - Variant63774, - Variant63775, - Variant63776, - Variant63777, - Variant63778, - Variant63779, - Variant63780, - Variant63781, - Variant63782, - Variant63783, - Variant63784, - Variant63785, - Variant63786, - Variant63787, - Variant63788, - Variant63789, - Variant63790, - Variant63791, - Variant63792, - Variant63793, - Variant63794, - Variant63795, - Variant63796, - Variant63797, - Variant63798, - Variant63799, - Variant63800, - Variant63801, - Variant63802, - Variant63803, - Variant63804, - Variant63805, - Variant63806, - Variant63807, - Variant63808, - Variant63809, - Variant63810, - Variant63811, - Variant63812, - Variant63813, - Variant63814, - Variant63815, - Variant63816, - Variant63817, - Variant63818, - Variant63819, - Variant63820, - Variant63821, - Variant63822, - Variant63823, - Variant63824, - Variant63825, - Variant63826, - Variant63827, - Variant63828, - Variant63829, - Variant63830, - Variant63831, - Variant63832, - Variant63833, - Variant63834, - Variant63835, - Variant63836, - Variant63837, - Variant63838, - Variant63839, - Variant63840, - Variant63841, - Variant63842, - Variant63843, - Variant63844, - Variant63845, - Variant63846, - Variant63847, - Variant63848, - Variant63849, - Variant63850, - Variant63851, - Variant63852, - Variant63853, - Variant63854, - Variant63855, - Variant63856, - Variant63857, - Variant63858, - Variant63859, - Variant63860, - Variant63861, - Variant63862, - Variant63863, - Variant63864, - Variant63865, - Variant63866, - Variant63867, - Variant63868, - Variant63869, - Variant63870, - Variant63871, - Variant63872, - Variant63873, - Variant63874, - Variant63875, - Variant63876, - Variant63877, - Variant63878, - Variant63879, - Variant63880, - Variant63881, - Variant63882, - Variant63883, - Variant63884, - Variant63885, - Variant63886, - Variant63887, - Variant63888, - Variant63889, - Variant63890, - Variant63891, - Variant63892, - Variant63893, - Variant63894, - Variant63895, - Variant63896, - Variant63897, - Variant63898, - Variant63899, - Variant63900, - Variant63901, - Variant63902, - Variant63903, - Variant63904, - Variant63905, - Variant63906, - Variant63907, - Variant63908, - Variant63909, - Variant63910, - Variant63911, - Variant63912, - Variant63913, - Variant63914, - Variant63915, - Variant63916, - Variant63917, - Variant63918, - Variant63919, - Variant63920, - Variant63921, - Variant63922, - Variant63923, - Variant63924, - Variant63925, - Variant63926, - Variant63927, - Variant63928, - Variant63929, - Variant63930, - Variant63931, - Variant63932, - Variant63933, - Variant63934, - Variant63935, - Variant63936, - Variant63937, - Variant63938, - Variant63939, - Variant63940, - Variant63941, - Variant63942, - Variant63943, - Variant63944, - Variant63945, - Variant63946, - Variant63947, - Variant63948, - Variant63949, - Variant63950, - Variant63951, - Variant63952, - Variant63953, - Variant63954, - Variant63955, - Variant63956, - Variant63957, - Variant63958, - Variant63959, - Variant63960, - Variant63961, - Variant63962, - Variant63963, - Variant63964, - Variant63965, - Variant63966, - Variant63967, - Variant63968, - Variant63969, - Variant63970, - Variant63971, - Variant63972, - Variant63973, - Variant63974, - Variant63975, - Variant63976, - Variant63977, - Variant63978, - Variant63979, - Variant63980, - Variant63981, - Variant63982, - Variant63983, - Variant63984, - Variant63985, - Variant63986, - Variant63987, - Variant63988, - Variant63989, - Variant63990, - Variant63991, - Variant63992, - Variant63993, - Variant63994, - Variant63995, - Variant63996, - Variant63997, - Variant63998, - Variant63999, - Variant64000, - Variant64001, - Variant64002, - Variant64003, - Variant64004, - Variant64005, - Variant64006, - Variant64007, - Variant64008, - Variant64009, - Variant64010, - Variant64011, - Variant64012, - Variant64013, - Variant64014, - Variant64015, - Variant64016, - Variant64017, - Variant64018, - Variant64019, - Variant64020, - Variant64021, - Variant64022, - Variant64023, - Variant64024, - Variant64025, - Variant64026, - Variant64027, - Variant64028, - Variant64029, - Variant64030, - Variant64031, - Variant64032, - Variant64033, - Variant64034, - Variant64035, - Variant64036, - Variant64037, - Variant64038, - Variant64039, - Variant64040, - Variant64041, - Variant64042, - Variant64043, - Variant64044, - Variant64045, - Variant64046, - Variant64047, - Variant64048, - Variant64049, - Variant64050, - Variant64051, - Variant64052, - Variant64053, - Variant64054, - Variant64055, - Variant64056, - Variant64057, - Variant64058, - Variant64059, - Variant64060, - Variant64061, - Variant64062, - Variant64063, - Variant64064, - Variant64065, - Variant64066, - Variant64067, - Variant64068, - Variant64069, - Variant64070, - Variant64071, - Variant64072, - Variant64073, - Variant64074, - Variant64075, - Variant64076, - Variant64077, - Variant64078, - Variant64079, - Variant64080, - Variant64081, - Variant64082, - Variant64083, - Variant64084, - Variant64085, - Variant64086, - Variant64087, - Variant64088, - Variant64089, - Variant64090, - Variant64091, - Variant64092, - Variant64093, - Variant64094, - Variant64095, - Variant64096, - Variant64097, - Variant64098, - Variant64099, - Variant64100, - Variant64101, - Variant64102, - Variant64103, - Variant64104, - Variant64105, - Variant64106, - Variant64107, - Variant64108, - Variant64109, - Variant64110, - Variant64111, - Variant64112, - Variant64113, - Variant64114, - Variant64115, - Variant64116, - Variant64117, - Variant64118, - Variant64119, - Variant64120, - Variant64121, - Variant64122, - Variant64123, - Variant64124, - Variant64125, - Variant64126, - Variant64127, - Variant64128, - Variant64129, - Variant64130, - Variant64131, - Variant64132, - Variant64133, - Variant64134, - Variant64135, - Variant64136, - Variant64137, - Variant64138, - Variant64139, - Variant64140, - Variant64141, - Variant64142, - Variant64143, - Variant64144, - Variant64145, - Variant64146, - Variant64147, - Variant64148, - Variant64149, - Variant64150, - Variant64151, - Variant64152, - Variant64153, - Variant64154, - Variant64155, - Variant64156, - Variant64157, - Variant64158, - Variant64159, - Variant64160, - Variant64161, - Variant64162, - Variant64163, - Variant64164, - Variant64165, - Variant64166, - Variant64167, - Variant64168, - Variant64169, - Variant64170, - Variant64171, - Variant64172, - Variant64173, - Variant64174, - Variant64175, - Variant64176, - Variant64177, - Variant64178, - Variant64179, - Variant64180, - Variant64181, - Variant64182, - Variant64183, - Variant64184, - Variant64185, - Variant64186, - Variant64187, - Variant64188, - Variant64189, - Variant64190, - Variant64191, - Variant64192, - Variant64193, - Variant64194, - Variant64195, - Variant64196, - Variant64197, - Variant64198, - Variant64199, - Variant64200, - Variant64201, - Variant64202, - Variant64203, - Variant64204, - Variant64205, - Variant64206, - Variant64207, - Variant64208, - Variant64209, - Variant64210, - Variant64211, - Variant64212, - Variant64213, - Variant64214, - Variant64215, - Variant64216, - Variant64217, - Variant64218, - Variant64219, - Variant64220, - Variant64221, - Variant64222, - Variant64223, - Variant64224, - Variant64225, - Variant64226, - Variant64227, - Variant64228, - Variant64229, - Variant64230, - Variant64231, - Variant64232, - Variant64233, - Variant64234, - Variant64235, - Variant64236, - Variant64237, - Variant64238, - Variant64239, - Variant64240, - Variant64241, - Variant64242, - Variant64243, - Variant64244, - Variant64245, - Variant64246, - Variant64247, - Variant64248, - Variant64249, - Variant64250, - Variant64251, - Variant64252, - Variant64253, - Variant64254, - Variant64255, - Variant64256, - Variant64257, - Variant64258, - Variant64259, - Variant64260, - Variant64261, - Variant64262, - Variant64263, - Variant64264, - Variant64265, - Variant64266, - Variant64267, - Variant64268, - Variant64269, - Variant64270, - Variant64271, - Variant64272, - Variant64273, - Variant64274, - Variant64275, - Variant64276, - Variant64277, - Variant64278, - Variant64279, - Variant64280, - Variant64281, - Variant64282, - Variant64283, - Variant64284, - Variant64285, - Variant64286, - Variant64287, - Variant64288, - Variant64289, - Variant64290, - Variant64291, - Variant64292, - Variant64293, - Variant64294, - Variant64295, - Variant64296, - Variant64297, - Variant64298, - Variant64299, - Variant64300, - Variant64301, - Variant64302, - Variant64303, - Variant64304, - Variant64305, - Variant64306, - Variant64307, - Variant64308, - Variant64309, - Variant64310, - Variant64311, - Variant64312, - Variant64313, - Variant64314, - Variant64315, - Variant64316, - Variant64317, - Variant64318, - Variant64319, - Variant64320, - Variant64321, - Variant64322, - Variant64323, - Variant64324, - Variant64325, - Variant64326, - Variant64327, - Variant64328, - Variant64329, - Variant64330, - Variant64331, - Variant64332, - Variant64333, - Variant64334, - Variant64335, - Variant64336, - Variant64337, - Variant64338, - Variant64339, - Variant64340, - Variant64341, - Variant64342, - Variant64343, - Variant64344, - Variant64345, - Variant64346, - Variant64347, - Variant64348, - Variant64349, - Variant64350, - Variant64351, - Variant64352, - Variant64353, - Variant64354, - Variant64355, - Variant64356, - Variant64357, - Variant64358, - Variant64359, - Variant64360, - Variant64361, - Variant64362, - Variant64363, - Variant64364, - Variant64365, - Variant64366, - Variant64367, - Variant64368, - Variant64369, - Variant64370, - Variant64371, - Variant64372, - Variant64373, - Variant64374, - Variant64375, - Variant64376, - Variant64377, - Variant64378, - Variant64379, - Variant64380, - Variant64381, - Variant64382, - Variant64383, - Variant64384, - Variant64385, - Variant64386, - Variant64387, - Variant64388, - Variant64389, - Variant64390, - Variant64391, - Variant64392, - Variant64393, - Variant64394, - Variant64395, - Variant64396, - Variant64397, - Variant64398, - Variant64399, - Variant64400, - Variant64401, - Variant64402, - Variant64403, - Variant64404, - Variant64405, - Variant64406, - Variant64407, - Variant64408, - Variant64409, - Variant64410, - Variant64411, - Variant64412, - Variant64413, - Variant64414, - Variant64415, - Variant64416, - Variant64417, - Variant64418, - Variant64419, - Variant64420, - Variant64421, - Variant64422, - Variant64423, - Variant64424, - Variant64425, - Variant64426, - Variant64427, - Variant64428, - Variant64429, - Variant64430, - Variant64431, - Variant64432, - Variant64433, - Variant64434, - Variant64435, - Variant64436, - Variant64437, - Variant64438, - Variant64439, - Variant64440, - Variant64441, - Variant64442, - Variant64443, - Variant64444, - Variant64445, - Variant64446, - Variant64447, - Variant64448, - Variant64449, - Variant64450, - Variant64451, - Variant64452, - Variant64453, - Variant64454, - Variant64455, - Variant64456, - Variant64457, - Variant64458, - Variant64459, - Variant64460, - Variant64461, - Variant64462, - Variant64463, - Variant64464, - Variant64465, - Variant64466, - Variant64467, - Variant64468, - Variant64469, - Variant64470, - Variant64471, - Variant64472, - Variant64473, - Variant64474, - Variant64475, - Variant64476, - Variant64477, - Variant64478, - Variant64479, - Variant64480, - Variant64481, - Variant64482, - Variant64483, - Variant64484, - Variant64485, - Variant64486, - Variant64487, - Variant64488, - Variant64489, - Variant64490, - Variant64491, - Variant64492, - Variant64493, - Variant64494, - Variant64495, - Variant64496, - Variant64497, - Variant64498, - Variant64499, - Variant64500, - Variant64501, - Variant64502, - Variant64503, - Variant64504, - Variant64505, - Variant64506, - Variant64507, - Variant64508, - Variant64509, - Variant64510, - Variant64511, - Variant64512, - Variant64513, - Variant64514, - Variant64515, - Variant64516, - Variant64517, - Variant64518, - Variant64519, - Variant64520, - Variant64521, - Variant64522, - Variant64523, - Variant64524, - Variant64525, - Variant64526, - Variant64527, - Variant64528, - Variant64529, - Variant64530, - Variant64531, - Variant64532, - Variant64533, - Variant64534, - Variant64535, - Variant64536, - Variant64537, - Variant64538, - Variant64539, - Variant64540, - Variant64541, - Variant64542, - Variant64543, - Variant64544, - Variant64545, - Variant64546, - Variant64547, - Variant64548, - Variant64549, - Variant64550, - Variant64551, - Variant64552, - Variant64553, - Variant64554, - Variant64555, - Variant64556, - Variant64557, - Variant64558, - Variant64559, - Variant64560, - Variant64561, - Variant64562, - Variant64563, - Variant64564, - Variant64565, - Variant64566, - Variant64567, - Variant64568, - Variant64569, - Variant64570, - Variant64571, - Variant64572, - Variant64573, - Variant64574, - Variant64575, - Variant64576, - Variant64577, - Variant64578, - Variant64579, - Variant64580, - Variant64581, - Variant64582, - Variant64583, - Variant64584, - Variant64585, - Variant64586, - Variant64587, - Variant64588, - Variant64589, - Variant64590, - Variant64591, - Variant64592, - Variant64593, - Variant64594, - Variant64595, - Variant64596, - Variant64597, - Variant64598, - Variant64599, - Variant64600, - Variant64601, - Variant64602, - Variant64603, - Variant64604, - Variant64605, - Variant64606, - Variant64607, - Variant64608, - Variant64609, - Variant64610, - Variant64611, - Variant64612, - Variant64613, - Variant64614, - Variant64615, - Variant64616, - Variant64617, - Variant64618, - Variant64619, - Variant64620, - Variant64621, - Variant64622, - Variant64623, - Variant64624, - Variant64625, - Variant64626, - Variant64627, - Variant64628, - Variant64629, - Variant64630, - Variant64631, - Variant64632, - Variant64633, - Variant64634, - Variant64635, - Variant64636, - Variant64637, - Variant64638, - Variant64639, - Variant64640, - Variant64641, - Variant64642, - Variant64643, - Variant64644, - Variant64645, - Variant64646, - Variant64647, - Variant64648, - Variant64649, - Variant64650, - Variant64651, - Variant64652, - Variant64653, - Variant64654, - Variant64655, - Variant64656, - Variant64657, - Variant64658, - Variant64659, - Variant64660, - Variant64661, - Variant64662, - Variant64663, - Variant64664, - Variant64665, - Variant64666, - Variant64667, - Variant64668, - Variant64669, - Variant64670, - Variant64671, - Variant64672, - Variant64673, - Variant64674, - Variant64675, - Variant64676, - Variant64677, - Variant64678, - Variant64679, - Variant64680, - Variant64681, - Variant64682, - Variant64683, - Variant64684, - Variant64685, - Variant64686, - Variant64687, - Variant64688, - Variant64689, - Variant64690, - Variant64691, - Variant64692, - Variant64693, - Variant64694, - Variant64695, - Variant64696, - Variant64697, - Variant64698, - Variant64699, - Variant64700, - Variant64701, - Variant64702, - Variant64703, - Variant64704, - Variant64705, - Variant64706, - Variant64707, - Variant64708, - Variant64709, - Variant64710, - Variant64711, - Variant64712, - Variant64713, - Variant64714, - Variant64715, - Variant64716, - Variant64717, - Variant64718, - Variant64719, - Variant64720, - Variant64721, - Variant64722, - Variant64723, - Variant64724, - Variant64725, - Variant64726, - Variant64727, - Variant64728, - Variant64729, - Variant64730, - Variant64731, - Variant64732, - Variant64733, - Variant64734, - Variant64735, - Variant64736, - Variant64737, - Variant64738, - Variant64739, - Variant64740, - Variant64741, - Variant64742, - Variant64743, - Variant64744, - Variant64745, - Variant64746, - Variant64747, - Variant64748, - Variant64749, - Variant64750, - Variant64751, - Variant64752, - Variant64753, - Variant64754, - Variant64755, - Variant64756, - Variant64757, - Variant64758, - Variant64759, - Variant64760, - Variant64761, - Variant64762, - Variant64763, - Variant64764, - Variant64765, - Variant64766, - Variant64767, - Variant64768, - Variant64769, - Variant64770, - Variant64771, - Variant64772, - Variant64773, - Variant64774, - Variant64775, - Variant64776, - Variant64777, - Variant64778, - Variant64779, - Variant64780, - Variant64781, - Variant64782, - Variant64783, - Variant64784, - Variant64785, - Variant64786, - Variant64787, - Variant64788, - Variant64789, - Variant64790, - Variant64791, - Variant64792, - Variant64793, - Variant64794, - Variant64795, - Variant64796, - Variant64797, - Variant64798, - Variant64799, - Variant64800, - Variant64801, - Variant64802, - Variant64803, - Variant64804, - Variant64805, - Variant64806, - Variant64807, - Variant64808, - Variant64809, - Variant64810, - Variant64811, - Variant64812, - Variant64813, - Variant64814, - Variant64815, - Variant64816, - Variant64817, - Variant64818, - Variant64819, - Variant64820, - Variant64821, - Variant64822, - Variant64823, - Variant64824, - Variant64825, - Variant64826, - Variant64827, - Variant64828, - Variant64829, - Variant64830, - Variant64831, - Variant64832, - Variant64833, - Variant64834, - Variant64835, - Variant64836, - Variant64837, - Variant64838, - Variant64839, - Variant64840, - Variant64841, - Variant64842, - Variant64843, - Variant64844, - Variant64845, - Variant64846, - Variant64847, - Variant64848, - Variant64849, - Variant64850, - Variant64851, - Variant64852, - Variant64853, - Variant64854, - Variant64855, - Variant64856, - Variant64857, - Variant64858, - Variant64859, - Variant64860, - Variant64861, - Variant64862, - Variant64863, - Variant64864, - Variant64865, - Variant64866, - Variant64867, - Variant64868, - Variant64869, - Variant64870, - Variant64871, - Variant64872, - Variant64873, - Variant64874, - Variant64875, - Variant64876, - Variant64877, - Variant64878, - Variant64879, - Variant64880, - Variant64881, - Variant64882, - Variant64883, - Variant64884, - Variant64885, - Variant64886, - Variant64887, - Variant64888, - Variant64889, - Variant64890, - Variant64891, - Variant64892, - Variant64893, - Variant64894, - Variant64895, - Variant64896, - Variant64897, - Variant64898, - Variant64899, - Variant64900, - Variant64901, - Variant64902, - Variant64903, - Variant64904, - Variant64905, - Variant64906, - Variant64907, - Variant64908, - Variant64909, - Variant64910, - Variant64911, - Variant64912, - Variant64913, - Variant64914, - Variant64915, - Variant64916, - Variant64917, - Variant64918, - Variant64919, - Variant64920, - Variant64921, - Variant64922, - Variant64923, - Variant64924, - Variant64925, - Variant64926, - Variant64927, - Variant64928, - Variant64929, - Variant64930, - Variant64931, - Variant64932, - Variant64933, - Variant64934, - Variant64935, - Variant64936, - Variant64937, - Variant64938, - Variant64939, - Variant64940, - Variant64941, - Variant64942, - Variant64943, - Variant64944, - Variant64945, - Variant64946, - Variant64947, - Variant64948, - Variant64949, - Variant64950, - Variant64951, - Variant64952, - Variant64953, - Variant64954, - Variant64955, - Variant64956, - Variant64957, - Variant64958, - Variant64959, - Variant64960, - Variant64961, - Variant64962, - Variant64963, - Variant64964, - Variant64965, - Variant64966, - Variant64967, - Variant64968, - Variant64969, - Variant64970, - Variant64971, - Variant64972, - Variant64973, - Variant64974, - Variant64975, - Variant64976, - Variant64977, - Variant64978, - Variant64979, - Variant64980, - Variant64981, - Variant64982, - Variant64983, - Variant64984, - Variant64985, - Variant64986, - Variant64987, - Variant64988, - Variant64989, - Variant64990, - Variant64991, - Variant64992, - Variant64993, - Variant64994, - Variant64995, - Variant64996, - Variant64997, - Variant64998, - Variant64999, - Variant65000, - Variant65001, - Variant65002, - Variant65003, - Variant65004, - Variant65005, - Variant65006, - Variant65007, - Variant65008, - Variant65009, - Variant65010, - Variant65011, - Variant65012, - Variant65013, - Variant65014, - Variant65015, - Variant65016, - Variant65017, - Variant65018, - Variant65019, - Variant65020, - Variant65021, - Variant65022, - Variant65023, - Variant65024, - Variant65025, - Variant65026, - Variant65027, - Variant65028, - Variant65029, - Variant65030, - Variant65031, - Variant65032, - Variant65033, - Variant65034, - Variant65035, - Variant65036, - Variant65037, - Variant65038, - Variant65039, - Variant65040, - Variant65041, - Variant65042, - Variant65043, - Variant65044, - Variant65045, - Variant65046, - Variant65047, - Variant65048, - Variant65049, - Variant65050, - Variant65051, - Variant65052, - Variant65053, - Variant65054, - Variant65055, - Variant65056, - Variant65057, - Variant65058, - Variant65059, - Variant65060, - Variant65061, - Variant65062, - Variant65063, - Variant65064, - Variant65065, - Variant65066, - Variant65067, - Variant65068, - Variant65069, - Variant65070, - Variant65071, - Variant65072, - Variant65073, - Variant65074, - Variant65075, - Variant65076, - Variant65077, - Variant65078, - Variant65079, - Variant65080, - Variant65081, - Variant65082, - Variant65083, - Variant65084, - Variant65085, - Variant65086, - Variant65087, - Variant65088, - Variant65089, - Variant65090, - Variant65091, - Variant65092, - Variant65093, - Variant65094, - Variant65095, - Variant65096, - Variant65097, - Variant65098, - Variant65099, - Variant65100, - Variant65101, - Variant65102, - Variant65103, - Variant65104, - Variant65105, - Variant65106, - Variant65107, - Variant65108, - Variant65109, - Variant65110, - Variant65111, - Variant65112, - Variant65113, - Variant65114, - Variant65115, - Variant65116, - Variant65117, - Variant65118, - Variant65119, - Variant65120, - Variant65121, - Variant65122, - Variant65123, - Variant65124, - Variant65125, - Variant65126, - Variant65127, - Variant65128, - Variant65129, - Variant65130, - Variant65131, - Variant65132, - Variant65133, - Variant65134, - Variant65135, - Variant65136, - Variant65137, - Variant65138, - Variant65139, - Variant65140, - Variant65141, - Variant65142, - Variant65143, - Variant65144, - Variant65145, - Variant65146, - Variant65147, - Variant65148, - Variant65149, - Variant65150, - Variant65151, - Variant65152, - Variant65153, - Variant65154, - Variant65155, - Variant65156, - Variant65157, - Variant65158, - Variant65159, - Variant65160, - Variant65161, - Variant65162, - Variant65163, - Variant65164, - Variant65165, - Variant65166, - Variant65167, - Variant65168, - Variant65169, - Variant65170, - Variant65171, - Variant65172, - Variant65173, - Variant65174, - Variant65175, - Variant65176, - Variant65177, - Variant65178, - Variant65179, - Variant65180, - Variant65181, - Variant65182, - Variant65183, - Variant65184, - Variant65185, - Variant65186, - Variant65187, - Variant65188, - Variant65189, - Variant65190, - Variant65191, - Variant65192, - Variant65193, - Variant65194, - Variant65195, - Variant65196, - Variant65197, - Variant65198, - Variant65199, - Variant65200, - Variant65201, - Variant65202, - Variant65203, - Variant65204, - Variant65205, - Variant65206, - Variant65207, - Variant65208, - Variant65209, - Variant65210, - Variant65211, - Variant65212, - Variant65213, - Variant65214, - Variant65215, - Variant65216, - Variant65217, - Variant65218, - Variant65219, - Variant65220, - Variant65221, - Variant65222, - Variant65223, - Variant65224, - Variant65225, - Variant65226, - Variant65227, - Variant65228, - Variant65229, - Variant65230, - Variant65231, - Variant65232, - Variant65233, - Variant65234, - Variant65235, - Variant65236, - Variant65237, - Variant65238, - Variant65239, - Variant65240, - Variant65241, - Variant65242, - Variant65243, - Variant65244, - Variant65245, - Variant65246, - Variant65247, - Variant65248, - Variant65249, - Variant65250, - Variant65251, - Variant65252, - Variant65253, - Variant65254, - Variant65255, - Variant65256, - Variant65257, - Variant65258, - Variant65259, - Variant65260, - Variant65261, - Variant65262, - Variant65263, - Variant65264, - Variant65265, - Variant65266, - Variant65267, - Variant65268, - Variant65269, - Variant65270, - Variant65271, - Variant65272, - Variant65273, - Variant65274, - Variant65275, - Variant65276, - Variant65277, - Variant65278, - Variant65279, - Variant65280, - Variant65281, - Variant65282, - Variant65283, - Variant65284, - Variant65285, - Variant65286, - Variant65287, - Variant65288, - Variant65289, - Variant65290, - Variant65291, - Variant65292, - Variant65293, - Variant65294, - Variant65295, - Variant65296, - Variant65297, - Variant65298, - Variant65299, - Variant65300, - Variant65301, - Variant65302, - Variant65303, - Variant65304, - Variant65305, - Variant65306, - Variant65307, - Variant65308, - Variant65309, - Variant65310, - Variant65311, - Variant65312, - Variant65313, - Variant65314, - Variant65315, - Variant65316, - Variant65317, - Variant65318, - Variant65319, - Variant65320, - Variant65321, - Variant65322, - Variant65323, - Variant65324, - Variant65325, - Variant65326, - Variant65327, - Variant65328, - Variant65329, - Variant65330, - Variant65331, - Variant65332, - Variant65333, - Variant65334, - Variant65335, - Variant65336, - Variant65337, - Variant65338, - Variant65339, - Variant65340, - Variant65341, - Variant65342, - Variant65343, - Variant65344, - Variant65345, - Variant65346, - Variant65347, - Variant65348, - Variant65349, - Variant65350, - Variant65351, - Variant65352, - Variant65353, - Variant65354, - Variant65355, - Variant65356, - Variant65357, - Variant65358, - Variant65359, - Variant65360, - Variant65361, - Variant65362, - Variant65363, - Variant65364, - Variant65365, - Variant65366, - Variant65367, - Variant65368, - Variant65369, - Variant65370, - Variant65371, - Variant65372, - Variant65373, - Variant65374, - Variant65375, - Variant65376, - Variant65377, - Variant65378, - Variant65379, - Variant65380, - Variant65381, - Variant65382, - Variant65383, - Variant65384, - Variant65385, - Variant65386, - Variant65387, - Variant65388, - Variant65389, - Variant65390, - Variant65391, - Variant65392, - Variant65393, - Variant65394, - Variant65395, - Variant65396, - Variant65397, - Variant65398, - Variant65399, - Variant65400, - Variant65401, - Variant65402, - Variant65403, - Variant65404, - Variant65405, - Variant65406, - Variant65407, - Variant65408, - Variant65409, - Variant65410, - Variant65411, - Variant65412, - Variant65413, - Variant65414, - Variant65415, - Variant65416, - Variant65417, - Variant65418, - Variant65419, - Variant65420, - Variant65421, - Variant65422, - Variant65423, - Variant65424, - Variant65425, - Variant65426, - Variant65427, - Variant65428, - Variant65429, - Variant65430, - Variant65431, - Variant65432, - Variant65433, - Variant65434, - Variant65435, - Variant65436, - Variant65437, - Variant65438, - Variant65439, - Variant65440, - Variant65441, - Variant65442, - Variant65443, - Variant65444, - Variant65445, - Variant65446, - Variant65447, - Variant65448, - Variant65449, - Variant65450, - Variant65451, - Variant65452, - Variant65453, - Variant65454, - Variant65455, - Variant65456, - Variant65457, - Variant65458, - Variant65459, - Variant65460, - Variant65461, - Variant65462, - Variant65463, - Variant65464, - Variant65465, - Variant65466, - Variant65467, - Variant65468, - Variant65469, - Variant65470, - Variant65471, - Variant65472, - Variant65473, - Variant65474, - Variant65475, - Variant65476, - Variant65477, - Variant65478, - Variant65479, - Variant65480, - Variant65481, - Variant65482, - Variant65483, - Variant65484, - Variant65485, - Variant65486, - Variant65487, - Variant65488, - Variant65489, - Variant65490, - Variant65491, - Variant65492, - Variant65493, - Variant65494, - Variant65495, - Variant65496, - Variant65497, - Variant65498, - Variant65499, - Variant65500, - Variant65501, - Variant65502, - Variant65503, - Variant65504, - Variant65505, - Variant65506, - Variant65507, - Variant65508, - Variant65509, - Variant65510, - Variant65511, - Variant65512, - Variant65513, - Variant65514, - Variant65515, - Variant65516, - Variant65517, - Variant65518, - Variant65519, - Variant65520, - Variant65521, - Variant65522, - Variant65523, - Variant65524, - Variant65525, - Variant65526, - Variant65527, - Variant65528, - Variant65529, - Variant65530, - Variant65531, - Variant65532, - Variant65533, - Variant65534, -} diff -Nru temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-nightly/enum_from_bytes_u8_too_few.rs temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-nightly/enum_from_bytes_u8_too_few.rs --- temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-nightly/enum_from_bytes_u8_too_few.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-nightly/enum_from_bytes_u8_too_few.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,272 +0,0 @@ -// Copyright 2019 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -#[macro_use] -extern crate zerocopy; - -fn main() {} - -#[derive(FromBytes)] -#[repr(u8)] -enum Foo { - Variant0, - Variant1, - Variant2, - Variant3, - Variant4, - Variant5, - Variant6, - Variant7, - Variant8, - Variant9, - Variant10, - Variant11, - Variant12, - Variant13, - Variant14, - Variant15, - Variant16, - Variant17, - Variant18, - Variant19, - Variant20, - Variant21, - Variant22, - Variant23, - Variant24, - Variant25, - Variant26, - Variant27, - Variant28, - Variant29, - Variant30, - Variant31, - Variant32, - Variant33, - Variant34, - Variant35, - Variant36, - Variant37, - Variant38, - Variant39, - Variant40, - Variant41, - Variant42, - Variant43, - Variant44, - Variant45, - Variant46, - Variant47, - Variant48, - Variant49, - Variant50, - Variant51, - Variant52, - Variant53, - Variant54, - Variant55, - Variant56, - Variant57, - Variant58, - Variant59, - Variant60, - Variant61, - Variant62, - Variant63, - Variant64, - Variant65, - Variant66, - Variant67, - Variant68, - Variant69, - Variant70, - Variant71, - Variant72, - Variant73, - Variant74, - Variant75, - Variant76, - Variant77, - Variant78, - Variant79, - Variant80, - Variant81, - Variant82, - Variant83, - Variant84, - Variant85, - Variant86, - Variant87, - Variant88, - Variant89, - Variant90, - Variant91, - Variant92, - Variant93, - Variant94, - Variant95, - Variant96, - Variant97, - Variant98, - Variant99, - Variant100, - Variant101, - Variant102, - Variant103, - Variant104, - Variant105, - Variant106, - Variant107, - Variant108, - Variant109, - Variant110, - Variant111, - Variant112, - Variant113, - Variant114, - Variant115, - Variant116, - Variant117, - Variant118, - Variant119, - Variant120, - Variant121, - Variant122, - Variant123, - Variant124, - Variant125, - Variant126, - Variant127, - Variant128, - Variant129, - Variant130, - Variant131, - Variant132, - Variant133, - Variant134, - Variant135, - Variant136, - Variant137, - Variant138, - Variant139, - Variant140, - Variant141, - Variant142, - Variant143, - Variant144, - Variant145, - Variant146, - Variant147, - Variant148, - Variant149, - Variant150, - Variant151, - Variant152, - Variant153, - Variant154, - Variant155, - Variant156, - Variant157, - Variant158, - Variant159, - Variant160, - Variant161, - Variant162, - Variant163, - Variant164, - Variant165, - Variant166, - Variant167, - Variant168, - Variant169, - Variant170, - Variant171, - Variant172, - Variant173, - Variant174, - Variant175, - Variant176, - Variant177, - Variant178, - Variant179, - Variant180, - Variant181, - Variant182, - Variant183, - Variant184, - Variant185, - Variant186, - Variant187, - Variant188, - Variant189, - Variant190, - Variant191, - Variant192, - Variant193, - Variant194, - Variant195, - Variant196, - Variant197, - Variant198, - Variant199, - Variant200, - Variant201, - Variant202, - Variant203, - Variant204, - Variant205, - Variant206, - Variant207, - Variant208, - Variant209, - Variant210, - Variant211, - Variant212, - Variant213, - Variant214, - Variant215, - Variant216, - Variant217, - Variant218, - Variant219, - Variant220, - Variant221, - Variant222, - Variant223, - Variant224, - Variant225, - Variant226, - Variant227, - Variant228, - Variant229, - Variant230, - Variant231, - Variant232, - Variant233, - Variant234, - Variant235, - Variant236, - Variant237, - Variant238, - Variant239, - Variant240, - Variant241, - Variant242, - Variant243, - Variant244, - Variant245, - Variant246, - Variant247, - Variant248, - Variant249, - Variant250, - Variant251, - Variant252, - Variant253, - Variant254, -} diff -Nru temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-nightly/enum_from_bytes_u8_too_few.stderr temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-nightly/enum_from_bytes_u8_too_few.stderr --- temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-nightly/enum_from_bytes_u8_too_few.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-nightly/enum_from_bytes_u8_too_few.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,11 +0,0 @@ -error: FromBytes only supported on repr(u8) enum with 256 variants - --> tests/ui-nightly/enum_from_bytes_u8_too_few.rs:15:1 - | -15 | / #[repr(u8)] -16 | | enum Foo { -17 | | Variant0, -18 | | Variant1, -... | -271 | | Variant254, -272 | | } - | |_^ diff -Nru temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-nightly/enum.rs temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-nightly/enum.rs --- temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-nightly/enum.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-nightly/enum.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,194 +0,0 @@ -// Copyright 2019 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -#[macro_use] -extern crate zerocopy; - -fn main() {} - -// -// Generic errors -// - -#[derive(FromZeroes, FromBytes)] -#[repr("foo")] -enum Generic1 { - A, -} - -#[derive(FromZeroes, FromBytes)] -#[repr(foo)] -enum Generic2 { - A, -} - -#[derive(FromZeroes, FromBytes)] -#[repr(transparent)] -enum Generic3 { - A, -} - -#[derive(FromZeroes, FromBytes)] -#[repr(u8, u16)] -enum Generic4 { - A, -} - -#[derive(FromZeroes, FromBytes)] -enum Generic5 { - A, -} - -// -// FromZeroes errors -// - -#[derive(FromZeroes)] -enum FromZeroes1 { - A(u8), -} - -#[derive(FromZeroes)] -enum FromZeroes2 { - A, - B(u8), -} - -#[derive(FromZeroes)] -enum FromZeroes3 { - A = 1, - B, -} - -// -// FromBytes errors -// - -#[derive(FromZeroes, FromBytes)] -#[repr(C)] -enum FromBytes1 { - A, -} - -#[derive(FromZeroes, FromBytes)] -#[repr(usize)] -enum FromBytes2 { - A, -} - -#[derive(FromZeroes, FromBytes)] -#[repr(isize)] -enum FromBytes3 { - A, -} - -#[derive(FromZeroes, FromBytes)] -#[repr(u32)] -enum FromBytes4 { - A, -} - -#[derive(FromZeroes, FromBytes)] -#[repr(i32)] -enum FromBytes5 { - A, -} - -#[derive(FromZeroes, FromBytes)] -#[repr(u64)] -enum FromBytes6 { - A, -} - -#[derive(FromZeroes, FromBytes)] -#[repr(i64)] -enum FromBytes7 { - A, -} - -// -// Unaligned errors -// - -#[derive(Unaligned)] -#[repr(C)] -enum Unaligned1 { - A, -} - -#[derive(Unaligned)] -#[repr(u16)] -enum Unaligned2 { - A, -} - -#[derive(Unaligned)] -#[repr(i16)] -enum Unaligned3 { - A, -} - -#[derive(Unaligned)] -#[repr(u32)] -enum Unaligned4 { - A, -} - -#[derive(Unaligned)] -#[repr(i32)] -enum Unaligned5 { - A, -} - -#[derive(Unaligned)] -#[repr(u64)] -enum Unaligned6 { - A, -} - -#[derive(Unaligned)] -#[repr(i64)] -enum Unaligned7 { - A, -} - -#[derive(Unaligned)] -#[repr(usize)] -enum Unaligned8 { - A, -} - -#[derive(Unaligned)] -#[repr(isize)] -enum Unaligned9 { - A, -} - -#[derive(Unaligned)] -#[repr(u8, align(2))] -enum Unaligned10 { - A, -} - -#[derive(Unaligned)] -#[repr(i8, align(2))] -enum Unaligned11 { - A, -} - -#[derive(Unaligned)] -#[repr(align(1), align(2))] -enum Unaligned12 { - A, -} - -#[derive(Unaligned)] -#[repr(align(2), align(4))] -enum Unaligned13 { - A, -} diff -Nru temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-nightly/enum.stderr temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-nightly/enum.stderr --- temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-nightly/enum.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-nightly/enum.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,201 +0,0 @@ -error: unrecognized representation hint - --> tests/ui-nightly/enum.rs:19:8 - | -19 | #[repr("foo")] - | ^^^^^ - -error: unrecognized representation hint - --> tests/ui-nightly/enum.rs:25:8 - | -25 | #[repr(foo)] - | ^^^ - -error: unsupported representation for deriving FromBytes, AsBytes, or Unaligned on an enum - --> tests/ui-nightly/enum.rs:31:8 - | -31 | #[repr(transparent)] - | ^^^^^^^^^^^ - -error: conflicting representation hints - --> tests/ui-nightly/enum.rs:37:8 - | -37 | #[repr(u8, u16)] - | ^^^^^^^ - -error: must have a non-align #[repr(...)] attribute in order to guarantee this type's memory layout - --> tests/ui-nightly/enum.rs:42:22 - | -42 | #[derive(FromZeroes, FromBytes)] - | ^^^^^^^^^ - | - = note: this error originates in the derive macro `FromBytes` (in Nightly builds, run with -Z macro-backtrace for more info) - -error: only C-like enums can implement FromZeroes - --> tests/ui-nightly/enum.rs:52:1 - | -52 | / enum FromZeroes1 { -53 | | A(u8), -54 | | } - | |_^ - -error: only C-like enums can implement FromZeroes - --> tests/ui-nightly/enum.rs:57:1 - | -57 | / enum FromZeroes2 { -58 | | A, -59 | | B(u8), -60 | | } - | |_^ - -error: FromZeroes only supported on enums with a variant that has a discriminant of `0` - --> tests/ui-nightly/enum.rs:63:1 - | -63 | / enum FromZeroes3 { -64 | | A = 1, -65 | | B, -66 | | } - | |_^ - -error: FromBytes requires repr of "u8", "u16", "i8", or "i16" - --> tests/ui-nightly/enum.rs:73:8 - | -73 | #[repr(C)] - | ^ - -error: FromBytes requires repr of "u8", "u16", "i8", or "i16" - --> tests/ui-nightly/enum.rs:79:8 - | -79 | #[repr(usize)] - | ^^^^^ - -error: FromBytes requires repr of "u8", "u16", "i8", or "i16" - --> tests/ui-nightly/enum.rs:85:8 - | -85 | #[repr(isize)] - | ^^^^^ - -error: FromBytes requires repr of "u8", "u16", "i8", or "i16" - --> tests/ui-nightly/enum.rs:91:8 - | -91 | #[repr(u32)] - | ^^^ - -error: FromBytes requires repr of "u8", "u16", "i8", or "i16" - --> tests/ui-nightly/enum.rs:97:8 - | -97 | #[repr(i32)] - | ^^^ - -error: FromBytes requires repr of "u8", "u16", "i8", or "i16" - --> tests/ui-nightly/enum.rs:103:8 - | -103 | #[repr(u64)] - | ^^^ - -error: FromBytes requires repr of "u8", "u16", "i8", or "i16" - --> tests/ui-nightly/enum.rs:109:8 - | -109 | #[repr(i64)] - | ^^^ - -error: Unaligned requires repr of "u8" or "i8", and no alignment (i.e., repr(align(N > 1))) - --> tests/ui-nightly/enum.rs:119:8 - | -119 | #[repr(C)] - | ^ - -error: Unaligned requires repr of "u8" or "i8", and no alignment (i.e., repr(align(N > 1))) - --> tests/ui-nightly/enum.rs:125:8 - | -125 | #[repr(u16)] - | ^^^ - -error: Unaligned requires repr of "u8" or "i8", and no alignment (i.e., repr(align(N > 1))) - --> tests/ui-nightly/enum.rs:131:8 - | -131 | #[repr(i16)] - | ^^^ - -error: Unaligned requires repr of "u8" or "i8", and no alignment (i.e., repr(align(N > 1))) - --> tests/ui-nightly/enum.rs:137:8 - | -137 | #[repr(u32)] - | ^^^ - -error: Unaligned requires repr of "u8" or "i8", and no alignment (i.e., repr(align(N > 1))) - --> tests/ui-nightly/enum.rs:143:8 - | -143 | #[repr(i32)] - | ^^^ - -error: Unaligned requires repr of "u8" or "i8", and no alignment (i.e., repr(align(N > 1))) - --> tests/ui-nightly/enum.rs:149:8 - | -149 | #[repr(u64)] - | ^^^ - -error: Unaligned requires repr of "u8" or "i8", and no alignment (i.e., repr(align(N > 1))) - --> tests/ui-nightly/enum.rs:155:8 - | -155 | #[repr(i64)] - | ^^^ - -error: Unaligned requires repr of "u8" or "i8", and no alignment (i.e., repr(align(N > 1))) - --> tests/ui-nightly/enum.rs:161:8 - | -161 | #[repr(usize)] - | ^^^^^ - -error: Unaligned requires repr of "u8" or "i8", and no alignment (i.e., repr(align(N > 1))) - --> tests/ui-nightly/enum.rs:167:8 - | -167 | #[repr(isize)] - | ^^^^^ - -error: cannot derive Unaligned with repr(align(N > 1)) - --> tests/ui-nightly/enum.rs:173:12 - | -173 | #[repr(u8, align(2))] - | ^^^^^^^^ - -error: cannot derive Unaligned with repr(align(N > 1)) - --> tests/ui-nightly/enum.rs:179:12 - | -179 | #[repr(i8, align(2))] - | ^^^^^^^^ - -error: cannot derive Unaligned with repr(align(N > 1)) - --> tests/ui-nightly/enum.rs:185:18 - | -185 | #[repr(align(1), align(2))] - | ^^^^^^^^ - -error: cannot derive Unaligned with repr(align(N > 1)) - --> tests/ui-nightly/enum.rs:191:8 - | -191 | #[repr(align(2), align(4))] - | ^^^^^^^^ - -error[E0565]: meta item in `repr` must be an identifier - --> tests/ui-nightly/enum.rs:19:8 - | -19 | #[repr("foo")] - | ^^^^^ - -error[E0552]: unrecognized representation hint - --> tests/ui-nightly/enum.rs:25:8 - | -25 | #[repr(foo)] - | ^^^ - | - = help: valid reprs are `Rust` (default), `C`, `align`, `packed`, `transparent`, `simd`, `i8`, `u8`, `i16`, `u16`, `i32`, `u32`, `i64`, `u64`, `i128`, `u128`, `isize`, `usize` - -error[E0566]: conflicting representation hints - --> tests/ui-nightly/enum.rs:37:8 - | -37 | #[repr(u8, u16)] - | ^^ ^^^ - | - = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = note: for more information, see issue #68585 - = note: `#[deny(conflicting_repr_hints)]` on by default diff -Nru temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-nightly/late_compile_pass.rs temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-nightly/late_compile_pass.rs --- temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-nightly/late_compile_pass.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-nightly/late_compile_pass.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,74 +0,0 @@ -// Copyright 2019 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -#[macro_use] -extern crate zerocopy; - -#[path = "../util.rs"] -mod util; - -use self::util::{NotZerocopy, AU16}; - -fn main() {} - -// These tests cause errors which are generated by a later compilation pass than -// the other errors we generate, and so if they're compiled in the same file, -// the compiler will never get to that pass, and so we won't get the errors. - -// -// FromZeroes errors -// - -#[derive(FromZeroes)] -struct FromZeroes1 { - value: NotZerocopy, -} - -// -// FromBytes errors -// - -#[derive(FromBytes)] -struct FromBytes1 { - value: NotZerocopy, -} - -// -// AsBytes errors -// - -#[derive(AsBytes)] -#[repr(C)] -struct AsBytes1 { - value: NotZerocopy, -} - -// -// Unaligned errors -// - -#[derive(Unaligned)] -#[repr(C)] -struct Unaligned1 { - aligned: AU16, -} - -// This specifically tests a bug we had in an old version of the code in which -// the trait bound would only be enforced for the first field's type. -#[derive(Unaligned)] -#[repr(C)] -struct Unaligned2 { - unaligned: u8, - aligned: AU16, -} - -#[derive(Unaligned)] -#[repr(transparent)] -struct Unaligned3 { - aligned: AU16, -} diff -Nru temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-nightly/late_compile_pass.stderr temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-nightly/late_compile_pass.stderr --- temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-nightly/late_compile_pass.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-nightly/late_compile_pass.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,142 +0,0 @@ -error[E0277]: the trait bound `NotZerocopy: FromZeroes` is not satisfied - --> tests/ui-nightly/late_compile_pass.rs:27:10 - | -27 | #[derive(FromZeroes)] - | ^^^^^^^^^^ the trait `FromZeroes` is not implemented for `NotZerocopy` - | - = help: the following other types implement trait `FromZeroes`: - bool - char - isize - i8 - i16 - i32 - i64 - i128 - and $N others - = help: see issue #48214 - = help: add `#![feature(trivial_bounds)]` to the crate attributes to enable - = note: this error originates in the derive macro `FromZeroes` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the trait bound `NotZerocopy: FromBytes` is not satisfied - --> tests/ui-nightly/late_compile_pass.rs:36:10 - | -36 | #[derive(FromBytes)] - | ^^^^^^^^^ the trait `FromBytes` is not implemented for `NotZerocopy` - | - = help: the following other types implement trait `FromBytes`: - isize - i8 - i16 - i32 - i64 - i128 - usize - u8 - and $N others - = help: see issue #48214 - = help: add `#![feature(trivial_bounds)]` to the crate attributes to enable - = note: this error originates in the derive macro `FromBytes` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the trait bound `FromBytes1: FromZeroes` is not satisfied - --> tests/ui-nightly/late_compile_pass.rs:36:10 - | -36 | #[derive(FromBytes)] - | ^^^^^^^^^ the trait `FromZeroes` is not implemented for `FromBytes1` - | - = help: the following other types implement trait `FromZeroes`: - bool - char - isize - i8 - i16 - i32 - i64 - i128 - and $N others -note: required by a bound in `FromBytes` - --> $WORKSPACE/src/lib.rs - | - | pub unsafe trait FromBytes: FromZeroes { - | ^^^^^^^^^^ required by this bound in `FromBytes` - = note: this error originates in the derive macro `FromBytes` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the trait bound `NotZerocopy: AsBytes` is not satisfied - --> tests/ui-nightly/late_compile_pass.rs:45:10 - | -45 | #[derive(AsBytes)] - | ^^^^^^^ the trait `AsBytes` is not implemented for `NotZerocopy` - | - = help: the following other types implement trait `AsBytes`: - bool - char - isize - i8 - i16 - i32 - i64 - i128 - and $N others - = help: see issue #48214 - = help: add `#![feature(trivial_bounds)]` to the crate attributes to enable - = note: this error originates in the derive macro `AsBytes` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the trait bound `AU16: Unaligned` is not satisfied - --> tests/ui-nightly/late_compile_pass.rs:55:10 - | -55 | #[derive(Unaligned)] - | ^^^^^^^^^ the trait `Unaligned` is not implemented for `AU16` - | - = help: the following other types implement trait `Unaligned`: - bool - i8 - u8 - Unaligned1 - Unaligned2 - Unaligned3 - U16 - U32 - and $N others - = help: see issue #48214 - = help: add `#![feature(trivial_bounds)]` to the crate attributes to enable - = note: this error originates in the derive macro `Unaligned` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the trait bound `AU16: Unaligned` is not satisfied - --> tests/ui-nightly/late_compile_pass.rs:63:10 - | -63 | #[derive(Unaligned)] - | ^^^^^^^^^ the trait `Unaligned` is not implemented for `AU16` - | - = help: the following other types implement trait `Unaligned`: - bool - i8 - u8 - Unaligned1 - Unaligned2 - Unaligned3 - U16 - U32 - and $N others - = help: see issue #48214 - = help: add `#![feature(trivial_bounds)]` to the crate attributes to enable - = note: this error originates in the derive macro `Unaligned` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the trait bound `AU16: Unaligned` is not satisfied - --> tests/ui-nightly/late_compile_pass.rs:70:10 - | -70 | #[derive(Unaligned)] - | ^^^^^^^^^ the trait `Unaligned` is not implemented for `AU16` - | - = help: the following other types implement trait `Unaligned`: - bool - i8 - u8 - Unaligned1 - Unaligned2 - Unaligned3 - U16 - U32 - and $N others - = help: see issue #48214 - = help: add `#![feature(trivial_bounds)]` to the crate attributes to enable - = note: this error originates in the derive macro `Unaligned` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-nightly/struct.rs temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-nightly/struct.rs --- temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-nightly/struct.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-nightly/struct.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,75 +0,0 @@ -// Copyright 2019 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -#[macro_use] -extern crate zerocopy; - -#[path = "../util.rs"] -mod util; - -use static_assertions::assert_impl_all; -use zerocopy::KnownLayout; - -use self::util::AU16; - -fn main() {} - -// -// KnownLayout errors -// - -#[derive(KnownLayout)] -struct KnownLayout1([u8]); - -assert_impl_all!(KnownLayout1: KnownLayout); - -#[derive(KnownLayout)] -struct KnownLayout2(T); - -assert_impl_all!(KnownLayout2<[u8]>: KnownLayout); - -// -// AsBytes errors -// - -#[derive(AsBytes)] -#[repr(C)] -struct AsBytes1(T); - -#[derive(AsBytes)] -#[repr(C)] -struct AsBytes2 { - foo: u8, - bar: AU16, -} - -// -// Unaligned errors -// - -#[derive(Unaligned)] -#[repr(C, align(2))] -struct Unaligned1; - -#[derive(Unaligned)] -#[repr(transparent, align(2))] -struct Unaligned2 { - foo: u8, -} - -#[derive(Unaligned)] -#[repr(packed, align(2))] -struct Unaligned3; - -#[derive(Unaligned)] -#[repr(align(1), align(2))] -struct Unaligned4; - -#[derive(Unaligned)] -#[repr(align(2), align(4))] -struct Unaligned5; diff -Nru temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-nightly/struct.stderr temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-nightly/struct.stderr --- temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-nightly/struct.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-nightly/struct.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,60 +0,0 @@ -error: unsupported on generic structs that are not repr(transparent) or repr(packed) - --> tests/ui-nightly/struct.rs:40:10 - | -40 | #[derive(AsBytes)] - | ^^^^^^^ - | - = note: this error originates in the derive macro `AsBytes` (in Nightly builds, run with -Z macro-backtrace for more info) - -error: cannot derive Unaligned with repr(align(N > 1)) - --> tests/ui-nightly/struct.rs:56:11 - | -56 | #[repr(C, align(2))] - | ^^^^^^^^ - -error: cannot derive Unaligned with repr(align(N > 1)) - --> tests/ui-nightly/struct.rs:60:21 - | -60 | #[repr(transparent, align(2))] - | ^^^^^^^^ - -error: cannot derive Unaligned with repr(align(N > 1)) - --> tests/ui-nightly/struct.rs:66:16 - | -66 | #[repr(packed, align(2))] - | ^^^^^^^^ - -error: cannot derive Unaligned with repr(align(N > 1)) - --> tests/ui-nightly/struct.rs:70:18 - | -70 | #[repr(align(1), align(2))] - | ^^^^^^^^ - -error: cannot derive Unaligned with repr(align(N > 1)) - --> tests/ui-nightly/struct.rs:74:8 - | -74 | #[repr(align(2), align(4))] - | ^^^^^^^^ - -error[E0692]: transparent struct cannot have other repr hints - --> tests/ui-nightly/struct.rs:60:8 - | -60 | #[repr(transparent, align(2))] - | ^^^^^^^^^^^ ^^^^^^^^ - -error[E0277]: the trait bound `HasPadding: ShouldBe` is not satisfied - --> tests/ui-nightly/struct.rs:44:10 - | -44 | #[derive(AsBytes)] - | ^^^^^^^ the trait `ShouldBe` is not implemented for `HasPadding` - | - = help: the trait `ShouldBe` is implemented for `HasPadding` - = help: see issue #48214 - = help: add `#![feature(trivial_bounds)]` to the crate attributes to enable - = note: this error originates in the derive macro `AsBytes` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0587]: type has conflicting packed and align representation hints - --> tests/ui-nightly/struct.rs:67:1 - | -67 | struct Unaligned3; - | ^^^^^^^^^^^^^^^^^ diff -Nru temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-nightly/union.rs temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-nightly/union.rs --- temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-nightly/union.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-nightly/union.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,73 +0,0 @@ -// Copyright 2019 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -#[macro_use] -extern crate zerocopy; - -#[path = "../util.rs"] -mod util; - -use self::util::AU16; -use std::mem::ManuallyDrop; - -fn main() {} - -// -// AsBytes errors -// - -#[derive(AsBytes)] -#[repr(C)] -union AsBytes1 { - foo: ManuallyDrop, -} - -#[derive(AsBytes)] -#[repr(C)] -union AsBytes2 { - foo: u8, - bar: [u8; 2], -} - -// -// Unaligned errors -// - -#[derive(Unaligned)] -#[repr(C, align(2))] -union Unaligned1 { - foo: i16, - bar: AU16, -} - -// Transparent unions are unstable; see issue #60405 -// for more information. - -// #[derive(Unaligned)] -// #[repr(transparent, align(2))] -// union Unaligned2 { -// foo: u8, -// } - -#[derive(Unaligned)] -#[repr(packed, align(2))] -union Unaligned3 { - foo: u8, -} - -#[derive(Unaligned)] -#[repr(align(1), align(2))] -struct Unaligned4 { - foo: u8, -} - -#[derive(Unaligned)] -#[repr(align(2), align(4))] -struct Unaligned5 { - foo: u8, -} diff -Nru temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-nightly/union.stderr temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-nightly/union.stderr --- temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-nightly/union.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-nightly/union.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,48 +0,0 @@ -error: unsupported on types with type parameters - --> tests/ui-nightly/union.rs:24:10 - | -24 | #[derive(AsBytes)] - | ^^^^^^^ - | - = note: this error originates in the derive macro `AsBytes` (in Nightly builds, run with -Z macro-backtrace for more info) - -error: cannot derive Unaligned with repr(align(N > 1)) - --> tests/ui-nightly/union.rs:42:11 - | -42 | #[repr(C, align(2))] - | ^^^^^^^^ - -error: cannot derive Unaligned with repr(align(N > 1)) - --> tests/ui-nightly/union.rs:58:16 - | -58 | #[repr(packed, align(2))] - | ^^^^^^^^ - -error: cannot derive Unaligned with repr(align(N > 1)) - --> tests/ui-nightly/union.rs:64:18 - | -64 | #[repr(align(1), align(2))] - | ^^^^^^^^ - -error: cannot derive Unaligned with repr(align(N > 1)) - --> tests/ui-nightly/union.rs:70:8 - | -70 | #[repr(align(2), align(4))] - | ^^^^^^^^ - -error[E0277]: the trait bound `HasPadding: ShouldBe` is not satisfied - --> tests/ui-nightly/union.rs:30:10 - | -30 | #[derive(AsBytes)] - | ^^^^^^^ the trait `ShouldBe` is not implemented for `HasPadding` - | - = help: the trait `ShouldBe` is implemented for `HasPadding` - = help: see issue #48214 - = help: add `#![feature(trivial_bounds)]` to the crate attributes to enable - = note: this error originates in the derive macro `AsBytes` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0587]: type has conflicting packed and align representation hints - --> tests/ui-nightly/union.rs:59:1 - | -59 | union Unaligned3 { - | ^^^^^^^^^^^^^^^^ diff -Nru temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-stable/derive_transparent.rs temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-stable/derive_transparent.rs --- temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-stable/derive_transparent.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-stable/derive_transparent.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,40 +0,0 @@ -// Copyright 2019 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -extern crate zerocopy; - -#[path = "../util.rs"] -mod util; - -use core::marker::PhantomData; - -use { - static_assertions::assert_impl_all, - zerocopy::{AsBytes, FromBytes, FromZeroes, Unaligned}, -}; - -use self::util::NotZerocopy; - -fn main() {} - -// Test generic transparent structs - -#[derive(AsBytes, FromZeroes, FromBytes, Unaligned)] -#[repr(transparent)] -struct TransparentStruct { - inner: T, - _phantom: PhantomData<()>, -} - -// It should be legal to derive these traits on a transparent struct, but it -// must also ensure the traits are only implemented when the inner type -// implements them. -assert_impl_all!(TransparentStruct: FromZeroes); -assert_impl_all!(TransparentStruct: FromBytes); -assert_impl_all!(TransparentStruct: AsBytes); -assert_impl_all!(TransparentStruct: Unaligned); diff -Nru temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-stable/derive_transparent.stderr temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-stable/derive_transparent.stderr --- temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-stable/derive_transparent.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-stable/derive_transparent.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,111 +0,0 @@ -error[E0277]: the trait bound `NotZerocopy: FromZeroes` is not satisfied - --> tests/ui-stable/derive_transparent.rs:37:18 - | -37 | assert_impl_all!(TransparentStruct: FromZeroes); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `FromZeroes` is not implemented for `NotZerocopy` - | - = help: the following other types implement trait `FromZeroes`: - bool - char - isize - i8 - i16 - i32 - i64 - i128 - and $N others -note: required for `TransparentStruct` to implement `FromZeroes` - --> tests/ui-stable/derive_transparent.rs:27:19 - | -27 | #[derive(AsBytes, FromZeroes, FromBytes, Unaligned)] - | ^^^^^^^^^^ unsatisfied trait bound introduced in this `derive` macro -note: required by a bound in `_::{closure#0}::assert_impl_all` - --> tests/ui-stable/derive_transparent.rs:37:1 - | -37 | assert_impl_all!(TransparentStruct: FromZeroes); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `assert_impl_all` - = note: this error originates in the derive macro `FromZeroes` which comes from the expansion of the macro `assert_impl_all` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the trait bound `NotZerocopy: FromBytes` is not satisfied - --> tests/ui-stable/derive_transparent.rs:38:18 - | -38 | assert_impl_all!(TransparentStruct: FromBytes); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `FromBytes` is not implemented for `NotZerocopy` - | - = help: the following other types implement trait `FromBytes`: - isize - i8 - i16 - i32 - i64 - i128 - usize - u8 - and $N others -note: required for `TransparentStruct` to implement `FromBytes` - --> tests/ui-stable/derive_transparent.rs:27:31 - | -27 | #[derive(AsBytes, FromZeroes, FromBytes, Unaligned)] - | ^^^^^^^^^ unsatisfied trait bound introduced in this `derive` macro -note: required by a bound in `_::{closure#0}::assert_impl_all` - --> tests/ui-stable/derive_transparent.rs:38:1 - | -38 | assert_impl_all!(TransparentStruct: FromBytes); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `assert_impl_all` - = note: this error originates in the derive macro `FromBytes` which comes from the expansion of the macro `assert_impl_all` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the trait bound `NotZerocopy: AsBytes` is not satisfied - --> tests/ui-stable/derive_transparent.rs:39:18 - | -39 | assert_impl_all!(TransparentStruct: AsBytes); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `AsBytes` is not implemented for `NotZerocopy` - | - = help: the following other types implement trait `AsBytes`: - bool - char - isize - i8 - i16 - i32 - i64 - i128 - and $N others -note: required for `TransparentStruct` to implement `AsBytes` - --> tests/ui-stable/derive_transparent.rs:27:10 - | -27 | #[derive(AsBytes, FromZeroes, FromBytes, Unaligned)] - | ^^^^^^^ unsatisfied trait bound introduced in this `derive` macro -note: required by a bound in `_::{closure#0}::assert_impl_all` - --> tests/ui-stable/derive_transparent.rs:39:1 - | -39 | assert_impl_all!(TransparentStruct: AsBytes); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `assert_impl_all` - = note: this error originates in the derive macro `AsBytes` which comes from the expansion of the macro `assert_impl_all` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the trait bound `NotZerocopy: Unaligned` is not satisfied - --> tests/ui-stable/derive_transparent.rs:40:18 - | -40 | assert_impl_all!(TransparentStruct: Unaligned); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Unaligned` is not implemented for `NotZerocopy` - | - = help: the following other types implement trait `Unaligned`: - bool - i8 - u8 - TransparentStruct - U16 - U32 - U64 - U128 - and $N others -note: required for `TransparentStruct` to implement `Unaligned` - --> tests/ui-stable/derive_transparent.rs:27:42 - | -27 | #[derive(AsBytes, FromZeroes, FromBytes, Unaligned)] - | ^^^^^^^^^ unsatisfied trait bound introduced in this `derive` macro -note: required by a bound in `_::{closure#0}::assert_impl_all` - --> tests/ui-stable/derive_transparent.rs:40:1 - | -40 | assert_impl_all!(TransparentStruct: Unaligned); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `assert_impl_all` - = note: this error originates in the derive macro `Unaligned` which comes from the expansion of the macro `assert_impl_all` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-stable/enum_from_bytes_u8_too_few.rs temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-stable/enum_from_bytes_u8_too_few.rs --- temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-stable/enum_from_bytes_u8_too_few.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-stable/enum_from_bytes_u8_too_few.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,272 +0,0 @@ -// Copyright 2019 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -#[macro_use] -extern crate zerocopy; - -fn main() {} - -#[derive(FromBytes)] -#[repr(u8)] -enum Foo { - Variant0, - Variant1, - Variant2, - Variant3, - Variant4, - Variant5, - Variant6, - Variant7, - Variant8, - Variant9, - Variant10, - Variant11, - Variant12, - Variant13, - Variant14, - Variant15, - Variant16, - Variant17, - Variant18, - Variant19, - Variant20, - Variant21, - Variant22, - Variant23, - Variant24, - Variant25, - Variant26, - Variant27, - Variant28, - Variant29, - Variant30, - Variant31, - Variant32, - Variant33, - Variant34, - Variant35, - Variant36, - Variant37, - Variant38, - Variant39, - Variant40, - Variant41, - Variant42, - Variant43, - Variant44, - Variant45, - Variant46, - Variant47, - Variant48, - Variant49, - Variant50, - Variant51, - Variant52, - Variant53, - Variant54, - Variant55, - Variant56, - Variant57, - Variant58, - Variant59, - Variant60, - Variant61, - Variant62, - Variant63, - Variant64, - Variant65, - Variant66, - Variant67, - Variant68, - Variant69, - Variant70, - Variant71, - Variant72, - Variant73, - Variant74, - Variant75, - Variant76, - Variant77, - Variant78, - Variant79, - Variant80, - Variant81, - Variant82, - Variant83, - Variant84, - Variant85, - Variant86, - Variant87, - Variant88, - Variant89, - Variant90, - Variant91, - Variant92, - Variant93, - Variant94, - Variant95, - Variant96, - Variant97, - Variant98, - Variant99, - Variant100, - Variant101, - Variant102, - Variant103, - Variant104, - Variant105, - Variant106, - Variant107, - Variant108, - Variant109, - Variant110, - Variant111, - Variant112, - Variant113, - Variant114, - Variant115, - Variant116, - Variant117, - Variant118, - Variant119, - Variant120, - Variant121, - Variant122, - Variant123, - Variant124, - Variant125, - Variant126, - Variant127, - Variant128, - Variant129, - Variant130, - Variant131, - Variant132, - Variant133, - Variant134, - Variant135, - Variant136, - Variant137, - Variant138, - Variant139, - Variant140, - Variant141, - Variant142, - Variant143, - Variant144, - Variant145, - Variant146, - Variant147, - Variant148, - Variant149, - Variant150, - Variant151, - Variant152, - Variant153, - Variant154, - Variant155, - Variant156, - Variant157, - Variant158, - Variant159, - Variant160, - Variant161, - Variant162, - Variant163, - Variant164, - Variant165, - Variant166, - Variant167, - Variant168, - Variant169, - Variant170, - Variant171, - Variant172, - Variant173, - Variant174, - Variant175, - Variant176, - Variant177, - Variant178, - Variant179, - Variant180, - Variant181, - Variant182, - Variant183, - Variant184, - Variant185, - Variant186, - Variant187, - Variant188, - Variant189, - Variant190, - Variant191, - Variant192, - Variant193, - Variant194, - Variant195, - Variant196, - Variant197, - Variant198, - Variant199, - Variant200, - Variant201, - Variant202, - Variant203, - Variant204, - Variant205, - Variant206, - Variant207, - Variant208, - Variant209, - Variant210, - Variant211, - Variant212, - Variant213, - Variant214, - Variant215, - Variant216, - Variant217, - Variant218, - Variant219, - Variant220, - Variant221, - Variant222, - Variant223, - Variant224, - Variant225, - Variant226, - Variant227, - Variant228, - Variant229, - Variant230, - Variant231, - Variant232, - Variant233, - Variant234, - Variant235, - Variant236, - Variant237, - Variant238, - Variant239, - Variant240, - Variant241, - Variant242, - Variant243, - Variant244, - Variant245, - Variant246, - Variant247, - Variant248, - Variant249, - Variant250, - Variant251, - Variant252, - Variant253, - Variant254, -} diff -Nru temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-stable/enum_from_bytes_u8_too_few.stderr temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-stable/enum_from_bytes_u8_too_few.stderr --- temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-stable/enum_from_bytes_u8_too_few.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-stable/enum_from_bytes_u8_too_few.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,11 +0,0 @@ -error: FromBytes only supported on repr(u8) enum with 256 variants - --> tests/ui-stable/enum_from_bytes_u8_too_few.rs:15:1 - | -15 | / #[repr(u8)] -16 | | enum Foo { -17 | | Variant0, -18 | | Variant1, -... | -271 | | Variant254, -272 | | } - | |_^ diff -Nru temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-stable/enum.rs temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-stable/enum.rs --- temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-stable/enum.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-stable/enum.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,194 +0,0 @@ -// Copyright 2019 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -#[macro_use] -extern crate zerocopy; - -fn main() {} - -// -// Generic errors -// - -#[derive(FromZeroes, FromBytes)] -#[repr("foo")] -enum Generic1 { - A, -} - -#[derive(FromZeroes, FromBytes)] -#[repr(foo)] -enum Generic2 { - A, -} - -#[derive(FromZeroes, FromBytes)] -#[repr(transparent)] -enum Generic3 { - A, -} - -#[derive(FromZeroes, FromBytes)] -#[repr(u8, u16)] -enum Generic4 { - A, -} - -#[derive(FromZeroes, FromBytes)] -enum Generic5 { - A, -} - -// -// FromZeroes errors -// - -#[derive(FromZeroes)] -enum FromZeroes1 { - A(u8), -} - -#[derive(FromZeroes)] -enum FromZeroes2 { - A, - B(u8), -} - -#[derive(FromZeroes)] -enum FromZeroes3 { - A = 1, - B, -} - -// -// FromBytes errors -// - -#[derive(FromZeroes, FromBytes)] -#[repr(C)] -enum FromBytes1 { - A, -} - -#[derive(FromZeroes, FromBytes)] -#[repr(usize)] -enum FromBytes2 { - A, -} - -#[derive(FromZeroes, FromBytes)] -#[repr(isize)] -enum FromBytes3 { - A, -} - -#[derive(FromZeroes, FromBytes)] -#[repr(u32)] -enum FromBytes4 { - A, -} - -#[derive(FromZeroes, FromBytes)] -#[repr(i32)] -enum FromBytes5 { - A, -} - -#[derive(FromZeroes, FromBytes)] -#[repr(u64)] -enum FromBytes6 { - A, -} - -#[derive(FromZeroes, FromBytes)] -#[repr(i64)] -enum FromBytes7 { - A, -} - -// -// Unaligned errors -// - -#[derive(Unaligned)] -#[repr(C)] -enum Unaligned1 { - A, -} - -#[derive(Unaligned)] -#[repr(u16)] -enum Unaligned2 { - A, -} - -#[derive(Unaligned)] -#[repr(i16)] -enum Unaligned3 { - A, -} - -#[derive(Unaligned)] -#[repr(u32)] -enum Unaligned4 { - A, -} - -#[derive(Unaligned)] -#[repr(i32)] -enum Unaligned5 { - A, -} - -#[derive(Unaligned)] -#[repr(u64)] -enum Unaligned6 { - A, -} - -#[derive(Unaligned)] -#[repr(i64)] -enum Unaligned7 { - A, -} - -#[derive(Unaligned)] -#[repr(usize)] -enum Unaligned8 { - A, -} - -#[derive(Unaligned)] -#[repr(isize)] -enum Unaligned9 { - A, -} - -#[derive(Unaligned)] -#[repr(u8, align(2))] -enum Unaligned10 { - A, -} - -#[derive(Unaligned)] -#[repr(i8, align(2))] -enum Unaligned11 { - A, -} - -#[derive(Unaligned)] -#[repr(align(1), align(2))] -enum Unaligned12 { - A, -} - -#[derive(Unaligned)] -#[repr(align(2), align(4))] -enum Unaligned13 { - A, -} diff -Nru temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-stable/enum.stderr temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-stable/enum.stderr --- temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-stable/enum.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-stable/enum.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,201 +0,0 @@ -error: unrecognized representation hint - --> tests/ui-stable/enum.rs:19:8 - | -19 | #[repr("foo")] - | ^^^^^ - -error: unrecognized representation hint - --> tests/ui-stable/enum.rs:25:8 - | -25 | #[repr(foo)] - | ^^^ - -error: unsupported representation for deriving FromBytes, AsBytes, or Unaligned on an enum - --> tests/ui-stable/enum.rs:31:8 - | -31 | #[repr(transparent)] - | ^^^^^^^^^^^ - -error: conflicting representation hints - --> tests/ui-stable/enum.rs:37:1 - | -37 | #[repr(u8, u16)] - | ^ - -error: must have a non-align #[repr(...)] attribute in order to guarantee this type's memory layout - --> tests/ui-stable/enum.rs:42:22 - | -42 | #[derive(FromZeroes, FromBytes)] - | ^^^^^^^^^ - | - = note: this error originates in the derive macro `FromBytes` (in Nightly builds, run with -Z macro-backtrace for more info) - -error: only C-like enums can implement FromZeroes - --> tests/ui-stable/enum.rs:52:1 - | -52 | / enum FromZeroes1 { -53 | | A(u8), -54 | | } - | |_^ - -error: only C-like enums can implement FromZeroes - --> tests/ui-stable/enum.rs:57:1 - | -57 | / enum FromZeroes2 { -58 | | A, -59 | | B(u8), -60 | | } - | |_^ - -error: FromZeroes only supported on enums with a variant that has a discriminant of `0` - --> tests/ui-stable/enum.rs:63:1 - | -63 | / enum FromZeroes3 { -64 | | A = 1, -65 | | B, -66 | | } - | |_^ - -error: FromBytes requires repr of "u8", "u16", "i8", or "i16" - --> tests/ui-stable/enum.rs:73:8 - | -73 | #[repr(C)] - | ^ - -error: FromBytes requires repr of "u8", "u16", "i8", or "i16" - --> tests/ui-stable/enum.rs:79:8 - | -79 | #[repr(usize)] - | ^^^^^ - -error: FromBytes requires repr of "u8", "u16", "i8", or "i16" - --> tests/ui-stable/enum.rs:85:8 - | -85 | #[repr(isize)] - | ^^^^^ - -error: FromBytes requires repr of "u8", "u16", "i8", or "i16" - --> tests/ui-stable/enum.rs:91:8 - | -91 | #[repr(u32)] - | ^^^ - -error: FromBytes requires repr of "u8", "u16", "i8", or "i16" - --> tests/ui-stable/enum.rs:97:8 - | -97 | #[repr(i32)] - | ^^^ - -error: FromBytes requires repr of "u8", "u16", "i8", or "i16" - --> tests/ui-stable/enum.rs:103:8 - | -103 | #[repr(u64)] - | ^^^ - -error: FromBytes requires repr of "u8", "u16", "i8", or "i16" - --> tests/ui-stable/enum.rs:109:8 - | -109 | #[repr(i64)] - | ^^^ - -error: Unaligned requires repr of "u8" or "i8", and no alignment (i.e., repr(align(N > 1))) - --> tests/ui-stable/enum.rs:119:8 - | -119 | #[repr(C)] - | ^ - -error: Unaligned requires repr of "u8" or "i8", and no alignment (i.e., repr(align(N > 1))) - --> tests/ui-stable/enum.rs:125:8 - | -125 | #[repr(u16)] - | ^^^ - -error: Unaligned requires repr of "u8" or "i8", and no alignment (i.e., repr(align(N > 1))) - --> tests/ui-stable/enum.rs:131:8 - | -131 | #[repr(i16)] - | ^^^ - -error: Unaligned requires repr of "u8" or "i8", and no alignment (i.e., repr(align(N > 1))) - --> tests/ui-stable/enum.rs:137:8 - | -137 | #[repr(u32)] - | ^^^ - -error: Unaligned requires repr of "u8" or "i8", and no alignment (i.e., repr(align(N > 1))) - --> tests/ui-stable/enum.rs:143:8 - | -143 | #[repr(i32)] - | ^^^ - -error: Unaligned requires repr of "u8" or "i8", and no alignment (i.e., repr(align(N > 1))) - --> tests/ui-stable/enum.rs:149:8 - | -149 | #[repr(u64)] - | ^^^ - -error: Unaligned requires repr of "u8" or "i8", and no alignment (i.e., repr(align(N > 1))) - --> tests/ui-stable/enum.rs:155:8 - | -155 | #[repr(i64)] - | ^^^ - -error: Unaligned requires repr of "u8" or "i8", and no alignment (i.e., repr(align(N > 1))) - --> tests/ui-stable/enum.rs:161:8 - | -161 | #[repr(usize)] - | ^^^^^ - -error: Unaligned requires repr of "u8" or "i8", and no alignment (i.e., repr(align(N > 1))) - --> tests/ui-stable/enum.rs:167:8 - | -167 | #[repr(isize)] - | ^^^^^ - -error: cannot derive Unaligned with repr(align(N > 1)) - --> tests/ui-stable/enum.rs:173:12 - | -173 | #[repr(u8, align(2))] - | ^^^^^^^^ - -error: cannot derive Unaligned with repr(align(N > 1)) - --> tests/ui-stable/enum.rs:179:12 - | -179 | #[repr(i8, align(2))] - | ^^^^^^^^ - -error: cannot derive Unaligned with repr(align(N > 1)) - --> tests/ui-stable/enum.rs:185:18 - | -185 | #[repr(align(1), align(2))] - | ^^^^^^^^ - -error: cannot derive Unaligned with repr(align(N > 1)) - --> tests/ui-stable/enum.rs:191:8 - | -191 | #[repr(align(2), align(4))] - | ^^^^^^^^ - -error[E0565]: meta item in `repr` must be an identifier - --> tests/ui-stable/enum.rs:19:8 - | -19 | #[repr("foo")] - | ^^^^^ - -error[E0552]: unrecognized representation hint - --> tests/ui-stable/enum.rs:25:8 - | -25 | #[repr(foo)] - | ^^^ - | - = help: valid reprs are `C`, `align`, `packed`, `transparent`, `simd`, `i8`, `u8`, `i16`, `u16`, `i32`, `u32`, `i64`, `u64`, `i128`, `u128`, `isize`, `usize` - -error[E0566]: conflicting representation hints - --> tests/ui-stable/enum.rs:37:8 - | -37 | #[repr(u8, u16)] - | ^^ ^^^ - | - = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = note: for more information, see issue #68585 - = note: `#[deny(conflicting_repr_hints)]` on by default diff -Nru temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-stable/late_compile_pass.rs temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-stable/late_compile_pass.rs --- temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-stable/late_compile_pass.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-stable/late_compile_pass.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,74 +0,0 @@ -// Copyright 2019 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -#[macro_use] -extern crate zerocopy; - -#[path = "../util.rs"] -mod util; - -use self::util::{NotZerocopy, AU16}; - -fn main() {} - -// These tests cause errors which are generated by a later compilation pass than -// the other errors we generate, and so if they're compiled in the same file, -// the compiler will never get to that pass, and so we won't get the errors. - -// -// FromZeroes errors -// - -#[derive(FromZeroes)] -struct FromZeroes1 { - value: NotZerocopy, -} - -// -// FromBytes errors -// - -#[derive(FromBytes)] -struct FromBytes1 { - value: NotZerocopy, -} - -// -// AsBytes errors -// - -#[derive(AsBytes)] -#[repr(C)] -struct AsBytes1 { - value: NotZerocopy, -} - -// -// Unaligned errors -// - -#[derive(Unaligned)] -#[repr(C)] -struct Unaligned1 { - aligned: AU16, -} - -// This specifically tests a bug we had in an old version of the code in which -// the trait bound would only be enforced for the first field's type. -#[derive(Unaligned)] -#[repr(C)] -struct Unaligned2 { - unaligned: u8, - aligned: AU16, -} - -#[derive(Unaligned)] -#[repr(transparent)] -struct Unaligned3 { - aligned: AU16, -} diff -Nru temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-stable/late_compile_pass.stderr temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-stable/late_compile_pass.stderr --- temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-stable/late_compile_pass.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-stable/late_compile_pass.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,136 +0,0 @@ -error[E0277]: the trait bound `NotZerocopy: FromZeroes` is not satisfied - --> tests/ui-stable/late_compile_pass.rs:27:10 - | -27 | #[derive(FromZeroes)] - | ^^^^^^^^^^ the trait `FromZeroes` is not implemented for `NotZerocopy` - | - = help: the following other types implement trait `FromZeroes`: - bool - char - isize - i8 - i16 - i32 - i64 - i128 - and $N others - = help: see issue #48214 - = note: this error originates in the derive macro `FromZeroes` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the trait bound `NotZerocopy: FromBytes` is not satisfied - --> tests/ui-stable/late_compile_pass.rs:36:10 - | -36 | #[derive(FromBytes)] - | ^^^^^^^^^ the trait `FromBytes` is not implemented for `NotZerocopy` - | - = help: the following other types implement trait `FromBytes`: - isize - i8 - i16 - i32 - i64 - i128 - usize - u8 - and $N others - = help: see issue #48214 - = note: this error originates in the derive macro `FromBytes` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the trait bound `FromBytes1: FromZeroes` is not satisfied - --> tests/ui-stable/late_compile_pass.rs:36:10 - | -36 | #[derive(FromBytes)] - | ^^^^^^^^^ the trait `FromZeroes` is not implemented for `FromBytes1` - | - = help: the following other types implement trait `FromZeroes`: - bool - char - isize - i8 - i16 - i32 - i64 - i128 - and $N others -note: required by a bound in `FromBytes` - --> $WORKSPACE/src/lib.rs - | - | pub unsafe trait FromBytes: FromZeroes { - | ^^^^^^^^^^ required by this bound in `FromBytes` - = note: this error originates in the derive macro `FromBytes` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the trait bound `NotZerocopy: AsBytes` is not satisfied - --> tests/ui-stable/late_compile_pass.rs:45:10 - | -45 | #[derive(AsBytes)] - | ^^^^^^^ the trait `AsBytes` is not implemented for `NotZerocopy` - | - = help: the following other types implement trait `AsBytes`: - bool - char - isize - i8 - i16 - i32 - i64 - i128 - and $N others - = help: see issue #48214 - = note: this error originates in the derive macro `AsBytes` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the trait bound `AU16: Unaligned` is not satisfied - --> tests/ui-stable/late_compile_pass.rs:55:10 - | -55 | #[derive(Unaligned)] - | ^^^^^^^^^ the trait `Unaligned` is not implemented for `AU16` - | - = help: the following other types implement trait `Unaligned`: - bool - i8 - u8 - Unaligned1 - Unaligned2 - Unaligned3 - U16 - U32 - and $N others - = help: see issue #48214 - = note: this error originates in the derive macro `Unaligned` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the trait bound `AU16: Unaligned` is not satisfied - --> tests/ui-stable/late_compile_pass.rs:63:10 - | -63 | #[derive(Unaligned)] - | ^^^^^^^^^ the trait `Unaligned` is not implemented for `AU16` - | - = help: the following other types implement trait `Unaligned`: - bool - i8 - u8 - Unaligned1 - Unaligned2 - Unaligned3 - U16 - U32 - and $N others - = help: see issue #48214 - = note: this error originates in the derive macro `Unaligned` (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: the trait bound `AU16: Unaligned` is not satisfied - --> tests/ui-stable/late_compile_pass.rs:70:10 - | -70 | #[derive(Unaligned)] - | ^^^^^^^^^ the trait `Unaligned` is not implemented for `AU16` - | - = help: the following other types implement trait `Unaligned`: - bool - i8 - u8 - Unaligned1 - Unaligned2 - Unaligned3 - U16 - U32 - and $N others - = help: see issue #48214 - = note: this error originates in the derive macro `Unaligned` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-stable/struct.rs temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-stable/struct.rs --- temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-stable/struct.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-stable/struct.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,75 +0,0 @@ -// Copyright 2019 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -#[macro_use] -extern crate zerocopy; - -#[path = "../util.rs"] -mod util; - -use static_assertions::assert_impl_all; -use zerocopy::KnownLayout; - -use self::util::AU16; - -fn main() {} - -// -// KnownLayout errors -// - -#[derive(KnownLayout)] -struct KnownLayout1([u8]); - -assert_impl_all!(KnownLayout1: KnownLayout); - -#[derive(KnownLayout)] -struct KnownLayout2(T); - -assert_impl_all!(KnownLayout2<[u8]>: KnownLayout); - -// -// AsBytes errors -// - -#[derive(AsBytes)] -#[repr(C)] -struct AsBytes1(T); - -#[derive(AsBytes)] -#[repr(C)] -struct AsBytes2 { - foo: u8, - bar: AU16, -} - -// -// Unaligned errors -// - -#[derive(Unaligned)] -#[repr(C, align(2))] -struct Unaligned1; - -#[derive(Unaligned)] -#[repr(transparent, align(2))] -struct Unaligned2 { - foo: u8, -} - -#[derive(Unaligned)] -#[repr(packed, align(2))] -struct Unaligned3; - -#[derive(Unaligned)] -#[repr(align(1), align(2))] -struct Unaligned4; - -#[derive(Unaligned)] -#[repr(align(2), align(4))] -struct Unaligned5; diff -Nru temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-stable/struct.stderr temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-stable/struct.stderr --- temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-stable/struct.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-stable/struct.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,53 +0,0 @@ -error: unsupported on generic structs that are not repr(transparent) or repr(packed) - --> tests/ui-stable/struct.rs:40:10 - | -40 | #[derive(AsBytes)] - | ^^^^^^^ - | - = note: this error originates in the derive macro `AsBytes` (in Nightly builds, run with -Z macro-backtrace for more info) - -error: cannot derive Unaligned with repr(align(N > 1)) - --> tests/ui-stable/struct.rs:56:11 - | -56 | #[repr(C, align(2))] - | ^^^^^^^^ - -error: cannot derive Unaligned with repr(align(N > 1)) - --> tests/ui-stable/struct.rs:60:21 - | -60 | #[repr(transparent, align(2))] - | ^^^^^^^^ - -error: cannot derive Unaligned with repr(align(N > 1)) - --> tests/ui-stable/struct.rs:66:16 - | -66 | #[repr(packed, align(2))] - | ^^^^^^^^ - -error: cannot derive Unaligned with repr(align(N > 1)) - --> tests/ui-stable/struct.rs:70:18 - | -70 | #[repr(align(1), align(2))] - | ^^^^^^^^ - -error: cannot derive Unaligned with repr(align(N > 1)) - --> tests/ui-stable/struct.rs:74:8 - | -74 | #[repr(align(2), align(4))] - | ^^^^^^^^ - -error[E0692]: transparent struct cannot have other repr hints - --> tests/ui-stable/struct.rs:60:8 - | -60 | #[repr(transparent, align(2))] - | ^^^^^^^^^^^ ^^^^^^^^ - -error[E0277]: the trait bound `HasPadding: ShouldBe` is not satisfied - --> tests/ui-stable/struct.rs:44:10 - | -44 | #[derive(AsBytes)] - | ^^^^^^^ the trait `ShouldBe` is not implemented for `HasPadding` - | - = help: the trait `ShouldBe` is implemented for `HasPadding` - = help: see issue #48214 - = note: this error originates in the derive macro `AsBytes` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-stable/union.rs temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-stable/union.rs --- temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-stable/union.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-stable/union.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,73 +0,0 @@ -// Copyright 2019 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -#[macro_use] -extern crate zerocopy; - -#[path = "../util.rs"] -mod util; - -use self::util::AU16; -use std::mem::ManuallyDrop; - -fn main() {} - -// -// AsBytes errors -// - -#[derive(AsBytes)] -#[repr(C)] -union AsBytes1 { - foo: ManuallyDrop, -} - -#[derive(AsBytes)] -#[repr(C)] -union AsBytes2 { - foo: u8, - bar: [u8; 2], -} - -// -// Unaligned errors -// - -#[derive(Unaligned)] -#[repr(C, align(2))] -union Unaligned1 { - foo: i16, - bar: AU16, -} - -// Transparent unions are unstable; see issue #60405 -// for more information. - -// #[derive(Unaligned)] -// #[repr(transparent, align(2))] -// union Unaligned2 { -// foo: u8, -// } - -#[derive(Unaligned)] -#[repr(packed, align(2))] -union Unaligned3 { - foo: u8, -} - -#[derive(Unaligned)] -#[repr(align(1), align(2))] -struct Unaligned4 { - foo: u8, -} - -#[derive(Unaligned)] -#[repr(align(2), align(4))] -struct Unaligned5 { - foo: u8, -} diff -Nru temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-stable/union.stderr temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-stable/union.stderr --- temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-stable/union.stderr 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy-derive/tests/ui-stable/union.stderr 1970-01-01 00:00:00.000000000 +0000 @@ -1,41 +0,0 @@ -error: unsupported on types with type parameters - --> tests/ui-stable/union.rs:24:10 - | -24 | #[derive(AsBytes)] - | ^^^^^^^ - | - = note: this error originates in the derive macro `AsBytes` (in Nightly builds, run with -Z macro-backtrace for more info) - -error: cannot derive Unaligned with repr(align(N > 1)) - --> tests/ui-stable/union.rs:42:11 - | -42 | #[repr(C, align(2))] - | ^^^^^^^^ - -error: cannot derive Unaligned with repr(align(N > 1)) - --> tests/ui-stable/union.rs:58:16 - | -58 | #[repr(packed, align(2))] - | ^^^^^^^^ - -error: cannot derive Unaligned with repr(align(N > 1)) - --> tests/ui-stable/union.rs:64:18 - | -64 | #[repr(align(1), align(2))] - | ^^^^^^^^ - -error: cannot derive Unaligned with repr(align(N > 1)) - --> tests/ui-stable/union.rs:70:8 - | -70 | #[repr(align(2), align(4))] - | ^^^^^^^^ - -error[E0277]: the trait bound `HasPadding: ShouldBe` is not satisfied - --> tests/ui-stable/union.rs:30:10 - | -30 | #[derive(AsBytes)] - | ^^^^^^^ the trait `ShouldBe` is not implemented for `HasPadding` - | - = help: the trait `ShouldBe` is implemented for `HasPadding` - = help: see issue #48214 - = note: this error originates in the derive macro `AsBytes` (in Nightly builds, run with -Z macro-backtrace for more info) diff -Nru temporalio-1.3.0/vendor/zerocopy-derive/tests/union_as_bytes.rs temporalio-1.3.0/vendor/zerocopy-derive/tests/union_as_bytes.rs --- temporalio-1.3.0/vendor/zerocopy-derive/tests/union_as_bytes.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy-derive/tests/union_as_bytes.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,75 +0,0 @@ -// Copyright 2019 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -#![allow(warnings)] - -use std::{marker::PhantomData, option::IntoIter}; - -use {static_assertions::assert_impl_all, zerocopy::AsBytes}; - -// A union is `AsBytes` if: -// - all fields are `AsBytes` -// - `repr(C)` or `repr(transparent)` and -// - no padding (size of union equals size of each field type) -// - `repr(packed)` - -#[derive(AsBytes, Clone, Copy)] -#[repr(C)] -union CZst { - a: (), -} - -assert_impl_all!(CZst: AsBytes); - -#[derive(AsBytes)] -#[repr(C)] -union C { - a: u8, - b: u8, -} - -assert_impl_all!(C: AsBytes); - -// Transparent unions are unstable; see issue #60405 -// for more information. - -// #[derive(AsBytes)] -// #[repr(transparent)] -// union Transparent { -// a: u8, -// b: CZst, -// } - -// is_as_bytes!(Transparent); - -#[derive(AsBytes)] -#[repr(C, packed)] -union CZstPacked { - a: (), -} - -assert_impl_all!(CZstPacked: AsBytes); - -#[derive(AsBytes)] -#[repr(C, packed)] -union CPacked { - a: u8, - b: i8, -} - -assert_impl_all!(CPacked: AsBytes); - -#[derive(AsBytes)] -#[repr(C, packed)] -union CMultibytePacked { - a: i32, - b: u32, - c: f32, -} - -assert_impl_all!(CMultibytePacked: AsBytes); diff -Nru temporalio-1.3.0/vendor/zerocopy-derive/tests/union_from_bytes.rs temporalio-1.3.0/vendor/zerocopy-derive/tests/union_from_bytes.rs --- temporalio-1.3.0/vendor/zerocopy-derive/tests/union_from_bytes.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy-derive/tests/union_from_bytes.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,56 +0,0 @@ -// Copyright 2019 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -#![allow(warnings)] - -use std::{marker::PhantomData, option::IntoIter}; - -use { - static_assertions::assert_impl_all, - zerocopy::{FromBytes, FromZeroes}, -}; - -// A union is `FromBytes` if: -// - all fields are `FromBytes` - -#[derive(Clone, Copy, FromZeroes, FromBytes)] -union Zst { - a: (), -} - -assert_impl_all!(Zst: FromBytes); - -#[derive(FromZeroes, FromBytes)] -union One { - a: u8, -} - -assert_impl_all!(One: FromBytes); - -#[derive(FromZeroes, FromBytes)] -union Two { - a: u8, - b: Zst, -} - -assert_impl_all!(Two: FromBytes); - -#[derive(FromZeroes, FromBytes)] -union TypeParams<'a, T: Copy, I: Iterator> -where - I::Item: Copy, -{ - a: T, - c: I::Item, - d: u8, - e: PhantomData<&'a [u8]>, - f: PhantomData<&'static str>, - g: PhantomData, -} - -assert_impl_all!(TypeParams<'static, (), IntoIter<()>>: FromBytes); diff -Nru temporalio-1.3.0/vendor/zerocopy-derive/tests/union_from_zeroes.rs temporalio-1.3.0/vendor/zerocopy-derive/tests/union_from_zeroes.rs --- temporalio-1.3.0/vendor/zerocopy-derive/tests/union_from_zeroes.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy-derive/tests/union_from_zeroes.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,56 +0,0 @@ -// Copyright 2019 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -#![allow(warnings)] - -#[macro_use] -mod util; - -use std::{marker::PhantomData, option::IntoIter}; - -use {static_assertions::assert_impl_all, zerocopy::FromZeroes}; - -// A union is `FromZeroes` if: -// - all fields are `FromZeroes` - -#[derive(Clone, Copy, FromZeroes)] -union Zst { - a: (), -} - -assert_impl_all!(Zst: FromZeroes); - -#[derive(FromZeroes)] -union One { - a: bool, -} - -assert_impl_all!(One: FromZeroes); - -#[derive(FromZeroes)] -union Two { - a: bool, - b: Zst, -} - -assert_impl_all!(Two: FromZeroes); - -#[derive(FromZeroes)] -union TypeParams<'a, T: Copy, I: Iterator> -where - I::Item: Copy, -{ - a: T, - c: I::Item, - d: u8, - e: PhantomData<&'a [u8]>, - f: PhantomData<&'static str>, - g: PhantomData, -} - -assert_impl_all!(TypeParams<'static, (), IntoIter<()>>: FromZeroes); diff -Nru temporalio-1.3.0/vendor/zerocopy-derive/tests/union_known_layout.rs temporalio-1.3.0/vendor/zerocopy-derive/tests/union_known_layout.rs --- temporalio-1.3.0/vendor/zerocopy-derive/tests/union_known_layout.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy-derive/tests/union_known_layout.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,49 +0,0 @@ -// Copyright 2022 The Fuchsia Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#![allow(warnings)] - -#[macro_use] -mod util; - -use std::{marker::PhantomData, option::IntoIter}; - -use {static_assertions::assert_impl_all, zerocopy::KnownLayout}; - -#[derive(Clone, Copy, KnownLayout)] -union Zst { - a: (), -} - -assert_impl_all!(Zst: KnownLayout); - -#[derive(KnownLayout)] -union One { - a: bool, -} - -assert_impl_all!(One: KnownLayout); - -#[derive(KnownLayout)] -union Two { - a: bool, - b: Zst, -} - -assert_impl_all!(Two: KnownLayout); - -#[derive(KnownLayout)] -union TypeParams<'a, T: Copy, I: Iterator> -where - I::Item: Copy, -{ - a: T, - c: I::Item, - d: u8, - e: PhantomData<&'a [u8]>, - f: PhantomData<&'static str>, - g: PhantomData, -} - -assert_impl_all!(TypeParams<'static, (), IntoIter<()>>: KnownLayout); diff -Nru temporalio-1.3.0/vendor/zerocopy-derive/tests/union_unaligned.rs temporalio-1.3.0/vendor/zerocopy-derive/tests/union_unaligned.rs --- temporalio-1.3.0/vendor/zerocopy-derive/tests/union_unaligned.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy-derive/tests/union_unaligned.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,77 +0,0 @@ -// Copyright 2019 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -#![allow(warnings)] - -use std::{marker::PhantomData, option::IntoIter}; - -use {static_assertions::assert_impl_all, zerocopy::Unaligned}; - -// A union is `Unaligned` if: -// - `repr(align)` is no more than 1 and either -// - `repr(C)` or `repr(transparent)` and -// - all fields `Unaligned` -// - `repr(packed)` - -#[derive(Unaligned)] -#[repr(C)] -union Foo { - a: u8, -} - -assert_impl_all!(Foo: Unaligned); - -// Transparent unions are unstable; see issue #60405 -// for more information. - -// #[derive(Unaligned)] -// #[repr(transparent)] -// union Bar { -// a: u8, -// } - -// is_unaligned!(Bar); - -#[derive(Unaligned)] -#[repr(packed)] -union Baz { - // NOTE: The `u16` type is not guaranteed to have alignment 2, although it - // does on many platforms. However, to fix this would require a custom type - // with a `#[repr(align(2))]` attribute, and `#[repr(packed)]` types are not - // allowed to transitively contain `#[repr(align(...))]` types. Thus, we - // have no choice but to use `u16` here. Luckily, these tests run in CI on - // platforms on which `u16` has alignment 2, so this isn't that big of a - // deal. - a: u16, -} - -assert_impl_all!(Baz: Unaligned); - -#[derive(Unaligned)] -#[repr(C, align(1))] -union FooAlign { - a: u8, -} - -assert_impl_all!(FooAlign: Unaligned); - -#[derive(Unaligned)] -#[repr(C)] -union TypeParams<'a, T: Copy, I: Iterator> -where - I::Item: Copy, -{ - a: T, - c: I::Item, - d: u8, - e: PhantomData<&'a [u8]>, - f: PhantomData<&'static str>, - g: PhantomData, -} - -assert_impl_all!(TypeParams<'static, (), IntoIter<()>>: Unaligned); diff -Nru temporalio-1.3.0/vendor/zerocopy-derive/tests/util.rs temporalio-1.3.0/vendor/zerocopy-derive/tests/util.rs --- temporalio-1.3.0/vendor/zerocopy-derive/tests/util.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zerocopy-derive/tests/util.rs 1970-01-01 00:00:00.000000000 +0000 @@ -1,20 +0,0 @@ -// Copyright 2019 The Fuchsia Authors -// -// Licensed under a BSD-style license , Apache License, Version 2.0 -// , or the MIT -// license , at your option. -// This file may not be copied, modified, or distributed except according to -// those terms. - -use zerocopy::{AsBytes, FromBytes, FromZeroes, KnownLayout}; - -/// A type that doesn't implement any zerocopy traits. -pub struct NotZerocopy(T); - -/// A `u16` with alignment 2. -/// -/// Though `u16` has alignment 2 on some platforms, it's not guaranteed. By -/// contrast, `AU16` is guaranteed to have alignment 2. -#[derive(KnownLayout, FromZeroes, FromBytes, AsBytes, Copy, Clone)] -#[repr(C, align(2))] -pub struct AU16(u16); diff -Nru temporalio-1.3.0/vendor/zstd-sys/build.rs temporalio-1.3.0/vendor/zstd-sys/build.rs --- temporalio-1.3.0/vendor/zstd-sys/build.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zstd-sys/build.rs 2023-10-30 19:40:00.000000000 +0000 @@ -20,10 +20,9 @@ .clang_args(defs.into_iter().map(|def| format!("-D{}", def))); #[cfg(feature = "experimental")] - let bindings = bindings - .clang_arg("-DZSTD_STATIC_LINKING_ONLY") - .clang_arg("-DZDICT_STATIC_LINKING_ONLY") - .clang_arg("-DZSTD_RUST_BINDINGS_EXPERIMENTAL"); + let bindings = bindings.clang_arg("-DZSTD_STATIC_LINKING_ONLY"); + #[cfg(all(feature = "experimental", feature = "zdict_builder"))] + let bindings = bindings.clang_arg("-DZDICT_STATIC_LINKING_ONLY"); #[cfg(not(feature = "std"))] let bindings = bindings.ctypes_prefix("libc"); diff -Nru temporalio-1.3.0/vendor/zstd-sys/.cargo-checksum.json temporalio-1.3.0/vendor/zstd-sys/.cargo-checksum.json --- temporalio-1.3.0/vendor/zstd-sys/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zstd-sys/.cargo-checksum.json 2023-10-30 19:40:00.000000000 +0000 @@ -1 +1 @@ -{"files":{"Cargo.toml":"9d18c490b83408f2a10d574d563faa9a9bedc545ba09bc85f59914ef9e39f186","LICENSE":"a77b7cfeaf911ed410ffbe76f0cb2b24ad8a4d94e7ead5727e914425c416cc63","LICENSE.Apache-2.0":"0d542e0c8804e39aa7f37eb00da5a762149dc682d7829451287e11b938e94594","LICENSE.BSD-3-Clause":"48341f685c87304089aa099b23c386f8bacc519ef555aa7a13e239908907b3fd","LICENSE.Mit":"129e8edef29e9abcd2ebabe252f4ef1b1289cdca356bf0040284a2fbccfb96c8","build.rs":"f11bc2108439f43e6365bb21bb9d9142c0fac376a17702b04da7f19efdbb9b69","src/bindings_zdict.rs":"3a7532ebc9e7316cd0c9e12a28d5a71bccc3319297cd5a5bb2974a1c66dd29ff","src/bindings_zdict_experimental.rs":"b088a45fb69983496bfe18d4e6f41b5307ed4ba2d065c171d9cd3e1ef2e3bc38","src/bindings_zdict_std_experimental.rs":"b088a45fb69983496bfe18d4e6f41b5307ed4ba2d065c171d9cd3e1ef2e3bc38","src/bindings_zstd.rs":"1088524355dbd2afc39f9c5400a198453a4c6381c61a56879fd9a4e7a61bdb30","src/bindings_zstd_experimental.rs":"aa8e8c5c0bc23a137582a76e7de83fef80afae2647374e95f0369598bb5f4a12","src/bindings_zstd_std_experimental.rs":"b9ce5b3a80849b533f41ef2f66bfaed77664c9f17df00c6dfeafff9835f114d6","src/lib.rs":"48e65a77cdb54ad6fb1b92387612cfb5e7a22263ede671b6ff1af49f90339d48","src/wasm_shim.rs":"e1ea4697d19046c6ae6925923b700d004189a915e63c96fa3d49ec77a8b9398e","wasm-shim/assert.h":"f488d6a6833bea179432815bf0508ab539ce128490ffcb32ef52a0840dc0955c","wasm-shim/stdio.h":"9e6db1c0204bb4eb840e9b7d648e60809d5cf5120f44b55821b97c3cfed5ef60","wasm-shim/stdlib.h":"5a455e663db04afd6223f396862b8a663bbf21d73116f79af26e9b66c647f12d","wasm-shim/string.h":"44fda640c2b5a0dc77dbedf8c22ae945fbe48d129b1fc95b152795e700cdb52a","wasm-shim/time.h":"ed26c6b339b555f2ee860a65f9fa6f1f33bafd10f6f939543ebadeae15e4c64d","zdict.h":"3e08fb2b6ba0b383af0d170a930949021e05743ac0c0957cd45ccc61ec7d0eac","zstd.h":"e8edf4c5ba6aa6bc44e681e8a4ada5b300a708d684788cad0e86c1446d67fcc1","zstd/COPYING":"f9c375a1be4a41f7b70301dd83c91cb89e41567478859b77eef375a52d782505","zstd/LICENSE":"7055266497633c9025b777c78eb7235af13922117480ed5c674677adc381c9d8","zstd/lib/common/allocations.h":"c1c971ac240e7709e0da2a0a1b249c9bf68f138d41c9f76ab1f0d31118560ef8","zstd/lib/common/bits.h":"84447179d20e90fcb7ace6358ad79c1e1b978bc86f68568529ed24ca1777b49e","zstd/lib/common/bitstream.h":"0a3303e7860609c72d4e83eb254b8144b8242c14c4b837fea3d6ae6d1d426db7","zstd/lib/common/compiler.h":"bf3a8e4ca4b4eac823433cc1d3f637d036f1d6234fa7ffc236c8745f8c4a61f2","zstd/lib/common/cpu.h":"216681cb15aca5d63afb9b994512bcaf66f71ee02c7789248f26f1d3f7183e26","zstd/lib/common/debug.c":"77083a66b80b7a677875adb765b581d800a934a87d29c0955410c6c027cd0f35","zstd/lib/common/debug.h":"79ff0630cfef960e5c1e4752c77b880306f41bff6c90f6a638da84e6e288cb9d","zstd/lib/common/entropy_common.c":"7dfce29c6bc807645b1f0c373dad94bbb49603b175a84e72d1739bf9df65feb8","zstd/lib/common/error_private.c":"749261716f8628275149880d88c8862207d2f7a550a4f84ef37710abb78a3bcc","zstd/lib/common/error_private.h":"d6dbf7bf651c0a40e0b92e7e56958c13cc772abd7e818fac1e85777e1f2ae853","zstd/lib/common/fse.h":"a4fc84da1392b7cb74d38e2a0b2e253fb663425039ff5651472cb51b9e8f12f5","zstd/lib/common/fse_decompress.c":"ca2a15f45fe0e87008775bbad1e787fea4f347740393eddf44ccd6070dce12b9","zstd/lib/common/huf.h":"4acc5a57ac61b3a549418f23605691f73744983accab8690ad35c3aae967a359","zstd/lib/common/mem.h":"bb9caee6a6de5b58d0fac7492d6df06c881b6d87b580c03224df5e29a795ef7a","zstd/lib/common/pool.c":"a0b36a9e700dfb5c67e309f5c4e634be84dce057bc51210b89676fd9d7c88989","zstd/lib/common/pool.h":"2fc00f45a21f01ce764b14287d23d527c32903101e6ed5219152b5d7ff3d6f38","zstd/lib/common/portability_macros.h":"3923b88fb6e973a6b1e944103abfb152fe5d95a795596cf37857f5f2df461d01","zstd/lib/common/threading.c":"4c6401b7501d3318f2ce2f094e72a2af37677df665e7d6bf922a817d577ecdb9","zstd/lib/common/threading.h":"05ca16720ca4686998d599088654fc98673451b5691a500cb9dc163b26c8fe32","zstd/lib/common/xxhash.c":"ec39d4b0d383dc547ad6a8b1e66f66fa7fc085f8d6c9bf9747882b3e48f84b06","zstd/lib/common/xxhash.h":"d63803315e16fe11f9985a9bc5988449f97f729098337c4c154ef31fe58dbe31","zstd/lib/common/zstd_common.c":"f49eb8023a90d3de925373bd9ee0d36ed46b26c529840b64220397446cd73795","zstd/lib/common/zstd_deps.h":"6b57771c66247b2e5f15cf5e9a781128f885b33a0023d93f5822e67626962816","zstd/lib/common/zstd_internal.h":"cf31355503a0f7c4a1fe50f92c75e4e6029a7874bb1686d6fc626d9645a4d4bb","zstd/lib/common/zstd_trace.h":"eb1251bbb9091edb00b96987236b50bc11fb707807de3a83337f53fd6e231728","zstd/lib/compress/clevels.h":"d764daa89b7a636d26fe96ff3536c5075e9867fb5dddbf8c9d57023a8ff4a155","zstd/lib/compress/fse_compress.c":"6bc37877000072b4dcfb7ecc0486a33c0ce8e513fac7e5cdc0e0ab829ffdacdb","zstd/lib/compress/hist.c":"154e5efd4f3cf8a4e6f29db6463fd3aa4e3694ae9b9c73e5c275a6cb1e3fefe1","zstd/lib/compress/hist.h":"8dd30d7687fe59f8a3a5188dd36911bc1cf1211839e8c49afa1df8a8678fcada","zstd/lib/compress/huf_compress.c":"a00a8a4f90b6dd42ef7733d4481d7e5793f674e574af5a854e256db683ee88f6","zstd/lib/compress/zstd_compress.c":"298f4c03c87dc1c8443dc1d3ec24668d3834d8146c9c366bfb442836489245fe","zstd/lib/compress/zstd_compress_internal.h":"e006bd17a75790314e1d5e78cc3dbd00fce8442fa6d50e19eaeeeeaa88cfa03d","zstd/lib/compress/zstd_compress_literals.c":"c38586b65c69a1906e750bea5a49785b3502b1f52698eee597a4d037b2d9080f","zstd/lib/compress/zstd_compress_literals.h":"02270cd6bc060279217861776a53adb67f8d7e54f47f59d2a4ddcef2e705fe2d","zstd/lib/compress/zstd_compress_sequences.c":"b3685e8b987944206c9d92e5d3c773b73c1c03f4fbb970d8e62f0d6de2b16010","zstd/lib/compress/zstd_compress_sequences.h":"a119b546cc28baed798c3da181861500487229b61c379380b600adf41eb8f21e","zstd/lib/compress/zstd_compress_superblock.c":"7ec66723e2e806adaca3e718ca2743b04426d742581aa3761d8a600e77e58570","zstd/lib/compress/zstd_compress_superblock.h":"6b097999ea1d91776ca5a12e5ee02c1ed15edfcd31ba07b9ada94b0955195677","zstd/lib/compress/zstd_cwksp.h":"dbdcc18c52f7596511c4fcd609bddea88757aa2b1219e2502ab082bcbfa3e2be","zstd/lib/compress/zstd_double_fast.c":"46861b3ce7386c6105f7a007f0798e0f3897231dabadaa4a54142469b5144b5f","zstd/lib/compress/zstd_double_fast.h":"6efa67eb99d579d0b822bfba7954e641db3c116e3487dfc613c30bf75a7757da","zstd/lib/compress/zstd_fast.c":"95b0d5c110dff0d94a750615d9bcc3cd4a2b54b95e0064343d97a314ef991034","zstd/lib/compress/zstd_fast.h":"a40a5e53ecc259bb8e05bc6a81980de26b4f1bae41fe6c2df53b6d1d39a325a4","zstd/lib/compress/zstd_lazy.c":"70f13cfaa7d6567c984ba03b610df20c261e96a147f496611b5ab22db508abad","zstd/lib/compress/zstd_lazy.h":"62677ac5d95cec9f4ad16cdef862c9be79287b51ab676a8709e9964759b9ca05","zstd/lib/compress/zstd_ldm.c":"17169daefb742174d11a90a7ae484ba6840b26af2b7613b2053907cd84634fcc","zstd/lib/compress/zstd_ldm.h":"f06522debac7eb19b97bb0fa531f209cd06bd42a8636bb6139454923980125b5","zstd/lib/compress/zstd_ldm_geartab.h":"7285ac8ba1f0fa57a8cd8158bd427ded4e70e32a58e73b57c420b83a76e5e6e3","zstd/lib/compress/zstd_opt.c":"fabd179d004d3b99808a56d78acd6d772ee4759cbf945fb4a16164f10fd6620b","zstd/lib/compress/zstd_opt.h":"c7ffddfdc38a2a6f8be38d3074492a46d5f3fe03783ebda67a300f68596c1ee4","zstd/lib/compress/zstdmt_compress.c":"246c2cfb2367c46fbae3608b8e7b86243a33069b64130a5b7439d4be1046ff26","zstd/lib/compress/zstdmt_compress.h":"43838192752506a16afc054ec83580995d0cab4a53ef245720f5241ac1289b75","zstd/lib/decompress/huf_decompress.c":"7c0d521904d99733ea0d68685f91e14318186063ec2859e50f2155a58ba773d3","zstd/lib/decompress/huf_decompress_amd64.S":"825ba338b8f418ffb7254486f68a9fdf51a3411ce373be5bb3eddd91cca52880","zstd/lib/decompress/zstd_ddict.c":"38bf812283d61f4cd1f6aea30f84b43317418257c4e6fc198b09b436bd484397","zstd/lib/decompress/zstd_ddict.h":"a97a250fd2f956e3ae419ddde68ae1f9fe4025bc0373254058d31bbd352fa71c","zstd/lib/decompress/zstd_decompress.c":"0645e788c5d1aa5f125e4c6993e0d8ca2f4cf276bdf9715f73873b975198c164","zstd/lib/decompress/zstd_decompress_block.c":"322603f4e778385cae939c32229767ceed455da217e75c90594de7c92d4e888a","zstd/lib/decompress/zstd_decompress_block.h":"a8116d6266eef14d5928731349cc9e6ab8ad3f022046968fc93e615aa34195dd","zstd/lib/decompress/zstd_decompress_internal.h":"e01c336c8ee233262711ef7732103413509406c55f7f26443a21d9468a692090","zstd/lib/deprecated/zbuff.h":"fcd83d7f05dc7bc6e52da6200878e05d7dc4906cf2ccfa70ce4c753e1fdc2422","zstd/lib/deprecated/zbuff_common.c":"9c2f0f5debd0632ea52d8776eff332227a90396bfec079159b3c29340e018215","zstd/lib/deprecated/zbuff_compress.c":"b31a0a39d6546639b1d3e68c28632d0dd2651c2a7dba34a5a522cc6def43a842","zstd/lib/deprecated/zbuff_decompress.c":"d567f0df10c98c6751accc2d71338437e77682b1492aab6e8e4ed09d75df572c","zstd/lib/dictBuilder/cover.c":"c1758516a628f24406e95f62f2275ed6f82b3927440ecc4352cd16e49ffdc900","zstd/lib/dictBuilder/cover.h":"17f9a62c0fe8d495700ba3073989aaa05dcb6a59a1a749b7bbb707dbc191890c","zstd/lib/dictBuilder/divsufsort.c":"2081acb08865f623857d2c0dcb0e79fce9489f01416528c30cfee7097915c616","zstd/lib/dictBuilder/divsufsort.h":"f8312544f98feb695e611c68d5191b5ae5302e01a3613e2a6f8e6cd365dd3b2d","zstd/lib/dictBuilder/fastcover.c":"937862174e9b76d01b3798dc08ae7f6a893fa42821a80742dc0eaea97f3494fc","zstd/lib/dictBuilder/zdict.c":"46abb11a97f5b52688e408c3496b1e702c22a191087663c311eba4050cce6896","zstd/lib/legacy/zstd_legacy.h":"85e09401af4194c4d93b86e3ef37031bfbe2b8f41f9dd631b1d32b1d5d527b02","zstd/lib/legacy/zstd_v01.c":"fe12c4ca928fd9c5e83d068ad0bfffab067faf4da044812f4d5a69c05bf17767","zstd/lib/legacy/zstd_v01.h":"51e06e92b87abe35f617d9e65c6f26b4b1b50485cda6bf34f5b23bb6e1727b13","zstd/lib/legacy/zstd_v02.c":"1ee9e28fb0a6003ba3b3f975441463e2411f707dd2a588cd36759db127fef017","zstd/lib/legacy/zstd_v02.h":"341dd36148b7080eae742bb21196740482c4d94a97024f47ad1e7c0f2bb20e6b","zstd/lib/legacy/zstd_v03.c":"67b047dc634d17afd2b65894c43be59db3c9d541969a072a9429b6f48d05f230","zstd/lib/legacy/zstd_v03.h":"e9d7ccc971055129a14e3b81f0e9494a638e3d9c0b4b36413252d6b3adc90cf2","zstd/lib/legacy/zstd_v04.c":"dcee09befb5e5327cc43bd981f38882b407d3fe6fd1c9928cda8fb79c878f7b2","zstd/lib/legacy/zstd_v04.h":"c8c31b9db45c1b559688738f280331a5f3bce5b275cf4c71e8a41282f406134e","zstd/lib/legacy/zstd_v05.c":"d7b57b8ed34f94052001ab5b13783b95658fc053185a69b790b8b05e3d7edc3c","zstd/lib/legacy/zstd_v05.h":"6fb3be7f31544cee69cfb421d5bc6e34e72f4e2612b38cb38d47032a8531acdf","zstd/lib/legacy/zstd_v06.c":"9488b58b9c10b9ad735ddb07fb8d607ff73724936ab8994e34905c91e89f5dfd","zstd/lib/legacy/zstd_v06.h":"138728fdc9de7ebd5c7ffdf471b8b324cafa8e0ab638c6f4d9c048296cfe23ab","zstd/lib/legacy/zstd_v07.c":"1d6cf1b58c47e9ea2e863429b9171cf40adf2d349fa609d31d895c880b542801","zstd/lib/legacy/zstd_v07.h":"b682d3dffc64564fdf6f19d67baece362a1b7075c0140a80ce54e17f79961b49","zstd/lib/zdict.h":"02a34169467501fcc665cccb33f5bd455fdb665e9806851777dc8a6c4d5a75e3","zstd/lib/zstd.h":"41d0f43747d0dee56f60bd10aed262f193d725b7e11eb9e94aa4ad80183c7da8","zstd/lib/zstd_errors.h":"36dbd0a595852e10ff5b52992294f610055b8781101f4634036e05cf7d4bb506"},"package":"9e16efa8a874a0481a574084d34cc26fdb3b99627480f785888deb6386506656"} \ No newline at end of file +{"files":{".cargo_vcs_info.json":"7adac3dca86ba0dd138bad983b87678f17ac91e6e9a28816f9816671ab62ab1b","Cargo.toml":"2ac839b3e64ac60250aa84efa6079c76dc276f7b5162ff12eaadf71c9fca7809","LICENSE":"a77b7cfeaf911ed410ffbe76f0cb2b24ad8a4d94e7ead5727e914425c416cc63","LICENSE.Apache-2.0":"0d542e0c8804e39aa7f37eb00da5a762149dc682d7829451287e11b938e94594","LICENSE.BSD-3-Clause":"48341f685c87304089aa099b23c386f8bacc519ef555aa7a13e239908907b3fd","LICENSE.Mit":"129e8edef29e9abcd2ebabe252f4ef1b1289cdca356bf0040284a2fbccfb96c8","Readme.md":"3b5dff115d0794d3f35bf4e659b3c1222707a57b815b653d435e1568961bb3c8","build.rs":"df30c1364b48595ee79bba5b96099e7d37ce8f98ab3086176bfc6e594c599b82","src/bindings_zdict.rs":"fc1a77a0d3df4465fd972715ab49164298f88e7fddbc8a83bcc25ea52167a9f0","src/bindings_zdict_experimental.rs":"235feb741623a62b8d172e917f8877b88f8c4d56e1e82fdfcc6f518b49540426","src/bindings_zdict_std.rs":"c2031499d873e20d74d45a941690b95516f340547cf9ca35db087e9e121de533","src/bindings_zdict_std_experimental.rs":"2fbba22c5e3a38c1d6854c43c22598d42a6e40cead31407d99943e595bea17da","src/bindings_zstd.rs":"344a0d80dcf480292ed0a8ed823161f6e863396c49fdd3bca1a4f112a9bcc477","src/bindings_zstd_experimental.rs":"4fc6c818c5cea3d4987a6b5e197839a60fe03c0c84e338c93ba54a1957c05428","src/bindings_zstd_std.rs":"1613eeb879164c0151209abcafa4b54919ff066cca888481353fe49e2f02df61","src/bindings_zstd_std_experimental.rs":"1cdfb8afee4a8994ac1f0eefc3b8bc872ec427b2cbdbcb8055e4ee080ce04c9f","src/lib.rs":"5bede93ec3c91786cd6f86c47fe3a8089f3b951f714a999f6df34be0488022d8","src/wasm_shim.rs":"15bb793e8f9924369ee78ed80e22150c5da40ee74aa4245126b2550a8643b4aa","test_it.sh":"2ef196bad13fae06e6c40d54418f45291d1935f47e2ac3a52328313d0aa41f32","update_bindings.sh":"2623d6c71b16f3fa1ccf584367182dd059fee55ba0ef98268bc921920ddb2b6e","update_zstd.sh":"66a050c7791289d537838f9c84e3384a6062985e45d0bdf7a1490e4d7794f99d","wasm-shim/stdlib.h":"3f5ed47be15c9188bfd036d427a839c149a53046948180ca233e2c9797a8ab5b","wasm-shim/string.h":"dc49436d28031f327c6001d2461285a5b537014bd73227d0a678eb394279b270","zdict.h":"3e08fb2b6ba0b383af0d170a930949021e05743ac0c0957cd45ccc61ec7d0eac","zstd.h":"5fe4f3230c74133f8271863df2256964b8148a3d3ef8fb41f9a3c0e27f93353a","zstd/COPYING":"f9c375a1be4a41f7b70301dd83c91cb89e41567478859b77eef375a52d782505","zstd/LICENSE":"7055266497633c9025b777c78eb7235af13922117480ed5c674677adc381c9d8","zstd/lib/common/allocations.h":"c1c971ac240e7709e0da2a0a1b249c9bf68f138d41c9f76ab1f0d31118560ef8","zstd/lib/common/bits.h":"84447179d20e90fcb7ace6358ad79c1e1b978bc86f68568529ed24ca1777b49e","zstd/lib/common/bitstream.h":"0a3303e7860609c72d4e83eb254b8144b8242c14c4b837fea3d6ae6d1d426db7","zstd/lib/common/compiler.h":"bf3a8e4ca4b4eac823433cc1d3f637d036f1d6234fa7ffc236c8745f8c4a61f2","zstd/lib/common/cpu.h":"216681cb15aca5d63afb9b994512bcaf66f71ee02c7789248f26f1d3f7183e26","zstd/lib/common/debug.c":"77083a66b80b7a677875adb765b581d800a934a87d29c0955410c6c027cd0f35","zstd/lib/common/debug.h":"79ff0630cfef960e5c1e4752c77b880306f41bff6c90f6a638da84e6e288cb9d","zstd/lib/common/entropy_common.c":"7dfce29c6bc807645b1f0c373dad94bbb49603b175a84e72d1739bf9df65feb8","zstd/lib/common/error_private.c":"749261716f8628275149880d88c8862207d2f7a550a4f84ef37710abb78a3bcc","zstd/lib/common/error_private.h":"d6dbf7bf651c0a40e0b92e7e56958c13cc772abd7e818fac1e85777e1f2ae853","zstd/lib/common/fse.h":"a4fc84da1392b7cb74d38e2a0b2e253fb663425039ff5651472cb51b9e8f12f5","zstd/lib/common/fse_decompress.c":"ca2a15f45fe0e87008775bbad1e787fea4f347740393eddf44ccd6070dce12b9","zstd/lib/common/huf.h":"4acc5a57ac61b3a549418f23605691f73744983accab8690ad35c3aae967a359","zstd/lib/common/mem.h":"bb9caee6a6de5b58d0fac7492d6df06c881b6d87b580c03224df5e29a795ef7a","zstd/lib/common/pool.c":"a0b36a9e700dfb5c67e309f5c4e634be84dce057bc51210b89676fd9d7c88989","zstd/lib/common/pool.h":"2fc00f45a21f01ce764b14287d23d527c32903101e6ed5219152b5d7ff3d6f38","zstd/lib/common/portability_macros.h":"3923b88fb6e973a6b1e944103abfb152fe5d95a795596cf37857f5f2df461d01","zstd/lib/common/threading.c":"4c6401b7501d3318f2ce2f094e72a2af37677df665e7d6bf922a817d577ecdb9","zstd/lib/common/threading.h":"05ca16720ca4686998d599088654fc98673451b5691a500cb9dc163b26c8fe32","zstd/lib/common/xxhash.c":"ec39d4b0d383dc547ad6a8b1e66f66fa7fc085f8d6c9bf9747882b3e48f84b06","zstd/lib/common/xxhash.h":"d63803315e16fe11f9985a9bc5988449f97f729098337c4c154ef31fe58dbe31","zstd/lib/common/zstd_common.c":"f49eb8023a90d3de925373bd9ee0d36ed46b26c529840b64220397446cd73795","zstd/lib/common/zstd_deps.h":"6b57771c66247b2e5f15cf5e9a781128f885b33a0023d93f5822e67626962816","zstd/lib/common/zstd_internal.h":"cf31355503a0f7c4a1fe50f92c75e4e6029a7874bb1686d6fc626d9645a4d4bb","zstd/lib/common/zstd_trace.h":"eb1251bbb9091edb00b96987236b50bc11fb707807de3a83337f53fd6e231728","zstd/lib/compress/clevels.h":"d764daa89b7a636d26fe96ff3536c5075e9867fb5dddbf8c9d57023a8ff4a155","zstd/lib/compress/fse_compress.c":"6bc37877000072b4dcfb7ecc0486a33c0ce8e513fac7e5cdc0e0ab829ffdacdb","zstd/lib/compress/hist.c":"154e5efd4f3cf8a4e6f29db6463fd3aa4e3694ae9b9c73e5c275a6cb1e3fefe1","zstd/lib/compress/hist.h":"8dd30d7687fe59f8a3a5188dd36911bc1cf1211839e8c49afa1df8a8678fcada","zstd/lib/compress/huf_compress.c":"a00a8a4f90b6dd42ef7733d4481d7e5793f674e574af5a854e256db683ee88f6","zstd/lib/compress/zstd_compress.c":"298f4c03c87dc1c8443dc1d3ec24668d3834d8146c9c366bfb442836489245fe","zstd/lib/compress/zstd_compress_internal.h":"e006bd17a75790314e1d5e78cc3dbd00fce8442fa6d50e19eaeeeeaa88cfa03d","zstd/lib/compress/zstd_compress_literals.c":"c38586b65c69a1906e750bea5a49785b3502b1f52698eee597a4d037b2d9080f","zstd/lib/compress/zstd_compress_literals.h":"02270cd6bc060279217861776a53adb67f8d7e54f47f59d2a4ddcef2e705fe2d","zstd/lib/compress/zstd_compress_sequences.c":"b3685e8b987944206c9d92e5d3c773b73c1c03f4fbb970d8e62f0d6de2b16010","zstd/lib/compress/zstd_compress_sequences.h":"a119b546cc28baed798c3da181861500487229b61c379380b600adf41eb8f21e","zstd/lib/compress/zstd_compress_superblock.c":"7ec66723e2e806adaca3e718ca2743b04426d742581aa3761d8a600e77e58570","zstd/lib/compress/zstd_compress_superblock.h":"6b097999ea1d91776ca5a12e5ee02c1ed15edfcd31ba07b9ada94b0955195677","zstd/lib/compress/zstd_cwksp.h":"dbdcc18c52f7596511c4fcd609bddea88757aa2b1219e2502ab082bcbfa3e2be","zstd/lib/compress/zstd_double_fast.c":"46861b3ce7386c6105f7a007f0798e0f3897231dabadaa4a54142469b5144b5f","zstd/lib/compress/zstd_double_fast.h":"6efa67eb99d579d0b822bfba7954e641db3c116e3487dfc613c30bf75a7757da","zstd/lib/compress/zstd_fast.c":"95b0d5c110dff0d94a750615d9bcc3cd4a2b54b95e0064343d97a314ef991034","zstd/lib/compress/zstd_fast.h":"a40a5e53ecc259bb8e05bc6a81980de26b4f1bae41fe6c2df53b6d1d39a325a4","zstd/lib/compress/zstd_lazy.c":"70f13cfaa7d6567c984ba03b610df20c261e96a147f496611b5ab22db508abad","zstd/lib/compress/zstd_lazy.h":"62677ac5d95cec9f4ad16cdef862c9be79287b51ab676a8709e9964759b9ca05","zstd/lib/compress/zstd_ldm.c":"17169daefb742174d11a90a7ae484ba6840b26af2b7613b2053907cd84634fcc","zstd/lib/compress/zstd_ldm.h":"f06522debac7eb19b97bb0fa531f209cd06bd42a8636bb6139454923980125b5","zstd/lib/compress/zstd_ldm_geartab.h":"7285ac8ba1f0fa57a8cd8158bd427ded4e70e32a58e73b57c420b83a76e5e6e3","zstd/lib/compress/zstd_opt.c":"fabd179d004d3b99808a56d78acd6d772ee4759cbf945fb4a16164f10fd6620b","zstd/lib/compress/zstd_opt.h":"c7ffddfdc38a2a6f8be38d3074492a46d5f3fe03783ebda67a300f68596c1ee4","zstd/lib/compress/zstdmt_compress.c":"246c2cfb2367c46fbae3608b8e7b86243a33069b64130a5b7439d4be1046ff26","zstd/lib/compress/zstdmt_compress.h":"43838192752506a16afc054ec83580995d0cab4a53ef245720f5241ac1289b75","zstd/lib/decompress/huf_decompress.c":"7c0d521904d99733ea0d68685f91e14318186063ec2859e50f2155a58ba773d3","zstd/lib/decompress/huf_decompress_amd64.S":"825ba338b8f418ffb7254486f68a9fdf51a3411ce373be5bb3eddd91cca52880","zstd/lib/decompress/zstd_ddict.c":"38bf812283d61f4cd1f6aea30f84b43317418257c4e6fc198b09b436bd484397","zstd/lib/decompress/zstd_ddict.h":"a97a250fd2f956e3ae419ddde68ae1f9fe4025bc0373254058d31bbd352fa71c","zstd/lib/decompress/zstd_decompress.c":"0645e788c5d1aa5f125e4c6993e0d8ca2f4cf276bdf9715f73873b975198c164","zstd/lib/decompress/zstd_decompress_block.c":"322603f4e778385cae939c32229767ceed455da217e75c90594de7c92d4e888a","zstd/lib/decompress/zstd_decompress_block.h":"a8116d6266eef14d5928731349cc9e6ab8ad3f022046968fc93e615aa34195dd","zstd/lib/decompress/zstd_decompress_internal.h":"e01c336c8ee233262711ef7732103413509406c55f7f26443a21d9468a692090","zstd/lib/deprecated/zbuff.h":"fcd83d7f05dc7bc6e52da6200878e05d7dc4906cf2ccfa70ce4c753e1fdc2422","zstd/lib/deprecated/zbuff_common.c":"9c2f0f5debd0632ea52d8776eff332227a90396bfec079159b3c29340e018215","zstd/lib/deprecated/zbuff_compress.c":"b31a0a39d6546639b1d3e68c28632d0dd2651c2a7dba34a5a522cc6def43a842","zstd/lib/deprecated/zbuff_decompress.c":"d567f0df10c98c6751accc2d71338437e77682b1492aab6e8e4ed09d75df572c","zstd/lib/dictBuilder/cover.c":"c1758516a628f24406e95f62f2275ed6f82b3927440ecc4352cd16e49ffdc900","zstd/lib/dictBuilder/cover.h":"17f9a62c0fe8d495700ba3073989aaa05dcb6a59a1a749b7bbb707dbc191890c","zstd/lib/dictBuilder/divsufsort.c":"2081acb08865f623857d2c0dcb0e79fce9489f01416528c30cfee7097915c616","zstd/lib/dictBuilder/divsufsort.h":"f8312544f98feb695e611c68d5191b5ae5302e01a3613e2a6f8e6cd365dd3b2d","zstd/lib/dictBuilder/fastcover.c":"937862174e9b76d01b3798dc08ae7f6a893fa42821a80742dc0eaea97f3494fc","zstd/lib/dictBuilder/zdict.c":"46abb11a97f5b52688e408c3496b1e702c22a191087663c311eba4050cce6896","zstd/lib/legacy/zstd_legacy.h":"85e09401af4194c4d93b86e3ef37031bfbe2b8f41f9dd631b1d32b1d5d527b02","zstd/lib/legacy/zstd_v01.c":"fe12c4ca928fd9c5e83d068ad0bfffab067faf4da044812f4d5a69c05bf17767","zstd/lib/legacy/zstd_v01.h":"51e06e92b87abe35f617d9e65c6f26b4b1b50485cda6bf34f5b23bb6e1727b13","zstd/lib/legacy/zstd_v02.c":"1ee9e28fb0a6003ba3b3f975441463e2411f707dd2a588cd36759db127fef017","zstd/lib/legacy/zstd_v02.h":"341dd36148b7080eae742bb21196740482c4d94a97024f47ad1e7c0f2bb20e6b","zstd/lib/legacy/zstd_v03.c":"67b047dc634d17afd2b65894c43be59db3c9d541969a072a9429b6f48d05f230","zstd/lib/legacy/zstd_v03.h":"e9d7ccc971055129a14e3b81f0e9494a638e3d9c0b4b36413252d6b3adc90cf2","zstd/lib/legacy/zstd_v04.c":"dcee09befb5e5327cc43bd981f38882b407d3fe6fd1c9928cda8fb79c878f7b2","zstd/lib/legacy/zstd_v04.h":"c8c31b9db45c1b559688738f280331a5f3bce5b275cf4c71e8a41282f406134e","zstd/lib/legacy/zstd_v05.c":"d7b57b8ed34f94052001ab5b13783b95658fc053185a69b790b8b05e3d7edc3c","zstd/lib/legacy/zstd_v05.h":"6fb3be7f31544cee69cfb421d5bc6e34e72f4e2612b38cb38d47032a8531acdf","zstd/lib/legacy/zstd_v06.c":"9488b58b9c10b9ad735ddb07fb8d607ff73724936ab8994e34905c91e89f5dfd","zstd/lib/legacy/zstd_v06.h":"138728fdc9de7ebd5c7ffdf471b8b324cafa8e0ab638c6f4d9c048296cfe23ab","zstd/lib/legacy/zstd_v07.c":"1d6cf1b58c47e9ea2e863429b9171cf40adf2d349fa609d31d895c880b542801","zstd/lib/legacy/zstd_v07.h":"b682d3dffc64564fdf6f19d67baece362a1b7075c0140a80ce54e17f79961b49","zstd/lib/zdict.h":"02a34169467501fcc665cccb33f5bd455fdb665e9806851777dc8a6c4d5a75e3","zstd/lib/zstd.h":"41d0f43747d0dee56f60bd10aed262f193d725b7e11eb9e94aa4ad80183c7da8","zstd/lib/zstd_errors.h":"36dbd0a595852e10ff5b52992294f610055b8781101f4634036e05cf7d4bb506"},"package":"5556e6ee25d32df2586c098bbfa278803692a20d0ab9565e049480d52707ec8c"} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/zstd-sys/Cargo.toml temporalio-1.3.0/vendor/zstd-sys/Cargo.toml --- temporalio-1.3.0/vendor/zstd-sys/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zstd-sys/Cargo.toml 2023-10-30 19:40:00.000000000 +0000 @@ -11,17 +11,15 @@ [package] edition = "2018" -rust-version = "1.64" +rust-version = "1.43" name = "zstd-sys" -version = "2.0.9+zstd.1.5.5" +version = "2.0.8+zstd.1.5.5" authors = ["Alexandre Bury "] build = "build.rs" links = "zstd" include = [ - "/LICENSE*", - "!/*.sh", - "/build.rs", - "/*.h", + "/LICENSE", + "/*.*", "/src/", "/wasm-shim/**/*.h", "/zstd/LICENSE", @@ -50,8 +48,11 @@ [lib] doctest = false +[dependencies.libc] +version = "0.2.45" + [build-dependencies.bindgen] -version = "0.68" +version = "0.64" features = [ "runtime", "which-rustfmt", diff -Nru temporalio-1.3.0/vendor/zstd-sys/.cargo_vcs_info.json temporalio-1.3.0/vendor/zstd-sys/.cargo_vcs_info.json --- temporalio-1.3.0/vendor/zstd-sys/.cargo_vcs_info.json 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zstd-sys/.cargo_vcs_info.json 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,6 @@ +{ + "git": { + "sha1": "27581a774b50a682d149fa22a47578a69d99994b" + }, + "path_in_vcs": "zstd-safe/zstd-sys" +} \ No newline at end of file diff -Nru temporalio-1.3.0/vendor/zstd-sys/Readme.md temporalio-1.3.0/vendor/zstd-sys/Readme.md --- temporalio-1.3.0/vendor/zstd-sys/Readme.md 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zstd-sys/Readme.md 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,35 @@ +# zstd-sys + +This is the low-level auto-generated binding to the [zstd] library. +You probably don't want to use this library directly; instead, look at [zstd-rs] or [zstd-safe]. + +# Compile it yourself + +`zstd` is included as a submodule. To get everything during your clone, use: + +``` +git clone https://github.com/gyscos/zstd-rs --recursive +``` + +Or, if you cloned it without the `--recursive` flag, +call this from inside the repository: + +``` +git submodule update --init +``` + +Then, running `cargo build` in this directory should +take care of building the C library and linking to it. + +# Build-time bindgen + +This library includes a pre-generated `bindings.rs` file. +You can also generate new bindings at build-time, using the `bindgen` feature: + +``` +cargo build --features bindgen +``` + +[zstd]: https://github.com/facebook/zstd +[zstd-rs]: https://github.com/gyscos/zstd-rs +[zstd-safe]: https://github.com/gyscos/zstd-rs/tree/main/zstd-safe diff -Nru temporalio-1.3.0/vendor/zstd-sys/src/bindings_zdict_experimental.rs temporalio-1.3.0/vendor/zstd-sys/src/bindings_zdict_experimental.rs --- temporalio-1.3.0/vendor/zstd-sys/src/bindings_zdict_experimental.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zstd-sys/src/bindings_zdict_experimental.rs 2023-10-30 19:40:00.000000000 +0000 @@ -33,156 +33,156 @@ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -/* automatically generated by rust-bindgen 0.66.1 */ +/* automatically generated by rust-bindgen 0.64.0 */ pub const ZDICT_DICTSIZE_MIN: u32 = 256; pub const ZDICT_CONTENTSIZE_MIN: u32 = 128; extern "C" { #[doc = " ZDICT_trainFromBuffer():\n Train a dictionary from an array of samples.\n Redirect towards ZDICT_optimizeTrainFromBuffer_fastCover() single-threaded, with d=8, steps=4,\n f=20, and accel=1.\n Samples must be stored concatenated in a single flat buffer `samplesBuffer`,\n supplied with an array of sizes `samplesSizes`, providing the size of each sample, in order.\n The resulting dictionary will be saved into `dictBuffer`.\n @return: size of dictionary stored into `dictBuffer` (<= `dictBufferCapacity`)\n or an error code, which can be tested with ZDICT_isError().\n Note: Dictionary training will fail if there are not enough samples to construct a\n dictionary, or if most of the samples are too small (< 8 bytes being the lower limit).\n If dictionary training fails, you should use zstd without a dictionary, as the dictionary\n would've been ineffective anyways. If you believe your samples would benefit from a dictionary\n please open an issue with details, and we can look into it.\n Note: ZDICT_trainFromBuffer()'s memory usage is about 6 MB.\n Tips: In general, a reasonable dictionary has a size of ~ 100 KB.\n It's possible to select smaller or larger size, just by specifying `dictBufferCapacity`.\n In general, it's recommended to provide a few thousands samples, though this can vary a lot.\n It's recommended that total size of all samples be about ~x100 times the target size of dictionary."] pub fn ZDICT_trainFromBuffer( - dictBuffer: *mut ::core::ffi::c_void, + dictBuffer: *mut libc::c_void, dictBufferCapacity: usize, - samplesBuffer: *const ::core::ffi::c_void, + samplesBuffer: *const libc::c_void, samplesSizes: *const usize, - nbSamples: ::core::ffi::c_uint, + nbSamples: libc::c_uint, ) -> usize; } #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct ZDICT_params_t { #[doc = "< optimize for a specific zstd compression level; 0 means default"] - pub compressionLevel: ::core::ffi::c_int, + pub compressionLevel: libc::c_int, #[doc = "< Write log to stderr; 0 = none (default); 1 = errors; 2 = progression; 3 = details; 4 = debug;"] - pub notificationLevel: ::core::ffi::c_uint, + pub notificationLevel: libc::c_uint, #[doc = "< force dictID value; 0 means auto mode (32-bits random value)\n NOTE: The zstd format reserves some dictionary IDs for future use.\n You may use them in private settings, but be warned that they\n may be used by zstd in a public dictionary registry in the future.\n These dictionary IDs are:\n - low range : <= 32767\n - high range : >= (2^31)"] - pub dictID: ::core::ffi::c_uint, + pub dictID: libc::c_uint, } extern "C" { #[doc = " ZDICT_finalizeDictionary():\n Given a custom content as a basis for dictionary, and a set of samples,\n finalize dictionary by adding headers and statistics according to the zstd\n dictionary format.\n\n Samples must be stored concatenated in a flat buffer `samplesBuffer`,\n supplied with an array of sizes `samplesSizes`, providing the size of each\n sample in order. The samples are used to construct the statistics, so they\n should be representative of what you will compress with this dictionary.\n\n The compression level can be set in `parameters`. You should pass the\n compression level you expect to use in production. The statistics for each\n compression level differ, so tuning the dictionary for the compression level\n can help quite a bit.\n\n You can set an explicit dictionary ID in `parameters`, or allow us to pick\n a random dictionary ID for you, but we can't guarantee no collisions.\n\n The dstDictBuffer and the dictContent may overlap, and the content will be\n appended to the end of the header. If the header + the content doesn't fit in\n maxDictSize the beginning of the content is truncated to make room, since it\n is presumed that the most profitable content is at the end of the dictionary,\n since that is the cheapest to reference.\n\n `maxDictSize` must be >= max(dictContentSize, ZSTD_DICTSIZE_MIN).\n\n @return: size of dictionary stored into `dstDictBuffer` (<= `maxDictSize`),\n or an error code, which can be tested by ZDICT_isError().\n Note: ZDICT_finalizeDictionary() will push notifications into stderr if\n instructed to, using notificationLevel>0.\n NOTE: This function currently may fail in several edge cases including:\n * Not enough samples\n * Samples are uncompressible\n * Samples are all exactly the same"] pub fn ZDICT_finalizeDictionary( - dstDictBuffer: *mut ::core::ffi::c_void, + dstDictBuffer: *mut libc::c_void, maxDictSize: usize, - dictContent: *const ::core::ffi::c_void, + dictContent: *const libc::c_void, dictContentSize: usize, - samplesBuffer: *const ::core::ffi::c_void, + samplesBuffer: *const libc::c_void, samplesSizes: *const usize, - nbSamples: ::core::ffi::c_uint, + nbSamples: libc::c_uint, parameters: ZDICT_params_t, ) -> usize; } extern "C" { pub fn ZDICT_getDictID( - dictBuffer: *const ::core::ffi::c_void, + dictBuffer: *const libc::c_void, dictSize: usize, - ) -> ::core::ffi::c_uint; + ) -> libc::c_uint; } extern "C" { pub fn ZDICT_getDictHeaderSize( - dictBuffer: *const ::core::ffi::c_void, + dictBuffer: *const libc::c_void, dictSize: usize, ) -> usize; } extern "C" { - pub fn ZDICT_isError(errorCode: usize) -> ::core::ffi::c_uint; + pub fn ZDICT_isError(errorCode: usize) -> libc::c_uint; } extern "C" { - pub fn ZDICT_getErrorName(errorCode: usize) -> *const ::core::ffi::c_char; + pub fn ZDICT_getErrorName(errorCode: usize) -> *const libc::c_char; } #[doc = " ZDICT_cover_params_t:\n k and d are the only required parameters.\n For others, value 0 means default."] #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct ZDICT_cover_params_t { - pub k: ::core::ffi::c_uint, - pub d: ::core::ffi::c_uint, - pub steps: ::core::ffi::c_uint, - pub nbThreads: ::core::ffi::c_uint, + pub k: libc::c_uint, + pub d: libc::c_uint, + pub steps: libc::c_uint, + pub nbThreads: libc::c_uint, pub splitPoint: f64, - pub shrinkDict: ::core::ffi::c_uint, - pub shrinkDictMaxRegression: ::core::ffi::c_uint, + pub shrinkDict: libc::c_uint, + pub shrinkDictMaxRegression: libc::c_uint, pub zParams: ZDICT_params_t, } #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct ZDICT_fastCover_params_t { - pub k: ::core::ffi::c_uint, - pub d: ::core::ffi::c_uint, - pub f: ::core::ffi::c_uint, - pub steps: ::core::ffi::c_uint, - pub nbThreads: ::core::ffi::c_uint, + pub k: libc::c_uint, + pub d: libc::c_uint, + pub f: libc::c_uint, + pub steps: libc::c_uint, + pub nbThreads: libc::c_uint, pub splitPoint: f64, - pub accel: ::core::ffi::c_uint, - pub shrinkDict: ::core::ffi::c_uint, - pub shrinkDictMaxRegression: ::core::ffi::c_uint, + pub accel: libc::c_uint, + pub shrinkDict: libc::c_uint, + pub shrinkDictMaxRegression: libc::c_uint, pub zParams: ZDICT_params_t, } extern "C" { #[doc = " ZDICT_trainFromBuffer_cover():\n Train a dictionary from an array of samples using the COVER algorithm.\n Samples must be stored concatenated in a single flat buffer `samplesBuffer`,\n supplied with an array of sizes `samplesSizes`, providing the size of each sample, in order.\n The resulting dictionary will be saved into `dictBuffer`.\n @return: size of dictionary stored into `dictBuffer` (<= `dictBufferCapacity`)\n or an error code, which can be tested with ZDICT_isError().\n See ZDICT_trainFromBuffer() for details on failure modes.\n Note: ZDICT_trainFromBuffer_cover() requires about 9 bytes of memory for each input byte.\n Tips: In general, a reasonable dictionary has a size of ~ 100 KB.\n It's possible to select smaller or larger size, just by specifying `dictBufferCapacity`.\n In general, it's recommended to provide a few thousands samples, though this can vary a lot.\n It's recommended that total size of all samples be about ~x100 times the target size of dictionary."] pub fn ZDICT_trainFromBuffer_cover( - dictBuffer: *mut ::core::ffi::c_void, + dictBuffer: *mut libc::c_void, dictBufferCapacity: usize, - samplesBuffer: *const ::core::ffi::c_void, + samplesBuffer: *const libc::c_void, samplesSizes: *const usize, - nbSamples: ::core::ffi::c_uint, + nbSamples: libc::c_uint, parameters: ZDICT_cover_params_t, ) -> usize; } extern "C" { #[doc = " ZDICT_optimizeTrainFromBuffer_cover():\n The same requirements as above hold for all the parameters except `parameters`.\n This function tries many parameter combinations and picks the best parameters.\n `*parameters` is filled with the best parameters found,\n dictionary constructed with those parameters is stored in `dictBuffer`.\n\n All of the parameters d, k, steps are optional.\n If d is non-zero then we don't check multiple values of d, otherwise we check d = {6, 8}.\n if steps is zero it defaults to its default value.\n If k is non-zero then we don't check multiple values of k, otherwise we check steps values in [50, 2000].\n\n @return: size of dictionary stored into `dictBuffer` (<= `dictBufferCapacity`)\n or an error code, which can be tested with ZDICT_isError().\n On success `*parameters` contains the parameters selected.\n See ZDICT_trainFromBuffer() for details on failure modes.\n Note: ZDICT_optimizeTrainFromBuffer_cover() requires about 8 bytes of memory for each input byte and additionally another 5 bytes of memory for each byte of memory for each thread."] pub fn ZDICT_optimizeTrainFromBuffer_cover( - dictBuffer: *mut ::core::ffi::c_void, + dictBuffer: *mut libc::c_void, dictBufferCapacity: usize, - samplesBuffer: *const ::core::ffi::c_void, + samplesBuffer: *const libc::c_void, samplesSizes: *const usize, - nbSamples: ::core::ffi::c_uint, + nbSamples: libc::c_uint, parameters: *mut ZDICT_cover_params_t, ) -> usize; } extern "C" { #[doc = " ZDICT_trainFromBuffer_fastCover():\n Train a dictionary from an array of samples using a modified version of COVER algorithm.\n Samples must be stored concatenated in a single flat buffer `samplesBuffer`,\n supplied with an array of sizes `samplesSizes`, providing the size of each sample, in order.\n d and k are required.\n All other parameters are optional, will use default values if not provided\n The resulting dictionary will be saved into `dictBuffer`.\n @return: size of dictionary stored into `dictBuffer` (<= `dictBufferCapacity`)\n or an error code, which can be tested with ZDICT_isError().\n See ZDICT_trainFromBuffer() for details on failure modes.\n Note: ZDICT_trainFromBuffer_fastCover() requires 6 * 2^f bytes of memory.\n Tips: In general, a reasonable dictionary has a size of ~ 100 KB.\n It's possible to select smaller or larger size, just by specifying `dictBufferCapacity`.\n In general, it's recommended to provide a few thousands samples, though this can vary a lot.\n It's recommended that total size of all samples be about ~x100 times the target size of dictionary."] pub fn ZDICT_trainFromBuffer_fastCover( - dictBuffer: *mut ::core::ffi::c_void, + dictBuffer: *mut libc::c_void, dictBufferCapacity: usize, - samplesBuffer: *const ::core::ffi::c_void, + samplesBuffer: *const libc::c_void, samplesSizes: *const usize, - nbSamples: ::core::ffi::c_uint, + nbSamples: libc::c_uint, parameters: ZDICT_fastCover_params_t, ) -> usize; } extern "C" { #[doc = " ZDICT_optimizeTrainFromBuffer_fastCover():\n The same requirements as above hold for all the parameters except `parameters`.\n This function tries many parameter combinations (specifically, k and d combinations)\n and picks the best parameters. `*parameters` is filled with the best parameters found,\n dictionary constructed with those parameters is stored in `dictBuffer`.\n All of the parameters d, k, steps, f, and accel are optional.\n If d is non-zero then we don't check multiple values of d, otherwise we check d = {6, 8}.\n if steps is zero it defaults to its default value.\n If k is non-zero then we don't check multiple values of k, otherwise we check steps values in [50, 2000].\n If f is zero, default value of 20 is used.\n If accel is zero, default value of 1 is used.\n\n @return: size of dictionary stored into `dictBuffer` (<= `dictBufferCapacity`)\n or an error code, which can be tested with ZDICT_isError().\n On success `*parameters` contains the parameters selected.\n See ZDICT_trainFromBuffer() for details on failure modes.\n Note: ZDICT_optimizeTrainFromBuffer_fastCover() requires about 6 * 2^f bytes of memory for each thread."] pub fn ZDICT_optimizeTrainFromBuffer_fastCover( - dictBuffer: *mut ::core::ffi::c_void, + dictBuffer: *mut libc::c_void, dictBufferCapacity: usize, - samplesBuffer: *const ::core::ffi::c_void, + samplesBuffer: *const libc::c_void, samplesSizes: *const usize, - nbSamples: ::core::ffi::c_uint, + nbSamples: libc::c_uint, parameters: *mut ZDICT_fastCover_params_t, ) -> usize; } #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct ZDICT_legacy_params_t { - pub selectivityLevel: ::core::ffi::c_uint, + pub selectivityLevel: libc::c_uint, pub zParams: ZDICT_params_t, } extern "C" { #[doc = " ZDICT_trainFromBuffer_legacy():\n Train a dictionary from an array of samples.\n Samples must be stored concatenated in a single flat buffer `samplesBuffer`,\n supplied with an array of sizes `samplesSizes`, providing the size of each sample, in order.\n The resulting dictionary will be saved into `dictBuffer`.\n `parameters` is optional and can be provided with values set to 0 to mean \"default\".\n @return: size of dictionary stored into `dictBuffer` (<= `dictBufferCapacity`)\n or an error code, which can be tested with ZDICT_isError().\n See ZDICT_trainFromBuffer() for details on failure modes.\n Tips: In general, a reasonable dictionary has a size of ~ 100 KB.\n It's possible to select smaller or larger size, just by specifying `dictBufferCapacity`.\n In general, it's recommended to provide a few thousands samples, though this can vary a lot.\n It's recommended that total size of all samples be about ~x100 times the target size of dictionary.\n Note: ZDICT_trainFromBuffer_legacy() will send notifications into stderr if instructed to, using notificationLevel>0."] pub fn ZDICT_trainFromBuffer_legacy( - dictBuffer: *mut ::core::ffi::c_void, + dictBuffer: *mut libc::c_void, dictBufferCapacity: usize, - samplesBuffer: *const ::core::ffi::c_void, + samplesBuffer: *const libc::c_void, samplesSizes: *const usize, - nbSamples: ::core::ffi::c_uint, + nbSamples: libc::c_uint, parameters: ZDICT_legacy_params_t, ) -> usize; } extern "C" { pub fn ZDICT_addEntropyTablesFromBuffer( - dictBuffer: *mut ::core::ffi::c_void, + dictBuffer: *mut libc::c_void, dictContentSize: usize, dictBufferCapacity: usize, - samplesBuffer: *const ::core::ffi::c_void, + samplesBuffer: *const libc::c_void, samplesSizes: *const usize, - nbSamples: ::core::ffi::c_uint, + nbSamples: libc::c_uint, ) -> usize; } diff -Nru temporalio-1.3.0/vendor/zstd-sys/src/bindings_zdict.rs temporalio-1.3.0/vendor/zstd-sys/src/bindings_zdict.rs --- temporalio-1.3.0/vendor/zstd-sys/src/bindings_zdict.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zstd-sys/src/bindings_zdict.rs 2023-10-30 19:40:00.000000000 +0000 @@ -33,56 +33,56 @@ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -/* automatically generated by rust-bindgen 0.66.1 */ +/* automatically generated by rust-bindgen 0.64.0 */ extern "C" { #[doc = " ZDICT_trainFromBuffer():\n Train a dictionary from an array of samples.\n Redirect towards ZDICT_optimizeTrainFromBuffer_fastCover() single-threaded, with d=8, steps=4,\n f=20, and accel=1.\n Samples must be stored concatenated in a single flat buffer `samplesBuffer`,\n supplied with an array of sizes `samplesSizes`, providing the size of each sample, in order.\n The resulting dictionary will be saved into `dictBuffer`.\n @return: size of dictionary stored into `dictBuffer` (<= `dictBufferCapacity`)\n or an error code, which can be tested with ZDICT_isError().\n Note: Dictionary training will fail if there are not enough samples to construct a\n dictionary, or if most of the samples are too small (< 8 bytes being the lower limit).\n If dictionary training fails, you should use zstd without a dictionary, as the dictionary\n would've been ineffective anyways. If you believe your samples would benefit from a dictionary\n please open an issue with details, and we can look into it.\n Note: ZDICT_trainFromBuffer()'s memory usage is about 6 MB.\n Tips: In general, a reasonable dictionary has a size of ~ 100 KB.\n It's possible to select smaller or larger size, just by specifying `dictBufferCapacity`.\n In general, it's recommended to provide a few thousands samples, though this can vary a lot.\n It's recommended that total size of all samples be about ~x100 times the target size of dictionary."] pub fn ZDICT_trainFromBuffer( - dictBuffer: *mut ::core::ffi::c_void, + dictBuffer: *mut libc::c_void, dictBufferCapacity: usize, - samplesBuffer: *const ::core::ffi::c_void, + samplesBuffer: *const libc::c_void, samplesSizes: *const usize, - nbSamples: ::core::ffi::c_uint, + nbSamples: libc::c_uint, ) -> usize; } #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct ZDICT_params_t { #[doc = "< optimize for a specific zstd compression level; 0 means default"] - pub compressionLevel: ::core::ffi::c_int, + pub compressionLevel: libc::c_int, #[doc = "< Write log to stderr; 0 = none (default); 1 = errors; 2 = progression; 3 = details; 4 = debug;"] - pub notificationLevel: ::core::ffi::c_uint, + pub notificationLevel: libc::c_uint, #[doc = "< force dictID value; 0 means auto mode (32-bits random value)\n NOTE: The zstd format reserves some dictionary IDs for future use.\n You may use them in private settings, but be warned that they\n may be used by zstd in a public dictionary registry in the future.\n These dictionary IDs are:\n - low range : <= 32767\n - high range : >= (2^31)"] - pub dictID: ::core::ffi::c_uint, + pub dictID: libc::c_uint, } extern "C" { #[doc = " ZDICT_finalizeDictionary():\n Given a custom content as a basis for dictionary, and a set of samples,\n finalize dictionary by adding headers and statistics according to the zstd\n dictionary format.\n\n Samples must be stored concatenated in a flat buffer `samplesBuffer`,\n supplied with an array of sizes `samplesSizes`, providing the size of each\n sample in order. The samples are used to construct the statistics, so they\n should be representative of what you will compress with this dictionary.\n\n The compression level can be set in `parameters`. You should pass the\n compression level you expect to use in production. The statistics for each\n compression level differ, so tuning the dictionary for the compression level\n can help quite a bit.\n\n You can set an explicit dictionary ID in `parameters`, or allow us to pick\n a random dictionary ID for you, but we can't guarantee no collisions.\n\n The dstDictBuffer and the dictContent may overlap, and the content will be\n appended to the end of the header. If the header + the content doesn't fit in\n maxDictSize the beginning of the content is truncated to make room, since it\n is presumed that the most profitable content is at the end of the dictionary,\n since that is the cheapest to reference.\n\n `maxDictSize` must be >= max(dictContentSize, ZSTD_DICTSIZE_MIN).\n\n @return: size of dictionary stored into `dstDictBuffer` (<= `maxDictSize`),\n or an error code, which can be tested by ZDICT_isError().\n Note: ZDICT_finalizeDictionary() will push notifications into stderr if\n instructed to, using notificationLevel>0.\n NOTE: This function currently may fail in several edge cases including:\n * Not enough samples\n * Samples are uncompressible\n * Samples are all exactly the same"] pub fn ZDICT_finalizeDictionary( - dstDictBuffer: *mut ::core::ffi::c_void, + dstDictBuffer: *mut libc::c_void, maxDictSize: usize, - dictContent: *const ::core::ffi::c_void, + dictContent: *const libc::c_void, dictContentSize: usize, - samplesBuffer: *const ::core::ffi::c_void, + samplesBuffer: *const libc::c_void, samplesSizes: *const usize, - nbSamples: ::core::ffi::c_uint, + nbSamples: libc::c_uint, parameters: ZDICT_params_t, ) -> usize; } extern "C" { pub fn ZDICT_getDictID( - dictBuffer: *const ::core::ffi::c_void, + dictBuffer: *const libc::c_void, dictSize: usize, - ) -> ::core::ffi::c_uint; + ) -> libc::c_uint; } extern "C" { pub fn ZDICT_getDictHeaderSize( - dictBuffer: *const ::core::ffi::c_void, + dictBuffer: *const libc::c_void, dictSize: usize, ) -> usize; } extern "C" { - pub fn ZDICT_isError(errorCode: usize) -> ::core::ffi::c_uint; + pub fn ZDICT_isError(errorCode: usize) -> libc::c_uint; } extern "C" { - pub fn ZDICT_getErrorName(errorCode: usize) -> *const ::core::ffi::c_char; + pub fn ZDICT_getErrorName(errorCode: usize) -> *const libc::c_char; } diff -Nru temporalio-1.3.0/vendor/zstd-sys/src/bindings_zdict_std_experimental.rs temporalio-1.3.0/vendor/zstd-sys/src/bindings_zdict_std_experimental.rs --- temporalio-1.3.0/vendor/zstd-sys/src/bindings_zdict_std_experimental.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zstd-sys/src/bindings_zdict_std_experimental.rs 2023-10-30 19:40:00.000000000 +0000 @@ -33,7 +33,7 @@ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -/* automatically generated by rust-bindgen 0.66.1 */ +/* automatically generated by rust-bindgen 0.64.0 */ pub const ZDICT_DICTSIZE_MIN: u32 = 256; pub const ZDICT_CONTENTSIZE_MIN: u32 = 128; @@ -44,18 +44,18 @@ dictBufferCapacity: usize, samplesBuffer: *const ::core::ffi::c_void, samplesSizes: *const usize, - nbSamples: ::core::ffi::c_uint, + nbSamples: ::std::os::raw::c_uint, ) -> usize; } #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct ZDICT_params_t { #[doc = "< optimize for a specific zstd compression level; 0 means default"] - pub compressionLevel: ::core::ffi::c_int, + pub compressionLevel: ::std::os::raw::c_int, #[doc = "< Write log to stderr; 0 = none (default); 1 = errors; 2 = progression; 3 = details; 4 = debug;"] - pub notificationLevel: ::core::ffi::c_uint, + pub notificationLevel: ::std::os::raw::c_uint, #[doc = "< force dictID value; 0 means auto mode (32-bits random value)\n NOTE: The zstd format reserves some dictionary IDs for future use.\n You may use them in private settings, but be warned that they\n may be used by zstd in a public dictionary registry in the future.\n These dictionary IDs are:\n - low range : <= 32767\n - high range : >= (2^31)"] - pub dictID: ::core::ffi::c_uint, + pub dictID: ::std::os::raw::c_uint, } extern "C" { #[doc = " ZDICT_finalizeDictionary():\n Given a custom content as a basis for dictionary, and a set of samples,\n finalize dictionary by adding headers and statistics according to the zstd\n dictionary format.\n\n Samples must be stored concatenated in a flat buffer `samplesBuffer`,\n supplied with an array of sizes `samplesSizes`, providing the size of each\n sample in order. The samples are used to construct the statistics, so they\n should be representative of what you will compress with this dictionary.\n\n The compression level can be set in `parameters`. You should pass the\n compression level you expect to use in production. The statistics for each\n compression level differ, so tuning the dictionary for the compression level\n can help quite a bit.\n\n You can set an explicit dictionary ID in `parameters`, or allow us to pick\n a random dictionary ID for you, but we can't guarantee no collisions.\n\n The dstDictBuffer and the dictContent may overlap, and the content will be\n appended to the end of the header. If the header + the content doesn't fit in\n maxDictSize the beginning of the content is truncated to make room, since it\n is presumed that the most profitable content is at the end of the dictionary,\n since that is the cheapest to reference.\n\n `maxDictSize` must be >= max(dictContentSize, ZSTD_DICTSIZE_MIN).\n\n @return: size of dictionary stored into `dstDictBuffer` (<= `maxDictSize`),\n or an error code, which can be tested by ZDICT_isError().\n Note: ZDICT_finalizeDictionary() will push notifications into stderr if\n instructed to, using notificationLevel>0.\n NOTE: This function currently may fail in several edge cases including:\n * Not enough samples\n * Samples are uncompressible\n * Samples are all exactly the same"] @@ -66,7 +66,7 @@ dictContentSize: usize, samplesBuffer: *const ::core::ffi::c_void, samplesSizes: *const usize, - nbSamples: ::core::ffi::c_uint, + nbSamples: ::std::os::raw::c_uint, parameters: ZDICT_params_t, ) -> usize; } @@ -74,7 +74,7 @@ pub fn ZDICT_getDictID( dictBuffer: *const ::core::ffi::c_void, dictSize: usize, - ) -> ::core::ffi::c_uint; + ) -> ::std::os::raw::c_uint; } extern "C" { pub fn ZDICT_getDictHeaderSize( @@ -83,36 +83,38 @@ ) -> usize; } extern "C" { - pub fn ZDICT_isError(errorCode: usize) -> ::core::ffi::c_uint; + pub fn ZDICT_isError(errorCode: usize) -> ::std::os::raw::c_uint; } extern "C" { - pub fn ZDICT_getErrorName(errorCode: usize) -> *const ::core::ffi::c_char; + pub fn ZDICT_getErrorName( + errorCode: usize, + ) -> *const ::std::os::raw::c_char; } #[doc = " ZDICT_cover_params_t:\n k and d are the only required parameters.\n For others, value 0 means default."] #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct ZDICT_cover_params_t { - pub k: ::core::ffi::c_uint, - pub d: ::core::ffi::c_uint, - pub steps: ::core::ffi::c_uint, - pub nbThreads: ::core::ffi::c_uint, + pub k: ::std::os::raw::c_uint, + pub d: ::std::os::raw::c_uint, + pub steps: ::std::os::raw::c_uint, + pub nbThreads: ::std::os::raw::c_uint, pub splitPoint: f64, - pub shrinkDict: ::core::ffi::c_uint, - pub shrinkDictMaxRegression: ::core::ffi::c_uint, + pub shrinkDict: ::std::os::raw::c_uint, + pub shrinkDictMaxRegression: ::std::os::raw::c_uint, pub zParams: ZDICT_params_t, } #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct ZDICT_fastCover_params_t { - pub k: ::core::ffi::c_uint, - pub d: ::core::ffi::c_uint, - pub f: ::core::ffi::c_uint, - pub steps: ::core::ffi::c_uint, - pub nbThreads: ::core::ffi::c_uint, + pub k: ::std::os::raw::c_uint, + pub d: ::std::os::raw::c_uint, + pub f: ::std::os::raw::c_uint, + pub steps: ::std::os::raw::c_uint, + pub nbThreads: ::std::os::raw::c_uint, pub splitPoint: f64, - pub accel: ::core::ffi::c_uint, - pub shrinkDict: ::core::ffi::c_uint, - pub shrinkDictMaxRegression: ::core::ffi::c_uint, + pub accel: ::std::os::raw::c_uint, + pub shrinkDict: ::std::os::raw::c_uint, + pub shrinkDictMaxRegression: ::std::os::raw::c_uint, pub zParams: ZDICT_params_t, } extern "C" { @@ -122,7 +124,7 @@ dictBufferCapacity: usize, samplesBuffer: *const ::core::ffi::c_void, samplesSizes: *const usize, - nbSamples: ::core::ffi::c_uint, + nbSamples: ::std::os::raw::c_uint, parameters: ZDICT_cover_params_t, ) -> usize; } @@ -133,7 +135,7 @@ dictBufferCapacity: usize, samplesBuffer: *const ::core::ffi::c_void, samplesSizes: *const usize, - nbSamples: ::core::ffi::c_uint, + nbSamples: ::std::os::raw::c_uint, parameters: *mut ZDICT_cover_params_t, ) -> usize; } @@ -144,7 +146,7 @@ dictBufferCapacity: usize, samplesBuffer: *const ::core::ffi::c_void, samplesSizes: *const usize, - nbSamples: ::core::ffi::c_uint, + nbSamples: ::std::os::raw::c_uint, parameters: ZDICT_fastCover_params_t, ) -> usize; } @@ -155,14 +157,14 @@ dictBufferCapacity: usize, samplesBuffer: *const ::core::ffi::c_void, samplesSizes: *const usize, - nbSamples: ::core::ffi::c_uint, + nbSamples: ::std::os::raw::c_uint, parameters: *mut ZDICT_fastCover_params_t, ) -> usize; } #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct ZDICT_legacy_params_t { - pub selectivityLevel: ::core::ffi::c_uint, + pub selectivityLevel: ::std::os::raw::c_uint, pub zParams: ZDICT_params_t, } extern "C" { @@ -172,7 +174,7 @@ dictBufferCapacity: usize, samplesBuffer: *const ::core::ffi::c_void, samplesSizes: *const usize, - nbSamples: ::core::ffi::c_uint, + nbSamples: ::std::os::raw::c_uint, parameters: ZDICT_legacy_params_t, ) -> usize; } @@ -183,6 +185,6 @@ dictBufferCapacity: usize, samplesBuffer: *const ::core::ffi::c_void, samplesSizes: *const usize, - nbSamples: ::core::ffi::c_uint, + nbSamples: ::std::os::raw::c_uint, ) -> usize; } diff -Nru temporalio-1.3.0/vendor/zstd-sys/src/bindings_zdict_std.rs temporalio-1.3.0/vendor/zstd-sys/src/bindings_zdict_std.rs --- temporalio-1.3.0/vendor/zstd-sys/src/bindings_zdict_std.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zstd-sys/src/bindings_zdict_std.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,90 @@ +/* +This file is auto-generated from the public API of the zstd library. +It is released under the same BSD license. + +BSD License + +For Zstandard software + +Copyright (c) Meta Platforms, Inc. and affiliates. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name Facebook, nor Meta, nor the names of its contributors may + be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/* automatically generated by rust-bindgen 0.64.0 */ + +extern "C" { + #[doc = " ZDICT_trainFromBuffer():\n Train a dictionary from an array of samples.\n Redirect towards ZDICT_optimizeTrainFromBuffer_fastCover() single-threaded, with d=8, steps=4,\n f=20, and accel=1.\n Samples must be stored concatenated in a single flat buffer `samplesBuffer`,\n supplied with an array of sizes `samplesSizes`, providing the size of each sample, in order.\n The resulting dictionary will be saved into `dictBuffer`.\n @return: size of dictionary stored into `dictBuffer` (<= `dictBufferCapacity`)\n or an error code, which can be tested with ZDICT_isError().\n Note: Dictionary training will fail if there are not enough samples to construct a\n dictionary, or if most of the samples are too small (< 8 bytes being the lower limit).\n If dictionary training fails, you should use zstd without a dictionary, as the dictionary\n would've been ineffective anyways. If you believe your samples would benefit from a dictionary\n please open an issue with details, and we can look into it.\n Note: ZDICT_trainFromBuffer()'s memory usage is about 6 MB.\n Tips: In general, a reasonable dictionary has a size of ~ 100 KB.\n It's possible to select smaller or larger size, just by specifying `dictBufferCapacity`.\n In general, it's recommended to provide a few thousands samples, though this can vary a lot.\n It's recommended that total size of all samples be about ~x100 times the target size of dictionary."] + pub fn ZDICT_trainFromBuffer( + dictBuffer: *mut ::core::ffi::c_void, + dictBufferCapacity: usize, + samplesBuffer: *const ::core::ffi::c_void, + samplesSizes: *const usize, + nbSamples: ::std::os::raw::c_uint, + ) -> usize; +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ZDICT_params_t { + #[doc = "< optimize for a specific zstd compression level; 0 means default"] + pub compressionLevel: ::std::os::raw::c_int, + #[doc = "< Write log to stderr; 0 = none (default); 1 = errors; 2 = progression; 3 = details; 4 = debug;"] + pub notificationLevel: ::std::os::raw::c_uint, + #[doc = "< force dictID value; 0 means auto mode (32-bits random value)\n NOTE: The zstd format reserves some dictionary IDs for future use.\n You may use them in private settings, but be warned that they\n may be used by zstd in a public dictionary registry in the future.\n These dictionary IDs are:\n - low range : <= 32767\n - high range : >= (2^31)"] + pub dictID: ::std::os::raw::c_uint, +} +extern "C" { + #[doc = " ZDICT_finalizeDictionary():\n Given a custom content as a basis for dictionary, and a set of samples,\n finalize dictionary by adding headers and statistics according to the zstd\n dictionary format.\n\n Samples must be stored concatenated in a flat buffer `samplesBuffer`,\n supplied with an array of sizes `samplesSizes`, providing the size of each\n sample in order. The samples are used to construct the statistics, so they\n should be representative of what you will compress with this dictionary.\n\n The compression level can be set in `parameters`. You should pass the\n compression level you expect to use in production. The statistics for each\n compression level differ, so tuning the dictionary for the compression level\n can help quite a bit.\n\n You can set an explicit dictionary ID in `parameters`, or allow us to pick\n a random dictionary ID for you, but we can't guarantee no collisions.\n\n The dstDictBuffer and the dictContent may overlap, and the content will be\n appended to the end of the header. If the header + the content doesn't fit in\n maxDictSize the beginning of the content is truncated to make room, since it\n is presumed that the most profitable content is at the end of the dictionary,\n since that is the cheapest to reference.\n\n `maxDictSize` must be >= max(dictContentSize, ZSTD_DICTSIZE_MIN).\n\n @return: size of dictionary stored into `dstDictBuffer` (<= `maxDictSize`),\n or an error code, which can be tested by ZDICT_isError().\n Note: ZDICT_finalizeDictionary() will push notifications into stderr if\n instructed to, using notificationLevel>0.\n NOTE: This function currently may fail in several edge cases including:\n * Not enough samples\n * Samples are uncompressible\n * Samples are all exactly the same"] + pub fn ZDICT_finalizeDictionary( + dstDictBuffer: *mut ::core::ffi::c_void, + maxDictSize: usize, + dictContent: *const ::core::ffi::c_void, + dictContentSize: usize, + samplesBuffer: *const ::core::ffi::c_void, + samplesSizes: *const usize, + nbSamples: ::std::os::raw::c_uint, + parameters: ZDICT_params_t, + ) -> usize; +} +extern "C" { + pub fn ZDICT_getDictID( + dictBuffer: *const ::core::ffi::c_void, + dictSize: usize, + ) -> ::std::os::raw::c_uint; +} +extern "C" { + pub fn ZDICT_getDictHeaderSize( + dictBuffer: *const ::core::ffi::c_void, + dictSize: usize, + ) -> usize; +} +extern "C" { + pub fn ZDICT_isError(errorCode: usize) -> ::std::os::raw::c_uint; +} +extern "C" { + pub fn ZDICT_getErrorName( + errorCode: usize, + ) -> *const ::std::os::raw::c_char; +} diff -Nru temporalio-1.3.0/vendor/zstd-sys/src/bindings_zstd_experimental.rs temporalio-1.3.0/vendor/zstd-sys/src/bindings_zstd_experimental.rs --- temporalio-1.3.0/vendor/zstd-sys/src/bindings_zstd_experimental.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zstd-sys/src/bindings_zstd_experimental.rs 2023-10-30 19:40:00.000000000 +0000 @@ -33,7 +33,7 @@ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -/* automatically generated by rust-bindgen 0.66.1 */ +/* automatically generated by rust-bindgen 0.64.0 */ pub const ZSTD_VERSION_MAJOR: u32 = 1; pub const ZSTD_VERSION_MINOR: u32 = 5; @@ -77,48 +77,48 @@ pub const ZSTD_SRCSIZEHINT_MIN: u32 = 0; extern "C" { #[doc = " ZSTD_versionNumber() :\n Return runtime library version, the value is (MAJOR*100*100 + MINOR*100 + RELEASE)."] - pub fn ZSTD_versionNumber() -> ::core::ffi::c_uint; + pub fn ZSTD_versionNumber() -> libc::c_uint; } extern "C" { #[doc = " ZSTD_versionString() :\n Return runtime library version, like \"1.4.5\". Requires v1.3.0+."] - pub fn ZSTD_versionString() -> *const ::core::ffi::c_char; + pub fn ZSTD_versionString() -> *const libc::c_char; } extern "C" { #[doc = " Simple API\n/\n/*! ZSTD_compress() :\n Compresses `src` content as a single zstd compressed frame into already allocated `dst`.\n NOTE: Providing `dstCapacity >= ZSTD_compressBound(srcSize)` guarantees that zstd will have\n enough space to successfully compress the data.\n @return : compressed size written into `dst` (<= `dstCapacity),\n or an error code if it fails (which can be tested using ZSTD_isError())."] pub fn ZSTD_compress( - dst: *mut ::core::ffi::c_void, + dst: *mut libc::c_void, dstCapacity: usize, - src: *const ::core::ffi::c_void, + src: *const libc::c_void, srcSize: usize, - compressionLevel: ::core::ffi::c_int, + compressionLevel: libc::c_int, ) -> usize; } extern "C" { #[doc = " ZSTD_decompress() :\n `compressedSize` : must be the _exact_ size of some number of compressed and/or skippable frames.\n `dstCapacity` is an upper bound of originalSize to regenerate.\n If user cannot imply a maximum upper bound, it's better to use streaming mode to decompress data.\n @return : the number of bytes decompressed into `dst` (<= `dstCapacity`),\n or an errorCode if it fails (which can be tested using ZSTD_isError())."] pub fn ZSTD_decompress( - dst: *mut ::core::ffi::c_void, + dst: *mut libc::c_void, dstCapacity: usize, - src: *const ::core::ffi::c_void, + src: *const libc::c_void, compressedSize: usize, ) -> usize; } extern "C" { pub fn ZSTD_getFrameContentSize( - src: *const ::core::ffi::c_void, + src: *const libc::c_void, srcSize: usize, - ) -> ::core::ffi::c_ulonglong; + ) -> libc::c_ulonglong; } extern "C" { #[doc = " ZSTD_getDecompressedSize() :\n NOTE: This function is now obsolete, in favor of ZSTD_getFrameContentSize().\n Both functions work the same way, but ZSTD_getDecompressedSize() blends\n \"empty\", \"unknown\" and \"error\" results to the same return value (0),\n while ZSTD_getFrameContentSize() gives them separate return values.\n @return : decompressed size of `src` frame content _if known and not empty_, 0 otherwise."] pub fn ZSTD_getDecompressedSize( - src: *const ::core::ffi::c_void, + src: *const libc::c_void, srcSize: usize, - ) -> ::core::ffi::c_ulonglong; + ) -> libc::c_ulonglong; } extern "C" { #[doc = " ZSTD_findFrameCompressedSize() : Requires v1.4.0+\n `src` should point to the start of a ZSTD frame or skippable frame.\n `srcSize` must be >= first frame size\n @return : the compressed size of the first frame starting at `src`,\n suitable to pass as `srcSize` to `ZSTD_decompress` or similar,\n or an error code if input is invalid"] pub fn ZSTD_findFrameCompressedSize( - src: *const ::core::ffi::c_void, + src: *const libc::c_void, srcSize: usize, ) -> usize; } @@ -126,19 +126,19 @@ pub fn ZSTD_compressBound(srcSize: usize) -> usize; } extern "C" { - pub fn ZSTD_isError(code: usize) -> ::core::ffi::c_uint; + pub fn ZSTD_isError(code: usize) -> libc::c_uint; } extern "C" { - pub fn ZSTD_getErrorName(code: usize) -> *const ::core::ffi::c_char; + pub fn ZSTD_getErrorName(code: usize) -> *const libc::c_char; } extern "C" { - pub fn ZSTD_minCLevel() -> ::core::ffi::c_int; + pub fn ZSTD_minCLevel() -> libc::c_int; } extern "C" { - pub fn ZSTD_maxCLevel() -> ::core::ffi::c_int; + pub fn ZSTD_maxCLevel() -> libc::c_int; } extern "C" { - pub fn ZSTD_defaultCLevel() -> ::core::ffi::c_int; + pub fn ZSTD_defaultCLevel() -> libc::c_int; } #[repr(C)] #[derive(Debug, Copy, Clone)] @@ -157,11 +157,11 @@ #[doc = " ZSTD_compressCCtx() :\n Same as ZSTD_compress(), using an explicit ZSTD_CCtx.\n Important : in order to behave similarly to `ZSTD_compress()`,\n this function compresses at requested compression level,\n __ignoring any other parameter__ .\n If any advanced parameter was set using the advanced API,\n they will all be reset. Only `compressionLevel` remains."] pub fn ZSTD_compressCCtx( cctx: *mut ZSTD_CCtx, - dst: *mut ::core::ffi::c_void, + dst: *mut libc::c_void, dstCapacity: usize, - src: *const ::core::ffi::c_void, + src: *const libc::c_void, srcSize: usize, - compressionLevel: ::core::ffi::c_int, + compressionLevel: libc::c_int, ) -> usize; } #[repr(C)] @@ -180,9 +180,9 @@ #[doc = " ZSTD_decompressDCtx() :\n Same as ZSTD_decompress(),\n requires an allocated ZSTD_DCtx.\n Compatible with sticky parameters."] pub fn ZSTD_decompressDCtx( dctx: *mut ZSTD_DCtx, - dst: *mut ::core::ffi::c_void, + dst: *mut libc::c_void, dstCapacity: usize, - src: *const ::core::ffi::c_void, + src: *const libc::c_void, srcSize: usize, ) -> usize; } @@ -246,8 +246,8 @@ #[derive(Debug, Copy, Clone)] pub struct ZSTD_bounds { pub error: usize, - pub lowerBound: ::core::ffi::c_int, - pub upperBound: ::core::ffi::c_int, + pub lowerBound: libc::c_int, + pub upperBound: libc::c_int, } extern "C" { #[doc = " ZSTD_cParam_getBounds() :\n All parameters must belong to an interval with lower and upper bounds,\n otherwise they will either trigger an error or be automatically clamped.\n @return : a structure, ZSTD_bounds, which contains\n - an error status field, which must be tested using ZSTD_isError()\n - lower and upper bounds, both inclusive"] @@ -258,14 +258,14 @@ pub fn ZSTD_CCtx_setParameter( cctx: *mut ZSTD_CCtx, param: ZSTD_cParameter, - value: ::core::ffi::c_int, + value: libc::c_int, ) -> usize; } extern "C" { #[doc = " ZSTD_CCtx_setPledgedSrcSize() :\n Total input data size to be compressed as a single frame.\n Value will be written in frame header, unless if explicitly forbidden using ZSTD_c_contentSizeFlag.\n This value will also be controlled at end of frame, and trigger an error if not respected.\n @result : 0, or an error code (which can be tested with ZSTD_isError()).\n Note 1 : pledgedSrcSize==0 actually means zero, aka an empty frame.\n In order to mean \"unknown content size\", pass constant ZSTD_CONTENTSIZE_UNKNOWN.\n ZSTD_CONTENTSIZE_UNKNOWN is default value for any new frame.\n Note 2 : pledgedSrcSize is only valid once, for the next frame.\n It's discarded at the end of the frame, and replaced by ZSTD_CONTENTSIZE_UNKNOWN.\n Note 3 : Whenever all input data is provided and consumed in a single round,\n for example with ZSTD_compress2(),\n or invoking immediately ZSTD_compressStream2(,,,ZSTD_e_end),\n this value is automatically overridden by srcSize instead."] pub fn ZSTD_CCtx_setPledgedSrcSize( cctx: *mut ZSTD_CCtx, - pledgedSrcSize: ::core::ffi::c_ulonglong, + pledgedSrcSize: libc::c_ulonglong, ) -> usize; } #[repr(u32)] @@ -286,9 +286,9 @@ #[doc = " ZSTD_compress2() :\n Behave the same as ZSTD_compressCCtx(), but compression parameters are set using the advanced API.\n ZSTD_compress2() always starts a new frame.\n Should cctx hold data from a previously unfinished frame, everything about it is forgotten.\n - Compression parameters are pushed into CCtx before starting compression, using ZSTD_CCtx_set*()\n - The function is always blocking, returns when compression is completed.\n NOTE: Providing `dstCapacity >= ZSTD_compressBound(srcSize)` guarantees that zstd will have\n enough space to successfully compress the data, though it is possible it fails for other reasons.\n @return : compressed size written into `dst` (<= `dstCapacity),\n or an error code if it fails (which can be tested using ZSTD_isError())."] pub fn ZSTD_compress2( cctx: *mut ZSTD_CCtx, - dst: *mut ::core::ffi::c_void, + dst: *mut libc::c_void, dstCapacity: usize, - src: *const ::core::ffi::c_void, + src: *const libc::c_void, srcSize: usize, ) -> usize; } @@ -312,7 +312,7 @@ pub fn ZSTD_DCtx_setParameter( dctx: *mut ZSTD_DCtx, param: ZSTD_dParameter, - value: ::core::ffi::c_int, + value: libc::c_int, ) -> usize; } extern "C" { @@ -327,7 +327,7 @@ #[derive(Debug, Copy, Clone)] pub struct ZSTD_inBuffer_s { #[doc = "< start of input buffer"] - pub src: *const ::core::ffi::c_void, + pub src: *const libc::c_void, #[doc = "< size of input buffer"] pub size: usize, #[doc = "< position where reading stopped. Will be updated. Necessarily 0 <= pos <= size"] @@ -339,7 +339,7 @@ #[derive(Debug, Copy, Clone)] pub struct ZSTD_outBuffer_s { #[doc = "< start of output buffer"] - pub dst: *mut ::core::ffi::c_void, + pub dst: *mut libc::c_void, #[doc = "< size of output buffer"] pub size: usize, #[doc = "< position where writing stopped. Will be updated. Necessarily 0 <= pos <= size"] @@ -379,7 +379,7 @@ #[doc = " Equivalent to:\n\n ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only);\n ZSTD_CCtx_refCDict(zcs, NULL); // clear the dictionary (if any)\n ZSTD_CCtx_setParameter(zcs, ZSTD_c_compressionLevel, compressionLevel);\n\n Note that ZSTD_initCStream() clears any previously set dictionary. Use the new API\n to compress with a dictionary."] pub fn ZSTD_initCStream( zcs: *mut ZSTD_CStream, - compressionLevel: ::core::ffi::c_int, + compressionLevel: libc::c_int, ) -> usize; } extern "C" { @@ -433,24 +433,24 @@ #[doc = " Simple dictionary API\n/\n/*! ZSTD_compress_usingDict() :\n Compression at an explicit compression level using a Dictionary.\n A dictionary can be any arbitrary data segment (also called a prefix),\n or a buffer with specified information (see zdict.h).\n Note : This function loads the dictionary, resulting in significant startup delay.\n It's intended for a dictionary used only once.\n Note 2 : When `dict == NULL || dictSize < 8` no dictionary is used."] pub fn ZSTD_compress_usingDict( ctx: *mut ZSTD_CCtx, - dst: *mut ::core::ffi::c_void, + dst: *mut libc::c_void, dstCapacity: usize, - src: *const ::core::ffi::c_void, + src: *const libc::c_void, srcSize: usize, - dict: *const ::core::ffi::c_void, + dict: *const libc::c_void, dictSize: usize, - compressionLevel: ::core::ffi::c_int, + compressionLevel: libc::c_int, ) -> usize; } extern "C" { #[doc = " ZSTD_decompress_usingDict() :\n Decompression using a known Dictionary.\n Dictionary must be identical to the one used during compression.\n Note : This function loads the dictionary, resulting in significant startup delay.\n It's intended for a dictionary used only once.\n Note : When `dict == NULL || dictSize < 8` no dictionary is used."] pub fn ZSTD_decompress_usingDict( dctx: *mut ZSTD_DCtx, - dst: *mut ::core::ffi::c_void, + dst: *mut libc::c_void, dstCapacity: usize, - src: *const ::core::ffi::c_void, + src: *const libc::c_void, srcSize: usize, - dict: *const ::core::ffi::c_void, + dict: *const libc::c_void, dictSize: usize, ) -> usize; } @@ -464,9 +464,9 @@ extern "C" { #[doc = " ZSTD_createCDict() :\n When compressing multiple messages or blocks using the same dictionary,\n it's recommended to digest the dictionary only once, since it's a costly operation.\n ZSTD_createCDict() will create a state from digesting a dictionary.\n The resulting state can be used for future compression operations with very limited startup cost.\n ZSTD_CDict can be created once and shared by multiple threads concurrently, since its usage is read-only.\n @dictBuffer can be released after ZSTD_CDict creation, because its content is copied within CDict.\n Note 1 : Consider experimental function `ZSTD_createCDict_byReference()` if you prefer to not duplicate @dictBuffer content.\n Note 2 : A ZSTD_CDict can be created from an empty @dictBuffer,\n in which case the only thing that it transports is the @compressionLevel.\n This can be useful in a pipeline featuring ZSTD_compress_usingCDict() exclusively,\n expecting a ZSTD_CDict parameter with any data, including those without a known dictionary."] pub fn ZSTD_createCDict( - dictBuffer: *const ::core::ffi::c_void, + dictBuffer: *const libc::c_void, dictSize: usize, - compressionLevel: ::core::ffi::c_int, + compressionLevel: libc::c_int, ) -> *mut ZSTD_CDict; } extern "C" { @@ -477,9 +477,9 @@ #[doc = " ZSTD_compress_usingCDict() :\n Compression using a digested Dictionary.\n Recommended when same dictionary is used multiple times.\n Note : compression level is _decided at dictionary creation time_,\n and frame parameters are hardcoded (dictID=yes, contentSize=yes, checksum=no)"] pub fn ZSTD_compress_usingCDict( cctx: *mut ZSTD_CCtx, - dst: *mut ::core::ffi::c_void, + dst: *mut libc::c_void, dstCapacity: usize, - src: *const ::core::ffi::c_void, + src: *const libc::c_void, srcSize: usize, cdict: *const ZSTD_CDict, ) -> usize; @@ -493,7 +493,7 @@ extern "C" { #[doc = " ZSTD_createDDict() :\n Create a digested dictionary, ready to start decompression operation without startup delay.\n dictBuffer can be released after DDict creation, as its content is copied inside DDict."] pub fn ZSTD_createDDict( - dictBuffer: *const ::core::ffi::c_void, + dictBuffer: *const libc::c_void, dictSize: usize, ) -> *mut ZSTD_DDict; } @@ -505,9 +505,9 @@ #[doc = " ZSTD_decompress_usingDDict() :\n Decompression using a digested Dictionary.\n Recommended when same dictionary is used multiple times."] pub fn ZSTD_decompress_usingDDict( dctx: *mut ZSTD_DCtx, - dst: *mut ::core::ffi::c_void, + dst: *mut libc::c_void, dstCapacity: usize, - src: *const ::core::ffi::c_void, + src: *const libc::c_void, srcSize: usize, ddict: *const ZSTD_DDict, ) -> usize; @@ -515,34 +515,30 @@ extern "C" { #[doc = " ZSTD_getDictID_fromDict() : Requires v1.4.0+\n Provides the dictID stored within dictionary.\n if @return == 0, the dictionary is not conformant with Zstandard specification.\n It can still be loaded, but as a content-only dictionary."] pub fn ZSTD_getDictID_fromDict( - dict: *const ::core::ffi::c_void, + dict: *const libc::c_void, dictSize: usize, - ) -> ::core::ffi::c_uint; + ) -> libc::c_uint; } extern "C" { #[doc = " ZSTD_getDictID_fromCDict() : Requires v1.5.0+\n Provides the dictID of the dictionary loaded into `cdict`.\n If @return == 0, the dictionary is not conformant to Zstandard specification, or empty.\n Non-conformant dictionaries can still be loaded, but as content-only dictionaries."] - pub fn ZSTD_getDictID_fromCDict( - cdict: *const ZSTD_CDict, - ) -> ::core::ffi::c_uint; + pub fn ZSTD_getDictID_fromCDict(cdict: *const ZSTD_CDict) -> libc::c_uint; } extern "C" { #[doc = " ZSTD_getDictID_fromDDict() : Requires v1.4.0+\n Provides the dictID of the dictionary loaded into `ddict`.\n If @return == 0, the dictionary is not conformant to Zstandard specification, or empty.\n Non-conformant dictionaries can still be loaded, but as content-only dictionaries."] - pub fn ZSTD_getDictID_fromDDict( - ddict: *const ZSTD_DDict, - ) -> ::core::ffi::c_uint; + pub fn ZSTD_getDictID_fromDDict(ddict: *const ZSTD_DDict) -> libc::c_uint; } extern "C" { #[doc = " ZSTD_getDictID_fromFrame() : Requires v1.4.0+\n Provides the dictID required to decompressed the frame stored within `src`.\n If @return == 0, the dictID could not be decoded.\n This could for one of the following reasons :\n - The frame does not require a dictionary to be decoded (most common case).\n - The frame was built with dictID intentionally removed. Whatever dictionary is necessary is a hidden piece of information.\n Note : this use case also happens when using a non-conformant dictionary.\n - `srcSize` is too small, and as a result, the frame header could not be decoded (only possible if `srcSize < ZSTD_FRAMEHEADERSIZE_MAX`).\n - This is not a Zstandard frame.\n When identifying the exact failure cause, it's possible to use ZSTD_getFrameHeader(), which will provide a more precise error code."] pub fn ZSTD_getDictID_fromFrame( - src: *const ::core::ffi::c_void, + src: *const libc::c_void, srcSize: usize, - ) -> ::core::ffi::c_uint; + ) -> libc::c_uint; } extern "C" { #[doc = " ZSTD_CCtx_loadDictionary() : Requires v1.4.0+\n Create an internal CDict from `dict` buffer.\n Decompression will have to use same dictionary.\n @result : 0, or an error code (which can be tested with ZSTD_isError()).\n Special: Loading a NULL (or 0-size) dictionary invalidates previous dictionary,\n meaning \"return to no-dictionary mode\".\n Note 1 : Dictionary is sticky, it will be used for all future compressed frames,\n until parameters are reset, a new dictionary is loaded, or the dictionary\n is explicitly invalidated by loading a NULL dictionary.\n Note 2 : Loading a dictionary involves building tables.\n It's also a CPU consuming operation, with non-negligible impact on latency.\n Tables are dependent on compression parameters, and for this reason,\n compression parameters can no longer be changed after loading a dictionary.\n Note 3 :`dict` content will be copied internally.\n Use experimental ZSTD_CCtx_loadDictionary_byReference() to reference content instead.\n In such a case, dictionary buffer must outlive its users.\n Note 4 : Use ZSTD_CCtx_loadDictionary_advanced()\n to precisely select how dictionary content must be interpreted.\n Note 5 : This method does not benefit from LDM (long distance mode).\n If you want to employ LDM on some large dictionary content,\n prefer employing ZSTD_CCtx_refPrefix() described below."] pub fn ZSTD_CCtx_loadDictionary( cctx: *mut ZSTD_CCtx, - dict: *const ::core::ffi::c_void, + dict: *const libc::c_void, dictSize: usize, ) -> usize; } @@ -557,7 +553,7 @@ #[doc = " ZSTD_CCtx_refPrefix() : Requires v1.4.0+\n Reference a prefix (single-usage dictionary) for next compressed frame.\n A prefix is **only used once**. Tables are discarded at end of frame (ZSTD_e_end).\n Decompression will need same prefix to properly regenerate data.\n Compressing with a prefix is similar in outcome as performing a diff and compressing it,\n but performs much faster, especially during decompression (compression speed is tunable with compression level).\n This method is compatible with LDM (long distance mode).\n @result : 0, or an error code (which can be tested with ZSTD_isError()).\n Special: Adding any prefix (including NULL) invalidates any previous prefix or dictionary\n Note 1 : Prefix buffer is referenced. It **must** outlive compression.\n Its content must remain unmodified during compression.\n Note 2 : If the intention is to diff some large src data blob with some prior version of itself,\n ensure that the window size is large enough to contain the entire source.\n See ZSTD_c_windowLog.\n Note 3 : Referencing a prefix involves building tables, which are dependent on compression parameters.\n It's a CPU consuming operation, with non-negligible impact on latency.\n If there is a need to use the same prefix multiple times, consider loadDictionary instead.\n Note 4 : By default, the prefix is interpreted as raw content (ZSTD_dct_rawContent).\n Use experimental ZSTD_CCtx_refPrefix_advanced() to alter dictionary interpretation."] pub fn ZSTD_CCtx_refPrefix( cctx: *mut ZSTD_CCtx, - prefix: *const ::core::ffi::c_void, + prefix: *const libc::c_void, prefixSize: usize, ) -> usize; } @@ -565,7 +561,7 @@ #[doc = " ZSTD_DCtx_loadDictionary() : Requires v1.4.0+\n Create an internal DDict from dict buffer, to be used to decompress all future frames.\n The dictionary remains valid for all future frames, until explicitly invalidated, or\n a new dictionary is loaded.\n @result : 0, or an error code (which can be tested with ZSTD_isError()).\n Special : Adding a NULL (or 0-size) dictionary invalidates any previous dictionary,\n meaning \"return to no-dictionary mode\".\n Note 1 : Loading a dictionary involves building tables,\n which has a non-negligible impact on CPU usage and latency.\n It's recommended to \"load once, use many times\", to amortize the cost\n Note 2 :`dict` content will be copied internally, so `dict` can be released after loading.\n Use ZSTD_DCtx_loadDictionary_byReference() to reference dictionary content instead.\n Note 3 : Use ZSTD_DCtx_loadDictionary_advanced() to take control of\n how dictionary content is loaded and interpreted."] pub fn ZSTD_DCtx_loadDictionary( dctx: *mut ZSTD_DCtx, - dict: *const ::core::ffi::c_void, + dict: *const libc::c_void, dictSize: usize, ) -> usize; } @@ -580,7 +576,7 @@ #[doc = " ZSTD_DCtx_refPrefix() : Requires v1.4.0+\n Reference a prefix (single-usage dictionary) to decompress next frame.\n This is the reverse operation of ZSTD_CCtx_refPrefix(),\n and must use the same prefix as the one used during compression.\n Prefix is **only used once**. Reference is discarded at end of frame.\n End of frame is reached when ZSTD_decompressStream() returns 0.\n @result : 0, or an error code (which can be tested with ZSTD_isError()).\n Note 1 : Adding any prefix (including NULL) invalidates any previously set prefix or dictionary\n Note 2 : Prefix buffer is referenced. It **must** outlive decompression.\n Prefix buffer must remain unmodified up to the end of frame,\n reached when ZSTD_decompressStream() returns 0.\n Note 3 : By default, the prefix is treated as raw content (ZSTD_dct_rawContent).\n Use ZSTD_CCtx_refPrefix_advanced() to alter dictMode (Experimental section)\n Note 4 : Referencing a raw content prefix has almost no cpu nor memory cost.\n A full dictionary is more costly, as it requires building tables."] pub fn ZSTD_DCtx_refPrefix( dctx: *mut ZSTD_DCtx, - prefix: *const ::core::ffi::c_void, + prefix: *const libc::c_void, prefixSize: usize, ) -> usize; } @@ -612,26 +608,26 @@ #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct ZSTD_Sequence { - pub offset: ::core::ffi::c_uint, - pub litLength: ::core::ffi::c_uint, - pub matchLength: ::core::ffi::c_uint, - pub rep: ::core::ffi::c_uint, + pub offset: libc::c_uint, + pub litLength: libc::c_uint, + pub matchLength: libc::c_uint, + pub rep: libc::c_uint, } #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct ZSTD_compressionParameters { #[doc = "< largest match distance : larger == more compression, more memory needed during decompression"] - pub windowLog: ::core::ffi::c_uint, + pub windowLog: libc::c_uint, #[doc = "< fully searched segment : larger == more compression, slower, more memory (useless for fast)"] - pub chainLog: ::core::ffi::c_uint, + pub chainLog: libc::c_uint, #[doc = "< dispatch table : larger == faster, more memory"] - pub hashLog: ::core::ffi::c_uint, + pub hashLog: libc::c_uint, #[doc = "< nb of searches : larger == more compression, slower"] - pub searchLog: ::core::ffi::c_uint, + pub searchLog: libc::c_uint, #[doc = "< match length searched : larger == faster decompression, sometimes less compression"] - pub minMatch: ::core::ffi::c_uint, + pub minMatch: libc::c_uint, #[doc = "< acceptable match size for optimal parser (only) : larger == more compression, slower"] - pub targetLength: ::core::ffi::c_uint, + pub targetLength: libc::c_uint, #[doc = "< see ZSTD_strategy definition above"] pub strategy: ZSTD_strategy, } @@ -639,11 +635,11 @@ #[derive(Debug, Copy, Clone)] pub struct ZSTD_frameParameters { #[doc = "< 1: content size will be in frame header (when known)"] - pub contentSizeFlag: ::core::ffi::c_int, + pub contentSizeFlag: libc::c_int, #[doc = "< 1: generate a 32-bits checksum using XXH64 algorithm at end of frame, for error detection"] - pub checksumFlag: ::core::ffi::c_int, + pub checksumFlag: libc::c_int, #[doc = "< 1: no dictID will be saved into frame header (dictID is only useful for dictionary compression)"] - pub noDictIDFlag: ::core::ffi::c_int, + pub noDictIDFlag: libc::c_int, } #[repr(C)] #[derive(Debug, Copy, Clone)] @@ -712,21 +708,21 @@ extern "C" { #[doc = " ZSTD_findDecompressedSize() :\n `src` should point to the start of a series of ZSTD encoded and/or skippable frames\n `srcSize` must be the _exact_ size of this series\n (i.e. there should be a frame boundary at `src + srcSize`)\n @return : - decompressed size of all data in all successive frames\n - if the decompressed size cannot be determined: ZSTD_CONTENTSIZE_UNKNOWN\n - if an error occurred: ZSTD_CONTENTSIZE_ERROR\n\n note 1 : decompressed size is an optional field, that may not be present, especially in streaming mode.\n When `return==ZSTD_CONTENTSIZE_UNKNOWN`, data to decompress could be any size.\n In which case, it's necessary to use streaming mode to decompress data.\n note 2 : decompressed size is always present when compression is done with ZSTD_compress()\n note 3 : decompressed size can be very large (64-bits value),\n potentially larger than what local system can handle as a single memory segment.\n In which case, it's necessary to use streaming mode to decompress data.\n note 4 : If source is untrusted, decompressed size could be wrong or intentionally modified.\n Always ensure result fits within application's authorized limits.\n Each application can set its own limits.\n note 5 : ZSTD_findDecompressedSize handles multiple frames, and so it must traverse the input to\n read each contained frame header. This is fast as most of the data is skipped,\n however it does mean that all frame data must be present and valid."] pub fn ZSTD_findDecompressedSize( - src: *const ::core::ffi::c_void, + src: *const libc::c_void, srcSize: usize, - ) -> ::core::ffi::c_ulonglong; + ) -> libc::c_ulonglong; } extern "C" { #[doc = " ZSTD_decompressBound() :\n `src` should point to the start of a series of ZSTD encoded and/or skippable frames\n `srcSize` must be the _exact_ size of this series\n (i.e. there should be a frame boundary at `src + srcSize`)\n @return : - upper-bound for the decompressed size of all data in all successive frames\n - if an error occurred: ZSTD_CONTENTSIZE_ERROR\n\n note 1 : an error can occur if `src` contains an invalid or incorrectly formatted frame.\n note 2 : the upper-bound is exact when the decompressed size field is available in every ZSTD encoded frame of `src`.\n in this case, `ZSTD_findDecompressedSize` and `ZSTD_decompressBound` return the same value.\n note 3 : when the decompressed size field isn't available, the upper-bound for that frame is calculated by:\n upper-bound = # blocks * min(128 KB, Window_Size)"] pub fn ZSTD_decompressBound( - src: *const ::core::ffi::c_void, + src: *const libc::c_void, srcSize: usize, - ) -> ::core::ffi::c_ulonglong; + ) -> libc::c_ulonglong; } extern "C" { #[doc = " ZSTD_frameHeaderSize() :\n srcSize must be >= ZSTD_FRAMEHEADERSIZE_PREFIX.\n @return : size of the Frame Header,\n or an error code (if srcSize is too small)"] pub fn ZSTD_frameHeaderSize( - src: *const ::core::ffi::c_void, + src: *const libc::c_void, srcSize: usize, ) -> usize; } @@ -739,21 +735,21 @@ #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct ZSTD_frameHeader { - pub frameContentSize: ::core::ffi::c_ulonglong, - pub windowSize: ::core::ffi::c_ulonglong, - pub blockSizeMax: ::core::ffi::c_uint, + pub frameContentSize: libc::c_ulonglong, + pub windowSize: libc::c_ulonglong, + pub blockSizeMax: libc::c_uint, pub frameType: ZSTD_frameType_e, - pub headerSize: ::core::ffi::c_uint, - pub dictID: ::core::ffi::c_uint, - pub checksumFlag: ::core::ffi::c_uint, - pub _reserved1: ::core::ffi::c_uint, - pub _reserved2: ::core::ffi::c_uint, + pub headerSize: libc::c_uint, + pub dictID: libc::c_uint, + pub checksumFlag: libc::c_uint, + pub _reserved1: libc::c_uint, + pub _reserved2: libc::c_uint, } extern "C" { #[doc = " ZSTD_getFrameHeader() :\n decode Frame Header, or requires larger `srcSize`.\n @return : 0, `zfhPtr` is correctly filled,\n >0, `srcSize` is too small, value is wanted `srcSize` amount,\n or an error code, which can be tested using ZSTD_isError()"] pub fn ZSTD_getFrameHeader( zfhPtr: *mut ZSTD_frameHeader, - src: *const ::core::ffi::c_void, + src: *const libc::c_void, srcSize: usize, ) -> usize; } @@ -761,7 +757,7 @@ #[doc = " ZSTD_getFrameHeader_advanced() :\n same as ZSTD_getFrameHeader(),\n with added capability to select a format (like ZSTD_f_zstd1_magicless)"] pub fn ZSTD_getFrameHeader_advanced( zfhPtr: *mut ZSTD_frameHeader, - src: *const ::core::ffi::c_void, + src: *const libc::c_void, srcSize: usize, format: ZSTD_format_e, ) -> usize; @@ -769,7 +765,7 @@ extern "C" { #[doc = " ZSTD_decompressionMargin() :\n Zstd supports in-place decompression, where the input and output buffers overlap.\n In this case, the output buffer must be at least (Margin + Output_Size) bytes large,\n and the input buffer must be at the end of the output buffer.\n\n _______________________ Output Buffer ________________________\n | |\n | ____ Input Buffer ____|\n | | |\n v v v\n |---------------------------------------|-----------|----------|\n ^ ^ ^\n |___________________ Output_Size ___________________|_ Margin _|\n\n NOTE: See also ZSTD_DECOMPRESSION_MARGIN().\n NOTE: This applies only to single-pass decompression through ZSTD_decompress() or\n ZSTD_decompressDCtx().\n NOTE: This function supports multi-frame input.\n\n @param src The compressed frame(s)\n @param srcSize The size of the compressed frame(s)\n @returns The decompression margin or an error that can be checked with ZSTD_isError()."] pub fn ZSTD_decompressionMargin( - src: *const ::core::ffi::c_void, + src: *const libc::c_void, srcSize: usize, ) -> usize; } @@ -789,7 +785,7 @@ zc: *mut ZSTD_CCtx, outSeqs: *mut ZSTD_Sequence, outSeqsSize: usize, - src: *const ::core::ffi::c_void, + src: *const libc::c_void, srcSize: usize, ) -> usize; } @@ -804,46 +800,44 @@ #[doc = " ZSTD_compressSequences() :\n Compress an array of ZSTD_Sequence, associated with @src buffer, into dst.\n @src contains the entire input (not just the literals).\n If @srcSize > sum(sequence.length), the remaining bytes are considered all literals\n If a dictionary is included, then the cctx should reference the dict. (see: ZSTD_CCtx_refCDict(), ZSTD_CCtx_loadDictionary(), etc.)\n The entire source is compressed into a single frame.\n\n The compression behavior changes based on cctx params. In particular:\n If ZSTD_c_blockDelimiters == ZSTD_sf_noBlockDelimiters, the array of ZSTD_Sequence is expected to contain\n no block delimiters (defined in ZSTD_Sequence). Block boundaries are roughly determined based on\n the block size derived from the cctx, and sequences may be split. This is the default setting.\n\n If ZSTD_c_blockDelimiters == ZSTD_sf_explicitBlockDelimiters, the array of ZSTD_Sequence is expected to contain\n block delimiters (defined in ZSTD_Sequence). Behavior is undefined if no block delimiters are provided.\n\n If ZSTD_c_validateSequences == 0, this function will blindly accept the sequences provided. Invalid sequences cause undefined\n behavior. If ZSTD_c_validateSequences == 1, then if sequence is invalid (see doc/zstd_compression_format.md for\n specifics regarding offset/matchlength requirements) then the function will bail out and return an error.\n\n In addition to the two adjustable experimental params, there are other important cctx params.\n - ZSTD_c_minMatch MUST be set as less than or equal to the smallest match generated by the match finder. It has a minimum value of ZSTD_MINMATCH_MIN.\n - ZSTD_c_compressionLevel accordingly adjusts the strength of the entropy coder, as it would in typical compression.\n - ZSTD_c_windowLog affects offset validation: this function will return an error at higher debug levels if a provided offset\n is larger than what the spec allows for a given window log and dictionary (if present). See: doc/zstd_compression_format.md\n\n Note: Repcodes are, as of now, always re-calculated within this function, so ZSTD_Sequence::rep is unused.\n Note 2: Once we integrate ability to ingest repcodes, the explicit block delims mode must respect those repcodes exactly,\n and cannot emit an RLE block that disagrees with the repcode history\n @return : final compressed size, or a ZSTD error code."] pub fn ZSTD_compressSequences( cctx: *mut ZSTD_CCtx, - dst: *mut ::core::ffi::c_void, + dst: *mut libc::c_void, dstSize: usize, inSeqs: *const ZSTD_Sequence, inSeqsSize: usize, - src: *const ::core::ffi::c_void, + src: *const libc::c_void, srcSize: usize, ) -> usize; } extern "C" { #[doc = " ZSTD_writeSkippableFrame() :\n Generates a zstd skippable frame containing data given by src, and writes it to dst buffer.\n\n Skippable frames begin with a 4-byte magic number. There are 16 possible choices of magic number,\n ranging from ZSTD_MAGIC_SKIPPABLE_START to ZSTD_MAGIC_SKIPPABLE_START+15.\n As such, the parameter magicVariant controls the exact skippable frame magic number variant used, so\n the magic number used will be ZSTD_MAGIC_SKIPPABLE_START + magicVariant.\n\n Returns an error if destination buffer is not large enough, if the source size is not representable\n with a 4-byte unsigned int, or if the parameter magicVariant is greater than 15 (and therefore invalid).\n\n @return : number of bytes written or a ZSTD error."] pub fn ZSTD_writeSkippableFrame( - dst: *mut ::core::ffi::c_void, + dst: *mut libc::c_void, dstCapacity: usize, - src: *const ::core::ffi::c_void, + src: *const libc::c_void, srcSize: usize, - magicVariant: ::core::ffi::c_uint, + magicVariant: libc::c_uint, ) -> usize; } extern "C" { #[doc = " ZSTD_readSkippableFrame() :\n Retrieves a zstd skippable frame containing data given by src, and writes it to dst buffer.\n\n The parameter magicVariant will receive the magicVariant that was supplied when the frame was written,\n i.e. magicNumber - ZSTD_MAGIC_SKIPPABLE_START. This can be NULL if the caller is not interested\n in the magicVariant.\n\n Returns an error if destination buffer is not large enough, or if the frame is not skippable.\n\n @return : number of bytes written or a ZSTD error."] pub fn ZSTD_readSkippableFrame( - dst: *mut ::core::ffi::c_void, + dst: *mut libc::c_void, dstCapacity: usize, - magicVariant: *mut ::core::ffi::c_uint, - src: *const ::core::ffi::c_void, + magicVariant: *mut libc::c_uint, + src: *const libc::c_void, srcSize: usize, ) -> usize; } extern "C" { #[doc = " ZSTD_isSkippableFrame() :\n Tells if the content of `buffer` starts with a valid Frame Identifier for a skippable frame."] pub fn ZSTD_isSkippableFrame( - buffer: *const ::core::ffi::c_void, + buffer: *const libc::c_void, size: usize, - ) -> ::core::ffi::c_uint; + ) -> libc::c_uint; } extern "C" { #[doc = " ZSTD_estimate*() :\n These functions make it possible to estimate memory usage\n of a future {D,C}Ctx, before its creation.\n\n ZSTD_estimateCCtxSize() will provide a memory budget large enough\n for any compression level up to selected one.\n Note : Unlike ZSTD_estimateCStreamSize*(), this estimate\n does not include space for a window buffer.\n Therefore, the estimation is only guaranteed for single-shot compressions, not streaming.\n The estimate will assume the input may be arbitrarily large,\n which is the worst case.\n\n When srcSize can be bound by a known and rather \"small\" value,\n this fact can be used to provide a tighter estimation\n because the CCtx compression context will need less memory.\n This tighter estimation can be provided by more advanced functions\n ZSTD_estimateCCtxSize_usingCParams(), which can be used in tandem with ZSTD_getCParams(),\n and ZSTD_estimateCCtxSize_usingCCtxParams(), which can be used in tandem with ZSTD_CCtxParams_setParameter().\n Both can be used to estimate memory using custom compression parameters and arbitrary srcSize limits.\n\n Note : only single-threaded compression is supported.\n ZSTD_estimateCCtxSize_usingCCtxParams() will return an error code if ZSTD_c_nbWorkers is >= 1.\n\n Note 2 : ZSTD_estimateCCtxSize* functions are not compatible with the Block-Level Sequence Producer API at this time.\n Size estimates assume that no external sequence producer is registered."] - pub fn ZSTD_estimateCCtxSize( - compressionLevel: ::core::ffi::c_int, - ) -> usize; + pub fn ZSTD_estimateCCtxSize(compressionLevel: libc::c_int) -> usize; } extern "C" { pub fn ZSTD_estimateCCtxSize_usingCParams( @@ -860,9 +854,7 @@ } extern "C" { #[doc = " ZSTD_estimateCStreamSize() :\n ZSTD_estimateCStreamSize() will provide a budget large enough for any compression level up to selected one.\n It will also consider src size to be arbitrarily \"large\", which is worst case.\n If srcSize is known to always be small, ZSTD_estimateCStreamSize_usingCParams() can provide a tighter estimation.\n ZSTD_estimateCStreamSize_usingCParams() can be used in tandem with ZSTD_getCParams() to create cParams from compressionLevel.\n ZSTD_estimateCStreamSize_usingCCtxParams() can be used in tandem with ZSTD_CCtxParams_setParameter(). Only single-threaded compression is supported. This function will return an error code if ZSTD_c_nbWorkers is >= 1.\n Note : CStream size estimation is only correct for single-threaded compression.\n ZSTD_DStream memory budget depends on window Size.\n This information can be passed manually, using ZSTD_estimateDStreamSize,\n or deducted from a valid frame Header, using ZSTD_estimateDStreamSize_fromFrame();\n Note : if streaming is init with function ZSTD_init?Stream_usingDict(),\n an internal ?Dict will be created, which additional size is not estimated here.\n In this case, get total size by adding ZSTD_estimate?DictSize\n Note 2 : only single-threaded compression is supported.\n ZSTD_estimateCStreamSize_usingCCtxParams() will return an error code if ZSTD_c_nbWorkers is >= 1.\n Note 3 : ZSTD_estimateCStreamSize* functions are not compatible with the Block-Level Sequence Producer API at this time.\n Size estimates assume that no external sequence producer is registered."] - pub fn ZSTD_estimateCStreamSize( - compressionLevel: ::core::ffi::c_int, - ) -> usize; + pub fn ZSTD_estimateCStreamSize(compressionLevel: libc::c_int) -> usize; } extern "C" { pub fn ZSTD_estimateCStreamSize_usingCParams( @@ -879,7 +871,7 @@ } extern "C" { pub fn ZSTD_estimateDStreamSize_fromFrame( - src: *const ::core::ffi::c_void, + src: *const libc::c_void, srcSize: usize, ) -> usize; } @@ -887,7 +879,7 @@ #[doc = " ZSTD_estimate?DictSize() :\n ZSTD_estimateCDictSize() will bet that src size is relatively \"small\", and content is copied, like ZSTD_createCDict().\n ZSTD_estimateCDictSize_advanced() makes it possible to control compression parameters precisely, like ZSTD_createCDict_advanced().\n Note : dictionaries created by reference (`ZSTD_dlm_byRef`) are logically smaller."] pub fn ZSTD_estimateCDictSize( dictSize: usize, - compressionLevel: ::core::ffi::c_int, + compressionLevel: libc::c_int, ) -> usize; } extern "C" { @@ -906,33 +898,33 @@ extern "C" { #[doc = " ZSTD_initStatic*() :\n Initialize an object using a pre-allocated fixed-size buffer.\n workspace: The memory area to emplace the object into.\n Provided pointer *must be 8-bytes aligned*.\n Buffer must outlive object.\n workspaceSize: Use ZSTD_estimate*Size() to determine\n how large workspace must be to support target scenario.\n @return : pointer to object (same address as workspace, just different type),\n or NULL if error (size too small, incorrect alignment, etc.)\n Note : zstd will never resize nor malloc() when using a static buffer.\n If the object requires more memory than available,\n zstd will just error out (typically ZSTD_error_memory_allocation).\n Note 2 : there is no corresponding \"free\" function.\n Since workspace is allocated externally, it must be freed externally too.\n Note 3 : cParams : use ZSTD_getCParams() to convert a compression level\n into its associated cParams.\n Limitation 1 : currently not compatible with internal dictionary creation, triggered by\n ZSTD_CCtx_loadDictionary(), ZSTD_initCStream_usingDict() or ZSTD_initDStream_usingDict().\n Limitation 2 : static cctx currently not compatible with multi-threading.\n Limitation 3 : static dctx is incompatible with legacy support."] pub fn ZSTD_initStaticCCtx( - workspace: *mut ::core::ffi::c_void, + workspace: *mut libc::c_void, workspaceSize: usize, ) -> *mut ZSTD_CCtx; } extern "C" { pub fn ZSTD_initStaticCStream( - workspace: *mut ::core::ffi::c_void, + workspace: *mut libc::c_void, workspaceSize: usize, ) -> *mut ZSTD_CStream; } extern "C" { pub fn ZSTD_initStaticDCtx( - workspace: *mut ::core::ffi::c_void, + workspace: *mut libc::c_void, workspaceSize: usize, ) -> *mut ZSTD_DCtx; } extern "C" { pub fn ZSTD_initStaticDStream( - workspace: *mut ::core::ffi::c_void, + workspace: *mut libc::c_void, workspaceSize: usize, ) -> *mut ZSTD_DStream; } extern "C" { pub fn ZSTD_initStaticCDict( - workspace: *mut ::core::ffi::c_void, + workspace: *mut libc::c_void, workspaceSize: usize, - dict: *const ::core::ffi::c_void, + dict: *const libc::c_void, dictSize: usize, dictLoadMethod: ZSTD_dictLoadMethod_e, dictContentType: ZSTD_dictContentType_e, @@ -941,9 +933,9 @@ } extern "C" { pub fn ZSTD_initStaticDDict( - workspace: *mut ::core::ffi::c_void, + workspace: *mut libc::c_void, workspaceSize: usize, - dict: *const ::core::ffi::c_void, + dict: *const libc::c_void, dictSize: usize, dictLoadMethod: ZSTD_dictLoadMethod_e, dictContentType: ZSTD_dictContentType_e, @@ -952,14 +944,14 @@ #[doc = " Custom memory allocation :\n These prototypes make it possible to pass your own allocation/free functions.\n ZSTD_customMem is provided at creation time, using ZSTD_create*_advanced() variants listed below.\n All allocation/free operations will be completed using these custom variants instead of regular ones."] pub type ZSTD_allocFunction = ::core::option::Option< unsafe extern "C" fn( - opaque: *mut ::core::ffi::c_void, + opaque: *mut libc::c_void, size: usize, - ) -> *mut ::core::ffi::c_void, + ) -> *mut libc::c_void, >; pub type ZSTD_freeFunction = ::core::option::Option< unsafe extern "C" fn( - opaque: *mut ::core::ffi::c_void, - address: *mut ::core::ffi::c_void, + opaque: *mut libc::c_void, + address: *mut libc::c_void, ), >; #[repr(C)] @@ -967,7 +959,7 @@ pub struct ZSTD_customMem { pub customAlloc: ZSTD_allocFunction, pub customFree: ZSTD_freeFunction, - pub opaque: *mut ::core::ffi::c_void, + pub opaque: *mut libc::c_void, } extern "C" { #[doc = "< this constant defers to stdlib's functions"] @@ -995,7 +987,7 @@ } extern "C" { pub fn ZSTD_createCDict_advanced( - dict: *const ::core::ffi::c_void, + dict: *const libc::c_void, dictSize: usize, dictLoadMethod: ZSTD_dictLoadMethod_e, dictContentType: ZSTD_dictContentType_e, @@ -1024,7 +1016,7 @@ } extern "C" { pub fn ZSTD_createCDict_advanced2( - dict: *const ::core::ffi::c_void, + dict: *const libc::c_void, dictSize: usize, dictLoadMethod: ZSTD_dictLoadMethod_e, dictContentType: ZSTD_dictContentType_e, @@ -1034,7 +1026,7 @@ } extern "C" { pub fn ZSTD_createDDict_advanced( - dict: *const ::core::ffi::c_void, + dict: *const libc::c_void, dictSize: usize, dictLoadMethod: ZSTD_dictLoadMethod_e, dictContentType: ZSTD_dictContentType_e, @@ -1044,24 +1036,24 @@ extern "C" { #[doc = " ZSTD_createCDict_byReference() :\n Create a digested dictionary for compression\n Dictionary content is just referenced, not duplicated.\n As a consequence, `dictBuffer` **must** outlive CDict,\n and its content must remain unmodified throughout the lifetime of CDict.\n note: equivalent to ZSTD_createCDict_advanced(), with dictLoadMethod==ZSTD_dlm_byRef"] pub fn ZSTD_createCDict_byReference( - dictBuffer: *const ::core::ffi::c_void, + dictBuffer: *const libc::c_void, dictSize: usize, - compressionLevel: ::core::ffi::c_int, + compressionLevel: libc::c_int, ) -> *mut ZSTD_CDict; } extern "C" { #[doc = " ZSTD_getCParams() :\n @return ZSTD_compressionParameters structure for a selected compression level and estimated srcSize.\n `estimatedSrcSize` value is optional, select 0 if not known"] pub fn ZSTD_getCParams( - compressionLevel: ::core::ffi::c_int, - estimatedSrcSize: ::core::ffi::c_ulonglong, + compressionLevel: libc::c_int, + estimatedSrcSize: libc::c_ulonglong, dictSize: usize, ) -> ZSTD_compressionParameters; } extern "C" { #[doc = " ZSTD_getParams() :\n same as ZSTD_getCParams(), but @return a full `ZSTD_parameters` object instead of sub-component `ZSTD_compressionParameters`.\n All fields of `ZSTD_frameParameters` are set to default : contentSize=1, checksum=0, noDictID=0"] pub fn ZSTD_getParams( - compressionLevel: ::core::ffi::c_int, - estimatedSrcSize: ::core::ffi::c_ulonglong, + compressionLevel: libc::c_int, + estimatedSrcSize: libc::c_ulonglong, dictSize: usize, ) -> ZSTD_parameters; } @@ -1073,7 +1065,7 @@ #[doc = " ZSTD_adjustCParams() :\n optimize params for a given `srcSize` and `dictSize`.\n `srcSize` can be unknown, in which case use ZSTD_CONTENTSIZE_UNKNOWN.\n `dictSize` must be `0` when there is no dictionary.\n cPar can be invalid : all parameters will be clamped within valid range in the @return struct.\n This function never fails (wide contract)"] pub fn ZSTD_adjustCParams( cPar: ZSTD_compressionParameters, - srcSize: ::core::ffi::c_ulonglong, + srcSize: libc::c_ulonglong, dictSize: usize, ) -> ZSTD_compressionParameters; } @@ -1102,11 +1094,11 @@ #[doc = " ZSTD_compress_advanced() :\n Note : this function is now DEPRECATED.\n It can be replaced by ZSTD_compress2(), in combination with ZSTD_CCtx_setParameter() and other parameter setters.\n This prototype will generate compilation warnings."] pub fn ZSTD_compress_advanced( cctx: *mut ZSTD_CCtx, - dst: *mut ::core::ffi::c_void, + dst: *mut libc::c_void, dstCapacity: usize, - src: *const ::core::ffi::c_void, + src: *const libc::c_void, srcSize: usize, - dict: *const ::core::ffi::c_void, + dict: *const libc::c_void, dictSize: usize, params: ZSTD_parameters, ) -> usize; @@ -1115,9 +1107,9 @@ #[doc = " ZSTD_compress_usingCDict_advanced() :\n Note : this function is now DEPRECATED.\n It can be replaced by ZSTD_compress2(), in combination with ZSTD_CCtx_loadDictionary() and other parameter setters.\n This prototype will generate compilation warnings."] pub fn ZSTD_compress_usingCDict_advanced( cctx: *mut ZSTD_CCtx, - dst: *mut ::core::ffi::c_void, + dst: *mut libc::c_void, dstCapacity: usize, - src: *const ::core::ffi::c_void, + src: *const libc::c_void, srcSize: usize, cdict: *const ZSTD_CDict, fParams: ZSTD_frameParameters, @@ -1127,7 +1119,7 @@ #[doc = " ZSTD_CCtx_loadDictionary_byReference() :\n Same as ZSTD_CCtx_loadDictionary(), but dictionary content is referenced, instead of being copied into CCtx.\n It saves some memory, but also requires that `dict` outlives its usage within `cctx`"] pub fn ZSTD_CCtx_loadDictionary_byReference( cctx: *mut ZSTD_CCtx, - dict: *const ::core::ffi::c_void, + dict: *const libc::c_void, dictSize: usize, ) -> usize; } @@ -1135,7 +1127,7 @@ #[doc = " ZSTD_CCtx_loadDictionary_advanced() :\n Same as ZSTD_CCtx_loadDictionary(), but gives finer control over\n how to load the dictionary (by copy ? by reference ?)\n and how to interpret it (automatic ? force raw mode ? full mode only ?)"] pub fn ZSTD_CCtx_loadDictionary_advanced( cctx: *mut ZSTD_CCtx, - dict: *const ::core::ffi::c_void, + dict: *const libc::c_void, dictSize: usize, dictLoadMethod: ZSTD_dictLoadMethod_e, dictContentType: ZSTD_dictContentType_e, @@ -1145,7 +1137,7 @@ #[doc = " ZSTD_CCtx_refPrefix_advanced() :\n Same as ZSTD_CCtx_refPrefix(), but gives finer control over\n how to interpret prefix content (automatic ? force raw mode (default) ? full mode only ?)"] pub fn ZSTD_CCtx_refPrefix_advanced( cctx: *mut ZSTD_CCtx, - prefix: *const ::core::ffi::c_void, + prefix: *const libc::c_void, prefixSize: usize, dictContentType: ZSTD_dictContentType_e, ) -> usize; @@ -1155,7 +1147,7 @@ pub fn ZSTD_CCtx_getParameter( cctx: *const ZSTD_CCtx, param: ZSTD_cParameter, - value: *mut ::core::ffi::c_int, + value: *mut libc::c_int, ) -> usize; } extern "C" { @@ -1173,7 +1165,7 @@ #[doc = " ZSTD_CCtxParams_init() :\n Initializes the compression parameters of cctxParams according to\n compression level. All other parameters are reset to their default values."] pub fn ZSTD_CCtxParams_init( cctxParams: *mut ZSTD_CCtx_params, - compressionLevel: ::core::ffi::c_int, + compressionLevel: libc::c_int, ) -> usize; } extern "C" { @@ -1188,7 +1180,7 @@ pub fn ZSTD_CCtxParams_setParameter( params: *mut ZSTD_CCtx_params, param: ZSTD_cParameter, - value: ::core::ffi::c_int, + value: libc::c_int, ) -> usize; } extern "C" { @@ -1196,7 +1188,7 @@ pub fn ZSTD_CCtxParams_getParameter( params: *const ZSTD_CCtx_params, param: ZSTD_cParameter, - value: *mut ::core::ffi::c_int, + value: *mut libc::c_int, ) -> usize; } extern "C" { @@ -1210,10 +1202,10 @@ #[doc = " ZSTD_compressStream2_simpleArgs() :\n Same as ZSTD_compressStream2(),\n but using only integral types as arguments.\n This variant might be helpful for binders from dynamic languages\n which have troubles handling structures containing memory pointers."] pub fn ZSTD_compressStream2_simpleArgs( cctx: *mut ZSTD_CCtx, - dst: *mut ::core::ffi::c_void, + dst: *mut libc::c_void, dstCapacity: usize, dstPos: *mut usize, - src: *const ::core::ffi::c_void, + src: *const libc::c_void, srcSize: usize, srcPos: *mut usize, endOp: ZSTD_EndDirective, @@ -1222,14 +1214,14 @@ extern "C" { #[doc = " ZSTD_isFrame() :\n Tells if the content of `buffer` starts with a valid Frame Identifier.\n Note : Frame Identifier is 4 bytes. If `size < 4`, @return will always be 0.\n Note 2 : Legacy Frame Identifiers are considered valid only if Legacy Support is enabled.\n Note 3 : Skippable Frame Identifiers are considered valid."] pub fn ZSTD_isFrame( - buffer: *const ::core::ffi::c_void, + buffer: *const libc::c_void, size: usize, - ) -> ::core::ffi::c_uint; + ) -> libc::c_uint; } extern "C" { #[doc = " ZSTD_createDDict_byReference() :\n Create a digested dictionary, ready to start decompression operation without startup delay.\n Dictionary content is referenced, and therefore stays in dictBuffer.\n It is important that dictBuffer outlives DDict,\n it must remain read accessible throughout the lifetime of DDict"] pub fn ZSTD_createDDict_byReference( - dictBuffer: *const ::core::ffi::c_void, + dictBuffer: *const libc::c_void, dictSize: usize, ) -> *mut ZSTD_DDict; } @@ -1237,7 +1229,7 @@ #[doc = " ZSTD_DCtx_loadDictionary_byReference() :\n Same as ZSTD_DCtx_loadDictionary(),\n but references `dict` content instead of copying it into `dctx`.\n This saves memory if `dict` remains around.,\n However, it's imperative that `dict` remains accessible (and unmodified) while being used, so it must outlive decompression."] pub fn ZSTD_DCtx_loadDictionary_byReference( dctx: *mut ZSTD_DCtx, - dict: *const ::core::ffi::c_void, + dict: *const libc::c_void, dictSize: usize, ) -> usize; } @@ -1245,7 +1237,7 @@ #[doc = " ZSTD_DCtx_loadDictionary_advanced() :\n Same as ZSTD_DCtx_loadDictionary(),\n but gives direct control over\n how to load the dictionary (by copy ? by reference ?)\n and how to interpret it (automatic ? force raw mode ? full mode only ?)."] pub fn ZSTD_DCtx_loadDictionary_advanced( dctx: *mut ZSTD_DCtx, - dict: *const ::core::ffi::c_void, + dict: *const libc::c_void, dictSize: usize, dictLoadMethod: ZSTD_dictLoadMethod_e, dictContentType: ZSTD_dictContentType_e, @@ -1255,7 +1247,7 @@ #[doc = " ZSTD_DCtx_refPrefix_advanced() :\n Same as ZSTD_DCtx_refPrefix(), but gives finer control over\n how to interpret prefix content (automatic ? force raw mode (default) ? full mode only ?)"] pub fn ZSTD_DCtx_refPrefix_advanced( dctx: *mut ZSTD_DCtx, - prefix: *const ::core::ffi::c_void, + prefix: *const libc::c_void, prefixSize: usize, dictContentType: ZSTD_dictContentType_e, ) -> usize; @@ -1272,7 +1264,7 @@ pub fn ZSTD_DCtx_getParameter( dctx: *mut ZSTD_DCtx, param: ZSTD_dParameter, - value: *mut ::core::ffi::c_int, + value: *mut libc::c_int, ) -> usize; } extern "C" { @@ -1286,10 +1278,10 @@ #[doc = " ZSTD_decompressStream_simpleArgs() :\n Same as ZSTD_decompressStream(),\n but using only integral types as arguments.\n This can be helpful for binders from dynamic languages\n which have troubles handling structures containing memory pointers."] pub fn ZSTD_decompressStream_simpleArgs( dctx: *mut ZSTD_DCtx, - dst: *mut ::core::ffi::c_void, + dst: *mut libc::c_void, dstCapacity: usize, dstPos: *mut usize, - src: *const ::core::ffi::c_void, + src: *const libc::c_void, srcSize: usize, srcPos: *mut usize, ) -> usize; @@ -1298,27 +1290,27 @@ #[doc = " ZSTD_initCStream_srcSize() :\n This function is DEPRECATED, and equivalent to:\n ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only);\n ZSTD_CCtx_refCDict(zcs, NULL); // clear the dictionary (if any)\n ZSTD_CCtx_setParameter(zcs, ZSTD_c_compressionLevel, compressionLevel);\n ZSTD_CCtx_setPledgedSrcSize(zcs, pledgedSrcSize);\n\n pledgedSrcSize must be correct. If it is not known at init time, use\n ZSTD_CONTENTSIZE_UNKNOWN. Note that, for compatibility with older programs,\n \"0\" also disables frame content size field. It may be enabled in the future.\n This prototype will generate compilation warnings."] pub fn ZSTD_initCStream_srcSize( zcs: *mut ZSTD_CStream, - compressionLevel: ::core::ffi::c_int, - pledgedSrcSize: ::core::ffi::c_ulonglong, + compressionLevel: libc::c_int, + pledgedSrcSize: libc::c_ulonglong, ) -> usize; } extern "C" { #[doc = " ZSTD_initCStream_usingDict() :\n This function is DEPRECATED, and is equivalent to:\n ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only);\n ZSTD_CCtx_setParameter(zcs, ZSTD_c_compressionLevel, compressionLevel);\n ZSTD_CCtx_loadDictionary(zcs, dict, dictSize);\n\n Creates of an internal CDict (incompatible with static CCtx), except if\n dict == NULL or dictSize < 8, in which case no dict is used.\n Note: dict is loaded with ZSTD_dct_auto (treated as a full zstd dictionary if\n it begins with ZSTD_MAGIC_DICTIONARY, else as raw content) and ZSTD_dlm_byCopy.\n This prototype will generate compilation warnings."] pub fn ZSTD_initCStream_usingDict( zcs: *mut ZSTD_CStream, - dict: *const ::core::ffi::c_void, + dict: *const libc::c_void, dictSize: usize, - compressionLevel: ::core::ffi::c_int, + compressionLevel: libc::c_int, ) -> usize; } extern "C" { #[doc = " ZSTD_initCStream_advanced() :\n This function is DEPRECATED, and is equivalent to:\n ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only);\n ZSTD_CCtx_setParams(zcs, params);\n ZSTD_CCtx_setPledgedSrcSize(zcs, pledgedSrcSize);\n ZSTD_CCtx_loadDictionary(zcs, dict, dictSize);\n\n dict is loaded with ZSTD_dct_auto and ZSTD_dlm_byCopy.\n pledgedSrcSize must be correct.\n If srcSize is not known at init time, use value ZSTD_CONTENTSIZE_UNKNOWN.\n This prototype will generate compilation warnings."] pub fn ZSTD_initCStream_advanced( zcs: *mut ZSTD_CStream, - dict: *const ::core::ffi::c_void, + dict: *const libc::c_void, dictSize: usize, params: ZSTD_parameters, - pledgedSrcSize: ::core::ffi::c_ulonglong, + pledgedSrcSize: libc::c_ulonglong, ) -> usize; } extern "C" { @@ -1334,25 +1326,25 @@ zcs: *mut ZSTD_CStream, cdict: *const ZSTD_CDict, fParams: ZSTD_frameParameters, - pledgedSrcSize: ::core::ffi::c_ulonglong, + pledgedSrcSize: libc::c_ulonglong, ) -> usize; } extern "C" { #[doc = " ZSTD_resetCStream() :\n This function is DEPRECATED, and is equivalent to:\n ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only);\n ZSTD_CCtx_setPledgedSrcSize(zcs, pledgedSrcSize);\n Note: ZSTD_resetCStream() interprets pledgedSrcSize == 0 as ZSTD_CONTENTSIZE_UNKNOWN, but\n ZSTD_CCtx_setPledgedSrcSize() does not do the same, so ZSTD_CONTENTSIZE_UNKNOWN must be\n explicitly specified.\n\n start a new frame, using same parameters from previous frame.\n This is typically useful to skip dictionary loading stage, since it will re-use it in-place.\n Note that zcs must be init at least once before using ZSTD_resetCStream().\n If pledgedSrcSize is not known at reset time, use macro ZSTD_CONTENTSIZE_UNKNOWN.\n If pledgedSrcSize > 0, its value must be correct, as it will be written in header, and controlled at the end.\n For the time being, pledgedSrcSize==0 is interpreted as \"srcSize unknown\" for compatibility with older programs,\n but it will change to mean \"empty\" in future version, so use macro ZSTD_CONTENTSIZE_UNKNOWN instead.\n @return : 0, or an error code (which can be tested using ZSTD_isError())\n This prototype will generate compilation warnings."] pub fn ZSTD_resetCStream( zcs: *mut ZSTD_CStream, - pledgedSrcSize: ::core::ffi::c_ulonglong, + pledgedSrcSize: libc::c_ulonglong, ) -> usize; } #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct ZSTD_frameProgression { - pub ingested: ::core::ffi::c_ulonglong, - pub consumed: ::core::ffi::c_ulonglong, - pub produced: ::core::ffi::c_ulonglong, - pub flushed: ::core::ffi::c_ulonglong, - pub currentJobID: ::core::ffi::c_uint, - pub nbActiveWorkers: ::core::ffi::c_uint, + pub ingested: libc::c_ulonglong, + pub consumed: libc::c_ulonglong, + pub produced: libc::c_ulonglong, + pub flushed: libc::c_ulonglong, + pub currentJobID: libc::c_uint, + pub nbActiveWorkers: libc::c_uint, } extern "C" { pub fn ZSTD_getFrameProgression( @@ -1367,7 +1359,7 @@ #[doc = " This function is deprecated, and is equivalent to:\n\n ZSTD_DCtx_reset(zds, ZSTD_reset_session_only);\n ZSTD_DCtx_loadDictionary(zds, dict, dictSize);\n\n note: no dictionary will be used if dict == NULL or dictSize < 8"] pub fn ZSTD_initDStream_usingDict( zds: *mut ZSTD_DStream, - dict: *const ::core::ffi::c_void, + dict: *const libc::c_void, dictSize: usize, ) -> usize; } @@ -1384,14 +1376,14 @@ } pub type ZSTD_sequenceProducer_F = ::core::option::Option< unsafe extern "C" fn( - sequenceProducerState: *mut ::core::ffi::c_void, + sequenceProducerState: *mut libc::c_void, outSeqs: *mut ZSTD_Sequence, outSeqsCapacity: usize, - src: *const ::core::ffi::c_void, + src: *const libc::c_void, srcSize: usize, - dict: *const ::core::ffi::c_void, + dict: *const libc::c_void, dictSize: usize, - compressionLevel: ::core::ffi::c_int, + compressionLevel: libc::c_int, windowSize: usize, ) -> usize, >; @@ -1399,7 +1391,7 @@ #[doc = " ZSTD_registerSequenceProducer() :\n Instruct zstd to use a block-level external sequence producer function.\n\n The sequenceProducerState must be initialized by the caller, and the caller is\n responsible for managing its lifetime. This parameter is sticky across\n compressions. It will remain set until the user explicitly resets compression\n parameters.\n\n Sequence producer registration is considered to be an \"advanced parameter\",\n part of the \"advanced API\". This means it will only have an effect on compression\n APIs which respect advanced parameters, such as compress2() and compressStream2().\n Older compression APIs such as compressCCtx(), which predate the introduction of\n \"advanced parameters\", will ignore any external sequence producer setting.\n\n The sequence producer can be \"cleared\" by registering a NULL function pointer. This\n removes all limitations described above in the \"LIMITATIONS\" section of the API docs.\n\n The user is strongly encouraged to read the full API documentation (above) before\n calling this function."] pub fn ZSTD_registerSequenceProducer( cctx: *mut ZSTD_CCtx, - sequenceProducerState: *mut ::core::ffi::c_void, + sequenceProducerState: *mut libc::c_void, sequenceProducer: ZSTD_sequenceProducer_F, ); } @@ -1407,15 +1399,15 @@ #[doc = "Buffer-less streaming compression (synchronous mode)\n\nA ZSTD_CCtx object is required to track streaming operations.\nUse ZSTD_createCCtx() / ZSTD_freeCCtx() to manage resource.\nZSTD_CCtx object can be re-used multiple times within successive compression operations.\n\nStart by initializing a context.\nUse ZSTD_compressBegin(), or ZSTD_compressBegin_usingDict() for dictionary compression.\n\nThen, consume your input using ZSTD_compressContinue().\nThere are some important considerations to keep in mind when using this advanced function :\n- ZSTD_compressContinue() has no internal buffer. It uses externally provided buffers only.\n- Interface is synchronous : input is consumed entirely and produces 1+ compressed blocks.\n- Caller must ensure there is enough space in `dst` to store compressed data under worst case scenario.\nWorst case evaluation is provided by ZSTD_compressBound().\nZSTD_compressContinue() doesn't guarantee recover after a failed compression.\n- ZSTD_compressContinue() presumes prior input ***is still accessible and unmodified*** (up to maximum distance size, see WindowLog).\nIt remembers all previous contiguous blocks, plus one separated memory segment (which can itself consists of multiple contiguous blocks)\n- ZSTD_compressContinue() detects that prior input has been overwritten when `src` buffer overlaps.\nIn which case, it will \"discard\" the relevant memory section from its history.\n\nFinish a frame with ZSTD_compressEnd(), which will write the last block(s) and optional checksum.\nIt's possible to use srcSize==0, in which case, it will write a final empty block to end the frame.\nWithout last block mark, frames are considered unfinished (hence corrupted) by compliant decoders.\n\n`ZSTD_CCtx` object can be re-used (ZSTD_compressBegin()) to compress again."] pub fn ZSTD_compressBegin( cctx: *mut ZSTD_CCtx, - compressionLevel: ::core::ffi::c_int, + compressionLevel: libc::c_int, ) -> usize; } extern "C" { pub fn ZSTD_compressBegin_usingDict( cctx: *mut ZSTD_CCtx, - dict: *const ::core::ffi::c_void, + dict: *const libc::c_void, dictSize: usize, - compressionLevel: ::core::ffi::c_int, + compressionLevel: libc::c_int, ) -> usize; } extern "C" { @@ -1428,34 +1420,34 @@ pub fn ZSTD_copyCCtx( cctx: *mut ZSTD_CCtx, preparedCCtx: *const ZSTD_CCtx, - pledgedSrcSize: ::core::ffi::c_ulonglong, + pledgedSrcSize: libc::c_ulonglong, ) -> usize; } extern "C" { pub fn ZSTD_compressContinue( cctx: *mut ZSTD_CCtx, - dst: *mut ::core::ffi::c_void, + dst: *mut libc::c_void, dstCapacity: usize, - src: *const ::core::ffi::c_void, + src: *const libc::c_void, srcSize: usize, ) -> usize; } extern "C" { pub fn ZSTD_compressEnd( cctx: *mut ZSTD_CCtx, - dst: *mut ::core::ffi::c_void, + dst: *mut libc::c_void, dstCapacity: usize, - src: *const ::core::ffi::c_void, + src: *const libc::c_void, srcSize: usize, ) -> usize; } extern "C" { pub fn ZSTD_compressBegin_advanced( cctx: *mut ZSTD_CCtx, - dict: *const ::core::ffi::c_void, + dict: *const libc::c_void, dictSize: usize, params: ZSTD_parameters, - pledgedSrcSize: ::core::ffi::c_ulonglong, + pledgedSrcSize: libc::c_ulonglong, ) -> usize; } extern "C" { @@ -1463,14 +1455,14 @@ cctx: *mut ZSTD_CCtx, cdict: *const ZSTD_CDict, fParams: ZSTD_frameParameters, - pledgedSrcSize: ::core::ffi::c_ulonglong, + pledgedSrcSize: libc::c_ulonglong, ) -> usize; } extern "C" { #[doc = "Buffer-less streaming decompression (synchronous mode)\n\nA ZSTD_DCtx object is required to track streaming operations.\nUse ZSTD_createDCtx() / ZSTD_freeDCtx() to manage it.\nA ZSTD_DCtx object can be re-used multiple times.\n\nFirst typical operation is to retrieve frame parameters, using ZSTD_getFrameHeader().\nFrame header is extracted from the beginning of compressed frame, so providing only the frame's beginning is enough.\nData fragment must be large enough to ensure successful decoding.\n`ZSTD_frameHeaderSize_max` bytes is guaranteed to always be large enough.\nresult : 0 : successful decoding, the `ZSTD_frameHeader` structure is correctly filled.\n>0 : `srcSize` is too small, please provide at least result bytes on next attempt.\nerrorCode, which can be tested using ZSTD_isError().\n\nIt fills a ZSTD_frameHeader structure with important information to correctly decode the frame,\nsuch as the dictionary ID, content size, or maximum back-reference distance (`windowSize`).\nNote that these values could be wrong, either because of data corruption, or because a 3rd party deliberately spoofs false information.\nAs a consequence, check that values remain within valid application range.\nFor example, do not allocate memory blindly, check that `windowSize` is within expectation.\nEach application can set its own limits, depending on local restrictions.\nFor extended interoperability, it is recommended to support `windowSize` of at least 8 MB.\n\nZSTD_decompressContinue() needs previous data blocks during decompression, up to `windowSize` bytes.\nZSTD_decompressContinue() is very sensitive to contiguity,\nif 2 blocks don't follow each other, make sure that either the compressor breaks contiguity at the same place,\nor that previous contiguous segment is large enough to properly handle maximum back-reference distance.\nThere are multiple ways to guarantee this condition.\n\nThe most memory efficient way is to use a round buffer of sufficient size.\nSufficient size is determined by invoking ZSTD_decodingBufferSize_min(),\nwhich can return an error code if required value is too large for current system (in 32-bits mode).\nIn a round buffer methodology, ZSTD_decompressContinue() decompresses each block next to previous one,\nup to the moment there is not enough room left in the buffer to guarantee decoding another full block,\nwhich maximum size is provided in `ZSTD_frameHeader` structure, field `blockSizeMax`.\nAt which point, decoding can resume from the beginning of the buffer.\nNote that already decoded data stored in the buffer should be flushed before being overwritten.\n\nThere are alternatives possible, for example using two or more buffers of size `windowSize` each, though they consume more memory.\n\nFinally, if you control the compression process, you can also ignore all buffer size rules,\nas long as the encoder and decoder progress in \"lock-step\",\naka use exactly the same buffer sizes, break contiguity at the same place, etc.\n\nOnce buffers are setup, start decompression, with ZSTD_decompressBegin().\nIf decompression requires a dictionary, use ZSTD_decompressBegin_usingDict() or ZSTD_decompressBegin_usingDDict().\n\nThen use ZSTD_nextSrcSizeToDecompress() and ZSTD_decompressContinue() alternatively.\nZSTD_nextSrcSizeToDecompress() tells how many bytes to provide as 'srcSize' to ZSTD_decompressContinue().\nZSTD_decompressContinue() requires this _exact_ amount of bytes, or it will fail.\n\nresult of ZSTD_decompressContinue() is the number of bytes regenerated within 'dst' (necessarily <= dstCapacity).\nIt can be zero : it just means ZSTD_decompressContinue() has decoded some metadata item.\nIt can also be an error code, which can be tested with ZSTD_isError().\n\nA frame is fully decoded when ZSTD_nextSrcSizeToDecompress() returns zero.\nContext can then be reset to start a new decompression.\n\nNote : it's possible to know if next input to present is a header or a block, using ZSTD_nextInputType().\nThis information is not required to properly decode a frame.\n\n== Special case : skippable frames ==\n\nSkippable frames allow integration of user-defined data into a flow of concatenated frames.\nSkippable frames will be ignored (skipped) by decompressor.\nThe format of skippable frames is as follows :\na) Skippable frame ID - 4 Bytes, Little endian format, any value from 0x184D2A50 to 0x184D2A5F\nb) Frame Size - 4 Bytes, Little endian format, unsigned 32-bits\nc) Frame Content - any content (User Data) of length equal to Frame Size\nFor skippable frames ZSTD_getFrameHeader() returns zfhPtr->frameType==ZSTD_skippableFrame.\nFor skippable frames ZSTD_decompressContinue() always returns 0 : it only skips the content."] pub fn ZSTD_decodingBufferSize_min( - windowSize: ::core::ffi::c_ulonglong, - frameContentSize: ::core::ffi::c_ulonglong, + windowSize: libc::c_ulonglong, + frameContentSize: libc::c_ulonglong, ) -> usize; } extern "C" { @@ -1479,7 +1471,7 @@ extern "C" { pub fn ZSTD_decompressBegin_usingDict( dctx: *mut ZSTD_DCtx, - dict: *const ::core::ffi::c_void, + dict: *const libc::c_void, dictSize: usize, ) -> usize; } @@ -1495,9 +1487,9 @@ extern "C" { pub fn ZSTD_decompressContinue( dctx: *mut ZSTD_DCtx, - dst: *mut ::core::ffi::c_void, + dst: *mut libc::c_void, dstCapacity: usize, - src: *const ::core::ffi::c_void, + src: *const libc::c_void, srcSize: usize, ) -> usize; } @@ -1524,73 +1516,25 @@ extern "C" { pub fn ZSTD_compressBlock( cctx: *mut ZSTD_CCtx, - dst: *mut ::core::ffi::c_void, + dst: *mut libc::c_void, dstCapacity: usize, - src: *const ::core::ffi::c_void, + src: *const libc::c_void, srcSize: usize, ) -> usize; } extern "C" { pub fn ZSTD_decompressBlock( dctx: *mut ZSTD_DCtx, - dst: *mut ::core::ffi::c_void, + dst: *mut libc::c_void, dstCapacity: usize, - src: *const ::core::ffi::c_void, + src: *const libc::c_void, srcSize: usize, ) -> usize; } extern "C" { pub fn ZSTD_insertBlock( dctx: *mut ZSTD_DCtx, - blockStart: *const ::core::ffi::c_void, + blockStart: *const libc::c_void, blockSize: usize, ) -> usize; } -#[repr(u32)] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub enum ZSTD_ErrorCode { - ZSTD_error_no_error = 0, - ZSTD_error_GENERIC = 1, - ZSTD_error_prefix_unknown = 10, - ZSTD_error_version_unsupported = 12, - ZSTD_error_frameParameter_unsupported = 14, - ZSTD_error_frameParameter_windowTooLarge = 16, - ZSTD_error_corruption_detected = 20, - ZSTD_error_checksum_wrong = 22, - ZSTD_error_literals_headerWrong = 24, - ZSTD_error_dictionary_corrupted = 30, - ZSTD_error_dictionary_wrong = 32, - ZSTD_error_dictionaryCreation_failed = 34, - ZSTD_error_parameter_unsupported = 40, - ZSTD_error_parameter_combination_unsupported = 41, - ZSTD_error_parameter_outOfBound = 42, - ZSTD_error_tableLog_tooLarge = 44, - ZSTD_error_maxSymbolValue_tooLarge = 46, - ZSTD_error_maxSymbolValue_tooSmall = 48, - ZSTD_error_stabilityCondition_notRespected = 50, - ZSTD_error_stage_wrong = 60, - ZSTD_error_init_missing = 62, - ZSTD_error_memory_allocation = 64, - ZSTD_error_workSpace_tooSmall = 66, - ZSTD_error_dstSize_tooSmall = 70, - ZSTD_error_srcSize_wrong = 72, - ZSTD_error_dstBuffer_null = 74, - ZSTD_error_noForwardProgress_destFull = 80, - ZSTD_error_noForwardProgress_inputEmpty = 82, - ZSTD_error_frameIndex_tooLarge = 100, - ZSTD_error_seekableIO = 102, - ZSTD_error_dstBuffer_wrong = 104, - ZSTD_error_srcBuffer_wrong = 105, - ZSTD_error_sequenceProducer_failed = 106, - ZSTD_error_externalSequences_invalid = 107, - ZSTD_error_maxCode = 120, -} -extern "C" { - #[doc = " ZSTD_getErrorCode() :\nconvert a `size_t` function result into a `ZSTD_ErrorCode` enum type,\nwhich can be used to compare with enum list published above"] - pub fn ZSTD_getErrorCode(functionResult: usize) -> ZSTD_ErrorCode; -} -extern "C" { - pub fn ZSTD_getErrorString( - code: ZSTD_ErrorCode, - ) -> *const ::core::ffi::c_char; -} diff -Nru temporalio-1.3.0/vendor/zstd-sys/src/bindings_zstd.rs temporalio-1.3.0/vendor/zstd-sys/src/bindings_zstd.rs --- temporalio-1.3.0/vendor/zstd-sys/src/bindings_zstd.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zstd-sys/src/bindings_zstd.rs 2023-10-30 19:40:00.000000000 +0000 @@ -33,7 +33,7 @@ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -/* automatically generated by rust-bindgen 0.66.1 */ +/* automatically generated by rust-bindgen 0.64.0 */ pub const ZSTD_VERSION_MAJOR: u32 = 1; pub const ZSTD_VERSION_MINOR: u32 = 5; @@ -50,48 +50,48 @@ pub const ZSTD_CONTENTSIZE_ERROR: i32 = -2; extern "C" { #[doc = " ZSTD_versionNumber() :\n Return runtime library version, the value is (MAJOR*100*100 + MINOR*100 + RELEASE)."] - pub fn ZSTD_versionNumber() -> ::core::ffi::c_uint; + pub fn ZSTD_versionNumber() -> libc::c_uint; } extern "C" { #[doc = " ZSTD_versionString() :\n Return runtime library version, like \"1.4.5\". Requires v1.3.0+."] - pub fn ZSTD_versionString() -> *const ::core::ffi::c_char; + pub fn ZSTD_versionString() -> *const libc::c_char; } extern "C" { #[doc = " Simple API\n/\n/*! ZSTD_compress() :\n Compresses `src` content as a single zstd compressed frame into already allocated `dst`.\n NOTE: Providing `dstCapacity >= ZSTD_compressBound(srcSize)` guarantees that zstd will have\n enough space to successfully compress the data.\n @return : compressed size written into `dst` (<= `dstCapacity),\n or an error code if it fails (which can be tested using ZSTD_isError())."] pub fn ZSTD_compress( - dst: *mut ::core::ffi::c_void, + dst: *mut libc::c_void, dstCapacity: usize, - src: *const ::core::ffi::c_void, + src: *const libc::c_void, srcSize: usize, - compressionLevel: ::core::ffi::c_int, + compressionLevel: libc::c_int, ) -> usize; } extern "C" { #[doc = " ZSTD_decompress() :\n `compressedSize` : must be the _exact_ size of some number of compressed and/or skippable frames.\n `dstCapacity` is an upper bound of originalSize to regenerate.\n If user cannot imply a maximum upper bound, it's better to use streaming mode to decompress data.\n @return : the number of bytes decompressed into `dst` (<= `dstCapacity`),\n or an errorCode if it fails (which can be tested using ZSTD_isError())."] pub fn ZSTD_decompress( - dst: *mut ::core::ffi::c_void, + dst: *mut libc::c_void, dstCapacity: usize, - src: *const ::core::ffi::c_void, + src: *const libc::c_void, compressedSize: usize, ) -> usize; } extern "C" { pub fn ZSTD_getFrameContentSize( - src: *const ::core::ffi::c_void, + src: *const libc::c_void, srcSize: usize, - ) -> ::core::ffi::c_ulonglong; + ) -> libc::c_ulonglong; } extern "C" { #[doc = " ZSTD_getDecompressedSize() :\n NOTE: This function is now obsolete, in favor of ZSTD_getFrameContentSize().\n Both functions work the same way, but ZSTD_getDecompressedSize() blends\n \"empty\", \"unknown\" and \"error\" results to the same return value (0),\n while ZSTD_getFrameContentSize() gives them separate return values.\n @return : decompressed size of `src` frame content _if known and not empty_, 0 otherwise."] pub fn ZSTD_getDecompressedSize( - src: *const ::core::ffi::c_void, + src: *const libc::c_void, srcSize: usize, - ) -> ::core::ffi::c_ulonglong; + ) -> libc::c_ulonglong; } extern "C" { #[doc = " ZSTD_findFrameCompressedSize() : Requires v1.4.0+\n `src` should point to the start of a ZSTD frame or skippable frame.\n `srcSize` must be >= first frame size\n @return : the compressed size of the first frame starting at `src`,\n suitable to pass as `srcSize` to `ZSTD_decompress` or similar,\n or an error code if input is invalid"] pub fn ZSTD_findFrameCompressedSize( - src: *const ::core::ffi::c_void, + src: *const libc::c_void, srcSize: usize, ) -> usize; } @@ -99,19 +99,19 @@ pub fn ZSTD_compressBound(srcSize: usize) -> usize; } extern "C" { - pub fn ZSTD_isError(code: usize) -> ::core::ffi::c_uint; + pub fn ZSTD_isError(code: usize) -> libc::c_uint; } extern "C" { - pub fn ZSTD_getErrorName(code: usize) -> *const ::core::ffi::c_char; + pub fn ZSTD_getErrorName(code: usize) -> *const libc::c_char; } extern "C" { - pub fn ZSTD_minCLevel() -> ::core::ffi::c_int; + pub fn ZSTD_minCLevel() -> libc::c_int; } extern "C" { - pub fn ZSTD_maxCLevel() -> ::core::ffi::c_int; + pub fn ZSTD_maxCLevel() -> libc::c_int; } extern "C" { - pub fn ZSTD_defaultCLevel() -> ::core::ffi::c_int; + pub fn ZSTD_defaultCLevel() -> libc::c_int; } #[repr(C)] #[derive(Debug, Copy, Clone)] @@ -130,11 +130,11 @@ #[doc = " ZSTD_compressCCtx() :\n Same as ZSTD_compress(), using an explicit ZSTD_CCtx.\n Important : in order to behave similarly to `ZSTD_compress()`,\n this function compresses at requested compression level,\n __ignoring any other parameter__ .\n If any advanced parameter was set using the advanced API,\n they will all be reset. Only `compressionLevel` remains."] pub fn ZSTD_compressCCtx( cctx: *mut ZSTD_CCtx, - dst: *mut ::core::ffi::c_void, + dst: *mut libc::c_void, dstCapacity: usize, - src: *const ::core::ffi::c_void, + src: *const libc::c_void, srcSize: usize, - compressionLevel: ::core::ffi::c_int, + compressionLevel: libc::c_int, ) -> usize; } #[repr(C)] @@ -153,9 +153,9 @@ #[doc = " ZSTD_decompressDCtx() :\n Same as ZSTD_decompress(),\n requires an allocated ZSTD_DCtx.\n Compatible with sticky parameters."] pub fn ZSTD_decompressDCtx( dctx: *mut ZSTD_DCtx, - dst: *mut ::core::ffi::c_void, + dst: *mut libc::c_void, dstCapacity: usize, - src: *const ::core::ffi::c_void, + src: *const libc::c_void, srcSize: usize, ) -> usize; } @@ -219,8 +219,8 @@ #[derive(Debug, Copy, Clone)] pub struct ZSTD_bounds { pub error: usize, - pub lowerBound: ::core::ffi::c_int, - pub upperBound: ::core::ffi::c_int, + pub lowerBound: libc::c_int, + pub upperBound: libc::c_int, } extern "C" { #[doc = " ZSTD_cParam_getBounds() :\n All parameters must belong to an interval with lower and upper bounds,\n otherwise they will either trigger an error or be automatically clamped.\n @return : a structure, ZSTD_bounds, which contains\n - an error status field, which must be tested using ZSTD_isError()\n - lower and upper bounds, both inclusive"] @@ -231,14 +231,14 @@ pub fn ZSTD_CCtx_setParameter( cctx: *mut ZSTD_CCtx, param: ZSTD_cParameter, - value: ::core::ffi::c_int, + value: libc::c_int, ) -> usize; } extern "C" { #[doc = " ZSTD_CCtx_setPledgedSrcSize() :\n Total input data size to be compressed as a single frame.\n Value will be written in frame header, unless if explicitly forbidden using ZSTD_c_contentSizeFlag.\n This value will also be controlled at end of frame, and trigger an error if not respected.\n @result : 0, or an error code (which can be tested with ZSTD_isError()).\n Note 1 : pledgedSrcSize==0 actually means zero, aka an empty frame.\n In order to mean \"unknown content size\", pass constant ZSTD_CONTENTSIZE_UNKNOWN.\n ZSTD_CONTENTSIZE_UNKNOWN is default value for any new frame.\n Note 2 : pledgedSrcSize is only valid once, for the next frame.\n It's discarded at the end of the frame, and replaced by ZSTD_CONTENTSIZE_UNKNOWN.\n Note 3 : Whenever all input data is provided and consumed in a single round,\n for example with ZSTD_compress2(),\n or invoking immediately ZSTD_compressStream2(,,,ZSTD_e_end),\n this value is automatically overridden by srcSize instead."] pub fn ZSTD_CCtx_setPledgedSrcSize( cctx: *mut ZSTD_CCtx, - pledgedSrcSize: ::core::ffi::c_ulonglong, + pledgedSrcSize: libc::c_ulonglong, ) -> usize; } #[repr(u32)] @@ -259,9 +259,9 @@ #[doc = " ZSTD_compress2() :\n Behave the same as ZSTD_compressCCtx(), but compression parameters are set using the advanced API.\n ZSTD_compress2() always starts a new frame.\n Should cctx hold data from a previously unfinished frame, everything about it is forgotten.\n - Compression parameters are pushed into CCtx before starting compression, using ZSTD_CCtx_set*()\n - The function is always blocking, returns when compression is completed.\n NOTE: Providing `dstCapacity >= ZSTD_compressBound(srcSize)` guarantees that zstd will have\n enough space to successfully compress the data, though it is possible it fails for other reasons.\n @return : compressed size written into `dst` (<= `dstCapacity),\n or an error code if it fails (which can be tested using ZSTD_isError())."] pub fn ZSTD_compress2( cctx: *mut ZSTD_CCtx, - dst: *mut ::core::ffi::c_void, + dst: *mut libc::c_void, dstCapacity: usize, - src: *const ::core::ffi::c_void, + src: *const libc::c_void, srcSize: usize, ) -> usize; } @@ -285,7 +285,7 @@ pub fn ZSTD_DCtx_setParameter( dctx: *mut ZSTD_DCtx, param: ZSTD_dParameter, - value: ::core::ffi::c_int, + value: libc::c_int, ) -> usize; } extern "C" { @@ -300,7 +300,7 @@ #[derive(Debug, Copy, Clone)] pub struct ZSTD_inBuffer_s { #[doc = "< start of input buffer"] - pub src: *const ::core::ffi::c_void, + pub src: *const libc::c_void, #[doc = "< size of input buffer"] pub size: usize, #[doc = "< position where reading stopped. Will be updated. Necessarily 0 <= pos <= size"] @@ -312,7 +312,7 @@ #[derive(Debug, Copy, Clone)] pub struct ZSTD_outBuffer_s { #[doc = "< start of output buffer"] - pub dst: *mut ::core::ffi::c_void, + pub dst: *mut libc::c_void, #[doc = "< size of output buffer"] pub size: usize, #[doc = "< position where writing stopped. Will be updated. Necessarily 0 <= pos <= size"] @@ -352,7 +352,7 @@ #[doc = " Equivalent to:\n\n ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only);\n ZSTD_CCtx_refCDict(zcs, NULL); // clear the dictionary (if any)\n ZSTD_CCtx_setParameter(zcs, ZSTD_c_compressionLevel, compressionLevel);\n\n Note that ZSTD_initCStream() clears any previously set dictionary. Use the new API\n to compress with a dictionary."] pub fn ZSTD_initCStream( zcs: *mut ZSTD_CStream, - compressionLevel: ::core::ffi::c_int, + compressionLevel: libc::c_int, ) -> usize; } extern "C" { @@ -406,24 +406,24 @@ #[doc = " Simple dictionary API\n/\n/*! ZSTD_compress_usingDict() :\n Compression at an explicit compression level using a Dictionary.\n A dictionary can be any arbitrary data segment (also called a prefix),\n or a buffer with specified information (see zdict.h).\n Note : This function loads the dictionary, resulting in significant startup delay.\n It's intended for a dictionary used only once.\n Note 2 : When `dict == NULL || dictSize < 8` no dictionary is used."] pub fn ZSTD_compress_usingDict( ctx: *mut ZSTD_CCtx, - dst: *mut ::core::ffi::c_void, + dst: *mut libc::c_void, dstCapacity: usize, - src: *const ::core::ffi::c_void, + src: *const libc::c_void, srcSize: usize, - dict: *const ::core::ffi::c_void, + dict: *const libc::c_void, dictSize: usize, - compressionLevel: ::core::ffi::c_int, + compressionLevel: libc::c_int, ) -> usize; } extern "C" { #[doc = " ZSTD_decompress_usingDict() :\n Decompression using a known Dictionary.\n Dictionary must be identical to the one used during compression.\n Note : This function loads the dictionary, resulting in significant startup delay.\n It's intended for a dictionary used only once.\n Note : When `dict == NULL || dictSize < 8` no dictionary is used."] pub fn ZSTD_decompress_usingDict( dctx: *mut ZSTD_DCtx, - dst: *mut ::core::ffi::c_void, + dst: *mut libc::c_void, dstCapacity: usize, - src: *const ::core::ffi::c_void, + src: *const libc::c_void, srcSize: usize, - dict: *const ::core::ffi::c_void, + dict: *const libc::c_void, dictSize: usize, ) -> usize; } @@ -437,9 +437,9 @@ extern "C" { #[doc = " ZSTD_createCDict() :\n When compressing multiple messages or blocks using the same dictionary,\n it's recommended to digest the dictionary only once, since it's a costly operation.\n ZSTD_createCDict() will create a state from digesting a dictionary.\n The resulting state can be used for future compression operations with very limited startup cost.\n ZSTD_CDict can be created once and shared by multiple threads concurrently, since its usage is read-only.\n @dictBuffer can be released after ZSTD_CDict creation, because its content is copied within CDict.\n Note 1 : Consider experimental function `ZSTD_createCDict_byReference()` if you prefer to not duplicate @dictBuffer content.\n Note 2 : A ZSTD_CDict can be created from an empty @dictBuffer,\n in which case the only thing that it transports is the @compressionLevel.\n This can be useful in a pipeline featuring ZSTD_compress_usingCDict() exclusively,\n expecting a ZSTD_CDict parameter with any data, including those without a known dictionary."] pub fn ZSTD_createCDict( - dictBuffer: *const ::core::ffi::c_void, + dictBuffer: *const libc::c_void, dictSize: usize, - compressionLevel: ::core::ffi::c_int, + compressionLevel: libc::c_int, ) -> *mut ZSTD_CDict; } extern "C" { @@ -450,9 +450,9 @@ #[doc = " ZSTD_compress_usingCDict() :\n Compression using a digested Dictionary.\n Recommended when same dictionary is used multiple times.\n Note : compression level is _decided at dictionary creation time_,\n and frame parameters are hardcoded (dictID=yes, contentSize=yes, checksum=no)"] pub fn ZSTD_compress_usingCDict( cctx: *mut ZSTD_CCtx, - dst: *mut ::core::ffi::c_void, + dst: *mut libc::c_void, dstCapacity: usize, - src: *const ::core::ffi::c_void, + src: *const libc::c_void, srcSize: usize, cdict: *const ZSTD_CDict, ) -> usize; @@ -466,7 +466,7 @@ extern "C" { #[doc = " ZSTD_createDDict() :\n Create a digested dictionary, ready to start decompression operation without startup delay.\n dictBuffer can be released after DDict creation, as its content is copied inside DDict."] pub fn ZSTD_createDDict( - dictBuffer: *const ::core::ffi::c_void, + dictBuffer: *const libc::c_void, dictSize: usize, ) -> *mut ZSTD_DDict; } @@ -478,9 +478,9 @@ #[doc = " ZSTD_decompress_usingDDict() :\n Decompression using a digested Dictionary.\n Recommended when same dictionary is used multiple times."] pub fn ZSTD_decompress_usingDDict( dctx: *mut ZSTD_DCtx, - dst: *mut ::core::ffi::c_void, + dst: *mut libc::c_void, dstCapacity: usize, - src: *const ::core::ffi::c_void, + src: *const libc::c_void, srcSize: usize, ddict: *const ZSTD_DDict, ) -> usize; @@ -488,34 +488,30 @@ extern "C" { #[doc = " ZSTD_getDictID_fromDict() : Requires v1.4.0+\n Provides the dictID stored within dictionary.\n if @return == 0, the dictionary is not conformant with Zstandard specification.\n It can still be loaded, but as a content-only dictionary."] pub fn ZSTD_getDictID_fromDict( - dict: *const ::core::ffi::c_void, + dict: *const libc::c_void, dictSize: usize, - ) -> ::core::ffi::c_uint; + ) -> libc::c_uint; } extern "C" { #[doc = " ZSTD_getDictID_fromCDict() : Requires v1.5.0+\n Provides the dictID of the dictionary loaded into `cdict`.\n If @return == 0, the dictionary is not conformant to Zstandard specification, or empty.\n Non-conformant dictionaries can still be loaded, but as content-only dictionaries."] - pub fn ZSTD_getDictID_fromCDict( - cdict: *const ZSTD_CDict, - ) -> ::core::ffi::c_uint; + pub fn ZSTD_getDictID_fromCDict(cdict: *const ZSTD_CDict) -> libc::c_uint; } extern "C" { #[doc = " ZSTD_getDictID_fromDDict() : Requires v1.4.0+\n Provides the dictID of the dictionary loaded into `ddict`.\n If @return == 0, the dictionary is not conformant to Zstandard specification, or empty.\n Non-conformant dictionaries can still be loaded, but as content-only dictionaries."] - pub fn ZSTD_getDictID_fromDDict( - ddict: *const ZSTD_DDict, - ) -> ::core::ffi::c_uint; + pub fn ZSTD_getDictID_fromDDict(ddict: *const ZSTD_DDict) -> libc::c_uint; } extern "C" { #[doc = " ZSTD_getDictID_fromFrame() : Requires v1.4.0+\n Provides the dictID required to decompressed the frame stored within `src`.\n If @return == 0, the dictID could not be decoded.\n This could for one of the following reasons :\n - The frame does not require a dictionary to be decoded (most common case).\n - The frame was built with dictID intentionally removed. Whatever dictionary is necessary is a hidden piece of information.\n Note : this use case also happens when using a non-conformant dictionary.\n - `srcSize` is too small, and as a result, the frame header could not be decoded (only possible if `srcSize < ZSTD_FRAMEHEADERSIZE_MAX`).\n - This is not a Zstandard frame.\n When identifying the exact failure cause, it's possible to use ZSTD_getFrameHeader(), which will provide a more precise error code."] pub fn ZSTD_getDictID_fromFrame( - src: *const ::core::ffi::c_void, + src: *const libc::c_void, srcSize: usize, - ) -> ::core::ffi::c_uint; + ) -> libc::c_uint; } extern "C" { #[doc = " ZSTD_CCtx_loadDictionary() : Requires v1.4.0+\n Create an internal CDict from `dict` buffer.\n Decompression will have to use same dictionary.\n @result : 0, or an error code (which can be tested with ZSTD_isError()).\n Special: Loading a NULL (or 0-size) dictionary invalidates previous dictionary,\n meaning \"return to no-dictionary mode\".\n Note 1 : Dictionary is sticky, it will be used for all future compressed frames,\n until parameters are reset, a new dictionary is loaded, or the dictionary\n is explicitly invalidated by loading a NULL dictionary.\n Note 2 : Loading a dictionary involves building tables.\n It's also a CPU consuming operation, with non-negligible impact on latency.\n Tables are dependent on compression parameters, and for this reason,\n compression parameters can no longer be changed after loading a dictionary.\n Note 3 :`dict` content will be copied internally.\n Use experimental ZSTD_CCtx_loadDictionary_byReference() to reference content instead.\n In such a case, dictionary buffer must outlive its users.\n Note 4 : Use ZSTD_CCtx_loadDictionary_advanced()\n to precisely select how dictionary content must be interpreted.\n Note 5 : This method does not benefit from LDM (long distance mode).\n If you want to employ LDM on some large dictionary content,\n prefer employing ZSTD_CCtx_refPrefix() described below."] pub fn ZSTD_CCtx_loadDictionary( cctx: *mut ZSTD_CCtx, - dict: *const ::core::ffi::c_void, + dict: *const libc::c_void, dictSize: usize, ) -> usize; } @@ -530,7 +526,7 @@ #[doc = " ZSTD_CCtx_refPrefix() : Requires v1.4.0+\n Reference a prefix (single-usage dictionary) for next compressed frame.\n A prefix is **only used once**. Tables are discarded at end of frame (ZSTD_e_end).\n Decompression will need same prefix to properly regenerate data.\n Compressing with a prefix is similar in outcome as performing a diff and compressing it,\n but performs much faster, especially during decompression (compression speed is tunable with compression level).\n This method is compatible with LDM (long distance mode).\n @result : 0, or an error code (which can be tested with ZSTD_isError()).\n Special: Adding any prefix (including NULL) invalidates any previous prefix or dictionary\n Note 1 : Prefix buffer is referenced. It **must** outlive compression.\n Its content must remain unmodified during compression.\n Note 2 : If the intention is to diff some large src data blob with some prior version of itself,\n ensure that the window size is large enough to contain the entire source.\n See ZSTD_c_windowLog.\n Note 3 : Referencing a prefix involves building tables, which are dependent on compression parameters.\n It's a CPU consuming operation, with non-negligible impact on latency.\n If there is a need to use the same prefix multiple times, consider loadDictionary instead.\n Note 4 : By default, the prefix is interpreted as raw content (ZSTD_dct_rawContent).\n Use experimental ZSTD_CCtx_refPrefix_advanced() to alter dictionary interpretation."] pub fn ZSTD_CCtx_refPrefix( cctx: *mut ZSTD_CCtx, - prefix: *const ::core::ffi::c_void, + prefix: *const libc::c_void, prefixSize: usize, ) -> usize; } @@ -538,7 +534,7 @@ #[doc = " ZSTD_DCtx_loadDictionary() : Requires v1.4.0+\n Create an internal DDict from dict buffer, to be used to decompress all future frames.\n The dictionary remains valid for all future frames, until explicitly invalidated, or\n a new dictionary is loaded.\n @result : 0, or an error code (which can be tested with ZSTD_isError()).\n Special : Adding a NULL (or 0-size) dictionary invalidates any previous dictionary,\n meaning \"return to no-dictionary mode\".\n Note 1 : Loading a dictionary involves building tables,\n which has a non-negligible impact on CPU usage and latency.\n It's recommended to \"load once, use many times\", to amortize the cost\n Note 2 :`dict` content will be copied internally, so `dict` can be released after loading.\n Use ZSTD_DCtx_loadDictionary_byReference() to reference dictionary content instead.\n Note 3 : Use ZSTD_DCtx_loadDictionary_advanced() to take control of\n how dictionary content is loaded and interpreted."] pub fn ZSTD_DCtx_loadDictionary( dctx: *mut ZSTD_DCtx, - dict: *const ::core::ffi::c_void, + dict: *const libc::c_void, dictSize: usize, ) -> usize; } @@ -553,7 +549,7 @@ #[doc = " ZSTD_DCtx_refPrefix() : Requires v1.4.0+\n Reference a prefix (single-usage dictionary) to decompress next frame.\n This is the reverse operation of ZSTD_CCtx_refPrefix(),\n and must use the same prefix as the one used during compression.\n Prefix is **only used once**. Reference is discarded at end of frame.\n End of frame is reached when ZSTD_decompressStream() returns 0.\n @result : 0, or an error code (which can be tested with ZSTD_isError()).\n Note 1 : Adding any prefix (including NULL) invalidates any previously set prefix or dictionary\n Note 2 : Prefix buffer is referenced. It **must** outlive decompression.\n Prefix buffer must remain unmodified up to the end of frame,\n reached when ZSTD_decompressStream() returns 0.\n Note 3 : By default, the prefix is treated as raw content (ZSTD_dct_rawContent).\n Use ZSTD_CCtx_refPrefix_advanced() to alter dictMode (Experimental section)\n Note 4 : Referencing a raw content prefix has almost no cpu nor memory cost.\n A full dictionary is more costly, as it requires building tables."] pub fn ZSTD_DCtx_refPrefix( dctx: *mut ZSTD_DCtx, - prefix: *const ::core::ffi::c_void, + prefix: *const libc::c_void, prefixSize: usize, ) -> usize; } diff -Nru temporalio-1.3.0/vendor/zstd-sys/src/bindings_zstd_std_experimental.rs temporalio-1.3.0/vendor/zstd-sys/src/bindings_zstd_std_experimental.rs --- temporalio-1.3.0/vendor/zstd-sys/src/bindings_zstd_std_experimental.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zstd-sys/src/bindings_zstd_std_experimental.rs 2023-10-30 19:40:00.000000000 +0000 @@ -33,7 +33,7 @@ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -/* automatically generated by rust-bindgen 0.66.1 */ +/* automatically generated by rust-bindgen 0.64.0 */ pub const ZSTD_VERSION_MAJOR: u32 = 1; pub const ZSTD_VERSION_MINOR: u32 = 5; @@ -77,11 +77,11 @@ pub const ZSTD_SRCSIZEHINT_MIN: u32 = 0; extern "C" { #[doc = " ZSTD_versionNumber() :\n Return runtime library version, the value is (MAJOR*100*100 + MINOR*100 + RELEASE)."] - pub fn ZSTD_versionNumber() -> ::core::ffi::c_uint; + pub fn ZSTD_versionNumber() -> ::std::os::raw::c_uint; } extern "C" { #[doc = " ZSTD_versionString() :\n Return runtime library version, like \"1.4.5\". Requires v1.3.0+."] - pub fn ZSTD_versionString() -> *const ::core::ffi::c_char; + pub fn ZSTD_versionString() -> *const ::std::os::raw::c_char; } extern "C" { #[doc = " Simple API\n/\n/*! ZSTD_compress() :\n Compresses `src` content as a single zstd compressed frame into already allocated `dst`.\n NOTE: Providing `dstCapacity >= ZSTD_compressBound(srcSize)` guarantees that zstd will have\n enough space to successfully compress the data.\n @return : compressed size written into `dst` (<= `dstCapacity),\n or an error code if it fails (which can be tested using ZSTD_isError())."] @@ -90,7 +90,7 @@ dstCapacity: usize, src: *const ::core::ffi::c_void, srcSize: usize, - compressionLevel: ::core::ffi::c_int, + compressionLevel: ::std::os::raw::c_int, ) -> usize; } extern "C" { @@ -106,14 +106,14 @@ pub fn ZSTD_getFrameContentSize( src: *const ::core::ffi::c_void, srcSize: usize, - ) -> ::core::ffi::c_ulonglong; + ) -> ::std::os::raw::c_ulonglong; } extern "C" { #[doc = " ZSTD_getDecompressedSize() :\n NOTE: This function is now obsolete, in favor of ZSTD_getFrameContentSize().\n Both functions work the same way, but ZSTD_getDecompressedSize() blends\n \"empty\", \"unknown\" and \"error\" results to the same return value (0),\n while ZSTD_getFrameContentSize() gives them separate return values.\n @return : decompressed size of `src` frame content _if known and not empty_, 0 otherwise."] pub fn ZSTD_getDecompressedSize( src: *const ::core::ffi::c_void, srcSize: usize, - ) -> ::core::ffi::c_ulonglong; + ) -> ::std::os::raw::c_ulonglong; } extern "C" { #[doc = " ZSTD_findFrameCompressedSize() : Requires v1.4.0+\n `src` should point to the start of a ZSTD frame or skippable frame.\n `srcSize` must be >= first frame size\n @return : the compressed size of the first frame starting at `src`,\n suitable to pass as `srcSize` to `ZSTD_decompress` or similar,\n or an error code if input is invalid"] @@ -126,19 +126,19 @@ pub fn ZSTD_compressBound(srcSize: usize) -> usize; } extern "C" { - pub fn ZSTD_isError(code: usize) -> ::core::ffi::c_uint; + pub fn ZSTD_isError(code: usize) -> ::std::os::raw::c_uint; } extern "C" { - pub fn ZSTD_getErrorName(code: usize) -> *const ::core::ffi::c_char; + pub fn ZSTD_getErrorName(code: usize) -> *const ::std::os::raw::c_char; } extern "C" { - pub fn ZSTD_minCLevel() -> ::core::ffi::c_int; + pub fn ZSTD_minCLevel() -> ::std::os::raw::c_int; } extern "C" { - pub fn ZSTD_maxCLevel() -> ::core::ffi::c_int; + pub fn ZSTD_maxCLevel() -> ::std::os::raw::c_int; } extern "C" { - pub fn ZSTD_defaultCLevel() -> ::core::ffi::c_int; + pub fn ZSTD_defaultCLevel() -> ::std::os::raw::c_int; } #[repr(C)] #[derive(Debug, Copy, Clone)] @@ -161,7 +161,7 @@ dstCapacity: usize, src: *const ::core::ffi::c_void, srcSize: usize, - compressionLevel: ::core::ffi::c_int, + compressionLevel: ::std::os::raw::c_int, ) -> usize; } #[repr(C)] @@ -246,8 +246,8 @@ #[derive(Debug, Copy, Clone)] pub struct ZSTD_bounds { pub error: usize, - pub lowerBound: ::core::ffi::c_int, - pub upperBound: ::core::ffi::c_int, + pub lowerBound: ::std::os::raw::c_int, + pub upperBound: ::std::os::raw::c_int, } extern "C" { #[doc = " ZSTD_cParam_getBounds() :\n All parameters must belong to an interval with lower and upper bounds,\n otherwise they will either trigger an error or be automatically clamped.\n @return : a structure, ZSTD_bounds, which contains\n - an error status field, which must be tested using ZSTD_isError()\n - lower and upper bounds, both inclusive"] @@ -258,14 +258,14 @@ pub fn ZSTD_CCtx_setParameter( cctx: *mut ZSTD_CCtx, param: ZSTD_cParameter, - value: ::core::ffi::c_int, + value: ::std::os::raw::c_int, ) -> usize; } extern "C" { #[doc = " ZSTD_CCtx_setPledgedSrcSize() :\n Total input data size to be compressed as a single frame.\n Value will be written in frame header, unless if explicitly forbidden using ZSTD_c_contentSizeFlag.\n This value will also be controlled at end of frame, and trigger an error if not respected.\n @result : 0, or an error code (which can be tested with ZSTD_isError()).\n Note 1 : pledgedSrcSize==0 actually means zero, aka an empty frame.\n In order to mean \"unknown content size\", pass constant ZSTD_CONTENTSIZE_UNKNOWN.\n ZSTD_CONTENTSIZE_UNKNOWN is default value for any new frame.\n Note 2 : pledgedSrcSize is only valid once, for the next frame.\n It's discarded at the end of the frame, and replaced by ZSTD_CONTENTSIZE_UNKNOWN.\n Note 3 : Whenever all input data is provided and consumed in a single round,\n for example with ZSTD_compress2(),\n or invoking immediately ZSTD_compressStream2(,,,ZSTD_e_end),\n this value is automatically overridden by srcSize instead."] pub fn ZSTD_CCtx_setPledgedSrcSize( cctx: *mut ZSTD_CCtx, - pledgedSrcSize: ::core::ffi::c_ulonglong, + pledgedSrcSize: ::std::os::raw::c_ulonglong, ) -> usize; } #[repr(u32)] @@ -312,7 +312,7 @@ pub fn ZSTD_DCtx_setParameter( dctx: *mut ZSTD_DCtx, param: ZSTD_dParameter, - value: ::core::ffi::c_int, + value: ::std::os::raw::c_int, ) -> usize; } extern "C" { @@ -379,7 +379,7 @@ #[doc = " Equivalent to:\n\n ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only);\n ZSTD_CCtx_refCDict(zcs, NULL); // clear the dictionary (if any)\n ZSTD_CCtx_setParameter(zcs, ZSTD_c_compressionLevel, compressionLevel);\n\n Note that ZSTD_initCStream() clears any previously set dictionary. Use the new API\n to compress with a dictionary."] pub fn ZSTD_initCStream( zcs: *mut ZSTD_CStream, - compressionLevel: ::core::ffi::c_int, + compressionLevel: ::std::os::raw::c_int, ) -> usize; } extern "C" { @@ -439,7 +439,7 @@ srcSize: usize, dict: *const ::core::ffi::c_void, dictSize: usize, - compressionLevel: ::core::ffi::c_int, + compressionLevel: ::std::os::raw::c_int, ) -> usize; } extern "C" { @@ -466,7 +466,7 @@ pub fn ZSTD_createCDict( dictBuffer: *const ::core::ffi::c_void, dictSize: usize, - compressionLevel: ::core::ffi::c_int, + compressionLevel: ::std::os::raw::c_int, ) -> *mut ZSTD_CDict; } extern "C" { @@ -517,26 +517,26 @@ pub fn ZSTD_getDictID_fromDict( dict: *const ::core::ffi::c_void, dictSize: usize, - ) -> ::core::ffi::c_uint; + ) -> ::std::os::raw::c_uint; } extern "C" { #[doc = " ZSTD_getDictID_fromCDict() : Requires v1.5.0+\n Provides the dictID of the dictionary loaded into `cdict`.\n If @return == 0, the dictionary is not conformant to Zstandard specification, or empty.\n Non-conformant dictionaries can still be loaded, but as content-only dictionaries."] pub fn ZSTD_getDictID_fromCDict( cdict: *const ZSTD_CDict, - ) -> ::core::ffi::c_uint; + ) -> ::std::os::raw::c_uint; } extern "C" { #[doc = " ZSTD_getDictID_fromDDict() : Requires v1.4.0+\n Provides the dictID of the dictionary loaded into `ddict`.\n If @return == 0, the dictionary is not conformant to Zstandard specification, or empty.\n Non-conformant dictionaries can still be loaded, but as content-only dictionaries."] pub fn ZSTD_getDictID_fromDDict( ddict: *const ZSTD_DDict, - ) -> ::core::ffi::c_uint; + ) -> ::std::os::raw::c_uint; } extern "C" { #[doc = " ZSTD_getDictID_fromFrame() : Requires v1.4.0+\n Provides the dictID required to decompressed the frame stored within `src`.\n If @return == 0, the dictID could not be decoded.\n This could for one of the following reasons :\n - The frame does not require a dictionary to be decoded (most common case).\n - The frame was built with dictID intentionally removed. Whatever dictionary is necessary is a hidden piece of information.\n Note : this use case also happens when using a non-conformant dictionary.\n - `srcSize` is too small, and as a result, the frame header could not be decoded (only possible if `srcSize < ZSTD_FRAMEHEADERSIZE_MAX`).\n - This is not a Zstandard frame.\n When identifying the exact failure cause, it's possible to use ZSTD_getFrameHeader(), which will provide a more precise error code."] pub fn ZSTD_getDictID_fromFrame( src: *const ::core::ffi::c_void, srcSize: usize, - ) -> ::core::ffi::c_uint; + ) -> ::std::os::raw::c_uint; } extern "C" { #[doc = " ZSTD_CCtx_loadDictionary() : Requires v1.4.0+\n Create an internal CDict from `dict` buffer.\n Decompression will have to use same dictionary.\n @result : 0, or an error code (which can be tested with ZSTD_isError()).\n Special: Loading a NULL (or 0-size) dictionary invalidates previous dictionary,\n meaning \"return to no-dictionary mode\".\n Note 1 : Dictionary is sticky, it will be used for all future compressed frames,\n until parameters are reset, a new dictionary is loaded, or the dictionary\n is explicitly invalidated by loading a NULL dictionary.\n Note 2 : Loading a dictionary involves building tables.\n It's also a CPU consuming operation, with non-negligible impact on latency.\n Tables are dependent on compression parameters, and for this reason,\n compression parameters can no longer be changed after loading a dictionary.\n Note 3 :`dict` content will be copied internally.\n Use experimental ZSTD_CCtx_loadDictionary_byReference() to reference content instead.\n In such a case, dictionary buffer must outlive its users.\n Note 4 : Use ZSTD_CCtx_loadDictionary_advanced()\n to precisely select how dictionary content must be interpreted.\n Note 5 : This method does not benefit from LDM (long distance mode).\n If you want to employ LDM on some large dictionary content,\n prefer employing ZSTD_CCtx_refPrefix() described below."] @@ -612,26 +612,26 @@ #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct ZSTD_Sequence { - pub offset: ::core::ffi::c_uint, - pub litLength: ::core::ffi::c_uint, - pub matchLength: ::core::ffi::c_uint, - pub rep: ::core::ffi::c_uint, + pub offset: ::std::os::raw::c_uint, + pub litLength: ::std::os::raw::c_uint, + pub matchLength: ::std::os::raw::c_uint, + pub rep: ::std::os::raw::c_uint, } #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct ZSTD_compressionParameters { #[doc = "< largest match distance : larger == more compression, more memory needed during decompression"] - pub windowLog: ::core::ffi::c_uint, + pub windowLog: ::std::os::raw::c_uint, #[doc = "< fully searched segment : larger == more compression, slower, more memory (useless for fast)"] - pub chainLog: ::core::ffi::c_uint, + pub chainLog: ::std::os::raw::c_uint, #[doc = "< dispatch table : larger == faster, more memory"] - pub hashLog: ::core::ffi::c_uint, + pub hashLog: ::std::os::raw::c_uint, #[doc = "< nb of searches : larger == more compression, slower"] - pub searchLog: ::core::ffi::c_uint, + pub searchLog: ::std::os::raw::c_uint, #[doc = "< match length searched : larger == faster decompression, sometimes less compression"] - pub minMatch: ::core::ffi::c_uint, + pub minMatch: ::std::os::raw::c_uint, #[doc = "< acceptable match size for optimal parser (only) : larger == more compression, slower"] - pub targetLength: ::core::ffi::c_uint, + pub targetLength: ::std::os::raw::c_uint, #[doc = "< see ZSTD_strategy definition above"] pub strategy: ZSTD_strategy, } @@ -639,11 +639,11 @@ #[derive(Debug, Copy, Clone)] pub struct ZSTD_frameParameters { #[doc = "< 1: content size will be in frame header (when known)"] - pub contentSizeFlag: ::core::ffi::c_int, + pub contentSizeFlag: ::std::os::raw::c_int, #[doc = "< 1: generate a 32-bits checksum using XXH64 algorithm at end of frame, for error detection"] - pub checksumFlag: ::core::ffi::c_int, + pub checksumFlag: ::std::os::raw::c_int, #[doc = "< 1: no dictID will be saved into frame header (dictID is only useful for dictionary compression)"] - pub noDictIDFlag: ::core::ffi::c_int, + pub noDictIDFlag: ::std::os::raw::c_int, } #[repr(C)] #[derive(Debug, Copy, Clone)] @@ -714,14 +714,14 @@ pub fn ZSTD_findDecompressedSize( src: *const ::core::ffi::c_void, srcSize: usize, - ) -> ::core::ffi::c_ulonglong; + ) -> ::std::os::raw::c_ulonglong; } extern "C" { #[doc = " ZSTD_decompressBound() :\n `src` should point to the start of a series of ZSTD encoded and/or skippable frames\n `srcSize` must be the _exact_ size of this series\n (i.e. there should be a frame boundary at `src + srcSize`)\n @return : - upper-bound for the decompressed size of all data in all successive frames\n - if an error occurred: ZSTD_CONTENTSIZE_ERROR\n\n note 1 : an error can occur if `src` contains an invalid or incorrectly formatted frame.\n note 2 : the upper-bound is exact when the decompressed size field is available in every ZSTD encoded frame of `src`.\n in this case, `ZSTD_findDecompressedSize` and `ZSTD_decompressBound` return the same value.\n note 3 : when the decompressed size field isn't available, the upper-bound for that frame is calculated by:\n upper-bound = # blocks * min(128 KB, Window_Size)"] pub fn ZSTD_decompressBound( src: *const ::core::ffi::c_void, srcSize: usize, - ) -> ::core::ffi::c_ulonglong; + ) -> ::std::os::raw::c_ulonglong; } extern "C" { #[doc = " ZSTD_frameHeaderSize() :\n srcSize must be >= ZSTD_FRAMEHEADERSIZE_PREFIX.\n @return : size of the Frame Header,\n or an error code (if srcSize is too small)"] @@ -739,15 +739,15 @@ #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct ZSTD_frameHeader { - pub frameContentSize: ::core::ffi::c_ulonglong, - pub windowSize: ::core::ffi::c_ulonglong, - pub blockSizeMax: ::core::ffi::c_uint, + pub frameContentSize: ::std::os::raw::c_ulonglong, + pub windowSize: ::std::os::raw::c_ulonglong, + pub blockSizeMax: ::std::os::raw::c_uint, pub frameType: ZSTD_frameType_e, - pub headerSize: ::core::ffi::c_uint, - pub dictID: ::core::ffi::c_uint, - pub checksumFlag: ::core::ffi::c_uint, - pub _reserved1: ::core::ffi::c_uint, - pub _reserved2: ::core::ffi::c_uint, + pub headerSize: ::std::os::raw::c_uint, + pub dictID: ::std::os::raw::c_uint, + pub checksumFlag: ::std::os::raw::c_uint, + pub _reserved1: ::std::os::raw::c_uint, + pub _reserved2: ::std::os::raw::c_uint, } extern "C" { #[doc = " ZSTD_getFrameHeader() :\n decode Frame Header, or requires larger `srcSize`.\n @return : 0, `zfhPtr` is correctly filled,\n >0, `srcSize` is too small, value is wanted `srcSize` amount,\n or an error code, which can be tested using ZSTD_isError()"] @@ -819,7 +819,7 @@ dstCapacity: usize, src: *const ::core::ffi::c_void, srcSize: usize, - magicVariant: ::core::ffi::c_uint, + magicVariant: ::std::os::raw::c_uint, ) -> usize; } extern "C" { @@ -827,7 +827,7 @@ pub fn ZSTD_readSkippableFrame( dst: *mut ::core::ffi::c_void, dstCapacity: usize, - magicVariant: *mut ::core::ffi::c_uint, + magicVariant: *mut ::std::os::raw::c_uint, src: *const ::core::ffi::c_void, srcSize: usize, ) -> usize; @@ -837,12 +837,12 @@ pub fn ZSTD_isSkippableFrame( buffer: *const ::core::ffi::c_void, size: usize, - ) -> ::core::ffi::c_uint; + ) -> ::std::os::raw::c_uint; } extern "C" { #[doc = " ZSTD_estimate*() :\n These functions make it possible to estimate memory usage\n of a future {D,C}Ctx, before its creation.\n\n ZSTD_estimateCCtxSize() will provide a memory budget large enough\n for any compression level up to selected one.\n Note : Unlike ZSTD_estimateCStreamSize*(), this estimate\n does not include space for a window buffer.\n Therefore, the estimation is only guaranteed for single-shot compressions, not streaming.\n The estimate will assume the input may be arbitrarily large,\n which is the worst case.\n\n When srcSize can be bound by a known and rather \"small\" value,\n this fact can be used to provide a tighter estimation\n because the CCtx compression context will need less memory.\n This tighter estimation can be provided by more advanced functions\n ZSTD_estimateCCtxSize_usingCParams(), which can be used in tandem with ZSTD_getCParams(),\n and ZSTD_estimateCCtxSize_usingCCtxParams(), which can be used in tandem with ZSTD_CCtxParams_setParameter().\n Both can be used to estimate memory using custom compression parameters and arbitrary srcSize limits.\n\n Note : only single-threaded compression is supported.\n ZSTD_estimateCCtxSize_usingCCtxParams() will return an error code if ZSTD_c_nbWorkers is >= 1.\n\n Note 2 : ZSTD_estimateCCtxSize* functions are not compatible with the Block-Level Sequence Producer API at this time.\n Size estimates assume that no external sequence producer is registered."] pub fn ZSTD_estimateCCtxSize( - compressionLevel: ::core::ffi::c_int, + compressionLevel: ::std::os::raw::c_int, ) -> usize; } extern "C" { @@ -861,7 +861,7 @@ extern "C" { #[doc = " ZSTD_estimateCStreamSize() :\n ZSTD_estimateCStreamSize() will provide a budget large enough for any compression level up to selected one.\n It will also consider src size to be arbitrarily \"large\", which is worst case.\n If srcSize is known to always be small, ZSTD_estimateCStreamSize_usingCParams() can provide a tighter estimation.\n ZSTD_estimateCStreamSize_usingCParams() can be used in tandem with ZSTD_getCParams() to create cParams from compressionLevel.\n ZSTD_estimateCStreamSize_usingCCtxParams() can be used in tandem with ZSTD_CCtxParams_setParameter(). Only single-threaded compression is supported. This function will return an error code if ZSTD_c_nbWorkers is >= 1.\n Note : CStream size estimation is only correct for single-threaded compression.\n ZSTD_DStream memory budget depends on window Size.\n This information can be passed manually, using ZSTD_estimateDStreamSize,\n or deducted from a valid frame Header, using ZSTD_estimateDStreamSize_fromFrame();\n Note : if streaming is init with function ZSTD_init?Stream_usingDict(),\n an internal ?Dict will be created, which additional size is not estimated here.\n In this case, get total size by adding ZSTD_estimate?DictSize\n Note 2 : only single-threaded compression is supported.\n ZSTD_estimateCStreamSize_usingCCtxParams() will return an error code if ZSTD_c_nbWorkers is >= 1.\n Note 3 : ZSTD_estimateCStreamSize* functions are not compatible with the Block-Level Sequence Producer API at this time.\n Size estimates assume that no external sequence producer is registered."] pub fn ZSTD_estimateCStreamSize( - compressionLevel: ::core::ffi::c_int, + compressionLevel: ::std::os::raw::c_int, ) -> usize; } extern "C" { @@ -887,7 +887,7 @@ #[doc = " ZSTD_estimate?DictSize() :\n ZSTD_estimateCDictSize() will bet that src size is relatively \"small\", and content is copied, like ZSTD_createCDict().\n ZSTD_estimateCDictSize_advanced() makes it possible to control compression parameters precisely, like ZSTD_createCDict_advanced().\n Note : dictionaries created by reference (`ZSTD_dlm_byRef`) are logically smaller."] pub fn ZSTD_estimateCDictSize( dictSize: usize, - compressionLevel: ::core::ffi::c_int, + compressionLevel: ::std::os::raw::c_int, ) -> usize; } extern "C" { @@ -1046,22 +1046,22 @@ pub fn ZSTD_createCDict_byReference( dictBuffer: *const ::core::ffi::c_void, dictSize: usize, - compressionLevel: ::core::ffi::c_int, + compressionLevel: ::std::os::raw::c_int, ) -> *mut ZSTD_CDict; } extern "C" { #[doc = " ZSTD_getCParams() :\n @return ZSTD_compressionParameters structure for a selected compression level and estimated srcSize.\n `estimatedSrcSize` value is optional, select 0 if not known"] pub fn ZSTD_getCParams( - compressionLevel: ::core::ffi::c_int, - estimatedSrcSize: ::core::ffi::c_ulonglong, + compressionLevel: ::std::os::raw::c_int, + estimatedSrcSize: ::std::os::raw::c_ulonglong, dictSize: usize, ) -> ZSTD_compressionParameters; } extern "C" { #[doc = " ZSTD_getParams() :\n same as ZSTD_getCParams(), but @return a full `ZSTD_parameters` object instead of sub-component `ZSTD_compressionParameters`.\n All fields of `ZSTD_frameParameters` are set to default : contentSize=1, checksum=0, noDictID=0"] pub fn ZSTD_getParams( - compressionLevel: ::core::ffi::c_int, - estimatedSrcSize: ::core::ffi::c_ulonglong, + compressionLevel: ::std::os::raw::c_int, + estimatedSrcSize: ::std::os::raw::c_ulonglong, dictSize: usize, ) -> ZSTD_parameters; } @@ -1073,7 +1073,7 @@ #[doc = " ZSTD_adjustCParams() :\n optimize params for a given `srcSize` and `dictSize`.\n `srcSize` can be unknown, in which case use ZSTD_CONTENTSIZE_UNKNOWN.\n `dictSize` must be `0` when there is no dictionary.\n cPar can be invalid : all parameters will be clamped within valid range in the @return struct.\n This function never fails (wide contract)"] pub fn ZSTD_adjustCParams( cPar: ZSTD_compressionParameters, - srcSize: ::core::ffi::c_ulonglong, + srcSize: ::std::os::raw::c_ulonglong, dictSize: usize, ) -> ZSTD_compressionParameters; } @@ -1155,7 +1155,7 @@ pub fn ZSTD_CCtx_getParameter( cctx: *const ZSTD_CCtx, param: ZSTD_cParameter, - value: *mut ::core::ffi::c_int, + value: *mut ::std::os::raw::c_int, ) -> usize; } extern "C" { @@ -1173,7 +1173,7 @@ #[doc = " ZSTD_CCtxParams_init() :\n Initializes the compression parameters of cctxParams according to\n compression level. All other parameters are reset to their default values."] pub fn ZSTD_CCtxParams_init( cctxParams: *mut ZSTD_CCtx_params, - compressionLevel: ::core::ffi::c_int, + compressionLevel: ::std::os::raw::c_int, ) -> usize; } extern "C" { @@ -1188,7 +1188,7 @@ pub fn ZSTD_CCtxParams_setParameter( params: *mut ZSTD_CCtx_params, param: ZSTD_cParameter, - value: ::core::ffi::c_int, + value: ::std::os::raw::c_int, ) -> usize; } extern "C" { @@ -1196,7 +1196,7 @@ pub fn ZSTD_CCtxParams_getParameter( params: *const ZSTD_CCtx_params, param: ZSTD_cParameter, - value: *mut ::core::ffi::c_int, + value: *mut ::std::os::raw::c_int, ) -> usize; } extern "C" { @@ -1224,7 +1224,7 @@ pub fn ZSTD_isFrame( buffer: *const ::core::ffi::c_void, size: usize, - ) -> ::core::ffi::c_uint; + ) -> ::std::os::raw::c_uint; } extern "C" { #[doc = " ZSTD_createDDict_byReference() :\n Create a digested dictionary, ready to start decompression operation without startup delay.\n Dictionary content is referenced, and therefore stays in dictBuffer.\n It is important that dictBuffer outlives DDict,\n it must remain read accessible throughout the lifetime of DDict"] @@ -1272,7 +1272,7 @@ pub fn ZSTD_DCtx_getParameter( dctx: *mut ZSTD_DCtx, param: ZSTD_dParameter, - value: *mut ::core::ffi::c_int, + value: *mut ::std::os::raw::c_int, ) -> usize; } extern "C" { @@ -1298,8 +1298,8 @@ #[doc = " ZSTD_initCStream_srcSize() :\n This function is DEPRECATED, and equivalent to:\n ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only);\n ZSTD_CCtx_refCDict(zcs, NULL); // clear the dictionary (if any)\n ZSTD_CCtx_setParameter(zcs, ZSTD_c_compressionLevel, compressionLevel);\n ZSTD_CCtx_setPledgedSrcSize(zcs, pledgedSrcSize);\n\n pledgedSrcSize must be correct. If it is not known at init time, use\n ZSTD_CONTENTSIZE_UNKNOWN. Note that, for compatibility with older programs,\n \"0\" also disables frame content size field. It may be enabled in the future.\n This prototype will generate compilation warnings."] pub fn ZSTD_initCStream_srcSize( zcs: *mut ZSTD_CStream, - compressionLevel: ::core::ffi::c_int, - pledgedSrcSize: ::core::ffi::c_ulonglong, + compressionLevel: ::std::os::raw::c_int, + pledgedSrcSize: ::std::os::raw::c_ulonglong, ) -> usize; } extern "C" { @@ -1308,7 +1308,7 @@ zcs: *mut ZSTD_CStream, dict: *const ::core::ffi::c_void, dictSize: usize, - compressionLevel: ::core::ffi::c_int, + compressionLevel: ::std::os::raw::c_int, ) -> usize; } extern "C" { @@ -1318,7 +1318,7 @@ dict: *const ::core::ffi::c_void, dictSize: usize, params: ZSTD_parameters, - pledgedSrcSize: ::core::ffi::c_ulonglong, + pledgedSrcSize: ::std::os::raw::c_ulonglong, ) -> usize; } extern "C" { @@ -1334,25 +1334,25 @@ zcs: *mut ZSTD_CStream, cdict: *const ZSTD_CDict, fParams: ZSTD_frameParameters, - pledgedSrcSize: ::core::ffi::c_ulonglong, + pledgedSrcSize: ::std::os::raw::c_ulonglong, ) -> usize; } extern "C" { #[doc = " ZSTD_resetCStream() :\n This function is DEPRECATED, and is equivalent to:\n ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only);\n ZSTD_CCtx_setPledgedSrcSize(zcs, pledgedSrcSize);\n Note: ZSTD_resetCStream() interprets pledgedSrcSize == 0 as ZSTD_CONTENTSIZE_UNKNOWN, but\n ZSTD_CCtx_setPledgedSrcSize() does not do the same, so ZSTD_CONTENTSIZE_UNKNOWN must be\n explicitly specified.\n\n start a new frame, using same parameters from previous frame.\n This is typically useful to skip dictionary loading stage, since it will re-use it in-place.\n Note that zcs must be init at least once before using ZSTD_resetCStream().\n If pledgedSrcSize is not known at reset time, use macro ZSTD_CONTENTSIZE_UNKNOWN.\n If pledgedSrcSize > 0, its value must be correct, as it will be written in header, and controlled at the end.\n For the time being, pledgedSrcSize==0 is interpreted as \"srcSize unknown\" for compatibility with older programs,\n but it will change to mean \"empty\" in future version, so use macro ZSTD_CONTENTSIZE_UNKNOWN instead.\n @return : 0, or an error code (which can be tested using ZSTD_isError())\n This prototype will generate compilation warnings."] pub fn ZSTD_resetCStream( zcs: *mut ZSTD_CStream, - pledgedSrcSize: ::core::ffi::c_ulonglong, + pledgedSrcSize: ::std::os::raw::c_ulonglong, ) -> usize; } #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct ZSTD_frameProgression { - pub ingested: ::core::ffi::c_ulonglong, - pub consumed: ::core::ffi::c_ulonglong, - pub produced: ::core::ffi::c_ulonglong, - pub flushed: ::core::ffi::c_ulonglong, - pub currentJobID: ::core::ffi::c_uint, - pub nbActiveWorkers: ::core::ffi::c_uint, + pub ingested: ::std::os::raw::c_ulonglong, + pub consumed: ::std::os::raw::c_ulonglong, + pub produced: ::std::os::raw::c_ulonglong, + pub flushed: ::std::os::raw::c_ulonglong, + pub currentJobID: ::std::os::raw::c_uint, + pub nbActiveWorkers: ::std::os::raw::c_uint, } extern "C" { pub fn ZSTD_getFrameProgression( @@ -1391,7 +1391,7 @@ srcSize: usize, dict: *const ::core::ffi::c_void, dictSize: usize, - compressionLevel: ::core::ffi::c_int, + compressionLevel: ::std::os::raw::c_int, windowSize: usize, ) -> usize, >; @@ -1407,7 +1407,7 @@ #[doc = "Buffer-less streaming compression (synchronous mode)\n\nA ZSTD_CCtx object is required to track streaming operations.\nUse ZSTD_createCCtx() / ZSTD_freeCCtx() to manage resource.\nZSTD_CCtx object can be re-used multiple times within successive compression operations.\n\nStart by initializing a context.\nUse ZSTD_compressBegin(), or ZSTD_compressBegin_usingDict() for dictionary compression.\n\nThen, consume your input using ZSTD_compressContinue().\nThere are some important considerations to keep in mind when using this advanced function :\n- ZSTD_compressContinue() has no internal buffer. It uses externally provided buffers only.\n- Interface is synchronous : input is consumed entirely and produces 1+ compressed blocks.\n- Caller must ensure there is enough space in `dst` to store compressed data under worst case scenario.\nWorst case evaluation is provided by ZSTD_compressBound().\nZSTD_compressContinue() doesn't guarantee recover after a failed compression.\n- ZSTD_compressContinue() presumes prior input ***is still accessible and unmodified*** (up to maximum distance size, see WindowLog).\nIt remembers all previous contiguous blocks, plus one separated memory segment (which can itself consists of multiple contiguous blocks)\n- ZSTD_compressContinue() detects that prior input has been overwritten when `src` buffer overlaps.\nIn which case, it will \"discard\" the relevant memory section from its history.\n\nFinish a frame with ZSTD_compressEnd(), which will write the last block(s) and optional checksum.\nIt's possible to use srcSize==0, in which case, it will write a final empty block to end the frame.\nWithout last block mark, frames are considered unfinished (hence corrupted) by compliant decoders.\n\n`ZSTD_CCtx` object can be re-used (ZSTD_compressBegin()) to compress again."] pub fn ZSTD_compressBegin( cctx: *mut ZSTD_CCtx, - compressionLevel: ::core::ffi::c_int, + compressionLevel: ::std::os::raw::c_int, ) -> usize; } extern "C" { @@ -1415,7 +1415,7 @@ cctx: *mut ZSTD_CCtx, dict: *const ::core::ffi::c_void, dictSize: usize, - compressionLevel: ::core::ffi::c_int, + compressionLevel: ::std::os::raw::c_int, ) -> usize; } extern "C" { @@ -1428,7 +1428,7 @@ pub fn ZSTD_copyCCtx( cctx: *mut ZSTD_CCtx, preparedCCtx: *const ZSTD_CCtx, - pledgedSrcSize: ::core::ffi::c_ulonglong, + pledgedSrcSize: ::std::os::raw::c_ulonglong, ) -> usize; } extern "C" { @@ -1455,7 +1455,7 @@ dict: *const ::core::ffi::c_void, dictSize: usize, params: ZSTD_parameters, - pledgedSrcSize: ::core::ffi::c_ulonglong, + pledgedSrcSize: ::std::os::raw::c_ulonglong, ) -> usize; } extern "C" { @@ -1463,14 +1463,14 @@ cctx: *mut ZSTD_CCtx, cdict: *const ZSTD_CDict, fParams: ZSTD_frameParameters, - pledgedSrcSize: ::core::ffi::c_ulonglong, + pledgedSrcSize: ::std::os::raw::c_ulonglong, ) -> usize; } extern "C" { #[doc = "Buffer-less streaming decompression (synchronous mode)\n\nA ZSTD_DCtx object is required to track streaming operations.\nUse ZSTD_createDCtx() / ZSTD_freeDCtx() to manage it.\nA ZSTD_DCtx object can be re-used multiple times.\n\nFirst typical operation is to retrieve frame parameters, using ZSTD_getFrameHeader().\nFrame header is extracted from the beginning of compressed frame, so providing only the frame's beginning is enough.\nData fragment must be large enough to ensure successful decoding.\n`ZSTD_frameHeaderSize_max` bytes is guaranteed to always be large enough.\nresult : 0 : successful decoding, the `ZSTD_frameHeader` structure is correctly filled.\n>0 : `srcSize` is too small, please provide at least result bytes on next attempt.\nerrorCode, which can be tested using ZSTD_isError().\n\nIt fills a ZSTD_frameHeader structure with important information to correctly decode the frame,\nsuch as the dictionary ID, content size, or maximum back-reference distance (`windowSize`).\nNote that these values could be wrong, either because of data corruption, or because a 3rd party deliberately spoofs false information.\nAs a consequence, check that values remain within valid application range.\nFor example, do not allocate memory blindly, check that `windowSize` is within expectation.\nEach application can set its own limits, depending on local restrictions.\nFor extended interoperability, it is recommended to support `windowSize` of at least 8 MB.\n\nZSTD_decompressContinue() needs previous data blocks during decompression, up to `windowSize` bytes.\nZSTD_decompressContinue() is very sensitive to contiguity,\nif 2 blocks don't follow each other, make sure that either the compressor breaks contiguity at the same place,\nor that previous contiguous segment is large enough to properly handle maximum back-reference distance.\nThere are multiple ways to guarantee this condition.\n\nThe most memory efficient way is to use a round buffer of sufficient size.\nSufficient size is determined by invoking ZSTD_decodingBufferSize_min(),\nwhich can return an error code if required value is too large for current system (in 32-bits mode).\nIn a round buffer methodology, ZSTD_decompressContinue() decompresses each block next to previous one,\nup to the moment there is not enough room left in the buffer to guarantee decoding another full block,\nwhich maximum size is provided in `ZSTD_frameHeader` structure, field `blockSizeMax`.\nAt which point, decoding can resume from the beginning of the buffer.\nNote that already decoded data stored in the buffer should be flushed before being overwritten.\n\nThere are alternatives possible, for example using two or more buffers of size `windowSize` each, though they consume more memory.\n\nFinally, if you control the compression process, you can also ignore all buffer size rules,\nas long as the encoder and decoder progress in \"lock-step\",\naka use exactly the same buffer sizes, break contiguity at the same place, etc.\n\nOnce buffers are setup, start decompression, with ZSTD_decompressBegin().\nIf decompression requires a dictionary, use ZSTD_decompressBegin_usingDict() or ZSTD_decompressBegin_usingDDict().\n\nThen use ZSTD_nextSrcSizeToDecompress() and ZSTD_decompressContinue() alternatively.\nZSTD_nextSrcSizeToDecompress() tells how many bytes to provide as 'srcSize' to ZSTD_decompressContinue().\nZSTD_decompressContinue() requires this _exact_ amount of bytes, or it will fail.\n\nresult of ZSTD_decompressContinue() is the number of bytes regenerated within 'dst' (necessarily <= dstCapacity).\nIt can be zero : it just means ZSTD_decompressContinue() has decoded some metadata item.\nIt can also be an error code, which can be tested with ZSTD_isError().\n\nA frame is fully decoded when ZSTD_nextSrcSizeToDecompress() returns zero.\nContext can then be reset to start a new decompression.\n\nNote : it's possible to know if next input to present is a header or a block, using ZSTD_nextInputType().\nThis information is not required to properly decode a frame.\n\n== Special case : skippable frames ==\n\nSkippable frames allow integration of user-defined data into a flow of concatenated frames.\nSkippable frames will be ignored (skipped) by decompressor.\nThe format of skippable frames is as follows :\na) Skippable frame ID - 4 Bytes, Little endian format, any value from 0x184D2A50 to 0x184D2A5F\nb) Frame Size - 4 Bytes, Little endian format, unsigned 32-bits\nc) Frame Content - any content (User Data) of length equal to Frame Size\nFor skippable frames ZSTD_getFrameHeader() returns zfhPtr->frameType==ZSTD_skippableFrame.\nFor skippable frames ZSTD_decompressContinue() always returns 0 : it only skips the content."] pub fn ZSTD_decodingBufferSize_min( - windowSize: ::core::ffi::c_ulonglong, - frameContentSize: ::core::ffi::c_ulonglong, + windowSize: ::std::os::raw::c_ulonglong, + frameContentSize: ::std::os::raw::c_ulonglong, ) -> usize; } extern "C" { diff -Nru temporalio-1.3.0/vendor/zstd-sys/src/bindings_zstd_std.rs temporalio-1.3.0/vendor/zstd-sys/src/bindings_zstd_std.rs --- temporalio-1.3.0/vendor/zstd-sys/src/bindings_zstd_std.rs 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zstd-sys/src/bindings_zstd_std.rs 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,578 @@ +/* +This file is auto-generated from the public API of the zstd library. +It is released under the same BSD license. + +BSD License + +For Zstandard software + +Copyright (c) Meta Platforms, Inc. and affiliates. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name Facebook, nor Meta, nor the names of its contributors may + be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/* automatically generated by rust-bindgen 0.64.0 */ + +pub const ZSTD_VERSION_MAJOR: u32 = 1; +pub const ZSTD_VERSION_MINOR: u32 = 5; +pub const ZSTD_VERSION_RELEASE: u32 = 5; +pub const ZSTD_VERSION_NUMBER: u32 = 10505; +pub const ZSTD_CLEVEL_DEFAULT: u32 = 3; +pub const ZSTD_MAGICNUMBER: u32 = 4247762216; +pub const ZSTD_MAGIC_DICTIONARY: u32 = 3962610743; +pub const ZSTD_MAGIC_SKIPPABLE_START: u32 = 407710288; +pub const ZSTD_MAGIC_SKIPPABLE_MASK: u32 = 4294967280; +pub const ZSTD_BLOCKSIZELOG_MAX: u32 = 17; +pub const ZSTD_BLOCKSIZE_MAX: u32 = 131072; +pub const ZSTD_CONTENTSIZE_UNKNOWN: i32 = -1; +pub const ZSTD_CONTENTSIZE_ERROR: i32 = -2; +extern "C" { + #[doc = " ZSTD_versionNumber() :\n Return runtime library version, the value is (MAJOR*100*100 + MINOR*100 + RELEASE)."] + pub fn ZSTD_versionNumber() -> ::std::os::raw::c_uint; +} +extern "C" { + #[doc = " ZSTD_versionString() :\n Return runtime library version, like \"1.4.5\". Requires v1.3.0+."] + pub fn ZSTD_versionString() -> *const ::std::os::raw::c_char; +} +extern "C" { + #[doc = " Simple API\n/\n/*! ZSTD_compress() :\n Compresses `src` content as a single zstd compressed frame into already allocated `dst`.\n NOTE: Providing `dstCapacity >= ZSTD_compressBound(srcSize)` guarantees that zstd will have\n enough space to successfully compress the data.\n @return : compressed size written into `dst` (<= `dstCapacity),\n or an error code if it fails (which can be tested using ZSTD_isError())."] + pub fn ZSTD_compress( + dst: *mut ::core::ffi::c_void, + dstCapacity: usize, + src: *const ::core::ffi::c_void, + srcSize: usize, + compressionLevel: ::std::os::raw::c_int, + ) -> usize; +} +extern "C" { + #[doc = " ZSTD_decompress() :\n `compressedSize` : must be the _exact_ size of some number of compressed and/or skippable frames.\n `dstCapacity` is an upper bound of originalSize to regenerate.\n If user cannot imply a maximum upper bound, it's better to use streaming mode to decompress data.\n @return : the number of bytes decompressed into `dst` (<= `dstCapacity`),\n or an errorCode if it fails (which can be tested using ZSTD_isError())."] + pub fn ZSTD_decompress( + dst: *mut ::core::ffi::c_void, + dstCapacity: usize, + src: *const ::core::ffi::c_void, + compressedSize: usize, + ) -> usize; +} +extern "C" { + pub fn ZSTD_getFrameContentSize( + src: *const ::core::ffi::c_void, + srcSize: usize, + ) -> ::std::os::raw::c_ulonglong; +} +extern "C" { + #[doc = " ZSTD_getDecompressedSize() :\n NOTE: This function is now obsolete, in favor of ZSTD_getFrameContentSize().\n Both functions work the same way, but ZSTD_getDecompressedSize() blends\n \"empty\", \"unknown\" and \"error\" results to the same return value (0),\n while ZSTD_getFrameContentSize() gives them separate return values.\n @return : decompressed size of `src` frame content _if known and not empty_, 0 otherwise."] + pub fn ZSTD_getDecompressedSize( + src: *const ::core::ffi::c_void, + srcSize: usize, + ) -> ::std::os::raw::c_ulonglong; +} +extern "C" { + #[doc = " ZSTD_findFrameCompressedSize() : Requires v1.4.0+\n `src` should point to the start of a ZSTD frame or skippable frame.\n `srcSize` must be >= first frame size\n @return : the compressed size of the first frame starting at `src`,\n suitable to pass as `srcSize` to `ZSTD_decompress` or similar,\n or an error code if input is invalid"] + pub fn ZSTD_findFrameCompressedSize( + src: *const ::core::ffi::c_void, + srcSize: usize, + ) -> usize; +} +extern "C" { + pub fn ZSTD_compressBound(srcSize: usize) -> usize; +} +extern "C" { + pub fn ZSTD_isError(code: usize) -> ::std::os::raw::c_uint; +} +extern "C" { + pub fn ZSTD_getErrorName(code: usize) -> *const ::std::os::raw::c_char; +} +extern "C" { + pub fn ZSTD_minCLevel() -> ::std::os::raw::c_int; +} +extern "C" { + pub fn ZSTD_maxCLevel() -> ::std::os::raw::c_int; +} +extern "C" { + pub fn ZSTD_defaultCLevel() -> ::std::os::raw::c_int; +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ZSTD_CCtx_s { + _unused: [u8; 0], +} +#[doc = " Explicit context"] +pub type ZSTD_CCtx = ZSTD_CCtx_s; +extern "C" { + pub fn ZSTD_createCCtx() -> *mut ZSTD_CCtx; +} +extern "C" { + pub fn ZSTD_freeCCtx(cctx: *mut ZSTD_CCtx) -> usize; +} +extern "C" { + #[doc = " ZSTD_compressCCtx() :\n Same as ZSTD_compress(), using an explicit ZSTD_CCtx.\n Important : in order to behave similarly to `ZSTD_compress()`,\n this function compresses at requested compression level,\n __ignoring any other parameter__ .\n If any advanced parameter was set using the advanced API,\n they will all be reset. Only `compressionLevel` remains."] + pub fn ZSTD_compressCCtx( + cctx: *mut ZSTD_CCtx, + dst: *mut ::core::ffi::c_void, + dstCapacity: usize, + src: *const ::core::ffi::c_void, + srcSize: usize, + compressionLevel: ::std::os::raw::c_int, + ) -> usize; +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ZSTD_DCtx_s { + _unused: [u8; 0], +} +pub type ZSTD_DCtx = ZSTD_DCtx_s; +extern "C" { + pub fn ZSTD_createDCtx() -> *mut ZSTD_DCtx; +} +extern "C" { + pub fn ZSTD_freeDCtx(dctx: *mut ZSTD_DCtx) -> usize; +} +extern "C" { + #[doc = " ZSTD_decompressDCtx() :\n Same as ZSTD_decompress(),\n requires an allocated ZSTD_DCtx.\n Compatible with sticky parameters."] + pub fn ZSTD_decompressDCtx( + dctx: *mut ZSTD_DCtx, + dst: *mut ::core::ffi::c_void, + dstCapacity: usize, + src: *const ::core::ffi::c_void, + srcSize: usize, + ) -> usize; +} +#[repr(u32)] +#[doc = " Advanced compression API (Requires v1.4.0+)"] +#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] +pub enum ZSTD_strategy { + ZSTD_fast = 1, + ZSTD_dfast = 2, + ZSTD_greedy = 3, + ZSTD_lazy = 4, + ZSTD_lazy2 = 5, + ZSTD_btlazy2 = 6, + ZSTD_btopt = 7, + ZSTD_btultra = 8, + ZSTD_btultra2 = 9, +} +#[repr(u32)] +#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] +pub enum ZSTD_cParameter { + ZSTD_c_compressionLevel = 100, + ZSTD_c_windowLog = 101, + ZSTD_c_hashLog = 102, + ZSTD_c_chainLog = 103, + ZSTD_c_searchLog = 104, + ZSTD_c_minMatch = 105, + ZSTD_c_targetLength = 106, + ZSTD_c_strategy = 107, + ZSTD_c_enableLongDistanceMatching = 160, + ZSTD_c_ldmHashLog = 161, + ZSTD_c_ldmMinMatch = 162, + ZSTD_c_ldmBucketSizeLog = 163, + ZSTD_c_ldmHashRateLog = 164, + ZSTD_c_contentSizeFlag = 200, + ZSTD_c_checksumFlag = 201, + ZSTD_c_dictIDFlag = 202, + ZSTD_c_nbWorkers = 400, + ZSTD_c_jobSize = 401, + ZSTD_c_overlapLog = 402, + ZSTD_c_experimentalParam1 = 500, + ZSTD_c_experimentalParam2 = 10, + ZSTD_c_experimentalParam3 = 1000, + ZSTD_c_experimentalParam4 = 1001, + ZSTD_c_experimentalParam5 = 1002, + ZSTD_c_experimentalParam6 = 1003, + ZSTD_c_experimentalParam7 = 1004, + ZSTD_c_experimentalParam8 = 1005, + ZSTD_c_experimentalParam9 = 1006, + ZSTD_c_experimentalParam10 = 1007, + ZSTD_c_experimentalParam11 = 1008, + ZSTD_c_experimentalParam12 = 1009, + ZSTD_c_experimentalParam13 = 1010, + ZSTD_c_experimentalParam14 = 1011, + ZSTD_c_experimentalParam15 = 1012, + ZSTD_c_experimentalParam16 = 1013, + ZSTD_c_experimentalParam17 = 1014, + ZSTD_c_experimentalParam18 = 1015, + ZSTD_c_experimentalParam19 = 1016, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ZSTD_bounds { + pub error: usize, + pub lowerBound: ::std::os::raw::c_int, + pub upperBound: ::std::os::raw::c_int, +} +extern "C" { + #[doc = " ZSTD_cParam_getBounds() :\n All parameters must belong to an interval with lower and upper bounds,\n otherwise they will either trigger an error or be automatically clamped.\n @return : a structure, ZSTD_bounds, which contains\n - an error status field, which must be tested using ZSTD_isError()\n - lower and upper bounds, both inclusive"] + pub fn ZSTD_cParam_getBounds(cParam: ZSTD_cParameter) -> ZSTD_bounds; +} +extern "C" { + #[doc = " ZSTD_CCtx_setParameter() :\n Set one compression parameter, selected by enum ZSTD_cParameter.\n All parameters have valid bounds. Bounds can be queried using ZSTD_cParam_getBounds().\n Providing a value beyond bound will either clamp it, or trigger an error (depending on parameter).\n Setting a parameter is generally only possible during frame initialization (before starting compression).\n Exception : when using multi-threading mode (nbWorkers >= 1),\n the following parameters can be updated _during_ compression (within same frame):\n => compressionLevel, hashLog, chainLog, searchLog, minMatch, targetLength and strategy.\n new parameters will be active for next job only (after a flush()).\n @return : an error code (which can be tested using ZSTD_isError())."] + pub fn ZSTD_CCtx_setParameter( + cctx: *mut ZSTD_CCtx, + param: ZSTD_cParameter, + value: ::std::os::raw::c_int, + ) -> usize; +} +extern "C" { + #[doc = " ZSTD_CCtx_setPledgedSrcSize() :\n Total input data size to be compressed as a single frame.\n Value will be written in frame header, unless if explicitly forbidden using ZSTD_c_contentSizeFlag.\n This value will also be controlled at end of frame, and trigger an error if not respected.\n @result : 0, or an error code (which can be tested with ZSTD_isError()).\n Note 1 : pledgedSrcSize==0 actually means zero, aka an empty frame.\n In order to mean \"unknown content size\", pass constant ZSTD_CONTENTSIZE_UNKNOWN.\n ZSTD_CONTENTSIZE_UNKNOWN is default value for any new frame.\n Note 2 : pledgedSrcSize is only valid once, for the next frame.\n It's discarded at the end of the frame, and replaced by ZSTD_CONTENTSIZE_UNKNOWN.\n Note 3 : Whenever all input data is provided and consumed in a single round,\n for example with ZSTD_compress2(),\n or invoking immediately ZSTD_compressStream2(,,,ZSTD_e_end),\n this value is automatically overridden by srcSize instead."] + pub fn ZSTD_CCtx_setPledgedSrcSize( + cctx: *mut ZSTD_CCtx, + pledgedSrcSize: ::std::os::raw::c_ulonglong, + ) -> usize; +} +#[repr(u32)] +#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] +pub enum ZSTD_ResetDirective { + ZSTD_reset_session_only = 1, + ZSTD_reset_parameters = 2, + ZSTD_reset_session_and_parameters = 3, +} +extern "C" { + #[doc = " ZSTD_CCtx_reset() :\n There are 2 different things that can be reset, independently or jointly :\n - The session : will stop compressing current frame, and make CCtx ready to start a new one.\n Useful after an error, or to interrupt any ongoing compression.\n Any internal data not yet flushed is cancelled.\n Compression parameters and dictionary remain unchanged.\n They will be used to compress next frame.\n Resetting session never fails.\n - The parameters : changes all parameters back to \"default\".\n This also removes any reference to any dictionary or external sequence producer.\n Parameters can only be changed between 2 sessions (i.e. no compression is currently ongoing)\n otherwise the reset fails, and function returns an error value (which can be tested using ZSTD_isError())\n - Both : similar to resetting the session, followed by resetting parameters."] + pub fn ZSTD_CCtx_reset( + cctx: *mut ZSTD_CCtx, + reset: ZSTD_ResetDirective, + ) -> usize; +} +extern "C" { + #[doc = " ZSTD_compress2() :\n Behave the same as ZSTD_compressCCtx(), but compression parameters are set using the advanced API.\n ZSTD_compress2() always starts a new frame.\n Should cctx hold data from a previously unfinished frame, everything about it is forgotten.\n - Compression parameters are pushed into CCtx before starting compression, using ZSTD_CCtx_set*()\n - The function is always blocking, returns when compression is completed.\n NOTE: Providing `dstCapacity >= ZSTD_compressBound(srcSize)` guarantees that zstd will have\n enough space to successfully compress the data, though it is possible it fails for other reasons.\n @return : compressed size written into `dst` (<= `dstCapacity),\n or an error code if it fails (which can be tested using ZSTD_isError())."] + pub fn ZSTD_compress2( + cctx: *mut ZSTD_CCtx, + dst: *mut ::core::ffi::c_void, + dstCapacity: usize, + src: *const ::core::ffi::c_void, + srcSize: usize, + ) -> usize; +} +#[repr(u32)] +#[doc = " Advanced decompression API (Requires v1.4.0+)"] +#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] +pub enum ZSTD_dParameter { + ZSTD_d_windowLogMax = 100, + ZSTD_d_experimentalParam1 = 1000, + ZSTD_d_experimentalParam2 = 1001, + ZSTD_d_experimentalParam3 = 1002, + ZSTD_d_experimentalParam4 = 1003, + ZSTD_d_experimentalParam5 = 1004, +} +extern "C" { + #[doc = " ZSTD_dParam_getBounds() :\n All parameters must belong to an interval with lower and upper bounds,\n otherwise they will either trigger an error or be automatically clamped.\n @return : a structure, ZSTD_bounds, which contains\n - an error status field, which must be tested using ZSTD_isError()\n - both lower and upper bounds, inclusive"] + pub fn ZSTD_dParam_getBounds(dParam: ZSTD_dParameter) -> ZSTD_bounds; +} +extern "C" { + #[doc = " ZSTD_DCtx_setParameter() :\n Set one compression parameter, selected by enum ZSTD_dParameter.\n All parameters have valid bounds. Bounds can be queried using ZSTD_dParam_getBounds().\n Providing a value beyond bound will either clamp it, or trigger an error (depending on parameter).\n Setting a parameter is only possible during frame initialization (before starting decompression).\n @return : 0, or an error code (which can be tested using ZSTD_isError())."] + pub fn ZSTD_DCtx_setParameter( + dctx: *mut ZSTD_DCtx, + param: ZSTD_dParameter, + value: ::std::os::raw::c_int, + ) -> usize; +} +extern "C" { + #[doc = " ZSTD_DCtx_reset() :\n Return a DCtx to clean state.\n Session and parameters can be reset jointly or separately.\n Parameters can only be reset when no active frame is being decompressed.\n @return : 0, or an error code, which can be tested with ZSTD_isError()"] + pub fn ZSTD_DCtx_reset( + dctx: *mut ZSTD_DCtx, + reset: ZSTD_ResetDirective, + ) -> usize; +} +#[doc = " Streaming"] +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ZSTD_inBuffer_s { + #[doc = "< start of input buffer"] + pub src: *const ::core::ffi::c_void, + #[doc = "< size of input buffer"] + pub size: usize, + #[doc = "< position where reading stopped. Will be updated. Necessarily 0 <= pos <= size"] + pub pos: usize, +} +#[doc = " Streaming"] +pub type ZSTD_inBuffer = ZSTD_inBuffer_s; +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ZSTD_outBuffer_s { + #[doc = "< start of output buffer"] + pub dst: *mut ::core::ffi::c_void, + #[doc = "< size of output buffer"] + pub size: usize, + #[doc = "< position where writing stopped. Will be updated. Necessarily 0 <= pos <= size"] + pub pos: usize, +} +pub type ZSTD_outBuffer = ZSTD_outBuffer_s; +pub type ZSTD_CStream = ZSTD_CCtx; +extern "C" { + pub fn ZSTD_createCStream() -> *mut ZSTD_CStream; +} +extern "C" { + pub fn ZSTD_freeCStream(zcs: *mut ZSTD_CStream) -> usize; +} +#[repr(u32)] +#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] +pub enum ZSTD_EndDirective { + ZSTD_e_continue = 0, + ZSTD_e_flush = 1, + ZSTD_e_end = 2, +} +extern "C" { + #[doc = " ZSTD_compressStream2() : Requires v1.4.0+\n Behaves about the same as ZSTD_compressStream, with additional control on end directive.\n - Compression parameters are pushed into CCtx before starting compression, using ZSTD_CCtx_set*()\n - Compression parameters cannot be changed once compression is started (save a list of exceptions in multi-threading mode)\n - output->pos must be <= dstCapacity, input->pos must be <= srcSize\n - output->pos and input->pos will be updated. They are guaranteed to remain below their respective limit.\n - endOp must be a valid directive\n - When nbWorkers==0 (default), function is blocking : it completes its job before returning to caller.\n - When nbWorkers>=1, function is non-blocking : it copies a portion of input, distributes jobs to internal worker threads, flush to output whatever is available,\n and then immediately returns, just indicating that there is some data remaining to be flushed.\n The function nonetheless guarantees forward progress : it will return only after it reads or write at least 1+ byte.\n - Exception : if the first call requests a ZSTD_e_end directive and provides enough dstCapacity, the function delegates to ZSTD_compress2() which is always blocking.\n - @return provides a minimum amount of data remaining to be flushed from internal buffers\n or an error code, which can be tested using ZSTD_isError().\n if @return != 0, flush is not fully completed, there is still some data left within internal buffers.\n This is useful for ZSTD_e_flush, since in this case more flushes are necessary to empty all buffers.\n For ZSTD_e_end, @return == 0 when internal buffers are fully flushed and frame is completed.\n - after a ZSTD_e_end directive, if internal buffer is not fully flushed (@return != 0),\n only ZSTD_e_end or ZSTD_e_flush operations are allowed.\n Before starting a new compression job, or changing compression parameters,\n it is required to fully flush internal buffers."] + pub fn ZSTD_compressStream2( + cctx: *mut ZSTD_CCtx, + output: *mut ZSTD_outBuffer, + input: *mut ZSTD_inBuffer, + endOp: ZSTD_EndDirective, + ) -> usize; +} +extern "C" { + pub fn ZSTD_CStreamInSize() -> usize; +} +extern "C" { + pub fn ZSTD_CStreamOutSize() -> usize; +} +extern "C" { + #[doc = " Equivalent to:\n\n ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only);\n ZSTD_CCtx_refCDict(zcs, NULL); // clear the dictionary (if any)\n ZSTD_CCtx_setParameter(zcs, ZSTD_c_compressionLevel, compressionLevel);\n\n Note that ZSTD_initCStream() clears any previously set dictionary. Use the new API\n to compress with a dictionary."] + pub fn ZSTD_initCStream( + zcs: *mut ZSTD_CStream, + compressionLevel: ::std::os::raw::c_int, + ) -> usize; +} +extern "C" { + #[doc = " Alternative for ZSTD_compressStream2(zcs, output, input, ZSTD_e_continue).\n NOTE: The return value is different. ZSTD_compressStream() returns a hint for\n the next read size (if non-zero and not an error). ZSTD_compressStream2()\n returns the minimum nb of bytes left to flush (if non-zero and not an error)."] + pub fn ZSTD_compressStream( + zcs: *mut ZSTD_CStream, + output: *mut ZSTD_outBuffer, + input: *mut ZSTD_inBuffer, + ) -> usize; +} +extern "C" { + #[doc = " Equivalent to ZSTD_compressStream2(zcs, output, &emptyInput, ZSTD_e_flush)."] + pub fn ZSTD_flushStream( + zcs: *mut ZSTD_CStream, + output: *mut ZSTD_outBuffer, + ) -> usize; +} +extern "C" { + #[doc = " Equivalent to ZSTD_compressStream2(zcs, output, &emptyInput, ZSTD_e_end)."] + pub fn ZSTD_endStream( + zcs: *mut ZSTD_CStream, + output: *mut ZSTD_outBuffer, + ) -> usize; +} +pub type ZSTD_DStream = ZSTD_DCtx; +extern "C" { + pub fn ZSTD_createDStream() -> *mut ZSTD_DStream; +} +extern "C" { + pub fn ZSTD_freeDStream(zds: *mut ZSTD_DStream) -> usize; +} +extern "C" { + #[doc = " ZSTD_initDStream() :\n Initialize/reset DStream state for new decompression operation.\n Call before new decompression operation using same DStream.\n\n Note : This function is redundant with the advanced API and equivalent to:\n ZSTD_DCtx_reset(zds, ZSTD_reset_session_only);\n ZSTD_DCtx_refDDict(zds, NULL);"] + pub fn ZSTD_initDStream(zds: *mut ZSTD_DStream) -> usize; +} +extern "C" { + #[doc = " ZSTD_decompressStream() :\n Streaming decompression function.\n Call repetitively to consume full input updating it as necessary.\n Function will update both input and output `pos` fields exposing current state via these fields:\n - `input.pos < input.size`, some input remaining and caller should provide remaining input\n on the next call.\n - `output.pos < output.size`, decoder finished and flushed all remaining buffers.\n - `output.pos == output.size`, potentially uncflushed data present in the internal buffers,\n call ZSTD_decompressStream() again to flush remaining data to output.\n Note : with no additional input, amount of data flushed <= ZSTD_BLOCKSIZE_MAX.\n\n @return : 0 when a frame is completely decoded and fully flushed,\n or an error code, which can be tested using ZSTD_isError(),\n or any other value > 0, which means there is some decoding or flushing to do to complete current frame."] + pub fn ZSTD_decompressStream( + zds: *mut ZSTD_DStream, + output: *mut ZSTD_outBuffer, + input: *mut ZSTD_inBuffer, + ) -> usize; +} +extern "C" { + pub fn ZSTD_DStreamInSize() -> usize; +} +extern "C" { + pub fn ZSTD_DStreamOutSize() -> usize; +} +extern "C" { + #[doc = " Simple dictionary API\n/\n/*! ZSTD_compress_usingDict() :\n Compression at an explicit compression level using a Dictionary.\n A dictionary can be any arbitrary data segment (also called a prefix),\n or a buffer with specified information (see zdict.h).\n Note : This function loads the dictionary, resulting in significant startup delay.\n It's intended for a dictionary used only once.\n Note 2 : When `dict == NULL || dictSize < 8` no dictionary is used."] + pub fn ZSTD_compress_usingDict( + ctx: *mut ZSTD_CCtx, + dst: *mut ::core::ffi::c_void, + dstCapacity: usize, + src: *const ::core::ffi::c_void, + srcSize: usize, + dict: *const ::core::ffi::c_void, + dictSize: usize, + compressionLevel: ::std::os::raw::c_int, + ) -> usize; +} +extern "C" { + #[doc = " ZSTD_decompress_usingDict() :\n Decompression using a known Dictionary.\n Dictionary must be identical to the one used during compression.\n Note : This function loads the dictionary, resulting in significant startup delay.\n It's intended for a dictionary used only once.\n Note : When `dict == NULL || dictSize < 8` no dictionary is used."] + pub fn ZSTD_decompress_usingDict( + dctx: *mut ZSTD_DCtx, + dst: *mut ::core::ffi::c_void, + dstCapacity: usize, + src: *const ::core::ffi::c_void, + srcSize: usize, + dict: *const ::core::ffi::c_void, + dictSize: usize, + ) -> usize; +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ZSTD_CDict_s { + _unused: [u8; 0], +} +#[doc = " Bulk processing dictionary API"] +pub type ZSTD_CDict = ZSTD_CDict_s; +extern "C" { + #[doc = " ZSTD_createCDict() :\n When compressing multiple messages or blocks using the same dictionary,\n it's recommended to digest the dictionary only once, since it's a costly operation.\n ZSTD_createCDict() will create a state from digesting a dictionary.\n The resulting state can be used for future compression operations with very limited startup cost.\n ZSTD_CDict can be created once and shared by multiple threads concurrently, since its usage is read-only.\n @dictBuffer can be released after ZSTD_CDict creation, because its content is copied within CDict.\n Note 1 : Consider experimental function `ZSTD_createCDict_byReference()` if you prefer to not duplicate @dictBuffer content.\n Note 2 : A ZSTD_CDict can be created from an empty @dictBuffer,\n in which case the only thing that it transports is the @compressionLevel.\n This can be useful in a pipeline featuring ZSTD_compress_usingCDict() exclusively,\n expecting a ZSTD_CDict parameter with any data, including those without a known dictionary."] + pub fn ZSTD_createCDict( + dictBuffer: *const ::core::ffi::c_void, + dictSize: usize, + compressionLevel: ::std::os::raw::c_int, + ) -> *mut ZSTD_CDict; +} +extern "C" { + #[doc = " ZSTD_freeCDict() :\n Function frees memory allocated by ZSTD_createCDict().\n If a NULL pointer is passed, no operation is performed."] + pub fn ZSTD_freeCDict(CDict: *mut ZSTD_CDict) -> usize; +} +extern "C" { + #[doc = " ZSTD_compress_usingCDict() :\n Compression using a digested Dictionary.\n Recommended when same dictionary is used multiple times.\n Note : compression level is _decided at dictionary creation time_,\n and frame parameters are hardcoded (dictID=yes, contentSize=yes, checksum=no)"] + pub fn ZSTD_compress_usingCDict( + cctx: *mut ZSTD_CCtx, + dst: *mut ::core::ffi::c_void, + dstCapacity: usize, + src: *const ::core::ffi::c_void, + srcSize: usize, + cdict: *const ZSTD_CDict, + ) -> usize; +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct ZSTD_DDict_s { + _unused: [u8; 0], +} +pub type ZSTD_DDict = ZSTD_DDict_s; +extern "C" { + #[doc = " ZSTD_createDDict() :\n Create a digested dictionary, ready to start decompression operation without startup delay.\n dictBuffer can be released after DDict creation, as its content is copied inside DDict."] + pub fn ZSTD_createDDict( + dictBuffer: *const ::core::ffi::c_void, + dictSize: usize, + ) -> *mut ZSTD_DDict; +} +extern "C" { + #[doc = " ZSTD_freeDDict() :\n Function frees memory allocated with ZSTD_createDDict()\n If a NULL pointer is passed, no operation is performed."] + pub fn ZSTD_freeDDict(ddict: *mut ZSTD_DDict) -> usize; +} +extern "C" { + #[doc = " ZSTD_decompress_usingDDict() :\n Decompression using a digested Dictionary.\n Recommended when same dictionary is used multiple times."] + pub fn ZSTD_decompress_usingDDict( + dctx: *mut ZSTD_DCtx, + dst: *mut ::core::ffi::c_void, + dstCapacity: usize, + src: *const ::core::ffi::c_void, + srcSize: usize, + ddict: *const ZSTD_DDict, + ) -> usize; +} +extern "C" { + #[doc = " ZSTD_getDictID_fromDict() : Requires v1.4.0+\n Provides the dictID stored within dictionary.\n if @return == 0, the dictionary is not conformant with Zstandard specification.\n It can still be loaded, but as a content-only dictionary."] + pub fn ZSTD_getDictID_fromDict( + dict: *const ::core::ffi::c_void, + dictSize: usize, + ) -> ::std::os::raw::c_uint; +} +extern "C" { + #[doc = " ZSTD_getDictID_fromCDict() : Requires v1.5.0+\n Provides the dictID of the dictionary loaded into `cdict`.\n If @return == 0, the dictionary is not conformant to Zstandard specification, or empty.\n Non-conformant dictionaries can still be loaded, but as content-only dictionaries."] + pub fn ZSTD_getDictID_fromCDict( + cdict: *const ZSTD_CDict, + ) -> ::std::os::raw::c_uint; +} +extern "C" { + #[doc = " ZSTD_getDictID_fromDDict() : Requires v1.4.0+\n Provides the dictID of the dictionary loaded into `ddict`.\n If @return == 0, the dictionary is not conformant to Zstandard specification, or empty.\n Non-conformant dictionaries can still be loaded, but as content-only dictionaries."] + pub fn ZSTD_getDictID_fromDDict( + ddict: *const ZSTD_DDict, + ) -> ::std::os::raw::c_uint; +} +extern "C" { + #[doc = " ZSTD_getDictID_fromFrame() : Requires v1.4.0+\n Provides the dictID required to decompressed the frame stored within `src`.\n If @return == 0, the dictID could not be decoded.\n This could for one of the following reasons :\n - The frame does not require a dictionary to be decoded (most common case).\n - The frame was built with dictID intentionally removed. Whatever dictionary is necessary is a hidden piece of information.\n Note : this use case also happens when using a non-conformant dictionary.\n - `srcSize` is too small, and as a result, the frame header could not be decoded (only possible if `srcSize < ZSTD_FRAMEHEADERSIZE_MAX`).\n - This is not a Zstandard frame.\n When identifying the exact failure cause, it's possible to use ZSTD_getFrameHeader(), which will provide a more precise error code."] + pub fn ZSTD_getDictID_fromFrame( + src: *const ::core::ffi::c_void, + srcSize: usize, + ) -> ::std::os::raw::c_uint; +} +extern "C" { + #[doc = " ZSTD_CCtx_loadDictionary() : Requires v1.4.0+\n Create an internal CDict from `dict` buffer.\n Decompression will have to use same dictionary.\n @result : 0, or an error code (which can be tested with ZSTD_isError()).\n Special: Loading a NULL (or 0-size) dictionary invalidates previous dictionary,\n meaning \"return to no-dictionary mode\".\n Note 1 : Dictionary is sticky, it will be used for all future compressed frames,\n until parameters are reset, a new dictionary is loaded, or the dictionary\n is explicitly invalidated by loading a NULL dictionary.\n Note 2 : Loading a dictionary involves building tables.\n It's also a CPU consuming operation, with non-negligible impact on latency.\n Tables are dependent on compression parameters, and for this reason,\n compression parameters can no longer be changed after loading a dictionary.\n Note 3 :`dict` content will be copied internally.\n Use experimental ZSTD_CCtx_loadDictionary_byReference() to reference content instead.\n In such a case, dictionary buffer must outlive its users.\n Note 4 : Use ZSTD_CCtx_loadDictionary_advanced()\n to precisely select how dictionary content must be interpreted.\n Note 5 : This method does not benefit from LDM (long distance mode).\n If you want to employ LDM on some large dictionary content,\n prefer employing ZSTD_CCtx_refPrefix() described below."] + pub fn ZSTD_CCtx_loadDictionary( + cctx: *mut ZSTD_CCtx, + dict: *const ::core::ffi::c_void, + dictSize: usize, + ) -> usize; +} +extern "C" { + #[doc = " ZSTD_CCtx_refCDict() : Requires v1.4.0+\n Reference a prepared dictionary, to be used for all future compressed frames.\n Note that compression parameters are enforced from within CDict,\n and supersede any compression parameter previously set within CCtx.\n The parameters ignored are labelled as \"superseded-by-cdict\" in the ZSTD_cParameter enum docs.\n The ignored parameters will be used again if the CCtx is returned to no-dictionary mode.\n The dictionary will remain valid for future compressed frames using same CCtx.\n @result : 0, or an error code (which can be tested with ZSTD_isError()).\n Special : Referencing a NULL CDict means \"return to no-dictionary mode\".\n Note 1 : Currently, only one dictionary can be managed.\n Referencing a new dictionary effectively \"discards\" any previous one.\n Note 2 : CDict is just referenced, its lifetime must outlive its usage within CCtx."] + pub fn ZSTD_CCtx_refCDict( + cctx: *mut ZSTD_CCtx, + cdict: *const ZSTD_CDict, + ) -> usize; +} +extern "C" { + #[doc = " ZSTD_CCtx_refPrefix() : Requires v1.4.0+\n Reference a prefix (single-usage dictionary) for next compressed frame.\n A prefix is **only used once**. Tables are discarded at end of frame (ZSTD_e_end).\n Decompression will need same prefix to properly regenerate data.\n Compressing with a prefix is similar in outcome as performing a diff and compressing it,\n but performs much faster, especially during decompression (compression speed is tunable with compression level).\n This method is compatible with LDM (long distance mode).\n @result : 0, or an error code (which can be tested with ZSTD_isError()).\n Special: Adding any prefix (including NULL) invalidates any previous prefix or dictionary\n Note 1 : Prefix buffer is referenced. It **must** outlive compression.\n Its content must remain unmodified during compression.\n Note 2 : If the intention is to diff some large src data blob with some prior version of itself,\n ensure that the window size is large enough to contain the entire source.\n See ZSTD_c_windowLog.\n Note 3 : Referencing a prefix involves building tables, which are dependent on compression parameters.\n It's a CPU consuming operation, with non-negligible impact on latency.\n If there is a need to use the same prefix multiple times, consider loadDictionary instead.\n Note 4 : By default, the prefix is interpreted as raw content (ZSTD_dct_rawContent).\n Use experimental ZSTD_CCtx_refPrefix_advanced() to alter dictionary interpretation."] + pub fn ZSTD_CCtx_refPrefix( + cctx: *mut ZSTD_CCtx, + prefix: *const ::core::ffi::c_void, + prefixSize: usize, + ) -> usize; +} +extern "C" { + #[doc = " ZSTD_DCtx_loadDictionary() : Requires v1.4.0+\n Create an internal DDict from dict buffer, to be used to decompress all future frames.\n The dictionary remains valid for all future frames, until explicitly invalidated, or\n a new dictionary is loaded.\n @result : 0, or an error code (which can be tested with ZSTD_isError()).\n Special : Adding a NULL (or 0-size) dictionary invalidates any previous dictionary,\n meaning \"return to no-dictionary mode\".\n Note 1 : Loading a dictionary involves building tables,\n which has a non-negligible impact on CPU usage and latency.\n It's recommended to \"load once, use many times\", to amortize the cost\n Note 2 :`dict` content will be copied internally, so `dict` can be released after loading.\n Use ZSTD_DCtx_loadDictionary_byReference() to reference dictionary content instead.\n Note 3 : Use ZSTD_DCtx_loadDictionary_advanced() to take control of\n how dictionary content is loaded and interpreted."] + pub fn ZSTD_DCtx_loadDictionary( + dctx: *mut ZSTD_DCtx, + dict: *const ::core::ffi::c_void, + dictSize: usize, + ) -> usize; +} +extern "C" { + #[doc = " ZSTD_DCtx_refDDict() : Requires v1.4.0+\n Reference a prepared dictionary, to be used to decompress next frames.\n The dictionary remains active for decompression of future frames using same DCtx.\n\n If called with ZSTD_d_refMultipleDDicts enabled, repeated calls of this function\n will store the DDict references in a table, and the DDict used for decompression\n will be determined at decompression time, as per the dict ID in the frame.\n The memory for the table is allocated on the first call to refDDict, and can be\n freed with ZSTD_freeDCtx().\n\n If called with ZSTD_d_refMultipleDDicts disabled (the default), only one dictionary\n will be managed, and referencing a dictionary effectively \"discards\" any previous one.\n\n @result : 0, or an error code (which can be tested with ZSTD_isError()).\n Special: referencing a NULL DDict means \"return to no-dictionary mode\".\n Note 2 : DDict is just referenced, its lifetime must outlive its usage from DCtx."] + pub fn ZSTD_DCtx_refDDict( + dctx: *mut ZSTD_DCtx, + ddict: *const ZSTD_DDict, + ) -> usize; +} +extern "C" { + #[doc = " ZSTD_DCtx_refPrefix() : Requires v1.4.0+\n Reference a prefix (single-usage dictionary) to decompress next frame.\n This is the reverse operation of ZSTD_CCtx_refPrefix(),\n and must use the same prefix as the one used during compression.\n Prefix is **only used once**. Reference is discarded at end of frame.\n End of frame is reached when ZSTD_decompressStream() returns 0.\n @result : 0, or an error code (which can be tested with ZSTD_isError()).\n Note 1 : Adding any prefix (including NULL) invalidates any previously set prefix or dictionary\n Note 2 : Prefix buffer is referenced. It **must** outlive decompression.\n Prefix buffer must remain unmodified up to the end of frame,\n reached when ZSTD_decompressStream() returns 0.\n Note 3 : By default, the prefix is treated as raw content (ZSTD_dct_rawContent).\n Use ZSTD_CCtx_refPrefix_advanced() to alter dictMode (Experimental section)\n Note 4 : Referencing a raw content prefix has almost no cpu nor memory cost.\n A full dictionary is more costly, as it requires building tables."] + pub fn ZSTD_DCtx_refPrefix( + dctx: *mut ZSTD_DCtx, + prefix: *const ::core::ffi::c_void, + prefixSize: usize, + ) -> usize; +} +extern "C" { + #[doc = " ZSTD_sizeof_*() : Requires v1.4.0+\n These functions give the _current_ memory usage of selected object.\n Note that object memory usage can evolve (increase or decrease) over time."] + pub fn ZSTD_sizeof_CCtx(cctx: *const ZSTD_CCtx) -> usize; +} +extern "C" { + pub fn ZSTD_sizeof_DCtx(dctx: *const ZSTD_DCtx) -> usize; +} +extern "C" { + pub fn ZSTD_sizeof_CStream(zcs: *const ZSTD_CStream) -> usize; +} +extern "C" { + pub fn ZSTD_sizeof_DStream(zds: *const ZSTD_DStream) -> usize; +} +extern "C" { + pub fn ZSTD_sizeof_CDict(cdict: *const ZSTD_CDict) -> usize; +} +extern "C" { + pub fn ZSTD_sizeof_DDict(ddict: *const ZSTD_DDict) -> usize; +} diff -Nru temporalio-1.3.0/vendor/zstd-sys/src/lib.rs temporalio-1.3.0/vendor/zstd-sys/src/lib.rs --- temporalio-1.3.0/vendor/zstd-sys/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zstd-sys/src/lib.rs 2023-10-30 19:40:00.000000000 +0000 @@ -6,8 +6,8 @@ //! //! [zstd]: https://facebook.github.io/zstd/ -#[cfg(target_arch = "wasm32")] -extern crate alloc; +#[cfg(feature = "std")] +extern crate std; #[cfg(target_arch = "wasm32")] mod wasm_shim; @@ -17,22 +17,66 @@ include!(concat!(env!("OUT_DIR"), "/bindings.rs")); // The bindings used depend on a few feature flags. -#[cfg(all(not(feature = "experimental"), not(feature = "bindgen")))] + +// No-std (libc-based) +#[cfg(all( + not(feature = "std"), + not(feature = "experimental"), + not(feature = "bindgen") +))] include!("bindings_zstd.rs"); #[cfg(all( + not(feature = "std"), not(feature = "experimental"), feature = "zdict_builder", not(feature = "bindgen") ))] include!("bindings_zdict.rs"); -#[cfg(all(feature = "experimental", not(feature = "bindgen")))] +#[cfg(all( + not(feature = "std"), + feature = "experimental", + not(feature = "bindgen") +))] include!("bindings_zstd_experimental.rs"); #[cfg(all( + not(feature = "std"), feature = "experimental", feature = "zdict_builder", not(feature = "bindgen") ))] include!("bindings_zdict_experimental.rs"); + +// Std-based (no libc) +#[cfg(all( + feature = "std", + not(feature = "experimental"), + not(feature = "bindgen") +))] +include!("bindings_zstd_std.rs"); + +// Std-based (no libc) +#[cfg(all( + feature = "std", + not(feature = "experimental"), + feature = "zdict_builder", + not(feature = "bindgen") +))] +include!("bindings_zdict_std.rs"); + +#[cfg(all( + feature = "std", + feature = "experimental", + not(feature = "bindgen") +))] +include!("bindings_zstd_std_experimental.rs"); + +#[cfg(all( + feature = "std", + feature = "experimental", + feature = "zdict_builder", + not(feature = "bindgen") +))] +include!("bindings_zdict_std_experimental.rs"); diff -Nru temporalio-1.3.0/vendor/zstd-sys/src/wasm_shim.rs temporalio-1.3.0/vendor/zstd-sys/src/wasm_shim.rs --- temporalio-1.3.0/vendor/zstd-sys/src/wasm_shim.rs 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zstd-sys/src/wasm_shim.rs 2023-10-30 19:40:00.000000000 +0000 @@ -1,65 +1,11 @@ -use alloc::alloc::{alloc, alloc_zeroed, dealloc, Layout}; -use core::ffi::{c_int, c_void}; - -const USIZE_ALIGN: usize = core::mem::align_of::(); -const USIZE_SIZE: usize = core::mem::size_of::(); - -#[no_mangle] -pub extern "C" fn rust_zstd_wasm_shim_qsort( - base: *mut c_void, - n_items: usize, - size: usize, - compar: extern "C" fn(*const c_void, *const c_void) -> c_int, -) { - unsafe { - match size { - 1 => qsort::<1>(base, n_items, compar), - 2 => qsort::<2>(base, n_items, compar), - 4 => qsort::<4>(base, n_items, compar), - 8 => qsort::<8>(base, n_items, compar), - 16 => qsort::<16>(base, n_items, compar), - _ => panic!("Unsupported qsort item size"), - } - } -} - -unsafe fn qsort( - base: *mut c_void, - n_items: usize, - compar: extern "C" fn(*const c_void, *const c_void) -> c_int, -) { - let base: &mut [[u8; N]] = - core::slice::from_raw_parts_mut(base as *mut [u8; N], n_items); - base.sort_unstable_by(|a, b| { - match compar(a.as_ptr() as *const c_void, b.as_ptr() as *const c_void) - { - ..=-1 => core::cmp::Ordering::Less, - 0 => core::cmp::Ordering::Equal, - 1.. => core::cmp::Ordering::Greater, - } - }); -} +use std::alloc::{alloc, dealloc, Layout}; +use std::os::raw::{c_int, c_void}; #[no_mangle] pub extern "C" fn rust_zstd_wasm_shim_malloc(size: usize) -> *mut c_void { - wasm_shim_alloc::(size) -} - -#[no_mangle] -pub extern "C" fn rust_zstd_wasm_shim_memcmp( - str1: *const c_void, - str2: *const c_void, - n: usize, -) -> i32 { - // Safety: function contracts requires str1 and str2 at least `n`-long. unsafe { - let str1: &[u8] = core::slice::from_raw_parts(str1 as *const u8, n); - let str2: &[u8] = core::slice::from_raw_parts(str2 as *const u8, n); - match str1.cmp(str2) { - core::cmp::Ordering::Less => -1, - core::cmp::Ordering::Equal => 0, - core::cmp::Ordering::Greater => 1, - } + let layout = Layout::from_size_align_unchecked(size, 1); + alloc(layout).cast() } } @@ -68,49 +14,17 @@ nmemb: usize, size: usize, ) -> *mut c_void { - // note: calloc expects the allocation to be zeroed - wasm_shim_alloc::(nmemb * size) -} - -#[inline] -fn wasm_shim_alloc(size: usize) -> *mut c_void { - // in order to recover the size upon free, we store the size below the allocation - // special alignment is never requested via the malloc API, - // so it's not stored, and usize-alignment is used - // memory layout: [size] [allocation] - - let full_alloc_size = size + USIZE_SIZE; - unsafe { - let layout = - Layout::from_size_align_unchecked(full_alloc_size, USIZE_ALIGN); - - let ptr = if ZEROED { - alloc_zeroed(layout) - } else { - alloc(layout) - }; - - // SAFETY: ptr is usize-aligned and we've allocated sufficient memory - ptr.cast::().write(full_alloc_size); - - ptr.add(USIZE_SIZE).cast() + let layout = Layout::from_size_align_unchecked(size * nmemb, 1); + alloc(layout).cast() } } #[no_mangle] pub unsafe extern "C" fn rust_zstd_wasm_shim_free(ptr: *mut c_void) { - // the layout for the allocation needs to be recovered for dealloc - // - the size must be recovered from directly below the allocation - // - the alignment will always by USIZE_ALIGN - - let alloc_ptr = ptr.sub(USIZE_SIZE); - // SAFETY: the allocation routines must uphold having a valid usize below the provided pointer - let full_alloc_size = alloc_ptr.cast::().read(); - - let layout = - Layout::from_size_align_unchecked(full_alloc_size, USIZE_ALIGN); - dealloc(alloc_ptr.cast(), layout); + // layout is not actually used + let layout = Layout::from_size_align_unchecked(1, 1); + dealloc(ptr.cast(), layout); } #[no_mangle] @@ -119,7 +33,7 @@ src: *const c_void, n: usize, ) -> *mut c_void { - core::ptr::copy_nonoverlapping(src as *const u8, dest as *mut u8, n); + std::ptr::copy_nonoverlapping(src as *const u8, dest as *mut u8, n); dest } @@ -129,7 +43,7 @@ src: *const c_void, n: usize, ) -> *mut c_void { - core::ptr::copy(src as *const u8, dest as *mut u8, n); + std::ptr::copy(src as *const u8, dest as *mut u8, n); dest } @@ -139,6 +53,6 @@ c: c_int, n: usize, ) -> *mut c_void { - core::ptr::write_bytes(dest as *mut u8, c as u8, n); + std::ptr::write_bytes(dest as *mut u8, c as u8, n); dest } diff -Nru temporalio-1.3.0/vendor/zstd-sys/test_it.sh temporalio-1.3.0/vendor/zstd-sys/test_it.sh --- temporalio-1.3.0/vendor/zstd-sys/test_it.sh 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zstd-sys/test_it.sh 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,7 @@ +#!/bin/sh +for EXP in "experimental" ""; do + for STD in "std" ""; do + cargo test --features "$EXP $STD" + done +done + diff -Nru temporalio-1.3.0/vendor/zstd-sys/update_bindings.sh temporalio-1.3.0/vendor/zstd-sys/update_bindings.sh --- temporalio-1.3.0/vendor/zstd-sys/update_bindings.sh 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zstd-sys/update_bindings.sh 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,31 @@ +#!/bin/sh + +# Bump this to 1.64 (released Sep 2022) at some point. 6 months after release? +RUST_TARGET=1.47 +bindgen="bindgen --no-layout-tests --blocklist-type=max_align_t --size_t-is-usize --rustified-enum=.* --use-core --rust-target $RUST_TARGET" +no_std="--ctypes-prefix libc" +experimental="-DZSTD_STATIC_LINKING_ONLY -DZDICT_STATIC_LINKING_ONLY" + +run_bindgen() +{ + echo "/* +This file is auto-generated from the public API of the zstd library. +It is released under the same BSD license. + +$(cat zstd/LICENSE) +*/" + + $bindgen $@ +} + +for NO_STD_ARG in "$no_std" ""; do + for EXPERIMENTAL_ARG in "$experimental" ""; do + if [ -z "$NO_STD_ARG" ]; then STD="_std"; else STD=""; fi + if [ -z "$EXPERIMENTAL_ARG" ]; then EXPERIMENTAL=""; else EXPERIMENTAL="_experimental"; fi + SUFFIX=${STD}${EXPERIMENTAL} + filename=src/bindings${STD}${EXPERIMENTAL}.rs + + run_bindgen zstd.h --allowlist-type "ZSTD_.*" --allowlist-function "ZSTD_.*" --allowlist-var "ZSTD_.*" $NO_STD_ARG -- -Izstd/lib $EXPERIMENTAL_ARG > src/bindings_zstd${SUFFIX}.rs + run_bindgen zdict.h --blocklist-type wchar_t $NO_STD_ARG -- -Izstd/lib $EXPERIMENTAL_ARG > src/bindings_zdict${SUFFIX}.rs + done +done diff -Nru temporalio-1.3.0/vendor/zstd-sys/update_zstd.sh temporalio-1.3.0/vendor/zstd-sys/update_zstd.sh --- temporalio-1.3.0/vendor/zstd-sys/update_zstd.sh 1970-01-01 00:00:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zstd-sys/update_zstd.sh 2023-10-30 19:40:00.000000000 +0000 @@ -0,0 +1,63 @@ +#!/bin/bash +set -e +set -o pipefail + +cd zstd +CURRENT=$(git describe --tags) +git fetch -q +TAG=$(git tag -l | grep '^v' | sort | tail -n 1) + +if [ $CURRENT != $TAG ] +then + git checkout $TAG + cd .. + git add zstd + ./update_bindings.sh + git add src/bindings*.rs + cd .. + ./update_consts.sh + git add src/constants*.rs + cd zstd-sys + + # Note: You'll need a forked version of cargo-bump that supports metadata + # For instance https://github.com/gyscos/cargo-bump + METADATA="zstd.${TAG/v/}" + cargo bump patch --build $METADATA + ZSTD_SYS_VERSION=$(cargo read-manifest | jq -r .version | cut -d+ -f1) + git add Cargo.toml + cd .. + cargo add zstd-sys --path ./zstd-sys --vers "=${ZSTD_SYS_VERSION}" --no-default-features + cargo bump patch --build $METADATA + ZSTD_SAFE_VERSION=$(cargo read-manifest | jq -r .version | cut -d+ -f1) + git add Cargo.toml + cd .. + cargo add zstd-safe --path ./zstd-safe --vers "=${ZSTD_SAFE_VERSION}" --no-default-features + cargo bump patch --build $METADATA + ZSTD_RS_VERSION=$(cargo read-manifest | jq -r .version | cut -d+ -f1) + git add Cargo.toml + + cargo check + + git commit -m "Update zstd to $TAG" + + # Publish? + read -p "Publish to crates.io? " -n 1 -r + echo + if [[ $REPLY =~ ^[Yy]$ ]] + then + cd zstd-safe/zstd-sys + # Need to wait so that the index refreshes. + cargo publish && sleep 5 + cd .. + cargo publish && sleep 5 + cd .. + cargo publish + git tag $ZSTD_RS_VERSION + else + echo "Would have published $ZSTD_RS_VERSION" + fi + +else + echo "Already using zstd $TAG" +fi + diff -Nru temporalio-1.3.0/vendor/zstd-sys/wasm-shim/assert.h temporalio-1.3.0/vendor/zstd-sys/wasm-shim/assert.h --- temporalio-1.3.0/vendor/zstd-sys/wasm-shim/assert.h 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zstd-sys/wasm-shim/assert.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,6 +0,0 @@ -#ifndef _ASSERT_H -#define _ASSERT_H - -#define assert(expr) - -#endif // _ASSERT_H diff -Nru temporalio-1.3.0/vendor/zstd-sys/wasm-shim/stdio.h temporalio-1.3.0/vendor/zstd-sys/wasm-shim/stdio.h --- temporalio-1.3.0/vendor/zstd-sys/wasm-shim/stdio.h 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zstd-sys/wasm-shim/stdio.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,10 +0,0 @@ -#include - -#ifndef _STDIO_H -#define _STDIO_H 1 - -#define fprintf(expr, ...) -#define fflush(expr) - -#endif // _STDIO_H - diff -Nru temporalio-1.3.0/vendor/zstd-sys/wasm-shim/stdlib.h temporalio-1.3.0/vendor/zstd-sys/wasm-shim/stdlib.h --- temporalio-1.3.0/vendor/zstd-sys/wasm-shim/stdlib.h 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zstd-sys/wasm-shim/stdlib.h 2023-10-30 19:40:00.000000000 +0000 @@ -6,7 +6,6 @@ void *rust_zstd_wasm_shim_malloc(size_t size); void *rust_zstd_wasm_shim_calloc(size_t nmemb, size_t size); void rust_zstd_wasm_shim_free(void *ptr); -void rust_zstd_wasm_shim_qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*)); inline void *malloc(size_t size) { return rust_zstd_wasm_shim_malloc(size); @@ -20,9 +19,4 @@ rust_zstd_wasm_shim_free(ptr); } -inline void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*)) -{ - return rust_zstd_wasm_shim_qsort(base, nitems, size, compar); -} - #endif // _STDLIB_H diff -Nru temporalio-1.3.0/vendor/zstd-sys/wasm-shim/string.h temporalio-1.3.0/vendor/zstd-sys/wasm-shim/string.h --- temporalio-1.3.0/vendor/zstd-sys/wasm-shim/string.h 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zstd-sys/wasm-shim/string.h 2023-10-30 19:40:00.000000000 +0000 @@ -3,15 +3,10 @@ #ifndef _STRING_H #define _STRING_H 1 -int rust_zstd_wasm_shim_memcmp(const void *str1, const void *str2, size_t n); void *rust_zstd_wasm_shim_memcpy(void *restrict dest, const void *restrict src, size_t n); void *rust_zstd_wasm_shim_memmove(void *dest, const void *src, size_t n); void *rust_zstd_wasm_shim_memset(void *dest, int c, size_t n); -inline int memcmp(const void *str1, const void *str2, size_t n) { - return rust_zstd_wasm_shim_memcmp(str1, str2, n); -} - inline void *memcpy(void *restrict dest, const void *restrict src, size_t n) { return rust_zstd_wasm_shim_memcpy(dest, src, n); } diff -Nru temporalio-1.3.0/vendor/zstd-sys/wasm-shim/time.h temporalio-1.3.0/vendor/zstd-sys/wasm-shim/time.h --- temporalio-1.3.0/vendor/zstd-sys/wasm-shim/time.h 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zstd-sys/wasm-shim/time.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,13 +0,0 @@ -#ifndef _TIME_H -#define _TIME_H - -#define CLOCKS_PER_SEC 1000 - -typedef unsigned long long clock_t; - -// Clock is just use for progress reporting, which we disable anyway. -inline clock_t clock() { - return 0; -} - -#endif // _TIME_H diff -Nru temporalio-1.3.0/vendor/zstd-sys/zstd.h temporalio-1.3.0/vendor/zstd-sys/zstd.h --- temporalio-1.3.0/vendor/zstd-sys/zstd.h 2023-10-30 19:40:00.000000000 +0000 +++ temporalio-1.3.0/vendor/zstd-sys/zstd.h 2023-10-30 19:40:00.000000000 +0000 @@ -2,16 +2,11 @@ /* Just use installed headers */ #include -#ifdef ZSTD_RUST_BINDINGS_EXPERIMENTAL -#include -#endif // #ifdef ZSTD_RUST_BINDINGS_EXPERIMENTAL +// Don't use experimental features like zstdmt #else // #ifdef PKG_CONFIG #include "zstd/lib/zstd.h" -#ifdef ZSTD_RUST_BINDINGS_EXPERIMENTAL -#include "zstd/lib/zstd_errors.h" -#endif // #ifdef ZSTD_RUST_BINDINGS_EXPERIMENTAL #endif // #ifdef PKG_CONFIG